[
  {
    "path": ".github/workflows/codeql.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\n#\n# ******** NOTE ********\n# We have attempted to detect the languages in your repository. Please check\n# the `language` matrix defined below to confirm you have the correct set of\n# supported CodeQL languages.\n#\nname: \"CodeQL Advanced\"\n\non:\n  push:\n    branches: [ \"main\" ]\n    paths-ignore:\n      - 'docs/**'\n  pull_request:\n    branches: [ \"main\" ]\n    paths-ignore:\n      - 'docs/**'\n  schedule:\n    - cron: '38 18 * * 3'\n\njobs:\n  analyze:\n    name: Analyze (${{ matrix.language }})\n    # Runner size impacts CodeQL analysis time. To learn more, please see:\n    #   - https://gh.io/recommended-hardware-resources-for-running-codeql\n    #   - https://gh.io/supported-runners-and-hardware-resources\n    #   - https://gh.io/using-larger-runners (GitHub.com only)\n    # Consider using larger runners or machines with greater resources for possible analysis time improvements.\n    runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}\n    permissions:\n      # required for all workflows\n      security-events: write\n\n      # required to fetch internal or private CodeQL packs\n      packages: read\n\n      # only required for workflows in private repositories\n      actions: read\n      contents: read\n\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n        - language: javascript-typescript\n          build-mode: none\n        # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'\n        # Use `c-cpp` to analyze code written in C, C++ or both\n        # Use 'java-kotlin' to analyze code written in Java, Kotlin or both\n        # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both\n        # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,\n        # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.\n        # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how\n        # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v4\n\n    # Initializes the CodeQL tools for scanning.\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v3\n      with:\n        languages: ${{ matrix.language }}\n        build-mode: ${{ matrix.build-mode }}\n        # If you wish to specify custom queries, you can do so here or in a config file.\n        # By default, queries listed here will override any specified in a config file.\n        # Prefix the list here with \"+\" to use these queries and those in the config file.\n\n        # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs\n        # queries: security-extended,security-and-quality\n\n    # If the analyze step fails for one of the languages you are analyzing with\n    # \"We were unable to automatically build your code\", modify the matrix above\n    # to set the build mode to \"manual\" for that language. Then modify this step\n    # to build your code.\n    # ℹ️ Command-line programs to run using the OS shell.\n    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun\n    - if: matrix.build-mode == 'manual'\n      shell: bash\n      run: |\n        echo 'If you are using a \"manual\" build mode for one or more of the' \\\n          'languages you are analyzing, replace this with the commands to build' \\\n          'your code, for example:'\n        echo '  make bootstrap'\n        echo '  make release'\n        exit 1\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v3\n      with:\n        category: \"/language:${{matrix.language}}\"\n"
  },
  {
    "path": ".gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# Typescript v1 declaration files\ntypings/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n\n# built files\n**/src/**/*.js\ndocs/**/*.map\ndocs/.jekyll-cache\ndocs/.jekyll-metadata\ndocs/docs/**/assets\n\n# powerbi builds\n.tmp\nwebpack.statistics.dev.html\n\n# local jekyll site\n_site\n.sass-cache\n\n# mac files\n.DS_Store\n\ndist\n!docs/dist\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"VsCode Extension\",\n            \"type\": \"extensionHost\",\n            \"request\": \"launch\",\n            \"runtimeExecutable\": \"${workspaceRoot}\",\n            \"args\": [\n                \"--extensionDevelopmentPath=${workspaceRoot}/extensions/vscode-sanddance\"\n            ],\n            \"sourceMaps\": true,\n            \"outFiles\": [\n                \"${workspaceRoot}/extensions/vscode-sanddance/dist/**/*.js\"\n            ],\n            \"preLaunchTask\": \"vscode-webpack-extension\"\n        },\n    ]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.tabSize\": 4,\n  \"editor.insertSpaces\": true,\n  \"files.associations\": {\n    \"*.snapshots\": \"json\"\n  },\n  \"files.eol\": \"\\n\",\n  \"files.watcherExclude\": {\n    \"**/.git/objects/**\": true,\n    \"**/node_modules/**\": true,\n    \".tmp\": true\n  },\n  \"files.exclude\": {\n    \".tmp\": true\n  },\n  \"search.exclude\": {\n    \".tmp\": true,\n    \"typings\": true\n  },\n  \"json.schemas\": [\n    {\n      \"fileMatch\": [\n        \"/pbiviz.json\"\n      ],\n      \"url\": \"./packages/powerbi/.api/v1.10.0/schema.pbiviz.json\"\n    },\n    {\n      \"fileMatch\": [\n        \"/capabilities.json\"\n      ],\n      \"url\": \"./packages/powerbi/.api/v1.10.0/schema.capabilities.json\"\n    },\n    {\n      \"fileMatch\": [\n        \"/dependencies.json\"\n      ],\n      \"url\": \"./packages/powerbi/.api/v1.10.0/schema.dependencies.json\"\n    }\n  ],\n  \"typescript.extension.sortImports.sortMethod\": \"path\",\n  \"typescript.tsdk\": \"node_modules\\\\typescript\\\\lib\"\n}\n"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n\t\"version\": \"2.0.0\",\n\t\"tasks\": [\n\t\t{\n\t\t\t\"type\": \"npm\",\n\t\t\t\"script\": \"vscode-webpack-extension\",\n\t\t\t\"path\": \".\",\n\t\t\t\"problemMatcher\": [],\n\t\t\t\"label\": \"vscode-webpack-extension\",\n\t\t\t\"detail\": \"vscode-webpack-extension\"\n\t\t}\n\t]\n}"
  },
  {
    "path": "LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "README.md",
    "content": "# SandDance\n\nVisually explore, understand, and present your data.\n\n![sanddance-animation](https://user-images.githubusercontent.com/11507384/189461831-9467863e-bff8-47d2-aa03-ab2b74658814.gif)\n\nBy using easy-to-understand views, SandDance helps you find insights about your data, which in turn help you tell stories supported by data, build cases based on evidence, test hypotheses, dig deeper into surface explanations, support decisions for purchases, or relate data into a wider, real world context.\n\nSandDance uses unit visualizations, which apply a one-to-one mapping between rows in your database and marks on the screen.\nSmooth animated transitions between views help you to maintain context as you interact with your data.\n\n> This new version of SandDance has been rebuilt from scratch with the goal of being modular, extensible, and embeddable into your custom applications. We are now on GitHub so that we are open and driven by the community through contributions, feature requests, and discussion.\n\nSandDance was created by the [Microsoft Research VIDA Group](https://aka.ms/vida) which explores novel technologies for visualization and immersive data analytics.\n\n## Where can I use SandDance?\n* [Try it now on the web](https://microsoft.github.io/SandDance/app/)\n* Microsoft apps:\n  * [Power BI](https://appsource.microsoft.com/en-us/product/power-bi-visuals/WA200000430) - [*see additional info*](https://github.com/microsoft/SandDance/blob/master/powerbi.md)\n  * [Azure Data Studio](https://docs.microsoft.com/en-us/sql/azure-data-studio/sanddance-extension?view=sql-server-2017)\n  * [VSCode extension](https://marketplace.visualstudio.com/items?itemName=msrvida.vscode-sanddance)\n* 3rd Party apps:\n  * [Observable](https://observablehq.com/collection/@danmarshall/sanddance)\n  * [HASH Core IDE](https://core.hash.ai/) - [*see 'Step Explorer' documentation*](https://docs.hash.ai/core/creating-simulations/views#step-explorer)\n* In your own JavaScript apps - see below\n\n## Component architecture\n\nSandDance is an offering of several JavaScript components:\n\n* [sanddance](packages/sanddance/README.md) - the core SandDance visualization canvas.\n* [sanddance-specs](packages/sanddance-specs/README.md) - [Vega specifications](https://vega.github.io/vega/docs/specification/) for unit visualizations.\n* [sanddance-react](packages/sanddance-react/README.md) - the core SandDance visualization canvas for use in React based applications.\n* [sanddance-explorer](packages/sanddance-explorer/README.md) - the core SandDance visualization canvas with UI to enable data exploration, for use in React based applications.\n* [sanddance-embed](packages/sanddance-embed/README.md) - the easiest way to embed SandDance Explorer in your applications, via an `<iframe>` tag.\n\n## Publications\n\n* 2018 - [Atom: A Grammar for Unit Visualizations](https://www.microsoft.com/en-us/research/uploads/prod/2019/01/atom.pdf)\n  * Deokgun Park, Steven Drucker, Roland Fernandez, Niklas Elmqvist\n  * IEEE Transactions on Visualization and Computer Graphics | December 2018, Vol 24(12): pp. 3032-3043\n* 2015 - [A Unifying Framework for Animated and Interactive Unit Visualizations](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/sanddance.pdf)\n  * Steven Drucker, Roland Fernandez \n  * MSR-TR-2015-65 | August 2015\n\n## Articles & videos\n\n* [SandDance project @ Microsoft Research](https://www.microsoft.com/en-us/research/project/sanddance/)\n* [Microsoft Research webinar / Data Visualization: Bridging the Gap Between Users and Information](https://note.microsoft.com/MSR-Webinar-Data-Visualization-Registration-On-Demand.html).\n* [SQL Server Blog / The August release of Azure Data Studio is now available](https://cloudblogs.microsoft.com/sqlserver/2019/08/15/the-august-release-of-azure-data-studio-is-now-available/)\n* [Open Source Blog / What’s new in SandDance 3](https://cloudblogs.microsoft.com/opensource/2020/06/23/whats-new-sanddance-3-microsoft-research/)\n* [Channel 9 - Data Exposed / Introducing SandDance: Data Visualization in Azure Data Studio](https://channel9.msdn.com/Shows/Data-Exposed/Introducing-SandDance-Data-Visualization-in-Azure-Data-Studio)\n* [Channel 9 - Data Exposed / What is SandDance?](https://channel9.msdn.com/Shows/Data-Exposed/What-is-SandDance)\n* [Hacker News / Microsoft open sources SandDance, a visual data exploration tool](https://news.ycombinator.com/item?id=21224685)\n* [analyticsindiamag.com / Visualizations With SandDance Using Visual Studio Code](https://analyticsindiamag.com/visualizations-with-sanddance-using-visual-studio-code/)\n* [codeburst.io / Exploring Titanic Dataset using Microsoft’s Sandance](https://codeburst.io/exploring-titanic-dataset-using-microsofts-sandance-175eb04b3ac2)\n* [mathkuro.com / VS Codeのイケメンすぎる分析＆可視化ツールSand Danceの使い方](https://www.mathkuro.com/vs-code/sand-dance/)\n* [mathkuro.com / 【SandDanceグラフサンプル】用途に合わせて選択しましょう◎](https://www.mathkuro.com/vs-code/sanddance-charts/)\n* [medium.com - @sefaoguzsaglam / how to start data visualizing with Microsoft’s SandDance (for beginners)](https://medium.com/@sefaoguzsaglam/how-to-start-data-visualizing-with-microsofts-sanddance-for-beginners-abe5c0552750)\n* [mssqltips.com / SandDance for Azure Data Studio](https://www.mssqltips.com/sqlservertip/6045/sanddance-for-azure-data-studio/)\n* [sqlshack.com / Exploring the SandDance Visualizations extension in Azure Data Studio](https://www.sqlshack.com/exploring-the-sanddance-visualizations-extension-in-azure-data-studio/)\n* [torbjornzetterlund.com / I got to do some SandDance visualization](https://torbjornzetterlund.com/i-got-to-do-some-sanddance-vizualisation/)\n* [YouTube - Anjani Prasad Atluri / SandDance: A tutorial](https://www.youtube.com/watch?v=sI4WIQEz07w)\n* [YouTube - BI Tracks / SandDance Visualizations Tutorial - Azure Data Studio](https://www.youtube.com/watch?v=iUhvYMggzAQ)\n\n## Changelog\n\n* July 2022 - Major version bump to v4: Now using MorphCharts.\n* June 2020 - Major version bump to v3: Now using Deck.gl@8.\n* December 2019 - Major version bump to v2: Now using Vega@5.\n* August 2019 - Initial release to AppSource (Power BI marketplace).\n* April 2019 - Initial release to GitHub.\n\n## Known issues\n\n* Animations require a WebGL2 enabled browser.\n\n## Roadmap\n\n* ~~PowerBI custom visual based on this new architecture.~~ done!\n* ~~Additional views, such as stacks.~~ done!\n* Code examples and tutorials.\n* ~~Faceting for all chart types.~~ done!\n* Better date handling.\n\n## Dependencies\n\nSandDance is created with open source libraries, using [Vega](https://vega.github.io) for chart layout.\n\n## Development\n\nSee [dev.md](dev.md)\n\n## Contributing\n\nThis project welcomes contributions and suggestions.  Most contributions require you to agree to a\nContributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us\nthe rights to use your contribution. For details, visit https://cla.microsoft.com.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need to provide\na CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions\nprovided by the bot. You will only need to do this once across all repos using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or\ncontact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.6 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/msrc/pgp-key-msrc).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/msrc/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "azure-pipelines.yml",
    "content": "# Node.js\n# Build a general Node.js project with npm.\n# Add steps that analyze code, save build artifacts, deploy, and more:\n# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript\n\ntrigger:\n- master\n\npool:\n  vmImage: 'ubuntu-latest'\n\nsteps:\n- task: NodeTool@0\n  inputs:\n    versionSpec: '20.x'\n  displayName: 'Install Node.js'\n\n- script: |\n    npm i -g npm@10\n  displayName: 'Install npm 10'\n\n- script: |\n    npm ci\n  displayName: 'npm ci'\n\n- task: ComponentGovernanceComponentDetection@0\n  inputs:\n    scanType: 'Register'\n    verbosity: 'Verbose'\n    alertWarningLevel: 'High'\n\n- script: |\n    npm -v\n  displayName: 'npm version'\n\n- script: |\n    npm run build\n  displayName: 'npm build'\n\n- script: |\n    npm test\n  displayName: 'npm test'\n\n- script: |\n    npm run deploy\n  displayName: 'deploy to website'\n"
  },
  {
    "path": "dev.md",
    "content": "# SandDance development\n\nThe SandDance repo is a monorepo made up of several packages, managed by npm workspaces. SandDance is a component stack with the layer hierarchy below:\n\n1. [Deck.gl](https://github.com/uber/deck.gl) - WebGL rendering and canvas control.\n1. [Vega](https://github.com/vega/vega) - chart layout.\n1. [sanddance-specs](https://github.com/microsoft/SandDance/tree/master/packages/sanddance-specs) - [Vega specifications](https://vega.github.io/vega/docs/specification/) for unit visualizations.\n1. [sanddance](https://github.com/microsoft/SandDance/tree/master/packages/sanddance) - unit visualization chart views and selecting / filtering interaction.\n1. [sanddance-test-umd](https://github.com/microsoft/SandDance/tree/master/packages/sanddance-test-umd) - test of sanddance in UMD deployment.\n1. [sanddance-test-es6](https://github.com/microsoft/SandDance/tree/master/packages/sanddance-test-es6) - test of sanddance in es6 deployment.\n1. [sanddance-react](https://github.com/microsoft/SandDance/tree/master/packages/sanddance-react) - (optional) React wrapper for sanddance.\n1. [sanddance-explorer](https://github.com/microsoft/SandDance/tree/master/packages/sanddance-explorer) - React-based data exploration component.\n1. [sanddance-app](https://github.com/microsoft/SandDance/tree/master/packages/sanddance-app) - React-based sample application used on website.\n\n## System requirements\n* Node.js 16 or higher\n* NPM 8 or higher\n\n## Install\n1. Clone this repo\n1. `npm install`\n1. [Install Jekyll](https://jekyllrb.com/) to run the website locally.\n\n## Build\n1. `npm run build`\n\n## Run\nDepending on which component you'd like to see, you can run in various ways.\n\n### Run website\n1. `npm run deploy`\n1. `cd docs`\n1. `jekyll serve`\n1. Visit http://127.0.0.1:4000/SandDance/\n1. For tests, visit http://127.0.0.1:4000/SandDance/tests\n\n### Run sanddance-app with watchers\n1. `npm start`\n1. Visit http://127.0.0.1:8085/\n"
  },
  {
    "path": "docker-jekyll-local/Dockerfile",
    "content": "FROM jekyll/jekyll:4.2.2\n\nWORKDIR /srv/jekyll\n\n# Copy the docs directory\nCOPY docs/ ./\n\n# Install dependencies\nRUN bundle install\n\nEXPOSE 4000\n\nCMD [\"bundle\", \"exec\", \"jekyll\", \"serve\", \"--host\", \"0.0.0.0\", \"--port\", \"4000\"]\n"
  },
  {
    "path": "docker-jekyll-local/README.md",
    "content": "# Jekyll Local Development with Docker\n\nThis repository includes Docker setup for running Jekyll locally to preview the GitHub Pages site.\n\n## Quick Start\n\n### Start Jekyll\n```bash\ncd docker-jekyll-local\ndocker-compose up\n```\n\n### View your site\nOpen http://localhost:4000/SandDance/ in your browser\n\n### Stop Jekyll\nType ctrl-C in the terminal running `docker-compose up`\n\n## Other useful commands\n\n### Rebuild after changes\n```bash\ncd docker-jekyll-local\ndocker-compose build\n```\n\n## Files\n\n- `docker-jekyll-local/Dockerfile` - Jekyll container setup for local development\n- `docker-jekyll-local/docker-compose.yml` - Container orchestration for local development\n- `docs/Gemfile` - Jekyll dependencies (same as GitHub Pages)\n- `docs/_config.yml` - Jekyll configuration\n\nThe setup uses the same `github-pages` gem as GitHub Pages to ensure compatibility.\n"
  },
  {
    "path": "docker-jekyll-local/docker-compose.yml",
    "content": "services:\n  jekyll:\n    build:\n      context: ..\n      dockerfile: docker-jekyll-local/Dockerfile\n    ports:\n      - \"4000:4000\"\n    volumes:\n      - ../docs:/srv/jekyll\n    command: bundle exec jekyll serve --host 0.0.0.0 --port 4000 --force_polling"
  },
  {
    "path": "docs/Gemfile",
    "content": "source \"https://rubygems.org\"\n\ngem \"github-pages\", group: :jekyll_plugins\ngem \"webrick\", \"~> 1.7\"\n"
  },
  {
    "path": "docs/_config.yml",
    "content": "baseurl: /SandDance\nsass:\n  style: compressed\n"
  },
  {
    "path": "docs/_data/apitree.json",
    "content": "{\n  \"sanddance\": [\n    \"colorSchemes\",\n    \"constants\",\n    \"searchExpression\",\n    \"specs\",\n    \"types\",\n    \"use\",\n    \"util\",\n    \"VegaDeckGl\",\n    \"version\",\n    \"Viewer\"\n  ],\n  \"sanddance-explorer\": [\n    \"capabilities\",\n    \"ColorSettings\",\n    \"controls\",\n    \"DataContent\",\n    \"DataExportType\",\n    \"DataFile\",\n    \"DataFileType\",\n    \"Explorer\",\n    \"Explorer_Class\",\n    \"getColorSettingsFromThemePalette\",\n    \"getEmbedHTML\",\n    \"HistoricInsight\",\n    \"HistoryAction\",\n    \"HistoryItem\",\n    \"Index\",\n    \"Options\",\n    \"Prefs\",\n    \"Props\",\n    \"SettingsGroup\",\n    \"SideTabId\",\n    \"State\",\n    \"themePalettes\",\n    \"UIState\",\n    \"use\",\n    \"version\",\n    \"ViewerOptions\"\n  ],\n  \"sanddance-react\": [\n    \"Props\",\n    \"SandDance\",\n    \"SandDanceReact\",\n    \"use\",\n    \"util\",\n    \"version\"\n  ],\n  \"vega-deck.gl\": [\n    \"base\",\n    \"constants\",\n    \"controls\",\n    \"defaults\",\n    \"Presenter\",\n    \"PresenterElement\",\n    \"types\",\n    \"use\",\n    \"util\",\n    \"ViewGl\"\n  ]\n}"
  },
  {
    "path": "docs/_data/outlines.json",
    "content": "{\n  \"sanddance\": {\n    \"constants.md\": [\n      \"Variables\"\n    ],\n    \"types.md\": [\n      \"Interfaces\"\n    ],\n    \"util.md\": [\n      \"Functions\"\n    ],\n    \"viewer.md\": [\n      \"Constructor\",\n      \"Methods\",\n      \"Properties\"\n    ]\n  },\n  \"sanddance-explorer\": {\n    \"controls.md\": [\n      \"Functions\",\n      \"Interfaces\"\n    ],\n    \"explorer_class.md\": [\n      \"Constructor\",\n      \"Methods\",\n      \"Properties\"\n    ]\n  },\n  \"sanddance-react\": {\n    \"util.md\": [\n      \"Variables\"\n    ]\n  },\n  \"vega-deck.gl\": {\n    \"constants.md\": [\n      \"Variables\"\n    ],\n    \"controls.md\": [\n      \"Interfaces\",\n      \"Variables\"\n    ],\n    \"defaults.md\": [\n      \"Functions\",\n      \"Variables\"\n    ],\n    \"presenter.md\": [\n      \"Constructor\",\n      \"Methods\",\n      \"Properties\"\n    ],\n    \"types.md\": [\n      \"Interfaces\",\n      \"Types\"\n    ],\n    \"util.md\": [\n      \"Functions\"\n    ]\n  }\n}"
  },
  {
    "path": "docs/_data/tree.json",
    "content": "{\n  \"Overview\": [\n    {\n      \"tree\": \"Introduction\",\n      \"url\": \"/docs\"\n    },\n    {\n      \"tree\": \"Changelog\",\n      \"url\": \"/docs/changelog\"\n    },\n    {\n      \"tree\": \"Contributing\",\n      \"url\": \"/docs/contributing\"\n    }\n  ],\n  \"Resources\": [\n    {\n      \"tree\": \"Vega\",\n      \"url\": \"https://vega.github.io/\"\n    },\n    {\n      \"tree\": \"MorphCharts\",\n      \"url\": \"https://morphcharts.com/\"\n    }\n  ]\n}"
  },
  {
    "path": "docs/_includes/footer-links.html",
    "content": "<span>\n    <a href=\"https://github.com/microsoft\">Open source, from Microsoft with love.</a>\n</span>\n<span>\n    <a href=\"https://github.com/microsoft/sanddance/issues\">Contact us on GitHub</a>\n</span>\n<span>\n    <a href=\"https://go.microsoft.com/fwlink/?LinkId=521839\">Privacy &amp; Cookies</a>\n</span>\n<span>\n    <a href=\"https://go.microsoft.com/fwlink/?linkid=2259814\">Consumer Health Privacy</a>\n</span>\n<span>\n    <a href=\"https://www.microsoft.com/en-us/servicesagreement/\">Terms of Use</a>\n</span>\n<br/>\n<span>\n    This site does not collect any personal information or use cookies.\n</span>\n<span>\n    ©2019-2024 Microsoft.\n</span>\n"
  },
  {
    "path": "docs/_layouts/api.html",
    "content": "---\nlayout: default\n---\n\n<nav class=\"c-breadcrumbs\">\n    <div class=\"o-wrapper\">\n        <a href=\"{{ site.baseurl }}/docs\" class=\"c-breadcrumbs__crumb\">Docs</a> \n        <a href=\"{{ site.baseurl }}/docs/api\" class=\"c-breadcrumbs__crumb\">Api Reference</a>\n    </div>\n</nav>\n\n<section class=\"c-page-content\">\n    <div class=\"o-wrapper\">\n        <div class=\"o-layout o-layout--large\">\n            <div class=\"o-layout__item u-1/4@tablet c-tree-stick\">\n                <ul id=\"site-tree\" class=\"c-tree o-list-bare\" role=\"tree\">\n                    {% for tree in site.data.apitree %}\n\n                    {% assign page_url = site.baseurl | append: page.url %}\n\n                    {% assign tree_url = site.baseurl | append: \"/docs/\" | append : tree[0] | append: \"/v3/api/\" %}\n\n                    <li class=\"c-tree__item o-list-bare__item\" role=\"treeitem\">\n                        <div class=\"c-tree__toggle js-tree-toggle{% if page_url == tree_url %} is-open is-active{% endif %}\">\n                            <a href=\"{{ tree_url }}\" {% if page_url == tree_url %}class=\"is-active\"{% endif %}>\n                                {{ tree[0] }}\n                            </a>\n                        </div>\n\n                        <ul class=\"c-tree__submenu\">\n                            {% for branch in tree[1] %}\n                            <li class=\"c-tree__item\">\n                                <a href=\"{{ site.baseurl }}/docs/{{ tree[0] }}/v3/api/#{{ branch | downcase }}\">\n                                    {{ branch }}\n                                </a>\n                            </li>\n                            {% endfor %}\n                        </ul>\n\n                    </li>\n                    {% endfor %}\n                </ul>\n            </div>\n\n            <div class=\"o-layout__item u-3/4@tablet\">\n\n                {{ content }}\n\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "docs/_layouts/default.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>SandDance {{ page.title }}</title>\n    <link rel=\"stylesheet\" href=\"{{ site.baseurl }}/assets/css/main.css\">\n    <link rel=\"stylesheet\" href=\"{{ site.baseurl }}/assets/css/typedoc.css\">\n    <link rel=\"shortcut icon\" href=\"{{ site.baseurl }}/favicon.ico\" />\n</head>\n\n<body>\n    <header class=\"c-page-head\">\n        <div class=\"o-wrapper\">\n            <button id=\"site-nav-toggle\" type=\"button\" class=\"c-site-nav-toggle\">\n                <span></span>\n                <span></span>\n                <span></span>\n            </button>\n\n            <a href=\"//opensource.microsoft.com/\" class=\"c-page-head__logo\">\n                <img alt=\"Microsoft logo\" src=\"{{ site.baseurl }}/assets/images/microsoft-logo.png\">\n            </a>\n\n            <strong class=\"c-page-head__title\">SandDance</strong>\n\n            <nav id=\"site-nav\" class=\"c-site-nav\">\n                <a href=\"{{ site.baseurl }}/\" class=\"c-site-nav__item\">\n                    Home\n                </a>\n                <a href=\"{{ site.baseurl }}/app/\" class=\"c-site-nav__item\">\n                    Try Online\n                </a>\n                <a href=\"{{ site.baseurl }}/examples/\" class=\"c-site-nav__item\">\n                    Examples\n                </a>\n                <a href=\"{{ site.baseurl }}/docs/\" class=\"c-site-nav__item\">\n                    Docs\n                </a>\n                <a href=\"https://github.com/Microsoft/SandDance\" class=\"c-site-nav__item\">\n                    GitHub\n                </a>\n            </nav>\n\n            <button id=\"site-tree-toggle\" type=\"button\" class=\"c-tree-toggle\">\n                <div class=\"c-tree-toggle__icon\">\n                    <span></span>\n                    <span></span>\n                    <span></span>\n                </div>\n                <span class=\"c-tree-toggle__label\">\n                    Contents\n                </span>\n            </button>\n\n            <button id=\"dark-mode-toggle\" type=\"button\" class=\"c-dark-mode-toggle\">\n            </button>\n        </div>\n    </header>\n\n    <main class=\"c-page-main\">\n\n        {{ content }}\n\n    </main>\n\n    <footer class=\"o-wrapper\">\n        {% include footer-links.html %}\n    </footer>\n\n    <script src=\"{{ site.baseurl }}/assets/js/main.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/_layouts/docs.html",
    "content": "---\nlayout: default\n---\n\n<nav class=\"c-breadcrumbs\">\n    <div class=\"o-wrapper\">\n        <a href=\"{{ site.baseurl }}/docs\" class=\"c-breadcrumbs__crumb\">Docs</a>\n    </div>\n</nav>\n\n{% assign match = '' %}\n{% for tree in site.data.tree %}\n    {% for branch in tree[1] %}\n        {% assign checkArray = page.url | split:branch.url %}                       \n        {% if checkArray[0] == '' %}\n            {% assign match = branch.url %}\n        {% endif %}\n    {% endfor %}\n{% endfor %}\n\n<section class=\"c-page-content\">\n    <div class=\"o-wrapper\">\n        <div class=\"o-layout o-layout--large\">\n            <div class=\"o-layout__item u-1/4@tablet c-tree-stick\">\n                <ul id=\"site-tree\" class=\"c-tree o-list-bare\" role=\"tree\">\n                    {% for tree in site.data.tree %}\n                    <li class=\"c-tree__item o-list-bare__item\" role=\"treeitem\">\n                        <div class=\"c-tree__toggle js-tree-toggle\">\n                            {{ tree[0] }}\n                        </div>\n\n                        <ul class=\"c-tree__submenu\">\n                            {% for branch in tree[1] %}\n                                {% if branch.hidden != true %}\n                                    {% assign page_url = page.url %}\n                                    {% assign page_num = page_url | size | minus: 1 %}\n                                    {% assign page_last_char = page_url | slice: page_num, page_num %}\n                                    {% if page_last_char == \"/\" %}\n                                        {% assign page_url = page_url | slice: 0, page_num %}\n                                    {% endif %}\n\n                                    {% assign branch_url = branch.url %}\n                                    {% assign branch_num = branch_url | size | minus: 1 %}\n                                    {% assign branch_last_char = branch_url | slice: branch_num, branch_num %}\n                                    {% if branch_last_char == \"/\" %}\n                                        {% assign branch_url = branch_url | slice: 0, branch_num %}\n                                    {% endif %}\n                                    {% if branch.url contains \"https://\" %}\n                                        {% assign branch_link = branch_url %}\n                                    {% else %}\n                                        {% capture branch_link %}{{ site.baseurl }}{{branch_url}}{% endcapture %}\n                                    {% endif %}\n\n                                    <li class=\"c-tree__item {% if branch.url == match %} is-active{% endif %}\">\n                                        <a href=\"{{ branch_link }}\" {% if branch.url == match %}class=\"is-active\"{% endif %}>\n                                            {{ branch.tree }}\n                                        </a>\n                                    </li>\n                                {% endif %}\n                            {% endfor %}\n                        </ul>\n\n                    </li>\n                    {% endfor %}\n                </ul>\n            </div>\n\n            <div class=\"o-layout__item u-3/4@tablet\">\n\n                {{ content }}\n\n            </div>\n        </div>\n    </div>\n</section>"
  },
  {
    "path": "docs/_layouts/page.html",
    "content": "---\nlayout: default\n---\n\n<section class=\"c-page-content\">\n    <div class=\"o-wrapper\">\n\n        {{ content }}\n\n    </div>\n</section>\n"
  },
  {
    "path": "docs/_layouts/typedoc.html",
    "content": "---\nlayout: docs\n---\n\n<div class=\"typedoc\">\n\n    {{ content }}\n\n    <footer class=\"with-border-bottom o-wrapper\">\n        <div class=\"container\">\n            <h2>Legend</h2>\n            <div class=\"tsd-legend-group\">\n                <ul class=\"tsd-legend\">\n                    <li class=\"tsd-kind-module\"><span class=\"tsd-kind-icon\">Module</span></li>\n                    <li class=\"tsd-kind-object-literal\"><span class=\"tsd-kind-icon\">Object literal</span></li>\n                    <li class=\"tsd-kind-variable\"><span class=\"tsd-kind-icon\">Variable</span></li>\n                    <li class=\"tsd-kind-function\"><span class=\"tsd-kind-icon\">Function</span></li>\n                    <li class=\"tsd-kind-function tsd-has-type-parameter\"><span class=\"tsd-kind-icon\">Function with type parameter</span></li>\n                    <li class=\"tsd-kind-index-signature\"><span class=\"tsd-kind-icon\">Index signature</span></li>\n                    <li class=\"tsd-kind-type-alias\"><span class=\"tsd-kind-icon\">Type alias</span></li>\n                    <li class=\"tsd-kind-type-alias tsd-has-type-parameter\"><span class=\"tsd-kind-icon\">Type alias with type parameter</span></li>\n                </ul>\n                <ul class=\"tsd-legend\">\n                    <li class=\"tsd-kind-enum\"><span class=\"tsd-kind-icon\">Enumeration</span></li>\n                    <li class=\"tsd-kind-enum-member\"><span class=\"tsd-kind-icon\">Enumeration member</span></li>\n                    <li class=\"tsd-kind-property tsd-parent-kind-enum\"><span class=\"tsd-kind-icon\">Property</span></li>\n                    <li class=\"tsd-kind-method tsd-parent-kind-enum\"><span class=\"tsd-kind-icon\">Method</span></li>\n                </ul>\n                <ul class=\"tsd-legend\">\n                    <li class=\"tsd-kind-interface\"><span class=\"tsd-kind-icon\">Interface</span></li>\n                    <li class=\"tsd-kind-interface tsd-has-type-parameter\"><span class=\"tsd-kind-icon\">Interface with type parameter</span></li>\n                    <li class=\"tsd-kind-constructor tsd-parent-kind-interface\"><span class=\"tsd-kind-icon\">Constructor</span></li>\n                    <li class=\"tsd-kind-property tsd-parent-kind-interface\"><span class=\"tsd-kind-icon\">Property</span></li>\n                    <li class=\"tsd-kind-method tsd-parent-kind-interface\"><span class=\"tsd-kind-icon\">Method</span></li>\n                    <li class=\"tsd-kind-index-signature tsd-parent-kind-interface\"><span class=\"tsd-kind-icon\">Index signature</span></li>\n                </ul>\n                <ul class=\"tsd-legend\">\n                    <li class=\"tsd-kind-class\"><span class=\"tsd-kind-icon\">Class</span></li>\n                    <li class=\"tsd-kind-class tsd-has-type-parameter\"><span class=\"tsd-kind-icon\">Class with type parameter</span></li>\n                    <li class=\"tsd-kind-constructor tsd-parent-kind-class\"><span class=\"tsd-kind-icon\">Constructor</span></li>\n                    <li class=\"tsd-kind-property tsd-parent-kind-class\"><span class=\"tsd-kind-icon\">Property</span></li>\n                    <li class=\"tsd-kind-method tsd-parent-kind-class\"><span class=\"tsd-kind-icon\">Method</span></li>\n                    <li class=\"tsd-kind-accessor tsd-parent-kind-class\"><span class=\"tsd-kind-icon\">Accessor</span></li>\n                    <li class=\"tsd-kind-index-signature tsd-parent-kind-class\"><span class=\"tsd-kind-icon\">Index signature</span></li>\n                </ul>\n                <ul class=\"tsd-legend\">\n                    <li class=\"tsd-kind-constructor tsd-parent-kind-class tsd-is-inherited\"><span class=\"tsd-kind-icon\">Inherited constructor</span></li>\n                    <li class=\"tsd-kind-property tsd-parent-kind-class tsd-is-inherited\"><span class=\"tsd-kind-icon\">Inherited property</span></li>\n                    <li class=\"tsd-kind-method tsd-parent-kind-class tsd-is-inherited\"><span class=\"tsd-kind-icon\">Inherited method</span></li>\n                    <li class=\"tsd-kind-accessor tsd-parent-kind-class tsd-is-inherited\"><span class=\"tsd-kind-icon\">Inherited accessor</span></li>\n                </ul>\n                <ul class=\"tsd-legend\">\n                    <li class=\"tsd-kind-property tsd-parent-kind-class tsd-is-protected\"><span class=\"tsd-kind-icon\">Protected property</span></li>\n                    <li class=\"tsd-kind-method tsd-parent-kind-class tsd-is-protected\"><span class=\"tsd-kind-icon\">Protected method</span></li>\n                    <li class=\"tsd-kind-accessor tsd-parent-kind-class tsd-is-protected\"><span class=\"tsd-kind-icon\">Protected accessor</span></li>\n                </ul>\n                <ul class=\"tsd-legend\">\n                    <li class=\"tsd-kind-property tsd-parent-kind-class tsd-is-private\"><span class=\"tsd-kind-icon\">Private property</span></li>\n                    <li class=\"tsd-kind-method tsd-parent-kind-class tsd-is-private\"><span class=\"tsd-kind-icon\">Private method</span></li>\n                    <li class=\"tsd-kind-accessor tsd-parent-kind-class tsd-is-private\"><span class=\"tsd-kind-icon\">Private accessor</span></li>\n                </ul>\n                <ul class=\"tsd-legend\">\n                    <li class=\"tsd-kind-property tsd-parent-kind-class tsd-is-static\"><span class=\"tsd-kind-icon\">Static property</span></li>\n                    <li class=\"tsd-kind-call-signature tsd-parent-kind-class tsd-is-static\"><span class=\"tsd-kind-icon\">Static method</span></li>\n                </ul>\n            </div>\n        </div>\n    </footer>\n\n    <div class=\"container tsd-generator\">\n        <p>Generated using <a href=\"https://typedoc.org/\" target=\"_blank\">TypeDoc</a></p>\n    </div>\n\n</div>"
  },
  {
    "path": "docs/_sass/components/_components.breadcrumbs.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #BREADCRUMBS\n\\*------------------------------------*/\n\n.c-breadcrumbs {\n    border-bottom: 1px solid $ms-black-200;\n    background: $ms-black-100;\n\n    .dark-theme & {\n        border-bottom-color: $ms-black-500;\n        background: $ms-black-600;\n    }\n\n    &__crumb {\n        display: inline-block;\n        padding-top:    $spacing-small;\n        padding-right:  $spacing-tiny;\n        padding-bottom: $spacing-small;\n        color: $ms-sky-400;\n\n        // Dividers on all but the last crumb\n        &:not(:last-child) {\n            &:after {\n                display: inline-block;\n                content: \"/\";\n                margin-left: $spacing-small;\n                color: $ms-black-300;\n            }\n        }\n\n        &:last-child {\n            //color: $ms-black-600;\n        }\n    }\n}"
  },
  {
    "path": "docs/_sass/components/_components.buttons.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n"
  },
  {
    "path": "docs/_sass/components/_components.page-content.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #PAGE CONTENT\n\\*------------------------------------*/\n\n.c-page-content {\n    min-height: 10em;\n    padding-top: $spacing;\n\n    blockquote {\n      border-radius: 6px;\n      padding: 16px;\n      background-color: rgb(226, 218, 241);\n      p {\n        margin-bottom: 0;\n      }\n      .dark-theme & {\n          background-color: rgb(56, 34, 93);\n      }      \n    }\n}"
  },
  {
    "path": "docs/_sass/components/_components.page-foot.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #PAGE FOOT\n\\*------------------------------------*/\n\nfooter {\n    font-size: smaller;\n    span a {\n        border-left: 1px solid $ms-black-300;\n        margin-left: 1em;\n        padding-left: 1em;\n    }\n    span:first-child a {\n        border-left: initial;\n        margin-left: initial;\n        padding-left: initial;\n    }\n}"
  },
  {
    "path": "docs/_sass/components/_components.page-head.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #PAGE HEAD\n\\*------------------------------------*/\n\n.c-page-head {\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 1000;\n    width: 100%;\n    padding-top:    $spacing-small;\n    padding-bottom: $spacing-small;\n    text-align: center;\n    background: $ms-black-600;\n    border-bottom: 1px solid transparent;\n    color: white;\n\n    .dark-theme & {\n        border-color: $ms-black-500;\n    }\n\n    @include mq($from: desktop) {\n        padding: 0;\n        text-align: left;\n    }\n\n    &__logo {\n        display: inline-block;\n        vertical-align: middle;\n        height: $spacing;\n        margin-bottom: $spacing;        \n\n        @include mq($from: desktop) {\n            margin-right:  $spacing-small + $spacing-tiny;\n            margin-bottom: 0;\n            padding-right: $spacing + $spacing-small;\n            border-right: 2px solid $ms-black-400;\n        }\n\n        > img {\n            display: block;\n            height: $spacing;\n        }\n    }\n\n    &__title {\n        display: block;\n        font-weight: 600;\n        text-align: left;\n        @include inuit-font-size($inuit-font-size-h5);\n\n        @include mq($from: desktop) {\n            display: inline-block;\n            vertical-align: middle;\n            margin-right: $spacing;\n            font-weight: 400;\n            @include inuit-font-size($inuit-font-size-h3);\n        }\n\n        &:after {\n            content: '';\n            position: absolute;\n            top: $spacing-large;\n            left: 0;\n            width: 100%;\n            height: 1px;\n            background: $ms-black-500;\n\n            @include mq($from: desktop) {\n                display: none;\n            }\n        }\n    }\n}\n\n.c-dark-mode-toggle {\n    position: absolute;\n    top: $spacing-tiny + $spacing-tiny/2;\n    right: $spacing-small;\n    padding-top:    $spacing-tiny;\n    padding-bottom: $spacing-tiny;\n    padding-right:  $spacing-small;\n    padding-left:   $spacing-small;\n    display: inline-block;\n    background: transparent;\n    border: 0;\n    border-radius: $spacing-tiny/2;\n    outline: 0;\n    cursor: pointer;\n    color: white;\n    width: 6rem;\n    text-align: center;\n    line-height: $spacing;\n    @include inuit-font-size(10px);\n\n    &:hover,\n    &:focus {\n        background: $ms-black-500;\n    }\n\n    &:before {\n        display: inline-block;\n        vertical-align: middle;\n        margin-right: $spacing-tiny;\n        margin-top: -$spacing-tiny/2;\n        content: '';\n        height: $spacing;\n        width: $spacing;\n        background: url(../images/icons/moon.svg);\n        background-size: cover;\n        background-position: center center;\n    }\n\n    .dark-theme & {\n        &:before {\n            background-image: url(../images/icons/sun.svg);\n        }\n    }\n\n    @include mq($from: desktop) {\n        position: static;\n        float: right;\n        margin-top: $spacing-small;\n\n        @include inuit-font-size($inuit-font-size-h5);\n    }\n}"
  },
  {
    "path": "docs/_sass/components/_components.page-main.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #PAGE MAIN\n\\*------------------------------------*/\n\n.c-page-main {\n    padding-top: $spacing-huge;\n    padding-bottom: $spacing-huge;\n    \n    @include mq($from: desktop) {\n        padding-top: $spacing-large + $spacing-small;\n    }\n}"
  },
  {
    "path": "docs/_sass/components/_components.site-nav.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #SITE NAV\n\\*------------------------------------*/\n\n.c-site-nav {\n    display: inline-block;\n    vertical-align: middle;\n    text-align: left;\n\n    @include mq($until: desktop) {\n        display: block;\n        position: absolute;\n        top: 48px;\n        left: 0;\n        width: 100%;\n        z-index: 1000;\n\n        &:not(.is-open) {\n            @include inuit-hidden-visually();\n        }\n    }\n\n    &__item {\n        position: relative;\n        display: block;\n        padding-top:    $spacing-small;\n        padding-right:  $spacing;\n        padding-bottom: $spacing-small;\n        padding-left:   $spacing;\n        color: white;\n        background: $ms-black-500;\n\n        @include mq($from: desktop) {\n            display: inline-block;\n            padding-top:    $spacing-small + $spacing-tiny;\n            padding-right:  $spacing-small;\n            padding-bottom: $spacing-small + $spacing-tiny;\n            padding-left:   $spacing-small;\n            background: transparent;\n            @include inuit-font-size($inuit-font-size-h6);\n        }\n\n        /*&:after {\n            content: \"\";\n            position: absolute;\n            bottom: $spacing-small + $spacing-tiny;\n            left: $spacing-small;\n            right: $spacing-small;\n            height: 2px;\n            background: $ms-black-100;\n            opacity: 0;\n        }*/\n\n        &:hover,\n        &:focus {\n            background: $ms-black-500;\n            text-decoration: none;\n\n            &:after {\n                opacity: 1;\n            }\n        }\n    }\n\n    a {\n        text-decoration: none;\n\n        &:hover,\n        &:focus {\n            text-decoration: underline;\n        }\n    }\n}\n\n.c-site-nav-toggle {\n    position: absolute;\n    top: 0;\n    left: 0;\n    height: $spacing-large;\n    width: $spacing-large + $spacing;\n    border: 0;\n    outline: 0;\n    background: transparent;\n    appearance: none;\n\n    &:hover,\n    &:focus {\n        background: $ms-black-500;\n    }\n\n    > span {\n        position: absolute;\n        width: $spacing;\n        height: 1px;\n        left: 50%;\n        margin-left: -$spacing/2;\n        background: $ms-black-100;\n\n        &:first-child  { top: 35%; }\n        &:nth-child(2) { top: 50%; }\n        &:last-child   { bottom: 35%; }\n    }\n\n    @include mq($from: desktop) {\n        display: none;\n    }\n}"
  },
  {
    "path": "docs/_sass/components/_components.tree.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #TREE\n\\*------------------------------------*/\n\n.c-tree {\n    @include mq($until: tablet) {\n        position: fixed;\n        top: $spacing-huge;\n        left: 0;\n        width: 100%;\n        padding: $spacing;\n        background: $ms-black-100;\n        border-bottom: 1px solid $ms-black-200;\n        z-index: 1000;\n\n        .dark-theme & {\n            background: $ms-black-500;\n            border-bottom-color: $ms-black-600;\n        }\n\n        &:not(.is-open) {\n            @include inuit-hidden-visually();\n        }\n    }\n\n    ul {\n        margin-left: 0;\n        overflow: hidden;\n        transition: height 250ms;\n    }\n\n    li {\n        list-style: none;\n    }\n\n    a {\n        display: inline-block;\n        width: 100%;\n        vertical-align: middle;\n        padding-top:    $spacing-tiny/2;\n        padding-right:  $spacing-small;\n        padding-bottom: $spacing-tiny/2;\n        padding-left:   $spacing + $spacing-tiny;\n        color: $ms-black-600;\n\n        .dark-theme & {\n            color: white;\n        }\n\n        &:hover,\n        &:focus {\n            color: $ms-sky-500;\n            text-decoration: underline;\n        }\n\n        &.is-active {\n            background: $ms-sky-500;\n            color: white;\n        }\n    }\n\n    &__toggle {\n        position: relative;\n        cursor: pointer;\n        padding-top:    $spacing-tiny/2;\n        padding-right:  $spacing-small;\n        padding-bottom: $spacing-tiny/2;\n        padding-left:   $spacing + $spacing-tiny;\n\n        &:before {\n            content: \"\";\n            display: block;\n            position: absolute;\n            top: 50%;\n            left: 0;\n            margin-left:  $spacing-tiny;\n            margin-right: $spacing-tiny;\n            margin-top:   -$spacing-tiny/2;\n            height: $spacing-tiny*1.5;\n            width: $spacing-tiny*1.5;\n            border-style: solid;\n            border-radius: 2px;\n            border-width: 2px 2px 0 0;\n            border-color: $ms-black-500;\n            transform: rotate(45deg);\n            transition: transform 250ms;\n\n            .dark-theme & {\n                border-color: $ms-black-400;\n            }\n        }\n\n        &.is-open {\n            &:before {\n                transform: rotate(135deg);\n            }\n        }\n\n        &.is-active {\n            &:before {\n                border-color: white;\n            }\n        }\n\n        > a {\n            padding-left: 0;\n\n            &.is-active {\n                margin-left: -$spacing - $spacing-tiny;\n                padding-left: $spacing + $spacing-tiny;\n                width: calc(100% + #{$spacing + $spacing-tiny});\n            }\n        }\n    }\n}\n\n.c-tree-stick {\n    @include mq($from: tablet) {\n        position: sticky;\n        top: $spacing*3 + $spacing-small;\n    }\n}\n\n.c-tree-toggle {\n    position: absolute;\n    bottom: 0;\n    right: 0;\n    padding-top:    $spacing-small;\n    padding-right:  $spacing;\n    padding-bottom: $spacing-small;\n    padding-left:   $spacing;\n    background: transparent;\n    border: 0;\n    outline: 0;\n    appearance: none;\n    color: white;\n    @include inuit-font-size(10px);\n\n    @include mq($from: desktop) {\n        display: none;\n    }\n\n    &:hover,\n    &:focus {\n        background: $ms-black-500;\n    }\n\n    &__icon {\n        display: inline-block;\n        vertical-align: middle;\n        position: relative;\n        height: $spacing;\n        width: $spacing;\n        margin-right: $spacing-tiny;\n\n        > span {\n            width: 80%;\n            height: 1px;\n            position: absolute;\n            right: 0;\n            background: $ms-black-100;\n\n            &:first-child { top: 26%; }\n            &:nth-child(2) { top: 50%; }\n            &:last-child   { bottom: 26%; }\n\n            &:before {\n                content: \"\";\n                position: absolute;\n                top: -0.5px;\n                left: -20%;\n                width: 2px;\n                height: 2px;\n                border-radius: 50%;\n                background: inherit;\n            }\n        }\n    }\n\n    &__label {\n        display: inline-block;\n        vertical-align: middle;\n    }\n}"
  },
  {
    "path": "docs/_sass/elements/_elements.code.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #CODE BLOCKS\n\\*------------------------------------*/\n\npre.highlight {\n    width: 100%;\n    max-width: 100%;\n    overflow: auto;\n    margin-bottom: $spacing;\n    padding: $spacing;\n    background: lighten($ms-black-100, 3%);\n    border: 1px solid $ms-black-200;\n    @include inuit-font-size($inuit-font-size-h5);\n\n    .dark-theme & {\n         background: $ms-black-600;\n         border-color: $ms-black-500;\n    }\n\n    > pre {\n        margin-bottom: 0;\n        font-family: Consolas, Lucida Console, Courier New, monospace;\n    }\n\n    code {\n        padding: 0;\n    }\n}\n\n[class*=\"language-\"]:before {\n    display: block;\n    width: 100%;\n    padding-top:    $spacing-tiny;\n    padding-right:  $spacing;\n    padding-bottom: $spacing-tiny;\n    padding-left:   $spacing;\n    background: $ms-black-100;\n    border: 1px solid $ms-black-200;\n    border-bottom: 0;\n    color: $ms-black-500;\n    @include inuit-font-size($inuit-font-size-h6);\n\n    .dark-theme & {\n        background: $ms-sky-500;\n        border-color: $ms-sky-400;\n        color: $ms-black-200;\n    }\n}\n\n.language-html:before       { content: 'HTML'; }\n.language-js:before         { content: 'JavaScript'; }\n.language-json:before       { content: 'JSON'; }\n.language-typescript:before { content: 'TypeScript'; }\n\ncode {\n    padding-bottom:   $spacing-tiny;\n    padding-right:  $spacing-tiny;\n    padding-left:   $spacing-tiny;\n    background: lighten($ms-black-100, 3%);\n    border: 1px solid $ms-black-200;\n    color: $ms-black-500;\n    @include inuit-font-size($inuit-font-size-h5);\n\n    pre & {\n        border: 0;\n        display: block;\n        overflow: auto;\n    }\n}"
  },
  {
    "path": "docs/_sass/elements/_elements.headings.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #HEADINGS\n\\*------------------------------------*/\n\n$header-height: 60px + $spacing;\n\nh1, h2, h3,\nh4, h5, h6 {\n    margin-top: 0;\n    font-weight: 600;\n\n    &:before {\n      display: block; \n      content: ' '; \n      margin-top: -$header-height; \n      height: $header-height; \n      visibility: hidden; \n      pointer-events: none;\n    }\n}"
  },
  {
    "path": "docs/_sass/elements/_elements.hr.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #HORIZONTAL RULE\n\\*------------------------------------*/\n\nhr {\n    border: 0;\n    height: 1px;\n    background: $ms-black-200;\n\n    .dark-theme & {\n        background: $ms-black-500;\n    }\n}"
  },
  {
    "path": "docs/_sass/elements/_elements.links.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #LINKS\n\\*------------------------------------*/\n\na {\n    .c-page-main &, footer & {\n        color: $ms-sky-400;\n\n        .dark-theme & {\n            color: $ms-cyan-400;\n        }\n\n        &:hover,\n        &:focus {\n            color: $ms-sky-500;\n            \n            .dark-theme & {\n                color: $ms-cyan-200;\n            }\n        }\n    }\n}\n\nbutton {\n    font-family: inherit;\n}"
  },
  {
    "path": "docs/_sass/elements/_elements.page.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #PAGE ELEMENTS\n\\*------------------------------------*/\n\nhtml {\n\n}\n\nbody {\n    font-family: 'Segoe UI', sans-serif;\n    color: $ms-black-600;\n\n    &.dark-theme {\n        background: $ms-black-700;\n        color: white;\n    }\n}"
  },
  {
    "path": "docs/_sass/elements/_elements.tables.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #TABLES\n\\*------------------------------------*/\n\ntable {\n    td, th {\n        padding-top:    $spacing-small;\n        padding-right:  $spacing;\n        padding-bottom: $spacing-small;\n        padding-left:   $spacing;\n        border-bottom: 1px solid $ms-black-200;\n        @include inuit-font-size($inuit-font-size-h5);\n\n        .dark-theme & {\n            border-bottom-color: $ms-black-500;\n        }\n    }\n\n    tr:last-child {\n        td {\n            border-bottom: 0;\n        }\n    }\n\n    th {\n        text-align: left;\n    }\n}"
  },
  {
    "path": "docs/_sass/generic/_generic.syntax-highlight.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #SYNTAX HIGHLIGHTING\n\\*------------------------------------*/\n\n.highlight .hll { background-color: #ffffcc }\n.highlight .c { color: #228B22 } /* Comment */\n.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */\n.highlight .k { color: #8B008B; font-weight: bold } /* Keyword */\n.highlight .cm { color: #228B22 } /* Comment.Multiline */\n.highlight .cp { color: #1e889b } /* Comment.Preproc */\n.highlight .c1 { color: #228B22 } /* Comment.Single */\n.highlight .cs { color: #8B008B; font-weight: bold } /* Comment.Special */\n.highlight .gd { color: #aa0000 } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #aa0000 } /* Generic.Error */\n.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #00aa00 } /* Generic.Inserted */\n.highlight .go { color: #888888 } /* Generic.Output */\n.highlight .gp { color: #555555 } /* Generic.Prompt */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.highlight .gt { color: #aa0000 } /* Generic.Traceback */\n.highlight .kc { color: #8B008B; font-weight: bold } /* Keyword.Constant */\n.highlight .kd { color: #8B008B; font-weight: bold } /* Keyword.Declaration */\n.highlight .kn { color: #8B008B; font-weight: bold } /* Keyword.Namespace */\n.highlight .kp { color: #8B008B; font-weight: bold } /* Keyword.Pseudo */\n.highlight .kr { color: #8B008B; font-weight: bold } /* Keyword.Reserved */\n.highlight .kt { color: #a7a7a7; font-weight: bold } /* Keyword.Type */\n.highlight .m { color: #B452CD } /* Literal.Number */\n.highlight .s { color: #CD5555 } /* Literal.String */\n.highlight .na { color: #658b00 } /* Name.Attribute */\n.highlight .nb { color: #658b00 } /* Name.Builtin */\n.highlight .nc { color: #008b45; font-weight: bold } /* Name.Class */\n.highlight .no { color: #00688B } /* Name.Constant */\n.highlight .nd { color: #707a7c } /* Name.Decorator */\n.highlight .ne { color: #008b45; font-weight: bold } /* Name.Exception */\n.highlight .nf { color: #008b45 } /* Name.Function */\n.highlight .nn { color: #008b45; text-decoration: underline } /* Name.Namespace */\n.highlight .nt { color: #8B008B; font-weight: bold } /* Name.Tag */\n.highlight .nv { color: #00688B } /* Name.Variable */\n.highlight .ow { color: #8B008B } /* Operator.Word */\n.highlight .w { color: #bbbbbb } /* Text.Whitespace */\n.highlight .mf { color: #B452CD } /* Literal.Number.Float */\n.highlight .mh { color: #B452CD } /* Literal.Number.Hex */\n.highlight .mi { color: #B452CD } /* Literal.Number.Integer */\n.highlight .mo { color: #B452CD } /* Literal.Number.Oct */\n.highlight .sb { color: #CD5555 } /* Literal.String.Backtick */\n.highlight .sc { color: #CD5555 } /* Literal.String.Char */\n.highlight .sd { color: #CD5555 } /* Literal.String.Doc */\n.highlight .s2 { color: #CD5555 } /* Literal.String.Double */\n.highlight .se { color: #CD5555 } /* Literal.String.Escape */\n.highlight .sh { color: #1c7e71; font-style: italic } /* Literal.String.Heredoc */\n.highlight .si { color: #CD5555 } /* Literal.String.Interpol */\n.highlight .sx { color: #cb6c20 } /* Literal.String.Other */\n.highlight .sr { color: #1c7e71 } /* Literal.String.Regex */\n.highlight .s1 { color: #CD5555 } /* Literal.String.Single */\n.highlight .ss { color: #CD5555 } /* Literal.String.Symbol */\n.highlight .bp { color: #658b00 } /* Name.Builtin.Pseudo */\n.highlight .vc { color: #00688B } /* Name.Variable.Class */\n.highlight .vg { color: #00688B } /* Name.Variable.Global */\n.highlight .vi { color: #00688B } /* Name.Variable.Instance */\n.highlight .il { color: #B452CD } /* Literal.Number.Integer.Long */\n\n.dark-theme {\n    //.highlight pre { background-color: #272822; }\n    .highlight .hll { background-color: #272822; }\n    .highlight .c { color: #75715e } /* Comment */\n    .highlight .err { color: #960050; background-color: #1e0010 } /* Error */\n    .highlight .k { color: #66d9ef } /* Keyword */\n    .highlight .l { color: #ae81ff } /* Literal */\n    .highlight .n { color: #f8f8f2 } /* Name */\n    .highlight .o { color: #f92672 } /* Operator */\n    .highlight .p { color: #f8f8f2 } /* Punctuation */\n    .highlight .cm { color: #75715e } /* Comment.Multiline */\n    .highlight .cp { color: #75715e } /* Comment.Preproc */\n    .highlight .c1 { color: #75715e } /* Comment.Single */\n    .highlight .cs { color: #75715e } /* Comment.Special */\n    .highlight .ge { font-style: italic } /* Generic.Emph */\n    .highlight .gs { font-weight: bold } /* Generic.Strong */\n    .highlight .kc { color: #66d9ef } /* Keyword.Constant */\n    .highlight .kd { color: #66d9ef } /* Keyword.Declaration */\n    .highlight .kn { color: #f92672 } /* Keyword.Namespace */\n    .highlight .kp { color: #66d9ef } /* Keyword.Pseudo */\n    .highlight .kr { color: #66d9ef } /* Keyword.Reserved */\n    .highlight .kt { color: #66d9ef } /* Keyword.Type */\n    .highlight .ld { color: #e6db74 } /* Literal.Date */\n    .highlight .m { color: #ae81ff } /* Literal.Number */\n    .highlight .s { color: #e6db74 } /* Literal.String */\n    .highlight .na { color: #a6e22e } /* Name.Attribute */\n    .highlight .nb { color: #f8f8f2 } /* Name.Builtin */\n    .highlight .nc { color: #a6e22e } /* Name.Class */\n    .highlight .no { color: #66d9ef } /* Name.Constant */\n    .highlight .nd { color: #a6e22e } /* Name.Decorator */\n    .highlight .ni { color: #f8f8f2 } /* Name.Entity */\n    .highlight .ne { color: #a6e22e } /* Name.Exception */\n    .highlight .nf { color: #a6e22e } /* Name.Function */\n    .highlight .nl { color: #f8f8f2 } /* Name.Label */\n    .highlight .nn { color: #f8f8f2 } /* Name.Namespace */\n    .highlight .nx { color: #a6e22e } /* Name.Other */\n    .highlight .py { color: #f8f8f2 } /* Name.Property */\n    .highlight .nt { color: #f92672 } /* Name.Tag */\n    .highlight .nv { color: #f8f8f2 } /* Name.Variable */\n    .highlight .ow { color: #f92672 } /* Operator.Word */\n    .highlight .w { color: #f8f8f2 } /* Text.Whitespace */\n    .highlight .mf { color: #ae81ff } /* Literal.Number.Float */\n    .highlight .mh { color: #ae81ff } /* Literal.Number.Hex */\n    .highlight .mi { color: #ae81ff } /* Literal.Number.Integer */\n    .highlight .mo { color: #ae81ff } /* Literal.Number.Oct */\n    .highlight .sb { color: #e6db74 } /* Literal.String.Backtick */\n    .highlight .sc { color: #e6db74 } /* Literal.String.Char */\n    .highlight .sd { color: #e6db74 } /* Literal.String.Doc */\n    .highlight .s2 { color: #e6db74 } /* Literal.String.Double */\n    .highlight .se { color: #ae81ff } /* Literal.String.Escape */\n    .highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */\n    .highlight .si { color: #e6db74 } /* Literal.String.Interpol */\n    .highlight .sx { color: #e6db74 } /* Literal.String.Other */\n    .highlight .sr { color: #e6db74 } /* Literal.String.Regex */\n    .highlight .s1 { color: #e6db74 } /* Literal.String.Single */\n    .highlight .ss { color: #e6db74 } /* Literal.String.Symbol */\n    .highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */\n    .highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */\n    .highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */\n    .highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */\n    .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */\n\n    .highlight .gh { } /* Generic Heading & Diff Header */\n    .highlight .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */\n    .highlight .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */\n    .highlight .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */\n}"
  },
  {
    "path": "docs/_sass/inuitcss/LICENSE",
    "content": "Copyright 2018 Harry Roberts\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "docs/_sass/inuitcss/elements/_elements.headings.scss",
    "content": "/* ==========================================================================\n   #HEADINGS\n   ========================================================================== */\n\n/**\n * Simple default styles for headings 1 through 6. Anything more opinionated\n * than simple font-size changes should likely be applied via classes (see:\n * http://csswizardry.com/2016/02/managing-typography-on-large-apps/).\n */\n\n// We have all of our heading font sizes defined here. Passing these pixel\n// values into our `inuit-font-size()` mixin will generate a rem-based\n// `font-size` with a pixel fallback, as well as generating a `line-height` that\n// will sit on our baseline grid.\n\n$inuit-font-size-h1:  36px !default;\n$inuit-font-size-h2:  28px !default;\n$inuit-font-size-h3:  24px !default;\n$inuit-font-size-h4:  20px !default;\n$inuit-font-size-h5:  18px !default;\n$inuit-font-size-h6:  16px !default;\n\nh1 {\n  @include inuit-font-size($inuit-font-size-h1);\n}\n\nh2 {\n  @include inuit-font-size($inuit-font-size-h2);\n}\n\nh3 {\n  @include inuit-font-size($inuit-font-size-h3);\n}\n\nh4 {\n  @include inuit-font-size($inuit-font-size-h4);\n}\n\nh5 {\n  @include inuit-font-size($inuit-font-size-h5);\n}\n\nh6 {\n  @include inuit-font-size($inuit-font-size-h6);\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/elements/_elements.images.scss",
    "content": "/* ==========================================================================\n   #IMAGES\n   ========================================================================== */\n\n/**\n * 1. Fluid images for responsive purposes.\n * 2. Offset `alt` text from surrounding copy.\n * 3. Setting `vertical-align` removes the whitespace that appears under `img`\n *    elements when they are dropped into a page as-is. Safer alternative to\n *    using `display: block;`.\n */\n\nimg {\n  max-width: 100%; /* [1] */\n  font-style: italic; /* [2] */\n  vertical-align: middle; /* [3] */\n}\n\n\n\n// In case you don't have control over generated `width` and `height` attributes\n// on `<img>` elements in your markup, but still want the images to be fluid,\n// set this to `false`.\n\n$inuit-static-images: true !default;\n\n  @if ($inuit-static-images == true) {\n\n  /**\n   * If a `width` and/or `height` attribute has been explicitly defined, let’s\n   * not make the image fluid.\n   */\n\n  img[width],\n  img[height] {\n    max-width: none;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/elements/_elements.page.scss",
    "content": "/* ==========================================================================\n   #PAGE\n   ========================================================================== */\n\n/**\n * Simple page-level setup.\n *\n * 1. Set the default `font-size` and `line-height` for the entire project,\n *    sourced from our default variables. The `font-size` is calculated to exist\n *    in ems, the `line-height` is calculated to exist unitlessly.\n * 2. Force scrollbars to always be visible to prevent awkward ‘jumps’ when\n *    navigating between pages that do/do not have enough content to produce\n *    scrollbars naturally.\n * 3. Ensure the page always fills at least the entire height of the viewport.\n */\n\nhtml {\n  font-size: ($inuit-global-font-size / 16px) * 1em; /* [1] */\n  line-height: $inuit-global-line-height / $inuit-global-font-size; /* [1] */\n  overflow-y: scroll; /* [2] */\n  min-height: 100%; /* [3] */\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/elements/_elements.tables.scss",
    "content": "/* ==========================================================================\n   #TABLES\n   ========================================================================== */\n\n/**\n * 1. Ensure tables fill up as much space as possible.\n */\n\ntable {\n  width: 100%; /* [1] */\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/generic/_generic.box-sizing.scss",
    "content": "/* ==========================================================================\n   #BOX-SIZING\n   ========================================================================== */\n\n/**\n * More sensible default box-sizing:\n * css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice\n */\n\nhtml {\n  box-sizing: border-box;\n}\n\n* {\n\n  &,\n  &:before,\n  &:after {\n    box-sizing: inherit;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/generic/_generic.normalize.scss",
    "content": "/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in\n *    IE on Windows Phone and in iOS.\n */\n\nhtml {\n  line-height: 1.15; /* 1 */\n  -ms-text-size-adjust: 100%; /* 2 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n   ========================================================================== */\n\n/**\n * Remove the margin in all browsers (opinionated).\n */\n\nbody {\n  margin: 0;\n}\n\n/**\n * Add the correct display in IE 9-.\n */\n\narticle,\naside,\nfooter,\nheader,\nnav,\nsection {\n  display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n * 1. Add the correct display in IE.\n */\n\nfigcaption,\nfigure,\nmain { /* 1 */\n  display: block;\n}\n\n/**\n * Add the correct margin in IE 8.\n */\n\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n  box-sizing: content-box; /* 1 */\n  height: 0; /* 1 */\n  overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n  font-family: monospace, monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * 1. Remove the gray background on active links in IE 10.\n * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.\n */\n\na {\n  background-color: transparent; /* 1 */\n  -webkit-text-decoration-skip: objects; /* 2 */\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57- and Firefox 39-.\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n  border-bottom: none; /* 1 */\n  text-decoration: underline; /* 2 */\n  text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Prevent the duplicate application of `bolder` by the next rule in Safari 6.\n */\n\nb,\nstrong {\n  font-weight: inherit;\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n  font-family: monospace, monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font style in Android 4.3-.\n */\n\ndfn {\n  font-style: italic;\n}\n\n/**\n * Add the correct background and color in IE 9-.\n */\n\nmark {\n  background-color: #ff0;\n  color: #000;\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n */\n\naudio,\nvideo {\n  display: inline-block;\n}\n\n/**\n * Add the correct display in iOS 4-7.\n */\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Remove the border on images inside links in IE 10-.\n */\n\nimg {\n  border-style: none;\n}\n\n/**\n * Hide the overflow in IE.\n */\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers (opinionated).\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: sans-serif; /* 1 */\n  font-size: 100%; /* 1 */\n  line-height: 1.15; /* 1 */\n  margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n  overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n  text-transform: none;\n}\n\n/**\n * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n *    controls in Android 4.\n * 2. Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\nhtml [type=\"button\"], /* 1 */\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button; /* 2 */\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n  padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\n\nlegend {\n  box-sizing: border-box; /* 1 */\n  color: inherit; /* 2 */\n  display: table; /* 1 */\n  max-width: 100%; /* 1 */\n  padding: 0; /* 3 */\n  white-space: normal; /* 1 */\n}\n\n/**\n * 1. Add the correct display in IE 9-.\n * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n  display: inline-block; /* 1 */\n  vertical-align: baseline; /* 2 */\n}\n\n/**\n * Remove the default vertical scrollbar in IE.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10-.\n * 2. Remove the padding in IE 10-.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n  -webkit-appearance: textfield; /* 1 */\n  outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n  -webkit-appearance: button; /* 1 */\n  font: inherit; /* 2 */\n}\n\n/* Interactive\n   ========================================================================== */\n\n/*\n * Add the correct display in IE 9-.\n * 1. Add the correct display in Edge, IE, and Firefox.\n */\n\ndetails, /* 1 */\nmenu {\n  display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n  display: list-item;\n}\n\n/* Scripting\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n */\n\ncanvas {\n  display: inline-block;\n}\n\n/**\n * Add the correct display in IE.\n */\n\ntemplate {\n  display: none;\n}\n\n/* Hidden\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 10-.\n */\n\n[hidden] {\n  display: none;\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/generic/_generic.reset.scss",
    "content": "/* ==========================================================================\n   #RESET\n   ========================================================================== */\n\n/**\n * A very simple reset that sits on top of Normalize.css.\n */\n\nbody,\nh1, h2, h3, h4, h5, h6,\nblockquote, p, pre,\ndl, dd, ol, ul,\nfigure,\nhr,\nfieldset, legend {\n  margin:  0;\n  padding: 0;\n}\n\n\n\n/**\n * Remove trailing margins from nested lists.\n */\n\nli > {\n\n  ol,\n  ul {\n    margin-bottom: 0;\n  }\n\n}\n\n\n\n/**\n * Remove default table spacing.\n */\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n\n\n/**\n * 1. Reset Chrome and Firefox behaviour which sets a `min-width: min-content;`\n *    on fieldsets.\n */\n\nfieldset {\n  min-width: 0; /* [1] */\n  border: 0;\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/generic/_generic.shared.scss",
    "content": "/* ==========================================================================\n   #SHARED\n   ========================================================================== */\n\n/**\n * Shared declarations for certain elements.\n */\n\n/**\n * Always declare margins in the same direction:\n * csswizardry.com/2012/06/single-direction-margin-declarations\n */\n\naddress,\nh1, h2, h3, h4, h5, h6,\nblockquote, p, pre,\ndl, ol, ul,\nfigure,\nhr,\ntable,\nfieldset {\n  margin-bottom: $inuit-global-spacing-unit;\n}\n\n\n\n/**\n * Consistent indentation for lists.\n */\n\ndd, ol, ul {\n  margin-left: $inuit-global-spacing-unit;\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.block.scss",
    "content": "/* ==========================================================================\n   #BLOCK\n   ========================================================================== */\n\n/**\n * Stacked image-with-text object. A simple abstraction to cover a very commonly\n * occurring design pattern.\n */\n\n.o-block {\n  display: block;\n  text-align: center;\n}\n\n  .o-block__img {\n    margin-bottom: $inuit-global-spacing-unit;\n\n\n    /* Size variants\n       ====================================================================== */\n\n    .o-block--flush > & {\n      margin-bottom: 0;\n    }\n\n    .o-block--tiny > & {\n      margin-bottom: $inuit-global-spacing-unit-tiny;\n    }\n\n    .o-block--small > & {\n      margin-bottom: $inuit-global-spacing-unit-small;\n    }\n\n    .o-block--large > & {\n      margin-bottom: $inuit-global-spacing-unit-large;\n    }\n\n    .o-block--huge > & {\n      margin-bottom: $inuit-global-spacing-unit-huge;\n    }\n\n  }\n\n  .o-block__body {\n    display: block;\n  }\n\n\n\n\n\n/* Alignment variants\n   ========================================================================== */\n\n.o-block--right {\n  text-align: right;\n}\n\n.o-block--left {\n  text-align: left;\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.box.scss",
    "content": "/* ==========================================================================\n   #BOX\n   ========================================================================== */\n\n/**\n * The box object simply boxes off content. Extend with cosmetic styles in the\n * Components layer.\n *\n * 1. So we can apply the `.o-box` class to naturally-inline elements.\n */\n\n.o-box {\n  @include inuit-clearfix();\n  display: block; /* [1] */\n  padding: $inuit-global-spacing-unit;\n\n  > :last-child {\n    margin-bottom: 0;\n  }\n\n}\n\n\n\n\n\n/* Size variants\n   ========================================================================== */\n\n.o-box--flush {\n  padding: 0;\n}\n\n.o-box--tiny {\n  padding: $inuit-global-spacing-unit-tiny;\n}\n\n.o-box--small {\n  padding: $inuit-global-spacing-unit-small;\n}\n\n.o-box--large {\n  padding: $inuit-global-spacing-unit-large;\n}\n\n.o-box--huge {\n  padding: $inuit-global-spacing-unit-huge;\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.crop.scss",
    "content": "/* ==========================================================================\n   #CROP\n   ========================================================================== */\n\n// A list of cropping ratios that get generated as modifier classes.\n// You should predefine it with only the ratios and names your project needs.\n//\n// The map keys are the strings used in the generated class names, and they can\n// follow any convention, as long as they are properly escaped strings. i.e.:\n//\n//   $inuit-crops: (\n//     \"2\\\\:1\"         : (2:1),\n//     \"4-by-3\"        : (4:3),\n//     \"full-hd\"       : (16:9),\n//     \"card-image\"    : (2:3),\n//     \"golden-ratio\"  : (1.618:1) -> non-integers are okay\n//   ) !default;\n\n$inuit-crops: (\n  \"2\\\\:1\"   : (2:1),\n  \"4\\\\:3\"   : (4:3),\n  \"16\\\\:9\"  : (16:9)\n) !default;\n\n\n\n/**\n * Provide a cropping container in order to display media (usually images)\n * cropped to certain ratios.\n *\n * 1. Set up a positioning context in which the image can sit.\n * 2. This is the crucial part: where the cropping happens.\n */\n\n.o-crop {\n  position: relative; /* [1] */\n  display: block;\n  overflow: hidden; /* [2] */\n}\n\n  /**\n   * Apply this class to the content (usually `img`) that needs cropping.\n   *\n   * 1. Image’s default positioning is top-left in the cropping box.\n   * 2. Make sure the media doesn’t stop itself too soon.\n   */\n\n  .o-crop__content {\n    position: absolute;\n    top:  0; /* [1] */\n    left: 0; /* [1] */\n    max-width: none; /* [2] */\n  }\n\n\n\n  /**\n   * We can position the media in different locations within the cropping area.\n   */\n\n  .o-crop__content--left-top {\n    left: 0;\n  }\n\n  .o-crop__content--left-center {\n    top: 50%;\n    transform: translateY(-50%);\n  }\n\n  .o-crop__content--left-bottom {\n    top: auto;\n    bottom: 0;\n  }\n\n  .o-crop__content--right-top {\n    right: 0;\n    left: auto;\n  }\n\n  .o-crop__content--right-center {\n    top: 50%;\n    right: 0;\n    left: auto;\n    transform: translateY(-50%);\n  }\n\n  .o-crop__content--right-bottom {\n    top: auto;\n    right: 0;\n    bottom: 0;\n    left: auto;\n  }\n\n  .o-crop__content--center-top {\n    left: 50%;\n    transform: translateX(-50%);\n  }\n\n  .o-crop__content--center,\n  .o-crop__content--center-center {\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n  }\n\n  .o-crop__content--center-bottom {\n    top: auto;\n    bottom: 0;\n    left: 50%;\n    transform: translateX(-50%);\n  }\n\n\n\n\n\n/* Crop-ratio variants\n   ========================================================================== */\n\n/**\n * Generate a series of crop classes to be used like so:\n *\n *   <div class=\"o-crop  o-crop--golden-ratio\">\n *\n */\n\n@each $crop-name, $crop-value in $inuit-crops {\n\n  @each $antecedent, $consequent in $crop-value {\n\n    @if (type-of($antecedent) != number) {\n      @error \"`#{$antecedent}` needs to be a number.\";\n    }\n\n    @if (type-of($consequent) != number) {\n      @error \"`#{$consequent}` needs to be a number.\";\n    }\n\n    .o-crop--#{$crop-name} {\n      padding-bottom: ($consequent/$antecedent) * 100%;\n    }\n\n  }\n\n}\n\n\n\n\n\n/* Fill modifier\n   ========================================================================== */\n\n/**\n * Content stretches to fill it's container while maintaining aspect-ratio.\n */\n\n.o-crop--fill {\n\n  > .o-crop__content {\n    min-height: 100%;\n    min-width: 100%;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.flag.scss",
    "content": "/* ==========================================================================\n   #FLAG\n   ========================================================================== */\n\n/**\n * The flag object is a design pattern similar to the media object, however it\n * utilises `display: table[-cell];` to give us control over the vertical\n * alignments of the text and image.\n *\n * http://csswizardry.com/2013/05/the-flag-object/\n *\n * 1. Allows us to control vertical alignments.\n * 2. Force the object to be the full width of its parent. Combined with [1],\n *    this makes the object behave in a quasi-`display: block;` manner.\n * 3. Reset inherited `border-spacing` declarations.\n */\n\n.o-flag {\n  display: table; /* [1] */\n  width: 100%; /* [2] */\n  border-spacing: 0; /* [3] */\n}\n\n  /**\n   * Items within a flag object. There should only ever be one of each.\n   *\n   * 1. Default to aligning content to their middles.\n   */\n\n  .o-flag__img,\n  .o-flag__body {\n    display: table-cell;\n    vertical-align: middle; /* [1] */\n  }\n\n  /**\n   * Flag images have a space between them and the body of the object.\n   *\n   * 1. Force `.flag__img` to take up as little space as possible:\n   *    https://pixelsvsbytes.com/2012/02/this-css-layout-grid-is-no-holy-grail/\n   */\n\n  .o-flag__img {\n    width: 1px; /* [1] */\n    padding-right: $inuit-global-spacing-unit;\n\n    /**\n     * 1. Fixes problem with images disappearing.\n     *\n     *    The direct child selector '>' needs to remain in order for nested flag\n     *    objects to not inherit their parent’s formatting. In case the image tag\n     *    is wrapped into another tag, e.g. an anchor for linking reasons, it will\n     *    disappear. In that case try wrapping the whole o-flag__img object into\n     *    an anchor tag.\n     *\n     *    E.g.:\n     *\n     *      <a href=\"/\">\n     *        <div class=\"o-flag__img\">\n     *          <img src=\"./link/to/image.jpg\" alt=\"image alt text\">\n     *        </div>\n     *      </a>\n     */\n\n    > img {\n      max-width: none; /* [1] */\n    }\n\n  }\n\n  /**\n   * The container for the main content of the flag object.\n   *\n   * 1. Forces the `.flag__body` to take up all remaining space.\n   */\n\n  .o-flag__body {\n    width: auto; /* [1] */\n\n    &,\n    > :last-child {\n      margin-bottom: 0;\n    }\n\n  }\n\n\n\n\n\n/* Size variants\n   ========================================================================== */\n\n.o-flag--flush {\n\n  > .o-flag__img {\n    padding-right: 0;\n    padding-left:  0;\n  }\n\n}\n\n\n.o-flag--tiny {\n\n  > .o-flag__img {\n    padding-right: $inuit-global-spacing-unit-tiny;\n  }\n\n  &.o-flag--reverse {\n\n    > .o-flag__img {\n      padding-right: 0;\n      padding-left: $inuit-global-spacing-unit-tiny;\n    }\n\n  }\n\n}\n\n\n.o-flag--small {\n\n  > .o-flag__img {\n    padding-right: $inuit-global-spacing-unit-small;\n  }\n\n  &.o-flag--reverse {\n\n    > .o-flag__img {\n      padding-right: 0;\n      padding-left: $inuit-global-spacing-unit-small;\n    }\n\n  }\n\n}\n\n\n.o-flag--large {\n\n  > .o-flag__img {\n    padding-right: $inuit-global-spacing-unit-large;\n  }\n\n  &.o-flag--reverse {\n\n    > .o-flag__img {\n      padding-right: 0;\n      padding-left: $inuit-global-spacing-unit-large;\n    }\n\n  }\n\n}\n\n\n.o-flag--huge {\n\n  > .o-flag__img {\n    padding-right: $inuit-global-spacing-unit-huge;\n  }\n\n  &.o-flag--reverse {\n\n    > .o-flag__img {\n      padding-right: 0;\n      padding-left: $inuit-global-spacing-unit-huge;\n    }\n\n  }\n\n}\n\n\n\n\n\n/* Reversed flag\n   ========================================================================== */\n\n/**\n * 1. Swap the rendered direction of the object…\n * 2. …and reset it.\n * 3. Reassign margins to the correct sides.\n */\n\n.o-flag--reverse {\n  direction: rtl; /* [1] */\n\n  > .o-flag__img,\n  > .o-flag__body {\n    direction: ltr; /* [2] */\n  }\n\n  > .o-flag__img {\n    padding-right: 0; /* [3] */\n    padding-left: $inuit-global-spacing-unit; /* [3] */\n  }\n\n}\n\n\n\n\n\n/* Alignment variants\n   ========================================================================== */\n\n/**\n * Vertically align the image- and body-content differently. Defaults to middle.\n */\n\n.o-flag--top {\n\n  > .o-flag__img,\n  > .o-flag__body {\n    vertical-align: top;\n  }\n\n}\n\n\n.o-flag--bottom {\n\n  > .o-flag__img,\n  > .o-flag__body {\n    vertical-align: bottom;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.layout.scss",
    "content": "/* ==========================================================================\n   #LAYOUT\n   ========================================================================== */\n\n/**\n * Grid-like layout system.\n *\n * The layout object provides us with a column-style layout system. This file\n * contains the basic structural elements, but classes should be complemented\n * with width utilities, for example:\n *\n *   <div class=\"o-layout\">\n *     <div class=\"o-layout__item  u-1/2\">\n *     </div>\n *     <div class=\"o-layout__item  u-1/2\">\n *     </div>\n *   </div>\n *\n * The above will create a two-column structure in which each column will\n * fluidly fill half of the width of the parent. We can have more complex\n * systems:\n *\n *   <div class=\"o-layout\">\n *     <div class=\"o-layout__item  u-1/1  u-1/3@medium\">\n *     </div>\n *     <div class=\"o-layout__item  u-1/2  u-1/3@medium\">\n *     </div>\n *     <div class=\"o-layout__item  u-1/2  u-1/3@medium\">\n *     </div>\n *   </div>\n *\n * The above will create a system in which the first item will be 100% width\n * until we enter our medium breakpoint, when it will become 33.333% width. The\n * second and third items will be 50% of their parent, until they also become\n * 33.333% width at the medium breakpoint.\n *\n * We can also manipulate entire layout systems by adding a series of modifiers\n * to the `.o-layout` block. For example:\n *\n *   <div class=\"o-layout  o-layout--reverse\">\n *\n * This will reverse the displayed order of the system so that it runs in the\n * opposite order to our source, effectively flipping the system over.\n *\n *   <div class=\"o-layout  o-layout--[right|center]\">\n *\n * This will cause the system to fill up from either the centre or the right\n * hand side. Default behaviour is to fill up the layout system from the left.\n *\n * There are plenty more options available to us: explore them below.\n */\n\n// By default we use the `font-size: 0;` trick to remove whitespace between\n// items. Set this to true in order to use a markup-based strategy like\n// commenting out whitespace or minifying HTML.\n$inuit-use-markup-fix: false !default;\n\n\n\n\n\n/* Default/mandatory classes\n   ========================================================================== */\n\n/**\n * 1. Allows us to use the layout object on any type of element.\n * 2. We need to defensively reset any box-model properties.\n * 3. Use the negative margin trick for multi-row grids:\n *    http://csswizardry.com/2011/08/building-better-grid-systems/\n */\n\n.o-layout {\n  display: block; /* [1] */\n  margin:  0; /* [2] */\n  padding: 0; /* [2] */\n  list-style: none; /* [1] */\n  margin-left: -$inuit-global-spacing-unit; /* [3] */\n\n  @if ($inuit-use-markup-fix == false) {\n    font-size: 0;\n  }\n\n}\n\n  /**\n   * 1. Required in order to combine fluid widths with fixed gutters.\n   * 2. Allows us to manipulate grids vertically, with text-level properties,\n   *    etc.\n   * 3. Default item alignment is with the tops of each other, like most\n   *    traditional grid/layout systems.\n   * 4. By default, all layout items are full-width (mobile first).\n   * 5. Gutters provided by left padding:\n   *    http://csswizardry.com/2011/08/building-better-grid-systems/\n   * 6. Fallback for old IEs not supporting `rem` values.\n   */\n\n  .o-layout__item {\n    box-sizing: border-box; /* [1] */\n    display: inline-block; /* [2] */\n    vertical-align: top; /* [3] */\n    width: 100%; /* [4] */\n    padding-left: $inuit-global-spacing-unit; /* [5] */\n\n    @if ($inuit-use-markup-fix == false) {\n      font-size: $inuit-global-font-size; /* [6] */\n      font-size: 1rem;\n    }\n\n  }\n\n\n\n\n\n/* Gutter size modifiers\n   ========================================================================== */\n\n.o-layout--flush {\n  margin-left: 0;\n\n  > .o-layout__item {\n    padding-left: 0;\n  }\n\n}\n\n\n.o-layout--tiny {\n  margin-left: -$inuit-global-spacing-unit-tiny;\n\n  > .o-layout__item {\n    padding-left: $inuit-global-spacing-unit-tiny;\n  }\n\n}\n\n\n.o-layout--small {\n  margin-left: -$inuit-global-spacing-unit-small;\n\n  > .o-layout__item {\n    padding-left: $inuit-global-spacing-unit-small;\n  }\n\n}\n\n\n.o-layout--large {\n  margin-left: -$inuit-global-spacing-unit-large;\n\n  > .o-layout__item {\n    padding-left: $inuit-global-spacing-unit-large;\n  }\n\n}\n\n\n.o-layout--huge {\n  margin-left: -$inuit-global-spacing-unit-huge;\n\n  > .o-layout__item {\n    padding-left: $inuit-global-spacing-unit-huge;\n  }\n\n}\n\n\n\n\n\n/* Vertical alignment modifiers\n   ========================================================================== */\n\n/**\n * Align all grid items to the middles of each other.\n */\n\n.o-layout--middle {\n\n  > .o-layout__item {\n    vertical-align: middle;\n  }\n\n}\n\n\n/**\n * Align all grid items to the bottoms of each other.\n */\n\n.o-layout--bottom {\n\n  > .o-layout__item {\n    vertical-align: bottom;\n  }\n\n}\n\n\n/**\n * Stretch all grid items of each row to have an equal-height.\n * Please be aware that this modifier class doesn’t take any effect in IE9 and\n * below and other older browsers due to the lack of `display: flex` support.\n */\n\n.o-layout--stretch {\n  display: flex;\n  flex-wrap: wrap;\n\n  > .o-layout__item {\n    display: flex;\n  }\n\n  &.o-layout--center {\n    justify-content: center;\n  }\n\n  &.o-layout--right {\n    justify-content: flex-end;\n  }\n\n  &.o-layout--left {\n    justify-content: flex-start;\n  }\n\n}\n\n\n\n\n\n/* Fill order modifiers\n   ========================================================================== */\n\n/**\n * Fill up the layout system from the centre.\n */\n\n.o-layout--center {\n  text-align: center;\n\n  > .o-layout__item {\n    text-align: left;\n  }\n\n}\n\n\n/**\n * Fill up the layout system from the right-hand side.\n */\n\n.o-layout--right {\n  text-align: right;\n\n  > .o-layout__item {\n    text-align: left;\n  }\n\n}\n\n\n/**\n * Fill up the layout system from the left-hand side. This will likely only be\n * needed when using in conjunction with `.o-layout--reverse`.\n */\n\n.o-layout--left {\n  text-align: left;\n\n  > .o-layout__item {\n    text-align: left;\n  }\n\n}\n\n\n/**\n * Reverse the rendered order of the grid system.\n */\n\n.o-layout--reverse {\n  direction: rtl;\n\n  > .o-layout__item {\n    direction: ltr;\n  }\n\n}\n\n\n\n\n\n/* Auto-widths modifier\n   ========================================================================== */\n\n/**\n * Cause layout items to take up a non-explicit amount of width.\n */\n\n.o-layout--auto {\n\n  > .o-layout__item {\n    width: auto;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.list-bare.scss",
    "content": "/* ==========================================================================\n   #LIST-BARE\n   ========================================================================== */\n\n/**\n * Strip list-like appearance from lists by removing their bullets and any\n * indentation.\n *\n * Note: Declaring the item class might not be necessary everywhere,\n * but is for example in <dl> lists for the <dd> children.\n */\n\n.o-list-bare {\n  list-style: none;\n  margin-left: 0;\n}\n\n  .o-list-bare__item {\n    margin-left: 0;\n  }\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.list-inline.scss",
    "content": "/* ==========================================================================\n   #LIST-INLINE\n   ========================================================================== */\n\n/**\n * The list-inline object simply displays a list of items in one line.\n */\n\n.o-list-inline {\n  margin-left: 0;\n  list-style: none;\n}\n\n  .o-list-inline__item {\n    display: inline-block;\n  }\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.media.scss",
    "content": "/* ==========================================================================\n   #MEDIA\n   ========================================================================== */\n\n/**\n * Place any image- and text-like content side-by-side, as per:\n * http://www.stubbornella.org/content/2010/06/25/the-media-object-saves-hundreds-of-lines-of-code\n */\n\n.o-media {\n  @include inuit-clearfix();\n  display: block;\n}\n\n  .o-media__img {\n    float: left;\n    margin-right: $inuit-global-spacing-unit;\n\n    > img {\n      display: block;\n    }\n\n  }\n\n  .o-media__body {\n    overflow: hidden;\n    display: block;\n\n    &,\n    > :last-child {\n      margin-bottom: 0;\n    }\n\n  }\n\n\n\n\n\n/* Size variants\n   ========================================================================== */\n\n/**\n * Modify the amount of space between our image and our text. We also have\n * reversible options for all available sizes.\n */\n\n.o-media--flush {\n\n  > .o-media__img {\n    margin-right: 0;\n    margin-left: 0;\n }\n\n}\n\n\n.o-media--tiny {\n\n  > .o-media__img {\n    margin-right: $inuit-global-spacing-unit-tiny;\n  }\n\n  &.o-media--reverse {\n\n    > .o-media__img {\n      margin-right: 0;\n      margin-left: $inuit-global-spacing-unit-tiny;\n    }\n\n  }\n\n}\n\n\n.o-media--small {\n\n  > .o-media__img {\n    margin-right: $inuit-global-spacing-unit-small;\n  }\n\n  &.o-media--reverse {\n\n    > .o-media__img {\n      margin-right: 0;\n      margin-left: $inuit-global-spacing-unit-small;\n    }\n\n  }\n\n}\n\n\n.o-media--large {\n\n  > .o-media__img {\n    margin-right: $inuit-global-spacing-unit-large;\n  }\n\n  &.o-media--reverse {\n\n    > .o-media__img {\n      margin-right: 0;\n      margin-left: $inuit-global-spacing-unit-large;\n    }\n\n  }\n\n}\n\n\n.o-media--huge {\n\n  > .o-media__img {\n    margin-right: $inuit-global-spacing-unit-huge;\n  }\n\n  &.o-media--reverse {\n\n    > .o-media__img {\n      margin-right: 0;\n      margin-left: $inuit-global-spacing-unit-huge;\n    }\n\n  }\n\n}\n\n\n\n\n\n/* Reversed media objects\n   ========================================================================== */\n\n.o-media--reverse {\n\n  > .o-media__img {\n    float: right;\n    margin-right: 0;\n    margin-left: $inuit-global-spacing-unit;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.pack.scss",
    "content": "/* ==========================================================================\n   #PACK\n   ========================================================================== */\n\n/**\n * The pack object simply causes any number of elements pack up horizontally to\n * automatically fill an equal, fluid width of their parent.\n *\n * 1. Fill all available space.\n * 2. Remove any leftover styling from lists.\n * 3. Cause children to be automatically equally sized.\n */\n\n.o-pack {\n  width: 100%; /* [1] */\n  margin-left: 0; /* [2] */\n  display: table;\n  table-layout: fixed; /* [3] */\n}\n\n  /**\n   * 1. Cause children to adopt table-like structure.\n   * 2. Default item alignment is with the tops of each other.\n   */\n\n  .o-pack__item {\n    display: table-cell; /* [1] */\n    vertical-align: top; /* [2] */\n\n\n    /* Vertical alignment variants\n       ====================================================================== */\n\n    .o-pack--middle > & {\n      vertical-align: middle;\n    }\n\n    .o-pack--bottom > & {\n      vertical-align: bottom;\n    }\n\n  }\n\n\n\n\n\n/* Unequal-width items\n   ========================================================================== */\n\n.o-pack--auto {\n  table-layout: auto;\n}\n\n\n\n\n\n/* Size variants\n   ========================================================================== */\n\n.o-pack--tiny {\n  border-spacing: $inuit-global-spacing-unit-tiny;\n}\n\n.o-pack--small {\n  border-spacing: $inuit-global-spacing-unit-small;\n}\n\n.o-pack--default {\n  border-spacing: $inuit-global-spacing-unit;\n}\n\n.o-pack--large {\n  border-spacing: $inuit-global-spacing-unit-large;\n}\n\n.o-pack--huge {\n  border-spacing: $inuit-global-spacing-unit-huge;\n}\n\n\n\n\n\n/* Reversed order packs\n   ========================================================================== */\n\n.o-pack--reverse {\n  direction: rtl;\n\n  > .o-pack__item {\n    direction: ltr;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.ratio.scss",
    "content": "/* ==========================================================================\n   #RATIO\n   ========================================================================== */\n\n// A list of aspect ratios that get generated as modifier classes.\n// You should predefine it with only the ratios and names your project needs.\n//\n// The map keys are the strings used in the generated class names, and they can\n// follow any convention, as long as they are properly escaped strings. i.e.:\n//\n//   $inuit-ratios: (\n//     \"2\\\\:1\"         : (2:1),\n//     \"4-by-3\"        : (4:3),\n//     \"full-hd\"       : (16:9),\n//     \"card-image\"    : (2:3),\n//     \"golden-ratio\"  : (1.618:1) -> non-integers are okay\n//   ) !default;\n\n$inuit-ratios: (\n  \"2\\\\:1\"   : (2:1),\n  \"4\\\\:3\"   : (4:3),\n  \"16\\\\:9\"  : (16:9)\n) !default;\n\n\n\n/**\n * Create ratio-bound content blocks, to keep media (e.g. images, videos) in\n * their correct aspect ratios.\n *\n * http://alistapart.com/article/creating-intrinsic-ratios-for-video\n *\n * 1. Default is a 1:1 ratio (i.e. a perfect square).\n */\n\n.o-ratio {\n  position: relative;\n  display: block;\n\n  &:before {\n    content: \"\";\n    display: block;\n    width: 100%;\n    padding-bottom: 100%; /* [1] */\n  }\n\n}\n\n  .o-ratio__content,\n  .o-ratio > iframe,\n  .o-ratio > embed,\n  .o-ratio > object {\n    position: absolute;\n    top:    0;\n    bottom: 0;\n    left:   0;\n    height: 100%;\n    width:  100%;\n  }\n\n\n\n\n\n/* Ratio variants.\n   ========================================================================== */\n\n/**\n * Generate a series of ratio classes to be used like so:\n *\n *   <div class=\"o-ratio  o-ratio--golden-ratio\">\n *\n */\n\n@each $ratio-name, $ratio-value in $inuit-ratios {\n\n  @each $antecedent, $consequent in $ratio-value {\n\n    @if (type-of($antecedent) != number) {\n      @error \"`#{$antecedent}` needs to be a number.\";\n    }\n\n    @if (type-of($consequent) != number) {\n      @error \"`#{$consequent}` needs to be a number.\";\n    }\n\n    .o-ratio--#{$ratio-name}:before {\n      padding-bottom: ($consequent/$antecedent) * 100%;\n    }\n\n  }\n\n}\n\n\n\n\n\n/* Contain modifier.\n   ========================================================================== */\n\n/**\n * Only works with image content.\n * Contains the image to the boundaries, without cropping or stretching it.\n */\n\n.o-ratio--img-contain {\n\n  > .o-ratio__content:before {\n    height: auto;\n    margin: auto;\n    max-height: 100%;\n    max-width: 100%;\n    width: auto;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.table.scss",
    "content": "/* ==========================================================================\n   #TABLE\n   ========================================================================== */\n\n/**\n * A simple object for manipulating the structure of HTML `table`s.\n */\n\n.o-table {\n  width: 100%;\n}\n\n\n\n\n\n/* Equal-width table cells\n   ========================================================================== */\n\n/**\n * `table-layout: fixed` forces all cells within a table to occupy the same\n * width as each other. This also has performance benefits: because the browser\n * does not need to (re)calculate cell dimensions based on content it discovers,\n * the table can be rendered very quickly. Further reading:\n * https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout#Values\n */\n\n.o-table--fixed {\n  table-layout: fixed;\n}\n\n\n\n\n\n/* Size variants\n   ========================================================================== */\n\n.o-table--tiny {\n\n  th,\n  td {\n    padding: $inuit-global-spacing-unit-tiny;\n  }\n\n}\n\n\n.o-table--small {\n\n  th,\n  td {\n    padding: $inuit-global-spacing-unit-small;\n  }\n\n}\n\n\n.o-table--large {\n\n  th,\n  td {\n    padding: $inuit-global-spacing-unit-large;\n  }\n\n}\n\n\n.o-table--huge {\n\n  th,\n  td {\n    padding: $inuit-global-spacing-unit-huge;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/objects/_objects.wrapper.scss",
    "content": "/* ==========================================================================\n   #WRAPPER\n   ========================================================================== */\n\n/**\n * Page-level constraining and wrapping elements.\n */\n\n$inuit-wrapper-width: 1200px !default;\n\n@if (type-of($inuit-wrapper-width) != number) {\n  @error \"`#{$inuit-wrapper-width}` needs to be a number.\";\n}\n\n.o-wrapper {\n  @include inuit-clearfix();\n  padding-right: $inuit-global-spacing-unit;\n  padding-left:  $inuit-global-spacing-unit;\n  margin-right: auto;\n  margin-left:  auto;\n  max-width: $inuit-wrapper-width;\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/settings/_settings.core.scss",
    "content": "///* ========================================================================\n//   #CORE\n//   ======================================================================== */\n\n// This core file sets up inuitcss’ most important setup variables. They\n// underpin a lot of how the framework functions and should be modified and\n// preconfigured with caution.\n\n\n\n// Baseline grid lines height.\n// Every spacing metric should be based on this.\n\n$inuit-global-baseline:     6px !default;\n\n\n\n// How many grid lines should our spacing unit variants span?\n// Each value should be an unitless integer.\n\n$inuit-global-spacing-unit-factor-tiny:   1 !default;   // 6px\n$inuit-global-spacing-unit-factor-small:  2 !default;   // 12px\n$inuit-global-spacing-unit-factor:        4 !default;   // 24px\n$inuit-global-spacing-unit-factor-large:  8 !default;   // 48px\n$inuit-global-spacing-unit-factor-huge:   16 !default;  // 96px\n\n\n\n// Spacing values are determined based on your project’s global baseline grid.\n// It is not recommended that you modify these following variables\n// (it can break your vertical rhythm), but if you need to, you can.\n\n$inuit-global-spacing-unit:       $inuit-global-baseline * $inuit-global-spacing-unit-factor !default;\n$inuit-global-spacing-unit-tiny:  $inuit-global-baseline * $inuit-global-spacing-unit-factor-tiny !default;\n$inuit-global-spacing-unit-small: $inuit-global-baseline * $inuit-global-spacing-unit-factor-small !default;\n$inuit-global-spacing-unit-large: $inuit-global-baseline * $inuit-global-spacing-unit-factor-large !default;\n$inuit-global-spacing-unit-huge:  $inuit-global-baseline * $inuit-global-spacing-unit-factor-huge !default;\n\n\n\n// Base typographical styles.\n\n$inuit-global-font-size:    16px !default;\n$inuit-global-line-height:  $inuit-global-spacing-unit !default;\n\n\n\n\n\n// Check that the chosen font rules are pixel numbers.\n\n@each $_inuit-font-globals in\n      $inuit-global-font-size\n      $inuit-global-line-height {\n\n  @if (type-of($_inuit-font-globals) == number) {\n\n    @if (unit($_inuit-font-globals) != \"px\") {\n      @error \"`#{$_inuit-font-globals}` needs to be a pixel value.\";\n    }\n\n  } @else {\n    @error \"`#{$_inuit-font-globals}` needs to be a number.\";\n  }\n\n}\n\n\n\n// Check that the chosen size factors are unitless, integer numbers.\n\n@each $_inuit-spacing-unit in\n      $inuit-global-spacing-unit-factor-tiny\n      $inuit-global-spacing-unit-factor-small\n      $inuit-global-spacing-unit-factor-large\n      $inuit-global-spacing-unit-factor-huge {\n\n  @if (type-of($_inuit-spacing-unit) == number) {\n\n    @if (unitless($_inuit-spacing-unit) == false) {\n      @error \"`#{$_inuit-spacing-unit}` needs to be unitless.\";\n    }\n\n    @if ($_inuit-spacing-unit != ceil($_inuit-spacing-unit)) {\n      @error \"`#{$_inuit-spacing-unit}` needs to be an integer.\";\n    }\n\n  } @else {\n    @error \"`#{$_inuit-spacing-unit}` needs to be a number.\";\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/tools/_tools.clearfix.scss",
    "content": "///* ========================================================================\n//   #CLEARFIX\n//   ======================================================================== */\n\n// Mixin to drop micro clearfix into a selector. Further reading:\n// http://www.cssmojo.com/the-very-latest-clearfix-reloaded/\n//\n// .usage {\n//   @include inuit-clearfix();\n// }\n\n@mixin inuit-clearfix() {\n\n  &:after {\n    content: \"\" !important;\n    display: block !important;\n    clear: both !important;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/tools/_tools.font-size.scss",
    "content": "///* ========================================================================\n//   #FONT-SIZE\n//   ======================================================================== */\n\n// Generates a rem font-size (with pixel fallback) and a baseline-compatible\n// unitless line-height from a pixel font-size value. Basic usage is simply:\n//\n//   @include inuit-font-size(18px);\n//\n// You can force a specific line-height by passing it as the second argument:\n//\n//   @include inuit-font-size(16px, 1);\n//\n// You can also modify the line-height by increments, while staying in the\n// baseline grid, by setting the `$modifier` parameter. It takes a positive\n// or negative integer, and it will add or remove \"lines\" to the  generated\n// line-height. This is the recomended way to do it, unless you really need\n// an absolute value. i.e.:\n//\n//   // add 2 lines:\n//   @include inuit-font-size(24px, $modifier: +2);\n//\n//   // subtract 1 line:\n//   @include inuit-font-size(24px, $modifier: -1);\n\n@mixin inuit-font-size($font-size, $line-height: auto, $modifier: 0, $important: false) {\n\n  @if (type-of($font-size) == number) {\n    @if (unit($font-size) != \"px\") {\n      @error \"`#{$font-size}` needs to be a pixel value.\";\n    }\n  } @else {\n    @error \"`#{$font-size}` needs to be a number.\";\n  }\n\n  @if ($important == true) {\n    $important: !important;\n  } @else if ($important == false) {\n    $important: null;\n  } @else {\n    @error \"`#{$important}` needs to be `true` or `false`.\";\n  }\n\n  // We provide a `px` fallback for old IEs not supporting `rem` values.\n  font-size: $font-size $important;\n  font-size: ($font-size / $inuit-global-font-size) * 1rem $important;\n\n  @if ($line-height == \"auto\") {\n\n    // Define how many grid lines each text line should span.\n    // By default, we set it to the minimum number of lines necessary\n    // in order to contain the defined font-size, +1 for some breathing room.\n    // This can be modified with the `$modifier` parameter.\n    $lines: ceil($font-size / $inuit-global-baseline) + $modifier + 1;\n    $line-height: $lines * $inuit-global-baseline;\n\n    line-height: ($line-height / $font-size) $important;\n  }\n\n  @else {\n\n    @if (type-of($line-height) == number or $line-height == \"inherit\" or $line-height == \"normal\") {\n      line-height: $line-height $important;\n    }\n\n    @else if ($line-height != 'none' and $line-height != false) {\n      @error \"D’oh! `#{$line-height}` is not a valid value for `$line-height`.\"\n    }\n\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/tools/_tools.hidden.scss",
    "content": "///* ========================================================================\n//   #HIDDEN-VISUALLY\n//   ======================================================================== */\n\n// Mixin to quickly apply accessible hiding to elements.\n\n@mixin inuit-hidden-visually() {\n  border: 0 !important;\n  clip: rect(0 0 0 0) !important;\n  clip-path: inset(50%) !important;\n  height: 1px !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  padding: 0 !important;\n  position: absolute !important;\n  white-space: nowrap !important;\n  width: 1px !important;\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/utilities/_utilities.clearfix.scss",
    "content": "/* ==========================================================================\n   #CLEARFIX\n   ========================================================================== */\n\n/**\n * Attach our clearfix mixin to a utility class.\n */\n\n.u-clearfix {\n  @include inuit-clearfix();\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/utilities/_utilities.headings.scss",
    "content": "/* ==========================================================================\n   #HEADINGS\n   ========================================================================== */\n\n/**\n * Redefine all of our basic heading styles against utility classes so as to\n * allow for double stranded heading hierarchy, e.g. we semantically need an H2,\n * but we want it to be sized like an H1:\n *\n *   <h2 class=\"u-h1\"></h2>\n *\n */\n\n.u-h1 {\n  @include inuit-font-size($inuit-font-size-h1, $important: true);\n}\n\n.u-h2 {\n  @include inuit-font-size($inuit-font-size-h2, $important: true);\n}\n\n.u-h3 {\n  @include inuit-font-size($inuit-font-size-h3, $important: true);\n}\n\n.u-h4 {\n  @include inuit-font-size($inuit-font-size-h4, $important: true);\n}\n\n.u-h5 {\n  @include inuit-font-size($inuit-font-size-h5, $important: true);\n}\n\n.u-h6 {\n  @include inuit-font-size($inuit-font-size-h6, $important: true);\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/utilities/_utilities.hide.scss",
    "content": "/* ==========================================================================\n   #HIDE\n   ========================================================================== */\n\n/**\n * Hide only visually, but have it available for screen readers:\n * http://snook.ca/archives/html_and_css/hiding-content-for-accessibility\n */\n\n.u-hidden-visually {\n  @include inuit-hidden-visually();\n}\n\n\n/**\n * Hide visually and from screen readers.\n */\n\n.u-hidden {\n  display: none !important;\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/utilities/_utilities.print.scss",
    "content": "/* ==========================================================================\n   #PRINT\n   ========================================================================== */\n\n/**\n * Very crude, reset-like styles taken from the HTML5 Boilerplate:\n * https://github.com/h5bp/html5-boilerplate/blob/5.3.0/dist/doc/css.md#print-styles\n * https://github.com/h5bp/html5-boilerplate/blob/master/dist/css/main.css#L205-L282\n */\n\n@media print {\n\n  /**\n   * 1. Black prints faster: http://www.sanbeiji.com/archives/953\n   */\n\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important; /* [1] */\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n\n\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n\n\n  /**\n   * Don’t show links that are fragment identifiers, or use the `javascript:`\n   * pseudo protocol.\n   */\n\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n\n\n  /**\n   * Printing Tables: http://css-discuss.incutio.com/wiki/Printing_Tables\n   */\n\n  thead {\n    display: table-header-group;\n  }\n\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n\n\n  img {\n    max-width: 100% !important;\n  }\n\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/utilities/_utilities.responsive-spacings.scss",
    "content": "/* ==========================================================================\n   #RESPONSIVE-SPACINGS\n   ========================================================================== */\n\n/**\n * Utility classes enhancing the normal spacing classes by adding responsiveness\n * to them. By default, there are not responsive spacings defined. You can\n * generate responsive spacings by adding entries to the following three Sass\n * maps, e.g.:\n *\n *   $inuit-responsive-spacing-directions: (\n *     null: null,\n *     bottom: bottom,\n *   );\n *\n *   $inuit-responsive-spacing-properties: (\n *     \"margin\": \"margin\",\n *   );\n *\n *   $inuit-responsive-spacing-sizes: (\n *     \"-small\": $inuit-global-spacing-unit-small,\n *   );\n *\n * This would bring us the following classes:\n *\n *   .u-margin-small@mobile {}\n *   .u-margin-small@tablet {}\n *   .u-margin-small@desktop {}\n *   .u-margin-small@wide {}\n *   .u-margin-bottom-small@mobile {}\n *   .u-margin-bottom-small@tablet {}\n *   .u-margin-bottom-small@desktop {}\n *   .u-margin-bottom-small@wide {}\n *\n * You can change the generated CSS classes by further extending the Sass maps.\n * If you want every ‘normal’ spacing (those from `utilities.spacings`) also as\n * a responsive version, you can just mirror the ‘normal’ spacings:\n *\n *   $inuit-responsive-spacing-directions: $inuit-spacing-directions !default;\n *\n *   $inuit-responsive-spacing-properties: $inuit-spacing-properties !default;\n *\n *   $inuit-responsive-spacing-sizes: $inuit-spacing-sizes !default;\n *\n * BUT BE AWARE: This can generate a huge chunk of extra CSS, depending on the\n * amount of breakpoints you defined. So please check your CSS’ output and\n * filesize!\n */\n\n\n\n// The responsive spacings just make sense and work properly when the ‘normal’\n// spacings are included, too. In case they're not, we set `_utilities.spacings`\n// to `null`.\n$inuit-spacing-directions: null !default;\n\n// If the ‘normal’ spacings partial is not included, we provide an error message\n// to indicate this.\n@if $inuit-spacing-directions == null {\n  @error \"In order to use responsive spacings, you also need to include `_utilities.spacings.scss`!\";\n}\n@else {\n\n\n\n// When using Sass-MQ, this defines the separator for the breakpoints suffix\n// in the class name. By default, we are generating the responsive suffixes\n// for the classes with a `@` symbol so you get classes like:\n//\n//   <div class=\"u-margin-bottom@mobile\">\n//\n// Be aware that since the `@` symbol is a reserved symbol in CSS, it has to be\n// escaped with a `\\`. In the markup though, you write your classes without the\n// backslash (e.g. `u-margin-bottom@mobile`).\n$inuit-widths-breakpoint-separator: \\@ !default;\n\n\n\n$inuit-responsive-spacing-directions: null !default;\n\n$inuit-responsive-spacing-properties: null !default;\n\n$inuit-responsive-spacing-sizes: null !default;\n\n\n\n/* stylelint-disable max-nesting-depth */\n\n// Don't output anything if no responsive spacings are defined.\n@if ($inuit-responsive-spacing-properties != null) {\n\n  @each $property-namespace, $property in $inuit-responsive-spacing-properties {\n\n    @each $direction-namespace, $direction-rules in $inuit-responsive-spacing-directions {\n\n      @each $size-namespace, $size in $inuit-responsive-spacing-sizes {\n\n        @each $inuit-bp-name, $inuit-bp-value in $mq-breakpoints {\n\n          @include mq($from: $inuit-bp-name) {\n\n            .u-#{$property-namespace}#{$direction-namespace}#{$size-namespace}#{$inuit-widths-breakpoint-separator}#{$inuit-bp-name} {\n\n              @each $direction in $direction-rules {\n                #{$property}#{$direction}: $size !important;\n              }\n\n            }\n\n          }\n\n        }\n\n      }\n\n    }\n\n  }\n\n}\n\n/* stylelint-enable max-nesting-depth */\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/utilities/_utilities.spacings.scss",
    "content": "/* ==========================================================================\n   #SPACINGS\n   ========================================================================== */\n\n/**\n * Utility classes to put specific spacing values onto elements. The below loop\n * will generate us a suite of classes like:\n *\n *   .u-margin-top {}\n *   .u-padding-left-large {}\n *   .u-margin-right-small {}\n *   .u-padding {}\n *   .u-padding-right-none {}\n *   .u-padding-horizontal {}\n *   .u-padding-vertical-small {}\n */\n\n$inuit-spacing-directions: (\n  null: null,\n  \"-top\": \"-top\",\n  \"-right\": \"-right\",\n  \"-bottom\": \"-bottom\",\n  \"-left\": \"-left\",\n  \"-horizontal\": \"-left\" \"-right\",\n  \"-vertical\": \"-top\" \"-bottom\",\n) !default;\n\n$inuit-spacing-properties: (\n  \"padding\": \"padding\",\n  \"margin\": \"margin\",\n) !default;\n\n$inuit-spacing-sizes: (\n  null: $inuit-global-spacing-unit,\n  \"-tiny\": $inuit-global-spacing-unit-tiny,\n  \"-small\": $inuit-global-spacing-unit-small,\n  \"-large\": $inuit-global-spacing-unit-large,\n  \"-huge\": $inuit-global-spacing-unit-huge,\n  \"-none\": 0\n) !default;\n\n@each $property-namespace, $property in $inuit-spacing-properties {\n\n  @each $direction-namespace, $direction-rules in $inuit-spacing-directions {\n\n    @each $size-namespace, $size in $inuit-spacing-sizes {\n\n      .u-#{$property-namespace}#{$direction-namespace}#{$size-namespace} {\n\n        @each $direction in $direction-rules {\n          #{$property}#{$direction}: $size !important;\n        }\n\n      }\n\n    }\n\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/inuitcss/utilities/_utilities.widths.scss",
    "content": "/* ==========================================================================\n   #WIDTHS\n   ========================================================================== */\n\n/**\n * inuitcss generates a series of utility classes that give a fluid width to\n * whichever element they’re applied, e.g.:\n *\n *   <img src=\"\" alt=\"\" class=\"u-1/2\" />\n *\n * These classes are most commonly used in conjunction with our layout system,\n * e.g.:\n *\n *   <div class=\"o-layout__item  u-1/2\">\n *\n * By default, inuitcss will also generate responsive variants of each of these\n * classes by using your Sass MQ configuration, e.g.:\n *\n *   <div class=\"o-layout__item  u-1/1  u-1/2@tablet  u-1/3@desktop\">\n *\n * Optionally, inuitcss can generate offset classes which can push and pull\n * elements left and right by a specified amount, e.g.:\n *\n *   <div class=\"o-layout__item  u-2/3  u-pull-1/3\">\n *\n * This is useful for making very granular changes to the rendered order of\n * items in a layout.\n *\n * N.B. This option is turned off by default.\n */\n\n\n\n// Which fractions would you like in your grid system(s)? By default, inuitcss\n// provides you fractions of one whole, halves, thirds, quarters and fifths,\n// e.g.:\n//\n//   .u-1/2\n//   .u-2/5\n//   .u-3/4\n//   .u-2/3\n\n$inuit-fractions: 1 2 3 4 5 !default;\n\n\n\n\n\n// Optionally, inuitcss can generate classes to offset items by a certain width.\n// Would you like to generate these types of class as well? E.g.:\n//\n//   .u-push-1/3\n//   .u-pull-2/4\n//   .u-pull-1/5\n//   .u-push-2/3\n\n$inuit-offsets: false !default;\n\n\n\n\n\n// By default, inuitcss uses fractions-like classes like `<div class=\"u-1/4\">`.\n// You can change the `/` to whatever you fancy with this variable.\n$inuit-widths-delimiter: \\/ !default;\n\n\n\n\n\n// When using Sass-MQ, this defines the separator for the breakpoints suffix\n// in the class name. By default, we are generating the responsive suffixes\n// for the classes with a `@` symbol so you get classes like:\n// <div class=\"u-3/12@mobile\">\n$inuit-widths-breakpoint-separator: \\@ !default;\n\n\n\n\n\n// A mixin to spit out our width classes. Pass in the columns we want the widths\n// to have, and an optional suffix for responsive widths. E.g. to create thirds\n// and quarters for a small breakpoint:\n//\n// @include widths(3 4, -sm);\n\n@mixin inuit-widths($columns, $breakpoint: null) {\n\n  // Loop through the number of columns for each denominator of our fractions.\n  @each $denominator in $columns {\n\n    // Begin creating a numerator for our fraction up until we hit the\n    // denominator.\n    @for $numerator from 1 through $denominator {\n\n      // Build a class in the format `.u-3/4[@<breakpoint>]`.\n\n      .u-#{$numerator}#{$inuit-widths-delimiter}#{$denominator}#{$breakpoint} {\n        width: ($numerator / $denominator) * 100% !important;\n      }\n\n      @if ($inuit-offsets == true) {\n\n        /**\n         * 1. Reset any leftover or conflicting `left`/`right` values.\n         */\n\n        // Build a class in the format `.u-push-1/2[@<breakpoint>]`.\n\n        .u-push-#{$numerator}#{$inuit-widths-delimiter}#{$denominator}#{$breakpoint} {\n          position: relative !important;\n          right: auto !important; /* [1] */\n          left: ($numerator / $denominator) * 100% !important;\n        }\n\n        // Build a class in the format `.u-pull-5/6[@<breakpoint>]`.\n\n        .u-pull-#{$numerator}#{$inuit-widths-delimiter}#{$denominator}#{$breakpoint} {\n          position: relative !important;\n          right: ($numerator / $denominator) * 100% !important;\n          left: auto !important; /* [1] */\n        }\n\n      }\n\n    }\n\n  }\n\n  @if ($inuit-offsets == true and $breakpoint != null) {\n\n    // Create auto push and pull classes.\n\n    .u-push-none#{$breakpoint} {\n      left: auto !important;\n    }\n\n    .u-pull-none#{$breakpoint} {\n      right: auto !important;\n    }\n\n  }\n\n}\n\n\n\n\n\n/**\n * A series of width helper classes that you can use to size things like grid\n * systems. Classes take a fraction-like format (e.g. `.u-2/3`). Use these in\n * your markup:\n *\n * <div class=\"u-7/12\">\n *\n * The following will generate widths helper classes based on the fractions\n * defined in the `$inuit-fractions` list.\n */\n\n@include inuit-widths($inuit-fractions);\n\n\n\n\n\n/**\n * If we’re using Sass-MQ, automatically generate grid system(s) for each of our\n * defined breakpoints, and give them a Responsive Suffix, e.g.:\n *\n * <div class=\"u-3/12@mobile\">\n */\n\n@if (variable-exists(mq-breakpoints)) {\n\n  @each $inuit-bp-name, $inuit-bp-value in $mq-breakpoints {\n\n    @include mq($from: $inuit-bp-name) {\n      @include inuit-widths($inuit-fractions, #{$inuit-widths-breakpoint-separator}#{$inuit-bp-name});\n    }\n\n  }\n\n}\n"
  },
  {
    "path": "docs/_sass/sass-mq/LICENSE.md",
    "content": "Copyright (c) 2013-2016 Guardian Media Group and contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "docs/_sass/sass-mq/_mq.scss",
    "content": "@charset \"UTF-8\"; // Fixes an issue where Ruby locale is not set properly\n                  // See https://github.com/sass-mq/sass-mq/pull/10\n\n/// Base font size on the `<body>` element\n/// @type Number (unit)\n$mq-base-font-size: 16px !default;\n\n/// Responsive mode\n///\n/// Set to `false` to enable support for browsers that do not support @media queries,\n/// (IE <= 8, Firefox <= 3, Opera <= 9)\n///\n/// You could create a stylesheet served exclusively to older browsers,\n/// where @media queries are rasterized\n///\n/// @example scss\n///  // old-ie.scss\n///  $mq-responsive: false;\n///  @import 'main'; // @media queries in this file will be rasterized up to $mq-static-breakpoint\n///                   // larger breakpoints will be ignored\n///\n/// @type Boolean\n/// @link https://github.com/sass-mq/sass-mq#responsive-mode-off Disabled responsive mode documentation\n$mq-responsive: true !default;\n\n/// Breakpoint list\n///\n/// Name your breakpoints in a way that creates a ubiquitous language\n/// across team members. It will improve communication between\n/// stakeholders, designers, developers, and testers.\n///\n/// @type Map\n/// @link https://github.com/sass-mq/sass-mq#seeing-the-currently-active-breakpoint Full documentation and examples\n$mq-breakpoints: (\n    mobile:  320px,\n    tablet:  740px,\n    desktop: 980px,\n    wide:    1300px\n) !default;\n\n/// Static breakpoint (for fixed-width layouts)\n///\n/// Define the breakpoint from $mq-breakpoints that should\n/// be used as the target width for the fixed-width layout\n/// (i.e. when $mq-responsive is set to 'false') in a old-ie.scss\n///\n/// @example scss\n///  // tablet-only.scss\n///  //\n///  // Ignore all styles above tablet breakpoint,\n///  // and fix the styles (e.g. layout) at tablet width\n///  $mq-responsive: false;\n///  $mq-static-breakpoint: tablet;\n///  @import 'main'; // @media queries in this file will be rasterized up to tablet\n///                   // larger breakpoints will be ignored\n///\n/// @type String\n/// @link https://github.com/sass-mq/sass-mq#adding-custom-breakpoints Full documentation and examples\n$mq-static-breakpoint: desktop !default;\n\n/// Show breakpoints in the top right corner\n///\n/// If you want to display the currently active breakpoint in the top\n/// right corner of your site during development, add the breakpoints\n/// to this list, ordered by width, e.g. (mobile, tablet, desktop).\n///\n/// @type map\n$mq-show-breakpoints: () !default;\n\n/// Customize the media type (e.g. `@media screen` or `@media print`)\n/// By default sass-mq uses an \"all\" media type (`@media all and …`)\n///\n/// @type String\n/// @link https://github.com/sass-mq/sass-mq#changing-media-type Full documentation and examples\n$mq-media-type: all !default;\n\n/// Convert pixels to ems\n///\n/// @param {Number} $px - value to convert\n/// @param {Number} $base-font-size ($mq-base-font-size) - `<body>` font size\n///\n/// @example scss\n///  $font-size-in-ems: mq-px2em(16px);\n///  p { font-size: mq-px2em(16px); }\n///\n/// @requires $mq-base-font-size\n/// @returns {Number}\n@function mq-px2em($px, $base-font-size: $mq-base-font-size) {\n    @if unitless($px) {\n        @warn \"Assuming #{$px} to be in pixels, attempting to convert it into pixels.\";\n        @return mq-px2em($px * 1px, $base-font-size);\n    } @else if unit($px) == em {\n        @return $px;\n    }\n    @return ($px / $base-font-size) * 1em;\n}\n\n/// Get a breakpoint's width\n///\n/// @param {String} $name - Name of the breakpoint. One of $mq-breakpoints\n///\n/// @example scss\n///  $tablet-width: mq-get-breakpoint-width(tablet);\n///  @media (min-width: mq-get-breakpoint-width(desktop)) {}\n///\n/// @requires {Variable} $mq-breakpoints\n///\n/// @returns {Number} Value in pixels\n@function mq-get-breakpoint-width($name, $breakpoints: $mq-breakpoints) {\n    @if map-has-key($breakpoints, $name) {\n        @return map-get($breakpoints, $name);\n    } @else {\n        @warn \"Breakpoint #{$name} wasn't found in $breakpoints.\";\n    }\n}\n\n/// Media Query mixin\n///\n/// @param {String | Boolean} $from (false) - One of $mq-breakpoints\n/// @param {String | Boolean} $until (false) - One of $mq-breakpoints\n/// @param {String | Boolean} $and (false) - Additional media query parameters\n/// @param {String} $media-type ($mq-media-type) - Media type: screen, print…\n///\n/// @ignore Undocumented API, for advanced use only:\n/// @ignore @param {Map} $breakpoints ($mq-breakpoints)\n/// @ignore @param {String} $static-breakpoint ($mq-static-breakpoint)\n///\n/// @content styling rules, wrapped into a @media query when $responsive is true\n///\n/// @requires {Variable} $mq-media-type\n/// @requires {Variable} $mq-breakpoints\n/// @requires {Variable} $mq-static-breakpoint\n/// @requires {function} mq-px2em\n/// @requires {function} mq-get-breakpoint-width\n///\n/// @link https://github.com/sass-mq/sass-mq#responsive-mode-on-default Full documentation and examples\n///\n/// @example scss\n///  .element {\n///    @include mq($from: mobile) {\n///      color: red;\n///    }\n///    @include mq($until: tablet) {\n///      color: blue;\n///    }\n///    @include mq(mobile, tablet) {\n///      color: green;\n///    }\n///    @include mq($from: tablet, $and: '(orientation: landscape)') {\n///      color: teal;\n///    }\n///    @include mq(950px) {\n///      color: hotpink;\n///    }\n///    @include mq(tablet, $media-type: screen) {\n///      color: hotpink;\n///    }\n///    // Advanced use:\n///    $my-breakpoints: (L: 900px, XL: 1200px);\n///    @include mq(L, $breakpoints: $my-breakpoints, $static-breakpoint: L) {\n///      color: hotpink;\n///    }\n///  }\n@mixin mq(\n    $from: false,\n    $until: false,\n    $and: false,\n    $media-type: $mq-media-type,\n    $breakpoints: $mq-breakpoints,\n    $responsive: $mq-responsive,\n    $static-breakpoint: $mq-static-breakpoint\n) {\n    $min-width: 0;\n    $max-width: 0;\n    $media-query: '';\n\n    // From: this breakpoint (inclusive)\n    @if $from {\n        @if type-of($from) == number {\n            $min-width: mq-px2em($from);\n        } @else {\n            $min-width: mq-px2em(mq-get-breakpoint-width($from, $breakpoints));\n        }\n    }\n\n    // Until: that breakpoint (exclusive)\n    @if $until {\n        @if type-of($until) == number {\n            $max-width: mq-px2em($until);\n        } @else {\n            $max-width: mq-px2em(mq-get-breakpoint-width($until, $breakpoints)) - .01em;\n        }\n    }\n\n    // Responsive support is disabled, rasterize the output outside @media blocks\n    // The browser will rely on the cascade itself.\n    @if $responsive == false {\n        $static-breakpoint-width: mq-get-breakpoint-width($static-breakpoint, $breakpoints);\n        $target-width: mq-px2em($static-breakpoint-width);\n\n        // Output only rules that start at or span our target width\n        @if (\n            $and == false\n            and $min-width <= $target-width\n            and (\n                $until == false or $max-width >= $target-width\n            )\n        ) {\n            @content;\n        }\n    }\n\n    // Responsive support is enabled, output rules inside @media queries\n    @else {\n        @if $min-width != 0 { $media-query: '#{$media-query} and (min-width: #{$min-width})'; }\n        @if $max-width != 0 { $media-query: '#{$media-query} and (max-width: #{$max-width})'; }\n        @if $and            { $media-query: '#{$media-query} and #{$and}'; }\n\n        // Remove unnecessary media query prefix 'all and '\n        @if ($media-type == 'all' and $media-query != '') {\n            $media-type: '';\n            $media-query: str-slice(unquote($media-query), 6);\n        }\n\n        @media #{$media-type + $media-query} {\n            @content;\n        }\n    }\n}\n\n/// Add a breakpoint\n///\n/// @param {String} $name - Name of the breakpoint\n/// @param {Number} $width - Width of the breakpoint\n///\n/// @requires {Variable} $mq-breakpoints\n///\n/// @example scss\n///  @include mq-add-breakpoint(tvscreen, 1920px);\n///  @include mq(tvscreen) {}\n@mixin mq-add-breakpoint($name, $width) {\n    $new-breakpoint: ($name: $width);\n    $mq-breakpoints: map-merge($mq-breakpoints, $new-breakpoint) !global;\n}\n\n/// Show the active breakpoint in the top right corner of the viewport\n/// @link https://github.com/sass-mq/sass-mq#seeing-the-currently-active-breakpoint\n///\n/// @param {List} $show-breakpoints ($mq-show-breakpoints) - List of breakpoints to show in the top right corner\n/// @param {Map} $breakpoints ($mq-breakpoints) - Breakpoint names and sizes\n///\n/// @requires {Variable} $mq-breakpoints\n/// @requires {Variable} $mq-show-breakpoints\n///\n/// @example scss\n///  // Show breakpoints using global settings\n///  @include mq-show-breakpoints;\n///\n///  // Show breakpoints using custom settings\n///  @include mq-show-breakpoints((L, XL), (S: 300px, L: 800px, XL: 1200px));\n@mixin mq-show-breakpoints($show-breakpoints: $mq-show-breakpoints, $breakpoints: $mq-breakpoints) {\n    body:before {\n        background-color: #FCF8E3;\n        border-bottom: 1px solid #FBEED5;\n        border-left: 1px solid #FBEED5;\n        color: #C09853;\n        font: small-caption;\n        padding: 3px 6px;\n        pointer-events: none;\n        position: fixed;\n        right: 0;\n        top: 0;\n        z-index: 100;\n\n        // Loop through the breakpoints that should be shown\n        @each $show-breakpoint in $show-breakpoints {\n            $width: mq-get-breakpoint-width($show-breakpoint, $breakpoints);\n            @include mq($show-breakpoint, $breakpoints: $breakpoints) {\n                content: \"#{$show-breakpoint} ≥ #{$width} (#{mq-px2em($width)})\";\n            }\n        }\n    }\n}\n\n@if length($mq-show-breakpoints) > 0 {\n    @include mq-show-breakpoints;\n}\n"
  },
  {
    "path": "docs/_sass/settings/_settings.colors.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n////\n/// Microsoft Colors\n/// @link https://www.microsoft.com/en-us/design/color Microsoft Design Universal Color Palette\n////\n\n/// @group Red\n/// @type Color\n$ms-red-100: #f4abba;\n\n/// @group Red\n/// @type Color\n$ms-red-200: #e6808a;\n\n/// @group Red\n/// @type Color\n$ms-red-300: #e74856;\n\n/// @group Red\n/// @type Color\n$ms-red-400: #e81123;\n\n/// @group Red\n/// @type Color\n$ms-red-500: #c50f1f;\n\n/// @group Red\n/// @type Color\n$ms-red-600: #a80000;\n\n/// @group Red\n/// @type Color\n$ms-red-700: #750b1c;\n\n/// @group Red\n/// @type Map\n/// @example\n///     $red: map-get($ms-red, 400);\n///     // (Same as $ms-red-400)\n$ms-red: (\n    100: $ms-red-100,\n    200: $ms-red-200,\n    300: $ms-red-300,\n    400: $ms-red-400,\n    500: $ms-red-500,\n    600: $ms-red-600,\n    700: $ms-red-700\n);\n\n\n\n/// @group Red-Orange\n/// @type Color\n$ms-red-orange-100: #eec7c2;\n\n/// @group Red-Orange\n/// @type Color\n$ms-red-orange-200: #ee9889;\n\n/// @group Red-Orange\n/// @type Color\n$ms-red-orange-300: #ef6950;\n\n/// @group Red-Orange\n/// @type Color\n$ms-red-orange-400: #f03a17;\n\n/// @group Red-Orange\n/// @type Color\n$ms-red-orange-500: #da3b01;\n\n/// @group Red-Orange\n/// @type Color\n$ms-red-orange-600: #a52613;\n\n/// @group Red-Orange\n/// @type Color\n$ms-red-orange-700: #7f1d10;\n\n/// @group Red-Orange\n/// @type Map\n/// @example\n///     $red-orange: map-get($ms-red-orange, 400);\n///     // (Same as $ms-red-orange-400)\n$ms-red-orange: (\n    100: $ms-red-orange-100,\n    200: $ms-red-orange-200,\n    300: $ms-red-orange-300,\n    400: $ms-red-orange-400,\n    500: $ms-red-orange-500,\n    600: $ms-red-orange-600,\n    700: $ms-red-orange-700\n);\n\n/// @group Orange\n/// @type Color\n$ms-orange-100: #f2d5c9;\n\n/// @group Orange\n/// @type Color\n$ms-orange-200: #f7b189;\n\n/// @group Orange\n/// @type Color\n$ms-orange-300: #f7894a;\n\n/// @group Orange\n/// @type Color\n$ms-orange-400: #f7630c;\n\n/// @group Orange\n/// @type Color\n$ms-orange-500: #ca5010;\n\n/// @group Orange\n/// @type Color\n$ms-orange-600: #a74109;\n\n/// @group Orange\n/// @type Color\n$ms-orange-700: #7f2f08;\n\n/// @group Orange\n/// @type Map\n/// @example\n///     $orange: map-get($ms-orange, 400);\n///     // (Same as $ms-orange-400)\n$ms-orange: (\n    100: $ms-orange-100,\n    200: $ms-orange-200,\n    300: $ms-orange-300,\n    400: $ms-orange-400,\n    500: $ms-orange-500,\n    600: $ms-orange-600,\n    700: $ms-orange-700\n);\n\n\n\n/// @group Amber\n/// @type Color\n$ms-amber-100: #ffdabb;\n\n/// @group Amber\n/// @type Color\n$ms-amber-200: #ffc988;\n\n/// @group Amber\n/// @type Color\n$ms-amber-300: #fa4;\n\n/// @group Amber\n/// @type Color\n$ms-amber-400: #ff8c00;\n\n/// @group Amber\n/// @type Color\n$ms-amber-500: #d47300;\n\n/// @group Amber\n/// @type Color\n$ms-amber-600: #b05e0d;\n\n/// @group Amber\n/// @type Color\n$ms-amber-700: #7f4200;\n\n/// @group Amber\n/// @type Map\n/// @example\n///     $amber: map-get($ms-amber, 400);\n///     // (Same as $ms-amber-400)\n$ms-amber: (\n    100: $ms-amber-100,\n    200: $ms-amber-200,\n    300: $ms-amber-300,\n    400: $ms-amber-400,\n    500: $ms-amber-500,\n    600: $ms-amber-600,\n    700: $ms-amber-700\n);\n\n\n\n/// @group Gold\n/// @type Color\n$ms-gold-100: #ffe5b6;\n\n/// @group Gold\n/// @type Color\n$ms-gold-200: #ffd679;\n\n/// @group Gold\n/// @type Color\n$ms-gold-300: #ffc83d;\n\n/// @group Gold\n/// @type Color\n$ms-gold-400: #ffb900;\n\n/// @group Gold\n/// @type Color\n$ms-gold-500: #eaa300;\n\n/// @group Gold\n/// @type Color\n$ms-gold-600: #d48c00;\n\n/// @group Gold\n/// @type Color\n$ms-gold-700: #ab620d;\n\n/// @group Gold\n/// @type Map\n/// @example\n///     $gold: map-get($ms-gold, 400);\n///     // (Same as $ms-gold-400)\n$ms-gold: (\n    100: $ms-gold-100,\n    200: $ms-gold-200,\n    300: $ms-gold-300,\n    400: $ms-gold-400,\n    500: $ms-gold-500,\n    600: $ms-gold-600,\n    700: $ms-gold-700\n);\n\n\n\n/// @group Yellow\n/// @type Color\n$ms-yellow-100: #f9f1a5;\n\n/// @group Yellow\n/// @type Color\n$ms-yellow-200: #faec6e;\n\n/// @group Yellow\n/// @type Color\n$ms-yellow-300: #fff100;\n\n/// @group Yellow\n/// @type Color\n$ms-yellow-400: #fce100;\n\n/// @group Yellow\n/// @type Color\n$ms-yellow-500: #dfbe00;\n\n/// @group Yellow\n/// @type Color\n$ms-yellow-600: #c19c00;\n\n/// @group Yellow\n/// @type Color\n$ms-yellow-700: #986f0b;\n\n/// @group Yellow\n/// @type Map\n/// @example\n///     $yellow: map-get($ms-yellow, 400);\n///     // (Same as $ms-yellow-400)\n$ms-yellow: (\n    100: $ms-yellow-100,\n    200: $ms-yellow-200,\n    300: $ms-yellow-300,\n    400: $ms-yellow-400,\n    500: $ms-yellow-500,\n    600: $ms-yellow-600,\n    700: $ms-yellow-700\n);\n\n/// @group Chartreuse\n/// @type Color\n$ms-chartreuse-100: #f8ffb3;\n\n/// @group Yellow-Green\n/// @type Color\n$ms-chartreuse-200: #e4f577;\n\n/// @group Yellow-Green\n/// @type Color\n$ms-chartreuse-300: #d1ec3c;\n\n/// @group Yellow-Green\n/// @type Color\n$ms-chartreuse-400: #bad80a;\n\n/// @group Yellow-Green\n/// @type Color\n$ms-chartreuse-500: #a4cf0c;\n\n/// @group Yellow-Green\n/// @type Color\n$ms-chartreuse-600: #8cbd18;\n\n/// @group Yellow-Green\n/// @type Color\n$ms-chartreuse-700: #73aa24;\n\n/// @group Yellow-Green\n/// @type Map\n/// @example\n///     $chartreuse: map-get($ms-chartreuse, 400);\n///     // (Same as $ms-chartreuse-400)\n$ms-chartreuse: (\n    100: $ms-chartreuse-100,\n    200: $ms-chartreuse-200,\n    300: $ms-chartreuse-300,\n    400: $ms-chartreuse-400,\n    500: $ms-chartreuse-500,\n    600: $ms-chartreuse-600,\n    700: $ms-chartreuse-700\n);\n\n\n\n/// @group Lime\n/// @type Color\n$ms-lime-100: #d5e5ae;\n\n/// @group Lime\n/// @type Color\n$ms-lime-200: #b7df74;\n\n/// @group Lime\n/// @type Color\n$ms-lime-300: #9ad93a;\n\n/// @group Lime\n/// @type Color\n$ms-lime-400: #7cd300;\n\n/// @group Lime\n/// @type Color\n$ms-lime-500: #6bb700;\n\n/// @group Lime\n/// @type Color\n$ms-lime-600: #599b00;\n\n/// @group Lime\n/// @type Color\n$ms-lime-700: #498205;\n\n/// @group Lime\n/// @type Map\n/// @example\n///     $lime: map-get($ms-lime, 400);\n///     // (Same as $ms-lime-400)\n$ms-lime: (\n    100: $ms-lime-100,\n    200: $ms-lime-200,\n    300: $ms-lime-300,\n    400: $ms-lime-400,\n    500: $ms-lime-500,\n    600: $ms-lime-600,\n    700: $ms-lime-700\n);\n\n\n\n/// @group Green\n/// @type Color\n$ms-green-100: #aae5aa;\n\n/// @group Green\n/// @type Color\n$ms-green-200: #79db75;\n\n/// @group Green\n/// @type Color\n$ms-green-300: #47d041;\n\n/// @group Green\n/// @type Color\n$ms-green-400: #16c60c;\n\n/// @group Green\n/// @type Color\n$ms-green-500: #13a10e;\n\n/// @group Green\n/// @type Color\n$ms-green-600: #107c10;\n\n/// @group Green\n/// @type Color\n$ms-green-700: #0b6a0b;\n\n/// @group Green\n/// @type Map\n/// @example\n///     $green: map-get($ms-green, 400);\n///     // (Same as $ms-green-400)\n$ms-green: (\n    100: $ms-green-100,\n    200: $ms-green-200,\n    300: $ms-green-300,\n    400: $ms-green-400,\n    500: $ms-green-500,\n    600: $ms-green-600,\n    700: $ms-green-700\n);\n\n\n\n/// @group Mint\n/// @type Color\n$ms-mint-100: #a8e5c2;\n\n/// @group Mint\n/// @type Color\n$ms-mint-200: #70dda5;\n\n/// @group Mint\n/// @type Color\n$ms-mint-300: #38d487;\n\n/// @group Mint\n/// @type Color\n$ms-mint-400: #00cc6a;\n\n/// @group Mint\n/// @type Color\n$ms-mint-500: #00ae56;\n\n/// @group Mint\n/// @type Color\n$ms-mint-600: #10893e;\n\n/// @group Mint\n/// @type Color\n$ms-mint-700: #00722e;\n\n/// @group Mint\n/// @type Map\n/// @example\n///     $mint: map-get($ms-mint, 400);\n///     // (Same as $ms-mint-400)\n$ms-mint: (\n    100: $ms-mint-100,\n    200: $ms-mint-200,\n    300: $ms-mint-300,\n    400: $ms-mint-400,\n    500: $ms-mint-500,\n    600: $ms-mint-600,\n    700: $ms-mint-700\n);\n\n/// @group Teal\n/// @type Color\n$ms-teal-100: #c2f2e9;\n\n/// @group Teal\n/// @type Color\n$ms-teal-200: #81e6d3;\n\n/// @group Teal\n/// @type Color\n$ms-teal-300: #41dabc;\n\n/// @group Teal\n/// @type Color\n$ms-teal-400: #00cea6;\n\n/// @group Teal\n/// @type Color\n$ms-teal-500: #00b294;\n\n/// @group Teal\n/// @type Color\n$ms-teal-600: #008272;\n\n/// @group Teal\n/// @type Color\n$ms-teal-700: #005e50;\n\n/// @group Teal\n/// @type Map\n/// @example\n///     $teal: map-get($ms-teal, 400);\n///     // (Same as $ms-teal-400)\n$ms-teal: (\n    100: $ms-teal-100,\n    200: $ms-teal-200,\n    300: $ms-teal-300,\n    400: $ms-teal-400,\n    500: $ms-teal-500,\n    600: $ms-teal-600,\n    700: $ms-teal-700\n);\n\n\n\n/// @group Seafoam\n/// @type Color\n$ms-seafoam-100: #91e5df;\n\n/// @group Seafoam\n/// @type Color\n$ms-seafoam-200: #61d6d6;\n\n/// @group Seafoam\n/// @type Color\n$ms-seafoam-300: #30c6cc;\n\n/// @group Seafoam\n/// @type Color\n$ms-seafoam-400: #00b7c3;\n\n/// @group Seafoam\n/// @type Color\n$ms-seafoam-500: #009ca4;\n\n/// @group Seafoam\n/// @type Color\n$ms-seafoam-600: #038387;\n\n/// @group Seafoam\n/// @type Color\n$ms-seafoam-700: #066;\n\n/// @group Seafoam\n/// @type Map\n/// @example\n///     $splish-splash: map-get($ms-seafoam, 400);\n///     // (Same as $ms-seafoam-400)\n$ms-seafoam: (\n    100: $ms-seafoam-100,\n    200: $ms-seafoam-200,\n    300: $ms-seafoam-300,\n    400: $ms-seafoam-400,\n    500: $ms-seafoam-500,\n    600: $ms-seafoam-600,\n    700: $ms-seafoam-700\n);\n\n\n\n/// @group Cyan\n/// @type Color\n$ms-cyan-100: #99ecff;\n\n/// @group Cyan\n/// @type Color\n$ms-cyan-200: #69eaff;\n\n/// @group Cyan\n/// @type Color\n$ms-cyan-300: #31d2f7;\n\n/// @group Cyan\n/// @type Color\n$ms-cyan-400: #00bcf2;\n\n/// @group Cyan\n/// @type Color\n$ms-cyan-500: #0099bc;\n\n/// @group Cyan\n/// @type Color\n$ms-cyan-600: #006f94;\n\n/// @group Cyan\n/// @type Color\n$ms-cyan-700: #005b70;\n\n/// @group Cyan\n/// @type Map\n/// @example\n///     $cyan: map-get($ms-cyan, 400);\n///     // (Same as $ms-cyan-400)\n$ms-cyan: (\n    100: $ms-cyan-100,\n    200: $ms-cyan-200,\n    300: $ms-cyan-300,\n    400: $ms-cyan-400,\n    500: $ms-cyan-500,\n    600: $ms-cyan-600,\n    700: $ms-cyan-700\n);\n\n\n\n/// @group Sky\n/// @type Color\n$ms-sky-100: #b3dbf2;\n\n/// @group Sky\n/// @type Color\n$ms-sky-200: #83beec;\n\n/// @group Sky\n/// @type Color\n$ms-sky-300: #3a96dd;\n\n/// @group Sky\n/// @type Color\n$ms-sky-400: #0072cc;\n\n/// @group Sky\n/// @type Color\n$ms-sky-500: #0063b1;\n\n/// @group Sky\n/// @type Color\n$ms-sky-600: #004e8c;\n\n/// @group Sky\n/// @type Color\n$ms-sky-700: #003966;\n\n/// @group Sky\n/// @type Map\n/// @example\n///     $mr-blue-sky: map-get($ms-sky, 400);\n///     // (Same as $ms-sky-400)\n$ms-sky: (\n    100: $ms-sky-100,\n    200: $ms-sky-200,\n    300: $ms-sky-300,\n    400: $ms-sky-400,\n    500: $ms-sky-500,\n    600: $ms-sky-600,\n    700: $ms-sky-700\n);\n\n\n\n/// @group Blue\n/// @type Color\n$ms-blue-100: #abc9ed;\n\n/// @group Blue\n/// @type Color\n$ms-blue-200: #7ba7ff;\n\n/// @group Blue\n/// @type Color\n$ms-blue-300: #3b78ff;\n\n/// @group Blue\n/// @type Color\n$ms-blue-400: #0046ff;\n\n/// @group Blue\n/// @type Color\n$ms-blue-500: #0037da;\n\n/// @group Blue\n/// @type Color\n$ms-blue-600: #0027b4;\n\n/// @group Blue\n/// @type Color\n$ms-blue-700: #00188f;\n\n/// @group Blue\n/// @type Map\n/// @example\n///     $blue: map-get($ms-blue, 400);\n///     // (Same as $ms-blue-400)\n$ms-blue: (\n    100: $ms-blue-100,\n    200: $ms-blue-200,\n    300: $ms-blue-300,\n    400: $ms-blue-400,\n    500: $ms-blue-500,\n    600: $ms-blue-600,\n    700: $ms-blue-700\n);\n\n\n\n/// @group Navy\n/// @type Color\n$ms-navy-100: #a6bdff;\n\n/// @group Navy\n/// @type Color\n$ms-navy-200: #7c96f9;\n\n/// @group Navy\n/// @type Color\n$ms-navy-300: #4f6bed;\n\n/// @group Navy\n/// @type Color\n$ms-navy-400: #2849ec;\n\n/// @group Navy\n/// @type Color\n$ms-navy-500: #203dbd;\n\n/// @group Navy\n/// @type Color\n$ms-navy-600: #19318d;\n\n/// @group Navy\n/// @type Color\n$ms-navy-700: #11255e;\n\n/// @group Navy\n/// @type Map\n/// @example\n///     $in-the-navy: map-get($ms-navy, 400);\n///     // (Same as $ms-navy-400)\n$ms-navy: (\n    100: $ms-navy-100,\n    200: $ms-navy-200,\n    300: $ms-navy-300,\n    400: $ms-navy-400,\n    500: $ms-navy-500,\n    600: $ms-navy-600,\n    700: $ms-navy-700\n);\n\n/// @group Indigo\n/// @type Color\n$ms-indigo-100: #bebee5;\n\n/// @group Indigo\n/// @type Color\n$ms-indigo-200: #6b69d6;\n\n/// @group Indigo\n/// @type Color\n$ms-indigo-300: #4f4bd9;\n\n/// @group Indigo\n/// @type Color\n$ms-indigo-400: #413eb3;\n\n/// @group Indigo\n/// @type Color\n$ms-indigo-500: #32318c;\n\n/// @group Indigo\n/// @type Color\n$ms-indigo-600: #242466;\n\n/// Custom indigo shade (Not officially apart of Microsoft's color palette)\n/// @group Violet\n/// @type Color\n$ms-indigo-700: darken($ms-indigo-600, 10%);\n\n/// @group Indigo\n/// @type Map\n/// @example\n///     $girls: map-get($ms-indigo, 400);\n///     // (Same as $ms-indigo-400)\n$ms-indigo: (\n    100: $ms-indigo-100,\n    200: $ms-indigo-200,\n    300: $ms-indigo-300,\n    400: $ms-indigo-400,\n    500: $ms-indigo-500,\n    600: $ms-indigo-600,\n    700: $ms-indigo-700\n);\n\n\n\n/// @group Violet\n/// @type Color\n$ms-violet-100: #b5b5e2;\n\n/// @group Violet\n/// @type Color\n$ms-violet-200: #8378de;\n\n/// @group Violet\n/// @type Color\n$ms-violet-300: #7160e8;\n\n/// @group Violet\n/// @type Color\n$ms-violet-400: #5a4ebc;\n\n/// @group Violet\n/// @type Color\n$ms-violet-500: #49409a;\n\n/// @group Violet\n/// @type Color\n$ms-violet-600: #373277;\n\n/// Custom violet shade (Not officially apart of Microsoft's color palette)\n/// @group Violet\n/// @type Color\n$ms-violet-700: darken($ms-violet-600, 10%);\n\n/// @group Violet\n/// @type Map\n/// @example\n///     $girls: map-get($ms-indigo, 400);\n///     // (Same as $ms-indigo-400)\n$ms-violet: (\n    100: $ms-violet-100,\n    200: $ms-violet-200,\n    300: $ms-violet-300,\n    400: $ms-violet-400,\n    500: $ms-violet-500,\n    600: $ms-violet-600,\n    700: $ms-violet-700\n);\n\n\n\n/// @group Lavender\n/// @type Color\n$ms-lavender-100: #c3c3f4;\n\n/// @group Lavender\n/// @type Color\n$ms-lavender-200: #9c89e9;\n\n/// @group Lavender\n/// @type Color\n$ms-lavender-300: #886ce4;\n\n/// @group Lavender\n/// @type Color\n$ms-lavender-400: #735bc1;\n\n/// @group Lavender\n/// @type Color\n$ms-lavender-500: #5e4a9d;\n\n/// @group Lavender\n/// @type Color\n$ms-lavender-600: #49397a;\n\n/// Custom lavender shade (Not officially apart of Microsoft's color palette)\n/// @group Lavender\n/// @type Color\n$ms-lavender-700: darken($ms-lavender-600, 10%);\n\n/// @group Lavender\n/// @type Map\n/// @example\n///     $flower: map-get($ms-lavender, 400);\n///     // (Same as $ms-lavender-400)\n$ms-lavender: (\n    100: $ms-lavender-100,\n    200: $ms-lavender-200,\n    300: $ms-lavender-300,\n    400: $ms-lavender-400,\n    500: $ms-lavender-500,\n    600: $ms-lavender-600,\n    700: $ms-lavender-700\n);\n\n/// @group Purple\n/// @type Color\n$ms-purple-100: #cfc4f5;\n\n/// @group Purple\n/// @type Color\n$ms-purple-200: #8764b8;\n\n/// @group Purple\n/// @type Color\n$ms-purple-300: #744da9;\n\n/// @group Purple\n/// @type Color\n$ms-purple-400: #5c2e91;\n\n/// @group Purple\n/// @type Color\n$ms-purple-500: #4e257f;\n\n/// @group Purple\n/// @type Color\n$ms-purple-600: #401b6c;\n\n/// Custom purple shade (Not officially apart of Microsoft's color palette)\n/// @group Purple\n/// @type Color\n$ms-purple-700: darken($ms-purple-600, 10%);\n\n/// @group Purple\n/// @type Map\n/// @example\n///     $nurple: map-get($ms-purple, 400);\n///     // (Same as $ms-purple-400)\n$ms-purple: (\n    100: $ms-purple-100,\n    200: $ms-purple-200,\n    300: $ms-purple-300,\n    400: $ms-purple-400,\n    500: $ms-purple-500,\n    600: $ms-purple-600,\n    700: $ms-purple-700\n);\n\n\n\n/// @group Orchid\n/// @type Color\n$ms-orchid-100: #dea2ed;\n\n/// @group Orchid\n/// @type Color\n$ms-orchid-200: #b146c2;\n\n/// @group Orchid\n/// @type Color\n$ms-orchid-300: #881798;\n\n/// @group Orchid\n/// @type Color\n$ms-orchid-400: #721481;\n\n/// @group Orchid\n/// @type Color\n$ms-orchid-500: #5c126b;\n\n/// @group Orchid\n/// @type Color\n$ms-orchid-600: #460f54;\n\n/// Custom violet-red shade (Not officially apart of Microsoft's color palette)\n/// @group Orchid\n/// @type Color\n$ms-orchid-700: darken($ms-orchid-600, 10%);\n\n/// @group Orchid\n/// @type Map\n/// @example\n///     $flower: map-get($ms-orchid, 400);\n///     // (Same as $ms-orchid-400)\n$ms-orchid: (\n    100: $ms-orchid-100,\n    200: $ms-orchid-200,\n    300: $ms-orchid-300,\n    400: $ms-orchid-400,\n    500: $ms-orchid-500,\n    600: $ms-orchid-600,\n    700: $ms-orchid-700\n);\n\n\n\n/// @group Magenta\n/// @type Color\n$ms-magenta-100: #de94e0;\n\n/// @group Magenta\n/// @type Color\n$ms-magenta-200: #c239b3;\n\n/// @group Magenta\n/// @type Color\n$ms-magenta-300: #b4009e;\n\n/// @group Magenta\n/// @type Color\n$ms-magenta-400: #9a0089;\n\n/// @group Magenta\n/// @type Color\n$ms-magenta-500: #800074;\n\n/// @group Magenta\n/// @type Color\n$ms-magenta-600: #5c005c;\n\n/// Custom violet-red shade (Not officially apart of Microsoft's color palette)\n/// @group Magenta\n/// @type Color\n$ms-magenta-700: darken($ms-magenta-600, 10%);\n\n/// @group Orchid\n/// @type Map\n/// @example\n///     $not-pink: map-get($ms-magenta, 400);\n///     // (Same as $ms-magenta-400)\n$ms-magenta: (\n    100: $ms-magenta-100,\n    200: $ms-magenta-200,\n    300: $ms-magenta-300,\n    400: $ms-magenta-400,\n    500: $ms-magenta-500,\n    600: $ms-magenta-600,\n    700: $ms-magenta-700\n);\n\n\n\n/// @group Pink\n/// @type Color\n$ms-pink-100: #e8a3de;\n\n/// @group Pink\n/// @type Color\n$ms-pink-200: #e43ba6;\n\n/// @group Pink\n/// @type Color\n$ms-pink-300: #e3008c;\n\n/// @group Pink\n/// @type Color\n$ms-pink-400: #bf0077;\n\n/// @group Pink\n/// @type Color\n$ms-pink-500: #9b0062;\n\n/// @group Pink\n/// @type Color\n$ms-pink-600: #77004d;\n\n/// Custom pink shade (Not officially apart of Microsoft's color palette)\n/// @group Pink\n/// @type Color\n$ms-pink-700: darken($ms-pink-600, 10%);\n\n/// @group Pink\n/// @type Map\n/// @example\n///     $panther: map-get($ms-pink, 400);\n///     // (Same as $ms-pink-400)\n$ms-pink: (\n    100: $ms-pink-100,\n    200: $ms-pink-200,\n    300: $ms-pink-300,\n    400: $ms-pink-400,\n    500: $ms-pink-500,\n    600: $ms-pink-600,\n    700: $ms-pink-700\n);\n\n\n\n/// @group Fuchsia\n/// @type Color\n$ms-fuchsia-100: #edbed3;\n\n/// @group Fuchsia\n/// @type Color\n$ms-fuchsia-200: #ee3f86;\n\n/// @group Fuchsia\n/// @type Color\n$ms-fuchsia-300: #ea005e;\n\n/// @group Fuchsia\n/// @type Color\n$ms-fuchsia-400: #c30052;\n\n/// @group Fuchsia\n/// @type Color\n$ms-fuchsia-500: #970044;\n\n/// @group Fuchsia\n/// @type Color\n$ms-fuchsia-600: #6b0036;\n\n/// Custom fuchsia shade (Not officially apart of Microsoft's color palette)\n/// @group Fuchsia\n/// @type Color\n$ms-fuchsia-700: darken($ms-fuchsia-600, 10%);\n\n/// @group Fuchsia\n/// @type Map\n/// @example\n///     $fuchsia: map-get($ms-fuchsia, 400);\n///     // (Same as $ms-fuchsia-400)\n$ms-fuchsia: (\n    100: $ms-fuchsia-100,\n    200: $ms-fuchsia-200,\n    300: $ms-fuchsia-300,\n    400: $ms-fuchsia-400,\n    500: $ms-fuchsia-500,\n    600: $ms-fuchsia-600,\n    700: $ms-fuchsia-700\n);\n\n/// @group Crimson\n/// @type Color\n$ms-crimson-100: #ffc0c0;\n\n/// @group Crimson\n/// @type Color\n$ms-crimson-200: #ff8c8c;\n\n/// @group Crimson\n/// @type Color\n$ms-crimson-300: #ff6767;\n\n/// @group Crimson\n/// @type Color\n$ms-crimson-400: #ff4343;\n\n/// @group Crimson\n/// @type Color\n$ms-crimson-500: #d13438;\n\n/// @group Crimson\n/// @type Color\n$ms-crimson-600: #a4262c;\n\n/// @group Crimson\n/// @type Color\n$ms-crimson-700: #761721;\n\n/// @group Crimson\n/// @type Map\n/// @example\n///     $tide: map-get($ms-crimson, 400);\n///     // (Same as $ms-crimson-400)\n$ms-crimson: (\n    100: $ms-crimson-100,\n    200: $ms-crimson-200,\n    300: $ms-crimson-300,\n    400: $ms-crimson-400,\n    500: $ms-crimson-500,\n    600: $ms-crimson-600,\n    700: $ms-crimson-700\n);\n\n\n\n/// @group Brown\n/// @type Color\n$ms-brown-100: #f7d7c4;\n\n/// @group Brown\n/// @type Color\n$ms-brown-200: #d8b094;\n\n/// @group Brown\n/// @type Color\n$ms-brown-300: #bb9167;\n\n/// @group Brown\n/// @type Color\n$ms-brown-400: #ac744c;\n\n/// @group Brown\n/// @type Color\n$ms-brown-500: #8e562e;\n\n/// @group Brown\n/// @type Color\n$ms-brown-600: #603d30;\n\n/// @group Brown\n/// @type Color\n$ms-brown-700: #4d291c;\n\n/// @group Brown\n/// @type Map\n/// @example\n///     $brown: map-get($ms-brown, 400);\n///     // (Same as $ms-brown-400)\n$ms-brown: (\n    100: $ms-brown-100,\n    200: $ms-brown-200,\n    300: $ms-brown-300,\n    400: $ms-brown-400,\n    500: $ms-brown-500,\n    600: $ms-brown-600,\n    700: $ms-brown-700\n);\n\n\n\n/// @group Sage\n/// @type Color\n$ms-sage-100: #cae0d9;\n\n/// @group Sage\n/// @type Color\n$ms-sage-200: #a3bfb7;\n\n/// @group Sage\n/// @type Color\n$ms-sage-300: #7d9d95;\n\n/// @group Sage\n/// @type Color\n$ms-sage-400: #567c73;\n\n/// @group Sage\n/// @type Color\n$ms-sage-500: #486860;\n\n/// @group Sage\n/// @type Color\n$ms-sage-600: #3b534d;\n\n/// @group Sage\n/// @type Color\n$ms-sage-700: #2d3f3a;\n\n/// @group Sage\n/// @type Map\n/// @example\n///     $wisdom: map-get($ms-sage, 400);\n///     // (Same as $ms-sage-400)\n$ms-sage: (\n    100: $ms-sage-100,\n    200: $ms-sage-200,\n    300: $ms-sage-300,\n    400: $ms-sage-400,\n    500: $ms-sage-500,\n    600: $ms-sage-600,\n    700: $ms-sage-700\n);\n\n\n\n/// @group Slate\n/// @type Color\n$ms-slate-100: #bac8cc;\n\n/// @group Slate\n/// @type Color\n$ms-slate-200: #a0aeb2;\n\n/// @group Slate\n/// @type Color\n$ms-slate-300: #859599;\n\n/// @group Slate\n/// @type Color\n$ms-slate-400: #69797e;\n\n/// @group Slate\n/// @type Color\n$ms-slate-500: #5a686c;\n\n/// @group Slate\n/// @type Color\n$ms-slate-600: #4a5459;\n\n/// @group Slate\n/// @type Color\n$ms-slate-700: #394146;\n\n/// @group Slate\n/// @type Map\n/// @example\n///     $tabula-rasa: map-get($ms-slate, 400);\n///     // (Same as $ms-slate-400)\n$ms-slate: (\n    100: $ms-slate-100,\n    200: $ms-slate-200,\n    300: $ms-slate-300,\n    400: $ms-slate-400,\n    500: $ms-slate-500,\n    600: $ms-slate-600,\n    700: $ms-slate-700\n);\n\n\n\n/// @group Gray\n/// @type Color\n$ms-gray-100: #cbc6c4;\n\n/// @group Gray\n/// @type Color\n$ms-gray-200: #b1adab;\n\n/// @group Gray\n/// @type Color\n$ms-gray-300: #989391;\n\n/// @group Gray\n/// @type Color\n$ms-gray-400: #7a7574;\n\n/// @group Gray\n/// @type Color\n$ms-gray-500: #6e6a68;\n\n/// @group Gray\n/// @type Color\n$ms-gray-600: #5d5a58;\n\n/// @group Gray\n/// @type Color\n$ms-gray-700: #4c4a48;\n\n/// @group Gray\n/// @type Map\n/// @example\n///     $gray: map-get($ms-gray, 400);\n///     // (Same as $ms-gray-400)\n$ms-gray: (\n    100: $ms-gray-100,\n    200: $ms-gray-200,\n    300: $ms-gray-300,\n    400: $ms-gray-400,\n    500: $ms-gray-500,\n    600: $ms-gray-600,\n    700: $ms-gray-700\n);\n\n\n\n/// @group Black\n/// @type Color\n$ms-black-100: #f5f5f5;\n\n/// @group Black\n/// @type Color\n$ms-black-200: #e6e6e6;\n\n/// @group Black\n/// @type Color\n$ms-black-300: #ccc;\n\n/// @group Black\n/// @type Color\n$ms-black-400: #767676;\n\n/// @group Black\n/// @type Color\n$ms-black-500: #393939;\n\n/// @group Black\n/// @type Color\n$ms-black-600: #2b2b2b;\n\n/// @group Black\n/// @type Color\n$ms-black-700: #1f1f1f;\n\n/// @group Gray\n/// @type Map\n/// @example\n///     $gray: map-get($ms-gray, 400);\n///     // (Same as $ms-gray-400)\n$ms-black: (\n    100: $ms-black-100,\n    200: $ms-black-200,\n    300: $ms-black-300,\n    400: $ms-black-400,\n    500: $ms-black-500,\n    600: $ms-black-600,\n    700: $ms-black-700\n);\n\n\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-crimson-500\n$ms-assertive: $ms-crimson-500 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-red-400\n$ms-danger: $ms-red-400 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-fuchsia-300\n$ms-beacon: $ms-fuchsia-300 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-amber-400\n$ms-exciting: $ms-amber-400 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-yellow-300\n$ms-cheerful: $ms-yellow-300 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-yellow-400\n$ms-highlight: $ms-yellow-400 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-lime-300\n$ms-energized: $ms-lime-300 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-lime-400\n$ms-growth: $ms-lime-400 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-mint-400\n$ms-positive: $ms-mint-400 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-navy-400\n$ms-sturdy: $ms-navy-400 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-sky-400\n$ms-calm: $ms-sky-400 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-violet-300\n$ms-balanced: $ms-violet-300 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-black-100\n$ms-light: $ms-black-100 !default;\n\n/// @group Contextual Colors\n/// @type Color\n/// @see ms-black-200\n$ms-stable: $ms-black-200 !default;\n\n\n\n/// Windows 10 UAC notice color\n/// @group UI Colors\n/// @type Color\n$ms-info: #65b7f0;\n\n/// Windows 10 UAC admin notice color\n/// @group UI Colors\n/// @type Color\n$ms-warn: #ffd64d;\n\n\n\n/// Light theme button background color\n/// @group Light UI Colors\n/// @type Color\n/// @see ms-black-300\n$ms-ui-light-btn: $ms-black-300;\n\n/// Light theme app bar background color\n/// @group Light UI Colors\n/// @type Color\n/// @see ms-black-200\n$ms-ui-light-appbar: $ms-black-200;\n\n/// Light theme navigation bar background color\n/// @group Light UI Colors\n/// @type Color\n/// @see ms-black-100\n$ms-ui-light-navbar: $ms-black-100;\n\n/// Light theme background color\n/// @group Light UI Colors\n/// @type Color\n$ms-ui-light-background: #fff;\n\n\n\n/// Dark theme button background color\n/// @group Dark UI Colors\n/// @type Color\n/// @see ms-black-600\n$ms-ui-dark-btn: $ms-black-600;\n\n/// Dark theme app bar background color\n/// @group Dark UI Colors\n/// @type Color\n/// @see ms-black-700\n$ms-ui-dark-appbar: $ms-black-700;\n\n/// Dark theme navigation bar background color\n/// @group Dark UI Colors\n/// @type Color\n$ms-ui-dark-navbar: #171717;\n\n/// Dark theme background color\n/// @group Dark UI Colors\n/// @type Color\n$ms-ui-dark-background: #000;\n\n\n/// Outlook\n/// @group Office & App Colors\n/// @type Color\n/// @see ms-sky-400\n$ms-outlook: $ms-sky-400;\n\n/// Calendar\n/// @group Office & App Colors\n/// @type Color\n$ms-calendar: #5133ab;\n\n/// OneDrive\n/// @group Office & App Colors\n/// @type Color\n$ms-onedrive: #094ab2;\n\n/// Office / Office 365\n/// @group Office & App Colors\n/// @type Color\n$ms-office: #d83b01;\n\n/// Word\n/// @group Office & App Colors\n/// @type Color\n$ms-word: #2b579a;\n\n/// Excel\n/// @group Office & App Colors\n/// @type Color\n$ms-excel: #217346;\n\n/// PowerPoint\n/// @group Office & App Colors\n/// @type Color\n$ms-powerpoint: #d24726;\n\n/// OneNote\n/// @group Office & App Colors\n/// @type Color\n$ms-onenote: #80397b;\n\n/// Sway\n/// @group Office & App Colors\n/// @type Color\n/// @see ms-teal-600\n$ms-sway: $ms-teal-600;\n\n/// Skype\n/// @group Office & App Colors\n/// @type Color\n$ms-skype: #00aff0;\n\n/// Bing\n/// @group Office & App Colors\n/// @type Color\n$ms-bing: #0c8484;\n\n/// MSN\n/// @group Office & App Colors\n/// @type Color\n$ms-msn: #1e1e1e;\n\n\n\n\n/// @group Skype Status Colors\n/// @type Color\n$ms-status-available: #5dd255;\n\n/// @group Skype Status Colors\n/// @type Color\n$ms-status-away: #ffd200;\n\n/// @group Skype Status Colors\n/// @type Color\n$ms-status-busy: #c72d25;\n\n/// @group Skype Status Colors\n/// @type Color\n$ms-status-invisible: #b6cfd8;\n\n\n\n/// @group Microsoft Logo Colors\n/// @type Color\n$ms-logo-red: #f25022;\n\n/// @group Microsoft Logo Colors\n/// @type Color\n$ms-logo-green: #7fba00;\n\n/// @group Microsoft Logo Colors\n/// @type Color\n$ms-logo-blue: #00a4ef;\n\n/// @group Microsoft Logo Colors\n/// @type Color\n/// @see ms-gold-400\n$ms-logo-yellow: $ms-gold-400;\n\n\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-yellow: #e88c10;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-orange: #eb4910;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-red: #e31123;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-brick: #a21025;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-pink: #ed5588;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-magenta: #bf1077;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-lavender: #b144c0;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-purple: #744da9;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-blue: #1073d6;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-navy: #193e91;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-sky: #1081ca;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-slate: #677488;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-sage: #108272;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-forrest: #148282;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-lime: #54a81b;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-camo: #547a72;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-tan: #7e715c;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-brown: #724f2f;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-green: #107c10;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-gray: #737373;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Color\n$ms-xbox-dark: #4c4a4b;\n\n/// @group Xbox Colors\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color#xbox-accent-colors Xbox accent colors in Windows Dev Center\n/// @type Map\n/// @example\n///     $accent: map-get($ms-xbox, yellow);\n///     // (Same as $ms-xbox-yellow)\n$ms-xbox: (\n    yellow: $ms-xbox-yellow,\n    orange: $ms-xbox-orange,\n    red: $ms-xbox-red,\n    brick: $ms-xbox-brick,\n    pink: $ms-xbox-pink,\n    magenta: $ms-xbox-magenta,\n    lavender: $ms-xbox-lavender,\n    purple: $ms-xbox-purple,\n    blue: $ms-xbox-blue,\n    navy: $ms-xbox-navy,\n    sky: $ms-xbox-sky,\n    slate: $ms-xbox-slate,\n    sage: $ms-xbox-sage,\n    forrest: $ms-xbox-forrest,\n    lime: $ms-xbox-lime,\n    camo: $ms-xbox-camo,\n    tan: $ms-xbox-tan,\n    brown: $ms-xbox-brown,\n    green: $ms-xbox-green,\n    gray: $ms-xbox-gray,\n    dark: $ms-xbox-dark\n);\n\n\n\n/// Windows 10 toast notification background color\n/// @group Windows 10 Colors\n/// @type Color\n$ms-win-toast: #464646;\n\n/// Windows 10 toast notification border color\n/// @group Windows 10 Colors\n/// @type Color\n$ms-win-toast-border: #404040;\n\n/// @group Windows 10 Colors\n/// @type Map\n/// @link https://msdn.microsoft.com/en-us/windows/uwp/style/color\n/// @todo Create Windows 10 color map, similar to `$ms-xbox`. Add more Windows 10 colors.\n$ms-win: ();\n\n\n\n/// @group Zune\n/// @type Color\n$ms-zune-pink: #f10da2;\n\n/// @group Zune\n/// @type Color\n$ms-zune-orange: #fd5d11;\n\n/// @group Zune\n/// @type Color\n$ms-zune-blue: #1370bb;\n\n/// Background color used in Zune app's default skin\n/// @group Zune\n/// @type Color\n$ms-zune-light: #fdfdfd;\n\n/// Dark background used in Zune's _Quickplay_ tab.\n/// @group Zune\n/// @type Color\n$ms-zune-dark: #11090f;\n\n/// @group Zune\n/// @type Color\n$ms-zune-text: #e9e9e9;\n\n/// @group Zune\n/// @type Color\n$ms-zune-muted: #828689;\n\n/// Zune logo gradient\n/// @group Zune\n/// @type String\n/// @link http://colorzilla.com/gradient-editor/#e95216+0,f10da2+100 Get CSS gradient vendor prefixes for `$ms-zune-gradient`\n/// @example\n///     .zune {\n///         background-image: $ms-zune-gradient;\n///     }\n$ms-zune-gradient: linear-gradient(to bottom, $ms-zune-pink 0%, $ms-zune-orange 100%);\n\n/// Zune HD gradient\n/// @group Zune\n/// @type String\n/// @link http://colorzilla.com/gradient-editor/#e95216+2,e95216+2,f10da2+50,1370bb+98 Get CSS gradient vendor prefixes for `$ms-zune-hd-gradient`\n/// @example\n///     .zune-hd {\n///         background-image: $ms-zune-hd-gradient;\n///     }\n$ms-zune-hd-gradient: linear-gradient(135deg, $ms-zune-orange 2%, $ms-zune-blue 50%, $ms-zune-orange 98%);\n\n/// Subtle gradient seen in background of Zune dialogs\n/// @group Zune\n/// @type String\n/// @link http://colorzilla.com/gradient-editor/#e95216+2,e95216+2,f10da2+50,1370bb+98 Get CSS gradient vendor prefixes for `$ms-zune-hd-gradient`\n/// @example\n///     .zune-hd {\n///         background-image: $ms-zune-hd-gradient;\n///     }\n$ms-zune-background-gradient: linear-gradient(135deg, #200319 0%, #21303a 60%, #07192a 100%); // scss-lint:disable ColorVariable\n\n/// @group Zune\n/// @type Map\n/// @link\n/// @example\n///     $cute-zune: map-get($ms-zune, pink);\n///     // (Same as $ms-zune-pink)\n$ms-zune: (\n    pink: $ms-zune-pink,\n    orange: $ms-zune-orange,\n    blue: $ms-zune-blue,\n    light: $ms-zune-light,\n    dark: $ms-zune-dark,\n    text: $ms-zune-text,\n    muted: $ms-zune-muted\n);\n\n\n\n/// Excel's \"Good\" cell color\n/// @group Excel\n/// @type Color\n$ms-excel-good: #c6efce;\n\n/// Excel's \"Bad\" cell color\n/// @group Excel\n/// @type Color\n$ms-excel-bad: #ffc7ce;\n\n/// Excel's \"Neutral\" cell color\n/// @group Excel\n/// @type Color\n$ms-excel-neutral: #ffeb9c;\n\n/// Excel's \"Note\" cell color\n/// @group Excel\n/// @type Color\n$ms-excel-note: #ffc;\n\n/// Excel's \"Check Cell\" cell color\n/// @group Excel\n/// @type Color\n$ms-excel-check: #a5a5a5;\n\n/// @group Excel\n/// @type Color\n$ms-excel-accent-cyan: #4bacc6;\n\n/// @group Excel\n/// @type Color\n$ms-excel-accent-blue: #4f81bd;\n\n/// @group Excel\n/// @type Color\n$ms-excel-accent-purple: #8064a2;\n\n/// @group Excel\n/// @type Color\n$ms-excel-accent-red: #c0504d;\n\n/// @group Excel\n/// @type Color\n$ms-excel-accent-orange: #f79646;\n\n/// @group Excel\n/// @type Color\n$ms-excel-accent-green: #9bbb59;\n\n\n\n// By Jason Gardner\n// https://github.com/jasonjgardner/microsoft-scss-colors"
  },
  {
    "path": "docs/_sass/settings/_settings.global.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/*------------------------------------*\\\n  #GLOBAL SETTINGS\n\\*------------------------------------*/\n\n\n// Spacing aliases\n\n$spacing:       $inuit-global-spacing-unit;\n$spacing-tiny:  $inuit-global-spacing-unit-tiny;\n$spacing-small: $inuit-global-spacing-unit-small;\n$spacing-large: $inuit-global-spacing-unit-large;\n$spacing-huge:  $inuit-global-spacing-unit-huge;"
  },
  {
    "path": "docs/app/css/sanddance-app-site.css",
    "content": "html,\nbody {\n    height: 100%;\n    margin: 0;\n}\n\nbody {\n    display: grid;\n    font-family: 'Segoe UI', sans-serif;\n    grid-template-rows: auto 0fr;\n}\nselect,\nbutton,\ninput {\n    font-family: 'Segoe UI', sans-serif;\n}\n\nheader {\n    border-bottom: 1px solid #ccc;\n    font-size: smaller;\n    padding: 5px 1em;\n}\n\nfooter {\n    border-top: 1px solid #ccc;\n    font-size: smaller;\n    padding: 5px 1em;\n}\n"
  },
  {
    "path": "docs/app/css/sanddance-app.css",
    "content": ".sanddance-app-static-content {\n  display: none;\n}\n\n.sanddance-app {\n  display: grid;\n  grid-template-rows: 100% 0;\n  height: 100%;\n}\n\n.sanddance-export .ms-Button {\n  margin-bottom: 1em;\n  margin-top: 0.5em;\n}\n\n.sanddance-datasource-picker {\n  width: 100%;\n}\n\n.sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%;\n}\n\n.sanddance-gl {\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%);\n}\n\n.sanddance-gl canvas {\n  outline: none;\n}\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em;\n}\n\n.sanddance-legend table {\n  border-collapse: collapse;\n}\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em;\n}\n\n.sanddance-legend .legend-row {\n  cursor: pointer;\n}\n\n.sanddance-legend .legend-row td {\n  padding: 2px;\n}\n\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef;\n}\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px;\n}\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n.sanddance-details {\n  font-size: smaller;\n}\n\n.sanddance-details-scroll {\n  padding-bottom: 1em;\n}\n\n.sanddance-tooltip {\n  z-index: 1;\n}\n\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute;\n}\n\n.sanddance-tooltip td {\n  max-width: 16em;\n  overflow: hidden;\n  text-align: left;\n  text-overflow: ellipsis;\n  vertical-align: top;\n  width: 75%;\n}\n\n.sanddance-tooltip td:first-child {\n  width: 25%;\n}\n\n.sanddance-scheme.disabled {\n  filter: grayscale(95%);\n}\n\n.sanddance-scheme.option {\n  display: grid;\n  grid-template-columns: 10em auto;\n  width: 100%;\n}\n\n.sanddance-scheme.title {\n  justify-content: flex-start;\n}\n\n.sanddance-scheme span {\n  align-self: center;\n}\n\n.sanddance-scheme svg, .sanddance-scheme .swatch {\n  align-self: center;\n  border: thin solid #777;\n  height: 24px;\n}\n\n.sanddance-scheme svg {\n  width: 100%;\n}\n\n.sanddance-scheme .swatch div {\n  display: inline-block;\n  width: 10px;\n  height: 24px;\n}\n\n.sanddance-explorer-topbar {\n  background-color: #fff;\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: 300px auto;\n  height: 36px;\n}\n\n.sanddance-explorer-topbar .logo {\n  color: rgb(0, 120, 212);\n  display: grid;\n  grid-template-columns: 50px auto;\n  padding: 6px 0;\n}\n\n.sanddance-explorer-topbar .logo svg {\n  fill: rgb(0, 120, 212);\n  height: 24px;\n  margin: 0 auto;\n  width: 24px;\n}\n\n.sanddance-explorer-topbar .logo a {\n  color: inherit;\n  font-size: 14px;\n  font-weight: bold;\n  line-height: 24px;\n  text-decoration: none;\n}\n\n.sanddance-explorer-commandbar {\n  position: relative;\n}\n\n.sanddance-explorer-commandbar > div {\n  left: 0;\n  position: absolute;\n  right: 0;\n}\n\n.sanddance-explorer-commandbar .ms-CommandBar {\n  height: 36px;\n}\n\n.dark-theme .sanddance-explorer-topbar {\n  background-color: #000;\n}\n\n.dark-theme .sanddance-explorer-topbar .logo {\n  color: #00b4f0;\n}\n\n.sanddance-group {\n  border-top: 1px solid #ccc;\n  padding-bottom: 1.5em;\n  position: relative;\n}\n\n.sanddance-group .group-head {\n  display: grid;\n  grid-template-columns: auto auto;\n  line-height: 16px;\n  margin: 1em 0;\n}\n\n.sanddance-group .group-head label {\n  font-size: 11px;\n  font-weight: 600;\n  letter-spacing: 3px;\n  opacity: 0.8;\n  text-transform: uppercase;\n}\n\n.sanddance-group .group-head .count {\n  color: #333;\n  font-size: 12px;\n  text-align: right;\n}\n\n.sanddance-group .group-icon {\n  position: absolute;\n  top: -1px;\n  right: 0;\n}\n\n.sanddance-group:first-child {\n  border-top: none;\n}\n\n.sanddance-group:first-child .group-head {\n  margin-top: 0;\n}\n\n.sanddance-group:last-child {\n  padding-bottom: 0;\n}\n\n.sanddance-sidebar {\n  background-color: #f9f9f9;\n  display: grid;\n  overflow: hidden;\n  position: relative;\n  transition: width 350ms cubic-bezier(0.4, 0, 0.2, 1);\n  width: 300px;\n}\n\n.sanddance-sidebar:not(.pinned) {\n  bottom: 0;\n  position: absolute;\n  top: 0;\n}\n\n.sanddance-sidebar .sidebar-content {\n  background-color: inherit;\n  display: grid;\n  grid-template-areas: \"stats stats\" \"tabs bar\";\n  grid-template-columns: 50px auto;\n  grid-template-rows: 0fr auto;\n  height: 100%;\n  overflow: hidden;\n  position: absolute;\n  z-index: 1;\n}\n\n.sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.1);\n  display: grid;\n  grid-area: tabs;\n  grid-template-rows: auto 0fr;\n  position: relative;\n}\n\n.sanddance-sidebar .vbutton {\n  align-self: center;\n  display: grid;\n  height: 60px;\n}\n\n.sanddance-sidebar .vbutton.selected {\n  background-color: #f9f9f9;\n}\n\n.sanddance-sidebar .vbutton button {\n  height: 100%;\n  width: 100%;\n}\n\n.sanddance-sidebar .vbutton button .ms-Button-icon {\n  font-size: 20px;\n}\n\n.sanddance-sidebar .sidebar-dialogs .vbutton {\n  height: 16.6666666667%;\n  max-height: 60px;\n  min-height: 32px;\n}\n\n.sanddance-sidebar .scrollable-container {\n  width: 250px;\n}\n\n.sanddance-sidebar .sidetab {\n  grid-area: bar;\n  padding: 12px;\n}\n\n.sanddance-sidebar.closed {\n  width: 50px;\n}\n\n.sanddance-sidebar.calculator .calculating {\n  background: rgba(249, 249, 249, 0.5);\n  height: 100%;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.sanddance-sidebar.calculator .ms-Spinner {\n  margin-top: -16px;\n  position: relative;\n  top: 50%;\n}\n\n.dark-theme .sanddance-sidebar {\n  background-color: #272727;\n  color: #fff;\n}\n\n.dark-theme .sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n\n.dark-theme .sanddance-sidebar .vbutton.selected {\n  background-color: #272727;\n}\n\n.dark-theme .sanddance-sidebar.calculator .calculating {\n  background: rgba(39, 39, 39, 0.5);\n}\n\n.sanddance-chart-type .ms-ChoiceFieldGroup-flexContainer {\n  display: grid;\n  grid-template-columns: repeat(2, 50%);\n  grid-auto-flow: column;\n  grid-template-rows: repeat(4, auto);\n}\n\n.sanddance-datascope {\n  grid-area: stats;\n  background-color: rgba(0, 0, 0, 0.05);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n  min-height: 5em;\n}\n\n.sanddance-datascope.extended > div {\n  margin: 12px;\n  width: 276px;\n}\n\n.sanddance-datascope label {\n  display: block;\n  font-size: 10px;\n  text-transform: uppercase;\n}\n\n.sanddance-datascope.compact {\n  align-self: center;\n  cursor: pointer;\n  display: grid;\n  text-align: center;\n  width: 50px;\n}\n\n.sanddance-datascope.compact > div {\n  align-self: center;\n}\n\n.sanddance-datascope .datascope-button {\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  box-sizing: border-box;\n  height: 36px;\n  min-width: unset;\n  width: 33.333%;\n}\n\n.sanddance-datascope .datascope-button:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-datascope .datascope-button label {\n  cursor: inherit;\n}\n\n.sanddance-datascope.active .datascope-button.selected {\n  border-color: rgb(0, 120, 212);\n}\n\n.dark-theme .sanddance-datascope {\n  background-color: rgba(0, 0, 0, 0.3);\n  border-bottom-color: rgba(255, 255, 255, 0.1);\n}\n\n.dark-theme .sanddance-datascope .datascope-button {\n  background-color: #000;\n  border-color: rgba(255, 255, 255, 0.2);\n  color: #fff;\n}\n\n.dark-theme .sanddance-datascope .datascope-button:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-dataItem {\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n\n.sanddance-dataItem .name-value {\n  border-top: 1px solid #ddd;\n  cursor: pointer;\n  padding: 4px;\n  position: relative;\n  word-break: break-all;\n}\n\n.sanddance-dataItem .name-value:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-dataItem .name-value:first-child {\n  border-top: none;\n}\n\n.sanddance-dataItem .column-name {\n  font-weight: 500;\n}\n\n.sanddance-dataItem .column-value {\n  max-height: 20em;\n  overflow: auto;\n}\n\n.sanddance-dataItem .bing-search {\n  text-align: right;\n}\n\n.dark-theme .sanddance-dataItem {\n  background-color: #000;\n  border-color: #222;\n}\n\n.dark-theme .sanddance-dataItem .name-value {\n  border-top-color: #222;\n}\n\n.dark-theme .sanddance-dataItem a {\n  color: #00b4f0;\n}\n\n.sanddance-dataIndex .index {\n  display: grid;\n  grid-template-columns: 32px auto 32px;\n  line-height: 32px;\n  margin: 0px -8px 6px -8px;\n  text-align: center;\n}\n\n.sanddance-dataIndex .item-filtered {\n  background-color: rgba(0, 0, 0, 0.1);\n  font-size: 10px;\n  padding: 2px 4px;\n  text-transform: uppercase;\n}\n\n.sanddance-dataIndex .ms-Dropdown-container {\n  margin-bottom: 0.5em;\n}\n\n.sanddance-dataIndex button {\n  margin-top: 1em;\n}\n\n.scrollable-container {\n  display: grid;\n  min-height: 200px;\n  position: relative;\n}\n\n.scrollable {\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  right: 0;\n  overflow-y: auto;\n  top: 0;\n}\n\n.sanddance-search .sanddance-search-group {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n}\n\n.sanddance-search .sanddance-search-group {\n  background: #fff;\n  margin-top: 1em;\n  padding: 4px;\n}\n\n.sanddance-search .sanddance-search-group:first-child {\n  margin-top: 0;\n}\n\n.sanddance-search .sanddance-search-expression {\n  background-color: rgba(0, 0, 0, 0.1);\n  margin: 12px 4px;\n  padding: 4px 8px 8px 8px;\n}\n\n.sanddance-search .search-action {\n  width: 100%;\n}\n\n.sanddance-search .search-bottom-action {\n  margin-top: 1em;\n}\n\n.sanddance-search .search-field {\n  margin-top: 4px;\n}\n\n.dark-theme .sanddance-search .sanddance-search-group {\n  border-color: rgba(255, 255, 255, 0.2);\n  background: #000;\n}\n\n.dark-theme .sanddance-search .sanddance-search-expression {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-snapshots .ms-Button {\n  margin-bottom: 0.5em;\n}\n\n.sanddance-snapshots .snapshot {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  cursor: pointer;\n  margin-bottom: 0.5em;\n  padding: 5px;\n}\n\n.sanddance-snapshots .snapshot.selected {\n  border-color: rgba(0, 0, 0, 0.6);\n  border-width: 2px;\n  padding: 4px;\n}\n\n.sanddance-snapshots .snapshot:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\n.sanddance-snapshots .snapshot:first-child {\n  margin-top: 0.5em;\n}\n\n.sanddance-snapshots .title {\n  font-weight: 500;\n  word-break: break-word;\n}\n\n.sanddance-snapshots .description {\n  font-weight: 100;\n  word-break: break-word;\n}\n\n.sanddance-snapshots .thumbnail {\n  display: grid;\n  height: 160px;\n  margin-top: 0.5em;\n}\n\n.sanddance-snapshots img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n\n.sanddance-snapshots .actions {\n  display: grid;\n  grid-auto-flow: column;\n}\n\n.sanddance-snapshots .actions a, .sanddance-snapshots .actions span {\n  align-self: center;\n  text-align: center;\n}\n\n.sanddance-snapshots .actions button {\n  width: 100%;\n}\n\n.sanddance-snapshot-dialog .thumbnail {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  display: grid;\n  height: 300px;\n  margin-top: 1em;\n}\n\n.sanddance-snapshot-dialog img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n\n.dark-theme .sanddance-snapshots .snapshot {\n  background-color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n\n.dark-theme .sanddance-snapshots .snapshot.selected {\n  border-color: rgba(255, 255, 255, 0.6);\n}\n\n.dark-theme .sanddance-snapshots .snapshot:hover {\n  background-color: rgb(0, 0, 0);\n}\n\n.dark-theme .sanddance-snapshots .actions a {\n  color: #fff;\n}\n\n.dark-theme.sanddance-snapshot-dialog .thumbnail {\n  border-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-history ol {\n  padding-left: 20px;\n}\n\n.sanddance-history li {\n  border: 1px solid transparent;\n  cursor: pointer;\n}\n\n.sanddance-history li.selected {\n  font-weight: bold;\n}\n\n.sanddance-history-button {\n  background: none;\n  border: 0;\n  font-size: inherit;\n  font-style: inherit;\n  font-weight: inherit;\n  height: unset;\n  padding: 3px 4px;\n  text-align: left;\n  width: 100%;\n}\n\n.sanddance-history-button .ms-Button-label {\n  display: inline;\n  font-weight: inherit;\n  margin: 0;\n}\n\n.sanddance-note {\n  background-color: #fffacd;\n  border: 1px solid #333;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  color: #333;\n  margin: 1em;\n  padding: 20px;\n  position: absolute;\n  width: 15em;\n  word-break: break-word;\n}\n\n.sanddance-note .cancel {\n  position: absolute;\n  right: -1px;\n  top: -1px;\n}\n\n.sanddance-note .cancel i {\n  color: #333;\n}\n\n.sanddance-columnMap {\n  position: relative;\n}\n\n.sanddance-columnMap .ms-Dropdown-container {\n  margin-top: 10px;\n}\n\n.sanddance-columnMap .column-options {\n  bottom: 3px;\n  position: absolute;\n  right: 0;\n}\n\n.sanddance-columnMap-absolute {\n  margin-bottom: 1em;\n  margin-left: -4em;\n  margin-right: 1em;\n  margin-top: -1em;\n}\n\n.sanddance-columnMap-absolute .ms-Dropdown-container {\n  margin-top: 0;\n}\n\n.sanddance-tooltip {\n  z-index: 2;\n}\n\n.sanddance-chart-button {\n  display: block;\n  margin-top: 10px;\n}\n\n.sanddance-columnTypes {\n  max-height: 20em;\n  overflow: scroll;\n}\n\n.sanddance-columnTypes th, .sanddance-columnTypes td {\n  padding: 0 5px;\n}\n\n.sanddance-columnTypes td, .sanddance-columnTypes button {\n  height: 18px;\n}\n\n.sanddance-columnTypes tr.changed {\n  text-decoration: line-through;\n}\n\n.sanddance-dialog ul {\n  margin: 0;\n}\n\n.sanddance-dialog section {\n  margin-top: 1em;\n}\n\n.sanddance-dialog section:first-child {\n  margin-top: 0;\n}\n\n.sanddance-dialog .tip {\n  font-style: italic;\n}\n\n.sanddance-explorer {\n  display: grid;\n  font-family: \"Segoe UI\", sans-serif;\n  font-size: 13px;\n  grid-template-rows: 0fr auto;\n}\n\n.sanddance-explorer.dark-theme {\n  background-color: black;\n}\n\n.sanddance-explorer.dark-theme canvas {\n  background-color: black;\n}\n\n.sanddance-main {\n  display: grid;\n  position: relative;\n  transition: grid-template-columns 350ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.sanddance-main .loading {\n  grid-row-end: span 2;\n  position: relative;\n}\n\n.sanddance-main .loading .ms-Spinner {\n  position: absolute;\n  top: 50%;\n  width: 100%;\n}\n\n.sanddance-main .sanddance-view {\n  display: grid;\n  position: relative;\n  margin-left: 50px;\n}\n\n.sanddance-main .sanddance-layout-unpinned, .sanddance-main .sanddance-layout-pinned {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.sanddance-main.hide-legend .sanddance-layout-unpinned, .sanddance-main.hide-legend .sanddance-layout-pinned {\n  right: 0;\n}\n\n.sanddance-main .sanddance-layout-pinned {\n  left: 300px;\n}\n\n.sanddance-main .sanddance-ReactViewer {\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n}\n\n.sanddance-main.hide-legend .sanddance-ReactViewer {\n  left: 0;\n}\n\n.sanddance-main.show-center .sanddance-layout-unpinned, .sanddance-main.show-center .sanddance-layout-pinned {\n  background: linear-gradient(to right, transparent 49%, rgba(255, 0, 255, 0.2), transparent 51%);\n  background-color: rgba(0, 255, 255, 0.1);\n}\n\n.sanddance-main.pinned {\n  grid-template-columns: 300px auto;\n  grid-template-areas: \"side main\";\n}\n\n.sanddance-main.pinned .sanddance-view {\n  grid-area: main;\n  margin-left: 0;\n}\n\n.sanddance-main.pinned .loading {\n  grid-area: main;\n  grid-row-end: unset;\n}\n\n.sanddance-main.pinned .sanddance-slidePanel {\n  grid-area: side;\n}\n\n.sanddance-main.pinned.closed {\n  grid-template-columns: 0 auto;\n}\n\n.sanddance-main.pinned.closed .sanddance-view {\n  margin-left: 50px;\n}\n\n.sanddance-main span.ms-layer {\n  display: none;\n}\n\n.sanddance-advanced-renderer {\n  height: 36px;\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 40px;\n}\n\n.sanddance-renderer-dialog ul {\n  list-style-type: none;\n  padding-left: 2em;\n}\n\n.sanddance-background-image-dialog {\n  min-width: 32em;\n}\n\n.sanddance-background-image-dialog .thumbnail {\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: auto auto;\n  padding-bottom: 1em;\n}\n\n.sanddance-background-image-dialog .thumbnail > * {\n  align-self: center;\n}\n\n.sanddance-background-image-dialog .thumbnail img {\n  margin-right: 1em;\n  max-height: 160px;\n  max-width: 16em;\n  object-fit: contain;\n}\n\n.sanddance-background-image-dialog .axis-bounds {\n  border-bottom: 1px solid #ccc;\n  padding-bottom: 1em;\n}\n\n.sanddance-background-image-dialog .axis-bound-fields {\n  display: grid;\n  column-gap: 1em;\n  grid-template-columns: auto auto;\n  margin-bottom: 1em;\n}\n\n#sanddance-vega-spec {\n  border: 1px inset;\n  max-height: 20em;\n  overflow: scroll;\n}\n\n.sanddance-panel {\n  top: 5em;\n  bottom: unset;\n  overflow-y: unset;\n  padding-right: 1em;\n  padding-top: 32px;\n}\n\n.sanddance-panel h4,\n.sanddance-panel .sanddance-vegaControls,\n.sanddance-panel .sanddance-unitControls {\n  display: none;\n}\n\n.sanddance-main.hide-legend .sanddance-panel {\n  display: none;\n}\n\n.sanddance-panel-tools {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n\n.sanddance-legend {\n  min-width: 54px;\n}\n\n.sanddance-explanation {\n  font-size: smaller;\n  font-style: italic;\n  margin-bottom: 1em;\n}\n\n.sanddance-explanation .fieldname,\n.sanddance-explanation .fieldtype {\n  font-style: italic;\n}\n\n.sanddance-signal {\n  margin-top: 1em;\n}\n\n.sanddance-legend th {\n  color: #005a9e;\n  cursor: pointer;\n}\n\n.sanddance-legend th:hover {\n  background-color: rgba(43, 136, 216, 0.3333333333);\n}\n\n.sanddance-legend .legend-row:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-form-separate {\n  margin-top: 1em;\n}\n\n.dark-theme .sanddance-dialog a {\n  color: #00b4f0;\n}\n\n.dark-theme .sanddance-panel {\n  background-color: #000;\n  color: #fff;\n}\n\n.dark-theme .sanddance-legend th {\n  color: #3ac5f3;\n}\n\n.dark-theme .sanddance-legend th:hover {\n  color: #009ed3;\n}\n\n\n.sanddance-sidebar .sanddance-datascope {\n  min-height: 7em;\n}\n\n/*# sourceMappingURL=sanddance-app.css.map */\n"
  },
  {
    "path": "docs/app/index.html",
    "content": "---\n---\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/sanddance-app.css\">\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/sanddance-app-site.css?2\">\n    <link rel=\"shortcut icon\" href=\"../favicon.ico\" />\n</head>\n\n<body>\n    <!-- link to JSON files so we can get a url from the bundler -->\n    <a class=\"sanddance-app-static-content\" id=\"demovote\" data-display-name=\"Demo Vote\" data-type=\"tsv\"\n        href=\"../sample-data/demovote.tsv\"></a>\n    <a class=\"sanddance-app-static-content\" id=\"titanic\" data-display-name=\"Titanic\" data-type=\"tsv\"\n        href=\"../sample-data/titanicmaster.tsv\"></a>\n\n    <script>\n        function setTheme(darkTheme) {\n            localStorage.setItem('theme', darkTheme ? 'Dark' : 'Light');\n        }\n        var darkTheme = localStorage.getItem('theme') === 'Dark';\n        var insights = {\n            \"titanic\": {\n                \"columns\": {\n                    \"uid\": \"Name\",\n                    \"x\": \"Gender\",\n                    \"y\": \"Joined\",\n                    \"color\": \"Survived\",\n                    \"z\": \"TicketCost\",\n                    \"sort\": \"Survived\"\n                },\n                \"scheme\": \"dual_redgreen\",\n                \"chart\": \"barchart\",\n                \"view\": \"2d\"\n            },\n            \"demovote\": {\n                \"columns\": {\n                    \"uid\": \"Id\",\n                    \"x\": \"Longitude\",\n                    \"y\": \"Latitude\",\n                    \"color\": \"Obama\",\n                    \"z\": \"Education\",\n                    \"sort\": \"State\"\n                },\n                \"scheme\": \"redblue\",\n                \"chart\": \"scatterplot\",\n                \"view\": \"2d\",\n                \"colorBin\": \"quantize\"\n            }\n        };\n        var options = {\n            \"*\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleColor_BinCountSignal\": 7\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            \"titanic\": {\n                \"chartPrefs\": {\n                    \"barchart\": {\n                        \"color\": {\n                            \"Gender\": {\n                                \"scheme\": \"set2\"\n                            }\n                        }\n                    }\n                }\n            },\n            \"demovote\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"color\": {\n                            \"Winner\": {\n                                \"scheme\": \"dual_bluered\"\n                            }\n                        }\n                    },\n                    \"stacks\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleX_BinsSignal\": 30,\n                                    \"RoleY_BinsSignal\": 30\n                                }\n                            }\n                        }\n                    }\n                },\n                \"tooltipExclusions\": [\"Id\", \"Latitude\", \"Longitude\"]\n            }\n        };\n    </script>\n\n    <main id=\"app\"></main>\n\n    <footer>\n        {% include footer-links.html %}\n    </footer>\n\n    <script src=\"../external/js/react.development.js\" crossorigin=\"\"></script>\n    <script src=\"../external/js/react-dom.development.js\" crossorigin=\"\"></script>\n    <script src=\"js/sanddance-app.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/app/js/sanddance-app.js",
    "content": "(function(global2, factory) {\n  typeof exports === \"object\" && typeof module !== \"undefined\" ? factory(require(\"react\"), require(\"react-dom\")) : typeof define === \"function\" && define.amd ? define([\"react\", \"react-dom\"], factory) : (global2 = typeof globalThis !== \"undefined\" ? globalThis : global2 || self, factory(global2.React, global2.ReactDOM));\n})(this, (function(React, ReactDOM) {\n  \"use strict\";\n  function _interopNamespaceDefault(e) {\n    const n = Object.create(null, { [Symbol.toStringTag]: { value: \"Module\" } });\n    if (e) {\n      for (const k in e) {\n        if (k !== \"default\") {\n          const d2 = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d2.get ? d2 : {\n            enumerable: true,\n            get: () => e[k]\n          });\n        }\n      }\n    }\n    n.default = e;\n    return Object.freeze(n);\n  }\n  const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);\n  const ReactDOM__namespace = /* @__PURE__ */ _interopNamespaceDefault(ReactDOM);\n  const FieldNames = {\n    Active: \"__SandDance__Active\",\n    Collapsed: \"__SandDance__Collapsed\",\n    Contains: \"__SandDance__Contains\",\n    Count: \"__SandDance__Count\",\n    Sum: \"__SandDance__Sum\",\n    SumOfCount: \"__SandDance__CountSum\",\n    SumOfSum: \"__SandDance__SumSum\",\n    Selected: \"__SandDance__Selected\",\n    First: \"__SandDance__First\",\n    Last: \"__SandDance__Last\",\n    Top: \"__SandDance__Top\",\n    TopColor: \"__SandDance__TopColor\",\n    TopIndex: \"__SandDance__TopIndex\",\n    PowerBISelectionId: \"__SandDance__PowerBISelectionId\",\n    FacetSearch: \"__SandDance__FacetSearch\",\n    FacetTitle: \"__SandDance__FacetTitle\",\n    Ordinal: \"__SandDance__Ordinal\",\n    WrapCol: \"__SandDance__WrapCol\",\n    WrapRow: \"__SandDance__WrapRow\",\n    Value: \"__SandDance__Value\",\n    OffsetX: \"__SandDance__X\",\n    OffsetY: \"__SandDance__Y\",\n    OffsetHeight: \"__SandDance__H\",\n    OffsetWidth: \"__SandDance__W\"\n  };\n  const ScaleNames = {\n    Color: \"scale_color\",\n    X: \"scale_x\",\n    Y: \"scale_y\",\n    Z: \"scale_z\"\n  };\n  const SignalNames = {\n    ViewportWidth: \"ViewportWidth\",\n    ViewportHeight: \"ViewportHeight\",\n    MinCellWidth: \"MinCellWidth\",\n    MinCellHeight: \"MinCellHeight\",\n    PlotOffsetLeft: \"PlotOffsetLeft\",\n    PlotOffsetTop: \"PlotOffsetTop\",\n    PlotOffsetBottom: \"PlotOffsetBottom\",\n    PlotOffsetRight: \"PlotOffsetRight\",\n    PlotHeightIn: \"PlotHeightIn\",\n    PlotWidthIn: \"PlotWidthIn\",\n    PlotHeightOut: \"PlotHeightOut\",\n    PlotWidthOut: \"PlotWidthOut\",\n    ColorBinCount: \"RoleColor_BinCountSignal\",\n    ColorReverse: \"RoleColor_ReverseSignal\",\n    FacetAxesAdjustX: \"RoleFacet_AxesAdjustSignalX\",\n    FacetAxesAdjustY: \"RoleFacet_AxesAdjustSignalY\",\n    FacetBins: \"RoleFacet_BinsSignal\",\n    FacetVBins: \"RoleFacetV_BinsSignal\",\n    FacetPaddingTop: \"FacetPaddingTop\",\n    FacetPaddingBottom: \"FacetPaddingBottom\",\n    FacetPaddingLeft: \"FacetPaddingLeft\",\n    MarkOpacity: \"Mark_OpacitySignal\",\n    PointScale: \"Chart_PointScaleSignal\",\n    TextAngleX: \"Text_AngleXSignal\",\n    TextAngleY: \"Text_AngleYSignal\",\n    TextScale: \"Text_ScaleSignal\",\n    TextSize: \"Text_SizeSignal\",\n    TextTitleSize: \"Text_TitleSizeSignal\",\n    TreeMapMethod: \"Chart_TreeMapMethodSignal\",\n    XBins: \"RoleX_BinsSignal\",\n    YBins: \"RoleY_BinsSignal\",\n    ZHeight: \"RoleZ_HeightSignal\",\n    ZGrounded: \"RoleZ_Grounded\",\n    ZProportion: \"RoleZ_ProportionSignal\"\n  };\n  const Other = \"__Other\";\n  const ColorScaleNone = \"none\";\n  const defaultBins = 10;\n  const maxbins = 100;\n  const minBarBandWidth = 15;\n  const minFacetWidth = 140;\n  const minFacetHeight = 180;\n  const facetPaddingLeft = 40;\n  const facetPaddingTop = 40;\n  const facetPaddingBottom = 40;\n  const facetPaddingRight = 40;\n  const axesLabelLimit = 100;\n  const axesTitleLimit = 100;\n  const axesTitlePaddingX = 30;\n  const axesTitlePaddingY = 60;\n  const axesTitlePaddingFacetX = 69;\n  const axesTitlePaddingFacetY = 92;\n  const axesOffsetX = 120;\n  const axesOffsetY = 120;\n  const scatterSizedDiv = 20;\n  const debounce$1 = 250;\n  function allowNoneForSize(specContext) {\n    switch (specContext.insight.totalStyle) {\n      case \"sum-strip\":\n      case \"sum-strip-percent\":\n      case \"sum-treemap\":\n        return false;\n      default:\n        return true;\n    }\n  }\n  function barchartH(specContext) {\n    var _a2, _b2, _c2, _d2;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { language } = specViewOptions;\n    const showAxes = !insight.hideAxes;\n    const bandProps = {\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes\n    };\n    const x2 = { title: null };\n    const axisScales = {\n      x: x2,\n      y: { title: (_a2 = specColumns.y) === null || _a2 === void 0 ? void 0 : _a2.name },\n      z: { title: (_b2 = specColumns.z) === null || _b2 === void 0 ? void 0 : _b2.name }\n    };\n    const layouts = [{\n      layoutType: \"Band\",\n      props: bandProps\n    }];\n    const { totalStyle, view } = insight;\n    if (totalStyle === \"sum-strip-percent\") {\n      x2.aggregate = \"percent\";\n      x2.title = language.percent;\n      const stripProps = {\n        addPercentageScale: true,\n        sortOrder: \"ascending\",\n        orientation: \"horizontal\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes,\n        view\n      };\n      layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n      });\n    } else {\n      const aggProps = {\n        niceScale: true,\n        dock: \"left\",\n        globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n        globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n        sumBy: specColumns.size,\n        showAxes\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props: aggProps\n      });\n      switch (totalStyle) {\n        case \"sum-treemap\": {\n          x2.aggregate = \"sum\";\n          x2.title = language.sum;\n          const treemapProps = {\n            corner: \"top-left\",\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Treemap\",\n            props: treemapProps\n          });\n          break;\n        }\n        case \"sum-strip\": {\n          x2.aggregate = \"sum\";\n          x2.title = language.sum;\n          const stripProps = {\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        case \"count-strip\": {\n          x2.aggregate = \"count\";\n          x2.title = language.count;\n          const stripProps = {\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        default: {\n          x2.aggregate = \"count\";\n          x2.title = language.count;\n          const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: \"down-right\",\n            z: specColumns.z,\n            maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n            maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Square\",\n            props: squareProps\n          });\n          break;\n        }\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: true,\n        percentage: true,\n        roles: [\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_c2 = specColumns.y) === null || _c2 === void 0 ? void 0 : _c2.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_d2 = specColumns.z) === null || _d2 === void 0 ? void 0 : _d2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function barchartV(specContext) {\n    var _a2, _b2;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { language } = specViewOptions;\n    const showAxes = !insight.hideAxes;\n    const bandProps = {\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes\n    };\n    const y2 = { title: null };\n    const axisScales = {\n      x: { title: specColumns.x && specColumns.x.name },\n      y: y2,\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [{\n      layoutType: \"Band\",\n      props: bandProps\n    }];\n    const { totalStyle, view } = insight;\n    if (totalStyle === \"sum-strip-percent\") {\n      y2.aggregate = \"percent\";\n      y2.title = language.percent;\n      const stripProps = {\n        addPercentageScale: true,\n        sortOrder: \"descending\",\n        orientation: \"vertical\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes,\n        view\n      };\n      layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n      });\n    } else {\n      const aggProps = {\n        niceScale: true,\n        dock: \"bottom\",\n        globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n        globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n        sumBy: specColumns.size,\n        showAxes\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props: aggProps\n      });\n      switch (totalStyle) {\n        case \"sum-treemap\": {\n          y2.aggregate = \"sum\";\n          y2.title = language.sum;\n          const treemapProps = {\n            corner: \"bottom-left\",\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Treemap\",\n            props: treemapProps\n          });\n          break;\n        }\n        case \"sum-strip\": {\n          y2.aggregate = \"sum\";\n          y2.title = language.sum;\n          const stripProps = {\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        case \"count-strip\": {\n          y2.aggregate = \"count\";\n          y2.title = language.count;\n          const stripProps = {\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        default: {\n          y2.aggregate = \"count\";\n          y2.title = language.count;\n          const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: \"right-up\",\n            z: specColumns.z,\n            maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n            maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Square\",\n            props: squareProps\n          });\n          break;\n        }\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: true,\n        percentage: true,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_b2 = specColumns.z) === null || _b2 === void 0 ? void 0 : _b2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function density(specContext) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const axisScales = {\n      x: { title: (_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.name },\n      y: { title: (_b2 = specColumns.y) === null || _b2 === void 0 ? void 0 : _b2.name },\n      z: { title: (_c2 = specColumns.z) === null || _c2 === void 0 ? void 0 : _c2.name }\n    };\n    const backgroundImage = ((_d2 = specColumns.x) === null || _d2 === void 0 ? void 0 : _d2.quantitative) && ((_e2 = specColumns.y) === null || _e2 === void 0 ? void 0 : _e2.quantitative) && ((_f = insight.backgroundImage) === null || _f === void 0 ? void 0 : _f.extents) && insight.backgroundImage;\n    const showAxes = !(backgroundImage || insight.hideAxes);\n    const hBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom }\n    };\n    const vBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left }\n    };\n    const aggProps = {\n      onBuild: null,\n      aggregation: null,\n      sumBy: specColumns.size\n    };\n    const layouts = [\n      {\n        layoutType: \"Band\",\n        props: vBandProps\n      },\n      {\n        layoutType: \"Band\",\n        props: hBandProps\n      },\n      {\n        layoutType: \"AggregateSquare\",\n        props: aggProps\n      }\n    ];\n    const { totalStyle, view } = insight;\n    switch (totalStyle) {\n      case \"sum-treemap\": {\n        aggProps.aggregation = \"sum\";\n        const treemapProps = {\n          corner: \"bottom-left\",\n          size: specColumns.size,\n          treeMapMethod: specViewOptions.language.treeMapMethod,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Treemap\",\n          props: treemapProps\n        });\n        break;\n      }\n      case \"sum-strip\": {\n        aggProps.aggregation = \"sum\";\n        const stripProps = {\n          sortOrder: \"ascending\",\n          orientation: \"vertical\",\n          size: specColumns.size,\n          sort: specColumns.sort,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Strip\",\n          props: stripProps\n        });\n        break;\n      }\n      case \"count-strip\": {\n        aggProps.aggregation = \"count\";\n        const stripProps = {\n          sortOrder: \"ascending\",\n          orientation: \"vertical\",\n          sort: specColumns.sort,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Strip\",\n          props: stripProps\n        });\n        break;\n      }\n      default: {\n        aggProps.aggregation = \"count\";\n        const squareProps = {\n          sortBy: specColumns.sort,\n          fillDirection: \"right-down\",\n          z: specColumns.z,\n          maxGroupedUnits: null,\n          maxGroupedFillSize: null,\n          showAxes,\n          view\n        };\n        aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled) => {\n          squareProps.maxGroupedUnits = aggMaxExtent;\n          squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n        };\n        layouts.push({\n          layoutType: \"Square\",\n          props: squareProps\n        });\n        break;\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: true,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function grid(specContext) {\n    var _a2;\n    const { insight, specColumns } = specContext;\n    const { view } = insight;\n    const squareProps = {\n      sortBy: specColumns.sort,\n      fillDirection: \"right-down\",\n      z: specColumns.z,\n      collapseYHeight: true,\n      showAxes: !insight.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    return {\n      axisScales,\n      layouts: [\n        {\n          layoutType: \"Square\",\n          props: squareProps\n        }\n      ],\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"z\",\n            axisSelection: ((_a2 = specColumns.z) === null || _a2 === void 0 ? void 0 : _a2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function scatterplot(specContext) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const backgroundImageExtents = ((_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.quantitative) && ((_b2 = specColumns.y) === null || _b2 === void 0 ? void 0 : _b2.quantitative) && ((_c2 = insight.backgroundImage) === null || _c2 === void 0 ? void 0 : _c2.extents);\n    const scatterProps = {\n      x: specColumns.x,\n      y: specColumns.y,\n      z: specColumns.z,\n      size: specColumns.size,\n      scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n      zGrounded: specViewOptions.language.zGrounded,\n      backgroundImageExtents,\n      showAxes: !(backgroundImageExtents || insight.hideAxes),\n      view: insight.view\n    };\n    const axisScales = {\n      x: { title: (_d2 = specColumns.x) === null || _d2 === void 0 ? void 0 : _d2.name },\n      y: { title: (_e2 = specColumns.y) === null || _e2 === void 0 ? void 0 : _e2.name },\n      z: { title: (_f = specColumns.z) === null || _f === void 0 ? void 0 : _f.name }\n    };\n    return {\n      axisScales,\n      layouts: [\n        {\n          layoutType: \"Scatter\",\n          props: scatterProps\n        }\n      ],\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"x\",\n            axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\"\n          },\n          {\n            role: \"y\",\n            axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? \"range\" : \"exact\"\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: false\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            excludeCategoric: true,\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ],\n        signals: [SignalNames.PointScale, SignalNames.ZGrounded]\n      }\n    };\n  }\n  function stacks(specContext) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const axisScales = {\n      x: { title: (_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.name },\n      y: { title: (_b2 = specColumns.y) === null || _b2 === void 0 ? void 0 : _b2.name },\n      z: { title: specViewOptions.language.count }\n    };\n    const backgroundImage = ((_c2 = specColumns.x) === null || _c2 === void 0 ? void 0 : _c2.quantitative) && ((_d2 = specColumns.y) === null || _d2 === void 0 ? void 0 : _d2.quantitative) && ((_e2 = insight.backgroundImage) === null || _e2 === void 0 ? void 0 : _e2.extents) && insight.backgroundImage;\n    const showAxes = !(backgroundImage || insight.hideAxes);\n    const hBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom }\n    };\n    const vBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left }\n    };\n    const stackProps = {\n      sort: specColumns.sort,\n      showAxes\n    };\n    return {\n      axisScales,\n      customZScale: true,\n      layouts: [\n        {\n          layoutType: \"Band\",\n          props: vBandProps\n        },\n        {\n          layoutType: \"Band\",\n          props: hBandProps\n        },\n        {\n          layoutType: \"Stack\",\n          props: stackProps\n        }\n      ],\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_f = specColumns.x) === null || _f === void 0 ? void 0 : _f.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_g = specColumns.y) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function strips(specContext) {\n    var _a2;\n    const { insight, specColumns } = specContext;\n    const { view } = insight;\n    const stripProps = {\n      sortOrder: \"ascending\",\n      orientation: \"vertical\",\n      size: specColumns.size,\n      sort: specColumns.sort,\n      z: specColumns.z,\n      showAxes: !insight.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n      axisScales.y = {\n        title: null,\n        aggregate: specColumns.size ? \"sum\" : \"count\"\n      };\n      const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n      const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n      const props = {\n        dock: \"top\",\n        niceScale: false,\n        globalAggregateMaxExtentScaledSignal,\n        globalAggregateMaxExtentSignal,\n        sumBy: specColumns.size,\n        showAxes: false\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props\n      });\n    }\n    layouts.push({\n      layoutType: \"Strip\",\n      props: stripProps\n    });\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"size\",\n            allowNone: true,\n            //size by none is a count\n            excludeCategoric: true\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_a2 = specColumns.z) === null || _a2 === void 0 ? void 0 : _a2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function treemap$1(specContext) {\n    var _a2;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { view } = insight;\n    const treemapProps = {\n      corner: \"top-left\",\n      group: specColumns.group,\n      size: specColumns.size,\n      treeMapMethod: specViewOptions.language.treeMapMethod,\n      z: specColumns.z,\n      showAxes: !insight.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n      axisScales.y = {\n        title: null,\n        aggregate: \"sum\"\n      };\n      const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n      const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n      const props = {\n        dock: \"top\",\n        niceScale: false,\n        globalAggregateMaxExtentScaledSignal,\n        globalAggregateMaxExtentSignal,\n        sumBy: specColumns.size,\n        showAxes: false\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props\n      });\n    }\n    layouts.push({\n      layoutType: \"Treemap\",\n      props: treemapProps\n    });\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"size\",\n            excludeCategoric: true\n          },\n          {\n            role: \"group\",\n            allowNone: true\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_a2 = specColumns.z) === null || _a2 === void 0 ? void 0 : _a2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ],\n        signals: [SignalNames.TreeMapMethod]\n      }\n    };\n  }\n  function getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n    let layoutPair;\n    const groupby = facetColumn;\n    const plotPadding = {\n      x: 0,\n      y: 0\n    };\n    let facetPadding;\n    switch (facetStyle) {\n      case \"cross\": {\n        const props = {\n          axisTextColor,\n          colRowTitles: true,\n          groupbyX: groupby,\n          groupbyY: facetVColumn\n        };\n        layoutPair = {\n          layoutType: \"Cross\",\n          props\n        };\n        facetPadding = {\n          bottom: facetPaddingBottom,\n          left: facetPaddingLeft,\n          top: 0\n        };\n        plotPadding.y = facetPaddingTop;\n        plotPadding.x = facetPaddingRight;\n        break;\n      }\n      case \"wrap\":\n      default: {\n        const props = {\n          axisTextColor,\n          cellTitles: true,\n          groupby\n        };\n        layoutPair = {\n          layoutType: \"Wrap\",\n          props\n        };\n        facetPadding = {\n          bottom: facetPaddingBottom,\n          left: facetPaddingLeft,\n          top: facetPaddingTop\n        };\n        break;\n      }\n    }\n    const facetLayout = {\n      facetPadding,\n      plotPadding\n    };\n    return {\n      layoutPair,\n      facetLayout\n    };\n  }\n  const map$4 = {\n    barchart: barchartV,\n    barchartH,\n    barchartV,\n    density,\n    grid,\n    scatterplot,\n    stacks,\n    strips,\n    treemap: treemap$1\n  };\n  function getSpecBuilderPropsForChart(specContext) {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const fn2 = map$4[insight.chart];\n    if (fn2) {\n      const props = fn2(specContext);\n      if (insight.columns.facet) {\n        const discreteFacetColumn = {\n          column: specColumns.facet,\n          defaultBins,\n          maxbins,\n          maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n          maxbinsSignalName: SignalNames.FacetBins\n        };\n        const discreteFacetVColumn = {\n          column: specColumns.facetV,\n          defaultBins,\n          maxbins,\n          maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n          maxbinsSignalName: SignalNames.FacetVBins\n        };\n        const { facetLayout, layoutPair } = getFacetLayout(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n        props.layouts.unshift(layoutPair);\n        props.facetLayout = facetLayout;\n        props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n      }\n      return props;\n    }\n  }\n  function define2(constructor, factory, prototype2) {\n    constructor.prototype = factory.prototype = prototype2;\n    prototype2.constructor = constructor;\n  }\n  function extend$1(parent, definition2) {\n    var prototype2 = Object.create(parent.prototype);\n    for (var key2 in definition2) prototype2[key2] = definition2[key2];\n    return prototype2;\n  }\n  function Color$2() {\n  }\n  var darker = 0.7;\n  var brighter = 1 / darker;\n  var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`), reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`), reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`), reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`), reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`), reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n  var named = {\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  };\n  define2(Color$2, color$2, {\n    copy(channels) {\n      return Object.assign(new this.constructor(), this, channels);\n    },\n    displayable() {\n      return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    // Deprecated! Use color.formatHex.\n    formatHex: color_formatHex,\n    formatHex8: color_formatHex8,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n  });\n  function color_formatHex() {\n    return this.rgb().formatHex();\n  }\n  function color_formatHex8() {\n    return this.rgb().formatHex8();\n  }\n  function color_formatHsl() {\n    return hslConvert(this).formatHsl();\n  }\n  function color_formatRgb() {\n    return this.rgb().formatRgb();\n  }\n  function color$2(format2) {\n    var m2, l;\n    format2 = (format2 + \"\").trim().toLowerCase();\n    return (m2 = reHex.exec(format2)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format2)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format2)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format2)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format2)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n  }\n  function rgbn(n) {\n    return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1);\n  }\n  function rgba(r, g, b2, a2) {\n    if (a2 <= 0) r = g = b2 = NaN;\n    return new Rgb(r, g, b2, a2);\n  }\n  function rgbConvert(o) {\n    if (!(o instanceof Color$2)) o = color$2(o);\n    if (!o) return new Rgb();\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n  }\n  function rgb$1(r, g, b2, opacity2) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b2, opacity2 == null ? 1 : opacity2);\n  }\n  function Rgb(r, g, b2, opacity2) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b2;\n    this.opacity = +opacity2;\n  }\n  define2(Rgb, rgb$1, extend$1(Color$2, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb() {\n      return this;\n    },\n    clamp() {\n      return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n    },\n    displayable() {\n      return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);\n    },\n    hex: rgb_formatHex,\n    // Deprecated! Use color.formatHex.\n    formatHex: rgb_formatHex,\n    formatHex8: rgb_formatHex8,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n  }));\n  function rgb_formatHex() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n  }\n  function rgb_formatHex8() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n  }\n  function rgb_formatRgb() {\n    const a2 = clampa(this.opacity);\n    return `${a2 === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a2 === 1 ? \")\" : `, ${a2})`}`;\n  }\n  function clampa(opacity2) {\n    return isNaN(opacity2) ? 1 : Math.max(0, Math.min(1, opacity2));\n  }\n  function clampi(value2) {\n    return Math.max(0, Math.min(255, Math.round(value2) || 0));\n  }\n  function hex(value2) {\n    value2 = clampi(value2);\n    return (value2 < 16 ? \"0\" : \"\") + value2.toString(16);\n  }\n  function hsla(h2, s2, l, a2) {\n    if (a2 <= 0) h2 = s2 = l = NaN;\n    else if (l <= 0 || l >= 1) h2 = s2 = NaN;\n    else if (s2 <= 0) h2 = NaN;\n    return new Hsl(h2, s2, l, a2);\n  }\n  function hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color$2)) o = color$2(o);\n    if (!o) return new Hsl();\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b2 = o.b / 255, min2 = Math.min(r, g, b2), max2 = Math.max(r, g, b2), h2 = NaN, s2 = max2 - min2, l = (max2 + min2) / 2;\n    if (s2) {\n      if (r === max2) h2 = (g - b2) / s2 + (g < b2) * 6;\n      else if (g === max2) h2 = (b2 - r) / s2 + 2;\n      else h2 = (r - g) / s2 + 4;\n      s2 /= l < 0.5 ? max2 + min2 : 2 - max2 - min2;\n      h2 *= 60;\n    } else {\n      s2 = l > 0 && l < 1 ? 0 : h2;\n    }\n    return new Hsl(h2, s2, l, o.opacity);\n  }\n  function hsl$1(h2, s2, l, opacity2) {\n    return arguments.length === 1 ? hslConvert(h2) : new Hsl(h2, s2, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Hsl(h2, s2, l, opacity2) {\n    this.h = +h2;\n    this.s = +s2;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  define2(Hsl, hsl$1, extend$1(Color$2, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h2 = this.h % 360 + (this.h < 0) * 360, s2 = isNaN(h2) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s2, m1 = 2 * l - m2;\n      return new Rgb(\n        hsl2rgb(h2 >= 240 ? h2 - 240 : h2 + 120, m1, m2),\n        hsl2rgb(h2, m1, m2),\n        hsl2rgb(h2 < 120 ? h2 + 240 : h2 - 120, m1, m2),\n        this.opacity\n      );\n    },\n    clamp() {\n      return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n    },\n    displayable() {\n      return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);\n    },\n    formatHsl() {\n      const a2 = clampa(this.opacity);\n      return `${a2 === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a2 === 1 ? \")\" : `, ${a2})`}`;\n    }\n  }));\n  function clamph(value2) {\n    value2 = (value2 || 0) % 360;\n    return value2 < 0 ? value2 + 360 : value2;\n  }\n  function clampt(value2) {\n    return Math.max(0, Math.min(1, value2 || 0));\n  }\n  function hsl2rgb(h2, m1, m2) {\n    return (h2 < 60 ? m1 + (m2 - m1) * h2 / 60 : h2 < 180 ? m2 : h2 < 240 ? m1 + (m2 - m1) * (240 - h2) / 60 : m1) * 255;\n  }\n  const radians$1 = Math.PI / 180;\n  const degrees$2 = 180 / Math.PI;\n  const K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, t0$2 = 4 / 29, t1$1 = 6 / 29, t2 = 3 * t1$1 * t1$1, t3 = t1$1 * t1$1 * t1$1;\n  function labConvert(o) {\n    if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n    if (o instanceof Hcl) return hcl2lab(o);\n    if (!(o instanceof Rgb)) o = rgbConvert(o);\n    var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b2 = rgb2lrgb(o.b), y2 = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b2) / Yn), x2, z2;\n    if (r === g && g === b2) x2 = z2 = y2;\n    else {\n      x2 = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b2) / Xn);\n      z2 = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b2) / Zn);\n    }\n    return new Lab(116 * y2 - 16, 500 * (x2 - y2), 200 * (y2 - z2), o.opacity);\n  }\n  function lab$1(l, a2, b2, opacity2) {\n    return arguments.length === 1 ? labConvert(l) : new Lab(l, a2, b2, opacity2 == null ? 1 : opacity2);\n  }\n  function Lab(l, a2, b2, opacity2) {\n    this.l = +l;\n    this.a = +a2;\n    this.b = +b2;\n    this.opacity = +opacity2;\n  }\n  define2(Lab, lab$1, extend$1(Color$2, {\n    brighter(k) {\n      return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    darker(k) {\n      return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    rgb() {\n      var y2 = (this.l + 16) / 116, x2 = isNaN(this.a) ? y2 : y2 + this.a / 500, z2 = isNaN(this.b) ? y2 : y2 - this.b / 200;\n      x2 = Xn * lab2xyz(x2);\n      y2 = Yn * lab2xyz(y2);\n      z2 = Zn * lab2xyz(z2);\n      return new Rgb(\n        lrgb2rgb(3.1338561 * x2 - 1.6168667 * y2 - 0.4906146 * z2),\n        lrgb2rgb(-0.9787684 * x2 + 1.9161415 * y2 + 0.033454 * z2),\n        lrgb2rgb(0.0719453 * x2 - 0.2289914 * y2 + 1.4052427 * z2),\n        this.opacity\n      );\n    }\n  }));\n  function xyz2lab(t) {\n    return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0$2;\n  }\n  function lab2xyz(t) {\n    return t > t1$1 ? t * t * t : t2 * (t - t0$2);\n  }\n  function lrgb2rgb(x2) {\n    return 255 * (x2 <= 31308e-7 ? 12.92 * x2 : 1.055 * Math.pow(x2, 1 / 2.4) - 0.055);\n  }\n  function rgb2lrgb(x2) {\n    return (x2 /= 255) <= 0.04045 ? x2 / 12.92 : Math.pow((x2 + 0.055) / 1.055, 2.4);\n  }\n  function hclConvert(o) {\n    if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n    if (!(o instanceof Lab)) o = labConvert(o);\n    if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n    var h2 = Math.atan2(o.b, o.a) * degrees$2;\n    return new Hcl(h2 < 0 ? h2 + 360 : h2, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n  }\n  function hcl$1(h2, c2, l, opacity2) {\n    return arguments.length === 1 ? hclConvert(h2) : new Hcl(h2, c2, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Hcl(h2, c2, l, opacity2) {\n    this.h = +h2;\n    this.c = +c2;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  function hcl2lab(o) {\n    if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n    var h2 = o.h * radians$1;\n    return new Lab(o.l, Math.cos(h2) * o.c, Math.sin(h2) * o.c, o.opacity);\n  }\n  define2(Hcl, hcl$1, extend$1(Color$2, {\n    brighter(k) {\n      return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n    },\n    darker(k) {\n      return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n    },\n    rgb() {\n      return hcl2lab(this).rgb();\n    }\n  }));\n  var A = -0.14861, B$1 = 1.78277, C$1 = -0.29227, D$1 = -0.90649, E = 1.97294, ED = E * D$1, EB = E * B$1, BC_DA = B$1 * C$1 - D$1 * A;\n  function cubehelixConvert(o) {\n    if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Rgb)) o = rgbConvert(o);\n    var r = o.r / 255, g = o.g / 255, b2 = o.b / 255, l = (BC_DA * b2 + ED * r - EB * g) / (BC_DA + ED - EB), bl2 = b2 - l, k = (E * (g - l) - C$1 * bl2) / D$1, s2 = Math.sqrt(k * k + bl2 * bl2) / (E * l * (1 - l)), h2 = s2 ? Math.atan2(k, bl2) * degrees$2 - 120 : NaN;\n    return new Cubehelix(h2 < 0 ? h2 + 360 : h2, s2, l, o.opacity);\n  }\n  function cubehelix$1(h2, s2, l, opacity2) {\n    return arguments.length === 1 ? cubehelixConvert(h2) : new Cubehelix(h2, s2, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Cubehelix(h2, s2, l, opacity2) {\n    this.h = +h2;\n    this.s = +s2;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  define2(Cubehelix, cubehelix$1, extend$1(Color$2, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h2 = isNaN(this.h) ? 0 : (this.h + 120) * radians$1, l = +this.l, a2 = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh2 = Math.cos(h2), sinh2 = Math.sin(h2);\n      return new Rgb(\n        255 * (l + a2 * (A * cosh2 + B$1 * sinh2)),\n        255 * (l + a2 * (C$1 * cosh2 + D$1 * sinh2)),\n        255 * (l + a2 * (E * cosh2)),\n        this.opacity\n      );\n    }\n  }));\n  function isColor(cssColorSpecifier) {\n    return !!color$2(cssColorSpecifier);\n  }\n  function checkIsColorData(data2, column) {\n    if (!column.stats.hasColorData) {\n      column.isColorData = false;\n      return;\n    }\n    for (let i = 0; i < data2.length; i++) {\n      if (!isColor(data2[i][column.name])) {\n        column.isColorData = false;\n        return;\n      }\n    }\n    column.isColorData = true;\n  }\n  function isQuantitative(column) {\n    return column.type === \"number\" || column.type === \"integer\";\n  }\n  function detectNegative(columnName, data2) {\n    for (let i = 1; i < data2.length; i++) {\n      const value2 = columnName == null ? data2[i] : data2[i][columnName];\n      if (value2 < 0)\n        return true;\n    }\n    return false;\n  }\n  function detectSequentialColumn(columnName, data2) {\n    if (data2.length < 2)\n      return false;\n    for (let i = 1; i < data2.length; i++) {\n      const curr = columnName == null ? data2[i] : data2[i][columnName];\n      const prev = columnName == null ? data2[i - 1] : data2[i - 1][columnName];\n      if (curr !== prev + 1)\n        return false;\n    }\n    return true;\n  }\n  function getStats(data2, ...args) {\n    let columnName;\n    let columnType;\n    let columnQuantitative;\n    let distinctValuesCallback;\n    if (args.length <= 2) {\n      const column = args[0];\n      columnName = column.name;\n      columnType = column.type;\n      columnQuantitative = column.quantitative;\n      distinctValuesCallback = args[1];\n    } else {\n      columnName = args[0];\n      columnType = args[1];\n      columnQuantitative = args[2];\n      distinctValuesCallback = args[3];\n    }\n    const distinctMap = {};\n    const stats = {\n      nonNull: 0,\n      distinctValueCount: null,\n      max: null,\n      mean: null,\n      min: null\n    };\n    const columnIsString = columnType === \"string\";\n    let sum2 = 0;\n    for (let i = 0; i < data2.length; i++) {\n      const row = data2[i];\n      const value2 = columnName == null ? row : row[columnName];\n      if (columnIsString) {\n        if (value2 !== \"\") {\n          stats.nonNull++;\n        }\n      } else if (value2 != null) {\n        stats.nonNull++;\n      }\n      const num = +value2;\n      distinctMap[value2] = true;\n      if (!isNaN(num)) {\n        if (stats.max === null || num > stats.max) {\n          stats.max = num;\n        }\n        if (stats.min === null || num < stats.min) {\n          stats.min = num;\n        }\n        sum2 += num;\n      }\n      if ((columnType === \"date\" || columnIsString) && !stats.hasColorData && isColor(value2)) {\n        stats.hasColorData = true;\n      }\n    }\n    if (columnQuantitative) {\n      stats.mean = data2.length > 0 && sum2 / data2.length;\n      stats.hasNegative = detectNegative(columnName, data2);\n      if (columnType === \"integer\") {\n        stats.isSequential = detectSequentialColumn(columnName, data2);\n      }\n    }\n    const distinctValues = Object.keys(distinctMap);\n    if (distinctValuesCallback) {\n      distinctValues.sort();\n      distinctValuesCallback(distinctValues);\n    }\n    stats.distinctValueCount = distinctValues.length;\n    return stats;\n  }\n  function getColumnsFromData(inferTypesFn, data2, columnTypes) {\n    const sample = data2[0];\n    const fields = sample ? Object.keys(sample) : [];\n    const inferences = Object.assign(Object.assign({}, inferTypesFn(data2, fields)), columnTypes);\n    const columns = fields.map((name) => {\n      const column = {\n        name,\n        type: inferences[name]\n      };\n      return column;\n    });\n    inferAll(columns, data2);\n    return columns;\n  }\n  function inferAll(columns, data2) {\n    columns.forEach((column) => {\n      if (column) {\n        if (typeof column.quantitative !== \"boolean\") {\n          column.quantitative = isQuantitative(column);\n        }\n        if (!column.stats) {\n          column.stats = getStats(data2, column);\n        }\n        if ((column.type === \"date\" || column.type === \"string\") && typeof column.isColorData !== \"boolean\") {\n          checkIsColorData(data2, column);\n        }\n      }\n    });\n  }\n  let Table$2 = class Table {\n    constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = \"right\") {\n      this.columns = columns;\n      this.rows = rows;\n      this.maxWidth = maxWidth;\n      this.underlineHeaders = underlineHeaders;\n      this.align = align;\n      this.columnWidths = this.columns.map((col, idx) => Math.max(col.length, ...this.rows.map((row) => {\n        var _a2;\n        return ((_a2 = row[idx]) === null || _a2 === void 0 ? void 0 : _a2.length) || 0;\n      })));\n    }\n    createSpaces(num) {\n      return \" \".repeat(num);\n    }\n    groupColumns() {\n      let cumulativeWidth = 0;\n      const columnGroups = [];\n      let currentGroup = [];\n      this.columns.forEach((col, idx) => {\n        const columnSpace = this.columnWidths[idx] + 1;\n        if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n          columnGroups.push(currentGroup);\n          cumulativeWidth = columnSpace;\n          currentGroup = [col];\n        } else {\n          cumulativeWidth += columnSpace;\n          currentGroup.push(col);\n        }\n      });\n      if (currentGroup.length > 0) {\n        columnGroups.push(currentGroup);\n      }\n      return columnGroups;\n    }\n    formatRow(row, group2) {\n      return group2.map((col) => {\n        const idx = this.columns.indexOf(col);\n        const cellValue = row[idx] == null ? \"\" : row[idx].toString();\n        return this.align === \"right\" ? cellValue.padStart(this.columnWidths[idx], \" \") : cellValue.padEnd(this.columnWidths[idx], \" \");\n      }).join(this.createSpaces(1));\n    }\n    formatHeader(group2) {\n      return group2.map((col) => {\n        const idx = this.columns.indexOf(col);\n        return this.align === \"right\" ? col.padStart(this.columnWidths[idx], \" \") : col.padEnd(this.columnWidths[idx], \" \");\n      }).join(this.createSpaces(1));\n    }\n    underlineHeader(group2) {\n      return group2.map((col) => \"-\".repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n    }\n    render() {\n      const output2 = [];\n      const columnGroups = this.groupColumns();\n      columnGroups.forEach((group2, groupIndex) => {\n        const headerRow = this.formatHeader(group2);\n        let section = headerRow + (groupIndex < columnGroups.length - 1 ? \" \\\\\" : \"\") + \"\\n\";\n        if (this.underlineHeaders) {\n          section += this.underlineHeader(group2) + \"\\n\";\n        }\n        this.rows.forEach((row) => {\n          section += this.formatRow(row, group2) + \"\\n\";\n        });\n        output2.push(section);\n        if (groupIndex < columnGroups.length - 1) {\n          output2.push(\"\\n\");\n        }\n      });\n      return output2.join(\"\");\n    }\n  };\n  var pandasSimulation;\n  (function(pandasSimulation2) {\n    const typeMapping = {\n      boolean: \"bool\",\n      number: \"float64\",\n      // Assuming 'number' is used for floating-point numbers\n      date: \"datetime64[ns]\",\n      string: \"object\",\n      integer: \"int64\"\n    };\n    function head(columns, data2, maxWidth = 80) {\n      const numRows = 5;\n      const top = data2.slice(0, numRows);\n      const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n      const columnNames = [\"\"].concat(columns.map((col) => col.name));\n      const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map((col) => {\n        var _a2;\n        return ((_a2 = row[col.name]) === null || _a2 === void 0 ? void 0 : _a2.toString()) || \"\";\n      })));\n      const table = new Table$2(columnNames, rows, maxWidth, false, \"right\");\n      return table.render();\n    }\n    pandasSimulation2.head = head;\n    function info2(columns, data2, maxWidth = 80) {\n      const numRows = data2.length;\n      const output2 = [];\n      output2.push(\"<class 'pandas.core.frame.DataFrame'>\");\n      output2.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n      output2.push(`Data columns (total ${columns.length} columns):\n`);\n      const columnHeaders = [\"#\", \"Column\", \"Non-Null Count\", \"Dtype\"];\n      const rows = columns.map((col, idx) => {\n        const nonNullCount = col.stats.nonNull.toString();\n        const dtype = typeMapping[col.type] || \"unknown\";\n        return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n      });\n      const table = new Table$2(columnHeaders, rows, maxWidth, true, \"left\");\n      output2.push(table.render());\n      const memoryUsage = columns.reduce((total, col) => {\n        var _a2;\n        const exampleValue = (_a2 = data2.find((row) => row[col.name] != null)) === null || _a2 === void 0 ? void 0 : _a2[col.name];\n        if (exampleValue == null)\n          return total;\n        const size = new Blob([exampleValue.toString()]).size;\n        return total + size * numRows;\n      }, 0);\n      output2.push(`\ndtypes: ${columns.filter((col) => col.type === \"number\").length} float64, ${columns.filter((col) => col.type === \"integer\").length} int64, ${columns.filter((col) => col.type === \"string\").length} object`);\n      output2.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n      return output2.join(\"\\n\");\n    }\n    pandasSimulation2.info = info2;\n  })(pandasSimulation || (pandasSimulation = {}));\n  function getSpecColumns(insight, columns) {\n    function getColumnByName(name) {\n      return columns.filter((c2) => c2.name === name)[0];\n    }\n    return {\n      color: getColumnByName(insight.columns && insight.columns.color),\n      facet: getColumnByName(insight.columns && insight.columns.facet),\n      facetV: getColumnByName(insight.columns && insight.columns.facetV),\n      group: getColumnByName(insight.columns && insight.columns.group),\n      size: getColumnByName(insight.columns && insight.columns.size),\n      sort: getColumnByName(insight.columns && insight.columns.sort),\n      uid: getColumnByName(insight.columns && insight.columns.uid),\n      x: getColumnByName(insight.columns && insight.columns.x),\n      y: getColumnByName(insight.columns && insight.columns.y),\n      z: getColumnByName(insight.columns && insight.columns.z)\n    };\n  }\n  function addAxes(scope, ...axes) {\n    if (!axes || !axes.length)\n      return;\n    if (!scope.axes)\n      scope.axes = [];\n    scope.axes.push(...axes.filter(Boolean));\n  }\n  function addData(scope, ...datas) {\n    if (!datas || !datas.length)\n      return;\n    if (!scope.data)\n      scope.data = [];\n    scope.data.push(...datas.filter(Boolean));\n  }\n  function addMarks(scope, ...marks) {\n    if (!marks || !marks.length)\n      return;\n    if (!scope.marks)\n      scope.marks = [];\n    scope.marks.push(...marks.filter(Boolean));\n  }\n  function addScales(scope, ...scales2) {\n    if (!scales2 || !scales2.length)\n      return;\n    if (!scope.scales)\n      scope.scales = [];\n    scope.scales.push(...scales2.filter(Boolean));\n  }\n  function addSignals(scope, ...signals) {\n    if (!signals || !signals.length)\n      return;\n    if (!scope.signals)\n      scope.signals = [];\n    scope.signals.push(...signals.filter(Boolean));\n  }\n  function addTransforms(data2, ...transforms2) {\n    if (!transforms2 || !transforms2.length)\n      return;\n    if (!data2.transform)\n      data2.transform = [];\n    data2.transform.push(...transforms2.filter(Boolean));\n  }\n  function getDataByName(data2, dataName) {\n    for (let i = 0; i < data2.length; i++) {\n      if (data2[i].name === dataName)\n        return { data: data2[i], index: i };\n    }\n  }\n  function getGroupBy(groupings) {\n    const groupby = groupings.map((g) => g.groupby);\n    return groupby.reduce((acc, val) => acc.concat(val), []);\n  }\n  function addOffsets(...offsets2) {\n    return offsets2.filter(Boolean).join(\" + \");\n  }\n  function addGlobalAxes(props) {\n    const { axesOffsets, axisScales, axesScopes, axesTitlePadding, allGlobalScales, globalScope, labelBaseline, plotOffsetSignals, specColumns, specViewOptions } = props;\n    const { scope } = globalScope;\n    allGlobalScales.forEach((globalScales) => {\n      const { scales: scales2 } = globalScales;\n      for (const xyz in scales2) {\n        const _scales = scales2[xyz];\n        if (_scales) {\n          addScales(scope, ..._scales);\n          let { showAxes } = globalScales;\n          let zindex = void 0;\n          if (xyz === \"z\") {\n            showAxes = false;\n            if (props.view === \"3d\" && specViewOptions.zAxisOptions && !props.hideZAxis) {\n              if (specViewOptions.zAxisOptions.showZAxis) {\n                showAxes = true;\n                zindex = specViewOptions.zAxisOptions.zIndex;\n              }\n            }\n          }\n          if (showAxes && axisScales) {\n            const axisScale = axisScales[xyz];\n            if (axisScale) {\n              const lineColor = specViewOptions.colors.axisLine;\n              const horizontal = xyz === \"x\";\n              const column = specColumns[xyz] || { quantitative: true };\n              const title = axisScale.title;\n              const props2 = {\n                title,\n                horizontal,\n                column,\n                specViewOptions,\n                lineColor,\n                titlePadding: axesTitlePadding[xyz],\n                labelBaseline: labelBaseline[xyz],\n                zindex\n              };\n              axesScopes[\"main\"].forEach((a2) => addAxes(a2.scope, createAxis(Object.assign(Object.assign({}, props2), { scale: a2.scale || _scales[0], showTitle: a2.title, showLabels: a2.labels, showLines: a2.lines }))));\n              if (axesScopes[xyz]) {\n                axesScopes[xyz].forEach((a2) => addAxes(a2.scope, createAxis(Object.assign(Object.assign({}, props2), { scale: a2.scale || _scales[0], showTitle: a2.title, showLabels: a2.labels, showLines: a2.lines }))));\n              }\n              if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                const plotOffsetSignal = plotOffsetSignals[xyz];\n                plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n              }\n            }\n          }\n        }\n      }\n    });\n  }\n  function createAxis(props) {\n    const { column, horizontal, labelBaseline, lineColor, scale: scale2, showLabels, showTitle, showLines, specViewOptions, title, titlePadding, zindex } = props;\n    const axis = Object.assign(Object.assign(Object.assign(Object.assign({ zindex, scale: scale2.name, orient: horizontal ? \"bottom\" : \"left\", domain: showLines, ticks: showLines }, showLines && {\n      domainColor: lineColor,\n      tickColor: lineColor,\n      tickSize: specViewOptions.tickSize\n    }), showTitle && {\n      title,\n      titleAlign: horizontal ? \"left\" : \"right\",\n      titleAngle: {\n        signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY\n      },\n      titleColor: specViewOptions.colors.axisText,\n      titleFontSize: {\n        signal: SignalNames.TextTitleSize\n      },\n      titleLimit: axesTitleLimit,\n      titlePadding\n    }), { labels: showLabels }), showLabels && {\n      labelAlign: horizontal ? \"left\" : \"right\",\n      labelBaseline,\n      labelAngle: {\n        signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY\n      },\n      labelColor: specViewOptions.colors.axisText,\n      labelFontSize: {\n        signal: SignalNames.TextSize\n      },\n      labelLimit: axesLabelLimit\n    });\n    if (column.quantitative) {\n      axis.format = \"~r\";\n    }\n    return axis;\n  }\n  function safeFieldName(field2) {\n    return field2.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"').replace(/\\./g, \"\\\\.\").replace(/\\[/g, \"\\\\[\").replace(/\\]/g, \"\\\\]\");\n  }\n  function exprSafeFieldName(field2) {\n    return field2.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, \"\");\n  }\n  function linearScale(scaleName, domain2, range2, reverse2, zero2, nice2 = true) {\n    const scale2 = {\n      name: scaleName,\n      type: \"linear\",\n      range: range2,\n      round: true,\n      reverse: reverse2,\n      domain: domain2,\n      zero: zero2,\n      nice: nice2\n    };\n    return scale2;\n  }\n  function pointScale(scaleName, data2, range2, field2, reverse2) {\n    const scale2 = {\n      name: scaleName,\n      type: \"point\",\n      range: range2,\n      domain: {\n        data: data2,\n        field: safeFieldName(field2),\n        sort: true\n      },\n      padding: 0.5\n    };\n    if (reverse2 !== void 0) {\n      scale2.reverse = reverse2;\n    }\n    return scale2;\n  }\n  function binnableColorScale(scaleName, colorBin, data2, field2, scheme2) {\n    scheme2 = scheme2 || ColorScaleNone;\n    const domain2 = {\n      data: data2,\n      field: safeFieldName(field2)\n    };\n    const range2 = {\n      scheme: scheme2\n    };\n    const reverse2 = { signal: SignalNames.ColorReverse };\n    if (colorBin !== \"continuous\") {\n      range2.count = { signal: SignalNames.ColorBinCount };\n    }\n    switch (colorBin) {\n      case \"continuous\": {\n        const sequentialScale = {\n          name: scaleName,\n          type: \"linear\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return sequentialScale;\n      }\n      case \"quantile\": {\n        const quantileScale = {\n          name: scaleName,\n          type: \"quantile\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return quantileScale;\n      }\n      default: {\n        const quantizeScale = {\n          name: scaleName,\n          type: \"quantize\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return quantizeScale;\n      }\n    }\n  }\n  const defaultZProportion = 0.6;\n  function textSignals(context2, heightSignal) {\n    const { specViewOptions } = context2;\n    const signals = [\n      {\n        name: SignalNames.ZProportion,\n        value: defaultZProportion,\n        bind: {\n          name: specViewOptions.language.zScaleProportion,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 0.1,\n          max: 2,\n          step: 0.1\n        }\n      },\n      {\n        name: SignalNames.ZHeight,\n        update: `${heightSignal} * ${SignalNames.ZProportion}`\n      },\n      {\n        name: SignalNames.TextScale,\n        value: 1.2,\n        bind: {\n          name: specViewOptions.language.textScaleSignal,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 0.5,\n          max: 2,\n          step: 0.1\n        }\n      },\n      {\n        name: SignalNames.TextSize,\n        update: `${SignalNames.TextScale} * 10`\n      },\n      {\n        name: SignalNames.TextTitleSize,\n        update: `${SignalNames.TextScale} * 15`\n      },\n      {\n        name: SignalNames.TextAngleX,\n        value: 30,\n        bind: {\n          name: specViewOptions.language.xAxisTextAngleSignal,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 0,\n          max: 90,\n          step: 1\n        }\n      },\n      {\n        name: SignalNames.TextAngleY,\n        value: 0,\n        bind: {\n          name: specViewOptions.language.yAxisTextAngleSignal,\n          debounce: debounce$1,\n          input: \"range\",\n          min: -90,\n          max: 0,\n          step: 1\n        }\n      },\n      {\n        name: SignalNames.MarkOpacity,\n        value: 1,\n        bind: {\n          name: specViewOptions.language.markOpacitySignal,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 0.1,\n          max: 1,\n          step: 0.05\n        }\n      }\n    ];\n    return signals;\n  }\n  function colorBinCountSignal(context2) {\n    const { specViewOptions } = context2;\n    const signal = {\n      name: SignalNames.ColorBinCount,\n      value: 7,\n      bind: {\n        name: specViewOptions.language.colorBinCount,\n        debounce: debounce$1,\n        input: \"range\",\n        min: 1,\n        max: specViewOptions.maxLegends + 1,\n        step: 1\n      }\n    };\n    return signal;\n  }\n  function colorReverseSignal(context2) {\n    const { specViewOptions } = context2;\n    const signal = {\n      name: SignalNames.ColorReverse,\n      value: false,\n      bind: {\n        name: specViewOptions.language.colorReverse,\n        input: \"checkbox\"\n      }\n    };\n    return signal;\n  }\n  function modifySignal(s2, fn2, update2) {\n    s2.update = `${fn2}((${s2.update}), (${update2}))`;\n  }\n  function legend(column, fill2) {\n    const legend2 = {\n      orient: \"none\",\n      title: column.name,\n      fill: fill2,\n      encode: {\n        symbols: {\n          update: {\n            shape: {\n              value: \"square\"\n            }\n          }\n        }\n      }\n    };\n    if (column.quantitative) {\n      legend2.type = \"symbol\";\n      legend2.format = \"~r\";\n    }\n    return legend2;\n  }\n  function getLegends(context2, fill2) {\n    const { specColumns, insight } = context2;\n    if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n      return [legend(specColumns.color, fill2)];\n    }\n  }\n  function topLookup(column, count2, source2, legend2, lookupName, fieldName, indexName) {\n    const data2 = [\n      {\n        name: lookupName,\n        source: source2,\n        transform: [\n          {\n            type: \"aggregate\",\n            groupby: [safeFieldName(column.name)]\n          },\n          {\n            type: \"window\",\n            ops: [\"count\"],\n            as: [indexName]\n          },\n          {\n            type: \"filter\",\n            expr: `datum[${JSON.stringify(indexName)}] <= ${count2}`\n          }\n        ]\n      },\n      {\n        name: legend2,\n        source: source2,\n        transform: [\n          {\n            type: \"lookup\",\n            from: lookupName,\n            key: safeFieldName(column.name),\n            fields: [column.name].map(safeFieldName),\n            values: [column.name].map(safeFieldName),\n            as: [fieldName]\n          },\n          {\n            type: \"formula\",\n            expr: `datum[${JSON.stringify(fieldName)}] == null ? '${Other}' : datum[${JSON.stringify(fieldName)}]`,\n            as: fieldName\n          }\n        ]\n      }\n    ];\n    return data2;\n  }\n  function addColor(props) {\n    const { colorReverseSignalName, dataName, scope, legendDataName, scaleName, specContext, topLookupName } = props;\n    let colorDataName = dataName;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const legends = getLegends(specContext, scaleName);\n    if (legends) {\n      scope.legends = legends;\n    }\n    const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n    if (categoricalColor) {\n      addData(scope, ...topLookup(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, FieldNames.TopColor, FieldNames.TopIndex));\n      colorDataName = legendDataName;\n    }\n    if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n      if (specColumns.color.quantitative) {\n        addScales(scope, binnableColorScale(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n      } else {\n        addScales(scope, {\n          name: scaleName,\n          type: \"ordinal\",\n          domain: {\n            data: colorDataName,\n            field: FieldNames.TopColor,\n            sort: true\n          },\n          range: {\n            scheme: insight.scheme || ColorScaleNone\n          },\n          reverse: { signal: colorReverseSignalName }\n        });\n      }\n    }\n    addSignals(scope, colorBinCountSignal(specContext), colorReverseSignal(specContext));\n    return { topColorField: FieldNames.TopColor, colorDataName };\n  }\n  function addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n    const titleSignal = `parent[${JSON.stringify(FieldNames.FacetTitle)}]`;\n    const index2 = `datum[${JSON.stringify(FieldNames.Ordinal)}] - 1`;\n    const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index2);\n    const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index2);\n    addMarks(globalScope, col.header, row.footer);\n    addMarks(col.header, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"center\"\n          },\n          baseline: {\n            value: \"middle\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          x: {\n            signal: `${sizeSignals.layoutWidth} / 2`\n          },\n          limit: {\n            signal: sizeSignals.layoutWidth\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          text: {\n            signal: titleSignal\n          }\n        }\n      }\n    });\n    addMarks(row.footer, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"left\"\n          },\n          baseline: {\n            value: \"middle\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          y: {\n            signal: `${sizeSignals.layoutHeight} / 2`\n          },\n          limit: {\n            signal: SignalNames.PlotOffsetRight\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          text: {\n            signal: titleSignal\n          }\n        }\n      }\n    });\n  }\n  function addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n    addMarks(scope, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"center\"\n          },\n          baseline: {\n            value: \"bottom\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          x: {\n            signal: `(${sizeSignals.layoutWidth}) / 2`\n          },\n          text: {\n            signal: `parent[${JSON.stringify(FieldNames.FacetTitle)}]`\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          limit: {\n            signal: sizeSignals.layoutWidth\n          },\n          y: {\n            signal: `-${SignalNames.FacetPaddingTop} / 2`\n          }\n        }\n      }\n    });\n  }\n  function addFacetAxesGroupMarks(props) {\n    const { colSeqName, colTitleScale, globalScope, facetScope, plotScope, rowSeqName, rowTitleScale } = props;\n    const { sizeSignals } = facetScope;\n    const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n    const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n    const index2 = \"datum.data\";\n    const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index2);\n    const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index2);\n    addData(globalScope, colSequence, rowSequence);\n    addMarks(globalScope, col.footer, row.header);\n    addScales(globalScope, colTitleScale, rowTitleScale);\n    const map2 = {\n      main: [\n        {\n          scope: facetScope.facetScope,\n          lines: true,\n          labels: false,\n          title: false\n        }\n      ],\n      x: [\n        {\n          scope: col.footer,\n          lines: true,\n          labels: true,\n          title: false\n        },\n        {\n          scope: plotScope,\n          scale: colTitleScale,\n          lines: false,\n          labels: false,\n          title: true\n        }\n      ],\n      y: [\n        {\n          scope: row.header,\n          lines: true,\n          labels: true,\n          title: false\n        },\n        {\n          scope: plotScope,\n          scale: rowTitleScale,\n          lines: false,\n          labels: false,\n          title: true\n        }\n      ]\n    };\n    return map2;\n  }\n  function facetRowHeaderFooter(data2, sizeSignals, index2) {\n    const rowFn = (xSignal) => {\n      return {\n        type: \"group\",\n        from: { data: data2 },\n        encode: {\n          update: {\n            x: { signal: xSignal },\n            y: {\n              signal: `${SignalNames.PlotOffsetTop} + ${SignalNames.FacetPaddingTop} + (${index2}) * (${sizeSignals.layoutHeight} + ${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`\n            },\n            height: { signal: sizeSignals.layoutHeight }\n          }\n        }\n      };\n    };\n    const header = rowFn(SignalNames.PlotOffsetLeft);\n    const footer = rowFn(`${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetRight} / 2`);\n    return { header, footer };\n  }\n  function facetColumnHeaderFooter(data2, sizeSignals, index2) {\n    const colFn = (ySignal) => {\n      return {\n        type: \"group\",\n        from: { data: data2 },\n        encode: {\n          update: {\n            x: {\n              signal: `(${index2}) * (${sizeSignals.layoutWidth} + ${SignalNames.FacetPaddingLeft}) + ${SignalNames.FacetPaddingLeft} + ${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}`\n            },\n            y: { signal: `${ySignal} - ${SignalNames.FacetAxesAdjustY}` },\n            width: { signal: sizeSignals.layoutWidth }\n          }\n        }\n      };\n    };\n    const header = colFn(`${SignalNames.PlotOffsetTop} / 2`);\n    const footer = colFn(`${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut}`);\n    return { header, footer };\n  }\n  function createSequence(dataName, countSignal) {\n    return {\n      name: dataName,\n      transform: [\n        {\n          type: \"sequence\",\n          start: 0,\n          stop: {\n            signal: countSignal\n          }\n        }\n      ]\n    };\n  }\n  function fill$1(context2, colorFieldName, scale2) {\n    const { specColumns, insight, specViewOptions } = context2;\n    const colorColumn = specColumns.color;\n    return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n      field: safeFieldName(colorColumn.name)\n    } : {\n      scale: scale2,\n      field: colorColumn.quantitative ? safeFieldName(colorColumn.name) : colorFieldName\n    } : {\n      value: specViewOptions.colors.defaultCube\n    };\n  }\n  function opacity(context2) {\n    const result = {\n      signal: SignalNames.MarkOpacity\n    };\n    return result;\n  }\n  class GlobalScope {\n    constructor(props) {\n      const { dataName, markGroup, scope, signals } = props;\n      this.scope = scope;\n      this._markGroup = markGroup;\n      this.signals = signals;\n      this.data = getDataByName(scope.data, dataName).data;\n      this._markDataName = dataName;\n      this.offsets = {\n        x: \"0\",\n        y: \"0\",\n        h: SignalNames.PlotHeightIn,\n        w: SignalNames.PlotWidthIn\n      };\n      this.sizeSignals = {\n        layoutHeight: SignalNames.PlotHeightIn,\n        layoutWidth: SignalNames.PlotWidthIn\n      };\n      this.zSize = SignalNames.PlotHeightIn;\n    }\n    get markDataName() {\n      return this._markDataName;\n    }\n    setMarkDataName(markDataName) {\n      this._markDataName = markDataName;\n    }\n    get markGroup() {\n      return this._markGroup;\n    }\n    setMarkGroup(markGroup) {\n      this._markGroup = markGroup;\n    }\n  }\n  class Layout {\n    constructor(props) {\n      this.props = props;\n      this.id = props.id;\n    }\n    getGrouping() {\n      return null;\n    }\n    getAggregateSumOp() {\n      return null;\n    }\n    build() {\n      throw \"Not implemented\";\n    }\n  }\n  function testForCollapseSelection() {\n    return `datum.${FieldNames.Collapsed}`;\n  }\n  class AggregateContainer extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const a2 = this.aggregation = this.getAggregation();\n      const p = this.prefix = `agg_${this.id}`;\n      this.names = {\n        barCount: `${p}_count`,\n        aggregateField: `${p}_aggregate_value`,\n        globalAggregateExtentSignal: `${p}_${a2}_extent`,\n        scale: `scale_${p}`,\n        extentData: `data_${p}_extent`,\n        offsets: `data_${p}_offsets`\n      };\n    }\n    getAggregateSumOp() {\n      if (this.aggregation === \"sum\") {\n        const fieldOp = {\n          field: safeFieldName(this.props.sumBy.name),\n          op: \"sum\",\n          as: FieldNames.Sum\n        };\n        return fieldOp;\n      }\n    }\n    build() {\n      const { aggregation, names, props } = this;\n      const { dock, globalScope, groupings, niceScale, parentScope, showAxes } = props;\n      addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n        type: \"extent\",\n        field: safeFieldName(names.aggregateField),\n        signal: names.globalAggregateExtentSignal\n      });\n      addSignals(globalScope.scope, {\n        name: props.globalAggregateMaxExtentSignal,\n        update: `${names.globalAggregateExtentSignal}[1]`\n      });\n      const horizontal = dock === \"left\";\n      const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n      const offsets2 = {\n        x: parentScope.offsets.x,\n        y: addOffsets(parentScope.offsets.y, dock === \"bottom\" ? groupScaled : \"\"),\n        h: horizontal ? parentScope.offsets.h : dock === \"top\" ? groupScaled : `${parentScope.offsets.h} - ${groupScaled}`,\n        w: horizontal ? groupScaled : parentScope.offsets.w\n      };\n      const scale2 = {\n        type: \"linear\",\n        name: names.scale,\n        domain: [\n          0,\n          {\n            signal: props.globalAggregateMaxExtentSignal\n          }\n        ],\n        range: horizontal ? [\n          0,\n          {\n            signal: parentScope.sizeSignals.layoutWidth\n          }\n        ] : [\n          {\n            signal: parentScope.sizeSignals.layoutHeight\n          },\n          0\n        ],\n        nice: niceScale,\n        zero: true,\n        reverse: dock === \"top\"\n      };\n      const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n      addSignals(globalScope.scope, {\n        name: props.globalAggregateMaxExtentScaledSignal,\n        update: dock === \"bottom\" ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}` : globalAggregateMaxExtentScaledValue\n      });\n      return {\n        offsets: offsets2,\n        sizeSignals: horizontal ? {\n          layoutHeight: parentScope.sizeSignals.layoutHeight,\n          layoutWidth: null\n        } : {\n          layoutHeight: null,\n          layoutWidth: parentScope.sizeSignals.layoutWidth\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? [scale2] : void 0,\n            y: horizontal ? void 0 : [scale2]\n          }\n        },\n        encodingRuleMap: horizontal ? {\n          x: [{\n            test: testForCollapseSelection(),\n            signal: parentScope.offsets.x\n          }],\n          width: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        } : {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: dock === \"top\" ? parentScope.offsets.y : addOffsets(parentScope.offsets.y, parentScope.offsets.h)\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n    getTransforms(aggregation, groupby) {\n      const trans = {\n        type: \"joinaggregate\",\n        groupby: groupby.map(safeFieldName),\n        ops: [aggregation]\n      };\n      if (aggregation === \"sum\") {\n        trans.fields = [this.props.sumBy.name].map(safeFieldName);\n      }\n      return trans;\n    }\n    getAggregation() {\n      const { props } = this;\n      let s2;\n      if (props.dock === \"left\") {\n        s2 = props.axesScales.x;\n      } else {\n        s2 = props.axesScales.y;\n      }\n      switch (s2.aggregate) {\n        case \"sum\":\n          return \"sum\";\n        default:\n          return \"count\";\n      }\n    }\n  }\n  class AggregateSquare extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const a2 = this.props.aggregation;\n      const p = this.prefix = `agg_${this.id}`;\n      this.names = {\n        barCount: `${p}_count`,\n        aggregateField: `${p}_aggregate_value`,\n        globalAggregateExtentSignal: `${p}_${a2}_extent`,\n        extentData: `data_${p}_extent`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { aggregation, globalScope, groupings, onBuild, parentScope } = props;\n      const { sizeSignals } = parentScope;\n      addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n        type: \"extent\",\n        field: safeFieldName(names.aggregateField),\n        signal: names.globalAggregateExtentSignal\n      });\n      const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n      const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n      const squareMaxArea = `(${[squareMaxSide, squareMaxSide].join(\" * \")})`;\n      const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n      const squareArea = `(${[squareMaxArea, shrinkRatio].join(\" * \")})`;\n      const squareSide = `sqrt(${squareArea})`;\n      const localAggregateMaxExtentScaled = squareSide;\n      onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n        y: addOffsets(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n        h: squareSide,\n        w: squareSide\n      };\n      return {\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        encodingRuleMap: {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: offsets2.y\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n    getTransforms(aggregation, groupby) {\n      const trans = {\n        type: \"joinaggregate\",\n        groupby: groupby.map(safeFieldName),\n        ops: [aggregation]\n      };\n      if (aggregation === \"sum\") {\n        trans.fields = [this.props.sumBy.name].map(safeFieldName);\n      }\n      return trans;\n    }\n  }\n  function dataExtent(column, signal) {\n    return {\n      type: \"extent\",\n      field: safeFieldName(column.name),\n      signal\n    };\n  }\n  function binnable(prefix, domainDataName, discreteColumn, outerSignalExtents) {\n    const { column, defaultBins: defaultBins2, maxbins: maxbins2, maxbinsSignalDisplayName, maxbinsSignalName } = discreteColumn;\n    if (column.quantitative) {\n      const field2 = `${prefix}_bin_${exprSafeFieldName(column.name)}`;\n      const fieldEnd = `${field2}_end`;\n      const binSignal = `${field2}_bins`;\n      const dataExtentSignal = `${field2}_bin_extent`;\n      const dataExtentSpanSignal = `${field2}_bin_extent_span`;\n      const outerSignal = `${field2}_outer_extent`;\n      domainDataName = `${field2}_sequence`;\n      const extentTransform = dataExtent(column, dataExtentSignal);\n      let imageSignal;\n      if (outerSignalExtents) {\n        imageSignal = outerExtentSignal(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n      }\n      const maxbinsSignal = {\n        name: maxbinsSignalName,\n        value: defaultBins2,\n        bind: {\n          name: maxbinsSignalDisplayName,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 1,\n          max: maxbins2,\n          step: 1\n        }\n      };\n      const extentSignal = (imageSignal === null || imageSignal === void 0 ? void 0 : imageSignal.name) || dataExtentSignal;\n      const binTransform = {\n        type: \"bin\",\n        field: safeFieldName(column.name),\n        as: [\n          field2,\n          fieldEnd\n        ],\n        signal: binSignal,\n        extent: {\n          signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`\n          //add a tiny bit to the upper extent to force the extra bin - https://github.com/vega/vega/issues/2899\n        },\n        minstep: shouldBeIntegralBinStep(column) ? 1 : 0,\n        maxbins: {\n          signal: maxbinsSignalName\n        }\n      };\n      const dataSequence = {\n        name: domainDataName,\n        transform: [\n          {\n            type: \"sequence\",\n            start: {\n              signal: `${binSignal}.start`\n            },\n            stop: {\n              signal: `${binSignal}.stop`\n            },\n            step: {\n              signal: `${binSignal}.step`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.data\",\n            as: field2\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data + ${binSignal}.step`,\n            as: fieldEnd\n          },\n          {\n            type: \"window\",\n            ops: [\"row_number\"],\n            as: [FieldNames.Ordinal]\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data === ${binSignal}.start`,\n            as: FieldNames.First\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n            as: FieldNames.Last\n          },\n          {\n            // when there is only one bin, use only first sequence element\n            type: \"filter\",\n            expr: `${dataExtentSpanSignal} === 0 ? datum[${JSON.stringify(FieldNames.First)}] : true`\n          }\n        ]\n      };\n      const signals = [\n        maxbinsSignal,\n        {\n          name: dataExtentSpanSignal,\n          update: `${extentSignal}[1] - ${extentSignal}[0]`\n        }\n      ];\n      if (imageSignal) {\n        signals.push(imageSignal);\n      }\n      const augmentBinnable = {\n        discreteColumn,\n        native: false,\n        transforms: [extentTransform, binTransform],\n        fields: [field2, fieldEnd],\n        binSignal,\n        extentSignal,\n        dataSequence,\n        domainDataName,\n        signals,\n        fullScaleDataname: dataSequence.name\n      };\n      return augmentBinnable;\n    } else {\n      const nativeBinnable = {\n        discreteColumn,\n        native: true,\n        fields: [column.name],\n        domainDataName,\n        fullScaleDataname: domainDataName\n      };\n      return nativeBinnable;\n    }\n  }\n  function outerExtentSignal(name, min2, max2, dataExtent2) {\n    return {\n      name,\n      update: `[min(${min2}, ${dataExtent2}[0]), max(${max2}, ${dataExtent2}[1])]`\n    };\n  }\n  function shouldBeIntegralBinStep(column) {\n    return column.quantitative && (column.type === \"integer\" && column.stats.max - column.stats.min <= 7);\n  }\n  const bandScaleLinearSuffix = \"_linear\";\n  let Band$1 = class Band extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `band_${this.id}`;\n      this.names = {\n        xScale: `scale_${p}_x`,\n        yScale: `scale_${p}_y`,\n        bandWidth: `${p}_bandwidth`,\n        accumulative: `${p}_accumulative`\n      };\n      this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n    }\n    getGrouping() {\n      return this.bin.fields;\n    }\n    build() {\n      const { bin: bin2, names, props } = this;\n      const { globalScope, minBandWidth, orientation, parentScope, showAxes } = props;\n      const binField = bin2.fields[0];\n      if (bin2.native === false) {\n        addSignals(globalScope.scope, ...bin2.signals);\n        addTransforms(globalScope.data, ...bin2.transforms);\n        addData(globalScope.scope, bin2.dataSequence);\n      }\n      addData(globalScope.scope, {\n        name: names.accumulative,\n        source: bin2.fullScaleDataname,\n        transform: [\n          {\n            type: \"aggregate\",\n            groupby: this.getGrouping().map(safeFieldName),\n            ops: [\"count\"]\n          }\n        ]\n      });\n      const horizontal = orientation === \"horizontal\";\n      const minCellSignal = horizontal ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n      modifySignal(minCellSignal, \"max\", `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n      addSignals(globalScope.scope, {\n        name: names.bandWidth,\n        update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`\n      });\n      const scale2 = this.getScale(bin2, horizontal);\n      if (props.outerSignalExtents && bin2.native === false) {\n        addScales(globalScope.scope, linearScale(scale2.name + bandScaleLinearSuffix, { signal: bin2.extentSignal }, scale2.range, scale2.reverse, false, false));\n      }\n      let encodingRuleMap;\n      if (!props.excludeEncodingRuleMap) {\n        encodingRuleMap = horizontal ? {\n          x: [\n            {\n              test: testForCollapseSelection(),\n              signal: parentScope.offsets.x\n            }\n          ],\n          width: [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            }\n          ]\n        } : {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: addOffsets(parentScope.offsets.y, parentScope.offsets.h)\n            }\n          ],\n          height: [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            }\n          ]\n        };\n      }\n      return {\n        offsets: this.getOffset(horizontal, binField),\n        sizeSignals: horizontal ? {\n          layoutHeight: names.bandWidth,\n          layoutWidth: parentScope.sizeSignals.layoutWidth\n        } : {\n          layoutHeight: parentScope.sizeSignals.layoutHeight,\n          layoutWidth: names.bandWidth\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? void 0 : [scale2],\n            y: horizontal ? [scale2] : void 0\n          }\n        },\n        encodingRuleMap\n      };\n    }\n    getOffset(horizontal, binField) {\n      const { names, props } = this;\n      const { parentScope } = props;\n      return {\n        x: addOffsets(parentScope.offsets.x, horizontal ? \"\" : `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n        y: addOffsets(parentScope.offsets.y, horizontal ? `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])` : \"\"),\n        h: horizontal ? names.bandWidth : parentScope.offsets.h,\n        w: horizontal ? parentScope.offsets.w : names.bandWidth\n      };\n    }\n    getScale(bin2, horizontal) {\n      const { names } = this;\n      const { parentScope } = this.props;\n      const binField = safeFieldName(bin2.fields[0]);\n      let bandScale;\n      if (horizontal) {\n        bandScale = {\n          type: \"band\",\n          name: names.yScale,\n          range: [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutHeight\n            }\n          ],\n          padding: 0.1,\n          domain: {\n            data: bin2.domainDataName,\n            field: binField,\n            sort: true\n          },\n          reverse: true\n        };\n      } else {\n        bandScale = {\n          type: \"band\",\n          name: names.xScale,\n          range: [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutWidth\n            }\n          ],\n          padding: 0.1,\n          domain: {\n            data: bin2.domainDataName,\n            field: binField,\n            sort: true\n          }\n        };\n      }\n      return bandScale;\n    }\n  };\n  function displayBin(bin2) {\n    const val = (index2) => `datum[${JSON.stringify(bin2.fields[index2])}]`;\n    return bin2.discreteColumn.column.quantitative ? `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')` : val(0);\n  }\n  function obj(nameValues, clause) {\n    return `{${nameValues.join()}}`;\n  }\n  function serializeAsVegaExpression(bin2, firstFieldName, lastFieldName, clause) {\n    if (bin2.discreteColumn.column.quantitative) {\n      const low = [\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'>='\",\n        `value:datum[${JSON.stringify(bin2.fields[0])}]`\n      ];\n      const high = [\n        \"clause:'&&'\",\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'<'\",\n        `value:datum[${JSON.stringify(bin2.fields[1])}]`\n      ];\n      return obj([\n        `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`\n      ]);\n    } else {\n      const exact = [\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'=='\",\n        `value:datum[${JSON.stringify(bin2.fields[0])}]`\n      ];\n      return obj([\n        `expressions:[${obj(exact)}]`\n      ]);\n    }\n  }\n  function createOrdinals(source2, prefix, binFields, sortOrder) {\n    const _binFields = binFields.map(safeFieldName);\n    const dataName = `${prefix}_bin_order`;\n    const data2 = {\n      name: dataName,\n      source: source2,\n      transform: [\n        {\n          type: \"aggregate\",\n          groupby: _binFields\n        },\n        {\n          type: \"collect\",\n          sort: {\n            field: _binFields,\n            order: _binFields.map((f) => sortOrder)\n          }\n        },\n        {\n          type: \"window\",\n          ops: [\"row_number\"],\n          as: [FieldNames.Ordinal]\n        }\n      ]\n    };\n    return {\n      data: data2,\n      scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields)\n    };\n  }\n  function ordinalScale(dataName, scaleName, binFields) {\n    return {\n      type: \"ordinal\",\n      name: scaleName,\n      domain: {\n        data: dataName,\n        field: safeFieldName(binFields[0])\n      },\n      range: {\n        data: dataName,\n        field: FieldNames.Ordinal\n      }\n    };\n  }\n  let Cross$1 = class Cross extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `cross_${this.id}`;\n      this.binX = binnable(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n      this.binY = binnable(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n      this.names = {\n        facetDataName: `data_${p}_facet`,\n        searchUnion: `data_${p}_search`,\n        dimScale: `scale_${p}`,\n        dimCount: `${p}_count`,\n        dimCategorical: `data_${p}_cat`,\n        dimCellSize: `${p}_cell_size`,\n        dimCellSizeCalc: `${p}_cell_calc`\n      };\n    }\n    getGrouping() {\n      return this.binX.fields.concat(this.binY.fields);\n    }\n    build() {\n      const { binX, binY, names, prefix, props } = this;\n      const { axisTextColor, colRowTitles, globalScope, parentScope } = props;\n      const titles = { x: { dataName: null, quantitative: null }, y: { dataName: null, quantitative: null } };\n      const dx = {\n        dim: \"x\",\n        bin: binX,\n        sortOrder: \"ascending\",\n        size: parentScope.sizeSignals.layoutWidth,\n        layout: parentScope.sizeSignals.layoutWidth,\n        min: globalScope.signals.minCellWidth.name,\n        out: globalScope.signals.plotWidthOut,\n        offset: SignalNames.FacetPaddingLeft,\n        padding: SignalNames.FacetPaddingLeft,\n        dataOut: null,\n        scaleName: null,\n        position: null\n      };\n      const dy = {\n        dim: \"y\",\n        bin: binY,\n        sortOrder: \"ascending\",\n        size: parentScope.sizeSignals.layoutHeight,\n        layout: parentScope.sizeSignals.layoutHeight,\n        min: globalScope.signals.minCellHeight.name,\n        out: globalScope.signals.plotHeightOut,\n        offset: SignalNames.FacetPaddingTop,\n        padding: `(${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n        dataOut: null,\n        scaleName: null,\n        position: null\n      };\n      const dimensions = [dx, dy];\n      dimensions.forEach((d2) => {\n        const { bin: bin2, dim, padding: padding2, sortOrder } = d2;\n        let data2;\n        let dataName;\n        let countSignal;\n        let scale2;\n        const titleSource = titles[dim];\n        if (bin2.native === false) {\n          addSignals(globalScope.scope, ...bin2.signals);\n          addTransforms(globalScope.data, ...bin2.transforms);\n          addData(globalScope.scope, bin2.dataSequence);\n          addTransforms(bin2.dataSequence, {\n            type: \"formula\",\n            expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin2.fields[0])}, datum[${JSON.stringify(bin2.fields[0])}])`,\n            as: FieldNames.Contains\n          });\n          data2 = bin2.dataSequence;\n          dataName = bin2.dataSequence.name;\n          countSignal = `length(data(${JSON.stringify(dataName)}))`;\n          scale2 = ordinalScale(dataName, `${names.dimScale}_${dim}`, bin2.fields);\n          titleSource.dataName = bin2.dataSequence.name;\n        } else {\n          dataName = globalScope.markDataName;\n          const ord = createOrdinals(dataName, `${prefix}_${dim}`, bin2.fields, sortOrder);\n          data2 = ord.data;\n          addData(globalScope.scope, ord.data);\n          countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n          scale2 = ord.scale;\n          titleSource.dataName = ord.data.name;\n        }\n        titleSource.quantitative = bin2.discreteColumn.column.quantitative;\n        d2.dataOut = data2;\n        d2.scaleName = scale2.name;\n        addTransforms(data2, {\n          type: \"formula\",\n          expr: serializeAsVegaExpression(bin2, FieldNames.First, FieldNames.Last),\n          as: FieldNames.FacetSearch\n        }, {\n          type: \"formula\",\n          expr: displayBin(bin2),\n          as: FieldNames.FacetTitle\n        });\n        addScales(globalScope.scope, scale2);\n        const count2 = `${names.dimCount}_${dim}`;\n        const calc = `${names.dimCellSizeCalc}_${dim}`;\n        const size = `${names.dimCellSize}_${dim}`;\n        addSignals(globalScope.scope, { name: count2, update: countSignal });\n        addSignals(globalScope.scope, {\n          name: calc,\n          update: `${d2.layout} / ${count2}`\n        }, {\n          name: size,\n          update: `max(${d2.min}, (${calc} - ${padding2}))`\n        });\n        modifySignal(d2.out, \"max\", `((${size} + ${padding2}) * ${count2})`);\n        d2.position = this.dimensionOffset(d2);\n      });\n      const groupRow = {\n        type: \"group\",\n        encode: {\n          update: {\n            y: {\n              signal: dy.position\n            }\n          }\n        },\n        from: {\n          data: dy.dataOut.name\n        },\n        data: [\n          {\n            name: names.searchUnion,\n            source: dx.dataOut.name,\n            transform: [\n              {\n                type: \"formula\",\n                expr: `[datum[${JSON.stringify(FieldNames.FacetSearch)}], merge(parent[${JSON.stringify(FieldNames.FacetSearch)}], { clause: '&&'})]`,\n                as: FieldNames.FacetSearch\n              }\n            ]\n          }\n        ]\n      };\n      const groupCol = {\n        style: \"cell\",\n        name: prefix,\n        type: \"group\",\n        encode: {\n          update: {\n            height: {\n              signal: `${names.dimCellSize}_y`\n            },\n            width: {\n              signal: `${names.dimCellSize}_x`\n            },\n            x: {\n              signal: dx.position\n            }\n          }\n        },\n        from: {\n          data: names.searchUnion\n        }\n      };\n      addMarks(globalScope.markGroup, groupRow);\n      addMarks(groupRow, groupCol);\n      const offsets2 = {\n        x: this.dimensionOffset(dx),\n        y: this.dimensionOffset(dy),\n        h: `${names.dimCellSize}_y`,\n        w: `${names.dimCellSize}_x`\n      };\n      const sizeSignals = {\n        layoutHeight: `${names.dimCellSize}_y`,\n        layoutWidth: `${names.dimCellSize}_x`,\n        colCount: `${names.dimCount}_x`,\n        rowCount: `${names.dimCount}_y`\n      };\n      if (colRowTitles) {\n        addFacetColRowTitles(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n      }\n      return {\n        facetScope: groupCol,\n        offsets: offsets2,\n        sizeSignals,\n        titles\n      };\n    }\n    dimensionOffset(d2) {\n      const { names } = this;\n      return `${d2.offset} + (scale(${JSON.stringify(d2.scaleName)}, datum[${JSON.stringify(d2.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d2.dim} + ${d2.padding})`;\n    }\n  };\n  let Scatter$1 = class Scatter extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `scatter_${this.id}`;\n      this.names = {\n        aggregateData: `data_${p}_aggregate`,\n        markData: `data_${p}_mark`,\n        xDataExtent: `${p}_xDataExtent`,\n        yDataExtent: `${p}_yDataExtent`,\n        xExtent: `${p}_xExtent`,\n        yExtent: `${p}_yExtent`,\n        sizeExtent: `${p}_sizeExtent`,\n        sizeRange: `${p}_sizeRange`,\n        sizeScale: `${p}_sizeScale`,\n        xScale: `scale_${p}_x`,\n        yScale: `scale_${p}_y`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { backgroundImageExtents, globalScope, parentScope, scatterPointScaleDisplay, showAxes, size, view, x: x2, y: y2, z: z2, zGrounded } = props;\n      const qsize = size && size.quantitative && size;\n      addSignals(globalScope.scope, {\n        name: SignalNames.PointScale,\n        value: 5,\n        bind: {\n          name: scatterPointScaleDisplay,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 1,\n          max: 10,\n          step: 0.1\n        }\n      }, {\n        name: SignalNames.ZGrounded,\n        value: false,\n        bind: {\n          name: zGrounded,\n          input: \"checkbox\"\n        }\n      });\n      if (backgroundImageExtents) {\n        addTransforms(globalScope.data, dataExtent(x2, names.xDataExtent), dataExtent(y2, names.yDataExtent));\n        const xSignal = outerExtentSignal(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n        const ySignal = outerExtentSignal(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n        addSignals(globalScope.scope, xSignal, ySignal);\n      }\n      if (qsize) {\n        addTransforms(globalScope.data, {\n          type: \"extent\",\n          field: safeFieldName(qsize.name),\n          signal: names.sizeExtent\n        });\n        addScales(globalScope.scope, {\n          name: names.sizeScale,\n          type: \"pow\",\n          exponent: 0.5,\n          domain: [0, { signal: `${names.sizeExtent}[1]` }],\n          range: [0, { signal: names.sizeRange }]\n        });\n        addSignals(globalScope.scope, {\n          name: names.sizeRange,\n          update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${scatterSizedDiv}`\n        });\n      }\n      addData(globalScope.scope, {\n        name: names.markData,\n        source: globalScope.markDataName,\n        transform: [x2, y2, z2].map((c2) => {\n          if (!c2 || !c2.quantitative)\n            return;\n          const t = {\n            type: \"filter\",\n            expr: `isValid(datum[${JSON.stringify(c2.name)}])`\n          };\n          return t;\n        }).filter(Boolean)\n      });\n      globalScope.setMarkDataName(names.markData);\n      const globalScales = { showAxes, scales: {} };\n      const zValue = z2 ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z2.name)}])` : null;\n      const sizeValueSignal = qsize ? `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${SignalNames.PointScale}` : SignalNames.PointScale;\n      const update2 = Object.assign({ height: [\n        {\n          test: testForCollapseSelection(),\n          value: 0\n        },\n        {\n          signal: sizeValueSignal\n        }\n      ], width: {\n        signal: sizeValueSignal\n      } }, z2 && {\n        z: [\n          {\n            test: testForCollapseSelection(),\n            value: 0\n          },\n          {\n            signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`\n          }\n        ],\n        zindex: [\n          {\n            signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`\n          }\n        ],\n        depth: [\n          {\n            test: testForCollapseSelection(),\n            value: 0\n          },\n          {\n            signal: view === \"3d\" ? `${SignalNames.ZGrounded} ? ${zValue} : ${sizeValueSignal}` : \"0\"\n          }\n        ]\n      });\n      const columnSignals = [\n        {\n          column: x2,\n          xyz: \"x\",\n          scaleName: names.xScale,\n          domain: backgroundImageExtents ? {\n            signal: names.xExtent\n          } : {\n            data: globalScope.data.name,\n            field: safeFieldName(x2.name)\n          },\n          reverse: false,\n          signal: parentScope.sizeSignals.layoutWidth\n        },\n        {\n          column: y2,\n          xyz: \"y\",\n          scaleName: names.yScale,\n          domain: backgroundImageExtents ? {\n            signal: names.yExtent\n          } : {\n            data: globalScope.data.name,\n            field: safeFieldName(y2.name)\n          },\n          reverse: true,\n          signal: parentScope.sizeSignals.layoutHeight\n        },\n        {\n          column: z2,\n          xyz: \"z\",\n          scaleName: names.zScale,\n          domain: {\n            data: globalScope.data.name,\n            field: z2 ? safeFieldName(z2.name) : null\n          },\n          reverse: false,\n          signal: view === \"3d\" ? `(${globalScope.zSize}) * ${SignalNames.ZProportion}` : `10 * ${SignalNames.ZProportion}`\n        }\n      ];\n      columnSignals.forEach((cs) => {\n        const { column, domain: domain2, reverse: reverse2, scaleName, signal, xyz } = cs;\n        if (!column)\n          return;\n        let scale2;\n        if (column.quantitative) {\n          scale2 = linearScale(scaleName, domain2, [0, { signal }], reverse2, false, showAxes);\n          if (shouldBeIntegralBinStep(column)) {\n            scale2.bins = { step: 1 };\n          }\n        } else {\n          scale2 = pointScale(scaleName, globalScope.data.name, [0, { signal }], column.name, reverse2);\n        }\n        globalScales.scales[xyz] = [scale2];\n      });\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: globalScope.markDataName },\n        encode: { update: update2 }\n      };\n      addMarks(globalScope.markGroup, mark);\n      return {\n        offsets: {\n          x: addOffsets(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x2.name)}])`),\n          y: addOffsets(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y2.name)}]) - ${sizeValueSignal}`),\n          h: sizeValueSignal,\n          w: sizeValueSignal\n        },\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        globalScales,\n        mark,\n        encodingRuleMap: {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: addOffsets(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight)\n            }\n          ]\n        }\n      };\n    }\n  };\n  function addZScale(z2, zSize, dataName, zScaleName) {\n    if (z2) {\n      const zRange = [0, { signal: `(${zSize}) * ${SignalNames.ZProportion}` }];\n      const scale2 = z2.quantitative ? linearScale(zScaleName, {\n        data: dataName,\n        field: safeFieldName(z2.name)\n      }, zRange, false, true) : pointScale(zScaleName, dataName, zRange, z2.name, false);\n      return scale2;\n    }\n  }\n  class Square extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `square_${this.id}`;\n      this.names = {\n        bandWidth: this.getBandWidth(),\n        maxGroupField: `${p}_max_group`,\n        maxGroupSignal: `${p}_max_grouping`,\n        stack0: `${p}_stack0`,\n        stack1: `${p}_stack1`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { fillDirection, globalScope, groupings, parentScope, collapseYHeight, showAxes, sortBy, view, z: z2 } = props;\n      const zScale = addZScale(z2, globalScope.zSize, globalScope.data.name, names.zScale);\n      addTransforms(globalScope.data, Object.assign({ type: \"stack\", groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sortBy && {\n        sort: {\n          field: safeFieldName(sortBy.name),\n          order: \"ascending\"\n        }\n      }));\n      const { gap, levelSize, size, squaresPerBand } = this.addSignals();\n      const heightSignal = {\n        signal: fillDirection === \"down-right\" ? size : levelSize\n      };\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: {\n          data: globalScope.markDataName\n        },\n        encode: {\n          update: Object.assign({ height: collapseYHeight ? [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            },\n            heightSignal\n          ] : heightSignal, width: {\n            signal: fillDirection === \"down-right\" ? levelSize : size\n          } }, z2 && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z2.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      const { tx: tx2, ty: ty2 } = this.transformXY(gap, levelSize, squaresPerBand);\n      return Object.assign(Object.assign(Object.assign({}, z2 && {\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        }\n      }), { offsets: {\n        x: addOffsets(parentScope.offsets.x, tx2.expr),\n        y: addOffsets(parentScope.offsets.y, ty2.expr),\n        h: size,\n        w: size\n      }, mark, sizeSignals: {\n        layoutHeight: size,\n        layoutWidth: size\n      } }), collapseYHeight && {\n        encodingRuleMap: {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: parentScope.offsets.y\n            }\n          ]\n        }\n      });\n    }\n    getBandWidth() {\n      const { offsets: offsets2 } = this.props.parentScope;\n      switch (this.props.fillDirection) {\n        case \"down-right\":\n          return offsets2.h;\n        default:\n          return offsets2.w;\n      }\n    }\n    addSignals() {\n      const { names, props } = this;\n      const { fillDirection, globalScope, groupings, parentScope } = props;\n      let { maxGroupedFillSize, maxGroupedUnits } = props;\n      if (!maxGroupedUnits) {\n        if (groupings) {\n          addTransforms(globalScope.data, {\n            type: \"joinaggregate\",\n            groupby: getGroupBy(groupings).map(safeFieldName),\n            ops: [\"count\"],\n            as: [names.maxGroupField]\n          }, {\n            type: \"extent\",\n            field: names.maxGroupField,\n            signal: names.maxGroupSignal\n          });\n          maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n        } else {\n          maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n        }\n      }\n      if (!maxGroupedFillSize) {\n        maxGroupedFillSize = fillDirection === \"down-right\" ? parentScope.offsets.w : parentScope.offsets.h;\n      }\n      const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n      const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n      const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n      const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n      const levels2 = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n      const levelSize = `(((${maxGroupedFillSize}) / ${levels2}) - ${gap})`;\n      return { gap, levelSize, size, squaresPerBand };\n    }\n    transformXY(gap, levelSize, squaresPerBand) {\n      const { names, prefix } = this;\n      const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n      const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n      const { fillDirection, parentScope } = this.props;\n      const tx2 = {\n        type: \"formula\",\n        expr: null,\n        as: `${prefix}_${FieldNames.OffsetX}`\n      };\n      const ty2 = {\n        type: \"formula\",\n        expr: null,\n        as: `${prefix}_${FieldNames.OffsetY}`\n      };\n      switch (fillDirection) {\n        case \"down-right\": {\n          tx2.expr = `${level} * (${levelSize} + ${gap})`;\n          ty2.expr = compartment;\n          break;\n        }\n        case \"right-up\": {\n          tx2.expr = compartment;\n          ty2.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n          break;\n        }\n        case \"right-down\":\n        default: {\n          tx2.expr = compartment;\n          ty2.expr = `${level} * (${levelSize} + ${gap})`;\n          break;\n        }\n      }\n      return { tx: tx2, ty: ty2 };\n    }\n  }\n  let Stack$1 = class Stack extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `stack_${this.id}`;\n      this.names = {\n        cube: `${p}_cube`,\n        globalDataName: `data_${p}_count`,\n        globalExtent: `${p}_global_extent`,\n        levelDataName: `data_${p}_level`,\n        count: `${p}_count`,\n        stack0: `${p}_stack0`,\n        stack1: `${p}_stack1`,\n        sequence: `data_${p}_sequence`,\n        sides: `${p}_sides`,\n        size: `${p}_size`,\n        squared: `${p}_squared`,\n        maxCount: `${p}_maxCount`,\n        maxLevels: `${p}_maxLevels`,\n        zScale: `${p}_zScale`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { globalScope, groupings, parentScope, showAxes, sort: sort2 } = props;\n      const { sizeSignals } = parentScope;\n      addTransforms(globalScope.data, {\n        type: \"joinaggregate\",\n        groupby: getGroupBy(groupings).map(safeFieldName),\n        ops: [\"count\"],\n        as: [names.count]\n      }, {\n        type: \"extent\",\n        field: names.count,\n        signal: names.globalExtent\n      }, Object.assign({ type: \"stack\", groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sort2 && {\n        sort: {\n          field: safeFieldName(sort2.name),\n          order: \"ascending\"\n        }\n      }));\n      addData(globalScope.scope, {\n        name: names.sequence,\n        transform: [\n          {\n            type: \"sequence\",\n            start: 1,\n            stop: {\n              signal: `sqrt(${names.globalExtent}[1])`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.data * datum.data\",\n            as: \"squared\"\n          },\n          {\n            type: \"formula\",\n            expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n            as: \"maxlevels\"\n          },\n          {\n            type: \"formula\",\n            expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n            as: \"side\"\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.side * datum.maxlevels + datum.maxlevels - 1\",\n            as: \"sidecubeheight\"\n          },\n          {\n            type: \"formula\",\n            expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n            as: \"heightmatch\"\n          },\n          {\n            type: \"collect\",\n            sort: {\n              field: \"heightmatch\",\n              order: \"ascending\"\n            }\n          },\n          {\n            type: \"window\",\n            ops: [\"row_number\"]\n          },\n          {\n            type: \"filter\",\n            expr: \"datum.row_number === 1\"\n          }\n        ]\n      });\n      addSignals(globalScope.scope, {\n        name: names.size,\n        update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`\n      }, {\n        name: names.squared,\n        update: `data('${names.sequence}')[0].squared`\n      }, {\n        name: names.sides,\n        update: `sqrt(${names.squared})`\n      }, {\n        name: names.cube,\n        update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`\n      }, {\n        name: names.maxLevels,\n        update: `data('${names.sequence}')[0].maxlevels`\n      }, {\n        name: names.maxCount,\n        update: `${names.maxLevels} * ${names.squared}`\n      });\n      const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n      const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n      const cubeX = `(${layerOrdinal} % ${names.sides})`;\n      const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n      const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n      const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n        y: addOffsets(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n        h: names.size,\n        w: names.size\n      };\n      const mark = {\n        type: \"rect\",\n        from: { data: this.names.levelDataName },\n        encode: {\n          update: {\n            z: {\n              signal: `${zLevel} * (${names.cube} + 1)`\n            },\n            height: {\n              signal: names.cube\n            },\n            width: {\n              signal: names.cube\n            },\n            depth: {\n              signal: names.cube\n            }\n          }\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      const zScale = {\n        type: \"linear\",\n        name: names.zScale,\n        domain: [\n          0,\n          {\n            signal: names.maxCount\n          }\n        ],\n        range: [\n          0,\n          {\n            signal: `${names.maxLevels} * (${names.cube} + 1) - 1`\n          }\n        ],\n        nice: false\n      };\n      return {\n        offsets: offsets2,\n        mark,\n        sizeSignals: {\n          layoutHeight: names.size,\n          layoutWidth: names.size\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        },\n        encodingRuleMap: {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: parentScope.offsets.y\n          }],\n          z: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }],\n          depth: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n  };\n  class Strip extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `strip_${this.id}`;\n      this.names = {\n        firstField: `${p}${FieldNames.First}`,\n        lastField: `${p}${FieldNames.Last}`,\n        valueField: `${p}${FieldNames.Value}`,\n        scale: `scale_${p}`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { addPercentageScale, globalScope, groupings, orientation, showAxes, size, sort: sort2, sortOrder, parentScope, view, z: z2 } = props;\n      const zScale = addZScale(z2, globalScope.zSize, globalScope.data.name, names.zScale);\n      const horizontal = orientation === \"horizontal\";\n      const transform2 = [];\n      if (sort2) {\n        transform2.push({\n          type: \"collect\",\n          sort: {\n            field: safeFieldName(sort2.name),\n            order: sortOrder\n          }\n        });\n      }\n      let stackField;\n      if (size) {\n        stackField = size.name;\n        transform2.push({\n          type: \"filter\",\n          expr: `datum[${JSON.stringify(size.name)}] > 0`\n        });\n      } else {\n        stackField = names.valueField;\n        transform2.push({\n          type: \"formula\",\n          expr: \"1\",\n          as: stackField\n        });\n      }\n      const stackTransform = {\n        type: \"stack\",\n        field: safeFieldName(stackField),\n        offset: \"normalize\",\n        as: [names.firstField, names.lastField]\n      };\n      if (groupings.length) {\n        stackTransform.groupby = getGroupBy(groupings).map(safeFieldName);\n      }\n      transform2.push(stackTransform);\n      addTransforms(globalScope.data, ...transform2);\n      const span2 = [names.lastField, names.firstField].map((f) => `datum[${JSON.stringify(f)}]`).join(\" - \");\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, horizontal ? `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})` : \"\"),\n        y: addOffsets(parentScope.offsets.y, horizontal ? \"\" : `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n        h: horizontal ? parentScope.offsets.h : `(${span2}) * (${parentScope.offsets.h})`,\n        w: horizontal ? `(${span2}) * (${parentScope.offsets.w})` : parentScope.offsets.w\n      };\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: globalScope.markDataName },\n        encode: {\n          update: Object.assign({ height: {\n            signal: offsets2.h\n          }, width: {\n            signal: offsets2.w\n          } }, z2 && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z2.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      let percentageScale;\n      if (addPercentageScale) {\n        percentageScale = [{\n          type: \"linear\",\n          name: names.scale,\n          domain: [0, 100],\n          range: horizontal ? [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutWidth\n            }\n          ] : [\n            {\n              signal: parentScope.sizeSignals.layoutHeight\n            },\n            0\n          ]\n        }];\n      }\n      return {\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? percentageScale : void 0,\n            y: horizontal ? void 0 : percentageScale,\n            z: zScale && [zScale]\n          }\n        },\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        mark\n      };\n    }\n  }\n  let Treemap$1 = class Treemap extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `treemap_${this.id}`;\n      this.names = {\n        dataName: `data_${p}`,\n        dataHeightWidth: `data_${p}_hw`,\n        dataExtents: `data_${p}_extents`,\n        dataFacet: `data_${p}_facet`,\n        dataFacetMark: `data_${p}_facetMark`,\n        fieldChildren: `${p}_children`,\n        fieldDepth: `${p}_depth`,\n        fieldX0: `${p}_x0`,\n        fieldX1: `${p}_x1`,\n        fieldY0: `${p}_y0`,\n        fieldY1: `${p}_y1`,\n        fieldHeight: `${p}_h`,\n        fieldWidth: `${p}_w`,\n        heightExtent: `${p}_heightExtent`,\n        widthExtent: `${p}_widthExtent`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { globalScope, parentScope, showAxes, treeMapMethod, z: z2 } = props;\n      const zScale = addZScale(z2, globalScope.zSize, globalScope.data.name, names.zScale);\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, fn(names.fieldX0)),\n        y: addOffsets(parentScope.offsets.y, fn(names.fieldY0)),\n        h: subtract$1(names.fieldY1, names.fieldY0),\n        w: subtract$1(names.fieldX1, names.fieldX0)\n      };\n      const mark = this.transformedMark(offsets2);\n      addSignals(globalScope.scope, {\n        name: SignalNames.TreeMapMethod,\n        value: \"squarify\",\n        bind: {\n          name: treeMapMethod,\n          input: \"select\",\n          options: [\n            \"squarify\",\n            \"binary\"\n          ]\n        }\n      });\n      return Object.assign(Object.assign({}, z2 && {\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        }\n      }), {\n        mark,\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        }\n      });\n    }\n    transformedMark(offsets2) {\n      const { names, props } = this;\n      const { globalScope, groupings, parentScope } = props;\n      if (groupings.length) {\n        addData(globalScope.scope, {\n          name: names.dataHeightWidth,\n          source: globalScope.markDataName,\n          transform: [\n            {\n              type: \"formula\",\n              expr: parentScope.offsets.h,\n              as: names.fieldHeight\n            },\n            {\n              type: \"formula\",\n              expr: parentScope.offsets.w,\n              as: names.fieldWidth\n            }\n          ]\n        });\n        const treemapData = {\n          name: names.dataFacetMark,\n          source: names.dataFacet\n        };\n        const facets = {\n          type: \"group\",\n          from: {\n            facet: {\n              name: names.dataFacet,\n              data: names.dataHeightWidth,\n              groupby: getGroupBy(groupings).map(safeFieldName)\n            }\n          },\n          data: [\n            {\n              name: names.dataExtents,\n              source: names.dataFacet,\n              transform: [\n                {\n                  type: \"extent\",\n                  field: names.fieldHeight,\n                  signal: names.heightExtent\n                },\n                {\n                  type: \"extent\",\n                  field: names.fieldWidth,\n                  signal: names.widthExtent\n                }\n              ]\n            },\n            treemapData\n          ]\n        };\n        globalScope.setMarkDataName(names.dataFacetMark);\n        addMarks(globalScope.markGroup, facets);\n        globalScope.setMarkGroup(facets);\n        this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n        return this.addMark(offsets2, facets, globalScope.markDataName);\n      } else {\n        this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n        return this.addMark(offsets2, globalScope.markGroup, globalScope.markDataName);\n      }\n    }\n    addMark(offsets2, markParent, markDataName) {\n      const { names, prefix, props } = this;\n      const { view, z: z2 } = props;\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: markDataName },\n        encode: {\n          update: Object.assign({ width: {\n            signal: offsets2.w\n          }, height: {\n            signal: offsets2.h\n          } }, z2 && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z2.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(markParent, mark);\n      return mark;\n    }\n    treemapTransform(treemapData, widthSignal, heightSignal) {\n      const { names, props } = this;\n      const { group: group2, size } = props;\n      addTransforms(treemapData, {\n        type: \"filter\",\n        expr: `datum[${JSON.stringify(size.name)}] > 0`\n      }, {\n        type: \"nest\",\n        keys: [group2 && group2.name || \"__NONE__\"]\n      }, {\n        type: \"treemap\",\n        field: safeFieldName(size.name),\n        sort: { field: \"value\", order: \"descending\" },\n        round: true,\n        method: { signal: SignalNames.TreeMapMethod },\n        paddingInner: 1,\n        paddingOuter: 0,\n        size: [\n          { signal: widthSignal },\n          { signal: heightSignal }\n        ],\n        as: [\n          names.fieldX0,\n          names.fieldY0,\n          names.fieldX1,\n          names.fieldY1,\n          names.fieldDepth,\n          names.fieldChildren\n        ]\n      });\n    }\n  };\n  function fn(n) {\n    return `datum[${JSON.stringify(n)}]`;\n  }\n  function subtract$1(...fields) {\n    return fields.map((n) => fn(n)).join(\" - \");\n  }\n  class Wrap extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `wrap_${this.id}`;\n      this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n      this.names = {\n        outputData: `data_${p}_out`,\n        rowColumnDataName: `data_${p}_row_col`,\n        cellHeight: `${p}_cellHeight`,\n        cellWidth: `${p}_cellWidth`,\n        fits: `${p}_fits`,\n        target: `${p}_target`,\n        minArea: `${p}_minArea`,\n        aspect: `${p}_aspect`,\n        minAspect: `${p}_minAspect`,\n        idealAspect: `${p}_idealAspect`,\n        dataLength: `${p}_dataLength`,\n        rxc0: `${p}_rxc0`,\n        rxc1: `${p}_rxc1`,\n        rxc2: `${p}_rxc2`,\n        rxc: `${p}_rxc`,\n        growColCount: `${p}_growColCount`,\n        growCellWidth: `${p}_growCellWidth`,\n        fitsArea: `${p}_fitsArea`,\n        colCount: `${p}_colCount`\n      };\n    }\n    getGrouping() {\n      return this.bin.fields;\n    }\n    build() {\n      const { bin: bin2, names, prefix, props } = this;\n      const { axisTextColor, cellTitles, globalScope, parentScope } = props;\n      let ordinalBinData;\n      if (bin2.native === false) {\n        addSignals(globalScope.scope, ...bin2.signals);\n        addTransforms(globalScope.data, ...bin2.transforms);\n        addData(globalScope.scope, bin2.dataSequence);\n        addTransforms(bin2.dataSequence, {\n          type: \"formula\",\n          expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin2.fields[0])}, datum[${JSON.stringify(bin2.fields[0])}])`,\n          as: FieldNames.Contains\n        });\n        ordinalBinData = bin2.dataSequence.name;\n      } else {\n        const ord = createOrdinals(globalScope.data.name, prefix, bin2.fields, \"ascending\");\n        addData(globalScope.scope, ord.data);\n        ordinalBinData = ord.data.name;\n      }\n      addData(globalScope.scope, {\n        name: names.rxc0,\n        transform: [\n          {\n            type: \"sequence\",\n            start: 1,\n            stop: {\n              signal: `ceil(sqrt(${names.dataLength})) + 1`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: `ceil(${names.dataLength} / datum.data)`,\n            as: \"complement\"\n          }\n        ]\n      }, {\n        name: names.rxc1,\n        source: names.rxc0,\n        transform: [\n          {\n            type: \"project\",\n            fields: [\"data\"],\n            as: [\"cols\"]\n          }\n        ]\n      }, {\n        name: names.rxc2,\n        source: names.rxc0,\n        transform: [\n          {\n            type: \"project\",\n            fields: [\"complement\"],\n            as: [\"cols\"]\n          }\n        ]\n      }, {\n        name: names.rxc,\n        source: [names.rxc1, names.rxc2],\n        transform: [\n          {\n            type: \"formula\",\n            expr: `ceil(${names.dataLength} / datum.cols)`,\n            as: \"rows\"\n          },\n          {\n            type: \"formula\",\n            expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n            as: \"cellw\"\n          },\n          {\n            type: \"formula\",\n            expr: `datum.cols === 1 ? max(datum.cellw, ${SignalNames.MinCellWidth}) : datum.cellw`,\n            as: \"cellw\"\n          },\n          {\n            type: \"formula\",\n            expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n            as: \"cellh\"\n          },\n          {\n            type: \"formula\",\n            expr: `datum.rows === 1 ? max(datum.cellh, ${SignalNames.MinCellHeight}) : datum.cellh`,\n            as: \"cellh\"\n          },\n          {\n            type: \"formula\",\n            expr: `(datum.cellw >= ${SignalNames.MinCellWidth} && datum.cellh >= ${SignalNames.MinCellHeight})`,\n            as: \"meetsmin\"\n          },\n          {\n            type: \"filter\",\n            expr: \"datum.meetsmin\"\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.cellw / datum.cellh\",\n            as: names.aspect\n          },\n          {\n            type: \"formula\",\n            expr: `abs(datum.${names.aspect} - ${names.target})`,\n            as: names.idealAspect\n          },\n          {\n            type: \"formula\",\n            expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n            as: \"coverage\"\n          },\n          {\n            type: \"collect\",\n            sort: {\n              field: [names.idealAspect, \"coverage\"],\n              order: [\"ascending\", \"descending\"]\n            }\n          }\n        ]\n      }, {\n        name: names.rowColumnDataName,\n        source: ordinalBinData,\n        transform: [\n          {\n            type: \"formula\",\n            expr: `floor((datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) / ${names.colCount})`,\n            as: FieldNames.WrapRow\n          },\n          {\n            type: \"formula\",\n            expr: `(datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) % ${names.colCount}`,\n            as: FieldNames.WrapCol\n          },\n          {\n            type: \"formula\",\n            expr: serializeAsVegaExpression(bin2, FieldNames.First, FieldNames.Last),\n            as: FieldNames.FacetSearch\n          },\n          {\n            type: \"formula\",\n            expr: displayBin(bin2),\n            as: FieldNames.FacetTitle\n          }\n        ]\n      });\n      const dataOut = {\n        name: names.outputData,\n        source: globalScope.data.name,\n        transform: [\n          {\n            type: \"lookup\",\n            from: names.rowColumnDataName,\n            key: safeFieldName(bin2.fields[0]),\n            fields: [bin2.fields[0]].map(safeFieldName),\n            values: [FieldNames.WrapRow, FieldNames.WrapCol]\n          }\n        ]\n      };\n      addData(globalScope.scope, dataOut);\n      globalScope.setMarkDataName(names.outputData);\n      addSignals(globalScope.scope, {\n        name: names.minAspect,\n        update: `${SignalNames.MinCellWidth} / ${SignalNames.MinCellHeight}`\n      }, {\n        name: names.target,\n        update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`\n      }, {\n        name: names.minArea,\n        update: `${SignalNames.MinCellWidth}*${SignalNames.MinCellHeight}`\n      }, {\n        name: names.aspect,\n        update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`\n      }, {\n        name: names.dataLength,\n        update: `data(${JSON.stringify(ordinalBinData)}).length`\n      }, {\n        name: names.growColCount,\n        update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${SignalNames.MinCellWidth}), 1)`\n      }, {\n        name: names.growCellWidth,\n        update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`\n      }, {\n        name: names.fitsArea,\n        update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`\n      }, {\n        name: names.fits,\n        update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`\n      }, {\n        name: names.colCount,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`\n      }, {\n        name: names.cellWidth,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`\n      }, {\n        name: names.cellHeight,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${SignalNames.MinCellHeight}`\n      });\n      modifySignal(globalScope.signals.plotHeightOut, \"max\", `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n      modifySignal(globalScope.signals.plotWidthOut, \"max\", `(${names.cellWidth} * ${names.colCount})`);\n      const signalH = [names.cellHeight, SignalNames.FacetPaddingTop, SignalNames.FacetPaddingBottom].join(\" - \");\n      const signalW = [names.cellWidth, SignalNames.FacetPaddingLeft].join(\" - \");\n      const signalX = addOffsets(parentScope.offsets.x, `datum[${JSON.stringify(FieldNames.WrapCol)}] * ${names.cellWidth}`, SignalNames.FacetPaddingLeft);\n      const signalY = addOffsets(parentScope.offsets.y, `datum[${JSON.stringify(FieldNames.WrapRow)}] * ${names.cellHeight}`, SignalNames.FacetPaddingTop);\n      const update2 = {\n        height: {\n          signal: signalH\n        },\n        width: {\n          signal: signalW\n        },\n        x: {\n          signal: signalX\n        },\n        y: {\n          signal: signalY\n        }\n      };\n      const offsets2 = {\n        x: signalX,\n        y: signalY,\n        h: signalH,\n        w: signalW\n      };\n      const group2 = {\n        style: \"cell\",\n        name: prefix,\n        type: \"group\",\n        from: {\n          data: names.rowColumnDataName\n        },\n        encode: { update: update2 }\n      };\n      addMarks(globalScope.markGroup, group2);\n      const sizeSignals = {\n        layoutHeight: `(${names.cellHeight} - ${SignalNames.FacetPaddingTop} - ${SignalNames.FacetPaddingBottom})`,\n        layoutWidth: `(${names.cellWidth} - ${SignalNames.FacetPaddingLeft})`,\n        colCount: names.colCount,\n        rowCount: `ceil(${names.dataLength} / ${names.colCount})`\n      };\n      if (cellTitles) {\n        addFacetCellTitles(group2, sizeSignals, axisTextColor);\n      }\n      return {\n        facetScope: group2,\n        sizeSignals,\n        offsets: offsets2\n      };\n    }\n  }\n  const layoutClasses = {\n    AggregateContainer,\n    AggregateSquare,\n    Band: Band$1,\n    Cross: Cross$1,\n    Scatter: Scatter$1,\n    Square,\n    Stack: Stack$1,\n    Strip,\n    Treemap: Treemap$1,\n    Wrap\n  };\n  function getImageMark(backgroundImage, allGlobalScales) {\n    const xScale = allGlobalScales.filter((s2) => s2.scales.x)[0].scales.x[0];\n    const yScale = allGlobalScales.filter((s2) => s2.scales.y)[0].scales.y[0];\n    const [xScaleName, yScaleName] = [xScale, yScale].map((s2) => s2.name + (xScale.type === \"band\" ? bandScaleLinearSuffix : \"\"));\n    return {\n      type: \"image\",\n      encode: {\n        update: {\n          url: {\n            value: backgroundImage.url\n          },\n          aspect: {\n            value: false\n          },\n          baseline: {\n            value: \"bottom\"\n          },\n          height: {\n            signal: getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top)\n          },\n          y: {\n            signal: getScaledValue(yScaleName, backgroundImage.extents.bottom)\n          },\n          width: {\n            signal: getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left)\n          },\n          x: {\n            signal: getScaledValue(xScaleName, backgroundImage.extents.left)\n          }\n        }\n      }\n    };\n  }\n  function getScaledSpan(scaleName, low, high) {\n    return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n  }\n  function getScaledValue(scaleName, value2) {\n    return `scale('${scaleName}', ${value2})`;\n  }\n  class SpecBuilder {\n    constructor(props, specContext) {\n      this.props = props;\n      this.specContext = specContext;\n      this.globalSignals = {\n        facetAxesAdjustX: { name: SignalNames.FacetAxesAdjustX, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingLeft.toString() : \"0\" },\n        facetAxesAdjustY: { name: SignalNames.FacetAxesAdjustY, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingBottom.toString() : \"0\" },\n        minCellWidth: {\n          name: SignalNames.MinCellWidth,\n          update: `${minFacetWidth}`\n        },\n        minCellHeight: { name: SignalNames.MinCellHeight, update: `${minFacetHeight}` },\n        plotOffsetLeft: { name: SignalNames.PlotOffsetLeft, update: \"0\" },\n        plotOffsetTop: { name: SignalNames.PlotOffsetTop, update: \"0\" },\n        plotOffsetBottom: { name: SignalNames.PlotOffsetBottom, update: \"0\" },\n        plotOffsetRight: { name: SignalNames.PlotOffsetRight, update: \"0\" },\n        plotHeightOut: { name: SignalNames.PlotHeightOut, update: SignalNames.PlotHeightIn },\n        plotWidthOut: { name: SignalNames.PlotWidthOut, update: SignalNames.PlotWidthIn }\n      };\n    }\n    validate() {\n      const { specContext } = this;\n      const { specCapabilities } = this.props;\n      const { roles } = specCapabilities;\n      const required2 = roles.filter((r) => {\n        switch (typeof r.allowNone) {\n          case \"boolean\":\n            return !r.allowNone;\n          case \"undefined\":\n            return true;\n          case \"function\":\n            return !r.allowNone(specContext);\n        }\n      });\n      const numeric = roles.filter((r) => r.excludeCategoric);\n      const errors = required2.map((r) => {\n        if (specContext.specColumns[r.role]) {\n          return null;\n        } else {\n          return `Field ${r.role} is required.`;\n        }\n      }).concat(numeric.map((r) => {\n        if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) {\n          return `Field ${r.role} must be quantitative.`;\n        } else {\n          return null;\n        }\n      })).filter(Boolean);\n      const { backgroundImage } = specContext.insight;\n      if (backgroundImage && !backgroundImage.extents) {\n        errors.push(\"BackgroundImage must have extents.\");\n      }\n      return errors;\n    }\n    build() {\n      var _a2, _b2;\n      const { globalSignals, specContext } = this;\n      const { facetLayout, specCapabilities } = this.props;\n      const { insight, specColumns, specViewOptions } = specContext;\n      const dataName = \"data_source\";\n      const { vegaSpec, groupMark } = this.initSpec(dataName);\n      const { topColorField, colorDataName } = addColor({\n        scope: vegaSpec,\n        dataName,\n        specContext,\n        scaleName: ScaleNames.Color,\n        legendDataName: \"data_legend\",\n        topLookupName: \"data_topcolorlookup\",\n        colorReverseSignalName: SignalNames.ColorReverse\n      });\n      const globalScope = new GlobalScope({\n        dataName: colorDataName,\n        markGroup: groupMark,\n        scope: vegaSpec,\n        signals: globalSignals\n      });\n      if (facetLayout) {\n        addSignals(vegaSpec, {\n          name: SignalNames.FacetPaddingBottom,\n          update: `${facetLayout.facetPadding.bottom}`\n        }, {\n          name: SignalNames.FacetPaddingLeft,\n          update: `${facetLayout.facetPadding.left}`\n        }, {\n          name: SignalNames.FacetPaddingTop,\n          update: `${facetLayout.facetPadding.top}`\n        });\n        globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n        globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n      }\n      const { firstScope, finalScope, specResult, allGlobalScales, allEncodingRules } = this.iterateLayouts(globalScope, (i, innerScope) => {\n        if (facetLayout && i === 0) {\n          globalScope.zSize = innerScope.offsets.h;\n        }\n      });\n      if (specResult) {\n        return specResult;\n      }\n      if (allGlobalScales.length > 0) {\n        const plotHeightOut = globalSignals.plotHeightOut.name;\n        const plotWidthOut = globalSignals.plotWidthOut.name;\n        const colTitleScale = {\n          type: \"linear\",\n          name: \"scale_facet_col_title\",\n          domain: [0, 1],\n          range: [0, { signal: plotWidthOut }]\n        };\n        const rowTitleScale = {\n          type: \"linear\",\n          name: \"scale_facet_row_title\",\n          domain: [0, 1],\n          range: [{ signal: plotHeightOut }, 0]\n        };\n        const facetScope = facetLayout ? firstScope : null;\n        const backgroundGroup = facetLayout ? facetScope.facetScope : groupMark;\n        if (insight.backgroundImage && specCapabilities.backgroundImage && ((_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.quantitative) && ((_b2 = specColumns.y) === null || _b2 === void 0 ? void 0 : _b2.quantitative)) {\n          if (!backgroundGroup.marks) {\n            backgroundGroup.marks = [];\n          }\n          const imageMark = getImageMark(insight.backgroundImage, allGlobalScales);\n          backgroundGroup.marks.unshift(imageMark);\n        }\n        const axesScopes = facetLayout ? addFacetAxesGroupMarks({\n          globalScope: globalScope.scope,\n          plotScope: groupMark,\n          facetScope,\n          colTitleScale,\n          rowTitleScale,\n          colSeqName: \"data_FacetCellColTitles\",\n          rowSeqName: \"data_FacetCellRowTitles\"\n        }) : {\n          main: [{\n            scope: groupMark,\n            lines: true,\n            labels: true,\n            title: true\n          }]\n        };\n        addGlobalAxes({\n          globalScope,\n          allGlobalScales,\n          axisScales: this.props.axisScales,\n          plotOffsetSignals: { x: globalSignals.plotOffsetLeft, y: globalSignals.plotOffsetBottom },\n          axesOffsets: { x: axesOffsetX, y: axesOffsetY },\n          axesTitlePadding: facetLayout ? { x: axesTitlePaddingFacetX, y: axesTitlePaddingFacetY } : { x: axesTitlePaddingX, y: axesTitlePaddingY },\n          labelBaseline: { x: \"top\", y: \"middle\" },\n          specColumns,\n          specViewOptions,\n          axesScopes,\n          hideZAxis: !!facetLayout,\n          view: insight.view\n        });\n      }\n      if (finalScope.mark) {\n        const { update: update2 } = finalScope.mark.encode;\n        const outputDataName = \"output\";\n        finalScope.mark.from.data = outputDataName;\n        addData(globalScope.markGroup, {\n          name: outputDataName,\n          source: globalScope.markDataName,\n          transform: [\n            {\n              type: \"formula\",\n              expr: finalScope.offsets.x,\n              as: FieldNames.OffsetX\n            },\n            {\n              type: \"formula\",\n              expr: finalScope.offsets.y,\n              as: FieldNames.OffsetY\n            }\n          ]\n        });\n        update2.x = {\n          field: FieldNames.OffsetX\n        };\n        update2.y = {\n          field: FieldNames.OffsetY\n        };\n        allEncodingRules.forEach((map2) => {\n          for (const key2 in map2) {\n            if (update2[key2]) {\n              const arrIn = map2[key2];\n              if (!Array.isArray(update2[key2])) {\n                const value2 = update2[key2];\n                const arrOut = [];\n                update2[key2] = arrOut;\n                arrIn.forEach((rule2) => arrOut.push(rule2));\n                arrOut.push(value2);\n              } else {\n                const arrOut = update2[key2];\n                arrIn.forEach((rule2) => arrOut.unshift(rule2));\n              }\n            }\n          }\n        });\n        update2.fill = fill$1(specContext, topColorField, ScaleNames.Color);\n        update2.opacity = opacity();\n      }\n      return {\n        specCapabilities,\n        vegaSpec\n      };\n    }\n    initSpec(dataName) {\n      const { globalSignals } = this;\n      const { facetAxesAdjustX, facetAxesAdjustY, minCellWidth, minCellHeight, plotOffsetLeft, plotOffsetBottom, plotOffsetTop, plotOffsetRight, plotHeightOut, plotWidthOut } = globalSignals;\n      const { specContext } = this;\n      const { insight } = specContext;\n      const groupMark = {\n        type: \"group\",\n        //style: 'cell',\n        encode: {\n          update: {\n            x: { signal: `${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}` },\n            y: { signal: SignalNames.PlotOffsetTop },\n            height: { signal: `${SignalNames.PlotHeightOut} - ${SignalNames.FacetAxesAdjustY}` },\n            width: { signal: `${SignalNames.PlotWidthOut} + ${SignalNames.FacetAxesAdjustX}` }\n          }\n        }\n      };\n      const inputDataname = \"input\";\n      const vegaSpec = {\n        $schema: \"https://vega.github.io/schema/vega/v5.json\",\n        //style: 'cell',\n        data: [{ name: inputDataname }, { name: dataName, source: inputDataname, transform: [] }],\n        marks: [groupMark],\n        signals: textSignals(specContext, SignalNames.ViewportHeight).concat([\n          minCellWidth,\n          minCellHeight,\n          {\n            name: SignalNames.ViewportHeight,\n            update: `max(${SignalNames.MinCellHeight}, ${insight.size.height})`\n          },\n          {\n            name: SignalNames.ViewportWidth,\n            update: `max(${SignalNames.MinCellWidth}, ${insight.size.width})`\n          },\n          plotOffsetLeft,\n          plotOffsetTop,\n          plotOffsetBottom,\n          plotOffsetRight,\n          facetAxesAdjustX,\n          facetAxesAdjustY,\n          {\n            name: SignalNames.PlotHeightIn,\n            update: `${SignalNames.ViewportHeight} - ${SignalNames.PlotOffsetBottom} + ${SignalNames.FacetAxesAdjustY}`\n          },\n          {\n            name: SignalNames.PlotWidthIn,\n            update: `${SignalNames.ViewportWidth} - ${SignalNames.PlotOffsetLeft} - ${SignalNames.PlotOffsetRight}`\n          },\n          plotHeightOut,\n          plotWidthOut,\n          {\n            name: \"height\",\n            update: `${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut} + ${SignalNames.PlotOffsetBottom} - ${SignalNames.FacetAxesAdjustY}`\n          },\n          {\n            name: \"width\",\n            update: `${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotOffsetRight}`\n          }\n        ])\n      };\n      return { vegaSpec, groupMark };\n    }\n    iterateLayouts(globalScope, onLayoutBuild) {\n      let specResult;\n      let parentScope = {\n        sizeSignals: globalScope.sizeSignals,\n        offsets: globalScope.offsets\n      };\n      let firstScope;\n      let childScope;\n      const groupings = [];\n      const { layouts, specCapabilities } = this.props;\n      const allGlobalScales = [];\n      const allEncodingRules = [];\n      for (let i = 0; i < layouts.length; i++) {\n        if (!parentScope)\n          continue;\n        const buildProps = {\n          globalScope,\n          parentScope,\n          axesScales: this.props.axisScales,\n          groupings,\n          id: i\n        };\n        const layout = this.createLayout(layouts[i], buildProps);\n        try {\n          childScope = layout.build();\n          childScope.id = i;\n          const groupby = layout.getGrouping();\n          if (groupby) {\n            groupings.push({\n              id: i,\n              groupby,\n              fieldOps: [\n                { field: null, op: \"count\", as: FieldNames.Count }\n              ]\n            });\n          }\n          const sumOp = layout.getAggregateSumOp();\n          if (sumOp) {\n            groupings[groupings.length - 1].fieldOps.push(sumOp);\n          }\n          onLayoutBuild(i, childScope);\n        } catch (e) {\n          specResult = {\n            errors: [e.stack],\n            specCapabilities,\n            vegaSpec: null\n          };\n          break;\n        }\n        if (childScope && childScope.globalScales) {\n          allGlobalScales.push(childScope.globalScales);\n        }\n        if (childScope.encodingRuleMap) {\n          allEncodingRules.push(childScope.encodingRuleMap);\n        }\n        if (i === 0) {\n          firstScope = childScope;\n        }\n        parentScope = childScope;\n      }\n      return { firstScope, finalScope: parentScope, specResult, allGlobalScales, allEncodingRules };\n    }\n    createLayout(layoutPair, buildProps) {\n      const { layoutType, props } = layoutPair;\n      const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n      const layoutClass = layoutClasses[layoutType];\n      const layout = new layoutClass(layoutBuildProps);\n      layout.id = buildProps.id;\n      return layout;\n    }\n  }\n  function build(specContext, currData) {\n    const { specColumns } = specContext;\n    const columns = [\n      specColumns.color,\n      specColumns.facet,\n      specColumns.facetV,\n      specColumns.group,\n      specColumns.size,\n      specColumns.sort,\n      specColumns.x,\n      specColumns.y,\n      specColumns.z\n    ];\n    inferAll(columns, currData);\n    const specBuilderProps = getSpecBuilderPropsForChart(specContext);\n    const specBuilder = new SpecBuilder(specBuilderProps, specContext);\n    let specResult;\n    if (specBuilder) {\n      try {\n        const errors = specBuilder.validate();\n        if (errors.length) {\n          specResult = {\n            errors,\n            specCapabilities: specBuilderProps.specCapabilities,\n            vegaSpec: null\n          };\n        } else {\n          specResult = specBuilder.build();\n        }\n      } catch (e) {\n        specResult = {\n          specCapabilities: null,\n          vegaSpec: null,\n          errors: [e.stack]\n        };\n      }\n      if (!specResult.errors) {\n        const data0 = specResult.vegaSpec.data[0];\n        data0.values = currData;\n      }\n    } else {\n      specResult = {\n        specCapabilities: null,\n        vegaSpec: null,\n        errors: [`could not build spec for ${specContext.insight.chart}`]\n      };\n    }\n    return specResult;\n  }\n  const index$7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    ColorScaleNone,\n    FieldNames,\n    Other,\n    ScaleNames,\n    SignalNames,\n    build,\n    getColumnsFromData,\n    getSpecColumns,\n    getStats,\n    inferAll\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const GL_ORDINAL = \"GL_ORDINAL\";\n  const constants$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    ColorScaleNone,\n    FieldNames,\n    GL_ORDINAL,\n    ScaleNames,\n    SignalNames\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function isSearchExpressionGroup(search) {\n    if (!search) {\n      return false;\n    }\n    return !!search.expressions;\n  }\n  function createGroupFromExpression(input) {\n    const output2 = {\n      expressions: [input]\n    };\n    return output2;\n  }\n  function ensureSearchExpressionGroupArray(search) {\n    if (Array.isArray(search)) {\n      return [...search];\n    } else if (isSearchExpressionGroup(search)) {\n      return [search];\n    } else {\n      return [createGroupFromExpression(search)];\n    }\n  }\n  const expressionKeys = Object.keys({\n    clause: null,\n    name: null,\n    operator: null,\n    value: null\n  });\n  function compareExpression(a2, b2) {\n    if (a2 && b2) {\n      for (let k = 0; k < expressionKeys.length; k++) {\n        const key2 = expressionKeys[k];\n        if (a2[key2] != b2[key2])\n          return false;\n      }\n    } else {\n      return !a2 && !b2;\n    }\n    return true;\n  }\n  const groupKeys = Object.keys({\n    clause: null\n  });\n  function compareGroup$1(a2, b2) {\n    for (let k = 0; k < groupKeys.length; k++) {\n      const key2 = groupKeys[k];\n      if (a2[key2] != b2[key2])\n        return false;\n    }\n    if (!a2.expressions && !b2.expressions)\n      return true;\n    if (!a2.expressions || !b2.expressions)\n      return false;\n    if (a2.expressions.length != b2.expressions.length)\n      return false;\n    for (let i = 0; i < a2.expressions.length; i++) {\n      if (!compareExpression(a2.expressions[i], b2.expressions[i]))\n        return false;\n    }\n    return true;\n  }\n  function compare$4(a2, b2) {\n    if (a2 == b2)\n      return true;\n    if (!a2 || !b2)\n      return false;\n    const arrs = [a2, b2].map(ensureSearchExpressionGroupArray);\n    const [arrA, arrB] = arrs;\n    if (arrA.length != arrB.length)\n      return false;\n    for (let i = 0; i < arrA.length; i++) {\n      if (!compareGroup$1(arrA[i], arrB[i]))\n        return false;\n    }\n    return true;\n  }\n  function startsWith(whole, part) {\n    if (!part)\n      return true;\n    const arrs = [whole, part].map(ensureSearchExpressionGroupArray);\n    const [wholeArray, partArray] = arrs;\n    if (partArray.length > wholeArray.length)\n      return false;\n    for (let i = 0; i < partArray.length; i++) {\n      if (!compareGroup$1(wholeArray[i], partArray[i]))\n        return false;\n    }\n    return true;\n  }\n  function valueToBoolean(value2) {\n    if (typeof value2 === \"string\") {\n      switch (value2.toLowerCase()) {\n        case \"true\":\n          return true;\n        case \"false\":\n          return false;\n      }\n    }\n    return !!value2;\n  }\n  function valueToString(value2) {\n    if (value2 == null) {\n      return \"\";\n    }\n    switch (typeof value2) {\n      case \"string\":\n        return value2;\n      case \"boolean\":\n      case \"number\":\n        return value2.toString();\n    }\n    return \"\";\n  }\n  function isStringOperation(ex) {\n    switch (ex.operator) {\n      case \"contains\":\n      case \"!contains\":\n      case \"starts\":\n      case \"!starts\":\n        return true;\n    }\n    return false;\n  }\n  function isnullorEmpty(value2) {\n    if (value2 == null)\n      return true;\n    if (typeof value2 === \"string\" && value2.length === 0)\n      return true;\n    return false;\n  }\n  class Exec {\n    constructor(search, columns) {\n      this.columns = columns;\n      this.groups = ensureSearchExpressionGroupArray(search).map((g) => {\n        const expressions = g.expressions.filter(Boolean);\n        expressions.forEach((ex) => {\n          ex.column = this.getColumn(ex.name);\n          ex.valueBool = valueToBoolean(ex.value);\n          ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n          ex.stringOperation = isStringOperation(ex);\n        });\n        const group2 = Object.assign(Object.assign({}, g), { expressions });\n        return group2;\n      });\n    }\n    getColumn(name) {\n      for (let i = 0; i < this.columns.length; i++) {\n        if (this.columns[i].name == name) {\n          return this.columns[i];\n        }\n      }\n    }\n    runExpressionOnColumn(datum2, ex) {\n      const actualDataValue = datum2[ex.name];\n      if (ex.operator === \"isnullorEmpty\") {\n        return isnullorEmpty(actualDataValue);\n      } else if (ex.operator === \"!isnullorEmpty\") {\n        return !isnullorEmpty(actualDataValue);\n      }\n      let dataValue = actualDataValue;\n      let expressionValue = ex.value;\n      if (ex.column) {\n        if (ex.column.type === \"string\" || ex.stringOperation) {\n          dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n          expressionValue = ex.valueLow;\n        } else if (ex.column.type === \"boolean\") {\n          dataValue = valueToBoolean(actualDataValue);\n          expressionValue = ex.valueBool;\n        } else if (ex.column.quantitative) {\n          dataValue = +actualDataValue;\n          expressionValue = +ex.value;\n        }\n      }\n      switch (ex.operator) {\n        case \"!=\":\n          return dataValue != expressionValue;\n        case \"<\":\n          return dataValue < expressionValue;\n        case \"<=\":\n          return dataValue <= expressionValue;\n        case \"==\":\n          return dataValue == expressionValue;\n        case \">\":\n          return dataValue > expressionValue;\n        case \">=\":\n          return dataValue >= expressionValue;\n        case \"contains\":\n          return dataValue.indexOf(expressionValue) >= 0;\n        case \"!contains\":\n          return dataValue.indexOf(expressionValue) < 0;\n        case \"starts\":\n          return dataValue.indexOf(expressionValue) == 0;\n        case \"!starts\":\n          return dataValue.indexOf(expressionValue) !== 0;\n      }\n    }\n    runExpression(datum2, ex) {\n      if (ex.name == null) {\n        const group2 = {\n          expressions: this.columns.map((column, i) => {\n            const ex2 = Object.assign(Object.assign({}, ex), { column, name: column.name });\n            if (i) {\n              ex2.clause = \"||\";\n            }\n            return ex2;\n          })\n        };\n        return this.runGroup(datum2, group2);\n      } else {\n        return this.runExpressionOnColumn(datum2, ex);\n      }\n    }\n    runGroup(datum2, group2) {\n      let accumulator = this.runExpression(datum2, group2.expressions[0]);\n      for (let i = 1; i < group2.expressions.length; i++) {\n        const ex = group2.expressions[i];\n        switch (ex.clause) {\n          case \"&&\":\n            accumulator = accumulator && this.runExpression(datum2, ex);\n            break;\n          case \"||\":\n            accumulator = accumulator || this.runExpression(datum2, ex);\n            break;\n        }\n      }\n      return accumulator;\n    }\n    run(datum2) {\n      let accumulator = this.runGroup(datum2, this.groups[0]);\n      for (let i = 1; i < this.groups.length; i++) {\n        const group2 = this.groups[i];\n        switch (group2.clause) {\n          case \"&&\":\n            accumulator = accumulator && this.runGroup(datum2, group2);\n            break;\n          case \"||\":\n            accumulator = accumulator || this.runGroup(datum2, group2);\n            break;\n        }\n      }\n      return accumulator;\n    }\n  }\n  function invertSearchExpressionGroup(input) {\n    const output2 = {\n      expressions: input.expressions.map(invertSearchExpression)\n    };\n    if (input.clause) {\n      output2.clause = invertedClauses[input.clause];\n    }\n    return output2;\n  }\n  const invertedOperators = {\n    \"!=\": \"==\",\n    \"==\": \"!=\",\n    \"<\": \">=\",\n    \">=\": \"<\",\n    \"<=\": \">\",\n    \">\": \"<=\",\n    \"!contains\": \"contains\",\n    \"contains\": \"!contains\",\n    \"!isnullorEmpty\": \"isnullorEmpty\",\n    \"isnullorEmpty\": \"!isnullorEmpty\",\n    \"!starts\": \"starts\",\n    \"starts\": \"!starts\"\n  };\n  const invertedClauses = {\n    \"&&\": \"||\",\n    \"||\": \"&&\"\n  };\n  function invertSearchExpression(input) {\n    const operator2 = invertedOperators[input.operator];\n    const output2 = Object.assign(Object.assign({}, input), { operator: operator2 });\n    if (input.clause) {\n      output2.clause = invertedClauses[input.clause];\n    }\n    return output2;\n  }\n  function invert$2(search) {\n    if (Array.isArray(search)) {\n      return search.map(invertSearchExpressionGroup);\n    } else if (isSearchExpressionGroup(search)) {\n      return invertSearchExpressionGroup(search);\n    } else {\n      return invertSearchExpression(search);\n    }\n  }\n  function narrow(a2, b2) {\n    if (!a2) {\n      return b2;\n    }\n    const arrs = [a2, b2].map(ensureSearchExpressionGroupArray);\n    const [arrA, arrB] = arrs;\n    arrB[0].clause = \"&&\";\n    return arrA.concat(arrB);\n  }\n  const index$6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Exec,\n    compare: compare$4,\n    compareExpression,\n    compareGroup: compareGroup$1,\n    createGroupFromExpression,\n    ensureSearchExpressionGroupArray,\n    invert: invert$2,\n    isSearchExpressionGroup,\n    narrow,\n    startsWith\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const types$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n  function decamelize(str, separator = \"-\") {\n    return str.replace(/([a-z\\d])([A-Z])/g, \"$1\" + separator + \"$2\").replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, \"$1\" + separator + \"$2\").toLowerCase();\n  }\n  function createElement(tag, attrs, ...children2) {\n    if (typeof tag === \"function\") {\n      const fn2 = tag;\n      let props = attrs;\n      if (props === null || props === void 0) {\n        props = { children: children2 };\n      } else {\n        props.children = children2;\n      }\n      return fn2(props);\n    } else {\n      const ns = tag === \"svg\" ? SVG_NAMESPACE : null;\n      const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n      const map2 = attrs;\n      let ref2;\n      for (let name in map2) {\n        if (name && map2.hasOwnProperty(name)) {\n          let value2 = map2[name];\n          if (name === \"className\" && value2 !== void 0) {\n            setAttribute$1(el, ns, \"class\", value2.toString());\n          } else if (name === \"disabled\" && !value2) ;\n          else if (value2 === null || value2 === void 0) {\n            continue;\n          } else if (value2 === true) {\n            setAttribute$1(el, ns, name, name);\n          } else if (typeof value2 === \"function\") {\n            if (name === \"ref\") {\n              ref2 = value2;\n            } else {\n              el[name.toLowerCase()] = value2;\n            }\n          } else if (typeof value2 === \"object\") {\n            setAttribute$1(el, ns, name, flatten$1(value2));\n          } else {\n            setAttribute$1(el, ns, name, value2.toString());\n          }\n        }\n      }\n      if (children2 && children2.length > 0) {\n        appendChildren(el, children2);\n      }\n      if (ref2) {\n        ref2(el);\n      }\n      return el;\n    }\n  }\n  function setAttribute$1(el, ns, name, value2) {\n    if (ns) {\n      el.setAttributeNS(null, name, value2);\n    } else {\n      el.setAttribute(name, value2);\n    }\n  }\n  function flatten$1(o) {\n    const arr = [];\n    for (let prop in o)\n      arr.push(`${decamelize(prop, \"-\")}:${o[prop]}`);\n    return arr.join(\";\");\n  }\n  function isInsideForeignObject(element2) {\n    let current = element2;\n    while (current) {\n      if (current.tagName.toLowerCase() === \"foreignobject\") {\n        return true;\n      }\n      current = current.parentElement;\n    }\n    return false;\n  }\n  function recreateWithSvgNamespace(element2) {\n    const svgElement = document.createElementNS(SVG_NAMESPACE, element2.tagName.toLowerCase());\n    for (let i = 0; i < element2.attributes.length; i++) {\n      const attr2 = element2.attributes[i];\n      svgElement.setAttributeNS(null, attr2.name, attr2.value);\n    }\n    const eventProperties = [\n      \"onclick\",\n      \"onmousedown\",\n      \"onmouseup\",\n      \"onmouseover\",\n      \"onmouseout\",\n      \"onmousemove\",\n      \"onkeydown\",\n      \"onkeyup\",\n      \"onkeypress\",\n      \"onfocus\",\n      \"onblur\"\n    ];\n    for (const prop of eventProperties) {\n      if (element2[prop]) {\n        svgElement[prop] = element2[prop];\n      }\n    }\n    for (let i = 0; i < element2.childNodes.length; i++) {\n      const child = element2.childNodes[i];\n      if (child.nodeType === Node.ELEMENT_NODE) {\n        svgElement.appendChild(recreateWithSvgNamespace(child));\n      } else {\n        svgElement.appendChild(child.cloneNode(true));\n      }\n    }\n    return svgElement;\n  }\n  function addChild(parentElement, child) {\n    if (child === null || child === void 0 || typeof child === \"boolean\") {\n      return;\n    } else if (Array.isArray(child)) {\n      appendChildren(parentElement, child);\n    } else if (isElement(child)) {\n      const childEl = child;\n      if (parentElement.namespaceURI === SVG_NAMESPACE && childEl.namespaceURI !== SVG_NAMESPACE && childEl.tagName.toLowerCase() !== \"foreignobject\" && !isInsideForeignObject(parentElement)) {\n        const recreated = recreateWithSvgNamespace(childEl);\n        parentElement.appendChild(recreated);\n      } else {\n        parentElement.appendChild(childEl);\n      }\n    } else {\n      parentElement.appendChild(document.createTextNode(child.toString()));\n    }\n  }\n  function appendChildren(parentElement, children2) {\n    children2.forEach((child) => addChild(parentElement, child));\n  }\n  function isElement(el) {\n    return !!el.nodeType;\n  }\n  function mount(element2, container) {\n    container.innerHTML = \"\";\n    if (element2) {\n      addChild(container, element2);\n    }\n  }\n  function findElementByChildPositions(childPositions, container) {\n    let element2 = container || document.body;\n    let childPosition;\n    while (element2 && childPositions.length) {\n      childPosition = childPositions.shift();\n      element2 = element2.children.item(childPosition);\n    }\n    if (element2) {\n      return element2;\n    }\n  }\n  function focusActiveElement(element2, activeElementInfo) {\n    element2.focus();\n    element2.scrollTop = activeElementInfo.scrollTop;\n    const input = element2;\n    if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) {\n      input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n    }\n  }\n  function setActiveElement(activeElementInfo, container) {\n    if (activeElementInfo) {\n      const element2 = findElementByChildPositions(activeElementInfo.childPositions, container);\n      if (element2) {\n        focusActiveElement(element2, activeElementInfo);\n      }\n    }\n  }\n  function getActiveElementInfo(container) {\n    let element2 = document.activeElement;\n    const { scrollTop, selectionDirection, selectionEnd, selectionStart } = element2;\n    const activeElementInfo = {\n      childPositions: [],\n      scrollTop,\n      selectionDirection,\n      selectionEnd,\n      selectionStart\n    };\n    while (element2 && element2 !== document.body && element2 !== container) {\n      activeElementInfo.childPositions.unshift(getChildPosition(element2));\n      element2 = element2.parentElement;\n    }\n    if ((element2 === document.body || element2 === container) && activeElementInfo.childPositions.length)\n      return activeElementInfo;\n  }\n  function getChildPosition(element2) {\n    let childPosition = 0;\n    while (element2 = element2.previousElementSibling)\n      childPosition++;\n    return childPosition;\n  }\n  const KeyCodes$2 = {\n    ENTER: \"Enter\"\n  };\n  const Table$1 = (props) => {\n    return createElement(\n      \"table\",\n      { className: props.className },\n      props.children,\n      props.rows.map((row, i) => createElement(\"tr\", { className: props.rowClassName || \"\", onClick: (e) => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: (e) => {\n        if (e.key === KeyCodes$2.ENTER && props.onRowClick) {\n          props.onRowClick(e, i);\n        }\n      } }, row.cells.map((cell2, i2) => createElement(\"td\", { className: cell2.className || \"\", title: cell2.title || \"\" }, cell2.content))))\n    );\n  };\n  const controls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Table: Table$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var EPSILON$3 = 1e-6;\n  var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\n  function setMatrixArrayType(type2) {\n    ARRAY_TYPE = type2;\n  }\n  function create$8() {\n    var out = new ARRAY_TYPE(9);\n    if (ARRAY_TYPE != Float32Array) {\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[5] = 0;\n      out[6] = 0;\n      out[7] = 0;\n    }\n    out[0] = 1;\n    out[4] = 1;\n    out[8] = 1;\n    return out;\n  }\n  function fromMat4(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[4];\n    out[4] = a2[5];\n    out[5] = a2[6];\n    out[6] = a2[8];\n    out[7] = a2[9];\n    out[8] = a2[10];\n    return out;\n  }\n  function fromValues$5(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n  }\n  function fromQuat$1(out, q) {\n    var x2 = q[0], y2 = q[1], z2 = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z22 = z2 + z2;\n    var xx = x2 * x22;\n    var yx = y2 * x22;\n    var yy = y2 * y22;\n    var zx = z2 * x22;\n    var zy = z2 * y22;\n    var zz = z2 * z22;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z22;\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n    return out;\n  }\n  function create$7() {\n    var out = new ARRAY_TYPE(16);\n    if (ARRAY_TYPE != Float32Array) {\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n    }\n    out[0] = 1;\n    out[5] = 1;\n    out[10] = 1;\n    out[15] = 1;\n    return out;\n  }\n  function copy$7(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    out[4] = a2[4];\n    out[5] = a2[5];\n    out[6] = a2[6];\n    out[7] = a2[7];\n    out[8] = a2[8];\n    out[9] = a2[9];\n    out[10] = a2[10];\n    out[11] = a2[11];\n    out[12] = a2[12];\n    out[13] = a2[13];\n    out[14] = a2[14];\n    out[15] = a2[15];\n    return out;\n  }\n  function fromValues$4(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n  }\n  function identity$8(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function invert$1(out, a2) {\n    var a00 = a2[0], a01 = a2[1], a02 = a2[2], a03 = a2[3];\n    var a10 = a2[4], a11 = a2[5], a12 = a2[6], a13 = a2[7];\n    var a20 = a2[8], a21 = a2[9], a22 = a2[10], a23 = a2[11];\n    var a30 = a2[12], a31 = a2[13], a32 = a2[14], a33 = a2[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32;\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) {\n      return null;\n    }\n    det = 1 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n    return out;\n  }\n  function multiply$2(out, a2, b2) {\n    var a00 = a2[0], a01 = a2[1], a02 = a2[2], a03 = a2[3];\n    var a10 = a2[4], a11 = a2[5], a12 = a2[6], a13 = a2[7];\n    var a20 = a2[8], a21 = a2[9], a22 = a2[10], a23 = a2[11];\n    var a30 = a2[12], a31 = a2[13], a32 = a2[14], a33 = a2[15];\n    var b0 = b2[0], b1 = b2[1], b22 = b2[2], b3 = b2[3];\n    out[0] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[4];\n    b1 = b2[5];\n    b22 = b2[6];\n    b3 = b2[7];\n    out[4] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[8];\n    b1 = b2[9];\n    b22 = b2[10];\n    b3 = b2[11];\n    out[8] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[12];\n    b1 = b2[13];\n    b22 = b2[14];\n    b3 = b2[15];\n    out[12] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    return out;\n  }\n  function translate$2(out, a2, v) {\n    var x2 = v[0], y2 = v[1], z2 = v[2];\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    if (a2 === out) {\n      out[12] = a2[0] * x2 + a2[4] * y2 + a2[8] * z2 + a2[12];\n      out[13] = a2[1] * x2 + a2[5] * y2 + a2[9] * z2 + a2[13];\n      out[14] = a2[2] * x2 + a2[6] * y2 + a2[10] * z2 + a2[14];\n      out[15] = a2[3] * x2 + a2[7] * y2 + a2[11] * z2 + a2[15];\n    } else {\n      a00 = a2[0];\n      a01 = a2[1];\n      a02 = a2[2];\n      a03 = a2[3];\n      a10 = a2[4];\n      a11 = a2[5];\n      a12 = a2[6];\n      a13 = a2[7];\n      a20 = a2[8];\n      a21 = a2[9];\n      a22 = a2[10];\n      a23 = a2[11];\n      out[0] = a00;\n      out[1] = a01;\n      out[2] = a02;\n      out[3] = a03;\n      out[4] = a10;\n      out[5] = a11;\n      out[6] = a12;\n      out[7] = a13;\n      out[8] = a20;\n      out[9] = a21;\n      out[10] = a22;\n      out[11] = a23;\n      out[12] = a00 * x2 + a10 * y2 + a20 * z2 + a2[12];\n      out[13] = a01 * x2 + a11 * y2 + a21 * z2 + a2[13];\n      out[14] = a02 * x2 + a12 * y2 + a22 * z2 + a2[14];\n      out[15] = a03 * x2 + a13 * y2 + a23 * z2 + a2[15];\n    }\n    return out;\n  }\n  function scale$6(out, a2, v) {\n    var x2 = v[0], y2 = v[1], z2 = v[2];\n    out[0] = a2[0] * x2;\n    out[1] = a2[1] * x2;\n    out[2] = a2[2] * x2;\n    out[3] = a2[3] * x2;\n    out[4] = a2[4] * y2;\n    out[5] = a2[5] * y2;\n    out[6] = a2[6] * y2;\n    out[7] = a2[7] * y2;\n    out[8] = a2[8] * z2;\n    out[9] = a2[9] * z2;\n    out[10] = a2[10] * z2;\n    out[11] = a2[11] * z2;\n    out[12] = a2[12];\n    out[13] = a2[13];\n    out[14] = a2[14];\n    out[15] = a2[15];\n    return out;\n  }\n  function fromScaling(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function fromRotationTranslationScale(out, q, v, s2) {\n    var x2 = q[0], y2 = q[1], z2 = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z22 = z2 + z2;\n    var xx = x2 * x22;\n    var xy = x2 * y22;\n    var xz = x2 * z22;\n    var yy = y2 * y22;\n    var yz = y2 * z22;\n    var zz = z2 * z22;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z22;\n    var sx = s2[0];\n    var sy = s2[1];\n    var sz2 = s2[2];\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz2;\n    out[9] = (yz - wx) * sz2;\n    out[10] = (1 - (xx + yy)) * sz2;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n  }\n  function fromRotationTranslationScaleOrigin(out, q, v, s2, o) {\n    var x2 = q[0], y2 = q[1], z2 = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z22 = z2 + z2;\n    var xx = x2 * x22;\n    var xy = x2 * y22;\n    var xz = x2 * z22;\n    var yy = y2 * y22;\n    var yz = y2 * z22;\n    var zz = z2 * z22;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z22;\n    var sx = s2[0];\n    var sy = s2[1];\n    var sz2 = s2[2];\n    var ox = o[0];\n    var oy = o[1];\n    var oz = o[2];\n    var out0 = (1 - (yy + zz)) * sx;\n    var out1 = (xy + wz) * sx;\n    var out2 = (xz - wy) * sx;\n    var out4 = (xy - wz) * sy;\n    var out5 = (1 - (xx + zz)) * sy;\n    var out6 = (yz + wx) * sy;\n    var out8 = (xz + wy) * sz2;\n    var out9 = (yz - wx) * sz2;\n    var out10 = (1 - (xx + yy)) * sz2;\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = 0;\n    out[4] = out4;\n    out[5] = out5;\n    out[6] = out6;\n    out[7] = 0;\n    out[8] = out8;\n    out[9] = out9;\n    out[10] = out10;\n    out[11] = 0;\n    out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n    out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n    out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n    out[15] = 1;\n    return out;\n  }\n  function fromQuat(out, q) {\n    var x2 = q[0], y2 = q[1], z2 = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z22 = z2 + z2;\n    var xx = x2 * x22;\n    var yx = y2 * x22;\n    var yy = y2 * y22;\n    var zx = z2 * x22;\n    var zy = z2 * y22;\n    var zz = z2 * z22;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z22;\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function frustum(out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left);\n    var tb = 1 / (top - bottom);\n    var nf = 1 / (near - far);\n    out[0] = near * 2 * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = near * 2 * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = far * near * 2 * nf;\n    out[15] = 0;\n    return out;\n  }\n  function perspectiveNO(out, fovy, aspect, near, far) {\n    var f = 1 / Math.tan(fovy / 2);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n      var nf = 1 / (near - far);\n      out[10] = (far + near) * nf;\n      out[14] = 2 * far * near * nf;\n    } else {\n      out[10] = -1;\n      out[14] = -2 * near;\n    }\n    return out;\n  }\n  var perspective = perspectiveNO;\n  function lookAt(out, eye, center, up) {\n    var x02, x12, x2, y02, y12, y2, z02, z1, z2, len2;\n    var eyex = eye[0];\n    var eyey = eye[1];\n    var eyez = eye[2];\n    var upx = up[0];\n    var upy = up[1];\n    var upz = up[2];\n    var centerx = center[0];\n    var centery = center[1];\n    var centerz = center[2];\n    if (Math.abs(eyex - centerx) < EPSILON$3 && Math.abs(eyey - centery) < EPSILON$3 && Math.abs(eyez - centerz) < EPSILON$3) {\n      return identity$8(out);\n    }\n    z02 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n    len2 = 1 / Math.sqrt(z02 * z02 + z1 * z1 + z2 * z2);\n    z02 *= len2;\n    z1 *= len2;\n    z2 *= len2;\n    x02 = upy * z2 - upz * z1;\n    x12 = upz * z02 - upx * z2;\n    x2 = upx * z1 - upy * z02;\n    len2 = Math.sqrt(x02 * x02 + x12 * x12 + x2 * x2);\n    if (!len2) {\n      x02 = 0;\n      x12 = 0;\n      x2 = 0;\n    } else {\n      len2 = 1 / len2;\n      x02 *= len2;\n      x12 *= len2;\n      x2 *= len2;\n    }\n    y02 = z1 * x2 - z2 * x12;\n    y12 = z2 * x02 - z02 * x2;\n    y2 = z02 * x12 - z1 * x02;\n    len2 = Math.sqrt(y02 * y02 + y12 * y12 + y2 * y2);\n    if (!len2) {\n      y02 = 0;\n      y12 = 0;\n      y2 = 0;\n    } else {\n      len2 = 1 / len2;\n      y02 *= len2;\n      y12 *= len2;\n      y2 *= len2;\n    }\n    out[0] = x02;\n    out[1] = y02;\n    out[2] = z02;\n    out[3] = 0;\n    out[4] = x12;\n    out[5] = y12;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x02 * eyex + x12 * eyey + x2 * eyez);\n    out[13] = -(y02 * eyex + y12 * eyey + y2 * eyez);\n    out[14] = -(z02 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n    return out;\n  }\n  var mul = multiply$2;\n  function create$6() {\n    var out = new ARRAY_TYPE(3);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    return out;\n  }\n  function clone$4(a2) {\n    var out = new ARRAY_TYPE(3);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    return out;\n  }\n  function length$1(a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z2 = a2[2];\n    return Math.sqrt(x2 * x2 + y2 * y2 + z2 * z2);\n  }\n  function fromValues$3(x2, y2, z2) {\n    var out = new ARRAY_TYPE(3);\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z2;\n    return out;\n  }\n  function copy$6(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    return out;\n  }\n  function set$8(out, x2, y2, z2) {\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z2;\n    return out;\n  }\n  function add$4(out, a2, b2) {\n    out[0] = a2[0] + b2[0];\n    out[1] = a2[1] + b2[1];\n    out[2] = a2[2] + b2[2];\n    return out;\n  }\n  function subtract(out, a2, b2) {\n    out[0] = a2[0] - b2[0];\n    out[1] = a2[1] - b2[1];\n    out[2] = a2[2] - b2[2];\n    return out;\n  }\n  function multiply$1(out, a2, b2) {\n    out[0] = a2[0] * b2[0];\n    out[1] = a2[1] * b2[1];\n    out[2] = a2[2] * b2[2];\n    return out;\n  }\n  function min$3(out, a2, b2) {\n    out[0] = Math.min(a2[0], b2[0]);\n    out[1] = Math.min(a2[1], b2[1]);\n    out[2] = Math.min(a2[2], b2[2]);\n    return out;\n  }\n  function max$3(out, a2, b2) {\n    out[0] = Math.max(a2[0], b2[0]);\n    out[1] = Math.max(a2[1], b2[1]);\n    out[2] = Math.max(a2[2], b2[2]);\n    return out;\n  }\n  function scale$5(out, a2, b2) {\n    out[0] = a2[0] * b2;\n    out[1] = a2[1] * b2;\n    out[2] = a2[2] * b2;\n    return out;\n  }\n  function scaleAndAdd(out, a2, b2, scale2) {\n    out[0] = a2[0] + b2[0] * scale2;\n    out[1] = a2[1] + b2[1] * scale2;\n    out[2] = a2[2] + b2[2] * scale2;\n    return out;\n  }\n  function distance(a2, b2) {\n    var x2 = b2[0] - a2[0];\n    var y2 = b2[1] - a2[1];\n    var z2 = b2[2] - a2[2];\n    return Math.sqrt(x2 * x2 + y2 * y2 + z2 * z2);\n  }\n  function squaredDistance(a2, b2) {\n    var x2 = b2[0] - a2[0];\n    var y2 = b2[1] - a2[1];\n    var z2 = b2[2] - a2[2];\n    return x2 * x2 + y2 * y2 + z2 * z2;\n  }\n  function squaredLength(a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z2 = a2[2];\n    return x2 * x2 + y2 * y2 + z2 * z2;\n  }\n  function negate(out, a2) {\n    out[0] = -a2[0];\n    out[1] = -a2[1];\n    out[2] = -a2[2];\n    return out;\n  }\n  function normalize$5(out, a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z2 = a2[2];\n    var len2 = x2 * x2 + y2 * y2 + z2 * z2;\n    if (len2 > 0) {\n      len2 = 1 / Math.sqrt(len2);\n    }\n    out[0] = a2[0] * len2;\n    out[1] = a2[1] * len2;\n    out[2] = a2[2] * len2;\n    return out;\n  }\n  function dot$1(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];\n  }\n  function cross$1(out, a2, b2) {\n    var ax = a2[0], ay = a2[1], az = a2[2];\n    var bx = b2[0], by = b2[1], bz = b2[2];\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n  }\n  function lerp$1(out, a2, b2, t) {\n    var ax = a2[0];\n    var ay = a2[1];\n    var az = a2[2];\n    out[0] = ax + t * (b2[0] - ax);\n    out[1] = ay + t * (b2[1] - ay);\n    out[2] = az + t * (b2[2] - az);\n    return out;\n  }\n  function transformMat4$2(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z2 = a2[2];\n    var w2 = m2[3] * x2 + m2[7] * y2 + m2[11] * z2 + m2[15];\n    w2 = w2 || 1;\n    out[0] = (m2[0] * x2 + m2[4] * y2 + m2[8] * z2 + m2[12]) / w2;\n    out[1] = (m2[1] * x2 + m2[5] * y2 + m2[9] * z2 + m2[13]) / w2;\n    out[2] = (m2[2] * x2 + m2[6] * y2 + m2[10] * z2 + m2[14]) / w2;\n    return out;\n  }\n  function transformMat3(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z2 = a2[2];\n    out[0] = x2 * m2[0] + y2 * m2[3] + z2 * m2[6];\n    out[1] = x2 * m2[1] + y2 * m2[4] + z2 * m2[7];\n    out[2] = x2 * m2[2] + y2 * m2[5] + z2 * m2[8];\n    return out;\n  }\n  function transformQuat(out, a2, q) {\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3];\n    var vx = a2[0], vy = a2[1], vz = a2[2];\n    var tx2 = qy * vz - qz * vy;\n    var ty2 = qz * vx - qx * vz;\n    var tz = qx * vy - qy * vx;\n    tx2 = tx2 + tx2;\n    ty2 = ty2 + ty2;\n    tz = tz + tz;\n    out[0] = vx + qw * tx2 + qy * tz - qz * ty2;\n    out[1] = vy + qw * ty2 + qz * tx2 - qx * tz;\n    out[2] = vz + qw * tz + qx * ty2 - qy * tx2;\n    return out;\n  }\n  function exactEquals$1(a2, b2) {\n    return a2[0] === b2[0] && a2[1] === b2[1] && a2[2] === b2[2];\n  }\n  function equals$2(a2, b2) {\n    var a0 = a2[0], a1 = a2[1], a22 = a2[2];\n    var b0 = b2[0], b1 = b2[1], b22 = b2[2];\n    return Math.abs(a0 - b0) <= EPSILON$3 * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON$3 * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a22 - b22) <= EPSILON$3 * Math.max(1, Math.abs(a22), Math.abs(b22));\n  }\n  var len = length$1;\n  (function() {\n    var vec2 = create$6();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 3;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        vec2[2] = a2[i + 2];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n        a2[i + 2] = vec2[2];\n      }\n      return a2;\n    };\n  })();\n  function create$5() {\n    var out = new ARRAY_TYPE(4);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n    }\n    return out;\n  }\n  function clone$3(a2) {\n    var out = new ARRAY_TYPE(4);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function fromValues$2(x2, y2, z2, w2) {\n    var out = new ARRAY_TYPE(4);\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z2;\n    out[3] = w2;\n    return out;\n  }\n  function copy$5(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function set$7(out, x2, y2, z2, w2) {\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z2;\n    out[3] = w2;\n    return out;\n  }\n  function normalize$4(out, a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z2 = a2[2];\n    var w2 = a2[3];\n    var len2 = x2 * x2 + y2 * y2 + z2 * z2 + w2 * w2;\n    if (len2 > 0) {\n      len2 = 1 / Math.sqrt(len2);\n    }\n    out[0] = x2 * len2;\n    out[1] = y2 * len2;\n    out[2] = z2 * len2;\n    out[3] = w2 * len2;\n    return out;\n  }\n  function dot(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2] + a2[3] * b2[3];\n  }\n  function transformMat4$1(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z2 = a2[2], w2 = a2[3];\n    out[0] = m2[0] * x2 + m2[4] * y2 + m2[8] * z2 + m2[12] * w2;\n    out[1] = m2[1] * x2 + m2[5] * y2 + m2[9] * z2 + m2[13] * w2;\n    out[2] = m2[2] * x2 + m2[6] * y2 + m2[10] * z2 + m2[14] * w2;\n    out[3] = m2[3] * x2 + m2[7] * y2 + m2[11] * z2 + m2[15] * w2;\n    return out;\n  }\n  function exactEquals(a2, b2) {\n    return a2[0] === b2[0] && a2[1] === b2[1] && a2[2] === b2[2] && a2[3] === b2[3];\n  }\n  (function() {\n    var vec2 = create$5();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 4;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        vec2[2] = a2[i + 2];\n        vec2[3] = a2[i + 3];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n        a2[i + 2] = vec2[2];\n        a2[i + 3] = vec2[3];\n      }\n      return a2;\n    };\n  })();\n  function create$4() {\n    var out = new ARRAY_TYPE(4);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    out[3] = 1;\n    return out;\n  }\n  function setAxisAngle(out, axis, rad) {\n    rad = rad * 0.5;\n    var s2 = Math.sin(rad);\n    out[0] = s2 * axis[0];\n    out[1] = s2 * axis[1];\n    out[2] = s2 * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n  }\n  function multiply(out, a2, b2) {\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = b2[0], by = b2[1], bz = b2[2], bw = b2[3];\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n  }\n  function rotateX(out, a2, rad) {\n    rad *= 0.5;\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n  }\n  function rotateY(out, a2, rad) {\n    rad *= 0.5;\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var by = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n  }\n  function slerp(out, a2, b2, t) {\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = b2[0], by = b2[1], bz = b2[2], bw = b2[3];\n    var omega, cosom, sinom, scale0, scale1;\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    if (cosom < 0) {\n      cosom = -cosom;\n      bx = -bx;\n      by = -by;\n      bz = -bz;\n      bw = -bw;\n    }\n    if (1 - cosom > EPSILON$3) {\n      omega = Math.acos(cosom);\n      sinom = Math.sin(omega);\n      scale0 = Math.sin((1 - t) * omega) / sinom;\n      scale1 = Math.sin(t * omega) / sinom;\n    } else {\n      scale0 = 1 - t;\n      scale1 = t;\n    }\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    return out;\n  }\n  function conjugate(out, a2) {\n    out[0] = -a2[0];\n    out[1] = -a2[1];\n    out[2] = -a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function fromMat3(out, m2) {\n    var fTrace = m2[0] + m2[4] + m2[8];\n    var fRoot;\n    if (fTrace > 0) {\n      fRoot = Math.sqrt(fTrace + 1);\n      out[3] = 0.5 * fRoot;\n      fRoot = 0.5 / fRoot;\n      out[0] = (m2[5] - m2[7]) * fRoot;\n      out[1] = (m2[6] - m2[2]) * fRoot;\n      out[2] = (m2[1] - m2[3]) * fRoot;\n    } else {\n      var i = 0;\n      if (m2[4] > m2[0]) i = 1;\n      if (m2[8] > m2[i * 3 + i]) i = 2;\n      var j = (i + 1) % 3;\n      var k = (i + 2) % 3;\n      fRoot = Math.sqrt(m2[i * 3 + i] - m2[j * 3 + j] - m2[k * 3 + k] + 1);\n      out[i] = 0.5 * fRoot;\n      fRoot = 0.5 / fRoot;\n      out[3] = (m2[j * 3 + k] - m2[k * 3 + j]) * fRoot;\n      out[j] = (m2[j * 3 + i] + m2[i * 3 + j]) * fRoot;\n      out[k] = (m2[k * 3 + i] + m2[i * 3 + k]) * fRoot;\n    }\n    return out;\n  }\n  var clone$2 = clone$3;\n  var fromValues$1 = fromValues$2;\n  var copy$4 = copy$5;\n  var set$6 = set$7;\n  var normalize$3 = normalize$4;\n  function equals$1(a2, b2) {\n    return Math.abs(dot(a2, b2)) >= 1 - EPSILON$3;\n  }\n  var rotationTo = (function() {\n    var tmpvec3 = create$6();\n    var xUnitVec3 = fromValues$3(1, 0, 0);\n    var yUnitVec3 = fromValues$3(0, 1, 0);\n    return function(out, a2, b2) {\n      var dot2 = dot$1(a2, b2);\n      if (dot2 < -0.999999) {\n        cross$1(tmpvec3, xUnitVec3, a2);\n        if (len(tmpvec3) < 1e-6) cross$1(tmpvec3, yUnitVec3, a2);\n        normalize$5(tmpvec3, tmpvec3);\n        setAxisAngle(out, tmpvec3, Math.PI);\n        return out;\n      } else if (dot2 > 0.999999) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 1;\n        return out;\n      } else {\n        cross$1(tmpvec3, a2, b2);\n        out[0] = tmpvec3[0];\n        out[1] = tmpvec3[1];\n        out[2] = tmpvec3[2];\n        out[3] = 1 + dot2;\n        return normalize$3(out, out);\n      }\n    };\n  })();\n  (function() {\n    var temp1 = create$4();\n    var temp2 = create$4();\n    return function(out, a2, b2, c2, d2, t) {\n      slerp(temp1, a2, d2, t);\n      slerp(temp2, b2, c2, t);\n      slerp(out, temp1, temp2, 2 * t * (1 - t));\n      return out;\n    };\n  })();\n  (function() {\n    var matr = create$8();\n    return function(out, view, right, up) {\n      matr[0] = right[0];\n      matr[3] = right[1];\n      matr[6] = right[2];\n      matr[1] = up[0];\n      matr[4] = up[1];\n      matr[7] = up[2];\n      matr[2] = -view[0];\n      matr[5] = -view[1];\n      matr[8] = -view[2];\n      return normalize$3(out, fromMat3(out, matr));\n    };\n  })();\n  function create$3() {\n    var out = new ARRAY_TYPE(2);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n    }\n    return out;\n  }\n  function clone$1(a2) {\n    var out = new ARRAY_TYPE(2);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    return out;\n  }\n  function fromValues(x2, y2) {\n    var out = new ARRAY_TYPE(2);\n    out[0] = x2;\n    out[1] = y2;\n    return out;\n  }\n  function copy$3(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    return out;\n  }\n  function set$5(out, x2, y2) {\n    out[0] = x2;\n    out[1] = y2;\n    return out;\n  }\n  function transformMat4(out, a2, m2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    out[0] = m2[0] * x2 + m2[4] * y2 + m2[12];\n    out[1] = m2[1] * x2 + m2[5] * y2 + m2[13];\n    return out;\n  }\n  function equals(a2, b2) {\n    var a0 = a2[0], a1 = a2[1];\n    var b0 = b2[0], b1 = b2[1];\n    return Math.abs(a0 - b0) <= EPSILON$3 * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON$3 * Math.max(1, Math.abs(a1), Math.abs(b1));\n  }\n  (function() {\n    var vec2 = create$3();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 2;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n      }\n      return a2;\n    };\n  })();\n  let Constants$1 = class Constants {\n  };\n  Constants$1.TWO_PI = 6.283185307179586;\n  Constants$1.PI = 3.141592653589793;\n  Constants$1.PI_OVER_TWO = 1.5707963267948966;\n  Constants$1.PI_OVER_THREE = 1.0471975511965976;\n  Constants$1.PI_OVER_FOUR = 0.7853981633974483;\n  Constants$1.PI_OVER_SIX = 0.5235987755982988;\n  Constants$1.LOG_2 = 0.6931471805599453;\n  Constants$1.RADIANS_PER_DEGREE = 0.017453292519943295;\n  Constants$1.DEGREES_PER_RADIAN = 57.29577951308232;\n  Constants$1.ROOT_TWO = 1.4142135623730951;\n  Constants$1.ROOT_TWO_OVER_TWO = 0.7071067811865476;\n  Constants$1.ROOT_THREE = 1.7320508075688772;\n  Constants$1.ROOT_THREE_OVER_TWO = 0.8660254037844386;\n  Constants$1.ROOT_THREE_OVER_THREE = 0.5773502691896257;\n  Constants$1.VECTOR2_ZERO = fromValues(0, 0);\n  Constants$1.VECTOR2_ONE = fromValues(1, 1);\n  Constants$1.VECTOR2_UNITX = fromValues(1, 0);\n  Constants$1.VECTOR2_UNITY = fromValues(0, 1);\n  Constants$1.VECTOR3_ZERO = fromValues$3(0, 0, 0);\n  Constants$1.VECTOR3_ONE = fromValues$3(1, 1, 1);\n  Constants$1.VECTOR3_UNITX = fromValues$3(1, 0, 0);\n  Constants$1.VECTOR3_UNITY = fromValues$3(0, 1, 0);\n  Constants$1.VECTOR3_UNITZ = fromValues$3(0, 0, 1);\n  Constants$1.VECTOR3_REFLECTX = fromValues$3(1, -1, -1);\n  Constants$1.VECTOR3_REFLECTY = fromValues$3(-1, 1, -1);\n  Constants$1.VECTOR3_REFLECTZ = fromValues$3(-1, -1, 1);\n  Constants$1.VECTOR4_ZERO = fromValues$2(0, 0, 0, 0);\n  Constants$1.VECTOR4_ONE = fromValues$2(1, 1, 1, 1);\n  Constants$1.VECTOR4_UNITX = fromValues$2(1, 0, 0, 0);\n  Constants$1.VECTOR4_UNITY = fromValues$2(0, 1, 0, 0);\n  Constants$1.VECTOR4_UNITZ = fromValues$2(0, 0, 1, 0);\n  Constants$1.VECTOR4_UNITW = fromValues$2(0, 0, 0, 1);\n  Constants$1.MAT3_IDENTITY = create$8();\n  Constants$1.MAT4_IDENTITY = create$7();\n  Constants$1.MAT4_ROTATION_MINUS_90 = fromValues$4(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  Constants$1.QUAT_IDENTITY = create$4();\n  Constants$1.QUAT_ROTATEX_PLUS_90 = fromValues$1(Constants$1.ROOT_TWO_OVER_TWO, 0, 0, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEX_MINUS_90 = fromValues$1(-Constants$1.ROOT_TWO_OVER_TWO, 0, 0, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEY_PLUS_90 = fromValues$1(0, Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEY_MINUS_90 = fromValues$1(0, -Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEZ_PLUS_90 = fromValues$1(0, 0, Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEZ_MINUS_90 = fromValues$1(0, 0, -Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.MILLISECONDS_PER_DAY = 864e5;\n  class MathHelper {\n    static simpleLinearRegression(points2) {\n      const n = points2.length;\n      let sumX = 0;\n      let sumY = 0;\n      let sumXY = 0;\n      let sumXX = 0;\n      for (let i = 0; i < n; i++) {\n        sumX += points2[i].x;\n        sumY += points2[i].y;\n        sumXY += points2[i].x * points2[i].y;\n        sumXX += points2[i].x * points2[i].x;\n      }\n      const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n      const yIntercept = (sumY - slope * sumX) / n;\n      return { slope, yIntercept };\n    }\n    static clamp(value2, min2, max2) {\n      return Math.max(Math.min(value2, max2), min2);\n    }\n    static lerp(value1, value2, amount) {\n      return value1 + (value2 - value1) * amount;\n    }\n    static normalize(value2, min2, max2, from = 0, to = 1) {\n      return max2 - min2 == 0 ? 0 : Math.max(Math.min((to - from) * (value2 - min2) / (max2 - min2) + from, to), from);\n    }\n    static splitExponent(value2, result) {\n      let exponent2 = Math.round(Math.log10(Math.abs(value2)));\n      let coefficient = value2 / Math.pow(10, exponent2);\n      if (coefficient < 1) {\n        coefficient *= 10;\n        exponent2--;\n      }\n      result[0] = coefficient;\n      result[1] = exponent2;\n    }\n    static combineExponent(mantissa, exponent2) {\n      return mantissa * Math.pow(10, exponent2);\n    }\n    static isPowerOf2(value2) {\n      return (value2 & value2 - 1) == 0;\n    }\n  }\n  class PseudoRandom {\n    constructor(seed) {\n      this._seed = seed % 2147483647;\n      if (this._seed <= 0)\n        this._seed += 2147483646;\n    }\n    next() {\n      return this._seed = this._seed * 16807 % 2147483647;\n    }\n    nextFloat() {\n      return (this.next() - 1) / 2147483646;\n    }\n    nextInteger(min2, max2) {\n      return Math.floor(this.nextFloat() * (max2 - min2 + 1) + min2);\n    }\n  }\n  class AngleHelper {\n    static degreesToRadians(degrees2) {\n      return degrees2 * Constants$1.RADIANS_PER_DEGREE;\n    }\n    static radiansToDegrees(radians2) {\n      return radians2 * Constants$1.DEGREES_PER_RADIAN;\n    }\n    static wrapAngle(angle2) {\n      if (angle2 > Constants$1.PI)\n        angle2 = angle2 - Constants$1.TWO_PI;\n      else if (angle2 < -Constants$1.PI)\n        angle2 += Constants$1.TWO_PI;\n      return angle2;\n    }\n    static sphericalToCartesian(altitude, longitude2, latitude, result) {\n      latitude = AngleHelper.degreesToRadians(latitude);\n      longitude2 = AngleHelper.degreesToRadians(longitude2);\n      const scale2 = Math.cos(latitude);\n      result[0] = altitude * scale2 * Math.sin(longitude2);\n      result[1] = altitude * Math.sin(latitude);\n      result[2] = altitude * scale2 * Math.cos(longitude2);\n    }\n    static cartesianToSpherical(x2, y2, z2, result) {\n      result[0] = Math.atan2(x2, z2);\n      result[1] = Math.asin(y2);\n    }\n    static angleBetweenVectors(from, to) {\n      if (exactEquals$1(from, to)) {\n        return 0;\n      } else {\n        const dot2 = MathHelper.clamp(dot$1(from, to), -1, 1);\n        return Math.acos(dot2);\n      }\n    }\n    static signedAngleBetweenVectors(from, to, up) {\n      if (exactEquals$1(from, to)) {\n        return 0;\n      } else {\n        const dot2 = MathHelper.clamp(dot$1(from, to), -1, 1);\n        let angle2 = Math.acos(dot2);\n        cross$1(AngleHelper._vec3, from, to);\n        if (dot$1(AngleHelper._vec3, up) < 0) {\n          angle2 = -angle2;\n        }\n        return angle2;\n      }\n    }\n  }\n  AngleHelper._vec3 = create$6();\n  class CameraBase {\n    getView(view) {\n      this.getPosition(view.position);\n    }\n    setView(view, isSmooth) {\n      this.setPosition(view.position, isSmooth);\n    }\n    lerpView(from, to, time2) {\n      lerp$1(this._vec3, from.position, to.position, time2);\n      this.setPosition(this._vec3, false);\n    }\n    get vMatrices() {\n      return this._vMatrices;\n    }\n    get inverseVMatrices() {\n      return this._inverseVMatrices;\n    }\n    get mvMatrices() {\n      return this._mvMatrices;\n    }\n    get pMatrices() {\n      return this._pMatrices;\n    }\n    get inversePMatrices() {\n      return this._inversePMatrices;\n    }\n    get pickVMatrix() {\n      return this._pickVMatrix;\n    }\n    get rMatrix() {\n      return this._mat3;\n    }\n    getOrbit(value2) {\n      copy$4(value2, this._orbitRotation);\n    }\n    setOrbit(value2, isSmooth) {\n      copy$4(this._orbitRotation, value2);\n      if (!isSmooth) {\n        copy$4(this._smoothedOrbitRotation, value2);\n      }\n    }\n    getPosition(value2) {\n      copy$6(value2, this._cameraPosition);\n    }\n    setPosition(value2, isSmooth) {\n      copy$6(this._cameraPosition, value2);\n      if (!isSmooth) {\n        copy$6(this._smoothedCameraPosition, value2);\n      }\n    }\n    constructor(core) {\n      this._core = core;\n      this._vec3 = create$6();\n      this._quat = create$4();\n      this._mat3 = create$8();\n      this._right = create$6();\n      this._up = create$6();\n      this._forward = create$6();\n      this._modelManipulationOrigin = create$6();\n      this.modelPosition = create$6();\n      this.modelScale = create$6();\n      this.modelRotation = create$4();\n      this._orbitRotation = create$4();\n      this._orbitDirection = create$4();\n      this._smoothedOrbitRotation = create$4();\n      this._smoothedCameraPosition = create$6();\n      this._smoothedCameraRotation = create$4();\n      this._cameraPosition = create$6();\n      this._cameraRotation = create$4();\n      this._combinedPosition = create$6();\n      this._combinedRotation = create$4();\n      this._leftToRightEye = create$6();\n      this._pickVMatrix = create$7();\n      this._eyePositions = [create$6(), create$6()];\n      this._vMatrices = [create$7(), create$7()];\n      this._mvMatrices = [create$7(), create$7()];\n      this._pMatrices = [create$7(), create$7()];\n      this._inverseVMatrices = [create$7(), create$7()];\n      this._inversePMatrices = [create$7(), create$7()];\n    }\n    reset(isSmooth) {\n      copy$6(this._cameraPosition, Constants$1.VECTOR3_ZERO);\n      copy$4(this._cameraRotation, Constants$1.QUAT_IDENTITY);\n      copy$4(this._orbitRotation, Constants$1.QUAT_IDENTITY);\n      if (!isSmooth) {\n        this.syncSmooth();\n      }\n    }\n    update(elapsedTime) {\n      let amount = Math.min(elapsedTime * this._core.config.positionSmoothing, 1);\n      lerp$1(this._smoothedCameraPosition, this._smoothedCameraPosition, this._cameraPosition, amount);\n      amount = Math.min(elapsedTime * this._core.config.rotationSmoothing, 1);\n      slerp(this._smoothedCameraRotation, this._smoothedCameraRotation, this._cameraRotation, amount);\n      slerp(this._smoothedOrbitRotation, this._smoothedOrbitRotation, this._orbitRotation, amount);\n      const epsilon3 = 1e-6;\n      let x2;\n      let y2;\n      let z2;\n      let w2;\n      x2 = this._smoothedCameraPosition[0] - this._cameraPosition[0];\n      y2 = this._smoothedCameraPosition[1] - this._cameraPosition[1];\n      z2 = this._smoothedCameraPosition[2] - this._cameraPosition[2];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z2) < epsilon3) {\n        copy$6(this._smoothedCameraPosition, this._cameraPosition);\n      }\n      x2 = this._smoothedCameraRotation[0] - this._cameraRotation[0];\n      y2 = this._smoothedCameraRotation[1] - this._cameraRotation[1];\n      z2 = this._smoothedCameraRotation[2] - this._cameraRotation[2];\n      w2 = this._smoothedCameraRotation[3] - this._cameraRotation[3];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z2) < epsilon3 && Math.abs(w2) < epsilon3) {\n        copy$4(this._smoothedCameraRotation, this._cameraRotation);\n      }\n      x2 = this._smoothedOrbitRotation[0] - this._orbitRotation[0];\n      y2 = this._smoothedOrbitRotation[1] - this._orbitRotation[1];\n      z2 = this._smoothedOrbitRotation[2] - this._orbitRotation[2];\n      w2 = this._smoothedOrbitRotation[3] - this._orbitRotation[3];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z2) < epsilon3 && Math.abs(w2) < epsilon3) {\n        copy$4(this._smoothedOrbitRotation, this._orbitRotation);\n      }\n      normalize$3(this._smoothedCameraRotation, this._smoothedCameraRotation);\n      normalize$3(this._smoothedOrbitRotation, this._smoothedOrbitRotation);\n      conjugate(this._orbitDirection, this._smoothedOrbitRotation);\n      transformMat4$2(this._modelManipulationOrigin, this.modelManipulationOrigin, this.modelMMatrix);\n      subtract(this._vec3, this._smoothedCameraPosition, this._modelManipulationOrigin);\n      transformQuat(this._combinedPosition, this._vec3, this._orbitDirection);\n      add$4(this._combinedPosition, this._combinedPosition, this._modelManipulationOrigin);\n      multiply(this._combinedRotation, this._orbitDirection, this._smoothedCameraRotation);\n      fromQuat$1(this._mat3, this._combinedRotation);\n      this._right[0] = this._mat3[0];\n      this._right[1] = this._mat3[1];\n      this._right[2] = this._mat3[2];\n      this._up[0] = this._mat3[3];\n      this._up[1] = this._mat3[4];\n      this._up[2] = this._mat3[5];\n      this._forward[0] = this._mat3[6];\n      this._forward[1] = this._mat3[7];\n      this._forward[2] = this._mat3[8];\n      const view = this._vMatrices[0];\n      view[0] = this._right[0];\n      view[1] = this._up[0];\n      view[2] = this._forward[0];\n      view[4] = this._right[1];\n      view[5] = this._up[1];\n      view[6] = this._forward[1];\n      view[8] = this._right[2];\n      view[9] = this._up[2];\n      view[10] = this._forward[2];\n      view[12] = -dot$1(this._right, this._combinedPosition);\n      view[13] = -dot$1(this._up, this._combinedPosition);\n      view[14] = -dot$1(this._forward, this._combinedPosition);\n      const aspectRatio = this.width / this.height;\n      if (this._core.config.stereoMode == StereoMode.none) {\n        if (this._core.config.tilesX != 1 || this._core.config.tilesY != 1) {\n          const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n          const bottom = -top;\n          const left = -aspectRatio * top;\n          const right = aspectRatio * top;\n          const width2 = right - left;\n          const height2 = top - bottom;\n          const tileWidth = width2 / this._core.config.tilesX;\n          const tileHeight = height2 / this._core.config.tilesY;\n          frustum(this._pMatrices[0], left + this._core.config.tileOffsetX * tileWidth, left + (this._core.config.tileOffsetX + 1) * tileWidth, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY - 1) * tileHeight, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY) * tileHeight, this._core.config.nearPlane, this._core.config.farPlane);\n        } else {\n          perspective(this.pMatrices[0], this._core.config.fov, aspectRatio, this._core.config.nearPlane, this._core.config.farPlane);\n        }\n        multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n        invert$1(this._inverseVMatrices[0], this.vMatrices[0]);\n        invert$1(this._inversePMatrices[0], this.pMatrices[0]);\n      } else {\n        cross$1(this._leftToRightEye, this._forward, this._up);\n        normalize$5(this._leftToRightEye, this._leftToRightEye);\n        scaleAndAdd(this._eyePositions[0], this._combinedPosition, this._leftToRightEye, -this._core.config.ipd);\n        scaleAndAdd(this._eyePositions[1], this._combinedPosition, this._leftToRightEye, this._core.config.ipd);\n        this._vMatrices[0][12] += this._core.config.ipd * 0.5;\n        copy$7(this._vMatrices[1], this._vMatrices[0]);\n        this._vMatrices[1][12] -= this._core.config.ipd;\n        const frustumShift = this._core.config.ipd * 0.5 * this._core.config.nearPlane / this._core.config.screenDistance;\n        const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n        const bottom = -top;\n        let left = -aspectRatio * top + frustumShift;\n        let right = aspectRatio * top + frustumShift;\n        frustum(this._pMatrices[0], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n        left = -aspectRatio * top - frustumShift;\n        right = aspectRatio * top - frustumShift;\n        frustum(this._pMatrices[1], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n        multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n        multiply$2(this._mvMatrices[1], this._vMatrices[1], this.modelMMatrix);\n        invert$1(this._inverseVMatrices[0], this._vMatrices[0]);\n        invert$1(this._inversePMatrices[0], this._pMatrices[0]);\n        copy$7(this._inverseVMatrices[1], this._inverseVMatrices[0]);\n        this._inverseVMatrices[1][12] += this._core.config.ipd;\n        invert$1(this._inversePMatrices[1], this._pMatrices[1]);\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`cam off ${this._cameraPosition[0] < 0 ? \"\" : \" \"}${this._cameraPosition[0].toFixed(3)},${this._cameraPosition[1] < 0 ? \"\" : \" \"}${this._cameraPosition[1].toFixed(3)},${this._cameraPosition[2] < 0 ? \"\" : \" \"}${this._cameraPosition[2].toFixed(3)}`);\n        this._core.debugText.addLine(`cam pos ${this._combinedPosition[0] < 0 ? \"\" : \" \"}${this._combinedPosition[0].toFixed(3)},${this._combinedPosition[1] < 0 ? \"\" : \" \"}${this._combinedPosition[1].toFixed(3)},${this._combinedPosition[2] < 0 ? \"\" : \" \"}${this._combinedPosition[2].toFixed(3)}`);\n        this._core.debugText.addLine(`cam rot ${this._combinedRotation[0] < 0 ? \"\" : \" \"}${this._combinedRotation[0].toFixed(3)},${this._combinedRotation[1] < 0 ? \"\" : \" \"}${this._combinedRotation[1].toFixed(3)},${this._combinedRotation[2] < 0 ? \"\" : \" \"}${this._combinedRotation[2].toFixed(3)},${this._combinedRotation[3] < 0 ? \"\" : \" \"}${this._combinedRotation[3].toFixed(3)}`);\n      }\n    }\n    _zoom(direction, distance2) {\n      scaleAndAdd(this._cameraPosition, this._cameraPosition, direction, distance2);\n    }\n    rotate(translationDelta) {\n    }\n    zoom(zoomDelta, x2, y2) {\n      this.unproject(this._vec3, x2, y2, 1);\n      normalize$5(this._vec3, this._vec3);\n      const distance$1 = zoomDelta * distance(this._combinedPosition, this.modelPosition);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      this._zoom(this._vec3, distance$1);\n    }\n    _twist(axis, angle2) {\n    }\n    twist(angle2, x2, y2) {\n    }\n    updatePickVMatrix(x2, y2) {\n      this.unproject(this._vec3, x2, y2, 1);\n      lookAt(this._pickVMatrix, this._combinedPosition, this._vec3, this._up);\n    }\n    syncSmooth() {\n      copy$6(this._smoothedCameraPosition, this._cameraPosition);\n      copy$4(this._smoothedCameraRotation, this._cameraRotation);\n      copy$4(this._smoothedOrbitRotation, this._orbitRotation);\n    }\n    updateModelManipulationOrigin(from, to) {\n      const a2 = create$6();\n      const b2 = create$6();\n      const c2 = create$6();\n      const d2 = create$6();\n      transformMat4$2(a2, from, this.modelMMatrix);\n      transformMat4$2(b2, to, this.modelMMatrix);\n      subtract(a2, this._cameraPosition, a2);\n      subtract(b2, this._cameraPosition, b2);\n      transformQuat(c2, a2, this._orbitDirection);\n      transformQuat(d2, b2, this._orbitDirection);\n      subtract(c2, c2, a2);\n      subtract(d2, d2, b2);\n      subtract(this._vec3, c2, d2);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      add$4(this._cameraPosition, this._cameraPosition, this._vec3);\n      add$4(this._smoothedCameraPosition, this._smoothedCameraPosition, this._vec3);\n    }\n    unproject(position2, x2, y2, z2) {\n      set$8(position2, 2 * x2 / this.width - 1, 1 - 2 * y2 / this.height, z2);\n      transformMat4$2(position2, position2, this._inversePMatrices[0]);\n      transformMat4$2(position2, position2, this._inverseVMatrices[0]);\n    }\n    translate(translationDelta) {\n      const distance$1 = distance(this.modelPosition, this._combinedPosition);\n      const height2 = 2 * Math.tan(this._core.config.fov / 2) * distance$1 / this.height;\n      set$8(this._vec3, height2 * translationDelta[0], -height2 * translationDelta[1], 0);\n      transformQuat(this._vec3, this._vec3, this._combinedRotation);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      subtract(this._cameraPosition, this._cameraPosition, this._vec3);\n    }\n  }\n  class AltAzimuthCamera extends CameraBase {\n    getView(view) {\n      super.getView(view);\n      view.altitude = this.altitude;\n      view.azimuth = this.azimuth;\n      view.fov = this._core.config.fov;\n    }\n    setView(view, isSmooth) {\n      super.setView(view, isSmooth);\n      this.setAltAzimuth(view.altitude, view.azimuth, isSmooth);\n      this._core.config.fov = view.fov;\n    }\n    lerpView(from, to, time2) {\n      super.lerpView(from, to, time2);\n      this.setAltAzimuth(MathHelper.lerp(from.altitude, to.altitude, time2), MathHelper.lerp(from.azimuth, to.azimuth, time2), false);\n      this._core.config.fov = MathHelper.lerp(from.fov, to.fov, time2);\n    }\n    update(elapsedTime) {\n      super.update(elapsedTime);\n      if (this._core.config.isDebugVisible) {\n        const altitude = AngleHelper.radiansToDegrees(this.altitude);\n        const azimuth = AngleHelper.radiansToDegrees(this.azimuth);\n        this._core.debugText.addLine(`cam alt ${altitude < 0 ? \"\" : \" \"}${altitude.toFixed(1)}`);\n        this._core.debugText.addLine(`cam azi ${azimuth < 0 ? \"\" : \" \"}${azimuth.toFixed(1)}`);\n      }\n    }\n    get altitude() {\n      transformQuat(this._up, Constants$1.VECTOR3_UNITY, this._combinedRotation);\n      transformQuat(this._right, Constants$1.VECTOR3_UNITX, this._combinedRotation);\n      return -AngleHelper.signedAngleBetweenVectors(Constants$1.VECTOR3_UNITY, this._up, this._right);\n    }\n    get azimuth() {\n      transformQuat(this._up, Constants$1.VECTOR3_UNITY, this._combinedRotation);\n      transformQuat(this._right, Constants$1.VECTOR3_UNITX, this._combinedRotation);\n      return -AngleHelper.signedAngleBetweenVectors(Constants$1.VECTOR3_UNITX, this._right, this._up);\n    }\n    setAltAzimuth(altitude, azimuth, isSmooth) {\n      setAxisAngle(this._quat, Constants$1.VECTOR3_UNITX, altitude);\n      multiply(this._orbitRotation, this._quat, Constants$1.QUAT_IDENTITY);\n      setAxisAngle(this._quat, Constants$1.VECTOR3_UNITY, azimuth);\n      multiply(this._orbitRotation, this._orbitRotation, this._quat);\n      if (!isSmooth) {\n        this.syncSmooth();\n      }\n    }\n    rotate(translationDelta) {\n      const length2 = Math.min(this.width, this.height);\n      let angle2 = translationDelta[1] * Constants$1.PI / length2;\n      setAxisAngle(this._quat, Constants$1.VECTOR3_UNITX, angle2);\n      multiply(this._orbitRotation, this._quat, this._orbitRotation);\n      angle2 = translationDelta[0] * Constants$1.PI / length2;\n      setAxisAngle(this._quat, Constants$1.VECTOR3_UNITY, angle2);\n      multiply(this._orbitRotation, this._orbitRotation, this._quat);\n    }\n  }\n  let Config$2 = class Config {\n    constructor(core) {\n      this.reset();\n    }\n    reset() {\n      this.isDebugVisible = false;\n      this.logLevel = LogLevel.warn;\n      this.shaderPath = \"shaders\";\n      this.fontPath = \"fonts\";\n      this.modelDistance = 0.5;\n      this.modelSize = 0.25;\n      this.stereoMode = StereoMode.none;\n      this.ipd = 0.06;\n      this.screenDistance = 0.5;\n      this.fov = AngleHelper.degreesToRadians(30);\n      this.nearPlane = 0.01;\n      this.farPlane = 100;\n      this.pickWidth = 512;\n      this.pickHeight = 512;\n      this.pickHoldDelay = 1e3;\n      this.pickSelectDelay = 100;\n      this.resizeMinimumDelay = 250;\n      this.rotationSmoothing = 0.02;\n      this.positionSmoothing = 0.02;\n      this.focusSmoothing = 0.01;\n      this.scaleSmoothing = 0.02;\n      this.mouseWheelZoomScale = -2e-3;\n      this.mouseWheelRotationScale = -2e-3;\n      this.dragToleranceSquared = 100;\n      this.manipulatorMinRelativeDistanceSquared = 100;\n      this.isMultiTouchEnabled = true;\n      this.isMultiTouchZoomEnabled = true;\n      this.isMultiTouchTwistEnabled = true;\n      this.isMultiTouchRotateEnabled = true;\n      this.isMultiTouchTranslateEnabled = true;\n      this.multiTouchZoomScale = 1;\n      this.cameraMinDistance = 0.1;\n      this.cameraMaxDistance = 10;\n      this.xrControllerRayColor = fromValues$3(0.5, 0.5, 0.5);\n      this.xrControllerProfile = \"windows-mixed-reality\";\n      this.xrControllerHandedness = \"right\";\n      this.paletteColor = new Uint8Array([128, 128, 128, 0]);\n      this.textColor = create$6();\n      this.textHoverColor = create$6();\n      this.textBorderColor = create$6();\n      this.textBorderWidth = 24 / 255;\n      this.identityRotation = Constants$1.VECTOR3_UNITY;\n      this.axesTextLabelMaxGlyphs = 32;\n      this.axesTextColor = create$6();\n      this.axesTextBorderColor = create$6();\n      this.axesTextHoverColor = create$6();\n      this.axesTextLabelMajorSize = 0.03;\n      this.axesTextLabelMinorSize = 0.02;\n      this.axesTextTitleMaxGlyphs = 127;\n      this.axesTextTitleSize = 0.05;\n      this.axesTextHeadingMaxGlyphs = 128;\n      this.axesTextHeadingSize = 0.075;\n      this.axesTextTitleLineHeight = 1.5;\n      this.axesTextHeadingLineHeight = 1.5;\n      this.axesTextLabelLineHeight = 1.5;\n      this.axesGridMajorThickness = 2e-4;\n      this.axesGridMinorThickness = 1e-4;\n      this.axesGridZeroThickness = 2e-3;\n      this.axesGridPickDivisionHeight = 0.025;\n      this.axesGridBackgroundColor = create$6();\n      this.axesGridHighlightColor = create$6();\n      this.axesGridMinorColor = create$6();\n      this.axesGridMajorColor = create$6();\n      this.axesGridZeroColor = create$6();\n      this.axesGridDefaultDivisions = 10;\n      this.keyTitleMaxGlyphs = 64;\n      this.keyLabelMaxGlyphs = 64;\n      this.selectionColor = create$6();\n      this.hoverColor = create$6();\n      this.activeColor = create$6();\n      this.highlightMode = HighlightMode.color;\n      this.lassoThickness = 4;\n      this.lassoDashWidth = 2;\n      this.lassoColor = create$6();\n      this.minCubifiedTreeMapSlice = 0.01;\n      this.sdfBuffer = 192;\n      this.sdfBorder = 0;\n      this.forceDirectIsEnabled = false;\n      this.forceDirectAttraction = 1;\n      this.forceDirectRepulsion = 1;\n      this.forceDirectGravity = 1;\n      this.forceDirectInterval = 0.1;\n      this.forceDirectMaxDistance = 0.1;\n      this.forceDirectTheta = 1;\n      this.forceDirectIterationsPerLayout = 1;\n      this.forceDirectEdgeWeightPower = 1;\n      this.forceDirectLockX = false;\n      this.forceDirectLockY = false;\n      this.forceDirectLockZ = false;\n      this.transitionDuration = 400;\n      this.transitionStaggering = 100;\n      this.transitionView = true;\n      this.isTransitionPickingEnabled = false;\n      this.backgroundColor = create$5();\n      this.theme = Theme.light;\n      this.ambientColor = create$6();\n      this.renderMode = RenderMode.color;\n      this.tilesX = 1;\n      this.tilesY = 1;\n      this.tileOffsetX = 0;\n      this.tileOffsetY = 0;\n    }\n    get theme() {\n      return this._theme;\n    }\n    set theme(value2) {\n      if (this._theme != value2) {\n        this._theme = value2;\n        switch (value2) {\n          case Theme.dark:\n            set$7(this.backgroundColor, 0, 0, 0, 1);\n            set$8(this.textColor, 0.9, 0.9, 0.9);\n            set$8(this.textHoverColor, 1, 1, 1);\n            set$8(this.textBorderColor, 0, 0, 0);\n            set$8(this.axesTextColor, 0.9, 0.9, 0.9);\n            set$8(this.axesTextBorderColor, 0, 0, 0);\n            set$8(this.axesTextHoverColor, 1, 1, 1);\n            set$8(this.axesGridBackgroundColor, 0.02, 0.02, 0.02);\n            set$8(this.axesGridHighlightColor, 0.04, 0.04, 0.04);\n            set$8(this.axesGridMinorColor, 0.05, 0.05, 0.05);\n            set$8(this.axesGridMajorColor, 0.1, 0.1, 0.1);\n            set$8(this.axesGridZeroColor, 0.05, 0.1, 0.1);\n            set$8(this.selectionColor, 1, 1, 0);\n            set$8(this.hoverColor, 1, 0, 1);\n            set$8(this.activeColor, 0, 1, 1);\n            set$8(this.lassoColor, 0.9, 0.9, 0.9);\n            break;\n          case Theme.light:\n            set$7(this.backgroundColor, 1, 1, 1, 1);\n            set$8(this.textColor, 0, 0, 0);\n            set$8(this.textHoverColor, 0.1, 0.1, 0.1);\n            set$8(this.textBorderColor, 1, 1, 1);\n            set$8(this.axesTextColor, 0, 0, 0);\n            set$8(this.axesTextBorderColor, 1, 1, 1);\n            set$8(this.axesTextHoverColor, 0.1, 0.1, 0.1);\n            set$8(this.axesGridBackgroundColor, 1, 1, 1);\n            set$8(this.axesGridHighlightColor, 0.925, 0.925, 0.925);\n            set$8(this.axesGridMinorColor, 0.9, 0.9, 0.9);\n            set$8(this.axesGridMajorColor, 0.8, 0.8, 0.8);\n            set$8(this.axesGridZeroColor, 0.7, 0.9, 0.9);\n            set$8(this.selectionColor, 1, 1, 0);\n            set$8(this.hoverColor, 1, 0, 1);\n            set$8(this.activeColor, 0, 1, 1);\n            set$8(this.lassoColor, 0.1, 0.1, 0.1);\n            break;\n        }\n        if (this.themeChangedCallback) {\n          this.themeChangedCallback(this._theme);\n        }\n      }\n    }\n  };\n  class DebugText {\n    get text() {\n      return this._text;\n    }\n    constructor() {\n      this.clear();\n    }\n    clear() {\n      this._text = \"\";\n    }\n    addLine(value2) {\n      this._text += value2 + \"\\n\";\n    }\n  }\n  class Fps {\n    get frameCounter() {\n      return this._frameCounter;\n    }\n    get totalFrames() {\n      return this._totalFrames;\n    }\n    constructor(core) {\n      this._core = core;\n      this._totalFrames = 0;\n      this.reset();\n    }\n    update(elapsedTime) {\n      this._elapsedTime += elapsedTime;\n      if (this._elapsedTime > 1e3) {\n        this._elapsedTime -= 1e3;\n        this._fps = this._frameCounter;\n        this._frameCounter = 0;\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`fps      ${this._fps}`);\n      }\n    }\n    render() {\n      this._frameCounter++;\n      this._totalFrames++;\n    }\n    reset() {\n      this._fps = 0;\n      this._frameCounter = 0;\n      this._elapsedTime = 0;\n    }\n  }\n  const PaletteType = {\n    sequentialsinglehue: \"sequentialsinglehue\",\n    sequentialmultihue: \"sequentialmultihue\",\n    diverging: \"diverging\",\n    qualitative: \"qualitative\"\n  };\n  class PaletteResources {\n    constructor() {\n      this.palettes = {\n        \"blues\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 251, 255, 222, 235, 247, 198, 219, 239, 158, 202, 225, 107, 174, 214, 66, 146, 198, 33, 113, 181, 8, 81, 156, 8, 48, 107]) },\n        \"greens\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 252, 245, 229, 245, 224, 199, 233, 192, 161, 217, 155, 116, 196, 118, 65, 171, 93, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n        \"greys\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 255, 255, 240, 240, 240, 217, 217, 217, 189, 189, 189, 150, 150, 150, 115, 115, 115, 82, 82, 82, 37, 37, 37, 0, 0, 0]) },\n        \"oranges\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 235, 254, 230, 206, 253, 208, 162, 253, 174, 107, 253, 141, 60, 241, 105, 19, 217, 72, 1, 166, 54, 3, 127, 39, 4]) },\n        \"purples\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([252, 251, 253, 239, 237, 245, 218, 218, 235, 188, 189, 220, 158, 154, 200, 128, 125, 186, 106, 81, 163, 84, 39, 143, 63, 0, 125]) },\n        \"reds\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 240, 254, 224, 210, 252, 187, 161, 252, 146, 114, 251, 106, 74, 239, 59, 44, 203, 24, 29, 165, 15, 21, 103, 0, 13]) },\n        \"viridis\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([72, 37, 117, 65, 68, 135, 53, 96, 141, 42, 120, 142, 33, 145, 141, 34, 168, 132, 67, 191, 113, 122, 209, 81, 188, 223, 39]) },\n        \"inferno\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([23, 12, 59, 66, 10, 104, 107, 23, 110, 147, 38, 103, 187, 55, 85, 221, 81, 58, 243, 119, 26, 252, 165, 10, 246, 214, 69]) },\n        \"magma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([21, 14, 55, 59, 15, 112, 101, 26, 128, 140, 41, 129, 182, 55, 122, 222, 73, 104, 247, 111, 92, 254, 159, 109, 254, 206, 145]) },\n        \"plasma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([66, 3, 157, 106, 0, 168, 144, 13, 164, 177, 42, 144, 203, 71, 121, 225, 100, 98, 242, 131, 76, 252, 166, 54, 252, 206, 37]) },\n        \"bluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 229, 245, 249, 204, 236, 230, 153, 216, 201, 102, 194, 164, 65, 174, 118, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n        \"bluepurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 224, 236, 244, 191, 211, 230, 158, 188, 218, 140, 150, 198, 140, 107, 177, 136, 65, 157, 129, 15, 124, 77, 0, 75]) },\n        \"greenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 240, 224, 243, 219, 204, 235, 197, 168, 221, 181, 123, 204, 196, 78, 179, 211, 43, 140, 190, 8, 104, 172, 8, 64, 129]) },\n        \"orangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 236, 254, 232, 200, 253, 212, 158, 253, 187, 132, 252, 141, 89, 239, 101, 72, 215, 48, 31, 179, 0, 0, 127, 0, 0]) },\n        \"purpleblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 231, 242, 208, 209, 230, 166, 189, 219, 116, 169, 207, 54, 144, 192, 5, 112, 176, 4, 90, 141, 2, 56, 88]) },\n        \"purplebluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 226, 240, 208, 209, 230, 166, 189, 219, 103, 169, 207, 54, 144, 192, 2, 129, 138, 1, 108, 89, 1, 70, 54]) },\n        \"purplered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 244, 249, 231, 225, 239, 212, 185, 218, 201, 148, 199, 223, 101, 176, 231, 41, 138, 206, 18, 86, 152, 0, 67, 103, 0, 31]) },\n        \"redpurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 243, 253, 224, 221, 252, 197, 192, 250, 159, 181, 247, 104, 161, 221, 52, 151, 174, 1, 126, 122, 1, 119, 73, 0, 106]) },\n        \"yellowgreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 247, 252, 185, 217, 240, 163, 173, 221, 142, 120, 198, 121, 65, 171, 93, 35, 132, 67, 0, 104, 55, 0, 69, 41]) },\n        \"yellowgreenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 217, 237, 248, 177, 199, 233, 180, 127, 205, 187, 65, 182, 196, 29, 145, 192, 34, 94, 168, 37, 52, 148, 8, 29, 88]) },\n        \"yelloworangebrown\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 255, 247, 188, 254, 227, 145, 254, 196, 79, 254, 153, 41, 236, 112, 20, 204, 76, 2, 153, 52, 4, 102, 37, 6]) },\n        \"yelloworangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 204, 255, 237, 160, 254, 217, 118, 254, 178, 76, 253, 141, 60, 252, 78, 42, 227, 26, 28, 189, 0, 38, 128, 0, 38]) },\n        \"brownbluegreen\": { type: PaletteType.diverging, colors: new Uint8Array([84, 48, 5, 140, 81, 10, 191, 129, 45, 223, 194, 125, 246, 232, 195, 245, 245, 245, 199, 234, 229, 128, 205, 193, 53, 151, 143, 1, 102, 94, 0, 60, 48]) },\n        \"pinkyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([142, 1, 82, 197, 27, 125, 222, 119, 174, 241, 182, 218, 253, 224, 239, 247, 247, 247, 230, 245, 208, 184, 225, 134, 127, 188, 65, 77, 146, 33, 39, 100, 25]) },\n        \"purplegreen\": { type: PaletteType.diverging, colors: new Uint8Array([64, 0, 75, 118, 42, 131, 153, 112, 171, 194, 165, 207, 231, 212, 232, 247, 247, 247, 217, 240, 211, 166, 219, 160, 90, 174, 97, 27, 120, 55, 0, 68, 27]) },\n        \"purpleorange\": { type: PaletteType.diverging, colors: new Uint8Array([127, 59, 8, 179, 88, 6, 224, 130, 20, 253, 184, 99, 254, 224, 182, 247, 247, 247, 216, 218, 235, 178, 171, 210, 128, 115, 172, 84, 39, 136, 45, 0, 75]) },\n        \"redblue\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 247, 247, 247, 209, 229, 240, 146, 197, 222, 67, 147, 195, 33, 102, 172, 5, 48, 97]) },\n        \"redgrey\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 255, 255, 255, 224, 224, 224, 186, 186, 186, 135, 135, 135, 77, 77, 77, 26, 26, 26]) },\n        \"redyellowblue\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 144, 255, 255, 191, 224, 243, 248, 171, 217, 233, 116, 173, 209, 69, 117, 180, 49, 54, 149]) },\n        \"redyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 217, 239, 139, 166, 217, 106, 102, 189, 99, 26, 152, 80, 0, 104, 55]) },\n        \"spectral\": { type: PaletteType.diverging, colors: new Uint8Array([158, 1, 66, 213, 62, 79, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 230, 245, 152, 171, 221, 164, 102, 194, 165, 50, 136, 189, 94, 79, 162]) },\n        \"accent\": { type: PaletteType.qualitative, colors: new Uint8Array([127, 201, 127, 190, 174, 212, 253, 192, 134, 255, 255, 153, 56, 108, 176, 240, 2, 127, 191, 91, 23, 102, 102, 102]) },\n        \"category10\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 255, 127, 14, 44, 160, 44, 214, 39, 40, 148, 103, 189, 140, 86, 75, 227, 119, 194, 127, 127, 127, 188, 189, 34, 23, 190, 207]) },\n        \"category20\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 174, 199, 232, 255, 127, 14, 255, 187, 120, 44, 160, 44, 152, 223, 138, 214, 39, 40, 255, 152, 150, 148, 103, 189, 197, 176, 213, 140, 86, 75, 196, 156, 148, 227, 119, 194, 247, 182, 210, 127, 127, 127, 199, 199, 199, 188, 189, 34, 219, 219, 141, 23, 190, 207, 158, 218, 229]) },\n        \"dark2\": { type: PaletteType.qualitative, colors: new Uint8Array([27, 158, 119, 217, 95, 2, 117, 112, 179, 231, 41, 138, 102, 166, 30, 230, 171, 2, 166, 118, 29, 102, 102, 102]) },\n        \"paired\": { type: PaletteType.qualitative, colors: new Uint8Array([166, 206, 227, 31, 120, 180, 178, 223, 138, 51, 160, 44, 251, 154, 153, 227, 26, 28, 253, 191, 111, 255, 127, 0, 202, 178, 214, 106, 61, 154, 255, 255, 153, 177, 89, 40]) },\n        \"pastel1\": { type: PaletteType.qualitative, colors: new Uint8Array([251, 180, 174, 179, 205, 227, 204, 235, 197, 222, 203, 228, 254, 217, 166, 255, 255, 204, 229, 216, 189, 253, 218, 236, 242, 242, 242]) },\n        \"pastel2\": { type: PaletteType.qualitative, colors: new Uint8Array([179, 226, 205, 253, 205, 172, 203, 213, 232, 244, 202, 228, 230, 245, 201, 255, 242, 174, 241, 226, 204, 204, 204, 204]) },\n        \"set1\": { type: PaletteType.qualitative, colors: new Uint8Array([228, 26, 28, 55, 126, 184, 77, 175, 74, 152, 78, 163, 255, 127, 0, 255, 255, 51, 166, 86, 40, 247, 129, 191, 153, 153, 153]) },\n        \"set2\": { type: PaletteType.qualitative, colors: new Uint8Array([102, 194, 165, 252, 141, 98, 141, 160, 203, 231, 138, 195, 166, 216, 84, 255, 217, 47, 229, 196, 148, 179, 179, 179]) },\n        \"set3\": { type: PaletteType.qualitative, colors: new Uint8Array([141, 211, 199, 255, 255, 179, 190, 186, 218, 251, 128, 114, 128, 177, 211, 253, 180, 98, 179, 222, 105, 252, 205, 229, 217, 217, 217, 188, 128, 189, 204, 235, 197, 255, 237, 111]) }\n      };\n    }\n  }\n  class PaletteBase {\n    get colors() {\n      return this._colors;\n    }\n    set colors(value2) {\n      if (this._colors != value2) {\n        this._colors = value2;\n        this._changed = true;\n      }\n    }\n    constructor() {\n      this._colors = null;\n    }\n    copyFrom(palette) {\n      if (palette.colors) {\n        this.colors = new Uint8Array(palette.colors);\n      } else {\n        this.colors = null;\n      }\n    }\n    update() {\n    }\n  }\n  let Palette$3 = class Palette extends PaletteBase {\n  };\n  class PositionVertex {\n    static getPosition(buffer, index2, value2) {\n      const offset2 = index2 * PositionVertex.SIZE;\n      set$8(value2, buffer[offset2], buffer[offset2 + 1], buffer[offset2 + 2]);\n    }\n    static setPosition(buffer, index2, value2) {\n      const offset2 = index2 * PositionVertex.SIZE;\n      buffer[offset2] = value2[0];\n      buffer[offset2 + 1] = value2[1];\n      buffer[offset2 + 2] = value2[2];\n    }\n  }\n  PositionVertex.SIZE = 3;\n  PositionVertex.SIZE_BYTES = 12;\n  class PositionColorVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getColor(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      set$8(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255);\n    }\n    static setColor(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n    }\n  }\n  PositionColorVertex.SIZE_BYTES = 16;\n  PositionColorVertex.POSITION_OFFSET_BYTES = 0;\n  PositionColorVertex.COLOR_OFFSET_BYTES = 12;\n  class PositionTextureVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n  }\n  PositionTextureVertex.SIZE_BYTES = 16;\n  PositionTextureVertex.POSITION_OFFSET_BYTES = 0;\n  PositionTextureVertex.TEX_COORD_OFFSET_BYTES = 12;\n  class PositionTexturePickVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$7(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n  }\n  PositionTexturePickVertex.SIZE_BYTES = 20;\n  PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES = 0;\n  PositionTexturePickVertex.POSITION_OFFSET_BYTES = 4;\n  PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES = 16;\n  class PositionNormalTextureVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getNormal(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      set$8(value2, bufferView.getInt8(offset2) / 127, bufferView.getInt8(offset2 + 1) / 127, bufferView.getInt8(offset2 + 2) / 127);\n    }\n    static setNormal(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      bufferView.setInt8(offset2, value2[0] * 127);\n      bufferView.setInt8(offset2 + 1, value2[1] * 127);\n      bufferView.setInt8(offset2 + 2, value2[2] * 127);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n  }\n  PositionNormalTextureVertex.SIZE_BYTES = 20;\n  PositionNormalTextureVertex.POSITION_OFFSET_BYTES = 0;\n  PositionNormalTextureVertex.NORMAL_OFFSET_BYTES = 12;\n  PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES = 16;\n  class PickGridVertex {\n    static getTranslation(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setTranslation(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getNormal(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      set$8(value2, bufferView.getInt8(offset2) / 127, bufferView.getInt8(offset2 + 1) / 127, bufferView.getInt8(offset2 + 2) / 127);\n    }\n    static setNormal(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      bufferView.setInt8(offset2, value2[0] * 127);\n      bufferView.setInt8(offset2 + 1, value2[1] * 127);\n      bufferView.setInt8(offset2 + 2, value2[2] * 127);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$7(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n    static getBounds(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.BOUNDS_OFFSET_BYTES;\n      set$7(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535, bufferView.getUint16(offset2 + 4, true) / 65535, bufferView.getUint16(offset2 + 6, true) / 65535);\n    }\n    static setBounds(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.BOUNDS_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n      bufferView.setUint16(offset2 + 4, value2[2] * 65535, true);\n      bufferView.setUint16(offset2 + 6, value2[3] * 65535, true);\n    }\n  }\n  PickGridVertex.SIZE_BYTES = 32;\n  PickGridVertex.TRANSLATION_OFFSET_BYTES = 0;\n  PickGridVertex.NORMAL_OFFSET_BYTES = 12;\n  PickGridVertex.ID_COLOR_OFFSET_BYTES = 16;\n  PickGridVertex.TEX_COORD_OFFSET_BYTES = 20;\n  PickGridVertex.BOUNDS_OFFSET_BYTES = 24;\n  class UnitVertex {\n    static getIdHover(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.ID_HOVER_OFFSET_BYTES, true);\n    }\n    static setIdHover(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.ID_HOVER_OFFSET_BYTES, value2, true);\n    }\n    static copyIdHover(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ID_HOVER_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ID_HOVER_OFFSET_BYTES, true), true);\n    }\n    static getTranslation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setTranslation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static copyTranslation(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TRANSLATION_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TRANSLATION_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255);\n    }\n    static setColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n    }\n    static copyColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.COLOR_OFFSET_BYTES;\n      toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n      toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n    }\n    static getOrder(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ORDER_OFFSET_BYTES;\n      set$5(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true));\n    }\n    static setOrder(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ORDER_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n    }\n    static copyOrder(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ORDER_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ORDER_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n    }\n    static getScale(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SCALE_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setScale(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SCALE_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static copyScale(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SCALE_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SCALE_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getRotation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ROTATION_OFFSET_BYTES;\n      set$6(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true), bufferView.getFloat32(offset2 + 12, true));\n    }\n    static setRotation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ROTATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n      bufferView.setFloat32(offset2 + 12, value2[3], true);\n    }\n    static copyRotation(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ROTATION_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ROTATION_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n      toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TEXCOORD_OFFSET_BYTES;\n      set$6(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true), bufferView.getFloat32(offset2 + 12, true));\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TEXCOORD_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n      bufferView.setFloat32(offset2 + 12, value2[3], true);\n    }\n    static copyTexCoord(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TEXCOORD_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TEXCOORD_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n      toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$7(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static getSelected(bufferView, index2) {\n      return bufferView.getInt8(UnitVertex.SIZE_BYTES * index2 + this.SELECTED_OFFSET_BYTES) / 127;\n    }\n    static setSelected(bufferView, index2, value2) {\n      bufferView.setInt8(UnitVertex.SIZE_BYTES * index2 + this.SELECTED_OFFSET_BYTES, value2 * 127);\n    }\n    static copySelected(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setInt8(UnitVertex.SIZE_BYTES * toIndex + this.SELECTED_OFFSET_BYTES, fromBufferView.getInt8(UnitVertex.SIZE_BYTES * fromIndex + this.SELECTED_OFFSET_BYTES));\n    }\n    static getRounding(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.ROUNDING_OFFSET_BYTES, true);\n    }\n    static setRounding(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.ROUNDING_OFFSET_BYTES, value2, true);\n    }\n    static copyRounding(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ROUNDING_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ROUNDING_OFFSET_BYTES, true), true);\n    }\n    static getParameter1(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_1_OFFSET_BYTES, true);\n    }\n    static setParameter1(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_1_OFFSET_BYTES, value2, true);\n    }\n    static copyParameter1(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_1_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_1_OFFSET_BYTES, true), true);\n    }\n    static getParameter2(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_2_OFFSET_BYTES, true);\n    }\n    static setParameter2(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_2_OFFSET_BYTES, value2, true);\n    }\n    static copyParameter2(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_2_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_2_OFFSET_BYTES, true), true);\n    }\n    static getMaterial(bufferView, index2) {\n      return bufferView.getUint16(UnitVertex.SIZE_BYTES * index2 + this.MATERIAL_OFFSET_BYTES);\n    }\n    static setMaterial(bufferView, index2, value2) {\n      bufferView.setUint16(UnitVertex.SIZE_BYTES * index2 + this.MATERIAL_OFFSET_BYTES, value2);\n    }\n    static copyMaterial(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint16(UnitVertex.SIZE_BYTES * toIndex + this.MATERIAL_OFFSET_BYTES, fromBufferView.getUint16(UnitVertex.SIZE_BYTES * fromIndex + this.MATERIAL_OFFSET_BYTES, true), true);\n    }\n    static getTexture(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.TEXTURE_OFFSET_BYTES);\n    }\n    static setTexture(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.TEXTURE_OFFSET_BYTES, value2);\n    }\n    static copyTexture(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.TEXTURE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.TEXTURE_OFFSET_BYTES));\n    }\n    static getSdfBuffer(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BUFFER_OFFSET_BYTES);\n    }\n    static setSdfBuffer(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BUFFER_OFFSET_BYTES, value2);\n    }\n    static copySdfBuffer(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BUFFER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BUFFER_OFFSET_BYTES));\n    }\n    static getSdfBorder(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BORDER_OFFSET_BYTES);\n    }\n    static setSdfBorder(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BORDER_OFFSET_BYTES, value2);\n    }\n    static copySdfBorder(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BORDER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BORDER_OFFSET_BYTES));\n    }\n    static getMatId(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.MAT_TYPE_OFFSET_BYTES);\n    }\n    static setMatId(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.MAT_TYPE_OFFSET_BYTES, value2);\n    }\n    static copyMatId(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_TYPE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_TYPE_OFFSET_BYTES));\n    }\n    static getMatColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_COLOR_OFFSET_BYTES;\n      value2[0] = bufferView.getUint16(offset2) / 255;\n      value2[1] = bufferView.getUint16(offset2 + 2) / 255;\n      value2[2] = bufferView.getUint16(offset2 + 4) / 255;\n    }\n    static setMatColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_COLOR_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 255);\n      bufferView.setUint16(offset2 + 2, value2[1] * 255);\n      bufferView.setUint16(offset2 + 4, value2[2] * 255);\n    }\n    static copyMatColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.MAT_COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.MAT_COLOR_OFFSET_BYTES;\n      toBufferView.setUint16(toOffset, fromBufferView.getUint16(fromOffset));\n      toBufferView.setUint16(toOffset + 2, fromBufferView.getUint16(fromOffset + 2));\n      toBufferView.setUint16(toOffset + 4, fromBufferView.getUint16(fromOffset + 4));\n    }\n    static getMatFuzz(bufferView, index2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_FUZZ_OFFSET_BYTES;\n      return bufferView.getUint8(offset2) / 255;\n    }\n    static setMatFuzz(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_FUZZ_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2 * 255);\n    }\n    static copyMatFuzz(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_FUZZ_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_FUZZ_OFFSET_BYTES));\n    }\n    static getMatGloss(bufferView, index2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_GLOSS_OFFSET_BYTES;\n      return bufferView.getUint8(offset2) / 255;\n    }\n    static setMatGloss(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_GLOSS_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2 * 255);\n    }\n    static copyMatGloss(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_GLOSS_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_GLOSS_OFFSET_BYTES));\n    }\n    static getMatDensity(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_DENSITY_OFFSET_BYTES, true);\n    }\n    static setMatDensity(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_DENSITY_OFFSET_BYTES, value2, true);\n    }\n    static copyMatDensity(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_DENSITY_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_DENSITY_OFFSET_BYTES, true), true);\n    }\n    static getMatRefractiveIndex(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true);\n    }\n    static setMatRefractiveIndex(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, value2, true);\n    }\n    static copyMatRefractiveIndex(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true), true);\n    }\n    static getSegColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SEG_COLOR_OFFSET_BYTES;\n      value2[0] = bufferView.getUint8(offset2) / 255;\n      value2[1] = bufferView.getUint8(offset2 + 1) / 255;\n      value2[2] = bufferView.getUint8(offset2 + 2) / 255;\n      value2[3] = bufferView.getUint8(offset2 + 3) / 255;\n    }\n    static setSegColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SEG_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static copySegColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SEG_COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SEG_COLOR_OFFSET_BYTES;\n      toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n      toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n      toBufferView.setUint8(toOffset + 2, fromBufferView.getUint8(fromOffset + 2));\n      toBufferView.setUint8(toOffset + 3, fromBufferView.getUint8(fromOffset + 3));\n    }\n  }\n  UnitVertex.SIZE_BYTES = 120;\n  UnitVertex.ID_HOVER_OFFSET_BYTES = 0;\n  UnitVertex.ID_COLOR_OFFSET_BYTES = 4;\n  UnitVertex.ORDER_OFFSET_BYTES = 8;\n  UnitVertex.STAGGER_ORDER_OFFSET_BYTES = 12;\n  UnitVertex.SELECTED_OFFSET_BYTES = 80;\n  UnitVertex.TRANSLATION_OFFSET_BYTES = 16;\n  UnitVertex.COLOR_OFFSET_BYTES = 28;\n  UnitVertex.MATERIAL_OFFSET_BYTES = 30;\n  UnitVertex.SCALE_OFFSET_BYTES = 32;\n  UnitVertex.ROUNDING_OFFSET_BYTES = 44;\n  UnitVertex.ROTATION_OFFSET_BYTES = 48;\n  UnitVertex.TEXCOORD_OFFSET_BYTES = 64;\n  UnitVertex.TEXTURE_OFFSET_BYTES = 81;\n  UnitVertex.SDF_BUFFER_OFFSET_BYTES = 82;\n  UnitVertex.SDF_BORDER_OFFSET_BYTES = 83;\n  UnitVertex.PARAMETER_1_OFFSET_BYTES = 84;\n  UnitVertex.PARAMETER_2_OFFSET_BYTES = 88;\n  UnitVertex.MAT_TYPE_OFFSET_BYTES = 92;\n  UnitVertex.MAT_COLOR_OFFSET_BYTES = 112;\n  UnitVertex.MAT_FUZZ_OFFSET_BYTES = 96;\n  UnitVertex.MAT_GLOSS_OFFSET_BYTES = 97;\n  UnitVertex.MAT_DENSITY_OFFSET_BYTES = 100;\n  UnitVertex.MAT_REFRACTIVE_INDEX_OFFSET_BYTES = 104;\n  UnitVertex.SEG_COLOR_OFFSET_BYTES = 108;\n  class ObjMesh {\n  }\n  class ObjHelper {\n    constructor(core) {\n      this._core = core;\n    }\n    read(data2) {\n      const start = window.performance.now();\n      const indices = [];\n      const positions2 = [];\n      const normals = [];\n      const texCoords = [];\n      const meshes = [];\n      const indexOffsets = [];\n      const indexCounts = [];\n      const faceLookup = {};\n      const lines = data2.split(\"\\n\");\n      let faceCount = 0;\n      for (let i = 0; i < lines.length; i++) {\n        const parts = lines[i].trim().split(\" \");\n        if (parts.length > 0) {\n          switch (parts[0]) {\n            case \"o\":\n              meshes.push(parts[1]);\n              indexOffsets.push(indices.length);\n              break;\n            case \"v\":\n              positions2.push(parseFloat(parts[1]));\n              positions2.push(parseFloat(parts[2]));\n              positions2.push(parseFloat(parts[3]));\n              break;\n            case \"vt\":\n              texCoords.push(parseFloat(parts[1]));\n              texCoords.push(parseFloat(parts[2]));\n              break;\n            case \"vn\":\n              normals.push(parseFloat(parts[1]));\n              normals.push(parseFloat(parts[2]));\n              normals.push(parseFloat(parts[3]));\n              break;\n            case \"f\":\n              for (let i2 = 0; i2 < parts.length - 1; i2++) {\n                const part = parts[i2 + 1];\n                if (faceLookup[part] == void 0) {\n                  faceLookup[part] = faceCount++;\n                }\n                indices.push(faceLookup[part]);\n              }\n              break;\n          }\n        }\n      }\n      for (let i = 0; i < meshes.length - 1; i++) {\n        indexCounts.push(indexOffsets[i + 1] - indexOffsets[i]);\n      }\n      indexCounts.push(indices.length - indexOffsets[meshes.length - 1]);\n      const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * Object.keys(faceLookup).length);\n      const dataView = new DataView(vertices);\n      let minX = Number.MAX_VALUE;\n      let minY = Number.MAX_VALUE;\n      let minZ2 = Number.MAX_VALUE;\n      let maxX = -Number.MAX_VALUE;\n      let maxY2 = -Number.MAX_VALUE;\n      let maxZ = -Number.MAX_VALUE;\n      const faces = Object.keys(faceLookup);\n      const _vec2 = create$3();\n      const _vec3 = create$6();\n      let hasTexCoords, hasNormals;\n      if (faces.length > 0) {\n        const faceParts = faces[0].split(\"/\");\n        hasTexCoords = faceParts.length > 1 && !isNaN(parseInt(faceParts[1]));\n        hasNormals = faceParts.length > 2 && !isNaN(parseInt(faceParts[2]));\n      }\n      for (let i = 0; i < faces.length; i++) {\n        const faceParts = faces[i].split(\"/\");\n        let index2 = (parseInt(faceParts[0]) - 1) * 3;\n        const x2 = positions2[index2];\n        const y2 = positions2[index2 + 1];\n        const z2 = positions2[index2 + 2];\n        set$8(_vec3, x2, y2, z2);\n        PositionNormalTextureVertex.setPosition(dataView, i, _vec3);\n        minX = Math.min(x2, minX);\n        minY = Math.min(y2, minY);\n        minZ2 = Math.min(z2, minZ2);\n        maxX = Math.max(x2, maxX);\n        maxY2 = Math.max(y2, maxY2);\n        maxZ = Math.max(z2, maxZ);\n        if (hasNormals) {\n          index2 = (parseInt(faceParts[2]) - 1) * 3;\n          set$8(_vec3, normals[index2], normals[index2 + 1], normals[index2 + 2]);\n          PositionNormalTextureVertex.setNormal(dataView, i, _vec3);\n        }\n        if (hasTexCoords) {\n          index2 = (parseInt(faceParts[1]) - 1) * 2;\n          set$5(_vec2, texCoords[index2], texCoords[index2 + 1]);\n          PositionNormalTextureVertex.setTexCoord(dataView, i, _vec2);\n        }\n      }\n      const originX = (minX + maxX) / 2;\n      const originY = (minY + maxY2) / 2;\n      const originZ = (minZ2 + maxZ) / 2;\n      const objMesh = new ObjMesh();\n      objMesh.vertices = vertices;\n      objMesh.indices = new Uint16Array(indices);\n      objMesh.meshes = meshes;\n      objMesh.indexOffsets = indexOffsets;\n      objMesh.indexCounts = indexCounts;\n      objMesh.indexCount = indices.length;\n      objMesh.minX = minX;\n      objMesh.minY = minY;\n      objMesh.minZ = minZ2;\n      objMesh.maxX = maxX;\n      objMesh.maxY = maxY2;\n      objMesh.maxZ = maxZ;\n      objMesh.originX = originX;\n      objMesh.originY = originY;\n      objMesh.originZ = originZ;\n      this._core.log.write(LogLevel.info, `obj loaded ${Math.round(window.performance.now() - start)}ms`);\n      return objMesh;\n    }\n  }\n  class Cube {\n  }\n  Cube.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5\n  ]);\n  Cube.INDICES = new Uint16Array([5, 4, 1, 0, 3, 4, 7, 5, 6, 1, 2, 3, 6, 7]);\n  Cube.CUBE_MAP_INDICES = new Uint16Array([2, 3, 1, 0, 4, 3, 7, 2, 6, 1, 5, 4, 6, 7]);\n  Cube.FACE_NORMALS = [\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, -1, 0),\n    fromValues$3(-1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Cube.FACE_POSITIONS = [\n    fromValues$3(0, 0.5, 0),\n    fromValues$3(0.5, 0, 0),\n    fromValues$3(0, -0.5, 0),\n    fromValues$3(-0.5, 0, 0),\n    fromValues$3(0, 0, 0.5),\n    fromValues$3(0, 0, -0.5)\n  ];\n  Cube.FACE_ROTATIONS = [\n    fromValues$5(1, 0, 0, 0, 0, -1, 0, 1, 0),\n    fromValues$5(0, 0, -1, 0, 1, 0, 1, 0, 0),\n    fromValues$5(1, 0, 0, 0, 0, 1, 0, -1, 0),\n    fromValues$5(0, 0, 1, 0, 1, 0, -1, 0, 0),\n    fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n  ];\n  Cube.EDGE_POSITIONS = [\n    fromValues$3(0, 0.5, 0.5),\n    fromValues$3(0.5, 0.5, 0),\n    fromValues$3(0, 0.5, -0.5),\n    fromValues$3(-0.5, 0.5, 0),\n    fromValues$3(0, -0.5, 0.5),\n    fromValues$3(0.5, -0.5, 0),\n    fromValues$3(0, -0.5, -0.5),\n    fromValues$3(-0.5, -0.5, 0),\n    fromValues$3(0.5, 0, 0.5),\n    fromValues$3(0.5, 0, -0.5),\n    fromValues$3(-0.5, 0, -0.5),\n    fromValues$3(-0.5, 0, 0.5)\n  ];\n  Cube.EDGE_NORMALS = [\n    fromValues$3(0, Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, 0, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, 0, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO)\n  ];\n  Cube.EDGE_CORNERS = [\n    [0, 1],\n    [1, 5],\n    [4, 5],\n    [0, 4],\n    [2, 3],\n    [2, 6],\n    [6, 7],\n    [3, 7],\n    [1, 2],\n    [5, 6],\n    [4, 7],\n    [0, 3]\n  ];\n  Cube.EDGE_FACES = [\n    [0, 4],\n    [0, 1],\n    [0, 5],\n    [0, 3],\n    [2, 4],\n    [2, 1],\n    [2, 5],\n    [2, 3],\n    [1, 4],\n    [1, 5],\n    [3, 5],\n    [3, 4]\n  ];\n  Cube.EDGE_AXIS = [\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    1,\n    1,\n    1,\n    1\n  ];\n  Cube.AXIS_EDGES = [\n    [0, 2, 4, 6],\n    [8, 9, 10, 11],\n    [1, 3, 5, 7]\n  ];\n  Cube.AXIS_FACES = [\n    [1, 3],\n    [0, 2],\n    [4, 5]\n  ];\n  Cube.OPPOSITE_FACES = [\n    2,\n    3,\n    0,\n    1,\n    5,\n    4\n  ];\n  Cube.EDGE_POSITIVES = [\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0)\n  ];\n  Cube.EDGE_FORWARDS = [\n    fromValues$3(0, Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, 0, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, 0, -Constants$1.ROOT_TWO_OVER_TWO)\n  ];\n  let ControllerVisual$1 = class ControllerVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(controller) {\n      this.controller = controller;\n    }\n  };\n  class Controller {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get texture() {\n      return this._texture;\n    }\n    get rayMMatrix() {\n      return this._rayMMatrix;\n    }\n    get rayIndexCount() {\n      return this._rayIndexCount;\n    }\n    get rayVertices() {\n      return this._rayVertices;\n    }\n    get rayIndices() {\n      return this._rayIndices;\n    }\n    constructor(core, options2) {\n      this._cubeObj = `o Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 -1.000000\nv 1.000000 1.000000 -0.999999\nv 0.999999 1.000000 1.000001\nv -1.000000 1.000000 1.000000\nv -1.000000 1.000000 -1.000000\nvt 1.000000 0.333333\nvt 1.000000 0.666667\nvt 0.666667 0.666667\nvt 0.666667 0.333333\nvt 0.666667 0.000000\nvt 0.000000 0.333333\nvt 0.000000 0.000000\nvt 0.333333 0.000000\nvt 0.333333 1.000000\nvt 0.000000 1.000000\nvt 0.000000 0.666667\nvt 0.333333 0.333333\nvt 0.333333 0.666667\nvt 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.000000 0.000000 1.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\ns off\nf 2/1/1 3/2/1 4/3/1\nf 8/1/2 7/4/2 6/5/2\nf 5/6/3 6/7/3 2/8/3\nf 6/8/4 7/5/4 3/4/4\nf 3/9/5 7/10/5 8/11/5\nf 1/12/6 4/13/6 8/11/6\nf 1/4/1 2/1/1 4/3/1\nf 5/14/2 8/1/2 6/5/2\nf 1/12/3 5/6/3 2/8/3\nf 2/12/4 6/8/4 3/4/4\nf 4/13/5 3/9/5 8/11/5\nf 5/6/6 1/12/6 8/11/6`;\n      this._core = core;\n      this._obj = options2.obj;\n      this._texture = options2.texture || new ImageData(new Uint8ClampedArray([0, 0, 0, 255]), 1, 1);\n    }\n    initialize() {\n      const _vec3 = create$6();\n      this._mMatrix = create$7();\n      const objMesh = new ObjHelper(this._core).read(this._obj || this._cubeObj);\n      if (!this._obj) {\n        this.useRayPose = true;\n        const modelThickness = 0.02;\n        const modelLength = 0.1;\n        set$8(_vec3, modelThickness, modelThickness, modelLength);\n        fromScaling(this._mMatrix, _vec3);\n        set$8(_vec3, 0, 0, 1);\n        translate$2(this._mMatrix, this._mMatrix, _vec3);\n      }\n      this._vertices = objMesh.vertices;\n      this._indices = objMesh.indices;\n      this._indexCount = objMesh.indexCount;\n      this._rayMMatrix = create$7();\n      const rayVertices = Cube.POSITIONS;\n      this._rayVertices = new ArrayBuffer(PositionColorVertex.SIZE_BYTES * rayVertices.length / PositionVertex.SIZE);\n      const rayVerticesView = new DataView(this._rayVertices);\n      const rayIndices = Cube.INDICES;\n      this._rayIndices = new Uint16Array(rayIndices);\n      const rayVertexCount = rayVertices.length / PositionVertex.SIZE;\n      this._rayIndexCount = rayIndices.length;\n      for (let i = 0; i < rayVertexCount; i++) {\n        set$8(_vec3, rayVertices[i * PositionVertex.SIZE], rayVertices[i * PositionVertex.SIZE + 1], rayVertices[i * PositionVertex.SIZE + 2]);\n        PositionColorVertex.setPosition(rayVerticesView, i, _vec3);\n        PositionColorVertex.setColor(rayVerticesView, i, this._core.config.xrControllerRayColor);\n      }\n      const rayThickness = 25e-4;\n      const rayLength = 10;\n      set$8(_vec3, rayThickness, rayThickness, rayLength);\n      fromScaling(this._rayMMatrix, _vec3);\n      set$8(_vec3, 0, 0, -0.5);\n      translate$2(this._rayMMatrix, this._rayMMatrix, _vec3);\n      this._isInitialized = true;\n      this._core.log.write(LogLevel.info, \"controller initialized\");\n    }\n    update(elapsedTime) {\n    }\n  }\n  class MatrixHelper {\n    static fieldOfViewFromProjectionMatrix(p) {\n      return 2 * Math.atan(1 / p[5]);\n    }\n  }\n  class AxesVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(axes) {\n      this.axes = axes;\n    }\n  }\n  class AxesBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    set vMatrix(value2) {\n      this._vMatrix = value2;\n    }\n    pickGrid(id2) {\n      const offset2 = id2 * 3;\n      return {\n        divisionX: this._pickGrid[offset2] - 1,\n        divisionY: this._pickGrid[offset2 + 1] - 1,\n        divisionZ: this._pickGrid[offset2 + 2] - 1\n      };\n    }\n    pickTitle(id2) {\n      return { axis: this._pickTitle[id2] };\n    }\n    pickLabel(id2) {\n      const offset2 = id2 * 2;\n      return {\n        axis: this._pickLabel[offset2],\n        label: this._pickLabel[offset2 + 1]\n      };\n    }\n    pickHeading(id2) {\n      return { axis: this._pickHeading[id2] };\n    }\n    getFromValues(index2) {\n      return this._fromValues[index2];\n    }\n    setFromValues(index2, value2) {\n      if (this._fromValues[index2] != value2) {\n        this._fromValues[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getToValues(index2) {\n      return this._toValues[index2];\n    }\n    setToValues(index2, value2) {\n      if (this._toValues[index2] != value2) {\n        this._toValues[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get font() {\n      return this._font;\n    }\n    set font(value2) {\n      if (this._font != value2) {\n        this._font = value2;\n        this._hasChanged = true;\n      }\n    }\n    get gridPickDivisionHeight() {\n      return this._gridPickDivisionHeight;\n    }\n    set gridPickDivisionHeight(value2) {\n      if (this._gridPickDivisionHeight != value2) {\n        this._gridPickDivisionHeight = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core) {\n      this._core = core;\n      this._mMatrix = create$7();\n      this._mvMatrix = create$7();\n      this._textMetric = { maxTop: 0, width: 0, maxHeight: 0 };\n      this._gridPickDivisionHeight = core.config.axesGridPickDivisionHeight;\n      this.textBorderWidth = core.config.textBorderWidth;\n      this.gamma = 0;\n      this.gridMajorThickness = core.config.axesGridMajorThickness;\n      this.gridMinorThickness = core.config.axesGridMinorThickness;\n      this.gridZeroThickness = core.config.axesGridZeroThickness;\n      this._font = core.font;\n      this.isGridPickingEnabled = false;\n    }\n    update(elapsedTime) {\n    }\n  }\n  let Quad$3 = class Quad {\n    static positions(transform2) {\n      const positions2 = new Float32Array(12);\n      const position2 = create$6();\n      for (let i = 0; i < 4; i++) {\n        set$8(position2, this.POSITIONS[i * 3], this.POSITIONS[i * 3 + 1], this.POSITIONS[i * 3 + 2]);\n        transformMat4$2(position2, position2, transform2);\n        positions2[i * 3] = position2[0];\n        positions2[i * 3 + 1] = position2[1];\n        positions2[i * 3 + 2] = position2[2];\n      }\n      return positions2;\n    }\n    static textured(transform2, texTransform = Constants$1.MAT4_IDENTITY) {\n      const positions2 = this.positions(transform2);\n      const texCoords = this.TEX_COORDS;\n      const vertices = new ArrayBuffer(PositionTextureVertex.SIZE_BYTES * positions2.length / 3);\n      const verticesView = new DataView(vertices);\n      const position2 = create$6();\n      const texCoord = create$3();\n      for (let i = 0; i < positions2.length / PositionVertex.SIZE; i++) {\n        set$8(position2, positions2[i * PositionVertex.SIZE], positions2[i * PositionVertex.SIZE + 1], positions2[i * PositionVertex.SIZE + 2]);\n        set$5(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n        transformMat4(texCoord, texCoord, texTransform);\n        PositionTextureVertex.setPosition(verticesView, i, position2);\n        PositionTextureVertex.setTexCoord(verticesView, i, texCoord);\n      }\n      return verticesView;\n    }\n    static normalTextured(transform2, texTransform = Constants$1.MAT4_IDENTITY) {\n      const positions2 = this.positions(transform2);\n      const texCoords = this.TEX_COORDS;\n      const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * positions2.length / 3);\n      const verticesView = new DataView(vertices);\n      const position2 = create$6();\n      const texCoord = create$3();\n      const normal3 = create$6();\n      const normal4 = create$5();\n      for (let i = 0; i < positions2.length / PositionVertex.SIZE; i++) {\n        set$8(position2, positions2[i * PositionVertex.SIZE], positions2[i * PositionVertex.SIZE + 1], positions2[i * PositionVertex.SIZE + 2]);\n        set$5(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n        transformMat4(texCoord, texCoord, texTransform);\n        PositionNormalTextureVertex.setPosition(verticesView, i, position2);\n        set$7(normal4, 0, 0, 1, 0);\n        transformMat4$1(normal4, normal4, transform2);\n        set$8(normal3, normal4[0], normal4[1], normal4[2]);\n        normalize$5(normal3, normal3);\n        PositionNormalTextureVertex.setNormal(verticesView, i, normal3);\n        PositionNormalTextureVertex.setTexCoord(verticesView, i, texCoord);\n      }\n      return verticesView;\n    }\n  };\n  Quad$3.FACE_NORMALS = [\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Quad$3.FACE_ROTATIONS = [\n    fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n  ];\n  Quad$3.EDGE_POSITIONS = [\n    fromValues$3(0, 0.5, 0),\n    fromValues$3(0.5, 0, 0),\n    fromValues$3(0, -0.5, 0),\n    fromValues$3(-0.5, 0, 0)\n  ];\n  Quad$3.EDGE_NORMALS = [\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, -1, 0),\n    fromValues$3(-1, 0, 0)\n  ];\n  Quad$3.EDGE_POSITIVES = [\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 1, 0)\n  ];\n  Quad$3.EDGE_FORWARDS = [\n    fromValues$3(0, 0, -1),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Quad$3.AXIS_EDGES = [\n    [0, 2],\n    [1, 3]\n  ];\n  Quad$3.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0,\n    0.5,\n    0.5,\n    0,\n    -0.5,\n    -0.5,\n    0,\n    0.5,\n    -0.5,\n    0\n  ]);\n  Quad$3.INDICES = new Uint16Array([0, 2, 1, 1, 2, 3]);\n  Quad$3.TEX_COORDS = new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]);\n  class TextHelper {\n    static truncate(text2, length2) {\n      return text2.length > length2 ? `${text2.substr(0, length2 - 1)}…` : text2;\n    }\n    static measure(font2, text2, size) {\n      size.width = 0;\n      let maxDescent = 0;\n      for (const char of text2) {\n        let glyph = font2.glyphs[char];\n        if (!glyph) {\n          font2.addGlyph(char);\n          glyph = font2.glyphs[char];\n        }\n        size.width += glyph.advance;\n        size.maxTop = Math.max(glyph.top, size.maxTop);\n        maxDescent = Math.max(glyph.height - glyph.top, maxDescent);\n      }\n      size.maxHeight = size.maxTop + maxDescent;\n    }\n    static wrap(font2, text2, maxWidth) {\n      const lines = [];\n      let width2 = 0;\n      let start = 0;\n      let lastBreakingChar = -1;\n      let widthAfterLastBreakingChar = 0;\n      for (let i = 0; i < text2.length; i++) {\n        let char = text2.charAt(i);\n        let glyph = font2.glyphs[char];\n        if (!glyph) {\n          font2.addGlyph(char);\n          glyph = font2.glyphs[char];\n        }\n        width2 += glyph.advance;\n        if (char == \" \" || char == \"-\") {\n          widthAfterLastBreakingChar = width2;\n          lastBreakingChar = i;\n        }\n        if (width2 > maxWidth) {\n          if (lastBreakingChar == -1) {\n            lines.push(text2.substring(start, i));\n            start = i;\n            width2 += glyph.advance;\n          } else {\n            lines.push(text2.substring(start, lastBreakingChar));\n            start = lastBreakingChar + 1;\n            width2 -= widthAfterLastBreakingChar;\n            widthAfterLastBreakingChar = 0;\n            lastBreakingChar = -1;\n          }\n        }\n      }\n      lines.push(text2.substring(start, text2.length));\n      return lines;\n    }\n    static addString(font2, text2, vertices, indices, index2, position2, scale2, offset2, rotation2, idColor) {\n      for (const char of text2) {\n        this.addGlyph(font2, char, vertices, indices, index2++, position2, scale2, offset2, rotation2, idColor);\n      }\n    }\n    static addGlyph(font2, char, vertices, indices, index2, position2, scale2, offset2, rotation2, idColor) {\n      let glyph = font2.glyphs[char];\n      if (!glyph) {\n        font2.addGlyph(char);\n        glyph = font2.glyphs[char];\n      }\n      const vertexOffset = index2 * 4;\n      const width2 = glyph.width * scale2;\n      const height2 = glyph.height * scale2;\n      const top = glyph.top * scale2;\n      const border = font2.border * scale2;\n      const x02 = offset2[0] - border;\n      const x12 = offset2[0] + width2 + border;\n      const y02 = offset2[1] + top + border;\n      const y12 = offset2[1] + top - height2 - border;\n      const z02 = offset2[2];\n      set$8(this._topLeft, x02, y02, z02);\n      set$8(this._topRight, x12, y02, z02);\n      set$8(this._bottomLeft, x02, y12, z02);\n      set$8(this._bottomRight, x12, y12, z02);\n      if (rotation2) {\n        transformQuat(this._topLeft, this._topLeft, rotation2);\n        transformQuat(this._topRight, this._topRight, rotation2);\n        transformQuat(this._bottomLeft, this._bottomLeft, rotation2);\n        transformQuat(this._bottomRight, this._bottomRight, rotation2);\n      }\n      add$4(this._vec3, this._topLeft, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset, this._vec3);\n      add$4(this._vec3, this._topRight, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 1, this._vec3);\n      add$4(this._vec3, this._bottomLeft, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 2, this._vec3);\n      add$4(this._vec3, this._bottomRight, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 3, this._vec3);\n      set$5(this._vec2, glyph.u0, glyph.v0);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset, this._vec2);\n      set$5(this._vec2, glyph.u1, glyph.v0);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 1, this._vec2);\n      set$5(this._vec2, glyph.u0, glyph.v1);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 2, this._vec2);\n      set$5(this._vec2, glyph.u1, glyph.v1);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 3, this._vec2);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 1, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 2, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 3, idColor);\n      offset2[0] += glyph.advance * scale2;\n      const indexTemplate = Quad$3.INDICES;\n      const indexOffset = index2 * 6;\n      for (let i = 0; i < 6; i++) {\n        indices[indexOffset + i] = indexTemplate[i] + vertexOffset;\n      }\n    }\n  }\n  TextHelper._vec2 = create$3();\n  TextHelper._vec3 = create$6();\n  TextHelper._topLeft = create$6();\n  TextHelper._topRight = create$6();\n  TextHelper._bottomLeft = create$6();\n  TextHelper._bottomRight = create$6();\n  class PickHelper {\n    static nextPickId() {\n      return this._pickId++;\n    }\n    static encodeNumber(number2, type2, color2) {\n      const encoded = number2 | PickHelper.encodeType(type2);\n      PickHelper.float32ToVec4(encoded, color2);\n    }\n    static decodeNumber(color2) {\n      return color2[0] + (color2[1] << 8) + (color2[2] << 16);\n    }\n    static encodeVec3(vec3, type2, color2) {\n      const encoded = vec3[0] | vec3[1] << 8 | vec3[2] << 16 | PickHelper.encodeType(type2);\n      PickHelper.float32ToVec4(encoded, color2);\n    }\n    static decodeVec3(color2, axes) {\n      axes[0] = color2[0];\n      axes[1] = color2[1];\n      axes[2] = color2[2];\n    }\n    static encodeType(type2) {\n      return type2 << 24;\n    }\n    static decodeType(color2) {\n      return color2[3];\n    }\n    static float32ToVec4(number2, color2) {\n      color2[0] = ((number2 & 255) >>> 0) / 255;\n      color2[1] = ((number2 & 65280) >>> 8) / 255;\n      color2[2] = ((number2 & 16711680) >>> 16) / 255;\n      color2[3] = ((number2 & 4278190080) >>> 24) / 255;\n    }\n    static uint8ArrayToNumber(color2) {\n      return color2[0] + (color2[1] << 8) + (color2[2] << 16) + (color2[3] << 24);\n    }\n  }\n  PickHelper._pickId = 1;\n  class Cartesian3dAxes extends AxesBase {\n    get size() {\n      return this._size;\n    }\n    get isDiscreteX() {\n      return this._isDiscrete[0];\n    }\n    set isDiscreteX(value2) {\n      if (value2 != this._isDiscrete[0]) {\n        this._isDiscrete[0] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteY() {\n      return this._isDiscrete[1];\n    }\n    set isDiscreteY(value2) {\n      if (value2 != this._isDiscrete[1]) {\n        this._isDiscrete[1] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteZ() {\n      return this._isDiscrete[2];\n    }\n    set isDiscreteZ(value2) {\n      if (value2 != this._isDiscrete[2]) {\n        this._isDiscrete[2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (value2 != this._minBoundsZ) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (value2 != this._minBoundsZ) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsOutsideEdge(index2) {\n      return this._isOutsideEdge[index2];\n    }\n    getIsForwardFace(index2) {\n      return this._isForwardFace[index2];\n    }\n    get textVertices() {\n      return this._textVertices;\n    }\n    get textIndices() {\n      return this._textIndices;\n    }\n    getLabelMMatrix(index2) {\n      return this._labelMMatrices[index2];\n    }\n    setLabelPositions(index2, value2) {\n      if (this._labelPositions[index2] != value2) {\n        this._labelPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabels(index2, value2) {\n      if (this._labels[index2] != value2) {\n        this._labels[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabelSizes(index2, value2) {\n      if (this._labelSizes[index2] != value2) {\n        this._labelSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getLabelOrientation(index2) {\n      return this._orientations[index2];\n    }\n    setLabelOrientation(index2, orientation) {\n      if (this._orientations[index2] != orientation) {\n        this._orientations[index2] = orientation;\n        this._hasChanged = true;\n      }\n    }\n    getTitleIndexCount(index2) {\n      return this._titleIndexCounts[index2];\n    }\n    getTitleIndexOffset(index2) {\n      return this._titleIndexOffsets[index2];\n    }\n    getTitleMMatrix(index2) {\n      return this._titleMMatrices[index2];\n    }\n    setTitle(index2, value2) {\n      if (this._titles[index2] != value2) {\n        this._titles[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setTitleSize(index2, value2) {\n      if (this._titleSizes[index2] != value2) {\n        this._titleSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getHeadingIndexCount(index2) {\n      return this._headingIndexCounts[index2];\n    }\n    getHeadingIndexOffset(index2) {\n      return this._headingIndexOffsets[index2];\n    }\n    getHeadingMMatrix(index2) {\n      return this._headingMMatrices[index2];\n    }\n    setHeading(index2, value2) {\n      if (this._headings[index2] != value2) {\n        this._headings[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setHeadingSize(index2, value2) {\n      if (this._headingSizes[index2] != value2) {\n        this._headingSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsLeftToRightHorizontal(index2) {\n      return this._isLeftToRightHorizontal[index2];\n    }\n    getIsLeftToRightVertical(index2) {\n      return this._isLeftToRightVertical[index2];\n    }\n    getAxesLeftToRightIndexCount(index2) {\n      return this._axesLeftToRightIndexCounts[index2];\n    }\n    getAxesRightToLeftIndexCount(index2) {\n      return this._axesRightToLeftIndexCounts[index2];\n    }\n    getAxesLeftToRightIndexOffset(index2) {\n      return this._axesLeftToRightIndexOffsets[index2];\n    }\n    getAxesRightToLeftIndexOffset(index2) {\n      return this._axesRightToLeftIndexOffsets[index2];\n    }\n    get gridVertices() {\n      return this._gridVertices;\n    }\n    get gridIndices() {\n      return this._gridIndices;\n    }\n    getGridTicksIndexCount(index2) {\n      return this._gridTicksIndexCounts[index2];\n    }\n    getGridTicksIndexOffset(index2) {\n      return this._gridTicksIndexOffsets[index2];\n    }\n    getGridFaceIndexCount(index2) {\n      return this._gridFaceIndexCounts[index2];\n    }\n    getGridFaceIndexOffset(index2) {\n      return this._gridFaceIndexOffsets[index2];\n    }\n    getGridTicksMMatrix(index2) {\n      return this._gridTicksMMatrices[index2];\n    }\n    getGridFaceMMatrix(index2) {\n      return this._gridFaceMMatrices[index2];\n    }\n    getGridTicksScale(index2) {\n      return this._gridTicksScales[index2];\n    }\n    getGridFaceZero(index2) {\n      return this._gridFaceZeros[index2];\n    }\n    getGridTicksZero(index2) {\n      return this._gridTicksZeros[index2];\n    }\n    getGridFaceMinorGridlines(index2) {\n      return this._gridFaceMinorGridlines[index2];\n    }\n    getGridTicksMinorGridlines(index2) {\n      return this._gridTicksMinorGridlines[index2];\n    }\n    setTickPositions(index2, value2) {\n      if (this._gridTicksPositions[index2] != value2) {\n        this._gridTicksPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingX() {\n      return this._scalingX;\n    }\n    set scalingX(value2) {\n      if (value2 != this._scalingX) {\n        this._scalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingY() {\n      return this._scalingY;\n    }\n    set scalingY(value2) {\n      if (value2 != this._scalingY) {\n        this._scalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingZ() {\n      return this._scalingZ;\n    }\n    set scalingZ(value2) {\n      if (value2 != this._scalingZ) {\n        this._scalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offset[12];\n    }\n    set offsetX(value2) {\n      if (value2 != this._offset[12]) {\n        this._offset[12] = value2;\n      }\n    }\n    get offsetY() {\n      return this._offset[13];\n    }\n    set offsetY(value2) {\n      if (value2 != this._offset[13]) {\n        this._offset[13] = value2;\n      }\n    }\n    get offsetZ() {\n      return this._offset[14];\n    }\n    set offsetZ(value2) {\n      if (value2 != this._offset[14]) {\n        this._offset[14] = value2;\n      }\n    }\n    constructor(core) {\n      super(core);\n      this._size = create$6();\n      this._translation = create$6();\n      this._normal = create$6();\n      this._forward = create$6();\n      this._right = create$6();\n      this._up = create$6();\n      this._texCoord = create$3();\n      this._bounds = create$5();\n      this._vec3 = create$6();\n      this._vec4 = create$5();\n      this._mat3 = create$8();\n      this._isDiscrete = [false, false, false];\n      this._minBoundsX = 0;\n      this._minBoundsY = 0;\n      this._minBoundsZ = 0;\n      this._maxBoundsX = 0;\n      this._maxBoundsY = 0;\n      this._maxBoundsZ = 0;\n      this._isForwardFace = [];\n      this._isForwardEdge = [];\n      this._isOutsideEdge = [];\n      for (let i = 0; i < 6; i++) {\n        this._isForwardFace.push(false);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._isForwardEdge.push(false);\n        this._isOutsideEdge.push(false);\n      }\n      this._textOffset = create$6();\n      this._textPosition = create$6();\n      this._distances = [];\n      for (let i = 0; i < 12; i++) {\n        this._distances.push(0);\n      }\n      this._labelPositions = [];\n      this._labels = [];\n      this._labelSizes = [];\n      this._maxLabelSize = [];\n      this._axesLeftToRightIndexCounts = [];\n      this._axesRightToLeftIndexCounts = [];\n      this._axesLeftToRightIndexOffsets = [];\n      this._axesRightToLeftIndexOffsets = [];\n      this._labelMMatrices = [];\n      this._orientations = [];\n      for (let i = 0; i < 3; i++) {\n        this._maxLabelSize.push(create$3());\n        this._orientations.push(AxesTextOrientation.parallel);\n        this._axesLeftToRightIndexCounts.push(0);\n        this._axesRightToLeftIndexCounts.push(0);\n        this._axesLeftToRightIndexOffsets.push(0);\n        this._axesRightToLeftIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._labelMMatrices.push(create$7());\n      }\n      this._titles = [];\n      this._titleSizes = [];\n      this._titleIndexCounts = [];\n      this._titleIndexOffsets = [];\n      this._titleMMatrices = [];\n      for (let i = 0; i < 3; i++) {\n        this._titles.push(null);\n        this._titleSizes.push(core.config.axesTextTitleSize);\n        this._titleIndexCounts.push(0);\n        this._titleIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._titleMMatrices.push(create$7());\n      }\n      this._headings = [];\n      this._headingSizes = [];\n      this._headingIndexCounts = [];\n      this._headingIndexOffsets = [];\n      this._headingMMatrices = [];\n      this.isHeadingVisible = [];\n      for (let i = 0; i < 3; i++) {\n        this._headings.push(null);\n        this._headingSizes.push(core.config.axesTextHeadingSize);\n        this._headingIndexCounts.push(0);\n        this._headingIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._headingMMatrices.push(create$7());\n        this.isHeadingVisible.push(true);\n      }\n      this.isEdgeVisible = [];\n      this._edgePosition = create$6();\n      this._edgePositive = create$6();\n      this._edgeNormal = create$6();\n      this._edgeNormalTemp = create$6();\n      this._edgePositiveTemp = create$6();\n      this._isLeftToRightHorizontal = [];\n      this._isLeftToRightVertical = [];\n      this._edgeHorizontalRight = [];\n      this._edgeHorizontalUp = [];\n      this._edgeHorizontalForward = [];\n      this._edgeVerticalRight = [];\n      this._edgeVerticalUp = [];\n      this._edgeVerticalForward = [];\n      for (let i = 0; i < 12; i++) {\n        this.isEdgeVisible.push(true);\n        this._isLeftToRightHorizontal.push(false);\n        this._isLeftToRightVertical.push(false);\n        this._edgeHorizontalRight.push(create$6());\n        this._edgeHorizontalUp.push(create$6());\n        this._edgeHorizontalForward.push(create$6());\n        this._edgeVerticalRight.push(create$6());\n        this._edgeVerticalUp.push(create$6());\n        this._edgeVerticalForward.push(create$6());\n      }\n      this.isFaceVisible = [];\n      for (let i = 0; i < 6; i++) {\n        this.isFaceVisible.push(true);\n      }\n      this.arePickDivisionsVisible = [];\n      this.areFacesVisible = [];\n      this._indexTemplate = Quad$3.INDICES;\n      this.zero = create$6();\n      this._gridTicksZeros = [];\n      this._gridFaceZeros = [];\n      this.minorGridlines = fromValues$3(1, 1, 1);\n      this._gridTicksMinorGridlines = [];\n      this._gridFaceMinorGridlines = [];\n      this._gridTicksPositions = [];\n      this._gridTicksScales = [];\n      this._gridTicksIndexCounts = [];\n      this._gridTicksIndexOffsets = [];\n      this._gridFaceScale = create$6();\n      this._gridFaceIndexCounts = [];\n      this._gridFaceIndexOffsets = [];\n      this._gridFaceMMatrices = [];\n      this._gridTicksMMatrices = [];\n      this._gridTicksRotations = [];\n      for (let i = 0; i < 3; i++) {\n        this.arePickDivisionsVisible.push(true);\n        this.areFacesVisible.push(true);\n        this._gridTicksZeros.push(create$3());\n        this._gridFaceZeros.push(create$3());\n        this._gridTicksMinorGridlines.push(create$3());\n        this._gridFaceMinorGridlines.push(create$3());\n        this._gridTicksScales.push(create$6());\n        this._gridTicksIndexCounts.push(0);\n        this._gridTicksIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 6; i++) {\n        this._gridFaceIndexCounts.push(0);\n        this._gridFaceIndexOffsets.push(0);\n        this._gridFaceMMatrices.push(create$7());\n      }\n      for (let i = 0; i < 12; i++) {\n        this._gridTicksMMatrices.push(create$7());\n        this._gridTicksRotations.push(create$7());\n        const _mat4 = this._gridTicksRotations[i];\n        _mat4[0] = Cube.EDGE_POSITIVES[i][0];\n        _mat4[1] = Cube.EDGE_POSITIVES[i][1];\n        _mat4[2] = Cube.EDGE_POSITIVES[i][2];\n        _mat4[4] = Cube.EDGE_NORMALS[i][0];\n        _mat4[5] = Cube.EDGE_NORMALS[i][1];\n        _mat4[6] = Cube.EDGE_NORMALS[i][2];\n        cross$1(this._vec3, Cube.EDGE_POSITIVES[i], Cube.EDGE_NORMALS[i]);\n        _mat4[8] = this._vec3[0];\n        _mat4[9] = this._vec3[1];\n        _mat4[10] = this._vec3[2];\n      }\n      this._fromValues = [null, null, null];\n      this._toValues = [null, null, null];\n      this.isDivisionPickingEnabled = [false, false, false];\n      this.isLabelPickingEnabled = [false, false, false];\n      this.isTitlePickingEnabled = [false, false, false];\n      this.isHeadingPickingEnabled = [false, false, false];\n      this.isAxisReversed = [false, false, false];\n      this._scalingX = 1;\n      this._scalingY = 1;\n      this._scalingZ = 1;\n      this._offset = create$7();\n    }\n    initialize() {\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this.isInitialized) {\n        if (this._hasChanged) {\n          const start = window.performance.now();\n          this._hasChanged = false;\n          set$8(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, this._maxBoundsZ - this._minBoundsZ);\n          const maxBounds = Math.max(this._size[0], Math.max(this._size[1], this._size[2]));\n          this._size[0] *= this._scalingX / maxBounds;\n          this._size[1] *= this._scalingY / maxBounds;\n          this._size[2] *= this._scalingZ / maxBounds;\n          this._updateGrids(this._size);\n          this._updateText(this._size);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n          this._core.log.write(LogLevel.info, `cartesian3d updated ${Math.round(window.performance.now() - start)}ms`);\n        }\n        multiply$2(this._mMatrix, this.mMatrix, this._offset);\n        this._mvMatrix = create$7();\n        multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n        fromMat4(this._mat3, this._mvMatrix);\n        for (let faceId = 0; faceId < 6; faceId++) {\n          multiply$1(this._vec3, Cube.FACE_POSITIONS[faceId], this._size);\n          transformMat4$2(this._forward, this._vec3, this._mvMatrix);\n          transformMat3(this._normal, Cube.FACE_NORMALS[faceId], this._mat3);\n          this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n        }\n        this._forward[0] = this._mat3[2];\n        this._forward[1] = this._mat3[5];\n        this._forward[2] = this._mat3[8];\n        for (let edgeId = 0; edgeId < 12; edgeId++) {\n          const faceIds = Cube.EDGE_FACES[edgeId];\n          const forward1 = this._isForwardFace[faceIds[0]];\n          const forward2 = this._isForwardFace[faceIds[1]];\n          const outsideEdge = forward1 != forward2;\n          this._isOutsideEdge[edgeId] = outsideEdge;\n          if (outsideEdge) {\n            this._isForwardEdge[edgeId] = dot$1(Cube.EDGE_FORWARDS[edgeId], this._forward) < 0;\n          }\n          this._distances[edgeId] = 0;\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          if (this.arePickDivisionsVisible[axisId]) {\n            set$5(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n            set$5(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n            const gridTicksScale = this._gridTicksScales[axisId];\n            for (let edge = 0; edge < 4; edge++) {\n              const edgeId = Cube.AXIS_EDGES[axisId][edge];\n              if (this._isOutsideEdge[edgeId] && this.isEdgeVisible[edgeId]) {\n                let distance2 = this._distances[edgeId];\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n                scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n                translate$2(gridTicksMMatrix, this._mMatrix, this._vec3);\n                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                if (!this._isForwardEdge[edgeId]) {\n                  scale$6(gridTicksMMatrix, gridTicksMMatrix, Constants$1.VECTOR3_REFLECTX);\n                }\n                scale$6(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                this._distances[edgeId] = distance2;\n              }\n            }\n          }\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          if (this.areFacesVisible[axisId]) {\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            set$5(this._gridFaceZeros[axisId], this.zero[axisId2], this.zero[axisId3]);\n            set$5(this._gridFaceMinorGridlines[axisId], this.minorGridlines[axisId2], this.minorGridlines[axisId3]);\n            for (let face = 0; face < 2; face++) {\n              const faceId = Cube.AXIS_FACES[axisId][face];\n              if (this._isForwardFace[faceId]) {\n                const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                scale$6(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                if (this._size[axisId] > 0) {\n                  translate$2(gridFaceMMatrix, gridFaceMMatrix, Cube.FACE_POSITIONS[faceId]);\n                }\n              }\n            }\n          }\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (this._isOutsideEdge[edgeId]) {\n              multiply$1(this._edgePosition, Cube.EDGE_POSITIONS[edgeId], this._size);\n              transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n              normalize$5(this._forward, this._edgePosition);\n              negate(this._forward, this._forward);\n              cross$1(this._right, Constants$1.VECTOR3_UNITY, this._forward);\n              normalize$5(this._right, this._right);\n              cross$1(this._up, this._forward, this._right);\n              transformMat3(this._edgeNormal, Cube.EDGE_NORMALS[edgeId], this._mat3);\n              transformMat3(this._edgePositive, Cube.EDGE_POSITIVES[edgeId], this._mat3);\n              copy$6(this._edgeNormalTemp, this._edgeNormal);\n              copy$6(this._edgePositiveTemp, this._edgePositive);\n              const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n              const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n              const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n              if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n                copy$6(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n              } else {\n                negate(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n                negate(this._edgeNormalTemp, this._edgeNormalTemp);\n              }\n              if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n                this._isLeftToRightHorizontal[edgeId] = true;\n                copy$6(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n              } else {\n                this._isLeftToRightHorizontal[edgeId] = false;\n                negate(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n                negate(this._edgePositiveTemp, this._edgePositiveTemp);\n              }\n              cross$1(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n              if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n                this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                negate(edgeHorizontalRight, edgeHorizontalRight);\n              }\n              cross$1(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n              const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n              const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n              const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n              if (dot$1(this._edgeNormal, this._right) < 0) {\n                copy$6(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n              } else {\n                negate(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n                negate(this._edgeNormal, this._edgeNormal);\n              }\n              if (dot$1(this._edgePositive, this._up) < 0) {\n                this._isLeftToRightVertical[edgeId] = true;\n                copy$6(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n              } else {\n                this._isLeftToRightVertical[edgeId] = false;\n                negate(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n                negate(this._edgePositive, this._edgePositive);\n              }\n              cross$1(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n              if (dot$1(edgeVerticalForward, this._forward) < 0) {\n                this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                negate(edgeVerticalRight, edgeVerticalRight);\n              }\n              cross$1(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n              if (this.isEdgeVisible[edgeId]) {\n                if (this._labels[axisId]) {\n                  this._updateLabels(axisId, edgeId);\n                }\n                if (this._titles[axisId]) {\n                  this._updateTitle(axisId, edgeId);\n                }\n              }\n              if (this.isHeadingVisible[edgeId]) {\n                this._updateHeading(axisId, edgeId);\n              }\n            }\n          }\n        }\n      }\n    }\n    _updateLabels(axisId, edgeId) {\n      const orientation = this._orientations[axisId];\n      let distance2 = this._distances[edgeId];\n      let maxLabelSize = this._maxLabelSize[axisId][1];\n      if (orientation == AxesTextOrientation.parallel)\n        maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n      distance2 += maxLabelSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const labelMMatrix = this._labelMMatrices[edgeId];\n      labelMMatrix[12] = this._vec3[0];\n      labelMMatrix[13] = this._vec3[1];\n      labelMMatrix[14] = this._vec3[2];\n      if (orientation == AxesTextOrientation.parallel) {\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      } else {\n        const right = this._edgeVerticalRight[edgeId];\n        const up = this._edgeVerticalUp[edgeId];\n        const forward = this._edgeVerticalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      }\n      multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n      if (orientation == AxesTextOrientation.perpendicular) {\n        multiply$2(labelMMatrix, labelMMatrix, Constants$1.MAT4_ROTATION_MINUS_90);\n      }\n      distance2 += maxLabelSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateTitle(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n      distance2 += titleTextSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const titleMMatrix = this._titleMMatrices[edgeId];\n      titleMMatrix[12] = this._vec3[0];\n      titleMMatrix[13] = this._vec3[1];\n      titleMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      titleMMatrix[0] = right[0];\n      titleMMatrix[1] = right[1];\n      titleMMatrix[2] = right[2];\n      titleMMatrix[4] = up[0];\n      titleMMatrix[5] = up[1];\n      titleMMatrix[6] = up[2];\n      titleMMatrix[8] = forward[0];\n      titleMMatrix[9] = forward[1];\n      titleMMatrix[10] = forward[2];\n      multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n      distance2 += titleTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateHeading(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n      distance2 += headingTextSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const headingMMatrix = this._headingMMatrices[edgeId];\n      headingMMatrix[12] = this._vec3[0];\n      headingMMatrix[13] = this._vec3[1];\n      headingMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      headingMMatrix[0] = right[0];\n      headingMMatrix[1] = right[1];\n      headingMMatrix[2] = right[2];\n      headingMMatrix[4] = up[0];\n      headingMMatrix[5] = up[1];\n      headingMMatrix[6] = up[2];\n      headingMMatrix[8] = forward[0];\n      headingMMatrix[9] = forward[1];\n      headingMMatrix[10] = forward[2];\n      multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n      distance2 += headingTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateGrids(size) {\n      let offset2 = 0;\n      this.pickGridLookup = {};\n      this._pickGrid = [];\n      const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n      const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n      const zDivisions = this._gridTicksPositions[2] ? this._gridTicksPositions[2].length - 1 : 0;\n      const count2 = 2 * (xDivisions * yDivisions) + 2 * (xDivisions * zDivisions) + 2 * (yDivisions * zDivisions) + xDivisions + yDivisions + zDivisions;\n      const byteLength = PickGridVertex.SIZE_BYTES * count2 * 4;\n      if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n        this._gridVertices = new ArrayBuffer(byteLength);\n        this._gridVerticesView = new DataView(this._gridVertices);\n        this._gridIndices = new Uint16Array(count2 * 6);\n      }\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const width2 = size[axisId];\n        set$8(this._gridTicksScales[axisId], width2, this._gridPickDivisionHeight, 1);\n        offset2 = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset2);\n        for (let face = 0; face < 2; face++) {\n          const faceId = Cube.AXIS_FACES[axisId][face];\n          offset2 = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset2);\n        }\n        this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n      }\n    }\n    _updateText(size) {\n      let glyphOffset = 0;\n      let count2 = 0;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const labels = this._labels[axisId];\n        if (labels) {\n          for (let i = 0; i < labels.length; i++) {\n            count2 += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n          }\n        }\n        const title = this._titles[axisId];\n        if (title) {\n          count2 += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n        }\n        const heading = this._headings[axisId];\n        if (heading) {\n          count2 += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n      }\n      const byteLength = PositionTexturePickVertex.SIZE_BYTES * count2 * 4;\n      if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n        this._textVertices = new ArrayBuffer(byteLength);\n        this._textVerticesView = new DataView(this._textVertices);\n        this._textIndices = new Uint16Array(count2 * 6);\n      }\n      this.pickLabelLookup = {};\n      this._pickLabel = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._labels[axisId]) {\n          const width2 = size[axisId];\n          const maxLabelSize = this._maxLabelSize[axisId];\n          const orientation = this._orientations[axisId];\n          set$5(maxLabelSize, 0, 0);\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateLeftToRightAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateRightToLeftAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesLeftToRightIndexCounts[axisId] = 0;\n          this._axesRightToLeftIndexCounts[axisId] = 0;\n          this._maxLabelSize[axisId][0] = 0;\n          this._maxLabelSize[axisId][1] = 0;\n        }\n      }\n      this.pickTitleLookup = {};\n      this._pickTitle = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._titles[axisId]) {\n          set$8(this._textPosition, 0, 0, 0);\n          set$8(this._textOffset, 0, 0, 0);\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n          const scale2 = this._titleSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n          this.pickTitleLookup[pickId] = this._pickTitle.length;\n          this._pickTitle.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          this._titleIndexCounts[axisId] = 0;\n        }\n      }\n      this.pickHeadingLookup = {};\n      this._pickHeading = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._headings[axisId]) {\n          set$8(this._textPosition, 0, 0, 0);\n          set$8(this._textOffset, 0, 0, 0);\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n          const scale2 = this._headingSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n          this.pickHeadingLookup[pickId] = this._pickHeading.length;\n          this._pickHeading.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          this._headingIndexCounts[axisId] = 0;\n        }\n      }\n    }\n    _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions2, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions2[label2] : positions2[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$8(this._textPosition, (position2 - 0.5) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = position2 == 0 ? 0 : position2 == 1 ? -width2 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            maxSize[0] = Math.max(width2, maxSize[0]);\n            maxSize[1] = Math.max(lineHeight2, maxSize[1]);\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$8(this._textPosition, 0, (position2 - 0.5) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = position2 == 0 ? 0 : position2 == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n            }\n            maxSize[0] = Math.max(lineHeight2, maxSize[0]);\n            maxSize[1] = Math.max(width2, maxSize[1]);\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions2, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions2[label2] : positions2[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$8(this._textPosition, (0.5 - position2) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = label2 == 0 ? -width2 : label2 == labels.length - 1 ? 0 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$8(this._textPosition, 0, (0.5 - position2) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = label2 == 0 ? -maxGlyphTop : label2 == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n            }\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset2) {\n      this._gridTicksIndexOffsets[axisId] = offset2 * 6;\n      if (this._gridTicksPositions[axisId]) {\n        const axes = create$6();\n        const positions2 = this._gridTicksPositions[axisId];\n        const isAxisReversed = this.isAxisReversed[axisId];\n        let vertexOffset = offset2 * 4;\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const left = isAxisReversed ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const right = isAxisReversed ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId] = position2 + 1;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n          this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n          this._pickGrid.push(axes[0]);\n          this._pickGrid.push(axes[1]);\n          this._pickGrid.push(axes[2]);\n          let indexOffset = offset2 * 6;\n          for (let j = 0; j < this._indexTemplate.length; j++) {\n            indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n          }\n          set$7(this._bounds, left + 0.5, 0, right + 0.5, 1);\n          this._translation[0] = left;\n          this._translation[1] = 0.5;\n          this._translation[2] = 0;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 1;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = left;\n          this._translation[1] = -0.5;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 0;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          offset2++;\n        }\n      }\n      this._gridTicksIndexCounts[axisId] = offset2 * 6 - this._gridTicksIndexOffsets[axisId];\n      return offset2;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset2) {\n      set$8(this._translation, 0, 0, 0);\n      this._gridFaceIndexOffsets[faceId] = offset2 * 6;\n      const axisId2 = axisId == 0 ? 1 : 0;\n      const axisId3 = axisId == 2 ? 1 : 2;\n      if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n        const axes = create$6();\n        negate(this._normal, Cube.FACE_NORMALS[faceId]);\n        const positions2 = this._gridTicksPositions[axisId2];\n        const positions3 = this._gridTicksPositions[axisId3];\n        const isAxisReversed2 = this.isAxisReversed[axisId2];\n        const isAxisReversed3 = this.isAxisReversed[axisId3];\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId2] = position2 + 1;\n          let vertexOffset = offset2 * 4;\n          for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n            const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n            const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n            axes[axisId3] = position3 + 1;\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n            this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n            this._pickGrid.push(axes[0]);\n            this._pickGrid.push(axes[1]);\n            this._pickGrid.push(axes[2]);\n            let indexOffset = offset2 * 6;\n            for (let i = 0; i < this._indexTemplate.length; i++) {\n              indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n            }\n            set$7(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = max3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = max3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = min3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = min3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            offset2++;\n          }\n        }\n      }\n      this._gridFaceIndexCounts[faceId] = offset2 * 6 - this._gridFaceIndexOffsets[faceId];\n      return offset2;\n    }\n  }\n  class Cartesian2dAxes extends AxesBase {\n    get size() {\n      return this._size;\n    }\n    get isDiscreteX() {\n      return this._isDiscrete[0];\n    }\n    set isDiscreteX(value2) {\n      if (value2 != this._isDiscrete[0]) {\n        this._isDiscrete[0] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteY() {\n      return this._isDiscrete[1];\n    }\n    set isDiscreteY(value2) {\n      if (value2 != this._isDiscrete[1]) {\n        this._isDiscrete[1] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsOutsideEdge(index2) {\n      return this._isOutsideEdge[index2];\n    }\n    getIsForwardFace(index2) {\n      return this._isForwardFace[index2];\n    }\n    get textVertices() {\n      return this._textVertices;\n    }\n    get textIndices() {\n      return this._textIndices;\n    }\n    getLabelMMatrix(index2) {\n      return this._labelMMatrices[index2];\n    }\n    setLabelPositions(index2, value2) {\n      if (this._labelPositions[index2] != value2) {\n        this._labelPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabels(index2, value2) {\n      if (this._labels[index2] != value2) {\n        this._labels[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabelSizes(index2, value2) {\n      if (this._labelSizes[index2] != value2) {\n        this._labelSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getLabelOrientation(index2) {\n      return this._orientations[index2];\n    }\n    setLabelOrientation(index2, orientation) {\n      if (this._orientations[index2] != orientation) {\n        this._orientations[index2] = orientation;\n        this._hasChanged = true;\n      }\n    }\n    getTitleIndexCount(index2) {\n      return this._titleIndexCounts[index2];\n    }\n    getTitleIndexOffset(index2) {\n      return this._titleIndexOffsets[index2];\n    }\n    getTitleMMatrix(index2) {\n      return this._titleMMatrices[index2];\n    }\n    setTitle(index2, value2) {\n      if (this._titles[index2] != value2) {\n        this._titles[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setTitleSize(index2, value2) {\n      if (this._titleSizes[index2] != value2) {\n        this._titleSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getHeadingIndexCount(index2) {\n      return this._headingIndexCounts[index2];\n    }\n    getHeadingIndexOffset(index2) {\n      return this._headingIndexOffsets[index2];\n    }\n    getHeadingMMatrix(index2) {\n      return this._headingMMatrices[index2];\n    }\n    setHeading(index2, value2) {\n      if (this._headings[index2] != value2) {\n        this._headings[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setHeadingSize(index2, value2) {\n      if (this._headingSizes[index2] != value2) {\n        this._headingSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsLeftToRightHorizontal(index2) {\n      return this._isLeftToRightHorizontal[index2];\n    }\n    getIsLeftToRightVertical(index2) {\n      return this._isLeftToRightVertical[index2];\n    }\n    getAxesLeftToRightIndexCount(index2) {\n      return this._axesLeftToRightIndexCounts[index2];\n    }\n    getAxesRightToLeftIndexCount(index2) {\n      return this._axesRightToLeftIndexCounts[index2];\n    }\n    getAxesLeftToRightIndexOffset(index2) {\n      return this._axesLeftToRightIndexOffsets[index2];\n    }\n    getAxesRightToLeftIndexOffset(index2) {\n      return this._axesRightToLeftIndexOffsets[index2];\n    }\n    get gridVertices() {\n      return this._gridVertices;\n    }\n    get gridIndices() {\n      return this._gridIndices;\n    }\n    getGridTicksIndexCount(index2) {\n      return this._gridTicksIndexCounts[index2];\n    }\n    getGridTicksIndexOffset(index2) {\n      return this._gridTicksIndexOffsets[index2];\n    }\n    getGridFaceIndexCount(index2) {\n      return this._gridFaceIndexCounts[index2];\n    }\n    getGridFaceIndexOffset(index2) {\n      return this._gridFaceIndexOffsets[index2];\n    }\n    getGridTicksMMatrix(index2) {\n      return this._gridTicksMMatrices[index2];\n    }\n    getGridFaceMMatrix(index2) {\n      return this._gridFaceMMatrices[index2];\n    }\n    getGridTicksScale(index2) {\n      return this._gridTicksScales[index2];\n    }\n    getGridTicksZero(index2) {\n      return this._gridTicksZeros[index2];\n    }\n    get gridFaceZero() {\n      return this._gridFaceZeros;\n    }\n    get gridFaceMinorGridlines() {\n      return this._gridFaceMinorGridlines;\n    }\n    getGridTicksMinorGridlines(index2) {\n      return this._gridTicksMinorGridlines[index2];\n    }\n    setTickPositions(index2, value2) {\n      if (this._gridTicksPositions[index2] != value2) {\n        this._gridTicksPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingX() {\n      return this._scalingX;\n    }\n    set scalingX(value2) {\n      if (value2 != this._scalingX) {\n        this._scalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingY() {\n      return this._scalingY;\n    }\n    set scalingY(value2) {\n      if (value2 != this._scalingY) {\n        this._scalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offset[12];\n    }\n    set offsetX(value2) {\n      if (value2 != this._offset[12]) {\n        this._offset[12] = value2;\n      }\n    }\n    get offsetY() {\n      return this._offset[13];\n    }\n    set offsetY(value2) {\n      if (value2 != this._offset[13]) {\n        this._offset[13] = value2;\n      }\n    }\n    set rotation(value2) {\n      if (this._rotation != value2) {\n        this._rotation = value2;\n        this._rMatrix = create$7();\n        fromQuat(this._rMatrix, value2);\n      }\n    }\n    constructor(core) {\n      super(core);\n      this._size = create$6();\n      this._translation = create$6();\n      this._normal = create$6();\n      this._forward = create$6();\n      this._right = create$6();\n      this._up = create$6();\n      this._texCoord = create$3();\n      this._bounds = create$5();\n      this._vec3 = create$6();\n      this._vec4 = create$5();\n      this._mat3 = create$8();\n      this._isDiscrete = [false, false];\n      this._minBoundsX = 0;\n      this._minBoundsY = 0;\n      this._maxBoundsX = 0;\n      this._maxBoundsY = 0;\n      this._isForwardFace = [];\n      this._isForwardEdge = [];\n      this._isOutsideEdge = [];\n      for (let i = 0; i < 2; i++) {\n        this._isForwardFace.push(false);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._isForwardEdge.push(false);\n        this._isOutsideEdge.push(false);\n      }\n      this._textOffset = create$6();\n      this._textPosition = create$6();\n      this._distances = [];\n      for (let i = 0; i < 4; i++) {\n        this._distances.push(0);\n      }\n      this._labelPositions = [];\n      this._labels = [];\n      this._labelSizes = [];\n      this._maxLabelSize = [];\n      this._axesLeftToRightIndexCounts = [];\n      this._axesRightToLeftIndexCounts = [];\n      this._axesLeftToRightIndexOffsets = [];\n      this._axesRightToLeftIndexOffsets = [];\n      this._labelMMatrices = [];\n      this._orientations = [];\n      for (let i = 0; i < 2; i++) {\n        this._maxLabelSize.push(create$3());\n        this._orientations.push(AxesTextOrientation.parallel);\n        this._axesLeftToRightIndexCounts.push(0);\n        this._axesRightToLeftIndexCounts.push(0);\n        this._axesLeftToRightIndexOffsets.push(0);\n        this._axesRightToLeftIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._labelMMatrices.push(create$7());\n      }\n      this._titles = [];\n      this._titleSizes = [];\n      this._titleIndexCounts = [];\n      this._titleIndexOffsets = [];\n      this._titleMMatrices = [];\n      for (let i = 0; i < 2; i++) {\n        this._titles.push(null);\n        this._titleSizes.push(core.config.axesTextTitleSize);\n        this._titleIndexCounts.push(0);\n        this._titleIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._titleMMatrices.push(create$7());\n      }\n      this._headings = [];\n      this._headingSizes = [];\n      this._headingIndexCounts = [];\n      this._headingIndexOffsets = [];\n      this._headingMMatrices = [];\n      this.isHeadingVisible = [];\n      for (let i = 0; i < 2; i++) {\n        this._headings.push(null);\n        this._headingSizes.push(core.config.axesTextHeadingSize);\n        this._headingIndexCounts.push(0);\n        this._headingIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._headingMMatrices.push(create$7());\n        this.isHeadingVisible.push(true);\n      }\n      this.isEdgeVisible = [];\n      this._edgePosition = create$6();\n      this._edgePositive = create$6();\n      this._edgeNormal = create$6();\n      this._edgeNormalTemp = create$6();\n      this._edgePositiveTemp = create$6();\n      this._isLeftToRightHorizontal = [];\n      this._isLeftToRightVertical = [];\n      this._edgeHorizontalRight = [];\n      this._edgeHorizontalUp = [];\n      this._edgeHorizontalForward = [];\n      this._edgeVerticalRight = [];\n      this._edgeVerticalUp = [];\n      this._edgeVerticalForward = [];\n      for (let i = 0; i < 4; i++) {\n        this.isEdgeVisible.push(true);\n        this._isLeftToRightHorizontal.push(false);\n        this._isLeftToRightVertical.push(false);\n        this._edgeHorizontalRight.push(create$6());\n        this._edgeHorizontalUp.push(create$6());\n        this._edgeHorizontalForward.push(create$6());\n        this._edgeVerticalRight.push(create$6());\n        this._edgeVerticalUp.push(create$6());\n        this._edgeVerticalForward.push(create$6());\n      }\n      this.isFaceVisible = [];\n      for (let i = 0; i < 2; i++) {\n        this.isFaceVisible.push(true);\n      }\n      this.arePickDivisionsVisible = [];\n      this.areFacesVisible = [];\n      this._indexTemplate = Quad$3.INDICES;\n      this.zero = create$6();\n      this._gridTicksZeros = [];\n      this._gridFaceZeros = create$3();\n      this.minorGridlines = fromValues$3(1, 1, 1);\n      this._gridTicksMinorGridlines = [];\n      this._gridFaceMinorGridlines = create$3();\n      this._gridTicksPositions = [];\n      this._gridTicksScales = [];\n      this._gridTicksIndexCounts = [];\n      this._gridTicksIndexOffsets = [];\n      this._gridFaceScale = create$6();\n      this._gridFaceIndexCounts = [];\n      this._gridFaceIndexOffsets = [];\n      this._gridFaceMMatrices = [];\n      this._gridTicksMMatrices = [];\n      this._gridTicksRotations = [];\n      for (let i = 0; i < 2; i++) {\n        this.arePickDivisionsVisible.push(true);\n        this.areFacesVisible.push(true);\n        this._gridTicksZeros.push(create$3());\n        this._gridTicksMinorGridlines.push(create$3());\n        this._gridTicksScales.push(create$6());\n        this._gridTicksIndexCounts.push(0);\n        this._gridTicksIndexOffsets.push(0);\n        this._gridFaceIndexCounts.push(0);\n        this._gridFaceIndexOffsets.push(0);\n        this._gridFaceMMatrices.push(create$7());\n      }\n      for (let i = 0; i < 4; i++) {\n        this._gridTicksMMatrices.push(create$7());\n        this._gridTicksRotations.push(create$7());\n        const _mat4 = this._gridTicksRotations[i];\n        _mat4[0] = Quad$3.EDGE_POSITIVES[i][0];\n        _mat4[1] = Quad$3.EDGE_POSITIVES[i][1];\n        _mat4[2] = Quad$3.EDGE_POSITIVES[i][2];\n        _mat4[4] = Quad$3.EDGE_NORMALS[i][0];\n        _mat4[5] = Quad$3.EDGE_NORMALS[i][1];\n        _mat4[6] = Quad$3.EDGE_NORMALS[i][2];\n        cross$1(this._vec3, Quad$3.EDGE_POSITIVES[i], Quad$3.EDGE_NORMALS[i]);\n        _mat4[8] = this._vec3[0];\n        _mat4[9] = this._vec3[1];\n        _mat4[10] = this._vec3[2];\n      }\n      this._fromValues = [null, null];\n      this._toValues = [null, null];\n      this.isDivisionPickingEnabled = [false, false];\n      this.isLabelPickingEnabled = [false, false];\n      this.isTitlePickingEnabled = [false, false];\n      this.isHeadingPickingEnabled = [false, false];\n      this.isAxisReversed = [false, false];\n      this._scalingX = 1;\n      this._scalingY = 1;\n      this._offset = create$7();\n    }\n    initialize() {\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this.isInitialized) {\n        if (this._hasChanged) {\n          const start = window.performance.now();\n          this._hasChanged = false;\n          set$8(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, 0);\n          const maxBounds = Math.max(this._size[0], this._size[1]);\n          this._size[0] *= this._scalingX / maxBounds;\n          this._size[1] *= this._scalingY / maxBounds;\n          this._updateGrids(this._size);\n          this._updateText(this._size);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n          this._core.log.write(LogLevel.info, `cartesian2d updated ${Math.round(window.performance.now() - start)}ms`);\n        }\n        if (this._rMatrix) {\n          mul(this._mMatrix, this.mMatrix, this._rMatrix);\n          mul(this._mMatrix, this._mMatrix, this._offset);\n        } else {\n          multiply$2(this._mMatrix, this.mMatrix, this._offset);\n        }\n        this._mvMatrix = create$7();\n        multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n        fromMat4(this._mat3, this._mvMatrix);\n        for (let faceId = 0; faceId < 2; faceId++) {\n          transformMat4$2(this._forward, Constants$1.VECTOR3_ZERO, this._mvMatrix);\n          transformMat3(this._normal, Quad$3.FACE_NORMALS[faceId], this._mat3);\n          this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n        }\n        this._forward[0] = this._mat3[2];\n        this._forward[1] = this._mat3[5];\n        this._forward[2] = this._mat3[8];\n        for (let edgeId = 0; edgeId < 4; edgeId++) {\n          this._isForwardEdge[edgeId] = dot$1(Quad$3.EDGE_FORWARDS[edgeId], this._forward) < 0;\n          this._distances[edgeId] = 0;\n        }\n        for (let axisId = 0; axisId < 2; axisId++) {\n          if (this.arePickDivisionsVisible[axisId]) {\n            set$5(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n            set$5(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n            const gridTicksScale = this._gridTicksScales[axisId];\n            for (let edge = 0; edge < 2; edge++) {\n              const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n              if (this.isEdgeVisible[edgeId]) {\n                let distance2 = this._distances[edgeId];\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                multiply$1(this._vec3, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n                scaleAndAdd(this._vec3, this._vec3, Quad$3.EDGE_NORMALS[edgeId], distance2);\n                translate$2(gridTicksMMatrix, this._mMatrix, this._vec3);\n                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                if (!this._isForwardEdge[edgeId]) {\n                  scale$6(gridTicksMMatrix, gridTicksMMatrix, Constants$1.VECTOR3_REFLECTX);\n                }\n                scale$6(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                this._distances[edgeId] = distance2;\n              }\n            }\n          }\n        }\n        set$5(this._gridFaceZeros, this.zero[0], this.zero[1]);\n        set$5(this._gridFaceMinorGridlines, this.minorGridlines[0], this.minorGridlines[1]);\n        for (let faceId = 0; faceId < 2; faceId++) {\n          if (this._isForwardFace[faceId]) {\n            const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n            scale$6(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n          }\n        }\n        for (let axisId = 0; axisId < 2; axisId++) {\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n            multiply$1(this._edgePosition, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n            transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n            normalize$5(this._forward, this._edgePosition);\n            negate(this._forward, this._forward);\n            cross$1(this._right, Constants$1.VECTOR3_UNITY, this._forward);\n            normalize$5(this._right, this._right);\n            cross$1(this._up, this._forward, this._right);\n            transformMat3(this._edgeNormal, Quad$3.EDGE_NORMALS[edgeId], this._mat3);\n            transformMat3(this._edgePositive, Quad$3.EDGE_POSITIVES[edgeId], this._mat3);\n            copy$6(this._edgeNormalTemp, this._edgeNormal);\n            copy$6(this._edgePositiveTemp, this._edgePositive);\n            const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n            const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n            const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n            if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n              copy$6(edgeHorizontalUp, Quad$3.EDGE_NORMALS[edgeId]);\n            } else {\n              negate(edgeHorizontalUp, Quad$3.EDGE_NORMALS[edgeId]);\n              negate(this._edgeNormalTemp, this._edgeNormalTemp);\n            }\n            if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n              this._isLeftToRightHorizontal[edgeId] = true;\n              copy$6(edgeHorizontalRight, Quad$3.EDGE_POSITIVES[edgeId]);\n            } else {\n              this._isLeftToRightHorizontal[edgeId] = false;\n              negate(edgeHorizontalRight, Quad$3.EDGE_POSITIVES[edgeId]);\n              negate(this._edgePositiveTemp, this._edgePositiveTemp);\n            }\n            cross$1(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n            if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n              this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n              negate(edgeHorizontalRight, edgeHorizontalRight);\n            }\n            cross$1(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n            const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n            const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n            const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n            if (dot$1(this._edgeNormal, this._right) < 0) {\n              copy$6(edgeVerticalUp, Quad$3.EDGE_NORMALS[edgeId]);\n            } else {\n              negate(edgeVerticalUp, Quad$3.EDGE_NORMALS[edgeId]);\n              negate(this._edgeNormal, this._edgeNormal);\n            }\n            if (dot$1(this._edgePositive, this._up) < 0) {\n              this._isLeftToRightVertical[edgeId] = true;\n              copy$6(edgeVerticalRight, Quad$3.EDGE_POSITIVES[edgeId]);\n            } else {\n              this._isLeftToRightVertical[edgeId] = false;\n              negate(edgeVerticalRight, Quad$3.EDGE_POSITIVES[edgeId]);\n              negate(this._edgePositive, this._edgePositive);\n            }\n            cross$1(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n            if (dot$1(edgeVerticalForward, this._forward) < 0) {\n              this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n              negate(edgeVerticalRight, edgeVerticalRight);\n            }\n            cross$1(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n            if (this.isEdgeVisible[edgeId]) {\n              if (this._labels[axisId]) {\n                this._updateLabels(axisId, edgeId);\n              }\n              if (this._titles[axisId]) {\n                this._updateTitle(axisId, edgeId);\n              }\n            }\n            if (this.isHeadingVisible[edgeId]) {\n              this._updateHeading(axisId, edgeId);\n            }\n          }\n        }\n      }\n    }\n    _updateLabels(axisId, edgeId) {\n      const orientation = this._orientations[axisId];\n      let distance2 = this._distances[edgeId];\n      let maxLabelSize = this._maxLabelSize[axisId][1];\n      if (orientation == AxesTextOrientation.parallel)\n        maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n      distance2 += maxLabelSize * 0.5;\n      multiply$1(this._vec3, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$3.EDGE_NORMALS[edgeId], distance2);\n      const labelMMatrix = this._labelMMatrices[edgeId];\n      labelMMatrix[12] = this._vec3[0];\n      labelMMatrix[13] = this._vec3[1];\n      labelMMatrix[14] = this._vec3[2];\n      if (orientation == AxesTextOrientation.parallel) {\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      } else {\n        const right = this._edgeVerticalRight[edgeId];\n        const up = this._edgeVerticalUp[edgeId];\n        const forward = this._edgeVerticalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      }\n      multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n      if (orientation == AxesTextOrientation.perpendicular) {\n        multiply$2(labelMMatrix, labelMMatrix, Constants$1.MAT4_ROTATION_MINUS_90);\n      }\n      distance2 += maxLabelSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateTitle(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n      distance2 += titleTextSize * 0.5;\n      multiply$1(this._vec3, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$3.EDGE_NORMALS[edgeId], distance2);\n      const titleMMatrix = this._titleMMatrices[edgeId];\n      titleMMatrix[12] = this._vec3[0];\n      titleMMatrix[13] = this._vec3[1];\n      titleMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      titleMMatrix[0] = right[0];\n      titleMMatrix[1] = right[1];\n      titleMMatrix[2] = right[2];\n      titleMMatrix[4] = up[0];\n      titleMMatrix[5] = up[1];\n      titleMMatrix[6] = up[2];\n      titleMMatrix[8] = forward[0];\n      titleMMatrix[9] = forward[1];\n      titleMMatrix[10] = forward[2];\n      multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n      distance2 += titleTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateHeading(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n      distance2 += headingTextSize * 0.5;\n      multiply$1(this._vec3, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$3.EDGE_NORMALS[edgeId], distance2);\n      const headingMMatrix = this._headingMMatrices[edgeId];\n      headingMMatrix[12] = this._vec3[0];\n      headingMMatrix[13] = this._vec3[1];\n      headingMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      headingMMatrix[0] = right[0];\n      headingMMatrix[1] = right[1];\n      headingMMatrix[2] = right[2];\n      headingMMatrix[4] = up[0];\n      headingMMatrix[5] = up[1];\n      headingMMatrix[6] = up[2];\n      headingMMatrix[8] = forward[0];\n      headingMMatrix[9] = forward[1];\n      headingMMatrix[10] = forward[2];\n      multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n      distance2 += headingTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateGrids(size) {\n      let offset2 = 0;\n      this.pickGridLookup = {};\n      this._pickGrid = [];\n      const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n      const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n      const count2 = 2 * (xDivisions * yDivisions) + xDivisions + yDivisions;\n      const byteLength = PickGridVertex.SIZE_BYTES * count2 * 4;\n      if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n        this._gridVertices = new ArrayBuffer(byteLength);\n        this._gridVerticesView = new DataView(this._gridVertices);\n        this._gridIndices = new Uint16Array(count2 * 6);\n      }\n      for (let axisId2 = 0; axisId2 < 2; axisId2++) {\n        const width2 = size[axisId2];\n        set$8(this._gridTicksScales[axisId2], width2, this._gridPickDivisionHeight, 1);\n        offset2 = this._updateGridTicks(axisId2, this._gridVerticesView, this._gridIndices, offset2);\n        this._gridFaceScale[axisId2] = size[axisId2] == 0 ? 1 : size[axisId2];\n      }\n      const axisId = 2;\n      this._gridFaceScale[axisId] = 1;\n      for (let faceId = 0; faceId < 2; faceId++) {\n        offset2 = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset2);\n      }\n    }\n    _updateText(size) {\n      let glyphOffset = 0;\n      let count2 = 0;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const labels = this._labels[axisId];\n        if (labels) {\n          for (let i = 0; i < labels.length; i++) {\n            count2 += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n          }\n        }\n        const title = this._titles[axisId];\n        if (title) {\n          count2 += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n        }\n        const heading = this._headings[axisId];\n        if (heading) {\n          count2 += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n      }\n      const byteLength = PositionTexturePickVertex.SIZE_BYTES * count2 * 4;\n      if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n        this._textVertices = new ArrayBuffer(byteLength);\n        this._textVerticesView = new DataView(this._textVertices);\n        this._textIndices = new Uint16Array(count2 * 6);\n      }\n      this.pickLabelLookup = {};\n      this._pickLabel = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._labels[axisId]) {\n          const width2 = size[axisId];\n          const maxLabelSize = this._maxLabelSize[axisId];\n          const orientation = this._orientations[axisId];\n          set$5(maxLabelSize, 0, 0);\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateLeftToRightAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateRightToLeftAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesLeftToRightIndexCounts[axisId] = 0;\n          this._axesRightToLeftIndexCounts[axisId] = 0;\n          this._maxLabelSize[axisId][0] = 0;\n          this._maxLabelSize[axisId][1] = 0;\n        }\n      }\n      this.pickTitleLookup = {};\n      this._pickTitle = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._titles[axisId]) {\n          set$8(this._textPosition, 0, 0, 0);\n          set$8(this._textOffset, 0, 0, 0);\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n          const scale2 = this._titleSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n          this.pickTitleLookup[pickId] = this._pickTitle.length;\n          this._pickTitle.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          this._titleIndexCounts[axisId] = 0;\n        }\n      }\n      this.pickHeadingLookup = {};\n      this._pickHeading = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._headings[axisId]) {\n          set$8(this._textPosition, 0, 0, 0);\n          set$8(this._textOffset, 0, 0, 0);\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n          const scale2 = this._headingSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n          this.pickHeadingLookup[pickId] = this._pickHeading.length;\n          this._pickHeading.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          this._headingIndexCounts[axisId] = 0;\n        }\n      }\n    }\n    _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions2, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions2[label2] : positions2[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$8(this._textPosition, (position2 - 0.5) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = position2 == 0 ? 0 : position2 == 1 ? -width2 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            maxSize[0] = Math.max(width2, maxSize[0]);\n            maxSize[1] = Math.max(lineHeight2, maxSize[1]);\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$8(this._textPosition, 0, (position2 - 0.5) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = position2 == 0 ? 0 : position2 == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n            }\n            maxSize[0] = Math.max(lineHeight2, maxSize[0]);\n            maxSize[1] = Math.max(width2, maxSize[1]);\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions2, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions2[label2] : positions2[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$8(this._textPosition, (0.5 - position2) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = label2 == 0 ? -width2 : label2 == labels.length - 1 ? 0 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$8(this._textPosition, 0, (0.5 - position2) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = label2 == 0 ? -maxGlyphTop : label2 == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n            }\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset2) {\n      this._gridTicksIndexOffsets[axisId] = offset2 * 6;\n      if (this._gridTicksPositions[axisId]) {\n        const axes = create$6();\n        const positions2 = this._gridTicksPositions[axisId];\n        const isAxisReversed = this.isAxisReversed[axisId];\n        let vertexOffset = offset2 * 4;\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const left = isAxisReversed ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const right = isAxisReversed ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId] = position2 + 1;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n          this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n          this._pickGrid.push(axes[0]);\n          this._pickGrid.push(axes[1]);\n          this._pickGrid.push(axes[2]);\n          let indexOffset = offset2 * 6;\n          for (let j = 0; j < this._indexTemplate.length; j++) {\n            indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n          }\n          set$7(this._bounds, left + 0.5, 0, right + 0.5, 1);\n          this._translation[0] = left;\n          this._translation[1] = 0.5;\n          this._translation[2] = 0;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 1;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = left;\n          this._translation[1] = -0.5;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 0;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          offset2++;\n        }\n      }\n      this._gridTicksIndexCounts[axisId] = offset2 * 6 - this._gridTicksIndexOffsets[axisId];\n      return offset2;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset2) {\n      set$8(this._translation, 0, 0, 0);\n      this._gridFaceIndexOffsets[faceId] = offset2 * 6;\n      const axisId2 = axisId == 0 ? 1 : 0;\n      const axisId3 = axisId == 2 ? 1 : 2;\n      if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n        const axes = create$6();\n        negate(this._normal, Quad$3.FACE_NORMALS[faceId]);\n        const positions2 = this._gridTicksPositions[axisId2];\n        const positions3 = this._gridTicksPositions[axisId3];\n        const isAxisReversed2 = this.isAxisReversed[axisId2];\n        const isAxisReversed3 = this.isAxisReversed[axisId3];\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId2] = position2 + 1;\n          let vertexOffset = offset2 * 4;\n          for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n            const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n            const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n            axes[axisId3] = position3 + 1;\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n            this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n            this._pickGrid.push(axes[0]);\n            this._pickGrid.push(axes[1]);\n            this._pickGrid.push(axes[2]);\n            let indexOffset = offset2 * 6;\n            for (let i = 0; i < this._indexTemplate.length; i++) {\n              indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n            }\n            set$7(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = max3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = max3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = min3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = min3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            offset2++;\n          }\n        }\n      }\n      this._gridFaceIndexCounts[faceId] = offset2 * 6 - this._gridFaceIndexOffsets[faceId];\n      return offset2;\n    }\n  }\n  class Glyph {\n    toJSON() {\n      return {\n        key: this.key,\n        char: this.char,\n        width: this.width,\n        height: this.height,\n        top: this.top,\n        left: this.left,\n        advance: this.advance,\n        u0: this.u0,\n        v0: this.v0,\n        u1: this.u1,\n        v1: this.v1\n      };\n    }\n  }\n  let FontVisual$2 = class FontVisual {\n    update() {\n    }\n    constructor(font2) {\n      this.font = font2;\n    }\n  };\n  class Font {\n    get atlas() {\n      return this._rasterizer.fontAtlas;\n    }\n    get count() {\n      return this._chars.size;\n    }\n    constructor(core, rasterizer) {\n      this._core = core;\n      this._rasterizer = rasterizer;\n      this._chars = /* @__PURE__ */ new Set();\n      this._previousSize = 0;\n      this.glyphs = {};\n    }\n    addGlyph(char) {\n      if (!this._chars.has(char)) {\n        this._chars.add(char);\n        this._rasterizer.draw(char);\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._core.log.write(LogLevel.info, `${this.name} added ${this._chars.size - this._previousSize} new glyphs`);\n        this._previousSize = this._chars.size;\n        if (this.hasChangedCallback) {\n          this.hasChangedCallback();\n        }\n      }\n    }\n    toJSON() {\n      const glyphs = [];\n      for (let key2 in this.glyphs) {\n        const glyph = this.glyphs[key2];\n        glyphs.push(glyph.toJSON());\n      }\n      return {\n        name: this.name,\n        size: this.size,\n        border: this.border,\n        glyphs,\n        edgeValue: this.edgeValue\n      };\n    }\n  }\n  class FontAtlas {\n    constructor(width2, height2) {\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = width2;\n      canvas.height = height2;\n      const context2 = canvas.getContext(\"2d\");\n      context2.clearRect(0, 0, width2, height2);\n      this.imageData = context2.getImageData(0, 0, width2, height2);\n      this.x = 0;\n      this.top = new Uint16Array(width2);\n    }\n  }\n  class FontRasterizer {\n    get font() {\n      return this._font;\n    }\n    get fontAtlas() {\n      return this._fontAtlas;\n    }\n    constructor(core, options2) {\n      let start = performance.now();\n      this._core = core;\n      this._fontAtlas = options2.fontAtlas;\n      this._fontSize = options2.fontSize;\n      this._border = options2.border;\n      this._fontFamily = options2.fontFamily;\n      this._fontWeight = options2.fontWeight;\n      this._fontStyle = options2.fontStyle;\n      this._baseline = options2.baseline;\n      this._maxDistance = options2.maxDistance;\n      this._edgeValue = options2.edgeValue;\n      this._font = new Font(core, this);\n      this._font.name = `${this._fontFamily}${this._fontSize}${this._fontWeight == \"normal\" ? \"\" : this._fontWeight}${this._fontStyle == \"normal\" ? \"\" : this._fontStyle}`.replace(/[^a-z0-9,]/ig, \"\").toLowerCase();\n      this._font.size = this._fontSize;\n      this._font.border = this._border;\n      this._font.edgeValue = this._edgeValue;\n      const glyphRasterizerOptions = {\n        baseline: this._baseline,\n        border: this._border,\n        edgeValue: this._edgeValue,\n        fontFamily: this._fontFamily,\n        fontSize: this._fontSize,\n        fontStyle: this._fontStyle,\n        fontWeight: this._fontWeight,\n        maxDistance: this._maxDistance\n      };\n      this._glyphRasterizer = new GlyphRasterizer(core, glyphRasterizerOptions);\n      this._core.log.write(LogLevel.info, `font rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n      const glyph = this._glyphRasterizer.draw(char);\n      const texWidth = glyph.width + 2 * this._border;\n      const texHeight = glyph.height + 2 * this._border;\n      const width2 = this._fontAtlas.imageData.width;\n      const height2 = this._fontAtlas.imageData.height;\n      if (this._fontAtlas.x + texWidth > width2) {\n        this._fontAtlas.x = 0;\n      }\n      let y2 = 0;\n      for (let x2 = this._fontAtlas.x; x2 < this._fontAtlas.x + texWidth; x2++) {\n        y2 = Math.max(y2, this._fontAtlas.top[x2]);\n      }\n      if (y2 + texHeight > height2) {\n        this._core.log.write(LogLevel.warn, `${this._font.name} height overflow`);\n      }\n      for (let x2 = this._fontAtlas.x; x2 < this._fontAtlas.x + texWidth; x2++) {\n        this._fontAtlas.top[x2] = y2 + texHeight;\n      }\n      glyph.u0 = this._fontAtlas.x / width2;\n      glyph.v0 = y2 / height2;\n      glyph.u1 = (this._fontAtlas.x + texWidth) / width2;\n      glyph.v1 = (y2 + texHeight) / height2;\n      this._font.glyphs[char] = glyph;\n      for (let i = 0; i < glyph.distances.length; i++) {\n        const distance2 = glyph.distances[i];\n        const dataX = i % texWidth;\n        const dataY = Math.floor(i / texWidth);\n        const offset2 = (this._fontAtlas.x + dataX + (y2 + dataY) * width2) * 4;\n        this._fontAtlas.imageData.data[offset2 + 0] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 1] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 2] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 3] = 255;\n      }\n      this._fontAtlas.x += texWidth;\n    }\n  }\n  class GlyphRasterizer {\n    constructor(core, options2) {\n      let start = performance.now();\n      this._core = core;\n      this._fontSize = options2.fontSize;\n      this._border = options2.border;\n      this._fontFamily = options2.fontFamily;\n      this._fontWeight = options2.fontWeight;\n      this._fontStyle = options2.fontStyle;\n      this._baseline = options2.baseline;\n      this._maxDistance = options2.maxDistance;\n      this._edgeValue = options2.edgeValue;\n      this._size = this._fontSize + this._border * 2;\n      this._size += this._border * 2;\n      this._gridOuter = new Float64Array(this._size * this._size);\n      this._gridInner = new Float64Array(this._size * this._size);\n      this._f = new Float64Array(this._size);\n      this._z = new Float64Array(this._size + 1);\n      this._v = new Uint16Array(this._size);\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = canvas.height = this._size;\n      this._context = canvas.getContext(\"2d\", { willReadFrequently: true });\n      this._context.font = `${this._fontStyle} ${this._fontWeight} ${this._fontSize}px ${this._fontFamily} `;\n      this._context.textBaseline = this._baseline;\n      this._context.textAlign = \"left\";\n      this._context.fillStyle = \"black\";\n      this._core.log.write(LogLevel.info, `glyph rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n      const textMetrics2 = this._context.measureText(char);\n      const glyphLeft = 0;\n      const glyphTop = Math.floor(textMetrics2.actualBoundingBoxAscent);\n      let glyphWidth = Math.ceil(textMetrics2.actualBoundingBoxRight);\n      let glyphHeight = Math.ceil(textMetrics2.actualBoundingBoxAscent) + Math.ceil(textMetrics2.actualBoundingBoxDescent);\n      glyphWidth = Math.min(this._size - this._border, glyphWidth);\n      glyphHeight = Math.min(this._size - this._border, glyphHeight);\n      const width2 = glyphWidth + 2 * this._border;\n      const height2 = glyphHeight + 2 * this._border;\n      const length2 = width2 * height2;\n      const distances = new Uint8ClampedArray(length2);\n      const gradientsX = new Uint8ClampedArray(length2);\n      const gradientsY = new Uint8ClampedArray(length2);\n      const pixels = new Uint8ClampedArray(length2);\n      const glyph = new Glyph();\n      glyph.char = char;\n      glyph.key = char.codePointAt(0);\n      glyph.distances = distances;\n      glyph.gradientsX = gradientsX;\n      glyph.gradientsY = gradientsY;\n      glyph.pixels = pixels;\n      glyph.width = glyphWidth;\n      glyph.height = glyphHeight;\n      glyph.top = glyphTop;\n      glyph.left = glyphLeft;\n      glyph.advance = textMetrics2.width;\n      if (glyphWidth == 0 || glyphHeight == 0) {\n        return glyph;\n      }\n      this._context.clearRect(this._border, this._border, glyphWidth, glyphHeight);\n      this._context.fillText(char, this._border, this._border + glyphTop);\n      const imgData = this._context.getImageData(this._border, this._border, glyphWidth, glyphHeight);\n      for (let i = 0; i < length2; i++) {\n        this._gridOuter[i] = Number.MAX_VALUE;\n        this._gridInner[i] = 0;\n      }\n      for (let y2 = 0; y2 < glyphHeight; y2++) {\n        for (let x2 = 0; x2 < glyphWidth; x2++) {\n          const a2 = imgData.data[4 * (y2 * glyphWidth + x2) + 3] / 255;\n          if (a2 > 0) {\n            const j = (y2 + this._border) * width2 + x2 + this._border;\n            if (a2 == 1) {\n              this._gridOuter[j] = 0;\n              this._gridInner[j] = Number.MAX_VALUE;\n            } else {\n              const d2 = 0.5 - a2;\n              this._gridOuter[j] = d2 > 0 ? d2 * d2 : 0;\n              this._gridInner[j] = d2 < 0 ? d2 * d2 : 0;\n              pixels[j] = 255;\n            }\n          }\n        }\n      }\n      this._edt(this._gridOuter, 0, 0, width2, height2, width2, this._f, this._v, this._z);\n      this._edt(this._gridInner, this._border, this._border, glyphWidth, glyphHeight, width2, this._f, this._v, this._z);\n      const distances2 = new Float32Array(length2);\n      for (let i = 0; i < length2; i++) {\n        const distance2 = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n        distances[i] = Math.round(this._edgeValue - distance2 * 255 / this._maxDistance);\n        distances2[i] = distance2;\n      }\n      for (let i = 0; i < length2; i++) {\n        const x2 = i % width2;\n        const y2 = Math.floor(i / width2);\n        const d2 = distances2[i];\n        const sign2 = d2 < 0 ? -1 : 1;\n        const x02 = x2 > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n        const x12 = x2 < width2 - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n        const y02 = y2 > 0 ? distances2[i - width2] : Number.MAX_VALUE;\n        const y12 = y2 < height2 - 1 ? distances2[i + width2] : Number.MAX_VALUE;\n        let gradientX = sign2 * x02 < sign2 * x12 ? d2 - x02 : x12 - d2;\n        let gradientY = sign2 * y02 < sign2 * y12 ? y02 - d2 : d2 - y12;\n        gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 255);\n        gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 255);\n      }\n      return glyph;\n    }\n    _edt(data2, x02, y02, width2, height2, gridSize, f, v, z2) {\n      for (let x2 = x02; x2 < x02 + width2; x2++)\n        this._edt1d(data2, y02 * gridSize + x2, gridSize, height2, f, v, z2);\n      for (let y2 = y02; y2 < y02 + height2; y2++)\n        this._edt1d(data2, y2 * gridSize + x02, 1, width2, f, v, z2);\n    }\n    _edt1d(grid2, offset2, stride, n, f, v, z2) {\n      v[0] = 0;\n      z2[0] = -Number.MAX_VALUE;\n      z2[1] = Number.MAX_VALUE;\n      f[0] = grid2[offset2];\n      for (let q = 1, k = 0, s2 = 0; q < n; q++) {\n        f[q] = grid2[offset2 + q * stride];\n        const q2 = q * q;\n        do {\n          const r = v[k];\n          s2 = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n        } while (s2 <= z2[k] && --k > -1);\n        k++;\n        v[k] = q;\n        z2[k] = s2;\n        z2[k + 1] = Number.MAX_VALUE;\n      }\n      for (let q = 0, k = 0; q < n; q++) {\n        while (z2[k + 1] < q) {\n          k++;\n        }\n        const r = v[k];\n        const qr = q - r;\n        grid2[offset2 + q * stride] = f[r] + qr * qr;\n      }\n    }\n  }\n  class ManipulationProcessor {\n    get manipulators() {\n      return this._manipulators;\n    }\n    get count() {\n      return this._count;\n    }\n    get isDragging() {\n      return this._isDragging;\n    }\n    constructor(core) {\n      this._core = core;\n      this._count = 0;\n      this._centroid = create$6();\n      this._previousCentroid = create$6();\n      this._relativePositionToCentroid = create$6();\n      this._directionToCentroid = create$6();\n      this._previousDirectionToCentroid = create$6();\n      this._manipulators = {};\n      this._removedManipulators = [];\n      this.cumulativeTranslation = create$6();\n      this.translationDelta = create$6();\n      this.centroid = create$6();\n      this.maxScale = Number.MAX_VALUE;\n      this.twistAxis = fromValues$3(0, 0, 1);\n      this.initialize();\n    }\n    update(elapsedTime, manipulators) {\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        if (!manipulators[manipulator.id]) {\n          if (this.removeManipulator) {\n            this.removeManipulator(manipulator);\n          }\n          this._removedManipulators.push(manipulator.id);\n        }\n      }\n      if (this._removedManipulators.length > 0) {\n        for (let i = 0; i < this._removedManipulators.length; i++) {\n          delete this._manipulators[this._removedManipulators[i]];\n          this._count--;\n        }\n        this._removedManipulators = [];\n      }\n      for (const key2 in manipulators) {\n        const manipulator = manipulators[key2];\n        if (!this._manipulators[manipulator.id]) {\n          if (!this.addManipulator || this.addManipulator(manipulator)) {\n            copy$6(manipulator.initialPosition, manipulator.position);\n            this._manipulators[manipulator.id] = manipulator;\n            this._count++;\n          }\n        }\n      }\n      set$8(this.translationDelta, 0, 0, 0);\n      this.scaleDelta = 0;\n      this.twistDelta = 0;\n      if (this._count > 0) {\n        if (this._previousCount > 0) {\n          if (this.prepareManipulation) {\n            this.prepareManipulation();\n          }\n          this._process();\n          if (this.processManipulation) {\n            this.processManipulation(elapsedTime);\n          }\n        } else {\n          this.initialize();\n          if (this.beginManipulation) {\n            this.beginManipulation();\n          }\n        }\n      } else {\n        if (this._previousCount > 0) {\n          if (this.endManipulation) {\n            this.endManipulation();\n          }\n        }\n      }\n      this._isDragging = this._count == 1 && squaredLength(this.cumulativeTranslation) > this._core.config.dragToleranceSquared || this._count > 1;\n      this._previousCount = this._count;\n    }\n    initialize() {\n      set$8(this.centroid, 0, 0, 0);\n      set$8(this.cumulativeTranslation, 0, 0, 0);\n      this.cumulativeScale = 1;\n      this.cumulativeTwist = 0;\n    }\n    _process() {\n      if (this._previousCount > 0) {\n        let persisted = 0;\n        for (const key2 in this._manipulators) {\n          const manipulator = this._manipulators[key2];\n          if (manipulator.isPersisted) {\n            persisted++;\n          }\n        }\n        const removed = this._previousCount - persisted;\n        if (persisted > 0) {\n          if (removed > 0) {\n            copy$6(this._centroid, this._previousCentroid);\n          } else {\n            set$8(this._centroid, 0, 0, 0);\n            for (const key2 in this._manipulators) {\n              const manipulator = this._manipulators[key2];\n              if (manipulator.isPersisted) {\n                add$4(this._centroid, this._centroid, manipulator.position);\n              }\n            }\n            scale$5(this._centroid, this._centroid, 1 / persisted);\n          }\n          for (const key2 in this._manipulators) {\n            const manipulator = this._manipulators[key2];\n            if (manipulator.isPersisted) {\n              manipulator.maxTranslationSquared = Math.max(manipulator.maxTranslationSquared, squaredDistance(manipulator.position, manipulator.initialPosition));\n              add$4(this.translationDelta, this.translationDelta, manipulator.position);\n              subtract(this.translationDelta, this.translationDelta, manipulator.previousPosition);\n              subtract(this._relativePositionToCentroid, manipulator.position, this._centroid);\n              const distanceToCentroidSquared = squaredLength(this._relativePositionToCentroid);\n              if (distanceToCentroidSquared < this._core.config.manipulatorMinRelativeDistanceSquared) {\n                this.scaleDelta += 1;\n              } else {\n                const distanceToCentroid = Math.sqrt(distanceToCentroidSquared);\n                const previousDistanceToCentroidSquared = squaredLength(manipulator.previousPositionRelativeToCentroid);\n                const previousDistanceToCentroid = Math.sqrt(previousDistanceToCentroidSquared);\n                this.scaleDelta += distanceToCentroid / previousDistanceToCentroid;\n                scale$5(this._directionToCentroid, this._relativePositionToCentroid, 1 / distanceToCentroid);\n                scale$5(this._previousDirectionToCentroid, manipulator.previousPositionRelativeToCentroid, 1 / previousDistanceToCentroid);\n                this.twistDelta += AngleHelper.signedAngleBetweenVectors(this._previousDirectionToCentroid, this._directionToCentroid, this.twistAxis);\n              }\n            }\n          }\n          scale$5(this.translationDelta, this.translationDelta, 1 / persisted);\n          add$4(this.cumulativeTranslation, this.cumulativeTranslation, this.translationDelta);\n          this.scaleDelta /= persisted;\n          this.cumulativeScale = MathHelper.clamp(this.cumulativeScale * this.scaleDelta, this.minScale, this.maxScale);\n          this.scaleDelta -= 1;\n          this.twistDelta /= persisted;\n          this.cumulativeTwist += this.twistDelta;\n        }\n      }\n      set$8(this.centroid, 0, 0, 0);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        add$4(this.centroid, this.centroid, manipulator.position);\n      }\n      scale$5(this.centroid, this.centroid, 1 / this._count);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        subtract(manipulator.positionRelativeToCentroid, manipulator.position, this.centroid);\n      }\n      copy$6(this._previousCentroid, this.centroid);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        manipulator.isPersisted = true;\n        copy$6(manipulator.previousPosition, manipulator.position);\n        copy$6(manipulator.previousRotationAxis, manipulator.rotationAxis);\n        copy$6(manipulator.previousPositionRelativeToCentroid, manipulator.positionRelativeToCentroid);\n      }\n    }\n  }\n  class MouseWheel {\n    constructor(core) {\n      this._core = core;\n      this._previousTotal = 0;\n      this.total = 0;\n    }\n    initialize(element2) {\n      element2.addEventListener(\"wheel\", (e) => {\n        e.preventDefault();\n        const wheelEvent = e;\n        this.total += wheelEvent.deltaY;\n      }, { passive: false });\n    }\n    update(elapsedTime) {\n      const total = this.total;\n      this.delta = total - this._previousTotal;\n      this._previousTotal = total;\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`mse whl ${this.total < 0 ? \"\" : \" \"}${Math.round(this.total)}`);\n      }\n    }\n  }\n  class Manipulator {\n    constructor() {\n      this.pickedIndex = 0;\n      this.maxTranslationSquared = 0;\n      this.initialPosition = create$6();\n      this.position = create$6();\n      this.previousPosition = create$6();\n      this.holdOrigin = create$6();\n      this.positionRelativeToCentroid = create$6();\n      this.previousPositionRelativeToCentroid = create$6();\n      this.rotationAxis = create$6();\n      this.previousRotationAxis = create$6();\n    }\n  }\n  class Pointers {\n    get hoverX() {\n      return this._hoverX;\n    }\n    get hoverY() {\n      return this._hoverY;\n    }\n    get hoverId() {\n      return this._hoverId;\n    }\n    constructor(core, manipulators) {\n      this._core = core;\n      this._manipulators = manipulators;\n    }\n    initialize(element2) {\n      this._element = element2;\n      element2.addEventListener(\"pointerdown\", (e) => this._handlePointerDown(e), { passive: true });\n      element2.addEventListener(\"pointermove\", (e) => this._handlePointerMove(e), { passive: true });\n      element2.addEventListener(\"pointerup\", (e) => this._handlePointerUp(e), { passive: true });\n      element2.addEventListener(\"pointercancel\", (e) => this._handlePointerCancel(e), { passive: true });\n      element2.addEventListener(\"pointerleave\", (e) => this._handlePointerLeave(e), { passive: true });\n      element2.addEventListener(\"pointerout\", (e) => this._handlePointerOut(e), { passive: true });\n    }\n    update(elapsedTime) {\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`pen rot  ${(this._tiltX | 0).toFixed(3)},${(this._tiltY | 0).toFixed(3)},${(this._twist | 0).toFixed(3)}`);\n        this._core.debugText.addLine(`hov pos  ${this.hoverX ? `${this.hoverX.toFixed(3)},${this.hoverY.toFixed(3)}px` : \"\"}`);\n      }\n    }\n    _handlePointerDown(e) {\n      this._element.focus();\n      const devicePixelRatio2 = this._core.renderer.devicePixelRatio;\n      const manipulator = new Manipulator();\n      const id2 = e.pointerId;\n      const x2 = e.offsetX * devicePixelRatio2;\n      const y2 = e.offsetY * devicePixelRatio2;\n      manipulator.id = id2;\n      manipulator.position[0] = x2;\n      manipulator.position[1] = y2;\n      manipulator.type = e.pointerType;\n      manipulator.button = e.button;\n      manipulator.shiftKey = e.shiftKey;\n      manipulator.ctrlKey = e.ctrlKey;\n      manipulator.altKey = e.altKey;\n      manipulator.event = e;\n      this._manipulators[id2] = manipulator;\n      this._hoverId = id2;\n      this._hoverX = x2;\n      this._hoverY = y2;\n    }\n    _handlePointerMove(e) {\n      const devicePixelRatio2 = this._core.renderer.devicePixelRatio;\n      const x2 = e.offsetX * devicePixelRatio2;\n      const y2 = e.offsetY * devicePixelRatio2;\n      const id2 = e.pointerId;\n      const manipulator = this._manipulators[id2];\n      if (manipulator) {\n        manipulator.position[0] = x2;\n        manipulator.position[1] = y2;\n        manipulator.event = e;\n      }\n      switch (e.pointerType) {\n        case \"mouse\":\n          this._hoverId = id2;\n          this._hoverX = x2;\n          this._hoverY = y2;\n          break;\n        case \"pen\":\n          this._hoverId = id2;\n          this._hoverX = x2;\n          this._hoverY = y2;\n          this._tiltX = e.tiltX;\n          this._tiltY = e.tiltY;\n          this._twist = e.twist;\n          break;\n      }\n    }\n    _handlePointerUp(e) {\n      const manipulator = this._manipulators[e.pointerId];\n      if (manipulator) {\n        manipulator.event = e;\n      }\n      this._remove(e.pointerId);\n    }\n    _handlePointerCancel(e) {\n      this._remove(e.pointerId);\n    }\n    _handlePointerLeave(e) {\n      this._resetHover();\n      this._remove(e.pointerId);\n    }\n    _handlePointerOut(e) {\n      this._resetHover();\n      this._remove(e.pointerId);\n    }\n    _resetHover() {\n      this._hoverId = null;\n      this._hoverX = null;\n      this._hoverY = null;\n    }\n    _remove(pointerId) {\n      const manipulator = this._manipulators[pointerId];\n      if (manipulator) {\n        delete this._manipulators[pointerId];\n      }\n    }\n  }\n  class AnimationHelper {\n    static smoothStep(value2) {\n      return value2 * value2 * (3 - 2 * value2);\n    }\n    static damp(value2, target2, threshold2, dampening) {\n      if (Math.abs(target2) < threshold2) {\n        return MathHelper.lerp(value2, 0, dampening);\n      } else {\n        return MathHelper.lerp(value2, target2, dampening);\n      }\n    }\n  }\n  class Keyboard {\n    constructor(core) {\n      this._core = core;\n      this._pressedKeys = /* @__PURE__ */ new Set();\n      this._previousPressedKeys = /* @__PURE__ */ new Set();\n    }\n    initialize(element2) {\n      element2.addEventListener(\"keydown\", (e) => {\n        this._handleKeyDown(e);\n      }, false);\n      element2.addEventListener(\"keyup\", (e) => {\n        this._handleKeyUp(e);\n      }, false);\n    }\n    update(elapsedTime) {\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`key tot  ${this._pressedKeys.size}`);\n      }\n    }\n    isKeyDown(key2) {\n      return this._pressedKeys.has(key2);\n    }\n    wasKeyReleased(key2) {\n      if (this._pressedKeys.has(key2)) {\n        if (!this._previousPressedKeys.has(key2)) {\n          this._previousPressedKeys.add(key2);\n          return true;\n        }\n      } else {\n        this._previousPressedKeys.delete(key2);\n      }\n      return false;\n    }\n    _handleKeyDown(e) {\n      const keyboardEvent = e;\n      const key2 = keyboardEvent.key;\n      if (!this._pressedKeys.has(key2)) {\n        this._pressedKeys.add(key2);\n      }\n    }\n    _handleKeyUp(e) {\n      const keyboardEvent = e;\n      const key2 = keyboardEvent.key;\n      if (this._pressedKeys.has(key2)) {\n        this._pressedKeys.delete(key2);\n      }\n    }\n  }\n  class Manager {\n    constructor(core) {\n      this._manipulators = {};\n      this._core = core;\n      this._vec3 = create$6();\n      this._manipulationProcessor = new ManipulationProcessor(core);\n      this._manipulators = {};\n      this._pointers = new Pointers(core, this._manipulators);\n      this._pointers.initialize(core.container);\n      this._mouseWheel = new MouseWheel(core);\n      this._mouseWheel.initialize(core.container);\n      this._keyboard = new Keyboard(core);\n      this._keyboard.initialize(core.container);\n      this.isPickingEnabled = true;\n      this.mouseWheelZoomScale = this._core.config.mouseWheelZoomScale;\n      this.mouseWheelRotationScale = this._core.config.mouseWheelRotationScale;\n      this.multiTouchZoomScale = this._core.config.multiTouchZoomScale;\n      this.pickHoldDelay = this._core.config.pickHoldDelay;\n      this.pickSelectDelay = this._core.config.pickSelectDelay;\n      const rightButton2 = 2;\n      this.singleTouchAction = (manipulator) => {\n        if (manipulator.type == \"mouse\" && manipulator.button == rightButton2 || manipulator.shiftKey || manipulator.ctrlKey) {\n          return SingleTouchAction.translate;\n        } else if (manipulator.altKey || manipulator.type == \"pen\" && manipulator.button == rightButton2) {\n          return SingleTouchAction.lasso;\n        } else {\n          return SingleTouchAction.rotate;\n        }\n      };\n      this.mouseWheelAction = (keyboard) => {\n        if (this._keyboard.isKeyDown(\"Control\")) {\n          return MouseWheelAction.rotateY;\n        } else {\n          return MouseWheelAction.zoom;\n        }\n      };\n      this.lassoPickType = PickType.data;\n      this._thumbstickX = 0;\n      this._previousControllerButtonPressed = [false, false, false, false];\n      this._quat0 = create$4();\n      this._quat1 = create$4();\n    }\n    update(elapsedTime, xrFrame) {\n      if (xrFrame) {\n        const inputSources = this._core.webXRSession.inputSources;\n        if (inputSources.length > 0 && this._core.renderer.controllers.length > 0) {\n          const inputSource = inputSources[0];\n          const controllerVisual = this._core.renderer.controllers[0];\n          if (inputSource.gripSpace && inputSource.targetRayMode == \"tracked-pointer\") {\n            const gripPose = xrFrame.getPose(inputSource.gripSpace, this._core.renderer.webXRReferenceSpace);\n            if (gripPose) {\n              controllerVisual.mMatrix = gripPose.transform.matrix;\n            }\n            const gamepad = inputSource.gamepad;\n            this._core.renderer.isPickingEnabled = false;\n            const rayPose = xrFrame.getPose(inputSource.targetRaySpace, this._core.renderer.webXRReferenceSpace);\n            if (rayPose) {\n              controllerVisual.rayMMatrix = rayPose.transform.matrix;\n              if (gamepad.buttons[0].value > 0 && this.isPickingEnabled) {\n                this._core.renderer.pickVMatrix = rayPose.transform.inverse.matrix;\n                this._core.renderer.isPickingEnabled = true;\n              }\n            }\n            const threshold2 = 0.2;\n            const dampening = Math.min(0.015 * elapsedTime, 1);\n            this._thumbstickX = AnimationHelper.damp(this._thumbstickX, gamepad.axes[2], threshold2, dampening);\n            if (this._thumbstickX != 0) {\n              setAxisAngle(this._quat0, Constants$1.VECTOR3_UNITY, 0.01 * this._thumbstickX * elapsedTime);\n              this._core.getModelRotation(this._quat1);\n              multiply(this._quat1, this._quat0, this._quat1);\n              this._core.setModelRotation(this._quat1, true);\n            }\n            if (gamepad.buttons[2].pressed) {\n              if (!this._previousControllerButtonPressed[2]) {\n                this._previousControllerButtonPressed[2] = true;\n                if (this.controllerButtonPressedCallback) {\n                  this.controllerButtonPressedCallback(2);\n                }\n              }\n            } else {\n              this._previousControllerButtonPressed[2] = false;\n            }\n          }\n        }\n      } else {\n        const camera = this._core.camera;\n        this._manipulationProcessor.update(elapsedTime, this._manipulators);\n        this._pointers.update(elapsedTime);\n        this._mouseWheel.update(elapsedTime);\n        this._keyboard.update(elapsedTime);\n        if (this._mouseWheel.delta != 0) {\n          switch (this.mouseWheelAction(this._keyboard)) {\n            case MouseWheelAction.zoom:\n              if (this._pointers.hoverX, this._pointers.hoverY) {\n                camera.zoom(this._mouseWheel.delta * this.mouseWheelZoomScale, this._pointers.hoverX, this._pointers.hoverY);\n              }\n              break;\n            case MouseWheelAction.rotateY:\n              setAxisAngle(this._quat0, Constants$1.VECTOR3_UNITY, this._mouseWheel.delta * this.mouseWheelRotationScale);\n              camera.getOrbit(this._quat1);\n              multiply(this._quat1, this._quat1, this._quat0);\n              camera.setOrbit(this._quat1, true);\n              break;\n          }\n        }\n        const count2 = this._manipulationProcessor.count;\n        if (count2 == 0) {\n          if (this._isLassoPicking) {\n            this._isLassoPicking = false;\n            this._core.renderer.isLassoPicking = false;\n            const x02 = Math.min(this._lassoX0, this._lassoX1);\n            const y02 = Math.min(this._lassoY0, this._lassoY1);\n            const x12 = Math.max(this._lassoX0, this._lassoX1);\n            const y12 = Math.max(this._lassoY0, this._lassoY1);\n            if (x12 - x02 > 0 && y12 - y02 > 0) {\n              const sets = this._core.pickLasso(x02, y02, x12, y12, this.lassoPickType);\n              const result = {\n                x0: x02,\n                y0: y02,\n                x1: x12,\n                y1: y12,\n                pickType: this.lassoPickType,\n                ids: sets,\n                manipulator: this._manipulator\n              };\n              this.pickLassoCallback(result);\n            }\n          }\n        } else if (count2 == 1) {\n          const translationDelta = this._manipulationProcessor.translationDelta;\n          if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n            const manipulators = this._manipulationProcessor.manipulators;\n            for (const key2 in manipulators) {\n              const manipulator = manipulators[key2];\n              switch (this.singleTouchAction(manipulator)) {\n                case SingleTouchAction.rotate:\n                  camera.rotate(translationDelta);\n                  break;\n                case SingleTouchAction.translate:\n                  camera.translate(translationDelta);\n                  break;\n                case SingleTouchAction.lasso:\n                  if (this.pickLassoCallback) {\n                    if (!this._isLassoPicking) {\n                      this._isLassoPicking = true;\n                      this._core.renderer.isLassoPicking = true;\n                      this._lassoX0 = manipulator.position[0];\n                      this._lassoY0 = manipulator.position[1];\n                    }\n                    this._lassoX1 = manipulator.position[0];\n                    this._lassoY1 = manipulator.position[1];\n                    this._core.renderer.lassoX0 = Math.min(this._lassoX0, this._lassoX1);\n                    this._core.renderer.lassoY0 = Math.min(this._lassoY0, this._lassoY1);\n                    this._core.renderer.lassoX1 = Math.max(this._lassoX0, this._lassoX1);\n                    this._core.renderer.lassoY1 = Math.max(this._lassoY0, this._lassoY1);\n                  }\n                  break;\n              }\n              break;\n            }\n          }\n        } else {\n          const translationDelta = this._manipulationProcessor.translationDelta;\n          const camera2 = this._core.camera;\n          if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n            camera2.translate(translationDelta);\n          }\n          if (this._manipulationProcessor.scaleDelta != 0) {\n            const distance2 = this._manipulationProcessor.scaleDelta * this.multiTouchZoomScale;\n            camera2.zoom(distance2, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n          }\n          if (this._manipulationProcessor.twistDelta != 0) {\n            camera2.twist(this._manipulationProcessor.twistDelta, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n          }\n        }\n        if (this.isPickingEnabled && !this._manipulationProcessor.isDragging && !this._isLassoPicking) {\n          const camera2 = this._core.camera;\n          const renderer = this._core.renderer;\n          if (renderer.isCapturingPickImage) {\n            camera2.updatePickVMatrix(renderer.width / 2, renderer.height / 2);\n            renderer.pickVMatrix = camera2.pickVMatrix;\n            renderer.isPickingEnabled = true;\n            this._pickedTime = 0;\n          } else if (this._pointers.hoverId > -1) {\n            const pickingX = this._pointers.hoverX;\n            const pickingY = this._pointers.hoverY;\n            camera2.updatePickVMatrix(pickingX, pickingY);\n            renderer.pickVMatrix = camera2.pickVMatrix;\n            renderer.isPickingEnabled = true;\n            if (this._pickedId != renderer.pickedId) {\n              this._pickedId = renderer.pickedId;\n              this._pickedTime = 0;\n            } else {\n              if (this._manipulationProcessor.count == 1) {\n                this._pickedTime += elapsedTime;\n                for (const key2 in this._manipulators) {\n                  this._manipulator = this._manipulators[key2];\n                  break;\n                }\n              }\n            }\n            if (this._pickedTime > 0) {\n              switch (renderer.pickedType) {\n                case PickType.data:\n                  if (this._pickedTime > this.pickHoldDelay) {\n                    renderer.getVertexPosition(this._vec3, this._pickedId);\n                    this._core.setModelManipulationOrigin(this._vec3);\n                    this._pickedTime = 0;\n                  } else if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.transitionBuffers.length; i++) {\n                        const transitionBuffer = renderer.transitionBuffers[i];\n                        const id2 = transitionBuffer.pickIdLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = {\n                            transitionBuffer: i,\n                            id: id2,\n                            manipulator: this._manipulator\n                          };\n                          this._core.log.write(LogLevel.info, `picked id ${result.id}, transition buffer ${i}`);\n                          if (this.pickItemCallback) {\n                            this.pickItemCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.label:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.labelSets.length; i++) {\n                        const labelSet = renderer.labelSets[i].label;\n                        const id2 = labelSet.pickIdLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = {\n                            label: id2,\n                            set: i,\n                            manipulator: this._manipulator\n                          };\n                          this._core.log.write(LogLevel.info, `picked label ${result.label}, set ${result.set}`);\n                          if (this.pickLabelSetCallback) {\n                            this.pickLabelSetCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesDivision:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickGridLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickGrid(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked division (${result.divisionX}, ${result.divisionY}, ${result.divisionZ}), axes ${result.axes}`);\n                          if (this.pickAxesGridCallback) {\n                            this.pickAxesGridCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesTitle:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickTitleLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickTitle(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked title ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesTitleCallback) {\n                            this.pickAxesTitleCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesLabel:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickLabelLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickLabel(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked label ${result.label}, axis ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesLabelCallback) {\n                            this.pickAxesLabelCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesHeading:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickHeadingLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickHeading(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked heading ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesHeadingCallback) {\n                            this.pickAxesHeadingCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n              }\n            }\n          } else {\n            renderer.isPickingEnabled = false;\n            this._pickedTime = 0;\n          }\n        } else {\n          this._core.renderer.isPickingEnabled = false;\n          this._pickedTime = 0;\n        }\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`man tot  ${this._manipulationProcessor.count}`);\n        this._core.debugText.addLine(`pck key  ${this._core.renderer.pickedId}`);\n      }\n    }\n  }\n  let Log$1 = class Log {\n    constructor(core) {\n      this._core = core;\n    }\n    write(level, value2) {\n      if (level >= this._core.config.logLevel) {\n        switch (level) {\n          case LogLevel.trace:\n            console.trace(value2);\n            break;\n          case LogLevel.debug:\n            console.debug(value2);\n            break;\n          case LogLevel.info:\n            console.info(value2);\n            break;\n          case LogLevel.warn:\n            console.warn(value2);\n            break;\n          case LogLevel.error:\n            console.error(value2);\n            break;\n        }\n      }\n    }\n  };\n  var __awaiter$4 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class Core {\n    get container() {\n      return this._container;\n    }\n    get started() {\n      return this._started;\n    }\n    get debugText() {\n      return this._debugText;\n    }\n    get log() {\n      return this._log;\n    }\n    get totalFrames() {\n      return this._fps.totalFrames;\n    }\n    get camera() {\n      return this._camera;\n    }\n    set camera(value2) {\n      this._camera = value2;\n    }\n    getModelRotation(value2) {\n      copy$4(value2, this._modelRotation);\n    }\n    setModelRotation(value2, isSmooth) {\n      copy$4(this._modelRotation, value2);\n      if (!isSmooth) {\n        copy$4(this._smoothedModelRotation, this._modelRotation);\n      }\n    }\n    getModelScale() {\n      return this._modelScale[0];\n    }\n    setModelScale(value2, isSmooth) {\n      set$8(this._modelScale, value2, value2, value2);\n      if (!isSmooth) {\n        copy$6(this._smoothedModelScale, this._modelScale);\n      }\n    }\n    getModelManipulationOrigin(value2) {\n      copy$6(value2, this._modelManipulationOrigin);\n    }\n    setModelManipulationOrigin(value2) {\n      this._updateManipulationOrigin(value2);\n    }\n    getModelPosition(value2) {\n      copy$6(value2, this._modelPosition);\n    }\n    setModelPosition(value2, isSmooth) {\n      copy$6(this._modelPosition, value2);\n      if (!isSmooth) {\n        copy$6(this._smoothedModelPosition, this._modelPosition);\n      }\n    }\n    get webXRSession() {\n      return this._webXRSession;\n    }\n    get renderer() {\n      return this._renderer;\n    }\n    set renderer(renderer) {\n      if (this._renderer == renderer) {\n        return;\n      }\n      if (this._renderer) {\n        this.stop();\n        this._renderer.remove();\n      }\n      if (!renderer.isInitialized) {\n        renderer.initialize(this);\n      }\n      if (this._renderer) {\n        renderer.transitionTime = this._renderer.transitionTime;\n        for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n          const previousTransitionBuffer = this._renderer.transitionBuffers[i];\n          const transitionBuffer = renderer.createTransitionBuffer(previousTransitionBuffer.currentBuffer.ids);\n          transitionBuffer.copyFrom(previousTransitionBuffer);\n          renderer.transitionBuffers.push(transitionBuffer);\n        }\n        const currentAxes = this._renderer.currentAxes;\n        if (currentAxes) {\n          renderer.currentAxes = [];\n          for (let i = 0; i < currentAxes.length; i++) {\n            const axesVisual = currentAxes[i];\n            const axes = axesVisual.axes;\n            if (axes instanceof Cartesian3dAxes) {\n              const cartesian3dAxesVisual = renderer.createCartesian3dAxesVisual(axes);\n              renderer.currentAxes.push(cartesian3dAxesVisual);\n            } else if (axes instanceof Cartesian2dAxes) {\n              renderer.currentAxes.push(renderer.createCartesian2dAxesVisual(axes));\n            }\n          }\n        }\n        const labelSets = this._renderer.labelSets;\n        if (labelSets) {\n          renderer.labelSets = [];\n          for (let i = 0; i < labelSets.length; i++) {\n            renderer.labelSets.push(renderer.createLabelSetVisual(labelSets[i].label));\n          }\n        }\n        const images = this._renderer.images;\n        if (images) {\n          renderer.images = [];\n          for (let i = 0; i < images.length; i++) {\n            renderer.images.push(renderer.createImageVisual(images[i].image));\n          }\n        }\n        const fonts = this._renderer.fonts;\n        if (fonts) {\n          for (const key2 in fonts) {\n            const font2 = fonts[key2].font;\n            renderer.fonts[font2.name] = renderer.createFontVisual(font2);\n          }\n        }\n      } else {\n        renderer.fonts[this._font.name] = renderer.createFontVisual(this._font);\n      }\n      if (this._renderer) {\n        this._renderer.finalize();\n      }\n      this._renderer = renderer;\n      this._fps.reset();\n      this.start();\n    }\n    get font() {\n      return this._font;\n    }\n    get paletteResources() {\n      return this._paletteResources;\n    }\n    get config() {\n      return this._config;\n    }\n    get inputManager() {\n      return this._inputManager;\n    }\n    constructor(options2) {\n      setMatrixArrayType(Array);\n      this._vec3 = create$6();\n      this._quat = create$4();\n      this._mat4 = create$7();\n      this._container = options2 && options2.container ? options2.container : document.body;\n      this._config = new Config$2(this);\n      this._log = new Log$1(this);\n      this._debugText = new DebugText();\n      this._inputManager = options2 && options2.useInputManager === false ? null : new Manager(this);\n      const fontRasterizerOptions = options2 && options2.fontRasterizerOptions ? options2.fontRasterizerOptions : {\n        fontAtlas: new FontAtlas(256, 512),\n        fontSize: 24,\n        border: 3,\n        fontFamily: '\"segoe ui semibold\", sans-serif',\n        fontWeight: \"normal\",\n        fontStyle: \"normal\",\n        baseline: \"alphabetic\",\n        maxDistance: 8,\n        edgeValue: 192\n      };\n      const fontRasterizer = new FontRasterizer(this, fontRasterizerOptions);\n      this._font = fontRasterizer.font;\n      this._paletteResources = new PaletteResources();\n      this._previousTime = 0;\n      this._fps = new Fps(this);\n      this._modelMMatrix = create$7();\n      this._modelPosition = create$6();\n      this._modelRotation = create$4();\n      this._modelScale = create$6();\n      this._smoothedModelPosition = create$6();\n      this._smoothedModelRotation = create$4();\n      this._smoothedModelScale = create$6();\n      this._modelManipulationOrigin = create$6();\n      this._camera = new AltAzimuthCamera(this);\n      this.resetModel(false);\n    }\n    getView(view) {\n      this.getModelPosition(view.position);\n      this.getModelRotation(view.rotation);\n      view.scale = this.getModelScale();\n    }\n    setView(view, isSmooth) {\n      this.setModelPosition(view.position, isSmooth);\n      this.setModelRotation(view.rotation, isSmooth);\n      this.setModelScale(view.scale, isSmooth);\n    }\n    lerpView(from, to, time2) {\n      lerp$1(this._vec3, from.position, to.position, time2);\n      this.setModelPosition(this._vec3, false);\n      slerp(this._quat, from.rotation, to.rotation, time2);\n      this.setModelRotation(this._quat, false);\n      this.setModelScale(MathHelper.lerp(from.scale, to.scale, time2), false);\n    }\n    resetModel(isSmooth) {\n      set$8(this._modelPosition, 0, 0, -this._config.modelDistance);\n      set$8(this._modelScale, this._config.modelSize, this._config.modelSize, this._config.modelSize);\n      set$6(this._modelRotation, 0, 0, 0, 1);\n      if (!isSmooth) {\n        this._syncSmooth();\n      }\n    }\n    resetManipulationOrigin() {\n      if (!exactEquals$1(this._modelManipulationOrigin, Constants$1.VECTOR3_ZERO)) {\n        this._updateManipulationOrigin(Constants$1.VECTOR3_ZERO);\n      }\n    }\n    reset(isSmooth) {\n      this.resetModel(isSmooth);\n      this.resetManipulationOrigin();\n      this._camera.reset(isSmooth);\n    }\n    start() {\n      if (!this._started && this._renderer) {\n        this._windowAnimationFrame = window.requestAnimationFrame((currentTime) => this._tick(currentTime));\n        this._started = true;\n        this._log.write(LogLevel.info, \"render loop started\");\n        if (this.startCallback) {\n          this.startCallback();\n        }\n      }\n    }\n    stop() {\n      if (this._started) {\n        this._started = false;\n        if (this._windowAnimationFrame != null) {\n          window.cancelAnimationFrame(this._windowAnimationFrame);\n          this._windowAnimationFrame = null;\n          this._log.write(LogLevel.info, \"render loop stopped\");\n        }\n        if (this.stopCallback) {\n          this.stopCallback();\n        }\n      }\n    }\n    checkWebXRSupport() {\n      const xrSystem = navigator.xr;\n      if (xrSystem) {\n        xrSystem.isSessionSupported(\"immersive-vr\").then((supported) => {\n          if (supported) {\n            this._log.write(LogLevel.info, \"WebXR supported\");\n            if (this.webXRSupportedCallback) {\n              this.webXRSupportedCallback();\n            }\n          }\n        });\n      }\n    }\n    requestWebXRSession() {\n      if (this._webXRSession) {\n        this._webXRSession.end();\n      } else {\n        navigator.xr.requestSession(\"immersive-vr\").then((session) => this._webXRSessionStarted(session));\n      }\n    }\n    _webXRSessionStarted(session) {\n      if (this.webXRSessionStartedCallback) {\n        this.webXRSessionStartedCallback();\n      }\n      this._webXRSession = session;\n      session.onend = () => this._webXRSessionEnded();\n      this._renderer.initializeWebXR(session).then(() => {\n        if (this._windowAnimationFrame) {\n          window.cancelAnimationFrame(this._windowAnimationFrame);\n          this._windowAnimationFrame = null;\n        }\n        session.requestAnimationFrame((currentTime, xrframe) => this._tick(currentTime, xrframe));\n      });\n      session.oninputsourceschange = (event2) => this._webXRInputSourcesChanged(event2);\n    }\n    _webXRSessionEnded() {\n      if (this.webXRSessionEndedCallback) {\n        this.webXRSessionEndedCallback();\n      }\n      this._webXRSession = null;\n      this._renderer.controllers.length = 0;\n      this.start();\n    }\n    _webXRInputSourcesChanged(event2) {\n      if (event2.added.length > 0) {\n        const added = event2.added[0];\n        if (added.targetRayMode == \"tracked-pointer\") {\n          const profiles = added.profiles;\n          const handedness = added.handedness;\n          if (this.webXRInputSourceRequestCallback) {\n            this.webXRInputSourceRequestCallback(profiles, handedness, (response) => {\n              const options2 = {\n                profiles,\n                handedness,\n                obj: response.obj,\n                texture: response.texture\n              };\n              const controller = new Controller(this, options2);\n              this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n            }, (e) => {\n              this._log.write(LogLevel.error, e);\n            });\n          } else {\n            const options2 = {};\n            const controller = new Controller(this, options2);\n            this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n          }\n        }\n      }\n      if (event2.removed.length > 0) {\n        this.renderer.controllers.length = 0;\n      }\n    }\n    _tick(currentTime, xrFrame) {\n      return __awaiter$4(this, void 0, void 0, function* () {\n        let elapsedTime = currentTime - this._previousTime;\n        this._previousTime = currentTime;\n        if (elapsedTime > 0) {\n          this.update(elapsedTime, xrFrame);\n          yield this.render(elapsedTime, xrFrame);\n        }\n        if (xrFrame) {\n          xrFrame.session.requestAnimationFrame((currentTime2, xrframe) => this._tick(currentTime2, xrframe));\n        } else if (this._started) {\n          this._windowAnimationFrame = window.requestAnimationFrame((currentTime2) => this._tick(currentTime2));\n        }\n      });\n    }\n    update(elapsedTime, xrFrame) {\n      this._renderer.setSize(elapsedTime);\n      if (this.updateCallback) {\n        this.updateCallback(elapsedTime, xrFrame);\n      }\n      if (this._config.isDebugVisible) {\n        this._debugText.clear();\n      }\n      this._fps.update(elapsedTime);\n      if (this._inputManager) {\n        this._inputManager.isPickingEnabled = this._config.isTransitionPickingEnabled || this._renderer.transitionTime == 1;\n        this._inputManager.update(elapsedTime, xrFrame);\n      }\n      let amount = Math.min(elapsedTime * this._config.positionSmoothing, 1);\n      lerp$1(this._smoothedModelPosition, this._smoothedModelPosition, this._modelPosition, amount);\n      amount = Math.min(elapsedTime * this._config.rotationSmoothing, 1);\n      slerp(this._smoothedModelRotation, this._smoothedModelRotation, this._modelRotation, amount);\n      amount = Math.min(elapsedTime * this._config.scaleSmoothing, 1);\n      lerp$1(this._smoothedModelScale, this._smoothedModelScale, this._modelScale, amount);\n      fromRotationTranslationScaleOrigin(this._modelMMatrix, this._smoothedModelRotation, this._smoothedModelPosition, this._smoothedModelScale, this._modelManipulationOrigin);\n      this._renderer.mMatrix = this._modelMMatrix;\n      if (this._config.isDebugVisible) {\n        this._debugText.addLine(`mod pos ${this._smoothedModelPosition[0] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[0].toFixed(3)},${this._smoothedModelPosition[1] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[1].toFixed(3)},${this._smoothedModelPosition[2] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[2].toFixed(3)}`);\n        this._debugText.addLine(`mod rot ${this._smoothedModelRotation[0] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[0].toFixed(3)},${this._smoothedModelRotation[1] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[1].toFixed(3)},${this._smoothedModelRotation[2] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[2].toFixed(3)},${this._smoothedModelRotation[3] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[3].toFixed(3)}`);\n        this._debugText.addLine(`mod siz  ${this._smoothedModelScale[0].toFixed(3)}`);\n        this._debugText.addLine(`man ori ${this._modelManipulationOrigin[0] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[0].toFixed(3)},${this._modelManipulationOrigin[1] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[1].toFixed(3)},${this._modelManipulationOrigin[2] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[2].toFixed(3)}`);\n        this._debugText.addLine(`scr dst  ${this._config.screenDistance.toFixed(3)}`);\n        this._debugText.addLine(`cam fov  ${Math.round(AngleHelper.radiansToDegrees(this._config.fov))}`);\n        this._debugText.addLine(`tbf tot  ${this._renderer.transitionBuffers.length}`);\n      }\n      if (!xrFrame) {\n        this._camera.width = this._renderer.width;\n        this._camera.height = this._renderer.height;\n        this._camera.modelMMatrix = this._modelMMatrix;\n        this._camera.modelPosition = this._smoothedModelPosition;\n        this._camera.modelRotation = this._smoothedModelRotation;\n        this._camera.modelScale = this._smoothedModelScale;\n        this._camera.modelManipulationOrigin = this._modelManipulationOrigin;\n        this._camera.update(elapsedTime);\n        this._renderer.vMatrices = this._camera.vMatrices;\n        this._renderer.mvMatrices = this._camera.mvMatrices;\n        this._renderer.pMatrices = this._camera.pMatrices;\n        this._renderer.inverseVMatrices = this._camera.inverseVMatrices;\n        this._renderer.inversePMatrices = this._camera.inversePMatrices;\n      }\n      this._renderer.prepare(xrFrame);\n      if (!xrFrame && this._config.stereoMode == StereoMode.none) {\n        this._renderer.pickPMatrix = this._camera.pMatrices[0];\n      } else {\n        const fov = MatrixHelper.fieldOfViewFromProjectionMatrix(this._renderer.pMatrices[0]);\n        perspective(this._mat4, fov, this._renderer.width / this._renderer.height, this._config.nearPlane, this._config.farPlane);\n        this._renderer.pickPMatrix = this._mat4;\n      }\n      if (this._renderer.isInitialized) {\n        this._renderer.update(elapsedTime);\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$4(this, void 0, void 0, function* () {\n        this._fps.render();\n        if (this._renderer.isInitialized) {\n          yield this._renderer.render(elapsedTime, xrFrame);\n          if (this.afterRenderCallback) {\n            this.afterRenderCallback();\n          }\n        }\n      });\n    }\n    _syncSmooth() {\n      copy$6(this._smoothedModelPosition, this._modelPosition);\n      copy$6(this._smoothedModelScale, this._modelScale);\n      copy$4(this._smoothedModelRotation, this._modelRotation);\n    }\n    _updateManipulationOrigin(position2) {\n      this._log.write(LogLevel.info, `manipulation origin ${position2[0].toFixed(3)},${position2[1].toFixed(3)},${position2[2].toFixed(3)}`);\n      this._camera.updateModelManipulationOrigin(this._modelManipulationOrigin, position2);\n      copy$6(this._modelManipulationOrigin, position2);\n      transformMat4$2(this._vec3, this._modelManipulationOrigin, this._modelMMatrix);\n      subtract(this._modelPosition, this._vec3, this._modelManipulationOrigin);\n      copy$6(this._smoothedModelPosition, this._modelPosition);\n      if (this.manipulationOriginChangedCallback) {\n        const result = {\n          x: position2[0],\n          y: position2[1],\n          z: position2[2]\n        };\n        this.manipulationOriginChangedCallback(result);\n      }\n    }\n    pickLasso(x02, y02, x12, y12, pickType) {\n      const inverseMMatrix = create$7();\n      invert$1(inverseMMatrix, this._modelMMatrix);\n      const sets = [];\n      const nearPositions = [create$6(), create$6(), create$6(), create$6()];\n      const farPositions = [create$6(), create$6(), create$6(), create$6()];\n      const directions = [create$6(), create$6(), create$6(), create$6()];\n      this._camera.unproject(nearPositions[0], x02, y12, -1);\n      this._camera.unproject(farPositions[0], x02, y12, 1);\n      this._camera.unproject(nearPositions[1], x12, y12, -1);\n      this._camera.unproject(farPositions[1], x12, y12, 1);\n      this._camera.unproject(nearPositions[2], x12, y02, -1);\n      this._camera.unproject(farPositions[2], x12, y02, 1);\n      this._camera.unproject(nearPositions[3], x02, y02, -1);\n      this._camera.unproject(farPositions[3], x02, y02, 1);\n      for (let i = 0; i < 4; i++) {\n        transformMat4$2(nearPositions[i], nearPositions[i], inverseMMatrix);\n        transformMat4$2(farPositions[i], farPositions[i], inverseMMatrix);\n        subtract(directions[i], farPositions[i], nearPositions[i]);\n        normalize$5(directions[i], directions[i]);\n      }\n      const normals = [create$6(), create$6(), create$6(), create$6()];\n      const d2 = [];\n      for (let i = 0; i < 4; i++) {\n        cross$1(normals[i], directions[(i + 1) % 4], directions[i]);\n        normalize$5(normals[i], normals[i]);\n        d2.push(-dot$1(normals[i], nearPositions[i]));\n      }\n      if (pickType == PickType.data) {\n        const translation = create$6();\n        for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n          const transitionBuffer = this._renderer.transitionBuffers[i];\n          const set2 = /* @__PURE__ */ new Set();\n          if (transitionBuffer.isVisible) {\n            const start = window.performance.now();\n            const currentBuffer = transitionBuffer.currentBuffer;\n            const lookup2 = currentBuffer.lookup;\n            for (let j = 0; j < currentBuffer.length; j++) {\n              const id2 = currentBuffer.ids[j];\n              const index2 = lookup2[id2];\n              if (index2 != null) {\n                UnitVertex.getTranslation(currentBuffer.dataView, index2, translation);\n                let isInside = true;\n                for (let k = 0; k < 4; k++) {\n                  let distance2 = dot$1(normals[k], translation);\n                  distance2 += d2[k];\n                  if (distance2 < 0) {\n                    isInside = false;\n                    break;\n                  }\n                }\n                if (isInside) {\n                  set2.add(id2);\n                }\n              }\n            }\n            if (set2.size > 0) {\n              this._log.write(LogLevel.info, `lasso transition buffer ${i} picked ${set2.size} ${Math.round(window.performance.now() - start)}ms`);\n            }\n          }\n          sets.push(set2);\n        }\n      }\n      return sets;\n    }\n  }\n  const StereoMode = {\n    none: \"none\",\n    split: \"split\",\n    anaglyph: \"anaglyph\",\n    left: \"left\",\n    right: \"right\"\n  };\n  const HorizontalAlignment = {\n    left: \"left\",\n    center: \"center\",\n    right: \"right\"\n  };\n  const VerticalAlignment = {\n    top: \"top\",\n    center: \"center\",\n    bottom: \"bottom\"\n  };\n  const AxesTextOrientation = {\n    parallel: \"parallel\",\n    perpendicular: \"perpendicular\"\n  };\n  const AxesVisibility = {\n    none: \"none\",\n    current: \"current\",\n    previous: \"previous\"\n  };\n  const PickType = {\n    none: 0,\n    data: 1,\n    label: 2,\n    axesDivision: 3,\n    axesTitle: 4,\n    axesLabel: 5,\n    axesHeading: 6\n  };\n  const Theme = {\n    dark: \"dark\",\n    light: \"light\"\n  };\n  const HighlightMode = {\n    luminance: \"luminance\",\n    color: \"color\"\n  };\n  const UnitType = {\n    block: \"block\",\n    blockSdf: \"blockSdf\",\n    sphere: \"sphere\",\n    sphereSdf: \"sphereSdf\",\n    cylinder: \"cylinder\",\n    cylinderSdf: \"cylinderSdf\",\n    hexPrism: \"hexPrism\",\n    hexPrismSdf: \"hexPrismSdf\",\n    sdf: \"sdf\",\n    disk: \"disk\",\n    ringSdf: \"ringSdf\"\n  };\n  const SingleTouchAction = {\n    translate: \"translate\",\n    rotate: \"rotate\",\n    lasso: \"lasso\"\n  };\n  const MouseWheelAction = {\n    zoom: \"zoom\",\n    rotateY: \"rotateY\"\n  };\n  const LogLevel = {\n    trace: 0,\n    debug: 1,\n    info: 2,\n    warn: 3,\n    error: 4\n  };\n  const Edge3D = {\n    topFront: 0,\n    topRight: 1,\n    topBack: 2,\n    bottomRight: 5,\n    frontRight: 8,\n    backRight: 9\n  };\n  const RenderMode = {\n    color: \"color\"\n  };\n  let LabelSetVisual$2 = class LabelSetVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(labelSet) {\n      this.label = labelSet;\n    }\n  };\n  let LabelBase$1 = class LabelBase {\n    get material() {\n      return this._material;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get verticesView() {\n      return this._verticesView;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get materialType() {\n      return this._materialType;\n    }\n    get materialColor() {\n      return this._materialColor;\n    }\n    get materialFuzz() {\n      return this._materialFuzz;\n    }\n    get materialGloss() {\n      return this._materialGloss;\n    }\n    get segmentColor() {\n      return this._segmentColor;\n    }\n    get scale() {\n      return this._scale;\n    }\n    set scale(value2) {\n      if (this._scale != value2) {\n        this._scale = value2;\n        this._hasChanged = true;\n      }\n    }\n    get font() {\n      return this._font;\n    }\n    set font(value2) {\n      if (this._font != value2) {\n        this._font = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotation() {\n      return this._rotation;\n    }\n    set rotation(value2) {\n      if (this._rotation != value2) {\n        this._rotation = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseX(value2) {\n      if (this._reverseX != value2) {\n        this._reverseX = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseY(value2) {\n      if (this._reverseY != value2) {\n        this._reverseY = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseZ(value2) {\n      if (this._reverseZ != value2) {\n        this._reverseZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get horizontalAlignment() {\n      return this._horizontalAlignment;\n    }\n    set horizontalAlignment(value2) {\n      if (this._horizontalAlignment != value2) {\n        this._horizontalAlignment = value2;\n        this._hasChanged = true;\n      }\n    }\n    get verticalAlignment() {\n      return this._verticalAlignment;\n    }\n    set verticalAlignment(value2) {\n      if (this._verticalAlignment != value2) {\n        this._verticalAlignment = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offsetX;\n    }\n    set offsetX(value2) {\n      if (this._offsetX != value2) {\n        this._offsetX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetY() {\n      return this._offsetY;\n    }\n    set offsetY(value2) {\n      if (this._offsetY != value2) {\n        this._offsetY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetZ() {\n      return this._offsetZ;\n    }\n    set offsetZ(value2) {\n      if (this._offsetZ != value2) {\n        this._offsetZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxGlyphTop() {\n      return this._maxGlyphTop;\n    }\n    set maxGlyphTop(value2) {\n      if (this._maxGlyphTop != value2) {\n        this._maxGlyphTop = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxGlyphHeight() {\n      return this._maxGlyphHeight;\n    }\n    set maxGlyphHeight(value2) {\n      if (this._maxGlyphHeight != value2) {\n        this._maxGlyphHeight = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options2) {\n      this._core = core;\n      this._offset = create$6();\n      this._vec3 = create$6();\n      this._vec4 = create$5();\n      this._mMatrix = create$7();\n      this._indexCount = 0;\n      this._maxGlyphs = options2.maxGlyphs;\n      this._textMetric = { width: 0, maxHeight: 0, maxTop: 0 };\n      this.scale = options2.scale ? options2.scale : 1;\n      this.offsetX = options2.offsetX ? options2.offsetX : 0;\n      this.offsetY = options2.offsetY ? options2.offsetY : 0;\n      this.offsetZ = options2.offsetZ ? options2.offsetZ : 0;\n      this.reverseX = options2.reverseX;\n      this.reverseY = options2.reverseY;\n      this.reverseZ = options2.reverseZ;\n      this.rotation = options2.rotation;\n      this.maxGlyphTop = options2.maxGlyphTop;\n      this.horizontalAlignment = options2.horizontalAlignment === void 0 ? HorizontalAlignment.center : options2.horizontalAlignment;\n      this.verticalAlignment = options2.verticalAlignment === void 0 ? VerticalAlignment.center : options2.verticalAlignment;\n      this._material = options2.material;\n      this.borderWidth = core.config.textBorderWidth;\n      this.gamma = 0;\n      this._materialType = options2.materialType || 0;\n      this._materialColor = options2.materialColor || core.config.textColor;\n      this._materialFuzz = options2.materialFuzz || 0;\n      this._materialGloss = options2.materialGloss || 0;\n      this._segmentColor = options2.segmentColor;\n    }\n    initialize() {\n      this._vertices = new ArrayBuffer(PositionTexturePickVertex.SIZE_BYTES * this._maxGlyphs * 4);\n      this._verticesView = new DataView(this._vertices);\n      this._indices = new Uint32Array(this._maxGlyphs * 6);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n  };\n  class LabelSet extends LabelBase$1 {\n    get materials() {\n      return this._materials;\n    }\n    get materialTypes() {\n      return this._materialTypes;\n    }\n    get materialColors() {\n      return this._materialColors;\n    }\n    get materialFuzzes() {\n      return this._materialFuzzes;\n    }\n    get materialGlosses() {\n      return this._materialGlosses;\n    }\n    get segmentColors() {\n      return this._segmentColors;\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (this._minBoundsX != value2) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (this._minBoundsY != value2) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (this._minBoundsZ != value2) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (this._maxBoundsX != value2) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (this._maxBoundsY != value2) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (this._maxBoundsZ != value2) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsX() {\n      return this._positionsX;\n    }\n    set positionsX(value2) {\n      if (this._positionsX != value2) {\n        this._positionsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsY() {\n      return this._positionsY;\n    }\n    set positionsY(value2) {\n      if (this._positionsY != value2) {\n        this._positionsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsZ() {\n      return this._positionsZ;\n    }\n    set positionsZ(value2) {\n      if (this._positionsZ != value2) {\n        this._positionsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingX() {\n      return this._positionScalingX;\n    }\n    set positionScalingX(value2) {\n      if (this._positionScalingX != value2) {\n        this._positionScalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingY() {\n      return this._positionScalingY;\n    }\n    set positionScalingY(value2) {\n      if (this._positionScalingY != value2) {\n        this._positionScalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingZ() {\n      return this._positionScalingZ;\n    }\n    set positionScalingZ(value2) {\n      if (this._positionScalingZ != value2) {\n        this._positionScalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotations() {\n      return this._rotations;\n    }\n    set rotations(value2) {\n      if (this._rotations != value2) {\n        this._rotations = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsX() {\n      return this._offsetsX;\n    }\n    set offsetsX(value2) {\n      if (this._offsetsX != value2) {\n        this._offsetsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsY() {\n      return this._offsetsY;\n    }\n    set offsetsY(value2) {\n      if (this._offsetsY != value2) {\n        this._offsetsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsZ() {\n      return this._offsetsZ;\n    }\n    set offsetsZ(value2) {\n      if (this._offsetsZ != value2) {\n        this._offsetsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingX() {\n      return this._offsetScalingX;\n    }\n    set offsetScalingX(value2) {\n      if (this._offsetScalingX != value2) {\n        this._offsetScalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingY() {\n      return this._offsetScalingY;\n    }\n    set offsetScalingY(value2) {\n      if (this._offsetScalingY != value2) {\n        this._offsetScalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingZ() {\n      return this._offsetScalingZ;\n    }\n    set offsetScalingZ(value2) {\n      if (this._offsetScalingZ != value2) {\n        this._offsetScalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get text() {\n      return this._text;\n    }\n    set text(value2) {\n      if (this._text != value2) {\n        this._text = value2;\n        this._hasChanged = true;\n      }\n    }\n    get horizontalAlignments() {\n      return this._horizontalAlignments;\n    }\n    set horizontalAlignments(value2) {\n      if (this._horizontalAlignments != value2) {\n        this._horizontalAlignments = value2;\n        this._hasChanged = true;\n      }\n    }\n    get verticalAlignments() {\n      return this._verticalAlignments;\n    }\n    set verticalAlignments(value2) {\n      if (this._verticalAlignments != value2) {\n        this._verticalAlignments = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scales() {\n      return this._scales;\n    }\n    set scales(value2) {\n      if (this._scales != value2) {\n        this._scales = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalesScaling() {\n      return this._scalesScaling;\n    }\n    set scalesScaling(value2) {\n      if (this._scalesScaling != value2) {\n        this._scalesScaling = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options2) {\n      super(core, options2);\n      this._quat = create$4();\n      this._materials = options2.materials;\n      this._materialType = options2.materialType;\n      this._materialColor = options2.materialColors ? null : options2.materialColor || core.config.textColor;\n      this._materialColors = options2.materialColors;\n      this.minBoundsX = options2.minBoundsX ? options2.minBoundsX : 0;\n      this.minBoundsY = options2.minBoundsY ? options2.minBoundsY : 0;\n      this.minBoundsZ = options2.minBoundsZ ? options2.minBoundsZ : 0;\n      this.maxBoundsX = options2.maxBoundsX ? options2.maxBoundsX : 1;\n      this.maxBoundsY = options2.maxBoundsY ? options2.maxBoundsY : 1;\n      this.maxBoundsZ = options2.maxBoundsZ ? options2.maxBoundsZ : 1;\n      this._font = options2.font || core.font;\n      this.text = options2.text;\n      this.positionsX = options2.positionsX;\n      this.positionsY = options2.positionsY;\n      this.positionsZ = options2.positionsZ;\n      this.positionScalingX = options2.positionScalingX ? options2.positionScalingX : 1;\n      this.positionScalingY = options2.positionScalingY ? options2.positionScalingY : 1;\n      this.positionScalingZ = options2.positionScalingZ ? options2.positionScalingZ : 1;\n      this.rotations = options2.rotations;\n      this.offsetsX = options2.offsetsX;\n      this.offsetsY = options2.offsetsY;\n      this.offsetsZ = options2.offsetsZ;\n      this.offsetScalingX = options2.offsetScalingX ? options2.offsetScalingX : 1;\n      this.offsetScalingY = options2.offsetScalingY ? options2.offsetScalingY : 1;\n      this.offsetScalingZ = options2.offsetScalingZ ? options2.offsetScalingZ : 1;\n      if (options2.horizontalAlignments)\n        this.horizontalAlignments = options2.horizontalAlignments;\n      if (options2.verticalAlignments)\n        this.verticalAlignments = options2.verticalAlignments;\n      if (options2.scales)\n        this.scales = options2.scales;\n      this.scalesScaling = options2.scalesScaling ? options2.scalesScaling : 1;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.pickIdLookup = {};\n        if (!this._text) {\n          this._indexCount = 0;\n        } else {\n          const start = window.performance.now();\n          const modelSizeX = this._maxBoundsX - this._minBoundsX;\n          const modelSizeY = this._maxBoundsY - this._minBoundsY;\n          const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n          const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n          const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n          const modelOriginX = (this._minBoundsX + this._maxBoundsX) / 2;\n          const modelOriginY = (this._minBoundsY + this._maxBoundsY) / 2;\n          const modelOriginZ = (this._minBoundsZ + this._maxBoundsZ) / 2;\n          if (this._rotation) {\n            set$6(this._quat, this._rotation[0], this._rotation[1], this._rotation[2], this._rotation[3]);\n          }\n          let glyphs = 0;\n          for (let i = 0; i < this._text.length; i++) {\n            const offsetX = (this._offsetsX ? this._offsetsX[i] / 2 : this._offsetX) * boundsScaling * this._offsetScalingX;\n            const offsetY = (this._offsetsY ? this._offsetsY[i] / 2 : this._offsetY) * boundsScaling * this._offsetScalingY;\n            const offsetZ = (this._offsetsZ ? this._offsetsZ[i] / 2 : this._offsetZ) * boundsScaling * this._offsetScalingZ;\n            const text2 = TextHelper.truncate(this._text[i], this._maxGlyphs - glyphs);\n            const scale2 = (this._scales ? this._scales[i] * this._scalesScaling : this._scale) * boundsScaling / this._font.size;\n            TextHelper.measure(this._font, text2, this._textMetric);\n            const width2 = this._textMetric.width * scale2;\n            const lineHeight2 = this._font.size * scale2;\n            const maxGlyphTop = (this._maxGlyphTop ? this._maxGlyphTop : this._textMetric.maxTop) * scale2;\n            const horizontalAlignment = this._horizontalAlignments ? this._horizontalAlignments[i] : this._horizontalAlignment;\n            switch (horizontalAlignment) {\n              case HorizontalAlignment.left:\n                this._offset[0] = offsetX;\n                break;\n              case HorizontalAlignment.center:\n                this._offset[0] = offsetX - width2 / 2;\n                break;\n              case HorizontalAlignment.right:\n                this._offset[0] = offsetX - width2;\n                break;\n            }\n            const verticalAlignment = this._verticalAlignments ? this._verticalAlignments[i] : this._verticalAlignment;\n            switch (verticalAlignment) {\n              case VerticalAlignment.top:\n                this._offset[1] = offsetY - lineHeight2 / 2;\n                break;\n              case VerticalAlignment.center:\n                this._offset[1] = offsetY;\n                break;\n              case VerticalAlignment.bottom:\n                this._offset[1] = offsetY + lineHeight2 / 2;\n                break;\n            }\n            this._offset[1] -= maxGlyphTop / 2;\n            this._offset[2] = offsetZ;\n            let positionX = this.positionsX ? this.positionsX[i] * this.positionScalingX : 0;\n            let positionY = this.positionsY ? this.positionsY[i] * this.positionScalingY : 0;\n            let positionZ = this.positionsZ ? this.positionsZ[i] * this.positionScalingZ : 0;\n            if (this._reverseX) {\n              positionX = this.minBoundsX + this.maxBoundsX - positionX;\n            }\n            if (this._reverseY) {\n              positionY = this.minBoundsY + this.maxBoundsY - positionY;\n            }\n            if (this._reverseZ) {\n              positionZ = this.minBoundsZ + this.maxBoundsZ - positionZ;\n            }\n            set$8(this._vec3, (positionX - modelOriginX) * boundsScaling, (positionY - modelOriginY) * boundsScaling, (positionZ - modelOriginZ) * boundsScaling);\n            if (this._rotations) {\n              set$6(this._quat, this._rotations[i * 4], this._rotations[i * 4 + 1], this._rotations[i * 4 + 2], this._rotations[i * 4 + 3]);\n            }\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.label, this._vec4);\n            this.pickIdLookup[pickId] = i;\n            TextHelper.addString(this._font, text2, this._verticesView, this._indices, glyphs, this._vec3, scale2, this._offset, this._rotation || this._rotations ? this._quat : null, this._vec4);\n            glyphs += text2.length;\n            if (glyphs >= this._maxGlyphs) {\n              glyphs = this._maxGlyphs;\n              break;\n            }\n          }\n          this._indexCount = glyphs * 6;\n          this._core.log.write(LogLevel.info, `label set updated ${Math.round(window.performance.now() - start)}ms`);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n        }\n      }\n    }\n  }\n  let ImageVisual$2 = class ImageVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(image2) {\n      this.image = image2;\n    }\n  };\n  let ImageBase$1 = class ImageBase {\n    get material() {\n      return this._material;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get imageData() {\n      return this._imageData;\n    }\n    set imageData(value2) {\n      if (this._imageData != value2) {\n        this._imageData = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotation() {\n      return this._rotation;\n    }\n    set rotation(value2) {\n      if (!equals$1(this._rotation, value2)) {\n        copy$4(this._rotation, value2);\n        this._hasChanged = true;\n      }\n    }\n    get position() {\n      return this._position;\n    }\n    set position(value2) {\n      if (!equals$2(this._position, value2)) {\n        copy$6(this._position, value2);\n        this._hasChanged = true;\n      }\n    }\n    get texCoord0() {\n      return this._texCoord0;\n    }\n    set texCoord0(value2) {\n      if (!equals(this._texCoord0, value2)) {\n        copy$3(this._texCoord0, value2);\n        this._hasChanged = true;\n      }\n    }\n    get texCoord1() {\n      return this._texCoord1;\n    }\n    set texCoord1(value2) {\n      if (!equals(this._texCoord1, value2)) {\n        copy$3(this._texCoord1, value2);\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (this._minBoundsX != value2) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (this._minBoundsY != value2) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (this._minBoundsZ != value2) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (this._maxBoundsX != value2) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (this._maxBoundsY != value2) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (this._maxBoundsZ != value2) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options2) {\n      this._core = core;\n      this._mMatrix = create$7();\n      this._origin = create$6();\n      this._translation = create$6();\n      this._scale = create$6();\n      this._transform = create$7();\n      this._imageData = options2.imageData;\n      this._minBoundsX = options2.minBoundsX === void 0 ? 0 : options2.minBoundsX;\n      this._minBoundsY = options2.minBoundsY === void 0 ? 0 : options2.minBoundsY;\n      this._minBoundsZ = options2.minBoundsZ === void 0 ? 0 : options2.minBoundsZ;\n      this._maxBoundsX = options2.maxBoundsX === void 0 ? 1 : options2.maxBoundsX;\n      this._maxBoundsY = options2.maxBoundsY === void 0 ? 1 : options2.maxBoundsY;\n      this._maxBoundsZ = options2.maxBoundsZ === void 0 ? 1 : options2.maxBoundsZ;\n      this._position = options2.position ? clone$4(options2.position) : create$6();\n      this._rotation = options2.rotation ? clone$2(options2.rotation) : create$4();\n      this._texCoord0 = options2.texCoord0 ? clone$1(options2.texCoord0) : fromValues(0, 0);\n      this._texCoord1 = options2.texCoord1 ? clone$1(options2.texCoord1) : fromValues(1, 1);\n      this._material = options2.material === void 0 ? -1 : options2.material;\n      this._hasChanged = true;\n    }\n  };\n  class ImageQuad extends ImageBase$1 {\n    get width() {\n      return this._width;\n    }\n    set width(value2) {\n      if (this._width != value2) {\n        this._width = value2;\n        this._hasChanged = true;\n      }\n    }\n    get height() {\n      return this._height;\n    }\n    set height(value2) {\n      if (this._height != value2) {\n        this._height = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options2) {\n      super(core, options2);\n      this._width = options2.width === void 0 ? 1 : options2.width;\n      this._height = options2.height === void 0 ? 1 : options2.height;\n      this._texTransform = create$7();\n      translate$2(this._texTransform, this._texTransform, fromValues$3(0, 1, 0));\n      scale$6(this._texTransform, this._texTransform, fromValues$3(1, -1, 1));\n    }\n    initialize() {\n      this._vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * 4);\n      this._indices = Quad$3.INDICES;\n      this._indexCount = this._indices.length;\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        const modelSizeX = this._maxBoundsX - this._minBoundsX;\n        const modelSizeY = this._maxBoundsY - this._minBoundsY;\n        const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n        const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n        const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n        set$8(this._origin, (this._minBoundsX + this._maxBoundsX) / 2, (this._minBoundsY + this._maxBoundsY) / 2, (this._minBoundsZ + this._maxBoundsZ) / 2);\n        subtract(this._translation, this._position, this._origin);\n        scale$5(this._translation, this._translation, boundsScaling);\n        set$8(this._scale, this._width, this._height, 1);\n        scale$5(this._scale, this._scale, boundsScaling);\n        fromRotationTranslationScale(this._transform, this._rotation, this._translation, this._scale);\n        this._verticesView = Quad$3.normalTextured(this._transform, this._texTransform);\n        this._vertices = this._verticesView.buffer;\n        if (this.hasChangedCallback) {\n          this.hasChangedCallback();\n        }\n      }\n    }\n  }\n  class BoundsHelper {\n    static rotateBounds(minBounds, maxBounds, rotation2, rotatedMinBounds, rotatedMaxBounds, offset2) {\n      const sizeX = maxBounds[0] - minBounds[0];\n      const sizeY = maxBounds[1] - minBounds[1];\n      const sizeZ = maxBounds[2] - minBounds[2];\n      const min2 = rotatedMinBounds;\n      const max2 = rotatedMaxBounds;\n      set$8(min2, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n      set$8(max2, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n      const vertices = Cube.POSITIONS;\n      const position2 = create$6();\n      for (let i = 0; i < 8; i++) {\n        set$8(position2, vertices[i * 3] * sizeX, vertices[i * 3 + 1] * sizeY, vertices[i * 3 + 2] * sizeZ);\n        add$4(position2, position2, offset2);\n        transformQuat(position2, position2, rotation2);\n        subtract(position2, position2, offset2);\n        min$3(min2, min2, position2);\n        max$3(max2, max2, position2);\n      }\n      add$4(position2, minBounds, maxBounds);\n      scale$5(position2, position2, 0.5);\n      add$4(min2, min2, position2);\n      add$4(max2, max2, position2);\n    }\n    static cylinder(pa2, pb, radius2, minBounds, maxBounds) {\n      const a2 = create$6();\n      subtract(a2, pb, pa2);\n      const aa = dot$1(a2, a2);\n      const ex = radius2 * Math.sqrt(1 - a2[0] * a2[0] / aa);\n      const ey = radius2 * Math.sqrt(1 - a2[1] * a2[1] / aa);\n      const ez = radius2 * Math.sqrt(1 - a2[2] * a2[2] / aa);\n      minBounds[0] = Math.min(pa2[0] - ex, pb[0] - ex);\n      minBounds[1] = Math.min(pa2[1] - ey, pb[1] - ey);\n      minBounds[2] = Math.min(pa2[2] - ez, pb[2] - ez);\n      maxBounds[0] = Math.max(pa2[0] + ex, pb[0] + ex);\n      maxBounds[1] = Math.max(pa2[1] + ey, pb[1] + ey);\n      maxBounds[2] = Math.max(pa2[2] + ez, pb[2] + ez);\n    }\n  }\n  class LayoutBase {\n    get facetScaling() {\n      return this._facetScaling;\n    }\n    offsetX(facetCoordX) {\n      return ((facetCoordX + 0.5) / this._facetsX - 0.5) * (this.maxModelBoundsX - this.minModelBoundsX) / this._maxBounds;\n    }\n    offsetY(facetCoordY) {\n      return ((facetCoordY + 0.5) / this._facetsY - 0.5) * (this.maxModelBoundsY - this.minModelBoundsY) / this._maxBounds;\n    }\n    offsetZ(facetCoordZ) {\n      return ((facetCoordZ + 0.5) / this._facetsZ - 0.5) * (this.maxModelBoundsZ - this.minModelBoundsZ) / this._maxBounds;\n    }\n    constructor(core) {\n      this._core = core;\n      this.modelOriginX = 0;\n      this.modelOriginY = 0;\n      this.modelOriginZ = 0;\n      this.minModelBoundsX = 0;\n      this.minModelBoundsY = 0;\n      this.minModelBoundsZ = 0;\n      this.maxModelBoundsX = 0;\n      this.maxModelBoundsY = 0;\n      this.maxModelBoundsZ = 0;\n      this.minLayoutBoundsX = 0;\n      this.minLayoutBoundsY = 0;\n      this.minLayoutBoundsZ = 0;\n      this.maxLayoutBoundsX = 0;\n      this.maxLayoutBoundsY = 0;\n      this.maxLayoutBoundsZ = 0;\n      this._facetSpacingX = 0;\n      this._facetSpacingY = 0;\n      this._facetSpacingZ = 0;\n      this._facetSizeX = 0;\n      this._facetSizeY = 0;\n      this._facetSizeZ = 0;\n      this._facetsX = 1;\n      this._facetsY = 1;\n      this._facetsZ = 1;\n    }\n    _updateModelBounds(options2) {\n      this.minModelBoundsX = options2.minBoundsX === void 0 ? this.minLayoutBoundsX : options2.minBoundsX;\n      this.minModelBoundsY = options2.minBoundsY === void 0 ? this.minLayoutBoundsY : options2.minBoundsY;\n      this.minModelBoundsZ = options2.minBoundsZ === void 0 ? this.minLayoutBoundsZ : options2.minBoundsZ;\n      this.maxModelBoundsX = options2.maxBoundsX === void 0 ? this.maxLayoutBoundsX : options2.maxBoundsX;\n      this.maxModelBoundsY = options2.maxBoundsY === void 0 ? this.maxLayoutBoundsY : options2.maxBoundsY;\n      this.maxModelBoundsZ = options2.maxBoundsZ === void 0 ? this.maxLayoutBoundsZ : options2.maxBoundsZ;\n      this._isFacetted = options2.facetsX !== void 0 && options2.facetsX > 1 && options2.facetCoordsX != null || options2.facetsY !== void 0 && options2.facetsY > 1 && options2.facetCoordsY != null || options2.facetsZ !== void 0 && options2.facetsZ > 1 && options2.facetCoordsZ != null;\n      this._facetSpacingX = options2.facetSpacingX === void 0 ? 0 : options2.facetSpacingX;\n      this._facetSpacingY = options2.facetSpacingY === void 0 ? 0 : options2.facetSpacingY;\n      this._facetSpacingZ = options2.facetSpacingZ === void 0 ? 0 : options2.facetSpacingZ;\n      let modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n      let modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n      let modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n      const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n      this._facetSizeX = modelSizeX;\n      this._facetSizeY = modelSizeY;\n      this._facetSizeZ = modelSizeZ;\n      this._facetsX = options2.facetCoordsX ? options2.facetsX : 1;\n      this._facetsY = options2.facetCoordsY ? options2.facetsY : 1;\n      this._facetsZ = options2.facetCoordsZ ? options2.facetsZ : 1;\n      this.minModelBoundsX -= this._facetSizeX * this._facetSpacingX / 2;\n      this.minModelBoundsY -= this._facetSizeY * this._facetSpacingY / 2;\n      this.minModelBoundsZ -= this._facetSizeZ * this._facetSpacingZ / 2;\n      this.maxModelBoundsX = this.minModelBoundsX + this._facetsX * this._facetSizeX * (1 + this._facetSpacingX);\n      this.maxModelBoundsY = this.minModelBoundsY + this._facetsY * this._facetSizeY * (1 + this._facetSpacingY);\n      this.maxModelBoundsZ = this.minModelBoundsZ + this._facetsZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n      this.modelOriginX = (this.minModelBoundsX + this.maxModelBoundsX) / 2;\n      this.modelOriginY = (this.minModelBoundsY + this.maxModelBoundsY) / 2;\n      this.modelOriginZ = (this.minModelBoundsZ + this.maxModelBoundsZ) / 2;\n      modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n      modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n      modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n      this._maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n      this._boundsScaling = this._maxBounds == 0 ? 1 : 1 / this._maxBounds;\n      this._facetScaling = maxBounds / this._maxBounds;\n    }\n    resetCumulativeLayoutBounds() {\n      this.minCumulativeLayoutBoundsX = void 0;\n      this.minCumulativeLayoutBoundsY = void 0;\n      this.minCumulativeLayoutBoundsZ = void 0;\n      this.maxCumulativeLayoutBoundsX = void 0;\n      this.maxCumulativeLayoutBoundsY = void 0;\n      this.maxCumulativeLayoutBoundsZ = void 0;\n    }\n    _updateCumulativeLayoutBounds() {\n      this.minCumulativeLayoutBoundsX = this.minCumulativeLayoutBoundsX === void 0 ? this.minLayoutBoundsX : Math.min(this.minCumulativeLayoutBoundsX, this.minLayoutBoundsX);\n      this.minCumulativeLayoutBoundsY = this.minCumulativeLayoutBoundsY === void 0 ? this.minLayoutBoundsY : Math.min(this.minCumulativeLayoutBoundsY, this.minLayoutBoundsY);\n      this.minCumulativeLayoutBoundsZ = this.minCumulativeLayoutBoundsZ === void 0 ? this.minLayoutBoundsZ : Math.min(this.minCumulativeLayoutBoundsZ, this.minLayoutBoundsZ);\n      this.maxCumulativeLayoutBoundsX = this.maxCumulativeLayoutBoundsX === void 0 ? this.maxLayoutBoundsX : Math.max(this.maxCumulativeLayoutBoundsX, this.maxLayoutBoundsX);\n      this.maxCumulativeLayoutBoundsY = this.maxCumulativeLayoutBoundsY === void 0 ? this.maxLayoutBoundsY : Math.max(this.maxCumulativeLayoutBoundsY, this.maxLayoutBoundsY);\n      this.maxCumulativeLayoutBoundsZ = this.maxCumulativeLayoutBoundsZ === void 0 ? this.maxLayoutBoundsZ : Math.max(this.maxCumulativeLayoutBoundsZ, this.maxLayoutBoundsZ);\n    }\n    unitToModelSize(unitSize) {\n      return unitSize / this._boundsScaling;\n    }\n    unitToModelPositionX(unitPositionX) {\n      return this.unitToModelSize(unitPositionX) + this.modelOriginX;\n    }\n    unitToModelPositionY(unitPositionY) {\n      return this.unitToModelSize(unitPositionY) + this.modelOriginY;\n    }\n    unitToModelPositionZ(unitPositionZ) {\n      return this.unitToModelSize(unitPositionZ) + this.modelOriginZ;\n    }\n    unitToModelPosition(unitPosition, modelPosition) {\n      modelPosition[0] = this.unitToModelPositionX(unitPosition[0]);\n      modelPosition[1] = this.unitToModelPositionY(unitPosition[1]);\n      modelPosition[2] = this.unitToModelPositionZ(unitPosition[2]);\n    }\n    modelToUnitSize(modelSize) {\n      return modelSize * this._boundsScaling;\n    }\n    modelToUnitPositionX(modelPositionX) {\n      return (modelPositionX - this.modelOriginX) * this._boundsScaling;\n    }\n    modelToUnitPositionY(modelPositionY) {\n      return (modelPositionY - this.modelOriginY) * this._boundsScaling;\n    }\n    modelToUnitPositionZ(modelPositionZ) {\n      return (modelPositionZ - this.modelOriginZ) * this._boundsScaling;\n    }\n    modelToUnitPosition(modelPosition, unitPosition) {\n      unitPosition[0] = this.modelToUnitPositionX(modelPosition[0]);\n      unitPosition[1] = this.modelToUnitPositionY(modelPosition[1]);\n      unitPosition[2] = this.modelToUnitPositionZ(modelPosition[2]);\n    }\n    inclusiveUnitBounds(buffer, ids, unitType, offset2, count2, minBounds, maxBounds) {\n      set$8(minBounds, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n      set$8(maxBounds, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n      const unitScale = create$6();\n      const unitRotation = create$4();\n      const unitTranslation = create$6();\n      const lookup2 = buffer.lookup;\n      const dataView = buffer.dataView;\n      let minBounds0;\n      let maxBounds0;\n      let minBounds1;\n      let maxBounds1;\n      switch (unitType) {\n        case UnitType.sphere:\n        case UnitType.sphereSdf:\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            const radius2 = unitScale[0] / 2;\n            minBounds[0] = Math.min(minBounds[0], unitTranslation[0] - radius2);\n            minBounds[1] = Math.min(minBounds[1], unitTranslation[1] - radius2);\n            minBounds[2] = Math.min(minBounds[2], unitTranslation[2] - radius2);\n            maxBounds[0] = Math.max(maxBounds[0], unitTranslation[0] + radius2);\n            maxBounds[1] = Math.max(maxBounds[1], unitTranslation[1] + radius2);\n            maxBounds[2] = Math.max(maxBounds[2], unitTranslation[2] + radius2);\n          }\n          break;\n        case UnitType.hexPrism:\n        case UnitType.hexPrismSdf:\n        case UnitType.block:\n        case UnitType.blockSdf:\n          minBounds0 = create$6();\n          maxBounds0 = create$6();\n          minBounds1 = create$6();\n          maxBounds1 = create$6();\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getRotation(dataView, index2, unitRotation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            minBounds0[0] = unitTranslation[0] - unitScale[0] / 2;\n            minBounds0[1] = unitTranslation[1] - unitScale[1] / 2;\n            minBounds0[2] = unitTranslation[2] - unitScale[2] / 2;\n            maxBounds0[0] = unitTranslation[0] + unitScale[0] / 2;\n            maxBounds0[1] = unitTranslation[1] + unitScale[1] / 2;\n            maxBounds0[2] = unitTranslation[2] + unitScale[2] / 2;\n            BoundsHelper.rotateBounds(minBounds0, maxBounds0, unitRotation, minBounds1, maxBounds1, Constants$1.VECTOR3_ZERO);\n            min$3(minBounds, minBounds, minBounds1);\n            max$3(maxBounds, maxBounds, maxBounds1);\n          }\n          break;\n        case UnitType.cylinder:\n        case UnitType.cylinderSdf:\n          minBounds0 = create$6();\n          maxBounds0 = create$6();\n          const pa2 = create$6();\n          const pb = create$6();\n          const identityRotation = Constants$1.VECTOR3_UNITY;\n          let ca;\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getRotation(dataView, index2, unitRotation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            const length2 = unitScale[1];\n            const radius2 = Math.max(unitScale[0], unitScale[2]);\n            if (length2 != 0 && radius2 != 0) {\n              if (equals$1(unitRotation, Constants$1.QUAT_IDENTITY)) {\n                ca = identityRotation;\n              } else {\n                ca = create$6();\n                transformQuat(ca, identityRotation, unitRotation);\n              }\n              scaleAndAdd(pa2, unitTranslation, ca, -length2 * 0.5);\n              scaleAndAdd(pb, unitTranslation, ca, length2 * 0.5);\n              BoundsHelper.cylinder(pa2, pb, radius2, minBounds0, maxBounds0);\n              min$3(minBounds, minBounds, minBounds0);\n              max$3(maxBounds, maxBounds, maxBounds0);\n            }\n          }\n          break;\n      }\n    }\n  }\n  class Scatter extends LayoutBase {\n    layout(buffer, ids, options2) {\n      const start = window.performance.now();\n      const offset2 = options2.offset === void 0 ? 0 : options2.offset;\n      const count2 = options2.count === void 0 ? ids.length : options2.count;\n      const positionScalingX = options2.positionScalingX === void 0 ? 1 : options2.positionScalingX;\n      const positionScalingY = options2.positionScalingY === void 0 ? 1 : options2.positionScalingY;\n      const positionScalingZ = options2.positionScalingZ === void 0 ? 1 : options2.positionScalingZ;\n      if (!this._positions || this._positions.length < buffer.length * 3) {\n        this._positions = new Float32Array(buffer.length * 3);\n      }\n      this.minLayoutBoundsX = Number.MAX_VALUE;\n      this.minLayoutBoundsY = Number.MAX_VALUE;\n      this.minLayoutBoundsZ = Number.MAX_VALUE;\n      this.maxLayoutBoundsX = -Number.MAX_VALUE;\n      this.maxLayoutBoundsY = -Number.MAX_VALUE;\n      this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = lookup2[id2];\n        let positionX = options2.positionsX ? options2.positionsX[id2] * positionScalingX : 0;\n        let positionY = options2.positionsY ? options2.positionsY[id2] * positionScalingY : 0;\n        let positionZ = options2.positionsZ ? options2.positionsZ[id2] * positionScalingZ : 0;\n        this._positions[index2 * 3] = positionX;\n        this._positions[index2 * 3 + 1] = positionY;\n        this._positions[index2 * 3 + 2] = positionZ;\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, positionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, positionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, positionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, positionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, positionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, positionZ);\n      }\n      this._updateCumulativeLayoutBounds();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options2) {\n      const start = window.performance.now();\n      const offset2 = options2.offset === void 0 ? 0 : options2.offset;\n      const count2 = options2.count === void 0 ? ids.length : options2.count;\n      const dataView = buffer.dataView;\n      const _vec2 = create$3();\n      const _vec3 = create$6();\n      const _vec4 = create$5();\n      const _quat = create$4();\n      const sizeScalingX = options2.sizeScaling === void 0 ? options2.sizeScalingX === void 0 ? 1 : options2.sizeScalingX : options2.sizeScaling;\n      const sizeScalingY = options2.sizeScaling === void 0 ? options2.sizeScalingY === void 0 ? 1 : options2.sizeScalingY : options2.sizeScaling;\n      const sizeScalingZ = options2.sizeScaling === void 0 ? options2.sizeScalingZ === void 0 ? 1 : options2.sizeScalingZ : options2.sizeScaling;\n      const sizesX = options2.sizes ? options2.sizes : options2.sizesX;\n      const sizesY = options2.sizes ? options2.sizes : options2.sizesY;\n      const sizesZ = options2.sizes ? options2.sizes : options2.sizesZ;\n      const minSize = options2.minSize === void 0 ? 0 : options2.minSize;\n      const minColor = options2.minColor === void 0 ? 0 : options2.minColor;\n      const maxColor = options2.maxColor === void 0 ? 1 : options2.maxColor;\n      const minOrder = options2.minOrder === void 0 ? 0 : options2.minOrder;\n      const maxOrder = options2.maxOrder === void 0 ? 1 : options2.maxOrder;\n      const orderReverse = options2.orderReverse === void 0 ? false : options2.orderReverse;\n      const minStaggerOrder = options2.minStaggerOrder === void 0 ? 0 : options2.minStaggerOrder;\n      const maxStaggerOrder = options2.maxStaggerOrder === void 0 ? 1 : options2.maxStaggerOrder;\n      const staggerOrderReverse = options2.staggerOrderReverse === void 0 ? false : options2.staggerOrderReverse;\n      const reverseX = options2.reverseX === void 0 ? false : options2.reverseX;\n      const reverseY = options2.reverseY === void 0 ? false : options2.reverseY;\n      const reverseZ = options2.reverseZ === void 0 ? false : options2.reverseZ;\n      this._updateModelBounds(options2);\n      if (options2.rotation) {\n        _quat[0] = options2.rotation[0];\n        _quat[1] = options2.rotation[1];\n        _quat[2] = options2.rotation[2];\n        _quat[3] = options2.rotation[3];\n      } else {\n        rotationTo(_quat, this._core.config.identityRotation, Constants$1.VECTOR3_UNITY);\n      }\n      if (options2.texCoord) {\n        _vec4[0] = options2.texCoord[0];\n        _vec4[1] = options2.texCoord[1];\n        _vec4[2] = options2.texCoord[2];\n        _vec4[3] = options2.texCoord[3];\n      }\n      const lookup2 = buffer.lookup;\n      const selection = options2.selected && options2.selected.size > 0;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = lookup2[id2];\n        let positionX = this._positions[index2 * 3];\n        let positionY = this._positions[index2 * 3 + 1];\n        let positionZ = this._positions[index2 * 3 + 2];\n        if (this._isFacetted) {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n          }\n          const facetX = options2.facetCoordsX ? options2.facetCoordsX[id2] : 0;\n          const facetY = options2.facetCoordsY ? options2.facetCoordsY[id2] : 0;\n          const facetZ = options2.facetCoordsZ ? options2.facetCoordsZ[id2] : 0;\n          positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n          positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n          positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        } else {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n          }\n        }\n        _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n        _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n        _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n        UnitVertex.setTranslation(dataView, index2, _vec3);\n        _vec3[0] = Math.max((sizesX ? Math.abs(sizesX[id2]) : 1) * sizeScalingX, minSize) * this._boundsScaling;\n        _vec3[1] = Math.max((sizesY ? Math.abs(sizesY[id2]) : 1) * sizeScalingY, minSize) * this._boundsScaling;\n        _vec3[2] = Math.max((sizesZ ? Math.abs(sizesZ[id2]) : 1) * sizeScalingZ, minSize) * this._boundsScaling;\n        UnitVertex.setScale(dataView, index2, _vec3);\n        if (options2.rotations) {\n          _quat[0] = options2.rotations[id2 * 4];\n          _quat[1] = options2.rotations[id2 * 4 + 1];\n          _quat[2] = options2.rotations[id2 * 4 + 2];\n          _quat[3] = options2.rotations[id2 * 4 + 3];\n          UnitVertex.setRotation(dataView, index2, _quat);\n        } else {\n          UnitVertex.setRotation(dataView, index2, _quat);\n        }\n        if (options2.colors) {\n          const size = 1 / (maxColor - minColor + 1);\n          const color2 = MathHelper.normalize(options2.colors[id2], minColor, maxColor, size / 2, 1 - size / 2);\n          if (options2.colors1) {\n            const color1 = MathHelper.normalize(options2.colors1[id2], minColor, maxColor, size / 2, 1 - size / 2);\n            set$5(_vec2, color2, color1);\n          } else {\n            set$5(_vec2, color2, color2);\n          }\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else {\n          UnitVertex.setColor(dataView, index2, Constants$1.VECTOR2_ONE);\n        }\n        UnitVertex.setIdHover(dataView, index2, options2.hover ? options2.hover[id2] : id2);\n        UnitVertex.setSelected(dataView, index2, selection ? options2.selected.has(id2) ? 1 : -1 : 0);\n        if (options2.order !== void 0) {\n          const order = MathHelper.normalize(options2.order[id2], minOrder, maxOrder, 0, 1);\n          _vec2[0] = orderReverse ? 1 - order : order;\n        } else {\n          _vec2[0] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        if (options2.staggerOrder !== void 0) {\n          _vec2[1] = options2.staggerOrder;\n        } else if (options2.staggerOrders) {\n          const stagger = MathHelper.normalize(options2.staggerOrders[id2], minStaggerOrder, maxStaggerOrder, 0, 1);\n          _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n        } else {\n          _vec2[1] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        UnitVertex.setOrder(dataView, index2, _vec2);\n        UnitVertex.setMaterial(dataView, index2, options2.material ? options2.material : options2.materials ? options2.materials[id2] : 0);\n        UnitVertex.setRounding(dataView, index2, options2.rounding ? options2.rounding * this._boundsScaling : options2.roundings ? options2.roundings[id2] * this._boundsScaling : 0);\n        UnitVertex.setParameter1(dataView, index2, options2.parameter1 ? options2.parameter1 : options2.parameters1 ? options2.parameters1[id2] : 0);\n        UnitVertex.setParameter2(dataView, index2, options2.parameter2 ? options2.parameter2 : options2.parameters2 ? options2.parameters2[id2] : 0);\n        UnitVertex.setSdfBuffer(dataView, index2, options2.sdfBuffer ? options2.sdfBuffer : options2.sdfBuffers ? options2.sdfBuffers[id2] : this._core.config.sdfBuffer);\n        UnitVertex.setSdfBorder(dataView, index2, options2.sdfBorder ? options2.sdfBorder : options2.sdfBorders ? options2.sdfBorders[id2] : this._core.config.sdfBorder);\n        if (options2.texCoords) {\n          _vec4[0] = options2.texCoords[id2 * 4];\n          _vec4[1] = options2.texCoords[id2 * 4 + 1];\n          _vec4[2] = options2.texCoords[id2 * 4 + 2];\n          _vec4[3] = options2.texCoords[id2 * 4 + 3];\n          UnitVertex.setTexCoord(dataView, index2, _vec4);\n        } else {\n          UnitVertex.setTexCoord(dataView, index2, _vec4);\n        }\n        UnitVertex.setMatId(dataView, index2, options2.materialType ? options2.materialType : options2.materialTypes ? options2.materialTypes[id2] : 0);\n        UnitVertex.setMatColor(dataView, index2, options2.materialColor ? options2.materialColor : options2.materialColors ? [options2.materialColors[id2 * 3], options2.materialColors[id2 * 3 + 1], options2.materialColors[id2 * 3 + 2]] : [0, 0, 0]);\n        UnitVertex.setMatFuzz(dataView, index2, options2.materialFuzz ? options2.materialFuzz : options2.materialFuzzes ? options2.materialFuzzes[id2] : 0);\n        UnitVertex.setMatGloss(dataView, index2, options2.materialGloss ? options2.materialGloss : options2.materialGlosses ? options2.materialGlosses[id2] : 0);\n        UnitVertex.setMatDensity(dataView, index2, options2.materialDensity ? options2.materialDensity : options2.materialDensities ? options2.materialDensities[id2] : 0);\n        UnitVertex.setMatRefractiveIndex(dataView, index2, options2.materialRefractiveIndex ? options2.materialRefractiveIndex : options2.materialRefractiveIndices ? options2.materialRefractiveIndices[id2] : 0);\n        UnitVertex.setSegColor(dataView, index2, options2.segmentColor ? options2.segmentColor : options2.segmentColors ? [options2.segmentColors[id2 * 4], options2.segmentColors[id2 * 4 + 1], options2.segmentColors[id2 * 4 + 2], options2.segmentColors[id2 * 4 + 3]] : [buffer.idColors[id2 * 4], buffer.idColors[id2 * 4 + 1], buffer.idColors[id2 * 4 + 2], buffer.idColors[id2 * 4 + 3]]);\n      }\n      buffer.update();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  fromValues$3(0.2126, 0.7152, 0.0722);\n  create$6();\n  create$6();\n  class PathHelper {\n    static getFilenameWithoutExtension(path2) {\n      const dot2 = path2.lastIndexOf(\".\");\n      if (dot2 == -1) {\n        return path2;\n      } else {\n        const start = path2.lastIndexOf(\"/\") == -1 ? 0 : path2.lastIndexOf(\"/\") + 1;\n        return path2.substring(start, dot2);\n      }\n    }\n    static getExtension(path2) {\n      const dot2 = path2.lastIndexOf(\".\");\n      if (dot2 == -1 || dot2 == path2.length - 1) {\n        return null;\n      } else {\n        return path2.substring(dot2 + 1, path2.length);\n      }\n    }\n    static getFilename(path2) {\n      if (path2.lastIndexOf(\"/\") == -1) {\n        return path2;\n      } else {\n        const start = path2.lastIndexOf(\"/\") + 1;\n        return path2.substring(start, path2.length);\n      }\n    }\n    static getPath(path2) {\n      if (path2.lastIndexOf(\"/\") == -1) {\n        return \"\";\n      } else {\n        return path2.substring(0, path2.lastIndexOf(\"/\"));\n      }\n    }\n    static combine(first, second2) {\n      const seperator = first.lastIndexOf(\"/\") == first.length - 1;\n      if (second2.indexOf(\"/\") == 0) {\n        if (seperator) {\n          return first.substring(0, first.length - 1) + second2;\n        } else {\n          return first + second2;\n        }\n      } else {\n        if (seperator) {\n          return first + second2;\n        } else {\n          return first + \"/\" + second2;\n        }\n      }\n    }\n  }\n  class TextureHelper {\n    static create(gl, width2, height2, format2, type2, filter2, bytes, internalFormat = format2) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter2);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter2);\n      gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width2, height2, 0, format2, type2, bytes);\n      return texture;\n    }\n    static fromImage(gl, image2, mipmaps, filter2) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image2);\n      if (mipmaps && MathHelper.isPowerOf2(image2.width) && MathHelper.isPowerOf2(image2.height))\n        gl.generateMipmap(gl.TEXTURE_2D);\n      else {\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter2);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter2);\n      }\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      return texture;\n    }\n    static cubemapFromImages(gl, images) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n      const targets = [\n        gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n        gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n        gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n      ];\n      for (let i = 0; i < 6; i++) {\n        gl.texImage2D(targets[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, images[i]);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      }\n      gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n      gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n      return texture;\n    }\n  }\n  class Line extends LayoutBase {\n    layout(buffer, ids, fromIds, toIds, options2) {\n      const start = window.performance.now();\n      const offset2 = options2.offset === void 0 ? 0 : options2.offset;\n      const count2 = options2.count === void 0 ? ids.length : options2.count;\n      const positionScalingX = options2.positionScalingX === void 0 ? 1 : options2.positionScalingX;\n      const positionScalingY = options2.positionScalingY === void 0 ? 1 : options2.positionScalingY;\n      const positionScalingZ = options2.positionScalingZ === void 0 ? 1 : options2.positionScalingZ;\n      const sizeScalingX = options2.sizeScaling === void 0 ? options2.sizeScalingX === void 0 ? 1 : options2.sizeScalingX : options2.sizeScaling;\n      const sizeScalingY = options2.sizeScaling === void 0 ? options2.sizeScalingY === void 0 ? 1 : options2.sizeScalingY : options2.sizeScaling;\n      const sizeScalingZ = options2.sizeScaling === void 0 ? options2.sizeScalingZ === void 0 ? 1 : options2.sizeScalingZ : options2.sizeScaling;\n      const minSize = options2.minSize === void 0 ? 0 : options2.minSize;\n      const offsetScaling = options2.offsetScaling === void 0 ? 1 : options2.offsetScaling;\n      if (!this._positions || this._positions.length < buffer.length * 3) {\n        this._positions = new Float32Array(buffer.length * 3);\n        this._sizes = new Float32Array(buffer.length * 3);\n        this._rotations = new Float32Array(buffer.length * 4);\n      }\n      this.minLayoutBoundsX = Number.MAX_VALUE;\n      this.minLayoutBoundsY = Number.MAX_VALUE;\n      this.minLayoutBoundsZ = Number.MAX_VALUE;\n      this.maxLayoutBoundsX = -Number.MAX_VALUE;\n      this.maxLayoutBoundsY = -Number.MAX_VALUE;\n      this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n      const _vec3 = create$6();\n      const _quat = create$4();\n      const direction = create$6();\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const fromId = fromIds[id2];\n        const toId = toIds[id2];\n        const index2 = lookup2[id2];\n        let toPositionX = options2.positionsX ? options2.positionsX[toId] * positionScalingX : 0;\n        let toPositionY = options2.positionsY ? options2.positionsY[toId] * positionScalingY : 0;\n        let toPositionZ = options2.positionsZ ? options2.positionsZ[toId] * positionScalingZ : 0;\n        let fromPositionX = options2.positionsX ? options2.positionsX[fromId] * positionScalingX : 0;\n        let fromPositionY = options2.positionsY ? options2.positionsY[fromId] * positionScalingY : 0;\n        let fromPositionZ = options2.positionsZ ? options2.positionsZ[fromId] * positionScalingZ : 0;\n        if (fromId == toId) {\n          this._sizes[index2 * 3] = 0;\n          this._sizes[index2 * 3 + 1] = 0;\n          this._sizes[index2 * 3 + 2] = 0;\n          this._rotations[index2 * 4] = 0;\n          this._rotations[index2 * 4 + 1] = 0;\n          this._rotations[index2 * 4 + 2] = 0;\n          this._rotations[index2 * 4 + 3] = 1;\n        } else {\n          direction[0] = toPositionX - fromPositionX;\n          direction[1] = toPositionY - fromPositionY;\n          direction[2] = toPositionZ - fromPositionZ;\n          let length2 = length$1(direction);\n          scale$5(direction, direction, 1 / length2);\n          rotationTo(_quat, this._core.config.identityRotation, direction);\n          this._rotations[index2 * 4] = _quat[0];\n          this._rotations[index2 * 4 + 1] = _quat[1];\n          this._rotations[index2 * 4 + 2] = _quat[2];\n          this._rotations[index2 * 4 + 3] = _quat[3];\n          if (options2.offsets) {\n            const fromOffset = options2.offsets[fromId] * offsetScaling / 2;\n            const toOffset = options2.offsets[toId] * offsetScaling / 2;\n            toPositionX -= direction[0] * toOffset;\n            toPositionY -= direction[1] * toOffset;\n            toPositionZ -= direction[2] * toOffset;\n            fromPositionX += direction[0] * fromOffset;\n            fromPositionY += direction[1] * fromOffset;\n            fromPositionZ += direction[2] * fromOffset;\n            length2 = Math.max(length2 - toOffset - fromOffset, minSize);\n          }\n          this._sizes[index2 * 3 + 1] = Math.max(length2 * sizeScalingY, minSize);\n          if (options2.lineSizes) {\n            this._sizes[index2 * 3] = Math.max(options2.lineSizes[id2] * sizeScalingX, minSize);\n            this._sizes[index2 * 3 + 2] = Math.max(options2.lineSizes[id2] * sizeScalingZ, minSize);\n          } else if (options2.endSizes) {\n            this._sizes[index2 * 3] = Math.max(options2.endSizes[fromId] * sizeScalingX, minSize);\n            this._sizes[index2 * 3 + 2] = Math.max(options2.endSizes[toId] * sizeScalingZ, minSize);\n          } else {\n            this._sizes[index2 * 3] = sizeScalingX;\n            this._sizes[index2 * 3 + 2] = sizeScalingZ;\n          }\n        }\n        _vec3[0] = (fromPositionX + toPositionX) / 2;\n        _vec3[1] = (fromPositionY + toPositionY) / 2;\n        _vec3[2] = (fromPositionZ + toPositionZ) / 2;\n        this._positions[index2 * 3] = _vec3[0];\n        this._positions[index2 * 3 + 1] = _vec3[1];\n        this._positions[index2 * 3 + 2] = _vec3[2];\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, fromPositionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, fromPositionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, fromPositionZ);\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, toPositionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, toPositionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, toPositionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, fromPositionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, fromPositionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, fromPositionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, toPositionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, toPositionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, toPositionZ);\n      }\n      this._updateCumulativeLayoutBounds();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, fromIds, toIds, options2) {\n      const start = window.performance.now();\n      const offset2 = options2.offset === void 0 ? 0 : options2.offset;\n      const count2 = options2.count === void 0 ? ids.length : options2.count;\n      const dataView = buffer.dataView;\n      const _vec2 = create$3();\n      const _vec3 = create$6();\n      const _quat = create$4();\n      const endMinColor = options2.endMinColor === void 0 ? 0 : options2.endMinColor;\n      const endMaxColor = options2.endMaxColor === void 0 ? 1 : options2.endMaxColor;\n      const lineMinColor = options2.lineMinColor === void 0 ? 0 : options2.lineMinColor;\n      const lineMaxColor = options2.lineMaxColor === void 0 ? 1 : options2.lineMaxColor;\n      const minOrder = options2.minOrder === void 0 ? 0 : options2.minOrder;\n      const maxOrder = options2.maxOrder === void 0 ? 1 : options2.maxOrder;\n      const orderReverse = options2.orderReverse === void 0 ? false : options2.orderReverse;\n      const minStaggerOrder = options2.minStaggerOrder === void 0 ? 0 : options2.minStaggerOrder;\n      const maxStaggerOrder = options2.maxStaggerOrder === void 0 ? 1 : options2.maxStaggerOrder;\n      const staggerOrderReverse = options2.staggerOrderReverse === void 0 ? false : options2.staggerOrderReverse;\n      const reverseX = options2.reverseX === void 0 ? false : options2.reverseX;\n      const reverseY = options2.reverseY === void 0 ? false : options2.reverseY;\n      const reverseZ = options2.reverseZ === void 0 ? false : options2.reverseZ;\n      this._updateModelBounds(options2);\n      const lookup2 = buffer.lookup;\n      const selection = options2.selected && options2.selected.size > 0;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const fromId = fromIds[id2];\n        const toId = toIds[id2];\n        const index2 = lookup2[id2];\n        let positionX = this._positions[index2 * 3];\n        let positionY = this._positions[index2 * 3 + 1];\n        let positionZ = this._positions[index2 * 3 + 2];\n        if (this._isFacetted) {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n          }\n          const facetX = options2.facetCoordsX ? options2.facetCoordsX[id2] : 0;\n          const facetY = options2.facetCoordsY ? options2.facetCoordsY[id2] : 0;\n          const facetZ = options2.facetCoordsZ ? options2.facetCoordsZ[id2] : 0;\n          positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n          positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n          positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        } else {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n          }\n        }\n        _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n        _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n        _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n        UnitVertex.setTranslation(dataView, index2, _vec3);\n        _vec3[0] = this._sizes[index2 * 3] * this._boundsScaling;\n        _vec3[1] = this._sizes[index2 * 3 + 1] * this._boundsScaling;\n        _vec3[2] = this._sizes[index2 * 3 + 2] * this._boundsScaling;\n        UnitVertex.setScale(dataView, index2, _vec3);\n        _quat[0] = this._rotations[index2 * 4];\n        _quat[1] = this._rotations[index2 * 4 + 1];\n        _quat[2] = this._rotations[index2 * 4 + 2];\n        _quat[3] = this._rotations[index2 * 4 + 3];\n        if (reverseX) {\n          _quat[1] = -_quat[1];\n          _quat[2] = -_quat[2];\n        }\n        if (reverseY) {\n          _quat[0] = -_quat[0];\n          _quat[2] = -_quat[2];\n        }\n        if (reverseZ) {\n          _quat[0] = -_quat[0];\n          _quat[1] = -_quat[1];\n        }\n        UnitVertex.setRotation(dataView, index2, _quat);\n        let size;\n        if (options2.endColors) {\n          size = 1 / (endMaxColor - endMinColor + 1);\n          const fromColor = MathHelper.normalize(options2.endColors[fromId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n          const toColor = MathHelper.normalize(options2.endColors[toId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n          set$5(_vec2, fromColor, toColor);\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else if (options2.lineColors) {\n          size = 1 / (lineMaxColor - lineMinColor + 1);\n          const color2 = MathHelper.normalize(options2.lineColors[id2], lineMinColor, lineMaxColor, size / 2, 1 - size / 2);\n          set$5(_vec2, color2, color2);\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else {\n          UnitVertex.setColor(dataView, index2, Constants$1.VECTOR2_ONE);\n        }\n        UnitVertex.setIdHover(dataView, index2, options2.hover ? options2.hover[id2] : id2);\n        UnitVertex.setSelected(dataView, index2, selection ? options2.selected.has(id2) ? 1 : -1 : 0);\n        if (options2.order !== void 0) {\n          const order = MathHelper.normalize(options2.order[id2], minOrder, maxOrder, 0, 1);\n          _vec2[0] = orderReverse ? 1 - order : order;\n        } else {\n          _vec2[0] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        if (options2.staggerOrder !== void 0) {\n          _vec2[1] = options2.staggerOrder;\n        } else if (options2.staggerOrders) {\n          const stagger = MathHelper.normalize(options2.staggerOrders[id2], minStaggerOrder, maxStaggerOrder, 0, 1);\n          _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n        } else {\n          _vec2[1] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        UnitVertex.setOrder(dataView, index2, _vec2);\n        UnitVertex.setMaterial(dataView, index2, options2.material ? options2.material : options2.materials ? options2.materials[id2] : 0);\n        UnitVertex.setRounding(dataView, index2, options2.rounding ? options2.rounding * this._boundsScaling : options2.roundings ? options2.roundings[id2] * this._boundsScaling : 0);\n        UnitVertex.setSdfBuffer(dataView, index2, options2.sdfBuffer ? options2.sdfBuffer : options2.sdfBuffers ? options2.sdfBuffers[id2] : this._core.config.sdfBuffer);\n        UnitVertex.setSdfBorder(dataView, index2, options2.sdfBorder ? options2.sdfBorder : options2.sdfBorders ? options2.sdfBorders[id2] : this._core.config.sdfBorder);\n        UnitVertex.setMatId(dataView, index2, options2.materialType ? options2.materialType : options2.materialTypes ? options2.materialTypes[id2] : 0);\n        UnitVertex.setMatColor(dataView, index2, options2.materialColor ? options2.materialColor : options2.materialColors ? [options2.materialColors[id2 * 3], options2.materialColors[id2 * 3 + 1], options2.materialColors[id2 * 3 + 2]] : [0, 0, 0]);\n        UnitVertex.setMatFuzz(dataView, index2, options2.materialFuzz ? options2.materialFuzz : options2.materialFuzzes ? options2.materialFuzzes[id2] : 0);\n        UnitVertex.setMatGloss(dataView, index2, options2.materialGloss ? options2.materialGloss : options2.materialGlosses ? options2.materialGlosses[id2] : 0);\n        UnitVertex.setMatDensity(dataView, index2, options2.materialDensity ? options2.materialDensity : options2.materialDensities ? options2.materialDensities[id2] : 0);\n        UnitVertex.setMatRefractiveIndex(dataView, index2, options2.materialRefractiveIndex ? options2.materialRefractiveIndex : options2.materialRefractiveIndices ? options2.materialRefractiveIndices[id2] : 0);\n        UnitVertex.setSegColor(dataView, index2, options2.segmentColor ? options2.segmentColor : options2.segmentColors ? [options2.segmentColors[id2 * 4], options2.segmentColors[id2 * 4 + 1], options2.segmentColors[id2 * 4 + 2], options2.segmentColors[id2 * 4 + 3]] : [buffer.idColors[id2 * 4], buffer.idColors[id2 * 4 + 1], buffer.idColors[id2 * 4 + 2], buffer.idColors[id2 * 4 + 3]]);\n      }\n      buffer.update();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  class AtlasBase {\n    get imageData() {\n      return this._imageData;\n    }\n    set imageData(value2) {\n      if (this._imageData != value2) {\n        this._imageData = value2;\n        this._changed = true;\n      }\n    }\n    constructor() {\n      this._imageData = null;\n    }\n    copyFrom(atlas) {\n      if (atlas.imageData) {\n        this._imageData = atlas.imageData;\n        this._changed = true;\n      } else {\n        this.imageData = null;\n      }\n    }\n    update() {\n    }\n  }\n  let Atlas$2 = class Atlas extends AtlasBase {\n  };\n  class BufferBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get ids() {\n      return this._ids;\n    }\n    get dataView() {\n      return this._dataView;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get lookup() {\n      return this._lookup;\n    }\n    get length() {\n      return this._length;\n    }\n    get selected() {\n      return this._selected;\n    }\n    constructor(core, ids) {\n      this._core = core;\n      this._ids = ids;\n      this._length = ids.length;\n      this._vertices = new ArrayBuffer(this._length * UnitVertex.SIZE_BYTES);\n      this._dataView = new DataView(this._vertices);\n      this._selected = /* @__PURE__ */ new Set();\n      this.from = 0;\n      this.to = 1;\n      this.unitType = UnitType.block;\n      this._lookup = {};\n      for (let i = 0; i < this._length; i++) {\n        const id2 = ids[i];\n        this._lookup[id2] = i;\n        UnitVertex.setRotation(this._dataView, i, Constants$1.QUAT_IDENTITY);\n      }\n    }\n    createShared() {\n      const buffer = Object.create(this);\n      buffer._vertices = new ArrayBuffer(buffer._vertices.byteLength);\n      buffer._dataView = new DataView(buffer._vertices);\n      return buffer;\n    }\n    copyFrom(buffer) {\n      const start = window.performance.now();\n      const fromDataView = buffer.dataView;\n      const toDataView = this._dataView;\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < this._length; i++) {\n        const index2 = lookup2[this._ids[i]];\n        if (index2 != null) {\n          UnitVertex.copyIdHover(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTranslation(fromDataView, index2, toDataView, i);\n          UnitVertex.copyScale(fromDataView, index2, toDataView, i);\n          UnitVertex.copyRotation(fromDataView, index2, toDataView, i);\n          UnitVertex.copyColor(fromDataView, index2, toDataView, i);\n          UnitVertex.copySelected(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMaterial(fromDataView, index2, toDataView, i);\n          UnitVertex.copyRounding(fromDataView, index2, toDataView, i);\n          UnitVertex.copyOrder(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTexCoord(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTexture(fromDataView, index2, toDataView, i);\n          UnitVertex.copySdfBuffer(fromDataView, index2, toDataView, i);\n          UnitVertex.copySdfBorder(fromDataView, index2, toDataView, i);\n          UnitVertex.copyParameter1(fromDataView, index2, toDataView, i);\n          UnitVertex.copyParameter2(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatId(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatColor(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatFuzz(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatRefractiveIndex(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatGloss(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatDensity(fromDataView, index2, toDataView, i);\n          UnitVertex.copySegColor(fromDataView, index2, toDataView, i);\n        } else {\n          UnitVertex.setRotation(toDataView, i, Constants$1.QUAT_IDENTITY);\n        }\n      }\n      this.unitType = buffer.unitType;\n      this._selected = buffer.selected;\n      this._core.log.write(LogLevel.info, `buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update() {\n    }\n    updateSelection(options2) {\n      const start = window.performance.now();\n      const ids = options2 && options2.ids ? options2.ids : this._ids;\n      const offset2 = options2 && options2.offset !== void 0 ? options2.offset : 0;\n      const count2 = options2 && options2.count !== void 0 ? options2.count : ids.length;\n      const selection = this._selected.size > 0;\n      const dataView = this._dataView;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = this._lookup[id2];\n        UnitVertex.setSelected(dataView, index2, selection ? this._selected.has(id2) ? 1 : -1 : 0);\n      }\n      this.update();\n      this._core.log.write(LogLevel.info, `buffer update selection ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  class TransitionBufferBase {\n    get pickIdLookup() {\n      return this._pickIdLookup;\n    }\n    get currentBuffer() {\n      return this._isBuffer1Current ? this._buffer1 : this._buffer2;\n    }\n    get previousBuffer() {\n      return this._isBuffer1Current ? this._buffer2 : this._buffer1;\n    }\n    get currentPalette() {\n      return this._isBuffer1Current ? this._palette1 : this._palette2;\n    }\n    get previousPalette() {\n      return this._isBuffer1Current ? this._palette2 : this._palette1;\n    }\n    get currentAtlas() {\n      return this._isBuffer1Current ? this._atlas1 : this._atlas2;\n    }\n    get previousAtlas() {\n      return this._isBuffer1Current ? this._atlas2 : this._atlas1;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get length() {\n      return this._length;\n    }\n    constructor(core, ids, bufferType, paletteType, atlasType) {\n      this.bufferType = bufferType;\n      this.paletteType = paletteType;\n      this.atlasType = atlasType;\n      this._core = core;\n      this._length = ids.length;\n      this.id = TransitionBufferBase._id++;\n      this.isVisible = true;\n      this.transitionTime = 1;\n      this.activeId = -1;\n      const start = window.performance.now();\n      this._buffer1 = new bufferType(core, ids);\n      this._buffer2 = this._buffer1.createShared();\n      this._palette1 = new paletteType();\n      this._palette2 = new paletteType();\n      this._atlas1 = new atlasType();\n      this._atlas2 = new atlasType();\n      this.isPickingEnabled = true;\n      this._pickIdLookup = {};\n      const dataView1 = this._buffer1.dataView;\n      const dataView2 = this._buffer2.dataView;\n      const _vec4 = create$5();\n      this.idColors = new Float32Array(this._length * 4);\n      this._buffer1.idColors = this.idColors;\n      this._buffer2.idColors = this.idColors;\n      for (let i = 0; i < this._length; i++) {\n        const id2 = ids[i];\n        const pickId = PickHelper.nextPickId();\n        this._pickIdLookup[pickId] = id2;\n        PickHelper.encodeNumber(pickId, PickType.data, _vec4);\n        this.idColors[i * 4] = _vec4[0];\n        this.idColors[i * 4 + 1] = _vec4[1];\n        this.idColors[i * 4 + 2] = _vec4[2];\n        this.idColors[i * 4 + 3] = _vec4[3];\n        UnitVertex.setIdColor(dataView1, i, _vec4);\n        UnitVertex.setIdColor(dataView2, i, _vec4);\n      }\n      this._core.log.write(LogLevel.info, `transition buffer created ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    swap() {\n      this._isBuffer1Current = !this._isBuffer1Current;\n    }\n    copyFrom(transitionBuffer) {\n      const start = window.performance.now();\n      this.key = transitionBuffer.key;\n      this.isVisible = transitionBuffer.isVisible;\n      this.transitionTime = transitionBuffer.transitionTime;\n      this.isPickingEnabled = transitionBuffer.isPickingEnabled;\n      this.unitType = transitionBuffer.unitType;\n      this.activeId = transitionBuffer.activeId;\n      this.currentBuffer.copyFrom(transitionBuffer.currentBuffer);\n      this.previousBuffer.copyFrom(transitionBuffer.previousBuffer);\n      this.currentBuffer.update();\n      this.previousBuffer.update();\n      this.currentPalette.copyFrom(transitionBuffer.currentPalette);\n      this.previousPalette.copyFrom(transitionBuffer.previousPalette);\n      this.currentAtlas.copyFrom(transitionBuffer.currentAtlas);\n      this.previousAtlas.copyFrom(transitionBuffer.previousAtlas);\n      this._core.log.write(LogLevel.info, `transition buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  TransitionBufferBase._id = 1;\n  let Buffer$3 = class Buffer extends BufferBase {\n    constructor(core, ids) {\n      super(core, ids);\n    }\n  };\n  let TransitionBuffer$2 = class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$3, Palette$3, Atlas$2);\n    }\n  };\n  class DebugAxes {\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    initialize() {\n      let vertexOffset = 0;\n      let indexOffset = 0;\n      const axisVertices = Cube.POSITIONS;\n      const axisIndices2 = Cube.INDICES;\n      this._vertices = new ArrayBuffer(3 * PositionColorVertex.SIZE_BYTES * axisVertices.length / PositionVertex.SIZE);\n      const verticesView = new DataView(this._vertices);\n      this._indices = new Uint16Array(3 * axisIndices2.length + 4);\n      const vertexCount = axisVertices.length / PositionVertex.SIZE;\n      const indexCount = axisIndices2.length;\n      const transform2 = create$7();\n      const length2 = 1;\n      const width2 = 0.01;\n      transform2[0] = length2;\n      transform2[5] = width2;\n      transform2[10] = width2;\n      transform2[12] = 0.5;\n      transform2[13] = 0;\n      transform2[14] = 0;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants$1.VECTOR3_UNITX, transform2, vertexOffset, indexOffset);\n      indexOffset += indexCount;\n      this._indices[indexOffset++] = axisIndices2[indexCount - 1] + vertexOffset;\n      vertexOffset += vertexCount;\n      this._indices[indexOffset++] = axisIndices2[0] + vertexOffset;\n      transform2[0] = width2;\n      transform2[5] = length2;\n      transform2[10] = width2;\n      transform2[12] = 0;\n      transform2[13] = 0.5;\n      transform2[14] = 0;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants$1.VECTOR3_UNITY, transform2, vertexOffset, indexOffset);\n      indexOffset += indexCount;\n      this._indices[indexOffset++] = axisIndices2[indexCount - 1] + vertexOffset;\n      vertexOffset += vertexCount;\n      this._indices[indexOffset++] = axisIndices2[0] + vertexOffset;\n      transform2[0] = width2;\n      transform2[5] = width2;\n      transform2[10] = length2;\n      transform2[12] = 0;\n      transform2[13] = 0;\n      transform2[14] = 0.5;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants$1.VECTOR3_UNITZ, transform2, vertexOffset, indexOffset);\n      this._indexCount = this._indices.length;\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    _createAxis(axisVertices, axisIndices2, verticesView, indices, color2, transform2, vertexOffset, indexOffset) {\n      const position2 = create$6();\n      const vertexCount = axisVertices.length / PositionVertex.SIZE;\n      const indexCount = axisIndices2.length;\n      for (let i = 0; i < vertexCount; i++) {\n        set$8(position2, axisVertices[i * PositionVertex.SIZE], axisVertices[i * PositionVertex.SIZE + 1], axisVertices[i * PositionVertex.SIZE + 2]);\n        transformMat4$2(position2, position2, transform2);\n        PositionColorVertex.setPosition(verticesView, vertexOffset + i, position2);\n        PositionColorVertex.setColor(verticesView, vertexOffset + i, color2);\n      }\n      for (let i = 0; i < indexCount; i++) {\n        indices[indexOffset + i] = axisIndices2[i] + vertexOffset;\n      }\n    }\n  }\n  var __awaiter$3 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class RendererConfig {\n    reset() {\n    }\n  }\n  class RendererBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get config() {\n      return this._config;\n    }\n    get devicePixelRatio() {\n      return this._devicePixelRatio;\n    }\n    get width() {\n      return this._canvas.width;\n    }\n    set width(value2) {\n      this._options.width = value2;\n    }\n    get height() {\n      return this._canvas.height;\n    }\n    set height(value2) {\n      this._options.height = value2;\n    }\n    get webXRReferenceSpace() {\n      return this._webXRReferenceSpace;\n    }\n    get pickedType() {\n      return this._pickedType;\n    }\n    get pickedId() {\n      return this._pickedId;\n    }\n    get isCapturingPickImage() {\n      return this._isCapturingPickImage;\n    }\n    capturePickImage() {\n      this._isCapturingPickImage = true;\n    }\n    get backgroundColor() {\n      return this._backgroundColor;\n    }\n    set backgroundColor(value2) {\n      if (!exactEquals(value2, this._backgroundColor)) {\n        this._backgroundColor = value2;\n      }\n    }\n    get ambientColor() {\n      return this._ambientColor;\n    }\n    set ambientColor(value2) {\n      if (!exactEquals$1(value2, this._ambientColor)) {\n        this._ambientColor = value2;\n      }\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    swapAxes() {\n      this._isAxes1Current = !this._isAxes1Current;\n    }\n    createCartesian2dAxesVisual(axes) {\n      return new AxesVisual(axes);\n    }\n    createCartesian3dAxesVisual(axes) {\n      return new AxesVisual(axes);\n    }\n    _createDebugAxesVisual(debugAxes) {\n      return null;\n    }\n    createLabelSetVisual(labelSet) {\n      return new LabelSetVisual$2(labelSet);\n    }\n    createControllerVisual(controller) {\n      return new ControllerVisual$1(controller);\n    }\n    createTransitionBuffer(ids) {\n      return new TransitionBuffer$2(this._core, ids);\n    }\n    createImageVisual(image2) {\n      return new ImageVisual$2(image2);\n    }\n    createFontVisual(font2) {\n      return new FontVisual$2(font2);\n    }\n    constructor(options2) {\n      this._options = options2;\n      this.fonts = {};\n    }\n    get isWebXRSupported() {\n      return false;\n    }\n    initialize(core) {\n      this._core = core;\n      this._canvas = document.createElement(\"canvas\");\n      const contextmenu = this._options && this._options.contextmenu;\n      if (!contextmenu) {\n        this._canvas.addEventListener(\"contextmenu\", (e) => {\n          e.preventDefault();\n        });\n      }\n      this._canvas.tabIndex = this._core.container.tabIndex;\n      this._canvas.style.display = \"block\";\n      this._canvas.style.touchAction = \"none\";\n      this._core.container.appendChild(this._canvas);\n      this._mvMatrices = [create$7(), create$7()];\n      this.pickPMatrix = create$7();\n      this.axesVisibility = AxesVisibility.current;\n      this._debugAxes = new DebugAxes();\n      this._debugAxesVisual = this._createDebugAxesVisual(this._debugAxes);\n      this.transitionTime = 1;\n      this.transitionBuffers = [];\n      this.areLabelsVisible = true;\n      this.labelSets = [];\n      this.controllers = [];\n      this.areImagesVisible = true;\n      this.images = [];\n      this._viewports = [new DOMRect(), new DOMRect()];\n      this.isPickingEnabled = false;\n      this._pickedType = PickType.none;\n      this._pickedId = 0;\n      this._lassoMMatrix = create$7();\n      this._lassoThickness = create$3();\n      this._resizeMinimumDelay = -1;\n      this._previousResizeWidth = -1;\n      this._previousResizeHeight = -1;\n    }\n    remove() {\n      this._core.container.removeChild(this._canvas);\n    }\n    finalize() {\n      this._isInitialized = false;\n    }\n    setSize(elapsedTime) {\n      if (this._options && this._options.width && this._options.height) {\n        this._devicePixelRatio = 1;\n        this._resizeWidth = this._options.width;\n        this._resizeHeight = this._options.height;\n      } else {\n        this._devicePixelRatio = window.devicePixelRatio || 1;\n        this._resizeWidth = this._core.container.clientWidth * devicePixelRatio;\n        this._resizeHeight = this._core.container.clientHeight * devicePixelRatio;\n      }\n      if (this._resizeWidth != this._previousResizeWidth || this._resizeHeight != this._previousResizeHeight) {\n        this._previousResizeWidth = this._resizeWidth;\n        this._previousResizeHeight = this._resizeHeight;\n        this._isResizing = true;\n        this._resizeElapsedTime = elapsedTime;\n      }\n      if (this._isResizing) {\n        if (this._resizeElapsedTime > this._resizeMinimumDelay && this._isInitialized) {\n          this._isResizing = false;\n          this._resizeMinimumDelay = this._core.config.resizeMinimumDelay;\n          this._resize(this._resizeWidth, this._resizeHeight);\n        } else {\n          this._resizeElapsedTime += elapsedTime;\n        }\n      }\n    }\n    _resize(width2, height2) {\n      this._canvas.style.width = `${Math.floor(width2 / this._devicePixelRatio)}px`;\n      this._canvas.style.height = `${Math.floor(height2 / this._devicePixelRatio)}px`;\n      width2 = Math.floor(width2);\n      height2 = Math.floor(height2);\n      this._canvas.width = width2;\n      this._canvas.height = height2;\n    }\n    update(elapsedTime) {\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        if (transitionBuffer.isVisible) {\n          const previous = transitionBuffer.previousPalette;\n          const current = transitionBuffer.currentPalette;\n          if (previous) {\n            previous.update();\n          }\n          if (current) {\n            current.update();\n          }\n        }\n      }\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        if (transitionBuffer.isVisible) {\n          const previous = transitionBuffer.previousAtlas;\n          const current = transitionBuffer.currentAtlas;\n          if (previous) {\n            previous.update();\n          }\n          if (current) {\n            current.update();\n          }\n        }\n      }\n      if (this._core.config.isDebugVisible) {\n        if (this._debugAxesVisual) {\n          this._debugAxesVisual.mMatrix = this.mMatrix;\n          this._debugAxesVisual.vMatrices = this.vMatrices;\n          this._debugAxesVisual.pMatrices = this.pMatrices;\n          this._debugAxesVisual.viewports = this._viewports;\n          this._debugAxesVisual.viewportOffset = this._viewportOffset;\n          this._debugAxesVisual.viewportCount = this._viewportCount;\n        }\n      }\n      if (this.areLabelsVisible) {\n        for (let i = 0; i < this.labelSets.length; i++) {\n          const labelSetVisual = this.labelSets[i];\n          if (labelSetVisual.isVisible) {\n            this.labelSets[i].label.update(elapsedTime);\n            labelSetVisual.mMatrix = this.mMatrix;\n            labelSetVisual.vMatrices = this.vMatrices;\n            labelSetVisual.pMatrices = this.pMatrices;\n            labelSetVisual.isPickingEnabled = this.isPickingEnabled;\n            labelSetVisual.pickPMatrix = this.pickPMatrix;\n            labelSetVisual.pickVMatrix = this.pickVMatrix;\n            labelSetVisual.viewports = this._viewports;\n            labelSetVisual.viewportOffset = this._viewportOffset;\n            labelSetVisual.viewportCount = this._viewportCount;\n            labelSetVisual.update(elapsedTime);\n          }\n        }\n      }\n      if (this.areImagesVisible) {\n        for (let i = 0; i < this.images.length; i++) {\n          const imageVisual = this.images[i];\n          if (imageVisual && imageVisual.isVisible) {\n            const image2 = this.images[i].image;\n            image2.update(elapsedTime);\n            imageVisual.mMatrix = this.mMatrix;\n            imageVisual.vMatrices = this.vMatrices;\n            imageVisual.pMatrices = this.pMatrices;\n            imageVisual.isPickingEnabled = this.isPickingEnabled;\n            imageVisual.pickPMatrix = this.pickPMatrix;\n            imageVisual.pickVMatrix = this.pickVMatrix;\n            imageVisual.viewports = this._viewports;\n            imageVisual.viewportOffset = this._viewportOffset;\n            imageVisual.viewportCount = this._viewportCount;\n            imageVisual.update(elapsedTime);\n          }\n        }\n      }\n      for (let i = 0; i < this.controllers.length; i++) {\n        const controllerVisual = this.controllers[i];\n        if (controllerVisual.isVisible) {\n          const controller = this.controllers[i].controller;\n          controller.update(elapsedTime);\n          controllerVisual.vMatrices = this.vMatrices;\n          controllerVisual.inverseVMatrices = this.vMatrices;\n          controllerVisual.pMatrices = this.pMatrices;\n          controllerVisual.viewports = this._viewports;\n          controllerVisual.viewportOffset = this._viewportOffset;\n          controllerVisual.viewportCount = this._viewportCount;\n          controllerVisual.update(elapsedTime);\n        }\n      }\n      const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n      if (axesVisuals) {\n        for (let i = 0; i < axesVisuals.length; i++) {\n          const axesVisual = axesVisuals[i];\n          if (axesVisual.isVisible) {\n            const axes = axesVisual.axes;\n            axes.mMatrix = this.mMatrix;\n            axes.vMatrix = this.vMatrices[0];\n            axes.update(elapsedTime);\n            axesVisual.vMatrices = this.vMatrices;\n            axesVisual.pMatrices = this.pMatrices;\n            axesVisual.isPickingEnabled = this.isPickingEnabled;\n            axesVisual.pickPMatrix = this.pickPMatrix;\n            axesVisual.pickVMatrix = this.pickVMatrix;\n            axesVisual.viewports = this._viewports;\n            axesVisual.viewportOffset = this._viewportOffset;\n            axesVisual.viewportCount = this._viewportCount;\n            axesVisual.update(elapsedTime);\n          }\n        }\n      }\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        const font2 = fontVisual.font;\n        font2.update();\n        fontVisual.update();\n      }\n    }\n    getVertexPosition(position2, pickedId) {\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        const id2 = transitionBuffer.pickIdLookup[pickedId];\n        if (id2 > -1) {\n          const index2 = transitionBuffer.currentBuffer.lookup[id2];\n          const dataView = transitionBuffer.currentBuffer.dataView;\n          UnitVertex.getTranslation(dataView, index2, position2);\n          break;\n        }\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$3(this, void 0, void 0, function* () {\n      });\n    }\n    prepare(xrFrame) {\n    }\n    initializeWebXR(session) {\n      return null;\n    }\n  }\n  let Quad$2 = class Quad {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const _vec3 = fromValues$3(2, 2, 2);\n      const _mat4 = create$7();\n      fromScaling(_mat4, _vec3);\n      const vertices = Quad$3.positions(_mat4);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$3.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  let Atlas$1 = class Atlas extends AtlasBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([255, 255, 255, 255]));\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._imageData) {\n        this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Palette$2 = class Palette extends PaletteBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._colors) {\n        const colors2 = new Uint8Array(this._colors);\n        for (let i = 0; i < colors2.length; i++) {\n          colors2[i] = Math.pow(colors2[i] / 255, 2.2) * 255;\n        }\n        this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors2);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Buffer$2 = class Buffer extends BufferBase {\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update() {\n      if (this._isInitialized) {\n        const start = window.performance.now();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n        this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n      }\n    }\n  };\n  let TransitionBuffer$1 = class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$2, Palette$2, Atlas$1);\n    }\n    initializeContext(gl) {\n      this._buffer1.initializeContext(gl);\n      this._buffer2.initializeContext(gl);\n      this._palette1.initializeContext(this._core, gl);\n      this._palette2.initializeContext(this._core, gl);\n      this._atlas1.initializeContext(this._core, gl);\n      this._atlas2.initializeContext(this._core, gl);\n      this._isInitialized = true;\n    }\n  };\n  let Config$1 = class Config extends RendererConfig {\n    constructor() {\n      super();\n      this.reset();\n    }\n    reset() {\n      this.specularIntensity = 0.15;\n      this.specularPower = 150;\n      this.lightPosition = fromValues$3(-0.5, 0.5, 0);\n      this.ambient = 0.01;\n      const _quat1 = create$4();\n      const _quat2 = create$4();\n      let angle2 = AngleHelper.degreesToRadians(15);\n      setAxisAngle(_quat1, Constants$1.VECTOR3_UNITX, angle2);\n      multiply(_quat2, _quat1, _quat2);\n      angle2 = AngleHelper.degreesToRadians(-15);\n      setAxisAngle(_quat1, Constants$1.VECTOR3_UNITY, angle2);\n      multiply(_quat2, _quat2, _quat1);\n      this.directionToLight = create$6();\n      transformQuat(this.directionToLight, Constants$1.VECTOR3_UNITZ, _quat2);\n      this.halfAngle = create$6();\n      add$4(this.halfAngle, Constants$1.VECTOR3_UNITZ, this.directionToLight);\n      normalize$5(this.halfAngle, this.halfAngle);\n      this.isFxaaEnabled = false;\n    }\n  };\n  let Resources$1 = class Resources {\n    bindFramebuffer(framebuffer) {\n      if (this.framebuffer != framebuffer) {\n        this.framebuffer = framebuffer;\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n      }\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this.framebuffer = this._gl.createFramebuffer();\n      this.ANGLE_instanced_arrays = gl.getExtension(\"ANGLE_instanced_arrays\");\n      this.OES_standard_derivatives = gl.getExtension(\"OES_standard_derivatives\");\n      this.EXT_frag_depth = gl.getExtension(\"EXT_frag_depth\");\n      this.OES_element_index_uint = gl.getExtension(\"OES_element_index_uint\");\n      this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n  };\n  Resources$1.glsl = {\n    \"anaglyph.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nconst vec3 LEFT_MASK = vec3(1.0, 0.0, 0.0);\\nconst vec3 RIGHT_MASK = vec3(0.0, 1.0, 1.0);\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 color = LEFT_MASK * dot(texture2D(uSampler1, texCoords).rgb, LUMINANCE);\\ncolor += RIGHT_MASK * dot(texture2D(uSampler2, texCoords).rgb, LUMINANCE);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n',\n    \"color.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec3 vColor;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(vColor, GAMMA), 1.0);\\n}\\n',\n    \"color.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec3 aColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying lowp vec3 vColor;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvColor = aColor;\\n}\\n\",\n    \"lasso.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\ngl_FragColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n',\n    \"lasso.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"model.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform sampler2D uSampler;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(texture2D(uSampler, vTexCoord).xyz, GAMMA), 1.0);\\nvec3 color = texture2D(uSampler, vTexCoord).xyz;\\nfloat ambient = 0.01;\\nvec3 normal = normalize(vNormal);\\nfloat diffuse = 0.5 * max(dot(uDirectionToLight, normal), 0.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (ambient + diffuse);\\ncolor += specular;\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n',\n    \"model.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nvTexCoord = aTexCoord;\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(aNormal, 0.0));\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\n}\\n\",\n    \"pickgrid.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#define Derivatives\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nuniform vec3 uDirectionToLight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick)\\n{\\ngl_FragColor = vColor;\\n}\\nelse\\n{\\nvec2 buffer;\\n#ifdef Derivatives\\nbuffer = fwidth(vTexCoord);\\n#else\\nbuffer = vec2(0.002);\\n#endif\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nfloat diffuse = 0.2 * max(dot(uDirectionToLight, vNormal), 0.0);\\nfloat ambient = 0.8;\\ncolor.xyz *= (ambient + diffuse);\\ncolor.xyz = pow(color.xyz, GAMMA);\\ngl_FragColor = color;\\n}\\n}\\n',\n    \"pickgrid.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec4 aIdColor;\\nattribute mediump vec2 aTexCoord;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#define Derivatives\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse {\\nfloat distance = texture2D(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\ngl_FragColor = vec4(pow(mix(uBorderColor, mix(uColor, uHoverColor, vHover), value), GAMMA), 1.0);\\n}\\n}\\n',\n    \"sdftext.vertex.fx\": \"#version 100\\nattribute lowp vec4 aIdColor;\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nif (uPick) {\\ngl_FragColor = vec4(0.0);\\n}\\nelse {\\ngl_FragColor = vec4(texture2D(uSampler, vTexCoord).xyz, 1.0);\\n}\\n}\\n\",\n    \"texture.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": '#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void)\\n{\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n',\n    \"unitblock.vertex.fx\": '#version 100\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitcylinder.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - sqrt(h1);\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - sqrt(h2);\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unitcylinder.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unithexprism.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform mat4 uVMatrix;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nvec4 iHexPrism( in vec3 ro, in vec3 rd, in float ra, in float he )\\n{\\nconst vec3 n1 = vec3( 1.0,0.0,0.0);\\nconst vec3 n2 = vec3( 0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n3 = vec3(-0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n4 = vec3( 0.0,1.0,0.0);\\nvec3 t1 = vec3((vec2(ra,-ra)-dot(ro,n1))/dot(rd,n1), 1.0);\\nvec3 t2 = vec3((vec2(ra,-ra)-dot(ro,n2))/dot(rd,n2), 1.0);\\nvec3 t3 = vec3((vec2(ra,-ra)-dot(ro,n3))/dot(rd,n3), 1.0);\\nvec3 t4 = vec3((vec2(he,-he)-dot(ro,n4))/dot(rd,n4), 1.0);\\nif( t1.y<t1.x ) t1=vec3(t1.yx,-1.0);\\nif( t2.y<t2.x ) t2=vec3(t2.yx,-1.0);\\nif( t3.y<t3.x ) t3=vec3(t3.yx,-1.0);\\nif( t4.y<t4.x ) t4=vec3(t4.yx,-1.0);\\nvec4 tN=vec4(t1.x,t1.z*n1);\\nif( t2.x>tN.x ) tN=vec4(t2.x,t2.z*n2);\\nif( t3.x>tN.x ) tN=vec4(t3.x,t3.z*n3);\\nif( t4.x>tN.x ) tN=vec4(t4.x,t4.z*n4);\\nfloat tF = min(min(t1.y,t2.y),min(t3.y,t4.y));\\nif( tN.x>tF || tF<0.0) return vec4(-1.0);\\nreturn tN;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = -vViewCenter;\\nmat3 rot = mat3(uVMatrix);\\nvec3 rdd = rd * rot;\\nvec3 roo = ro * rot;\\nvec4 tnor = iHexPrism(roo, rdd, vRadius * vScaling, vHeight * vScaling);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = rot * tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unithexprism.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvRadius = 0.0;\\nvHeight = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvRadius = scale.x * ROOT_THREE_OVER_TWO;\\nvHeight = scale.y;\\nvec3 position = aPosition;\\nposition.y *= scale.y;\\nposition.z *= scale.x;\\nposition.x *= scale.x * ROOT_THREE_OVER_TWO;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvScaling = length(uMMatrix[0].xyz) / 2.0;\\n}\\n}\\n',\n    \"unitsdf.fragment.fx\": '#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform vec3\t uBackgroundColor;\\nuniform float \t uBuffer;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nfloat distance = mix(texture2D(uPreviousSampler1, vPreviousTexCoord).r, texture2D(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer) {\\ndiscard;\\n}\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\nfloat uGamma = 0.0;\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer + gamma, uBuffer, distance);\\ngl_FragColor = vec4(mix(color, uBackgroundColor, value), 1.0);\\n}\\n}\\n',\n    \"unitsdf.vertex.fx\": '#version 100\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute mediump vec4 aTexCoord;\\nattribute mediump vec4 aPreviousTexCoord;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n',\n    \"unitsphere.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat sphIntersect(in vec3 ro, in vec3 rd, in vec4 sph)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot(oc, rd);\\nfloat c = dot(oc, oc) - sph.w * sph.w;\\nfloat h = b * b - c;\\nif (h < 0.0) return -1.0;\\nreturn -b - sqrt(h);\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unitsphere.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute lowp float aColor;\\nattribute lowp float aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump float vRadius;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec4 translation = vec4(mix(aPreviousTranslation, aTranslation, animation), 1.0);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * translation).xyz;\\ntranslation.xyz += aPosition * scale;\\nvViewPosition = (mvMatrix * translation).xyz;\\ngl_Position = uPMatrix * vec4(vViewPosition, 1.0);\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n',\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nmat3 transpose(in mat3 mat) {\\nvec3 i0 = mat[0];\\nvec3 i1 = mat[1];\\nvec3 i2 = mat[2];\\nreturn mat3\\n(\\nvec3(i0.x, i1.x, i2.x),\\nvec3(i0.y, i1.y, i2.y),\\nvec3(i0.z, i1.z, i2.z)\\n);\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n  };\n  let ShaderBase$1 = class ShaderBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    set vertexBuffer(value2) {\n      if (this._vertexBuffer != value2) {\n        this._vertexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    set indexBuffer(value2) {\n      if (this._indexBuffer != value2) {\n        this._indexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    constructor(core, main) {\n      this._core = core;\n      this._main = main;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n      const program = this._gl.createProgram();\n      this._gl.attachShader(program, vs);\n      this._gl.attachShader(program, fs);\n      this._gl.linkProgram(program);\n      if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n      }\n      return program;\n    }\n    _compileShader(source2, type2) {\n      const shader = this._gl.createShader(type2);\n      this._gl.shaderSource(shader, source2);\n      this._gl.compileShader(shader);\n      if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n      }\n      return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n      const remove2 = `#define ${directive}`;\n      const index2 = shaderSource.indexOf(remove2);\n      shaderSource = index2 == -1 ? shaderSource : shaderSource.substring(0, index2) + shaderSource.substring(index2 + remove2.length);\n      return shaderSource;\n    }\n    prepare() {\n      if (this._program != this._main.shaderResources.currentProgram) {\n        if (this._main.shaderResources.currentShader) {\n          this._main.shaderResources.currentShader.disableProgram();\n        }\n        this.enableProgram(this._program);\n        this.updateBuffers();\n        this.updateTextures();\n      } else {\n        if (this._haveBuffersChanged) {\n          this.updateBuffers();\n        }\n        if (this._haveTexturesChanged) {\n          this.updateTextures();\n        }\n      }\n    }\n    apply() {\n    }\n    applyModel() {\n    }\n    applyView() {\n    }\n    enableProgram(program) {\n      this._gl.useProgram(program);\n      this._main.shaderResources.currentProgram = program;\n      this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n      this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n      this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n      this._main.shaderResources.currentShader = null;\n      this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n      callback(this._includesFromFile(Resources$1.glsl[vsName]), this._includesFromFile(Resources$1.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n      this._sourceFromUrl(vsName, (vsSource) => {\n        this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n          this._sourceFromUrl(fsName, (fsSource) => {\n            this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n              callback(vsIncSource, fsIncSource);\n            });\n          });\n        });\n      });\n    }\n    _sourceFromUrl(url, callback) {\n      const request2 = new XMLHttpRequest();\n      request2.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n      request2.onreadystatechange = () => {\n        if (request2.readyState == XMLHttpRequest.DONE && request2.status == 200) {\n          callback(request2.responseText);\n        }\n      };\n      request2.send();\n    }\n    _includesFromFile(source2) {\n      let index2 = 0;\n      do {\n        index2 = source2.indexOf(\"#include\", index2);\n        if (index2 != -1) {\n          const start = source2.indexOf('\"', index2);\n          const end = source2.indexOf('\"', start + 1);\n          const name = source2.substring(start + 1, end);\n          const inc = Resources$1.glsl[name];\n          source2 = source2.substring(0, index2) + inc + source2.substring(end + 1);\n        }\n      } while (index2 != -1);\n      return source2;\n    }\n    _includesFromUrl(source2, index2, callback) {\n      index2 = source2.indexOf(\"#include\", index2);\n      if (index2 != -1) {\n        const start = source2.indexOf('\"', index2);\n        const end = source2.indexOf('\"', start + 1);\n        const name = source2.substring(start + 1, end);\n        this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n          source2 = source2.substring(0, index2) + include + source2.substring(end + 1);\n          this._includesFromUrl(source2, index2, callback);\n        });\n      } else {\n        callback(source2);\n      }\n    }\n  };\n  let Color$1 = class Color extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"color.vertex.fx\", \"color.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionColorVertex.SIZE_BYTES, PositionColorVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 3, this._gl.UNSIGNED_BYTE, true, PositionColorVertex.SIZE_BYTES, PositionColorVertex.COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  let Texture$1 = class Texture extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  };\n  let Lasso$3 = class Lasso extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n      this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  class Model extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"model.vertex.fx\", \"model.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n    }\n    applyView() {\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  let SdfText$1 = class SdfText extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n      this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n      this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n      this._gl.uniform1f(this._gammaUniform, this.gamma);\n      this._gl.uniform1f(this._bufferUniform, this.buffer);\n      this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  };\n  let PickGrid$1 = class PickGrid extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n      this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n      this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n      this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n      this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n      this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n      this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n      this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n      this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n      this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n      this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n      this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n      this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n      this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n      this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n      this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n      this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n      this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n      this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n      this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n      this._gl.uniform2fv(this._zeroUniform, this.zero);\n      this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._boundsAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  let UnitShader$1 = class UnitShader extends ShaderBase$1 {\n    get paletteTexture() {\n      return this._paletteTexture;\n    }\n    set paletteTexture(value2) {\n      if (this._paletteTexture != value2) {\n        this._paletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousPaletteTexture() {\n      return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value2) {\n      if (this._previousPaletteTexture != value2) {\n        this._previousPaletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get sdfTexture() {\n      return this._sdfTexture;\n    }\n    set sdfTexture(value2) {\n      if (this._sdfTexture != value2) {\n        this._sdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousSdfTexture() {\n      return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value2) {\n      if (this._previousSdfTexture != value2) {\n        this._previousSdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    set instanceBuffer(value2) {\n      if (this._instanceBuffer != value2) {\n        this._instanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    set previousInstanceBuffer(value2) {\n      if (this._previousInstanceBuffer != value2) {\n        this._previousInstanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    initializeData() {\n      this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n      this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n      this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n      this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n      this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n      this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n      this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n      this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n      this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n      this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n      this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n      this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n      this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._ambientUniform = gl.getUniformLocation(this._program, \"uAmbient\");\n      this._activeColorUniform = gl.getUniformLocation(this._program, \"uActiveColor\");\n      this._selectedColorUniform = gl.getUniformLocation(this._program, \"uSelectedColor\");\n      this._highlightModeUniform = gl.getUniformLocation(this._program, \"uHighlightMode\");\n      const vertices = Cube.POSITIONS;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Cube.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this.indexCount = indices.length;\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._updateCurrentBuffer();\n      this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n      this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._translationAttribute);\n      this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._scaleAttribute);\n      this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._selectedAttribute);\n      this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 1);\n      this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      if (this._previousInstanceBuffer != this._instanceBuffer) {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n      }\n      this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n      this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n      this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1f(this._timeUniform, this.time);\n      this._gl.uniform1f(this._durationUniform, this.duration);\n      this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n      this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n      this._gl.uniform1i(this._previousSampler0Uniform, 0);\n      this._gl.uniform1i(this._sampler0Uniform, 1);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n      this._gl.uniform1f(this._ambientUniform, this.ambient);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._activeColorUniform, this.activeColor);\n      this._gl.uniform3fv(this._selectedColorUniform, this.selectedColor);\n      this._gl.uniform1f(this._hoverUniform, this.hover);\n      this._gl.uniform1f(this._activeUniform, this.active);\n      this._gl.uniform1f(this._highlightModeUniform, this.highlightMode == HighlightMode.luminance ? 0 : 1);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n    }\n    updateTextures() {\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 0);\n    }\n  };\n  let UnitBlock$1 = class UnitBlock extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            vsSource = this._removeDirective(vsSource, \"Derivatives\");\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  };\n  let UnitSphere$1 = class UnitSphere extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n  };\n  let UnitCylinder$1 = class UnitCylinder extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  };\n  class UnitHexPrism extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unithexprism.vertex.fx\", \"unithexprism.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  }\n  let UnitSdf$1 = class UnitSdf extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            vsSource = this._removeDirective(vsSource, \"Derivatives\");\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n      this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n      this._sdfBufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._sdfBackgroundColorUniform = gl.getUniformLocation(this._program, \"uBackgroundColor\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n      super.apply();\n      this._gl.uniform1i(this._previousSampler1Uniform, 2);\n      this._gl.uniform1i(this._sampler1Uniform, 3);\n      this._gl.uniform1f(this._sdfBufferUniform, this.sdfBuffer);\n      this._gl.uniform3fv(this._sdfBackgroundColorUniform, this.sdfBackgroundColor);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 0);\n    }\n  };\n  class Anaglyph extends ShaderBase$1 {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"anaglyph.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n    }\n  }\n  class DebugAxesVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.colorShader.isInitialized;\n    }\n    constructor(core, main, debugAxes) {\n      this._main = main;\n      this._debugAxes = debugAxes;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._debugAxes.isInitialized) {\n        this._debugAxes.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._debugAxes.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._debugAxes.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const colorShader = this._main.colorShader;\n        const shaderResources = this._main.shaderResources;\n        colorShader.vertexBuffer = this._vertexBuffer;\n        colorShader.indexBuffer = this._indexBuffer;\n        colorShader.prepare();\n        colorShader.mMatrix = this.mMatrix;\n        colorShader.apply();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          colorShader.vMatrix = this.vMatrices[viewport];\n          colorShader.pMatrix = this.pMatrices[viewport];\n          colorShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._debugAxes.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  }\n  let AxesVisualBase$1 = class AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get axes() {\n      return this._axes;\n    }\n    constructor(core) {\n      this._core = core;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._renderGrid();\n        this._renderText();\n      }\n    }\n    _renderGrid() {\n    }\n    _renderText() {\n    }\n  };\n  let Cartesian2dVisual$1 = class Cartesian2dVisual extends AxesVisualBase$1 {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian2dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 2; edge++) {\n          const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n          if (axes.isEdgeVisible[edgeId]) {\n            if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n              indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n              indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n            } else {\n              indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n              indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n            }\n            if (indexCount > 0) {\n              shader.mMatrix = axes.getLabelMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n            indexCount = axes.getTitleIndexCount(axisId);\n            if (indexCount > 0) {\n              indexOffset = axes.getTitleIndexOffset(axisId);\n              shader.mMatrix = axes.getTitleMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n          indexCount = axes.getHeadingIndexCount(axisId);\n          if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n            indexOffset = axes.getHeadingIndexOffset(axisId);\n            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n            shader.applyModel();\n            shader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n              const viewport = i + this.viewportOffset;\n              shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n              this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n              shader.vMatrix = this.vMatrices[viewport];\n              shader.pMatrix = this.pMatrices[viewport];\n              shader.applyView();\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n              shader.isPickShader = true;\n              shader.pMatrix = this.pickPMatrix;\n              shader.vMatrix = this.pickVMatrix;\n              shader.applyView();\n              shaderResources.bindFramebuffer(this.pickFramebuffer);\n              this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.directionToLight = Constants$1.VECTOR3_UNITZ;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width3 = gridTicksScale[0];\n          const height3 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n            if (axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width3, height3);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      const axisId2 = 0;\n      const axisId3 = 1;\n      const width2 = size[axisId2];\n      const height2 = size[axisId3];\n      gridShader.zero = axes.gridFaceZero;\n      gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n      for (let face = 0; face < 2; face++) {\n        const faceId = face;\n        if (axes.getIsForwardFace(faceId)) {\n          this._renderGridFace(faceId, width2, height2);\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, this._axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, this._axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  };\n  let Cartesian3dVisual$1 = class Cartesian3dVisual extends AxesVisualBase$1 {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian3dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 4; edge++) {\n          const edgeId = Cube.AXIS_EDGES[axisId][edge];\n          if (axes.getIsOutsideEdge(edgeId)) {\n            if (axes.isEdgeVisible[edgeId]) {\n              if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n              } else {\n                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n              }\n              if (indexCount > 0) {\n                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n              indexCount = axes.getTitleIndexCount(axisId);\n              if (indexCount > 0) {\n                indexOffset = axes.getTitleIndexOffset(axisId);\n                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n            }\n            indexCount = axes.getHeadingIndexCount(axisId);\n            if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n              indexOffset = axes.getHeadingIndexOffset(axisId);\n              shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.directionToLight = Constants$1.VECTOR3_UNITZ;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width2 = gridTicksScale[0];\n          const height2 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.areFacesVisible[axisId]) {\n          const axisId2 = axisId == 0 ? 1 : 0;\n          const axisId3 = axisId == 2 ? 1 : 2;\n          const width2 = size[axisId2];\n          const height2 = size[axisId3];\n          gridShader.zero = axes.getGridFaceZero(axisId);\n          gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n          for (let face = 0; face < 2; face++) {\n            const faceId = Cube.AXIS_FACES[axisId][face];\n            if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n              this._renderGridFace(faceId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  };\n  class ControllerVisual {\n    get isInitialized() {\n      return this._isInitialized && this._modelShader.isInitialized && this._colorShader.isInitialized;\n    }\n    get controller() {\n      return this._controller;\n    }\n    constructor(core, main, controller) {\n      this._core = core;\n      this._main = main;\n      this._mMatrix = create$7();\n      this._vec3 = create$6();\n      this._controller = controller;\n      this._modelShader = main.modelShader;\n      this._colorShader = main.colorShader;\n      this.mMatrix = create$7();\n      this.rayMMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._controller.isInitialized) {\n        this._controller.initialize();\n      }\n      this._initialize(gl);\n    }\n    _initialize(gl) {\n      this._gl = gl;\n      this.modelTexture = TextureHelper.fromImage(gl, this._controller.texture, false, gl.LINEAR);\n      this._modelVertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._modelVertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._controller.vertices, gl.STATIC_DRAW);\n      this._modelIndexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._modelIndexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.indices, gl.STATIC_DRAW);\n      this._rayVertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._rayVertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._controller.rayVertices, gl.STATIC_DRAW);\n      this._rayIndexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._rayIndexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.rayIndices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._modelShader.vertexBuffer = this._modelVertexBuffer;\n        this._modelShader.indexBuffer = this._modelIndexBuffer;\n        this._modelShader.texture2D = this.modelTexture;\n        this._modelShader.prepare();\n        multiply$2(this._mMatrix, this._controller.useRayPose ? this.rayMMatrix : this.mMatrix, this._controller.mMatrix);\n        this._modelShader.mMatrix = this._mMatrix;\n        this._modelShader.specularPower = 10;\n        this._modelShader.specularIntensity = 0.01;\n        this._modelShader.apply();\n        this._modelShader.applyModel();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          this._modelShader.directionToLight = Constants$1.VECTOR3_UNITZ;\n          this._modelShader.halfAngle = Constants$1.VECTOR3_UNITZ;\n          this._modelShader.vMatrix = this.vMatrices[viewport];\n          this._modelShader.pMatrix = this.pMatrices[viewport];\n          this._modelShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._controller.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this.isRayVisible) {\n          this._colorShader.vertexBuffer = this._rayVertexBuffer;\n          this._colorShader.indexBuffer = this._rayIndexBuffer;\n          this._colorShader.prepare();\n          multiply$2(this._mMatrix, this.rayMMatrix, this._controller.rayMMatrix);\n          this._colorShader.mMatrix = this._mMatrix;\n          this._colorShader.apply();\n          this._colorShader.applyModel();\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            this._colorShader.vMatrix = this.vMatrices[viewport];\n            this._colorShader.pMatrix = this.pMatrices[viewport];\n            this._colorShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._controller.rayIndexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      }\n    }\n  }\n  let ImageVisual$1 = class ImageVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n      return this._image;\n    }\n    constructor(core, main, image2) {\n      this._core = core;\n      this._main = main;\n      this._image = image2;\n      this._image.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this.mMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._image.isInitialized) {\n        this._image.initialize();\n      }\n      this._gl = gl;\n      if (this._image.imageData) {\n        this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n      }\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const textureShader = this._main.textureShader;\n        const shaderResources = this._main.shaderResources;\n        textureShader.vertexBuffer = this._vertexBuffer;\n        textureShader.indexBuffer = this._indexBuffer;\n        textureShader.texture2D = this.texture;\n        textureShader.prepare();\n        textureShader.mMatrix = this.mMatrix;\n        textureShader.isPickShader = false;\n        textureShader.apply();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          textureShader.vMatrix = this.vMatrices[viewport];\n          textureShader.pMatrix = this.pMatrices[viewport];\n          textureShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this.isPickingEnabled) {\n          textureShader.isPickShader = true;\n          textureShader.vMatrix = this.pickVMatrix;\n          textureShader.pMatrix = this.pickPMatrix;\n          textureShader.applyView();\n          shaderResources.bindFramebuffer(this.pickFramebuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  };\n  let LabelVisualBase$1 = class LabelVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label2) {\n      this._core = core;\n      this._main = main;\n      this._label = label2;\n      this._label.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this._mMatrix = create$7();\n      this.mMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._label.isInitialized) {\n        this._label.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const indexCount = this._label.indexCount;\n        if (indexCount > 0) {\n          const shader = this._main.sdfTextShader;\n          const fontVisual = this._main.fonts[this._label.font.name];\n          shader.vertexBuffer = this._vertexBuffer;\n          shader.indexBuffer = this._indexBuffer;\n          shader.texture2D = fontVisual.texture;\n          shader.prepare();\n          shader.gamma = this._label.gamma;\n          shader.buffer = fontVisual.font.edgeValue / 255;\n          shader.borderWidth = this._label.borderWidth;\n          shader.color = this._label.color || this._core.config.textColor;\n          shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n          shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n          shader.pickedIdColor = this.pickedIdColor;\n          shader.apply();\n          multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n          shader.mMatrix = this._mMatrix;\n          shader.applyModel();\n          shader.isPickShader = false;\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            shader.vMatrix = this.vMatrices[viewport];\n            shader.pMatrix = this.pMatrices[viewport];\n            shader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n          }\n          if (this.isPickingEnabled) {\n            shader.isPickShader = true;\n            shader.pMatrix = this.pickPMatrix;\n            shader.vMatrix = this.pickVMatrix;\n            shader.applyView();\n            this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n          }\n        }\n      }\n    }\n  };\n  let LabelVisual$1 = class LabelVisual extends LabelVisualBase$1 {\n    get label() {\n      return this._label;\n    }\n    set text(value2) {\n      this._label.text = value2;\n    }\n    get text() {\n      return this._label.text;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  };\n  let LabelSetVisual$1 = class LabelSetVisual extends LabelVisualBase$1 {\n    get label() {\n      return this._label;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  };\n  let FontVisual$1 = class FontVisual {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get font() {\n      return this._font;\n    }\n    constructor(core, font2) {\n      this._core = core;\n      this._font = font2;\n      font2.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._isInitialized = true;\n      if (this._font.count > 0) {\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n        this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n      }\n    }\n  };\n  let Lasso$2 = class Lasso {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const vertices = Quad$3.textured(Constants$1.MAT4_IDENTITY);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$3.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  var __awaiter$2 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  let Main$1 = class Main extends RendererBase {\n    get shaderResources() {\n      return this._shaderResources;\n    }\n    get colorShader() {\n      return this._colorShader;\n    }\n    get textureShader() {\n      return this._textureShader;\n    }\n    get lassoShader() {\n      return this._lassoShader;\n    }\n    get modelShader() {\n      return this._modelShader;\n    }\n    get sdfTextShader() {\n      return this._sdfTextShader;\n    }\n    get gridShader() {\n      return this._gridShader;\n    }\n    get blockShader() {\n      return this._blockShader;\n    }\n    get sphereShader() {\n      return this._sphereShader;\n    }\n    get cyclinderShader() {\n      return this._cylinderShader;\n    }\n    get hexPrismShader() {\n      return this._hexPrismShader;\n    }\n    get sdfShader() {\n      return this._sdfShader;\n    }\n    get anaglyphShader() {\n      return this._anaglyphShader;\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    get config() {\n      return this._config;\n    }\n    constructor(options2) {\n      super(options2);\n      this._config = new Config$1();\n      this._quad = new Quad$2();\n      this._lasso = new Lasso$2();\n      this._pickedPixels = new Uint8Array(4);\n      this._pickedIdColor = create$5();\n      this._mat3 = create$8();\n      this._directionToCamera = create$6();\n      this._directionToLight = create$6();\n      this._halfAngle = create$6();\n      this._cameraPosition = create$6();\n      this._modelPosition = create$6();\n      this.depthEnabled = true;\n    }\n    get isSupported() {\n      return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    get isWebXRSupported() {\n      return true;\n    }\n    initialize(core) {\n      super.initialize(core);\n      this._shaderResources = new Resources$1();\n      this._colorShader = new Color$1(this._core, this);\n      this._textureShader = new Texture$1(this._core, this);\n      this._lassoShader = new Lasso$3(this._core, this);\n      this._modelShader = new Model(this._core, this);\n      this._sdfTextShader = new SdfText$1(this._core, this);\n      this._gridShader = new PickGrid$1(this._core, this);\n      this._anaglyphShader = new Anaglyph(this._core, this);\n      this._blockShader = new UnitBlock$1(this._core, this);\n      this._sphereShader = new UnitSphere$1(this._core, this);\n      this._cylinderShader = new UnitCylinder$1(this._core, this);\n      this._hexPrismShader = new UnitHexPrism(this._core, this);\n      this._sdfShader = new UnitSdf$1(this._core, this);\n      this._initializeContext(this._createContext(this._canvas));\n      this._canvas.addEventListener(\"webglcontextlost\", (event2) => {\n        this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n        this._isInitialized = false;\n        event2.preventDefault();\n      }, false);\n      this._canvas.addEventListener(\"webglcontextrestored\", () => {\n        this._initializeContext(this._createContext(this._canvas));\n        this._isInitialized = true;\n        this._core.log.write(LogLevel.info, \"WebGL context restored\");\n      }, false);\n      this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n      this._gl = gl;\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        fontVisual.initializeContext(gl);\n      }\n      this._shaderResources.initializeContext(this._gl);\n      this._colorShader.initializeContext(this._gl);\n      this._textureShader.initializeContext(this._gl);\n      this._lassoShader.initializeContext(this._gl);\n      this._modelShader.initializeContext(this._gl);\n      this._sdfTextShader.initializeContext(this._gl);\n      this._gridShader.initializeContext(this._gl);\n      this._anaglyphShader.initializeContext(this._gl);\n      this._blockShader.initializeContext(this._gl);\n      this._sphereShader.initializeContext(this._gl);\n      this._cylinderShader.initializeContext(this._gl);\n      this._hexPrismShader.initializeContext(this._gl);\n      this._sdfShader.initializeContext(this._gl);\n      this._quad.initializeContext(this._gl);\n      this._lasso.initializeContext(this._gl);\n      this._debugAxesVisual.initializeContext(this._gl);\n      this._framebuffers = [null, null];\n      const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, this._core.config.pickWidth, this._core.config.pickHeight);\n      const framebuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(framebuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._pickFrameBuffer = framebuffer;\n      this._anaglyphTextures = [null, null];\n      this.anaglyphFramebuffers = [null, null];\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        this.transitionBuffers[i].initializeContext(this._gl);\n      }\n      if (this._axes1) {\n        for (let i = 0; i < this._axes1.length; i++) {\n          this._axes1[i].initializeContext(this._gl);\n        }\n      }\n      if (this._axes2) {\n        for (let i = 0; i < this._axes2.length; i++) {\n          this._axes2[i].initializeContext(this._gl);\n        }\n      }\n      for (let i = 0; i < this.labelSets.length; i++) {\n        this.labelSets[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.images.length; i++) {\n        this.images[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.controllers.length; i++) {\n        this.controllers[i].initializeContext(this._gl);\n      }\n    }\n    _resize(width2, height2) {\n      super._resize(width2, height2);\n      for (let i = 0; i < 2; i++) {\n        const texture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        const renderBuffer = this._gl.createRenderbuffer();\n        this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n        this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, width2, height2);\n        const framebuffer = this._gl.createFramebuffer();\n        this._shaderResources.bindFramebuffer(framebuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n        this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n        this._anaglyphTextures[i] = texture;\n        this.anaglyphFramebuffers[i] = framebuffer;\n      }\n      this._core.log.write(LogLevel.info, `buffers resized ${width2},${height2}`);\n    }\n    _createContext(canvas) {\n      const antialias = this._options ? this._options.antialias === void 0 ? true : this._options.antialias : true;\n      const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === void 0 ? false : this._options.preserveDrawingBuffer : false;\n      return canvas.getContext(\"webgl\", {\n        stencil: true,\n        alpha: true,\n        antialias,\n        preserveDrawingBuffer\n      });\n    }\n    initializeWebXR(session) {\n      const promise = new Promise((resolve2, reject) => {\n        this._gl.makeXRCompatible().then(() => {\n          session.updateRenderState({\n            baseLayer: new XRWebGLLayer(session, this._gl),\n            depthNear: this._core.config.nearPlane,\n            depthFar: this._core.config.farPlane\n          });\n          session.requestReferenceSpace(\"local\").then((refSpace) => {\n            this._webXRReferenceSpace = refSpace;\n            resolve2();\n          });\n        });\n      });\n      return promise;\n    }\n    prepare(xrFrame) {\n      if (xrFrame) {\n        const pose = xrFrame.getViewerPose(this._webXRReferenceSpace);\n        if (pose) {\n          const glLayer = xrFrame.session.renderState.baseLayer;\n          for (let i = 0; i < pose.views.length; i++) {\n            const view = pose.views[i];\n            this.vMatrices[i] = view.transform.inverse.matrix;\n            this.inverseVMatrices[i] = view.transform.matrix;\n            multiply$2(this._mvMatrices[i], this.vMatrices[i], this.mMatrix);\n            this.mvMatrices[i] = this._mvMatrices[i];\n            this.pMatrices[i] = view.projectionMatrix;\n            const viewport = glLayer.getViewport(view);\n            this._viewports[i].x = viewport.x;\n            this._viewports[i].y = viewport.y;\n            this._viewports[i].width = viewport.width;\n            this._viewports[i].height = viewport.height;\n            this._framebuffers[i] = glLayer.framebuffer;\n          }\n        }\n        this._viewportOffset = 0;\n        this._viewportCount = 2;\n      } else {\n        let viewport;\n        switch (this._core.config.stereoMode) {\n          case StereoMode.none:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 1;\n            this._framebuffers[0] = null;\n            break;\n          case StereoMode.left:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 1;\n            this._framebuffers[0] = null;\n            break;\n          case StereoMode.right:\n            viewport = this._viewports[1];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 1;\n            this._viewportCount = 1;\n            this._framebuffers[1] = null;\n            break;\n          case StereoMode.anaglyph:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            viewport = this._viewports[1];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n            this._framebuffers[0] = this.anaglyphFramebuffers[0];\n            this._framebuffers[1] = this.anaglyphFramebuffers[1];\n            break;\n          case StereoMode.split:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width / 2;\n            viewport.height = this._canvas.height;\n            viewport = this._viewports[1];\n            viewport.x = this._canvas.width / 2;\n            viewport.y = 0;\n            viewport.width = this._canvas.width / 2;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n            this._framebuffers[0] = null;\n            this._framebuffers[1] = null;\n            break;\n        }\n      }\n    }\n    createTransitionBuffer(ids) {\n      const buffer = new TransitionBuffer$1(this._core, ids);\n      buffer.initializeContext(this._gl);\n      return buffer;\n    }\n    createControllerVisual(controller) {\n      const visual = new ControllerVisual(this._core, this, controller);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian2dAxesVisual(axes) {\n      const visual = new Cartesian2dVisual$1(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n      const visual = new Cartesian3dVisual$1(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    _createDebugAxesVisual(debugAxes) {\n      return new DebugAxesVisual(this._core, this, debugAxes);\n    }\n    _createLabelVisual(label2) {\n      return new LabelVisual$1(this._core, this, label2);\n    }\n    createLabelSetVisual(labelSet) {\n      const visual = new LabelSetVisual$1(this._core, this, labelSet);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createImageVisual(image2) {\n      const visual = new ImageVisual$1(this._core, this, image2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createFontVisual(font2) {\n      const visual = new FontVisual$1(this._core, font2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    getDataUrl(mimeType) {\n      return this._canvas.toDataURL(mimeType);\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$2(this, void 0, void 0, function* () {\n        if (this.depthEnabled) {\n          this._gl.enable(this._gl.DEPTH_TEST);\n        } else {\n          this._gl.disable(this._gl.DEPTH_TEST);\n        }\n        this._gl.enable(this._gl.CULL_FACE);\n        this._gl.disable(this._gl.BLEND);\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.clearColor(0, 0, 0, 0);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n        this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], backgroundColor[3]);\n        if (xrFrame) {\n          const glLayer = xrFrame.session.renderState.baseLayer;\n          this._shaderResources.bindFramebuffer(glLayer.framebuffer);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        } else if (this._core.config.stereoMode == StereoMode.anaglyph) {\n          for (let i = 0; i < 2; i++) {\n            this._shaderResources.bindFramebuffer(this.anaglyphFramebuffers[i]);\n            this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n          }\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        } else {\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        if (this._core.config.isDebugVisible) {\n          this._debugAxesVisual.framebuffers = this._framebuffers;\n          this._debugAxesVisual.render(elapsedTime, xrFrame);\n        }\n        const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n        if (axesVisuals) {\n          for (let i = 0; i < axesVisuals.length; i++) {\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n              axesVisual.pickedIdColor = this._pickedIdColor;\n              axesVisual.pickFramebuffer = this._pickFrameBuffer;\n              axesVisual.framebuffers = this._framebuffers;\n              axesVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        for (let i = 0; i < this.transitionBuffers.length; i++) {\n          const transitionBuffer = this.transitionBuffers[i];\n          if (transitionBuffer.isVisible) {\n            this._renderTransitionBuffer(xrFrame, transitionBuffer);\n          }\n        }\n        if (this.areLabelsVisible) {\n          for (let i = 0; i < this.labelSets.length; i++) {\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n              labelSetVisual.pickedIdColor = this._pickedIdColor;\n              labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n              labelSetVisual.framebuffers = this._framebuffers;\n              labelSetVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        if (this.areImagesVisible) {\n          for (let i = 0; i < this.images.length; i++) {\n            const imageVisual = this.images[i];\n            if (imageVisual.isVisible) {\n              imageVisual.framebuffers = this._framebuffers;\n              imageVisual.pickFramebuffer = this._pickFrameBuffer;\n              imageVisual.isPickingEnabled = this.isPickingEnabled;\n              imageVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        for (let i = 0; i < this.controllers.length; i++) {\n          const controllerVisual = this.controllers[i];\n          if (controllerVisual.isVisible) {\n            controllerVisual.isRayVisible = this.isPickingEnabled;\n            controllerVisual.framebuffers = this._framebuffers;\n            controllerVisual.render(elapsedTime, xrFrame);\n          }\n        }\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n          this._pickedType = PickHelper.decodeType(this._pickedPixels);\n          set$7(this._pickedIdColor, this._pickedPixels[0] / 255, this._pickedPixels[1] / 255, this._pickedPixels[2] / 255, this._pickedPixels[3] / 255);\n          this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n          if (this._isCapturingPickImage && this.capturePickImageCallback) {\n            this._isCapturingPickImage = false;\n            const data2 = new Uint8ClampedArray(this._core.config.pickWidth * this._core.config.pickHeight * 4);\n            this._gl.readPixels(0, 0, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, data2);\n            for (let i = 0; i < data2.length / 4; i++) {\n              if (data2[i * 4 + 3] == PickType.data) {\n                data2[i * 4 + 3] = 255;\n              } else {\n                data2[i * 4] = 0;\n                data2[i * 4 + 1] = 0;\n                data2[i * 4 + 2] = 0;\n                data2[i * 4 + 3] = 0;\n              }\n            }\n            const length2 = this._core.config.pickWidth * this._core.config.pickHeight * 4;\n            const row = this._core.config.pickWidth * 4;\n            const end = (this._core.config.pickHeight - 1) * row;\n            const flipped = new Uint8ClampedArray(length2);\n            for (let i = 0; i < length2; i += row) {\n              flipped.set(data2.subarray(i, i + row), end - i);\n            }\n            this.capturePickImageCallback(flipped, this._core.config.pickWidth, this._core.config.pickHeight);\n          }\n        } else {\n          set$7(this._pickedIdColor, 0, 0, 0, 0);\n          this._pickedId = 0;\n        }\n        if (this.isLassoPicking && this._lassoShader.isInitialized) {\n          this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n          this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n          const lassoWidth = this.lassoX1 - this.lassoX0;\n          const lassoHeight = this.lassoY1 - this.lassoY0;\n          this._lassoShader.prepare();\n          this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n          this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n          this._lassoShader.apply();\n          const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewportIndex = i + this._viewportOffset;\n            this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n            const viewport = this._viewports[viewportIndex];\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n            this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n            this._lassoMMatrix[10] = 1;\n            this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n            this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n            this._lassoShader.mMatrix = this._lassoMMatrix;\n            set$5(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n            this._lassoShader.thickness = this._lassoThickness;\n            this._lassoShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n        if (this._core.config.stereoMode == StereoMode.anaglyph && this._anaglyphShader.isInitialized && this._quad.isInitialized) {\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.viewport(this._viewports[0].x, this._viewports[0].y, this._viewports[0].width, this._viewports[0].height);\n          this._anaglyphShader.vertexBuffer = this._quad.vertexBuffer;\n          this._anaglyphShader.indexBuffer = this._quad.indexBuffer;\n          this._anaglyphShader.texture2D1 = this._anaglyphTextures[0];\n          this._anaglyphShader.texture2D2 = this._anaglyphTextures[1];\n          this._anaglyphShader.prepare();\n          this._anaglyphShader.viewport = this._viewports[0];\n          this._anaglyphShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      });\n    }\n    _renderTransitionBuffer(xrFrame, transitionBuffer) {\n      const currentBuffer = transitionBuffer.currentBuffer;\n      const previousBuffer = transitionBuffer.previousBuffer;\n      const currentPalette = transitionBuffer.currentPalette;\n      const previousPalette = transitionBuffer.previousPalette;\n      const currentAtlas = transitionBuffer.currentAtlas;\n      const previousAtlas = transitionBuffer.previousAtlas;\n      const unitType = transitionBuffer.unitType === void 0 ? currentBuffer.unitType : transitionBuffer.unitType;\n      const id2 = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n      const hoverId = id2 > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id2) : -1;\n      const activeId = transitionBuffer.activeId;\n      if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf || unitType == UnitType.ringSdf)) {\n        this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._blockShader.prepare();\n        this._blockShader.mMatrix = this.mMatrix;\n        this._blockShader.time = this.transitionTime;\n        this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._blockShader.rangeMin = 0;\n        this._blockShader.rangeMax = transitionBuffer.length - 1;\n        this._blockShader.hover = hoverId;\n        this._blockShader.active = activeId;\n        this._blockShader.selectedColor = this._core.config.selectionColor;\n        this._blockShader.hoverColor = this._core.config.hoverColor;\n        this._blockShader.activeColor = this._core.config.activeColor;\n        this._blockShader.highlightMode = this._core.config.highlightMode;\n        this._blockShader.specularPower = this._config.specularPower;\n        this._blockShader.specularIntensity = this._config.specularIntensity;\n        this._blockShader.ambient = this._config.ambient;\n        this._blockShader.apply();\n        this._blockShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._blockShader.directionToLight = this._directionToLight;\n            this._blockShader.halfAngle = this._halfAngle;\n          } else {\n            this._blockShader.directionToLight = this._config.directionToLight;\n            this._blockShader.halfAngle = this._config.halfAngle;\n          }\n          this._blockShader.vMatrix = vMatrix;\n          this._blockShader.pMatrix = this.pMatrices[viewport];\n          this._blockShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._blockShader.isPickShader = true;\n          this._blockShader.pMatrix = this.pickPMatrix;\n          this._blockShader.vMatrix = this.pickVMatrix;\n          this._blockShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf || unitType == UnitType.disk)) {\n        this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sphereShader.prepare();\n        this._sphereShader.mMatrix = this.mMatrix;\n        this._sphereShader.time = this.transitionTime;\n        this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sphereShader.rangeMin = 0;\n        this._sphereShader.rangeMax = transitionBuffer.length - 1;\n        this._sphereShader.hover = hoverId;\n        this._sphereShader.active = activeId;\n        this._sphereShader.selectedColor = this._core.config.selectionColor;\n        this._sphereShader.hoverColor = this._core.config.hoverColor;\n        this._sphereShader.activeColor = this._core.config.activeColor;\n        this._sphereShader.highlightMode = this._core.config.highlightMode;\n        this._sphereShader.specularPower = this._config.specularPower;\n        this._sphereShader.specularIntensity = this._config.specularIntensity;\n        this._sphereShader.ambient = this._config.ambient;\n        this._sphereShader.apply();\n        this._sphereShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._sphereShader.directionToLight = this._directionToLight;\n            this._sphereShader.halfAngle = this._halfAngle;\n          } else {\n            this._sphereShader.directionToLight = this._config.directionToLight;\n            this._sphereShader.halfAngle = this._config.halfAngle;\n          }\n          this._sphereShader.vMatrix = vMatrix;\n          this._sphereShader.pMatrix = this.pMatrices[viewport];\n          this._sphereShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._sphereShader.isPickShader = true;\n          this._sphereShader.pMatrix = this.pickPMatrix;\n          this._sphereShader.vMatrix = this.pickVMatrix;\n          this._sphereShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n        this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._cylinderShader.prepare();\n        this._cylinderShader.mMatrix = this.mMatrix;\n        this._cylinderShader.time = this.transitionTime;\n        this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._cylinderShader.rangeMin = 0;\n        this._cylinderShader.rangeMax = transitionBuffer.length - 1;\n        this._cylinderShader.hover = hoverId;\n        this._cylinderShader.active = activeId;\n        this._cylinderShader.selectedColor = this._core.config.selectionColor;\n        this._cylinderShader.hoverColor = this._core.config.hoverColor;\n        this._cylinderShader.activeColor = this._core.config.activeColor;\n        this._cylinderShader.highlightMode = this._core.config.highlightMode;\n        this._cylinderShader.specularPower = this._config.specularPower;\n        this._cylinderShader.specularIntensity = this._config.specularIntensity;\n        this._cylinderShader.ambient = this._config.ambient;\n        this._cylinderShader.apply();\n        this._cylinderShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._cylinderShader.directionToLight = this._directionToLight;\n            this._cylinderShader.halfAngle = this._halfAngle;\n          } else {\n            this._cylinderShader.directionToLight = this._config.directionToLight;\n            this._cylinderShader.halfAngle = this._config.halfAngle;\n          }\n          this._cylinderShader.vMatrix = vMatrix;\n          this._cylinderShader.pMatrix = this.pMatrices[viewport];\n          this._cylinderShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._cylinderShader.isPickShader = true;\n          this._cylinderShader.pMatrix = this.pickPMatrix;\n          this._cylinderShader.vMatrix = this.pickVMatrix;\n          this._cylinderShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._hexPrismShader.isInitialized && (unitType == UnitType.hexPrism || unitType == UnitType.hexPrismSdf)) {\n        this._hexPrismShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._hexPrismShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._hexPrismShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._hexPrismShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._hexPrismShader.prepare();\n        this._hexPrismShader.mMatrix = this.mMatrix;\n        this._hexPrismShader.time = this.transitionTime;\n        this._hexPrismShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._hexPrismShader.rangeMin = 0;\n        this._hexPrismShader.rangeMax = transitionBuffer.length - 1;\n        this._hexPrismShader.hover = hoverId;\n        this._hexPrismShader.active = activeId;\n        this._hexPrismShader.selectedColor = this._core.config.selectionColor;\n        this._hexPrismShader.hoverColor = this._core.config.hoverColor;\n        this._hexPrismShader.activeColor = this._core.config.activeColor;\n        this._hexPrismShader.highlightMode = this._core.config.highlightMode;\n        this._hexPrismShader.specularPower = this._config.specularPower;\n        this._hexPrismShader.specularIntensity = this._config.specularIntensity;\n        this._hexPrismShader.ambient = this._config.ambient;\n        this._hexPrismShader.apply();\n        this._hexPrismShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._hexPrismShader.directionToLight = this._directionToLight;\n            this._hexPrismShader.halfAngle = this._halfAngle;\n          } else {\n            this._hexPrismShader.directionToLight = this._config.directionToLight;\n            this._hexPrismShader.halfAngle = this._config.halfAngle;\n          }\n          this._hexPrismShader.vMatrix = vMatrix;\n          this._hexPrismShader.pMatrix = this.pMatrices[viewport];\n          this._hexPrismShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._hexPrismShader.isPickShader = true;\n          this._hexPrismShader.pMatrix = this.pickPMatrix;\n          this._hexPrismShader.vMatrix = this.pickVMatrix;\n          this._hexPrismShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n        this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n        this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n        this._sdfShader.prepare();\n        this._sdfShader.mMatrix = this.mMatrix;\n        this._sdfShader.time = this.transitionTime;\n        this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sdfShader.rangeMin = 0;\n        this._sdfShader.rangeMax = transitionBuffer.length - 1;\n        this._sdfShader.hover = hoverId;\n        this._sdfShader.active = activeId;\n        this._sdfShader.selectedColor = this._core.config.selectionColor;\n        this._sdfShader.hoverColor = this._core.config.hoverColor;\n        this._sdfShader.activeColor = this._core.config.activeColor;\n        this._sdfShader.highlightMode = this._core.config.highlightMode;\n        this._sdfShader.sdfBuffer = (this.sdfBuffer || this._core.config.sdfBuffer) / 255;\n        this._sdfShader.sdfBackgroundColor = this.sdfBackgroundColor || fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n        this._sdfShader.specularPower = this._config.specularPower;\n        this._sdfShader.specularIntensity = this._config.specularIntensity;\n        this._sdfShader.ambient = this._config.ambient;\n        this._sdfShader.apply();\n        this._sdfShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._sdfShader.directionToLight = this._directionToLight;\n            this._sdfShader.halfAngle = this._halfAngle;\n          } else {\n            this._sdfShader.directionToLight = this._config.directionToLight;\n            this._sdfShader.halfAngle = this._config.halfAngle;\n          }\n          this._sdfShader.vMatrix = vMatrix;\n          this._sdfShader.pMatrix = this.pMatrices[viewport];\n          this._sdfShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._sdfShader.isPickShader = true;\n          this._sdfShader.pMatrix = this.pickPMatrix;\n          this._sdfShader.vMatrix = this.pickVMatrix;\n          this._sdfShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      }\n    }\n  };\n  let Quad$1 = class Quad {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const _vec3 = fromValues$3(2, 2, 2);\n      const _mat4 = create$7();\n      fromScaling(_mat4, _vec3);\n      const vertices = Quad$3.positions(_mat4);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$3.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  class Atlas extends AtlasBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([255, 255, 255, 255]));\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._imageData) {\n        this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n      } else {\n        this._texture = null;\n      }\n    }\n  }\n  let Palette$1 = class Palette extends PaletteBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._colors) {\n        const colors2 = new Uint8Array(this._colors);\n        for (let i = 0; i < colors2.length; i++) {\n          colors2[i] = Math.pow(colors2[i] / 255, 2.2) * 255;\n        }\n        this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors2);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Buffer$1 = class Buffer extends BufferBase {\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    constructor(core, ids) {\n      super(core, ids);\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update() {\n      if (this._isInitialized) {\n        const start = window.performance.now();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n        this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n      }\n    }\n  };\n  class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$1, Palette$1, Atlas);\n    }\n    initializeContext(gl) {\n      this._buffer1.initializeContext(gl);\n      this._buffer2.initializeContext(gl);\n      this._palette1.initializeContext(this._core, gl);\n      this._palette2.initializeContext(this._core, gl);\n      this._atlas1.initializeContext(this._core, gl);\n      this._atlas2.initializeContext(this._core, gl);\n      this._isInitialized = true;\n    }\n  }\n  class Config extends RendererConfig {\n    get keyLightAltitude() {\n      return this._keyLightAltitude;\n    }\n    set keyLightAltitude(value2) {\n      this._keyLightAltitude = value2;\n      this._updateLights();\n    }\n    get keyLightAzimuth() {\n      return this._keyLightAzimuth;\n    }\n    set keyLightAzimuth(value2) {\n      this._keyLightAzimuth = value2;\n      this._updateLights();\n    }\n    get keyLightDistance() {\n      return this._keyLightDistance;\n    }\n    set keyLightDistance(value2) {\n      this._keyLightDistance = value2;\n      this._updateLights();\n    }\n    get fillLight1Altitude() {\n      return this._fillLight1Altitude;\n    }\n    set fillLight1Altitude(value2) {\n      this._fillLight1Altitude = value2;\n      this._updateLights();\n    }\n    get fillLight1Azimuth() {\n      return this._fillLight1Azimuth;\n    }\n    set fillLight1Azimuth(value2) {\n      this._fillLight1Azimuth = value2;\n      this._updateLights();\n    }\n    get fillLight2Altitude() {\n      return this._fillLight2Altitude;\n    }\n    set fillLight2Altitude(value2) {\n      this._fillLight2Altitude = value2;\n      this._updateLights();\n    }\n    get fillLight2Azimuth() {\n      return this._fillLight2Azimuth;\n    }\n    set fillLight2Azimuth(value2) {\n      this._fillLight2Azimuth = value2;\n      this._updateLights();\n    }\n    constructor() {\n      super();\n      this._rotation = create$4();\n      this.keyLightPosition = create$6();\n      this.fillLight1Position = create$6();\n      this.fillLight2Position = create$6();\n      this.reset();\n    }\n    _updateLights() {\n      this._updateLight(this._keyLightAltitude, this._keyLightAzimuth, this._keyLightDistance, this.keyLightPosition);\n      this._updateLight(this._fillLight1Altitude, this._fillLight1Azimuth, 1, this.fillLight1Position);\n      this._updateLight(this._fillLight2Altitude, this._fillLight2Azimuth, 1, this.fillLight2Position);\n    }\n    _updateLight(altitude, azimuth, distance2, position2) {\n      rotateY(this._rotation, Constants$1.QUAT_IDENTITY, AngleHelper.degreesToRadians(azimuth));\n      rotateX(this._rotation, this._rotation, AngleHelper.degreesToRadians(-altitude));\n      transformQuat(position2, Constants$1.VECTOR3_UNITZ, this._rotation);\n      scale$5(position2, position2, distance2);\n    }\n    reset() {\n      this.isSsaoEnabled = true;\n      this.ssaoWidth = 1024;\n      this.ssaoHeight = 1024;\n      this.ssaoBlurEnabled = true;\n      this.ssaoKernelSize = 8;\n      this.ssaoNoiseSize = 4;\n      this.ssaoRadius = 0.02;\n      this.ssaoPower = 1;\n      this.isShadowEnabled = true;\n      this.shadowWidth = 1024;\n      this.shadowHeight = 1024;\n      this.isDofEnabled = false;\n      this.dofAutoFocus = true;\n      this.dofFocusDistance = 0.5;\n      this.dofFocusRange = 0.5;\n      this.dofMaxBackgroundBlur = 0.75;\n      this.isBloomEnabled = false;\n      this.bloomIntensity = 2;\n      this.specularIntensity = 0.15;\n      this.specularPower = 150;\n      this.ambientIntensity = 0.1;\n      this.materialIntensity = 0.5;\n      this.keyLightIntensity = 1.5;\n      this.fillLight1Intensity = 0.25;\n      this.fillLight2Intensity = 0.25;\n      this._keyLightAltitude = 30;\n      this._keyLightAzimuth = -45;\n      this._keyLightDistance = 1;\n      this._fillLight1Altitude = 30;\n      this._fillLight1Azimuth = 45;\n      this._fillLight2Altitude = 30;\n      this._fillLight2Azimuth = -135;\n      this._updateLights();\n      this.isFxaaEnabled = false;\n    }\n  }\n  class Resources {\n    bindFramebuffer(framebuffer) {\n      if (this.framebuffer != framebuffer) {\n        this.framebuffer = framebuffer;\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n      }\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this.framebuffer = this._gl.createFramebuffer();\n      this.OES_texture_float = gl.getExtension(\"OES_texture_float\");\n      this.OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n      this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n  }\n  Resources.glsl = {\n    \"background.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\ngl_FragDepth = 0.99999;\\nmyPosition = vec4(0.0, 0.0, -FAR_PLANE, 0.0);\\nmyColor = vec4(uColor, 1.0);\\nmyNormal = vec4(0.0, 0.0, 1.0, 0.0);\\n}\\n',\n    \"box.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nfloat result = 0.0;\\nfor (int x = -2; x < 2; x++)\\n{\\nfor (int y = -2; y < 2; y++)\\n{\\nvec2 offset = vec2(float(x) + 0.5, float(y) + 0.5) * texelSize;\\nresult += texture(uSampler, texCoords + offset).r;\\n}\\n}\\nresult /= 16.0;\\nmyOutputColor = vec4(vec3(result), 1.0);\\n}\\n\",\n    \"bright.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec4 color = texture(uSampler, texCoords);\\nmyOutputColor = vec4(color.rgb * color.a, 1.0);\\n}\\n\",\n    \"combine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform float uIntensity;\\nout vec4 myOutputColor;\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 bloom =\\ntexture(uSampler2, texCoords).rgb +\\ntexture(uSampler3, texCoords).rgb +\\ntexture(uSampler4, texCoords).rgb +\\ntexture(uSampler5, texCoords).rgb;\\nbloom *= uIntensity;\\nvec3 color = texture(uSampler1, texCoords).rgb;\\ncolor += bloom;\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"deferred.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform mat4 uInverseVMatrix;\\nuniform mat4 uShadowVMatrix;\\nuniform mat4 uShadowPMatrix;\\nuniform bool uShadow;\\nuniform bool uSsao;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform vec3 uKeyLightHalfAngle;\\nuniform vec3 uDirectionToKeyLight;\\nuniform vec3 uDirectionToFillLight1;\\nuniform vec3 uDirectionToFillLight2;\\nuniform vec2 uShadowMapSize;\\nuniform float uKeyLightIntensity;\\nuniform float uFillLight1Intensity;\\nuniform float uFillLight2Intensity;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbientIntensity;\\nuniform float uMaterialIntensity;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec4 position = texture(uSampler1, texCoords);\\nvec4 color = texture(uSampler2, texCoords);\\nvec4 normal = texture(uSampler3, texCoords);\\nfloat shadow;\\nif (uShadow)\\n{\\nvec4 positionWorld = uInverseVMatrix * vec4(position.xyz, 1.0);\\nvec4 positionShadowView = uShadowVMatrix * positionWorld;\\nvec4 positionShadowViewProjection = uShadowPMatrix * positionShadowView;\\nvec3 projCoords = positionShadowViewProjection.xyz / positionShadowViewProjection.w;\\nprojCoords = projCoords * 0.5 + 0.5;\\nfloat minProjCoords = min(projCoords.x, projCoords.y);\\nfloat maxProjCoords = max(projCoords.x, projCoords.y);\\nif (minProjCoords < 0.0 || maxProjCoords > 1.0)\\n{\\nshadow = 1.0;\\n}\\nelse\\n{\\nfloat currentDepth = projCoords.z;\\nfloat bias = 0.0;\\nvec2 texelSize = 1.0 / uShadowMapSize;\\nfor(int x = -1; x <= 1; ++x)\\n{\\nfor(int y = -1; y <= 1; ++y)\\n{\\nfloat pcfDepth = texture(uSampler5, projCoords.xy + vec2(x, y) * texelSize).r;\\nshadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;\\n}\\n}\\nshadow /= 9.0;\\nshadow = clamp(1.0 - shadow, 0.0, 1.0);\\n}\\n}\\nelse\\n{\\nshadow = 1.0;\\n}\\nfloat ssao = uSsao ? texture(uSampler4, texCoords).r : 1.0;\\nfloat diffuseIntensity = clamp(dot(normal.rgb, uDirectionToKeyLight), 0.0, 1.0) * uKeyLightIntensity * shadow;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight1), 0.0, 1.0) * uFillLight1Intensity * ssao;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight2), 0.0, 1.0) * uFillLight2Intensity * ssao;\\nvec3 diffuse = color.rgb * diffuseIntensity * uMaterialIntensity;\\nvec3 ambient = uAmbientIntensity * color.rgb * ssao;\\nvec3 emissive = color.w * color.rgb;\\nfloat specular = normal.w * clamp(pow(clamp(dot(normal.rgb, uKeyLightHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity * uKeyLightIntensity * shadow, 0.0, 1.0);\\nvec3 result = min(ambient + diffuse + specular + emissive, 1.0);\\nresult = pow(result, GAMMA);\\nmyOutputColor = vec4(result, position.w);\\n}\\n',\n    \"dofblur.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uNearFocusDepth;\\nuniform float uFarFocusDepth;\\nuniform float uMaxBackgroundBlur;\\nout vec4 myOutputColor;\\nfloat circleOfConfusion(in float depth )\\n{\\nfloat f;\\nif (depth < uFocusDepth)\\n{\\nf = (depth - uFocusDepth) / (uFocusDepth - uNearFocusDepth);\\nf = clamp(f, -1.0, 0.0);\\n}\\nelse\\n{\\nf = (depth - uFocusDepth) / (uFarFocusDepth - uFocusDepth);\\nf = clamp(f, 0.0, uMaxBackgroundBlur);\\n}\\nreturn f * 0.5 + 0.5;\\n}\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nvec4 color = texture(uSampler1, texCoords);\\nfloat depth = -texture(uSampler2, texCoords).z;\\nfloat coc = circleOfConfusion(depth);\\nmyOutputColor = vec4(coc);\\n}\\n\",\n    \"dofcombine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uAperture;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nout vec4 myOutputColor;\\nconst float MAX_CIRCLE_OF_CONFUSION = 3.0;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec2 texelSizeLow = texelSize * 4.0;\\nconst int NUM_TAPS = 13;\\nvec2 samples[NUM_TAPS];\\nsamples[0] = vec2(-0.326212,-0.405810);\\nsamples[1] = vec2(-0.840144,-0.073580);\\nsamples[2] = vec2(-0.695914, 0.457137);\\nsamples[3] = vec2(-0.203345, 0.620716);\\nsamples[4] = vec2( 0.962340,-0.194983);\\nsamples[5] = vec2( 0.473434,-0.480026);\\nsamples[6] = vec2( 0.519456, 0.767022);\\nsamples[7] = vec2( 0.185461,-0.893124);\\nsamples[8] = vec2( 0.507431, 0.064425);\\nsamples[9] = vec2( 0.896420, 0.412458);\\nsamples[10] = vec2(-0.321940,-0.932615);\\nsamples[11] = vec2(-0.791559,-0.597710);\\nsamples[12] = vec2( 0.000000, 0.000000);\\nconst float maxCoC = 5.0;\\nconst float radiusScale = 0.5;\\nvec4 cOut = texture(uSampler1, texCoords);\\nfloat coc = texture(uSampler2, texCoords).r;\\nfloat centerDepth = coc;\\nfloat discRadius = abs(coc * 2.0 - 1.0) * maxCoC;\\nfloat discRadiusLow = discRadius * radiusScale;\\ncOut = vec4(0.0);\\nfloat acc = 0.0;\\nfor (int t = 0; t < NUM_TAPS; t++)\\n{\\nvec2 coordLow = texCoords + (texelSizeLow * samples[t] * discRadiusLow);\\nvec2 coordHigh = texCoords + (texelSize * samples[t] * discRadius);\\nvec4 tapLow = texture(uSampler1, coordLow);\\nvec4 tapHigh = texture(uSampler1, coordHigh);\\nfloat cocLow = texture(uSampler2, coordLow).r;\\nfloat cocHigh = texture(uSampler2, coordHigh).r;\\nfloat tapBlur = abs(cocHigh * 2.0 - 1.0);\\nvec4 tap = mix(tapHigh, tapLow, tapBlur);\\nfloat cocBlur = mix(cocHigh, cocLow, tapBlur);\\ncocBlur = (cocBlur >= centerDepth) ? 1.0 : abs(cocBlur * 2.0 - 1.0);\\ncOut += tap * cocBlur;\\nacc += cocBlur;\\n}\\nvec4 result = cOut / acc;\\nmyOutputColor = result;\\n}\\n\",\n    \"downsample.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nmyOutputColor = texture(uSampler, texCoords);\\n}\\n\",\n    \"fxaa.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nconst float FXAA_SPAN_MAX = 8.0;\\nconst float FXAA_REDUCE_MUL = 1.0 / 8.0;\\nconst float FXAA_REDUCE_MIN = 1.0 / 128.0;\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec3 color = texture(uSampler, texCoords).rgb;\\nvec3 colorNW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorNE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorSW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y + texelSize.y)).rgb;\\nvec3 colorSE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y + texelSize.y)).rgb;\\nfloat luminance = dot(color, LUMINANCE);\\nfloat luminanceNW = dot(colorNW, LUMINANCE);\\nfloat luminanceNE = dot(colorNE, LUMINANCE);\\nfloat luminanceSW = dot(colorSW, LUMINANCE);\\nfloat luminanceSE = dot(colorSE, LUMINANCE);\\nfloat luminanceMin = min(luminance, min(min(luminanceNW, luminanceNE), min(luminanceSW, luminanceSE)));\\nfloat luminanceMax = max(luminance, max(max(luminanceNW, luminanceNE), max(luminanceSW, luminanceSE)));\\nvec2 dir = vec2(luminanceSW + luminanceSE - luminanceNW - luminanceNE, luminanceNW + luminanceSW - luminanceNE - luminanceSE);\\nfloat dirReduce = max((luminanceNW + luminanceNE + luminanceSW + luminanceSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\\nfloat rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\\ndir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texelSize;\\nvec3 colorA = 0.5 * (\\ntexture(uSampler, texCoords.xy + dir * (1.0/3.0 - 0.5)).rgb +\\ntexture(uSampler, texCoords.xy + dir * (2.0/3.0 - 0.5)).rgb);\\nvec3 colorB = colorA * 0.5 + 0.25 * (\\ntexture(uSampler, texCoords.xy - dir * 0.5).rgb +\\ntexture(uSampler, texCoords.xy + dir * 0.5).rgb);\\nluminance = dot(colorB, LUMINANCE);\\nif (luminance < luminanceMin || luminance > luminanceMax)\\n{\\nmyOutputColor = vec4(colorA, 1.0);\\n}\\nelse\\n{\\nmyOutputColor = vec4(colorB, 1.0);\\n}\\n}\\n',\n    \"gaussian.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nuniform bool uHorizontal;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec2 texelSize = vec2(1.0) / uResolution;\\nconst int NUM_WEIGHTS = 3;\\nfloat weights[NUM_WEIGHTS];\\nweights[0] = 0.2270270270;\\nweights[1] = 0.3162162162;\\nweights[2] = 0.0702702703;\\nfloat offsets[NUM_WEIGHTS];\\noffsets[0] = 0.0;\\noffsets[1] = 1.3846153846;\\noffsets[2] = 3.2307692308;\\nvec3 color = texture(uSampler, texCoords).rgb * weights[0];\\nif (uHorizontal)\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\n}\\n}\\nelse\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\n}\\n}\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"lasso.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nin mediump vec2 vTexCoord;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\nmyOutputColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n',\n    \"lasso.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nout mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"pickgrid.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nin lowp vec4 vColor;\\nin mediump vec2 vTexCoord;\\nin mediump vec4 vBounds;\\nin mediump vec3 vNormal;\\nin vec3 vViewPosition;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void) {\\nif (uPick)\\n{\\nmyPosition = vColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec2 buffer = fwidth(vTexCoord);\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\nmyColor.xyz = color.xyz;\\n}\\n}\\n',\n    \"pickgrid.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin lowp vec4 aIdColor;\\nin mediump vec2 aTexCoord;\\nin mediump vec3 aNormal;\\nin mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nout lowp vec4 vColor;\\nout mediump vec2 vTexCoord;\\nout mediump vec4 vBounds;\\nout mediump vec3 vNormal;\\nout vec3 vViewPosition;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nin lowp vec4 vIdColor;\\nin lowp float vHover;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick) {\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nfloat distance = texture(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth)\\n{\\ndiscard;\\n}\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, mix(uColor, uHoverColor, vHover), value);\\nmyPosition.xyz = vViewPosition;\\nmyNormal.xyz = vNormal;\\nmyColor.w = 1.0;\\nmyPosition.w = 0.0;\\nmyNormal.w = 0.0;\\n}\\n}\\n\",\n    \"sdftext.vertex.fx\": \"#version 300 es\\nin lowp vec4 aIdColor;\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nout vec3 vViewPosition;\\nout vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nout lowp vec4 vIdColor;\\nout lowp float vHover;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(0.0, 0.0, 1.0, 0.0));\\nvec4 viewPosition = mvMatrix* vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"ssao.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nconst int SSAO_KERNEL_SIZE = 8;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform mat4 uPMatrix;\\nuniform vec4 uViewport;\\nuniform float uSsaoNoiseSize;\\nuniform float uSsaoRadius;\\nuniform float uSsaoPower;\\nuniform vec3 uSsaoKernel[SSAO_KERNEL_SIZE];\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 position = texture(uSampler1, texCoords).rgb;\\nvec3 normal = texture(uSampler2, texCoords).rgb;\\nfloat occlusion = 0.0;\\nvec2 noiseScale = uViewport.zw / uSsaoNoiseSize;\\nvec3 randomVec = texture(uSampler3, texCoords * noiseScale).rgb;\\nvec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));\\nvec3 bitangent = cross(normal, tangent);\\nmat3 tbn = mat3(tangent, bitangent, normal);\\nfor(int i = 0; i < SSAO_KERNEL_SIZE; i++)\\n{\\nvec3 mySample = tbn * uSsaoKernel[i];\\nmySample = position + mySample * uSsaoRadius;\\nvec4 offset = vec4(mySample, 1.0);\\noffset = uPMatrix * offset;\\noffset.xy /= offset.w;\\noffset.xy = offset.xy * 0.5 + 0.5;\\nfloat sampleDepth = texture(uSampler1, offset.xy).z;\\nfloat rangeCheck = abs(position.z - sampleDepth) > uSsaoRadius ? 0.0 : 1.0;\\nocclusion += (sampleDepth < mySample.z ? 0.0 : 1.0) * rangeCheck;\\n}\\nocclusion /= float(SSAO_KERNEL_SIZE);\\nocclusion = pow(1.0 - occlusion, uSsaoPower);\\nmyOutputColor = vec4(occlusion, 0.0, 0.0, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform sampler2D uSampler;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nmyPosition.xyz = vViewPosition;\\nmyColor.xyz = pow(texture(uSampler, vTexCoord).xyz, INV_GAMMA);\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\n}\\n',\n    \"texture.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec3 aNormal;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nout vec3 vViewPosition;\\nout mediump vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitblock.vertex.fx\": '#version 300 es\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitcylinder.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec4 vCircle1;\\nin vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w, uShadow ? -1.0 : 1.0);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitcylinder.vertex.fx\": '#version 300 es\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout vec3 vViewPosition;\\nout vec4 vCircle1;\\nout vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitsdf.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec2 vTexCoord;\\nin mediump vec2 vPreviousTexCoord;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nfloat uBorderWidth = 0.0 / 255.0;\\nfloat uBuffer = 192.0 / 255.0;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat distance = mix(texture(uPreviousSampler1, vPreviousTexCoord).r, texture(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat uGamma = 0.0;\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, color, value);\\n}\\n}\\n',\n    \"unitsdf.vertex.fx\": '#version 300 es\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin mediump vec4 aTexCoord;\\nin mediump vec4 aPreviousTexCoord;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout mediump vec2 vTexCoord;\\nout mediump vec2 vPreviousTexCoord;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n',\n    \"unitsphere.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec3 vViewCenter;\\nin mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s, uShadow ? -1.0 : 1.0);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitsphere.vertex.fx\": '#version 300 es\\n#include \"common.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin lowp float aColor;\\nin lowp float aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump float vRadius;\\nout vec3 vViewPosition;\\nout vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\ntranslation.xyz += aPosition * scale;\\nvec4 viewPosition = mvMatrix * vec4(translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n',\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\n\",\n    \"intersect.include.fx\": \"float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph, in float shadow)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot( oc, rd );\\nfloat c = dot( oc, oc ) - sph.w*sph.w;\\nfloat h = b*b - c;\\nif( h<0.0 ) return -1.0;\\nreturn -b - shadow * sqrt( h );\\n}\\nfloat roundedboxIntersect( in vec3 ro, in vec3 rd, in vec3 size, in float rad )\\n{\\nvec3 m = 1.0/rd;\\nvec3 n = m*ro;\\nvec3 k = abs(m)*(size+rad);\\nvec3 t1 = -n - k;\\nvec3 t2 = -n + k;\\nfloat tN = max( max( t1.x, t1.y ), t1.z );\\nfloat tF = min( min( t2.x, t2.y ), t2.z );\\nif( tN > tF || tF < 0.0) return -1.0;\\nfloat t = tN;\\nvec3 pos = ro+t*rd;\\nvec3 s = sign(pos);\\nro *= s;\\nrd *= s;\\npos *= s;\\npos -= size;\\npos = max( pos.xyz, pos.yzx );\\nif( min(min(pos.x,pos.y),pos.z)<0.0 ) return t;\\nvec3 oc = ro - size;\\nvec3 dd = rd*rd;\\nvec3 oo = oc*oc;\\nvec3 od = oc*rd;\\nfloat ra2 = rad*rad;\\nt = 1e20;\\n{\\nfloat b = od.x + od.y + od.z;\\nfloat c = oo.x + oo.y + oo.z - ra2;\\nfloat h = b*b - c;\\nif( h>0.0 ) t = -b-sqrt(h);\\n}\\n{\\nfloat a = dd.y + dd.z;\\nfloat b = od.y + od.z;\\nfloat c = oo.y + oo.z - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.x+rd.x*h)<size.x ) t = h;\\n}\\n}\\n{\\nfloat a = dd.z + dd.x;\\nfloat b = od.z + od.x;\\nfloat c = oo.z + oo.x - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.y+rd.y*h)<size.y ) t = h;\\n}\\n}\\n{\\nfloat a = dd.x + dd.y;\\nfloat b = od.x + od.y;\\nfloat c = oo.x + oo.y - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.z+rd.z*h)<size.z ) t = h;\\n}\\n}\\nif( t>1e19 ) t=-1.0;\\nreturn t;\\n}\\nvec3 roundedboxNormal( in vec3 pos, in vec3 siz, in float rad )\\n{\\nreturn sign(pos)*normalize(max(abs(pos)-siz,0.0));\\n}\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - shadow * sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-shadow * sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - shadow * sqrt( h1 );\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - shadow * sqrt( h2 );\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n  };\n  class ShaderBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    set vertexBuffer(value2) {\n      if (this._vertexBuffer != value2) {\n        this._vertexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    set indexBuffer(value2) {\n      if (this._indexBuffer != value2) {\n        this._indexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    constructor(core, main) {\n      this._core = core;\n      this._main = main;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n      const program = this._gl.createProgram();\n      this._gl.attachShader(program, vs);\n      this._gl.attachShader(program, fs);\n      this._gl.linkProgram(program);\n      if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n      }\n      return program;\n    }\n    _compileShader(source2, type2) {\n      const shader = this._gl.createShader(type2);\n      this._gl.shaderSource(shader, source2);\n      this._gl.compileShader(shader);\n      if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n      }\n      return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n      const remove2 = `#define ${directive}`;\n      const index2 = shaderSource.indexOf(remove2);\n      shaderSource = index2 == -1 ? shaderSource : shaderSource.substring(0, index2) + shaderSource.substring(index2 + remove2.length);\n      return shaderSource;\n    }\n    prepare() {\n      if (this._program != this._main.shaderResources.currentProgram) {\n        if (this._main.shaderResources.currentShader) {\n          this._main.shaderResources.currentShader.disableProgram();\n        }\n        this.enableProgram(this._program);\n        this.updateBuffers();\n        this.updateTextures();\n      } else {\n        if (this._haveBuffersChanged) {\n          this.updateBuffers();\n        }\n        if (this._haveTexturesChanged) {\n          this.updateTextures();\n        }\n      }\n    }\n    apply() {\n    }\n    applyModel() {\n    }\n    applyView() {\n    }\n    enableProgram(program) {\n      this._gl.useProgram(program);\n      this._main.shaderResources.currentProgram = program;\n      this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n      this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n      this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n      this._main.shaderResources.currentShader = null;\n      this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n      callback(this._includesFromFile(Resources.glsl[vsName]), this._includesFromFile(Resources.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n      this._sourceFromUrl(vsName, (vsSource) => {\n        this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n          this._sourceFromUrl(fsName, (fsSource) => {\n            this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n              callback(vsIncSource, fsIncSource);\n            });\n          });\n        });\n      });\n    }\n    _sourceFromUrl(url, callback) {\n      const request2 = new XMLHttpRequest();\n      request2.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n      request2.onreadystatechange = () => {\n        if (request2.readyState == XMLHttpRequest.DONE && request2.status == 200) {\n          callback(request2.responseText);\n        }\n      };\n      request2.send();\n    }\n    _includesFromFile(source2) {\n      let index2 = 0;\n      do {\n        index2 = source2.indexOf(\"#include\", index2);\n        if (index2 != -1) {\n          const start = source2.indexOf('\"', index2);\n          const end = source2.indexOf('\"', start + 1);\n          const name = source2.substring(start + 1, end);\n          const inc = Resources.glsl[name];\n          source2 = source2.substring(0, index2) + inc + source2.substring(end + 1);\n        }\n      } while (index2 != -1);\n      return source2;\n    }\n    _includesFromUrl(source2, index2, callback) {\n      index2 = source2.indexOf(\"#include\", index2);\n      if (index2 != -1) {\n        const start = source2.indexOf('\"', index2);\n        const end = source2.indexOf('\"', start + 1);\n        const name = source2.substring(start + 1, end);\n        this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n          source2 = source2.substring(0, index2) + include + source2.substring(end + 1);\n          this._includesFromUrl(source2, index2, callback);\n        });\n      } else {\n        callback(source2);\n      }\n    }\n  }\n  class Texture extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  let Lasso$1 = class Lasso extends ShaderBase {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n      this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  class SdfText extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n      this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n      this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n      this._gl.uniform1f(this._gammaUniform, this.gamma);\n      this._gl.uniform1f(this._bufferUniform, this.buffer);\n      this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class PickGrid extends ShaderBase {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n      this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n      this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n      this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n      this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n      this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n      this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n      this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n      this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n      this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n      this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n      this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n      this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n      this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n      this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n      this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n      this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n      this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n      this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n      this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n      this._gl.uniform2fv(this._zeroUniform, this.zero);\n      this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._boundsAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  }\n  class UnitShader extends ShaderBase {\n    get paletteTexture() {\n      return this._paletteTexture;\n    }\n    set paletteTexture(value2) {\n      if (this._paletteTexture != value2) {\n        this._paletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousPaletteTexture() {\n      return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value2) {\n      if (this._previousPaletteTexture != value2) {\n        this._previousPaletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get sdfTexture() {\n      return this._sdfTexture;\n    }\n    set sdfTexture(value2) {\n      if (this._sdfTexture != value2) {\n        this._sdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousSdfTexture() {\n      return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value2) {\n      if (this._previousSdfTexture != value2) {\n        this._previousSdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    set instanceBuffer(value2) {\n      if (this._instanceBuffer != value2) {\n        this._instanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    set previousInstanceBuffer(value2) {\n      if (this._previousInstanceBuffer != value2) {\n        this._previousInstanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    initializeData() {\n      this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n      this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n      this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n      this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n      this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n      this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n      this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n      this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n      this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n      this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n      this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n      this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n      this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n      const vertices = Cube.POSITIONS;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Cube.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this.indexCount = indices.length;\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._updateCurrentBuffer();\n      this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n      this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._idAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._idColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._translationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._translationAttribute);\n      this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._scaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._scaleAttribute);\n      this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._selectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._selectedAttribute);\n      this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._orderAttribute, 1);\n      this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n      if (this._previousInstanceBuffer != this._instanceBuffer) {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n      }\n      this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n      this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousScaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n      this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1f(this._timeUniform, this.time);\n      this._gl.uniform1f(this._durationUniform, this.duration);\n      this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n      this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n      this._gl.uniform1i(this._previousSampler0Uniform, 0);\n      this._gl.uniform1i(this._sampler0Uniform, 1);\n      this._gl.uniform1f(this._hoverUniform, this.hover);\n      this._gl.uniform1f(this._activeUniform, this.active);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniform1i(this._shadowUniform, this.isShadowMap ? 1 : 0);\n    }\n    updateTextures() {\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._translationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._scaleAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousScaleAttribute, 0);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 0);\n      this._gl.vertexAttribDivisor(this._selectedAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 0);\n      this._gl.vertexAttribDivisor(this._orderAttribute, 0);\n      this._gl.vertexAttribDivisor(this._idAttribute, 0);\n      this._gl.vertexAttribDivisor(this._idColorAttribute, 0);\n    }\n  }\n  class UnitBlock extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n  }\n  class UnitSphere extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n  }\n  class UnitCylinder extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n  }\n  class UnitSdf extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n      this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._texCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n      super.apply();\n      this._gl.uniform1i(this._previousSampler1Uniform, 2);\n      this._gl.uniform1i(this._sampler1Uniform, 3);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._texCoordAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 0);\n    }\n  }\n  class Background extends ShaderBase {\n    constructor(core, main) {\n      super(core, main);\n      this._quad = new Quad$1();\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      this._quad.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"background.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._isInitialized = true;\n      this._vao = gl.createVertexArray();\n      gl.bindVertexArray(this._vao);\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._quad.vertexBuffer);\n      gl.vertexAttribPointer(this._positionAttribute, 3, gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      gl.enableVertexAttribArray(this._positionAttribute);\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._quad.indexBuffer);\n      gl.bindVertexArray(null);\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindVertexArray(this._vao);\n    }\n  }\n  class Ssao extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"ssao.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._ssaoNoiseSizeUniform = gl.getUniformLocation(this._program, \"uSsaoNoiseSize\");\n      this._ssaoRadiusUniform = gl.getUniformLocation(this._program, \"uSsaoRadius\");\n      this._ssaoPowerUniform = gl.getUniformLocation(this._program, \"uSsaoPower\");\n      this._ssaoKernelUniform = gl.getUniformLocation(this._program, \"uSsaoKernel\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._ssaoNoiseSizeUniform, this.ssaoNoiseSize);\n      this._gl.uniform1f(this._ssaoRadiusUniform, this.ssaoRadius);\n      this._gl.uniform1f(this._ssaoPowerUniform, this.ssaoPower);\n      this._gl.uniform3fv(this._ssaoKernelUniform, this.ssaoKernel);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n  }\n  class Box extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"box.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Deferred extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D4() {\n      return this._texture2D4;\n    }\n    set texture2D4(value2) {\n      if (this._texture2D4 != value2) {\n        this._texture2D4 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D5() {\n      return this._texture2D5;\n    }\n    set texture2D5(value2) {\n      if (this._texture2D5 != value2) {\n        this._texture2D5 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    constructor(core, main) {\n      super(core, main);\n      this.directionToKeyLight = create$6();\n      this.directionToFillLight1 = create$6();\n      this.directionToFillLight2 = create$6();\n      this.keyLightHalfAngle = create$6();\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"deferred.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n      this._ssaoUniform = gl.getUniformLocation(this._program, \"uSsao\");\n      this._inverseVMatrixUniform = gl.getUniformLocation(this._program, \"uInverseVMatrix\");\n      this._shadowVMatrixUniform = gl.getUniformLocation(this._program, \"uShadowVMatrix\");\n      this._shadowPMatrixUniform = gl.getUniformLocation(this._program, \"uShadowPMatrix\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n      this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._shadowMapSizeUniform = gl.getUniformLocation(this._program, \"uShadowMapSize\");\n      this._keyLightHalfAngleUniform = gl.getUniformLocation(this._program, \"uKeyLightHalfAngle\");\n      this._directionToKeyLightUniform = gl.getUniformLocation(this._program, \"uDirectionToKeyLight\");\n      this._directionToFillLight1Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight1\");\n      this._directionToFillLight2Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight2\");\n      this._keyLightIntensityUniform = gl.getUniformLocation(this._program, \"uKeyLightIntensity\");\n      this._fillLight1IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight1Intensity\");\n      this._fillLight2IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight2Intensity\");\n      this._ambientIntensityUniform = gl.getUniformLocation(this._program, \"uAmbientIntensity\");\n      this._materialIntensityUniform = gl.getUniformLocation(this._program, \"uMaterialIntensity\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._shadowUniform, this.isShadowEnabled ? 1 : 0);\n      this._gl.uniform1i(this._ssaoUniform, this.isSsaoEnabled ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._inverseVMatrixUniform, false, this.inverseVMatrix);\n      this._gl.uniformMatrix4fv(this._shadowVMatrixUniform, false, this.shadowVMatrix);\n      this._gl.uniformMatrix4fv(this._shadowPMatrixUniform, false, this.shadowPMatrix);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform1i(this._samplerUniform4, 3);\n      this._gl.uniform1i(this._samplerUniform5, 4);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform2f(this._shadowMapSizeUniform, this.shadowMapWidth, this.shadowMapHeight);\n      this._gl.uniform1f(this._keyLightIntensityUniform, this.keyLightIntensity);\n      this._gl.uniform1f(this._fillLight1IntensityUniform, this.fillLight1Intensity);\n      this._gl.uniform1f(this._fillLight2IntensityUniform, this.fillLight2Intensity);\n      this._gl.uniform1f(this._ambientIntensityUniform, this.ambientIntensity);\n      this._gl.uniform1f(this._materialIntensityUniform, this.materialIntensity);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n      this._gl.uniform3fv(this._directionToKeyLightUniform, this.directionToKeyLight);\n      this._gl.uniform3fv(this._directionToFillLight1Uniform, this.directionToFillLight1);\n      this._gl.uniform3fv(this._directionToFillLight2Uniform, this.directionToFillLight2);\n      this._gl.uniform3fv(this._keyLightHalfAngleUniform, this.keyLightHalfAngle);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n      this._gl.activeTexture(this._gl.TEXTURE4);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n  }\n  class Combine extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D4() {\n      return this._texture2D4;\n    }\n    set texture2D4(value2) {\n      if (this._texture2D4 != value2) {\n        this._texture2D4 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D5() {\n      return this._texture2D5;\n    }\n    set texture2D5(value2) {\n      if (this._texture2D5 != value2) {\n        this._texture2D5 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"combine.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._intensityUniform = gl.getUniformLocation(this._program, \"uIntensity\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n      this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n      this._gl.uniform1f(this._intensityUniform, this.intensity);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform1i(this._samplerUniform4, 3);\n      this._gl.uniform1i(this._samplerUniform5, 4);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n      this._gl.activeTexture(this._gl.TEXTURE4);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n  }\n  class DofBlur extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"dofblur.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n      this._nearFocusDepthUniform = gl.getUniformLocation(this._program, \"uNearFocusDepth\");\n      this._farFocusDepthUniform = gl.getUniformLocation(this._program, \"uFarFocusDepth\");\n      this._maxBackgroundBlurUniform = gl.getUniformLocation(this._program, \"uMaxBackgroundBlur\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n      this._gl.uniform1f(this._nearFocusDepthUniform, this.nearFocusDepth);\n      this._gl.uniform1f(this._farFocusDepthUniform, this.farFocusDepth);\n      this._gl.uniform1f(this._maxBackgroundBlurUniform, this.maxBackgroundBlur);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n    }\n  }\n  class Downsample extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"downsample.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Gaussian extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"gaussian.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n      this._horizontalUniform = gl.getUniformLocation(this._program, \"uHorizontal\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n      this._gl.uniform1i(this._horizontalUniform, this.horizontal ? 1 : 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class DofCombine extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"dofcombine.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n      this._apertureUniform = gl.getUniformLocation(this._program, \"uAperture\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n      this._gl.uniform1f(this._apertureUniform, this.aperture);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n  }\n  class Fxaa extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"fxaa.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Bright extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"bright.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get axes() {\n      return this._axes;\n    }\n    constructor(core) {\n      this._core = core;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._renderGrid();\n        this._renderText();\n      }\n    }\n    _renderGrid() {\n    }\n    _renderText() {\n    }\n  }\n  class Cartesian2dVisual extends AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian2dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 2; edge++) {\n          const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n          if (axes.isEdgeVisible[edgeId]) {\n            if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n              indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n              indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n            } else {\n              indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n              indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n            }\n            if (indexCount > 0) {\n              shader.mMatrix = axes.getLabelMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n            indexCount = axes.getTitleIndexCount(axisId);\n            if (indexCount > 0) {\n              indexOffset = axes.getTitleIndexOffset(axisId);\n              shader.mMatrix = axes.getTitleMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n          indexCount = axes.getHeadingIndexCount(axisId);\n          if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n            indexOffset = axes.getHeadingIndexOffset(axisId);\n            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n            shader.applyModel();\n            shader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n              const viewport = i + this.viewportOffset;\n              this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n              shader.vMatrix = this.vMatrices[viewport];\n              shader.pMatrix = this.pMatrices[viewport];\n              shader.applyView();\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n              shader.isPickShader = true;\n              shader.pMatrix = this.pickPMatrix;\n              shader.vMatrix = this.pickVMatrix;\n              shader.applyView();\n              shaderResources.bindFramebuffer(this.pickFramebuffer);\n              this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const gridShader = this._main.gridShader;\n      const axes = this._axes;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width3 = gridTicksScale[0];\n          const height3 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n            if (axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width3, height3);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      const axisId2 = 0;\n      const axisId3 = 1;\n      const width2 = size[axisId2];\n      const height2 = size[axisId3];\n      gridShader.zero = axes.gridFaceZero;\n      gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n      for (let face = 0; face < 2; face++) {\n        const faceId = face;\n        if (axes.getIsForwardFace(faceId)) {\n          this._renderGridFace(faceId, width2, height2);\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  }\n  class Cartesian3dVisual extends AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian3dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 4; edge++) {\n          const edgeId = Cube.AXIS_EDGES[axisId][edge];\n          if (axes.getIsOutsideEdge(edgeId)) {\n            if (axes.isEdgeVisible[edgeId]) {\n              if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n              } else {\n                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n              }\n              if (indexCount > 0) {\n                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n              indexCount = axes.getTitleIndexCount(axisId);\n              if (indexCount > 0) {\n                indexOffset = axes.getTitleIndexOffset(axisId);\n                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n            }\n            indexCount = axes.getHeadingIndexCount(axisId);\n            if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n              indexOffset = axes.getHeadingIndexOffset(axisId);\n              shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width2 = gridTicksScale[0];\n          const height2 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.areFacesVisible[axisId]) {\n          const axisId2 = axisId == 0 ? 1 : 0;\n          const axisId3 = axisId == 2 ? 1 : 2;\n          const width2 = size[axisId2];\n          const height2 = size[axisId3];\n          gridShader.zero = axes.getGridFaceZero(axisId);\n          gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n          for (let face = 0; face < 2; face++) {\n            const faceId = Cube.AXIS_FACES[axisId][face];\n            if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n              this._renderGridFace(faceId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  }\n  class FontVisual {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get font() {\n      return this._font;\n    }\n    constructor(core, font2) {\n      this._core = core;\n      this._font = font2;\n      font2.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._isInitialized = true;\n      if (this._font.count > 0) {\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n        this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n      }\n    }\n  }\n  class LabelVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label2) {\n      this._core = core;\n      this._main = main;\n      this._label = label2;\n      this._label.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this._mMatrix = create$7();\n      this.mMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._label.isInitialized) {\n        this._label.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const indexCount = this._label.indexCount;\n        if (indexCount > 0) {\n          const shader = this._main.sdfTextShader;\n          const fontVisual = this._main.fonts[this._label.font.name];\n          shader.vertexBuffer = this._vertexBuffer;\n          shader.indexBuffer = this._indexBuffer;\n          shader.texture2D = fontVisual.texture;\n          shader.prepare();\n          shader.gamma = this._label.gamma;\n          shader.buffer = fontVisual.font.edgeValue / 255;\n          shader.borderWidth = this._label.borderWidth;\n          shader.color = this._label.color || this._core.config.textColor;\n          shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n          shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n          shader.pickedIdColor = this.pickedIdColor;\n          shader.apply();\n          multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n          shader.mMatrix = this._mMatrix;\n          shader.applyModel();\n          shader.isPickShader = false;\n          this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            shader.vMatrix = this.vMatrices[viewport];\n            shader.pMatrix = this.pMatrices[viewport];\n            shader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n          if (this.isPickingEnabled) {\n            shader.isPickShader = true;\n            shader.pMatrix = this.pickPMatrix;\n            shader.vMatrix = this.pickVMatrix;\n            shader.applyView();\n            this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      }\n    }\n  }\n  class LabelVisual extends LabelVisualBase {\n    get label() {\n      return this._label;\n    }\n    set text(value2) {\n      this._label.text = value2;\n    }\n    get text() {\n      return this._label.text;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  }\n  class LabelSetVisual extends LabelVisualBase {\n    get label() {\n      return this._label;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  }\n  class ImageVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n      return this._image;\n    }\n    constructor(core, main, image2) {\n      this._core = core;\n      this._main = main;\n      this._image = image2;\n      this._image.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this.mMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._image.isInitialized) {\n        this._image.initialize();\n      }\n      this._gl = gl;\n      if (this._image.imageData) {\n        this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n      }\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const textureShader = this._main.textureShader;\n        textureShader.vertexBuffer = this._vertexBuffer;\n        textureShader.indexBuffer = this._indexBuffer;\n        textureShader.texture2D = this.texture;\n        textureShader.prepare();\n        textureShader.mMatrix = this.mMatrix;\n        textureShader.apply();\n        this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          textureShader.vMatrix = this.vMatrices[viewport];\n          textureShader.pMatrix = this.pMatrices[viewport];\n          textureShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  }\n  class Lasso {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const vertices = Quad$3.textured(Constants$1.MAT4_IDENTITY);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$3.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  }\n  var __awaiter$1 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class Main extends RendererBase {\n    get shaderResources() {\n      return this._shaderResources;\n    }\n    get textureShader() {\n      return this._textureShader;\n    }\n    get lassoShader() {\n      return this._lassoShader;\n    }\n    get sdfTextShader() {\n      return this._sdfTextShader;\n    }\n    get gridShader() {\n      return this._gridShader;\n    }\n    get blockShader() {\n      return this._blockShader;\n    }\n    get sphereShader() {\n      return this._sphereShader;\n    }\n    get cyclinderShader() {\n      return this._cylinderShader;\n    }\n    get sdfShader() {\n      return this._sdfShader;\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    get config() {\n      return this._config;\n    }\n    constructor(options2) {\n      super(options2);\n      this._config = new Config();\n      this._quad = new Quad$1();\n      this._lasso = new Lasso();\n      this._pickedPixels = new Uint8Array(4);\n      this._pickedIdColor = create$5();\n      this._position = create$6();\n      this._direction = create$6();\n      this._cameraRotation = create$8();\n      this._cameraPosition = create$6();\n      this._modelPosition = create$6();\n      this._modelManipulationOrigin = create$6();\n      this._shadowVMatrix = create$7();\n      this._shadowPMatrix = create$7();\n    }\n    get isSupported() {\n      return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    initialize(core) {\n      super.initialize(core);\n      this._shaderResources = new Resources();\n      this._textureShader = new Texture(core, this);\n      this._lassoShader = new Lasso$1(core, this);\n      this._sdfTextShader = new SdfText(core, this);\n      this._gridShader = new PickGrid(core, this);\n      this._blockShader = new UnitBlock(core, this);\n      this._sphereShader = new UnitSphere(core, this);\n      this._cylinderShader = new UnitCylinder(core, this);\n      this._sdfShader = new UnitSdf(core, this);\n      this._backgroundShader = new Background(core, this);\n      this._ssaoShader = new Ssao(core, this);\n      this._boxShader = new Box(core, this);\n      this._deferredShader = new Deferred(core, this);\n      this._combineShader = new Combine(core, this);\n      this._dofBlurShader = new DofBlur(core, this);\n      this._downsampleShader = new Downsample(core, this);\n      this._gaussianShader = new Gaussian(core, this);\n      this._dofCombineShader = new DofCombine(core, this);\n      this._fxaaShader = new Fxaa(core, this);\n      this._brightPassShader = new Bright(core, this);\n      this._initializeContext(this._createContext(this._canvas));\n      this._canvas.addEventListener(\"webglcontextlost\", (event2) => {\n        this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n        event2.preventDefault();\n      }, false);\n      this._canvas.addEventListener(\"webglcontextrestored\", () => {\n        this._initializeContext(this._createContext(this._canvas));\n        this._core.log.write(LogLevel.info, \"WebGL context restored\");\n      }, false);\n      this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n      this._gl = gl;\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        fontVisual.initializeContext(gl);\n      }\n      this._ssaoSampleKernel = new Float32Array(this._config.ssaoKernelSize * 3);\n      const random2 = new PseudoRandom(0);\n      const _vec3 = create$6();\n      for (let i = 0; i < this._config.ssaoKernelSize; i++) {\n        _vec3[0] = random2.nextFloat() * 2 - 1;\n        _vec3[1] = random2.nextFloat() * 2 - 1;\n        _vec3[2] = random2.nextFloat();\n        normalize$5(_vec3, _vec3);\n        scale$5(_vec3, _vec3, random2.nextFloat());\n        let scale2 = i / this._config.ssaoKernelSize;\n        scale2 = MathHelper.lerp(0.1, 1, scale2 * scale2);\n        scale$5(_vec3, _vec3, scale2);\n        this._ssaoSampleKernel[i * 3] = _vec3[0];\n        this._ssaoSampleKernel[i * 3 + 1] = _vec3[1];\n        this._ssaoSampleKernel[i * 3 + 2] = _vec3[2];\n      }\n      const noise = new Float32Array(this._config.ssaoNoiseSize * this._config.ssaoNoiseSize * 4);\n      _vec3[2] = 0;\n      for (let i = 0; i < this._config.ssaoNoiseSize * this._config.ssaoNoiseSize; i++) {\n        _vec3[0] = random2.nextFloat() * 2 - 1;\n        _vec3[1] = random2.nextFloat() * 2 - 1;\n        normalize$5(_vec3, _vec3);\n        noise[i * 4] = _vec3[0];\n        noise[i * 4 + 1] = _vec3[1];\n      }\n      this._ssaoNoiseTexture = this._gl.createTexture();\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._ssaoNoiseTexture);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST);\n      this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA32F, this._config.ssaoNoiseSize, this._config.ssaoNoiseSize, 0, this._gl.RGBA, this._gl.FLOAT, noise);\n      this._ssaoWidth = -1;\n      this._ssaoHeight = -1;\n      this._shadowWidth = -1;\n      this._shadowHeight = -1;\n      this._shaderResources.initializeContext(this._gl);\n      this._textureShader.initializeContext(this._gl);\n      this._lassoShader.initializeContext(this._gl);\n      this._sdfTextShader.initializeContext(this._gl);\n      this._gridShader.initializeContext(this._gl);\n      this._blockShader.initializeContext(this._gl);\n      this._sphereShader.initializeContext(this._gl);\n      this._cylinderShader.initializeContext(this._gl);\n      this._sdfShader.initializeContext(this._gl);\n      this._backgroundShader.initializeContext(this._gl);\n      this._ssaoShader.initializeContext(this._gl);\n      this._boxShader.initializeContext(this._gl);\n      this._deferredShader.initializeContext(this._gl);\n      this._combineShader.initializeContext(this._gl);\n      this._dofBlurShader.initializeContext(this._gl);\n      this._downsampleShader.initializeContext(this._gl);\n      this._gaussianShader.initializeContext(this._gl);\n      this._dofCombineShader.initializeContext(this._gl);\n      this._fxaaShader.initializeContext(this._gl);\n      this._brightPassShader.initializeContext(this._gl);\n      this._quad.initializeContext(this._gl);\n      this._lasso.initializeContext(this._gl);\n      this._framebuffers = [null, null];\n      const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, this._core.config.pickWidth, this._core.config.pickHeight);\n      const framebuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(framebuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._pickFrameBuffer = framebuffer;\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        this.transitionBuffers[i].initializeContext(this._gl);\n      }\n      if (this._axes1) {\n        for (let i = 0; i < this._axes1.length; i++) {\n          this._axes1[i].initializeContext(this._gl);\n        }\n      }\n      if (this._axes2) {\n        for (let i = 0; i < this._axes2.length; i++) {\n          this._axes2[i].initializeContext(this._gl);\n        }\n      }\n      for (let i = 0; i < this.labelSets.length; i++) {\n        this.labelSets[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.images.length; i++) {\n        this.images[i].initializeContext(this._gl);\n      }\n    }\n    _resize(width2, height2) {\n      super._resize(width2, height2);\n      this._positionTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.NEAREST, null, this._gl.RGBA32F);\n      this._colorTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._normalTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._geometryFrameBuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._positionTexture, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT1, this._gl.TEXTURE_2D, this._colorTexture, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT2, this._gl.TEXTURE_2D, this._normalTexture, 0);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, width2, height2);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.drawBuffers([this._gl.COLOR_ATTACHMENT0, this._gl.COLOR_ATTACHMENT1, this._gl.COLOR_ATTACHMENT2]);\n      this._postProcessTexture1 = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessDepthTexture = TextureHelper.create(this._gl, width2, height2, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n      this._postProcessFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture1, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._postProcessDepthTexture, 0);\n      this._postProcessTexture2 = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture2, 0);\n      this._postProcessDofTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RED, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.R32F);\n      this._postProcessDofFrameBuffer = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessDofTexture, 0);\n      const widthHalf = Math.round(width2 / 2);\n      const heightHalf = Math.round(height2 / 2);\n      this._postProcessHalfTexture1 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessHalfFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture1, 0);\n      this._postProcessHalfTexture2 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessHalfFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture2, 0);\n      const widthQuarter = Math.round(widthHalf / 2);\n      const heightQuarter = Math.round(heightHalf / 2);\n      this._postProcessQuarterTexture1 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessQuarterFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture1, 0);\n      this._postProcessQuarterTexture2 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessQuarterFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture2, 0);\n      const widthEighth = Math.round(widthQuarter / 2);\n      const heightEighth = Math.round(heightQuarter / 2);\n      this._postProcessEighthTexture1 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessEighthFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture1, 0);\n      this._postProcessEighthTexture2 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessEighthFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture2, 0);\n      const widthSixteenth = Math.round(widthEighth / 2);\n      const hgeightSixteenth = Math.round(heightEighth / 2);\n      this._postProcessSixteenthTexture1 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessSixteenthFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture1, 0);\n      this._postProcessSixteenthTexture2 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessSixteenthFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture2, 0);\n      this._core.log.write(LogLevel.info, `buffers resized ${width2},${height2}`);\n    }\n    _createContext(canvas) {\n      let supported = false;\n      const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === void 0 ? false : this._options.preserveDrawingBuffer : false;\n      const options2 = {\n        stencil: true,\n        alpha: false,\n        antialias: false,\n        preserveDrawingBuffer\n      };\n      const gl = canvas.getContext(\"webgl2\", options2);\n      if (gl) {\n        const OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n        const EXT_color_buffer_float = gl.getExtension(\"EXT_color_buffer_float\");\n        if (OES_texture_float_linear && EXT_color_buffer_float && gl.MAX_DRAW_BUFFERS > 3) {\n          const texture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.FLOAT, gl.LINEAR, null, gl.RGBA32F);\n          const framebuffer = gl.createFramebuffer();\n          gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n          gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n          const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n          if (status == gl.FRAMEBUFFER_COMPLETE) {\n            supported = true;\n          }\n          gl.bindTexture(gl.TEXTURE_2D, null);\n        }\n      }\n      return supported ? gl : null;\n    }\n    prepare() {\n      let viewport;\n      switch (this._core.config.stereoMode) {\n        case StereoMode.none:\n          viewport = this._viewports[0];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 0;\n          this._viewportCount = 1;\n          break;\n        case StereoMode.left:\n          viewport = this._viewports[0];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 0;\n          this._viewportCount = 1;\n          break;\n        case StereoMode.right:\n          viewport = this._viewports[1];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 1;\n          this._viewportCount = 1;\n          break;\n      }\n    }\n    createTransitionBuffer(ids) {\n      const buffer = new TransitionBuffer(this._core, ids);\n      buffer.initializeContext(this._gl);\n      return buffer;\n    }\n    createCartesian2dAxesVisual(axes) {\n      const visual = new Cartesian2dVisual(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n      const visual = new Cartesian3dVisual(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    _createLabelVisual(label2) {\n      return new LabelVisual(this._core, this, label2);\n    }\n    createLabelSetVisual(labelSet) {\n      const visual = new LabelSetVisual(this._core, this, labelSet);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createImageVisual(image2) {\n      const visual = new ImageVisual(this._core, this, image2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createFontVisual(font2) {\n      const visual = new FontVisual(this._core, font2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    getDataUrl(mimeType) {\n      return this._canvas.toDataURL(mimeType);\n    }\n    update(elapsedTime) {\n      super.update(elapsedTime);\n      if (this._shadowWidth != this._config.shadowWidth || this._shadowHeight != this._config.shadowHeight) {\n        this._shadowWidth = this._config.shadowWidth;\n        this._shadowHeight = this._config.shadowHeight;\n        this._shadowColorTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        this._shadowDepthTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n        this._shadowFrameBuffer = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._shadowFrameBuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._shadowColorTexture, 0);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._shadowDepthTexture, 0);\n        this._core.log.write(LogLevel.info, `shadow map resized ${this._shadowWidth},${this._shadowHeight}`);\n      }\n      if (this._ssaoWidth != this._config.ssaoWidth || this._ssaoHeight != this._config.ssaoHeight) {\n        this._ssaoWidth = this._config.ssaoWidth;\n        this._ssaoHeight = this._config.ssaoHeight;\n        this._ssaoTexture1 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n        this._ssaoFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture1, 0);\n        this._ssaoTexture2 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n        this._ssaoFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture2, 0);\n        this._core.log.write(LogLevel.info, `ssao map resized ${this._ssaoWidth},${this._ssaoHeight}`);\n      }\n      if (this._config.isDofEnabled && this._config.dofAutoFocus) {\n        this._core.getModelManipulationOrigin(this._modelManipulationOrigin);\n        this._core.getModelPosition(this._modelPosition);\n        add$4(this._position, this._modelManipulationOrigin, this._modelPosition);\n        this._core.camera.getPosition(this._cameraPosition);\n        subtract(this._position, this._position, this._cameraPosition);\n        const distance2 = -this._position[2];\n        const amount = Math.min(elapsedTime * this._core.config.focusSmoothing, 1);\n        this._config.dofFocusDistance = MathHelper.lerp(this._config.dofFocusDistance, distance2, amount);\n      }\n    }\n    render(elapsedTime) {\n      return __awaiter$1(this, void 0, void 0, function* () {\n        this._gl.enable(this._gl.DEPTH_TEST);\n        this._gl.enable(this._gl.CULL_FACE);\n        this._gl.cullFace(this._gl.BACK);\n        this._gl.disable(this._gl.BLEND);\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.clearColor(0, 0, 0, 0);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n        this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1);\n        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT | this._gl.STENCIL_BUFFER_BIT);\n        if (this.config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.clear(this._gl.DEPTH_BUFFER_BIT);\n          perspective(this._shadowPMatrix, AngleHelper.degreesToRadians(30), this._config.shadowWidth / this._config.shadowHeight, this._core.config.nearPlane, this._core.config.farPlane);\n          set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n          fromMat4(this._cameraRotation, this.inverseVMatrices[0]);\n          transformMat3(this._position, this._config.keyLightPosition, this._cameraRotation);\n          add$4(this._position, this._position, this._modelPosition);\n          lookAt(this._shadowVMatrix, this._position, this._modelPosition, Constants$1.VECTOR3_UNITY);\n        }\n        for (let i = 0; i < this.transitionBuffers.length; i++) {\n          const transitionBuffer = this.transitionBuffers[i];\n          if (transitionBuffer.isVisible) {\n            this._renderTransitionBuffer(transitionBuffer);\n          }\n        }\n        const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n        if (axesVisuals) {\n          for (let i = 0; i < axesVisuals.length; i++) {\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n              axesVisual.pickedIdColor = this._pickedIdColor;\n              axesVisual.pickFramebuffer = this._pickFrameBuffer;\n              axesVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              axesVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this.areLabelsVisible) {\n          for (let i = 0; i < this.labelSets.length; i++) {\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n              labelSetVisual.pickedIdColor = this._pickedIdColor;\n              labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n              labelSetVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              labelSetVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this.areImagesVisible) {\n          for (let i = 0; i < this.images.length; i++) {\n            const imageVisual = this.images[i];\n            if (imageVisual.isVisible) {\n              imageVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              imageVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this._backgroundShader.isInitialized) {\n          this._backgroundShader.prepare();\n          this._backgroundShader.color = fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n          this._backgroundShader.apply();\n          this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewport = i + this._viewportOffset;\n            this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n          this._gl.bindVertexArray(null);\n        }\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n          this._pickedType = PickHelper.decodeType(this._pickedPixels);\n          set$7(this._pickedIdColor, this._pickedPixels[0] / 255, this._pickedPixels[1] / 255, this._pickedPixels[2] / 255, this._pickedPixels[3] / 255);\n          this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n        } else {\n          set$7(this._pickedIdColor, 0, 0, 0, 0);\n          this._pickedId = 0;\n        }\n        if (this.transitionBuffers.length > 0 && this._quad.isInitialized) {\n          const viewport = this._viewportOffset;\n          this._postProcess(this.vMatrices[viewport], this.inverseVMatrices[viewport], this.pMatrices[viewport], this._viewports[viewport]);\n        }\n        if (this.isLassoPicking && this._lassoShader.isInitialized) {\n          this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n          this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n          const lassoWidth = this.lassoX1 - this.lassoX0;\n          const lassoHeight = this.lassoY1 - this.lassoY0;\n          this._lassoShader.prepare();\n          this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n          this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n          this._lassoShader.apply();\n          const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewportIndex = i + this._viewportOffset;\n            this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n            const viewport = this._viewports[viewportIndex];\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n            this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n            this._lassoMMatrix[10] = 1;\n            this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n            this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n            this._lassoShader.mMatrix = this._lassoMMatrix;\n            set$5(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n            this._lassoShader.thickness = this._lassoThickness;\n            this._lassoShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      });\n    }\n    _renderTransitionBuffer(transitionBuffer) {\n      const currentBuffer = transitionBuffer.currentBuffer;\n      const previousBuffer = transitionBuffer.previousBuffer;\n      const currentPalette = transitionBuffer.currentPalette;\n      const previousPalette = transitionBuffer.previousPalette;\n      const currentAtlas = transitionBuffer.currentAtlas;\n      const previousAtlas = transitionBuffer.previousAtlas;\n      const unitType = transitionBuffer.unitType === void 0 ? currentBuffer.unitType : transitionBuffer.unitType;\n      const id2 = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n      const hoverId = id2 > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id2) : -1;\n      const activeId = transitionBuffer.activeId;\n      if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf)) {\n        this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._blockShader.prepare();\n        this._blockShader.mMatrix = this.mMatrix;\n        this._blockShader.time = this.transitionTime;\n        this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._blockShader.rangeMin = currentBuffer.from;\n        this._blockShader.rangeMax = currentBuffer.to;\n        this._blockShader.hover = hoverId;\n        this._blockShader.active = activeId;\n        this._blockShader.specularPower = this._config.specularPower;\n        this._blockShader.specularIntensity = this._config.specularIntensity;\n        this._blockShader.apply();\n        this._blockShader.isPickShader = false;\n        this._blockShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._blockShader.vMatrix = this.vMatrices[viewport];\n          this._blockShader.pMatrix = this.pMatrices[viewport];\n          this._blockShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._gl.cullFace(this._gl.FRONT);\n          this._blockShader.isPickShader = false;\n          this._blockShader.isShadowMap = true;\n          this._blockShader.vMatrix = this._shadowVMatrix;\n          this._blockShader.pMatrix = this._shadowPMatrix;\n          this._blockShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n          this._gl.cullFace(this._gl.BACK);\n        }\n        if (this.isPickingEnabled) {\n          this._blockShader.isPickShader = true;\n          this._blockShader.isShadowMap = false;\n          this._blockShader.pMatrix = this.pickPMatrix;\n          this._blockShader.vMatrix = this.pickVMatrix;\n          this._blockShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf)) {\n        this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sphereShader.prepare();\n        this._sphereShader.mMatrix = this.mMatrix;\n        this._sphereShader.time = this.transitionTime;\n        this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sphereShader.rangeMin = currentBuffer.from;\n        this._sphereShader.rangeMax = currentBuffer.to;\n        this._sphereShader.hover = hoverId;\n        this._sphereShader.active = activeId;\n        this._sphereShader.specularPower = this._config.specularPower;\n        this._sphereShader.specularIntensity = this._config.specularIntensity;\n        this._sphereShader.apply();\n        this._sphereShader.isPickShader = false;\n        this._sphereShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._sphereShader.vMatrix = this.vMatrices[viewport];\n          this._sphereShader.pMatrix = this.pMatrices[viewport];\n          this._sphereShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._sphereShader.isPickShader = false;\n          this._sphereShader.isShadowMap = true;\n          this._sphereShader.vMatrix = this._shadowVMatrix;\n          this._sphereShader.pMatrix = this._shadowPMatrix;\n          this._sphereShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n        }\n        if (this.isPickingEnabled) {\n          this._sphereShader.isPickShader = true;\n          this._sphereShader.isShadowMap = false;\n          this._sphereShader.pMatrix = this.pickPMatrix;\n          this._sphereShader.vMatrix = this.pickVMatrix;\n          this._sphereShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n        this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._cylinderShader.prepare();\n        this._cylinderShader.mMatrix = this.mMatrix;\n        this._cylinderShader.time = this.transitionTime;\n        this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._cylinderShader.rangeMin = currentBuffer.from;\n        this._cylinderShader.rangeMax = currentBuffer.to;\n        this._cylinderShader.hover = hoverId;\n        this._cylinderShader.active = activeId;\n        this._cylinderShader.specularPower = this._config.specularPower;\n        this._cylinderShader.specularIntensity = this._config.specularIntensity;\n        this._cylinderShader.apply();\n        this._cylinderShader.isPickShader = false;\n        this._cylinderShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._cylinderShader.vMatrix = this.vMatrices[viewport];\n          this._cylinderShader.pMatrix = this.pMatrices[viewport];\n          this._cylinderShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._cylinderShader.isPickShader = false;\n          this._cylinderShader.isShadowMap = true;\n          this._cylinderShader.vMatrix = this._shadowVMatrix;\n          this._cylinderShader.pMatrix = this._shadowPMatrix;\n          this._cylinderShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n        }\n        if (this.isPickingEnabled) {\n          this._cylinderShader.isPickShader = true;\n          this._cylinderShader.isShadowMap = false;\n          this._cylinderShader.pMatrix = this.pickPMatrix;\n          this._cylinderShader.vMatrix = this.pickVMatrix;\n          this._cylinderShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n        this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n        this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n        this._sdfShader.prepare();\n        this._sdfShader.mMatrix = this.mMatrix;\n        this._sdfShader.time = this.transitionTime;\n        this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sdfShader.rangeMin = currentBuffer.from;\n        this._sdfShader.rangeMax = currentBuffer.to;\n        this._sdfShader.hover = hoverId;\n        this._sdfShader.active = activeId;\n        this._sdfShader.specularPower = this._config.specularPower;\n        this._sdfShader.specularIntensity = this._config.specularIntensity;\n        this._sdfShader.apply();\n        this._sdfShader.isPickShader = false;\n        this._sdfShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._sdfShader.vMatrix = this.vMatrices[viewport];\n          this._sdfShader.pMatrix = this.pMatrices[viewport];\n          this._sdfShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._gl.cullFace(this._gl.FRONT);\n          this._sdfShader.isPickShader = false;\n          this._sdfShader.isShadowMap = true;\n          this._sdfShader.vMatrix = this._shadowVMatrix;\n          this._sdfShader.pMatrix = this._shadowPMatrix;\n          this._sdfShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n          this._gl.cullFace(this._gl.BACK);\n        }\n        if (this.isPickingEnabled) {\n          this._sdfShader.isPickShader = true;\n          this._sdfShader.isShadowMap = false;\n          this._sdfShader.pMatrix = this.pickPMatrix;\n          this._sdfShader.vMatrix = this.pickVMatrix;\n          this._sdfShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      }\n    }\n    _postProcess(vMatrix, inverseVMatrix, pMatrix, viewport) {\n      if (this._deferredShader.isInitialized) {\n        this._gl.disable(this._gl.DEPTH_TEST);\n        let ssaoTexture;\n        if (this._config.isSsaoEnabled && this._ssaoShader.isInitialized) {\n          this._gl.viewport(0, 0, this._config.ssaoWidth, this._config.ssaoHeight);\n          ssaoTexture = this._ssaoTexture1;\n          this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer1);\n          this._ssaoShader.vertexBuffer = this._quad.vertexBuffer;\n          this._ssaoShader.indexBuffer = this._quad.indexBuffer;\n          this._ssaoShader.texture2D1 = this._positionTexture;\n          this._ssaoShader.texture2D2 = this._normalTexture;\n          this._ssaoShader.texture2D3 = this._ssaoNoiseTexture;\n          this._ssaoShader.prepare();\n          this._ssaoShader.pMatrix = pMatrix;\n          this._ssaoShader.ssaoNoiseSize = this._config.ssaoNoiseSize;\n          this._ssaoShader.ssaoRadius = this._config.ssaoRadius;\n          this._ssaoShader.ssaoPower = this._config.ssaoPower;\n          this._ssaoShader.ssaoKernel = this._ssaoSampleKernel;\n          this._ssaoShader.left = 0;\n          this._ssaoShader.top = 0;\n          this._ssaoShader.width = this._config.ssaoWidth;\n          this._ssaoShader.height = this._config.ssaoHeight;\n          this._ssaoShader.apply();\n          this._ssaoShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          if (this._config.ssaoBlurEnabled && this._boxShader.isInitialized) {\n            ssaoTexture = this._ssaoTexture2;\n            this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer2);\n            this._boxShader.vertexBuffer = this._quad.vertexBuffer;\n            this._boxShader.indexBuffer = this._quad.indexBuffer;\n            this._boxShader.texture2D = this._ssaoTexture1;\n            this._boxShader.prepare();\n            this._boxShader.left = 0;\n            this._boxShader.top = 0;\n            this._boxShader.width = this._config.ssaoWidth;\n            this._boxShader.height = this._config.ssaoHeight;\n            this._boxShader.apply();\n            this._boxShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n        this._gl.viewport(viewport.left, viewport.top, viewport.width, viewport.height);\n        let postProcessFrameBuffer = this._postProcessFrameBuffer1;\n        this._shaderResources.bindFramebuffer(postProcessFrameBuffer);\n        this._deferredShader.vertexBuffer = this._quad.vertexBuffer;\n        this._deferredShader.indexBuffer = this._quad.indexBuffer;\n        this._deferredShader.texture2D1 = this._positionTexture;\n        this._deferredShader.texture2D2 = this._colorTexture;\n        this._deferredShader.texture2D3 = this._normalTexture;\n        this._deferredShader.texture2D4 = this._config.isSsaoEnabled ? ssaoTexture : null;\n        this._deferredShader.texture2D5 = this._shadowDepthTexture;\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n        this._deferredShader.prepare();\n        this._deferredShader.isShadowEnabled = this._config.isShadowEnabled;\n        this._deferredShader.isSsaoEnabled = this._config.isSsaoEnabled;\n        this._deferredShader.inverseVMatrix = inverseVMatrix;\n        this._deferredShader.shadowVMatrix = this._shadowVMatrix;\n        this._deferredShader.shadowPMatrix = this._shadowPMatrix;\n        this._deferredShader.vMatrix = vMatrix;\n        this._deferredShader.keyLightIntensity = this._config.keyLightIntensity;\n        this._deferredShader.fillLight1Intensity = this._config.fillLight1Intensity;\n        this._deferredShader.fillLight2Intensity = this._config.fillLight2Intensity;\n        this._core.camera.getPosition(this._cameraPosition);\n        fromMat4(this._cameraRotation, vMatrix);\n        set$8(this._position, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n        normalize$5(this._deferredShader.directionToKeyLight, this._config.keyLightPosition);\n        subtract(this._direction, this._cameraPosition, this._position);\n        normalize$5(this._direction, this._direction);\n        add$4(this._deferredShader.keyLightHalfAngle, this._direction, this._deferredShader.directionToKeyLight);\n        normalize$5(this._deferredShader.keyLightHalfAngle, this._deferredShader.keyLightHalfAngle);\n        copy$6(this._deferredShader.directionToFillLight1, this._config.fillLight1Position);\n        copy$6(this._deferredShader.directionToFillLight2, this._config.fillLight2Position);\n        this._deferredShader.left = viewport.left;\n        this._deferredShader.top = viewport.top;\n        this._deferredShader.width = viewport.width;\n        this._deferredShader.height = viewport.height;\n        this._deferredShader.shadowMapWidth = this._config.shadowWidth;\n        this._deferredShader.shadowMapHeight = this._config.shadowHeight;\n        this._deferredShader.ambientIntensity = this._config.ambientIntensity;\n        this._deferredShader.materialIntensity = this._config.materialIntensity;\n        this._deferredShader.specularPower = this._config.specularPower;\n        this._deferredShader.specularIntensity = this._config.specularIntensity;\n        this._deferredShader.apply();\n        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        const widthHalf = Math.round(viewport.width / 2);\n        const heightHalf = Math.round(viewport.height / 2);\n        const widthQuarter = Math.round(widthHalf / 2);\n        const heightQuarter = Math.round(heightHalf / 2);\n        const widthEighth = Math.round(widthQuarter / 2);\n        const heightEighth = Math.round(heightQuarter / 2);\n        const widthSixteenth = Math.round(widthEighth / 2);\n        const heightSixteenth = Math.round(heightEighth / 2);\n        if (this._config.isDofEnabled && this._dofBlurShader.isInitialized && this._dofCombineShader.isInitialized) {\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n          this._dofBlurShader.vertexBuffer = this._quad.vertexBuffer;\n          this._dofBlurShader.indexBuffer = this._quad.indexBuffer;\n          this._dofBlurShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._dofBlurShader.texture2D2 = this._positionTexture;\n          this._dofBlurShader.prepare();\n          this._dofBlurShader.focusDepth = this._config.dofFocusDistance;\n          this._dofBlurShader.nearFocusDepth = this._config.dofFocusDistance - this._config.dofFocusRange / 2;\n          this._dofBlurShader.farFocusDepth = this._config.dofFocusDistance + this._config.dofFocusRange / 2;\n          this._dofBlurShader.maxBackgroundBlur = this._config.dofMaxBackgroundBlur;\n          this._dofBlurShader.left = viewport.left;\n          this._dofBlurShader.top = viewport.top;\n          this._dofBlurShader.width = viewport.width;\n          this._dofBlurShader.height = viewport.height;\n          this._dofBlurShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n          this._dofCombineShader.vertexBuffer = this._quad.vertexBuffer;\n          this._dofCombineShader.indexBuffer = this._quad.indexBuffer;\n          this._dofCombineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._dofCombineShader.texture2D2 = this._postProcessDofTexture;\n          this._dofCombineShader.prepare();\n          this._dofCombineShader.focusDepth = this._config.dofFocusDistance;\n          this._dofCombineShader.left = viewport.left;\n          this._dofCombineShader.top = viewport.top;\n          this._dofCombineShader.width = viewport.width;\n          this._dofCombineShader.height = viewport.height;\n          this._dofCombineShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this._config.isBloomEnabled && this._brightPassShader.isInitialized && this._gaussianShader.isInitialized) {\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthHalf;\n          this._brightPassShader.height = heightHalf;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessHalfTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthQuarter;\n          this._brightPassShader.height = heightQuarter;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessQuarterTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthEighth;\n          this._brightPassShader.height = heightEighth;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessEighthTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthSixteenth;\n          this._brightPassShader.height = heightSixteenth;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessHalfTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthHalf;\n          this._gaussianShader.height = heightHalf;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessHalfTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessQuarterTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthQuarter;\n          this._gaussianShader.height = heightQuarter;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessQuarterTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessEighthTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthEighth;\n          this._gaussianShader.height = heightEighth;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessEighthTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessSixteenthTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthSixteenth;\n          this._gaussianShader.height = heightSixteenth;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessSixteenthTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this._config.isFxaaEnabled && this._fxaaShader.isInitialized) {\n          postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n          this._fxaaShader.vertexBuffer = this._quad.vertexBuffer;\n          this._fxaaShader.indexBuffer = this._quad.indexBuffer;\n          this._fxaaShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._fxaaShader.prepare();\n          this._fxaaShader.left = viewport.left;\n          this._fxaaShader.top = viewport.top;\n          this._fxaaShader.width = viewport.width;\n          this._fxaaShader.height = viewport.height;\n          this._fxaaShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        this._shaderResources.bindFramebuffer(null);\n        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n        this._combineShader.vertexBuffer = this._quad.vertexBuffer;\n        this._combineShader.indexBuffer = this._quad.indexBuffer;\n        this._combineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n        if (this._config.isBloomEnabled) {\n          this._combineShader.texture2D2 = this._postProcessHalfTexture1;\n          this._combineShader.texture2D3 = this._postProcessQuarterTexture1;\n          this._combineShader.texture2D4 = this._postProcessEighthTexture1;\n          this._combineShader.texture2D5 = this._postProcessSixteenthTexture1;\n        } else {\n          this._combineShader.texture2D2 = null;\n          this._combineShader.texture2D3 = null;\n          this._combineShader.texture2D4 = null;\n          this._combineShader.texture2D5 = null;\n        }\n        this._combineShader.prepare();\n        this._combineShader.viewport = viewport;\n        this._combineShader.intensity = this._config.bloomIntensity;\n        this._combineShader.apply();\n        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n      }\n    }\n  }\n  (function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  });\n  class MaterialBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * MaterialBufferData.SIZE);\n      this.TYPE_OFFSET = 0 / 4;\n      this.FUZZ_OFFSET = 4 / 4;\n      this.REFRACTIVE_INDEX_OFFSET = 8 / 4;\n      this.TEXTURE_ID_OFFSET = 12 / 4;\n      this.COLOR_OFFSET = 16 / 4;\n      this.GLOSSINESS_OFFSET = 28 / 4;\n      this.ID_COLOR_OFFSET = 32 / 4;\n      this.DENSITY_OFFSET = 48 / 4;\n    }\n    getType(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getFuzz(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.FUZZ_OFFSET];\n    }\n    setFuzz(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.FUZZ_OFFSET] = value2;\n    }\n    getRefractiveIndex(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.REFRACTIVE_INDEX_OFFSET];\n    }\n    setRefractiveIndex(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.REFRACTIVE_INDEX_OFFSET] = value2;\n    }\n    getTextureId(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.TEXTURE_ID_OFFSET];\n    }\n    setTextureId(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.TEXTURE_ID_OFFSET] = value2;\n    }\n    getColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getGlossiness(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.GLOSSINESS_OFFSET];\n    }\n    setGlossiness(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.GLOSSINESS_OFFSET] = value2;\n    }\n    getDensity(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.DENSITY_OFFSET];\n    }\n    setDensity(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.DENSITY_OFFSET] = value2;\n    }\n    getIdColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.ID_COLOR_OFFSET;\n      set$7(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setIdColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.ID_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  MaterialBufferData.SIZE = 64 / 4;\n  class TextureBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * TextureBufferData.SIZE);\n      this.COLOR0_OFFSET = 0 / 4;\n      this.TYPE_OFFSET = 12 / 4;\n      this.COLOR1_OFFSET = 16 / 4;\n      this.SIZE0_OFFSET = 32 / 4;\n      this.SIZE1_OFFSET = 48 / 4;\n      this.CLIP_OFFSET = 64 / 4;\n      this.OFFSET_OFFSET = 80 / 4;\n    }\n    getType(index2) {\n      return this[TextureBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[TextureBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getColor0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR0_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getColor1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR1_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      set$7(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setSize0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getSize1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      set$7(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setSize1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getClip(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.CLIP_OFFSET;\n      set$7(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setClip(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.CLIP_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getOffset(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.OFFSET_OFFSET;\n      set$5(value2, this[offset2], this[offset2 + 1]);\n    }\n    setOffset(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.OFFSET_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n  }\n  TextureBufferData.SIZE = 96 / 4;\n  class HittableBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * HittableBufferData.SIZE);\n      this.CENTER0_OFFSET = 0 / 4;\n      this.TYPE_OFFSET = 12 / 4;\n      this.SIZE0_OFFSET = 16 / 4;\n      this.MATERIAL_ID_OFFSET = 28 / 4;\n      this.ROTATION0_OFFSET = 32 / 4;\n      this.ROTATION1_OFFSET = 48 / 4;\n      this.TEXCOORD0_OFFSET = 64 / 4;\n      this.TEXCOORD1_OFFSET = 72 / 4;\n      this.CENTER1_OFFSET = 80 / 4;\n      this.ROUNDING_OFFSET = 92 / 4;\n      this.SIZE1_OFFSET = 96 / 4;\n      this.BOUNDARY_TYPE_OFFSET = 108 / 4;\n      this.TIME0_OFFSET = 112 / 4;\n      this.TIME1_OFFSET = 116 / 4;\n      this.TEX_ID_OFFSET = 120 / 4;\n      this.SDF_BUFFER_OFFSET = 124 / 4;\n      this.SDF_BORDER_OFFSET = 128 / 4;\n      this.PARAMETER_1_OFFSET = 132 / 4;\n      this.PARAMETER_2_OFFSET = 136 / 4;\n      this.MATERIAL_FUZZ_OFFSET = 140 / 4;\n      this.MATERIAL_GLOSS_OFFSET = 144 / 4;\n      this.MATERIAL_DENSITY_OFFSET = 148 / 4;\n      this.MATERIAL_REFRACTIVE_INDEX_OFFSET = 152 / 4;\n      this.MATERIAL_COLOR_OFFSET = 160 / 4;\n      this.MATERIAL_TYPE_ID_OFFSET = 172 / 4;\n      this.SEGMENT_COLOR_OFFSET = 176 / 4;\n      this.TEXTURE_TYPE_ID_OFFSET = 192 / 4;\n      this.TEXTURE_ID_OFFSET = 196 / 4;\n    }\n    getType(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getCenter0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER0_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getCenter1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER1_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getTime0(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TIME0_OFFSET];\n    }\n    setTime0(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TIME0_OFFSET] = value2;\n    }\n    getTime1(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TIME1_OFFSET];\n    }\n    setTime1(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TIME1_OFFSET] = value2;\n    }\n    getSize0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getRotation0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION0_OFFSET;\n      set$6(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getRotation1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION1_OFFSET;\n      set$6(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getTexCoord0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD0_OFFSET;\n      set$5(value2, this[offset2], this[offset2 + 1]);\n    }\n    setTexCoord0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n    getTexCoord1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD1_OFFSET;\n      set$5(value2, this[offset2], this[offset2 + 1]);\n    }\n    setTexCoord1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n    getRounding(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.ROUNDING_OFFSET];\n    }\n    setRounding(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.ROUNDING_OFFSET] = value2;\n    }\n    getParameter1(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.PARAMETER_1_OFFSET];\n    }\n    setParameter1(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.PARAMETER_1_OFFSET] = value2;\n    }\n    getParameter2(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.PARAMETER_2_OFFSET];\n    }\n    setParameter2(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.PARAMETER_2_OFFSET] = value2;\n    }\n    getBoundaryType(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.BOUNDARY_TYPE_OFFSET];\n    }\n    setBoundaryType(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.BOUNDARY_TYPE_OFFSET] = value2;\n    }\n    getTexId(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TEX_ID_OFFSET];\n    }\n    setTexId(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TEX_ID_OFFSET] = value2;\n    }\n    getSdfBuffer(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.SDF_BUFFER_OFFSET];\n    }\n    setSdfBuffer(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.SDF_BUFFER_OFFSET] = value2;\n    }\n    getSdfBorder(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.SDF_BORDER_OFFSET];\n    }\n    setSdfBorder(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.SDF_BORDER_OFFSET] = value2;\n    }\n    getMaterialTypeId(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_TYPE_ID_OFFSET];\n    }\n    setMaterialTypeId(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_TYPE_ID_OFFSET] = value2;\n    }\n    getMaterialFuzz(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_FUZZ_OFFSET];\n    }\n    setMaterialFuzz(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_FUZZ_OFFSET] = value2;\n    }\n    getMaterialDensity(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_DENSITY_OFFSET];\n    }\n    setMaterialDensity(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_DENSITY_OFFSET] = value2;\n    }\n    getMaterialGloss(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_GLOSS_OFFSET];\n    }\n    setMaterialGloss(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_GLOSS_OFFSET] = value2;\n    }\n    getMaterialRefractiveIndex(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_REFRACTIVE_INDEX_OFFSET];\n    }\n    setMaterialRefractiveIndex(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_REFRACTIVE_INDEX_OFFSET] = value2;\n    }\n    getMaterialColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.MATERIAL_COLOR_OFFSET;\n      value2[0] = this[offset2];\n      value2[1] = this[offset2 + 1];\n      value2[2] = this[offset2 + 2];\n    }\n    setMaterialColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.MATERIAL_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSegmentColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SEGMENT_COLOR_OFFSET;\n      value2[0] = this[offset2];\n      value2[1] = this[offset2 + 1];\n      value2[2] = this[offset2 + 2];\n      value2[3] = this[offset2 + 3];\n    }\n    setSegmentColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SEGMENT_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  HittableBufferData.SIZE = 208 / 4;\n  class ComputeUniformBufferData extends Float32Array {\n    constructor() {\n      super(ComputeUniformBufferData.SIZE);\n      this.POSITION_OFFSET = 0 / 4;\n      this.WIDTH_OFFSET = 12 / 4;\n      this.RIGHT_OFFSET = 16 / 4;\n      this.HEIGHT_OFFSET = 28 / 4;\n      this.UP_OFFSET = 32 / 4;\n      this.SEED_OFFSET = 44 / 4;\n      this.FORWARD_OFFSET = 48 / 4;\n      this.FOV_OFFSET = 60 / 4;\n      this.BACKGROUND_COLOR_OFFSET = 64 / 4;\n      this.TIME0_OFFSET = 76 / 4;\n      this.AMBIENT_COLOR_OFFSET = 80 / 4;\n      this.TIME1_OFFSET = 92 / 4;\n      this.TILES_X = 96 / 4;\n      this.TILES_Y = 100 / 4;\n      this.TILE_OFFSET_X = 104 / 4;\n      this.TILE_OFFSET_Y = 108 / 4;\n      this.LOOKAT_OFFSET = 112 / 4;\n      this.APERTURE_OFFSET = 124 / 4;\n      this.FOCUS_DISTANCE_OFFSET = 128 / 4;\n      this.RAYS_PER_FRAME_OFFSET = 132 / 4;\n    }\n    getFocusDistance() {\n      return this[this.FOCUS_DISTANCE_OFFSET];\n    }\n    setFocusDistance(value2) {\n      this[this.FOCUS_DISTANCE_OFFSET] = value2;\n    }\n    getWidth() {\n      return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value2) {\n      this[this.WIDTH_OFFSET] = value2;\n    }\n    getHeight() {\n      return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value2) {\n      this[this.HEIGHT_OFFSET] = value2;\n    }\n    getSeed() {\n      return this[this.SEED_OFFSET];\n    }\n    setSeed(value2) {\n      this[this.SEED_OFFSET] = value2;\n    }\n    getRaysPerFrame() {\n      return this[this.RAYS_PER_FRAME_OFFSET];\n    }\n    setRaysPerFrame(value2) {\n      this[this.RAYS_PER_FRAME_OFFSET] = value2;\n    }\n    getFieldOfView() {\n      return this[this.FOV_OFFSET];\n    }\n    setFieldOfView(value2) {\n      this[this.FOV_OFFSET] = value2;\n    }\n    getAperture() {\n      return this[this.APERTURE_OFFSET];\n    }\n    setAperture(value2) {\n      this[this.APERTURE_OFFSET] = value2;\n    }\n    getPosition(value2) {\n      set$8(value2, this[this.POSITION_OFFSET], this[this.POSITION_OFFSET + 1], this[this.POSITION_OFFSET + 2]);\n    }\n    setPosition(value2) {\n      this[this.POSITION_OFFSET] = value2[0];\n      this[this.POSITION_OFFSET + 1] = value2[1];\n      this[this.POSITION_OFFSET + 2] = value2[2];\n    }\n    getRight(value2) {\n      set$8(value2, this[this.RIGHT_OFFSET], this[this.RIGHT_OFFSET + 1], this[this.RIGHT_OFFSET + 2]);\n    }\n    setRight(value2) {\n      this[this.RIGHT_OFFSET] = value2[0];\n      this[this.RIGHT_OFFSET + 1] = value2[1];\n      this[this.RIGHT_OFFSET + 2] = value2[2];\n    }\n    getUp(value2) {\n      set$8(value2, this[this.UP_OFFSET], this[this.UP_OFFSET + 1], this[this.UP_OFFSET + 2]);\n    }\n    setUp(value2) {\n      this[this.UP_OFFSET] = value2[0];\n      this[this.UP_OFFSET + 1] = value2[1];\n      this[this.UP_OFFSET + 2] = value2[2];\n    }\n    getForward(value2) {\n      set$8(value2, this[this.FORWARD_OFFSET], this[this.FORWARD_OFFSET + 1], this[this.FORWARD_OFFSET + 2]);\n    }\n    setForward(value2) {\n      this[this.FORWARD_OFFSET] = value2[0];\n      this[this.FORWARD_OFFSET + 1] = value2[1];\n      this[this.FORWARD_OFFSET + 2] = value2[2];\n    }\n    getBackgroundColor(value2) {\n      set$7(value2, this[this.BACKGROUND_COLOR_OFFSET], this[this.BACKGROUND_COLOR_OFFSET + 1], this[this.BACKGROUND_COLOR_OFFSET + 2], this[this.BACKGROUND_COLOR_OFFSET + 3]);\n    }\n    setBackgroundColor(value2) {\n      this[this.BACKGROUND_COLOR_OFFSET] = value2[0];\n      this[this.BACKGROUND_COLOR_OFFSET + 1] = value2[1];\n      this[this.BACKGROUND_COLOR_OFFSET + 2] = value2[2];\n      this[this.BACKGROUND_COLOR_OFFSET + 3] = value2[3];\n    }\n    getAmbientColor(value2) {\n      set$8(value2, this[this.AMBIENT_COLOR_OFFSET], this[this.AMBIENT_COLOR_OFFSET + 1], this[this.AMBIENT_COLOR_OFFSET + 2]);\n    }\n    setAmbientColor(value2) {\n      this[this.AMBIENT_COLOR_OFFSET] = value2[0];\n      this[this.AMBIENT_COLOR_OFFSET + 1] = value2[1];\n      this[this.AMBIENT_COLOR_OFFSET + 2] = value2[2];\n    }\n    getTime0() {\n      return this[this.TIME0_OFFSET];\n    }\n    setTime0(value2) {\n      this[this.TIME0_OFFSET] = value2;\n    }\n    getTime1() {\n      return this[this.TIME1_OFFSET];\n    }\n    setTime1(value2) {\n      this[this.TIME1_OFFSET] = value2;\n    }\n    getTilesX() {\n      return this[this.TILES_X];\n    }\n    setTilesX(value2) {\n      this[this.TILES_X] = value2;\n    }\n    getTilesY() {\n      return this[this.TILES_Y];\n    }\n    setTilesY(value2) {\n      this[this.TILES_Y] = value2;\n    }\n    getTileOffsetX() {\n      return this[this.TILE_OFFSET_X];\n    }\n    setTileOffsetX(value2) {\n      this[this.TILE_OFFSET_X] = value2;\n    }\n    getTileOffsetY() {\n      return this[this.TILE_OFFSET_Y];\n    }\n    setTileOffsetY(value2) {\n      this[this.TILE_OFFSET_Y] = value2;\n    }\n    getLookAt(value2) {\n      set$8(value2, this[this.LOOKAT_OFFSET], this[this.LOOKAT_OFFSET + 1], this[this.LOOKAT_OFFSET + 2]);\n    }\n    setLookAt(value2) {\n      this[this.LOOKAT_OFFSET] = value2[0];\n      this[this.LOOKAT_OFFSET + 1] = value2[1];\n      this[this.LOOKAT_OFFSET + 2] = value2[2];\n    }\n  }\n  ComputeUniformBufferData.SIZE = 144 / 4;\n  class FullscreenQuadUniformBufferData extends Float32Array {\n    constructor() {\n      super(FullscreenQuadUniformBufferData.SIZE);\n      this.WIDTH_OFFSET = 0 / 4;\n      this.HEIGHT_OFFSET = 4 / 4;\n      this.SPP_OFFSET = 8 / 4;\n      this.EXPOSURE_OFFSET = 12 / 4;\n      this.MIN_DEPTH_OFFSET = 16 / 4;\n      this.MAX_DEPTH_OFFSET = 20 / 4;\n      this.EDGE_NORMAL_OFFSET = 24 / 4;\n      this.EDGE_DEPTH_OFFSET = 28 / 4;\n      this.EDGE_FOREGROUND_OFFSET = 32 / 4;\n      this.EDGE_BACKGROUND_OFFSET = 48 / 4;\n    }\n    getWidth() {\n      return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value2) {\n      this[this.WIDTH_OFFSET] = value2;\n    }\n    getHeight() {\n      return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value2) {\n      this[this.HEIGHT_OFFSET] = value2;\n    }\n    getSamplesPerPixel() {\n      return this[this.SPP_OFFSET];\n    }\n    setSamplesPerPixel(value2) {\n      this[this.SPP_OFFSET] = value2;\n    }\n    getExposure() {\n      return this[this.EXPOSURE_OFFSET];\n    }\n    setExposure(value2) {\n      this[this.EXPOSURE_OFFSET] = value2;\n    }\n    getMinDepth() {\n      return this[this.MIN_DEPTH_OFFSET];\n    }\n    setMinDepth(value2) {\n      this[this.MIN_DEPTH_OFFSET] = value2;\n    }\n    getMaxDepth() {\n      return this[this.MAX_DEPTH_OFFSET];\n    }\n    setMaxDepth(value2) {\n      this[this.MAX_DEPTH_OFFSET] = value2;\n    }\n    getEdgeDepth() {\n      return this[this.EDGE_DEPTH_OFFSET];\n    }\n    setEdgeDepth(value2) {\n      this[this.EDGE_DEPTH_OFFSET] = value2;\n    }\n    getEdgeNormal() {\n      return this[this.EDGE_NORMAL_OFFSET];\n    }\n    setEdgeNormal(value2) {\n      this[this.EDGE_NORMAL_OFFSET] = value2;\n    }\n    getEdgeForeground(value2) {\n      set$7(value2, this[this.EDGE_FOREGROUND_OFFSET], this[this.EDGE_FOREGROUND_OFFSET + 1], this[this.EDGE_FOREGROUND_OFFSET + 2], this[this.EDGE_FOREGROUND_OFFSET + 3]);\n    }\n    setEdgeForeground(value2) {\n      this[this.EDGE_FOREGROUND_OFFSET] = value2[0];\n      this[this.EDGE_FOREGROUND_OFFSET + 1] = value2[1];\n      this[this.EDGE_FOREGROUND_OFFSET + 2] = value2[2];\n      this[this.EDGE_FOREGROUND_OFFSET + 3] = value2[3];\n    }\n    getEdgeBackground(value2) {\n      set$7(value2, this[this.EDGE_BACKGROUND_OFFSET], this[this.EDGE_BACKGROUND_OFFSET + 1], this[this.EDGE_BACKGROUND_OFFSET + 2], this[this.EDGE_BACKGROUND_OFFSET + 3]);\n    }\n    setEdgeBackground(value2) {\n      this[this.EDGE_BACKGROUND_OFFSET] = value2[0];\n      this[this.EDGE_BACKGROUND_OFFSET + 1] = value2[1];\n      this[this.EDGE_BACKGROUND_OFFSET + 2] = value2[2];\n      this[this.EDGE_BACKGROUND_OFFSET + 3] = value2[3];\n    }\n  }\n  FullscreenQuadUniformBufferData.SIZE = 64 / 4;\n  class LinearBVHNodeBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * LinearBVHNodeBufferData.SIZE);\n      this.CENTER_OFFSET = 0 / 4;\n      this.SIZE_OFFSET = 16 / 4;\n      this.PRIMITIVES_OFFSET_OFFSET = 12 / 4;\n      this.SECOND_CHILD_OFFSET_OFFSET = 28 / 4;\n      this.N_PRIMITIVES_OFFSET = 32 / 4;\n      this.AXIS_OFFSET = 36 / 4;\n    }\n    getCenter(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getPrimitivesOffset(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.PRIMITIVES_OFFSET_OFFSET];\n    }\n    setPrimitivesOffset(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.PRIMITIVES_OFFSET_OFFSET] = value2;\n    }\n    getSecondChildOffset(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.SECOND_CHILD_OFFSET_OFFSET];\n    }\n    setSecondChildOffset(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.SECOND_CHILD_OFFSET_OFFSET] = value2;\n    }\n    getNPrimitives(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.N_PRIMITIVES_OFFSET];\n    }\n    setNPrimitives(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.N_PRIMITIVES_OFFSET] = value2;\n    }\n    getAxis(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.AXIS_OFFSET];\n    }\n    setAxis(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.AXIS_OFFSET] = value2;\n    }\n  }\n  LinearBVHNodeBufferData.SIZE = 48 / 4;\n  class LightBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * LightBufferData.SIZE);\n      this.ROTATION_OFFSET = 0 / 4;\n      this.CENTER_OFFSET = 16 / 4;\n      this.TYPE_OFFSET = 28 / 4;\n      this.SIZE_OFFSET = 32 / 4;\n      this.COLOR_OFFSET = 48 / 4;\n    }\n    getType(index2) {\n      return this[LightBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[LightBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getCenter(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getColor(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getRotation(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.ROTATION_OFFSET;\n      set$6(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.ROTATION_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  LightBufferData.SIZE = 64 / 4;\n  (function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  });\n  const types = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    MorphChartsCore: Core\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function concat(...args) {\n    return args.reduce((p, c2) => c2 ? p.concat(c2) : p, []);\n  }\n  function allTruthy(...args) {\n    return args.reduce((p, c2) => c2 ? p.concat(c2) : p, []).filter(Boolean);\n  }\n  function push$1(arr, items) {\n    arr.push.apply(arr, items);\n  }\n  function addEl(tagName, parentElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n  }\n  function addDiv(parentElement, className2) {\n    const div = addEl(\"div\", parentElement);\n    if (className2) {\n      div.className = className2;\n    }\n    return div;\n  }\n  function outerSize$1(el) {\n    const cs = getComputedStyle(el);\n    const height2 = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width2 = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return { height: height2, width: width2 };\n  }\n  var isMergeableObject = function isMergeableObject2(value2) {\n    return isNonNullObject(value2) && !isSpecial(value2);\n  };\n  function isNonNullObject(value2) {\n    return !!value2 && typeof value2 === \"object\";\n  }\n  function isSpecial(value2) {\n    var stringValue = Object.prototype.toString.call(value2);\n    return stringValue === \"[object RegExp]\" || stringValue === \"[object Date]\" || isReactElement(value2);\n  }\n  var canUseSymbol = typeof Symbol === \"function\" && Symbol.for;\n  var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for(\"react.element\") : 60103;\n  function isReactElement(value2) {\n    return value2.$$typeof === REACT_ELEMENT_TYPE;\n  }\n  function emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n  }\n  function cloneUnlessOtherwiseSpecified(value2, options2) {\n    return options2.clone !== false && options2.isMergeableObject(value2) ? deepmerge$1(emptyTarget(value2), value2, options2) : value2;\n  }\n  function defaultArrayMerge(target2, source2, options2) {\n    return target2.concat(source2).map(function(element2) {\n      return cloneUnlessOtherwiseSpecified(element2, options2);\n    });\n  }\n  function mergeObject(target2, source2, options2) {\n    var destination = {};\n    if (options2.isMergeableObject(target2)) {\n      Object.keys(target2).forEach(function(key2) {\n        destination[key2] = cloneUnlessOtherwiseSpecified(target2[key2], options2);\n      });\n    }\n    Object.keys(source2).forEach(function(key2) {\n      if (!options2.isMergeableObject(source2[key2]) || !target2[key2]) {\n        destination[key2] = cloneUnlessOtherwiseSpecified(source2[key2], options2);\n      } else {\n        destination[key2] = deepmerge$1(target2[key2], source2[key2], options2);\n      }\n    });\n    return destination;\n  }\n  function deepmerge$1(target2, source2, options2) {\n    options2 = options2 || {};\n    options2.arrayMerge = options2.arrayMerge || defaultArrayMerge;\n    options2.isMergeableObject = options2.isMergeableObject || isMergeableObject;\n    var sourceIsArray = Array.isArray(source2);\n    var targetIsArray = Array.isArray(target2);\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n    if (!sourceAndTargetTypesMatch) {\n      return cloneUnlessOtherwiseSpecified(source2, options2);\n    } else if (sourceIsArray) {\n      return options2.arrayMerge(target2, source2, options2);\n    } else {\n      return mergeObject(target2, source2, options2);\n    }\n  }\n  deepmerge$1.all = function deepmergeAll(array2, options2) {\n    if (!Array.isArray(array2)) {\n      throw new Error(\"first argument should be an array\");\n    }\n    return array2.reduce(function(prev, next) {\n      return deepmerge$1(prev, next, options2);\n    }, {});\n  };\n  var deepmerge_1 = deepmerge$1;\n  const _deepmerge = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    default: deepmerge_1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function isObject$1(o) {\n    return Object.prototype.toString.call(o) === \"[object Object]\";\n  }\n  function isPlainObject(o) {\n    var ctor, prot;\n    if (isObject$1(o) === false) return false;\n    ctor = o.constructor;\n    if (ctor === void 0) return true;\n    prot = ctor.prototype;\n    if (isObject$1(prot) === false) return false;\n    if (prot.hasOwnProperty(\"isPrototypeOf\") === false) {\n      return false;\n    }\n    return true;\n  }\n  const deepmerge = deepmerge_1 || _deepmerge;\n  function clone(objectToClone) {\n    if (!objectToClone)\n      return objectToClone;\n    return deepmerge.all([objectToClone]);\n  }\n  const dontMerge = (destination, source2) => source2;\n  function deepMerge(...objectsToMerge) {\n    const objects = objectsToMerge.filter(Boolean);\n    return deepmerge.all(objects, { arrayMerge: dontMerge, isMergeableObject: isPlainObject });\n  }\n  function rgbToDeckglColor(c2) {\n    return [c2.r, c2.g, c2.b, c2.opacity * 255];\n  }\n  function colorIsEqual(a2, b2) {\n    if (a2.length !== b2.length)\n      return false;\n    for (let i = 0; i < a2.length; i++) {\n      if (a2[i] !== b2[i])\n        return false;\n    }\n    return true;\n  }\n  function colorFromString(cssColorSpecifier) {\n    if (cssColorSpecifier) {\n      const dc = color$2(cssColorSpecifier);\n      if (dc) {\n        const c2 = dc.rgb();\n        return rgbToDeckglColor(c2);\n      }\n    }\n  }\n  function colorToString(color2) {\n    const c2 = [...color2];\n    if (c2.length > 3) {\n      c2[3] /= 255;\n    }\n    return `rgba(${c2.join(\",\")})`;\n  }\n  function desaturate(color2, value2) {\n    const rgb2 = rgb$1(color2[0], color2[1], color2[2], color2[3] / 255);\n    const hslColor = hsl$1(rgb2);\n    hslColor.s = value2;\n    const c2 = hslColor.rgb();\n    return rgbToDeckglColor(c2);\n  }\n  const util$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    addDiv,\n    addEl,\n    allTruthy,\n    clone,\n    colorFromString,\n    colorIsEqual,\n    colorToString,\n    concat,\n    createElement,\n    deepMerge,\n    desaturate,\n    getActiveElementInfo,\n    mount,\n    outerSize: outerSize$1,\n    push: push$1,\n    setActiveElement\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const minHeight = \"100px\";\n  const minWidth = \"100px\";\n  const defaultPresenterStyle$1 = {\n    cssPrefix: \"vega-morphcharts-\",\n    defaultCubeColor: [128, 128, 128, 255],\n    highlightColor: [0, 0, 0, 255]\n  };\n  const defaultPresenterConfig = {\n    onCubeClick: (e, cube) => {\n    },\n    onCubeHover: (e, cube) => {\n    },\n    transitionDurations: {\n      position: 600,\n      stagger: 600,\n      view: 600\n    },\n    renderer: {\n      advanced: false,\n      advancedOptions: {},\n      basicOptions: {\n        antialias: true\n      }\n    }\n  };\n  function createStage(view) {\n    const stage = {\n      view,\n      cubeData: [],\n      pathData: [],\n      axes: {\n        x: [],\n        y: [],\n        z: []\n      },\n      gridLines: [],\n      textData: [],\n      legend: {\n        rows: {}\n      },\n      facets: []\n    };\n    return stage;\n  }\n  const groupStrokeWidth = 1;\n  const lineZ = 0;\n  const defaultView$1 = \"2d\";\n  const minZ = 0.5;\n  const min3dDepth = 0.05;\n  const minPixelSize = 0.5;\n  const zAxisEncodeColor = [7, 7, 7, 255];\n  const zAxisOutColor = [0, 0, 0, 255];\n  function defaultOnAxisItem(vegaItem, stageItem, stage, currAxis) {\n    if (colorIsEqual(stageItem.color, zAxisEncodeColor)) {\n      stageItem.color = zAxisOutColor;\n      if (currAxis.axisRole !== \"z\") {\n        const previousAxisRole = removeCurrentAxes(stage, currAxis);\n        if (previousAxisRole) {\n          currAxis.axisRole = \"z\";\n          stage.axes.z.push(currAxis);\n        }\n      }\n    }\n  }\n  function removeCurrentAxes(stage, currAxis) {\n    for (const axisRole in stage.axes) {\n      const axes = stage.axes[axisRole];\n      for (let i = 0; i < axes.length; i++) {\n        if (axes[i] === currAxis) {\n          axes.splice(i, 1);\n          return axisRole;\n        }\n      }\n    }\n  }\n  const defaults$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    createStage,\n    defaultOnAxisItem,\n    defaultPresenterConfig,\n    defaultPresenterStyle: defaultPresenterStyle$1,\n    defaultView: defaultView$1,\n    groupStrokeWidth,\n    lineZ,\n    min3dDepth,\n    minHeight,\n    minPixelSize,\n    minWidth,\n    minZ\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const vega$1 = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null\n  };\n  const base$3 = {\n    vega: vega$1\n  };\n  function use$5(vega2) {\n    base$3.vega = vega2;\n  }\n  var PresenterElement$1;\n  (function(PresenterElement2) {\n    PresenterElement2[PresenterElement2[\"root\"] = 0] = \"root\";\n    PresenterElement2[PresenterElement2[\"gl\"] = 1] = \"gl\";\n    PresenterElement2[PresenterElement2[\"panel\"] = 2] = \"panel\";\n    PresenterElement2[PresenterElement2[\"legend\"] = 3] = \"legend\";\n    PresenterElement2[PresenterElement2[\"vegaControls\"] = 4] = \"vegaControls\";\n  })(PresenterElement$1 || (PresenterElement$1 = {}));\n  const LegendView = (props) => {\n    const rows = [];\n    const addRow = (row, i) => {\n      const fn2 = symbolMap[row.symbol.shape];\n      let jsx;\n      if (fn2) {\n        jsx = fn2(row.symbol);\n      } else {\n        jsx = createElement(\"span\", null, \"x\");\n      }\n      rows.push({\n        cells: [\n          { className: \"symbol\", content: jsx },\n          { className: \"label\", content: row.label, title: row.label }\n        ]\n      });\n    };\n    const sorted = Object.keys(props.legend.rows).sort((a2, b2) => +a2 - +b2);\n    sorted.forEach((i) => addRow(props.legend.rows[i]));\n    if (sorted.length) {\n      return createElement(Table$1, { rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\n        \"tr\",\n        { onClick: (e) => props.onClick(e, props.legend, null) },\n        createElement(\"th\", { colSpan: 2 }, props.legend.title)\n      ));\n    }\n  };\n  const symbolMap = {\n    square: function(symbol2) {\n      return createElement(\"div\", { style: {\n        height: `${symbol2.bounds.y2 - symbol2.bounds.y1}px`,\n        width: `${symbol2.bounds.x2 - symbol2.bounds.x1}px`,\n        backgroundColor: symbol2.fill,\n        borderColor: symbol2.fill\n      } });\n    }\n  };\n  function initializePanel(presenter) {\n    const rootDiv = createElement(\n      \"div\",\n      { className: className$1(PresenterElement$1.root, presenter) },\n      createElement(\"div\", { className: className$1(PresenterElement$1.gl, presenter), style: { minHeight, minWidth } }),\n      createElement(\n        \"div\",\n        { className: className$1(PresenterElement$1.panel, presenter) },\n        createElement(\"div\", { className: className$1(PresenterElement$1.vegaControls, presenter) }),\n        createElement(\"div\", { className: className$1(PresenterElement$1.legend, presenter) })\n      )\n    );\n    mount(rootDiv, presenter.el);\n  }\n  function className$1(type2, presenter) {\n    return `${presenter.style.cssPrefix}${PresenterElement$1[type2]}`;\n  }\n  function patchCubeArray(allocatedSize, empty, cubes) {\n    const patched = new Array(allocatedSize);\n    patched.fill(empty);\n    cubes.forEach((cube) => patched[cube.ordinal] = cube);\n    return patched;\n  }\n  const legendMap = {\n    \"legend-title\": function(legend2, textItem) {\n      legend2.title = textItem.text;\n    },\n    \"legend-symbol\": function(legend2, symbol2) {\n      const { bounds: bounds2, fill: fill2, shape: shape2 } = symbol2;\n      const legendRowSymbol = { bounds: bounds2, fill: fill2, shape: shape2 };\n      const i = symbol2.datum.index;\n      legend2.rows[i] = legend2.rows[i] || {};\n      legend2.rows[i].symbol = legendRowSymbol;\n    },\n    \"legend-label\": function(legend2, label2) {\n      const i = label2.datum.index;\n      legend2.rows[i] = legend2.rows[i] || {};\n      const row = legend2.rows[i];\n      row.label = label2.text;\n      row.value = label2.datum.value;\n    }\n  };\n  const markStager$5 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(item) {\n      const fn2 = legendMap[item.mark.role];\n      if (fn2) {\n        fn2(stage.legend, item);\n      }\n    });\n  };\n  const markStager$4 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(item) {\n      const { bounds: bounds2, height: height2, url, width: width2 } = item;\n      let { x1: x12, x2: x22, y1: y12, y2: y22 } = bounds2;\n      x12 += x2;\n      x22 += x2;\n      y12 += y2;\n      y22 += y2;\n      if (!stage.backgroundImages) {\n        stage.backgroundImages = [];\n      }\n      stage.backgroundImages.push({ bounds: { x1: x12, x2: x22, y1: y12, y2: y22 }, height: height2, url, width: width2 });\n    });\n  };\n  const markStager$3 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(item) {\n      const noZ = item.z === void 0;\n      const z2 = noZ ? 0 : (item.z || 0) + minZ;\n      const depth = (noZ ? 0 : item.depth || 0) + min3dDepth;\n      const ty2 = -1;\n      const ordinal2 = options2.assignCubeOrdinal(item.datum);\n      if (ordinal2 > options2.maxOrdinal) {\n        options2.maxOrdinal = ordinal2;\n      }\n      if (ordinal2 === void 0) ;\n      else {\n        const cube = {\n          ordinal: ordinal2,\n          size: [item.width, item.height, depth],\n          position: [x2 + (+item.x || 0), ty2 * (y2 + (+item.y || 0)) - +item.height, z2],\n          color: colorFromString(item.fill) || options2.defaultCubeColor || [128, 128, 128, 128]\n        };\n        cube.color[3] = item.opacity === void 0 ? 255 : 255 * item.opacity;\n        stage.cubeData.push(cube);\n      }\n    });\n  };\n  const markStager$2 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(item) {\n      const x12 = item.x || 0;\n      const y12 = item.y || 0;\n      const x22 = item.x2 != null ? item.x2 : x12;\n      const y22 = item.y2 != null ? item.y2 : y12;\n      const lineItem = styledLine(x12 + x2, y12 + y2, x22 + x2, y22 + y2, item.stroke, item.strokeWidth);\n      const { currAxis } = options2;\n      if (options2.modifyAxis) {\n        options2.modifyAxis(item, lineItem, stage, currAxis);\n      }\n      if (item.mark.role === \"axis-tick\") {\n        currAxis.ticks.push(lineItem);\n      } else if (item.mark.role === \"axis-domain\") {\n        currAxis.domain = lineItem;\n      } else {\n        stage.gridLines.push(lineItem);\n      }\n    });\n  };\n  function styledLine(x12, y12, x2, y2, stroke2, strokeWidth) {\n    const line2 = {\n      sourcePosition: [x12, -y12, lineZ],\n      //-1 = change direction of y from SVG to GL\n      targetPosition: [x2, -y2, lineZ],\n      color: colorFromString(stroke2),\n      strokeWidth\n    };\n    return line2;\n  }\n  function box(gx, gy, height2, width2, stroke2, strokeWidth, diagonals = false) {\n    const lines = [\n      styledLine(gx, gy, gx + width2, gy, stroke2, strokeWidth),\n      styledLine(gx + width2, gy, gx + width2, gy + height2, stroke2, strokeWidth),\n      styledLine(gx + width2, gy + height2, gx, gy + height2, stroke2, strokeWidth),\n      styledLine(gx, gy + height2, gx, gy, stroke2, strokeWidth)\n    ];\n    if (diagonals) {\n      lines.push(styledLine(gx, gy, gx + width2, gy + height2, stroke2, strokeWidth));\n      lines.push(styledLine(gx, gy + height2, gx + width2, gy, stroke2, strokeWidth));\n    }\n    return lines;\n  }\n  const ty = -1;\n  const markStager$1 = (options2, stage, scene, x2, y2, groupType) => {\n    const g = Object.assign({ opacity: 1, strokeOpacity: 1, strokeWidth: 1 }, scene.items[0]);\n    const path2 = {\n      strokeWidth: g.strokeWidth,\n      strokeColor: colorFromString(g.stroke),\n      positions: scene.items.map((it) => [\n        it.x,\n        ty * it.y,\n        it.z || 0\n      ])\n    };\n    path2.strokeColor[3] *= g.strokeOpacity;\n    path2.strokeColor[3] *= g.opacity;\n    stage.pathData.push(path2);\n  };\n  const markStager = (options2, stage, scene, x2, y2, groupType) => {\n    const ty2 = -1;\n    base$3.vega.sceneVisit(scene, function(item) {\n      if (!item.text)\n        return;\n      const size = item.fontSize;\n      const yOffset = 0;\n      const textItem = {\n        color: colorFromString(item.fill),\n        text: item.limit === void 0 ? item.text : base$3.vega.truncate(item.text, item.limit, \"right\", item.ellipsis || \"...\"),\n        //use dots instead of unicode ellipsis for\n        position: [x2 + (item.x || 0), ty2 * (y2 + (item.y || 0) + yOffset), 0],\n        size,\n        angle: convertAngle(item.angle),\n        //textAnchor: convertAlignment(item.align),\n        //alignmentBaseline,\n        metaData: item.metaData\n      };\n      const { currAxis } = options2;\n      if (options2.modifyAxis) {\n        options2.modifyAxis(item, textItem, stage, currAxis);\n      }\n      if (item.mark.role === \"axis-label\") {\n        const tickText = textItem;\n        tickText.value = item.datum.value;\n        currAxis.tickText.push(tickText);\n      } else if (item.mark.role === \"axis-title\") {\n        currAxis.title = textItem;\n      } else {\n        stage.textData.push(textItem);\n      }\n    });\n  };\n  function convertAngle(vegaTextAngle) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n      return 360 - vegaTextAngle;\n    }\n    return 0;\n  }\n  var GroupType;\n  (function(GroupType2) {\n    GroupType2[GroupType2[\"none\"] = 0] = \"none\";\n    GroupType2[GroupType2[\"legend\"] = 1] = \"legend\";\n    GroupType2[GroupType2[\"xAxis\"] = 2] = \"xAxis\";\n    GroupType2[GroupType2[\"yAxis\"] = 3] = \"yAxis\";\n    GroupType2[GroupType2[\"zAxis\"] = 4] = \"zAxis\";\n  })(GroupType || (GroupType = {}));\n  function getAxisGroupType(item, options2) {\n    const axisItem = item;\n    const axisMark = axisItem === null || axisItem === void 0 ? void 0 : axisItem.mark;\n    if ((axisMark === null || axisMark === void 0 ? void 0 : axisMark.zindex) === options2.zAxisZindex && options2.zAxisZindex !== void 0) {\n      return GroupType.zAxis;\n    }\n    switch (axisItem.orient) {\n      case \"bottom\":\n      case \"top\":\n        return GroupType.xAxis;\n      case \"left\":\n      case \"right\":\n        return GroupType.yAxis;\n    }\n  }\n  function convertGroupRole(item, options2) {\n    if (item.mark.role === \"legend\")\n      return GroupType.legend;\n    if (item.mark.role === \"axis\") {\n      const groupType = getAxisGroupType(item, options2);\n      if (groupType !== void 0) {\n        return groupType;\n      }\n    }\n  }\n  const group$1 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(g) {\n      const gx = g.x || 0, gy = g.y || 0;\n      if (g.context && g.context.background && !stage.backgroundColor) {\n        stage.backgroundColor = colorFromString(g.context.background);\n      }\n      if (g.stroke) {\n        const facetRect = {\n          datum: g.datum,\n          lines: box(gx + x2, gy + y2, g.height, g.width, g.stroke, groupStrokeWidth)\n        };\n        stage.facets.push(facetRect);\n      }\n      groupType = convertGroupRole(g, options2) || groupType;\n      setCurrentAxis(options2, stage, groupType);\n      base$3.vega.sceneVisit(g, function(item) {\n        mainStager(options2, stage, item, gx + x2, gy + y2, groupType);\n      });\n    });\n  };\n  function setCurrentAxis(options2, stage, groupType) {\n    let axisRole;\n    switch (groupType) {\n      case GroupType.xAxis:\n        axisRole = \"x\";\n        break;\n      case GroupType.yAxis:\n        axisRole = \"y\";\n        break;\n      case GroupType.zAxis:\n        axisRole = \"z\";\n        break;\n      default:\n        return;\n    }\n    options2.currAxis = {\n      axisRole,\n      domain: null,\n      tickText: [],\n      ticks: []\n    };\n    stage.axes[axisRole].push(options2.currAxis);\n  }\n  const markStagers = {\n    group: group$1,\n    legend: markStager$5,\n    image: markStager$4,\n    rect: markStager$3,\n    rule: markStager$2,\n    line: markStager$1,\n    text: markStager\n  };\n  const mainStager = (options2, stage, scene, x2, y2, groupType) => {\n    if (scene.marktype !== \"group\" && groupType === GroupType.legend) {\n      markStager$5(options2, stage, scene);\n    } else {\n      const markStager2 = markStagers[scene.marktype];\n      if (markStager2) {\n        markStager2(options2, stage, scene, x2, y2, groupType);\n      }\n    }\n  };\n  function sceneToStage(options2, stage, scene) {\n    mainStager(options2, stage, scene, 0, 0, null);\n    sortAxis(stage.axes.x, 0);\n    sortAxis(stage.axes.y, 1);\n    sortAxis(stage.axes.z, 1);\n  }\n  function sortAxis(axes, dim) {\n    axes.forEach((axis) => {\n      if (axis.domain)\n        orderDomain(axis.domain, dim);\n      axis.ticks.sort((a2, b2) => a2.sourcePosition[dim] - b2.sourcePosition[dim]);\n      axis.tickText.sort((a2, b2) => a2.position[dim] - b2.position[dim]);\n    });\n  }\n  function orderDomain(domain2, dim) {\n    if (domain2.sourcePosition[dim] > domain2.targetPosition[dim]) {\n      const temp2 = domain2.targetPosition;\n      domain2.targetPosition = domain2.sourcePosition;\n      domain2.sourcePosition = temp2;\n    }\n  }\n  function outerBounds(b1, b2) {\n    if (!b1 && !b2)\n      return;\n    if (!b1)\n      return b2;\n    if (!b2)\n      return b1;\n    const minProps = [\n      \"minBoundsX\",\n      \"minBoundsY\",\n      \"minBoundsZ\"\n    ];\n    const maxProps = [\n      \"maxBoundsX\",\n      \"maxBoundsY\",\n      \"maxBoundsZ\"\n    ];\n    const result = {};\n    minProps.forEach((p) => result[p] = notNull(Math.min, b1[p], b2[p]));\n    maxProps.forEach((p) => result[p] = notNull(Math.max, b1[p], b2[p]));\n    return result;\n  }\n  function notNull(fn2, v1, v2) {\n    if (v1 == null && v2 == null)\n      return null;\n    if (v1 == null)\n      return v2;\n    if (v2 == null)\n      return v1;\n    return fn2(v1, v2);\n  }\n  function increment$1(b2, minBoundsX, minBoundsY, minBoundsZ, maxBoundsX, maxBoundsY, maxBoundsZ) {\n    return outerBounds(b2, {\n      minBoundsX,\n      minBoundsY,\n      minBoundsZ,\n      maxBoundsX,\n      maxBoundsY,\n      maxBoundsZ\n    });\n  }\n  const createAxesLayer = (props) => {\n    const { config, height: height2, ref: ref2, stage } = props;\n    const { core } = ref2;\n    const { renderer } = core;\n    const { x: x2, y: y2, z: z2 } = stage.axes;\n    const xyz = [...x2, ...y2, ...z2];\n    renderer.currentAxes = [];\n    if (!xyz.length) {\n      renderer.axesVisibility = AxesVisibility.none;\n      return;\n    }\n    renderer.axesVisibility = AxesVisibility.current;\n    const correlation = new AxesCorrelation(stage, 3);\n    const { axesSets, labels } = correlation;\n    const grid2 = correlation.getGrid();\n    if (grid2.byColumn[0]) {\n      grid2.byColumn[0].forEach((row) => {\n        row.axesSet.showFacetTitleY = true;\n      });\n      grid2.byRow[0].forEach((col) => {\n        col.axesSet.showFacetTitleX = true;\n      });\n    }\n    if (grid2.rows > 1) {\n      const { byRow } = grid2;\n      byRow[0].forEach(({ axesSet }, col) => {\n        if (!axesSet.y) {\n          if (byRow[1][col].axesSet) {\n            byRow[1][col].axesSet.x.tickText = axesSet.x.tickText;\n            byRow[1][col].axesSet.showFacetTitleX = axesSet.showFacetTitleX;\n            delete axesSet.x;\n          }\n        }\n      });\n    }\n    let bounds2;\n    const allAxesSetBounds = [];\n    let anyZ = false;\n    for (let i = 0; i < axesSets.length; i++) {\n      if (axesSets[i].z) {\n        anyZ = true;\n        break;\n      }\n    }\n    const is3d = stage.view === \"3d\" && anyZ;\n    axesSets.forEach((axesSet) => {\n      if (!axesSet.x && !axesSet.y)\n        return;\n      const axesSetBounds = {\n        axesSet,\n        maxBoundsX: null,\n        maxBoundsY: null,\n        maxBoundsZ: null,\n        minBoundsX: null,\n        minBoundsY: null,\n        minBoundsZ: null\n      };\n      if (is3d) {\n        const zBounds = getDomainBounds(1, axesSet.z);\n        axesSetBounds.minBoundsZ = -zBounds.maxBounds;\n        axesSetBounds.maxBoundsZ = -zBounds.minBounds;\n      }\n      const yBounds = getDomainBounds(1, axesSet.y);\n      axesSetBounds.minBoundsY = yBounds.minBounds;\n      axesSetBounds.maxBoundsY = yBounds.maxBounds;\n      axesSetBounds.y = yBounds.minBounds;\n      axesSetBounds.h = yBounds.maxBounds - yBounds.minBounds;\n      const xBounds = getDomainBounds(0, axesSet.x);\n      axesSetBounds.minBoundsX = xBounds.minBounds;\n      axesSetBounds.maxBoundsX = xBounds.maxBounds;\n      axesSetBounds.x = xBounds.minBounds;\n      axesSetBounds.w = xBounds.maxBounds - xBounds.minBounds;\n      allAxesSetBounds.push(axesSetBounds);\n      bounds2 = outerBounds(bounds2, axesSetBounds);\n    });\n    const facetLabelX = labels.filter((label2) => label2.axisRole === \"x\")[0];\n    const facetLabelY = labels.filter((label2) => label2.axisRole === \"y\")[0];\n    core.inputManager.pickAxesTitleCallback = ({ axis, axes, manipulator }) => {\n      const axesSet = axesSets[axes];\n      let a2;\n      let f;\n      switch (axis) {\n        case 0: {\n          a2 = axesSet.x;\n          f = facetLabelX;\n          break;\n        }\n        case 1: {\n          a2 = axesSet.y;\n          f = facetLabelY;\n          break;\n        }\n        case 2: {\n          a2 = axesSet.z;\n          break;\n        }\n      }\n      if (a2) {\n        config.onTextClick(manipulator.event, a2.title || f.title);\n      }\n    };\n    allAxesSetBounds.forEach((axesSetBounds) => {\n      const { axesSet } = axesSetBounds;\n      if (!axesSet.x && !axesSet.y)\n        return;\n      const cartesian2 = new (is3d ? Cartesian3dAxes : Cartesian2dAxes)(core);\n      cartesian2.isDivisionPickingEnabled = [false, false, false];\n      cartesian2.arePickDivisionsVisible = [false, false, false];\n      cartesian2.isLabelPickingEnabled = [false, false, false];\n      cartesian2.isTitlePickingEnabled = [false, false, false];\n      cartesian2.isGridPickingEnabled = false;\n      cartesian2.isHeadingPickingEnabled = [false, false, false];\n      createAxes(cartesian2, 0, 0, axesSet.x, AxesTextOrientation.perpendicular, height2, props, axesSet.showFacetTitleX && facetLabelX);\n      createAxes(cartesian2, 1, 1, axesSet.y, AxesTextOrientation.perpendicular, height2, props, axesSet.showFacetTitleY && facetLabelY);\n      if (is3d) {\n        createAxes(cartesian2, 1, 2, axesSet.z, AxesTextOrientation.perpendicular, height2, props);\n      }\n      configCartesianAxes(is3d, bounds2, cartesian2);\n      const { maxBoundsX, maxBoundsY, minBoundsX, minBoundsY } = bounds2;\n      const w2 = maxBoundsX - minBoundsX;\n      const h2 = maxBoundsY - minBoundsY;\n      cartesian2.scalingX = axesSetBounds.w / w2;\n      cartesian2.scalingY = axesSetBounds.h / h2;\n      cartesian2.offsetX = (axesSetBounds.x - minBoundsX + axesSetBounds.w / 2) / w2 - 0.5;\n      cartesian2.offsetY = (axesSetBounds.y - minBoundsY + axesSetBounds.h / 2) / h2 - 0.5;\n      const aspect = h2 / w2;\n      if (aspect > 1) {\n        cartesian2.offsetX /= aspect;\n      } else {\n        cartesian2.offsetY *= aspect;\n      }\n      const axes = is3d ? renderer.createCartesian3dAxesVisual(cartesian2) : renderer.createCartesian2dAxesVisual(cartesian2);\n      renderer.currentAxes.push(axes);\n      props.config.onAxesComplete && props.config.onAxesComplete(cartesian2);\n    });\n    return { bounds: bounds2 };\n  };\n  const nullDomain = {\n    sourcePosition: [0, 0, 0],\n    targetPosition: [0, 0, 0]\n  };\n  class AxesCorrelation {\n    constructor(stage, dimensions) {\n      this.dimensions = dimensions;\n      const { x: x2, y: y2, z: z2 } = stage.axes;\n      this.axesSets = [];\n      this.labels = [];\n      [x2, y2, z2].forEach((axes) => {\n        axes.forEach((axis) => {\n          if (this.axesSets.length === 0) {\n            this.initialize(axis);\n          } else {\n            this.correlate(axis);\n          }\n        });\n      });\n    }\n    getGrid() {\n      const mapCols = {};\n      const mapRows = {};\n      this.axesSets.forEach((axesSet) => {\n        var _a2;\n        const domain2 = (_a2 = axesSet === null || axesSet === void 0 ? void 0 : axesSet.x) === null || _a2 === void 0 ? void 0 : _a2.domain;\n        if (!domain2)\n          return;\n        const col = domain2.sourcePosition[0].toString();\n        const row = domain2.sourcePosition[1].toString();\n        if (!mapCols[col]) {\n          mapCols[col] = {};\n        }\n        mapCols[col][row] = axesSet;\n        mapRows[row] = null;\n      });\n      const colKeys = Object.keys(mapCols).sort((a2, b2) => +a2 - +b2);\n      const rowKeys = Object.keys(mapRows).sort((a2, b2) => +a2 - +b2);\n      return {\n        cols: colKeys.length,\n        rows: rowKeys.length,\n        byColumn: colKeys.map((colKey) => rowKeys.map((rowKey) => {\n          return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] };\n        })),\n        byRow: rowKeys.map((rowKey) => colKeys.map((colKey) => {\n          return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] };\n        }))\n      };\n    }\n    initialize(axis) {\n      if (!axis.domain) {\n        this.labels.push(axis);\n        return;\n      }\n      const axesSet = {};\n      axesSet[axis.axisRole] = axis;\n      this.axesSets.push(axesSet);\n    }\n    correlate(axis) {\n      if (!axis.domain) {\n        this.labels.push(axis);\n        return;\n      }\n      for (let i = 0; i < this.axesSets.length; i++) {\n        const axesSet = this.axesSets[i];\n        for (const axisRole in axesSet) {\n          const test2 = axesSet[axisRole];\n          if (this.matchDomains(axis.domain, test2.domain)) {\n            if (!axesSet[axis.axisRole] || !axesSet[axis.axisRole].tickText.length && axis.tickText.length) {\n              axesSet[axis.axisRole] = axis;\n            }\n            return;\n          }\n        }\n      }\n      this.initialize(axis);\n    }\n    matchDomains(a2, b2) {\n      if (this.matchPoint(a2.sourcePosition, b2.sourcePosition))\n        return true;\n      if (this.matchPoint(a2.sourcePosition, b2.targetPosition))\n        return true;\n      if (this.matchPoint(a2.targetPosition, b2.targetPosition))\n        return true;\n      if (this.matchPoint(a2.targetPosition, b2.sourcePosition))\n        return true;\n      return false;\n    }\n    matchPoint(a2, b2) {\n      for (let i = 0; i < this.dimensions; i++) {\n        if (a2[i] !== b2[i])\n          return false;\n      }\n      return true;\n    }\n  }\n  function createAxes(cartesian2, dim2d, dim3d, axis, orientation, height2, props, facetLabel) {\n    const domain2 = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n    const { tickPositions, tickText, textPos, textSize } = convertAxis(axis, domain2, dim2d, height2);\n    if (axis.axisRole === \"z\") {\n      tickPositions.forEach((t, i) => tickPositions[i] = 1 - t);\n      textPos.forEach((t, i) => textPos[i] = 1 - t);\n      tickText.reverse();\n      tickPositions.reverse();\n      textPos.reverse();\n    }\n    cartesian2.setTickPositions(dim3d, tickPositions);\n    cartesian2.zero[dim3d] = 0;\n    cartesian2.setLabelPositions(dim3d, textPos);\n    cartesian2.setLabels(dim3d, tickText);\n    cartesian2.setLabelSizes(dim3d, textSize);\n    const title = (axis === null || axis === void 0 ? void 0 : axis.title) || (facetLabel === null || facetLabel === void 0 ? void 0 : facetLabel.title);\n    if (title === null || title === void 0 ? void 0 : title.text) {\n      cartesian2.setTitle(dim3d, title.text);\n      cartesian2.setTitleSize(dim3d, title.size / height2);\n    }\n    cartesian2.setLabelOrientation(dim3d, orientation);\n    props.config.onAxisConfig && props.config.onAxisConfig(cartesian2, dim3d, axis);\n    return {\n      tickText\n    };\n  }\n  function configCartesianAxes(is3d, bounds2, cartesian2) {\n    if (is3d) {\n      cartesian2.isEdgeVisible[Edge3D.topBack] = false;\n    }\n    cartesian2.isEdgeVisible[Edge3D.backRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.bottomRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.frontRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.topFront] = false;\n    cartesian2.isEdgeVisible[Edge3D.topRight] = false;\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds2;\n    cartesian2.minBoundsX = minBoundsX;\n    cartesian2.maxBoundsX = maxBoundsX;\n    cartesian2.minBoundsY = minBoundsY;\n    cartesian2.maxBoundsY = maxBoundsY;\n    if (is3d) {\n      cartesian2.minBoundsZ = minBoundsZ;\n      cartesian2.maxBoundsZ = maxBoundsZ;\n    }\n  }\n  function getDomainBounds(dim2d, axis) {\n    const domain2 = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n    const minBounds = domain2.sourcePosition[dim2d];\n    const maxBounds = domain2.targetPosition[dim2d];\n    return {\n      maxBounds,\n      minBounds\n    };\n  }\n  function convertAxis(axis, domain2, dim, height2) {\n    const start = domain2.sourcePosition[dim];\n    const span2 = domain2.targetPosition[dim] - start;\n    const tickPositions = axis ? axis.ticks.map((t) => (t.sourcePosition[dim] - start) / span2) : [];\n    const tickText = axis ? axis.tickText.map((t) => t.text) : [];\n    const textPos = axis ? axis.tickText.map((t) => (t.position[dim] - start) / span2) : [];\n    const textSize = axis ? axis.tickText.map((t) => t.size / height2) : [];\n    if (tickPositions.length) {\n      if (tickPositions[0] !== 0) {\n        tickPositions[0] = 0;\n      }\n      if (tickPositions[tickPositions.length - 1] !== 1) {\n        tickPositions[tickPositions.length - 1] = 1;\n      }\n    }\n    return {\n      tickPositions,\n      tickText,\n      textPos,\n      textSize\n    };\n  }\n  let ColorMap$1 = class ColorMap {\n    constructor(quant = 5) {\n      this.quant = quant;\n      this.colorMap = {};\n      this.colorArray = [];\n    }\n    getColorKey(rgbaColor) {\n      const color2 = rgbaColor.slice(0, 3).map((e) => Math.floor(e / this.quant) * this.quant);\n      color2[3] = rgbaColor[3];\n      return JSON.stringify(color2);\n    }\n    registerColor(rgbaColor) {\n      const colorKey = this.getColorKey(rgbaColor);\n      if (!this.colorMap[colorKey]) {\n        this.colorMap[colorKey] = {\n          index: this.colorArray.length,\n          rgbaColor\n        };\n        this.colorArray.push(rgbaColor);\n      }\n      return this.colorMap[colorKey].index;\n    }\n    getPalette() {\n      return {\n        palette: new Uint8Array(this.colorArray.flat()),\n        maxColor: this.colorArray.length - 1\n      };\n    }\n  };\n  function convert$3(newColor) {\n    const c2 = colorFromString(newColor).slice(0, 3);\n    return c2.map((v) => v / 255);\n  }\n  function colorConfig(ref2, colors2) {\n    if (!colors2)\n      return;\n    const { config } = ref2.core;\n    config.activeColor = convert$3(colors2.activeItemColor);\n    config.backgroundColor = new Float32Array(convert$3(colors2.backgroundColor));\n    config.textColor = convert$3(colors2.textColor);\n    config.textBorderColor = convert$3(colors2.textBorderColor);\n    config.axesTextColor = convert$3(colors2.axesTextLabelColor);\n    config.axesGridBackgroundColor = convert$3(colors2.axesGridBackgroundColor);\n    config.axesGridHighlightColor = convert$3(colors2.axesGridHighlightColor);\n    config.axesGridMinorColor = convert$3(colors2.axesGridMinorColor);\n    config.axesGridMajorColor = convert$3(colors2.axesGridMajorColor);\n    config.axesGridZeroColor = convert$3(colors2.axesGridZeroColor);\n    ref2.core.renderer[\"_theme\"] = null;\n  }\n  const key$2 = \"cube\";\n  const createCubeLayer = (props) => {\n    const { ref: ref2, stage } = props;\n    const { core } = ref2;\n    const scatter = new Scatter(core);\n    const { ids, colors: colors2, positionsX, positionsY, positionsZ, sizesX, sizesY, sizesZ, bounds: bounds2, maxColor, palette } = convert$2(stage);\n    if (!ids.length)\n      return;\n    const { renderer } = core;\n    let cubeTransitionBuffer = renderer.transitionBuffers.find((t) => t.key === key$2);\n    if (!cubeTransitionBuffer) {\n      cubeTransitionBuffer = renderer.createTransitionBuffer(ids);\n      cubeTransitionBuffer.key = key$2;\n      renderer.transitionBuffers.push(cubeTransitionBuffer);\n    } else {\n      cubeTransitionBuffer.swap();\n    }\n    scatter.layout(cubeTransitionBuffer.currentBuffer, ids, {\n      positionsX,\n      positionsY,\n      positionsZ\n    });\n    const layer = {\n      positionsX,\n      positionsY,\n      positionsZ,\n      update: (newBounds, selected, stagger) => {\n        const { colors: colors3, maxColor: maxColor2, minColor, palette: palette2 } = layer.unitColorMap;\n        const currCubeTransitionBuffer = core.renderer.transitionBuffers.find((t) => t.key === key$2);\n        currCubeTransitionBuffer.currentBuffer.unitType = UnitType.block;\n        currCubeTransitionBuffer.currentPalette.colors = palette2;\n        let options2 = Object.assign({\n          selected,\n          colors: colors3,\n          minColor,\n          maxColor: maxColor2,\n          sizesX,\n          sizesY,\n          sizesZ\n        }, newBounds);\n        if (stagger === null || stagger === void 0 ? void 0 : stagger.staggerOrders) {\n          const { maxStaggerOrder, minStaggerOrder, staggerOrders } = stagger;\n          options2 = Object.assign(Object.assign({}, options2), {\n            maxStaggerOrder,\n            minStaggerOrder,\n            staggerOrders\n          });\n        }\n        scatter.update(currCubeTransitionBuffer.currentBuffer, ids, options2);\n      },\n      bounds: bounds2,\n      unitColorMap: {\n        colors: colors2,\n        ids,\n        minColor: 0,\n        maxColor,\n        palette\n      }\n    };\n    return layer;\n  };\n  function convert$2(stage) {\n    const { cubeData } = stage;\n    const { length: length2 } = cubeData;\n    const ids = [];\n    const colors2 = new Float64Array(length2);\n    const positionsX = new Float64Array(length2);\n    const positionsY = new Float64Array(length2);\n    const positionsZ = new Float64Array(length2);\n    const sizesX = new Float64Array(length2);\n    const sizesY = new Float64Array(length2);\n    const sizesZ = new Float64Array(length2);\n    let bounds2;\n    const colorMap = new ColorMap$1();\n    cubeData.forEach((cube, i) => {\n      ids.push(i);\n      if (cube.isEmpty) {\n        positionsX[i] = 0;\n        positionsY[i] = 0;\n        positionsZ[i] = 0;\n        sizesX[i] = 0;\n        sizesY[i] = 0;\n        sizesZ[i] = 0;\n        colors2[i] = 0;\n      } else {\n        positionsX[i] = cube.position[0] + cube.size[0] * 0.5;\n        positionsY[i] = cube.position[1] + cube.size[1] * 0.5;\n        positionsZ[i] = cube.position[2] + cube.size[2] * 0.5;\n        sizesX[i] = cube.size[0];\n        sizesY[i] = cube.size[1];\n        sizesZ[i] = cube.size[2];\n        bounds2 = increment$1(bounds2, cube.position[0], cube.position[1], cube.position[2], cube.position[0] + cube.size[0], cube.position[1] + cube.size[1], cube.position[2] + cube.size[2]);\n        colors2[i] = colorMap.registerColor(cube.color);\n      }\n    });\n    const { palette, maxColor } = colorMap.getPalette();\n    return {\n      ids: new Uint32Array(ids),\n      colors: colors2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      sizesX,\n      sizesY,\n      sizesZ,\n      bounds: bounds2,\n      maxColor,\n      palette\n    };\n  }\n  const key$1 = \"line\";\n  const createLineLayer = (props) => {\n    const { height: height2, ref: ref2, stage } = props;\n    const { core } = ref2;\n    const lines = new Line(core);\n    const { ids, fromIds, toIds, lineColors, lineSizes, bounds: bounds2, positionsX, positionsY, positionsZ, lineMaxColor, palette } = convert$1(stage, height2);\n    if (!ids.length)\n      return;\n    const { renderer } = core;\n    let lineTransitionBuffer = renderer.transitionBuffers.find((t) => t.key === key$1);\n    if (!lineTransitionBuffer) {\n      lineTransitionBuffer = renderer.createTransitionBuffer(ids);\n      lineTransitionBuffer.key = key$1;\n      renderer.transitionBuffers.push(lineTransitionBuffer);\n    } else {\n      lineTransitionBuffer.swap();\n    }\n    lines.layout(lineTransitionBuffer.currentBuffer, ids, fromIds, toIds, {\n      positionsX,\n      positionsY,\n      positionsZ,\n      lineSizes,\n      sizeScaling: 1\n    });\n    let options2 = {\n      lineColors,\n      lineMinColor: 0,\n      lineMaxColor\n    };\n    lineTransitionBuffer.currentBuffer.unitType = UnitType.cylinder;\n    lineTransitionBuffer.currentPalette.colors = palette;\n    return {\n      update: (newBounds) => {\n        options2 = Object.assign(Object.assign({}, options2), newBounds);\n        const currLineTransitionBuffer = core.renderer.transitionBuffers.find((t) => t.key === key$1);\n        lines.update(currLineTransitionBuffer.currentBuffer, ids, fromIds, toIds, options2);\n      },\n      bounds: bounds2,\n      unitColorMap: {\n        ids,\n        colors: lineColors,\n        minColor: 0,\n        maxColor: lineMaxColor,\n        palette\n      }\n    };\n  };\n  function convert$1(stage, height2, width2) {\n    const { pathData } = stage;\n    const positions2 = [];\n    const lines = [];\n    const colorMap = new ColorMap$1();\n    pathData.forEach((path2) => {\n      const color2 = colorMap.registerColor(path2.strokeColor);\n      let from = positions2.length;\n      positions2.push(path2.positions[0]);\n      for (let i = 1; i < path2.positions.length; i++) {\n        const to = positions2.length;\n        positions2.push(path2.positions[i]);\n        lines.push({\n          id: lines.length,\n          from,\n          to,\n          color: color2,\n          size: path2.strokeWidth\n        });\n        from = to;\n      }\n    });\n    const ids = new Uint32Array(lines.length);\n    const fromIds = new Uint32Array(lines.length);\n    const toIds = new Uint32Array(lines.length);\n    const lineColors = new Float64Array(lines.length);\n    const lineSizes = new Float64Array(lines.length);\n    lines.forEach((line2, i) => {\n      ids[i] = i;\n      fromIds[i] = line2.from;\n      toIds[i] = line2.to;\n      lineColors[i] = line2.color;\n      lineSizes[i] = line2.size;\n    });\n    const positionsX = new Float64Array(positions2.length);\n    const positionsY = new Float64Array(positions2.length);\n    const positionsZ = new Float64Array(positions2.length);\n    let bounds2;\n    positions2.forEach((p, i) => {\n      positionsX[i] = p[0];\n      positionsY[i] = p[1] + height2;\n      positionsZ[i] = p[2];\n      bounds2 = increment$1(bounds2, positionsX[i], positionsY[i], positionsZ[i], positionsX[i], positionsY[i], positionsZ[i]);\n    });\n    const { palette, maxColor: lineMaxColor } = colorMap.getPalette();\n    return {\n      ids,\n      fromIds,\n      toIds,\n      lineColors,\n      lineSizes,\n      bounds: bounds2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      lineMaxColor,\n      palette\n    };\n  }\n  const createTextLayer = (props) => {\n    const { ref: ref2, stage } = props;\n    const { core } = ref2;\n    const { positionsX, positionsY, positionsZ, sizes, bounds: bounds2, maxGlyphs, text: text2 } = convert(stage);\n    if (text2.length === 0) {\n      core.renderer.labelSets = [];\n      return;\n    }\n    const options2 = {\n      text: text2,\n      maxGlyphs,\n      scales: sizes\n    };\n    const labelSet = new LabelSet(core, options2);\n    labelSet.positionsX = positionsX;\n    labelSet.positionsY = positionsY;\n    labelSet.positionsZ = positionsZ;\n    labelSet.horizontalAlignment = HorizontalAlignment.center;\n    labelSet.verticalAlignment = VerticalAlignment.center;\n    const layer = {\n      update: (bounds3) => {\n        const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds3;\n        labelSet.minBoundsX = minBoundsX;\n        labelSet.minBoundsY = minBoundsY;\n        labelSet.minBoundsZ = minBoundsZ;\n        labelSet.maxBoundsX = maxBoundsX;\n        labelSet.maxBoundsY = maxBoundsY;\n        labelSet.maxBoundsZ = maxBoundsZ;\n      },\n      bounds: bounds2\n    };\n    const labelSetVisual = core.renderer.createLabelSetVisual(labelSet);\n    core.renderer.labelSets = [labelSetVisual];\n    return layer;\n  };\n  function convert(stage) {\n    const { textData } = stage;\n    const { length: length2 } = textData;\n    const ids = [];\n    const text2 = [];\n    const colors2 = new Float64Array(length2);\n    const positionsX = new Float64Array(length2);\n    const positionsY = new Float64Array(length2);\n    const positionsZ = new Float64Array(length2);\n    const sizes = new Float64Array(length2);\n    let bounds2;\n    let maxGlyphs = 0;\n    const colorMap = new ColorMap$1();\n    textData.forEach((t, i) => {\n      ids.push(i);\n      text2.push(t.text);\n      maxGlyphs += t.text.length;\n      positionsX[i] = t.position[0];\n      positionsY[i] = t.position[1];\n      positionsZ[i] = t.position[2];\n      sizes[i] = 1.5 * t.size;\n      bounds2 = increment$1(bounds2, t.position[0], t.position[1], t.position[2], t.position[0], t.position[1], t.position[2]);\n      colors2[i] = colorMap.registerColor(t.color);\n    });\n    const { palette, maxColor } = colorMap.getPalette();\n    return {\n      ids: new Uint32Array(ids),\n      colors: colors2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      sizes,\n      bounds: bounds2,\n      maxColor,\n      maxGlyphs,\n      palette,\n      text: text2\n    };\n  }\n  function getImageData(url) {\n    return new Promise((resolve2, reject) => {\n      const imageElement = document.createElement(\"img\");\n      imageElement.onload = () => {\n        const canvas = document.createElement(\"canvas\");\n        const ctx = canvas.getContext(\"2d\");\n        const { height: height2, width: width2 } = imageElement;\n        canvas.width = width2;\n        canvas.height = height2;\n        ctx.drawImage(imageElement, 0, 0);\n        resolve2(ctx.getImageData(0, 0, width2, height2));\n      };\n      imageElement.src = url;\n    });\n  }\n  function createImageQuad(core, imageData, bounds2, position2, width2, height2) {\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds2;\n    const imageOptions = {\n      imageData,\n      position: position2,\n      height: height2,\n      width: width2,\n      minBoundsX,\n      maxBoundsX,\n      minBoundsZ,\n      maxBoundsZ,\n      minBoundsY,\n      maxBoundsY\n    };\n    return new ImageQuad(core, imageOptions);\n  }\n  function createCameraDefaults() {\n    const qModelRotation2d2 = create$4();\n    const qModelRotation3d2 = Constants$1.QUAT_ROTATEX_MINUS_90;\n    const qCameraRotation2d2 = create$4();\n    const qCameraRotation3d2 = create$4();\n    const qAngle = create$4();\n    const vCameraPosition2 = create$6();\n    setAxisAngle(qCameraRotation3d2, Constants$1.VECTOR3_UNITX, AngleHelper.degreesToRadians(30));\n    setAxisAngle(qAngle, Constants$1.VECTOR3_UNITY, AngleHelper.degreesToRadians(-25));\n    multiply(qCameraRotation3d2, qCameraRotation3d2, qAngle);\n    return {\n      qModelRotation2d: qModelRotation2d2,\n      qModelRotation3d: qModelRotation3d2,\n      qCameraRotation2d: qCameraRotation2d2,\n      qCameraRotation3d: qCameraRotation3d2,\n      vCameraPosition: vCameraPosition2\n    };\n  }\n  const cameraDefaults = createCameraDefaults();\n  const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n  function applyCameraCallbacks(ref2, lastPresenterConfig, lastView, transistion2dOnly) {\n    const { cameraTransitioner, core, modelTransitioner, positionTransitioner } = ref2;\n    ref2.reset = () => {\n      core.reset(true);\n      if (lastView === \"3d\") {\n        modelTransitioner.qRotation.to = qModelRotation3d;\n        cameraTransitioner.qRotation.to = qCameraRotation3d;\n        cameraTransitioner.vPosition.to = vCameraPosition;\n      } else {\n        modelTransitioner.qRotation.to = qModelRotation2d;\n        cameraTransitioner.qRotation.to = qCameraRotation2d;\n        cameraTransitioner.vPosition.to = vCameraPosition;\n      }\n      slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.to, modelTransitioner.qRotation.to, 0);\n      core.setModelRotation(modelTransitioner.qRotation.current, true);\n      core.camera.setOrbit(cameraTransitioner.qRotation.to, true);\n      core.camera.setPosition(cameraTransitioner.vPosition.to, true);\n    };\n    const cam = (t) => {\n      slerp(cameraTransitioner.qRotation.current, cameraTransitioner.qRotation.from, cameraTransitioner.qRotation.to, t);\n      lerp$1(cameraTransitioner.vPosition.current, cameraTransitioner.vPosition.from, cameraTransitioner.vPosition.to, t);\n      core.camera.setOrbit(cameraTransitioner.qRotation.current, false);\n      core.camera.setPosition(cameraTransitioner.vPosition.current, false);\n      core.inputManager.isPickingEnabled = false;\n    };\n    core.updateCallback = (elapsedTime) => {\n      const { transitionDurations } = lastPresenterConfig;\n      if (positionTransitioner.isTransitioning) {\n        const t = positionTransitioner.elapse(elapsedTime, transitionDurations.position + transitionDurations.stagger);\n        core.renderer.transitionTime = t;\n        setTransitionTimeAxesVisibility(transistion2dOnly, core);\n      } else {\n        core.inputManager.isPickingEnabled = true;\n      }\n      if (modelTransitioner.isTransitioning) {\n        const tm = modelTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n        if (modelTransitioner.shouldTransition) {\n          slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.from, modelTransitioner.qRotation.to, tm);\n          core.setModelRotation(modelTransitioner.qRotation.current, false);\n        }\n        cam(tm);\n      }\n      if (cameraTransitioner.isTransitioning) {\n        const t = cameraTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n        cam(t);\n      }\n    };\n  }\n  function setTransitionTimeAxesVisibility(transistion2dOnly, core) {\n    const t = core.renderer.transitionTime;\n    if (transistion2dOnly) {\n      if (t < 0.5) {\n        core.renderer.axesVisibility = AxesVisibility.previous;\n      } else {\n        core.renderer.axesVisibility = AxesVisibility.current;\n      }\n    } else {\n      if (t <= 0.01) {\n        core.renderer.axesVisibility = AxesVisibility.previous;\n      } else if (t >= 0.99) {\n        core.renderer.axesVisibility = AxesVisibility.current;\n      } else {\n        core.renderer.axesVisibility = AxesVisibility.none;\n      }\n    }\n  }\n  function morphChartsRender(ref2, prevStage, stage, height2, width2, preStage, colors2, config) {\n    const { qCameraRotation2d: qCameraRotation2d2, qCameraRotation3d: qCameraRotation3d2, qModelRotation2d: qModelRotation2d2, qModelRotation3d: qModelRotation3d2, vCameraPosition: vCameraPosition2 } = cameraDefaults;\n    const { core, cameraTransitioner, modelTransitioner, positionTransitioner } = ref2;\n    let transistion2dOnly = false;\n    let cameraTo;\n    let holdCamera;\n    if (config.camera === \"hold\") {\n      holdCamera = true;\n    } else {\n      cameraTo = config.camera;\n    }\n    if (prevStage && prevStage.view !== stage.view) {\n      modelTransitioner.shouldTransition = !holdCamera;\n      if (stage.view === \"2d\") {\n        modelTransitioner.qRotation.from = qModelRotation3d2;\n        modelTransitioner.qRotation.to = qModelRotation2d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      } else {\n        modelTransitioner.qRotation.from = qModelRotation2d2;\n        modelTransitioner.qRotation.to = qModelRotation3d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      }\n    } else {\n      modelTransitioner.shouldTransition = false;\n      if (stage.view === \"2d\") {\n        transistion2dOnly = true;\n        modelTransitioner.qRotation.to = qModelRotation2d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      } else {\n        modelTransitioner.qRotation.to = qModelRotation3d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      }\n    }\n    core.camera.getOrbit(cameraTransitioner.qRotation.from);\n    core.camera.getPosition(cameraTransitioner.vPosition.from);\n    if (!prevStage) {\n      core.setModelRotation(modelTransitioner.qRotation.to, false);\n      core.camera.setOrbit(cameraTransitioner.qRotation.to, false);\n      core.camera.setPosition(cameraTransitioner.vPosition.to, false);\n    } else if (!holdCamera) {\n      cameraTransitioner.begin();\n    }\n    positionTransitioner.begin();\n    if (modelTransitioner.shouldTransition) {\n      modelTransitioner.begin();\n    }\n    const props = { ref: ref2, stage, height: height2, config };\n    const cubeLayer = createCubeLayer(props);\n    const lineLayer = createLineLayer(props);\n    const textLayer = createTextLayer(props);\n    const { backgroundImages } = stage;\n    let contentBounds = outerBounds(outerBounds(cubeLayer === null || cubeLayer === void 0 ? void 0 : cubeLayer.bounds, lineLayer === null || lineLayer === void 0 ? void 0 : lineLayer.bounds), outerBounds(textLayer === null || textLayer === void 0 ? void 0 : textLayer.bounds, null));\n    backgroundImages === null || backgroundImages === void 0 ? void 0 : backgroundImages.forEach((backgroundImage) => {\n      contentBounds = outerBounds(contentBounds, convertBounds(backgroundImage.bounds));\n    });\n    props.bounds = contentBounds;\n    core.renderer.previousAxes = core.renderer.currentAxes;\n    const axesLayer = createAxesLayer(props);\n    core.config.transitionStaggering = config.transitionDurations.stagger;\n    core.config.transitionDuration = config.transitionDurations.position;\n    let bounds2;\n    if (axesLayer && axesLayer.bounds) {\n      bounds2 = axesLayer.bounds;\n    } else {\n      bounds2 = contentBounds;\n    }\n    ref2.setMorphChartsRendererOptions(config.renderer);\n    if (preStage) {\n      preStage(stage, cubeLayer);\n    }\n    core.renderer.images = [];\n    if (backgroundImages) {\n      const addImage = (imageBounds, imageData) => {\n        const imageWidth2 = imageBounds.maxBoundsX - imageBounds.minBoundsX;\n        const imageHeight2 = imageBounds.maxBoundsY - imageBounds.minBoundsY;\n        const position2 = [imageBounds.minBoundsX + imageWidth2 / 2, imageBounds.minBoundsY + imageHeight2 / 2, 0];\n        const imageQuad = createImageQuad(core, imageData, contentBounds, position2, imageWidth2, imageHeight2);\n        const imageVisual = core.renderer.createImageVisual(imageQuad);\n        core.renderer.images.push(imageVisual);\n      };\n      const imageDataCache = {};\n      backgroundImages.forEach((backgroundImage) => {\n        const imageBounds = convertBounds(backgroundImage.bounds);\n        const imageData = imageDataCache[backgroundImage.url];\n        if (imageData) {\n          addImage(imageBounds, imageData);\n        } else {\n          getImageData(backgroundImage.url).then((imageData2) => {\n            imageDataCache[backgroundImage.url] = imageData2;\n            addImage(imageBounds, imageData2);\n          });\n        }\n      });\n    }\n    layersWithSelection(cubeLayer, lineLayer, textLayer, config.layerSelection, bounds2, ref2.layerStagger);\n    applyCameraCallbacks(ref2, config, stage.view, transistion2dOnly);\n    core.renderer.transitionTime = 0;\n    colorConfig(ref2, colors2);\n    return {\n      bounds: bounds2,\n      getCubeLayer: () => cubeLayer,\n      update: (layerSelection) => layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds2, ref2.layerStagger),\n      activate: (id2) => core.renderer.transitionBuffers[0].activeId = id2,\n      moveCamera: (camera) => {\n        if (!(positionTransitioner.isTransitioning || modelTransitioner.isTransitioning)) {\n          core.camera.getOrbit(cameraTransitioner.qRotation.from);\n          core.camera.getPosition(cameraTransitioner.vPosition.from);\n          cameraTransitioner.move(camera.position, camera.rotation);\n        }\n      },\n      setTransitionTimeAxesVisibility: () => {\n        setTransitionTimeAxesVisibility(transistion2dOnly, core);\n      }\n    };\n  }\n  function layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds2, layerStagger) {\n    const layerItems = [\n      {\n        layer: cubeLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.cubes,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.cubes\n      },\n      {\n        layer: lineLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.lines,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.lines\n      },\n      {\n        layer: textLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.texts,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.texts\n      }\n    ];\n    layerItems.forEach((layerItem) => {\n      var _a2;\n      return (_a2 = layerItem.layer) === null || _a2 === void 0 ? void 0 : _a2.update(bounds2, layerItem.selection, layerItem.stagger);\n    });\n  }\n  function convertBounds(bounds2) {\n    if (!bounds2)\n      return;\n    return {\n      minBoundsX: bounds2.x1,\n      maxBoundsX: bounds2.x2,\n      minBoundsY: -bounds2.y2,\n      maxBoundsY: -bounds2.y1,\n      minBoundsZ: minZ,\n      maxBoundsZ: minZ\n    };\n  }\n  function shouldChangeRenderer(prev, next) {\n    var _a2, _b2;\n    if (!prev || !next)\n      return true;\n    if (prev.advanced !== next.advanced)\n      return true;\n    if (!prev.advanced) {\n      return ((_a2 = prev.basicOptions) === null || _a2 === void 0 ? void 0 : _a2.antialias) != ((_b2 = next.basicOptions) === null || _b2 === void 0 ? void 0 : _b2.antialias);\n    }\n  }\n  function getRenderer(mcRendererOptions, core) {\n    const advanced = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced;\n    const r = advanced ? new Main() : new Main$1(mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.basicOptions);\n    core.renderer = r;\n    setRendererOptions(r, mcRendererOptions);\n    return r;\n  }\n  function setRendererOptions(renderer, mcRendererOptions) {\n    const o = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advancedOptions;\n    if ((mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced) && o) {\n      for (const key2 in o) {\n        renderer.config[key2] = o[key2];\n      }\n    }\n  }\n  function rendererEnabled(advanced) {\n    const r = advanced ? new Main() : new Main$1();\n    return r.isSupported;\n  }\n  const rightButton = 2;\n  function listenCanvasEvents(core, options2) {\n    const { container, pickGridCallback } = options2;\n    const { inputManager } = core;\n    if (options2.onLasso) {\n      inputManager.pickLassoCallback = (result) => {\n        options2.onLasso(result.ids[0], result.manipulator.event);\n      };\n    }\n    inputManager.singleTouchAction = (manipulator) => {\n      if (manipulator.button == rightButton || manipulator.shiftKey || manipulator.ctrlKey) {\n        return SingleTouchAction.rotate;\n      } else if (manipulator.altKey) {\n        return SingleTouchAction.lasso;\n      } else {\n        return SingleTouchAction.translate;\n      }\n    };\n    inputManager.pickAxesGridCallback = ({ divisionX, divisionY, divisionZ, manipulator }) => {\n      clearClickTimeout();\n      const { altKey, button, shiftKey } = manipulator;\n      const me = { altKey, shiftKey, button };\n      const e = me;\n      pickGridCallback([divisionX, divisionY, divisionZ], e);\n    };\n    const canvas = container.getElementsByTagName(\"canvas\")[0];\n    let pickedId;\n    const hover2 = (e) => {\n      if (core.renderer.pickedId !== pickedId) {\n        pickedId = core.renderer.pickedId;\n        const ordinal2 = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n        options2.onCubeHover(e, ordinal2);\n      }\n    };\n    canvas.addEventListener(\"mousemove\", (e) => {\n      clearClickTimeout();\n      if (mousedown) {\n        options2.onCubeHover(e, null);\n      }\n      hover2(e);\n    });\n    canvas.addEventListener(\"mouseout\", hover2);\n    canvas.addEventListener(\"mouseover\", hover2);\n    let mousedown;\n    canvas.addEventListener(\"mousedown\", () => {\n      mousedown = true;\n    });\n    canvas.addEventListener(\"mouseup\", (e) => {\n      mousedown = false;\n    });\n    let canvasClickTimeout;\n    const clearClickTimeout = () => {\n      clearTimeout(canvasClickTimeout);\n      canvasClickTimeout = null;\n    };\n    canvas.addEventListener(\"click\", (e) => {\n      canvasClickTimeout = setTimeout(() => {\n        options2.onCanvasClick(e);\n      }, 50);\n    });\n    inputManager.pickItemCallback = ({ manipulator }) => {\n      clearClickTimeout();\n      const ordinal2 = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n      options2.onCubeClick(manipulator.event, ordinal2);\n    };\n  }\n  function cubicInOut(t) {\n    return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n  }\n  function easing(t) {\n    if (t === 0 || t === 1)\n      return t;\n    return cubicInOut(t);\n  }\n  class Transitioner {\n    constructor() {\n      this.isTransitioning = false;\n    }\n    begin() {\n      this.isTransitioning = true;\n      this.time = 0;\n    }\n    elapse(elapsedTime, totalTime, ease = false) {\n      this.time += elapsedTime;\n      if (this.time >= totalTime) {\n        this.isTransitioning = false;\n        this.time = totalTime;\n        this.ended && this.ended();\n      }\n      const t = this.time / totalTime;\n      return ease ? easing(t) : t;\n    }\n  }\n  class CameraTransitioner extends Transitioner {\n    constructor() {\n      super();\n      this.qRotation = {\n        from: create$4(),\n        to: null,\n        current: create$4()\n      };\n      this.vPosition = {\n        from: create$6(),\n        to: null,\n        current: create$6()\n      };\n    }\n    move(position2, rotation2) {\n      this.begin();\n      this.qRotation.to = rotation2;\n      this.vPosition.to = position2;\n    }\n  }\n  class ModelTransitioner extends Transitioner {\n    constructor() {\n      super();\n      this.shouldTransition = false;\n      this.qRotation = {\n        from: null,\n        to: null,\n        current: create$4()\n      };\n    }\n  }\n  function init$1(options2, mcRendererOptions) {\n    const { container } = options2;\n    const core = new Core({ container });\n    getRenderer(mcRendererOptions, core);\n    listenCanvasEvents(core, options2);\n    core.config.pickSelectDelay = 50;\n    const cameraTransitioner = new CameraTransitioner();\n    const modelTransitioner = new ModelTransitioner();\n    const positionTransitioner = new Transitioner();\n    positionTransitioner.ended = () => {\n      core.renderer.axesVisibility = AxesVisibility.current;\n    };\n    const ref2 = {\n      supportedRenders: {\n        advanced: rendererEnabled(true),\n        basic: rendererEnabled(false)\n      },\n      reset: null,\n      cameraTransitioner,\n      modelTransitioner,\n      positionTransitioner,\n      core,\n      setMorphChartsRendererOptions(mcRendererOptions2) {\n        if (shouldChangeRenderer(ref2.lastMorphChartsRendererOptions, mcRendererOptions2)) {\n          getRenderer(mcRendererOptions2, core);\n          listenCanvasEvents(core, options2);\n        } else {\n          if (mcRendererOptions2.advanced) {\n            setRendererOptions(core.renderer, mcRendererOptions2);\n          }\n        }\n        ref2.lastMorphChartsRendererOptions = mcRendererOptions2;\n      },\n      lastMorphChartsRendererOptions: mcRendererOptions,\n      layerStagger: {}\n    };\n    return ref2;\n  }\n  class Presenter {\n    /**\n     * Get the previously rendered Stage object.\n     */\n    get stage() {\n      return this._last.stage;\n    }\n    /**\n     * Get the current View camera type.\n     */\n    get view() {\n      return this._last.view;\n    }\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */\n    constructor(el, style2) {\n      this.el = el;\n      this.style = deepMerge(defaultPresenterStyle$1, style2);\n      initializePanel(this);\n      this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n    }\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */\n    animationCancel() {\n      if (this.animationTimer) {\n        clearTimeout(this.animationTimer);\n        this.animationTimer = null;\n        if (this.logger) {\n          this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || \"handler\"}`);\n        }\n        if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n          this.queuedAnimationOptions.animationCanceled.call(null);\n        }\n      }\n    }\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */\n    animationQueue(handler, timeout2, options2) {\n      if (this.logger) {\n        this.logger(`queueing animation ${options2 && options2.waitingLabel || \"waiting\"}...(${timeout2})`);\n      }\n      this.animationCancel();\n      this.animationTimer = setTimeout(() => {\n        if (this.logger) {\n          this.logger(`queueing animation ${options2 && options2.handlerLabel || \"handler\"}...`);\n        }\n        handler();\n      }, timeout2);\n    }\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */\n    getElement(type2) {\n      const elements = this.el.getElementsByClassName(className$1(type2, this));\n      if (elements && elements.length) {\n        return elements[0];\n      }\n    }\n    /**\n     * Present the Vega Scene, or Stage object using Morphcharts.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area.\n     * @param config Optional presentation configuration object.\n     */\n    present(sceneOrStage, height2, width2, config) {\n      this.animationCancel();\n      const scene = sceneOrStage;\n      let stage;\n      const options2 = {\n        maxOrdinal: 0,\n        currAxis: null,\n        defaultCubeColor: this.style.defaultCubeColor,\n        assignCubeOrdinal: config && config.onSceneRectAssignCubeOrdinal || (() => options2.maxOrdinal++),\n        modifyAxis: (config === null || config === void 0 ? void 0 : config.onAxisItem) ? config.onAxisItem : defaultOnAxisItem,\n        zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n      };\n      if (scene.marktype) {\n        stage = createStage(scene.view);\n        sceneToStage(options2, stage, scene);\n      } else {\n        stage = sceneOrStage;\n      }\n      const c2 = deepMerge(defaultPresenterConfig, config);\n      if (!this.morphchartsref) {\n        this._morphChartsOptions = {\n          container: this.getElement(PresenterElement$1.gl),\n          pickGridCallback: c2.axisPickGridCallback,\n          onCubeHover: (e, ordinal2) => {\n            c2.onCubeHover(e, { ordinal: ordinal2, color: null, position: null, size: null });\n          },\n          onCubeClick: (e, ordinal2) => {\n            c2.onCubeClick(e, { ordinal: ordinal2, color: null, position: null, size: null });\n          },\n          onCanvasClick: config === null || config === void 0 ? void 0 : config.onLayerClick,\n          onLasso: config === null || config === void 0 ? void 0 : config.onLasso\n        };\n        this.morphchartsref = init$1(this._morphChartsOptions, c2.renderer || defaultPresenterConfig.renderer);\n      }\n      let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n      if (options2.maxOrdinal) {\n        cubeCount = Math.max(cubeCount, options2.maxOrdinal);\n        const empty = {\n          isEmpty: true\n        };\n        stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n      }\n      config.preLayer && config.preLayer(stage);\n      this.morphChartsRenderResult = morphChartsRender(this.morphchartsref, this._last.stage, stage, height2, width2, config && config.preStage, config && config.morphChartsColors, c2);\n      delete stage.cubeData;\n      delete stage.redraw;\n      this._last = {\n        cubeCount,\n        height: height2,\n        width: width2,\n        stage,\n        view: stage.view\n      };\n      const a2 = getActiveElementInfo();\n      mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement$1.legend));\n      setActiveElement(a2);\n      if (config && config.onPresent) {\n        config.onPresent();\n      }\n    }\n    canvasToDataURL() {\n      return new Promise((resolve2, reject) => {\n        this.morphchartsref.core.afterRenderCallback = () => {\n          this.morphchartsref.core.afterRenderCallback = null;\n          const canvas = this.getElement(PresenterElement$1.gl).getElementsByTagName(\"canvas\")[0];\n          const png = canvas.toDataURL(\"image/png\");\n          resolve2(png);\n        };\n      });\n    }\n    configColors(mcColors) {\n      colorConfig(this.morphchartsref, mcColors);\n    }\n    /**\n     * Home the camera to the last initial position.\n     */\n    homeCamera() {\n      var _a2;\n      (_a2 = this.morphchartsref) === null || _a2 === void 0 ? void 0 : _a2.reset();\n    }\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */\n    showGuides() {\n      this.getElement(PresenterElement$1.gl).classList.add(\"show-center\");\n    }\n    finalize() {\n      this.animationCancel();\n      if (this.morphchartsref)\n        this.morphchartsref.core.stop();\n      if (this.el)\n        this.el.innerHTML = \"\";\n      this._last = null;\n      this.morphchartsref = null;\n      this.el = null;\n      this.logger = null;\n      this.queuedAnimationOptions = null;\n    }\n  }\n  function _RendererGl(loader2) {\n    class RendererGlInternal extends base$3.vega.Renderer {\n      initialize(el, width2, height2, origin) {\n        this.height = height2;\n        this.width = width2;\n        return super.initialize(el, width2, height2, origin);\n      }\n      resize(width2, height2, origin) {\n        super.resize(width2, height2, origin);\n        this.origin = origin;\n        this.height = height2;\n        this.width = width2;\n        return this;\n      }\n      _render(scene, items) {\n        const scene3d = scene;\n        scene3d.view = this.getView();\n        this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n        return this;\n      }\n    }\n    const instance = new RendererGlInternal(loader2);\n    return instance;\n  }\n  const RendererGl = _RendererGl;\n  let registered = false;\n  function _ViewGl(runtime2, config) {\n    class ViewGlInternal extends base$3.vega.View {\n      constructor(runtime3, config2 = {}) {\n        super(runtime3, config2);\n        this.config = config2;\n        this.presenter = config2.presenter;\n        config2.presenterConfig = config2.presenterConfig || {};\n        config2.presenterConfig.redraw = () => {\n          this._redraw = true;\n          this.run();\n        };\n      }\n      renderer(...args) {\n        if (args && args.length) {\n          const renderer = args[0];\n          if (renderer === \"morphcharts\" && !registered) {\n            base$3.vega.renderModule(\"morphcharts\", { handler: base$3.vega.CanvasHandler, renderer: RendererGl });\n            registered = true;\n          }\n          return super.renderer(renderer);\n        } else {\n          return super.renderer();\n        }\n      }\n      initialize(el) {\n        if (!this.presenter) {\n          this.presenter = new Presenter(el);\n        }\n        super.initialize(this.presenter.getElement(PresenterElement$1.vegaControls));\n        const renderer = this._renderer;\n        renderer.presenterConfig = this.config.presenterConfig;\n        renderer.presenter = this.presenter;\n        renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView$1);\n        return this;\n      }\n      error(e) {\n        if (this.presenter.logger) {\n          this.presenter.logger(e);\n        }\n      }\n    }\n    const instance = new ViewGlInternal(runtime2, config);\n    return instance;\n  }\n  const ViewGl = _ViewGl;\n  const version$5 = \"1.0.6\";\n  const index$5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Presenter,\n    get PresenterElement() {\n      return PresenterElement$1;\n    },\n    ViewGl,\n    base: base$3,\n    controls,\n    defaults: defaults$1,\n    types,\n    use: use$5,\n    util: util$4,\n    version: version$5\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const { defaultPresenterStyle } = defaults$1;\n  const defaultViewerOptions$1 = {\n    colors: {\n      activeCube: \"purple\",\n      defaultCube: colorToString(defaultPresenterStyle.defaultCubeColor),\n      hoveredCube: colorToString(defaultPresenterStyle.highlightColor),\n      selectedCube: \"yellow\",\n      axisSelectHighlight: colorToString([128, 128, 128, 128]),\n      axisLine: \"#000\",\n      axisText: \"#000\",\n      gridLine: \"#CCC\",\n      backgroundColor: \"#FFF\"\n    },\n    language: {\n      headers: {\n        chart: \"Chart\",\n        details: \"Details\",\n        legend: \"Legend\",\n        selection: \"Select & Filter\"\n      },\n      bing: \"bing\",\n      newColorMap: \"remap color to filtered items\",\n      oldColorMap: \"keep same colors\",\n      deselect: \"deselect\",\n      exclude: \"exclude\",\n      isolate: \"isolate\",\n      legendOther: \"other\",\n      nextDetail: \">\",\n      previousDetail: \"<\",\n      reset: \"reset\",\n      colorBinCount: \"Color bin count\",\n      colorReverse: \"Color reverse\",\n      count: \"Count\",\n      percent: \"Percent\",\n      sum: \"Sum\",\n      scatterPointScale: \"Point scale\",\n      FacetMaxBins: \"Facet max bins\",\n      FacetVMaxBins: \"Cross facet max bins\",\n      XMaxBins: \"X axis max bins\",\n      YMaxBins: \"Y axis max bins\",\n      XGridSize: \"X grid size\",\n      YGridSize: \"Y grid size\",\n      InnerPaddingSize: \"Inner padding size\",\n      OuterPaddingSize: \"Outer padding size\",\n      treeMapMethod: \"Treemap layout\",\n      facetColumns: \"Facet columns\",\n      facetRows: \"Facet rows\",\n      markOpacitySignal: \"Mark opacity\",\n      textScaleSignal: \"Text scale\",\n      xAxisTextAngleSignal: \"X axis text angle\",\n      yAxisTextAngleSignal: \"Y axis text angle\",\n      zGrounded: \"Z grounded\",\n      zScaleProportion: \"Z scale proportion to Y\",\n      selectionCount: (count2) => `${count2} items selected`\n    },\n    maxLegends: 19,\n    //20 would be \"other\"\n    onError: (errors) => {\n    },\n    filterRenderingTimerPadding: 200,\n    selectionPolygonZ: -1,\n    tickSize: 10\n  };\n  function getPresenterStyle(options2) {\n    const style2 = {\n      cssPrefix,\n      fontFamily: options2.fontFamily,\n      defaultCubeColor: colorFromString(options2.colors.defaultCube)\n    };\n    if (options2.colors.hoveredCube) {\n      style2.highlightColor = colorFromString(options2.colors.hoveredCube);\n    }\n    return style2;\n  }\n  const cssPrefix = \"sanddance-\";\n  const dualColorSchemeColors = {\n    black: \"#212121\",\n    gray: \"#D2D2D2\",\n    blue: \"#0060F0\",\n    green: \"#00C000\",\n    orange: \"#FF9900\",\n    red: \"#E00000\"\n  };\n  function isInternalFieldName(columnName, includeVegaMorphChartsFields = false) {\n    if (includeVegaMorphChartsFields) {\n      if (columnName === GL_ORDINAL)\n        return true;\n    }\n    for (const f in FieldNames) {\n      if (columnName === FieldNames[f])\n        return true;\n    }\n    return false;\n  }\n  const util$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    getColumnsFromData,\n    getPresenterStyle,\n    getStats,\n    inferAll,\n    isInternalFieldName\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const dualPairs = [\n    [dualColorSchemeColors.black, dualColorSchemeColors.gray],\n    [dualColorSchemeColors.red, dualColorSchemeColors.green],\n    [dualColorSchemeColors.red, dualColorSchemeColors.blue],\n    [dualColorSchemeColors.black, dualColorSchemeColors.red],\n    [dualColorSchemeColors.black, dualColorSchemeColors.orange],\n    [dualColorSchemeColors.black, dualColorSchemeColors.green]\n  ];\n  const colorSchemes = [\n    {\n      scheme: ColorScaleNone,\n      colors: [defaultViewerOptions$1.colors.defaultCube]\n    }\n  ];\n  createDualColorSchemes();\n  function registerColorSchemes(vega2) {\n    colorSchemes.forEach((cs) => {\n      if (cs.colors.length === 1) {\n        vega2.scheme(cs.scheme, (x2) => cs.colors[0]);\n      } else {\n        vega2.scheme(cs.scheme, cs.colors);\n      }\n    });\n  }\n  function createPair(names, colors2) {\n    const scheme2 = `dual_${names[0]}${names[1]}`;\n    colorSchemes.push({ scheme: scheme2, colors: colors2 });\n  }\n  function createDualColorSchemes() {\n    dualPairs.forEach((colors2) => {\n      const names = colors2.map((color2) => {\n        for (const key2 in dualColorSchemeColors)\n          if (color2 === dualColorSchemeColors[key2])\n            return key2;\n      });\n      createPair(names, colors2);\n      createPair([...names].reverse(), [...colors2].reverse());\n    });\n  }\n  var DataLayoutChange;\n  (function(DataLayoutChange2) {\n    DataLayoutChange2[DataLayoutChange2[\"same\"] = 0] = \"same\";\n    DataLayoutChange2[DataLayoutChange2[\"reset\"] = 1] = \"reset\";\n    DataLayoutChange2[DataLayoutChange2[\"refine\"] = 2] = \"refine\";\n  })(DataLayoutChange || (DataLayoutChange = {}));\n  class Animator {\n    constructor(dataScope, props) {\n      this.dataScope = dataScope;\n      this.props = props;\n    }\n    select(search) {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.select(search);\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    deselect() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deselect();\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    filter(search, keepData, collapseData, rebase) {\n      if (rebase) {\n        this.dataScope.collapse(false, keepData);\n      }\n      this.dataScope.collapse(true, collapseData);\n      return new Promise((resolve2, reject) => {\n        this.props.onAnimateDataChange(DataLayoutChange.refine, \"before refine\", \"refine\").then(() => {\n          this.dataScope.deselect();\n          this.dataScope.setFilteredData(keepData);\n          this.props.onDataChanged(DataLayoutChange.refine, search);\n          resolve2();\n        }).catch(reject);\n      });\n    }\n    reset() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deselect();\n        let time2;\n        if (!this.dataScope.hasFilteredData()) {\n          time2 = 0;\n        } else {\n          this.dataScope.setFilteredData(null);\n        }\n        this.props.onAnimateDataChange(DataLayoutChange.reset, \"before reset\", \"reset\", time2).then(() => {\n          this.dataScope.collapse(false);\n          this.props.onDataChanged(DataLayoutChange.reset);\n          resolve2();\n        }).catch(reject);\n      });\n    }\n    activate(datum2) {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.activate(datum2);\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    deactivate() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deactivate();\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n  }\n  function notNice(niceValue) {\n    return (niceValue + \"\").replace(/[\\s,]/g, \"\");\n  }\n  function tickValue(axis, i) {\n    const tick = axis.tickText[i];\n    let value2;\n    if (tick) {\n      value2 = axis.tickText[i].value;\n    }\n    return { tick, value: value2 };\n  }\n  function selectNullOrEmpty(column) {\n    const searchExpression = {\n      name: column.name,\n      operator: \"isnullorEmpty\"\n    };\n    return searchExpression;\n  }\n  function selectExact(column, value2) {\n    if (value2 == null) {\n      return selectNullOrEmpty(column);\n    }\n    const searchExpression = {\n      name: column.name,\n      operator: \"==\",\n      value: value2\n    };\n    return searchExpression;\n  }\n  function selectNone(column, values2) {\n    const expressions = values2.map((value2, i) => {\n      const searchExpression = {\n        name: column.name,\n        operator: \"!=\",\n        value: value2\n      };\n      if (i) {\n        searchExpression.clause = \"&&\";\n      }\n      return searchExpression;\n    });\n    const searchExpressionGroup = {\n      expressions\n    };\n    return searchExpressionGroup;\n  }\n  function selectExactAxis(axis, column, i) {\n    const result = tickValue(axis, i);\n    if (result.tick) {\n      return selectExact(column, result.value);\n    }\n  }\n  function selectBetween(column, lowValue, highValue, lowOperator = \">=\", highOperator = \"<\") {\n    const expressions = [];\n    if (lowValue !== void 0) {\n      expressions.push({\n        name: column.name,\n        operator: lowOperator,\n        value: lowValue\n      });\n    }\n    if (highValue !== void 0) {\n      expressions.push({\n        name: column.name,\n        operator: highOperator,\n        value: highValue\n      });\n    }\n    if (expressions.length > 1) {\n      expressions[1].clause = \"&&\";\n    }\n    const searchExpressionGroup = {\n      expressions\n    };\n    return searchExpressionGroup;\n  }\n  function selectBetweenAxis(axis, column, i) {\n    const low = tickValue(axis, i);\n    const high = tickValue(axis, i + 1);\n    return selectBetween(column, low.value, high.value);\n  }\n  const dimToRole = {\n    0: \"x\",\n    1: \"y\",\n    2: \"z\"\n  };\n  const roleToDim = {\n    x: 0,\n    y: 1,\n    z: 1\n  };\n  class AxisSelection {\n    constructor(specCapabilities, columns, stage) {\n      this.specCapabilities = specCapabilities;\n      this.columns = columns;\n      this.stage = stage;\n    }\n    convert(divisions) {\n      const searchRoles = [];\n      divisions.forEach((division, i) => {\n        const role = dimToRole[i];\n        const axes = this.stage.axes[role];\n        const axis = axes.filter((axis2) => axis2.tickText.length)[0];\n        if (axis) {\n          const capabilities2 = this.specCapabilities.roles.filter((r) => r.role === role)[0];\n          const column = this.columns[role];\n          if (division >= 0 && (capabilities2 === null || capabilities2 === void 0 ? void 0 : capabilities2.axisSelection)) {\n            searchRoles.push({\n              axis,\n              role,\n              capabilities: capabilities2,\n              column,\n              division\n            });\n          }\n        }\n      });\n      switch (searchRoles.length) {\n        case 0: {\n          return null;\n        }\n        case 1: {\n          return this.getSearchFromSearchRole(searchRoles[0]);\n        }\n        default: {\n          const roles = searchRoles.map((searchRole) => this.getSearchFromSearchRole(searchRole));\n          roles.forEach((role, i) => {\n            if (i === 0)\n              return;\n            role.clause = \"&&\";\n          });\n          return roles;\n        }\n      }\n    }\n    getSearchFromSearchRole(searchRole) {\n      const getSearch = searchRole.capabilities.axisSelection === \"exact\" ? (a2, c2, i) => ({ expressions: [selectExactAxis(a2, c2, i)] }) : selectBetweenAxis;\n      const { axis, column, division } = searchRole;\n      return getSearch(axis, column, division);\n    }\n  }\n  function moveTicksBetween(axes) {\n    axes.forEach((axis) => {\n      if (axis.ticks.length === 0)\n        return;\n      const dim = roleToDim[axis.axisRole];\n      const { color: color2 } = axis.ticks[0];\n      const newLine = (value2) => {\n        const line2 = {\n          sourcePosition: [0, 0, 0],\n          targetPosition: [0, 0, 0],\n          color: color2\n        };\n        line2.sourcePosition[dim] = value2;\n        return line2;\n      };\n      const newTicks = [];\n      newTicks.push(newLine(axis.domain.sourcePosition[dim]));\n      for (let i = 1; i < axis.ticks.length; i++) {\n        newTicks.push(newLine((axis.ticks[i].sourcePosition[dim] + axis.ticks[i - 1].sourcePosition[dim]) / 2));\n      }\n      newTicks.push(newLine(axis.domain.targetPosition[dim]));\n      axis.ticks = newTicks;\n    });\n  }\n  function populateColorContext(colorContext, presenter) {\n    if (!colorContext.colorMap) {\n      colorContext.colorMap = presenter.morphChartsRenderResult.getCubeLayer().unitColorMap;\n    }\n    colorContext.legend = clone(presenter.stage.legend);\n    colorContext.legendElement = presenter.getElement(PresenterElement$1.legend).children[0];\n  }\n  let DataScope$2 = class DataScope {\n    constructor() {\n      this.filteredColumnsStats = {};\n    }\n    setData(data2, columns) {\n      const differentData = this.data !== data2;\n      if (differentData) {\n        if (this.data) {\n          this.deselect();\n        }\n        this.data = data2;\n        this.columns = columns;\n        this.filteredData = null;\n        this.filteredColumnsStats = {};\n      }\n      return differentData;\n    }\n    setFilteredData(filteredData) {\n      this.filteredData = filteredData;\n      this.filteredColumnsStats = {};\n    }\n    getColumns(columnTypes) {\n      if (!this.columns) {\n        this.columns = getColumnsFromData(base$3.vega.inferTypes, this.data, columnTypes);\n      }\n      return this.columns;\n    }\n    getFilteredColumnStats(columnName) {\n      if (!this.filteredColumnsStats[columnName]) {\n        this.filteredColumnsStats[columnName] = getStats(this.filteredData, this.columns.filter((c2) => c2.name === columnName)[0]);\n      }\n      return this.filteredColumnsStats[columnName];\n    }\n    currentData() {\n      return this.filteredData || this.data;\n    }\n    select(search) {\n      this.deselect();\n      if (search) {\n        this.selection = this.createUserSelection(search, true, false);\n        if (this.selection.included.length) {\n          this.activate(this.selection.included[0]);\n        }\n      }\n    }\n    createUserSelection(search, assign2, rebase) {\n      const exec = new Exec(search, this.getColumns());\n      const s2 = {\n        search,\n        included: [],\n        excluded: []\n      };\n      const data2 = rebase ? this.data : this.currentData();\n      data2.forEach((datum2) => {\n        if (exec.run(datum2)) {\n          if (assign2) {\n            datum2[FieldNames.Selected] = true;\n          }\n          s2.included.push(datum2);\n        } else {\n          s2.excluded.push(datum2);\n        }\n      });\n      return s2;\n    }\n    deselect() {\n      this.deactivate();\n      this.data.forEach((datum2) => {\n        delete datum2[FieldNames.Selected];\n      });\n      this.selection = null;\n    }\n    hasFilteredData() {\n      return !!this.filteredData;\n    }\n    hasSelectedData() {\n      return !!this.selection;\n    }\n    collapse(collapsed, data2 = this.data) {\n      data2.forEach((datum2) => {\n        datum2[FieldNames.Collapsed] = collapsed;\n      });\n      this.isCollapsed = collapsed;\n    }\n    activate(datum2) {\n      this.deactivate();\n      datum2[FieldNames.Active] = true;\n      this.active = datum2;\n    }\n    deactivate() {\n      if (this.active) {\n        delete this.active[FieldNames.Active];\n      }\n      this.active = null;\n    }\n    ordinalIndexWithinSelection(ordinal2) {\n      if (this.selection) {\n        for (let i = 0; i < this.selection.included.length; i++) {\n          const datum2 = this.selection.included[i];\n          if (datum2[GL_ORDINAL] === ordinal2) {\n            return { datum: datum2, index: i };\n          }\n        }\n      }\n      return { datum: null, index: -1 };\n    }\n    finalize() {\n      this.data = null;\n      this.filteredData = null;\n      this.filteredColumnsStats = null;\n      if (this.selection) {\n        this.selection.excluded = null;\n        this.selection.included = null;\n        this.selection = null;\n      }\n    }\n  };\n  var Action;\n  (function(Action2) {\n    Action2[Action2[\"deselect\"] = 0] = \"deselect\";\n    Action2[Action2[\"isolate\"] = 1] = \"isolate\";\n    Action2[Action2[\"exclude\"] = 2] = \"exclude\";\n    Action2[Action2[\"reset\"] = 3] = \"reset\";\n    Action2[Action2[\"next\"] = 4] = \"next\";\n    Action2[Action2[\"previous\"] = 5] = \"previous\";\n  })(Action || (Action = {}));\n  class Details {\n    constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n      this.language = language;\n      this.animator = animator;\n      this.dataScope = dataScope;\n      this.colorMapHandler = colorMapHandler;\n      this.hasColorMaps = hasColorMaps;\n      this.element = addDiv(parentElement, `${cssPrefix}unitControls`);\n      this.clear();\n    }\n    finalize() {\n      if (this.element)\n        this.element.innerHTML = \"\";\n      this.dataScope = null;\n      this.element = null;\n    }\n    clear() {\n      this.state = {\n        userSelection: null,\n        index: -1,\n        remapColor: false\n      };\n      this.render();\n    }\n    clearSelection() {\n      this.state.userSelection = null;\n      this.state.index = -1;\n      this.render();\n    }\n    populate(userSelection, index2 = 0) {\n      this.state.userSelection = userSelection;\n      this.state.index = index2;\n      this.render();\n    }\n    selectByNameValue(columnName, value2) {\n      const search = {\n        name: columnName,\n        operator: \"==\",\n        value: value2\n      };\n      this.clearSelection();\n      this.animator.select(search);\n      this.populate(this.dataScope.selection);\n    }\n    remapChanged(remap) {\n      this.state.remapColor = remap;\n      this.colorMapHandler(remap);\n      this.render();\n    }\n    handleAction(action) {\n      let p;\n      const u2 = this.state.userSelection;\n      switch (action) {\n        case Action.deselect: {\n          this.clearSelection();\n          p = this.animator.deselect();\n          break;\n        }\n        case Action.exclude: {\n          this.clearSelection();\n          p = this.animator.filter(invert$2(u2.search), u2.excluded, u2.included, false);\n          this.state.remapColor = false;\n          break;\n        }\n        case Action.isolate: {\n          this.clearSelection();\n          p = this.animator.filter(u2.search, u2.included, u2.excluded, false);\n          this.state.remapColor = false;\n          break;\n        }\n        case Action.reset: {\n          this.clear();\n          p = this.animator.reset();\n          break;\n        }\n        default: {\n          switch (action) {\n            case Action.previous: {\n              this.state.index--;\n              if (this.state.index < 0) {\n                this.state.index = this.state.userSelection.included.length - 1;\n              }\n              break;\n            }\n            case Action.next: {\n              this.state.index++;\n              if (this.state.index >= this.state.userSelection.included.length) {\n                this.state.index = 0;\n              }\n              break;\n            }\n          }\n          this.render();\n          p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n      }\n      p.then(() => this.render());\n    }\n    render() {\n      const hasRefinedData = this.dataScope.hasFilteredData();\n      const renderProps = {\n        language: this.language,\n        actionHandler: (action) => this.handleAction(action),\n        selectionHandler: (columnName, value2) => this.selectByNameValue(columnName, value2),\n        count: this.state.userSelection && this.state.userSelection.included.length,\n        hasRefinedData,\n        item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n        remapColorHandler: (remap) => this.remapChanged(remap),\n        hasColorMaps: this.hasColorMaps() && hasRefinedData,\n        remapColor: this.state.remapColor\n      };\n      const a2 = getActiveElementInfo();\n      mount(renderDetails(renderProps), this.element);\n      setActiveElement(a2);\n    }\n  }\n  const renderDetails = (props) => {\n    const controlButtons = [\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.deselect) }, props.language.deselect),\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.isolate) }, props.language.isolate),\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.exclude) }, props.language.exclude)\n    ];\n    const colorMapping2 = createElement(\n      \"div\",\n      null,\n      createElement(\"button\", { disabled: props.remapColor, onClick: (e) => props.remapColorHandler(true) }, props.language.newColorMap),\n      createElement(\"button\", { disabled: !props.remapColor, onClick: (e) => props.remapColorHandler(false) }, props.language.oldColorMap)\n    );\n    const singleItem = props.count === 1;\n    const scrollButtons = [\n      createElement(\"button\", { disabled: singleItem, onClick: (e) => props.actionHandler(Action.previous) }, props.language.previousDetail),\n      createElement(\"button\", { disabled: singleItem, onClick: (e) => props.actionHandler(Action.next) }, props.language.nextDetail),\n      createElement(\n        \"span\",\n        null,\n        \" \",\n        props.language.selectionCount(props.count)\n      )\n    ];\n    const rows = [];\n    for (const prop in props.item) {\n      if (prop === GL_ORDINAL) {\n        continue;\n      }\n      if (isInternalFieldName(prop)) {\n        continue;\n      }\n      rows.push({\n        cells: [\n          { content: prop },\n          { content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler) }\n        ]\n      });\n    }\n    return createElement(\n      \"div\",\n      null,\n      props.hasColorMaps && colorMapping2,\n      createElement(\"h4\", null, props.language.headers.selection),\n      createElement(\n        \"div\",\n        { className: `${cssPrefix}selection` },\n        controlButtons,\n        createElement(\"button\", { disabled: !props.hasRefinedData, onClick: (e) => props.actionHandler(Action.reset) }, \"reset\")\n      ),\n      props.item && createElement(\"h4\", null, props.language.headers.details),\n      createElement(\n        \"div\",\n        null,\n        createElement(\"div\", { className: `${cssPrefix}details-scroll` }, props.item && scrollButtons),\n        createElement(\"div\", { className: `${cssPrefix}details` }, props.item && createElement(Table$1, { rows }))\n      )\n    );\n  };\n  function linkSelect(language, columnName, value2, selectionHandler) {\n    return createElement(\n      \"span\",\n      null,\n      createElement(\"a\", { href: \"#\", onClick: (e) => selectionHandler(columnName, value2) }, value2),\n      isNaN(value2) ? [\" \", createElement(\"a\", { className: \"bing-search\", href: `https://www.bing.com/search?q=${encodeURIComponent(value2)}`, target: \"_blank\" }, language.bing)] : \"\"\n    );\n  }\n  function ensureHeaders(presenter, headers) {\n    const vegaControls = presenter.getElement(PresenterElement$1.vegaControls);\n    conditionalHeader(!!vegaControls.querySelectorAll(\".vega-bindings > *\").length, vegaControls, headers.chart);\n    const legend2 = presenter.getElement(PresenterElement$1.legend);\n    conditionalHeader(!!legend2.children.length, legend2, headers.legend);\n  }\n  function conditionalHeader(condition, element2, header) {\n    const existing = existingHeader(element2, header);\n    if (condition && !existing) {\n      addHeader(element2, header);\n    }\n    if (!condition && existing) {\n      existing.remove();\n    }\n  }\n  function addHeader(element2, header) {\n    const h2 = document.createElement(\"h4\");\n    h2.innerHTML = header;\n    element2.insertAdjacentElement(\"beforebegin\", h2);\n  }\n  function existingHeader(element2, header) {\n    const { previousElementSibling } = element2;\n    if (previousElementSibling && previousElementSibling.innerHTML === header) {\n      return previousElementSibling;\n    }\n  }\n  function legendRange(colorBinType, column, legend2, clickedIndex) {\n    if (column.quantitative) {\n      return selectQuantitative(colorBinType, column, legend2, clickedIndex);\n    } else {\n      return selectCategorical(column, legend2, clickedIndex);\n    }\n  }\n  function selectCategorical(column, legend2, clickedIndex) {\n    const value2 = legend2.rows[clickedIndex].value;\n    if (value2 === Other) {\n      const values2 = [];\n      for (const i in legend2.rows) {\n        if (+i !== clickedIndex) {\n          values2.push(legend2.rows[i].value);\n        }\n      }\n      return selectNone(column, values2);\n    } else {\n      return { expressions: [selectExact(column, legend2.rows[clickedIndex].value)] };\n    }\n  }\n  function selectQuantitative(colorBinType, column, legend2, clickedIndex) {\n    const keys2 = Object.keys(legend2.rows).map((key2) => +key2).sort((a2, b2) => +a2 - +b2);\n    let lowValue;\n    let lowOperator;\n    let highValue;\n    let highOperator;\n    const rowText = legend2.rows[clickedIndex].label;\n    switch (colorBinType) {\n      case \"continuous\": {\n        lowValue = rowText;\n        if (clickedIndex < keys2.length - 1) {\n          highValue = legend2.rows[clickedIndex + 1].value;\n        }\n        break;\n      }\n      default: {\n        if (rowText.indexOf(\"null\") > 0) {\n          const ex = {\n            expressions: [selectNullOrEmpty(column)]\n          };\n          return ex;\n        }\n        const dash = rowText.indexOf(\"–\");\n        if (dash > 0) {\n          lowValue = rowText.substr(0, dash);\n          highValue = rowText.substr(dash + 1);\n        } else {\n          if (rowText.indexOf(\"<\") >= 0) {\n            highValue = rowText.substring(2);\n          } else {\n            if (rowText.indexOf(\"≥\") >= 0) {\n              lowValue = rowText.substring(2);\n            }\n          }\n        }\n      }\n    }\n    if (lowValue)\n      lowValue = notNice(lowValue);\n    if (highValue)\n      highValue = notNice(highValue);\n    if (lowValue === highValue) {\n      return { expressions: [selectExact(column, lowValue)] };\n    } else {\n      return selectBetween(column, lowValue, highValue, lowOperator, highOperator);\n    }\n  }\n  function finalizeLegend(colorBinType, colorColumn, legend2, language) {\n    const rowTexts = [];\n    for (const i in legend2.rows) {\n      const row = legend2.rows[i];\n      row.search = legendRange(colorBinType, colorColumn, legend2, +i);\n      if (row.value === Other) {\n        row.label = language.legendOther;\n      } else {\n        rowTexts.push(row.value);\n      }\n    }\n  }\n  function assignOrdinals(columns, data2, ordinalMap) {\n    const uCol = columns.uid && columns.uid.name;\n    if (ordinalMap) {\n      data2.forEach((d2, i) => {\n        const key2 = uCol ? d2[uCol] : i;\n        d2[GL_ORDINAL] = ordinalMap[key2];\n      });\n    } else {\n      ordinalMap = {};\n      data2.forEach((d2, i) => {\n        d2[GL_ORDINAL] = i;\n        const uColValue = uCol ? d2[uCol] : i;\n        ordinalMap[uColValue] = i;\n      });\n    }\n    return ordinalMap;\n  }\n  function getDataIndexOfCube(cube, data2) {\n    const len2 = data2.length;\n    for (let i = 0; i < len2; i++) {\n      if (data2[i][GL_ORDINAL] === cube.ordinal) {\n        return i;\n      }\n    }\n  }\n  const { push } = util$4;\n  function getSearchGroupFromVegaValue(search) {\n    let group2;\n    const vegaSearch = search;\n    if (Array.isArray(vegaSearch)) {\n      group2 = { expressions: [] };\n      vegaSearch.forEach((g) => {\n        const clonedExpressions = clone(g.expressions).filter(Boolean);\n        clonedExpressions[0].clause = \"&&\";\n        push(group2.expressions, clonedExpressions);\n      });\n    } else {\n      group2 = vegaSearch ? { expressions: vegaSearch.expressions.filter(Boolean) } : null;\n    }\n    return group2;\n  }\n  function applySignalValues(sv, b2) {\n    if (!sv || !b2 || !b2.signals || !b2.signals.length)\n      return;\n    for (const key2 in sv) {\n      const value2 = sv[key2];\n      const signalB = b2.signals.filter((signal) => signal.name === key2)[0];\n      if (signalB && signalB.bind) {\n        signalB.value = value2;\n      }\n    }\n  }\n  function extractSignalValuesFromView(view, spec) {\n    if (!view || !spec || !spec.signals || !spec.signals.length)\n      return;\n    const result = {};\n    spec.signals.forEach((signalA) => {\n      if (signalA.bind) {\n        try {\n          result[signalA.name] = view.signal(signalA.name);\n        } catch (e) {\n        }\n      }\n    });\n    return result;\n  }\n  const hideSignalUI = [\n    SignalNames.MarkOpacity,\n    SignalNames.TextAngleX,\n    SignalNames.TextAngleY\n  ];\n  function unbindSignalUI(spec) {\n    spec.signals.forEach((signal) => {\n      if (hideSignalUI.indexOf(signal.name) >= 0) {\n        delete signal.bind;\n      }\n    });\n  }\n  const { outerSize } = util$4;\n  const { Table } = controls;\n  let Tooltip$1 = class Tooltip {\n    constructor(props) {\n      this.props = props;\n      const renderProps = {\n        cssPrefix: props.cssPrefix,\n        rows: getRows(props.dataItem)\n      };\n      this.finalizeHandler = () => this.destroy();\n      this.element = renderTooltip(renderProps);\n      if (this.element) {\n        this.element.style.position = \"absolute\";\n        this.child = this.element.firstChild;\n        document.body.appendChild(this.element);\n        let m2 = outerSize(this.child);\n        while (m2.height > document.documentElement.clientHeight) {\n          const tr2 = this.child.querySelector(\"tr:last-child\");\n          if (tr2) {\n            tr2.parentElement.removeChild(tr2);\n          } else {\n            break;\n          }\n          m2 = outerSize(this.child);\n        }\n        let position2;\n        const te = props.event;\n        if (te.touches) {\n          position2 = te[0];\n        } else {\n          const pme = props.event;\n          position2 = pme;\n        }\n        if (position2.clientX + m2.width >= document.documentElement.clientWidth) {\n          this.child.style.right = \"0\";\n        }\n        let moveTop = true;\n        if (position2.clientY + m2.height >= document.documentElement.clientHeight) {\n          if (position2.clientY - m2.height > 0) {\n            this.child.style.bottom = \"0\";\n          } else {\n            moveTop = false;\n          }\n        }\n        if (moveTop) {\n          this.element.style.top = `${position2.clientY}px`;\n        }\n        this.element.style.left = `${position2.clientX}px`;\n        this.child.addEventListener(\"mouseenter\", this.finalizeHandler);\n        this.child.addEventListener(\"mousemove\", this.finalizeHandler);\n        this.child.addEventListener(\"mouseover\", this.finalizeHandler);\n      }\n    }\n    destroy() {\n      this.child.removeEventListener(\"mouseenter\", this.finalizeHandler);\n      this.child.removeEventListener(\"mousemove\", this.finalizeHandler);\n      this.child.removeEventListener(\"mouseover\", this.finalizeHandler);\n      if (this.element) {\n        document.body.removeChild(this.element);\n      }\n      this.element = null;\n    }\n  };\n  function cleanDataItem(item) {\n    const ret = {};\n    for (const columnName in item) {\n      if (columnName === GL_ORDINAL) {\n        continue;\n      }\n      if (isInternalFieldName(columnName)) {\n        continue;\n      }\n      ret[columnName] = item[columnName];\n    }\n    return ret;\n  }\n  function getRows(item) {\n    const rows = [];\n    for (const columnName in item) {\n      const value2 = item[columnName];\n      let content2;\n      switch (value2) {\n        case null:\n          content2 = createElement(\"i\", null, \"null\");\n          break;\n        case void 0:\n          content2 = createElement(\"i\", null, \"undefined\");\n          break;\n        default:\n          content2 = value2.toString();\n      }\n      rows.push({\n        cells: [\n          { content: columnName + \":\" },\n          { content: content2 }\n        ]\n      });\n    }\n    return rows;\n  }\n  const renderTooltip = (props) => {\n    return props.rows.length === 0 ? null : createElement(\"div\", { className: `${props.cssPrefix}tooltip` }, Table({ rows: props.rows }));\n  };\n  class CharacterSet {\n    resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n      if (forceNewCharacterSet || needsNewCharacterSet(oldInsight, newInsight)) {\n        this.chars = void 0;\n      }\n    }\n    getCharacterSet(stage) {\n      if (!this.chars) {\n        const map2 = {};\n        const addText = (text2) => {\n          Array.from(text2).forEach((char) => {\n            map2[char] = true;\n          });\n        };\n        stage.textData.forEach((t) => addText(t.text));\n        const { x: x2, y: y2 } = stage.axes;\n        [x2, y2].forEach((axes) => {\n          axes.forEach((axis) => {\n            if (axis.tickText)\n              axis.tickText.forEach((t) => addText(t.text));\n            if (axis.title)\n              addText(axis.title.text);\n          });\n        });\n        this.chars = Object.keys(map2);\n      }\n      return this.chars;\n    }\n  }\n  function needsNewCharacterSet(oldInsight, newInsight) {\n    if (!oldInsight)\n      return true;\n    if (!newInsight)\n      return true;\n    if (oldInsight.chart !== newInsight.chart)\n      return true;\n    if (oldInsight.facetStyle !== newInsight.facetStyle)\n      return true;\n    if (oldInsight.totalStyle !== newInsight.totalStyle)\n      return true;\n    if (oldInsight.hideAxes !== newInsight.hideAxes)\n      return true;\n    if (differentObjectValues(oldInsight.signalValues, newInsight.signalValues))\n      return true;\n    if (differentObjectValues(oldInsight.size, newInsight.size))\n      return true;\n    const oldColumns = oldInsight.columns;\n    const newColumns = newInsight.columns;\n    if (oldColumns.facet !== newColumns.facet)\n      return true;\n    if (oldColumns.facetV !== newColumns.facetV)\n      return true;\n    if (oldColumns.x !== newColumns.x)\n      return true;\n    if (oldColumns.y !== newColumns.y)\n      return true;\n    if (oldColumns.z !== newColumns.z)\n      return true;\n    return false;\n  }\n  function differentObjectValues(a2, b2) {\n    if (!a2 && !b2)\n      return false;\n    if (!a2 || !b2)\n      return true;\n    const keys2 = Object.keys(b2);\n    for (let i = 0; i < keys2.length; i++) {\n      const key2 = keys2[i];\n      const ta = typeof a2;\n      const tb = typeof b2;\n      if (ta !== tb)\n        return true;\n      if (ta === \"object\") {\n        return differentObjectValues(a2[key2], b2[key2]);\n      } else {\n        if (a2[key2] !== b2[key2])\n          return true;\n      }\n    }\n    return false;\n  }\n  function ascending$2(a2, b2) {\n    return a2 == null || b2 == null ? NaN : a2 < b2 ? -1 : a2 > b2 ? 1 : a2 >= b2 ? 0 : NaN;\n  }\n  function descending$1(a2, b2) {\n    return a2 == null || b2 == null ? NaN : b2 < a2 ? -1 : b2 > a2 ? 1 : b2 >= a2 ? 0 : NaN;\n  }\n  function bisector(f) {\n    let compare12, compare2, delta;\n    if (f.length !== 2) {\n      compare12 = ascending$2;\n      compare2 = (d2, x2) => ascending$2(f(d2), x2);\n      delta = (d2, x2) => f(d2) - x2;\n    } else {\n      compare12 = f === ascending$2 || f === descending$1 ? f : zero$3;\n      compare2 = f;\n      delta = f;\n    }\n    function left(a2, x2, lo = 0, hi = a2.length) {\n      if (lo < hi) {\n        if (compare12(x2, x2) !== 0) return hi;\n        do {\n          const mid = lo + hi >>> 1;\n          if (compare2(a2[mid], x2) < 0) lo = mid + 1;\n          else hi = mid;\n        } while (lo < hi);\n      }\n      return lo;\n    }\n    function right(a2, x2, lo = 0, hi = a2.length) {\n      if (lo < hi) {\n        if (compare12(x2, x2) !== 0) return hi;\n        do {\n          const mid = lo + hi >>> 1;\n          if (compare2(a2[mid], x2) <= 0) lo = mid + 1;\n          else hi = mid;\n        } while (lo < hi);\n      }\n      return lo;\n    }\n    function center(a2, x2, lo = 0, hi = a2.length) {\n      const i = left(a2, x2, lo, hi - 1);\n      return i > lo && delta(a2[i - 1], x2) > -delta(a2[i], x2) ? i - 1 : i;\n    }\n    return { left, center, right };\n  }\n  function zero$3() {\n    return 0;\n  }\n  function number$6(x2) {\n    return x2 === null ? NaN : +x2;\n  }\n  function* numbers$2(values2, valueof) {\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    }\n  }\n  const ascendingBisect = bisector(ascending$2);\n  const bisectRight$1 = ascendingBisect.right;\n  const bisectLeft$1 = ascendingBisect.left;\n  bisector(number$6).center;\n  function variance(values2, valueof) {\n    let count2 = 0;\n    let delta;\n    let mean2 = 0;\n    let sum2 = 0;\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          delta = value2 - mean2;\n          mean2 += delta / ++count2;\n          sum2 += delta * (value2 - mean2);\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          delta = value2 - mean2;\n          mean2 += delta / ++count2;\n          sum2 += delta * (value2 - mean2);\n        }\n      }\n    }\n    if (count2 > 1) return sum2 / (count2 - 1);\n  }\n  function deviation(values2, valueof) {\n    const v = variance(values2, valueof);\n    return v ? Math.sqrt(v) : v;\n  }\n  class Adder {\n    constructor() {\n      this._partials = new Float64Array(32);\n      this._n = 0;\n    }\n    add(x2) {\n      const p = this._partials;\n      let i = 0;\n      for (let j = 0; j < this._n && j < 32; j++) {\n        const y2 = p[j], hi = x2 + y2, lo = Math.abs(x2) < Math.abs(y2) ? x2 - (hi - y2) : y2 - (hi - x2);\n        if (lo) p[i++] = lo;\n        x2 = hi;\n      }\n      p[i] = x2;\n      this._n = i + 1;\n      return this;\n    }\n    valueOf() {\n      const p = this._partials;\n      let n = this._n, x2, y2, lo, hi = 0;\n      if (n > 0) {\n        hi = p[--n];\n        while (n > 0) {\n          x2 = hi;\n          y2 = p[--n];\n          hi = x2 + y2;\n          lo = y2 - (hi - x2);\n          if (lo) break;\n        }\n        if (n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0)) {\n          y2 = lo * 2;\n          x2 = hi + y2;\n          if (y2 == x2 - hi) hi = x2;\n        }\n      }\n      return hi;\n    }\n  }\n  class InternMap extends Map {\n    constructor(entries, key2 = keyof) {\n      super();\n      Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key2 } });\n      if (entries != null) for (const [key3, value2] of entries) this.set(key3, value2);\n    }\n    get(key2) {\n      return super.get(intern_get(this, key2));\n    }\n    has(key2) {\n      return super.has(intern_get(this, key2));\n    }\n    set(key2, value2) {\n      return super.set(intern_set(this, key2), value2);\n    }\n    delete(key2) {\n      return super.delete(intern_delete(this, key2));\n    }\n  }\n  class InternSet extends Set {\n    constructor(values2, key2 = keyof) {\n      super();\n      Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key2 } });\n      if (values2 != null) for (const value2 of values2) this.add(value2);\n    }\n    has(value2) {\n      return super.has(intern_get(this, value2));\n    }\n    add(value2) {\n      return super.add(intern_set(this, value2));\n    }\n    delete(value2) {\n      return super.delete(intern_delete(this, value2));\n    }\n  }\n  function intern_get({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    return _intern.has(key2) ? _intern.get(key2) : value2;\n  }\n  function intern_set({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    if (_intern.has(key2)) return _intern.get(key2);\n    _intern.set(key2, value2);\n    return value2;\n  }\n  function intern_delete({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    if (_intern.has(key2)) {\n      value2 = _intern.get(key2);\n      _intern.delete(key2);\n    }\n    return value2;\n  }\n  function keyof(value2) {\n    return value2 !== null && typeof value2 === \"object\" ? value2.valueOf() : value2;\n  }\n  function permute(source2, keys2) {\n    return Array.from(keys2, (key2) => source2[key2]);\n  }\n  function compareDefined(compare2 = ascending$2) {\n    if (compare2 === ascending$2) return ascendingDefined;\n    if (typeof compare2 !== \"function\") throw new TypeError(\"compare is not a function\");\n    return (a2, b2) => {\n      const x2 = compare2(a2, b2);\n      if (x2 || x2 === 0) return x2;\n      return (compare2(b2, b2) === 0) - (compare2(a2, a2) === 0);\n    };\n  }\n  function ascendingDefined(a2, b2) {\n    return (a2 == null || !(a2 >= a2)) - (b2 == null || !(b2 >= b2)) || (a2 < b2 ? -1 : a2 > b2 ? 1 : 0);\n  }\n  const e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);\n  function tickSpec(start, stop2, count2) {\n    const step = (stop2 - start) / Math.max(0, count2), power = Math.floor(Math.log10(step)), error2 = step / Math.pow(10, power), factor = error2 >= e10 ? 10 : error2 >= e5 ? 5 : error2 >= e2 ? 2 : 1;\n    let i1, i2, inc;\n    if (power < 0) {\n      inc = Math.pow(10, -power) / factor;\n      i1 = Math.round(start * inc);\n      i2 = Math.round(stop2 * inc);\n      if (i1 / inc < start) ++i1;\n      if (i2 / inc > stop2) --i2;\n      inc = -inc;\n    } else {\n      inc = Math.pow(10, power) * factor;\n      i1 = Math.round(start / inc);\n      i2 = Math.round(stop2 / inc);\n      if (i1 * inc < start) ++i1;\n      if (i2 * inc > stop2) --i2;\n    }\n    if (i2 < i1 && 0.5 <= count2 && count2 < 2) return tickSpec(start, stop2, count2 * 2);\n    return [i1, i2, inc];\n  }\n  function ticks(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    if (!(count2 > 0)) return [];\n    if (start === stop2) return [start];\n    const reverse2 = stop2 < start, [i1, i2, inc] = reverse2 ? tickSpec(stop2, start, count2) : tickSpec(start, stop2, count2);\n    if (!(i2 >= i1)) return [];\n    const n = i2 - i1 + 1, ticks2 = new Array(n);\n    if (reverse2) {\n      if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) / -inc;\n      else for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) * inc;\n    } else {\n      if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) / -inc;\n      else for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) * inc;\n    }\n    return ticks2;\n  }\n  function tickIncrement(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    return tickSpec(start, stop2, count2)[2];\n  }\n  function tickStep(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    const reverse2 = stop2 < start, inc = reverse2 ? tickIncrement(stop2, start, count2) : tickIncrement(start, stop2, count2);\n    return (reverse2 ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n  }\n  function max$2(values2, valueof) {\n    let max2;\n    if (valueof === void 0) {\n      for (const value2 of values2) {\n        if (value2 != null && (max2 < value2 || max2 === void 0 && value2 >= value2)) {\n          max2 = value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (max2 < value2 || max2 === void 0 && value2 >= value2)) {\n          max2 = value2;\n        }\n      }\n    }\n    return max2;\n  }\n  function min$2(values2, valueof) {\n    let min2;\n    if (valueof === void 0) {\n      for (const value2 of values2) {\n        if (value2 != null && (min2 > value2 || min2 === void 0 && value2 >= value2)) {\n          min2 = value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (min2 > value2 || min2 === void 0 && value2 >= value2)) {\n          min2 = value2;\n        }\n      }\n    }\n    return min2;\n  }\n  function quickselect(array2, k, left = 0, right = Infinity, compare2) {\n    k = Math.floor(k);\n    left = Math.floor(Math.max(0, left));\n    right = Math.floor(Math.min(array2.length - 1, right));\n    if (!(left <= k && k <= right)) return array2;\n    compare2 = compare2 === void 0 ? ascendingDefined : compareDefined(compare2);\n    while (right > left) {\n      if (right - left > 600) {\n        const n = right - left + 1;\n        const m2 = k - left + 1;\n        const z2 = Math.log(n);\n        const s2 = 0.5 * Math.exp(2 * z2 / 3);\n        const sd = 0.5 * Math.sqrt(z2 * s2 * (n - s2) / n) * (m2 - n / 2 < 0 ? -1 : 1);\n        const newLeft = Math.max(left, Math.floor(k - m2 * s2 / n + sd));\n        const newRight = Math.min(right, Math.floor(k + (n - m2) * s2 / n + sd));\n        quickselect(array2, k, newLeft, newRight, compare2);\n      }\n      const t = array2[k];\n      let i = left;\n      let j = right;\n      swap$1(array2, left, k);\n      if (compare2(array2[right], t) > 0) swap$1(array2, left, right);\n      while (i < j) {\n        swap$1(array2, i, j), ++i, --j;\n        while (compare2(array2[i], t) < 0) ++i;\n        while (compare2(array2[j], t) > 0) --j;\n      }\n      if (compare2(array2[left], t) === 0) swap$1(array2, left, j);\n      else ++j, swap$1(array2, j, right);\n      if (j <= k) left = j + 1;\n      if (k <= j) right = j - 1;\n    }\n    return array2;\n  }\n  function swap$1(array2, i, j) {\n    const t = array2[i];\n    array2[i] = array2[j];\n    array2[j] = t;\n  }\n  function quantile$1(values2, p, valueof) {\n    values2 = Float64Array.from(numbers$2(values2, valueof));\n    if (!(n = values2.length) || isNaN(p = +p)) return;\n    if (p <= 0 || n < 2) return min$2(values2);\n    if (p >= 1) return max$2(values2);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = max$2(quickselect(values2, i0).subarray(0, i0 + 1)), value1 = min$2(values2.subarray(i0 + 1));\n    return value0 + (value1 - value0) * (i - i0);\n  }\n  function quantileSorted(values2, p, valueof = number$6) {\n    if (!(n = values2.length) || isNaN(p = +p)) return;\n    if (p <= 0 || n < 2) return +valueof(values2[0], 0, values2);\n    if (p >= 1) return +valueof(values2[n - 1], n - 1, values2);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values2[i0], i0, values2), value1 = +valueof(values2[i0 + 1], i0 + 1, values2);\n    return value0 + (value1 - value0) * (i - i0);\n  }\n  function mean(values2, valueof) {\n    let count2 = 0;\n    let sum2 = 0;\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          ++count2, sum2 += value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          ++count2, sum2 += value2;\n        }\n      }\n    }\n    if (count2) return sum2 / count2;\n  }\n  function median(values2, valueof) {\n    return quantile$1(values2, 0.5, valueof);\n  }\n  function* flatten(arrays) {\n    for (const array2 of arrays) {\n      yield* array2;\n    }\n  }\n  function merge$4(arrays) {\n    return Array.from(flatten(arrays));\n  }\n  function range$3(start, stop2, step) {\n    start = +start, stop2 = +stop2, step = (n = arguments.length) < 2 ? (stop2 = start, start = 0, 1) : n < 3 ? 1 : +step;\n    var i = -1, n = Math.max(0, Math.ceil((stop2 - start) / step)) | 0, range2 = new Array(n);\n    while (++i < n) {\n      range2[i] = start + i * step;\n    }\n    return range2;\n  }\n  function sum$1(values2, valueof) {\n    let sum2 = 0;\n    {\n      for (let value2 of values2) {\n        if (value2 = +value2) {\n          sum2 += value2;\n        }\n      }\n    }\n    return sum2;\n  }\n  function intersection(values2, ...others) {\n    values2 = new InternSet(values2);\n    others = others.map(set$4);\n    out: for (const value2 of values2) {\n      for (const other of others) {\n        if (!other.has(value2)) {\n          values2.delete(value2);\n          continue out;\n        }\n      }\n    }\n    return values2;\n  }\n  function set$4(values2) {\n    return values2 instanceof InternSet ? values2 : new InternSet(values2);\n  }\n  function union(...others) {\n    const set2 = new InternSet();\n    for (const other of others) {\n      for (const o of other) {\n        set2.add(o);\n      }\n    }\n    return set2;\n  }\n  function initRange(domain2, range2) {\n    switch (arguments.length) {\n      case 0:\n        break;\n      case 1:\n        this.range(domain2);\n        break;\n      default:\n        this.range(range2).domain(domain2);\n        break;\n    }\n    return this;\n  }\n  function initInterpolator(domain2, interpolator) {\n    switch (arguments.length) {\n      case 0:\n        break;\n      case 1: {\n        if (typeof domain2 === \"function\") this.interpolator(domain2);\n        else this.range(domain2);\n        break;\n      }\n      default: {\n        this.domain(domain2);\n        if (typeof interpolator === \"function\") this.interpolator(interpolator);\n        else this.range(interpolator);\n        break;\n      }\n    }\n    return this;\n  }\n  const implicit = Symbol(\"implicit\");\n  function ordinal() {\n    var index2 = new InternMap(), domain2 = [], range2 = [], unknown = implicit;\n    function scale2(d2) {\n      let i = index2.get(d2);\n      if (i === void 0) {\n        if (unknown !== implicit) return unknown;\n        index2.set(d2, i = domain2.push(d2) - 1);\n      }\n      return range2[i % range2.length];\n    }\n    scale2.domain = function(_) {\n      if (!arguments.length) return domain2.slice();\n      domain2 = [], index2 = new InternMap();\n      for (const value2 of _) {\n        if (index2.has(value2)) continue;\n        index2.set(value2, domain2.push(value2) - 1);\n      }\n      return scale2;\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), scale2) : range2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return ordinal(domain2, range2).unknown(unknown);\n    };\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function basis(t12, v0, v1, v2, v3) {\n    var t22 = t12 * t12, t32 = t22 * t12;\n    return ((1 - 3 * t12 + 3 * t22 - t32) * v0 + (4 - 6 * t22 + 3 * t32) * v1 + (1 + 3 * t12 + 3 * t22 - 3 * t32) * v2 + t32 * v3) / 6;\n  }\n  function basis$1(values2) {\n    var n = values2.length - 1;\n    return function(t) {\n      var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values2[i], v2 = values2[i + 1], v0 = i > 0 ? values2[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values2[i + 2] : 2 * v2 - v1;\n      return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n  }\n  function basisClosed(values2) {\n    var n = values2.length;\n    return function(t) {\n      var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values2[(i + n - 1) % n], v1 = values2[i % n], v2 = values2[(i + 1) % n], v3 = values2[(i + 2) % n];\n      return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n  }\n  const constant$5 = (x2) => () => x2;\n  function linear$2(a2, d2) {\n    return function(t) {\n      return a2 + t * d2;\n    };\n  }\n  function exponential(a2, b2, y2) {\n    return a2 = Math.pow(a2, y2), b2 = Math.pow(b2, y2) - a2, y2 = 1 / y2, function(t) {\n      return Math.pow(a2 + t * b2, y2);\n    };\n  }\n  function hue$1(a2, b2) {\n    var d2 = b2 - a2;\n    return d2 ? linear$2(a2, d2 > 180 || d2 < -180 ? d2 - 360 * Math.round(d2 / 360) : d2) : constant$5(isNaN(a2) ? b2 : a2);\n  }\n  function gamma(y2) {\n    return (y2 = +y2) === 1 ? nogamma : function(a2, b2) {\n      return b2 - a2 ? exponential(a2, b2, y2) : constant$5(isNaN(a2) ? b2 : a2);\n    };\n  }\n  function nogamma(a2, b2) {\n    var d2 = b2 - a2;\n    return d2 ? linear$2(a2, d2) : constant$5(isNaN(a2) ? b2 : a2);\n  }\n  const rgb = (function rgbGamma(y2) {\n    var color2 = gamma(y2);\n    function rgb2(start, end) {\n      var r = color2((start = rgb$1(start)).r, (end = rgb$1(end)).r), g = color2(start.g, end.g), b2 = color2(start.b, end.b), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.r = r(t);\n        start.g = g(t);\n        start.b = b2(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    }\n    rgb2.gamma = rgbGamma;\n    return rgb2;\n  })(1);\n  function rgbSpline(spline) {\n    return function(colors2) {\n      var n = colors2.length, r = new Array(n), g = new Array(n), b2 = new Array(n), i, color2;\n      for (i = 0; i < n; ++i) {\n        color2 = rgb$1(colors2[i]);\n        r[i] = color2.r || 0;\n        g[i] = color2.g || 0;\n        b2[i] = color2.b || 0;\n      }\n      r = spline(r);\n      g = spline(g);\n      b2 = spline(b2);\n      color2.opacity = 1;\n      return function(t) {\n        color2.r = r(t);\n        color2.g = g(t);\n        color2.b = b2(t);\n        return color2 + \"\";\n      };\n    };\n  }\n  var rgbBasis = rgbSpline(basis$1);\n  var rgbBasisClosed = rgbSpline(basisClosed);\n  function numberArray(a2, b2) {\n    if (!b2) b2 = [];\n    var n = a2 ? Math.min(b2.length, a2.length) : 0, c2 = b2.slice(), i;\n    return function(t) {\n      for (i = 0; i < n; ++i) c2[i] = a2[i] * (1 - t) + b2[i] * t;\n      return c2;\n    };\n  }\n  function isNumberArray(x2) {\n    return ArrayBuffer.isView(x2) && !(x2 instanceof DataView);\n  }\n  function array$5(a2, b2) {\n    return (isNumberArray(b2) ? numberArray : genericArray)(a2, b2);\n  }\n  function genericArray(a2, b2) {\n    var nb = b2 ? b2.length : 0, na = a2 ? Math.min(nb, a2.length) : 0, x2 = new Array(na), c2 = new Array(nb), i;\n    for (i = 0; i < na; ++i) x2[i] = interpolate$1(a2[i], b2[i]);\n    for (; i < nb; ++i) c2[i] = b2[i];\n    return function(t) {\n      for (i = 0; i < na; ++i) c2[i] = x2[i](t);\n      return c2;\n    };\n  }\n  function date$1(a2, b2) {\n    var d2 = /* @__PURE__ */ new Date();\n    return a2 = +a2, b2 = +b2, function(t) {\n      return d2.setTime(a2 * (1 - t) + b2 * t), d2;\n    };\n  }\n  function interpolateNumber(a2, b2) {\n    return a2 = +a2, b2 = +b2, function(t) {\n      return a2 * (1 - t) + b2 * t;\n    };\n  }\n  function object$1(a2, b2) {\n    var i = {}, c2 = {}, k;\n    if (a2 === null || typeof a2 !== \"object\") a2 = {};\n    if (b2 === null || typeof b2 !== \"object\") b2 = {};\n    for (k in b2) {\n      if (k in a2) {\n        i[k] = interpolate$1(a2[k], b2[k]);\n      } else {\n        c2[k] = b2[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c2[k] = i[k](t);\n      return c2;\n    };\n  }\n  var reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, reB = new RegExp(reA.source, \"g\");\n  function zero$2(b2) {\n    return function() {\n      return b2;\n    };\n  }\n  function one$2(b2) {\n    return function(t) {\n      return b2(t) + \"\";\n    };\n  }\n  function string(a2, b2) {\n    var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s2 = [], q = [];\n    a2 = a2 + \"\", b2 = b2 + \"\";\n    while ((am = reA.exec(a2)) && (bm = reB.exec(b2))) {\n      if ((bs = bm.index) > bi) {\n        bs = b2.slice(bi, bs);\n        if (s2[i]) s2[i] += bs;\n        else s2[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s2[i]) s2[i] += bm;\n        else s2[++i] = bm;\n      } else {\n        s2[++i] = null;\n        q.push({ i, x: interpolateNumber(am, bm) });\n      }\n      bi = reB.lastIndex;\n    }\n    if (bi < b2.length) {\n      bs = b2.slice(bi);\n      if (s2[i]) s2[i] += bs;\n      else s2[++i] = bs;\n    }\n    return s2.length < 2 ? q[0] ? one$2(q[0].x) : zero$2(b2) : (b2 = q.length, function(t) {\n      for (var i2 = 0, o; i2 < b2; ++i2) s2[(o = q[i2]).i] = o.x(t);\n      return s2.join(\"\");\n    });\n  }\n  function interpolate$1(a2, b2) {\n    var t = typeof b2, c2;\n    return b2 == null || t === \"boolean\" ? constant$5(b2) : (t === \"number\" ? interpolateNumber : t === \"string\" ? (c2 = color$2(b2)) ? (b2 = c2, rgb) : string : b2 instanceof color$2 ? rgb : b2 instanceof Date ? date$1 : isNumberArray(b2) ? numberArray : Array.isArray(b2) ? genericArray : typeof b2.valueOf !== \"function\" && typeof b2.toString !== \"function\" || isNaN(b2) ? object$1 : interpolateNumber)(a2, b2);\n  }\n  function discrete$1(range2) {\n    var n = range2.length;\n    return function(t) {\n      return range2[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n    };\n  }\n  function hue(a2, b2) {\n    var i = hue$1(+a2, +b2);\n    return function(t) {\n      var x2 = i(t);\n      return x2 - 360 * Math.floor(x2 / 360);\n    };\n  }\n  function interpolateRound(a2, b2) {\n    return a2 = +a2, b2 = +b2, function(t) {\n      return Math.round(a2 * (1 - t) + b2 * t);\n    };\n  }\n  var degrees$1 = 180 / Math.PI;\n  var identity$7 = {\n    translateX: 0,\n    translateY: 0,\n    rotate: 0,\n    skewX: 0,\n    scaleX: 1,\n    scaleY: 1\n  };\n  function decompose(a2, b2, c2, d2, e, f) {\n    var scaleX, scaleY2, skewX;\n    if (scaleX = Math.sqrt(a2 * a2 + b2 * b2)) a2 /= scaleX, b2 /= scaleX;\n    if (skewX = a2 * c2 + b2 * d2) c2 -= a2 * skewX, d2 -= b2 * skewX;\n    if (scaleY2 = Math.sqrt(c2 * c2 + d2 * d2)) c2 /= scaleY2, d2 /= scaleY2, skewX /= scaleY2;\n    if (a2 * d2 < b2 * c2) a2 = -a2, b2 = -b2, skewX = -skewX, scaleX = -scaleX;\n    return {\n      translateX: e,\n      translateY: f,\n      rotate: Math.atan2(b2, a2) * degrees$1,\n      skewX: Math.atan(skewX) * degrees$1,\n      scaleX,\n      scaleY: scaleY2\n    };\n  }\n  var svgNode;\n  function parseCss(value2) {\n    const m2 = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value2 + \"\");\n    return m2.isIdentity ? identity$7 : decompose(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f);\n  }\n  function parseSvg(value2) {\n    if (value2 == null) return identity$7;\n    if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n    svgNode.setAttribute(\"transform\", value2);\n    if (!(value2 = svgNode.transform.baseVal.consolidate())) return identity$7;\n    value2 = value2.matrix;\n    return decompose(value2.a, value2.b, value2.c, value2.d, value2.e, value2.f);\n  }\n  function interpolateTransform(parse2, pxComma, pxParen, degParen) {\n    function pop(s2) {\n      return s2.length ? s2.pop() + \" \" : \"\";\n    }\n    function translate2(xa, ya, xb, yb, s2, q) {\n      if (xa !== xb || ya !== yb) {\n        var i = s2.push(\"translate(\", null, pxComma, null, pxParen);\n        q.push({ i: i - 4, x: interpolateNumber(xa, xb) }, { i: i - 2, x: interpolateNumber(ya, yb) });\n      } else if (xb || yb) {\n        s2.push(\"translate(\" + xb + pxComma + yb + pxParen);\n      }\n    }\n    function rotate2(a2, b2, s2, q) {\n      if (a2 !== b2) {\n        if (a2 - b2 > 180) b2 += 360;\n        else if (b2 - a2 > 180) a2 += 360;\n        q.push({ i: s2.push(pop(s2) + \"rotate(\", null, degParen) - 2, x: interpolateNumber(a2, b2) });\n      } else if (b2) {\n        s2.push(pop(s2) + \"rotate(\" + b2 + degParen);\n      }\n    }\n    function skewX(a2, b2, s2, q) {\n      if (a2 !== b2) {\n        q.push({ i: s2.push(pop(s2) + \"skewX(\", null, degParen) - 2, x: interpolateNumber(a2, b2) });\n      } else if (b2) {\n        s2.push(pop(s2) + \"skewX(\" + b2 + degParen);\n      }\n    }\n    function scale2(xa, ya, xb, yb, s2, q) {\n      if (xa !== xb || ya !== yb) {\n        var i = s2.push(pop(s2) + \"scale(\", null, \",\", null, \")\");\n        q.push({ i: i - 4, x: interpolateNumber(xa, xb) }, { i: i - 2, x: interpolateNumber(ya, yb) });\n      } else if (xb !== 1 || yb !== 1) {\n        s2.push(pop(s2) + \"scale(\" + xb + \",\" + yb + \")\");\n      }\n    }\n    return function(a2, b2) {\n      var s2 = [], q = [];\n      a2 = parse2(a2), b2 = parse2(b2);\n      translate2(a2.translateX, a2.translateY, b2.translateX, b2.translateY, s2, q);\n      rotate2(a2.rotate, b2.rotate, s2, q);\n      skewX(a2.skewX, b2.skewX, s2, q);\n      scale2(a2.scaleX, a2.scaleY, b2.scaleX, b2.scaleY, s2, q);\n      a2 = b2 = null;\n      return function(t) {\n        var i = -1, n = q.length, o;\n        while (++i < n) s2[(o = q[i]).i] = o.x(t);\n        return s2.join(\"\");\n      };\n    };\n  }\n  var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\n  var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n  var epsilon2$1 = 1e-12;\n  function cosh(x2) {\n    return ((x2 = Math.exp(x2)) + 1 / x2) / 2;\n  }\n  function sinh(x2) {\n    return ((x2 = Math.exp(x2)) - 1 / x2) / 2;\n  }\n  function tanh(x2) {\n    return ((x2 = Math.exp(2 * x2)) - 1) / (x2 + 1);\n  }\n  const zoom$1 = (function zoomRho(rho, rho2, rho4) {\n    function zoom2(p02, p1) {\n      var ux0 = p02[0], uy0 = p02[1], w0 = p02[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n      if (d2 < epsilon2$1) {\n        S = Math.log(w1 / w0) / rho;\n        i = function(t) {\n          return [\n            ux0 + t * dx,\n            uy0 + t * dy,\n            w0 * Math.exp(rho * t * S)\n          ];\n        };\n      } else {\n        var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n        S = (r1 - r0) / rho;\n        i = function(t) {\n          var s2 = t * S, coshr0 = cosh(r0), u2 = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s2 + r0) - sinh(r0));\n          return [\n            ux0 + u2 * dx,\n            uy0 + u2 * dy,\n            w0 * coshr0 / cosh(rho * s2 + r0)\n          ];\n        };\n      }\n      i.duration = S * 1e3 * rho / Math.SQRT2;\n      return i;\n    }\n    zoom2.rho = function(_) {\n      var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n      return zoomRho(_1, _2, _4);\n    };\n    return zoom2;\n  })(Math.SQRT2, 2, 4);\n  function hsl(hue2) {\n    return function(start, end) {\n      var h2 = hue2((start = hsl$1(start)).h, (end = hsl$1(end)).h), s2 = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h2(t);\n        start.s = s2(t);\n        start.l = l(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    };\n  }\n  const hsl_default = hsl(hue$1);\n  var hslLong = hsl(nogamma);\n  function lab(start, end) {\n    var l = nogamma((start = lab$1(start)).l, (end = lab$1(end)).l), a2 = nogamma(start.a, end.a), b2 = nogamma(start.b, end.b), opacity2 = nogamma(start.opacity, end.opacity);\n    return function(t) {\n      start.l = l(t);\n      start.a = a2(t);\n      start.b = b2(t);\n      start.opacity = opacity2(t);\n      return start + \"\";\n    };\n  }\n  function hcl(hue2) {\n    return function(start, end) {\n      var h2 = hue2((start = hcl$1(start)).h, (end = hcl$1(end)).h), c2 = nogamma(start.c, end.c), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h2(t);\n        start.c = c2(t);\n        start.l = l(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    };\n  }\n  const hcl_default = hcl(hue$1);\n  var hclLong = hcl(nogamma);\n  function cubehelix(hue2) {\n    return (function cubehelixGamma(y2) {\n      y2 = +y2;\n      function cubehelix2(start, end) {\n        var h2 = hue2((start = cubehelix$1(start)).h, (end = cubehelix$1(end)).h), s2 = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n        return function(t) {\n          start.h = h2(t);\n          start.s = s2(t);\n          start.l = l(Math.pow(t, y2));\n          start.opacity = opacity2(t);\n          return start + \"\";\n        };\n      }\n      cubehelix2.gamma = cubehelixGamma;\n      return cubehelix2;\n    })(1);\n  }\n  const cubehelix_default = cubehelix(hue$1);\n  var cubehelixLong = cubehelix(nogamma);\n  function piecewise(interpolate2, values2) {\n    if (values2 === void 0) values2 = interpolate2, interpolate2 = interpolate$1;\n    var i = 0, n = values2.length - 1, v = values2[0], I = new Array(n < 0 ? 0 : n);\n    while (i < n) I[i] = interpolate2(v, v = values2[++i]);\n    return function(t) {\n      var i2 = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n      return I[i2](t - i2);\n    };\n  }\n  function quantize$2(interpolator, n) {\n    var samples = new Array(n);\n    for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n    return samples;\n  }\n  const $$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    interpolate: interpolate$1,\n    interpolateArray: array$5,\n    interpolateBasis: basis$1,\n    interpolateBasisClosed: basisClosed,\n    interpolateCubehelix: cubehelix_default,\n    interpolateCubehelixLong: cubehelixLong,\n    interpolateDate: date$1,\n    interpolateDiscrete: discrete$1,\n    interpolateHcl: hcl_default,\n    interpolateHclLong: hclLong,\n    interpolateHsl: hsl_default,\n    interpolateHslLong: hslLong,\n    interpolateHue: hue,\n    interpolateLab: lab,\n    interpolateNumber,\n    interpolateNumberArray: numberArray,\n    interpolateObject: object$1,\n    interpolateRgb: rgb,\n    interpolateRgbBasis: rgbBasis,\n    interpolateRgbBasisClosed: rgbBasisClosed,\n    interpolateRound,\n    interpolateString: string,\n    interpolateTransformCss,\n    interpolateTransformSvg,\n    interpolateZoom: zoom$1,\n    piecewise,\n    quantize: quantize$2\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function constants(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  function number$5(x2) {\n    return +x2;\n  }\n  var unit = [0, 1];\n  function identity$6(x2) {\n    return x2;\n  }\n  function normalize$2(a2, b2) {\n    return (b2 -= a2 = +a2) ? function(x2) {\n      return (x2 - a2) / b2;\n    } : constants(isNaN(b2) ? NaN : 0.5);\n  }\n  function clamper(a2, b2) {\n    var t;\n    if (a2 > b2) t = a2, a2 = b2, b2 = t;\n    return function(x2) {\n      return Math.max(a2, Math.min(b2, x2));\n    };\n  }\n  function bimap(domain2, range2, interpolate2) {\n    var d0 = domain2[0], d1 = domain2[1], r0 = range2[0], r1 = range2[1];\n    if (d1 < d0) d0 = normalize$2(d1, d0), r0 = interpolate2(r1, r0);\n    else d0 = normalize$2(d0, d1), r0 = interpolate2(r0, r1);\n    return function(x2) {\n      return r0(d0(x2));\n    };\n  }\n  function polymap(domain2, range2, interpolate2) {\n    var j = Math.min(domain2.length, range2.length) - 1, d2 = new Array(j), r = new Array(j), i = -1;\n    if (domain2[j] < domain2[0]) {\n      domain2 = domain2.slice().reverse();\n      range2 = range2.slice().reverse();\n    }\n    while (++i < j) {\n      d2[i] = normalize$2(domain2[i], domain2[i + 1]);\n      r[i] = interpolate2(range2[i], range2[i + 1]);\n    }\n    return function(x2) {\n      var i2 = bisectRight$1(domain2, x2, 1, j) - 1;\n      return r[i2](d2[i2](x2));\n    };\n  }\n  function copy$2(source2, target2) {\n    return target2.domain(source2.domain()).range(source2.range()).interpolate(source2.interpolate()).clamp(source2.clamp()).unknown(source2.unknown());\n  }\n  function transformer$3() {\n    var domain2 = unit, range2 = unit, interpolate2 = interpolate$1, transform2, untransform, unknown, clamp2 = identity$6, piecewise2, output2, input;\n    function rescale() {\n      var n = Math.min(domain2.length, range2.length);\n      if (clamp2 !== identity$6) clamp2 = clamper(domain2[0], domain2[n - 1]);\n      piecewise2 = n > 2 ? polymap : bimap;\n      output2 = input = null;\n      return scale2;\n    }\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : (output2 || (output2 = piecewise2(domain2.map(transform2), range2, interpolate2)))(transform2(clamp2(x2)));\n    }\n    scale2.invert = function(y2) {\n      return clamp2(untransform((input || (input = piecewise2(range2, domain2.map(transform2), interpolateNumber)))(y2)));\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2 = Array.from(_, number$5), rescale()) : domain2.slice();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();\n    };\n    scale2.rangeRound = function(_) {\n      return range2 = Array.from(_), interpolate2 = interpolateRound, rescale();\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = _ ? true : identity$6, rescale()) : clamp2 !== identity$6;\n    };\n    scale2.interpolate = function(_) {\n      return arguments.length ? (interpolate2 = _, rescale()) : interpolate2;\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t, u2) {\n      transform2 = t, untransform = u2;\n      return rescale();\n    };\n  }\n  function continuous$1() {\n    return transformer$3()(identity$6, identity$6);\n  }\n  function formatDecimal$1(x2) {\n    return Math.abs(x2 = Math.round(x2)) >= 1e21 ? x2.toLocaleString(\"en\").replace(/,/g, \"\") : x2.toString(10);\n  }\n  function formatDecimalParts$1(x2, p) {\n    if ((i = (x2 = p ? x2.toExponential(p - 1) : x2.toExponential()).indexOf(\"e\")) < 0) return null;\n    var i, coefficient = x2.slice(0, i);\n    return [\n      coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n      +x2.slice(i + 1)\n    ];\n  }\n  function exponent$1(x2) {\n    return x2 = formatDecimalParts$1(Math.abs(x2)), x2 ? x2[1] : NaN;\n  }\n  function formatGroup$1(grouping, thousands) {\n    return function(value2, width2) {\n      var i = value2.length, t = [], j = 0, g = grouping[0], length2 = 0;\n      while (i > 0 && g > 0) {\n        if (length2 + g + 1 > width2) g = Math.max(1, width2 - length2);\n        t.push(value2.substring(i -= g, i + g));\n        if ((length2 += g + 1) > width2) break;\n        g = grouping[j = (j + 1) % grouping.length];\n      }\n      return t.reverse().join(thousands);\n    };\n  }\n  function formatNumerals$1(numerals) {\n    return function(value2) {\n      return value2.replace(/[0-9]/g, function(i) {\n        return numerals[+i];\n      });\n    };\n  }\n  var re$1 = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n  function formatSpecifier$1(specifier) {\n    if (!(match2 = re$1.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match2;\n    return new FormatSpecifier$1({\n      fill: match2[1],\n      align: match2[2],\n      sign: match2[3],\n      symbol: match2[4],\n      zero: match2[5],\n      width: match2[6],\n      comma: match2[7],\n      precision: match2[8] && match2[8].slice(1),\n      trim: match2[9],\n      type: match2[10]\n    });\n  }\n  formatSpecifier$1.prototype = FormatSpecifier$1.prototype;\n  function FormatSpecifier$1(specifier) {\n    this.fill = specifier.fill === void 0 ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === void 0 ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === void 0 ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === void 0 ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === void 0 ? void 0 : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === void 0 ? \"\" : specifier.type + \"\";\n  }\n  FormatSpecifier$1.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === void 0 ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === void 0 ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n  };\n  function formatTrim$1(s2) {\n    out: for (var n = s2.length, i = 1, i0 = -1, i1; i < n; ++i) {\n      switch (s2[i]) {\n        case \".\":\n          i0 = i1 = i;\n          break;\n        case \"0\":\n          if (i0 === 0) i0 = i;\n          i1 = i;\n          break;\n        default:\n          if (!+s2[i]) break out;\n          if (i0 > 0) i0 = 0;\n          break;\n      }\n    }\n    return i0 > 0 ? s2.slice(0, i0) + s2.slice(i1 + 1) : s2;\n  }\n  var prefixExponent$1;\n  function formatPrefixAuto$1(x2, p) {\n    var d2 = formatDecimalParts$1(x2, p);\n    if (!d2) return x2 + \"\";\n    var coefficient = d2[0], exponent2 = d2[1], i = exponent2 - (prefixExponent$1 = Math.max(-8, Math.min(8, Math.floor(exponent2 / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts$1(x2, Math.max(0, p + i - 1))[0];\n  }\n  function formatRounded$1(x2, p) {\n    var d2 = formatDecimalParts$1(x2, p);\n    if (!d2) return x2 + \"\";\n    var coefficient = d2[0], exponent2 = d2[1];\n    return exponent2 < 0 ? \"0.\" + new Array(-exponent2).join(\"0\") + coefficient : coefficient.length > exponent2 + 1 ? coefficient.slice(0, exponent2 + 1) + \".\" + coefficient.slice(exponent2 + 1) : coefficient + new Array(exponent2 - coefficient.length + 2).join(\"0\");\n  }\n  const formatTypes$1 = {\n    \"%\": (x2, p) => (x2 * 100).toFixed(p),\n    \"b\": (x2) => Math.round(x2).toString(2),\n    \"c\": (x2) => x2 + \"\",\n    \"d\": formatDecimal$1,\n    \"e\": (x2, p) => x2.toExponential(p),\n    \"f\": (x2, p) => x2.toFixed(p),\n    \"g\": (x2, p) => x2.toPrecision(p),\n    \"o\": (x2) => Math.round(x2).toString(8),\n    \"p\": (x2, p) => formatRounded$1(x2 * 100, p),\n    \"r\": formatRounded$1,\n    \"s\": formatPrefixAuto$1,\n    \"X\": (x2) => Math.round(x2).toString(16).toUpperCase(),\n    \"x\": (x2) => Math.round(x2).toString(16)\n  };\n  function identity$5(x2) {\n    return x2;\n  }\n  var map$3 = Array.prototype.map, prefixes$1 = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n  function formatLocale$2(locale2) {\n    var group2 = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity$5 : formatGroup$1(map$3.call(locale2.grouping, Number), locale2.thousands + \"\"), currencyPrefix = locale2.currency === void 0 ? \"\" : locale2.currency[0] + \"\", currencySuffix = locale2.currency === void 0 ? \"\" : locale2.currency[1] + \"\", decimal = locale2.decimal === void 0 ? \".\" : locale2.decimal + \"\", numerals = locale2.numerals === void 0 ? identity$5 : formatNumerals$1(map$3.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? \"%\" : locale2.percent + \"\", minus = locale2.minus === void 0 ? \"−\" : locale2.minus + \"\", nan = locale2.nan === void 0 ? \"NaN\" : locale2.nan + \"\";\n    function newFormat(specifier) {\n      specifier = formatSpecifier$1(specifier);\n      var fill2 = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol2 = specifier.symbol, zero2 = specifier.zero, width2 = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type;\n      if (type2 === \"n\") comma = true, type2 = \"g\";\n      else if (!formatTypes$1[type2]) precision === void 0 && (precision = 12), trim = true, type2 = \"g\";\n      if (zero2 || fill2 === \"0\" && align === \"=\") zero2 = true, fill2 = \"0\", align = \"=\";\n      var prefix = symbol2 === \"$\" ? currencyPrefix : symbol2 === \"#\" && /[boxX]/.test(type2) ? \"0\" + type2.toLowerCase() : \"\", suffix = symbol2 === \"$\" ? currencySuffix : /[%p]/.test(type2) ? percent : \"\";\n      var formatType = formatTypes$1[type2], maybeSuffix = /[defgprs%]/.test(type2);\n      precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n      function format2(value2) {\n        var valuePrefix = prefix, valueSuffix = suffix, i, n, c2;\n        if (type2 === \"c\") {\n          valueSuffix = formatType(value2) + valueSuffix;\n          value2 = \"\";\n        } else {\n          value2 = +value2;\n          var valueNegative = value2 < 0 || 1 / value2 < 0;\n          value2 = isNaN(value2) ? nan : formatType(Math.abs(value2), precision);\n          if (trim) value2 = formatTrim$1(value2);\n          if (valueNegative && +value2 === 0 && sign2 !== \"+\") valueNegative = false;\n          valuePrefix = (valueNegative ? sign2 === \"(\" ? sign2 : minus : sign2 === \"-\" || sign2 === \"(\" ? \"\" : sign2) + valuePrefix;\n          valueSuffix = (type2 === \"s\" ? prefixes$1[8 + prefixExponent$1 / 3] : \"\") + valueSuffix + (valueNegative && sign2 === \"(\" ? \")\" : \"\");\n          if (maybeSuffix) {\n            i = -1, n = value2.length;\n            while (++i < n) {\n              if (c2 = value2.charCodeAt(i), 48 > c2 || c2 > 57) {\n                valueSuffix = (c2 === 46 ? decimal + value2.slice(i + 1) : value2.slice(i)) + valueSuffix;\n                value2 = value2.slice(0, i);\n                break;\n              }\n            }\n          }\n        }\n        if (comma && !zero2) value2 = group2(value2, Infinity);\n        var length2 = valuePrefix.length + value2.length + valueSuffix.length, padding2 = length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) : \"\";\n        if (comma && zero2) value2 = group2(padding2 + value2, padding2.length ? width2 - valueSuffix.length : Infinity), padding2 = \"\";\n        switch (align) {\n          case \"<\":\n            value2 = valuePrefix + value2 + valueSuffix + padding2;\n            break;\n          case \"=\":\n            value2 = valuePrefix + padding2 + value2 + valueSuffix;\n            break;\n          case \"^\":\n            value2 = padding2.slice(0, length2 = padding2.length >> 1) + valuePrefix + value2 + valueSuffix + padding2.slice(length2);\n            break;\n          default:\n            value2 = padding2 + valuePrefix + value2 + valueSuffix;\n            break;\n        }\n        return numerals(value2);\n      }\n      format2.toString = function() {\n        return specifier + \"\";\n      };\n      return format2;\n    }\n    function formatPrefix2(specifier, value2) {\n      var f = newFormat((specifier = formatSpecifier$1(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value2) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes$1[8 + e / 3];\n      return function(value3) {\n        return f(k * value3) + prefix;\n      };\n    }\n    return {\n      format: newFormat,\n      formatPrefix: formatPrefix2\n    };\n  }\n  var locale$3;\n  var format$4;\n  var formatPrefix;\n  defaultLocale$3({\n    thousands: \",\",\n    grouping: [3],\n    currency: [\"$\", \"\"]\n  });\n  function defaultLocale$3(definition2) {\n    locale$3 = formatLocale$2(definition2);\n    format$4 = locale$3.format;\n    formatPrefix = locale$3.formatPrefix;\n    return locale$3;\n  }\n  function precisionFixed(step) {\n    return Math.max(0, -exponent$1(Math.abs(step)));\n  }\n  function precisionPrefix(step, value2) {\n    return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value2) / 3))) * 3 - exponent$1(Math.abs(step)));\n  }\n  function precisionRound(step, max2) {\n    step = Math.abs(step), max2 = Math.abs(max2) - step;\n    return Math.max(0, exponent$1(max2) - exponent$1(step)) + 1;\n  }\n  function tickFormat$1(start, stop2, count2, specifier) {\n    var step = tickStep(start, stop2, count2), precision;\n    specifier = formatSpecifier$1(specifier == null ? \",f\" : specifier);\n    switch (specifier.type) {\n      case \"s\": {\n        var value2 = Math.max(Math.abs(start), Math.abs(stop2));\n        if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value2))) specifier.precision = precision;\n        return formatPrefix(specifier, value2);\n      }\n      case \"\":\n      case \"e\":\n      case \"g\":\n      case \"p\":\n      case \"r\": {\n        if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop2))))) specifier.precision = precision - (specifier.type === \"e\");\n        break;\n      }\n      case \"f\":\n      case \"%\": {\n        if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n        break;\n      }\n    }\n    return format$4(specifier);\n  }\n  function linearish(scale2) {\n    var domain2 = scale2.domain;\n    scale2.ticks = function(count2) {\n      var d2 = domain2();\n      return ticks(d2[0], d2[d2.length - 1], count2 == null ? 10 : count2);\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      var d2 = domain2();\n      return tickFormat$1(d2[0], d2[d2.length - 1], count2 == null ? 10 : count2, specifier);\n    };\n    scale2.nice = function(count2) {\n      if (count2 == null) count2 = 10;\n      var d2 = domain2();\n      var i0 = 0;\n      var i1 = d2.length - 1;\n      var start = d2[i0];\n      var stop2 = d2[i1];\n      var prestep;\n      var step;\n      var maxIter = 10;\n      if (stop2 < start) {\n        step = start, start = stop2, stop2 = step;\n        step = i0, i0 = i1, i1 = step;\n      }\n      while (maxIter-- > 0) {\n        step = tickIncrement(start, stop2, count2);\n        if (step === prestep) {\n          d2[i0] = start;\n          d2[i1] = stop2;\n          return domain2(d2);\n        } else if (step > 0) {\n          start = Math.floor(start / step) * step;\n          stop2 = Math.ceil(stop2 / step) * step;\n        } else if (step < 0) {\n          start = Math.ceil(start * step) / step;\n          stop2 = Math.floor(stop2 * step) / step;\n        } else {\n          break;\n        }\n        prestep = step;\n      }\n      return scale2;\n    };\n    return scale2;\n  }\n  function linear$1() {\n    var scale2 = continuous$1();\n    scale2.copy = function() {\n      return copy$2(scale2, linear$1());\n    };\n    initRange.apply(scale2, arguments);\n    return linearish(scale2);\n  }\n  function identity$4(domain2) {\n    var unknown;\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : x2;\n    }\n    scale2.invert = scale2;\n    scale2.domain = scale2.range = function(_) {\n      return arguments.length ? (domain2 = Array.from(_, number$5), scale2) : domain2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return identity$4(domain2).unknown(unknown);\n    };\n    domain2 = arguments.length ? Array.from(domain2, number$5) : [0, 1];\n    return linearish(scale2);\n  }\n  function nice(domain2, interval2) {\n    domain2 = domain2.slice();\n    var i0 = 0, i1 = domain2.length - 1, x02 = domain2[i0], x12 = domain2[i1], t;\n    if (x12 < x02) {\n      t = i0, i0 = i1, i1 = t;\n      t = x02, x02 = x12, x12 = t;\n    }\n    domain2[i0] = interval2.floor(x02);\n    domain2[i1] = interval2.ceil(x12);\n    return domain2;\n  }\n  function transformLog(x2) {\n    return Math.log(x2);\n  }\n  function transformExp(x2) {\n    return Math.exp(x2);\n  }\n  function transformLogn(x2) {\n    return -Math.log(-x2);\n  }\n  function transformExpn(x2) {\n    return -Math.exp(-x2);\n  }\n  function pow10(x2) {\n    return isFinite(x2) ? +(\"1e\" + x2) : x2 < 0 ? 0 : x2;\n  }\n  function powp(base2) {\n    return base2 === 10 ? pow10 : base2 === Math.E ? Math.exp : (x2) => Math.pow(base2, x2);\n  }\n  function logp(base2) {\n    return base2 === Math.E ? Math.log : base2 === 10 && Math.log10 || base2 === 2 && Math.log2 || (base2 = Math.log(base2), (x2) => Math.log(x2) / base2);\n  }\n  function reflect(f) {\n    return (x2, k) => -f(-x2, k);\n  }\n  function loggish(transform2) {\n    const scale2 = transform2(transformLog, transformExp);\n    const domain2 = scale2.domain;\n    let base2 = 10;\n    let logs;\n    let pows;\n    function rescale() {\n      logs = logp(base2), pows = powp(base2);\n      if (domain2()[0] < 0) {\n        logs = reflect(logs), pows = reflect(pows);\n        transform2(transformLogn, transformExpn);\n      } else {\n        transform2(transformLog, transformExp);\n      }\n      return scale2;\n    }\n    scale2.base = function(_) {\n      return arguments.length ? (base2 = +_, rescale()) : base2;\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2(_), rescale()) : domain2();\n    };\n    scale2.ticks = (count2) => {\n      const d2 = domain2();\n      let u2 = d2[0];\n      let v = d2[d2.length - 1];\n      const r = v < u2;\n      if (r) [u2, v] = [v, u2];\n      let i = logs(u2);\n      let j = logs(v);\n      let k;\n      let t;\n      const n = count2 == null ? 10 : +count2;\n      let z2 = [];\n      if (!(base2 % 1) && j - i < n) {\n        i = Math.floor(i), j = Math.ceil(j);\n        if (u2 > 0) for (; i <= j; ++i) {\n          for (k = 1; k < base2; ++k) {\n            t = i < 0 ? k / pows(-i) : k * pows(i);\n            if (t < u2) continue;\n            if (t > v) break;\n            z2.push(t);\n          }\n        }\n        else for (; i <= j; ++i) {\n          for (k = base2 - 1; k >= 1; --k) {\n            t = i > 0 ? k / pows(-i) : k * pows(i);\n            if (t < u2) continue;\n            if (t > v) break;\n            z2.push(t);\n          }\n        }\n        if (z2.length * 2 < n) z2 = ticks(u2, v, n);\n      } else {\n        z2 = ticks(i, j, Math.min(j - i, n)).map(pows);\n      }\n      return r ? z2.reverse() : z2;\n    };\n    scale2.tickFormat = (count2, specifier) => {\n      if (count2 == null) count2 = 10;\n      if (specifier == null) specifier = base2 === 10 ? \"s\" : \",\";\n      if (typeof specifier !== \"function\") {\n        if (!(base2 % 1) && (specifier = formatSpecifier$1(specifier)).precision == null) specifier.trim = true;\n        specifier = format$4(specifier);\n      }\n      if (count2 === Infinity) return specifier;\n      const k = Math.max(1, base2 * count2 / scale2.ticks().length);\n      return (d2) => {\n        let i = d2 / pows(Math.round(logs(d2)));\n        if (i * base2 < base2 - 0.5) i *= base2;\n        return i <= k ? specifier(d2) : \"\";\n      };\n    };\n    scale2.nice = () => {\n      return domain2(nice(domain2(), {\n        floor: (x2) => pows(Math.floor(logs(x2))),\n        ceil: (x2) => pows(Math.ceil(logs(x2)))\n      }));\n    };\n    return scale2;\n  }\n  function log$4() {\n    const scale2 = loggish(transformer$3()).domain([1, 10]);\n    scale2.copy = () => copy$2(scale2, log$4()).base(scale2.base());\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function transformSymlog(c2) {\n    return function(x2) {\n      return Math.sign(x2) * Math.log1p(Math.abs(x2 / c2));\n    };\n  }\n  function transformSymexp(c2) {\n    return function(x2) {\n      return Math.sign(x2) * Math.expm1(Math.abs(x2)) * c2;\n    };\n  }\n  function symlogish(transform2) {\n    var c2 = 1, scale2 = transform2(transformSymlog(c2), transformSymexp(c2));\n    scale2.constant = function(_) {\n      return arguments.length ? transform2(transformSymlog(c2 = +_), transformSymexp(c2)) : c2;\n    };\n    return linearish(scale2);\n  }\n  function symlog$1() {\n    var scale2 = symlogish(transformer$3());\n    scale2.copy = function() {\n      return copy$2(scale2, symlog$1()).constant(scale2.constant());\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function transformPow(exponent2) {\n    return function(x2) {\n      return x2 < 0 ? -Math.pow(-x2, exponent2) : Math.pow(x2, exponent2);\n    };\n  }\n  function transformSqrt(x2) {\n    return x2 < 0 ? -Math.sqrt(-x2) : Math.sqrt(x2);\n  }\n  function transformSquare(x2) {\n    return x2 < 0 ? -x2 * x2 : x2 * x2;\n  }\n  function powish(transform2) {\n    var scale2 = transform2(identity$6, identity$6), exponent2 = 1;\n    function rescale() {\n      return exponent2 === 1 ? transform2(identity$6, identity$6) : exponent2 === 0.5 ? transform2(transformSqrt, transformSquare) : transform2(transformPow(exponent2), transformPow(1 / exponent2));\n    }\n    scale2.exponent = function(_) {\n      return arguments.length ? (exponent2 = +_, rescale()) : exponent2;\n    };\n    return linearish(scale2);\n  }\n  function pow$4() {\n    var scale2 = powish(transformer$3());\n    scale2.copy = function() {\n      return copy$2(scale2, pow$4()).exponent(scale2.exponent());\n    };\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function sqrt$3() {\n    return pow$4.apply(null, arguments).exponent(0.5);\n  }\n  function quantile() {\n    var domain2 = [], range2 = [], thresholds = [], unknown;\n    function rescale() {\n      var i = 0, n = Math.max(1, range2.length);\n      thresholds = new Array(n - 1);\n      while (++i < n) thresholds[i - 1] = quantileSorted(domain2, i / n);\n      return scale2;\n    }\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : range2[bisectRight$1(thresholds, x2)];\n    }\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return i < 0 ? [NaN, NaN] : [\n        i > 0 ? thresholds[i - 1] : domain2[0],\n        i < thresholds.length ? thresholds[i] : domain2[domain2.length - 1]\n      ];\n    };\n    scale2.domain = function(_) {\n      if (!arguments.length) return domain2.slice();\n      domain2 = [];\n      for (let d2 of _) if (d2 != null && !isNaN(d2 = +d2)) domain2.push(d2);\n      domain2.sort(ascending$2);\n      return rescale();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.quantiles = function() {\n      return thresholds.slice();\n    };\n    scale2.copy = function() {\n      return quantile().domain(domain2).range(range2).unknown(unknown);\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function quantize$1() {\n    var x02 = 0, x12 = 1, n = 1, domain2 = [0.5], range2 = [0, 1], unknown;\n    function scale2(x2) {\n      return x2 != null && x2 <= x2 ? range2[bisectRight$1(domain2, x2, 0, n)] : unknown;\n    }\n    function rescale() {\n      var i = -1;\n      domain2 = new Array(n);\n      while (++i < n) domain2[i] = ((i + 1) * x12 - (i - n) * x02) / (n + 1);\n      return scale2;\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12] = _, x02 = +x02, x12 = +x12, rescale()) : [x02, x12];\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (n = (range2 = Array.from(_)).length - 1, rescale()) : range2.slice();\n    };\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return i < 0 ? [NaN, NaN] : i < 1 ? [x02, domain2[0]] : i >= n ? [domain2[n - 1], x12] : [domain2[i - 1], domain2[i]];\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : scale2;\n    };\n    scale2.thresholds = function() {\n      return domain2.slice();\n    };\n    scale2.copy = function() {\n      return quantize$1().domain([x02, x12]).range(range2).unknown(unknown);\n    };\n    return initRange.apply(linearish(scale2), arguments);\n  }\n  function threshold() {\n    var domain2 = [0.5], range2 = [0, 1], unknown, n = 1;\n    function scale2(x2) {\n      return x2 != null && x2 <= x2 ? range2[bisectRight$1(domain2, x2, 0, n)] : unknown;\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2 = Array.from(_), n = Math.min(domain2.length, range2.length - 1), scale2) : domain2.slice();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), n = Math.min(domain2.length, range2.length - 1), scale2) : range2.slice();\n    };\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return [domain2[i - 1], domain2[i]];\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return threshold().domain(domain2).range(range2).unknown(unknown);\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  const t0$1 = /* @__PURE__ */ new Date(), t1 = /* @__PURE__ */ new Date();\n  function timeInterval$1(floori, offseti, count2, field2) {\n    function interval2(date2) {\n      return floori(date2 = arguments.length === 0 ? /* @__PURE__ */ new Date() : /* @__PURE__ */ new Date(+date2)), date2;\n    }\n    interval2.floor = (date2) => {\n      return floori(date2 = /* @__PURE__ */ new Date(+date2)), date2;\n    };\n    interval2.ceil = (date2) => {\n      return floori(date2 = new Date(date2 - 1)), offseti(date2, 1), floori(date2), date2;\n    };\n    interval2.round = (date2) => {\n      const d0 = interval2(date2), d1 = interval2.ceil(date2);\n      return date2 - d0 < d1 - date2 ? d0 : d1;\n    };\n    interval2.offset = (date2, step) => {\n      return offseti(date2 = /* @__PURE__ */ new Date(+date2), step == null ? 1 : Math.floor(step)), date2;\n    };\n    interval2.range = (start, stop2, step) => {\n      const range2 = [];\n      start = interval2.ceil(start);\n      step = step == null ? 1 : Math.floor(step);\n      if (!(start < stop2) || !(step > 0)) return range2;\n      let previous;\n      do\n        range2.push(previous = /* @__PURE__ */ new Date(+start)), offseti(start, step), floori(start);\n      while (previous < start && start < stop2);\n      return range2;\n    };\n    interval2.filter = (test2) => {\n      return timeInterval$1((date2) => {\n        if (date2 >= date2) while (floori(date2), !test2(date2)) date2.setTime(date2 - 1);\n      }, (date2, step) => {\n        if (date2 >= date2) {\n          if (step < 0) while (++step <= 0) {\n            while (offseti(date2, -1), !test2(date2)) {\n            }\n          }\n          else while (--step >= 0) {\n            while (offseti(date2, 1), !test2(date2)) {\n            }\n          }\n        }\n      });\n    };\n    if (count2) {\n      interval2.count = (start, end) => {\n        t0$1.setTime(+start), t1.setTime(+end);\n        floori(t0$1), floori(t1);\n        return Math.floor(count2(t0$1, t1));\n      };\n      interval2.every = (step) => {\n        step = Math.floor(step);\n        return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval2 : interval2.filter(field2 ? (d2) => field2(d2) % step === 0 : (d2) => interval2.count(0, d2) % step === 0);\n      };\n    }\n    return interval2;\n  }\n  const millisecond = timeInterval$1(() => {\n  }, (date2, step) => {\n    date2.setTime(+date2 + step);\n  }, (start, end) => {\n    return end - start;\n  });\n  millisecond.every = (k) => {\n    k = Math.floor(k);\n    if (!isFinite(k) || !(k > 0)) return null;\n    if (!(k > 1)) return millisecond;\n    return timeInterval$1((date2) => {\n      date2.setTime(Math.floor(date2 / k) * k);\n    }, (date2, step) => {\n      date2.setTime(+date2 + step * k);\n    }, (start, end) => {\n      return (end - start) / k;\n    });\n  };\n  millisecond.range;\n  const durationSecond$1 = 1e3;\n  const durationMinute$1 = durationSecond$1 * 60;\n  const durationHour$1 = durationMinute$1 * 60;\n  const durationDay$1 = durationHour$1 * 24;\n  const durationWeek$1 = durationDay$1 * 7;\n  const durationMonth$1 = durationDay$1 * 30;\n  const durationYear$1 = durationDay$1 * 365;\n  const second = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds());\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationSecond$1);\n  }, (start, end) => {\n    return (end - start) / durationSecond$1;\n  }, (date2) => {\n    return date2.getUTCSeconds();\n  });\n  second.range;\n  const timeMinute = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond$1);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationMinute$1);\n  }, (start, end) => {\n    return (end - start) / durationMinute$1;\n  }, (date2) => {\n    return date2.getMinutes();\n  });\n  timeMinute.range;\n  const utcMinute = timeInterval$1((date2) => {\n    date2.setUTCSeconds(0, 0);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationMinute$1);\n  }, (start, end) => {\n    return (end - start) / durationMinute$1;\n  }, (date2) => {\n    return date2.getUTCMinutes();\n  });\n  utcMinute.range;\n  const timeHour = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond$1 - date2.getMinutes() * durationMinute$1);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationHour$1);\n  }, (start, end) => {\n    return (end - start) / durationHour$1;\n  }, (date2) => {\n    return date2.getHours();\n  });\n  timeHour.range;\n  const utcHour = timeInterval$1((date2) => {\n    date2.setUTCMinutes(0, 0, 0);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationHour$1);\n  }, (start, end) => {\n    return (end - start) / durationHour$1;\n  }, (date2) => {\n    return date2.getUTCHours();\n  });\n  utcHour.range;\n  const timeDay = timeInterval$1(\n    (date2) => date2.setHours(0, 0, 0, 0),\n    (date2, step) => date2.setDate(date2.getDate() + step),\n    (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1,\n    (date2) => date2.getDate() - 1\n  );\n  timeDay.range;\n  const utcDay = timeInterval$1((date2) => {\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCDate(date2.getUTCDate() + step);\n  }, (start, end) => {\n    return (end - start) / durationDay$1;\n  }, (date2) => {\n    return date2.getUTCDate() - 1;\n  });\n  utcDay.range;\n  const unixDay = timeInterval$1((date2) => {\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCDate(date2.getUTCDate() + step);\n  }, (start, end) => {\n    return (end - start) / durationDay$1;\n  }, (date2) => {\n    return Math.floor(date2 / durationDay$1);\n  });\n  unixDay.range;\n  function timeWeekday(i) {\n    return timeInterval$1((date2) => {\n      date2.setDate(date2.getDate() - (date2.getDay() + 7 - i) % 7);\n      date2.setHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setDate(date2.getDate() + step * 7);\n    }, (start, end) => {\n      return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1;\n    });\n  }\n  const timeSunday = timeWeekday(0);\n  const timeMonday = timeWeekday(1);\n  const timeTuesday = timeWeekday(2);\n  const timeWednesday = timeWeekday(3);\n  const timeThursday = timeWeekday(4);\n  const timeFriday = timeWeekday(5);\n  const timeSaturday = timeWeekday(6);\n  timeSunday.range;\n  timeMonday.range;\n  timeTuesday.range;\n  timeWednesday.range;\n  timeThursday.range;\n  timeFriday.range;\n  timeSaturday.range;\n  function utcWeekday(i) {\n    return timeInterval$1((date2) => {\n      date2.setUTCDate(date2.getUTCDate() - (date2.getUTCDay() + 7 - i) % 7);\n      date2.setUTCHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setUTCDate(date2.getUTCDate() + step * 7);\n    }, (start, end) => {\n      return (end - start) / durationWeek$1;\n    });\n  }\n  const utcSunday = utcWeekday(0);\n  const utcMonday = utcWeekday(1);\n  const utcTuesday = utcWeekday(2);\n  const utcWednesday = utcWeekday(3);\n  const utcThursday = utcWeekday(4);\n  const utcFriday = utcWeekday(5);\n  const utcSaturday = utcWeekday(6);\n  utcSunday.range;\n  utcMonday.range;\n  utcTuesday.range;\n  utcWednesday.range;\n  utcThursday.range;\n  utcFriday.range;\n  utcSaturday.range;\n  const timeMonth = timeInterval$1((date2) => {\n    date2.setDate(1);\n    date2.setHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setMonth(date2.getMonth() + step);\n  }, (start, end) => {\n    return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n  }, (date2) => {\n    return date2.getMonth();\n  });\n  timeMonth.range;\n  const utcMonth = timeInterval$1((date2) => {\n    date2.setUTCDate(1);\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCMonth(date2.getUTCMonth() + step);\n  }, (start, end) => {\n    return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n  }, (date2) => {\n    return date2.getUTCMonth();\n  });\n  utcMonth.range;\n  const timeYear = timeInterval$1((date2) => {\n    date2.setMonth(0, 1);\n    date2.setHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setFullYear(date2.getFullYear() + step);\n  }, (start, end) => {\n    return end.getFullYear() - start.getFullYear();\n  }, (date2) => {\n    return date2.getFullYear();\n  });\n  timeYear.every = (k) => {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval$1((date2) => {\n      date2.setFullYear(Math.floor(date2.getFullYear() / k) * k);\n      date2.setMonth(0, 1);\n      date2.setHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setFullYear(date2.getFullYear() + step * k);\n    });\n  };\n  timeYear.range;\n  const utcYear = timeInterval$1((date2) => {\n    date2.setUTCMonth(0, 1);\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCFullYear(date2.getUTCFullYear() + step);\n  }, (start, end) => {\n    return end.getUTCFullYear() - start.getUTCFullYear();\n  }, (date2) => {\n    return date2.getUTCFullYear();\n  });\n  utcYear.every = (k) => {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval$1((date2) => {\n      date2.setUTCFullYear(Math.floor(date2.getUTCFullYear() / k) * k);\n      date2.setUTCMonth(0, 1);\n      date2.setUTCHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setUTCFullYear(date2.getUTCFullYear() + step * k);\n    });\n  };\n  utcYear.range;\n  function ticker(year, month, week2, day, hour, minute) {\n    const tickIntervals = [\n      [second, 1, durationSecond$1],\n      [second, 5, 5 * durationSecond$1],\n      [second, 15, 15 * durationSecond$1],\n      [second, 30, 30 * durationSecond$1],\n      [minute, 1, durationMinute$1],\n      [minute, 5, 5 * durationMinute$1],\n      [minute, 15, 15 * durationMinute$1],\n      [minute, 30, 30 * durationMinute$1],\n      [hour, 1, durationHour$1],\n      [hour, 3, 3 * durationHour$1],\n      [hour, 6, 6 * durationHour$1],\n      [hour, 12, 12 * durationHour$1],\n      [day, 1, durationDay$1],\n      [day, 2, 2 * durationDay$1],\n      [week2, 1, durationWeek$1],\n      [month, 1, durationMonth$1],\n      [month, 3, 3 * durationMonth$1],\n      [year, 1, durationYear$1]\n    ];\n    function ticks2(start, stop2, count2) {\n      const reverse2 = stop2 < start;\n      if (reverse2) [start, stop2] = [stop2, start];\n      const interval2 = count2 && typeof count2.range === \"function\" ? count2 : tickInterval(start, stop2, count2);\n      const ticks3 = interval2 ? interval2.range(start, +stop2 + 1) : [];\n      return reverse2 ? ticks3.reverse() : ticks3;\n    }\n    function tickInterval(start, stop2, count2) {\n      const target2 = Math.abs(stop2 - start) / count2;\n      const i = bisector(([, , step2]) => step2).right(tickIntervals, target2);\n      if (i === tickIntervals.length) return year.every(tickStep(start / durationYear$1, stop2 / durationYear$1, count2));\n      if (i === 0) return millisecond.every(Math.max(tickStep(start, stop2, count2), 1));\n      const [t, step] = tickIntervals[target2 / tickIntervals[i - 1][2] < tickIntervals[i][2] / target2 ? i - 1 : i];\n      return t.every(step);\n    }\n    return [ticks2, tickInterval];\n  }\n  const [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\n  const [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n  function localDate$1(d2) {\n    if (0 <= d2.y && d2.y < 100) {\n      var date2 = new Date(-1, d2.m, d2.d, d2.H, d2.M, d2.S, d2.L);\n      date2.setFullYear(d2.y);\n      return date2;\n    }\n    return new Date(d2.y, d2.m, d2.d, d2.H, d2.M, d2.S, d2.L);\n  }\n  function utcDate$1(d2) {\n    if (0 <= d2.y && d2.y < 100) {\n      var date2 = new Date(Date.UTC(-1, d2.m, d2.d, d2.H, d2.M, d2.S, d2.L));\n      date2.setUTCFullYear(d2.y);\n      return date2;\n    }\n    return new Date(Date.UTC(d2.y, d2.m, d2.d, d2.H, d2.M, d2.S, d2.L));\n  }\n  function newDate(y2, m2, d2) {\n    return { y: y2, m: m2, d: d2, H: 0, M: 0, S: 0, L: 0 };\n  }\n  function formatLocale$1(locale2) {\n    var locale_dateTime = locale2.dateTime, locale_date = locale2.date, locale_time = locale2.time, locale_periods = locale2.periods, locale_weekdays = locale2.days, locale_shortWeekdays = locale2.shortDays, locale_months = locale2.months, locale_shortMonths = locale2.shortMonths;\n    var periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths);\n    var formats2 = {\n      \"a\": formatShortWeekday,\n      \"A\": formatWeekday,\n      \"b\": formatShortMonth,\n      \"B\": formatMonth,\n      \"c\": null,\n      \"d\": formatDayOfMonth,\n      \"e\": formatDayOfMonth,\n      \"f\": formatMicroseconds,\n      \"g\": formatYearISO,\n      \"G\": formatFullYearISO,\n      \"H\": formatHour24,\n      \"I\": formatHour12,\n      \"j\": formatDayOfYear,\n      \"L\": formatMilliseconds,\n      \"m\": formatMonthNumber,\n      \"M\": formatMinutes,\n      \"p\": formatPeriod,\n      \"q\": formatQuarter,\n      \"Q\": formatUnixTimestamp,\n      \"s\": formatUnixTimestampSeconds,\n      \"S\": formatSeconds,\n      \"u\": formatWeekdayNumberMonday,\n      \"U\": formatWeekNumberSunday,\n      \"V\": formatWeekNumberISO,\n      \"w\": formatWeekdayNumberSunday,\n      \"W\": formatWeekNumberMonday,\n      \"x\": null,\n      \"X\": null,\n      \"y\": formatYear$1,\n      \"Y\": formatFullYear,\n      \"Z\": formatZone,\n      \"%\": formatLiteralPercent\n    };\n    var utcFormats = {\n      \"a\": formatUTCShortWeekday,\n      \"A\": formatUTCWeekday,\n      \"b\": formatUTCShortMonth,\n      \"B\": formatUTCMonth,\n      \"c\": null,\n      \"d\": formatUTCDayOfMonth,\n      \"e\": formatUTCDayOfMonth,\n      \"f\": formatUTCMicroseconds,\n      \"g\": formatUTCYearISO,\n      \"G\": formatUTCFullYearISO,\n      \"H\": formatUTCHour24,\n      \"I\": formatUTCHour12,\n      \"j\": formatUTCDayOfYear,\n      \"L\": formatUTCMilliseconds,\n      \"m\": formatUTCMonthNumber,\n      \"M\": formatUTCMinutes,\n      \"p\": formatUTCPeriod,\n      \"q\": formatUTCQuarter,\n      \"Q\": formatUnixTimestamp,\n      \"s\": formatUnixTimestampSeconds,\n      \"S\": formatUTCSeconds,\n      \"u\": formatUTCWeekdayNumberMonday,\n      \"U\": formatUTCWeekNumberSunday,\n      \"V\": formatUTCWeekNumberISO,\n      \"w\": formatUTCWeekdayNumberSunday,\n      \"W\": formatUTCWeekNumberMonday,\n      \"x\": null,\n      \"X\": null,\n      \"y\": formatUTCYear,\n      \"Y\": formatUTCFullYear,\n      \"Z\": formatUTCZone,\n      \"%\": formatLiteralPercent\n    };\n    var parses = {\n      \"a\": parseShortWeekday,\n      \"A\": parseWeekday,\n      \"b\": parseShortMonth,\n      \"B\": parseMonth,\n      \"c\": parseLocaleDateTime,\n      \"d\": parseDayOfMonth,\n      \"e\": parseDayOfMonth,\n      \"f\": parseMicroseconds,\n      \"g\": parseYear,\n      \"G\": parseFullYear,\n      \"H\": parseHour24,\n      \"I\": parseHour24,\n      \"j\": parseDayOfYear,\n      \"L\": parseMilliseconds,\n      \"m\": parseMonthNumber,\n      \"M\": parseMinutes,\n      \"p\": parsePeriod,\n      \"q\": parseQuarter,\n      \"Q\": parseUnixTimestamp,\n      \"s\": parseUnixTimestampSeconds,\n      \"S\": parseSeconds,\n      \"u\": parseWeekdayNumberMonday,\n      \"U\": parseWeekNumberSunday,\n      \"V\": parseWeekNumberISO,\n      \"w\": parseWeekdayNumberSunday,\n      \"W\": parseWeekNumberMonday,\n      \"x\": parseLocaleDate,\n      \"X\": parseLocaleTime,\n      \"y\": parseYear,\n      \"Y\": parseFullYear,\n      \"Z\": parseZone,\n      \"%\": parseLiteralPercent\n    };\n    formats2.x = newFormat(locale_date, formats2);\n    formats2.X = newFormat(locale_time, formats2);\n    formats2.c = newFormat(locale_dateTime, formats2);\n    utcFormats.x = newFormat(locale_date, utcFormats);\n    utcFormats.X = newFormat(locale_time, utcFormats);\n    utcFormats.c = newFormat(locale_dateTime, utcFormats);\n    function newFormat(specifier, formats3) {\n      return function(date2) {\n        var string2 = [], i = -1, j = 0, n = specifier.length, c2, pad2, format2;\n        if (!(date2 instanceof Date)) date2 = /* @__PURE__ */ new Date(+date2);\n        while (++i < n) {\n          if (specifier.charCodeAt(i) === 37) {\n            string2.push(specifier.slice(j, i));\n            if ((pad2 = pads[c2 = specifier.charAt(++i)]) != null) c2 = specifier.charAt(++i);\n            else pad2 = c2 === \"e\" ? \" \" : \"0\";\n            if (format2 = formats3[c2]) c2 = format2(date2, pad2);\n            string2.push(c2);\n            j = i + 1;\n          }\n        }\n        string2.push(specifier.slice(j, i));\n        return string2.join(\"\");\n      };\n    }\n    function newParse(specifier, Z3) {\n      return function(string2) {\n        var d2 = newDate(1900, void 0, 1), i = parseSpecifier(d2, specifier, string2 += \"\", 0), week2, day;\n        if (i != string2.length) return null;\n        if (\"Q\" in d2) return new Date(d2.Q);\n        if (\"s\" in d2) return new Date(d2.s * 1e3 + (\"L\" in d2 ? d2.L : 0));\n        if (Z3 && !(\"Z\" in d2)) d2.Z = 0;\n        if (\"p\" in d2) d2.H = d2.H % 12 + d2.p * 12;\n        if (d2.m === void 0) d2.m = \"q\" in d2 ? d2.q : 0;\n        if (\"V\" in d2) {\n          if (d2.V < 1 || d2.V > 53) return null;\n          if (!(\"w\" in d2)) d2.w = 1;\n          if (\"Z\" in d2) {\n            week2 = utcDate$1(newDate(d2.y, 0, 1)), day = week2.getUTCDay();\n            week2 = day > 4 || day === 0 ? utcMonday.ceil(week2) : utcMonday(week2);\n            week2 = utcDay.offset(week2, (d2.V - 1) * 7);\n            d2.y = week2.getUTCFullYear();\n            d2.m = week2.getUTCMonth();\n            d2.d = week2.getUTCDate() + (d2.w + 6) % 7;\n          } else {\n            week2 = localDate$1(newDate(d2.y, 0, 1)), day = week2.getDay();\n            week2 = day > 4 || day === 0 ? timeMonday.ceil(week2) : timeMonday(week2);\n            week2 = timeDay.offset(week2, (d2.V - 1) * 7);\n            d2.y = week2.getFullYear();\n            d2.m = week2.getMonth();\n            d2.d = week2.getDate() + (d2.w + 6) % 7;\n          }\n        } else if (\"W\" in d2 || \"U\" in d2) {\n          if (!(\"w\" in d2)) d2.w = \"u\" in d2 ? d2.u % 7 : \"W\" in d2 ? 1 : 0;\n          day = \"Z\" in d2 ? utcDate$1(newDate(d2.y, 0, 1)).getUTCDay() : localDate$1(newDate(d2.y, 0, 1)).getDay();\n          d2.m = 0;\n          d2.d = \"W\" in d2 ? (d2.w + 6) % 7 + d2.W * 7 - (day + 5) % 7 : d2.w + d2.U * 7 - (day + 6) % 7;\n        }\n        if (\"Z\" in d2) {\n          d2.H += d2.Z / 100 | 0;\n          d2.M += d2.Z % 100;\n          return utcDate$1(d2);\n        }\n        return localDate$1(d2);\n      };\n    }\n    function parseSpecifier(d2, specifier, string2, j) {\n      var i = 0, n = specifier.length, m2 = string2.length, c2, parse2;\n      while (i < n) {\n        if (j >= m2) return -1;\n        c2 = specifier.charCodeAt(i++);\n        if (c2 === 37) {\n          c2 = specifier.charAt(i++);\n          parse2 = parses[c2 in pads ? specifier.charAt(i++) : c2];\n          if (!parse2 || (j = parse2(d2, string2, j)) < 0) return -1;\n        } else if (c2 != string2.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    function parsePeriod(d2, string2, i) {\n      var n = periodRe.exec(string2.slice(i));\n      return n ? (d2.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortWeekday(d2, string2, i) {\n      var n = shortWeekdayRe.exec(string2.slice(i));\n      return n ? (d2.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseWeekday(d2, string2, i) {\n      var n = weekdayRe.exec(string2.slice(i));\n      return n ? (d2.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortMonth(d2, string2, i) {\n      var n = shortMonthRe.exec(string2.slice(i));\n      return n ? (d2.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseMonth(d2, string2, i) {\n      var n = monthRe.exec(string2.slice(i));\n      return n ? (d2.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseLocaleDateTime(d2, string2, i) {\n      return parseSpecifier(d2, locale_dateTime, string2, i);\n    }\n    function parseLocaleDate(d2, string2, i) {\n      return parseSpecifier(d2, locale_date, string2, i);\n    }\n    function parseLocaleTime(d2, string2, i) {\n      return parseSpecifier(d2, locale_time, string2, i);\n    }\n    function formatShortWeekday(d2) {\n      return locale_shortWeekdays[d2.getDay()];\n    }\n    function formatWeekday(d2) {\n      return locale_weekdays[d2.getDay()];\n    }\n    function formatShortMonth(d2) {\n      return locale_shortMonths[d2.getMonth()];\n    }\n    function formatMonth(d2) {\n      return locale_months[d2.getMonth()];\n    }\n    function formatPeriod(d2) {\n      return locale_periods[+(d2.getHours() >= 12)];\n    }\n    function formatQuarter(d2) {\n      return 1 + ~~(d2.getMonth() / 3);\n    }\n    function formatUTCShortWeekday(d2) {\n      return locale_shortWeekdays[d2.getUTCDay()];\n    }\n    function formatUTCWeekday(d2) {\n      return locale_weekdays[d2.getUTCDay()];\n    }\n    function formatUTCShortMonth(d2) {\n      return locale_shortMonths[d2.getUTCMonth()];\n    }\n    function formatUTCMonth(d2) {\n      return locale_months[d2.getUTCMonth()];\n    }\n    function formatUTCPeriod(d2) {\n      return locale_periods[+(d2.getUTCHours() >= 12)];\n    }\n    function formatUTCQuarter(d2) {\n      return 1 + ~~(d2.getUTCMonth() / 3);\n    }\n    return {\n      format: function(specifier) {\n        var f = newFormat(specifier += \"\", formats2);\n        f.toString = function() {\n          return specifier;\n        };\n        return f;\n      },\n      parse: function(specifier) {\n        var p = newParse(specifier += \"\", false);\n        p.toString = function() {\n          return specifier;\n        };\n        return p;\n      },\n      utcFormat: function(specifier) {\n        var f = newFormat(specifier += \"\", utcFormats);\n        f.toString = function() {\n          return specifier;\n        };\n        return f;\n      },\n      utcParse: function(specifier) {\n        var p = newParse(specifier += \"\", true);\n        p.toString = function() {\n          return specifier;\n        };\n        return p;\n      }\n    };\n  }\n  var pads = { \"-\": \"\", \"_\": \" \", \"0\": \"0\" }, numberRe = /^\\s*\\d+/, percentRe = /^%/, requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n  function pad$2(value2, fill2, width2) {\n    var sign2 = value2 < 0 ? \"-\" : \"\", string2 = (sign2 ? -value2 : value2) + \"\", length2 = string2.length;\n    return sign2 + (length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) + string2 : string2);\n  }\n  function requote(s2) {\n    return s2.replace(requoteRe, \"\\\\$&\");\n  }\n  function formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n  }\n  function formatLookup(names) {\n    return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n  }\n  function parseWeekdayNumberSunday(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d2.w = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekdayNumberMonday(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d2.u = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberSunday(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.U = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberISO(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.V = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberMonday(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.W = +n[0], i + n[0].length) : -1;\n  }\n  function parseFullYear(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 4));\n    return n ? (d2.y = +n[0], i + n[0].length) : -1;\n  }\n  function parseYear(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.y = +n[0] + (+n[0] > 68 ? 1900 : 2e3), i + n[0].length) : -1;\n  }\n  function parseZone(d2, string2, i) {\n    var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string2.slice(i, i + 6));\n    return n ? (d2.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n  }\n  function parseQuarter(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d2.q = n[0] * 3 - 3, i + n[0].length) : -1;\n  }\n  function parseMonthNumber(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function parseDayOfMonth(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.d = +n[0], i + n[0].length) : -1;\n  }\n  function parseDayOfYear(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 3));\n    return n ? (d2.m = 0, d2.d = +n[0], i + n[0].length) : -1;\n  }\n  function parseHour24(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.H = +n[0], i + n[0].length) : -1;\n  }\n  function parseMinutes(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.M = +n[0], i + n[0].length) : -1;\n  }\n  function parseSeconds(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.S = +n[0], i + n[0].length) : -1;\n  }\n  function parseMilliseconds(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 3));\n    return n ? (d2.L = +n[0], i + n[0].length) : -1;\n  }\n  function parseMicroseconds(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 6));\n    return n ? (d2.L = Math.floor(n[0] / 1e3), i + n[0].length) : -1;\n  }\n  function parseLiteralPercent(d2, string2, i) {\n    var n = percentRe.exec(string2.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function parseUnixTimestamp(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i));\n    return n ? (d2.Q = +n[0], i + n[0].length) : -1;\n  }\n  function parseUnixTimestampSeconds(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i));\n    return n ? (d2.s = +n[0], i + n[0].length) : -1;\n  }\n  function formatDayOfMonth(d2, p) {\n    return pad$2(d2.getDate(), p, 2);\n  }\n  function formatHour24(d2, p) {\n    return pad$2(d2.getHours(), p, 2);\n  }\n  function formatHour12(d2, p) {\n    return pad$2(d2.getHours() % 12 || 12, p, 2);\n  }\n  function formatDayOfYear(d2, p) {\n    return pad$2(1 + timeDay.count(timeYear(d2), d2), p, 3);\n  }\n  function formatMilliseconds(d2, p) {\n    return pad$2(d2.getMilliseconds(), p, 3);\n  }\n  function formatMicroseconds(d2, p) {\n    return formatMilliseconds(d2, p) + \"000\";\n  }\n  function formatMonthNumber(d2, p) {\n    return pad$2(d2.getMonth() + 1, p, 2);\n  }\n  function formatMinutes(d2, p) {\n    return pad$2(d2.getMinutes(), p, 2);\n  }\n  function formatSeconds(d2, p) {\n    return pad$2(d2.getSeconds(), p, 2);\n  }\n  function formatWeekdayNumberMonday(d2) {\n    var day = d2.getDay();\n    return day === 0 ? 7 : day;\n  }\n  function formatWeekNumberSunday(d2, p) {\n    return pad$2(timeSunday.count(timeYear(d2) - 1, d2), p, 2);\n  }\n  function dISO(d2) {\n    var day = d2.getDay();\n    return day >= 4 || day === 0 ? timeThursday(d2) : timeThursday.ceil(d2);\n  }\n  function formatWeekNumberISO(d2, p) {\n    d2 = dISO(d2);\n    return pad$2(timeThursday.count(timeYear(d2), d2) + (timeYear(d2).getDay() === 4), p, 2);\n  }\n  function formatWeekdayNumberSunday(d2) {\n    return d2.getDay();\n  }\n  function formatWeekNumberMonday(d2, p) {\n    return pad$2(timeMonday.count(timeYear(d2) - 1, d2), p, 2);\n  }\n  function formatYear$1(d2, p) {\n    return pad$2(d2.getFullYear() % 100, p, 2);\n  }\n  function formatYearISO(d2, p) {\n    d2 = dISO(d2);\n    return pad$2(d2.getFullYear() % 100, p, 2);\n  }\n  function formatFullYear(d2, p) {\n    return pad$2(d2.getFullYear() % 1e4, p, 4);\n  }\n  function formatFullYearISO(d2, p) {\n    var day = d2.getDay();\n    d2 = day >= 4 || day === 0 ? timeThursday(d2) : timeThursday.ceil(d2);\n    return pad$2(d2.getFullYear() % 1e4, p, 4);\n  }\n  function formatZone(d2) {\n    var z2 = d2.getTimezoneOffset();\n    return (z2 > 0 ? \"-\" : (z2 *= -1, \"+\")) + pad$2(z2 / 60 | 0, \"0\", 2) + pad$2(z2 % 60, \"0\", 2);\n  }\n  function formatUTCDayOfMonth(d2, p) {\n    return pad$2(d2.getUTCDate(), p, 2);\n  }\n  function formatUTCHour24(d2, p) {\n    return pad$2(d2.getUTCHours(), p, 2);\n  }\n  function formatUTCHour12(d2, p) {\n    return pad$2(d2.getUTCHours() % 12 || 12, p, 2);\n  }\n  function formatUTCDayOfYear(d2, p) {\n    return pad$2(1 + utcDay.count(utcYear(d2), d2), p, 3);\n  }\n  function formatUTCMilliseconds(d2, p) {\n    return pad$2(d2.getUTCMilliseconds(), p, 3);\n  }\n  function formatUTCMicroseconds(d2, p) {\n    return formatUTCMilliseconds(d2, p) + \"000\";\n  }\n  function formatUTCMonthNumber(d2, p) {\n    return pad$2(d2.getUTCMonth() + 1, p, 2);\n  }\n  function formatUTCMinutes(d2, p) {\n    return pad$2(d2.getUTCMinutes(), p, 2);\n  }\n  function formatUTCSeconds(d2, p) {\n    return pad$2(d2.getUTCSeconds(), p, 2);\n  }\n  function formatUTCWeekdayNumberMonday(d2) {\n    var dow = d2.getUTCDay();\n    return dow === 0 ? 7 : dow;\n  }\n  function formatUTCWeekNumberSunday(d2, p) {\n    return pad$2(utcSunday.count(utcYear(d2) - 1, d2), p, 2);\n  }\n  function UTCdISO(d2) {\n    var day = d2.getUTCDay();\n    return day >= 4 || day === 0 ? utcThursday(d2) : utcThursday.ceil(d2);\n  }\n  function formatUTCWeekNumberISO(d2, p) {\n    d2 = UTCdISO(d2);\n    return pad$2(utcThursday.count(utcYear(d2), d2) + (utcYear(d2).getUTCDay() === 4), p, 2);\n  }\n  function formatUTCWeekdayNumberSunday(d2) {\n    return d2.getUTCDay();\n  }\n  function formatUTCWeekNumberMonday(d2, p) {\n    return pad$2(utcMonday.count(utcYear(d2) - 1, d2), p, 2);\n  }\n  function formatUTCYear(d2, p) {\n    return pad$2(d2.getUTCFullYear() % 100, p, 2);\n  }\n  function formatUTCYearISO(d2, p) {\n    d2 = UTCdISO(d2);\n    return pad$2(d2.getUTCFullYear() % 100, p, 2);\n  }\n  function formatUTCFullYear(d2, p) {\n    return pad$2(d2.getUTCFullYear() % 1e4, p, 4);\n  }\n  function formatUTCFullYearISO(d2, p) {\n    var day = d2.getUTCDay();\n    d2 = day >= 4 || day === 0 ? utcThursday(d2) : utcThursday.ceil(d2);\n    return pad$2(d2.getUTCFullYear() % 1e4, p, 4);\n  }\n  function formatUTCZone() {\n    return \"+0000\";\n  }\n  function formatLiteralPercent() {\n    return \"%\";\n  }\n  function formatUnixTimestamp(d2) {\n    return +d2;\n  }\n  function formatUnixTimestampSeconds(d2) {\n    return Math.floor(+d2 / 1e3);\n  }\n  var locale$2;\n  var timeFormat$1;\n  var timeParse$1;\n  var utcFormat$1;\n  var utcParse$1;\n  defaultLocale$2({\n    dateTime: \"%x, %X\",\n    date: \"%-m/%-d/%Y\",\n    time: \"%-I:%M:%S %p\",\n    periods: [\"AM\", \"PM\"],\n    days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n    shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n    months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n    shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n  });\n  function defaultLocale$2(definition2) {\n    locale$2 = formatLocale$1(definition2);\n    timeFormat$1 = locale$2.format;\n    timeParse$1 = locale$2.parse;\n    utcFormat$1 = locale$2.utcFormat;\n    utcParse$1 = locale$2.utcParse;\n    return locale$2;\n  }\n  function date(t) {\n    return new Date(t);\n  }\n  function number$4(t) {\n    return t instanceof Date ? +t : +/* @__PURE__ */ new Date(+t);\n  }\n  function calendar(ticks2, tickInterval, year, month, week2, day, hour, minute, second2, format2) {\n    var scale2 = continuous$1(), invert2 = scale2.invert, domain2 = scale2.domain;\n    var formatMillisecond = format2(\".%L\"), formatSecond = format2(\":%S\"), formatMinute = format2(\"%I:%M\"), formatHour = format2(\"%I %p\"), formatDay = format2(\"%a %d\"), formatWeek = format2(\"%b %d\"), formatMonth = format2(\"%B\"), formatYear2 = format2(\"%Y\");\n    function tickFormat2(date2) {\n      return (second2(date2) < date2 ? formatMillisecond : minute(date2) < date2 ? formatSecond : hour(date2) < date2 ? formatMinute : day(date2) < date2 ? formatHour : month(date2) < date2 ? week2(date2) < date2 ? formatDay : formatWeek : year(date2) < date2 ? formatMonth : formatYear2)(date2);\n    }\n    scale2.invert = function(y2) {\n      return new Date(invert2(y2));\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? domain2(Array.from(_, number$4)) : domain2().map(date);\n    };\n    scale2.ticks = function(interval2) {\n      var d2 = domain2();\n      return ticks2(d2[0], d2[d2.length - 1], interval2 == null ? 10 : interval2);\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      return specifier == null ? tickFormat2 : format2(specifier);\n    };\n    scale2.nice = function(interval2) {\n      var d2 = domain2();\n      if (!interval2 || typeof interval2.range !== \"function\") interval2 = tickInterval(d2[0], d2[d2.length - 1], interval2 == null ? 10 : interval2);\n      return interval2 ? domain2(nice(d2, interval2)) : scale2;\n    };\n    scale2.copy = function() {\n      return copy$2(scale2, calendar(ticks2, tickInterval, year, month, week2, day, hour, minute, second2, format2));\n    };\n    return scale2;\n  }\n  function time$1() {\n    return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute, second, timeFormat$1).domain([new Date(2e3, 0, 1), new Date(2e3, 0, 2)]), arguments);\n  }\n  function utcTime() {\n    return initRange.apply(calendar(utcTicks, utcTickInterval, utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, utcFormat$1).domain([Date.UTC(2e3, 0, 1), Date.UTC(2e3, 0, 2)]), arguments);\n  }\n  function transformer$2() {\n    var x02 = 0, x12 = 1, t02, t12, k10, transform2, interpolator = identity$6, clamp2 = false, unknown;\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : interpolator(k10 === 0 ? 0.5 : (x2 = (transform2(x2) - t02) * k10, clamp2 ? Math.max(0, Math.min(1, x2)) : x2));\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12] = _, t02 = transform2(x02 = +x02), t12 = transform2(x12 = +x12), k10 = t02 === t12 ? 0 : 1 / (t12 - t02), scale2) : [x02, x12];\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = !!_, scale2) : clamp2;\n    };\n    scale2.interpolator = function(_) {\n      return arguments.length ? (interpolator = _, scale2) : interpolator;\n    };\n    function range2(interpolate2) {\n      return function(_) {\n        var r0, r1;\n        return arguments.length ? ([r0, r1] = _, interpolator = interpolate2(r0, r1), scale2) : [interpolator(0), interpolator(1)];\n      };\n    }\n    scale2.range = range2(interpolate$1);\n    scale2.rangeRound = range2(interpolateRound);\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t) {\n      transform2 = t, t02 = t(x02), t12 = t(x12), k10 = t02 === t12 ? 0 : 1 / (t12 - t02);\n      return scale2;\n    };\n  }\n  function copy$1(source2, target2) {\n    return target2.domain(source2.domain()).interpolator(source2.interpolator()).clamp(source2.clamp()).unknown(source2.unknown());\n  }\n  function sequential() {\n    var scale2 = linearish(transformer$2()(identity$6));\n    scale2.copy = function() {\n      return copy$1(scale2, sequential());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialLog() {\n    var scale2 = loggish(transformer$2()).domain([1, 10]);\n    scale2.copy = function() {\n      return copy$1(scale2, sequentialLog()).base(scale2.base());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialSymlog() {\n    var scale2 = symlogish(transformer$2());\n    scale2.copy = function() {\n      return copy$1(scale2, sequentialSymlog()).constant(scale2.constant());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialPow() {\n    var scale2 = powish(transformer$2());\n    scale2.copy = function() {\n      return copy$1(scale2, sequentialPow()).exponent(scale2.exponent());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialSqrt() {\n    return sequentialPow.apply(null, arguments).exponent(0.5);\n  }\n  function transformer$1() {\n    var x02 = 0, x12 = 0.5, x2 = 1, s2 = 1, t02, t12, t22, k10, k21, interpolator = identity$6, transform2, clamp2 = false, unknown;\n    function scale2(x3) {\n      return isNaN(x3 = +x3) ? unknown : (x3 = 0.5 + ((x3 = +transform2(x3)) - t12) * (s2 * x3 < s2 * t12 ? k10 : k21), interpolator(clamp2 ? Math.max(0, Math.min(1, x3)) : x3));\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12, x2] = _, t02 = transform2(x02 = +x02), t12 = transform2(x12 = +x12), t22 = transform2(x2 = +x2), k10 = t02 === t12 ? 0 : 0.5 / (t12 - t02), k21 = t12 === t22 ? 0 : 0.5 / (t22 - t12), s2 = t12 < t02 ? -1 : 1, scale2) : [x02, x12, x2];\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = !!_, scale2) : clamp2;\n    };\n    scale2.interpolator = function(_) {\n      return arguments.length ? (interpolator = _, scale2) : interpolator;\n    };\n    function range2(interpolate2) {\n      return function(_) {\n        var r0, r1, r2;\n        return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate2, [r0, r1, r2]), scale2) : [interpolator(0), interpolator(0.5), interpolator(1)];\n      };\n    }\n    scale2.range = range2(interpolate$1);\n    scale2.rangeRound = range2(interpolateRound);\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t) {\n      transform2 = t, t02 = t(x02), t12 = t(x12), t22 = t(x2), k10 = t02 === t12 ? 0 : 0.5 / (t12 - t02), k21 = t12 === t22 ? 0 : 0.5 / (t22 - t12), s2 = t12 < t02 ? -1 : 1;\n      return scale2;\n    };\n  }\n  function diverging$1() {\n    var scale2 = linearish(transformer$1()(identity$6));\n    scale2.copy = function() {\n      return copy$1(scale2, diverging$1());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingLog() {\n    var scale2 = loggish(transformer$1()).domain([0.1, 1, 10]);\n    scale2.copy = function() {\n      return copy$1(scale2, divergingLog()).base(scale2.base());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingSymlog() {\n    var scale2 = symlogish(transformer$1());\n    scale2.copy = function() {\n      return copy$1(scale2, divergingSymlog()).constant(scale2.constant());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingPow() {\n    var scale2 = powish(transformer$1());\n    scale2.copy = function() {\n      return copy$1(scale2, divergingPow()).exponent(scale2.exponent());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingSqrt() {\n    return divergingPow.apply(null, arguments).exponent(0.5);\n  }\n  function assignTransitionStagger(transition, currentData, selection, presenter) {\n    const { layerStagger } = presenter.morphchartsref;\n    const { morphChartsRenderResult } = presenter;\n    const cubelayer = morphChartsRenderResult.getCubeLayer();\n    const range2 = transition.reverse ? [1, 0] : [0, 1];\n    if (!transition || transition.type === \"ordinal\" && !transition.reverse) {\n      delete layerStagger.cubes;\n    } else {\n      const staggerOrders = new Float64Array(cubelayer.positionsX.length);\n      switch (transition.type) {\n        case \"ordinal\": {\n          const scale2 = linear$1(range2).domain([0, currentData.length]);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            staggerOrders[glOrdinal] = scale2(i);\n          });\n          break;\n        }\n        case \"column\": {\n          if (transition.column.quantitative) {\n            const values2 = new Float64Array(currentData.length);\n            currentData.forEach((datum2, i) => {\n              values2[i] = datum2[transition.column.name];\n            });\n            const stats = getStats(currentData, transition.column);\n            const scale2 = linear$1(range2).domain([stats.min, stats.max]);\n            currentData.forEach((datum2, i) => {\n              const glOrdinal = datum2[GL_ORDINAL];\n              staggerOrders[glOrdinal] = scale2(values2[i]);\n            });\n          } else {\n            const strings2 = new Array(currentData.length);\n            currentData.forEach((datum2, i) => {\n              strings2[i] = datum2[transition.column.name];\n            });\n            getStats(currentData, transition.column, (distictValues) => {\n              currentData.forEach((datum2, i) => {\n                const glOrdinal = datum2[GL_ORDINAL];\n                const index2 = distictValues.indexOf(strings2[i]);\n                const staggerOrder = index2 / distictValues.length;\n                staggerOrders[glOrdinal] = transition.reverse ? 1 - staggerOrder : staggerOrder;\n              });\n            });\n          }\n          break;\n        }\n        case \"position\": {\n          const dimensions = {\n            x: cubelayer.positionsX,\n            y: cubelayer.positionsY,\n            z: cubelayer.positionsZ\n          };\n          const positions2 = dimensions[transition.dimension];\n          const values2 = new Float64Array(currentData.length);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            values2[i] = positions2[glOrdinal];\n          });\n          const stats = getStats(values2, null, \"number\", true);\n          const scale2 = linear$1(range2).domain([stats.min, stats.max]);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            staggerOrders[glOrdinal] = scale2(values2[i]);\n          });\n          break;\n        }\n      }\n      layerStagger.cubes = { staggerOrders, maxStaggerOrder: 1, minStaggerOrder: 0 };\n    }\n    cubelayer.update(morphChartsRenderResult.bounds, selection, layerStagger.cubes);\n  }\n  var __awaiter = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  const { defaultView } = defaults$1;\n  const zAxisZindex = 1010;\n  let didRegisterColorSchemes = false;\n  let Viewer$1 = class Viewer {\n    /**\n     * Instantiate a new Viewer.\n     * @param element Parent HTMLElement to present within.\n     * @param options Optional viewer options object.\n     */\n    constructor(element2, options2) {\n      this.element = element2;\n      this.options = deepMerge(defaultViewerOptions$1, options2);\n      this.presenter = new Presenter(element2, getPresenterStyle(this.options));\n      this._characterSet = new CharacterSet();\n      this._dataScope = new DataScope$2();\n      this._animator = new Animator(this._dataScope, {\n        onDataChanged: this.onDataChanged.bind(this),\n        onAnimateDataChange: this.onAnimateDataChange.bind(this)\n      });\n      this._details = new Details(this.presenter.getElement(PresenterElement$1.panel), this.options.language, this._animator, this._dataScope, (remap) => {\n        this.currentColorContext = ~~remap;\n        this.renderSameLayout();\n      }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n      this.insight = {};\n    }\n    changeColorContexts(colorContexts) {\n      this.colorContexts = colorContexts;\n      this.currentColorContext = 0;\n      this.options.onColorContextChange && this.options.onColorContextChange();\n    }\n    applyLegendColorContext(colorContext) {\n      const a2 = getActiveElementInfo();\n      mount(colorContext.legendElement, this.presenter.getElement(PresenterElement$1.legend));\n      setActiveElement(a2);\n      this.presenter.stage.legend = colorContext.legend;\n    }\n    onAnimateDataChange(dataChange, waitingLabel, handlerLabel, time2) {\n      var _a2;\n      if (time2 === void 0) {\n        const transitionDurations = ((_a2 = this.setup) === null || _a2 === void 0 ? void 0 : _a2.transitionDurations) || defaultPresenterConfig.transitionDurations;\n        time2 = transitionDurations.position + transitionDurations.stagger;\n      }\n      return new Promise((resolve2, reject) => {\n        let innerPromise;\n        if (dataChange === DataLayoutChange.refine) {\n          const oldColorContext = this.colorContexts[this.currentColorContext];\n          innerPromise = new Promise((innerResolve) => {\n            this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, cubeLayer) => {\n              finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n              this.overrideAxisLabels(stage);\n              cubeLayer.unitColorMap = oldColorContext.colorMap;\n              if (this.options.onStage) {\n                this.options.onStage(stage);\n              }\n            } })).then(() => {\n              this.applyLegendColorContext(oldColorContext);\n              innerResolve();\n            });\n          });\n        } else {\n          innerPromise = this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, colorMapper) => {\n            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            this.overrideAxisLabels(stage);\n            if (this.options.onStage) {\n              this.options.onStage(stage);\n            }\n          } }));\n        }\n        innerPromise.then(() => {\n          this.presenter.animationQueue(resolve2, time2, { waitingLabel, handlerLabel, animationCanceled: reject });\n        });\n      });\n    }\n    onDataChanged(dataLayout, filter2) {\n      return __awaiter(this, void 0, void 0, function* () {\n        switch (dataLayout) {\n          case DataLayoutChange.same: {\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            const hasActive = !!this._dataScope.active;\n            if (hasSelectedData || hasActive) {\n              this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n            } else {\n              this.presenter.morphChartsRenderResult.update({ cubes: null });\n            }\n            break;\n          }\n          case DataLayoutChange.refine: {\n            const oldColorContext = this.colorContexts[this.currentColorContext];\n            let colorMap;\n            this.presenter.morphChartsRenderResult.update({ cubes: null });\n            yield this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, cubeLayer) => {\n              colorMap = cubeLayer.unitColorMap;\n              cubeLayer.unitColorMap = oldColorContext.colorMap;\n              this.preStage(stage, cubeLayer);\n            }, onPresent: () => {\n              const newColorContext = {\n                colorMap,\n                legend: clone(this.presenter.stage.legend),\n                legendElement: this.presenter.getElement(PresenterElement$1.legend).children[0]\n              };\n              this.applyLegendColorContext(oldColorContext);\n              this.changeColorContexts([oldColorContext, newColorContext]);\n              this.onPresent();\n            } }));\n            if (!compare$4(this.insight.filter, filter2)) {\n              this.insight.filter = narrow(this.insight.filter, filter2);\n            }\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n            }\n            break;\n          }\n          case DataLayoutChange.reset: {\n            const colorContext = {\n              colorMap: null,\n              legend: null,\n              legendElement: null\n            };\n            this.changeColorContexts([colorContext]);\n            this.presenter.morphChartsRenderResult.update({ cubes: null });\n            yield this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { onPresent: () => {\n              populateColorContext(colorContext, this.presenter);\n              this.onPresent();\n            } }));\n            delete this.insight.filter;\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(null, null);\n            }\n            break;\n          }\n        }\n        if (this.options.onSelectionChanged) {\n          const sel = this.getSelection();\n          this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n        }\n      });\n    }\n    convertSearchToSet() {\n      if (this._dataScope.selection) {\n        const s2 = /* @__PURE__ */ new Set();\n        let found = false;\n        this._dataScope.selection.included.forEach((o, i) => {\n          s2.add(o[GL_ORDINAL]);\n          found = true;\n        });\n        if (!found) {\n          s2.add(-1);\n        }\n        return s2;\n      }\n    }\n    convertSetToSearch(s2) {\n      const search = {\n        expressions: []\n      };\n      s2.forEach((value2) => {\n        search.expressions.push({\n          name: GL_ORDINAL,\n          operator: \"==\",\n          value: value2,\n          clause: \"||\"\n        });\n      });\n      return search;\n    }\n    getSpecColumnsWithFilteredStats() {\n      if (!this._dataScope.hasFilteredData()) {\n        return this._specColumns;\n      }\n      const roles = [\"color\", \"facet\", \"group\", \"size\", \"sort\", \"sum\", \"x\", \"y\", \"z\"];\n      const specColumns = Object.assign({}, this._specColumns);\n      roles.forEach((r) => {\n        if (specColumns[r]) {\n          const column = Object.assign({}, specColumns[r]);\n          column.stats = this.getColumnStats(column);\n          specColumns[r] = column;\n        }\n      });\n      return specColumns;\n    }\n    renderNewLayout(signalValues, presenterConfig, view) {\n      return __awaiter(this, void 0, void 0, function* () {\n        const currData = this._dataScope.currentData();\n        const context2 = {\n          specColumns: this.getSpecColumnsWithFilteredStats(),\n          insight: this.insight,\n          specViewOptions: Object.assign(Object.assign({}, this.options), { zAxisOptions: {\n            showZAxis: true,\n            zIndex: zAxisZindex\n          }, collapseFacetAxes: true })\n        };\n        const specResult = build(context2, currData);\n        if (!specResult.errors) {\n          const uiValues = extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n          applySignalValues(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n          unbindSignalUI(specResult.vegaSpec);\n          this.vegaSpec = specResult.vegaSpec;\n          this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n          this.specCapabilities = specResult.specCapabilities;\n          const config = this.createConfig(presenterConfig);\n          this._lastPresenterConfig = config.presenterConfig;\n          if (view) {\n            config.getView = () => view;\n          }\n          if (!didRegisterColorSchemes) {\n            registerColorSchemes(base$3.vega);\n            didRegisterColorSchemes = true;\n          }\n          try {\n            if (this.vegaViewGl) {\n              this.vegaViewGl.finalize();\n            }\n            const runtime2 = base$3.vega.parse(this.vegaSpec);\n            this.vegaViewGl = new ViewGl(runtime2, config).renderer(\"morphcharts\").initialize(this.element);\n            yield this.vegaViewGl.runAsync();\n            const handler = (n, v) => {\n              this._characterSet.resetCharacterSet(true);\n            };\n            this.vegaSpec.signals.forEach((s2) => {\n              this.vegaViewGl.addSignalListener(s2.name, handler);\n            });\n            this.configForSignalCapture(config.presenterConfig);\n          } catch (e) {\n            specResult.errors = [e.message];\n          }\n          if (!specResult.errors) {\n            ensureHeaders(this.presenter, this.options.language.headers);\n          }\n        }\n        if (specResult.errors) {\n          if (this.options.onError) {\n            this.options.onError(specResult.errors);\n          } else if (this.presenter.logger) {\n            this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join(\"\\n\")}`);\n          }\n        }\n        return specResult;\n      });\n    }\n    /**\n     * Render the same layout with new options.\n     * @param newViewerOptions New options object.\n     */\n    renderSameLayout(newViewerOptions) {\n      const colorContext = this.colorContexts[this.currentColorContext];\n      this.applyLegendColorContext(colorContext);\n      if (newViewerOptions) {\n        if (newViewerOptions.colors) {\n          const mcColors = this.getMorphChartsColors();\n          this.presenter.configColors(mcColors);\n          this._lastPresenterConfig.morphChartsColors = mcColors;\n        }\n        this.options = deepMerge(this.options, newViewerOptions);\n      }\n      this.presenter.morphChartsRenderResult.getCubeLayer().unitColorMap = colorContext.colorMap;\n      this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n    }\n    getView(view) {\n      if (view === void 0) {\n        if (this.presenter.view === null) {\n          return defaultView;\n        } else {\n          return this.presenter.view;\n        }\n      } else {\n        return view;\n      }\n    }\n    transformData(values2, transform2) {\n      try {\n        const runtime2 = base$3.vega.parse({\n          $schema: \"https://vega.github.io/schema/vega/v4.json\",\n          data: [{\n            name: \"source\",\n            values: values2,\n            transform: transform2\n          }]\n        });\n        new ViewGl(runtime2).run();\n      } catch (e) {\n      }\n      return values2;\n    }\n    /**\n     * Render data into a visualization.\n     * @param insightSetup InsightSetup object to create a visualization rendering.\n     * @param data Array of data objects.\n     * @param renderOptions Optional RenderOptions object.\n     */\n    render(insightSetup_1, data_1) {\n      return __awaiter(this, arguments, void 0, function* (insightSetup, data2, renderOptions = {}) {\n        const { insight, setup: setup2 } = insightSetup;\n        let result;\n        if (!compare$4(insight.filter, this.insight.filter)) {\n          const transitionDurations = (setup2 === null || setup2 === void 0 ? void 0 : setup2.transitionDurations) || defaultPresenterConfig.transitionDurations;\n          const renderTime = transitionDurations.position + transitionDurations.stagger;\n          const allowAsyncRenderTime = renderTime + this.options.filterRenderingTimerPadding;\n          if (insight.filter) {\n            result = yield this._render(insightSetup, data2, renderOptions, true);\n            this.presenter.animationQueue(() => {\n              this.filter(insight.filter, renderOptions.rebaseFilter && renderOptions.rebaseFilter());\n            }, allowAsyncRenderTime, { waitingLabel: \"layout before refine\", handlerLabel: \"refine after layout\" });\n          } else {\n            this._dataScope.setFilteredData(null);\n            result = yield this._render(insightSetup, data2, renderOptions, true);\n            this.presenter.animationQueue(() => {\n              this.reset();\n            }, allowAsyncRenderTime, { waitingLabel: \"layout before reset\", handlerLabel: \"reset after layout\" });\n          }\n        } else {\n          result = yield this._render(insightSetup, data2, renderOptions, false);\n        }\n        return result;\n      });\n    }\n    shouldViewstateTransition(newInsight, oldInsight) {\n      if (!oldInsight.columns)\n        return false;\n      if (oldInsight.chart !== newInsight.chart)\n        return true;\n      if (oldInsight.size.height !== newInsight.size.height)\n        return true;\n      if (oldInsight.size.width !== newInsight.size.width)\n        return true;\n      if (oldInsight.columns.facet !== newInsight.columns.facet)\n        return true;\n      return false;\n    }\n    configForSignalCapture(presenterConfig) {\n      const colorContext = {\n        colorMap: null,\n        legend: null,\n        legendElement: null\n      };\n      presenterConfig.preStage = (stage, cubeLayer) => {\n        if (this._shouldSaveColorContext()) {\n          colorContext.colorMap = cubeLayer.unitColorMap;\n        }\n        this.preStage(stage, cubeLayer);\n      };\n      presenterConfig.onPresent = () => {\n        if (this._shouldSaveColorContext()) {\n          populateColorContext(colorContext, this.presenter);\n          this.changeColorContexts([colorContext]);\n          this._dataScope.deselect();\n        }\n        this.onPresent();\n      };\n    }\n    onPresent() {\n      var _a2;\n      if ((_a2 = this.setup) === null || _a2 === void 0 ? void 0 : _a2.transition) {\n        assignTransitionStagger(this.setup.transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n      }\n      this.options.onPresent && this.options.onPresent();\n    }\n    _render(insightSetup, data2, renderOptions, forceNewCharacterSet) {\n      return __awaiter(this, void 0, void 0, function* () {\n        const { insight, setup: setup2 } = insightSetup;\n        if (this._tooltip) {\n          this._tooltip.destroy();\n          this._tooltip = null;\n        }\n        if (this._dataScope.setData(data2, renderOptions.columns)) {\n          this.transformData(data2, insight.transform);\n        }\n        this._specColumns = getSpecColumns(insight, this._dataScope.getColumns(renderOptions.columnTypes));\n        const ordinalMap = assignOrdinals(this._specColumns, data2, renderOptions.ordinalMap);\n        this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n        this.insight = clone(insight);\n        this.setup = setup2;\n        this._shouldSaveColorContext = () => !renderOptions.initialColorContext;\n        const colorContext = renderOptions.initialColorContext || {\n          colorMap: null,\n          legend: null,\n          legendElement: null\n        };\n        const specResult = yield this.renderNewLayout(insight.signalValues, Object.assign(Object.assign({}, setup2 || {}), { preStage: (stage, cubeLayer) => {\n          if (this._shouldSaveColorContext()) {\n            colorContext.colorMap = cubeLayer.unitColorMap;\n          } else {\n            cubeLayer.unitColorMap = colorContext.colorMap;\n          }\n          const hasSelectedData = !!this._dataScope.hasSelectedData();\n          if (hasSelectedData || this._dataScope.active) ;\n          this.preStage(stage, cubeLayer);\n        }, onPresent: () => {\n          if (this._shouldSaveColorContext()) {\n            populateColorContext(colorContext, this.presenter);\n            this.changeColorContexts([colorContext]);\n          } else {\n            this.applyLegendColorContext(colorContext);\n          }\n          this.onPresent();\n        }, shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight) }), this.getView(insight.view));\n        this._shouldSaveColorContext = () => !renderOptions.discardColorContextUpdates || !renderOptions.discardColorContextUpdates();\n        this._details.render();\n        const result = { ordinalMap, specResult };\n        return result;\n      });\n    }\n    overrideAxisLabels(stage) {\n    }\n    preLayer(stage) {\n      let axisRole;\n      for (axisRole in stage.axes) {\n        const capability = this.specCapabilities.roles.filter((r) => r.role === axisRole)[0];\n        if (capability && (capability.axisSelectionBetweenTicks || capability.axisSelection === \"exact\")) {\n          moveTicksBetween(stage.axes[axisRole]);\n        }\n      }\n    }\n    preStage(stage, cubeLayer) {\n      this.overrideAxisLabels(stage);\n      this._axisSelection = new AxisSelection(this.specCapabilities, this._specColumns, stage);\n      finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n      if (this.options.onStage) {\n        this.options.onStage(stage);\n      }\n    }\n    onCubeClick(e, cube) {\n      this.options.onCubeClick && this.options.onCubeClick(e, cube);\n      const hasSelectedData = this._dataScope.hasSelectedData();\n      if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n        const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n        if (indexWithinSelection.index >= 0) {\n          this.activate(indexWithinSelection.datum);\n          this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n          if (this.options.onSelectionChanged) {\n            const sel = this.getSelection();\n            this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n          }\n          return;\n        }\n      }\n      if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][GL_ORDINAL] === cube.ordinal) {\n        this.deselect();\n        return;\n      }\n      const search = {\n        name: GL_ORDINAL,\n        operator: \"==\",\n        value: cube.ordinal\n      };\n      this.select(search);\n    }\n    onCubeHover(event2, cube) {\n      var _a2, _b2;\n      if (this._tooltip) {\n        this._tooltip.destroy();\n        this._tooltip = null;\n      }\n      if (!cube) {\n        return;\n      }\n      const currentData = this._dataScope.currentData();\n      const index2 = getDataIndexOfCube(cube, currentData);\n      if (index2 >= 0) {\n        const dataItem = cleanDataItem(((_a2 = this.options.tooltipOptions) === null || _a2 === void 0 ? void 0 : _a2.prepareDataItem(currentData[index2])) || currentData[index2]);\n        const tooltipCreateOptions = {\n          dataItem,\n          event: event2\n        };\n        if ((_b2 = this.options.tooltipOptions) === null || _b2 === void 0 ? void 0 : _b2.create) {\n          this._tooltip = this.options.tooltipOptions.create(tooltipCreateOptions);\n        } else {\n          this._tooltip = new Tooltip$1(Object.assign(Object.assign({}, tooltipCreateOptions), { cssPrefix: this.presenter.style.cssPrefix }));\n        }\n      }\n    }\n    onTextHover(e, t) {\n      if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor)\n        return false;\n      return !colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n    }\n    getMorphChartsColors() {\n      const { colors: colors2 } = this.options;\n      return {\n        activeItemColor: colors2.activeCube,\n        axesGridBackgroundColor: colors2.backgroundColor,\n        axesGridHighlightColor: colors2.axisSelectHighlight,\n        axesGridMajorColor: colors2.gridLine,\n        axesGridMinorColor: colors2.gridLine,\n        axesGridZeroColor: colors2.gridLine,\n        axesTextHeadingColor: colors2.axisText,\n        axesTextLabelColor: colors2.axisText,\n        axesTextTitleColor: colors2.axisText,\n        backgroundColor: colors2.backgroundColor,\n        textBorderColor: colors2.backgroundColor,\n        textColor: colors2.axisText\n      };\n    }\n    createConfig(c2) {\n      var _a2;\n      const { getTextColor, getTextHighlightColor, onTextClick } = this.options;\n      const defaultPresenterConfig2 = {\n        morphChartsColors: this.getMorphChartsColors(),\n        zAxisZindex,\n        getCharacterSet: (stage) => this._characterSet.getCharacterSet(stage),\n        getTextColor,\n        getTextHighlightColor,\n        onTextClick: (e, t) => {\n          if (t.metaData && t.metaData.search) {\n            const search = getSearchGroupFromVegaValue(t.metaData.search);\n            if (this.options.onAxisClick) {\n              this.options.onAxisClick(e, search);\n            } else {\n              this.select(search);\n            }\n          }\n          if (onTextClick) {\n            onTextClick(e, t);\n          }\n        },\n        onCubeClick: this.onCubeClick.bind(this),\n        onCubeHover: this.onCubeHover.bind(this),\n        onTextHover: this.onTextHover.bind(this),\n        preLayer: this.preLayer.bind(this),\n        preStage: this.preStage.bind(this),\n        onPresent: this.onPresent.bind(this),\n        onAxisConfig: (cartesian2, dim3d, axis) => {\n          if (!axis)\n            return;\n          const role = this.specCapabilities.roles.filter((r) => r.role === axis.axisRole)[0];\n          if (role === null || role === void 0 ? void 0 : role.axisSelection) {\n            cartesian2.isDivisionPickingEnabled[dim3d] = true;\n            cartesian2.arePickDivisionsVisible[dim3d] = axis.tickText.length > 0;\n            cartesian2.isLabelPickingEnabled[dim3d] = true;\n            cartesian2.isTitlePickingEnabled[dim3d] = true;\n            cartesian2.isHeadingPickingEnabled[dim3d] = true;\n            cartesian2.isGridPickingEnabled = false;\n          }\n        },\n        onAxesComplete: (cartesian2) => {\n        },\n        axisPickGridCallback: (divisions, e) => {\n          const search = this._axisSelection.convert(divisions);\n          if (this.options.onAxisClick) {\n            this.options.onAxisClick(e, search);\n          } else {\n            this.select(search);\n          }\n        },\n        onLayerClick: (e) => {\n          this.options.onCanvasClick && this.options.onCanvasClick(e);\n          this.deselect();\n        },\n        onLegendClick: (e, legend2, clickedIndex) => {\n          const legendRow = clickedIndex !== null && legend2.rows[clickedIndex];\n          if (legendRow) {\n            if (this.options.onLegendRowClick) {\n              this.options.onLegendRowClick(e, legendRow);\n            } else {\n              this.select(legendRow.search);\n            }\n          } else if (this.options.onLegendHeaderClick) {\n            this.options.onLegendHeaderClick(e);\n          }\n        },\n        onSceneRectAssignCubeOrdinal: (datum2) => {\n          return datum2[GL_ORDINAL];\n        },\n        onTargetViewState: (h2, w2) => {\n          const { height: height2, width: width2 } = this.insight.size;\n          let newViewStateTarget;\n          if (this.options.onNewViewStateTarget) {\n            newViewStateTarget = this.options.onNewViewStateTarget();\n          }\n          return { height: height2, width: width2, newViewStateTarget };\n        },\n        layerSelection: {\n          cubes: this.convertSearchToSet()\n        },\n        preserveDrawingBuffer: this.options.preserveDrawingBuffer\n      };\n      if (!this.options.disableLasso) {\n        defaultPresenterConfig2.onLasso = (ids, e) => {\n          this.deselect();\n          const search = this.convertSetToSearch(ids);\n          this.select(search);\n        };\n      }\n      if (this.options.onBeforeCreateLayers) {\n        defaultPresenterConfig2.preLayer = (stage) => {\n          this.preLayer(stage);\n          this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n        };\n      }\n      const config = {\n        presenter: this.presenter,\n        presenterConfig: Object.assign(defaultPresenterConfig2, c2)\n      };\n      if ((_a2 = this.setup) === null || _a2 === void 0 ? void 0 : _a2.transitionDurations) {\n        config.presenterConfig.transitionDurations = this.setup.transitionDurations;\n      }\n      return config;\n    }\n    /**\n     * Filter the data and animate.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n     */\n    filter(search, rebase = false) {\n      const u2 = this._dataScope.createUserSelection(search, false, rebase);\n      return new Promise((resolve2, reject) => {\n        this._animator.filter(search, u2.included, u2.excluded, rebase).then(() => {\n          this._details.clear();\n          this._details.clearSelection();\n          this._details.populate(this._dataScope.selection);\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Remove any filtration and animate.\n     */\n    reset() {\n      return new Promise((resolve2, reject) => {\n        this._animator.reset().then(() => {\n          this._details.clear();\n          this._details.clearSelection();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Select cubes by a filter expression.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     */\n    select(search) {\n      return new Promise((resolve2, reject) => {\n        this._animator.select(search).then(() => {\n          this._details.populate(this._dataScope.selection);\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Removes any selection.\n     */\n    deselect() {\n      return new Promise((resolve2, reject) => {\n        this._animator.deselect().then(() => {\n          this._details.clearSelection();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Gets the current selection.\n     */\n    getSelection() {\n      if (!this._dataScope)\n        return null;\n      const selectionState = {\n        search: this._dataScope.selection && this._dataScope.selection.search || null,\n        selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n        active: this._dataScope.active\n      };\n      return selectionState;\n    }\n    /**\n     * Set one data row to the active state.\n     */\n    activate(datum2) {\n      return new Promise((resolve2, reject) => {\n        this._animator.activate(datum2).then(() => {\n          this.presenter.morphChartsRenderResult.activate(datum2[GL_ORDINAL]);\n          this._details.render();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Deactivate item.\n     */\n    deActivate() {\n      return new Promise((resolve2, reject) => {\n        if (this._dataScope && this._dataScope.active) {\n          this._animator.deactivate().then(() => {\n            this.presenter.morphChartsRenderResult.activate(-1);\n            this._details.render();\n            resolve2();\n          });\n        } else {\n          resolve2();\n        }\n      });\n    }\n    /**\n     * Gets the current camera.\n     * @param transitionFinal Optional flag to get camera destination when transition completes.\n     */\n    getCamera(transitionFinal = false) {\n      var _a2, _b2, _c2, _d2, _e2, _f, _g;\n      let position2 = [0, 0, 0];\n      let rotation2 = [0, 0, 0, 0];\n      if (transitionFinal) {\n        position2 = Array.from((_b2 = (_a2 = this.presenter) === null || _a2 === void 0 ? void 0 : _a2.morphchartsref) === null || _b2 === void 0 ? void 0 : _b2.cameraTransitioner.vPosition.to);\n        rotation2 = Array.from((_d2 = (_c2 = this.presenter) === null || _c2 === void 0 ? void 0 : _c2.morphchartsref) === null || _d2 === void 0 ? void 0 : _d2.cameraTransitioner.qRotation.to);\n      } else {\n        const camera = (_g = (_f = (_e2 = this.presenter) === null || _e2 === void 0 ? void 0 : _e2.morphchartsref) === null || _f === void 0 ? void 0 : _f.core) === null || _g === void 0 ? void 0 : _g.camera;\n        if (camera) {\n          camera.getPosition(position2);\n          camera.getOrbit(rotation2);\n        }\n      }\n      return { position: position2, rotation: rotation2, captureSize: this.insight.size };\n    }\n    /**\n     * Sets the current camera.\n     * @param camera Camera to set.\n     */\n    setCamera(camera) {\n      var _a2, _b2;\n      if (camera) {\n        (_b2 = (_a2 = this.presenter) === null || _a2 === void 0 ? void 0 : _a2.morphChartsRenderResult) === null || _b2 === void 0 ? void 0 : _b2.moveCamera(camera);\n      }\n    }\n    /**\n     * Gets the current insight with signal values.\n     */\n    getInsight() {\n      const insight = Object.assign({}, this.insight);\n      insight.signalValues = this.getSignalValues();\n      return insight;\n    }\n    /**\n     * Gets column stats from current data (filtered or all).\n     * @param column Column to get stats for.\n     */\n    getColumnStats(column) {\n      return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n    }\n    /**\n     * Gets current signal values.\n     */\n    getSignalValues() {\n      return extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n    }\n    assignTransitionStagger(transition) {\n      assignTransitionStagger(transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n    }\n    finalize() {\n      if (this._dataScope)\n        this._dataScope.finalize();\n      if (this._details)\n        this._details.finalize();\n      if (this._tooltip)\n        this._tooltip.destroy();\n      if (this.vegaViewGl)\n        this.vegaViewGl.finalize();\n      if (this.presenter)\n        this.presenter.finalize();\n      if (this.element)\n        this.element.innerHTML = \"\";\n      this.colorContexts = null;\n      this.element = null;\n      this.options = null;\n      this.presenter = null;\n      this.vegaSpec = null;\n      this.vegaViewGl = null;\n      this._animator = null;\n      this._dataScope = null;\n      this._details = null;\n      this._tooltip = null;\n    }\n  };\n  Viewer$1.defaultViewerOptions = defaultViewerOptions$1;\n  const version$4 = \"4.0.6\";\n  const use$4 = use$5;\n  const index$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    VegaMorphCharts: index$5,\n    Viewer: Viewer$1,\n    colorSchemes,\n    constants: constants$1,\n    searchExpression: index$6,\n    specs: index$7,\n    types: types$1,\n    use: use$4,\n    util: util$3,\n    version: version$4\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var collectionCompare = compare$2;\n  function compare$2(value1, value2) {\n    if (value1 === value2) {\n      return true;\n    }\n    if (value1 !== value1 && value2 !== value2) {\n      return true;\n    }\n    if ({}.toString.call(value1) != {}.toString.call(value2)) {\n      return false;\n    }\n    if (value1 !== Object(value1)) {\n      return false;\n    }\n    if (!value1) {\n      return false;\n    }\n    if (Array.isArray(value1)) {\n      return compareArrays(value1, value2);\n    }\n    if ({}.toString.call(value1) == \"[object Set]\") {\n      return compareArrays(Array.from(value1), Array.from(value2));\n    }\n    if ({}.toString.call(value1) == \"[object Object]\") {\n      return compareObjects(value1, value2);\n    } else {\n      return compareNativeSubtypes(value1, value2);\n    }\n  }\n  function compareNativeSubtypes(value1, value2) {\n    return value1.toString() === value2.toString();\n  }\n  function compareArrays(value1, value2) {\n    var len2 = value1.length;\n    if (len2 != value2.length) {\n      return false;\n    }\n    var alike = true;\n    for (var i = 0; i < len2; i++) {\n      if (!compare$2(value1[i], value2[i])) {\n        alike = false;\n        break;\n      }\n    }\n    return alike;\n  }\n  function compareObjects(value1, value2) {\n    var keys1 = Object.keys(value1).sort();\n    var keys2 = Object.keys(value2).sort();\n    var len2 = keys1.length;\n    if (len2 != keys2.length) {\n      return false;\n    }\n    for (var i = 0; i < len2; i++) {\n      var key1 = keys1[i];\n      var key2 = keys2[i];\n      if (!(key1 == key2 && compare$2(value1[key1], value2[key2]))) {\n        return false;\n      }\n    }\n    return true;\n  }\n  const compare$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    default: collectionCompare\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const classList = (...args) => {\n    return args.filter(Boolean).join(\" \");\n  };\n  const deepCompare = collectionCompare || compare$3;\n  function addNullable(insight, signalValues) {\n    const withNulls = Object.assign(Object.assign({ view: null, filter: null }, insight), { signalValues });\n    return withNulls;\n  }\n  function compareInsight(viewer, insight) {\n    const currentInsight = viewer.getInsight();\n    const a2 = addNullable(currentInsight, Object.assign(Object.assign({}, viewer.insight.signalValues), currentInsight.signalValues));\n    const b2 = addNullable(insight, Object.assign(Object.assign({}, a2.signalValues), insight.signalValues));\n    const compare2 = deepCompare(a2, b2);\n    return { a: a2, b: b2, compare: compare2 };\n  }\n  const util$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    classList,\n    compareInsight,\n    deepCompare\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const base$2 = {\n    react: null,\n    reactDOM: null\n  };\n  function use$3(react, reactDOM, vega2) {\n    use$5(vega2);\n    base$2.react = react;\n    base$2.reactDOM = reactDOM;\n    Viewer.prototype = react.Component.prototype;\n  }\n  function _Viewer(_props) {\n    class __Viewer extends base$2.react.Component {\n      layout() {\n        const { props } = this;\n        this.lastData = props.data;\n        this.viewer.render({\n          insight: props.insight,\n          setup: props.setup\n        }, props.data, props.renderOptions).then((renderResult) => {\n          props.onView && props.onView(renderResult);\n        }).catch((e) => {\n          props.onError && props.onError(e);\n        });\n      }\n      view() {\n        var _a2, _b2, _c2, _d2, _e2;\n        const { props } = this;\n        let didLayout = false;\n        if (props.insight && props.data) {\n          const c2 = compareInsight(this.viewer, props.insight);\n          const sameDataRef = props.data === this.lastData;\n          if (!c2.compare || !sameDataRef) {\n            this.layout();\n            didLayout = true;\n          }\n        }\n        if (!didLayout && props.setup) {\n          const { camera } = props.setup;\n          if (camera !== \"hold\") {\n            if (!deepCompare(this.viewer.setup.camera, camera)) {\n              if (!camera) {\n                (_b2 = (_a2 = this.viewer) === null || _a2 === void 0 ? void 0 : _a2.presenter) === null || _b2 === void 0 ? void 0 : _b2.homeCamera();\n              } else {\n                this.viewer.setCamera(camera);\n              }\n              const setup2 = clone(this.viewer.setup);\n              setup2.camera = camera;\n              this.viewer.setup = setup2;\n            }\n          }\n          if (props.setup.renderer) {\n            (_e2 = (_d2 = (_c2 = this.viewer) === null || _c2 === void 0 ? void 0 : _c2.presenter) === null || _d2 === void 0 ? void 0 : _d2.morphchartsref) === null || _e2 === void 0 ? void 0 : _e2.setMorphChartsRendererOptions(props.setup.renderer);\n          }\n        }\n      }\n      componentDidMount() {\n        const { props } = this;\n        const element2 = base$2.reactDOM.findDOMNode(this.viewerDiv);\n        this.viewer = new Viewer$1(element2, props.viewerOptions);\n        if (props.onMount) {\n          if (props.onMount(this.viewer.presenter.getElement(PresenterElement$1.gl))) {\n            this.view();\n          }\n        } else {\n          this.view();\n        }\n      }\n      componentDidUpdate() {\n        const { props } = this;\n        this.viewer.options = deepMerge(this.viewer.options, props.viewerOptions);\n        this.view();\n      }\n      componentWillUnmount() {\n        this.viewer.finalize();\n      }\n      render() {\n        return base$2.react.createElement(\"div\", { className: \"sanddance-ReactViewer\", ref: (div) => this.viewerDiv = div });\n      }\n    }\n    return new __Viewer(_props);\n  }\n  const Viewer = _Viewer;\n  const version$3 = \"4.0.2\";\n  const index$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    SandDance: index$4,\n    Viewer,\n    use: use$3,\n    util: util$2,\n    version: version$3\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const strings$1 = {\n    appName: \"SandDance\",\n    bingsearch: \"Bing\",\n    bingsearchDescription: (term) => `Search Bing for \"${term}\"`,\n    buttonClose: \"Close\",\n    buttonSelect: \"Search & Select\",\n    buttonColorSchemeMap: \"Map color scheme to filtered data\",\n    buttonColorSchemeRemap: \"Remap color to filtered data\",\n    buttonColorSchemeKeep: \"Keep same color scheme\",\n    buttonCopyToClipboard: \"Copy to clipboard\",\n    buttonExclude: \"Exclude\",\n    buttonExport: \"Export\",\n    buttonExportCount: (total) => total == 1 ? \"Export 1 row...\" : `Export ${total} rows...`,\n    buttonIsolate: \"Isolate\",\n    buttonReset: \"Stop filtering\",\n    buttonDeselect: \"Clear selection\",\n    buttonToolbarFloat: \"Float toolbar\",\n    buttonToolbarDock: \"Dock toolbar\",\n    buttonToolbarHide: \"Hide toolbar\",\n    buttonToolbarShow: \"Show toolbar\",\n    buttonNextDataItem: \"Next data item\",\n    buttonPrevDataItem: \"Previous data item\",\n    buttonCreateSnapshot: \"Create snapshot\",\n    buttonNextSnapshot: \"Next snapshot\",\n    buttonPrevSnapshot: \"Previous snapshot\",\n    buttonUpdateSnapshot: \"Update snapshot\",\n    buttonAddExpression: \"Add expression\",\n    buttonAddExpressionGroup: \"Add group\",\n    buttonDeleteExpression: \"Delete\",\n    buttonDeleteExpressionGroup: \"Delete group\",\n    buttonClearSnapshots: \"Clear snapshots\",\n    buttonDeleteSnapshot: \"Delete snapshot\",\n    buttonEditSnapshot: \"Edit snapshot\",\n    buttonMoveUp: \"Move up\",\n    buttonMoveDown: \"Move down\",\n    buttonShowVegaSpec: \"Show Vega spec\",\n    buttonLaunchVegaEditor: \"Open Vega Editor\",\n    buttonCameraHome: \"Center chart in window\",\n    buttonTooltipMapping: \"Tooltip columns...\",\n    buttonBackgroundImage: \"Background image...\",\n    buttonTransitionReverse: \"Play Reverse\",\n    buttonTransitionPause: \"Pause\",\n    buttonTransitionPlay: \"Play\",\n    buttonUndo: \"Undo\",\n    buttonRedo: \"Redo\",\n    buttonColumnTypes: \"Column types...\",\n    buttonApply: \"Apply\",\n    buttonRemove: \"Remove\",\n    buttonResetToDefault: \"Reset to default\",\n    chartTypeBarChartH: \"Bar\",\n    chartTypeBarChartV: \"Column\",\n    chartTypeDensity: \"Density\",\n    chartTypeGrid: \"Grid\",\n    chartTypeScatterPlot: \"Scatter\",\n    chartTypeStacks: \"Stacks\",\n    chartTypeStrips: \"Strips\",\n    chartTypeTreeMap: \"Treemap\",\n    defaultFileName: \"sanddance-data\",\n    errorExportFilenameEmpty: \"Filename cannot be blank\",\n    errorExportFilenameCharacters: (characters) => `A filename cannot contain any of the following characters: ${characters}`,\n    errorColumnMustBeNumeric: \"Numeric column required for this chart type.\",\n    errorNumericValue: \"Value must be numeric\",\n    errorImageFormat: \"File is not an image\",\n    labelBackgroundImageDialogTitle: \"Background image\",\n    labelBackgroundImageSubtext: \"Background image can only be shown on Scatterplot, Density, and Stacks charts. Columns must be numeric type.\",\n    labelBackgroundLeft: \"Left extent\",\n    labelBackgroundRight: \"Right extent\",\n    labelBackgroundBottom: \"Bottom extent\",\n    labelBackgroundTop: \"Top extent\",\n    labelBlank: \"blank\",\n    labelNull: \"null\",\n    labelTrue: \"true\",\n    labelFalse: \"false\",\n    labelSystemInfo: \"System info\",\n    labelChangeColumnType: \"Change column type\",\n    labelChartSettings: \"Chart settings\",\n    labelEditColumn: \"Edit\",\n    labelColumnName: \"Column name\",\n    labelColumnType: \"Column type\",\n    labelColumnDistinct: \"Distinct values\",\n    labelColumnHasColorData: \"Has color data\",\n    labelColumnIsColorData: \"Is color data\",\n    labelColumnQuantitativeMin: \"Min\",\n    labelColumnQuantitativeMax: \"Max\",\n    labelColumnQuantitativeMean: \"Mean\",\n    labelDataBrowser: \"Data browser\",\n    labelDataScope: \"Scope\",\n    labelExport: \"Export Data\",\n    labelExportFormat: \"File format\",\n    labelExportCSV: \".CSV - Comma separated values\",\n    labelExportHTML: \".HTML - A SandDance html page embedding this data\",\n    labelExportJSON: \".JSON - JavaScript object notation\",\n    labelExportTSV: \".TSV - Tab separated values\",\n    labelHistory: \"History\",\n    labelHistoryWarning: \"This will erase your current history.\",\n    labelTools: \"Tools\",\n    labelHoldCamera: \"Keep previous camera position\",\n    labelVegaSpec: \"Vega specification\",\n    labelColor: \"Chart color\",\n    labelError: \"Error\",\n    labelExportFileName: \"File name\",\n    labelSnapshots: \"Snapshots\",\n    labelSnapshotSettingThumbnailWidth: \"Thumbnail image width\",\n    labelSearch: \"Select by search\",\n    labelSearchClause: \"Clause\",\n    labelSearchColumn: \"Field\",\n    labelSearchOperator: \"Operator\",\n    labelSearchValue: \"Value\",\n    labelSearchValuePlaceholder: \"Value to search for\",\n    labelChart: \"Chart\",\n    labelChartCanvas: \"Chart canvas\",\n    labelColumnMapping: \"Column Mapping\",\n    labelChartTypeOptions: \"Chart options\",\n    labelColorBin: \"Color binning\",\n    labelColorOptions: \"Color options\",\n    labelColorBinExplanation: \"For numeric columns\",\n    labelColorFieldInfo: (colorColumnName, colorColumnType, categoricalNumeric, distinctValueCount) => `Field <span className=\"fieldname\">${colorColumnName}</span> is of type <span className=\"fieldtype\">${colorColumnType}</span>${categoricalNumeric ? ` and has ${distinctValueCount} distinct values` : \"\"}.`,\n    labelColorFieldIsColorData: (colorColumnName) => `Field <span className=\"fieldname\">${colorColumnName}</span> contains direct color data.`,\n    labelColorBinNone: \"None (continuous)\",\n    labelColorBinQuantize: \"Quantize\",\n    labelColorBinQuantile: \"Quantile\",\n    labelColorFilter: \"Note: Colors will be re-mapped to the filter when viewing this snapshot.\",\n    labelColorScheme: \"Scheme\",\n    labelTotal: \"Total by\",\n    labelTotalByCountSquare: \"Count (Grid layout)\",\n    labelTotalByCountStrip: \"Count (Strip layout)\",\n    labelTotalBySumStrip: \"Sum (Strip layout)\",\n    labelTotalBySumTreemap: \"Sum (Treemap layout)\",\n    labelTotalBySumStripPercent: \"Sum as percentage (Strip layout)\",\n    labelColumnColor: \"Color by\",\n    labelColumnFacet: \"Facet by\",\n    labelFacetLayout: \"Facet layout\",\n    labelFacetLayoutWrap: \"Wrap\",\n    // labelFacetLayoutHorizontal: 'Horizontal',\n    // labelFacetLayoutVertical: 'Vertical',\n    labelFacetLayoutCross: \"⊞\",\n    labelColumnFacetV: \"Cross facet by\",\n    labelColumnSort: \"Sort by\",\n    labelColumnX: \"X Axis\",\n    labelColumnY: \"Y Axis\",\n    labelColumnZ: \"Z Axis\",\n    labelColumnSize: \"Size by\",\n    labelColumnGroup: \"Group by\",\n    labelAliasColor: \"Color\",\n    labelAliasFacet: \"Facet\",\n    labelAliasFacetV: \"Vertical facet\",\n    labelAliasSort: \"Sort\",\n    labelAliasX: \"X Axis\",\n    labelAliasY: \"Y Axis\",\n    labelAliasZ: \"Z Axis\",\n    labelAliasSize: \"Size\",\n    labelAliasGroup: \"Group\",\n    labelDataItemIsFiltered: \"Item is filtered from view\",\n    labelHistoryInit: \"Initial view\",\n    labelHistoryFilterClear: \"Clear filter\",\n    labelHistoryFilterIExclude: \"Exclude filter\",\n    labelHistoryFilterIsolate: \"Isolate filter\",\n    labelHistoryChangeChartType: (chart) => `Change chart type to ${chart}`,\n    labelHistoryMapColumn: (column) => `Map ${column} role`,\n    labelHistoryUnMapColumn: (column) => `Unmap ${column} role`,\n    labelHistoryReviveSnapshot: \"Revive snapshot\",\n    labelHistoryColorBin: \"Change color binning\",\n    labelHistoryDirectColor: \"Change direct color\",\n    labelRenderer: \"Renderer quality\",\n    labelRendererAdvancedDisabled: \"Renderer quality (Enhanced 3D mode not supported on this device)\",\n    labelRendererBasic: \"Standard mode\",\n    labelRendererAdvanced: \"Enhanced 3D mode\",\n    labelRendererOptions: \"Renderer options ...\",\n    labelRendererOptionsDialogTitle: \"Renderer options\",\n    labelRendererOptionsAntialias: \"Antialias\",\n    labelRendererOptionsBloom: \"Bloom highlighting (for selections)\",\n    labelRendererOptionsBloomIntensity: \"Intensity\",\n    labelRendererOptionsDof: \"Depth of Field\",\n    labelRendererOptionsDofRange: \"Focus Range\",\n    labelRendererOptionsFxaa: \"Antialias\",\n    labelRendererOptionsShadow: \"Shadows\",\n    labelRendererOptionsSsao: \"Screen Space Ambient Occlusion\",\n    labelShowLegend: \"Show legend\",\n    labelShowAxes: \"Show axes\",\n    labelSnapshotTitle: \"Title\",\n    labelSnapshotDescription: \"Note (optional)\",\n    labelTooltipMapping: \"Tooltip columns\",\n    labelTransition: \"Transition\",\n    labelTransitionOptions: \"Transition options\",\n    labelTransitionScrubber: \"Scrub transition\",\n    labelTransitionStaggerBy: \"Stagger by\",\n    labelTransitionStaggerByOrdinal: \"Data order\",\n    labelTransitionStaggerByColumn: \"Column\",\n    labelTransitionStaggerByPosition: \"Axis position\",\n    labelTransitionStaggerOptions: \"Stagger options\",\n    labelTransitionStaggerReverse: \"Reverse\",\n    labelTransitionDurations: \"Transition durations\",\n    labelTransitionCamera: \"2D / 3D view\",\n    labelTransitionDuration: \"Duration\",\n    labelTransitionStagger: \"Stagger\",\n    labelVegaSpecData: \"Data reference\",\n    labelVegaSpecNotes: \"Note: You may need to change the color scheme to make this visible in Vega.\",\n    labelYes: \"Yes\",\n    labelNo: \"No\",\n    labelConfirmation: \"Are you sure?\",\n    labelColumnTypes: \"Column types\",\n    loading: \"Loading...\",\n    schemeCategorical: \"Categorical\",\n    schemeCyclical: \"Cyclical\",\n    schemeDiverging: \"Diverging\",\n    schemeDual: \"Dual\",\n    schemeSequentialMultiHue: \"Sequential Multi Hue\",\n    schemeSequentialMultiHueDark: \"For dark backgrounds\",\n    schemeSequentialMultiHueLight: \"For light backgrounds\",\n    schemeSequentialSingleHue: \"Sequential Single Hue\",\n    selectDataSpanAll: \"All rows\",\n    selectDataSpanFilter: \"Filtered\",\n    selectDataSpanSelection: \"Selected\",\n    selectVegaSpecDataNone: \"None\",\n    selectVegaSpecDataInline: \"Inline - WARNING this may use substantial browser/clipboard memory for large data sets.\",\n    selectVegaSpecDataUrl: \"URL\",\n    record: (current, total) => `${current} of ${total}`,\n    searchEQ: \"=\",\n    searchNEQ: \"<>\",\n    searchGT: \">\",\n    searchGTE: \">=\",\n    searchLT: \"<\",\n    searchLTE: \"<=\",\n    searchNULL: \"is null or empty\",\n    searchIN: \"contains\",\n    searchSW: \"starts with\",\n    searchWHERE: \"Where\",\n    searchAND: \"and\",\n    searchOR: \"or\",\n    selectAny: \"-- any --\",\n    selectNone: \"-- none --\",\n    selectNumeric: \"Numeric\",\n    selectNonNumeric: \"Categorical\",\n    selectDirectColor: \"Direct color\",\n    selectReference: \"Column mappings\",\n    tooltipSearch: (column, value2) => `Click to search in '${column}' for \"${value2}\"`,\n    labelRequired: \"required\",\n    labelSystem: \"System\",\n    labelViewType2d: \"View in 2D\",\n    labelViewType3d: \"View in 3D\",\n    labelDataColors: \"Enabled if this data column contains any CSS color values.\",\n    labelDataNullAll: \"Loading data...\",\n    labelDataNullFiltered: \"You can filter by first making a selection, then choosing <b>Isolate</b> or <b>Exclude</b> in the top bar.\",\n    labelDataNullSelection: \"You can select by: <ul><li>clicking the chart axes</li><li>clicking in the legend</li><li>searching</li</ul>\",\n    labelZeroAll: \"Dataset contains zero rows.\",\n    labelZeroSearchResults: \"No rows matched your search.\",\n    signalGroups: [\n      { prefix: \"Chart\", label: \"Chart options\" },\n      { prefix: \"Mark\", label: \"Mark options\" },\n      { prefix: \"RoleColor\", label: \"Color options\" },\n      { prefix: \"RoleFacet\", label: \"Facet options\" },\n      { prefix: \"RoleSort\", label: \"Sort options\" },\n      { prefix: \"RoleX\", label: \"X axis options\" },\n      { prefix: \"RoleY\", label: \"Y axis options\" },\n      { prefix: \"RoleZ\", label: \"Z axis options\" },\n      { prefix: \"Text\", label: \"Text options\" },\n      { prefix: \"*\", label: \"Options\" }\n    ],\n    percentValueFormat: (value2) => `${value2}%`\n  };\n  function IconButton$1(props) {\n    return base$1.react.createElement(base$1.fluentUI.IconButton, Object.assign({}, props, { styles: props.styles || {\n      root: {\n        color: props.themePalette.black\n      },\n      rootHovered: {\n        background: \"transparent\",\n        color: props.themePalette.themePrimary\n      },\n      rootPressed: {\n        background: \"transparent\"\n      },\n      menuIcon: {\n        display: \"none\"\n      }\n    }, iconProps: { iconName: props.iconName }, menuProps: props.menuProps }));\n  }\n  const maxCategoricalColors = 20;\n  function defaultColorScheme$1(c2) {\n    if (c2.quantitative) {\n      return \"redyellowgreen\";\n    } else if (c2.stats.distinctValueCount === 2) {\n      return \"dual_redgreen\";\n    } else if (c2.stats.distinctValueCount <= 10) {\n      return \"category10\";\n    }\n    return \"category20\";\n  }\n  const maxDistinctVal = 20;\n  const minDistinctVal = 2;\n  class BarChartRecommenderSummary {\n    constructor(columns, data2) {\n      let score2 = -1;\n      for (let i = 0; i < columns.length; i++) {\n        const recommendation = new BarChartRecommender(columns[i], data2).recommend();\n        if (recommendation.score > score2) {\n          this.best = recommendation;\n          score2 = recommendation.score;\n        }\n        if (score2 === 1)\n          break;\n      }\n      for (let k = 0; k < columns.length; k++) {\n        const column = columns[k];\n        if (column.name === this.best.columns.x || column.stats.isSequential)\n          continue;\n        if (column.quantitative || column.stats.distinctValueCount < maxCategoricalColors && column.stats.distinctValueCount > 1) {\n          this.best.columns.color = this.best.columns.sort = column.name;\n          this.best.scheme = defaultColorScheme$1(column);\n          if (column.quantitative) {\n            this.best.colorBin = \"quantile\";\n          }\n          break;\n        }\n      }\n    }\n    recommend() {\n      return this.best;\n    }\n  }\n  class BarChartRecommender {\n    constructor(column, data2) {\n      this.score = 0;\n      this.column = column;\n      this.rules = [\n        (column2) => {\n          if (column2.stats.isSequential)\n            return false;\n          else if (column2.quantitative) {\n            return true;\n          } else if (!column2.quantitative && column2.stats.distinctValueCount <= maxDistinctVal && column2.stats.distinctValueCount >= minDistinctVal) {\n            return true;\n          } else {\n            return false;\n          }\n        }\n      ];\n      for (let i = 0; i < this.rules.length; i++) {\n        if (this.rules[i](column))\n          this.score++;\n      }\n    }\n    recommend() {\n      const rec = {\n        chart: \"barchart\",\n        columns: {\n          x: this.column.name\n        },\n        score: this.score,\n        scheme: void 0,\n        view: \"2d\"\n      };\n      return rec;\n    }\n  }\n  const longitudeNames = [\"lon\", \"long\", \"longitude\"];\n  const latitudeNames = [\"lat\", \"latitude\"];\n  function isSpec(names, limits, column, data2) {\n    let is = false;\n    const cname = column.name.toLowerCase();\n    for (let i = 0; i < names.length; i++) {\n      if (names[i] === cname) {\n        is = true;\n        break;\n      }\n    }\n    return is;\n  }\n  function isLongitude(column, data2) {\n    return isSpec(longitudeNames, [-180, 180], column);\n  }\n  function isLatitude(column, data2) {\n    return isSpec(latitudeNames, [-90, 90], column);\n  }\n  function isGeo(column, data2) {\n    return isLatitude(column) || isLongitude(column);\n  }\n  class ScatterPlotRecommenderSummary {\n    constructor(columns, data2) {\n      const rec = {\n        chart: \"scatterplot\",\n        score: void 0,\n        columns: {},\n        scheme: void 0,\n        view: \"2d\"\n      };\n      columns.forEach((column) => {\n        if (!rec.columns.x) {\n          if (column.name.toLowerCase() === \"x\") {\n            return rec.columns.x = column.name;\n          } else if (isLongitude(column)) {\n            return rec.columns.x = column.name;\n          }\n        }\n        if (!rec.columns.y) {\n          if (column.name.toLowerCase() === \"y\") {\n            return rec.columns.y = column.name;\n          } else if (isLatitude(column)) {\n            return rec.columns.y = column.name;\n          }\n        }\n        if (!rec.columns.color && !column.stats.isSequential) {\n          if (column.quantitative || column.stats.distinctValueCount < maxCategoricalColors) {\n            rec.columns.color = rec.columns.sort = column.name;\n            rec.scheme = defaultColorScheme$1(column);\n            if (column.quantitative) {\n              rec.colorBin = \"quantile\";\n            }\n            return;\n          }\n        }\n      });\n      if (rec.columns.x && rec.columns.y) {\n        this.best = rec;\n      }\n    }\n    recommend() {\n      return this.best;\n    }\n  }\n  function preferredColumnForTreemapSize(columns, strict) {\n    for (let i = 0; i < columns.length; i++) {\n      const c2 = columns[i];\n      if (c2.quantitative) {\n        if (strict && c2.stats.hasNegative)\n          continue;\n        if (strict && c2.stats.isSequential)\n          continue;\n        if (strict && isGeo(c2))\n          continue;\n        return c2;\n      }\n    }\n  }\n  class RecommenderSummary {\n    constructor(columns, data2) {\n      const quickRec = new ScatterPlotRecommenderSummary(columns, data2).recommend();\n      if (quickRec) {\n        this.rec = quickRec;\n      } else {\n        const barChartrec = new BarChartRecommenderSummary(columns, data2).recommend();\n        if (barChartrec && barChartrec.score >= 1) {\n          this.rec = barChartrec;\n        } else {\n          this.rec = {\n            chart: \"grid\",\n            columns: {},\n            score: 1\n          };\n        }\n      }\n    }\n    recommend() {\n      return this.rec;\n    }\n  }\n  function ensureColumnsExist(insightColumns, actualColumns, transform2) {\n    for (const role in insightColumns) {\n      const columnName = insightColumns[role];\n      const column = actualColumns.filter((c2) => c2.name === columnName)[0];\n      const transformColumn = transform2 ? transform2.filter((t) => {\n        switch (t.type) {\n          case \"formula\": {\n            return t.as === columnName;\n          }\n        }\n      })[0] : null;\n      if (!(column || transformColumn)) {\n        delete insightColumns[role];\n      }\n    }\n  }\n  function ensureColumnsPopulated(chart, totalStyle, insightColumns, actualColumns) {\n    const nonInternal = actualColumns.filter((c2) => !isInternalFieldName(c2.name));\n    const firstColumn = nonInternal[0];\n    const firstColumnName = firstColumn && firstColumn.name;\n    const firstQuantitative = nonInternal.filter((c2) => c2.quantitative)[0];\n    const firstQuantitativeColumnName = firstQuantitative && firstQuantitative.name;\n    const ensureColumn = (role, quantitative, treemap2) => {\n      if (!insightColumns[role]) {\n        if (treemap2) {\n          insightColumns[role] = getTreemapColumn(actualColumns).name;\n        } else {\n          insightColumns[role] = quantitative ? firstQuantitativeColumnName : firstColumnName;\n        }\n      }\n    };\n    function checkRequiresSize() {\n      switch (totalStyle) {\n        case \"sum-strip\":\n        case \"sum-strip-percent\":\n          ensureColumn(\"size\", true);\n          break;\n        case \"sum-treemap\":\n          ensureColumn(\"size\", true, true);\n          break;\n      }\n    }\n    switch (chart) {\n      case \"barchart\":\n      case \"barchartV\":\n        ensureColumn(\"x\");\n        checkRequiresSize();\n        break;\n      case \"barchartH\":\n        ensureColumn(\"y\");\n        checkRequiresSize();\n        break;\n      case \"density\":\n        ensureColumn(\"x\");\n        ensureColumn(\"y\");\n        checkRequiresSize();\n        break;\n      case \"scatterplot\":\n      case \"stacks\":\n        ensureColumn(\"x\");\n        ensureColumn(\"y\");\n        break;\n      case \"treemap\":\n        if (!insightColumns.size) {\n          insightColumns.size = getTreemapColumn(actualColumns).name;\n        }\n        if (!insightColumns.size) {\n          return [strings$1.errorColumnMustBeNumeric];\n        }\n        break;\n    }\n  }\n  function getTreemapColumn(columns) {\n    let column = preferredColumnForTreemapSize(columns, true);\n    if (!column) {\n      column = preferredColumnForTreemapSize(columns, false);\n    }\n    return column;\n  }\n  function colorMapping(insight, columns) {\n    if (columns && insight.columns && insight.columns.color) {\n      return columns.filter((c2) => c2.name === insight.columns.color)[0];\n    }\n  }\n  function getBackgroundImageColumnBounds(columns) {\n    const bounds2 = [];\n    const getBound = (dimension, dataExtent2, column) => {\n      const { stats } = column;\n      const numericValue = dataExtent2 === \"max\" ? stats.max : stats.min;\n      return {\n        columnName: column.name,\n        dimension,\n        valid: true,\n        dataExtent: dataExtent2,\n        numericValue,\n        stringValue: numericValue.toString()\n      };\n    };\n    const dataExtents = [\"max\", \"min\"];\n    const dimensions = [\"x\", \"y\"];\n    columns.forEach((c2) => {\n      if (c2.quantitative) {\n        dimensions.forEach((dimension) => dataExtents.forEach((dataExtent2) => bounds2.push(getBound(dimension, dataExtent2, c2))));\n      }\n    });\n    return bounds2;\n  }\n  function _BackgroundImageEditor(_props) {\n    class __BackgroundImageEditor extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = {\n          backgroundImageColumnBounds: [],\n          readyToApply: false,\n          hidden: true\n        };\n      }\n      show(insightColumns) {\n        const { explorer: explorer2, quantitativeColumns } = this.props;\n        if (!quantitativeColumns.length) {\n          return;\n        }\n        const xCol = quantitativeColumns.filter((c2) => c2.name === insightColumns.x)[0];\n        const yCol = quantitativeColumns.filter((c2) => c2.name === insightColumns.y)[0];\n        let backgroundImageColumnBounds;\n        if (explorer2.imageHolder.backgroundImageColumnBounds.length < quantitativeColumns.length * 4) {\n          backgroundImageColumnBounds = getBackgroundImageColumnBounds(explorer2.state.dataContent.columns);\n        } else {\n          backgroundImageColumnBounds = clone(explorer2.imageHolder.backgroundImageColumnBounds);\n        }\n        const newState = { hidden: false, xCol, yCol, backgroundImageColumnBounds };\n        this.setState(newState);\n        this.checkReady();\n      }\n      render() {\n        const { props, state } = this;\n        const { explorer: explorer2 } = props;\n        return base$1.react.createElement(\n          Dialog$1,\n          { hidden: state.hidden, onDismiss: () => this.setState({ hidden: true, backgroundImageFileFormatError: null }), modalProps: {\n            containerClassName: \"sanddance-background-image-dialog\"\n          }, dialogContentProps: {\n            type: base$1.fluentUI.DialogType.normal,\n            title: strings$1.labelBackgroundImageDialogTitle,\n            subText: strings$1.labelBackgroundImageSubtext\n          }, buttons: [\n            base$1.react.createElement(base$1.fluentUI.PrimaryButton, { key: \"apply\", iconProps: { iconName: \"Photo2Add\" }, text: strings$1.buttonApply, onClick: () => this.applyImage(true), disabled: !state.readyToApply })\n          ] },\n          explorer2.imageHolder.img ? base$1.react.createElement(\n            \"div\",\n            { className: \"thumbnail\" },\n            base$1.react.createElement(\"img\", { src: explorer2.imageHolder.img.src }),\n            base$1.react.createElement(base$1.fluentUI.DefaultButton, { key: \"remove\", iconProps: { iconName: \"Photo2Remove\" }, text: strings$1.buttonRemove, onClick: () => {\n              explorer2.imageHolder.img = null;\n              this.applyImage(false);\n              this.setState({ readyToApply: false });\n            } })\n          ) : base$1.react.createElement(\n            \"div\",\n            { className: \"thumbnail\" },\n            base$1.react.createElement(\"input\", { type: \"file\", onChange: (e) => this.readBackgroundImage(e) }),\n            state.backgroundImageFileFormatError && base$1.react.createElement(\"div\", { className: \"error\" }, state.backgroundImageFileFormatError)\n          ),\n          this.inputForColumn(state.xCol, \"X axis\", \"x\", strings$1.labelBackgroundLeft, strings$1.labelBackgroundRight),\n          this.inputForColumn(state.yCol, \"Y axis\", \"y\", strings$1.labelBackgroundBottom, strings$1.labelBackgroundTop)\n        );\n      }\n      inputForColumn(column, label2, dimension, minLabel, maxLabel) {\n        const { props, state } = this;\n        const fieldInput = (label3, dataExtent2, getDefault) => {\n          const bounds2 = state.backgroundImageColumnBounds.filter((b2) => b2.columnName === (column === null || column === void 0 ? void 0 : column.name) && b2.dimension === dimension && b2.dataExtent === dataExtent2)[0];\n          if (!bounds2) {\n            return null;\n          }\n          return base$1.react.createElement(\n            \"div\",\n            { className: \"axis-bound-field\" },\n            base$1.react.createElement(base$1.fluentUI.TextField, { label: label3, onChange: (e, value2) => {\n              const numericValue = +value2;\n              bounds2.stringValue = value2;\n              bounds2.valid = !(!value2 || isNaN(numericValue));\n              if (bounds2.valid) {\n                bounds2.numericValue = numericValue;\n              }\n              this.setState({ backgroundImageColumnBounds: [...state.backgroundImageColumnBounds] });\n              this.checkReady();\n            }, value: bounds2.stringValue, errorMessage: bounds2.valid ? null : strings$1.errorNumericValue, onRenderSuffix: (a2) => {\n              return base$1.react.createElement(IconButton$1, {\n                iconName: \"ScaleVolume\",\n                themePalette: props.themePalette,\n                title: \"Use data extent\",\n                onClick: () => {\n                  bounds2.numericValue = getDefault();\n                  bounds2.stringValue = bounds2.numericValue.toString();\n                  bounds2.valid = true;\n                  this.setState({ backgroundImageColumnBounds: [...state.backgroundImageColumnBounds] });\n                  this.checkReady();\n                }\n              });\n            } })\n          );\n        };\n        return base$1.react.createElement(\n          \"div\",\n          { className: \"axis-bounds\" },\n          base$1.react.createElement(base$1.fluentUI.Dropdown, { label: label2, options: props.quantitativeColumns.map((c2) => {\n            const option = {\n              key: c2.name,\n              text: c2.name\n            };\n            return option;\n          }), onChange: (e, o) => {\n            const newState = { readyToApply: false };\n            const newColumn = props.quantitativeColumns.filter((c2) => c2.name === o.key)[0];\n            switch (dimension) {\n              case \"x\": {\n                newState.xCol = newColumn;\n                break;\n              }\n              case \"y\": {\n                newState.yCol = newColumn;\n                break;\n              }\n            }\n            this.setState(newState);\n            this.checkReady();\n          }, selectedKey: column === null || column === void 0 ? void 0 : column.name }),\n          base$1.react.createElement(\n            \"div\",\n            { className: \"axis-bound-fields\" },\n            fieldInput(minLabel, \"min\", () => column.stats.min),\n            fieldInput(maxLabel, \"max\", () => column.stats.max)\n          )\n        );\n      }\n      readBackgroundImage(e) {\n        if (e.target.files) {\n          const file = e.target.files[0];\n          const reader = new FileReader();\n          reader.onload = () => {\n            const img = new Image();\n            img.onerror = () => {\n              this.setState({ backgroundImageFileFormatError: strings$1.errorImageFormat });\n            };\n            img.onload = () => {\n              const { src, height: height2, width: width2 } = img;\n              this.props.explorer.imageHolder.img = { src, height: height2, width: width2 };\n              this.checkReady();\n            };\n            try {\n              img.src = reader.result;\n            } catch (e3) {\n              this.setState({ backgroundImageFileFormatError: strings$1.errorImageFormat });\n            }\n          };\n          reader.readAsDataURL(file);\n        }\n      }\n      checkReady() {\n        setTimeout(() => {\n          const { state, props } = this;\n          const { explorer: explorer2 } = props;\n          const { backgroundImageColumnBounds } = state;\n          let valid = true;\n          const dimensions = [\"x\", \"y\"];\n          const dataExtents = [\"max\", \"min\"];\n          [state.xCol, state.yCol].forEach((c2) => dimensions.forEach((dimension) => dataExtents.forEach((dataExtent2) => {\n            const bounds2 = backgroundImageColumnBounds.filter((b2) => b2.columnName === c2.name && b2.dataExtent === dataExtent2 && b2.dimension === dimension)[0];\n            if (!bounds2.valid) {\n              valid = false;\n            }\n          })));\n          const readyToApply = explorer2.imageHolder.img && valid;\n          this.setState({ readyToApply });\n        }, 0);\n      }\n      applyImage(showBackgroundImage) {\n        const { props, state } = this;\n        const { explorer: explorer2 } = props;\n        explorer2.imageHolder.showBackgroundImage = showBackgroundImage;\n        explorer2.imageHolder.backgroundImageColumnBounds = clone(state.backgroundImageColumnBounds);\n        if (showBackgroundImage) {\n          switch (props.chart) {\n            case \"density\":\n            case \"scatterplot\":\n            case \"stacks\": {\n              break;\n            }\n            default: {\n              explorer2.changeChartType(\"scatterplot\");\n              return;\n            }\n          }\n        }\n        explorer2.forceUpdate();\n      }\n    }\n    return new __BackgroundImageEditor(_props);\n  }\n  const BackgroundImageEditor = _BackgroundImageEditor;\n  function setInsightBackgroundImage(insight, imageHolder, columns) {\n    if (!imageHolder.showBackgroundImage || !columns.x || !columns.y) {\n      return;\n    }\n    const { backgroundImageColumnBounds } = imageHolder;\n    const xBounds = backgroundImageColumnBounds.filter((b2) => b2.columnName === columns.x && b2.dimension === \"x\");\n    const yBounds = backgroundImageColumnBounds.filter((b2) => b2.columnName === columns.y && b2.dimension === \"y\");\n    if (!xBounds.length || !yBounds.length) {\n      return;\n    }\n    const allBounds = [...xBounds, ...yBounds];\n    for (let i = 0; i < allBounds.length; i++) {\n      if (!allBounds[i].valid) {\n        return;\n      }\n    }\n    const bottom = yBounds.filter((b2) => b2.dataExtent === \"min\")[0];\n    const left = xBounds.filter((b2) => b2.dataExtent === \"min\")[0];\n    const right = xBounds.filter((b2) => b2.dataExtent === \"max\")[0];\n    const top = yBounds.filter((b2) => b2.dataExtent === \"max\")[0];\n    const all = [bottom, left, right, top];\n    for (let i = 0; i < all.length; i++) {\n      if (!all[i]) {\n        return;\n      }\n    }\n    const { src, height: height2, width: width2 } = imageHolder.img;\n    insight.backgroundImage = {\n      url: src,\n      size: { height: height2, width: width2 },\n      extents: {\n        bottom: bottom.numericValue,\n        left: left.numericValue,\n        right: right.numericValue,\n        top: top.numericValue\n      }\n    };\n    insight.size = insight.backgroundImage.size;\n  }\n  const dropdownWidth = 200;\n  function Dropdown$1(props) {\n    const newProps = Object.assign({}, props);\n    let selectedKey = null;\n    if (newProps.options && newProps.options.length > 1) {\n      const selectedOptions = newProps.options.filter((option) => option.selected);\n      if (selectedOptions && selectedOptions.length > 0) {\n        selectedKey = selectedOptions[0].key;\n      }\n    }\n    if (newProps.collapseLabel) {\n      newProps.onRenderTitle = ((a2, b2) => {\n        return base$1.react.createElement(\n          \"span\",\n          null,\n          newProps.label,\n          \": \",\n          a2[0].text\n        );\n      });\n    }\n    return base$1.react.createElement(base$1.fluentUI.Dropdown, Object.assign({ dropdownWidth }, newProps, { label: newProps.collapseLabel ? null : newProps.label, selectedKey }));\n  }\n  function getInitialSignalValue(explorer2, signal) {\n    let initialValue;\n    try {\n      initialValue = explorer2.viewer.vegaViewGl.signal(signal.name);\n    } catch (error2) {\n    }\n    return initialValue;\n  }\n  function Signal(props) {\n    if (!props.explorer.viewer || !props.signal) {\n      return null;\n    }\n    if (props.signal.bind) {\n      const input = props.signal.bind.input;\n      if (input) {\n        const fn2 = map$2[input];\n        if (fn2) {\n          const prefix = props.prefix ? `${props.prefix} ` : \"\";\n          const control = fn2(prefix, props.signal.bind, props.initialValue, (value2) => {\n            props.onChange && props.onChange(value2);\n            props.explorer.signal(props.signal.name, value2, props.newViewStateTarget);\n          }, props.disabled, props.collapseLabel, props.componentRef);\n          return base$1.react.createElement(\"div\", { className: \"sanddance-signal\" }, control);\n        }\n      }\n    }\n    return null;\n  }\n  const map$2 = {};\n  map$2[\"range\"] = (prefix, bind2, initialValue, onChange, disabled, collapseLabel, ref2) => {\n    let debouncer;\n    return base$1.react.createElement(base$1.fluentUI.Slider, { componentRef: ref2, label: prefix + bind2.name, max: bind2.max, min: bind2.min, step: bind2.step, defaultValue: initialValue, onChange: (value2) => {\n      if (debouncer) {\n        clearTimeout(debouncer);\n      }\n      debouncer = setTimeout(() => onChange(value2), bind2.debounce || 0);\n    }, disabled });\n  };\n  map$2[\"select\"] = (prefix, bind2, initialValue, onChange, disabled, collapseLabel, ref2) => {\n    const options2 = bind2.options.map((o, i) => {\n      const option = {\n        key: o,\n        text: o\n      };\n      return option;\n    });\n    const label2 = prefix + bind2.name;\n    return base$1.react.createElement(base$1.fluentUI.Dropdown, { componentRef: ref2, onRenderTitle: collapseLabel ? ((a2, b2) => base$1.react.createElement(\n      \"span\",\n      null,\n      label2,\n      \": \",\n      a2[0].text\n    )) : void 0, defaultSelectedKey: initialValue, label: collapseLabel ? void 0 : label2, options: options2, onChange: (e, o) => onChange(o.text), disabled });\n  };\n  map$2[\"checkbox\"] = (prefix, bind2, initialValue, onChange, disabled, collapseLabel, ref2) => {\n    return base$1.react.createElement(base$1.fluentUI.Toggle, { componentRef: ref2, defaultChecked: initialValue, label: prefix + bind2.name, onChange: (e, checked) => onChange(checked), disabled });\n  };\n  const maxFacets = 50;\n  const roleLabels = {\n    color: strings$1.labelColumnColor,\n    facet: strings$1.labelColumnFacet,\n    facetV: strings$1.labelColumnFacetV,\n    group: strings$1.labelColumnGroup,\n    size: strings$1.labelColumnSize,\n    sort: strings$1.labelColumnSort,\n    uid: null,\n    x: strings$1.labelColumnX,\n    y: strings$1.labelColumnY,\n    z: strings$1.labelColumnZ\n  };\n  const aliasLabels = {\n    color: strings$1.labelAliasColor,\n    facet: strings$1.labelAliasFacet,\n    facetV: strings$1.labelAliasFacetV,\n    group: strings$1.labelAliasGroup,\n    size: strings$1.labelAliasSize,\n    sort: strings$1.labelAliasSort,\n    uid: null,\n    x: strings$1.labelAliasX,\n    y: strings$1.labelAliasY,\n    z: strings$1.labelAliasZ\n  };\n  function filterColumnList(context2, columns) {\n    switch (context2) {\n      case \"facet\":\n      case \"facetV\":\n        return columns.filter((column) => column.quantitative || column.stats.distinctValueCount && column.stats.distinctValueCount < maxFacets);\n      default:\n        return columns.slice();\n    }\n  }\n  function optionsForSpecColumn(sectionName, columns, role, disabledColumnName, selectedColumnName) {\n    const filtered = filterColumnList(role, columns);\n    const options2 = filtered.map((column) => {\n      const option = {\n        key: `column:${column.name}`,\n        text: column.name,\n        data: column,\n        selected: selectedColumnName === column.name,\n        disabled: disabledColumnName === column.name\n      };\n      return option;\n    });\n    if (options2.length) {\n      const option = {\n        key: sectionName,\n        text: sectionName,\n        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n      };\n      options2.unshift(option);\n    }\n    return options2;\n  }\n  function optionsForReference(sectionName, specRoles) {\n    const options2 = specRoles.map((specRole) => {\n      const option = {\n        key: `role:${specRole.role}`,\n        text: aliasLabels[specRole.role],\n        data: specRole.role\n      };\n      return option;\n    }).sort((a2, b2) => a2.text.localeCompare(b2.text));\n    if (options2.length) {\n      const option = {\n        key: sectionName,\n        text: sectionName,\n        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n      };\n      options2.unshift(option);\n    }\n    return options2;\n  }\n  function selectFirst(options2) {\n    for (let i = 0; i < options2.length; i++) {\n      if (options2[i].itemType === base$1.fluentUI.DropdownMenuItemType.Header)\n        continue;\n      options2[i].selected = true;\n      return;\n    }\n  }\n  function getColumnMapOptions(props) {\n    if (!props.specRole)\n      return null;\n    let categoricalColumns;\n    let directColorColumns;\n    let directColorGroup;\n    let referenceGroup = [];\n    if (props.specRole.role === \"color\") {\n      categoricalColumns = props.categoricalColumns.filter((c2) => !c2.isColorData);\n      directColorColumns = props.categoricalColumns.filter((c2) => c2.isColorData);\n      directColorGroup = optionsForSpecColumn(strings$1.selectDirectColor, directColorColumns, \"color\", props.disabledColumnName, props.selectedColumnName);\n    } else {\n      categoricalColumns = props.categoricalColumns;\n    }\n    if (props.specRole.role === \"sort\") {\n      const others = props.specCapabilities.roles.filter((specRole) => specRole.role !== props.specRole.role);\n      referenceGroup = optionsForReference(strings$1.selectReference, others);\n    }\n    const quantitativeGroup = optionsForSpecColumn(strings$1.selectNumeric, props.quantitativeColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const categoricGroup = props.specRole.excludeCategoric ? null : optionsForSpecColumn(strings$1.selectNonNumeric, categoricalColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const options2 = referenceGroup.concat(quantitativeGroup).concat(categoricGroup).concat(directColorGroup).filter(Boolean);\n    return options2;\n  }\n  function ColumnMap(props) {\n    const options2 = getColumnMapOptions(props);\n    if (props.specRole.allowNone) {\n      options2.unshift({\n        key: -1,\n        text: strings$1.selectNone\n      });\n    }\n    const hasSelection = options2.reduce((p, c2) => {\n      return p || c2.selected;\n    }, false);\n    if (!hasSelection) {\n      selectFirst(options2);\n    }\n    let signals;\n    if (props.explorer.viewer && props.explorer.viewer.vegaSpec) {\n      if (props.specRole.signals) {\n        signals = props.explorer.viewer.vegaSpec.signals.filter((s2) => props.specRole.signals.indexOf(s2.name) >= 0);\n      }\n    }\n    const label2 = roleLabels[props.specRole.role];\n    const signalElements = !props.hideSignals && signals && signals.map((signal, i) => {\n      let initialValue;\n      try {\n        initialValue = props.explorer.viewer.vegaViewGl.signal(signal.name);\n      } catch (error2) {\n      }\n      return base$1.react.createElement(Signal, { key: signal.name + i + initialValue, explorer: props.explorer, signal, initialValue, onChange: (value2) => props.onChangeSignal && props.onChangeSignal(signal.name, value2), collapseLabel: props.collapseLabel });\n    });\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"sanddance-columnMap\" },\n      props.prefix,\n      !props.hideDropdown && base$1.react.createElement(Dropdown$1, { componentRef: props.componentRef, collapseLabel: props.collapseLabel, disabled: props.disabled, label: label2, options: options2, onChange: (e, o) => props.changeColumnMapping(props.specRole.role, typeof o.data === \"string\" ? o.data : clone(o.data)), onDismiss: props.onDismiss }),\n      signalElements,\n      props.suffix\n    );\n  }\n  function attachSpecRoleToAxisTitle(stage, specCapabilities) {\n    for (const axisName in stage.axes) {\n      specCapabilities.roles.forEach((specRole) => {\n        if (specRole.role === axisName) {\n          const axes = stage.axes[axisName];\n          axes.forEach((axis) => {\n            if (axis.title) {\n              const textItem = axis.title;\n              textItem.specRole = specRole;\n            }\n          });\n        }\n      });\n    }\n  }\n  function px$1(n) {\n    return n + \"px\";\n  }\n  function _PositionedColumnMap(_props) {\n    class __PositionedColumnMap extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        const { left, top } = props;\n        this.state = { left, top };\n        this.dropdownRef = base$1.react.createRef();\n      }\n      focus() {\n        if (!this.focused) {\n          this.focused = true;\n          this.dropdownRef.current.focus(true);\n        }\n      }\n      componentDidMount() {\n        const size = outerSize$1(this.div);\n        const over = {\n          left: Math.max(0, this.state.left + size.width - this.props.container.offsetWidth),\n          top: Math.max(0, this.state.top + size.height - this.props.container.offsetHeight)\n        };\n        if (over.left || over.top) {\n          let { left, top } = this.state;\n          left -= over.left;\n          top -= over.top;\n          this.setState({ left, top });\n        } else {\n          this.focus();\n        }\n      }\n      componentDidUpdate() {\n        this.focus();\n      }\n      render() {\n        return base$1.react.createElement(\n          \"div\",\n          { ref: (div) => {\n            if (div)\n              this.div = div;\n          }, className: \"sanddance-columnMap-absolute\", style: { position: \"absolute\", left: px$1(this.state.left), top: px$1(this.state.top) } },\n          base$1.react.createElement(ColumnMap, Object.assign({}, this.props, { componentRef: this.dropdownRef, hideSignals: true }))\n        );\n      }\n    }\n    return new __PositionedColumnMap(_props);\n  }\n  const PositionedColumnMap = _PositionedColumnMap;\n  function _ColumnTypeChanger(_props) {\n    class __ColumnTypeChanger extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = this.getInitialState();\n      }\n      getInitialState() {\n        const { props } = this;\n        return {\n          dialogHidden: true,\n          confirmationHidden: true,\n          quantitativeColumns: props.initialQuantitativeColumns.map((c2) => clone(c2)),\n          categoricalColumns: props.initialCategoricalColumns.map((c2) => clone(c2)),\n          columnTypes: null\n        };\n      }\n      closeDialog() {\n        this.setState(this.getInitialState());\n      }\n      openConfirmation(columnTypes) {\n        this.setState({ columnTypes, confirmationHidden: false });\n      }\n      render() {\n        const { props, state } = this;\n        const hasChanges = props.initialQuantitativeColumns.some((c2, i) => {\n          return c2.quantitative !== state.quantitativeColumns[i].quantitative;\n        });\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          base$1.react.createElement(base$1.fluentUI.DefaultButton, { text: strings$1.buttonColumnTypes, onClick: () => this.setState({ dialogHidden: false }) }),\n          base$1.react.createElement(\n            Dialog$1,\n            { minWidth: \"80%\", hidden: state.dialogHidden, onDismiss: () => this.closeDialog(), dialogContentProps: {\n              className: `sanddance-dialog ${props.theme}`,\n              type: base$1.fluentUI.DialogType.normal,\n              title: strings$1.labelColumnTypes\n            }, buttons: [\n              base$1.react.createElement(base$1.fluentUI.DefaultButton, { key: \"revert\", text: strings$1.buttonResetToDefault, onClick: () => this.openConfirmation(null), iconProps: { iconName: \"Undo\" } }),\n              base$1.react.createElement(base$1.fluentUI.DefaultButton, { key: \"apply\", text: strings$1.buttonApply, onClick: () => {\n                const columnTypes = {};\n                state.quantitativeColumns.forEach((c2) => {\n                  columnTypes[c2.name] = c2.quantitative ? c2.type : \"string\";\n                });\n                state.categoricalColumns.forEach((c2) => {\n                  columnTypes[c2.name] = \"string\";\n                });\n                this.openConfirmation(columnTypes);\n              }, iconProps: { iconName: \"Accept\" }, disabled: !hasChanges })\n            ] },\n            base$1.react.createElement(\n              \"div\",\n              { className: \"sanddance-columnTypes\" },\n              state.quantitativeColumns.length > 0 && base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(\"h3\", null, strings$1.selectNumeric),\n                base$1.react.createElement(\n                  \"table\",\n                  null,\n                  base$1.react.createElement(\n                    \"thead\",\n                    null,\n                    base$1.react.createElement(\n                      \"tr\",\n                      null,\n                      base$1.react.createElement(\"th\", null, strings$1.labelEditColumn),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnName),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnQuantitativeMin),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnQuantitativeMax),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnQuantitativeMean),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnDistinct)\n                    )\n                  ),\n                  base$1.react.createElement(\"tbody\", null, state.quantitativeColumns.map((c2, i) => base$1.react.createElement(\n                    \"tr\",\n                    { key: i, className: c2.quantitative ? \"\" : \"changed\" },\n                    base$1.react.createElement(\n                      \"td\",\n                      null,\n                      base$1.react.createElement(IconButton$1, { iconName: \"Edit\", onClick: void 0, menuProps: {\n                        items: [strings$1.selectNumeric, strings$1.selectNonNumeric].map((t) => {\n                          return {\n                            key: t,\n                            text: t,\n                            onClick: () => {\n                              c2.quantitative = t === strings$1.selectNumeric;\n                              this.setState({ quantitativeColumns: [...state.quantitativeColumns] });\n                            }\n                          };\n                        })\n                      }, themePalette: props.themePalette, title: strings$1.labelChangeColumnType })\n                    ),\n                    base$1.react.createElement(\"td\", null, c2.name),\n                    base$1.react.createElement(\"td\", null, c2.stats.min),\n                    base$1.react.createElement(\"td\", null, c2.stats.max),\n                    base$1.react.createElement(\"td\", null, c2.stats.mean),\n                    base$1.react.createElement(\"td\", null, c2.stats.distinctValueCount)\n                  )))\n                )\n              ),\n              state.categoricalColumns.length > 0 && base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(\"h3\", null, strings$1.selectNonNumeric),\n                base$1.react.createElement(\n                  \"table\",\n                  null,\n                  base$1.react.createElement(\n                    \"thead\",\n                    null,\n                    base$1.react.createElement(\n                      \"tr\",\n                      null,\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnName),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnType),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnDistinct),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnHasColorData),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnIsColorData)\n                    )\n                  ),\n                  base$1.react.createElement(\"tbody\", null, state.categoricalColumns.map((c2, i) => base$1.react.createElement(\n                    \"tr\",\n                    { key: i },\n                    base$1.react.createElement(\"td\", null, c2.name),\n                    base$1.react.createElement(\"td\", null, c2.type),\n                    base$1.react.createElement(\"td\", null, c2.stats.distinctValueCount),\n                    base$1.react.createElement(\"td\", null, (!!c2.stats.hasColorData).toString()),\n                    base$1.react.createElement(\"td\", null, (!!c2.isColorData).toString())\n                  )))\n                )\n              )\n            )\n          ),\n          base$1.react.createElement(Dialog$1, { hidden: state.confirmationHidden, onDismiss: () => this.setState({ confirmationHidden: true }), dialogContentProps: {\n            className: `sanddance-dialog ${props.theme}`,\n            type: base$1.fluentUI.DialogType.normal,\n            title: strings$1.labelConfirmation,\n            subText: strings$1.labelHistoryWarning\n          }, buttons: base$1.react.createElement(base$1.fluentUI.PrimaryButton, { text: strings$1.buttonApply, onClick: () => {\n            this.closeDialog();\n            this.props.onConfirmUpdate(this.state.columnTypes);\n          }, iconProps: { iconName: \"Accept\" } }) })\n        );\n      }\n    }\n    return new __ColumnTypeChanger(_props);\n  }\n  const ColumnTypeChanger = _ColumnTypeChanger;\n  const embedHtml = (title, embed) => `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>${title}</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/css/sanddance-explorer.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/css/sanddance-embed.css\" />\n</head>\n<body>\n    <script src=\"https://unpkg.com/react@17/umd/react.production.min.js\"><\\/script>\n    <script src=\"https://unpkg.com/react-dom@17/umd/react-dom.production.min.js\"><\\/script>\n    <script src=\"https://unpkg.com/vega@6.2/build/vega.min.js\"><\\/script>\n    <script src=\"https://unpkg.com/@fluentui/react@8/dist/fluentui-react.js\"><\\/script>\n    <script src=\"https://unpkg.com/@msrvida/fluentui-icons@1/dist/umd/fluentui-icons.js\"><\\/script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/umd/sanddance-explorer.js\"><\\/script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/umd/sanddance-embed.js\"><\\/script>\n    ${embed}\n</body>\n</html>`;\n  function convertToDelimited(data2, delimiter) {\n    const fields = Object.keys(data2[0]);\n    const file = data2.map((row) => {\n      return fields.map((fieldName) => {\n        const value2 = row[fieldName];\n        if (typeof value2 === \"number\") {\n          return value2;\n        }\n        if (typeof value2 === \"string\") {\n          if (value2.indexOf(delimiter) >= 0) {\n            return `\"${value2.replace(/\"/g, '\"\"')}\"`;\n          } else {\n            return value2;\n          }\n        }\n        return \"\";\n      }).join(delimiter);\n    });\n    file.unshift(fields.join(delimiter));\n    return file.join(\"\\n\");\n  }\n  const exportTypes = [\n    [\"json\", strings$1.labelExportJSON],\n    [\"csv\", strings$1.labelExportCSV],\n    [\"tsv\", strings$1.labelExportTSV],\n    [\"html\", strings$1.labelExportHTML]\n  ];\n  function _DataExportPicker(_props) {\n    class __DataExportPicker extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = this.getInitialState(this.props);\n      }\n      getInitialState(props) {\n        const initialState = {\n          initializer: props.initializer,\n          dialogHidden: true,\n          exportType: exportTypes[0][0],\n          fileName: props.initializer.fileName,\n          fileNameError: \"\",\n          working: false\n        };\n        return initialState;\n      }\n      componentDidUpdate() {\n        if (!deepCompare(this.props.initializer, this.state.initializer)) {\n          this.setState(this.getInitialState(this.props));\n        }\n      }\n      // Converts to dataExport type and calls dataExportHandler to deal with data\n      createExport(exportType, displayName) {\n        const final = (data2) => {\n          this.props.dataExportHandler(data2, exportType, displayName);\n          this.close();\n        };\n        const json2 = JSON.stringify(this.props.data, columnReplacer);\n        switch (exportType) {\n          case \"json\": {\n            final(json2);\n            break;\n          }\n          case \"csv\": {\n            final(convertToDelimited(JSON.parse(json2), \",\"));\n            break;\n          }\n          case \"tsv\": {\n            final(convertToDelimited(JSON.parse(json2), \"\t\"));\n            break;\n          }\n          case \"html\": {\n            const csv = convertToDelimited(JSON.parse(json2), \",\");\n            const html = embedHtml(`${strings$1.appName} - ${escape(displayName)}`, embedScript(csv, displayName));\n            final(html);\n          }\n        }\n      }\n      close() {\n        this.setState({ dialogHidden: true, working: false });\n      }\n      render() {\n        const closeDialog = () => this.close();\n        if (this.state.delayAction) {\n          requestAnimationFrame(() => {\n            if (this.state.delayAction) {\n              this.state.delayAction();\n              this.setState({ delayAction: null });\n            }\n          });\n        }\n        const disabled = this.state.working || this.state.dialogHidden;\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          base$1.react.createElement(base$1.fluentUI.DefaultButton, { className: \"search-action search-bottom-action\", text: strings$1.buttonExportCount(this.props.data.length), onClick: () => this.setState({ dialogHidden: false }), disabled: this.props.disabled }),\n          base$1.react.createElement(\n            Dialog$1,\n            { hidden: this.state.dialogHidden, onDismiss: closeDialog, dialogContentProps: {\n              className: `sanddance-dialog ${this.props.theme}`,\n              type: base$1.fluentUI.DialogType.normal,\n              title: strings$1.labelExport\n            }, buttons: [\n              base$1.react.createElement(base$1.fluentUI.PrimaryButton, { key: 0, disabled: disabled || !!this.state.fileNameError, onClick: (e) => this.setState({\n                delayAction: () => this.createExport(this.state.exportType, this.state.fileName),\n                working: true\n              }), text: strings$1.buttonExport, iconProps: {\n                iconName: \"Download\"\n              } })\n            ] },\n            base$1.react.createElement(base$1.fluentUI.TextField, { label: strings$1.labelExportFileName, onChange: (e, displayName) => {\n              const displayNameError = getFileNameError(displayName);\n              this.setState({ fileName: displayName, fileNameError: displayNameError });\n            }, errorMessage: this.state.fileNameError, value: this.state.fileName }),\n            base$1.react.createElement(base$1.fluentUI.ChoiceGroup, { className: \"sanddance-form-separate\", disabled, selectedKey: this.state.exportType, options: exportTypes.map(([exportType, text2]) => {\n              return {\n                key: exportType,\n                text: text2,\n                disabled: false\n              };\n            }), onChange: (ev, option) => this.setState({ exportType: option.key }), label: strings$1.labelExportFormat })\n          )\n        );\n      }\n    }\n    return new __DataExportPicker(_props);\n  }\n  const DataExportPicker = _DataExportPicker;\n  const illegalChars = '\\\\/:*?\"<>|';\n  function getFileNameError(displayName) {\n    if (!displayName) {\n      return strings$1.errorExportFilenameEmpty;\n    }\n    for (let i = 0; i < illegalChars.length; i++) {\n      if (displayName.indexOf(illegalChars[i]) >= 0) {\n        return strings$1.errorExportFilenameCharacters(illegalChars);\n      }\n    }\n  }\n  function removeExtensions(fileName) {\n    exportTypes.forEach(([exportType]) => {\n      const re2 = new RegExp(`\\\\.${exportType}`, \"ig\");\n      fileName = fileName.replace(re2, \"\");\n    });\n    return fileName;\n  }\n  function columnReplacer(name, value2) {\n    if (isInternalFieldName(name, true)) {\n      return void 0;\n    }\n    return value2 === null ? \"\" : value2;\n  }\n  function embedScript(csv, displayName, snapshots) {\n    const dataFile = { type: \"csv\", displayName, snapshots };\n    return `<pre id='csv-data' style='display:none'>${csv}</pre>\n    <script>SandDanceEmbed.load(Object.assign({rawText: document.getElementById('csv-data').innerText}, ${JSON.stringify(dataFile)}))<\\/script>`;\n  }\n  function getEmbedHTML(data2, displayName, snapshots) {\n    const json2 = JSON.stringify(data2, columnReplacer);\n    const csv = convertToDelimited(JSON.parse(json2), \",\");\n    const html = embedHtml(`${strings$1.appName} - ${escape(displayName)}`, embedScript(csv, displayName, snapshots));\n    return html;\n  }\n  function Group$1(props) {\n    return base$1.react.createElement(\n      \"div\",\n      { className: classList(\"sanddance-group\", props.className) },\n      base$1.react.createElement(\n        \"div\",\n        { className: \"group-head\" },\n        base$1.react.createElement(\"label\", null, props.label),\n        props.labelCount && base$1.react.createElement(\n          \"span\",\n          { className: \"count\" },\n          \"(\",\n          props.labelCount,\n          \")\"\n        )\n      ),\n      props.children && base$1.react.createElement(\"div\", { className: \"group-body\" }, props.children)\n    );\n  }\n  function ToggleColumns(props) {\n    return base$1.react.createElement(\"div\", null, props.allColumns.map((c2, i) => base$1.react.createElement(\n      \"div\",\n      { key: c2.name },\n      base$1.react.createElement(\n        \"label\",\n        null,\n        base$1.react.createElement(base$1.fluentUI.Toggle, { checked: props.exclusions.indexOf(c2.name) < 0, inlineLabel: true, label: c2.name, onChange: () => props.toggleExclusion(c2.name) })\n      )\n    )));\n  }\n  const singleFacetLayouts = [\n    { facetStyle: \"wrap\", text: strings$1.labelFacetLayoutWrap }\n    //{ facetStyle: 'horizontal', text: strings.labelFacetLayoutHorizontal },\n    //{ facetStyle: 'vertical', text: strings.labelFacetLayoutVertical }\n  ];\n  const chartLabelMap = [\n    {\n      key: \"grid\",\n      text: strings$1.chartTypeGrid\n    },\n    {\n      key: \"scatterplot\",\n      text: strings$1.chartTypeScatterPlot\n    },\n    {\n      key: \"density\",\n      text: strings$1.chartTypeDensity\n    },\n    {\n      key: \"barchartV\",\n      text: strings$1.chartTypeBarChartV\n    },\n    {\n      key: \"barchartH\",\n      text: strings$1.chartTypeBarChartH\n    },\n    {\n      key: \"treemap\",\n      text: strings$1.chartTypeTreeMap\n    },\n    {\n      key: \"strips\",\n      text: strings$1.chartTypeStrips\n    },\n    {\n      key: \"stacks\",\n      text: strings$1.chartTypeStacks\n    }\n  ];\n  function chartLabel(key2) {\n    for (let i = 0; i < chartLabelMap.length; i++) {\n      if (key2 === chartLabelMap[i].key) {\n        return chartLabelMap[i].text;\n      }\n    }\n  }\n  function _Chart(_props) {\n    class __Chart extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = {\n          showTooltipDialog: false\n        };\n        this.choiceRef = base$1.react.createRef();\n        props.explorer.dialogFocusHandler.focus = () => {\n          var _a2;\n          return (_a2 = this.choiceRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        };\n      }\n      render() {\n        const { props } = this;\n        const { explorer: explorer2, specCapabilities } = props;\n        const signals = explorer2.viewer && explorer2.viewer.vegaSpec && specCapabilities && specCapabilities.signals && explorer2.viewer.vegaSpec.signals.filter((s2) => specCapabilities.signals.indexOf(s2.name) >= 0);\n        const hasOptions = !!signals || (specCapabilities === null || specCapabilities === void 0 ? void 0 : specCapabilities.backgroundImage);\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelChart },\n            base$1.react.createElement(\n              \"div\",\n              { className: \"calculator\" },\n              base$1.react.createElement(base$1.fluentUI.ChoiceGroup, { componentRef: this.choiceRef, selectedKey: props.chart, className: \"sanddance-chart-type\", options: chartLabelMap.map((o) => {\n                return Object.assign(Object.assign({}, o), { disabled: props.disabled || o.key === \"treemap\" && props.quantitativeColumns.length === 0 });\n              }), onChange: (e, o) => props.explorer.changeChartType(o.key) })\n            )\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelColumnMapping },\n            base$1.react.createElement(\n              \"div\",\n              null,\n              specCapabilities && specCapabilities.roles.map((specRole, i) => {\n                const specColumnInRole = props.insightColumns[specRole.role];\n                const selectedColumnName = specColumnInRole;\n                let disabledColumnName;\n                let prefix;\n                let suffix;\n                let hideDropdown = false;\n                let { totalStyle } = props;\n                if (!totalStyle) {\n                  totalStyle = \"count-square\";\n                }\n                let { facetStyle } = props;\n                if (!facetStyle) {\n                  facetStyle = \"wrap\";\n                }\n                switch (specRole.role) {\n                  case \"facet\": {\n                    suffix = base$1.react.createElement(Dropdown$1, { disabled: !props.insightColumns.facet, collapseLabel: props.collapseLabels, label: strings$1.labelFacetLayout, calloutProps: { style: { minWidth: \"18em\" } }, options: [\n                      {\n                        key: \"header1\",\n                        text: `${strings$1.labelFacetLayout}:`,\n                        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n                      },\n                      ...singleFacetLayouts.map((f) => {\n                        const o = {\n                          key: f.facetStyle,\n                          text: f.text,\n                          data: f,\n                          selected: facetStyle === f.facetStyle\n                        };\n                        return o;\n                      }),\n                      {\n                        key: \"divider\",\n                        text: \"-\",\n                        itemType: base$1.fluentUI.DropdownMenuItemType.Divider\n                      },\n                      {\n                        key: \"header2\",\n                        text: `${strings$1.labelColumnFacetV}:`,\n                        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n                      },\n                      ...getColumnMapOptions(Object.assign(Object.assign({}, props), { specRole, selectedColumnName: props.insightColumns.facetV })).map((o) => {\n                        if (o.itemType !== base$1.fluentUI.DropdownMenuItemType.Header) {\n                          const facetData = {\n                            facetStyle: \"cross\",\n                            column: o.data\n                          };\n                          o.data = facetData;\n                          o.text = `${strings$1.labelFacetLayoutCross} ${o.text}`;\n                        }\n                        return o;\n                      })\n                    ], onChange: (e, o) => {\n                      const facetData = o.data;\n                      props.changeColumnMapping(\"facet\", \"facet\", null, { facetStyle: facetData.facetStyle });\n                      if (facetData.facetStyle === \"cross\") {\n                        props.changeColumnMapping(\"facetV\", clone(facetData.column));\n                      }\n                    } });\n                    break;\n                  }\n                  case \"facetV\": {\n                    hideDropdown = true;\n                    break;\n                  }\n                  case \"size\": {\n                    const options2 = [\n                      {\n                        key: \"count-square\",\n                        text: strings$1.labelTotalByCountSquare,\n                        data: \"count-square\",\n                        selected: !totalStyle || totalStyle === \"count-square\"\n                      },\n                      {\n                        key: \"count-strip\",\n                        text: strings$1.labelTotalByCountStrip,\n                        data: \"count-strip\",\n                        selected: totalStyle === \"count-strip\"\n                      },\n                      {\n                        key: \"sum-strip\",\n                        text: strings$1.labelTotalBySumStrip,\n                        data: \"sum-strip\",\n                        selected: totalStyle === \"sum-strip\"\n                      },\n                      {\n                        key: \"sum-treemap\",\n                        text: strings$1.labelTotalBySumTreemap,\n                        data: \"sum-treemap\",\n                        selected: totalStyle === \"sum-treemap\",\n                        disabled: props.quantitativeColumns.length === 0\n                      }\n                    ];\n                    if (specCapabilities.percentage) {\n                      options2.push({\n                        key: \"sum-strip-percent\",\n                        text: strings$1.labelTotalBySumStripPercent,\n                        data: \"sum-strip-percent\",\n                        selected: totalStyle === \"sum-strip-percent\",\n                        disabled: props.quantitativeColumns.length === 0\n                      });\n                    }\n                    prefix = !specCapabilities.countsAndSums ? null : base$1.react.createElement(Dropdown$1, { collapseLabel: props.collapseLabels, label: strings$1.labelTotal, calloutProps: { style: { minWidth: \"18em\" } }, options: options2, onChange: (e, o) => {\n                      const totalStyle2 = o.data;\n                      let defaultColumn;\n                      if (totalStyle2.indexOf(\"sum-\") === 0) {\n                        if (totalStyle2 === \"sum-treemap\") {\n                          defaultColumn = getTreemapColumn(props.allColumns);\n                        }\n                        defaultColumn = defaultColumn || props.quantitativeColumns[0];\n                      }\n                      props.changeColumnMapping(\"size\", \"size\", defaultColumn, { totalStyle: totalStyle2 });\n                    } });\n                    break;\n                  }\n                }\n                const disabled = props.disabled || specRole.disabled || specRole.role === \"size\" && !(!specCapabilities.countsAndSums || totalStyle.indexOf(\"sum-\") === 0) || specRole.role === \"sort\" && specCapabilities.countsAndSums && totalStyle === \"sum-treemap\";\n                return base$1.react.createElement(ColumnMap, Object.assign({}, props, { prefix, suffix, collapseLabel: props.collapseLabels, disabled, disabledColumnName, selectedColumnName, specRole, key: i, onChangeSignal: (name, value2) => props.onChangeSignal(specRole.role, selectedColumnName, name, value2), hideDropdown }));\n              }),\n              base$1.react.createElement(base$1.fluentUI.DefaultButton, { className: \"sanddance-chart-button\", text: strings$1.buttonTooltipMapping, onClick: () => this.setState({ showTooltipDialog: true }) })\n            )\n          ),\n          hasOptions && base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelChartTypeOptions },\n            signals && signals.map((signal, i) => base$1.react.createElement(Signal, { key: i, signal, explorer: explorer2, initialValue: getInitialSignalValue(explorer2, signal), disabled: props.disabled || this.disableSignal(signal), collapseLabel: props.collapseLabels, newViewStateTarget: false })),\n            (specCapabilities === null || specCapabilities === void 0 ? void 0 : specCapabilities.backgroundImage) && base$1.react.createElement(base$1.fluentUI.DefaultButton, { className: \"sanddance-chart-button\", text: strings$1.buttonBackgroundImage, onClick: () => {\n              let insightColumns;\n              switch (props.chart) {\n                case \"scatterplot\":\n                case \"stacks\": {\n                  insightColumns = props.insightColumns;\n                  break;\n                }\n              }\n              if (!insightColumns) {\n                insightColumns = props.explorer.changeChartType(\"scatterplot\");\n              }\n              this.backgroundImageEditor.show(insightColumns);\n            } })\n          ),\n          base$1.react.createElement(\n            Dialog$1,\n            { hidden: !this.state.showTooltipDialog, onDismiss: () => this.setState({ showTooltipDialog: false }), title: strings$1.labelTooltipMapping },\n            base$1.react.createElement(ToggleColumns, { allColumns: props.allColumns, exclusions: props.tooltipExclusions, toggleExclusion: props.toggleTooltipExclusion })\n          ),\n          base$1.react.createElement(BackgroundImageEditor, Object.assign({}, props, { ref: (e) => this.backgroundImageEditor = e }))\n        );\n      }\n      disableSignal(signal) {\n        if (this.props.view === \"2d\" && signal.name === SignalNames.ZGrounded) {\n          return true;\n        }\n        return false;\n      }\n    }\n    return new __Chart(_props);\n  }\n  const Chart = _Chart;\n  function TextField$1(props) {\n    return base$1.react.createElement(base$1.fluentUI.TextField, Object.assign({ onKeyUp: (e) => {\n      e.nativeEvent.stopImmediatePropagation();\n    } }, props));\n  }\n  const maxAutocomplete = 100;\n  function getValidOperators(column) {\n    const type2 = column && column.type;\n    switch (type2) {\n      case \"boolean\":\n        return [\n          [\"==\", strings$1.searchEQ],\n          [\"!=\", strings$1.searchNEQ],\n          [\"isnullorEmpty\", strings$1.searchNULL]\n        ];\n      case \"date\":\n      case \"integer\":\n      case \"number\":\n        return [\n          [\"==\", strings$1.searchEQ],\n          [\"!=\", strings$1.searchNEQ],\n          [\">\", strings$1.searchGT],\n          [\">=\", strings$1.searchGTE],\n          [\"<\", strings$1.searchLT],\n          [\"<=\", strings$1.searchLTE],\n          [\"isnullorEmpty\", strings$1.searchNULL]\n        ];\n      case \"string\":\n      default:\n        return [\n          [\"==\", strings$1.searchEQ],\n          [\"!=\", strings$1.searchNEQ],\n          [\">\", strings$1.searchGT],\n          [\">=\", strings$1.searchGTE],\n          [\"<\", strings$1.searchLT],\n          [\"<=\", strings$1.searchLTE],\n          [\"contains\", strings$1.searchIN],\n          [\"starts\", strings$1.searchSW],\n          [\"isnullorEmpty\", strings$1.searchNULL]\n        ];\n    }\n  }\n  function getExpressionClauses(currClause, disableOR) {\n    const keys2 = [\n      [\"&&\", strings$1.searchAND]\n    ];\n    if (!disableOR) {\n      keys2.push([\"||\", strings$1.searchOR]);\n    }\n    return keys2.map((key2, i) => {\n      const [clause, text2] = key2;\n      const selected = currClause == clause;\n      const option = {\n        key: i,\n        text: text2,\n        data: clause,\n        selected\n      };\n      return option;\n    });\n  }\n  function getOperators(ex, column) {\n    let anySelected = false;\n    const validOperators = getValidOperators(column);\n    const options2 = validOperators.map((validoperator) => {\n      const [op, text2] = validoperator;\n      const selected = ex.operator === op;\n      anySelected = anySelected || selected;\n      const option = {\n        key: op,\n        text: text2,\n        data: op,\n        selected\n      };\n      return option;\n    });\n    if (!anySelected) {\n      options2[0].selected = true;\n    }\n    return options2;\n  }\n  function getDistinctValues(data2, columnName) {\n    const distinctMap = {};\n    for (let i = 0; i < data2.length; i++) {\n      const row = data2[i];\n      const value2 = row[columnName];\n      distinctMap[value2] = true;\n    }\n    return Object.keys(distinctMap).sort();\n  }\n  function getValues(ex, column, data2, autoCompleteDistinctValues) {\n    const stats = column && column.stats;\n    if (stats && stats.distinctValueCount < maxAutocomplete) {\n      if (!autoCompleteDistinctValues[column.name]) {\n        autoCompleteDistinctValues[column.name] = getDistinctValues(data2, column.name);\n      }\n      return autoCompleteDistinctValues[column.name].map((v, i) => ({\n        key: i,\n        text: v\n      }));\n    }\n    return [];\n  }\n  function getText(ex) {\n    if (ex.operator === \"isnullorEmpty\")\n      return \"\";\n    return typeof ex.value === \"string\" ? ex.value : ex.value == null ? \"\" : ex.value.toString();\n  }\n  function SearchTerm(props) {\n    const ex = props.searchExpression;\n    const possibleValues = getValues(ex, props.column, props.data, props.autoCompleteDistinctValues);\n    return base$1.react.createElement(\n      \"div\",\n      null,\n      props.index > 0 && base$1.react.createElement(Dropdown$1, { collapseLabel: props.collapseLabels, className: \"search-field\", label: strings$1.labelSearchClause, dropdownWidth: 120, disabled: !ex.unlocked || props.disableOR, options: getExpressionClauses(ex.clause, props.disableOR), onChange: (e, o) => props.onUpdateExpression({ clause: o.data }, props.index) }),\n      base$1.react.createElement(Dropdown$1, { componentRef: props.dropdownRef, collapseLabel: props.collapseLabels, className: \"search-field\", label: strings$1.labelSearchColumn, options: [\n        {\n          key: \"\",\n          text: strings$1.selectAny,\n          data: null,\n          selected: ex.name === null\n        }\n      ].concat(props.columns.map((c2, i) => ({\n        key: c2.name,\n        text: c2.name,\n        data: c2,\n        selected: c2.name === ex.name\n      }))), onChange: (e, o) => props.onUpdateExpression({ name: o.data && o.data.name || null }, props.index) }),\n      base$1.react.createElement(Dropdown$1, { collapseLabel: props.collapseLabels, className: \"search-field\", label: strings$1.labelSearchOperator, dropdownWidth: 120, options: getOperators(ex, props.column), onChange: (e, o) => props.onUpdateExpression({ operator: o.data }, props.index) }),\n      possibleValues.length > 0 && base$1.react.createElement(base$1.fluentUI.ComboBox, { className: \"search-field\", label: props.collapseLabels ? null : strings$1.labelSearchValue, placeholder: strings$1.labelSearchValuePlaceholder, disabled: ex.operator === \"isnullorEmpty\", dropdownWidth, allowFreeform: true, autoComplete: \"on\", errorMessage: ex.errorMessage, text: getText(ex), options: getValues(ex, props.column, props.data, props.autoCompleteDistinctValues), onChange: (e, o, i, value2) => {\n        if (o) {\n          value2 = o.text;\n        }\n        props.onUpdateExpression({ value: value2 }, props.index);\n      } }),\n      possibleValues.length === 0 && base$1.react.createElement(TextField$1, { className: \"search-field\", label: props.collapseLabels ? null : strings$1.labelSearchValue, placeholder: strings$1.labelSearchValuePlaceholder, disabled: ex.operator === \"isnullorEmpty\", errorMessage: ex.errorMessage, value: getText(ex), onChange: (e, v) => props.onUpdateExpression({ value: v }, props.index) })\n    );\n  }\n  function Button(props) {\n    return base$1.react.createElement(base$1.fluentUI.DefaultButton, Object.assign({}, props, { styles: {\n      root: Object.assign({ backgroundColor: \"transparent\", height: \"30px\", width: props.width, padding: 0 }, props.rootStyle),\n      rootDisabled: {\n        backgroundColor: \"transparent\"\n      },\n      icon: {\n        color: props.themePalette.themePrimary\n      },\n      label: {\n        fontWeight: \"400\",\n        textAlign: props.textAlign || \"left\"\n      }\n    }, iconProps: { iconName: props.iconName } }));\n  }\n  const maxClauses = 5;\n  function getColumnWithName(columnName, columns) {\n    for (let i = 0; i < columns.length; i++) {\n      if (columns[i].name === columnName)\n        return columns[i];\n    }\n  }\n  function validateExpression(ex) {\n    if (ex.operator === \"isnullorEmpty\") {\n      ex.errorMessage = null;\n      return;\n    }\n    const s2 = getText(ex);\n    if (s2.length === 0) {\n      ex.errorMessage = strings$1.labelRequired;\n    } else {\n      ex.errorMessage = null;\n    }\n  }\n  function clearExpressionValidation(ex) {\n    if (ex.operator === \"isnullorEmpty\") {\n      ex.errorMessage = null;\n      return;\n    }\n    const s2 = getText(ex);\n    if (s2.length !== 0) {\n      ex.errorMessage = null;\n    }\n  }\n  function getGroupClauses(currClause, index2, disableGroupOR) {\n    let keys2;\n    if (index2 === 0) {\n      keys2 = [\n        [null, strings$1.searchWHERE]\n      ];\n    } else {\n      keys2 = [\n        [\"&&\", strings$1.searchAND]\n      ];\n      if (!disableGroupOR) {\n        keys2.push([\"||\", strings$1.searchOR]);\n      }\n    }\n    return keys2.map((key2, i) => {\n      const [clause, text2] = key2;\n      const selected = currClause == clause;\n      const option = {\n        key: i,\n        text: text2,\n        data: clause,\n        selected\n      };\n      return option;\n    });\n  }\n  function _Search(_props) {\n    class __Search extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = this.getInitialState(this.props);\n        this.dropdownRef = base$1.react.createRef();\n        props.explorer.dialogFocusHandler.focus = () => {\n          var _a2;\n          return (_a2 = this.dropdownRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        };\n      }\n      getInitialState(props) {\n        const initialState = {\n          groups: props.initializer.search || [this.newGroup(0, null)],\n          sortedColumns: [...props.initializer.columns].sort((a2, b2) => a2.name.localeCompare(b2.name)),\n          initializer: props.initializer\n        };\n        initialState.groups.forEach((group2) => {\n          group2.expressions.forEach((ex) => ex.unlocked = group2.expressions.length <= 2);\n        });\n        return initialState;\n      }\n      componentDidUpdate() {\n        if (!deepCompare(this.props.initializer, this.state.initializer)) {\n          this.setState(this.getInitialState(this.props));\n        }\n      }\n      validateAndSearch() {\n        const groups = [...this.state.groups];\n        groups.forEach((group2) => {\n          group2.expressions.forEach(validateExpression);\n          const errors = group2.expressions.reduce((p, c2) => p || c2.errorMessage, \"\");\n          if (errors) {\n            this.setState({ groups });\n          } else {\n            this.props.onSelect(this.state.groups);\n          }\n        });\n      }\n      newGroup(key2, clause) {\n        const group2 = {\n          key: key2,\n          clause,\n          expressions: [this.newExpression(0, null)]\n        };\n        return group2;\n      }\n      updateGroup(partialGroup, groupIndex) {\n        const groups = [...this.state.groups];\n        const group2 = Object.assign(Object.assign({}, groups[groupIndex]), partialGroup);\n        groups[groupIndex] = group2;\n        this.setState({ groups });\n      }\n      addGroup() {\n        const groups = [...this.state.groups];\n        const maxKey = groups.reduce((max2, p) => p.key > max2 ? p.key : max2, groups[0].key);\n        const newGroup = this.newGroup(maxKey + 1, \"&&\");\n        groups.push(newGroup);\n        this.setState({ groups });\n      }\n      deleteGroup(groupIndex) {\n        const groups = [...this.state.groups];\n        groups.splice(groupIndex, 1);\n        this.setState({ groups });\n      }\n      newExpression(key2, clause) {\n        const ex = { key: key2, clause, name: null, operator: \"contains\", value: \"\" };\n        return ex;\n      }\n      addExpression(groupIndex) {\n        const groups = [...this.state.groups];\n        const group2 = Object.assign({}, groups[groupIndex]);\n        const expressions = [...group2.expressions];\n        const maxKey = expressions.reduce((max2, p) => p.key > max2 ? p.key : max2, expressions[0].key);\n        const newEx = this.newExpression(maxKey + 1, \"&&\");\n        expressions.push(newEx);\n        if (expressions.length === 2) {\n          newEx.unlocked = true;\n        } else {\n          expressions.forEach((ex) => ex.unlocked = false);\n          newEx.clause = expressions[1].clause;\n        }\n        group2.expressions = expressions;\n        groups[groupIndex] = group2;\n        this.setState({ groups });\n      }\n      updateExpression(partialEx, groupIndex, index2) {\n        const groups = [...this.state.groups];\n        const group2 = Object.assign({}, groups[groupIndex]);\n        const expressions = [...group2.expressions];\n        const currentEx = expressions[index2];\n        if (currentEx.name !== partialEx.name) {\n          const oldColumn = getColumnWithName(currentEx.name, this.state.sortedColumns);\n          const newColumn = getColumnWithName(partialEx.name, this.state.sortedColumns);\n          const oldType = oldColumn && oldColumn.type;\n          const newType = newColumn && newColumn.type;\n          if (oldType !== newType) {\n            const newOperators = getValidOperators(newColumn).map((validOperator) => validOperator[0]);\n            if (newOperators.indexOf(currentEx.operator) < 0) {\n              partialEx.operator = \"==\";\n            }\n          }\n        }\n        const ex = Object.assign(Object.assign({}, currentEx), partialEx);\n        clearExpressionValidation(ex);\n        expressions[index2] = ex;\n        group2.expressions = expressions;\n        groups[groupIndex] = group2;\n        this.setState({ groups });\n      }\n      deleteExpression(groupIndex, index2) {\n        const groups = [...this.state.groups];\n        const group2 = Object.assign({}, groups[groupIndex]);\n        const expressions = [...group2.expressions];\n        expressions.splice(index2, 1);\n        if (expressions.length === 2) {\n          expressions[1].unlocked = true;\n        }\n        group2.expressions = expressions;\n        groups[groupIndex] = group2;\n        this.setState({ groups });\n      }\n      render() {\n        return base$1.react.createElement(\n          Group$1,\n          { className: \"sanddance-search\", label: strings$1.labelSearch },\n          base$1.react.createElement(\n            \"div\",\n            null,\n            this.state.groups.map((group2, groupIndex) => base$1.react.createElement(\n              \"div\",\n              { className: \"sanddance-search-group\", key: group2.key },\n              base$1.react.createElement(Dropdown$1, { collapseLabel: this.props.collapseLabels, className: \"search-group-clause\", label: strings$1.labelSearchClause, disabled: groupIndex === 0 || this.props.disableGroupOR, dropdownWidth: 120, options: getGroupClauses(group2.clause, groupIndex, this.props.disableGroupOR), onChange: (e, o) => this.updateGroup({ clause: o.data }, groupIndex) }),\n              base$1.react.createElement(\"div\", null, group2.expressions.map((ex, i) => base$1.react.createElement(\n                \"div\",\n                { className: \"sanddance-search-expression\", key: ex.key },\n                base$1.react.createElement(SearchTerm, { dropdownRef: groupIndex === 0 && i === 0 ? this.dropdownRef : void 0, collapseLabels: this.props.collapseLabels, onUpdateExpression: (ex2, i2) => this.updateExpression(ex2, groupIndex, i2), autoCompleteDistinctValues: this.props.autoCompleteDistinctValues, index: i, columns: this.state.sortedColumns, data: this.props.data, searchExpression: ex, disableOR: this.props.disableExpressionOR, column: getColumnWithName(ex.name, this.state.sortedColumns) }),\n                group2.expressions.length > 1 && base$1.react.createElement(Button, { themePalette: this.props.themePalette, className: \"search-action\", iconName: \"Cancel\", onClick: () => this.deleteExpression(groupIndex, i), text: strings$1.buttonDeleteExpression })\n              ))),\n              group2.expressions.length < maxClauses && base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(Button, { themePalette: this.props.themePalette, className: \"search-action\", iconName: \"Add\", onClick: () => this.addExpression(groupIndex), text: strings$1.buttonAddExpression })\n              ),\n              this.state.groups.length > 1 && base$1.react.createElement(Button, { themePalette: this.props.themePalette, className: \"search-action\", iconName: \"Cancel\", onClick: () => this.deleteGroup(groupIndex), text: strings$1.buttonDeleteExpressionGroup })\n            )),\n            this.state.groups.length < maxClauses && base$1.react.createElement(\n              \"div\",\n              null,\n              base$1.react.createElement(Button, { themePalette: this.props.themePalette, className: \"search-action search-bottom-action\", iconName: \"Add\", onClick: () => this.addGroup(), text: strings$1.buttonAddExpressionGroup })\n            )\n          ),\n          base$1.react.createElement(base$1.fluentUI.PrimaryButton, { className: \"search-action search-bottom-action\", text: strings$1.buttonSelect, onClick: () => this.validateAndSearch() })\n        );\n      }\n    }\n    return new __Search(_props);\n  }\n  const Search = _Search;\n  var PresenterElement = PresenterElement$1;\n  function getCanvas(viewer) {\n    const tags = viewer.presenter.getElement(PresenterElement.gl).getElementsByTagName(\"canvas\");\n    if (tags) {\n      return tags[0];\n    }\n  }\n  function removeTabIndex(viewer) {\n    const canvas = getCanvas(viewer);\n    if (canvas) {\n      canvas.tabIndex = -1;\n    }\n  }\n  const capabilities = {\n    webgl: !!document.createElement(\"canvas\").getContext(\"webgl\"),\n    webgl2: !!document.createElement(\"canvas\").getContext(\"webgl2\")\n  };\n  const version$2 = \"4.1.8\";\n  var SandDance = index$4;\n  var DataRefType;\n  (function(DataRefType2) {\n    DataRefType2[DataRefType2[\"none\"] = 0] = \"none\";\n    DataRefType2[DataRefType2[\"inline\"] = 1] = \"inline\";\n    DataRefType2[DataRefType2[\"url\"] = 2] = \"url\";\n  })(DataRefType || (DataRefType = {}));\n  function filterSignals(signal) {\n    switch (signal.name) {\n      case SandDance.constants.SignalNames.XBins:\n      case SandDance.constants.SignalNames.YBins:\n      case SandDance.constants.SignalNames.FacetBins:\n      case SandDance.constants.SignalNames.FacetVBins:\n      case SandDance.constants.SignalNames.ColorBinCount:\n      case SandDance.constants.SignalNames.ColorReverse:\n      case SandDance.constants.SignalNames.PointScale:\n      case SandDance.constants.SignalNames.TreeMapMethod:\n      case SandDance.constants.SignalNames.ZGrounded:\n        return false;\n      default:\n        return !!signal.bind;\n    }\n  }\n  function cloneData(vegaSpec) {\n    const data0 = vegaSpec.data[0];\n    const valuesData = data0;\n    const values2 = valuesData.values;\n    delete valuesData.values;\n    const data2 = SandDance.VegaMorphCharts.util.clone(vegaSpec.data);\n    valuesData.values = values2;\n    return { data: data2, values: values2 };\n  }\n  function cloneScales(vegaSpec) {\n    return SandDance.VegaMorphCharts.util.clone(vegaSpec.scales);\n  }\n  function serializeSpec(vegaSpec, datafile, dataRefType, transform2, scheme2) {\n    const scales2 = cloneScales(vegaSpec);\n    const colorScale = scales2.filter((scale2) => scale2.name === SandDance.constants.ScaleNames.Color)[0];\n    if (scheme2.indexOf(\"dual_\") >= 0) {\n      colorScale.range = SandDance.colorSchemes.filter((cs) => cs.scheme === scheme2)[0].colors;\n    }\n    const clone2 = cloneData(vegaSpec);\n    const data0 = clone2.data[0];\n    if (dataRefType === DataRefType.inline) {\n      const valuesData = data0;\n      valuesData.format = { parse: \"auto\", type: \"json\" };\n      valuesData.values = clone2.values;\n    } else if (dataRefType === DataRefType.none) {\n      const valuesData = data0;\n      valuesData.values = [];\n      if (transform2) {\n        if (valuesData.transform) {\n          valuesData.transform.push.apply(valuesData.transform, transform2);\n        } else {\n          valuesData.transform = transform2;\n        }\n      }\n    } else if (dataRefType === DataRefType.url) {\n      const urlData = data0;\n      urlData.url = datafile.dataUrl;\n      urlData.format = { parse: \"auto\", type: datafile.type };\n      if (transform2) {\n        if (urlData.transform) {\n          urlData.transform.push.apply(urlData.transform, transform2);\n        } else {\n          urlData.transform = transform2;\n        }\n      }\n    }\n    return Object.assign(Object.assign({}, vegaSpec), { data: clone2.data, scales: scales2 });\n  }\n  function defaultDataRefType(datafile) {\n    if (datafile.dataUrl) {\n      return DataRefType.url;\n    }\n    return DataRefType.none;\n  }\n  function initState(props) {\n    return {\n      showSystemDialog: false,\n      showVegaDialog: false,\n      dataRefType: defaultDataRefType(props.dataFile),\n      spec: null\n    };\n  }\n  function signalGroupKey(key2) {\n    for (let i = 0; i < strings$1.signalGroups.length; i++) {\n      if (strings$1.signalGroups[i].prefix === key2) {\n        return key2;\n      }\n    }\n    return \"*\";\n  }\n  function vegaSignalGroups(vegaSignals) {\n    const signalGroupMap = {};\n    vegaSignals.forEach((vs) => {\n      const split = vs.name.split(\"_\");\n      const key2 = signalGroupKey(split[0]);\n      signalGroupMap[key2] = signalGroupMap[key2] || [];\n      signalGroupMap[key2].push(vs);\n    });\n    return signalGroupMap;\n  }\n  function _Settings(_props) {\n    class __Settings extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = initState(props);\n      }\n      render() {\n        const { props, state } = this;\n        if (!props.explorer.viewer || !props.explorer.viewer.vegaSpec)\n          return null;\n        const options2 = [\n          {\n            key: DataRefType.none,\n            text: strings$1.selectVegaSpecDataNone,\n            selected: this.state.dataRefType === DataRefType.none,\n            data: DataRefType.none\n          },\n          !props.dataFile.rawText && {\n            key: DataRefType.url,\n            text: strings$1.selectVegaSpecDataUrl,\n            selected: this.state.dataRefType === DataRefType.url,\n            data: DataRefType.url\n          },\n          {\n            key: DataRefType.inline,\n            text: strings$1.selectVegaSpecDataInline,\n            selected: this.state.dataRefType === DataRefType.inline,\n            data: DataRefType.inline\n          }\n        ].filter(Boolean);\n        const signalGroupMap = vegaSignalGroups(props.explorer.viewer.vegaSpec.signals);\n        let first = true;\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          strings$1.signalGroups.map((sg, gi) => {\n            const vegaSignals = signalGroupMap[sg.prefix];\n            if (vegaSignals) {\n              const filteredVegaSignals = vegaSignals.filter(filterSignals);\n              if (filteredVegaSignals.length > 0) {\n                return base$1.react.createElement(Group$1, { key: sg.prefix, label: sg.label }, filteredVegaSignals.map((signal, i) => {\n                  const ref2 = base$1.react.createRef();\n                  if (first) {\n                    first = false;\n                    props.explorer.dialogFocusHandler.focus = () => {\n                      const f = ref2.current;\n                      if (f === null || f === void 0 ? void 0 : f.focus) {\n                        f.focus();\n                      }\n                    };\n                  }\n                  return base$1.react.createElement(Signal, { componentRef: ref2, key: i, signal, explorer: props.explorer, initialValue: getInitialSignalValue(props.explorer, signal), newViewStateTarget: false });\n                }));\n              }\n            }\n          }),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelChartCanvas },\n            base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.labelShowAxes, defaultChecked: !props.hideAxes, onChange: (e, checked) => props.onToggleAxes(!checked) }),\n            base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.labelShowLegend, defaultChecked: !props.hideLegend, onChange: (e, checked) => props.onToggleLegend(!checked) })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTools },\n            base$1.react.createElement(base$1.fluentUI.DefaultButton, { text: strings$1.buttonShowVegaSpec, onClick: () => this.setState({\n              showVegaDialog: true,\n              spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, this.state.dataRefType, props.explorer.viewer.getInsight().transform, this.props.scheme)\n            }) })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelSnapshots },\n            base$1.react.createElement(base$1.fluentUI.Slider, { label: strings$1.labelSnapshotSettingThumbnailWidth, onChange: (value2) => {\n              this.props.explorer.snapshotThumbWidth = value2;\n            }, min: 100, max: 800, defaultValue: this.props.explorer.snapshotThumbWidth })\n          ),\n          props.additionalSettings && props.additionalSettings.map((g, i) => base$1.react.createElement(Group$1, { key: i, label: g.groupLabel }, g.children)),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelSystem },\n            base$1.react.createElement(base$1.fluentUI.DefaultButton, { text: strings$1.labelSystemInfo, onClick: () => this.setState({ showSystemDialog: true }) })\n          ),\n          base$1.react.createElement(\n            Dialog$1,\n            { hidden: !state.showVegaDialog, onDismiss: () => this.setState(initState(this.props)), minWidth: \"80%\", title: strings$1.labelVegaSpec, buttons: [\n              base$1.react.createElement(base$1.fluentUI.PrimaryButton, { key: \"copy\", iconProps: { iconName: \"Copy\" }, text: strings$1.buttonCopyToClipboard, onClick: () => {\n                const pre = document.getElementById(\"sanddance-vega-spec\");\n                const range2 = document.createRange();\n                range2.selectNode(pre);\n                const selection = window.getSelection();\n                selection.removeAllRanges();\n                selection.addRange(range2);\n                document.execCommand(\"copy\");\n              } }),\n              base$1.react.createElement(base$1.fluentUI.DefaultButton, { key: \"edit\", iconProps: { iconName: \"OpenInNewWindow\" }, text: strings$1.buttonLaunchVegaEditor, onClick: () => {\n                window.open(\"https://vega.github.io/editor/\", \"_blank\");\n              } })\n            ] },\n            base$1.react.createElement(Dropdown$1, { label: strings$1.labelVegaSpecData, options: options2, onChange: (e, o) => this.setState({\n              dataRefType: o.data,\n              spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, o.data, props.explorer.viewer.getInsight().transform, this.props.scheme)\n            }) }),\n            base$1.react.createElement(\"pre\", { id: \"sanddance-vega-spec\" }, JSON.stringify(this.state.spec, null, 2)),\n            base$1.react.createElement(\"div\", null, strings$1.labelVegaSpecNotes)\n          ),\n          base$1.react.createElement(\n            Dialog$1,\n            { hidden: !state.showSystemDialog, onDismiss: () => this.setState(initState(this.props)), title: strings$1.labelSystemInfo },\n            base$1.react.createElement(\n              \"ul\",\n              null,\n              this.props.children,\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"SandDanceExplorer version: \",\n                version$2\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"SandDanceReact version: \",\n                version$3\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"SandDance version: \",\n                SandDance.version\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"Vega-MorphCharts version: \",\n                SandDance.VegaMorphCharts.version\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"WebGL enabled: \",\n                capabilities.webgl ? strings$1.labelYes : strings$1.labelNo\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"WebGL2 enabled: \",\n                capabilities.webgl2 ? strings$1.labelYes : strings$1.labelNo\n              )\n            )\n          )\n        );\n      }\n    }\n    return new __Settings(_props);\n  }\n  const Settings = _Settings;\n  function _SnapshotEditor(_props) {\n    class __SnapshotEditor extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = {\n          showEditFormDialog: false,\n          title: \"\",\n          description: \"\",\n          image: null,\n          bgColor: null,\n          insight: null,\n          editIndex: -1\n        };\n      }\n      resize(src, thumbWidth) {\n        if (!src)\n          return;\n        const img = new Image();\n        img.onload = () => {\n          const canvas = document.createElement(\"canvas\"), ctx = canvas.getContext(\"2d\");\n          const ratio = img.width / thumbWidth;\n          canvas.height = img.height / ratio;\n          canvas.width = thumbWidth;\n          ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n          const image2 = canvas.toDataURL();\n          this.setState({ image: image2 });\n        };\n        img.src = src;\n      }\n      editSnapshot(snapshot, editIndex = -1) {\n        if (snapshot) {\n          this.setState(Object.assign(Object.assign({ showEditFormDialog: true }, snapshot), { editIndex }));\n        } else {\n          const { explorer: explorer2 } = this.props;\n          const signalValues = explorer2.viewer.getSignalValues();\n          explorer2.viewer.deselect().then(() => {\n            const canvas = getCanvas(explorer2.viewer);\n            const bgColor = canvas && window.getComputedStyle(canvas).backgroundColor;\n            const insight = clone(explorer2.viewer.getInsight());\n            delete insight.size;\n            insight.signalValues = signalValues;\n            const title = this.props.getTitle && this.props.getTitle(insight) || \"\";\n            const description = this.props.getDescription && this.props.getDescription(insight) || \"\";\n            this.setState({ showEditFormDialog: true, bgColor, title, description, insight, image: null, editIndex });\n            setTimeout(() => {\n              explorer2.viewer.presenter.canvasToDataURL().then((dataUrl) => {\n                this.resize(dataUrl, explorer2.snapshotThumbWidth);\n              });\n            }, 500);\n          });\n        }\n      }\n      render() {\n        var _a2, _b2;\n        const { explorer: explorer2 } = this.props;\n        return base$1.react.createElement(\n          Dialog$1,\n          { modalProps: { className: classList(\"sanddance-snapshot-dialog\", this.props.theme) }, minWidth: `${explorer2.snapshotThumbWidth + 64}px`, hidden: !this.state.showEditFormDialog, onDismiss: () => this.setState({ showEditFormDialog: false }), title: this.state.editIndex >= 0 ? strings$1.buttonEditSnapshot : strings$1.buttonCreateSnapshot, buttons: base$1.react.createElement(base$1.fluentUI.PrimaryButton, { disabled: !this.state.image || !this.state.title, key: 0, onClick: (e) => {\n            const setup2 = clone(explorer2.getSetup());\n            if (setup2.camera !== \"hold\") {\n              setup2.camera = explorer2.viewer.getCamera();\n            }\n            const snapshot = {\n              title: this.state.title,\n              description: this.state.description,\n              insight: this.state.insight,\n              image: this.state.image,\n              bgColor: this.state.bgColor,\n              setup: setup2\n            };\n            this.props.modifySnapShot && this.props.modifySnapShot(snapshot);\n            this.props.onWriteSnapshot(snapshot, this.state.editIndex);\n            this.setState({ showEditFormDialog: false, title: \"\", description: \"\", image: null });\n          }, iconProps: { iconName: \"Camera\" }, text: this.state.editIndex >= 0 ? strings$1.buttonUpdateSnapshot : strings$1.buttonCreateSnapshot }) },\n          base$1.react.createElement(base$1.fluentUI.TextField, { label: strings$1.labelSnapshotTitle, onChange: (e, title) => this.setState({ title }), value: this.state.title }),\n          base$1.react.createElement(base$1.fluentUI.TextField, { label: strings$1.labelSnapshotDescription, onChange: (e, description) => this.setState({ description }), value: this.state.description, multiline: true }),\n          base$1.react.createElement(\n            \"div\",\n            { className: \"thumbnail\" },\n            !this.state.image && base$1.react.createElement(base$1.fluentUI.Spinner, null),\n            this.state.image && base$1.react.createElement(\"img\", { src: this.state.image, style: { backgroundColor: this.state.bgColor } })\n          ),\n          ((_b2 = (_a2 = explorer2.viewer) === null || _a2 === void 0 ? void 0 : _a2.colorContexts) === null || _b2 === void 0 ? void 0 : _b2.length) > 1 && base$1.react.createElement(\"div\", null, strings$1.labelColorFilter)\n        );\n      }\n    }\n    return new __SnapshotEditor(_props);\n  }\n  const SnapshotEditor = _SnapshotEditor;\n  function _Snapshots(_props) {\n    class __Snapshots extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = {\n          confirmation: null,\n          title: \"\",\n          description: \"\",\n          image: null,\n          bgColor: null,\n          insight: null\n        };\n      }\n      render() {\n        const items = [\n          {\n            key: \"clear\",\n            text: strings$1.buttonClearSnapshots,\n            onClick: () => this.setState({\n              confirmation: {\n                buttonText: strings$1.buttonClearSnapshots,\n                handler: () => this.props.onClearSnapshots()\n              }\n            }),\n            disabled: this.props.snapshots.length === 0\n          }\n        ];\n        if (this.props.getTopActions) {\n          items.push.apply(items, this.props.getTopActions(this.props.snapshots));\n        }\n        const ref2 = base$1.react.createRef();\n        this.props.explorer.dialogFocusHandler.focus = () => {\n          var _a2;\n          (_a2 = ref2.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        };\n        return base$1.react.createElement(\n          Group$1,\n          { className: \"sanddance-snapshots\", label: strings$1.labelSnapshots },\n          base$1.react.createElement(\n            \"div\",\n            null,\n            base$1.react.createElement(base$1.fluentUI.PrimaryButton, { componentRef: ref2, text: strings$1.buttonCreateSnapshot, onClick: (e) => this.props.editor.editSnapshot(), split: true, menuProps: {\n              items\n            } }),\n            this.props.getChildren && this.props.getChildren(this.props.snapshots),\n            this.state.confirmation && base$1.react.createElement(Dialog$1, { hidden: false, buttons: base$1.react.createElement(base$1.fluentUI.PrimaryButton, { key: 0, onClick: (e) => {\n              this.setState({ confirmation: null });\n              this.state.confirmation.handler();\n            }, iconProps: { iconName: \"Delete\" }, text: this.state.confirmation.buttonText }), onDismiss: () => this.setState({ confirmation: null }) }, strings$1.labelConfirmation),\n            base$1.react.createElement(\"div\", null, this.props.snapshots.map((snapshot, i) => {\n              const actions = this.props.getActions && this.props.getActions(snapshot, i) || [];\n              actions.push({\n                iconButtonProps: {\n                  themePalette: this.props.themePalette,\n                  title: strings$1.buttonEditSnapshot,\n                  onClick: (e) => this.props.editor.editSnapshot(snapshot, i),\n                  iconName: \"Edit\"\n                }\n              });\n              if (this.props.snapshots.length > 1) {\n                actions.push({\n                  iconButtonProps: {\n                    disabled: i === 0,\n                    themePalette: this.props.themePalette,\n                    title: strings$1.buttonMoveUp,\n                    onClick: (e) => this.props.onMoveUp(i),\n                    iconName: \"SortUp\"\n                  }\n                }, {\n                  iconButtonProps: {\n                    disabled: i > this.props.snapshots.length - 2,\n                    themePalette: this.props.themePalette,\n                    title: strings$1.buttonMoveDown,\n                    onClick: (e) => this.props.onMoveDown(i),\n                    iconName: \"SortDown\"\n                  }\n                });\n              }\n              actions.push({\n                iconButtonProps: {\n                  themePalette: this.props.themePalette,\n                  title: strings$1.buttonDeleteSnapshot,\n                  onClick: () => this.setState({\n                    confirmation: {\n                      buttonText: strings$1.buttonDeleteSnapshot,\n                      handler: () => this.props.onRemoveSnapshot(i)\n                    }\n                  }),\n                  iconName: \"Delete\"\n                }\n              });\n              return base$1.react.createElement(\n                \"div\",\n                { key: i, className: classList(\"snapshot\", i === this.props.selectedSnapshotIndex && \"selected\") },\n                base$1.react.createElement(\n                  \"div\",\n                  { onClick: (e) => this.props.onSnapshotClick(snapshot, i) },\n                  base$1.react.createElement(\"div\", { className: \"title\" }, snapshot.title),\n                  base$1.react.createElement(\n                    \"div\",\n                    { className: \"thumbnail\" },\n                    base$1.react.createElement(\"img\", { title: snapshot.description, src: snapshot.image, style: { backgroundColor: snapshot.bgColor } })\n                  )\n                ),\n                base$1.react.createElement(Actions, { actions, snapshot })\n              );\n            }))\n          )\n        );\n      }\n    }\n    return new __Snapshots(_props);\n  }\n  const Snapshots = _Snapshots;\n  function Actions(props) {\n    return base$1.react.createElement(\"div\", { className: \"actions\" }, props.actions.map((action, i) => {\n      if (action.iconButtonProps) {\n        return base$1.react.createElement(IconButton$1, Object.assign({ key: i }, action.iconButtonProps));\n      }\n      if (action.element) {\n        return action.element;\n      }\n    }));\n  }\n  const positions = [\n    [\"x\", strings$1.labelAliasX],\n    [\"y\", strings$1.labelAliasY],\n    [\"z\", strings$1.labelAliasZ]\n  ];\n  const autoScrubInterval = 50;\n  function _TransitionEditor(_props) {\n    class __TransitionEditor extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = Object.assign({ scrub: 100, pauseDisabled: true }, this.initialCalc(props.transitionDurations));\n        this.autoScrubber = new AutoScrubber(autoScrubInterval, (direction, interval2) => {\n          const totalMs = this.state.totalTransition * 1e3;\n          const currentMs = this.state.scrub / 100 * totalMs;\n          const scrubMs = currentMs + direction * interval2;\n          let scrub = scrubMs / totalMs * 100;\n          if (direction < 0 && scrub <= 0) {\n            scrub = 0;\n            this.autoScrubber.stop();\n          }\n          if (direction > 0 && scrub >= 100) {\n            scrub = 100;\n            this.autoScrubber.stop();\n          }\n          this.setScrubState(scrub);\n        });\n      }\n      initialCalc(transitionDurations) {\n        const totalTransition = (transitionDurations.position + transitionDurations.stagger) / 1e3;\n        const staggerPercent = transitionDurations.stagger === 0 ? 1 : transitionDurations.stagger / (totalTransition * 1e3) * 100;\n        const viewTransition = transitionDurations.view / 1e3;\n        return { totalTransition, staggerPercent, viewTransition };\n      }\n      setScrubState(scrub) {\n        const { morphChartsRenderResult, morphchartsref } = this.props.explorer.viewer.presenter;\n        morphchartsref.core.renderer.transitionTime = scrub / 100;\n        morphChartsRenderResult.setTransitionTimeAxesVisibility();\n        scrub = Math.round(scrub);\n        this.setState({ scrub, pauseDisabled: this.autoScrubber.isStopped() });\n      }\n      setDurations() {\n        setTimeout(() => {\n          const { props, state } = this;\n          const { totalTransition, staggerPercent, viewTransition } = state;\n          const stagger = totalTransition * staggerPercent / 100;\n          const { transitionDurations } = props;\n          transitionDurations.position = (totalTransition - stagger) * 1e3;\n          transitionDurations.stagger = stagger * 1e3;\n          transitionDurations.view = viewTransition * 1e3;\n          syncTansitionDurations(props.explorer.viewer, transitionDurations);\n          props.changeSetup(null, false);\n        });\n      }\n      render() {\n        const { props, state } = this;\n        const { explorer: explorer2, transitionDurations, changeSetup } = props;\n        const sliderRef = base$1.react.createRef();\n        explorer2.dialogFocusHandler.focus = () => {\n          var _a2;\n          return (_a2 = sliderRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        };\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTransition },\n            base$1.react.createElement(base$1.fluentUI.Slider, { componentRef: sliderRef, label: strings$1.labelTransitionScrubber, min: 0, max: 100, valueFormat: strings$1.percentValueFormat, value: state.scrub, onChange: (scrub) => {\n              this.autoScrubber.stop();\n              this.setScrubState(scrub);\n            } }),\n            base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, title: strings$1.buttonTransitionReverse, iconName: \"PlayReverseResume\", onClick: () => {\n              this.autoScrubber.toggleScrubbing(-1);\n              if (state.scrub === 0) {\n                this.setState({ scrub: 100 });\n              }\n            } }),\n            base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, title: strings$1.buttonTransitionPause, iconName: \"Pause\", onClick: () => {\n              this.autoScrubber.togglePause();\n            }, disabled: state.pauseDisabled }),\n            base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, title: strings$1.buttonTransitionPlay, iconName: \"PlayResume\", onClick: () => {\n              this.autoScrubber.toggleScrubbing(1);\n              if (state.scrub === 100) {\n                this.setState({ scrub: 0 });\n              }\n            } })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTransitionOptions },\n            base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.labelHoldCamera, checked: explorer2.state.holdCamera, onChange: (e, holdCamera) => {\n              changeSetup({ holdCamera }, false);\n            } }),\n            base$1.react.createElement(base$1.fluentUI.ChoiceGroup, { label: strings$1.labelTransitionStaggerBy, selectedKey: props.transitionType, options: [\n              {\n                key: \"ordinal\",\n                text: strings$1.labelTransitionStaggerByOrdinal\n              },\n              {\n                key: \"column\",\n                text: strings$1.labelTransitionStaggerByColumn\n              },\n              {\n                key: \"position\",\n                text: strings$1.labelTransitionStaggerByPosition\n              }\n            ], onChange: (e, o) => {\n              const transitionType = o.key;\n              changeSetup({ transitionType }, true);\n            } })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTransitionStaggerOptions },\n            (() => {\n              switch (props.transitionType) {\n                case \"column\": {\n                  return base$1.react.createElement(Dropdown$1, { collapseLabel: props.compactUI, label: strings$1.labelTransitionStaggerByColumn, options: getColumnOptions(props, props.transitionColumn.name), onChange: (e, o) => {\n                    changeSetup({ transitionColumn: o.data }, true);\n                  } });\n                }\n                case \"position\": {\n                  return base$1.react.createElement(Dropdown$1, { collapseLabel: props.compactUI, label: strings$1.labelTransitionStaggerByPosition, options: positions.map(([key2, text2]) => {\n                    return { key: key2, text: text2, selected: props.transitionDimension === key2 };\n                  }), onChange: (e, o) => {\n                    changeSetup({ transitionDimension: o.key }, true);\n                  } });\n                }\n              }\n            })(),\n            base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.labelTransitionStaggerReverse, checked: props.transitionReverse, onChange: (e, transitionReverse) => changeSetup({ transitionReverse }, true) })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTransitionDurations },\n            base$1.react.createElement(base$1.fluentUI.Slider, { label: strings$1.labelTransitionDuration, onChange: (totalTransition) => {\n              this.setState({ totalTransition });\n              this.setDurations();\n            }, min: 0, max: 5, step: 0.1, value: state.totalTransition }),\n            base$1.react.createElement(base$1.fluentUI.Slider, { label: strings$1.labelTransitionStagger, onChange: (staggerPercent) => {\n              this.setState({ staggerPercent });\n              this.setDurations();\n            }, min: 0, max: 100, valueFormat: strings$1.percentValueFormat, value: state.staggerPercent }),\n            base$1.react.createElement(base$1.fluentUI.Slider, { label: strings$1.labelTransitionCamera, onChange: (viewTransition) => {\n              this.setState({ viewTransition });\n              this.setDurations();\n            }, min: 0, max: 5, step: 0.1, value: state.viewTransition }),\n            base$1.react.createElement(Button, { themePalette: props.themePalette, onClick: () => {\n              const defaults2 = defaultPresenterConfig.transitionDurations;\n              const { position: position2, stagger, view } = defaults2;\n              transitionDurations.position = position2;\n              transitionDurations.stagger = stagger;\n              transitionDurations.view = view;\n              this.setState(Object.assign({}, this.initialCalc(transitionDurations)));\n              this.setDurations();\n            }, text: strings$1.buttonResetToDefault })\n          )\n        );\n      }\n    }\n    return new __TransitionEditor(_props);\n  }\n  const TransitionEditor = _TransitionEditor;\n  function groupOptions(sectionName, columns, selectedKey) {\n    const options2 = columns.map((column) => {\n      const option = {\n        key: `column:${column.name}`,\n        text: column.name,\n        data: column,\n        selected: column.name === selectedKey\n      };\n      return option;\n    });\n    if (options2.length) {\n      const option = {\n        key: sectionName,\n        text: sectionName,\n        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n      };\n      options2.unshift(option);\n    }\n    return options2;\n  }\n  function getColumnOptions(props, selectedKey) {\n    const quantitativeGroup = groupOptions(strings$1.selectNumeric, props.quantitativeColumns, selectedKey);\n    const categoricGroup = groupOptions(strings$1.selectNonNumeric, props.categoricalColumns, selectedKey);\n    return quantitativeGroup.concat(categoricGroup);\n  }\n  function getTransition(state) {\n    const reverse2 = state.transitionReverse;\n    switch (state.transitionType) {\n      case \"ordinal\": {\n        return {\n          type: \"ordinal\",\n          reverse: reverse2\n        };\n      }\n      case \"column\": {\n        return {\n          type: \"column\",\n          column: state.transitionColumn,\n          reverse: reverse2\n        };\n      }\n      case \"position\": {\n        return {\n          type: \"position\",\n          dimension: state.transitionDimension,\n          reverse: reverse2\n        };\n      }\n    }\n  }\n  function syncTansitionDurations(viewer, transitionDurations) {\n    var _a2, _b2;\n    const config = (_b2 = (_a2 = viewer === null || viewer === void 0 ? void 0 : viewer.presenter) === null || _a2 === void 0 ? void 0 : _a2.morphchartsref) === null || _b2 === void 0 ? void 0 : _b2.core.config;\n    if (config) {\n      const { position: position2, stagger } = transitionDurations;\n      config.transitionDuration = position2;\n      config.transitionStaggering = stagger;\n    }\n  }\n  class AutoScrubber {\n    constructor(interval2, onInterval) {\n      this.interval = interval2;\n      this.onInterval = onInterval;\n    }\n    getSignedInterval() {\n      return this.interval * this.direction;\n    }\n    toggleScrubbing(direction) {\n      if (this.isScrubbing() && direction === this.direction) {\n        this.pause();\n      } else {\n        this.start(direction);\n      }\n    }\n    isPaused() {\n      return !this.isScrubbing() && this.direction !== void 0;\n    }\n    isStopped() {\n      return !this.isScrubbing() && this.direction === void 0;\n    }\n    isScrubbing() {\n      return this.autoScrubTimer !== void 0;\n    }\n    togglePause() {\n      if (this.isScrubbing()) {\n        this.pause();\n      } else if (this.direction) {\n        this.start(this.direction);\n      }\n    }\n    start(direction) {\n      this.direction = direction;\n      if (!this.isScrubbing()) {\n        this.autoScrubTimer = setInterval(() => this.onInterval(this.direction, this.interval), this.interval);\n      }\n    }\n    pause() {\n      clearInterval(this.autoScrubTimer);\n      this.autoScrubTimer = void 0;\n    }\n    stop() {\n      this.pause();\n      this.direction = void 0;\n    }\n  }\n  const className = \"sanddance-panel-tools\";\n  function ensureToolbar(panel) {\n    const existing = panel.getElementsByClassName(className);\n    if (existing.length > 0) {\n      return existing[0];\n    } else {\n      const div = addDiv(panel, className);\n      panel.insertAdjacentElement(\"afterbegin\", div);\n      return div;\n    }\n  }\n  function applyColorButtons(presenter, showLegend, props) {\n    const panel = presenter.getElement(PresenterElement$1.panel);\n    const div = ensureToolbar(panel);\n    base$1.reactDOM.render(ColorMap(props), div);\n    panel.style.display = showLegend ? \"\" : \"none\";\n  }\n  function ColorMap(props) {\n    const menuProps = {\n      items: [\n        {\n          key: \"new\",\n          text: strings$1.buttonColorSchemeRemap,\n          disabled: !props.canRemap || props.isRemap,\n          onClick: () => props.colorMapHandler(true)\n        },\n        {\n          key: \"old\",\n          text: strings$1.buttonColorSchemeKeep,\n          disabled: !props.canRemap || !props.isRemap,\n          onClick: () => props.colorMapHandler(false)\n        }\n      ]\n    };\n    return base$1.react.createElement(\n      \"div\",\n      null,\n      base$1.react.createElement(IconButton$1, { styles: {\n        menuIcon: {\n          display: \"none\"\n        }\n      }, themePalette: props.themePalette, title: strings$1.buttonColorSchemeMap, onClick: null, iconName: props.canRemap ? \"FiltersSolid\" : \"Filters\", menuProps })\n    );\n  }\n  function bestColorScheme(newColumn, oldColumn, oldScheme) {\n    return defaultColorScheme(newColumn);\n  }\n  function defaultColorScheme(c2) {\n    if (c2.quantitative) {\n      return \"redyellowgreen\";\n    } else if (c2.stats.distinctValueCount === 2) {\n      return \"dual_redgreen\";\n    } else if (c2.stats.distinctValueCount <= 10) {\n      return \"category10\";\n    }\n    return \"category20\";\n  }\n  function formatDecimal(x2) {\n    return Math.abs(x2 = Math.round(x2)) >= 1e21 ? x2.toLocaleString(\"en\").replace(/,/g, \"\") : x2.toString(10);\n  }\n  function formatDecimalParts(x2, p) {\n    if ((i = (x2 = p ? x2.toExponential(p - 1) : x2.toExponential()).indexOf(\"e\")) < 0) return null;\n    var i, coefficient = x2.slice(0, i);\n    return [\n      coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n      +x2.slice(i + 1)\n    ];\n  }\n  function exponent(x2) {\n    return x2 = formatDecimalParts(Math.abs(x2)), x2 ? x2[1] : NaN;\n  }\n  function formatGroup(grouping, thousands) {\n    return function(value2, width2) {\n      var i = value2.length, t = [], j = 0, g = grouping[0], length2 = 0;\n      while (i > 0 && g > 0) {\n        if (length2 + g + 1 > width2) g = Math.max(1, width2 - length2);\n        t.push(value2.substring(i -= g, i + g));\n        if ((length2 += g + 1) > width2) break;\n        g = grouping[j = (j + 1) % grouping.length];\n      }\n      return t.reverse().join(thousands);\n    };\n  }\n  function formatNumerals(numerals) {\n    return function(value2) {\n      return value2.replace(/[0-9]/g, function(i) {\n        return numerals[+i];\n      });\n    };\n  }\n  var re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n  function formatSpecifier(specifier) {\n    if (!(match2 = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match2;\n    return new FormatSpecifier({\n      fill: match2[1],\n      align: match2[2],\n      sign: match2[3],\n      symbol: match2[4],\n      zero: match2[5],\n      width: match2[6],\n      comma: match2[7],\n      precision: match2[8] && match2[8].slice(1),\n      trim: match2[9],\n      type: match2[10]\n    });\n  }\n  formatSpecifier.prototype = FormatSpecifier.prototype;\n  function FormatSpecifier(specifier) {\n    this.fill = specifier.fill === void 0 ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === void 0 ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === void 0 ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === void 0 ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === void 0 ? void 0 : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === void 0 ? \"\" : specifier.type + \"\";\n  }\n  FormatSpecifier.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === void 0 ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === void 0 ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n  };\n  function formatTrim(s2) {\n    out: for (var n = s2.length, i = 1, i0 = -1, i1; i < n; ++i) {\n      switch (s2[i]) {\n        case \".\":\n          i0 = i1 = i;\n          break;\n        case \"0\":\n          if (i0 === 0) i0 = i;\n          i1 = i;\n          break;\n        default:\n          if (!+s2[i]) break out;\n          if (i0 > 0) i0 = 0;\n          break;\n      }\n    }\n    return i0 > 0 ? s2.slice(0, i0) + s2.slice(i1 + 1) : s2;\n  }\n  var prefixExponent;\n  function formatPrefixAuto(x2, p) {\n    var d2 = formatDecimalParts(x2, p);\n    if (!d2) return x2 + \"\";\n    var coefficient = d2[0], exponent2 = d2[1], i = exponent2 - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent2 / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x2, Math.max(0, p + i - 1))[0];\n  }\n  function formatRounded(x2, p) {\n    var d2 = formatDecimalParts(x2, p);\n    if (!d2) return x2 + \"\";\n    var coefficient = d2[0], exponent2 = d2[1];\n    return exponent2 < 0 ? \"0.\" + new Array(-exponent2).join(\"0\") + coefficient : coefficient.length > exponent2 + 1 ? coefficient.slice(0, exponent2 + 1) + \".\" + coefficient.slice(exponent2 + 1) : coefficient + new Array(exponent2 - coefficient.length + 2).join(\"0\");\n  }\n  const formatTypes = {\n    \"%\": function(x2, p) {\n      return (x2 * 100).toFixed(p);\n    },\n    \"b\": function(x2) {\n      return Math.round(x2).toString(2);\n    },\n    \"c\": function(x2) {\n      return x2 + \"\";\n    },\n    \"d\": formatDecimal,\n    \"e\": function(x2, p) {\n      return x2.toExponential(p);\n    },\n    \"f\": function(x2, p) {\n      return x2.toFixed(p);\n    },\n    \"g\": function(x2, p) {\n      return x2.toPrecision(p);\n    },\n    \"o\": function(x2) {\n      return Math.round(x2).toString(8);\n    },\n    \"p\": function(x2, p) {\n      return formatRounded(x2 * 100, p);\n    },\n    \"r\": formatRounded,\n    \"s\": formatPrefixAuto,\n    \"X\": function(x2) {\n      return Math.round(x2).toString(16).toUpperCase();\n    },\n    \"x\": function(x2) {\n      return Math.round(x2).toString(16);\n    }\n  };\n  function identity$3(x2) {\n    return x2;\n  }\n  var map$1 = Array.prototype.map, prefixes = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n  function formatLocale(locale2) {\n    var group2 = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity$3 : formatGroup(map$1.call(locale2.grouping, Number), locale2.thousands + \"\"), currencyPrefix = locale2.currency === void 0 ? \"\" : locale2.currency[0] + \"\", currencySuffix = locale2.currency === void 0 ? \"\" : locale2.currency[1] + \"\", decimal = locale2.decimal + \"\", numerals = locale2.numerals === void 0 ? identity$3 : formatNumerals(map$1.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? \"%\" : locale2.percent + \"\", minus = locale2.minus + \"\", nan = locale2.nan === void 0 ? \"NaN\" : locale2.nan + \"\";\n    function newFormat(specifier) {\n      specifier = formatSpecifier(specifier);\n      var fill2 = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol2 = specifier.symbol, zero2 = specifier.zero, width2 = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type;\n      if (type2 === \"n\") comma = true, type2 = \"g\";\n      else if (!formatTypes[type2]) precision === void 0 && (precision = 12), trim = true, type2 = \"g\";\n      if (zero2 || fill2 === \"0\" && align === \"=\") zero2 = true, fill2 = \"0\", align = \"=\";\n      var prefix = symbol2 === \"$\" ? currencyPrefix : symbol2 === \"#\" && /[boxX]/.test(type2) ? \"0\" + type2.toLowerCase() : \"\", suffix = symbol2 === \"$\" ? currencySuffix : /[%p]/.test(type2) ? percent : \"\";\n      var formatType = formatTypes[type2], maybeSuffix = /[defgprs%]/.test(type2);\n      precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n      function format2(value2) {\n        var valuePrefix = prefix, valueSuffix = suffix, i, n, c2;\n        if (type2 === \"c\") {\n          valueSuffix = formatType(value2) + valueSuffix;\n          value2 = \"\";\n        } else {\n          value2 = +value2;\n          var valueNegative = value2 < 0 || 1 / value2 < 0;\n          value2 = isNaN(value2) ? nan : formatType(Math.abs(value2), precision);\n          if (trim) value2 = formatTrim(value2);\n          if (valueNegative && +value2 === 0 && sign2 !== \"+\") valueNegative = false;\n          valuePrefix = (valueNegative ? sign2 === \"(\" ? sign2 : minus : sign2 === \"-\" || sign2 === \"(\" ? \"\" : sign2) + valuePrefix;\n          valueSuffix = (type2 === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign2 === \"(\" ? \")\" : \"\");\n          if (maybeSuffix) {\n            i = -1, n = value2.length;\n            while (++i < n) {\n              if (c2 = value2.charCodeAt(i), 48 > c2 || c2 > 57) {\n                valueSuffix = (c2 === 46 ? decimal + value2.slice(i + 1) : value2.slice(i)) + valueSuffix;\n                value2 = value2.slice(0, i);\n                break;\n              }\n            }\n          }\n        }\n        if (comma && !zero2) value2 = group2(value2, Infinity);\n        var length2 = valuePrefix.length + value2.length + valueSuffix.length, padding2 = length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) : \"\";\n        if (comma && zero2) value2 = group2(padding2 + value2, padding2.length ? width2 - valueSuffix.length : Infinity), padding2 = \"\";\n        switch (align) {\n          case \"<\":\n            value2 = valuePrefix + value2 + valueSuffix + padding2;\n            break;\n          case \"=\":\n            value2 = valuePrefix + padding2 + value2 + valueSuffix;\n            break;\n          case \"^\":\n            value2 = padding2.slice(0, length2 = padding2.length >> 1) + valuePrefix + value2 + valueSuffix + padding2.slice(length2);\n            break;\n          default:\n            value2 = padding2 + valuePrefix + value2 + valueSuffix;\n            break;\n        }\n        return numerals(value2);\n      }\n      format2.toString = function() {\n        return specifier + \"\";\n      };\n      return format2;\n    }\n    function formatPrefix2(specifier, value2) {\n      var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent(value2) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];\n      return function(value3) {\n        return f(k * value3) + prefix;\n      };\n    }\n    return {\n      format: newFormat,\n      formatPrefix: formatPrefix2\n    };\n  }\n  var locale$1;\n  var format$3;\n  defaultLocale$1({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [3],\n    currency: [\"$\", \"\"],\n    minus: \"-\"\n  });\n  function defaultLocale$1(definition2) {\n    locale$1 = formatLocale(definition2);\n    format$3 = locale$1.format;\n    locale$1.formatPrefix;\n    return locale$1;\n  }\n  var DataScopeId;\n  (function(DataScopeId2) {\n    DataScopeId2[DataScopeId2[\"AllData\"] = 0] = \"AllData\";\n    DataScopeId2[DataScopeId2[\"SelectedData\"] = 1] = \"SelectedData\";\n    DataScopeId2[DataScopeId2[\"FilteredData\"] = 2] = \"FilteredData\";\n  })(DataScopeId || (DataScopeId = {}));\n  function resetSelectedItemIndex(selectedItemIndex) {\n    selectedItemIndex[DataScopeId.AllData] = 0;\n    selectedItemIndex[DataScopeId.FilteredData] = 0;\n    selectedItemIndex[DataScopeId.SelectedData] = 0;\n  }\n  const shortFormat = format$3(\".2~s\");\n  function short(n) {\n    return n === -1 ? \"--\" : n ? n < 1e3 ? n.toString() : shortFormat(n) : \"0\";\n  }\n  function DataScope$1(props) {\n    const dataCount = Object.assign({ all: -1, filtered: -1, selected: -1 }, props.dataCount);\n    return props.compact ? base$1.react.createElement(\n      \"div\",\n      { className: classList(\"sanddance-datascope\", \"compact\"), onClick: props.onCompactClick },\n      base$1.react.createElement(Compact, Object.assign({}, props, { dataScopeId: DataScopeId.AllData, text: strings$1.selectDataSpanAll, count: dataCount.all })),\n      base$1.react.createElement(Compact, Object.assign({}, props, { dataScopeId: DataScopeId.FilteredData, text: strings$1.selectDataSpanFilter, count: dataCount.filtered })),\n      base$1.react.createElement(Compact, Object.assign({}, props, { dataScopeId: DataScopeId.SelectedData, text: strings$1.selectDataSpanSelection, count: dataCount.selected }))\n    ) : base$1.react.createElement(\n      \"div\",\n      { className: classList(\"sanddance-datascope\", \"extended\", props.active && \"active\") },\n      base$1.react.createElement(\n        \"div\",\n        null,\n        base$1.react.createElement(\"div\", null, props.dataSet),\n        base$1.react.createElement(\n          \"div\",\n          { className: \"datascope-buttons\" },\n          base$1.react.createElement(DataScopeButton, Object.assign({}, props, { dataScopeId: DataScopeId.AllData, text: strings$1.selectDataSpanAll, count: dataCount.all })),\n          base$1.react.createElement(DataScopeButton, Object.assign({}, props, { dataScopeId: DataScopeId.FilteredData, text: strings$1.selectDataSpanFilter, count: dataCount.filtered })),\n          base$1.react.createElement(DataScopeButton, Object.assign({}, props, { dataScopeId: DataScopeId.SelectedData, text: strings$1.selectDataSpanSelection, count: dataCount.selected }))\n        )\n      )\n    );\n  }\n  function Compact(props) {\n    return base$1.react.createElement(\"div\", { title: props.text, onClick: () => {\n      props.onDataScopeClick(props.dataScopeId);\n    } }, short(props.count));\n  }\n  function DataScopeButton(props) {\n    return base$1.react.createElement(Button, { themePalette: props.themePalette, className: classList(\"datascope-button\", props.selectedDataScope === props.dataScopeId && \"selected\"), disabled: props.disabled, text: props.text, onClick: () => {\n      props.onDataScopeClick(props.dataScopeId);\n    }, onRenderText: () => {\n      return base$1.react.createElement(\n        \"div\",\n        { title: props.count > 0 ? props.count.toString() : \"\" },\n        base$1.react.createElement(\"label\", null, props.text),\n        base$1.react.createElement(\"div\", null, short(props.count))\n      );\n    }, onRenderIcon: () => null });\n  }\n  function Scrollable(props) {\n    return base$1.react.createElement(\n      \"div\",\n      { className: classList(\"scrollable-container\", props.className), role: props.role },\n      base$1.react.createElement(\"div\", { className: \"scrollable\" }, props.children)\n    );\n  }\n  var SideTabId;\n  (function(SideTabId2) {\n    SideTabId2[SideTabId2[\"ChartType\"] = 0] = \"ChartType\";\n    SideTabId2[SideTabId2[\"Data\"] = 1] = \"Data\";\n    SideTabId2[SideTabId2[\"Search\"] = 2] = \"Search\";\n    SideTabId2[SideTabId2[\"Color\"] = 3] = \"Color\";\n    SideTabId2[SideTabId2[\"Snapshots\"] = 4] = \"Snapshots\";\n    SideTabId2[SideTabId2[\"History\"] = 5] = \"History\";\n    SideTabId2[SideTabId2[\"Transition\"] = 6] = \"Transition\";\n    SideTabId2[SideTabId2[\"Settings\"] = 7] = \"Settings\";\n    SideTabId2[SideTabId2[\"Pin\"] = 8] = \"Pin\";\n    SideTabId2[SideTabId2[\"Collapse\"] = 9] = \"Collapse\";\n  })(SideTabId || (SideTabId = {}));\n  function Sidebutton(props) {\n    const selected = !props.closed && props.selectedSideTab === props.sideTabId;\n    const buttonProps = props.omitAriaSelected ? {} : {\n      \"aria-selected\": selected\n    };\n    return base$1.react.createElement(\n      \"div\",\n      { className: classList(\"vbutton\", selected && \"selected\") },\n      props.badgeText && base$1.react.createElement(\"div\", { className: \"count\" }, props.badgeText),\n      base$1.react.createElement(IconButton$1, Object.assign({}, buttonProps, { role: props.role || \"tab\", themePalette: props.themePalette, className: \"vbutton\", iconName: props.iconName, title: props.title, onClick: () => {\n        props.onSideTabClick(props.sideTabId);\n      } }))\n    );\n  }\n  function Sidebar(props) {\n    const sidebuttons = [\n      {\n        sideTabId: SideTabId.ChartType,\n        iconName: \"BIDashboard\",\n        title: strings$1.labelChart\n      },\n      {\n        sideTabId: SideTabId.Color,\n        iconName: \"Color\",\n        title: strings$1.labelColor\n      },\n      {\n        sideTabId: SideTabId.Data,\n        iconName: \"Table\",\n        title: strings$1.labelDataBrowser\n      },\n      {\n        sideTabId: SideTabId.Search,\n        iconName: \"Search\",\n        title: strings$1.labelSearch\n      },\n      !props.snapshotsHidden && {\n        sideTabId: SideTabId.Snapshots,\n        iconName: \"Camera\",\n        title: strings$1.labelSnapshots\n      },\n      {\n        sideTabId: SideTabId.History,\n        iconName: \"History\",\n        title: strings$1.labelHistory\n      },\n      {\n        sideTabId: SideTabId.Transition,\n        iconName: \"Flow\",\n        title: strings$1.labelTransition\n      },\n      {\n        sideTabId: SideTabId.Settings,\n        iconName: \"Settings\",\n        title: strings$1.labelChartSettings\n      }\n    ].filter(Boolean);\n    return base$1.react.createElement(\n      \"div\",\n      { className: classList(\"sanddance-sidebar\", \"calculator\", props.pinned && \"pinned\", props.closed && \"closed\") },\n      base$1.react.createElement(\n        \"div\",\n        { className: \"sidebar-content\" },\n        base$1.react.createElement(DataScope$1, Object.assign({}, props.dataScopeProps)),\n        base$1.react.createElement(\n          \"div\",\n          { className: \"vbuttons\" },\n          base$1.react.createElement(\"div\", { className: \"sidebar-dialogs\", role: \"tablist\" }, sidebuttons.map((sidebutton, i) => base$1.react.createElement(Sidebutton, Object.assign({ key: i }, props, sidebutton, { themePalette: props.themePalette })))),\n          !props.hideSidebarControls && base$1.react.createElement(\n            \"div\",\n            { className: \"sidebar-controls\" },\n            base$1.react.createElement(Sidebutton, Object.assign({}, props, { omitAriaSelected: true, role: \"button\", sideTabId: SideTabId.Pin, iconName: props.pinned ? \"Pinned\" : \"Pin\", title: props.pinned ? strings$1.buttonToolbarFloat : strings$1.buttonToolbarDock })),\n            base$1.react.createElement(Sidebutton, Object.assign({}, props, { omitAriaSelected: true, role: \"button\", sideTabId: SideTabId.Collapse, iconName: props.closed ? \"DoubleChevronRight12\" : \"DoubleChevronLeft12\", title: props.closed ? strings$1.buttonToolbarShow : strings$1.buttonToolbarHide }))\n          )\n        ),\n        base$1.react.createElement(\n          Scrollable,\n          { role: \"tabpanel\" },\n          base$1.react.createElement(\"div\", { className: \"sidetab\" }, props.children)\n        ),\n        props.calculating && base$1.react.createElement(\n          \"div\",\n          { className: \"calculating\" },\n          base$1.react.createElement(base$1.fluentUI.Spinner, { size: base$1.fluentUI.SpinnerSize.large })\n        )\n      )\n    );\n  }\n  const CommandBarButtonStyles = (props) => {\n    const { theme } = props;\n    if (!theme) {\n      throw new Error(\"Theme is undefined or null.\");\n    }\n    const { palette, semanticColors } = theme;\n    const BUTTON_ICON_CLASSNAME = \".ms-Button-icon\";\n    return {\n      root: [\n        Object.assign({}, base$1.fluentUI.getFocusStyle(theme, { inset: 2 })),\n        {\n          backgroundColor: palette.white\n        }\n      ],\n      rootHovered: {\n        backgroundColor: palette.neutralLighter,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: palette.themeDarkAlt\n          }\n        }\n      },\n      rootPressed: {\n        backgroundColor: palette.neutralLight,\n        color: palette.neutralDark,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: palette.themeDark\n          }\n        }\n      },\n      rootChecked: {\n        backgroundColor: palette.neutralLight,\n        color: palette.neutralDark,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: palette.themeDark\n          }\n        }\n      },\n      rootCheckedHovered: {\n        backgroundColor: palette.neutralQuaternaryAlt,\n        color: palette.neutralDark\n      },\n      rootExpanded: {\n        color: palette.neutralDark,\n        backgroundColor: palette.neutralLight,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: palette.themeDark\n          }\n        }\n      },\n      rootExpandedHovered: {\n        background: palette.neutralQuaternaryAlt\n      },\n      rootDisabled: {\n        backgroundColor: palette.white,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: semanticColors.disabledBodySubtext\n          }\n        }\n      },\n      splitButtonMenuButton: {\n        backgroundColor: palette.white,\n        color: palette.neutralSecondary,\n        selectors: {\n          \":hover\": {\n            backgroundColor: palette.neutralLighter,\n            selectors: {\n              [BUTTON_ICON_CLASSNAME]: {\n                color: palette.neutralPrimary\n              }\n            }\n          },\n          \":active\": {\n            backgroundColor: palette.neutralLight,\n            selectors: {\n              [BUTTON_ICON_CLASSNAME]: {\n                color: palette.neutralPrimary\n              }\n            }\n          }\n        }\n      },\n      splitButtonMenuButtonDisabled: {\n        backgroundColor: palette.white\n      },\n      icon: {\n        color: palette.themePrimary\n      }\n    };\n  };\n  const s = `\n ......\n.......\n...\n......\n ......\n    ...\n.......\n......\n`;\n  const d = s.split(\"\\n\").map((row, irow) => row.length ? row.split(\"\").map((char, icol) => char.trim() ? `M${2 * icol + 1} ${2 * (irow - 1) + 1} v1 h1 v-1 Z` : \"\").join(\" \") : \"\").join(\"\\n\");\n  function Logo() {\n    return base$1.react.createElement(\n      \"svg\",\n      { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 16 16\" },\n      base$1.react.createElement(\"path\", { d })\n    );\n  }\n  function Topbar(props) {\n    var _a2;\n    const zeroResults = props.selectionState.selectedData && props.selectionState.selectedData.length === 0;\n    const disabled = !props.loaded;\n    const items = [\n      {\n        key: \"undo\",\n        name: strings$1.buttonUndo,\n        iconProps: {\n          iconName: \"Undo\"\n        },\n        disabled: disabled || props.historyItems.length === 0 || props.historyIndex === 0,\n        onClick: props.undo\n      },\n      {\n        key: \"redo\",\n        name: strings$1.buttonRedo,\n        iconProps: {\n          iconName: \"Redo\"\n        },\n        disabled: disabled || props.historyItems.length <= 1 || props.historyIndex >= props.historyItems.length - 1,\n        onClick: props.redo\n      },\n      {\n        key: \"deselect\",\n        name: strings$1.buttonDeselect,\n        iconProps: {\n          iconName: \"Cancel\"\n        },\n        disabled: disabled || !props.selectionSearch,\n        onClick: props.doDeselect\n      },\n      {\n        key: \"isolate\",\n        name: strings$1.buttonIsolate,\n        iconProps: {\n          iconName: \"Filter\"\n        },\n        disabled: disabled || !props.selectionSearch || zeroResults,\n        onClick: () => props.doFilter(props.selectionSearch, strings$1.labelHistoryFilterIsolate)\n      },\n      {\n        key: \"exclude\",\n        name: strings$1.buttonExclude,\n        iconProps: {\n          iconName: \"ClearFilter\"\n        },\n        disabled: disabled || !props.selectionSearch || zeroResults,\n        onClick: () => props.doFilter(invert$2(props.selectionSearch), strings$1.labelHistoryFilterIExclude)\n      },\n      {\n        key: \"reset\",\n        name: strings$1.buttonReset,\n        iconProps: {\n          iconName: \"RemoveFilter\"\n        },\n        disabled: disabled || !props.filter,\n        onClick: () => props.doUnfilter(strings$1.labelHistoryFilterClear)\n      }\n    ];\n    if (props.buttons) {\n      items.push.apply(items, props.buttons);\n    }\n    if (props.collapseLabels) {\n      items.forEach((item) => item.iconOnly = true);\n    }\n    const farItems = [];\n    if (!props.snapshotsHidden) {\n      farItems.push({\n        key: \"previous-snapshot\",\n        iconProps: {\n          iconName: \"Previous\"\n        },\n        title: strings$1.buttonPrevSnapshot,\n        onClick: props.onSnapshotPreviousClick,\n        disabled: !props.snapshots || props.snapshots.length < 2\n      }, {\n        key: \"snapshot\",\n        iconProps: {\n          iconName: \"Camera\"\n        },\n        title: strings$1.buttonCreateSnapshot,\n        onClick: props.onSnapshotClick,\n        disabled: !props.loaded\n      }, {\n        key: \"next-snapshot\",\n        iconProps: {\n          iconName: \"Next\"\n        },\n        title: strings$1.buttonNextSnapshot,\n        onClick: props.onSnapshotNextClick,\n        disabled: !props.snapshots || props.snapshots.length < 2\n      });\n    }\n    farItems.push({\n      key: \"view\",\n      iconProps: {\n        iconName: props.view === \"2d\" ? \"CubeShape\" : \"Page\"\n      },\n      title: props.view === \"2d\" ? strings$1.labelViewType3d : strings$1.labelViewType2d,\n      onClick: props.onViewClick,\n      disabled: !props.loaded\n    });\n    if ((_a2 = props.iconButtons) === null || _a2 === void 0 ? void 0 : _a2.length) {\n      farItems.push(...props.iconButtons);\n    }\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"sanddance-explorer-topbar\" },\n      base$1.react.createElement(\n        \"div\",\n        { className: \"logo\" },\n        base$1.react.createElement(Logo, null),\n        base$1.react.createElement(\"a\", { href: props.logoClickUrl || \"/\", target: props.logoClickTarget || \"_blank\" }, strings$1.appName)\n      ),\n      base$1.react.createElement(\n        \"div\",\n        { className: \"sanddance-explorer-commandbar\" },\n        base$1.react.createElement(\n          base$1.fluentUI.Customizer,\n          { scopedSettings: {\n            CommandBarButton: {\n              styles: (buttonProps) => {\n                buttonProps.theme.palette = props.themePalette;\n                return CommandBarButtonStyles(buttonProps);\n              }\n            }\n          } },\n          base$1.react.createElement(base$1.fluentUI.CommandBar, { items, farItems, styles: {\n            root: {\n              backgroundColor: \"transparent\",\n              height: \"unset\",\n              paddingLeft: 0,\n              paddingRight: 0\n            }\n          } })\n        )\n      )\n    );\n  }\n  const loadDataFile = (dataFile, columnTypes) => new Promise((resolve2, reject) => {\n    const vega2 = base$3.vega;\n    const loader2 = vega2.loader();\n    function handleRawText(text2) {\n      let data2;\n      try {\n        data2 = vega2.read(text2, { type: dataFile.type, parse: {} });\n      } catch (e) {\n        reject(e);\n      }\n      if (data2) {\n        loadDataArray(data2, dataFile.type, columnTypes).then((dc) => {\n          if (dataFile.snapshotsUrl) {\n            fetch(dataFile.snapshotsUrl).then((response) => response.json()).then((snapshots) => {\n              dc.snapshots = snapshots;\n              resolve2(dc);\n            }).catch(reject);\n          } else if (dataFile.snapshots) {\n            dc.snapshots = dataFile.snapshots;\n            resolve2(dc);\n          } else {\n            resolve2(dc);\n          }\n        }).catch(reject);\n      }\n    }\n    if (dataFile.dataUrl) {\n      loader2.load(dataFile.dataUrl).then(handleRawText).catch(reject);\n    } else if (dataFile.rawText) {\n      handleRawText(dataFile.rawText);\n    } else {\n      reject(\"dataFile object must have either dataUrl or rawText property set.\");\n    }\n  });\n  const loadDataArray = (data2, type2, columnTypes) => new Promise((resolve2, reject) => {\n    const parse2 = type2 === \"csv\" || type2 === \"tsv\";\n    if (parse2) {\n      data2.forEach((row) => {\n        for (const column in row) {\n          if (row[column] === \"\") {\n            row[column] = null;\n          }\n        }\n      });\n    }\n    const columns = getColumnsFromData(base$3.vega.inferTypes, data2, columnTypes).filter((c2) => c2.name && c2.name.trim()).sort((a2, b2) => a2.name.localeCompare(b2.name));\n    if (parse2) {\n      const booleanColumns = columns.filter((c2) => c2.type === \"boolean\");\n      const dateColumns = columns.filter((c2) => c2.type === \"date\");\n      const numericColumns = columns.filter((c2) => c2.type === \"integer\" || c2.type === \"number\");\n      data2.forEach((obj2) => {\n        booleanColumns.forEach((c2) => {\n          obj2[c2.name] = (\"\" + obj2[c2.name]).toLowerCase() === \"true\";\n        });\n        dateColumns.forEach((c2) => {\n          const input = obj2[c2.name];\n          if (input !== null) {\n            const d2 = new Date(input);\n            d2.input = input;\n            obj2[c2.name] = d2;\n          }\n        });\n        numericColumns.forEach((c2) => {\n          const n = parseFloat(obj2[c2.name]);\n          obj2[c2.name] = isNaN(n) ? null : n;\n        });\n      });\n    }\n    resolve2({ data: data2, columns });\n  });\n  var util$1 = util$4;\n  const themePalettes = {};\n  themePalettes[\"\"] = {\n    themePrimary: \"#0078d4\",\n    themeLighterAlt: \"#eff6fc\",\n    themeLighter: \"#deecf9\",\n    themeLight: \"#c7e0f4\",\n    themeTertiary: \"#71afe5\",\n    themeSecondary: \"#2b88d8\",\n    themeDarkAlt: \"#106ebe\",\n    themeDark: \"#005a9e\",\n    themeDarker: \"#004578\",\n    neutralLighterAlt: \"#faf9f8\",\n    neutralLighter: \"#f3f2f1\",\n    neutralLight: \"#edebe9\",\n    neutralQuaternaryAlt: \"#e1dfdd\",\n    neutralQuaternary: \"#d0d0d0\",\n    neutralTertiaryAlt: \"#c8c6c4\",\n    neutralTertiary: \"#595959\",\n    neutralSecondary: \"#373737\",\n    neutralSecondaryAlt: \"#373737\",\n    neutralPrimaryAlt: \"#2f2f2f\",\n    neutralPrimary: \"#000000\",\n    neutralDark: \"#151515\",\n    black: \"#0b0b0b\",\n    white: \"#ffffff\"\n  };\n  themePalettes[\"dark-theme\"] = {\n    themePrimary: \"#0078d4\",\n    themeLighterAlt: \"#eff6fc\",\n    themeLighter: \"#deecf9\",\n    themeLight: \"#c7e0f4\",\n    themeTertiary: \"#71afe5\",\n    themeSecondary: \"#2b88d8\",\n    themeDarkAlt: \"#106ebe\",\n    themeDark: \"#005a9e\",\n    themeDarker: \"#004578\",\n    neutralLighterAlt: \"#0b0b0b\",\n    neutralLighter: \"#151515\",\n    neutralLight: \"#252525\",\n    neutralQuaternaryAlt: \"#2f2f2f\",\n    neutralQuaternary: \"#373737\",\n    neutralTertiaryAlt: \"#595959\",\n    neutralTertiary: \"#c8c8c8\",\n    neutralSecondary: \"#d0d0d0\",\n    neutralSecondaryAlt: \"#d0d0d0\",\n    neutralPrimaryAlt: \"#dadada\",\n    neutralPrimary: \"#ffffff\",\n    neutralDark: \"#f4f4f4\",\n    black: \"#f8f8f8\",\n    white: \"#000000\"\n  };\n  function getColorSettingsFromThemePalette(themePalette) {\n    const c2 = util$1.colorFromString(themePalette.themeSecondary);\n    c2[3] = 256 / 3;\n    return {\n      axisLine: themePalette.black,\n      axisText: themePalette.black,\n      gridLine: themePalette.neutralLight,\n      backgroundColor: themePalette.white,\n      hoveredCube: themePalette.black,\n      clickableText: themePalette.themeDark,\n      clickableTextHighlight: util$1.colorToString(c2),\n      searchText: themePalette.neutralPrimary,\n      searchTextHighlight: themePalette.neutralPrimaryAlt\n    };\n  }\n  const fontFamily$1 = \"Segoe UI, sans-serif\";\n  const defaultViewerOptions = {\n    colors: getColorSettingsFromThemePalette(themePalettes[\"\"]),\n    fontFamily: fontFamily$1\n  };\n  const snapshotThumbWidth = 300;\n  const defaultRenderer = {\n    advanced: false,\n    advancedOptions: {\n      bloomIntensity: 2,\n      isBloomEnabled: false,\n      isDofEnabled: false,\n      dofFocusRange: 0.25,\n      isFxaaEnabled: false,\n      isShadowEnabled: true,\n      isSsaoEnabled: true\n    },\n    basicOptions: {\n      antialias: true\n    }\n  };\n  function initialExplorerState(props) {\n    const renderer = props.initialRenderer || defaultRenderer;\n    if (!renderer.advancedOptions) {\n      renderer.advancedOptions = defaultRenderer.advancedOptions;\n    }\n    if (!renderer.basicOptions) {\n      renderer.basicOptions = defaultRenderer.basicOptions;\n    }\n    const state = {\n      calculating: null,\n      errors: null,\n      autoCompleteDistinctValues: {},\n      colorBin: null,\n      dataContent: null,\n      dataFile: null,\n      search: null,\n      totalStyle: null,\n      facetStyle: \"wrap\",\n      filter: null,\n      filteredData: null,\n      specCapabilities: null,\n      size: {\n        height: null,\n        width: null\n      },\n      scheme: null,\n      transform: null,\n      columns: null,\n      chart: \"grid\",\n      signalValues: null,\n      hideAxes: false,\n      hideLegend: false,\n      sideTabId: SideTabId.ChartType,\n      dataScopeId: DataScopeId.AllData,\n      selectedItemIndex: {},\n      sidebarClosed: props.initialSidebarClosed === void 0 ? false : props.initialSidebarClosed,\n      sidebarPinned: props.initialSidebarPinned === void 0 ? true : props.initialSidebarPinned,\n      view: props.initialView || \"2d\",\n      snapshots: [],\n      selectedSnapshotIndex: -1,\n      tooltipExclusions: [],\n      positionedColumnMapProps: null,\n      note: null,\n      historyIndex: -1,\n      historyItems: [],\n      renderer,\n      transitionType: \"ordinal\",\n      transitionDimension: \"x\",\n      transitionDurations: clone(defaultPresenterConfig.transitionDurations)\n    };\n    resetSelectedItemIndex(state.selectedItemIndex);\n    return state;\n  }\n  function schemeOption(selected, scheme2) {\n    return {\n      key: scheme2,\n      text: scheme2,\n      selected: selected === scheme2,\n      scheme: scheme2,\n      children: schemesJSX[scheme2]\n    };\n  }\n  function schemeHeader(key2, text2) {\n    return {\n      key: key2,\n      text: text2,\n      itemType: base$1.fluentUI.DropdownMenuItemType.Header\n    };\n  }\n  const schemesJSX = {};\n  const p8 = `${100 / 8}%`;\n  const p9 = `${100 / 9}%`;\n  const p10 = `${100 / 10}%`;\n  const p12 = `${100 / 12}%`;\n  const p20 = `${100 / 20}%`;\n  let loaded$5 = false;\n  function load$7() {\n    schemesJSX[\"accent\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#7fc97f\", style: { width: p8, background: \"rgb(127, 201, 127)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#beaed4\", style: { width: p8, background: \"rgb(190, 174, 212)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdc086\", style: { width: p8, background: \"rgb(253, 192, 134)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffff99\", style: { width: p8, background: \"rgb(255, 255, 153)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#386cb0\", style: { width: p8, background: \"rgb(56, 108, 176)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f0027f\", style: { width: p8, background: \"rgb(240, 2, 127)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bf5b17\", style: { width: p8, background: \"rgb(191, 91, 23)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#666666\", style: { width: p8, background: \"rgb(102, 102, 102)\" } })\n    );\n    schemesJSX[\"category10\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#1f77b4\", style: { width: p10, background: \"rgb(31, 119, 180)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff7f0e\", style: { width: p10, background: \"rgb(255, 127, 14)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#2ca02c\", style: { width: p10, background: \"rgb(44, 160, 44)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d62728\", style: { width: p10, background: \"rgb(214, 39, 40)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9467bd\", style: { width: p10, background: \"rgb(148, 103, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8c564b\", style: { width: p10, background: \"rgb(140, 86, 75)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e377c2\", style: { width: p10, background: \"rgb(227, 119, 194)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#7f7f7f\", style: { width: p10, background: \"rgb(127, 127, 127)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bcbd22\", style: { width: p10, background: \"rgb(188, 189, 34)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#17becf\", style: { width: p10, background: \"rgb(23, 190, 207)\" } })\n    );\n    schemesJSX[\"category20\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#1f77b4\", style: { width: p20, background: \"rgb(31, 119, 180)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#aec7e8\", style: { width: p20, background: \"rgb(174, 199, 232)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff7f0e\", style: { width: p20, background: \"rgb(255, 127, 14)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffbb78\", style: { width: p20, background: \"rgb(255, 187, 120)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#2ca02c\", style: { width: p20, background: \"rgb(44, 160, 44)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#98df8a\", style: { width: p20, background: \"rgb(152, 223, 138)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d62728\", style: { width: p20, background: \"rgb(214, 39, 40)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff9896\", style: { width: p20, background: \"rgb(255, 152, 150)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9467bd\", style: { width: p20, background: \"rgb(148, 103, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c5b0d5\", style: { width: p20, background: \"rgb(197, 176, 213)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8c564b\", style: { width: p20, background: \"rgb(140, 86, 75)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c49c94\", style: { width: p20, background: \"rgb(196, 156, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e377c2\", style: { width: p20, background: \"rgb(227, 119, 194)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f7b6d2\", style: { width: p20, background: \"rgb(247, 182, 210)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#7f7f7f\", style: { width: p20, background: \"rgb(127, 127, 127)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c7c7c7\", style: { width: p20, background: \"rgb(199, 199, 199)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bcbd22\", style: { width: p20, background: \"rgb(188, 189, 34)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#dbdb8d\", style: { width: p20, background: \"rgb(219, 219, 141)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#17becf\", style: { width: p20, background: \"rgb(23, 190, 207)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9edae5\", style: { width: p20, background: \"rgb(158, 218, 229)\" } })\n    );\n    schemesJSX[\"category20b\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#393b79\", style: { width: p20, background: \"rgb(57, 59, 121)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#5254a3\", style: { width: p20, background: \"rgb(82, 84, 163)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#6b6ecf\", style: { width: p20, background: \"rgb(107, 110, 207)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9c9ede\", style: { width: p20, background: \"rgb(156, 158, 222)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#637939\", style: { width: p20, background: \"rgb(99, 121, 57)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8ca252\", style: { width: p20, background: \"rgb(140, 162, 82)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b5cf6b\", style: { width: p20, background: \"rgb(181, 207, 107)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#cedb9c\", style: { width: p20, background: \"rgb(206, 219, 156)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8c6d31\", style: { width: p20, background: \"rgb(140, 109, 49)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bd9e39\", style: { width: p20, background: \"rgb(189, 158, 57)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e7ba52\", style: { width: p20, background: \"rgb(231, 186, 82)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e7cb94\", style: { width: p20, background: \"rgb(231, 203, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#843c39\", style: { width: p20, background: \"rgb(132, 60, 57)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ad494a\", style: { width: p20, background: \"rgb(173, 73, 74)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d6616b\", style: { width: p20, background: \"rgb(214, 97, 107)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e7969c\", style: { width: p20, background: \"rgb(231, 150, 156)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#7b4173\", style: { width: p20, background: \"rgb(123, 65, 115)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a55194\", style: { width: p20, background: \"rgb(165, 81, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ce6dbd\", style: { width: p20, background: \"rgb(206, 109, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#de9ed6\", style: { width: p20, background: \"rgb(222, 158, 214)\" } })\n    );\n    schemesJSX[\"category20c\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#3182bd\", style: { width: p20, background: \"rgb(49, 130, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#6baed6\", style: { width: p20, background: \"rgb(107, 174, 214)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9ecae1\", style: { width: p20, background: \"rgb(158, 202, 225)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c6dbef\", style: { width: p20, background: \"rgb(198, 219, 239)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e6550d\", style: { width: p20, background: \"rgb(230, 85, 13)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fd8d3c\", style: { width: p20, background: \"rgb(253, 141, 60)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdae6b\", style: { width: p20, background: \"rgb(253, 174, 107)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdd0a2\", style: { width: p20, background: \"rgb(253, 208, 162)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#31a354\", style: { width: p20, background: \"rgb(49, 163, 84)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#74c476\", style: { width: p20, background: \"rgb(116, 196, 118)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a1d99b\", style: { width: p20, background: \"rgb(161, 217, 155)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c7e9c0\", style: { width: p20, background: \"rgb(199, 233, 192)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#756bb1\", style: { width: p20, background: \"rgb(117, 107, 177)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9e9ac8\", style: { width: p20, background: \"rgb(158, 154, 200)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bcbddc\", style: { width: p20, background: \"rgb(188, 189, 220)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#dadaeb\", style: { width: p20, background: \"rgb(218, 218, 235)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#636363\", style: { width: p20, background: \"rgb(99, 99, 99)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#969696\", style: { width: p20, background: \"rgb(150, 150, 150)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bdbdbd\", style: { width: p20, background: \"rgb(189, 189, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d9d9d9\", style: { width: p20, background: \"rgb(217, 217, 217)\" } })\n    );\n    schemesJSX[\"dark2\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#1b9e77\", style: { width: p8, background: \"rgb(27, 158, 119)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d95f02\", style: { width: p8, background: \"rgb(217, 95, 2)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#7570b3\", style: { width: p8, background: \"rgb(117, 112, 179)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e7298a\", style: { width: p8, background: \"rgb(231, 41, 138)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#66a61e\", style: { width: p8, background: \"rgb(102, 166, 30)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e6ab02\", style: { width: p8, background: \"rgb(230, 171, 2)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a6761d\", style: { width: p8, background: \"rgb(166, 118, 29)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#666666\", style: { width: p8, background: \"rgb(102, 102, 102)\" } })\n    );\n    schemesJSX[\"paired\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#a6cee3\", style: { width: p12, background: \"rgb(166, 206, 227)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#1f78b4\", style: { width: p12, background: \"rgb(31, 120, 180)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b2df8a\", style: { width: p12, background: \"rgb(178, 223, 138)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#33a02c\", style: { width: p12, background: \"rgb(51, 160, 44)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fb9a99\", style: { width: p12, background: \"rgb(251, 154, 153)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e31a1c\", style: { width: p12, background: \"rgb(227, 26, 28)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdbf6f\", style: { width: p12, background: \"rgb(253, 191, 111)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff7f00\", style: { width: p12, background: \"rgb(255, 127, 0)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#cab2d6\", style: { width: p12, background: \"rgb(202, 178, 214)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#6a3d9a\", style: { width: p12, background: \"rgb(106, 61, 154)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffff99\", style: { width: p12, background: \"rgb(255, 255, 153)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b15928\", style: { width: p12, background: \"rgb(177, 89, 40)\" } })\n    );\n    schemesJSX[\"pastel1\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#fbb4ae\", style: { width: p9, background: \"rgb(251, 180, 174)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b3cde3\", style: { width: p9, background: \"rgb(179, 205, 227)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ccebc5\", style: { width: p9, background: \"rgb(204, 235, 197)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#decbe4\", style: { width: p9, background: \"rgb(222, 203, 228)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fed9a6\", style: { width: p9, background: \"rgb(254, 217, 166)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffffcc\", style: { width: p9, background: \"rgb(255, 255, 204)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e5d8bd\", style: { width: p9, background: \"rgb(229, 216, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fddaec\", style: { width: p9, background: \"rgb(253, 218, 236)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f2f2f2\", style: { width: p9, background: \"rgb(242, 242, 242)\" } })\n    );\n    schemesJSX[\"pastel2\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#b3e2cd\", style: { width: p8, background: \"rgb(179, 226, 205)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdcdac\", style: { width: p8, background: \"rgb(253, 205, 172)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#cbd5e8\", style: { width: p8, background: \"rgb(203, 213, 232)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f4cae4\", style: { width: p8, background: \"rgb(244, 202, 228)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e6f5c9\", style: { width: p8, background: \"rgb(230, 245, 201)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fff2ae\", style: { width: p8, background: \"rgb(255, 242, 174)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f1e2cc\", style: { width: p8, background: \"rgb(241, 226, 204)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#cccccc\", style: { width: p8, background: \"rgb(204, 204, 204)\" } })\n    );\n    schemesJSX[\"set1\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#e41a1c\", style: { width: p9, background: \"rgb(228, 26, 28)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#377eb8\", style: { width: p9, background: \"rgb(55, 126, 184)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#4daf4a\", style: { width: p9, background: \"rgb(77, 175, 74)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#984ea3\", style: { width: p9, background: \"rgb(152, 78, 163)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff7f00\", style: { width: p9, background: \"rgb(255, 127, 0)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffff33\", style: { width: p9, background: \"rgb(255, 255, 51)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a65628\", style: { width: p9, background: \"rgb(166, 86, 40)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f781bf\", style: { width: p9, background: \"rgb(247, 129, 191)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#999999\", style: { width: p9, background: \"rgb(153, 153, 153)\" } })\n    );\n    schemesJSX[\"set2\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#66c2a5\", style: { width: p8, background: \"rgb(102, 194, 165)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fc8d62\", style: { width: p8, background: \"rgb(252, 141, 98)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8da0cb\", style: { width: p8, background: \"rgb(141, 160, 203)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e78ac3\", style: { width: p8, background: \"rgb(231, 138, 195)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a6d854\", style: { width: p8, background: \"rgb(166, 216, 84)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffd92f\", style: { width: p8, background: \"rgb(255, 217, 47)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e5c494\", style: { width: p8, background: \"rgb(229, 196, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b3b3b3\", style: { width: p8, background: \"rgb(179, 179, 179)\" } })\n    );\n    schemesJSX[\"set3\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#8dd3c7\", style: { width: p12, background: \"rgb(141, 211, 199)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffffb3\", style: { width: p12, background: \"rgb(255, 255, 179)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bebada\", style: { width: p12, background: \"rgb(190, 186, 218)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fb8072\", style: { width: p12, background: \"rgb(251, 128, 114)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#80b1d3\", style: { width: p12, background: \"rgb(128, 177, 211)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdb462\", style: { width: p12, background: \"rgb(253, 180, 98)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b3de69\", style: { width: p12, background: \"rgb(179, 222, 105)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fccde5\", style: { width: p12, background: \"rgb(252, 205, 229)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d9d9d9\", style: { width: p12, background: \"rgb(217, 217, 217)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bc80bd\", style: { width: p12, background: \"rgb(188, 128, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ccebc5\", style: { width: p12, background: \"rgb(204, 235, 197)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffed6f\", style: { width: p12, background: \"rgb(255, 237, 111)\" } })\n    );\n    schemesJSX[\"tableau10\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#4c78a8\", style: { width: p10, background: \"rgb(76, 120, 168)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f58518\", style: { width: p10, background: \"rgb(245, 133, 24)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e45756\", style: { width: p10, background: \"rgb(228, 87, 86)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#72b7b2\", style: { width: p10, background: \"rgb(114, 183, 178)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#54a24b\", style: { width: p10, background: \"rgb(84, 162, 75)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#eeca3b\", style: { width: p10, background: \"rgb(238, 202, 59)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b279a2\", style: { width: p10, background: \"rgb(178, 121, 162)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff9da6\", style: { width: p10, background: \"rgb(255, 157, 166)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9d755d\", style: { width: p10, background: \"rgb(157, 117, 93)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bab0ac\", style: { width: p10, background: \"rgb(186, 176, 172)\" } })\n    );\n    schemesJSX[\"tableau20\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#4c78a8\", style: { width: p20, background: \"rgb(76, 120, 168)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9ecae9\", style: { width: p20, background: \"rgb(158, 202, 233)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f58518\", style: { width: p20, background: \"rgb(245, 133, 24)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffbf79\", style: { width: p20, background: \"rgb(255, 191, 121)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#54a24b\", style: { width: p20, background: \"rgb(84, 162, 75)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#88d27a\", style: { width: p20, background: \"rgb(136, 210, 122)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b79a20\", style: { width: p20, background: \"rgb(183, 154, 32)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f2cf5b\", style: { width: p20, background: \"rgb(242, 207, 91)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#439894\", style: { width: p20, background: \"rgb(67, 152, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#83bcb6\", style: { width: p20, background: \"rgb(131, 188, 182)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e45756\", style: { width: p20, background: \"rgb(228, 87, 86)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff9d98\", style: { width: p20, background: \"rgb(255, 157, 152)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#79706e\", style: { width: p20, background: \"rgb(121, 112, 110)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bab0ac\", style: { width: p20, background: \"rgb(186, 176, 172)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d67195\", style: { width: p20, background: \"rgb(214, 113, 149)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fcbfd2\", style: { width: p20, background: \"rgb(252, 191, 210)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b279a2\", style: { width: p20, background: \"rgb(178, 121, 162)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d6a5c9\", style: { width: p20, background: \"rgb(214, 165, 201)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9e765f\", style: { width: p20, background: \"rgb(158, 118, 95)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d8b5a5\", style: { width: p20, background: \"rgb(216, 181, 165)\" } })\n    );\n    loaded$5 = true;\n  }\n  function categorical(selected) {\n    if (!loaded$5)\n      load$7();\n    return [\n      schemeOption(selected, \"accent\"),\n      schemeOption(selected, \"category10\"),\n      schemeOption(selected, \"category20\"),\n      schemeOption(selected, \"category20b\"),\n      schemeOption(selected, \"category20c\"),\n      schemeOption(selected, \"dark2\"),\n      schemeOption(selected, \"paired\"),\n      schemeOption(selected, \"pastel1\"),\n      schemeOption(selected, \"pastel2\"),\n      schemeOption(selected, \"set1\"),\n      schemeOption(selected, \"set2\"),\n      schemeOption(selected, \"set3\"),\n      schemeOption(selected, \"tableau10\"),\n      schemeOption(selected, \"tableau20\")\n    ];\n  }\n  let loaded$4 = false;\n  function load$6() {\n    schemesJSX[\"rainbow\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-rainbow\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#6e40aa\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#bf3caf\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#fe4b83\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#ff7847\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#e2b72f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#aff05b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#52f667\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#1ddfa3\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#23abd8\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#4c6edb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#6e40aa\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-rainbow)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"sinebow\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-sinebow\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#ff4040\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#e78d0b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#a7d503\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#58fc2a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#18f472\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#00bfbf\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#1872f4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#582afc\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#a703d5\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#e70b8d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ff4040\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-sinebow)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    loaded$4 = true;\n  }\n  function cyclical(selected) {\n    if (!loaded$4)\n      load$6();\n    return [\n      schemeOption(selected, \"rainbow\"),\n      schemeOption(selected, \"sinebow\")\n    ];\n  }\n  let loaded$3 = false;\n  function load$5() {\n    schemesJSX[\"blueorange\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-blueorange\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(5, 48, 97)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(34, 101, 163)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(75, 148, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(143, 194, 221)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(205, 227, 238)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(242, 240, 235)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(253, 221, 179)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(248, 182, 100)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(221, 132, 31)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(178, 90, 9)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(127, 59, 8)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-blueorange)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"brownbluegreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-brownbluegreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(84, 48, 5)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(139, 84, 15)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(188, 132, 53)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(222, 190, 123)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(242, 228, 192)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(238, 241, 234)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(195, 231, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(127, 201, 191)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(57, 152, 143)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(10, 103, 95)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 60, 48)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-brownbluegreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purplegreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purplegreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(64, 0, 75)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(115, 47, 128)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(154, 109, 170)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(193, 164, 205)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(228, 210, 230)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(239, 240, 239)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(214, 238, 209)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(162, 215, 158)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(92, 173, 101)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(33, 120, 57)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 68, 27)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purplegreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"pinkyellowgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-pinkyellowgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(142, 1, 82)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(192, 38, 126)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(221, 114, 173)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(240, 179, 214)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(250, 221, 237)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(245, 243, 239)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(225, 242, 202)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(182, 222, 135)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(128, 187, 71)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(79, 145, 37)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(39, 100, 25)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-pinkyellowgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purpleorange\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purpleorange\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(45, 0, 75)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(85, 45, 132)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(129, 112, 172)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(176, 170, 208)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(215, 215, 233)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(243, 238, 234)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(253, 221, 179)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(248, 182, 100)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(221, 132, 31)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(178, 90, 9)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(127, 59, 8)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purpleorange)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(103, 0, 31)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(172, 32, 47)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(213, 96, 80)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(241, 163, 133)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(251, 215, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(242, 239, 238)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(205, 227, 238)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(143, 194, 221)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(75, 148, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(34, 101, 163)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(5, 48, 97)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redgrey\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redgrey\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(103, 0, 31)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(172, 32, 47)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(213, 96, 80)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(241, 163, 133)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(252, 216, 197)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(250, 244, 241)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(223, 223, 223)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(184, 184, 184)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(134, 134, 134)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(78, 78, 78)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(26, 26, 26)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redgrey)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redyellowblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redyellowblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(165, 0, 38)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(212, 50, 44)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(241, 110, 67)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(252, 172, 100)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 221, 144)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(250, 248, 193)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(220, 241, 236)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(171, 214, 232)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(117, 171, 208)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(74, 116, 180)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(49, 54, 149)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redyellowblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redyellowgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redyellowgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(165, 0, 38)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(212, 50, 44)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(241, 110, 67)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(252, 172, 99)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 221, 141)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(249, 247, 174)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(215, 238, 142)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(164, 216, 110)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(100, 188, 97)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(34, 150, 79)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 104, 55)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redyellowgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"spectral\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-spectral\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(158, 1, 66)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(209, 60, 75)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(240, 112, 74)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(252, 172, 99)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 221, 141)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(251, 248, 176)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(224, 243, 161)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(169, 221, 162)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(105, 189, 169)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(66, 136, 181)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(94, 79, 162)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-spectral)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    loaded$3 = true;\n  }\n  function diverging(selected) {\n    if (!loaded$3)\n      load$5();\n    return [\n      schemeOption(selected, \"blueorange\"),\n      schemeOption(selected, \"brownbluegreen\"),\n      schemeOption(selected, \"purplegreen\"),\n      schemeOption(selected, \"pinkyellowgreen\"),\n      schemeOption(selected, \"purpleorange\"),\n      schemeOption(selected, \"redblue\"),\n      schemeOption(selected, \"redgrey\"),\n      schemeOption(selected, \"redyellowblue\"),\n      schemeOption(selected, \"redyellowgreen\"),\n      schemeOption(selected, \"spectral\")\n    ];\n  }\n  let loaded$2 = false;\n  function load$4() {\n    colorSchemes.filter((cs) => cs.colors.length === 2).map((binaryScheme, i) => {\n      schemesJSX[binaryScheme.scheme] = base$1.react.createElement(\"div\", { className: \"swatch\" }, binaryScheme.colors.map((color2, j) => base$1.react.createElement(\"div\", { key: j, title: color2, style: { width: \"50%\", backgroundColor: color2 } })));\n    });\n    loaded$2 = true;\n  }\n  function dual(selected) {\n    if (!loaded$2)\n      load$4();\n    return colorSchemes.filter((cs) => cs.colors.length === 2).map((binaryScheme, i) => schemeOption(selected, binaryScheme.scheme));\n  }\n  let loaded$1 = false;\n  function load$3() {\n    schemesJSX[\"viridis\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-viridis\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#440154\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#482475\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#414487\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#355f8d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#2a788e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#21918c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#22a884\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#44bf70\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#7ad151\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#bddf26\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#fde725\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-viridis)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"inferno\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-inferno\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#000004\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#160b39\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#420a68\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#6a176e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#932667\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#bc3754\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#dd513a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f37819\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#fca50a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#f6d746\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#fcffa4\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-inferno)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"magma\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-magma\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#000004\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#140e36\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#3b0f70\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#641a80\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#8c2981\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#b73779\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#de4968\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f7705c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#fe9f6d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#fecf92\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#fcfdbf\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-magma)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"plasma\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-plasma\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#0d0887\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#41049d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#6a00a8\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#8f0da4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#b12a90\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#cc4778\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#e16462\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f2844b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#fca636\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#fcce25\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#f0f921\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-plasma)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"cividis\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-cividis\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#002051\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#0a326a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#2b446e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#4d566d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#696970\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#7f7c75\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#948f78\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#ada476\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#caba6a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#ead156\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#fdea45\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-cividis)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"turbo\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-turbo\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#23171b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#4a58dd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#2f9df5\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#27d7c4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#4df884\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#95fb51\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#dedd32\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#ffa423\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#f65f18\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#ba2208\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#900c00\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-turbo)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"bluegreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-bluegreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 252, 253)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(232, 246, 249)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(213, 239, 237)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(183, 228, 218)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(143, 211, 193)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(104, 194, 163)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(73, 177, 127)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(47, 153, 89)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(21, 127, 60)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(3, 100, 41)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 68, 27)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-bluegreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"bluepurple\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-bluepurple\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 252, 253)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(228, 238, 245)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(204, 221, 236)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(178, 202, 225)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(156, 179, 213)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(143, 149, 198)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(140, 116, 181)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(137, 82, 165)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(133, 45, 143)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(115, 15, 113)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(77, 0, 75)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-bluepurple)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"goldgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-goldgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#f4d166\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#d5ca60\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#b6c35c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#98bb59\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#7cb257\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#60a656\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#4b9c53\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#3f8f4f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#33834a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#257740\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#146c36\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-goldgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"goldorange\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-goldorange\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#f4d166\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#f8be5c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#f8aa4c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#f5983b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#f3852a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#ef701b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#e2621f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#d65322\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#c54923\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#b14223\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#9e3a26\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-goldorange)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"goldred\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-goldred\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#f4d166\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#f6be59\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#f9aa51\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#fc964e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#f6834b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#ee734a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#e56249\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#db5247\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#cf4244\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#c43141\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#b71d3e\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-goldred)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"greenblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-greenblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 252, 240)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(229, 245, 223)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(211, 238, 206)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(189, 229, 191)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(158, 217, 187)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(123, 203, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(88, 183, 205)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(57, 156, 198)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(29, 126, 183)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(11, 96, 161)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(8, 64, 129)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-greenblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"orangered\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-orangered\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 247, 236)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(254, 235, 207)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(253, 220, 175)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(253, 202, 148)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(253, 176, 122)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(250, 142, 93)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(241, 108, 73)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(224, 69, 48)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(200, 29, 19)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(167, 4, 3)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(127, 0, 0)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-orangered)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purplebluegreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purplebluegreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 247, 251)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(239, 231, 242)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(219, 216, 234)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(190, 201, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(152, 185, 217)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(105, 168, 207)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(64, 150, 192)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(25, 135, 159)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(3, 120, 119)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(1, 99, 83)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(1, 70, 54)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purplebluegreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purpleblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purpleblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 247, 251)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(239, 234, 244)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(219, 218, 235)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(191, 201, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(155, 185, 217)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(114, 168, 207)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(67, 148, 195)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(26, 125, 182)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(6, 103, 161)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(4, 82, 129)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(2, 56, 88)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purpleblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purplered\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purplered\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 244, 249)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(234, 227, 240)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(220, 201, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(208, 170, 210)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(208, 138, 194)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(221, 99, 174)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(227, 56, 144)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(215, 28, 108)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(183, 11, 79)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(143, 2, 58)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(103, 0, 31)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purplered)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redpurple\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redpurple\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 247, 243)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(253, 228, 225)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(252, 207, 204)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(251, 181, 188)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(249, 147, 176)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(243, 105, 163)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(224, 62, 152)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(192, 23, 136)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(153, 3, 124)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(112, 1, 116)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(73, 0, 106)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redpurple)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"yellowgreenblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-yellowgreenblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 217)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(239, 249, 189)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(213, 238, 179)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(169, 221, 183)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(115, 201, 189)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(69, 180, 194)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(40, 151, 191)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(32, 115, 178)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(35, 78, 160)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(28, 49, 133)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(8, 29, 88)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-yellowgreenblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"yellowgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-yellowgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 229)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(247, 252, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(228, 244, 172)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(199, 232, 155)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(162, 216, 138)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(120, 197, 120)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(78, 175, 99)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(47, 148, 78)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(21, 121, 63)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(3, 96, 52)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 69, 41)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-yellowgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"yelloworangebrown\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-yelloworangebrown\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 229)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(255, 248, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(254, 234, 161)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(254, 214, 118)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 186, 74)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(251, 153, 44)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(238, 121, 24)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(216, 91, 10)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(183, 67, 4)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(143, 50, 4)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(102, 37, 6)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-yelloworangebrown)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"yelloworangered\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-yelloworangered\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 204)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(255, 240, 169)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(254, 224, 135)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(254, 201, 101)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 171, 75)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(253, 137, 60)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(250, 92, 46)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(236, 48, 35)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(211, 17, 33)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(175, 2, 37)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(128, 0, 38)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-yelloworangered)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#323232\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#2e4463\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#1e588a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#086da7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#0082b9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#039ac7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#12b1d4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#2bc8e2\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#3ddff0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#61f4fb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffffff\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkgold\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkgold\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#3c3c3c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#554a38\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#6d5a35\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#846f32\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#a0832d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#bf9828\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#dbb022\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f0cb23\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#fae241\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#fff290\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffffff\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkgold)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#3a3a3a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#245447\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#076a4c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#038145\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#2d9642\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#5fa941\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#89bb3f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#b3cb3b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#dbdc34\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#ffed39\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffffaa\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkmulti\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkmulti\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#373737\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#294767\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#1e5b88\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#1a748b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#1f8e7e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#29a869\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#6abf50\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#aad332\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#eae30d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#fff166\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffffff\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkmulti)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkred\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkred\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#343434\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#643633\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#8c3a36\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#b03e38\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#d14632\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#e75d1e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#eb7e20\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#ed9c25\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#efb92d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#f3d431\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffeb2c\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkred)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lightgreyred\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lightgreyred\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#efe9e6\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#e2dcd9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#d7cecb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#ccc1be\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#c0b4af\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#c4a293\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#d38b66\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#de7336\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#e15917\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#df3a10\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#dc000b\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lightgreyred)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lightgreyteal\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lightgreyteal\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#e4eaea\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#d7ddde\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#cbd1d4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#bcc6ca\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#adbac0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#85b2be\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#4aacc1\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#22a1c2\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#2192c0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#1e84be\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#1876bc\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lightgreyteal)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lightmulti\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lightmulti\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#e0f1f2\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#caebd7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#b8e2b3\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#bddf93\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#d8e17e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#f6e072\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#f6c659\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f4a946\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#f58a3f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#f56c3f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ef4a3c\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lightmulti)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lightorange\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lightorange\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#f2e7da\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#f7d7bd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#f9c7a0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#fab78a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#faa47a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#f8936d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#f38264\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#ed725f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#e6605b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#dd4f5b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#d43d5b\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lightorange)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lighttealblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lighttealblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#e3e9e0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#c4ddd1\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#a2d1cb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#84c4c9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#66b5c3\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#49a7bd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#3698b4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#3188a9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#2d799e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#276994\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#255988\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lighttealblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    loaded$1 = true;\n  }\n  function sequentialMultiHue(selected) {\n    if (!loaded$1)\n      load$3();\n    return [\n      schemeOption(selected, \"viridis\"),\n      schemeOption(selected, \"magma\"),\n      schemeOption(selected, \"inferno\"),\n      schemeOption(selected, \"plasma\"),\n      schemeOption(selected, \"cividis\"),\n      schemeOption(selected, \"turbo\"),\n      schemeOption(selected, \"bluegreen\"),\n      schemeOption(selected, \"bluepurple\"),\n      schemeOption(selected, \"goldgreen\"),\n      schemeOption(selected, \"goldorange\"),\n      schemeOption(selected, \"goldred\"),\n      schemeOption(selected, \"greenblue\"),\n      schemeOption(selected, \"orangered\"),\n      schemeOption(selected, \"purplebluegreen\"),\n      schemeOption(selected, \"purpleblue\"),\n      schemeOption(selected, \"purplered\"),\n      schemeOption(selected, \"redpurple\"),\n      schemeOption(selected, \"yellowgreenblue\"),\n      schemeOption(selected, \"yellowgreen\"),\n      schemeOption(selected, \"yelloworangebrown\"),\n      schemeOption(selected, \"yelloworangered\"),\n      schemeHeader(\"schemeSequentialMultiHueDark\", strings$1.schemeSequentialMultiHueDark),\n      schemeOption(selected, \"darkblue\"),\n      schemeOption(selected, \"darkgold\"),\n      schemeOption(selected, \"darkgreen\"),\n      schemeOption(selected, \"darkmulti\"),\n      schemeOption(selected, \"darkred\"),\n      schemeHeader(\"schemeSequentialMultiHueLight\", strings$1.schemeSequentialMultiHueLight),\n      schemeOption(selected, \"lightgreyred\"),\n      schemeOption(selected, \"lightgreyteal\"),\n      schemeOption(selected, \"lightmulti\"),\n      schemeOption(selected, \"lightorange\"),\n      schemeOption(selected, \"lighttealblue\")\n    ];\n  }\n  let loaded = false;\n  function load$2() {\n    schemesJSX[\"blues\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-blues\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 251, 255)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(227, 238, 249)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(207, 225, 242)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(181, 212, 233)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(147, 195, 223)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(109, 174, 213)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(75, 151, 201)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(47, 126, 188)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(24, 100, 170)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(10, 74, 144)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(8, 48, 107)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-blues)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"tealblues\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-tealblues\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#bce4d8\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#a3d6d2\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#8cc9cd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#76bdc7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#5fb0c0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#45a2b9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#3993b0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#3584a6\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#32759b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#2f6790\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#2c5985\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-tealblues)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"teals\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-teals\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#bbdfdf\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#a2d4d5\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#8ac9c9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#75bcbb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#61b0af\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#4da5a4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#379998\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#2b8b8c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#1e7f7f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#127273\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#006667\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-teals)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"greens\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-greens\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 252, 245)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(232, 246, 227)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(211, 238, 205)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(183, 226, 177)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(151, 212, 148)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(115, 195, 120)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(77, 175, 98)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(47, 152, 79)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(21, 127, 59)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(3, 100, 41)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 68, 27)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-greens)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"greys\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-greys\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 255)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(242, 242, 242)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(226, 226, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(206, 206, 206)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(180, 180, 180)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(151, 151, 151)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(122, 122, 122)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(95, 95, 95)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(64, 64, 64)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(30, 30, 30)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 0, 0)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-greys)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purples\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purples\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(252, 251, 253)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(241, 239, 246)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(226, 225, 239)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(206, 206, 229)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(182, 181, 216)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(158, 155, 201)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(135, 130, 188)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(115, 99, 172)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(97, 64, 155)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(80, 31, 140)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(63, 0, 125)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purples)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"browns\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-browns\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#eedbbd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#ecca96\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#e9b97a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#e4a865\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#dc9856\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#d18954\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#c7784c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#c0673f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#b85536\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#ad4433\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#9f3632\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-browns)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"reds\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-reds\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 245, 240)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(254, 227, 214)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(253, 201, 180)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(252, 170, 142)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(252, 138, 107)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(249, 105, 76)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(239, 69, 51)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(217, 39, 35)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(187, 21, 26)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(151, 11, 19)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(103, 0, 13)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-reds)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"oranges\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-oranges\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 245, 235)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(254, 232, 211)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(253, 216, 179)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(253, 194, 140)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(253, 167, 98)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(251, 141, 61)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(242, 112, 29)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(226, 86, 9)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(196, 65, 3)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(159, 51, 3)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(127, 39, 4)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-oranges)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"warmgreys\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-warmgreys\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#dcd4d0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#cec5c1\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#c0b8b4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#b3aaa7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#a59c99\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#98908c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#8b827f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#7e7673\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#726866\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#665c5a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#59504e\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-warmgreys)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    loaded = true;\n  }\n  function sequentialSingleHue(selected) {\n    if (!loaded)\n      load$2();\n    return [\n      schemeOption(selected, \"blues\"),\n      schemeOption(selected, \"tealblues\"),\n      schemeOption(selected, \"teals\"),\n      schemeOption(selected, \"greens\"),\n      schemeOption(selected, \"browns\"),\n      schemeOption(selected, \"oranges\"),\n      schemeOption(selected, \"reds\"),\n      schemeOption(selected, \"purples\"),\n      schemeOption(selected, \"warmgreys\"),\n      schemeOption(selected, \"greys\")\n    ];\n  }\n  const maxDistinctColors = 20;\n  function Palette(props) {\n    const { distinctValueCount } = props.colorColumn.stats;\n    const isDual = distinctValueCount === 2;\n    const categoricalNumeric = distinctValueCount > 0 && distinctValueCount < maxDistinctColors;\n    let isQualitative = false;\n    let isQuantitative2 = false;\n    switch (props.colorColumn.type) {\n      case \"boolean\":\n      case \"string\":\n        isQualitative = true;\n        break;\n      case \"number\":\n        isQuantitative2 = true;\n        break;\n      case \"date\":\n      case \"integer\":\n        isQuantitative2 = true;\n        isQualitative = categoricalNumeric;\n    }\n    const selected = props.scheme;\n    const options2 = [];\n    function menu(name, opts) {\n      if (options2.length) {\n        options2.push({\n          key: \"divider\" + options2.length,\n          text: null,\n          itemType: base$1.fluentUI.DropdownMenuItemType.Divider\n        });\n      }\n      options2.push({\n        key: name,\n        text: name,\n        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n      });\n      options2.push.apply(options2, opts);\n    }\n    isQualitative && menu(strings$1.schemeCategorical, categorical(selected));\n    isQuantitative2 && menu(strings$1.schemeSequentialSingleHue, sequentialSingleHue(selected));\n    isQuantitative2 && menu(strings$1.schemeSequentialMultiHue, sequentialMultiHue(selected));\n    isQuantitative2 && menu(strings$1.schemeDiverging, diverging(selected));\n    isQuantitative2 && menu(strings$1.schemeCyclical, cyclical(selected));\n    isDual && menu(strings$1.schemeDual, dual(selected));\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"sanddance-palette\" },\n      base$1.react.createElement(\"div\", { className: \"sanddance-explanation\", dangerouslySetInnerHTML: {\n        __html: strings$1.labelColorFieldInfo(props.colorColumn.name, props.colorColumn.type, categoricalNumeric, distinctValueCount)\n      } }),\n      base$1.react.createElement(Dropdown$1, { collapseLabel: props.collapseLabel, disabled: props.disabled, dropdownWidth: 400, label: strings$1.labelColorScheme, onRenderOption: (option) => {\n        if (option.itemType === base$1.fluentUI.DropdownMenuItemType.Header) {\n          return base$1.react.createElement(\"span\", null, option.text);\n        } else {\n          return base$1.react.createElement(\n            \"div\",\n            { className: \"sanddance-scheme option\" },\n            base$1.react.createElement(\"span\", { className: \"name\" }, option.scheme),\n            option.children\n          );\n        }\n      }, options: options2, onChange: (e, o) => {\n        props.changeColorScheme(o.scheme);\n      } }),\n      base$1.react.createElement(\"div\", { className: classList(\"sanddance-scheme\", props.disabled && \"disabled\") }, props.scheme && schemesJSX[props.scheme])\n    );\n  }\n  function Color(props) {\n    const colorColumn = props.dataContent.columns.filter((c2) => c2.name === props.colorColumn)[0];\n    const disabledColorBin = !colorColumn || !colorColumn.quantitative || props.directColor;\n    const colorBin = props.colorBin || \"quantize\";\n    const dropdownRef = base$1.react.createRef();\n    props.explorer.dialogFocusHandler.focus = () => {\n      var _a2;\n      return (_a2 = dropdownRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n    };\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"sanddance-color-dialog\" },\n      base$1.react.createElement(\n        Group$1,\n        { label: strings$1.labelColor },\n        base$1.react.createElement(ColumnMap, Object.assign({}, props, { componentRef: dropdownRef, collapseLabel: props.compactUI, selectedColumnName: props.colorColumn, specRole: props.specCapabilities && props.specCapabilities.roles.filter((r) => r.role === \"color\")[0], key: 0 })),\n        colorColumn && colorColumn.isColorData && base$1.react.createElement(\"div\", { className: \"sanddance-explanation\", dangerouslySetInnerHTML: { __html: strings$1.labelColorFieldIsColorData(colorColumn.name) } }),\n        colorColumn && !colorColumn.isColorData && base$1.react.createElement(Palette, { collapseLabel: props.compactUI, scheme: props.scheme, colorColumn, changeColorScheme: (scheme2) => {\n          props.onColorSchemeChange(scheme2);\n        }, disabled: props.disabled || props.directColor || colorColumn && colorColumn.isColorData }),\n        colorColumn && !colorColumn.isColorData && base$1.react.createElement(Signal, { disabled: props.disabled || !colorColumn || props.directColor || colorColumn && colorColumn.isColorData, signal: props.colorReverseSignal, explorer: props.explorer, initialValue: getInitialSignalValue(props.explorer, props.colorReverseSignal), onChange: props.onColorReverseChange, collapseLabel: props.compactUI })\n      ),\n      colorColumn && !colorColumn.isColorData && base$1.react.createElement(\n        Group$1,\n        { label: strings$1.labelColorBin },\n        base$1.react.createElement(\"div\", { className: \"sanddance-explanation\" }, strings$1.labelColorBinExplanation),\n        base$1.react.createElement(base$1.fluentUI.ChoiceGroup, { selectedKey: colorBin, options: [\n          {\n            key: \"continuous\",\n            text: strings$1.labelColorBinNone,\n            disabled: disabledColorBin\n          },\n          {\n            key: \"quantize\",\n            text: strings$1.labelColorBinQuantize,\n            disabled: disabledColorBin\n          },\n          {\n            key: \"quantile\",\n            text: strings$1.labelColorBinQuantile,\n            disabled: disabledColorBin\n          }\n        ], onChange: (e, o) => {\n          props.onColorBinChange(o.key);\n        } }),\n        base$1.react.createElement(Signal, { disabled: props.disabled || disabledColorBin || props.colorBin === \"continuous\", signal: props.colorBinSignal, explorer: props.explorer, initialValue: getInitialSignalValue(props.explorer, props.colorBinSignal), onChange: props.onColorBinCountChange, collapseLabel: props.compactUI })\n      ),\n      colorColumn && !colorColumn.isColorData && base$1.react.createElement(\n        Group$1,\n        { label: strings$1.labelColorOptions },\n        base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.selectDirectColor, disabled: !colorColumn.stats.hasColorData, checked: !!(colorColumn.stats.hasColorData && props.directColor), onChange: (e, checked) => props.onDirectColorChange(checked) }),\n        base$1.react.createElement(\"div\", { className: \"sanddance-explanation\", dangerouslySetInnerHTML: { __html: strings$1.labelDataColors } })\n      )\n    );\n  }\n  const KeyCodes$1 = {\n    ENTER: 13\n  };\n  function isNumber$2(value2) {\n    if (typeof value2 === \"number\")\n      return true;\n    if (!isNaN(value2))\n      return true;\n    return false;\n  }\n  function isBoolean$2(value2) {\n    if (typeof value2 === \"boolean\")\n      return true;\n    if (typeof value2 === \"string\") {\n      switch (value2.toLowerCase()) {\n        case \"true\":\n        case \"false\":\n          return true;\n      }\n    }\n    return false;\n  }\n  function bingSearchLink(column, value2) {\n    if (isNumber$2(value2))\n      return null;\n    if (isBoolean$2(value2))\n      return null;\n    if (column && column.stats.distinctValueCount === 2)\n      return null;\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"bing-search\" },\n      base$1.react.createElement(\"a\", { href: `https://www.bing.com/search?q=${encodeURIComponent(value2)}`, target: \"_blank\", title: strings$1.bingsearchDescription(value2), \"aria-label\": strings$1.bingsearchDescription(value2) }, strings$1.bingsearch)\n    );\n  }\n  function displayValue(value2) {\n    switch (value2) {\n      case \"\": {\n        return { special: true, display: strings$1.labelBlank };\n      }\n      case null: {\n        return { special: true, display: strings$1.labelNull };\n      }\n      case true: {\n        return { special: true, display: strings$1.labelTrue };\n      }\n      case false: {\n        return { special: true, display: strings$1.labelFalse };\n      }\n      default: {\n        if (typeof value2 === \"object\") {\n          if (value2 instanceof Date) {\n            const d2 = value2;\n            return displayValue(d2.input);\n          }\n          return { special: false, display: value2.toLocaleString() };\n        }\n        return { special: false, display: value2 };\n      }\n    }\n  }\n  function displayValueElement(nvp) {\n    const d2 = displayValue(nvp.value);\n    if (d2.special) {\n      return base$1.react.createElement(\"i\", null, d2.display);\n    }\n    return d2.display;\n  }\n  function DataItem(props) {\n    if (!props.item) {\n      return null;\n    }\n    const nameValuePairs = [];\n    for (const columnName in props.item) {\n      if (columnName === GL_ORDINAL && !props.showSystemFields) {\n        continue;\n      }\n      if (isInternalFieldName(columnName)) {\n        continue;\n      }\n      const nameValuePair = {\n        columnName,\n        value: props.item[columnName]\n      };\n      if (!props.bingSearchDisabled) {\n        nameValuePair.bingSearch = bingSearchLink(props.columns.filter((c2) => c2.name === columnName)[0], props.item[columnName]);\n      }\n      nameValuePairs.push(nameValuePair);\n    }\n    return base$1.react.createElement(\"div\", { className: \"sanddance-dataItem\" }, nameValuePairs.map((nameValuePair, i) => {\n      const ex = {\n        key: 0,\n        name: nameValuePair.columnName,\n        operator: \"==\",\n        value: nameValuePair.value\n      };\n      if (nameValuePair.value === null || nameValuePair.value === \"\") {\n        ex.operator = \"isnullorEmpty\";\n        delete ex.value;\n      }\n      const searchClick = (e) => {\n        const search = {\n          key: 0,\n          expressions: [ex]\n        };\n        props.onSearch(e, [search]);\n      };\n      const title = strings$1.tooltipSearch(nameValuePair.columnName, displayValue(nameValuePair.value).display);\n      return base$1.react.createElement(\n        \"div\",\n        { key: i, onClick: !props.disabled ? searchClick : null, title, onKeyUp: (e) => {\n          if (e.keyCode === KeyCodes$1.ENTER) {\n            searchClick(e);\n          }\n        }, tabIndex: 0, className: \"name-value\" },\n        base$1.react.createElement(\"div\", { className: \"column-name\" }, nameValuePair.columnName),\n        base$1.react.createElement(\"div\", { className: \"column-value\" }, displayValueElement(nameValuePair)),\n        nameValuePair.bingSearch\n      );\n    }));\n  }\n  const dataBrowserZeroMessages = {};\n  dataBrowserZeroMessages[DataScopeId.AllData] = strings$1.labelZeroAll;\n  dataBrowserZeroMessages[DataScopeId.FilteredData] = null;\n  dataBrowserZeroMessages[DataScopeId.SelectedData] = strings$1.labelZeroSearchResults;\n  const dataBrowserNullMessages = {};\n  dataBrowserNullMessages[DataScopeId.AllData] = strings$1.labelDataNullAll;\n  dataBrowserNullMessages[DataScopeId.FilteredData] = strings$1.labelDataNullFiltered;\n  dataBrowserNullMessages[DataScopeId.SelectedData] = strings$1.labelDataNullSelection;\n  function DataBrowser(props) {\n    function activateRecord(newIndex) {\n      props.onActivate(props.data[newIndex], newIndex);\n    }\n    const { index: index2 } = props;\n    const length2 = props.data && props.data.length || 0;\n    const dropdownRef = base$1.react.createRef();\n    props.explorer.dialogFocusHandler.focus = () => {\n      var _a2;\n      return (_a2 = dropdownRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n    };\n    return base$1.react.createElement(\n      Group$1,\n      { label: strings$1.labelDataBrowser, className: \"sanddance-dataIndex\" },\n      base$1.react.createElement(Dropdown$1, { componentRef: dropdownRef, label: strings$1.labelDataScope, collapseLabel: true, options: [\n        {\n          key: DataScopeId.AllData,\n          text: strings$1.selectDataSpanAll,\n          isSelected: props.selectedDataScope === DataScopeId.AllData\n        },\n        {\n          key: DataScopeId.FilteredData,\n          text: strings$1.selectDataSpanFilter,\n          isSelected: props.selectedDataScope === DataScopeId.FilteredData\n        },\n        {\n          key: DataScopeId.SelectedData,\n          text: strings$1.selectDataSpanSelection,\n          isSelected: props.selectedDataScope === DataScopeId.SelectedData\n        }\n      ], onChange: (e, o) => {\n        props.onDataScopeClick(o.key);\n      } }),\n      !props.data && base$1.react.createElement(\"div\", { dangerouslySetInnerHTML: { __html: props.nullMessage } }),\n      props.data && !props.data.length && base$1.react.createElement(\"div\", null, props.zeroMessage),\n      !!length2 && base$1.react.createElement(\n        \"div\",\n        null,\n        base$1.react.createElement(\n          \"div\",\n          { className: \"index\" },\n          base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, iconName: \"ChevronLeftMed\", onClick: (e) => activateRecord(index2 <= 0 ? length2 - 1 : index2 - 1), disabled: props.disabled || length2 === 1, title: strings$1.buttonPrevDataItem }),\n          base$1.react.createElement(\"span\", null, strings$1.record(index2 + 1, length2)),\n          base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, iconName: \"ChevronRightMed\", onClick: (e) => activateRecord(index2 >= length2 - 1 ? 0 : index2 + 1), disabled: props.disabled || length2 === 1, title: strings$1.buttonNextDataItem })\n        ),\n        !props.itemVisible && base$1.react.createElement(\"div\", { className: \"item-filtered\" }, strings$1.labelDataItemIsFiltered),\n        base$1.react.createElement(DataItem, { columns: props.columns, item: props.data[index2], disabled: props.disabled, onSearch: props.onSearch, bingSearchDisabled: props.bingSearchDisabled })\n      ),\n      base$1.react.createElement(ColumnTypeChanger, { theme: props.theme, themePalette: props.themePalette, initialCategoricalColumns: props.categoricalColumns, initialQuantitativeColumns: props.quantitativeColumns, onConfirmUpdate: props.onUpdateColumnTypes }),\n      props.dataExportHandler && props.data && base$1.react.createElement(DataExportPicker, { theme: props.theme, initializer: {\n        fileName: `${removeExtensions(props.displayName)} (${props.data.length})`\n      }, data: props.data, dataExportHandler: props.dataExportHandler, disabled: props.disabled })\n    );\n  }\n  function History(props) {\n    return base$1.react.createElement(\n      Group$1,\n      { label: strings$1.labelHistory, className: \"sanddance-history\" },\n      base$1.react.createElement(\"ol\", null, props.historyItems.map((hi, i) => {\n        let ref2;\n        if (i === props.historyIndex) {\n          ref2 = base$1.react.createRef();\n          props.explorer.dialogFocusHandler.focus = () => {\n            var _a2;\n            (_a2 = ref2.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n          };\n        }\n        return base$1.react.createElement(\n          \"li\",\n          { key: i, className: classList(i === props.historyIndex && \"selected\"), onKeyUp: (e) => {\n            if (e.keyCode === KeyCodes$1.ENTER) {\n              props.redo(i);\n            }\n          } },\n          base$1.react.createElement(base$1.fluentUI.DefaultButton, { className: \"sanddance-history-button\", componentRef: ref2, text: hi.label, onClick: () => props.redo(i) })\n        );\n      }))\n    );\n  }\n  function getPureInsight(historicInsight) {\n    const { colorBin, columns, directColor, facetStyle, filter: filter2, hideAxes, hideLegend, scheme: scheme2, signalValues, size, totalStyle, transform: transform2, chart, view } = historicInsight;\n    const insight = {\n      colorBin,\n      columns,\n      directColor,\n      facetStyle,\n      filter: filter2,\n      hideAxes,\n      hideLegend,\n      scheme: scheme2,\n      signalValues,\n      size,\n      totalStyle,\n      transform: transform2,\n      chart,\n      view\n    };\n    return insight;\n  }\n  function replay(historyItems, index2) {\n    let filter2 = null;\n    let historicInsight = {};\n    for (let i = 0; i < index2 + 1; i++) {\n      const historyItem = historyItems[i];\n      if (historyItem) {\n        if (historyItem.historicInsight.filter === null) {\n          filter2 = null;\n        } else if (historyItem.historicInsight.rebaseFilter) {\n          filter2 = historyItem.historicInsight.filter;\n        } else if (historyItem.historicInsight.filter) {\n          filter2 = narrow(filter2, historyItem.historicInsight.filter);\n        }\n        historicInsight = Object.assign(Object.assign({}, historicInsight), historyItem.historicInsight);\n      }\n    }\n    return Object.assign(Object.assign({}, historicInsight), { filter: filter2 });\n  }\n  function hasClientXY(e) {\n    if (e && e.clientX !== void 0 && e.clientX !== void 0) {\n      return { top: e.clientY, left: e.clientX };\n    }\n  }\n  function getPosition(e) {\n    const xy = hasClientXY(e);\n    if (xy) {\n      return xy;\n    }\n    const te = e;\n    if (te === null || te === void 0 ? void 0 : te.touches) {\n      for (let i = 0; i < te.touches.length; i++) {\n        const xy2 = hasClientXY(te.touches[i]);\n        if (xy2) {\n          return xy2;\n        }\n      }\n    }\n    const el = e.target;\n    if (el && el.getClientRects) {\n      return el.getClientRects()[0];\n    }\n  }\n  function initPrefs(prefs, partialInsight) {\n    if (partialInsight) {\n      const specTypePrefs = prefs[partialInsight.chart] || {};\n      prefs[partialInsight.chart] = specTypePrefs;\n      for (const _role in partialInsight.columns) {\n        const role = _role;\n        if (role === \"color\" || role === \"x\") {\n          const rolePrefs = specTypePrefs[role] || {};\n          specTypePrefs[role] = rolePrefs;\n          const column = partialInsight.columns[role];\n          const copySignalValue = (signalName) => {\n            if (partialInsight.signalValues && partialInsight.signalValues[signalName] && rolePrefs[column]) {\n              const signalValues = rolePrefs[column].signalValues || {};\n              signalValues[signalName] = partialInsight.signalValues[signalName];\n              rolePrefs[column].signalValues = signalValues;\n            }\n          };\n          switch (role) {\n            case \"color\":\n              rolePrefs[column] = {\n                scheme: partialInsight.scheme,\n                colorBin: partialInsight.colorBin\n              };\n              copySignalValue(SignalNames.ColorBinCount);\n              break;\n            case \"x\":\n              copySignalValue(SignalNames.XBins);\n              break;\n          }\n        }\n      }\n    }\n  }\n  function saveSignalValuePref(prefs, chart, role, column, signalName, signalValue) {\n    const partialInsight = savePref(prefs, chart, role, column, { signalValues: {} });\n    partialInsight.signalValues[signalName] = signalValue;\n  }\n  function copyPrefToNewState(prefs, chart, role, columnName) {\n    const specTypePrefs = deepMerge({}, prefs[\"*\"], prefs[chart]);\n    const rolePrefs = deepMerge({}, specTypePrefs[\"*\"], specTypePrefs[role]);\n    const partialInsight = deepMerge({}, rolePrefs[\"*\"], rolePrefs[columnName]);\n    return partialInsight;\n  }\n  function savePref(prefs, chart, role, column, partialInsight) {\n    const SpecTypePrefs = prefs[chart] || {};\n    prefs[chart] = SpecTypePrefs;\n    const rolePrefs = SpecTypePrefs[role] || {};\n    SpecTypePrefs[role] = rolePrefs;\n    rolePrefs[column] = deepMerge({}, rolePrefs[column], partialInsight);\n    return rolePrefs[column];\n  }\n  function comparableGroup(group2) {\n    return Object.assign(Object.assign({}, group2), { clause: null });\n  }\n  function compareGroup(a2, b2) {\n    return compareGroup$1(comparableGroup(a2), comparableGroup(b2));\n  }\n  function compareGroups(haystack, needle) {\n    const groups = [];\n    let found = false;\n    haystack.forEach((group2) => {\n      if (compareGroup(group2, needle)) {\n        found = true;\n      } else {\n        groups.push(group2);\n      }\n    });\n    return { groups, found };\n  }\n  function createInputSearch(search) {\n    const groups = ensureSearchExpressionGroupArray(search);\n    const dialogSearch = groups.map((group2, groupIndex) => {\n      return Object.assign(Object.assign({ key: groupIndex }, group2), { expressions: group2.expressions.map((ex, i) => {\n        const ex2 = Object.assign({ key: i }, ex);\n        return ex2;\n      }) });\n    });\n    return dialogSearch;\n  }\n  function _Renderer(_props) {\n    class __Renderer extends base$1.react.Component {\n      constructor(props) {\n        var _a2, _b2;\n        super(props);\n        this.state = this.getInitialState(props);\n        if (!((_b2 = (_a2 = this.state.viewer) === null || _a2 === void 0 ? void 0 : _a2.presenter) === null || _b2 === void 0 ? void 0 : _b2.morphchartsref)) {\n          const t = setInterval(() => {\n            var _a3, _b3;\n            const newState = this.getInitialState(props);\n            if (this.mounted && ((_b3 = (_a3 = newState.viewer) === null || _a3 === void 0 ? void 0 : _a3.presenter) === null || _b3 === void 0 ? void 0 : _b3.morphchartsref)) {\n              clearInterval(t);\n              this.setState(newState);\n            }\n          }, 10);\n        }\n      }\n      componentDidMount() {\n        this.mounted = true;\n      }\n      componentWillUnmount() {\n        this.mounted = false;\n      }\n      getInitialState(props) {\n        const { viewer } = props.explorer;\n        return {\n          showOptions: false,\n          viewer\n        };\n      }\n      setOptions(newOptions) {\n        const { explorer: explorer2 } = this.props;\n        const renderer = Object.assign(Object.assign({}, explorer2.state.renderer), newOptions);\n        const { onSetupOptionsChanged } = explorer2.props;\n        if (onSetupOptionsChanged) {\n          const setup2 = explorer2.getSetup();\n          setup2.renderer = renderer;\n          onSetupOptionsChanged(setup2);\n        }\n        explorer2.setState({ renderer });\n      }\n      setBasicOptions(newOptions) {\n        this.setOptions({\n          advanced: false,\n          basicOptions: Object.assign(Object.assign({}, this.props.basicOptions), newOptions)\n        });\n      }\n      setAdvancedOptions(newOptions) {\n        this.setOptions({\n          advanced: true,\n          advancedOptions: Object.assign(Object.assign({}, this.props.advancedOptions), newOptions)\n        });\n      }\n      render() {\n        var _a2, _b2;\n        const { props, state } = this;\n        const iconButtonStyles = {\n          menuIcon: {\n            display: \"none\"\n          }\n        };\n        if (!((_b2 = (_a2 = state.viewer) === null || _a2 === void 0 ? void 0 : _a2.presenter) === null || _b2 === void 0 ? void 0 : _b2.morphchartsref)) {\n          return base$1.react.createElement(IconButton$1, { styles: iconButtonStyles, className: \"sanddance-advanced-renderer\", disabled: true, iconName: \"HourGlass\", onClick: void 0, themePalette: props.themePalette, title: strings$1.labelRenderer });\n        } else {\n          const { morphchartsref } = state.viewer.presenter;\n          const choiceButtonStyle = {\n            border: \"none\"\n          };\n          const { advanced, advancedOptions, basicOptions } = props;\n          return base$1.react.createElement(\n            \"div\",\n            null,\n            base$1.react.createElement(IconButton$1, { iconName: \"PicturePosition\", title: strings$1.buttonCameraHome, onClick: props.onHomeClick, styles: iconButtonStyles, themePalette: props.themePalette }),\n            base$1.react.createElement(IconButton$1, { styles: iconButtonStyles, className: \"sanddance-advanced-renderer\", iconName: advanced ? \"DiamondSolid\" : \"Diamond\", disabled: !morphchartsref.supportedRenders.advanced, onClick: void 0, themePalette: props.themePalette, title: morphchartsref.supportedRenders.advanced ? strings$1.labelRenderer : strings$1.labelRendererAdvancedDisabled, menuProps: {\n              items: [\n                {\n                  key: \"basic\",\n                  text: strings$1.labelRendererBasic,\n                  iconProps: {\n                    iconName: advanced ? null : \"RadioBullet\"\n                  },\n                  onClick: () => advanced && this.setOptions({ advanced: false })\n                  //disabled: !advanced,\n                },\n                {\n                  key: \"advanced\",\n                  text: strings$1.labelRendererAdvanced,\n                  iconProps: {\n                    iconName: advanced ? \"RadioBullet\" : null\n                  },\n                  onClick: () => !advanced && this.setOptions({ advanced: true })\n                  //disabled: advanced,\n                },\n                {\n                  key: \"options\",\n                  text: strings$1.labelRendererOptions,\n                  onClick: (e) => this.setState({ showOptions: true })\n                }\n              ]\n            } }),\n            base$1.react.createElement(\n              Dialog$1,\n              { hidden: !state.showOptions, dialogContentProps: {\n                className: \"sanddance-renderer-dialog\",\n                title: strings$1.labelRendererOptionsDialogTitle\n              }, onDismiss: () => this.setState({ showOptions: false }) },\n              base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(Button, { iconName: advanced ? \"RadioBtnOff\" : \"RadioBtnOn\", onClick: () => this.setOptions({ advanced: false }), text: strings$1.labelRendererBasic, themePalette: props.themePalette, rootStyle: choiceButtonStyle }),\n                base$1.react.createElement(\n                  \"ul\",\n                  null,\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: basicOptions.antialias, label: strings$1.labelRendererOptionsAntialias, onChange: (e, antialias) => this.setBasicOptions({ antialias }) })\n                  )\n                )\n              ),\n              base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(Button, { iconName: advanced ? \"RadioBtnOn\" : \"RadioBtnOff\", onClick: () => this.setOptions({ advanced: true }), text: strings$1.labelRendererAdvanced, themePalette: props.themePalette, rootStyle: choiceButtonStyle }),\n                base$1.react.createElement(\n                  \"ul\",\n                  null,\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isShadowEnabled, label: strings$1.labelRendererOptionsShadow, onChange: (e, isShadowEnabled) => this.setAdvancedOptions({ isShadowEnabled }) })\n                  ),\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isSsaoEnabled, label: strings$1.labelRendererOptionsSsao, onChange: (e, isSsaoEnabled) => this.setAdvancedOptions({ isSsaoEnabled }) })\n                  ),\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isBloomEnabled, label: strings$1.labelRendererOptionsBloom, onChange: (e, isBloomEnabled) => this.setAdvancedOptions({ isBloomEnabled }) }),\n                    base$1.react.createElement(\n                      \"ul\",\n                      null,\n                      base$1.react.createElement(\n                        \"li\",\n                        null,\n                        base$1.react.createElement(base$1.fluentUI.Slider, { value: advancedOptions.bloomIntensity, min: 0.1, max: 5, step: 0.01, label: strings$1.labelRendererOptionsBloomIntensity, onChange: (bloomIntensity) => this.setAdvancedOptions({ bloomIntensity, isBloomEnabled: true }) })\n                      )\n                    )\n                  ),\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isDofEnabled, label: strings$1.labelRendererOptionsDof, onChange: (e, isDofEnabled) => this.setAdvancedOptions({ isDofEnabled }) }),\n                    base$1.react.createElement(\n                      \"ul\",\n                      null,\n                      base$1.react.createElement(\n                        \"li\",\n                        null,\n                        base$1.react.createElement(base$1.fluentUI.Slider, { value: advancedOptions.dofFocusRange, min: 0, max: 2, step: 0.01, label: strings$1.labelRendererOptionsDofRange, onChange: (dofFocusRange) => this.setAdvancedOptions({ dofFocusRange, isDofEnabled: true }) })\n                      )\n                    )\n                  ),\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isFxaaEnabled, label: strings$1.labelRendererOptionsFxaa, onChange: (e, isFxaaEnabled) => this.setAdvancedOptions({ isFxaaEnabled }) })\n                  )\n                )\n              )\n            )\n          );\n        }\n      }\n    }\n    return new __Renderer(_props);\n  }\n  const Renderer$1 = _Renderer;\n  function _Explorer(_props) {\n    class __Explorer extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.dialogFocusHandler = {};\n        this.state = initialExplorerState(props);\n        this.imageHolder = { img: null, backgroundImageColumnBounds: [], showBackgroundImage: false };\n        this.snapshotThumbWidth = snapshotThumbWidth;\n        this.discardColorContextUpdates = true;\n        this.updateViewerOptions(Object.assign(Object.assign({}, clone(Viewer$1.defaultViewerOptions)), props.viewerOptions));\n      }\n      finalize() {\n        if (this.viewer)\n          this.viewer.finalize();\n      }\n      updateViewerOptions(viewerOptions) {\n        this.viewerOptions = Object.assign(Object.assign({}, deepMerge(defaultViewerOptions, {\n          tooltipOptions: {\n            prepareDataItem: ((item) => {\n              const ret = {};\n              for (const columnName in item) {\n                if (this.state.tooltipExclusions.indexOf(columnName) < 0) {\n                  ret[columnName] = item[columnName];\n                }\n              }\n              return ret;\n            })\n          }\n        }, this.viewerOptions, viewerOptions)), { onColorContextChange: () => this.manageColorToolbar(), onDataFilter: (filter2, filteredData) => {\n          const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n          selectedItemIndex[DataScopeId.FilteredData] = 0;\n          this.changeInsight({ filter: filter2 }, { label: this.historicFilterChange, omit: !this.historicFilterChange });\n          this.historicFilterChange = null;\n          this.setState({ filteredData, selectedItemIndex });\n          if (this.state.sideTabId === SideTabId.Data && this.state.dataScopeId === DataScopeId.FilteredData) {\n            requestAnimationFrame(() => filteredData && this.silentActivation(filteredData[0]));\n          }\n          viewerOptions && viewerOptions.onDataFilter && viewerOptions.onDataFilter(filter2, filteredData);\n        }, onSelectionChanged: (newSearch, index2, selectedData) => {\n          if (this.ignoreSelectionChange)\n            return;\n          const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n          selectedItemIndex[DataScopeId.SelectedData] = index2 || 0;\n          let { search } = this.state;\n          const { sideTabId } = this.state;\n          if (newSearch) {\n            search = createInputSearch(newSearch);\n          }\n          this.setState({ search, selectedItemIndex, sideTabId });\n          viewerOptions && viewerOptions.onSelectionChanged && viewerOptions.onSelectionChanged(newSearch, index2, selectedData);\n        }, onAxisClick: (e, search) => {\n          this.toggleableSearch(e, search);\n          viewerOptions && viewerOptions.onAxisClick && viewerOptions.onAxisClick(e, search);\n        }, onLegendHeaderClick: (e) => {\n          const pos = getPosition(e);\n          const specRole = this.state.specCapabilities && this.state.specCapabilities.roles.filter((r) => r.role === \"color\")[0];\n          const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), { collapseLabel: true, container: this.div, selectedColumnName: this.state.columns[\"color\"], onDismiss: () => {\n            this.setState({ positionedColumnMapProps: null });\n          }, specRole, left: pos.left - this.div.clientLeft, top: pos.top - this.div.clientTop });\n          this.setState({ positionedColumnMapProps });\n        }, onLegendRowClick: (e, legendRow) => {\n          this.toggleableSearch(e, legendRow.search);\n          viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onLegendRowClick(e, legendRow);\n        }, onError: (errors) => {\n          this.setState({ errors });\n          viewerOptions && viewerOptions.onError && viewerOptions.onError(errors);\n        }, onBeforeCreateLayers: (stage, specCapabilities) => {\n          attachSpecRoleToAxisTitle(stage, specCapabilities);\n        }, getTextColor: (o) => {\n          if (o.specRole) {\n            return colorFromString(this.viewerOptions.colors.clickableText);\n          } else if (o.metaData && o.metaData.search) {\n            return colorFromString(this.viewerOptions.colors.searchText);\n          } else {\n            return o.color;\n          }\n        }, getTextHighlightColor: (o) => {\n          if (o.specRole) {\n            return colorFromString(this.viewerOptions.colors.clickableTextHighlight);\n          } else if (o.metaData && o.metaData.search) {\n            return colorFromString(this.viewerOptions.colors.searchTextHighlight);\n          } else {\n            return [0, 0, 0, 0];\n          }\n        }, onTextClick: (e, text2) => {\n          if (e && text2) {\n            const pos = getPosition(e);\n            const rect2 = this.viewer.element.getBoundingClientRect();\n            pos.left += rect2.left;\n            pos.top += rect2.top;\n            const { specRole } = text2;\n            if (pos && specRole) {\n              const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), { collapseLabel: true, container: this.div, selectedColumnName: this.state.columns[specRole.role], onDismiss: () => {\n                this.setState({ positionedColumnMapProps: null });\n              }, specRole, left: pos.left, top: pos.top });\n              this.setState({ positionedColumnMapProps });\n            } else {\n              this.setState({ positionedColumnMapProps: null });\n            }\n          }\n        }, onNewViewStateTarget: () => this.newViewStateTarget });\n        if (this.viewer && this.viewer.presenter) {\n          const newPresenterStyle = getPresenterStyle(this.viewerOptions);\n          const mergePrenterStyle = Object.assign(Object.assign({}, this.viewer.presenter.style), newPresenterStyle);\n          this.viewer.presenter.style = mergePrenterStyle;\n          this.viewer.options = deepMerge(this.viewer.options, this.props.viewerOptions, this.viewerOptions);\n        }\n      }\n      signal(signalName, signalValue, newViewStateTarget) {\n        switch (signalName) {\n          case SignalNames.ColorBinCount:\n          case SignalNames.ColorReverse:\n          case SignalNames.MarkOpacity:\n            this.discardColorContextUpdates = false;\n            break;\n        }\n        this.newViewStateTarget = newViewStateTarget;\n        this.viewer.vegaViewGl.signal(signalName, signalValue);\n        this.viewer.vegaViewGl.runAsync().then(() => {\n          if (this.state.signalValues) {\n            this.state.signalValues[signalName] = signalValue;\n          }\n          this.discardColorContextUpdates = true;\n          this.newViewStateTarget = void 0;\n          this.props.onSignalChanged && this.props.onSignalChanged(signalName, signalValue);\n        });\n      }\n      manageColorToolbar() {\n        const canRemap = this.viewer.colorContexts && this.viewer.colorContexts.length > 1;\n        applyColorButtons(this.viewer.presenter, !!this.state.columns.color, {\n          themePalette: themePalettes[this.props.theme || \"\"],\n          canRemap,\n          isRemap: canRemap && this.viewer.currentColorContext > 0,\n          colorMapHandler: (remap) => {\n            this.viewer.currentColorContext = ~~remap;\n            this.viewer.renderSameLayout();\n            this.manageColorToolbar();\n          }\n        });\n      }\n      getInsight() {\n        return this.viewer.getInsight();\n      }\n      getSetup() {\n        return {\n          camera: this.state.holdCamera ? \"hold\" : this.state.camera,\n          renderer: this.state.renderer,\n          transition: getTransition(this.state),\n          transitionDurations: this.state.transitionDurations\n        };\n      }\n      setSetup(setup2, newState) {\n        newState.camera = void 0;\n        if (setup2) {\n          this.props.onSetupOptionsChanged && this.props.onSetupOptionsChanged(setup2);\n          const { camera, renderer, transition, transitionDurations } = setup2;\n          newState.renderer = renderer;\n          newState.transitionType = transition.type;\n          if (camera === \"hold\") {\n            newState.holdCamera = true;\n          } else {\n            newState.holdCamera = false;\n            newState.camera = camera;\n          }\n          if (transition.type === \"column\") {\n            newState.transitionColumn = transition.column;\n          } else if (transition.type === \"position\") {\n            newState.transitionDimension = transition.dimension;\n          }\n          if (transitionDurations) {\n            newState.transitionDurations = transitionDurations;\n            syncTansitionDurations(this.viewer, transitionDurations);\n          }\n        }\n      }\n      setInsight(historyAction, newState = {}, partialInsight = this.viewer.getInsight(), rebaseFilter, setup2) {\n        const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n        resetSelectedItemIndex(selectedItemIndex);\n        const historicInsight = Object.assign({ chart: null, scheme: null, columns: null, filter: null, rebaseFilter }, partialInsight);\n        const state = Object.assign({ filteredData: null, selectedItemIndex, search: createInputSearch(historicInsight.filter) }, newState);\n        const changeInsight = () => {\n          this.getColorContext = null;\n          this.setSetup(setup2, historicInsight);\n          this.changeInsight(historicInsight, historyAction, state, setup2);\n        };\n        const currentFilter = this.viewer.getInsight().filter;\n        if (rebaseFilter && currentFilter && historicInsight.filter) {\n          if (startsWith(historicInsight.filter, currentFilter)) {\n            changeInsight();\n          } else {\n            const { transitionDurations } = this.state;\n            const renderTime = transitionDurations.position + transitionDurations.stagger;\n            const allowAsyncRenderTime = renderTime + this.viewerOptions.filterRenderingTimerPadding;\n            this.viewer.reset().then(() => new Promise((resolve2, reject) => {\n              setTimeout(resolve2, allowAsyncRenderTime);\n            })).then(changeInsight);\n          }\n        } else {\n          changeInsight();\n        }\n      }\n      handleReviveSnapshot(snapshot, selectedSnapshotIndex) {\n        let handled = false;\n        if (this.props.onSnapshotClick) {\n          this.setState({ selectedSnapshotIndex });\n          handled = this.props.onSnapshotClick(snapshot, selectedSnapshotIndex);\n        }\n        if (!handled) {\n          this.reviveSnapshot(selectedSnapshotIndex);\n        }\n      }\n      reviveSnapshot(snapshotOrIndex) {\n        if (typeof snapshotOrIndex === \"number\") {\n          const selectedSnapshotIndex = snapshotOrIndex;\n          const snapshot = this.state.snapshots[selectedSnapshotIndex];\n          const newState = { note: snapshot.description, selectedSnapshotIndex };\n          if (!this.state.sidebarClosed) {\n            newState.sideTabId = SideTabId.Snapshots;\n            this.scrollSnapshotIntoView(selectedSnapshotIndex);\n          }\n          if (snapshot.insight) {\n            const { backgroundImage } = snapshot.insight;\n            this.imageHolder.showBackgroundImage = !!backgroundImage;\n            if (backgroundImage) {\n              this.imageHolder.img = {\n                src: backgroundImage.url,\n                height: backgroundImage.size.height,\n                width: backgroundImage.size.width\n              };\n            }\n          }\n          this.setInsight({ label: strings$1.labelHistoryReviveSnapshot }, newState, snapshot.insight, true, snapshot.setup);\n        } else {\n          const snapshot = snapshotOrIndex;\n          if (snapshot.insight) {\n            this.setInsight({ label: strings$1.labelHistoryReviveSnapshot }, { note: snapshot.description, selectedSnapshotIndex: -1 }, snapshot.insight, true, snapshot.setup);\n          } else {\n            this.setState({ note: snapshot.description, selectedSnapshotIndex: -1 });\n          }\n        }\n      }\n      load(data2, getPartialInsight, optionsOrPrefs) {\n        this.setState({ historyIndex: -1, historyItems: [] });\n        this.changeInsight({ columns: null }, { label: null, omit: true }, { note: null });\n        return new Promise((resolve2, reject) => {\n          const loadFinal = (dataContent) => {\n            let partialInsight;\n            this.prefs = optionsOrPrefs && optionsOrPrefs.chartPrefs || optionsOrPrefs || {};\n            this.imageHolder.backgroundImageColumnBounds = getBackgroundImageColumnBounds(dataContent.columns);\n            if (getPartialInsight) {\n              partialInsight = getPartialInsight(dataContent.columns);\n              initPrefs(this.prefs, partialInsight);\n            }\n            if (!partialInsight) {\n              const r = new RecommenderSummary(dataContent.columns, dataContent.data);\n              partialInsight = r.recommend();\n            }\n            partialInsight = Object.assign({ facetStyle: \"wrap\", filter: null, totalStyle: null, transform: null }, partialInsight);\n            if (partialInsight.chart === \"barchart\") {\n              partialInsight.chart = \"barchartV\";\n            }\n            const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n            const sideTabId = SideTabId.ChartType;\n            resetSelectedItemIndex(selectedItemIndex);\n            const newState = Object.assign({\n              camera: void 0,\n              columns: {},\n              dataFile,\n              dataContent,\n              snapshots: dataContent.snapshots || this.state.snapshots,\n              autoCompleteDistinctValues: {},\n              filteredData: null,\n              tooltipExclusions: optionsOrPrefs && optionsOrPrefs.tooltipExclusions || [],\n              selectedItemIndex,\n              sideTabId\n            }, partialInsight);\n            this.getColorContext = null;\n            ensureColumnsExist(newState.columns, dataContent.columns, newState.transform);\n            const errors = ensureColumnsPopulated(partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.chart, partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.totalStyle, newState.columns, dataContent.columns);\n            newState.errors = errors;\n            newState.transitionColumn = dataContent.columns[0];\n            const setup2 = optionsOrPrefs && optionsOrPrefs.setup;\n            this.setSetup(setup2, newState);\n            this.changeInsight(partialInsight, { label: strings$1.labelHistoryInit, insert: true }, newState, optionsOrPrefs && optionsOrPrefs.setup);\n            this.activateDataBrowserItem(sideTabId, this.state.dataScopeId);\n            resolve2();\n          };\n          let dataFile;\n          if (Array.isArray(data2)) {\n            return loadDataArray(data2, \"json\", optionsOrPrefs && optionsOrPrefs.columnTypes).then((result) => {\n              dataFile = {\n                type: \"json\"\n              };\n              loadFinal(result);\n            }).catch(reject);\n          } else {\n            dataFile = data2;\n            return loadDataFile(dataFile, optionsOrPrefs && optionsOrPrefs.columnTypes).then(loadFinal).catch(reject);\n          }\n        });\n      }\n      changeChartType(chart) {\n        const partialInsight = Object.assign({}, copyPrefToNewState(this.prefs, chart, \"*\", \"*\"));\n        const insight = Object.assign({ chart }, partialInsight);\n        const columns = deepMerge({}, partialInsight.columns, this.state.columns);\n        const { signalValues } = this.viewer.getInsight();\n        insight.signalValues = Object.assign(Object.assign({}, this.state.signalValues), signalValues);\n        insight.columns = Object.assign({}, columns);\n        insight.totalStyle = this.state.totalStyle;\n        let errors;\n        if (this.state.chart === \"scatterplot\" && (chart === \"barchart\" || chart === \"barchartV\")) {\n          insight.columns = Object.assign(Object.assign({}, columns), { sort: columns.y });\n        } else if (this.state.chart === \"scatterplot\" && chart === \"barchartH\") {\n          insight.columns = Object.assign(Object.assign({}, columns), { sort: columns.x });\n        } else if (chart === \"treemap\") {\n          insight.view = \"2d\";\n          if (!columns.size) {\n            let sizeColumn;\n            if (partialInsight && partialInsight.columns && partialInsight.columns.size) {\n              const prefSizeColumn = this.state.dataContent.columns.filter((c2) => c2.name === partialInsight.columns.size)[0];\n              if (prefSizeColumn && prefSizeColumn.quantitative) {\n                sizeColumn = prefSizeColumn;\n              }\n            }\n            if (!sizeColumn) {\n              sizeColumn = getTreemapColumn(this.state.dataContent.columns);\n            }\n            if (!sizeColumn) {\n              errors = [strings$1.errorColumnMustBeNumeric];\n            } else {\n              insight.columns = Object.assign(Object.assign({}, columns), { size: sizeColumn.name });\n            }\n          }\n        } else if (chart === \"stacks\") {\n          insight.view = \"3d\";\n        }\n        ensureColumnsExist(insight.columns, this.state.dataContent.columns, this.state.transform);\n        errors = ensureColumnsPopulated(chart, insight.totalStyle, insight.columns, this.state.dataContent.columns);\n        this.calculate(() => {\n          this.changeInsight(insight, { label: strings$1.labelHistoryChangeChartType(chartLabel(chart)) }, errors ? { errors, camera: void 0 } : { camera: void 0 });\n        });\n        return insight.columns;\n      }\n      calculate(calculating) {\n        this.setState({ calculating });\n      }\n      changeView(view) {\n        this.changeInsight({ view }, { label: view === \"2d\" ? strings$1.labelViewType2d : strings$1.labelViewType3d });\n      }\n      //state members which change the insight\n      changeInsight(partialInsight, historyAction, additionalUIState, historicSetup) {\n        if (!partialInsight.signalValues) {\n          partialInsight.signalValues = null;\n        }\n        if (partialInsight.chart === \"barchart\") {\n          partialInsight.chart = \"barchartV\";\n        }\n        this.addHistory(Object.assign(Object.assign({}, partialInsight), { historicSetup }), historyAction, additionalUIState);\n      }\n      addHistory(historicInsight, historyAction, additionalUIState) {\n        const setCleanState = (newState) => {\n          const cleanState = Object.assign(Object.assign({}, newState), additionalUIState);\n          if (!cleanState.note) {\n            cleanState.note = null;\n          }\n          delete cleanState.rebaseFilter;\n          if (this.viewer) {\n            const { signalValues } = this.viewer.getInsight();\n            cleanState.signalValues = Object.assign(Object.assign(Object.assign({}, this.state.signalValues), signalValues), cleanState.signalValues);\n          }\n          this.setState(cleanState);\n        };\n        if (historyAction.omit) {\n          setCleanState(historicInsight);\n          return;\n        }\n        const historyItems = this.state.historyItems.slice(0, this.state.historyIndex + 1);\n        const historyIndex = historyItems.length;\n        historyItems.push({ label: historyAction.label, historicInsight });\n        if (historyAction.insert) {\n          setCleanState({ historyIndex, historyItems });\n        } else {\n          setCleanState(Object.assign(Object.assign({}, historicInsight), { historyIndex, historyItems }));\n        }\n      }\n      replay(index2) {\n        return replay(this.state.historyItems, index2);\n      }\n      undo() {\n        const historyIndex = this.state.historyIndex - 1;\n        if (historyIndex < 0)\n          return;\n        this.doReplay(historyIndex);\n      }\n      redo(historyIndex = this.state.historyIndex + 1) {\n        if (historyIndex >= this.state.historyItems.length)\n          return;\n        this.doReplay(historyIndex);\n      }\n      doReplay(historyIndex) {\n        const newState = this.replay(historyIndex);\n        this.rebaseFilter = true;\n        this.setSetup(newState.historicSetup, newState);\n        this.setState(Object.assign(Object.assign({}, newState), { historyIndex }));\n      }\n      changespecCapabilities(specCapabilities) {\n        this.setState({ specCapabilities });\n      }\n      changeColumnMapping(role, column, options2) {\n        const columns = Object.assign({}, this.state.columns);\n        const label2 = column ? strings$1.labelHistoryMapColumn(role) : strings$1.labelHistoryUnMapColumn(role);\n        const final = () => {\n          const partialInsight = { columns, totalStyle: options2 ? options2.totalStyle : this.state.totalStyle };\n          const errors = ensureColumnsPopulated(this.state.chart, partialInsight.totalStyle, partialInsight.columns, this.state.dataContent.columns);\n          columns[role] = column && column.name;\n          this.changeInsight(partialInsight, { label: label2 }, errors ? { errors, camera: this.viewer.getCamera() } : { camera: this.viewer.getCamera() });\n        };\n        const _changeInsight = (newInsight, columnUpdate, historyAction) => {\n          newInsight.columns = deepMerge({}, columns, columnUpdate);\n          savePref(this.prefs, this.state.chart, \"*\", \"*\", { columns: columnUpdate });\n          this.changeInsight(newInsight, historyAction, { camera: this.viewer.getCamera() });\n        };\n        if (column) {\n          let columnUpdate;\n          switch (role) {\n            case \"facet\": {\n              copyPrefToNewState(this.prefs, this.state.chart, \"facet\", column.name);\n              const historicInsight = { columns, facetStyle: options2 ? options2.facetStyle : this.state.facetStyle };\n              columnUpdate = { facet: column.name };\n              _changeInsight(historicInsight, columnUpdate, { label: label2 });\n              break;\n            }\n            case \"color\": {\n              let calculating = null;\n              const historicInsight = { scheme: options2 && options2.scheme, columns, colorBin: this.state.colorBin };\n              if (!historicInsight.scheme) {\n                copyPrefToNewState(this.prefs, this.state.chart, \"color\", column.name);\n              }\n              if (!historicInsight.scheme) {\n                historicInsight.scheme = bestColorScheme(column, null, this.state.scheme);\n              }\n              if (!column.stats.hasColorData) {\n                historicInsight.directColor = false;\n                if (this.state.directColor !== historicInsight.directColor) {\n                  calculating = () => this._resize();\n                }\n              }\n              if (this.state.columns && this.state.columns.color && this.state.columns.color !== column.name) {\n                const currColorColumn = this.state.dataContent.columns.filter((c2) => c2.name === this.state.columns.color)[0];\n                if (column.isColorData != currColorColumn.isColorData) {\n                  calculating = () => this._resize();\n                }\n              }\n              this.ignoreSelectionChange = true;\n              this.viewer.deselect().then(() => {\n                this.ignoreSelectionChange = false;\n                requestAnimationFrame(() => {\n                  columnUpdate = { color: column.name };\n                  this.getColorContext = null;\n                  this.setState({ calculating });\n                  _changeInsight(historicInsight, columnUpdate, { label: label2 });\n                });\n              });\n              break;\n            }\n            case \"x\": {\n              copyPrefToNewState(this.prefs, this.state.chart, \"x\", column.name);\n              const historicInsight = { columns };\n              columnUpdate = { x: column.name };\n              _changeInsight(historicInsight, columnUpdate, { label: label2 });\n              break;\n            }\n            case \"size\": {\n              copyPrefToNewState(this.prefs, this.state.chart, \"size\", column.name);\n              const historicInsight = { totalStyle: options2 ? options2.totalStyle : this.state.totalStyle };\n              columnUpdate = { size: column.name };\n              _changeInsight(historicInsight, columnUpdate, { label: label2 });\n              break;\n            }\n            default: {\n              final();\n              break;\n            }\n          }\n        } else {\n          switch (role) {\n            case \"facet\": {\n              columns.facet = null;\n              columns.facetV = null;\n              this.changeInsight({ columns, facetStyle: \"wrap\" }, { label: label2 });\n              break;\n            }\n            default: {\n              final();\n              break;\n            }\n          }\n        }\n      }\n      setSideTabId(sideTabId, dataScopeId) {\n        if (sideTabId === SideTabId.Data && dataScopeId == null) {\n          dataScopeId = this.getBestDataScopeId();\n        }\n        if (dataScopeId == null) {\n          dataScopeId = this.state.dataScopeId;\n        }\n        const calculating = () => {\n          this.dialogFocusHandler.focus && this.dialogFocusHandler.focus();\n        };\n        this.setState({ sideTabId, dataScopeId, sidebarClosed: false, calculating });\n        this.activateDataBrowserItem(sideTabId, dataScopeId);\n      }\n      getBestDataScopeId() {\n        let dataScopeId;\n        const selectionState = this.viewer && this.viewer.getSelection();\n        if (selectionState && selectionState.selectedData && selectionState.selectedData.length) {\n          dataScopeId = DataScopeId.SelectedData;\n        } else if (this.state.filteredData) {\n          dataScopeId = DataScopeId.FilteredData;\n        } else {\n          dataScopeId = DataScopeId.AllData;\n        }\n        return dataScopeId;\n      }\n      activateDataBrowserItem(sideTabId, dataScopeId) {\n        if (!this.viewer)\n          return;\n        let itemToActivate;\n        if (sideTabId === SideTabId.Data) {\n          switch (dataScopeId) {\n            case DataScopeId.AllData: {\n              itemToActivate = this.state.dataContent && this.state.dataContent.data[this.state.selectedItemIndex[DataScopeId.AllData]];\n              break;\n            }\n            case DataScopeId.FilteredData: {\n              itemToActivate = this.state.filteredData && this.state.filteredData[this.state.selectedItemIndex[DataScopeId.FilteredData]];\n              break;\n            }\n            case DataScopeId.SelectedData: {\n              const selection = this.viewer.getSelection() || {};\n              itemToActivate = selection.selectedData && selection.selectedData[this.state.selectedItemIndex[DataScopeId.SelectedData]];\n              break;\n            }\n          }\n        }\n        this.silentActivation(itemToActivate);\n      }\n      silentActivation(itemToActivate) {\n        this.ignoreSelectionChange = true;\n        const done = () => {\n          this.ignoreSelectionChange = false;\n        };\n        if (itemToActivate) {\n          return this.viewer.activate(itemToActivate).then(done);\n        } else {\n          return this.viewer.deActivate().then(done);\n        }\n      }\n      sidebar(sidebarClosed, sidebarPinned) {\n        this.setState({ sidebarClosed, sidebarPinned });\n      }\n      resize() {\n        this.setState({ calculating: () => this._resize() });\n      }\n      _resize() {\n        this.changeInsight({ size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed) }, { label: \"resize\", omit: true });\n      }\n      viewerMounted(glDiv) {\n        this.setState({\n          size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed),\n          signalValues: this.state.signalValues\n          //keep initialized signalValues\n        });\n      }\n      getLayoutDivSize(pinned, closed) {\n        const div = pinned && !closed ? this.layoutDivPinned : this.layoutDivUnpinned;\n        return { height: div.offsetHeight, width: div.offsetWidth };\n      }\n      toggleableSearch(e, search) {\n        if (e.ctrlKey) {\n          this.setState({ search: createInputSearch(search) });\n          this.setSideTabId(SideTabId.Search);\n        } else {\n          const oldSelection = this.viewer.getSelection();\n          if (oldSelection.search) {\n            const result = compareGroups(ensureSearchExpressionGroupArray(oldSelection.search), search);\n            if (result.found) {\n              if (result.groups.length === 0) {\n                this.doDeselect();\n              } else {\n                this.doSelect(result.groups);\n              }\n            } else {\n              if (e.altKey || e.shiftKey) {\n                let group2 = true;\n                if (e.altKey) {\n                  search.clause = \"&&\";\n                } else if (e.shiftKey) {\n                  if (this.props.searchORDisabled) {\n                    group2 = false;\n                  } else {\n                    search.clause = \"||\";\n                  }\n                }\n                if (group2) {\n                  result.groups.push(search);\n                  this.doSelect(result.groups);\n                } else {\n                  this.doSelect(search);\n                }\n              } else {\n                this.doSelect(search);\n              }\n            }\n          } else {\n            this.doSelect(search);\n          }\n        }\n      }\n      doFilter(search, historicFilterChange) {\n        this.historicFilterChange = historicFilterChange;\n        this.viewer.filter(search);\n      }\n      doUnfilter(historicFilterChange) {\n        this.historicFilterChange = historicFilterChange;\n        this.viewer.reset();\n      }\n      doSelect(search) {\n        return this.viewer.select(search);\n      }\n      doDeselect() {\n        return this.viewer.deselect();\n      }\n      writeSnapshot(snapshot, editIndex) {\n        let { selectedSnapshotIndex } = this.state;\n        let snapshots;\n        if (editIndex >= 0) {\n          snapshots = [...this.state.snapshots];\n          snapshots[editIndex] = snapshot;\n          this.setState({ snapshots, selectedSnapshotIndex });\n        } else {\n          const note = snapshot.description;\n          snapshots = this.state.snapshots.concat(snapshot);\n          selectedSnapshotIndex = snapshots.length - 1;\n          this.scrollSnapshotIntoView(selectedSnapshotIndex);\n          this.setState({ sideTabId: SideTabId.Snapshots, snapshots, selectedSnapshotIndex, note });\n        }\n        this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n      }\n      scrollSnapshotIntoView(selectedSnapshotIndex) {\n        clearTimeout(this.scrollSnapshotTimer);\n        if (this.state.sidebarClosed)\n          return;\n        this.scrollSnapshotTimer = setTimeout(() => {\n          const selectedSnapshotElement = this.div.querySelector(`.snapshot:nth-child(${selectedSnapshotIndex + 1})`);\n          if (selectedSnapshotElement) {\n            selectedSnapshotElement.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n          }\n        }, 500);\n      }\n      componentDidMount() {\n        if (this.props.mounted) {\n          this.props.mounted(this);\n        }\n      }\n      render() {\n        var _a2, _b2, _c2;\n        const insight = getPureInsight(this.state);\n        const loaded2 = !!(insight.columns && this.state.dataContent);\n        if (loaded2) {\n          setInsightBackgroundImage(insight, this.imageHolder, this.state.columns);\n        }\n        const selectionState = this.viewer && this.viewer.getSelection() || {};\n        const selectionSearch = selectionState && selectionState.search;\n        const columnMapProps = this.getColumnMapBaseProps();\n        const datas = {};\n        datas[DataScopeId.AllData] = this.state.dataContent && this.state.dataContent.data;\n        datas[DataScopeId.FilteredData] = this.state.filteredData;\n        datas[DataScopeId.SelectedData] = selectionState && selectionState.selectedData;\n        if (this.state.calculating) {\n          requestAnimationFrame(() => {\n            if (this.state.calculating) {\n              this.state.calculating();\n              this.setState({ calculating: null });\n            }\n          });\n        }\n        const theme = this.props.theme || \"\";\n        const themePalette = themePalettes[theme];\n        let renderOptions;\n        if (loaded2) {\n          renderOptions = Object.assign(Object.assign({}, this.props.renderOptions), { rebaseFilter: () => this.rebaseFilter, initialColorContext: this.getColorContext && this.getColorContext(this.viewer.insight, insight), discardColorContextUpdates: () => this.discardColorContextUpdates, columns: (_a2 = this.state.dataContent) === null || _a2 === void 0 ? void 0 : _a2.columns });\n        }\n        return base$1.react.createElement(\n          \"div\",\n          { ref: (div) => {\n            if (div)\n              this.div = div;\n          }, className: classList(\"sanddance-explorer\", this.props.theme) },\n          base$1.react.createElement(Topbar, { collapseLabels: this.props.compactUI, historyIndex: this.state.historyIndex, historyItems: this.state.historyItems, undo: () => this.undo(), redo: () => this.redo(), logoClickUrl: this.props.logoClickUrl, logoClickTarget: this.props.logoClickTarget, themePalette, loaded: loaded2, doDeselect: this.doDeselect.bind(this), doFilter: this.doFilter.bind(this), doUnfilter: this.doUnfilter.bind(this), filter: this.state.filter, selectionSearch, selectionState, buttons: this.props.topBarButtonProps, iconButtons: this.props.topBarIconButtonProps, view: this.state.view, snapshotsHidden: (_b2 = this.props.snapshotProps) === null || _b2 === void 0 ? void 0 : _b2.hidden, snapshots: this.state.snapshots, onSnapshotPreviousClick: () => {\n            let selectedSnapshotIndex;\n            if (this.state.selectedSnapshotIndex === -1) {\n              selectedSnapshotIndex = this.state.snapshots.length - 1;\n            } else {\n              selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n              selectedSnapshotIndex--;\n              if (selectedSnapshotIndex < 0) {\n                selectedSnapshotIndex = this.state.snapshots.length - 1;\n              }\n            }\n            this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n          }, onSnapshotClick: () => this.snapshotEditor.editSnapshot(), onSnapshotNextClick: () => {\n            let selectedSnapshotIndex;\n            if (this.state.selectedSnapshotIndex === -1) {\n              selectedSnapshotIndex = 0;\n            } else {\n              selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n              selectedSnapshotIndex++;\n              if (selectedSnapshotIndex > this.state.snapshots.length - 1) {\n                selectedSnapshotIndex = 0;\n              }\n            }\n            this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n          }, onViewClick: () => {\n            const view = this.state.view === \"2d\" ? \"3d\" : \"2d\";\n            this.changeInsight({ view }, { label: view === \"2d\" ? strings$1.labelViewType2d : strings$1.labelViewType3d });\n          } }),\n          base$1.react.createElement(\n            \"div\",\n            { className: classList(\"sanddance-main\", this.state.sidebarPinned && \"pinned\", this.state.sidebarClosed && \"closed\", (insight.hideLegend || insight.directColor || !colorMapping(insight, this.state.dataContent && this.state.dataContent.columns)) && \"hide-legend\") },\n            base$1.react.createElement(\"div\", { ref: (div) => {\n              if (div && !this.layoutDivUnpinned)\n                this.layoutDivUnpinned = div;\n            }, className: \"sanddance-layout-unpinned\" }),\n            base$1.react.createElement(\"div\", { ref: (div) => {\n              if (div && !this.layoutDivPinned)\n                this.layoutDivPinned = div;\n            }, className: \"sanddance-layout-pinned\" }),\n            !loaded2 && base$1.react.createElement(\n              \"div\",\n              { className: \"loading\" },\n              base$1.react.createElement(base$1.fluentUI.Spinner, { size: base$1.fluentUI.SpinnerSize.large, label: strings$1.loading })\n            ),\n            base$1.react.createElement(Sidebar, { themePalette, calculating: !!this.state.calculating, closed: this.state.sidebarClosed, hideSidebarControls: this.props.hideSidebarControls, snapshotsHidden: (_c2 = this.props.snapshotProps) === null || _c2 === void 0 ? void 0 : _c2.hidden, pinned: this.state.sidebarPinned, disabled: !loaded2, dataScopeProps: {\n              themePalette,\n              compact: this.state.sidebarClosed,\n              onCompactClick: () => {\n                this.changeInsight({\n                  size: this.getLayoutDivSize(this.state.sidebarPinned, false)\n                }, {\n                  label: null,\n                  omit: true\n                }, {\n                  sidebarClosed: false\n                });\n              },\n              dataSet: this.props.datasetElement,\n              dataCount: loaded2 && {\n                all: this.state.dataContent && this.state.dataContent.data.length,\n                filtered: this.state.filteredData && this.state.filteredData.length,\n                selected: selectionState && selectionState.selectedData && selectionState.selectedData.length\n              },\n              active: this.state.sideTabId === SideTabId.Data,\n              onDataScopeClick: (dataScopeId) => this.setSideTabId(SideTabId.Data, dataScopeId),\n              selectedDataScope: this.state.dataScopeId,\n              disabled: !loaded2\n            }, onSideTabClick: (sideTabId) => {\n              if (sideTabId === SideTabId.Collapse || this.state.sideTabId === sideTabId) {\n                let { dataScopeId, sidebarClosed } = this.state;\n                if (sidebarClosed && sideTabId === SideTabId.Data) {\n                  dataScopeId = this.getBestDataScopeId();\n                }\n                sidebarClosed = !this.state.sidebarClosed;\n                this.changeInsight({\n                  size: this.getLayoutDivSize(this.state.sidebarPinned, sidebarClosed)\n                }, {\n                  label: null,\n                  omit: true\n                }, {\n                  dataScopeId,\n                  sidebarClosed\n                });\n              } else if (sideTabId === SideTabId.Pin) {\n                this.changeInsight({\n                  size: this.getLayoutDivSize(!this.state.sidebarPinned, this.state.sidebarClosed)\n                }, {\n                  label: null,\n                  omit: true\n                }, {\n                  sidebarPinned: !this.state.sidebarPinned\n                });\n              } else {\n                this.setSideTabId(sideTabId);\n              }\n            }, selectedSideTab: this.state.sideTabId }, loaded2 && (() => {\n              switch (this.state.sideTabId) {\n                case SideTabId.ChartType: {\n                  return base$1.react.createElement(Chart, Object.assign({ themePalette, collapseLabels: this.props.compactUI, tooltipExclusions: this.state.tooltipExclusions, toggleTooltipExclusion: (columnName) => {\n                    const tooltipExclusions = [...this.state.tooltipExclusions];\n                    const i = tooltipExclusions.indexOf(columnName);\n                    if (i < 0) {\n                      tooltipExclusions.push(columnName);\n                    } else {\n                      tooltipExclusions.splice(i, 1);\n                    }\n                    this.setState({ tooltipExclusions });\n                    this.props.onTooltipExclusionsChanged && this.props.onTooltipExclusionsChanged(tooltipExclusions);\n                  }, disabled: !loaded2 || this.state.sidebarClosed }, columnMapProps, { chart: this.state.chart, view: this.state.view, insightColumns: this.state.columns, onChangeSignal: (role, column, name, value2) => saveSignalValuePref(this.prefs, this.state.chart, role, column, name, value2) }));\n                }\n                case SideTabId.Color: {\n                  return base$1.react.createElement(Color, Object.assign({ compactUI: this.props.compactUI, specCapabilities: this.state.specCapabilities, disabled: !loaded2 || this.state.sidebarClosed }, columnMapProps, { dataContent: this.state.dataContent, scheme: this.state.scheme, colorBin: this.state.colorBin, colorBinSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s2) => s2.name === SignalNames.ColorBinCount)[0], colorReverseSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s2) => s2.name === SignalNames.ColorReverse)[0], colorColumn: this.state.columns.color, onColorBinChange: (colorBin) => {\n                    this.ignoreSelectionChange = true;\n                    this.viewer.deselect().then(() => {\n                      this.ignoreSelectionChange = false;\n                      requestAnimationFrame(() => {\n                        this.getColorContext = null;\n                        this.changeInsight({ colorBin }, { label: strings$1.labelHistoryColorBin });\n                        savePref(this.prefs, this.state.chart, \"color\", this.state.columns.color, { colorBin });\n                      });\n                    });\n                  }, onColorSchemeChange: (scheme2) => {\n                    this.changeColumnMapping(\"color\", this.state.dataContent.columns.filter((c2) => c2.name === this.state.columns.color)[0], { scheme: scheme2 });\n                    savePref(this.prefs, this.state.chart, \"color\", this.state.columns.color, { scheme: scheme2 });\n                  }, onColorBinCountChange: (value2) => {\n                    const signalValues = {};\n                    signalValues[SignalNames.ColorBinCount] = value2;\n                    savePref(this.prefs, this.state.chart, \"color\", this.state.columns.color, { signalValues });\n                  }, onColorReverseChange: (value2) => {\n                    this.getColorContext = null;\n                  }, directColor: this.state.directColor, onDirectColorChange: (directColor) => {\n                    this.changeInsight({ directColor }, { label: strings$1.labelHistoryDirectColor }, { calculating: () => this._resize() });\n                  } }));\n                }\n                case SideTabId.Data: {\n                  const data2 = datas[this.state.dataScopeId];\n                  let itemVisible = true;\n                  switch (this.state.dataScopeId) {\n                    case DataScopeId.AllData: {\n                      const item = this.state.selectedItemIndex[this.state.dataScopeId];\n                      itemVisible = this.state.dataContent && !this.state.filteredData || this.state.filteredData.indexOf(data2[item]) >= 0;\n                    }\n                  }\n                  return base$1.react.createElement(DataBrowser, { explorer: this, theme: this.props.theme, themePalette, disabled: !loaded2 || this.state.sidebarClosed, columns: this.state.dataContent && this.state.dataContent.columns, categoricalColumns: columnMapProps.categoricalColumns, quantitativeColumns: columnMapProps.quantitativeColumns, data: data2, displayName: this.state.dataFile && this.state.dataFile.displayName || strings$1.defaultFileName, nullMessage: dataBrowserNullMessages[this.state.dataScopeId], zeroMessage: dataBrowserZeroMessages[this.state.dataScopeId], index: this.state.selectedItemIndex[this.state.dataScopeId], itemVisible, dataExportHandler: this.props.dataExportHandler, selectedDataScope: this.state.dataScopeId, onDataScopeClick: (dataScopeId) => this.setSideTabId(SideTabId.Data, dataScopeId), onActivate: (row, index2) => {\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    selectedItemIndex[this.state.dataScopeId] = index2;\n                    this.setState({ selectedItemIndex });\n                    this.silentActivation(row);\n                  }, onSearch: (e, search) => {\n                    if (e.ctrlKey) {\n                      this.setState({ sideTabId: SideTabId.Search, search });\n                    } else {\n                      this.doSelect(search);\n                    }\n                  }, bingSearchDisabled: this.props.bingSearchDisabled, onUpdateColumnTypes: (columnTypes) => {\n                    this.load(this.state.dataFile, null, { prefs: this.prefs, columnTypes });\n                  } });\n                }\n                case SideTabId.Search: {\n                  return base$1.react.createElement(Search, { explorer: this, collapseLabels: this.props.compactUI, themePalette, disabled: !loaded2 || this.state.sidebarClosed, disableGroupOR: this.props.searchORDisabled, disableExpressionOR: this.props.searchORDisabled, initializer: {\n                    columns: columnMapProps.allColumns,\n                    search: this.state.search\n                  }, autoCompleteDistinctValues: this.state.autoCompleteDistinctValues, onSelect: (expr2) => this.doSelect(expr2), data: this.state.dataContent.data });\n                }\n                case SideTabId.Snapshots: {\n                  return base$1.react.createElement(Snapshots, Object.assign({}, this.props.snapshotProps, { editor: this.snapshotEditor, themePalette, explorer: this, snapshots: this.state.snapshots, selectedSnapshotIndex: this.state.selectedSnapshotIndex, onClearSnapshots: () => {\n                    const snapshots = [];\n                    this.setState({ snapshots, selectedSnapshotIndex: -1 });\n                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                  }, onWriteSnapshot: (s2, i) => this.writeSnapshot(s2, i), onRemoveSnapshot: (i) => {\n                    const snapshots = [...this.state.snapshots];\n                    snapshots.splice(i, 1);\n                    let { selectedSnapshotIndex } = this.state;\n                    if (i === selectedSnapshotIndex) {\n                      selectedSnapshotIndex = -1;\n                    } else if (selectedSnapshotIndex > i) {\n                      selectedSnapshotIndex--;\n                    }\n                    this.setState({ snapshots, selectedSnapshotIndex });\n                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                  }, onSnapshotClick: (snapshot, selectedSnapshotIndex) => {\n                    this.setState({ selectedSnapshotIndex });\n                    this.calculate(() => {\n                      this.handleReviveSnapshot(snapshot, selectedSnapshotIndex);\n                    });\n                  }, onMoveUp: (i) => {\n                    if (i > 0) {\n                      const snapshots = [...this.state.snapshots];\n                      const temp2 = snapshots[i - 1];\n                      snapshots[i - 1] = snapshots[i];\n                      snapshots[i] = temp2;\n                      let { selectedSnapshotIndex } = this.state;\n                      if (i === selectedSnapshotIndex) {\n                        selectedSnapshotIndex = i - 1;\n                      } else if (i - 1 === selectedSnapshotIndex) {\n                        selectedSnapshotIndex = i;\n                      }\n                      this.setState({ snapshots, selectedSnapshotIndex });\n                      this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                    }\n                  }, onMoveDown: (i) => {\n                    if (i < this.state.snapshots.length - 1) {\n                      const snapshots = [...this.state.snapshots];\n                      const temp2 = snapshots[i + 1];\n                      snapshots[i + 1] = snapshots[i];\n                      snapshots[i] = temp2;\n                      let { selectedSnapshotIndex } = this.state;\n                      if (i === selectedSnapshotIndex) {\n                        selectedSnapshotIndex = i + 1;\n                      } else if (i + 1 === selectedSnapshotIndex) {\n                        selectedSnapshotIndex = i;\n                      }\n                      this.setState({ snapshots, selectedSnapshotIndex });\n                      this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                    }\n                  } }));\n                }\n                case SideTabId.History: {\n                  return base$1.react.createElement(History, { explorer: this, themePalette, historyIndex: this.state.historyIndex, historyItems: this.state.historyItems, redo: (i) => this.redo(i) });\n                }\n                case SideTabId.Transition: {\n                  return base$1.react.createElement(TransitionEditor, Object.assign({}, columnMapProps, this.state, { compactUI: this.props.compactUI, explorer: this, themePalette, changeSetup: (newState, affectsStagger) => {\n                    const calculating = () => {\n                      if (affectsStagger) {\n                        this.viewer.assignTransitionStagger(getTransition(this.state));\n                      }\n                      this.props.onSetupOptionsChanged && this.props.onSetupOptionsChanged(this.getSetup());\n                    };\n                    if (newState) {\n                      this.setState(Object.assign(Object.assign({}, newState), { calculating }));\n                    } else {\n                      calculating();\n                    }\n                  } }));\n                }\n                case SideTabId.Settings: {\n                  return base$1.react.createElement(Settings, { explorer: this, dataFile: this.state.dataFile, scheme: this.state.scheme, hideLegend: this.state.hideLegend, onToggleLegend: (hideLegend) => this.setState({ hideLegend, calculating: () => this._resize() }), hideAxes: this.state.hideAxes, onToggleAxes: (hideAxes) => this.setState({ calculating: () => this.setState({ hideAxes }) }), additionalSettings: this.props.additionalSettings }, this.props.systemInfoChildren);\n                }\n              }\n            })()),\n            loaded2 && base$1.react.createElement(\n              \"div\",\n              { className: \"sanddance-view\" },\n              base$1.react.createElement(Viewer, { renderOptions, viewerOptions: this.viewerOptions, ref: (reactViewer) => {\n                if (reactViewer) {\n                  this.viewer = reactViewer.viewer;\n                }\n              }, onView: (renderResult) => {\n                this.rebaseFilter = false;\n                this.changespecCapabilities(renderResult.specResult.errors ? renderResult.specResult.specCapabilities : this.viewer.specCapabilities);\n                this.getColorContext = (oldInsight, newInsight) => {\n                  if (!oldInsight && !newInsight) {\n                    return null;\n                  }\n                  if (!oldInsight || !newInsight) {\n                    return null;\n                  }\n                  if (oldInsight.scheme !== newInsight.scheme) {\n                    return null;\n                  }\n                  if (oldInsight.columns.color !== newInsight.columns.color) {\n                    return null;\n                  }\n                  if (oldInsight.directColor != newInsight.directColor) {\n                    return null;\n                  }\n                  return this.viewer.colorContexts && this.viewer.colorContexts[this.viewer.currentColorContext];\n                };\n                removeTabIndex(this.viewer);\n                this.props.onView && this.props.onView();\n              }, onError: (e) => {\n                this.props.onError && this.props.onError(e);\n              }, data: this.state.dataContent.data, insight, setup: this.getSetup(), onMount: (el) => this.viewerMounted(el) }),\n              this.state.note && base$1.react.createElement(\n                \"div\",\n                { className: \"sanddance-note\" },\n                base$1.react.createElement(IconButton$1, { className: \"cancel\", themePalette, title: strings$1.buttonClose, iconName: \"Cancel\", onClick: () => this.setState({ note: null }) }),\n                base$1.react.createElement(\"div\", null, this.state.note)\n              ),\n              base$1.react.createElement(Renderer$1, { explorer: this, advanced: this.state.renderer.advanced, advancedOptions: this.state.renderer.advancedOptions, basicOptions: this.state.renderer.basicOptions, themePalette, onHomeClick: () => {\n                this.setState({ camera: void 0 });\n                this.viewer.presenter.homeCamera();\n              } })\n            ),\n            base$1.react.createElement(Dialog$1, { title: strings$1.labelError, hidden: !this.state.errors, onDismiss: () => {\n              this.setState({ errors: null });\n            } }, this.state.errors && this.state.errors.map((error2, i) => base$1.react.createElement(\"div\", { key: i }, error2))),\n            base$1.react.createElement(SnapshotEditor, Object.assign({ ref: (se) => this.snapshotEditor = se }, this.props.snapshotProps, { explorer: this, onWriteSnapshot: (s2, i) => this.writeSnapshot(s2, i), theme: this.props.theme, themePalette }))\n          ),\n          this.state.positionedColumnMapProps && base$1.react.createElement(PositionedColumnMap, Object.assign({}, this.state.positionedColumnMapProps))\n        );\n      }\n      getColumnMapBaseProps() {\n        const allColumns = this.state.dataContent && this.state.dataContent.columns.filter((c2) => !isInternalFieldName(c2.name, true));\n        const quantitativeColumns = allColumns && allColumns.filter((c2) => c2.quantitative);\n        const categoricalColumns = allColumns && allColumns.filter((c2) => !c2.quantitative);\n        const props = {\n          changeColumnMapping: (role, columnOrRole, defaultColumn, options2) => {\n            let column;\n            if (typeof columnOrRole === \"string\") {\n              const columnName = this.state.columns[columnOrRole];\n              column = allColumns.filter((c2) => c2.name === columnName)[0] || defaultColumn;\n            } else {\n              column = columnOrRole;\n            }\n            this.changeColumnMapping(role, column, options2);\n          },\n          facetStyle: this.state.facetStyle,\n          totalStyle: this.state.totalStyle,\n          allColumns,\n          quantitativeColumns,\n          categoricalColumns,\n          specCapabilities: this.state.specCapabilities,\n          explorer: this\n        };\n        return props;\n      }\n    }\n    return new __Explorer(_props);\n  }\n  const Explorer = _Explorer;\n  const base$1 = {\n    fluentUI: null,\n    react: null,\n    reactDOM: null\n  };\n  function use$2(fluentUI2, react, reactDOM, vega2) {\n    use$3(react, reactDOM, vega2);\n    base$1.fluentUI = fluentUI2;\n    base$1.react = react;\n    base$1.reactDOM = reactDOM;\n    BackgroundImageEditor.prototype = react.Component.prototype;\n    Chart.prototype = react.Component.prototype;\n    ColumnTypeChanger.prototype = react.Component.prototype;\n    DataExportPicker.prototype = react.Component.prototype;\n    Explorer.prototype = react.Component.prototype;\n    PositionedColumnMap.prototype = react.Component.prototype;\n    Renderer$1.prototype = react.Component.prototype;\n    Search.prototype = react.Component.prototype;\n    SnapshotEditor.prototype = react.Component.prototype;\n    Snapshots.prototype = react.Component.prototype;\n    Settings.prototype = react.Component.prototype;\n    TransitionEditor.prototype = react.Component.prototype;\n  }\n  function Dialog$1(props) {\n    return base$1.react.createElement(\n      base$1.fluentUI.Dialog,\n      Object.assign({}, props, { dialogContentProps: Object.assign({\n        type: base$1.fluentUI.DialogType.normal,\n        title: props.title\n      }, props.dialogContentProps) }),\n      base$1.react.createElement(\"div\", { onKeyUp: (e) => {\n        e.nativeEvent.stopImmediatePropagation();\n      } }, props.children),\n      base$1.react.createElement(\n        base$1.fluentUI.DialogFooter,\n        null,\n        props.buttons,\n        base$1.react.createElement(base$1.fluentUI.DefaultButton, { iconProps: { iconName: \"Cancel\" }, onClick: props.onDismiss, text: strings$1.buttonClose })\n      )\n    );\n  }\n  const index$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Dialog: Dialog$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const SandDanceExplorer = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Explorer,\n    SandDance: index$4,\n    SandDanceReact: index$3,\n    get SideTabId() {\n      return SideTabId;\n    },\n    capabilities,\n    controls: index$2,\n    getColorSettingsFromThemePalette,\n    getEmbedHTML,\n    themePalettes,\n    use: use$2,\n    util: util$2,\n    version: version$2\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const base = {\n    fluentUI: null\n  };\n  function use$1(fluentUI2, vega2) {\n    use$2(fluentUI2, React__namespace, ReactDOM__namespace, vega2);\n    base.fluentUI = fluentUI2;\n  }\n  var extendStatics = function(d2, b2) {\n    extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d3, b3) {\n      d3.__proto__ = b3;\n    } || function(d3, b3) {\n      for (var p in b3) if (Object.prototype.hasOwnProperty.call(b3, p)) d3[p] = b3[p];\n    };\n    return extendStatics(d2, b2);\n  };\n  function __extends(d2, b2) {\n    if (typeof b2 !== \"function\" && b2 !== null)\n      throw new TypeError(\"Class extends value \" + String(b2) + \" is not a constructor or null\");\n    extendStatics(d2, b2);\n    function __() {\n      this.constructor = d2;\n    }\n    d2.prototype = b2 === null ? Object.create(b2) : (__.prototype = b2.prototype, new __());\n  }\n  var __assign$1 = function() {\n    __assign$1 = Object.assign || function __assign2(t) {\n      for (var s2, i = 1, n = arguments.length; i < n; i++) {\n        s2 = arguments[i];\n        for (var p in s2) if (Object.prototype.hasOwnProperty.call(s2, p)) t[p] = s2[p];\n      }\n      return t;\n    };\n    return __assign$1.apply(this, arguments);\n  };\n  function __rest(s2, e) {\n    var t = {};\n    for (var p in s2) if (Object.prototype.hasOwnProperty.call(s2, p) && e.indexOf(p) < 0)\n      t[p] = s2[p];\n    if (s2 != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s2); i < p.length; i++) {\n        if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s2, p[i]))\n          t[p[i]] = s2[p[i]];\n      }\n    return t;\n  }\n  function __decorate(decorators, target2, key2, desc) {\n    var c2 = arguments.length, r = c2 < 3 ? target2 : desc === null ? desc = Object.getOwnPropertyDescriptor(target2, key2) : desc, d2;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target2, key2, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d2 = decorators[i]) r = (c2 < 3 ? d2(r) : c2 > 3 ? d2(target2, key2, r) : d2(target2, key2)) || r;\n    return c2 > 3 && r && Object.defineProperty(target2, key2, r), r;\n  }\n  function __spreadArray(to, from, pack2) {\n    if (pack2 || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n        if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n        ar[i] = from[i];\n      }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n  }\n  typeof SuppressedError === \"function\" ? SuppressedError : function(error2, suppressed, message) {\n    var e = new Error(message);\n    return e.name = \"SuppressedError\", e.error = error2, e.suppressed = suppressed, e;\n  };\n  var packagesCache = {};\n  var _win = void 0;\n  try {\n    _win = window;\n  } catch (e) {\n  }\n  function setVersion(packageName, packageVersion) {\n    if (typeof _win !== \"undefined\") {\n      var packages = _win.__packages__ = _win.__packages__ || {};\n      if (!packages[packageName] || !packagesCache[packageName]) {\n        packagesCache[packageName] = packageVersion;\n        var versions = packages[packageName] = packages[packageName] || [];\n        versions.push(packageVersion);\n      }\n    }\n  }\n  setVersion(\"@fluentui/set-version\", \"6.0.0\");\n  function canUseDOM() {\n    return (\n      // eslint-disable-next-line no-restricted-globals\n      typeof window !== \"undefined\" && !!// eslint-disable-next-line no-restricted-globals, @typescript-eslint/no-deprecated\n      (window.document && window.document.createElement)\n    );\n  }\n  var _window$1 = void 0;\n  try {\n    _window$1 = window;\n  } catch (e) {\n  }\n  function getWindow(rootElement) {\n    if (!canUseDOM() || typeof _window$1 === \"undefined\") {\n      return void 0;\n    } else {\n      var el = rootElement;\n      return el && el.ownerDocument && el.ownerDocument.defaultView ? el.ownerDocument.defaultView : _window$1;\n    }\n  }\n  var Async = (\n    /** @class */\n    (function() {\n      function Async2(parent, onError) {\n        this._timeoutIds = null;\n        this._immediateIds = null;\n        this._intervalIds = null;\n        this._animationFrameIds = null;\n        this._isDisposed = false;\n        this._parent = parent || null;\n        this._onErrorHandler = onError;\n        this._noop = function() {\n        };\n      }\n      Async2.prototype.dispose = function() {\n        var id2;\n        this._isDisposed = true;\n        this._parent = null;\n        if (this._timeoutIds) {\n          for (id2 in this._timeoutIds) {\n            if (this._timeoutIds.hasOwnProperty(id2)) {\n              this.clearTimeout(parseInt(id2, 10));\n            }\n          }\n          this._timeoutIds = null;\n        }\n        if (this._immediateIds) {\n          for (id2 in this._immediateIds) {\n            if (this._immediateIds.hasOwnProperty(id2)) {\n              this.clearImmediate(parseInt(id2, 10));\n            }\n          }\n          this._immediateIds = null;\n        }\n        if (this._intervalIds) {\n          for (id2 in this._intervalIds) {\n            if (this._intervalIds.hasOwnProperty(id2)) {\n              this.clearInterval(parseInt(id2, 10));\n            }\n          }\n          this._intervalIds = null;\n        }\n        if (this._animationFrameIds) {\n          for (id2 in this._animationFrameIds) {\n            if (this._animationFrameIds.hasOwnProperty(id2)) {\n              this.cancelAnimationFrame(parseInt(id2, 10));\n            }\n          }\n          this._animationFrameIds = null;\n        }\n      };\n      Async2.prototype.setTimeout = function(callback, duration) {\n        var _this = this;\n        var timeoutId = 0;\n        if (!this._isDisposed) {\n          if (!this._timeoutIds) {\n            this._timeoutIds = {};\n          }\n          timeoutId = setTimeout(function() {\n            try {\n              if (_this._timeoutIds) {\n                delete _this._timeoutIds[timeoutId];\n              }\n              callback.apply(_this._parent);\n            } catch (e) {\n              _this._logError(e);\n            }\n          }, duration);\n          this._timeoutIds[timeoutId] = true;\n        }\n        return timeoutId;\n      };\n      Async2.prototype.clearTimeout = function(id2) {\n        if (this._timeoutIds && this._timeoutIds[id2]) {\n          clearTimeout(id2);\n          delete this._timeoutIds[id2];\n        }\n      };\n      Async2.prototype.setImmediate = function(callback, targetElement) {\n        var _this = this;\n        var immediateId = 0;\n        var win = getWindow(targetElement);\n        if (!this._isDisposed) {\n          if (!this._immediateIds) {\n            this._immediateIds = {};\n          }\n          var setImmediateCallback = function() {\n            try {\n              if (_this._immediateIds) {\n                delete _this._immediateIds[immediateId];\n              }\n              callback.apply(_this._parent);\n            } catch (e) {\n              _this._logError(e);\n            }\n          };\n          immediateId = win.setTimeout(setImmediateCallback, 0);\n          this._immediateIds[immediateId] = true;\n        }\n        return immediateId;\n      };\n      Async2.prototype.clearImmediate = function(id2, targetElement) {\n        var win = getWindow(targetElement);\n        if (this._immediateIds && this._immediateIds[id2]) {\n          win.clearTimeout(id2);\n          delete this._immediateIds[id2];\n        }\n      };\n      Async2.prototype.setInterval = function(callback, duration) {\n        var _this = this;\n        var intervalId = 0;\n        if (!this._isDisposed) {\n          if (!this._intervalIds) {\n            this._intervalIds = {};\n          }\n          intervalId = setInterval(function() {\n            try {\n              callback.apply(_this._parent);\n            } catch (e) {\n              _this._logError(e);\n            }\n          }, duration);\n          this._intervalIds[intervalId] = true;\n        }\n        return intervalId;\n      };\n      Async2.prototype.clearInterval = function(id2) {\n        if (this._intervalIds && this._intervalIds[id2]) {\n          clearInterval(id2);\n          delete this._intervalIds[id2];\n        }\n      };\n      Async2.prototype.throttle = function(func, wait, options2) {\n        var _this = this;\n        if (this._isDisposed) {\n          return this._noop;\n        }\n        var waitMS = wait || 0;\n        var leading = true;\n        var trailing = true;\n        var lastExecuteTime = 0;\n        var lastResult;\n        var lastArgs;\n        var timeoutId = null;\n        if (options2 && typeof options2.leading === \"boolean\") {\n          leading = options2.leading;\n        }\n        if (options2 && typeof options2.trailing === \"boolean\") {\n          trailing = options2.trailing;\n        }\n        var callback = function(userCall) {\n          var now2 = Date.now();\n          var delta = now2 - lastExecuteTime;\n          var waitLength = leading ? waitMS - delta : waitMS;\n          if (delta >= waitMS && (!userCall || leading)) {\n            lastExecuteTime = now2;\n            if (timeoutId) {\n              _this.clearTimeout(timeoutId);\n              timeoutId = null;\n            }\n            lastResult = func.apply(_this._parent, lastArgs);\n          } else if (timeoutId === null && trailing) {\n            timeoutId = _this.setTimeout(callback, waitLength);\n          }\n          return lastResult;\n        };\n        var resultFunction = (function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          lastArgs = args;\n          return callback(true);\n        });\n        return resultFunction;\n      };\n      Async2.prototype.debounce = function(func, wait, options2) {\n        var _this = this;\n        if (this._isDisposed) {\n          var noOpFunction = (function() {\n          });\n          noOpFunction.cancel = function() {\n            return;\n          };\n          noOpFunction.flush = (function() {\n            return null;\n          });\n          noOpFunction.pending = function() {\n            return false;\n          };\n          return noOpFunction;\n        }\n        var waitMS = wait || 0;\n        var leading = false;\n        var trailing = true;\n        var maxWait = null;\n        var lastCallTime = 0;\n        var lastExecuteTime = Date.now();\n        var lastResult;\n        var lastArgs;\n        var timeoutId = null;\n        if (options2 && typeof options2.leading === \"boolean\") {\n          leading = options2.leading;\n        }\n        if (options2 && typeof options2.trailing === \"boolean\") {\n          trailing = options2.trailing;\n        }\n        if (options2 && typeof options2.maxWait === \"number\" && !isNaN(options2.maxWait)) {\n          maxWait = options2.maxWait;\n        }\n        var markExecuted = function(time2) {\n          if (timeoutId) {\n            _this.clearTimeout(timeoutId);\n            timeoutId = null;\n          }\n          lastExecuteTime = time2;\n        };\n        var invokeFunction = function(time2) {\n          markExecuted(time2);\n          lastResult = func.apply(_this._parent, lastArgs);\n        };\n        var callback = function(userCall) {\n          var now2 = Date.now();\n          var executeImmediately = false;\n          if (userCall) {\n            if (leading && now2 - lastCallTime >= waitMS) {\n              executeImmediately = true;\n            }\n            lastCallTime = now2;\n          }\n          var delta = now2 - lastCallTime;\n          var waitLength = waitMS - delta;\n          var maxWaitDelta = now2 - lastExecuteTime;\n          var maxWaitExpired = false;\n          if (maxWait !== null) {\n            if (maxWaitDelta >= maxWait && timeoutId) {\n              maxWaitExpired = true;\n            } else {\n              waitLength = Math.min(waitLength, maxWait - maxWaitDelta);\n            }\n          }\n          if (delta >= waitMS || maxWaitExpired || executeImmediately) {\n            invokeFunction(now2);\n          } else if ((timeoutId === null || !userCall) && trailing) {\n            timeoutId = _this.setTimeout(callback, waitLength);\n          }\n          return lastResult;\n        };\n        var pending = function() {\n          return !!timeoutId;\n        };\n        var cancel = function() {\n          if (pending()) {\n            markExecuted(Date.now());\n          }\n        };\n        var flush2 = function() {\n          if (pending()) {\n            invokeFunction(Date.now());\n          }\n          return lastResult;\n        };\n        var resultFunction = (function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          lastArgs = args;\n          return callback(true);\n        });\n        resultFunction.cancel = cancel;\n        resultFunction.flush = flush2;\n        resultFunction.pending = pending;\n        return resultFunction;\n      };\n      Async2.prototype.requestAnimationFrame = function(callback, targetElement) {\n        var _this = this;\n        var animationFrameId = 0;\n        var win = getWindow(targetElement);\n        if (!this._isDisposed) {\n          if (!this._animationFrameIds) {\n            this._animationFrameIds = {};\n          }\n          var animationFrameCallback = function() {\n            try {\n              if (_this._animationFrameIds) {\n                delete _this._animationFrameIds[animationFrameId];\n              }\n              callback.apply(_this._parent);\n            } catch (e) {\n              _this._logError(e);\n            }\n          };\n          animationFrameId = win.requestAnimationFrame ? win.requestAnimationFrame(animationFrameCallback) : win.setTimeout(animationFrameCallback, 0);\n          this._animationFrameIds[animationFrameId] = true;\n        }\n        return animationFrameId;\n      };\n      Async2.prototype.cancelAnimationFrame = function(id2, targetElement) {\n        var win = getWindow(targetElement);\n        if (this._animationFrameIds && this._animationFrameIds[id2]) {\n          win.cancelAnimationFrame ? win.cancelAnimationFrame(id2) : win.clearTimeout(id2);\n          delete this._animationFrameIds[id2];\n        }\n      };\n      Async2.prototype._logError = function(e) {\n        if (this._onErrorHandler) {\n          this._onErrorHandler(e);\n        }\n      };\n      return Async2;\n    })()\n  );\n  function isVirtualElement(element2) {\n    return element2 && !!element2._virtual;\n  }\n  function getVirtualParent(child) {\n    var parent;\n    if (child && isVirtualElement(child)) {\n      parent = child._virtual.parent;\n    }\n    return parent;\n  }\n  function getParent(child, allowVirtualParents) {\n    var _a2, _b2;\n    if (allowVirtualParents === void 0) {\n      allowVirtualParents = true;\n    }\n    if (!child) {\n      return null;\n    }\n    var parent = allowVirtualParents && getVirtualParent(child);\n    if (parent) {\n      return parent;\n    }\n    if (typeof child.assignedElements !== \"function\" && ((_a2 = child.assignedSlot) === null || _a2 === void 0 ? void 0 : _a2.parentNode)) {\n      return child.assignedSlot;\n    } else if (((_b2 = child.parentNode) === null || _b2 === void 0 ? void 0 : _b2.nodeType) === 11) {\n      return child.parentNode.host;\n    } else {\n      return child.parentNode;\n    }\n  }\n  function elementContains(parent, child, allowVirtualParents) {\n    if (allowVirtualParents === void 0) {\n      allowVirtualParents = true;\n    }\n    var isContained = false;\n    if (parent && child) {\n      if (allowVirtualParents) {\n        if (parent === child) {\n          isContained = true;\n        } else {\n          isContained = false;\n          while (child) {\n            var nextParent = getParent(child);\n            if (nextParent === parent) {\n              isContained = true;\n              break;\n            }\n            child = nextParent;\n          }\n        }\n      } else if (parent.contains) {\n        isContained = parent.contains(child);\n      }\n    }\n    return isContained;\n  }\n  function findElementRecursive(element2, matchFunction, doc) {\n    doc !== null && doc !== void 0 ? doc : doc = document;\n    if (!element2 || element2 === doc.body || element2 instanceof Document) {\n      return null;\n    }\n    return matchFunction(element2) ? element2 : findElementRecursive(getParent(element2), matchFunction);\n  }\n  function elementContainsAttribute(element2, attribute, doc) {\n    var elementMatch = findElementRecursive(element2, function(testElement) {\n      return testElement.hasAttribute(attribute);\n    }, doc);\n    return elementMatch && elementMatch.getAttribute(attribute);\n  }\n  var getActiveElement = function(doc) {\n    var ae = doc.activeElement;\n    while (ae === null || ae === void 0 ? void 0 : ae.shadowRoot) {\n      ae = ae.shadowRoot.activeElement;\n    }\n    return ae;\n  };\n  function getChildren(parent, allowVirtualChildren) {\n    if (allowVirtualChildren === void 0) {\n      allowVirtualChildren = true;\n    }\n    var children2 = [];\n    if (parent) {\n      for (var i = 0; i < parent.children.length; i++) {\n        children2.push(parent.children.item(i));\n      }\n      if (allowVirtualChildren && isVirtualElement(parent)) {\n        children2.push.apply(children2, parent._virtual.children);\n      }\n    }\n    return children2;\n  }\n  var getEventTarget = function(event2) {\n    var target2 = event2.target;\n    if (target2 && target2.shadowRoot) {\n      target2 = event2.composedPath()[0];\n    }\n    return target2;\n  };\n  var DATA_PORTAL_ATTRIBUTE = \"data-portal-element\";\n  function setPortalAttribute(element2) {\n    element2.setAttribute(DATA_PORTAL_ATTRIBUTE, \"true\");\n  }\n  function portalContainsElement(target2, parent, doc) {\n    var _a2;\n    var elementMatch = findElementRecursive(target2, function(testElement) {\n      var _a3;\n      return parent === testElement || !!((_a3 = testElement.hasAttribute) === null || _a3 === void 0 ? void 0 : _a3.call(testElement, DATA_PORTAL_ATTRIBUTE));\n    }, doc);\n    return elementMatch !== null && !!((_a2 = elementMatch.hasAttribute) === null || _a2 === void 0 ? void 0 : _a2.call(elementMatch, DATA_PORTAL_ATTRIBUTE));\n  }\n  function setVirtualParent(child, parent) {\n    var virtualChild = child;\n    var virtualParent = parent;\n    if (!virtualChild._virtual) {\n      virtualChild._virtual = {\n        children: []\n      };\n    }\n    var oldParent = virtualChild._virtual.parent;\n    if (oldParent && oldParent !== parent) {\n      var index2 = oldParent._virtual.children.indexOf(virtualChild);\n      if (index2 > -1) {\n        oldParent._virtual.children.splice(index2, 1);\n      }\n    }\n    virtualChild._virtual.parent = virtualParent || void 0;\n    if (virtualParent) {\n      if (!virtualParent._virtual) {\n        virtualParent._virtual = {\n          children: []\n        };\n      }\n      virtualParent._virtual.children.push(virtualChild);\n    }\n  }\n  function getDocument(rootElement) {\n    if (!canUseDOM() || typeof document === \"undefined\") {\n      return void 0;\n    } else {\n      var el = rootElement;\n      return el && el.ownerDocument ? el.ownerDocument : document;\n    }\n  }\n  var IS_FOCUSABLE_ATTRIBUTE$1 = \"data-is-focusable\";\n  var IS_VISIBLE_ATTRIBUTE = \"data-is-visible\";\n  var FOCUSZONE_ID_ATTRIBUTE$1 = \"data-focuszone-id\";\n  var FOCUSZONE_SUB_ATTRIBUTE = \"data-is-sub-focuszone\";\n  function getFirstFocusable(rootElement, currentElement, includeElementsInFocusZones, includeShadowRoots) {\n    return getNextElement(rootElement, currentElement, true, false, false, includeElementsInFocusZones, void 0, void 0, void 0, includeShadowRoots);\n  }\n  function getLastFocusable(rootElement, currentElement, includeElementsInFocusZones, includeShadowRoots) {\n    return getPreviousElement(rootElement, currentElement, true, false, true, includeElementsInFocusZones, void 0, void 0, includeShadowRoots);\n  }\n  function getFirstTabbable(rootElement, currentElement, includeElementsInFocusZones, checkNode, includeShadowRoots) {\n    return getNextElement(rootElement, currentElement, checkNode, false, false, includeElementsInFocusZones, false, true, void 0, includeShadowRoots);\n  }\n  function getLastTabbable(rootElement, currentElement, includeElementsInFocusZones, checkNode, includeShadowRoots) {\n    return getPreviousElement(rootElement, currentElement, checkNode, false, true, includeElementsInFocusZones, false, true, includeShadowRoots);\n  }\n  function focusFirstChild(rootElement, bypassHiddenElements, includeShadowRoots) {\n    var element2 = getNextElement(rootElement, rootElement, true, false, false, true, void 0, void 0, bypassHiddenElements, includeShadowRoots);\n    if (element2) {\n      focusAsync(element2);\n      return true;\n    }\n    return false;\n  }\n  function getPreviousElement(rootElement, currentElement, checkNode, suppressParentTraversal, traverseChildren, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots) {\n    var _a2;\n    if (!currentElement || !allowFocusRoot && currentElement === rootElement) {\n      return null;\n    }\n    var isCurrentElementVisible = isElementVisible(currentElement);\n    if (traverseChildren && isCurrentElementVisible && (includeElementsInFocusZones || !(isElementFocusZone(currentElement) || isElementFocusSubZone(currentElement)))) {\n      var lastElementChild = currentElement.lastElementChild || includeShadowRoots && ((_a2 = currentElement.shadowRoot) === null || _a2 === void 0 ? void 0 : _a2.lastElementChild);\n      var childMatch = getPreviousElement(rootElement, lastElementChild, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n      if (childMatch) {\n        if (tabbable && isElementTabbable(childMatch, true, includeShadowRoots) || !tabbable) {\n          return childMatch;\n        }\n        var childMatchSiblingMatch = getPreviousElement(rootElement, childMatch.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n        if (childMatchSiblingMatch) {\n          return childMatchSiblingMatch;\n        }\n        var childMatchParent = childMatch.parentElement;\n        while (childMatchParent && childMatchParent !== currentElement) {\n          var childMatchParentMatch = getPreviousElement(rootElement, childMatchParent.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n          if (childMatchParentMatch) {\n            return childMatchParentMatch;\n          }\n          childMatchParent = childMatchParent.parentElement;\n        }\n      }\n    }\n    if (checkNode && isCurrentElementVisible && isElementTabbable(currentElement, tabbable, includeShadowRoots)) {\n      return currentElement;\n    }\n    var siblingMatch = getPreviousElement(rootElement, currentElement.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n    if (siblingMatch) {\n      return siblingMatch;\n    }\n    if (!suppressParentTraversal) {\n      return getPreviousElement(rootElement, currentElement.parentElement, true, false, false, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n    }\n    return null;\n  }\n  function getNextElement(rootElement, currentElement, checkNode, suppressParentTraversal, suppressChildTraversal, includeElementsInFocusZones, allowFocusRoot, tabbable, bypassHiddenElements, includeShadowRoots) {\n    var _a2;\n    if (!currentElement || currentElement === rootElement && suppressChildTraversal && !allowFocusRoot) {\n      return null;\n    }\n    var checkElementVisibility = bypassHiddenElements ? isElementVisibleAndNotHidden : isElementVisible;\n    var isCurrentElementVisible = checkElementVisibility(currentElement);\n    if (checkNode && isCurrentElementVisible && isElementTabbable(currentElement, tabbable, includeShadowRoots)) {\n      return currentElement;\n    }\n    if (!suppressChildTraversal && isCurrentElementVisible && (includeElementsInFocusZones || !(isElementFocusZone(currentElement) || isElementFocusSubZone(currentElement)))) {\n      var firstElementchild = currentElement.firstElementChild || includeShadowRoots && ((_a2 = currentElement.shadowRoot) === null || _a2 === void 0 ? void 0 : _a2.firstElementChild);\n      var childMatch = getNextElement(rootElement, firstElementchild, true, true, false, includeElementsInFocusZones, allowFocusRoot, tabbable, bypassHiddenElements, includeShadowRoots);\n      if (childMatch) {\n        return childMatch;\n      }\n    }\n    if (currentElement === rootElement) {\n      return null;\n    }\n    var siblingMatch = getNextElement(rootElement, currentElement.nextElementSibling, true, true, false, includeElementsInFocusZones, allowFocusRoot, tabbable, bypassHiddenElements, includeShadowRoots);\n    if (siblingMatch) {\n      return siblingMatch;\n    }\n    if (!suppressParentTraversal) {\n      return getNextElement(rootElement, currentElement.parentElement, false, false, true, includeElementsInFocusZones, allowFocusRoot, tabbable, bypassHiddenElements, includeShadowRoots);\n    }\n    return null;\n  }\n  function isElementVisible(element2) {\n    if (!element2 || !element2.getAttribute) {\n      return false;\n    }\n    var visibilityAttribute = element2.getAttribute(IS_VISIBLE_ATTRIBUTE);\n    if (visibilityAttribute !== null && visibilityAttribute !== void 0) {\n      return visibilityAttribute === \"true\";\n    }\n    return element2.offsetHeight !== 0 || element2.offsetParent !== null || // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    element2.isVisible === true;\n  }\n  function isElementVisibleAndNotHidden(element2, win) {\n    var theWin = win !== null && win !== void 0 ? win : getWindow();\n    return !!element2 && isElementVisible(element2) && !element2.hidden && theWin.getComputedStyle(element2).visibility !== \"hidden\";\n  }\n  function isElementTabbable(element2, checkTabIndex, checkShadowRoot) {\n    if (checkShadowRoot === void 0) {\n      checkShadowRoot = true;\n    }\n    if (!element2 || element2.disabled) {\n      return false;\n    }\n    var tabIndex = 0;\n    var tabIndexAttributeValue = null;\n    if (element2 && element2.getAttribute) {\n      tabIndexAttributeValue = element2.getAttribute(\"tabIndex\");\n      if (tabIndexAttributeValue) {\n        tabIndex = parseInt(tabIndexAttributeValue, 10);\n      }\n    }\n    var isFocusableAttribute = element2.getAttribute ? element2.getAttribute(IS_FOCUSABLE_ATTRIBUTE$1) : null;\n    var isTabIndexSet = tabIndexAttributeValue !== null && tabIndex >= 0;\n    var delegatesFocus = checkShadowRoot && element2.shadowRoot ? !!element2.shadowRoot.delegatesFocus : false;\n    var result = !!element2 && isFocusableAttribute !== \"false\" && (element2.tagName === \"A\" || element2.tagName === \"BUTTON\" || element2.tagName === \"INPUT\" || element2.tagName === \"TEXTAREA\" || element2.tagName === \"SELECT\" || isFocusableAttribute === \"true\" || isTabIndexSet || delegatesFocus);\n    return checkTabIndex ? tabIndex !== -1 && result : result;\n  }\n  function isElementFocusZone(element2) {\n    return !!(element2 && element2.getAttribute && !!element2.getAttribute(FOCUSZONE_ID_ATTRIBUTE$1));\n  }\n  function isElementFocusSubZone(element2) {\n    return !!(element2 && element2.getAttribute && element2.getAttribute(FOCUSZONE_SUB_ATTRIBUTE) === \"true\");\n  }\n  function doesElementContainFocus(element2) {\n    var doc = getDocument(element2);\n    var currentActiveElement = doc && doc.activeElement;\n    if (currentActiveElement && elementContains(element2, currentActiveElement)) {\n      return true;\n    }\n    return false;\n  }\n  function shouldWrapFocus(element2, noWrapDataAttribute, doc) {\n    var theDoc = getDocument();\n    return elementContainsAttribute(element2, noWrapDataAttribute, theDoc) === \"true\" ? false : true;\n  }\n  var animationId = void 0;\n  function focusAsync(element2) {\n    if (element2) {\n      var win = getWindow(element2);\n      if (win) {\n        if (animationId !== void 0) {\n          win.cancelAnimationFrame(animationId);\n        }\n        animationId = win.requestAnimationFrame(function() {\n          element2 && element2.focus();\n          animationId = void 0;\n        });\n      }\n    }\n  }\n  function getFocusableByIndexPath(parent, path2) {\n    var element2 = parent;\n    for (var _i = 0, path_1 = path2; _i < path_1.length; _i++) {\n      var index2 = path_1[_i];\n      var nextChild = element2.children[Math.min(index2, element2.children.length - 1)];\n      if (!nextChild) {\n        break;\n      }\n      element2 = nextChild;\n    }\n    element2 = isElementTabbable(element2) && isElementVisible(element2) ? element2 : getNextElement(parent, element2, true) || getPreviousElement(parent, element2);\n    return element2;\n  }\n  function getElementIndexPath(fromElement, toElement) {\n    var path2 = [];\n    while (toElement && fromElement && toElement !== fromElement) {\n      var parent_1 = getParent(toElement, true);\n      if (parent_1 === null) {\n        return [];\n      }\n      path2.unshift(Array.prototype.indexOf.call(parent_1.children, toElement));\n      toElement = parent_1;\n    }\n    return path2;\n  }\n  function on$1(element2, eventName, callback, options2) {\n    element2.addEventListener(eventName, callback, options2);\n    return function() {\n      return element2.removeEventListener(eventName, callback, options2);\n    };\n  }\n  function shallowCompare(a2, b2) {\n    if (!a2 || !b2) {\n      return !a2 && !b2;\n    }\n    for (var propName in a2) {\n      if (a2.hasOwnProperty(propName)) {\n        if (!b2.hasOwnProperty(propName) || b2[propName] !== a2[propName]) {\n          return false;\n        }\n      }\n    }\n    for (var propName in b2) {\n      if (b2.hasOwnProperty(propName)) {\n        if (!a2.hasOwnProperty(propName)) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n  function assign(target2) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    return filteredAssign.apply(this, [null, target2].concat(args));\n  }\n  function filteredAssign(isAllowed, target2) {\n    var args = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n      args[_i - 2] = arguments[_i];\n    }\n    target2 = target2 || {};\n    for (var _a2 = 0, args_1 = args; _a2 < args_1.length; _a2++) {\n      var sourceObject = args_1[_a2];\n      if (sourceObject) {\n        for (var propName in sourceObject) {\n          if (sourceObject.hasOwnProperty(propName) && (!isAllowed || isAllowed(propName))) {\n            target2[propName] = sourceObject[propName];\n          }\n        }\n      }\n    }\n    return target2;\n  }\n  var EventGroup = (\n    /** @class */\n    (function() {\n      function EventGroup2(parent) {\n        this._id = EventGroup2._uniqueId++;\n        this._parent = parent;\n        this._eventRecords = [];\n      }\n      EventGroup2.raise = function(target2, eventName, eventArgs, bubbleEvent, doc) {\n        var retVal2;\n        var theDoc = doc !== null && doc !== void 0 ? doc : getDocument();\n        if (EventGroup2._isElement(target2)) {\n          if (typeof theDoc !== \"undefined\" && theDoc.createEvent) {\n            var ev = theDoc.createEvent(\"HTMLEvents\");\n            ev.initEvent(eventName, bubbleEvent || false, true);\n            assign(ev, eventArgs);\n            retVal2 = target2.dispatchEvent(ev);\n          } else if (typeof theDoc !== \"undefined\" && theDoc.createEventObject) {\n            var evObj = theDoc.createEventObject(eventArgs);\n            target2.fireEvent(\"on\" + eventName, evObj);\n          }\n        } else {\n          while (target2 && retVal2 !== false) {\n            var events2 = target2.__events__;\n            var eventRecords = events2 ? events2[eventName] : null;\n            if (eventRecords) {\n              for (var id2 in eventRecords) {\n                if (eventRecords.hasOwnProperty(id2)) {\n                  var eventRecordList = eventRecords[id2];\n                  for (var listIndex = 0; retVal2 !== false && listIndex < eventRecordList.length; listIndex++) {\n                    var record = eventRecordList[listIndex];\n                    if (record.objectCallback) {\n                      retVal2 = record.objectCallback.call(record.parent, eventArgs);\n                    }\n                  }\n                }\n              }\n            }\n            target2 = bubbleEvent ? target2.parent : null;\n          }\n        }\n        return retVal2;\n      };\n      EventGroup2.isObserved = function(target2, eventName) {\n        var events2 = target2 && target2.__events__;\n        return !!events2 && !!events2[eventName];\n      };\n      EventGroup2.isDeclared = function(target2, eventName) {\n        var declaredEvents = target2 && target2.__declaredEvents;\n        return !!declaredEvents && !!declaredEvents[eventName];\n      };\n      EventGroup2.stopPropagation = function(event2) {\n        if (event2.stopPropagation) {\n          event2.stopPropagation();\n        } else {\n          event2.cancelBubble = true;\n        }\n      };\n      EventGroup2._isElement = function(target2) {\n        return !!target2 && (!!target2.addEventListener || typeof HTMLElement !== \"undefined\" && target2 instanceof HTMLElement);\n      };\n      EventGroup2.prototype.dispose = function() {\n        if (!this._isDisposed) {\n          this._isDisposed = true;\n          this.off();\n          this._parent = null;\n        }\n      };\n      EventGroup2.prototype.onAll = function(target2, events2, useCapture) {\n        for (var eventName in events2) {\n          if (events2.hasOwnProperty(eventName)) {\n            this.on(target2, eventName, events2[eventName], useCapture);\n          }\n        }\n      };\n      EventGroup2.prototype.on = function(target2, eventName, callback, options2) {\n        var _this = this;\n        if (eventName.indexOf(\",\") > -1) {\n          var events2 = eventName.split(/[ ,]+/);\n          for (var i = 0; i < events2.length; i++) {\n            this.on(target2, events2[i], callback, options2);\n          }\n        } else {\n          var parent_1 = this._parent;\n          var eventRecord = {\n            target: target2,\n            eventName,\n            parent: parent_1,\n            callback,\n            options: options2\n          };\n          var events2 = target2.__events__ = target2.__events__ || {};\n          events2[eventName] = events2[eventName] || {\n            count: 0\n          };\n          events2[eventName][this._id] = events2[eventName][this._id] || [];\n          events2[eventName][this._id].push(eventRecord);\n          events2[eventName].count++;\n          if (EventGroup2._isElement(target2)) {\n            var processElementEvent = function() {\n              var args = [];\n              for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n              }\n              if (_this._isDisposed) {\n                return;\n              }\n              var result;\n              try {\n                result = callback.apply(parent_1, args);\n                if (result === false && args[0]) {\n                  var e = args[0];\n                  if (e.preventDefault) {\n                    e.preventDefault();\n                  }\n                  if (e.stopPropagation) {\n                    e.stopPropagation();\n                  }\n                  e.cancelBubble = true;\n                }\n              } catch (e3) {\n              }\n              return result;\n            };\n            eventRecord.elementCallback = processElementEvent;\n            if (target2.addEventListener) {\n              target2.addEventListener(eventName, processElementEvent, options2);\n            } else if (target2.attachEvent) {\n              target2.attachEvent(\"on\" + eventName, processElementEvent);\n            }\n          } else {\n            var processObjectEvent = function() {\n              var args = [];\n              for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n              }\n              if (_this._isDisposed) {\n                return;\n              }\n              return callback.apply(parent_1, args);\n            };\n            eventRecord.objectCallback = processObjectEvent;\n          }\n          this._eventRecords.push(eventRecord);\n        }\n      };\n      EventGroup2.prototype.off = function(target2, eventName, callback, options2) {\n        for (var i = 0; i < this._eventRecords.length; i++) {\n          var eventRecord = this._eventRecords[i];\n          if ((!target2 || target2 === eventRecord.target) && (!eventName || eventName === eventRecord.eventName) && (!callback || callback === eventRecord.callback) && (typeof options2 !== \"boolean\" || options2 === eventRecord.options)) {\n            var events2 = eventRecord.target.__events__;\n            var targetArrayLookup = events2[eventRecord.eventName];\n            var targetArray = targetArrayLookup ? targetArrayLookup[this._id] : null;\n            if (targetArray) {\n              if (targetArray.length === 1 || !callback) {\n                targetArrayLookup.count -= targetArray.length;\n                delete events2[eventRecord.eventName][this._id];\n              } else {\n                targetArrayLookup.count--;\n                targetArray.splice(targetArray.indexOf(eventRecord), 1);\n              }\n              if (!targetArrayLookup.count) {\n                delete events2[eventRecord.eventName];\n              }\n            }\n            if (eventRecord.elementCallback) {\n              if (eventRecord.target.removeEventListener) {\n                eventRecord.target.removeEventListener(eventRecord.eventName, eventRecord.elementCallback, eventRecord.options);\n              } else if (eventRecord.target.detachEvent) {\n                eventRecord.target.detachEvent(\"on\" + eventRecord.eventName, eventRecord.elementCallback);\n              }\n            }\n            this._eventRecords.splice(i--, 1);\n          }\n        }\n      };\n      EventGroup2.prototype.raise = function(eventName, eventArgs, bubbleEvent) {\n        return EventGroup2.raise(this._parent, eventName, eventArgs, bubbleEvent);\n      };\n      EventGroup2.prototype.declare = function(event2) {\n        var declaredEvents = this._parent.__declaredEvents = this._parent.__declaredEvents || {};\n        if (typeof event2 === \"string\") {\n          declaredEvents[event2] = true;\n        } else {\n          for (var i = 0; i < event2.length; i++) {\n            declaredEvents[event2[i]] = true;\n          }\n        }\n      };\n      EventGroup2._uniqueId = 0;\n      return EventGroup2;\n    })()\n  );\n  var GLOBAL_STYLESHEET_KEY = \"__global__\";\n  var SHADOW_DOM_STYLESHEET_SETTING = \"__shadow_dom_stylesheet__\";\n  var DEFAULT_SHADOW_CONFIG = {\n    stylesheetKey: GLOBAL_STYLESHEET_KEY,\n    inShadow: false,\n    window: void 0,\n    __isShadowConfig__: true\n  };\n  var makeShadowConfig = function(stylesheetKey, inShadow, window2) {\n    return {\n      stylesheetKey,\n      inShadow,\n      window: window2,\n      __isShadowConfig__: true\n    };\n  };\n  var isShadowConfig = function(value2) {\n    if (!(value2 && isRecord(value2))) {\n      return false;\n    }\n    return value2.__isShadowConfig__ === true;\n  };\n  function isRecord(value2) {\n    return value2 !== null && typeof value2 === \"object\" && !Array.isArray(value2);\n  }\n  function extractStyleParts(sheet) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    var classes = [];\n    var objects = [];\n    var stylesheet2 = sheet;\n    function _processArgs(argsList) {\n      for (var _i2 = 0, argsList_1 = argsList; _i2 < argsList_1.length; _i2++) {\n        var arg = argsList_1[_i2];\n        if (arg && !isShadowConfig(arg)) {\n          if (typeof arg === \"string\") {\n            if (arg.indexOf(\" \") >= 0) {\n              _processArgs(arg.split(\" \"));\n            } else {\n              var translatedArgs = stylesheet2.argsFromClassName(arg);\n              if (translatedArgs) {\n                _processArgs(translatedArgs);\n              } else {\n                if (classes.indexOf(arg) === -1) {\n                  classes.push(arg);\n                }\n              }\n            }\n          } else if (Array.isArray(arg)) {\n            _processArgs(arg);\n          } else if (typeof arg === \"object\") {\n            objects.push(arg);\n          }\n        }\n      }\n    }\n    _processArgs(args);\n    return {\n      classes,\n      objects\n    };\n  }\n  function setRTL$1(isRTL) {\n    if (_rtl !== isRTL) {\n      _rtl = isRTL;\n    }\n  }\n  function getRTL$1() {\n    if (_rtl === void 0) {\n      _rtl = // eslint-disable-next-line no-restricted-globals\n      typeof document !== \"undefined\" && // eslint-disable-next-line no-restricted-globals\n      !!document.documentElement && // eslint-disable-next-line no-restricted-globals\n      document.documentElement.getAttribute(\"dir\") === \"rtl\";\n    }\n    return _rtl;\n  }\n  var _rtl;\n  _rtl = getRTL$1();\n  function getStyleOptions() {\n    return {\n      rtl: getRTL$1(),\n      shadowConfig: DEFAULT_SHADOW_CONFIG\n    };\n  }\n  var InjectionMode = {\n    /**\n     * Avoids style injection, use getRules() to read the styles.\n     */\n    none: 0,\n    /**\n     * Inserts rules using the insertRule api.\n     */\n    insertNode: 1,\n    /**\n     * Appends rules using appendChild.\n     */\n    appendChild: 2\n  };\n  var STYLESHEET_SETTING = \"__stylesheet__\";\n  var REUSE_STYLE_NODE = typeof navigator !== \"undefined\" && /rv:11.0/.test(navigator.userAgent);\n  var _global$1 = {};\n  try {\n    _global$1 = window || {};\n  } catch (_a2) {\n  }\n  var _stylesheet;\n  var Stylesheet = (\n    /** @class */\n    (function() {\n      function Stylesheet2(config, serializedStylesheet) {\n        var _a2, _b2, _c2, _d2, _e2, _f;\n        this._rules = [];\n        this._preservedRules = [];\n        this._counter = 0;\n        this._keyToClassName = {};\n        this._onInsertRuleCallbacks = [];\n        this._onResetCallbacks = [];\n        this._classNameToArgs = {};\n        this._config = __assign$1({ injectionMode: typeof document === \"undefined\" ? InjectionMode.none : InjectionMode.insertNode, defaultPrefix: \"css\", namespace: void 0, cspSettings: void 0 }, config);\n        this._classNameToArgs = (_a2 = serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.classNameToArgs) !== null && _a2 !== void 0 ? _a2 : this._classNameToArgs;\n        this._counter = (_b2 = serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.counter) !== null && _b2 !== void 0 ? _b2 : this._counter;\n        this._keyToClassName = (_d2 = (_c2 = this._config.classNameCache) !== null && _c2 !== void 0 ? _c2 : serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.keyToClassName) !== null && _d2 !== void 0 ? _d2 : this._keyToClassName;\n        this._preservedRules = (_e2 = serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.preservedRules) !== null && _e2 !== void 0 ? _e2 : this._preservedRules;\n        this._rules = (_f = serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.rules) !== null && _f !== void 0 ? _f : this._rules;\n      }\n      Stylesheet2.getInstance = function(shadowConfig) {\n        _stylesheet = _global$1[STYLESHEET_SETTING];\n        if (_global$1[SHADOW_DOM_STYLESHEET_SETTING]) {\n          return _global$1[SHADOW_DOM_STYLESHEET_SETTING].getInstance(shadowConfig);\n        }\n        if (!_stylesheet || _stylesheet._lastStyleElement && _stylesheet._lastStyleElement.ownerDocument !== document) {\n          var fabricConfig = (_global$1 === null || _global$1 === void 0 ? void 0 : _global$1.FabricConfig) || {};\n          var stylesheet2 = new Stylesheet2(fabricConfig.mergeStyles, fabricConfig.serializedStylesheet);\n          _stylesheet = stylesheet2;\n          _global$1[STYLESHEET_SETTING] = stylesheet2;\n        }\n        return _stylesheet;\n      };\n      Stylesheet2.prototype.serialize = function() {\n        return JSON.stringify({\n          classNameToArgs: this._classNameToArgs,\n          counter: this._counter,\n          keyToClassName: this._keyToClassName,\n          preservedRules: this._preservedRules,\n          rules: this._rules\n        });\n      };\n      Stylesheet2.prototype.setConfig = function(config) {\n        this._config = __assign$1(__assign$1({}, this._config), config);\n      };\n      Stylesheet2.prototype.onReset = function(callback) {\n        var _this = this;\n        this._onResetCallbacks.push(callback);\n        return function() {\n          _this._onResetCallbacks = _this._onResetCallbacks.filter(function(cb) {\n            return cb !== callback;\n          });\n        };\n      };\n      Stylesheet2.prototype.onInsertRule = function(callback) {\n        var _this = this;\n        this._onInsertRuleCallbacks.push(callback);\n        return function() {\n          _this._onInsertRuleCallbacks = _this._onInsertRuleCallbacks.filter(function(cb) {\n            return cb !== callback;\n          });\n        };\n      };\n      Stylesheet2.prototype.getClassName = function(displayName) {\n        var namespace = this._config.namespace;\n        var prefix = displayName || this._config.defaultPrefix;\n        return \"\".concat(namespace ? namespace + \"-\" : \"\").concat(prefix, \"-\").concat(this._counter++);\n      };\n      Stylesheet2.prototype.cacheClassName = function(className2, key2, args, rules2) {\n        this._keyToClassName[this._getCacheKey(key2)] = className2;\n        this._classNameToArgs[className2] = {\n          args,\n          rules: rules2\n        };\n      };\n      Stylesheet2.prototype.classNameFromKey = function(key2) {\n        return this._keyToClassName[this._getCacheKey(key2)];\n      };\n      Stylesheet2.prototype.getClassNameCache = function() {\n        return this._keyToClassName;\n      };\n      Stylesheet2.prototype.argsFromClassName = function(className2) {\n        var entry2 = this._classNameToArgs[className2];\n        return entry2 && entry2.args;\n      };\n      Stylesheet2.prototype.insertedRulesFromClassName = function(className2) {\n        var entry2 = this._classNameToArgs[className2];\n        return entry2 && entry2.rules;\n      };\n      Stylesheet2.prototype.insertRule = function(rule2, preserve, stylesheetKey) {\n        if (stylesheetKey === void 0) {\n          stylesheetKey = GLOBAL_STYLESHEET_KEY;\n        }\n        var injectionMode = this._config.injectionMode;\n        var element2 = injectionMode !== InjectionMode.none ? this._getStyleElement() : void 0;\n        if (preserve) {\n          this._preservedRules.push(rule2);\n        }\n        if (element2) {\n          switch (injectionMode) {\n            case InjectionMode.insertNode:\n              this._insertRuleIntoSheet(element2.sheet, rule2);\n              break;\n            case InjectionMode.appendChild:\n              element2.appendChild(document.createTextNode(rule2));\n              break;\n          }\n        } else {\n          this._rules.push(rule2);\n        }\n        if (this._config.onInsertRule) {\n          this._config.onInsertRule(rule2);\n        }\n        this._onInsertRuleCallbacks.forEach(function(callback) {\n          return callback({ key: stylesheetKey, sheet: element2 ? element2.sheet : void 0, rule: rule2 });\n        });\n      };\n      Stylesheet2.prototype.getRules = function(includePreservedRules) {\n        return (includePreservedRules ? this._preservedRules.join(\"\") : \"\") + this._rules.join(\"\");\n      };\n      Stylesheet2.prototype.reset = function() {\n        this._rules = [];\n        this._counter = 0;\n        this._classNameToArgs = {};\n        this._keyToClassName = {};\n        this._onResetCallbacks.forEach(function(callback) {\n          return callback();\n        });\n      };\n      Stylesheet2.prototype.resetKeys = function() {\n        this._keyToClassName = {};\n      };\n      Stylesheet2.prototype._createStyleElement = function() {\n        var _a2;\n        var doc = ((_a2 = this._config.window) === null || _a2 === void 0 ? void 0 : _a2.document) || document;\n        var head = doc.head;\n        var styleElement = doc.createElement(\"style\");\n        var nodeToInsertBefore = null;\n        styleElement.setAttribute(\"data-merge-styles\", \"true\");\n        var cspSettings = this._config.cspSettings;\n        if (cspSettings) {\n          if (cspSettings.nonce) {\n            styleElement.setAttribute(\"nonce\", cspSettings.nonce);\n          }\n        }\n        if (this._lastStyleElement) {\n          nodeToInsertBefore = this._lastStyleElement.nextElementSibling;\n        } else {\n          var placeholderStyleTag = this._findPlaceholderStyleTag();\n          if (placeholderStyleTag) {\n            nodeToInsertBefore = placeholderStyleTag.nextElementSibling;\n          } else {\n            nodeToInsertBefore = head.childNodes[0];\n          }\n        }\n        head.insertBefore(styleElement, head.contains(nodeToInsertBefore) ? nodeToInsertBefore : null);\n        this._lastStyleElement = styleElement;\n        return styleElement;\n      };\n      Stylesheet2.prototype._insertRuleIntoSheet = function(sheet, rule2) {\n        if (!sheet) {\n          return false;\n        }\n        try {\n          sheet.insertRule(rule2, sheet.cssRules.length);\n          return true;\n        } catch (e) {\n        }\n        return false;\n      };\n      Stylesheet2.prototype._getCacheKey = function(key2) {\n        return key2;\n      };\n      Stylesheet2.prototype._getStyleElement = function() {\n        var _this = this;\n        if (!this._styleElement) {\n          this._styleElement = this._createStyleElement();\n          if (!REUSE_STYLE_NODE) {\n            var win = this._config.window || window;\n            win.requestAnimationFrame(function() {\n              _this._styleElement = void 0;\n            });\n          }\n        }\n        return this._styleElement;\n      };\n      Stylesheet2.prototype._findPlaceholderStyleTag = function() {\n        var head = document.head;\n        if (head) {\n          return head.querySelector(\"style[data-merge-styles]\");\n        }\n        return null;\n      };\n      return Stylesheet2;\n    })()\n  );\n  var rules = {};\n  function kebabRules(rulePairs, index2) {\n    var rule2 = rulePairs[index2];\n    if (rule2.charAt(0) !== \"-\") {\n      rulePairs[index2] = rules[rule2] = rules[rule2] || rule2.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n    }\n  }\n  var _vendorSettings;\n  function getVendorSettings() {\n    var _a2;\n    if (!_vendorSettings) {\n      var doc = typeof document !== \"undefined\" ? document : void 0;\n      var nav = typeof navigator !== \"undefined\" ? navigator : void 0;\n      var userAgent = (_a2 = nav === null || nav === void 0 ? void 0 : nav.userAgent) === null || _a2 === void 0 ? void 0 : _a2.toLowerCase();\n      if (!doc) {\n        _vendorSettings = {\n          isWebkit: true,\n          isMoz: true,\n          isOpera: true,\n          isMs: true\n        };\n      } else {\n        _vendorSettings = {\n          isWebkit: !!(doc && \"WebkitAppearance\" in doc.documentElement.style),\n          isMoz: !!(userAgent && userAgent.indexOf(\"firefox\") > -1),\n          isOpera: !!(userAgent && userAgent.indexOf(\"opera\") > -1),\n          isMs: !!(nav && (/rv:11.0/i.test(nav.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent)))\n        };\n      }\n    }\n    return _vendorSettings;\n  }\n  var autoPrefixNames = {\n    \"user-select\": 1\n  };\n  function prefixRules(rulePairs, index2) {\n    var vendorSettings = getVendorSettings();\n    var name = rulePairs[index2];\n    if (autoPrefixNames[name]) {\n      var value2 = rulePairs[index2 + 1];\n      if (autoPrefixNames[name]) {\n        if (vendorSettings.isWebkit) {\n          rulePairs.push(\"-webkit-\" + name, value2);\n        }\n        if (vendorSettings.isMoz) {\n          rulePairs.push(\"-moz-\" + name, value2);\n        }\n        if (vendorSettings.isMs) {\n          rulePairs.push(\"-ms-\" + name, value2);\n        }\n        if (vendorSettings.isOpera) {\n          rulePairs.push(\"-o-\" + name, value2);\n        }\n      }\n    }\n  }\n  var NON_PIXEL_NUMBER_PROPS = [\n    \"column-count\",\n    \"font-weight\",\n    \"flex\",\n    \"flex-grow\",\n    \"flex-shrink\",\n    \"fill-opacity\",\n    \"opacity\",\n    \"order\",\n    \"z-index\",\n    \"zoom\"\n  ];\n  function provideUnits(rulePairs, index2) {\n    var name = rulePairs[index2];\n    var value2 = rulePairs[index2 + 1];\n    if (typeof value2 === \"number\") {\n      var isNonPixelProp = NON_PIXEL_NUMBER_PROPS.indexOf(name) > -1;\n      var isVariableOrPrefixed = name.indexOf(\"--\") > -1;\n      var unit2 = isNonPixelProp || isVariableOrPrefixed ? \"\" : \"px\";\n      rulePairs[index2 + 1] = \"\".concat(value2).concat(unit2);\n    }\n  }\n  var _a$6;\n  var LEFT$1 = \"left\";\n  var RIGHT$1 = \"right\";\n  var NO_FLIP = \"@noflip\";\n  var NAME_REPLACEMENTS = (_a$6 = {}, _a$6[LEFT$1] = RIGHT$1, _a$6[RIGHT$1] = LEFT$1, _a$6);\n  var VALUE_REPLACEMENTS = {\n    \"w-resize\": \"e-resize\",\n    \"sw-resize\": \"se-resize\",\n    \"nw-resize\": \"ne-resize\"\n  };\n  function rtlifyRules(options2, rulePairs, index2) {\n    if (options2.rtl) {\n      var name_1 = rulePairs[index2];\n      if (!name_1) {\n        return;\n      }\n      var value2 = rulePairs[index2 + 1];\n      if (typeof value2 === \"string\" && value2.indexOf(NO_FLIP) >= 0) {\n        rulePairs[index2 + 1] = value2.replace(/\\s*(?:\\/\\*\\s*)?\\@noflip\\b(?:\\s*\\*\\/)?\\s*?/g, \"\");\n      } else if (name_1.indexOf(LEFT$1) >= 0) {\n        rulePairs[index2] = name_1.replace(LEFT$1, RIGHT$1);\n      } else if (name_1.indexOf(RIGHT$1) >= 0) {\n        rulePairs[index2] = name_1.replace(RIGHT$1, LEFT$1);\n      } else if (String(value2).indexOf(LEFT$1) >= 0) {\n        rulePairs[index2 + 1] = value2.replace(LEFT$1, RIGHT$1);\n      } else if (String(value2).indexOf(RIGHT$1) >= 0) {\n        rulePairs[index2 + 1] = value2.replace(RIGHT$1, LEFT$1);\n      } else if (NAME_REPLACEMENTS[name_1]) {\n        rulePairs[index2] = NAME_REPLACEMENTS[name_1];\n      } else if (VALUE_REPLACEMENTS[value2]) {\n        rulePairs[index2 + 1] = VALUE_REPLACEMENTS[value2];\n      } else {\n        switch (name_1) {\n          case \"margin\":\n          case \"padding\":\n            rulePairs[index2 + 1] = flipQuad(value2);\n            break;\n          case \"box-shadow\":\n            rulePairs[index2 + 1] = negateNum(value2, 0);\n            break;\n        }\n      }\n    }\n  }\n  function negateNum(value2, partIndex) {\n    var parts = value2.split(\" \");\n    var numberVal = parseInt(parts[partIndex], 10);\n    parts[0] = parts[0].replace(String(numberVal), String(numberVal * -1));\n    return parts.join(\" \");\n  }\n  function flipQuad(value2) {\n    if (typeof value2 === \"string\") {\n      var parts = value2.split(\" \");\n      if (parts.length === 4) {\n        return \"\".concat(parts[0], \" \").concat(parts[3], \" \").concat(parts[2], \" \").concat(parts[1]);\n      }\n    }\n    return value2;\n  }\n  function tokenizeWithParentheses(value2) {\n    var parts = [];\n    var partStart = 0;\n    var parens = 0;\n    for (var i = 0; i < value2.length; i++) {\n      switch (value2[i]) {\n        case \"(\":\n          parens++;\n          break;\n        case \")\":\n          if (parens) {\n            parens--;\n          }\n          break;\n        case \"\t\":\n        case \" \":\n          if (!parens) {\n            if (i > partStart) {\n              parts.push(value2.substring(partStart, i));\n            }\n            partStart = i + 1;\n          }\n          break;\n      }\n    }\n    if (partStart < value2.length) {\n      parts.push(value2.substring(partStart));\n    }\n    return parts;\n  }\n  var DISPLAY_NAME = \"displayName\";\n  function getDisplayName(rules2) {\n    var rootStyle = rules2 && rules2[\"&\"];\n    return rootStyle ? rootStyle.displayName : void 0;\n  }\n  var globalSelectorRegExp = /\\:global\\((.+?)\\)/g;\n  function expandCommaSeparatedGlobals(selectorWithGlobals) {\n    if (!globalSelectorRegExp.test(selectorWithGlobals)) {\n      return selectorWithGlobals;\n    }\n    var replacementInfo = [];\n    var findGlobal = /\\:global\\((.+?)\\)/g;\n    var match2 = null;\n    while (match2 = findGlobal.exec(selectorWithGlobals)) {\n      if (match2[1].indexOf(\",\") > -1) {\n        replacementInfo.push([\n          match2.index,\n          match2.index + match2[0].length,\n          // Wrap each of the found selectors in :global()\n          match2[1].split(\",\").map(function(v) {\n            return \":global(\".concat(v.trim(), \")\");\n          }).join(\", \")\n        ]);\n      }\n    }\n    return replacementInfo.reverse().reduce(function(selector, _a2) {\n      var matchIndex = _a2[0], matchEndIndex = _a2[1], replacement = _a2[2];\n      var prefix = selector.slice(0, matchIndex);\n      var suffix = selector.slice(matchEndIndex);\n      return prefix + replacement + suffix;\n    }, selectorWithGlobals);\n  }\n  function isSelector(potentialSelector) {\n    return potentialSelector.indexOf(\":global(\") >= 0 || potentialSelector.indexOf(\":\") === 0;\n  }\n  function expandSelector(newSelector, currentSelector) {\n    if (newSelector.indexOf(\":global(\") >= 0) {\n      return newSelector.replace(globalSelectorRegExp, \"$1\");\n    } else if (newSelector.indexOf(\":host(\") === 0) {\n      return newSelector;\n    } else if (newSelector.indexOf(\":\") === 0) {\n      return currentSelector + newSelector;\n    } else if (newSelector.indexOf(\"&\") < 0) {\n      return currentSelector + \" \" + newSelector;\n    }\n    return newSelector;\n  }\n  function extractSelector(currentSelector, rules2, selector, value2, stylesheet2) {\n    if (rules2 === void 0) {\n      rules2 = { __order: [] };\n    }\n    if (selector.indexOf(\"@\") === 0) {\n      selector = selector + \"{\" + currentSelector;\n      extractRules([value2], rules2, selector, stylesheet2);\n    } else if (selector.indexOf(\",\") > -1) {\n      expandCommaSeparatedGlobals(selector).split(\",\").map(function(s2) {\n        return s2.trim();\n      }).forEach(function(separatedSelector) {\n        return extractRules([value2], rules2, expandSelector(separatedSelector, currentSelector), stylesheet2);\n      });\n    } else {\n      extractRules([value2], rules2, expandSelector(selector, currentSelector), stylesheet2);\n    }\n  }\n  function extractRules(args, rules2, currentSelector, stylesheet2) {\n    if (rules2 === void 0) {\n      rules2 = { __order: [] };\n    }\n    if (currentSelector === void 0) {\n      currentSelector = \"&\";\n    }\n    var currentRules = rules2[currentSelector];\n    if (!currentRules) {\n      currentRules = {};\n      rules2[currentSelector] = currentRules;\n      rules2.__order.push(currentSelector);\n    }\n    for (var _i = 0, args_1 = args; _i < args_1.length; _i++) {\n      var arg = args_1[_i];\n      if (typeof arg === \"string\") {\n        var expandedRules = stylesheet2.argsFromClassName(arg);\n        if (expandedRules) {\n          extractRules(expandedRules, rules2, currentSelector, stylesheet2);\n        }\n      } else if (Array.isArray(arg)) {\n        extractRules(arg, rules2, currentSelector, stylesheet2);\n      } else {\n        for (var prop in arg) {\n          if (arg.hasOwnProperty(prop)) {\n            var propValue = arg[prop];\n            if (prop === \"selectors\") {\n              var selectors = arg.selectors;\n              for (var newSelector in selectors) {\n                if (selectors.hasOwnProperty(newSelector)) {\n                  extractSelector(currentSelector, rules2, newSelector, selectors[newSelector], stylesheet2);\n                }\n              }\n            } else if (typeof propValue === \"object\" || isSelector(prop)) {\n              if (propValue !== null && propValue !== void 0) {\n                extractSelector(currentSelector, rules2, prop, propValue, stylesheet2);\n              }\n            } else {\n              if (propValue !== void 0) {\n                if (prop === \"margin\" || prop === \"padding\") {\n                  expandQuads(currentRules, prop, propValue);\n                } else {\n                  currentRules[prop] = propValue;\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    return rules2;\n  }\n  function expandQuads(currentRules, name, value2) {\n    var parts = typeof value2 === \"string\" ? tokenizeWithParentheses(value2) : [value2];\n    if (parts.length === 0) {\n      parts.push(value2);\n    }\n    if (parts[parts.length - 1] === \"!important\") {\n      parts = parts.slice(0, -1).map(function(p) {\n        return p + \" !important\";\n      });\n    }\n    currentRules[name + \"Top\"] = parts[0];\n    currentRules[name + \"Right\"] = parts[1] || parts[0];\n    currentRules[name + \"Bottom\"] = parts[2] || parts[0];\n    currentRules[name + \"Left\"] = parts[3] || parts[1] || parts[0];\n  }\n  function getKeyForRules(options2, rules2) {\n    var serialized = [options2.rtl ? \"rtl\" : \"ltr\"];\n    var hasProps = false;\n    for (var _i = 0, _a2 = rules2.__order; _i < _a2.length; _i++) {\n      var selector = _a2[_i];\n      serialized.push(selector);\n      var rulesForSelector = rules2[selector];\n      for (var propName in rulesForSelector) {\n        if (rulesForSelector.hasOwnProperty(propName) && rulesForSelector[propName] !== void 0) {\n          hasProps = true;\n          serialized.push(propName, rulesForSelector[propName]);\n        }\n      }\n    }\n    return hasProps ? serialized.join(\"\") : void 0;\n  }\n  function repeatString(target2, count2) {\n    if (count2 <= 0) {\n      return \"\";\n    }\n    if (count2 === 1) {\n      return target2;\n    }\n    return target2 + repeatString(target2, count2 - 1);\n  }\n  function serializeRuleEntries(options2, ruleEntries) {\n    if (!ruleEntries) {\n      return \"\";\n    }\n    var allEntries = [];\n    for (var entry2 in ruleEntries) {\n      if (ruleEntries.hasOwnProperty(entry2) && entry2 !== DISPLAY_NAME && ruleEntries[entry2] !== void 0) {\n        allEntries.push(entry2, ruleEntries[entry2]);\n      }\n    }\n    for (var i = 0; i < allEntries.length; i += 2) {\n      kebabRules(allEntries, i);\n      provideUnits(allEntries, i);\n      rtlifyRules(options2, allEntries, i);\n      prefixRules(allEntries, i);\n    }\n    for (var i = 1; i < allEntries.length; i += 4) {\n      allEntries.splice(i, 1, \":\", allEntries[i], \";\");\n    }\n    return allEntries.join(\"\");\n  }\n  function styleToRegistration(options2) {\n    var _a2;\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    var stylesheet2 = (_a2 = options2.stylesheet) !== null && _a2 !== void 0 ? _a2 : Stylesheet.getInstance(options2.shadowConfig);\n    var rules2 = extractRules(args, void 0, void 0, stylesheet2);\n    var key2 = getKeyForRules(options2, rules2);\n    if (key2) {\n      var registration = {\n        className: stylesheet2.classNameFromKey(key2),\n        key: key2,\n        args\n      };\n      if (!registration.className) {\n        registration.className = stylesheet2.getClassName(getDisplayName(rules2));\n        var rulesToInsert = [];\n        for (var _b2 = 0, _c2 = rules2.__order; _b2 < _c2.length; _b2++) {\n          var selector = _c2[_b2];\n          rulesToInsert.push(selector, serializeRuleEntries(options2, rules2[selector]));\n        }\n        registration.rulesToInsert = rulesToInsert;\n      }\n      return registration;\n    }\n    return void 0;\n  }\n  function applyRegistration(registration, specificityMultiplier, shadowConfig, sheet) {\n    if (specificityMultiplier === void 0) {\n      specificityMultiplier = 1;\n    }\n    var stylesheet2 = sheet !== null && sheet !== void 0 ? sheet : Stylesheet.getInstance(shadowConfig);\n    var className2 = registration.className, key2 = registration.key, args = registration.args, rulesToInsert = registration.rulesToInsert;\n    if (rulesToInsert) {\n      for (var i = 0; i < rulesToInsert.length; i += 2) {\n        var rules2 = rulesToInsert[i + 1];\n        if (rules2) {\n          var selector = rulesToInsert[i];\n          selector = selector.replace(/&/g, repeatString(\".\".concat(registration.className), specificityMultiplier));\n          var processedRule = \"\".concat(selector, \"{\").concat(rules2, \"}\").concat(selector.indexOf(\"@\") === 0 ? \"}\" : \"\");\n          stylesheet2.insertRule(processedRule);\n        }\n      }\n      stylesheet2.cacheClassName(className2, key2, args, rulesToInsert);\n    }\n  }\n  function styleToClassName(options2) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    var registration = styleToRegistration.apply(void 0, __spreadArray([options2], args, false));\n    if (registration) {\n      applyRegistration(registration, options2.specificityMultiplier, options2.shadowConfig, options2.stylesheet);\n      return registration.className;\n    }\n    return \"\";\n  }\n  function mergeStyles() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      args[_i] = arguments[_i];\n    }\n    return mergeCss(args, getStyleOptions());\n  }\n  function mergeCss(args, options2) {\n    var styleArgs = args instanceof Array ? args : [args];\n    var opts = options2 || {};\n    var hasShadowConfig = isShadowConfig(styleArgs[0]);\n    if (hasShadowConfig) {\n      opts.shadowConfig = styleArgs[0];\n    }\n    opts.stylesheet = Stylesheet.getInstance(opts.shadowConfig);\n    var _a2 = extractStyleParts(opts.stylesheet, styleArgs), classes = _a2.classes, objects = _a2.objects;\n    if (objects.length) {\n      classes.push(styleToClassName(opts, objects));\n    }\n    return classes.join(\" \");\n  }\n  function concatStyleSets() {\n    var styleSets = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      styleSets[_i] = arguments[_i];\n    }\n    if (styleSets && styleSets.length === 1 && styleSets[0] && !styleSets[0].subComponentStyles && !isShadowConfig(styleSets[0])) {\n      return styleSets[0];\n    }\n    var mergedSet = {};\n    var workingSubcomponentStyles = {};\n    for (var _a2 = 0, styleSets_1 = styleSets; _a2 < styleSets_1.length; _a2++) {\n      var currentSet = styleSets_1[_a2];\n      if (currentSet && !isShadowConfig(currentSet)) {\n        for (var prop in currentSet) {\n          if (currentSet.hasOwnProperty(prop)) {\n            if (prop === \"subComponentStyles\" && currentSet.subComponentStyles !== void 0) {\n              var currentComponentStyles = currentSet.subComponentStyles;\n              for (var subCompProp in currentComponentStyles) {\n                if (currentComponentStyles.hasOwnProperty(subCompProp)) {\n                  if (workingSubcomponentStyles.hasOwnProperty(subCompProp)) {\n                    workingSubcomponentStyles[subCompProp].push(currentComponentStyles[subCompProp]);\n                  } else {\n                    workingSubcomponentStyles[subCompProp] = [currentComponentStyles[subCompProp]];\n                  }\n                }\n              }\n              continue;\n            }\n            var mergedValue = mergedSet[prop];\n            var currentValue = currentSet[prop];\n            if (mergedValue === void 0) {\n              mergedSet[prop] = currentValue;\n            } else {\n              mergedSet[prop] = __spreadArray(__spreadArray([], Array.isArray(mergedValue) ? mergedValue : [mergedValue], true), Array.isArray(currentValue) ? currentValue : [currentValue], true);\n            }\n          }\n        }\n      }\n    }\n    if (Object.keys(workingSubcomponentStyles).length > 0) {\n      mergedSet.subComponentStyles = {};\n      var mergedSubStyles = mergedSet.subComponentStyles;\n      var _loop_1 = function(subCompProp2) {\n        if (workingSubcomponentStyles.hasOwnProperty(subCompProp2)) {\n          var workingSet_1 = workingSubcomponentStyles[subCompProp2];\n          mergedSubStyles[subCompProp2] = function(styleProps) {\n            return concatStyleSets.apply(void 0, workingSet_1.map(function(styleFunctionOrObject) {\n              return typeof styleFunctionOrObject === \"function\" ? styleFunctionOrObject(styleProps) : styleFunctionOrObject;\n            }));\n          };\n        }\n      };\n      for (var subCompProp in workingSubcomponentStyles) {\n        _loop_1(subCompProp);\n      }\n    }\n    return mergedSet;\n  }\n  function mergeStyleSets() {\n    var styleSets = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      styleSets[_i] = arguments[_i];\n    }\n    return mergeCssSets(styleSets, getStyleOptions());\n  }\n  function mergeCssSets(styleSets, options2) {\n    var classNameSet = { subComponentStyles: {} };\n    var shadowConfig = void 0;\n    var styleSet;\n    if (isShadowConfig(styleSets[0])) {\n      shadowConfig = styleSets[0];\n      styleSet = styleSets[1];\n    } else {\n      styleSet = styleSets[0];\n    }\n    shadowConfig !== null && shadowConfig !== void 0 ? shadowConfig : shadowConfig = options2 === null || options2 === void 0 ? void 0 : options2.shadowConfig;\n    var opts = __assign$1(__assign$1({}, options2), { shadowConfig });\n    if (!styleSet && styleSets.length <= 1) {\n      return { subComponentStyles: {} };\n    }\n    var sheet = Stylesheet.getInstance(shadowConfig);\n    opts.stylesheet = sheet;\n    var concatenatedStyleSet = concatStyleSets.apply(void 0, styleSets);\n    var registrations = [];\n    for (var styleSetArea in concatenatedStyleSet) {\n      if (concatenatedStyleSet.hasOwnProperty(styleSetArea)) {\n        if (styleSetArea === \"subComponentStyles\") {\n          classNameSet.subComponentStyles = concatenatedStyleSet.subComponentStyles || {};\n          continue;\n        } else if (styleSetArea === \"__shadowConfig__\") {\n          continue;\n        }\n        var styles = concatenatedStyleSet[styleSetArea];\n        var _a2 = extractStyleParts(sheet, styles), classes = _a2.classes, objects = _a2.objects;\n        if (objects === null || objects === void 0 ? void 0 : objects.length) {\n          var registration = styleToRegistration(opts || {}, { displayName: styleSetArea }, objects);\n          if (registration) {\n            registrations.push(registration);\n            classNameSet[styleSetArea] = classes.concat([registration.className]).join(\" \");\n          }\n        } else {\n          classNameSet[styleSetArea] = classes.join(\" \");\n        }\n      }\n    }\n    for (var _i = 0, registrations_1 = registrations; _i < registrations_1.length; _i++) {\n      var registration = registrations_1[_i];\n      if (registration) {\n        applyRegistration(registration, options2 === null || options2 === void 0 ? void 0 : options2.specificityMultiplier, shadowConfig);\n      }\n    }\n    return classNameSet;\n  }\n  function concatStyleSetsWithProps(styleProps) {\n    var allStyles = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      allStyles[_i - 1] = arguments[_i];\n    }\n    var result = [];\n    for (var _a2 = 0, allStyles_1 = allStyles; _a2 < allStyles_1.length; _a2++) {\n      var styles = allStyles_1[_a2];\n      if (styles) {\n        result.push(typeof styles === \"function\" ? styles(styleProps) : styles);\n      }\n    }\n    if (result.length === 1) {\n      return result[0];\n    } else if (result.length) {\n      return concatStyleSets.apply(void 0, result);\n    }\n    return {};\n  }\n  function fontFace(font2) {\n    var stylesheet2 = Stylesheet.getInstance();\n    var rule2 = serializeRuleEntries(getStyleOptions(), font2);\n    var className2 = stylesheet2.classNameFromKey(rule2);\n    if (className2) {\n      return;\n    }\n    var name = stylesheet2.getClassName();\n    stylesheet2.insertRule(\"@font-face{\".concat(rule2, \"}\"), true);\n    stylesheet2.cacheClassName(name, rule2, [], [\"font-face\", rule2]);\n  }\n  function keyframes(timeline) {\n    var stylesheet2 = Stylesheet.getInstance();\n    var rulesArray = [];\n    for (var prop in timeline) {\n      if (timeline.hasOwnProperty(prop)) {\n        rulesArray.push(prop, \"{\", serializeRuleEntries(getStyleOptions(), timeline[prop]), \"}\");\n      }\n    }\n    var rules2 = rulesArray.join(\"\");\n    var className2 = stylesheet2.classNameFromKey(rules2);\n    if (className2) {\n      return className2;\n    }\n    var name = stylesheet2.getClassName();\n    stylesheet2.insertRule(\"@keyframes \".concat(name, \"{\").concat(rules2, \"}\"), true);\n    stylesheet2.cacheClassName(name, rules2, [], [\"keyframes\", rules2]);\n    return name;\n  }\n  var _scrollbarWidth;\n  var _bodyScrollDisabledCount = 0;\n  var DisabledScrollClassName = mergeStyles({\n    overflow: \"hidden !important\"\n  });\n  var DATA_IS_SCROLLABLE_ATTRIBUTE = \"data-is-scrollable\";\n  var allowScrollOnElement = function(element2, events2) {\n    var window2 = getWindow(element2);\n    if (!element2 || !window2) {\n      return;\n    }\n    var _previousClientY = 0;\n    var _element = null;\n    var computedStyles = window2.getComputedStyle(element2);\n    var _saveClientY = function(event2) {\n      if (event2.targetTouches.length === 1) {\n        _previousClientY = event2.targetTouches[0].clientY;\n      }\n    };\n    var _preventOverscrolling = function(event2) {\n      if (event2.targetTouches.length !== 1) {\n        return;\n      }\n      event2.stopPropagation();\n      if (!_element) {\n        return;\n      }\n      var clientY = event2.targetTouches[0].clientY - _previousClientY;\n      var scrollableParent = findScrollableParent(event2.target);\n      if (scrollableParent && _element !== scrollableParent) {\n        _element = scrollableParent;\n        computedStyles = window2.getComputedStyle(_element);\n      }\n      var scrollTop = _element.scrollTop;\n      var isColumnReverse = (computedStyles === null || computedStyles === void 0 ? void 0 : computedStyles.flexDirection) === \"column-reverse\";\n      if (scrollTop === 0 && (isColumnReverse ? clientY < 0 : clientY > 0)) {\n        event2.preventDefault();\n      }\n      if (_element.scrollHeight - Math.abs(Math.ceil(scrollTop)) <= _element.clientHeight && (isColumnReverse ? clientY > 0 : clientY < 0)) {\n        event2.preventDefault();\n      }\n    };\n    events2.on(element2, \"touchstart\", _saveClientY, { passive: false });\n    events2.on(element2, \"touchmove\", _preventOverscrolling, { passive: false });\n    _element = element2;\n  };\n  var allowOverscrollOnElement = function(element2, events2) {\n    if (!element2) {\n      return;\n    }\n    var _allowElementScroll = function(event2) {\n      event2.stopPropagation();\n    };\n    events2.on(element2, \"touchmove\", _allowElementScroll, { passive: false });\n  };\n  var _disableIosBodyScroll = function(event2) {\n    event2.preventDefault();\n  };\n  function disableBodyScroll() {\n    var doc = getDocument();\n    if (doc && doc.body && !_bodyScrollDisabledCount) {\n      doc.body.classList.add(DisabledScrollClassName);\n      doc.body.addEventListener(\"touchmove\", _disableIosBodyScroll, { passive: false, capture: false });\n    }\n    _bodyScrollDisabledCount++;\n  }\n  function enableBodyScroll() {\n    if (_bodyScrollDisabledCount > 0) {\n      var doc = getDocument();\n      if (doc && doc.body && _bodyScrollDisabledCount === 1) {\n        doc.body.classList.remove(DisabledScrollClassName);\n        doc.body.removeEventListener(\"touchmove\", _disableIosBodyScroll);\n      }\n      _bodyScrollDisabledCount--;\n    }\n  }\n  function getScrollbarWidth(doc) {\n    if (_scrollbarWidth === void 0) {\n      var theDoc = getDocument();\n      var scrollDiv = theDoc.createElement(\"div\");\n      scrollDiv.style.setProperty(\"width\", \"100px\");\n      scrollDiv.style.setProperty(\"height\", \"100px\");\n      scrollDiv.style.setProperty(\"overflow\", \"scroll\");\n      scrollDiv.style.setProperty(\"position\", \"absolute\");\n      scrollDiv.style.setProperty(\"top\", \"-9999px\");\n      theDoc.body.appendChild(scrollDiv);\n      _scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n      theDoc.body.removeChild(scrollDiv);\n    }\n    return _scrollbarWidth;\n  }\n  function findScrollableParent(startingElement) {\n    var el = startingElement;\n    var doc = getDocument(startingElement);\n    while (el && el !== doc.body) {\n      if (el.getAttribute(DATA_IS_SCROLLABLE_ATTRIBUTE) === \"true\") {\n        return el;\n      }\n      el = el.parentElement;\n    }\n    el = startingElement;\n    while (el && el !== doc.body) {\n      if (el.getAttribute(DATA_IS_SCROLLABLE_ATTRIBUTE) !== \"false\") {\n        var computedStyles = getComputedStyle(el);\n        var overflowY = computedStyles ? computedStyles.getPropertyValue(\"overflow-y\") : \"\";\n        if (overflowY && (overflowY === \"scroll\" || overflowY === \"auto\")) {\n          return el;\n        }\n      }\n      el = el.parentElement;\n    }\n    if (!el || el === doc.body) {\n      el = getWindow(startingElement);\n    }\n    return el;\n  }\n  function warn$1(message) {\n    if (console && console.warn) {\n      console.warn(message);\n    }\n  }\n  var define_process_env_default = { NODE_ENV: \"production\" };\n  function warnConditionallyRequiredProps(componentName, props, requiredProps, conditionalPropName, condition) {\n    if (condition === true && define_process_env_default.NODE_ENV !== \"production\") {\n      for (var _i = 0, requiredProps_1 = requiredProps; _i < requiredProps_1.length; _i++) {\n        var requiredPropName = requiredProps_1[_i];\n        if (!(requiredPropName in props)) {\n          warn$1(\"\".concat(componentName, \" property '\").concat(requiredPropName, \"' is required when '\").concat(conditionalPropName, \"' is used.'\"));\n        }\n      }\n    }\n  }\n  function warnMutuallyExclusive(componentName, props, exclusiveMap) {\n  }\n  function warnDeprecations(componentName, props, deprecationMap) {\n  }\n  (function(_super) {\n    __extends(BaseComponent, _super);\n    function BaseComponent(props, context2) {\n      var _this = _super.call(this, props, context2) || this;\n      _makeAllSafe(_this, BaseComponent.prototype, [\n        \"componentDidMount\",\n        \"shouldComponentUpdate\",\n        \"getSnapshotBeforeUpdate\",\n        \"render\",\n        \"componentDidUpdate\",\n        \"componentWillUnmount\"\n      ]);\n      return _this;\n    }\n    BaseComponent.prototype.componentDidUpdate = function(prevProps, prevState) {\n      this._updateComponentRef(prevProps, this.props);\n    };\n    BaseComponent.prototype.componentDidMount = function() {\n      this._setComponentRef(this.props.componentRef, this);\n    };\n    BaseComponent.prototype.componentWillUnmount = function() {\n      this._setComponentRef(this.props.componentRef, null);\n      if (this.__disposables) {\n        for (var i = 0, len2 = this._disposables.length; i < len2; i++) {\n          var disposable = this.__disposables[i];\n          if (disposable.dispose) {\n            disposable.dispose();\n          }\n        }\n        this.__disposables = null;\n      }\n    };\n    Object.defineProperty(BaseComponent.prototype, \"className\", {\n      /**\n       * Gets the object's class name.\n       */\n      get: function() {\n        if (!this.__className) {\n          var funcNameRegex = /function (.{1,})\\(/;\n          var results = funcNameRegex.exec(this.constructor.toString());\n          this.__className = results && results.length > 1 ? results[1] : \"\";\n        }\n        return this.__className;\n      },\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(BaseComponent.prototype, \"_disposables\", {\n      /**\n       * Allows subclasses to push things to this._disposables to be auto disposed.\n       */\n      get: function() {\n        if (!this.__disposables) {\n          this.__disposables = [];\n        }\n        return this.__disposables;\n      },\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(BaseComponent.prototype, \"_async\", {\n      /**\n       * Gets the async instance associated with the component, created on demand. The async instance gives\n       * subclasses a way to execute setTimeout/setInterval async calls safely, where the callbacks\n       * will be cleared/ignored automatically after unmounting. The helpers within the async object also\n       * preserve the this pointer so that you don't need to \"bind\" the callbacks.\n       */\n      get: function() {\n        if (!this.__async) {\n          this.__async = new Async(this);\n          this._disposables.push(this.__async);\n        }\n        return this.__async;\n      },\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(BaseComponent.prototype, \"_events\", {\n      /**\n       * Gets the event group instance assocaited with the component, created on demand. The event instance\n       * provides on/off methods for listening to DOM (or regular javascript object) events. The event callbacks\n       * will be automatically disconnected after unmounting. The helpers within the events object also\n       * preserve the this reference so that you don't need to \"bind\" the callbacks.\n       */\n      get: function() {\n        if (!this.__events) {\n          this.__events = new EventGroup(this);\n          this._disposables.push(this.__events);\n        }\n        return this.__events;\n      },\n      enumerable: false,\n      configurable: true\n    });\n    BaseComponent.prototype._resolveRef = function(refName) {\n      var _this = this;\n      if (!this.__resolves) {\n        this.__resolves = {};\n      }\n      if (!this.__resolves[refName]) {\n        this.__resolves[refName] = function(ref2) {\n          return _this[refName] = ref2;\n        };\n      }\n      return this.__resolves[refName];\n    };\n    BaseComponent.prototype._updateComponentRef = function(currentProps, newProps) {\n      if (newProps === void 0) {\n        newProps = {};\n      }\n      if (currentProps && newProps && currentProps.componentRef !== newProps.componentRef) {\n        this._setComponentRef(currentProps.componentRef, null);\n        this._setComponentRef(newProps.componentRef, this);\n      }\n    };\n    BaseComponent.prototype._warnDeprecations = function(deprecationMap) {\n      warnDeprecations(this.className, this.props);\n    };\n    BaseComponent.prototype._warnMutuallyExclusive = function(mutuallyExclusiveMap) {\n      warnMutuallyExclusive(this.className, this.props);\n    };\n    BaseComponent.prototype._warnConditionallyRequiredProps = function(requiredProps, conditionalPropName, condition) {\n      warnConditionallyRequiredProps(this.className, this.props, requiredProps, conditionalPropName, condition);\n    };\n    BaseComponent.prototype._setComponentRef = function(ref2, value2) {\n      if (!this._skipComponentRefResolution && ref2) {\n        if (typeof ref2 === \"function\") {\n          ref2(value2);\n        }\n        if (typeof ref2 === \"object\") {\n          ref2.current = value2;\n        }\n      }\n    };\n    return BaseComponent;\n  })(React__namespace.Component);\n  function _makeAllSafe(obj2, prototype2, methodNames) {\n    for (var i = 0, len2 = methodNames.length; i < len2; i++) {\n      _makeSafe(obj2, prototype2, methodNames[i]);\n    }\n  }\n  function _makeSafe(obj2, prototype2, methodName) {\n    var classMethod = obj2[methodName];\n    var prototypeMethod = prototype2[methodName];\n    if (classMethod || prototypeMethod) {\n      obj2[methodName] = function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        var retVal2;\n        if (prototypeMethod) {\n          retVal2 = prototypeMethod.apply(this, args);\n        }\n        if (classMethod !== prototypeMethod) {\n          retVal2 = classMethod.apply(this, args);\n        }\n        return retVal2;\n      };\n    }\n  }\n  function nullRender() {\n    return null;\n  }\n  var DelayedRender = (\n    /** @class */\n    (function(_super) {\n      __extends(DelayedRender2, _super);\n      function DelayedRender2(props) {\n        var _this = _super.call(this, props) || this;\n        _this.state = {\n          isRendered: getWindow() === void 0\n        };\n        return _this;\n      }\n      DelayedRender2.prototype.componentDidMount = function() {\n        var _this = this;\n        var delay = this.props.delay;\n        this._timeoutId = window.setTimeout(function() {\n          _this.setState({\n            isRendered: true\n          });\n        }, delay);\n      };\n      DelayedRender2.prototype.componentWillUnmount = function() {\n        if (this._timeoutId) {\n          clearTimeout(this._timeoutId);\n        }\n      };\n      DelayedRender2.prototype.render = function() {\n        return this.state.isRendered ? React__namespace.Children.only(this.props.children) : null;\n      };\n      DelayedRender2.defaultProps = {\n        delay: 0\n      };\n      return DelayedRender2;\n    })(React__namespace.Component)\n  );\n  var GLOBAL_SETTINGS_PROP_NAME = \"__globalSettings__\";\n  var CALLBACK_STATE_PROP_NAME = \"__callbacks__\";\n  var _counter = 0;\n  var GlobalSettings = (\n    /** @class */\n    (function() {\n      function GlobalSettings2() {\n      }\n      GlobalSettings2.getValue = function(key2, defaultValue) {\n        var globalSettings = _getGlobalSettings();\n        if (globalSettings[key2] === void 0) {\n          globalSettings[key2] = typeof defaultValue === \"function\" ? defaultValue() : defaultValue;\n        }\n        return globalSettings[key2];\n      };\n      GlobalSettings2.setValue = function(key2, value2) {\n        var globalSettings = _getGlobalSettings();\n        var callbacks = globalSettings[CALLBACK_STATE_PROP_NAME];\n        var oldValue = globalSettings[key2];\n        if (value2 !== oldValue) {\n          globalSettings[key2] = value2;\n          var changeDescription = {\n            oldValue,\n            value: value2,\n            key: key2\n          };\n          for (var id2 in callbacks) {\n            if (callbacks.hasOwnProperty(id2)) {\n              callbacks[id2](changeDescription);\n            }\n          }\n        }\n        return value2;\n      };\n      GlobalSettings2.addChangeListener = function(cb) {\n        var id2 = cb.__id__;\n        var callbacks = _getCallbacks();\n        if (!id2) {\n          id2 = cb.__id__ = String(_counter++);\n        }\n        callbacks[id2] = cb;\n      };\n      GlobalSettings2.removeChangeListener = function(cb) {\n        var callbacks = _getCallbacks();\n        delete callbacks[cb.__id__];\n      };\n      return GlobalSettings2;\n    })()\n  );\n  function _getGlobalSettings() {\n    var _a2;\n    var win = getWindow();\n    var globalObj = win || {};\n    if (!globalObj[GLOBAL_SETTINGS_PROP_NAME]) {\n      globalObj[GLOBAL_SETTINGS_PROP_NAME] = (_a2 = {}, _a2[CALLBACK_STATE_PROP_NAME] = {}, _a2);\n    }\n    return globalObj[GLOBAL_SETTINGS_PROP_NAME];\n  }\n  function _getCallbacks() {\n    var globalSettings = _getGlobalSettings();\n    return globalSettings[CALLBACK_STATE_PROP_NAME];\n  }\n  var KeyCodes = {\n    backspace: 8,\n    tab: 9,\n    enter: 13,\n    alt: 18,\n    escape: 27,\n    space: 32,\n    pageUp: 33,\n    pageDown: 34,\n    end: 35,\n    home: 36,\n    left: 37,\n    up: 38,\n    right: 39,\n    down: 40\n  };\n  var Rectangle = (\n    /** @class */\n    (function() {\n      function Rectangle2(left, right, top, bottom) {\n        if (left === void 0) {\n          left = 0;\n        }\n        if (right === void 0) {\n          right = 0;\n        }\n        if (top === void 0) {\n          top = 0;\n        }\n        if (bottom === void 0) {\n          bottom = 0;\n        }\n        this.top = top;\n        this.bottom = bottom;\n        this.left = left;\n        this.right = right;\n      }\n      Object.defineProperty(Rectangle2.prototype, \"width\", {\n        /**\n         * Calculated automatically by subtracting the right from left\n         */\n        get: function() {\n          return this.right - this.left;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Rectangle2.prototype, \"height\", {\n        /**\n         * Calculated automatically by subtracting the bottom from top.\n         */\n        get: function() {\n          return this.bottom - this.top;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Rectangle2.prototype.equals = function(rect2) {\n        return parseFloat(this.top.toFixed(4)) === parseFloat(rect2.top.toFixed(4)) && parseFloat(this.bottom.toFixed(4)) === parseFloat(rect2.bottom.toFixed(4)) && parseFloat(this.left.toFixed(4)) === parseFloat(rect2.left.toFixed(4)) && parseFloat(this.right.toFixed(4)) === parseFloat(rect2.right.toFixed(4));\n      };\n      return Rectangle2;\n    })()\n  );\n  function appendFunction(parent) {\n    var functions = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      functions[_i - 1] = arguments[_i];\n    }\n    if (functions.length < 2) {\n      return functions[0];\n    }\n    return function() {\n      var args = [];\n      for (var _i2 = 0; _i2 < arguments.length; _i2++) {\n        args[_i2] = arguments[_i2];\n      }\n      functions.forEach(function(f) {\n        return f && f.apply(parent, args);\n      });\n    };\n  }\n  function mergeAriaAttributeValues() {\n    var ariaAttributes = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      ariaAttributes[_i] = arguments[_i];\n    }\n    var mergedAttribute = ariaAttributes.filter(function(arg) {\n      return arg;\n    }).join(\" \").trim();\n    return mergedAttribute === \"\" ? void 0 : mergedAttribute;\n  }\n  function findIndex(array2, cb, fromIndex) {\n    if (fromIndex === void 0) {\n      fromIndex = 0;\n    }\n    var index2 = -1;\n    for (var i = fromIndex; array2 && i < array2.length; i++) {\n      if (cb(array2[i], i)) {\n        index2 = i;\n        break;\n      }\n    }\n    return index2;\n  }\n  function find$3(array2, cb) {\n    var index2 = findIndex(array2, cb);\n    if (index2 < 0) {\n      return void 0;\n    }\n    return array2[index2];\n  }\n  function addElementAtIndex(array2, index2, itemToAdd) {\n    var copy2 = array2.slice();\n    copy2.splice(index2, 0, itemToAdd);\n    return copy2;\n  }\n  function arraysEqual(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function getItem$1(key2) {\n    var result = null;\n    try {\n      var win = getWindow();\n      result = win ? win.sessionStorage.getItem(key2) : null;\n    } catch (e) {\n    }\n    return result;\n  }\n  function setItem(key2, data2) {\n    var _a2;\n    try {\n      (_a2 = getWindow()) === null || _a2 === void 0 ? void 0 : _a2.sessionStorage.setItem(key2, data2);\n    } catch (e) {\n    }\n  }\n  var RTL_LOCAL_STORAGE_KEY = \"isRTL\";\n  var _isRTL;\n  function getRTL(theme) {\n    if (theme === void 0) {\n      theme = {};\n    }\n    if (theme.rtl !== void 0) {\n      return theme.rtl;\n    }\n    if (_isRTL === void 0) {\n      var savedRTL = getItem$1(RTL_LOCAL_STORAGE_KEY);\n      if (savedRTL !== null) {\n        _isRTL = savedRTL === \"1\";\n        setRTL(_isRTL);\n      }\n      var doc = getDocument();\n      if (_isRTL === void 0 && doc) {\n        _isRTL = (doc.body && doc.body.getAttribute(\"dir\") || doc.documentElement.getAttribute(\"dir\")) === \"rtl\";\n        setRTL$1(_isRTL);\n      }\n    }\n    return !!_isRTL;\n  }\n  function setRTL(isRTL, persistSetting) {\n    if (persistSetting === void 0) {\n      persistSetting = false;\n    }\n    var doc = getDocument();\n    if (doc) {\n      doc.documentElement.setAttribute(\"dir\", isRTL ? \"rtl\" : \"ltr\");\n    }\n    if (persistSetting) {\n      setItem(RTL_LOCAL_STORAGE_KEY, isRTL ? \"1\" : \"0\");\n    }\n    _isRTL = isRTL;\n    setRTL$1(_isRTL);\n  }\n  function getRTLSafeKeyCode(key2, theme) {\n    if (theme === void 0) {\n      theme = {};\n    }\n    if (getRTL(theme)) {\n      if (key2 === KeyCodes.left) {\n        key2 = KeyCodes.right;\n      } else if (key2 === KeyCodes.right) {\n        key2 = KeyCodes.left;\n      }\n    }\n    return key2;\n  }\n  var MAX_CACHE_COUNT = 50;\n  var DEFAULT_SPECIFICITY_MULTIPLIER = 5;\n  var _memoizedClassNames = 0;\n  var stylesheet$1 = Stylesheet.getInstance();\n  if (stylesheet$1 && stylesheet$1.onReset) {\n    stylesheet$1.onReset(function() {\n      return _memoizedClassNames++;\n    });\n  }\n  var retVal = \"__retval__\";\n  function classNamesFunction(options2) {\n    if (options2 === void 0) {\n      options2 = {};\n    }\n    var windowMap = /* @__PURE__ */ new Map();\n    var styleCalcCount = 0;\n    var getClassNamesCount = 0;\n    var currentMemoizedClassNames = _memoizedClassNames;\n    var getClassNames2 = function(styleFunctionOrObject, styleProps) {\n      var _a2;\n      if (styleProps === void 0) {\n        styleProps = {};\n      }\n      if (options2.useStaticStyles && typeof styleFunctionOrObject === \"function\" && styleFunctionOrObject.__noStyleOverride__) {\n        return styleFunctionOrObject(styleProps);\n      }\n      getClassNamesCount++;\n      var shadowConfig = styleFunctionOrObject ? styleFunctionOrObject.__shadowConfig__ : void 0;\n      var key2 = shadowConfig && shadowConfig.window ? shadowConfig.window : \"__default__\";\n      if (!windowMap.has(key2)) {\n        windowMap.set(key2, /* @__PURE__ */ new Map());\n      }\n      var current = windowMap.get(key2);\n      var theme = styleProps.theme;\n      var rtl = theme && theme.rtl !== void 0 ? theme.rtl : getRTL();\n      var disableCaching = options2.disableCaching;\n      if (currentMemoizedClassNames !== _memoizedClassNames) {\n        currentMemoizedClassNames = _memoizedClassNames;\n        windowMap.set(key2, /* @__PURE__ */ new Map());\n        current = windowMap.get(key2);\n        styleCalcCount = 0;\n      }\n      if (!options2.disableCaching) {\n        current = _traverseMap(windowMap.get(key2), styleFunctionOrObject);\n        current = _traverseMap(current, styleProps);\n      }\n      if (disableCaching || !current[retVal]) {\n        if (styleFunctionOrObject === void 0) {\n          current[retVal] = {};\n        } else {\n          current[retVal] = mergeCssSets([\n            typeof styleFunctionOrObject === \"function\" ? styleFunctionOrObject(styleProps) : styleFunctionOrObject\n          ], {\n            shadowConfig: styleFunctionOrObject.__shadowConfig__,\n            rtl: !!rtl,\n            specificityMultiplier: options2.useStaticStyles ? DEFAULT_SPECIFICITY_MULTIPLIER : void 0\n          });\n        }\n        if (!disableCaching) {\n          styleCalcCount++;\n        }\n      }\n      if (styleCalcCount > (options2.cacheSize || MAX_CACHE_COUNT)) {\n        var win = getWindow();\n        if ((_a2 = win === null || win === void 0 ? void 0 : win.FabricConfig) === null || _a2 === void 0 ? void 0 : _a2.enableClassNameCacheFullWarning) {\n          console.warn(\"Styles are being recalculated too frequently. Cache miss rate is \".concat(styleCalcCount, \"/\").concat(getClassNamesCount, \".\"));\n          console.trace();\n        }\n        windowMap.get(key2).clear();\n        styleCalcCount = 0;\n        options2.disableCaching = true;\n      }\n      return current[retVal];\n    };\n    return getClassNames2;\n  }\n  function _traverseEdge(current, value2) {\n    value2 = _normalizeValue(value2);\n    if (!current.has(value2)) {\n      current.set(value2, /* @__PURE__ */ new Map());\n    }\n    return current.get(value2);\n  }\n  function _traverseMap(current, inputs) {\n    if (typeof inputs === \"function\") {\n      var cachedInputsFromStyled = inputs.__cachedInputs__;\n      if (cachedInputsFromStyled) {\n        for (var _i = 0, _a2 = inputs.__cachedInputs__; _i < _a2.length; _i++) {\n          var input = _a2[_i];\n          current = _traverseEdge(current, input);\n        }\n      } else {\n        current = _traverseEdge(current, inputs);\n      }\n    } else if (typeof inputs === \"object\") {\n      for (var propName in inputs) {\n        if (inputs.hasOwnProperty(propName)) {\n          current = _traverseEdge(current, inputs[propName]);\n        }\n      }\n    }\n    return current;\n  }\n  function _normalizeValue(value2) {\n    switch (value2) {\n      case void 0:\n        return \"__undefined__\";\n      case null:\n        return \"__null__\";\n      default:\n        return value2;\n    }\n  }\n  var _initializedStylesheetResets$1 = false;\n  var _resetCounter = 0;\n  var _emptyObject = { empty: true };\n  var _dictionary = {};\n  var _weakMap = typeof WeakMap === \"undefined\" ? null : WeakMap;\n  function resetMemoizations() {\n    _resetCounter++;\n  }\n  function memoizeFunction(cb, maxCacheSize, ignoreNullOrUndefinedResult) {\n    if (maxCacheSize === void 0) {\n      maxCacheSize = 100;\n    }\n    if (ignoreNullOrUndefinedResult === void 0) {\n      ignoreNullOrUndefinedResult = false;\n    }\n    if (!_weakMap) {\n      return cb;\n    }\n    if (!_initializedStylesheetResets$1) {\n      var stylesheet2 = Stylesheet.getInstance();\n      if (stylesheet2 && stylesheet2.onReset) {\n        Stylesheet.getInstance().onReset(resetMemoizations);\n      }\n      _initializedStylesheetResets$1 = true;\n    }\n    var rootNode;\n    var cacheSize = 0;\n    var localResetCounter = _resetCounter;\n    return function memoizedFunction() {\n      var args = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n      }\n      var currentNode = rootNode;\n      if (rootNode === void 0 || localResetCounter !== _resetCounter || maxCacheSize > 0 && cacheSize > maxCacheSize) {\n        rootNode = _createNode();\n        cacheSize = 0;\n        localResetCounter = _resetCounter;\n      }\n      currentNode = rootNode;\n      for (var i = 0; i < args.length; i++) {\n        var arg = _normalizeArg(args[i]);\n        if (!currentNode.map.has(arg)) {\n          currentNode.map.set(arg, _createNode());\n        }\n        currentNode = currentNode.map.get(arg);\n      }\n      if (!currentNode.hasOwnProperty(\"value\")) {\n        currentNode.value = cb.apply(void 0, args);\n        cacheSize++;\n      }\n      if (ignoreNullOrUndefinedResult && (currentNode.value === null || currentNode.value === void 0)) {\n        currentNode.value = cb.apply(void 0, args);\n      }\n      return currentNode.value;\n    };\n  }\n  function createMemoizer(getValue2) {\n    if (!_weakMap) {\n      return getValue2;\n    }\n    var cache2 = new _weakMap();\n    function memoizedGetValue(input) {\n      if (!input || typeof input !== \"function\" && typeof input !== \"object\") {\n        return getValue2(input);\n      }\n      if (cache2.has(input)) {\n        return cache2.get(input);\n      }\n      var value2 = getValue2(input);\n      cache2.set(input, value2);\n      return value2;\n    }\n    return memoizedGetValue;\n  }\n  function _normalizeArg(val) {\n    if (!val) {\n      return _emptyObject;\n    } else if (typeof val === \"object\" || typeof val === \"function\") {\n      return val;\n    } else if (!_dictionary[val]) {\n      _dictionary[val] = { val };\n    }\n    return _dictionary[val];\n  }\n  function _createNode() {\n    return {\n      map: _weakMap ? new _weakMap() : null\n    };\n  }\n  function createComposedComponent(outer) {\n    var Outer = outer;\n    var outerMemoizer = createMemoizer(function(inner) {\n      if (outer === inner) {\n        throw new Error(\"Attempted to compose a component with itself.\");\n      }\n      var Inner = inner;\n      var innerMemoizer = createMemoizer(function(defaultRender) {\n        var InnerWithDefaultRender = function(innerProps) {\n          return React__namespace.createElement(Inner, __assign$1({}, innerProps, { defaultRender }));\n        };\n        return InnerWithDefaultRender;\n      });\n      var OuterWithDefaultRender = function(outerProps) {\n        var defaultRender = outerProps.defaultRender;\n        return React__namespace.createElement(Outer, __assign$1({}, outerProps, { defaultRender: defaultRender ? innerMemoizer(defaultRender) : Inner }));\n      };\n      return OuterWithDefaultRender;\n    });\n    return outerMemoizer;\n  }\n  var componentAsMemoizer = createMemoizer(createComposedComponent);\n  function composeComponentAs(outer, inner) {\n    return componentAsMemoizer(outer)(inner);\n  }\n  function isControlled(props, valueProp) {\n    return props[valueProp] !== void 0 && props[valueProp] !== null;\n  }\n  function css() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      args[_i] = arguments[_i];\n    }\n    var classes = [];\n    for (var _a2 = 0, args_1 = args; _a2 < args_1.length; _a2++) {\n      var arg = args_1[_a2];\n      if (arg) {\n        if (typeof arg === \"string\") {\n          classes.push(arg);\n        } else if (arg.hasOwnProperty(\"toString\") && typeof arg.toString === \"function\") {\n          classes.push(arg.toString());\n        } else {\n          for (var key2 in arg) {\n            if (arg[key2]) {\n              classes.push(key2);\n            }\n          }\n        }\n      }\n    }\n    return classes.join(\" \");\n  }\n  var CustomizationsGlobalKey = \"customizations\";\n  var NO_CUSTOMIZATIONS = { settings: {}, scopedSettings: {}, inCustomizerContext: false };\n  var _allSettings = GlobalSettings.getValue(CustomizationsGlobalKey, {\n    settings: {},\n    scopedSettings: {},\n    inCustomizerContext: false\n  });\n  var _events = [];\n  var Customizations = (\n    /** @class */\n    (function() {\n      function Customizations2() {\n      }\n      Customizations2.reset = function() {\n        _allSettings.settings = {};\n        _allSettings.scopedSettings = {};\n      };\n      Customizations2.applySettings = function(settings) {\n        _allSettings.settings = __assign$1(__assign$1({}, _allSettings.settings), settings);\n        Customizations2._raiseChange();\n      };\n      Customizations2.applyScopedSettings = function(scopeName, settings) {\n        _allSettings.scopedSettings[scopeName] = __assign$1(__assign$1({}, _allSettings.scopedSettings[scopeName]), settings);\n        Customizations2._raiseChange();\n      };\n      Customizations2.getSettings = function(properties, scopeName, localSettings) {\n        if (localSettings === void 0) {\n          localSettings = NO_CUSTOMIZATIONS;\n        }\n        var settings = {};\n        var localScopedSettings = scopeName && localSettings.scopedSettings[scopeName] || {};\n        var globalScopedSettings = scopeName && _allSettings.scopedSettings[scopeName] || {};\n        for (var _i = 0, properties_1 = properties; _i < properties_1.length; _i++) {\n          var property2 = properties_1[_i];\n          settings[property2] = localScopedSettings[property2] || localSettings.settings[property2] || globalScopedSettings[property2] || _allSettings.settings[property2];\n        }\n        return settings;\n      };\n      Customizations2.applyBatchedUpdates = function(code, suppressUpdate) {\n        Customizations2._suppressUpdates = true;\n        try {\n          code();\n        } catch (_a2) {\n        }\n        Customizations2._suppressUpdates = false;\n        if (!suppressUpdate) {\n          Customizations2._raiseChange();\n        }\n      };\n      Customizations2.observe = function(onChange) {\n        _events.push(onChange);\n      };\n      Customizations2.unobserve = function(onChange) {\n        _events = _events.filter(function(cb) {\n          return cb !== onChange;\n        });\n      };\n      Customizations2._raiseChange = function() {\n        if (!Customizations2._suppressUpdates) {\n          _events.forEach(function(cb) {\n            return cb();\n          });\n        }\n      };\n      return Customizations2;\n    })()\n  );\n  var CustomizerContext = React__namespace.createContext({\n    customizations: {\n      inCustomizerContext: false,\n      settings: {},\n      scopedSettings: {}\n    }\n  });\n  function mergeSettings(oldSettings, newSettings) {\n    if (oldSettings === void 0) {\n      oldSettings = {};\n    }\n    var mergeSettingsWith = _isSettingsFunction(newSettings) ? newSettings : _settingsMergeWith(newSettings);\n    return mergeSettingsWith(oldSettings);\n  }\n  function mergeScopedSettings(oldSettings, newSettings) {\n    if (oldSettings === void 0) {\n      oldSettings = {};\n    }\n    var mergeSettingsWith = _isSettingsFunction(newSettings) ? newSettings : _scopedSettingsMergeWith(newSettings);\n    return mergeSettingsWith(oldSettings);\n  }\n  function _isSettingsFunction(settings) {\n    return typeof settings === \"function\";\n  }\n  function _settingsMergeWith(newSettings) {\n    return function(settings) {\n      return newSettings ? __assign$1(__assign$1({}, settings), newSettings) : settings;\n    };\n  }\n  function _scopedSettingsMergeWith(scopedSettingsFromProps) {\n    if (scopedSettingsFromProps === void 0) {\n      scopedSettingsFromProps = {};\n    }\n    return function(oldScopedSettings) {\n      var newScopedSettings = __assign$1({}, oldScopedSettings);\n      for (var scopeName in scopedSettingsFromProps) {\n        if (scopedSettingsFromProps.hasOwnProperty(scopeName)) {\n          newScopedSettings[scopeName] = __assign$1(__assign$1({}, oldScopedSettings[scopeName]), scopedSettingsFromProps[scopeName]);\n        }\n      }\n      return newScopedSettings;\n    };\n  }\n  function mergeCustomizations(props, parentContext) {\n    var _a2 = (parentContext || {}).customizations, customizations = _a2 === void 0 ? { settings: {}, scopedSettings: {} } : _a2;\n    return {\n      customizations: {\n        settings: mergeSettings(customizations.settings, props.settings),\n        scopedSettings: mergeScopedSettings(customizations.scopedSettings, props.scopedSettings),\n        inCustomizerContext: true\n      }\n    };\n  }\n  var Customizer = (\n    /** @class */\n    (function(_super) {\n      __extends(Customizer2, _super);\n      function Customizer2() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._onCustomizationChange = function() {\n          return _this.forceUpdate();\n        };\n        return _this;\n      }\n      Customizer2.prototype.componentDidMount = function() {\n        Customizations.observe(this._onCustomizationChange);\n      };\n      Customizer2.prototype.componentWillUnmount = function() {\n        Customizations.unobserve(this._onCustomizationChange);\n      };\n      Customizer2.prototype.render = function() {\n        var _this = this;\n        var contextTransform = this.props.contextTransform;\n        return React__namespace.createElement(CustomizerContext.Consumer, null, function(parentContext) {\n          var newContext = mergeCustomizations(_this.props, parentContext);\n          if (contextTransform) {\n            newContext = contextTransform(newContext);\n          }\n          return React__namespace.createElement(CustomizerContext.Provider, { value: newContext }, _this.props.children);\n        });\n      };\n      return Customizer2;\n    })(React__namespace.Component)\n  );\n  function hoistStatics(source2, dest) {\n    for (var name_1 in source2) {\n      if (source2.hasOwnProperty(name_1)) {\n        dest[name_1] = source2[name_1];\n      }\n    }\n    return dest;\n  }\n  var noop$5 = function() {\n    return false;\n  };\n  var noopShadow = function() {\n    return DEFAULT_SHADOW_CONFIG;\n  };\n  var noopRootStylesheets = function() {\n    return /* @__PURE__ */ new Map();\n  };\n  var noopUndefined = function() {\n    return void 0;\n  };\n  var getNewContext = function() {\n    return {\n      stylesheets: /* @__PURE__ */ new Map(),\n      useAdoptedStylesheetEx: noop$5,\n      useAdoptedStylesheet: noop$5,\n      useShadowConfig: noopShadow,\n      useMergeStylesShadowRootContext: noopUndefined,\n      useHasMergeStylesShadowRootContext: noop$5,\n      useMergeStylesRootStylesheets: noopRootStylesheets,\n      useWindow: noopUndefined,\n      useStyled: noopUndefined\n    };\n  };\n  var MergeStylesDefaultContext = React__namespace.createContext(getNewContext());\n  var useMergeStylesHooks = function() {\n    var ctx = React__namespace.useContext(MergeStylesDefaultContext);\n    return {\n      useAdoptedStylesheet: ctx.useAdoptedStylesheet,\n      useAdoptedStylesheetEx: ctx.useAdoptedStylesheetEx,\n      useShadowConfig: ctx.useShadowConfig,\n      useMergeStylesShadowRootContext: ctx.useMergeStylesShadowRootContext,\n      useHasMergeStylesShadowRootContext: ctx.useHasMergeStylesShadowRootContext,\n      useMergeStylesRootStylesheets: ctx.useMergeStylesRootStylesheets,\n      useWindow: ctx.useWindow,\n      useStyled: ctx.useStyled\n    };\n  };\n  var MergeStylesShadowRootContext = React__namespace.createContext(void 0);\n  var useHasMergeStylesShadowRootContext = function() {\n    return !!useMergeStylesShadowRootContext();\n  };\n  var useMergeStylesShadowRootContext = function() {\n    return React__namespace.useContext(MergeStylesShadowRootContext);\n  };\n  var MergeStylesShadowRootConsumer = function(_a2) {\n    var stylesheetKey = _a2.stylesheetKey, children2 = _a2.children;\n    var _b2 = useMergeStylesHooks(), useAdoptedStylesheetEx = _b2.useAdoptedStylesheetEx, useMergeStylesRootStylesheets = _b2.useMergeStylesRootStylesheets, useWindow2 = _b2.useWindow;\n    var shadowCtx = useMergeStylesShadowRootContext();\n    var rootMergeStyles = useMergeStylesRootStylesheets();\n    var win = useWindow2();\n    useAdoptedStylesheetEx(GLOBAL_STYLESHEET_KEY, shadowCtx, rootMergeStyles, win);\n    useAdoptedStylesheetEx(stylesheetKey, shadowCtx, rootMergeStyles, win);\n    return children2(!!shadowCtx);\n  };\n  var WindowContext = React__namespace.createContext({\n    // eslint-disable-next-line no-restricted-globals\n    window: typeof window === \"object\" ? window : void 0\n  });\n  var useWindow = function() {\n    return React__namespace.useContext(WindowContext).window;\n  };\n  var useDocument = function() {\n    var _a2;\n    return (_a2 = React__namespace.useContext(WindowContext).window) === null || _a2 === void 0 ? void 0 : _a2.document;\n  };\n  var memoizedMakeShadowConfig = memoizeFunction(makeShadowConfig);\n  var mergeComponentStyles = memoizeFunction(\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function(defaultStyles, componentStyles, shadowConfig) {\n      var _a2;\n      var styles = (_a2 = componentStyles !== null && componentStyles !== void 0 ? componentStyles : defaultStyles) !== null && _a2 !== void 0 ? _a2 : {};\n      styles.__shadowConfig__ = shadowConfig;\n      return styles;\n    }\n  );\n  function customizable(scope, fields, concatStyles) {\n    return function customizableFactory(ComposedComponent) {\n      var _a2;\n      var resultClass = (_a2 = /** @class */\n      (function(_super) {\n        __extends(ComponentWithInjectedProps, _super);\n        function ComponentWithInjectedProps(props) {\n          var _this = _super.call(this, props) || this;\n          _this._styleCache = {};\n          _this._onSettingChanged = _this._onSettingChanged.bind(_this);\n          return _this;\n        }\n        ComponentWithInjectedProps.prototype.componentDidMount = function() {\n          Customizations.observe(this._onSettingChanged);\n        };\n        ComponentWithInjectedProps.prototype.componentWillUnmount = function() {\n          Customizations.unobserve(this._onSettingChanged);\n        };\n        ComponentWithInjectedProps.prototype.render = function() {\n          var _this = this;\n          return React__namespace.createElement(MergeStylesShadowRootConsumer, { stylesheetKey: scope }, function(inShadow) {\n            return React__namespace.createElement(CustomizerContext.Consumer, null, function(context2) {\n              var _b2;\n              var defaultProps = Customizations.getSettings(fields, scope, context2.customizations);\n              var win = (_b2 = _this.context.window) !== null && _b2 !== void 0 ? _b2 : getWindow();\n              var shadowConfig = memoizedMakeShadowConfig(scope, inShadow, win);\n              var componentProps = _this.props;\n              if (defaultProps.styles && typeof defaultProps.styles === \"function\") {\n                defaultProps.styles = defaultProps.styles(__assign$1(__assign$1({}, defaultProps), componentProps));\n              }\n              if (defaultProps.styles) {\n                if (_this._styleCache.default !== defaultProps.styles || _this._styleCache.component !== componentProps.styles) {\n                  var mergedStyles = concatStyleSets(defaultProps.styles, componentProps.styles);\n                  mergedStyles.__shadowConfig__ = shadowConfig;\n                  _this._styleCache.default = defaultProps.styles;\n                  _this._styleCache.component = componentProps.styles;\n                  _this._styleCache.merged = mergedStyles;\n                }\n                return React__namespace.createElement(ComposedComponent, __assign$1({}, defaultProps, componentProps, { styles: _this._styleCache.merged }));\n              }\n              var styles = mergeComponentStyles(defaultProps.styles, componentProps.styles, shadowConfig);\n              return React__namespace.createElement(ComposedComponent, __assign$1({}, defaultProps, componentProps, { styles }));\n            });\n          });\n        };\n        ComponentWithInjectedProps.prototype._onSettingChanged = function() {\n          this.forceUpdate();\n        };\n        return ComponentWithInjectedProps;\n      })(React__namespace.Component), _a2.displayName = \"Customized\" + scope, _a2.contextType = WindowContext, _a2);\n      return hoistStatics(ComposedComponent, resultClass);\n    };\n  }\n  function useCustomizationSettings(properties, scopeName) {\n    var forceUpdate = useForceUpdate();\n    var customizations = React__namespace.useContext(CustomizerContext).customizations;\n    var inCustomizerContext = customizations.inCustomizerContext;\n    React__namespace.useEffect(function() {\n      if (!inCustomizerContext) {\n        Customizations.observe(forceUpdate);\n      }\n      return function() {\n        if (!inCustomizerContext) {\n          Customizations.unobserve(forceUpdate);\n        }\n      };\n    }, [inCustomizerContext]);\n    return Customizations.getSettings(properties, scopeName, customizations);\n  }\n  function useForceUpdate() {\n    var _a2 = React__namespace.useState(0), setValue = _a2[1];\n    return function() {\n      return setValue(function(value2) {\n        return ++value2;\n      });\n    };\n  }\n  function extendComponent(parent, methods2) {\n    for (var name_1 in methods2) {\n      if (methods2.hasOwnProperty(name_1)) {\n        parent[name_1] = appendFunction(parent, parent[name_1], methods2[name_1]);\n      }\n    }\n  }\n  var CURRENT_ID_PROPERTY = \"__currentId__\";\n  var DEFAULT_ID_STRING = \"id__\";\n  var _global = getWindow() || {};\n  if (_global[CURRENT_ID_PROPERTY] === void 0) {\n    _global[CURRENT_ID_PROPERTY] = 0;\n  }\n  var _initializedStylesheetResets = false;\n  function getId(prefix) {\n    if (!_initializedStylesheetResets) {\n      var stylesheet2 = Stylesheet.getInstance();\n      if (stylesheet2 && stylesheet2.onReset) {\n        stylesheet2.onReset(resetIds);\n      }\n      _initializedStylesheetResets = true;\n    }\n    var index2 = _global[CURRENT_ID_PROPERTY]++;\n    return (prefix === void 0 ? DEFAULT_ID_STRING : prefix) + index2;\n  }\n  function resetIds(counter) {\n    if (counter === void 0) {\n      counter = 0;\n    }\n    _global[CURRENT_ID_PROPERTY] = counter;\n  }\n  var toObjectMap = function() {\n    var items = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      items[_i] = arguments[_i];\n    }\n    var result = {};\n    for (var _a2 = 0, items_1 = items; _a2 < items_1.length; _a2++) {\n      var item = items_1[_a2];\n      var keys2 = Array.isArray(item) ? item : Object.keys(item);\n      for (var _b2 = 0, keys_1 = keys2; _b2 < keys_1.length; _b2++) {\n        var key2 = keys_1[_b2];\n        result[key2] = 1;\n      }\n    }\n    return result;\n  };\n  var baseElementEvents = toObjectMap([\n    \"onCopy\",\n    \"onCut\",\n    \"onPaste\",\n    \"onCompositionEnd\",\n    \"onCompositionStart\",\n    \"onCompositionUpdate\",\n    \"onFocus\",\n    \"onFocusCapture\",\n    \"onBlur\",\n    \"onBlurCapture\",\n    \"onChange\",\n    \"onInput\",\n    \"onSubmit\",\n    \"onLoad\",\n    \"onError\",\n    \"onKeyDown\",\n    \"onKeyDownCapture\",\n    \"onKeyPress\",\n    \"onKeyUp\",\n    \"onAbort\",\n    \"onCanPlay\",\n    \"onCanPlayThrough\",\n    \"onDurationChange\",\n    \"onEmptied\",\n    \"onEncrypted\",\n    \"onEnded\",\n    \"onLoadedData\",\n    \"onLoadedMetadata\",\n    \"onLoadStart\",\n    \"onPause\",\n    \"onPlay\",\n    \"onPlaying\",\n    \"onProgress\",\n    \"onRateChange\",\n    \"onSeeked\",\n    \"onSeeking\",\n    \"onStalled\",\n    \"onSuspend\",\n    \"onTimeUpdate\",\n    \"onVolumeChange\",\n    \"onWaiting\",\n    \"onClick\",\n    \"onClickCapture\",\n    \"onContextMenu\",\n    \"onDoubleClick\",\n    \"onDrag\",\n    \"onDragEnd\",\n    \"onDragEnter\",\n    \"onDragExit\",\n    \"onDragLeave\",\n    \"onDragOver\",\n    \"onDragStart\",\n    \"onDrop\",\n    \"onMouseDown\",\n    \"onMouseDownCapture\",\n    \"onMouseEnter\",\n    \"onMouseLeave\",\n    \"onMouseMove\",\n    \"onMouseOut\",\n    \"onMouseOver\",\n    \"onMouseUp\",\n    \"onMouseUpCapture\",\n    \"onSelect\",\n    \"onTouchCancel\",\n    \"onTouchEnd\",\n    \"onTouchMove\",\n    \"onTouchStart\",\n    \"onScroll\",\n    \"onWheel\",\n    \"onPointerCancel\",\n    \"onPointerDown\",\n    \"onPointerEnter\",\n    \"onPointerLeave\",\n    \"onPointerMove\",\n    \"onPointerOut\",\n    \"onPointerOver\",\n    \"onPointerUp\",\n    \"onGotPointerCapture\",\n    \"onLostPointerCapture\"\n  ]);\n  var baseElementProperties = toObjectMap([\n    \"accessKey\",\n    // global\n    \"children\",\n    // global\n    \"className\",\n    // global\n    \"contentEditable\",\n    // global\n    \"dir\",\n    // global\n    \"draggable\",\n    // global\n    \"hidden\",\n    // global\n    \"htmlFor\",\n    // global\n    \"id\",\n    // global\n    \"lang\",\n    // global\n    \"ref\",\n    // global\n    \"role\",\n    // global\n    \"style\",\n    // global\n    \"tabIndex\",\n    // global\n    \"title\",\n    // global\n    \"translate\",\n    // global\n    \"spellCheck\",\n    // global\n    \"name\"\n    // global\n  ]);\n  var htmlElementProperties = toObjectMap(baseElementProperties, baseElementEvents);\n  toObjectMap(htmlElementProperties, [\n    \"form\"\n    // button, fieldset, input, label, meter, object, output, select, textarea\n  ]);\n  var audioProperties = toObjectMap(htmlElementProperties, [\n    \"height\",\n    // canvas, embed, iframe, img, input, object, video\n    \"loop\",\n    // audio, video\n    \"muted\",\n    // audio, video\n    \"preload\",\n    // audio, video\n    \"src\",\n    // audio, embed, iframe, img, input, script, source, track, video\n    \"width\"\n    // canvas, embed, iframe, img, input, object, video\n  ]);\n  toObjectMap(audioProperties, [\n    \"poster\"\n    // video\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"start\"\n    // ol\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"value\"\n    // button, input, li, option, meter, progress, param\n  ]);\n  var anchorProperties = toObjectMap(htmlElementProperties, [\n    \"download\",\n    // a, area\n    \"href\",\n    // a, area, base, link\n    \"hrefLang\",\n    // a, area, link\n    \"media\",\n    // a, area, link, source, style\n    \"rel\",\n    // a, area, link\n    \"target\",\n    // a, area, base, form\n    \"type\"\n    // a, button, input, link, menu, object, script, source, style\n  ]);\n  var buttonProperties = toObjectMap(htmlElementProperties, [\n    \"autoFocus\",\n    // button, input, select, textarea\n    \"disabled\",\n    // button, fieldset, input, optgroup, option, select, textarea\n    \"form\",\n    // button, fieldset, input, label, meter, object, output, select, textarea\n    \"formAction\",\n    // input, button\n    \"formEncType\",\n    // input, button\n    \"formMethod\",\n    // input, button\n    \"formNoValidate\",\n    // input, button\n    \"formTarget\",\n    // input, button\n    \"type\",\n    // a, button, input, link, menu, object, script, source, style\n    \"value\"\n    // button, input, li, option, meter, progress, param,\n  ]);\n  var inputProperties = toObjectMap(buttonProperties, [\n    \"accept\",\n    // input\n    \"alt\",\n    // area, img, input\n    \"autoCapitalize\",\n    // input, textarea\n    \"autoComplete\",\n    // form, input\n    \"checked\",\n    // input\n    \"dirname\",\n    // input, textarea\n    \"form\",\n    // button, fieldset, input, label, meter, object, output, select, textarea\n    \"height\",\n    // canvas, embed, iframe, img, input, object, video\n    \"inputMode\",\n    // input\n    \"list\",\n    // input\n    \"max\",\n    // input, meter\n    \"maxLength\",\n    // input, textarea\n    \"min\",\n    // input, meter\n    \"minLength\",\n    // input, textarea\n    \"multiple\",\n    // input, select\n    \"pattern\",\n    // input\n    \"placeholder\",\n    // input, textarea\n    \"readOnly\",\n    // input, textarea\n    \"required\",\n    // input, select, textarea\n    \"src\",\n    // audio, embed, iframe, img, input, script, source, track, video\n    \"step\",\n    // input\n    \"size\",\n    // input\n    \"type\",\n    // a, button, input, link, menu, object, script, source, style\n    \"value\",\n    // button, input, li, option, meter, progress, param\n    \"width\"\n    // canvas, embed, iframe, img, input, object, video\n  ]);\n  var textAreaProperties = toObjectMap(buttonProperties, [\n    \"autoCapitalize\",\n    // input, textarea\n    \"cols\",\n    // textarea\n    \"dirname\",\n    // input, textarea\n    \"form\",\n    // button, fieldset, input, label, meter, object, output, select, textarea\n    \"maxLength\",\n    // input, textarea\n    \"minLength\",\n    // input, textarea\n    \"placeholder\",\n    // input, textarea\n    \"readOnly\",\n    // input, textarea\n    \"required\",\n    // input, select, textarea\n    \"rows\",\n    // textarea\n    \"wrap\"\n    // textarea\n  ]);\n  toObjectMap(buttonProperties, [\n    \"form\",\n    // button, fieldset, input, label, meter, object, output, select, textarea\n    \"multiple\",\n    // input, select\n    \"required\"\n    // input, select, textarea\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"selected\",\n    // option\n    \"value\"\n    // button, input, li, option, meter, progress, param\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"cellPadding\",\n    // table\n    \"cellSpacing\"\n    // table\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"rowSpan\",\n    // td, th\n    \"scope\"\n    // th\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"colSpan\",\n    // td\n    \"headers\",\n    // td\n    \"rowSpan\",\n    // td, th\n    \"scope\"\n    // th\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"span\"\n    // col, colgroup\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"span\"\n    // col, colgroup\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"acceptCharset\",\n    // form\n    \"action\",\n    // form\n    \"encType\",\n    // form\n    \"encType\",\n    // form\n    \"method\",\n    // form\n    \"noValidate\",\n    // form\n    \"target\"\n    // form\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"allow\",\n    // iframe\n    \"allowFullScreen\",\n    // iframe\n    \"allowPaymentRequest\",\n    // iframe\n    \"allowTransparency\",\n    // iframe\n    \"csp\",\n    // iframe\n    \"height\",\n    // canvas, embed, iframe, img, input, object, video\n    \"importance\",\n    // iframe\n    \"referrerPolicy\",\n    // iframe\n    \"sandbox\",\n    // iframe\n    \"src\",\n    // audio, embed, iframe, img, input, script, source, track, video\n    \"srcDoc\",\n    // iframe\n    \"width\"\n    // canvas, embed, iframe, img, input, object, video,\n  ]);\n  var imgProperties = toObjectMap(htmlElementProperties, [\n    \"alt\",\n    // area, img, input\n    \"crossOrigin\",\n    // img\n    \"height\",\n    // canvas, embed, iframe, img, input, object, video\n    \"src\",\n    // audio, embed, iframe, img, input, script, source, track, video\n    \"srcSet\",\n    // img, source\n    \"useMap\",\n    // img, object,\n    \"width\"\n    // canvas, embed, iframe, img, input, object, video\n  ]);\n  var divProperties = htmlElementProperties;\n  function getNativeProps(props, allowedPropNames, excludedPropNames) {\n    var isArray2 = Array.isArray(allowedPropNames);\n    var result = {};\n    var keys2 = Object.keys(props);\n    for (var _i = 0, keys_2 = keys2; _i < keys_2.length; _i++) {\n      var key2 = keys_2[_i];\n      var isNativeProp = !isArray2 && allowedPropNames[key2] || isArray2 && allowedPropNames.indexOf(key2) >= 0 || key2.indexOf(\"data-\") === 0 || key2.indexOf(\"aria-\") === 0;\n      if (isNativeProp && (!excludedPropNames || (excludedPropNames === null || excludedPropNames === void 0 ? void 0 : excludedPropNames.indexOf(key2)) === -1)) {\n        result[key2] = props[key2];\n      }\n    }\n    return result;\n  }\n  var REACT_LIFECYCLE_EXCLUSIONS = [\n    \"setState\",\n    \"render\",\n    \"componentWillMount\",\n    \"UNSAFE_componentWillMount\",\n    \"componentDidMount\",\n    \"componentWillReceiveProps\",\n    \"UNSAFE_componentWillReceiveProps\",\n    \"shouldComponentUpdate\",\n    \"componentWillUpdate\",\n    \"getSnapshotBeforeUpdate\",\n    \"UNSAFE_componentWillUpdate\",\n    \"componentDidUpdate\",\n    \"componentWillUnmount\"\n  ];\n  function hoistMethods(destination, source2, exclusions) {\n    if (exclusions === void 0) {\n      exclusions = REACT_LIFECYCLE_EXCLUSIONS;\n    }\n    var hoisted = [];\n    var _loop_1 = function(methodName2) {\n      if (typeof source2[methodName2] === \"function\" && destination[methodName2] === void 0 && (!exclusions || exclusions.indexOf(methodName2) === -1)) {\n        hoisted.push(methodName2);\n        destination[methodName2] = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          source2[methodName2].apply(source2, args);\n        };\n      }\n    };\n    for (var methodName in source2) {\n      _loop_1(methodName);\n    }\n    return hoisted;\n  }\n  function unhoistMethods(source2, methodNames) {\n    methodNames.forEach(function(methodName) {\n      return delete source2[methodName];\n    });\n  }\n  function initializeComponentRef(obj2) {\n    extendComponent(obj2, {\n      componentDidMount: _onMount,\n      componentDidUpdate: _onUpdate,\n      componentWillUnmount: _onUnmount\n    });\n  }\n  function _onMount() {\n    _setComponentRef(this.props.componentRef, this);\n  }\n  function _onUpdate(prevProps) {\n    if (prevProps.componentRef !== this.props.componentRef) {\n      _setComponentRef(prevProps.componentRef, null);\n      _setComponentRef(this.props.componentRef, this);\n    }\n  }\n  function _onUnmount() {\n    _setComponentRef(this.props.componentRef, null);\n  }\n  function _setComponentRef(componentRef, value2) {\n    if (componentRef) {\n      if (typeof componentRef === \"object\") {\n        componentRef.current = value2;\n      } else if (typeof componentRef === \"function\") {\n        componentRef(value2);\n      }\n    }\n  }\n  var _a$5;\n  var DirectionalKeyCodes = (_a$5 = {}, _a$5[KeyCodes.up] = 1, _a$5[KeyCodes.down] = 1, _a$5[KeyCodes.left] = 1, _a$5[KeyCodes.right] = 1, _a$5[KeyCodes.home] = 1, _a$5[KeyCodes.end] = 1, _a$5[KeyCodes.tab] = 1, _a$5[KeyCodes.pageUp] = 1, _a$5[KeyCodes.pageDown] = 1, _a$5);\n  function isDirectionalKeyCode(which) {\n    return !!DirectionalKeyCodes[which];\n  }\n  var IsFocusVisibleClassName = \"ms-Fabric--isFocusVisible\";\n  var IsFocusHiddenClassName = \"ms-Fabric--isFocusHidden\";\n  function updateClassList(el, enabled) {\n    if (el) {\n      el.classList.add(enabled ? IsFocusVisibleClassName : IsFocusHiddenClassName);\n      el.classList.remove(enabled ? IsFocusHiddenClassName : IsFocusVisibleClassName);\n    }\n  }\n  function setFocusVisibility(enabled, target2, registeredProviders) {\n    var _a2;\n    if (registeredProviders) {\n      registeredProviders.forEach(function(ref2) {\n        return updateClassList(ref2.current, enabled);\n      });\n    } else {\n      updateClassList((_a2 = getWindow(target2)) === null || _a2 === void 0 ? void 0 : _a2.document.body, enabled);\n    }\n  }\n  var mountCounters = /* @__PURE__ */ new WeakMap();\n  var callbackMap = /* @__PURE__ */ new WeakMap();\n  function setMountCounters(key2, delta) {\n    var newValue;\n    var currValue = mountCounters.get(key2);\n    if (currValue) {\n      newValue = currValue + delta;\n    } else {\n      newValue = 1;\n    }\n    mountCounters.set(key2, newValue);\n    return newValue;\n  }\n  function setCallbackMap(context2) {\n    var callbacks = callbackMap.get(context2);\n    if (callbacks) {\n      return callbacks;\n    }\n    var onMouseDown = function(ev) {\n      return _onMouseDown(ev, context2.registeredProviders);\n    };\n    var onPointerDown = function(ev) {\n      return _onPointerDown(ev, context2.registeredProviders);\n    };\n    var onKeyDown = function(ev) {\n      return _onKeyDown(ev, context2.registeredProviders);\n    };\n    var onKeyUp = function(ev) {\n      return _onKeyUp(ev, context2.registeredProviders);\n    };\n    callbacks = { onMouseDown, onPointerDown, onKeyDown, onKeyUp };\n    callbackMap.set(context2, callbacks);\n    return callbacks;\n  }\n  var FocusRectsContext = React__namespace.createContext(void 0);\n  function useFocusRects(rootRef) {\n    var context2 = React__namespace.useContext(FocusRectsContext);\n    React__namespace.useEffect(function() {\n      var _a2, _b2, _c2, _d2;\n      var win = getWindow(rootRef === null || rootRef === void 0 ? void 0 : rootRef.current);\n      if (!win || ((_a2 = win.FabricConfig) === null || _a2 === void 0 ? void 0 : _a2.disableFocusRects) === true) {\n        return void 0;\n      }\n      var el = win;\n      var onMouseDown;\n      var onPointerDown;\n      var onKeyDown;\n      var onKeyUp;\n      if (((_b2 = context2 === null || context2 === void 0 ? void 0 : context2.providerRef) === null || _b2 === void 0 ? void 0 : _b2.current) && ((_d2 = (_c2 = context2 === null || context2 === void 0 ? void 0 : context2.providerRef) === null || _c2 === void 0 ? void 0 : _c2.current) === null || _d2 === void 0 ? void 0 : _d2.addEventListener)) {\n        el = context2.providerRef.current;\n        var callbacks = (\n          /*@__NOINLINE__*/\n          setCallbackMap(context2)\n        );\n        onMouseDown = callbacks.onMouseDown;\n        onPointerDown = callbacks.onPointerDown;\n        onKeyDown = callbacks.onKeyDown;\n        onKeyUp = callbacks.onKeyUp;\n      } else {\n        onMouseDown = _onMouseDown;\n        onPointerDown = _onPointerDown;\n        onKeyDown = _onKeyDown;\n        onKeyUp = _onKeyUp;\n      }\n      var count2 = setMountCounters(el, 1);\n      if (count2 <= 1) {\n        el.addEventListener(\"mousedown\", onMouseDown, true);\n        el.addEventListener(\"pointerdown\", onPointerDown, true);\n        el.addEventListener(\"keydown\", onKeyDown, true);\n        el.addEventListener(\"keyup\", onKeyUp, true);\n      }\n      return function() {\n        var _a3;\n        if (!win || ((_a3 = win.FabricConfig) === null || _a3 === void 0 ? void 0 : _a3.disableFocusRects) === true) {\n          return;\n        }\n        count2 = setMountCounters(el, -1);\n        if (count2 === 0) {\n          el.removeEventListener(\"mousedown\", onMouseDown, true);\n          el.removeEventListener(\"pointerdown\", onPointerDown, true);\n          el.removeEventListener(\"keydown\", onKeyDown, true);\n          el.removeEventListener(\"keyup\", onKeyUp, true);\n        }\n      };\n    }, [context2, rootRef]);\n  }\n  var FocusRects = function(props) {\n    useFocusRects(props.rootRef);\n    return null;\n  };\n  function _onMouseDown(ev, registeredProviders) {\n    setFocusVisibility(false, ev.target, registeredProviders);\n  }\n  function _onPointerDown(ev, registeredProviders) {\n    if (ev.pointerType !== \"mouse\") {\n      setFocusVisibility(false, ev.target, registeredProviders);\n    }\n  }\n  function _onKeyDown(ev, registeredProviders) {\n    if (isDirectionalKeyCode(ev.which)) {\n      setFocusVisibility(true, ev.target, registeredProviders);\n    }\n  }\n  function _onKeyUp(ev, registeredProviders) {\n    if (isDirectionalKeyCode(ev.which)) {\n      setFocusVisibility(true, ev.target, registeredProviders);\n    }\n  }\n  var FocusRectsProvider = function(props) {\n    var providerRef = props.providerRef, layerRoot = props.layerRoot;\n    var registeredProviders = React__namespace.useState([])[0];\n    var parentContext = React__namespace.useContext(FocusRectsContext);\n    var inheritParentContext = parentContext !== void 0 && !layerRoot;\n    var context2 = React__namespace.useMemo(function() {\n      return inheritParentContext ? void 0 : {\n        providerRef,\n        registeredProviders,\n        registerProvider: function(ref2) {\n          registeredProviders.push(ref2);\n          parentContext === null || parentContext === void 0 ? void 0 : parentContext.registerProvider(ref2);\n        },\n        unregisterProvider: function(ref2) {\n          parentContext === null || parentContext === void 0 ? void 0 : parentContext.unregisterProvider(ref2);\n          var i = registeredProviders.indexOf(ref2);\n          if (i >= 0) {\n            registeredProviders.splice(i, 1);\n          }\n        }\n      };\n    }, [providerRef, registeredProviders, parentContext, inheritParentContext]);\n    React__namespace.useEffect(function() {\n      if (context2) {\n        context2.registerProvider(context2.providerRef);\n        return function() {\n          return context2.unregisterProvider(context2.providerRef);\n        };\n      }\n    }, [context2]);\n    if (context2) {\n      return React__namespace.createElement(FocusRectsContext.Provider, { value: context2 }, props.children);\n    } else {\n      return React__namespace.createElement(React__namespace.Fragment, null, props.children);\n    }\n  };\n  function getItem(key2) {\n    var result = null;\n    try {\n      var win = getWindow();\n      result = win ? win.localStorage.getItem(key2) : null;\n    } catch (e) {\n    }\n    return result;\n  }\n  var _language;\n  var STORAGE_KEY = \"language\";\n  function getLanguage(persistenceType) {\n    if (persistenceType === void 0) {\n      persistenceType = \"sessionStorage\";\n    }\n    if (_language === void 0) {\n      var doc = getDocument();\n      var savedLanguage = persistenceType === \"localStorage\" ? getItem(STORAGE_KEY) : persistenceType === \"sessionStorage\" ? getItem$1(STORAGE_KEY) : void 0;\n      if (savedLanguage) {\n        _language = savedLanguage;\n      }\n      if (_language === void 0 && doc) {\n        _language = doc.documentElement.getAttribute(\"lang\");\n      }\n      if (_language === void 0) {\n        _language = \"en\";\n      }\n    }\n    return _language;\n  }\n  function merge$3(target2) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    for (var _a2 = 0, args_1 = args; _a2 < args_1.length; _a2++) {\n      var arg = args_1[_a2];\n      _merge(target2 || {}, arg);\n    }\n    return target2;\n  }\n  function _merge(target2, source2, circularReferences) {\n    if (circularReferences === void 0) {\n      circularReferences = [];\n    }\n    circularReferences.push(source2);\n    for (var name_1 in source2) {\n      if (source2.hasOwnProperty(name_1)) {\n        if (name_1 !== \"__proto__\" && name_1 !== \"constructor\" && name_1 !== \"prototype\") {\n          var value2 = source2[name_1];\n          if (typeof value2 === \"object\" && value2 !== null && !Array.isArray(value2)) {\n            var isCircularReference = circularReferences.indexOf(value2) > -1;\n            target2[name_1] = isCircularReference ? value2 : _merge(target2[name_1] || {}, value2, circularReferences);\n          } else {\n            target2[name_1] = value2;\n          }\n        }\n      }\n    }\n    circularReferences.pop();\n    return target2;\n  }\n  var isIOS = function() {\n    if (!window || !window.navigator || !window.navigator.userAgent) {\n      return false;\n    }\n    return /iPad|iPhone|iPod/i.test(window.navigator.userAgent);\n  };\n  var tagsToIgnore = [\"TEMPLATE\", \"STYLE\", \"SCRIPT\"];\n  function modalize(target2) {\n    var targetDocument = getDocument(target2);\n    if (!targetDocument) {\n      return function() {\n        return void 0;\n      };\n    }\n    var affectedNodes = [];\n    while (target2 !== targetDocument.body && target2.parentElement) {\n      for (var _i = 0, _a2 = target2.parentElement.children; _i < _a2.length; _i++) {\n        var sibling = _a2[_i];\n        var ariaHidden = sibling.getAttribute(\"aria-hidden\");\n        if (sibling !== target2 && (ariaHidden === null || ariaHidden === void 0 ? void 0 : ariaHidden.toLowerCase()) !== \"true\" && tagsToIgnore.indexOf(sibling.tagName) === -1) {\n          affectedNodes.push([sibling, ariaHidden]);\n        }\n      }\n      target2 = target2.parentElement;\n    }\n    affectedNodes.forEach(function(_a3) {\n      var node = _a3[0];\n      node.setAttribute(\"aria-hidden\", \"true\");\n    });\n    return function() {\n      unmodalize(affectedNodes);\n      affectedNodes = [];\n    };\n  }\n  function unmodalize(affectedNodes) {\n    affectedNodes.forEach(function(_a2) {\n      var node = _a2[0], originalValue = _a2[1];\n      if (originalValue) {\n        node.setAttribute(\"aria-hidden\", originalValue);\n      } else {\n        node.removeAttribute(\"aria-hidden\");\n      }\n    });\n  }\n  var isMacResult;\n  function isMac(reset2) {\n    var _a2;\n    if (typeof isMacResult === \"undefined\" || reset2) {\n      var win = getWindow();\n      var userAgent = (_a2 = win === null || win === void 0 ? void 0 : win.navigator) === null || _a2 === void 0 ? void 0 : _a2.userAgent;\n      isMacResult = !!userAgent && userAgent.indexOf(\"Macintosh\") !== -1;\n    }\n    return !!isMacResult;\n  }\n  function hasHorizontalOverflow(element2) {\n    return element2.clientWidth < element2.scrollWidth;\n  }\n  function hasVerticalOverflow(element2) {\n    return element2.clientHeight < element2.scrollHeight;\n  }\n  function hasOverflow(element2) {\n    return hasHorizontalOverflow(element2) || hasVerticalOverflow(element2);\n  }\n  function createComposedRenderFunction(outer) {\n    var outerMemoizer = createMemoizer(function(inner) {\n      var innerMemoizer = createMemoizer(function(defaultRender) {\n        return function(innerProps) {\n          return inner(innerProps, defaultRender);\n        };\n      });\n      return function(outerProps, defaultRender) {\n        return outer(outerProps, defaultRender ? innerMemoizer(defaultRender) : inner);\n      };\n    });\n    return outerMemoizer;\n  }\n  var memoizer = createMemoizer(createComposedRenderFunction);\n  function composeRenderFunction(outer, inner) {\n    return memoizer(outer)(inner);\n  }\n  var safeRequestAnimationFrame = function(component) {\n    var activeTimeouts;\n    return function(cb) {\n      if (!activeTimeouts) {\n        activeTimeouts = /* @__PURE__ */ new Set();\n        extendComponent(component, {\n          componentWillUnmount: function() {\n            activeTimeouts.forEach(function(id2) {\n              return cancelAnimationFrame(id2);\n            });\n          }\n        });\n      }\n      var timeoutId = requestAnimationFrame(function() {\n        activeTimeouts.delete(timeoutId);\n        cb();\n      });\n      activeTimeouts.add(timeoutId);\n    };\n  };\n  var DefaultFields = [\"theme\", \"styles\"];\n  function styled(Component, baseStyles, getProps, customizable2, pure) {\n    customizable2 = customizable2 || { scope: \"\", fields: void 0 };\n    var scope = customizable2.scope, _a2 = customizable2.fields, fields = _a2 === void 0 ? DefaultFields : _a2;\n    var Wrapped = React__namespace.forwardRef(function(props, forwardedRef) {\n      var styles = React__namespace.useRef(void 0);\n      var settings = useCustomizationSettings(fields, scope);\n      var customizedStyles = settings.styles;\n      settings.dir;\n      var rest = __rest(settings, [\"styles\", \"dir\"]);\n      var additionalProps = getProps ? getProps(props) : void 0;\n      var useStyled = useMergeStylesHooks().useStyled;\n      var cache2 = styles.current && styles.current.__cachedInputs__ || [];\n      var propStyles = props.styles;\n      if (!styles.current || customizedStyles !== cache2[1] || propStyles !== cache2[2]) {\n        var concatenatedStyles = function(styleProps) {\n          return concatStyleSetsWithProps(styleProps, baseStyles, customizedStyles, propStyles);\n        };\n        concatenatedStyles.__cachedInputs__ = [\n          baseStyles,\n          customizedStyles,\n          propStyles\n        ];\n        concatenatedStyles.__noStyleOverride__ = !customizedStyles && !propStyles;\n        styles.current = concatenatedStyles;\n      }\n      styles.current.__shadowConfig__ = useStyled(scope);\n      return React__namespace.createElement(Component, __assign$1({ ref: forwardedRef }, rest, additionalProps, props, { styles: styles.current }));\n    });\n    Wrapped.displayName = \"Styled\".concat(Component.displayName || Component.name);\n    var pureComponent = pure ? React__namespace.memo(Wrapped) : Wrapped;\n    if (Wrapped.displayName) {\n      pureComponent.displayName = Wrapped.displayName;\n    }\n    return pureComponent;\n  }\n  function warnControlledUsage(params2) {\n  }\n  var isIE11 = function() {\n    var _a2;\n    var win = getWindow();\n    if (!((_a2 = win === null || win === void 0 ? void 0 : win.navigator) === null || _a2 === void 0 ? void 0 : _a2.userAgent)) {\n      return false;\n    }\n    return win.navigator.userAgent.indexOf(\"rv:11.0\") > -1;\n  };\n  function getPropsWithDefaults(defaultProps, propsWithoutDefaults) {\n    var props = __assign$1({}, propsWithoutDefaults);\n    for (var _i = 0, _a2 = Object.keys(defaultProps); _i < _a2.length; _i++) {\n      var key2 = _a2[_i];\n      if (props[key2] === void 0) {\n        props[key2] = defaultProps[key2];\n      }\n    }\n    return props;\n  }\n  var createResolver = function(local) {\n    return function(newValue) {\n      for (var _i = 0, _a2 = local.refs; _i < _a2.length; _i++) {\n        var ref2 = _a2[_i];\n        if (typeof ref2 === \"function\") {\n          ref2(newValue);\n        } else if (ref2) {\n          ref2.current = newValue;\n        }\n      }\n    };\n  };\n  var createMergedRef = function(value2) {\n    var local = {\n      refs: []\n    };\n    return function() {\n      var newRefs = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        newRefs[_i] = arguments[_i];\n      }\n      if (!local.resolver || !arraysEqual(local.refs, newRefs)) {\n        local.resolver = createResolver(local);\n      }\n      local.refs = newRefs;\n      return local.resolver;\n    };\n  };\n  var useIsomorphicLayoutEffect = canUseDOM() ? React__namespace.useLayoutEffect : React__namespace.useEffect;\n  var IconType;\n  (function(IconType2) {\n    IconType2[IconType2[\"default\"] = 0] = \"default\";\n    IconType2[IconType2[\"image\"] = 1] = \"image\";\n    IconType2[IconType2[\"Default\"] = 1e5] = \"Default\";\n    IconType2[IconType2[\"Image\"] = 100001] = \"Image\";\n  })(IconType || (IconType = {}));\n  var ImageFit;\n  (function(ImageFit2) {\n    ImageFit2[ImageFit2[\"center\"] = 0] = \"center\";\n    ImageFit2[ImageFit2[\"contain\"] = 1] = \"contain\";\n    ImageFit2[ImageFit2[\"cover\"] = 2] = \"cover\";\n    ImageFit2[ImageFit2[\"none\"] = 3] = \"none\";\n    ImageFit2[ImageFit2[\"centerCover\"] = 4] = \"centerCover\";\n    ImageFit2[ImageFit2[\"centerContain\"] = 5] = \"centerContain\";\n  })(ImageFit || (ImageFit = {}));\n  var ImageCoverStyle;\n  (function(ImageCoverStyle2) {\n    ImageCoverStyle2[ImageCoverStyle2[\"landscape\"] = 0] = \"landscape\";\n    ImageCoverStyle2[ImageCoverStyle2[\"portrait\"] = 1] = \"portrait\";\n  })(ImageCoverStyle || (ImageCoverStyle = {}));\n  var ImageLoadState;\n  (function(ImageLoadState2) {\n    ImageLoadState2[ImageLoadState2[\"notLoaded\"] = 0] = \"notLoaded\";\n    ImageLoadState2[ImageLoadState2[\"loaded\"] = 1] = \"loaded\";\n    ImageLoadState2[ImageLoadState2[\"error\"] = 2] = \"error\";\n    ImageLoadState2[ImageLoadState2[\"errorLoaded\"] = 3] = \"errorLoaded\";\n  })(ImageLoadState || (ImageLoadState = {}));\n  function useAsync() {\n    var asyncRef = React__namespace.useRef(void 0);\n    if (!asyncRef.current) {\n      asyncRef.current = new Async();\n    }\n    React__namespace.useEffect(function() {\n      return function() {\n        var _a2;\n        (_a2 = asyncRef.current) === null || _a2 === void 0 ? void 0 : _a2.dispose();\n        asyncRef.current = void 0;\n      };\n    }, []);\n    return asyncRef.current;\n  }\n  function useConst(initialValue) {\n    var ref2 = React__namespace.useRef(void 0);\n    if (ref2.current === void 0) {\n      ref2.current = {\n        value: typeof initialValue === \"function\" ? initialValue() : initialValue\n      };\n    }\n    return ref2.current.value;\n  }\n  function useBoolean(initialState) {\n    var _a2 = React__namespace.useState(initialState), value2 = _a2[0], setValue = _a2[1];\n    var setTrue = useConst(function() {\n      return function() {\n        setValue(true);\n      };\n    });\n    var setFalse = useConst(function() {\n      return function() {\n        setValue(false);\n      };\n    });\n    var toggle = useConst(function() {\n      return function() {\n        setValue(function(currentValue) {\n          return !currentValue;\n        });\n      };\n    });\n    return [value2, { setTrue, setFalse, toggle }];\n  }\n  function useControllableValue(controlledValue, defaultUncontrolledValue, onChange) {\n    var _a2 = React__namespace.useState(defaultUncontrolledValue), value2 = _a2[0], setValue = _a2[1];\n    var isControlled2 = useConst(controlledValue !== void 0);\n    var currentValue = isControlled2 ? controlledValue : value2;\n    var valueRef = React__namespace.useRef(currentValue);\n    var onChangeRef = React__namespace.useRef(onChange);\n    React__namespace.useEffect(function() {\n      valueRef.current = currentValue;\n      onChangeRef.current = onChange;\n    });\n    var setValueOrCallOnChange = useConst(function() {\n      return function(update2, ev) {\n        var newValue = typeof update2 === \"function\" ? update2(valueRef.current) : update2;\n        if (onChangeRef.current) {\n          onChangeRef.current(ev, newValue);\n        }\n        if (!isControlled2) {\n          setValue(newValue);\n        }\n      };\n    });\n    return [currentValue, setValueOrCallOnChange];\n  }\n  function useEventCallback(fn2) {\n    var callbackRef = React__namespace.useRef(function() {\n      throw new Error(\"Cannot call an event handler while rendering\");\n    });\n    useIsomorphicLayoutEffect(function() {\n      callbackRef.current = fn2;\n    }, [fn2]);\n    return useConst(function() {\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        var callback = callbackRef.current;\n        return callback.apply(void 0, args);\n      };\n    });\n  }\n  function useId(prefix, providedId) {\n    var ref2 = React__namespace.useRef(providedId);\n    if (!ref2.current) {\n      ref2.current = getId(prefix);\n    }\n    return ref2.current;\n  }\n  function useMergedRefs() {\n    var refs = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      refs[_i] = arguments[_i];\n    }\n    var mergedCallback = React__namespace.useCallback(function(value2) {\n      mergedCallback.current = value2;\n      for (var _i2 = 0, refs_1 = refs; _i2 < refs_1.length; _i2++) {\n        var ref2 = refs_1[_i2];\n        if (typeof ref2 === \"function\") {\n          ref2(value2);\n        } else if (ref2) {\n          ref2.current = value2;\n        }\n      }\n    }, __spreadArray([], refs, true));\n    return mergedCallback;\n  }\n  function useOnEvent(element2, eventName, callback, useCapture) {\n    var callbackRef = React__namespace.useRef(callback);\n    callbackRef.current = callback;\n    React__namespace.useEffect(function() {\n      var actualElement = element2 && \"current\" in element2 ? element2.current : element2;\n      if (!actualElement || !actualElement.addEventListener) {\n        return;\n      }\n      var dispose = on$1(actualElement, eventName, function(ev) {\n        return callbackRef.current(ev);\n      }, useCapture);\n      return dispose;\n    }, [element2, eventName, useCapture]);\n  }\n  function usePrevious(value2) {\n    var ref2 = React__namespace.useRef(void 0);\n    React__namespace.useEffect(function() {\n      ref2.current = value2;\n    });\n    return ref2.current;\n  }\n  var useSetTimeout = function() {\n    var timeoutIds = useConst({});\n    React__namespace.useEffect(\n      function() {\n        return function() {\n          for (var _i = 0, _a2 = Object.keys(timeoutIds); _i < _a2.length; _i++) {\n            var id2 = _a2[_i];\n            clearTimeout(id2);\n          }\n        };\n      },\n      // useConst ensures this will never change, but react-hooks/exhaustive-deps doesn't know that\n      [timeoutIds]\n    );\n    return useConst({\n      setTimeout: function(func, duration) {\n        var id2 = setTimeout(func, duration);\n        timeoutIds[id2] = 1;\n        return id2;\n      },\n      clearTimeout: function(id2) {\n        delete timeoutIds[id2];\n        clearTimeout(id2);\n      }\n    });\n  };\n  function useTarget(target2, hostElement) {\n    var _a2, _b2, _c2;\n    var previousTargetProp = React__namespace.useRef(void 0);\n    var targetRef = React__namespace.useRef(null);\n    var targetWindow = useWindow();\n    if (!target2 || target2 !== previousTargetProp.current || typeof target2 === \"string\") {\n      var currentElement = hostElement === null || hostElement === void 0 ? void 0 : hostElement.current;\n      if (target2) {\n        if (typeof target2 === \"string\") {\n          if ((_a2 = currentElement === null || currentElement === void 0 ? void 0 : currentElement.getRootNode()) === null || _a2 === void 0 ? void 0 : _a2.host) {\n            targetRef.current = (_c2 = (_b2 = currentElement === null || currentElement === void 0 ? void 0 : currentElement.getRootNode()) === null || _b2 === void 0 ? void 0 : _b2.querySelector(target2)) !== null && _c2 !== void 0 ? _c2 : null;\n          } else {\n            var currentDoc = getDocument(currentElement);\n            targetRef.current = currentDoc ? currentDoc.querySelector(target2) : null;\n          }\n        } else if (\"stopPropagation\" in target2) {\n          targetRef.current = target2;\n        } else if (\"getBoundingClientRect\" in target2) {\n          targetRef.current = target2;\n        } else if (\"current\" in target2) {\n          targetRef.current = target2.current;\n        } else {\n          targetRef.current = target2;\n        }\n      }\n      previousTargetProp.current = target2;\n    }\n    return [targetRef, targetWindow];\n  }\n  var useUnmount = function(callback) {\n    var unmountRef = React__namespace.useRef(callback);\n    unmountRef.current = callback;\n    React__namespace.useEffect(function() {\n      return function() {\n        var _a2;\n        (_a2 = unmountRef.current) === null || _a2 === void 0 ? void 0 : _a2.call(unmountRef);\n      };\n    }, []);\n  };\n  var getClassNames$r = classNamesFunction();\n  var SVG_REGEX = /\\.svg$/i;\n  var KEY_PREFIX = \"fabricImage\";\n  function useLoadState(props, imageElement) {\n    var onLoadingStateChange = props.onLoadingStateChange, onLoad = props.onLoad, onError = props.onError, src = props.src;\n    var _a2 = React__namespace.useState(ImageLoadState.notLoaded), loadState = _a2[0], setLoadState = _a2[1];\n    useIsomorphicLayoutEffect(function() {\n      setLoadState(ImageLoadState.notLoaded);\n    }, [src]);\n    React__namespace.useEffect(function() {\n      if (loadState === ImageLoadState.notLoaded) {\n        var isLoaded = imageElement.current ? src && imageElement.current.naturalWidth > 0 && imageElement.current.naturalHeight > 0 || imageElement.current.complete && SVG_REGEX.test(src) : false;\n        if (isLoaded) {\n          setLoadState(ImageLoadState.loaded);\n        }\n      }\n    });\n    React__namespace.useEffect(function() {\n      onLoadingStateChange === null || onLoadingStateChange === void 0 ? void 0 : onLoadingStateChange(loadState);\n    }, [loadState]);\n    var onImageLoaded = React__namespace.useCallback(function(ev) {\n      onLoad === null || onLoad === void 0 ? void 0 : onLoad(ev);\n      if (src) {\n        setLoadState(ImageLoadState.loaded);\n      }\n    }, [src, onLoad]);\n    var onImageError = React__namespace.useCallback(function(ev) {\n      onError === null || onError === void 0 ? void 0 : onError(ev);\n      setLoadState(ImageLoadState.error);\n    }, [onError]);\n    return [loadState, onImageLoaded, onImageError];\n  }\n  var ImageBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var frameElement = React__namespace.useRef(void 0);\n    var imageElement = React__namespace.useRef(void 0);\n    var _a2 = useLoadState(props, imageElement), loadState = _a2[0], onImageLoaded = _a2[1], onImageError = _a2[2];\n    var imageProps = getNativeProps(props, imgProperties, [\n      \"width\",\n      \"height\"\n    ]);\n    var src = props.src, alt = props.alt, width2 = props.width, height2 = props.height, _b2 = props.shouldFadeIn, shouldFadeIn = _b2 === void 0 ? true : _b2, shouldStartVisible = props.shouldStartVisible, className2 = props.className, imageFit = props.imageFit, role = props.role, maximizeFrame = props.maximizeFrame, styles = props.styles, theme = props.theme, loading = props.loading;\n    var coverStyle = useCoverStyle(props, loadState, imageElement, frameElement);\n    var classNames2 = getClassNames$r(styles, {\n      theme,\n      className: className2,\n      width: width2,\n      height: height2,\n      maximizeFrame,\n      shouldFadeIn,\n      shouldStartVisible,\n      isLoaded: loadState === ImageLoadState.loaded || loadState === ImageLoadState.notLoaded && props.shouldStartVisible,\n      isLandscape: coverStyle === ImageCoverStyle.landscape,\n      isCenter: imageFit === ImageFit.center,\n      isCenterContain: imageFit === ImageFit.centerContain,\n      isCenterCover: imageFit === ImageFit.centerCover,\n      isContain: imageFit === ImageFit.contain,\n      isCover: imageFit === ImageFit.cover,\n      isNone: imageFit === ImageFit.none,\n      isError: loadState === ImageLoadState.error,\n      isNotImageFit: imageFit === void 0\n    });\n    return React__namespace.createElement(\n      \"div\",\n      { className: classNames2.root, style: { width: width2, height: height2 }, ref: frameElement },\n      React__namespace.createElement(\"img\", __assign$1({}, imageProps, { onLoad: onImageLoaded, onError: onImageError, key: KEY_PREFIX + props.src || \"\", className: classNames2.image, ref: useMergedRefs(imageElement, forwardedRef), src, alt, role, loading }))\n    );\n  });\n  ImageBase.displayName = \"ImageBase\";\n  function useCoverStyle(props, loadState, imageElement, frameElement) {\n    var previousLoadState = React__namespace.useRef(loadState);\n    var coverStyle = React__namespace.useRef(void 0);\n    if (coverStyle === void 0 || previousLoadState.current === ImageLoadState.notLoaded && loadState === ImageLoadState.loaded) {\n      coverStyle.current = computeCoverStyle(props, loadState, imageElement, frameElement);\n    }\n    previousLoadState.current = loadState;\n    return coverStyle.current;\n  }\n  function computeCoverStyle(props, loadState, imageElement, frameElement) {\n    var imageFit = props.imageFit, width2 = props.width, height2 = props.height;\n    if (props.coverStyle !== void 0) {\n      return props.coverStyle;\n    } else if (loadState === ImageLoadState.loaded && (imageFit === ImageFit.cover || imageFit === ImageFit.contain || imageFit === ImageFit.centerContain || imageFit === ImageFit.centerCover) && imageElement.current && frameElement.current) {\n      var desiredRatio = void 0;\n      if (typeof width2 === \"number\" && typeof height2 === \"number\" && imageFit !== ImageFit.centerContain && imageFit !== ImageFit.centerCover) {\n        desiredRatio = width2 / height2;\n      } else {\n        desiredRatio = frameElement.current.clientWidth / frameElement.current.clientHeight;\n      }\n      var naturalRatio = imageElement.current.naturalWidth / imageElement.current.naturalHeight;\n      if (naturalRatio > desiredRatio) {\n        return ImageCoverStyle.landscape;\n      }\n    }\n    return ImageCoverStyle.portrait;\n  }\n  function buildClassMap(styles) {\n    var classes = {};\n    var _loop_1 = function(styleName2) {\n      if (styles.hasOwnProperty(styleName2)) {\n        var className_1;\n        Object.defineProperty(classes, styleName2, {\n          get: function() {\n            if (className_1 === void 0) {\n              className_1 = mergeStyles(styles[styleName2]).toString();\n            }\n            return className_1;\n          },\n          enumerable: true,\n          configurable: true\n        });\n      }\n    };\n    for (var styleName in styles) {\n      _loop_1(styleName);\n    }\n    return classes;\n  }\n  var ICON_SETTING_NAME = \"icons\";\n  var _iconSettings = GlobalSettings.getValue(ICON_SETTING_NAME, {\n    __options: {\n      disableWarnings: false,\n      warnOnMissingIcons: true\n    },\n    __remapped: {}\n  });\n  var stylesheet = Stylesheet.getInstance();\n  if (stylesheet && stylesheet.onReset) {\n    stylesheet.onReset(function() {\n      for (var name_1 in _iconSettings) {\n        if (_iconSettings.hasOwnProperty(name_1) && !!_iconSettings[name_1].subset) {\n          _iconSettings[name_1].subset.className = void 0;\n        }\n      }\n    });\n  }\n  var normalizeIconName = function(name) {\n    return name.toLowerCase();\n  };\n  function registerIcons$1(iconSubset, options2) {\n    var subset = __assign$1(__assign$1({}, iconSubset), { isRegistered: false, className: void 0 });\n    var icons = iconSubset.icons;\n    options2 = options2 ? __assign$1(__assign$1({}, _iconSettings.__options), options2) : _iconSettings.__options;\n    for (var iconName in icons) {\n      if (icons.hasOwnProperty(iconName)) {\n        var code = icons[iconName];\n        var normalizedIconName = normalizeIconName(iconName);\n        if (_iconSettings[normalizedIconName]) {\n          _warnDuplicateIcon(iconName);\n        } else {\n          _iconSettings[normalizedIconName] = {\n            code,\n            subset\n          };\n        }\n      }\n    }\n  }\n  function unregisterIcons$1(iconNames) {\n    var options2 = _iconSettings.__options;\n    var _loop_1 = function(iconName2) {\n      var normalizedIconName = normalizeIconName(iconName2);\n      if (_iconSettings[normalizedIconName]) {\n        delete _iconSettings[normalizedIconName];\n      } else {\n        if (!options2.disableWarnings) {\n          warn$1('The icon \"'.concat(iconName2, '\" tried to unregister but was not registered.'));\n        }\n      }\n      if (_iconSettings.__remapped[normalizedIconName]) {\n        delete _iconSettings.__remapped[normalizedIconName];\n      }\n      Object.keys(_iconSettings.__remapped).forEach(function(key2) {\n        if (_iconSettings.__remapped[key2] === normalizedIconName) {\n          delete _iconSettings.__remapped[key2];\n        }\n      });\n    };\n    for (var _i = 0, iconNames_1 = iconNames; _i < iconNames_1.length; _i++) {\n      var iconName = iconNames_1[_i];\n      _loop_1(iconName);\n    }\n  }\n  function getIcon(name) {\n    var icon = void 0;\n    var options2 = _iconSettings.__options;\n    name = name ? normalizeIconName(name) : \"\";\n    name = _iconSettings.__remapped[name] || name;\n    if (name) {\n      icon = _iconSettings[name];\n      if (icon) {\n        var subset = icon.subset;\n        if (subset && subset.fontFace) {\n          if (!subset.isRegistered) {\n            fontFace(subset.fontFace);\n            subset.isRegistered = true;\n          }\n          if (!subset.className) {\n            subset.className = mergeStyles(subset.style, {\n              fontFamily: subset.fontFace.fontFamily,\n              fontWeight: subset.fontFace.fontWeight || \"normal\",\n              fontStyle: subset.fontFace.fontStyle || \"normal\"\n            });\n          }\n        }\n      } else {\n        if (!options2.disableWarnings && options2.warnOnMissingIcons) {\n          warn$1('The icon \"'.concat(name, '\" was used but not registered. See https://github.com/microsoft/fluentui/wiki/Using-icons for more information.'));\n        }\n      }\n    }\n    return icon;\n  }\n  var _missingIcons = [];\n  var _missingIconsTimer = void 0;\n  function _warnDuplicateIcon(iconName) {\n    var options2 = _iconSettings.__options;\n    var warningDelay = 2e3;\n    var maxIconsInMessage = 10;\n    if (!options2.disableWarnings) {\n      _missingIcons.push(iconName);\n      if (_missingIconsTimer === void 0) {\n        _missingIconsTimer = setTimeout(function() {\n          warn$1(\"Some icons were re-registered. Applications should only call registerIcons for any given icon once. Redefining what an icon is may have unintended consequences. Duplicates include: \\n\" + _missingIcons.slice(0, maxIconsInMessage).join(\", \") + (_missingIcons.length > maxIconsInMessage ? \" (+ \".concat(_missingIcons.length - maxIconsInMessage, \" more)\") : \"\"));\n          _missingIconsTimer = void 0;\n          _missingIcons = [];\n        }, warningDelay);\n      }\n    }\n  }\n  function makeSemanticColors(p, e, s2, isInverted, depComments) {\n    if (depComments === void 0) {\n      depComments = false;\n    }\n    var semanticColors = __assign$1({\n      primaryButtonBorder: \"transparent\",\n      errorText: !isInverted ? \"#a4262c\" : \"#F1707B\",\n      messageText: !isInverted ? \"#323130\" : \"#F3F2F1\",\n      messageLink: !isInverted ? \"#005A9E\" : \"#6CB8F6\",\n      messageLinkHovered: !isInverted ? \"#004578\" : \"#82C7FF\",\n      infoIcon: !isInverted ? \"#605e5c\" : \"#C8C6C4\",\n      errorIcon: !isInverted ? \"#A80000\" : \"#F1707B\",\n      blockingIcon: !isInverted ? \"#FDE7E9\" : \"#442726\",\n      warningIcon: !isInverted ? \"#797775\" : \"#C8C6C4\",\n      severeWarningIcon: !isInverted ? \"#D83B01\" : \"#FCE100\",\n      successIcon: !isInverted ? \"#107C10\" : \"#92C353\",\n      infoBackground: !isInverted ? \"#f3f2f1\" : \"#323130\",\n      errorBackground: !isInverted ? \"#FDE7E9\" : \"#442726\",\n      blockingBackground: !isInverted ? \"#FDE7E9\" : \"#442726\",\n      warningBackground: !isInverted ? \"#FFF4CE\" : \"#433519\",\n      severeWarningBackground: !isInverted ? \"#FED9CC\" : \"#4F2A0F\",\n      successBackground: !isInverted ? \"#DFF6DD\" : \"#393D1B\",\n      // deprecated\n      warningHighlight: !isInverted ? \"#ffb900\" : \"#fff100\",\n      successText: !isInverted ? \"#107C10\" : \"#92c353\"\n    }, s2);\n    var fullSemanticColors = getSemanticColors(p, e, semanticColors, isInverted);\n    return _fixDeprecatedSlots(fullSemanticColors, depComments);\n  }\n  function getSemanticColors(p, e, s2, isInverted, depComments) {\n    var result = {};\n    var _a2 = p || {}, white = _a2.white, black = _a2.black, themePrimary = _a2.themePrimary, themeDark = _a2.themeDark, themeDarker = _a2.themeDarker, themeDarkAlt = _a2.themeDarkAlt, themeLighter = _a2.themeLighter, neutralLight = _a2.neutralLight, neutralLighter = _a2.neutralLighter, neutralDark = _a2.neutralDark, neutralQuaternary = _a2.neutralQuaternary, neutralQuaternaryAlt = _a2.neutralQuaternaryAlt, neutralPrimary = _a2.neutralPrimary, neutralSecondary = _a2.neutralSecondary, neutralSecondaryAlt = _a2.neutralSecondaryAlt, neutralTertiary = _a2.neutralTertiary, neutralTertiaryAlt = _a2.neutralTertiaryAlt, neutralLighterAlt = _a2.neutralLighterAlt, accent = _a2.accent;\n    if (white) {\n      result.bodyBackground = white;\n      result.bodyFrameBackground = white;\n      result.accentButtonText = white;\n      result.buttonBackground = white;\n      result.primaryButtonText = white;\n      result.primaryButtonTextHovered = white;\n      result.primaryButtonTextPressed = white;\n      result.inputBackground = white;\n      result.inputForegroundChecked = white;\n      result.listBackground = white;\n      result.menuBackground = white;\n      result.cardStandoutBackground = white;\n    }\n    if (black) {\n      result.bodyTextChecked = black;\n      result.buttonTextCheckedHovered = black;\n    }\n    if (themePrimary) {\n      result.link = themePrimary;\n      result.primaryButtonBackground = themePrimary;\n      result.inputBackgroundChecked = themePrimary;\n      result.inputIcon = themePrimary;\n      result.inputFocusBorderAlt = themePrimary;\n      result.menuIcon = themePrimary;\n      result.menuHeader = themePrimary;\n      result.accentButtonBackground = themePrimary;\n    }\n    if (themeDark) {\n      result.primaryButtonBackgroundPressed = themeDark;\n      result.inputBackgroundCheckedHovered = themeDark;\n      result.inputIconHovered = themeDark;\n    }\n    if (themeDarker) {\n      result.linkHovered = themeDarker;\n    }\n    if (themeDarkAlt) {\n      result.primaryButtonBackgroundHovered = themeDarkAlt;\n    }\n    if (themeLighter) {\n      result.inputPlaceholderBackgroundChecked = themeLighter;\n    }\n    if (neutralLight) {\n      result.bodyBackgroundChecked = neutralLight;\n      result.bodyFrameDivider = neutralLight;\n      result.bodyDivider = neutralLight;\n      result.variantBorder = neutralLight;\n      result.buttonBackgroundCheckedHovered = neutralLight;\n      result.buttonBackgroundPressed = neutralLight;\n      result.listItemBackgroundChecked = neutralLight;\n      result.listHeaderBackgroundPressed = neutralLight;\n      result.menuItemBackgroundPressed = neutralLight;\n      result.menuItemBackgroundChecked = neutralLight;\n    }\n    if (neutralLighter) {\n      result.bodyBackgroundHovered = neutralLighter;\n      result.buttonBackgroundHovered = neutralLighter;\n      result.buttonBackgroundDisabled = neutralLighter;\n      result.buttonBorderDisabled = neutralLighter;\n      result.primaryButtonBackgroundDisabled = neutralLighter;\n      result.disabledBackground = neutralLighter;\n      result.listItemBackgroundHovered = neutralLighter;\n      result.listHeaderBackgroundHovered = neutralLighter;\n      result.menuItemBackgroundHovered = neutralLighter;\n    }\n    if (neutralQuaternary) {\n      result.primaryButtonTextDisabled = neutralQuaternary;\n      result.disabledSubtext = neutralQuaternary;\n    }\n    if (neutralQuaternaryAlt) {\n      result.listItemBackgroundCheckedHovered = neutralQuaternaryAlt;\n    }\n    if (neutralTertiary) {\n      result.disabledBodyText = neutralTertiary;\n      result.variantBorderHovered = (s2 === null || s2 === void 0 ? void 0 : s2.variantBorderHovered) || neutralTertiary;\n      result.buttonTextDisabled = neutralTertiary;\n      result.inputIconDisabled = neutralTertiary;\n      result.disabledText = neutralTertiary;\n    }\n    if (neutralPrimary) {\n      result.bodyText = neutralPrimary;\n      result.actionLink = neutralPrimary;\n      result.buttonText = neutralPrimary;\n      result.inputBorderHovered = neutralPrimary;\n      result.inputText = neutralPrimary;\n      result.listText = neutralPrimary;\n      result.menuItemText = neutralPrimary;\n    }\n    if (neutralLighterAlt) {\n      result.bodyStandoutBackground = neutralLighterAlt;\n      result.defaultStateBackground = neutralLighterAlt;\n    }\n    if (neutralDark) {\n      result.actionLinkHovered = neutralDark;\n      result.buttonTextHovered = neutralDark;\n      result.buttonTextChecked = neutralDark;\n      result.buttonTextPressed = neutralDark;\n      result.inputTextHovered = neutralDark;\n      result.menuItemTextHovered = neutralDark;\n    }\n    if (neutralSecondary) {\n      result.bodySubtext = neutralSecondary;\n      result.focusBorder = neutralSecondary;\n      result.inputBorder = neutralSecondary;\n      result.smallInputBorder = neutralSecondary;\n      result.inputPlaceholderText = neutralSecondary;\n    }\n    if (neutralSecondaryAlt) {\n      result.buttonBorder = neutralSecondaryAlt;\n    }\n    if (neutralTertiaryAlt) {\n      result.disabledBodySubtext = neutralTertiaryAlt;\n      result.disabledBorder = neutralTertiaryAlt;\n      result.buttonBackgroundChecked = neutralTertiaryAlt;\n      result.menuDivider = neutralTertiaryAlt;\n    }\n    if (accent) {\n      result.accentButtonBackground = accent;\n    }\n    if (e === null || e === void 0 ? void 0 : e.elevation4) {\n      result.cardShadow = e.elevation4;\n    }\n    if (!isInverted && (e === null || e === void 0 ? void 0 : e.elevation8)) {\n      result.cardShadowHovered = e.elevation8;\n    } else if (result.variantBorderHovered) {\n      result.cardShadowHovered = \"0 0 1px \" + result.variantBorderHovered;\n    }\n    result = __assign$1(__assign$1({}, result), s2);\n    return result;\n  }\n  function _fixDeprecatedSlots(s2, depComments) {\n    var dep = \"\";\n    if (depComments === true) {\n      dep = \" /* @deprecated */\";\n    }\n    s2.listTextColor = s2.listText + dep;\n    s2.menuItemBackgroundChecked += dep;\n    s2.warningHighlight += dep;\n    s2.warningText = s2.messageText + dep;\n    s2.successText += dep;\n    return s2;\n  }\n  function mergeThemes(theme, partialTheme) {\n    var _a2, _b2, _c2;\n    if (partialTheme === void 0) {\n      partialTheme = {};\n    }\n    var mergedTheme = merge$3({}, theme, partialTheme, {\n      semanticColors: getSemanticColors(partialTheme.palette, partialTheme.effects, partialTheme.semanticColors, partialTheme.isInverted === void 0 ? theme.isInverted : partialTheme.isInverted)\n    });\n    if (((_a2 = partialTheme.palette) === null || _a2 === void 0 ? void 0 : _a2.themePrimary) && !((_b2 = partialTheme.palette) === null || _b2 === void 0 ? void 0 : _b2.accent)) {\n      mergedTheme.palette.accent = partialTheme.palette.themePrimary;\n    }\n    if (partialTheme.defaultFontStyle) {\n      for (var _i = 0, _d2 = Object.keys(mergedTheme.fonts); _i < _d2.length; _i++) {\n        var fontStyle = _d2[_i];\n        mergedTheme.fonts[fontStyle] = merge$3(mergedTheme.fonts[fontStyle], partialTheme.defaultFontStyle, (_c2 = partialTheme === null || partialTheme === void 0 ? void 0 : partialTheme.fonts) === null || _c2 === void 0 ? void 0 : _c2[fontStyle]);\n      }\n    }\n    return mergedTheme;\n  }\n  var DefaultPalette = {\n    themeDarker: \"#004578\",\n    themeDark: \"#005a9e\",\n    themeDarkAlt: \"#106ebe\",\n    themePrimary: \"#0078d4\",\n    themeSecondary: \"#2b88d8\",\n    themeTertiary: \"#71afe5\",\n    themeLight: \"#c7e0f4\",\n    themeLighter: \"#deecf9\",\n    themeLighterAlt: \"#eff6fc\",\n    black: \"#000000\",\n    blackTranslucent40: \"rgba(0,0,0,.4)\",\n    neutralDark: \"#201f1e\",\n    neutralPrimary: \"#323130\",\n    neutralPrimaryAlt: \"#3b3a39\",\n    neutralSecondary: \"#605e5c\",\n    neutralSecondaryAlt: \"#8a8886\",\n    neutralTertiary: \"#a19f9d\",\n    neutralTertiaryAlt: \"#c8c6c4\",\n    neutralQuaternary: \"#d2d0ce\",\n    neutralQuaternaryAlt: \"#e1dfdd\",\n    neutralLight: \"#edebe9\",\n    neutralLighter: \"#f3f2f1\",\n    neutralLighterAlt: \"#faf9f8\",\n    accent: \"#0078d4\",\n    white: \"#ffffff\",\n    whiteTranslucent40: \"rgba(255,255,255,.4)\",\n    yellowDark: \"#d29200\",\n    yellow: \"#ffb900\",\n    yellowLight: \"#fff100\",\n    orange: \"#d83b01\",\n    orangeLight: \"#ea4300\",\n    orangeLighter: \"#ff8c00\",\n    redDark: \"#a4262c\",\n    red: \"#e81123\",\n    magentaDark: \"#5c005c\",\n    magenta: \"#b4009e\",\n    magentaLight: \"#e3008c\",\n    purpleDark: \"#32145a\",\n    purple: \"#5c2d91\",\n    purpleLight: \"#b4a0ff\",\n    blueDark: \"#002050\",\n    blueMid: \"#00188f\",\n    blue: \"#0078d4\",\n    blueLight: \"#00bcf2\",\n    tealDark: \"#004b50\",\n    teal: \"#008272\",\n    tealLight: \"#00b294\",\n    greenDark: \"#004b1c\",\n    green: \"#107c10\",\n    greenLight: \"#bad80a\"\n  };\n  var Depths;\n  (function(Depths2) {\n    Depths2.depth0 = \"0 0 0 0 transparent\";\n    Depths2.depth4 = \"0 1.6px 3.6px 0 rgba(0, 0, 0, 0.132), 0 0.3px 0.9px 0 rgba(0, 0, 0, 0.108)\";\n    Depths2.depth8 = \"0 3.2px 7.2px 0 rgba(0, 0, 0, 0.132), 0 0.6px 1.8px 0 rgba(0, 0, 0, 0.108)\";\n    Depths2.depth16 = \"0 6.4px 14.4px 0 rgba(0, 0, 0, 0.132), 0 1.2px 3.6px 0 rgba(0, 0, 0, 0.108)\";\n    Depths2.depth64 = \"0 25.6px 57.6px 0 rgba(0, 0, 0, 0.22), 0 4.8px 14.4px 0 rgba(0, 0, 0, 0.18)\";\n  })(Depths || (Depths = {}));\n  var DefaultEffects = {\n    elevation4: Depths.depth4,\n    elevation8: Depths.depth8,\n    elevation16: Depths.depth16,\n    elevation64: Depths.depth64,\n    roundedCorner2: \"2px\",\n    roundedCorner4: \"4px\",\n    roundedCorner6: \"6px\"\n  };\n  var DefaultSpacing = {\n    s2: \"4px\",\n    s1: \"8px\",\n    m: \"16px\",\n    l1: \"20px\",\n    l2: \"32px\"\n  };\n  var EASING_FUNCTION_1 = \"cubic-bezier(.1,.9,.2,1)\";\n  var EASING_FUNCTION_2 = \"cubic-bezier(.1,.25,.75,.9)\";\n  var DURATION_1 = \"0.167s\";\n  var DURATION_2 = \"0.267s\";\n  var DURATION_3 = \"0.367s\";\n  var DURATION_4 = \"0.467s\";\n  var FADE_IN = keyframes({\n    from: { opacity: 0 },\n    to: { opacity: 1 }\n  });\n  var FADE_OUT = keyframes({\n    from: { opacity: 1 },\n    to: { opacity: 0, visibility: \"hidden\" }\n  });\n  var SLIDE_RIGHT_IN10 = _createSlideInX(-10);\n  var SLIDE_RIGHT_IN20 = _createSlideInX(-20);\n  var SLIDE_RIGHT_IN40 = _createSlideInX(-40);\n  var SLIDE_RIGHT_IN400 = _createSlideInX(-400);\n  var SLIDE_LEFT_IN10 = _createSlideInX(10);\n  var SLIDE_LEFT_IN20 = _createSlideInX(20);\n  var SLIDE_LEFT_IN40 = _createSlideInX(40);\n  var SLIDE_LEFT_IN400 = _createSlideInX(400);\n  var SLIDE_UP_IN10 = _createSlideInY(10);\n  var SLIDE_UP_IN20 = _createSlideInY(20);\n  var SLIDE_DOWN_IN10 = _createSlideInY(-10);\n  var SLIDE_DOWN_IN20 = _createSlideInY(-20);\n  var SLIDE_RIGHT_OUT10 = _createSlideOutX(10);\n  var SLIDE_RIGHT_OUT20 = _createSlideOutX(20);\n  var SLIDE_RIGHT_OUT40 = _createSlideOutX(40);\n  var SLIDE_RIGHT_OUT400 = _createSlideOutX(400);\n  var SLIDE_LEFT_OUT10 = _createSlideOutX(-10);\n  var SLIDE_LEFT_OUT20 = _createSlideOutX(-20);\n  var SLIDE_LEFT_OUT40 = _createSlideOutX(-40);\n  var SLIDE_LEFT_OUT400 = _createSlideOutX(-400);\n  var SLIDE_UP_OUT10 = _createSlideOutY(-10);\n  var SLIDE_UP_OUT20 = _createSlideOutY(-20);\n  var SLIDE_DOWN_OUT10 = _createSlideOutY(10);\n  var SLIDE_DOWN_OUT20 = _createSlideOutY(20);\n  var SCALE_UP100 = keyframes({\n    from: { transform: \"scale3d(.98,.98,1)\" },\n    to: { transform: \"scale3d(1,1,1)\" }\n  });\n  var SCALE_DOWN98 = keyframes({\n    from: { transform: \"scale3d(1,1,1)\" },\n    to: { transform: \"scale3d(.98,.98,1)\" }\n  });\n  var SCALE_DOWN100 = keyframes({\n    from: { transform: \"scale3d(1.03,1.03,1)\" },\n    to: { transform: \"scale3d(1,1,1)\" }\n  });\n  var SCALE_UP103 = keyframes({\n    from: { transform: \"scale3d(1,1,1)\" },\n    to: { transform: \"scale3d(1.03,1.03,1)\" }\n  });\n  var ROTATE90 = keyframes({\n    from: { transform: \"rotateZ(0deg)\" },\n    to: { transform: \"rotateZ(90deg)\" }\n  });\n  var ROTATE_N90 = keyframes({\n    from: { transform: \"rotateZ(0deg)\" },\n    to: { transform: \"rotateZ(-90deg)\" }\n  });\n  var AnimationVariables = {\n    easeFunction1: EASING_FUNCTION_1,\n    easeFunction2: EASING_FUNCTION_2,\n    durationValue2: DURATION_2,\n    durationValue3: DURATION_3\n  };\n  var AnimationStyles = {\n    slideRightIn10: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_RIGHT_IN10), DURATION_3, EASING_FUNCTION_1),\n    slideRightIn20: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_RIGHT_IN20), DURATION_3, EASING_FUNCTION_1),\n    slideRightIn40: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_RIGHT_IN40), DURATION_3, EASING_FUNCTION_1),\n    slideRightIn400: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_RIGHT_IN400), DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn10: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_LEFT_IN10), DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn20: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_LEFT_IN20), DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn40: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_LEFT_IN40), DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn400: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_LEFT_IN400), DURATION_3, EASING_FUNCTION_1),\n    slideUpIn10: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_UP_IN10), DURATION_3, EASING_FUNCTION_1),\n    slideUpIn20: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_UP_IN20), DURATION_3, EASING_FUNCTION_1),\n    slideDownIn10: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_DOWN_IN10), DURATION_3, EASING_FUNCTION_1),\n    slideDownIn20: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_DOWN_IN20), DURATION_3, EASING_FUNCTION_1),\n    slideRightOut10: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_RIGHT_OUT10), DURATION_3, EASING_FUNCTION_1),\n    slideRightOut20: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_RIGHT_OUT20), DURATION_3, EASING_FUNCTION_1),\n    slideRightOut40: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_RIGHT_OUT40), DURATION_3, EASING_FUNCTION_1),\n    slideRightOut400: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_RIGHT_OUT400), DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut10: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_LEFT_OUT10), DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut20: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_LEFT_OUT20), DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut40: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_LEFT_OUT40), DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut400: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_LEFT_OUT400), DURATION_3, EASING_FUNCTION_1),\n    slideUpOut10: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_UP_OUT10), DURATION_3, EASING_FUNCTION_1),\n    slideUpOut20: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_UP_OUT20), DURATION_3, EASING_FUNCTION_1),\n    slideDownOut10: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_DOWN_OUT10), DURATION_3, EASING_FUNCTION_1),\n    slideDownOut20: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_DOWN_OUT20), DURATION_3, EASING_FUNCTION_1),\n    scaleUpIn100: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SCALE_UP100), DURATION_3, EASING_FUNCTION_1),\n    scaleDownIn100: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SCALE_DOWN100), DURATION_3, EASING_FUNCTION_1),\n    scaleUpOut103: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SCALE_UP103), DURATION_1, EASING_FUNCTION_2),\n    scaleDownOut98: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SCALE_DOWN98), DURATION_1, EASING_FUNCTION_2),\n    fadeIn100: _createAnimation(FADE_IN, DURATION_1, EASING_FUNCTION_2),\n    fadeIn200: _createAnimation(FADE_IN, DURATION_2, EASING_FUNCTION_2),\n    fadeIn400: _createAnimation(FADE_IN, DURATION_3, EASING_FUNCTION_2),\n    fadeIn500: _createAnimation(FADE_IN, DURATION_4, EASING_FUNCTION_2),\n    fadeOut100: _createAnimation(FADE_OUT, DURATION_1, EASING_FUNCTION_2),\n    fadeOut200: _createAnimation(FADE_OUT, DURATION_2, EASING_FUNCTION_2),\n    fadeOut400: _createAnimation(FADE_OUT, DURATION_3, EASING_FUNCTION_2),\n    fadeOut500: _createAnimation(FADE_OUT, DURATION_4, EASING_FUNCTION_2),\n    rotate90deg: _createAnimation(ROTATE90, \"0.1s\", EASING_FUNCTION_2),\n    rotateN90deg: _createAnimation(ROTATE_N90, \"0.1s\", EASING_FUNCTION_2)\n    // expandCollapse 100/200/400, delay 100/200\n  };\n  function _createAnimation(animationName, animationDuration2, animationTimingFunction) {\n    return {\n      animationName,\n      animationDuration: animationDuration2,\n      animationTimingFunction,\n      animationFillMode: \"both\"\n    };\n  }\n  function _createSlideInX(fromX) {\n    return keyframes({\n      from: { transform: \"translate3d(\".concat(fromX, \"px,0,0)\"), pointerEvents: \"none\" },\n      to: { transform: \"translate3d(0,0,0)\", pointerEvents: \"auto\" }\n    });\n  }\n  function _createSlideInY(fromY) {\n    return keyframes({\n      from: { transform: \"translate3d(0,\".concat(fromY, \"px,0)\"), pointerEvents: \"none\" },\n      to: { transform: \"translate3d(0,0,0)\", pointerEvents: \"auto\" }\n    });\n  }\n  function _createSlideOutX(toX) {\n    return keyframes({\n      from: { transform: \"translate3d(0,0,0)\" },\n      to: { transform: \"translate3d(\".concat(toX, \"px,0,0)\") }\n    });\n  }\n  function _createSlideOutY(toY) {\n    return keyframes({\n      from: { transform: \"translate3d(0,0,0)\" },\n      to: { transform: \"translate3d(0,\".concat(toY, \"px,0)\") }\n    });\n  }\n  var LocalizedFontNames;\n  (function(LocalizedFontNames2) {\n    LocalizedFontNames2.Arabic = \"Segoe UI Web (Arabic)\";\n    LocalizedFontNames2.Cyrillic = \"Segoe UI Web (Cyrillic)\";\n    LocalizedFontNames2.EastEuropean = \"Segoe UI Web (East European)\";\n    LocalizedFontNames2.Greek = \"Segoe UI Web (Greek)\";\n    LocalizedFontNames2.Hebrew = \"Segoe UI Web (Hebrew)\";\n    LocalizedFontNames2.Thai = \"Leelawadee UI Web\";\n    LocalizedFontNames2.Vietnamese = \"Segoe UI Web (Vietnamese)\";\n    LocalizedFontNames2.WestEuropean = \"Segoe UI Web (West European)\";\n    LocalizedFontNames2.Selawik = \"Selawik Web\";\n    LocalizedFontNames2.Armenian = \"Segoe UI Web (Armenian)\";\n    LocalizedFontNames2.Georgian = \"Segoe UI Web (Georgian)\";\n  })(LocalizedFontNames || (LocalizedFontNames = {}));\n  var LocalizedFontFamilies;\n  (function(LocalizedFontFamilies2) {\n    LocalizedFontFamilies2.Arabic = \"'\".concat(LocalizedFontNames.Arabic, \"'\");\n    LocalizedFontFamilies2.ChineseSimplified = \"'Microsoft Yahei UI', Verdana, Simsun\";\n    LocalizedFontFamilies2.ChineseTraditional = \"'Microsoft Jhenghei UI', Pmingliu\";\n    LocalizedFontFamilies2.Cyrillic = \"'\".concat(LocalizedFontNames.Cyrillic, \"'\");\n    LocalizedFontFamilies2.EastEuropean = \"'\".concat(LocalizedFontNames.EastEuropean, \"'\");\n    LocalizedFontFamilies2.Greek = \"'\".concat(LocalizedFontNames.Greek, \"'\");\n    LocalizedFontFamilies2.Hebrew = \"'\".concat(LocalizedFontNames.Hebrew, \"'\");\n    LocalizedFontFamilies2.Hindi = \"'Nirmala UI'\";\n    LocalizedFontFamilies2.Japanese = \"'Yu Gothic UI', 'Meiryo UI', Meiryo, 'MS Pgothic', Osaka\";\n    LocalizedFontFamilies2.Korean = \"'Malgun Gothic', Gulim\";\n    LocalizedFontFamilies2.Selawik = \"'\".concat(LocalizedFontNames.Selawik, \"'\");\n    LocalizedFontFamilies2.Thai = \"'Leelawadee UI Web', 'Kmer UI'\";\n    LocalizedFontFamilies2.Vietnamese = \"'\".concat(LocalizedFontNames.Vietnamese, \"'\");\n    LocalizedFontFamilies2.WestEuropean = \"'\".concat(LocalizedFontNames.WestEuropean, \"'\");\n    LocalizedFontFamilies2.Armenian = \"'\".concat(LocalizedFontNames.Armenian, \"'\");\n    LocalizedFontFamilies2.Georgian = \"'\".concat(LocalizedFontNames.Georgian, \"'\");\n  })(LocalizedFontFamilies || (LocalizedFontFamilies = {}));\n  var FontSizes;\n  (function(FontSizes2) {\n    FontSizes2.size10 = \"10px\";\n    FontSizes2.size12 = \"12px\";\n    FontSizes2.size14 = \"14px\";\n    FontSizes2.size16 = \"16px\";\n    FontSizes2.size18 = \"18px\";\n    FontSizes2.size20 = \"20px\";\n    FontSizes2.size24 = \"24px\";\n    FontSizes2.size28 = \"28px\";\n    FontSizes2.size32 = \"32px\";\n    FontSizes2.size42 = \"42px\";\n    FontSizes2.size68 = \"68px\";\n    FontSizes2.mini = \"10px\";\n    FontSizes2.xSmall = \"10px\";\n    FontSizes2.small = \"12px\";\n    FontSizes2.smallPlus = \"12px\";\n    FontSizes2.medium = \"14px\";\n    FontSizes2.mediumPlus = \"16px\";\n    FontSizes2.icon = \"16px\";\n    FontSizes2.large = \"18px\";\n    FontSizes2.xLarge = \"20px\";\n    FontSizes2.xLargePlus = \"24px\";\n    FontSizes2.xxLarge = \"28px\";\n    FontSizes2.xxLargePlus = \"32px\";\n    FontSizes2.superLarge = \"42px\";\n    FontSizes2.mega = \"68px\";\n  })(FontSizes || (FontSizes = {}));\n  var FontWeights;\n  (function(FontWeights2) {\n    FontWeights2.light = 100;\n    FontWeights2.semilight = 300;\n    FontWeights2.regular = 400;\n    FontWeights2.semibold = 600;\n    FontWeights2.bold = 700;\n  })(FontWeights || (FontWeights = {}));\n  var IconFontSizes;\n  (function(IconFontSizes2) {\n    IconFontSizes2.xSmall = \"10px\";\n    IconFontSizes2.small = \"12px\";\n    IconFontSizes2.medium = \"16px\";\n    IconFontSizes2.large = \"20px\";\n  })(IconFontSizes || (IconFontSizes = {}));\n  var FontFamilyFallbacks = \"'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif\";\n  var defaultFontFamily = \"'Segoe UI', '\".concat(LocalizedFontNames.WestEuropean, \"'\");\n  var LanguageToFontMap = {\n    ar: LocalizedFontFamilies.Arabic,\n    bg: LocalizedFontFamilies.Cyrillic,\n    cs: LocalizedFontFamilies.EastEuropean,\n    el: LocalizedFontFamilies.Greek,\n    et: LocalizedFontFamilies.EastEuropean,\n    he: LocalizedFontFamilies.Hebrew,\n    hi: LocalizedFontFamilies.Hindi,\n    hr: LocalizedFontFamilies.EastEuropean,\n    hu: LocalizedFontFamilies.EastEuropean,\n    ja: LocalizedFontFamilies.Japanese,\n    kk: LocalizedFontFamilies.EastEuropean,\n    ko: LocalizedFontFamilies.Korean,\n    lt: LocalizedFontFamilies.EastEuropean,\n    lv: LocalizedFontFamilies.EastEuropean,\n    pl: LocalizedFontFamilies.EastEuropean,\n    ru: LocalizedFontFamilies.Cyrillic,\n    sk: LocalizedFontFamilies.EastEuropean,\n    \"sr-latn\": LocalizedFontFamilies.EastEuropean,\n    th: LocalizedFontFamilies.Thai,\n    tr: LocalizedFontFamilies.EastEuropean,\n    uk: LocalizedFontFamilies.Cyrillic,\n    vi: LocalizedFontFamilies.Vietnamese,\n    \"zh-hans\": LocalizedFontFamilies.ChineseSimplified,\n    \"zh-hant\": LocalizedFontFamilies.ChineseTraditional,\n    hy: LocalizedFontFamilies.Armenian,\n    ka: LocalizedFontFamilies.Georgian\n  };\n  function _fontFamilyWithFallbacks(fontFamily2) {\n    return \"\".concat(fontFamily2, \", \").concat(FontFamilyFallbacks);\n  }\n  function _getLocalizedFontFamily(language) {\n    for (var lang in LanguageToFontMap) {\n      if (LanguageToFontMap.hasOwnProperty(lang) && language && lang.indexOf(language) === 0) {\n        return LanguageToFontMap[lang];\n      }\n    }\n    return defaultFontFamily;\n  }\n  function _createFont(size, weight, fontFamily2) {\n    return {\n      fontFamily: fontFamily2,\n      MozOsxFontSmoothing: \"grayscale\",\n      WebkitFontSmoothing: \"antialiased\",\n      fontSize: size,\n      fontWeight: weight\n    };\n  }\n  function createFontStyles(localeCode) {\n    var localizedFont = _getLocalizedFontFamily(localeCode);\n    var fontFamilyWithFallback = _fontFamilyWithFallbacks(localizedFont);\n    var fontStyles = {\n      tiny: _createFont(FontSizes.mini, FontWeights.regular, fontFamilyWithFallback),\n      xSmall: _createFont(FontSizes.xSmall, FontWeights.regular, fontFamilyWithFallback),\n      small: _createFont(FontSizes.small, FontWeights.regular, fontFamilyWithFallback),\n      smallPlus: _createFont(FontSizes.smallPlus, FontWeights.regular, fontFamilyWithFallback),\n      medium: _createFont(FontSizes.medium, FontWeights.regular, fontFamilyWithFallback),\n      mediumPlus: _createFont(FontSizes.mediumPlus, FontWeights.regular, fontFamilyWithFallback),\n      large: _createFont(FontSizes.large, FontWeights.regular, fontFamilyWithFallback),\n      xLarge: _createFont(FontSizes.xLarge, FontWeights.semibold, fontFamilyWithFallback),\n      xLargePlus: _createFont(FontSizes.xLargePlus, FontWeights.semibold, fontFamilyWithFallback),\n      xxLarge: _createFont(FontSizes.xxLarge, FontWeights.semibold, fontFamilyWithFallback),\n      xxLargePlus: _createFont(FontSizes.xxLargePlus, FontWeights.semibold, fontFamilyWithFallback),\n      superLarge: _createFont(FontSizes.superLarge, FontWeights.semibold, fontFamilyWithFallback),\n      mega: _createFont(FontSizes.mega, FontWeights.semibold, fontFamilyWithFallback)\n    };\n    return fontStyles;\n  }\n  var DefaultBaseUrl = \"https://res-1.cdn.office.net/files/fabric-cdn-prod_20230815.002/assets\";\n  var DefaultFontStyles = createFontStyles(getLanguage());\n  function _registerFontFace(fontFamily2, url, fontWeight, localFontName) {\n    fontFamily2 = \"'\".concat(fontFamily2, \"'\");\n    var localFontSrc = localFontName !== void 0 ? \"local('\".concat(localFontName, \"'),\") : \"\";\n    fontFace({\n      fontFamily: fontFamily2,\n      src: localFontSrc + \"url('\".concat(url, \".woff2') format('woff2'),\") + \"url('\".concat(url, \".woff') format('woff')\"),\n      fontWeight,\n      fontStyle: \"normal\",\n      fontDisplay: \"swap\"\n    });\n  }\n  function _registerFontFaceSet(baseUrl, fontFamily2, cdnFolder, cdnFontName, localFontName) {\n    if (cdnFontName === void 0) {\n      cdnFontName = \"segoeui\";\n    }\n    var urlBase = \"\".concat(baseUrl, \"/\").concat(cdnFolder, \"/\").concat(cdnFontName);\n    _registerFontFace(fontFamily2, urlBase + \"-light\", FontWeights.light, localFontName && localFontName + \" Light\");\n    _registerFontFace(fontFamily2, urlBase + \"-semilight\", FontWeights.semilight, localFontName && localFontName + \" SemiLight\");\n    _registerFontFace(fontFamily2, urlBase + \"-regular\", FontWeights.regular, localFontName);\n    _registerFontFace(fontFamily2, urlBase + \"-semibold\", FontWeights.semibold, localFontName && localFontName + \" SemiBold\");\n    _registerFontFace(fontFamily2, urlBase + \"-bold\", FontWeights.bold, localFontName && localFontName + \" Bold\");\n  }\n  function registerDefaultFontFaces(baseUrl) {\n    if (baseUrl) {\n      var fontUrl = \"\".concat(baseUrl, \"/fonts\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Thai, \"leelawadeeui-thai\", \"leelawadeeui\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Arabic, \"segoeui-arabic\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Cyrillic, \"segoeui-cyrillic\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.EastEuropean, \"segoeui-easteuropean\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Greek, \"segoeui-greek\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Hebrew, \"segoeui-hebrew\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Vietnamese, \"segoeui-vietnamese\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.WestEuropean, \"segoeui-westeuropean\", \"segoeui\", \"Segoe UI\");\n      _registerFontFaceSet(fontUrl, LocalizedFontFamilies.Selawik, \"selawik\", \"selawik\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Armenian, \"segoeui-armenian\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Georgian, \"segoeui-georgian\");\n      _registerFontFace(\"Leelawadee UI Web\", \"\".concat(fontUrl, \"/leelawadeeui-thai/leelawadeeui-semilight\"), FontWeights.light);\n      _registerFontFace(\"Leelawadee UI Web\", \"\".concat(fontUrl, \"/leelawadeeui-thai/leelawadeeui-bold\"), FontWeights.semibold);\n    }\n  }\n  function _getFontBaseUrl() {\n    var _a2, _b2;\n    var fabricConfig = (_a2 = getWindow()) === null || _a2 === void 0 ? void 0 : _a2.FabricConfig;\n    return (_b2 = fabricConfig === null || fabricConfig === void 0 ? void 0 : fabricConfig.fontBaseUrl) !== null && _b2 !== void 0 ? _b2 : DefaultBaseUrl;\n  }\n  registerDefaultFontFaces(_getFontBaseUrl());\n  function createTheme(theme, depComments) {\n    if (theme === void 0) {\n      theme = {};\n    }\n    if (depComments === void 0) {\n      depComments = false;\n    }\n    var isInverted = !!theme.isInverted;\n    var baseTheme = {\n      palette: DefaultPalette,\n      effects: DefaultEffects,\n      fonts: DefaultFontStyles,\n      spacing: DefaultSpacing,\n      isInverted,\n      disableGlobalClassNames: false,\n      semanticColors: makeSemanticColors(DefaultPalette, DefaultEffects, void 0, isInverted, depComments),\n      rtl: void 0\n    };\n    return mergeThemes(baseTheme, theme);\n  }\n  var HighContrastSelector = \"@media screen and (-ms-high-contrast: active), screen and (forced-colors: active)\";\n  var HighContrastSelectorWhite = (\n    // eslint-disable-next-line @fluentui/max-len\n    \"@media screen and (-ms-high-contrast: black-on-white), screen and (forced-colors: active) and (prefers-color-scheme: light)\"\n  );\n  var ScreenWidthMinSmall = 320;\n  var ScreenWidthMinMedium = 480;\n  var ScreenWidthMinLarge = 640;\n  var ScreenWidthMinXLarge = 1024;\n  var ScreenWidthMinXXLarge = 1366;\n  var ScreenWidthMaxSmall = ScreenWidthMinMedium - 1;\n  var ScreenWidthMaxMedium = ScreenWidthMinLarge - 1;\n  var ScreenWidthMinUhfMobile = 768;\n  function getScreenSelector(min2, max2) {\n    var minSelector = \" and (min-width: \".concat(min2, \"px)\");\n    var maxSelector = typeof max2 === \"number\" ? \" and (max-width: \".concat(max2, \"px)\") : \"\";\n    return \"@media only screen\".concat(minSelector).concat(maxSelector);\n  }\n  function getHighContrastNoAdjustStyle() {\n    return {\n      forcedColorAdjust: \"none\",\n      MsHighContrastAdjust: \"none\"\n    };\n  }\n  var ZIndexes;\n  (function(ZIndexes2) {\n    ZIndexes2.Nav = 1;\n    ZIndexes2.ScrollablePane = 1;\n    ZIndexes2.FocusStyle = 1;\n    ZIndexes2.Coachmark = 1e3;\n    ZIndexes2.Layer = 1e6;\n    ZIndexes2.KeytipLayer = 1000001;\n  })(ZIndexes || (ZIndexes = {}));\n  function getFocusStyle(theme, insetOrOptions, position2, highContrastStyle, borderColor, outlineColor, isFocusedOnly, borderRadius) {\n    if (typeof insetOrOptions === \"number\" || !insetOrOptions) {\n      return _getFocusStyleInternal(theme, {\n        inset: insetOrOptions,\n        position: position2,\n        highContrastStyle,\n        borderColor,\n        outlineColor,\n        isFocusedOnly,\n        borderRadius\n      });\n    } else {\n      return _getFocusStyleInternal(theme, insetOrOptions);\n    }\n  }\n  function _getFocusStyleInternal(theme, options2) {\n    var _a2, _b2;\n    if (options2 === void 0) {\n      options2 = {};\n    }\n    var borderRadius = options2.borderRadius, _c2 = options2.inset, inset = _c2 === void 0 ? 0 : _c2, _d2 = options2.width, width2 = _d2 === void 0 ? 1 : _d2, _e2 = options2.position, position2 = _e2 === void 0 ? \"relative\" : _e2, highContrastStyle = options2.highContrastStyle, _f = options2.borderColor, borderColor = _f === void 0 ? theme.palette.white : _f, _g = options2.outlineColor, outlineColor = _g === void 0 ? theme.palette.neutralSecondary : _g, _h = options2.isFocusedOnly, isFocusedOnly = _h === void 0 ? true : _h, pointerEvents = options2.pointerEvents;\n    return {\n      // Clear browser-specific focus styles and use 'transparent' as placeholder for focus style.\n      outline: \"transparent\",\n      // Requirement because pseudo-element is absolutely positioned.\n      position: position2,\n      selectors: (_a2 = {\n        // Clear the focus border in Firefox.\n        // Reference: http://stackoverflow.com/a/199319/1436671\n        \"::-moz-focus-inner\": {\n          border: \"0\"\n        }\n      }, // When the element that uses this mixin is in a :focus state, add a pseudo-element to\n      // create a border.\n      _a2[\".\".concat(IsFocusVisibleClassName, \" &\").concat(isFocusedOnly ? \":focus\" : \"\", \":after, :host(.\").concat(IsFocusVisibleClassName, \") &\").concat(isFocusedOnly ? \":focus\" : \"\", \":after\")] = {\n        content: '\"\"',\n        position: \"absolute\",\n        pointerEvents,\n        left: inset + 1,\n        top: inset + 1,\n        bottom: inset + 1,\n        right: inset + 1,\n        border: \"\".concat(width2, \"px solid \").concat(borderColor),\n        outline: \"\".concat(width2, \"px solid \").concat(outlineColor),\n        zIndex: ZIndexes.FocusStyle,\n        borderRadius,\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = highContrastStyle, _b2)\n      }, _a2)\n    };\n  }\n  function focusClear() {\n    return {\n      selectors: {\n        \"&::-moz-focus-inner\": {\n          // Clear the focus border in Firefox. Reference: http://stackoverflow.com/a/199319/1436671\n          border: 0\n        },\n        \"&\": {\n          // Clear browser specific focus styles and use transparent as placeholder for focus style\n          outline: \"transparent\"\n        }\n      }\n    };\n  }\n  var getInputFocusStyle = function(borderColor, borderRadius, borderType, borderPosition) {\n    var _a2, _b2, _c2;\n    if (borderType === void 0) {\n      borderType = \"border\";\n    }\n    if (borderPosition === void 0) {\n      borderPosition = -1;\n    }\n    var isBorderBottom = borderType === \"borderBottom\";\n    return {\n      borderColor,\n      selectors: {\n        \":after\": (_a2 = {\n          pointerEvents: \"none\",\n          content: \"''\",\n          position: \"absolute\",\n          left: isBorderBottom ? 0 : borderPosition,\n          top: borderPosition,\n          bottom: borderPosition,\n          right: isBorderBottom ? 0 : borderPosition\n        }, _a2[borderType] = \"2px solid \".concat(borderColor), _a2.borderRadius = borderRadius, _a2.width = borderType === \"borderBottom\" ? \"100%\" : void 0, _a2.selectors = (_b2 = {}, _b2[HighContrastSelector] = (_c2 = {}, _c2[borderType === \"border\" ? \"borderColor\" : \"borderBottomColor\"] = \"Highlight\", _c2), _b2), _a2)\n      }\n    };\n  };\n  var hiddenContentStyle = {\n    position: \"absolute\",\n    width: 1,\n    height: 1,\n    margin: -1,\n    padding: 0,\n    border: 0,\n    overflow: \"hidden\",\n    whiteSpace: \"nowrap\"\n  };\n  var _getGlobalClassNames = memoizeFunction(function(classNames2, disableGlobalClassNames) {\n    var styleSheet = Stylesheet.getInstance();\n    if (disableGlobalClassNames) {\n      return Object.keys(classNames2).reduce(function(acc, className2) {\n        acc[className2] = styleSheet.getClassName(classNames2[className2]);\n        return acc;\n      }, {});\n    }\n    return classNames2;\n  });\n  function getGlobalClassNames(classNames2, theme, disableGlobalClassNames) {\n    return _getGlobalClassNames(classNames2, theme.disableGlobalClassNames);\n  }\n  var __assign = function() {\n    __assign = Object.assign || function(t) {\n      for (var s2, i = 1, n = arguments.length; i < n; i++) {\n        s2 = arguments[i];\n        for (var p in s2) if (Object.prototype.hasOwnProperty.call(s2, p))\n          t[p] = s2[p];\n      }\n      return t;\n    };\n    return __assign.apply(this, arguments);\n  };\n  var _root = typeof window === \"undefined\" ? global : window;\n  var _styleNonce = _root && _root.CSPSettings && _root.CSPSettings.nonce;\n  var _themeState = initializeThemeState();\n  function initializeThemeState() {\n    var state = _root.__themeState__ || {\n      theme: void 0,\n      lastStyleElement: void 0,\n      registeredStyles: []\n    };\n    if (!state.runState) {\n      state = __assign(__assign({}, state), { perf: {\n        count: 0,\n        duration: 0\n      }, runState: {\n        flushTimer: 0,\n        mode: 0,\n        buffer: []\n      } });\n    }\n    if (!state.registeredThemableStyles) {\n      state = __assign(__assign({}, state), { registeredThemableStyles: [] });\n    }\n    _root.__themeState__ = state;\n    return state;\n  }\n  function applyThemableStyles(stylesArray, styleRecord) {\n    if (_themeState.loadStyles) {\n      _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n    } else {\n      registerStyles(stylesArray);\n    }\n  }\n  function loadTheme$1(theme) {\n    _themeState.theme = theme;\n    reloadStyles();\n  }\n  function clearStyles(option) {\n    {\n      clearStylesInternal(_themeState.registeredThemableStyles);\n      _themeState.registeredThemableStyles = [];\n    }\n  }\n  function clearStylesInternal(records) {\n    records.forEach(function(styleRecord) {\n      var styleElement = styleRecord && styleRecord.styleElement;\n      if (styleElement && styleElement.parentElement) {\n        styleElement.parentElement.removeChild(styleElement);\n      }\n    });\n  }\n  function reloadStyles() {\n    if (_themeState.theme) {\n      var themableStyles = [];\n      for (var _i = 0, _a2 = _themeState.registeredThemableStyles; _i < _a2.length; _i++) {\n        var styleRecord = _a2[_i];\n        themableStyles.push(styleRecord.themableStyle);\n      }\n      if (themableStyles.length > 0) {\n        clearStyles();\n        applyThemableStyles([].concat.apply([], themableStyles));\n      }\n    }\n  }\n  function resolveThemableArray(splitStyleArray) {\n    var theme = _themeState.theme;\n    var themable = false;\n    var resolvedArray = (splitStyleArray || []).map(function(currentValue) {\n      var themeSlot = currentValue.theme;\n      if (themeSlot) {\n        themable = true;\n        var themedValue = theme ? theme[themeSlot] : void 0;\n        var defaultValue = currentValue.defaultValue || \"inherit\";\n        if (theme && !themedValue && console && !(themeSlot in theme) && typeof DEBUG !== \"undefined\" && DEBUG) {\n          console.warn('Theming value not provided for \"'.concat(themeSlot, '\". Falling back to \"').concat(defaultValue, '\".'));\n        }\n        return themedValue || defaultValue;\n      } else {\n        return currentValue.rawString;\n      }\n    });\n    return {\n      styleString: resolvedArray.join(\"\"),\n      themable\n    };\n  }\n  function registerStyles(styleArray) {\n    if (typeof document === \"undefined\") {\n      return;\n    }\n    var head = document.getElementsByTagName(\"head\")[0];\n    var styleElement = document.createElement(\"style\");\n    var _a2 = resolveThemableArray(styleArray), styleString = _a2.styleString, themable = _a2.themable;\n    styleElement.setAttribute(\"data-load-themed-styles\", \"true\");\n    if (_styleNonce) {\n      styleElement.setAttribute(\"nonce\", _styleNonce);\n    }\n    styleElement.appendChild(document.createTextNode(styleString));\n    _themeState.perf.count++;\n    head.appendChild(styleElement);\n    var ev = document.createEvent(\"HTMLEvents\");\n    ev.initEvent(\n      \"styleinsert\",\n      true,\n      false\n      /* cancelable */\n    );\n    ev.args = {\n      newStyle: styleElement\n    };\n    document.dispatchEvent(ev);\n    var record = {\n      styleElement,\n      themableStyle: styleArray\n    };\n    if (themable) {\n      _themeState.registeredThemableStyles.push(record);\n    } else {\n      _themeState.registeredStyles.push(record);\n    }\n  }\n  var _theme = createTheme({});\n  var _onThemeChangeCallbacks = [];\n  var ThemeSettingName = \"theme\";\n  function initializeThemeInCustomizations() {\n    var _a2;\n    var _b2, _c2;\n    var win = getWindow();\n    if ((_b2 = win === null || win === void 0 ? void 0 : win.FabricConfig) === null || _b2 === void 0 ? void 0 : _b2.legacyTheme) {\n      loadTheme(win.FabricConfig.legacyTheme);\n    } else if (!Customizations.getSettings([ThemeSettingName]).theme) {\n      if ((_c2 = win === null || win === void 0 ? void 0 : win.FabricConfig) === null || _c2 === void 0 ? void 0 : _c2.theme) {\n        _theme = createTheme(win.FabricConfig.theme);\n      }\n      Customizations.applySettings((_a2 = {}, _a2[ThemeSettingName] = _theme, _a2));\n    }\n  }\n  initializeThemeInCustomizations();\n  function getTheme(depComments) {\n    if (depComments === void 0) {\n      depComments = false;\n    }\n    if (depComments === true) {\n      _theme = createTheme({}, depComments);\n    }\n    return _theme;\n  }\n  function loadTheme(theme, depComments) {\n    var _a2;\n    if (depComments === void 0) {\n      depComments = false;\n    }\n    _theme = createTheme(theme, depComments);\n    loadTheme$1(__assign$1(__assign$1(__assign$1(__assign$1({}, _theme.palette), _theme.semanticColors), _theme.effects), _loadFonts(_theme)));\n    Customizations.applySettings((_a2 = {}, _a2[ThemeSettingName] = _theme, _a2));\n    _onThemeChangeCallbacks.forEach(function(callback) {\n      try {\n        callback(_theme);\n      } catch (e) {\n      }\n    });\n    return _theme;\n  }\n  function _loadFonts(theme) {\n    var lines = {};\n    for (var _i = 0, _a2 = Object.keys(theme.fonts); _i < _a2.length; _i++) {\n      var fontName = _a2[_i];\n      var font2 = theme.fonts[fontName];\n      for (var _b2 = 0, _c2 = Object.keys(font2); _b2 < _c2.length; _b2++) {\n        var propName = _c2[_b2];\n        var name_1 = fontName + propName.charAt(0).toUpperCase() + propName.slice(1);\n        var value2 = font2[propName];\n        if (propName === \"fontSize\" && typeof value2 === \"number\") {\n          value2 = value2 + \"px\";\n        }\n        lines[name_1] = value2;\n      }\n    }\n    return lines;\n  }\n  var normalize$1 = {\n    boxShadow: \"none\",\n    margin: 0,\n    padding: 0,\n    boxSizing: \"border-box\"\n  };\n  function getPlaceholderStyles(styles) {\n    return {\n      selectors: {\n        \"::placeholder\": styles,\n        // Chrome, Safari, Opera, Firefox\n        \":-ms-input-placeholder\": styles,\n        // IE 10+\n        \"::-ms-input-placeholder\": styles\n        // Edge\n      }\n    };\n  }\n  var AnimationClassNames = buildClassMap(AnimationStyles);\n  setVersion(\"@fluentui/style-utilities\", \"8.13.5\");\n  initializeThemeInCustomizations();\n  var GlobalClassNames$h = {\n    root: \"ms-Image\",\n    rootMaximizeFrame: \"ms-Image--maximizeFrame\",\n    image: \"ms-Image-image\",\n    imageCenter: \"ms-Image-image--center\",\n    imageContain: \"ms-Image-image--contain\",\n    imageCover: \"ms-Image-image--cover\",\n    imageCenterContain: \"ms-Image-image--centerContain\",\n    imageCenterCover: \"ms-Image-image--centerCover\",\n    imageNone: \"ms-Image-image--none\",\n    imageLandscape: \"ms-Image-image--landscape\",\n    imagePortrait: \"ms-Image-image--portrait\"\n  };\n  var getStyles$w = function(props) {\n    var className2 = props.className, width2 = props.width, height2 = props.height, maximizeFrame = props.maximizeFrame, isLoaded = props.isLoaded, shouldFadeIn = props.shouldFadeIn, shouldStartVisible = props.shouldStartVisible, isLandscape = props.isLandscape, isCenter = props.isCenter, isContain = props.isContain, isCover = props.isCover, isCenterContain = props.isCenterContain, isCenterCover = props.isCenterCover, isNone = props.isNone, isError = props.isError, isNotImageFit = props.isNotImageFit, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$h, theme);\n    var ImageFitStyles = {\n      position: \"absolute\",\n      left: \"50% /* @noflip */\",\n      top: \"50%\",\n      transform: \"translate(-50%,-50%)\"\n      // @todo test RTL renders transform: translate(50%,-50%);\n    };\n    var window2 = getWindow();\n    var supportsObjectFit = window2 !== void 0 && // eslint-disable-next-line @fluentui/max-len\n    // cast needed as vendor prefixed `msMaxTouchPoints` api is no longer part of TS lib declaration - introduced with TS 4.4\n    window2.navigator.msMaxTouchPoints === void 0;\n    var fallbackObjectFitStyles = isContain && isLandscape || isCover && !isLandscape ? { width: \"100%\", height: \"auto\" } : { width: \"auto\", height: \"100%\" };\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          overflow: \"hidden\"\n        },\n        maximizeFrame && [\n          classNames2.rootMaximizeFrame,\n          {\n            height: \"100%\",\n            width: \"100%\"\n          }\n        ],\n        isLoaded && shouldFadeIn && !shouldStartVisible && AnimationClassNames.fadeIn400,\n        (isCenter || isContain || isCover || isCenterContain || isCenterCover) && {\n          position: \"relative\"\n        },\n        className2\n      ],\n      image: [\n        classNames2.image,\n        {\n          display: \"block\",\n          opacity: 0\n        },\n        isLoaded && [\n          \"is-loaded\",\n          {\n            opacity: 1\n          }\n        ],\n        isCenter && [classNames2.imageCenter, ImageFitStyles],\n        isContain && [\n          classNames2.imageContain,\n          supportsObjectFit && {\n            width: \"100%\",\n            height: \"100%\",\n            objectFit: \"contain\"\n          },\n          !supportsObjectFit && fallbackObjectFitStyles,\n          !supportsObjectFit && ImageFitStyles\n        ],\n        isCover && [\n          classNames2.imageCover,\n          supportsObjectFit && {\n            width: \"100%\",\n            height: \"100%\",\n            objectFit: \"cover\"\n          },\n          !supportsObjectFit && fallbackObjectFitStyles,\n          !supportsObjectFit && ImageFitStyles\n        ],\n        isCenterContain && [\n          classNames2.imageCenterContain,\n          isLandscape && {\n            maxWidth: \"100%\"\n          },\n          !isLandscape && {\n            maxHeight: \"100%\"\n          },\n          ImageFitStyles\n        ],\n        isCenterCover && [\n          classNames2.imageCenterCover,\n          isLandscape && {\n            maxHeight: \"100%\"\n          },\n          !isLandscape && {\n            maxWidth: \"100%\"\n          },\n          ImageFitStyles\n        ],\n        isNone && [\n          classNames2.imageNone,\n          {\n            width: \"auto\",\n            height: \"auto\"\n          }\n        ],\n        isNotImageFit && [\n          !!width2 && !height2 && {\n            height: \"auto\",\n            width: \"100%\"\n          },\n          !width2 && !!height2 && {\n            height: \"100%\",\n            width: \"auto\"\n          },\n          !!width2 && !!height2 && {\n            height: \"100%\",\n            width: \"100%\"\n          }\n        ],\n        isLandscape && classNames2.imageLandscape,\n        !isLandscape && classNames2.imagePortrait,\n        !isLoaded && \"is-notLoaded\",\n        shouldFadeIn && \"is-fadeIn\",\n        isError && \"is-error\"\n      ]\n    };\n  };\n  var Image$1 = styled(ImageBase, getStyles$w, void 0, {\n    scope: \"Image\"\n  }, true);\n  Image$1.displayName = \"Image\";\n  var classNames = mergeStyleSets({\n    root: {\n      display: \"inline-block\",\n      textDecoration: \"inherit\"\n    },\n    placeholder: [\n      \"ms-Icon-placeHolder\",\n      {\n        width: \"1em\"\n      }\n    ],\n    image: [\n      \"ms-Icon-imageContainer\",\n      {\n        overflow: \"hidden\"\n      }\n    ]\n  });\n  var MS_ICON = \"ms-Icon\";\n  var getStyles$v = function(props) {\n    var className2 = props.className, iconClassName = props.iconClassName, isPlaceholder = props.isPlaceholder, isImage = props.isImage, styles = props.styles;\n    return {\n      root: [\n        isPlaceholder && classNames.placeholder,\n        classNames.root,\n        isImage && classNames.image,\n        iconClassName,\n        className2,\n        styles && styles.root,\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        styles && styles.imageContainer\n      ]\n    };\n  };\n  var getIconContent = memoizeFunction(\n    function(iconName) {\n      var _a2 = getIcon(iconName) || {\n        subset: {},\n        code: void 0\n      }, code = _a2.code, subset = _a2.subset;\n      if (!code) {\n        return null;\n      }\n      return {\n        children: code,\n        iconClassName: subset.className,\n        fontFamily: subset.fontFace && subset.fontFace.fontFamily,\n        mergeImageProps: subset.mergeImageProps\n      };\n    },\n    void 0,\n    true\n    /*ignoreNullOrUndefinedResult */\n  );\n  var FontIcon = function(props) {\n    var iconName = props.iconName, className2 = props.className, _a2 = props.style, style2 = _a2 === void 0 ? {} : _a2;\n    var iconContent = getIconContent(iconName) || {};\n    var iconClassName = iconContent.iconClassName, children2 = iconContent.children, fontFamily2 = iconContent.fontFamily, mergeImageProps = iconContent.mergeImageProps;\n    var nativeProps = getNativeProps(props, htmlElementProperties);\n    var accessibleName = props[\"aria-label\"] || props.title;\n    var containerProps = props[\"aria-label\"] || props[\"aria-labelledby\"] || props.title ? {\n      role: mergeImageProps ? void 0 : \"img\"\n    } : {\n      \"aria-hidden\": true\n    };\n    var finalChildren = children2;\n    if (mergeImageProps) {\n      if (typeof children2 === \"object\" && typeof children2.props === \"object\" && accessibleName) {\n        finalChildren = React__namespace.cloneElement(children2, { alt: accessibleName });\n      }\n    }\n    return React__namespace.createElement(\"i\", __assign$1({ \"data-icon-name\": iconName }, containerProps, nativeProps, mergeImageProps ? {\n      title: void 0,\n      \"aria-label\": void 0\n    } : {}, {\n      className: css(MS_ICON, classNames.root, iconClassName, !iconName && classNames.placeholder, className2),\n      // Apply the font family this way to ensure it doesn't get overridden by Fabric Core ms-Icon styles\n      // https://github.com/microsoft/fluentui/issues/10449\n      style: __assign$1({ fontFamily: fontFamily2 }, style2)\n    }), finalChildren);\n  };\n  memoizeFunction(function(iconName, className2, ariaLabel2) {\n    return FontIcon({ iconName, className: className2, \"aria-label\": ariaLabel2 });\n  });\n  var getClassNames$q = classNamesFunction({\n    // Icon is used a lot by other components.\n    // It's likely to see expected cases which pass different className to the Icon.\n    // Therefore setting a larger cache size.\n    cacheSize: 100\n  });\n  var IconBase = (\n    /** @class */\n    (function(_super) {\n      __extends(IconBase2, _super);\n      function IconBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._onImageLoadingStateChange = function(state) {\n          if (_this.props.imageProps && _this.props.imageProps.onLoadingStateChange) {\n            _this.props.imageProps.onLoadingStateChange(state);\n          }\n          if (state === ImageLoadState.error) {\n            _this.setState({ imageLoadError: true });\n          }\n        };\n        _this.state = {\n          imageLoadError: false\n        };\n        return _this;\n      }\n      IconBase2.prototype.render = function() {\n        var _a2 = this.props, children2 = _a2.children, className2 = _a2.className, styles = _a2.styles, iconName = _a2.iconName, imageErrorAs = _a2.imageErrorAs, theme = _a2.theme;\n        var isPlaceholder = typeof iconName === \"string\" && iconName.length === 0;\n        var isImage = (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          !!this.props.imageProps || this.props.iconType === IconType.image || this.props.iconType === IconType.Image\n        );\n        var iconContent = getIconContent(iconName) || {};\n        var iconClassName = iconContent.iconClassName, iconContentChildren = iconContent.children, mergeImageProps = iconContent.mergeImageProps;\n        var classNames2 = getClassNames$q(styles, {\n          theme,\n          className: className2,\n          iconClassName,\n          isImage,\n          isPlaceholder\n        });\n        var RootType = isImage ? \"span\" : \"i\";\n        var nativeProps = getNativeProps(this.props, htmlElementProperties, [\n          \"aria-label\"\n        ]);\n        var imageLoadError = this.state.imageLoadError;\n        var imageProps = __assign$1(__assign$1({}, this.props.imageProps), { onLoadingStateChange: this._onImageLoadingStateChange });\n        var ImageType = imageLoadError && imageErrorAs || Image$1;\n        var ariaLabel2 = this.props[\"aria-label\"] || this.props.ariaLabel;\n        var accessibleName = imageProps.alt || ariaLabel2 || this.props.title;\n        var hasName = !!(accessibleName || this.props[\"aria-labelledby\"] || imageProps[\"aria-label\"] || imageProps[\"aria-labelledby\"]);\n        var containerProps = hasName ? {\n          role: isImage || mergeImageProps ? void 0 : \"img\",\n          \"aria-label\": isImage || mergeImageProps ? void 0 : accessibleName\n        } : {\n          \"aria-hidden\": true\n        };\n        var finalIconContentChildren = iconContentChildren;\n        if (mergeImageProps && iconContentChildren && typeof iconContentChildren === \"object\" && accessibleName) {\n          finalIconContentChildren = React__namespace.cloneElement(iconContentChildren, {\n            alt: accessibleName\n          });\n        }\n        return React__namespace.createElement(RootType, __assign$1({ \"data-icon-name\": iconName }, containerProps, nativeProps, mergeImageProps ? {\n          title: void 0,\n          \"aria-label\": void 0\n        } : {}, { className: classNames2.root }), isImage ? React__namespace.createElement(ImageType, __assign$1({}, imageProps)) : children2 || finalIconContentChildren);\n      };\n      return IconBase2;\n    })(React__namespace.Component)\n  );\n  var Icon = styled(IconBase, getStyles$v, void 0, {\n    scope: \"Icon\"\n  }, true);\n  Icon.displayName = \"Icon\";\n  var ImageIcon = function(props) {\n    var className2 = props.className, imageProps = props.imageProps;\n    var nativeProps = getNativeProps(props, htmlElementProperties, [\n      \"aria-label\",\n      \"aria-labelledby\",\n      \"title\",\n      \"aria-describedby\"\n    ]);\n    var altText = imageProps.alt || props[\"aria-label\"];\n    var hasName = altText || props[\"aria-labelledby\"] || props.title || imageProps[\"aria-label\"] || imageProps[\"aria-labelledby\"] || imageProps.title;\n    var imageNameProps = {\n      \"aria-labelledby\": props[\"aria-labelledby\"],\n      \"aria-describedby\": props[\"aria-describedby\"],\n      title: props.title\n    };\n    var containerProps = hasName ? {} : {\n      \"aria-hidden\": true\n    };\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({}, containerProps, nativeProps, { className: css(MS_ICON, classNames.root, classNames.image, className2) }),\n      React__namespace.createElement(Image$1, __assign$1({}, imageNameProps, imageProps, { alt: hasName ? altText : \"\" }))\n    );\n  };\n  var DirectionalHint = {\n    /**\n     * Appear above the target element, with the left edges of the callout and target aligning.\n     */\n    topLeftEdge: 0,\n    /**\n     * Appear above the target element, with the centers of the callout and target aligning.\n     */\n    topCenter: 1,\n    /**\n     * Appear above the target element, with the right edges of the callout and target aligning.\n     */\n    topRightEdge: 2,\n    /**\n     * Appear above the target element, aligning with the target element such that the callout tends toward\n     * the center of the screen.\n     */\n    topAutoEdge: 3,\n    /**\n     * Appear below the target element, with the left edges of the callout and target aligning.\n     */\n    bottomLeftEdge: 4,\n    /**\n     * Appear below the target element, with the centers of the callout and target aligning.\n     */\n    bottomCenter: 5,\n    /**\n     * Appear below the target element, with the right edges of the callout and target aligning.\n     */\n    bottomRightEdge: 6,\n    /**\n     * Appear below the target element, aligning with the target element such that the callout tends toward\n     * the center of the screen.\n     */\n    bottomAutoEdge: 7,\n    /**\n     * Appear to the left of the target element, with the top edges of the callout and target aligning.\n     */\n    leftTopEdge: 8,\n    /**\n     * Appear to the left of the target element, with the centers of the callout and target aligning.\n     */\n    leftCenter: 9,\n    /**\n     * Appear to the left of the target element, with the bottom edges of the callout and target aligning.\n     */\n    leftBottomEdge: 10,\n    /**\n     * Appear to the right of the target element, with the top edges of the callout and target aligning.\n     */\n    rightTopEdge: 11,\n    /**\n     * Appear to the right of the target element, with the centers of the callout and target aligning.\n     */\n    rightCenter: 12,\n    /**\n     * Appear to the right of the target element, with the bottom edges of the callout and target aligning.\n     */\n    rightBottomEdge: 13\n  };\n  var ContextualMenuItemType;\n  (function(ContextualMenuItemType2) {\n    ContextualMenuItemType2[ContextualMenuItemType2[\"Normal\"] = 0] = \"Normal\";\n    ContextualMenuItemType2[ContextualMenuItemType2[\"Divider\"] = 1] = \"Divider\";\n    ContextualMenuItemType2[ContextualMenuItemType2[\"Header\"] = 2] = \"Header\";\n    ContextualMenuItemType2[ContextualMenuItemType2[\"Section\"] = 3] = \"Section\";\n  })(ContextualMenuItemType || (ContextualMenuItemType = {}));\n  var FocusZoneTabbableElements = {\n    /** All tabbing action is allowed */\n    all: 1,\n    /** Tabbing is allowed only on input elements */\n    inputOnly: 2\n  };\n  var FocusZoneDirection;\n  (function(FocusZoneDirection2) {\n    FocusZoneDirection2[FocusZoneDirection2[\"vertical\"] = 0] = \"vertical\";\n    FocusZoneDirection2[FocusZoneDirection2[\"horizontal\"] = 1] = \"horizontal\";\n    FocusZoneDirection2[FocusZoneDirection2[\"bidirectional\"] = 2] = \"bidirectional\";\n    FocusZoneDirection2[FocusZoneDirection2[\"domOrder\"] = 3] = \"domOrder\";\n  })(FocusZoneDirection || (FocusZoneDirection = {}));\n  var IS_FOCUSABLE_ATTRIBUTE = \"data-is-focusable\";\n  var IS_ENTER_DISABLED_ATTRIBUTE = \"data-disable-click-on-enter\";\n  var FOCUSZONE_ID_ATTRIBUTE = \"data-focuszone-id\";\n  var TABINDEX = \"tabindex\";\n  var NO_VERTICAL_WRAP = \"data-no-vertical-wrap\";\n  var NO_HORIZONTAL_WRAP = \"data-no-horizontal-wrap\";\n  var LARGE_DISTANCE_FROM_CENTER = 999999999;\n  var LARGE_NEGATIVE_DISTANCE_FROM_CENTER = -999999999;\n  var focusZoneStyles;\n  var focusZoneClass = \"ms-FocusZone\";\n  function raiseClickFromKeyboardEvent(target2, ev) {\n    var event2;\n    if (typeof MouseEvent === \"function\") {\n      event2 = new MouseEvent(\"click\", {\n        ctrlKey: ev === null || ev === void 0 ? void 0 : ev.ctrlKey,\n        metaKey: ev === null || ev === void 0 ? void 0 : ev.metaKey,\n        shiftKey: ev === null || ev === void 0 ? void 0 : ev.shiftKey,\n        altKey: ev === null || ev === void 0 ? void 0 : ev.altKey,\n        bubbles: ev === null || ev === void 0 ? void 0 : ev.bubbles,\n        cancelable: ev === null || ev === void 0 ? void 0 : ev.cancelable\n      });\n    } else {\n      event2 = document.createEvent(\"MouseEvents\");\n      event2.initMouseEvent(\n        \"click\",\n        ev ? ev.bubbles : false,\n        ev ? ev.cancelable : false,\n        // eslint-disable-next-line no-restricted-globals\n        window,\n        // not using getWindow() since this can only be run client side\n        0,\n        // detail\n        0,\n        // screen x\n        0,\n        // screen y\n        0,\n        // client x\n        0,\n        // client y\n        ev ? ev.ctrlKey : false,\n        ev ? ev.altKey : false,\n        ev ? ev.shiftKey : false,\n        ev ? ev.metaKey : false,\n        0,\n        // button\n        null\n      );\n    }\n    target2.dispatchEvent(event2);\n  }\n  function getRootClass() {\n    if (!focusZoneStyles) {\n      focusZoneStyles = mergeStyles({\n        selectors: {\n          \":focus\": {\n            outline: \"none\"\n          }\n        }\n      }, focusZoneClass);\n    }\n    return focusZoneStyles;\n  }\n  var _allInstances = {};\n  var _outerZones = /* @__PURE__ */ new Set();\n  var ALLOWED_INPUT_TYPES = [\"text\", \"number\", \"password\", \"email\", \"tel\", \"url\", \"search\", \"textarea\"];\n  var ALLOW_VIRTUAL_ELEMENTS = false;\n  var FocusZone = (\n    /** @class */\n    (function(_super) {\n      __extends(FocusZone2, _super);\n      function FocusZone2(props) {\n        var _a2, _b2, _c2, _d2;\n        var _this = _super.call(this, props) || this;\n        _this._root = React__namespace.createRef();\n        _this._mergedRef = createMergedRef();\n        _this._onFocus = function(ev) {\n          if (_this._portalContainsElement(ev.target)) {\n            return;\n          }\n          var _a22 = _this.props, onActiveElementChanged = _a22.onActiveElementChanged, doNotAllowFocusEventToPropagate = _a22.doNotAllowFocusEventToPropagate, stopFocusPropagation = _a22.stopFocusPropagation, onFocusNotification = _a22.onFocusNotification, onFocus = _a22.onFocus, shouldFocusInnerElementWhenReceivedFocus = _a22.shouldFocusInnerElementWhenReceivedFocus, defaultTabbableElement = _a22.defaultTabbableElement;\n          var isImmediateDescendant = _this._isImmediateDescendantOfZone(ev.target);\n          var newActiveElement;\n          if (isImmediateDescendant) {\n            newActiveElement = ev.target;\n          } else {\n            var parentElement = ev.target;\n            while (parentElement && parentElement !== _this._root.current) {\n              if (isElementTabbable(parentElement, void 0, _this._inShadowRoot) && _this._isImmediateDescendantOfZone(parentElement)) {\n                newActiveElement = parentElement;\n                break;\n              }\n              parentElement = getParent(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n            }\n          }\n          if (shouldFocusInnerElementWhenReceivedFocus && ev.target === _this._root.current) {\n            var maybeElementToFocus = defaultTabbableElement && typeof defaultTabbableElement === \"function\" && _this._root.current && defaultTabbableElement(_this._root.current);\n            if (maybeElementToFocus && isElementTabbable(maybeElementToFocus, void 0, _this._inShadowRoot)) {\n              newActiveElement = maybeElementToFocus;\n              maybeElementToFocus.focus();\n            } else {\n              _this.focus(true);\n              if (_this._activeElement) {\n                newActiveElement = null;\n              }\n            }\n          }\n          var initialElementFocused = !_this._activeElement;\n          if (newActiveElement && newActiveElement !== _this._activeElement) {\n            if (isImmediateDescendant || initialElementFocused) {\n              _this._setFocusAlignment(newActiveElement, true, true);\n            }\n            _this._activeElement = newActiveElement;\n            if (initialElementFocused) {\n              _this._updateTabIndexes();\n            }\n          }\n          if (onActiveElementChanged) {\n            onActiveElementChanged(_this._activeElement, ev);\n          }\n          if (stopFocusPropagation || doNotAllowFocusEventToPropagate) {\n            ev.stopPropagation();\n          }\n          if (onFocus) {\n            onFocus(ev);\n          } else if (onFocusNotification) {\n            onFocusNotification();\n          }\n        };\n        _this._onBlur = function() {\n          _this._setParkedFocus(false);\n        };\n        _this._onMouseDown = function(ev) {\n          if (_this._portalContainsElement(ev.target)) {\n            return;\n          }\n          var disabled = _this.props.disabled;\n          if (disabled) {\n            return;\n          }\n          var target2 = ev.target;\n          var path2 = [];\n          while (target2 && target2 !== _this._root.current) {\n            path2.push(target2);\n            target2 = getParent(target2, ALLOW_VIRTUAL_ELEMENTS);\n          }\n          while (path2.length) {\n            target2 = path2.pop();\n            if (target2 && isElementTabbable(target2, void 0, _this._inShadowRoot)) {\n              _this._setActiveElement(target2, true);\n            }\n            if (isElementFocusZone(target2)) {\n              break;\n            }\n          }\n        };\n        _this._onKeyDown = function(ev, theme) {\n          if (_this._portalContainsElement(ev.target)) {\n            return;\n          }\n          var _a22 = _this.props, direction = _a22.direction, disabled = _a22.disabled, isInnerZoneKeystroke = _a22.isInnerZoneKeystroke, pagingSupportDisabled = _a22.pagingSupportDisabled, shouldEnterInnerZone = _a22.shouldEnterInnerZone;\n          if (disabled) {\n            return;\n          }\n          if (_this.props.onKeyDown) {\n            _this.props.onKeyDown(ev);\n          }\n          if (ev.isDefaultPrevented()) {\n            return;\n          }\n          if (_this._getDocument().activeElement === _this._root.current && _this._isInnerZone) {\n            return;\n          }\n          if ((shouldEnterInnerZone && shouldEnterInnerZone(ev) || isInnerZoneKeystroke && isInnerZoneKeystroke(ev)) && _this._isImmediateDescendantOfZone(ev.target)) {\n            var innerZone = _this._getFirstInnerZone();\n            if (innerZone) {\n              if (!innerZone.focus(true)) {\n                return;\n              }\n            } else if (isElementFocusSubZone(ev.target)) {\n              if (!_this.focusElement(getNextElement(ev.target, ev.target.firstChild, true))) {\n                return;\n              }\n            } else {\n              return;\n            }\n          } else if (ev.altKey) {\n            return;\n          } else {\n            switch (ev.which) {\n              case KeyCodes.space:\n                if (_this._shouldRaiseClicksOnSpace && _this._tryInvokeClickForFocusable(ev.target, ev)) {\n                  break;\n                }\n                return;\n              case KeyCodes.left:\n                if (direction !== FocusZoneDirection.vertical) {\n                  _this._preventDefaultWhenHandled(ev);\n                  if (_this._moveFocusLeft(theme)) {\n                    break;\n                  }\n                }\n                return;\n              case KeyCodes.right:\n                if (direction !== FocusZoneDirection.vertical) {\n                  _this._preventDefaultWhenHandled(ev);\n                  if (_this._moveFocusRight(theme)) {\n                    break;\n                  }\n                }\n                return;\n              case KeyCodes.up:\n                if (direction !== FocusZoneDirection.horizontal) {\n                  _this._preventDefaultWhenHandled(ev);\n                  if (_this._moveFocusUp()) {\n                    break;\n                  }\n                }\n                return;\n              case KeyCodes.down:\n                if (direction !== FocusZoneDirection.horizontal) {\n                  _this._preventDefaultWhenHandled(ev);\n                  if (_this._moveFocusDown()) {\n                    break;\n                  }\n                }\n                return;\n              case KeyCodes.pageDown:\n                if (!pagingSupportDisabled && _this._moveFocusPaging(true)) {\n                  break;\n                }\n                return;\n              case KeyCodes.pageUp:\n                if (!pagingSupportDisabled && _this._moveFocusPaging(false)) {\n                  break;\n                }\n                return;\n              case KeyCodes.tab:\n                if (\n                  // eslint-disable-next-line @typescript-eslint/no-deprecated\n                  _this.props.allowTabKey || _this.props.handleTabKey === FocusZoneTabbableElements.all || _this.props.handleTabKey === FocusZoneTabbableElements.inputOnly && _this._isElementInput(ev.target)\n                ) {\n                  var focusChanged = false;\n                  _this._processingTabKey = true;\n                  if (direction === FocusZoneDirection.vertical || !_this._shouldWrapFocus(_this._activeElement, NO_HORIZONTAL_WRAP)) {\n                    focusChanged = ev.shiftKey ? _this._moveFocusUp() : _this._moveFocusDown();\n                  } else {\n                    var tabWithDirection = getRTL(theme) ? !ev.shiftKey : ev.shiftKey;\n                    focusChanged = tabWithDirection ? _this._moveFocusLeft(theme) : _this._moveFocusRight(theme);\n                  }\n                  _this._processingTabKey = false;\n                  if (focusChanged) {\n                    break;\n                  } else if (_this.props.shouldResetActiveElementWhenTabFromZone) {\n                    _this._activeElement = null;\n                  }\n                }\n                return;\n              case KeyCodes.home:\n                if (_this._isContentEditableElement(ev.target) || _this._isElementInput(ev.target) && !_this._shouldInputLoseFocus(ev.target, false)) {\n                  return false;\n                }\n                var firstChild = _this._root.current && _this._root.current.firstChild;\n                if (_this._root.current && firstChild && _this.focusElement(getNextElement(_this._root.current, firstChild, true))) {\n                  break;\n                }\n                return;\n              case KeyCodes.end:\n                if (_this._isContentEditableElement(ev.target) || _this._isElementInput(ev.target) && !_this._shouldInputLoseFocus(ev.target, true)) {\n                  return false;\n                }\n                var lastChild = _this._root.current && _this._root.current.lastChild;\n                if (_this._root.current && _this.focusElement(getPreviousElement(_this._root.current, lastChild, true, true, true))) {\n                  break;\n                }\n                return;\n              case KeyCodes.enter:\n                if (_this._shouldRaiseClicksOnEnter && _this._tryInvokeClickForFocusable(ev.target, ev)) {\n                  break;\n                }\n                return;\n              default:\n                return;\n            }\n          }\n          ev.preventDefault();\n          ev.stopPropagation();\n        };\n        _this._getHorizontalDistanceFromCenter = function(isForward, activeRect, targetRect) {\n          var leftAlignment = _this._focusAlignment.left || _this._focusAlignment.x || 0;\n          var targetRectTop = Math.floor(targetRect.top);\n          var activeRectBottom = Math.floor(activeRect.bottom);\n          var targetRectBottom = Math.floor(targetRect.bottom);\n          var activeRectTop = Math.floor(activeRect.top);\n          var isValidCandidateOnpagingDown = isForward && targetRectTop > activeRectBottom;\n          var isValidCandidateOnpagingUp = !isForward && targetRectBottom < activeRectTop;\n          if (isValidCandidateOnpagingDown || isValidCandidateOnpagingUp) {\n            if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) {\n              return 0;\n            }\n            return Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n          }\n          if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) {\n            return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n          }\n          return LARGE_DISTANCE_FROM_CENTER;\n        };\n        initializeComponentRef(_this);\n        _this._id = getId(\"FocusZone\");\n        _this._focusAlignment = {\n          left: 0,\n          top: 0\n        };\n        _this._processingTabKey = false;\n        var shouldRaiseClicksFallback = (_b2 = (_a2 = props.shouldRaiseClicks) !== null && _a2 !== void 0 ? _a2 : FocusZone2.defaultProps.shouldRaiseClicks) !== null && _b2 !== void 0 ? _b2 : true;\n        _this._shouldRaiseClicksOnEnter = (_c2 = props.shouldRaiseClicksOnEnter) !== null && _c2 !== void 0 ? _c2 : shouldRaiseClicksFallback;\n        _this._shouldRaiseClicksOnSpace = (_d2 = props.shouldRaiseClicksOnSpace) !== null && _d2 !== void 0 ? _d2 : shouldRaiseClicksFallback;\n        return _this;\n      }\n      FocusZone2.getOuterZones = function() {\n        return _outerZones.size;\n      };\n      FocusZone2._onKeyDownCapture = function(ev) {\n        if (ev.which === KeyCodes.tab) {\n          _outerZones.forEach(function(zone) {\n            return zone._updateTabIndexes();\n          });\n        }\n      };\n      FocusZone2.prototype.componentDidMount = function() {\n        var _a2;\n        var root = this._root.current;\n        this._inShadowRoot = !!((_a2 = this.context) === null || _a2 === void 0 ? void 0 : _a2.shadowRoot);\n        _allInstances[this._id] = this;\n        if (root) {\n          var parentElement = getParent(root, ALLOW_VIRTUAL_ELEMENTS);\n          while (parentElement && parentElement !== this._getDocument().body && parentElement.nodeType === 1) {\n            if (isElementFocusZone(parentElement)) {\n              this._isInnerZone = true;\n              break;\n            }\n            parentElement = getParent(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n          }\n          if (!this._isInnerZone) {\n            _outerZones.add(this);\n            this._root.current && this._root.current.addEventListener(\"keydown\", FocusZone2._onKeyDownCapture, true);\n          }\n          this._root.current && this._root.current.addEventListener(\"blur\", this._onBlur, true);\n          this._updateTabIndexes();\n          if (this.props.defaultTabbableElement && typeof this.props.defaultTabbableElement === \"string\") {\n            this._activeElement = this._getDocument().querySelector(this.props.defaultTabbableElement);\n          } else if (this.props.defaultActiveElement) {\n            this._activeElement = this._getDocument().querySelector(this.props.defaultActiveElement);\n          }\n          if (this.props.shouldFocusOnMount) {\n            this.focus();\n          }\n        }\n      };\n      FocusZone2.prototype.componentDidUpdate = function() {\n        var _a2;\n        var root = this._root.current;\n        var doc = this._getDocument();\n        this._inShadowRoot = !!((_a2 = this.context) === null || _a2 === void 0 ? void 0 : _a2.shadowRoot);\n        if (this._activeElement && !elementContains(this._root.current, this._activeElement, ALLOW_VIRTUAL_ELEMENTS) || this._defaultFocusElement && !elementContains(this._root.current, this._defaultFocusElement, ALLOW_VIRTUAL_ELEMENTS)) {\n          this._activeElement = null;\n          this._defaultFocusElement = null;\n          this._updateTabIndexes();\n        }\n        if (!this.props.preventFocusRestoration && doc && this._lastIndexPath && (doc.activeElement === doc.body || doc.activeElement === null || doc.activeElement === root)) {\n          var elementToFocus = getFocusableByIndexPath(root, this._lastIndexPath);\n          if (elementToFocus) {\n            this._setActiveElement(elementToFocus, true);\n            elementToFocus.focus();\n            this._setParkedFocus(false);\n          } else {\n            this._setParkedFocus(true);\n          }\n        }\n      };\n      FocusZone2.prototype.componentWillUnmount = function() {\n        delete _allInstances[this._id];\n        if (!this._isInnerZone) {\n          _outerZones.delete(this);\n          this._root.current && this._root.current.removeEventListener(\"keydown\", FocusZone2._onKeyDownCapture, true);\n        }\n        if (this._root.current) {\n          this._root.current.removeEventListener(\"blur\", this._onBlur, true);\n        }\n        this._activeElement = null;\n        this._defaultFocusElement = null;\n      };\n      FocusZone2.prototype.render = function() {\n        var _this = this;\n        var _a2 = this.props, tag = _a2.as, elementType = _a2.elementType, rootProps = _a2.rootProps, ariaDescribedBy = _a2.ariaDescribedBy, ariaLabelledBy = _a2.ariaLabelledBy, className2 = _a2.className;\n        var divProps = getNativeProps(this.props, htmlElementProperties);\n        var Tag = tag || elementType || \"div\";\n        this._evaluateFocusBeforeRender();\n        var theme = getTheme();\n        return React__namespace.createElement(Tag, __assign$1({ \"aria-labelledby\": ariaLabelledBy, \"aria-describedby\": ariaDescribedBy }, divProps, rootProps, {\n          // Once the getClassName correctly memoizes inputs this should\n          // be replaced so that className is passed to getRootClass and is included there so\n          // the class names will always be in the same order.\n          className: css(getRootClass(), className2),\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          ref: this._mergedRef(this.props.elementRef, this._root),\n          \"data-focuszone-id\": this._id,\n          // eslint-disable-next-line react/jsx-no-bind\n          onKeyDown: function(ev) {\n            return _this._onKeyDown(ev, theme);\n          },\n          onFocus: this._onFocus,\n          onMouseDownCapture: this._onMouseDown\n        }), this.props.children);\n      };\n      FocusZone2.prototype.focus = function(forceIntoFirstElement, bypassHiddenElements) {\n        if (forceIntoFirstElement === void 0) {\n          forceIntoFirstElement = false;\n        }\n        if (bypassHiddenElements === void 0) {\n          bypassHiddenElements = false;\n        }\n        if (this._root.current) {\n          if (!forceIntoFirstElement && this._root.current.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\" && this._isInnerZone) {\n            var ownerZoneElement = this._getOwnerZone(this._root.current);\n            if (ownerZoneElement !== this._root.current) {\n              var ownerZone = _allInstances[ownerZoneElement.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n              return !!ownerZone && ownerZone.focusElement(this._root.current);\n            }\n            return false;\n          } else if (!forceIntoFirstElement && this._activeElement && elementContains(this._root.current, this._activeElement) && isElementTabbable(this._activeElement, void 0, this._inShadowRoot) && (!bypassHiddenElements || isElementVisibleAndNotHidden(this._activeElement))) {\n            this._activeElement.focus();\n            return true;\n          } else {\n            var firstChild = this._root.current.firstChild;\n            return this.focusElement(getNextElement(this._root.current, firstChild, true, void 0, void 0, void 0, void 0, void 0, bypassHiddenElements));\n          }\n        }\n        return false;\n      };\n      FocusZone2.prototype.focusLast = function() {\n        if (this._root.current) {\n          var lastChild = this._root.current && this._root.current.lastChild;\n          return this.focusElement(getPreviousElement(this._root.current, lastChild, true, true, true));\n        }\n        return false;\n      };\n      FocusZone2.prototype.focusElement = function(element2, forceAlignment) {\n        var _a2 = this.props, onBeforeFocus = _a2.onBeforeFocus, shouldReceiveFocus = _a2.shouldReceiveFocus;\n        if (shouldReceiveFocus && !shouldReceiveFocus(element2) || onBeforeFocus && !onBeforeFocus(element2)) {\n          return false;\n        }\n        if (element2) {\n          this._setActiveElement(element2, forceAlignment);\n          if (this._activeElement) {\n            this._activeElement.focus();\n          }\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype.setFocusAlignment = function(point2) {\n        this._focusAlignment = point2;\n      };\n      Object.defineProperty(FocusZone2.prototype, \"defaultFocusElement\", {\n        get: function() {\n          return this._defaultFocusElement;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(FocusZone2.prototype, \"activeElement\", {\n        get: function() {\n          return this._activeElement;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      FocusZone2.prototype._evaluateFocusBeforeRender = function() {\n        var root = this._root.current;\n        var doc = this._getDocument();\n        if (doc) {\n          var focusedElement = doc.activeElement;\n          if (focusedElement !== root) {\n            var shouldRestoreFocus = elementContains(root, focusedElement, false);\n            this._lastIndexPath = shouldRestoreFocus ? getElementIndexPath(root, focusedElement) : void 0;\n          }\n        }\n      };\n      FocusZone2.prototype._setParkedFocus = function(isParked) {\n        var root = this._root.current;\n        if (root && this._isParked !== isParked) {\n          this._isParked = isParked;\n          if (isParked) {\n            if (!this.props.allowFocusRoot) {\n              this._parkedTabIndex = root.getAttribute(\"tabindex\");\n              root.setAttribute(\"tabindex\", \"-1\");\n            }\n            root.focus();\n          } else if (!this.props.allowFocusRoot) {\n            if (this._parkedTabIndex) {\n              root.setAttribute(\"tabindex\", this._parkedTabIndex);\n              this._parkedTabIndex = void 0;\n            } else {\n              root.removeAttribute(\"tabindex\");\n            }\n          }\n        }\n      };\n      FocusZone2.prototype._setActiveElement = function(element2, forceAlignment) {\n        var previousActiveElement = this._activeElement;\n        this._activeElement = element2;\n        if (previousActiveElement) {\n          if (isElementFocusZone(previousActiveElement)) {\n            this._updateTabIndexes(previousActiveElement);\n          }\n          previousActiveElement.tabIndex = -1;\n        }\n        if (this._activeElement) {\n          if (!this._focusAlignment || forceAlignment) {\n            this._setFocusAlignment(element2, true, true);\n          }\n          this._activeElement.tabIndex = 0;\n        }\n      };\n      FocusZone2.prototype._preventDefaultWhenHandled = function(ev) {\n        this.props.preventDefaultWhenHandled && ev.preventDefault();\n      };\n      FocusZone2.prototype._tryInvokeClickForFocusable = function(targetElement, ev) {\n        var target2 = targetElement;\n        if (target2 === this._root.current) {\n          return false;\n        }\n        do {\n          if (target2.tagName === \"BUTTON\" || target2.tagName === \"A\" || target2.tagName === \"INPUT\" || target2.tagName === \"TEXTAREA\" || target2.tagName === \"SUMMARY\") {\n            return false;\n          }\n          if (this._isImmediateDescendantOfZone(target2) && target2.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\" && target2.getAttribute(IS_ENTER_DISABLED_ATTRIBUTE) !== \"true\") {\n            raiseClickFromKeyboardEvent(target2, ev);\n            return true;\n          }\n          target2 = getParent(target2, ALLOW_VIRTUAL_ELEMENTS);\n        } while (target2 !== this._root.current);\n        return false;\n      };\n      FocusZone2.prototype._getFirstInnerZone = function(rootElement) {\n        rootElement = rootElement || this._activeElement || this._root.current;\n        if (!rootElement) {\n          return null;\n        }\n        if (isElementFocusZone(rootElement)) {\n          return _allInstances[rootElement.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n        }\n        var child = rootElement.firstElementChild;\n        while (child) {\n          if (isElementFocusZone(child)) {\n            return _allInstances[child.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n          }\n          var match2 = this._getFirstInnerZone(child);\n          if (match2) {\n            return match2;\n          }\n          child = child.nextElementSibling;\n        }\n        return null;\n      };\n      FocusZone2.prototype._moveFocus = function(isForward, getDistanceFromCenter, ev, useDefaultWrap) {\n        if (useDefaultWrap === void 0) {\n          useDefaultWrap = true;\n        }\n        var element2 = this._activeElement;\n        var candidateDistance = -1;\n        var candidateElement = void 0;\n        var changedFocus = false;\n        var isBidirectional = this.props.direction === FocusZoneDirection.bidirectional;\n        if (!element2 || !this._root.current) {\n          return false;\n        }\n        if (this._isElementInput(element2)) {\n          if (!this._shouldInputLoseFocus(element2, isForward)) {\n            return false;\n          }\n        }\n        var activeRect = isBidirectional ? element2.getBoundingClientRect() : null;\n        do {\n          element2 = isForward ? getNextElement(this._root.current, element2) : getPreviousElement(this._root.current, element2);\n          if (isBidirectional) {\n            if (element2) {\n              var targetRect = element2.getBoundingClientRect();\n              var elementDistance = getDistanceFromCenter(activeRect, targetRect);\n              if (elementDistance === -1 && candidateDistance === -1) {\n                candidateElement = element2;\n                break;\n              }\n              if (elementDistance > -1 && (candidateDistance === -1 || elementDistance < candidateDistance)) {\n                candidateDistance = elementDistance;\n                candidateElement = element2;\n              }\n              if (candidateDistance >= 0 && elementDistance < 0) {\n                break;\n              }\n            }\n          } else {\n            candidateElement = element2;\n            break;\n          }\n        } while (element2);\n        if (candidateElement && candidateElement !== this._activeElement) {\n          changedFocus = true;\n          this.focusElement(candidateElement);\n        } else if (this.props.isCircularNavigation && useDefaultWrap) {\n          if (isForward) {\n            return this.focusElement(getNextElement(this._root.current, this._root.current.firstElementChild, true));\n          } else {\n            return this.focusElement(getPreviousElement(this._root.current, this._root.current.lastElementChild, true, true, true));\n          }\n        }\n        return changedFocus;\n      };\n      FocusZone2.prototype._moveFocusDown = function() {\n        var _this = this;\n        var targetTop = -1;\n        var leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0;\n        if (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          this._moveFocus(true, function(activeRect, targetRect) {\n            var distance2 = -1;\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectBottom = Math.floor(activeRect.bottom);\n            if (targetRectTop < activeRectBottom) {\n              if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) {\n                return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n              }\n              return LARGE_DISTANCE_FROM_CENTER;\n            }\n            if (targetTop === -1 && targetRectTop >= activeRectBottom || targetRectTop === targetTop) {\n              targetTop = targetRectTop;\n              if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) {\n                distance2 = 0;\n              } else {\n                distance2 = Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n              }\n            }\n            return distance2;\n          })\n        ) {\n          this._setFocusAlignment(this._activeElement, false, true);\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._moveFocusUp = function() {\n        var _this = this;\n        var targetTop = -1;\n        var leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0;\n        if (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          this._moveFocus(false, function(activeRect, targetRect) {\n            var distance2 = -1;\n            var targetRectBottom = Math.floor(targetRect.bottom);\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectTop = Math.floor(activeRect.top);\n            if (targetRectBottom > activeRectTop) {\n              if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) {\n                return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n              }\n              return LARGE_DISTANCE_FROM_CENTER;\n            }\n            if (targetTop === -1 && targetRectBottom <= activeRectTop || targetRectTop === targetTop) {\n              targetTop = targetRectTop;\n              if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) {\n                distance2 = 0;\n              } else {\n                distance2 = Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n              }\n            }\n            return distance2;\n          })\n        ) {\n          this._setFocusAlignment(this._activeElement, false, true);\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._moveFocusLeft = function(theme) {\n        var _this = this;\n        var shouldWrap = this._shouldWrapFocus(this._activeElement, NO_HORIZONTAL_WRAP);\n        if (this._moveFocus(\n          getRTL(theme),\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          function(activeRect, targetRect) {\n            var distance2 = -1;\n            var topBottomComparison;\n            if (getRTL(theme)) {\n              topBottomComparison = parseFloat(targetRect.top.toFixed(3)) < parseFloat(activeRect.bottom.toFixed(3));\n            } else {\n              topBottomComparison = parseFloat(targetRect.bottom.toFixed(3)) > parseFloat(activeRect.top.toFixed(3));\n            }\n            if (topBottomComparison && targetRect.right <= activeRect.right && _this.props.direction !== FocusZoneDirection.vertical) {\n              distance2 = activeRect.right - targetRect.right;\n            } else if (!shouldWrap) {\n              distance2 = LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n            }\n            return distance2;\n          },\n          void 0,\n          shouldWrap\n        )) {\n          this._setFocusAlignment(this._activeElement, true, false);\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._moveFocusRight = function(theme) {\n        var _this = this;\n        var shouldWrap = this._shouldWrapFocus(this._activeElement, NO_HORIZONTAL_WRAP);\n        if (this._moveFocus(\n          !getRTL(theme),\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          function(activeRect, targetRect) {\n            var distance2 = -1;\n            var topBottomComparison;\n            if (getRTL(theme)) {\n              topBottomComparison = parseFloat(targetRect.bottom.toFixed(3)) > parseFloat(activeRect.top.toFixed(3));\n            } else {\n              topBottomComparison = parseFloat(targetRect.top.toFixed(3)) < parseFloat(activeRect.bottom.toFixed(3));\n            }\n            if (topBottomComparison && targetRect.left >= activeRect.left && _this.props.direction !== FocusZoneDirection.vertical) {\n              distance2 = targetRect.left - activeRect.left;\n            } else if (!shouldWrap) {\n              distance2 = LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n            }\n            return distance2;\n          },\n          void 0,\n          shouldWrap\n        )) {\n          this._setFocusAlignment(this._activeElement, true, false);\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._moveFocusPaging = function(isForward, useDefaultWrap) {\n        if (useDefaultWrap === void 0) {\n          useDefaultWrap = true;\n        }\n        var element2 = this._activeElement;\n        if (!element2 || !this._root.current) {\n          return false;\n        }\n        if (this._isElementInput(element2)) {\n          if (!this._shouldInputLoseFocus(element2, isForward)) {\n            return false;\n          }\n        }\n        var scrollableParent = findScrollableParent(element2);\n        if (!scrollableParent) {\n          return false;\n        }\n        var candidateDistance = -1;\n        var candidateElement = void 0;\n        var targetTop = -1;\n        var targetBottom = -1;\n        var pagesize = scrollableParent.clientHeight;\n        var activeRect = element2.getBoundingClientRect();\n        do {\n          element2 = isForward ? getNextElement(this._root.current, element2) : getPreviousElement(this._root.current, element2);\n          if (element2) {\n            var targetRect = element2.getBoundingClientRect();\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectBottom = Math.floor(activeRect.bottom);\n            var targetRectBottom = Math.floor(targetRect.bottom);\n            var activeRectTop = Math.floor(activeRect.top);\n            var elementDistance = this._getHorizontalDistanceFromCenter(isForward, activeRect, targetRect);\n            var isElementPassedPageSizeOnPagingDown = isForward && targetRectTop > activeRectBottom + pagesize;\n            var isElementPassedPageSizeOnPagingUp = !isForward && targetRectBottom < activeRectTop - pagesize;\n            if (isElementPassedPageSizeOnPagingDown || isElementPassedPageSizeOnPagingUp) {\n              break;\n            }\n            if (elementDistance > -1) {\n              if (isForward && targetRectTop > targetTop) {\n                targetTop = targetRectTop;\n                candidateDistance = elementDistance;\n                candidateElement = element2;\n              } else if (!isForward && targetRectBottom < targetBottom) {\n                targetBottom = targetRectBottom;\n                candidateDistance = elementDistance;\n                candidateElement = element2;\n              } else if (candidateDistance === -1 || elementDistance <= candidateDistance) {\n                candidateDistance = elementDistance;\n                candidateElement = element2;\n              }\n            }\n          }\n        } while (element2);\n        var changedFocus = false;\n        if (candidateElement && candidateElement !== this._activeElement) {\n          changedFocus = true;\n          this.focusElement(candidateElement);\n          this._setFocusAlignment(candidateElement, false, true);\n        } else if (this.props.isCircularNavigation && useDefaultWrap) {\n          if (isForward) {\n            return this.focusElement(getNextElement(this._root.current, this._root.current.firstElementChild, true));\n          }\n          return this.focusElement(getPreviousElement(this._root.current, this._root.current.lastElementChild, true, true, true));\n        }\n        return changedFocus;\n      };\n      FocusZone2.prototype._setFocusAlignment = function(element2, isHorizontal, isVertical) {\n        if (this.props.direction === FocusZoneDirection.bidirectional && (!this._focusAlignment || isHorizontal || isVertical)) {\n          var rect2 = element2.getBoundingClientRect();\n          var left = rect2.left + rect2.width / 2;\n          var top_1 = rect2.top + rect2.height / 2;\n          if (!this._focusAlignment) {\n            this._focusAlignment = { left, top: top_1 };\n          }\n          if (isHorizontal) {\n            this._focusAlignment.left = left;\n          }\n          if (isVertical) {\n            this._focusAlignment.top = top_1;\n          }\n        }\n      };\n      FocusZone2.prototype._isImmediateDescendantOfZone = function(element2) {\n        return this._getOwnerZone(element2) === this._root.current;\n      };\n      FocusZone2.prototype._getOwnerZone = function(element2) {\n        var parentElement = getParent(element2, ALLOW_VIRTUAL_ELEMENTS);\n        while (parentElement && parentElement !== this._root.current && parentElement !== this._getDocument().body) {\n          if (isElementFocusZone(parentElement)) {\n            return parentElement;\n          }\n          parentElement = getParent(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n        }\n        return parentElement;\n      };\n      FocusZone2.prototype._updateTabIndexes = function(element2) {\n        if (!this._activeElement && this.props.defaultTabbableElement && typeof this.props.defaultTabbableElement === \"function\") {\n          this._activeElement = this.props.defaultTabbableElement(this._root.current);\n        }\n        if (!element2 && this._root.current) {\n          this._defaultFocusElement = null;\n          element2 = this._root.current;\n          if (this._activeElement && !elementContains(element2, this._activeElement)) {\n            this._activeElement = null;\n          }\n        }\n        if (this._activeElement && !isElementTabbable(this._activeElement, void 0, this._inShadowRoot)) {\n          this._activeElement = null;\n        }\n        var childNodes = element2 && element2.children;\n        for (var childIndex = 0; childNodes && childIndex < childNodes.length; childIndex++) {\n          var child = childNodes[childIndex];\n          if (!isElementFocusZone(child)) {\n            if (child.getAttribute && child.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"false\") {\n              child.setAttribute(TABINDEX, \"-1\");\n            }\n            if (isElementTabbable(child, void 0, this._inShadowRoot)) {\n              if (this.props.disabled) {\n                child.setAttribute(TABINDEX, \"-1\");\n              } else if (!this._isInnerZone && (!this._activeElement && !this._defaultFocusElement || this._activeElement === child)) {\n                this._defaultFocusElement = child;\n                if (child.getAttribute(TABINDEX) !== \"0\") {\n                  child.setAttribute(TABINDEX, \"0\");\n                }\n              } else if (child.getAttribute(TABINDEX) !== \"-1\") {\n                child.setAttribute(TABINDEX, \"-1\");\n              }\n            } else if (child.tagName === \"svg\" && child.getAttribute(\"focusable\") !== \"false\") {\n              child.setAttribute(\"focusable\", \"false\");\n            }\n          } else if (child.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\") {\n            if (!this._isInnerZone && (!this._activeElement && !this._defaultFocusElement || this._activeElement === child)) {\n              this._defaultFocusElement = child;\n              if (child.getAttribute(TABINDEX) !== \"0\") {\n                child.setAttribute(TABINDEX, \"0\");\n              }\n            } else if (child.getAttribute(TABINDEX) !== \"-1\") {\n              child.setAttribute(TABINDEX, \"-1\");\n            }\n          }\n          this._updateTabIndexes(child);\n        }\n      };\n      FocusZone2.prototype._isContentEditableElement = function(element2) {\n        return element2 && element2.getAttribute(\"contenteditable\") === \"true\";\n      };\n      FocusZone2.prototype._isElementInput = function(element2) {\n        if (element2 && element2.tagName && (element2.tagName.toLowerCase() === \"input\" || element2.tagName.toLowerCase() === \"textarea\")) {\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._shouldInputLoseFocus = function(element2, isForward) {\n        if (!this._processingTabKey && element2 && element2.type && ALLOWED_INPUT_TYPES.indexOf(element2.type.toLowerCase()) > -1) {\n          var selectionStart = element2.selectionStart;\n          var selectionEnd = element2.selectionEnd;\n          var isRangeSelected = selectionStart !== selectionEnd;\n          var inputValue = element2.value;\n          var isReadonly = element2.readOnly;\n          if (isRangeSelected || selectionStart > 0 && !isForward && !isReadonly || selectionStart !== inputValue.length && isForward && !isReadonly || !!this.props.handleTabKey && !(this.props.shouldInputLoseFocusOnArrowKey && this.props.shouldInputLoseFocusOnArrowKey(element2))) {\n            return false;\n          }\n        }\n        return true;\n      };\n      FocusZone2.prototype._shouldWrapFocus = function(element2, noWrapDataAttribute) {\n        return this.props.checkForNoWrap ? shouldWrapFocus(element2, noWrapDataAttribute) : true;\n      };\n      FocusZone2.prototype._portalContainsElement = function(element2) {\n        return element2 && !!this._root.current && portalContainsElement(element2, this._root.current);\n      };\n      FocusZone2.prototype._getDocument = function() {\n        return getDocument(this._root.current);\n      };\n      FocusZone2.defaultProps = {\n        isCircularNavigation: false,\n        direction: FocusZoneDirection.bidirectional,\n        shouldRaiseClicks: true,\n        // Hardcoding uncontrolled flag for proper interop with FluentUI V9.\n        \"data-tabster\": '{\"uncontrolled\": {}}'\n      };\n      FocusZone2.contextType = MergeStylesShadowRootContext;\n      return FocusZone2;\n    })(React__namespace.Component)\n  );\n  function getIsChecked(item) {\n    if (item.canCheck) {\n      return !!(item.isChecked || item.checked);\n    }\n    if (typeof item.isChecked === \"boolean\") {\n      return item.isChecked;\n    }\n    if (typeof item.checked === \"boolean\") {\n      return item.checked;\n    }\n    return null;\n  }\n  function hasSubmenu(item) {\n    return !!(item.subMenuProps || item.items);\n  }\n  function isItemDisabled(item) {\n    return !!(item.isDisabled || item.disabled);\n  }\n  function getMenuItemAriaRole(item) {\n    var isChecked = getIsChecked(item);\n    var canCheck = isChecked !== null;\n    return canCheck ? \"menuitemcheckbox\" : \"menuitem\";\n  }\n  var RectangleEdge;\n  (function(RectangleEdge2) {\n    RectangleEdge2[RectangleEdge2[\"top\"] = 1] = \"top\";\n    RectangleEdge2[RectangleEdge2[\"bottom\"] = -1] = \"bottom\";\n    RectangleEdge2[RectangleEdge2[\"left\"] = 2] = \"left\";\n    RectangleEdge2[RectangleEdge2[\"right\"] = -2] = \"right\";\n  })(RectangleEdge || (RectangleEdge = {}));\n  var Position;\n  (function(Position2) {\n    Position2[Position2[\"top\"] = 0] = \"top\";\n    Position2[Position2[\"bottom\"] = 1] = \"bottom\";\n    Position2[Position2[\"start\"] = 2] = \"start\";\n    Position2[Position2[\"end\"] = 3] = \"end\";\n  })(Position || (Position = {}));\n  var _a$4;\n  function _createPositionData(targetEdge, alignmentEdge, isAuto) {\n    return {\n      targetEdge,\n      alignmentEdge,\n      isAuto\n    };\n  }\n  var DirectionalDictionary = (_a$4 = {}, _a$4[DirectionalHint.topLeftEdge] = _createPositionData(RectangleEdge.top, RectangleEdge.left), _a$4[DirectionalHint.topCenter] = _createPositionData(RectangleEdge.top), _a$4[DirectionalHint.topRightEdge] = _createPositionData(RectangleEdge.top, RectangleEdge.right), _a$4[DirectionalHint.topAutoEdge] = _createPositionData(RectangleEdge.top, void 0, true), _a$4[DirectionalHint.bottomLeftEdge] = _createPositionData(RectangleEdge.bottom, RectangleEdge.left), _a$4[DirectionalHint.bottomCenter] = _createPositionData(RectangleEdge.bottom), _a$4[DirectionalHint.bottomRightEdge] = _createPositionData(RectangleEdge.bottom, RectangleEdge.right), _a$4[DirectionalHint.bottomAutoEdge] = _createPositionData(RectangleEdge.bottom, void 0, true), _a$4[DirectionalHint.leftTopEdge] = _createPositionData(RectangleEdge.left, RectangleEdge.top), _a$4[DirectionalHint.leftCenter] = _createPositionData(RectangleEdge.left), _a$4[DirectionalHint.leftBottomEdge] = _createPositionData(RectangleEdge.left, RectangleEdge.bottom), _a$4[DirectionalHint.rightTopEdge] = _createPositionData(RectangleEdge.right, RectangleEdge.top), _a$4[DirectionalHint.rightCenter] = _createPositionData(RectangleEdge.right), _a$4[DirectionalHint.rightBottomEdge] = _createPositionData(RectangleEdge.right, RectangleEdge.bottom), _a$4);\n  function _isRectangleWithinBounds(rect2, boundingRect) {\n    if (rect2.top < boundingRect.top) {\n      return false;\n    }\n    if (rect2.bottom > boundingRect.bottom) {\n      return false;\n    }\n    if (rect2.left < boundingRect.left) {\n      return false;\n    }\n    if (rect2.right > boundingRect.right) {\n      return false;\n    }\n    return true;\n  }\n  function _getOutOfBoundsEdges(rect2, boundingRect) {\n    var outOfBounds2 = [];\n    if (rect2.top < boundingRect.top) {\n      outOfBounds2.push(RectangleEdge.top);\n    }\n    if (rect2.bottom > boundingRect.bottom) {\n      outOfBounds2.push(RectangleEdge.bottom);\n    }\n    if (rect2.left < boundingRect.left) {\n      outOfBounds2.push(RectangleEdge.left);\n    }\n    if (rect2.right > boundingRect.right) {\n      outOfBounds2.push(RectangleEdge.right);\n    }\n    return outOfBounds2;\n  }\n  function _getEdgeValue(rect2, edge) {\n    return rect2[RectangleEdge[edge]];\n  }\n  function _setEdgeValue(rect2, edge, value2) {\n    rect2[RectangleEdge[edge]] = value2;\n    return rect2;\n  }\n  function _getCenterValue(rect2, edge) {\n    var edges = _getFlankingEdges(edge);\n    return (_getEdgeValue(rect2, edges.positiveEdge) + _getEdgeValue(rect2, edges.negativeEdge)) / 2;\n  }\n  function _getRelativeEdgeValue(edge, value2) {\n    if (edge > 0) {\n      return value2;\n    } else {\n      return value2 * -1;\n    }\n  }\n  function _getRelativeRectEdgeValue(edge, rect2) {\n    return _getRelativeEdgeValue(edge, _getEdgeValue(rect2, edge));\n  }\n  function _getRelativeEdgeDifference(rect2, hostRect, edge) {\n    var edgeDifference = _getEdgeValue(rect2, edge) - _getEdgeValue(hostRect, edge);\n    return _getRelativeEdgeValue(edge, edgeDifference);\n  }\n  function _moveEdge(rect2, edge, newValue, maintainSize) {\n    if (maintainSize === void 0) {\n      maintainSize = true;\n    }\n    var difference = _getEdgeValue(rect2, edge) - newValue;\n    var returnRect = _setEdgeValue(rect2, edge, newValue);\n    if (maintainSize) {\n      returnRect = _setEdgeValue(rect2, edge * -1, _getEdgeValue(rect2, edge * -1) - difference);\n    }\n    return returnRect;\n  }\n  function _alignEdges(rect2, target2, edge, gap) {\n    if (gap === void 0) {\n      gap = 0;\n    }\n    return _moveEdge(rect2, edge, _getEdgeValue(target2, edge) + _getRelativeEdgeValue(edge, gap));\n  }\n  function _alignOppositeEdges(rect2, target2, targetEdge, gap) {\n    if (gap === void 0) {\n      gap = 0;\n    }\n    var oppositeEdge = targetEdge * -1;\n    var adjustedGap = _getRelativeEdgeValue(oppositeEdge, gap);\n    return _moveEdge(rect2, targetEdge * -1, _getEdgeValue(target2, targetEdge) + adjustedGap);\n  }\n  function _isEdgeInBounds(rect2, bounds2, edge) {\n    var adjustedRectValue = _getRelativeRectEdgeValue(edge, rect2);\n    return adjustedRectValue > _getRelativeRectEdgeValue(edge, bounds2);\n  }\n  function _getOutOfBoundsDegree(rect2, bounds2) {\n    var breakingEdges = _getOutOfBoundsEdges(rect2, bounds2);\n    var total = 0;\n    for (var _i = 0, breakingEdges_1 = breakingEdges; _i < breakingEdges_1.length; _i++) {\n      var edge = breakingEdges_1[_i];\n      total += Math.pow(_getRelativeEdgeDifference(rect2, bounds2, edge), 2);\n    }\n    return total;\n  }\n  function _canScrollResizeToFitEdge(target2, bounding, targetEdge, minimumScrollResizeHeight) {\n    if (minimumScrollResizeHeight === void 0) {\n      minimumScrollResizeHeight = 200;\n    }\n    if (targetEdge !== RectangleEdge.bottom && targetEdge !== RectangleEdge.top) {\n      return false;\n    }\n    return _getRelativeEdgeDifference(target2, bounding, targetEdge) >= minimumScrollResizeHeight;\n  }\n  function _flipToFit(rect2, target2, bounding, positionData, shouldScroll, minimumScrollResizeHeight, gap) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    if (gap === void 0) {\n      gap = 0;\n    }\n    var directions = [\n      RectangleEdge.left,\n      RectangleEdge.right,\n      RectangleEdge.bottom,\n      RectangleEdge.top\n    ];\n    if (getRTL()) {\n      directions[0] *= -1;\n      directions[1] *= -1;\n    }\n    var currentEstimate = rect2;\n    var currentEdge = positionData.targetEdge;\n    var currentAlignment = positionData.alignmentEdge;\n    var oobDegree;\n    var bestEdge = currentEdge;\n    var bestAlignment = currentAlignment;\n    for (var i = 0; i < 4; i++) {\n      if (_isEdgeInBounds(currentEstimate, bounding, currentEdge)) {\n        return {\n          elementRectangle: currentEstimate,\n          targetEdge: currentEdge,\n          alignmentEdge: currentAlignment\n        };\n      } else if (shouldScroll && _canScrollResizeToFitEdge(target2, bounding, currentEdge, minimumScrollResizeHeight)) {\n        switch (currentEdge) {\n          case RectangleEdge.bottom:\n            currentEstimate.bottom = bounding.bottom;\n            break;\n          case RectangleEdge.top:\n            currentEstimate.top = bounding.top;\n            break;\n        }\n        return {\n          elementRectangle: currentEstimate,\n          targetEdge: currentEdge,\n          alignmentEdge: currentAlignment,\n          forcedInBounds: true\n        };\n      } else {\n        var currentOOBDegree = _getOutOfBoundsDegree(currentEstimate, bounding);\n        if (!oobDegree || currentOOBDegree < oobDegree) {\n          oobDegree = currentOOBDegree;\n          bestEdge = currentEdge;\n          bestAlignment = currentAlignment;\n        }\n        directions.splice(directions.indexOf(currentEdge), 1);\n        if (directions.length > 0) {\n          if (directions.indexOf(currentEdge * -1) > -1) {\n            currentEdge = currentEdge * -1;\n          } else {\n            currentAlignment = currentEdge;\n            currentEdge = directions.slice(-1)[0];\n          }\n          currentEstimate = _estimatePosition(rect2, target2, { targetEdge: currentEdge, alignmentEdge: currentAlignment }, gap);\n        }\n      }\n    }\n    currentEstimate = _estimatePosition(rect2, target2, { targetEdge: bestEdge, alignmentEdge: bestAlignment }, gap);\n    return {\n      elementRectangle: currentEstimate,\n      targetEdge: bestEdge,\n      alignmentEdge: bestAlignment\n    };\n  }\n  function _flipAlignmentEdge(elementEstimate, target2, gap, coverTarget) {\n    var alignmentEdge = elementEstimate.alignmentEdge, targetEdge = elementEstimate.targetEdge, elementRectangle = elementEstimate.elementRectangle;\n    var oppositeEdge = alignmentEdge * -1;\n    var newEstimate = _estimatePosition(elementRectangle, target2, { targetEdge, alignmentEdge: oppositeEdge }, gap, coverTarget);\n    return {\n      elementRectangle: newEstimate,\n      targetEdge,\n      alignmentEdge: oppositeEdge\n    };\n  }\n  function _adjustFitWithinBounds(element2, target2, bounding, positionData, shouldScroll, minimumScrollResizeHeight, gap, directionalHintFixed, coverTarget) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    if (gap === void 0) {\n      gap = 0;\n    }\n    var alignmentEdge = positionData.alignmentEdge, alignTargetEdge = positionData.alignTargetEdge;\n    var elementEstimate = {\n      elementRectangle: element2,\n      targetEdge: positionData.targetEdge,\n      alignmentEdge\n    };\n    if (!directionalHintFixed && !coverTarget) {\n      elementEstimate = _flipToFit(element2, target2, bounding, positionData, shouldScroll, minimumScrollResizeHeight, gap);\n    }\n    var outOfBounds2 = _getOutOfBoundsEdges(elementEstimate.elementRectangle, bounding);\n    var fixedEdge = directionalHintFixed ? -elementEstimate.targetEdge : void 0;\n    if (outOfBounds2.length > 0) {\n      if (alignTargetEdge) {\n        if (elementEstimate.alignmentEdge && outOfBounds2.indexOf(elementEstimate.alignmentEdge * -1) > -1) {\n          var flippedElementEstimate = _flipAlignmentEdge(elementEstimate, target2, gap, coverTarget);\n          if (_isRectangleWithinBounds(flippedElementEstimate.elementRectangle, bounding)) {\n            return flippedElementEstimate;\n          } else {\n            elementEstimate = _alignOutOfBoundsEdges(_getOutOfBoundsEdges(flippedElementEstimate.elementRectangle, bounding), elementEstimate, bounding, fixedEdge);\n          }\n        } else {\n          elementEstimate = _alignOutOfBoundsEdges(outOfBounds2, elementEstimate, bounding, fixedEdge);\n        }\n      } else {\n        elementEstimate = _alignOutOfBoundsEdges(outOfBounds2, elementEstimate, bounding, fixedEdge);\n      }\n    }\n    return elementEstimate;\n  }\n  function _alignOutOfBoundsEdges(outOfBoundsEdges, elementEstimate, bounding, preserveEdge) {\n    for (var _i = 0, outOfBoundsEdges_1 = outOfBoundsEdges; _i < outOfBoundsEdges_1.length; _i++) {\n      var direction = outOfBoundsEdges_1[_i];\n      var edgeAttempt = void 0;\n      if (preserveEdge && preserveEdge === direction * -1) {\n        edgeAttempt = _moveEdge(elementEstimate.elementRectangle, direction, _getEdgeValue(bounding, direction), false);\n        elementEstimate.forcedInBounds = true;\n      } else {\n        edgeAttempt = _alignEdges(elementEstimate.elementRectangle, bounding, direction);\n        var inBounds = _isEdgeInBounds(edgeAttempt, bounding, direction * -1);\n        if (!inBounds) {\n          edgeAttempt = _moveEdge(edgeAttempt, direction * -1, _getEdgeValue(bounding, direction * -1), false);\n          elementEstimate.forcedInBounds = true;\n        }\n      }\n      elementEstimate.elementRectangle = edgeAttempt;\n    }\n    return elementEstimate;\n  }\n  function _centerEdgeToPoint(rect2, edge, point2) {\n    var positiveEdge = _getFlankingEdges(edge).positiveEdge;\n    var elementMiddle = _getCenterValue(rect2, edge);\n    var distanceToMiddle = elementMiddle - _getEdgeValue(rect2, positiveEdge);\n    return _moveEdge(rect2, positiveEdge, point2 - distanceToMiddle);\n  }\n  function _estimatePosition(elementToPosition, target2, positionData, gap, coverTarget) {\n    if (gap === void 0) {\n      gap = 0;\n    }\n    var estimatedElementPosition = new Rectangle(elementToPosition.left, elementToPosition.right, elementToPosition.top, elementToPosition.bottom);\n    var alignmentEdge = positionData.alignmentEdge, targetEdge = positionData.targetEdge;\n    var elementEdge = coverTarget ? targetEdge : targetEdge * -1;\n    estimatedElementPosition = coverTarget ? _alignEdges(estimatedElementPosition, target2, targetEdge, gap) : _alignOppositeEdges(estimatedElementPosition, target2, targetEdge, gap);\n    if (!alignmentEdge) {\n      var targetMiddlePoint = _getCenterValue(target2, targetEdge);\n      estimatedElementPosition = _centerEdgeToPoint(estimatedElementPosition, elementEdge, targetMiddlePoint);\n    } else {\n      estimatedElementPosition = _alignEdges(estimatedElementPosition, target2, alignmentEdge);\n    }\n    return estimatedElementPosition;\n  }\n  function _getFlankingEdges(edge) {\n    if (edge === RectangleEdge.top || edge === RectangleEdge.bottom) {\n      return {\n        positiveEdge: RectangleEdge.left,\n        negativeEdge: RectangleEdge.right\n      };\n    } else {\n      return {\n        positiveEdge: RectangleEdge.top,\n        negativeEdge: RectangleEdge.bottom\n      };\n    }\n  }\n  function _finalizeReturnEdge(elementRectangle, returnEdge, bounds2) {\n    if (bounds2 && Math.abs(_getRelativeEdgeDifference(elementRectangle, bounds2, returnEdge)) > Math.abs(_getRelativeEdgeDifference(elementRectangle, bounds2, returnEdge * -1))) {\n      return returnEdge * -1;\n    }\n    return returnEdge;\n  }\n  function _isEdgeOnBounds(elementRectangle, edge, bounds2) {\n    return bounds2 !== void 0 && _getEdgeValue(elementRectangle, edge) === _getEdgeValue(bounds2, edge);\n  }\n  function _finalizeElementPosition(elementRectangle, hostElement, targetEdge, bounds2, alignmentEdge, coverTarget, doNotFinalizeReturnEdge, forceWithinBounds) {\n    var returnValue = {};\n    var hostRect = _getRectangleFromElement(hostElement);\n    var elementEdge = coverTarget ? targetEdge : targetEdge * -1;\n    var returnEdge = alignmentEdge ? alignmentEdge : _getFlankingEdges(targetEdge).positiveEdge;\n    if (!doNotFinalizeReturnEdge || _isEdgeOnBounds(elementRectangle, getOppositeEdge(returnEdge), bounds2)) {\n      returnEdge = _finalizeReturnEdge(elementRectangle, returnEdge, bounds2);\n    }\n    returnValue[RectangleEdge[elementEdge]] = _getRelativeEdgeDifference(elementRectangle, hostRect, elementEdge);\n    returnValue[RectangleEdge[returnEdge]] = _getRelativeEdgeDifference(elementRectangle, hostRect, returnEdge);\n    if (forceWithinBounds) {\n      returnValue[RectangleEdge[elementEdge * -1]] = _getRelativeEdgeDifference(elementRectangle, hostRect, elementEdge * -1);\n      returnValue[RectangleEdge[returnEdge * -1]] = _getRelativeEdgeDifference(elementRectangle, hostRect, returnEdge * -1);\n    }\n    return returnValue;\n  }\n  function _calculateActualBeakWidthInPixels(beakWidth) {\n    return Math.sqrt(beakWidth * beakWidth * 2);\n  }\n  function _getPositionData(directionalHint, directionalHintForRTL, previousPositions) {\n    if (directionalHint === void 0) {\n      directionalHint = DirectionalHint.bottomAutoEdge;\n    }\n    if (previousPositions) {\n      return {\n        alignmentEdge: previousPositions.alignmentEdge,\n        isAuto: previousPositions.isAuto,\n        targetEdge: previousPositions.targetEdge\n      };\n    }\n    var positionInformation = __assign$1({}, DirectionalDictionary[directionalHint]);\n    if (getRTL()) {\n      if (positionInformation.alignmentEdge && positionInformation.alignmentEdge % 2 === 0) {\n        positionInformation.alignmentEdge = positionInformation.alignmentEdge * -1;\n      }\n      return directionalHintForRTL !== void 0 ? DirectionalDictionary[directionalHintForRTL] : positionInformation;\n    }\n    return positionInformation;\n  }\n  function _getAlignmentData(positionData, target2, boundingRect, coverTarget, alignTargetEdge) {\n    if (positionData.isAuto) {\n      positionData.alignmentEdge = getClosestEdge(positionData.targetEdge, target2, boundingRect);\n    }\n    positionData.alignTargetEdge = alignTargetEdge;\n    return positionData;\n  }\n  function getClosestEdge(targetEdge, target2, boundingRect) {\n    var targetCenter = _getCenterValue(target2, targetEdge);\n    var boundingCenter = _getCenterValue(boundingRect, targetEdge);\n    var _a2 = _getFlankingEdges(targetEdge), positiveEdge = _a2.positiveEdge, negativeEdge = _a2.negativeEdge;\n    if (targetCenter <= boundingCenter) {\n      return positiveEdge;\n    } else {\n      return negativeEdge;\n    }\n  }\n  function _positionElementWithinBounds(elementToPosition, target2, bounding, positionData, gap, shouldScroll, minimumScrollResizeHeight, directionalHintFixed, coverTarget) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    var estimatedElementPosition = _estimatePosition(elementToPosition, target2, positionData, gap, coverTarget);\n    if (_isRectangleWithinBounds(estimatedElementPosition, bounding)) {\n      return {\n        elementRectangle: estimatedElementPosition,\n        targetEdge: positionData.targetEdge,\n        alignmentEdge: positionData.alignmentEdge\n      };\n    } else {\n      return _adjustFitWithinBounds(estimatedElementPosition, target2, bounding, positionData, shouldScroll, minimumScrollResizeHeight, gap, directionalHintFixed, coverTarget);\n    }\n  }\n  function _finalizeBeakPosition(elementPosition, positionedBeak, bounds2) {\n    var targetEdge = elementPosition.targetEdge * -1;\n    var actualElement = new Rectangle(0, elementPosition.elementRectangle.width, 0, elementPosition.elementRectangle.height);\n    var returnValue = {};\n    var returnEdge = _finalizeReturnEdge(elementPosition.elementRectangle, elementPosition.alignmentEdge ? elementPosition.alignmentEdge : _getFlankingEdges(targetEdge).positiveEdge, bounds2);\n    var beakEdgeDifference = _getRelativeEdgeDifference(elementPosition.elementRectangle, elementPosition.targetRectangle, targetEdge);\n    var showBeak = beakEdgeDifference > Math.abs(_getEdgeValue(positionedBeak, targetEdge));\n    returnValue[RectangleEdge[targetEdge]] = _getEdgeValue(positionedBeak, targetEdge);\n    returnValue[RectangleEdge[returnEdge]] = _getRelativeEdgeDifference(positionedBeak, actualElement, returnEdge);\n    return {\n      elementPosition: __assign$1({}, returnValue),\n      closestEdge: getClosestEdge(elementPosition.targetEdge, positionedBeak, actualElement),\n      targetEdge,\n      hideBeak: !showBeak\n    };\n  }\n  function _positionBeak(beakWidth, elementPosition) {\n    var target2 = elementPosition.targetRectangle;\n    var _a2 = _getFlankingEdges(elementPosition.targetEdge), positiveEdge = _a2.positiveEdge, negativeEdge = _a2.negativeEdge;\n    var beakTargetPoint = _getCenterValue(target2, elementPosition.targetEdge);\n    var elementBounds = new Rectangle(beakWidth / 2, elementPosition.elementRectangle.width - beakWidth / 2, beakWidth / 2, elementPosition.elementRectangle.height - beakWidth / 2);\n    var beakPosition = new Rectangle(0, beakWidth, 0, beakWidth);\n    beakPosition = _moveEdge(beakPosition, elementPosition.targetEdge * -1, -beakWidth / 2);\n    beakPosition = _centerEdgeToPoint(beakPosition, elementPosition.targetEdge * -1, beakTargetPoint - _getRelativeRectEdgeValue(positiveEdge, elementPosition.elementRectangle));\n    if (!_isEdgeInBounds(beakPosition, elementBounds, positiveEdge)) {\n      beakPosition = _alignEdges(beakPosition, elementBounds, positiveEdge);\n    } else if (!_isEdgeInBounds(beakPosition, elementBounds, negativeEdge)) {\n      beakPosition = _alignEdges(beakPosition, elementBounds, negativeEdge);\n    }\n    return beakPosition;\n  }\n  function _getRectangleFromElement(element2) {\n    var clientRect = element2.getBoundingClientRect();\n    return new Rectangle(clientRect.left, clientRect.right, clientRect.top, clientRect.bottom);\n  }\n  function _getRectangleFromIRect(rect2) {\n    return new Rectangle(rect2.left, rect2.right, rect2.top, rect2.bottom);\n  }\n  function _getTargetRect(bounds2, target2) {\n    var targetRectangle;\n    if (target2) {\n      if (!!target2.preventDefault) {\n        var ev = target2;\n        targetRectangle = new Rectangle(ev.clientX, ev.clientX, ev.clientY, ev.clientY);\n      } else if (!!target2.getBoundingClientRect) {\n        targetRectangle = _getRectangleFromElement(target2);\n      } else {\n        var rectOrPoint = target2;\n        var left = rectOrPoint.left || rectOrPoint.x;\n        var top_1 = rectOrPoint.top || rectOrPoint.y;\n        var right = rectOrPoint.right || left;\n        var bottom = rectOrPoint.bottom || top_1;\n        targetRectangle = new Rectangle(left, right, top_1, bottom);\n      }\n      if (!_isRectangleWithinBounds(targetRectangle, bounds2)) {\n        var outOfBounds2 = _getOutOfBoundsEdges(targetRectangle, bounds2);\n        for (var _i = 0, outOfBounds_1 = outOfBounds2; _i < outOfBounds_1.length; _i++) {\n          var direction = outOfBounds_1[_i];\n          targetRectangle[RectangleEdge[direction]] = bounds2[RectangleEdge[direction]];\n        }\n      }\n    } else {\n      targetRectangle = new Rectangle(0, 0, 0, 0);\n    }\n    return targetRectangle;\n  }\n  function _positionElementRelative(props, elementToPosition, boundingRect, previousPositions, shouldScroll, minimumScrollResizeHeight) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    var gap = props.gapSpace ? props.gapSpace : 0;\n    var targetRect = _getTargetRect(boundingRect, props.target);\n    var positionData = _getAlignmentData(_getPositionData(props.directionalHint, props.directionalHintForRTL, previousPositions), targetRect, boundingRect, props.coverTarget, props.alignTargetEdge);\n    var positionedElement = _positionElementWithinBounds(_getRectangleFromElement(elementToPosition), targetRect, boundingRect, positionData, gap, shouldScroll, minimumScrollResizeHeight, props.directionalHintFixed, props.coverTarget);\n    return __assign$1(__assign$1({}, positionedElement), { targetRectangle: targetRect });\n  }\n  function _finalizePositionData(positionedElement, hostElement, bounds2, coverTarget, doNotFinalizeReturnEdge) {\n    var finalizedElement = _finalizeElementPosition(positionedElement.elementRectangle, hostElement, positionedElement.targetEdge, bounds2, positionedElement.alignmentEdge, coverTarget, doNotFinalizeReturnEdge, positionedElement.forcedInBounds);\n    return {\n      elementPosition: finalizedElement,\n      targetEdge: positionedElement.targetEdge,\n      alignmentEdge: positionedElement.alignmentEdge\n    };\n  }\n  function _calculateGapSpace(isBeakVisible, beakWidth, gapSpace) {\n    if (beakWidth === void 0) {\n      beakWidth = 0;\n    }\n    if (gapSpace === void 0) {\n      gapSpace = 0;\n    }\n    return _calculateActualBeakWidthInPixels(isBeakVisible ? beakWidth : 0) / 2 + gapSpace;\n  }\n  function _positionCallout(props, hostElement, callout, previousPositions, shouldScroll, minimumScrollResizeHeight, doNotFinalizeReturnEdge, win) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    var theWin = win !== null && win !== void 0 ? win : getWindow();\n    var beakWidth = props.isBeakVisible ? props.beakWidth || 0 : 0;\n    var gap = _calculateGapSpace(props.isBeakVisible, props.beakWidth, props.gapSpace);\n    var positionProps = props;\n    positionProps.gapSpace = gap;\n    var boundingRect = props.bounds ? _getRectangleFromIRect(props.bounds) : new Rectangle(0, theWin.innerWidth - getScrollbarWidth(), 0, theWin.innerHeight);\n    var positionedElement = _positionElementRelative(positionProps, callout, boundingRect, previousPositions, shouldScroll, minimumScrollResizeHeight);\n    var beakPositioned = _positionBeak(beakWidth, positionedElement);\n    var finalizedBeakPosition = _finalizeBeakPosition(positionedElement, beakPositioned, boundingRect);\n    return __assign$1(__assign$1({}, _finalizePositionData(positionedElement, hostElement, boundingRect, props.coverTarget, doNotFinalizeReturnEdge)), { beakPosition: finalizedBeakPosition });\n  }\n  function _positionCard(props, hostElement, callout, previousPositions, win) {\n    var theWin = win !== null && win !== void 0 ? win : getWindow();\n    return _positionCallout(props, hostElement, callout, previousPositions, false, void 0, true, theWin);\n  }\n  function _getRectangleFromTarget(target2) {\n    var _a2, _b2, _c2, _d2;\n    var mouseTarget = target2;\n    var elementTarget = target2;\n    var rectOrPointTarget = target2;\n    var targetRect;\n    var left = (_a2 = rectOrPointTarget.left) !== null && _a2 !== void 0 ? _a2 : rectOrPointTarget.x;\n    var top = (_b2 = rectOrPointTarget.top) !== null && _b2 !== void 0 ? _b2 : rectOrPointTarget.y;\n    var right = (_c2 = rectOrPointTarget.right) !== null && _c2 !== void 0 ? _c2 : left;\n    var bottom = (_d2 = rectOrPointTarget.bottom) !== null && _d2 !== void 0 ? _d2 : top;\n    if (!!mouseTarget.stopPropagation) {\n      targetRect = new Rectangle(mouseTarget.clientX, mouseTarget.clientX, mouseTarget.clientY, mouseTarget.clientY);\n    } else if (left !== void 0 && top !== void 0) {\n      targetRect = new Rectangle(left, right, top, bottom);\n    } else {\n      targetRect = _getRectangleFromElement(elementTarget);\n    }\n    return targetRect;\n  }\n  function positionCallout(props, hostElement, elementToPosition, previousPositions, shouldScroll, minimumScrollResizeHeight, win) {\n    return _positionCallout(props, hostElement, elementToPosition, previousPositions, shouldScroll, minimumScrollResizeHeight, void 0, win);\n  }\n  function positionCard(props, hostElement, elementToPosition, previousPositions, win) {\n    return _positionCard(props, hostElement, elementToPosition, previousPositions, win);\n  }\n  function getOppositeEdge(edge) {\n    return edge * -1;\n  }\n  function _getBoundsFromTargetWindow(target2, targetWindow) {\n    var segments2 = void 0;\n    if (targetWindow.getWindowSegments) {\n      segments2 = targetWindow.getWindowSegments();\n    }\n    if (segments2 === void 0 || segments2.length <= 1) {\n      return {\n        top: 0,\n        left: 0,\n        right: targetWindow.innerWidth,\n        bottom: targetWindow.innerHeight,\n        width: targetWindow.innerWidth,\n        height: targetWindow.innerHeight\n      };\n    }\n    var x2 = 0;\n    var y2 = 0;\n    if (target2 !== null && !!target2.getBoundingClientRect) {\n      var clientRect = target2.getBoundingClientRect();\n      x2 = (clientRect.left + clientRect.right) / 2;\n      y2 = (clientRect.top + clientRect.bottom) / 2;\n    } else if (target2 !== null) {\n      x2 = target2.left || target2.x;\n      y2 = target2.top || target2.y;\n    }\n    var bounds2 = { top: 0, left: 0, right: 0, bottom: 0, width: 0, height: 0 };\n    for (var _i = 0, segments_1 = segments2; _i < segments_1.length; _i++) {\n      var segment = segments_1[_i];\n      if (x2 && segment.left <= x2 && segment.right >= x2 && y2 && segment.top <= y2 && segment.bottom >= y2) {\n        bounds2 = {\n          top: segment.top,\n          left: segment.left,\n          right: segment.right,\n          bottom: segment.bottom,\n          width: segment.width,\n          height: segment.height\n        };\n      }\n    }\n    return bounds2;\n  }\n  function getBoundsFromTargetWindow(target2, targetWindow) {\n    return _getBoundsFromTargetWindow(target2, targetWindow);\n  }\n  function calculateGapSpace(isBeakVisible, beakWidth, gapSpace) {\n    return _calculateGapSpace(isBeakVisible, beakWidth, gapSpace);\n  }\n  function getRectangleFromTarget(target2) {\n    return _getRectangleFromTarget(target2);\n  }\n  function useScrollbarAsync(props, root) {\n    var async = useAsync();\n    var _a2 = React__namespace.useState(false), needsVerticalScrollBarState = _a2[0], setNeedsVerticalScrollBar = _a2[1];\n    React__namespace.useEffect(function() {\n      async.requestAnimationFrame(function() {\n        var _a3;\n        if (props.style && props.style.overflowY) {\n          return;\n        }\n        var needsVerticalScrollBar = false;\n        if (root && root.current && ((_a3 = root.current) === null || _a3 === void 0 ? void 0 : _a3.firstElementChild)) {\n          var rootHeight = root.current.clientHeight;\n          var firstChildHeight = root.current.firstElementChild.clientHeight;\n          if (rootHeight > 0 && firstChildHeight > rootHeight) {\n            needsVerticalScrollBar = firstChildHeight - rootHeight > 1;\n          }\n        }\n        if (needsVerticalScrollBarState !== needsVerticalScrollBar) {\n          setNeedsVerticalScrollBar(needsVerticalScrollBar);\n        }\n      });\n      return function() {\n        return async.dispose();\n      };\n    });\n    return needsVerticalScrollBarState;\n  }\n  function defaultFocusRestorer(options2) {\n    var originalElement = options2.originalElement, containsFocus = options2.containsFocus;\n    if (originalElement && containsFocus && originalElement !== getWindow()) {\n      setTimeout(function() {\n        var _a2;\n        (_a2 = originalElement.focus) === null || _a2 === void 0 ? void 0 : _a2.call(originalElement);\n      }, 0);\n    }\n  }\n  function useRestoreFocus(props, root) {\n    var _a2 = props.onRestoreFocus, onRestoreFocus = _a2 === void 0 ? defaultFocusRestorer : _a2;\n    var originalFocusedElement = React__namespace.useRef(void 0);\n    var containsFocus = React__namespace.useRef(false);\n    React__namespace.useEffect(function() {\n      originalFocusedElement.current = getDocument().activeElement;\n      if (doesElementContainFocus(root.current)) {\n        containsFocus.current = true;\n      }\n      return function() {\n        var _a3;\n        onRestoreFocus === null || onRestoreFocus === void 0 ? void 0 : onRestoreFocus({\n          originalElement: originalFocusedElement.current,\n          containsFocus: containsFocus.current,\n          documentContainsFocus: ((_a3 = getDocument()) === null || _a3 === void 0 ? void 0 : _a3.hasFocus()) || false\n        });\n        originalFocusedElement.current = void 0;\n      };\n    }, []);\n    useOnEvent(root, \"focus\", React__namespace.useCallback(function() {\n      containsFocus.current = true;\n    }, []), true);\n    useOnEvent(root, \"blur\", React__namespace.useCallback(function(ev) {\n      if (root.current && ev.relatedTarget && !root.current.contains(ev.relatedTarget)) {\n        containsFocus.current = false;\n      }\n    }, []), true);\n  }\n  function useHideSiblingNodes(props, root) {\n    var shouldHideSiblings = String(props[\"aria-modal\"]).toLowerCase() === \"true\" && props.enableAriaHiddenSiblings;\n    React__namespace.useEffect(function() {\n      if (!(shouldHideSiblings && root.current)) {\n        return;\n      }\n      var unmodalize2 = modalize(root.current);\n      return unmodalize2;\n    }, [root, shouldHideSiblings]);\n  }\n  var Popup = React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var props = getPropsWithDefaults({ shouldRestoreFocus: true, enableAriaHiddenSiblings: true }, propsWithoutDefaults);\n    var root = React__namespace.useRef(void 0);\n    var mergedRootRef = useMergedRefs(root, forwardedRef);\n    useHideSiblingNodes(props, root);\n    useRestoreFocus(props, root);\n    var role = props.role, className2 = props.className, ariaLabel2 = props.ariaLabel, ariaLabelledBy = props.ariaLabelledBy, ariaDescribedBy = props.ariaDescribedBy, style2 = props.style, children2 = props.children, onDismiss = props.onDismiss;\n    var needsVerticalScrollBar = useScrollbarAsync(props, root);\n    var onKeyDown = React__namespace.useCallback(function(ev) {\n      switch (ev.which) {\n        case KeyCodes.escape:\n          if (onDismiss) {\n            onDismiss(ev);\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n          break;\n      }\n    }, [onDismiss]);\n    var win = useWindow();\n    useOnEvent(win, \"keydown\", onKeyDown);\n    return React__namespace.createElement(\"div\", __assign$1({ ref: mergedRootRef }, getNativeProps(props, divProperties), { className: className2, role, \"aria-label\": ariaLabel2, \"aria-labelledby\": ariaLabelledBy, \"aria-describedby\": ariaDescribedBy, onKeyDown, style: __assign$1({ overflowY: needsVerticalScrollBar ? \"scroll\" : void 0, outline: \"none\" }, style2) }), children2);\n  });\n  Popup.displayName = \"Popup\";\n  var useDocumentEx = function() {\n    var _a2;\n    return (_a2 = useDocument()) !== null && _a2 !== void 0 ? _a2 : typeof document !== \"undefined\" ? document : void 0;\n  };\n  var useWindowEx = function() {\n    var _a2;\n    return (_a2 = useWindow()) !== null && _a2 !== void 0 ? _a2 : typeof window !== \"undefined\" ? window : void 0;\n  };\n  var getDocumentEx = function(ctx) {\n    var _a2, _b2;\n    return (_b2 = (_a2 = ctx === null || ctx === void 0 ? void 0 : ctx.window) === null || _a2 === void 0 ? void 0 : _a2.document) !== null && _b2 !== void 0 ? _b2 : typeof document !== \"undefined\" ? document : void 0;\n  };\n  var getWindowEx = function(ctx) {\n    var _a2;\n    return (_a2 = ctx === null || ctx === void 0 ? void 0 : ctx.window) !== null && _a2 !== void 0 ? _a2 : typeof window !== \"undefined\" ? window : void 0;\n  };\n  var _a$3;\n  var COMPONENT_NAME$9 = \"CalloutContentBase\";\n  var ANIMATIONS = (_a$3 = {}, _a$3[RectangleEdge.top] = AnimationClassNames.slideUpIn10, _a$3[RectangleEdge.bottom] = AnimationClassNames.slideDownIn10, _a$3[RectangleEdge.left] = AnimationClassNames.slideLeftIn10, _a$3[RectangleEdge.right] = AnimationClassNames.slideRightIn10, _a$3);\n  var BEAK_ORIGIN_POSITION = { top: 0, left: 0 };\n  var OFF_SCREEN_STYLE = {\n    opacity: 0,\n    filter: \"opacity(0)\",\n    pointerEvents: \"none\"\n  };\n  var ARIA_ROLE_ATTRIBUTES = [\"role\", \"aria-roledescription\"];\n  var DEFAULT_PROPS$6 = {\n    preventDismissOnLostFocus: false,\n    preventDismissOnScroll: false,\n    preventDismissOnResize: false,\n    isBeakVisible: true,\n    beakWidth: 16,\n    gapSpace: 0,\n    minPagePadding: 8,\n    directionalHint: DirectionalHint.bottomAutoEdge\n  };\n  var getClassNames$p = classNamesFunction({\n    disableCaching: true\n    // disabling caching because stylesProp.position mutates often\n  });\n  function useBounds(_a2, targetRef, targetWindow) {\n    var bounds2 = _a2.bounds, _b2 = _a2.minPagePadding, minPagePadding = _b2 === void 0 ? DEFAULT_PROPS$6.minPagePadding : _b2, target2 = _a2.target;\n    var _c2 = React__namespace.useState(false), targetWindowResized = _c2[0], setTargetWindowResized = _c2[1];\n    var cachedBounds = React__namespace.useRef(void 0);\n    var getBounds = React__namespace.useCallback(function() {\n      if (!cachedBounds.current || targetWindowResized) {\n        var currentBounds = typeof bounds2 === \"function\" ? targetWindow ? bounds2(target2, targetWindow) : void 0 : bounds2;\n        if (!currentBounds && targetWindow) {\n          currentBounds = getBoundsFromTargetWindow(targetRef.current, targetWindow);\n          currentBounds = {\n            top: currentBounds.top + minPagePadding,\n            left: currentBounds.left + minPagePadding,\n            right: currentBounds.right - minPagePadding,\n            bottom: currentBounds.bottom - minPagePadding,\n            width: currentBounds.width - minPagePadding * 2,\n            height: currentBounds.height - minPagePadding * 2\n          };\n        }\n        cachedBounds.current = currentBounds;\n        targetWindowResized && setTargetWindowResized(false);\n      }\n      return cachedBounds.current;\n    }, [bounds2, minPagePadding, target2, targetRef, targetWindow, targetWindowResized]);\n    var async = useAsync();\n    useOnEvent(targetWindow, \"resize\", async.debounce(function() {\n      setTargetWindowResized(true);\n    }, 500, { leading: true }));\n    return getBounds;\n  }\n  function useMaxHeight(_a2, getBounds, targetRef, positions2) {\n    var _b2;\n    var calloutMaxHeight = _a2.calloutMaxHeight, finalHeight = _a2.finalHeight, directionalHint = _a2.directionalHint, directionalHintFixed = _a2.directionalHintFixed, hidden = _a2.hidden, gapSpace = _a2.gapSpace, beakWidth = _a2.beakWidth, isBeakVisible = _a2.isBeakVisible, coverTarget = _a2.coverTarget;\n    var _c2 = React__namespace.useState(), maxHeight = _c2[0], setMaxHeight = _c2[1];\n    var _d2 = (_b2 = positions2 === null || positions2 === void 0 ? void 0 : positions2.elementPosition) !== null && _b2 !== void 0 ? _b2 : {}, top = _d2.top, bottom = _d2.bottom;\n    var targetRect = (targetRef === null || targetRef === void 0 ? void 0 : targetRef.current) ? getRectangleFromTarget(targetRef.current) : void 0;\n    React__namespace.useEffect(function() {\n      var _a3;\n      var bounds2 = (_a3 = getBounds()) !== null && _a3 !== void 0 ? _a3 : {};\n      var topBounds = bounds2.top;\n      var bottomBounds = bounds2.bottom;\n      var calculatedHeight;\n      if ((positions2 === null || positions2 === void 0 ? void 0 : positions2.targetEdge) === RectangleEdge.top && (targetRect === null || targetRect === void 0 ? void 0 : targetRect.top) && !coverTarget) {\n        bottomBounds = targetRect.top - calculateGapSpace(isBeakVisible, beakWidth, gapSpace);\n      }\n      if (typeof top === \"number\" && bottomBounds) {\n        calculatedHeight = bottomBounds - top;\n      } else if (typeof bottom === \"number\" && typeof topBounds === \"number\" && bottomBounds) {\n        calculatedHeight = bottomBounds - topBounds - bottom;\n      }\n      if (!calloutMaxHeight && !hidden || calloutMaxHeight && calculatedHeight && calloutMaxHeight > calculatedHeight) {\n        setMaxHeight(calculatedHeight);\n      } else if (calloutMaxHeight) {\n        setMaxHeight(calloutMaxHeight);\n      } else {\n        setMaxHeight(void 0);\n      }\n    }, [\n      bottom,\n      calloutMaxHeight,\n      finalHeight,\n      directionalHint,\n      directionalHintFixed,\n      getBounds,\n      hidden,\n      positions2,\n      top,\n      gapSpace,\n      beakWidth,\n      isBeakVisible,\n      targetRect,\n      coverTarget\n    ]);\n    return maxHeight;\n  }\n  function usePositions(props, hostElement, calloutElement, targetRef, getBounds, popupRef) {\n    var _a2 = React__namespace.useState(), positions2 = _a2[0], setPositions = _a2[1];\n    var positionAttempts = React__namespace.useRef(0);\n    var previousTarget = React__namespace.useRef(void 0);\n    var async = useAsync();\n    var hidden = props.hidden, target2 = props.target, finalHeight = props.finalHeight, calloutMaxHeight = props.calloutMaxHeight, onPositioned = props.onPositioned, directionalHint = props.directionalHint, hideOverflow = props.hideOverflow, preferScrollResizePositioning = props.preferScrollResizePositioning;\n    var win = useWindowEx();\n    var localRef = React__namespace.useRef(void 0);\n    var popupStyles;\n    if (localRef.current !== popupRef.current) {\n      localRef.current = popupRef.current;\n      popupStyles = popupRef.current ? win === null || win === void 0 ? void 0 : win.getComputedStyle(popupRef.current) : void 0;\n    }\n    var popupOverflowY = popupStyles === null || popupStyles === void 0 ? void 0 : popupStyles.overflowY;\n    React__namespace.useEffect(function() {\n      if (!hidden) {\n        var timerId_1 = async.requestAnimationFrame(function() {\n          var _a3, _b2;\n          if (hostElement.current && calloutElement) {\n            var currentProps = __assign$1(__assign$1({}, props), { target: targetRef.current, bounds: getBounds() });\n            var dupeCalloutElement = calloutElement.cloneNode(true);\n            dupeCalloutElement.style.maxHeight = calloutMaxHeight ? \"\".concat(calloutMaxHeight) : \"\";\n            dupeCalloutElement.style.visibility = \"hidden\";\n            (_a3 = calloutElement.parentElement) === null || _a3 === void 0 ? void 0 : _a3.appendChild(dupeCalloutElement);\n            var previousPositions = previousTarget.current === target2 ? positions2 : void 0;\n            var isOverflowYHidden = hideOverflow || popupOverflowY === \"clip\" || popupOverflowY === \"hidden\";\n            var shouldScroll = preferScrollResizePositioning && !isOverflowYHidden;\n            var newPositions = finalHeight ? positionCard(currentProps, hostElement.current, dupeCalloutElement, previousPositions, win) : positionCallout(currentProps, hostElement.current, dupeCalloutElement, previousPositions, shouldScroll, void 0, win);\n            (_b2 = calloutElement.parentElement) === null || _b2 === void 0 ? void 0 : _b2.removeChild(dupeCalloutElement);\n            if (!positions2 && newPositions || positions2 && newPositions && !arePositionsEqual(positions2, newPositions) && positionAttempts.current < 5) {\n              positionAttempts.current++;\n              setPositions(newPositions);\n            } else if (positionAttempts.current > 0) {\n              positionAttempts.current = 0;\n              onPositioned === null || onPositioned === void 0 ? void 0 : onPositioned(positions2);\n            }\n          }\n        }, calloutElement);\n        previousTarget.current = target2;\n        return function() {\n          async.cancelAnimationFrame(timerId_1);\n          previousTarget.current = void 0;\n        };\n      } else {\n        setPositions(void 0);\n        positionAttempts.current = 0;\n      }\n    }, [\n      hidden,\n      directionalHint,\n      async,\n      calloutElement,\n      calloutMaxHeight,\n      hostElement,\n      targetRef,\n      finalHeight,\n      getBounds,\n      onPositioned,\n      positions2,\n      props,\n      target2,\n      hideOverflow,\n      preferScrollResizePositioning,\n      popupOverflowY,\n      win\n    ]);\n    return positions2;\n  }\n  function useAutoFocus(_a2, positions2, calloutElement) {\n    var hidden = _a2.hidden, setInitialFocus = _a2.setInitialFocus;\n    var async = useAsync();\n    var hasPositions = !!positions2;\n    React__namespace.useEffect(function() {\n      if (!hidden && setInitialFocus && hasPositions && calloutElement) {\n        var timerId_2 = async.requestAnimationFrame(function() {\n          return focusFirstChild(calloutElement);\n        }, calloutElement);\n        return function() {\n          return async.cancelAnimationFrame(timerId_2);\n        };\n      }\n    }, [hidden, hasPositions, async, calloutElement, setInitialFocus]);\n  }\n  function useDismissHandlers(_a2, positions2, hostElement, targetRef, targetWindow) {\n    var hidden = _a2.hidden, onDismiss = _a2.onDismiss, preventDismissOnScroll = _a2.preventDismissOnScroll, preventDismissOnResize = _a2.preventDismissOnResize, preventDismissOnLostFocus = _a2.preventDismissOnLostFocus, dismissOnTargetClick = _a2.dismissOnTargetClick, shouldDismissOnWindowFocus = _a2.shouldDismissOnWindowFocus, preventDismissOnEvent = _a2.preventDismissOnEvent;\n    var isMouseDownOnPopup = React__namespace.useRef(false);\n    var async = useAsync();\n    var mouseDownHandlers = useConst([\n      function() {\n        isMouseDownOnPopup.current = true;\n      },\n      function() {\n        isMouseDownOnPopup.current = false;\n      }\n    ]);\n    var positionsExists = !!positions2;\n    React__namespace.useEffect(function() {\n      var dismissOnScroll = function(ev) {\n        if (positionsExists && !preventDismissOnScroll) {\n          dismissOnClickOrScroll(ev);\n        }\n      };\n      var dismissOnResize = function(ev) {\n        if (!preventDismissOnResize && !(preventDismissOnEvent && preventDismissOnEvent(ev))) {\n          onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss(ev);\n        }\n      };\n      var dismissOnLostFocus = function(ev) {\n        if (!preventDismissOnLostFocus) {\n          dismissOnClickOrScroll(ev);\n        }\n      };\n      var dismissOnClickOrScroll = function(ev) {\n        var eventPaths = ev.composedPath ? ev.composedPath() : [];\n        var target2 = eventPaths.length > 0 ? eventPaths[0] : ev.target;\n        var isEventTargetOutsideCallout = hostElement.current && !elementContains(hostElement.current, target2);\n        if (isEventTargetOutsideCallout && isMouseDownOnPopup.current) {\n          isMouseDownOnPopup.current = false;\n          return;\n        }\n        if (!targetRef.current && isEventTargetOutsideCallout || ev.target !== targetWindow && isEventTargetOutsideCallout && (!targetRef.current || \"stopPropagation\" in targetRef.current || dismissOnTargetClick || target2 !== targetRef.current && !elementContains(targetRef.current, target2))) {\n          if (preventDismissOnEvent && preventDismissOnEvent(ev)) {\n            return;\n          }\n          onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss(ev);\n        }\n      };\n      var dismissOnTargetWindowBlur = function(ev) {\n        if (!shouldDismissOnWindowFocus) {\n          return;\n        }\n        if ((preventDismissOnEvent && !preventDismissOnEvent(ev) || !preventDismissOnEvent && !preventDismissOnLostFocus) && !(targetWindow === null || targetWindow === void 0 ? void 0 : targetWindow.document.hasFocus()) && ev.relatedTarget === null) {\n          onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss(ev);\n        }\n      };\n      var disposablesPromise = new Promise(function(resolve2) {\n        async.setTimeout(function() {\n          if (!hidden && targetWindow) {\n            var disposables_1 = [\n              on$1(targetWindow, \"scroll\", dismissOnScroll, true),\n              on$1(targetWindow, \"resize\", dismissOnResize, true),\n              on$1(targetWindow.document.documentElement, \"focus\", dismissOnLostFocus, true),\n              on$1(targetWindow.document.documentElement, \"click\", dismissOnLostFocus, true),\n              on$1(targetWindow, \"blur\", dismissOnTargetWindowBlur, true)\n            ];\n            resolve2(function() {\n              disposables_1.forEach(function(dispose) {\n                return dispose();\n              });\n            });\n          }\n        }, 0);\n      });\n      return function() {\n        disposablesPromise.then(function(dispose) {\n          return dispose();\n        });\n      };\n    }, [\n      hidden,\n      async,\n      hostElement,\n      targetRef,\n      targetWindow,\n      onDismiss,\n      shouldDismissOnWindowFocus,\n      dismissOnTargetClick,\n      preventDismissOnLostFocus,\n      preventDismissOnResize,\n      preventDismissOnScroll,\n      positionsExists,\n      preventDismissOnEvent\n    ]);\n    return mouseDownHandlers;\n  }\n  var CalloutContentBase = React__namespace.memo(React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var props = getPropsWithDefaults(DEFAULT_PROPS$6, propsWithoutDefaults);\n    var styles = props.styles, style2 = props.style, ariaLabel2 = props.ariaLabel, ariaDescribedBy = props.ariaDescribedBy, ariaLabelledBy = props.ariaLabelledBy, className2 = props.className, isBeakVisible = props.isBeakVisible, children2 = props.children, beakWidth = props.beakWidth, calloutWidth = props.calloutWidth, calloutMaxWidth = props.calloutMaxWidth, calloutMinWidth = props.calloutMinWidth, doNotLayer = props.doNotLayer, finalHeight = props.finalHeight, _a2 = props.hideOverflow, hideOverflow = _a2 === void 0 ? !!finalHeight : _a2, backgroundColor = props.backgroundColor, calloutMaxHeight = props.calloutMaxHeight, onScroll = props.onScroll, _b2 = props.shouldRestoreFocus, shouldRestoreFocus = _b2 === void 0 ? true : _b2, target2 = props.target, hidden = props.hidden, onLayerMounted = props.onLayerMounted, popupProps = props.popupProps;\n    var hostElement = React__namespace.useRef(null);\n    var popupRef = React__namespace.useRef(null);\n    var mergedPopupRefs = useMergedRefs(popupRef, popupProps === null || popupProps === void 0 ? void 0 : popupProps.ref);\n    var _c2 = React__namespace.useState(null), calloutElement = _c2[0], setCalloutElement = _c2[1];\n    var calloutCallback = React__namespace.useCallback(function(calloutEl) {\n      setCalloutElement(calloutEl);\n    }, []);\n    var rootRef = useMergedRefs(hostElement, forwardedRef);\n    var _d2 = useTarget(props.target, {\n      current: calloutElement\n    }), targetRef = _d2[0], targetWindow = _d2[1];\n    var getBounds = useBounds(props, targetRef, targetWindow);\n    var positions2 = usePositions(props, hostElement, calloutElement, targetRef, getBounds, mergedPopupRefs);\n    var maxHeight = useMaxHeight(props, getBounds, targetRef, positions2);\n    var _e2 = useDismissHandlers(props, positions2, hostElement, targetRef, targetWindow), mouseDownOnPopup = _e2[0], mouseUpOnPopup = _e2[1];\n    var isForcedInBounds = (positions2 === null || positions2 === void 0 ? void 0 : positions2.elementPosition.top) && (positions2 === null || positions2 === void 0 ? void 0 : positions2.elementPosition.bottom);\n    var cssPositions = __assign$1(__assign$1({}, positions2 === null || positions2 === void 0 ? void 0 : positions2.elementPosition), { maxHeight });\n    if (isForcedInBounds) {\n      cssPositions.bottom = void 0;\n    }\n    useAutoFocus(props, positions2, calloutElement);\n    React__namespace.useEffect(function() {\n      if (!hidden) {\n        onLayerMounted === null || onLayerMounted === void 0 ? void 0 : onLayerMounted();\n      }\n    }, [hidden]);\n    if (!targetWindow) {\n      return null;\n    }\n    var overflowYHidden = hideOverflow;\n    var beakVisible = isBeakVisible && !!target2;\n    var classNames2 = getClassNames$p(styles, {\n      theme: props.theme,\n      className: className2,\n      overflowYHidden,\n      calloutWidth,\n      positions: positions2,\n      beakWidth,\n      backgroundColor,\n      calloutMaxWidth,\n      calloutMinWidth,\n      doNotLayer\n    });\n    var overflowStyle = __assign$1(__assign$1({ maxHeight: calloutMaxHeight ? calloutMaxHeight : \"100%\" }, style2), overflowYHidden && { overflowY: \"hidden\" });\n    var visibilityStyle = props.hidden ? { visibility: \"hidden\" } : void 0;\n    return React__namespace.createElement(\n      \"div\",\n      { ref: rootRef, className: classNames2.container, style: visibilityStyle },\n      React__namespace.createElement(\n        \"div\",\n        __assign$1({}, getNativeProps(props, divProperties, ARIA_ROLE_ATTRIBUTES), {\n          className: css(classNames2.root, positions2 && positions2.targetEdge && ANIMATIONS[positions2.targetEdge]),\n          style: positions2 ? __assign$1({}, cssPositions) : OFF_SCREEN_STYLE,\n          // Safari and Firefox on Mac OS requires this to back-stop click events so focus remains in the Callout.\n          // See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus\n          tabIndex: -1,\n          ref: calloutCallback\n        }),\n        beakVisible && React__namespace.createElement(\"div\", { className: classNames2.beak, style: getBeakPosition(positions2) }),\n        beakVisible && React__namespace.createElement(\"div\", { className: classNames2.beakCurtain }),\n        React__namespace.createElement(\n          Popup,\n          __assign$1({\n            // don't use getNativeElementProps for role and roledescription because it will also\n            // pass through data-* props (resulting in them being used in two places)\n            role: props.role,\n            \"aria-roledescription\": props[\"aria-roledescription\"],\n            ariaDescribedBy,\n            ariaLabel: ariaLabel2,\n            ariaLabelledBy,\n            className: classNames2.calloutMain,\n            onDismiss: props.onDismiss,\n            onMouseDown: mouseDownOnPopup,\n            onMouseUp: mouseUpOnPopup,\n            onRestoreFocus: props.onRestoreFocus,\n            onScroll,\n            // eslint-disable-next-line @typescript-eslint/no-deprecated\n            shouldRestoreFocus,\n            style: overflowStyle\n          }, popupProps, { ref: mergedPopupRefs }),\n          children2\n        )\n      )\n    );\n  }), function(previousProps, nextProps) {\n    if (!nextProps.shouldUpdateWhenHidden && previousProps.hidden && nextProps.hidden) {\n      return true;\n    }\n    return shallowCompare(previousProps, nextProps);\n  });\n  function getBeakPosition(positions2) {\n    var _a2, _b2;\n    var beakPositionStyle = __assign$1(__assign$1({}, (_a2 = positions2 === null || positions2 === void 0 ? void 0 : positions2.beakPosition) === null || _a2 === void 0 ? void 0 : _a2.elementPosition), { display: ((_b2 = positions2 === null || positions2 === void 0 ? void 0 : positions2.beakPosition) === null || _b2 === void 0 ? void 0 : _b2.hideBeak) ? \"none\" : void 0 });\n    if (!beakPositionStyle.top && !beakPositionStyle.bottom && !beakPositionStyle.left && !beakPositionStyle.right) {\n      beakPositionStyle.left = BEAK_ORIGIN_POSITION.left;\n      beakPositionStyle.top = BEAK_ORIGIN_POSITION.top;\n    }\n    return beakPositionStyle;\n  }\n  function arePositionsEqual(prevElementPositions, newElementPosition) {\n    return comparePositions(prevElementPositions.elementPosition, newElementPosition.elementPosition) && comparePositions(prevElementPositions.beakPosition.elementPosition, newElementPosition.beakPosition.elementPosition);\n  }\n  function comparePositions(prevElementPositions, newElementPositions) {\n    for (var key2 in newElementPositions) {\n      if (newElementPositions.hasOwnProperty(key2)) {\n        var oldPositionEdge = prevElementPositions[key2];\n        var newPositionEdge = newElementPositions[key2];\n        if (oldPositionEdge !== void 0 && newPositionEdge !== void 0) {\n          if (oldPositionEdge.toFixed(2) !== newPositionEdge.toFixed(2)) {\n            return false;\n          }\n        } else {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n  CalloutContentBase.displayName = COMPONENT_NAME$9;\n  function getBeakStyle(beakWidth) {\n    return {\n      height: beakWidth,\n      width: beakWidth\n    };\n  }\n  var GlobalClassNames$g = {\n    container: \"ms-Callout-container\",\n    root: \"ms-Callout\",\n    beak: \"ms-Callout-beak\",\n    beakCurtain: \"ms-Callout-beakCurtain\",\n    calloutMain: \"ms-Callout-main\"\n  };\n  var getStyles$u = function(props) {\n    var _a2;\n    var theme = props.theme, className2 = props.className, overflowYHidden = props.overflowYHidden, calloutWidth = props.calloutWidth, beakWidth = props.beakWidth, backgroundColor = props.backgroundColor, calloutMaxWidth = props.calloutMaxWidth, calloutMinWidth = props.calloutMinWidth, doNotLayer = props.doNotLayer;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$g, theme);\n    var semanticColors = theme.semanticColors, effects = theme.effects;\n    return {\n      container: [\n        classNames2.container,\n        {\n          position: \"relative\"\n        }\n      ],\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          position: \"absolute\",\n          display: \"flex\",\n          zIndex: doNotLayer ? ZIndexes.Layer : void 0,\n          boxSizing: \"border-box\",\n          borderRadius: effects.roundedCorner2,\n          boxShadow: effects.elevation16,\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n            borderWidth: 1,\n            borderStyle: \"solid\",\n            borderColor: \"WindowText\"\n          }, _a2)\n        },\n        focusClear(),\n        className2,\n        !!calloutWidth && { width: calloutWidth },\n        !!calloutMaxWidth && { maxWidth: calloutMaxWidth },\n        !!calloutMinWidth && { minWidth: calloutMinWidth }\n      ],\n      beak: [\n        classNames2.beak,\n        {\n          position: \"absolute\",\n          backgroundColor: semanticColors.menuBackground,\n          boxShadow: \"inherit\",\n          border: \"inherit\",\n          boxSizing: \"border-box\",\n          transform: \"rotate(45deg)\"\n        },\n        getBeakStyle(beakWidth),\n        backgroundColor && {\n          backgroundColor\n        }\n      ],\n      beakCurtain: [\n        classNames2.beakCurtain,\n        {\n          position: \"absolute\",\n          top: 0,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          backgroundColor: semanticColors.menuBackground,\n          borderRadius: effects.roundedCorner2\n        }\n      ],\n      calloutMain: [\n        classNames2.calloutMain,\n        {\n          backgroundColor: semanticColors.menuBackground,\n          overflowX: \"hidden\",\n          overflowY: \"auto\",\n          position: \"relative\",\n          width: \"100%\",\n          borderRadius: effects.roundedCorner2\n        },\n        overflowYHidden && {\n          overflowY: \"hidden\"\n        },\n        backgroundColor && {\n          backgroundColor\n        }\n      ]\n    };\n  };\n  var CalloutContent = styled(CalloutContentBase, getStyles$u, void 0, {\n    scope: \"CalloutContent\"\n  });\n  var PortalCompatContext = React__namespace.createContext(void 0);\n  var portalCompatContextDefaultValue = function() {\n    return function() {\n      return void 0;\n    };\n  };\n  PortalCompatContext.Provider;\n  function usePortalCompat() {\n    var _React_useContext;\n    return (_React_useContext = React__namespace.useContext(PortalCompatContext)) !== null && _React_useContext !== void 0 ? _React_useContext : portalCompatContextDefaultValue;\n  }\n  var getClassNames$o = classNamesFunction();\n  var getFabricTheme = memoizeFunction(function(theme, isRTL) {\n    return createTheme(__assign$1(__assign$1({}, theme), { rtl: isRTL }));\n  });\n  var getDir = function(_a2) {\n    var theme = _a2.theme, dir = _a2.dir;\n    var contextDir = getRTL(theme) ? \"rtl\" : \"ltr\";\n    var pageDir = getRTL() ? \"rtl\" : \"ltr\";\n    var componentDir = dir ? dir : contextDir;\n    return {\n      // If Fabric dir !== contextDir\n      // Or If contextDir !== pageDir\n      // Then we need to set dir of the Fabric root\n      rootDir: componentDir !== contextDir || componentDir !== pageDir ? componentDir : dir,\n      // If dir !== contextDir || pageDir\n      // then set contextual theme around content\n      needsTheme: componentDir !== contextDir\n    };\n  };\n  var FabricBase = React__namespace.forwardRef(function(props, ref2) {\n    var className2 = props.className, theme = props.theme, applyTheme = props.applyTheme, applyThemeToBody = props.applyThemeToBody, styles = props.styles;\n    var classNames2 = getClassNames$o(styles, {\n      theme,\n      applyTheme,\n      className: className2\n    });\n    var rootElement = React__namespace.useRef(null);\n    useApplyThemeToBody(applyThemeToBody, classNames2, rootElement);\n    return React__namespace.createElement(React__namespace.Fragment, null, useRenderedContent(props, classNames2, rootElement, ref2));\n  });\n  FabricBase.displayName = \"FabricBase\";\n  function useRenderedContent(props, _a2, rootElement, ref2) {\n    var root = _a2.root;\n    var _b2 = props.as, Root = _b2 === void 0 ? \"div\" : _b2, dir = props.dir, theme = props.theme;\n    var divProps = getNativeProps(props, divProperties, [\"dir\"]);\n    var _c2 = getDir(props), rootDir = _c2.rootDir, needsTheme = _c2.needsTheme;\n    var renderedContent = React__namespace.createElement(\n      FocusRectsProvider,\n      { providerRef: rootElement },\n      React__namespace.createElement(Root, __assign$1({ dir: rootDir }, divProps, { className: root, ref: useMergedRefs(rootElement, ref2) }))\n    );\n    if (needsTheme) {\n      renderedContent = // eslint-disable-next-line @typescript-eslint/no-deprecated\n      React__namespace.createElement(Customizer, { settings: { theme: getFabricTheme(theme, dir === \"rtl\") } }, renderedContent);\n    }\n    return renderedContent;\n  }\n  function useApplyThemeToBody(applyThemeToBody, _a2, rootElement) {\n    var bodyThemed = _a2.bodyThemed;\n    React__namespace.useEffect(function() {\n      if (applyThemeToBody) {\n        var currentDoc_1 = getDocument(rootElement.current);\n        if (currentDoc_1) {\n          currentDoc_1.body.classList.add(bodyThemed);\n          return function() {\n            currentDoc_1.body.classList.remove(bodyThemed);\n          };\n        }\n      }\n    }, [bodyThemed, applyThemeToBody, rootElement]);\n    return rootElement;\n  }\n  var inheritFont = { fontFamily: \"inherit\" };\n  var GlobalClassNames$f = {\n    root: \"ms-Fabric\",\n    bodyThemed: \"ms-Fabric-bodyThemed\"\n  };\n  var getStyles$t = function(props) {\n    var applyTheme = props.applyTheme, className2 = props.className, preventBlanketFontInheritance = props.preventBlanketFontInheritance, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$f, theme);\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          color: theme.palette.neutralPrimary\n        },\n        !preventBlanketFontInheritance && {\n          \"& button\": inheritFont,\n          \"& input\": inheritFont,\n          \"& textarea\": inheritFont\n        },\n        // apply theme to only if applyTheme is true\n        applyTheme && {\n          color: theme.semanticColors.bodyText,\n          backgroundColor: theme.semanticColors.bodyBackground\n        },\n        className2\n      ],\n      bodyThemed: [\n        {\n          backgroundColor: theme.semanticColors.bodyBackground\n        }\n      ]\n    };\n  };\n  var Fabric = styled(FabricBase, getStyles$t, void 0, {\n    scope: \"Fabric\"\n  });\n  var _layersByHostId = {};\n  var _layerHostsById = {};\n  var defaultHostId = \"fluent-default-layer-host\";\n  var _defaultHostSelector = \"#\".concat(defaultHostId);\n  function registerLayer(hostId, callback) {\n    if (!_layersByHostId[hostId]) {\n      _layersByHostId[hostId] = [];\n    }\n    _layersByHostId[hostId].push(callback);\n    var layerHosts = _layerHostsById[hostId];\n    if (layerHosts) {\n      for (var _i = 0, layerHosts_1 = layerHosts; _i < layerHosts_1.length; _i++) {\n        var layerHost = layerHosts_1[_i];\n        layerHost.notifyLayersChanged();\n      }\n    }\n  }\n  function unregisterLayer(hostId, callback) {\n    var layers = _layersByHostId[hostId];\n    if (layers) {\n      var idx = layers.indexOf(callback);\n      if (idx >= 0) {\n        layers.splice(idx, 1);\n        if (layers.length === 0) {\n          delete _layersByHostId[hostId];\n        }\n      }\n    }\n    var layerHosts = _layerHostsById[hostId];\n    if (layerHosts) {\n      for (var _i = 0, layerHosts_2 = layerHosts; _i < layerHosts_2.length; _i++) {\n        var layerHost = layerHosts_2[_i];\n        layerHost.notifyLayersChanged();\n      }\n    }\n  }\n  function getLayerHost(hostId) {\n    var layerHosts = _layerHostsById[hostId];\n    return layerHosts && layerHosts[0] || void 0;\n  }\n  function createDefaultLayerHost(doc, shadowRoot) {\n    if (shadowRoot === void 0) {\n      shadowRoot = null;\n    }\n    var host = doc.createElement(\"div\");\n    host.setAttribute(\"id\", defaultHostId);\n    host.style.cssText = \"position:fixed;z-index:1000000\";\n    if (shadowRoot) {\n      shadowRoot.appendChild(host);\n    } else {\n      doc === null || doc === void 0 ? void 0 : doc.body.appendChild(host);\n    }\n    return host;\n  }\n  function getDefaultTarget() {\n    return _defaultHostSelector;\n  }\n  var getClassNames$n = classNamesFunction();\n  var getFocusVisibility = function(providerRef) {\n    if (providerRef === null || providerRef === void 0 ? void 0 : providerRef.current) {\n      return providerRef.current.classList.contains(IsFocusVisibleClassName);\n    }\n    return false;\n  };\n  var LayerBase = React__namespace.forwardRef(function(props, ref2) {\n    var registerPortalEl = usePortalCompat();\n    var rootRef = React__namespace.useRef(null);\n    var mergedRef = useMergedRefs(rootRef, ref2);\n    var layerRef = React__namespace.useRef(void 0);\n    var fabricElementRef = React__namespace.useRef(null);\n    var focusContext = React__namespace.useContext(FocusRectsContext);\n    var _a2 = React__namespace.useState(false), needRaiseLayerMount = _a2[0], setNeedRaiseLayerMount = _a2[1];\n    var focusRectsRef = React__namespace.useCallback(function(el) {\n      var isFocusVisible = getFocusVisibility(focusContext === null || focusContext === void 0 ? void 0 : focusContext.providerRef);\n      if (el && isFocusVisible) {\n        el.classList.add(IsFocusVisibleClassName);\n      }\n    }, [focusContext]);\n    var children2 = props.children, className2 = props.className, eventBubblingEnabled = props.eventBubblingEnabled, fabricProps = props.fabricProps, hostId = props.hostId, insertFirst = props.insertFirst, _b2 = props.onLayerDidMount, onLayerDidMount = _b2 === void 0 ? function() {\n      return void 0;\n    } : _b2, _c2 = props.onLayerMounted, onLayerMounted = _c2 === void 0 ? function() {\n      return void 0;\n    } : _c2, onLayerWillUnmount = props.onLayerWillUnmount, styles = props.styles, theme = props.theme;\n    var fabricRef = useMergedRefs(fabricElementRef, fabricProps === null || fabricProps === void 0 ? void 0 : fabricProps.ref, focusRectsRef);\n    var classNames2 = getClassNames$n(styles, {\n      theme,\n      className: className2,\n      isNotHost: !hostId\n    });\n    var getHost = function(doc, shadowRoot) {\n      var _a22, _b22;\n      if (shadowRoot === void 0) {\n        shadowRoot = null;\n      }\n      var root = shadowRoot !== null && shadowRoot !== void 0 ? shadowRoot : doc;\n      if (hostId) {\n        var layerHost = getLayerHost(hostId);\n        if (layerHost) {\n          return (_a22 = layerHost.rootRef.current) !== null && _a22 !== void 0 ? _a22 : null;\n        }\n        return (_b22 = root.getElementById(hostId)) !== null && _b22 !== void 0 ? _b22 : null;\n      } else {\n        var defaultHostSelector = getDefaultTarget();\n        var host = defaultHostSelector ? root.querySelector(defaultHostSelector) : null;\n        if (!host) {\n          host = createDefaultLayerHost(doc, shadowRoot);\n        }\n        return host;\n      }\n    };\n    var removeLayerElement = function() {\n      onLayerWillUnmount === null || onLayerWillUnmount === void 0 ? void 0 : onLayerWillUnmount();\n      var elem = layerRef.current;\n      layerRef.current = void 0;\n      if (elem && elem.parentNode) {\n        elem.parentNode.removeChild(elem);\n      }\n    };\n    var createLayerElement = function() {\n      var _a22, _b22, _c22, _d2;\n      var doc = getDocument(rootRef.current);\n      var shadowRoot = ((_b22 = (_a22 = rootRef.current) === null || _a22 === void 0 ? void 0 : _a22.getRootNode()) === null || _b22 === void 0 ? void 0 : _b22.host) ? (_c22 = rootRef === null || rootRef === void 0 ? void 0 : rootRef.current) === null || _c22 === void 0 ? void 0 : _c22.getRootNode() : void 0;\n      if (!doc || !doc && !shadowRoot) {\n        return;\n      }\n      var host = getHost(doc, shadowRoot);\n      if (!host) {\n        return;\n      }\n      if (!host.__tabsterElementFlags) {\n        host.__tabsterElementFlags = {};\n      }\n      host.__tabsterElementFlags.noDirectAriaHidden = true;\n      removeLayerElement();\n      var el = ((_d2 = host.ownerDocument) !== null && _d2 !== void 0 ? _d2 : doc).createElement(\"div\");\n      el.className = classNames2.root;\n      setPortalAttribute(el);\n      setVirtualParent(el, rootRef.current);\n      insertFirst ? host.insertBefore(el, host.firstChild) : host.appendChild(el);\n      layerRef.current = el;\n      setNeedRaiseLayerMount(true);\n    };\n    useIsomorphicLayoutEffect(function() {\n      createLayerElement();\n      if (hostId) {\n        registerLayer(hostId, createLayerElement);\n      }\n      var unregisterPortalEl = layerRef.current ? registerPortalEl(layerRef.current) : void 0;\n      return function() {\n        if (unregisterPortalEl) {\n          unregisterPortalEl();\n        }\n        removeLayerElement();\n        if (hostId) {\n          unregisterLayer(hostId, createLayerElement);\n        }\n      };\n    }, [hostId]);\n    React__namespace.useEffect(function() {\n      if (layerRef.current && needRaiseLayerMount) {\n        onLayerMounted === null || onLayerMounted === void 0 ? void 0 : onLayerMounted();\n        onLayerDidMount === null || onLayerDidMount === void 0 ? void 0 : onLayerDidMount();\n        setNeedRaiseLayerMount(false);\n      }\n    }, [needRaiseLayerMount, onLayerMounted, onLayerDidMount]);\n    return React__namespace.createElement(\"span\", { className: \"ms-layer\", ref: mergedRef }, layerRef.current && ReactDOM__namespace.createPortal(React__namespace.createElement(\n      FocusRectsProvider,\n      { layerRoot: true, providerRef: fabricRef },\n      React__namespace.createElement(Fabric, __assign$1({}, !eventBubblingEnabled && getFilteredEvents(), fabricProps, { className: css(classNames2.content, fabricProps === null || fabricProps === void 0 ? void 0 : fabricProps.className), ref: fabricRef }), children2)\n    ), layerRef.current));\n  });\n  LayerBase.displayName = \"LayerBase\";\n  var filteredEventProps;\n  var onFilterEvent = function(ev) {\n    if (ev.eventPhase === Event.BUBBLING_PHASE && ev.type !== \"mouseenter\" && ev.type !== \"mouseleave\" && ev.type !== \"touchstart\" && ev.type !== \"touchend\") {\n      ev.stopPropagation();\n    }\n  };\n  function getFilteredEvents() {\n    if (!filteredEventProps) {\n      filteredEventProps = {};\n      [\n        \"onClick\",\n        \"onContextMenu\",\n        \"onDoubleClick\",\n        \"onDrag\",\n        \"onDragEnd\",\n        \"onDragEnter\",\n        \"onDragExit\",\n        \"onDragLeave\",\n        \"onDragOver\",\n        \"onDragStart\",\n        \"onDrop\",\n        \"onMouseDown\",\n        \"onMouseEnter\",\n        \"onMouseLeave\",\n        \"onMouseMove\",\n        \"onMouseOver\",\n        \"onMouseOut\",\n        \"onMouseUp\",\n        \"onTouchMove\",\n        \"onTouchStart\",\n        \"onTouchCancel\",\n        \"onTouchEnd\",\n        \"onKeyDown\",\n        \"onKeyPress\",\n        \"onKeyUp\",\n        \"onFocus\",\n        \"onBlur\",\n        \"onChange\",\n        \"onInput\",\n        \"onInvalid\",\n        \"onSubmit\"\n      ].forEach(function(name) {\n        return filteredEventProps[name] = onFilterEvent;\n      });\n    }\n    return filteredEventProps;\n  }\n  var GlobalClassNames$e = {\n    root: \"ms-Layer\",\n    rootNoHost: \"ms-Layer--fixed\",\n    content: \"ms-Layer-content\"\n  };\n  var getStyles$s = function(props) {\n    var className2 = props.className, isNotHost = props.isNotHost, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$e, theme);\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        isNotHost && [\n          classNames2.rootNoHost,\n          {\n            position: \"fixed\",\n            zIndex: ZIndexes.Layer,\n            top: 0,\n            left: 0,\n            bottom: 0,\n            right: 0,\n            visibility: \"hidden\"\n          }\n        ],\n        className2\n      ],\n      content: [\n        classNames2.content,\n        {\n          visibility: \"visible\"\n        }\n      ]\n    };\n  };\n  var Layer = styled(LayerBase, getStyles$s, void 0, {\n    scope: \"Layer\",\n    fields: [\"hostId\", \"theme\", \"styles\"]\n  });\n  var Callout = React__namespace.forwardRef(function(_a2, forwardedRef) {\n    var layerProps = _a2.layerProps, doNotLayer = _a2.doNotLayer, rest = __rest(_a2, [\"layerProps\", \"doNotLayer\"]);\n    var content2 = React__namespace.createElement(CalloutContent, __assign$1({}, rest, { doNotLayer, ref: forwardedRef }));\n    return doNotLayer ? content2 : React__namespace.createElement(Layer, __assign$1({}, layerProps), content2);\n  });\n  Callout.displayName = \"Callout\";\n  var COMPONENT_NAME$8 = \"FocusTrapZone\";\n  var DEFAULT_PROPS$5 = {\n    disabled: false,\n    disableFirstFocus: false,\n    forceFocusInsideTrap: true,\n    isClickableOutsideFocusTrap: false,\n    // Hardcoding completely uncontrolled flag for proper interop with FluentUI V9.\n    \"data-tabster\": '{\"uncontrolled\": {\"completely\": true}}'\n  };\n  var useComponentRef$6 = function(componentRef, previouslyFocusedElement, focusFTZ) {\n    React__namespace.useImperativeHandle(componentRef, function() {\n      return {\n        get previouslyFocusedElement() {\n          return previouslyFocusedElement;\n        },\n        focus: focusFTZ\n      };\n    }, [focusFTZ, previouslyFocusedElement]);\n  };\n  var FocusTrapZone = React__namespace.forwardRef(function(propsWithoutDefaults, ref2) {\n    var _a2;\n    var root = React__namespace.useRef(null);\n    var firstBumper = React__namespace.useRef(null);\n    var lastBumper = React__namespace.useRef(null);\n    var mergedRootRef = useMergedRefs(root, ref2);\n    var doc = useDocument();\n    var win = useWindowEx();\n    var inShadow = useHasMergeStylesShadowRootContext();\n    var isFirstRender = (_a2 = usePrevious(false)) !== null && _a2 !== void 0 ? _a2 : true;\n    var props = getPropsWithDefaults(DEFAULT_PROPS$5, propsWithoutDefaults);\n    var internalState = useConst({\n      hasFocus: false,\n      focusStackId: useId(\"ftz-\", props.id)\n    });\n    var children2 = props.children, componentRef = props.componentRef, disabled = props.disabled, disableFirstFocus = props.disableFirstFocus, forceFocusInsideTrap = props.forceFocusInsideTrap, focusPreviouslyFocusedInnerElement = props.focusPreviouslyFocusedInnerElement, firstFocusableSelector = props.firstFocusableSelector, firstFocusableTarget = props.firstFocusableTarget, _b2 = props.disableRestoreFocus, disableRestoreFocus = _b2 === void 0 ? props.ignoreExternalFocusing : _b2, isClickableOutsideFocusTrap = props.isClickableOutsideFocusTrap, enableAriaHiddenSiblings = props.enableAriaHiddenSiblings;\n    var bumperProps = {\n      \"aria-hidden\": true,\n      style: {\n        pointerEvents: \"none\",\n        position: \"fixed\"\n        // 'fixed' prevents browsers from scrolling to bumpers when viewport does not contain them\n      },\n      tabIndex: disabled ? -1 : 0,\n      // make bumpers tabbable only when enabled\n      \"data-is-visible\": true,\n      \"data-is-focus-trap-zone-bumper\": true\n    };\n    var focusElementAsync = React__namespace.useCallback(function(element2) {\n      if (element2 !== firstBumper.current && element2 !== lastBumper.current) {\n        focusAsync(element2);\n      }\n    }, []);\n    var focusFTZ = useEventCallback(function() {\n      if (!root.current) {\n        return;\n      }\n      var previouslyFocusedElementInTrapZone = internalState.previouslyFocusedElementInTrapZone;\n      if (focusPreviouslyFocusedInnerElement && previouslyFocusedElementInTrapZone && elementContains(root.current, previouslyFocusedElementInTrapZone)) {\n        focusElementAsync(previouslyFocusedElementInTrapZone);\n        return;\n      }\n      var firstFocusableChild = null;\n      if (typeof firstFocusableTarget === \"string\") {\n        firstFocusableChild = root.current.querySelector(firstFocusableTarget);\n      } else if (firstFocusableTarget) {\n        firstFocusableChild = firstFocusableTarget(root.current);\n      } else if (firstFocusableSelector) {\n        var focusSelector = typeof firstFocusableSelector === \"string\" ? firstFocusableSelector : firstFocusableSelector();\n        firstFocusableChild = root.current.querySelector(\".\" + focusSelector);\n      }\n      if (!firstFocusableChild) {\n        firstFocusableChild = getNextElement(root.current, root.current.firstChild, false, false, false, true, void 0, void 0, void 0, inShadow);\n      }\n      if (firstFocusableChild) {\n        focusElementAsync(firstFocusableChild);\n      }\n    });\n    var focusBumper = function(isFirstBumper) {\n      if (disabled || !root.current) {\n        return;\n      }\n      var nextFocusable = isFirstBumper === internalState.hasFocus ? getLastTabbable(root.current, lastBumper.current, true, false, inShadow) : getFirstTabbable(root.current, firstBumper.current, true, false, inShadow);\n      if (nextFocusable) {\n        if (nextFocusable === firstBumper.current || nextFocusable === lastBumper.current) {\n          focusFTZ();\n        } else {\n          nextFocusable.focus();\n        }\n      }\n    };\n    var onRootBlurCapture = function(ev) {\n      var _a3;\n      (_a3 = props.onBlurCapture) === null || _a3 === void 0 ? void 0 : _a3.call(props, ev);\n      var relatedTarget = ev.relatedTarget;\n      if (ev.relatedTarget === null) {\n        relatedTarget = getActiveElement(doc);\n      }\n      if (!elementContains(root.current, relatedTarget)) {\n        internalState.hasFocus = false;\n      }\n    };\n    var onRootFocusCapture = function(ev) {\n      var _a3;\n      (_a3 = props.onFocusCapture) === null || _a3 === void 0 ? void 0 : _a3.call(props, ev);\n      if (ev.target === firstBumper.current) {\n        focusBumper(true);\n      } else if (ev.target === lastBumper.current) {\n        focusBumper(false);\n      }\n      internalState.hasFocus = true;\n      if (ev.target !== ev.currentTarget && !(ev.target === firstBumper.current || ev.target === lastBumper.current)) {\n        internalState.previouslyFocusedElementInTrapZone = getEventTarget(ev.nativeEvent);\n      }\n    };\n    var returnFocusToInitiator = useEventCallback(function(elementToFocusOnDismiss) {\n      FocusTrapZone.focusStack = FocusTrapZone.focusStack.filter(function(value2) {\n        return internalState.focusStackId !== value2;\n      });\n      if (!doc) {\n        return;\n      }\n      var activeElement = doc.activeElement;\n      if (!disableRestoreFocus && typeof (elementToFocusOnDismiss === null || elementToFocusOnDismiss === void 0 ? void 0 : elementToFocusOnDismiss.focus) === \"function\" && // only restore focus if the current focused element is within the FTZ, or if nothing is focused\n      (elementContains(root.current, activeElement) || activeElement === doc.body || activeElement.shadowRoot)) {\n        focusElementAsync(elementToFocusOnDismiss);\n      }\n    });\n    var forceFocusOrClickInTrap = useEventCallback(function(ev) {\n      if (disabled) {\n        return;\n      }\n      if (internalState.focusStackId === FocusTrapZone.focusStack.slice(-1)[0]) {\n        var targetElement = getEventTarget(ev);\n        if (targetElement && !elementContains(root.current, targetElement)) {\n          if (doc && getActiveElement(doc) === doc.body) {\n            setTimeout(function() {\n              if (doc && getActiveElement(doc) === doc.body) {\n                focusFTZ();\n                internalState.hasFocus = true;\n              }\n            }, 0);\n          } else {\n            focusFTZ();\n            internalState.hasFocus = true;\n          }\n          ev.preventDefault();\n          ev.stopPropagation();\n        }\n      }\n    });\n    React__namespace.useEffect(function() {\n      var disposables = [];\n      if (forceFocusInsideTrap) {\n        disposables.push(on$1(win, \"focus\", forceFocusOrClickInTrap, true));\n      }\n      if (!isClickableOutsideFocusTrap) {\n        disposables.push(on$1(win, \"click\", forceFocusOrClickInTrap, true));\n      }\n      return function() {\n        disposables.forEach(function(dispose) {\n          return dispose();\n        });\n      };\n    }, [forceFocusInsideTrap, isClickableOutsideFocusTrap, win]);\n    React__namespace.useEffect(function() {\n      if (disabled || !isFirstRender && !forceFocusInsideTrap || !root.current) {\n        return;\n      }\n      FocusTrapZone.focusStack.push(internalState.focusStackId);\n      var elementToFocusOnDismiss = props.elementToFocusOnDismiss || getActiveElement(doc);\n      if (!disableFirstFocus && !elementContains(root.current, elementToFocusOnDismiss)) {\n        focusFTZ();\n      }\n      return function() {\n        return returnFocusToInitiator(elementToFocusOnDismiss);\n      };\n    }, [forceFocusInsideTrap, disabled]);\n    React__namespace.useEffect(function() {\n      if (!disabled && enableAriaHiddenSiblings) {\n        var unmodalize2 = modalize(root.current);\n        return unmodalize2;\n      }\n    }, [disabled, enableAriaHiddenSiblings, root]);\n    useUnmount(function() {\n      delete internalState.previouslyFocusedElementInTrapZone;\n    });\n    useComponentRef$6(componentRef, internalState.previouslyFocusedElementInTrapZone, focusFTZ);\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({ \"aria-labelledby\": props.ariaLabelledBy }, getNativeProps(props, divProperties), { ref: mergedRootRef, onFocusCapture: onRootFocusCapture, onBlurCapture: onRootBlurCapture }),\n      React__namespace.createElement(\"div\", __assign$1({}, bumperProps, { ref: firstBumper })),\n      children2,\n      React__namespace.createElement(\"div\", __assign$1({}, bumperProps, { ref: lastBumper }))\n    );\n  });\n  FocusTrapZone.displayName = COMPONENT_NAME$8;\n  FocusTrapZone.focusStack = [];\n  var defaultIconRenderer = function(props) {\n    var item = props.item, classNames2 = props.classNames;\n    var iconProps = item.iconProps;\n    return React__namespace.createElement(Icon, __assign$1({}, iconProps, { className: classNames2.icon }));\n  };\n  var renderItemIcon = function(props) {\n    var item = props.item, hasIcons = props.hasIcons;\n    if (!hasIcons) {\n      return null;\n    }\n    if (item.onRenderIcon) {\n      return item.onRenderIcon(props, defaultIconRenderer);\n    }\n    return defaultIconRenderer(props);\n  };\n  var renderCheckMarkIcon = function(_a2) {\n    var onCheckmarkClick = _a2.onCheckmarkClick, item = _a2.item, classNames2 = _a2.classNames;\n    var isItemChecked = getIsChecked(item);\n    if (onCheckmarkClick) {\n      var onClick = function(e) {\n        return onCheckmarkClick(item, e);\n      };\n      return React__namespace.createElement(Icon, {\n        iconName: item.canCheck !== false && isItemChecked ? \"CheckMark\" : \"\",\n        className: classNames2.checkmarkIcon,\n        // eslint-disable-next-line react/jsx-no-bind\n        onClick\n      });\n    }\n    return null;\n  };\n  var renderItemName = function(_a2) {\n    var item = _a2.item, classNames2 = _a2.classNames;\n    if (item.text || item.name) {\n      return React__namespace.createElement(\"span\", { className: classNames2.label }, item.text || item.name);\n    }\n    return null;\n  };\n  var renderSecondaryText = function(_a2) {\n    var item = _a2.item, classNames2 = _a2.classNames;\n    if (item.secondaryText) {\n      return React__namespace.createElement(\"span\", { className: classNames2.secondaryText }, item.secondaryText);\n    }\n    return null;\n  };\n  var renderSubMenuIcon = function(_a2) {\n    var item = _a2.item, classNames2 = _a2.classNames, theme = _a2.theme;\n    if (hasSubmenu(item)) {\n      return React__namespace.createElement(Icon, __assign$1({ iconName: getRTL(theme) ? \"ChevronLeft\" : \"ChevronRight\" }, item.submenuIconProps, { className: classNames2.subMenuIcon }));\n    }\n    return null;\n  };\n  var ContextualMenuItemBase = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuItemBase2, _super);\n      function ContextualMenuItemBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this.openSubMenu = function() {\n          var _a2 = _this.props, item = _a2.item, openSubMenu = _a2.openSubMenu, getSubmenuTarget = _a2.getSubmenuTarget;\n          if (getSubmenuTarget) {\n            var submenuTarget = getSubmenuTarget();\n            if (hasSubmenu(item) && openSubMenu && submenuTarget) {\n              openSubMenu(item, submenuTarget);\n            }\n          }\n        };\n        _this.dismissSubMenu = function() {\n          var _a2 = _this.props, item = _a2.item, dismissSubMenu = _a2.dismissSubMenu;\n          if (hasSubmenu(item) && dismissSubMenu) {\n            dismissSubMenu();\n          }\n        };\n        _this.dismissMenu = function(dismissAll) {\n          var dismissMenu = _this.props.dismissMenu;\n          if (dismissMenu) {\n            dismissMenu(void 0, dismissAll);\n          }\n        };\n        initializeComponentRef(_this);\n        return _this;\n      }\n      ContextualMenuItemBase2.prototype.render = function() {\n        var _a2 = this.props, item = _a2.item, classNames2 = _a2.classNames;\n        var renderContent = item.onRenderContent || this._renderLayout;\n        return React__namespace.createElement(\"div\", { className: item.split ? classNames2.linkContentMenu : classNames2.linkContent }, renderContent(this.props, {\n          renderCheckMarkIcon,\n          renderItemIcon,\n          renderItemName,\n          renderSecondaryText,\n          renderSubMenuIcon\n        }));\n      };\n      ContextualMenuItemBase2.prototype._renderLayout = function(props, defaultRenders) {\n        return React__namespace.createElement(\n          React__namespace.Fragment,\n          null,\n          defaultRenders.renderCheckMarkIcon(props),\n          defaultRenders.renderItemIcon(props),\n          defaultRenders.renderItemName(props),\n          defaultRenders.renderSecondaryText(props),\n          defaultRenders.renderSubMenuIcon(props)\n        );\n      };\n      return ContextualMenuItemBase2;\n    })(React__namespace.Component)\n  );\n  var getDividerClassNames = memoizeFunction(\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    function(theme) {\n      return mergeStyleSets({\n        wrapper: {\n          display: \"inline-flex\",\n          height: \"100%\",\n          alignItems: \"center\"\n        },\n        divider: {\n          width: 1,\n          height: \"100%\",\n          backgroundColor: theme.palette.neutralTertiaryAlt\n        }\n      });\n    }\n  );\n  var CONTEXTUAL_MENU_ITEM_HEIGHT = 36;\n  var MediumScreenSelector$1 = getScreenSelector(0, ScreenWidthMaxMedium);\n  var getMenuItemStyles = memoizeFunction(function(theme) {\n    var _a2, _b2, _c2, _d2, _e2;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, palette = theme.palette;\n    var ContextualMenuItemBackgroundHoverColor = semanticColors.menuItemBackgroundHovered;\n    var ContextualMenuItemTextHoverColor = semanticColors.menuItemTextHovered;\n    var ContextualMenuItemBackgroundSelectedColor = semanticColors.menuItemBackgroundPressed;\n    var ContextualMenuItemDividerColor = semanticColors.bodyDivider;\n    var menuItemStyles = {\n      item: [\n        fonts.medium,\n        {\n          color: semanticColors.bodyText,\n          position: \"relative\",\n          boxSizing: \"border-box\"\n        }\n      ],\n      divider: {\n        display: \"block\",\n        height: \"1px\",\n        backgroundColor: ContextualMenuItemDividerColor,\n        position: \"relative\"\n      },\n      root: [\n        getFocusStyle(theme),\n        fonts.medium,\n        {\n          color: semanticColors.bodyText,\n          backgroundColor: \"transparent\",\n          border: \"none\",\n          width: \"100%\",\n          height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          lineHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          display: \"block\",\n          cursor: \"pointer\",\n          padding: \"0px 8px 0 4px\",\n          // inner elements have a margin of 4px (4 + 4 = 8px as on right side)\n          textAlign: \"left\"\n        }\n      ],\n      rootDisabled: {\n        color: semanticColors.disabledBodyText,\n        cursor: \"default\",\n        pointerEvents: \"none\",\n        selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n          // ensure disabled text looks different than enabled\n          color: \"GrayText\",\n          opacity: 1\n        }, _a2)\n      },\n      rootHovered: {\n        backgroundColor: ContextualMenuItemBackgroundHoverColor,\n        color: ContextualMenuItemTextHoverColor,\n        selectors: {\n          \".ms-ContextualMenu-icon\": {\n            color: palette.themeDarkAlt\n          },\n          \".ms-ContextualMenu-submenuIcon\": {\n            color: palette.neutralPrimary\n          }\n        }\n      },\n      rootFocused: {\n        backgroundColor: palette.white\n      },\n      rootChecked: {\n        selectors: {\n          \".ms-ContextualMenu-checkmarkIcon\": {\n            color: palette.neutralPrimary\n          }\n        }\n      },\n      rootPressed: {\n        backgroundColor: ContextualMenuItemBackgroundSelectedColor,\n        selectors: {\n          \".ms-ContextualMenu-icon\": {\n            color: palette.themeDark\n          },\n          \".ms-ContextualMenu-submenuIcon\": {\n            color: palette.neutralPrimary\n          }\n        }\n      },\n      rootExpanded: {\n        backgroundColor: ContextualMenuItemBackgroundSelectedColor,\n        color: semanticColors.bodyTextChecked,\n        selectors: (_b2 = {\n          \".ms-ContextualMenu-submenuIcon\": (_c2 = {}, _c2[HighContrastSelector] = {\n            // icons inside of anchor tags are not properly inheriting color in high contrast\n            color: \"inherit\"\n          }, _c2)\n        }, _b2[HighContrastSelector] = __assign$1({}, getHighContrastNoAdjustStyle()), _b2)\n      },\n      linkContent: {\n        whiteSpace: \"nowrap\",\n        height: \"inherit\",\n        display: \"flex\",\n        alignItems: \"center\",\n        maxWidth: \"100%\"\n      },\n      anchorLink: {\n        padding: \"0px 8px 0 4px\",\n        // inner elements have a margin of 4px (4 + 4 = 8px as on right side)\n        textRendering: \"auto\",\n        color: \"inherit\",\n        letterSpacing: \"normal\",\n        wordSpacing: \"normal\",\n        textTransform: \"none\",\n        textIndent: \"0px\",\n        textShadow: \"none\",\n        textDecoration: \"none\",\n        boxSizing: \"border-box\"\n      },\n      label: {\n        margin: \"0 4px\",\n        verticalAlign: \"middle\",\n        display: \"inline-block\",\n        flexGrow: \"1\",\n        textOverflow: \"ellipsis\",\n        whiteSpace: \"nowrap\",\n        overflow: \"hidden\"\n      },\n      secondaryText: {\n        color: theme.palette.neutralSecondary,\n        paddingLeft: \"20px\",\n        textAlign: \"right\"\n      },\n      icon: {\n        display: \"inline-block\",\n        minHeight: \"1px\",\n        maxHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n        fontSize: IconFontSizes.medium,\n        width: IconFontSizes.medium,\n        margin: \"0 4px\",\n        verticalAlign: \"middle\",\n        flexShrink: \"0\",\n        selectors: (_d2 = {}, _d2[MediumScreenSelector$1] = {\n          fontSize: IconFontSizes.large,\n          width: IconFontSizes.large\n        }, _d2)\n      },\n      iconColor: {\n        color: semanticColors.menuIcon\n      },\n      iconDisabled: {\n        color: semanticColors.disabledBodyText\n      },\n      checkmarkIcon: {\n        color: semanticColors.bodySubtext\n      },\n      subMenuIcon: {\n        height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n        lineHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n        color: palette.neutralSecondary,\n        textAlign: \"center\",\n        display: \"inline-block\",\n        verticalAlign: \"middle\",\n        flexShrink: \"0\",\n        fontSize: IconFontSizes.small,\n        // 12px\n        selectors: (_e2 = {\n          \":hover\": {\n            color: palette.neutralPrimary\n          },\n          \":active\": {\n            color: palette.neutralPrimary\n          }\n        }, _e2[MediumScreenSelector$1] = {\n          fontSize: IconFontSizes.medium\n          // 16px\n        }, _e2)\n      },\n      splitButtonFlexContainer: [\n        getFocusStyle(theme),\n        {\n          display: \"flex\",\n          height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          flexWrap: \"nowrap\",\n          justifyContent: \"center\",\n          alignItems: \"flex-start\"\n        }\n      ]\n    };\n    return concatStyleSets(menuItemStyles);\n  });\n  var CONTEXTUAL_SPLIT_MENU_MINWIDTH = \"28px\";\n  var MediumScreenSelector = getScreenSelector(0, ScreenWidthMaxMedium);\n  var getSplitButtonVerticalDividerClassNames = memoizeFunction(\n    /* eslint-disable @typescript-eslint/no-deprecated */\n    function(theme) {\n      var _a2;\n      return mergeStyleSets(getDividerClassNames(theme), {\n        /* eslint-enable @typescript-eslint/no-deprecated */\n        wrapper: {\n          position: \"absolute\",\n          right: 28,\n          // width of the splitMenu based on the padding plus icon fontSize\n          selectors: (_a2 = {}, _a2[MediumScreenSelector] = {\n            right: 32\n            // fontSize of the icon increased from 12px to 16px\n          }, _a2)\n        },\n        divider: {\n          height: 16,\n          width: 1\n        }\n      });\n    }\n  );\n  var GlobalClassNames$d = {\n    item: \"ms-ContextualMenu-item\",\n    divider: \"ms-ContextualMenu-divider\",\n    root: \"ms-ContextualMenu-link\",\n    isChecked: \"is-checked\",\n    isExpanded: \"is-expanded\",\n    isDisabled: \"is-disabled\",\n    linkContent: \"ms-ContextualMenu-linkContent\",\n    linkContentMenu: \"ms-ContextualMenu-linkContent\",\n    icon: \"ms-ContextualMenu-icon\",\n    iconColor: \"ms-ContextualMenu-iconColor\",\n    checkmarkIcon: \"ms-ContextualMenu-checkmarkIcon\",\n    subMenuIcon: \"ms-ContextualMenu-submenuIcon\",\n    label: \"ms-ContextualMenu-itemText\",\n    secondaryText: \"ms-ContextualMenu-secondaryText\",\n    splitMenu: \"ms-ContextualMenu-splitMenu\",\n    screenReaderText: \"ms-ContextualMenu-screenReaderText\"\n  };\n  var getItemClassNames = memoizeFunction(function(theme, disabled, expanded, checked, isAnchorLink, knownIcon, itemClassName, dividerClassName, iconClassName, subMenuClassName, primaryDisabled, className2) {\n    var _a2, _b2, _c2, _d2;\n    var styles = getMenuItemStyles(theme);\n    var classNames2 = getGlobalClassNames(GlobalClassNames$d, theme);\n    return mergeStyleSets({\n      item: [classNames2.item, styles.item, itemClassName],\n      divider: [classNames2.divider, styles.divider, dividerClassName],\n      root: [\n        classNames2.root,\n        styles.root,\n        checked && [classNames2.isChecked, styles.rootChecked],\n        isAnchorLink && styles.anchorLink,\n        expanded && [classNames2.isExpanded, styles.rootExpanded],\n        disabled && [classNames2.isDisabled, styles.rootDisabled],\n        !disabled && !expanded && [\n          {\n            selectors: (_a2 = {\n              \":hover\": styles.rootHovered,\n              \":active\": styles.rootPressed\n            }, // eslint-disable-next-line @fluentui/max-len\n            _a2[\".\".concat(IsFocusVisibleClassName, \" &:focus, .\").concat(IsFocusVisibleClassName, \" &:focus:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:hover\")] = styles.rootFocused, _a2[\".\".concat(IsFocusVisibleClassName, \" &:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:hover\")] = {\n              background: \"inherit;\"\n            }, _a2)\n          }\n        ],\n        className2\n      ],\n      splitPrimary: [\n        styles.root,\n        {\n          width: \"calc(100% - \".concat(CONTEXTUAL_SPLIT_MENU_MINWIDTH, \")\")\n        },\n        checked && [\"is-checked\", styles.rootChecked],\n        (disabled || primaryDisabled) && [\"is-disabled\", styles.rootDisabled],\n        !(disabled || primaryDisabled) && !checked && [\n          {\n            selectors: (_b2 = {\n              \":hover\": styles.rootHovered\n            }, // when hovering over the splitPrimary also affect the splitMenu\n            _b2[\":hover ~ .\".concat(classNames2.splitMenu)] = styles.rootHovered, _b2[\":active\"] = styles.rootPressed, // eslint-disable-next-line @fluentui/max-len\n            _b2[\".\".concat(IsFocusVisibleClassName, \" &:focus, .\").concat(IsFocusVisibleClassName, \" &:focus:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:hover\")] = styles.rootFocused, _b2[\".\".concat(IsFocusVisibleClassName, \" &:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:hover\")] = {\n              background: \"inherit;\"\n            }, _b2)\n          }\n        ]\n      ],\n      splitMenu: [\n        classNames2.splitMenu,\n        styles.root,\n        {\n          flexBasis: \"0\",\n          padding: \"0 8px\",\n          minWidth: CONTEXTUAL_SPLIT_MENU_MINWIDTH\n        },\n        expanded && [\"is-expanded\", styles.rootExpanded],\n        disabled && [\"is-disabled\", styles.rootDisabled],\n        !disabled && !expanded && [\n          {\n            selectors: (_c2 = {\n              \":hover\": styles.rootHovered,\n              \":active\": styles.rootPressed\n            }, // eslint-disable-next-line @fluentui/max-len\n            _c2[\".\".concat(IsFocusVisibleClassName, \" &:focus, .\").concat(IsFocusVisibleClassName, \" &:focus:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:hover\")] = styles.rootFocused, _c2[\".\".concat(IsFocusVisibleClassName, \" &:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:hover\")] = {\n              background: \"inherit;\"\n            }, _c2)\n          }\n        ]\n      ],\n      anchorLink: styles.anchorLink,\n      linkContent: [classNames2.linkContent, styles.linkContent],\n      linkContentMenu: [\n        classNames2.linkContentMenu,\n        styles.linkContent,\n        {\n          justifyContent: \"center\"\n        }\n      ],\n      icon: [\n        classNames2.icon,\n        knownIcon && styles.iconColor,\n        styles.icon,\n        iconClassName,\n        disabled && [classNames2.isDisabled, styles.iconDisabled]\n      ],\n      iconColor: styles.iconColor,\n      checkmarkIcon: [classNames2.checkmarkIcon, knownIcon && styles.checkmarkIcon, styles.icon, iconClassName],\n      subMenuIcon: [\n        classNames2.subMenuIcon,\n        styles.subMenuIcon,\n        subMenuClassName,\n        expanded && { color: theme.palette.neutralPrimary },\n        disabled && [styles.iconDisabled]\n      ],\n      label: [classNames2.label, styles.label],\n      secondaryText: [classNames2.secondaryText, styles.secondaryText],\n      splitContainer: [\n        styles.splitButtonFlexContainer,\n        !disabled && !checked && [\n          {\n            selectors: (_d2 = {}, // eslint-disable-next-line @fluentui/max-len\n            _d2[\".\".concat(IsFocusVisibleClassName, \" &:focus, .\").concat(IsFocusVisibleClassName, \" &:focus:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:hover\")] = styles.rootFocused, _d2)\n          }\n        ]\n      ],\n      screenReaderText: [\n        classNames2.screenReaderText,\n        styles.screenReaderText,\n        hiddenContentStyle,\n        { visibility: \"hidden\" }\n      ]\n    });\n  });\n  var getItemStyles = function(props) {\n    var theme = props.theme, disabled = props.disabled, expanded = props.expanded, checked = props.checked, isAnchorLink = props.isAnchorLink, knownIcon = props.knownIcon, itemClassName = props.itemClassName, dividerClassName = props.dividerClassName, iconClassName = props.iconClassName, subMenuClassName = props.subMenuClassName, primaryDisabled = props.primaryDisabled, className2 = props.className;\n    return getItemClassNames(theme, disabled, expanded, checked, isAnchorLink, knownIcon, itemClassName, dividerClassName, iconClassName, subMenuClassName, primaryDisabled, className2);\n  };\n  var ContextualMenuItem = styled(ContextualMenuItemBase, getItemStyles, void 0, { scope: \"ContextualMenuItem\" });\n  var ContextualMenuItemWrapper = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuItemWrapper2, _super);\n      function ContextualMenuItemWrapper2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._onItemMouseEnter = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseEnter = _a2.onItemMouseEnter;\n          if (onItemMouseEnter) {\n            onItemMouseEnter(item, ev, ev.currentTarget);\n          }\n        };\n        _this._onItemClick = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemClickBase = _a2.onItemClickBase;\n          if (onItemClickBase) {\n            onItemClickBase(item, ev, ev.currentTarget);\n          }\n        };\n        _this._onItemMouseLeave = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseLeave = _a2.onItemMouseLeave;\n          if (onItemMouseLeave) {\n            onItemMouseLeave(item, ev);\n          }\n        };\n        _this._onItemKeyDown = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemKeyDown = _a2.onItemKeyDown;\n          if (onItemKeyDown) {\n            onItemKeyDown(item, ev);\n          }\n        };\n        _this._onItemMouseMove = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseMove = _a2.onItemMouseMove;\n          if (onItemMouseMove) {\n            onItemMouseMove(item, ev, ev.currentTarget);\n          }\n        };\n        _this._getSubmenuTarget = function() {\n          return void 0;\n        };\n        initializeComponentRef(_this);\n        return _this;\n      }\n      ContextualMenuItemWrapper2.prototype.shouldComponentUpdate = function(newProps) {\n        return !shallowCompare(newProps, this.props);\n      };\n      return ContextualMenuItemWrapper2;\n    })(React__namespace.Component)\n  );\n  var KTP_PREFIX = \"ktp\";\n  var KTP_SEPARATOR = \"-\";\n  var DATAKTP_TARGET = \"data-ktp-target\";\n  var DATAKTP_EXECUTE_TARGET = \"data-ktp-execute-target\";\n  var KTP_LAYER_ID = \"ktp-layer-id\";\n  var KeytipEvents;\n  (function(KeytipEvents2) {\n    KeytipEvents2.KEYTIP_ADDED = \"keytipAdded\";\n    KeytipEvents2.KEYTIP_REMOVED = \"keytipRemoved\";\n    KeytipEvents2.KEYTIP_UPDATED = \"keytipUpdated\";\n    KeytipEvents2.PERSISTED_KEYTIP_ADDED = \"persistedKeytipAdded\";\n    KeytipEvents2.PERSISTED_KEYTIP_REMOVED = \"persistedKeytipRemoved\";\n    KeytipEvents2.PERSISTED_KEYTIP_EXECUTE = \"persistedKeytipExecute\";\n    KeytipEvents2.ENTER_KEYTIP_MODE = \"enterKeytipMode\";\n    KeytipEvents2.EXIT_KEYTIP_MODE = \"exitKeytipMode\";\n  })(KeytipEvents || (KeytipEvents = {}));\n  var KeytipManager = (\n    /** @class */\n    (function() {\n      function KeytipManager2() {\n        this.keytips = {};\n        this.persistedKeytips = {};\n        this.sequenceMapping = {};\n        this.inKeytipMode = false;\n        this.shouldEnterKeytipMode = true;\n        this.delayUpdatingKeytipChange = false;\n      }\n      KeytipManager2.getInstance = function() {\n        return this._instance;\n      };\n      KeytipManager2.prototype.init = function(delayUpdatingKeytipChange) {\n        this.delayUpdatingKeytipChange = delayUpdatingKeytipChange;\n      };\n      KeytipManager2.prototype.register = function(keytipProps, persisted) {\n        if (persisted === void 0) {\n          persisted = false;\n        }\n        var props = keytipProps;\n        if (!persisted) {\n          props = this.addParentOverflow(keytipProps);\n          this.sequenceMapping[props.keySequences.toString()] = props;\n        }\n        var uniqueKeytip = this._getUniqueKtp(props);\n        persisted ? this.persistedKeytips[uniqueKeytip.uniqueID] = uniqueKeytip : this.keytips[uniqueKeytip.uniqueID] = uniqueKeytip;\n        if (this.inKeytipMode || !this.delayUpdatingKeytipChange) {\n          var event_1 = persisted ? KeytipEvents.PERSISTED_KEYTIP_ADDED : KeytipEvents.KEYTIP_ADDED;\n          EventGroup.raise(this, event_1, {\n            keytip: props,\n            uniqueID: uniqueKeytip.uniqueID\n          });\n        }\n        return uniqueKeytip.uniqueID;\n      };\n      KeytipManager2.prototype.update = function(keytipProps, uniqueID) {\n        var newKeytipProps = this.addParentOverflow(keytipProps);\n        var uniqueKeytip = this._getUniqueKtp(newKeytipProps, uniqueID);\n        var oldKeyTip = this.keytips[uniqueID];\n        if (oldKeyTip) {\n          uniqueKeytip.keytip.visible = oldKeyTip.keytip.visible;\n          this.keytips[uniqueID] = uniqueKeytip;\n          delete this.sequenceMapping[oldKeyTip.keytip.keySequences.toString()];\n          this.sequenceMapping[uniqueKeytip.keytip.keySequences.toString()] = uniqueKeytip.keytip;\n          if (this.inKeytipMode || !this.delayUpdatingKeytipChange) {\n            EventGroup.raise(this, KeytipEvents.KEYTIP_UPDATED, {\n              keytip: uniqueKeytip.keytip,\n              uniqueID: uniqueKeytip.uniqueID\n            });\n          }\n        }\n      };\n      KeytipManager2.prototype.unregister = function(keytipToRemove, uniqueID, persisted) {\n        if (persisted === void 0) {\n          persisted = false;\n        }\n        persisted ? delete this.persistedKeytips[uniqueID] : delete this.keytips[uniqueID];\n        !persisted && delete this.sequenceMapping[keytipToRemove.keySequences.toString()];\n        var event2 = persisted ? KeytipEvents.PERSISTED_KEYTIP_REMOVED : KeytipEvents.KEYTIP_REMOVED;\n        if (this.inKeytipMode || !this.delayUpdatingKeytipChange) {\n          EventGroup.raise(this, event2, {\n            keytip: keytipToRemove,\n            uniqueID\n          });\n        }\n      };\n      KeytipManager2.prototype.enterKeytipMode = function() {\n        EventGroup.raise(this, KeytipEvents.ENTER_KEYTIP_MODE);\n      };\n      KeytipManager2.prototype.exitKeytipMode = function() {\n        EventGroup.raise(this, KeytipEvents.EXIT_KEYTIP_MODE);\n      };\n      KeytipManager2.prototype.getKeytips = function() {\n        var _this = this;\n        return Object.keys(this.keytips).map(function(key2) {\n          return _this.keytips[key2].keytip;\n        });\n      };\n      KeytipManager2.prototype.addParentOverflow = function(keytipProps) {\n        var fullSequence = __spreadArray([], keytipProps.keySequences, true);\n        fullSequence.pop();\n        if (fullSequence.length !== 0) {\n          var parentKeytip = this.sequenceMapping[fullSequence.toString()];\n          if (parentKeytip && parentKeytip.overflowSetSequence) {\n            return __assign$1(__assign$1({}, keytipProps), { overflowSetSequence: parentKeytip.overflowSetSequence });\n          }\n        }\n        return keytipProps;\n      };\n      KeytipManager2.prototype.menuExecute = function(overflowButtonSequences, keytipSequences) {\n        EventGroup.raise(this, KeytipEvents.PERSISTED_KEYTIP_EXECUTE, {\n          overflowButtonSequences,\n          keytipSequences\n        });\n      };\n      KeytipManager2.prototype._getUniqueKtp = function(keytipProps, uniqueID) {\n        if (uniqueID === void 0) {\n          uniqueID = getId();\n        }\n        return { keytip: __assign$1({}, keytipProps), uniqueID };\n      };\n      KeytipManager2._instance = new KeytipManager2();\n      return KeytipManager2;\n    })()\n  );\n  function sequencesToID(keySequences) {\n    return keySequences.reduce(function(prevValue, keySequence) {\n      return prevValue + KTP_SEPARATOR + keySequence.split(\"\").join(KTP_SEPARATOR);\n    }, KTP_PREFIX);\n  }\n  function mergeOverflows(keySequences, overflowKeySequences) {\n    var overflowSequenceLen = overflowKeySequences.length;\n    var overflowSequence = __spreadArray([], overflowKeySequences, true).pop();\n    var newKeySequences = __spreadArray([], keySequences, true);\n    return addElementAtIndex(newKeySequences, overflowSequenceLen - 1, overflowSequence);\n  }\n  function getAriaDescribedBy(keySequences) {\n    var describedby = \" \" + KTP_LAYER_ID;\n    if (!keySequences.length) {\n      return describedby;\n    }\n    return describedby + \" \" + sequencesToID(keySequences);\n  }\n  function useKeytipData(options2) {\n    var uniqueId = React__namespace.useRef(void 0);\n    var keytipProps = options2.keytipProps ? __assign$1({ disabled: options2.disabled }, options2.keytipProps) : void 0;\n    var keytipManager = useConst(KeytipManager.getInstance());\n    var prevOptions = usePrevious(options2);\n    useIsomorphicLayoutEffect(function() {\n      if (uniqueId.current && keytipProps && ((prevOptions === null || prevOptions === void 0 ? void 0 : prevOptions.keytipProps) !== options2.keytipProps || (prevOptions === null || prevOptions === void 0 ? void 0 : prevOptions.disabled) !== options2.disabled)) {\n        keytipManager.update(keytipProps, uniqueId.current);\n      }\n    });\n    useIsomorphicLayoutEffect(function() {\n      if (keytipProps) {\n        uniqueId.current = keytipManager.register(keytipProps);\n      }\n      return function() {\n        keytipProps && keytipManager.unregister(keytipProps, uniqueId.current);\n      };\n    }, []);\n    var nativeKeytipProps = {\n      ariaDescribedBy: options2.ariaDescribedBy,\n      keytipId: void 0\n    };\n    if (keytipProps) {\n      nativeKeytipProps = getKeytipData(keytipManager, keytipProps, options2.ariaDescribedBy);\n    }\n    return nativeKeytipProps;\n  }\n  function getKeytipData(keytipManager, keytipProps, describedByPrepend) {\n    var newKeytipProps = keytipManager.addParentOverflow(keytipProps);\n    var ariaDescribedBy = mergeAriaAttributeValues(describedByPrepend, getAriaDescribedBy(newKeytipProps.keySequences));\n    var keySequences = __spreadArray([], newKeytipProps.keySequences, true);\n    if (newKeytipProps.overflowSetSequence) {\n      keySequences = mergeOverflows(keySequences, newKeytipProps.overflowSetSequence);\n    }\n    var keytipId = sequencesToID(keySequences);\n    return {\n      ariaDescribedBy,\n      keytipId\n    };\n  }\n  var KeytipData = function(props) {\n    var _a2;\n    var children2 = props.children, keytipDataProps = __rest(props, [\"children\"]);\n    var _b2 = useKeytipData(keytipDataProps), keytipId = _b2.keytipId, ariaDescribedBy = _b2.ariaDescribedBy;\n    return children2((_a2 = {}, _a2[DATAKTP_TARGET] = keytipId, _a2[DATAKTP_EXECUTE_TARGET] = keytipId, _a2[\"aria-describedby\"] = ariaDescribedBy, _a2));\n  };\n  var ContextualMenuAnchor = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuAnchor2, _super);\n      function ContextualMenuAnchor2() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._anchor = React__namespace.createRef();\n        _this._getMemoizedMenuButtonKeytipProps = memoizeFunction(function(keytipProps) {\n          return __assign$1(__assign$1({}, keytipProps), { hasMenu: true });\n        });\n        _this._getSubmenuTarget = function() {\n          return _this._anchor.current ? _this._anchor.current : void 0;\n        };\n        _this._onItemClick = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemClick = _a2.onItemClick;\n          if (onItemClick) {\n            onItemClick(item, ev);\n          }\n        };\n        _this._renderAriaDescription = function(ariaDescription, className2) {\n          return ariaDescription ? React__namespace.createElement(\"span\", { id: _this._ariaDescriptionId, className: className2 }, ariaDescription) : null;\n        };\n        return _this;\n      }\n      ContextualMenuAnchor2.prototype.render = function() {\n        var _this = this;\n        var _a2 = this.props, item = _a2.item, classNames2 = _a2.classNames, index2 = _a2.index, focusableElementIndex = _a2.focusableElementIndex, totalItemCount = _a2.totalItemCount, hasCheckmarks = _a2.hasCheckmarks, hasIcons = _a2.hasIcons, expandedMenuItemKey = _a2.expandedMenuItemKey, onItemClick = _a2.onItemClick, openSubMenu = _a2.openSubMenu, dismissSubMenu = _a2.dismissSubMenu, dismissMenu = _a2.dismissMenu;\n        var ChildrenRenderer = ContextualMenuItem;\n        if (this.props.item.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(this.props.item.contextualMenuItemAs, ChildrenRenderer);\n        }\n        if (this.props.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(this.props.contextualMenuItemAs, ChildrenRenderer);\n        }\n        var anchorRel = item.rel;\n        if (item.target && item.target.toLowerCase() === \"_blank\") {\n          anchorRel = anchorRel ? anchorRel : \"nofollow noopener noreferrer\";\n        }\n        var itemHasSubmenu = hasSubmenu(item);\n        var nativeProps = getNativeProps(item, anchorProperties);\n        var disabled = isItemDisabled(item);\n        var itemProps = item.itemProps, ariaDescription = item.ariaDescription;\n        var keytipProps = item.keytipProps;\n        if (keytipProps && itemHasSubmenu) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        if (ariaDescription) {\n          this._ariaDescriptionId = getId();\n        }\n        var ariaDescribedByIds = mergeAriaAttributeValues(item.ariaDescribedBy, ariaDescription ? this._ariaDescriptionId : void 0, nativeProps[\"aria-describedby\"]);\n        var additionalItemProperties = {\n          \"aria-describedby\": ariaDescribedByIds\n        };\n        return React__namespace.createElement(\n          \"div\",\n          null,\n          React__namespace.createElement(KeytipData, { keytipProps: item.keytipProps, ariaDescribedBy: ariaDescribedByIds, disabled }, function(keytipAttributes) {\n            return React__namespace.createElement(\n              \"a\",\n              __assign$1({}, additionalItemProperties, nativeProps, keytipAttributes, {\n                ref: _this._anchor,\n                href: item.href,\n                target: item.target,\n                rel: anchorRel,\n                className: classNames2.root,\n                role: \"menuitem\",\n                \"aria-haspopup\": itemHasSubmenu || void 0,\n                \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : void 0,\n                \"aria-posinset\": focusableElementIndex + 1,\n                \"aria-setsize\": totalItemCount,\n                \"aria-disabled\": isItemDisabled(item),\n                // eslint-disable-next-line @typescript-eslint/no-deprecated\n                style: item.style,\n                onClick: _this._onItemClick,\n                onMouseEnter: _this._onItemMouseEnter,\n                onMouseLeave: _this._onItemMouseLeave,\n                onMouseMove: _this._onItemMouseMove,\n                onKeyDown: itemHasSubmenu ? _this._onItemKeyDown : void 0\n              }),\n              React__namespace.createElement(ChildrenRenderer, __assign$1({ componentRef: item.componentRef, item, classNames: classNames2, index: index2, onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : void 0, hasIcons, openSubMenu, dismissSubMenu, dismissMenu, getSubmenuTarget: _this._getSubmenuTarget }, itemProps)),\n              _this._renderAriaDescription(ariaDescription, classNames2.screenReaderText)\n            );\n          })\n        );\n      };\n      return ContextualMenuAnchor2;\n    })(ContextualMenuItemWrapper)\n  );\n  var ContextualMenuButton = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuButton2, _super);\n      function ContextualMenuButton2() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._btn = React__namespace.createRef();\n        _this._getMemoizedMenuButtonKeytipProps = memoizeFunction(function(keytipProps) {\n          return __assign$1(__assign$1({}, keytipProps), { hasMenu: true });\n        });\n        _this._renderAriaDescription = function(ariaDescription, className2) {\n          return ariaDescription ? React__namespace.createElement(\"span\", { id: _this._ariaDescriptionId, className: className2 }, ariaDescription) : null;\n        };\n        _this._getSubmenuTarget = function() {\n          return _this._btn.current ? _this._btn.current : void 0;\n        };\n        return _this;\n      }\n      ContextualMenuButton2.prototype.render = function() {\n        var _this = this;\n        var _a2 = this.props, item = _a2.item, classNames2 = _a2.classNames, index2 = _a2.index, focusableElementIndex = _a2.focusableElementIndex, totalItemCount = _a2.totalItemCount, hasCheckmarks = _a2.hasCheckmarks, hasIcons = _a2.hasIcons, contextualMenuItemAs = _a2.contextualMenuItemAs, expandedMenuItemKey = _a2.expandedMenuItemKey, onItemMouseDown2 = _a2.onItemMouseDown, onItemClick = _a2.onItemClick, openSubMenu = _a2.openSubMenu, dismissSubMenu = _a2.dismissSubMenu, dismissMenu = _a2.dismissMenu;\n        var ChildrenRenderer = ContextualMenuItem;\n        if (item.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(item.contextualMenuItemAs, ChildrenRenderer);\n        }\n        if (contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(contextualMenuItemAs, ChildrenRenderer);\n        }\n        var isChecked = getIsChecked(item);\n        var canCheck = isChecked !== null;\n        var defaultRole = getMenuItemAriaRole(item);\n        var itemHasSubmenu = hasSubmenu(item);\n        var itemProps = item.itemProps, ariaLabel2 = item.ariaLabel, ariaDescription = item.ariaDescription;\n        var buttonNativeProperties = getNativeProps(item, buttonProperties);\n        delete buttonNativeProperties.disabled;\n        var itemRole = item.role || defaultRole;\n        if (ariaDescription) {\n          this._ariaDescriptionId = getId();\n        }\n        var ariaDescribedByIds = mergeAriaAttributeValues(item.ariaDescribedBy, ariaDescription ? this._ariaDescriptionId : void 0, buttonNativeProperties[\"aria-describedby\"]);\n        var itemButtonProperties = {\n          className: classNames2.root,\n          onClick: this._onItemClick,\n          onKeyDown: itemHasSubmenu ? this._onItemKeyDown : void 0,\n          onMouseEnter: this._onItemMouseEnter,\n          onMouseLeave: this._onItemMouseLeave,\n          onMouseDown: function(ev) {\n            return onItemMouseDown2 ? onItemMouseDown2(item, ev) : void 0;\n          },\n          onMouseMove: this._onItemMouseMove,\n          href: item.href,\n          title: item.title,\n          \"aria-label\": ariaLabel2,\n          \"aria-describedby\": ariaDescribedByIds,\n          \"aria-haspopup\": itemHasSubmenu || void 0,\n          \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : void 0,\n          \"aria-posinset\": focusableElementIndex + 1,\n          \"aria-setsize\": totalItemCount,\n          \"aria-disabled\": isItemDisabled(item),\n          \"aria-checked\": (itemRole === \"menuitemcheckbox\" || itemRole === \"menuitemradio\") && canCheck ? !!isChecked : void 0,\n          \"aria-selected\": itemRole === \"menuitem\" && canCheck ? !!isChecked : void 0,\n          role: itemRole,\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          style: item.style\n        };\n        var keytipProps = item.keytipProps;\n        if (keytipProps && itemHasSubmenu) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        return React__namespace.createElement(KeytipData, { keytipProps, ariaDescribedBy: ariaDescribedByIds, disabled: isItemDisabled(item) }, function(keytipAttributes) {\n          return React__namespace.createElement(\n            \"button\",\n            __assign$1({ ref: _this._btn }, buttonNativeProperties, itemButtonProperties, keytipAttributes),\n            React__namespace.createElement(ChildrenRenderer, __assign$1({ componentRef: item.componentRef, item, classNames: classNames2, index: index2, onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : void 0, hasIcons, openSubMenu, dismissSubMenu, dismissMenu, getSubmenuTarget: _this._getSubmenuTarget }, itemProps)),\n            _this._renderAriaDescription(ariaDescription, classNames2.screenReaderText)\n          );\n        });\n      };\n      return ContextualMenuButton2;\n    })(ContextualMenuItemWrapper)\n  );\n  var getStyles$r = function(props) {\n    var theme = props.theme, getClassNames2 = props.getClassNames, className2 = props.className;\n    if (!theme) {\n      throw new Error(\"Theme is undefined or null.\");\n    }\n    if (getClassNames2) {\n      var names = getClassNames2(theme);\n      return {\n        wrapper: [names.wrapper],\n        divider: [names.divider]\n      };\n    }\n    return {\n      wrapper: [\n        {\n          display: \"inline-flex\",\n          height: \"100%\",\n          alignItems: \"center\"\n        },\n        className2\n      ],\n      divider: [\n        {\n          width: 1,\n          height: \"100%\",\n          backgroundColor: theme.palette.neutralTertiaryAlt\n        }\n      ]\n    };\n  };\n  var getClassNames$m = classNamesFunction();\n  var VerticalDividerBase = React__namespace.forwardRef(function(props, ref2) {\n    var styles = props.styles, theme = props.theme, deprecatedGetClassNames = props.getClassNames, className2 = props.className;\n    var classNames2 = getClassNames$m(styles, { theme, getClassNames: deprecatedGetClassNames, className: className2 });\n    return React__namespace.createElement(\n      \"span\",\n      { className: classNames2.wrapper, ref: ref2 },\n      React__namespace.createElement(\"span\", { className: classNames2.divider })\n    );\n  });\n  VerticalDividerBase.displayName = \"VerticalDividerBase\";\n  var VerticalDivider = styled(VerticalDividerBase, getStyles$r, void 0, {\n    scope: \"VerticalDivider\"\n  });\n  var TouchIdleDelay$2 = 500;\n  var ContextualMenuSplitButton = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuSplitButton2, _super);\n      function ContextualMenuSplitButton2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._getMemoizedMenuButtonKeytipProps = memoizeFunction(function(keytipProps) {\n          return __assign$1(__assign$1({}, keytipProps), { hasMenu: true });\n        });\n        _this._onItemKeyDown = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemKeyDown = _a2.onItemKeyDown;\n          if (ev.which === KeyCodes.enter) {\n            _this._executeItemClick(ev);\n            ev.preventDefault();\n            ev.stopPropagation();\n          } else if (onItemKeyDown) {\n            onItemKeyDown(item, ev);\n          }\n        };\n        _this._getSubmenuTarget = function() {\n          return _this._splitButton;\n        };\n        _this._renderAriaDescription = function(ariaDescription, className2) {\n          return ariaDescription ? React__namespace.createElement(\"span\", { id: _this._ariaDescriptionId, className: className2 }, ariaDescription) : null;\n        };\n        _this._onItemMouseEnterPrimary = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseEnter = _a2.onItemMouseEnter;\n          if (onItemMouseEnter) {\n            onItemMouseEnter(__assign$1(__assign$1({}, item), { subMenuProps: void 0, items: void 0 }), ev, _this._splitButton);\n          }\n        };\n        _this._onItemMouseEnterIcon = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseEnter = _a2.onItemMouseEnter;\n          if (onItemMouseEnter) {\n            onItemMouseEnter(item, ev, _this._splitButton);\n          }\n        };\n        _this._onItemMouseMovePrimary = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseMove = _a2.onItemMouseMove;\n          if (onItemMouseMove) {\n            onItemMouseMove(__assign$1(__assign$1({}, item), { subMenuProps: void 0, items: void 0 }), ev, _this._splitButton);\n          }\n        };\n        _this._onItemMouseMoveIcon = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseMove = _a2.onItemMouseMove;\n          if (onItemMouseMove) {\n            onItemMouseMove(item, ev, _this._splitButton);\n          }\n        };\n        _this._onIconItemClick = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemClickBase = _a2.onItemClickBase;\n          if (onItemClickBase) {\n            onItemClickBase(item, ev, _this._splitButton ? _this._splitButton : ev.currentTarget);\n          }\n        };\n        _this._executeItemClick = function(ev) {\n          var _a2 = _this.props, item = _a2.item, executeItemClick = _a2.executeItemClick, onItemClick = _a2.onItemClick;\n          if (item.disabled || item.isDisabled) {\n            return;\n          }\n          if (_this._processingTouch && !item.canCheck && onItemClick) {\n            return onItemClick(item, ev);\n          }\n          if (executeItemClick) {\n            executeItemClick(item, ev);\n          }\n        };\n        _this._onTouchStart = function(ev) {\n          if (_this._splitButton && !(\"onpointerdown\" in _this._splitButton)) {\n            _this._handleTouchAndPointerEvent(ev);\n          }\n        };\n        _this._onPointerDown = function(ev) {\n          if (ev.pointerType === \"touch\") {\n            _this._handleTouchAndPointerEvent(ev);\n            ev.preventDefault();\n            ev.stopImmediatePropagation();\n          }\n        };\n        _this._async = new Async(_this);\n        _this._events = new EventGroup(_this);\n        _this._dismissLabelId = getId();\n        return _this;\n      }\n      ContextualMenuSplitButton2.prototype.componentDidMount = function() {\n        if (this._splitButton && \"onpointerdown\" in this._splitButton) {\n          this._events.on(this._splitButton, \"pointerdown\", this._onPointerDown, true);\n        }\n      };\n      ContextualMenuSplitButton2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n      };\n      ContextualMenuSplitButton2.prototype.render = function() {\n        var _this = this;\n        var _a2;\n        var _b2 = this.props, item = _b2.item, classNames2 = _b2.classNames, index2 = _b2.index, focusableElementIndex = _b2.focusableElementIndex, totalItemCount = _b2.totalItemCount, hasCheckmarks = _b2.hasCheckmarks, hasIcons = _b2.hasIcons, onItemMouseLeave = _b2.onItemMouseLeave, expandedMenuItemKey = _b2.expandedMenuItemKey;\n        var itemHasSubmenu = hasSubmenu(item);\n        var keytipProps = item.keytipProps;\n        if (keytipProps) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        var ariaDescription = item.ariaDescription;\n        if (ariaDescription) {\n          this._ariaDescriptionId = getId();\n        }\n        var ariaChecked = (_a2 = getIsChecked(item)) !== null && _a2 !== void 0 ? _a2 : void 0;\n        return React__namespace.createElement(KeytipData, { keytipProps, disabled: isItemDisabled(item) }, function(keytipAttributes) {\n          return React__namespace.createElement(\n            \"div\",\n            { \"data-ktp-target\": keytipAttributes[\"data-ktp-target\"], ref: function(splitButton) {\n              _this._splitButton = splitButton;\n            }, role: getMenuItemAriaRole(item), \"aria-label\": item.ariaLabel, className: classNames2.splitContainer, \"aria-disabled\": isItemDisabled(item), \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : void 0, \"aria-haspopup\": true, \"aria-describedby\": mergeAriaAttributeValues(item.ariaDescribedBy, ariaDescription ? _this._ariaDescriptionId : void 0, keytipAttributes[\"aria-describedby\"]), \"aria-checked\": ariaChecked, \"aria-posinset\": focusableElementIndex + 1, \"aria-setsize\": totalItemCount, onMouseEnter: _this._onItemMouseEnterPrimary, onMouseLeave: onItemMouseLeave ? onItemMouseLeave.bind(_this, __assign$1(__assign$1({}, item), { subMenuProps: null, items: null })) : void 0, onMouseMove: _this._onItemMouseMovePrimary, onKeyDown: _this._onItemKeyDown, onClick: _this._executeItemClick, onTouchStart: _this._onTouchStart, tabIndex: 0, \"data-is-focusable\": true, \"aria-roledescription\": item[\"aria-roledescription\"] },\n            _this._renderSplitPrimaryButton(item, classNames2, index2, hasCheckmarks, hasIcons),\n            _this._renderSplitDivider(item),\n            _this._renderSplitIconButton(item, classNames2, index2, keytipAttributes),\n            _this._renderAriaDescription(ariaDescription, classNames2.screenReaderText)\n          );\n        });\n      };\n      ContextualMenuSplitButton2.prototype._renderSplitPrimaryButton = function(item, classNames2, index2, hasCheckmarks, hasIcons) {\n        var _a2 = this.props, _b2 = _a2.contextualMenuItemAs, ChildrenRenderer = _b2 === void 0 ? ContextualMenuItem : _b2, onItemClick = _a2.onItemClick;\n        var itemProps = {\n          key: item.key,\n          disabled: isItemDisabled(item) || item.primaryDisabled,\n          /* eslint-disable @typescript-eslint/no-deprecated */\n          name: item.name,\n          text: item.text || item.name,\n          secondaryText: item.secondaryText,\n          /* eslint-enable @typescript-eslint/no-deprecated */\n          className: classNames2.splitPrimary,\n          canCheck: item.canCheck,\n          isChecked: item.isChecked,\n          checked: item.checked,\n          iconProps: item.iconProps,\n          id: this._dismissLabelId,\n          onRenderIcon: item.onRenderIcon,\n          data: item.data,\n          \"data-is-focusable\": false\n        };\n        var itemComponentProps = item.itemProps;\n        return React__namespace.createElement(\n          \"button\",\n          __assign$1({}, getNativeProps(itemProps, buttonProperties)),\n          React__namespace.createElement(ChildrenRenderer, __assign$1({ \"data-is-focusable\": false, item: __assign$1(__assign$1({}, itemProps), { onClick: item.onClick }), classNames: classNames2, index: index2, onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : void 0, hasIcons }, itemComponentProps))\n        );\n      };\n      ContextualMenuSplitButton2.prototype._renderSplitDivider = function(item) {\n        var getDividerClassNames2 = item.getSplitButtonVerticalDividerClassNames || getSplitButtonVerticalDividerClassNames;\n        return React__namespace.createElement(\n          VerticalDivider,\n          {\n            // eslint-disable-next-line @typescript-eslint/no-deprecated\n            getClassNames: getDividerClassNames2\n          }\n        );\n      };\n      ContextualMenuSplitButton2.prototype._renderSplitIconButton = function(item, classNames2, index2, keytipAttributes) {\n        var _a2 = this.props, onItemMouseLeave = _a2.onItemMouseLeave, onItemMouseDown2 = _a2.onItemMouseDown, openSubMenu = _a2.openSubMenu, dismissSubMenu = _a2.dismissSubMenu, dismissMenu = _a2.dismissMenu;\n        var ChildrenRenderer = ContextualMenuItem;\n        if (this.props.item.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(this.props.item.contextualMenuItemAs, ChildrenRenderer);\n        }\n        if (this.props.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(this.props.contextualMenuItemAs, ChildrenRenderer);\n        }\n        var itemProps = {\n          onClick: this._onIconItemClick,\n          disabled: isItemDisabled(item),\n          className: classNames2.splitMenu,\n          subMenuProps: item.subMenuProps,\n          submenuIconProps: item.submenuIconProps,\n          split: true,\n          key: item.key,\n          \"aria-labelledby\": this._dismissLabelId\n        };\n        var buttonProps = __assign$1(__assign$1({}, getNativeProps(itemProps, buttonProperties)), {\n          onMouseEnter: this._onItemMouseEnterIcon,\n          onMouseLeave: onItemMouseLeave ? onItemMouseLeave.bind(this, item) : void 0,\n          onMouseDown: function(ev) {\n            return onItemMouseDown2 ? onItemMouseDown2(item, ev) : void 0;\n          },\n          onMouseMove: this._onItemMouseMoveIcon,\n          \"data-is-focusable\": false,\n          \"data-ktp-execute-target\": keytipAttributes[\"data-ktp-execute-target\"],\n          \"aria-haspopup\": true\n        });\n        var itemComponentProps = item.itemProps;\n        return React__namespace.createElement(\n          \"button\",\n          __assign$1({}, buttonProps),\n          React__namespace.createElement(ChildrenRenderer, __assign$1({ componentRef: item.componentRef, item: itemProps, classNames: classNames2, index: index2, hasIcons: false, openSubMenu, dismissSubMenu, dismissMenu, getSubmenuTarget: this._getSubmenuTarget }, itemComponentProps))\n        );\n      };\n      ContextualMenuSplitButton2.prototype._handleTouchAndPointerEvent = function(ev) {\n        var _this = this;\n        var onTap = this.props.onTap;\n        if (onTap) {\n          onTap(ev);\n        }\n        if (this._lastTouchTimeoutId) {\n          this._async.clearTimeout(this._lastTouchTimeoutId);\n          this._lastTouchTimeoutId = void 0;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n          _this._processingTouch = false;\n          _this._lastTouchTimeoutId = void 0;\n        }, TouchIdleDelay$2);\n      };\n      return ContextualMenuSplitButton2;\n    })(ContextualMenuItemWrapper)\n  );\n  var BaseDecorator = (\n    /** @class */\n    (function(_super) {\n      __extends(BaseDecorator2, _super);\n      function BaseDecorator2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._updateComposedComponentRef = _this._updateComposedComponentRef.bind(_this);\n        return _this;\n      }\n      BaseDecorator2.prototype._updateComposedComponentRef = function(composedComponentInstance) {\n        this._composedComponentInstance = composedComponentInstance;\n        if (composedComponentInstance) {\n          this._hoisted = hoistMethods(this, composedComponentInstance);\n        } else if (this._hoisted) {\n          unhoistMethods(this, this._hoisted);\n        }\n      };\n      return BaseDecorator2;\n    })(React__namespace.Component)\n  );\n  var ResponsiveMode;\n  (function(ResponsiveMode2) {\n    ResponsiveMode2[ResponsiveMode2[\"small\"] = 0] = \"small\";\n    ResponsiveMode2[ResponsiveMode2[\"medium\"] = 1] = \"medium\";\n    ResponsiveMode2[ResponsiveMode2[\"large\"] = 2] = \"large\";\n    ResponsiveMode2[ResponsiveMode2[\"xLarge\"] = 3] = \"xLarge\";\n    ResponsiveMode2[ResponsiveMode2[\"xxLarge\"] = 4] = \"xxLarge\";\n    ResponsiveMode2[ResponsiveMode2[\"xxxLarge\"] = 5] = \"xxxLarge\";\n    ResponsiveMode2[ResponsiveMode2[\"unknown\"] = 999] = \"unknown\";\n  })(ResponsiveMode || (ResponsiveMode = {}));\n  var RESPONSIVE_MAX_CONSTRAINT = [479, 639, 1023, 1365, 1919, 99999999];\n  var _lastMode;\n  function getInitialResponsiveMode() {\n    var _a2;\n    return (_a2 = _lastMode) !== null && _a2 !== void 0 ? _a2 : ResponsiveMode.large;\n  }\n  function withResponsiveMode(ComposedComponent) {\n    var _a2;\n    var resultClass = (_a2 = /** @class */\n    (function(_super) {\n      __extends(WithResponsiveMode, _super);\n      function WithResponsiveMode(props) {\n        var _this = _super.call(this, props) || this;\n        _this._onResize = function() {\n          var responsiveMode = getResponsiveMode(_this.context.window);\n          if (responsiveMode !== _this.state.responsiveMode) {\n            _this.setState({\n              responsiveMode\n            });\n          }\n        };\n        _this._events = new EventGroup(_this);\n        _this._updateComposedComponentRef = _this._updateComposedComponentRef.bind(_this);\n        _this.state = {\n          responsiveMode: getInitialResponsiveMode()\n        };\n        return _this;\n      }\n      WithResponsiveMode.prototype.componentDidMount = function() {\n        this._events.on(this.context.window, \"resize\", this._onResize);\n        this._onResize();\n      };\n      WithResponsiveMode.prototype.componentWillUnmount = function() {\n        this._events.dispose();\n      };\n      WithResponsiveMode.prototype.render = function() {\n        var responsiveMode = this.state.responsiveMode;\n        return responsiveMode === ResponsiveMode.unknown ? null : React__namespace.createElement(ComposedComponent, __assign$1({ ref: this._updateComposedComponentRef, responsiveMode }, this.props));\n      };\n      return WithResponsiveMode;\n    })(BaseDecorator), _a2.contextType = WindowContext, _a2);\n    return hoistStatics(ComposedComponent, resultClass);\n  }\n  function getWidthOfCurrentWindow(currentWindow) {\n    try {\n      return currentWindow.document.documentElement.clientWidth;\n    } catch (e) {\n      return currentWindow.innerWidth;\n    }\n  }\n  function getResponsiveMode(currentWindow) {\n    var responsiveMode = ResponsiveMode.small;\n    if (currentWindow) {\n      try {\n        while (getWidthOfCurrentWindow(currentWindow) > RESPONSIVE_MAX_CONSTRAINT[responsiveMode]) {\n          responsiveMode++;\n        }\n      } catch (e) {\n        responsiveMode = getInitialResponsiveMode();\n      }\n      _lastMode = responsiveMode;\n    } else {\n      {\n        throw new Error(\"Content was rendered in a server environment without providing a default responsive mode. Call setResponsiveMode to define what the responsive mode is.\");\n      }\n    }\n    return responsiveMode;\n  }\n  var useResponsiveMode = function(elementRef, overrideResponsiveMode) {\n    var _a2 = React__namespace.useState(getInitialResponsiveMode()), lastResponsiveMode = _a2[0], setLastResponsiveMode = _a2[1];\n    var onResize = React__namespace.useCallback(function() {\n      var newResponsiveMode = getResponsiveMode(getWindow(elementRef.current));\n      if (lastResponsiveMode !== newResponsiveMode) {\n        setLastResponsiveMode(newResponsiveMode);\n      }\n    }, [elementRef, lastResponsiveMode]);\n    var win = useWindow();\n    useOnEvent(win, \"resize\", onResize);\n    React__namespace.useEffect(function() {\n      if (overrideResponsiveMode === void 0) {\n        onResize();\n      }\n    }, [overrideResponsiveMode]);\n    return overrideResponsiveMode !== null && overrideResponsiveMode !== void 0 ? overrideResponsiveMode : lastResponsiveMode;\n  };\n  var MenuContext = React__namespace.createContext({});\n  var getClassNames$l = classNamesFunction();\n  var getContextualMenuItemClassNames = classNamesFunction();\n  var DEFAULT_PROPS$4 = {\n    items: [],\n    shouldFocusOnMount: true,\n    gapSpace: 0,\n    directionalHint: DirectionalHint.bottomAutoEdge,\n    beakWidth: 16\n  };\n  function getItemCount(items) {\n    var totalItemCount = 0;\n    for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {\n      var item = items_1[_i];\n      if (item.itemType !== ContextualMenuItemType.Divider && item.itemType !== ContextualMenuItemType.Header) {\n        var itemCount = item.customOnRenderListLength ? item.customOnRenderListLength : 1;\n        totalItemCount += itemCount;\n      }\n    }\n    return totalItemCount;\n  }\n  function getSubmenuItems(item, options2) {\n    var target2 = options2 === null || options2 === void 0 ? void 0 : options2.target;\n    var items = item.subMenuProps ? item.subMenuProps.items : item.items;\n    if (items) {\n      var overrideItems = [];\n      for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {\n        var subItem = items_2[_i];\n        if (subItem.preferMenuTargetAsEventTarget) {\n          var onClick = subItem.onClick, contextItem = __rest(subItem, [\"onClick\"]);\n          overrideItems.push(__assign$1(__assign$1({}, contextItem), { onClick: getOnClickWithOverrideTarget(onClick, target2) }));\n        } else {\n          overrideItems.push(subItem);\n        }\n      }\n      return overrideItems;\n    }\n  }\n  function canAnyMenuItemsCheck(items) {\n    return items.some(function(item) {\n      if (item.canCheck) {\n        return true;\n      }\n      if (item.sectionProps && item.sectionProps.items.some(function(submenuItem) {\n        return submenuItem.canCheck === true;\n      })) {\n        return true;\n      }\n      return false;\n    });\n  }\n  var NavigationIdleDelay = 250;\n  var COMPONENT_NAME$7 = \"ContextualMenu\";\n  var _getMenuItemStylesFunction = memoizeFunction(function() {\n    var styles = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      styles[_i] = arguments[_i];\n    }\n    return function(styleProps) {\n      return concatStyleSetsWithProps.apply(void 0, __spreadArray([styleProps, getItemStyles], styles, false));\n    };\n  });\n  function useVisibility(props, targetWindow) {\n    var _a2 = props.hidden, hidden = _a2 === void 0 ? false : _a2, onMenuDismissed = props.onMenuDismissed, onMenuOpened = props.onMenuOpened;\n    var previousHidden = usePrevious(hidden);\n    var onMenuOpenedRef = React__namespace.useRef(onMenuOpened);\n    var onMenuClosedRef = React__namespace.useRef(onMenuDismissed);\n    var propsRef = React__namespace.useRef(props);\n    onMenuOpenedRef.current = onMenuOpened;\n    onMenuClosedRef.current = onMenuDismissed;\n    propsRef.current = props;\n    React__namespace.useEffect(function() {\n      var _a3, _b2;\n      if (hidden && previousHidden === false) {\n        (_a3 = onMenuClosedRef.current) === null || _a3 === void 0 ? void 0 : _a3.call(onMenuClosedRef, propsRef.current);\n      } else if (!hidden && previousHidden !== false) {\n        (_b2 = onMenuOpenedRef.current) === null || _b2 === void 0 ? void 0 : _b2.call(onMenuOpenedRef, propsRef.current);\n      }\n    }, [hidden, previousHidden]);\n    React__namespace.useEffect(function() {\n      return function() {\n        var _a3;\n        return (_a3 = onMenuClosedRef.current) === null || _a3 === void 0 ? void 0 : _a3.call(onMenuClosedRef, propsRef.current);\n      };\n    }, []);\n  }\n  function useSubMenuState(_a2, dismiss) {\n    var hidden = _a2.hidden, items = _a2.items, theme = _a2.theme, className2 = _a2.className, id2 = _a2.id, menuTarget = _a2.target;\n    var _b2 = React__namespace.useState(), expandedMenuItemKey = _b2[0], setExpandedMenuItemKey = _b2[1];\n    var _c2 = React__namespace.useState(), submenuTarget = _c2[0], setSubmenuTarget = _c2[1];\n    var _d2 = React__namespace.useState(), shouldFocusOnContainer = _d2[0], setShouldFocusOnContainer = _d2[1];\n    var subMenuId = useId(COMPONENT_NAME$7, id2);\n    var closeSubMenu = React__namespace.useCallback(function() {\n      setShouldFocusOnContainer(void 0);\n      setExpandedMenuItemKey(void 0);\n      setSubmenuTarget(void 0);\n    }, []);\n    var openSubMenu = React__namespace.useCallback(function(_a3, target2, focusContainer) {\n      var submenuItemKey = _a3.key;\n      if (expandedMenuItemKey === submenuItemKey) {\n        return;\n      }\n      target2.focus();\n      setShouldFocusOnContainer(focusContainer);\n      setExpandedMenuItemKey(submenuItemKey);\n      setSubmenuTarget(target2);\n    }, [expandedMenuItemKey]);\n    React__namespace.useEffect(function() {\n      if (hidden) {\n        closeSubMenu();\n      }\n    }, [hidden, closeSubMenu]);\n    var onSubMenuDismiss = useOnSubmenuDismiss(dismiss, closeSubMenu);\n    var getSubmenuProps = function() {\n      var item = findItemByKeyFromItems(expandedMenuItemKey, items);\n      var submenuProps = null;\n      if (item) {\n        submenuProps = {\n          items: getSubmenuItems(item, { target: menuTarget }),\n          target: submenuTarget,\n          onDismiss: onSubMenuDismiss,\n          isSubMenu: true,\n          id: subMenuId,\n          shouldFocusOnMount: true,\n          shouldFocusOnContainer,\n          directionalHint: getRTL(theme) ? DirectionalHint.leftTopEdge : DirectionalHint.rightTopEdge,\n          className: className2,\n          gapSpace: 0,\n          isBeakVisible: false\n        };\n        if (item.subMenuProps) {\n          assign(submenuProps, item.subMenuProps);\n        }\n        if (item.preferMenuTargetAsEventTarget) {\n          var onItemClick = item.onItemClick;\n          submenuProps.onItemClick = getOnClickWithOverrideTarget(onItemClick, menuTarget);\n        }\n      }\n      return submenuProps;\n    };\n    return [expandedMenuItemKey, openSubMenu, getSubmenuProps, onSubMenuDismiss];\n  }\n  function useShouldUpdateFocusOnMouseMove(_a2) {\n    var delayUpdateFocusOnHover = _a2.delayUpdateFocusOnHover, hidden = _a2.hidden;\n    var shouldUpdateFocusOnMouseEvent = React__namespace.useRef(!delayUpdateFocusOnHover);\n    var gotMouseMove = React__namespace.useRef(false);\n    React__namespace.useEffect(function() {\n      shouldUpdateFocusOnMouseEvent.current = !delayUpdateFocusOnHover;\n      gotMouseMove.current = hidden ? false : !delayUpdateFocusOnHover && gotMouseMove.current;\n    }, [delayUpdateFocusOnHover, hidden]);\n    var onMenuFocusCapture = React__namespace.useCallback(function() {\n      if (delayUpdateFocusOnHover) {\n        shouldUpdateFocusOnMouseEvent.current = false;\n      }\n    }, [delayUpdateFocusOnHover]);\n    return [shouldUpdateFocusOnMouseEvent, gotMouseMove, onMenuFocusCapture];\n  }\n  function usePreviousActiveElement(_a2, targetWindow, hostElement) {\n    var hidden = _a2.hidden, onRestoreFocus = _a2.onRestoreFocus;\n    var previousActiveElement = React__namespace.useRef(void 0);\n    var tryFocusPreviousActiveElement = React__namespace.useCallback(function(options2) {\n      var _a3, _b2;\n      if (onRestoreFocus) {\n        onRestoreFocus(options2);\n      } else if (options2 === null || options2 === void 0 ? void 0 : options2.documentContainsFocus) {\n        (_b2 = (_a3 = previousActiveElement.current) === null || _a3 === void 0 ? void 0 : _a3.focus) === null || _b2 === void 0 ? void 0 : _b2.call(_a3);\n      }\n    }, [onRestoreFocus]);\n    useIsomorphicLayoutEffect(function() {\n      var _a3, _b2;\n      if (!hidden) {\n        var newElement = targetWindow === null || targetWindow === void 0 ? void 0 : targetWindow.document.activeElement;\n        if (!((_a3 = hostElement.current) === null || _a3 === void 0 ? void 0 : _a3.contains(newElement)) && newElement.tagName !== \"BODY\") {\n          previousActiveElement.current = newElement;\n        }\n      } else if (previousActiveElement.current) {\n        tryFocusPreviousActiveElement({\n          originalElement: previousActiveElement.current,\n          containsFocus: true,\n          documentContainsFocus: ((_b2 = getDocument()) === null || _b2 === void 0 ? void 0 : _b2.hasFocus()) || false\n        });\n        previousActiveElement.current = void 0;\n      }\n    }, [hidden, targetWindow === null || targetWindow === void 0 ? void 0 : targetWindow.document.activeElement, tryFocusPreviousActiveElement, hostElement]);\n    return [tryFocusPreviousActiveElement];\n  }\n  function useKeyHandlers(_a2, dismiss, hostElement, openSubMenu) {\n    var theme = _a2.theme, isSubMenu = _a2.isSubMenu, _b2 = _a2.focusZoneProps, _c2 = _b2 === void 0 ? {} : _b2, checkForNoWrap = _c2.checkForNoWrap, _d2 = _c2.direction, focusZoneDirection = _d2 === void 0 ? FocusZoneDirection.vertical : _d2;\n    var lastKeyDownWasAltOrMeta = React__namespace.useRef(void 0);\n    var keyHandler = function(ev, shouldHandleKey, dismissAllMenus) {\n      var handled = false;\n      if (shouldHandleKey(ev)) {\n        dismiss(ev, dismissAllMenus);\n        ev.preventDefault();\n        ev.stopPropagation();\n        handled = true;\n      }\n      return handled;\n    };\n    var shouldCloseSubMenu = function(ev) {\n      var submenuCloseKey = getRTL(theme) ? KeyCodes.right : KeyCodes.left;\n      if (ev.which !== submenuCloseKey || !isSubMenu) {\n        return false;\n      }\n      return !!(focusZoneDirection === FocusZoneDirection.vertical || checkForNoWrap && !shouldWrapFocus(ev.target, \"data-no-horizontal-wrap\"));\n    };\n    var shouldHandleKeyDown = function(ev) {\n      return (\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        ev.which === KeyCodes.escape || shouldCloseSubMenu(ev) || ev.which === KeyCodes.up && (ev.altKey || ev.metaKey)\n      );\n    };\n    var onKeyDown = function(ev) {\n      lastKeyDownWasAltOrMeta.current = isAltOrMeta$1(ev);\n      var dismissAllMenus = ev.which === KeyCodes.escape && (isMac() || isIOS());\n      return keyHandler(ev, shouldHandleKeyDown, dismissAllMenus);\n    };\n    var shouldHandleKeyUp = function(ev) {\n      var keyPressIsAltOrMetaAlone = lastKeyDownWasAltOrMeta.current && isAltOrMeta$1(ev);\n      lastKeyDownWasAltOrMeta.current = false;\n      return !!keyPressIsAltOrMetaAlone && !(isIOS() || isMac());\n    };\n    var onKeyUp = function(ev) {\n      return keyHandler(\n        ev,\n        shouldHandleKeyUp,\n        true\n        /* dismissAllMenus */\n      );\n    };\n    var onMenuKeyDown = function(ev) {\n      var handled = onKeyDown(ev);\n      if (handled || !hostElement.current) {\n        return;\n      }\n      var hasModifier = !!(ev.altKey || ev.metaKey);\n      var isUp = ev.which === KeyCodes.up;\n      var isDown = ev.which === KeyCodes.down;\n      if (!hasModifier && (isUp || isDown)) {\n        var elementToFocus = isUp ? getLastFocusable(hostElement.current, hostElement.current.lastChild, true) : getFirstFocusable(hostElement.current, hostElement.current.firstChild, true);\n        if (elementToFocus) {\n          elementToFocus.focus();\n          ev.preventDefault();\n          ev.stopPropagation();\n        }\n      }\n    };\n    var onItemKeyDown = function(item, ev) {\n      var openKey = getRTL(theme) ? KeyCodes.left : KeyCodes.right;\n      if (!item.disabled && // eslint-disable-next-line @typescript-eslint/no-deprecated\n      (ev.which === openKey || ev.which === KeyCodes.enter || ev.which === KeyCodes.down && (ev.altKey || ev.metaKey))) {\n        openSubMenu(item, ev.currentTarget);\n        ev.preventDefault();\n      }\n    };\n    return [onKeyDown, onKeyUp, onMenuKeyDown, onItemKeyDown];\n  }\n  function useScrollHandler(asyncTracker) {\n    var isScrollIdle = React__namespace.useRef(true);\n    var scrollIdleTimeoutId = React__namespace.useRef(void 0);\n    var onScroll = function() {\n      if (!isScrollIdle.current && scrollIdleTimeoutId.current !== void 0) {\n        asyncTracker.clearTimeout(scrollIdleTimeoutId.current);\n        scrollIdleTimeoutId.current = void 0;\n      } else {\n        isScrollIdle.current = false;\n      }\n      scrollIdleTimeoutId.current = asyncTracker.setTimeout(function() {\n        isScrollIdle.current = true;\n      }, NavigationIdleDelay);\n    };\n    return [onScroll, isScrollIdle];\n  }\n  function useOnSubmenuDismiss(dismiss, closeSubMenu) {\n    var isMountedRef = React__namespace.useRef(false);\n    React__namespace.useEffect(function() {\n      isMountedRef.current = true;\n      return function() {\n        isMountedRef.current = false;\n      };\n    }, []);\n    var onSubMenuDismiss = function(ev, dismissAll) {\n      if (dismissAll) {\n        dismiss(ev, dismissAll);\n      } else if (isMountedRef.current) {\n        closeSubMenu();\n      }\n    };\n    return onSubMenuDismiss;\n  }\n  function useSubmenuEnterTimer(_a2, asyncTracker) {\n    var _b2 = _a2.subMenuHoverDelay, subMenuHoverDelay = _b2 === void 0 ? NavigationIdleDelay : _b2;\n    var enterTimerRef = React__namespace.useRef(void 0);\n    var cancelSubMenuTimer = function() {\n      if (enterTimerRef.current !== void 0) {\n        asyncTracker.clearTimeout(enterTimerRef.current);\n        enterTimerRef.current = void 0;\n      }\n    };\n    var startSubmenuTimer = function(onTimerExpired) {\n      enterTimerRef.current = asyncTracker.setTimeout(function() {\n        onTimerExpired();\n        cancelSubMenuTimer();\n      }, subMenuHoverDelay);\n    };\n    return [cancelSubMenuTimer, startSubmenuTimer, enterTimerRef];\n  }\n  function useMouseHandlers(props, isScrollIdle, subMenuEntryTimer, targetWindow, shouldUpdateFocusOnMouseEvent, gotMouseMove, expandedMenuItemKey, hostElement, startSubmenuTimer, cancelSubMenuTimer, openSubMenu, onSubMenuDismiss, dismiss) {\n    var menuTarget = props.target;\n    var onItemMouseEnterBase = function(item, ev, target2) {\n      if (shouldUpdateFocusOnMouseEvent.current) {\n        gotMouseMove.current = true;\n      }\n      if (shouldIgnoreMouseEvent()) {\n        return;\n      }\n      updateFocusOnMouseEvent(item, ev, target2);\n    };\n    var onItemMouseMoveBase = function(item, ev, target2) {\n      var targetElement = ev.currentTarget;\n      if (shouldUpdateFocusOnMouseEvent.current) {\n        gotMouseMove.current = true;\n      } else {\n        return;\n      }\n      if (!isScrollIdle.current || subMenuEntryTimer.current !== void 0 || targetElement === (targetWindow === null || targetWindow === void 0 ? void 0 : targetWindow.document.activeElement)) {\n        return;\n      }\n      updateFocusOnMouseEvent(item, ev, target2);\n    };\n    var shouldIgnoreMouseEvent = function() {\n      return !isScrollIdle.current || !gotMouseMove.current;\n    };\n    var onMouseItemLeave = function(item, ev) {\n      var _a2;\n      if (shouldIgnoreMouseEvent()) {\n        return;\n      }\n      cancelSubMenuTimer();\n      if (expandedMenuItemKey !== void 0) {\n        return;\n      }\n      if (hostElement.current.setActive) {\n        try {\n          hostElement.current.setActive();\n        } catch (e) {\n        }\n      } else {\n        (_a2 = hostElement.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n      }\n    };\n    var updateFocusOnMouseEvent = function(item, ev, target2) {\n      var targetElement = target2 ? target2 : ev.currentTarget;\n      if (item.key === expandedMenuItemKey) {\n        return;\n      }\n      cancelSubMenuTimer();\n      if (expandedMenuItemKey === void 0) {\n        targetElement.focus();\n      }\n      if (hasSubmenu(item)) {\n        ev.stopPropagation();\n        startSubmenuTimer(function() {\n          targetElement.focus();\n          openSubMenu(item, targetElement, true);\n        });\n      } else {\n        startSubmenuTimer(function() {\n          onSubMenuDismiss(ev);\n          targetElement.focus();\n        });\n      }\n    };\n    var onItemClick = function(item, ev) {\n      onItemClickBase(item, ev, ev.currentTarget);\n    };\n    var onItemClickBase = function(item, ev, target2) {\n      var items = getSubmenuItems(item, { target: menuTarget });\n      cancelSubMenuTimer();\n      if (!hasSubmenu(item) && (!items || !items.length)) {\n        executeItemClick(item, ev);\n      } else {\n        if (item.key !== expandedMenuItemKey) {\n          var shouldFocusOnContainer = typeof props.shouldFocusOnContainer === \"boolean\" ? props.shouldFocusOnContainer : ev.nativeEvent.pointerType === \"mouse\";\n          openSubMenu(item, target2, shouldFocusOnContainer);\n        }\n      }\n      ev.stopPropagation();\n      ev.preventDefault();\n    };\n    var onAnchorClick = function(item, ev) {\n      executeItemClick(item, ev);\n      ev.stopPropagation();\n    };\n    var executeItemClick = function(item, ev) {\n      if (item.disabled || item.isDisabled) {\n        return;\n      }\n      if (item.preferMenuTargetAsEventTarget) {\n        overrideTarget(ev, menuTarget);\n      }\n      var shouldDismiss = false;\n      if (item.onClick) {\n        shouldDismiss = !!item.onClick(ev, item);\n      } else if (props.onItemClick) {\n        shouldDismiss = !!props.onItemClick(ev, item);\n      }\n      if (shouldDismiss || !ev.defaultPrevented) {\n        dismiss(ev, true);\n      }\n    };\n    return [\n      onItemMouseEnterBase,\n      onItemMouseMoveBase,\n      onMouseItemLeave,\n      onItemClick,\n      onAnchorClick,\n      executeItemClick,\n      onItemClickBase\n    ];\n  }\n  var ContextualMenuBase = React__namespace.memo(React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var _a2;\n    var _b2 = getPropsWithDefaults(DEFAULT_PROPS$4, propsWithoutDefaults);\n    _b2.ref;\n    var props = __rest(_b2, [\"ref\"]);\n    var hostElement = React__namespace.useRef(null);\n    var asyncTracker = useAsync();\n    var menuId = useId(COMPONENT_NAME$7, props.id);\n    var dismiss = function(ev, dismissAll) {\n      var _a3;\n      return (_a3 = props.onDismiss) === null || _a3 === void 0 ? void 0 : _a3.call(props, ev, dismissAll);\n    };\n    var _c2 = useTarget(props.target, hostElement), targetRef = _c2[0], targetWindow = _c2[1];\n    var tryFocusPreviousActiveElement = usePreviousActiveElement(props, targetWindow, hostElement)[0];\n    var _d2 = useSubMenuState(props, dismiss), expandedMenuItemKey = _d2[0], openSubMenu = _d2[1], getSubmenuProps = _d2[2], onSubMenuDismiss = _d2[3];\n    var _e2 = useShouldUpdateFocusOnMouseMove(props), shouldUpdateFocusOnMouseEvent = _e2[0], gotMouseMove = _e2[1], onMenuFocusCapture = _e2[2];\n    var _f = useScrollHandler(asyncTracker), onScroll = _f[0], isScrollIdle = _f[1];\n    var _g = useSubmenuEnterTimer(props, asyncTracker), cancelSubMenuTimer = _g[0], startSubmenuTimer = _g[1], subMenuEntryTimer = _g[2];\n    var responsiveMode = useResponsiveMode(hostElement, props.responsiveMode);\n    useVisibility(props);\n    var _h = useKeyHandlers(props, dismiss, hostElement, openSubMenu), onKeyDown = _h[0], onKeyUp = _h[1], onMenuKeyDown = _h[2], onItemKeyDown = _h[3];\n    var _j = useMouseHandlers(props, isScrollIdle, subMenuEntryTimer, targetWindow, shouldUpdateFocusOnMouseEvent, gotMouseMove, expandedMenuItemKey, hostElement, startSubmenuTimer, cancelSubMenuTimer, openSubMenu, onSubMenuDismiss, dismiss), onItemMouseEnterBase = _j[0], onItemMouseMoveBase = _j[1], onMouseItemLeave = _j[2], onItemClick = _j[3], onAnchorClick = _j[4], executeItemClick = _j[5], onItemClickBase = _j[6];\n    var onDefaultRenderMenuList = function(menuListProps, menuClassNames, defaultRender) {\n      var indexCorrection = 0;\n      var items2 = menuListProps.items, totalItemCount = menuListProps.totalItemCount, hasCheckmarks2 = menuListProps.hasCheckmarks, hasIcons2 = menuListProps.hasIcons;\n      return React__namespace.createElement(\"ul\", { className: menuClassNames.list, onKeyDown, onKeyUp, role: \"presentation\" }, items2.map(function(item, index2) {\n        var menuItem = renderMenuItem(item, index2, indexCorrection, totalItemCount, hasCheckmarks2, hasIcons2, menuClassNames);\n        if (item.itemType !== ContextualMenuItemType.Divider && item.itemType !== ContextualMenuItemType.Header) {\n          var indexIncrease = item.customOnRenderListLength ? item.customOnRenderListLength : 1;\n          indexCorrection += indexIncrease;\n        }\n        return menuItem;\n      }));\n    };\n    var renderFocusZone = function(children2, adjustedFocusZoneProps2) {\n      var _a3 = props.focusZoneAs, ChildrenRenderer = _a3 === void 0 ? FocusZone : _a3;\n      return React__namespace.createElement(ChildrenRenderer, __assign$1({}, adjustedFocusZoneProps2), children2);\n    };\n    var renderMenuItem = function(item, index2, focusableElementIndex, totalItemCount, hasCheckmarks2, hasIcons2, menuClassNames) {\n      var _a3;\n      var renderedItems = [];\n      var iconProps = item.iconProps || { iconName: \"None\" };\n      var getItemClassNames2 = item.getItemClassNames, itemProps = item.itemProps;\n      var styles2 = itemProps ? itemProps.styles : void 0;\n      var dividerClassName = item.itemType === ContextualMenuItemType.Divider ? item.className : void 0;\n      var subMenuIconClassName = item.submenuIconProps ? item.submenuIconProps.className : \"\";\n      var itemClassNames;\n      if (getItemClassNames2) {\n        itemClassNames = getItemClassNames2(props.theme, isItemDisabled(item), expandedMenuItemKey === item.key, !!getIsChecked(item), !!item.href, iconProps.iconName !== \"None\", item.className, dividerClassName, iconProps.className, subMenuIconClassName, item.primaryDisabled);\n      } else {\n        var itemStyleProps = {\n          theme: props.theme,\n          disabled: isItemDisabled(item),\n          expanded: expandedMenuItemKey === item.key,\n          checked: !!getIsChecked(item),\n          isAnchorLink: !!item.href,\n          knownIcon: iconProps.iconName !== \"None\",\n          itemClassName: item.className,\n          dividerClassName,\n          iconClassName: iconProps.className,\n          subMenuClassName: subMenuIconClassName,\n          primaryDisabled: item.primaryDisabled\n        };\n        itemClassNames = getContextualMenuItemClassNames(_getMenuItemStylesFunction((_a3 = menuClassNames.subComponentStyles) === null || _a3 === void 0 ? void 0 : _a3.menuItem, styles2), itemStyleProps);\n      }\n      if (item.text === \"-\" || item.name === \"-\") {\n        item.itemType = ContextualMenuItemType.Divider;\n      }\n      switch (item.itemType) {\n        case ContextualMenuItemType.Divider:\n          renderedItems.push(renderSeparator(index2, itemClassNames));\n          break;\n        case ContextualMenuItemType.Header:\n          renderedItems.push(renderSeparator(index2, itemClassNames));\n          var headerItem = renderHeaderMenuItem(item, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2);\n          renderedItems.push(renderListItem(headerItem, item.key || index2, itemClassNames, item.title));\n          break;\n        case ContextualMenuItemType.Section:\n          renderedItems.push(renderSectionItem(item, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2));\n          break;\n        default:\n          var defaultRenderNormalItem = function() {\n            return renderNormalItem(item, itemClassNames, index2, focusableElementIndex, totalItemCount, hasCheckmarks2, hasIcons2);\n          };\n          var menuItem = props.onRenderContextualMenuItem ? props.onRenderContextualMenuItem(item, defaultRenderNormalItem) : defaultRenderNormalItem();\n          renderedItems.push(renderListItem(menuItem, item.key || index2, itemClassNames, item.title));\n          break;\n      }\n      return React__namespace.createElement(React__namespace.Fragment, { key: item.key }, renderedItems);\n    };\n    var defaultMenuItemRenderer = function(item, menuClassNames) {\n      var index2 = item.index, focusableElementIndex = item.focusableElementIndex, totalItemCount = item.totalItemCount, hasCheckmarks2 = item.hasCheckmarks, hasIcons2 = item.hasIcons;\n      return renderMenuItem(item, index2, focusableElementIndex, totalItemCount, hasCheckmarks2, hasIcons2, menuClassNames);\n    };\n    var renderSectionItem = function(sectionItem, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2) {\n      var sectionProps = sectionItem.sectionProps;\n      if (!sectionProps) {\n        return;\n      }\n      var headerItem;\n      var groupProps;\n      if (sectionProps.title) {\n        var headerContextualMenuItem = void 0;\n        var ariaLabelledby = \"\";\n        if (typeof sectionProps.title === \"string\") {\n          var id_1 = menuId + sectionProps.title.replace(/\\s/g, \"\");\n          headerContextualMenuItem = {\n            key: \"section-\".concat(sectionProps.title, \"-title\"),\n            itemType: ContextualMenuItemType.Header,\n            text: sectionProps.title,\n            id: id_1\n          };\n          ariaLabelledby = id_1;\n        } else {\n          var id_2 = sectionProps.title.id || menuId + sectionProps.title.key.replace(/\\s/g, \"\");\n          headerContextualMenuItem = __assign$1(__assign$1({}, sectionProps.title), { id: id_2 });\n          ariaLabelledby = id_2;\n        }\n        if (headerContextualMenuItem) {\n          groupProps = {\n            role: \"group\",\n            \"aria-labelledby\": ariaLabelledby\n          };\n          headerItem = renderHeaderMenuItem(headerContextualMenuItem, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2);\n        }\n      }\n      if (sectionProps.items && sectionProps.items.length > 0) {\n        var correctedIndex_1 = 0;\n        return React__namespace.createElement(\n          \"li\",\n          { role: \"presentation\", key: sectionProps.key || sectionItem.key || \"section-\".concat(index2) },\n          React__namespace.createElement(\n            \"div\",\n            __assign$1({}, groupProps),\n            React__namespace.createElement(\n              \"ul\",\n              { className: menuClassNames.list, role: \"presentation\" },\n              sectionProps.topDivider && renderSeparator(index2, itemClassNames, true, true),\n              headerItem && renderListItem(headerItem, sectionItem.key || index2, itemClassNames, sectionItem.title),\n              sectionProps.items.map(function(contextualMenuItem, itemsIndex) {\n                var menuItem = renderMenuItem(contextualMenuItem, itemsIndex, correctedIndex_1, getItemCount(sectionProps.items), hasCheckmarks2, hasIcons2, menuClassNames);\n                if (contextualMenuItem.itemType !== ContextualMenuItemType.Divider && contextualMenuItem.itemType !== ContextualMenuItemType.Header) {\n                  var indexIncrease = contextualMenuItem.customOnRenderListLength ? contextualMenuItem.customOnRenderListLength : 1;\n                  correctedIndex_1 += indexIncrease;\n                }\n                return menuItem;\n              }),\n              sectionProps.bottomDivider && renderSeparator(index2, itemClassNames, false, true)\n            )\n          )\n        );\n      }\n    };\n    var renderListItem = function(content2, key2, classNames3, title2) {\n      return React__namespace.createElement(\"li\", { role: \"presentation\", title: title2, key: key2, className: classNames3.item }, content2);\n    };\n    var renderSeparator = function(index2, classNames3, top, fromSection) {\n      if (fromSection || index2 > 0) {\n        return React__namespace.createElement(\"li\", { role: \"separator\", key: \"separator-\" + index2 + (top === void 0 ? \"\" : top ? \"-top\" : \"-bottom\"), className: classNames3.divider, \"aria-hidden\": \"true\" });\n      }\n      return null;\n    };\n    var renderNormalItem = function(item, classNames3, index2, focusableElementIndex, totalItemCount, hasCheckmarks2, hasIcons2) {\n      if (item.onRender) {\n        return item.onRender(__assign$1({ \"aria-posinset\": focusableElementIndex + 1, \"aria-setsize\": totalItemCount }, item), dismiss);\n      }\n      var contextualMenuItemAs = props.contextualMenuItemAs;\n      var commonProps = {\n        item,\n        classNames: classNames3,\n        index: index2,\n        focusableElementIndex,\n        totalItemCount,\n        hasCheckmarks: hasCheckmarks2,\n        hasIcons: hasIcons2,\n        contextualMenuItemAs,\n        onItemMouseEnter: onItemMouseEnterBase,\n        onItemMouseLeave: onMouseItemLeave,\n        onItemMouseMove: onItemMouseMoveBase,\n        onItemMouseDown,\n        executeItemClick,\n        onItemKeyDown,\n        expandedMenuItemKey,\n        openSubMenu,\n        dismissSubMenu: onSubMenuDismiss,\n        dismissMenu: dismiss\n      };\n      if (item.href) {\n        var ContextualMenuAnchorAs = ContextualMenuAnchor;\n        if (item.contextualMenuItemWrapperAs) {\n          ContextualMenuAnchorAs = composeComponentAs(item.contextualMenuItemWrapperAs, ContextualMenuAnchorAs);\n        }\n        return React__namespace.createElement(ContextualMenuAnchorAs, __assign$1({}, commonProps, { onItemClick: onAnchorClick }));\n      }\n      if (item.split && hasSubmenu(item)) {\n        var ContextualMenuSplitButtonAs = ContextualMenuSplitButton;\n        if (item.contextualMenuItemWrapperAs) {\n          ContextualMenuSplitButtonAs = composeComponentAs(item.contextualMenuItemWrapperAs, ContextualMenuSplitButtonAs);\n        }\n        return React__namespace.createElement(ContextualMenuSplitButtonAs, __assign$1({}, commonProps, { onItemClick, onItemClickBase, onTap: cancelSubMenuTimer }));\n      }\n      var ContextualMenuButtonAs = ContextualMenuButton;\n      if (item.contextualMenuItemWrapperAs) {\n        ContextualMenuButtonAs = composeComponentAs(item.contextualMenuItemWrapperAs, ContextualMenuButtonAs);\n      }\n      return React__namespace.createElement(ContextualMenuButtonAs, __assign$1({}, commonProps, { onItemClick, onItemClickBase }));\n    };\n    var renderHeaderMenuItem = function(item, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2) {\n      var ChildrenRenderer = ContextualMenuItem;\n      if (item.contextualMenuItemAs) {\n        ChildrenRenderer = composeComponentAs(item.contextualMenuItemAs, ChildrenRenderer);\n      }\n      if (props.contextualMenuItemAs) {\n        ChildrenRenderer = composeComponentAs(props.contextualMenuItemAs, ChildrenRenderer);\n      }\n      var itemProps = item.itemProps, id3 = item.id;\n      var divHtmlProperties = itemProps && getNativeProps(itemProps, divProperties);\n      return (\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        React__namespace.createElement(\n          \"div\",\n          __assign$1({ id: id3, className: menuClassNames.header }, divHtmlProperties, { style: item.style }),\n          React__namespace.createElement(ChildrenRenderer, __assign$1({ item, classNames: itemClassNames, index: index2, onCheckmarkClick: hasCheckmarks2 ? onItemClick : void 0, hasIcons: hasIcons2 }, itemProps))\n        )\n      );\n    };\n    var isBeakVisible = props.isBeakVisible;\n    var items = props.items, labelElementId = props.labelElementId, id2 = props.id, className2 = props.className, beakWidth = props.beakWidth, directionalHint = props.directionalHint, directionalHintForRTL = props.directionalHintForRTL, alignTargetEdge = props.alignTargetEdge, gapSpace = props.gapSpace, coverTarget = props.coverTarget, ariaLabel2 = props.ariaLabel, doNotLayer = props.doNotLayer, target2 = props.target, bounds2 = props.bounds, useTargetWidth = props.useTargetWidth, useTargetAsMinWidth = props.useTargetAsMinWidth, directionalHintFixed = props.directionalHintFixed, shouldFocusOnMount = props.shouldFocusOnMount, shouldFocusOnContainer = props.shouldFocusOnContainer, title = props.title, styles = props.styles, theme = props.theme, calloutProps = props.calloutProps, _k = props.onRenderSubMenu, onRenderSubMenu2 = _k === void 0 ? onDefaultRenderSubMenu : _k, _l = props.onRenderMenuList, onRenderMenuList = _l === void 0 ? function(menuListProps, defaultRender) {\n      return onDefaultRenderMenuList(menuListProps, classNames2);\n    } : _l, focusZoneProps = props.focusZoneProps, getMenuClassNames = props.getMenuClassNames;\n    var classNames2 = getMenuClassNames ? getMenuClassNames(theme, className2) : getClassNames$l(styles, {\n      theme,\n      className: className2\n    });\n    var hasIcons = itemsHaveIcons(items);\n    function itemsHaveIcons(contextualMenuItems) {\n      for (var _i = 0, contextualMenuItems_1 = contextualMenuItems; _i < contextualMenuItems_1.length; _i++) {\n        var item = contextualMenuItems_1[_i];\n        if (item.iconProps) {\n          return true;\n        }\n        if (item.itemType === ContextualMenuItemType.Section && item.sectionProps && itemsHaveIcons(item.sectionProps.items)) {\n          return true;\n        }\n      }\n      return false;\n    }\n    var adjustedFocusZoneProps = __assign$1(__assign$1({ direction: FocusZoneDirection.vertical, handleTabKey: FocusZoneTabbableElements.all, isCircularNavigation: true, \"data-tabster\": '{\"uncontrolled\": {}, \"focusable\": { \"excludeFromMover\": true }}' }, focusZoneProps), { className: css(classNames2.root, (_a2 = props.focusZoneProps) === null || _a2 === void 0 ? void 0 : _a2.className) });\n    var hasCheckmarks = canAnyMenuItemsCheck(items);\n    var submenuProps = expandedMenuItemKey && props.hidden !== true ? getSubmenuProps() : null;\n    isBeakVisible = isBeakVisible === void 0 ? responsiveMode <= ResponsiveMode.medium : isBeakVisible;\n    var contextMenuStyle;\n    var targetAsHtmlElement = targetRef.current;\n    if ((useTargetWidth || useTargetAsMinWidth) && targetAsHtmlElement && targetAsHtmlElement.offsetWidth) {\n      var targetBoundingRect = targetAsHtmlElement.getBoundingClientRect();\n      var targetWidth = targetBoundingRect.width - 2;\n      if (useTargetWidth) {\n        contextMenuStyle = {\n          width: targetWidth\n        };\n      } else if (useTargetAsMinWidth) {\n        contextMenuStyle = {\n          minWidth: targetWidth\n        };\n      }\n    }\n    if (items && items.length > 0) {\n      var totalItemCount_1 = getItemCount(items);\n      var calloutStyles_1 = classNames2.subComponentStyles ? classNames2.subComponentStyles.callout : void 0;\n      return React__namespace.createElement(MenuContext.Consumer, null, function(menuContext) {\n        return React__namespace.createElement(\n          Callout,\n          __assign$1({ styles: calloutStyles_1, onRestoreFocus: tryFocusPreviousActiveElement }, calloutProps, { target: target2 || menuContext.target, isBeakVisible, beakWidth, directionalHint, directionalHintForRTL, gapSpace, coverTarget, doNotLayer, className: css(\"ms-ContextualMenu-Callout\", calloutProps && calloutProps.className), setInitialFocus: shouldFocusOnMount, onDismiss: props.onDismiss || menuContext.onDismiss, onScroll, bounds: bounds2, directionalHintFixed, alignTargetEdge, hidden: props.hidden || menuContext.hidden, ref: forwardedRef }),\n          React__namespace.createElement(\n            \"div\",\n            { style: contextMenuStyle, ref: hostElement, id: id2, className: classNames2.container, tabIndex: shouldFocusOnContainer ? 0 : -1, onKeyDown: onMenuKeyDown, onKeyUp, onFocusCapture: onMenuFocusCapture, \"aria-label\": ariaLabel2, \"aria-labelledby\": labelElementId, role: \"menu\" },\n            title && React__namespace.createElement(\n              \"div\",\n              { className: classNames2.title },\n              \" \",\n              title,\n              \" \"\n            ),\n            items && items.length ? renderFocusZone(onRenderMenuList({\n              ariaLabel: ariaLabel2,\n              items,\n              totalItemCount: totalItemCount_1,\n              hasCheckmarks,\n              hasIcons,\n              defaultMenuItemRenderer: function(item) {\n                return defaultMenuItemRenderer(item, classNames2);\n              },\n              labelElementId\n            }, function(menuListProps, defaultRender) {\n              return onDefaultRenderMenuList(menuListProps, classNames2);\n            }), adjustedFocusZoneProps) : null,\n            submenuProps && onRenderSubMenu2(submenuProps, onDefaultRenderSubMenu)\n          ),\n          React__namespace.createElement(FocusRects, null)\n        );\n      });\n    } else {\n      return null;\n    }\n  }), function(prevProps, newProps) {\n    if (!newProps.shouldUpdateWhenHidden && prevProps.hidden && newProps.hidden) {\n      return true;\n    }\n    return shallowCompare(prevProps, newProps);\n  });\n  ContextualMenuBase.displayName = \"ContextualMenuBase\";\n  function isAltOrMeta$1(ev) {\n    return ev.which === KeyCodes.alt || ev.key === \"Meta\";\n  }\n  function onItemMouseDown(item, ev) {\n    var _a2;\n    (_a2 = item.onMouseDown) === null || _a2 === void 0 ? void 0 : _a2.call(item, item, ev);\n  }\n  function onDefaultRenderSubMenu(subMenuProps, defaultRender) {\n    throw Error(\"ContextualMenuBase: onRenderSubMenu callback is null or undefined. Please ensure to set `onRenderSubMenu` property either manually or with `styled` helper.\");\n  }\n  function findItemByKeyFromItems(key2, items) {\n    for (var _i = 0, items_3 = items; _i < items_3.length; _i++) {\n      var item = items_3[_i];\n      if (item.itemType === ContextualMenuItemType.Section && item.sectionProps) {\n        var match2 = findItemByKeyFromItems(key2, item.sectionProps.items);\n        if (match2) {\n          return match2;\n        }\n      } else if (item.key && item.key === key2) {\n        return item;\n      }\n    }\n  }\n  function getOnClickWithOverrideTarget(onClick, target2) {\n    return onClick ? function(ev, item) {\n      overrideTarget(ev, target2);\n      return onClick(ev, item);\n    } : onClick;\n  }\n  function overrideTarget(ev, target2) {\n    if (ev && target2) {\n      ev.persist();\n      if (target2 instanceof Event) {\n        ev.target = target2.target;\n      } else if (target2 instanceof Element) {\n        ev.target = target2;\n      }\n    }\n  }\n  var GlobalClassNames$c = {\n    root: \"ms-ContextualMenu\",\n    container: \"ms-ContextualMenu-container\",\n    list: \"ms-ContextualMenu-list\",\n    header: \"ms-ContextualMenu-header\",\n    title: \"ms-ContextualMenu-title\",\n    isopen: \"is-open\"\n  };\n  var getStyles$q = function(props) {\n    var className2 = props.className, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$c, theme);\n    var fonts = theme.fonts, semanticColors = theme.semanticColors, effects = theme.effects;\n    return {\n      root: [\n        theme.fonts.medium,\n        classNames2.root,\n        classNames2.isopen,\n        {\n          backgroundColor: semanticColors.menuBackground,\n          minWidth: \"180px\"\n        },\n        className2\n      ],\n      container: [\n        classNames2.container,\n        {\n          selectors: {\n            \":focus\": { outline: 0 }\n          }\n        }\n      ],\n      list: [\n        classNames2.list,\n        classNames2.isopen,\n        {\n          listStyleType: \"none\",\n          margin: \"0\",\n          padding: \"0\"\n        }\n      ],\n      header: [\n        classNames2.header,\n        fonts.small,\n        {\n          fontWeight: FontWeights.semibold,\n          color: semanticColors.menuHeader,\n          background: \"none\",\n          backgroundColor: \"transparent\",\n          border: \"none\",\n          height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          lineHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          cursor: \"default\",\n          padding: \"0px 6px\",\n          userSelect: \"none\",\n          textAlign: \"left\"\n        }\n      ],\n      title: [\n        classNames2.title,\n        {\n          fontSize: fonts.mediumPlus.fontSize,\n          paddingRight: \"14px\",\n          paddingLeft: \"14px\",\n          paddingBottom: \"5px\",\n          paddingTop: \"5px\",\n          backgroundColor: semanticColors.menuItemBackgroundPressed\n        }\n      ],\n      subComponentStyles: {\n        callout: {\n          root: {\n            boxShadow: effects.elevation8\n          }\n        },\n        menuItem: {}\n      }\n    };\n  };\n  function onRenderSubMenu(subMenuProps) {\n    return React__namespace.createElement(LocalContextualMenu, __assign$1({}, subMenuProps));\n  }\n  var LocalContextualMenu = styled(ContextualMenuBase, getStyles$q, function(props) {\n    return {\n      onRenderSubMenu: props.onRenderSubMenu ? composeRenderFunction(props.onRenderSubMenu, onRenderSubMenu) : onRenderSubMenu\n    };\n  }, { scope: \"ContextualMenu\" });\n  var ContextualMenu = LocalContextualMenu;\n  ContextualMenu.displayName = \"ContextualMenu\";\n  var ButtonGlobalClassNames = {\n    msButton: \"ms-Button\",\n    msButtonHasMenu: \"ms-Button--hasMenu\",\n    msButtonIcon: \"ms-Button-icon\",\n    msButtonMenuIcon: \"ms-Button-menuIcon\",\n    msButtonLabel: \"ms-Button-label\",\n    msButtonDescription: \"ms-Button-description\",\n    msButtonScreenReaderText: \"ms-Button-screenReaderText\",\n    msButtonFlexContainer: \"ms-Button-flexContainer\",\n    msButtonTextContainer: \"ms-Button-textContainer\"\n  };\n  var getBaseButtonClassNames = memoizeFunction(function(theme, styles, className2, variantClassName, iconClassName, menuIconClassName, disabled, hasMenu, checked, expanded, isSplit) {\n    var _a2, _b2;\n    var classNames2 = getGlobalClassNames(ButtonGlobalClassNames, theme || {});\n    var isExpanded = expanded && !isSplit;\n    return mergeStyleSets(styles.__shadowConfig__, {\n      root: [\n        classNames2.msButton,\n        styles.root,\n        variantClassName,\n        checked && [\"is-checked\", styles.rootChecked],\n        isExpanded && [\n          \"is-expanded\",\n          styles.rootExpanded,\n          (_a2 = {}, _a2[\":hover .\".concat(classNames2.msButtonIcon)] = styles.iconExpandedHovered, // menuIcon falls back to rootExpandedHovered to support original behavior\n          _a2[\":hover .\".concat(classNames2.msButtonMenuIcon)] = styles.menuIconExpandedHovered || styles.rootExpandedHovered, _a2[\":hover\"] = styles.rootExpandedHovered, _a2)\n        ],\n        hasMenu && [ButtonGlobalClassNames.msButtonHasMenu, styles.rootHasMenu],\n        disabled && [\"is-disabled\", styles.rootDisabled],\n        !disabled && !isExpanded && !checked && (_b2 = {\n          \":hover\": styles.rootHovered\n        }, _b2[\":hover .\".concat(classNames2.msButtonLabel)] = styles.labelHovered, _b2[\":hover .\".concat(classNames2.msButtonIcon)] = styles.iconHovered, _b2[\":hover .\".concat(classNames2.msButtonDescription)] = styles.descriptionHovered, _b2[\":hover .\".concat(classNames2.msButtonMenuIcon)] = styles.menuIconHovered, _b2[\":focus\"] = styles.rootFocused, _b2[\":active\"] = styles.rootPressed, _b2[\":active .\".concat(classNames2.msButtonIcon)] = styles.iconPressed, _b2[\":active .\".concat(classNames2.msButtonDescription)] = styles.descriptionPressed, _b2[\":active .\".concat(classNames2.msButtonMenuIcon)] = styles.menuIconPressed, _b2),\n        disabled && checked && [styles.rootCheckedDisabled],\n        !disabled && checked && {\n          \":hover\": styles.rootCheckedHovered,\n          \":active\": styles.rootCheckedPressed\n        },\n        className2\n      ],\n      flexContainer: [classNames2.msButtonFlexContainer, styles.flexContainer],\n      textContainer: [classNames2.msButtonTextContainer, styles.textContainer],\n      icon: [\n        classNames2.msButtonIcon,\n        iconClassName,\n        styles.icon,\n        isExpanded && styles.iconExpanded,\n        checked && styles.iconChecked,\n        disabled && styles.iconDisabled\n      ],\n      label: [classNames2.msButtonLabel, styles.label, checked && styles.labelChecked, disabled && styles.labelDisabled],\n      menuIcon: [\n        classNames2.msButtonMenuIcon,\n        menuIconClassName,\n        styles.menuIcon,\n        checked && styles.menuIconChecked,\n        disabled && !isSplit && styles.menuIconDisabled,\n        !disabled && !isExpanded && !checked && {\n          \":hover\": styles.menuIconHovered,\n          \":active\": styles.menuIconPressed\n        },\n        isExpanded && [\"is-expanded\", styles.menuIconExpanded]\n      ],\n      description: [\n        classNames2.msButtonDescription,\n        styles.description,\n        checked && styles.descriptionChecked,\n        disabled && styles.descriptionDisabled\n      ],\n      screenReaderText: [classNames2.msButtonScreenReaderText, styles.screenReaderText]\n    });\n  });\n  var SplitButtonGlobalClassNames = {\n    msSplitButtonDivider: \"ms-SplitButton-divider\"\n  };\n  var getSplitButtonClassNames = memoizeFunction(function(styles, disabled, expanded, checked, primaryDisabled) {\n    return {\n      root: mergeStyles(styles.splitButtonMenuButton, expanded && [styles.splitButtonMenuButtonExpanded], disabled && [styles.splitButtonMenuButtonDisabled], checked && !disabled && [styles.splitButtonMenuButtonChecked], primaryDisabled && !disabled && [\n        {\n          \":focus\": styles.splitButtonMenuFocused\n        }\n      ]),\n      splitButtonContainer: mergeStyles(styles.splitButtonContainer, !disabled && checked && [\n        styles.splitButtonContainerChecked,\n        {\n          \":hover\": styles.splitButtonContainerCheckedHovered\n        }\n      ], !disabled && !checked && [\n        {\n          \":hover\": styles.splitButtonContainerHovered,\n          \":focus\": styles.splitButtonContainerFocused\n        }\n      ], disabled && styles.splitButtonContainerDisabled),\n      icon: mergeStyles(styles.splitButtonMenuIcon, disabled && styles.splitButtonMenuIconDisabled, !disabled && primaryDisabled && styles.splitButtonMenuIcon),\n      flexContainer: mergeStyles(styles.splitButtonFlexContainer),\n      divider: mergeStyles(SplitButtonGlobalClassNames.msSplitButtonDivider, styles.splitButtonDivider, (primaryDisabled || disabled) && styles.splitButtonDividerDisabled)\n    };\n  });\n  var TouchIdleDelay$1 = 500;\n  var COMPONENT_NAME$6 = \"BaseButton\";\n  var BaseButton = (\n    /** @class */\n    (function(_super) {\n      __extends(BaseButton2, _super);\n      function BaseButton2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._buttonElement = React__namespace.createRef();\n        _this._splitButtonContainer = React__namespace.createRef();\n        _this._mergedRef = createMergedRef();\n        _this._renderedVisibleMenu = false;\n        _this._getMemoizedMenuButtonKeytipProps = memoizeFunction(function(keytipProps) {\n          return __assign$1(__assign$1({}, keytipProps), { hasMenu: true });\n        });\n        _this._onRenderIcon = function(buttonProps, defaultRender) {\n          var iconProps = _this.props.iconProps;\n          if (iconProps && (iconProps.iconName !== void 0 || iconProps.imageProps)) {\n            var className2 = iconProps.className, imageProps = iconProps.imageProps, rest = __rest(iconProps, [\"className\", \"imageProps\"]);\n            if (iconProps.styles) {\n              return React__namespace.createElement(Icon, __assign$1({ className: css(_this._classNames.icon, className2), imageProps }, rest));\n            }\n            if (iconProps.iconName) {\n              return React__namespace.createElement(FontIcon, __assign$1({ className: css(_this._classNames.icon, className2) }, rest));\n            }\n            if (imageProps) {\n              return React__namespace.createElement(ImageIcon, __assign$1({ className: css(_this._classNames.icon, className2), imageProps }, rest));\n            }\n          }\n          return null;\n        };\n        _this._onRenderTextContents = function() {\n          var _a2 = _this.props, text2 = _a2.text, children2 = _a2.children, _b2 = _a2.secondaryText, secondaryText = _b2 === void 0 ? _this.props.description : _b2, _c2 = _a2.onRenderText, onRenderText = _c2 === void 0 ? _this._onRenderText : _c2, _d2 = _a2.onRenderDescription, onRenderDescription = _d2 === void 0 ? _this._onRenderDescription : _d2;\n          if (text2 || typeof children2 === \"string\" || secondaryText) {\n            return React__namespace.createElement(\n              \"span\",\n              { className: _this._classNames.textContainer },\n              onRenderText(_this.props, _this._onRenderText),\n              onRenderDescription(_this.props, _this._onRenderDescription)\n            );\n          }\n          return [onRenderText(_this.props, _this._onRenderText), onRenderDescription(_this.props, _this._onRenderDescription)];\n        };\n        _this._onRenderText = function() {\n          var text2 = _this.props.text;\n          var children2 = _this.props.children;\n          if (text2 === void 0 && typeof children2 === \"string\") {\n            text2 = children2;\n          }\n          if (_this._hasText()) {\n            return React__namespace.createElement(\"span\", { key: _this._labelId, className: _this._classNames.label, id: _this._labelId }, text2);\n          }\n          return null;\n        };\n        _this._onRenderChildren = function() {\n          var children2 = _this.props.children;\n          if (typeof children2 === \"string\") {\n            return null;\n          }\n          return children2;\n        };\n        _this._onRenderDescription = function(props2) {\n          var _a2 = props2.secondaryText, secondaryText = _a2 === void 0 ? _this.props.description : _a2;\n          return secondaryText ? React__namespace.createElement(\"span\", { key: _this._descriptionId, className: _this._classNames.description, id: _this._descriptionId }, secondaryText) : null;\n        };\n        _this._onRenderAriaDescription = function() {\n          var ariaDescription = _this.props.ariaDescription;\n          return ariaDescription ? React__namespace.createElement(\"span\", { className: _this._classNames.screenReaderText, id: _this._ariaDescriptionId }, ariaDescription) : null;\n        };\n        _this._onRenderMenuIcon = function(props2) {\n          var menuIconProps = _this.props.menuIconProps;\n          return React__namespace.createElement(FontIcon, __assign$1({ iconName: \"ChevronDown\" }, menuIconProps, { className: _this._classNames.menuIcon }));\n        };\n        _this._onRenderMenu = function(menuProps) {\n          var MenuType = _this.props.menuAs ? composeComponentAs(_this.props.menuAs, ContextualMenu) : ContextualMenu;\n          return React__namespace.createElement(MenuType, __assign$1({}, menuProps));\n        };\n        _this._onDismissMenu = function(ev) {\n          var menuProps = _this.props.menuProps;\n          if (menuProps && menuProps.onDismiss) {\n            menuProps.onDismiss(ev);\n          }\n          if (!ev || !ev.defaultPrevented) {\n            _this._dismissMenu();\n          }\n        };\n        _this._dismissMenu = function() {\n          _this._menuShouldFocusOnMount = void 0;\n          _this._menuShouldFocusOnContainer = void 0;\n          _this.setState({ menuHidden: true });\n        };\n        _this._openMenu = function(shouldFocusOnContainer, shouldFocusOnMount) {\n          if (shouldFocusOnMount === void 0) {\n            shouldFocusOnMount = true;\n          }\n          if (_this.props.menuProps) {\n            _this._menuShouldFocusOnContainer = shouldFocusOnContainer;\n            _this._menuShouldFocusOnMount = shouldFocusOnMount;\n            _this._renderedVisibleMenu = true;\n            _this.setState({ menuHidden: false });\n          }\n        };\n        _this._onToggleMenu = function(shouldFocusOnContainer) {\n          var shouldFocusOnMount = true;\n          if (_this.props.menuProps && _this.props.menuProps.shouldFocusOnMount === false) {\n            shouldFocusOnMount = false;\n          }\n          _this.state.menuHidden ? _this._openMenu(shouldFocusOnContainer, shouldFocusOnMount) : _this._dismissMenu();\n        };\n        _this._onSplitContainerFocusCapture = function(ev) {\n          var container = _this._splitButtonContainer.current;\n          if (!container || ev.target && portalContainsElement(ev.target, container)) {\n            return;\n          }\n          container.focus();\n        };\n        _this._onSplitButtonPrimaryClick = function(ev) {\n          if (!_this.state.menuHidden) {\n            _this._dismissMenu();\n          }\n          var singleTouchTarget = _this._processingTouch && !_this.props.toggle;\n          if (!singleTouchTarget && _this.props.onClick) {\n            _this.props.onClick(ev);\n          } else if (singleTouchTarget) {\n            _this._onMenuClick(ev);\n          }\n        };\n        _this._onKeyDown = function(ev) {\n          if (_this.props.disabled && (ev.which === KeyCodes.enter || ev.which === KeyCodes.space)) {\n            ev.preventDefault();\n            ev.stopPropagation();\n          } else if (!_this.props.disabled) {\n            if (_this.props.menuProps) {\n              _this._onMenuKeyDown(ev);\n            } else if (_this.props.onKeyDown !== void 0) {\n              _this.props.onKeyDown(ev);\n            }\n          }\n        };\n        _this._onKeyUp = function(ev) {\n          if (!_this.props.disabled && _this.props.onKeyUp !== void 0) {\n            _this.props.onKeyUp(ev);\n          }\n        };\n        _this._onKeyPress = function(ev) {\n          if (!_this.props.disabled && _this.props.onKeyPress !== void 0) {\n            _this.props.onKeyPress(ev);\n          }\n        };\n        _this._onMouseUp = function(ev) {\n          if (!_this.props.disabled && _this.props.onMouseUp !== void 0) {\n            _this.props.onMouseUp(ev);\n          }\n        };\n        _this._onMouseDown = function(ev) {\n          if (!_this.props.disabled && _this.props.onMouseDown !== void 0) {\n            _this.props.onMouseDown(ev);\n          }\n        };\n        _this._onClick = function(ev) {\n          if (!_this.props.disabled) {\n            if (_this.props.menuProps) {\n              _this._onMenuClick(ev);\n            } else if (_this.props.onClick !== void 0) {\n              _this.props.onClick(ev);\n            }\n          }\n        };\n        _this._onSplitButtonContainerKeyDown = function(ev) {\n          if (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) {\n            if (_this._buttonElement.current) {\n              _this._buttonElement.current.click();\n              ev.preventDefault();\n              ev.stopPropagation();\n            }\n          } else {\n            _this._onMenuKeyDown(ev);\n          }\n        };\n        _this._onMenuKeyDown = function(ev) {\n          var _a2;\n          if (_this.props.disabled) {\n            return;\n          }\n          if (_this.props.onKeyDown) {\n            _this.props.onKeyDown(ev);\n          }\n          var isUp = ev.which === KeyCodes.up;\n          var isDown = ev.which === KeyCodes.down;\n          if (!ev.defaultPrevented && _this._isValidMenuOpenKey(ev)) {\n            var onMenuClick = _this.props.onMenuClick;\n            if (onMenuClick) {\n              onMenuClick(ev, _this.props);\n            }\n            _this._onToggleMenu(false);\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n          if (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) {\n            setFocusVisibility(true, ev.target, (_a2 = _this.context) === null || _a2 === void 0 ? void 0 : _a2.registeredProviders);\n          }\n          if (!(ev.altKey || ev.metaKey) && (isUp || isDown)) {\n            if (!_this.state.menuHidden && _this.props.menuProps) {\n              var currentShouldFocusOnMount = _this._menuShouldFocusOnMount !== void 0 ? _this._menuShouldFocusOnMount : _this.props.menuProps.shouldFocusOnMount;\n              if (!currentShouldFocusOnMount) {\n                ev.preventDefault();\n                ev.stopPropagation();\n                _this._menuShouldFocusOnMount = true;\n                _this.forceUpdate();\n              }\n            }\n          }\n        };\n        _this._onTouchStart = function() {\n          if (_this._isSplitButton && _this._splitButtonContainer.current && !(\"onpointerdown\" in _this._splitButtonContainer.current)) {\n            _this._handleTouchAndPointerEvent();\n          }\n        };\n        _this._onMenuClick = function(ev) {\n          var _a2 = _this.props, onMenuClick = _a2.onMenuClick, menuProps = _a2.menuProps;\n          if (onMenuClick) {\n            onMenuClick(ev, _this.props);\n          }\n          var shouldFocusOnContainer = typeof (menuProps === null || menuProps === void 0 ? void 0 : menuProps.shouldFocusOnContainer) === \"boolean\" ? menuProps.shouldFocusOnContainer : ev.nativeEvent.pointerType === \"mouse\";\n          if (!ev.defaultPrevented) {\n            _this._onToggleMenu(shouldFocusOnContainer);\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n        };\n        initializeComponentRef(_this);\n        _this._async = new Async(_this);\n        _this._events = new EventGroup(_this);\n        warnConditionallyRequiredProps(COMPONENT_NAME$6, props, [\"menuProps\", \"onClick\"], \"split\", _this.props.split);\n        _this._labelId = getId();\n        _this._descriptionId = getId();\n        _this._ariaDescriptionId = getId();\n        _this.state = {\n          menuHidden: true\n        };\n        return _this;\n      }\n      Object.defineProperty(BaseButton2.prototype, \"_isSplitButton\", {\n        get: function() {\n          return !!this.props.menuProps && !!this.props.onClick && this.props.split === true;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      BaseButton2.prototype.render = function() {\n        var _a2;\n        var _b2 = this.props, ariaDescription = _b2.ariaDescription, ariaLabel2 = _b2.ariaLabel, ariaHidden = _b2.ariaHidden, className2 = _b2.className, disabled = _b2.disabled, allowDisabledFocus = _b2.allowDisabledFocus, primaryDisabled = _b2.primaryDisabled, _c2 = _b2.secondaryText, secondaryText = _c2 === void 0 ? this.props.description : _c2, href2 = _b2.href, iconProps = _b2.iconProps, menuIconProps = _b2.menuIconProps, styles = _b2.styles, checked = _b2.checked, variantClassName = _b2.variantClassName, theme = _b2.theme, toggle = _b2.toggle, getClassNames2 = _b2.getClassNames, role = _b2.role;\n        var menuHidden = this.state.menuHidden;\n        var isPrimaryButtonDisabled = disabled || primaryDisabled;\n        this._classNames = getClassNames2 ? getClassNames2(theme, className2, variantClassName, iconProps && iconProps.className, menuIconProps && menuIconProps.className, isPrimaryButtonDisabled, checked, !menuHidden, !!this.props.menuProps, this.props.split, !!allowDisabledFocus) : getBaseButtonClassNames(theme, styles, className2, variantClassName, iconProps && iconProps.className, menuIconProps && menuIconProps.className, isPrimaryButtonDisabled, !!this.props.menuProps, checked, !menuHidden, this.props.split);\n        var _d2 = this, _ariaDescriptionId = _d2._ariaDescriptionId, _labelId = _d2._labelId, _descriptionId = _d2._descriptionId;\n        var renderAsAnchor = !isPrimaryButtonDisabled && !!href2;\n        var tag = renderAsAnchor ? \"a\" : \"button\";\n        var nativeProps = getNativeProps(\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          assign(renderAsAnchor ? {} : { type: \"button\" }, this.props.rootProps, this.props),\n          renderAsAnchor ? anchorProperties : buttonProperties,\n          [\n            \"disabled\"\n            // let disabled buttons be focused and styled as disabled.\n          ]\n        );\n        var resolvedAriaLabel = ariaLabel2 || nativeProps[\"aria-label\"];\n        var ariaDescribedBy = void 0;\n        if (ariaDescription) {\n          ariaDescribedBy = _ariaDescriptionId;\n        } else if (secondaryText && this.props.onRenderDescription !== nullRender) {\n          ariaDescribedBy = _descriptionId;\n        } else if (nativeProps[\"aria-describedby\"]) {\n          ariaDescribedBy = nativeProps[\"aria-describedby\"];\n        }\n        var ariaLabelledBy = void 0;\n        if (nativeProps[\"aria-labelledby\"]) {\n          ariaLabelledBy = nativeProps[\"aria-labelledby\"];\n        } else if (ariaDescribedBy && !resolvedAriaLabel) {\n          ariaLabelledBy = this._hasText() ? _labelId : void 0;\n        }\n        var dataIsFocusable = this.props[\"data-is-focusable\"] === false || disabled && !allowDisabledFocus || this._isSplitButton ? false : true;\n        var isCheckboxTypeRole = role === \"menuitemcheckbox\" || role === \"checkbox\";\n        var checkedOrPressedValue = isCheckboxTypeRole ? !!checked : toggle === true ? !!checked : void 0;\n        var buttonProps = assign(nativeProps, (_a2 = {\n          className: this._classNames.root,\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          ref: this._mergedRef(this.props.elementRef, this._buttonElement),\n          disabled: isPrimaryButtonDisabled && !allowDisabledFocus,\n          onKeyDown: this._onKeyDown,\n          onKeyPress: this._onKeyPress,\n          onKeyUp: this._onKeyUp,\n          onMouseDown: this._onMouseDown,\n          onMouseUp: this._onMouseUp,\n          onClick: this._onClick,\n          \"aria-label\": resolvedAriaLabel,\n          \"aria-labelledby\": ariaLabelledBy,\n          \"aria-describedby\": ariaDescribedBy,\n          \"aria-disabled\": isPrimaryButtonDisabled,\n          \"data-is-focusable\": dataIsFocusable\n        }, // aria-pressed attribute should only be present for toggle buttons\n        // aria-checked attribute should only be present for toggle buttons with checkbox type role\n        _a2[isCheckboxTypeRole ? \"aria-checked\" : \"aria-pressed\"] = checkedOrPressedValue, _a2));\n        if (ariaHidden) {\n          buttonProps[\"aria-hidden\"] = true;\n        }\n        if (this._isSplitButton) {\n          return this._onRenderSplitButtonContent(tag, buttonProps);\n        } else if (this.props.menuProps) {\n          var _e2 = this.props.menuProps.id, id2 = _e2 === void 0 ? \"\".concat(this._labelId, \"-menu\") : _e2;\n          assign(buttonProps, {\n            \"aria-expanded\": !menuHidden,\n            \"aria-controls\": !menuHidden ? id2 : null,\n            \"aria-haspopup\": true\n          });\n        }\n        return this._onRenderContent(tag, buttonProps);\n      };\n      BaseButton2.prototype.componentDidMount = function() {\n        if (this._isSplitButton && this._splitButtonContainer.current) {\n          if (\"onpointerdown\" in this._splitButtonContainer.current) {\n            this._events.on(this._splitButtonContainer.current, \"pointerdown\", this._onPointerDown, true);\n          }\n          if (\"onpointerup\" in this._splitButtonContainer.current && this.props.onPointerUp) {\n            this._events.on(this._splitButtonContainer.current, \"pointerup\", this.props.onPointerUp, true);\n          }\n        }\n      };\n      BaseButton2.prototype.componentDidUpdate = function(prevProps, prevState) {\n        if (this.props.onAfterMenuDismiss && !prevState.menuHidden && this.state.menuHidden) {\n          this.props.onAfterMenuDismiss();\n        }\n      };\n      BaseButton2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n      };\n      BaseButton2.prototype.focus = function() {\n        var _a2, _b2;\n        if (this._isSplitButton && this._splitButtonContainer.current) {\n          setFocusVisibility(true, void 0, (_a2 = this.context) === null || _a2 === void 0 ? void 0 : _a2.registeredProviders);\n          this._splitButtonContainer.current.focus();\n        } else if (this._buttonElement.current) {\n          setFocusVisibility(true, void 0, (_b2 = this.context) === null || _b2 === void 0 ? void 0 : _b2.registeredProviders);\n          this._buttonElement.current.focus();\n        }\n      };\n      BaseButton2.prototype.dismissMenu = function() {\n        this._dismissMenu();\n      };\n      BaseButton2.prototype.openMenu = function(shouldFocusOnContainer, shouldFocusOnMount) {\n        this._openMenu(shouldFocusOnContainer, shouldFocusOnMount);\n      };\n      BaseButton2.prototype._onRenderContent = function(tag, buttonProps) {\n        var _this = this;\n        var props = this.props;\n        var Tag = tag;\n        var menuIconProps = props.menuIconProps, menuProps = props.menuProps, _a2 = props.onRenderIcon, onRenderIcon = _a2 === void 0 ? this._onRenderIcon : _a2, _b2 = props.onRenderAriaDescription, onRenderAriaDescription = _b2 === void 0 ? this._onRenderAriaDescription : _b2, _c2 = props.onRenderChildren, onRenderChildren = _c2 === void 0 ? this._onRenderChildren : _c2, _d2 = props.onRenderMenu, onRenderMenu = _d2 === void 0 ? this._onRenderMenu : _d2, _e2 = props.onRenderMenuIcon, onRenderMenuIcon = _e2 === void 0 ? this._onRenderMenuIcon : _e2, disabled = props.disabled;\n        var keytipProps = props.keytipProps;\n        if (keytipProps && menuProps) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        var Button2 = function(keytipAttributes) {\n          return React__namespace.createElement(\n            Tag,\n            __assign$1({}, buttonProps, keytipAttributes),\n            React__namespace.createElement(\n              \"span\",\n              { className: _this._classNames.flexContainer, \"data-automationid\": \"splitbuttonprimary\" },\n              onRenderIcon(props, _this._onRenderIcon),\n              _this._onRenderTextContents(),\n              onRenderAriaDescription(props, _this._onRenderAriaDescription),\n              onRenderChildren(props, _this._onRenderChildren),\n              !_this._isSplitButton && (menuProps || menuIconProps || _this.props.onRenderMenuIcon) && onRenderMenuIcon(_this.props, _this._onRenderMenuIcon),\n              menuProps && !menuProps.doNotLayer && _this._shouldRenderMenu() && onRenderMenu(_this._getMenuProps(menuProps), _this._onRenderMenu)\n            )\n          );\n        };\n        var Content = keytipProps ? (\n          // If we're making a split button, we won't put the keytip here\n          React__namespace.createElement(KeytipData, { keytipProps: !this._isSplitButton ? keytipProps : void 0, ariaDescribedBy: buttonProps[\"aria-describedby\"], disabled }, function(keytipAttributes) {\n            return Button2(keytipAttributes);\n          })\n        ) : Button2();\n        if (menuProps && menuProps.doNotLayer) {\n          return React__namespace.createElement(\n            React__namespace.Fragment,\n            null,\n            Content,\n            this._shouldRenderMenu() && onRenderMenu(this._getMenuProps(menuProps), this._onRenderMenu)\n          );\n        }\n        return React__namespace.createElement(\n          React__namespace.Fragment,\n          null,\n          Content,\n          React__namespace.createElement(FocusRects, null)\n        );\n      };\n      BaseButton2.prototype._shouldRenderMenu = function() {\n        var menuHidden = this.state.menuHidden;\n        var _a2 = this.props, persistMenu = _a2.persistMenu, renderPersistedMenuHiddenOnMount = _a2.renderPersistedMenuHiddenOnMount;\n        if (!menuHidden) {\n          return true;\n        } else if (persistMenu && (this._renderedVisibleMenu || renderPersistedMenuHiddenOnMount)) {\n          return true;\n        }\n        return false;\n      };\n      BaseButton2.prototype._hasText = function() {\n        return this.props.text !== null && (this.props.text !== void 0 || typeof this.props.children === \"string\");\n      };\n      BaseButton2.prototype._getMenuProps = function(menuProps) {\n        var persistMenu = this.props.persistMenu;\n        var menuHidden = this.state.menuHidden;\n        if (!menuProps.ariaLabel && !menuProps.labelElementId && this._hasText()) {\n          menuProps = __assign$1(__assign$1({}, menuProps), { labelElementId: this._labelId });\n        }\n        return __assign$1(__assign$1({ id: this._labelId + \"-menu\", directionalHint: DirectionalHint.bottomLeftEdge }, menuProps), { shouldFocusOnContainer: this._menuShouldFocusOnContainer, shouldFocusOnMount: this._menuShouldFocusOnMount, hidden: persistMenu ? menuHidden : void 0, className: css(\"ms-BaseButton-menuhost\", menuProps.className), target: this._isSplitButton ? this._splitButtonContainer.current : this._buttonElement.current, onDismiss: this._onDismissMenu });\n      };\n      BaseButton2.prototype._onRenderSplitButtonContent = function(tag, buttonProps) {\n        var _this = this;\n        var _a2 = this.props, _b2 = _a2.styles, styles = _b2 === void 0 ? {} : _b2, disabled = _a2.disabled, allowDisabledFocus = _a2.allowDisabledFocus, checked = _a2.checked, getSplitButtonClassNames$1 = _a2.getSplitButtonClassNames, primaryDisabled = _a2.primaryDisabled, menuProps = _a2.menuProps, toggle = _a2.toggle, role = _a2.role, primaryActionButtonProps = _a2.primaryActionButtonProps;\n        var keytipProps = this.props.keytipProps;\n        var menuHidden = this.state.menuHidden;\n        var classNames2 = getSplitButtonClassNames$1 ? getSplitButtonClassNames$1(!!disabled, !menuHidden, !!checked, !!allowDisabledFocus) : styles && getSplitButtonClassNames(styles, !!disabled, !menuHidden, !!checked, !!primaryDisabled);\n        assign(buttonProps, {\n          onClick: void 0,\n          onPointerDown: void 0,\n          onPointerUp: void 0,\n          tabIndex: -1,\n          \"data-is-focusable\": false\n        });\n        if (keytipProps && menuProps) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        var containerProps = getNativeProps(buttonProps, [], [\"disabled\"]);\n        if (primaryActionButtonProps) {\n          assign(buttonProps, primaryActionButtonProps);\n        }\n        var SplitButton = function(keytipAttributes) {\n          return React__namespace.createElement(\n            \"div\",\n            __assign$1({}, containerProps, { \"data-ktp-target\": keytipAttributes ? keytipAttributes[\"data-ktp-target\"] : void 0, role: role ? role : \"button\", \"aria-disabled\": disabled, \"aria-haspopup\": true, \"aria-expanded\": !menuHidden, \"aria-pressed\": toggle ? !!checked : void 0, \"aria-describedby\": mergeAriaAttributeValues(buttonProps[\"aria-describedby\"], keytipAttributes ? keytipAttributes[\"aria-describedby\"] : void 0), className: classNames2 && classNames2.splitButtonContainer, onKeyDown: _this._onSplitButtonContainerKeyDown, onTouchStart: _this._onTouchStart, ref: _this._splitButtonContainer, \"data-is-focusable\": true, onClick: !disabled && !primaryDisabled ? _this._onSplitButtonPrimaryClick : void 0, tabIndex: !disabled && !primaryDisabled || allowDisabledFocus ? 0 : void 0, \"aria-roledescription\": buttonProps[\"aria-roledescription\"], onFocusCapture: _this._onSplitContainerFocusCapture }),\n            React__namespace.createElement(\n              \"span\",\n              { style: { display: \"flex\", width: \"100%\" } },\n              _this._onRenderContent(tag, buttonProps),\n              _this._onRenderSplitButtonMenuButton(classNames2, keytipAttributes),\n              _this._onRenderSplitButtonDivider(classNames2)\n            )\n          );\n        };\n        return keytipProps ? React__namespace.createElement(KeytipData, { keytipProps, disabled }, function(keytipAttributes) {\n          return SplitButton(keytipAttributes);\n        }) : SplitButton();\n      };\n      BaseButton2.prototype._onRenderSplitButtonDivider = function(classNames2) {\n        if (classNames2 && classNames2.divider) {\n          var onClick = function(ev) {\n            ev.stopPropagation();\n          };\n          return React__namespace.createElement(\"span\", { className: classNames2.divider, \"aria-hidden\": true, onClick });\n        }\n        return null;\n      };\n      BaseButton2.prototype._onRenderSplitButtonMenuButton = function(classNames2, keytipAttributes) {\n        var _a2 = this.props, allowDisabledFocus = _a2.allowDisabledFocus, checked = _a2.checked, disabled = _a2.disabled, splitButtonMenuProps = _a2.splitButtonMenuProps, splitButtonAriaLabel = _a2.splitButtonAriaLabel, primaryDisabled = _a2.primaryDisabled;\n        var menuHidden = this.state.menuHidden;\n        var menuIconProps = this.props.menuIconProps;\n        if (menuIconProps === void 0) {\n          menuIconProps = {\n            iconName: \"ChevronDown\"\n          };\n        }\n        var splitButtonProps = __assign$1(__assign$1({}, splitButtonMenuProps), { styles: classNames2, checked, disabled, allowDisabledFocus, onClick: this._onMenuClick, menuProps: void 0, iconProps: __assign$1(__assign$1({}, menuIconProps), { className: this._classNames.menuIcon }), ariaLabel: splitButtonAriaLabel, \"aria-haspopup\": true, \"aria-expanded\": !menuHidden, \"data-is-focusable\": false });\n        return React__namespace.createElement(BaseButton2, __assign$1({}, splitButtonProps, { \"data-ktp-execute-target\": keytipAttributes ? keytipAttributes[\"data-ktp-execute-target\"] : keytipAttributes, onMouseDown: this._onMouseDown, tabIndex: primaryDisabled && !allowDisabledFocus ? 0 : -1 }));\n      };\n      BaseButton2.prototype._onPointerDown = function(ev) {\n        var onPointerDown = this.props.onPointerDown;\n        if (onPointerDown) {\n          onPointerDown(ev);\n        }\n        if (ev.pointerType === \"touch\") {\n          this._handleTouchAndPointerEvent();\n          ev.preventDefault();\n          ev.stopImmediatePropagation();\n        }\n      };\n      BaseButton2.prototype._handleTouchAndPointerEvent = function() {\n        var _this = this;\n        if (this._lastTouchTimeoutId !== void 0) {\n          this._async.clearTimeout(this._lastTouchTimeoutId);\n          this._lastTouchTimeoutId = void 0;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n          _this._processingTouch = false;\n          _this._lastTouchTimeoutId = void 0;\n          if (_this.state.menuHidden) {\n            _this.focus();\n          }\n        }, TouchIdleDelay$1);\n      };\n      BaseButton2.prototype._isValidMenuOpenKey = function(ev) {\n        if (this.props.menuTriggerKeyCode) {\n          return ev.which === this.props.menuTriggerKeyCode;\n        } else if (this.props.menuProps) {\n          return ev.which === KeyCodes.down && (ev.altKey || ev.metaKey);\n        }\n        return false;\n      };\n      BaseButton2.defaultProps = {\n        baseClassName: \"ms-Button\",\n        styles: {},\n        split: false\n      };\n      BaseButton2.contextType = FocusRectsContext;\n      return BaseButton2;\n    })(React__namespace.Component)\n  );\n  var noOutline = {\n    outline: 0\n  };\n  var iconStyle = function(fontSize2) {\n    return {\n      fontSize: fontSize2,\n      margin: \"0 4px\",\n      height: \"16px\",\n      lineHeight: \"16px\",\n      textAlign: \"center\",\n      flexShrink: 0\n    };\n  };\n  var getStyles$p = memoizeFunction(function(theme) {\n    var _a2, _b2;\n    var semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var border = semanticColors.buttonBorder;\n    var disabledBackground = semanticColors.disabledBackground;\n    var disabledText = semanticColors.disabledText;\n    var buttonHighContrastFocus = {\n      left: -2,\n      top: -2,\n      bottom: -2,\n      right: -2,\n      outlineColor: \"ButtonText\"\n    };\n    return {\n      root: [\n        getFocusStyle(theme, { inset: 1, highContrastStyle: buttonHighContrastFocus, borderColor: \"transparent\" }),\n        theme.fonts.medium,\n        {\n          border: \"1px solid \" + border,\n          borderRadius: effects.roundedCorner2,\n          boxSizing: \"border-box\",\n          cursor: \"pointer\",\n          display: \"inline-flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          padding: \"0 16px\",\n          textDecoration: \"none\",\n          textAlign: \"center\",\n          userSelect: \"none\",\n          // IE11 workaround for preventing shift of child elements of a button when active.\n          \":active > span\": {\n            position: \"relative\",\n            left: 0,\n            top: 0\n          }\n        }\n      ],\n      rootDisabled: [\n        getFocusStyle(theme, { inset: 1, highContrastStyle: buttonHighContrastFocus, borderColor: \"transparent\" }),\n        {\n          backgroundColor: disabledBackground,\n          borderColor: disabledBackground,\n          color: disabledText,\n          cursor: \"default\",\n          \":hover\": noOutline,\n          \":focus\": noOutline\n        }\n      ],\n      iconDisabled: (_a2 = {\n        color: disabledText\n      }, _a2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _a2),\n      menuIconDisabled: (_b2 = {\n        color: disabledText\n      }, _b2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _b2),\n      flexContainer: {\n        display: \"flex\",\n        height: \"100%\",\n        flexWrap: \"nowrap\",\n        justifyContent: \"center\",\n        alignItems: \"center\"\n      },\n      description: {\n        display: \"block\"\n      },\n      textContainer: {\n        flexGrow: 1,\n        display: \"block\"\n      },\n      icon: iconStyle(fonts.mediumPlus.fontSize),\n      menuIcon: iconStyle(fonts.small.fontSize),\n      label: {\n        margin: \"0 4px\",\n        lineHeight: \"100%\",\n        display: \"block\"\n      },\n      screenReaderText: hiddenContentStyle\n    };\n  });\n  var getStyles$o = memoizeFunction(function(theme, customStyles) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;\n    var effects = theme.effects, palette = theme.palette, semanticColors = theme.semanticColors;\n    var buttonHighContrastFocus = {\n      left: -2,\n      top: -2,\n      bottom: -2,\n      right: -2,\n      border: \"none\"\n    };\n    var splitButtonDividerBaseStyles2 = {\n      position: \"absolute\",\n      width: 1,\n      right: 31,\n      top: 8,\n      bottom: 8\n    };\n    var splitButtonStyles = {\n      splitButtonContainer: [\n        getFocusStyle(theme, { highContrastStyle: buttonHighContrastFocus, inset: 2, pointerEvents: \"none\" }),\n        {\n          display: \"inline-flex\",\n          \".ms-Button--default\": {\n            borderTopRightRadius: \"0\",\n            borderBottomRightRadius: \"0\",\n            borderRight: \"none\",\n            flexGrow: \"1\"\n          },\n          \".ms-Button--primary\": (_a2 = {\n            borderTopRightRadius: \"0\",\n            borderBottomRightRadius: \"0\",\n            border: \"none\",\n            flexGrow: \"1\",\n            \":hover\": {\n              border: \"none\"\n            },\n            \":active\": {\n              border: \"none\"\n            }\n          }, _a2[HighContrastSelector] = __assign$1(__assign$1({ color: \"WindowText\", backgroundColor: \"Window\", border: \"1px solid WindowText\", borderRightWidth: \"0\" }, getHighContrastNoAdjustStyle()), { \":hover\": {\n            backgroundColor: \"Highlight\",\n            border: \"1px solid Highlight\",\n            borderRightWidth: \"0\",\n            color: \"HighlightText\"\n          }, \":active\": {\n            border: \"1px solid Highlight\"\n          } }), _a2),\n          \".ms-Button--default + .ms-Button\": (_b2 = {}, _b2[HighContrastSelector] = {\n            border: \"1px solid WindowText\",\n            borderLeftWidth: \"0\",\n            \":hover\": {\n              backgroundColor: \"HighlightText\",\n              borderColor: \"Highlight\",\n              color: \"Highlight\",\n              \".ms-Button-menuIcon\": __assign$1({ backgroundColor: \"HighlightText\", color: \"Highlight\" }, getHighContrastNoAdjustStyle())\n            }\n          }, _b2),\n          '.ms-Button--default + .ms-Button[aria-expanded=\"true\"]': (_c2 = {}, _c2[HighContrastSelector] = {\n            backgroundColor: \"HighlightText\",\n            borderColor: \"Highlight\",\n            color: \"Highlight\",\n            \".ms-Button-menuIcon\": __assign$1({ backgroundColor: \"HighlightText\", color: \"Highlight\" }, getHighContrastNoAdjustStyle())\n          }, _c2),\n          \".ms-Button--primary + .ms-Button\": (_d2 = {\n            border: \"none\"\n          }, _d2[HighContrastSelector] = {\n            border: \"1px solid WindowText\",\n            borderLeftWidth: \"0\",\n            \":hover\": {\n              borderLeftWidth: \"0\",\n              backgroundColor: \"Highlight\",\n              borderColor: \"Highlight\",\n              color: \"HighlightText\",\n              \".ms-Button-menuIcon\": __assign$1(__assign$1({}, getHighContrastNoAdjustStyle()), { color: \"HighlightText\" })\n            }\n          }, _d2),\n          '.ms-Button--primary + .ms-Button[aria-expanded=\"true\"]': (_e2 = {}, _e2[HighContrastSelector] = __assign$1(__assign$1({ backgroundColor: \"Highlight\", borderColor: \"Highlight\", color: \"HighlightText\" }, getHighContrastNoAdjustStyle()), { \".ms-Button-menuIcon\": {\n            color: \"HighlightText\"\n          } }), _e2),\n          \".ms-Button.is-disabled\": (_f = {}, _f[HighContrastSelector] = {\n            color: \"GrayText\",\n            borderColor: \"GrayText\",\n            backgroundColor: \"Window\"\n          }, _f)\n        }\n      ],\n      splitButtonContainerHovered: {\n        \".ms-Button--default.is-disabled\": (_g = {\n          backgroundColor: semanticColors.buttonBackgroundDisabled,\n          color: semanticColors.buttonTextDisabled\n        }, _g[HighContrastSelector] = {\n          color: \"GrayText\",\n          borderColor: \"GrayText\",\n          backgroundColor: \"Window\"\n        }, _g),\n        \".ms-Button--primary.is-disabled\": (_h = {\n          backgroundColor: semanticColors.primaryButtonBackgroundDisabled,\n          color: semanticColors.primaryButtonTextDisabled\n        }, _h[HighContrastSelector] = {\n          color: \"GrayText\",\n          borderColor: \"GrayText\",\n          backgroundColor: \"Window\"\n        }, _h)\n      },\n      splitButtonContainerChecked: {\n        \".ms-Button--primary\": (_j = {}, _j[HighContrastSelector] = __assign$1({ color: \"Window\", backgroundColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _j)\n      },\n      splitButtonContainerCheckedHovered: {\n        \".ms-Button--primary\": (_k = {}, _k[HighContrastSelector] = __assign$1({ color: \"Window\", backgroundColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _k)\n      },\n      splitButtonContainerFocused: {\n        outline: \"none!important\"\n      },\n      splitButtonMenuButton: (_l = {\n        padding: 6,\n        height: \"auto\",\n        boxSizing: \"border-box\",\n        borderRadius: 0,\n        borderTopRightRadius: effects.roundedCorner2,\n        borderBottomRightRadius: effects.roundedCorner2,\n        border: \"1px solid \".concat(palette.neutralSecondaryAlt),\n        borderLeft: \"none\",\n        outline: \"transparent\",\n        userSelect: \"none\",\n        display: \"inline-block\",\n        textDecoration: \"none\",\n        textAlign: \"center\",\n        cursor: \"pointer\",\n        verticalAlign: \"top\",\n        width: 32,\n        marginLeft: -1,\n        marginTop: 0,\n        marginRight: 0,\n        marginBottom: 0\n      }, _l[HighContrastSelector] = {\n        \".ms-Button-menuIcon\": {\n          color: \"WindowText\"\n        }\n      }, _l),\n      splitButtonDivider: __assign$1(__assign$1({}, splitButtonDividerBaseStyles2), (_m = {}, _m[HighContrastSelector] = {\n        backgroundColor: \"WindowText\"\n      }, _m)),\n      splitButtonDividerDisabled: __assign$1(__assign$1({}, splitButtonDividerBaseStyles2), (_o = {}, _o[HighContrastSelector] = {\n        backgroundColor: \"GrayText\"\n      }, _o)),\n      splitButtonMenuButtonDisabled: (_p = {\n        pointerEvents: \"none\",\n        border: \"none\",\n        \":hover\": {\n          cursor: \"default\"\n        },\n        \".ms-Button--primary\": (_q = {}, _q[HighContrastSelector] = {\n          color: \"GrayText\",\n          borderColor: \"GrayText\",\n          backgroundColor: \"Window\"\n        }, _q),\n        \".ms-Button-menuIcon\": (_r = {}, _r[HighContrastSelector] = {\n          color: \"GrayText\"\n        }, _r)\n      }, _p[HighContrastSelector] = {\n        color: \"GrayText\",\n        border: \"1px solid GrayText\",\n        backgroundColor: \"Window\"\n      }, _p),\n      splitButtonFlexContainer: {\n        display: \"flex\",\n        height: \"100%\",\n        flexWrap: \"nowrap\",\n        justifyContent: \"center\",\n        alignItems: \"center\"\n      },\n      splitButtonContainerDisabled: (_s = {\n        outline: \"none\",\n        border: \"none\"\n      }, _s[HighContrastSelector] = __assign$1({ color: \"GrayText\", borderColor: \"GrayText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _s),\n      splitButtonMenuFocused: __assign$1({}, getFocusStyle(theme, { highContrastStyle: buttonHighContrastFocus, inset: 2 }))\n    };\n    return concatStyleSets(splitButtonStyles, customStyles);\n  });\n  var splitButtonDividerBaseStyles = function() {\n    return {\n      position: \"absolute\",\n      width: 1,\n      right: 31,\n      top: 8,\n      bottom: 8\n    };\n  };\n  function standardStyles(theme) {\n    var _a2, _b2, _c2, _d2, _e2;\n    var s2 = theme.semanticColors, p = theme.palette;\n    var buttonBackground = s2.buttonBackground;\n    var buttonBackgroundPressed = s2.buttonBackgroundPressed;\n    var buttonBackgroundHovered = s2.buttonBackgroundHovered;\n    var buttonBackgroundDisabled = s2.buttonBackgroundDisabled;\n    var buttonText = s2.buttonText;\n    var buttonTextHovered = s2.buttonTextHovered;\n    var buttonTextDisabled = s2.buttonTextDisabled;\n    var buttonTextChecked = s2.buttonTextChecked;\n    var buttonTextCheckedHovered = s2.buttonTextCheckedHovered;\n    return {\n      root: {\n        backgroundColor: buttonBackground,\n        color: buttonText\n      },\n      rootHovered: (_a2 = {\n        backgroundColor: buttonBackgroundHovered,\n        color: buttonTextHovered\n      }, _a2[HighContrastSelector] = {\n        borderColor: \"Highlight\",\n        color: \"Highlight\"\n      }, _a2),\n      rootPressed: {\n        backgroundColor: buttonBackgroundPressed,\n        color: buttonTextChecked\n      },\n      rootExpanded: {\n        backgroundColor: buttonBackgroundPressed,\n        color: buttonTextChecked\n      },\n      rootChecked: {\n        backgroundColor: buttonBackgroundPressed,\n        color: buttonTextChecked\n      },\n      rootCheckedHovered: {\n        backgroundColor: buttonBackgroundPressed,\n        color: buttonTextCheckedHovered\n      },\n      rootDisabled: (_b2 = {\n        color: buttonTextDisabled,\n        backgroundColor: buttonBackgroundDisabled\n      }, _b2[HighContrastSelector] = {\n        color: \"GrayText\",\n        borderColor: \"GrayText\",\n        backgroundColor: \"Window\"\n      }, _b2),\n      // Split button styles\n      splitButtonContainer: (_c2 = {}, _c2[HighContrastSelector] = {\n        border: \"none\"\n      }, _c2),\n      splitButtonMenuButton: {\n        color: p.white,\n        backgroundColor: \"transparent\",\n        \":hover\": (_d2 = {\n          backgroundColor: p.neutralLight\n        }, _d2[HighContrastSelector] = {\n          color: \"Highlight\"\n        }, _d2)\n      },\n      splitButtonMenuButtonDisabled: {\n        backgroundColor: s2.buttonBackgroundDisabled,\n        \":hover\": {\n          backgroundColor: s2.buttonBackgroundDisabled\n        }\n      },\n      splitButtonDivider: __assign$1(__assign$1({}, splitButtonDividerBaseStyles()), (_e2 = { backgroundColor: p.neutralTertiaryAlt }, _e2[HighContrastSelector] = {\n        backgroundColor: \"WindowText\"\n      }, _e2)),\n      splitButtonDividerDisabled: {\n        backgroundColor: theme.palette.neutralTertiaryAlt\n      },\n      splitButtonMenuButtonChecked: {\n        backgroundColor: p.neutralQuaternaryAlt,\n        \":hover\": {\n          backgroundColor: p.neutralQuaternaryAlt\n        }\n      },\n      splitButtonMenuButtonExpanded: {\n        backgroundColor: p.neutralQuaternaryAlt,\n        \":hover\": {\n          backgroundColor: p.neutralQuaternaryAlt\n        }\n      },\n      splitButtonMenuIcon: {\n        color: s2.buttonText\n      },\n      splitButtonMenuIconDisabled: {\n        color: s2.buttonTextDisabled\n      }\n    };\n  }\n  function primaryStyles(theme) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j;\n    var p = theme.palette, s2 = theme.semanticColors;\n    return {\n      root: (_a2 = {\n        backgroundColor: s2.primaryButtonBackground,\n        border: \"1px solid \".concat(s2.primaryButtonBackground),\n        color: s2.primaryButtonText\n      }, _a2[HighContrastSelector] = __assign$1({ color: \"Window\", backgroundColor: \"WindowText\", borderColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _a2[\".\".concat(IsFocusVisibleClassName, \" &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus\")] = {\n        \":after\": {\n          border: \"none\",\n          outlineColor: p.white\n        }\n      }, _a2),\n      rootHovered: (_b2 = {\n        backgroundColor: s2.primaryButtonBackgroundHovered,\n        border: \"1px solid \".concat(s2.primaryButtonBackgroundHovered),\n        color: s2.primaryButtonTextHovered\n      }, _b2[HighContrastSelector] = {\n        color: \"Window\",\n        backgroundColor: \"Highlight\",\n        borderColor: \"Highlight\"\n      }, _b2),\n      rootPressed: (_c2 = {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        border: \"1px solid \".concat(s2.primaryButtonBackgroundPressed),\n        color: s2.primaryButtonTextPressed\n      }, _c2[HighContrastSelector] = __assign$1({ color: \"Window\", backgroundColor: \"WindowText\", borderColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _c2),\n      rootExpanded: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        color: s2.primaryButtonTextPressed\n      },\n      rootChecked: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        color: s2.primaryButtonTextPressed\n      },\n      rootCheckedHovered: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        color: s2.primaryButtonTextPressed\n      },\n      rootDisabled: (_d2 = {\n        color: s2.primaryButtonTextDisabled,\n        backgroundColor: s2.primaryButtonBackgroundDisabled\n      }, _d2[HighContrastSelector] = {\n        color: \"GrayText\",\n        borderColor: \"GrayText\",\n        backgroundColor: \"Window\"\n      }, _d2),\n      // Split button styles\n      splitButtonContainer: (_e2 = {}, _e2[HighContrastSelector] = {\n        border: \"none\"\n      }, _e2),\n      splitButtonDivider: __assign$1(__assign$1({}, splitButtonDividerBaseStyles()), (_f = { backgroundColor: p.white }, _f[HighContrastSelector] = {\n        backgroundColor: \"Window\"\n      }, _f)),\n      splitButtonMenuButton: (_g = {\n        backgroundColor: s2.primaryButtonBackground,\n        color: s2.primaryButtonText\n      }, _g[HighContrastSelector] = {\n        backgroundColor: \"Canvas\"\n      }, _g[\":hover\"] = (_h = {\n        backgroundColor: s2.primaryButtonBackgroundHovered\n      }, _h[HighContrastSelector] = {\n        color: \"Highlight\"\n      }, _h), _g),\n      splitButtonMenuButtonDisabled: {\n        backgroundColor: s2.primaryButtonBackgroundDisabled,\n        \":hover\": {\n          backgroundColor: s2.primaryButtonBackgroundDisabled\n        }\n      },\n      splitButtonMenuButtonChecked: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        \":hover\": {\n          backgroundColor: s2.primaryButtonBackgroundPressed\n        }\n      },\n      splitButtonMenuButtonExpanded: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        \":hover\": {\n          backgroundColor: s2.primaryButtonBackgroundPressed\n        }\n      },\n      splitButtonMenuIcon: {\n        color: s2.primaryButtonText\n      },\n      splitButtonMenuIconDisabled: (_j = {\n        color: p.neutralTertiary\n      }, _j[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _j)\n    };\n  }\n  var DEFAULT_BUTTON_MIN_HEIGHT = \"32px\";\n  var DEFAULT_BUTTON_MIN_WIDTH = \"80px\";\n  var getStyles$n = memoizeFunction(function(theme, customStyles, primary) {\n    var baseButtonStyles = getStyles$p(theme);\n    var splitButtonStyles = getStyles$o(theme);\n    var defaultButtonStyles = {\n      root: {\n        minWidth: DEFAULT_BUTTON_MIN_WIDTH,\n        minHeight: DEFAULT_BUTTON_MIN_HEIGHT\n      },\n      label: {\n        fontWeight: FontWeights.semibold\n      }\n    };\n    return concatStyleSets(baseButtonStyles, defaultButtonStyles, primary ? primaryStyles(theme) : standardStyles(theme), splitButtonStyles, customStyles);\n  });\n  var DefaultButton = (\n    /** @class */\n    (function(_super) {\n      __extends(DefaultButton2, _super);\n      function DefaultButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      DefaultButton2.prototype.render = function() {\n        var _a2 = this.props, _b2 = _a2.primary, primary = _b2 === void 0 ? false : _b2, styles = _a2.styles, theme = _a2.theme;\n        return React__namespace.createElement(BaseButton, __assign$1({}, this.props, { variantClassName: primary ? \"ms-Button--primary\" : \"ms-Button--default\", styles: getStyles$n(theme, styles, primary), onRenderDescription: nullRender }));\n      };\n      DefaultButton2 = __decorate([\n        customizable(\"DefaultButton\", [\"theme\", \"styles\"])\n      ], DefaultButton2);\n      return DefaultButton2;\n    })(React__namespace.Component)\n  );\n  var DEFAULT_BUTTON_HEIGHT = \"40px\";\n  var DEFAULT_PADDING = \"0 4px\";\n  var getStyles$m = memoizeFunction(function(theme, customStyles) {\n    var _a2, _b2, _c2;\n    var baseButtonStyles = getStyles$p(theme);\n    var actionButtonStyles = {\n      root: (_a2 = {\n        padding: DEFAULT_PADDING,\n        height: DEFAULT_BUTTON_HEIGHT,\n        color: theme.palette.neutralPrimary,\n        backgroundColor: \"transparent\",\n        border: \"1px solid transparent\"\n      }, _a2[HighContrastSelector] = {\n        borderColor: \"Window\"\n      }, _a2),\n      rootHovered: (_b2 = {\n        color: theme.palette.themePrimary\n      }, _b2[HighContrastSelector] = {\n        color: \"Highlight\"\n      }, _b2),\n      iconHovered: {\n        color: theme.palette.themePrimary\n      },\n      rootPressed: {\n        color: theme.palette.black\n      },\n      rootExpanded: {\n        color: theme.palette.themePrimary\n      },\n      iconPressed: {\n        color: theme.palette.themeDarker\n      },\n      rootDisabled: (_c2 = {\n        color: theme.palette.neutralTertiary,\n        backgroundColor: \"transparent\",\n        borderColor: \"transparent\"\n      }, _c2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _c2),\n      rootChecked: {\n        color: theme.palette.black\n      },\n      iconChecked: {\n        color: theme.palette.themeDarker\n      },\n      flexContainer: {\n        justifyContent: \"flex-start\"\n      },\n      icon: {\n        color: theme.palette.themeDarkAlt\n      },\n      iconDisabled: {\n        color: \"inherit\"\n      },\n      menuIcon: {\n        color: theme.palette.neutralSecondary\n      },\n      textContainer: {\n        flexGrow: 0\n      }\n    };\n    return concatStyleSets(baseButtonStyles, actionButtonStyles, customStyles);\n  });\n  var ActionButton = (\n    /** @class */\n    (function(_super) {\n      __extends(ActionButton2, _super);\n      function ActionButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      ActionButton2.prototype.render = function() {\n        var _a2 = this.props, styles = _a2.styles, theme = _a2.theme;\n        return React__namespace.createElement(BaseButton, __assign$1({}, this.props, { variantClassName: \"ms-Button--action ms-Button--command\", styles: getStyles$m(theme, styles), onRenderDescription: nullRender }));\n      };\n      ActionButton2 = __decorate([\n        customizable(\"ActionButton\", [\"theme\", \"styles\"])\n      ], ActionButton2);\n      return ActionButton2;\n    })(React__namespace.Component)\n  );\n  var getStyles$l = memoizeFunction(function(theme, customStyles) {\n    var _a2;\n    var baseButtonStyles = getStyles$p(theme);\n    var splitButtonStyles = getStyles$o(theme);\n    var palette = theme.palette, semanticColors = theme.semanticColors;\n    var iconButtonStyles = {\n      root: {\n        padding: \"0 4px\",\n        width: \"32px\",\n        height: \"32px\",\n        backgroundColor: \"transparent\",\n        border: \"none\",\n        color: semanticColors.link\n      },\n      rootHovered: (_a2 = {\n        color: palette.themeDarkAlt,\n        backgroundColor: palette.neutralLighter\n      }, _a2[HighContrastSelector] = {\n        borderColor: \"Highlight\",\n        color: \"Highlight\"\n      }, _a2),\n      rootHasMenu: {\n        width: \"auto\"\n      },\n      rootPressed: {\n        color: palette.themeDark,\n        backgroundColor: palette.neutralLight\n      },\n      rootExpanded: {\n        color: palette.themeDark,\n        backgroundColor: palette.neutralLight\n      },\n      rootChecked: {\n        color: palette.themeDark,\n        backgroundColor: palette.neutralLight\n      },\n      rootCheckedHovered: {\n        color: palette.themeDark,\n        backgroundColor: palette.neutralQuaternaryAlt\n      },\n      rootDisabled: {\n        color: palette.neutralTertiaryAlt\n      }\n    };\n    return concatStyleSets(baseButtonStyles, iconButtonStyles, splitButtonStyles, customStyles);\n  });\n  var IconButton = (\n    /** @class */\n    (function(_super) {\n      __extends(IconButton2, _super);\n      function IconButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      IconButton2.prototype.render = function() {\n        var _a2 = this.props, styles = _a2.styles, theme = _a2.theme;\n        return React__namespace.createElement(BaseButton, __assign$1({}, this.props, { variantClassName: \"ms-Button--icon\", styles: getStyles$l(theme, styles), onRenderText: nullRender, onRenderDescription: nullRender }));\n      };\n      IconButton2 = __decorate([\n        customizable(\"IconButton\", [\"theme\", \"styles\"])\n      ], IconButton2);\n      return IconButton2;\n    })(React__namespace.Component)\n  );\n  var PrimaryButton = (\n    /** @class */\n    (function(_super) {\n      __extends(PrimaryButton2, _super);\n      function PrimaryButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      PrimaryButton2.prototype.render = function() {\n        return React__namespace.createElement(DefaultButton, __assign$1({}, this.props, { primary: true, onRenderDescription: nullRender }));\n      };\n      PrimaryButton2 = __decorate([\n        customizable(\"PrimaryButton\", [\"theme\", \"styles\"])\n      ], PrimaryButton2);\n      return PrimaryButton2;\n    })(React__namespace.Component)\n  );\n  var getStyles$k = memoizeFunction(function(theme, customStyles, focusInset, focusColor) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m, _o;\n    var baseButtonStyles = getStyles$p(theme);\n    var baseSplitButtonStyles = getStyles$o(theme);\n    var p = theme.palette, semanticColors = theme.semanticColors;\n    var commandButtonHighContrastFocus = {\n      left: 4,\n      top: 4,\n      bottom: 4,\n      right: 4,\n      border: \"none\"\n    };\n    var commandButtonStyles = {\n      root: [\n        getFocusStyle(theme, {\n          inset: 2,\n          highContrastStyle: commandButtonHighContrastFocus,\n          borderColor: \"transparent\"\n        }),\n        theme.fonts.medium,\n        (_a2 = {\n          minWidth: \"40px\",\n          backgroundColor: p.white,\n          color: p.neutralPrimary,\n          padding: \"0 4px\",\n          border: \"none\",\n          borderRadius: 0\n        }, _a2[HighContrastSelector] = {\n          border: \"none\"\n        }, _a2)\n      ],\n      rootHovered: (_b2 = {\n        backgroundColor: p.neutralLighter,\n        color: p.neutralDark\n      }, _b2[HighContrastSelector] = {\n        color: \"Highlight\"\n      }, _b2[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDarkAlt\n      }, _b2[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _b2),\n      rootPressed: (_c2 = {\n        backgroundColor: p.neutralLight,\n        color: p.neutralDark\n      }, _c2[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDark\n      }, _c2[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _c2),\n      rootChecked: (_d2 = {\n        backgroundColor: p.neutralLight,\n        color: p.neutralDark\n      }, _d2[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDark\n      }, _d2[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _d2),\n      rootCheckedHovered: (_e2 = {\n        backgroundColor: p.neutralQuaternaryAlt\n      }, _e2[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDark\n      }, _e2[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _e2),\n      rootExpanded: (_f = {\n        backgroundColor: p.neutralLight,\n        color: p.neutralDark\n      }, _f[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDark\n      }, _f[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _f),\n      rootExpandedHovered: {\n        backgroundColor: p.neutralQuaternaryAlt\n      },\n      rootDisabled: (_g = {\n        backgroundColor: p.white\n      }, _g[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = (_h = {\n        color: semanticColors.disabledBodySubtext\n      }, _h[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _h), _g[HighContrastSelector] = __assign$1({ color: \"GrayText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _g),\n      // Split button styles\n      splitButtonContainer: (_j = {\n        height: \"100%\"\n      }, _j[HighContrastSelector] = {\n        border: \"none\"\n      }, _j),\n      splitButtonDividerDisabled: (_k = {}, _k[HighContrastSelector] = {\n        backgroundColor: \"Window\"\n      }, _k),\n      splitButtonDivider: {\n        backgroundColor: p.neutralTertiaryAlt\n      },\n      splitButtonMenuButton: {\n        backgroundColor: p.white,\n        border: \"none\",\n        borderTopRightRadius: \"0\",\n        borderBottomRightRadius: \"0\",\n        color: p.neutralSecondary,\n        \":hover\": (_l = {\n          backgroundColor: p.neutralLighter,\n          color: p.neutralDark\n        }, _l[HighContrastSelector] = {\n          color: \"Highlight\"\n        }, _l[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n          color: p.neutralPrimary\n        }, _l),\n        \":active\": (_m = {\n          backgroundColor: p.neutralLight\n        }, _m[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n          color: p.neutralPrimary\n        }, _m)\n      },\n      splitButtonMenuButtonDisabled: (_o = {\n        backgroundColor: p.white\n      }, _o[HighContrastSelector] = __assign$1({ color: \"GrayText\", border: \"none\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _o),\n      splitButtonMenuButtonChecked: {\n        backgroundColor: p.neutralLight,\n        color: p.neutralDark,\n        \":hover\": {\n          backgroundColor: p.neutralQuaternaryAlt\n        }\n      },\n      splitButtonMenuButtonExpanded: {\n        backgroundColor: p.neutralLight,\n        color: p.black,\n        \":hover\": {\n          backgroundColor: p.neutralQuaternaryAlt\n        }\n      },\n      splitButtonMenuIcon: {\n        color: p.neutralPrimary\n      },\n      splitButtonMenuIconDisabled: {\n        color: p.neutralTertiary\n      },\n      label: {\n        fontWeight: \"normal\"\n        // theme.fontWeights.semibold,\n      },\n      icon: {\n        color: p.themePrimary\n      },\n      menuIcon: {\n        color: p.neutralSecondary\n      }\n    };\n    return concatStyleSets(baseButtonStyles, baseSplitButtonStyles, commandButtonStyles, customStyles);\n  });\n  var CommandBarButton = (\n    /** @class */\n    (function(_super) {\n      __extends(CommandBarButton2, _super);\n      function CommandBarButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      CommandBarButton2.prototype.render = function() {\n        var _a2 = this.props, styles = _a2.styles, theme = _a2.theme;\n        return React__namespace.createElement(BaseButton, __assign$1({}, this.props, { variantClassName: \"ms-Button--commandBar\", styles: getStyles$k(theme, styles), onRenderDescription: nullRender }));\n      };\n      CommandBarButton2 = __decorate([\n        customizable(\"CommandBarButton\", [\"theme\", \"styles\"])\n      ], CommandBarButton2);\n      return CommandBarButton2;\n    })(React__namespace.Component)\n  );\n  var CommandButton = ActionButton;\n  var getClassNames$k = classNamesFunction({\n    // Label is used a lot by other components.\n    // It's likely to see expected cases which pass different className to the Label.\n    // Therefore setting a larger cache size.\n    cacheSize: 100\n  });\n  var LabelBase = (\n    /** @class */\n    (function(_super) {\n      __extends(LabelBase2, _super);\n      function LabelBase2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      LabelBase2.prototype.render = function() {\n        var _a2 = this.props, _b2 = _a2.as, RootType = _b2 === void 0 ? \"label\" : _b2, children2 = _a2.children, className2 = _a2.className, disabled = _a2.disabled, styles = _a2.styles, required2 = _a2.required, theme = _a2.theme;\n        var classNames2 = getClassNames$k(styles, {\n          className: className2,\n          disabled,\n          required: required2,\n          theme\n        });\n        return React__namespace.createElement(RootType, __assign$1({}, getNativeProps(this.props, divProperties), { className: classNames2.root }), children2);\n      };\n      return LabelBase2;\n    })(React__namespace.Component)\n  );\n  var getStyles$j = function(props) {\n    var _a2;\n    var theme = props.theme, className2 = props.className, disabled = props.disabled, required2 = props.required;\n    var semanticColors = theme.semanticColors;\n    var labelFontWeight = FontWeights.semibold;\n    var labelColor = semanticColors.bodyText;\n    var labelDisabledColor = semanticColors.disabledBodyText;\n    var labelRequiredStarColor = semanticColors.errorText;\n    return {\n      root: [\n        \"ms-Label\",\n        theme.fonts.medium,\n        {\n          fontWeight: labelFontWeight,\n          color: labelColor,\n          boxSizing: \"border-box\",\n          boxShadow: \"none\",\n          margin: 0,\n          display: \"block\",\n          padding: \"5px 0\",\n          wordWrap: \"break-word\",\n          overflowWrap: \"break-word\"\n        },\n        disabled && {\n          color: labelDisabledColor,\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _a2)\n        },\n        required2 && {\n          selectors: {\n            \"::after\": {\n              content: \"' *'\",\n              color: labelRequiredStarColor,\n              paddingRight: 12\n            }\n          }\n        },\n        className2\n      ]\n    };\n  };\n  var Label$2 = styled(LabelBase, getStyles$j, void 0, {\n    scope: \"Label\"\n  });\n  var getClassNames$j = classNamesFunction();\n  var LARGE_IMAGE_SIZE = 71;\n  var DEFAULT_PROPS$3 = {\n    // This ensures default imageSize value doesn't mutate. Mutation can cause style re-calcuation.\n    imageSize: { width: 32, height: 32 }\n  };\n  var ChoiceGroupOptionBase = function(propsWithoutDefaults) {\n    var props = getPropsWithDefaults(__assign$1(__assign$1({}, DEFAULT_PROPS$3), { key: propsWithoutDefaults.itemKey }), propsWithoutDefaults);\n    var ariaLabel2 = props.ariaLabel, focused = props.focused, required2 = props.required, theme = props.theme, iconProps = props.iconProps, imageSrc = props.imageSrc, imageSize = props.imageSize, disabled = props.disabled, checked = props.checked, id2 = props.id, styles = props.styles, name = props.name, rest = __rest(props, [\"ariaLabel\", \"focused\", \"required\", \"theme\", \"iconProps\", \"imageSrc\", \"imageSize\", \"disabled\", \"checked\", \"id\", \"styles\", \"name\"]);\n    var classNames2 = getClassNames$j(styles, {\n      theme,\n      hasIcon: !!iconProps,\n      hasImage: !!imageSrc,\n      checked,\n      disabled,\n      imageIsLarge: !!imageSrc && (imageSize.width > LARGE_IMAGE_SIZE || imageSize.height > LARGE_IMAGE_SIZE),\n      imageSize,\n      focused\n    });\n    var _a2 = getNativeProps(rest, inputProperties), className2 = _a2.className, nativeProps = __rest(_a2, [\"className\"]);\n    var defaultOnRenderLabel = function() {\n      return React__namespace.createElement(\"span\", { id: props.labelId, className: \"ms-ChoiceFieldLabel\" }, props.text);\n    };\n    var defaultOnRenderField = function() {\n      var _a3 = props.imageAlt, imageAlt = _a3 === void 0 ? \"\" : _a3, selectedImageSrc = props.selectedImageSrc;\n      var onRenderLabel = props.onRenderLabel ? composeRenderFunction(props.onRenderLabel, defaultOnRenderLabel) : defaultOnRenderLabel;\n      var label2 = onRenderLabel(__assign$1(__assign$1({}, props), { key: props.itemKey }));\n      return React__namespace.createElement(\n        \"label\",\n        { htmlFor: id2, className: classNames2.field },\n        imageSrc && React__namespace.createElement(\n          \"div\",\n          { className: classNames2.innerField },\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.imageWrapper },\n            React__namespace.createElement(Image$1, __assign$1({ src: imageSrc, alt: imageAlt }, imageSize))\n          ),\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.selectedImageWrapper },\n            React__namespace.createElement(Image$1, __assign$1({ src: selectedImageSrc, alt: imageAlt }, imageSize))\n          )\n        ),\n        iconProps && React__namespace.createElement(\n          \"div\",\n          { className: classNames2.innerField },\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.iconWrapper },\n            React__namespace.createElement(Icon, __assign$1({}, iconProps))\n          )\n        ),\n        imageSrc || iconProps ? React__namespace.createElement(\"div\", { className: classNames2.labelWrapper }, label2) : label2\n      );\n    };\n    var _b2 = props.onRenderField, onRenderField = _b2 === void 0 ? defaultOnRenderField : _b2;\n    var onChange = function(evt) {\n      var _a3;\n      (_a3 = props.onChange) === null || _a3 === void 0 ? void 0 : _a3.call(props, evt, __assign$1(__assign$1({}, props), { key: props.itemKey }));\n    };\n    var onBlur = function(evt) {\n      var _a3;\n      (_a3 = props.onBlur) === null || _a3 === void 0 ? void 0 : _a3.call(props, evt);\n    };\n    var onFocus = function(evt) {\n      var _a3;\n      (_a3 = props.onFocus) === null || _a3 === void 0 ? void 0 : _a3.call(props, evt, __assign$1(__assign$1({}, props), { key: props.itemKey }));\n    };\n    return React__namespace.createElement(\n      \"div\",\n      { className: classNames2.root },\n      React__namespace.createElement(\n        \"div\",\n        { className: classNames2.choiceFieldWrapper },\n        React__namespace.createElement(\"input\", __assign$1({ \"aria-label\": ariaLabel2, id: id2, className: css(classNames2.input, className2), type: \"radio\", name, disabled, checked, required: required2 }, nativeProps, { onChange, onFocus, onBlur })),\n        onRenderField(__assign$1(__assign$1({}, props), { key: props.itemKey }), defaultOnRenderField)\n      )\n    );\n  };\n  ChoiceGroupOptionBase.displayName = \"ChoiceGroupOption\";\n  var GlobalClassNames$b = {\n    root: \"ms-ChoiceField\",\n    choiceFieldWrapper: \"ms-ChoiceField-wrapper\",\n    input: \"ms-ChoiceField-input\",\n    field: \"ms-ChoiceField-field\",\n    innerField: \"ms-ChoiceField-innerField\",\n    imageWrapper: \"ms-ChoiceField-imageWrapper\",\n    iconWrapper: \"ms-ChoiceField-iconWrapper\",\n    labelWrapper: \"ms-ChoiceField-labelWrapper\",\n    checked: \"is-checked\"\n  };\n  var labelWrapperLineHeight = 15;\n  var labelWrapperHeight = labelWrapperLineHeight * 2 + 2;\n  var iconSize = 32;\n  var choiceFieldSize = 20;\n  var choiceFieldTransitionDuration = \"200ms\";\n  var choiceFieldTransitionTiming = \"cubic-bezier(.4, 0, .23, 1)\";\n  var radioButtonSpacing = 3;\n  var radioButtonInnerSize = 5;\n  function getChoiceGroupFocusStyle(focusBorderColor, hasIconOrImage) {\n    var _a2, _b2;\n    return [\n      \"is-inFocus\",\n      {\n        selectors: (_a2 = {}, _a2[\".\".concat(IsFocusVisibleClassName, \" &, :host(.\").concat(IsFocusVisibleClassName, \") &\")] = {\n          position: \"relative\",\n          outline: \"transparent\",\n          selectors: {\n            \"::-moz-focus-inner\": {\n              border: 0\n            },\n            \":after\": {\n              content: '\"\"',\n              top: -2,\n              right: -2,\n              bottom: -2,\n              left: -2,\n              pointerEvents: \"none\",\n              border: \"1px solid \".concat(focusBorderColor),\n              position: \"absolute\",\n              selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n                borderColor: \"WindowText\",\n                borderWidth: hasIconOrImage ? 1 : 2\n              }, _b2)\n            }\n          }\n        }, _a2)\n      }\n    ];\n  }\n  function getImageWrapperStyle(isSelectedImageWrapper, className2, checked) {\n    return [\n      className2,\n      {\n        paddingBottom: 2,\n        transitionProperty: \"opacity\",\n        transitionDuration: choiceFieldTransitionDuration,\n        transitionTimingFunction: \"ease\",\n        selectors: {\n          \".ms-Image\": {\n            display: \"inline-block\",\n            borderStyle: \"none\"\n          }\n        }\n      },\n      (checked ? !isSelectedImageWrapper : isSelectedImageWrapper) && [\n        \"is-hidden\",\n        {\n          position: \"absolute\",\n          left: 0,\n          top: 0,\n          width: \"100%\",\n          height: \"100%\",\n          overflow: \"hidden\",\n          opacity: 0\n        }\n      ]\n    ];\n  }\n  var getStyles$i = function(props) {\n    var _a2, _b2, _c2, _d2, _e2;\n    var theme = props.theme, hasIcon = props.hasIcon, hasImage = props.hasImage, checked = props.checked, disabled = props.disabled, imageIsLarge = props.imageIsLarge, focused = props.focused, imageSize = props.imageSize;\n    var palette = theme.palette, semanticColors = theme.semanticColors, fonts = theme.fonts;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$b, theme);\n    var circleBorderColor = palette.neutralPrimary;\n    var circleHoveredBorderColor = semanticColors.inputBorderHovered;\n    var circleCheckedBorderColor = semanticColors.inputBackgroundChecked;\n    var circleCheckedHoveredBorderColor = palette.themeDark;\n    var circleDisabledBorderColor = semanticColors.disabledBodySubtext;\n    var circleBackgroundColor = semanticColors.bodyBackground;\n    var dotUncheckedHoveredColor = palette.neutralSecondary;\n    var dotCheckedColor = semanticColors.inputBackgroundChecked;\n    var dotCheckedHoveredColor = palette.themeDark;\n    var dotDisabledColor = semanticColors.disabledBodySubtext;\n    var labelHoverFocusColor = palette.neutralDark;\n    var focusBorderColor = semanticColors.focusBorder;\n    var iconOrImageChoiceBorderUncheckedHoveredColor = semanticColors.inputBorderHovered;\n    var iconOrImageChoiceBorderCheckedColor = semanticColors.inputBackgroundChecked;\n    var iconOrImageChoiceBorderCheckedHoveredColor = palette.themeDark;\n    var iconOrImageChoiceBackgroundColor = palette.neutralLighter;\n    var fieldHoverOrFocusProperties = {\n      selectors: {\n        \".ms-ChoiceFieldLabel\": {\n          color: labelHoverFocusColor\n        },\n        \":before\": {\n          borderColor: checked ? circleCheckedHoveredBorderColor : circleHoveredBorderColor\n        },\n        \":after\": [\n          !hasIcon && !hasImage && !checked && {\n            content: '\"\"',\n            transitionProperty: \"background-color\",\n            left: 5,\n            top: 5,\n            width: 10,\n            height: 10,\n            backgroundColor: dotUncheckedHoveredColor\n          },\n          checked && {\n            borderColor: dotCheckedHoveredColor,\n            background: dotCheckedHoveredColor\n          }\n        ]\n      }\n    };\n    var enabledFieldWithImageHoverOrFocusProperties = {\n      borderColor: checked ? iconOrImageChoiceBorderCheckedHoveredColor : iconOrImageChoiceBorderUncheckedHoveredColor,\n      selectors: {\n        \":before\": {\n          opacity: 1,\n          borderColor: checked ? circleCheckedHoveredBorderColor : circleHoveredBorderColor\n        }\n      }\n    };\n    var circleAreaProperties = [\n      {\n        content: '\"\"',\n        display: \"inline-block\",\n        backgroundColor: circleBackgroundColor,\n        borderWidth: 1,\n        borderStyle: \"solid\",\n        borderColor: circleBorderColor,\n        width: choiceFieldSize,\n        height: choiceFieldSize,\n        fontWeight: \"normal\",\n        position: \"absolute\",\n        top: 0,\n        left: 0,\n        boxSizing: \"border-box\",\n        transitionProperty: \"border-color\",\n        transitionDuration: choiceFieldTransitionDuration,\n        transitionTimingFunction: choiceFieldTransitionTiming,\n        borderRadius: \"50%\"\n      },\n      disabled && {\n        borderColor: circleDisabledBorderColor,\n        selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ borderColor: \"GrayText\", background: \"Window\" }, getHighContrastNoAdjustStyle()), _a2)\n      },\n      checked && {\n        borderColor: disabled ? circleDisabledBorderColor : circleCheckedBorderColor,\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n          borderColor: \"Highlight\",\n          background: \"Window\",\n          forcedColorAdjust: \"none\"\n        }, _b2)\n      },\n      (hasIcon || hasImage) && {\n        top: radioButtonSpacing,\n        right: radioButtonSpacing,\n        left: \"auto\",\n        // To reset the value of 'left' to its default value, so that 'right' works\n        opacity: checked ? 1 : 0\n      }\n    ];\n    var dotAreaProperties = [\n      {\n        content: '\"\"',\n        width: 0,\n        height: 0,\n        borderRadius: \"50%\",\n        position: \"absolute\",\n        left: choiceFieldSize / 2,\n        right: 0,\n        transitionProperty: \"border-width\",\n        transitionDuration: choiceFieldTransitionDuration,\n        transitionTimingFunction: choiceFieldTransitionTiming,\n        boxSizing: \"border-box\"\n      },\n      checked && {\n        borderWidth: 5,\n        borderStyle: \"solid\",\n        borderColor: disabled ? dotDisabledColor : dotCheckedColor,\n        background: dotCheckedColor,\n        left: 5,\n        top: 5,\n        width: 10,\n        height: 10,\n        selectors: (_c2 = {}, _c2[HighContrastSelector] = {\n          borderColor: \"Highlight\",\n          forcedColorAdjust: \"none\"\n        }, _c2)\n      },\n      checked && (hasIcon || hasImage) && {\n        top: radioButtonSpacing + radioButtonInnerSize,\n        right: radioButtonSpacing + radioButtonInnerSize,\n        left: \"auto\"\n        // To reset the value of 'left' to its default value, so that 'right' works\n      }\n    ];\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          display: \"flex\",\n          alignItems: \"center\",\n          boxSizing: \"border-box\",\n          color: semanticColors.bodyText,\n          minHeight: 26,\n          border: \"none\",\n          position: \"relative\",\n          marginTop: 8,\n          selectors: {\n            \".ms-ChoiceFieldLabel\": {\n              display: \"inline-block\"\n            }\n          }\n        },\n        !hasIcon && !hasImage && {\n          selectors: {\n            \".ms-ChoiceFieldLabel\": {\n              paddingLeft: \"26px\"\n            }\n          }\n        },\n        hasImage && \"ms-ChoiceField--image\",\n        hasIcon && \"ms-ChoiceField--icon\",\n        (hasIcon || hasImage) && {\n          display: \"inline-flex\",\n          fontSize: 0,\n          margin: \"0 4px 4px 0\",\n          paddingLeft: 0,\n          backgroundColor: iconOrImageChoiceBackgroundColor,\n          height: \"100%\"\n        }\n      ],\n      choiceFieldWrapper: [\n        classNames2.choiceFieldWrapper,\n        focused && getChoiceGroupFocusStyle(focusBorderColor, hasIcon || hasImage)\n      ],\n      // The hidden input\n      input: [\n        classNames2.input,\n        {\n          position: \"absolute\",\n          opacity: 0,\n          top: 0,\n          right: 0,\n          width: \"100%\",\n          height: \"100%\",\n          margin: 0\n        },\n        disabled && \"is-disabled\"\n      ],\n      field: [\n        classNames2.field,\n        checked && classNames2.checked,\n        {\n          display: \"inline-block\",\n          cursor: \"pointer\",\n          marginTop: 0,\n          position: \"relative\",\n          verticalAlign: \"top\",\n          userSelect: \"none\",\n          minHeight: 20,\n          selectors: {\n            \":hover\": !disabled && fieldHoverOrFocusProperties,\n            \":focus\": !disabled && fieldHoverOrFocusProperties,\n            // The circle\n            \":before\": circleAreaProperties,\n            // The dot\n            \":after\": dotAreaProperties\n          }\n        },\n        hasIcon && \"ms-ChoiceField--icon\",\n        hasImage && \"ms-ChoiceField-field--image\",\n        (hasIcon || hasImage) && {\n          boxSizing: \"content-box\",\n          cursor: \"pointer\",\n          paddingTop: 22,\n          margin: 0,\n          textAlign: \"center\",\n          transitionProperty: \"all\",\n          transitionDuration: choiceFieldTransitionDuration,\n          transitionTimingFunction: \"ease\",\n          border: \"1px solid transparent\",\n          justifyContent: \"center\",\n          alignItems: \"center\",\n          display: \"flex\",\n          flexDirection: \"column\"\n        },\n        checked && {\n          borderColor: iconOrImageChoiceBorderCheckedColor\n        },\n        (hasIcon || hasImage) && !disabled && {\n          selectors: {\n            \":hover\": enabledFieldWithImageHoverOrFocusProperties,\n            \":focus\": enabledFieldWithImageHoverOrFocusProperties\n          }\n        },\n        disabled && {\n          cursor: \"default\",\n          selectors: {\n            \".ms-ChoiceFieldLabel\": {\n              color: semanticColors.disabledBodyText,\n              selectors: (_d2 = {}, _d2[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _d2)\n            }\n          }\n        },\n        checked && disabled && {\n          borderColor: iconOrImageChoiceBackgroundColor\n        }\n      ],\n      innerField: [\n        classNames2.innerField,\n        hasImage && {\n          // using non-null assertion because we have a default in `ChoiceGroupOptionBase` class.\n          height: imageSize.height,\n          width: imageSize.width\n        },\n        (hasIcon || hasImage) && {\n          position: \"relative\",\n          display: \"inline-block\",\n          paddingLeft: 30,\n          paddingRight: 30\n        },\n        (hasIcon || hasImage) && imageIsLarge && {\n          paddingLeft: 24,\n          paddingRight: 24\n        },\n        (hasIcon || hasImage) && disabled && {\n          opacity: 0.25,\n          selectors: (_e2 = {}, _e2[HighContrastSelector] = {\n            color: \"GrayText\",\n            opacity: 1\n          }, _e2)\n        }\n      ],\n      imageWrapper: getImageWrapperStyle(false, classNames2.imageWrapper, checked),\n      selectedImageWrapper: getImageWrapperStyle(true, classNames2.imageWrapper, checked),\n      iconWrapper: [\n        classNames2.iconWrapper,\n        {\n          fontSize: iconSize,\n          lineHeight: iconSize,\n          height: iconSize\n        }\n      ],\n      labelWrapper: [\n        classNames2.labelWrapper,\n        fonts.medium,\n        (hasIcon || hasImage) && {\n          display: \"block\",\n          position: \"relative\",\n          margin: \"4px 8px 2px 8px\",\n          height: labelWrapperHeight,\n          lineHeight: labelWrapperLineHeight,\n          // using non-null assertion because we have a default in `ChoiceGroupOptionBase` class.\n          maxWidth: imageSize.width * 2,\n          overflow: \"hidden\",\n          whiteSpace: \"pre-wrap\"\n        }\n      ]\n    };\n  };\n  var ChoiceGroupOption = styled(ChoiceGroupOptionBase, getStyles$i, void 0, { scope: \"ChoiceGroupOption\" });\n  var getClassNames$i = classNamesFunction();\n  var getOptionId = function(option, id2) {\n    return \"\".concat(id2, \"-\").concat(option.key);\n  };\n  var findOption = function(options2, key2) {\n    return key2 === void 0 ? void 0 : find$3(options2, function(value2) {\n      return value2.key === key2;\n    });\n  };\n  var focusSelectedOption = function(options2, keyChecked, id2, focusProviders, doc) {\n    var optionToFocus = findOption(options2, keyChecked) || options2.filter(function(option) {\n      return !option.disabled;\n    })[0];\n    var elementToFocus = optionToFocus && (doc === null || doc === void 0 ? void 0 : doc.getElementById(getOptionId(optionToFocus, id2)));\n    if (elementToFocus) {\n      elementToFocus.focus();\n      setFocusVisibility(true, elementToFocus, focusProviders);\n    }\n  };\n  var focusFromFocusTrapZone = function(evt) {\n    return evt.relatedTarget instanceof HTMLElement && evt.relatedTarget.dataset.isFocusTrapZoneBumper === \"true\";\n  };\n  var useComponentRef$5 = function(options2, keyChecked, id2, componentRef, focusProviders) {\n    var doc = useDocumentEx();\n    React__namespace.useImperativeHandle(componentRef, function() {\n      return {\n        get checkedOption() {\n          return findOption(options2, keyChecked);\n        },\n        focus: function() {\n          focusSelectedOption(options2, keyChecked, id2, focusProviders, doc);\n        }\n      };\n    }, [options2, keyChecked, id2, focusProviders, doc]);\n  };\n  var COMPONENT_NAME$5 = \"ChoiceGroup\";\n  var ChoiceGroupBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var className2 = props.className, theme = props.theme, styles = props.styles, _a2 = props.options, options2 = _a2 === void 0 ? [] : _a2, label2 = props.label, required2 = props.required, disabled = props.disabled, name = props.name, defaultSelectedKey = props.defaultSelectedKey, componentRef = props.componentRef, onChange = props.onChange;\n    var id2 = useId(\"ChoiceGroup\");\n    var labelId = useId(\"ChoiceGroupLabel\");\n    var divProps = getNativeProps(props, divProperties, [\n      \"onChange\",\n      \"className\",\n      \"required\"\n    ]);\n    var classNames2 = getClassNames$i(styles, {\n      theme,\n      className: className2,\n      optionsContainIconOrImage: options2.some(function(option) {\n        return !!(option.iconProps || option.imageSrc);\n      })\n    });\n    var ariaLabelledBy = props.ariaLabelledBy || (label2 ? labelId : props[\"aria-labelledby\"]);\n    var _b2 = useControllableValue(props.selectedKey, defaultSelectedKey), keyChecked = _b2[0], setKeyChecked = _b2[1];\n    var _c2 = React__namespace.useState(), keyFocused = _c2[0], setKeyFocused = _c2[1];\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRefs = useMergedRefs(rootRef, forwardedRef);\n    var focusContext = React__namespace.useContext(FocusRectsContext);\n    useComponentRef$5(options2, keyChecked, id2, componentRef, focusContext === null || focusContext === void 0 ? void 0 : focusContext.registeredProviders);\n    useFocusRects(rootRef);\n    var onFocus = React__namespace.useCallback(function(ev, option) {\n      var _a22;\n      if (option) {\n        setKeyFocused(option.itemKey);\n        (_a22 = option.onFocus) === null || _a22 === void 0 ? void 0 : _a22.call(option, ev);\n      }\n    }, []);\n    var onBlur = React__namespace.useCallback(function(ev, option) {\n      var _a22;\n      setKeyFocused(void 0);\n      (_a22 = option === null || option === void 0 ? void 0 : option.onBlur) === null || _a22 === void 0 ? void 0 : _a22.call(option, ev);\n    }, []);\n    var onOptionChange = React__namespace.useCallback(function(evt, option) {\n      var _a22;\n      if (!option) {\n        return;\n      }\n      setKeyChecked(option.itemKey);\n      (_a22 = option.onChange) === null || _a22 === void 0 ? void 0 : _a22.call(option, evt);\n      onChange === null || onChange === void 0 ? void 0 : onChange(evt, findOption(options2, option.itemKey));\n    }, [onChange, options2, setKeyChecked]);\n    var onRadioFocus = React__namespace.useCallback(function(evt) {\n      if (focusFromFocusTrapZone(evt)) {\n        focusSelectedOption(options2, keyChecked, id2, focusContext === null || focusContext === void 0 ? void 0 : focusContext.registeredProviders);\n      }\n    }, [options2, keyChecked, id2, focusContext]);\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({ className: classNames2.root }, divProps, { ref: mergedRootRefs }),\n      React__namespace.createElement(\n        \"div\",\n        __assign$1({ role: \"radiogroup\" }, ariaLabelledBy && { \"aria-labelledby\": ariaLabelledBy }, { onFocus: onRadioFocus }),\n        label2 && React__namespace.createElement(Label$2, { className: classNames2.label, required: required2, id: labelId, disabled }, label2),\n        React__namespace.createElement(\"div\", { className: classNames2.flexContainer }, options2.map(function(option) {\n          return React__namespace.createElement(ChoiceGroupOption, __assign$1({ itemKey: option.key }, option, { key: option.key, onBlur, onFocus, onChange: onOptionChange, focused: option.key === keyFocused, checked: option.key === keyChecked, disabled: option.disabled || disabled, id: getOptionId(option, id2), labelId: option.labelId || \"\".concat(labelId, \"-\").concat(option.key), name: name || id2, required: required2 }));\n        }))\n      )\n    );\n  });\n  ChoiceGroupBase.displayName = COMPONENT_NAME$5;\n  var GlobalClassNames$a = {\n    root: \"ms-ChoiceFieldGroup\",\n    flexContainer: \"ms-ChoiceFieldGroup-flexContainer\"\n  };\n  var getStyles$h = function(props) {\n    var className2 = props.className, optionsContainIconOrImage = props.optionsContainIconOrImage, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$a, theme);\n    return {\n      root: [\n        className2,\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          display: \"block\"\n        }\n      ],\n      flexContainer: [\n        classNames2.flexContainer,\n        optionsContainIconOrImage && {\n          display: \"flex\",\n          flexDirection: \"row\",\n          flexWrap: \"wrap\"\n        }\n      ]\n    };\n  };\n  var ChoiceGroup = styled(ChoiceGroupBase, getStyles$h, void 0, { scope: \"ChoiceGroup\" });\n  var SELECTION_FORWARD = \"forward\";\n  var SELECTION_BACKWARD = \"backward\";\n  var Autofill = (\n    /** @class */\n    (function(_super) {\n      __extends(Autofill2, _super);\n      function Autofill2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._inputElement = React__namespace.createRef();\n        _this._autoFillEnabled = true;\n        _this._onCompositionStart = function(ev) {\n          _this.setState({ isComposing: true });\n          _this._autoFillEnabled = false;\n        };\n        _this._onCompositionUpdate = function() {\n          if (isIE11()) {\n            _this._updateValue(_this._getCurrentInputValue(), true);\n          }\n        };\n        _this._onCompositionEnd = function(ev) {\n          var inputValue = _this._getCurrentInputValue();\n          _this._tryEnableAutofill(inputValue, _this.value, false, true);\n          _this.setState({ isComposing: false });\n          _this._async.setTimeout(function() {\n            _this._updateValue(_this._getCurrentInputValue(), false);\n          }, 0);\n        };\n        _this._onClick = function() {\n          if (_this.value && _this.value !== \"\" && _this._autoFillEnabled) {\n            _this._autoFillEnabled = false;\n          }\n        };\n        _this._onKeyDown = function(ev) {\n          if (_this.props.onKeyDown) {\n            _this.props.onKeyDown(ev);\n          }\n          if (!ev.nativeEvent.isComposing) {\n            switch (ev.which) {\n              case KeyCodes.backspace:\n                _this._autoFillEnabled = false;\n                break;\n              case KeyCodes.left:\n              case KeyCodes.right:\n                if (_this._autoFillEnabled) {\n                  _this.setState(function(prev) {\n                    return {\n                      inputValue: _this.props.suggestedDisplayValue || prev.inputValue\n                    };\n                  });\n                  _this._autoFillEnabled = false;\n                }\n                break;\n              default:\n                if (!_this._autoFillEnabled) {\n                  if (_this.props.enableAutofillOnKeyPress.indexOf(ev.which) !== -1) {\n                    _this._autoFillEnabled = true;\n                  }\n                }\n                break;\n            }\n          }\n        };\n        _this._onInputChanged = function(ev) {\n          var value2 = _this._getCurrentInputValue(ev);\n          if (!_this.state.isComposing) {\n            _this._tryEnableAutofill(value2, _this.value, ev.nativeEvent.isComposing);\n          }\n          if (!(isIE11() && _this.state.isComposing)) {\n            var nativeEventComposing = ev.nativeEvent.isComposing;\n            var isComposing = nativeEventComposing === void 0 ? _this.state.isComposing : nativeEventComposing;\n            _this._updateValue(value2, isComposing);\n          }\n        };\n        _this._onChanged = function() {\n          return;\n        };\n        _this._updateValue = function(newValue, composing) {\n          if (!newValue && newValue === _this.value) {\n            return;\n          }\n          var _a2 = _this.props, onInputChange = _a2.onInputChange, onInputValueChange = _a2.onInputValueChange;\n          if (onInputChange) {\n            newValue = (onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(newValue, composing)) || \"\";\n          }\n          _this.setState({ inputValue: newValue }, function() {\n            return onInputValueChange === null || onInputValueChange === void 0 ? void 0 : onInputValueChange(newValue, composing);\n          });\n        };\n        initializeComponentRef(_this);\n        _this._async = new Async(_this);\n        _this.state = {\n          inputValue: props.defaultVisibleValue || \"\",\n          isComposing: false\n        };\n        return _this;\n      }\n      Autofill2.getDerivedStateFromProps = function(props, state) {\n        if (props.updateValueInWillReceiveProps) {\n          var updatedInputValue = props.updateValueInWillReceiveProps();\n          if (updatedInputValue !== null && updatedInputValue !== state.inputValue && !state.isComposing) {\n            return __assign$1(__assign$1({}, state), { inputValue: updatedInputValue });\n          }\n        }\n        return null;\n      };\n      Object.defineProperty(Autofill2.prototype, \"cursorLocation\", {\n        get: function() {\n          if (this._inputElement.current) {\n            var inputElement = this._inputElement.current;\n            if (inputElement.selectionDirection !== SELECTION_FORWARD) {\n              return inputElement.selectionEnd;\n            } else {\n              return inputElement.selectionStart;\n            }\n          } else {\n            return -1;\n          }\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"isValueSelected\", {\n        get: function() {\n          return Boolean(this.inputElement && this.inputElement.selectionStart !== this.inputElement.selectionEnd);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"value\", {\n        get: function() {\n          return this._getControlledValue() || this.state.inputValue || \"\";\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"selectionStart\", {\n        get: function() {\n          return this._inputElement.current ? this._inputElement.current.selectionStart : -1;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"selectionEnd\", {\n        get: function() {\n          return this._inputElement.current ? this._inputElement.current.selectionEnd : -1;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"inputElement\", {\n        get: function() {\n          return this._inputElement.current;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Autofill2.prototype.componentDidUpdate = function(_, _1, cursor2) {\n        var _a2;\n        var _b2 = this.props, suggestedDisplayValue = _b2.suggestedDisplayValue, shouldSelectFullInputValueInComponentDidUpdate = _b2.shouldSelectFullInputValueInComponentDidUpdate, preventValueSelection = _b2.preventValueSelection;\n        var differenceIndex = 0;\n        if (preventValueSelection) {\n          return;\n        }\n        var document2 = ((_a2 = this.context) === null || _a2 === void 0 ? void 0 : _a2.window.document) || getDocument(this._inputElement.current);\n        var isFocused = this._inputElement.current && this._inputElement.current === (document2 === null || document2 === void 0 ? void 0 : document2.activeElement);\n        if (isFocused && this._autoFillEnabled && this.value && suggestedDisplayValue && _doesTextStartWith(suggestedDisplayValue, this.value)) {\n          var shouldSelectFullRange = false;\n          if (shouldSelectFullInputValueInComponentDidUpdate) {\n            shouldSelectFullRange = shouldSelectFullInputValueInComponentDidUpdate();\n          }\n          if (shouldSelectFullRange) {\n            this._inputElement.current.setSelectionRange(0, suggestedDisplayValue.length, SELECTION_BACKWARD);\n          } else {\n            while (differenceIndex < this.value.length && this.value[differenceIndex].toLocaleLowerCase() === suggestedDisplayValue[differenceIndex].toLocaleLowerCase()) {\n              differenceIndex++;\n            }\n            if (differenceIndex > 0) {\n              this._inputElement.current.setSelectionRange(differenceIndex, suggestedDisplayValue.length, SELECTION_BACKWARD);\n            }\n          }\n        } else if (this._inputElement.current) {\n          if (cursor2 !== null && !this._autoFillEnabled && !this.state.isComposing) {\n            this._inputElement.current.setSelectionRange(cursor2.start, cursor2.end, cursor2.dir);\n          }\n        }\n      };\n      Autofill2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n      };\n      Autofill2.prototype.render = function() {\n        var nativeProps = getNativeProps(this.props, inputProperties);\n        var style2 = __assign$1(__assign$1({}, this.props.style), { fontFamily: \"inherit\" });\n        return React__namespace.createElement(\"input\", __assign$1({ autoCapitalize: \"off\", autoComplete: \"off\", \"aria-autocomplete\": \"both\" }, nativeProps, {\n          style: style2,\n          ref: this._inputElement,\n          value: this._getDisplayValue(),\n          onCompositionStart: this._onCompositionStart,\n          onCompositionUpdate: this._onCompositionUpdate,\n          onCompositionEnd: this._onCompositionEnd,\n          // TODO (Fabric 8?) - switch to calling only onChange. See notes in TextField._onInputChange.\n          onChange: this._onChanged,\n          onInput: this._onInputChanged,\n          onKeyDown: this._onKeyDown,\n          onClick: this.props.onClick ? this.props.onClick : this._onClick,\n          \"data-lpignore\": true\n        }));\n      };\n      Autofill2.prototype.focus = function() {\n        this._inputElement.current && this._inputElement.current.focus();\n      };\n      Autofill2.prototype.clear = function() {\n        this._autoFillEnabled = true;\n        this._updateValue(\"\", false);\n        this._inputElement.current && this._inputElement.current.setSelectionRange(0, 0);\n      };\n      Autofill2.prototype.getSnapshotBeforeUpdate = function() {\n        var _a2, _b2;\n        var inel = this._inputElement.current;\n        if (inel && inel.selectionStart !== this.value.length) {\n          return {\n            start: (_a2 = inel.selectionStart) !== null && _a2 !== void 0 ? _a2 : inel.value.length,\n            end: (_b2 = inel.selectionEnd) !== null && _b2 !== void 0 ? _b2 : inel.value.length,\n            dir: inel.selectionDirection || \"backward\"\n          };\n        }\n        return null;\n      };\n      Autofill2.prototype._getCurrentInputValue = function(ev) {\n        if (ev && ev.target && ev.target.value) {\n          return ev.target.value;\n        } else if (this.inputElement && this.inputElement.value) {\n          return this.inputElement.value;\n        } else {\n          return \"\";\n        }\n      };\n      Autofill2.prototype._tryEnableAutofill = function(newValue, oldValue, isComposing, isComposed) {\n        if (!isComposing && newValue && this._inputElement.current && this._inputElement.current.selectionStart === newValue.length && !this._autoFillEnabled && (newValue.length > oldValue.length || isComposed)) {\n          this._autoFillEnabled = true;\n        }\n      };\n      Autofill2.prototype._getDisplayValue = function() {\n        if (this._autoFillEnabled) {\n          return _getDisplayValue(this.value, this.props.suggestedDisplayValue);\n        }\n        return this.value;\n      };\n      Autofill2.prototype._getControlledValue = function() {\n        var value2 = this.props.value;\n        if (value2 === void 0 || typeof value2 === \"string\") {\n          return value2;\n        }\n        console.warn(\"props.value of Autofill should be a string, but it is \".concat(value2, \" with type of \").concat(typeof value2));\n        return value2.toString();\n      };\n      Autofill2.defaultProps = {\n        enableAutofillOnKeyPress: [KeyCodes.down, KeyCodes.up]\n      };\n      Autofill2.contextType = WindowContext;\n      return Autofill2;\n    })(React__namespace.Component)\n  );\n  function _getDisplayValue(inputValue, suggestedDisplayValue) {\n    var displayValue2 = inputValue;\n    if (suggestedDisplayValue && inputValue && _doesTextStartWith(suggestedDisplayValue, displayValue2)) {\n      displayValue2 = suggestedDisplayValue;\n    }\n    return displayValue2;\n  }\n  function _doesTextStartWith(text2, startWith) {\n    if (!text2 || !startWith) {\n      return false;\n    }\n    return text2.toLocaleLowerCase().indexOf(startWith.toLocaleLowerCase()) === 0;\n  }\n  var getClassNames$h = classNamesFunction();\n  var CheckboxBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var disabled = props.disabled, required2 = props.required, inputProps = props.inputProps, name = props.name, ariaLabel2 = props.ariaLabel, ariaLabelledBy = props.ariaLabelledBy, ariaDescribedBy = props.ariaDescribedBy, ariaPositionInSet = props.ariaPositionInSet, ariaSetSize = props.ariaSetSize, title = props.title, checkmarkIconProps = props.checkmarkIconProps, styles = props.styles, theme = props.theme, className2 = props.className, _a2 = props.boxSide, boxSide = _a2 === void 0 ? \"start\" : _a2;\n    var id2 = useId(\"checkbox-\", props.id);\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRefs = useMergedRefs(rootRef, forwardedRef);\n    var inputRef = React__namespace.useRef(null);\n    var _b2 = useControllableValue(props.checked, props.defaultChecked, props.onChange), isChecked = _b2[0], setIsChecked = _b2[1];\n    var _c2 = useControllableValue(props.indeterminate, props.defaultIndeterminate), isIndeterminate = _c2[0], setIsIndeterminate = _c2[1];\n    useFocusRects(rootRef);\n    var classNames2 = getClassNames$h(styles, {\n      theme,\n      className: className2,\n      disabled,\n      indeterminate: isIndeterminate,\n      checked: isChecked,\n      reversed: boxSide !== \"start\",\n      isUsingCustomLabelRender: !!props.onRenderLabel\n    });\n    var onChange = React__namespace.useCallback(function(event2) {\n      if (isIndeterminate) {\n        setIsChecked(!!isChecked, event2);\n        setIsIndeterminate(false);\n      } else {\n        setIsChecked(!isChecked, event2);\n      }\n    }, [setIsChecked, setIsIndeterminate, isIndeterminate, isChecked]);\n    var defaultLabelRenderer = React__namespace.useCallback(function(checkboxProps) {\n      if (!checkboxProps) {\n        return null;\n      }\n      return checkboxProps.label ? React__namespace.createElement(\"span\", { className: classNames2.text, title: checkboxProps.title }, checkboxProps.label) : null;\n    }, [classNames2.text]);\n    var setNativeIndeterminate = React__namespace.useCallback(function(indeterminate) {\n      if (!inputRef.current) {\n        return;\n      }\n      var value2 = !!indeterminate;\n      inputRef.current.indeterminate = value2;\n      setIsIndeterminate(value2);\n    }, [setIsIndeterminate]);\n    useComponentRef$4(props, isChecked, isIndeterminate, setNativeIndeterminate, inputRef);\n    React__namespace.useEffect(function() {\n      return setNativeIndeterminate(isIndeterminate);\n    }, [setNativeIndeterminate, isIndeterminate]);\n    var onRenderLabel = props.onRenderLabel || defaultLabelRenderer;\n    var ariaChecked = isIndeterminate ? \"mixed\" : void 0;\n    var mergedInputProps = __assign$1(__assign$1({ className: classNames2.input, type: \"checkbox\" }, inputProps), { checked: !!isChecked, disabled, required: required2, name, id: id2, title, onChange, \"aria-disabled\": disabled, \"aria-label\": ariaLabel2, \"aria-labelledby\": ariaLabelledBy, \"aria-describedby\": ariaDescribedBy, \"aria-posinset\": ariaPositionInSet, \"aria-setsize\": ariaSetSize, \"aria-checked\": ariaChecked });\n    return React__namespace.createElement(\n      \"div\",\n      { className: classNames2.root, title, ref: mergedRootRefs },\n      React__namespace.createElement(\"input\", __assign$1({}, mergedInputProps, { ref: inputRef, title, \"data-ktp-execute-target\": true })),\n      React__namespace.createElement(\n        \"label\",\n        { className: classNames2.label, htmlFor: id2 },\n        React__namespace.createElement(\n          \"div\",\n          { className: classNames2.checkbox, \"data-ktp-target\": true },\n          React__namespace.createElement(Icon, __assign$1({ iconName: \"CheckMark\" }, checkmarkIconProps, { className: classNames2.checkmark }))\n        ),\n        onRenderLabel(props, defaultLabelRenderer)\n      )\n    );\n  });\n  CheckboxBase.displayName = \"CheckboxBase\";\n  function useComponentRef$4(props, isChecked, isIndeterminate, setIndeterminate, checkBoxRef) {\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        get checked() {\n          return !!isChecked;\n        },\n        get indeterminate() {\n          return !!isIndeterminate;\n        },\n        set indeterminate(indeterminate) {\n          setIndeterminate(indeterminate);\n        },\n        focus: function() {\n          if (checkBoxRef.current) {\n            checkBoxRef.current.focus();\n          }\n        }\n      };\n    }, [checkBoxRef, isChecked, isIndeterminate, setIndeterminate]);\n  }\n  var GlobalClassNames$9 = {\n    root: \"ms-Checkbox\",\n    label: \"ms-Checkbox-label\",\n    checkbox: \"ms-Checkbox-checkbox\",\n    checkmark: \"ms-Checkbox-checkmark\",\n    text: \"ms-Checkbox-text\"\n  };\n  var MS_CHECKBOX_LABEL_SIZE = \"20px\";\n  var MS_CHECKBOX_TRANSITION_DURATION = \"200ms\";\n  var MS_CHECKBOX_TRANSITION_TIMING = \"cubic-bezier(.4, 0, .23, 1)\";\n  var getStyles$g = function(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\n    var className2 = props.className, theme = props.theme, reversed = props.reversed, checked = props.checked, disabled = props.disabled, isUsingCustomLabelRender = props.isUsingCustomLabelRender, indeterminate = props.indeterminate;\n    var semanticColors = theme.semanticColors, effects = theme.effects, palette = theme.palette, fonts = theme.fonts;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$9, theme);\n    var checkmarkFontColor = semanticColors.inputForegroundChecked;\n    var checkmarkFontColorHovered = palette.neutralSecondary;\n    var checkboxBorderColor = palette.neutralPrimary;\n    var checkboxBorderIndeterminateColor = semanticColors.inputBackgroundChecked;\n    var checkboxBorderColorChecked = semanticColors.inputBackgroundChecked;\n    var checkboxBorderColorDisabled = semanticColors.disabledBodySubtext;\n    var checkboxBorderHoveredColor = semanticColors.inputBorderHovered;\n    var checkboxBorderIndeterminateHoveredColor = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxBackgroundChecked = semanticColors.inputBackgroundChecked;\n    var checkboxBackgroundCheckedHovered = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxBorderColorCheckedHovered = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxHoveredTextColor = semanticColors.inputTextHovered;\n    var checkboxBackgroundDisabledChecked = semanticColors.disabledBodySubtext;\n    var checkboxTextColor = semanticColors.bodyText;\n    var checkboxTextColorDisabled = semanticColors.disabledText;\n    var indeterminateDotStyles = [\n      (_a2 = {\n        content: '\"\"',\n        borderRadius: effects.roundedCorner2,\n        position: \"absolute\",\n        width: 10,\n        height: 10,\n        top: 4,\n        left: 4,\n        boxSizing: \"border-box\",\n        borderWidth: 5,\n        borderStyle: \"solid\",\n        borderColor: disabled ? checkboxBorderColorDisabled : checkboxBorderIndeterminateColor,\n        transitionProperty: \"border-width, border, border-color\",\n        transitionDuration: MS_CHECKBOX_TRANSITION_DURATION,\n        transitionTimingFunction: MS_CHECKBOX_TRANSITION_TIMING\n      }, _a2[HighContrastSelector] = {\n        borderColor: \"WindowText\"\n      }, _a2)\n    ];\n    return {\n      root: [\n        classNames2.root,\n        {\n          position: \"relative\",\n          display: \"flex\"\n        },\n        reversed && \"reversed\",\n        checked && \"is-checked\",\n        !disabled && \"is-enabled\",\n        disabled && \"is-disabled\",\n        !disabled && [\n          !checked && (_b2 = {}, _b2[\":hover .\".concat(classNames2.checkbox)] = (_c2 = {\n            borderColor: checkboxBorderHoveredColor\n          }, _c2[HighContrastSelector] = {\n            borderColor: \"Highlight\"\n          }, _c2), _b2[\":focus .\".concat(classNames2.checkbox)] = { borderColor: checkboxBorderHoveredColor }, _b2[\":hover .\".concat(classNames2.checkmark)] = (_d2 = {\n            color: checkmarkFontColorHovered,\n            opacity: \"1\"\n          }, _d2[HighContrastSelector] = {\n            color: \"Highlight\"\n          }, _d2), _b2),\n          checked && !indeterminate && (_e2 = {}, _e2[\":hover .\".concat(classNames2.checkbox)] = {\n            background: checkboxBackgroundCheckedHovered,\n            borderColor: checkboxBorderColorCheckedHovered\n          }, _e2[\":focus .\".concat(classNames2.checkbox)] = {\n            background: checkboxBackgroundCheckedHovered,\n            borderColor: checkboxBorderColorCheckedHovered\n          }, _e2[HighContrastSelector] = (_f = {}, _f[\":hover .\".concat(classNames2.checkbox)] = {\n            background: \"Highlight\",\n            borderColor: \"Highlight\"\n          }, _f[\":focus .\".concat(classNames2.checkbox)] = {\n            background: \"Highlight\"\n          }, _f[\":focus:hover .\".concat(classNames2.checkbox)] = {\n            background: \"Highlight\"\n          }, _f[\":focus:hover .\".concat(classNames2.checkmark)] = {\n            color: \"Window\"\n          }, _f[\":hover .\".concat(classNames2.checkmark)] = {\n            color: \"Window\"\n          }, _f), _e2),\n          indeterminate && (_g = {}, _g[\":hover .\".concat(classNames2.checkbox, \", :hover .\").concat(classNames2.checkbox, \":after\")] = (_h = {\n            borderColor: checkboxBorderIndeterminateHoveredColor\n          }, _h[HighContrastSelector] = {\n            borderColor: \"WindowText\"\n          }, _h), _g[\":focus .\".concat(classNames2.checkbox)] = {\n            borderColor: checkboxBorderIndeterminateHoveredColor\n          }, _g[\":hover .\".concat(classNames2.checkmark)] = {\n            opacity: \"0\"\n          }, _g),\n          (_j = {}, _j[\":hover .\".concat(classNames2.text, \", :focus .\").concat(classNames2.text)] = (_k = {\n            color: checkboxHoveredTextColor\n          }, _k[HighContrastSelector] = {\n            color: disabled ? \"GrayText\" : \"WindowText\"\n          }, _k), _j)\n        ],\n        className2\n      ],\n      input: (_l = {\n        position: \"absolute\",\n        background: \"none\",\n        opacity: 0\n      }, // eslint-disable-next-line @fluentui/max-len\n      _l[\".\".concat(IsFocusVisibleClassName, \" &:focus + label::before, :host(.\").concat(IsFocusVisibleClassName, \") &:focus + label::before\")] = (_m = {\n        outline: \"1px solid \" + theme.palette.neutralSecondary,\n        outlineOffset: \"2px\"\n      }, _m[HighContrastSelector] = {\n        outline: \"1px solid WindowText\"\n      }, _m), _l),\n      label: [\n        classNames2.label,\n        theme.fonts.medium,\n        {\n          display: \"flex\",\n          alignItems: isUsingCustomLabelRender ? \"center\" : \"flex-start\",\n          cursor: disabled ? \"default\" : \"pointer\",\n          position: \"relative\",\n          userSelect: \"none\"\n        },\n        reversed && {\n          flexDirection: \"row-reverse\",\n          justifyContent: \"flex-end\"\n        },\n        {\n          \"&::before\": {\n            position: \"absolute\",\n            left: 0,\n            right: 0,\n            top: 0,\n            bottom: 0,\n            content: '\"\"',\n            pointerEvents: \"none\"\n          }\n        }\n      ],\n      checkbox: [\n        classNames2.checkbox,\n        (_o = {\n          position: \"relative\",\n          display: \"flex\",\n          flexShrink: 0,\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          height: MS_CHECKBOX_LABEL_SIZE,\n          width: MS_CHECKBOX_LABEL_SIZE,\n          border: \"1px solid \".concat(checkboxBorderColor),\n          borderRadius: effects.roundedCorner2,\n          boxSizing: \"border-box\",\n          transitionProperty: \"background, border, border-color\",\n          transitionDuration: MS_CHECKBOX_TRANSITION_DURATION,\n          transitionTimingFunction: MS_CHECKBOX_TRANSITION_TIMING,\n          /* in case the icon is bigger than the box */\n          overflow: \"hidden\",\n          \":after\": indeterminate ? indeterminateDotStyles : null\n        }, _o[HighContrastSelector] = __assign$1({ borderColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _o),\n        indeterminate && {\n          borderColor: checkboxBorderIndeterminateColor\n        },\n        !reversed ? (\n          // This margin on the checkbox is for backwards compat. Notably it has the effect where a customRender\n          // is used, there will be only a 4px margin from checkbox to label. The label by default would have\n          // another 4px margin for a total of 8px margin between checkbox and label. We don't combine the two\n          // (and move it into the text) to not incur a breaking change for everyone using custom render atm.\n          {\n            marginRight: 4\n          }\n        ) : {\n          marginLeft: 4\n        },\n        !disabled && !indeterminate && checked && (_p = {\n          background: checkboxBackgroundChecked,\n          borderColor: checkboxBorderColorChecked\n        }, _p[HighContrastSelector] = {\n          background: \"Highlight\",\n          borderColor: \"Highlight\"\n        }, _p),\n        disabled && (_q = {\n          borderColor: checkboxBorderColorDisabled\n        }, _q[HighContrastSelector] = {\n          borderColor: \"GrayText\"\n        }, _q),\n        checked && disabled && (_r = {\n          background: checkboxBackgroundDisabledChecked,\n          borderColor: checkboxBorderColorDisabled\n        }, _r[HighContrastSelector] = {\n          background: \"Window\"\n        }, _r)\n      ],\n      checkmark: [\n        classNames2.checkmark,\n        (_s = {\n          opacity: checked && !indeterminate ? \"1\" : \"0\",\n          color: checkmarkFontColor\n        }, _s[HighContrastSelector] = __assign$1({ color: disabled ? \"GrayText\" : \"Window\" }, getHighContrastNoAdjustStyle()), _s)\n      ],\n      text: [\n        classNames2.text,\n        (_t = {\n          color: disabled ? checkboxTextColorDisabled : checkboxTextColor,\n          fontSize: fonts.medium.fontSize,\n          lineHeight: \"20px\"\n        }, _t[HighContrastSelector] = __assign$1({ color: disabled ? \"GrayText\" : \"WindowText\" }, getHighContrastNoAdjustStyle()), _t),\n        !reversed ? {\n          marginLeft: 4\n        } : {\n          marginRight: 4\n        }\n      ]\n    };\n  };\n  var Checkbox = styled(CheckboxBase, getStyles$g, void 0, { scope: \"Checkbox\" });\n  var _a$2, _b$2;\n  var ComboBoxHeight = 32;\n  var ComboBoxLineHeight = 30;\n  var ComboBoxCaretDownWidth = 32;\n  var ComboBoxOptionHeight = 36;\n  var getDisabledStyles = memoizeFunction(function(theme) {\n    var _a2;\n    var semanticColors = theme.semanticColors;\n    return {\n      backgroundColor: semanticColors.disabledBackground,\n      color: semanticColors.disabledText,\n      cursor: \"default\",\n      selectors: (_a2 = {\n        \":after\": {\n          borderColor: semanticColors.disabledBackground\n        }\n      }, _a2[HighContrastSelector] = {\n        color: \"GrayText\",\n        selectors: {\n          \":after\": {\n            borderColor: \"GrayText\"\n          }\n        }\n      }, _a2)\n    };\n  });\n  var listOptionHighContrastStyles = {\n    selectors: (_a$2 = {}, _a$2[HighContrastSelector] = __assign$1({ backgroundColor: \"Highlight\", borderColor: \"Highlight\", color: \"HighlightText\" }, getHighContrastNoAdjustStyle()), _a$2)\n  };\n  var inputHighContrastStyles = {\n    selectors: (_b$2 = {}, _b$2[HighContrastSelector] = __assign$1({ color: \"WindowText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _b$2)\n  };\n  var getOptionStyles = memoizeFunction(function(theme, customStylesForAllOptions, customOptionStylesForCurrentOption, isPending, isHidden, isSelected) {\n    var _a2;\n    var palette = theme.palette, semanticColors = theme.semanticColors;\n    var option = {\n      textHoveredColor: semanticColors.menuItemTextHovered,\n      textSelectedColor: palette.neutralDark,\n      textDisabledColor: semanticColors.disabledText,\n      backgroundHoveredColor: semanticColors.menuItemBackgroundHovered,\n      backgroundPressedColor: semanticColors.menuItemBackgroundPressed\n    };\n    var optionStyles = {\n      root: [\n        theme.fonts.medium,\n        {\n          backgroundColor: isPending ? option.backgroundHoveredColor : \"transparent\",\n          boxSizing: \"border-box\",\n          cursor: \"pointer\",\n          display: isHidden ? \"none\" : \"block\",\n          width: \"100%\",\n          height: \"auto\",\n          minHeight: ComboBoxOptionHeight,\n          lineHeight: \"20px\",\n          padding: \"0 8px\",\n          position: \"relative\",\n          borderWidth: \"1px\",\n          borderStyle: \"solid\",\n          borderColor: \"transparent\",\n          borderRadius: 0,\n          wordWrap: \"break-word\",\n          overflowWrap: \"break-word\",\n          textAlign: \"left\",\n          selectors: __assign$1(__assign$1((_a2 = {}, _a2[HighContrastSelector] = {\n            border: \"none\",\n            borderColor: \"Background\"\n          }, _a2), !isHidden && {\n            \"&.ms-Checkbox\": {\n              display: \"flex\",\n              alignItems: \"center\"\n            }\n          }), { \"&.ms-Button--command:hover:active\": {\n            backgroundColor: option.backgroundPressedColor\n          }, \".ms-Checkbox-label\": {\n            width: \"100%\"\n          } })\n        },\n        isSelected ? [\n          {\n            backgroundColor: \"transparent\",\n            color: option.textSelectedColor,\n            selectors: {\n              \":hover\": [\n                {\n                  backgroundColor: option.backgroundHoveredColor\n                },\n                listOptionHighContrastStyles\n              ]\n            }\n          },\n          getFocusStyle(theme, { inset: -1, isFocusedOnly: false }),\n          listOptionHighContrastStyles\n        ] : []\n      ],\n      rootHovered: {\n        backgroundColor: option.backgroundHoveredColor,\n        color: option.textHoveredColor\n      },\n      rootFocused: {\n        backgroundColor: option.backgroundHoveredColor\n      },\n      rootDisabled: {\n        color: option.textDisabledColor,\n        cursor: \"default\"\n      },\n      optionText: {\n        overflow: \"hidden\",\n        whiteSpace: \"nowrap\",\n        textOverflow: \"ellipsis\",\n        minWidth: \"0px\",\n        maxWidth: \"100%\",\n        wordWrap: \"break-word\",\n        overflowWrap: \"break-word\",\n        display: \"inline-block\"\n      },\n      optionTextWrapper: {\n        maxWidth: \"100%\",\n        display: \"flex\",\n        alignItems: \"center\"\n      }\n    };\n    return concatStyleSets(optionStyles, customStylesForAllOptions, customOptionStylesForCurrentOption);\n  });\n  var getCaretDownButtonStyles = memoizeFunction(function(theme, customStyles) {\n    var _a2, _b2;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts;\n    var caret = {\n      buttonTextColor: semanticColors.bodySubtext,\n      buttonTextHoveredCheckedColor: semanticColors.buttonTextChecked,\n      buttonBackgroundHoveredColor: semanticColors.listItemBackgroundHovered,\n      buttonBackgroundCheckedColor: semanticColors.listItemBackgroundChecked,\n      buttonBackgroundCheckedHoveredColor: semanticColors.listItemBackgroundCheckedHovered\n    };\n    var buttonHighContrastStyles = {\n      selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ backgroundColor: \"Highlight\", borderColor: \"Highlight\", color: \"HighlightText\" }, getHighContrastNoAdjustStyle()), _a2)\n    };\n    var styles = {\n      root: {\n        color: caret.buttonTextColor,\n        fontSize: fonts.small.fontSize,\n        position: \"absolute\",\n        top: 0,\n        height: \"100%\",\n        lineHeight: ComboBoxLineHeight,\n        width: ComboBoxCaretDownWidth,\n        textAlign: \"center\",\n        cursor: \"default\",\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = __assign$1({ backgroundColor: \"ButtonFace\", borderColor: \"ButtonText\", color: \"ButtonText\" }, getHighContrastNoAdjustStyle()), _b2)\n      },\n      icon: {\n        fontSize: fonts.small.fontSize\n      },\n      rootHovered: [\n        {\n          backgroundColor: caret.buttonBackgroundHoveredColor,\n          color: caret.buttonTextHoveredCheckedColor,\n          cursor: \"pointer\"\n        },\n        buttonHighContrastStyles\n      ],\n      rootPressed: [\n        {\n          backgroundColor: caret.buttonBackgroundCheckedColor,\n          color: caret.buttonTextHoveredCheckedColor\n        },\n        buttonHighContrastStyles\n      ],\n      rootChecked: [\n        {\n          backgroundColor: caret.buttonBackgroundCheckedColor,\n          color: caret.buttonTextHoveredCheckedColor\n        },\n        buttonHighContrastStyles\n      ],\n      rootCheckedHovered: [\n        {\n          backgroundColor: caret.buttonBackgroundCheckedHoveredColor,\n          color: caret.buttonTextHoveredCheckedColor\n        },\n        buttonHighContrastStyles\n      ],\n      rootDisabled: [\n        getDisabledStyles(theme),\n        {\n          position: \"absolute\"\n        }\n      ]\n    };\n    return concatStyleSets(styles, customStyles);\n  });\n  var getStyles$f = memoizeFunction(function(theme, customStyles, comboBoxOptionWidth) {\n    var _a2, _b2, _c2, _d2, _e2, _f;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, effects = theme.effects;\n    var root = {\n      textColor: semanticColors.inputText,\n      borderColor: semanticColors.inputBorder,\n      borderHoveredColor: semanticColors.inputBorderHovered,\n      borderPressedColor: semanticColors.inputFocusBorderAlt,\n      borderFocusedColor: semanticColors.inputFocusBorderAlt,\n      backgroundColor: semanticColors.inputBackground,\n      erroredColor: semanticColors.errorText\n    };\n    var option = {\n      headerTextColor: semanticColors.menuHeader,\n      dividerBorderColor: semanticColors.bodyDivider\n    };\n    var placeholderHighContrastStyles = {\n      selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _a2)\n    };\n    var placeholderStyles = [\n      {\n        color: semanticColors.inputPlaceholderText\n      },\n      placeholderHighContrastStyles\n    ];\n    var placeholderStylesHovered = [\n      {\n        color: semanticColors.inputTextHovered\n      },\n      placeholderHighContrastStyles\n    ];\n    var disabledPlaceholderStyles = [\n      {\n        color: semanticColors.disabledText\n      },\n      placeholderHighContrastStyles\n    ];\n    var ComboBoxRootHighContrastFocused = __assign$1(__assign$1({ color: \"HighlightText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), { selectors: {\n      \":after\": {\n        borderColor: \"Highlight\"\n      }\n    } });\n    var focusBorderStyles = getInputFocusStyle(root.borderPressedColor, effects.roundedCorner2, \"border\", 0);\n    var styles = {\n      container: {},\n      label: {},\n      labelDisabled: {},\n      root: [\n        theme.fonts.medium,\n        {\n          boxShadow: \"none\",\n          marginLeft: \"0\",\n          paddingRight: ComboBoxCaretDownWidth,\n          paddingLeft: 9,\n          color: root.textColor,\n          position: \"relative\",\n          outline: \"0\",\n          userSelect: \"none\",\n          backgroundColor: root.backgroundColor,\n          cursor: \"text\",\n          display: \"block\",\n          height: ComboBoxHeight,\n          whiteSpace: \"nowrap\",\n          textOverflow: \"ellipsis\",\n          boxSizing: \"border-box\",\n          // Border-box matches Dropdown and TextField\n          selectors: {\n            \".ms-Label\": {\n              display: \"inline-block\",\n              marginBottom: \"8px\"\n            },\n            \"&.is-open\": {\n              selectors: (_b2 = {}, _b2[HighContrastSelector] = ComboBoxRootHighContrastFocused, _b2)\n            },\n            // setting border using pseudo-element here in order to\n            // prevent chevron button to overlap ComboBox border under certain resolutions\n            \":after\": {\n              pointerEvents: \"none\",\n              content: \"''\",\n              position: \"absolute\",\n              left: 0,\n              top: 0,\n              bottom: 0,\n              right: 0,\n              borderWidth: \"1px\",\n              borderStyle: \"solid\",\n              borderColor: root.borderColor,\n              borderRadius: effects.roundedCorner2\n            }\n          }\n        }\n      ],\n      rootHovered: {\n        selectors: (_c2 = {\n          \":after\": {\n            borderColor: root.borderHoveredColor\n          },\n          \".ms-ComboBox-Input\": [\n            {\n              color: semanticColors.inputTextHovered\n            },\n            getPlaceholderStyles(placeholderStylesHovered),\n            inputHighContrastStyles\n          ]\n        }, _c2[HighContrastSelector] = __assign$1(__assign$1({ color: \"HighlightText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), { selectors: {\n          \":after\": {\n            borderColor: \"Highlight\"\n          }\n        } }), _c2)\n      },\n      rootPressed: [\n        {\n          position: \"relative\",\n          selectors: (_d2 = {}, _d2[HighContrastSelector] = ComboBoxRootHighContrastFocused, _d2)\n        }\n      ],\n      rootFocused: [\n        {\n          selectors: (_e2 = {\n            \".ms-ComboBox-Input\": [\n              {\n                color: semanticColors.inputTextHovered\n              },\n              inputHighContrastStyles\n            ]\n          }, _e2[HighContrastSelector] = ComboBoxRootHighContrastFocused, _e2)\n        },\n        focusBorderStyles\n      ],\n      rootDisabled: getDisabledStyles(theme),\n      rootError: {\n        selectors: {\n          \":after\": {\n            borderColor: root.erroredColor\n          },\n          \":hover:after\": {\n            borderColor: semanticColors.inputBorderHovered\n          }\n        }\n      },\n      rootDisallowFreeForm: {},\n      input: [\n        getPlaceholderStyles(placeholderStyles),\n        {\n          backgroundColor: root.backgroundColor,\n          color: root.textColor,\n          boxSizing: \"border-box\",\n          width: \"100%\",\n          height: \"100%\",\n          borderStyle: \"none\",\n          outline: \"none\",\n          font: \"inherit\",\n          textOverflow: \"ellipsis\",\n          padding: \"0\",\n          selectors: {\n            \"::-ms-clear\": {\n              display: \"none\"\n            }\n          }\n        },\n        inputHighContrastStyles\n      ],\n      inputDisabled: [getDisabledStyles(theme), getPlaceholderStyles(disabledPlaceholderStyles)],\n      errorMessage: [\n        theme.fonts.small,\n        {\n          color: root.erroredColor,\n          marginTop: \"5px\"\n        }\n      ],\n      callout: {\n        boxShadow: effects.elevation8\n      },\n      optionsContainerWrapper: {\n        width: comboBoxOptionWidth\n      },\n      optionsContainer: {\n        display: \"block\"\n      },\n      screenReaderText: hiddenContentStyle,\n      header: [\n        fonts.medium,\n        {\n          fontWeight: FontWeights.semibold,\n          color: option.headerTextColor,\n          backgroundColor: \"none\",\n          borderStyle: \"none\",\n          height: ComboBoxOptionHeight,\n          lineHeight: ComboBoxOptionHeight,\n          cursor: \"default\",\n          padding: \"0 8px\",\n          userSelect: \"none\",\n          textAlign: \"left\",\n          selectors: (_f = {}, _f[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _f)\n        }\n      ],\n      divider: {\n        height: 1,\n        backgroundColor: option.dividerBorderColor\n      }\n    };\n    return concatStyleSets(styles, customStyles);\n  });\n  var getClassNames$g = memoizeFunction(function(styles, className2, isOpen, disabled, required2, focused, allowFreeForm, hasErrorMessage) {\n    return {\n      container: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-container\", className2, styles.container),\n      label: mergeStyles(styles.__shadowConfig__, styles.label, disabled && styles.labelDisabled),\n      root: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox\", hasErrorMessage ? styles.rootError : isOpen && \"is-open\", required2 && \"is-required\", styles.root, !allowFreeForm && styles.rootDisallowFreeForm, hasErrorMessage && !focused ? styles.rootError : !disabled && focused && styles.rootFocused, !disabled && {\n        selectors: {\n          \":hover\": hasErrorMessage ? styles.rootError : !isOpen && !focused && styles.rootHovered,\n          \":active\": hasErrorMessage ? styles.rootError : styles.rootPressed,\n          \":focus\": hasErrorMessage ? styles.rootError : styles.rootFocused\n        }\n      }, disabled && [\"is-disabled\", styles.rootDisabled]),\n      input: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-Input\", styles.input, disabled && styles.inputDisabled),\n      errorMessage: mergeStyles(styles.__shadowConfig__, styles.errorMessage),\n      callout: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-callout\", styles.callout),\n      optionsContainerWrapper: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-optionsContainerWrapper\", styles.optionsContainerWrapper),\n      optionsContainer: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-optionsContainer\", styles.optionsContainer),\n      header: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-header\", styles.header),\n      divider: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-divider\", styles.divider),\n      screenReaderText: mergeStyles(styles.__shadowConfig__, styles.screenReaderText)\n    };\n  });\n  var getComboBoxOptionClassNames = memoizeFunction(function(styles) {\n    return {\n      optionText: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-optionText\", styles.optionText),\n      root: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-option\", styles.root, {\n        selectors: {\n          \":hover\": styles.rootHovered,\n          \":focus\": styles.rootFocused,\n          \":active\": styles.rootPressed\n        }\n      }),\n      optionTextWrapper: mergeStyles(styles.__shadowConfig__, styles.optionTextWrapper)\n    };\n  });\n  function getAllSelectedOptions(options2, selectedIndices) {\n    var selectedOptions = [];\n    for (var _i = 0, selectedIndices_1 = selectedIndices; _i < selectedIndices_1.length; _i++) {\n      var index2 = selectedIndices_1[_i];\n      var option = options2[index2];\n      if (option) {\n        selectedOptions.push(option);\n      }\n    }\n    return selectedOptions;\n  }\n  var SelectableOptionMenuItemType;\n  (function(SelectableOptionMenuItemType2) {\n    SelectableOptionMenuItemType2[SelectableOptionMenuItemType2[\"Normal\"] = 0] = \"Normal\";\n    SelectableOptionMenuItemType2[SelectableOptionMenuItemType2[\"Divider\"] = 1] = \"Divider\";\n    SelectableOptionMenuItemType2[SelectableOptionMenuItemType2[\"Header\"] = 2] = \"Header\";\n    SelectableOptionMenuItemType2[SelectableOptionMenuItemType2[\"SelectAll\"] = 3] = \"SelectAll\";\n  })(SelectableOptionMenuItemType || (SelectableOptionMenuItemType = {}));\n  var SearchDirection;\n  (function(SearchDirection2) {\n    SearchDirection2[SearchDirection2[\"backward\"] = -1] = \"backward\";\n    SearchDirection2[SearchDirection2[\"none\"] = 0] = \"none\";\n    SearchDirection2[SearchDirection2[\"forward\"] = 1] = \"forward\";\n  })(SearchDirection || (SearchDirection = {}));\n  var HoverStatus;\n  (function(HoverStatus2) {\n    HoverStatus2[HoverStatus2[\"clearAll\"] = -2] = \"clearAll\";\n    HoverStatus2[HoverStatus2[\"default\"] = -1] = \"default\";\n  })(HoverStatus || (HoverStatus = {}));\n  var ScrollIdleDelay = 250;\n  var TouchIdleDelay = 500;\n  var ReadOnlyPendingAutoCompleteTimeout = 1e3;\n  var ComboBoxOptionWrapper = React__namespace.memo(function(_a2) {\n    var render = _a2.render;\n    return render();\n  }, function(_a2, _b2) {\n    _a2.render;\n    var oldProps = __rest(_a2, [\"render\"]);\n    _b2.render;\n    var newProps = __rest(_b2, [\"render\"]);\n    return shallowCompare(oldProps, newProps);\n  });\n  var COMPONENT_NAME$4 = \"ComboBox\";\n  var DEFAULT_PROPS$2 = {\n    options: [],\n    allowFreeform: false,\n    allowParentArrowNavigation: false,\n    autoComplete: \"on\",\n    buttonIconProps: { iconName: \"ChevronDown\" }\n  };\n  function useOptionsState(_a2) {\n    var options2 = _a2.options, defaultSelectedKey = _a2.defaultSelectedKey, selectedKey = _a2.selectedKey;\n    var _b2 = React__namespace.useState(function() {\n      return getSelectedIndices(options2, buildDefaultSelectedKeys(defaultSelectedKey, selectedKey));\n    }), selectedIndices = _b2[0], setSelectedIndices = _b2[1];\n    var _c2 = React__namespace.useState(options2), currentOptions = _c2[0], setCurrentOptions = _c2[1];\n    var _d2 = React__namespace.useState(), suggestedDisplayValue = _d2[0], setSuggestedDisplayValue = _d2[1];\n    React__namespace.useEffect(function() {\n      if (selectedKey !== void 0) {\n        var selectedKeys = buildSelectedKeys(selectedKey);\n        var indices = getSelectedIndices(options2, selectedKeys);\n        setSelectedIndices(indices);\n      }\n      setCurrentOptions(options2);\n    }, [options2, selectedKey]);\n    React__namespace.useEffect(function() {\n      if (selectedKey === null) {\n        setSuggestedDisplayValue(void 0);\n      }\n    }, [selectedKey]);\n    return [\n      selectedIndices,\n      setSelectedIndices,\n      currentOptions,\n      setCurrentOptions,\n      suggestedDisplayValue,\n      setSuggestedDisplayValue\n    ];\n  }\n  var ComboBox = React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var _a2 = getPropsWithDefaults(DEFAULT_PROPS$2, propsWithoutDefaults);\n    _a2.ref;\n    var props = __rest(_a2, [\"ref\"]);\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRef = useMergedRefs(rootRef, forwardedRef);\n    var _b2 = useOptionsState(props), selectedIndices = _b2[0], setSelectedIndices = _b2[1], currentOptions = _b2[2], setCurrentOptions = _b2[3], suggestedDisplayValue = _b2[4], setSuggestedDisplayValue = _b2[5];\n    return React__namespace.createElement(ComboBoxInternal, __assign$1({}, props, { hoisted: {\n      mergedRootRef,\n      rootRef,\n      selectedIndices,\n      setSelectedIndices,\n      currentOptions,\n      setCurrentOptions,\n      suggestedDisplayValue,\n      setSuggestedDisplayValue\n    } }));\n  });\n  ComboBox.displayName = COMPONENT_NAME$4;\n  function findFirstDescendant(element2, match2) {\n    var children2 = getChildren(element2);\n    for (var index2 = 0; index2 < children2.length; index2++) {\n      var child = children2[index2];\n      if (match2(child)) {\n        return child;\n      }\n      var candidate = findFirstDescendant(child, match2);\n      if (candidate) {\n        return candidate;\n      }\n    }\n    return null;\n  }\n  var ComboBoxInternal = (\n    /** @class */\n    (function(_super) {\n      __extends(ComboBoxInternal2, _super);\n      function ComboBoxInternal2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._autofill = React__namespace.createRef();\n        _this._comboBoxWrapper = React__namespace.createRef();\n        _this._comboBoxMenu = React__namespace.createRef();\n        _this._selectedElement = React__namespace.createRef();\n        _this._overrideScrollDismiss = false;\n        _this.focus = function(shouldOpenOnFocus, useFocusAsync) {\n          if (_this.props.disabled) {\n            return;\n          }\n          if (_this._autofill.current) {\n            if (useFocusAsync) {\n              focusAsync(_this._autofill.current);\n            } else {\n              _this._autofill.current.focus();\n            }\n            if (shouldOpenOnFocus) {\n              _this.setState({\n                isOpen: true\n              });\n            }\n          }\n          if (!_this._hasFocus()) {\n            _this.setState({ focusState: \"focused\" });\n          }\n        };\n        _this.dismissMenu = function() {\n          var isOpen = _this.state.isOpen;\n          isOpen && _this.setState({ isOpen: false });\n        };\n        _this._onUpdateValueInAutofillWillReceiveProps = function() {\n          var comboBox = _this._autofill.current;\n          if (!comboBox) {\n            return null;\n          }\n          if (comboBox.value === null || comboBox.value === void 0) {\n            return null;\n          }\n          return normalizeToString(_this._currentVisibleValue);\n        };\n        _this._renderComboBoxWrapper = function(multiselectAccessibleText, errorMessageId) {\n          var _a2 = _this.props, label2 = _a2.label, disabled = _a2.disabled, ariaLabel2 = _a2.ariaLabel, _b2 = _a2.ariaDescribedBy, ariaDescribedBy = _b2 === void 0 ? _this.props[\"aria-describedby\"] : _b2, required2 = _a2.required, errorMessage = _a2.errorMessage, buttonIconProps = _a2.buttonIconProps, isButtonAriaHidden = _a2.isButtonAriaHidden, title = _a2.title, placeholderProp = _a2.placeholder, tabIndex = _a2.tabIndex, autofill = _a2.autofill, iconButtonProps = _a2.iconButtonProps, suggestedDisplayValue = _a2.hoisted.suggestedDisplayValue;\n          var _c2 = _this.state, ariaActiveDescendantValue = _c2.ariaActiveDescendantValue, isOpen = _c2.isOpen;\n          var placeholder = _this._hasFocus() && _this.props.multiSelect && multiselectAccessibleText ? multiselectAccessibleText : placeholderProp;\n          var labelledBy = [_this.props[\"aria-labelledby\"], label2 && _this._id + \"-label\"].join(\" \").trim();\n          var labelProps = {\n            \"aria-labelledby\": labelledBy ? labelledBy : void 0,\n            \"aria-label\": ariaLabel2 && !label2 ? ariaLabel2 : void 0\n          };\n          var hasErrorMessage = errorMessage && errorMessage.length > 0 ? true : false;\n          return React__namespace.createElement(\n            \"div\",\n            { \"data-ktp-target\": true, ref: _this._comboBoxWrapper, id: _this._id + \"wrapper\", className: _this._classNames.root, \"aria-owns\": isOpen ? _this._id + \"-list\" : void 0 },\n            React__namespace.createElement(Autofill, __assign$1({ \"data-ktp-execute-target\": true, \"data-is-interactable\": !disabled, componentRef: _this._autofill, id: _this._id + \"-input\", className: _this._classNames.input, type: \"text\", onFocus: _this._onFocus, onBlur: _this._onBlur, onKeyDown: _this._onInputKeyDown, onKeyUp: _this._onInputKeyUp, onClick: _this._onAutofillClick, onTouchStart: _this._onTouchStart, onInputValueChange: _this._onInputChange, \"aria-expanded\": isOpen, \"aria-autocomplete\": _this._getAriaAutoCompleteValue(), role: \"combobox\", readOnly: disabled }, labelProps, {\n              \"aria-describedby\": errorMessage !== void 0 ? mergeAriaAttributeValues(ariaDescribedBy, errorMessageId) : ariaDescribedBy,\n              \"aria-activedescendant\": ariaActiveDescendantValue,\n              \"aria-required\": required2,\n              \"aria-disabled\": disabled,\n              \"aria-invalid\": hasErrorMessage,\n              \"aria-controls\": isOpen ? _this._id + \"-list\" : void 0,\n              spellCheck: false,\n              defaultVisibleValue: _this._currentVisibleValue,\n              suggestedDisplayValue,\n              // eslint-disable-next-line @typescript-eslint/no-deprecated\n              updateValueInWillReceiveProps: _this._onUpdateValueInAutofillWillReceiveProps,\n              shouldSelectFullInputValueInComponentDidUpdate: _this._onShouldSelectFullInputValueInAutofillComponentDidUpdate,\n              title,\n              preventValueSelection: !_this._hasFocus(),\n              placeholder,\n              tabIndex: disabled ? -1 : tabIndex\n            }, autofill)),\n            React__namespace.createElement(IconButton, __assign$1({ className: \"ms-ComboBox-CaretDown-button\", styles: _this._getCaretButtonStyles(), role: isButtonAriaHidden ? \"presentation\" : void 0, \"aria-hidden\": isButtonAriaHidden }, !isButtonAriaHidden ? labelProps : void 0, { \"data-is-focusable\": false, tabIndex: -1, onClick: _this._onComboBoxClick, onBlur: _this._onBlur, iconProps: buttonIconProps, disabled, checked: isOpen }, iconButtonProps))\n          );\n        };\n        _this._onShouldSelectFullInputValueInAutofillComponentDidUpdate = function() {\n          return _this._currentVisibleValue === _this.props.hoisted.suggestedDisplayValue;\n        };\n        _this._getVisibleValue = function() {\n          var _a2 = _this.props, text2 = _a2.text, allowFreeform = _a2.allowFreeform, allowFreeInput = _a2.allowFreeInput, autoComplete = _a2.autoComplete, _b2 = _a2.hoisted, suggestedDisplayValue = _b2.suggestedDisplayValue, selectedIndices = _b2.selectedIndices, currentOptions = _b2.currentOptions;\n          var _c2 = _this.state, currentPendingValueValidIndex = _c2.currentPendingValueValidIndex, currentPendingValue = _c2.currentPendingValue, isOpen = _c2.isOpen;\n          var currentPendingIndexValid = indexWithinBounds(currentOptions, currentPendingValueValidIndex);\n          if (!(isOpen && currentPendingIndexValid) && (text2 || text2 === \"\") && (currentPendingValue === null || currentPendingValue === void 0)) {\n            return text2;\n          }\n          if (_this.props.multiSelect) {\n            if (_this._hasFocus()) {\n              var index2 = -1;\n              if (autoComplete === \"on\" && currentPendingIndexValid) {\n                index2 = currentPendingValueValidIndex;\n              }\n              return _this._getPendingString(currentPendingValue, currentOptions, index2);\n            } else {\n              return _this._getMultiselectDisplayString(selectedIndices, currentOptions, suggestedDisplayValue);\n            }\n          } else {\n            var index2 = _this._getFirstSelectedIndex();\n            if (allowFreeform || allowFreeInput) {\n              if (autoComplete === \"on\" && currentPendingIndexValid) {\n                index2 = currentPendingValueValidIndex;\n              }\n              return _this._getPendingString(currentPendingValue, currentOptions, index2);\n            } else {\n              if (currentPendingIndexValid && autoComplete === \"on\") {\n                index2 = currentPendingValueValidIndex;\n                return normalizeToString(currentPendingValue);\n              } else if (!_this.state.isOpen && currentPendingValue) {\n                return indexWithinBounds(currentOptions, index2) ? currentPendingValue : normalizeToString(suggestedDisplayValue);\n              } else {\n                return indexWithinBounds(currentOptions, index2) ? getPreviewText(currentOptions[index2]) : normalizeToString(suggestedDisplayValue);\n              }\n            }\n          }\n        };\n        _this._onInputChange = function(updatedValue) {\n          if (_this.props.disabled) {\n            _this._handleInputWhenDisabled(\n              null\n              /* event */\n            );\n            return;\n          }\n          if (_this.props.onInputValueChange) {\n            _this.props.onInputValueChange(updatedValue);\n          }\n          _this.props.allowFreeform || _this.props.allowFreeInput ? _this._processInputChangeWithFreeform(updatedValue) : _this._processInputChangeWithoutFreeform(updatedValue);\n        };\n        _this._onFocus = function() {\n          var _a2, _b2;\n          (_b2 = (_a2 = _this._autofill.current) === null || _a2 === void 0 ? void 0 : _a2.inputElement) === null || _b2 === void 0 ? void 0 : _b2.select();\n          if (!_this._hasFocus()) {\n            _this.setState({ focusState: \"focusing\" });\n          }\n        };\n        _this._onResolveOptions = function() {\n          if (_this.props.onResolveOptions) {\n            var newOptions_1 = _this.props.onResolveOptions(__spreadArray([], _this.props.hoisted.currentOptions, true));\n            if (Array.isArray(newOptions_1)) {\n              _this.props.hoisted.setCurrentOptions(newOptions_1);\n            } else if (newOptions_1 && newOptions_1.then) {\n              _this._currentPromise = newOptions_1;\n              newOptions_1.then(function(newOptionsFromPromise) {\n                if (newOptions_1 === _this._currentPromise) {\n                  _this.props.hoisted.setCurrentOptions(newOptionsFromPromise);\n                }\n              });\n            }\n          }\n        };\n        _this._onBlur = function(event2) {\n          var _a2, _b2;\n          var doc = getDocumentEx(_this.context);\n          var relatedTarget = event2.relatedTarget;\n          if (event2.relatedTarget === null) {\n            relatedTarget = doc === null || doc === void 0 ? void 0 : doc.activeElement;\n          }\n          if (relatedTarget) {\n            var isBlurFromComboBoxTitle = (_a2 = _this.props.hoisted.rootRef.current) === null || _a2 === void 0 ? void 0 : _a2.contains(relatedTarget);\n            var isBlurFromComboBoxMenu = (_b2 = _this._comboBoxMenu.current) === null || _b2 === void 0 ? void 0 : _b2.contains(relatedTarget);\n            var isBlurFromComboBoxMenuAncestor = _this._comboBoxMenu.current && findElementRecursive(_this._comboBoxMenu.current, function(element2) {\n              return element2 === relatedTarget;\n            }, doc);\n            if (isBlurFromComboBoxTitle || isBlurFromComboBoxMenu || isBlurFromComboBoxMenuAncestor) {\n              if (isBlurFromComboBoxMenuAncestor && _this._hasFocus() && (!_this.props.multiSelect || _this.props.allowFreeform)) {\n                _this._submitPendingValue(event2);\n              }\n              event2.preventDefault();\n              event2.stopPropagation();\n              return;\n            }\n          }\n          if (_this._hasFocus()) {\n            _this.setState({ focusState: \"none\" });\n            if (!_this.props.multiSelect || _this.props.allowFreeform) {\n              _this._submitPendingValue(event2);\n            }\n          }\n        };\n        _this._onRenderContainer = function(props2, defaultRender) {\n          var onRenderList = props2.onRenderList, calloutProps = props2.calloutProps, dropdownWidth2 = props2.dropdownWidth, dropdownMaxWidth = props2.dropdownMaxWidth, _a2 = props2.onRenderUpperContent, onRenderUpperContent = _a2 === void 0 ? _this._onRenderUpperContent : _a2, _b2 = props2.onRenderLowerContent, onRenderLowerContent = _b2 === void 0 ? _this._onRenderLowerContent : _b2, useComboBoxAsMenuWidth = props2.useComboBoxAsMenuWidth, persistMenu = props2.persistMenu, _c2 = props2.shouldRestoreFocus, shouldRestoreFocus = _c2 === void 0 ? true : _c2;\n          var isOpen = _this.state.isOpen;\n          var id2 = _this._id;\n          var comboBoxMenuWidth = useComboBoxAsMenuWidth && _this._comboBoxWrapper.current ? _this._comboBoxWrapper.current.clientWidth + 2 : void 0;\n          return React__namespace.createElement(\n            Callout,\n            __assign$1({ isBeakVisible: false, gapSpace: 0, doNotLayer: false, directionalHint: DirectionalHint.bottomLeftEdge, directionalHintFixed: false }, calloutProps, {\n              onLayerMounted: _this._onLayerMounted,\n              className: css(_this._classNames.callout, calloutProps === null || calloutProps === void 0 ? void 0 : calloutProps.className),\n              target: _this._comboBoxWrapper.current,\n              onDismiss: _this._onDismiss,\n              onMouseDown: _this._onCalloutMouseDown,\n              onScroll: _this._onScroll,\n              setInitialFocus: false,\n              calloutWidth: useComboBoxAsMenuWidth && _this._comboBoxWrapper.current ? comboBoxMenuWidth && comboBoxMenuWidth : dropdownWidth2,\n              calloutMaxWidth: dropdownMaxWidth ? dropdownMaxWidth : comboBoxMenuWidth,\n              hidden: persistMenu ? !isOpen : void 0,\n              // eslint-disable-next-line @typescript-eslint/no-deprecated\n              shouldRestoreFocus,\n              // eslint-disable-next-line react/jsx-no-bind\n              preventDismissOnEvent: function(ev) {\n                return _this._preventDismissOnScrollOrResize(ev);\n              }\n            }),\n            onRenderUpperContent(_this.props, _this._onRenderUpperContent),\n            React__namespace.createElement(\"div\", { className: _this._classNames.optionsContainerWrapper, ref: _this._comboBoxMenu }, onRenderList === null || onRenderList === void 0 ? void 0 : onRenderList(__assign$1(__assign$1({}, props2), { id: id2 }), _this._onRenderList)),\n            onRenderLowerContent(_this.props, _this._onRenderLowerContent)\n          );\n        };\n        _this._onLayerMounted = function() {\n          _this._onCalloutLayerMounted();\n          _this._async.setTimeout(function() {\n            _this._scrollIntoView();\n          }, 0);\n          if (_this.props.calloutProps && _this.props.calloutProps.onLayerMounted) {\n            _this.props.calloutProps.onLayerMounted();\n          }\n        };\n        _this._onRenderLabel = function(onRenderLabelProps) {\n          var _a2 = onRenderLabelProps.props, label2 = _a2.label, disabled = _a2.disabled, required2 = _a2.required;\n          if (label2) {\n            return React__namespace.createElement(\n              Label$2,\n              { id: _this._id + \"-label\", disabled, required: required2, className: _this._classNames.label },\n              label2,\n              onRenderLabelProps.multiselectAccessibleText && React__namespace.createElement(\"span\", { className: _this._classNames.screenReaderText }, onRenderLabelProps.multiselectAccessibleText)\n            );\n          }\n          return null;\n        };\n        _this._onRenderList = function(props2) {\n          var _a2 = props2.onRenderItem, onRenderItem = _a2 === void 0 ? _this._onRenderItem : _a2, label2 = props2.label, ariaLabel2 = props2.ariaLabel, multiSelect = props2.multiSelect;\n          var queue = { items: [] };\n          var renderedList = [];\n          var emptyQueue = function() {\n            var newGroup = queue.id ? [\n              React__namespace.createElement(\"div\", { role: \"group\", key: queue.id, \"aria-labelledby\": queue.id }, queue.items)\n            ] : queue.items;\n            renderedList = __spreadArray(__spreadArray([], renderedList, true), newGroup, true);\n            queue = { items: [] };\n          };\n          var placeRenderedOptionIntoQueue = function(item, index2) {\n            switch (item.itemType) {\n              case SelectableOptionMenuItemType.Header:\n                queue.items.length > 0 && emptyQueue();\n                var id_1 = _this._id + item.key;\n                queue.items.push(onRenderItem(__assign$1(__assign$1({ id: id_1 }, item), { index: index2 }), _this._onRenderItem));\n                queue.id = id_1;\n                break;\n              case SelectableOptionMenuItemType.Divider:\n                index2 > 0 && queue.items.push(onRenderItem(__assign$1(__assign$1({}, item), { index: index2 }), _this._onRenderItem));\n                queue.items.length > 0 && emptyQueue();\n                break;\n              default:\n                queue.items.push(onRenderItem(__assign$1(__assign$1({}, item), { index: index2 }), _this._onRenderItem));\n            }\n          };\n          props2.options.forEach(function(item, index2) {\n            placeRenderedOptionIntoQueue(item, index2);\n          });\n          queue.items.length > 0 && emptyQueue();\n          var id2 = _this._id;\n          return React__namespace.createElement(\"div\", { id: id2 + \"-list\", className: _this._classNames.optionsContainer, \"aria-labelledby\": label2 && id2 + \"-label\", \"aria-label\": ariaLabel2 && !label2 ? ariaLabel2 : void 0, \"aria-multiselectable\": multiSelect ? \"true\" : void 0, role: \"listbox\" }, renderedList);\n        };\n        _this._onRenderItem = function(item) {\n          switch (item.itemType) {\n            case SelectableOptionMenuItemType.Divider:\n              return _this._renderSeparator(item);\n            case SelectableOptionMenuItemType.Header:\n              return _this._renderHeader(item);\n            default:\n              return _this._renderOption(item);\n          }\n        };\n        _this._onRenderLowerContent = function() {\n          return null;\n        };\n        _this._onRenderUpperContent = function() {\n          return null;\n        };\n        _this._renderOption = function(item) {\n          var _a2;\n          var _b2 = _this.props.onRenderOption, onRenderOption = _b2 === void 0 ? _this._onRenderOptionContent : _b2;\n          var id2 = (_a2 = item.id) !== null && _a2 !== void 0 ? _a2 : _this._id + \"-list\" + item.index;\n          var isSelected = _this._isOptionSelected(item.index);\n          var isChecked = _this._isOptionChecked(item.index);\n          var isIndeterminate = _this._isOptionIndeterminate(item.index);\n          var optionStyles = _this._getCurrentOptionStyles(item);\n          var optionClassNames = getComboBoxOptionClassNames(optionStyles);\n          var title = item.title;\n          var getOptionComponent = function() {\n            return !_this.props.multiSelect ? React__namespace.createElement(CommandButton, {\n              id: id2,\n              key: item.key,\n              \"data-index\": item.index,\n              styles: optionStyles,\n              checked: isSelected,\n              className: \"ms-ComboBox-option\",\n              onClick: _this._onItemClick(item),\n              // eslint-disable-next-line react/jsx-no-bind\n              onMouseEnter: _this._onOptionMouseEnter.bind(_this, item.index),\n              // eslint-disable-next-line react/jsx-no-bind\n              onMouseMove: _this._onOptionMouseMove.bind(_this, item.index),\n              onMouseLeave: _this._onOptionMouseLeave,\n              role: \"option\",\n              \"aria-selected\": isSelected ? \"true\" : \"false\",\n              ariaLabel: item.ariaLabel,\n              disabled: item.disabled,\n              title\n            }, React__namespace.createElement(\"span\", { className: optionClassNames.optionTextWrapper, ref: isSelected ? _this._selectedElement : void 0 }, onRenderOption(item, _this._onRenderOptionContent))) : React__namespace.createElement(Checkbox, {\n              id: id2,\n              ariaLabel: item.ariaLabel,\n              ariaLabelledBy: item.ariaLabel ? void 0 : id2 + \"-label\",\n              key: item.key,\n              styles: optionStyles,\n              className: \"ms-ComboBox-option\",\n              onChange: _this._onItemClick(item),\n              label: item.text,\n              checked: isChecked,\n              indeterminate: isIndeterminate,\n              title,\n              disabled: item.disabled,\n              // eslint-disable-next-line react/jsx-no-bind\n              onRenderLabel: _this._renderCheckboxLabel.bind(_this, __assign$1(__assign$1({}, item), { id: id2 + \"-label\" })),\n              inputProps: __assign$1({\n                // aria-selected should only be applied to checked items, not hovered items\n                \"aria-selected\": isChecked ? \"true\" : \"false\",\n                role: \"option\"\n              }, {\n                \"data-index\": item.index,\n                \"data-is-focusable\": true\n              })\n            });\n          };\n          return React__namespace.createElement(ComboBoxOptionWrapper, {\n            key: item.key,\n            index: item.index,\n            disabled: item.disabled,\n            isSelected,\n            isChecked,\n            isIndeterminate,\n            text: item.text,\n            // eslint-disable-next-line react/jsx-no-bind\n            render: getOptionComponent,\n            data: item.data\n          });\n        };\n        _this._onCalloutMouseDown = function(ev) {\n          ev.preventDefault();\n        };\n        _this._onScroll = function() {\n          var _a2;\n          if (!_this._isScrollIdle && _this._scrollIdleTimeoutId !== void 0) {\n            _this._async.clearTimeout(_this._scrollIdleTimeoutId);\n            _this._scrollIdleTimeoutId = void 0;\n          } else {\n            _this._isScrollIdle = false;\n          }\n          if ((_a2 = _this.props.calloutProps) === null || _a2 === void 0 ? void 0 : _a2.onScroll) {\n            _this.props.calloutProps.onScroll();\n          }\n          _this._scrollIdleTimeoutId = _this._async.setTimeout(function() {\n            _this._isScrollIdle = true;\n          }, ScrollIdleDelay);\n        };\n        _this._onRenderOptionContent = function(item) {\n          var optionClassNames = getComboBoxOptionClassNames(_this._getCurrentOptionStyles(item));\n          return React__namespace.createElement(\"span\", { className: optionClassNames.optionText }, item.text);\n        };\n        _this._onRenderMultiselectOptionContent = function(item) {\n          var optionClassNames = getComboBoxOptionClassNames(_this._getCurrentOptionStyles(item));\n          return React__namespace.createElement(\"span\", { id: item.id, \"aria-hidden\": \"true\", className: optionClassNames.optionText }, item.text);\n        };\n        _this._onDismiss = function() {\n          var onMenuDismiss = _this.props.onMenuDismiss;\n          if (onMenuDismiss) {\n            onMenuDismiss();\n          }\n          if (_this.props.persistMenu) {\n            _this._onCalloutLayerMounted();\n          }\n          _this._setOpenStateAndFocusOnClose(\n            false,\n            false\n            /* focusInputAfterClose */\n          );\n          _this._resetSelectedIndex();\n        };\n        _this._onAfterClearPendingInfo = function() {\n          _this._processingClearPendingInfo = false;\n        };\n        _this._onInputKeyDown = function(ev) {\n          var _a2 = _this.props, disabled = _a2.disabled, allowFreeform = _a2.allowFreeform, allowFreeInput = _a2.allowFreeInput, allowParentArrowNavigation = _a2.allowParentArrowNavigation, autoComplete = _a2.autoComplete, currentOptions = _a2.hoisted.currentOptions;\n          var _b2 = _this.state, isOpen = _b2.isOpen, currentPendingValueValidIndexOnHover = _b2.currentPendingValueValidIndexOnHover;\n          _this._lastKeyDownWasAltOrMeta = isAltOrMeta(ev);\n          if (disabled) {\n            _this._handleInputWhenDisabled(ev);\n            return;\n          }\n          var index2 = _this._getPendingSelectedIndex(\n            false\n            /* includeCurrentPendingValue */\n          );\n          switch (ev.which) {\n            case KeyCodes.enter:\n              if (_this._autofill.current && _this._autofill.current.inputElement) {\n                _this._autofill.current.inputElement.select();\n              }\n              _this._submitPendingValue(ev);\n              if (_this.props.multiSelect && isOpen) {\n                _this.setState({\n                  currentPendingValueValidIndex: index2\n                });\n              } else {\n                if (isOpen || (!allowFreeform || _this.state.currentPendingValue === void 0 || _this.state.currentPendingValue === null || _this.state.currentPendingValue.length <= 0) && _this.state.currentPendingValueValidIndex < 0) {\n                  _this.setState({\n                    isOpen: !isOpen\n                  });\n                }\n              }\n              break;\n            case KeyCodes.tab:\n              if (!_this.props.multiSelect) {\n                _this._submitPendingValue(ev);\n              }\n              if (isOpen) {\n                _this._setOpenStateAndFocusOnClose(\n                  !isOpen,\n                  false\n                  /* focusInputAfterClose */\n                );\n              }\n              return;\n            case KeyCodes.escape:\n              _this._resetSelectedIndex();\n              if (isOpen) {\n                _this.setState({\n                  isOpen: false\n                });\n              } else {\n                return;\n              }\n              break;\n            case KeyCodes.up:\n              if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) {\n                index2 = _this.props.hoisted.currentOptions.length;\n              }\n              if (ev.altKey || ev.metaKey) {\n                if (isOpen) {\n                  _this._setOpenStateAndFocusOnClose(\n                    !isOpen,\n                    true\n                    /* focusInputAfterClose */\n                  );\n                  break;\n                }\n                return;\n              }\n              ev.preventDefault();\n              _this._setPendingInfoFromIndexAndDirection(index2, SearchDirection.backward);\n              break;\n            case KeyCodes.down:\n              if (ev.altKey || ev.metaKey) {\n                _this._setOpenStateAndFocusOnClose(\n                  true,\n                  true\n                  /* focusInputAfterClose */\n                );\n              } else {\n                if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) {\n                  index2 = -1;\n                }\n                ev.preventDefault();\n                _this._setPendingInfoFromIndexAndDirection(index2, SearchDirection.forward);\n              }\n              break;\n            case KeyCodes.home:\n            case KeyCodes.end:\n              if (allowFreeform || allowFreeInput) {\n                return;\n              }\n              index2 = -1;\n              var directionToSearch = SearchDirection.forward;\n              if (ev.which === KeyCodes.end) {\n                index2 = currentOptions.length;\n                directionToSearch = SearchDirection.backward;\n              }\n              _this._setPendingInfoFromIndexAndDirection(index2, directionToSearch);\n              break;\n            /* eslint-disable no-fallthrough */\n            case KeyCodes.space:\n              if (!allowFreeform && !allowFreeInput && autoComplete === \"off\") {\n                break;\n              }\n            default:\n              if (ev.which >= 112 && ev.which <= 123) {\n                return;\n              }\n              if (ev.keyCode === KeyCodes.alt || ev.key === \"Meta\") {\n                return;\n              }\n              if (allowParentArrowNavigation && (ev.keyCode === KeyCodes.left || ev.keyCode === KeyCodes.right)) {\n                return;\n              }\n              if (!allowFreeform && !allowFreeInput && autoComplete === \"on\") {\n                _this._onInputChange(ev.key);\n                break;\n              }\n              return;\n          }\n          ev.stopPropagation();\n          ev.preventDefault();\n        };\n        _this._onInputKeyUp = function(ev) {\n          var _a2 = _this.props, disabled = _a2.disabled, allowFreeform = _a2.allowFreeform, allowFreeInput = _a2.allowFreeInput, autoComplete = _a2.autoComplete;\n          var isOpen = _this.state.isOpen;\n          var keyPressIsAltOrMetaAlone = _this._lastKeyDownWasAltOrMeta && isAltOrMeta(ev);\n          _this._lastKeyDownWasAltOrMeta = false;\n          var shouldHandleKey = keyPressIsAltOrMetaAlone && !(isMac() || isIOS());\n          if (disabled) {\n            _this._handleInputWhenDisabled(ev);\n            return;\n          }\n          switch (ev.which) {\n            case KeyCodes.space:\n              if (!allowFreeform && !allowFreeInput && autoComplete === \"off\") {\n                _this._setOpenStateAndFocusOnClose(!isOpen, !!isOpen);\n              }\n              return;\n            default:\n              if (shouldHandleKey && isOpen) {\n                _this._setOpenStateAndFocusOnClose(\n                  !isOpen,\n                  true\n                  /* focusInputAfterClose */\n                );\n              } else {\n                if (_this.state.focusState === \"focusing\" && _this.props.openOnKeyboardFocus) {\n                  _this.setState({ isOpen: true });\n                }\n                if (_this.state.focusState !== \"focused\") {\n                  _this.setState({ focusState: \"focused\" });\n                }\n              }\n              return;\n          }\n        };\n        _this._onOptionMouseLeave = function() {\n          if (_this._shouldIgnoreMouseEvent()) {\n            return;\n          }\n          if (_this.props.persistMenu && !_this.state.isOpen) {\n            return;\n          }\n          _this.setState({\n            currentPendingValueValidIndexOnHover: HoverStatus.clearAll\n          });\n        };\n        _this._onComboBoxClick = function() {\n          var disabled = _this.props.disabled;\n          var isOpen = _this.state.isOpen;\n          if (!disabled) {\n            _this._setOpenStateAndFocusOnClose(\n              !isOpen,\n              false\n              /* focusInputAfterClose */\n            );\n            _this.setState({ focusState: \"focused\" });\n          }\n        };\n        _this._onAutofillClick = function() {\n          var _a2 = _this.props, disabled = _a2.disabled, allowFreeform = _a2.allowFreeform;\n          if (allowFreeform && !disabled) {\n            _this.focus(_this.state.isOpen || _this._processingTouch);\n          } else {\n            _this._onComboBoxClick();\n          }\n        };\n        _this._onTouchStart = function() {\n          if (_this._comboBoxWrapper.current && !(\"onpointerdown\" in _this._comboBoxWrapper)) {\n            _this._handleTouchAndPointerEvent();\n          }\n        };\n        _this._onPointerDown = function(ev) {\n          if (ev.pointerType === \"touch\") {\n            _this._handleTouchAndPointerEvent();\n            ev.preventDefault();\n            ev.stopImmediatePropagation();\n          }\n        };\n        initializeComponentRef(_this);\n        _this._async = new Async(_this);\n        _this._events = new EventGroup(_this);\n        _this._id = props.id || getId(\"ComboBox\");\n        _this._isScrollIdle = true;\n        _this._processingTouch = false;\n        _this._gotMouseMove = false;\n        _this._processingClearPendingInfo = false;\n        _this.state = {\n          isOpen: false,\n          focusState: \"none\",\n          currentPendingValueValidIndex: -1,\n          currentPendingValue: void 0,\n          currentPendingValueValidIndexOnHover: HoverStatus.default\n        };\n        return _this;\n      }\n      Object.defineProperty(ComboBoxInternal2.prototype, \"selectedOptions\", {\n        /**\n         * All selected options\n         */\n        get: function() {\n          var _a2 = this.props.hoisted, currentOptions = _a2.currentOptions, selectedIndices = _a2.selectedIndices;\n          return getAllSelectedOptions(currentOptions, selectedIndices);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      ComboBoxInternal2.prototype.componentDidMount = function() {\n        if (this._comboBoxWrapper.current && !this.props.disabled) {\n          this._events.on(this._comboBoxWrapper.current, \"focus\", this._onResolveOptions, true);\n          if (\"onpointerdown\" in this._comboBoxWrapper.current) {\n            this._events.on(this._comboBoxWrapper.current, \"pointerdown\", this._onPointerDown, true);\n          }\n        }\n      };\n      ComboBoxInternal2.prototype.componentDidUpdate = function(prevProps, prevState) {\n        var _this = this;\n        var _a2, _b2, _c2;\n        var _d2 = this.props, allowFreeform = _d2.allowFreeform, allowFreeInput = _d2.allowFreeInput, text2 = _d2.text, onMenuOpen = _d2.onMenuOpen, onMenuDismissed = _d2.onMenuDismissed, _e2 = _d2.hoisted, currentOptions = _e2.currentOptions, selectedIndices = _e2.selectedIndices;\n        var _f = this.state, currentPendingValue = _f.currentPendingValue, currentPendingValueValidIndex = _f.currentPendingValueValidIndex, isOpen = _f.isOpen;\n        if (isOpen && (!prevState.isOpen || prevState.currentPendingValueValidIndex !== currentPendingValueValidIndex)) {\n          this._async.setTimeout(function() {\n            return _this._scrollIntoView();\n          }, 0);\n        }\n        var doc = getDocumentEx(this.context);\n        if (this._hasFocus() && (isOpen || prevState.isOpen && !isOpen && this._focusInputAfterClose && this._autofill.current && (doc === null || doc === void 0 ? void 0 : doc.activeElement) !== this._autofill.current.inputElement)) {\n          this.focus(\n            void 0,\n            true\n            /*useFocusAsync*/\n          );\n        }\n        if (this._focusInputAfterClose && (prevState.isOpen && !isOpen || this._hasFocus() && (!isOpen && !this.props.multiSelect && prevProps.hoisted.selectedIndices && selectedIndices && prevProps.hoisted.selectedIndices[0] !== selectedIndices[0] || !allowFreeform && !allowFreeInput || text2 !== prevProps.text))) {\n          this._onFocus();\n        }\n        this._notifyPendingValueChanged(prevState);\n        if (isOpen && !prevState.isOpen) {\n          this._overrideScrollDismiss = true;\n          this._async.clearTimeout(this._overrideScrollDimissTimeout);\n          this._overrideScrollDimissTimeout = this._async.setTimeout(function() {\n            _this._overrideScrollDismiss = false;\n          }, 100);\n          onMenuOpen === null || onMenuOpen === void 0 ? void 0 : onMenuOpen();\n        }\n        if (!isOpen && prevState.isOpen && onMenuDismissed) {\n          onMenuDismissed();\n        }\n        var newCurrentPendingValueValidIndex = currentPendingValueValidIndex;\n        var options2 = currentOptions.map(function(item, index2) {\n          return __assign$1(__assign$1({}, item), { index: index2 });\n        });\n        if (!shallowCompare(prevProps.hoisted.currentOptions, currentOptions) && currentPendingValue) {\n          newCurrentPendingValueValidIndex = this.props.allowFreeform || this.props.allowFreeInput ? this._processInputChangeWithFreeform(currentPendingValue) : this._updateAutocompleteIndexWithoutFreeform(currentPendingValue);\n        }\n        var descendantText = void 0;\n        if (isOpen && this._hasFocus() && newCurrentPendingValueValidIndex !== -1) {\n          descendantText = (_a2 = options2[newCurrentPendingValueValidIndex].id) !== null && _a2 !== void 0 ? _a2 : this._id + \"-list\" + newCurrentPendingValueValidIndex;\n        } else if (isOpen && selectedIndices.length) {\n          descendantText = (_c2 = (_b2 = options2[selectedIndices[0]]) === null || _b2 === void 0 ? void 0 : _b2.id) !== null && _c2 !== void 0 ? _c2 : this._id + \"-list\" + selectedIndices[0];\n        }\n        if (descendantText !== this.state.ariaActiveDescendantValue) {\n          this.setState({\n            ariaActiveDescendantValue: descendantText\n          });\n        }\n      };\n      ComboBoxInternal2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n      };\n      ComboBoxInternal2.prototype.render = function() {\n        var id2 = this._id;\n        var errorMessageId = id2 + \"-error\";\n        var _a2 = this.props, className2 = _a2.className, disabled = _a2.disabled, required2 = _a2.required, errorMessage = _a2.errorMessage, _b2 = _a2.onRenderContainer, onRenderContainer = _b2 === void 0 ? this._onRenderContainer : _b2, _c2 = _a2.onRenderLabel, onRenderLabel = _c2 === void 0 ? this._onRenderLabel : _c2, _d2 = _a2.onRenderList, onRenderList = _d2 === void 0 ? this._onRenderList : _d2, _e2 = _a2.onRenderItem, onRenderItem = _e2 === void 0 ? this._onRenderItem : _e2, _f = _a2.onRenderOption, onRenderOption = _f === void 0 ? this._onRenderOptionContent : _f, allowFreeform = _a2.allowFreeform, customStyles = _a2.styles, theme = _a2.theme, persistMenu = _a2.persistMenu, multiSelect = _a2.multiSelect, _g = _a2.hoisted, suggestedDisplayValue = _g.suggestedDisplayValue, selectedIndices = _g.selectedIndices, currentOptions = _g.currentOptions;\n        var isOpen = this.state.isOpen;\n        this._currentVisibleValue = this._getVisibleValue();\n        var multiselectAccessibleText = multiSelect ? this._getMultiselectDisplayString(selectedIndices, currentOptions, suggestedDisplayValue) : void 0;\n        var divProps = getNativeProps(this.props, divProperties, [\n          \"onChange\",\n          \"value\",\n          \"aria-describedby\",\n          \"aria-labelledby\"\n        ]);\n        var hasErrorMessage = errorMessage && errorMessage.length > 0 ? true : false;\n        this._classNames = this.props.getClassNames ? this.props.getClassNames(theme, !!isOpen, !!disabled, !!required2, !!this._hasFocus(), !!allowFreeform, !!hasErrorMessage, className2) : getClassNames$g(getStyles$f(theme, customStyles), className2, !!isOpen, !!disabled, !!required2, !!this._hasFocus(), !!allowFreeform, !!hasErrorMessage);\n        var comboBoxWrapper = this._renderComboBoxWrapper(multiselectAccessibleText, errorMessageId);\n        return React__namespace.createElement(\n          \"div\",\n          __assign$1({}, divProps, { ref: this.props.hoisted.mergedRootRef, className: this._classNames.container }),\n          onRenderLabel({ props: this.props, multiselectAccessibleText }, this._onRenderLabel),\n          comboBoxWrapper,\n          (persistMenu || isOpen) && onRenderContainer(__assign$1(__assign$1({}, this.props), { onRenderList, onRenderItem, onRenderOption, options: currentOptions.map(function(item, index2) {\n            return __assign$1(__assign$1({}, item), { index: index2 });\n          }), onDismiss: this._onDismiss }), this._onRenderContainer),\n          hasErrorMessage && React__namespace.createElement(\"div\", { role: \"alert\", id: errorMessageId, className: this._classNames.errorMessage }, errorMessage)\n        );\n      };\n      ComboBoxInternal2.prototype._getPendingString = function(currentPendingValue, currentOptions, index2) {\n        return currentPendingValue !== null && currentPendingValue !== void 0 ? currentPendingValue : indexWithinBounds(currentOptions, index2) ? getPreviewText(currentOptions[index2]) : \"\";\n      };\n      ComboBoxInternal2.prototype._getMultiselectDisplayString = function(selectedIndices, currentOptions, suggestedDisplayValue) {\n        var displayValues = [];\n        for (var idx = 0; selectedIndices && idx < selectedIndices.length; idx++) {\n          var index2 = selectedIndices[idx];\n          if (currentOptions[index2].itemType !== SelectableOptionMenuItemType.SelectAll) {\n            displayValues.push(indexWithinBounds(currentOptions, index2) ? currentOptions[index2].text : normalizeToString(suggestedDisplayValue));\n          }\n        }\n        var _a2 = this.props.multiSelectDelimiter, multiSelectDelimiter = _a2 === void 0 ? \", \" : _a2;\n        return displayValues.join(multiSelectDelimiter);\n      };\n      ComboBoxInternal2.prototype._preventDismissOnScrollOrResize = function(ev) {\n        var calloutProps = this.props.calloutProps;\n        if (calloutProps === null || calloutProps === void 0 ? void 0 : calloutProps.preventDismissOnEvent) {\n          return calloutProps.preventDismissOnEvent(ev);\n        }\n        if (this._overrideScrollDismiss && (ev.type === \"scroll\" || ev.type === \"resize\")) {\n          return true;\n        }\n        return false;\n      };\n      ComboBoxInternal2.prototype._processInputChangeWithFreeform = function(updatedValue) {\n        var _this = this;\n        var currentOptions = this.props.hoisted.currentOptions;\n        var newCurrentPendingValueValidIndex = -1;\n        if (updatedValue === \"\") {\n          var items = currentOptions.map(function(item, index2) {\n            return __assign$1(__assign$1({}, item), { index: index2 });\n          }).filter(function(option) {\n            return isNormalOption(option) && !option.disabled && getPreviewText(option) === updatedValue;\n          });\n          if (items.length === 1) {\n            newCurrentPendingValueValidIndex = items[0].index;\n          }\n          this._setPendingInfo(updatedValue, newCurrentPendingValueValidIndex, updatedValue);\n          return newCurrentPendingValueValidIndex;\n        }\n        var originalUpdatedValue = updatedValue;\n        updatedValue = this._adjustForCaseSensitivity(updatedValue);\n        var newSuggestedDisplayValue = \"\";\n        if (this.props.autoComplete === \"on\") {\n          var items = currentOptions.map(function(item, index2) {\n            return __assign$1(__assign$1({}, item), { index: index2 });\n          }).filter(function(option) {\n            return isNormalOption(option) && !option.disabled && _this._adjustForCaseSensitivity(getPreviewText(option)).indexOf(updatedValue) === 0;\n          });\n          if (items.length > 0) {\n            var text2 = getPreviewText(items[0]);\n            newSuggestedDisplayValue = this._adjustForCaseSensitivity(text2) !== updatedValue ? text2 : \"\";\n            newCurrentPendingValueValidIndex = items[0].index;\n          }\n        } else {\n          var items = currentOptions.map(function(item, index2) {\n            return __assign$1(__assign$1({}, item), { index: index2 });\n          }).filter(function(option) {\n            return isNormalOption(option) && !option.disabled && _this._adjustForCaseSensitivity(getPreviewText(option)) === updatedValue;\n          });\n          if (items.length === 1) {\n            newCurrentPendingValueValidIndex = items[0].index;\n          }\n        }\n        this._setPendingInfo(originalUpdatedValue, newCurrentPendingValueValidIndex, newSuggestedDisplayValue);\n        return newCurrentPendingValueValidIndex;\n      };\n      ComboBoxInternal2.prototype._processInputChangeWithoutFreeform = function(updatedValue) {\n        var _this = this;\n        var _a2 = this.state, currentPendingValue = _a2.currentPendingValue, currentPendingValueValidIndex = _a2.currentPendingValueValidIndex;\n        if (this.props.autoComplete === \"on\") {\n          if (updatedValue !== \"\") {\n            if (this._autoCompleteTimeout) {\n              this._async.clearTimeout(this._autoCompleteTimeout);\n              this._autoCompleteTimeout = void 0;\n              updatedValue = normalizeToString(currentPendingValue) + updatedValue;\n            }\n            var matchingIndex = this._updateAutocompleteIndexWithoutFreeform(updatedValue);\n            this._autoCompleteTimeout = this._async.setTimeout(function() {\n              _this._autoCompleteTimeout = void 0;\n            }, ReadOnlyPendingAutoCompleteTimeout);\n            return matchingIndex;\n          }\n        }\n        var index2 = currentPendingValueValidIndex >= 0 ? currentPendingValueValidIndex : this._getFirstSelectedIndex();\n        this._setPendingInfoFromIndex(index2);\n        return index2;\n      };\n      ComboBoxInternal2.prototype._updateAutocompleteIndexWithoutFreeform = function(updatedValue) {\n        var _this = this;\n        var currentOptions = this.props.hoisted.currentOptions;\n        var originalUpdatedValue = updatedValue;\n        updatedValue = this._adjustForCaseSensitivity(updatedValue);\n        var items = currentOptions.map(function(item, i) {\n          return __assign$1(__assign$1({}, item), { index: i });\n        }).filter(function(option) {\n          return isNormalOption(option) && !option.disabled && _this._adjustForCaseSensitivity(option.text).indexOf(updatedValue) === 0;\n        });\n        if (items.length > 0) {\n          this._setPendingInfo(originalUpdatedValue, items[0].index, getPreviewText(items[0]));\n          return items[0].index;\n        }\n        return -1;\n      };\n      ComboBoxInternal2.prototype._getFirstSelectedIndex = function() {\n        var selectedIndices = this.props.hoisted.selectedIndices;\n        return (selectedIndices === null || selectedIndices === void 0 ? void 0 : selectedIndices.length) ? selectedIndices[0] : -1;\n      };\n      ComboBoxInternal2.prototype._getNextSelectableIndex = function(index2, searchDirection) {\n        var currentOptions = this.props.hoisted.currentOptions;\n        var newIndex = index2 + searchDirection;\n        newIndex = Math.max(0, Math.min(currentOptions.length - 1, newIndex));\n        if (!indexWithinBounds(currentOptions, newIndex)) {\n          return -1;\n        }\n        var option = currentOptions[newIndex];\n        if (!isSelectableOption(option) || option.hidden === true) {\n          if (searchDirection !== SearchDirection.none && (newIndex > 0 && searchDirection < SearchDirection.none || newIndex >= 0 && newIndex < currentOptions.length && searchDirection > SearchDirection.none)) {\n            newIndex = this._getNextSelectableIndex(newIndex, searchDirection);\n          } else {\n            return index2;\n          }\n        }\n        return newIndex;\n      };\n      ComboBoxInternal2.prototype._setSelectedIndex = function(index2, submitPendingValueEvent, searchDirection) {\n        if (searchDirection === void 0) {\n          searchDirection = SearchDirection.none;\n        }\n        var _a2 = this.props, onChange = _a2.onChange, onPendingValueChanged = _a2.onPendingValueChanged, _b2 = _a2.hoisted, initialIndices = _b2.selectedIndices, currentOptions = _b2.currentOptions;\n        var selectedIndices = initialIndices ? initialIndices.slice() : [];\n        var changedOptions = currentOptions.slice();\n        index2 = this._getNextSelectableIndex(index2, searchDirection);\n        if (!indexWithinBounds(currentOptions, index2)) {\n          return;\n        }\n        if (this.props.multiSelect || selectedIndices.length < 1 || selectedIndices.length === 1 && selectedIndices[0] !== index2) {\n          var option = __assign$1({}, currentOptions[index2]);\n          if (!option || option.disabled) {\n            return;\n          }\n          if (this.props.multiSelect) {\n            option.selected = option.selected !== void 0 ? !option.selected : selectedIndices.indexOf(index2) < 0;\n            if (option.itemType === SelectableOptionMenuItemType.SelectAll) {\n              selectedIndices = [];\n              if (option.selected) {\n                currentOptions.forEach(function(currentOption, i) {\n                  if (!currentOption.disabled && isSelectableOption(currentOption)) {\n                    selectedIndices.push(i);\n                    changedOptions[i] = __assign$1(__assign$1({}, currentOption), { selected: true });\n                  }\n                });\n              } else {\n                changedOptions = currentOptions.map(function(currentOption) {\n                  return __assign$1(__assign$1({}, currentOption), { selected: false });\n                });\n              }\n            } else {\n              if (option.selected && selectedIndices.indexOf(index2) < 0) {\n                selectedIndices.push(index2);\n              } else if (!option.selected && selectedIndices.indexOf(index2) >= 0) {\n                selectedIndices = selectedIndices.filter(function(value2) {\n                  return value2 !== index2;\n                });\n              }\n              changedOptions[index2] = option;\n              var selectAllOption = changedOptions.filter(function(o) {\n                return o.itemType === SelectableOptionMenuItemType.SelectAll;\n              })[0];\n              if (selectAllOption) {\n                var selectAllState = this._isSelectAllChecked(selectedIndices);\n                var selectAllIndex_1 = changedOptions.indexOf(selectAllOption);\n                if (selectAllState) {\n                  selectedIndices.push(selectAllIndex_1);\n                  changedOptions[selectAllIndex_1] = __assign$1(__assign$1({}, selectAllOption), { selected: true });\n                } else {\n                  selectedIndices = selectedIndices.filter(function(value2) {\n                    return value2 !== selectAllIndex_1;\n                  });\n                  changedOptions[selectAllIndex_1] = __assign$1(__assign$1({}, selectAllOption), { selected: false });\n                }\n              }\n            }\n          } else {\n            selectedIndices[0] = index2;\n          }\n          submitPendingValueEvent.persist();\n          if (this.props.selectedKey || this.props.selectedKey === null) {\n            if (this._hasPendingValue && onPendingValueChanged) {\n              onPendingValueChanged();\n              this._hasPendingValue = false;\n            }\n          } else {\n            this.props.hoisted.setSelectedIndices(selectedIndices);\n            this.props.hoisted.setCurrentOptions(changedOptions);\n            if (this._hasPendingValue && onPendingValueChanged) {\n              onPendingValueChanged();\n              this._hasPendingValue = false;\n            }\n          }\n          if (onChange) {\n            onChange(submitPendingValueEvent, option, index2, getPreviewText(option));\n          }\n        }\n        if (this.props.multiSelect && this.state.isOpen) {\n          return;\n        }\n        this._clearPendingInfo();\n      };\n      ComboBoxInternal2.prototype._submitPendingValue = function(submitPendingValueEvent) {\n        var _a2;\n        var _b2 = this.props, onChange = _b2.onChange, allowFreeform = _b2.allowFreeform, autoComplete = _b2.autoComplete, multiSelect = _b2.multiSelect, hoisted = _b2.hoisted;\n        var currentOptions = hoisted.currentOptions;\n        var _c2 = this.state, currentPendingValue = _c2.currentPendingValue, currentPendingValueValidIndex = _c2.currentPendingValueValidIndex, currentPendingValueValidIndexOnHover = _c2.currentPendingValueValidIndexOnHover;\n        var selectedIndices = this.props.hoisted.selectedIndices;\n        if (this._processingClearPendingInfo) {\n          return;\n        }\n        if (allowFreeform) {\n          if (currentPendingValue === null || currentPendingValue === void 0) {\n            if (currentPendingValueValidIndexOnHover >= 0) {\n              this._setSelectedIndex(currentPendingValueValidIndexOnHover, submitPendingValueEvent);\n              this._clearPendingInfo();\n            }\n            return;\n          }\n          if (indexWithinBounds(currentOptions, currentPendingValueValidIndex)) {\n            var pendingOptionText = this._adjustForCaseSensitivity(getPreviewText(currentOptions[currentPendingValueValidIndex]));\n            var autofill = this._autofill.current;\n            var adjustedCurrentPendingValue = this._adjustForCaseSensitivity(currentPendingValue);\n            if (adjustedCurrentPendingValue === pendingOptionText || autoComplete && pendingOptionText.indexOf(adjustedCurrentPendingValue) === 0 && (autofill === null || autofill === void 0 ? void 0 : autofill.isValueSelected) && currentPendingValue.length + (autofill.selectionEnd - autofill.selectionStart) === pendingOptionText.length || ((_a2 = autofill === null || autofill === void 0 ? void 0 : autofill.inputElement) === null || _a2 === void 0 ? void 0 : _a2.value) !== void 0 && this._adjustForCaseSensitivity(autofill.inputElement.value) === pendingOptionText) {\n              this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent);\n              if (multiSelect && this.state.isOpen) {\n                return;\n              }\n              this._clearPendingInfo();\n              return;\n            }\n          }\n          if (onChange) {\n            if (onChange) {\n              onChange(submitPendingValueEvent, void 0, void 0, currentPendingValue);\n            }\n          } else {\n            var newOption = {\n              key: currentPendingValue || getId(),\n              text: normalizeToString(currentPendingValue)\n            };\n            if (multiSelect) {\n              newOption.selected = true;\n            }\n            var newOptions = currentOptions.concat([newOption]);\n            if (selectedIndices) {\n              if (!multiSelect) {\n                selectedIndices = [];\n              }\n              selectedIndices.push(newOptions.length - 1);\n            }\n            hoisted.setCurrentOptions(newOptions);\n            hoisted.setSelectedIndices(selectedIndices);\n          }\n        } else if (currentPendingValueValidIndex >= 0) {\n          this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent);\n        } else if (currentPendingValueValidIndexOnHover >= 0) {\n          this._setSelectedIndex(currentPendingValueValidIndexOnHover, submitPendingValueEvent);\n        }\n        this._clearPendingInfo();\n      };\n      ComboBoxInternal2.prototype._onCalloutLayerMounted = function() {\n        this._gotMouseMove = false;\n      };\n      ComboBoxInternal2.prototype._renderSeparator = function(item) {\n        var index2 = item.index, key2 = item.key;\n        if (index2 && index2 > 0) {\n          return React__namespace.createElement(\"div\", { role: \"presentation\", key: key2, className: this._classNames.divider });\n        }\n        return null;\n      };\n      ComboBoxInternal2.prototype._renderHeader = function(item) {\n        var _a2 = this.props.onRenderOption, onRenderOption = _a2 === void 0 ? this._onRenderOptionContent : _a2;\n        return React__namespace.createElement(\"div\", { id: item.id, key: item.key, className: this._classNames.header }, onRenderOption(item, this._onRenderOptionContent));\n      };\n      ComboBoxInternal2.prototype._renderCheckboxLabel = function(item) {\n        var _a2 = this.props.onRenderOption, onRenderOption = _a2 === void 0 ? this._onRenderMultiselectOptionContent : _a2;\n        return onRenderOption(item, this._onRenderMultiselectOptionContent);\n      };\n      ComboBoxInternal2.prototype._isOptionHighlighted = function(index2) {\n        var currentPendingValueValidIndexOnHover = this.state.currentPendingValueValidIndexOnHover;\n        if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) {\n          return false;\n        }\n        return currentPendingValueValidIndexOnHover >= 0 ? currentPendingValueValidIndexOnHover === index2 : this._isOptionSelected(index2);\n      };\n      ComboBoxInternal2.prototype._isOptionSelected = function(index2) {\n        return this._getPendingSelectedIndex(\n          true\n          /* includePendingValue */\n        ) === index2;\n      };\n      ComboBoxInternal2.prototype._isOptionChecked = function(index2) {\n        if (this.props.multiSelect && index2 !== void 0 && this.props.hoisted.selectedIndices) {\n          var idxOfSelectedIndex = -1;\n          idxOfSelectedIndex = this.props.hoisted.selectedIndices.indexOf(index2);\n          return idxOfSelectedIndex >= 0;\n        }\n        return false;\n      };\n      ComboBoxInternal2.prototype._isOptionIndeterminate = function(index2) {\n        var _a2 = this.props, multiSelect = _a2.multiSelect, hoisted = _a2.hoisted;\n        if (multiSelect && index2 !== void 0 && hoisted.selectedIndices && hoisted.currentOptions) {\n          var option = hoisted.currentOptions[index2];\n          if (option && option.itemType === SelectableOptionMenuItemType.SelectAll) {\n            return hoisted.selectedIndices.length > 0 && !this._isSelectAllChecked();\n          }\n        }\n        return false;\n      };\n      ComboBoxInternal2.prototype._isSelectAllChecked = function(testIndices) {\n        var _a2 = this.props, multiSelect = _a2.multiSelect, hoisted = _a2.hoisted;\n        var selectAllOption = hoisted.currentOptions.find(function(option) {\n          return option.itemType === SelectableOptionMenuItemType.SelectAll;\n        });\n        var selectedIndices = testIndices || hoisted.selectedIndices;\n        if (!multiSelect || !selectedIndices || !selectAllOption) {\n          return false;\n        }\n        var selectAllIndex = hoisted.currentOptions.indexOf(selectAllOption);\n        var compareSelectedIndices = selectedIndices.filter(function(value2) {\n          return value2 !== selectAllIndex;\n        });\n        var selectableOptions = hoisted.currentOptions.filter(function(option) {\n          return !option.disabled && option.itemType !== SelectableOptionMenuItemType.SelectAll && isSelectableOption(option);\n        });\n        return compareSelectedIndices.length === selectableOptions.length;\n      };\n      ComboBoxInternal2.prototype._getPendingSelectedIndex = function(includeCurrentPendingValue) {\n        var _a2 = this.state, currentPendingValueValidIndex = _a2.currentPendingValueValidIndex, currentPendingValue = _a2.currentPendingValue;\n        return currentPendingValueValidIndex >= 0 || includeCurrentPendingValue && currentPendingValue !== null && currentPendingValue !== void 0 ? currentPendingValueValidIndex : this.props.multiSelect ? -1 : this._getFirstSelectedIndex();\n      };\n      ComboBoxInternal2.prototype._scrollIntoView = function() {\n        var _a2 = this.props, onScrollToItem = _a2.onScrollToItem, scrollSelectedToTop = _a2.scrollSelectedToTop;\n        var currentPendingSelectedIndex = this._getPendingSelectedIndex(true);\n        if (onScrollToItem) {\n          onScrollToItem(currentPendingSelectedIndex >= 0 ? currentPendingSelectedIndex : this._getFirstSelectedIndex());\n          return;\n        }\n        var scrollToElement = this._selectedElement.current;\n        if (this.props.multiSelect && this._comboBoxMenu.current) {\n          scrollToElement = findFirstDescendant(this._comboBoxMenu.current, function(element2) {\n            var _a3;\n            return ((_a3 = element2.dataset) === null || _a3 === void 0 ? void 0 : _a3.index) === currentPendingSelectedIndex.toString();\n          });\n        }\n        if (scrollToElement && scrollToElement.offsetParent) {\n          var alignToTop = true;\n          if (this._comboBoxMenu.current && this._comboBoxMenu.current.offsetParent) {\n            var scrollableParent = this._comboBoxMenu.current.offsetParent;\n            var selectedElement = scrollToElement.offsetParent;\n            var _b2 = selectedElement, offsetHeight = _b2.offsetHeight, offsetTop = _b2.offsetTop;\n            var _c2 = scrollableParent, parentOffsetHeight = _c2.offsetHeight, scrollTop = _c2.scrollTop;\n            var isAbove = offsetTop < scrollTop;\n            var isBelow = offsetTop + offsetHeight > scrollTop + parentOffsetHeight;\n            if (isAbove || scrollSelectedToTop) {\n              alignToTop = false;\n              scrollableParent.scrollTo(0, offsetTop);\n            } else if (isBelow) {\n              scrollableParent.scrollTo(0, offsetTop - parentOffsetHeight + offsetHeight);\n            }\n          } else {\n            scrollToElement.offsetParent.scrollIntoView(alignToTop);\n          }\n        }\n      };\n      ComboBoxInternal2.prototype._onItemClick = function(item) {\n        var _this = this;\n        var onItemClick = this.props.onItemClick;\n        var index2 = item.index;\n        return function(ev) {\n          if (!_this.props.multiSelect) {\n            _this._autofill.current && _this._autofill.current.focus();\n            _this.setState({\n              isOpen: false\n            });\n          }\n          onItemClick && onItemClick(ev, item, index2);\n          _this._setSelectedIndex(index2, ev);\n        };\n      };\n      ComboBoxInternal2.prototype._resetSelectedIndex = function() {\n        var currentOptions = this.props.hoisted.currentOptions;\n        this._clearPendingInfo();\n        var selectedIndex = this._getFirstSelectedIndex();\n        if (selectedIndex > 0 && selectedIndex < currentOptions.length) {\n          this.props.hoisted.setSuggestedDisplayValue(currentOptions[selectedIndex].text);\n        } else if (this.props.text) {\n          this.props.hoisted.setSuggestedDisplayValue(this.props.text);\n        }\n      };\n      ComboBoxInternal2.prototype._clearPendingInfo = function() {\n        this._processingClearPendingInfo = true;\n        this.props.hoisted.setSuggestedDisplayValue(void 0);\n        this.setState({\n          currentPendingValue: void 0,\n          currentPendingValueValidIndex: -1,\n          currentPendingValueValidIndexOnHover: HoverStatus.default\n        }, this._onAfterClearPendingInfo);\n      };\n      ComboBoxInternal2.prototype._setPendingInfo = function(currentPendingValue, currentPendingValueValidIndex, suggestedDisplayValue) {\n        if (currentPendingValueValidIndex === void 0) {\n          currentPendingValueValidIndex = -1;\n        }\n        if (this._processingClearPendingInfo) {\n          return;\n        }\n        this.props.hoisted.setSuggestedDisplayValue(suggestedDisplayValue);\n        this.setState({\n          currentPendingValue: normalizeToString(currentPendingValue),\n          currentPendingValueValidIndex,\n          currentPendingValueValidIndexOnHover: HoverStatus.default\n        });\n      };\n      ComboBoxInternal2.prototype._setPendingInfoFromIndex = function(index2) {\n        var currentOptions = this.props.hoisted.currentOptions;\n        if (index2 >= 0 && index2 < currentOptions.length) {\n          var option = currentOptions[index2];\n          this._setPendingInfo(getPreviewText(option), index2, getPreviewText(option));\n        } else {\n          this._clearPendingInfo();\n        }\n      };\n      ComboBoxInternal2.prototype._setPendingInfoFromIndexAndDirection = function(index2, searchDirection) {\n        var currentOptions = this.props.hoisted.currentOptions;\n        if (searchDirection === SearchDirection.forward && index2 >= currentOptions.length - 1) {\n          index2 = -1;\n        } else if (searchDirection === SearchDirection.backward && index2 <= 0) {\n          index2 = currentOptions.length;\n        }\n        var indexUpdate = this._getNextSelectableIndex(index2, searchDirection);\n        if (index2 === indexUpdate) {\n          if (searchDirection === SearchDirection.forward) {\n            index2 = this._getNextSelectableIndex(-1, searchDirection);\n          } else if (searchDirection === SearchDirection.backward) {\n            index2 = this._getNextSelectableIndex(currentOptions.length, searchDirection);\n          }\n        } else {\n          index2 = indexUpdate;\n        }\n        if (indexWithinBounds(currentOptions, index2)) {\n          this._setPendingInfoFromIndex(index2);\n        }\n      };\n      ComboBoxInternal2.prototype._notifyPendingValueChanged = function(prevState) {\n        var onPendingValueChanged = this.props.onPendingValueChanged;\n        if (!onPendingValueChanged) {\n          return;\n        }\n        var currentOptions = this.props.hoisted.currentOptions;\n        var _a2 = this.state, currentPendingValue = _a2.currentPendingValue, currentPendingValueValidIndex = _a2.currentPendingValueValidIndex, currentPendingValueValidIndexOnHover = _a2.currentPendingValueValidIndexOnHover;\n        var newPendingIndex = void 0;\n        var newPendingValue = void 0;\n        if (currentPendingValueValidIndexOnHover !== prevState.currentPendingValueValidIndexOnHover && indexWithinBounds(currentOptions, currentPendingValueValidIndexOnHover)) {\n          newPendingIndex = currentPendingValueValidIndexOnHover;\n        } else if (currentPendingValueValidIndex !== prevState.currentPendingValueValidIndex && indexWithinBounds(currentOptions, currentPendingValueValidIndex)) {\n          newPendingIndex = currentPendingValueValidIndex;\n        } else if (currentPendingValue !== prevState.currentPendingValue) {\n          newPendingValue = currentPendingValue;\n        }\n        if (newPendingIndex !== void 0 || newPendingValue !== void 0 || this._hasPendingValue) {\n          onPendingValueChanged(newPendingIndex !== void 0 ? currentOptions[newPendingIndex] : void 0, newPendingIndex, newPendingValue);\n          this._hasPendingValue = newPendingIndex !== void 0 || newPendingValue !== void 0;\n        }\n      };\n      ComboBoxInternal2.prototype._setOpenStateAndFocusOnClose = function(isOpen, focusInputAfterClose) {\n        this._focusInputAfterClose = focusInputAfterClose;\n        this.setState({ isOpen });\n      };\n      ComboBoxInternal2.prototype._onOptionMouseEnter = function(index2) {\n        if (this._shouldIgnoreMouseEvent()) {\n          return;\n        }\n        this.setState({\n          currentPendingValueValidIndexOnHover: index2\n        });\n      };\n      ComboBoxInternal2.prototype._onOptionMouseMove = function(index2) {\n        this._gotMouseMove = true;\n        if (!this._isScrollIdle || this.state.currentPendingValueValidIndexOnHover === index2) {\n          return;\n        }\n        this.setState({\n          currentPendingValueValidIndexOnHover: index2\n        });\n      };\n      ComboBoxInternal2.prototype._shouldIgnoreMouseEvent = function() {\n        return !this._isScrollIdle || !this._gotMouseMove;\n      };\n      ComboBoxInternal2.prototype._handleInputWhenDisabled = function(ev) {\n        if (this.props.disabled) {\n          if (this.state.isOpen) {\n            this.setState({ isOpen: false });\n          }\n          if (ev !== null && // eslint-disable-next-line @typescript-eslint/no-deprecated\n          ev.which !== KeyCodes.tab && // eslint-disable-next-line @typescript-eslint/no-deprecated\n          ev.which !== KeyCodes.escape && // eslint-disable-next-line @typescript-eslint/no-deprecated\n          (ev.which < 112 || ev.which > 123)) {\n            ev.stopPropagation();\n            ev.preventDefault();\n          }\n        }\n      };\n      ComboBoxInternal2.prototype._handleTouchAndPointerEvent = function() {\n        var _this = this;\n        if (this._lastTouchTimeoutId !== void 0) {\n          this._async.clearTimeout(this._lastTouchTimeoutId);\n          this._lastTouchTimeoutId = void 0;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n          _this._processingTouch = false;\n          _this._lastTouchTimeoutId = void 0;\n        }, TouchIdleDelay);\n      };\n      ComboBoxInternal2.prototype._getCaretButtonStyles = function() {\n        var customCaretDownButtonStyles = this.props.caretDownButtonStyles;\n        return getCaretDownButtonStyles(this.props.theme, customCaretDownButtonStyles);\n      };\n      ComboBoxInternal2.prototype._getCurrentOptionStyles = function(item) {\n        var _a2;\n        var customStylesForAllOptions = this.props.comboBoxOptionStyles;\n        var customStylesForCurrentOption = item.styles;\n        var optionStyles = getOptionStyles(this.props.theme, customStylesForAllOptions, customStylesForCurrentOption, this._isPendingOption(item), item.hidden, this._isOptionHighlighted(item.index));\n        optionStyles.__shadowConfig__ = (_a2 = this.props.styles) === null || _a2 === void 0 ? void 0 : _a2.__shadowConfig__;\n        return optionStyles;\n      };\n      ComboBoxInternal2.prototype._getAriaAutoCompleteValue = function() {\n        var autoComplete = !this.props.disabled && this.props.autoComplete === \"on\";\n        return autoComplete ? this.props.allowFreeform ? \"inline\" : \"both\" : \"list\";\n      };\n      ComboBoxInternal2.prototype._isPendingOption = function(item) {\n        return item && item.index === this.state.currentPendingValueValidIndex;\n      };\n      ComboBoxInternal2.prototype._hasFocus = function() {\n        return this.state.focusState !== \"none\";\n      };\n      ComboBoxInternal2.prototype._adjustForCaseSensitivity = function(text2) {\n        return this.props.caseSensitive ? text2 : text2.toLowerCase();\n      };\n      ComboBoxInternal2.contextType = WindowContext;\n      ComboBoxInternal2 = __decorate([\n        customizable(\"ComboBox\", [\"theme\", \"styles\"])\n      ], ComboBoxInternal2);\n      return ComboBoxInternal2;\n    })(React__namespace.Component)\n  );\n  function getSelectedIndices(options2, selectedKeys) {\n    if (!options2 || !selectedKeys) {\n      return [];\n    }\n    var selectedIndices = {};\n    options2.forEach(function(option, index2) {\n      if (option.selected) {\n        selectedIndices[index2] = true;\n      }\n    });\n    var _loop_1 = function(selectedKey2) {\n      var index2 = findIndex(options2, function(option) {\n        return option.key === selectedKey2;\n      });\n      if (index2 > -1) {\n        selectedIndices[index2] = true;\n      }\n    };\n    for (var _i = 0, selectedKeys_1 = selectedKeys; _i < selectedKeys_1.length; _i++) {\n      var selectedKey = selectedKeys_1[_i];\n      _loop_1(selectedKey);\n    }\n    return Object.keys(selectedIndices).map(Number).sort();\n  }\n  function buildDefaultSelectedKeys(defaultSelectedKey, selectedKey) {\n    var selectedKeys = buildSelectedKeys(defaultSelectedKey);\n    if (selectedKeys.length) {\n      return selectedKeys;\n    }\n    return buildSelectedKeys(selectedKey);\n  }\n  function buildSelectedKeys(selectedKey) {\n    if (selectedKey === void 0) {\n      return [];\n    }\n    return selectedKey instanceof Array ? selectedKey : [selectedKey];\n  }\n  function normalizeToString(value2) {\n    return value2 || \"\";\n  }\n  function indexWithinBounds(options2, index2) {\n    return !!options2 && index2 >= 0 && index2 < options2.length;\n  }\n  function isNormalOption(option) {\n    return option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider && option.itemType !== SelectableOptionMenuItemType.SelectAll;\n  }\n  function isSelectableOption(option) {\n    return option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider;\n  }\n  function getPreviewText(item) {\n    return item.useAriaLabelAsText && item.ariaLabel ? item.ariaLabel : item.text;\n  }\n  function isAltOrMeta(ev) {\n    return ev.which === KeyCodes.alt || ev.key === \"Meta\";\n  }\n  var COMMAND_BAR_HEIGHT = 44;\n  var getStyles$e = function(props) {\n    var className2 = props.className, theme = props.theme;\n    var semanticColors = theme.semanticColors;\n    return {\n      root: [\n        theme.fonts.medium,\n        \"ms-CommandBar\",\n        {\n          display: \"flex\",\n          backgroundColor: semanticColors.bodyBackground,\n          padding: \"0 14px 0 24px\",\n          height: COMMAND_BAR_HEIGHT\n        },\n        className2\n      ],\n      primarySet: [\n        \"ms-CommandBar-primaryCommand\",\n        {\n          flexGrow: \"1\",\n          display: \"flex\",\n          alignItems: \"stretch\"\n        }\n      ],\n      secondarySet: [\n        \"ms-CommandBar-secondaryCommand\",\n        {\n          flexShrink: \"0\",\n          display: \"flex\",\n          alignItems: \"stretch\"\n        }\n      ]\n    };\n  };\n  var getCommandButtonStyles = memoizeFunction(function(customStyles) {\n    var rootStyles = {\n      height: \"100%\"\n    };\n    var labelStyles = {\n      whiteSpace: \"nowrap\"\n    };\n    var _a2 = customStyles || {}, root = _a2.root, label2 = _a2.label, restCustomStyles = __rest(_a2, [\"root\", \"label\"]);\n    return __assign$1(__assign$1({}, restCustomStyles), { root: root ? [rootStyles, root] : rootStyles, label: label2 ? [labelStyles, label2] : labelStyles });\n  });\n  var registerPersistedKeytips = function(keytipsToRegister, keytipManager, registeredPersistedKeytips) {\n    for (var _i = 0, keytipsToRegister_1 = keytipsToRegister; _i < keytipsToRegister_1.length; _i++) {\n      var keytip = keytipsToRegister_1[_i];\n      var uniqueID = keytipManager.register(keytip, true);\n      registeredPersistedKeytips[uniqueID] = keytip;\n    }\n  };\n  var unregisterPersistedKeytips = function(keytipManager, registeredPersistedKeytips) {\n    for (var _i = 0, _a2 = Object.keys(registeredPersistedKeytips); _i < _a2.length; _i++) {\n      var uniqueID = _a2[_i];\n      keytipManager.unregister(registeredPersistedKeytips[uniqueID], uniqueID, true);\n      delete registeredPersistedKeytips[uniqueID];\n    }\n  };\n  var useKeytipRegistrations = function(registeredPersistedKeytips, keytipsToRegister, keytipManager) {\n    var prevPersistedKeytips = usePrevious(registeredPersistedKeytips);\n    React__namespace.useEffect(function() {\n      if (prevPersistedKeytips) {\n        unregisterPersistedKeytips(keytipManager, prevPersistedKeytips);\n        registerPersistedKeytips(keytipsToRegister, keytipManager, registeredPersistedKeytips);\n      }\n    });\n    React__namespace.useEffect(function() {\n      registerPersistedKeytips(keytipsToRegister, keytipManager, registeredPersistedKeytips);\n      return function() {\n        unregisterPersistedKeytips(keytipManager, registeredPersistedKeytips);\n      };\n    }, []);\n  };\n  var OverflowButton = function(props) {\n    var keytipManager = KeytipManager.getInstance();\n    var className2 = props.className, overflowItems = props.overflowItems, keytipSequences = props.keytipSequences, itemSubMenuProvider = props.itemSubMenuProvider, onRenderOverflowButton = props.onRenderOverflowButton;\n    var persistedKeytips = useConst({});\n    var getSubMenuForItem = React__namespace.useCallback(function(item) {\n      if (itemSubMenuProvider) {\n        return itemSubMenuProvider(item);\n      }\n      if (item.subMenuProps) {\n        return item.subMenuProps.items;\n      }\n      return void 0;\n    }, [itemSubMenuProvider]);\n    var _a2 = React__namespace.useMemo(function() {\n      var newKeytipsToRegister = [];\n      var newOverflowItems = [];\n      if (keytipSequences) {\n        overflowItems === null || overflowItems === void 0 ? void 0 : overflowItems.forEach(function(overflowItem) {\n          var _a3;\n          var keytip = overflowItem.keytipProps;\n          if (keytip) {\n            var persistedKeytip = {\n              content: keytip.content,\n              keySequences: keytip.keySequences,\n              disabled: keytip.disabled || !!(overflowItem.disabled || overflowItem.isDisabled),\n              hasDynamicChildren: keytip.hasDynamicChildren,\n              hasMenu: keytip.hasMenu\n            };\n            if (keytip.hasDynamicChildren || getSubMenuForItem(overflowItem)) {\n              persistedKeytip.onExecute = keytipManager.menuExecute.bind(keytipManager, keytipSequences, (_a3 = overflowItem === null || overflowItem === void 0 ? void 0 : overflowItem.keytipProps) === null || _a3 === void 0 ? void 0 : _a3.keySequences);\n              persistedKeytip.hasOverflowSubMenu = true;\n            } else {\n              persistedKeytip.onExecute = keytip.onExecute;\n            }\n            newKeytipsToRegister.push(persistedKeytip);\n            var newOverflowItem = __assign$1(__assign$1({}, overflowItem), { keytipProps: __assign$1(__assign$1({}, keytip), { overflowSetSequence: keytipSequences }) });\n            newOverflowItems === null || newOverflowItems === void 0 ? void 0 : newOverflowItems.push(newOverflowItem);\n          } else {\n            newOverflowItems === null || newOverflowItems === void 0 ? void 0 : newOverflowItems.push(overflowItem);\n          }\n        });\n      } else {\n        newOverflowItems = overflowItems;\n      }\n      return { modifiedOverflowItems: newOverflowItems, keytipsToRegister: newKeytipsToRegister };\n    }, [overflowItems, getSubMenuForItem, keytipManager, keytipSequences]), modifiedOverflowItems = _a2.modifiedOverflowItems, keytipsToRegister = _a2.keytipsToRegister;\n    useKeytipRegistrations(persistedKeytips, keytipsToRegister, keytipManager);\n    return React__namespace.createElement(\"div\", { className: className2 }, onRenderOverflowButton(modifiedOverflowItems));\n  };\n  var getClassNames$f = classNamesFunction();\n  var COMPONENT_NAME$3 = \"OverflowSet\";\n  var useComponentRef$3 = function(props, divContainer) {\n    var doc = useDocumentEx();\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        focus: function(_forceIntoFirstElement, bypassHiddenElements) {\n          var focusSucceeded = false;\n          if (divContainer.current) {\n            focusSucceeded = focusFirstChild(divContainer.current, bypassHiddenElements);\n          }\n          return focusSucceeded;\n        },\n        focusElement: function(childElement) {\n          var focusSucceeded = false;\n          if (!childElement) {\n            return false;\n          }\n          if (divContainer.current && elementContains(divContainer.current, childElement)) {\n            childElement.focus();\n            focusSucceeded = (doc === null || doc === void 0 ? void 0 : doc.activeElement) === childElement;\n          }\n          return focusSucceeded;\n        }\n      };\n    }, [divContainer, doc]);\n  };\n  var OverflowSetBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var divContainer = React__namespace.useRef(null);\n    var mergedRef = useMergedRefs(divContainer, forwardedRef);\n    useComponentRef$3(props, divContainer);\n    var items = props.items, overflowItems = props.overflowItems, className2 = props.className, styles = props.styles, vertical = props.vertical, role = props.role, _a2 = props.overflowSide, overflowSide = _a2 === void 0 ? \"end\" : _a2, onRenderItem = props.onRenderItem;\n    var classNames2 = getClassNames$f(styles, { className: className2, vertical });\n    var showOverflow = !!overflowItems && overflowItems.length > 0;\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({}, getNativeProps(props, divProperties), { role: role || \"group\", \"aria-orientation\": role === \"menubar\" ? vertical === true ? \"vertical\" : \"horizontal\" : void 0, className: classNames2.root, ref: mergedRef }),\n      overflowSide === \"start\" && showOverflow && React__namespace.createElement(OverflowButton, __assign$1({}, props, { className: classNames2.overflowButton })),\n      items && items.map(function(item, i) {\n        return React__namespace.createElement(\"div\", { className: classNames2.item, key: item.key, role: \"none\" }, onRenderItem(item));\n      }),\n      overflowSide === \"end\" && showOverflow && React__namespace.createElement(OverflowButton, __assign$1({}, props, { className: classNames2.overflowButton }))\n    );\n  });\n  OverflowSetBase.displayName = COMPONENT_NAME$3;\n  var overflowItemStyle = {\n    flexShrink: 0,\n    display: \"inherit\"\n  };\n  var getStyles$d = function(props) {\n    var className2 = props.className, vertical = props.vertical;\n    return {\n      root: [\n        \"ms-OverflowSet\",\n        {\n          position: \"relative\",\n          display: \"flex\",\n          flexWrap: \"nowrap\"\n        },\n        vertical && { flexDirection: \"column\" },\n        className2\n      ],\n      item: [\"ms-OverflowSet-item\", overflowItemStyle],\n      overflowButton: [\"ms-OverflowSet-overflowButton\", overflowItemStyle]\n    };\n  };\n  var OverflowSet = styled(OverflowSetBase, getStyles$d, void 0, {\n    scope: \"OverflowSet\"\n  });\n  var ResizeGroupDirection;\n  (function(ResizeGroupDirection2) {\n    ResizeGroupDirection2[ResizeGroupDirection2[\"horizontal\"] = 0] = \"horizontal\";\n    ResizeGroupDirection2[ResizeGroupDirection2[\"vertical\"] = 1] = \"vertical\";\n  })(ResizeGroupDirection || (ResizeGroupDirection = {}));\n  var RESIZE_DELAY = 16;\n  var getMeasurementCache = function() {\n    var measurementsCache = {};\n    return {\n      /**\n       * Checks if the provided data has a cacheKey. If it has a cacheKey and there is a\n       * corresponding entry in the measurementsCache, then it will return that value.\n       * Returns undefined otherwise.\n       */\n      getCachedMeasurement: function(data2) {\n        if (data2 && data2.cacheKey && measurementsCache.hasOwnProperty(data2.cacheKey)) {\n          return measurementsCache[data2.cacheKey];\n        }\n        return void 0;\n      },\n      /**\n       * Should be called whenever there is a new measurement associated with a given data object.\n       * If the data has a cacheKey, store that measurement in the measurementsCache.\n       */\n      addMeasurementToCache: function(data2, measurement) {\n        if (data2.cacheKey) {\n          measurementsCache[data2.cacheKey] = measurement;\n        }\n      }\n    };\n  };\n  var getNextResizeGroupStateProvider = function(measurementCache) {\n    if (measurementCache === void 0) {\n      measurementCache = getMeasurementCache();\n    }\n    var _measurementCache = measurementCache;\n    var _containerDimension;\n    function _getMeasuredDimension(measuredData, getElementToMeasureDimension) {\n      var cachedDimension = _measurementCache.getCachedMeasurement(measuredData);\n      if (cachedDimension !== void 0) {\n        return cachedDimension;\n      }\n      var measuredDimension = getElementToMeasureDimension();\n      _measurementCache.addMeasurementToCache(measuredData, measuredDimension);\n      return measuredDimension;\n    }\n    function _shrinkContentsUntilTheyFit(data2, onReduceData, getElementToMeasureDimension) {\n      var dataToMeasure = data2;\n      var measuredDimension = _getMeasuredDimension(data2, getElementToMeasureDimension);\n      while (measuredDimension > _containerDimension) {\n        var nextMeasuredData = onReduceData(dataToMeasure);\n        if (nextMeasuredData === void 0) {\n          return {\n            renderedData: dataToMeasure,\n            resizeDirection: void 0,\n            dataToMeasure: void 0\n          };\n        }\n        measuredDimension = _measurementCache.getCachedMeasurement(nextMeasuredData);\n        if (measuredDimension === void 0) {\n          return {\n            dataToMeasure: nextMeasuredData,\n            resizeDirection: \"shrink\"\n          };\n        }\n        dataToMeasure = nextMeasuredData;\n      }\n      return {\n        renderedData: dataToMeasure,\n        resizeDirection: void 0,\n        dataToMeasure: void 0\n      };\n    }\n    function _growDataUntilItDoesNotFit(data2, onGrowData, getElementToMeasureDimension, onReduceData) {\n      var dataToMeasure = data2;\n      var measuredDimension = _getMeasuredDimension(data2, getElementToMeasureDimension);\n      while (measuredDimension < _containerDimension) {\n        var nextMeasuredData = onGrowData(dataToMeasure);\n        if (nextMeasuredData === void 0) {\n          return {\n            renderedData: dataToMeasure,\n            resizeDirection: void 0,\n            dataToMeasure: void 0\n          };\n        }\n        measuredDimension = _measurementCache.getCachedMeasurement(nextMeasuredData);\n        if (measuredDimension === void 0) {\n          return {\n            dataToMeasure: nextMeasuredData\n          };\n        }\n        dataToMeasure = nextMeasuredData;\n      }\n      return __assign$1({ resizeDirection: \"shrink\" }, _shrinkContentsUntilTheyFit(dataToMeasure, onReduceData, getElementToMeasureDimension));\n    }\n    function _updateContainerDimension(newDimension, fullDimensionData, renderedData, onGrowData) {\n      var nextState;\n      if (newDimension > _containerDimension) {\n        if (onGrowData) {\n          nextState = {\n            resizeDirection: \"grow\",\n            dataToMeasure: onGrowData(renderedData)\n          };\n        } else {\n          nextState = {\n            resizeDirection: \"shrink\",\n            dataToMeasure: fullDimensionData\n          };\n        }\n      } else {\n        nextState = {\n          resizeDirection: \"shrink\",\n          dataToMeasure: renderedData\n        };\n      }\n      _containerDimension = newDimension;\n      return __assign$1(__assign$1({}, nextState), { measureContainer: false });\n    }\n    function getNextState(props, currentState, getElementToMeasureDimension, newContainerDimension) {\n      if (newContainerDimension === void 0 && currentState.dataToMeasure === void 0) {\n        return void 0;\n      }\n      if (newContainerDimension) {\n        if (_containerDimension && currentState.renderedData && !currentState.dataToMeasure) {\n          return __assign$1(__assign$1({}, currentState), _updateContainerDimension(newContainerDimension, props.data, currentState.renderedData, props.onGrowData));\n        }\n        _containerDimension = newContainerDimension;\n      }\n      var nextState = __assign$1(__assign$1({}, currentState), { measureContainer: false });\n      if (currentState.dataToMeasure) {\n        if (currentState.resizeDirection === \"grow\" && props.onGrowData) {\n          nextState = __assign$1(__assign$1({}, nextState), _growDataUntilItDoesNotFit(currentState.dataToMeasure, props.onGrowData, getElementToMeasureDimension, props.onReduceData));\n        } else {\n          nextState = __assign$1(__assign$1({}, nextState), _shrinkContentsUntilTheyFit(currentState.dataToMeasure, props.onReduceData, getElementToMeasureDimension));\n        }\n      }\n      return nextState;\n    }\n    function shouldRenderDataForMeasurement(dataToMeasure) {\n      if (!dataToMeasure || _measurementCache.getCachedMeasurement(dataToMeasure) !== void 0) {\n        return false;\n      }\n      return true;\n    }\n    function getInitialResizeGroupState(data2) {\n      return {\n        dataToMeasure: __assign$1({}, data2),\n        resizeDirection: \"grow\",\n        measureContainer: true\n      };\n    }\n    return {\n      getNextState,\n      shouldRenderDataForMeasurement,\n      getInitialResizeGroupState\n    };\n  };\n  var MeasuredContext = React__namespace.createContext({ isMeasured: false });\n  var hiddenDivStyles = { position: \"fixed\", visibility: \"hidden\" };\n  var hiddenParentStyles = { position: \"relative\" };\n  function resizeDataReducer(state, action) {\n    var _a2;\n    switch (action.type) {\n      case \"resizeData\":\n        return __assign$1({}, action.value);\n      case \"dataToMeasure\":\n        return __assign$1(__assign$1({}, state), { dataToMeasure: action.value, resizeDirection: \"grow\", measureContainer: true });\n      default:\n        return __assign$1(__assign$1({}, state), (_a2 = {}, _a2[action.type] = action.value, _a2));\n    }\n  }\n  function useResizeState(props, nextResizeGroupStateProvider, rootRef) {\n    var initialStateData = useConst(function() {\n      return nextResizeGroupStateProvider.getInitialResizeGroupState(props.data);\n    });\n    var _a2 = React__namespace.useReducer(resizeDataReducer, initialStateData), resizeData = _a2[0], dispatchResizeDataAction = _a2[1];\n    React__namespace.useEffect(function() {\n      dispatchResizeDataAction({\n        type: \"dataToMeasure\",\n        value: props.data\n      });\n    }, [props.data]);\n    var stateRef = React__namespace.useRef(initialStateData);\n    stateRef.current = __assign$1({}, resizeData);\n    var updateResizeState = React__namespace.useCallback(function(nextState) {\n      if (nextState) {\n        dispatchResizeDataAction({\n          type: \"resizeData\",\n          value: nextState\n        });\n      }\n    }, []);\n    var remeasure = React__namespace.useCallback(function() {\n      if (rootRef.current) {\n        dispatchResizeDataAction({\n          type: \"measureContainer\",\n          value: true\n        });\n      }\n    }, [rootRef]);\n    return [stateRef, updateResizeState, remeasure];\n  }\n  function useResizingBehavior(props, rootRef) {\n    var nextResizeGroupStateProvider = useConst(getNextResizeGroupStateProvider);\n    var initialHiddenDiv = React__namespace.useRef(null);\n    var updateHiddenDiv = React__namespace.useRef(null);\n    var hasRenderedContent = React__namespace.useRef(false);\n    var async = useAsync();\n    var _a2 = useResizeState(props, nextResizeGroupStateProvider, rootRef), stateRef = _a2[0], updateResizeState = _a2[1], remeasure = _a2[2];\n    React__namespace.useEffect(function() {\n      var _a22;\n      if (stateRef.current.renderedData) {\n        hasRenderedContent.current = true;\n        (_a22 = props.dataDidRender) === null || _a22 === void 0 ? void 0 : _a22.call(props, stateRef.current.renderedData);\n      }\n    });\n    React__namespace.useEffect(function() {\n      async.requestAnimationFrame(function() {\n        var containerDimension = void 0;\n        if (stateRef.current.measureContainer && rootRef.current) {\n          var boundingRect = rootRef.current.getBoundingClientRect();\n          containerDimension = props.direction === ResizeGroupDirection.vertical ? boundingRect.height : boundingRect.width;\n        }\n        var nextState = nextResizeGroupStateProvider.getNextState(props, stateRef.current, function() {\n          var refToMeasure = !hasRenderedContent.current ? initialHiddenDiv : updateHiddenDiv;\n          if (!refToMeasure.current) {\n            return 0;\n          }\n          var measuredBoundingRect = refToMeasure.current.getBoundingClientRect();\n          return props.direction === ResizeGroupDirection.vertical ? measuredBoundingRect.height : measuredBoundingRect.width;\n        }, containerDimension);\n        updateResizeState(nextState);\n      }, rootRef.current);\n    });\n    var win = useWindow();\n    useOnEvent(win, \"resize\", async.debounce(remeasure, RESIZE_DELAY, { leading: true }));\n    var dataNeedsMeasuring = nextResizeGroupStateProvider.shouldRenderDataForMeasurement(stateRef.current.dataToMeasure);\n    var isInitialMeasure = !hasRenderedContent.current && dataNeedsMeasuring;\n    return [\n      stateRef.current.dataToMeasure,\n      stateRef.current.renderedData,\n      remeasure,\n      initialHiddenDiv,\n      updateHiddenDiv,\n      dataNeedsMeasuring,\n      isInitialMeasure\n    ];\n  }\n  var measuredContextValue = { isMeasured: true };\n  var ResizeGroupBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRef = useMergedRefs(rootRef, forwardedRef);\n    var _a2 = useResizingBehavior(props, rootRef), dataToMeasure = _a2[0], renderedData = _a2[1], remeasure = _a2[2], initialHiddenDiv = _a2[3], updateHiddenDiv = _a2[4], dataNeedsMeasuring = _a2[5], isInitialMeasure = _a2[6];\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return { remeasure };\n    }, [remeasure]);\n    var className2 = props.className, onRenderData = props.onRenderData;\n    var divProps = getNativeProps(props, divProperties, [\"data\"]);\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({}, divProps, { className: className2, ref: mergedRootRef }),\n      React__namespace.createElement(\n        \"div\",\n        { style: hiddenParentStyles },\n        dataNeedsMeasuring && !isInitialMeasure && React__namespace.createElement(\n          \"div\",\n          { style: hiddenDivStyles, ref: updateHiddenDiv },\n          React__namespace.createElement(MeasuredContext.Provider, { value: measuredContextValue }, onRenderData(dataToMeasure))\n        ),\n        React__namespace.createElement(\"div\", { ref: initialHiddenDiv, style: isInitialMeasure ? hiddenDivStyles : void 0, \"data-automation-id\": \"visibleContent\" }, isInitialMeasure ? onRenderData(dataToMeasure) : renderedData && onRenderData(renderedData))\n      )\n    );\n  });\n  ResizeGroupBase.displayName = \"ResizeGroupBase\";\n  var ResizeGroup = ResizeGroupBase;\n  var getClassNames$e = classNamesFunction();\n  var TooltipBase = (\n    /** @class */\n    (function(_super) {\n      __extends(TooltipBase2, _super);\n      function TooltipBase2() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._onRenderContent = function(props) {\n          if (typeof props.content === \"string\") {\n            return React__namespace.createElement(\"p\", { className: _this._classNames.subText }, props.content);\n          } else {\n            return React__namespace.createElement(\"div\", { className: _this._classNames.subText }, props.content);\n          }\n        };\n        return _this;\n      }\n      TooltipBase2.prototype.render = function() {\n        var _a2 = this.props, className2 = _a2.className, calloutProps = _a2.calloutProps, directionalHint = _a2.directionalHint, directionalHintForRTL = _a2.directionalHintForRTL, styles = _a2.styles, id2 = _a2.id, maxWidth = _a2.maxWidth, _b2 = _a2.onRenderContent, onRenderContent = _b2 === void 0 ? this._onRenderContent : _b2, targetElement = _a2.targetElement, theme = _a2.theme;\n        this._classNames = getClassNames$e(styles, {\n          theme,\n          className: className2 || calloutProps && calloutProps.className,\n          beakWidth: calloutProps && calloutProps.isBeakVisible ? calloutProps.beakWidth : 0,\n          gapSpace: calloutProps && calloutProps.gapSpace,\n          maxWidth\n        });\n        return React__namespace.createElement(\n          Callout,\n          __assign$1({ target: targetElement, directionalHint, directionalHintForRTL }, calloutProps, getNativeProps(this.props, divProperties, [\"id\"]), { className: this._classNames.root }),\n          React__namespace.createElement(\"div\", { className: this._classNames.content, id: id2, onFocus: this.props.onFocus, onMouseEnter: this.props.onMouseEnter, onMouseLeave: this.props.onMouseLeave }, onRenderContent(this.props, this._onRenderContent))\n        );\n      };\n      TooltipBase2.defaultProps = {\n        directionalHint: DirectionalHint.topCenter,\n        maxWidth: \"364px\",\n        calloutProps: {\n          isBeakVisible: true,\n          beakWidth: 16,\n          gapSpace: 0,\n          setInitialFocus: true,\n          doNotLayer: false\n        }\n      };\n      return TooltipBase2;\n    })(React__namespace.Component)\n  );\n  var getStyles$c = function(props) {\n    var className2 = props.className, _a2 = props.beakWidth, beakWidth = _a2 === void 0 ? 16 : _a2, _b2 = props.gapSpace, gapSpace = _b2 === void 0 ? 0 : _b2, maxWidth = props.maxWidth, theme = props.theme;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, effects = theme.effects;\n    var tooltipGapSpace = -(Math.sqrt(beakWidth * beakWidth / 2) + gapSpace) + 1 / // There isn't really a great way to pass in a `window` reference here so disabling the line rule\n    // eslint-disable-next-line no-restricted-globals\n    window.devicePixelRatio;\n    return {\n      root: [\n        \"ms-Tooltip\",\n        theme.fonts.medium,\n        AnimationClassNames.fadeIn200,\n        {\n          background: semanticColors.menuBackground,\n          boxShadow: effects.elevation8,\n          padding: \"8px\",\n          maxWidth,\n          selectors: {\n            \":after\": {\n              content: \"''\",\n              position: \"absolute\",\n              bottom: tooltipGapSpace,\n              left: tooltipGapSpace,\n              right: tooltipGapSpace,\n              top: tooltipGapSpace,\n              zIndex: 0\n            }\n          }\n        },\n        className2\n      ],\n      content: [\n        \"ms-Tooltip-content\",\n        fonts.small,\n        {\n          position: \"relative\",\n          zIndex: 1,\n          color: semanticColors.menuItemText,\n          wordWrap: \"break-word\",\n          overflowWrap: \"break-word\",\n          overflow: \"hidden\"\n        }\n      ],\n      subText: [\n        \"ms-Tooltip-subtext\",\n        {\n          // Using inherit here to avoid unintentional global overrides of the <p> tag.\n          fontSize: \"inherit\",\n          fontWeight: \"inherit\",\n          color: \"inherit\",\n          margin: 0\n        }\n      ]\n    };\n  };\n  var Tooltip = styled(TooltipBase, getStyles$c, void 0, {\n    scope: \"Tooltip\"\n  });\n  var TooltipDelay;\n  (function(TooltipDelay2) {\n    TooltipDelay2[TooltipDelay2[\"zero\"] = 0] = \"zero\";\n    TooltipDelay2[TooltipDelay2[\"medium\"] = 1] = \"medium\";\n    TooltipDelay2[TooltipDelay2[\"long\"] = 2] = \"long\";\n  })(TooltipDelay || (TooltipDelay = {}));\n  var TooltipOverflowMode;\n  (function(TooltipOverflowMode2) {\n    TooltipOverflowMode2[TooltipOverflowMode2[\"Parent\"] = 0] = \"Parent\";\n    TooltipOverflowMode2[TooltipOverflowMode2[\"Self\"] = 1] = \"Self\";\n  })(TooltipOverflowMode || (TooltipOverflowMode = {}));\n  var getClassNames$d = classNamesFunction();\n  var TooltipHostBase = (\n    /** @class */\n    (function(_super) {\n      __extends(TooltipHostBase2, _super);\n      function TooltipHostBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._tooltipHost = React__namespace.createRef();\n        _this._defaultTooltipId = getId(\"tooltip\");\n        _this.show = function() {\n          _this._toggleTooltip(true);\n        };\n        _this.dismiss = function() {\n          _this._hideTooltip();\n        };\n        _this._getTargetElement = function() {\n          if (!_this._tooltipHost.current) {\n            return void 0;\n          }\n          var overflowMode = _this.props.overflowMode;\n          if (overflowMode !== void 0) {\n            switch (overflowMode) {\n              case TooltipOverflowMode.Parent:\n                return _this._tooltipHost.current.parentElement;\n              case TooltipOverflowMode.Self:\n                return _this._tooltipHost.current;\n            }\n          }\n          return _this._tooltipHost.current;\n        };\n        _this._onTooltipFocus = function(ev) {\n          if (_this._ignoreNextFocusEvent) {\n            _this._ignoreNextFocusEvent = false;\n            return;\n          }\n          _this._onTooltipMouseEnter(ev);\n        };\n        _this._onTooltipContentFocus = function(ev) {\n          if (TooltipHostBase2._currentVisibleTooltip && TooltipHostBase2._currentVisibleTooltip !== _this) {\n            TooltipHostBase2._currentVisibleTooltip.dismiss();\n          }\n          TooltipHostBase2._currentVisibleTooltip = _this;\n          _this._clearDismissTimer();\n          _this._clearOpenTimer();\n        };\n        _this._onTooltipBlur = function(ev) {\n          var _a2;\n          _this._ignoreNextFocusEvent = ((_a2 = getDocumentEx(_this.context)) === null || _a2 === void 0 ? void 0 : _a2.activeElement) === ev.target;\n          _this._dismissTimerId = _this._async.setTimeout(function() {\n            _this._hideTooltip();\n          }, 0);\n        };\n        _this._onTooltipMouseEnter = function(ev) {\n          var _a2 = _this.props, overflowMode = _a2.overflowMode, delay = _a2.delay;\n          var doc = getDocumentEx(_this.context);\n          if (TooltipHostBase2._currentVisibleTooltip && TooltipHostBase2._currentVisibleTooltip !== _this) {\n            TooltipHostBase2._currentVisibleTooltip.dismiss();\n          }\n          TooltipHostBase2._currentVisibleTooltip = _this;\n          if (overflowMode !== void 0) {\n            var overflowElement = _this._getTargetElement();\n            if (overflowElement && !hasOverflow(overflowElement)) {\n              return;\n            }\n          }\n          if (ev.target && portalContainsElement(ev.target, _this._getTargetElement(), doc)) {\n            return;\n          }\n          _this._clearDismissTimer();\n          _this._clearOpenTimer();\n          if (delay !== TooltipDelay.zero) {\n            var delayTime = _this._getDelayTime(delay);\n            _this._openTimerId = _this._async.setTimeout(function() {\n              _this._toggleTooltip(true);\n            }, delayTime);\n          } else {\n            _this._toggleTooltip(true);\n          }\n        };\n        _this._onTooltipMouseLeave = function(ev) {\n          var closeDelay = _this.props.closeDelay;\n          _this._clearDismissTimer();\n          _this._clearOpenTimer();\n          if (closeDelay) {\n            _this._dismissTimerId = _this._async.setTimeout(function() {\n              _this._toggleTooltip(false);\n            }, closeDelay);\n          } else {\n            _this._toggleTooltip(false);\n          }\n          if (TooltipHostBase2._currentVisibleTooltip === _this) {\n            TooltipHostBase2._currentVisibleTooltip = void 0;\n          }\n        };\n        _this._onTooltipKeyDown = function(ev) {\n          if ((ev.which === KeyCodes.escape || ev.ctrlKey) && _this.state.isTooltipVisible) {\n            _this._hideTooltip();\n            ev.stopPropagation();\n          }\n        };\n        _this._clearDismissTimer = function() {\n          _this._async.clearTimeout(_this._dismissTimerId);\n        };\n        _this._clearOpenTimer = function() {\n          _this._async.clearTimeout(_this._openTimerId);\n        };\n        _this._hideTooltip = function() {\n          _this._clearOpenTimer();\n          _this._clearDismissTimer();\n          _this._toggleTooltip(false);\n        };\n        _this._toggleTooltip = function(isTooltipVisible) {\n          if (_this.state.isTooltipVisible !== isTooltipVisible) {\n            _this.setState({ isTooltipVisible }, function() {\n              return _this.props.onTooltipToggle && _this.props.onTooltipToggle(isTooltipVisible);\n            });\n          }\n        };\n        _this._getDelayTime = function(delay) {\n          switch (delay) {\n            case TooltipDelay.medium:\n              return 300;\n            case TooltipDelay.long:\n              return 500;\n            default:\n              return 0;\n          }\n        };\n        initializeComponentRef(_this);\n        _this.state = {\n          isAriaPlaceholderRendered: false,\n          isTooltipVisible: false\n        };\n        return _this;\n      }\n      TooltipHostBase2.prototype.render = function() {\n        var _a2 = this.props, calloutProps = _a2.calloutProps, children2 = _a2.children, content2 = _a2.content, directionalHint = _a2.directionalHint, directionalHintForRTL = _a2.directionalHintForRTL, className2 = _a2.hostClassName, id2 = _a2.id, _b2 = _a2.setAriaDescribedBy, setAriaDescribedBy = _b2 === void 0 ? true : _b2, tooltipProps = _a2.tooltipProps, styles = _a2.styles, theme = _a2.theme;\n        this._classNames = getClassNames$d(styles, {\n          theme,\n          className: className2\n        });\n        var isTooltipVisible = this.state.isTooltipVisible;\n        var tooltipId = id2 || this._defaultTooltipId;\n        var tooltipRenderProps = __assign$1(__assign$1({ id: \"\".concat(tooltipId, \"--tooltip\"), content: content2, targetElement: this._getTargetElement(), directionalHint, directionalHintForRTL, calloutProps: assign({}, calloutProps, {\n          onDismiss: this._hideTooltip,\n          onFocus: this._onTooltipContentFocus,\n          onMouseEnter: this._onTooltipMouseEnter,\n          onMouseLeave: this._onTooltipMouseLeave\n        }), onMouseEnter: this._onTooltipMouseEnter, onMouseLeave: this._onTooltipMouseLeave }, getNativeProps(this.props, divProperties, [\"id\"])), tooltipProps);\n        var tooltipContent = (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.onRenderContent) ? tooltipProps.onRenderContent(tooltipRenderProps, function(props) {\n          return (props === null || props === void 0 ? void 0 : props.content) ? React__namespace.createElement(React__namespace.Fragment, null, props.content) : null;\n        }) : content2;\n        var showTooltip = isTooltipVisible && !!tooltipContent;\n        var ariaDescribedBy = setAriaDescribedBy && isTooltipVisible && !!tooltipContent ? tooltipId : void 0;\n        return React__namespace.createElement(\n          \"div\",\n          { className: this._classNames.root, ref: this._tooltipHost, onFocusCapture: this._onTooltipFocus, onBlurCapture: this._onTooltipBlur, onMouseEnter: this._onTooltipMouseEnter, onMouseLeave: this._onTooltipMouseLeave, onKeyDown: this._onTooltipKeyDown, role: \"none\", \"aria-describedby\": ariaDescribedBy },\n          children2,\n          showTooltip && React__namespace.createElement(Tooltip, __assign$1({}, tooltipRenderProps)),\n          React__namespace.createElement(\"div\", { hidden: true, id: tooltipId, style: hiddenContentStyle }, tooltipContent)\n        );\n      };\n      TooltipHostBase2.prototype.componentDidMount = function() {\n        this._async = new Async(this);\n      };\n      TooltipHostBase2.prototype.componentWillUnmount = function() {\n        if (TooltipHostBase2._currentVisibleTooltip && TooltipHostBase2._currentVisibleTooltip === this) {\n          TooltipHostBase2._currentVisibleTooltip = void 0;\n        }\n        this._async.dispose();\n      };\n      TooltipHostBase2.defaultProps = {\n        delay: TooltipDelay.medium\n      };\n      TooltipHostBase2.contextType = WindowContext;\n      return TooltipHostBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$8 = {\n    root: \"ms-TooltipHost\",\n    ariaPlaceholder: \"ms-TooltipHost-aria-placeholder\"\n  };\n  var getStyles$b = function(props) {\n    var className2 = props.className, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$8, theme);\n    return {\n      root: [\n        classNames2.root,\n        {\n          display: \"inline\"\n        },\n        className2\n      ]\n    };\n  };\n  var TooltipHost = styled(TooltipHostBase, getStyles$b, void 0, {\n    scope: \"TooltipHost\"\n  });\n  var getClassNames$c = classNamesFunction();\n  var CommandBarBase = (\n    /** @class */\n    (function(_super) {\n      __extends(CommandBarBase2, _super);\n      function CommandBarBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._overflowSet = React__namespace.createRef();\n        _this._resizeGroup = React__namespace.createRef();\n        _this._onRenderData = function(data2) {\n          var _a2 = _this.props, ariaLabel2 = _a2.ariaLabel, primaryGroupAriaLabel = _a2.primaryGroupAriaLabel, farItemsGroupAriaLabel = _a2.farItemsGroupAriaLabel;\n          var hasSecondSet = data2.farItems && data2.farItems.length > 0;\n          return React__namespace.createElement(\n            FocusZone,\n            { className: css(_this._classNames.root), direction: FocusZoneDirection.horizontal, role: \"menubar\", \"aria-label\": ariaLabel2 },\n            React__namespace.createElement(OverflowSet, { role: hasSecondSet ? \"group\" : \"none\", \"aria-label\": hasSecondSet ? primaryGroupAriaLabel : void 0, componentRef: _this._overflowSet, className: css(_this._classNames.primarySet), items: data2.primaryItems, overflowItems: data2.overflowItems.length ? data2.overflowItems : void 0, onRenderItem: _this._onRenderItem, onRenderOverflowButton: _this._onRenderOverflowButton }),\n            hasSecondSet && React__namespace.createElement(OverflowSet, { role: \"group\", \"aria-label\": farItemsGroupAriaLabel, className: css(_this._classNames.secondarySet), items: data2.farItems, onRenderItem: _this._onRenderItem, onRenderOverflowButton: nullRender })\n          );\n        };\n        _this._onRenderItem = function(item) {\n          if (item.onRender) {\n            return item.onRender(item, function() {\n              return void 0;\n            });\n          }\n          var itemText = item.text || item.name;\n          var commandButtonProps = __assign$1(__assign$1({ allowDisabledFocus: true, role: \"menuitem\" }, item), { styles: getCommandButtonStyles(item.buttonStyles), className: css(\"ms-CommandBarItem-link\", item.className), text: !item.iconOnly ? itemText : void 0, menuProps: item.subMenuProps, onClick: _this._onButtonClick(item) });\n          if (item.iconOnly && (itemText !== void 0 || item.tooltipHostProps)) {\n            return React__namespace.createElement(TooltipHost, __assign$1({\n              role: \"none\",\n              content: itemText,\n              // eslint-disable-next-line @typescript-eslint/no-deprecated\n              setAriaDescribedBy: false\n            }, item.tooltipHostProps), _this._commandButton(item, commandButtonProps));\n          }\n          return _this._commandButton(item, commandButtonProps);\n        };\n        _this._commandButton = function(item, props2) {\n          var ButtonAs = _this.props.buttonAs;\n          var CommandBarButtonAs = item.commandBarButtonAs;\n          var DefaultButtonAs = CommandBarButton;\n          var Type = DefaultButtonAs;\n          if (CommandBarButtonAs) {\n            Type = composeComponentAs(CommandBarButtonAs, Type);\n          }\n          if (ButtonAs) {\n            Type = composeComponentAs(ButtonAs, Type);\n          }\n          return React__namespace.createElement(Type, __assign$1({}, props2));\n        };\n        _this._onRenderOverflowButton = function(overflowItems) {\n          var _a2 = _this.props.overflowButtonProps, overflowButtonProps = _a2 === void 0 ? {} : _a2;\n          var combinedOverflowItems = __spreadArray(__spreadArray([], overflowButtonProps.menuProps ? overflowButtonProps.menuProps.items : [], true), overflowItems, true);\n          var overflowProps = __assign$1(__assign$1({ role: \"menuitem\" }, overflowButtonProps), { styles: __assign$1({ menuIcon: { fontSize: \"17px\" } }, overflowButtonProps.styles), className: css(\"ms-CommandBar-overflowButton\", overflowButtonProps.className), menuProps: __assign$1(__assign$1({}, overflowButtonProps.menuProps), { items: combinedOverflowItems }), menuIconProps: __assign$1({ iconName: \"More\" }, overflowButtonProps.menuIconProps) });\n          var OverflowButtonType = _this.props.overflowButtonAs ? composeComponentAs(_this.props.overflowButtonAs, CommandBarButton) : CommandBarButton;\n          return React__namespace.createElement(OverflowButtonType, __assign$1({}, overflowProps));\n        };\n        _this._onReduceData = function(data2) {\n          var _a2 = _this.props, shiftOnReduce = _a2.shiftOnReduce, onDataReduced = _a2.onDataReduced;\n          var primaryItems = data2.primaryItems, overflowItems = data2.overflowItems, cacheKey = data2.cacheKey;\n          var farItems = data2.farItems;\n          var movedItem = primaryItems[shiftOnReduce ? 0 : primaryItems.length - 1];\n          if (movedItem !== void 0) {\n            movedItem.renderedInOverflow = true;\n            overflowItems = __spreadArray([movedItem], overflowItems, true);\n            primaryItems = shiftOnReduce ? primaryItems.slice(1) : primaryItems.slice(0, -1);\n            var newData = __assign$1(__assign$1({}, data2), { primaryItems, overflowItems });\n            cacheKey = _this._computeCacheKey({ primaryItems, overflow: overflowItems.length > 0, farItems });\n            if (onDataReduced) {\n              onDataReduced(movedItem);\n            }\n            newData.cacheKey = cacheKey;\n            return newData;\n          }\n          return void 0;\n        };\n        _this._onGrowData = function(data2) {\n          var _a2 = _this.props, shiftOnReduce = _a2.shiftOnReduce, onDataGrown = _a2.onDataGrown;\n          var minimumOverflowItems = data2.minimumOverflowItems;\n          var primaryItems = data2.primaryItems, overflowItems = data2.overflowItems, cacheKey = data2.cacheKey;\n          var farItems = data2.farItems;\n          var movedItem = overflowItems[0];\n          if (movedItem !== void 0 && overflowItems.length > minimumOverflowItems) {\n            movedItem.renderedInOverflow = false;\n            overflowItems = overflowItems.slice(1);\n            primaryItems = shiftOnReduce ? __spreadArray([movedItem], primaryItems, true) : __spreadArray(__spreadArray([], primaryItems, true), [movedItem], false);\n            var newData = __assign$1(__assign$1({}, data2), { primaryItems, overflowItems });\n            cacheKey = _this._computeCacheKey({ primaryItems, overflow: overflowItems.length > 0, farItems });\n            if (onDataGrown) {\n              onDataGrown(movedItem);\n            }\n            newData.cacheKey = cacheKey;\n            return newData;\n          }\n          return void 0;\n        };\n        initializeComponentRef(_this);\n        return _this;\n      }\n      CommandBarBase2.prototype.render = function() {\n        var _a2 = this.props, items = _a2.items, overflowItems = _a2.overflowItems, farItems = _a2.farItems, styles = _a2.styles, theme = _a2.theme, dataDidRender = _a2.dataDidRender, _b2 = _a2.onReduceData, onReduceData = _b2 === void 0 ? this._onReduceData : _b2, _c2 = _a2.onGrowData, onGrowData = _c2 === void 0 ? this._onGrowData : _c2, _d2 = _a2.resizeGroupAs, ResizeGroupAs = _d2 === void 0 ? ResizeGroup : _d2;\n        var commandBarData = {\n          primaryItems: __spreadArray([], items, true),\n          overflowItems: __spreadArray([], overflowItems, true),\n          minimumOverflowItems: __spreadArray([], overflowItems, true).length,\n          // for tracking\n          farItems,\n          cacheKey: this._computeCacheKey({\n            primaryItems: __spreadArray([], items, true),\n            overflow: overflowItems && overflowItems.length > 0,\n            farItems\n          })\n        };\n        this._classNames = getClassNames$c(styles, { theme });\n        var nativeProps = getNativeProps(this.props, divProperties);\n        return React__namespace.createElement(ResizeGroupAs, __assign$1({}, nativeProps, { componentRef: this._resizeGroup, data: commandBarData, onReduceData, onGrowData, onRenderData: this._onRenderData, dataDidRender }));\n      };\n      CommandBarBase2.prototype.focus = function() {\n        var overflowSet = this._overflowSet.current;\n        overflowSet && overflowSet.focus();\n      };\n      CommandBarBase2.prototype.remeasure = function() {\n        this._resizeGroup.current && this._resizeGroup.current.remeasure();\n      };\n      CommandBarBase2.prototype._onButtonClick = function(item) {\n        return function(ev) {\n          if (item.inactive) {\n            return;\n          }\n          if (item.onClick) {\n            item.onClick(ev, item);\n          }\n        };\n      };\n      CommandBarBase2.prototype._computeCacheKey = function(data2) {\n        var primaryItems = data2.primaryItems, overflow = data2.overflow, farItems = data2.farItems;\n        var returnKey = function(acc, current) {\n          var _a2 = current.cacheKey, cacheKey = _a2 === void 0 ? current.key : _a2;\n          return acc + cacheKey;\n        };\n        var primaryKey = primaryItems && primaryItems.reduce(returnKey, \"\");\n        var overflowKey = overflow ? \"overflow\" : \"\";\n        var farKey = farItems && farItems.reduce(returnKey, \"\");\n        return [primaryKey, overflowKey, farKey].join(\"\");\n      };\n      CommandBarBase2.defaultProps = {\n        items: [],\n        overflowItems: []\n      };\n      return CommandBarBase2;\n    })(React__namespace.Component)\n  );\n  var CommandBar = styled(CommandBarBase, getStyles$e, void 0, {\n    scope: \"CommandBar\"\n  });\n  var DialogType;\n  (function(DialogType2) {\n    DialogType2[DialogType2[\"normal\"] = 0] = \"normal\";\n    DialogType2[DialogType2[\"largeHeader\"] = 1] = \"largeHeader\";\n    DialogType2[DialogType2[\"close\"] = 2] = \"close\";\n  })(DialogType || (DialogType = {}));\n  var animationDuration = AnimationVariables.durationValue2;\n  var globalClassNames$1 = {\n    root: \"ms-Modal\",\n    main: \"ms-Dialog-main\",\n    scrollableContent: \"ms-Modal-scrollableContent\",\n    isOpen: \"is-open\",\n    layer: \"ms-Modal-Layer\"\n  };\n  var getStyles$a = function(props) {\n    var _a2;\n    var className2 = props.className, containerClassName = props.containerClassName, scrollableContentClassName = props.scrollableContentClassName, isOpen = props.isOpen, isVisible = props.isVisible, hasBeenOpened = props.hasBeenOpened, modalRectangleTop = props.modalRectangleTop, theme = props.theme, topOffsetFixed = props.topOffsetFixed, isModeless = props.isModeless, layerClassName = props.layerClassName, isDefaultDragHandle = props.isDefaultDragHandle, windowInnerHeight = props.windowInnerHeight;\n    var palette = theme.palette, effects = theme.effects, fonts = theme.fonts;\n    var classNames2 = getGlobalClassNames(globalClassNames$1, theme);\n    return {\n      root: [\n        classNames2.root,\n        fonts.medium,\n        {\n          backgroundColor: \"transparent\",\n          position: \"fixed\",\n          height: \"100%\",\n          width: \"100%\",\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          opacity: 0,\n          pointerEvents: \"none\",\n          transition: \"opacity \".concat(animationDuration)\n        },\n        topOffsetFixed && typeof modalRectangleTop === \"number\" && hasBeenOpened && {\n          alignItems: \"flex-start\"\n        },\n        isOpen && classNames2.isOpen,\n        isVisible && {\n          opacity: 1\n        },\n        isVisible && !isModeless && {\n          pointerEvents: \"auto\"\n        },\n        className2\n      ],\n      main: [\n        classNames2.main,\n        {\n          boxShadow: effects.elevation64,\n          borderRadius: effects.roundedCorner2,\n          backgroundColor: palette.white,\n          boxSizing: \"border-box\",\n          position: \"relative\",\n          textAlign: \"left\",\n          outline: \"3px solid transparent\",\n          maxHeight: \"calc(100% - 32px)\",\n          maxWidth: \"calc(100% - 32px)\",\n          minHeight: \"176px\",\n          minWidth: \"288px\",\n          overflowY: \"auto\",\n          zIndex: isModeless ? ZIndexes.Layer : void 0\n        },\n        isModeless && {\n          pointerEvents: \"auto\"\n        },\n        topOffsetFixed && typeof modalRectangleTop === \"number\" && hasBeenOpened && {\n          top: modalRectangleTop\n        },\n        isDefaultDragHandle && {\n          cursor: \"move\"\n        },\n        containerClassName\n      ],\n      scrollableContent: [\n        classNames2.scrollableContent,\n        {\n          overflowY: \"auto\",\n          flexGrow: 1,\n          maxHeight: \"100vh\",\n          selectors: (_a2 = {}, _a2[\"@supports (-webkit-overflow-scrolling: touch)\"] = {\n            maxHeight: windowInnerHeight\n          }, _a2)\n        },\n        scrollableContentClassName\n      ],\n      layer: isModeless && [layerClassName, classNames2.layer, { pointerEvents: \"none\" }],\n      keyboardMoveIconContainer: {\n        position: \"absolute\",\n        display: \"flex\",\n        justifyContent: \"center\",\n        width: \"100%\",\n        padding: \"3px 0px\"\n      },\n      keyboardMoveIcon: {\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        fontSize: fonts.xLargePlus.fontSize,\n        width: \"24px\"\n      }\n    };\n  };\n  var getClassNames$b = classNamesFunction();\n  var OverlayBase = (\n    /** @class */\n    (function(_super) {\n      __extends(OverlayBase2, _super);\n      function OverlayBase2(props) {\n        var _this = _super.call(this, props) || this;\n        initializeComponentRef(_this);\n        var _a2 = _this.props.allowTouchBodyScroll, allowTouchBodyScroll = _a2 === void 0 ? false : _a2;\n        _this._allowTouchBodyScroll = allowTouchBodyScroll;\n        return _this;\n      }\n      OverlayBase2.prototype.componentDidMount = function() {\n        !this._allowTouchBodyScroll && disableBodyScroll();\n      };\n      OverlayBase2.prototype.componentWillUnmount = function() {\n        !this._allowTouchBodyScroll && enableBodyScroll();\n      };\n      OverlayBase2.prototype.render = function() {\n        var _a2 = this.props, isDark = _a2.isDarkThemed, className2 = _a2.className, theme = _a2.theme, styles = _a2.styles;\n        var divProps = getNativeProps(this.props, divProperties);\n        var classNames2 = getClassNames$b(styles, {\n          theme,\n          className: className2,\n          isDark\n        });\n        return React__namespace.createElement(\"div\", __assign$1({}, divProps, { className: classNames2.root }));\n      };\n      return OverlayBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$7 = {\n    root: \"ms-Overlay\",\n    rootDark: \"ms-Overlay--dark\"\n  };\n  var getStyles$9 = function(props) {\n    var _a2;\n    var className2 = props.className, theme = props.theme, isNone = props.isNone, isDark = props.isDark;\n    var palette = theme.palette;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$7, theme);\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          backgroundColor: palette.whiteTranslucent40,\n          top: 0,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          position: \"absolute\",\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n            border: \"1px solid WindowText\",\n            opacity: 0\n          }, _a2)\n        },\n        isNone && {\n          visibility: \"hidden\"\n        },\n        isDark && [\n          classNames2.rootDark,\n          {\n            backgroundColor: palette.blackTranslucent40\n          }\n        ],\n        className2\n      ]\n    };\n  };\n  var Overlay = styled(OverlayBase, getStyles$9, void 0, {\n    scope: \"Overlay\"\n  });\n  var getClassNames$a = memoizeFunction(function(className2, isDragging) {\n    return {\n      root: mergeStyles(className2, isDragging && {\n        touchAction: \"none\",\n        selectors: {\n          \"& *\": {\n            userSelect: \"none\"\n          }\n        }\n      })\n    };\n  });\n  var eventMapping = {\n    touch: {\n      start: \"touchstart\",\n      move: \"touchmove\",\n      stop: \"touchend\"\n    },\n    mouse: {\n      start: \"mousedown\",\n      move: \"mousemove\",\n      stop: \"mouseup\"\n    }\n  };\n  var DraggableZone = (\n    /** @class */\n    (function(_super) {\n      __extends(DraggableZone2, _super);\n      function DraggableZone2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._currentEventType = eventMapping.mouse;\n        _this._events = [];\n        _this._onMouseDown = function(event2) {\n          var onMouseDown = React__namespace.Children.only(_this.props.children).props.onMouseDown;\n          if (onMouseDown) {\n            onMouseDown(event2);\n          }\n          _this._currentEventType = eventMapping.mouse;\n          return _this._onDragStart(event2);\n        };\n        _this._onMouseUp = function(event2) {\n          var onMouseUp = React__namespace.Children.only(_this.props.children).props.onMouseUp;\n          if (onMouseUp) {\n            onMouseUp(event2);\n          }\n          _this._currentEventType = eventMapping.mouse;\n          return _this._onDragStop(event2);\n        };\n        _this._onTouchStart = function(event2) {\n          var onTouchStart = React__namespace.Children.only(_this.props.children).props.onTouchStart;\n          if (onTouchStart) {\n            onTouchStart(event2);\n          }\n          _this._currentEventType = eventMapping.touch;\n          return _this._onDragStart(event2);\n        };\n        _this._onTouchEnd = function(event2) {\n          var onTouchEnd = React__namespace.Children.only(_this.props.children).props.onTouchEnd;\n          if (onTouchEnd) {\n            onTouchEnd(event2);\n          }\n          _this._currentEventType = eventMapping.touch;\n          _this._onDragStop(event2);\n        };\n        _this._onDragStart = function(event2) {\n          if (typeof event2.button === \"number\" && event2.button !== 0) {\n            return false;\n          }\n          if (_this.props.handleSelector && !_this._matchesSelector(event2.target, _this.props.handleSelector) || _this.props.preventDragSelector && _this._matchesSelector(event2.target, _this.props.preventDragSelector)) {\n            return;\n          }\n          _this._touchId = _this._getTouchId(event2);\n          var position2 = _this._getControlPosition(event2);\n          if (position2 === void 0) {\n            return;\n          }\n          var dragData = _this._createDragDataFromPosition(position2);\n          _this.props.onStart && _this.props.onStart(event2, dragData);\n          _this.setState({\n            isDragging: true,\n            lastPosition: position2\n          });\n          var doc = getDocumentEx(_this.context);\n          _this._events = [\n            on$1(\n              doc.body,\n              _this._currentEventType.move,\n              _this._onDrag,\n              true\n              /* use capture phase */\n            ),\n            on$1(\n              doc.body,\n              _this._currentEventType.stop,\n              _this._onDragStop,\n              true\n              /* use capture phase */\n            )\n          ];\n        };\n        _this._onDrag = function(event2) {\n          if (event2.type === \"touchmove\") {\n            event2.preventDefault();\n          }\n          var position2 = _this._getControlPosition(event2);\n          if (!position2) {\n            return;\n          }\n          var updatedData = _this._createUpdatedDragData(_this._createDragDataFromPosition(position2));\n          var updatedPosition = updatedData.position;\n          _this.props.onDragChange && _this.props.onDragChange(event2, updatedData);\n          _this.setState({\n            position: updatedPosition,\n            lastPosition: position2\n          });\n        };\n        _this._onDragStop = function(event2) {\n          if (!_this.state.isDragging) {\n            return;\n          }\n          var position2 = _this._getControlPosition(event2);\n          if (!position2) {\n            return;\n          }\n          var baseDragData = _this._createDragDataFromPosition(position2);\n          _this.setState({\n            isDragging: false,\n            lastPosition: void 0\n          });\n          _this.props.onStop && _this.props.onStop(event2, baseDragData);\n          if (_this.props.position) {\n            _this.setState({\n              position: _this.props.position\n            });\n          }\n          _this._events.forEach(function(dispose) {\n            return dispose();\n          });\n        };\n        _this.state = {\n          isDragging: false,\n          position: _this.props.position || { x: 0, y: 0 },\n          lastPosition: void 0\n        };\n        return _this;\n      }\n      DraggableZone2.prototype.componentDidUpdate = function(prevProps) {\n        if (this.props.position && (!prevProps.position || this.props.position !== prevProps.position)) {\n          this.setState({ position: this.props.position });\n        }\n      };\n      DraggableZone2.prototype.componentWillUnmount = function() {\n        this._events.forEach(function(dispose) {\n          return dispose();\n        });\n      };\n      DraggableZone2.prototype.render = function() {\n        var child = React__namespace.Children.only(this.props.children);\n        var props = child.props;\n        var position2 = this.props.position;\n        var _a2 = this.state, statePosition = _a2.position, isDragging = _a2.isDragging;\n        var x2 = statePosition.x;\n        var y2 = statePosition.y;\n        if (position2 && !isDragging) {\n          x2 = position2.x;\n          y2 = position2.y;\n        }\n        return React__namespace.cloneElement(child, {\n          style: __assign$1(__assign$1({}, props.style), { transform: \"translate(\".concat(x2, \"px, \").concat(y2, \"px)\") }),\n          className: getClassNames$a(props.className, this.state.isDragging).root,\n          onMouseDown: this._onMouseDown,\n          onMouseUp: this._onMouseUp,\n          onTouchStart: this._onTouchStart,\n          onTouchEnd: this._onTouchEnd\n        });\n      };\n      DraggableZone2.prototype._getControlPosition = function(event2) {\n        var touchObj = this._getActiveTouch(event2);\n        if (this._touchId !== void 0 && !touchObj) {\n          return void 0;\n        }\n        var eventToGetOffset = touchObj || event2;\n        return {\n          x: eventToGetOffset.clientX,\n          y: eventToGetOffset.clientY\n        };\n      };\n      DraggableZone2.prototype._getActiveTouch = function(event2) {\n        return event2.targetTouches && this._findTouchInTouchList(event2.targetTouches) || event2.changedTouches && this._findTouchInTouchList(event2.changedTouches);\n      };\n      DraggableZone2.prototype._getTouchId = function(event2) {\n        var touch2 = event2.targetTouches && event2.targetTouches[0] || event2.changedTouches && event2.changedTouches[0];\n        if (touch2) {\n          return touch2.identifier;\n        }\n      };\n      DraggableZone2.prototype._matchesSelector = function(element2, selector) {\n        var _a2;\n        if (!element2 || element2 === ((_a2 = getDocumentEx(this.context)) === null || _a2 === void 0 ? void 0 : _a2.body)) {\n          return false;\n        }\n        var matchesSelectorFn = (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          element2.matches || element2.webkitMatchesSelector || element2.msMatchesSelector\n        );\n        if (!matchesSelectorFn) {\n          return false;\n        }\n        return matchesSelectorFn.call(element2, selector) || this._matchesSelector(element2.parentElement, selector);\n      };\n      DraggableZone2.prototype._findTouchInTouchList = function(touchList) {\n        if (this._touchId === void 0) {\n          return;\n        }\n        for (var i = 0; i < touchList.length; i++) {\n          if (touchList[i].identifier === this._touchId) {\n            return touchList[i];\n          }\n        }\n        return void 0;\n      };\n      DraggableZone2.prototype._createDragDataFromPosition = function(position2) {\n        var lastPosition = this.state.lastPosition;\n        if (lastPosition === void 0) {\n          return {\n            delta: { x: 0, y: 0 },\n            lastPosition: position2,\n            position: position2\n          };\n        }\n        return {\n          delta: {\n            x: position2.x - lastPosition.x,\n            y: position2.y - lastPosition.y\n          },\n          lastPosition,\n          position: position2\n        };\n      };\n      DraggableZone2.prototype._createUpdatedDragData = function(baseDragData) {\n        var position2 = this.state.position;\n        return {\n          position: {\n            x: position2.x + baseDragData.delta.x,\n            y: position2.y + baseDragData.delta.y\n          },\n          delta: baseDragData.delta,\n          lastPosition: position2\n        };\n      };\n      DraggableZone2.contextType = WindowContext;\n      return DraggableZone2;\n    })(React__namespace.Component)\n  );\n  var ZERO = { x: 0, y: 0 };\n  var DEFAULT_PROPS$1 = {\n    isOpen: false,\n    isDarkOverlay: true,\n    className: \"\",\n    containerClassName: \"\",\n    enableAriaHiddenSiblings: true\n  };\n  var getClassNames$9 = classNamesFunction();\n  var getMoveDelta = function(ev) {\n    var delta = 10;\n    if (ev.shiftKey) {\n      if (!ev.ctrlKey) {\n        delta = 50;\n      }\n    } else if (ev.ctrlKey) {\n      delta = 1;\n    }\n    return delta;\n  };\n  var useComponentRef$2 = function(props, focusTrapZone) {\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        focus: function() {\n          if (focusTrapZone.current) {\n            focusTrapZone.current.focus();\n          }\n        }\n      };\n    }, [focusTrapZone]);\n  };\n  var ModalBase = React__namespace.forwardRef(function(propsWithoutDefaults, ref2) {\n    var _a2, _b2, _c2, _d2, _e2;\n    var props = getPropsWithDefaults(DEFAULT_PROPS$1, propsWithoutDefaults);\n    var allowTouchBodyScroll = props.allowTouchBodyScroll, className2 = props.className, children2 = props.children, containerClassName = props.containerClassName, scrollableContentClassName = props.scrollableContentClassName, elementToFocusOnDismiss = props.elementToFocusOnDismiss, firstFocusableSelector = props.firstFocusableSelector, focusTrapZoneProps = props.focusTrapZoneProps, forceFocusInsideTrap = props.forceFocusInsideTrap, _f = props.disableRestoreFocus, disableRestoreFocus = _f === void 0 ? props.ignoreExternalFocusing : _f, isBlocking = props.isBlocking, isAlert = props.isAlert, isClickableOutsideFocusTrap = props.isClickableOutsideFocusTrap, isDarkOverlay = props.isDarkOverlay, onDismiss = props.onDismiss, layerProps = props.layerProps, overlay = props.overlay, isOpen = props.isOpen, titleAriaId = props.titleAriaId, styles = props.styles, subtitleAriaId = props.subtitleAriaId, theme = props.theme, topOffsetFixed = props.topOffsetFixed, responsiveMode = props.responsiveMode, onLayerDidMount = props.onLayerDidMount, isModeless = props.isModeless, dragOptions = props.dragOptions, onDismissed = props.onDismissed, enableAriaHiddenSiblings = props.enableAriaHiddenSiblings, popupProps = props.popupProps;\n    var rootRef = React__namespace.useRef(null);\n    var focusTrapZone = React__namespace.useRef(null);\n    var focusTrapZoneRef = useMergedRefs(focusTrapZone, focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.componentRef);\n    var focusTrapZoneElm = React__namespace.useRef(null);\n    var mergedRef = useMergedRefs(rootRef, ref2);\n    var modalResponsiveMode = useResponsiveMode(mergedRef);\n    var focusTrapZoneId = useId(\"ModalFocusTrapZone\", focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.id);\n    var win = useWindow();\n    var _g = useSetTimeout(), setTimeout2 = _g.setTimeout, clearTimeout2 = _g.clearTimeout;\n    var _h = React__namespace.useState(isOpen), isModalOpen = _h[0], setIsModalOpen = _h[1];\n    var _j = React__namespace.useState(isOpen), isVisible = _j[0], setIsVisible = _j[1];\n    var _k = React__namespace.useState(ZERO), coordinates = _k[0], setCoordinates = _k[1];\n    var _l = React__namespace.useState(), modalRectangleTop = _l[0], setModalRectangleTop = _l[1];\n    var _m = useBoolean(false), isModalMenuOpen = _m[0], _o = _m[1], toggleModalMenuOpen = _o.toggle, setModalMenuClose = _o.setFalse;\n    var internalState = useConst(function() {\n      return {\n        onModalCloseTimer: 0,\n        allowTouchBodyScroll,\n        scrollableContent: null,\n        lastSetCoordinates: ZERO,\n        events: new EventGroup({})\n      };\n    });\n    var keepInBounds = (dragOptions || {}).keepInBounds;\n    var isAlertRole = isAlert !== null && isAlert !== void 0 ? isAlert : isBlocking && !isModeless;\n    var layerClassName = layerProps === void 0 ? \"\" : layerProps.className;\n    var classNames2 = getClassNames$9(styles, {\n      theme,\n      className: className2,\n      containerClassName,\n      scrollableContentClassName,\n      isOpen,\n      isVisible,\n      hasBeenOpened: internalState.hasBeenOpened,\n      modalRectangleTop,\n      topOffsetFixed,\n      isModeless,\n      layerClassName,\n      windowInnerHeight: win === null || win === void 0 ? void 0 : win.innerHeight,\n      isDefaultDragHandle: dragOptions && !dragOptions.dragHandleSelector\n    });\n    var mergedLayerProps = __assign$1(__assign$1({ eventBubblingEnabled: false }, layerProps), { onLayerDidMount: layerProps && layerProps.onLayerDidMount ? layerProps.onLayerDidMount : onLayerDidMount, insertFirst: (layerProps === null || layerProps === void 0 ? void 0 : layerProps.insertFirst) || isModeless, className: classNames2.layer });\n    var allowScrollOnModal = React__namespace.useCallback(function(elt) {\n      if (elt) {\n        if (internalState.allowTouchBodyScroll) {\n          allowOverscrollOnElement(elt, internalState.events);\n        } else {\n          allowScrollOnElement(elt, internalState.events);\n        }\n      } else {\n        internalState.events.off(internalState.scrollableContent);\n      }\n      internalState.scrollableContent = elt;\n    }, [internalState]);\n    var registerInitialModalPosition = function() {\n      var dialogMain = focusTrapZoneElm.current;\n      var modalRectangle = dialogMain === null || dialogMain === void 0 ? void 0 : dialogMain.getBoundingClientRect();\n      if (modalRectangle) {\n        if (topOffsetFixed) {\n          setModalRectangleTop(modalRectangle.top);\n        }\n        if (keepInBounds) {\n          internalState.minPosition = { x: -modalRectangle.left, y: -modalRectangle.top };\n          internalState.maxPosition = { x: modalRectangle.left, y: modalRectangle.top };\n        }\n      }\n    };\n    var getClampedAxis = React__namespace.useCallback(function(axis, position2) {\n      var minPosition = internalState.minPosition, maxPosition = internalState.maxPosition;\n      if (keepInBounds && minPosition && maxPosition) {\n        position2 = Math.max(minPosition[axis], position2);\n        position2 = Math.min(maxPosition[axis], position2);\n      }\n      return position2;\n    }, [keepInBounds, internalState]);\n    var handleModalClose = function() {\n      var _a22;\n      internalState.lastSetCoordinates = ZERO;\n      setModalMenuClose();\n      internalState.isInKeyboardMoveMode = false;\n      setIsModalOpen(false);\n      setCoordinates(ZERO);\n      (_a22 = internalState.disposeOnKeyUp) === null || _a22 === void 0 ? void 0 : _a22.call(internalState);\n      onDismissed === null || onDismissed === void 0 ? void 0 : onDismissed();\n    };\n    var handleDragStart = React__namespace.useCallback(function() {\n      setModalMenuClose();\n      internalState.isInKeyboardMoveMode = false;\n    }, [internalState, setModalMenuClose]);\n    var handleDrag = React__namespace.useCallback(function(ev, dragData) {\n      setCoordinates(function(prevValue) {\n        return {\n          x: getClampedAxis(\"x\", prevValue.x + dragData.delta.x),\n          y: getClampedAxis(\"y\", prevValue.y + dragData.delta.y)\n        };\n      });\n    }, [getClampedAxis]);\n    var handleDragStop = React__namespace.useCallback(function() {\n      if (focusTrapZone.current) {\n        focusTrapZone.current.focus();\n      }\n    }, []);\n    var handleEnterKeyboardMoveMode = function() {\n      var handleKeyDown = function(ev) {\n        if (ev.altKey && ev.ctrlKey && ev.keyCode === KeyCodes.space) {\n          ev.preventDefault();\n          ev.stopPropagation();\n          return;\n        }\n        var newLocal = ev.altKey || ev.keyCode === KeyCodes.escape;\n        if (isModalMenuOpen && newLocal) {\n          setModalMenuClose();\n        }\n        if (internalState.isInKeyboardMoveMode && (ev.keyCode === KeyCodes.escape || ev.keyCode === KeyCodes.enter)) {\n          internalState.isInKeyboardMoveMode = false;\n          ev.preventDefault();\n          ev.stopPropagation();\n        }\n        if (internalState.isInKeyboardMoveMode) {\n          var handledEvent = true;\n          var delta_1 = getMoveDelta(ev);\n          switch (ev.keyCode) {\n            /* eslint-disable no-fallthrough */\n            case KeyCodes.escape:\n              setCoordinates(internalState.lastSetCoordinates);\n            case KeyCodes.enter: {\n              internalState.lastSetCoordinates = ZERO;\n              break;\n            }\n            case KeyCodes.up: {\n              setCoordinates(function(prevValue) {\n                return { x: prevValue.x, y: getClampedAxis(\"y\", prevValue.y - delta_1) };\n              });\n              break;\n            }\n            case KeyCodes.down: {\n              setCoordinates(function(prevValue) {\n                return { x: prevValue.x, y: getClampedAxis(\"y\", prevValue.y + delta_1) };\n              });\n              break;\n            }\n            case KeyCodes.left: {\n              setCoordinates(function(prevValue) {\n                return { x: getClampedAxis(\"x\", prevValue.x - delta_1), y: prevValue.y };\n              });\n              break;\n            }\n            case KeyCodes.right: {\n              setCoordinates(function(prevValue) {\n                return { x: getClampedAxis(\"x\", prevValue.x + delta_1), y: prevValue.y };\n              });\n              break;\n            }\n            default: {\n              handledEvent = false;\n            }\n          }\n          if (handledEvent) {\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n        }\n      };\n      internalState.lastSetCoordinates = coordinates;\n      setModalMenuClose();\n      internalState.isInKeyboardMoveMode = true;\n      internalState.events.on(\n        win,\n        \"keydown\",\n        handleKeyDown,\n        true\n        /* useCapture */\n      );\n      internalState.disposeOnKeyDown = function() {\n        internalState.events.off(\n          win,\n          \"keydown\",\n          handleKeyDown,\n          true\n          /* useCapture */\n        );\n        internalState.disposeOnKeyDown = void 0;\n      };\n    };\n    var handleExitKeyboardMoveMode = function(ev) {\n      var _a22, _b22;\n      (_a22 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.onBlur) === null || _a22 === void 0 ? void 0 : _a22.call(focusTrapZoneProps, ev);\n      internalState.lastSetCoordinates = ZERO;\n      internalState.isInKeyboardMoveMode = false;\n      (_b22 = internalState.disposeOnKeyDown) === null || _b22 === void 0 ? void 0 : _b22.call(internalState);\n    };\n    var registerForKeyUp = function() {\n      var handleKeyUp = function(ev) {\n        if (ev.altKey && ev.ctrlKey && ev.keyCode === KeyCodes.space) {\n          if (elementContains(internalState.scrollableContent, ev.target)) {\n            toggleModalMenuOpen();\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n        }\n      };\n      if (!internalState.disposeOnKeyUp) {\n        internalState.events.on(\n          win,\n          \"keyup\",\n          handleKeyUp,\n          true\n          /* useCapture */\n        );\n        internalState.disposeOnKeyUp = function() {\n          internalState.events.off(\n            win,\n            \"keyup\",\n            handleKeyUp,\n            true\n            /* useCapture */\n          );\n          internalState.disposeOnKeyUp = void 0;\n        };\n      }\n    };\n    React__namespace.useEffect(function() {\n      clearTimeout2(internalState.onModalCloseTimer);\n      if (isOpen) {\n        requestAnimationFrame(function() {\n          return setTimeout2(registerInitialModalPosition, 0);\n        });\n        setIsModalOpen(true);\n        if (dragOptions) {\n          registerForKeyUp();\n        }\n        internalState.hasBeenOpened = true;\n        setIsVisible(true);\n      }\n      if (!isOpen && isModalOpen) {\n        internalState.onModalCloseTimer = setTimeout2(handleModalClose, parseFloat(animationDuration) * 1e3);\n        setIsVisible(false);\n      }\n    }, [isModalOpen, isOpen]);\n    useUnmount(function() {\n      internalState.events.dispose();\n      if (internalState.onModalCloseTimer) {\n        clearTimeout2(internalState.onModalCloseTimer);\n        internalState.onModalCloseTimer = 0;\n      }\n    });\n    useComponentRef$2(props, focusTrapZone);\n    var modalContent = React__namespace.createElement(\n      FocusTrapZone,\n      __assign$1({}, focusTrapZoneProps, {\n        id: focusTrapZoneId,\n        ref: focusTrapZoneElm,\n        componentRef: focusTrapZoneRef,\n        className: css(classNames2.main, focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.className),\n        elementToFocusOnDismiss: (_a2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.elementToFocusOnDismiss) !== null && _a2 !== void 0 ? _a2 : elementToFocusOnDismiss,\n        isClickableOutsideFocusTrap: (_b2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.isClickableOutsideFocusTrap) !== null && _b2 !== void 0 ? _b2 : isModeless || isClickableOutsideFocusTrap || !isBlocking,\n        disableRestoreFocus: (_c2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.disableRestoreFocus) !== null && _c2 !== void 0 ? _c2 : disableRestoreFocus,\n        forceFocusInsideTrap: ((_d2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.forceFocusInsideTrap) !== null && _d2 !== void 0 ? _d2 : forceFocusInsideTrap) && !isModeless,\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        firstFocusableSelector: (focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.firstFocusableSelector) || firstFocusableSelector,\n        focusPreviouslyFocusedInnerElement: (_e2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.focusPreviouslyFocusedInnerElement) !== null && _e2 !== void 0 ? _e2 : true,\n        onBlur: internalState.isInKeyboardMoveMode ? handleExitKeyboardMoveMode : void 0\n      }),\n      dragOptions && internalState.isInKeyboardMoveMode && React__namespace.createElement(\"div\", { className: classNames2.keyboardMoveIconContainer }, dragOptions.keyboardMoveIconProps ? React__namespace.createElement(Icon, __assign$1({}, dragOptions.keyboardMoveIconProps)) : React__namespace.createElement(Icon, { iconName: \"move\", className: classNames2.keyboardMoveIcon })),\n      React__namespace.createElement(\n        \"div\",\n        { ref: allowScrollOnModal, className: classNames2.scrollableContent, \"data-is-scrollable\": true },\n        dragOptions && isModalMenuOpen && React__namespace.createElement(dragOptions.menu, { items: [\n          { key: \"move\", text: dragOptions.moveMenuItemText, onClick: handleEnterKeyboardMoveMode },\n          { key: \"close\", text: dragOptions.closeMenuItemText, onClick: handleModalClose }\n        ], onDismiss: setModalMenuClose, alignTargetEdge: true, coverTarget: true, directionalHint: DirectionalHint.topLeftEdge, directionalHintFixed: true, shouldFocusOnMount: true, target: internalState.scrollableContent }),\n        children2\n      )\n    );\n    return isModalOpen && modalResponsiveMode >= (responsiveMode || ResponsiveMode.small) && React__namespace.createElement(\n      Layer,\n      __assign$1({ ref: mergedRef }, mergedLayerProps),\n      React__namespace.createElement(\n        Popup,\n        __assign$1({\n          role: isAlertRole ? \"alertdialog\" : \"dialog\",\n          ariaLabelledBy: titleAriaId,\n          ariaDescribedBy: subtitleAriaId,\n          onDismiss,\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          shouldRestoreFocus: !disableRestoreFocus,\n          // Modeless modals shouldn't hide siblings.\n          // Popup will automatically handle this based on the aria-modal setting.\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          enableAriaHiddenSiblings,\n          \"aria-modal\": !isModeless\n        }, popupProps),\n        React__namespace.createElement(\n          \"div\",\n          { className: classNames2.root, role: !isModeless ? \"document\" : void 0 },\n          !isModeless && React__namespace.createElement(Overlay, __assign$1({ \"aria-hidden\": true, isDarkThemed: isDarkOverlay, onClick: isBlocking ? void 0 : onDismiss, allowTouchBodyScroll }, overlay)),\n          dragOptions ? React__namespace.createElement(DraggableZone, { handleSelector: dragOptions.dragHandleSelector || \"#\".concat(focusTrapZoneId), preventDragSelector: \"button\", onStart: handleDragStart, onDragChange: handleDrag, onStop: handleDragStop, position: coordinates }, modalContent) : modalContent\n        )\n      )\n    ) || null;\n  });\n  ModalBase.displayName = \"Modal\";\n  var Modal = styled(ModalBase, getStyles$a, void 0, {\n    scope: \"Modal\",\n    fields: [\"theme\", \"styles\", \"enableAriaHiddenSiblings\"]\n  });\n  Modal.displayName = \"Modal\";\n  var getClassNames$8 = classNamesFunction();\n  var DialogFooterBase = (\n    /** @class */\n    (function(_super) {\n      __extends(DialogFooterBase2, _super);\n      function DialogFooterBase2(props) {\n        var _this = _super.call(this, props) || this;\n        initializeComponentRef(_this);\n        return _this;\n      }\n      DialogFooterBase2.prototype.render = function() {\n        var _a2 = this.props, className2 = _a2.className, styles = _a2.styles, theme = _a2.theme;\n        this._classNames = getClassNames$8(styles, {\n          theme,\n          className: className2\n        });\n        return React__namespace.createElement(\n          \"div\",\n          { className: this._classNames.actions },\n          React__namespace.createElement(\"div\", { className: this._classNames.actionsRight }, this._renderChildrenAsActions())\n        );\n      };\n      DialogFooterBase2.prototype._renderChildrenAsActions = function() {\n        var _this = this;\n        return React__namespace.Children.map(this.props.children, function(child) {\n          return child ? React__namespace.createElement(\"span\", { className: _this._classNames.action }, child) : null;\n        });\n      };\n      return DialogFooterBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$6 = {\n    actions: \"ms-Dialog-actions\",\n    action: \"ms-Dialog-action\",\n    actionsRight: \"ms-Dialog-actionsRight\"\n  };\n  var getStyles$8 = function(props) {\n    var className2 = props.className, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$6, theme);\n    return {\n      actions: [\n        classNames2.actions,\n        {\n          position: \"relative\",\n          width: \"100%\",\n          minHeight: \"24px\",\n          lineHeight: \"24px\",\n          margin: \"16px 0 0\",\n          fontSize: \"0\",\n          selectors: {\n            \".ms-Button\": {\n              lineHeight: \"normal\",\n              verticalAlign: \"middle\"\n            }\n          }\n        },\n        className2\n      ],\n      action: [\n        classNames2.action,\n        {\n          margin: \"0 4px\"\n        }\n      ],\n      actionsRight: [\n        classNames2.actionsRight,\n        {\n          alignItems: \"center\",\n          display: \"flex\",\n          fontSize: \"0\",\n          justifyContent: \"flex-end\",\n          marginRight: \"-4px\"\n        }\n      ]\n    };\n  };\n  var DialogFooter = styled(DialogFooterBase, getStyles$8, void 0, { scope: \"DialogFooter\" });\n  DialogFooter.displayName = \"DialogFooter\";\n  var getClassNames$7 = classNamesFunction();\n  var DialogFooterType = React__namespace.createElement(DialogFooter, null).type;\n  var DialogContentBase = (\n    /** @class */\n    (function(_super) {\n      __extends(DialogContentBase2, _super);\n      function DialogContentBase2(props) {\n        var _this = _super.call(this, props) || this;\n        initializeComponentRef(_this);\n        return _this;\n      }\n      DialogContentBase2.prototype.render = function() {\n        var _a2 = this.props, showCloseButton = _a2.showCloseButton, className2 = _a2.className, closeButtonAriaLabel = _a2.closeButtonAriaLabel, onDismiss = _a2.onDismiss, subTextId = _a2.subTextId, subText = _a2.subText, _b2 = _a2.titleProps, titleProps = _b2 === void 0 ? {} : _b2, titleId = _a2.titleId, title = _a2.title, type2 = _a2.type, styles = _a2.styles, theme = _a2.theme, draggableHeaderClassName = _a2.draggableHeaderClassName;\n        var classNames2 = getClassNames$7(styles, {\n          theme,\n          className: className2,\n          isLargeHeader: type2 === DialogType.largeHeader,\n          isClose: type2 === DialogType.close,\n          draggableHeaderClassName\n        });\n        var groupings = this._groupChildren();\n        var subTextContent;\n        if (subText) {\n          subTextContent = React__namespace.createElement(\"p\", { className: classNames2.subText, id: subTextId }, subText);\n        }\n        return React__namespace.createElement(\n          \"div\",\n          { className: classNames2.content },\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.header },\n            React__namespace.createElement(\"div\", __assign$1({ id: titleId, role: \"heading\", \"aria-level\": 1 }, titleProps, { className: css(classNames2.title, titleProps.className) }), title),\n            React__namespace.createElement(\n              \"div\",\n              { className: classNames2.topButton },\n              this.props.topButtonsProps.map(function(props, index2) {\n                return React__namespace.createElement(IconButton, __assign$1({ key: props.uniqueId || index2 }, props));\n              }),\n              (type2 === DialogType.close || showCloseButton && type2 !== DialogType.largeHeader) && React__namespace.createElement(IconButton, { className: classNames2.button, iconProps: { iconName: \"Cancel\" }, ariaLabel: closeButtonAriaLabel, onClick: onDismiss })\n            )\n          ),\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.inner },\n            React__namespace.createElement(\n              \"div\",\n              { className: classNames2.innerContent },\n              subTextContent,\n              groupings.contents\n            ),\n            groupings.footers\n          )\n        );\n      };\n      DialogContentBase2.prototype._groupChildren = function() {\n        var groupings = {\n          footers: [],\n          contents: []\n        };\n        React__namespace.Children.map(this.props.children, function(child) {\n          if (typeof child === \"object\" && child !== null && child.type === DialogFooterType) {\n            groupings.footers.push(child);\n          } else {\n            groupings.contents.push(child);\n          }\n        });\n        return groupings;\n      };\n      DialogContentBase2.defaultProps = {\n        showCloseButton: false,\n        className: \"\",\n        topButtonsProps: [],\n        closeButtonAriaLabel: \"Close\"\n      };\n      DialogContentBase2 = __decorate([\n        withResponsiveMode\n      ], DialogContentBase2);\n      return DialogContentBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$5 = {\n    contentLgHeader: \"ms-Dialog-lgHeader\",\n    close: \"ms-Dialog--close\",\n    subText: \"ms-Dialog-subText\",\n    header: \"ms-Dialog-header\",\n    headerLg: \"ms-Dialog--lgHeader\",\n    button: \"ms-Dialog-button ms-Dialog-button--close\",\n    inner: \"ms-Dialog-inner\",\n    content: \"ms-Dialog-content\",\n    title: \"ms-Dialog-title\"\n  };\n  var getStyles$7 = function(props) {\n    var _a2, _b2, _c2;\n    var className2 = props.className, theme = props.theme, isLargeHeader = props.isLargeHeader, isClose = props.isClose, hidden = props.hidden, isMultiline = props.isMultiline, draggableHeaderClassName = props.draggableHeaderClassName;\n    var palette = theme.palette, fonts = theme.fonts, effects = theme.effects, semanticColors = theme.semanticColors;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$5, theme);\n    return {\n      content: [\n        isLargeHeader && [\n          classNames2.contentLgHeader,\n          {\n            borderTop: \"4px solid \".concat(palette.themePrimary)\n          }\n        ],\n        isClose && classNames2.close,\n        {\n          flexGrow: 1,\n          overflowY: \"hidden\"\n          // required for allowScrollOnElement\n        },\n        className2\n      ],\n      subText: [\n        classNames2.subText,\n        fonts.medium,\n        {\n          margin: \"0 0 24px 0\",\n          color: semanticColors.bodySubtext,\n          lineHeight: \"1.5\",\n          wordWrap: \"break-word\",\n          fontWeight: FontWeights.regular\n        }\n      ],\n      header: [\n        classNames2.header,\n        {\n          position: \"relative\",\n          width: \"100%\",\n          boxSizing: \"border-box\"\n        },\n        isClose && classNames2.close,\n        draggableHeaderClassName && [\n          draggableHeaderClassName,\n          {\n            cursor: \"move\"\n          }\n        ]\n      ],\n      button: [\n        classNames2.button,\n        hidden && {\n          selectors: {\n            \".ms-Icon.ms-Icon--Cancel\": {\n              color: semanticColors.buttonText,\n              fontSize: IconFontSizes.medium\n            }\n          }\n        }\n      ],\n      inner: [\n        classNames2.inner,\n        {\n          padding: \"0 24px 24px\",\n          selectors: (_a2 = {}, _a2[\"@media (min-width: \".concat(ScreenWidthMinSmall, \"px) and (max-width: \").concat(ScreenWidthMaxSmall, \"px)\")] = {\n            padding: \"0 16px 16px\"\n          }, _a2)\n        }\n      ],\n      innerContent: [\n        classNames2.content,\n        {\n          position: \"relative\",\n          width: \"100%\"\n        }\n      ],\n      title: [\n        classNames2.title,\n        fonts.xLarge,\n        {\n          color: semanticColors.bodyText,\n          margin: \"0\",\n          minHeight: fonts.xLarge.fontSize,\n          padding: \"16px 46px 20px 24px\",\n          lineHeight: \"normal\",\n          selectors: (_b2 = {}, _b2[\"@media (min-width: \".concat(ScreenWidthMinSmall, \"px) and (max-width: \").concat(ScreenWidthMaxSmall, \"px)\")] = {\n            padding: \"16px 46px 16px 16px\"\n          }, _b2)\n        },\n        isLargeHeader && {\n          color: semanticColors.menuHeader\n        },\n        isMultiline && { fontSize: fonts.xxLarge.fontSize }\n      ],\n      topButton: [\n        {\n          display: \"flex\",\n          flexDirection: \"row\",\n          flexWrap: \"nowrap\",\n          position: \"absolute\",\n          top: \"0\",\n          right: \"0\",\n          padding: \"15px 15px 0 0\",\n          selectors: (_c2 = {\n            \"> *\": {\n              flex: \"0 0 auto\"\n            },\n            \".ms-Dialog-button\": {\n              color: semanticColors.buttonText\n            },\n            \".ms-Dialog-button:hover\": {\n              color: semanticColors.buttonTextHovered,\n              borderRadius: effects.roundedCorner2\n            }\n          }, _c2[\"@media (min-width: \".concat(ScreenWidthMinSmall, \"px) and (max-width: \").concat(ScreenWidthMaxSmall, \"px)\")] = {\n            padding: \"15px 8px 0 0\"\n          }, _c2)\n        }\n      ]\n    };\n  };\n  var DialogContent = styled(DialogContentBase, getStyles$7, void 0, { scope: \"DialogContent\" });\n  DialogContent.displayName = \"DialogContent\";\n  var getClassNames$6 = classNamesFunction();\n  var DefaultModalProps = {\n    isDarkOverlay: false,\n    isBlocking: false,\n    className: \"\",\n    containerClassName: \"\",\n    topOffsetFixed: false,\n    enableAriaHiddenSiblings: true\n  };\n  var DefaultDialogContentProps = {\n    type: DialogType.normal,\n    className: \"\",\n    topButtonsProps: []\n  };\n  var DialogBase = (\n    /** @class */\n    (function(_super) {\n      __extends(DialogBase2, _super);\n      function DialogBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._getSubTextId = function() {\n          var _a2 = _this.props, ariaDescribedById = _a2.ariaDescribedById, modalProps = _a2.modalProps, dialogContentProps = _a2.dialogContentProps, subText = _a2.subText;\n          var id2 = modalProps && modalProps.subtitleAriaId || ariaDescribedById;\n          if (!id2) {\n            id2 = (dialogContentProps && dialogContentProps.subText || subText) && _this._defaultSubTextId;\n          }\n          return id2;\n        };\n        _this._getTitleTextId = function() {\n          var _a2 = _this.props, ariaLabelledById = _a2.ariaLabelledById, modalProps = _a2.modalProps, dialogContentProps = _a2.dialogContentProps, title = _a2.title;\n          var id2 = modalProps && modalProps.titleAriaId || ariaLabelledById;\n          if (!id2) {\n            id2 = (dialogContentProps && dialogContentProps.title || title) && _this._defaultTitleTextId;\n          }\n          return id2;\n        };\n        _this._id = getId(\"Dialog\");\n        _this._defaultTitleTextId = _this._id + \"-title\";\n        _this._defaultSubTextId = _this._id + \"-subText\";\n        return _this;\n      }\n      DialogBase2.prototype.render = function() {\n        var _a2, _b2, _c2;\n        var props = this.props;\n        var className2 = props.className, containerClassName = props.containerClassName, contentClassName = props.contentClassName, elementToFocusOnDismiss = props.elementToFocusOnDismiss, firstFocusableSelector = props.firstFocusableSelector, forceFocusInsideTrap = props.forceFocusInsideTrap, styles = props.styles, hidden = props.hidden, _d2 = props.disableRestoreFocus, disableRestoreFocus = _d2 === void 0 ? props.ignoreExternalFocusing : _d2, isBlocking = props.isBlocking, isClickableOutsideFocusTrap = props.isClickableOutsideFocusTrap, isDarkOverlay = props.isDarkOverlay, _e2 = props.isOpen, isOpen = _e2 === void 0 ? !hidden : _e2, onDismiss = props.onDismiss, onDismissed = props.onDismissed, onLayerDidMount = props.onLayerDidMount, responsiveMode = props.responsiveMode, subText = props.subText, theme = props.theme, title = props.title, topButtonsProps = props.topButtonsProps, type2 = props.type, minWidth2 = props.minWidth, maxWidth = props.maxWidth, modalProps = props.modalProps;\n        var mergedLayerProps = __assign$1({ onLayerDidMount }, modalProps === null || modalProps === void 0 ? void 0 : modalProps.layerProps);\n        var dialogDraggableClassName;\n        var dragOptions;\n        if ((modalProps === null || modalProps === void 0 ? void 0 : modalProps.dragOptions) && !((_a2 = modalProps.dragOptions) === null || _a2 === void 0 ? void 0 : _a2.dragHandleSelector)) {\n          dragOptions = __assign$1({}, modalProps.dragOptions);\n          dialogDraggableClassName = \"ms-Dialog-draggable-header\";\n          dragOptions.dragHandleSelector = \".\".concat(dialogDraggableClassName);\n        }\n        var mergedModalProps = __assign$1(__assign$1(__assign$1(__assign$1({}, DefaultModalProps), { elementToFocusOnDismiss, firstFocusableSelector, forceFocusInsideTrap, disableRestoreFocus, isClickableOutsideFocusTrap, responsiveMode, className: className2, containerClassName, isBlocking, isDarkOverlay, onDismissed }), modalProps), { dragOptions, layerProps: mergedLayerProps, isOpen });\n        var dialogContentProps = __assign$1(__assign$1(__assign$1({ className: contentClassName, subText, title, topButtonsProps, type: type2 }, DefaultDialogContentProps), props.dialogContentProps), { draggableHeaderClassName: dialogDraggableClassName, titleProps: __assign$1({\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          id: ((_b2 = props.dialogContentProps) === null || _b2 === void 0 ? void 0 : _b2.titleId) || this._defaultTitleTextId\n        }, (_c2 = props.dialogContentProps) === null || _c2 === void 0 ? void 0 : _c2.titleProps) });\n        var classNames2 = getClassNames$6(styles, {\n          theme,\n          className: mergedModalProps.className,\n          containerClassName: mergedModalProps.containerClassName,\n          hidden,\n          dialogDefaultMinWidth: minWidth2,\n          dialogDefaultMaxWidth: maxWidth\n        });\n        return React__namespace.createElement(\n          Modal,\n          __assign$1({}, mergedModalProps, { className: classNames2.root, containerClassName: classNames2.main, onDismiss: onDismiss || mergedModalProps.onDismiss, subtitleAriaId: this._getSubTextId(), titleAriaId: this._getTitleTextId() }),\n          React__namespace.createElement(DialogContent, __assign$1({ subTextId: this._defaultSubTextId, showCloseButton: mergedModalProps.isBlocking, onDismiss }, dialogContentProps), props.children)\n        );\n      };\n      DialogBase2.defaultProps = {\n        hidden: true\n      };\n      DialogBase2 = __decorate([\n        withResponsiveMode\n      ], DialogBase2);\n      return DialogBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$4 = {\n    root: \"ms-Dialog\"\n  };\n  var getStyles$6 = function(props) {\n    var _a2;\n    var className2 = props.className, containerClassName = props.containerClassName, _b2 = props.dialogDefaultMinWidth, dialogDefaultMinWidth = _b2 === void 0 ? \"288px\" : _b2, _c2 = props.dialogDefaultMaxWidth, dialogDefaultMaxWidth = _c2 === void 0 ? \"340px\" : _c2, hidden = props.hidden, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$4, theme);\n    return {\n      root: [classNames2.root, theme.fonts.medium, className2],\n      main: [\n        {\n          width: dialogDefaultMinWidth,\n          outline: \"3px solid transparent\",\n          selectors: (_a2 = {}, _a2[\"@media (min-width: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n            width: \"auto\",\n            maxWidth: dialogDefaultMaxWidth,\n            minWidth: dialogDefaultMinWidth\n          }, _a2)\n        },\n        !hidden && { display: \"flex\" },\n        containerClassName\n      ]\n    };\n  };\n  var Dialog = styled(DialogBase, getStyles$6, void 0, { scope: \"Dialog\" });\n  Dialog.displayName = \"Dialog\";\n  var DropdownSizePosCache = (\n    /** @class */\n    (function() {\n      function DropdownSizePosCache2() {\n        this._size = 0;\n      }\n      DropdownSizePosCache2.prototype.updateOptions = function(options2) {\n        var displayOnlyOptionsCache = [];\n        var notSelectableOptionsCache = [];\n        var size = 0;\n        for (var i = 0; i < options2.length; i++) {\n          var _a2 = options2[i], itemType = _a2.itemType, hidden = _a2.hidden;\n          if (itemType === SelectableOptionMenuItemType.Divider || itemType === SelectableOptionMenuItemType.Header) {\n            displayOnlyOptionsCache.push(i);\n            notSelectableOptionsCache.push(i);\n          } else if (hidden) {\n            notSelectableOptionsCache.push(i);\n          } else {\n            size++;\n          }\n        }\n        this._size = size;\n        this._displayOnlyOptionsCache = displayOnlyOptionsCache;\n        this._notSelectableOptionsCache = notSelectableOptionsCache;\n        this._cachedOptions = __spreadArray([], options2, true);\n      };\n      Object.defineProperty(DropdownSizePosCache2.prototype, \"optionSetSize\", {\n        /**\n         * The size of all the selectable options.\n         */\n        get: function() {\n          return this._size;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(DropdownSizePosCache2.prototype, \"cachedOptions\", {\n        /**\n         * The chached options array.\n         */\n        get: function() {\n          return this._cachedOptions;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      DropdownSizePosCache2.prototype.positionInSet = function(index2) {\n        if (index2 === void 0) {\n          return void 0;\n        }\n        var offset2 = 0;\n        while (index2 > this._notSelectableOptionsCache[offset2]) {\n          offset2++;\n        }\n        if (this._displayOnlyOptionsCache[offset2] === index2) {\n          throw new Error(\"Unexpected: Option at index \".concat(index2, \" is not a selectable element.\"));\n        }\n        if (this._notSelectableOptionsCache[offset2] === index2) {\n          return void 0;\n        }\n        return index2 - offset2 + 1;\n      };\n      return DropdownSizePosCache2;\n    })()\n  );\n  var PanelType;\n  (function(PanelType2) {\n    PanelType2[PanelType2[\"smallFluid\"] = 0] = \"smallFluid\";\n    PanelType2[PanelType2[\"smallFixedFar\"] = 1] = \"smallFixedFar\";\n    PanelType2[PanelType2[\"smallFixedNear\"] = 2] = \"smallFixedNear\";\n    PanelType2[PanelType2[\"medium\"] = 3] = \"medium\";\n    PanelType2[PanelType2[\"large\"] = 4] = \"large\";\n    PanelType2[PanelType2[\"largeFixed\"] = 5] = \"largeFixed\";\n    PanelType2[PanelType2[\"extraLarge\"] = 6] = \"extraLarge\";\n    PanelType2[PanelType2[\"custom\"] = 7] = \"custom\";\n    PanelType2[PanelType2[\"customNear\"] = 8] = \"customNear\";\n  })(PanelType || (PanelType = {}));\n  var getClassNames$5 = classNamesFunction();\n  var PanelVisibilityState;\n  (function(PanelVisibilityState2) {\n    PanelVisibilityState2[PanelVisibilityState2[\"closed\"] = 0] = \"closed\";\n    PanelVisibilityState2[PanelVisibilityState2[\"animatingOpen\"] = 1] = \"animatingOpen\";\n    PanelVisibilityState2[PanelVisibilityState2[\"open\"] = 2] = \"open\";\n    PanelVisibilityState2[PanelVisibilityState2[\"animatingClosed\"] = 3] = \"animatingClosed\";\n  })(PanelVisibilityState || (PanelVisibilityState = {}));\n  var PanelBase = (\n    /** @class */\n    (function(_super) {\n      __extends(PanelBase2, _super);\n      function PanelBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._panel = React__namespace.createRef();\n        _this._animationCallback = null;\n        _this._hasCustomNavigation = !!(_this.props.onRenderNavigation || _this.props.onRenderNavigationContent);\n        _this.dismiss = function(ev) {\n          if (_this.props.onDismiss && _this.isActive) {\n            _this.props.onDismiss(ev);\n          }\n          if (!ev || ev && !ev.defaultPrevented) {\n            _this.close();\n          }\n        };\n        _this._allowScrollOnPanel = function(elt) {\n          var _a3;\n          _this._resizeObserver = _this._createResizeObserver(function(entries) {\n            if (entries.length > 0 && entries[0].target === elt) {\n              _this._updateFooterPosition();\n            }\n          });\n          if (elt) {\n            (_a3 = _this._resizeObserver) === null || _a3 === void 0 ? void 0 : _a3.observe(elt);\n            if (_this._allowTouchBodyScroll) {\n              allowOverscrollOnElement(elt, _this._events);\n            } else {\n              allowScrollOnElement(elt, _this._events);\n            }\n          } else {\n            _this._events.off(_this._scrollableContent);\n          }\n          _this._scrollableContent = elt;\n        };\n        _this._onRenderNavigation = function(props2) {\n          if (!_this.props.onRenderNavigationContent && !_this.props.onRenderNavigation && !_this.props.hasCloseButton) {\n            return null;\n          }\n          var _a3 = _this.props.onRenderNavigationContent, onRenderNavigationContent = _a3 === void 0 ? _this._onRenderNavigationContent : _a3;\n          return React__namespace.createElement(\"div\", { className: _this._classNames.navigation }, onRenderNavigationContent(props2, _this._onRenderNavigationContent));\n        };\n        _this._onRenderNavigationContent = function(props2) {\n          var _a3;\n          var closeButtonAriaLabel = props2.closeButtonAriaLabel, hasCloseButton = props2.hasCloseButton, _b2 = props2.onRenderHeader, onRenderHeader = _b2 === void 0 ? _this._onRenderHeader : _b2;\n          if (hasCloseButton) {\n            var iconButtonStyles = (_a3 = _this._classNames.subComponentStyles) === null || _a3 === void 0 ? void 0 : _a3.closeButton();\n            return React__namespace.createElement(\n              React__namespace.Fragment,\n              null,\n              !_this._hasCustomNavigation && onRenderHeader(_this.props, _this._onRenderHeader, _this._headerTextId),\n              React__namespace.createElement(IconButton, { styles: iconButtonStyles, className: _this._classNames.closeButton, onClick: _this._onPanelClick, ariaLabel: closeButtonAriaLabel, title: closeButtonAriaLabel, \"data-is-visible\": true, iconProps: { iconName: \"Cancel\" } })\n            );\n          }\n          return null;\n        };\n        _this._onRenderHeader = function(props2, defaultRender, headerTextId) {\n          var headerText = props2.headerText, _a3 = props2.headerTextProps, headerTextProps = _a3 === void 0 ? {} : _a3;\n          if (headerText) {\n            return React__namespace.createElement(\n              \"div\",\n              { className: _this._classNames.header },\n              React__namespace.createElement(\"div\", __assign$1({ id: headerTextId, role: \"heading\", \"aria-level\": 1 }, headerTextProps, { className: css(_this._classNames.headerText, headerTextProps.className) }), headerText)\n            );\n          }\n          return null;\n        };\n        _this._onRenderBody = function(props2) {\n          return React__namespace.createElement(\"div\", { className: _this._classNames.content }, props2.children);\n        };\n        _this._onRenderFooter = function(props2) {\n          var _a3 = _this.props.onRenderFooterContent, onRenderFooterContent = _a3 === void 0 ? null : _a3;\n          if (onRenderFooterContent) {\n            return React__namespace.createElement(\n              \"div\",\n              { className: _this._classNames.footer },\n              React__namespace.createElement(\"div\", { className: _this._classNames.footerInner }, onRenderFooterContent())\n            );\n          }\n          return null;\n        };\n        _this._animateTo = function(newVisibilityState) {\n          if (newVisibilityState === PanelVisibilityState.open && _this.props.onOpen) {\n            _this.props.onOpen();\n          }\n          _this._animationCallback = _this._async.setTimeout(function() {\n            _this.setState({ visibility: newVisibilityState });\n            _this._onTransitionComplete(newVisibilityState);\n          }, 200);\n        };\n        _this._clearExistingAnimationTimer = function() {\n          if (_this._animationCallback !== null) {\n            _this._async.clearTimeout(_this._animationCallback);\n          }\n        };\n        _this._onPanelClick = function(ev) {\n          _this.dismiss(ev);\n        };\n        _this._onTransitionComplete = function(newVisibilityState) {\n          _this._updateFooterPosition();\n          if (newVisibilityState === PanelVisibilityState.open && _this.props.onOpened) {\n            _this.props.onOpened();\n          }\n          if (newVisibilityState === PanelVisibilityState.closed && _this.props.onDismissed) {\n            _this.props.onDismissed();\n          }\n        };\n        var _a2 = _this.props.allowTouchBodyScroll, allowTouchBodyScroll = _a2 === void 0 ? false : _a2;\n        _this._allowTouchBodyScroll = allowTouchBodyScroll;\n        initializeComponentRef(_this);\n        _this.state = {\n          isFooterSticky: false,\n          // intentionally ignore props so animation takes place during componentDidMount\n          visibility: PanelVisibilityState.closed,\n          id: getId(\"Panel\")\n        };\n        return _this;\n      }\n      PanelBase2.getDerivedStateFromProps = function(nextProps, prevState) {\n        if (nextProps.isOpen === void 0) {\n          return null;\n        }\n        if (nextProps.isOpen && (prevState.visibility === PanelVisibilityState.closed || prevState.visibility === PanelVisibilityState.animatingClosed)) {\n          return { visibility: PanelVisibilityState.animatingOpen };\n        }\n        if (!nextProps.isOpen && (prevState.visibility === PanelVisibilityState.open || prevState.visibility === PanelVisibilityState.animatingOpen)) {\n          return { visibility: PanelVisibilityState.animatingClosed };\n        }\n        return null;\n      };\n      PanelBase2.prototype.componentDidMount = function() {\n        this._async = new Async(this);\n        this._events = new EventGroup(this);\n        var win = getWindowEx(this.context);\n        var doc = getDocumentEx(this.context);\n        this._events.on(win, \"resize\", this._updateFooterPosition);\n        if (this._shouldListenForOuterClick(this.props)) {\n          this._events.on(doc === null || doc === void 0 ? void 0 : doc.body, \"mousedown\", this._dismissOnOuterClick, true);\n        }\n        if (this.props.isOpen) {\n          this.setState({ visibility: PanelVisibilityState.animatingOpen });\n        }\n      };\n      PanelBase2.prototype.componentDidUpdate = function(previousProps, previousState) {\n        var shouldListenOnOuterClick = this._shouldListenForOuterClick(this.props);\n        var previousShouldListenOnOuterClick = this._shouldListenForOuterClick(previousProps);\n        if (this.state.visibility !== previousState.visibility) {\n          this._clearExistingAnimationTimer();\n          if (this.state.visibility === PanelVisibilityState.animatingOpen) {\n            this._animateTo(PanelVisibilityState.open);\n          } else if (this.state.visibility === PanelVisibilityState.animatingClosed) {\n            this._animateTo(PanelVisibilityState.closed);\n          }\n        }\n        var doc = getDocumentEx(this.context);\n        if (shouldListenOnOuterClick && !previousShouldListenOnOuterClick) {\n          this._events.on(doc === null || doc === void 0 ? void 0 : doc.body, \"mousedown\", this._dismissOnOuterClick, true);\n        } else if (!shouldListenOnOuterClick && previousShouldListenOnOuterClick) {\n          this._events.off(doc === null || doc === void 0 ? void 0 : doc.body, \"mousedown\", this._dismissOnOuterClick, true);\n        }\n      };\n      PanelBase2.prototype.componentWillUnmount = function() {\n        var _a2;\n        this._async.dispose();\n        this._events.dispose();\n        (_a2 = this._resizeObserver) === null || _a2 === void 0 ? void 0 : _a2.disconnect();\n      };\n      PanelBase2.prototype.render = function() {\n        var _a2 = this.props, _b2 = _a2.className, className2 = _b2 === void 0 ? \"\" : _b2, elementToFocusOnDismiss = _a2.elementToFocusOnDismiss, firstFocusableSelector = _a2.firstFocusableSelector, focusTrapZoneProps = _a2.focusTrapZoneProps, forceFocusInsideTrap = _a2.forceFocusInsideTrap, hasCloseButton = _a2.hasCloseButton, headerText = _a2.headerText, _c2 = _a2.headerClassName, headerClassName = _c2 === void 0 ? \"\" : _c2, ignoreExternalFocusing = _a2.ignoreExternalFocusing, isBlocking = _a2.isBlocking, isFooterAtBottom = _a2.isFooterAtBottom, isLightDismiss = _a2.isLightDismiss, isHiddenOnDismiss = _a2.isHiddenOnDismiss, layerProps = _a2.layerProps, overlayProps = _a2.overlayProps, popupProps = _a2.popupProps, type2 = _a2.type, styles = _a2.styles, theme = _a2.theme, customWidth = _a2.customWidth, _d2 = _a2.onLightDismissClick, onLightDismissClick = _d2 === void 0 ? this._onPanelClick : _d2, _e2 = _a2.onRenderNavigation, onRenderNavigation = _e2 === void 0 ? this._onRenderNavigation : _e2, _f = _a2.onRenderHeader, onRenderHeader = _f === void 0 ? this._onRenderHeader : _f, _g = _a2.onRenderBody, onRenderBody = _g === void 0 ? this._onRenderBody : _g, _h = _a2.onRenderFooter, onRenderFooter = _h === void 0 ? this._onRenderFooter : _h;\n        var _j = this.state, isFooterSticky = _j.isFooterSticky, visibility = _j.visibility, id2 = _j.id;\n        var isLeft = type2 === PanelType.smallFixedNear || type2 === PanelType.customNear ? true : false;\n        var isRTL = getRTL(theme);\n        var isOnRightSide = isRTL ? isLeft : !isLeft;\n        var customWidthStyles = type2 === PanelType.custom || type2 === PanelType.customNear ? { width: customWidth } : {};\n        var nativeProps = getNativeProps(this.props, divProperties);\n        var isOpen = this.isActive;\n        var isAnimating = visibility === PanelVisibilityState.animatingClosed || visibility === PanelVisibilityState.animatingOpen;\n        this._headerTextId = headerText && id2 + \"-headerText\";\n        if (!isOpen && !isAnimating && !isHiddenOnDismiss) {\n          return null;\n        }\n        this._classNames = getClassNames$5(styles, {\n          theme,\n          className: className2,\n          focusTrapZoneClassName: focusTrapZoneProps ? focusTrapZoneProps.className : void 0,\n          hasCloseButton,\n          headerClassName,\n          isAnimating,\n          isFooterSticky,\n          isFooterAtBottom,\n          isOnRightSide,\n          isOpen,\n          isHiddenOnDismiss,\n          type: type2,\n          hasCustomNavigation: this._hasCustomNavigation\n        });\n        var _k = this, _classNames = _k._classNames, _allowTouchBodyScroll = _k._allowTouchBodyScroll;\n        var overlay;\n        if (isBlocking && isOpen) {\n          overlay = React__namespace.createElement(Overlay, __assign$1({ className: _classNames.overlay, isDarkThemed: false, onClick: isLightDismiss ? onLightDismissClick : void 0, allowTouchBodyScroll: _allowTouchBodyScroll }, overlayProps));\n        }\n        return React__namespace.createElement(\n          Layer,\n          __assign$1({}, layerProps),\n          React__namespace.createElement(\n            Popup,\n            __assign$1({ role: \"dialog\", \"aria-modal\": isBlocking ? \"true\" : void 0, ariaLabelledBy: this._headerTextId ? this._headerTextId : void 0, onDismiss: this.dismiss, className: _classNames.hiddenPanel, enableAriaHiddenSiblings: isOpen ? true : false }, popupProps),\n            React__namespace.createElement(\n              \"div\",\n              __assign$1({ \"aria-hidden\": !isOpen && isAnimating }, nativeProps, { ref: this._panel, className: _classNames.root }),\n              overlay,\n              React__namespace.createElement(\n                FocusTrapZone,\n                __assign$1({ ignoreExternalFocusing, forceFocusInsideTrap: !isBlocking || isHiddenOnDismiss && !isOpen ? false : forceFocusInsideTrap, firstFocusableSelector, isClickableOutsideFocusTrap: true }, focusTrapZoneProps, { className: _classNames.main, style: customWidthStyles, elementToFocusOnDismiss }),\n                React__namespace.createElement(\n                  \"div\",\n                  { className: _classNames.contentInner },\n                  React__namespace.createElement(\n                    \"div\",\n                    { ref: this._allowScrollOnPanel, className: _classNames.scrollableContent, \"data-is-scrollable\": true },\n                    React__namespace.createElement(\"div\", { className: _classNames.commands, \"data-is-visible\": true }, onRenderNavigation(this.props, this._onRenderNavigation)),\n                    (this._hasCustomNavigation || !hasCloseButton) && onRenderHeader(this.props, this._onRenderHeader, this._headerTextId),\n                    onRenderBody(this.props, this._onRenderBody),\n                    onRenderFooter(this.props, this._onRenderFooter)\n                  )\n                )\n              )\n            )\n          )\n        );\n      };\n      PanelBase2.prototype.open = function() {\n        if (this.props.isOpen !== void 0) {\n          return;\n        }\n        if (this.isActive) {\n          return;\n        }\n        this.setState({ visibility: PanelVisibilityState.animatingOpen });\n      };\n      PanelBase2.prototype.close = function() {\n        if (this.props.isOpen !== void 0) {\n          return;\n        }\n        if (!this.isActive) {\n          return;\n        }\n        this.setState({ visibility: PanelVisibilityState.animatingClosed });\n      };\n      Object.defineProperty(PanelBase2.prototype, \"isActive\", {\n        /** isActive is true when panel is open or opening. */\n        get: function() {\n          return this.state.visibility === PanelVisibilityState.open || this.state.visibility === PanelVisibilityState.animatingOpen;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      PanelBase2.prototype._createResizeObserver = function(callback) {\n        var _a2;\n        var doc = getDocumentEx(this.context);\n        var resizeObserver = null;\n        if ((_a2 = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _a2 === void 0 ? void 0 : _a2.ResizeObserver) {\n          resizeObserver = new doc.defaultView.ResizeObserver(callback);\n        }\n        return resizeObserver;\n      };\n      PanelBase2.prototype._shouldListenForOuterClick = function(props) {\n        return !!props.isBlocking && !!props.isOpen;\n      };\n      PanelBase2.prototype._updateFooterPosition = function() {\n        var scrollableContent = this._scrollableContent;\n        if (scrollableContent) {\n          var height2 = scrollableContent.clientHeight;\n          var innerHeight_1 = scrollableContent.scrollHeight;\n          this.setState({\n            isFooterSticky: height2 < innerHeight_1 ? true : false\n          });\n        }\n      };\n      PanelBase2.prototype._dismissOnOuterClick = function(ev) {\n        var panel = this._panel.current;\n        if (this.isActive && panel && !ev.defaultPrevented) {\n          if (!elementContains(panel, ev.target)) {\n            if (this.props.onOuterClick) {\n              this.props.onOuterClick(ev);\n            } else {\n              this.dismiss(ev);\n            }\n          }\n        }\n      };\n      PanelBase2.defaultProps = {\n        isHiddenOnDismiss: false,\n        isOpen: void 0,\n        isBlocking: true,\n        hasCloseButton: true,\n        type: PanelType.smallFixedFar\n      };\n      PanelBase2.contextType = WindowContext;\n      return PanelBase2;\n    })(React__namespace.Component)\n  );\n  var _a$1, _b$1, _c$1, _d$1, _e$1;\n  var GlobalClassNames$3 = {\n    root: \"ms-Panel\",\n    main: \"ms-Panel-main\",\n    commands: \"ms-Panel-commands\",\n    contentInner: \"ms-Panel-contentInner\",\n    scrollableContent: \"ms-Panel-scrollableContent\",\n    navigation: \"ms-Panel-navigation\",\n    closeButton: \"ms-Panel-closeButton ms-PanelAction-close\",\n    header: \"ms-Panel-header\",\n    headerText: \"ms-Panel-headerText\",\n    content: \"ms-Panel-content\",\n    footer: \"ms-Panel-footer\",\n    footerInner: \"ms-Panel-footerInner\",\n    isOpen: \"is-open\",\n    hasCloseButton: \"ms-Panel--hasCloseButton\",\n    smallFluid: \"ms-Panel--smFluid\",\n    smallFixedNear: \"ms-Panel--smLeft\",\n    smallFixedFar: \"ms-Panel--sm\",\n    medium: \"ms-Panel--md\",\n    large: \"ms-Panel--lg\",\n    largeFixed: \"ms-Panel--fixed\",\n    extraLarge: \"ms-Panel--xl\",\n    custom: \"ms-Panel--custom\",\n    customNear: \"ms-Panel--customLeft\"\n  };\n  var panelWidth = {\n    full: \"100%\",\n    auto: \"auto\",\n    xs: 272,\n    sm: 340,\n    md1: 592,\n    md2: 644,\n    lg: 940\n  };\n  var panelMargin = {\n    auto: \"auto\",\n    none: 0,\n    md: 48,\n    lg: 428,\n    xl: 176\n  };\n  var smallPanelSelectors = (_a$1 = {}, _a$1[\"@media (min-width: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n    width: panelWidth.sm\n  }, _a$1);\n  var mediumPanelSelectors = (_b$1 = {}, _b$1[\"@media (min-width: \".concat(ScreenWidthMinLarge, \"px)\")] = {\n    width: panelWidth.md1\n  }, _b$1[\"@media (min-width: \".concat(ScreenWidthMinXLarge, \"px)\")] = {\n    width: panelWidth.md2\n  }, _b$1);\n  var largePanelSelectors = (_c$1 = {}, _c$1[\"@media (min-width: \".concat(ScreenWidthMinUhfMobile, \"px)\")] = {\n    left: panelMargin.md,\n    width: panelWidth.auto\n  }, _c$1[\"@media (min-width: \".concat(ScreenWidthMinXXLarge, \"px)\")] = {\n    left: panelMargin.lg\n  }, _c$1);\n  var largeFixedPanelSelectors = (_d$1 = {}, _d$1[\"@media (min-width: \".concat(ScreenWidthMinXXLarge, \"px)\")] = {\n    left: panelMargin.auto,\n    width: panelWidth.lg\n  }, _d$1);\n  var extraLargePanelSelectors = (_e$1 = {}, _e$1[\"@media (min-width: \".concat(ScreenWidthMinXXLarge, \"px)\")] = {\n    left: panelMargin.xl\n  }, _e$1);\n  var getPanelBreakpoints = function(type2) {\n    var selectors;\n    switch (type2) {\n      case PanelType.smallFixedFar:\n        selectors = __assign$1({}, smallPanelSelectors);\n        break;\n      case PanelType.medium:\n        selectors = __assign$1(__assign$1({}, smallPanelSelectors), mediumPanelSelectors);\n        break;\n      case PanelType.large:\n        selectors = __assign$1(__assign$1(__assign$1({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors);\n        break;\n      case PanelType.largeFixed:\n        selectors = __assign$1(__assign$1(__assign$1(__assign$1({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors), largeFixedPanelSelectors);\n        break;\n      case PanelType.extraLarge:\n        selectors = __assign$1(__assign$1(__assign$1(__assign$1({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors), extraLargePanelSelectors);\n        break;\n    }\n    return selectors;\n  };\n  var commandBarHeight = \"44px\";\n  var sharedPaddingStyles = {\n    paddingLeft: \"24px\",\n    paddingRight: \"24px\"\n  };\n  var getStyles$5 = function(props) {\n    var _a2, _b2, _c2, _d2;\n    var className2 = props.className, focusTrapZoneClassName = props.focusTrapZoneClassName, hasCloseButton = props.hasCloseButton, headerClassName = props.headerClassName, isAnimating = props.isAnimating, isFooterSticky = props.isFooterSticky, isFooterAtBottom = props.isFooterAtBottom, isOnRightSide = props.isOnRightSide, isOpen = props.isOpen, isHiddenOnDismiss = props.isHiddenOnDismiss, hasCustomNavigation = props.hasCustomNavigation, theme = props.theme, _e2 = props.type, type2 = _e2 === void 0 ? PanelType.smallFixedFar : _e2;\n    var effects = theme.effects, fonts = theme.fonts, semanticColors = theme.semanticColors;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$3, theme);\n    var isCustomPanel = type2 === PanelType.custom || type2 === PanelType.customNear;\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        isOpen && classNames2.isOpen,\n        hasCloseButton && classNames2.hasCloseButton,\n        {\n          pointerEvents: \"none\",\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0\n        },\n        isCustomPanel && isOnRightSide && classNames2.custom,\n        isCustomPanel && !isOnRightSide && classNames2.customNear,\n        className2\n      ],\n      overlay: [\n        {\n          pointerEvents: \"auto\",\n          cursor: \"pointer\"\n        },\n        isOpen && isAnimating && AnimationClassNames.fadeIn100,\n        !isOpen && isAnimating && AnimationClassNames.fadeOut100\n      ],\n      hiddenPanel: [\n        !isOpen && !isAnimating && isHiddenOnDismiss && {\n          visibility: \"hidden\"\n        }\n      ],\n      main: [\n        classNames2.main,\n        {\n          backgroundColor: semanticColors.bodyBackground,\n          boxShadow: effects.elevation64,\n          pointerEvents: \"auto\",\n          position: \"absolute\",\n          display: \"flex\",\n          flexDirection: \"column\",\n          overflowX: \"hidden\",\n          overflowY: \"auto\",\n          WebkitOverflowScrolling: \"touch\",\n          bottom: 0,\n          top: 0,\n          // left, right, width are overridden depending on the type of the Panel and the screen breakpoint.\n          left: panelMargin.auto,\n          right: panelMargin.none,\n          width: panelWidth.full,\n          selectors: __assign$1((_a2 = {}, _a2[HighContrastSelector] = {\n            borderLeft: \"3px solid \".concat(semanticColors.variantBorder),\n            borderRight: \"3px solid \".concat(semanticColors.variantBorder)\n          }, _a2), getPanelBreakpoints(type2))\n        },\n        type2 === PanelType.smallFluid && {\n          left: panelMargin.none\n        },\n        type2 === PanelType.smallFixedNear && {\n          left: panelMargin.none,\n          right: panelMargin.auto,\n          width: panelWidth.xs\n        },\n        type2 === PanelType.customNear && {\n          right: \"auto\",\n          left: 0\n        },\n        isCustomPanel && {\n          maxWidth: \"100vw\"\n        },\n        isOpen && isAnimating && !isOnRightSide && AnimationClassNames.slideRightIn40,\n        isOpen && isAnimating && isOnRightSide && AnimationClassNames.slideLeftIn40,\n        !isOpen && isAnimating && !isOnRightSide && AnimationClassNames.slideLeftOut40,\n        !isOpen && isAnimating && isOnRightSide && AnimationClassNames.slideRightOut40,\n        focusTrapZoneClassName\n      ],\n      commands: [\n        classNames2.commands,\n        {\n          // Ensures that the sticky header always has a background to prevent overlaps on scroll.\n          backgroundColor: semanticColors.bodyBackground,\n          paddingTop: 18,\n          selectors: (_b2 = {}, _b2[\"@media (min-height: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n            position: \"sticky\",\n            top: 0,\n            zIndex: 1\n          }, _b2)\n        },\n        hasCustomNavigation && {\n          paddingTop: \"inherit\"\n        }\n      ],\n      navigation: [\n        classNames2.navigation,\n        {\n          display: \"flex\",\n          justifyContent: \"flex-end\"\n        },\n        hasCustomNavigation && {\n          height: commandBarHeight\n        }\n      ],\n      contentInner: [\n        classNames2.contentInner,\n        {\n          display: \"flex\",\n          flexDirection: \"column\",\n          flexGrow: 1,\n          overflowY: \"hidden\"\n        }\n      ],\n      header: [\n        classNames2.header,\n        sharedPaddingStyles,\n        {\n          alignSelf: \"flex-start\"\n        },\n        hasCloseButton && !hasCustomNavigation && {\n          flexGrow: 1\n        },\n        hasCustomNavigation && {\n          // Ensure that title doesn't shrink if screen is too small\n          flexShrink: 0\n        }\n      ],\n      headerText: [\n        classNames2.headerText,\n        fonts.xLarge,\n        {\n          color: semanticColors.bodyText,\n          lineHeight: \"27px\",\n          overflowWrap: \"break-word\",\n          wordWrap: \"break-word\",\n          wordBreak: \"break-word\",\n          hyphens: \"auto\"\n        },\n        headerClassName\n      ],\n      scrollableContent: [\n        classNames2.scrollableContent,\n        {\n          overflowY: \"auto\"\n        },\n        isFooterAtBottom && {\n          flexGrow: 1,\n          display: \"inherit\",\n          flexDirection: \"inherit\"\n        }\n      ],\n      content: [\n        classNames2.content,\n        sharedPaddingStyles,\n        {\n          paddingBottom: 20\n        },\n        isFooterAtBottom && {\n          selectors: (_c2 = {}, _c2[\"@media (min-height: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n            flexGrow: 1\n          }, _c2)\n        }\n      ],\n      footer: [\n        classNames2.footer,\n        {\n          // Ensure that footer doesn't shrink if screen is too small\n          flexShrink: 0,\n          borderTop: \"1px solid transparent\",\n          transition: \"opacity \".concat(AnimationVariables.durationValue3, \" \").concat(AnimationVariables.easeFunction2),\n          selectors: (_d2 = {}, _d2[\"@media (min-height: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n            position: \"sticky\",\n            bottom: 0\n          }, _d2)\n        },\n        isFooterSticky && {\n          backgroundColor: semanticColors.bodyBackground,\n          borderTopColor: semanticColors.variantBorder\n        }\n      ],\n      footerInner: [\n        classNames2.footerInner,\n        sharedPaddingStyles,\n        {\n          paddingBottom: 16,\n          paddingTop: 16\n        }\n      ],\n      subComponentStyles: {\n        closeButton: {\n          root: [\n            classNames2.closeButton,\n            {\n              marginRight: 14,\n              color: theme.palette.neutralSecondary,\n              fontSize: IconFontSizes.large\n            },\n            hasCustomNavigation && {\n              marginRight: 0,\n              height: \"auto\",\n              width: \"44px\"\n            }\n          ],\n          rootHovered: {\n            color: theme.palette.neutralPrimary\n          }\n        }\n      }\n    };\n  };\n  var Panel = styled(PanelBase, getStyles$5, void 0, {\n    scope: \"Panel\"\n  });\n  var getClassNames$4 = classNamesFunction();\n  var DEFAULT_PROPS = {\n    options: []\n  };\n  function useSelectedItemsState(_a2) {\n    var defaultSelectedKeys = _a2.defaultSelectedKeys, selectedKeys = _a2.selectedKeys, defaultSelectedKey = _a2.defaultSelectedKey, selectedKey = _a2.selectedKey, options2 = _a2.options, multiSelect = _a2.multiSelect;\n    var oldOptions = usePrevious(options2);\n    var _b2 = React__namespace.useState([]), selectedIndices = _b2[0], setSelectedIndices = _b2[1];\n    var selectedKeyPropToUse;\n    var didOptionsChange = options2 !== oldOptions;\n    if (multiSelect) {\n      if (didOptionsChange && defaultSelectedKeys !== void 0) {\n        selectedKeyPropToUse = defaultSelectedKeys;\n      } else {\n        selectedKeyPropToUse = selectedKeys;\n      }\n    } else {\n      if (didOptionsChange && defaultSelectedKey !== void 0) {\n        selectedKeyPropToUse = defaultSelectedKey;\n      } else {\n        selectedKeyPropToUse = selectedKey;\n      }\n    }\n    var oldSelectedKeyProp = usePrevious(selectedKeyPropToUse);\n    React__namespace.useEffect(function() {\n      var getSelectedIndexes = function() {\n        if (selectedKeyPropToUse === void 0) {\n          if (multiSelect) {\n            return getAllSelectedIndices();\n          }\n          var selectedIndex = getSelectedIndex(null);\n          return selectedIndex !== -1 ? [selectedIndex] : [];\n        } else if (!Array.isArray(selectedKeyPropToUse)) {\n          var selectedIndex = getSelectedIndex(selectedKeyPropToUse);\n          return selectedIndex !== -1 ? [selectedIndex] : [];\n        }\n        var returnValue = [];\n        for (var _i = 0, selectedKeyPropToUse_1 = selectedKeyPropToUse; _i < selectedKeyPropToUse_1.length; _i++) {\n          var key2 = selectedKeyPropToUse_1[_i];\n          var selectedIndex = getSelectedIndex(key2);\n          selectedIndex !== -1 && returnValue.push(selectedIndex);\n        }\n        return returnValue;\n      };\n      var getAllSelectedIndices = function() {\n        return options2.map(function(option, index2) {\n          return option.selected ? index2 : -1;\n        }).filter(function(index2) {\n          return index2 !== -1;\n        });\n      };\n      var getSelectedIndex = function(searchKey) {\n        return findIndex(options2, function(option) {\n          if (searchKey != null) {\n            return option.key === searchKey;\n          } else {\n            return !!option.selected || !!option.isSelected;\n          }\n        });\n      };\n      if ((selectedKeyPropToUse !== void 0 || !oldOptions) && (selectedKeyPropToUse !== oldSelectedKeyProp || didOptionsChange)) {\n        setSelectedIndices(getSelectedIndexes());\n      }\n    }, [didOptionsChange, multiSelect, oldOptions, oldSelectedKeyProp, options2, selectedKeyPropToUse]);\n    return [selectedIndices, setSelectedIndices];\n  }\n  var DropdownBase = React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var props = getPropsWithDefaults(DEFAULT_PROPS, propsWithoutDefaults);\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRef = useMergedRefs(forwardedRef, rootRef);\n    var responsiveMode = useResponsiveMode(rootRef, props.responsiveMode);\n    var _a2 = useSelectedItemsState(props), selectedIndices = _a2[0], setSelectedIndices = _a2[1];\n    return React__namespace.createElement(DropdownInternal, __assign$1({}, props, { responsiveMode, hoisted: { rootRef: mergedRootRef, selectedIndices, setSelectedIndices } }));\n  });\n  DropdownBase.displayName = \"DropdownBase\";\n  var DropdownInternal = (\n    /** @class */\n    (function(_super) {\n      __extends(DropdownInternal2, _super);\n      function DropdownInternal2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._host = React__namespace.createRef();\n        _this._focusZone = React__namespace.createRef();\n        _this._dropDown = React__namespace.createRef();\n        _this._scrollIdleDelay = 250;\n        _this._sizePosCache = new DropdownSizePosCache();\n        _this._requestAnimationFrame = safeRequestAnimationFrame(_this);\n        _this.dismissMenu = function() {\n          var isOpen = _this.state.isOpen;\n          isOpen && _this.setState({ isOpen: false });\n        };\n        _this._onChange = function(event2, options22, index2, checked, multiSelect2) {\n          var _a2 = _this.props, onChange = _a2.onChange, onChanged = _a2.onChanged;\n          if (onChange || onChanged) {\n            var changedOpt = multiSelect2 ? __assign$1(__assign$1({}, options22[index2]), { selected: !checked }) : options22[index2];\n            onChange && onChange(__assign$1(__assign$1({}, event2), { target: _this._dropDown.current }), changedOpt, index2);\n            onChanged && onChanged(changedOpt, index2);\n          }\n        };\n        _this._getPlaceholder = function() {\n          return _this.props.placeholder || _this.props.placeHolder;\n        };\n        _this._getTitle = function(items, _unused) {\n          var _a2 = _this.props.multiSelectDelimiter, multiSelectDelimiter = _a2 === void 0 ? \", \" : _a2;\n          return items.map(function(i) {\n            return i.text;\n          }).join(multiSelectDelimiter);\n        };\n        _this._onRenderTitle = function(items) {\n          return React__namespace.createElement(React__namespace.Fragment, null, _this._getTitle(items));\n        };\n        _this._onRenderPlaceholder = function(props2) {\n          if (!_this._getPlaceholder()) {\n            return null;\n          }\n          return React__namespace.createElement(React__namespace.Fragment, null, _this._getPlaceholder());\n        };\n        _this._onRenderContainer = function(props2) {\n          var calloutProps = props2.calloutProps, panelProps = props2.panelProps;\n          var _a2 = _this.props, responsiveMode = _a2.responsiveMode, dropdownWidth2 = _a2.dropdownWidth;\n          var isSmall = responsiveMode <= ResponsiveMode.medium;\n          var focusTrapZoneProps = { firstFocusableTarget: \"#\".concat(_this._listId, \"1\") };\n          var panelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.panel : void 0;\n          var calloutWidth = void 0;\n          var calloutMinWidth = void 0;\n          if (dropdownWidth2 === \"auto\") {\n            calloutMinWidth = _this._dropDown.current ? _this._dropDown.current.clientWidth : 0;\n          } else {\n            calloutWidth = dropdownWidth2 || (_this._dropDown.current ? _this._dropDown.current.clientWidth : 0);\n          }\n          return isSmall ? React__namespace.createElement(Panel, __assign$1({ closeButtonAriaLabel: \"Close\", focusTrapZoneProps, hasCloseButton: true, isOpen: true, isLightDismiss: true, onDismiss: _this._onDismiss, styles: panelStyles }, panelProps), _this._renderFocusableList(props2)) : React__namespace.createElement(Callout, __assign$1({ isBeakVisible: false, gapSpace: 0, doNotLayer: false, directionalHintFixed: false, directionalHint: DirectionalHint.bottomLeftEdge, calloutWidth, calloutMinWidth }, calloutProps, { className: _this._classNames.callout, target: _this._dropDown.current, onDismiss: _this._onDismiss, onScroll: _this._onScroll, onPositioned: _this._onPositioned }), _this._renderFocusableList(props2));\n        };\n        _this._onRenderCaretDown = function(props2) {\n          return React__namespace.createElement(Icon, { className: _this._classNames.caretDown, iconName: \"ChevronDown\", \"aria-hidden\": true });\n        };\n        _this._onRenderList = function(props2) {\n          var _a2 = props2.onRenderItem, onRenderItem = _a2 === void 0 ? _this._onRenderItem : _a2;\n          var queue = { items: [] };\n          var renderedList = [];\n          var emptyQueue = function() {\n            var newGroup = queue.id ? [\n              React__namespace.createElement(\"div\", { role: \"group\", key: queue.id, \"aria-labelledby\": queue.id }, queue.items)\n            ] : queue.items;\n            renderedList = __spreadArray(__spreadArray([], renderedList, true), newGroup, true);\n            queue = { items: [] };\n          };\n          var placeRenderedOptionIntoQueue = function(item, index2) {\n            switch (item.itemType) {\n              case SelectableOptionMenuItemType.Header:\n                queue.items.length > 0 && emptyQueue();\n                var id2 = _this._id + item.key;\n                queue.items.push(onRenderItem(__assign$1(__assign$1({ id: id2 }, item), { index: index2 }), _this._onRenderItem));\n                queue.id = id2;\n                break;\n              case SelectableOptionMenuItemType.Divider:\n                index2 > 0 && queue.items.push(onRenderItem(__assign$1(__assign$1({}, item), { index: index2 }), _this._onRenderItem));\n                queue.items.length > 0 && emptyQueue();\n                break;\n              default:\n                queue.items.push(onRenderItem(__assign$1(__assign$1({}, item), { index: index2 }), _this._onRenderItem));\n            }\n          };\n          props2.options.forEach(function(item, index2) {\n            placeRenderedOptionIntoQueue(item, index2);\n          });\n          queue.items.length > 0 && emptyQueue();\n          return React__namespace.createElement(React__namespace.Fragment, null, renderedList);\n        };\n        _this._onRenderItem = function(item) {\n          switch (item.itemType) {\n            case SelectableOptionMenuItemType.Divider:\n              return _this._renderSeparator(item);\n            case SelectableOptionMenuItemType.Header:\n              return _this._renderHeader(item);\n            default:\n              return _this._renderOption(item);\n          }\n        };\n        _this._renderOption = function(item) {\n          var _a2;\n          var _b2 = _this.props, _c2 = _b2.onRenderOption, onRenderOption = _c2 === void 0 ? _this._onRenderOption : _c2, _d2 = _b2.hoisted.selectedIndices, selectedIndices = _d2 === void 0 ? [] : _d2;\n          var isItemSelected = item.index !== void 0 && selectedIndices ? selectedIndices.indexOf(item.index) > -1 : false;\n          var itemClassName = item.hidden ? _this._classNames.dropdownItemHidden : isItemSelected && item.disabled === true ? _this._classNames.dropdownItemSelectedAndDisabled : isItemSelected ? _this._classNames.dropdownItemSelected : item.disabled === true ? _this._classNames.dropdownItemDisabled : _this._classNames.dropdownItem;\n          var title = item.title;\n          var id2 = _this._listId + item.index;\n          var labelId = (_a2 = item.id) !== null && _a2 !== void 0 ? _a2 : id2 + \"-label\";\n          var multiSelectItemStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.multiSelectItem : void 0;\n          return !_this.props.multiSelect ? React__namespace.createElement(CommandButton, {\n            id: id2,\n            key: item.key,\n            \"data-index\": item.index,\n            \"data-is-focusable\": !item.disabled,\n            disabled: item.disabled,\n            className: itemClassName,\n            onClick: _this._onItemClick(item),\n            // eslint-disable-next-line react/jsx-no-bind\n            onMouseEnter: _this._onItemMouseEnter.bind(_this, item),\n            // eslint-disable-next-line react/jsx-no-bind\n            onMouseLeave: _this._onMouseItemLeave.bind(_this, item),\n            // eslint-disable-next-line react/jsx-no-bind\n            onMouseMove: _this._onItemMouseMove.bind(_this, item),\n            role: \"option\",\n            \"aria-selected\": isItemSelected ? \"true\" : \"false\",\n            ariaLabel: item.ariaLabel,\n            title,\n            \"aria-posinset\": _this._sizePosCache.positionInSet(item.index),\n            \"aria-setsize\": _this._sizePosCache.optionSetSize\n          }, onRenderOption(item, _this._onRenderOption)) : React__namespace.createElement(Checkbox, {\n            id: id2,\n            key: item.key,\n            disabled: item.disabled,\n            onChange: _this._onItemClick(item),\n            inputProps: __assign$1({ \"aria-selected\": isItemSelected, onMouseEnter: _this._onItemMouseEnter.bind(_this, item), onMouseLeave: _this._onMouseItemLeave.bind(_this, item), onMouseMove: _this._onItemMouseMove.bind(_this, item), role: \"option\" }, {\n              \"data-index\": item.index,\n              \"data-is-focusable\": !(item.disabled || item.hidden)\n            }),\n            label: item.text,\n            title,\n            // eslint-disable-next-line react/jsx-no-bind\n            onRenderLabel: _this._onRenderItemLabel.bind(_this, __assign$1(__assign$1({}, item), { id: labelId })),\n            className: css(itemClassName, \"is-multi-select\"),\n            checked: isItemSelected,\n            styles: multiSelectItemStyles,\n            ariaPositionInSet: !item.hidden ? _this._sizePosCache.positionInSet(item.index) : void 0,\n            ariaSetSize: !item.hidden ? _this._sizePosCache.optionSetSize : void 0,\n            ariaLabel: item.ariaLabel,\n            ariaLabelledBy: item.ariaLabel ? void 0 : labelId\n          });\n        };\n        _this._onRenderOption = function(item) {\n          return React__namespace.createElement(\"span\", { className: _this._classNames.dropdownOptionText }, item.text);\n        };\n        _this._onRenderMultiselectOption = function(item) {\n          return React__namespace.createElement(\"span\", { id: item.id, \"aria-hidden\": \"true\", className: _this._classNames.dropdownOptionText }, item.text);\n        };\n        _this._onRenderItemLabel = function(item) {\n          var _a2 = _this.props.onRenderOption, onRenderOption = _a2 === void 0 ? _this._onRenderMultiselectOption : _a2;\n          return onRenderOption(item, _this._onRenderMultiselectOption);\n        };\n        _this._onPositioned = function(positions2) {\n          if (_this._focusZone.current) {\n            _this._requestAnimationFrame(function() {\n              var selectedIndices = _this.props.hoisted.selectedIndices;\n              if (_this._focusZone.current) {\n                if (!_this._hasBeenPositioned && selectedIndices && selectedIndices[0] && !_this.props.options[selectedIndices[0]].disabled) {\n                  var element2 = getDocument().getElementById(\"\".concat(_this._id, \"-list\").concat(selectedIndices[0]));\n                  if (element2) {\n                    _this._focusZone.current.focusElement(element2);\n                  }\n                  _this._hasBeenPositioned = true;\n                } else {\n                  _this._focusZone.current.focus();\n                }\n              }\n            });\n          }\n          if (!_this.state.calloutRenderEdge || _this.state.calloutRenderEdge !== positions2.targetEdge) {\n            _this.setState({\n              calloutRenderEdge: positions2.targetEdge\n            });\n          }\n        };\n        _this._onItemClick = function(item) {\n          return function(event2) {\n            if (!item.disabled) {\n              _this.setSelectedIndex(event2, item.index);\n              if (!_this.props.multiSelect) {\n                _this.setState({\n                  isOpen: false\n                });\n              }\n            }\n          };\n        };\n        _this._onScroll = function() {\n          var win = getWindowEx(_this.context);\n          if (!_this._isScrollIdle && _this._scrollIdleTimeoutId !== void 0) {\n            win.clearTimeout(_this._scrollIdleTimeoutId);\n            _this._scrollIdleTimeoutId = void 0;\n          } else {\n            _this._isScrollIdle = false;\n          }\n          _this._scrollIdleTimeoutId = win.setTimeout(function() {\n            _this._isScrollIdle = true;\n          }, _this._scrollIdleDelay);\n        };\n        _this._onMouseItemLeave = function(item, ev) {\n          if (_this._shouldIgnoreMouseEvent()) {\n            return;\n          }\n          if (_this._host.current) {\n            if (_this._host.current.setActive) {\n              try {\n                _this._host.current.setActive();\n              } catch (e) {\n              }\n            } else {\n              _this._host.current.focus();\n            }\n          }\n        };\n        _this._onDismiss = function() {\n          _this.setState({ isOpen: false });\n        };\n        _this._onDropdownBlur = function(ev) {\n          var disabled = _this._isDisabled();\n          if (disabled) {\n            return;\n          }\n          if (_this.state.isOpen) {\n            return;\n          }\n          _this.setState({ hasFocus: false });\n          if (_this.props.onBlur) {\n            _this.props.onBlur(ev);\n          }\n        };\n        _this._onDropdownKeyDown = function(ev) {\n          var disabled = _this._isDisabled();\n          if (disabled) {\n            return;\n          }\n          _this._lastKeyDownWasAltOrMeta = _this._isAltOrMeta(ev);\n          if (_this.props.onKeyDown) {\n            _this.props.onKeyDown(ev);\n            if (ev.defaultPrevented) {\n              return;\n            }\n          }\n          var newIndex;\n          var selectedIndex = _this.props.hoisted.selectedIndices.length ? _this.props.hoisted.selectedIndices[0] : -1;\n          var containsExpandCollapseModifier = ev.altKey || ev.metaKey;\n          var isOpen = _this.state.isOpen;\n          switch (ev.which) {\n            case KeyCodes.enter:\n              _this.setState({\n                isOpen: !isOpen\n              });\n              break;\n            case KeyCodes.escape:\n              if (!isOpen) {\n                return;\n              }\n              _this.setState({\n                isOpen: false\n              });\n              break;\n            case KeyCodes.up:\n              if (containsExpandCollapseModifier) {\n                if (isOpen) {\n                  _this.setState({ isOpen: false });\n                  break;\n                }\n                return;\n              }\n              if (_this.props.multiSelect) {\n                _this.setState({ isOpen: true });\n              } else if (!_this._isDisabled()) {\n                newIndex = _this._moveIndex(ev, -1, selectedIndex - 1, selectedIndex);\n              }\n              break;\n            case KeyCodes.down:\n              if (containsExpandCollapseModifier) {\n                ev.stopPropagation();\n                ev.preventDefault();\n              }\n              if (containsExpandCollapseModifier && !isOpen || _this.props.multiSelect) {\n                _this.setState({ isOpen: true });\n              } else if (!_this._isDisabled()) {\n                newIndex = _this._moveIndex(ev, 1, selectedIndex + 1, selectedIndex);\n              }\n              break;\n            case KeyCodes.home:\n              if (!_this.props.multiSelect) {\n                newIndex = _this._moveIndex(ev, 1, 0, selectedIndex);\n              }\n              break;\n            case KeyCodes.end:\n              if (!_this.props.multiSelect) {\n                newIndex = _this._moveIndex(ev, -1, _this.props.options.length - 1, selectedIndex);\n              }\n              break;\n            case KeyCodes.space:\n              break;\n            default:\n              return;\n          }\n          if (newIndex !== selectedIndex) {\n            ev.stopPropagation();\n            ev.preventDefault();\n          }\n        };\n        _this._onDropdownKeyUp = function(ev) {\n          var disabled = _this._isDisabled();\n          if (disabled) {\n            return;\n          }\n          var shouldHandleKey = _this._shouldHandleKeyUp(ev);\n          var isOpen = _this.state.isOpen;\n          if (_this.props.onKeyUp) {\n            _this.props.onKeyUp(ev);\n            if (ev.defaultPrevented) {\n              return;\n            }\n          }\n          switch (ev.which) {\n            case KeyCodes.space:\n              _this.setState({\n                isOpen: !isOpen\n              });\n              break;\n            default:\n              if (shouldHandleKey && isOpen) {\n                _this.setState({ isOpen: false });\n              }\n              return;\n          }\n          ev.stopPropagation();\n          ev.preventDefault();\n        };\n        _this._onZoneKeyDown = function(ev) {\n          var _a2, _b2;\n          var elementToFocus;\n          _this._lastKeyDownWasAltOrMeta = _this._isAltOrMeta(ev);\n          var containsExpandCollapseModifier = ev.altKey || ev.metaKey;\n          switch (ev.which) {\n            case KeyCodes.up:\n              if (containsExpandCollapseModifier) {\n                _this.setState({ isOpen: false });\n              } else {\n                if (_this._host.current) {\n                  elementToFocus = getLastFocusable(_this._host.current, _this._host.current.lastChild, true);\n                }\n              }\n              break;\n            // All directional keystrokes should be canceled when the zone is rendered.\n            // This avoids the body scroll from reacting and thus dismissing the dropdown.\n            case KeyCodes.home:\n            case KeyCodes.end:\n            case KeyCodes.pageUp:\n            case KeyCodes.pageDown:\n              break;\n            case KeyCodes.down:\n              if (!containsExpandCollapseModifier && _this._host.current) {\n                elementToFocus = getFirstFocusable(_this._host.current, _this._host.current.firstChild, true);\n              }\n              break;\n            case KeyCodes.escape:\n              _this.setState({ isOpen: false });\n              break;\n            case KeyCodes.tab:\n              _this.setState({ isOpen: false });\n              var document_1 = getDocument();\n              if (document_1) {\n                if (ev.shiftKey) {\n                  (_a2 = getPreviousElement(document_1.body, _this._dropDown.current, false, false, true, true)) === null || _a2 === void 0 ? void 0 : _a2.focus();\n                } else {\n                  (_b2 = getNextElement(document_1.body, _this._dropDown.current, false, false, true, true)) === null || _b2 === void 0 ? void 0 : _b2.focus();\n                }\n              }\n              break;\n            default:\n              return;\n          }\n          if (elementToFocus) {\n            elementToFocus.focus();\n          }\n          ev.stopPropagation();\n          ev.preventDefault();\n        };\n        _this._onZoneKeyUp = function(ev) {\n          var shouldHandleKey = _this._shouldHandleKeyUp(ev);\n          if (shouldHandleKey && _this.state.isOpen) {\n            _this.setState({ isOpen: false });\n            ev.preventDefault();\n          }\n        };\n        _this._onDropdownClick = function(ev) {\n          if (_this.props.onClick) {\n            _this.props.onClick(ev);\n            if (ev.defaultPrevented) {\n              return;\n            }\n          }\n          var isOpen = _this.state.isOpen;\n          var disabled = _this._isDisabled();\n          if (!disabled && !_this._shouldOpenOnFocus()) {\n            _this.setState({\n              isOpen: !isOpen\n            });\n          }\n          _this._isFocusedByClick = false;\n        };\n        _this._onDropdownMouseDown = function() {\n          _this._isFocusedByClick = true;\n        };\n        _this._onFocus = function(ev) {\n          var disabled = _this._isDisabled();\n          if (!disabled) {\n            if (_this.props.onFocus) {\n              _this.props.onFocus(ev);\n            }\n            var state = { hasFocus: true };\n            if (_this._shouldOpenOnFocus()) {\n              state.isOpen = true;\n            }\n            _this.setState(state);\n          }\n        };\n        _this._isDisabled = function() {\n          var disabled = _this.props.disabled;\n          var isDisabled = _this.props.isDisabled;\n          if (disabled === void 0) {\n            disabled = isDisabled;\n          }\n          return disabled;\n        };\n        _this._onRenderLabel = function(props2) {\n          var label2 = props2.label, required2 = props2.required, disabled = props2.disabled;\n          var labelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.label : void 0;\n          return label2 ? React__namespace.createElement(Label$2, { className: _this._classNames.label, id: _this._labelId, required: required2, styles: labelStyles, disabled }, label2) : null;\n        };\n        initializeComponentRef(_this);\n        props.multiSelect;\n        props.selectedKey;\n        props.selectedKeys;\n        props.defaultSelectedKey;\n        props.defaultSelectedKeys;\n        var options2 = props.options;\n        _this._id = props.id || getId(\"Dropdown\");\n        _this._labelId = _this._id + \"-label\";\n        _this._listId = _this._id + \"-list\";\n        _this._optionId = _this._id + \"-option\";\n        _this._isScrollIdle = true;\n        _this._hasBeenPositioned = false;\n        _this._sizePosCache.updateOptions(options2);\n        _this.state = {\n          isOpen: false,\n          hasFocus: false,\n          calloutRenderEdge: void 0\n        };\n        return _this;\n      }\n      Object.defineProperty(DropdownInternal2.prototype, \"selectedOptions\", {\n        /**\n         * All selected options\n         */\n        get: function() {\n          var _a2 = this.props, options2 = _a2.options, selectedIndices = _a2.hoisted.selectedIndices;\n          return getAllSelectedOptions(options2, selectedIndices);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      DropdownInternal2.prototype.componentWillUnmount = function() {\n        clearTimeout(this._scrollIdleTimeoutId);\n      };\n      DropdownInternal2.prototype.componentDidUpdate = function(prevProps, prevState) {\n        if (prevState.isOpen === true && this.state.isOpen === false) {\n          this._gotMouseMove = false;\n          this._hasBeenPositioned = false;\n          if (this.props.onDismiss) {\n            this.props.onDismiss();\n          }\n        }\n      };\n      DropdownInternal2.prototype.render = function() {\n        var id2 = this._id;\n        var props = this.props;\n        var className2 = props.className, label2 = props.label, options2 = props.options, ariaLabel2 = props.ariaLabel, required2 = props.required, errorMessage = props.errorMessage, propStyles = props.styles, theme = props.theme, panelProps = props.panelProps, calloutProps = props.calloutProps, _a2 = props.onRenderTitle, onRenderTitle = _a2 === void 0 ? this._getTitle : _a2, _b2 = props.onRenderContainer, onRenderContainer = _b2 === void 0 ? this._onRenderContainer : _b2, _c2 = props.onRenderCaretDown, onRenderCaretDown = _c2 === void 0 ? this._onRenderCaretDown : _c2, _d2 = props.onRenderLabel, onRenderLabel = _d2 === void 0 ? this._onRenderLabel : _d2, _e2 = props.onRenderItem, onRenderItem = _e2 === void 0 ? this._onRenderItem : _e2, selectedIndices = props.hoisted.selectedIndices, responsiveMode = props.responsiveMode;\n        var _f = this.state, isOpen = _f.isOpen, calloutRenderEdge = _f.calloutRenderEdge, hasFocus = _f.hasFocus;\n        var onRenderPlaceholder = props.onRenderPlaceholder || props.onRenderPlaceHolder || this._getPlaceholder;\n        if (options2 !== this._sizePosCache.cachedOptions) {\n          this._sizePosCache.updateOptions(options2);\n        }\n        var selectedOptions = getAllSelectedOptions(options2, selectedIndices);\n        var divProps = getNativeProps(props, divProperties);\n        var disabled = this._isDisabled();\n        var isSmall = responsiveMode <= ResponsiveMode.medium;\n        var errorMessageId = id2 + \"-errorMessage\";\n        this._classNames = getClassNames$4(propStyles, {\n          theme,\n          className: className2,\n          hasError: !!(errorMessage && errorMessage.length > 0),\n          hasLabel: !!label2,\n          isOpen,\n          required: required2,\n          disabled,\n          isRenderingPlaceholder: !selectedOptions.length,\n          panelClassName: panelProps ? panelProps.className : void 0,\n          calloutClassName: calloutProps ? calloutProps.className : void 0,\n          calloutRenderEdge\n        });\n        var hasErrorMessage = !!errorMessage && errorMessage.length > 0;\n        return React__namespace.createElement(\n          \"div\",\n          { className: this._classNames.root, ref: this.props.hoisted.rootRef, \"aria-owns\": isOpen && !isSmall ? this._listId : void 0 },\n          onRenderLabel(this.props, this._onRenderLabel),\n          React__namespace.createElement(\n            \"div\",\n            __assign$1({ \"data-is-focusable\": !disabled, \"data-ktp-target\": true, ref: this._dropDown, id: id2, tabIndex: disabled ? -1 : 0, role: \"combobox\", \"aria-haspopup\": \"listbox\", \"aria-expanded\": isOpen ? \"true\" : \"false\", \"aria-label\": ariaLabel2, \"aria-labelledby\": label2 && !ariaLabel2 ? mergeAriaAttributeValues(this._labelId, this._optionId) : void 0, \"aria-describedby\": hasErrorMessage ? this._id + \"-errorMessage\" : void 0, \"aria-required\": required2, \"aria-disabled\": disabled, \"aria-invalid\": hasErrorMessage, \"aria-controls\": isOpen && !isSmall ? this._listId : void 0 }, divProps, { className: this._classNames.dropdown, onBlur: this._onDropdownBlur, onKeyDown: this._onDropdownKeyDown, onKeyUp: this._onDropdownKeyUp, onClick: this._onDropdownClick, onMouseDown: this._onDropdownMouseDown, onFocus: this._onFocus }),\n            React__namespace.createElement(\n              \"span\",\n              { id: this._optionId, className: this._classNames.title, \"aria-live\": hasFocus ? \"polite\" : void 0, \"aria-atomic\": hasFocus ? true : void 0 },\n              // If option is selected render title, otherwise render the placeholder text\n              selectedOptions.length ? onRenderTitle(selectedOptions, this._onRenderTitle) : onRenderPlaceholder(props, this._onRenderPlaceholder)\n            ),\n            React__namespace.createElement(\"span\", { className: this._classNames.caretDownWrapper }, onRenderCaretDown(props, this._onRenderCaretDown))\n          ),\n          isOpen && onRenderContainer(__assign$1(__assign$1({}, props), { onDismiss: this._onDismiss, onRenderItem }), this._onRenderContainer),\n          hasErrorMessage && React__namespace.createElement(\"div\", { role: \"alert\", id: errorMessageId, className: this._classNames.errorMessage }, errorMessage)\n        );\n      };\n      DropdownInternal2.prototype.focus = function(shouldOpenOnFocus) {\n        if (this._dropDown.current) {\n          this._dropDown.current.focus();\n          if (shouldOpenOnFocus) {\n            this.setState({\n              isOpen: true\n            });\n          }\n        }\n      };\n      DropdownInternal2.prototype.setSelectedIndex = function(event2, index2) {\n        var _a2 = this.props, options2 = _a2.options, selectedKey = _a2.selectedKey, selectedKeys = _a2.selectedKeys, multiSelect = _a2.multiSelect, notifyOnReselect = _a2.notifyOnReselect, _b2 = _a2.hoisted.selectedIndices, selectedIndices = _b2 === void 0 ? [] : _b2;\n        var checked = selectedIndices ? selectedIndices.indexOf(index2) > -1 : false;\n        var newIndexes = [];\n        index2 = Math.max(0, Math.min(options2.length - 1, index2));\n        if (selectedKey !== void 0 || selectedKeys !== void 0) {\n          this._onChange(event2, options2, index2, checked, multiSelect);\n          return;\n        }\n        if (!multiSelect && !notifyOnReselect && index2 === selectedIndices[0]) {\n          return;\n        } else if (multiSelect) {\n          newIndexes = selectedIndices ? this._copyArray(selectedIndices) : [];\n          if (checked) {\n            var position2 = newIndexes.indexOf(index2);\n            if (position2 > -1) {\n              newIndexes.splice(position2, 1);\n            }\n          } else {\n            newIndexes.push(index2);\n          }\n        } else {\n          newIndexes = [index2];\n        }\n        event2.persist();\n        this.props.hoisted.setSelectedIndices(newIndexes);\n        this._onChange(event2, options2, index2, checked, multiSelect);\n      };\n      DropdownInternal2.prototype._copyArray = function(array2) {\n        var newArray = [];\n        for (var _i = 0, array_1 = array2; _i < array_1.length; _i++) {\n          var element2 = array_1[_i];\n          newArray.push(element2);\n        }\n        return newArray;\n      };\n      DropdownInternal2.prototype._moveIndex = function(event2, stepValue, index2, selectedIndex) {\n        var options2 = this.props.options;\n        if (selectedIndex === index2 || options2.length === 0) {\n          return selectedIndex;\n        }\n        if (index2 >= options2.length) {\n          index2 = 0;\n        } else if (index2 < 0) {\n          index2 = options2.length - 1;\n        }\n        var stepCounter = 0;\n        while (options2[index2].itemType === SelectableOptionMenuItemType.Header || options2[index2].itemType === SelectableOptionMenuItemType.Divider || options2[index2].disabled) {\n          if (stepCounter >= options2.length) {\n            return selectedIndex;\n          }\n          if (index2 + stepValue < 0) {\n            index2 = options2.length;\n          } else if (index2 + stepValue >= options2.length) {\n            index2 = -1;\n          }\n          index2 = index2 + stepValue;\n          stepCounter++;\n        }\n        this.setSelectedIndex(event2, index2);\n        return index2;\n      };\n      DropdownInternal2.prototype._renderFocusableList = function(props) {\n        var _a2 = props.onRenderList, onRenderList = _a2 === void 0 ? this._onRenderList : _a2, label2 = props.label, ariaLabel2 = props.ariaLabel, multiSelect = props.multiSelect;\n        return React__namespace.createElement(\n          \"div\",\n          { className: this._classNames.dropdownItemsWrapper, onKeyDown: this._onZoneKeyDown, onKeyUp: this._onZoneKeyUp, ref: this._host, tabIndex: 0 },\n          React__namespace.createElement(FocusZone, { ref: this._focusZone, direction: FocusZoneDirection.vertical, id: this._listId, className: this._classNames.dropdownItems, role: \"listbox\", \"aria-label\": ariaLabel2, \"aria-labelledby\": label2 && !ariaLabel2 ? this._labelId : void 0, \"aria-multiselectable\": multiSelect }, onRenderList(props, this._onRenderList))\n        );\n      };\n      DropdownInternal2.prototype._renderSeparator = function(item) {\n        var index2 = item.index, key2 = item.key;\n        var separatorClassName = item.hidden ? this._classNames.dropdownDividerHidden : this._classNames.dropdownDivider;\n        if (index2 > 0) {\n          return React__namespace.createElement(\"div\", { role: \"presentation\", key: key2, className: separatorClassName });\n        }\n        return null;\n      };\n      DropdownInternal2.prototype._renderHeader = function(item) {\n        var _a2 = this.props.onRenderOption, onRenderOption = _a2 === void 0 ? this._onRenderOption : _a2;\n        var key2 = item.key, id2 = item.id;\n        var headerClassName = item.hidden ? this._classNames.dropdownItemHeaderHidden : this._classNames.dropdownItemHeader;\n        return React__namespace.createElement(\"div\", { id: id2, key: key2, className: headerClassName }, onRenderOption(item, this._onRenderOption));\n      };\n      DropdownInternal2.prototype._onItemMouseEnter = function(item, ev) {\n        if (this._shouldIgnoreMouseEvent()) {\n          return;\n        }\n        var targetElement = ev.currentTarget;\n        targetElement.focus();\n      };\n      DropdownInternal2.prototype._onItemMouseMove = function(item, ev) {\n        var doc = getDocumentEx(this.context);\n        var targetElement = ev.currentTarget;\n        this._gotMouseMove = true;\n        if (!this._isScrollIdle || doc.activeElement === targetElement) {\n          return;\n        }\n        targetElement.focus();\n      };\n      DropdownInternal2.prototype._shouldIgnoreMouseEvent = function() {\n        return !this._isScrollIdle || !this._gotMouseMove;\n      };\n      DropdownInternal2.prototype._isAltOrMeta = function(ev) {\n        return ev.which === KeyCodes.alt || ev.key === \"Meta\";\n      };\n      DropdownInternal2.prototype._shouldHandleKeyUp = function(ev) {\n        var keyPressIsAltOrMetaAlone = this._lastKeyDownWasAltOrMeta && this._isAltOrMeta(ev);\n        this._lastKeyDownWasAltOrMeta = false;\n        return !!keyPressIsAltOrMetaAlone && !(isMac() || isIOS());\n      };\n      DropdownInternal2.prototype._shouldOpenOnFocus = function() {\n        var hasFocus = this.state.hasFocus;\n        var openOnKeyboardFocus = this.props.openOnKeyboardFocus;\n        return !this._isFocusedByClick && openOnKeyboardFocus === true && !hasFocus;\n      };\n      DropdownInternal2.defaultProps = {\n        options: []\n      };\n      DropdownInternal2.contextType = WindowContext;\n      return DropdownInternal2;\n    })(React__namespace.Component)\n  );\n  var _a, _b, _c, _d, _e;\n  var GlobalClassNames$2 = {\n    root: \"ms-Dropdown-container\",\n    label: \"ms-Dropdown-label\",\n    dropdown: \"ms-Dropdown\",\n    title: \"ms-Dropdown-title\",\n    caretDownWrapper: \"ms-Dropdown-caretDownWrapper\",\n    caretDown: \"ms-Dropdown-caretDown\",\n    callout: \"ms-Dropdown-callout\",\n    panel: \"ms-Dropdown-panel\",\n    dropdownItems: \"ms-Dropdown-items\",\n    dropdownItem: \"ms-Dropdown-item\",\n    dropdownDivider: \"ms-Dropdown-divider\",\n    dropdownOptionText: \"ms-Dropdown-optionText\",\n    dropdownItemHeader: \"ms-Dropdown-header\",\n    titleIsPlaceHolder: \"ms-Dropdown-titleIsPlaceHolder\",\n    titleHasError: \"ms-Dropdown-title--hasError\"\n  };\n  var DROPDOWN_HEIGHT = 32;\n  var DROPDOWN_ITEM_HEIGHT = 36;\n  var highContrastAdjustMixin = (_a = {}, _a[\"\".concat(HighContrastSelector, \", \").concat(HighContrastSelectorWhite.replace(\"@media \", \"\"))] = __assign$1({}, getHighContrastNoAdjustStyle()), _a);\n  var highContrastItemAndTitleStateMixin = {\n    selectors: __assign$1((_b = {}, _b[HighContrastSelector] = (_c = {\n      backgroundColor: \"Highlight\",\n      borderColor: \"Highlight\",\n      color: \"HighlightText\"\n    }, _c[\".\".concat(IsFocusVisibleClassName, \" &:focus:after\")] = {\n      borderColor: \"HighlightText\"\n    }, _c), _b[\".ms-Checkbox-checkbox\"] = (_d = {}, _d[HighContrastSelector] = {\n      borderColor: \"HighlightText\"\n    }, _d), _b), highContrastAdjustMixin)\n  };\n  var highContrastBorderState = {\n    selectors: (_e = {}, _e[HighContrastSelector] = {\n      borderColor: \"Highlight\"\n    }, _e)\n  };\n  var MinimumScreenSelector = getScreenSelector(0, ScreenWidthMinMedium);\n  var getStyles$4 = function(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m;\n    var theme = props.theme, hasError = props.hasError, hasLabel = props.hasLabel, className2 = props.className, isOpen = props.isOpen, disabled = props.disabled, required2 = props.required, isRenderingPlaceholder = props.isRenderingPlaceholder, panelClassName = props.panelClassName, calloutClassName = props.calloutClassName, calloutRenderEdge = props.calloutRenderEdge;\n    if (!theme) {\n      throw new Error(\"theme is undefined or null in base Dropdown getStyles function.\");\n    }\n    var globalClassnames = getGlobalClassNames(GlobalClassNames$2, theme);\n    var palette = theme.palette, semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var rootHoverFocusActiveSelectorNeutralDarkMixin = {\n      color: semanticColors.menuItemTextHovered\n    };\n    var rootHoverFocusActiveSelectorNeutralPrimaryMixin = {\n      color: semanticColors.menuItemText\n    };\n    var borderColorError = {\n      borderColor: semanticColors.errorText\n    };\n    var dropdownItemStyle = [\n      globalClassnames.dropdownItem,\n      {\n        backgroundColor: \"transparent\",\n        boxSizing: \"border-box\",\n        cursor: \"pointer\",\n        display: \"flex\",\n        alignItems: \"center\",\n        padding: \"0 8px\",\n        width: \"100%\",\n        minHeight: DROPDOWN_ITEM_HEIGHT,\n        lineHeight: 20,\n        height: 0,\n        position: \"relative\",\n        border: \"1px solid transparent\",\n        borderRadius: 0,\n        wordWrap: \"break-word\",\n        overflowWrap: \"break-word\",\n        textAlign: \"left\",\n        \".ms-Button-flexContainer\": {\n          width: \"100%\"\n        }\n      }\n    ];\n    var dropdownHeaderStyle = [\n      globalClassnames.dropdownItemHeader,\n      __assign$1(__assign$1({}, fonts.medium), { fontWeight: FontWeights.semibold, color: semanticColors.menuHeader, background: \"none\", backgroundColor: \"transparent\", border: \"none\", height: DROPDOWN_ITEM_HEIGHT, lineHeight: DROPDOWN_ITEM_HEIGHT, cursor: \"default\", padding: \"0 8px\", userSelect: \"none\", textAlign: \"left\", selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _a2) })\n    ];\n    var selectedItemBackgroundColor = semanticColors.menuItemBackgroundPressed;\n    var itemSelectors = function(isSelected) {\n      var _a3, _b3;\n      if (isSelected === void 0) {\n        isSelected = false;\n      }\n      return {\n        selectors: (_a3 = {\n          \"&:hover\": [\n            {\n              color: semanticColors.menuItemTextHovered,\n              backgroundColor: !isSelected ? semanticColors.menuItemBackgroundHovered : selectedItemBackgroundColor\n            },\n            highContrastItemAndTitleStateMixin\n          ],\n          \"&.is-multi-select:hover\": [\n            { backgroundColor: !isSelected ? \"transparent\" : selectedItemBackgroundColor },\n            highContrastItemAndTitleStateMixin\n          ],\n          \"&:active:hover\": [\n            {\n              color: semanticColors.menuItemTextHovered,\n              backgroundColor: !isSelected ? semanticColors.menuItemBackgroundPressed : semanticColors.menuItemBackgroundHovered\n            },\n            highContrastItemAndTitleStateMixin\n          ]\n        }, _a3[\".\".concat(IsFocusVisibleClassName, \" &:focus:after, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:after\")] = (_b3 = {\n          left: 0,\n          top: 0,\n          bottom: 0,\n          right: 0\n        }, _b3[HighContrastSelector] = {\n          inset: \"2px\"\n        }, _b3), _a3[HighContrastSelector] = {\n          border: \"none\"\n        }, _a3)\n      };\n    };\n    var dropdownItemSelected = __spreadArray(__spreadArray([], dropdownItemStyle, true), [\n      {\n        backgroundColor: selectedItemBackgroundColor,\n        color: semanticColors.menuItemTextHovered\n      },\n      itemSelectors(true),\n      highContrastItemAndTitleStateMixin\n    ], false);\n    var dropdownItemDisabled = __spreadArray(__spreadArray([], dropdownItemStyle, true), [\n      {\n        color: semanticColors.disabledText,\n        cursor: \"default\",\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n          color: \"GrayText\",\n          border: \"none\"\n        }, _b2)\n      }\n    ], false);\n    var titleOpenBorderRadius = calloutRenderEdge === RectangleEdge.bottom ? \"\".concat(effects.roundedCorner2, \" \").concat(effects.roundedCorner2, \" 0 0\") : \"0 0 \".concat(effects.roundedCorner2, \" \").concat(effects.roundedCorner2);\n    var calloutOpenBorderRadius = calloutRenderEdge === RectangleEdge.bottom ? \"0 0 \".concat(effects.roundedCorner2, \" \").concat(effects.roundedCorner2) : \"\".concat(effects.roundedCorner2, \" \").concat(effects.roundedCorner2, \" 0 0\");\n    return {\n      root: [globalClassnames.root, className2],\n      label: globalClassnames.label,\n      dropdown: [\n        globalClassnames.dropdown,\n        normalize$1,\n        fonts.medium,\n        {\n          color: semanticColors.menuItemText,\n          borderColor: semanticColors.focusBorder,\n          position: \"relative\",\n          outline: 0,\n          userSelect: \"none\",\n          selectors: (_c2 = {}, _c2[\"&:hover .\" + globalClassnames.title] = [\n            !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n            { borderColor: isOpen ? palette.neutralSecondary : palette.neutralPrimary },\n            highContrastBorderState\n          ], _c2[\"&:focus .\" + globalClassnames.title] = [\n            !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n            { selectors: (_d2 = {}, _d2[HighContrastSelector] = { color: \"Highlight\" }, _d2) }\n          ], _c2[\"&:focus:after\"] = [\n            {\n              pointerEvents: \"none\",\n              content: \"''\",\n              position: \"absolute\",\n              boxSizing: \"border-box\",\n              top: \"0px\",\n              left: \"0px\",\n              width: \"100%\",\n              height: \"100%\",\n              // see https://github.com/microsoft/fluentui/pull/9182 for semantic color disc\n              border: !disabled ? \"2px solid \".concat(palette.themePrimary) : \"none\",\n              borderRadius: \"2px\",\n              selectors: (_e2 = {}, _e2[HighContrastSelector] = {\n                color: \"Highlight\"\n              }, _e2)\n            }\n          ], _c2[\"&:active .\" + globalClassnames.title] = [\n            !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n            { borderColor: palette.themePrimary },\n            highContrastBorderState\n          ], _c2[\"&:hover .\" + globalClassnames.caretDown] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:focus .\" + globalClassnames.caretDown] = [\n            !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin,\n            { selectors: (_f = {}, _f[HighContrastSelector] = { color: \"Highlight\" }, _f) }\n          ], _c2[\"&:active .\" + globalClassnames.caretDown] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:hover .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:focus .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:active .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:hover .\" + globalClassnames.titleHasError] = borderColorError, _c2[\"&:active .\" + globalClassnames.titleHasError] = borderColorError, _c2)\n        },\n        isOpen && \"is-open\",\n        disabled && \"is-disabled\",\n        required2 && \"is-required\",\n        required2 && !hasLabel && {\n          selectors: (_g = {\n            \":before\": {\n              content: \"'*'\",\n              color: semanticColors.errorText,\n              position: \"absolute\",\n              top: -5,\n              right: -10\n            }\n          }, _g[HighContrastSelector] = {\n            selectors: {\n              \":after\": {\n                right: -14\n                // moving the * 4 pixel to right to alleviate border clipping in HC mode.\n              }\n            }\n          }, _g)\n        }\n      ],\n      title: [\n        globalClassnames.title,\n        normalize$1,\n        {\n          backgroundColor: semanticColors.inputBackground,\n          borderWidth: 1,\n          borderStyle: \"solid\",\n          borderColor: semanticColors.inputBorder,\n          borderRadius: isOpen ? titleOpenBorderRadius : effects.roundedCorner2,\n          cursor: \"pointer\",\n          display: \"block\",\n          height: DROPDOWN_HEIGHT,\n          lineHeight: DROPDOWN_HEIGHT - 2,\n          padding: \"0 28px 0 8px\",\n          position: \"relative\",\n          overflow: \"hidden\",\n          whiteSpace: \"nowrap\",\n          textOverflow: \"ellipsis\"\n        },\n        isRenderingPlaceholder && [globalClassnames.titleIsPlaceHolder, { color: semanticColors.inputPlaceholderText }],\n        hasError && [globalClassnames.titleHasError, borderColorError],\n        disabled && {\n          backgroundColor: semanticColors.disabledBackground,\n          border: \"none\",\n          color: semanticColors.disabledText,\n          cursor: \"default\",\n          selectors: (_h = {}, _h[HighContrastSelector] = __assign$1({ border: \"1px solid GrayText\", color: \"GrayText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _h)\n        }\n      ],\n      caretDownWrapper: [\n        globalClassnames.caretDownWrapper,\n        {\n          height: DROPDOWN_HEIGHT,\n          lineHeight: DROPDOWN_HEIGHT - 2,\n          // height minus the border\n          paddingTop: 1,\n          position: \"absolute\",\n          right: 8,\n          top: 0\n        },\n        !disabled && {\n          cursor: \"pointer\"\n        }\n      ],\n      caretDown: [\n        globalClassnames.caretDown,\n        { color: palette.neutralSecondary, fontSize: fonts.small.fontSize, pointerEvents: \"none\" },\n        disabled && {\n          color: semanticColors.disabledText,\n          selectors: (_j = {}, _j[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _j)\n        }\n      ],\n      errorMessage: __assign$1(__assign$1({ color: semanticColors.errorText }, theme.fonts.small), { paddingTop: 5 }),\n      callout: [\n        globalClassnames.callout,\n        {\n          boxShadow: effects.elevation8,\n          borderRadius: calloutOpenBorderRadius,\n          selectors: (_k = {}, _k[\".ms-Callout-main\"] = { borderRadius: calloutOpenBorderRadius }, _k)\n        },\n        calloutClassName\n      ],\n      dropdownItemsWrapper: { selectors: { \"&:focus\": { outline: 0 } } },\n      dropdownItems: [globalClassnames.dropdownItems, { display: \"block\" }],\n      dropdownItem: __spreadArray(__spreadArray([], dropdownItemStyle, true), [itemSelectors()], false),\n      dropdownItemSelected,\n      dropdownItemDisabled,\n      dropdownItemSelectedAndDisabled: [dropdownItemSelected, dropdownItemDisabled, { backgroundColor: \"transparent\" }],\n      dropdownItemHidden: __spreadArray(__spreadArray([], dropdownItemStyle, true), [{ display: \"none\" }], false),\n      dropdownDivider: [globalClassnames.dropdownDivider, { height: 1, backgroundColor: semanticColors.bodyDivider }],\n      dropdownDividerHidden: [globalClassnames.dropdownDivider, { display: \"none\" }],\n      dropdownOptionText: [\n        globalClassnames.dropdownOptionText,\n        {\n          overflow: \"hidden\",\n          whiteSpace: \"nowrap\",\n          textOverflow: \"ellipsis\",\n          minWidth: 0,\n          maxWidth: \"100%\",\n          wordWrap: \"break-word\",\n          overflowWrap: \"break-word\",\n          margin: \"1px\"\n        }\n      ],\n      dropdownItemHeader: dropdownHeaderStyle,\n      dropdownItemHeaderHidden: __spreadArray(__spreadArray([], dropdownHeaderStyle, true), [{ display: \"none\" }], false),\n      subComponentStyles: {\n        label: { root: { display: \"inline-block\" } },\n        multiSelectItem: {\n          root: {\n            padding: 0\n          },\n          label: {\n            alignSelf: \"stretch\",\n            padding: \"0 8px\",\n            width: \"100%\"\n          },\n          input: {\n            selectors: (_l = {}, // eslint-disable-next-line @fluentui/max-len\n            _l[\".\".concat(IsFocusVisibleClassName, \" &:focus + label::before, :host(.\").concat(IsFocusVisibleClassName, \") &:focus + label::before\")] = {\n              outlineOffset: \"0px\"\n            }, _l)\n          }\n        },\n        panel: {\n          root: [panelClassName],\n          main: {\n            selectors: (_m = {}, // In case of extra small screen sizes\n            _m[MinimumScreenSelector] = {\n              // panelWidth xs\n              width: 272\n            }, _m)\n          },\n          contentInner: { padding: \"0 0 20px\" }\n        }\n      }\n    };\n  };\n  var Dropdown = styled(DropdownBase, getStyles$4, void 0, {\n    scope: \"Dropdown\"\n  });\n  Dropdown.displayName = \"Dropdown\";\n  const fabricIconsWoff = \"data:font/woff;base64,d09GRgABAAAAABuQAA4AAAAAMIgABKj2AAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEgAAABgMVN8b2NtYXAAAAGMAAABEAAAArIn/BeDY3Z0IAAAApwAAAAgAAAAKgnZCa9mcGdtAAACvAAAAPAAAAFZ/J7mjmdhc3AAAAOsAAAADAAAAAwACAAbZ2x5ZgAAA7gAABITAAAepM100RhoZWFkAAAVzAAAADIAAAA2BVACQGhoZWEAABYAAAAAFQAAACQQAQgDaG10eAAAFhgAAABQAAAAchoOED5sb2NhAAAWaAAAAHAAAABw0ZDZvG1heHAAABbYAAAAHQAAACAAWQIibmFtZQAAFvgAAAP3AAAJ+pKX8lVwb3N0AAAa8AAAABQAAAAg/1EArnByZXAAABsEAAAAiQAAANN4vfIOeJxjYGH/xDiBgZWBgXUWqzEDA6M0hGa+yJDGJMTBysrFyMQIBgxAIMCAAL7BCgoMDs95vzpzgPkQkgGsjgXCU2BgAAD3EghqeJxjYGBgZoBgGQZGIMnAuAbIYwTzWRgnAOkEBgcGVgaF57zP+Z8LPhd6Lvxc4rnMc6Xnvs8zn094PvX5sufLnx9+IfPC4cWUF9NeLH9x4sXvl6IvS17ufXnoFfNrjteX36x+s+bNqTen3zK9bXuX+W7m+/73Ez72fFz16dhnn8/Bn598Vfnq/P8/AwPYBgG4DYpYbJiEZEMxDhsy3s3AboPEF4nfEp8kvkp8lHgr8QoID0jMl6iTqJLIkciU8BN/K35ZvEm8UbxQPFBcXpxNbKVYolismJyohIi/cKVwuXCMcJSwqtAiwYOCkwXmC8zlW8zXxpvN85znPk8AtyDXZ0jo0RYwstHejsEOAFLcpEl4nGPQYghlKGBoYFjFyMDYwOzAeIDBAYsIEAAAqhwHlXicXY+/TsNADMZzJLSEJ0A6IZ11KkOViJ3phksk1CUlDOelgNRKpO+AlIXFA8/ibhnzYgjMEf4utr/P+ny/c6f5yXx2nKVHKilWnDfhoNQLDurtmf35IU/vNmVhTNV5VvdlwWoJomtOF/VNsGjI0PWWTG0eH7acLWKXxY7w0nDShk7qbQB2qL/HHeJVPJLFI4QS30/xfYxL+rUsVobTiyasA/des/OoAUzFYxN49BoQf8ikP3VnE+NsOWXbwE5zgkSfygL3RJqE+0uPf/Wgkv+G+23Iv6tB9U3c9Bb0h2HBgrChl2fbUAkaYPkOhPxkxgABAAIACAAK//8AD3icnVh7cFRVmj/ffaYREm46SedFwk2nuwkhCelOp8E86EQSeSwkBgapboMwCktQMrqKGEDngKPgBHFMZtx1YLWUCZY7o7vrc2uYXdupLXGmZsQdtsbaSu38oQKzs+Jzq5TOvSf7nXNvd5rglu509+3zuOfxnfO9ft9HJHKKEOV76j1EJjohMcM0AqZhnpL/YL0qvWqvIeo96e//UFlP8APECxf0S1oDUbHh80AM9PGE5bW8CXlca8CafClh7cZx+MnDL7kGxxWbht8wo6YRMfKIFadWXE5RxS3llBXH8Z+Tz/V5+jw+3gO6B0K4tgd8SlJ6MWGvs9clpBft9QnpJemlhEKuaNrrcQhupxCNaHpaT5MYuYscJsdx56KS4iKtWJUDmu5V5RrNXxP0ywFvMIRdLcFoS2s04FVbY9gVbo2ESyI4qMQX8EInRFuCoVhIbYSQN6Q3gr9G00O6Nx/0gO7Lh+KiEp/uC1SBT/bFqiASbo35YnInxNQYhKuk4qJ8yV/TKEVbOiVvuBPLRmznY3+VpH0BAPJT7N3S8pXs4NOeQg/+nmYHV5aXsnefAhmA2U9BHb6F72bewnfxLdQ9xY5IiiJ9uIl9Wt0VXPHOD31LfaVNpePvrAjGF7JPN33ovIWCq99CwSZrbP3DO9radjy8PlPGtq6qq1u1NeaWSu3/jxg79yDsP3Ev3DG73YdXkpr79ipSpV25ZPHSpjmEiZJIBH95RKOkkoSRtwYyM2Tmy/VgmKEYChdevM/shIieL+tmCDlndMIKMKtkXx6Jrz/UxAorNw6NdMVtSqlE410jQxsr4aOmQ+vjpTUVvrn2XQWV9w8M3F9ZID0y11dRU6oRi17X0XZzd61E4nGJ1Hbf3NZx3Whe6YLaovq+YcM6Zgz31RfVLijN4+KO9BGaR3SKWlTApR7pMiCqmk4lj9iE4aPTy6howJWNTtrEmpQDMpmkAZvYAWlSJviCylSnCiVeEiJtuNIsiTK/pg2kotFfVORvrHBLueLrOhSa0/hGJZ5XokBUqhPHbkDE8CNPDAlvF4+gkzTqI38yd+PYA5X0cN6BDoaKyqlr/OuvCQXxiyyLVUlKJNypoMYoXGN0s5ibDdSs1lhrbSTsK/GVKAR2J9huZWl///pjx15LnX3hmScfODTY1FOyf9GzH0DJ4/vPn/nJnnh8z0/OnN9/6H/OPReDOkaosahky/3fg8aTZ1OvHTumEXuSjSVgTEremTorutb3L49t3/5wz+M31Dz22Qtb+fwPDjhrrX7on++mEmEfLexYcF9yy7f5xkTYnMy58kkRqSD13OZoOqjchHCBBDQRHinQKIegU86YAT2PhJemJ+3DT6qBpQe6e/Ylo5d7dz3hV5azyamlsHpOQ3ygUWVljbXF5vK19cHlzUvKtH/sPoBznpRGcE44mtw3dY//iV3KtRBIXzPQOBBvmCO/V7akeXmwfu1ys7i2sSznzv1oEbkUKSglCtca4IYw2hKDRrRzncpsE6XGt7184uBN4fBNB0+8vO2+81utj73l5UGvPL9vo9O393cnkskTv9vrlnge0e1M29hnfeINlpd7ZWPr+fucvimSM1yUwoOQrL5wGq/jkoGuJ2b6VDNk6lj9OmsKYW7hxWla88iXRApQ6VUKEyxA7VcpC+iow7tOj/b3j57elSn7ju7s6Nh5tM8t7UfLg0htMOiILOWfKaLQ3Cm8tGjOJFHKVMzDh181TiV4FLzvajxNA2kmUbIcT+Q3OP0mP4Dhj5r8FBGusgugToqaYBpFJdhGT+Q3IuA+OqFVLb2LLLKot6UKBY9rHVCudxKxCFCGKjaFuyukPGgjyeA+Gk3H+RQ+WU1RmtFYSqdJOs5pTSm4gPMQTm5GRprJLWQvGSVPkZfIGS4tSpVUWFwk5UuKe/eKe+9uu7BTqvXOaKrCucE1N+JwTHG4M8syzW67pTsHuXvle3lWWyGPgPbB6QdXr37w9Acs/Uh0sKfOW1lT6a3r2dISbIu2tK9Zyvv4a1CP5doBp87vAsdF2taE+4/ubBdzsY/NNnFwfFaHNHvE9lnt87PaecSl8RGW5hTX9QxGm1e3t0Tbgi1bslQPRt0DfUlzyXTqfCUxrn3n0f7mtW0RnMv7VDLbGMNVPewqgz79DcYQGTIyXE/ayVrH9ywAoW2OGBsZdhiORHPuQZRbaYf/2AUtrTFETKaYZGpCIGsMs8Lg20yjSA9Go4O9i6aFm+ItmXKZzh6GtoXzSudZcd5QkBYuzHFlXlmJlRJkEz6bz3P0Qqa8PYVaa2flXaJyPLaldI6HN2xKAAGpV7PwXMGMJUQrHRI4z7XJrqNRlfjWF0/Qm8JD26zTCXll36bkiXf23D5x9OD1MIHIAT3E0N5R3QrfRE+8uPXh6W3WLxJyT9/ZO/a8cyLZdduRVQgtWHLZ0OC6WLXw5e59KljMc+2b1/SI0tDJZaokAxBgk6jTaKrUyXQgD2ECBC4nVbTglznmBoV4xRqcdrNRdmxfiQ99qGO/UX0UHxJvKmj5rj94dOJ2TsymPnllwjq9bcghdePo3qHtty7DS9LIqiO3dfFj3XG2Txxy2/TDzqGrY+sGh5bxg7o+W39Tf5PUkm7cOR83DqE/4wqJAF1HeB7jTs4HQa6bCHxjoAm6OIl4vc7l8in6m+aK6/rCNdXswXlzy5t7l7D77beONEjL2f0Nva/cMrAW9mvFwZgJx2LNzCifl8eKypYsaapYfluj9PTCGn1e4Rz47/JmtciMBYs19mCwf1HXri3fWgKH7DMNR6RlcKihd00Z7K+uae5bucK028rh4+ZYZXM5K55TOFc3F9o3N962rKKpYUkZfJiHbJABfY9OBHbRiIfzJWIgU0IGSgqFOAYndhUIACPjN02+UArtL75qHqIek88EDQUwjVGNFZfeczyJTSTP1EeSx4mbkIeX9EtXxzfyGAZM1u6EPGYNYxAlj2N8c0XTGsYhHEPBBnQyDXl877mEBFDpvDwAQ8oBEC422OP2eALOUTiHnkA+Zx+T/irBFqvPpW+E3zsYDBBX6tzgF3JJQm+EKuA3eMQnnK2GAyhbloS3JuhlqhJUS47vGJ0QnSj9NvpFalGUZi7XiHZxrWuIQXyuZKPDjngjoQB3a+LBhdGZMiIncenAxIRFpcA0sZOcYIayqBBlcioA6LgYficmgaRRgQBvUsSaAYw1L3EM6dwWSBSPKHlVbyI9DgFpOGF/pBYm0mMiNpVwpopfvOurMLNC+o4OtbcPHe3rH+XlqEpzGv38pVgDDpMy9aJ+ke8Z8PAIV1eHrTL54og1Jg+PYEVUrbER3K+MlGkj7liHn9LYiDyML+WLVlkZVnGKVWaVkTk8NhD3xTF9PWkiEcQ7bWQFYp7rr6Z2NsrxIiSQOb4uNjGeiJpe3EvSwRvCK/FBSE4NntzX27vv5GCm7L77xkjkxru7u/fcGA7fuOeQADUKcnIKbxnofvZpAubLTVCQYJ8kkzA/MfWXSfZJQiO5i/DSJji9O3c5mXMHV1IEUoLFOJl9av0bzoYCuSmJS1qVSVwf5U3lMqJ/iXgI8ac3XNspFUZbpFCVmsEVtYj4qwAcFCGFSpx+vUSh6BbfP/3Q6pVd9E9vPXNX5+qHTr+PvvT7LH0xtbK6Q64+cP7MyT3x/sfeRgNy6J/eY5cfo9AjET4OtEceBHLX/MTR1979/CC6X77QqsNv3KsoDL3syTPnDxyZ/o+/ixx/Zox9/PnZv91u0COc99xWc/2gIp5BGfKi9AZ46ObqKsoCKhDaZERZPASBMTacgHEYT7BhGMOIhId2lNsM8F7Rz/hYvA++Pse7UcRaIk7AQNXJJWCMioY1guyNoPPslGNOAgLDBrTwCBqLuU/FIAhjCBPlAQfz8XwFwEWKTX57eJeNaIU62qtXrtvUHKivDzRvWreyur0DdRl7F65cuylcu2SmV0Nt3rRqQWv5tckV5hQ1VySvLW9dsGpTtk+Z6dPJrl9tbljT0eIz2hYvbjN8LR1rGjb/ahel2N+0uj1carRf2W+TgXv9+RXeRUMjh3t7D48MLfJW5PvvHfjKXuFrdojYfhW5Ae+mSubqUA/RSFYTNN3xfHowoxVtUOzPAkhfpyzirRhPSqEz1AY3P3Fn1/UjJwfjcVcLugv9xpz19/zNxt5DuzeWrd2QUX48xM9Hb7hh9Oe7GpsW7TpwdHXyuUdvZ13IvnPsXGKcKtPampEnNw+eHLmeCm3A5RRl46ND7Yv/4rZuf8aOUL4CX8nT8e2ewLLtxywNmX8OGhJj0oQbKz6g2zrPifmEDSDI1UgmgAGfHtJDsVDMF/OpukAHIfzjih7SIWKCbqjZeAN+/H7i/czPfrkr/QOdxONpkpLQbMJ1yT+egq4fsVfsipSacqMbqzxnyvtxlVrzu7rkO1jydYQbhP1L8r9OsZR04Q170qWV5zIcWuswmrmS1pyMnoc3RJPTWuxHLTHMGUoljDzwh17V+jHsmMIlaYbMVJIdt0lKnpihMeEMBYJFnB1PIpUY6WRo7ErCDiCcQjkbt1SgbdkwO16pbZS+OkLBUDcTBTcqHDrNjihctP5/BhBOUmDwp4/v27x06eZ9j/90MKc+G/O7q1wB8TMZhdxFtYVXLeXWr8ydVDhx/Dc76Z91sj/3BDmxJNq3ElJOqoiJuDHkZER0nnAIgUg5IGQ0wwgSS8CUEQebXo/Ci5AJ/jxSYMULq6sLrXiBB2helaFQoyoPqMf6Efv9b6RfWg+w38Ktv7H/KO1mf4AP4Rb7WqkB668A3Mp+ayspX+EU9fkUWugrLJBovmHk27RAamR4ifyxqV0i/cm6U36Ul1TcLEo4zWI6HVsFaPt9eNc8ihf0cz/A0U3UFXMMasok08h8IfOgPqBRvSzwC6PC0WKc7j7gPhxSpUV2TCYzsk5cJbGzTfHQ3H8q8Mk5QtTn9bTAnjrIfi/3TurzCfYCjmM/S8AluKTNS8ANX1q6LtqMwyH4d6Kpf6/bYp7I28sRL6gbk8zLCpMwgJNhg7QuwbxwCdfSpS9tDjclEiZlOsdDqkCuHPirAr8qY9Zj8ndGODSS3xbYiFf1YYGNZlASrwkZRqykvz2zDhIdECCYD7AQKn3Hesyudaq4hn6Rw6YZACVqwkc7OSPicokIjOkHv+BEBCIZZqjIBZvey1acsbF2L7xxxsLL51hWF5ds4XVz0yQjInLYxP+FXZnJ4VZw3jvZW462xbo+PWunyVUp3UDywoXk+fPiPye72xpws7uTmZf472RGhV7nIYIuz0gbmDw36jfqJPxDfG4iwnNiU/FETYgF3EOiUE/CQII9j5KscHzBnk/AAJucOsfFIcA43KA8mGQvJKwNMh5cQlrdQRJx38CG9PPOGrganwQbEnww3g/XGYH1S1E/diLvPBjDGhzr84in2KOIEsNYK2Wl5Lj9qHSndGf6LL96lT9npj5jN8PTSj48/QP2FnsLllk72etyM3RZZ+Vm9rp1lvOUC7gevzKmwnUxuEGhp2pqKkWl9+wqR2dsHpR9IXlEWIUxUSa+Lhf+1Cz+qiRFbhLDdDIW1EmizM5GKKlssmJKvMLDf1XOQaHZpISdkkQCAumqJK36By5+nEPySTH2oAQhPzEschjpkUxuAbHBjWANfAbPavAzuxPIL1mH9K/syR54Fj6zdrNfTxOmw260gVot01H/v4WWUKFTZwzl13i/xNr7D8ryqVf1NcjUbfkGl3IjH3dOYdRKc+NaP+eR7OHxaTol4tqZ+JRHtqrH/oKHtiQvK4+yyFWUoQUMoEQ2O1qG0blehnYjYsgi2+qAAa7CesgrQBeganhkrhqSyDBiqMeOp1JSRSDj39nBJA+gkxMTyWm0ackJO3nqVHJaxNTYxLrG58GON6QkOn37AreRWSQRSIIYlZ4vpiRPyZ/gQiBM5bRYlGdY3Lh0ti2/i3yXjJK/Jifd06CMqbPKTH+gJBuLtUMslA/cd5XkxmfZpIdIXFbiwXMSIZFsMBeCcCvCeMSuiPFB/EdEzxX9OXVJpHZ5WEXdylSmomYq7JKXyx6XU/hFeW9gcd00yfbwcnEdkNlDYPaQ9AaXJZp7u8GpC25FyvSgtFE0jAjBULhQnZECGX0XRu7jdYszS2lztS3lld5pMtPFSy+Qq8bA7DH27gxvZzLpLFub4Tz5X7oQ0KMAeJxjYGRgYGBZ8W1igahBPL/NVwZuDgYQ2P/3YAOIvmfgdQZEczCAxTkZmEAUAE1pCdgAAHicY2BkYOBgAAE4yciACpgAAsoAHQAAAHicY9ViWMbBwCDMwMDwmYGNAQQamBoYYADIYmxgBNKMLEAWEDIIMwaDxYWZGhjbmSSBbFYgD6EDrIvxMuMVBiMGSTgfCBlkGA6AOACflgxrAAAAFgAqAEIAZAFUAaQByAIcAjICngLsAzwDpAP+BQYFcgWuBdAGDAZ6BpYGsgbUBvQHGgdMB2QHhgecB7IILAiECLQJQgm0CgoKWgrQCyQLgAvWC/IMDgwyDFYMhgy8DRANQA1eDaQN5g4EDmYPUnicY2BkYGAwZzjBwMsAAoxgkguEGSNBTAAdRwF9AAAAeJy1VD+LHDcUf3u79l1wfARDwKWKEM7HMmtfzJnY1WHHla85mwM3Ae2MdkZ4diQkjYcxLlK6yMdIY8inCAmkTJ1PkDpVyrz3pNnb827MJZAdRvPT0/v7e08LALdHX8II4u8rfCMewS3cRbwDu/BNwmOUP0t4gvjbhK/Bp2ATvg6fwduEd+Fr+D7hPfgcfkn4BhzC7wnfHP08miS8D4c7v2KU0eQT3BU7fyY8gi/G5wnvwP74TcJjlL9LeIL4x4Svwe3xbwlfBzH+I+FdcJO9hPfgcDL4uQEvJj8kfHP8bvJXwvvwYu+7n96Lo7v3HohTnTvjzSKIx8ZZ42TQpsnESV2LM11WwYsz5ZV7rYrsqZw7nYvTJ8+OxIn3KvgzVba1dJsHm5Jz5Tx6Fvez4+N4Sofx7LkqjRLaCymCk4VaSvdKmIUIlVrLr3SmtSTOzdLKRiufbU2+CsE+nM26rsuWw3mGNrPQW1M6aat+tjBN8LMLc99aW2tVCDrIxEvTiqXsResVJoGJkVgEI3KnZFBTUWhva9lPhWwKYZ3G0xxVFH6lF1a5pQ4B3c17LqLWuWrIFx54YdwAFhRhulmqdaZo8zAVxDzaTslmCKAb0VU6r9Yy6zCobvK6LbBNq+xNU/fiQN8RajnHXC7U0cPHsmX1QjelcMoH7BSxehGAzFe+HjEDBxqjBLWkFjiNUQvTNbWRxWX2ZKRKOSrHYChc22DbIApFZZJOpWp7mVEcxqZP6tQQdIj8VHquMefs6t2G9yDgCO7CPXiA6BQ05ODAgMd3AQFljxE5vPO0SpRoRA1keHICNT4CzlBWQoVnnncKvwq1X+NaoOZTtJvjnnxTjCf4z3LE9p41yY6sSmjRn0TNq1hcReec8/ApZwH3MZtjfNZtB8t1u+ecjcFVoA5VJfENzECB0iVn+QplxBKdVKy7jb+S9y0yOGjn+F3iXmJOmtnK/gXzxHNA6UOY4dPxk6G/D+2zFGeGuGcvJfux6KFH6YK9UbWzrdE952yxI5r7KFYW1PuXXJNgJnr8tsxdZCIyNmiTzHDVDjWoDgVT3BesZ7njPUuID4pjuTPRNk9eVNpL9m25r1Rz4DOymnMeQydqroishryihecuuA3JYlXD9Epdtbwv0CbH/ZT5ijMf405XcT6sQPMkdsxTjut2zrpUKWnnWE3Lc1ds5Z5sakYHqH8HvzSh88TLNu8xh//K7YX3gj2VKHM8xyHdqWFWt1UwRN/M69HaDFAlsZbA8YZbQP5jrQVKOq7c8K382OzJS1OluC8mrbGqiFu+WS1bUrZDNwc/pFnzTf7nGY3/jE3qzIX34YboxDLND+U7Z6Zjb/+Hu/03hsc4mgB4nGNgZgCD/34M5QyYwBwAKWEB/3ic28CgzbCJkZNJm3ETF4jcztWaG2qrysChvZ07NdhBTwbE4onwsNCQBLF4nc215YVBLD4dFRkRHhCLX05CmI8DxBLg4+FkZwGxBMEAxBLaMKEgwADIYtjOCDeaCW40M9xoFrjRrHCj2eQkoUazw43mgBvNCTd6kzAju/YGBgXX2kwJFwDEASgaAAAA\";\n  function initializeIcons$1() {\n    const subset = {\n      style: {\n        MozOsxFontSmoothing: \"grayscale\",\n        WebkitFontSmoothing: \"antialiased\",\n        fontStyle: \"normal\",\n        fontWeight: \"normal\",\n        speak: \"none\"\n      },\n      fontFace: {\n        fontFamily: '\"FabricMDL2Icons\"',\n        src: `url(\"${fabricIconsWoff}\") format(\"woff\")`\n      },\n      icons: {\n        Accept: \"\",\n        Add: \"\",\n        BIDashboard: \"\",\n        Camera: \"\",\n        Cancel: \"\",\n        ChevronDown: \"\",\n        ChevronLeftMed: \"\",\n        ChevronRightMed: \"\",\n        Clear: \"\",\n        ClearFilter: \"\",\n        ClearNight: \"\",\n        CloudDownload: \"\",\n        Color: \"\",\n        Copy: \"\",\n        CubeShape: \"\",\n        Delete: \"\",\n        Diamond: \"\",\n        DiamondSolid: \"\",\n        DoubleChevronLeft12: \"\",\n        DoubleChevronRight12: \"\",\n        Download: \"\",\n        Edit: \"\",\n        Filter: \"\",\n        Filters: \"\",\n        FiltersSolid: \"\",\n        Flow: \"\",\n        History: \"\",\n        HourGlass: \"\",\n        More: \"\",\n        Next: \"\",\n        OpenInNewWindow: \"\",\n        Page: \"\",\n        Pause: \"\",\n        Photo2Add: \"\",\n        Photo2Remove: \"\",\n        PicturePosition: \"\",\n        Pin: \"\",\n        Pinned: \"\",\n        PlayResume: \"\",\n        PlayReverseResume: \"\",\n        Previous: \"\",\n        RadioBtnOff: \"\",\n        RadioBtnOn: \"\",\n        RadioBullet: \"\",\n        Redo: \"\",\n        RemoveFilter: \"\",\n        ScaleVolume: \"\",\n        Search: \"\",\n        Settings: \"\",\n        SortDown: \"\",\n        SortUp: \"\",\n        Sunny: \"\",\n        Table: \"\",\n        Undo: \"\"\n      }\n    };\n    return subset;\n  }\n  let registerIcons;\n  let unregisterIcons;\n  function initializeIcons() {\n    [initializeIcons$1].forEach((initialize2) => {\n      const subset = initialize2();\n      unregisterIcons && unregisterIcons(Object.keys(subset.icons));\n      registerIcons(subset, {\n        disableWarnings: true\n      });\n    });\n  }\n  function use(_registerIcons, _unregisterIcons) {\n    registerIcons = _registerIcons;\n    unregisterIcons = _unregisterIcons;\n  }\n  var ONKEYDOWN_TIMEOUT_DURATION = 1e3;\n  var getClassNames$3 = classNamesFunction();\n  var getSlotStyleFn = function(sty) {\n    return function(value2) {\n      var _a2;\n      return _a2 = {}, _a2[sty] = \"\".concat(value2, \"%\"), _a2;\n    };\n  };\n  var getPercent = function(value2, sliderMin, sliderMax) {\n    return sliderMax === sliderMin ? 0 : (value2 - sliderMin) / (sliderMax - sliderMin) * 100;\n  };\n  var useComponentRef$1 = function(props, sliderBoxRef, value2, range2) {\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        get value() {\n          return value2;\n        },\n        get range() {\n          return range2;\n        },\n        focus: function() {\n          var _a2;\n          (_a2 = sliderBoxRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        }\n      };\n    }, [range2, sliderBoxRef, value2]);\n  };\n  var useSlider = function(props, ref2) {\n    var _a2 = props.step, step = _a2 === void 0 ? 1 : _a2, className2 = props.className, _b2 = props.disabled, disabled = _b2 === void 0 ? false : _b2, label2 = props.label, _c2 = props.max, max2 = _c2 === void 0 ? 10 : _c2, _d2 = props.min, min2 = _d2 === void 0 ? 0 : _d2, _e2 = props.showValue, showValue = _e2 === void 0 ? true : _e2, _f = props.buttonProps, buttonProps = _f === void 0 ? {} : _f, _g = props.vertical, vertical = _g === void 0 ? false : _g, snapToStep = props.snapToStep, valueFormat = props.valueFormat, styles = props.styles, theme = props.theme, originFromZero = props.originFromZero, ariaLabelledBy = props[\"aria-labelledby\"], _h = props.ariaLabel, ariaLabel2 = _h === void 0 ? props[\"aria-label\"] : _h, ranged = props.ranged, onChange = props.onChange, onChanged = props.onChanged;\n    var disposables = React__namespace.useRef([]);\n    var _j = useSetTimeout(), setTimeout2 = _j.setTimeout, clearTimeout2 = _j.clearTimeout;\n    var sliderLine = React__namespace.useRef(null);\n    var win = useWindowEx();\n    var _k = useControllableValue(props.value, props.defaultValue, function(ev, v) {\n      return onChange === null || onChange === void 0 ? void 0 : onChange(v, ranged ? [internalState.latestLowerValue, v] : void 0, ev);\n    }), unclampedValue = _k[0], setValue = _k[1];\n    var _l = useControllableValue(props.lowerValue, props.defaultLowerValue, function(ev, lv) {\n      return onChange === null || onChange === void 0 ? void 0 : onChange(internalState.latestValue, [lv, internalState.latestValue], ev);\n    }), unclampedLowerValue = _l[0], setLowerValue = _l[1];\n    var value2 = Math.max(min2, Math.min(max2, unclampedValue || 0));\n    var lowerValue = Math.max(min2, Math.min(value2, unclampedLowerValue || 0));\n    var internalState = useConst({\n      onKeyDownTimer: -1,\n      isAdjustingLowerValue: false,\n      latestValue: value2,\n      latestLowerValue: lowerValue\n    });\n    internalState.latestValue = value2;\n    internalState.latestLowerValue = lowerValue;\n    var id2 = useId(\"Slider\", props.id || (buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.id));\n    var classNames2 = getClassNames$3(styles, {\n      className: className2,\n      disabled,\n      vertical,\n      showTransitions: !snapToStep && !internalState.isBetweenSteps,\n      showValue,\n      ranged,\n      theme\n    });\n    var steps = (max2 - min2) / step;\n    var clearOnKeyDownTimer = function() {\n      clearTimeout2(internalState.onKeyDownTimer);\n      internalState.onKeyDownTimer = -1;\n    };\n    var setOnKeyDownTimer = function(event2) {\n      clearOnKeyDownTimer();\n      if (onChanged) {\n        internalState.onKeyDownTimer = setTimeout2(function() {\n          onChanged(event2, internalState.latestValue, ranged ? [internalState.latestLowerValue, internalState.latestValue] : void 0);\n        }, ONKEYDOWN_TIMEOUT_DURATION);\n      }\n    };\n    var getAriaValueText = function(valueProps) {\n      var ariaValueText = props.ariaValueText;\n      if (valueProps !== void 0) {\n        return ariaValueText ? ariaValueText(valueProps) : valueProps.toString();\n      }\n      return void 0;\n    };\n    var updateValue = function(ev, newValue, newUnroundedValue) {\n      newValue = Math.min(max2, Math.max(min2, newValue));\n      newUnroundedValue = newUnroundedValue !== void 0 ? Math.min(max2, Math.max(min2, newUnroundedValue)) : void 0;\n      var numDec = 0;\n      if (isFinite(step)) {\n        while (Math.round(step * Math.pow(10, numDec)) / Math.pow(10, numDec) !== step) {\n          numDec++;\n        }\n      }\n      var roundedValue = parseFloat(newValue.toFixed(numDec));\n      internalState.isBetweenSteps = newUnroundedValue !== void 0 && newUnroundedValue !== roundedValue;\n      if (ranged) {\n        if (internalState.isAdjustingLowerValue && (originFromZero ? roundedValue <= 0 : roundedValue <= internalState.latestValue)) {\n          setLowerValue(roundedValue, ev);\n        } else if (!internalState.isAdjustingLowerValue && (originFromZero ? roundedValue >= 0 : roundedValue >= internalState.latestLowerValue)) {\n          setValue(roundedValue, ev);\n        }\n      } else {\n        setValue(roundedValue, ev);\n      }\n    };\n    var onKeyDown = function(event2) {\n      var newCurrentValue = internalState.isAdjustingLowerValue ? internalState.latestLowerValue : internalState.latestValue;\n      var diff = 0;\n      switch (event2.which) {\n        case getRTLSafeKeyCode(KeyCodes.left, props.theme):\n        case KeyCodes.down:\n          diff = -step;\n          clearOnKeyDownTimer();\n          setOnKeyDownTimer(event2);\n          break;\n        case getRTLSafeKeyCode(KeyCodes.right, props.theme):\n        case KeyCodes.up:\n          diff = step;\n          clearOnKeyDownTimer();\n          setOnKeyDownTimer(event2);\n          break;\n        case KeyCodes.home:\n          newCurrentValue = min2;\n          clearOnKeyDownTimer();\n          setOnKeyDownTimer(event2);\n          break;\n        case KeyCodes.end:\n          newCurrentValue = max2;\n          clearOnKeyDownTimer();\n          setOnKeyDownTimer(event2);\n          break;\n        default:\n          return;\n      }\n      updateValue(event2, newCurrentValue + diff);\n      event2.preventDefault();\n      event2.stopPropagation();\n    };\n    var getPosition2 = function(event2, verticalProp) {\n      var currentPosition = 0;\n      switch (event2.type) {\n        case \"mousedown\":\n        case \"mousemove\":\n          currentPosition = !verticalProp ? event2.clientX : event2.clientY;\n          break;\n        case \"touchstart\":\n        case \"touchmove\":\n          currentPosition = !verticalProp ? event2.touches[0].clientX : event2.touches[0].clientY;\n          break;\n      }\n      return currentPosition;\n    };\n    var calculateCurrentSteps = function(event2) {\n      var sliderPositionRect = sliderLine.current.getBoundingClientRect();\n      var sliderLength = !props.vertical ? sliderPositionRect.width : sliderPositionRect.height;\n      var stepLength = sliderLength / steps;\n      var currentSteps;\n      var distance2;\n      if (!props.vertical) {\n        var left = getPosition2(event2, props.vertical);\n        distance2 = getRTL(props.theme) ? sliderPositionRect.right - left : left - sliderPositionRect.left;\n        currentSteps = distance2 / stepLength;\n      } else {\n        var bottom = getPosition2(event2, props.vertical);\n        distance2 = sliderPositionRect.bottom - bottom;\n        currentSteps = distance2 / stepLength;\n      }\n      return currentSteps;\n    };\n    var onMouseMoveOrTouchMove = function(event2, suppressEventCancelation) {\n      var currentSteps = calculateCurrentSteps(event2);\n      var newUnroundedValue = min2 + step * currentSteps;\n      var newCurrentValue = min2 + step * Math.round(currentSteps);\n      updateValue(event2, newCurrentValue, newUnroundedValue);\n      if (!suppressEventCancelation) {\n        event2.preventDefault();\n        event2.stopPropagation();\n      }\n    };\n    var onMouseDownOrTouchStart = function(event2) {\n      if (ranged) {\n        var currentSteps = calculateCurrentSteps(event2);\n        var newValue = min2 + step * currentSteps;\n        internalState.isAdjustingLowerValue = newValue <= internalState.latestLowerValue || newValue - internalState.latestLowerValue <= internalState.latestValue - newValue;\n      }\n      if (event2.type === \"mousedown\") {\n        disposables.current.push(on$1(win, \"mousemove\", onMouseMoveOrTouchMove, true), on$1(win, \"mouseup\", onMouseUpOrTouchEnd, true));\n      } else if (event2.type === \"touchstart\") {\n        disposables.current.push(on$1(win, \"touchmove\", onMouseMoveOrTouchMove, true), on$1(win, \"touchend\", onMouseUpOrTouchEnd, true));\n      }\n      onMouseMoveOrTouchMove(event2, true);\n    };\n    var onMouseUpOrTouchEnd = function(event2) {\n      internalState.isBetweenSteps = void 0;\n      onChanged === null || onChanged === void 0 ? void 0 : onChanged(event2, internalState.latestValue, ranged ? [internalState.latestLowerValue, internalState.latestValue] : void 0);\n      disposeListeners();\n    };\n    var onThumbFocus = function(event2) {\n      internalState.isAdjustingLowerValue = event2.target === lowerValueThumbRef.current;\n    };\n    var disposeListeners = React__namespace.useCallback(function() {\n      disposables.current.forEach(function(dispose) {\n        return dispose();\n      });\n      disposables.current = [];\n    }, []);\n    React__namespace.useEffect(function() {\n      return disposeListeners;\n    }, [disposeListeners]);\n    var lowerValueThumbRef = React__namespace.useRef(null);\n    var thumbRef = React__namespace.useRef(null);\n    var sliderBoxRef = React__namespace.useRef(null);\n    useComponentRef$1(props, sliderBoxRef, value2, ranged ? [lowerValue, value2] : void 0);\n    var getPositionStyles = getSlotStyleFn(vertical ? \"bottom\" : getRTL(props.theme) ? \"right\" : \"left\");\n    var getTrackStyles = getSlotStyleFn(vertical ? \"height\" : \"width\");\n    var originValue = originFromZero ? 0 : min2;\n    var valuePercent = getPercent(value2, min2, max2);\n    var lowerValuePercent = getPercent(lowerValue, min2, max2);\n    var originPercentOfLine = getPercent(originValue, min2, max2);\n    var activeSectionWidth = ranged ? valuePercent - lowerValuePercent : Math.abs(originPercentOfLine - valuePercent);\n    var topSectionWidth = Math.min(100 - valuePercent, 100 - originPercentOfLine);\n    var bottomSectionWidth = ranged ? lowerValuePercent : Math.min(valuePercent, originPercentOfLine);\n    var rootProps = {\n      className: classNames2.root,\n      ref: ref2\n    };\n    var labelProps = {\n      className: classNames2.titleLabel,\n      children: label2,\n      disabled,\n      htmlFor: ariaLabel2 ? void 0 : id2\n    };\n    var valueLabelProps = showValue ? {\n      className: classNames2.valueLabel,\n      children: valueFormat ? valueFormat(value2) : value2,\n      disabled,\n      htmlFor: disabled ? id2 : void 0\n    } : void 0;\n    var lowerValueLabelProps = ranged && showValue ? {\n      className: classNames2.valueLabel,\n      children: valueFormat ? valueFormat(lowerValue) : lowerValue,\n      disabled\n    } : void 0;\n    var zeroTickProps = originFromZero ? {\n      className: classNames2.zeroTick,\n      style: getPositionStyles(originPercentOfLine)\n    } : void 0;\n    var trackActiveProps = {\n      className: css(classNames2.lineContainer, classNames2.activeSection),\n      style: getTrackStyles(activeSectionWidth)\n    };\n    var trackTopInactiveProps = {\n      className: css(classNames2.lineContainer, classNames2.inactiveSection),\n      style: getTrackStyles(topSectionWidth)\n    };\n    var trackBottomInactiveProps = {\n      className: css(classNames2.lineContainer, classNames2.inactiveSection),\n      style: getTrackStyles(bottomSectionWidth)\n    };\n    var sliderProps = __assign$1({ \"aria-disabled\": disabled, role: \"slider\", tabIndex: disabled ? void 0 : 0 }, { \"data-is-focusable\": !disabled });\n    var sliderBoxProps = __assign$1(__assign$1(__assign$1({ id: id2, className: css(classNames2.slideBox, buttonProps.className), ref: sliderBoxRef }, !disabled && {\n      onMouseDown: onMouseDownOrTouchStart,\n      onTouchStart: onMouseDownOrTouchStart,\n      onKeyDown\n    }), buttonProps && getNativeProps(buttonProps, divProperties, [\"id\", \"className\"])), !ranged && __assign$1(__assign$1({}, sliderProps), { \"aria-valuemin\": min2, \"aria-valuemax\": max2, \"aria-valuenow\": value2, \"aria-valuetext\": getAriaValueText(value2), \"aria-label\": ariaLabel2 || label2, \"aria-labelledby\": ariaLabelledBy }));\n    var onFocusProp = disabled ? {} : { onFocus: onThumbFocus };\n    var thumbProps = __assign$1({ ref: thumbRef, className: classNames2.thumb, style: getPositionStyles(valuePercent) }, ranged && __assign$1(__assign$1(__assign$1({}, sliderProps), onFocusProp), { id: \"max-\".concat(id2), \"aria-valuemin\": lowerValue, \"aria-valuemax\": max2, \"aria-valuenow\": value2, \"aria-valuetext\": getAriaValueText(value2), \"aria-label\": \"max \".concat(ariaLabel2 || label2) }));\n    var lowerValueThumbProps = ranged ? __assign$1(__assign$1(__assign$1({ ref: lowerValueThumbRef, className: classNames2.thumb, style: getPositionStyles(lowerValuePercent) }, sliderProps), onFocusProp), { id: \"min-\".concat(id2), \"aria-valuemin\": min2, \"aria-valuemax\": value2, \"aria-valuenow\": lowerValue, \"aria-valuetext\": getAriaValueText(lowerValue), \"aria-label\": \"min \".concat(ariaLabel2 || label2) }) : void 0;\n    var containerProps = {\n      className: classNames2.container\n    };\n    var sliderLineProps = {\n      ref: sliderLine,\n      className: classNames2.line\n    };\n    return {\n      root: rootProps,\n      label: labelProps,\n      sliderBox: sliderBoxProps,\n      container: containerProps,\n      valueLabel: valueLabelProps,\n      lowerValueLabel: lowerValueLabelProps,\n      thumb: thumbProps,\n      lowerValueThumb: lowerValueThumbProps,\n      zeroTick: zeroTickProps,\n      activeTrack: trackActiveProps,\n      topInactiveTrack: trackTopInactiveProps,\n      bottomInactiveTrack: trackBottomInactiveProps,\n      sliderLine: sliderLineProps\n    };\n  };\n  var COMPONENT_NAME$2 = \"SliderBase\";\n  var SliderBase = React__namespace.forwardRef(function(props, ref2) {\n    var slotProps = useSlider(props, ref2);\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({}, slotProps.root),\n      slotProps && React__namespace.createElement(Label$2, __assign$1({}, slotProps.label)),\n      React__namespace.createElement(\n        \"div\",\n        __assign$1({}, slotProps.container),\n        props.ranged && (props.vertical ? slotProps.valueLabel && React__namespace.createElement(Label$2, __assign$1({}, slotProps.valueLabel)) : slotProps.lowerValueLabel && React__namespace.createElement(Label$2, __assign$1({}, slotProps.lowerValueLabel))),\n        React__namespace.createElement(\n          \"div\",\n          __assign$1({}, slotProps.sliderBox),\n          React__namespace.createElement(\n            \"div\",\n            __assign$1({}, slotProps.sliderLine),\n            props.ranged && React__namespace.createElement(\"span\", __assign$1({}, slotProps.lowerValueThumb)),\n            React__namespace.createElement(\"span\", __assign$1({}, slotProps.thumb)),\n            slotProps.zeroTick && React__namespace.createElement(\"span\", __assign$1({}, slotProps.zeroTick)),\n            React__namespace.createElement(\"span\", __assign$1({}, slotProps.bottomInactiveTrack)),\n            React__namespace.createElement(\"span\", __assign$1({}, slotProps.activeTrack)),\n            React__namespace.createElement(\"span\", __assign$1({}, slotProps.topInactiveTrack))\n          )\n        ),\n        props.ranged && props.vertical ? slotProps.lowerValueLabel && React__namespace.createElement(Label$2, __assign$1({}, slotProps.lowerValueLabel)) : slotProps.valueLabel && React__namespace.createElement(Label$2, __assign$1({}, slotProps.valueLabel))\n      ),\n      React__namespace.createElement(FocusRects, null)\n    );\n  });\n  SliderBase.displayName = COMPONENT_NAME$2;\n  var GlobalClassNames$1 = {\n    root: \"ms-Slider\",\n    enabled: \"ms-Slider-enabled\",\n    disabled: \"ms-Slider-disabled\",\n    row: \"ms-Slider-row\",\n    column: \"ms-Slider-column\",\n    container: \"ms-Slider-container\",\n    slideBox: \"ms-Slider-slideBox\",\n    line: \"ms-Slider-line\",\n    thumb: \"ms-Slider-thumb\",\n    activeSection: \"ms-Slider-active\",\n    inactiveSection: \"ms-Slider-inactive\",\n    valueLabel: \"ms-Slider-value\",\n    showValue: \"ms-Slider-showValue\",\n    showTransitions: \"ms-Slider-showTransitions\",\n    zeroTick: \"ms-Slider-zeroTick\"\n  };\n  var getStyles$3 = function(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m, _o;\n    var className2 = props.className, titleLabelClassName = props.titleLabelClassName, theme = props.theme, vertical = props.vertical, disabled = props.disabled, showTransitions = props.showTransitions, showValue = props.showValue, ranged = props.ranged;\n    var semanticColors = theme.semanticColors, palette = theme.palette;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$1, theme);\n    var pressedActiveSectionColor = semanticColors.inputBackgroundCheckedHovered;\n    var hoveredActiveSectionColor = semanticColors.inputBackgroundChecked;\n    var hoveredPressedinactiveSectionColor = palette.neutralSecondaryAlt;\n    var restActiveSectionColor = palette.neutralPrimary;\n    var restInactiveSectionColor = palette.neutralSecondaryAlt;\n    var disabledActiveSectionColor = semanticColors.disabledText;\n    var disabledInactiveSectionColor = semanticColors.disabledBackground;\n    var thumbBackgroundColor = semanticColors.inputBackground;\n    var thumbBorderColor = semanticColors.smallInputBorder;\n    var thumbDisabledBorderColor = semanticColors.disabledBorder;\n    var slideBoxActiveSectionStyles = !disabled && {\n      backgroundColor: pressedActiveSectionColor,\n      selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n        backgroundColor: \"Highlight\"\n      }, _a2)\n    };\n    var slideBoxInactiveSectionStyles = !disabled && {\n      backgroundColor: hoveredPressedinactiveSectionColor,\n      selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n        borderColor: \"Highlight\"\n      }, _b2)\n    };\n    var slideHoverSectionStyles = !disabled && {\n      backgroundColor: hoveredActiveSectionColor,\n      selectors: (_c2 = {}, _c2[HighContrastSelector] = {\n        backgroundColor: \"Highlight\"\n      }, _c2)\n    };\n    var slideBoxActiveThumbStyles = !disabled && {\n      border: \"2px solid \".concat(pressedActiveSectionColor),\n      selectors: (_d2 = {}, _d2[HighContrastSelector] = {\n        borderColor: \"Highlight\"\n      }, _d2)\n    };\n    var slideBoxActiveZeroTickStyles = !props.disabled && {\n      backgroundColor: semanticColors.inputPlaceholderBackgroundChecked,\n      selectors: (_e2 = {}, _e2[HighContrastSelector] = {\n        backgroundColor: \"Highlight\"\n      }, _e2)\n    };\n    return {\n      root: __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          userSelect: \"none\"\n        },\n        vertical && {\n          marginRight: 8\n        }\n      ], [!disabled ? classNames2.enabled : void 0], false), [disabled ? classNames2.disabled : void 0], false), [!vertical ? classNames2.row : void 0], false), [vertical ? classNames2.column : void 0], false), [\n        className2\n      ], false),\n      titleLabel: [\n        {\n          padding: 0\n        },\n        titleLabelClassName\n      ],\n      container: [\n        classNames2.container,\n        {\n          display: \"flex\",\n          flexWrap: \"nowrap\",\n          alignItems: \"center\"\n        },\n        vertical && {\n          flexDirection: \"column\",\n          height: \"100%\",\n          textAlign: \"center\",\n          margin: \"8px 0\"\n        }\n      ],\n      slideBox: __spreadArray(__spreadArray([\n        classNames2.slideBox,\n        !ranged && getFocusStyle(theme),\n        {\n          background: \"transparent\",\n          border: \"none\",\n          flexGrow: 1,\n          lineHeight: 28,\n          display: \"flex\",\n          alignItems: \"center\",\n          selectors: (_f = {}, _f[\":active .\".concat(classNames2.activeSection)] = slideBoxActiveSectionStyles, _f[\":hover .\".concat(classNames2.activeSection)] = slideHoverSectionStyles, _f[\":active .\".concat(classNames2.inactiveSection)] = slideBoxInactiveSectionStyles, _f[\":hover .\".concat(classNames2.inactiveSection)] = slideBoxInactiveSectionStyles, _f[\":active .\".concat(classNames2.thumb)] = slideBoxActiveThumbStyles, _f[\":hover .\".concat(classNames2.thumb)] = slideBoxActiveThumbStyles, _f[\":active .\".concat(classNames2.zeroTick)] = slideBoxActiveZeroTickStyles, _f[\":hover .\".concat(classNames2.zeroTick)] = slideBoxActiveZeroTickStyles, _f[HighContrastSelector] = {\n            forcedColorAdjust: \"none\"\n          }, _f)\n        },\n        vertical ? {\n          height: \"100%\",\n          width: 28,\n          padding: \"8px 0\"\n          // Make room for thumb at bottom of line\n        } : {\n          height: 28,\n          width: \"auto\",\n          padding: \"0 8px\"\n          // Make room for thumb at ends of line\n        }\n      ], [showValue ? classNames2.showValue : void 0], false), [showTransitions ? classNames2.showTransitions : void 0], false),\n      thumb: [\n        classNames2.thumb,\n        ranged && getFocusStyle(theme, { inset: -4 }),\n        {\n          borderWidth: 2,\n          borderStyle: \"solid\",\n          borderColor: thumbBorderColor,\n          borderRadius: 10,\n          boxSizing: \"border-box\",\n          background: thumbBackgroundColor,\n          display: \"block\",\n          width: 16,\n          height: 16,\n          position: \"absolute\"\n        },\n        vertical ? {\n          left: -6,\n          margin: \"0 auto\",\n          transform: \"translateY(8px)\"\n        } : {\n          top: -6,\n          transform: getRTL(theme) ? \"translateX(50%)\" : \"translateX(-50%)\"\n        },\n        showTransitions && {\n          transition: \"left \".concat(AnimationVariables.durationValue3, \" \").concat(AnimationVariables.easeFunction1)\n        },\n        disabled && {\n          borderColor: thumbDisabledBorderColor,\n          selectors: (_g = {}, _g[HighContrastSelector] = {\n            borderColor: \"GrayText\"\n          }, _g)\n        }\n      ],\n      line: [\n        classNames2.line,\n        {\n          display: \"flex\",\n          position: \"relative\"\n        },\n        vertical ? {\n          height: \"100%\",\n          width: 4,\n          margin: \"0 auto\",\n          flexDirection: \"column-reverse\"\n        } : {\n          width: \"100%\"\n        }\n      ],\n      lineContainer: [\n        {\n          borderRadius: 4,\n          boxSizing: \"border-box\"\n        },\n        vertical ? {\n          width: 4,\n          height: \"100%\"\n        } : {\n          height: 4,\n          width: \"100%\"\n        }\n      ],\n      activeSection: [\n        classNames2.activeSection,\n        {\n          background: restActiveSectionColor,\n          selectors: (_h = {}, _h[HighContrastSelector] = {\n            backgroundColor: \"WindowText\"\n          }, _h)\n        },\n        showTransitions && {\n          transition: \"width \".concat(AnimationVariables.durationValue3, \" \").concat(AnimationVariables.easeFunction1)\n        },\n        disabled && {\n          background: disabledActiveSectionColor,\n          selectors: (_j = {}, _j[HighContrastSelector] = {\n            backgroundColor: \"GrayText\",\n            borderColor: \"GrayText\"\n          }, _j)\n        }\n      ],\n      inactiveSection: [\n        classNames2.inactiveSection,\n        {\n          background: restInactiveSectionColor,\n          selectors: (_k = {}, _k[HighContrastSelector] = {\n            border: \"1px solid WindowText\"\n          }, _k)\n        },\n        showTransitions && {\n          transition: \"width \".concat(AnimationVariables.durationValue3, \" \").concat(AnimationVariables.easeFunction1)\n        },\n        disabled && {\n          background: disabledInactiveSectionColor,\n          selectors: (_l = {}, _l[HighContrastSelector] = {\n            borderColor: \"GrayText\"\n          }, _l)\n        }\n      ],\n      zeroTick: [\n        classNames2.zeroTick,\n        {\n          position: \"absolute\",\n          background: semanticColors.disabledBorder,\n          selectors: (_m = {}, _m[HighContrastSelector] = {\n            backgroundColor: \"WindowText\"\n          }, _m)\n        },\n        props.disabled && {\n          background: semanticColors.disabledBackground,\n          selectors: (_o = {}, _o[HighContrastSelector] = {\n            backgroundColor: \"GrayText\"\n          }, _o)\n        },\n        props.vertical ? {\n          width: \"16px\",\n          height: \"1px\",\n          transform: getRTL(theme) ? \"translateX(6px)\" : \"translateX(-6px)\"\n        } : {\n          width: \"1px\",\n          height: \"16px\",\n          transform: \"translateY(-6px)\"\n        }\n      ],\n      valueLabel: [\n        classNames2.valueLabel,\n        {\n          flexShrink: 1,\n          width: 30,\n          lineHeight: \"1\"\n          // using a string here meaning it's relative to the size of the font\n        },\n        vertical ? {\n          margin: \"0 auto\",\n          whiteSpace: \"nowrap\",\n          width: 40\n        } : {\n          margin: \"0 8px\",\n          whiteSpace: \"nowrap\",\n          width: 40\n        }\n      ]\n    };\n  };\n  var Slider = styled(SliderBase, getStyles$3, void 0, {\n    scope: \"Slider\"\n  });\n  var SpinnerSize;\n  (function(SpinnerSize2) {\n    SpinnerSize2[SpinnerSize2[\"xSmall\"] = 0] = \"xSmall\";\n    SpinnerSize2[SpinnerSize2[\"small\"] = 1] = \"small\";\n    SpinnerSize2[SpinnerSize2[\"medium\"] = 2] = \"medium\";\n    SpinnerSize2[SpinnerSize2[\"large\"] = 3] = \"large\";\n  })(SpinnerSize || (SpinnerSize = {}));\n  var SpinnerType;\n  (function(SpinnerType2) {\n    SpinnerType2[SpinnerType2[\"normal\"] = 0] = \"normal\";\n    SpinnerType2[SpinnerType2[\"large\"] = 1] = \"large\";\n  })(SpinnerType || (SpinnerType = {}));\n  var getClassNames$2 = classNamesFunction();\n  var SpinnerBase = (\n    /** @class */\n    (function(_super) {\n      __extends(SpinnerBase2, _super);\n      function SpinnerBase2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      SpinnerBase2.prototype.render = function() {\n        var _a2 = this.props, type2 = _a2.type, size = _a2.size, ariaLabel2 = _a2.ariaLabel, ariaLive = _a2.ariaLive, styles = _a2.styles, label2 = _a2.label, theme = _a2.theme, className2 = _a2.className, labelPosition = _a2.labelPosition;\n        var statusMessage = ariaLabel2;\n        var nativeProps = getNativeProps(this.props, divProperties, [\"size\"]);\n        var styleSize = size;\n        if (styleSize === void 0 && type2 !== void 0) {\n          styleSize = type2 === SpinnerType.large ? SpinnerSize.large : SpinnerSize.medium;\n        }\n        var classNames2 = getClassNames$2(styles, {\n          theme,\n          size: styleSize,\n          className: className2,\n          labelPosition\n        });\n        return React__namespace.createElement(\n          \"div\",\n          __assign$1({}, nativeProps, { className: classNames2.root }),\n          React__namespace.createElement(\"div\", { className: classNames2.circle }),\n          label2 && React__namespace.createElement(\"div\", { className: classNames2.label }, label2),\n          statusMessage && React__namespace.createElement(\n            \"div\",\n            { role: \"status\", \"aria-live\": ariaLive },\n            React__namespace.createElement(\n              DelayedRender,\n              null,\n              React__namespace.createElement(\"div\", { className: classNames2.screenReaderText }, statusMessage)\n            )\n          )\n        );\n      };\n      SpinnerBase2.defaultProps = {\n        size: SpinnerSize.medium,\n        ariaLive: \"polite\",\n        labelPosition: \"bottom\"\n      };\n      return SpinnerBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames = {\n    root: \"ms-Spinner\",\n    circle: \"ms-Spinner-circle\",\n    label: \"ms-Spinner-label\"\n  };\n  var spinAnimation = memoizeFunction(function() {\n    return keyframes({\n      \"0%\": {\n        transform: \"rotate(0deg)\"\n      },\n      \"100%\": {\n        transform: \"rotate(360deg)\"\n      }\n    });\n  });\n  var getStyles$2 = function(props) {\n    var _a2;\n    var theme = props.theme, size = props.size, className2 = props.className, labelPosition = props.labelPosition;\n    var palette = theme.palette;\n    var classNames2 = getGlobalClassNames(GlobalClassNames, theme);\n    return {\n      root: [\n        classNames2.root,\n        {\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n          justifyContent: \"center\"\n        },\n        labelPosition === \"top\" && {\n          flexDirection: \"column-reverse\"\n        },\n        labelPosition === \"right\" && {\n          flexDirection: \"row\"\n        },\n        labelPosition === \"left\" && {\n          flexDirection: \"row-reverse\"\n        },\n        className2\n      ],\n      circle: [\n        classNames2.circle,\n        {\n          boxSizing: \"border-box\",\n          borderRadius: \"50%\",\n          borderWidth: \"1.5px\",\n          borderStyle: \"solid\",\n          borderTopColor: palette.themePrimary,\n          borderRightColor: palette.themeLight,\n          borderBottomColor: palette.themeLight,\n          borderLeftColor: palette.themeLight,\n          animationName: spinAnimation(),\n          animationDuration: \"1.3s\",\n          animationIterationCount: \"infinite\",\n          animationTimingFunction: \"cubic-bezier(.53,.21,.29,.67)\",\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ borderTopColor: \"Highlight\" }, getHighContrastNoAdjustStyle()), _a2)\n        },\n        size === SpinnerSize.xSmall && [\n          \"ms-Spinner--xSmall\",\n          {\n            width: 12,\n            height: 12\n          }\n        ],\n        size === SpinnerSize.small && [\n          \"ms-Spinner--small\",\n          {\n            width: 16,\n            height: 16\n          }\n        ],\n        size === SpinnerSize.medium && [\n          \"ms-Spinner--medium\",\n          {\n            width: 20,\n            height: 20\n          }\n        ],\n        size === SpinnerSize.large && [\n          \"ms-Spinner--large\",\n          {\n            width: 28,\n            height: 28\n          }\n        ]\n      ],\n      label: [\n        classNames2.label,\n        theme.fonts.small,\n        {\n          color: palette.themePrimary,\n          margin: \"8px 0 0\",\n          textAlign: \"center\"\n        },\n        labelPosition === \"top\" && {\n          margin: \"0 0 8px\"\n        },\n        labelPosition === \"right\" && {\n          margin: \"0 0 0 8px\"\n        },\n        labelPosition === \"left\" && {\n          margin: \"0 8px 0 0\"\n        }\n      ],\n      screenReaderText: hiddenContentStyle\n    };\n  };\n  var Spinner = styled(SpinnerBase, getStyles$2, void 0, { scope: \"Spinner\" });\n  var getClassNames$1 = classNamesFunction();\n  var DEFAULT_STATE_VALUE = \"\";\n  var COMPONENT_NAME$1 = \"TextField\";\n  var REVEAL_ICON_NAME = \"RedEye\";\n  var HIDE_ICON_NAME = \"Hide\";\n  var TextFieldBase = (\n    /** @class */\n    (function(_super) {\n      __extends(TextFieldBase2, _super);\n      function TextFieldBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._textElement = React__namespace.createRef();\n        _this._onFocus = function(ev) {\n          if (_this.props.onFocus) {\n            _this.props.onFocus(ev);\n          }\n          _this.setState({ isFocused: true }, function() {\n            if (_this.props.validateOnFocusIn) {\n              _this._validate(_this.value);\n            }\n          });\n        };\n        _this._onBlur = function(ev) {\n          if (_this.props.onBlur) {\n            _this.props.onBlur(ev);\n          }\n          _this.setState({ isFocused: false }, function() {\n            if (_this.props.validateOnFocusOut) {\n              _this._validate(_this.value);\n            }\n          });\n        };\n        _this._onRenderLabel = function(props2) {\n          var label2 = props2.label, required2 = props2.required;\n          var labelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.label : void 0;\n          if (label2) {\n            return React__namespace.createElement(Label$2, { required: required2, htmlFor: _this._id, styles: labelStyles, disabled: props2.disabled, id: _this._labelId }, props2.label);\n          }\n          return null;\n        };\n        _this._onRenderDescription = function(props2) {\n          if (props2.description) {\n            return React__namespace.createElement(\"span\", { className: _this._classNames.description }, props2.description);\n          }\n          return null;\n        };\n        _this._onRevealButtonClick = function(event2) {\n          _this.setState(function(prevState) {\n            return { isRevealingPassword: !prevState.isRevealingPassword };\n          });\n        };\n        _this._onInputChange = function(event2) {\n          var _a22, _b2;\n          var element2 = event2.target;\n          var value2 = element2.value;\n          var previousValue = _getValue(_this.props, _this.state) || \"\";\n          if (value2 === void 0 || value2 === _this._lastChangeValue || value2 === previousValue) {\n            _this._lastChangeValue = void 0;\n            return;\n          }\n          _this._lastChangeValue = value2;\n          (_b2 = (_a22 = _this.props).onChange) === null || _b2 === void 0 ? void 0 : _b2.call(_a22, event2, value2);\n          if (!_this._isControlled) {\n            _this.setState({ uncontrolledValue: value2 });\n          }\n        };\n        initializeComponentRef(_this);\n        _this._async = new Async(_this);\n        _this._fallbackId = getId(COMPONENT_NAME$1);\n        _this._descriptionId = getId(COMPONENT_NAME$1 + \"Description\");\n        _this._labelId = getId(COMPONENT_NAME$1 + \"Label\");\n        _this._prefixId = getId(COMPONENT_NAME$1 + \"Prefix\");\n        _this._suffixId = getId(COMPONENT_NAME$1 + \"Suffix\");\n        _this._warnControlledUsage();\n        var _a2 = props.defaultValue, defaultValue = _a2 === void 0 ? DEFAULT_STATE_VALUE : _a2;\n        if (typeof defaultValue === \"number\") {\n          defaultValue = String(defaultValue);\n        }\n        _this.state = {\n          uncontrolledValue: _this._isControlled ? void 0 : defaultValue,\n          isFocused: false,\n          errorMessage: \"\"\n        };\n        _this._delayedValidate = _this._async.debounce(_this._validate, _this.props.deferredValidationTime);\n        _this._lastValidation = 0;\n        return _this;\n      }\n      Object.defineProperty(TextFieldBase2.prototype, \"value\", {\n        /**\n         * Gets the current value of the text field.\n         */\n        get: function() {\n          return _getValue(this.props, this.state);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype.componentDidMount = function() {\n        this._adjustInputHeight();\n        if (this.props.validateOnLoad) {\n          this._validate(this.value);\n        }\n      };\n      TextFieldBase2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n      };\n      TextFieldBase2.prototype.getSnapshotBeforeUpdate = function(prevProps, prevState) {\n        return {\n          selection: [this.selectionStart, this.selectionEnd]\n        };\n      };\n      TextFieldBase2.prototype.componentDidUpdate = function(prevProps, prevState, snapshot) {\n        var props = this.props;\n        var _a2 = (snapshot || {}).selection, selection = _a2 === void 0 ? [null, null] : _a2;\n        var start = selection[0], end = selection[1];\n        if (!!prevProps.multiline !== !!props.multiline && prevState.isFocused) {\n          this.focus();\n          if (start !== null && end !== null && start >= 0 && end >= 0) {\n            this.setSelectionRange(start, end);\n          }\n        }\n        if (prevProps.value !== props.value) {\n          this._lastChangeValue = void 0;\n        }\n        var prevValue = _getValue(prevProps, prevState);\n        var value2 = this.value;\n        if (prevValue !== value2) {\n          this._warnControlledUsage(prevProps);\n          if (this.state.errorMessage && !props.errorMessage) {\n            this.setState({ errorMessage: \"\" });\n          }\n          this._adjustInputHeight();\n          if (_shouldValidateAllChanges(props)) {\n            this._delayedValidate(value2);\n          }\n        }\n      };\n      TextFieldBase2.prototype.render = function() {\n        var _a2 = this.props, borderless = _a2.borderless, className2 = _a2.className, disabled = _a2.disabled, invalid = _a2.invalid, iconProps = _a2.iconProps, inputClassName = _a2.inputClassName, label2 = _a2.label, multiline = _a2.multiline, required2 = _a2.required, underlined = _a2.underlined, prefix = _a2.prefix, resizable = _a2.resizable, suffix = _a2.suffix, theme = _a2.theme, styles = _a2.styles, autoAdjustHeight = _a2.autoAdjustHeight, canRevealPassword = _a2.canRevealPassword, revealPasswordAriaLabel = _a2.revealPasswordAriaLabel, type2 = _a2.type, _b2 = _a2.onRenderPrefix, onRenderPrefix = _b2 === void 0 ? this._onRenderPrefix : _b2, _c2 = _a2.onRenderSuffix, onRenderSuffix = _c2 === void 0 ? this._onRenderSuffix : _c2, _d2 = _a2.onRenderLabel, onRenderLabel = _d2 === void 0 ? this._onRenderLabel : _d2, _e2 = _a2.onRenderDescription, onRenderDescription = _e2 === void 0 ? this._onRenderDescription : _e2;\n        var _f = this.state, isFocused = _f.isFocused, isRevealingPassword = _f.isRevealingPassword;\n        var errorMessage = this._errorMessage;\n        var isInvalid = typeof invalid === \"boolean\" ? invalid : !!errorMessage;\n        var hasRevealButton = !!canRevealPassword && type2 === \"password\" && _browserNeedsRevealButton();\n        var classNames2 = this._classNames = getClassNames$1(styles, {\n          theme,\n          className: className2,\n          disabled,\n          focused: isFocused,\n          required: required2,\n          multiline,\n          hasLabel: !!label2,\n          hasErrorMessage: isInvalid,\n          borderless,\n          resizable,\n          hasIcon: !!iconProps,\n          underlined,\n          inputClassName,\n          autoAdjustHeight,\n          hasRevealButton\n        });\n        return (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          React__namespace.createElement(\n            \"div\",\n            { ref: this.props.elementRef, className: classNames2.root },\n            React__namespace.createElement(\n              \"div\",\n              { className: classNames2.wrapper },\n              onRenderLabel(this.props, this._onRenderLabel),\n              React__namespace.createElement(\n                \"div\",\n                { className: classNames2.fieldGroup },\n                (prefix !== void 0 || this.props.onRenderPrefix) && React__namespace.createElement(\"div\", { className: classNames2.prefix, id: this._prefixId }, onRenderPrefix(this.props, this._onRenderPrefix)),\n                multiline ? this._renderTextArea() : this._renderInput(),\n                iconProps && React__namespace.createElement(Icon, __assign$1({ className: classNames2.icon }, iconProps)),\n                hasRevealButton && // Explicitly set type=\"button\" since the default button type within a form is \"submit\"\n                React__namespace.createElement(\n                  \"button\",\n                  { \"aria-label\": revealPasswordAriaLabel, className: classNames2.revealButton, onClick: this._onRevealButtonClick, \"aria-pressed\": !!isRevealingPassword, type: \"button\" },\n                  React__namespace.createElement(\n                    \"span\",\n                    { className: classNames2.revealSpan },\n                    React__namespace.createElement(Icon, { className: classNames2.revealIcon, iconName: isRevealingPassword ? HIDE_ICON_NAME : REVEAL_ICON_NAME })\n                  )\n                ),\n                (suffix !== void 0 || this.props.onRenderSuffix) && React__namespace.createElement(\"div\", { className: classNames2.suffix, id: this._suffixId }, onRenderSuffix(this.props, this._onRenderSuffix))\n              )\n            ),\n            this._isDescriptionAvailable && React__namespace.createElement(\n              \"span\",\n              { id: this._descriptionId },\n              onRenderDescription(this.props, this._onRenderDescription),\n              errorMessage && React__namespace.createElement(\n                \"div\",\n                { role: \"alert\" },\n                React__namespace.createElement(DelayedRender, null, this._renderErrorMessage())\n              )\n            )\n          )\n        );\n      };\n      TextFieldBase2.prototype.focus = function() {\n        if (this._textElement.current) {\n          this._textElement.current.focus();\n        }\n      };\n      TextFieldBase2.prototype.blur = function() {\n        if (this._textElement.current) {\n          this._textElement.current.blur();\n        }\n      };\n      TextFieldBase2.prototype.select = function() {\n        if (this._textElement.current) {\n          this._textElement.current.select();\n        }\n      };\n      TextFieldBase2.prototype.setSelectionStart = function(value2) {\n        if (this._textElement.current) {\n          this._textElement.current.selectionStart = value2;\n        }\n      };\n      TextFieldBase2.prototype.setSelectionEnd = function(value2) {\n        if (this._textElement.current) {\n          this._textElement.current.selectionEnd = value2;\n        }\n      };\n      Object.defineProperty(TextFieldBase2.prototype, \"selectionStart\", {\n        /**\n         * Gets the selection start of the text field\n         */\n        get: function() {\n          return this._textElement.current ? this._textElement.current.selectionStart : -1;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(TextFieldBase2.prototype, \"selectionEnd\", {\n        /**\n         * Gets the selection end of the text field\n         */\n        get: function() {\n          return this._textElement.current ? this._textElement.current.selectionEnd : -1;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype.setSelectionRange = function(start, end) {\n        if (this._textElement.current) {\n          this._textElement.current.setSelectionRange(start, end);\n        }\n      };\n      TextFieldBase2.prototype._warnControlledUsage = function(prevProps) {\n        warnControlledUsage({\n          componentId: this._id,\n          props: this.props\n        });\n        if (this.props.value === null && !this._hasWarnedNullValue) {\n          this._hasWarnedNullValue = true;\n          warn$1(\"Warning: 'value' prop on '\".concat(COMPONENT_NAME$1, \"' should not be null. Consider using an \") + \"empty string to clear the component or undefined to indicate an uncontrolled component.\");\n        }\n      };\n      Object.defineProperty(TextFieldBase2.prototype, \"_id\", {\n        /** Returns `props.id` if available, or a fallback if not. */\n        get: function() {\n          return this.props.id || this._fallbackId;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(TextFieldBase2.prototype, \"_isControlled\", {\n        get: function() {\n          return isControlled(this.props, \"value\");\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype._onRenderPrefix = function(props) {\n        var prefix = props.prefix;\n        return React__namespace.createElement(\"span\", { style: { paddingBottom: \"1px\" } }, prefix);\n      };\n      TextFieldBase2.prototype._onRenderSuffix = function(props) {\n        var suffix = props.suffix;\n        return React__namespace.createElement(\"span\", { style: { paddingBottom: \"1px\" } }, suffix);\n      };\n      Object.defineProperty(TextFieldBase2.prototype, \"_errorMessage\", {\n        /**\n         * Current error message from either `props.errorMessage` or the result of `props.onGetErrorMessage`.\n         *\n         * - If there is no validation error or we have not validated the input value, errorMessage is an empty string.\n         * - If we have done the validation and there is validation error, errorMessage is the validation error message.\n         */\n        get: function() {\n          var _a2 = this.props.errorMessage, errorMessage = _a2 === void 0 ? this.state.errorMessage : _a2;\n          return errorMessage || \"\";\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype._renderErrorMessage = function() {\n        var errorMessage = this._errorMessage;\n        return errorMessage ? typeof errorMessage === \"string\" ? React__namespace.createElement(\n          \"p\",\n          { className: this._classNames.errorMessage },\n          React__namespace.createElement(\"span\", { \"data-automation-id\": \"error-message\" }, errorMessage)\n        ) : React__namespace.createElement(\"div\", { className: this._classNames.errorMessage, \"data-automation-id\": \"error-message\" }, errorMessage) : null;\n      };\n      Object.defineProperty(TextFieldBase2.prototype, \"_isDescriptionAvailable\", {\n        /**\n         * If a custom description render function is supplied then treat description as always available.\n         * Otherwise defer to the presence of description or error message text.\n         */\n        get: function() {\n          var props = this.props;\n          return !!(props.onRenderDescription || props.description || this._errorMessage);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype._renderTextArea = function() {\n        var _a2 = this.props.invalid, invalid = _a2 === void 0 ? !!this._errorMessage : _a2;\n        var textAreaProps = getNativeProps(this.props, textAreaProperties, [\"defaultValue\"]);\n        var ariaLabelledBy = this.props[\"aria-labelledby\"] || (this.props.label ? this._labelId : void 0);\n        return React__namespace.createElement(\"textarea\", __assign$1({ id: this._id }, textAreaProps, { ref: this._textElement, value: this.value || \"\", onInput: this._onInputChange, onChange: this._onInputChange, className: this._classNames.field, \"aria-labelledby\": ariaLabelledBy, \"aria-describedby\": this._isDescriptionAvailable ? this._descriptionId : this.props[\"aria-describedby\"], \"aria-invalid\": invalid, \"aria-label\": this.props.ariaLabel, readOnly: this.props.readOnly, onFocus: this._onFocus, onBlur: this._onBlur }));\n      };\n      TextFieldBase2.prototype._renderInput = function() {\n        var _a2 = this.props, ariaLabel2 = _a2.ariaLabel, _b2 = _a2.invalid, invalid = _b2 === void 0 ? !!this._errorMessage : _b2, onRenderPrefix = _a2.onRenderPrefix, onRenderSuffix = _a2.onRenderSuffix, prefix = _a2.prefix, suffix = _a2.suffix, _c2 = _a2.type, type2 = _c2 === void 0 ? \"text\" : _c2, label2 = _a2.label;\n        var labelIds = [];\n        label2 && labelIds.push(this._labelId);\n        (prefix !== void 0 || onRenderPrefix) && labelIds.push(this._prefixId);\n        (suffix !== void 0 || onRenderSuffix) && labelIds.push(this._suffixId);\n        var inputProps = __assign$1(__assign$1({ type: this.state.isRevealingPassword ? \"text\" : type2, id: this._id }, getNativeProps(this.props, inputProperties, [\"defaultValue\", \"type\"])), { \"aria-labelledby\": this.props[\"aria-labelledby\"] || (labelIds.length > 0 ? labelIds.join(\" \") : void 0), ref: this._textElement, value: this.value || \"\", onInput: this._onInputChange, onChange: this._onInputChange, className: this._classNames.field, \"aria-label\": ariaLabel2, \"aria-describedby\": this._isDescriptionAvailable ? this._descriptionId : this.props[\"aria-describedby\"], \"aria-invalid\": invalid, onFocus: this._onFocus, onBlur: this._onBlur });\n        var defaultRender = function(updatedInputProps) {\n          return React__namespace.createElement(\"input\", __assign$1({}, updatedInputProps));\n        };\n        var onRenderInput = this.props.onRenderInput || defaultRender;\n        return onRenderInput(inputProps, defaultRender);\n      };\n      TextFieldBase2.prototype._validate = function(value2) {\n        var _this = this;\n        if (this._latestValidateValue === value2 && _shouldValidateAllChanges(this.props)) {\n          return;\n        }\n        this._latestValidateValue = value2;\n        var onGetErrorMessage = this.props.onGetErrorMessage;\n        var result = onGetErrorMessage && onGetErrorMessage(value2 || \"\");\n        if (result !== void 0) {\n          if (typeof result === \"string\" || !(\"then\" in result)) {\n            this.setState({ errorMessage: result });\n            this._notifyAfterValidate(value2, result);\n          } else {\n            var currentValidation_1 = ++this._lastValidation;\n            result.then(function(errorMessage) {\n              if (currentValidation_1 === _this._lastValidation) {\n                _this.setState({ errorMessage });\n              }\n              _this._notifyAfterValidate(value2, errorMessage);\n            });\n          }\n        } else {\n          this._notifyAfterValidate(value2, \"\");\n        }\n      };\n      TextFieldBase2.prototype._notifyAfterValidate = function(value2, errorMessage) {\n        if (value2 === this.value && this.props.onNotifyValidationResult) {\n          this.props.onNotifyValidationResult(errorMessage, value2);\n        }\n      };\n      TextFieldBase2.prototype._adjustInputHeight = function() {\n        var _a2, _b2;\n        if (this._textElement.current && this.props.autoAdjustHeight && this.props.multiline) {\n          var scrollTop = (_b2 = (_a2 = this.props.scrollContainerRef) === null || _a2 === void 0 ? void 0 : _a2.current) === null || _b2 === void 0 ? void 0 : _b2.scrollTop;\n          var textField = this._textElement.current;\n          textField.style.height = \"\";\n          textField.style.height = textField.scrollHeight + \"px\";\n          if (scrollTop) {\n            this.props.scrollContainerRef.current.scrollTop = scrollTop;\n          }\n        }\n      };\n      TextFieldBase2.defaultProps = {\n        resizable: true,\n        deferredValidationTime: 200,\n        validateOnLoad: true\n      };\n      return TextFieldBase2;\n    })(React__namespace.Component)\n  );\n  function _getValue(props, state) {\n    var _a2 = props.value, value2 = _a2 === void 0 ? state.uncontrolledValue : _a2;\n    if (typeof value2 === \"number\") {\n      return String(value2);\n    }\n    return value2;\n  }\n  function _shouldValidateAllChanges(props) {\n    return !(props.validateOnFocusIn || props.validateOnFocusOut);\n  }\n  var __browserNeedsRevealButton;\n  function _browserNeedsRevealButton() {\n    if (typeof __browserNeedsRevealButton !== \"boolean\") {\n      var win = getWindow();\n      if (win === null || win === void 0 ? void 0 : win.navigator) {\n        var isEdge = /Edg/.test(win.navigator.userAgent || \"\");\n        __browserNeedsRevealButton = !(isIE11() || isEdge);\n      } else {\n        __browserNeedsRevealButton = true;\n      }\n    }\n    return __browserNeedsRevealButton;\n  }\n  var globalClassNames = {\n    root: \"ms-TextField\",\n    description: \"ms-TextField-description\",\n    errorMessage: \"ms-TextField-errorMessage\",\n    field: \"ms-TextField-field\",\n    fieldGroup: \"ms-TextField-fieldGroup\",\n    prefix: \"ms-TextField-prefix\",\n    suffix: \"ms-TextField-suffix\",\n    wrapper: \"ms-TextField-wrapper\",\n    revealButton: \"ms-TextField-reveal\",\n    multiline: \"ms-TextField--multiline\",\n    borderless: \"ms-TextField--borderless\",\n    underlined: \"ms-TextField--underlined\",\n    unresizable: \"ms-TextField--unresizable\",\n    required: \"is-required\",\n    disabled: \"is-disabled\",\n    active: \"is-active\"\n  };\n  function getLabelStyles(props) {\n    var underlined = props.underlined, disabled = props.disabled, focused = props.focused, theme = props.theme;\n    var palette = theme.palette, fonts = theme.fonts;\n    return function() {\n      var _a2;\n      return {\n        root: [\n          underlined && disabled && {\n            color: palette.neutralTertiary\n          },\n          underlined && {\n            fontSize: fonts.medium.fontSize,\n            marginRight: 8,\n            paddingLeft: 12,\n            paddingRight: 0,\n            lineHeight: \"22px\",\n            height: 32\n          },\n          underlined && focused && {\n            selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n              height: 31\n              // -1px to prevent jumpiness in HC with the increased border-width to 2px\n            }, _a2)\n          }\n        ]\n      };\n    };\n  }\n  function getStyles$1(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m;\n    var theme = props.theme, className2 = props.className, disabled = props.disabled, focused = props.focused, required2 = props.required, multiline = props.multiline, hasLabel = props.hasLabel, borderless = props.borderless, underlined = props.underlined, hasIcon = props.hasIcon, resizable = props.resizable, hasErrorMessage = props.hasErrorMessage, inputClassName = props.inputClassName, autoAdjustHeight = props.autoAdjustHeight, hasRevealButton = props.hasRevealButton;\n    var semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var classNames2 = getGlobalClassNames(globalClassNames, theme);\n    var fieldPrefixSuffix = {\n      // Suffix/Prefix are not editable so the disabled slot perfectly fits.\n      background: semanticColors.disabledBackground,\n      color: !disabled ? semanticColors.inputPlaceholderText : semanticColors.disabledText,\n      display: \"flex\",\n      alignItems: \"center\",\n      padding: \"0 10px\",\n      lineHeight: 1,\n      whiteSpace: \"nowrap\",\n      flexShrink: 0,\n      selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n        background: \"Window\",\n        color: disabled ? \"GrayText\" : \"WindowText\"\n      }, _a2)\n    };\n    var placeholderStyles = [\n      {\n        color: semanticColors.inputPlaceholderText,\n        opacity: 1,\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n          color: \"GrayText\"\n        }, _b2)\n      }\n    ];\n    var disabledPlaceholderStyles = {\n      color: semanticColors.disabledText,\n      selectors: (_c2 = {}, _c2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _c2)\n    };\n    return {\n      root: [\n        classNames2.root,\n        fonts.medium,\n        required2 && classNames2.required,\n        disabled && classNames2.disabled,\n        focused && classNames2.active,\n        multiline && classNames2.multiline,\n        borderless && classNames2.borderless,\n        underlined && classNames2.underlined,\n        normalize$1,\n        {\n          position: \"relative\"\n        },\n        className2\n      ],\n      wrapper: [\n        classNames2.wrapper,\n        underlined && [\n          {\n            display: \"flex\",\n            borderBottom: \"1px solid \".concat(!hasErrorMessage ? semanticColors.inputBorder : semanticColors.errorText),\n            width: \"100%\"\n          },\n          disabled && {\n            borderBottomColor: semanticColors.disabledBackground,\n            selectors: (_d2 = {}, _d2[HighContrastSelector] = __assign$1({ borderColor: \"GrayText\" }, getHighContrastNoAdjustStyle()), _d2)\n          },\n          !disabled && {\n            selectors: {\n              \":hover\": {\n                borderBottomColor: !hasErrorMessage ? semanticColors.inputBorderHovered : semanticColors.errorText,\n                selectors: (_e2 = {}, _e2[HighContrastSelector] = __assign$1({ borderBottomColor: \"Highlight\" }, getHighContrastNoAdjustStyle()), _e2)\n              }\n            }\n          },\n          focused && [\n            {\n              position: \"relative\"\n            },\n            getInputFocusStyle(!hasErrorMessage ? semanticColors.inputFocusBorderAlt : semanticColors.errorText, 0, \"borderBottom\")\n          ]\n        ]\n      ],\n      fieldGroup: [\n        classNames2.fieldGroup,\n        normalize$1,\n        {\n          border: \"1px solid \".concat(semanticColors.inputBorder),\n          borderRadius: effects.roundedCorner2,\n          background: semanticColors.inputBackground,\n          cursor: \"text\",\n          height: 32,\n          display: \"flex\",\n          flexDirection: \"row\",\n          alignItems: \"stretch\",\n          position: \"relative\"\n        },\n        multiline && {\n          minHeight: \"60px\",\n          height: \"auto\",\n          display: \"flex\"\n        },\n        !focused && !disabled && {\n          selectors: {\n            \":hover\": {\n              borderColor: semanticColors.inputBorderHovered,\n              selectors: (_f = {}, _f[HighContrastSelector] = __assign$1({ borderColor: \"Highlight\" }, getHighContrastNoAdjustStyle()), _f)\n            }\n          }\n        },\n        focused && !underlined && getInputFocusStyle(!hasErrorMessage ? semanticColors.inputFocusBorderAlt : semanticColors.errorText, effects.roundedCorner2),\n        disabled && {\n          borderColor: semanticColors.disabledBackground,\n          selectors: (_g = {}, _g[HighContrastSelector] = __assign$1({ borderColor: \"GrayText\" }, getHighContrastNoAdjustStyle()), _g),\n          cursor: \"default\"\n        },\n        borderless && {\n          border: \"none\"\n        },\n        borderless && focused && {\n          border: \"none\",\n          selectors: {\n            \":after\": {\n              border: \"none\"\n            }\n          }\n        },\n        underlined && {\n          flex: \"1 1 0px\",\n          border: \"none\",\n          textAlign: \"left\"\n        },\n        underlined && disabled && {\n          backgroundColor: \"transparent\"\n        },\n        hasErrorMessage && !underlined && {\n          borderColor: semanticColors.errorText,\n          selectors: {\n            \"&:hover\": {\n              borderColor: semanticColors.errorText\n            }\n          }\n        },\n        !hasLabel && required2 && {\n          selectors: (_h = {\n            \":before\": {\n              content: \"'*'\",\n              color: semanticColors.errorText,\n              position: \"absolute\",\n              top: -5,\n              right: -10\n            }\n          }, _h[HighContrastSelector] = {\n            selectors: {\n              \":before\": {\n                color: \"WindowText\",\n                right: -14\n                // moving the * 4 pixel to right to alleviate border clipping in HC mode.\n              }\n            }\n          }, _h)\n        }\n      ],\n      field: [\n        fonts.medium,\n        classNames2.field,\n        normalize$1,\n        {\n          borderRadius: 0,\n          border: \"none\",\n          background: \"none\",\n          backgroundColor: \"transparent\",\n          color: semanticColors.inputText,\n          padding: \"0 8px\",\n          width: \"100%\",\n          minWidth: 0,\n          textOverflow: \"ellipsis\",\n          outline: 0,\n          selectors: (_j = {\n            \"&:active, &:focus, &:hover\": { outline: 0 },\n            \"::-ms-clear\": {\n              display: \"none\"\n            }\n          }, _j[HighContrastSelector] = {\n            background: \"Window\",\n            color: disabled ? \"GrayText\" : \"WindowText\"\n          }, _j)\n        },\n        getPlaceholderStyles(placeholderStyles),\n        multiline && !resizable && [\n          classNames2.unresizable,\n          {\n            resize: \"none\"\n          }\n        ],\n        multiline && {\n          minHeight: \"inherit\",\n          lineHeight: 17,\n          flexGrow: 1,\n          paddingTop: 6,\n          paddingBottom: 6,\n          overflow: \"auto\",\n          width: \"100%\"\n        },\n        multiline && autoAdjustHeight && {\n          overflow: \"hidden\"\n        },\n        hasIcon && !hasRevealButton && {\n          paddingRight: 24\n        },\n        multiline && hasIcon && {\n          paddingRight: 40\n        },\n        disabled && [\n          {\n            backgroundColor: semanticColors.disabledBackground,\n            color: semanticColors.disabledText,\n            borderColor: semanticColors.disabledBackground\n          },\n          getPlaceholderStyles(disabledPlaceholderStyles)\n        ],\n        underlined && {\n          textAlign: \"left\"\n        },\n        focused && !borderless && {\n          selectors: (_k = {}, _k[HighContrastSelector] = {\n            paddingLeft: 11,\n            paddingRight: 11\n          }, _k)\n        },\n        focused && multiline && !borderless && {\n          selectors: (_l = {}, _l[HighContrastSelector] = {\n            paddingTop: 4\n            // take into consideration the 2px increased border-width (not when borderless).\n          }, _l)\n        },\n        inputClassName\n      ],\n      icon: [\n        multiline && {\n          paddingRight: 24,\n          alignItems: \"flex-end\"\n        },\n        {\n          pointerEvents: \"none\",\n          position: \"absolute\",\n          bottom: 6,\n          right: 8,\n          top: \"auto\",\n          fontSize: IconFontSizes.medium,\n          lineHeight: 18\n        },\n        disabled && {\n          color: semanticColors.disabledText\n        }\n      ],\n      description: [\n        classNames2.description,\n        {\n          color: semanticColors.bodySubtext,\n          fontSize: fonts.xSmall.fontSize\n        }\n      ],\n      errorMessage: [\n        classNames2.errorMessage,\n        AnimationClassNames.slideDownIn20,\n        fonts.small,\n        {\n          color: semanticColors.errorText,\n          margin: 0,\n          paddingTop: 5,\n          display: \"flex\",\n          alignItems: \"center\"\n        }\n      ],\n      prefix: [classNames2.prefix, fieldPrefixSuffix],\n      suffix: [classNames2.suffix, fieldPrefixSuffix],\n      revealButton: [\n        classNames2.revealButton,\n        \"ms-Button\",\n        \"ms-Button--icon\",\n        getFocusStyle(theme, { inset: 1 }),\n        {\n          height: 30,\n          width: 32,\n          border: \"none\",\n          padding: \"0px 4px\",\n          backgroundColor: \"transparent\",\n          color: semanticColors.link,\n          selectors: {\n            \":hover\": {\n              outline: 0,\n              color: semanticColors.primaryButtonBackgroundHovered,\n              backgroundColor: semanticColors.buttonBackgroundHovered,\n              selectors: (_m = {}, _m[HighContrastSelector] = {\n                borderColor: \"Highlight\",\n                color: \"Highlight\"\n              }, _m)\n            },\n            \":focus\": { outline: 0 }\n          }\n        },\n        hasIcon && {\n          marginRight: 28\n        }\n      ],\n      revealSpan: {\n        display: \"flex\",\n        height: \"100%\",\n        alignItems: \"center\"\n      },\n      revealIcon: {\n        margin: \"0px 4px\",\n        pointerEvents: \"none\",\n        bottom: 6,\n        right: 8,\n        top: \"auto\",\n        fontSize: IconFontSizes.medium,\n        lineHeight: 18\n      },\n      subComponentStyles: {\n        label: getLabelStyles(props)\n      }\n    };\n  }\n  var TextField = styled(TextFieldBase, getStyles$1, void 0, {\n    scope: \"TextField\"\n  });\n  var getClassNames = classNamesFunction();\n  var COMPONENT_NAME = \"Toggle\";\n  var ToggleBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var _a2 = props.as, RootType = _a2 === void 0 ? \"div\" : _a2, ariaLabel2 = props.ariaLabel, controlledChecked = props.checked, className2 = props.className, _b2 = props.defaultChecked, defaultChecked = _b2 === void 0 ? false : _b2, disabled = props.disabled, inlineLabel = props.inlineLabel, label2 = props.label, offAriaLabel = props.offAriaLabel, offText = props.offText, onAriaLabel = props.onAriaLabel, onChange = props.onChange, onChanged = props.onChanged, onToggleClick = props.onClick, onText = props.onText, role = props.role, styles = props.styles, theme = props.theme;\n    var _c2 = useControllableValue(controlledChecked, defaultChecked, React__namespace.useCallback(function(ev, isChecked) {\n      onChange === null || onChange === void 0 ? void 0 : onChange(ev, isChecked);\n      onChanged === null || onChanged === void 0 ? void 0 : onChanged(isChecked);\n    }, [onChange, onChanged])), checked = _c2[0], setChecked = _c2[1];\n    var classNames2 = getClassNames(styles, {\n      theme,\n      className: className2,\n      disabled,\n      checked,\n      inlineLabel,\n      onOffMissing: !onText && !offText\n    });\n    var badAriaLabel = checked ? onAriaLabel : offAriaLabel;\n    var id2 = useId(COMPONENT_NAME, props.id);\n    var labelId = \"\".concat(id2, \"-label\");\n    var stateTextId = \"\".concat(id2, \"-stateText\");\n    var stateText = checked ? onText : offText;\n    var toggleNativeProps = getNativeProps(props, inputProperties, [\n      \"defaultChecked\"\n    ]);\n    var labelledById = void 0;\n    if (!ariaLabel2 && !badAriaLabel) {\n      if (label2) {\n        labelledById = labelId;\n      }\n      if (stateText && !labelledById) {\n        labelledById = stateTextId;\n      }\n    }\n    var toggleButton = React__namespace.useRef(null);\n    useFocusRects(toggleButton);\n    useComponentRef(props, checked, toggleButton);\n    var onClick = function(ev) {\n      if (!disabled) {\n        setChecked(!checked, ev);\n        if (onToggleClick) {\n          onToggleClick(ev);\n        }\n      }\n    };\n    var slotProps = {\n      root: {\n        className: classNames2.root,\n        hidden: toggleNativeProps.hidden\n      },\n      label: {\n        children: label2,\n        className: classNames2.label,\n        htmlFor: id2,\n        id: labelId\n      },\n      container: {\n        className: classNames2.container\n      },\n      pill: __assign$1(__assign$1({}, toggleNativeProps), { \"aria-disabled\": disabled, \"aria-checked\": checked, \"aria-label\": ariaLabel2 ? ariaLabel2 : badAriaLabel, \"aria-labelledby\": labelledById, className: classNames2.pill, \"data-is-focusable\": true, \"data-ktp-target\": true, disabled, id: id2, onClick, ref: toggleButton, role: role ? role : \"switch\", type: \"button\" }),\n      thumb: {\n        className: classNames2.thumb\n      },\n      stateText: {\n        children: stateText,\n        className: classNames2.text,\n        htmlFor: id2,\n        id: stateTextId\n      }\n    };\n    return React__namespace.createElement(\n      RootType,\n      __assign$1({ ref: forwardedRef }, slotProps.root),\n      label2 && React__namespace.createElement(Label$2, __assign$1({}, slotProps.label)),\n      React__namespace.createElement(\n        \"div\",\n        __assign$1({}, slotProps.container),\n        React__namespace.createElement(\n          \"button\",\n          __assign$1({}, slotProps.pill),\n          React__namespace.createElement(\"span\", __assign$1({}, slotProps.thumb))\n        ),\n        (checked && onText || offText) && React__namespace.createElement(Label$2, __assign$1({}, slotProps.stateText))\n      )\n    );\n  });\n  ToggleBase.displayName = COMPONENT_NAME + \"Base\";\n  var useComponentRef = function(props, isChecked, toggleButtonRef) {\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        get checked() {\n          return !!isChecked;\n        },\n        focus: function() {\n          if (toggleButtonRef.current) {\n            toggleButtonRef.current.focus();\n          }\n        }\n      };\n    }, [isChecked, toggleButtonRef]);\n  };\n  var DEFAULT_PILL_WIDTH = 40;\n  var DEFAULT_PILL_HEIGHT = 20;\n  var DEFAULT_THUMB_SIZE = 12;\n  var getStyles = function(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g;\n    var theme = props.theme, className2 = props.className, disabled = props.disabled, checked = props.checked, inlineLabel = props.inlineLabel, onOffMissing = props.onOffMissing;\n    var semanticColors = theme.semanticColors, palette = theme.palette;\n    var pillUncheckedBackground = semanticColors.bodyBackground;\n    var pillCheckedBackground = semanticColors.inputBackgroundChecked;\n    var pillCheckedHoveredBackground = semanticColors.inputBackgroundCheckedHovered;\n    var thumbUncheckedHoveredBackground = palette.neutralDark;\n    var pillCheckedDisabledBackground = semanticColors.disabledBodySubtext;\n    var thumbBackground = semanticColors.smallInputBorder;\n    var thumbCheckedBackground = semanticColors.inputForegroundChecked;\n    var thumbDisabledBackground = semanticColors.disabledBodySubtext;\n    var thumbCheckedDisabledBackground = semanticColors.disabledBackground;\n    var pillBorderColor = semanticColors.smallInputBorder;\n    var pillBorderHoveredColor = semanticColors.inputBorderHovered;\n    var pillBorderDisabledColor = semanticColors.disabledBodySubtext;\n    var textDisabledColor = semanticColors.disabledText;\n    return {\n      root: [\n        \"ms-Toggle\",\n        checked && \"is-checked\",\n        !disabled && \"is-enabled\",\n        disabled && \"is-disabled\",\n        theme.fonts.medium,\n        {\n          marginBottom: \"8px\"\n        },\n        inlineLabel && {\n          display: \"flex\",\n          alignItems: \"center\"\n        },\n        className2\n      ],\n      label: [\n        \"ms-Toggle-label\",\n        { display: \"inline-block\" },\n        disabled && {\n          color: textDisabledColor,\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n            color: \"GrayText\"\n          }, _a2)\n        },\n        inlineLabel && !onOffMissing && {\n          marginRight: 16\n        },\n        onOffMissing && inlineLabel && {\n          order: 1,\n          marginLeft: 16\n        },\n        inlineLabel && { wordBreak: \"break-word\" }\n      ],\n      container: [\n        \"ms-Toggle-innerContainer\",\n        {\n          display: \"flex\",\n          position: \"relative\"\n        }\n      ],\n      pill: [\n        \"ms-Toggle-background\",\n        getFocusStyle(theme, { inset: -3 }),\n        {\n          fontSize: \"20px\",\n          boxSizing: \"border-box\",\n          width: DEFAULT_PILL_WIDTH,\n          height: DEFAULT_PILL_HEIGHT,\n          borderRadius: DEFAULT_PILL_HEIGHT / 2,\n          transition: \"all 0.1s ease\",\n          border: \"1px solid \".concat(pillBorderColor),\n          background: pillUncheckedBackground,\n          cursor: \"pointer\",\n          display: \"flex\",\n          alignItems: \"center\",\n          padding: \"0 3px\",\n          overflow: \"visible\"\n        },\n        !disabled && [\n          !checked && {\n            selectors: {\n              \":hover\": [\n                {\n                  borderColor: pillBorderHoveredColor\n                }\n              ],\n              \":hover .ms-Toggle-thumb\": [\n                {\n                  backgroundColor: thumbUncheckedHoveredBackground,\n                  selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n                    borderColor: \"Highlight\"\n                  }, _b2)\n                }\n              ]\n            }\n          },\n          checked && [\n            {\n              background: pillCheckedBackground,\n              borderColor: \"transparent\",\n              justifyContent: \"flex-end\"\n            },\n            {\n              selectors: (_c2 = {\n                \":hover\": [\n                  {\n                    backgroundColor: pillCheckedHoveredBackground,\n                    borderColor: \"transparent\",\n                    selectors: (_d2 = {}, _d2[HighContrastSelector] = {\n                      backgroundColor: \"Highlight\"\n                    }, _d2)\n                  }\n                ]\n              }, _c2[HighContrastSelector] = __assign$1({ backgroundColor: \"Highlight\" }, getHighContrastNoAdjustStyle()), _c2)\n            }\n          ]\n        ],\n        disabled && [\n          {\n            cursor: \"default\"\n          },\n          !checked && [\n            {\n              borderColor: pillBorderDisabledColor\n            }\n          ],\n          checked && [\n            {\n              backgroundColor: pillCheckedDisabledBackground,\n              borderColor: \"transparent\",\n              justifyContent: \"flex-end\"\n            }\n          ]\n        ],\n        !disabled && {\n          selectors: {\n            \"&:hover\": {\n              selectors: (_e2 = {}, _e2[HighContrastSelector] = {\n                borderColor: \"Highlight\"\n              }, _e2)\n            }\n          }\n        }\n      ],\n      thumb: [\n        \"ms-Toggle-thumb\",\n        {\n          display: \"block\",\n          width: DEFAULT_THUMB_SIZE,\n          height: DEFAULT_THUMB_SIZE,\n          borderRadius: \"50%\",\n          transition: \"all 0.1s ease\",\n          backgroundColor: thumbBackground,\n          /* Border is added to handle high contrast mode for Firefox */\n          borderColor: \"transparent\",\n          borderWidth: DEFAULT_THUMB_SIZE / 2,\n          borderStyle: \"solid\",\n          boxSizing: \"border-box\"\n        },\n        !disabled && checked && [\n          {\n            backgroundColor: thumbCheckedBackground,\n            selectors: (_f = {}, _f[HighContrastSelector] = {\n              backgroundColor: \"Window\",\n              borderColor: \"Window\"\n            }, _f)\n          }\n        ],\n        disabled && [\n          !checked && [\n            {\n              backgroundColor: thumbDisabledBackground\n            }\n          ],\n          checked && [\n            {\n              backgroundColor: thumbCheckedDisabledBackground\n            }\n          ]\n        ]\n      ],\n      text: [\n        \"ms-Toggle-stateText\",\n        {\n          selectors: {\n            // Workaround: make rules more specific than Label rules.\n            \"&&\": {\n              padding: \"0\",\n              margin: \"0 8px\",\n              userSelect: \"none\",\n              fontWeight: FontWeights.regular\n            }\n          }\n        },\n        disabled && {\n          selectors: {\n            \"&&\": {\n              color: textDisabledColor,\n              selectors: (_g = {}, _g[HighContrastSelector] = {\n                color: \"GrayText\"\n              }, _g)\n            }\n          }\n        }\n      ]\n    };\n  };\n  var Toggle = styled(ToggleBase, getStyles, void 0, {\n    scope: \"Toggle\"\n  });\n  use(registerIcons$1);\n  initializeIcons();\n  const fluentUI = {\n    ActionButton,\n    ChoiceGroup,\n    ComboBox,\n    CommandBar,\n    ContextualMenuItemType,\n    Customizer,\n    DefaultButton,\n    Dialog,\n    DialogFooter,\n    DialogType,\n    Dropdown,\n    DropdownMenuItemType: SelectableOptionMenuItemType,\n    Icon,\n    IconButton,\n    getFocusStyle,\n    getTheme,\n    Label: Label$2,\n    loadTheme,\n    Modal,\n    PrimaryButton,\n    Slider,\n    Spinner,\n    SpinnerSize,\n    TextField,\n    Toggle,\n    registerIcons: registerIcons$1,\n    unregisterIcons: unregisterIcons$1\n  };\n  const strings = {\n    buttonLoadData: \"Load data\",\n    buttonThemeDark: \"Dark\",\n    buttonThemeLight: \"Light\",\n    buttonExport: \"Export\",\n    menuUserData: \"Use your own data\",\n    menuLocal: \"On this computer ...\",\n    menuUrl: \"Enter a URL ...\",\n    menuSnapshotsExportAsJSON: \"Export as .snapshots JSON file\",\n    menuSnapshotsExportAs: \"Export as ...\",\n    menuSnapshotsImport: \"Import a .snapshots JSON file\",\n    dialogTitleLocal: \"Use a file from your computer\",\n    dialogSubtextLocal: \"Your file will not be uploaded, it is only used by the browser on this computer.  The currently supported data formats are json (the default), csv (comma-separated values), tsv (tab-separated values), and topojson.\",\n    dialogTitleUrl: \"Use a data file via URL\",\n    dialogTitleSnapshotsExport: \"Export as\",\n    dialogTitleSnapshotsLocal: \"Use a snapshots file from your computer\",\n    dialogSubtextSnapshotsLocal: \"Use a file that was previously exported snapshots file. Your file will not be uploaded, it is only used by the browser on this computer.\",\n    dialogTitleSnapshotsUrl: \"Use a snapshots file via URL\",\n    dialogLoadButton: \"Load\",\n    labelLocal: \"[local]\",\n    labelColorFilter: \"Note: Colors will be re-mapped to the filter when viewing this saved chart.\",\n    labelPreferences: \"Preferences\",\n    labelCompactUI: \"Compact UI\",\n    labelCompactUIDescription: \"Compact UI hides collapses labels on dropdown menus.\",\n    labelSnapshotsExportHTMLTitle: \"HTML\",\n    labelSnapshotsExportHTMLDescription: \"A self contained HTML page with current data and snapshots pre-loaded.\",\n    labelSnapshotsExportMarkdownTitle: \"Markdown\",\n    labelSnapshotsExportMarkdownDescription: \"Markdown is a language used by many blogging platforms. Exports a Markdown file with thumbnails of these snapshots which link back to the SandDance website.\",\n    labelSnapshotsShortcut: \"Tip: Your .snapshots JSON file can also be pre-loaded with this\",\n    labelShare: \"share\",\n    labelLink: \"link\",\n    labelLinkDescription: \"A URL to revive this snapshot.\",\n    labelUrl: \"Url\",\n    labelDataFormat: \"Data format\",\n    labelDataUrlShortcut: \"Tip: Your data file can also be pre-loaded with this\",\n    urlInputPlaceholder: \"paste URL\",\n    sampleDataPrefix: \"Sample data\",\n    localFilePrefix: \"Local file\",\n    urlPrefix: \"Url\",\n    errorInvalidFileFormat: \"Invalid file format\",\n    errorNoUrl: \"Please enter a url\",\n    errorUrlHttp: 'Url must begin with \"http\"',\n    errorDownloadFailure: \"Data could not be prepared for download.\",\n    errorDataSourceFromLocal: (ds) => `Could not load ${ds.type} from local file.`,\n    errorDataSourceFromUrl: (ds) => `Could not load ${ds.type} from ${ds.dataUrl}`\n  };\n  function invalidUrlError(url) {\n    if (!url) {\n      return strings.errorNoUrl;\n    }\n    if (url.toLocaleLowerCase().substr(0, 4) !== \"http\") {\n      return strings.errorUrlHttp;\n    }\n  }\n  function DataSourceButton(props) {\n    const picker = props.getPicker();\n    if (!picker)\n      return null;\n    const menuProps = {\n      items: [\n        {\n          key: \"sample-section\",\n          itemType: base.fluentUI.ContextualMenuItemType.Section,\n          sectionProps: {\n            title: strings.sampleDataPrefix,\n            items: props.dataSources.map((ds, i) => {\n              const item = {\n                key: ds.id,\n                text: ds.displayName,\n                onClick: (e) => {\n                  picker.changeDataSource(ds);\n                }\n              };\n              return item;\n            })\n          }\n        },\n        {\n          key: \"user-section\",\n          itemType: base.fluentUI.ContextualMenuItemType.Section,\n          sectionProps: {\n            topDivider: true,\n            title: strings.menuUserData,\n            items: [\n              {\n                key: \"local\",\n                text: strings.menuLocal,\n                onClick: (e) => picker.setState({ dialogMode: \"local\" })\n              },\n              {\n                key: \"url\",\n                text: strings.menuUrl,\n                onClick: (e) => picker.setState({ dialogMode: \"url\" })\n              }\n            ]\n          }\n        }\n      ]\n    };\n    return React__namespace.createElement(base.fluentUI.PrimaryButton, { className: \"sanddance-datasource-picker\", text: dataSourcePrefix(props.dataSource.dataSourceType, props.dataSource.displayName), menuProps });\n  }\n  class DataSourcePicker extends React__namespace.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        url: \"\",\n        urlType: DataSourcePicker.urlTypes[0],\n        working: false\n      };\n    }\n    changeDataSource(dataSource) {\n      this.setState({ working: true });\n      return new Promise((resolve2, reject) => {\n        const uploadFormatError = \"\";\n        const urlError = \"\";\n        this.setState({ uploadFormatError, urlError });\n        this.props.changeDataSource(dataSource).then(() => {\n          this.setState({\n            working: false,\n            uploadFormatError: \"\",\n            urlError: \"\",\n            dialogMode: null\n          });\n          resolve2();\n        }).catch((reason) => {\n          this.setState({ working: false });\n          reject(reason);\n        });\n      });\n    }\n    upload(e) {\n      if (e.target.files) {\n        const file = e.target.files[0];\n        const split = file.name.split(\".\");\n        const type2 = split[split.length - 1];\n        if (DataSourcePicker.urlTypes.indexOf(type2) >= 0) {\n          const reader = new FileReader();\n          reader.onload = () => {\n            const id2 = file.name;\n            const displayName = file.name;\n            const rawText = reader.result;\n            const ds = {\n              dataSourceType: \"local\",\n              displayName,\n              id: id2,\n              rawText,\n              type: type2\n            };\n            this.changeDataSource(ds);\n          };\n          reader.readAsText(file);\n        } else {\n          const uploadFormatError = strings.errorInvalidFileFormat;\n          this.setState({ uploadFormatError });\n        }\n      }\n    }\n    loadUrl() {\n      if (!this.state.url) {\n        return this.setState({ urlError: strings.errorNoUrl });\n      }\n      if (this.state.url.toLocaleLowerCase().substr(0, 4) !== \"http\") {\n        return this.setState({ urlError: strings.errorUrlHttp });\n      }\n      const { url } = this.state;\n      const ds = {\n        dataSourceType: \"url\",\n        displayName: url,\n        id: url,\n        dataUrl: url,\n        type: this.state.urlType\n      };\n      this.changeDataSource(ds).catch((e) => {\n        this.setState({ urlError: e.message });\n      });\n    }\n    getUrlShortcut(dataUrl, type2) {\n      const dss = {\n        dataSource: {\n          dataSourceType: \"url\",\n          dataUrl,\n          displayName: dataUrl.substring(dataUrl.lastIndexOf(\"/\") + 1, dataUrl.lastIndexOf(\".\")),\n          id: \"\",\n          type: type2\n        }\n      };\n      return \"#\" + JSON.stringify(dss);\n    }\n    render() {\n      const closeDialog = () => {\n        this.setState({ dialogMode: null });\n      };\n      let shortcut;\n      if (this.state.url && !invalidUrlError(this.state.url) && !this.state.urlError) {\n        shortcut = this.getUrlShortcut(this.state.url, this.state.urlType);\n      }\n      return [React__namespace.createElement(\n        Dialog$1,\n        { key: \"local\", hidden: !(this.state.dialogMode === \"local\"), onDismiss: closeDialog, dialogContentProps: {\n          className: `sanddance-dialog ${this.props.theme}`,\n          type: base.fluentUI.DialogType.normal,\n          title: strings.dialogTitleLocal,\n          subText: strings.dialogSubtextLocal\n        } },\n        React__namespace.createElement(\"input\", { type: \"file\", onChange: (e) => this.upload(e), disabled: this.state.working }),\n        this.state.uploadFormatError && React__namespace.createElement(\"div\", { className: \"error\" }, this.state.uploadFormatError)\n      ), React__namespace.createElement(\n        Dialog$1,\n        { key: \"url\", hidden: !(this.state.dialogMode === \"url\"), onDismiss: closeDialog, dialogContentProps: {\n          className: `sanddance-dialog ${this.props.theme}`,\n          type: base.fluentUI.DialogType.normal,\n          title: strings.dialogTitleUrl\n        }, buttons: [\n          React__namespace.createElement(base.fluentUI.PrimaryButton, { key: 0, onClick: (e) => this.loadUrl(), iconProps: { iconName: \"CloudDownload\" }, text: strings.dialogLoadButton, disabled: this.state.working })\n        ] },\n        React__namespace.createElement(\n          \"section\",\n          null,\n          React__namespace.createElement(base.fluentUI.TextField, { label: strings.labelUrl, placeholder: strings.urlInputPlaceholder, onKeyUp: (e) => e.keyCode === 13 && this.loadUrl(), onChange: (e, url) => this.setState({ url, urlError: \"\" }), value: this.state.url, disabled: this.state.working }),\n          this.state.urlError && React__namespace.createElement(\"div\", { className: \"error\" }, this.state.urlError)\n        ),\n        React__namespace.createElement(\n          \"section\",\n          null,\n          React__namespace.createElement(base.fluentUI.ChoiceGroup, { selectedKey: this.state.urlType, options: DataSourcePicker.urlTypes.map((urlType, i) => {\n            return {\n              key: urlType,\n              text: urlType,\n              disabled: this.state.working\n            };\n          }), onChange: (ev, option) => this.setState({ urlType: option.text, urlError: \"\" }), label: strings.labelDataFormat })\n        ),\n        React__namespace.createElement(\n          \"section\",\n          { className: \"tip\", style: { visibility: !invalidUrlError(this.state.url) && !this.state.urlError ? \"visible\" : \"hidden\" } },\n          strings.labelDataUrlShortcut,\n          \" \",\n          React__namespace.createElement(\"a\", { href: shortcut, title: strings.labelLinkDescription, \"aria-label\": strings.labelLinkDescription }, strings.labelLink)\n        )\n      )];\n    }\n  }\n  DataSourcePicker.urlTypes = [\"json\", \"csv\", \"tsv\", \"topojson\"];\n  function dataSourcePrefix(dt, displayName) {\n    switch (dt) {\n      case \"sample\":\n        return `${strings.sampleDataPrefix}: ${displayName}`;\n      case \"local\":\n        return strings.localFilePrefix;\n      case \"url\":\n        return strings.urlPrefix;\n    }\n    return strings.buttonLoadData;\n  }\n  function downloadData(data2, fileName) {\n    const a2 = document.createElement(\"a\");\n    a2.setAttribute(\"download\", fileName);\n    document.body.appendChild(a2);\n    const blob = dataURIToBlob(data2);\n    a2.href = URL.createObjectURL(blob);\n    a2.onclick = () => {\n      requestAnimationFrame(() => URL.revokeObjectURL(a2.href));\n      document.body.removeChild(a2);\n    };\n    a2.click();\n  }\n  function dataURIToBlob(binStr) {\n    const len2 = binStr.length, arr = new Uint8Array(len2);\n    for (let i = 0; i < len2; i++) {\n      arr[i] = binStr.charCodeAt(i);\n    }\n    return new Blob([arr]);\n  }\n  var util = util$4;\n  function markdownImageLink(alt, imageUrl, link2) {\n    return `[![${alt}](${imageUrl})](${link2})`;\n  }\n  function cleanSnapshots(snapshots) {\n    const clean = util.clone(snapshots);\n    clean.forEach((snapshot) => {\n      if (snapshot.dataSource) {\n        delete snapshot.dataSource.snapshotsUrl;\n      }\n    });\n    return clean;\n  }\n  function downloadSnapshotsJSON(snapshots, filename) {\n    const clean = cleanSnapshots(snapshots);\n    downloadData(JSON.stringify(clean, null, 2), filename);\n  }\n  function serializeSnapshot(snapshotWithImage) {\n    const snapshot = util.clone(snapshotWithImage);\n    delete snapshot.bgColor;\n    delete snapshot.image;\n    if (snapshot.dataSource) {\n      delete snapshot.dataSource.rawText;\n    }\n    return JSON.stringify(snapshot);\n  }\n  function isSnapshot(snapshot) {\n    return snapshot.insight && snapshot.title;\n  }\n  function validSnapshots(snapshots) {\n    if (Array.isArray(snapshots)) {\n      for (let i = 0; i < snapshots.length; i++) {\n        if (!isSnapshot(snapshots[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n  class SnapshotImportLocal extends React__namespace.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        working: false\n      };\n    }\n    readFile(e) {\n      if (e.target.files) {\n        this.setState({ working: true });\n        const file = e.target.files[0];\n        const reader = new FileReader();\n        reader.onload = () => {\n          const rawText = reader.result;\n          let snapshots;\n          try {\n            snapshots = JSON.parse(rawText);\n          } catch (e3) {\n            this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n          }\n          if (validSnapshots(snapshots)) {\n            this.props.onImportSnapshot(snapshots);\n            this.setState({ working: false });\n            this.props.onDismiss();\n          } else {\n            this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n          }\n        };\n        reader.readAsText(file);\n      }\n    }\n    render() {\n      return React__namespace.createElement(\n        \"div\",\n        null,\n        React__namespace.createElement(\n          Dialog$1,\n          { hidden: false, onDismiss: this.props.onDismiss, dialogContentProps: {\n            className: `sanddance-dialog ${this.props.theme}`,\n            type: base.fluentUI.DialogType.normal,\n            title: strings.dialogTitleSnapshotsLocal,\n            subText: strings.dialogSubtextSnapshotsLocal\n          } },\n          React__namespace.createElement(\n            \"section\",\n            null,\n            React__namespace.createElement(\"input\", { type: \"file\", onChange: (e) => this.readFile(e), disabled: this.state.working }),\n            this.state.fileFormatError && React__namespace.createElement(\"div\", { className: \"error\" }, this.state.fileFormatError)\n          )\n        )\n      );\n    }\n  }\n  class SnapshotImportRemote extends React__namespace.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        working: false\n      };\n    }\n    getUrlShortcut() {\n      const dataSource = util.clone(this.props.dataSource);\n      delete dataSource.snapshots;\n      dataSource.snapshotsUrl = this.state.url;\n      const dss = {\n        dataSource\n      };\n      return \"#\" + JSON.stringify(dss);\n    }\n    loadUrl() {\n      const urlError = invalidUrlError(this.state.url);\n      if (urlError) {\n        return this.setState({ urlError });\n      }\n      const { url } = this.state;\n      fetch(url).then((response) => {\n        if (response.status === 200) {\n          return response.json();\n        } else {\n          this.setState({ urlError: response.statusText });\n        }\n      }).then((snapshots) => {\n        if (validSnapshots(snapshots)) {\n          this.props.onImportSnapshot(snapshots);\n          this.props.onSnapshotsUrl(url);\n          this.setState({ working: false });\n          this.props.onDismiss();\n        } else {\n          this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n        }\n      }).catch((e) => {\n        this.setState({ urlError: e });\n      });\n    }\n    render() {\n      let shortcut;\n      if (this.props.dataSource.dataSourceType !== \"local\" && this.state.url && !invalidUrlError(this.state.url) && !this.state.urlError) {\n        shortcut = this.getUrlShortcut();\n      }\n      return React__namespace.createElement(\n        \"div\",\n        null,\n        React__namespace.createElement(\n          Dialog$1,\n          { hidden: false, onDismiss: this.props.onDismiss, dialogContentProps: {\n            className: `sanddance-dialog ${this.props.theme}`,\n            type: base.fluentUI.DialogType.normal,\n            title: strings.dialogTitleSnapshotsUrl\n          }, buttons: [\n            React__namespace.createElement(base.fluentUI.PrimaryButton, { disabled: !this.state.url || !!this.state.urlError, key: 0, onClick: (e) => this.loadUrl(), iconProps: { iconName: \"CloudDownload\" }, text: strings.dialogLoadButton })\n          ] },\n          React__namespace.createElement(\n            \"section\",\n            null,\n            React__namespace.createElement(base.fluentUI.TextField, { label: strings.labelUrl, placeholder: strings.urlInputPlaceholder, onKeyUp: (e) => e.keyCode === 13 && this.loadUrl(), onChange: (e, url) => this.setState({ url, urlError: \"\" }), value: this.state.url, disabled: this.state.working }),\n            this.state.urlError && React__namespace.createElement(\"div\", { className: \"error\" }, this.state.urlError)\n          ),\n          this.props.dataSource.dataSourceType !== \"local\" && React__namespace.createElement(\n            \"section\",\n            { className: \"tip\", style: { visibility: !invalidUrlError(this.state.url) && !this.state.urlError ? \"visible\" : \"hidden\" } },\n            strings.labelSnapshotsShortcut,\n            \" \",\n            React__namespace.createElement(\"a\", { href: shortcut, title: strings.labelLinkDescription, \"aria-label\": strings.labelLinkDescription }, strings.labelShare)\n          )\n        )\n      );\n    }\n  }\n  function SnapshotExport(props) {\n    return React__namespace.createElement(\n      Dialog$1,\n      { hidden: false, onDismiss: props.onDismiss, dialogContentProps: {\n        className: `sanddance-dialog ${props.theme} sanddance-export`,\n        type: base.fluentUI.DialogType.normal,\n        title: strings.dialogTitleSnapshotsExport\n      } },\n      React__namespace.createElement(\n        \"ul\",\n        null,\n        React__namespace.createElement(\n          \"li\",\n          null,\n          React__namespace.createElement(\"strong\", null, strings.labelSnapshotsExportHTMLTitle),\n          React__namespace.createElement(\"div\", null, strings.labelSnapshotsExportHTMLDescription),\n          React__namespace.createElement(base.fluentUI.PrimaryButton, { iconProps: { iconName: \"Download\" }, text: `${strings.buttonExport} ${strings.labelSnapshotsExportHTMLTitle}`, onClick: (e) => {\n            const clean = cleanSnapshots(props.snapshots);\n            const html = getEmbedHTML(props.explorer.state.dataContent.data, props.dataSource.displayName, clean);\n            downloadData(html, `${props.dataSource.displayName}.html`);\n          } })\n        ),\n        React__namespace.createElement(\n          \"li\",\n          null,\n          React__namespace.createElement(\"strong\", null, strings.labelSnapshotsExportMarkdownTitle),\n          React__namespace.createElement(\"div\", null, strings.labelSnapshotsExportMarkdownDescription),\n          React__namespace.createElement(base.fluentUI.PrimaryButton, { iconProps: { iconName: \"Download\" }, text: `${strings.buttonExport} ${strings.labelSnapshotsExportMarkdownTitle}`, onClick: (e) => {\n            const sections = props.snapshots.map((snapshot) => {\n              const section = [`## ${snapshot.title}`];\n              section.push(snapshot.description);\n              section.push(\"\\n\");\n              const url = `${location.origin}/#${encodeURIComponent(serializeSnapshot(snapshot))}`;\n              section.push(markdownImageLink(snapshot.title, snapshot.image, url));\n              return section.join(\"\\n\");\n            });\n            sections.unshift(`# ${props.dataSource.displayName}`);\n            downloadData(sections.join(\"\\n\\n\"), `${props.dataSource.displayName}.snapshots.md`);\n          } })\n        )\n      )\n    );\n  }\n  function getViewerOptions(darkTheme2, themeColors2) {\n    const colors2 = themeColors2 && themeColors2[darkTheme2 ? \"dark\" : \"light\"];\n    const viewerOptions = {\n      colors: Object.assign(Object.assign({}, getColorSettingsFromThemePalette(themePalettes[darkTheme2 ? \"dark-theme\" : \"\"])), colors2)\n    };\n    return viewerOptions;\n  }\n  function getSnapshotFromHash() {\n    const hash = document.location.hash && document.location.hash.substring(1);\n    if (hash) {\n      try {\n        return JSON.parse(decodeURIComponent(hash));\n      } catch (e) {\n      }\n    }\n  }\n  let snapshotOnLoad = getSnapshotFromHash();\n  if (snapshotOnLoad && snapshotOnLoad.dataSource && snapshotOnLoad.dataSource.dataSourceType === \"local\") {\n    snapshotOnLoad = null;\n  }\n  class SandDanceApp extends React__namespace.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        compactUI: !!localStorage.getItem(\"compactUI\"),\n        dialogMode: null,\n        dataSource: snapshotOnLoad && snapshotOnLoad.dataSource || props.dataSources[0],\n        darkTheme: props.darkTheme\n      };\n      this.viewerOptions = getViewerOptions(this.state.darkTheme, props.themeColors);\n      this.handlers = {\n        hashchange: (e) => {\n          const snapshot = getSnapshotFromHash();\n          if (snapshot) {\n            this.explorer && this.explorer.calculate(() => this.hydrateSnapshot(snapshot));\n          }\n        },\n        resize: (e) => {\n          this.explorer && this.explorer.resize();\n        }\n      };\n      this.wireEventHandlers(true);\n      this.changeColorScheme(this.state.darkTheme);\n    }\n    wireEventHandlers(add2) {\n      for (const key2 in this.handlers) {\n        if (add2) {\n          window.addEventListener(key2, this.handlers[key2]);\n        } else {\n          window.removeEventListener(key2, this.handlers[key2]);\n        }\n      }\n    }\n    isSameDataSource(a2, b2) {\n      if (a2.dataSourceType === b2.dataSourceType && a2.type === b2.type && a2.id === b2.id) {\n        if (a2.dataSourceType === \"url\") {\n          return a2.dataUrl === b2.dataUrl;\n        }\n        return true;\n      }\n      return false;\n    }\n    hydrateSnapshot(snapshot, selectedSnapshotIndex = -1) {\n      if (snapshot.dataSource) {\n        if (this.isSameDataSource(snapshot.dataSource, this.state.dataSource)) {\n          if (selectedSnapshotIndex === -1) {\n            this.explorer.reviveSnapshot(snapshot);\n          } else {\n            this.explorer.reviveSnapshot(selectedSnapshotIndex);\n          }\n          if (snapshot.dataSource.snapshotsUrl && snapshot.dataSource.snapshotsUrl !== this.state.dataSource.snapshotsUrl) {\n            fetch(snapshot.dataSource.snapshotsUrl).then((response) => response.json()).then((snapshots) => {\n              if (validSnapshots(snapshots)) {\n                this.explorer.setState({ snapshots });\n                const dataSource = Object.assign({}, this.state.dataSource);\n                dataSource.snapshotsUrl = snapshot.dataSource.snapshotsUrl;\n                this.setState({ dataSource });\n              }\n            });\n          }\n        } else {\n          if (snapshot.dataSource.dataSourceType === \"local\") {\n            this.dataSourcePicker.setState({ dialogMode: \"local\" });\n            this.postLoad = (ds) => {\n              if (this.isSameDataSource(snapshot.dataSource, ds)) {\n                this.hydrateSnapshot(snapshot, selectedSnapshotIndex);\n              }\n            };\n          } else {\n            this.load(snapshot.dataSource, snapshot.insight).then(() => {\n              this.explorer.setState({ sideTabId: SideTabId.Snapshots, note: snapshot.description });\n              this.explorer.scrollSnapshotIntoView(selectedSnapshotIndex);\n            }).catch((e) => {\n              this.loadError(snapshot.dataSource);\n            });\n          }\n        }\n        return true;\n      }\n    }\n    load(dataSource, partialInsight) {\n      dataSource = clone(dataSource);\n      this.setState({ dataSource });\n      document.title = `SandDance - ${dataSource.displayName}`;\n      return this.explorer.load(dataSource, (columns) => {\n        return partialInsight || this.props.insights && this.props.insights[dataSource.id];\n      }, this.props.initialOptions && deepMerge({}, this.props.initialOptions[\"*\"], this.props.initialOptions[dataSource.id]));\n    }\n    dataSourceError(dataSource) {\n      switch (dataSource.dataSourceType) {\n        case \"local\":\n          return strings.errorDataSourceFromLocal(dataSource);\n        case \"sample\":\n        case \"url\":\n          return strings.errorDataSourceFromUrl(dataSource);\n      }\n    }\n    loadError(dataSource) {\n      const error2 = this.dataSourceError(dataSource);\n      this.explorer.setState({ errors: [error2] });\n      this.setState({ dataSource: { dataSourceType: null, id: null, type: null } });\n    }\n    updateExplorerViewerOptions(viewerOptions) {\n      this.viewerOptions = viewerOptions;\n      this.explorer && this.explorer.updateViewerOptions(this.viewerOptions);\n    }\n    getThemePalette(darkTheme2) {\n      const theme = darkTheme2 ? \"dark-theme\" : \"\";\n      return themePalettes[theme];\n    }\n    changeColorScheme(darkTheme2) {\n      this.updateExplorerViewerOptions(getViewerOptions(darkTheme2, this.props.themeColors));\n      base$3.vega.scheme(ColorScaleNone, (x2) => this.explorer.viewer.options.colors.defaultCube);\n      this.explorer && this.explorer.viewer && this.explorer.viewer.renderSameLayout(this.viewerOptions);\n      base.fluentUI.loadTheme({ palette: this.getThemePalette(darkTheme2) });\n    }\n    render() {\n      const theme = this.state.darkTheme ? \"dark-theme\" : \"\";\n      const dataSourceProps = {\n        dataSource: this.state.dataSource,\n        dataSources: this.props.dataSources,\n        changeDataSource: (dataSource) => {\n          document.location.hash = \"\";\n          return this.load(dataSource).then(() => {\n            if (this.postLoad) {\n              this.postLoad(dataSource);\n              this.postLoad = null;\n            }\n          }).catch(() => this.loadError(dataSource));\n        }\n      };\n      return React__namespace.createElement(\n        \"section\",\n        { className: \"sanddance-app\" },\n        React__namespace.createElement(Explorer, { logoClickTarget: \"_self\", logoClickUrl: \"/SandDance/\", theme, snapshotProps: {\n          modifySnapShot: (snapshot) => {\n            snapshot.dataSource = this.state.dataSource;\n          },\n          getTopActions: (snapshots) => {\n            const items = [\n              {\n                key: \"import\",\n                text: strings.menuSnapshotsImport,\n                subMenuProps: {\n                  items: [\n                    {\n                      key: \"import-local\",\n                      text: strings.menuLocal,\n                      onClick: () => this.setState({ dialogMode: \"import-local\" })\n                    },\n                    {\n                      key: \"import-remote\",\n                      text: strings.menuUrl,\n                      onClick: () => this.setState({ dialogMode: \"import-remote\" })\n                    }\n                  ]\n                }\n              },\n              {\n                key: \"export\",\n                text: strings.menuSnapshotsExportAsJSON,\n                disabled: snapshots.length === 0,\n                onClick: () => downloadSnapshotsJSON(snapshots, `${this.state.dataSource.displayName}.snapshots`)\n              },\n              {\n                key: \"export-as\",\n                text: strings.menuSnapshotsExportAs,\n                disabled: snapshots.length === 0,\n                onClick: () => this.setState({ dialogMode: \"export\" })\n              }\n            ];\n            return items;\n          },\n          getChildren: (snapshots) => React__namespace.createElement(\n            \"div\",\n            null,\n            this.state.dialogMode === \"import-local\" && React__namespace.createElement(SnapshotImportLocal, { theme, dataSource: this.state.dataSource, onImportSnapshot: (snapshots2) => this.explorer.setState({ snapshots: snapshots2 }), onDismiss: () => this.setState({ dialogMode: null }) }),\n            this.state.dialogMode === \"import-remote\" && React__namespace.createElement(SnapshotImportRemote, { theme, dataSource: this.state.dataSource, onImportSnapshot: (snapshots2) => this.explorer.setState({ snapshots: snapshots2 }), onSnapshotsUrl: (snapshotsUrl) => {\n              const dataSource = Object.assign({}, this.state.dataSource);\n              dataSource.snapshotsUrl = snapshotsUrl;\n              this.setState({ dataSource });\n            }, onDismiss: () => this.setState({ dialogMode: null }) }),\n            this.state.dialogMode === \"export\" && React__namespace.createElement(SnapshotExport, { explorer: this.explorer, dataSource: this.state.dataSource, snapshots, onDismiss: () => this.setState({ dialogMode: null }), theme })\n          ),\n          getActions: (snapshot, i) => {\n            const url = \"#\" + serializeSnapshot(snapshot);\n            let element2;\n            if (snapshot.dataSource && snapshot.dataSource.dataSourceType === \"local\") {\n              element2 = React__namespace.createElement(\"span\", { key: `link${i}` }, strings.labelLocal);\n            } else {\n              element2 = React__namespace.createElement(\"a\", { key: `link${i}`, href: url, title: strings.labelLinkDescription, \"aria-label\": strings.labelLinkDescription }, strings.labelShare);\n            }\n            return [{ element: element2 }];\n          },\n          getTitle: (insight) => `${this.state.dataSource.displayName} ${insight.chart}`,\n          getDescription: (insight) => \"\"\n          //TODO create description from filter etc.\n        }, onSnapshotClick: (snapshot, selectedSnapshotIndex) => this.hydrateSnapshot(snapshot, selectedSnapshotIndex), initialView: \"2d\", mounted: (e) => {\n          this.explorer = e;\n          this.load(this.state.dataSource, snapshotOnLoad && snapshotOnLoad.insight).catch((e3) => {\n            this.loadError(this.state.dataSource);\n          });\n          this.props.mounted(this);\n        }, dataExportHandler: (data2, datatype, displayName) => {\n          try {\n            downloadData(data2, `${displayName}.${datatype}`);\n          } catch (e) {\n            this.explorer.setState({ errors: [strings.errorDownloadFailure] });\n          }\n        }, datasetElement: React__namespace.createElement(DataSourceButton, Object.assign({ getPicker: () => this.dataSourcePicker }, dataSourceProps)), topBarButtonProps: [\n          {\n            key: \"theme\",\n            text: this.state.darkTheme ? strings.buttonThemeLight : strings.buttonThemeDark,\n            iconProps: {\n              iconName: this.state.darkTheme ? \"Sunny\" : \"ClearNight\"\n            },\n            onClick: () => {\n              const darkTheme2 = !this.state.darkTheme;\n              this.props.setTheme && this.props.setTheme(darkTheme2);\n              this.setState({ darkTheme: darkTheme2 });\n              this.changeColorScheme(darkTheme2);\n            }\n          }\n        ], viewerOptions: this.viewerOptions, compactUI: this.state.compactUI, additionalSettings: [\n          {\n            groupLabel: strings.labelPreferences,\n            children: React__namespace.createElement(base.fluentUI.Toggle, { label: strings.labelCompactUI, title: strings.labelCompactUIDescription, checked: this.state.compactUI, onChange: (e, checked) => {\n              if (checked) {\n                localStorage.setItem(\"compactUI\", \"true\");\n              } else {\n                localStorage.removeItem(\"compactUI\");\n              }\n              this.setState({ compactUI: checked });\n            } })\n          }\n        ] }),\n        React__namespace.createElement(DataSourcePicker, Object.assign({ ref: (dsp) => {\n          if (dsp && !this.dataSourcePicker)\n            this.dataSourcePicker = dsp;\n        }, theme }, dataSourceProps))\n      );\n    }\n  }\n  function accessor(fn2, fields, name) {\n    fn2.fields = fields || [];\n    fn2.fname = name;\n    return fn2;\n  }\n  function accessorName(fn2) {\n    return fn2 == null ? null : fn2.fname;\n  }\n  function accessorFields(fn2) {\n    return fn2 == null ? null : fn2.fields;\n  }\n  function getter$1(path2) {\n    return path2.length === 1 ? get1(path2[0]) : getN(path2);\n  }\n  const get1 = (field2) => function(obj2) {\n    return obj2[field2];\n  };\n  const getN = (path2) => {\n    const len2 = path2.length;\n    return function(obj2) {\n      for (let i = 0; i < len2; ++i) {\n        obj2 = obj2[path2[i]];\n      }\n      return obj2;\n    };\n  };\n  function error(message) {\n    throw Error(message);\n  }\n  function splitAccessPath(p) {\n    const path2 = [], n = p.length;\n    let q = null, b2 = 0, s2 = \"\", i, j, c2;\n    p = p + \"\";\n    function push2() {\n      path2.push(s2 + p.substring(i, j));\n      s2 = \"\";\n      i = j + 1;\n    }\n    for (i = j = 0; j < n; ++j) {\n      c2 = p[j];\n      if (c2 === \"\\\\\") {\n        s2 += p.substring(i, j++);\n        i = j;\n      } else if (c2 === q) {\n        push2();\n        q = null;\n        b2 = -1;\n      } else if (q) {\n        continue;\n      } else if (i === b2 && c2 === '\"') {\n        i = j + 1;\n        q = c2;\n      } else if (i === b2 && c2 === \"'\") {\n        i = j + 1;\n        q = c2;\n      } else if (c2 === \".\" && !b2) {\n        if (j > i) {\n          push2();\n        } else {\n          i = j + 1;\n        }\n      } else if (c2 === \"[\") {\n        if (j > i) push2();\n        b2 = i = j + 1;\n      } else if (c2 === \"]\") {\n        if (!b2) error(\"Access path missing open bracket: \" + p);\n        if (b2 > 0) push2();\n        b2 = 0;\n        i = j + 1;\n      }\n    }\n    if (b2) error(\"Access path missing closing bracket: \" + p);\n    if (q) error(\"Access path missing closing quote: \" + p);\n    if (j > i) {\n      j++;\n      push2();\n    }\n    return path2;\n  }\n  function field$1(field2, name, opt) {\n    const path2 = splitAccessPath(field2);\n    field2 = path2.length === 1 ? path2[0] : field2;\n    return accessor((opt && opt.get || getter$1)(path2), [field2], name || field2);\n  }\n  const id = field$1(\"id\");\n  const identity$2 = accessor((_) => _, [], \"identity\");\n  const zero$1 = accessor(() => 0, [], \"zero\");\n  const one$1 = accessor(() => 1, [], \"one\");\n  const truthy = accessor(() => true, [], \"true\");\n  const falsy = accessor(() => false, [], \"false\");\n  const DisallowedObjectProperties = /* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype).filter((name) => typeof Object.prototype[name] === \"function\"), \"__proto__\"]);\n  function log$1$1(method2, level, input) {\n    const args = [level].concat([].slice.call(input));\n    console[method2].apply(console, args);\n  }\n  const None$2 = 0;\n  const Error$1 = 1;\n  const Warn = 2;\n  const Info = 3;\n  const Debug = 4;\n  function logger(_, method2, handler = log$1$1) {\n    let level = _ || None$2;\n    return {\n      level(_2) {\n        if (arguments.length) {\n          level = +_2;\n          return this;\n        } else {\n          return level;\n        }\n      },\n      error() {\n        if (level >= Error$1) handler(method2 || \"error\", \"ERROR\", arguments);\n        return this;\n      },\n      warn() {\n        if (level >= Warn) handler(method2 || \"warn\", \"WARN\", arguments);\n        return this;\n      },\n      info() {\n        if (level >= Info) handler(method2 || \"log\", \"INFO\", arguments);\n        return this;\n      },\n      debug() {\n        if (level >= Debug) handler(method2 || \"log\", \"DEBUG\", arguments);\n        return this;\n      }\n    };\n  }\n  var isArray = Array.isArray;\n  function isObject(_) {\n    return _ === Object(_);\n  }\n  const isLegalKey = (key2) => key2 !== \"__proto__\";\n  function mergeConfig(...configs) {\n    return configs.reduce((out, source2) => {\n      for (const key2 in source2) {\n        if (key2 === \"signals\") {\n          out.signals = mergeNamed(out.signals, source2.signals);\n        } else {\n          const r = key2 === \"legend\" ? {\n            layout: 1\n          } : key2 === \"style\" ? true : null;\n          writeConfig(out, key2, source2[key2], r);\n        }\n      }\n      return out;\n    }, {});\n  }\n  function writeConfig(output2, key2, value2, recurse2) {\n    if (!isLegalKey(key2)) return;\n    let k, o;\n    if (isObject(value2) && !isArray(value2)) {\n      o = isObject(output2[key2]) ? output2[key2] : output2[key2] = {};\n      for (k in value2) {\n        if (recurse2 && (recurse2 === true || recurse2[k])) {\n          writeConfig(o, k, value2[k]);\n        } else if (isLegalKey(k)) {\n          o[k] = value2[k];\n        }\n      }\n    } else {\n      output2[key2] = value2;\n    }\n  }\n  function mergeNamed(a2, b2) {\n    if (a2 == null) return b2;\n    const map2 = {}, out = [];\n    function add2(_) {\n      if (!map2[_.name]) {\n        map2[_.name] = 1;\n        out.push(_);\n      }\n    }\n    b2.forEach(add2);\n    a2.forEach(add2);\n    return out;\n  }\n  function peek$1(array2) {\n    return array2[array2.length - 1];\n  }\n  function toNumber(_) {\n    return _ == null || _ === \"\" ? null : +_;\n  }\n  const exp$2 = (sign2) => (x2) => sign2 * Math.exp(x2);\n  const log$3 = (sign2) => (x2) => Math.log(sign2 * x2);\n  const symlog = (c2) => (x2) => Math.sign(x2) * Math.log1p(Math.abs(x2 / c2));\n  const symexp = (c2) => (x2) => Math.sign(x2) * Math.expm1(Math.abs(x2)) * c2;\n  const pow$3 = (exponent2) => (x2) => x2 < 0 ? -Math.pow(-x2, exponent2) : Math.pow(x2, exponent2);\n  function pan(domain2, delta, lift, ground) {\n    const d0 = lift(domain2[0]), d1 = lift(peek$1(domain2)), dd = (d1 - d0) * delta;\n    return [ground(d0 - dd), ground(d1 - dd)];\n  }\n  function panLinear(domain2, delta) {\n    return pan(domain2, delta, toNumber, identity$2);\n  }\n  function panLog(domain2, delta) {\n    var sign2 = Math.sign(domain2[0]);\n    return pan(domain2, delta, log$3(sign2), exp$2(sign2));\n  }\n  function panPow(domain2, delta, exponent2) {\n    return pan(domain2, delta, pow$3(exponent2), pow$3(1 / exponent2));\n  }\n  function panSymlog(domain2, delta, constant2) {\n    return pan(domain2, delta, symlog(constant2), symexp(constant2));\n  }\n  function zoom(domain2, anchor, scale2, lift, ground) {\n    const d0 = lift(domain2[0]), d1 = lift(peek$1(domain2)), da = anchor != null ? lift(anchor) : (d0 + d1) / 2;\n    return [ground(da + (d0 - da) * scale2), ground(da + (d1 - da) * scale2)];\n  }\n  function zoomLinear(domain2, anchor, scale2) {\n    return zoom(domain2, anchor, scale2, toNumber, identity$2);\n  }\n  function zoomLog(domain2, anchor, scale2) {\n    const sign2 = Math.sign(domain2[0]);\n    return zoom(domain2, anchor, scale2, log$3(sign2), exp$2(sign2));\n  }\n  function zoomPow(domain2, anchor, scale2, exponent2) {\n    return zoom(domain2, anchor, scale2, pow$3(exponent2), pow$3(1 / exponent2));\n  }\n  function zoomSymlog(domain2, anchor, scale2, constant2) {\n    return zoom(domain2, anchor, scale2, symlog(constant2), symexp(constant2));\n  }\n  function quarter(date2) {\n    return 1 + ~~(new Date(date2).getMonth() / 3);\n  }\n  function utcquarter(date2) {\n    return 1 + ~~(new Date(date2).getUTCMonth() / 3);\n  }\n  function array$4(_) {\n    return _ != null ? isArray(_) ? _ : [_] : [];\n  }\n  function clampRange(range2, min2, max2) {\n    let lo = range2[0], hi = range2[1], span2;\n    if (hi < lo) {\n      span2 = hi;\n      hi = lo;\n      lo = span2;\n    }\n    span2 = hi - lo;\n    return span2 >= max2 - min2 ? [min2, max2] : [lo = Math.min(Math.max(lo, min2), max2 - span2), lo + span2];\n  }\n  function isFunction(_) {\n    return typeof _ === \"function\";\n  }\n  const DESCENDING = \"descending\";\n  function compare$1(fields, orders, opt) {\n    opt = opt || {};\n    orders = array$4(orders) || [];\n    const ord = [], get2 = [], fmap = {}, gen = opt.comparator || comparator;\n    array$4(fields).forEach((f, i) => {\n      if (f == null) return;\n      ord.push(orders[i] === DESCENDING ? -1 : 1);\n      get2.push(f = isFunction(f) ? f : field$1(f, null, opt));\n      (accessorFields(f) || []).forEach((_) => fmap[_] = 1);\n    });\n    return get2.length === 0 ? null : accessor(gen(get2, ord), Object.keys(fmap));\n  }\n  const ascending$1 = (u2, v) => (u2 < v || u2 == null) && v != null ? -1 : (u2 > v || v == null) && u2 != null ? 1 : (v = v instanceof Date ? +v : v, u2 = u2 instanceof Date ? +u2 : u2) !== u2 && v === v ? -1 : v !== v && u2 === u2 ? 1 : 0;\n  const comparator = (fields, orders) => fields.length === 1 ? compare1(fields[0], orders[0]) : compareN(fields, orders, fields.length);\n  const compare1 = (field2, order) => function(a2, b2) {\n    return ascending$1(field2(a2), field2(b2)) * order;\n  };\n  const compareN = (fields, orders, n) => {\n    orders.push(0);\n    return function(a2, b2) {\n      let f, c2 = 0, i = -1;\n      while (c2 === 0 && ++i < n) {\n        f = fields[i];\n        c2 = ascending$1(f(a2), f(b2));\n      }\n      return c2 * orders[i];\n    };\n  };\n  function constant$4(_) {\n    return isFunction(_) ? _ : () => _;\n  }\n  function debounce(delay, handler) {\n    let tid;\n    return (e) => {\n      if (tid) clearTimeout(tid);\n      tid = setTimeout(() => (handler(e), tid = null), delay);\n    };\n  }\n  function extend(_) {\n    for (let x2, k, i = 1, len2 = arguments.length; i < len2; ++i) {\n      x2 = arguments[i];\n      for (k in x2) {\n        _[k] = x2[k];\n      }\n    }\n    return _;\n  }\n  function extent(array2, f) {\n    let i = 0, n, v, min2, max2;\n    if (array2 && (n = array2.length)) {\n      if (f == null) {\n        for (v = array2[i]; i < n && (v == null || v !== v); v = array2[++i]) ;\n        min2 = max2 = v;\n        for (; i < n; ++i) {\n          v = array2[i];\n          if (v != null) {\n            if (v < min2) min2 = v;\n            if (v > max2) max2 = v;\n          }\n        }\n      } else {\n        for (v = f(array2[i]); i < n && (v == null || v !== v); v = f(array2[++i])) ;\n        min2 = max2 = v;\n        for (; i < n; ++i) {\n          v = f(array2[i]);\n          if (v != null) {\n            if (v < min2) min2 = v;\n            if (v > max2) max2 = v;\n          }\n        }\n      }\n    }\n    return [min2, max2];\n  }\n  function extentIndex(array2, f) {\n    const n = array2.length;\n    let i = -1, a2, b2, c2, u2, v;\n    if (f == null) {\n      while (++i < n) {\n        b2 = array2[i];\n        if (b2 != null && b2 >= b2) {\n          a2 = c2 = b2;\n          break;\n        }\n      }\n      if (i === n) return [-1, -1];\n      u2 = v = i;\n      while (++i < n) {\n        b2 = array2[i];\n        if (b2 != null) {\n          if (a2 > b2) {\n            a2 = b2;\n            u2 = i;\n          }\n          if (c2 < b2) {\n            c2 = b2;\n            v = i;\n          }\n        }\n      }\n    } else {\n      while (++i < n) {\n        b2 = f(array2[i], i, array2);\n        if (b2 != null && b2 >= b2) {\n          a2 = c2 = b2;\n          break;\n        }\n      }\n      if (i === n) return [-1, -1];\n      u2 = v = i;\n      while (++i < n) {\n        b2 = f(array2[i], i, array2);\n        if (b2 != null) {\n          if (a2 > b2) {\n            a2 = b2;\n            u2 = i;\n          }\n          if (c2 < b2) {\n            c2 = b2;\n            v = i;\n          }\n        }\n      }\n    }\n    return [u2, v];\n  }\n  function has$1(object2, property2) {\n    return Object.hasOwn(object2, property2);\n  }\n  const NULL = {};\n  function fastmap(input) {\n    let obj2 = {}, test2;\n    function has$1$1(key2) {\n      return has$1(obj2, key2) && obj2[key2] !== NULL;\n    }\n    const map2 = {\n      size: 0,\n      empty: 0,\n      object: obj2,\n      has: has$1$1,\n      get(key2) {\n        return has$1$1(key2) ? obj2[key2] : void 0;\n      },\n      set(key2, value2) {\n        if (!has$1$1(key2)) {\n          ++map2.size;\n          if (obj2[key2] === NULL) --map2.empty;\n        }\n        obj2[key2] = value2;\n        return this;\n      },\n      delete(key2) {\n        if (has$1$1(key2)) {\n          --map2.size;\n          ++map2.empty;\n          obj2[key2] = NULL;\n        }\n        return this;\n      },\n      clear() {\n        map2.size = map2.empty = 0;\n        map2.object = obj2 = {};\n      },\n      test(_) {\n        if (arguments.length) {\n          test2 = _;\n          return map2;\n        } else {\n          return test2;\n        }\n      },\n      clean() {\n        const next = {};\n        let size = 0;\n        for (const key2 in obj2) {\n          const value2 = obj2[key2];\n          if (value2 !== NULL && (!test2 || !test2(value2))) {\n            next[key2] = value2;\n            ++size;\n          }\n        }\n        map2.size = size;\n        map2.empty = 0;\n        map2.object = obj2 = next;\n      }\n    };\n    if (input) Object.keys(input).forEach((key2) => {\n      map2.set(key2, input[key2]);\n    });\n    return map2;\n  }\n  function flush(range2, value2, threshold2, left, right, center) {\n    if (!threshold2 && threshold2 !== 0) return center;\n    const t = +threshold2;\n    let a2 = range2[0], b2 = peek$1(range2), l;\n    if (b2 < a2) {\n      l = a2;\n      a2 = b2;\n      b2 = l;\n    }\n    l = Math.abs(value2 - a2);\n    const r = Math.abs(b2 - value2);\n    return l < r && l <= t ? left : r <= t ? right : center;\n  }\n  function inherits(child, parent, members) {\n    const proto = child.prototype = Object.create(parent.prototype);\n    Object.defineProperty(proto, \"constructor\", {\n      value: child,\n      writable: true,\n      enumerable: true,\n      configurable: true\n    });\n    return extend(proto, members);\n  }\n  function inrange(value2, range2, left, right) {\n    let r0 = range2[0], r1 = range2[range2.length - 1], t;\n    if (r0 > r1) {\n      t = r0;\n      r0 = r1;\n      r1 = t;\n    }\n    left = left === void 0 || left;\n    right = right === void 0 || right;\n    return (left ? r0 <= value2 : r0 < value2) && (right ? value2 <= r1 : value2 < r1);\n  }\n  function isBoolean$1(_) {\n    return typeof _ === \"boolean\";\n  }\n  function isDate$1(_) {\n    return Object.prototype.toString.call(_) === \"[object Date]\";\n  }\n  function isIterable(_) {\n    return _ && isFunction(_[Symbol.iterator]);\n  }\n  function isNumber$1(_) {\n    return typeof _ === \"number\";\n  }\n  function isRegExp(_) {\n    return Object.prototype.toString.call(_) === \"[object RegExp]\";\n  }\n  function isString(_) {\n    return typeof _ === \"string\";\n  }\n  function key(fields, flat, opt) {\n    if (fields) {\n      fields = flat ? array$4(fields).map((f) => f.replace(/\\\\(.)/g, \"$1\")) : array$4(fields);\n    }\n    const len2 = fields && fields.length, gen = opt && opt.get || getter$1, map2 = (f) => gen(flat ? [f] : splitAccessPath(f));\n    let fn2;\n    if (!len2) {\n      fn2 = function() {\n        return \"\";\n      };\n    } else if (len2 === 1) {\n      const get2 = map2(fields[0]);\n      fn2 = function(_) {\n        return \"\" + get2(_);\n      };\n    } else {\n      const get2 = fields.map(map2);\n      fn2 = function(_) {\n        let s2 = \"\" + get2[0](_), i = 0;\n        while (++i < len2) s2 += \"|\" + get2[i](_);\n        return s2;\n      };\n    }\n    return accessor(fn2, fields, \"key\");\n  }\n  function lerp(array2, frac) {\n    const lo = array2[0], hi = peek$1(array2), f = +frac;\n    return !f ? lo : f === 1 ? hi : lo + f * (hi - lo);\n  }\n  const DEFAULT_MAX_SIZE = 1e4;\n  function lruCache(maxsize) {\n    maxsize = +maxsize || DEFAULT_MAX_SIZE;\n    let curr, prev, size;\n    const clear = () => {\n      curr = {};\n      prev = {};\n      size = 0;\n    };\n    const update2 = (key2, value2) => {\n      if (++size > maxsize) {\n        prev = curr;\n        curr = {};\n        size = 1;\n      }\n      return curr[key2] = value2;\n    };\n    clear();\n    return {\n      clear,\n      has: (key2) => has$1(curr, key2) || has$1(prev, key2),\n      get: (key2) => has$1(curr, key2) ? curr[key2] : has$1(prev, key2) ? update2(key2, prev[key2]) : void 0,\n      set: (key2, value2) => has$1(curr, key2) ? curr[key2] = value2 : update2(key2, value2)\n    };\n  }\n  function merge$2(compare2, array0, array1, output2) {\n    const n0 = array0.length, n1 = array1.length;\n    if (!n1) return array0;\n    if (!n0) return array1;\n    const merged = output2 || new array0.constructor(n0 + n1);\n    let i0 = 0, i1 = 0, i = 0;\n    for (; i0 < n0 && i1 < n1; ++i) {\n      merged[i] = compare2(array0[i0], array1[i1]) > 0 ? array1[i1++] : array0[i0++];\n    }\n    for (; i0 < n0; ++i0, ++i) {\n      merged[i] = array0[i0];\n    }\n    for (; i1 < n1; ++i1, ++i) {\n      merged[i] = array1[i1];\n    }\n    return merged;\n  }\n  function repeat(str, reps) {\n    let s2 = \"\";\n    while (--reps >= 0) s2 += str;\n    return s2;\n  }\n  function pad$1(str, length2, padchar, align) {\n    const c2 = padchar || \" \", s2 = str + \"\", n = length2 - s2.length;\n    return n <= 0 ? s2 : align === \"left\" ? repeat(c2, n) + s2 : align === \"center\" ? repeat(c2, ~~(n / 2)) + s2 + repeat(c2, Math.ceil(n / 2)) : s2 + repeat(c2, n);\n  }\n  function span(array2) {\n    return array2 && peek$1(array2) - array2[0] || 0;\n  }\n  function $(x2) {\n    return isArray(x2) ? `[${x2.map((v) => v === null ? \"null\" : $(v))}]` : isObject(x2) || isString(x2) ? (\n      // Output valid JSON and JS source strings.\n      // See https://github.com/judofyr/timeless/blob/master/posts/json-isnt-a-javascript-subset.md\n      JSON.stringify(x2).replaceAll(\"\\u2028\", \"\\\\u2028\").replaceAll(\"\\u2029\", \"\\\\u2029\")\n    ) : x2;\n  }\n  function toBoolean(_) {\n    return _ == null || _ === \"\" ? null : !_ || _ === \"false\" || _ === \"0\" ? false : !!_;\n  }\n  const defaultParser = (_) => isNumber$1(_) ? _ : isDate$1(_) ? _ : Date.parse(_);\n  function toDate(_, parser2) {\n    parser2 = parser2 || defaultParser;\n    return _ == null || _ === \"\" ? null : parser2(_);\n  }\n  function toString(_) {\n    return _ == null || _ === \"\" ? null : _ + \"\";\n  }\n  function toSet(_) {\n    const s2 = {}, n = _.length;\n    for (let i = 0; i < n; ++i) s2[_[i]] = true;\n    return s2;\n  }\n  function truncate$1(str, length2, align, ellipsis) {\n    const e = ellipsis != null ? ellipsis : \"…\", s2 = str + \"\", n = s2.length, l = Math.max(0, length2 - e.length);\n    return n <= length2 ? s2 : align === \"left\" ? e + s2.slice(n - l) : align === \"center\" ? s2.slice(0, Math.ceil(l / 2)) + e + s2.slice(n - ~~(l / 2)) : s2.slice(0, l) + e;\n  }\n  function visitArray(array2, filter2, visitor) {\n    if (array2) {\n      if (filter2) {\n        const n = array2.length;\n        for (let i = 0; i < n; ++i) {\n          const t = filter2(array2[i]);\n          if (t) visitor(t, i, array2);\n        }\n      } else {\n        array2.forEach(visitor);\n      }\n    }\n  }\n  var EOL = {}, EOF = {}, QUOTE = 34, NEWLINE = 10, RETURN = 13;\n  function objectConverter(columns) {\n    return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n      return JSON.stringify(name) + \": d[\" + i + '] || \"\"';\n    }).join(\",\") + \"}\");\n  }\n  function customConverter(columns, f) {\n    var object2 = objectConverter(columns);\n    return function(row, i) {\n      return f(object2(row), i, columns);\n    };\n  }\n  function inferColumns(rows) {\n    var columnSet = /* @__PURE__ */ Object.create(null), columns = [];\n    rows.forEach(function(row) {\n      for (var column in row) {\n        if (!(column in columnSet)) {\n          columns.push(columnSet[column] = column);\n        }\n      }\n    });\n    return columns;\n  }\n  function pad(value2, width2) {\n    var s2 = value2 + \"\", length2 = s2.length;\n    return length2 < width2 ? new Array(width2 - length2 + 1).join(0) + s2 : s2;\n  }\n  function formatYear(year) {\n    return year < 0 ? \"-\" + pad(-year, 6) : year > 9999 ? \"+\" + pad(year, 6) : pad(year, 4);\n  }\n  function formatDate(date2) {\n    var hours = date2.getUTCHours(), minutes = date2.getUTCMinutes(), seconds = date2.getUTCSeconds(), milliseconds = date2.getUTCMilliseconds();\n    return isNaN(date2) ? \"Invalid Date\" : formatYear(date2.getUTCFullYear()) + \"-\" + pad(date2.getUTCMonth() + 1, 2) + \"-\" + pad(date2.getUTCDate(), 2) + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\" : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\" : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\" : \"\");\n  }\n  function dsvFormat(delimiter) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n\\r]\"), DELIMITER = delimiter.charCodeAt(0);\n    function parse2(text2, f) {\n      var convert2, columns, rows = parseRows(text2, function(row, i) {\n        if (convert2) return convert2(row, i - 1);\n        columns = row, convert2 = f ? customConverter(row, f) : objectConverter(row);\n      });\n      rows.columns = columns || [];\n      return rows;\n    }\n    function parseRows(text2, f) {\n      var rows = [], N = text2.length, I = 0, n = 0, t, eof = N <= 0, eol = false;\n      if (text2.charCodeAt(N - 1) === NEWLINE) --N;\n      if (text2.charCodeAt(N - 1) === RETURN) --N;\n      function token() {\n        if (eof) return EOF;\n        if (eol) return eol = false, EOL;\n        var i, j = I, c2;\n        if (text2.charCodeAt(j) === QUOTE) {\n          while (I++ < N && text2.charCodeAt(I) !== QUOTE || text2.charCodeAt(++I) === QUOTE) ;\n          if ((i = I) >= N) eof = true;\n          else if ((c2 = text2.charCodeAt(I++)) === NEWLINE) eol = true;\n          else if (c2 === RETURN) {\n            eol = true;\n            if (text2.charCodeAt(I) === NEWLINE) ++I;\n          }\n          return text2.slice(j + 1, i - 1).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          if ((c2 = text2.charCodeAt(i = I++)) === NEWLINE) eol = true;\n          else if (c2 === RETURN) {\n            eol = true;\n            if (text2.charCodeAt(I) === NEWLINE) ++I;\n          } else if (c2 !== DELIMITER) continue;\n          return text2.slice(j, i);\n        }\n        return eof = true, text2.slice(j, N);\n      }\n      while ((t = token()) !== EOF) {\n        var row = [];\n        while (t !== EOL && t !== EOF) row.push(t), t = token();\n        if (f && (row = f(row, n++)) == null) continue;\n        rows.push(row);\n      }\n      return rows;\n    }\n    function preformatBody(rows, columns) {\n      return rows.map(function(row) {\n        return columns.map(function(column) {\n          return formatValue2(row[column]);\n        }).join(delimiter);\n      });\n    }\n    function format2(rows, columns) {\n      if (columns == null) columns = inferColumns(rows);\n      return [columns.map(formatValue2).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n    }\n    function formatBody(rows, columns) {\n      if (columns == null) columns = inferColumns(rows);\n      return preformatBody(rows, columns).join(\"\\n\");\n    }\n    function formatRows(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    }\n    function formatRow(row) {\n      return row.map(formatValue2).join(delimiter);\n    }\n    function formatValue2(value2) {\n      return value2 == null ? \"\" : value2 instanceof Date ? formatDate(value2) : reFormat.test(value2 += \"\") ? '\"' + value2.replace(/\"/g, '\"\"') + '\"' : value2;\n    }\n    return {\n      parse: parse2,\n      parseRows,\n      format: format2,\n      formatBody,\n      formatRows,\n      formatRow,\n      formatValue: formatValue2\n    };\n  }\n  function identity$1(x2) {\n    return x2;\n  }\n  function transform$3(transform2) {\n    if (transform2 == null) return identity$1;\n    var x02, y02, kx = transform2.scale[0], ky = transform2.scale[1], dx = transform2.translate[0], dy = transform2.translate[1];\n    return function(input, i) {\n      if (!i) x02 = y02 = 0;\n      var j = 2, n = input.length, output2 = new Array(n);\n      output2[0] = (x02 += input[0]) * kx + dx;\n      output2[1] = (y02 += input[1]) * ky + dy;\n      while (j < n) output2[j] = input[j], ++j;\n      return output2;\n    };\n  }\n  function reverse$1(array2, n) {\n    var t, j = array2.length, i = j - n;\n    while (i < --j) t = array2[i], array2[i++] = array2[j], array2[j] = t;\n  }\n  function feature(topology, o) {\n    if (typeof o === \"string\") o = topology.objects[o];\n    return o.type === \"GeometryCollection\" ? { type: \"FeatureCollection\", features: o.geometries.map(function(o2) {\n      return feature$1(topology, o2);\n    }) } : feature$1(topology, o);\n  }\n  function feature$1(topology, o) {\n    var id2 = o.id, bbox = o.bbox, properties = o.properties == null ? {} : o.properties, geometry = object(topology, o);\n    return id2 == null && bbox == null ? { type: \"Feature\", properties, geometry } : bbox == null ? { type: \"Feature\", id: id2, properties, geometry } : { type: \"Feature\", id: id2, bbox, properties, geometry };\n  }\n  function object(topology, o) {\n    var transformPoint = transform$3(topology.transform), arcs = topology.arcs;\n    function arc2(i, points2) {\n      if (points2.length) points2.pop();\n      for (var a2 = arcs[i < 0 ? ~i : i], k = 0, n = a2.length; k < n; ++k) {\n        points2.push(transformPoint(a2[k], k));\n      }\n      if (i < 0) reverse$1(points2, n);\n    }\n    function point2(p) {\n      return transformPoint(p);\n    }\n    function line2(arcs2) {\n      var points2 = [];\n      for (var i = 0, n = arcs2.length; i < n; ++i) arc2(arcs2[i], points2);\n      if (points2.length < 2) points2.push(points2[0]);\n      return points2;\n    }\n    function ring(arcs2) {\n      var points2 = line2(arcs2);\n      while (points2.length < 4) points2.push(points2[0]);\n      return points2;\n    }\n    function polygon(arcs2) {\n      return arcs2.map(ring);\n    }\n    function geometry(o2) {\n      var type2 = o2.type, coordinates;\n      switch (type2) {\n        case \"GeometryCollection\":\n          return { type: type2, geometries: o2.geometries.map(geometry) };\n        case \"Point\":\n          coordinates = point2(o2.coordinates);\n          break;\n        case \"MultiPoint\":\n          coordinates = o2.coordinates.map(point2);\n          break;\n        case \"LineString\":\n          coordinates = line2(o2.arcs);\n          break;\n        case \"MultiLineString\":\n          coordinates = o2.arcs.map(line2);\n          break;\n        case \"Polygon\":\n          coordinates = polygon(o2.arcs);\n          break;\n        case \"MultiPolygon\":\n          coordinates = o2.arcs.map(polygon);\n          break;\n        default:\n          return null;\n      }\n      return { type: type2, coordinates };\n    }\n    return geometry(o);\n  }\n  function stitch(topology, arcs) {\n    var stitchedArcs = {}, fragmentByStart = {}, fragmentByEnd = {}, fragments = [], emptyIndex = -1;\n    arcs.forEach(function(i, j) {\n      var arc2 = topology.arcs[i < 0 ? ~i : i], t;\n      if (arc2.length < 3 && !arc2[1][0] && !arc2[1][1]) {\n        t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n      }\n    });\n    arcs.forEach(function(i) {\n      var e = ends(i), start = e[0], end = e[1], f, g;\n      if (f = fragmentByEnd[start]) {\n        delete fragmentByEnd[f.end];\n        f.push(i);\n        f.end = end;\n        if (g = fragmentByStart[end]) {\n          delete fragmentByStart[g.start];\n          var fg = g === f ? f : f.concat(g);\n          fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n        } else {\n          fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n        }\n      } else if (f = fragmentByStart[end]) {\n        delete fragmentByStart[f.start];\n        f.unshift(i);\n        f.start = start;\n        if (g = fragmentByEnd[start]) {\n          delete fragmentByEnd[g.end];\n          var gf = g === f ? f : g.concat(f);\n          fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n        } else {\n          fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n        }\n      } else {\n        f = [i];\n        fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n      }\n    });\n    function ends(i) {\n      var arc2 = topology.arcs[i < 0 ? ~i : i], p02 = arc2[0], p1;\n      if (topology.transform) p1 = [0, 0], arc2.forEach(function(dp) {\n        p1[0] += dp[0], p1[1] += dp[1];\n      });\n      else p1 = arc2[arc2.length - 1];\n      return i < 0 ? [p1, p02] : [p02, p1];\n    }\n    function flush2(fragmentByEnd2, fragmentByStart2) {\n      for (var k in fragmentByEnd2) {\n        var f = fragmentByEnd2[k];\n        delete fragmentByStart2[f.start];\n        delete f.start;\n        delete f.end;\n        f.forEach(function(i) {\n          stitchedArcs[i < 0 ? ~i : i] = 1;\n        });\n        fragments.push(f);\n      }\n    }\n    flush2(fragmentByEnd, fragmentByStart);\n    flush2(fragmentByStart, fragmentByEnd);\n    arcs.forEach(function(i) {\n      if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]);\n    });\n    return fragments;\n  }\n  function mesh(topology) {\n    return object(topology, meshArcs.apply(this, arguments));\n  }\n  function meshArcs(topology, object2, filter2) {\n    var arcs, i, n;\n    if (arguments.length > 1) arcs = extractArcs(topology, object2, filter2);\n    else for (i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i) arcs[i] = i;\n    return { type: \"MultiLineString\", arcs: stitch(topology, arcs) };\n  }\n  function extractArcs(topology, object2, filter2) {\n    var arcs = [], geomsByArc = [], geom;\n    function extract0(i) {\n      var j = i < 0 ? ~i : i;\n      (geomsByArc[j] || (geomsByArc[j] = [])).push({ i, g: geom });\n    }\n    function extract1(arcs2) {\n      arcs2.forEach(extract0);\n    }\n    function extract2(arcs2) {\n      arcs2.forEach(extract1);\n    }\n    function extract3(arcs2) {\n      arcs2.forEach(extract2);\n    }\n    function geometry(o) {\n      switch (geom = o, o.type) {\n        case \"GeometryCollection\":\n          o.geometries.forEach(geometry);\n          break;\n        case \"LineString\":\n          extract1(o.arcs);\n          break;\n        case \"MultiLineString\":\n        case \"Polygon\":\n          extract2(o.arcs);\n          break;\n        case \"MultiPolygon\":\n          extract3(o.arcs);\n          break;\n      }\n    }\n    geometry(object2);\n    geomsByArc.forEach(filter2 == null ? function(geoms) {\n      arcs.push(geoms[0].i);\n    } : function(geoms) {\n      if (filter2(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i);\n    });\n    return arcs;\n  }\n  const YEAR = \"year\";\n  const QUARTER = \"quarter\";\n  const MONTH = \"month\";\n  const WEEK = \"week\";\n  const DATE = \"date\";\n  const DAY = \"day\";\n  const DAYOFYEAR = \"dayofyear\";\n  const HOURS = \"hours\";\n  const MINUTES = \"minutes\";\n  const SECONDS = \"seconds\";\n  const MILLISECONDS = \"milliseconds\";\n  const TIME_UNITS = [YEAR, QUARTER, MONTH, WEEK, DATE, DAY, DAYOFYEAR, HOURS, MINUTES, SECONDS, MILLISECONDS];\n  const UNITS = TIME_UNITS.reduce((o, u2, i) => (o[u2] = 1 + i, o), {});\n  function timeUnits(units) {\n    const u2 = array$4(units).slice(), m2 = {};\n    if (!u2.length) error(\"Missing time unit.\");\n    u2.forEach((unit2) => {\n      if (has$1(UNITS, unit2)) {\n        m2[unit2] = 1;\n      } else {\n        error(`Invalid time unit: ${unit2}.`);\n      }\n    });\n    const numTypes = (m2[WEEK] || m2[DAY] ? 1 : 0) + (m2[QUARTER] || m2[MONTH] || m2[DATE] ? 1 : 0) + (m2[DAYOFYEAR] ? 1 : 0);\n    if (numTypes > 1) {\n      error(`Incompatible time units: ${units}`);\n    }\n    u2.sort((a2, b2) => UNITS[a2] - UNITS[b2]);\n    return u2;\n  }\n  const defaultSpecifiers = {\n    [YEAR]: \"%Y \",\n    [QUARTER]: \"Q%q \",\n    [MONTH]: \"%b \",\n    [DATE]: \"%d \",\n    [WEEK]: \"W%U \",\n    [DAY]: \"%a \",\n    [DAYOFYEAR]: \"%j \",\n    [HOURS]: \"%H:00\",\n    [MINUTES]: \"00:%M\",\n    [SECONDS]: \":%S\",\n    [MILLISECONDS]: \".%L\",\n    [`${YEAR}-${MONTH}`]: \"%Y-%m \",\n    [`${YEAR}-${MONTH}-${DATE}`]: \"%Y-%m-%d \",\n    [`${HOURS}-${MINUTES}`]: \"%H:%M\"\n  };\n  function timeUnitSpecifier(units, specifiers) {\n    const s2 = extend({}, defaultSpecifiers, specifiers), u2 = timeUnits(units), n = u2.length;\n    let fmt = \"\", start = 0, end, key2;\n    for (start = 0; start < n; ) {\n      for (end = u2.length; end > start; --end) {\n        key2 = u2.slice(start, end).join(\"-\");\n        if (s2[key2] != null) {\n          fmt += s2[key2];\n          start = end;\n          break;\n        }\n      }\n    }\n    return fmt.trim();\n  }\n  const t0 = /* @__PURE__ */ new Date();\n  function localYear(y2) {\n    t0.setFullYear(y2);\n    t0.setMonth(0);\n    t0.setDate(1);\n    t0.setHours(0, 0, 0, 0);\n    return t0;\n  }\n  function dayofyear(d2) {\n    return localDayOfYear(new Date(d2));\n  }\n  function week(d2) {\n    return localWeekNum(new Date(d2));\n  }\n  function localDayOfYear(d2) {\n    return timeDay.count(localYear(d2.getFullYear()) - 1, d2);\n  }\n  function localWeekNum(d2) {\n    return timeSunday.count(localYear(d2.getFullYear()) - 1, d2);\n  }\n  function localFirst(y2) {\n    return localYear(y2).getDay();\n  }\n  function localDate(y2, m2, d2, H, M2, S, L) {\n    if (0 <= y2 && y2 < 100) {\n      const date2 = new Date(-1, m2, d2, H, M2, S, L);\n      date2.setFullYear(y2);\n      return date2;\n    }\n    return new Date(y2, m2, d2, H, M2, S, L);\n  }\n  function utcdayofyear(d2) {\n    return utcDayOfYear(new Date(d2));\n  }\n  function utcweek(d2) {\n    return utcWeekNum(new Date(d2));\n  }\n  function utcDayOfYear(d2) {\n    const y2 = Date.UTC(d2.getUTCFullYear(), 0, 1);\n    return utcDay.count(y2 - 1, d2);\n  }\n  function utcWeekNum(d2) {\n    const y2 = Date.UTC(d2.getUTCFullYear(), 0, 1);\n    return utcSunday.count(y2 - 1, d2);\n  }\n  function utcFirst(y2) {\n    t0.setTime(Date.UTC(y2, 0, 1));\n    return t0.getUTCDay();\n  }\n  function utcDate(y2, m2, d2, H, M2, S, L) {\n    if (0 <= y2 && y2 < 100) {\n      const date2 = new Date(Date.UTC(-1, m2, d2, H, M2, S, L));\n      date2.setUTCFullYear(d2.y);\n      return date2;\n    }\n    return new Date(Date.UTC(y2, m2, d2, H, M2, S, L));\n  }\n  function floor(units, step, get2, inv, newDate2) {\n    const s2 = step || 1, b2 = peek$1(units), _ = (unit2, p, key2) => {\n      key2 = key2 || unit2;\n      return getUnit(get2[key2], inv[key2], unit2 === b2 && s2, p);\n    };\n    const t = /* @__PURE__ */ new Date(), u2 = toSet(units), y2 = u2[YEAR] ? _(YEAR) : constant$4(2012), m2 = u2[MONTH] ? _(MONTH) : u2[QUARTER] ? _(QUARTER) : zero$1, d2 = u2[WEEK] && u2[DAY] ? _(DAY, 1, WEEK + DAY) : u2[WEEK] ? _(WEEK, 1) : u2[DAY] ? _(DAY, 1) : u2[DATE] ? _(DATE, 1) : u2[DAYOFYEAR] ? _(DAYOFYEAR, 1) : one$1, H = u2[HOURS] ? _(HOURS) : zero$1, M2 = u2[MINUTES] ? _(MINUTES) : zero$1, S = u2[SECONDS] ? _(SECONDS) : zero$1, L = u2[MILLISECONDS] ? _(MILLISECONDS) : zero$1;\n    return function(v) {\n      t.setTime(+v);\n      const year = y2(t);\n      return newDate2(year, m2(t), d2(t, year), H(t), M2(t), S(t), L(t));\n    };\n  }\n  function getUnit(f, inv, step, phase) {\n    const u2 = step <= 1 ? f : phase ? (d2, y2) => phase + step * Math.floor((f(d2, y2) - phase) / step) : (d2, y2) => step * Math.floor(f(d2, y2) / step);\n    return inv ? (d2, y2) => inv(u2(d2, y2), y2) : u2;\n  }\n  function weekday(week2, day, firstDay) {\n    return day + week2 * 7 - (firstDay + 6) % 7;\n  }\n  const localGet = {\n    [YEAR]: (d2) => d2.getFullYear(),\n    [QUARTER]: (d2) => Math.floor(d2.getMonth() / 3),\n    [MONTH]: (d2) => d2.getMonth(),\n    [DATE]: (d2) => d2.getDate(),\n    [HOURS]: (d2) => d2.getHours(),\n    [MINUTES]: (d2) => d2.getMinutes(),\n    [SECONDS]: (d2) => d2.getSeconds(),\n    [MILLISECONDS]: (d2) => d2.getMilliseconds(),\n    [DAYOFYEAR]: (d2) => localDayOfYear(d2),\n    [WEEK]: (d2) => localWeekNum(d2),\n    [WEEK + DAY]: (d2, y2) => weekday(localWeekNum(d2), d2.getDay(), localFirst(y2)),\n    [DAY]: (d2, y2) => weekday(1, d2.getDay(), localFirst(y2))\n  };\n  const localInv = {\n    [QUARTER]: (q) => 3 * q,\n    [WEEK]: (w2, y2) => weekday(w2, 0, localFirst(y2))\n  };\n  function timeFloor(units, step) {\n    return floor(units, step || 1, localGet, localInv, localDate);\n  }\n  const utcGet = {\n    [YEAR]: (d2) => d2.getUTCFullYear(),\n    [QUARTER]: (d2) => Math.floor(d2.getUTCMonth() / 3),\n    [MONTH]: (d2) => d2.getUTCMonth(),\n    [DATE]: (d2) => d2.getUTCDate(),\n    [HOURS]: (d2) => d2.getUTCHours(),\n    [MINUTES]: (d2) => d2.getUTCMinutes(),\n    [SECONDS]: (d2) => d2.getUTCSeconds(),\n    [MILLISECONDS]: (d2) => d2.getUTCMilliseconds(),\n    [DAYOFYEAR]: (d2) => utcDayOfYear(d2),\n    [WEEK]: (d2) => utcWeekNum(d2),\n    [DAY]: (d2, y2) => weekday(1, d2.getUTCDay(), utcFirst(y2)),\n    [WEEK + DAY]: (d2, y2) => weekday(utcWeekNum(d2), d2.getUTCDay(), utcFirst(y2))\n  };\n  const utcInv = {\n    [QUARTER]: (q) => 3 * q,\n    [WEEK]: (w2, y2) => weekday(w2, 0, utcFirst(y2))\n  };\n  function utcFloor(units, step) {\n    return floor(units, step || 1, utcGet, utcInv, utcDate);\n  }\n  const timeIntervals = {\n    [YEAR]: timeYear,\n    [QUARTER]: timeMonth.every(3),\n    [MONTH]: timeMonth,\n    [WEEK]: timeSunday,\n    [DATE]: timeDay,\n    [DAY]: timeDay,\n    [DAYOFYEAR]: timeDay,\n    [HOURS]: timeHour,\n    [MINUTES]: timeMinute,\n    [SECONDS]: second,\n    [MILLISECONDS]: millisecond\n  };\n  const utcIntervals = {\n    [YEAR]: utcYear,\n    [QUARTER]: utcMonth.every(3),\n    [MONTH]: utcMonth,\n    [WEEK]: utcSunday,\n    [DATE]: utcDay,\n    [DAY]: utcDay,\n    [DAYOFYEAR]: utcDay,\n    [HOURS]: utcHour,\n    [MINUTES]: utcMinute,\n    [SECONDS]: second,\n    [MILLISECONDS]: millisecond\n  };\n  function timeInterval(unit2) {\n    return timeIntervals[unit2];\n  }\n  function utcInterval(unit2) {\n    return utcIntervals[unit2];\n  }\n  function offset$3(ival, date2, step) {\n    return ival ? ival.offset(date2, step) : void 0;\n  }\n  function timeOffset(unit2, date2, step) {\n    return offset$3(timeInterval(unit2), date2, step);\n  }\n  function utcOffset(unit2, date2, step) {\n    return offset$3(utcInterval(unit2), date2, step);\n  }\n  function sequence$1(ival, start, stop2, step) {\n    return ival ? ival.range(start, stop2, step) : void 0;\n  }\n  function timeSequence(unit2, start, stop2, step) {\n    return sequence$1(timeInterval(unit2), start, stop2, step);\n  }\n  function utcSequence(unit2, start, stop2, step) {\n    return sequence$1(utcInterval(unit2), start, stop2, step);\n  }\n  const durationSecond = 1e3, durationMinute = durationSecond * 60, durationHour = durationMinute * 60, durationDay = durationHour * 24, durationWeek = durationDay * 7, durationMonth = durationDay * 30, durationYear = durationDay * 365;\n  const Milli = [YEAR, MONTH, DATE, HOURS, MINUTES, SECONDS, MILLISECONDS], Seconds = Milli.slice(0, -1), Minutes = Seconds.slice(0, -1), Hours = Minutes.slice(0, -1), Day = Hours.slice(0, -1), Week = [YEAR, WEEK], Month = [YEAR, MONTH], Year = [YEAR];\n  const intervals = [[Seconds, 1, durationSecond], [Seconds, 5, 5 * durationSecond], [Seconds, 15, 15 * durationSecond], [Seconds, 30, 30 * durationSecond], [Minutes, 1, durationMinute], [Minutes, 5, 5 * durationMinute], [Minutes, 15, 15 * durationMinute], [Minutes, 30, 30 * durationMinute], [Hours, 1, durationHour], [Hours, 3, 3 * durationHour], [Hours, 6, 6 * durationHour], [Hours, 12, 12 * durationHour], [Day, 1, durationDay], [Week, 1, durationWeek], [Month, 1, durationMonth], [Month, 3, 3 * durationMonth], [Year, 1, durationYear]];\n  function bin$1(opt) {\n    const ext = opt.extent, max2 = opt.maxbins || 40, target2 = Math.abs(span(ext)) / max2;\n    let i = bisector((i2) => i2[2]).right(intervals, target2), units, step;\n    if (i === intervals.length) {\n      units = Year, step = tickStep(ext[0] / durationYear, ext[1] / durationYear, max2);\n    } else if (i) {\n      i = intervals[target2 / intervals[i - 1][2] < intervals[i][2] / target2 ? i - 1 : i];\n      units = i[0];\n      step = i[1];\n    } else {\n      units = Milli;\n      step = Math.max(tickStep(ext[0], ext[1], max2), 1);\n    }\n    return {\n      units,\n      step\n    };\n  }\n  function memoize(method2) {\n    const cache2 = {};\n    return (spec) => cache2[spec] || (cache2[spec] = method2(spec));\n  }\n  function trimZeroes(numberFormat, decimalChar) {\n    return (x2) => {\n      const str = numberFormat(x2), dec = str.indexOf(decimalChar);\n      if (dec < 0) return str;\n      let idx = rightmostDigit(str, dec);\n      const end = idx < str.length ? str.slice(idx) : \"\";\n      while (--idx > dec) if (str[idx] !== \"0\") {\n        ++idx;\n        break;\n      }\n      return str.slice(0, idx) + end;\n    };\n  }\n  function rightmostDigit(str, dec) {\n    let i = str.lastIndexOf(\"e\"), c2;\n    if (i > 0) return i;\n    for (i = str.length; --i > dec; ) {\n      c2 = str.charCodeAt(i);\n      if (c2 >= 48 && c2 <= 57) return i + 1;\n    }\n  }\n  function numberLocale(locale2) {\n    const format2 = memoize(locale2.format), formatPrefix2 = locale2.formatPrefix;\n    return {\n      format: format2,\n      formatPrefix: formatPrefix2,\n      formatFloat(spec) {\n        const s2 = formatSpecifier$1(spec || \",\");\n        if (s2.precision == null) {\n          s2.precision = 12;\n          switch (s2.type) {\n            case \"%\":\n              s2.precision -= 2;\n              break;\n            case \"e\":\n              s2.precision -= 1;\n              break;\n          }\n          return trimZeroes(\n            format2(s2),\n            // number format\n            format2(\".1f\")(1)[1]\n            // decimal point character\n          );\n        } else {\n          return format2(s2);\n        }\n      },\n      formatSpan(start, stop2, count2, specifier) {\n        specifier = formatSpecifier$1(specifier == null ? \",f\" : specifier);\n        const step = tickStep(start, stop2, count2), value2 = Math.max(Math.abs(start), Math.abs(stop2));\n        let precision;\n        if (specifier.precision == null) {\n          switch (specifier.type) {\n            case \"s\": {\n              if (!isNaN(precision = precisionPrefix(step, value2))) {\n                specifier.precision = precision;\n              }\n              return formatPrefix2(specifier, value2);\n            }\n            case \"\":\n            case \"e\":\n            case \"g\":\n            case \"p\":\n            case \"r\": {\n              if (!isNaN(precision = precisionRound(step, value2))) {\n                specifier.precision = precision - (specifier.type === \"e\");\n              }\n              break;\n            }\n            case \"f\":\n            case \"%\": {\n              if (!isNaN(precision = precisionFixed(step))) {\n                specifier.precision = precision - (specifier.type === \"%\") * 2;\n              }\n              break;\n            }\n          }\n        }\n        return format2(specifier);\n      }\n    };\n  }\n  let defaultNumberLocale;\n  resetNumberFormatDefaultLocale();\n  function resetNumberFormatDefaultLocale() {\n    return defaultNumberLocale = numberLocale({\n      format: format$4,\n      formatPrefix\n    });\n  }\n  function numberFormatLocale(definition2) {\n    return numberLocale(formatLocale$2(definition2));\n  }\n  function numberFormatDefaultLocale(definition2) {\n    return arguments.length ? defaultNumberLocale = numberFormatLocale(definition2) : defaultNumberLocale;\n  }\n  function timeMultiFormat(format2, interval2, spec) {\n    spec = spec || {};\n    if (!isObject(spec)) {\n      error(`Invalid time multi-format specifier: ${spec}`);\n    }\n    const second2 = interval2(SECONDS), minute = interval2(MINUTES), hour = interval2(HOURS), day = interval2(DATE), week2 = interval2(WEEK), month = interval2(MONTH), quarter2 = interval2(QUARTER), year = interval2(YEAR), L = format2(spec[MILLISECONDS] || \".%L\"), S = format2(spec[SECONDS] || \":%S\"), M2 = format2(spec[MINUTES] || \"%I:%M\"), H = format2(spec[HOURS] || \"%I %p\"), d2 = format2(spec[DATE] || spec[DAY] || \"%a %d\"), w2 = format2(spec[WEEK] || \"%b %d\"), m2 = format2(spec[MONTH] || \"%B\"), q = format2(spec[QUARTER] || \"%B\"), y2 = format2(spec[YEAR] || \"%Y\");\n    return (date2) => (second2(date2) < date2 ? L : minute(date2) < date2 ? S : hour(date2) < date2 ? M2 : day(date2) < date2 ? H : month(date2) < date2 ? week2(date2) < date2 ? d2 : w2 : year(date2) < date2 ? quarter2(date2) < date2 ? m2 : q : y2)(date2);\n  }\n  function timeLocale(locale2) {\n    const timeFormat2 = memoize(locale2.format), utcFormat2 = memoize(locale2.utcFormat);\n    return {\n      timeFormat: (spec) => isString(spec) ? timeFormat2(spec) : timeMultiFormat(timeFormat2, timeInterval, spec),\n      utcFormat: (spec) => isString(spec) ? utcFormat2(spec) : timeMultiFormat(utcFormat2, utcInterval, spec),\n      timeParse: memoize(locale2.parse),\n      utcParse: memoize(locale2.utcParse)\n    };\n  }\n  let defaultTimeLocale;\n  resetTimeFormatDefaultLocale();\n  function resetTimeFormatDefaultLocale() {\n    return defaultTimeLocale = timeLocale({\n      format: timeFormat$1,\n      parse: timeParse$1,\n      utcFormat: utcFormat$1,\n      utcParse: utcParse$1\n    });\n  }\n  function timeFormatLocale(definition2) {\n    return timeLocale(formatLocale$1(definition2));\n  }\n  function timeFormatDefaultLocale(definition2) {\n    return arguments.length ? defaultTimeLocale = timeFormatLocale(definition2) : defaultTimeLocale;\n  }\n  const createLocale = (number2, time2) => extend({}, number2, time2);\n  function locale(numberSpec, timeSpec) {\n    const number2 = numberSpec ? numberFormatLocale(numberSpec) : numberFormatDefaultLocale();\n    const time2 = timeSpec ? timeFormatLocale(timeSpec) : timeFormatDefaultLocale();\n    return createLocale(number2, time2);\n  }\n  function defaultLocale(numberSpec, timeSpec) {\n    const args = arguments.length;\n    if (args && args !== 2) {\n      error(\"defaultLocale expects either zero or two arguments.\");\n    }\n    return args ? createLocale(numberFormatDefaultLocale(numberSpec), timeFormatDefaultLocale(timeSpec)) : createLocale(numberFormatDefaultLocale(), timeFormatDefaultLocale());\n  }\n  function resetDefaultLocale() {\n    resetNumberFormatDefaultLocale();\n    resetTimeFormatDefaultLocale();\n    return defaultLocale();\n  }\n  const protocol_re = /^(data:|([A-Za-z]+:)?\\/\\/)/;\n  const allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i;\n  const whitespace_re = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205f\\u3000]/g;\n  const fileProtocol = \"file://\";\n  function loaderFactory(fs) {\n    return (options2) => ({\n      options: options2 || {},\n      sanitize,\n      load: load$1,\n      fileAccess: false,\n      file: fileLoader(),\n      http: httpLoader\n    });\n  }\n  async function load$1(uri, options2) {\n    const opt = await this.sanitize(uri, options2), url = opt.href;\n    return opt.localFile ? this.file(url) : this.http(url, options2?.http);\n  }\n  async function sanitize(uri, options2) {\n    options2 = extend({}, this.options, options2);\n    const fileAccess = this.fileAccess, result = {\n      href: null\n    };\n    let isFile, loadFile, base2;\n    const isAllowed = allowed_re.test(uri.replace(whitespace_re, \"\"));\n    if (uri == null || typeof uri !== \"string\" || !isAllowed) {\n      error(\"Sanitize failure, invalid URI: \" + $(uri));\n    }\n    const hasProtocol = protocol_re.test(uri);\n    if ((base2 = options2.baseURL) && !hasProtocol) {\n      if (!uri.startsWith(\"/\") && !base2.endsWith(\"/\")) {\n        uri = \"/\" + uri;\n      }\n      uri = base2 + uri;\n    }\n    loadFile = (isFile = uri.startsWith(fileProtocol)) || options2.mode === \"file\" || options2.mode !== \"http\" && !hasProtocol && fileAccess;\n    if (isFile) {\n      uri = uri.slice(fileProtocol.length);\n    } else if (uri.startsWith(\"//\")) {\n      if (options2.defaultProtocol === \"file\") {\n        uri = uri.slice(2);\n        loadFile = true;\n      } else {\n        uri = (options2.defaultProtocol || \"http\") + \":\" + uri;\n      }\n    }\n    Object.defineProperty(result, \"localFile\", {\n      value: !!loadFile\n    });\n    result.href = uri;\n    if (options2.target) {\n      result.target = options2.target + \"\";\n    }\n    if (options2.rel) {\n      result.rel = options2.rel + \"\";\n    }\n    if (options2.context === \"image\" && options2.crossOrigin) {\n      result.crossOrigin = options2.crossOrigin + \"\";\n    }\n    return result;\n  }\n  function fileLoader(fs) {\n    return fileReject;\n  }\n  async function fileReject() {\n    error(\"No file system access.\");\n  }\n  async function httpLoader(url, options2) {\n    const opt = extend({}, this.options.http, options2), type2 = options2 && options2.response, response = await fetch(url, opt);\n    return !response.ok ? error(response.status + \"\" + response.statusText) : isFunction(response[type2]) ? response[type2]() : response.text();\n  }\n  const isValid = (_) => _ != null && _ === _;\n  const isBoolean = (_) => _ === \"true\" || _ === \"false\" || _ === true || _ === false;\n  const isDate = (_) => !Number.isNaN(Date.parse(_));\n  const isNumber = (_) => !Number.isNaN(+_) && !(_ instanceof Date);\n  const isInteger = (_) => isNumber(_) && Number.isInteger(+_);\n  const typeParsers = {\n    boolean: toBoolean,\n    integer: toNumber,\n    number: toNumber,\n    date: toDate,\n    string: toString,\n    unknown: identity$2\n  };\n  const typeTests = [isBoolean, isInteger, isNumber, isDate];\n  const typeList = [\"boolean\", \"integer\", \"number\", \"date\"];\n  function inferType(values2, field2) {\n    if (!values2 || !values2.length) return \"unknown\";\n    const n = values2.length, m2 = typeTests.length, a2 = typeTests.map((_, i) => i + 1);\n    for (let i = 0, t = 0, j, value2; i < n; ++i) {\n      value2 = field2 ? values2[i][field2] : values2[i];\n      for (j = 0; j < m2; ++j) {\n        if (a2[j] && isValid(value2) && !typeTests[j](value2)) {\n          a2[j] = 0;\n          ++t;\n          if (t === typeTests.length) return \"string\";\n        }\n      }\n    }\n    return typeList[a2.reduce((u2, v) => u2 === 0 ? v : u2, 0) - 1];\n  }\n  function inferTypes(data2, fields) {\n    return fields.reduce((types2, field2) => {\n      types2[field2] = inferType(data2, field2);\n      return types2;\n    }, {});\n  }\n  function delimitedFormat(delimiter) {\n    const parse2 = function(data2, format2) {\n      const delim = {\n        delimiter\n      };\n      return dsv(data2, format2 ? extend(format2, delim) : delim);\n    };\n    parse2.responseType = \"text\";\n    return parse2;\n  }\n  function dsv(data2, format2) {\n    if (format2.header) {\n      data2 = format2.header.map($).join(format2.delimiter) + \"\\n\" + data2;\n    }\n    return dsvFormat(format2.delimiter).parse(data2 + \"\");\n  }\n  dsv.responseType = \"text\";\n  function isBuffer(_) {\n    return typeof Buffer === \"function\" && isFunction(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;\n  }\n  function json(data2, format2) {\n    const prop = format2 && format2.property ? field$1(format2.property) : identity$2;\n    return isObject(data2) && !isBuffer(data2) ? parseJSON(prop(data2), format2) : prop(JSON.parse(data2));\n  }\n  json.responseType = \"json\";\n  function parseJSON(data2, format2) {\n    if (!isArray(data2) && isIterable(data2)) {\n      data2 = [...data2];\n    }\n    return format2 && format2.copy ? JSON.parse(JSON.stringify(data2)) : data2;\n  }\n  const filters = {\n    interior: (a2, b2) => a2 !== b2,\n    exterior: (a2, b2) => a2 === b2\n  };\n  function topojson(data2, format2) {\n    let method2, object2, property2, filter2;\n    data2 = json(data2, format2);\n    if (format2 && format2.feature) {\n      method2 = feature;\n      property2 = format2.feature;\n    } else if (format2 && format2.mesh) {\n      method2 = mesh;\n      property2 = format2.mesh;\n      filter2 = filters[format2.filter];\n    } else {\n      error(\"Missing TopoJSON feature or mesh parameter.\");\n    }\n    object2 = (object2 = data2.objects[property2]) ? method2(data2, object2, filter2) : error(\"Invalid TopoJSON object: \" + property2);\n    return object2 && object2.features || [object2];\n  }\n  topojson.responseType = \"json\";\n  const format$2 = {\n    dsv,\n    csv: delimitedFormat(\",\"),\n    tsv: delimitedFormat(\"\t\"),\n    json,\n    topojson\n  };\n  function formats$1(name, reader) {\n    if (arguments.length > 1) {\n      format$2[name] = reader;\n      return this;\n    } else {\n      return has$1(format$2, name) ? format$2[name] : null;\n    }\n  }\n  function responseType(type2) {\n    const f = formats$1(type2);\n    return f && f.responseType || \"text\";\n  }\n  function read(data2, schema, timeParser, utcParser) {\n    schema = schema || {};\n    const reader = formats$1(schema.type || \"json\");\n    if (!reader) error(\"Unknown data format type: \" + schema.type);\n    data2 = reader(data2, schema);\n    if (schema.parse) parse$6(data2, schema.parse, timeParser, utcParser);\n    if (has$1(data2, \"columns\")) delete data2.columns;\n    return data2;\n  }\n  function parse$6(data2, types2, timeParser, utcParser) {\n    if (!data2.length) return;\n    const locale2 = timeFormatDefaultLocale();\n    timeParser = timeParser || locale2.timeParse;\n    utcParser = utcParser || locale2.utcParse;\n    let fields = data2.columns || Object.keys(data2[0]), datum2, field2, i, j, n, m2;\n    if (types2 === \"auto\") types2 = inferTypes(data2, fields);\n    fields = Object.keys(types2);\n    const parsers = fields.map((field3) => {\n      const type2 = types2[field3];\n      let parts, pattern;\n      if (type2 && (type2.startsWith(\"date:\") || type2.startsWith(\"utc:\"))) {\n        parts = type2.split(/:(.+)?/, 2);\n        pattern = parts[1];\n        if (pattern[0] === \"'\" && pattern[pattern.length - 1] === \"'\" || pattern[0] === '\"' && pattern[pattern.length - 1] === '\"') {\n          pattern = pattern.slice(1, -1);\n        }\n        const parse2 = parts[0] === \"utc\" ? utcParser : timeParser;\n        return parse2(pattern);\n      }\n      if (!typeParsers[type2]) {\n        throw Error(\"Illegal format pattern: \" + field3 + \":\" + type2);\n      }\n      return typeParsers[type2];\n    });\n    for (i = 0, n = data2.length, m2 = fields.length; i < n; ++i) {\n      datum2 = data2[i];\n      for (j = 0; j < m2; ++j) {\n        field2 = fields[j];\n        datum2[field2] = parsers[j](datum2[field2]);\n      }\n    }\n  }\n  const loader = loaderFactory();\n  function UniqueList(idFunc) {\n    const $2 = idFunc || identity$2, list = [], ids = {};\n    list.add = (_) => {\n      const id2 = $2(_);\n      if (!ids[id2]) {\n        ids[id2] = 1;\n        list.push(_);\n      }\n      return list;\n    };\n    list.remove = (_) => {\n      const id2 = $2(_);\n      if (ids[id2]) {\n        ids[id2] = 0;\n        const idx = list.indexOf(_);\n        if (idx >= 0) list.splice(idx, 1);\n      }\n      return list;\n    };\n    return list;\n  }\n  async function asyncCallback(df, callback) {\n    try {\n      await callback(df);\n    } catch (err) {\n      df.error(err);\n    }\n  }\n  const TUPLE_ID_KEY = Symbol(\"vega_id\");\n  let TUPLE_ID = 1;\n  function isTuple(t) {\n    return !!(t && tupleid(t));\n  }\n  function tupleid(t) {\n    return t[TUPLE_ID_KEY];\n  }\n  function setid(t, id2) {\n    t[TUPLE_ID_KEY] = id2;\n    return t;\n  }\n  function ingest$1(datum2) {\n    const t = datum2 === Object(datum2) ? datum2 : {\n      data: datum2\n    };\n    return tupleid(t) ? t : setid(t, TUPLE_ID++);\n  }\n  function derive(t) {\n    return rederive(t, ingest$1({}));\n  }\n  function rederive(t, d2) {\n    for (const k in t) d2[k] = t[k];\n    return d2;\n  }\n  function replace$1(t, d2) {\n    return setid(d2, tupleid(t));\n  }\n  function stableCompare(cmp, f) {\n    return !cmp ? null : f ? (a2, b2) => cmp(a2, b2) || tupleid(f(a2)) - tupleid(f(b2)) : (a2, b2) => cmp(a2, b2) || tupleid(a2) - tupleid(b2);\n  }\n  function isChangeSet(v) {\n    return v && v.constructor === changeset;\n  }\n  function changeset() {\n    const add2 = [], rem2 = [], mod = [], remp = [], modp = [];\n    let clean = null, reflow2 = false;\n    return {\n      constructor: changeset,\n      insert(t) {\n        const d2 = array$4(t), n = d2.length;\n        for (let i = 0; i < n; ++i) add2.push(d2[i]);\n        return this;\n      },\n      remove(t) {\n        const a2 = isFunction(t) ? remp : rem2, d2 = array$4(t), n = d2.length;\n        for (let i = 0; i < n; ++i) a2.push(d2[i]);\n        return this;\n      },\n      modify(t, field2, value2) {\n        const m2 = {\n          field: field2,\n          value: constant$4(value2)\n        };\n        if (isFunction(t)) {\n          m2.filter = t;\n          modp.push(m2);\n        } else {\n          m2.tuple = t;\n          mod.push(m2);\n        }\n        return this;\n      },\n      encode(t, set2) {\n        if (isFunction(t)) modp.push({\n          filter: t,\n          field: set2\n        });\n        else mod.push({\n          tuple: t,\n          field: set2\n        });\n        return this;\n      },\n      clean(value2) {\n        clean = value2;\n        return this;\n      },\n      reflow() {\n        reflow2 = true;\n        return this;\n      },\n      pulse(pulse2, tuples) {\n        const cur = {}, out = {};\n        let i, n, m2, f, t, id2;\n        for (i = 0, n = tuples.length; i < n; ++i) {\n          cur[tupleid(tuples[i])] = 1;\n        }\n        for (i = 0, n = rem2.length; i < n; ++i) {\n          t = rem2[i];\n          cur[tupleid(t)] = -1;\n        }\n        for (i = 0, n = remp.length; i < n; ++i) {\n          f = remp[i];\n          tuples.forEach((t4) => {\n            if (f(t4)) cur[tupleid(t4)] = -1;\n          });\n        }\n        for (i = 0, n = add2.length; i < n; ++i) {\n          t = add2[i];\n          id2 = tupleid(t);\n          if (cur[id2]) {\n            cur[id2] = 1;\n          } else {\n            pulse2.add.push(ingest$1(add2[i]));\n          }\n        }\n        for (i = 0, n = tuples.length; i < n; ++i) {\n          t = tuples[i];\n          if (cur[tupleid(t)] < 0) pulse2.rem.push(t);\n        }\n        function modify2(t4, f2, v) {\n          if (v) {\n            t4[f2] = v(t4);\n          } else {\n            pulse2.encode = f2;\n          }\n          if (!reflow2) out[tupleid(t4)] = t4;\n        }\n        for (i = 0, n = mod.length; i < n; ++i) {\n          m2 = mod[i];\n          t = m2.tuple;\n          f = m2.field;\n          id2 = cur[tupleid(t)];\n          if (id2 > 0) {\n            modify2(t, f, m2.value);\n            pulse2.modifies(f);\n          }\n        }\n        for (i = 0, n = modp.length; i < n; ++i) {\n          m2 = modp[i];\n          f = m2.filter;\n          tuples.forEach((t4) => {\n            if (f(t4) && cur[tupleid(t4)] > 0) {\n              modify2(t4, m2.field, m2.value);\n            }\n          });\n          pulse2.modifies(m2.field);\n        }\n        if (reflow2) {\n          pulse2.mod = rem2.length || remp.length ? tuples.filter((t4) => cur[tupleid(t4)] > 0) : tuples.slice();\n        } else {\n          for (id2 in out) pulse2.mod.push(out[id2]);\n        }\n        if (clean || clean == null && (rem2.length || remp.length)) {\n          pulse2.clean(true);\n        }\n        return pulse2;\n      }\n    };\n  }\n  const CACHE = \"_:mod:_\";\n  function Parameters() {\n    Object.defineProperty(this, CACHE, {\n      writable: true,\n      value: {}\n    });\n  }\n  Parameters.prototype = {\n    /**\n     * Set a parameter value. If the parameter value changes, the parameter\n     * will be recorded as modified.\n     * @param {string} name - The parameter name.\n     * @param {number} index - The index into an array-value parameter. Ignored if\n     *   the argument is undefined, null or less than zero.\n     * @param {*} value - The parameter value to set.\n     * @param {boolean} [force=false] - If true, records the parameter as modified\n     *   even if the value is unchanged.\n     * @return {Parameters} - This parameter object.\n     */\n    set(name, index2, value2, force2) {\n      const o = this, v = o[name], mod = o[CACHE];\n      if (index2 != null && index2 >= 0) {\n        if (v[index2] !== value2 || force2) {\n          v[index2] = value2;\n          mod[index2 + \":\" + name] = -1;\n          mod[name] = -1;\n        }\n      } else if (v !== value2 || force2) {\n        o[name] = value2;\n        mod[name] = isArray(value2) ? 1 + value2.length : -1;\n      }\n      return o;\n    },\n    /**\n     * Tests if one or more parameters has been modified. If invoked with no\n     * arguments, returns true if any parameter value has changed. If the first\n     * argument is array, returns trues if any parameter name in the array has\n     * changed. Otherwise, tests if the given name and optional array index has\n     * changed.\n     * @param {string} name - The parameter name to test.\n     * @param {number} [index=undefined] - The parameter array index to test.\n     * @return {boolean} - Returns true if a queried parameter was modified.\n     */\n    modified(name, index2) {\n      const mod = this[CACHE];\n      if (!arguments.length) {\n        for (const k in mod) {\n          if (mod[k]) return true;\n        }\n        return false;\n      } else if (isArray(name)) {\n        for (let k = 0; k < name.length; ++k) {\n          if (mod[name[k]]) return true;\n        }\n        return false;\n      }\n      return index2 != null && index2 >= 0 ? index2 + 1 < mod[name] || !!mod[index2 + \":\" + name] : !!mod[name];\n    },\n    /**\n     * Clears the modification records. After calling this method,\n     * all parameters are considered unmodified.\n     */\n    clear() {\n      this[CACHE] = {};\n      return this;\n    }\n  };\n  let OP_ID = 0;\n  const PULSE = \"pulse\", NO_PARAMS = new Parameters();\n  const SKIP$1$1 = 1, MODIFIED = 2;\n  function Operator(init2, update2, params2, react) {\n    this.id = ++OP_ID;\n    this.value = init2;\n    this.stamp = -1;\n    this.rank = -1;\n    this.qrank = -1;\n    this.flags = 0;\n    if (update2) {\n      this._update = update2;\n    }\n    if (params2) this.parameters(params2, react);\n  }\n  function flag(bit) {\n    return function(state) {\n      const f = this.flags;\n      if (arguments.length === 0) return !!(f & bit);\n      this.flags = state ? f | bit : f & ~bit;\n      return this;\n    };\n  }\n  Operator.prototype = {\n    /**\n     * Returns a list of target operators dependent on this operator.\n     * If this list does not exist, it is created and then returned.\n     * @return {UniqueList}\n     */\n    targets() {\n      return this._targets || (this._targets = UniqueList(id));\n    },\n    /**\n     * Sets the value of this operator.\n     * @param {*} value - the value to set.\n     * @return {Number} Returns 1 if the operator value has changed\n     *   according to strict equality, returns 0 otherwise.\n     */\n    set(value2) {\n      if (this.value !== value2) {\n        this.value = value2;\n        return 1;\n      } else {\n        return 0;\n      }\n    },\n    /**\n     * Indicates that operator evaluation should be skipped on the next pulse.\n     * This operator will still propagate incoming pulses, but its update function\n     * will not be invoked. The skip flag is reset after every pulse, so calling\n     * this method will affect processing of the next pulse only.\n     */\n    skip: flag(SKIP$1$1),\n    /**\n     * Indicates that this operator's value has been modified on its most recent\n     * pulse. Normally modification is checked via strict equality; however, in\n     * some cases it is more efficient to update the internal state of an object.\n     * In those cases, the modified flag can be used to trigger propagation. Once\n     * set, the modification flag persists across pulses until unset. The flag can\n     * be used with the last timestamp to test if a modification is recent.\n     */\n    modified: flag(MODIFIED),\n    /**\n     * Sets the parameters for this operator. The parameter values are analyzed for\n     * operator instances. If found, this operator will be added as a dependency\n     * of the parameterizing operator. Operator values are dynamically marshalled\n     * from each operator parameter prior to evaluation. If a parameter value is\n     * an array, the array will also be searched for Operator instances. However,\n     * the search does not recurse into sub-arrays or object properties.\n     * @param {object} params - A hash of operator parameters.\n     * @param {boolean} [react=true] - A flag indicating if this operator should\n     *   automatically update (react) when parameter values change. In other words,\n     *   this flag determines if the operator registers itself as a listener on\n     *   any upstream operators included in the parameters.\n     * @param {boolean} [initonly=false] - A flag indicating if this operator\n     *   should calculate an update only upon its initial evaluation, then\n     *   deregister dependencies and suppress all future update invocations.\n     * @return {Operator[]} - An array of upstream dependencies.\n     */\n    parameters(params2, react, initonly) {\n      react = react !== false;\n      const argval = this._argval = this._argval || new Parameters(), argops = this._argops = this._argops || [], deps = [];\n      let name, value2, n, i;\n      const add2 = (name2, index2, value3) => {\n        if (value3 instanceof Operator) {\n          if (value3 !== this) {\n            if (react) value3.targets().add(this);\n            deps.push(value3);\n          }\n          argops.push({\n            op: value3,\n            name: name2,\n            index: index2\n          });\n        } else {\n          argval.set(name2, index2, value3);\n        }\n      };\n      for (name in params2) {\n        value2 = params2[name];\n        if (name === PULSE) {\n          array$4(value2).forEach((op) => {\n            if (!(op instanceof Operator)) {\n              error(\"Pulse parameters must be operator instances.\");\n            } else if (op !== this) {\n              op.targets().add(this);\n              deps.push(op);\n            }\n          });\n          this.source = value2;\n        } else if (isArray(value2)) {\n          argval.set(name, -1, Array(n = value2.length));\n          for (i = 0; i < n; ++i) add2(name, i, value2[i]);\n        } else {\n          add2(name, -1, value2);\n        }\n      }\n      this.marshall().clear();\n      if (initonly) argops.initonly = true;\n      return deps;\n    },\n    /**\n     * Internal method for marshalling parameter values.\n     * Visits each operator dependency to pull the latest value.\n     * @return {Parameters} A Parameters object to pass to the update function.\n     */\n    marshall(stamp) {\n      const argval = this._argval || NO_PARAMS, argops = this._argops;\n      let item, i, op, mod;\n      if (argops) {\n        const n = argops.length;\n        for (i = 0; i < n; ++i) {\n          item = argops[i];\n          op = item.op;\n          mod = op.modified() && op.stamp === stamp;\n          argval.set(item.name, item.index, op.value, mod);\n        }\n        if (argops.initonly) {\n          for (i = 0; i < n; ++i) {\n            item = argops[i];\n            item.op.targets().remove(this);\n          }\n          this._argops = null;\n          this._update = null;\n        }\n      }\n      return argval;\n    },\n    /**\n     * Detach this operator from the dataflow.\n     * Unregisters listeners on upstream dependencies.\n     */\n    detach() {\n      const argops = this._argops;\n      let i, n, item, op;\n      if (argops) {\n        for (i = 0, n = argops.length; i < n; ++i) {\n          item = argops[i];\n          op = item.op;\n          if (op._targets) {\n            op._targets.remove(this);\n          }\n        }\n      }\n      this.pulse = null;\n      this.source = null;\n    },\n    /**\n     * Delegate method to perform operator processing.\n     * Subclasses can override this method to perform custom processing.\n     * By default, it marshalls parameters and calls the update function\n     * if that function is defined. If the update function does not\n     * change the operator value then StopPropagation is returned.\n     * If no update function is defined, this method does nothing.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return The output pulse or StopPropagation. A falsy return value\n     *   (including undefined) will let the input pulse pass through.\n     */\n    evaluate(pulse2) {\n      const update2 = this._update;\n      if (update2) {\n        const params2 = this.marshall(pulse2.stamp), v = update2.call(this, params2, pulse2);\n        params2.clear();\n        if (v !== this.value) {\n          this.value = v;\n        } else if (!this.modified()) {\n          return pulse2.StopPropagation;\n        }\n      }\n    },\n    /**\n     * Run this operator for the current pulse. If this operator has already\n     * been run at (or after) the pulse timestamp, returns StopPropagation.\n     * Internally, this method calls {@link evaluate} to perform processing.\n     * If {@link evaluate} returns a falsy value, the input pulse is returned.\n     * This method should NOT be overridden, instead overrride {@link evaluate}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return the output pulse for this operator (or StopPropagation)\n     */\n    run(pulse2) {\n      if (pulse2.stamp < this.stamp) return pulse2.StopPropagation;\n      let rv;\n      if (this.skip()) {\n        this.skip(false);\n        rv = 0;\n      } else {\n        rv = this.evaluate(pulse2);\n      }\n      return this.pulse = rv || pulse2;\n    }\n  };\n  function add$3(init2, update2, params2, react) {\n    let shift = 1, op;\n    if (init2 instanceof Operator) {\n      op = init2;\n    } else if (init2 && init2.prototype instanceof Operator) {\n      op = new init2();\n    } else if (isFunction(init2)) {\n      op = new Operator(null, init2);\n    } else {\n      shift = 0;\n      op = new Operator(init2, update2);\n    }\n    this.rank(op);\n    if (shift) {\n      react = params2;\n      params2 = update2;\n    }\n    if (params2) this.connect(op, op.parameters(params2, react));\n    this.touch(op);\n    return op;\n  }\n  function connect(target2, sources) {\n    const targetRank = target2.rank, n = sources.length;\n    for (let i = 0; i < n; ++i) {\n      if (targetRank < sources[i].rank) {\n        this.rerank(target2);\n        return;\n      }\n    }\n  }\n  let STREAM_ID = 0;\n  function EventStream(filter2, apply2, receive) {\n    this.id = ++STREAM_ID;\n    this.value = null;\n    if (receive) this.receive = receive;\n    if (filter2) this._filter = filter2;\n    if (apply2) this._apply = apply2;\n  }\n  function stream(filter2, apply2, receive) {\n    return new EventStream(filter2, apply2, receive);\n  }\n  EventStream.prototype = {\n    _filter: truthy,\n    _apply: identity$2,\n    targets() {\n      return this._targets || (this._targets = UniqueList(id));\n    },\n    consume(_) {\n      if (!arguments.length) return !!this._consume;\n      this._consume = !!_;\n      return this;\n    },\n    receive(evt) {\n      if (this._filter(evt)) {\n        const val = this.value = this._apply(evt), trg = this._targets, n = trg ? trg.length : 0;\n        for (let i = 0; i < n; ++i) trg[i].receive(val);\n        if (this._consume) {\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n      }\n    },\n    filter(filter2) {\n      const s2 = stream(filter2);\n      this.targets().add(s2);\n      return s2;\n    },\n    apply(apply2) {\n      const s2 = stream(null, apply2);\n      this.targets().add(s2);\n      return s2;\n    },\n    merge() {\n      const s2 = stream();\n      this.targets().add(s2);\n      for (let i = 0, n = arguments.length; i < n; ++i) {\n        arguments[i].targets().add(s2);\n      }\n      return s2;\n    },\n    throttle(pause) {\n      let t = -1;\n      return this.filter(() => {\n        const now2 = Date.now();\n        if (now2 - t > pause) {\n          t = now2;\n          return 1;\n        } else {\n          return 0;\n        }\n      });\n    },\n    debounce(delay) {\n      const s2 = stream();\n      this.targets().add(stream(null, null, debounce(delay, (e) => {\n        const df = e.dataflow;\n        s2.receive(e);\n        if (df && df.run) df.run();\n      })));\n      return s2;\n    },\n    between(a2, b2) {\n      let active = false;\n      a2.targets().add(stream(null, null, () => active = true));\n      b2.targets().add(stream(null, null, () => active = false));\n      return this.filter(() => active);\n    },\n    detach() {\n      this._filter = truthy;\n      this._targets = null;\n    }\n  };\n  function events$1(source2, type2, filter2, apply2) {\n    const df = this, s2 = stream(filter2, apply2), send = function(e) {\n      e.dataflow = df;\n      try {\n        s2.receive(e);\n      } catch (error2) {\n        df.error(error2);\n      } finally {\n        df.run();\n      }\n    };\n    let sources;\n    if (typeof source2 === \"string\" && typeof document !== \"undefined\") {\n      sources = document.querySelectorAll(source2);\n    } else {\n      sources = array$4(source2);\n    }\n    const n = sources.length;\n    for (let i = 0; i < n; ++i) {\n      sources[i].addEventListener(type2, send);\n    }\n    return s2;\n  }\n  function parse$5(data2, format2) {\n    const locale2 = this.locale();\n    return read(data2, format2, locale2.timeParse, locale2.utcParse);\n  }\n  function ingest(target2, data2, format2) {\n    data2 = this.parse(data2, format2);\n    return this.pulse(target2, this.changeset().insert(data2));\n  }\n  async function request(url, format2) {\n    const df = this;\n    let status = 0, data2;\n    try {\n      data2 = await df.loader().load(url, {\n        context: \"dataflow\",\n        response: responseType(format2 && format2.type)\n      });\n      try {\n        data2 = df.parse(data2, format2);\n      } catch (err) {\n        status = -2;\n        df.warn(\"Data ingestion failed\", url, err);\n      }\n    } catch (err) {\n      status = -1;\n      df.warn(\"Loading failed\", url, err);\n    }\n    return {\n      data: data2,\n      status\n    };\n  }\n  async function preload(target2, url, format2) {\n    const df = this, pending = df._pending || loadPending(df);\n    pending.requests += 1;\n    const res = await df.request(url, format2);\n    df.pulse(target2, df.changeset().remove(truthy).insert(res.data || []));\n    pending.done();\n    return res;\n  }\n  function loadPending(df) {\n    let accept;\n    const pending = new Promise((a2) => accept = a2);\n    pending.requests = 0;\n    pending.done = () => {\n      if (--pending.requests === 0) {\n        df._pending = null;\n        accept(df);\n      }\n    };\n    return df._pending = pending;\n  }\n  const SKIP$2 = {\n    skip: true\n  };\n  function on(source2, target2, update2, params2, options2) {\n    const fn2 = source2 instanceof Operator ? onOperator : onStream;\n    fn2(this, source2, target2, update2, params2, options2);\n    return this;\n  }\n  function onStream(df, stream2, target2, update2, params2, options2) {\n    const opt = extend({}, options2, SKIP$2);\n    let func, op;\n    if (!isFunction(target2)) target2 = constant$4(target2);\n    if (update2 === void 0) {\n      func = (e) => df.touch(target2(e));\n    } else if (isFunction(update2)) {\n      op = new Operator(null, update2, params2, false);\n      func = (e) => {\n        op.evaluate(e);\n        const t = target2(e), v = op.value;\n        isChangeSet(v) ? df.pulse(t, v, options2) : df.update(t, v, opt);\n      };\n    } else {\n      func = (e) => df.update(target2(e), update2, opt);\n    }\n    stream2.apply(func);\n  }\n  function onOperator(df, source2, target2, update2, params2, options2) {\n    if (update2 === void 0) {\n      source2.targets().add(target2);\n    } else {\n      const opt = options2 || {}, op = new Operator(null, updater(target2, update2), params2, false);\n      op.modified(opt.force);\n      op.rank = source2.rank;\n      source2.targets().add(op);\n      if (target2) {\n        op.skip(true);\n        op.value = target2.value;\n        op.targets().add(target2);\n        df.connect(target2, [op]);\n      }\n    }\n  }\n  function updater(target2, update2) {\n    update2 = isFunction(update2) ? update2 : constant$4(update2);\n    return target2 ? function(_, pulse2) {\n      const value2 = update2(_, pulse2);\n      if (!target2.skip()) {\n        target2.skip(value2 !== this.value).value = value2;\n      }\n      return value2;\n    } : update2;\n  }\n  function rank(op) {\n    op.rank = ++this._rank;\n  }\n  function rerank(op) {\n    const queue = [op];\n    let cur, list, i;\n    while (queue.length) {\n      this.rank(cur = queue.pop());\n      if (list = cur._targets) {\n        for (i = list.length; --i >= 0; ) {\n          queue.push(cur = list[i]);\n          if (cur === op) error(\"Cycle detected in dataflow graph.\");\n        }\n      }\n    }\n  }\n  const StopPropagation = {};\n  const ADD = 1 << 0, REM = 1 << 1, MOD$1 = 1 << 2, ADD_REM = ADD | REM, ADD_MOD = ADD | MOD$1, ALL = ADD | REM | MOD$1, REFLOW = 1 << 3, SOURCE = 1 << 4, NO_SOURCE = 1 << 5, NO_FIELDS = 1 << 6;\n  function Pulse(dataflow, stamp, encode2) {\n    this.dataflow = dataflow;\n    this.stamp = stamp == null ? -1 : stamp;\n    this.add = [];\n    this.rem = [];\n    this.mod = [];\n    this.fields = null;\n    this.encode = encode2 || null;\n  }\n  function materialize(data2, filter2) {\n    const out = [];\n    visitArray(data2, filter2, (_) => out.push(_));\n    return out;\n  }\n  function filter$1(pulse2, flags) {\n    const map2 = {};\n    pulse2.visit(flags, (t) => {\n      map2[tupleid(t)] = 1;\n    });\n    return (t) => map2[tupleid(t)] ? null : t;\n  }\n  function addFilter(a2, b2) {\n    return a2 ? (t, i) => a2(t, i) && b2(t, i) : b2;\n  }\n  Pulse.prototype = {\n    /**\n     * Sentinel value indicating pulse propagation should stop.\n     */\n    StopPropagation,\n    /**\n     * Boolean flag indicating ADD (added) tuples.\n     */\n    ADD,\n    /**\n     * Boolean flag indicating REM (removed) tuples.\n     */\n    REM,\n    /**\n     * Boolean flag indicating MOD (modified) tuples.\n     */\n    MOD: MOD$1,\n    /**\n     * Boolean flag indicating ADD (added) and REM (removed) tuples.\n     */\n    ADD_REM,\n    /**\n     * Boolean flag indicating ADD (added) and MOD (modified) tuples.\n     */\n    ADD_MOD,\n    /**\n     * Boolean flag indicating ADD, REM and MOD tuples.\n     */\n    ALL,\n    /**\n     * Boolean flag indicating all tuples in a data source\n     * except for the ADD, REM and MOD tuples.\n     */\n    REFLOW,\n    /**\n     * Boolean flag indicating a 'pass-through' to a\n     * backing data source, ignoring ADD, REM and MOD tuples.\n     */\n    SOURCE,\n    /**\n     * Boolean flag indicating that source data should be\n     * suppressed when creating a forked pulse.\n     */\n    NO_SOURCE,\n    /**\n     * Boolean flag indicating that field modifications should be\n     * suppressed when creating a forked pulse.\n     */\n    NO_FIELDS,\n    /**\n     * Creates a new pulse based on the values of this pulse.\n     * The dataflow, time stamp and field modification values are copied over.\n     * By default, new empty ADD, REM and MOD arrays are created.\n     * @param {number} flags - Integer of boolean flags indicating which (if any)\n     *   tuple arrays should be copied to the new pulse. The supported flag values\n     *   are ADD, REM and MOD. Array references are copied directly: new array\n     *   instances are not created.\n     * @return {Pulse} - The forked pulse instance.\n     * @see init\n     */\n    fork(flags) {\n      return new Pulse(this.dataflow).init(this, flags);\n    },\n    /**\n     * Creates a copy of this pulse with new materialized array\n     * instances for the ADD, REM, MOD, and SOURCE arrays.\n     * The dataflow, time stamp and field modification values are copied over.\n     * @return {Pulse} - The cloned pulse instance.\n     * @see init\n     */\n    clone() {\n      const p = this.fork(ALL);\n      p.add = p.add.slice();\n      p.rem = p.rem.slice();\n      p.mod = p.mod.slice();\n      if (p.source) p.source = p.source.slice();\n      return p.materialize(ALL | SOURCE);\n    },\n    /**\n     * Returns a pulse that adds all tuples from a backing source. This is\n     * useful for cases where operators are added to a dataflow after an\n     * upstream data pipeline has already been processed, ensuring that\n     * new operators can observe all tuples within a stream.\n     * @return {Pulse} - A pulse instance with all source tuples included\n     *   in the add array. If the current pulse already has all source\n     *   tuples in its add array, it is returned directly. If the current\n     *   pulse does not have a backing source, it is returned directly.\n     */\n    addAll() {\n      let p = this;\n      const reuse = !p.source || p.add === p.rem || !p.rem.length && p.source.length === p.add.length;\n      if (reuse) {\n        return p;\n      } else {\n        p = new Pulse(this.dataflow).init(this);\n        p.add = p.source;\n        p.rem = [];\n        return p;\n      }\n    },\n    /**\n     * Initialize this pulse based on the values of another pulse. This method\n     * is used internally by {@link fork} to initialize a new forked tuple.\n     * The dataflow, time stamp and field modification values are copied over.\n     * By default, new empty ADD, REM and MOD arrays are created.\n     * @param {Pulse} src - The source pulse to copy from.\n     * @param {number} flags - Integer of boolean flags indicating which (if any)\n     *   tuple arrays should be copied to the new pulse. The supported flag values\n     *   are ADD, REM and MOD. Array references are copied directly: new array\n     *   instances are not created. By default, source data arrays are copied\n     *   to the new pulse. Use the NO_SOURCE flag to enforce a null source.\n     * @return {Pulse} - Returns this Pulse instance.\n     */\n    init(src, flags) {\n      const p = this;\n      p.stamp = src.stamp;\n      p.encode = src.encode;\n      if (src.fields && !(flags & NO_FIELDS)) {\n        p.fields = src.fields;\n      }\n      if (flags & ADD) {\n        p.addF = src.addF;\n        p.add = src.add;\n      } else {\n        p.addF = null;\n        p.add = [];\n      }\n      if (flags & REM) {\n        p.remF = src.remF;\n        p.rem = src.rem;\n      } else {\n        p.remF = null;\n        p.rem = [];\n      }\n      if (flags & MOD$1) {\n        p.modF = src.modF;\n        p.mod = src.mod;\n      } else {\n        p.modF = null;\n        p.mod = [];\n      }\n      if (flags & NO_SOURCE) {\n        p.srcF = null;\n        p.source = null;\n      } else {\n        p.srcF = src.srcF;\n        p.source = src.source;\n        if (src.cleans) p.cleans = src.cleans;\n      }\n      return p;\n    },\n    /**\n     * Schedules a function to run after pulse propagation completes.\n     * @param {function} func - The function to run.\n     */\n    runAfter(func) {\n      this.dataflow.runAfter(func);\n    },\n    /**\n     * Indicates if tuples have been added, removed or modified.\n     * @param {number} [flags] - The tuple types (ADD, REM or MOD) to query.\n     *   Defaults to ALL, returning true if any tuple type has changed.\n     * @return {boolean} - Returns true if one or more queried tuple types have\n     *   changed, false otherwise.\n     */\n    changed(flags) {\n      const f = flags || ALL;\n      return f & ADD && this.add.length || f & REM && this.rem.length || f & MOD$1 && this.mod.length;\n    },\n    /**\n     * Forces a \"reflow\" of tuple values, such that all tuples in the backing\n     * source are added to the MOD set, unless already present in the ADD set.\n     * @param {boolean} [fork=false] - If true, returns a forked copy of this\n     *   pulse, and invokes reflow on that derived pulse.\n     * @return {Pulse} - The reflowed pulse instance.\n     */\n    reflow(fork) {\n      if (fork) return this.fork(ALL).reflow();\n      const len2 = this.add.length, src = this.source && this.source.length;\n      if (src && src !== len2) {\n        this.mod = this.source;\n        if (len2) this.filter(MOD$1, filter$1(this, ADD));\n      }\n      return this;\n    },\n    /**\n     * Get/set metadata to pulse requesting garbage collection\n     * to reclaim currently unused resources.\n     */\n    clean(value2) {\n      if (arguments.length) {\n        this.cleans = !!value2;\n        return this;\n      } else {\n        return this.cleans;\n      }\n    },\n    /**\n     * Marks one or more data field names as modified to assist dependency\n     * tracking and incremental processing by transform operators.\n     * @param {string|Array<string>} _ - The field(s) to mark as modified.\n     * @return {Pulse} - This pulse instance.\n     */\n    modifies(_) {\n      const hash = this.fields || (this.fields = {});\n      if (isArray(_)) {\n        _.forEach((f) => hash[f] = true);\n      } else {\n        hash[_] = true;\n      }\n      return this;\n    },\n    /**\n     * Checks if one or more data fields have been modified during this pulse\n     * propagation timestamp.\n     * @param {string|Array<string>} _ - The field(s) to check for modified.\n     * @param {boolean} nomod - If true, will check the modified flag even if\n     *   no mod tuples exist. If false (default), mod tuples must be present.\n     * @return {boolean} - Returns true if any of the provided fields has been\n     *   marked as modified, false otherwise.\n     */\n    modified(_, nomod) {\n      const fields = this.fields;\n      return !((nomod || this.mod.length) && fields) ? false : !arguments.length ? !!fields : isArray(_) ? _.some((f) => fields[f]) : fields[_];\n    },\n    /**\n     * Adds a filter function to one more tuple sets. Filters are applied to\n     * backing tuple arrays, to determine the actual set of tuples considered\n     * added, removed or modified. They can be used to delay materialization of\n     * a tuple set in order to avoid expensive array copies. In addition, the\n     * filter functions can serve as value transformers: unlike standard predicate\n     * function (which return boolean values), Pulse filters should return the\n     * actual tuple value to process. If a tuple set is already filtered, the\n     * new filter function will be appended into a conjuntive ('and') query.\n     * @param {number} flags - Flags indicating the tuple set(s) to filter.\n     * @param {function(*):object} filter - Filter function that will be applied\n     *   to the tuple set array, and should return a data tuple if the value\n     *   should be included in the tuple set, and falsy (or null) otherwise.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    filter(flags, filter2) {\n      const p = this;\n      if (flags & ADD) p.addF = addFilter(p.addF, filter2);\n      if (flags & REM) p.remF = addFilter(p.remF, filter2);\n      if (flags & MOD$1) p.modF = addFilter(p.modF, filter2);\n      if (flags & SOURCE) p.srcF = addFilter(p.srcF, filter2);\n      return p;\n    },\n    /**\n     * Materialize one or more tuple sets in this pulse. If the tuple set(s) have\n     * a registered filter function, it will be applied and the tuple set(s) will\n     * be replaced with materialized tuple arrays.\n     * @param {number} flags - Flags indicating the tuple set(s) to materialize.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    materialize(flags) {\n      flags = flags || ALL;\n      const p = this;\n      if (flags & ADD && p.addF) {\n        p.add = materialize(p.add, p.addF);\n        p.addF = null;\n      }\n      if (flags & REM && p.remF) {\n        p.rem = materialize(p.rem, p.remF);\n        p.remF = null;\n      }\n      if (flags & MOD$1 && p.modF) {\n        p.mod = materialize(p.mod, p.modF);\n        p.modF = null;\n      }\n      if (flags & SOURCE && p.srcF) {\n        p.source = p.source.filter(p.srcF);\n        p.srcF = null;\n      }\n      return p;\n    },\n    /**\n     * Visit one or more tuple sets in this pulse.\n     * @param {number} flags - Flags indicating the tuple set(s) to visit.\n     *   Legal values are ADD, REM, MOD and SOURCE (if a backing data source\n     *   has been set).\n     * @param {function(object):*} - Visitor function invoked per-tuple.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    visit(flags, visitor) {\n      const p = this, v = visitor;\n      if (flags & SOURCE) {\n        visitArray(p.source, p.srcF, v);\n        return p;\n      }\n      if (flags & ADD) visitArray(p.add, p.addF, v);\n      if (flags & REM) visitArray(p.rem, p.remF, v);\n      if (flags & MOD$1) visitArray(p.mod, p.modF, v);\n      const src = p.source;\n      if (flags & REFLOW && src) {\n        const sum2 = p.add.length + p.mod.length;\n        if (sum2 === src.length) ;\n        else if (sum2) {\n          visitArray(src, filter$1(p, ADD_MOD), v);\n        } else {\n          visitArray(src, p.srcF, v);\n        }\n      }\n      return p;\n    }\n  };\n  function MultiPulse(dataflow, stamp, pulses, encode2) {\n    const p = this;\n    let c2 = 0;\n    this.dataflow = dataflow;\n    this.stamp = stamp;\n    this.fields = null;\n    this.encode = encode2 || null;\n    this.pulses = pulses;\n    for (const pulse2 of pulses) {\n      if (pulse2.stamp !== stamp) continue;\n      if (pulse2.fields) {\n        const hash = p.fields || (p.fields = {});\n        for (const f in pulse2.fields) {\n          hash[f] = 1;\n        }\n      }\n      if (pulse2.changed(p.ADD)) c2 |= p.ADD;\n      if (pulse2.changed(p.REM)) c2 |= p.REM;\n      if (pulse2.changed(p.MOD)) c2 |= p.MOD;\n    }\n    this.changes = c2;\n  }\n  inherits(MultiPulse, Pulse, {\n    /**\n     * Creates a new pulse based on the values of this pulse.\n     * The dataflow, time stamp and field modification values are copied over.\n     * @return {Pulse}\n     */\n    fork(flags) {\n      const p = new Pulse(this.dataflow).init(this, flags & this.NO_FIELDS);\n      if (flags !== void 0) {\n        if (flags & p.ADD) this.visit(p.ADD, (t) => p.add.push(t));\n        if (flags & p.REM) this.visit(p.REM, (t) => p.rem.push(t));\n        if (flags & p.MOD) this.visit(p.MOD, (t) => p.mod.push(t));\n      }\n      return p;\n    },\n    changed(flags) {\n      return this.changes & flags;\n    },\n    modified(_) {\n      const p = this, fields = p.fields;\n      return !(fields && p.changes & p.MOD) ? 0 : isArray(_) ? _.some((f) => fields[f]) : fields[_];\n    },\n    filter() {\n      error(\"MultiPulse does not support filtering.\");\n    },\n    materialize() {\n      error(\"MultiPulse does not support materialization.\");\n    },\n    visit(flags, visitor) {\n      const p = this, pulses = p.pulses, n = pulses.length;\n      let i = 0;\n      if (flags & p.SOURCE) {\n        for (; i < n; ++i) {\n          pulses[i].visit(flags, visitor);\n        }\n      } else {\n        for (; i < n; ++i) {\n          if (pulses[i].stamp === p.stamp) {\n            pulses[i].visit(flags, visitor);\n          }\n        }\n      }\n      return p;\n    }\n  });\n  async function evaluate(encode2, prerun, postrun) {\n    const df = this, async = [];\n    if (df._pulse) return reentrant(df);\n    if (df._pending) await df._pending;\n    if (prerun) await asyncCallback(df, prerun);\n    if (!df._touched.length) {\n      df.debug(\"Dataflow invoked, but nothing to do.\");\n      return df;\n    }\n    const stamp = ++df._clock;\n    df._pulse = new Pulse(df, stamp, encode2);\n    df._touched.forEach((op2) => df._enqueue(op2, true));\n    df._touched = UniqueList(id);\n    let count2 = 0, op, next, error2;\n    try {\n      while (df._heap.size() > 0) {\n        op = df._heap.pop();\n        if (op.rank !== op.qrank) {\n          df._enqueue(op, true);\n          continue;\n        }\n        next = op.run(df._getPulse(op, encode2));\n        if (next.then) {\n          next = await next;\n        } else if (next.async) {\n          async.push(next.async);\n          next = StopPropagation;\n        }\n        if (next !== StopPropagation) {\n          if (op._targets) op._targets.forEach((op2) => df._enqueue(op2));\n        }\n        ++count2;\n      }\n    } catch (err) {\n      df._heap.clear();\n      error2 = err;\n    }\n    df._input = {};\n    df._pulse = null;\n    df.debug(`Pulse ${stamp}: ${count2} operators`);\n    if (error2) {\n      df._postrun = [];\n      df.error(error2);\n    }\n    if (df._postrun.length) {\n      const pr = df._postrun.sort((a2, b2) => b2.priority - a2.priority);\n      df._postrun = [];\n      for (let i = 0; i < pr.length; ++i) {\n        await asyncCallback(df, pr[i].callback);\n      }\n    }\n    if (postrun) await asyncCallback(df, postrun);\n    if (async.length) {\n      Promise.all(async).then((cb) => df.runAsync(null, () => {\n        cb.forEach((f) => {\n          try {\n            f(df);\n          } catch (err) {\n            df.error(err);\n          }\n        });\n      }));\n    }\n    return df;\n  }\n  async function runAsync(encode2, prerun, postrun) {\n    while (this._running) await this._running;\n    const clear = () => this._running = null;\n    (this._running = this.evaluate(encode2, prerun, postrun)).then(clear, clear);\n    return this._running;\n  }\n  function run(encode2, prerun, postrun) {\n    return this._pulse ? reentrant(this) : (this.evaluate(encode2, prerun, postrun), this);\n  }\n  function runAfter(callback, enqueue2, priority) {\n    if (this._pulse || enqueue2) {\n      this._postrun.push({\n        priority: priority || 0,\n        callback\n      });\n    } else {\n      try {\n        callback(this);\n      } catch (err) {\n        this.error(err);\n      }\n    }\n  }\n  function reentrant(df) {\n    df.error(\"Dataflow already running. Use runAsync() to chain invocations.\");\n    return df;\n  }\n  function enqueue(op, force2) {\n    const q = op.stamp < this._clock;\n    if (q) op.stamp = this._clock;\n    if (q || force2) {\n      op.qrank = op.rank;\n      this._heap.push(op);\n    }\n  }\n  function getPulse(op, encode2) {\n    const s2 = op.source, stamp = this._clock;\n    return s2 && isArray(s2) ? new MultiPulse(this, stamp, s2.map((_) => _.pulse), encode2) : this._input[op.id] || singlePulse(this._pulse, s2 && s2.pulse);\n  }\n  function singlePulse(p, s2) {\n    if (s2 && s2.stamp === p.stamp) {\n      return s2;\n    }\n    p = p.fork();\n    if (s2 && s2 !== StopPropagation) {\n      p.source = s2.source;\n    }\n    return p;\n  }\n  const NO_OPT = {\n    skip: false,\n    force: false\n  };\n  function touch(op, options2) {\n    const opt = options2 || NO_OPT;\n    if (this._pulse) {\n      this._enqueue(op);\n    } else {\n      this._touched.add(op);\n    }\n    if (opt.skip) op.skip(true);\n    return this;\n  }\n  function update$6(op, value2, options2) {\n    const opt = options2 || NO_OPT;\n    if (op.set(value2) || opt.force) {\n      this.touch(op, opt);\n    }\n    return this;\n  }\n  function pulse(op, changeset2, options2) {\n    this.touch(op, options2 || NO_OPT);\n    const p = new Pulse(this, this._clock + (this._pulse ? 0 : 1)), t = op.pulse && op.pulse.source || [];\n    p.target = op;\n    this._input[op.id] = changeset2.pulse(p, t);\n    return this;\n  }\n  function Heap(cmp) {\n    let nodes = [];\n    return {\n      clear: () => nodes = [],\n      size: () => nodes.length,\n      peek: () => nodes[0],\n      push: (x2) => {\n        nodes.push(x2);\n        return siftdown(nodes, 0, nodes.length - 1, cmp);\n      },\n      pop: () => {\n        const last = nodes.pop();\n        let item;\n        if (nodes.length) {\n          item = nodes[0];\n          nodes[0] = last;\n          siftup(nodes, 0, cmp);\n        } else {\n          item = last;\n        }\n        return item;\n      }\n    };\n  }\n  function siftdown(array2, start, idx, cmp) {\n    let parent, pidx;\n    const item = array2[idx];\n    while (idx > start) {\n      pidx = idx - 1 >> 1;\n      parent = array2[pidx];\n      if (cmp(item, parent) < 0) {\n        array2[idx] = parent;\n        idx = pidx;\n        continue;\n      }\n      break;\n    }\n    return array2[idx] = item;\n  }\n  function siftup(array2, idx, cmp) {\n    const start = idx, end = array2.length, item = array2[idx];\n    let cidx = (idx << 1) + 1, ridx;\n    while (cidx < end) {\n      ridx = cidx + 1;\n      if (ridx < end && cmp(array2[cidx], array2[ridx]) >= 0) {\n        cidx = ridx;\n      }\n      array2[idx] = array2[cidx];\n      idx = cidx;\n      cidx = (idx << 1) + 1;\n    }\n    array2[idx] = item;\n    return siftdown(array2, start, idx, cmp);\n  }\n  function Dataflow() {\n    this.logger(logger());\n    this.logLevel(Error$1);\n    this._clock = 0;\n    this._rank = 0;\n    this._locale = defaultLocale();\n    try {\n      this._loader = loader();\n    } catch (e) {\n    }\n    this._touched = UniqueList(id);\n    this._input = {};\n    this._pulse = null;\n    this._heap = Heap((a2, b2) => a2.qrank - b2.qrank);\n    this._postrun = [];\n  }\n  function logMethod(method2) {\n    return function() {\n      return this._log[method2].apply(this, arguments);\n    };\n  }\n  Dataflow.prototype = {\n    /**\n     * The current timestamp of this dataflow. This value reflects the\n     * timestamp of the previous dataflow run. The dataflow is initialized\n     * with a stamp value of 0. The initial run of the dataflow will have\n     * a timestap of 1, and so on. This value will match the\n     * {@link Pulse.stamp} property.\n     * @return {number} - The current timestamp value.\n     */\n    stamp() {\n      return this._clock;\n    },\n    /**\n     * Gets or sets the loader instance to use for data file loading. A\n     * loader object must provide a \"load\" method for loading files and a\n     * \"sanitize\" method for checking URL/filename validity. Both methods\n     * should accept a URI and options hash as arguments, and return a Promise\n     * that resolves to the loaded file contents (load) or a hash containing\n     * sanitized URI data with the sanitized url assigned to the \"href\" property\n     * (sanitize).\n     * @param {object} _ - The loader instance to use.\n     * @return {object|Dataflow} - If no arguments are provided, returns\n     *   the current loader instance. Otherwise returns this Dataflow instance.\n     */\n    loader(_) {\n      if (arguments.length) {\n        this._loader = _;\n        return this;\n      } else {\n        return this._loader;\n      }\n    },\n    /**\n     * Gets or sets the locale instance to use for formatting and parsing\n     * string values. The locale object should be provided by the\n     * vega-format library, and include methods such as format, timeFormat,\n     * utcFormat, timeParse, and utcParse.\n     * @param {object} _ - The locale instance to use.\n     * @return {object|Dataflow} - If no arguments are provided, returns\n     *   the current locale instance. Otherwise returns this Dataflow instance.\n     */\n    locale(_) {\n      if (arguments.length) {\n        this._locale = _;\n        return this;\n      } else {\n        return this._locale;\n      }\n    },\n    /**\n     * Get or set the logger instance used to log messages. If no arguments are\n     * provided, returns the current logger instance. Otherwise, sets the logger\n     * and return this Dataflow instance. Provided loggers must support the full\n     * API of logger objects generated by the vega-util logger method. Note that\n     * by default the log level of the new logger will be used; use the logLevel\n     * method to adjust the log level as needed.\n     */\n    logger(logger2) {\n      if (arguments.length) {\n        this._log = logger2;\n        return this;\n      } else {\n        return this._log;\n      }\n    },\n    /**\n     * Logs an error message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit error messages.\n     */\n    error: logMethod(\"error\"),\n    /**\n     * Logs a warning message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit warning messages.\n     */\n    warn: logMethod(\"warn\"),\n    /**\n     * Logs a information message. By default, logged messages are written to\n     * console output. The message will only be logged if the current log level is\n     * high enough to permit information messages.\n     */\n    info: logMethod(\"info\"),\n    /**\n     * Logs a debug message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit debug messages.\n     */\n    debug: logMethod(\"debug\"),\n    /**\n     * Get or set the current log level. If an argument is provided, it\n     * will be used as the new log level.\n     * @param {number} [level] - Should be one of None, Warn, Info\n     * @return {number} - The current log level.\n     */\n    logLevel: logMethod(\"level\"),\n    /**\n     * Empty entry threshold for garbage cleaning. Map data structures will\n     * perform cleaning once the number of empty entries exceeds this value.\n     */\n    cleanThreshold: 1e4,\n    // OPERATOR REGISTRATION\n    add: add$3,\n    connect,\n    rank,\n    rerank,\n    // OPERATOR UPDATES\n    pulse,\n    touch,\n    update: update$6,\n    changeset,\n    // DATA LOADING\n    ingest,\n    parse: parse$5,\n    preload,\n    request,\n    // EVENT HANDLING\n    events: events$1,\n    on,\n    // PULSE PROPAGATION\n    evaluate,\n    run,\n    runAsync,\n    runAfter,\n    _enqueue: enqueue,\n    _getPulse: getPulse\n  };\n  function Transform(init2, params2) {\n    Operator.call(this, init2, null, params2);\n  }\n  inherits(Transform, Operator, {\n    /**\n     * Overrides {@link Operator.evaluate} for transform operators.\n     * Internally, this method calls {@link evaluate} to perform processing.\n     * If {@link evaluate} returns a falsy value, the input pulse is returned.\n     * This method should NOT be overridden, instead overrride {@link evaluate}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return the output pulse for this operator (or StopPropagation)\n     */\n    run(pulse2) {\n      if (pulse2.stamp < this.stamp) return pulse2.StopPropagation;\n      let rv;\n      if (this.skip()) {\n        this.skip(false);\n      } else {\n        rv = this.evaluate(pulse2);\n      }\n      rv = rv || pulse2;\n      if (rv.then) {\n        rv = rv.then((_) => this.pulse = _);\n      } else if (rv !== pulse2.StopPropagation) {\n        this.pulse = rv;\n      }\n      return rv;\n    },\n    /**\n     * Overrides {@link Operator.evaluate} for transform operators.\n     * Marshalls parameter values and then invokes {@link transform}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n         value (including undefined) will let the input pulse pass through.\n    */\n    evaluate(pulse2) {\n      const params2 = this.marshall(pulse2.stamp), out = this.transform(params2, pulse2);\n      params2.clear();\n      return out;\n    },\n    /**\n     * Process incoming pulses.\n     * Subclasses should override this method to implement transforms.\n     * @param {Parameters} _ - The operator parameter values.\n     * @param {Pulse} pulse - The current dataflow pulse.\n     * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n     *   value (including undefined) will let the input pulse pass through.\n     */\n    transform() {\n    }\n  });\n  const transforms = {};\n  function definition$1(type2) {\n    const t = transform$2(type2);\n    return t && t.Definition || null;\n  }\n  function transform$2(type2) {\n    type2 = type2 && type2.toLowerCase();\n    return has$1(transforms, type2) ? transforms[type2] : null;\n  }\n  function* numbers$1(values2, valueof) {\n    if (valueof == null) {\n      for (let value2 of values2) {\n        if (value2 != null && value2 !== \"\" && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        value2 = valueof(value2, ++index2, values2);\n        if (value2 != null && value2 !== \"\" && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    }\n  }\n  function quantiles(array2, p, f) {\n    const values2 = Float64Array.from(numbers$1(array2, f));\n    values2.sort(ascending$2);\n    return p.map((_) => quantileSorted(values2, _));\n  }\n  function quartiles(array2, f) {\n    return quantiles(array2, [0.25, 0.5, 0.75], f);\n  }\n  function estimateBandwidth(array2, f) {\n    const n = array2.length, d2 = deviation(array2, f), q = quartiles(array2, f), h2 = (q[2] - q[0]) / 1.34, v = Math.min(d2, h2) || d2 || Math.abs(q[0]) || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n  }\n  function bin(_) {\n    const maxb = _.maxbins || 20, base2 = _.base || 10, logb = Math.log(base2), div = _.divide || [5, 2];\n    let min2 = _.extent[0], max2 = _.extent[1], step, level, minstep, v, i, n;\n    const span2 = _.span || max2 - min2 || Math.abs(min2) || 1;\n    if (_.step) {\n      step = _.step;\n    } else if (_.steps) {\n      v = span2 / maxb;\n      for (i = 0, n = _.steps.length; i < n && _.steps[i] < v; ++i) ;\n      step = _.steps[Math.max(0, i - 1)];\n    } else {\n      level = Math.ceil(Math.log(maxb) / logb);\n      minstep = _.minstep || 0;\n      step = Math.max(minstep, Math.pow(base2, Math.round(Math.log(span2) / logb) - level));\n      while (Math.ceil(span2 / step) > maxb) {\n        step *= base2;\n      }\n      for (i = 0, n = div.length; i < n; ++i) {\n        v = step / div[i];\n        if (v >= minstep && span2 / v <= maxb) step = v;\n      }\n    }\n    v = Math.log(step);\n    const precision = v >= 0 ? 0 : ~~(-v / logb) + 1, eps = Math.pow(base2, -precision - 1);\n    if (_.nice || _.nice === void 0) {\n      v = Math.floor(min2 / step + eps) * step;\n      min2 = min2 < v ? v - step : v;\n      max2 = Math.ceil(max2 / step) * step;\n    }\n    return {\n      start: min2,\n      stop: max2 === min2 ? min2 + step : max2,\n      step\n    };\n  }\n  var random = Math.random;\n  function setRandom(r) {\n    random = r;\n  }\n  function bootstrapCI(array2, samples, alpha, f) {\n    if (!array2.length) return [void 0, void 0];\n    const values2 = Float64Array.from(numbers$1(array2, f)), n = values2.length, m2 = samples;\n    let a2, i, j, mu;\n    for (j = 0, mu = Array(m2); j < m2; ++j) {\n      for (a2 = 0, i = 0; i < n; ++i) {\n        a2 += values2[~~(random() * n)];\n      }\n      mu[j] = a2 / n;\n    }\n    mu.sort(ascending$2);\n    return [quantile$1(mu, alpha / 2), quantile$1(mu, 1 - alpha / 2)];\n  }\n  function dotbin(array2, step, smooth, f) {\n    f = f || ((_) => _);\n    const n = array2.length, v = new Float64Array(n);\n    let i = 0, j = 1, a2 = f(array2[0]), b2 = a2, w2 = a2 + step, x2;\n    for (; j < n; ++j) {\n      x2 = f(array2[j]);\n      if (x2 >= w2) {\n        b2 = (a2 + b2) / 2;\n        for (; i < j; ++i) v[i] = b2;\n        w2 = x2 + step;\n        a2 = x2;\n      }\n      b2 = x2;\n    }\n    b2 = (a2 + b2) / 2;\n    for (; i < j; ++i) v[i] = b2;\n    return smooth ? smoothing(v, step + step / 4) : v;\n  }\n  function smoothing(v, thresh) {\n    const n = v.length;\n    let a2 = 0, b2 = 1, c2, d2;\n    while (v[a2] === v[b2]) ++b2;\n    while (b2 < n) {\n      c2 = b2 + 1;\n      while (v[b2] === v[c2]) ++c2;\n      if (v[b2] - v[b2 - 1] < thresh) {\n        d2 = b2 + (a2 + c2 - b2 - b2 >> 1);\n        while (d2 < b2) v[d2++] = v[b2];\n        while (d2 > b2) v[d2--] = v[a2];\n      }\n      a2 = b2;\n      b2 = c2;\n    }\n    return v;\n  }\n  function lcg$2(seed) {\n    return function() {\n      seed = (1103515245 * seed + 12345) % 2147483647;\n      return seed / 2147483647;\n    };\n  }\n  function integer(min2, max2) {\n    if (max2 == null) {\n      max2 = min2;\n      min2 = 0;\n    }\n    let a2, b2, d2;\n    const dist2 = {\n      min(_) {\n        if (arguments.length) {\n          a2 = _ || 0;\n          d2 = b2 - a2;\n          return dist2;\n        } else {\n          return a2;\n        }\n      },\n      max(_) {\n        if (arguments.length) {\n          b2 = _ || 0;\n          d2 = b2 - a2;\n          return dist2;\n        } else {\n          return b2;\n        }\n      },\n      sample() {\n        return a2 + Math.floor(d2 * random());\n      },\n      pdf(x2) {\n        return x2 === Math.floor(x2) && x2 >= a2 && x2 < b2 ? 1 / d2 : 0;\n      },\n      cdf(x2) {\n        const v = Math.floor(x2);\n        return v < a2 ? 0 : v >= b2 ? 1 : (v - a2 + 1) / d2;\n      },\n      icdf(p) {\n        return p >= 0 && p <= 1 ? a2 - 1 + Math.floor(p * d2) : NaN;\n      }\n    };\n    return dist2.min(min2).max(max2);\n  }\n  const SQRT2PI = Math.sqrt(2 * Math.PI);\n  const SQRT2 = Math.SQRT2;\n  let nextSample = NaN;\n  function sampleNormal(mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    let x2 = 0, y2 = 0, rds, c2;\n    if (nextSample === nextSample) {\n      x2 = nextSample;\n      nextSample = NaN;\n    } else {\n      do {\n        x2 = random() * 2 - 1;\n        y2 = random() * 2 - 1;\n        rds = x2 * x2 + y2 * y2;\n      } while (rds === 0 || rds > 1);\n      c2 = Math.sqrt(-2 * Math.log(rds) / rds);\n      x2 *= c2;\n      nextSample = y2 * c2;\n    }\n    return mean2 + x2 * stdev;\n  }\n  function densityNormal(value2, mean2, stdev) {\n    stdev = stdev == null ? 1 : stdev;\n    const z2 = (value2 - (mean2 || 0)) / stdev;\n    return Math.exp(-0.5 * z2 * z2) / (stdev * SQRT2PI);\n  }\n  function cumulativeNormal(value2, mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z2 = (value2 - mean2) / stdev, Z3 = Math.abs(z2);\n    let cd;\n    if (Z3 > 37) {\n      cd = 0;\n    } else {\n      const exp2 = Math.exp(-Z3 * Z3 / 2);\n      let sum2;\n      if (Z3 < 7.07106781186547) {\n        sum2 = 0.0352624965998911 * Z3 + 0.700383064443688;\n        sum2 = sum2 * Z3 + 6.37396220353165;\n        sum2 = sum2 * Z3 + 33.912866078383;\n        sum2 = sum2 * Z3 + 112.079291497871;\n        sum2 = sum2 * Z3 + 221.213596169931;\n        sum2 = sum2 * Z3 + 220.206867912376;\n        cd = exp2 * sum2;\n        sum2 = 0.0883883476483184 * Z3 + 1.75566716318264;\n        sum2 = sum2 * Z3 + 16.064177579207;\n        sum2 = sum2 * Z3 + 86.7807322029461;\n        sum2 = sum2 * Z3 + 296.564248779674;\n        sum2 = sum2 * Z3 + 637.333633378831;\n        sum2 = sum2 * Z3 + 793.826512519948;\n        sum2 = sum2 * Z3 + 440.413735824752;\n        cd = cd / sum2;\n      } else {\n        sum2 = Z3 + 0.65;\n        sum2 = Z3 + 4 / sum2;\n        sum2 = Z3 + 3 / sum2;\n        sum2 = Z3 + 2 / sum2;\n        sum2 = Z3 + 1 / sum2;\n        cd = exp2 / sum2 / 2.506628274631;\n      }\n    }\n    return z2 > 0 ? 1 - cd : cd;\n  }\n  function quantileNormal(p, mean2, stdev) {\n    if (p < 0 || p > 1) return NaN;\n    return (mean2 || 0) + (stdev == null ? 1 : stdev) * SQRT2 * erfinv(2 * p - 1);\n  }\n  function erfinv(x2) {\n    let w2 = -Math.log((1 - x2) * (1 + x2)), p;\n    if (w2 < 6.25) {\n      w2 -= 3.125;\n      p = -364441206401782e-35;\n      p = -16850591381820166e-35 + p * w2;\n      p = 128584807152564e-32 + p * w2;\n      p = 11157877678025181e-33 + p * w2;\n      p = -1333171662854621e-31 + p * w2;\n      p = 20972767875968562e-33 + p * w2;\n      p = 6637638134358324e-30 + p * w2;\n      p = -4054566272975207e-29 + p * w2;\n      p = -8151934197605472e-29 + p * w2;\n      p = 26335093153082323e-28 + p * w2;\n      p = -12975133253453532e-27 + p * w2;\n      p = -5415412054294628e-26 + p * w2;\n      p = 10512122733215323e-25 + p * w2;\n      p = -4112633980346984e-24 + p * w2;\n      p = -29070369957882005e-24 + p * w2;\n      p = 42347877827932404e-23 + p * w2;\n      p = -13654692000834679e-22 + p * w2;\n      p = -13882523362786469e-21 + p * w2;\n      p = 18673420803405714e-20 + p * w2;\n      p = -740702534166267e-18 + p * w2;\n      p = -0.006033670871430149 + p * w2;\n      p = 0.24015818242558962 + p * w2;\n      p = 1.6536545626831027 + p * w2;\n    } else if (w2 < 16) {\n      w2 = Math.sqrt(w2) - 3.25;\n      p = 22137376921775787e-25;\n      p = 9075656193888539e-23 + p * w2;\n      p = -27517406297064545e-23 + p * w2;\n      p = 18239629214389228e-24 + p * w2;\n      p = 15027403968909828e-22 + p * w2;\n      p = -4013867526981546e-21 + p * w2;\n      p = 29234449089955446e-22 + p * w2;\n      p = 12475304481671779e-21 + p * w2;\n      p = -47318229009055734e-21 + p * w2;\n      p = 6828485145957318e-20 + p * w2;\n      p = 24031110387097894e-21 + p * w2;\n      p = -3550375203628475e-19 + p * w2;\n      p = 9532893797373805e-19 + p * w2;\n      p = -0.0016882755560235047 + p * w2;\n      p = 0.002491442096107851 + p * w2;\n      p = -0.003751208507569241 + p * w2;\n      p = 0.005370914553590064 + p * w2;\n      p = 1.0052589676941592 + p * w2;\n      p = 3.0838856104922208 + p * w2;\n    } else if (Number.isFinite(w2)) {\n      w2 = Math.sqrt(w2) - 5;\n      p = -27109920616438573e-27;\n      p = -2555641816996525e-25 + p * w2;\n      p = 15076572693500548e-25 + p * w2;\n      p = -3789465440126737e-24 + p * w2;\n      p = 761570120807834e-23 + p * w2;\n      p = -1496002662714924e-23 + p * w2;\n      p = 2914795345090108e-23 + p * w2;\n      p = -6771199775845234e-23 + p * w2;\n      p = 22900482228026655e-23 + p * w2;\n      p = -99298272942317e-20 + p * w2;\n      p = 4526062597223154e-21 + p * w2;\n      p = -1968177810553167e-20 + p * w2;\n      p = 7599527703001776e-20 + p * w2;\n      p = -21503011930044477e-20 + p * w2;\n      p = -13871931833623122e-20 + p * w2;\n      p = 1.0103004648645344 + p * w2;\n      p = 4.849906401408584 + p * w2;\n    } else {\n      p = Infinity;\n    }\n    return p * x2;\n  }\n  function gaussian(mean2, stdev) {\n    let mu, sigma;\n    const dist2 = {\n      mean(_) {\n        if (arguments.length) {\n          mu = _ || 0;\n          return dist2;\n        } else {\n          return mu;\n        }\n      },\n      stdev(_) {\n        if (arguments.length) {\n          sigma = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return sigma;\n        }\n      },\n      sample: () => sampleNormal(mu, sigma),\n      pdf: (value2) => densityNormal(value2, mu, sigma),\n      cdf: (value2) => cumulativeNormal(value2, mu, sigma),\n      icdf: (p) => quantileNormal(p, mu, sigma)\n    };\n    return dist2.mean(mean2).stdev(stdev);\n  }\n  function kde(support, bandwidth2) {\n    const kernel = gaussian();\n    let n = 0;\n    const dist2 = {\n      data(_) {\n        if (arguments.length) {\n          support = _;\n          n = _ ? _.length : 0;\n          return dist2.bandwidth(bandwidth2);\n        } else {\n          return support;\n        }\n      },\n      bandwidth(_) {\n        if (!arguments.length) return bandwidth2;\n        bandwidth2 = _;\n        if (!bandwidth2 && support) bandwidth2 = estimateBandwidth(support);\n        return dist2;\n      },\n      sample() {\n        return support[~~(random() * n)] + bandwidth2 * kernel.sample();\n      },\n      pdf(x2) {\n        let y2 = 0, i = 0;\n        for (; i < n; ++i) {\n          y2 += kernel.pdf((x2 - support[i]) / bandwidth2);\n        }\n        return y2 / bandwidth2 / n;\n      },\n      cdf(x2) {\n        let y2 = 0, i = 0;\n        for (; i < n; ++i) {\n          y2 += kernel.cdf((x2 - support[i]) / bandwidth2);\n        }\n        return y2 / n;\n      },\n      icdf() {\n        throw Error(\"KDE icdf not supported.\");\n      }\n    };\n    return dist2.data(support);\n  }\n  function sampleLogNormal(mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    return Math.exp(mean2 + sampleNormal() * stdev);\n  }\n  function densityLogNormal(value2, mean2, stdev) {\n    if (value2 <= 0) return 0;\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z2 = (Math.log(value2) - mean2) / stdev;\n    return Math.exp(-0.5 * z2 * z2) / (stdev * SQRT2PI * value2);\n  }\n  function cumulativeLogNormal(value2, mean2, stdev) {\n    return cumulativeNormal(Math.log(value2), mean2, stdev);\n  }\n  function quantileLogNormal(p, mean2, stdev) {\n    return Math.exp(quantileNormal(p, mean2, stdev));\n  }\n  function lognormal(mean2, stdev) {\n    let mu, sigma;\n    const dist2 = {\n      mean(_) {\n        if (arguments.length) {\n          mu = _ || 0;\n          return dist2;\n        } else {\n          return mu;\n        }\n      },\n      stdev(_) {\n        if (arguments.length) {\n          sigma = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return sigma;\n        }\n      },\n      sample: () => sampleLogNormal(mu, sigma),\n      pdf: (value2) => densityLogNormal(value2, mu, sigma),\n      cdf: (value2) => cumulativeLogNormal(value2, mu, sigma),\n      icdf: (p) => quantileLogNormal(p, mu, sigma)\n    };\n    return dist2.mean(mean2).stdev(stdev);\n  }\n  function mixture$1(dists, weights) {\n    let m2 = 0, w2;\n    function normalize2(x2) {\n      const w3 = [];\n      let sum2 = 0, i;\n      for (i = 0; i < m2; ++i) {\n        sum2 += w3[i] = x2[i] == null ? 1 : +x2[i];\n      }\n      for (i = 0; i < m2; ++i) {\n        w3[i] /= sum2;\n      }\n      return w3;\n    }\n    const dist2 = {\n      weights(_) {\n        if (arguments.length) {\n          w2 = normalize2(weights = _ || []);\n          return dist2;\n        }\n        return weights;\n      },\n      distributions(_) {\n        if (arguments.length) {\n          if (_) {\n            m2 = _.length;\n            dists = _;\n          } else {\n            m2 = 0;\n            dists = [];\n          }\n          return dist2.weights(weights);\n        }\n        return dists;\n      },\n      sample() {\n        const r = random();\n        let d2 = dists[m2 - 1], v = w2[0], i = 0;\n        for (; i < m2 - 1; v += w2[++i]) {\n          if (r < v) {\n            d2 = dists[i];\n            break;\n          }\n        }\n        return d2.sample();\n      },\n      pdf(x2) {\n        let p = 0, i = 0;\n        for (; i < m2; ++i) {\n          p += w2[i] * dists[i].pdf(x2);\n        }\n        return p;\n      },\n      cdf(x2) {\n        let p = 0, i = 0;\n        for (; i < m2; ++i) {\n          p += w2[i] * dists[i].cdf(x2);\n        }\n        return p;\n      },\n      icdf() {\n        throw Error(\"Mixture icdf not supported.\");\n      }\n    };\n    return dist2.distributions(dists).weights(weights);\n  }\n  function sampleUniform(min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return min2 + (max2 - min2) * random();\n  }\n  function densityUniform(value2, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return value2 >= min2 && value2 <= max2 ? 1 / (max2 - min2) : 0;\n  }\n  function cumulativeUniform(value2, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return value2 < min2 ? 0 : value2 > max2 ? 1 : (value2 - min2) / (max2 - min2);\n  }\n  function quantileUniform(p, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return p >= 0 && p <= 1 ? min2 + p * (max2 - min2) : NaN;\n  }\n  function uniform(min2, max2) {\n    let a2, b2;\n    const dist2 = {\n      min(_) {\n        if (arguments.length) {\n          a2 = _ || 0;\n          return dist2;\n        } else {\n          return a2;\n        }\n      },\n      max(_) {\n        if (arguments.length) {\n          b2 = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return b2;\n        }\n      },\n      sample: () => sampleUniform(a2, b2),\n      pdf: (value2) => densityUniform(value2, a2, b2),\n      cdf: (value2) => cumulativeUniform(value2, a2, b2),\n      icdf: (p) => quantileUniform(p, a2, b2)\n    };\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return dist2.min(min2).max(max2);\n  }\n  function constant$3(data2, x2, y2) {\n    let mean2 = 0, n = 0;\n    for (const d2 of data2) {\n      const val = y2(d2);\n      if (x2(d2) == null || val == null || isNaN(val)) continue;\n      mean2 += (val - mean2) / ++n;\n    }\n    return {\n      coef: [mean2],\n      predict: () => mean2,\n      rSquared: 0\n    };\n  }\n  function ols(uX, uY, uXY, uX2) {\n    const delta = uX2 - uX * uX, slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta, intercept = uY - slope * uX;\n    return [intercept, slope];\n  }\n  function points(data2, x2, y2, sort2) {\n    data2 = data2.filter((d3) => {\n      let u2 = x2(d3), v = y2(d3);\n      return u2 != null && (u2 = +u2) >= u2 && v != null && (v = +v) >= v;\n    });\n    if (sort2) {\n      data2.sort((a2, b2) => x2(a2) - x2(b2));\n    }\n    const n = data2.length, X3 = new Float64Array(n), Y3 = new Float64Array(n);\n    let i = 0, ux = 0, uy = 0, xv, yv, d2;\n    for (d2 of data2) {\n      X3[i] = xv = +x2(d2);\n      Y3[i] = yv = +y2(d2);\n      ++i;\n      ux += (xv - ux) / i;\n      uy += (yv - uy) / i;\n    }\n    for (i = 0; i < n; ++i) {\n      X3[i] -= ux;\n      Y3[i] -= uy;\n    }\n    return [X3, Y3, ux, uy];\n  }\n  function visitPoints(data2, x2, y2, callback) {\n    let i = -1, u2, v;\n    for (const d2 of data2) {\n      u2 = x2(d2);\n      v = y2(d2);\n      if (u2 != null && (u2 = +u2) >= u2 && v != null && (v = +v) >= v) {\n        callback(u2, v, ++i);\n      }\n    }\n  }\n  function rSquared(data2, x2, y2, uY, predict) {\n    let SSE = 0, SST = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      const sse = dy - predict(dx), sst = dy - uY;\n      SSE += sse * sse;\n      SST += sst * sst;\n    });\n    return 1 - SSE / SST;\n  }\n  function linear(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      ++n;\n      X3 += (dx - X3) / n;\n      Y3 += (dy - Y3) / n;\n      XY += (dx * dy - XY) / n;\n      X22 += (dx * dx - X22) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] + coef[1] * x3;\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, Y3, predict)\n    };\n  }\n  function log$2(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      ++n;\n      dx = Math.log(dx);\n      X3 += (dx - X3) / n;\n      Y3 += (dy - Y3) / n;\n      XY += (dx * dy - XY) / n;\n      X22 += (dx * dx - X22) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] + coef[1] * Math.log(x3);\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, Y3, predict)\n    };\n  }\n  function exp$1(data2, x2, y2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2);\n    let YL = 0, XY = 0, XYL = 0, X2Y = 0, n = 0, dx, ly2, xy;\n    visitPoints(data2, x2, y2, (_, dy) => {\n      dx = xv[n++];\n      ly2 = Math.log(dy);\n      xy = dx * dy;\n      YL += (dy * ly2 - YL) / n;\n      XY += (xy - XY) / n;\n      XYL += (xy * ly2 - XYL) / n;\n      X2Y += (dx * xy - X2Y) / n;\n    });\n    const [c0, c1] = ols(XY / uy, YL / uy, XYL / uy, X2Y / uy), predict = (x3) => Math.exp(c0 + c1 * (x3 - ux));\n    return {\n      coef: [Math.exp(c0 - c1 * ux), c1],\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function pow$2(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, YS = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      const lx2 = Math.log(dx), ly2 = Math.log(dy);\n      ++n;\n      X3 += (lx2 - X3) / n;\n      Y3 += (ly2 - Y3) / n;\n      XY += (lx2 * ly2 - XY) / n;\n      X22 += (lx2 * lx2 - X22) / n;\n      YS += (dy - YS) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] * Math.pow(x3, coef[1]);\n    coef[0] = Math.exp(coef[0]);\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, YS, predict)\n    };\n  }\n  function quad(data2, x2, y2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2), n = xv.length;\n    let X22 = 0, X3 = 0, X4 = 0, XY = 0, X2Y = 0, i, dx, dy, x22;\n    for (i = 0; i < n; ) {\n      dx = xv[i];\n      dy = yv[i++];\n      x22 = dx * dx;\n      X22 += (x22 - X22) / i;\n      X3 += (x22 * dx - X3) / i;\n      X4 += (x22 * x22 - X4) / i;\n      XY += (dx * dy - XY) / i;\n      X2Y += (x22 * dy - X2Y) / i;\n    }\n    const X2X2 = X4 - X22 * X22, d2 = X22 * X2X2 - X3 * X3, a2 = (X2Y * X22 - XY * X3) / d2, b2 = (XY * X2X2 - X2Y * X3) / d2, c2 = -a2 * X22, predict = (x3) => {\n      x3 = x3 - ux;\n      return a2 * x3 * x3 + b2 * x3 + c2 + uy;\n    };\n    return {\n      coef: [c2 - b2 * ux + a2 * ux * ux + uy, b2 - 2 * a2 * ux, a2],\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function poly(data2, x2, y2, order) {\n    if (order === 0) return constant$3(data2, x2, y2);\n    if (order === 1) return linear(data2, x2, y2);\n    if (order === 2) return quad(data2, x2, y2);\n    const [xv, yv, ux, uy] = points(data2, x2, y2), n = xv.length, lhs = [], rhs = [], k = order + 1;\n    let i, j, l, v, c2;\n    for (i = 0; i < k; ++i) {\n      for (l = 0, v = 0; l < n; ++l) {\n        v += Math.pow(xv[l], i) * yv[l];\n      }\n      lhs.push(v);\n      c2 = new Float64Array(k);\n      for (j = 0; j < k; ++j) {\n        for (l = 0, v = 0; l < n; ++l) {\n          v += Math.pow(xv[l], i + j);\n        }\n        c2[j] = v;\n      }\n      rhs.push(c2);\n    }\n    rhs.push(lhs);\n    const coef = gaussianElimination(rhs), predict = (x3) => {\n      x3 -= ux;\n      let y3 = uy + coef[0] + coef[1] * x3 + coef[2] * x3 * x3;\n      for (i = 3; i < k; ++i) y3 += coef[i] * Math.pow(x3, i);\n      return y3;\n    };\n    return {\n      coef: uncenter(k, coef, -ux, uy),\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function uncenter(k, a2, x2, y2) {\n    const z2 = Array(k);\n    let i, j, v, c2;\n    for (i = 0; i < k; ++i) z2[i] = 0;\n    for (i = k - 1; i >= 0; --i) {\n      v = a2[i];\n      c2 = 1;\n      z2[i] += v;\n      for (j = 1; j <= i; ++j) {\n        c2 *= (i + 1 - j) / j;\n        z2[i - j] += v * Math.pow(x2, j) * c2;\n      }\n    }\n    z2[0] += y2;\n    return z2;\n  }\n  function gaussianElimination(matrix) {\n    const n = matrix.length - 1, coef = [];\n    let i, j, k, r, t;\n    for (i = 0; i < n; ++i) {\n      r = i;\n      for (j = i + 1; j < n; ++j) {\n        if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) {\n          r = j;\n        }\n      }\n      for (k = i; k < n + 1; ++k) {\n        t = matrix[k][i];\n        matrix[k][i] = matrix[k][r];\n        matrix[k][r] = t;\n      }\n      for (j = i + 1; j < n; ++j) {\n        for (k = n; k >= i; k--) {\n          matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i];\n        }\n      }\n    }\n    for (j = n - 1; j >= 0; --j) {\n      t = 0;\n      for (k = j + 1; k < n; ++k) {\n        t += matrix[k][j] * coef[k];\n      }\n      coef[j] = (matrix[n][j] - t) / matrix[j][j];\n    }\n    return coef;\n  }\n  const maxiters = 2, epsilon$6 = 1e-12;\n  function loess(data2, x2, y2, bandwidth2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2, true), n = xv.length, bw = Math.max(2, ~~(bandwidth2 * n)), yhat = new Float64Array(n), residuals = new Float64Array(n), robustWeights = new Float64Array(n).fill(1);\n    for (let iter = -1; ++iter <= maxiters; ) {\n      const interval2 = [0, bw - 1];\n      for (let i = 0; i < n; ++i) {\n        const dx = xv[i], i0 = interval2[0], i1 = interval2[1], edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;\n        let W = 0, X3 = 0, Y3 = 0, XY = 0, X22 = 0;\n        const denom = 1 / Math.abs(xv[edge] - dx || 1);\n        for (let k = i0; k <= i1; ++k) {\n          const xk = xv[k], yk = yv[k], w2 = tricube(Math.abs(dx - xk) * denom) * robustWeights[k], xkw = xk * w2;\n          W += w2;\n          X3 += xkw;\n          Y3 += yk * w2;\n          XY += yk * xkw;\n          X22 += xk * xkw;\n        }\n        const [a2, b2] = ols(X3 / W, Y3 / W, XY / W, X22 / W);\n        yhat[i] = a2 + b2 * dx;\n        residuals[i] = Math.abs(yv[i] - yhat[i]);\n        updateInterval(xv, i + 1, interval2);\n      }\n      if (iter === maxiters) {\n        break;\n      }\n      const medianResidual = median(residuals);\n      if (Math.abs(medianResidual) < epsilon$6) break;\n      for (let i = 0, arg, w2; i < n; ++i) {\n        arg = residuals[i] / (6 * medianResidual);\n        robustWeights[i] = arg >= 1 ? epsilon$6 : (w2 = 1 - arg * arg) * w2;\n      }\n    }\n    return output$1(xv, yhat, ux, uy);\n  }\n  function tricube(x2) {\n    return (x2 = 1 - x2 * x2 * x2) * x2 * x2;\n  }\n  function updateInterval(xv, i, interval2) {\n    const val = xv[i];\n    let left = interval2[0], right = interval2[1] + 1;\n    if (right >= xv.length) return;\n    while (i > left && xv[right] - val <= val - xv[left]) {\n      interval2[0] = ++left;\n      interval2[1] = right;\n      ++right;\n    }\n  }\n  function output$1(xv, yhat, ux, uy) {\n    const n = xv.length, out = [];\n    let i = 0, cnt = 0, prev = [], v;\n    for (; i < n; ++i) {\n      v = xv[i] + ux;\n      if (prev[0] === v) {\n        prev[1] += (yhat[i] - prev[1]) / ++cnt;\n      } else {\n        cnt = 0;\n        prev[1] += uy;\n        prev = [v, yhat[i]];\n        out.push(prev);\n      }\n    }\n    prev[1] += uy;\n    return out;\n  }\n  const MIN_RADIANS = 0.5 * Math.PI / 180;\n  function sampleCurve(f, extent2, minSteps, maxSteps) {\n    minSteps = minSteps || 25;\n    maxSteps = Math.max(minSteps, maxSteps || 200);\n    const point2 = (x2) => [x2, f(x2)], minX = extent2[0], maxX = extent2[1], span2 = maxX - minX, stop2 = span2 / maxSteps, prev = [point2(minX)], next = [];\n    if (minSteps === maxSteps) {\n      for (let i = 1; i < maxSteps; ++i) {\n        prev.push(point2(minX + i / minSteps * span2));\n      }\n      prev.push(point2(maxX));\n      return prev;\n    } else {\n      next.push(point2(maxX));\n      for (let i = minSteps; --i > 0; ) {\n        next.push(point2(minX + i / minSteps * span2));\n      }\n    }\n    let p02 = prev[0];\n    let p1 = next[next.length - 1];\n    const sx = 1 / span2;\n    const sy = scaleY(p02[1], next);\n    while (p1) {\n      const pm = point2((p02[0] + p1[0]) / 2);\n      const dx = pm[0] - p02[0] >= stop2;\n      if (dx && angleDelta(p02, pm, p1, sx, sy) > MIN_RADIANS) {\n        next.push(pm);\n      } else {\n        p02 = p1;\n        prev.push(p1);\n        next.pop();\n      }\n      p1 = next[next.length - 1];\n    }\n    return prev;\n  }\n  function scaleY(init2, points2) {\n    let ymin = init2;\n    let ymax = init2;\n    const n = points2.length;\n    for (let i = 0; i < n; ++i) {\n      const y2 = points2[i][1];\n      if (y2 < ymin) ymin = y2;\n      if (y2 > ymax) ymax = y2;\n    }\n    return 1 / (ymax - ymin);\n  }\n  function angleDelta(p, q, r, sx, sy) {\n    const a0 = Math.atan2(sy * (r[1] - p[1]), sx * (r[0] - p[0])), a1 = Math.atan2(sy * (q[1] - p[1]), sx * (q[0] - p[0]));\n    return Math.abs(a0 - a1);\n  }\n  function multikey(f) {\n    return (x2) => {\n      const n = f.length;\n      let i = 1, k = String(f[0](x2));\n      for (; i < n; ++i) {\n        k += \"|\" + f[i](x2);\n      }\n      return k;\n    };\n  }\n  function groupkey(fields) {\n    return !fields || !fields.length ? function() {\n      return \"\";\n    } : fields.length === 1 ? fields[0] : multikey(fields);\n  }\n  function measureName(op, field2, as) {\n    return as || op + (!field2 ? \"\" : \"_\" + field2);\n  }\n  const noop$4 = () => {\n  };\n  const base_op = {\n    init: noop$4,\n    add: noop$4,\n    rem: noop$4,\n    idx: 0\n  };\n  const AggregateOps = {\n    values: {\n      init: (m2) => m2.cell.store = true,\n      value: (m2) => m2.cell.data.values(),\n      idx: -1\n    },\n    count: {\n      value: (m2) => m2.cell.num\n    },\n    __count__: {\n      value: (m2) => m2.missing + m2.valid\n    },\n    missing: {\n      value: (m2) => m2.missing\n    },\n    valid: {\n      value: (m2) => m2.valid\n    },\n    sum: {\n      init: (m2) => m2.sum = 0,\n      value: (m2) => m2.valid ? m2.sum : void 0,\n      add: (m2, v) => m2.sum += +v,\n      rem: (m2, v) => m2.sum -= v\n    },\n    product: {\n      init: (m2) => m2.product = 1,\n      value: (m2) => m2.valid ? m2.product : void 0,\n      add: (m2, v) => m2.product *= v,\n      rem: (m2, v) => m2.product /= v\n    },\n    mean: {\n      init: (m2) => m2.mean = 0,\n      value: (m2) => m2.valid ? m2.mean : void 0,\n      add: (m2, v) => (m2.mean_d = v - m2.mean, m2.mean += m2.mean_d / m2.valid),\n      rem: (m2, v) => (m2.mean_d = v - m2.mean, m2.mean -= m2.valid ? m2.mean_d / m2.valid : m2.mean)\n    },\n    average: {\n      value: (m2) => m2.valid ? m2.mean : void 0,\n      req: [\"mean\"],\n      idx: 1\n    },\n    variance: {\n      init: (m2) => m2.dev = 0,\n      value: (m2) => m2.valid > 1 ? m2.dev / (m2.valid - 1) : void 0,\n      add: (m2, v) => m2.dev += m2.mean_d * (v - m2.mean),\n      rem: (m2, v) => m2.dev -= m2.mean_d * (v - m2.mean),\n      req: [\"mean\"],\n      idx: 1\n    },\n    variancep: {\n      value: (m2) => m2.valid > 1 ? m2.dev / m2.valid : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stdev: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / (m2.valid - 1)) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stdevp: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / m2.valid) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stderr: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / (m2.valid * (m2.valid - 1))) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    distinct: {\n      value: (m2) => m2.cell.data.distinct(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    ci0: {\n      value: (m2) => m2.cell.data.ci0(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    ci1: {\n      value: (m2) => m2.cell.data.ci1(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    median: {\n      value: (m2) => m2.cell.data.q2(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    q1: {\n      value: (m2) => m2.cell.data.q1(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    q3: {\n      value: (m2) => m2.cell.data.q3(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    min: {\n      init: (m2) => m2.min = void 0,\n      value: (m2) => m2.min = Number.isNaN(m2.min) ? m2.cell.data.min(m2.get) : m2.min,\n      add: (m2, v) => {\n        if (v < m2.min || m2.min === void 0) m2.min = v;\n      },\n      rem: (m2, v) => {\n        if (v <= m2.min) m2.min = NaN;\n      },\n      req: [\"values\"],\n      idx: 4\n    },\n    max: {\n      init: (m2) => m2.max = void 0,\n      value: (m2) => m2.max = Number.isNaN(m2.max) ? m2.cell.data.max(m2.get) : m2.max,\n      add: (m2, v) => {\n        if (v > m2.max || m2.max === void 0) m2.max = v;\n      },\n      rem: (m2, v) => {\n        if (v >= m2.max) m2.max = NaN;\n      },\n      req: [\"values\"],\n      idx: 4\n    },\n    argmin: {\n      init: (m2) => m2.argmin = void 0,\n      value: (m2) => m2.argmin || m2.cell.data.argmin(m2.get),\n      add: (m2, v, t) => {\n        if (v < m2.min) m2.argmin = t;\n      },\n      rem: (m2, v) => {\n        if (v <= m2.min) m2.argmin = void 0;\n      },\n      req: [\"min\", \"values\"],\n      idx: 3\n    },\n    argmax: {\n      init: (m2) => m2.argmax = void 0,\n      value: (m2) => m2.argmax || m2.cell.data.argmax(m2.get),\n      add: (m2, v, t) => {\n        if (v > m2.max) m2.argmax = t;\n      },\n      rem: (m2, v) => {\n        if (v >= m2.max) m2.argmax = void 0;\n      },\n      req: [\"max\", \"values\"],\n      idx: 3\n    },\n    exponential: {\n      init: (m2, r) => {\n        m2.exp = 0;\n        m2.exp_r = r;\n      },\n      value: (m2) => m2.valid ? m2.exp * (1 - m2.exp_r) / (1 - m2.exp_r ** m2.valid) : void 0,\n      add: (m2, v) => m2.exp = m2.exp_r * m2.exp + v,\n      rem: (m2, v) => m2.exp = (m2.exp - v / m2.exp_r ** (m2.valid - 1)) / m2.exp_r\n    },\n    exponentialb: {\n      value: (m2) => m2.valid ? m2.exp * (1 - m2.exp_r) : void 0,\n      req: [\"exponential\"],\n      idx: 1\n    }\n  };\n  const ValidAggregateOps = Object.keys(AggregateOps).filter((d2) => d2 !== \"__count__\");\n  function measure(key2, value2) {\n    return (out, aggregate_param) => extend({\n      name: key2,\n      aggregate_param,\n      out: out || key2\n    }, base_op, value2);\n  }\n  [...ValidAggregateOps, \"__count__\"].forEach((key2) => {\n    AggregateOps[key2] = measure(key2, AggregateOps[key2]);\n  });\n  function createMeasure(op, param2, name) {\n    return AggregateOps[op](name, param2);\n  }\n  function compareIndex(a2, b2) {\n    return a2.idx - b2.idx;\n  }\n  function resolve(agg) {\n    const map2 = {};\n    agg.forEach((a2) => map2[a2.name] = a2);\n    const getreqs = (a2) => {\n      if (!a2.req) return;\n      a2.req.forEach((key2) => {\n        if (!map2[key2]) getreqs(map2[key2] = AggregateOps[key2]());\n      });\n    };\n    agg.forEach(getreqs);\n    return Object.values(map2).sort(compareIndex);\n  }\n  function init() {\n    this.valid = 0;\n    this.missing = 0;\n    this._ops.forEach((op) => op.aggregate_param == null ? op.init(this) : op.init(this, op.aggregate_param));\n  }\n  function add$2(v, t) {\n    if (v == null || v === \"\") {\n      ++this.missing;\n      return;\n    }\n    if (v !== v) return;\n    ++this.valid;\n    this._ops.forEach((op) => op.add(this, v, t));\n  }\n  function rem(v, t) {\n    if (v == null || v === \"\") {\n      --this.missing;\n      return;\n    }\n    if (v !== v) return;\n    --this.valid;\n    this._ops.forEach((op) => op.rem(this, v, t));\n  }\n  function set$3(t) {\n    this._out.forEach((op) => t[op.out] = op.value(this));\n    return t;\n  }\n  function compileMeasures(agg, field2) {\n    const get2 = field2 || identity$2, ops2 = resolve(agg), out = agg.slice().sort(compareIndex);\n    function ctr(cell2) {\n      this._ops = ops2;\n      this._out = out;\n      this.cell = cell2;\n      this.init();\n    }\n    ctr.prototype.init = init;\n    ctr.prototype.add = add$2;\n    ctr.prototype.rem = rem;\n    ctr.prototype.set = set$3;\n    ctr.prototype.get = get2;\n    ctr.fields = agg.map((op) => op.out);\n    return ctr;\n  }\n  function TupleStore(key2) {\n    this._key = key2 ? field$1(key2) : tupleid;\n    this.reset();\n  }\n  const prototype$1 = TupleStore.prototype;\n  prototype$1.reset = function() {\n    this._add = [];\n    this._rem = [];\n    this._ext = null;\n    this._get = null;\n    this._q = null;\n  };\n  prototype$1.add = function(v) {\n    this._add.push(v);\n  };\n  prototype$1.rem = function(v) {\n    this._rem.push(v);\n  };\n  prototype$1.values = function() {\n    this._get = null;\n    if (this._rem.length === 0) return this._add;\n    const a2 = this._add, r = this._rem, k = this._key, n = a2.length, m2 = r.length, x2 = Array(n - m2), map2 = {};\n    let i, j, v;\n    for (i = 0; i < m2; ++i) {\n      map2[k(r[i])] = 1;\n    }\n    for (i = 0, j = 0; i < n; ++i) {\n      if (map2[k(v = a2[i])]) {\n        map2[k(v)] = 0;\n      } else {\n        x2[j++] = v;\n      }\n    }\n    this._rem = [];\n    return this._add = x2;\n  };\n  prototype$1.distinct = function(get2) {\n    const v = this.values(), map2 = {};\n    let n = v.length, count2 = 0, s2;\n    while (--n >= 0) {\n      s2 = get2(v[n]) + \"\";\n      if (!has$1(map2, s2)) {\n        map2[s2] = 1;\n        ++count2;\n      }\n    }\n    return count2;\n  };\n  prototype$1.extent = function(get2) {\n    if (this._get !== get2 || !this._ext) {\n      const v = this.values(), i = extentIndex(v, get2);\n      this._ext = [v[i[0]], v[i[1]]];\n      this._get = get2;\n    }\n    return this._ext;\n  };\n  prototype$1.argmin = function(get2) {\n    return this.extent(get2)[0] || {};\n  };\n  prototype$1.argmax = function(get2) {\n    return this.extent(get2)[1] || {};\n  };\n  prototype$1.min = function(get2) {\n    const m2 = this.extent(get2)[0];\n    return m2 != null ? get2(m2) : void 0;\n  };\n  prototype$1.max = function(get2) {\n    const m2 = this.extent(get2)[1];\n    return m2 != null ? get2(m2) : void 0;\n  };\n  prototype$1.quartile = function(get2) {\n    if (this._get !== get2 || !this._q) {\n      this._q = quartiles(this.values(), get2);\n      this._get = get2;\n    }\n    return this._q;\n  };\n  prototype$1.q1 = function(get2) {\n    return this.quartile(get2)[0];\n  };\n  prototype$1.q2 = function(get2) {\n    return this.quartile(get2)[1];\n  };\n  prototype$1.q3 = function(get2) {\n    return this.quartile(get2)[2];\n  };\n  prototype$1.ci = function(get2) {\n    if (this._get !== get2 || !this._ci) {\n      this._ci = bootstrapCI(this.values(), 1e3, 0.05, get2);\n      this._get = get2;\n    }\n    return this._ci;\n  };\n  prototype$1.ci0 = function(get2) {\n    return this.ci(get2)[0];\n  };\n  prototype$1.ci1 = function(get2) {\n    return this.ci(get2)[1];\n  };\n  function Aggregate$1(params2) {\n    Transform.call(this, null, params2);\n    this._adds = [];\n    this._mods = [];\n    this._alen = 0;\n    this._mlen = 0;\n    this._drop = true;\n    this._cross = false;\n    this._dims = [];\n    this._dnames = [];\n    this._measures = [];\n    this._countOnly = false;\n    this._counts = null;\n    this._prev = null;\n    this._inputs = null;\n    this._outputs = null;\n  }\n  Aggregate$1.Definition = {\n    \"type\": \"Aggregate\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidAggregateOps\n    }, {\n      \"name\": \"aggregate_params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"drop\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"cross\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(Aggregate$1, Transform, {\n    transform(_, pulse2) {\n      const aggr = this, out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), mod = _.modified();\n      aggr.stamp = out.stamp;\n      if (aggr.value && (mod || pulse2.modified(aggr._inputs, true))) {\n        aggr._prev = aggr.value;\n        aggr.value = mod ? aggr.init(_) : /* @__PURE__ */ Object.create(null);\n        pulse2.visit(pulse2.SOURCE, (t) => aggr.add(t));\n      } else {\n        aggr.value = aggr.value || aggr.init(_);\n        pulse2.visit(pulse2.REM, (t) => aggr.rem(t));\n        pulse2.visit(pulse2.ADD, (t) => aggr.add(t));\n      }\n      out.modifies(aggr._outputs);\n      aggr._drop = _.drop !== false;\n      if (_.cross && aggr._dims.length > 1) {\n        aggr._drop = false;\n        aggr.cross();\n      }\n      if (pulse2.clean() && aggr._drop) {\n        out.clean(true).runAfter(() => this.clean());\n      }\n      return aggr.changes(out);\n    },\n    cross() {\n      const aggr = this, curr = aggr.value, dims = aggr._dnames, vals = dims.map(() => ({})), n = dims.length;\n      function collect2(cells) {\n        let key2, i, t, v;\n        for (key2 in cells) {\n          t = cells[key2].tuple;\n          for (i = 0; i < n; ++i) {\n            vals[i][v = t[dims[i]]] = v;\n          }\n        }\n      }\n      collect2(aggr._prev);\n      collect2(curr);\n      function generate2(base2, tuple, index2) {\n        const name = dims[index2], v = vals[index2++];\n        for (const k in v) {\n          const key2 = base2 ? base2 + \"|\" + k : k;\n          tuple[name] = v[k];\n          if (index2 < n) generate2(key2, tuple, index2);\n          else if (!curr[key2]) aggr.cell(key2, tuple);\n        }\n      }\n      generate2(\"\", {}, 0);\n    },\n    init(_) {\n      const inputs = this._inputs = [], outputs = this._outputs = [], inputMap = {};\n      function inputVisit(get2) {\n        const fields2 = array$4(accessorFields(get2)), n2 = fields2.length;\n        let i2 = 0, f;\n        for (; i2 < n2; ++i2) {\n          if (!inputMap[f = fields2[i2]]) {\n            inputMap[f] = 1;\n            inputs.push(f);\n          }\n        }\n      }\n      this._dims = array$4(_.groupby);\n      this._dnames = this._dims.map((d2) => {\n        const dname = accessorName(d2);\n        inputVisit(d2);\n        outputs.push(dname);\n        return dname;\n      });\n      this.cellkey = _.key ? _.key : groupkey(this._dims);\n      this._countOnly = true;\n      this._counts = [];\n      this._measures = [];\n      const fields = _.fields || [null], ops2 = _.ops || [\"count\"], aggregate_params = _.aggregate_params || [null], as = _.as || [], n = fields.length, map2 = {};\n      let field2, op, aggregate_param, m2, mname, outname, i;\n      if (n !== ops2.length) {\n        error(\"Unmatched number of fields and aggregate ops.\");\n      }\n      for (i = 0; i < n; ++i) {\n        field2 = fields[i];\n        op = ops2[i];\n        aggregate_param = aggregate_params[i] || null;\n        if (field2 == null && op !== \"count\") {\n          error(\"Null aggregate field specified.\");\n        }\n        mname = accessorName(field2);\n        outname = measureName(op, mname, as[i]);\n        outputs.push(outname);\n        if (op === \"count\") {\n          this._counts.push(outname);\n          continue;\n        }\n        m2 = map2[mname];\n        if (!m2) {\n          inputVisit(field2);\n          m2 = map2[mname] = [];\n          m2.field = field2;\n          this._measures.push(m2);\n        }\n        if (op !== \"count\") this._countOnly = false;\n        m2.push(createMeasure(op, aggregate_param, outname));\n      }\n      this._measures = this._measures.map((m3) => compileMeasures(m3, m3.field));\n      return /* @__PURE__ */ Object.create(null);\n    },\n    // -- Cell Management -----\n    cellkey: groupkey(),\n    cell(key2, t) {\n      let cell2 = this.value[key2];\n      if (!cell2) {\n        cell2 = this.value[key2] = this.newcell(key2, t);\n        this._adds[this._alen++] = cell2;\n      } else if (cell2.num === 0 && this._drop && cell2.stamp < this.stamp) {\n        cell2.stamp = this.stamp;\n        this._adds[this._alen++] = cell2;\n      } else if (cell2.stamp < this.stamp) {\n        cell2.stamp = this.stamp;\n        this._mods[this._mlen++] = cell2;\n      }\n      return cell2;\n    },\n    newcell(key2, t) {\n      const cell2 = {\n        key: key2,\n        num: 0,\n        agg: null,\n        tuple: this.newtuple(t, this._prev && this._prev[key2]),\n        stamp: this.stamp,\n        store: false\n      };\n      if (!this._countOnly) {\n        const measures = this._measures, n = measures.length;\n        cell2.agg = Array(n);\n        for (let i = 0; i < n; ++i) {\n          cell2.agg[i] = new measures[i](cell2);\n        }\n      }\n      if (cell2.store) {\n        cell2.data = new TupleStore();\n      }\n      return cell2;\n    },\n    newtuple(t, p) {\n      const names = this._dnames, dims = this._dims, n = dims.length, x2 = {};\n      for (let i = 0; i < n; ++i) {\n        x2[names[i]] = dims[i](t);\n      }\n      return p ? replace$1(p.tuple, x2) : ingest$1(x2);\n    },\n    clean() {\n      const cells = this.value;\n      for (const key2 in cells) {\n        if (cells[key2].num === 0) {\n          delete cells[key2];\n        }\n      }\n    },\n    // -- Process Tuples -----\n    add(t) {\n      const key2 = this.cellkey(t), cell2 = this.cell(key2, t);\n      cell2.num += 1;\n      if (this._countOnly) return;\n      if (cell2.store) cell2.data.add(t);\n      const agg = cell2.agg;\n      for (let i = 0, n = agg.length; i < n; ++i) {\n        agg[i].add(agg[i].get(t), t);\n      }\n    },\n    rem(t) {\n      const key2 = this.cellkey(t), cell2 = this.cell(key2, t);\n      cell2.num -= 1;\n      if (this._countOnly) return;\n      if (cell2.store) cell2.data.rem(t);\n      const agg = cell2.agg;\n      for (let i = 0, n = agg.length; i < n; ++i) {\n        agg[i].rem(agg[i].get(t), t);\n      }\n    },\n    celltuple(cell2) {\n      const tuple = cell2.tuple, counts = this._counts;\n      if (cell2.store) {\n        cell2.data.values();\n      }\n      for (let i = 0, n = counts.length; i < n; ++i) {\n        tuple[counts[i]] = cell2.num;\n      }\n      if (!this._countOnly) {\n        const agg = cell2.agg;\n        for (let i = 0, n = agg.length; i < n; ++i) {\n          agg[i].set(tuple);\n        }\n      }\n      return tuple;\n    },\n    changes(out) {\n      const adds = this._adds, mods = this._mods, prev = this._prev, drop = this._drop, add2 = out.add, rem2 = out.rem, mod = out.mod;\n      let cell2, key2, i, n;\n      if (prev) for (key2 in prev) {\n        cell2 = prev[key2];\n        if (!drop || cell2.num) rem2.push(cell2.tuple);\n      }\n      for (i = 0, n = this._alen; i < n; ++i) {\n        add2.push(this.celltuple(adds[i]));\n        adds[i] = null;\n      }\n      for (i = 0, n = this._mlen; i < n; ++i) {\n        cell2 = mods[i];\n        (cell2.num === 0 && drop ? rem2 : mod).push(this.celltuple(cell2));\n        mods[i] = null;\n      }\n      this._alen = this._mlen = 0;\n      this._prev = null;\n      return out;\n    }\n  });\n  const EPSILON$1 = 1e-14;\n  function Bin(params2) {\n    Transform.call(this, null, params2);\n  }\n  Bin.Definition = {\n    \"type\": \"Bin\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"interval\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"anchor\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"maxbins\",\n      \"type\": \"number\",\n      \"default\": 20\n    }, {\n      \"name\": \"base\",\n      \"type\": \"number\",\n      \"default\": 10\n    }, {\n      \"name\": \"divide\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"default\": [5, 2]\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"span\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"minstep\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"name\",\n      \"type\": \"string\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"bin0\", \"bin1\"]\n    }]\n  };\n  inherits(Bin, Transform, {\n    transform(_, pulse2) {\n      const band2 = _.interval !== false, bins = this._bins(_), start = bins.start, step = bins.step, as = _.as || [\"bin0\", \"bin1\"], b0 = as[0], b1 = as[1];\n      let flag2;\n      if (_.modified()) {\n        pulse2 = pulse2.reflow(true);\n        flag2 = pulse2.SOURCE;\n      } else {\n        flag2 = pulse2.modified(accessorFields(_.field)) ? pulse2.ADD_MOD : pulse2.ADD;\n      }\n      pulse2.visit(flag2, band2 ? (t) => {\n        const v = bins(t);\n        t[b0] = v;\n        t[b1] = v == null ? null : start + step * (1 + (v - start) / step);\n      } : (t) => t[b0] = bins(t));\n      return pulse2.modifies(band2 ? as : b0);\n    },\n    _bins(_) {\n      if (this.value && !_.modified()) {\n        return this.value;\n      }\n      const field2 = _.field, bins = bin(_), step = bins.step;\n      let start = bins.start, stop2 = start + Math.ceil((bins.stop - start) / step) * step, a2, d2;\n      if ((a2 = _.anchor) != null) {\n        d2 = a2 - (start + step * Math.floor((a2 - start) / step));\n        start += d2;\n        stop2 += d2;\n      }\n      const f = function(t) {\n        let v = toNumber(field2(t));\n        return v == null ? null : v < start ? -Infinity : v > stop2 ? Infinity : (v = Math.max(start, Math.min(v, stop2 - step)), start + step * Math.floor(EPSILON$1 + (v - start) / step));\n      };\n      f.start = start;\n      f.stop = bins.stop;\n      f.step = step;\n      return this.value = accessor(f, accessorFields(field2), _.name || \"bin_\" + accessorName(field2));\n    }\n  });\n  function SortedList(idFunc, source2, input) {\n    const $2 = idFunc;\n    let data2 = source2 || [], add2 = input || [], rem2 = {}, cnt = 0;\n    return {\n      add: (t) => add2.push(t),\n      remove: (t) => rem2[$2(t)] = ++cnt,\n      size: () => data2.length,\n      data: (compare2, resort) => {\n        if (cnt) {\n          data2 = data2.filter((t) => !rem2[$2(t)]);\n          rem2 = {};\n          cnt = 0;\n        }\n        if (resort && compare2) {\n          data2.sort(compare2);\n        }\n        if (add2.length) {\n          data2 = compare2 ? merge$2(compare2, data2, add2.sort(compare2)) : data2.concat(add2);\n          add2 = [];\n        }\n        return data2;\n      }\n    };\n  }\n  function Collect$1(params2) {\n    Transform.call(this, [], params2);\n  }\n  Collect$1.Definition = {\n    \"type\": \"Collect\",\n    \"metadata\": {\n      \"source\": true\n    },\n    \"params\": [{\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }]\n  };\n  inherits(Collect$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.ALL), list = SortedList(tupleid, this.value, out.materialize(out.ADD).add), sort2 = _.sort, mod = pulse2.changed() || sort2 && (_.modified(\"sort\") || pulse2.modified(sort2.fields));\n      out.visit(out.REM, list.remove);\n      this.modified(mod);\n      this.value = out.source = list.data(stableCompare(sort2), mod);\n      if (pulse2.source && pulse2.source.root) {\n        this.value.root = pulse2.source.root;\n      }\n      return out;\n    }\n  });\n  function Compare$1(params2) {\n    Operator.call(this, null, update$5, params2);\n  }\n  inherits(Compare$1, Operator);\n  function update$5(_) {\n    return this.value && !_.modified() ? this.value : compare$1(_.fields, _.orders);\n  }\n  function CountPattern(params2) {\n    Transform.call(this, null, params2);\n  }\n  CountPattern.Definition = {\n    \"type\": \"CountPattern\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"case\",\n      \"type\": \"enum\",\n      \"values\": [\"upper\", \"lower\", \"mixed\"],\n      \"default\": \"mixed\"\n    }, {\n      \"name\": \"pattern\",\n      \"type\": \"string\",\n      \"default\": '[\\\\w\"]+'\n    }, {\n      \"name\": \"stopwords\",\n      \"type\": \"string\",\n      \"default\": \"\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"text\", \"count\"]\n    }]\n  };\n  function tokenize(text2, tcase, match2) {\n    switch (tcase) {\n      case \"upper\":\n        text2 = text2.toUpperCase();\n        break;\n      case \"lower\":\n        text2 = text2.toLowerCase();\n        break;\n    }\n    return text2.match(match2);\n  }\n  inherits(CountPattern, Transform, {\n    transform(_, pulse2) {\n      const process = (update2) => (tuple) => {\n        var tokens = tokenize(get2(tuple), _.case, match2) || [], t;\n        for (var i = 0, n = tokens.length; i < n; ++i) {\n          if (!stop2.test(t = tokens[i])) update2(t);\n        }\n      };\n      const init2 = this._parameterCheck(_, pulse2), counts = this._counts, match2 = this._match, stop2 = this._stop, get2 = _.field, as = _.as || [\"text\", \"count\"], add2 = process((t) => counts[t] = 1 + (counts[t] || 0)), rem2 = process((t) => counts[t] -= 1);\n      if (init2) {\n        pulse2.visit(pulse2.SOURCE, add2);\n      } else {\n        pulse2.visit(pulse2.ADD, add2);\n        pulse2.visit(pulse2.REM, rem2);\n      }\n      return this._finish(pulse2, as);\n    },\n    _parameterCheck(_, pulse2) {\n      let init2 = false;\n      if (_.modified(\"stopwords\") || !this._stop) {\n        this._stop = new RegExp(\"^\" + (_.stopwords || \"\") + \"$\", \"i\");\n        init2 = true;\n      }\n      if (_.modified(\"pattern\") || !this._match) {\n        this._match = new RegExp(_.pattern || \"[\\\\w']+\", \"g\");\n        init2 = true;\n      }\n      if (_.modified(\"field\") || pulse2.modified(_.field.fields)) {\n        init2 = true;\n      }\n      if (init2) this._counts = {};\n      return init2;\n    },\n    _finish(pulse2, as) {\n      const counts = this._counts, tuples = this._tuples || (this._tuples = {}), text2 = as[0], count2 = as[1], out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      let w2, t, c2;\n      for (w2 in counts) {\n        t = tuples[w2];\n        c2 = counts[w2] || 0;\n        if (!t && c2) {\n          tuples[w2] = t = ingest$1({});\n          t[text2] = w2;\n          t[count2] = c2;\n          out.add.push(t);\n        } else if (c2 === 0) {\n          if (t) out.rem.push(t);\n          counts[w2] = null;\n          tuples[w2] = null;\n        } else if (t[count2] !== c2) {\n          t[count2] = c2;\n          out.mod.push(t);\n        }\n      }\n      return out.modifies(as);\n    }\n  });\n  function Cross(params2) {\n    Transform.call(this, null, params2);\n  }\n  Cross.Definition = {\n    \"type\": \"Cross\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"filter\",\n      \"type\": \"expr\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"a\", \"b\"]\n    }]\n  };\n  inherits(Cross, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), as = _.as || [\"a\", \"b\"], a2 = as[0], b2 = as[1], reset2 = !this.value || pulse2.changed(pulse2.ADD_REM) || _.modified(\"as\") || _.modified(\"filter\");\n      let data2 = this.value;\n      if (reset2) {\n        if (data2) out.rem = data2;\n        data2 = pulse2.materialize(pulse2.SOURCE).source;\n        out.add = this.value = cross(data2, a2, b2, _.filter || truthy);\n      } else {\n        out.mod = data2;\n      }\n      out.source = this.value;\n      return out.modifies(as);\n    }\n  });\n  function cross(input, a2, b2, filter2) {\n    var data2 = [], t = {}, n = input.length, i = 0, j, left;\n    for (; i < n; ++i) {\n      t[a2] = left = input[i];\n      for (j = 0; j < n; ++j) {\n        t[b2] = input[j];\n        if (filter2(t)) {\n          data2.push(ingest$1(t));\n          t = {};\n          t[a2] = left;\n        }\n      }\n    }\n    return data2;\n  }\n  const Distributions = {\n    kde,\n    mixture: mixture$1,\n    normal: gaussian,\n    lognormal,\n    uniform\n  };\n  const DISTRIBUTIONS = \"distributions\", FUNCTION = \"function\", FIELD = \"field\";\n  function parse$4(def2, data2) {\n    const func = def2[FUNCTION];\n    if (!has$1(Distributions, func)) {\n      error(\"Unknown distribution function: \" + func);\n    }\n    const d2 = Distributions[func]();\n    for (const name in def2) {\n      if (name === FIELD) {\n        d2.data((def2.from || data2()).map(def2[name]));\n      } else if (name === DISTRIBUTIONS) {\n        d2[name](def2[name].map((_) => parse$4(_, data2)));\n      } else if (typeof d2[name] === FUNCTION) {\n        d2[name](def2[name]);\n      }\n    }\n    return d2;\n  }\n  function Density(params2) {\n    Transform.call(this, null, params2);\n  }\n  const distributions = [{\n    \"key\": {\n      \"function\": \"normal\"\n    },\n    \"params\": [{\n      \"name\": \"mean\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"stdev\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"lognormal\"\n    },\n    \"params\": [{\n      \"name\": \"mean\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"stdev\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"uniform\"\n    },\n    \"params\": [{\n      \"name\": \"min\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"max\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"kde\"\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"from\",\n      \"type\": \"data\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0\n    }]\n  }];\n  const mixture = {\n    \"key\": {\n      \"function\": \"mixture\"\n    },\n    \"params\": [{\n      \"name\": \"distributions\",\n      \"type\": \"param\",\n      \"array\": true,\n      \"params\": distributions\n    }, {\n      \"name\": \"weights\",\n      \"type\": \"number\",\n      \"array\": true\n    }]\n  };\n  Density.Definition = {\n    \"type\": \"Density\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"minsteps\",\n      \"type\": \"number\",\n      \"default\": 25\n    }, {\n      \"name\": \"maxsteps\",\n      \"type\": \"number\",\n      \"default\": 200\n    }, {\n      \"name\": \"method\",\n      \"type\": \"string\",\n      \"default\": \"pdf\",\n      \"values\": [\"pdf\", \"cdf\"]\n    }, {\n      \"name\": \"distribution\",\n      \"type\": \"param\",\n      \"params\": distributions.concat(mixture)\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"value\", \"density\"]\n    }]\n  };\n  inherits(Density, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const dist2 = parse$4(_.distribution, source$1(pulse2)), minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n        let method2 = _.method || \"pdf\";\n        if (method2 !== \"pdf\" && method2 !== \"cdf\") {\n          error(\"Invalid density method: \" + method2);\n        }\n        if (!_.extent && !dist2.data) {\n          error(\"Missing density extent parameter.\");\n        }\n        method2 = dist2[method2];\n        const as = _.as || [\"value\", \"density\"], domain2 = _.extent || extent(dist2.data()), values2 = sampleCurve(method2, domain2, minsteps, maxsteps).map((v) => {\n          const tuple = {};\n          tuple[as[0]] = v[0];\n          tuple[as[1]] = v[1];\n          return ingest$1(tuple);\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  function source$1(pulse2) {\n    return () => pulse2.materialize(pulse2.SOURCE).source;\n  }\n  function fieldNames(fields, as) {\n    if (!fields) return null;\n    return fields.map((f, i) => as[i] || accessorName(f));\n  }\n  function partition$1$1(data2, groupby, field2) {\n    const groups = [], get2 = (f) => f(t);\n    let map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2.map(field2));\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(field2(t));\n      }\n    }\n    return groups;\n  }\n  const Output$5 = \"bin\";\n  function DotBin(params2) {\n    Transform.call(this, null, params2);\n  }\n  DotBin.Definition = {\n    \"type\": \"DotBin\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": Output$5\n    }]\n  };\n  const autostep = (data2, field2) => span(extent(data2, field2)) / 30;\n  inherits(DotBin, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !(_.modified() || pulse2.changed())) {\n        return pulse2;\n      }\n      const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(pulse2.source, _.groupby, identity$2), smooth = _.smooth || false, field2 = _.field, step = _.step || autostep(source2, field2), sort2 = stableCompare((a2, b2) => field2(a2) - field2(b2)), as = _.as || Output$5, n = groups.length;\n      let min2 = Infinity, max2 = -Infinity, i = 0, j;\n      for (; i < n; ++i) {\n        const g = groups[i].sort(sort2);\n        j = -1;\n        for (const v of dotbin(g, step, smooth, field2)) {\n          if (v < min2) min2 = v;\n          if (v > max2) max2 = v;\n          g[++j][as] = v;\n        }\n      }\n      this.value = {\n        start: min2,\n        stop: max2,\n        step\n      };\n      return pulse2.reflow(true).modifies(as);\n    }\n  });\n  function Expression$1(params2) {\n    Operator.call(this, null, update$4, params2);\n    this.modified(true);\n  }\n  inherits(Expression$1, Operator);\n  function update$4(_) {\n    const expr2 = _.expr;\n    return this.value && !_.modified(\"expr\") ? this.value : accessor((datum2) => expr2(datum2, _), accessorFields(expr2), accessorName(expr2));\n  }\n  function Extent(params2) {\n    Transform.call(this, [void 0, void 0], params2);\n  }\n  Extent.Definition = {\n    \"type\": \"Extent\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  };\n  inherits(Extent, Transform, {\n    transform(_, pulse2) {\n      const extent2 = this.value, field2 = _.field, mod = pulse2.changed() || pulse2.modified(field2.fields) || _.modified(\"field\");\n      let min2 = extent2[0], max2 = extent2[1];\n      if (mod || min2 == null) {\n        min2 = Infinity;\n        max2 = -Infinity;\n      }\n      pulse2.visit(mod ? pulse2.SOURCE : pulse2.ADD, (t) => {\n        const v = toNumber(field2(t));\n        if (v != null) {\n          if (v < min2) min2 = v;\n          if (v > max2) max2 = v;\n        }\n      });\n      if (!Number.isFinite(min2) || !Number.isFinite(max2)) {\n        let name = accessorName(field2);\n        if (name) name = ` for field \"${name}\"`;\n        pulse2.dataflow.warn(`Infinite extent${name}: [${min2}, ${max2}]`);\n        min2 = max2 = void 0;\n      }\n      this.value = [min2, max2];\n    }\n  });\n  function Subflow(pulse2, parent) {\n    Operator.call(this, pulse2);\n    this.parent = parent;\n    this.count = 0;\n  }\n  inherits(Subflow, Operator, {\n    /**\n     * Routes pulses from this subflow to a target transform.\n     * @param {Transform} target - A transform that receives the subflow of tuples.\n     */\n    connect(target2) {\n      this.detachSubflow = target2.detachSubflow;\n      this.targets().add(target2);\n      return target2.source = this;\n    },\n    /**\n     * Add an 'add' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being added.\n     */\n    add(t) {\n      this.count += 1;\n      this.value.add.push(t);\n    },\n    /**\n     * Add a 'rem' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being removed.\n     */\n    rem(t) {\n      this.count -= 1;\n      this.value.rem.push(t);\n    },\n    /**\n     * Add a 'mod' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being modified.\n     */\n    mod(t) {\n      this.value.mod.push(t);\n    },\n    /**\n     * Re-initialize this operator's pulse value.\n     * @param {Pulse} pulse - The pulse to copy from.\n     * @see Pulse.init\n     */\n    init(pulse2) {\n      this.value.init(pulse2, pulse2.NO_SOURCE);\n    },\n    /**\n     * Evaluate this operator. This method overrides the\n     * default behavior to simply return the contained pulse value.\n     * @return {Pulse}\n     */\n    evaluate() {\n      return this.value;\n    }\n  });\n  function Facet$1(params2) {\n    Transform.call(this, {}, params2);\n    this._keys = fastmap();\n    const a2 = this._targets = [];\n    a2.active = 0;\n    a2.forEach = (f) => {\n      for (let i = 0, n = a2.active; i < n; ++i) {\n        f(a2[i], i, a2);\n      }\n    };\n  }\n  inherits(Facet$1, Transform, {\n    activate(flow) {\n      this._targets[this._targets.active++] = flow;\n    },\n    // parent argument provided by PreFacet subclass\n    subflow(key2, flow, pulse2, parent) {\n      const flows = this.value;\n      let sf = has$1(flows, key2) && flows[key2], df, p;\n      if (!sf) {\n        p = parent || (p = this._group[key2]) && p.tuple;\n        df = pulse2.dataflow;\n        sf = new Subflow(pulse2.fork(pulse2.NO_SOURCE), this);\n        df.add(sf).connect(flow(df, key2, p));\n        flows[key2] = sf;\n        this.activate(sf);\n      } else if (sf.value.stamp < pulse2.stamp) {\n        sf.init(pulse2);\n        this.activate(sf);\n      }\n      return sf;\n    },\n    clean() {\n      const flows = this.value;\n      let detached = 0;\n      for (const key2 in flows) {\n        if (flows[key2].count === 0) {\n          const detach = flows[key2].detachSubflow;\n          if (detach) detach();\n          delete flows[key2];\n          ++detached;\n        }\n      }\n      if (detached) {\n        const active = this._targets.filter((sf) => sf && sf.count > 0);\n        this.initTargets(active);\n      }\n    },\n    initTargets(act) {\n      const a2 = this._targets, n = a2.length, m2 = act ? act.length : 0;\n      let i = 0;\n      for (; i < m2; ++i) {\n        a2[i] = act[i];\n      }\n      for (; i < n && a2[i] != null; ++i) {\n        a2[i] = null;\n      }\n      a2.active = m2;\n    },\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, key2 = _.key, flow = _.subflow, cache2 = this._keys, rekey = _.modified(\"key\"), subflow = (key3) => this.subflow(key3, flow, pulse2);\n      this._group = _.group || {};\n      this.initTargets();\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t), k = cache2.get(id2);\n        if (k !== void 0) {\n          cache2.delete(id2);\n          subflow(k).rem(t);\n        }\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        const k = key2(t);\n        cache2.set(tupleid(t), k);\n        subflow(k).add(t);\n      });\n      if (rekey || pulse2.modified(key2.fields)) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          const id2 = tupleid(t), k0 = cache2.get(id2), k1 = key2(t);\n          if (k0 === k1) {\n            subflow(k1).mod(t);\n          } else {\n            cache2.set(id2, k1);\n            subflow(k0).rem(t);\n            subflow(k1).add(t);\n          }\n        });\n      } else if (pulse2.changed(pulse2.MOD)) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          subflow(cache2.get(tupleid(t))).mod(t);\n        });\n      }\n      if (rekey) {\n        pulse2.visit(pulse2.REFLOW, (t) => {\n          const id2 = tupleid(t), k0 = cache2.get(id2), k1 = key2(t);\n          if (k0 !== k1) {\n            cache2.set(id2, k1);\n            subflow(k0).rem(t);\n            subflow(k1).add(t);\n          }\n        });\n      }\n      if (pulse2.clean()) {\n        df.runAfter(() => {\n          this.clean();\n          cache2.clean();\n        });\n      } else if (cache2.empty > df.cleanThreshold) {\n        df.runAfter(cache2.clean);\n      }\n      return pulse2;\n    }\n  });\n  function Field$1(params2) {\n    Operator.call(this, null, update$3, params2);\n  }\n  inherits(Field$1, Operator);\n  function update$3(_) {\n    return this.value && !_.modified() ? this.value : isArray(_.name) ? array$4(_.name).map((f) => field$1(f)) : field$1(_.name, _.as);\n  }\n  function Filter(params2) {\n    Transform.call(this, fastmap(), params2);\n  }\n  Filter.Definition = {\n    \"type\": \"Filter\",\n    \"metadata\": {\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"expr\",\n      \"type\": \"expr\",\n      \"required\": true\n    }]\n  };\n  inherits(Filter, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, cache2 = this.value, output2 = pulse2.fork(), add2 = output2.add, rem2 = output2.rem, mod = output2.mod, test2 = _.expr;\n      let isMod = true;\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t);\n        if (!cache2.has(id2)) rem2.push(t);\n        else cache2.delete(id2);\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        if (test2(t, _)) add2.push(t);\n        else cache2.set(tupleid(t), 1);\n      });\n      function revisit(t) {\n        const id2 = tupleid(t), b2 = test2(t, _), s2 = cache2.get(id2);\n        if (b2 && s2) {\n          cache2.delete(id2);\n          add2.push(t);\n        } else if (!b2 && !s2) {\n          cache2.set(id2, 1);\n          rem2.push(t);\n        } else if (isMod && b2 && !s2) {\n          mod.push(t);\n        }\n      }\n      pulse2.visit(pulse2.MOD, revisit);\n      if (_.modified()) {\n        isMod = false;\n        pulse2.visit(pulse2.REFLOW, revisit);\n      }\n      if (cache2.empty > df.cleanThreshold) df.runAfter(cache2.clean);\n      return output2;\n    }\n  });\n  function Flatten(params2) {\n    Transform.call(this, [], params2);\n  }\n  Flatten.Definition = {\n    \"type\": \"Flatten\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"index\",\n      \"type\": \"string\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Flatten, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, as = fieldNames(fields, _.as || []), index2 = _.index || null, m2 = as.length;\n      out.rem = this.value;\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        const arrays = fields.map((f) => f(t)), maxlen = arrays.reduce((l, a2) => Math.max(l, a2.length), 0);\n        let i = 0, j, d2, v;\n        for (; i < maxlen; ++i) {\n          d2 = derive(t);\n          for (j = 0; j < m2; ++j) {\n            d2[as[j]] = (v = arrays[j][i]) == null ? null : v;\n          }\n          if (index2) {\n            d2[index2] = i;\n          }\n          out.add.push(d2);\n        }\n      });\n      this.value = out.source = out.add;\n      if (index2) out.modifies(index2);\n      return out.modifies(as);\n    }\n  });\n  function Fold(params2) {\n    Transform.call(this, [], params2);\n  }\n  Fold.Definition = {\n    \"type\": \"Fold\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"key\", \"value\"]\n    }]\n  };\n  inherits(Fold, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, fnames = fields.map(accessorName), as = _.as || [\"key\", \"value\"], k = as[0], v = as[1], n = fields.length;\n      out.rem = this.value;\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        for (let i = 0, d2; i < n; ++i) {\n          d2 = derive(t);\n          d2[k] = fnames[i];\n          d2[v] = fields[i](t);\n          out.add.push(d2);\n        }\n      });\n      this.value = out.source = out.add;\n      return out.modifies(as);\n    }\n  });\n  function Formula(params2) {\n    Transform.call(this, null, params2);\n  }\n  Formula.Definition = {\n    \"type\": \"Formula\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"expr\",\n      \"type\": \"expr\",\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"required\": true\n    }, {\n      \"name\": \"initonly\",\n      \"type\": \"boolean\"\n    }]\n  };\n  inherits(Formula, Transform, {\n    transform(_, pulse2) {\n      const func = _.expr, as = _.as, mod = _.modified(), flag2 = _.initonly ? pulse2.ADD : mod ? pulse2.SOURCE : pulse2.modified(func.fields) || pulse2.modified(as) ? pulse2.ADD_MOD : pulse2.ADD;\n      if (mod) {\n        pulse2 = pulse2.materialize().reflow(true);\n      }\n      if (!_.initonly) {\n        pulse2.modifies(as);\n      }\n      return pulse2.visit(flag2, (t) => t[as] = func(t, _));\n    }\n  });\n  function Generate(params2) {\n    Transform.call(this, [], params2);\n  }\n  inherits(Generate, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.ALL), gen = _.generator;\n      let data2 = this.value, num = _.size - data2.length, add2, rem2, t;\n      if (num > 0) {\n        for (add2 = []; --num >= 0; ) {\n          add2.push(t = ingest$1(gen(_)));\n          data2.push(t);\n        }\n        out.add = out.add.length ? out.materialize(out.ADD).add.concat(add2) : add2;\n      } else {\n        rem2 = data2.slice(0, -num);\n        out.rem = out.rem.length ? out.materialize(out.REM).rem.concat(rem2) : rem2;\n        data2 = data2.slice(-num);\n      }\n      out.source = this.value = data2;\n      return out;\n    }\n  });\n  const Methods$1 = {\n    value: \"value\",\n    median,\n    mean,\n    min: min$2,\n    max: max$2\n  };\n  const Empty$1 = [];\n  function Impute(params2) {\n    Transform.call(this, [], params2);\n  }\n  Impute.Definition = {\n    \"type\": \"Impute\",\n    \"metadata\": {\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"keyvals\",\n      \"array\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"value\",\n      \"values\": [\"value\", \"mean\", \"median\", \"max\", \"min\"]\n    }, {\n      \"name\": \"value\",\n      \"default\": 0\n    }]\n  };\n  function getValue(_) {\n    var m2 = _.method || Methods$1.value, v;\n    if (Methods$1[m2] == null) {\n      error(\"Unrecognized imputation method: \" + m2);\n    } else if (m2 === Methods$1.value) {\n      v = _.value !== void 0 ? _.value : 0;\n      return () => v;\n    } else {\n      return Methods$1[m2];\n    }\n  }\n  function getField$1(_) {\n    const f = _.field;\n    return (t) => t ? f(t) : NaN;\n  }\n  inherits(Impute, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), impute = getValue(_), field2 = getField$1(_), fName = accessorName(_.field), kName = accessorName(_.key), gNames = (_.groupby || []).map(accessorName), groups = partition$4(pulse2.source, _.groupby, _.key, _.keyvals), curr = [], prev = this.value, m2 = groups.domain.length, group2, value2, gVals, kVal, g, i, j, l, n, t;\n      for (g = 0, l = groups.length; g < l; ++g) {\n        group2 = groups[g];\n        gVals = group2.values;\n        value2 = NaN;\n        for (j = 0; j < m2; ++j) {\n          if (group2[j] != null) continue;\n          kVal = groups.domain[j];\n          t = {\n            _impute: true\n          };\n          for (i = 0, n = gVals.length; i < n; ++i) t[gNames[i]] = gVals[i];\n          t[kName] = kVal;\n          t[fName] = Number.isNaN(value2) ? value2 = impute(group2, field2) : value2;\n          curr.push(ingest$1(t));\n        }\n      }\n      if (curr.length) out.add = out.materialize(out.ADD).add.concat(curr);\n      if (prev.length) out.rem = out.materialize(out.REM).rem.concat(prev);\n      this.value = curr;\n      return out;\n    }\n  });\n  function partition$4(data2, groupby, key2, keyvals) {\n    var get2 = (f) => f(t), groups = [], domain2 = keyvals ? keyvals.slice() : [], kMap = {}, gMap = {}, gVals, gKey, group2, i, j, k, n, t;\n    domain2.forEach((k2, i2) => kMap[k2] = i2 + 1);\n    for (i = 0, n = data2.length; i < n; ++i) {\n      t = data2[i];\n      k = key2(t);\n      j = kMap[k] || (kMap[k] = domain2.push(k));\n      gKey = (gVals = groupby ? groupby.map(get2) : Empty$1) + \"\";\n      if (!(group2 = gMap[gKey])) {\n        group2 = gMap[gKey] = [];\n        groups.push(group2);\n        group2.values = gVals;\n      }\n      group2[j - 1] = t;\n    }\n    groups.domain = domain2;\n    return groups;\n  }\n  function JoinAggregate(params2) {\n    Aggregate$1.call(this, params2);\n  }\n  JoinAggregate.Definition = {\n    \"type\": \"JoinAggregate\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidAggregateOps\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(JoinAggregate, Aggregate$1, {\n    transform(_, pulse2) {\n      const aggr = this, mod = _.modified();\n      let cells;\n      if (aggr.value && (mod || pulse2.modified(aggr._inputs, true))) {\n        cells = aggr.value = mod ? aggr.init(_) : {};\n        pulse2.visit(pulse2.SOURCE, (t) => aggr.add(t));\n      } else {\n        cells = aggr.value = aggr.value || this.init(_);\n        pulse2.visit(pulse2.REM, (t) => aggr.rem(t));\n        pulse2.visit(pulse2.ADD, (t) => aggr.add(t));\n      }\n      aggr.changes();\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        extend(t, cells[aggr.cellkey(t)].tuple);\n      });\n      return pulse2.reflow(mod).modifies(this._outputs);\n    },\n    changes() {\n      const adds = this._adds, mods = this._mods;\n      let i, n;\n      for (i = 0, n = this._alen; i < n; ++i) {\n        this.celltuple(adds[i]);\n        adds[i] = null;\n      }\n      for (i = 0, n = this._mlen; i < n; ++i) {\n        this.celltuple(mods[i]);\n        mods[i] = null;\n      }\n      this._alen = this._mlen = 0;\n    }\n  });\n  function KDE(params2) {\n    Transform.call(this, null, params2);\n  }\n  KDE.Definition = {\n    \"type\": \"KDE\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"cumulative\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"counts\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"minsteps\",\n      \"type\": \"number\",\n      \"default\": 25\n    }, {\n      \"name\": \"maxsteps\",\n      \"type\": \"number\",\n      \"default\": 200\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"value\", \"density\"]\n    }]\n  };\n  inherits(KDE, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(source2, _.groupby, _.field), names = (_.groupby || []).map(accessorName), bandwidth2 = _.bandwidth, method2 = _.cumulative ? \"cdf\" : \"pdf\", as = _.as || [\"value\", \"density\"], values2 = [];\n        let domain2 = _.extent, minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n        if (method2 !== \"pdf\" && method2 !== \"cdf\") {\n          error(\"Invalid density method: \" + method2);\n        }\n        if (_.resolve === \"shared\") {\n          if (!domain2) domain2 = extent(source2, _.field);\n          minsteps = maxsteps = _.steps || maxsteps;\n        }\n        groups.forEach((g) => {\n          const density2 = kde(g, bandwidth2)[method2], scale2 = _.counts ? g.length : 1, local = domain2 || extent(g);\n          sampleCurve(density2, local, minsteps, maxsteps).forEach((v) => {\n            const t = {};\n            for (let i = 0; i < names.length; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = v[0];\n            t[as[1]] = v[1] * scale2;\n            values2.push(ingest$1(t));\n          });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  function Key$1(params2) {\n    Operator.call(this, null, update$2, params2);\n  }\n  inherits(Key$1, Operator);\n  function update$2(_) {\n    return this.value && !_.modified() ? this.value : key(_.fields, _.flat);\n  }\n  function Load$1(params2) {\n    Transform.call(this, [], params2);\n    this._pending = null;\n  }\n  inherits(Load$1, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow;\n      if (this._pending) {\n        return output(this, pulse2, this._pending);\n      }\n      if (stop(_)) return pulse2.StopPropagation;\n      if (_.values) {\n        return output(this, pulse2, df.parse(_.values, _.format));\n      } else if (_.async) {\n        const p = df.request(_.url, _.format).then((res) => {\n          this._pending = array$4(res.data);\n          return (df2) => df2.touch(this);\n        });\n        return {\n          async: p\n        };\n      } else {\n        return df.request(_.url, _.format).then((res) => output(this, pulse2, array$4(res.data)));\n      }\n    }\n  });\n  function stop(_) {\n    return _.modified(\"async\") && !(_.modified(\"values\") || _.modified(\"url\") || _.modified(\"format\"));\n  }\n  function output(op, pulse2, data2) {\n    data2.forEach(ingest$1);\n    const out = pulse2.fork(pulse2.NO_FIELDS & pulse2.NO_SOURCE);\n    out.rem = op.value;\n    op.value = out.source = out.add = data2;\n    op._pending = null;\n    if (out.rem.length) out.clean(true);\n    return out;\n  }\n  function Lookup(params2) {\n    Transform.call(this, {}, params2);\n  }\n  Lookup.Definition = {\n    \"type\": \"Lookup\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"index\",\n      \"type\": \"index\",\n      \"params\": [{\n        \"name\": \"from\",\n        \"type\": \"data\",\n        \"required\": true\n      }, {\n        \"name\": \"key\",\n        \"type\": \"field\",\n        \"required\": true\n      }]\n    }, {\n      \"name\": \"values\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }, {\n      \"name\": \"default\",\n      \"default\": null\n    }]\n  };\n  inherits(Lookup, Transform, {\n    transform(_, pulse2) {\n      const keys2 = _.fields, index2 = _.index, values2 = _.values, defaultValue = _.default == null ? null : _.default, reset2 = _.modified(), n = keys2.length;\n      let flag2 = reset2 ? pulse2.SOURCE : pulse2.ADD, out = pulse2, as = _.as, set2, m2, mods;\n      if (values2) {\n        m2 = values2.length;\n        if (n > 1 && !as) {\n          error('Multi-field lookup requires explicit \"as\" parameter.');\n        }\n        if (as && as.length !== n * m2) {\n          error('The \"as\" parameter has too few output field names.');\n        }\n        as = as || values2.map(accessorName);\n        set2 = function(t) {\n          for (var i = 0, k = 0, j, v; i < n; ++i) {\n            v = index2.get(keys2[i](t));\n            if (v == null) for (j = 0; j < m2; ++j, ++k) t[as[k]] = defaultValue;\n            else for (j = 0; j < m2; ++j, ++k) t[as[k]] = values2[j](v);\n          }\n        };\n      } else {\n        if (!as) {\n          error(\"Missing output field names.\");\n        }\n        set2 = function(t) {\n          for (var i = 0, v; i < n; ++i) {\n            v = index2.get(keys2[i](t));\n            t[as[i]] = v == null ? defaultValue : v;\n          }\n        };\n      }\n      if (reset2) {\n        out = pulse2.reflow(true);\n      } else {\n        mods = keys2.some((k) => pulse2.modified(k.fields));\n        flag2 |= mods ? pulse2.MOD : 0;\n      }\n      pulse2.visit(flag2, set2);\n      return out.modifies(as);\n    }\n  });\n  function MultiExtent$1(params2) {\n    Operator.call(this, null, update$1, params2);\n  }\n  inherits(MultiExtent$1, Operator);\n  function update$1(_) {\n    if (this.value && !_.modified()) {\n      return this.value;\n    }\n    const ext = _.extents, n = ext.length;\n    let min2 = Infinity, max2 = -Infinity, i, e;\n    for (i = 0; i < n; ++i) {\n      e = ext[i];\n      if (e[0] < min2) min2 = e[0];\n      if (e[1] > max2) max2 = e[1];\n    }\n    return [min2, max2];\n  }\n  function MultiValues$1(params2) {\n    Operator.call(this, null, update, params2);\n  }\n  inherits(MultiValues$1, Operator);\n  function update(_) {\n    return this.value && !_.modified() ? this.value : _.values.reduce((data2, _2) => data2.concat(_2), []);\n  }\n  function Params$2(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Params$2, Transform, {\n    transform(_, pulse2) {\n      this.modified(_.modified());\n      this.value = _;\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function Pivot(params2) {\n    Aggregate$1.call(this, params2);\n  }\n  Pivot.Definition = {\n    \"type\": \"Pivot\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"value\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"op\",\n      \"type\": \"enum\",\n      \"values\": ValidAggregateOps,\n      \"default\": \"sum\"\n    }, {\n      \"name\": \"limit\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(Pivot, Aggregate$1, {\n    _transform: Aggregate$1.prototype.transform,\n    transform(_, pulse2) {\n      return this._transform(aggregateParams(_, pulse2), pulse2);\n    }\n  });\n  function aggregateParams(_, pulse2) {\n    const key2 = _.field, value2 = _.value, op = (_.op === \"count\" ? \"__count__\" : _.op) || \"sum\", fields = accessorFields(key2).concat(accessorFields(value2)), keys2 = pivotKeys(key2, _.limit || 0, pulse2);\n    if (pulse2.changed()) _.set(\"__pivot__\", null, null, true);\n    return {\n      key: _.key,\n      groupby: _.groupby,\n      ops: keys2.map(() => op),\n      fields: keys2.map((k) => get$4(k, key2, value2, fields)),\n      as: keys2.map((k) => k + \"\"),\n      modified: _.modified.bind(_)\n    };\n  }\n  function get$4(k, key2, value2, fields) {\n    return accessor((d2) => key2(d2) === k ? value2(d2) : NaN, fields, k + \"\");\n  }\n  function pivotKeys(key2, limit, pulse2) {\n    const map2 = {}, list = [];\n    pulse2.visit(pulse2.SOURCE, (t) => {\n      const k = key2(t);\n      if (!map2[k]) {\n        map2[k] = 1;\n        list.push(k);\n      }\n    });\n    list.sort(ascending$1);\n    return limit ? list.slice(0, limit) : list;\n  }\n  function PreFacet$1(params2) {\n    Facet$1.call(this, params2);\n  }\n  inherits(PreFacet$1, Facet$1, {\n    transform(_, pulse2) {\n      const flow = _.subflow, field2 = _.field, subflow = (t) => this.subflow(tupleid(t), flow, pulse2, t);\n      if (_.modified(\"field\") || field2 && pulse2.modified(accessorFields(field2))) {\n        error(\"PreFacet does not support field modification.\");\n      }\n      this.initTargets();\n      if (field2) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.mod(_2));\n        });\n        pulse2.visit(pulse2.ADD, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.add(ingest$1(_2)));\n        });\n        pulse2.visit(pulse2.REM, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.rem(_2));\n        });\n      } else {\n        pulse2.visit(pulse2.MOD, (t) => subflow(t).mod(t));\n        pulse2.visit(pulse2.ADD, (t) => subflow(t).add(t));\n        pulse2.visit(pulse2.REM, (t) => subflow(t).rem(t));\n      }\n      if (pulse2.clean()) {\n        pulse2.runAfter(() => this.clean());\n      }\n      return pulse2;\n    }\n  });\n  function Project(params2) {\n    Transform.call(this, null, params2);\n  }\n  Project.Definition = {\n    \"type\": \"Project\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }]\n  };\n  inherits(Project, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, as = fieldNames(_.fields, _.as || []), derive2 = fields ? (s2, t) => project(s2, t, fields, as) : rederive;\n      let lut;\n      if (this.value) {\n        lut = this.value;\n      } else {\n        pulse2 = pulse2.addAll();\n        lut = this.value = {};\n      }\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t);\n        out.rem.push(lut[id2]);\n        lut[id2] = null;\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        const dt = derive2(t, ingest$1({}));\n        lut[tupleid(t)] = dt;\n        out.add.push(dt);\n      });\n      pulse2.visit(pulse2.MOD, (t) => {\n        out.mod.push(derive2(t, lut[tupleid(t)]));\n      });\n      return out;\n    }\n  });\n  function project(s2, t, fields, as) {\n    for (let i = 0, n = fields.length; i < n; ++i) {\n      t[as[i]] = fields[i](s2);\n    }\n    return t;\n  }\n  function Proxy$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Proxy$1, Transform, {\n    transform(_, pulse2) {\n      this.value = _.value;\n      return _.modified(\"value\") ? pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS) : pulse2.StopPropagation;\n    }\n  });\n  function Quantile$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Quantile$1.Definition = {\n    \"type\": \"Quantile\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"probs\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 0.01\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"prob\", \"value\"]\n    }]\n  };\n  const EPSILON$2 = 1e-14;\n  inherits(Quantile$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), as = _.as || [\"prob\", \"value\"];\n      if (this.value && !_.modified() && !pulse2.changed()) {\n        out.source = this.value;\n        return out;\n      }\n      const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(source2, _.groupby, _.field), names = (_.groupby || []).map(accessorName), values2 = [], step = _.step || 0.01, p = _.probs || range$3(step / 2, 1 - EPSILON$2, step), n = p.length;\n      groups.forEach((g) => {\n        const q = quantiles(g, p);\n        for (let i = 0; i < n; ++i) {\n          const t = {};\n          for (let i2 = 0; i2 < names.length; ++i2) {\n            t[names[i2]] = g.dims[i2];\n          }\n          t[as[0]] = p[i];\n          t[as[1]] = q[i];\n          values2.push(ingest$1(t));\n        }\n      });\n      if (this.value) out.rem = this.value;\n      this.value = out.add = out.source = values2;\n      return out;\n    }\n  });\n  function Relay$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Relay$1, Transform, {\n    transform(_, pulse2) {\n      let out, lut;\n      if (this.value) {\n        lut = this.value;\n      } else {\n        out = pulse2 = pulse2.addAll();\n        lut = this.value = {};\n      }\n      if (_.derive) {\n        out = pulse2.fork(pulse2.NO_SOURCE);\n        pulse2.visit(pulse2.REM, (t) => {\n          const id2 = tupleid(t);\n          out.rem.push(lut[id2]);\n          lut[id2] = null;\n        });\n        pulse2.visit(pulse2.ADD, (t) => {\n          const dt = derive(t);\n          lut[tupleid(t)] = dt;\n          out.add.push(dt);\n        });\n        pulse2.visit(pulse2.MOD, (t) => {\n          const dt = lut[tupleid(t)];\n          for (const k in t) {\n            dt[k] = t[k];\n            out.modifies(k);\n          }\n          out.mod.push(dt);\n        });\n      }\n      return out;\n    }\n  });\n  function Sample(params2) {\n    Transform.call(this, [], params2);\n    this.count = 0;\n  }\n  Sample.Definition = {\n    \"type\": \"Sample\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"default\": 1e3\n    }]\n  };\n  inherits(Sample, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), mod = _.modified(\"size\"), num = _.size, map2 = this.value.reduce((m2, t) => (m2[tupleid(t)] = 1, m2), {});\n      let res = this.value, cnt = this.count, cap = 0;\n      function update2(t) {\n        let p, idx;\n        if (res.length < num) {\n          res.push(t);\n        } else {\n          idx = ~~((cnt + 1) * random());\n          if (idx < res.length && idx >= cap) {\n            p = res[idx];\n            if (map2[tupleid(p)]) out.rem.push(p);\n            res[idx] = t;\n          }\n        }\n        ++cnt;\n      }\n      if (pulse2.rem.length) {\n        pulse2.visit(pulse2.REM, (t) => {\n          const id2 = tupleid(t);\n          if (map2[id2]) {\n            map2[id2] = -1;\n            out.rem.push(t);\n          }\n          --cnt;\n        });\n        res = res.filter((t) => map2[tupleid(t)] !== -1);\n      }\n      if ((pulse2.rem.length || mod) && res.length < num && pulse2.source) {\n        cap = cnt = res.length;\n        pulse2.visit(pulse2.SOURCE, (t) => {\n          if (!map2[tupleid(t)]) update2(t);\n        });\n        cap = -1;\n      }\n      if (mod && res.length > num) {\n        const n = res.length - num;\n        for (let i = 0; i < n; ++i) {\n          map2[tupleid(res[i])] = -1;\n          out.rem.push(res[i]);\n        }\n        res = res.slice(n);\n      }\n      if (pulse2.mod.length) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          if (map2[tupleid(t)]) out.mod.push(t);\n        });\n      }\n      if (pulse2.add.length) {\n        pulse2.visit(pulse2.ADD, update2);\n      }\n      if (pulse2.add.length || cap < 0) {\n        out.add = res.filter((t) => !map2[tupleid(t)]);\n      }\n      this.count = cnt;\n      this.value = out.source = res;\n      return out;\n    }\n  });\n  function Sequence(params2) {\n    Transform.call(this, null, params2);\n  }\n  Sequence.Definition = {\n    \"type\": \"Sequence\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"start\",\n      \"type\": \"number\",\n      \"required\": true\n    }, {\n      \"name\": \"stop\",\n      \"type\": \"number\",\n      \"required\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"data\"\n    }]\n  };\n  inherits(Sequence, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !_.modified()) return;\n      const out = pulse2.materialize().fork(pulse2.MOD), as = _.as || \"data\";\n      out.rem = this.value ? pulse2.rem.concat(this.value) : pulse2.rem;\n      this.value = range$3(_.start, _.stop, _.step || 1).map((v) => {\n        const t = {};\n        t[as] = v;\n        return ingest$1(t);\n      });\n      out.add = pulse2.add.concat(this.value);\n      return out;\n    }\n  });\n  function Sieve$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Sieve$1, Transform, {\n    transform(_, pulse2) {\n      this.value = pulse2.source;\n      return pulse2.changed() ? pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS) : pulse2.StopPropagation;\n    }\n  });\n  function TimeUnit(params2) {\n    Transform.call(this, null, params2);\n  }\n  const OUTPUT = [\"unit0\", \"unit1\"];\n  TimeUnit.Definition = {\n    \"type\": \"TimeUnit\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"interval\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"units\",\n      \"type\": \"enum\",\n      \"values\": TIME_UNITS,\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"maxbins\",\n      \"type\": \"number\",\n      \"default\": 40\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"date\",\n      \"array\": true\n    }, {\n      \"name\": \"timezone\",\n      \"type\": \"enum\",\n      \"default\": \"local\",\n      \"values\": [\"local\", \"utc\"]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": OUTPUT\n    }]\n  };\n  inherits(TimeUnit, Transform, {\n    transform(_, pulse2) {\n      const field2 = _.field, band2 = _.interval !== false, utc = _.timezone === \"utc\", floor2 = this._floor(_, pulse2), offset2 = (utc ? utcInterval : timeInterval)(floor2.unit).offset, as = _.as || OUTPUT, u0 = as[0], u1 = as[1], step = floor2.step;\n      let min2 = floor2.start || Infinity, max2 = floor2.stop || -Infinity, flag2 = pulse2.ADD;\n      if (_.modified() || pulse2.changed(pulse2.REM) || pulse2.modified(accessorFields(field2))) {\n        pulse2 = pulse2.reflow(true);\n        flag2 = pulse2.SOURCE;\n        min2 = Infinity;\n        max2 = -Infinity;\n      }\n      pulse2.visit(flag2, (t) => {\n        const v = field2(t);\n        let a2, b2;\n        if (v == null) {\n          t[u0] = null;\n          if (band2) t[u1] = null;\n        } else {\n          t[u0] = a2 = b2 = floor2(v);\n          if (band2) t[u1] = b2 = offset2(a2, step);\n          if (a2 < min2) min2 = a2;\n          if (b2 > max2) max2 = b2;\n        }\n      });\n      floor2.start = min2;\n      floor2.stop = max2;\n      return pulse2.modifies(band2 ? as : u0);\n    },\n    _floor(_, pulse2) {\n      const utc = _.timezone === \"utc\";\n      const {\n        units,\n        step\n      } = _.units ? {\n        units: _.units,\n        step: _.step || 1\n      } : bin$1({\n        extent: _.extent || extent(pulse2.materialize(pulse2.SOURCE).source, _.field),\n        maxbins: _.maxbins\n      });\n      const tunits = timeUnits(units), prev = this.value || {}, floor2 = (utc ? utcFloor : timeFloor)(tunits, step);\n      floor2.unit = peek$1(tunits);\n      floor2.units = tunits;\n      floor2.step = step;\n      floor2.start = prev.start;\n      floor2.stop = prev.stop;\n      return this.value = floor2;\n    }\n  });\n  function TupleIndex(params2) {\n    Transform.call(this, fastmap(), params2);\n  }\n  inherits(TupleIndex, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, field2 = _.field, index2 = this.value, set2 = (t) => index2.set(field2(t), t);\n      let mod = true;\n      if (_.modified(\"field\") || pulse2.modified(field2.fields)) {\n        index2.clear();\n        pulse2.visit(pulse2.SOURCE, set2);\n      } else if (pulse2.changed()) {\n        pulse2.visit(pulse2.REM, (t) => index2.delete(field2(t)));\n        pulse2.visit(pulse2.ADD, set2);\n      } else {\n        mod = false;\n      }\n      this.modified(mod);\n      if (index2.empty > df.cleanThreshold) df.runAfter(index2.clean);\n      return pulse2.fork();\n    }\n  });\n  function Values$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Values$1, Transform, {\n    transform(_, pulse2) {\n      const run2 = !this.value || _.modified(\"field\") || _.modified(\"sort\") || pulse2.changed() || _.sort && pulse2.modified(_.sort.fields);\n      if (run2) {\n        this.value = (_.sort ? pulse2.source.slice().sort(stableCompare(_.sort)) : pulse2.source).map(_.field);\n      }\n    }\n  });\n  function WindowOp(op, field2, param2, as) {\n    const fn2 = WindowOps[op](field2, param2);\n    return {\n      init: fn2.init || zero$1,\n      update: function(w2, t) {\n        t[as] = fn2.next(w2);\n      }\n    };\n  }\n  const WindowOps = {\n    row_number: function() {\n      return {\n        next: (w2) => w2.index + 1\n      };\n    },\n    rank: function() {\n      let rank2;\n      return {\n        init: () => rank2 = 1,\n        next: (w2) => {\n          const i = w2.index, data2 = w2.data;\n          return i && w2.compare(data2[i - 1], data2[i]) ? rank2 = i + 1 : rank2;\n        }\n      };\n    },\n    dense_rank: function() {\n      let drank;\n      return {\n        init: () => drank = 1,\n        next: (w2) => {\n          const i = w2.index, d2 = w2.data;\n          return i && w2.compare(d2[i - 1], d2[i]) ? ++drank : drank;\n        }\n      };\n    },\n    percent_rank: function() {\n      const rank2 = WindowOps.rank(), next = rank2.next;\n      return {\n        init: rank2.init,\n        next: (w2) => (next(w2) - 1) / (w2.data.length - 1)\n      };\n    },\n    cume_dist: function() {\n      let cume;\n      return {\n        init: () => cume = 0,\n        next: (w2) => {\n          const d2 = w2.data, c2 = w2.compare;\n          let i = w2.index;\n          if (cume < i) {\n            while (i + 1 < d2.length && !c2(d2[i], d2[i + 1])) ++i;\n            cume = i;\n          }\n          return (1 + cume) / d2.length;\n        }\n      };\n    },\n    ntile: function(field2, num) {\n      num = +num;\n      if (!(num > 0)) error(\"ntile num must be greater than zero.\");\n      const cume = WindowOps.cume_dist(), next = cume.next;\n      return {\n        init: cume.init,\n        next: (w2) => Math.ceil(num * next(w2))\n      };\n    },\n    lag: function(field2, offset2) {\n      offset2 = +offset2 || 1;\n      return {\n        next: (w2) => {\n          const i = w2.index - offset2;\n          return i >= 0 ? field2(w2.data[i]) : null;\n        }\n      };\n    },\n    lead: function(field2, offset2) {\n      offset2 = +offset2 || 1;\n      return {\n        next: (w2) => {\n          const i = w2.index + offset2, d2 = w2.data;\n          return i < d2.length ? field2(d2[i]) : null;\n        }\n      };\n    },\n    first_value: function(field2) {\n      return {\n        next: (w2) => field2(w2.data[w2.i0])\n      };\n    },\n    last_value: function(field2) {\n      return {\n        next: (w2) => field2(w2.data[w2.i1 - 1])\n      };\n    },\n    nth_value: function(field2, nth) {\n      nth = +nth;\n      if (!(nth > 0)) error(\"nth_value nth must be greater than zero.\");\n      return {\n        next: (w2) => {\n          const i = w2.i0 + (nth - 1);\n          return i < w2.i1 ? field2(w2.data[i]) : null;\n        }\n      };\n    },\n    prev_value: function(field2) {\n      let prev;\n      return {\n        init: () => prev = null,\n        next: (w2) => {\n          const v = field2(w2.data[w2.index]);\n          return v != null ? prev = v : prev;\n        }\n      };\n    },\n    next_value: function(field2) {\n      let v, i;\n      return {\n        init: () => (v = null, i = -1),\n        next: (w2) => {\n          const d2 = w2.data;\n          return w2.index <= i ? v : (i = find$2(field2, d2, w2.index)) < 0 ? (i = d2.length, v = null) : v = field2(d2[i]);\n        }\n      };\n    }\n  };\n  function find$2(field2, data2, index2) {\n    for (let n = data2.length; index2 < n; ++index2) {\n      const v = field2(data2[index2]);\n      if (v != null) return index2;\n    }\n    return -1;\n  }\n  const ValidWindowOps = Object.keys(WindowOps);\n  function WindowState(_) {\n    const ops2 = array$4(_.ops), fields = array$4(_.fields), params2 = array$4(_.params), aggregate_params = array$4(_.aggregate_params), as = array$4(_.as), outputs = this.outputs = [], windows = this.windows = [], inputs = {}, map2 = {}, counts = [], measures = [];\n    let countOnly = true;\n    function visitInputs(f) {\n      array$4(accessorFields(f)).forEach((_2) => inputs[_2] = 1);\n    }\n    visitInputs(_.sort);\n    ops2.forEach((op, i) => {\n      const field2 = fields[i], param2 = params2[i], aggregate_param = aggregate_params[i] || null, mname = accessorName(field2), name = measureName(op, mname, as[i]);\n      visitInputs(field2);\n      outputs.push(name);\n      if (has$1(WindowOps, op)) {\n        windows.push(WindowOp(op, field2, param2, name));\n      } else {\n        if (field2 == null && op !== \"count\") {\n          error(\"Null aggregate field specified.\");\n        }\n        if (op === \"count\") {\n          counts.push(name);\n          return;\n        }\n        countOnly = false;\n        let m2 = map2[mname];\n        if (!m2) {\n          m2 = map2[mname] = [];\n          m2.field = field2;\n          measures.push(m2);\n        }\n        m2.push(createMeasure(op, aggregate_param, name));\n      }\n    });\n    if (counts.length || measures.length) {\n      this.cell = cell(measures, counts, countOnly);\n    }\n    this.inputs = Object.keys(inputs);\n  }\n  const prototype = WindowState.prototype;\n  prototype.init = function() {\n    this.windows.forEach((_) => _.init());\n    if (this.cell) this.cell.init();\n  };\n  prototype.update = function(w2, t) {\n    const cell2 = this.cell, wind = this.windows, data2 = w2.data, m2 = wind && wind.length;\n    let j;\n    if (cell2) {\n      for (j = w2.p0; j < w2.i0; ++j) cell2.rem(data2[j]);\n      for (j = w2.p1; j < w2.i1; ++j) cell2.add(data2[j]);\n      cell2.set(t);\n    }\n    for (j = 0; j < m2; ++j) wind[j].update(w2, t);\n  };\n  function cell(measures, counts, countOnly) {\n    measures = measures.map((m2) => compileMeasures(m2, m2.field));\n    const cell2 = {\n      num: 0,\n      agg: null,\n      store: false,\n      count: counts\n    };\n    if (!countOnly) {\n      var n = measures.length, a2 = cell2.agg = Array(n), i = 0;\n      for (; i < n; ++i) a2[i] = new measures[i](cell2);\n    }\n    if (cell2.store) {\n      var store = cell2.data = new TupleStore();\n    }\n    cell2.add = function(t) {\n      cell2.num += 1;\n      if (countOnly) return;\n      if (store) store.add(t);\n      for (let i2 = 0; i2 < n; ++i2) {\n        a2[i2].add(a2[i2].get(t), t);\n      }\n    };\n    cell2.rem = function(t) {\n      cell2.num -= 1;\n      if (countOnly) return;\n      if (store) store.rem(t);\n      for (let i2 = 0; i2 < n; ++i2) {\n        a2[i2].rem(a2[i2].get(t), t);\n      }\n    };\n    cell2.set = function(t) {\n      let i2, n2;\n      if (store) store.values();\n      for (i2 = 0, n2 = counts.length; i2 < n2; ++i2) t[counts[i2]] = cell2.num;\n      if (!countOnly) for (i2 = 0, n2 = a2.length; i2 < n2; ++i2) a2[i2].set(t);\n    };\n    cell2.init = function() {\n      cell2.num = 0;\n      if (store) store.reset();\n      for (let i2 = 0; i2 < n; ++i2) a2[i2].init();\n    };\n    return cell2;\n  }\n  function Window(params2) {\n    Transform.call(this, {}, params2);\n    this._mlen = 0;\n    this._mods = [];\n  }\n  Window.Definition = {\n    \"type\": \"Window\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidWindowOps.concat(ValidAggregateOps)\n    }, {\n      \"name\": \"params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"aggregate_params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"frame\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [null, 0]\n    }, {\n      \"name\": \"ignorePeers\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }]\n  };\n  inherits(Window, Transform, {\n    transform(_, pulse2) {\n      this.stamp = pulse2.stamp;\n      const mod = _.modified(), cmp = stableCompare(_.sort), key2 = groupkey(_.groupby), group2 = (t) => this.group(key2(t));\n      let state = this.state;\n      if (!state || mod) {\n        state = this.state = new WindowState(_);\n      }\n      if (mod || pulse2.modified(state.inputs)) {\n        this.value = {};\n        pulse2.visit(pulse2.SOURCE, (t) => group2(t).add(t));\n      } else {\n        pulse2.visit(pulse2.REM, (t) => group2(t).remove(t));\n        pulse2.visit(pulse2.ADD, (t) => group2(t).add(t));\n      }\n      for (let i = 0, n = this._mlen; i < n; ++i) {\n        processPartition(this._mods[i], state, cmp, _);\n      }\n      this._mlen = 0;\n      this._mods = [];\n      return pulse2.reflow(mod).modifies(state.outputs);\n    },\n    group(key2) {\n      let group2 = this.value[key2];\n      if (!group2) {\n        group2 = this.value[key2] = SortedList(tupleid);\n        group2.stamp = -1;\n      }\n      if (group2.stamp < this.stamp) {\n        group2.stamp = this.stamp;\n        this._mods[this._mlen++] = group2;\n      }\n      return group2;\n    }\n  });\n  function processPartition(list, state, cmp, _) {\n    const sort2 = _.sort, range2 = sort2 && !_.ignorePeers, frame2 = _.frame || [null, 0], data2 = list.data(cmp), n = data2.length, b2 = range2 ? bisector(sort2) : null, w2 = {\n      i0: 0,\n      i1: 0,\n      p0: 0,\n      p1: 0,\n      index: 0,\n      data: data2,\n      compare: sort2 || constant$4(-1)\n    };\n    state.init();\n    for (let i = 0; i < n; ++i) {\n      setWindow(w2, frame2, i, n);\n      if (range2) adjustRange(w2, b2);\n      state.update(w2, data2[i]);\n    }\n  }\n  function setWindow(w2, f, i, n) {\n    w2.p0 = w2.i0;\n    w2.p1 = w2.i1;\n    w2.i0 = f[0] == null ? 0 : Math.max(0, i - Math.abs(f[0]));\n    w2.i1 = f[1] == null ? n : Math.min(n, i + Math.abs(f[1]) + 1);\n    w2.index = i;\n  }\n  function adjustRange(w2, bisect2) {\n    const r0 = w2.i0, r1 = w2.i1 - 1, c2 = w2.compare, d2 = w2.data, n = d2.length - 1;\n    if (r0 > 0 && !c2(d2[r0], d2[r0 - 1])) w2.i0 = bisect2.left(d2, d2[r0]);\n    if (r1 < n && !c2(d2[r1], d2[r1 + 1])) w2.i1 = bisect2.right(d2, d2[r1]);\n  }\n  const tx = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    aggregate: Aggregate$1,\n    bin: Bin,\n    collect: Collect$1,\n    compare: Compare$1,\n    countpattern: CountPattern,\n    cross: Cross,\n    density: Density,\n    dotbin: DotBin,\n    expression: Expression$1,\n    extent: Extent,\n    facet: Facet$1,\n    field: Field$1,\n    filter: Filter,\n    flatten: Flatten,\n    fold: Fold,\n    formula: Formula,\n    generate: Generate,\n    impute: Impute,\n    joinaggregate: JoinAggregate,\n    kde: KDE,\n    key: Key$1,\n    load: Load$1,\n    lookup: Lookup,\n    multiextent: MultiExtent$1,\n    multivalues: MultiValues$1,\n    params: Params$2,\n    pivot: Pivot,\n    prefacet: PreFacet$1,\n    project: Project,\n    proxy: Proxy$1,\n    quantile: Quantile$1,\n    relay: Relay$1,\n    sample: Sample,\n    sequence: Sequence,\n    sieve: Sieve$1,\n    subflow: Subflow,\n    timeunit: TimeUnit,\n    tupleindex: TupleIndex,\n    values: Values$1,\n    window: Window\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function constant$2(x2) {\n    return function constant2() {\n      return x2;\n    };\n  }\n  const abs$2 = Math.abs;\n  const atan2$1 = Math.atan2;\n  const cos$2 = Math.cos;\n  const max$1 = Math.max;\n  const min$1 = Math.min;\n  const sin$2 = Math.sin;\n  const sqrt$2 = Math.sqrt;\n  const epsilon$5 = 1e-12;\n  const pi$3 = Math.PI;\n  const halfPi$2 = pi$3 / 2;\n  const tau$3 = 2 * pi$3;\n  function acos$1(x2) {\n    return x2 > 1 ? 0 : x2 < -1 ? pi$3 : Math.acos(x2);\n  }\n  function asin$2(x2) {\n    return x2 >= 1 ? halfPi$2 : x2 <= -1 ? -halfPi$2 : Math.asin(x2);\n  }\n  const pi$2 = Math.PI, tau$2 = 2 * pi$2, epsilon$4 = 1e-6, tauEpsilon = tau$2 - epsilon$4;\n  function append$1(strings2) {\n    this._ += strings2[0];\n    for (let i = 1, n = strings2.length; i < n; ++i) {\n      this._ += arguments[i] + strings2[i];\n    }\n  }\n  function appendRound$1(digits) {\n    let d2 = Math.floor(digits);\n    if (!(d2 >= 0)) throw new Error(`invalid digits: ${digits}`);\n    if (d2 > 15) return append$1;\n    const k = 10 ** d2;\n    return function(strings2) {\n      this._ += strings2[0];\n      for (let i = 1, n = strings2.length; i < n; ++i) {\n        this._ += Math.round(arguments[i] * k) / k + strings2[i];\n      }\n    };\n  }\n  let Path$1 = class Path {\n    constructor(digits) {\n      this._x0 = this._y0 = // start of current subpath\n      this._x1 = this._y1 = null;\n      this._ = \"\";\n      this._append = digits == null ? append$1 : appendRound$1(digits);\n    }\n    moveTo(x2, y2) {\n      this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;\n    }\n    closePath() {\n      if (this._x1 !== null) {\n        this._x1 = this._x0, this._y1 = this._y0;\n        this._append`Z`;\n      }\n    }\n    lineTo(x2, y2) {\n      this._append`L${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    quadraticCurveTo(x12, y12, x2, y2) {\n      this._append`Q${+x12},${+y12},${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    bezierCurveTo(x12, y12, x2, y2, x3, y3) {\n      this._append`C${+x12},${+y12},${+x2},${+y2},${this._x1 = +x3},${this._y1 = +y3}`;\n    }\n    arcTo(x12, y12, x2, y2, r) {\n      x12 = +x12, y12 = +y12, x2 = +x2, y2 = +y2, r = +r;\n      if (r < 0) throw new Error(`negative radius: ${r}`);\n      let x02 = this._x1, y02 = this._y1, x21 = x2 - x12, y21 = y2 - y12, x01 = x02 - x12, y01 = y02 - y12, l01_2 = x01 * x01 + y01 * y01;\n      if (this._x1 === null) {\n        this._append`M${this._x1 = x12},${this._y1 = y12}`;\n      } else if (!(l01_2 > epsilon$4)) ;\n      else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$4) || !r) {\n        this._append`L${this._x1 = x12},${this._y1 = y12}`;\n      } else {\n        let x20 = x2 - x02, y20 = y2 - y02, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;\n        if (Math.abs(t01 - 1) > epsilon$4) {\n          this._append`L${x12 + t01 * x01},${y12 + t01 * y01}`;\n        }\n        this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x12 + t21 * x21},${this._y1 = y12 + t21 * y21}`;\n      }\n    }\n    arc(x2, y2, r, a0, a1, ccw) {\n      x2 = +x2, y2 = +y2, r = +r, ccw = !!ccw;\n      if (r < 0) throw new Error(`negative radius: ${r}`);\n      let dx = r * Math.cos(a0), dy = r * Math.sin(a0), x02 = x2 + dx, y02 = y2 + dy, cw2 = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;\n      if (this._x1 === null) {\n        this._append`M${x02},${y02}`;\n      } else if (Math.abs(this._x1 - x02) > epsilon$4 || Math.abs(this._y1 - y02) > epsilon$4) {\n        this._append`L${x02},${y02}`;\n      }\n      if (!r) return;\n      if (da < 0) da = da % tau$2 + tau$2;\n      if (da > tauEpsilon) {\n        this._append`A${r},${r},0,1,${cw2},${x2 - dx},${y2 - dy}A${r},${r},0,1,${cw2},${this._x1 = x02},${this._y1 = y02}`;\n      } else if (da > epsilon$4) {\n        this._append`A${r},${r},0,${+(da >= pi$2)},${cw2},${this._x1 = x2 + r * Math.cos(a1)},${this._y1 = y2 + r * Math.sin(a1)}`;\n      }\n    }\n    rect(x2, y2, w2, h2) {\n      this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${w2 = +w2}v${+h2}h${-w2}Z`;\n    }\n    toString() {\n      return this._;\n    }\n  };\n  function path$3() {\n    return new Path$1();\n  }\n  path$3.prototype = Path$1.prototype;\n  function withPath(shape2) {\n    let digits = 3;\n    shape2.digits = function(_) {\n      if (!arguments.length) return digits;\n      if (_ == null) {\n        digits = null;\n      } else {\n        const d2 = Math.floor(_);\n        if (!(d2 >= 0)) throw new RangeError(`invalid digits: ${_}`);\n        digits = d2;\n      }\n      return shape2;\n    };\n    return () => new Path$1(digits);\n  }\n  function arcInnerRadius(d2) {\n    return d2.innerRadius;\n  }\n  function arcOuterRadius(d2) {\n    return d2.outerRadius;\n  }\n  function arcStartAngle(d2) {\n    return d2.startAngle;\n  }\n  function arcEndAngle(d2) {\n    return d2.endAngle;\n  }\n  function arcPadAngle(d2) {\n    return d2 && d2.padAngle;\n  }\n  function intersect$3(x02, y02, x12, y12, x2, y2, x3, y3) {\n    var x10 = x12 - x02, y10 = y12 - y02, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10;\n    if (t * t < epsilon$5) return;\n    t = (x32 * (y02 - y2) - y32 * (x02 - x2)) / t;\n    return [x02 + t * x10, y02 + t * y10];\n  }\n  function cornerTangents(x02, y02, x12, y12, r1, rc, cw2) {\n    var x01 = x02 - x12, y01 = y02 - y12, lo = (cw2 ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x02 + ox, y11 = y02 + oy, x10 = x12 + ox, y10 = y12 + oy, x002 = (x11 + x10) / 2, y002 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D2 = x11 * y10 - x10 * y11, d3 = (dy < 0 ? -1 : 1) * sqrt$2(max$1(0, r * r * d2 - D2 * D2)), cx0 = (D2 * dy - dx * d3) / d2, cy0 = (-D2 * dx - dy * d3) / d2, cx1 = (D2 * dy + dx * d3) / d2, cy1 = (-D2 * dx + dy * d3) / d2, dx0 = cx0 - x002, dy0 = cy0 - y002, dx1 = cx1 - x002, dy1 = cy1 - y002;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return {\n      cx: cx0,\n      cy: cy0,\n      x01: -ox,\n      y01: -oy,\n      x11: cx0 * (r1 / r - 1),\n      y11: cy0 * (r1 / r - 1)\n    };\n  }\n  function arc$2$1() {\n    var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant$2(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context2 = null, path2 = withPath(arc2);\n    function arc2() {\n      var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi$2, a1 = endAngle.apply(this, arguments) - halfPi$2, da = abs$2(a1 - a0), cw2 = a1 > a0;\n      if (!context2) context2 = buffer = path2();\n      if (r1 < r0) r = r1, r1 = r0, r0 = r;\n      if (!(r1 > epsilon$5)) context2.moveTo(0, 0);\n      else if (da > tau$3 - epsilon$5) {\n        context2.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));\n        context2.arc(0, 0, r1, a0, a1, !cw2);\n        if (r0 > epsilon$5) {\n          context2.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));\n          context2.arc(0, 0, r0, a1, a0, cw2);\n        }\n      } else {\n        var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > epsilon$5 && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)), rc = min$1(abs$2(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t02, t12;\n        if (rp > epsilon$5) {\n          var p02 = asin$2(rp / r0 * sin$2(ap)), p1 = asin$2(rp / r1 * sin$2(ap));\n          if ((da0 -= p02 * 2) > epsilon$5) p02 *= cw2 ? 1 : -1, a00 += p02, a10 -= p02;\n          else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n          if ((da1 -= p1 * 2) > epsilon$5) p1 *= cw2 ? 1 : -1, a01 += p1, a11 -= p1;\n          else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n        }\n        var x01 = r1 * cos$2(a01), y01 = r1 * sin$2(a01), x10 = r0 * cos$2(a10), y10 = r0 * sin$2(a10);\n        if (rc > epsilon$5) {\n          var x11 = r1 * cos$2(a11), y11 = r1 * sin$2(a11), x002 = r0 * cos$2(a00), y002 = r0 * sin$2(a00), oc;\n          if (da < pi$3) {\n            if (oc = intersect$3(x01, y01, x002, y002, x11, y11, x10, y10)) {\n              var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2), lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);\n              rc0 = min$1(rc, (r0 - lc) / (kc - 1));\n              rc1 = min$1(rc, (r1 - lc) / (kc + 1));\n            } else {\n              rc0 = rc1 = 0;\n            }\n          }\n        }\n        if (!(da1 > epsilon$5)) context2.moveTo(x01, y01);\n        else if (rc1 > epsilon$5) {\n          t02 = cornerTangents(x002, y002, x01, y01, r1, rc1, cw2);\n          t12 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw2);\n          context2.moveTo(t02.cx + t02.x01, t02.cy + t02.y01);\n          if (rc1 < rc) context2.arc(t02.cx, t02.cy, rc1, atan2$1(t02.y01, t02.x01), atan2$1(t12.y01, t12.x01), !cw2);\n          else {\n            context2.arc(t02.cx, t02.cy, rc1, atan2$1(t02.y01, t02.x01), atan2$1(t02.y11, t02.x11), !cw2);\n            context2.arc(0, 0, r1, atan2$1(t02.cy + t02.y11, t02.cx + t02.x11), atan2$1(t12.cy + t12.y11, t12.cx + t12.x11), !cw2);\n            context2.arc(t12.cx, t12.cy, rc1, atan2$1(t12.y11, t12.x11), atan2$1(t12.y01, t12.x01), !cw2);\n          }\n        } else context2.moveTo(x01, y01), context2.arc(0, 0, r1, a01, a11, !cw2);\n        if (!(r0 > epsilon$5) || !(da0 > epsilon$5)) context2.lineTo(x10, y10);\n        else if (rc0 > epsilon$5) {\n          t02 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw2);\n          t12 = cornerTangents(x01, y01, x002, y002, r0, -rc0, cw2);\n          context2.lineTo(t02.cx + t02.x01, t02.cy + t02.y01);\n          if (rc0 < rc) context2.arc(t02.cx, t02.cy, rc0, atan2$1(t02.y01, t02.x01), atan2$1(t12.y01, t12.x01), !cw2);\n          else {\n            context2.arc(t02.cx, t02.cy, rc0, atan2$1(t02.y01, t02.x01), atan2$1(t02.y11, t02.x11), !cw2);\n            context2.arc(0, 0, r0, atan2$1(t02.cy + t02.y11, t02.cx + t02.x11), atan2$1(t12.cy + t12.y11, t12.cx + t12.x11), cw2);\n            context2.arc(t12.cx, t12.cy, rc0, atan2$1(t12.y11, t12.x11), atan2$1(t12.y01, t12.x01), !cw2);\n          }\n        } else context2.arc(0, 0, r0, a10, a00, cw2);\n      }\n      context2.closePath();\n      if (buffer) return context2 = null, buffer + \"\" || null;\n    }\n    arc2.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a2 = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$3 / 2;\n      return [cos$2(a2) * r, sin$2(a2) * r];\n    };\n    arc2.innerRadius = function(_) {\n      return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : innerRadius;\n    };\n    arc2.outerRadius = function(_) {\n      return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : outerRadius;\n    };\n    arc2.cornerRadius = function(_) {\n      return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : cornerRadius;\n    };\n    arc2.padRadius = function(_) {\n      return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant$2(+_), arc2) : padRadius;\n    };\n    arc2.startAngle = function(_) {\n      return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : startAngle;\n    };\n    arc2.endAngle = function(_) {\n      return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : endAngle;\n    };\n    arc2.padAngle = function(_) {\n      return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : padAngle;\n    };\n    arc2.context = function(_) {\n      return arguments.length ? (context2 = _ == null ? null : _, arc2) : context2;\n    };\n    return arc2;\n  }\n  function array$3(x2) {\n    return typeof x2 === \"object\" && \"length\" in x2 ? x2 : Array.from(x2);\n  }\n  function Linear$1(context2) {\n    this._context = context2;\n  }\n  Linear$1.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n        // falls through\n        default:\n          this._context.lineTo(x2, y2);\n          break;\n      }\n    }\n  };\n  function curveLinear(context2) {\n    return new Linear$1(context2);\n  }\n  function x$3(p) {\n    return p[0];\n  }\n  function y$3(p) {\n    return p[1];\n  }\n  function line$2$1(x2, y2) {\n    var defined = constant$2(true), context2 = null, curve2 = curveLinear, output2 = null, path2 = withPath(line2);\n    x2 = typeof x2 === \"function\" ? x2 : x2 === void 0 ? x$3 : constant$2(x2);\n    y2 = typeof y2 === \"function\" ? y2 : y2 === void 0 ? y$3 : constant$2(y2);\n    function line2(data2) {\n      var i, n = (data2 = array$3(data2)).length, d2, defined0 = false, buffer;\n      if (context2 == null) output2 = curve2(buffer = path2());\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d2 = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) output2.lineStart();\n          else output2.lineEnd();\n        }\n        if (defined0) output2.point(+x2(d2, i, data2), +y2(d2, i, data2));\n      }\n      if (buffer) return output2 = null, buffer + \"\" || null;\n    }\n    line2.x = function(_) {\n      return arguments.length ? (x2 = typeof _ === \"function\" ? _ : constant$2(+_), line2) : x2;\n    };\n    line2.y = function(_) {\n      return arguments.length ? (y2 = typeof _ === \"function\" ? _ : constant$2(+_), line2) : y2;\n    };\n    line2.defined = function(_) {\n      return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant$2(!!_), line2) : defined;\n    };\n    line2.curve = function(_) {\n      return arguments.length ? (curve2 = _, context2 != null && (output2 = curve2(context2)), line2) : curve2;\n    };\n    line2.context = function(_) {\n      return arguments.length ? (_ == null ? context2 = output2 = null : output2 = curve2(context2 = _), line2) : context2;\n    };\n    return line2;\n  }\n  function area$2$1(x02, y02, y12) {\n    var x12 = null, defined = constant$2(true), context2 = null, curve2 = curveLinear, output2 = null, path2 = withPath(area2);\n    x02 = typeof x02 === \"function\" ? x02 : x02 === void 0 ? x$3 : constant$2(+x02);\n    y02 = typeof y02 === \"function\" ? y02 : y02 === void 0 ? constant$2(0) : constant$2(+y02);\n    y12 = typeof y12 === \"function\" ? y12 : y12 === void 0 ? y$3 : constant$2(+y12);\n    function area2(data2) {\n      var i, j, k, n = (data2 = array$3(data2)).length, d2, defined0 = false, buffer, x0z = new Array(n), y0z = new Array(n);\n      if (context2 == null) output2 = curve2(buffer = path2());\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d2 = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) {\n            j = i;\n            output2.areaStart();\n            output2.lineStart();\n          } else {\n            output2.lineEnd();\n            output2.lineStart();\n            for (k = i - 1; k >= j; --k) {\n              output2.point(x0z[k], y0z[k]);\n            }\n            output2.lineEnd();\n            output2.areaEnd();\n          }\n        }\n        if (defined0) {\n          x0z[i] = +x02(d2, i, data2), y0z[i] = +y02(d2, i, data2);\n          output2.point(x12 ? +x12(d2, i, data2) : x0z[i], y12 ? +y12(d2, i, data2) : y0z[i]);\n        }\n      }\n      if (buffer) return output2 = null, buffer + \"\" || null;\n    }\n    function arealine() {\n      return line$2$1().defined(defined).curve(curve2).context(context2);\n    }\n    area2.x = function(_) {\n      return arguments.length ? (x02 = typeof _ === \"function\" ? _ : constant$2(+_), x12 = null, area2) : x02;\n    };\n    area2.x0 = function(_) {\n      return arguments.length ? (x02 = typeof _ === \"function\" ? _ : constant$2(+_), area2) : x02;\n    };\n    area2.x1 = function(_) {\n      return arguments.length ? (x12 = _ == null ? null : typeof _ === \"function\" ? _ : constant$2(+_), area2) : x12;\n    };\n    area2.y = function(_) {\n      return arguments.length ? (y02 = typeof _ === \"function\" ? _ : constant$2(+_), y12 = null, area2) : y02;\n    };\n    area2.y0 = function(_) {\n      return arguments.length ? (y02 = typeof _ === \"function\" ? _ : constant$2(+_), area2) : y02;\n    };\n    area2.y1 = function(_) {\n      return arguments.length ? (y12 = _ == null ? null : typeof _ === \"function\" ? _ : constant$2(+_), area2) : y12;\n    };\n    area2.lineX0 = area2.lineY0 = function() {\n      return arealine().x(x02).y(y02);\n    };\n    area2.lineY1 = function() {\n      return arealine().x(x02).y(y12);\n    };\n    area2.lineX1 = function() {\n      return arealine().x(x12).y(y02);\n    };\n    area2.defined = function(_) {\n      return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant$2(!!_), area2) : defined;\n    };\n    area2.curve = function(_) {\n      return arguments.length ? (curve2 = _, context2 != null && (output2 = curve2(context2)), area2) : curve2;\n    };\n    area2.context = function(_) {\n      return arguments.length ? (_ == null ? context2 = output2 = null : output2 = curve2(context2 = _), area2) : context2;\n    };\n    return area2;\n  }\n  const circle = {\n    draw(context2, size) {\n      const r = sqrt$2(size / pi$3);\n      context2.moveTo(r, 0);\n      context2.arc(0, 0, r, 0, tau$3);\n    }\n  };\n  function Symbol$1(type2, size) {\n    let context2 = null, path2 = withPath(symbol2);\n    type2 = typeof type2 === \"function\" ? type2 : constant$2(type2 || circle);\n    size = typeof size === \"function\" ? size : constant$2(size === void 0 ? 64 : +size);\n    function symbol2() {\n      let buffer;\n      if (!context2) context2 = buffer = path2();\n      type2.apply(this, arguments).draw(context2, +size.apply(this, arguments));\n      if (buffer) return context2 = null, buffer + \"\" || null;\n    }\n    symbol2.type = function(_) {\n      return arguments.length ? (type2 = typeof _ === \"function\" ? _ : constant$2(_), symbol2) : type2;\n    };\n    symbol2.size = function(_) {\n      return arguments.length ? (size = typeof _ === \"function\" ? _ : constant$2(+_), symbol2) : size;\n    };\n    symbol2.context = function(_) {\n      return arguments.length ? (context2 = _ == null ? null : _, symbol2) : context2;\n    };\n    return symbol2;\n  }\n  function noop$3() {\n  }\n  function point$5(that, x2, y2) {\n    that._context.bezierCurveTo(\n      (2 * that._x0 + that._x1) / 3,\n      (2 * that._y0 + that._y1) / 3,\n      (that._x0 + 2 * that._x1) / 3,\n      (that._y0 + 2 * that._y1) / 3,\n      (that._x0 + 4 * that._x1 + x2) / 6,\n      (that._y0 + 4 * that._y1 + y2) / 6\n    );\n  }\n  function Basis(context2) {\n    this._context = context2;\n  }\n  Basis.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 3:\n          point$5(this, this._x1, this._y1);\n        // falls through\n        case 2:\n          this._context.lineTo(this._x1, this._y1);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);\n        // falls through\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasis(context2) {\n    return new Basis(context2);\n  }\n  function BasisClosed(context2) {\n    this._context = context2;\n  }\n  BasisClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x2, this._y2);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n          this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x2, this._y2);\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x2 = x2, this._y2 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 2:\n          this._point = 3;\n          this._x4 = x2, this._y4 = y2;\n          this._context.moveTo((this._x0 + 4 * this._x1 + x2) / 6, (this._y0 + 4 * this._y1 + y2) / 6);\n          break;\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasisClosed(context2) {\n    return new BasisClosed(context2);\n  }\n  function BasisOpen(context2) {\n    this._context = context2;\n  }\n  BasisOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          var x02 = (this._x0 + 4 * this._x1 + x2) / 6, y02 = (this._y0 + 4 * this._y1 + y2) / 6;\n          this._line ? this._context.lineTo(x02, y02) : this._context.moveTo(x02, y02);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasisOpen(context2) {\n    return new BasisOpen(context2);\n  }\n  function Bundle(context2, beta) {\n    this._basis = new Basis(context2);\n    this._beta = beta;\n  }\n  Bundle.prototype = {\n    lineStart: function() {\n      this._x = [];\n      this._y = [];\n      this._basis.lineStart();\n    },\n    lineEnd: function() {\n      var x2 = this._x, y2 = this._y, j = x2.length - 1;\n      if (j > 0) {\n        var x02 = x2[0], y02 = y2[0], dx = x2[j] - x02, dy = y2[j] - y02, i = -1, t;\n        while (++i <= j) {\n          t = i / j;\n          this._basis.point(\n            this._beta * x2[i] + (1 - this._beta) * (x02 + t * dx),\n            this._beta * y2[i] + (1 - this._beta) * (y02 + t * dy)\n          );\n        }\n      }\n      this._x = this._y = null;\n      this._basis.lineEnd();\n    },\n    point: function(x2, y2) {\n      this._x.push(+x2);\n      this._y.push(+y2);\n    }\n  };\n  const curveBundle = (function custom2(beta) {\n    function bundle2(context2) {\n      return beta === 1 ? new Basis(context2) : new Bundle(context2, beta);\n    }\n    bundle2.beta = function(beta2) {\n      return custom2(+beta2);\n    };\n    return bundle2;\n  })(0.85);\n  function point$4(that, x2, y2) {\n    that._context.bezierCurveTo(\n      that._x1 + that._k * (that._x2 - that._x0),\n      that._y1 + that._k * (that._y2 - that._y0),\n      that._x2 + that._k * (that._x1 - x2),\n      that._y2 + that._k * (that._y1 - y2),\n      that._x2,\n      that._y2\n    );\n  }\n  function Cardinal(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  Cardinal.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x2, this._y2);\n          break;\n        case 3:\n          point$4(this, this._x1, this._y1);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          this._x1 = x2, this._y1 = y2;\n          break;\n        case 2:\n          this._point = 3;\n        // falls through\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinal = (function custom2(tension) {\n    function cardinal(context2) {\n      return new Cardinal(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function CardinalClosed(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  CardinalClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.lineTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._context.moveTo(this._x4 = x2, this._y4 = y2);\n          break;\n        case 2:\n          this._point = 3;\n          this._x5 = x2, this._y5 = y2;\n          break;\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinalClosed = (function custom2(tension) {\n    function cardinal(context2) {\n      return new CardinalClosed(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function CardinalOpen(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  CardinalOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinalOpen = (function custom2(tension) {\n    function cardinal(context2) {\n      return new CardinalOpen(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function point$3(that, x2, y2) {\n    var x12 = that._x1, y12 = that._y1, x22 = that._x2, y22 = that._y2;\n    if (that._l01_a > epsilon$5) {\n      var a2 = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n      x12 = (x12 * a2 - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n      y12 = (y12 * a2 - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n    }\n    if (that._l23_a > epsilon$5) {\n      var b2 = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m2 = 3 * that._l23_a * (that._l23_a + that._l12_a);\n      x22 = (x22 * b2 + that._x1 * that._l23_2a - x2 * that._l12_2a) / m2;\n      y22 = (y22 * b2 + that._y1 * that._l23_2a - y2 * that._l12_2a) / m2;\n    }\n    that._context.bezierCurveTo(x12, y12, x22, y22, that._x2, that._y2);\n  }\n  function CatmullRom(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRom.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x2, this._y2);\n          break;\n        case 3:\n          this.point(this._x2, this._y2);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n        // falls through\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRom = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRom(context2, alpha) : new Cardinal(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function CatmullRomClosed(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRomClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.lineTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._context.moveTo(this._x4 = x2, this._y4 = y2);\n          break;\n        case 2:\n          this._point = 3;\n          this._x5 = x2, this._y5 = y2;\n          break;\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRomClosed = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRomClosed(context2, alpha) : new CardinalClosed(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function CatmullRomOpen(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRomOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRomOpen = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRomOpen(context2, alpha) : new CardinalOpen(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function LinearClosed(context2) {\n    this._context = context2;\n  }\n  LinearClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._point) this._context.closePath();\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) this._context.lineTo(x2, y2);\n      else this._point = 1, this._context.moveTo(x2, y2);\n    }\n  };\n  function curveLinearClosed(context2) {\n    return new LinearClosed(context2);\n  }\n  function sign$1(x2) {\n    return x2 < 0 ? -1 : 1;\n  }\n  function slope3(that, x2, y2) {\n    var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);\n    return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n  }\n  function slope2(that, t) {\n    var h2 = that._x1 - that._x0;\n    return h2 ? (3 * (that._y1 - that._y0) / h2 - t) / 2 : t;\n  }\n  function point$2(that, t02, t12) {\n    var x02 = that._x0, y02 = that._y0, x12 = that._x1, y12 = that._y1, dx = (x12 - x02) / 3;\n    that._context.bezierCurveTo(x02 + dx, y02 + dx * t02, x12 - dx, y12 - dx * t12, x12, y12);\n  }\n  function MonotoneX(context2) {\n    this._context = context2;\n  }\n  MonotoneX.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x1, this._y1);\n          break;\n        case 3:\n          point$2(this, this._t0, slope2(this, this._t0));\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      var t12 = NaN;\n      x2 = +x2, y2 = +y2;\n      if (x2 === this._x1 && y2 === this._y1) return;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          point$2(this, slope2(this, t12 = slope3(this, x2, y2)), t12);\n          break;\n        default:\n          point$2(this, this._t0, t12 = slope3(this, x2, y2));\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n      this._t0 = t12;\n    }\n  };\n  function MonotoneY(context2) {\n    this._context = new ReflectContext(context2);\n  }\n  (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x2, y2) {\n    MonotoneX.prototype.point.call(this, y2, x2);\n  };\n  function ReflectContext(context2) {\n    this._context = context2;\n  }\n  ReflectContext.prototype = {\n    moveTo: function(x2, y2) {\n      this._context.moveTo(y2, x2);\n    },\n    closePath: function() {\n      this._context.closePath();\n    },\n    lineTo: function(x2, y2) {\n      this._context.lineTo(y2, x2);\n    },\n    bezierCurveTo: function(x12, y12, x2, y2, x3, y3) {\n      this._context.bezierCurveTo(y12, x12, y2, x2, y3, x3);\n    }\n  };\n  function monotoneX(context2) {\n    return new MonotoneX(context2);\n  }\n  function monotoneY(context2) {\n    return new MonotoneY(context2);\n  }\n  function Natural(context2) {\n    this._context = context2;\n  }\n  Natural.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x = [];\n      this._y = [];\n    },\n    lineEnd: function() {\n      var x2 = this._x, y2 = this._y, n = x2.length;\n      if (n) {\n        this._line ? this._context.lineTo(x2[0], y2[0]) : this._context.moveTo(x2[0], y2[0]);\n        if (n === 2) {\n          this._context.lineTo(x2[1], y2[1]);\n        } else {\n          var px2 = controlPoints(x2), py2 = controlPoints(y2);\n          for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n            this._context.bezierCurveTo(px2[0][i0], py2[0][i0], px2[1][i0], py2[1][i0], x2[i1], y2[i1]);\n          }\n        }\n      }\n      if (this._line || this._line !== 0 && n === 1) this._context.closePath();\n      this._line = 1 - this._line;\n      this._x = this._y = null;\n    },\n    point: function(x2, y2) {\n      this._x.push(+x2);\n      this._y.push(+y2);\n    }\n  };\n  function controlPoints(x2) {\n    var i, n = x2.length - 1, m2, a2 = new Array(n), b2 = new Array(n), r = new Array(n);\n    a2[0] = 0, b2[0] = 2, r[0] = x2[0] + 2 * x2[1];\n    for (i = 1; i < n - 1; ++i) a2[i] = 1, b2[i] = 4, r[i] = 4 * x2[i] + 2 * x2[i + 1];\n    a2[n - 1] = 2, b2[n - 1] = 7, r[n - 1] = 8 * x2[n - 1] + x2[n];\n    for (i = 1; i < n; ++i) m2 = a2[i] / b2[i - 1], b2[i] -= m2, r[i] -= m2 * r[i - 1];\n    a2[n - 1] = r[n - 1] / b2[n - 1];\n    for (i = n - 2; i >= 0; --i) a2[i] = (r[i] - a2[i + 1]) / b2[i];\n    b2[n - 1] = (x2[n] + a2[n - 1]) / 2;\n    for (i = 0; i < n - 1; ++i) b2[i] = 2 * x2[i + 1] - a2[i + 1];\n    return [a2, b2];\n  }\n  function curveNatural(context2) {\n    return new Natural(context2);\n  }\n  function Step(context2, t) {\n    this._context = context2;\n    this._t = t;\n  }\n  Step.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x = this._y = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n        // falls through\n        default: {\n          if (this._t <= 0) {\n            this._context.lineTo(this._x, y2);\n            this._context.lineTo(x2, y2);\n          } else {\n            var x12 = this._x * (1 - this._t) + x2 * this._t;\n            this._context.lineTo(x12, this._y);\n            this._context.lineTo(x12, y2);\n          }\n          break;\n        }\n      }\n      this._x = x2, this._y = y2;\n    }\n  };\n  function curveStep(context2) {\n    return new Step(context2, 0.5);\n  }\n  function stepBefore(context2) {\n    return new Step(context2, 0);\n  }\n  function stepAfter(context2) {\n    return new Step(context2, 1);\n  }\n  function domCanvas(w2, h2) {\n    if (typeof document !== \"undefined\" && document.createElement) {\n      const c2 = document.createElement(\"canvas\");\n      if (c2 && c2.getContext) {\n        c2.width = w2;\n        c2.height = h2;\n        return c2;\n      }\n    }\n    return null;\n  }\n  const domImage = () => typeof Image !== \"undefined\" ? Image : null;\n  function colors$1(specifier) {\n    var n = specifier.length / 6 | 0, colors2 = new Array(n), i = 0;\n    while (i < n) colors2[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n    return colors2;\n  }\n  const schemeCategory10 = colors$1(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n  const schemeAccent = colors$1(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n  const schemeDark2 = colors$1(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n  const schemeObservable10 = colors$1(\"4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0\");\n  const schemePaired = colors$1(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n  const schemePastel1 = colors$1(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n  const schemePastel2 = colors$1(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n  const schemeSet1 = colors$1(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n  const schemeSet2 = colors$1(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n  const schemeSet3 = colors$1(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n  function bandSpace(count2, paddingInner, paddingOuter) {\n    const space = count2 - paddingInner + paddingOuter * 2;\n    return count2 ? space > 0 ? space : 1 : 0;\n  }\n  const Identity = \"identity\";\n  const Linear = \"linear\";\n  const Log = \"log\";\n  const Pow = \"pow\";\n  const Sqrt = \"sqrt\";\n  const Symlog = \"symlog\";\n  const Time = \"time\";\n  const UTC = \"utc\";\n  const Sequential = \"sequential\";\n  const Diverging = \"diverging\";\n  const Quantile = \"quantile\";\n  const Quantize = \"quantize\";\n  const Threshold = \"threshold\";\n  const Ordinal = \"ordinal\";\n  const Point = \"point\";\n  const Band = \"band\";\n  const BinOrdinal = \"bin-ordinal\";\n  const Continuous = \"continuous\";\n  const Discrete$1 = \"discrete\";\n  const Discretizing = \"discretizing\";\n  const Interpolating = \"interpolating\";\n  const Temporal = \"temporal\";\n  function invertRange(scale2) {\n    return function(_) {\n      let lo = _[0], hi = _[1], t;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      return [scale2.invert(lo), scale2.invert(hi)];\n    };\n  }\n  function invertRangeExtent(scale2) {\n    return function(_) {\n      const range2 = scale2.range();\n      let lo = _[0], hi = _[1], min2 = -1, max2, t, i, n;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      for (i = 0, n = range2.length; i < n; ++i) {\n        if (range2[i] >= lo && range2[i] <= hi) {\n          if (min2 < 0) min2 = i;\n          max2 = i;\n        }\n      }\n      if (min2 < 0) return void 0;\n      lo = scale2.invertExtent(range2[min2]);\n      hi = scale2.invertExtent(range2[max2]);\n      return [lo[0] === void 0 ? lo[1] : lo[0], hi[1] === void 0 ? hi[0] : hi[1]];\n    };\n  }\n  function band() {\n    const scale2 = ordinal().unknown(void 0), domain2 = scale2.domain, ordinalRange = scale2.range;\n    let range$12 = [0, 1], step, bandwidth2, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5;\n    delete scale2.unknown;\n    function rescale() {\n      const n = domain2().length, reverse2 = range$12[1] < range$12[0], stop2 = range$12[1 - reverse2], space = bandSpace(n, paddingInner, paddingOuter);\n      let start = range$12[reverse2 - 0];\n      step = (stop2 - start) / (space || 1);\n      if (round) {\n        step = Math.floor(step);\n      }\n      start += (stop2 - start - step * (n - paddingInner)) * align;\n      bandwidth2 = step * (1 - paddingInner);\n      if (round) {\n        start = Math.round(start);\n        bandwidth2 = Math.round(bandwidth2);\n      }\n      const values2 = range$3(n).map((i) => start + step * i);\n      return ordinalRange(reverse2 ? values2.reverse() : values2);\n    }\n    scale2.domain = function(_) {\n      if (arguments.length) {\n        domain2(_);\n        return rescale();\n      } else {\n        return domain2();\n      }\n    };\n    scale2.range = function(_) {\n      if (arguments.length) {\n        range$12 = [+_[0], +_[1]];\n        return rescale();\n      } else {\n        return range$12.slice();\n      }\n    };\n    scale2.rangeRound = function(_) {\n      range$12 = [+_[0], +_[1]];\n      round = true;\n      return rescale();\n    };\n    scale2.bandwidth = function() {\n      return bandwidth2;\n    };\n    scale2.step = function() {\n      return step;\n    };\n    scale2.round = function(_) {\n      if (arguments.length) {\n        round = !!_;\n        return rescale();\n      } else {\n        return round;\n      }\n    };\n    scale2.padding = function(_) {\n      if (arguments.length) {\n        paddingOuter = Math.max(0, Math.min(1, _));\n        paddingInner = paddingOuter;\n        return rescale();\n      } else {\n        return paddingInner;\n      }\n    };\n    scale2.paddingInner = function(_) {\n      if (arguments.length) {\n        paddingInner = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return paddingInner;\n      }\n    };\n    scale2.paddingOuter = function(_) {\n      if (arguments.length) {\n        paddingOuter = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return paddingOuter;\n      }\n    };\n    scale2.align = function(_) {\n      if (arguments.length) {\n        align = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return align;\n      }\n    };\n    scale2.invertRange = function(_) {\n      if (_[0] == null || _[1] == null) return;\n      const reverse2 = range$12[1] < range$12[0], values2 = reverse2 ? ordinalRange().reverse() : ordinalRange(), n = values2.length - 1;\n      let lo = +_[0], hi = +_[1], a2, b2, t;\n      if (lo !== lo || hi !== hi) return;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      if (hi < values2[0] || lo > range$12[1 - reverse2]) return;\n      a2 = Math.max(0, bisectRight$1(values2, lo) - 1);\n      b2 = lo === hi ? a2 : bisectRight$1(values2, hi) - 1;\n      if (lo - values2[a2] > bandwidth2 + 1e-10) ++a2;\n      if (reverse2) {\n        t = a2;\n        a2 = n - b2;\n        b2 = n - t;\n      }\n      return a2 > b2 ? void 0 : domain2().slice(a2, b2 + 1);\n    };\n    scale2.invert = function(_) {\n      const value2 = scale2.invertRange([_, _]);\n      return value2 ? value2[0] : value2;\n    };\n    scale2.copy = function() {\n      return band().domain(domain2()).range(range$12).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n    };\n    return rescale();\n  }\n  function pointish(scale2) {\n    const copy2 = scale2.copy;\n    scale2.padding = scale2.paddingOuter;\n    delete scale2.paddingInner;\n    scale2.copy = function() {\n      return pointish(copy2());\n    };\n    return scale2;\n  }\n  function point$1() {\n    return pointish(band().paddingInner(1));\n  }\n  var map = Array.prototype.map;\n  function numbers(_) {\n    return map.call(_, toNumber);\n  }\n  const slice$1 = Array.prototype.slice;\n  function scaleBinOrdinal() {\n    let domain2 = [], range2 = [];\n    function scale2(x2) {\n      return x2 == null || x2 !== x2 ? void 0 : range2[(bisectRight$1(domain2, x2) - 1) % range2.length];\n    }\n    scale2.domain = function(_) {\n      if (arguments.length) {\n        domain2 = numbers(_);\n        return scale2;\n      } else {\n        return domain2.slice();\n      }\n    };\n    scale2.range = function(_) {\n      if (arguments.length) {\n        range2 = slice$1.call(_);\n        return scale2;\n      } else {\n        return range2.slice();\n      }\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      return tickFormat$1(domain2[0], peek$1(domain2), count2 == null ? 10 : count2, specifier);\n    };\n    scale2.copy = function() {\n      return scaleBinOrdinal().domain(scale2.domain()).range(scale2.range());\n    };\n    return scale2;\n  }\n  const scales = /* @__PURE__ */ new Map();\n  const VEGA_SCALE = Symbol(\"vega_scale\");\n  function registerScale(scale2) {\n    scale2[VEGA_SCALE] = true;\n    return scale2;\n  }\n  function isRegisteredScale(scale2) {\n    return scale2 && scale2[VEGA_SCALE] === true;\n  }\n  function create$2(type2, constructor, metadata2) {\n    const ctr = function scale2() {\n      const s2 = constructor();\n      if (!s2.invertRange) {\n        s2.invertRange = s2.invert ? invertRange(s2) : s2.invertExtent ? invertRangeExtent(s2) : void 0;\n      }\n      s2.type = type2;\n      return registerScale(s2);\n    };\n    ctr.metadata = toSet(array$4(metadata2));\n    return ctr;\n  }\n  function scale$4(type2, scale2, metadata2) {\n    if (arguments.length > 1) {\n      scales.set(type2, create$2(type2, scale2, metadata2));\n      return this;\n    } else {\n      return isValidScaleType(type2) ? scales.get(type2) : void 0;\n    }\n  }\n  scale$4(Identity, identity$4);\n  scale$4(Linear, linear$1, Continuous);\n  scale$4(Log, log$4, [Continuous, Log]);\n  scale$4(Pow, pow$4, Continuous);\n  scale$4(Sqrt, sqrt$3, Continuous);\n  scale$4(Symlog, symlog$1, Continuous);\n  scale$4(Time, time$1, [Continuous, Temporal]);\n  scale$4(UTC, utcTime, [Continuous, Temporal]);\n  scale$4(Sequential, sequential, [Continuous, Interpolating]);\n  scale$4(`${Sequential}-${Linear}`, sequential, [Continuous, Interpolating]);\n  scale$4(`${Sequential}-${Log}`, sequentialLog, [Continuous, Interpolating, Log]);\n  scale$4(`${Sequential}-${Pow}`, sequentialPow, [Continuous, Interpolating]);\n  scale$4(`${Sequential}-${Sqrt}`, sequentialSqrt, [Continuous, Interpolating]);\n  scale$4(`${Sequential}-${Symlog}`, sequentialSymlog, [Continuous, Interpolating]);\n  scale$4(`${Diverging}-${Linear}`, diverging$1, [Continuous, Interpolating]);\n  scale$4(`${Diverging}-${Log}`, divergingLog, [Continuous, Interpolating, Log]);\n  scale$4(`${Diverging}-${Pow}`, divergingPow, [Continuous, Interpolating]);\n  scale$4(`${Diverging}-${Sqrt}`, divergingSqrt, [Continuous, Interpolating]);\n  scale$4(`${Diverging}-${Symlog}`, divergingSymlog, [Continuous, Interpolating]);\n  scale$4(Quantile, quantile, [Discretizing, Quantile]);\n  scale$4(Quantize, quantize$1, Discretizing);\n  scale$4(Threshold, threshold, Discretizing);\n  scale$4(BinOrdinal, scaleBinOrdinal, [Discrete$1, Discretizing]);\n  scale$4(Ordinal, ordinal, Discrete$1);\n  scale$4(Band, band, Discrete$1);\n  scale$4(Point, point$1, Discrete$1);\n  function isValidScaleType(type2) {\n    return scales.has(type2);\n  }\n  function hasType(key2, type2) {\n    const s2 = scales.get(key2);\n    return s2 && s2.metadata[type2];\n  }\n  function isContinuous(key2) {\n    return hasType(key2, Continuous);\n  }\n  function isDiscrete(key2) {\n    return hasType(key2, Discrete$1);\n  }\n  function isDiscretizing(key2) {\n    return hasType(key2, Discretizing);\n  }\n  function isLogarithmic(key2) {\n    return hasType(key2, Log);\n  }\n  function isTemporal(key2) {\n    return hasType(key2, Temporal);\n  }\n  function isInterpolating(key2) {\n    return hasType(key2, Interpolating);\n  }\n  function isQuantile(key2) {\n    return hasType(key2, Quantile);\n  }\n  const scaleProps = [\"clamp\", \"base\", \"constant\", \"exponent\"];\n  function interpolateRange(interpolator, range2) {\n    const start = range2[0], span2 = peek$1(range2) - start;\n    return function(i) {\n      return interpolator(start + i * span2);\n    };\n  }\n  function interpolateColors(colors2, type2, gamma2) {\n    return piecewise(interpolate(type2 || \"rgb\", gamma2), colors2);\n  }\n  function quantizeInterpolator(interpolator, count2) {\n    const samples = new Array(count2), n = count2 + 1;\n    for (let i = 0; i < count2; ) samples[i] = interpolator(++i / n);\n    return samples;\n  }\n  function scaleFraction(scale$12, min2, max2) {\n    const delta = max2 - min2;\n    let i, t, s2;\n    if (!delta || !Number.isFinite(delta)) {\n      return constant$4(0.5);\n    } else {\n      i = (t = scale$12.type).indexOf(\"-\");\n      t = i < 0 ? t : t.slice(i + 1);\n      s2 = scale$4(t)().domain([min2, max2]).range([0, 1]);\n      scaleProps.forEach((m2) => scale$12[m2] ? s2[m2](scale$12[m2]()) : 0);\n      return s2;\n    }\n  }\n  function interpolate(type2, gamma2) {\n    const interp = $$1[method(type2)];\n    return gamma2 != null && interp && interp.gamma ? interp.gamma(gamma2) : interp;\n  }\n  function method(type2) {\n    return \"interpolate\" + type2.toLowerCase().split(\"-\").map((s2) => s2[0].toUpperCase() + s2.slice(1)).join(\"\");\n  }\n  const continuous = {\n    blues: \"cfe1f2bed8eca8cee58fc1de74b2d75ba3cf4592c63181bd206fb2125ca40a4a90\",\n    greens: \"d3eecdc0e6baabdda594d3917bc77d60ba6c46ab5e329a512089430e7735036429\",\n    greys: \"e2e2e2d4d4d4c4c4c4b1b1b19d9d9d8888887575756262624d4d4d3535351e1e1e\",\n    oranges: \"fdd8b3fdc998fdb87bfda55efc9244f87f2cf06b18e4580bd14904b93d029f3303\",\n    purples: \"e2e1efd4d4e8c4c5e0b4b3d6a3a0cc928ec3827cb97566ae684ea25c3696501f8c\",\n    reds: \"fdc9b4fcb49afc9e80fc8767fa7051f6573fec3f2fdc2a25c81b1db21218970b13\",\n    blueGreen: \"d5efedc1e8e0a7ddd18bd2be70c6a958ba9144ad77319c5d2089460e7736036429\",\n    bluePurple: \"ccddecbad0e4a8c2dd9ab0d4919cc98d85be8b6db28a55a6873c99822287730f71\",\n    greenBlue: \"d3eecec5e8c3b1e1bb9bd8bb82cec269c2ca51b2cd3c9fc7288abd1675b10b60a1\",\n    orangeRed: \"fddcaffdcf9bfdc18afdad77fb9562f67d53ee6545e24932d32d1ebf130da70403\",\n    purpleBlue: \"dbdaebc8cee4b1c3de97b7d87bacd15b9fc93a90c01e7fb70b70ab056199045281\",\n    purpleBlueGreen: \"dbd8eac8cee4b0c3de93b7d872acd1549fc83892bb1c88a3097f8702736b016353\",\n    purpleRed: \"dcc9e2d3b3d7ce9eccd186c0da6bb2e14da0e23189d91e6fc61159ab07498f023a\",\n    redPurple: \"fccfccfcbec0faa9b8f98faff571a5ec539ddb3695c41b8aa908808d0179700174\",\n    yellowGreen: \"e4f4acd1eca0b9e2949ed68880c97c62bb6e47aa5e3297502083440e723b036034\",\n    yellowOrangeBrown: \"feeaa1fedd84fecc63feb746fca031f68921eb7215db5e0bc54c05ab3d038f3204\",\n    yellowOrangeRed: \"fee087fed16ffebd59fea849fd903efc7335f9522bee3423de1b20ca0b22af0225\",\n    blueOrange: \"134b852f78b35da2cb9dcae1d2e5eff2f0ebfce0bafbbf74e8932fc5690d994a07\",\n    brownBlueGreen: \"704108a0651ac79548e3c78af3e6c6eef1eac9e9e48ed1c74da79e187a72025147\",\n    purpleGreen: \"5b1667834792a67fb6c9aed3e6d6e8eff0efd9efd5aedda971bb75368e490e5e29\",\n    purpleOrange: \"4114696647968f83b7b9b4d6dadbebf3eeeafce0bafbbf74e8932fc5690d994a07\",\n    redBlue: \"8c0d25bf363adf745ef4ae91fbdbc9f2efeed2e5ef9dcae15da2cb2f78b3134b85\",\n    redGrey: \"8c0d25bf363adf745ef4ae91fcdccbfaf4f1e2e2e2c0c0c0969696646464343434\",\n    yellowGreenBlue: \"eff9bddbf1b4bde5b594d5b969c5be45b4c22c9ec02182b82163aa23479c1c3185\",\n    redYellowBlue: \"a50026d4322cf16e43fcac64fedd90faf8c1dcf1ecabd6e875abd04a74b4313695\",\n    redYellowGreen: \"a50026d4322cf16e43fcac63fedd8df9f7aed7ee8ea4d86e64bc6122964f006837\",\n    pinkYellowGreen: \"8e0152c0267edd72adf0b3d6faddedf5f3efe1f2cab6de8780bb474f9125276419\",\n    spectral: \"9e0142d13c4bf0704afcac63fedd8dfbf8b0e0f3a1a9dda269bda94288b55e4fa2\",\n    viridis: \"440154470e61481a6c482575472f7d443a834144873d4e8a39568c35608d31688e2d708e2a788e27818e23888e21918d1f988b1fa08822a8842ab07f35b77943bf7154c56866cc5d7ad1518fd744a5db36bcdf27d2e21be9e51afde725\",\n    magma: \"0000040404130b0924150e3720114b2c11603b0f704a107957157e651a80721f817f24828c29819a2e80a8327db6377ac43c75d1426fde4968e95462f1605df76f5cfa7f5efc8f65fe9f6dfeaf78febf84fece91fddea0fcedaffcfdbf\",\n    inferno: \"0000040403130c0826170c3b240c4f330a5f420a68500d6c5d126e6b176e781c6d86216b932667a12b62ae305cbb3755c73e4cd24644dd513ae65c30ed6925f3771af8850ffb9506fca50afcb519fac62df6d645f2e661f3f484fcffa4\",\n    plasma: \"0d088723069033059742039d5002a25d01a66a00a87801a88405a7900da49c179ea72198b12a90ba3488c33d80cb4779d35171da5a69e16462e76e5bed7953f2834cf68f44fa9a3dfca636fdb32ffec029fcce25f9dc24f5ea27f0f921\",\n    cividis: \"00205100235800265d002961012b65042e670831690d346b11366c16396d1c3c6e213f6e26426e2c456e31476e374a6e3c4d6e42506e47536d4c566d51586e555b6e5a5e6e5e616e62646f66676f6a6a706e6d717270717573727976737c79747f7c75827f758682768985778c8877908b78938e789691789a94789e9778a19b78a59e77a9a177aea575b2a874b6ab73bbaf71c0b26fc5b66dc9b96acebd68d3c065d8c462ddc85fe2cb5ce7cf58ebd355f0d652f3da4ff7de4cfae249fce647\",\n    rainbow: \"6e40aa883eb1a43db3bf3cafd83fa4ee4395fe4b83ff576eff6659ff7847ff8c38f3a130e2b72fcfcc36bee044aff05b8ff4576ff65b52f6673af27828ea8d1ddfa319d0b81cbecb23abd82f96e03d82e14c6edb5a5dd0664dbf6e40aa\",\n    sinebow: \"ff4040fc582af47218e78d0bd5a703bfbf00a7d5038de70b72f41858fc2a40ff402afc5818f4720be78d03d5a700bfbf03a7d50b8de71872f42a58fc4040ff582afc7218f48d0be7a703d5bf00bfd503a7e70b8df41872fc2a58ff4040\",\n    turbo: \"23171b32204a3e2a71453493493eae4b49c54a53d7485ee44569ee4074f53c7ff8378af93295f72e9ff42ba9ef28b3e926bce125c5d925cdcf27d5c629dcbc2de3b232e9a738ee9d3ff39347f68950f9805afc7765fd6e70fe667cfd5e88fc5795fb51a1f84badf545b9f140c5ec3cd0e637dae034e4d931ecd12ef4c92bfac029ffb626ffad24ffa223ff9821ff8d1fff821dff771cfd6c1af76118f05616e84b14df4111d5380fcb2f0dc0260ab61f07ac1805a313029b0f00950c00910b00\",\n    browns: \"eedbbdecca96e9b97ae4a865dc9856d18954c7784cc0673fb85536ad44339f3632\",\n    tealBlues: \"bce4d89dd3d181c3cb65b3c245a2b9368fae347da0306a932c5985\",\n    teals: \"bbdfdfa2d4d58ac9c975bcbb61b0af4da5a43799982b8b8c1e7f7f127273006667\",\n    warmGreys: \"dcd4d0cec5c1c0b8b4b3aaa7a59c9998908c8b827f7e7673726866665c5a59504e\",\n    goldGreen: \"f4d166d5ca60b6c35c98bb597cb25760a6564b9c533f8f4f33834a257740146c36\",\n    goldOrange: \"f4d166f8be5cf8aa4cf5983bf3852aef701be2621fd65322c54923b142239e3a26\",\n    goldRed: \"f4d166f6be59f9aa51fc964ef6834bee734ae56249db5247cf4244c43141b71d3e\",\n    lightGreyRed: \"efe9e6e1dad7d5cbc8c8bdb9bbaea9cd967ddc7b43e15f19df4011dc000b\",\n    lightGreyTeal: \"e4eaead6dcddc8ced2b7c2c7a6b4bc64b0bf22a6c32295c11f85be1876bc\",\n    lightMulti: \"e0f1f2c4e9d0b0de9fd0e181f6e072f6c053f3993ef77440ef4a3c\",\n    lightOrange: \"f2e7daf7d5baf9c499fab184fa9c73f68967ef7860e8645bde515bd43d5b\",\n    lightTealBlue: \"e3e9e0c0dccf9aceca7abfc859afc0389fb9328dad2f7ca0276b95255988\",\n    darkBlue: \"3232322d46681a5c930074af008cbf05a7ce25c0dd38daed50f3faffffff\",\n    darkGold: \"3c3c3c584b37725e348c7631ae8b2bcfa424ecc31ef9de30fff184ffffff\",\n    darkGreen: \"3a3a3a215748006f4d048942489e4276b340a6c63dd2d836ffeb2cffffaa\",\n    darkMulti: \"3737371f5287197d8c29a86995ce3fffe800ffffff\",\n    darkRed: \"3434347036339e3c38cc4037e75d1eec8620eeab29f0ce32ffeb2c\"\n  };\n  const discrete = {\n    accent: schemeAccent,\n    category10: schemeCategory10,\n    category20: \"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\",\n    category20b: \"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\",\n    category20c: \"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\",\n    dark2: schemeDark2,\n    observable10: schemeObservable10,\n    paired: schemePaired,\n    pastel1: schemePastel1,\n    pastel2: schemePastel2,\n    set1: schemeSet1,\n    set2: schemeSet2,\n    set3: schemeSet3,\n    tableau10: \"4c78a8f58518e4575672b7b254a24beeca3bb279a2ff9da69d755dbab0ac\",\n    tableau20: \"4c78a89ecae9f58518ffbf7954a24b88d27ab79a20f2cf5b43989483bcb6e45756ff9d9879706ebab0acd67195fcbfd2b279a2d6a5c99e765fd8b5a5\"\n  };\n  function colors(palette) {\n    if (isArray(palette)) return palette;\n    const n = palette.length / 6 | 0, c2 = new Array(n);\n    for (let i = 0; i < n; ) {\n      c2[i] = \"#\" + palette.slice(i * 6, ++i * 6);\n    }\n    return c2;\n  }\n  function apply(_, f) {\n    for (const k in _) scheme(k, f(_[k]));\n  }\n  const schemes = {};\n  apply(discrete, colors);\n  apply(continuous, (_) => interpolateColors(colors(_)));\n  function scheme(name, scheme2) {\n    name = name && name.toLowerCase();\n    if (arguments.length > 1) {\n      schemes[name] = scheme2;\n      return this;\n    } else {\n      return schemes[name];\n    }\n  }\n  const SymbolLegend = \"symbol\";\n  const DiscreteLegend = \"discrete\";\n  const GradientLegend = \"gradient\";\n  const defaultFormatter = (value2) => isArray(value2) ? value2.map((v) => String(v)) : String(value2);\n  const ascending = (a2, b2) => a2[1] - b2[1];\n  const descending = (a2, b2) => b2[1] - a2[1];\n  function tickCount(scale2, count2, minStep) {\n    let step;\n    if (isNumber$1(count2)) {\n      if (scale2.bins) {\n        count2 = Math.max(count2, scale2.bins.length);\n      }\n      if (minStep != null) {\n        count2 = Math.min(count2, Math.floor(span(scale2.domain()) / minStep || 1) + 1);\n      }\n    }\n    if (isObject(count2)) {\n      step = count2.step;\n      count2 = count2.interval;\n    }\n    if (isString(count2)) {\n      count2 = scale2.type === Time ? timeInterval(count2) : scale2.type == UTC ? utcInterval(count2) : error(\"Only time and utc scales accept interval strings.\");\n      if (step) count2 = count2.every(step);\n    }\n    return count2;\n  }\n  function validTicks(scale2, ticks2, count2) {\n    let range2 = scale2.range(), lo = range2[0], hi = peek$1(range2), cmp = ascending;\n    if (lo > hi) {\n      range2 = hi;\n      hi = lo;\n      lo = range2;\n      cmp = descending;\n    }\n    lo = Math.floor(lo);\n    hi = Math.ceil(hi);\n    ticks2 = ticks2.map((v) => [v, scale2(v)]).filter((_) => lo <= _[1] && _[1] <= hi).sort(cmp).map((_) => _[0]);\n    if (count2 > 0 && ticks2.length > 1) {\n      const endpoints = [ticks2[0], peek$1(ticks2)];\n      while (ticks2.length > count2 && ticks2.length >= 3) {\n        ticks2 = ticks2.filter((_, i) => !(i % 2));\n      }\n      if (ticks2.length < 3) {\n        ticks2 = endpoints;\n      }\n    }\n    return ticks2;\n  }\n  function tickValues(scale2, count2) {\n    return scale2.bins ? validTicks(scale2, scale2.bins, count2) : scale2.ticks ? scale2.ticks(count2) : scale2.domain();\n  }\n  function tickFormat(locale2, scale2, count2, specifier, formatType, noSkip) {\n    const type2 = scale2.type;\n    let format2 = defaultFormatter;\n    if (type2 === Time || formatType === Time) {\n      format2 = locale2.timeFormat(specifier);\n    } else if (type2 === UTC || formatType === UTC) {\n      format2 = locale2.utcFormat(specifier);\n    } else if (isLogarithmic(type2)) {\n      const varfmt = locale2.formatFloat(specifier);\n      if (noSkip || scale2.bins) {\n        format2 = varfmt;\n      } else {\n        const test2 = tickLog(scale2, count2, false);\n        format2 = (_) => test2(_) ? varfmt(_) : \"\";\n      }\n    } else if (scale2.tickFormat) {\n      const d2 = scale2.domain();\n      format2 = locale2.formatSpan(d2[0], d2[d2.length - 1], count2, specifier);\n    } else if (specifier) {\n      format2 = locale2.format(specifier);\n    }\n    return format2;\n  }\n  function tickLog(scale2, count2, values2) {\n    const ticks2 = tickValues(scale2, count2), base2 = scale2.base(), logb = Math.log(base2), k = Math.max(1, base2 * count2 / ticks2.length);\n    const test2 = (d2) => {\n      let i = d2 / Math.pow(base2, Math.round(Math.log(d2) / logb));\n      if (i * base2 < base2 - 0.5) i *= base2;\n      return i <= k;\n    };\n    return values2 ? ticks2.filter(test2) : test2;\n  }\n  const symbols$1 = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"thresholds\",\n    [Threshold]: \"domain\"\n  };\n  const formats = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"domain\"\n  };\n  function labelValues(scale2, count2) {\n    return scale2.bins ? binValues(scale2.bins) : scale2.type === Log ? tickLog(scale2, count2, true) : symbols$1[scale2.type] ? thresholdValues(scale2[symbols$1[scale2.type]]()) : tickValues(scale2, count2);\n  }\n  function thresholdFormat(locale2, scale2, specifier) {\n    const _ = scale2[formats[scale2.type]](), n = _.length;\n    let d2 = n > 1 ? _[1] - _[0] : _[0], i;\n    for (i = 1; i < n; ++i) {\n      d2 = Math.min(d2, _[i] - _[i - 1]);\n    }\n    return locale2.formatSpan(0, d2, 3 * 10, specifier);\n  }\n  function thresholdValues(thresholds) {\n    const values2 = [-Infinity].concat(thresholds);\n    values2.max = Infinity;\n    return values2;\n  }\n  function binValues(bins) {\n    const values2 = bins.slice(0, -1);\n    values2.max = peek$1(bins);\n    return values2;\n  }\n  const isDiscreteRange = (scale2) => symbols$1[scale2.type] || scale2.bins;\n  function labelFormat(locale2, scale2, count2, type2, specifier, formatType, noSkip) {\n    const format2 = formats[scale2.type] && formatType !== Time && formatType !== UTC ? thresholdFormat(locale2, scale2, specifier) : tickFormat(locale2, scale2, count2, specifier, formatType, noSkip);\n    return type2 === SymbolLegend && isDiscreteRange(scale2) ? formatRange(format2) : type2 === DiscreteLegend ? formatDiscrete(format2) : formatPoint(format2);\n  }\n  const formatRange = (format2) => (value2, index2, array2) => {\n    const limit = get$3(array2[index2 + 1], get$3(array2.max, Infinity)), lo = formatValue$1(value2, format2), hi = formatValue$1(limit, format2);\n    return lo && hi ? lo + \" – \" + hi : hi ? \"< \" + hi : \"≥ \" + lo;\n  };\n  const get$3 = (value2, dflt) => value2 != null ? value2 : dflt;\n  const formatDiscrete = (format2) => (value2, index2) => index2 ? format2(value2) : null;\n  const formatPoint = (format2) => (value2) => format2(value2);\n  const formatValue$1 = (value2, format2) => Number.isFinite(value2) ? format2(value2) : null;\n  function labelFraction(scale2) {\n    const domain2 = scale2.domain(), count2 = domain2.length - 1;\n    let lo = +domain2[0], hi = +peek$1(domain2), span2 = hi - lo;\n    if (scale2.type === Threshold) {\n      const adjust = count2 ? span2 / count2 : 0.1;\n      lo -= adjust;\n      hi += adjust;\n      span2 = hi - lo;\n    }\n    return (value2) => (value2 - lo) / span2;\n  }\n  function format$1(locale2, scale2, specifier, formatType) {\n    const type2 = formatType || scale2.type;\n    if (isString(specifier) && isTemporal(type2)) {\n      specifier = specifier.replace(/%a/g, \"%A\").replace(/%b/g, \"%B\");\n    }\n    return !specifier && type2 === Time ? locale2.timeFormat(\"%A, %d %B %Y, %X\") : !specifier && type2 === UTC ? locale2.utcFormat(\"%A, %d %B %Y, %X UTC\") : labelFormat(locale2, scale2, 5, null, specifier, formatType, true);\n  }\n  function domainCaption(locale2, scale2, opt) {\n    opt = opt || {};\n    const max2 = Math.max(3, opt.maxlen || 7), fmt = format$1(locale2, scale2, opt.format, opt.formatType);\n    if (isDiscretizing(scale2.type)) {\n      const v = labelValues(scale2).slice(1).map(fmt), n = v.length;\n      return `${n} boundar${n === 1 ? \"y\" : \"ies\"}: ${v.join(\", \")}`;\n    } else if (isDiscrete(scale2.type)) {\n      const d2 = scale2.domain(), n = d2.length, v = n > max2 ? d2.slice(0, max2 - 2).map(fmt).join(\", \") + \", ending with \" + d2.slice(-1).map(fmt) : d2.map(fmt).join(\", \");\n      return `${n} value${n === 1 ? \"\" : \"s\"}: ${v}`;\n    } else {\n      const d2 = scale2.domain();\n      return `values from ${fmt(d2[0])} to ${fmt(peek$1(d2))}`;\n    }\n  }\n  let gradient_id = 0;\n  function resetSVGGradientId() {\n    gradient_id = 0;\n  }\n  const patternPrefix = \"p_\";\n  function isGradient(value2) {\n    return value2 && value2.gradient;\n  }\n  function gradientRef(g, defs, base2) {\n    const type2 = g.gradient;\n    let id2 = g.id, prefix = type2 === \"radial\" ? patternPrefix : \"\";\n    if (!id2) {\n      id2 = g.id = \"gradient_\" + gradient_id++;\n      if (type2 === \"radial\") {\n        g.x1 = get$2(g.x1, 0.5);\n        g.y1 = get$2(g.y1, 0.5);\n        g.r1 = get$2(g.r1, 0);\n        g.x2 = get$2(g.x2, 0.5);\n        g.y2 = get$2(g.y2, 0.5);\n        g.r2 = get$2(g.r2, 0.5);\n        prefix = patternPrefix;\n      } else {\n        g.x1 = get$2(g.x1, 0);\n        g.y1 = get$2(g.y1, 0);\n        g.x2 = get$2(g.x2, 1);\n        g.y2 = get$2(g.y2, 0);\n      }\n    }\n    defs[id2] = g;\n    return \"url(\" + (base2 || \"\") + \"#\" + prefix + id2 + \")\";\n  }\n  function get$2(val, def2) {\n    return val != null ? val : def2;\n  }\n  function Gradient$1(p02, p1) {\n    var stops = [], gradient2;\n    return gradient2 = {\n      gradient: \"linear\",\n      x1: p02 ? p02[0] : 0,\n      y1: p02 ? p02[1] : 0,\n      x2: p1 ? p1[0] : 1,\n      y2: p1 ? p1[1] : 0,\n      stops,\n      stop: function(offset2, color2) {\n        stops.push({\n          offset: offset2,\n          color: color2\n        });\n        return gradient2;\n      }\n    };\n  }\n  const lookup$4 = {\n    \"basis\": {\n      curve: curveBasis\n    },\n    \"basis-closed\": {\n      curve: curveBasisClosed\n    },\n    \"basis-open\": {\n      curve: curveBasisOpen\n    },\n    \"bundle\": {\n      curve: curveBundle,\n      tension: \"beta\",\n      value: 0.85\n    },\n    \"cardinal\": {\n      curve: curveCardinal,\n      tension: \"tension\",\n      value: 0\n    },\n    \"cardinal-open\": {\n      curve: curveCardinalOpen,\n      tension: \"tension\",\n      value: 0\n    },\n    \"cardinal-closed\": {\n      curve: curveCardinalClosed,\n      tension: \"tension\",\n      value: 0\n    },\n    \"catmull-rom\": {\n      curve: curveCatmullRom,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"catmull-rom-closed\": {\n      curve: curveCatmullRomClosed,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"catmull-rom-open\": {\n      curve: curveCatmullRomOpen,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"linear\": {\n      curve: curveLinear\n    },\n    \"linear-closed\": {\n      curve: curveLinearClosed\n    },\n    \"monotone\": {\n      horizontal: monotoneY,\n      vertical: monotoneX\n    },\n    \"natural\": {\n      curve: curveNatural\n    },\n    \"step\": {\n      curve: curveStep\n    },\n    \"step-after\": {\n      curve: stepAfter\n    },\n    \"step-before\": {\n      curve: stepBefore\n    }\n  };\n  function curves(type2, orientation, tension) {\n    var entry2 = has$1(lookup$4, type2) && lookup$4[type2], curve2 = null;\n    if (entry2) {\n      curve2 = entry2.curve || entry2[orientation || \"vertical\"];\n      if (entry2.tension && tension != null) {\n        curve2 = curve2[entry2.tension](tension);\n      }\n    }\n    return curve2;\n  }\n  const paramCounts = {\n    m: 2,\n    l: 2,\n    h: 1,\n    v: 1,\n    z: 0,\n    c: 6,\n    s: 4,\n    q: 4,\n    t: 2,\n    a: 7\n  };\n  const commandPattern = /[mlhvzcsqta]([^mlhvzcsqta]+|$)/gi;\n  const numberPattern = /^[+-]?(([0-9]*\\.[0-9]+)|([0-9]+\\.)|([0-9]+))([eE][+-]?[0-9]+)?/;\n  const spacePattern = /^((\\s+,?\\s*)|(,\\s*))/;\n  const flagPattern = /^[01]/;\n  function parse$3(path2) {\n    const commands = [];\n    const matches = path2.match(commandPattern) || [];\n    matches.forEach((str) => {\n      let cmd = str[0];\n      const type2 = cmd.toLowerCase();\n      const paramCount = paramCounts[type2];\n      const params2 = parseParams(type2, paramCount, str.slice(1).trim());\n      const count2 = params2.length;\n      if (count2 < paramCount || count2 && count2 % paramCount !== 0) {\n        throw Error(\"Invalid SVG path, incorrect parameter count\");\n      }\n      commands.push([cmd, ...params2.slice(0, paramCount)]);\n      if (count2 === paramCount) {\n        return;\n      }\n      if (type2 === \"m\") {\n        cmd = cmd === \"M\" ? \"L\" : \"l\";\n      }\n      for (let i = paramCount; i < count2; i += paramCount) {\n        commands.push([cmd, ...params2.slice(i, i + paramCount)]);\n      }\n    });\n    return commands;\n  }\n  function parseParams(type2, paramCount, segment) {\n    const params2 = [];\n    for (let index2 = 0; paramCount && index2 < segment.length; ) {\n      for (let i = 0; i < paramCount; ++i) {\n        const pattern = type2 === \"a\" && (i === 3 || i === 4) ? flagPattern : numberPattern;\n        const match2 = segment.slice(index2).match(pattern);\n        if (match2 === null) {\n          throw Error(\"Invalid SVG path, incorrect parameter type\");\n        }\n        index2 += match2[0].length;\n        params2.push(+match2[0]);\n        const ws = segment.slice(index2).match(spacePattern);\n        if (ws !== null) {\n          index2 += ws[0].length;\n        }\n      }\n    }\n    return params2;\n  }\n  const DegToRad = Math.PI / 180;\n  const Epsilon = 1e-14;\n  const HalfPi = Math.PI / 2;\n  const Tau = Math.PI * 2;\n  const HalfSqrt3 = Math.sqrt(3) / 2;\n  var segmentCache = {};\n  var bezierCache = {};\n  var join$1 = [].join;\n  function segments(x2, y2, rx, ry, large, sweep, rotateX2, ox, oy) {\n    const key2 = join$1.call(arguments);\n    if (segmentCache[key2]) {\n      return segmentCache[key2];\n    }\n    const th = rotateX2 * DegToRad;\n    const sin_th = Math.sin(th);\n    const cos_th = Math.cos(th);\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n    const px2 = cos_th * (ox - x2) * 0.5 + sin_th * (oy - y2) * 0.5;\n    const py2 = cos_th * (oy - y2) * 0.5 - sin_th * (ox - x2) * 0.5;\n    let pl = px2 * px2 / (rx * rx) + py2 * py2 / (ry * ry);\n    if (pl > 1) {\n      pl = Math.sqrt(pl);\n      rx *= pl;\n      ry *= pl;\n    }\n    const a00 = cos_th / rx;\n    const a01 = sin_th / rx;\n    const a10 = -sin_th / ry;\n    const a11 = cos_th / ry;\n    const x02 = a00 * ox + a01 * oy;\n    const y02 = a10 * ox + a11 * oy;\n    const x12 = a00 * x2 + a01 * y2;\n    const y12 = a10 * x2 + a11 * y2;\n    const d2 = (x12 - x02) * (x12 - x02) + (y12 - y02) * (y12 - y02);\n    let sfactor_sq = 1 / d2 - 0.25;\n    if (sfactor_sq < 0) sfactor_sq = 0;\n    let sfactor = Math.sqrt(sfactor_sq);\n    if (sweep == large) sfactor = -sfactor;\n    const xc = 0.5 * (x02 + x12) - sfactor * (y12 - y02);\n    const yc = 0.5 * (y02 + y12) + sfactor * (x12 - x02);\n    const th0 = Math.atan2(y02 - yc, x02 - xc);\n    const th1 = Math.atan2(y12 - yc, x12 - xc);\n    let th_arc = th1 - th0;\n    if (th_arc < 0 && sweep === 1) {\n      th_arc += Tau;\n    } else if (th_arc > 0 && sweep === 0) {\n      th_arc -= Tau;\n    }\n    const segs = Math.ceil(Math.abs(th_arc / (HalfPi + 1e-3)));\n    const result = [];\n    for (let i = 0; i < segs; ++i) {\n      const th2 = th0 + i * th_arc / segs;\n      const th3 = th0 + (i + 1) * th_arc / segs;\n      result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];\n    }\n    return segmentCache[key2] = result;\n  }\n  function bezier(params2) {\n    const key2 = join$1.call(params2);\n    if (bezierCache[key2]) {\n      return bezierCache[key2];\n    }\n    var cx = params2[0], cy = params2[1], th0 = params2[2], th1 = params2[3], rx = params2[4], ry = params2[5], sin_th = params2[6], cos_th = params2[7];\n    const a00 = cos_th * rx;\n    const a01 = -sin_th * ry;\n    const a10 = sin_th * rx;\n    const a11 = cos_th * ry;\n    const cos_th0 = Math.cos(th0);\n    const sin_th0 = Math.sin(th0);\n    const cos_th1 = Math.cos(th1);\n    const sin_th1 = Math.sin(th1);\n    const th_half = 0.5 * (th1 - th0);\n    const sin_th_h2 = Math.sin(th_half * 0.5);\n    const t = 8 / 3 * sin_th_h2 * sin_th_h2 / Math.sin(th_half);\n    const x12 = cx + cos_th0 - t * sin_th0;\n    const y12 = cy + sin_th0 + t * cos_th0;\n    const x3 = cx + cos_th1;\n    const y3 = cy + sin_th1;\n    const x2 = x3 + t * sin_th1;\n    const y2 = y3 - t * cos_th1;\n    return bezierCache[key2] = [a00 * x12 + a01 * y12, a10 * x12 + a11 * y12, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3];\n  }\n  const temp = [\"l\", 0, 0, 0, 0, 0, 0, 0];\n  function scale$1$1(current, sX, sY) {\n    const c2 = temp[0] = current[0];\n    if (c2 === \"a\" || c2 === \"A\") {\n      temp[1] = sX * current[1];\n      temp[2] = sY * current[2];\n      temp[3] = current[3];\n      temp[4] = current[4];\n      temp[5] = current[5];\n      temp[6] = sX * current[6];\n      temp[7] = sY * current[7];\n    } else if (c2 === \"h\" || c2 === \"H\") {\n      temp[1] = sX * current[1];\n    } else if (c2 === \"v\" || c2 === \"V\") {\n      temp[1] = sY * current[1];\n    } else {\n      for (var i = 1, n = current.length; i < n; ++i) {\n        temp[i] = (i % 2 == 1 ? sX : sY) * current[i];\n      }\n    }\n    return temp;\n  }\n  function pathRender(context2, path2, l, t, sX, sY) {\n    var current, previous = null, x2 = 0, y2 = 0, controlX = 0, controlY = 0, tempX, tempY, tempControlX, tempControlY, anchorX = 0, anchorY = 0;\n    if (l == null) l = 0;\n    if (t == null) t = 0;\n    if (sX == null) sX = 1;\n    if (sY == null) sY = sX;\n    if (context2.beginPath) context2.beginPath();\n    for (var i = 0, len2 = path2.length; i < len2; ++i) {\n      current = path2[i];\n      if (sX !== 1 || sY !== 1) {\n        current = scale$1$1(current, sX, sY);\n      }\n      switch (current[0]) {\n        // first letter\n        case \"l\":\n          x2 += current[1];\n          y2 += current[2];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"L\":\n          x2 = current[1];\n          y2 = current[2];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"h\":\n          x2 += current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"H\":\n          x2 = current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"v\":\n          y2 += current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"V\":\n          y2 = current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"m\":\n          x2 += current[1];\n          y2 += current[2];\n          anchorX = x2;\n          anchorY = y2;\n          context2.moveTo(x2 + l, y2 + t);\n          break;\n        case \"M\":\n          x2 = current[1];\n          y2 = current[2];\n          anchorX = x2;\n          anchorY = y2;\n          context2.moveTo(x2 + l, y2 + t);\n          break;\n        case \"c\":\n          tempX = x2 + current[5];\n          tempY = y2 + current[6];\n          controlX = x2 + current[3];\n          controlY = y2 + current[4];\n          context2.bezierCurveTo(\n            x2 + current[1] + l,\n            // x1\n            y2 + current[2] + t,\n            // y1\n            controlX + l,\n            // x2\n            controlY + t,\n            // y2\n            tempX + l,\n            tempY + t\n          );\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"C\":\n          x2 = current[5];\n          y2 = current[6];\n          controlX = current[3];\n          controlY = current[4];\n          context2.bezierCurveTo(current[1] + l, current[2] + t, controlX + l, controlY + t, x2 + l, y2 + t);\n          break;\n        case \"s\":\n          tempX = x2 + current[3];\n          tempY = y2 + current[4];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.bezierCurveTo(controlX + l, controlY + t, x2 + current[1] + l, y2 + current[2] + t, tempX + l, tempY + t);\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"S\":\n          tempX = current[3];\n          tempY = current[4];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.bezierCurveTo(controlX + l, controlY + t, current[1] + l, current[2] + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = current[1];\n          controlY = current[2];\n          break;\n        case \"q\":\n          tempX = x2 + current[3];\n          tempY = y2 + current[4];\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"Q\":\n          tempX = current[3];\n          tempY = current[4];\n          context2.quadraticCurveTo(current[1] + l, current[2] + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = current[1];\n          controlY = current[2];\n          break;\n        case \"t\":\n          tempX = x2 + current[1];\n          tempY = y2 + current[2];\n          if (previous[0].match(/[QqTt]/) === null) {\n            controlX = x2;\n            controlY = y2;\n          } else if (previous[0] === \"t\") {\n            controlX = 2 * x2 - tempControlX;\n            controlY = 2 * y2 - tempControlY;\n          } else if (previous[0] === \"q\") {\n            controlX = 2 * x2 - controlX;\n            controlY = 2 * y2 - controlY;\n          }\n          tempControlX = controlX;\n          tempControlY = controlY;\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          break;\n        case \"T\":\n          tempX = current[1];\n          tempY = current[2];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"a\":\n          drawArc(context2, x2 + l, y2 + t, [current[1], current[2], current[3], current[4], current[5], current[6] + x2 + l, current[7] + y2 + t]);\n          x2 += current[6];\n          y2 += current[7];\n          break;\n        case \"A\":\n          drawArc(context2, x2 + l, y2 + t, [current[1], current[2], current[3], current[4], current[5], current[6] + l, current[7] + t]);\n          x2 = current[6];\n          y2 = current[7];\n          break;\n        case \"z\":\n        case \"Z\":\n          x2 = anchorX;\n          y2 = anchorY;\n          context2.closePath();\n          break;\n      }\n      previous = current;\n    }\n  }\n  function drawArc(context2, x2, y2, coords) {\n    const seg = segments(\n      coords[5],\n      // end x\n      coords[6],\n      // end y\n      coords[0],\n      // radius x\n      coords[1],\n      // radius y\n      coords[3],\n      // large flag\n      coords[4],\n      // sweep flag\n      coords[2],\n      // rotation\n      x2,\n      y2\n    );\n    for (let i = 0; i < seg.length; ++i) {\n      const bez = bezier(seg[i]);\n      context2.bezierCurveTo(bez[0], bez[1], bez[2], bez[3], bez[4], bez[5]);\n    }\n  }\n  const Tan30 = 0.5773502691896257;\n  const builtins = {\n    \"circle\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(r, 0);\n        context2.arc(0, 0, r, 0, Tau);\n      }\n    },\n    \"cross\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, s2 = r / 2.5;\n        context2.moveTo(-r, -s2);\n        context2.lineTo(-r, s2);\n        context2.lineTo(-s2, s2);\n        context2.lineTo(-s2, r);\n        context2.lineTo(s2, r);\n        context2.lineTo(s2, s2);\n        context2.lineTo(r, s2);\n        context2.lineTo(r, -s2);\n        context2.lineTo(s2, -s2);\n        context2.lineTo(s2, -r);\n        context2.lineTo(-s2, -r);\n        context2.lineTo(-s2, -s2);\n        context2.closePath();\n      }\n    },\n    \"diamond\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(-r, 0);\n        context2.lineTo(0, -r);\n        context2.lineTo(r, 0);\n        context2.lineTo(0, r);\n        context2.closePath();\n      }\n    },\n    \"square\": {\n      draw: function(context2, size) {\n        var w2 = Math.sqrt(size), x2 = -w2 / 2;\n        context2.rect(x2, x2, w2, w2);\n      }\n    },\n    \"arrow\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, s2 = r / 7, t = r / 2.5, v = r / 8;\n        context2.moveTo(-s2, r);\n        context2.lineTo(s2, r);\n        context2.lineTo(s2, -v);\n        context2.lineTo(t, -v);\n        context2.lineTo(0, -r);\n        context2.lineTo(-t, -v);\n        context2.lineTo(-s2, -v);\n        context2.closePath();\n      }\n    },\n    \"wedge\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30, b2 = r / 4;\n        context2.moveTo(0, -h2 - o);\n        context2.lineTo(-b2, h2 - o);\n        context2.lineTo(b2, h2 - o);\n        context2.closePath();\n      }\n    },\n    \"triangle\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30;\n        context2.moveTo(0, -h2 - o);\n        context2.lineTo(-r, h2 - o);\n        context2.lineTo(r, h2 - o);\n        context2.closePath();\n      }\n    },\n    \"triangle-up\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(0, -h2);\n        context2.lineTo(-r, h2);\n        context2.lineTo(r, h2);\n        context2.closePath();\n      }\n    },\n    \"triangle-down\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(0, h2);\n        context2.lineTo(-r, -h2);\n        context2.lineTo(r, -h2);\n        context2.closePath();\n      }\n    },\n    \"triangle-right\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(h2, 0);\n        context2.lineTo(-h2, -r);\n        context2.lineTo(-h2, r);\n        context2.closePath();\n      }\n    },\n    \"triangle-left\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(-h2, 0);\n        context2.lineTo(h2, -r);\n        context2.lineTo(h2, r);\n        context2.closePath();\n      }\n    },\n    \"stroke\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(-r, 0);\n        context2.lineTo(r, 0);\n      }\n    }\n  };\n  function symbols(_) {\n    return has$1(builtins, _) ? builtins[_] : customSymbol(_);\n  }\n  var custom = {};\n  function customSymbol(path2) {\n    if (!has$1(custom, path2)) {\n      const parsed = parse$3(path2);\n      custom[path2] = {\n        draw: function(context2, size) {\n          pathRender(context2, parsed, 0, 0, Math.sqrt(size) / 2);\n        }\n      };\n    }\n    return custom[path2];\n  }\n  const C = 0.448084975506;\n  function rectangleX(d2) {\n    return d2.x;\n  }\n  function rectangleY(d2) {\n    return d2.y;\n  }\n  function rectangleWidth(d2) {\n    return d2.width;\n  }\n  function rectangleHeight(d2) {\n    return d2.height;\n  }\n  function number$3(_) {\n    return typeof _ === \"function\" ? _ : () => +_;\n  }\n  function clamp(value2, min2, max2) {\n    return Math.max(min2, Math.min(value2, max2));\n  }\n  function vg_rect() {\n    var x2 = rectangleX, y2 = rectangleY, width2 = rectangleWidth, height2 = rectangleHeight, crTL = number$3(0), crTR = crTL, crBL = crTL, crBR = crTL, context2 = null;\n    function rectangle2(_, x02, y02) {\n      var buffer, x12 = x02 != null ? x02 : +x2.call(this, _), y12 = y02 != null ? y02 : +y2.call(this, _), w2 = +width2.call(this, _), h2 = +height2.call(this, _), s2 = Math.min(w2, h2) / 2, tl2 = clamp(+crTL.call(this, _), 0, s2), tr2 = clamp(+crTR.call(this, _), 0, s2), bl2 = clamp(+crBL.call(this, _), 0, s2), br2 = clamp(+crBR.call(this, _), 0, s2);\n      if (!context2) context2 = buffer = path$3();\n      if (tl2 <= 0 && tr2 <= 0 && bl2 <= 0 && br2 <= 0) {\n        context2.rect(x12, y12, w2, h2);\n      } else {\n        var x22 = x12 + w2, y22 = y12 + h2;\n        context2.moveTo(x12 + tl2, y12);\n        context2.lineTo(x22 - tr2, y12);\n        context2.bezierCurveTo(x22 - C * tr2, y12, x22, y12 + C * tr2, x22, y12 + tr2);\n        context2.lineTo(x22, y22 - br2);\n        context2.bezierCurveTo(x22, y22 - C * br2, x22 - C * br2, y22, x22 - br2, y22);\n        context2.lineTo(x12 + bl2, y22);\n        context2.bezierCurveTo(x12 + C * bl2, y22, x12, y22 - C * bl2, x12, y22 - bl2);\n        context2.lineTo(x12, y12 + tl2);\n        context2.bezierCurveTo(x12, y12 + C * tl2, x12 + C * tl2, y12, x12 + tl2, y12);\n        context2.closePath();\n      }\n      if (buffer) {\n        context2 = null;\n        return buffer + \"\" || null;\n      }\n    }\n    rectangle2.x = function(_) {\n      if (arguments.length) {\n        x2 = number$3(_);\n        return rectangle2;\n      } else {\n        return x2;\n      }\n    };\n    rectangle2.y = function(_) {\n      if (arguments.length) {\n        y2 = number$3(_);\n        return rectangle2;\n      } else {\n        return y2;\n      }\n    };\n    rectangle2.width = function(_) {\n      if (arguments.length) {\n        width2 = number$3(_);\n        return rectangle2;\n      } else {\n        return width2;\n      }\n    };\n    rectangle2.height = function(_) {\n      if (arguments.length) {\n        height2 = number$3(_);\n        return rectangle2;\n      } else {\n        return height2;\n      }\n    };\n    rectangle2.cornerRadius = function(tl2, tr2, br2, bl2) {\n      if (arguments.length) {\n        crTL = number$3(tl2);\n        crTR = tr2 != null ? number$3(tr2) : crTL;\n        crBR = br2 != null ? number$3(br2) : crTL;\n        crBL = bl2 != null ? number$3(bl2) : crTR;\n        return rectangle2;\n      } else {\n        return crTL;\n      }\n    };\n    rectangle2.context = function(_) {\n      if (arguments.length) {\n        context2 = _ == null ? null : _;\n        return rectangle2;\n      } else {\n        return context2;\n      }\n    };\n    return rectangle2;\n  }\n  function vg_trail() {\n    var x2, y2, size, defined, context2 = null, ready, x12, y12, r1;\n    function point2(x22, y22, w2) {\n      const r2 = w2 / 2;\n      if (ready) {\n        var ux = y12 - y22, uy = x22 - x12;\n        if (ux || uy) {\n          var ud = Math.hypot(ux, uy), rx = (ux /= ud) * r1, ry = (uy /= ud) * r1, t = Math.atan2(uy, ux);\n          context2.moveTo(x12 - rx, y12 - ry);\n          context2.lineTo(x22 - ux * r2, y22 - uy * r2);\n          context2.arc(x22, y22, r2, t - Math.PI, t);\n          context2.lineTo(x12 + rx, y12 + ry);\n          context2.arc(x12, y12, r1, t, t + Math.PI);\n        } else {\n          context2.arc(x22, y22, r2, 0, Tau);\n        }\n        context2.closePath();\n      } else {\n        ready = 1;\n      }\n      x12 = x22;\n      y12 = y22;\n      r1 = r2;\n    }\n    function trail2(data2) {\n      var i, n = data2.length, d2, defined0 = false, buffer;\n      if (context2 == null) context2 = buffer = path$3();\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d2 = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) ready = 0;\n        }\n        if (defined0) point2(+x2(d2, i, data2), +y2(d2, i, data2), +size(d2, i, data2));\n      }\n      if (buffer) {\n        context2 = null;\n        return buffer + \"\" || null;\n      }\n    }\n    trail2.x = function(_) {\n      if (arguments.length) {\n        x2 = _;\n        return trail2;\n      } else {\n        return x2;\n      }\n    };\n    trail2.y = function(_) {\n      if (arguments.length) {\n        y2 = _;\n        return trail2;\n      } else {\n        return y2;\n      }\n    };\n    trail2.size = function(_) {\n      if (arguments.length) {\n        size = _;\n        return trail2;\n      } else {\n        return size;\n      }\n    };\n    trail2.defined = function(_) {\n      if (arguments.length) {\n        defined = _;\n        return trail2;\n      } else {\n        return defined;\n      }\n    };\n    trail2.context = function(_) {\n      if (arguments.length) {\n        if (_ == null) {\n          context2 = null;\n        } else {\n          context2 = _;\n        }\n        return trail2;\n      } else {\n        return context2;\n      }\n    };\n    return trail2;\n  }\n  function value$1(a2, b2) {\n    return a2 != null ? a2 : b2;\n  }\n  const x$2 = (item) => item.x || 0, y$2 = (item) => item.y || 0, w = (item) => item.width || 0, h = (item) => item.height || 0, xw = (item) => (item.x || 0) + (item.width || 0), yh = (item) => (item.y || 0) + (item.height || 0), sa = (item) => item.startAngle || 0, ea = (item) => item.endAngle || 0, pa = (item) => item.padAngle || 0, ir = (item) => item.innerRadius || 0, or = (item) => item.outerRadius || 0, cr = (item) => item.cornerRadius || 0, tl = (item) => value$1(item.cornerRadiusTopLeft, item.cornerRadius) || 0, tr = (item) => value$1(item.cornerRadiusTopRight, item.cornerRadius) || 0, br = (item) => value$1(item.cornerRadiusBottomRight, item.cornerRadius) || 0, bl = (item) => value$1(item.cornerRadiusBottomLeft, item.cornerRadius) || 0, sz = (item) => value$1(item.size, 64), ts = (item) => item.size || 1, def = (item) => !(item.defined === false), type = (item) => symbols(item.shape || \"circle\");\n  const arcShape = arc$2$1().startAngle(sa).endAngle(ea).padAngle(pa).innerRadius(ir).outerRadius(or).cornerRadius(cr), areavShape = area$2$1().x(x$2).y1(y$2).y0(yh).defined(def), areahShape = area$2$1().y(y$2).x1(x$2).x0(xw).defined(def), lineShape = line$2$1().x(x$2).y(y$2).defined(def), rectShape = vg_rect().x(x$2).y(y$2).width(w).height(h).cornerRadius(tl, tr, br, bl), symbolShape = Symbol$1().type(type).size(sz), trailShape = vg_trail().x(x$2).y(y$2).defined(def).size(ts);\n  function hasCornerRadius(item) {\n    return item.cornerRadius || item.cornerRadiusTopLeft || item.cornerRadiusTopRight || item.cornerRadiusBottomRight || item.cornerRadiusBottomLeft;\n  }\n  function arc$1(context2, item) {\n    return arcShape.context(context2)(item);\n  }\n  function area$1(context2, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return (item.orient === \"horizontal\" ? areahShape : areavShape).curve(curves(interp, item.orient, item.tension)).context(context2)(items);\n  }\n  function line$1(context2, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return lineShape.curve(curves(interp, item.orient, item.tension)).context(context2)(items);\n  }\n  function rectangle(context2, item, x2, y2) {\n    return rectShape.context(context2)(item, x2, y2);\n  }\n  function shape$1(context2, item) {\n    return (item.mark.shape || item.shape).context(context2)(item);\n  }\n  function symbol$1(context2, item) {\n    return symbolShape.context(context2)(item);\n  }\n  function trail$1(context2, items) {\n    return trailShape.context(context2)(items);\n  }\n  var clip_id = 1;\n  function resetSVGClipId() {\n    clip_id = 1;\n  }\n  function clip$1$1(renderer, item, size) {\n    var clip2 = item.clip, defs = renderer._defs, id2 = item.clip_id || (item.clip_id = \"clip\" + clip_id++), c2 = defs.clipping[id2] || (defs.clipping[id2] = {\n      id: id2\n    });\n    if (isFunction(clip2)) {\n      c2.path = clip2(null);\n    } else if (hasCornerRadius(size)) {\n      c2.path = rectangle(null, size, 0, 0);\n    } else {\n      c2.width = size.width || 0;\n      c2.height = size.height || 0;\n    }\n    return \"url(#\" + id2 + \")\";\n  }\n  function Bounds(b2) {\n    this.clear();\n    if (b2) this.union(b2);\n  }\n  Bounds.prototype = {\n    clone() {\n      return new Bounds(this);\n    },\n    clear() {\n      this.x1 = +Number.MAX_VALUE;\n      this.y1 = +Number.MAX_VALUE;\n      this.x2 = -Number.MAX_VALUE;\n      this.y2 = -Number.MAX_VALUE;\n      return this;\n    },\n    empty() {\n      return this.x1 === +Number.MAX_VALUE && this.y1 === +Number.MAX_VALUE && this.x2 === -Number.MAX_VALUE && this.y2 === -Number.MAX_VALUE;\n    },\n    equals(b2) {\n      return this.x1 === b2.x1 && this.y1 === b2.y1 && this.x2 === b2.x2 && this.y2 === b2.y2;\n    },\n    set(x12, y12, x2, y2) {\n      if (x2 < x12) {\n        this.x2 = x12;\n        this.x1 = x2;\n      } else {\n        this.x1 = x12;\n        this.x2 = x2;\n      }\n      if (y2 < y12) {\n        this.y2 = y12;\n        this.y1 = y2;\n      } else {\n        this.y1 = y12;\n        this.y2 = y2;\n      }\n      return this;\n    },\n    add(x2, y2) {\n      if (x2 < this.x1) this.x1 = x2;\n      if (y2 < this.y1) this.y1 = y2;\n      if (x2 > this.x2) this.x2 = x2;\n      if (y2 > this.y2) this.y2 = y2;\n      return this;\n    },\n    expand(d2) {\n      this.x1 -= d2;\n      this.y1 -= d2;\n      this.x2 += d2;\n      this.y2 += d2;\n      return this;\n    },\n    round() {\n      this.x1 = Math.floor(this.x1);\n      this.y1 = Math.floor(this.y1);\n      this.x2 = Math.ceil(this.x2);\n      this.y2 = Math.ceil(this.y2);\n      return this;\n    },\n    scale(s2) {\n      this.x1 *= s2;\n      this.y1 *= s2;\n      this.x2 *= s2;\n      this.y2 *= s2;\n      return this;\n    },\n    translate(dx, dy) {\n      this.x1 += dx;\n      this.x2 += dx;\n      this.y1 += dy;\n      this.y2 += dy;\n      return this;\n    },\n    rotate(angle2, x2, y2) {\n      const p = this.rotatedPoints(angle2, x2, y2);\n      return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n    },\n    rotatedPoints(angle2, x2, y2) {\n      var {\n        x1: x12,\n        y1: y12,\n        x2: x22,\n        y2: y22\n      } = this, cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), cx = x2 - x2 * cos2 + y2 * sin2, cy = y2 - x2 * sin2 - y2 * cos2;\n      return [cos2 * x12 - sin2 * y12 + cx, sin2 * x12 + cos2 * y12 + cy, cos2 * x12 - sin2 * y22 + cx, sin2 * x12 + cos2 * y22 + cy, cos2 * x22 - sin2 * y12 + cx, sin2 * x22 + cos2 * y12 + cy, cos2 * x22 - sin2 * y22 + cx, sin2 * x22 + cos2 * y22 + cy];\n    },\n    union(b2) {\n      if (b2.x1 < this.x1) this.x1 = b2.x1;\n      if (b2.y1 < this.y1) this.y1 = b2.y1;\n      if (b2.x2 > this.x2) this.x2 = b2.x2;\n      if (b2.y2 > this.y2) this.y2 = b2.y2;\n      return this;\n    },\n    intersect(b2) {\n      if (b2.x1 > this.x1) this.x1 = b2.x1;\n      if (b2.y1 > this.y1) this.y1 = b2.y1;\n      if (b2.x2 < this.x2) this.x2 = b2.x2;\n      if (b2.y2 < this.y2) this.y2 = b2.y2;\n      return this;\n    },\n    encloses(b2) {\n      return b2 && this.x1 <= b2.x1 && this.x2 >= b2.x2 && this.y1 <= b2.y1 && this.y2 >= b2.y2;\n    },\n    alignsWith(b2) {\n      return b2 && (this.x1 == b2.x1 || this.x2 == b2.x2 || this.y1 == b2.y1 || this.y2 == b2.y2);\n    },\n    intersects(b2) {\n      return b2 && !(this.x2 < b2.x1 || this.x1 > b2.x2 || this.y2 < b2.y1 || this.y1 > b2.y2);\n    },\n    contains(x2, y2) {\n      return !(x2 < this.x1 || x2 > this.x2 || y2 < this.y1 || y2 > this.y2);\n    },\n    width() {\n      return this.x2 - this.x1;\n    },\n    height() {\n      return this.y2 - this.y1;\n    }\n  };\n  function Item(mark) {\n    this.mark = mark;\n    this.bounds = this.bounds || new Bounds();\n  }\n  function GroupItem(mark) {\n    Item.call(this, mark);\n    this.items = this.items || [];\n  }\n  inherits(GroupItem, Item);\n  class ResourceLoader {\n    constructor(customLoader) {\n      this._pending = 0;\n      this._loader = customLoader || loader();\n    }\n    pending() {\n      return this._pending;\n    }\n    sanitizeURL(uri) {\n      const loader2 = this;\n      increment(loader2);\n      return loader2._loader.sanitize(uri, {\n        context: \"href\"\n      }).then((opt) => {\n        decrement(loader2);\n        return opt;\n      }).catch(() => {\n        decrement(loader2);\n        return null;\n      });\n    }\n    loadImage(uri) {\n      const loader2 = this, Image2 = domImage();\n      increment(loader2);\n      return loader2._loader.sanitize(uri, {\n        context: \"image\"\n      }).then((opt) => {\n        const url = opt.href;\n        if (!url || !Image2) throw {\n          url\n        };\n        const img = new Image2();\n        const cors = has$1(opt, \"crossOrigin\") ? opt.crossOrigin : \"anonymous\";\n        if (cors != null) img.crossOrigin = cors;\n        img.onload = () => decrement(loader2);\n        img.onerror = () => decrement(loader2);\n        img.src = url;\n        return img;\n      }).catch((e) => {\n        decrement(loader2);\n        return {\n          complete: false,\n          width: 0,\n          height: 0,\n          src: e && e.url || \"\"\n        };\n      });\n    }\n    ready() {\n      const loader2 = this;\n      return new Promise((accept) => {\n        function poll(value2) {\n          if (!loader2.pending()) accept(value2);\n          else setTimeout(() => {\n            poll(true);\n          }, 10);\n        }\n        poll(false);\n      });\n    }\n  }\n  function increment(loader2) {\n    loader2._pending += 1;\n  }\n  function decrement(loader2) {\n    loader2._pending -= 1;\n  }\n  function boundStroke(bounds2, item, miter) {\n    if (item.stroke && item.opacity !== 0 && item.strokeOpacity !== 0) {\n      const sw = item.strokeWidth != null ? +item.strokeWidth : 1;\n      bounds2.expand(sw + (miter ? miterAdjustment(item, sw) : 0));\n    }\n    return bounds2;\n  }\n  function miterAdjustment(item, strokeWidth) {\n    return item.strokeJoin && item.strokeJoin !== \"miter\" ? 0 : strokeWidth;\n  }\n  const circleThreshold = Tau - 1e-8;\n  let bounds, lx, ly, rot, ma, mb, mc, md;\n  const add$1 = (x2, y2) => bounds.add(x2, y2);\n  const addL = (x2, y2) => add$1(lx = x2, ly = y2);\n  const addX = (x2) => add$1(x2, bounds.y1);\n  const addY = (y2) => add$1(bounds.x1, y2);\n  const px = (x2, y2) => ma * x2 + mc * y2;\n  const py = (x2, y2) => mb * x2 + md * y2;\n  const addp = (x2, y2) => add$1(px(x2, y2), py(x2, y2));\n  const addpL = (x2, y2) => addL(px(x2, y2), py(x2, y2));\n  function boundContext(_, deg) {\n    bounds = _;\n    if (deg) {\n      rot = deg * DegToRad;\n      ma = md = Math.cos(rot);\n      mb = Math.sin(rot);\n      mc = -mb;\n    } else {\n      ma = md = 1;\n      rot = mb = mc = 0;\n    }\n    return context$1;\n  }\n  const context$1 = {\n    beginPath() {\n    },\n    closePath() {\n    },\n    moveTo: addpL,\n    lineTo: addpL,\n    rect(x2, y2, w2, h2) {\n      if (rot) {\n        addp(x2 + w2, y2);\n        addp(x2 + w2, y2 + h2);\n        addp(x2, y2 + h2);\n        addpL(x2, y2);\n      } else {\n        add$1(x2 + w2, y2 + h2);\n        addL(x2, y2);\n      }\n    },\n    quadraticCurveTo(x12, y12, x2, y2) {\n      const px1 = px(x12, y12), py1 = py(x12, y12), px2 = px(x2, y2), py2 = py(x2, y2);\n      quadExtrema(lx, px1, px2, addX);\n      quadExtrema(ly, py1, py2, addY);\n      addL(px2, py2);\n    },\n    bezierCurveTo(x12, y12, x2, y2, x3, y3) {\n      const px1 = px(x12, y12), py1 = py(x12, y12), px2 = px(x2, y2), py2 = py(x2, y2), px3 = px(x3, y3), py3 = py(x3, y3);\n      cubicExtrema(lx, px1, px2, px3, addX);\n      cubicExtrema(ly, py1, py2, py3, addY);\n      addL(px3, py3);\n    },\n    arc(cx, cy, r, sa2, ea2, ccw) {\n      sa2 += rot;\n      ea2 += rot;\n      lx = r * Math.cos(ea2) + cx;\n      ly = r * Math.sin(ea2) + cy;\n      if (Math.abs(ea2 - sa2) > circleThreshold) {\n        add$1(cx - r, cy - r);\n        add$1(cx + r, cy + r);\n      } else {\n        const update2 = (a2) => add$1(r * Math.cos(a2) + cx, r * Math.sin(a2) + cy);\n        let s2, i;\n        update2(sa2);\n        update2(ea2);\n        if (ea2 !== sa2) {\n          sa2 = sa2 % Tau;\n          if (sa2 < 0) sa2 += Tau;\n          ea2 = ea2 % Tau;\n          if (ea2 < 0) ea2 += Tau;\n          if (ea2 < sa2) {\n            ccw = !ccw;\n            s2 = sa2;\n            sa2 = ea2;\n            ea2 = s2;\n          }\n          if (ccw) {\n            ea2 -= Tau;\n            s2 = sa2 - sa2 % HalfPi;\n            for (i = 0; i < 4 && s2 > ea2; ++i, s2 -= HalfPi) update2(s2);\n          } else {\n            s2 = sa2 - sa2 % HalfPi + HalfPi;\n            for (i = 0; i < 4 && s2 < ea2; ++i, s2 = s2 + HalfPi) update2(s2);\n          }\n        }\n      }\n    }\n  };\n  function quadExtrema(x02, x12, x2, cb) {\n    const t = (x02 - x12) / (x02 + x2 - 2 * x12);\n    if (0 < t && t < 1) cb(x02 + (x12 - x02) * t);\n  }\n  function cubicExtrema(x02, x12, x2, x3, cb) {\n    const a2 = x3 - x02 + 3 * x12 - 3 * x2, b2 = x02 + x2 - 2 * x12, c2 = x02 - x12;\n    let t02 = 0, t12 = 0, r;\n    if (Math.abs(a2) > Epsilon) {\n      r = b2 * b2 + c2 * a2;\n      if (r >= 0) {\n        r = Math.sqrt(r);\n        t02 = (-b2 + r) / a2;\n        t12 = (-b2 - r) / a2;\n      }\n    } else {\n      t02 = 0.5 * c2 / b2;\n    }\n    if (0 < t02 && t02 < 1) cb(cubic(t02, x02, x12, x2, x3));\n    if (0 < t12 && t12 < 1) cb(cubic(t12, x02, x12, x2, x3));\n  }\n  function cubic(t, x02, x12, x2, x3) {\n    const s2 = 1 - t, s22 = s2 * s2, t22 = t * t;\n    return s22 * s2 * x02 + 3 * s22 * t * x12 + 3 * s2 * t22 * x2 + t22 * t * x3;\n  }\n  var context$2 = (context$2 = domCanvas(1, 1)) ? context$2.getContext(\"2d\") : null;\n  const b = new Bounds();\n  function intersectPath(draw2) {\n    return function(item, brush) {\n      if (!context$2) return true;\n      draw2(context$2, item);\n      b.clear().union(item.bounds).intersect(brush).round();\n      const {\n        x1: x12,\n        y1: y12,\n        x2,\n        y2\n      } = b;\n      for (let y3 = y12; y3 <= y2; ++y3) {\n        for (let x3 = x12; x3 <= x2; ++x3) {\n          if (context$2.isPointInPath(x3, y3)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n  }\n  function intersectPoint(item, box2) {\n    return box2.contains(item.x || 0, item.y || 0);\n  }\n  function intersectRect(item, box2) {\n    const x2 = item.x || 0, y2 = item.y || 0, w2 = item.width || 0, h2 = item.height || 0;\n    return box2.intersects(b.set(x2, y2, x2 + w2, y2 + h2));\n  }\n  function intersectRule(item, box2) {\n    const x2 = item.x || 0, y2 = item.y || 0, x22 = item.x2 != null ? item.x2 : x2, y22 = item.y2 != null ? item.y2 : y2;\n    return intersectBoxLine(box2, x2, y2, x22, y22);\n  }\n  function intersectBoxLine(box2, x2, y2, u2, v) {\n    const {\n      x1: x12,\n      y1: y12,\n      x2: x22,\n      y2: y22\n    } = box2, dx = u2 - x2, dy = v - y2;\n    let t02 = 0, t12 = 1, p, q, r, e;\n    for (e = 0; e < 4; ++e) {\n      if (e === 0) {\n        p = -dx;\n        q = -(x12 - x2);\n      }\n      if (e === 1) {\n        p = dx;\n        q = x22 - x2;\n      }\n      if (e === 2) {\n        p = -dy;\n        q = -(y12 - y2);\n      }\n      if (e === 3) {\n        p = dy;\n        q = y22 - y2;\n      }\n      if (Math.abs(p) < 1e-10 && q < 0) return false;\n      r = q / p;\n      if (p < 0) {\n        if (r > t12) return false;\n        else if (r > t02) t02 = r;\n      } else if (p > 0) {\n        if (r < t02) return false;\n        else if (r < t12) t12 = r;\n      }\n    }\n    return true;\n  }\n  function blend(context2, item) {\n    context2.globalCompositeOperation = item.blend || \"source-over\";\n  }\n  function value$2(value2, dflt) {\n    return value2 == null ? dflt : value2;\n  }\n  function addStops(gradient2, stops) {\n    const n = stops.length;\n    for (let i = 0; i < n; ++i) {\n      gradient2.addColorStop(stops[i].offset, stops[i].color);\n    }\n    return gradient2;\n  }\n  function gradient$1(context2, spec, bounds2) {\n    const w2 = bounds2.width(), h2 = bounds2.height();\n    let gradient2;\n    if (spec.gradient === \"radial\") {\n      gradient2 = context2.createRadialGradient(bounds2.x1 + value$2(spec.x1, 0.5) * w2, bounds2.y1 + value$2(spec.y1, 0.5) * h2, Math.max(w2, h2) * value$2(spec.r1, 0), bounds2.x1 + value$2(spec.x2, 0.5) * w2, bounds2.y1 + value$2(spec.y2, 0.5) * h2, Math.max(w2, h2) * value$2(spec.r2, 0.5));\n    } else {\n      const x12 = value$2(spec.x1, 0), y12 = value$2(spec.y1, 0), x2 = value$2(spec.x2, 1), y2 = value$2(spec.y2, 0);\n      if (x12 === x2 || y12 === y2 || w2 === h2) {\n        gradient2 = context2.createLinearGradient(bounds2.x1 + x12 * w2, bounds2.y1 + y12 * h2, bounds2.x1 + x2 * w2, bounds2.y1 + y2 * h2);\n      } else {\n        const image2 = domCanvas(Math.ceil(w2), Math.ceil(h2)), ictx = image2.getContext(\"2d\");\n        ictx.scale(w2, h2);\n        ictx.fillStyle = addStops(ictx.createLinearGradient(x12, y12, x2, y2), spec.stops);\n        ictx.fillRect(0, 0, w2, h2);\n        return context2.createPattern(image2, \"no-repeat\");\n      }\n    }\n    return addStops(gradient2, spec.stops);\n  }\n  function color$1(context2, item, value2) {\n    return isGradient(value2) ? gradient$1(context2, value2, item.bounds) : value2;\n  }\n  function fill(context2, item, opacity2) {\n    opacity2 *= item.fillOpacity == null ? 1 : item.fillOpacity;\n    if (opacity2 > 0) {\n      context2.globalAlpha = opacity2;\n      context2.fillStyle = color$1(context2, item, item.fill);\n      return true;\n    } else {\n      return false;\n    }\n  }\n  var Empty = [];\n  function stroke(context2, item, opacity2) {\n    var lw = (lw = item.strokeWidth) != null ? lw : 1;\n    if (lw <= 0) return false;\n    opacity2 *= item.strokeOpacity == null ? 1 : item.strokeOpacity;\n    if (opacity2 > 0) {\n      context2.globalAlpha = opacity2;\n      context2.strokeStyle = color$1(context2, item, item.stroke);\n      context2.lineWidth = lw;\n      context2.lineCap = item.strokeCap || \"butt\";\n      context2.lineJoin = item.strokeJoin || \"miter\";\n      context2.miterLimit = item.strokeMiterLimit || 10;\n      if (context2.setLineDash) {\n        context2.setLineDash(item.strokeDash || Empty);\n        context2.lineDashOffset = item.strokeDashOffset || 0;\n      }\n      return true;\n    } else {\n      return false;\n    }\n  }\n  function compare(a2, b2) {\n    return a2.zindex - b2.zindex || a2.index - b2.index;\n  }\n  function zorder(scene) {\n    if (!scene.zdirty) return scene.zitems;\n    var items = scene.items, output2 = [], item, i, n;\n    for (i = 0, n = items.length; i < n; ++i) {\n      item = items[i];\n      item.index = i;\n      if (item.zindex) output2.push(item);\n    }\n    scene.zdirty = false;\n    return scene.zitems = output2.sort(compare);\n  }\n  function visit(scene, visitor) {\n    var items = scene.items, i, n;\n    if (!items || !items.length) return;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        if (!items[i].zindex) visitor(items[i]);\n      }\n      items = zitems;\n    }\n    for (i = 0, n = items.length; i < n; ++i) {\n      visitor(items[i]);\n    }\n  }\n  function pickVisit(scene, visitor) {\n    var items = scene.items, hit2, i;\n    if (!items || !items.length) return null;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) items = zitems;\n    for (i = items.length; --i >= 0; ) {\n      if (hit2 = visitor(items[i])) return hit2;\n    }\n    if (items === zitems) {\n      for (items = scene.items, i = items.length; --i >= 0; ) {\n        if (!items[i].zindex) {\n          if (hit2 = visitor(items[i])) return hit2;\n        }\n      }\n    }\n    return null;\n  }\n  function drawAll(path2) {\n    return function(context2, scene, bounds2) {\n      visit(scene, (item) => {\n        if (!bounds2 || bounds2.intersects(item.bounds)) {\n          drawPath(path2, context2, item, item);\n        }\n      });\n    };\n  }\n  function drawOne(path2) {\n    return function(context2, scene, bounds2) {\n      if (scene.items.length && (!bounds2 || bounds2.intersects(scene.bounds))) {\n        drawPath(path2, context2, scene.items[0], scene.items);\n      }\n    };\n  }\n  function drawPath(path2, context2, item, items) {\n    var opacity2 = item.opacity == null ? 1 : item.opacity;\n    if (opacity2 === 0) return;\n    if (path2(context2, items)) return;\n    blend(context2, item);\n    if (item.fill && fill(context2, item, opacity2)) {\n      context2.fill();\n    }\n    if (item.stroke && stroke(context2, item, opacity2)) {\n      context2.stroke();\n    }\n  }\n  function pick$1(test2) {\n    test2 = test2 || truthy;\n    return function(context2, scene, x2, y2, gx, gy) {\n      x2 *= context2.pixelRatio;\n      y2 *= context2.pixelRatio;\n      return pickVisit(scene, (item) => {\n        const b2 = item.bounds;\n        if (b2 && !b2.contains(gx, gy) || !b2) return;\n        if (test2(context2, item, x2, y2, gx, gy)) return item;\n      });\n    };\n  }\n  function hitPath(path2, filled) {\n    return function(context2, o, x2, y2) {\n      var item = Array.isArray(o) ? o[0] : o, fill2 = filled == null ? item.fill : filled, stroke2 = item.stroke && context2.isPointInStroke, lw, lc;\n      if (stroke2) {\n        lw = item.strokeWidth;\n        lc = item.strokeCap;\n        context2.lineWidth = lw != null ? lw : 1;\n        context2.lineCap = lc != null ? lc : \"butt\";\n      }\n      return path2(context2, o) ? false : fill2 && context2.isPointInPath(x2, y2) || stroke2 && context2.isPointInStroke(x2, y2);\n    };\n  }\n  function pickPath(path2) {\n    return pick$1(hitPath(path2));\n  }\n  function translate$1(x2, y2) {\n    return \"translate(\" + x2 + \",\" + y2 + \")\";\n  }\n  function rotate(a2) {\n    return \"rotate(\" + a2 + \")\";\n  }\n  function scale$3(scaleX, scaleY2) {\n    return \"scale(\" + scaleX + \",\" + scaleY2 + \")\";\n  }\n  function translateItem(item) {\n    return translate$1(item.x || 0, item.y || 0);\n  }\n  function rotateItem(item) {\n    return translate$1(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\");\n  }\n  function transformItem(item) {\n    return translate$1(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\") + (item.scaleX || item.scaleY ? \" \" + scale$3(item.scaleX || 1, item.scaleY || 1) : \"\");\n  }\n  function markItemPath(type2, shape2, isect) {\n    function attr2(emit2, item) {\n      emit2(\"transform\", rotateItem(item));\n      emit2(\"d\", shape2(null, item));\n    }\n    function bound2(bounds2, item) {\n      shape2(boundContext(bounds2, item.angle), item);\n      return boundStroke(bounds2, item).translate(item.x || 0, item.y || 0);\n    }\n    function draw2(context2, item) {\n      var x2 = item.x || 0, y2 = item.y || 0, a2 = item.angle || 0;\n      context2.translate(x2, y2);\n      if (a2) context2.rotate(a2 *= DegToRad);\n      context2.beginPath();\n      shape2(context2, item);\n      if (a2) context2.rotate(-a2);\n      context2.translate(-x2, -y2);\n    }\n    return {\n      type: type2,\n      tag: \"path\",\n      nested: false,\n      attr: attr2,\n      bound: bound2,\n      draw: drawAll(draw2),\n      pick: pickPath(draw2),\n      isect: isect || intersectPath(draw2)\n    };\n  }\n  var arc$2 = markItemPath(\"arc\", arc$1);\n  function pickArea(a2, p) {\n    var v = a2[0].orient === \"horizontal\" ? p[1] : p[0], z2 = a2[0].orient === \"horizontal\" ? \"y\" : \"x\", i = a2.length, min2 = Infinity, hit2, d2;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      d2 = Math.abs(a2[i][z2] - v);\n      if (d2 < min2) {\n        min2 = d2;\n        hit2 = a2[i];\n      }\n    }\n    return hit2;\n  }\n  function pickLine(a2, p) {\n    var t = Math.pow(a2[0].strokeWidth || 1, 2), i = a2.length, dx, dy, dd;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      dx = a2[i].x - p[0];\n      dy = a2[i].y - p[1];\n      dd = dx * dx + dy * dy;\n      if (dd < t) return a2[i];\n    }\n    return null;\n  }\n  function pickTrail(a2, p) {\n    var i = a2.length, dx, dy, dd;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      dx = a2[i].x - p[0];\n      dy = a2[i].y - p[1];\n      dd = dx * dx + dy * dy;\n      dx = a2[i].size || 1;\n      if (dd < dx * dx) return a2[i];\n    }\n    return null;\n  }\n  function markMultiItemPath(type2, shape2, tip) {\n    function attr2(emit2, item) {\n      var items = item.mark.items;\n      if (items.length) emit2(\"d\", shape2(null, items));\n    }\n    function bound2(bounds2, mark) {\n      var items = mark.items;\n      if (items.length === 0) {\n        return bounds2;\n      } else {\n        shape2(boundContext(bounds2), items);\n        return boundStroke(bounds2, items[0]);\n      }\n    }\n    function draw2(context2, items) {\n      context2.beginPath();\n      shape2(context2, items);\n    }\n    const hit2 = hitPath(draw2);\n    function pick2(context2, scene, x2, y2, gx, gy) {\n      var items = scene.items, b2 = scene.bounds;\n      if (!items || !items.length || b2 && !b2.contains(gx, gy)) {\n        return null;\n      }\n      x2 *= context2.pixelRatio;\n      y2 *= context2.pixelRatio;\n      return hit2(context2, items, x2, y2) ? items[0] : null;\n    }\n    return {\n      type: type2,\n      tag: \"path\",\n      nested: true,\n      attr: attr2,\n      bound: bound2,\n      draw: drawOne(draw2),\n      pick: pick2,\n      isect: intersectPoint,\n      tip\n    };\n  }\n  var area$2 = markMultiItemPath(\"area\", area$1, pickArea);\n  function clip$2(context2, scene) {\n    var clip2 = scene.clip;\n    context2.save();\n    if (isFunction(clip2)) {\n      context2.beginPath();\n      clip2(context2);\n      context2.clip();\n    } else {\n      clipGroup(context2, scene.group);\n    }\n  }\n  function clipGroup(context2, group2) {\n    context2.beginPath();\n    hasCornerRadius(group2) ? rectangle(context2, group2, 0, 0) : context2.rect(0, 0, group2.width || 0, group2.height || 0);\n    context2.clip();\n  }\n  function offset$1(item) {\n    const sw = value$2(item.strokeWidth, 1);\n    return item.strokeOffset != null ? item.strokeOffset : item.stroke && sw > 0.5 && sw < 1.5 ? 0.5 - Math.abs(sw - 1) : 0;\n  }\n  function attr$5(emit2, item) {\n    emit2(\"transform\", translateItem(item));\n  }\n  function emitRectangle(emit2, item) {\n    const off = offset$1(item);\n    emit2(\"d\", rectangle(null, item, off, off));\n  }\n  function background$1(emit2, item) {\n    emit2(\"class\", \"background\");\n    emit2(\"aria-hidden\", true);\n    emitRectangle(emit2, item);\n  }\n  function foreground(emit2, item) {\n    emit2(\"class\", \"foreground\");\n    emit2(\"aria-hidden\", true);\n    if (item.strokeForeground) {\n      emitRectangle(emit2, item);\n    } else {\n      emit2(\"d\", \"\");\n    }\n  }\n  function content(emit2, item, renderer) {\n    const url = item.clip ? clip$1$1(renderer, item, item) : null;\n    emit2(\"clip-path\", url);\n  }\n  function bound$5(bounds2, group2) {\n    if (!group2.clip && group2.items) {\n      const items = group2.items, m2 = items.length;\n      for (let j = 0; j < m2; ++j) {\n        bounds2.union(items[j].bounds);\n      }\n    }\n    if ((group2.clip || group2.width || group2.height) && !group2.noBound) {\n      bounds2.add(0, 0).add(group2.width || 0, group2.height || 0);\n    }\n    boundStroke(bounds2, group2);\n    return bounds2.translate(group2.x || 0, group2.y || 0);\n  }\n  function rectanglePath(context2, group2, x2, y2) {\n    const off = offset$1(group2);\n    context2.beginPath();\n    rectangle(context2, group2, (x2 || 0) + off, (y2 || 0) + off);\n  }\n  const hitBackground = hitPath(rectanglePath);\n  const hitForeground = hitPath(rectanglePath, false);\n  const hitCorner = hitPath(rectanglePath, true);\n  function draw$4(context2, scene, bounds2, markTypes) {\n    visit(scene, (group2) => {\n      const gx = group2.x || 0, gy = group2.y || 0, fore = group2.strokeForeground, opacity2 = group2.opacity == null ? 1 : group2.opacity;\n      if ((group2.stroke || group2.fill) && opacity2) {\n        rectanglePath(context2, group2, gx, gy);\n        blend(context2, group2);\n        if (group2.fill && fill(context2, group2, opacity2)) {\n          context2.fill();\n        }\n        if (group2.stroke && !fore && stroke(context2, group2, opacity2)) {\n          context2.stroke();\n        }\n      }\n      context2.save();\n      context2.translate(gx, gy);\n      if (group2.clip) clipGroup(context2, group2);\n      if (bounds2) bounds2.translate(-gx, -gy);\n      visit(group2, (item) => {\n        if (item.marktype === \"group\" || markTypes == null || markTypes.includes(item.marktype)) {\n          this.draw(context2, item, bounds2, markTypes);\n        }\n      });\n      if (bounds2) bounds2.translate(gx, gy);\n      context2.restore();\n      if (fore && group2.stroke && opacity2) {\n        rectanglePath(context2, group2, gx, gy);\n        blend(context2, group2);\n        if (stroke(context2, group2, opacity2)) {\n          context2.stroke();\n        }\n      }\n    });\n  }\n  function pick(context2, scene, x2, y2, gx, gy) {\n    if (scene.bounds && !scene.bounds.contains(gx, gy) || !scene.items) {\n      return null;\n    }\n    const cx = x2 * context2.pixelRatio, cy = y2 * context2.pixelRatio;\n    return pickVisit(scene, (group2) => {\n      let hit2, dx, dy;\n      const b2 = group2.bounds;\n      if (b2 && !b2.contains(gx, gy)) return;\n      dx = group2.x || 0;\n      dy = group2.y || 0;\n      const dw = dx + (group2.width || 0), dh = dy + (group2.height || 0), c2 = group2.clip;\n      if (c2 && (gx < dx || gx > dw || gy < dy || gy > dh)) return;\n      context2.save();\n      context2.translate(dx, dy);\n      dx = gx - dx;\n      dy = gy - dy;\n      if (c2 && hasCornerRadius(group2) && !hitCorner(context2, group2, cx, cy)) {\n        context2.restore();\n        return null;\n      }\n      const fore = group2.strokeForeground, ix = scene.interactive !== false;\n      if (ix && fore && group2.stroke && hitForeground(context2, group2, cx, cy)) {\n        context2.restore();\n        return group2;\n      }\n      hit2 = pickVisit(group2, (mark) => pickMark(mark, dx, dy) ? this.pick(mark, x2, y2, dx, dy) : null);\n      if (!hit2 && ix && (group2.fill || !fore && group2.stroke) && hitBackground(context2, group2, cx, cy)) {\n        hit2 = group2;\n      }\n      context2.restore();\n      return hit2 || null;\n    });\n  }\n  function pickMark(mark, x2, y2) {\n    return (mark.interactive !== false || mark.marktype === \"group\") && mark.bounds && mark.bounds.contains(x2, y2);\n  }\n  var group = {\n    type: \"group\",\n    tag: \"g\",\n    nested: false,\n    attr: attr$5,\n    bound: bound$5,\n    draw: draw$4,\n    pick,\n    isect: intersectRect,\n    content,\n    background: background$1,\n    foreground\n  };\n  var metadata = {\n    \"xmlns\": \"http://www.w3.org/2000/svg\",\n    \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n    \"version\": \"1.1\"\n  };\n  function getImage(item, renderer) {\n    var image2 = item.image;\n    if (!image2 || item.url && item.url !== image2.url) {\n      image2 = {\n        complete: false,\n        width: 0,\n        height: 0\n      };\n      renderer.loadImage(item.url).then((image3) => {\n        item.image = image3;\n        item.image.url = item.url;\n      });\n    }\n    return image2;\n  }\n  function imageWidth(item, image2) {\n    return item.width != null ? item.width : !image2 || !image2.width ? 0 : item.aspect !== false && item.height ? item.height * image2.width / image2.height : image2.width;\n  }\n  function imageHeight(item, image2) {\n    return item.height != null ? item.height : !image2 || !image2.height ? 0 : item.aspect !== false && item.width ? item.width * image2.height / image2.width : image2.height;\n  }\n  function imageXOffset(align, w2) {\n    return align === \"center\" ? w2 / 2 : align === \"right\" ? w2 : 0;\n  }\n  function imageYOffset(baseline2, h2) {\n    return baseline2 === \"middle\" ? h2 / 2 : baseline2 === \"bottom\" ? h2 : 0;\n  }\n  function attr$4(emit2, item, renderer) {\n    const img = getImage(item, renderer), w2 = imageWidth(item, img), h2 = imageHeight(item, img), x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2), i = !img.src && img.toDataURL ? img.toDataURL() : img.src || \"\";\n    emit2(\"href\", i, metadata[\"xmlns:xlink\"], \"xlink:href\");\n    emit2(\"transform\", translate$1(x2, y2));\n    emit2(\"width\", w2);\n    emit2(\"height\", h2);\n    emit2(\"preserveAspectRatio\", item.aspect === false ? \"none\" : \"xMidYMid\");\n  }\n  function bound$4(bounds2, item) {\n    const img = item.image, w2 = imageWidth(item, img), h2 = imageHeight(item, img), x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2);\n    return bounds2.set(x2, y2, x2 + w2, y2 + h2);\n  }\n  function draw$3(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      if (bounds2 && !bounds2.intersects(item.bounds)) return;\n      const img = getImage(item, this);\n      let w2 = imageWidth(item, img);\n      let h2 = imageHeight(item, img);\n      if (w2 === 0 || h2 === 0) return;\n      let x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2), opacity2, ar0, ar1, t;\n      if (item.aspect !== false) {\n        ar0 = img.width / img.height;\n        ar1 = item.width / item.height;\n        if (ar0 === ar0 && ar1 === ar1 && ar0 !== ar1) {\n          if (ar1 < ar0) {\n            t = w2 / ar0;\n            y2 += (h2 - t) / 2;\n            h2 = t;\n          } else {\n            t = h2 * ar0;\n            x2 += (w2 - t) / 2;\n            w2 = t;\n          }\n        }\n      }\n      if (img.complete || img.toDataURL) {\n        blend(context2, item);\n        context2.globalAlpha = (opacity2 = item.opacity) != null ? opacity2 : 1;\n        context2.imageSmoothingEnabled = item.smooth !== false;\n        context2.drawImage(img, x2, y2, w2, h2);\n      }\n    });\n  }\n  var image = {\n    type: \"image\",\n    tag: \"image\",\n    nested: false,\n    attr: attr$4,\n    bound: bound$4,\n    draw: draw$3,\n    pick: pick$1(),\n    isect: truthy,\n    // bounds check is sufficient\n    get: getImage,\n    xOffset: imageXOffset,\n    yOffset: imageYOffset\n  };\n  var line$2 = markMultiItemPath(\"line\", line$1, pickLine);\n  function attr$3(emit2, item) {\n    var sx = item.scaleX || 1, sy = item.scaleY || 1;\n    if (sx !== 1 || sy !== 1) {\n      emit2(\"vector-effect\", \"non-scaling-stroke\");\n    }\n    emit2(\"transform\", transformItem(item));\n    emit2(\"d\", item.path);\n  }\n  function path$1(context2, item) {\n    var path2 = item.path;\n    if (path2 == null) return true;\n    var x2 = item.x || 0, y2 = item.y || 0, sx = item.scaleX || 1, sy = item.scaleY || 1, a2 = (item.angle || 0) * DegToRad, cache2 = item.pathCache;\n    if (!cache2 || cache2.path !== path2) {\n      (item.pathCache = cache2 = parse$3(path2)).path = path2;\n    }\n    if (a2 && context2.rotate && context2.translate) {\n      context2.translate(x2, y2);\n      context2.rotate(a2);\n      pathRender(context2, cache2, 0, 0, sx, sy);\n      context2.rotate(-a2);\n      context2.translate(-x2, -y2);\n    } else {\n      pathRender(context2, cache2, x2, y2, sx, sy);\n    }\n  }\n  function bound$3(bounds2, item) {\n    return path$1(boundContext(bounds2, item.angle), item) ? bounds2.set(0, 0, 0, 0) : boundStroke(bounds2, item, true);\n  }\n  var path$2 = {\n    type: \"path\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$3,\n    bound: bound$3,\n    draw: drawAll(path$1),\n    pick: pickPath(path$1),\n    isect: intersectPath(path$1)\n  };\n  function attr$2(emit2, item) {\n    emit2(\"d\", rectangle(null, item));\n  }\n  function bound$2(bounds2, item) {\n    var x2, y2;\n    return boundStroke(bounds2.set(x2 = item.x || 0, y2 = item.y || 0, x2 + item.width || 0, y2 + item.height || 0), item);\n  }\n  function draw$2(context2, item) {\n    context2.beginPath();\n    rectangle(context2, item);\n  }\n  var rect = {\n    type: \"rect\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$2,\n    bound: bound$2,\n    draw: drawAll(draw$2),\n    pick: pickPath(draw$2),\n    isect: intersectRect\n  };\n  function attr$1(emit2, item) {\n    emit2(\"transform\", translateItem(item));\n    emit2(\"x2\", item.x2 != null ? item.x2 - (item.x || 0) : 0);\n    emit2(\"y2\", item.y2 != null ? item.y2 - (item.y || 0) : 0);\n  }\n  function bound$1(bounds2, item) {\n    var x12, y12;\n    return boundStroke(bounds2.set(x12 = item.x || 0, y12 = item.y || 0, item.x2 != null ? item.x2 : x12, item.y2 != null ? item.y2 : y12), item);\n  }\n  function path(context2, item, opacity2) {\n    var x12, y12, x2, y2;\n    if (item.stroke && stroke(context2, item, opacity2)) {\n      x12 = item.x || 0;\n      y12 = item.y || 0;\n      x2 = item.x2 != null ? item.x2 : x12;\n      y2 = item.y2 != null ? item.y2 : y12;\n      context2.beginPath();\n      context2.moveTo(x12, y12);\n      context2.lineTo(x2, y2);\n      return true;\n    }\n    return false;\n  }\n  function draw$1(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      if (bounds2 && !bounds2.intersects(item.bounds)) return;\n      var opacity2 = item.opacity == null ? 1 : item.opacity;\n      if (opacity2 && path(context2, item, opacity2)) {\n        blend(context2, item);\n        context2.stroke();\n      }\n    });\n  }\n  function hit$1(context2, item, x2, y2) {\n    if (!context2.isPointInStroke) return false;\n    return path(context2, item, 1) && context2.isPointInStroke(x2, y2);\n  }\n  var rule$1 = {\n    type: \"rule\",\n    tag: \"line\",\n    nested: false,\n    attr: attr$1,\n    bound: bound$1,\n    draw: draw$1,\n    pick: pick$1(hit$1),\n    isect: intersectRule\n  };\n  var shape = markItemPath(\"shape\", shape$1);\n  var symbol = markItemPath(\"symbol\", symbol$1, intersectPoint);\n  const widthCache = lruCache();\n  var textMetrics = {\n    height: fontSize,\n    measureWidth,\n    estimateWidth,\n    width: estimateWidth,\n    canvas: useCanvas\n  };\n  useCanvas(true);\n  function useCanvas(use2) {\n    textMetrics.width = use2 && context$2 ? measureWidth : estimateWidth;\n  }\n  function estimateWidth(item, text2) {\n    return _estimateWidth(textValue(item, text2), fontSize(item));\n  }\n  function _estimateWidth(text2, currentFontHeight) {\n    return ~~(0.8 * text2.length * currentFontHeight);\n  }\n  function measureWidth(item, text2) {\n    return fontSize(item) <= 0 || !(text2 = textValue(item, text2)) ? 0 : _measureWidth(text2, font(item));\n  }\n  function _measureWidth(text2, currentFont) {\n    const key2 = `(${currentFont}) ${text2}`;\n    let width2 = widthCache.get(key2);\n    if (width2 === void 0) {\n      context$2.font = currentFont;\n      width2 = context$2.measureText(text2).width;\n      widthCache.set(key2, width2);\n    }\n    return width2;\n  }\n  function fontSize(item) {\n    return item.fontSize != null ? +item.fontSize || 0 : 11;\n  }\n  function lineHeight(item) {\n    return item.lineHeight != null ? item.lineHeight : fontSize(item) + 2;\n  }\n  function lineArray(_) {\n    return isArray(_) ? _.length > 1 ? _ : _[0] : _;\n  }\n  function textLines(item) {\n    return lineArray(item.lineBreak && item.text && !isArray(item.text) ? item.text.split(item.lineBreak) : item.text);\n  }\n  function multiLineOffset(item) {\n    const tl2 = textLines(item);\n    return (isArray(tl2) ? tl2.length - 1 : 0) * lineHeight(item);\n  }\n  function textValue(item, line2) {\n    const text2 = line2 == null ? \"\" : (line2 + \"\").trim();\n    return item.limit > 0 && text2.length ? truncate(item, text2) : text2;\n  }\n  function widthGetter(item) {\n    if (textMetrics.width === measureWidth) {\n      const currentFont = font(item);\n      return (text2) => _measureWidth(text2, currentFont);\n    } else if (textMetrics.width === estimateWidth) {\n      const currentFontHeight = fontSize(item);\n      return (text2) => _estimateWidth(text2, currentFontHeight);\n    } else {\n      return (text2) => textMetrics.width(item, text2);\n    }\n  }\n  function truncate(item, text2) {\n    var limit = +item.limit, width2 = widthGetter(item);\n    if (width2(text2) < limit) return text2;\n    var ellipsis = item.ellipsis || \"…\", rtl = item.dir === \"rtl\", lo = 0, hi = text2.length, mid;\n    limit -= width2(ellipsis);\n    if (rtl) {\n      while (lo < hi) {\n        mid = lo + hi >>> 1;\n        if (width2(text2.slice(mid)) > limit) lo = mid + 1;\n        else hi = mid;\n      }\n      return ellipsis + text2.slice(lo);\n    } else {\n      while (lo < hi) {\n        mid = 1 + (lo + hi >>> 1);\n        if (width2(text2.slice(0, mid)) < limit) lo = mid;\n        else hi = mid - 1;\n      }\n      return text2.slice(0, lo) + ellipsis;\n    }\n  }\n  function fontFamily(item, quote) {\n    var font2 = item.font;\n    return (quote && font2 ? String(font2).replace(/\"/g, \"'\") : font2) || \"sans-serif\";\n  }\n  function font(item, quote) {\n    return (item.fontStyle ? item.fontStyle + \" \" : \"\") + (item.fontVariant ? item.fontVariant + \" \" : \"\") + (item.fontWeight ? item.fontWeight + \" \" : \"\") + fontSize(item) + \"px \" + fontFamily(item, quote);\n  }\n  function offset$2(item) {\n    var baseline2 = item.baseline, h2 = fontSize(item);\n    return Math.round(baseline2 === \"top\" ? 0.79 * h2 : baseline2 === \"middle\" ? 0.3 * h2 : baseline2 === \"bottom\" ? -0.21 * h2 : baseline2 === \"line-top\" ? 0.29 * h2 + 0.5 * lineHeight(item) : baseline2 === \"line-bottom\" ? 0.29 * h2 - 0.5 * lineHeight(item) : 0);\n  }\n  const textAlign = {\n    \"left\": \"start\",\n    \"center\": \"middle\",\n    \"right\": \"end\"\n  };\n  const tempBounds$1 = new Bounds();\n  function anchorPoint(item) {\n    var x2 = item.x || 0, y2 = item.y || 0, r = item.radius || 0, t;\n    if (r) {\n      t = (item.theta || 0) - HalfPi;\n      x2 += r * Math.cos(t);\n      y2 += r * Math.sin(t);\n    }\n    tempBounds$1.x1 = x2;\n    tempBounds$1.y1 = y2;\n    return tempBounds$1;\n  }\n  function attr(emit2, item) {\n    var dx = item.dx || 0, dy = (item.dy || 0) + offset$2(item), p = anchorPoint(item), x2 = p.x1, y2 = p.y1, a2 = item.angle || 0, t;\n    emit2(\"text-anchor\", textAlign[item.align] || \"start\");\n    if (a2) {\n      t = translate$1(x2, y2) + \" \" + rotate(a2);\n      if (dx || dy) t += \" \" + translate$1(dx, dy);\n    } else {\n      t = translate$1(x2 + dx, y2 + dy);\n    }\n    emit2(\"transform\", t);\n  }\n  function bound(bounds2, item, mode) {\n    var h2 = textMetrics.height(item), a2 = item.align, p = anchorPoint(item), x2 = p.x1, y2 = p.y1, dx = item.dx || 0, dy = (item.dy || 0) + offset$2(item) - Math.round(0.8 * h2), tl2 = textLines(item), w2;\n    if (isArray(tl2)) {\n      h2 += lineHeight(item) * (tl2.length - 1);\n      w2 = tl2.reduce((w3, t) => Math.max(w3, textMetrics.width(item, t)), 0);\n    } else {\n      w2 = textMetrics.width(item, tl2);\n    }\n    if (a2 === \"center\") {\n      dx -= w2 / 2;\n    } else if (a2 === \"right\") {\n      dx -= w2;\n    } else ;\n    bounds2.set(dx += x2, dy += y2, dx + w2, dy + h2);\n    if (item.angle && !mode) {\n      bounds2.rotate(item.angle * DegToRad, x2, y2);\n    } else if (mode === 2) {\n      return bounds2.rotatedPoints(item.angle * DegToRad, x2, y2);\n    }\n    return bounds2;\n  }\n  function draw$5(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      var opacity2 = item.opacity == null ? 1 : item.opacity, p, x2, y2, i, lh, tl2, str;\n      if (bounds2 && !bounds2.intersects(item.bounds) || // bounds check\n      opacity2 === 0 || item.fontSize <= 0 || item.text == null || item.text.length === 0) return;\n      context2.font = font(item);\n      context2.textAlign = item.align || \"left\";\n      p = anchorPoint(item);\n      x2 = p.x1, y2 = p.y1;\n      if (item.angle) {\n        context2.save();\n        context2.translate(x2, y2);\n        context2.rotate(item.angle * DegToRad);\n        x2 = y2 = 0;\n      }\n      x2 += item.dx || 0;\n      y2 += (item.dy || 0) + offset$2(item);\n      tl2 = textLines(item);\n      blend(context2, item);\n      if (isArray(tl2)) {\n        lh = lineHeight(item);\n        for (i = 0; i < tl2.length; ++i) {\n          str = textValue(item, tl2[i]);\n          if (item.fill && fill(context2, item, opacity2)) {\n            context2.fillText(str, x2, y2);\n          }\n          if (item.stroke && stroke(context2, item, opacity2)) {\n            context2.strokeText(str, x2, y2);\n          }\n          y2 += lh;\n        }\n      } else {\n        str = textValue(item, tl2);\n        if (item.fill && fill(context2, item, opacity2)) {\n          context2.fillText(str, x2, y2);\n        }\n        if (item.stroke && stroke(context2, item, opacity2)) {\n          context2.strokeText(str, x2, y2);\n        }\n      }\n      if (item.angle) context2.restore();\n    });\n  }\n  function hit(context2, item, x2, y2, gx, gy) {\n    if (item.fontSize <= 0) return false;\n    if (!item.angle) return true;\n    var p = anchorPoint(item), ax = p.x1, ay = p.y1, b2 = bound(tempBounds$1, item, 1), a2 = -item.angle * DegToRad, cos2 = Math.cos(a2), sin2 = Math.sin(a2), px2 = cos2 * gx - sin2 * gy + (ax - cos2 * ax + sin2 * ay), py2 = sin2 * gx + cos2 * gy + (ay - sin2 * ax - cos2 * ay);\n    return b2.contains(px2, py2);\n  }\n  function intersectText(item, box2) {\n    const p = bound(tempBounds$1, item, 2);\n    return intersectBoxLine(box2, p[0], p[1], p[2], p[3]) || intersectBoxLine(box2, p[0], p[1], p[4], p[5]) || intersectBoxLine(box2, p[4], p[5], p[6], p[7]) || intersectBoxLine(box2, p[2], p[3], p[6], p[7]);\n  }\n  var text = {\n    type: \"text\",\n    tag: \"text\",\n    nested: false,\n    attr,\n    bound,\n    draw: draw$5,\n    pick: pick$1(hit),\n    isect: intersectText\n  };\n  var trail = markMultiItemPath(\"trail\", trail$1, pickTrail);\n  var Marks = {\n    arc: arc$2,\n    area: area$2,\n    group,\n    image,\n    line: line$2,\n    path: path$2,\n    rect,\n    rule: rule$1,\n    shape,\n    symbol,\n    text,\n    trail\n  };\n  function boundItem$1(item, func, opt) {\n    var type2 = Marks[item.mark.marktype], bound2 = func || type2.bound;\n    if (type2.nested) item = item.mark;\n    return bound2(item.bounds || (item.bounds = new Bounds()), item, opt);\n  }\n  var DUMMY = {\n    mark: null\n  };\n  function boundMark(mark, bounds2, opt) {\n    var type2 = Marks[mark.marktype], bound2 = type2.bound, items = mark.items, hasItems = items && items.length, i, n, item, b2;\n    if (type2.nested) {\n      if (hasItems) {\n        item = items[0];\n      } else {\n        DUMMY.mark = mark;\n        item = DUMMY;\n      }\n      b2 = boundItem$1(item, bound2, opt);\n      bounds2 = bounds2 && bounds2.union(b2) || b2;\n      return bounds2;\n    }\n    bounds2 = bounds2 || mark.bounds && mark.bounds.clear() || new Bounds();\n    if (hasItems) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        bounds2.union(boundItem$1(items[i], bound2, opt));\n      }\n    }\n    return mark.bounds = bounds2;\n  }\n  const keys$1 = [\n    \"marktype\",\n    \"name\",\n    \"role\",\n    \"interactive\",\n    \"clip\",\n    \"items\",\n    \"zindex\",\n    \"x\",\n    \"y\",\n    \"width\",\n    \"height\",\n    \"align\",\n    \"baseline\",\n    // layout\n    \"fill\",\n    \"fillOpacity\",\n    \"opacity\",\n    \"blend\",\n    // fill\n    \"stroke\",\n    \"strokeOpacity\",\n    \"strokeWidth\",\n    \"strokeCap\",\n    // stroke\n    \"strokeDash\",\n    \"strokeDashOffset\",\n    // stroke dash\n    \"strokeForeground\",\n    \"strokeOffset\",\n    // group\n    \"startAngle\",\n    \"endAngle\",\n    \"innerRadius\",\n    \"outerRadius\",\n    // arc\n    \"cornerRadius\",\n    \"padAngle\",\n    // arc, rect\n    \"cornerRadiusTopLeft\",\n    \"cornerRadiusTopRight\",\n    // rect, group\n    \"cornerRadiusBottomLeft\",\n    \"cornerRadiusBottomRight\",\n    \"interpolate\",\n    \"tension\",\n    \"orient\",\n    \"defined\",\n    // area, line\n    \"url\",\n    \"aspect\",\n    \"smooth\",\n    // image\n    \"path\",\n    \"scaleX\",\n    \"scaleY\",\n    // path\n    \"x2\",\n    \"y2\",\n    // rule\n    \"size\",\n    \"shape\",\n    // symbol\n    \"text\",\n    \"angle\",\n    \"theta\",\n    \"radius\",\n    \"dir\",\n    \"dx\",\n    \"dy\",\n    // text\n    \"ellipsis\",\n    \"limit\",\n    \"lineBreak\",\n    \"lineHeight\",\n    \"font\",\n    \"fontSize\",\n    \"fontWeight\",\n    \"fontStyle\",\n    \"fontVariant\",\n    // font\n    \"description\",\n    \"aria\",\n    \"ariaRole\",\n    \"ariaRoleDescription\"\n    // aria\n  ];\n  function sceneToJSON(scene, indent) {\n    return JSON.stringify(scene, keys$1, indent);\n  }\n  function sceneFromJSON(json2) {\n    const scene = typeof json2 === \"string\" ? JSON.parse(json2) : json2;\n    return initialize$1(scene);\n  }\n  function initialize$1(scene) {\n    var type2 = scene.marktype, items = scene.items, parent, i, n;\n    if (items) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        parent = type2 ? \"mark\" : \"group\";\n        items[i][parent] = scene;\n        if (items[i].zindex) items[i][parent].zdirty = true;\n        if (\"group\" === (type2 || parent)) initialize$1(items[i]);\n      }\n    }\n    if (type2) boundMark(scene);\n    return scene;\n  }\n  class Scenegraph {\n    constructor(scene) {\n      if (arguments.length) {\n        this.root = sceneFromJSON(scene);\n      } else {\n        this.root = createMark({\n          marktype: \"group\",\n          name: \"root\",\n          role: \"frame\"\n        });\n        this.root.items = [new GroupItem(this.root)];\n      }\n    }\n    toJSON(indent) {\n      return sceneToJSON(this.root, indent || 0);\n    }\n    mark(markdef, group2, index2) {\n      group2 = group2 || this.root.items[0];\n      const mark = createMark(markdef, group2);\n      group2.items[index2] = mark;\n      if (mark.zindex) mark.group.zdirty = true;\n      return mark;\n    }\n  }\n  function createMark(def2, group2) {\n    const mark = {\n      bounds: new Bounds(),\n      clip: !!def2.clip,\n      group: group2,\n      interactive: def2.interactive === false ? false : true,\n      items: [],\n      marktype: def2.marktype,\n      name: def2.name || void 0,\n      role: def2.role || void 0,\n      zindex: def2.zindex || 0\n    };\n    if (def2.aria != null) {\n      mark.aria = def2.aria;\n    }\n    if (def2.description) {\n      mark.description = def2.description;\n    }\n    return mark;\n  }\n  function domCreate(doc, tag, ns) {\n    if (!doc && typeof document !== \"undefined\" && document.createElement) {\n      doc = document;\n    }\n    return doc ? ns ? doc.createElementNS(ns, tag) : doc.createElement(tag) : null;\n  }\n  function domFind(el, tag) {\n    tag = tag.toLowerCase();\n    var nodes = el.childNodes, i = 0, n = nodes.length;\n    for (; i < n; ++i) if (nodes[i].tagName.toLowerCase() === tag) {\n      return nodes[i];\n    }\n  }\n  function domChild(el, index2, tag, ns) {\n    var a2 = el.childNodes[index2], b2;\n    if (!a2 || a2.tagName.toLowerCase() !== tag.toLowerCase()) {\n      b2 = a2 || null;\n      a2 = domCreate(el.ownerDocument, tag, ns);\n      el.insertBefore(a2, b2);\n    }\n    return a2;\n  }\n  function domClear(el, index2) {\n    var nodes = el.childNodes, curr = nodes.length;\n    while (curr > index2) el.removeChild(nodes[--curr]);\n    return el;\n  }\n  function cssClass(mark) {\n    return \"mark-\" + mark.marktype + (mark.role ? \" role-\" + mark.role : \"\") + (mark.name ? \" \" + mark.name : \"\");\n  }\n  function point(event2, el) {\n    const rect2 = el.getBoundingClientRect();\n    return [event2.clientX - rect2.left - (el.clientLeft || 0), event2.clientY - rect2.top - (el.clientTop || 0)];\n  }\n  function resolveItem(item, event2, el, origin) {\n    var mark = item && item.mark, mdef, p;\n    if (mark && (mdef = Marks[mark.marktype]).tip) {\n      p = point(event2, el);\n      p[0] -= origin[0];\n      p[1] -= origin[1];\n      while (item = item.mark.group) {\n        p[0] -= item.x || 0;\n        p[1] -= item.y || 0;\n      }\n      item = mdef.tip(mark.items, p);\n    }\n    return item;\n  }\n  class Handler {\n    /**\n     * Create a new Handler instance.\n     * @param {object} [customLoader] - Optional loader instance for\n     *   href URL sanitization. If not specified, a standard loader\n     *   instance will be generated.\n     * @param {function} [customTooltip] - Optional tooltip handler\n     *   function for custom tooltip display.\n     * @constructor\n     */\n    constructor(customLoader, customTooltip) {\n      this._active = null;\n      this._handlers = {};\n      this._loader = customLoader || loader();\n      this._tooltip = customTooltip || defaultTooltip$1;\n    }\n    /**\n     * Initialize a new Handler instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {object} [obj] - Optional context object that should serve as\n     *   the \"this\" context for event callbacks.\n     * @return {Handler} - This handler instance.\n     */\n    initialize(el, origin, obj2) {\n      this._el = el;\n      this._obj = obj2 || null;\n      return this.origin(origin);\n    }\n    /**\n     * Returns the parent container element for a visualization.\n     * @return {DOMElement} - The containing DOM element.\n     */\n    element() {\n      return this._el;\n    }\n    /**\n     * Returns the scene element (e.g., canvas or SVG) of the visualization\n     * Subclasses must override if the first child is not the scene element.\n     * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n     */\n    canvas() {\n      return this._el && this._el.firstChild;\n    }\n    /**\n     * Get / set the origin coordinates of the visualization.\n     */\n    origin(origin) {\n      if (arguments.length) {\n        this._origin = origin || [0, 0];\n        return this;\n      } else {\n        return this._origin.slice();\n      }\n    }\n    /**\n     * Get / set the scenegraph root.\n     */\n    scene(scene) {\n      if (!arguments.length) return this._scene;\n      this._scene = scene;\n      return this;\n    }\n    /**\n     * Add an event handler. Subclasses should override this method.\n     */\n    on() {\n    }\n    /**\n     * Remove an event handler. Subclasses should override this method.\n     */\n    off() {\n    }\n    /**\n     * Utility method for finding the array index of an event handler.\n     * @param {Array} h - An array of registered event handlers.\n     * @param {string} type - The event type.\n     * @param {function} handler - The event handler instance to find.\n     * @return {number} - The handler's array index or -1 if not registered.\n     */\n    _handlerIndex(h2, type2, handler) {\n      for (let i = h2 ? h2.length : 0; --i >= 0; ) {\n        if (h2[i].type === type2 && (!handler || h2[i].handler === handler)) {\n          return i;\n        }\n      }\n      return -1;\n    }\n    /**\n     * Returns an array with registered event handlers.\n     * @param {string} [type] - The event type to query. Any annotations\n     *   are ignored; for example, for the argument \"click.foo\", \".foo\" will\n     *   be ignored and the method returns all \"click\" handlers. If type is\n     *   null or unspecified, this method returns handlers for all types.\n     * @return {Array} - A new array containing all registered event handlers.\n     */\n    handlers(type2) {\n      const h2 = this._handlers, a2 = [];\n      if (type2) {\n        a2.push(...h2[this.eventName(type2)]);\n      } else {\n        for (const k in h2) {\n          a2.push(...h2[k]);\n        }\n      }\n      return a2;\n    }\n    /**\n     * Parses an event name string to return the specific event type.\n     * For example, given \"click.foo\" returns \"click\"\n     * @param {string} name - The input event type string.\n     * @return {string} - A string with the event type only.\n     */\n    eventName(name) {\n      const i = name.indexOf(\".\");\n      return i < 0 ? name : name.slice(0, i);\n    }\n    /**\n     * Handle hyperlink navigation in response to an item.href value.\n     * @param {Event} event - The event triggering hyperlink navigation.\n     * @param {Item} item - The scenegraph item.\n     * @param {string} href - The URL to navigate to.\n     */\n    handleHref(event2, item, href2) {\n      this._loader.sanitize(href2, {\n        context: \"href\"\n      }).then((opt) => {\n        const e = new MouseEvent(event2.type, event2), a2 = domCreate(null, \"a\");\n        for (const name in opt) a2.setAttribute(name, opt[name]);\n        a2.dispatchEvent(e);\n      }).catch(() => {\n      });\n    }\n    /**\n     * Handle tooltip display in response to an item.tooltip value.\n     * @param {Event} event - The event triggering tooltip display.\n     * @param {Item} item - The scenegraph item.\n     * @param {boolean} show - A boolean flag indicating whether\n     *   to show or hide a tooltip for the given item.\n     */\n    handleTooltip(event2, item, show) {\n      if (item && item.tooltip != null) {\n        item = resolveItem(item, event2, this.canvas(), this._origin);\n        const value2 = show && item && item.tooltip || null;\n        this._tooltip.call(this._obj, this, event2, item, value2);\n      }\n    }\n    /**\n     * Returns the size of a scenegraph item and its position relative\n     * to the viewport.\n     * @param {Item} item - The scenegraph item.\n     * @return {object} - A bounding box object (compatible with the\n     *   DOMRect type) consisting of x, y, width, heigh, top, left,\n     *   right, and bottom properties.\n     */\n    getItemBoundingClientRect(item) {\n      const el = this.canvas();\n      if (!el) return;\n      const rect2 = el.getBoundingClientRect(), origin = this._origin, bounds2 = item.bounds, width2 = bounds2.width(), height2 = bounds2.height();\n      let x2 = bounds2.x1 + origin[0] + rect2.left, y2 = bounds2.y1 + origin[1] + rect2.top;\n      while (item.mark && (item = item.mark.group)) {\n        x2 += item.x || 0;\n        y2 += item.y || 0;\n      }\n      return {\n        x: x2,\n        y: y2,\n        width: width2,\n        height: height2,\n        left: x2,\n        top: y2,\n        right: x2 + width2,\n        bottom: y2 + height2\n      };\n    }\n  }\n  function defaultTooltip$1(handler, event2, item, value2) {\n    handler.element().setAttribute(\"title\", value2 || \"\");\n  }\n  class Renderer {\n    /**\n     * Create a new Renderer instance.\n     * @param {object} [loader] - Optional loader instance for\n     *   image and href URL sanitization. If not specified, a\n     *   standard loader instance will be generated.\n     * @constructor\n     */\n    constructor(loader2) {\n      this._el = null;\n      this._bgcolor = null;\n      this._loader = new ResourceLoader(loader2);\n    }\n    /**\n     * Initialize a new Renderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {Renderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._el = el;\n      return this.resize(width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Returns the parent container element for a visualization.\n     * @return {DOMElement} - The containing DOM element.\n     */\n    element() {\n      return this._el;\n    }\n    /**\n     * Returns the scene element (e.g., canvas or SVG) of the visualization\n     * Subclasses must override if the first child is not the scene element.\n     * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n     */\n    canvas() {\n      return this._el && this._el.firstChild;\n    }\n    /**\n     * Get / set the background color.\n     */\n    background(bgcolor) {\n      if (arguments.length === 0) return this._bgcolor;\n      this._bgcolor = bgcolor;\n      return this;\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {Renderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      this._width = width2;\n      this._height = height2;\n      this._origin = origin || [0, 0];\n      this._scale = scaleFactor || 1;\n      return this;\n    }\n    /**\n     * Report a dirty item whose bounds should be redrawn.\n     * This base class method does nothing. Subclasses that perform\n     * incremental should implement this method.\n     * @param {Item} item - The dirty item whose bounds should be redrawn.\n     */\n    dirty() {\n    }\n    /**\n     * Render an input scenegraph, potentially with a set of dirty items.\n     * This method will perform an immediate rendering with available resources.\n     * The renderer may also need to perform image loading to perform a complete\n     * render. This process can lead to asynchronous re-rendering of the scene\n     * after this method returns. To receive notification when rendering is\n     * complete, use the renderAsync method instead.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     * @return {Renderer} - This renderer instance.\n     */\n    render(scene, markTypes) {\n      const r = this;\n      r._call = function() {\n        r._render(scene, markTypes);\n      };\n      r._call();\n      r._call = null;\n      return r;\n    }\n    /**\n     * Internal rendering method. Renderer subclasses should override this\n     * method to actually perform rendering.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render() {\n    }\n    /**\n     * Asynchronous rendering method. Similar to render, but returns a Promise\n     * that resolves when all rendering is completed. Sometimes a renderer must\n     * perform image loading to get a complete rendering. The returned\n     * Promise will not resolve until this process completes.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     * @return {Promise} - A Promise that resolves when rendering is complete.\n     */\n    renderAsync(scene, markTypes) {\n      const r = this.render(scene, markTypes);\n      return this._ready ? this._ready.then(() => r) : Promise.resolve(r);\n    }\n    /**\n     * Internal method for asynchronous resource loading.\n     * Proxies method calls to the ImageLoader, and tracks loading\n     * progress to invoke a re-render once complete.\n     * @param {string} method - The method name to invoke on the ImageLoader.\n     * @param {string} uri - The URI for the requested resource.\n     * @return {Promise} - A Promise that resolves to the requested resource.\n     */\n    _load(method2, uri) {\n      var r = this, p = r._loader[method2](uri);\n      if (!r._ready) {\n        const call = r._call;\n        r._ready = r._loader.ready().then((redraw) => {\n          if (redraw) call();\n          r._ready = null;\n        });\n      }\n      return p;\n    }\n    /**\n     * Sanitize a URL to include as a hyperlink in the rendered scene.\n     * This method proxies a call to ImageLoader.sanitizeURL, but also tracks\n     * image loading progress and invokes a re-render once complete.\n     * @param {string} uri - The URI string to sanitize.\n     * @return {Promise} - A Promise that resolves to the sanitized URL.\n     */\n    sanitizeURL(uri) {\n      return this._load(\"sanitizeURL\", uri);\n    }\n    /**\n     * Requests an image to include in the rendered scene.\n     * This method proxies a call to ImageLoader.loadImage, but also tracks\n     * image loading progress and invokes a re-render once complete.\n     * @param {string} uri - The URI string of the image.\n     * @return {Promise} - A Promise that resolves to the loaded Image.\n     */\n    loadImage(uri) {\n      return this._load(\"loadImage\", uri);\n    }\n  }\n  const KeyDownEvent = \"keydown\";\n  const KeyPressEvent = \"keypress\";\n  const KeyUpEvent = \"keyup\";\n  const DragEnterEvent = \"dragenter\";\n  const DragLeaveEvent = \"dragleave\";\n  const DragOverEvent = \"dragover\";\n  const PointerDownEvent = \"pointerdown\";\n  const PointerUpEvent = \"pointerup\";\n  const PointerMoveEvent = \"pointermove\";\n  const PointerOutEvent = \"pointerout\";\n  const PointerOverEvent = \"pointerover\";\n  const MouseDownEvent = \"mousedown\";\n  const MouseUpEvent = \"mouseup\";\n  const MouseMoveEvent = \"mousemove\";\n  const MouseOutEvent = \"mouseout\";\n  const MouseOverEvent = \"mouseover\";\n  const ClickEvent = \"click\";\n  const DoubleClickEvent = \"dblclick\";\n  const WheelEvent = \"wheel\";\n  const MouseWheelEvent = \"mousewheel\";\n  const TouchStartEvent = \"touchstart\";\n  const TouchMoveEvent = \"touchmove\";\n  const TouchEndEvent = \"touchend\";\n  const Events = [KeyDownEvent, KeyPressEvent, KeyUpEvent, DragEnterEvent, DragLeaveEvent, DragOverEvent, PointerDownEvent, PointerUpEvent, PointerMoveEvent, PointerOutEvent, PointerOverEvent, MouseDownEvent, MouseUpEvent, MouseMoveEvent, MouseOutEvent, MouseOverEvent, ClickEvent, DoubleClickEvent, WheelEvent, MouseWheelEvent, TouchStartEvent, TouchMoveEvent, TouchEndEvent];\n  const TooltipShowEvent = PointerMoveEvent;\n  const TooltipHideEvent = MouseOutEvent;\n  const HrefEvent = ClickEvent;\n  class CanvasHandler extends Handler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n      this._down = null;\n      this._touch = null;\n      this._first = true;\n      this._events = {};\n      this.events = Events;\n      this.pointermove = move([PointerMoveEvent, MouseMoveEvent], [PointerOverEvent, MouseOverEvent], [PointerOutEvent, MouseOutEvent]);\n      this.dragover = move([DragOverEvent], [DragEnterEvent], [DragLeaveEvent]), this.pointerout = inactive([PointerOutEvent, MouseOutEvent]);\n      this.dragleave = inactive([DragLeaveEvent]);\n    }\n    initialize(el, origin, obj2) {\n      this._canvas = el && domFind(el, \"canvas\");\n      [ClickEvent, MouseDownEvent, PointerDownEvent, PointerMoveEvent, PointerOutEvent, DragLeaveEvent].forEach((type2) => eventListenerCheck(this, type2));\n      return super.initialize(el, origin, obj2);\n    }\n    // return the backing canvas instance\n    canvas() {\n      return this._canvas;\n    }\n    // retrieve the current canvas context\n    context() {\n      return this._canvas.getContext(\"2d\");\n    }\n    // to keep old versions of firefox happy\n    DOMMouseScroll(evt) {\n      this.fire(MouseWheelEvent, evt);\n    }\n    pointerdown(evt) {\n      this._down = this._active;\n      this.fire(PointerDownEvent, evt);\n    }\n    mousedown(evt) {\n      this._down = this._active;\n      this.fire(MouseDownEvent, evt);\n    }\n    click(evt) {\n      if (this._down === this._active) {\n        this.fire(ClickEvent, evt);\n        this._down = null;\n      }\n    }\n    touchstart(evt) {\n      this._touch = this.pickEvent(evt.changedTouches[0]);\n      if (this._first) {\n        this._active = this._touch;\n        this._first = false;\n      }\n      this.fire(TouchStartEvent, evt, true);\n    }\n    touchmove(evt) {\n      this.fire(TouchMoveEvent, evt, true);\n    }\n    touchend(evt) {\n      this.fire(TouchEndEvent, evt, true);\n      this._touch = null;\n    }\n    // fire an event\n    fire(type2, evt, touch2) {\n      const a2 = touch2 ? this._touch : this._active, h2 = this._handlers[type2];\n      evt.vegaType = type2;\n      if (type2 === HrefEvent && a2 && a2.href) {\n        this.handleHref(evt, a2, a2.href);\n      } else if (type2 === TooltipShowEvent || type2 === TooltipHideEvent) {\n        this.handleTooltip(evt, a2, type2 !== TooltipHideEvent);\n      }\n      if (h2) {\n        for (let i = 0, len2 = h2.length; i < len2; ++i) {\n          h2[i].handler.call(this._obj, evt, a2);\n        }\n      }\n    }\n    // add an event handler\n    on(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers, i = this._handlerIndex(h2[name], type2, handler);\n      if (i < 0) {\n        eventListenerCheck(this, type2);\n        (h2[name] || (h2[name] = [])).push({\n          type: type2,\n          handler\n        });\n      }\n      return this;\n    }\n    // remove an event handler\n    off(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers[name], i = this._handlerIndex(h2, type2, handler);\n      if (i >= 0) {\n        h2.splice(i, 1);\n      }\n      return this;\n    }\n    pickEvent(evt) {\n      const p = point(evt, this._canvas), o = this._origin;\n      return this.pick(this._scene, p[0], p[1], p[0] - o[0], p[1] - o[1]);\n    }\n    // find the scenegraph item at the current pointer position\n    // x, y -- the absolute x, y pointer coordinates on the canvas element\n    // gx, gy -- the relative coordinates within the current group\n    pick(scene, x2, y2, gx, gy) {\n      const g = this.context(), mark = Marks[scene.marktype];\n      return mark.pick.call(this, g, scene, x2, y2, gx, gy);\n    }\n  }\n  const eventBundle = (type2) => type2 === TouchStartEvent || type2 === TouchMoveEvent || type2 === TouchEndEvent ? [TouchStartEvent, TouchMoveEvent, TouchEndEvent] : [type2];\n  function eventListenerCheck(handler, type2) {\n    eventBundle(type2).forEach((_) => addEventListener(handler, _));\n  }\n  function addEventListener(handler, type2) {\n    const canvas = handler.canvas();\n    if (canvas && !handler._events[type2]) {\n      handler._events[type2] = 1;\n      canvas.addEventListener(type2, handler[type2] ? (evt) => handler[type2](evt) : (evt) => handler.fire(type2, evt));\n    }\n  }\n  function fireAll(handler, types2, event2) {\n    types2.forEach((type2) => handler.fire(type2, event2));\n  }\n  function move(moveEvents, overEvents, outEvents) {\n    return function(evt) {\n      const a2 = this._active, p = this.pickEvent(evt);\n      if (p === a2) {\n        fireAll(this, moveEvents, evt);\n      } else {\n        if (!a2 || !a2.exit) {\n          fireAll(this, outEvents, evt);\n        }\n        this._active = p;\n        fireAll(this, overEvents, evt);\n        fireAll(this, moveEvents, evt);\n      }\n    };\n  }\n  function inactive(types2) {\n    return function(evt) {\n      fireAll(this, types2, evt);\n      this._active = null;\n    };\n  }\n  function devicePixelRatio$1() {\n    return typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1;\n  }\n  function resize(canvas, width2, height2, origin, scaleFactor, opt) {\n    const inDOM = typeof HTMLElement !== \"undefined\" && canvas instanceof HTMLElement && canvas.parentNode != null, context2 = canvas.getContext(\"2d\"), ratio = inDOM ? devicePixelRatio$1() : scaleFactor;\n    canvas.width = width2 * ratio;\n    canvas.height = height2 * ratio;\n    for (const key2 in opt) {\n      context2[key2] = opt[key2];\n    }\n    if (inDOM && ratio !== 1) {\n      canvas.style.width = width2 + \"px\";\n      canvas.style.height = height2 + \"px\";\n    }\n    context2.pixelRatio = ratio;\n    context2.setTransform(ratio, 0, 0, ratio, ratio * origin[0], ratio * origin[1]);\n    return canvas;\n  }\n  class CanvasRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._options = {};\n      this._redraw = false;\n      this._dirty = new Bounds();\n      this._tempb = new Bounds();\n    }\n    initialize(el, width2, height2, origin, scaleFactor, options2) {\n      this._options = options2 || {};\n      this._canvas = this._options.externalContext ? null : domCanvas(1, 1, this._options.type);\n      if (el && this._canvas) {\n        domClear(el, 0).appendChild(this._canvas);\n        this._canvas.setAttribute(\"class\", \"marks\");\n      }\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      if (this._canvas) {\n        resize(this._canvas, this._width, this._height, this._origin, this._scale, this._options.context);\n      } else {\n        const ctx = this._options.externalContext;\n        if (!ctx) error(\"CanvasRenderer is missing a valid canvas or context\");\n        ctx.scale(this._scale, this._scale);\n        ctx.translate(this._origin[0], this._origin[1]);\n      }\n      this._redraw = true;\n      return this;\n    }\n    canvas() {\n      return this._canvas;\n    }\n    context() {\n      return this._options.externalContext || (this._canvas ? this._canvas.getContext(\"2d\") : null);\n    }\n    dirty(item) {\n      const b2 = this._tempb.clear().union(item.bounds);\n      let g = item.mark.group;\n      while (g) {\n        b2.translate(g.x || 0, g.y || 0);\n        g = g.mark.group;\n      }\n      this._dirty.union(b2);\n    }\n    _render(scene, markTypes) {\n      const g = this.context(), o = this._origin, w2 = this._width, h2 = this._height, db = this._dirty, vb = viewBounds(o, w2, h2);\n      g.save();\n      const b2 = this._redraw || db.empty() ? (this._redraw = false, vb.expand(1)) : clipToBounds(g, vb.intersect(db), o);\n      this.clear(-o[0], -o[1], w2, h2);\n      this.draw(g, scene, b2, markTypes);\n      g.restore();\n      db.clear();\n      return this;\n    }\n    draw(ctx, scene, bounds2, markTypes) {\n      if (scene.marktype !== \"group\" && markTypes != null && !markTypes.includes(scene.marktype)) {\n        return;\n      }\n      const mark = Marks[scene.marktype];\n      if (scene.clip) clip$2(ctx, scene);\n      mark.draw.call(this, ctx, scene, bounds2, markTypes);\n      if (scene.clip) ctx.restore();\n    }\n    clear(x2, y2, w2, h2) {\n      const opt = this._options, g = this.context();\n      if (opt.type !== \"pdf\" && !opt.externalContext) {\n        g.clearRect(x2, y2, w2, h2);\n      }\n      if (this._bgcolor != null) {\n        g.fillStyle = this._bgcolor;\n        g.fillRect(x2, y2, w2, h2);\n      }\n    }\n  }\n  const viewBounds = (origin, width2, height2) => new Bounds().set(0, 0, width2, height2).translate(-origin[0], -origin[1]);\n  function clipToBounds(g, b2, origin) {\n    b2.expand(1).round();\n    if (g.pixelRatio % 1) {\n      b2.scale(g.pixelRatio).round().scale(1 / g.pixelRatio);\n    }\n    b2.translate(-(origin[0] % 1), -(origin[1] % 1));\n    g.beginPath();\n    g.rect(b2.x1, b2.y1, b2.width(), b2.height());\n    g.clip();\n    return b2;\n  }\n  class SVGHandler extends Handler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n      const h2 = this;\n      h2._hrefHandler = listener(h2, (evt, item) => {\n        if (item && item.href) h2.handleHref(evt, item, item.href);\n      });\n      h2._tooltipHandler = listener(h2, (evt, item) => {\n        h2.handleTooltip(evt, item, evt.type !== TooltipHideEvent);\n      });\n    }\n    initialize(el, origin, obj2) {\n      let svg = this._svg;\n      if (svg) {\n        svg.removeEventListener(HrefEvent, this._hrefHandler);\n        svg.removeEventListener(TooltipShowEvent, this._tooltipHandler);\n        svg.removeEventListener(TooltipHideEvent, this._tooltipHandler);\n      }\n      this._svg = svg = el && domFind(el, \"svg\");\n      if (svg) {\n        svg.addEventListener(HrefEvent, this._hrefHandler);\n        svg.addEventListener(TooltipShowEvent, this._tooltipHandler);\n        svg.addEventListener(TooltipHideEvent, this._tooltipHandler);\n      }\n      return super.initialize(el, origin, obj2);\n    }\n    canvas() {\n      return this._svg;\n    }\n    // add an event handler\n    on(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers, i = this._handlerIndex(h2[name], type2, handler);\n      if (i < 0) {\n        const x2 = {\n          type: type2,\n          handler,\n          listener: listener(this, handler)\n        };\n        (h2[name] || (h2[name] = [])).push(x2);\n        if (this._svg) {\n          this._svg.addEventListener(name, x2.listener);\n        }\n      }\n      return this;\n    }\n    // remove an event handler\n    off(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers[name], i = this._handlerIndex(h2, type2, handler);\n      if (i >= 0) {\n        if (this._svg) {\n          this._svg.removeEventListener(name, h2[i].listener);\n        }\n        h2.splice(i, 1);\n      }\n      return this;\n    }\n  }\n  const listener = (context2, handler) => (evt) => {\n    let item = evt.target.__data__;\n    item = Array.isArray(item) ? item[0] : item;\n    evt.vegaType = evt.type;\n    handler.call(context2._obj, evt, item);\n  };\n  const ARIA_HIDDEN = \"aria-hidden\";\n  const ARIA_LABEL = \"aria-label\";\n  const ARIA_ROLE = \"role\";\n  const ARIA_ROLEDESCRIPTION = \"aria-roledescription\";\n  const GRAPHICS_OBJECT = \"graphics-object\";\n  const GRAPHICS_SYMBOL = \"graphics-symbol\";\n  const bundle = (role, roledesc, label2) => ({\n    [ARIA_ROLE]: role,\n    [ARIA_ROLEDESCRIPTION]: roledesc,\n    [ARIA_LABEL]: label2 || void 0\n  });\n  const AriaIgnore = toSet([\"axis-domain\", \"axis-grid\", \"axis-label\", \"axis-tick\", \"axis-title\", \"legend-band\", \"legend-entry\", \"legend-gradient\", \"legend-label\", \"legend-title\", \"legend-symbol\", \"title\"]);\n  const AriaGuides = {\n    \"axis\": {\n      desc: \"axis\",\n      caption: axisCaption\n    },\n    \"legend\": {\n      desc: \"legend\",\n      caption: legendCaption\n    },\n    \"title-text\": {\n      desc: \"title\",\n      caption: (item) => `Title text '${titleCaption(item)}'`\n    },\n    \"title-subtitle\": {\n      desc: \"subtitle\",\n      caption: (item) => `Subtitle text '${titleCaption(item)}'`\n    }\n  };\n  const AriaEncode = {\n    ariaRole: ARIA_ROLE,\n    ariaRoleDescription: ARIA_ROLEDESCRIPTION,\n    description: ARIA_LABEL\n  };\n  function ariaItemAttributes(emit2, item) {\n    const hide = item.aria === false;\n    emit2(ARIA_HIDDEN, hide || void 0);\n    if (hide || item.description == null) {\n      for (const prop in AriaEncode) {\n        emit2(AriaEncode[prop], void 0);\n      }\n    } else {\n      const type2 = item.mark.marktype;\n      emit2(ARIA_LABEL, item.description);\n      emit2(ARIA_ROLE, item.ariaRole || (type2 === \"group\" ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL));\n      emit2(ARIA_ROLEDESCRIPTION, item.ariaRoleDescription || `${type2} mark`);\n    }\n  }\n  function ariaMarkAttributes(mark) {\n    return mark.aria === false ? {\n      [ARIA_HIDDEN]: true\n    } : AriaIgnore[mark.role] ? null : AriaGuides[mark.role] ? ariaGuide(mark, AriaGuides[mark.role]) : ariaMark(mark);\n  }\n  function ariaMark(mark) {\n    const type2 = mark.marktype;\n    const recurse2 = type2 === \"group\" || type2 === \"text\" || mark.items.some((_) => _.description != null && _.aria !== false);\n    return bundle(recurse2 ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL, `${type2} mark container`, mark.description);\n  }\n  function ariaGuide(mark, opt) {\n    try {\n      const item = mark.items[0], caption = opt.caption || (() => \"\");\n      return bundle(opt.role || GRAPHICS_SYMBOL, opt.desc, item.description || caption(item));\n    } catch (err) {\n      return null;\n    }\n  }\n  function titleCaption(item) {\n    return array$4(item.text).join(\" \");\n  }\n  function axisCaption(item) {\n    const datum2 = item.datum, orient = item.orient, title = datum2.title ? extractTitle(item) : null, ctx = item.context, scale2 = ctx.scales[datum2.scale].value, locale2 = ctx.dataflow.locale(), type2 = scale2.type, xy = orient === \"left\" || orient === \"right\" ? \"Y\" : \"X\";\n    return `${xy}-axis` + (title ? ` titled '${title}'` : \"\") + ` for a ${isDiscrete(type2) ? \"discrete\" : type2} scale with ${domainCaption(locale2, scale2, item)}`;\n  }\n  function legendCaption(item) {\n    const datum2 = item.datum, title = datum2.title ? extractTitle(item) : null, type2 = `${datum2.type || \"\"} legend`.trim(), scales2 = datum2.scales, props = Object.keys(scales2), ctx = item.context, scale2 = ctx.scales[scales2[props[0]]].value, locale2 = ctx.dataflow.locale();\n    return capitalize(type2) + (title ? ` titled '${title}'` : \"\") + ` for ${channelCaption(props)} with ${domainCaption(locale2, scale2, item)}`;\n  }\n  function extractTitle(item) {\n    try {\n      return array$4(peek$1(item.items).items[0].text).join(\" \");\n    } catch (err) {\n      return null;\n    }\n  }\n  function channelCaption(props) {\n    props = props.map((p) => p + (p === \"fill\" || p === \"stroke\" ? \" color\" : \"\"));\n    return props.length < 2 ? props[0] : props.slice(0, -1).join(\", \") + \" and \" + peek$1(props);\n  }\n  function capitalize(s2) {\n    return s2.length ? s2[0].toUpperCase() + s2.slice(1) : s2;\n  }\n  const innerText = (val) => (val + \"\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n  const attrText = (val) => innerText(val).replace(/\"/g, \"&quot;\").replace(/\\t/g, \"&#x9;\").replace(/\\n/g, \"&#xA;\").replace(/\\r/g, \"&#xD;\");\n  function markup() {\n    let buf = \"\", outer = \"\", inner = \"\";\n    const stack = [], clear = () => outer = inner = \"\", push2 = (tag) => {\n      if (outer) {\n        buf += `${outer}>${inner}`;\n        clear();\n      }\n      stack.push(tag);\n    }, attr2 = (name, value2) => {\n      if (value2 != null) outer += ` ${name}=\"${attrText(value2)}\"`;\n      return m2;\n    }, m2 = {\n      open(tag, ...attrs) {\n        push2(tag);\n        outer = \"<\" + tag;\n        for (const set2 of attrs) {\n          for (const key2 in set2) attr2(key2, set2[key2]);\n        }\n        return m2;\n      },\n      close() {\n        const tag = stack.pop();\n        if (outer) {\n          buf += outer + (inner ? `>${inner}</${tag}>` : \"/>\");\n        } else {\n          buf += `</${tag}>`;\n        }\n        clear();\n        return m2;\n      },\n      attr: attr2,\n      text: (t) => (inner += innerText(t), m2),\n      toString: () => buf\n    };\n    return m2;\n  }\n  const serializeXML = (node) => _serialize(markup(), node) + \"\";\n  function _serialize(m2, node) {\n    m2.open(node.tagName);\n    if (node.hasAttributes()) {\n      const attrs = node.attributes, n = attrs.length;\n      for (let i = 0; i < n; ++i) {\n        m2.attr(attrs[i].name, attrs[i].value);\n      }\n    }\n    if (node.hasChildNodes()) {\n      const children2 = node.childNodes;\n      for (const child of children2) {\n        child.nodeType === 3 ? m2.text(child.nodeValue) : _serialize(m2, child);\n      }\n    }\n    return m2.close();\n  }\n  const stylesAttr = {\n    fill: \"fill\",\n    fillOpacity: \"fill-opacity\",\n    stroke: \"stroke\",\n    strokeOpacity: \"stroke-opacity\",\n    strokeWidth: \"stroke-width\",\n    strokeCap: \"stroke-linecap\",\n    strokeJoin: \"stroke-linejoin\",\n    strokeDash: \"stroke-dasharray\",\n    strokeDashOffset: \"stroke-dashoffset\",\n    strokeMiterLimit: \"stroke-miterlimit\",\n    opacity: \"opacity\"\n  };\n  const stylesCss = {\n    blend: \"mix-blend-mode\"\n  };\n  const rootAttributes = {\n    \"fill\": \"none\",\n    \"stroke-miterlimit\": 10\n  };\n  const RootIndex = 0, xmlns = \"http://www.w3.org/2000/xmlns/\", svgns = metadata.xmlns;\n  class SVGRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._dirtyID = 0;\n      this._dirty = [];\n      this._svg = null;\n      this._root = null;\n      this._defs = null;\n    }\n    /**\n     * Initialize a new SVGRenderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._defs = {};\n      this._clearDefs();\n      if (el) {\n        this._svg = domChild(el, 0, \"svg\", svgns);\n        this._svg.setAttributeNS(xmlns, \"xmlns\", svgns);\n        this._svg.setAttributeNS(xmlns, \"xmlns:xlink\", metadata[\"xmlns:xlink\"]);\n        this._svg.setAttribute(\"version\", metadata[\"version\"]);\n        this._svg.setAttribute(\"class\", \"marks\");\n        domClear(el, 1);\n        this._root = domChild(this._svg, RootIndex, \"g\", svgns);\n        setAttributes(this._root, rootAttributes);\n        domClear(this._svg, RootIndex + 1);\n      }\n      this.background(this._bgcolor);\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Get / set the background color.\n     */\n    background(bgcolor) {\n      if (arguments.length && this._svg) {\n        this._svg.style.setProperty(\"background-color\", bgcolor);\n      }\n      return super.background(...arguments);\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      if (this._svg) {\n        setAttributes(this._svg, {\n          width: this._width * this._scale,\n          height: this._height * this._scale,\n          viewBox: `0 0 ${this._width} ${this._height}`\n        });\n        this._root.setAttribute(\"transform\", `translate(${this._origin})`);\n      }\n      this._dirty = [];\n      return this;\n    }\n    /**\n     * Returns the SVG element of the visualization.\n     * @return {DOMElement} - The SVG element.\n     */\n    canvas() {\n      return this._svg;\n    }\n    /**\n     * Returns an SVG text string for the rendered content,\n     * or null if this renderer is currently headless.\n     */\n    svg() {\n      const svg = this._svg, bg = this._bgcolor;\n      if (!svg) return null;\n      let node;\n      if (bg) {\n        svg.removeAttribute(\"style\");\n        node = domChild(svg, RootIndex, \"rect\", svgns);\n        setAttributes(node, {\n          width: this._width,\n          height: this._height,\n          fill: bg\n        });\n      }\n      const text2 = serializeXML(svg);\n      if (bg) {\n        svg.removeChild(node);\n        this._svg.style.setProperty(\"background-color\", bg);\n      }\n      return text2;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render(scene, markTypes) {\n      if (this._dirtyCheck()) {\n        if (this._dirtyAll) this._clearDefs();\n        this.mark(this._root, scene, void 0, markTypes);\n        domClear(this._root, 1);\n      }\n      this.defs();\n      this._dirty = [];\n      ++this._dirtyID;\n      return this;\n    }\n    // -- Manage rendering of items marked as dirty --\n    /**\n     * Flag a mark item as dirty.\n     * @param {Item} item - The mark item.\n     */\n    dirty(item) {\n      if (item.dirty !== this._dirtyID) {\n        item.dirty = this._dirtyID;\n        this._dirty.push(item);\n      }\n    }\n    /**\n     * Check if a mark item is considered dirty.\n     * @param {Item} item - The mark item.\n     */\n    isDirty(item) {\n      return this._dirtyAll || !item._svg || !item._svg.ownerSVGElement || item.dirty === this._dirtyID;\n    }\n    /**\n     * Internal method to check dirty status and, if possible,\n     * make targetted updates without a full rendering pass.\n     */\n    _dirtyCheck() {\n      this._dirtyAll = true;\n      const items = this._dirty;\n      if (!items.length || !this._dirtyID) return true;\n      const id2 = ++this._dirtyID;\n      let item, mark, type2, mdef, i, n, o;\n      for (i = 0, n = items.length; i < n; ++i) {\n        item = items[i];\n        mark = item.mark;\n        if (mark.marktype !== type2) {\n          type2 = mark.marktype;\n          mdef = Marks[type2];\n        }\n        if (mark.zdirty && mark.dirty !== id2) {\n          this._dirtyAll = false;\n          dirtyParents(item, id2);\n          mark.items.forEach((i2) => {\n            i2.dirty = id2;\n          });\n        }\n        if (mark.zdirty) continue;\n        if (item.exit) {\n          if (mdef.nested && mark.items.length) {\n            o = mark.items[0];\n            if (o._svg) this._update(mdef, o._svg, o);\n          } else if (item._svg) {\n            o = item._svg.parentNode;\n            if (o) o.removeChild(item._svg);\n          }\n          item._svg = null;\n          continue;\n        }\n        item = mdef.nested ? mark.items[0] : item;\n        if (item._update === id2) continue;\n        if (!item._svg || !item._svg.ownerSVGElement) {\n          this._dirtyAll = false;\n          dirtyParents(item, id2);\n        } else {\n          this._update(mdef, item._svg, item);\n        }\n        item._update = id2;\n      }\n      return !this._dirtyAll;\n    }\n    // -- Construct & maintain scenegraph to SVG mapping ---\n    /**\n     * Render a set of mark items.\n     * @param {SVGElement} el - The parent element in the SVG tree.\n     * @param {object} scene - The mark parent to render.\n     * @param {SVGElement} prev - The previous sibling in the SVG tree.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    mark(el, scene, prev, markTypes) {\n      if (!this.isDirty(scene)) {\n        return scene._svg;\n      }\n      const svg = this._svg, markType2 = scene.marktype, mdef = Marks[markType2], events2 = scene.interactive === false ? \"none\" : null, isGroup = mdef.tag === \"g\";\n      const parent = bind$1(scene, el, prev, \"g\", svg);\n      if (markType2 !== \"group\" && markTypes != null && !markTypes.includes(markType2)) {\n        domClear(parent, 0);\n        return scene._svg;\n      }\n      parent.setAttribute(\"class\", cssClass(scene));\n      const aria = ariaMarkAttributes(scene);\n      for (const key2 in aria) setAttribute(parent, key2, aria[key2]);\n      if (!isGroup) {\n        setAttribute(parent, \"pointer-events\", events2);\n      }\n      setAttribute(parent, \"clip-path\", scene.clip ? clip$1$1(this, scene, scene.group) : null);\n      let sibling = null, i = 0;\n      const process = (item) => {\n        const dirty = this.isDirty(item), node = bind$1(item, parent, sibling, mdef.tag, svg);\n        if (dirty) {\n          this._update(mdef, node, item);\n          if (isGroup) recurse(this, node, item, markTypes);\n        }\n        sibling = node;\n        ++i;\n      };\n      if (mdef.nested) {\n        if (scene.items.length) process(scene.items[0]);\n      } else {\n        visit(scene, process);\n      }\n      domClear(parent, i);\n      return parent;\n    }\n    /**\n     * Update the attributes of an SVG element for a mark item.\n     * @param {object} mdef - The mark definition object\n     * @param {SVGElement} el - The SVG element.\n     * @param {Item} item - The mark item.\n     */\n    _update(mdef, el, item) {\n      element$1 = el;\n      values = el.__values__;\n      ariaItemAttributes(emit, item);\n      mdef.attr(emit, item, this);\n      const extra = mark_extras[mdef.type];\n      if (extra) extra.call(this, mdef, el, item);\n      if (element$1) this.style(element$1, item);\n    }\n    /**\n     * Update the presentation attributes of an SVG element for a mark item.\n     * @param {SVGElement} el - The SVG element.\n     * @param {Item} item - The mark item.\n     */\n    style(el, item) {\n      if (item == null) return;\n      for (const prop in stylesAttr) {\n        let value2 = prop === \"font\" ? fontFamily(item) : item[prop];\n        if (value2 === values[prop]) continue;\n        const name = stylesAttr[prop];\n        if (value2 == null) {\n          el.removeAttribute(name);\n        } else {\n          if (isGradient(value2)) {\n            value2 = gradientRef(value2, this._defs.gradient, href());\n          }\n          el.setAttribute(name, value2 + \"\");\n        }\n        values[prop] = value2;\n      }\n      for (const prop in stylesCss) {\n        setStyle(el, stylesCss[prop], item[prop]);\n      }\n    }\n    /**\n     * Render SVG defs, as needed.\n     * Must be called *after* marks have been processed to ensure the\n     * collected state is current and accurate.\n     */\n    defs() {\n      const svg = this._svg, defs = this._defs;\n      let el = defs.el, index2 = 0;\n      for (const id2 in defs.gradient) {\n        if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n        index2 = updateGradient(el, defs.gradient[id2], index2);\n      }\n      for (const id2 in defs.clipping) {\n        if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n        index2 = updateClipping(el, defs.clipping[id2], index2);\n      }\n      if (el) {\n        index2 === 0 ? (svg.removeChild(el), defs.el = null) : domClear(el, index2);\n      }\n    }\n    /**\n     * Clear defs caches.\n     */\n    _clearDefs() {\n      const def2 = this._defs;\n      def2.gradient = {};\n      def2.clipping = {};\n    }\n  }\n  function dirtyParents(item, id2) {\n    for (; item && item.dirty !== id2; item = item.mark.group) {\n      item.dirty = id2;\n      if (item.mark && item.mark.dirty !== id2) {\n        item.mark.dirty = id2;\n      } else return;\n    }\n  }\n  function updateGradient(el, grad, index2) {\n    let i, n, stop2;\n    if (grad.gradient === \"radial\") {\n      let pt = domChild(el, index2++, \"pattern\", svgns);\n      setAttributes(pt, {\n        id: patternPrefix + grad.id,\n        viewBox: \"0,0,1,1\",\n        width: \"100%\",\n        height: \"100%\",\n        preserveAspectRatio: \"xMidYMid slice\"\n      });\n      pt = domChild(pt, 0, \"rect\", svgns);\n      setAttributes(pt, {\n        width: 1,\n        height: 1,\n        fill: `url(${href()}#${grad.id})`\n      });\n      el = domChild(el, index2++, \"radialGradient\", svgns);\n      setAttributes(el, {\n        id: grad.id,\n        fx: grad.x1,\n        fy: grad.y1,\n        fr: grad.r1,\n        cx: grad.x2,\n        cy: grad.y2,\n        r: grad.r2\n      });\n    } else {\n      el = domChild(el, index2++, \"linearGradient\", svgns);\n      setAttributes(el, {\n        id: grad.id,\n        x1: grad.x1,\n        x2: grad.x2,\n        y1: grad.y1,\n        y2: grad.y2\n      });\n    }\n    for (i = 0, n = grad.stops.length; i < n; ++i) {\n      stop2 = domChild(el, i, \"stop\", svgns);\n      stop2.setAttribute(\"offset\", grad.stops[i].offset);\n      stop2.setAttribute(\"stop-color\", grad.stops[i].color);\n    }\n    domClear(el, i);\n    return index2;\n  }\n  function updateClipping(el, clip2, index2) {\n    let mask;\n    el = domChild(el, index2, \"clipPath\", svgns);\n    el.setAttribute(\"id\", clip2.id);\n    if (clip2.path) {\n      mask = domChild(el, 0, \"path\", svgns);\n      mask.setAttribute(\"d\", clip2.path);\n    } else {\n      mask = domChild(el, 0, \"rect\", svgns);\n      setAttributes(mask, {\n        x: 0,\n        y: 0,\n        width: clip2.width,\n        height: clip2.height\n      });\n    }\n    domClear(el, 1);\n    return index2 + 1;\n  }\n  function recurse(renderer, el, group2, markTypes) {\n    el = el.lastChild.previousSibling;\n    let prev, idx = 0;\n    visit(group2, (item) => {\n      prev = renderer.mark(el, item, prev, markTypes);\n      ++idx;\n    });\n    domClear(el, 1 + idx);\n  }\n  function bind$1(item, el, sibling, tag, svg) {\n    let node = item._svg, doc;\n    if (!node) {\n      doc = el.ownerDocument;\n      node = domCreate(doc, tag, svgns);\n      item._svg = node;\n      if (item.mark) {\n        node.__data__ = item;\n        node.__values__ = {\n          fill: \"default\"\n        };\n        if (tag === \"g\") {\n          const bg = domCreate(doc, \"path\", svgns);\n          node.appendChild(bg);\n          bg.__data__ = item;\n          const cg = domCreate(doc, \"g\", svgns);\n          node.appendChild(cg);\n          cg.__data__ = item;\n          const fg = domCreate(doc, \"path\", svgns);\n          node.appendChild(fg);\n          fg.__data__ = item;\n          fg.__values__ = {\n            fill: \"default\"\n          };\n        }\n      }\n    }\n    if (node.ownerSVGElement !== svg || siblingCheck(node, sibling)) {\n      el.insertBefore(node, sibling ? sibling.nextSibling : el.firstChild);\n    }\n    return node;\n  }\n  function siblingCheck(node, sibling) {\n    return node.parentNode && node.parentNode.childNodes.length > 1 && node.previousSibling != sibling;\n  }\n  let element$1 = null, values = null;\n  const mark_extras = {\n    group(mdef, el, item) {\n      const fg = element$1 = el.childNodes[2];\n      values = fg.__values__;\n      mdef.foreground(emit, item, this);\n      values = el.__values__;\n      element$1 = el.childNodes[1];\n      mdef.content(emit, item, this);\n      const bg = element$1 = el.childNodes[0];\n      mdef.background(emit, item, this);\n      const value2 = item.mark.interactive === false ? \"none\" : null;\n      if (value2 !== values.events) {\n        setAttribute(fg, \"pointer-events\", value2);\n        setAttribute(bg, \"pointer-events\", value2);\n        values.events = value2;\n      }\n      if (item.strokeForeground && item.stroke) {\n        const fill2 = item.fill;\n        setAttribute(fg, \"display\", null);\n        this.style(bg, item);\n        setAttribute(bg, \"stroke\", null);\n        if (fill2) item.fill = null;\n        values = fg.__values__;\n        this.style(fg, item);\n        if (fill2) item.fill = fill2;\n        element$1 = null;\n      } else {\n        setAttribute(fg, \"display\", \"none\");\n      }\n    },\n    image(mdef, el, item) {\n      if (item.smooth === false) {\n        setStyle(el, \"image-rendering\", \"optimizeSpeed\");\n        setStyle(el, \"image-rendering\", \"pixelated\");\n      } else {\n        setStyle(el, \"image-rendering\", null);\n      }\n    },\n    text(mdef, el, item) {\n      const tl2 = textLines(item);\n      let key2, value2, doc, lh;\n      if (isArray(tl2)) {\n        value2 = tl2.map((_) => textValue(item, _));\n        key2 = value2.join(\"\\n\");\n        if (key2 !== values.text) {\n          domClear(el, 0);\n          doc = el.ownerDocument;\n          lh = lineHeight(item);\n          value2.forEach((t, i) => {\n            const ts2 = domCreate(doc, \"tspan\", svgns);\n            ts2.__data__ = item;\n            ts2.textContent = t;\n            if (i) {\n              ts2.setAttribute(\"x\", 0);\n              ts2.setAttribute(\"dy\", lh);\n            }\n            el.appendChild(ts2);\n          });\n          values.text = key2;\n        }\n      } else {\n        value2 = textValue(item, tl2);\n        if (value2 !== values.text) {\n          el.textContent = value2;\n          values.text = value2;\n        }\n      }\n      setAttribute(el, \"font-family\", fontFamily(item));\n      setAttribute(el, \"font-size\", fontSize(item) + \"px\");\n      setAttribute(el, \"font-style\", item.fontStyle);\n      setAttribute(el, \"font-variant\", item.fontVariant);\n      setAttribute(el, \"font-weight\", item.fontWeight);\n    }\n  };\n  function emit(name, value2, ns) {\n    if (value2 === values[name]) return;\n    if (ns) {\n      setAttributeNS(element$1, name, value2, ns);\n    } else {\n      setAttribute(element$1, name, value2);\n    }\n    values[name] = value2;\n  }\n  function setStyle(el, name, value2) {\n    if (value2 !== values[name]) {\n      if (value2 == null) {\n        el.style.removeProperty(name);\n      } else {\n        el.style.setProperty(name, value2 + \"\");\n      }\n      values[name] = value2;\n    }\n  }\n  function setAttributes(el, attrs) {\n    for (const key2 in attrs) {\n      setAttribute(el, key2, attrs[key2]);\n    }\n  }\n  function setAttribute(el, name, value2) {\n    if (value2 != null) {\n      el.setAttribute(name, value2);\n    } else {\n      el.removeAttribute(name);\n    }\n  }\n  function setAttributeNS(el, name, value2, ns) {\n    if (value2 != null) {\n      el.setAttributeNS(ns, name, value2);\n    } else {\n      el.removeAttributeNS(ns, name);\n    }\n  }\n  function href() {\n    let loc;\n    return typeof window === \"undefined\" ? \"\" : (loc = window.location).hash ? loc.href.slice(0, -loc.hash.length) : loc.href;\n  }\n  class SVGStringRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._text = null;\n      this._defs = {\n        gradient: {},\n        clipping: {}\n      };\n    }\n    /**\n     * Returns the rendered SVG text string,\n     * or null if rendering has not yet occurred.\n     */\n    svg() {\n      return this._text;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     */\n    _render(scene) {\n      const m2 = markup();\n      m2.open(\"svg\", extend({}, metadata, {\n        class: \"marks\",\n        width: this._width * this._scale,\n        height: this._height * this._scale,\n        viewBox: `0 0 ${this._width} ${this._height}`\n      }));\n      const bg = this._bgcolor;\n      if (bg && bg !== \"transparent\" && bg !== \"none\") {\n        m2.open(\"rect\", {\n          width: this._width,\n          height: this._height,\n          fill: bg\n        }).close();\n      }\n      m2.open(\"g\", rootAttributes, {\n        transform: \"translate(\" + this._origin + \")\"\n      });\n      this.mark(m2, scene);\n      m2.close();\n      this.defs(m2);\n      this._text = m2.close() + \"\";\n      return this;\n    }\n    /**\n     * Render a set of mark items.\n     * @param {object} m - The markup context.\n     * @param {object} scene - The mark parent to render.\n     */\n    mark(m2, scene) {\n      const mdef = Marks[scene.marktype], tag = mdef.tag, attrList = [ariaItemAttributes, mdef.attr];\n      m2.open(\"g\", {\n        \"class\": cssClass(scene),\n        \"clip-path\": scene.clip ? clip$1$1(this, scene, scene.group) : null\n      }, ariaMarkAttributes(scene), {\n        \"pointer-events\": tag !== \"g\" && scene.interactive === false ? \"none\" : null\n      });\n      const process = (item) => {\n        const href2 = this.href(item);\n        if (href2) m2.open(\"a\", href2);\n        m2.open(tag, this.attr(scene, item, attrList, tag !== \"g\" ? tag : null));\n        if (tag === \"text\") {\n          const tl2 = textLines(item);\n          if (isArray(tl2)) {\n            const attrs = {\n              x: 0,\n              dy: lineHeight(item)\n            };\n            for (let i = 0; i < tl2.length; ++i) {\n              m2.open(\"tspan\", i ? attrs : null).text(textValue(item, tl2[i])).close();\n            }\n          } else {\n            m2.text(textValue(item, tl2));\n          }\n        } else if (tag === \"g\") {\n          const fore = item.strokeForeground, fill2 = item.fill, stroke2 = item.stroke;\n          if (fore && stroke2) {\n            item.stroke = null;\n          }\n          m2.open(\"path\", this.attr(scene, item, mdef.background, \"bgrect\")).close();\n          m2.open(\"g\", this.attr(scene, item, mdef.content));\n          visit(item, (scene2) => this.mark(m2, scene2));\n          m2.close();\n          if (fore && stroke2) {\n            if (fill2) item.fill = null;\n            item.stroke = stroke2;\n            m2.open(\"path\", this.attr(scene, item, mdef.foreground, \"bgrect\")).close();\n            if (fill2) item.fill = fill2;\n          } else {\n            m2.open(\"path\", this.attr(scene, item, mdef.foreground, \"bgfore\")).close();\n          }\n        }\n        m2.close();\n        if (href2) m2.close();\n      };\n      if (mdef.nested) {\n        if (scene.items && scene.items.length) process(scene.items[0]);\n      } else {\n        visit(scene, process);\n      }\n      return m2.close();\n    }\n    /**\n     * Get href attributes for a hyperlinked mark item.\n     * @param {Item} item - The mark item.\n     */\n    href(item) {\n      const href2 = item.href;\n      let attr2;\n      if (href2) {\n        if (attr2 = this._hrefs && this._hrefs[href2]) {\n          return attr2;\n        } else {\n          this.sanitizeURL(href2).then((attr3) => {\n            attr3[\"xlink:href\"] = attr3.href;\n            attr3.href = null;\n            (this._hrefs || (this._hrefs = {}))[href2] = attr3;\n          });\n        }\n      }\n      return null;\n    }\n    /**\n     * Get an object of SVG attributes for a mark item.\n     * @param {object} scene - The mark parent.\n     * @param {Item} item - The mark item.\n     * @param {array|function} attrs - One or more attribute emitters.\n     * @param {string} tag - The tag being rendered.\n     */\n    attr(scene, item, attrs, tag) {\n      const object2 = {}, emit2 = (name, value2, ns, prefixed) => {\n        object2[prefixed || name] = value2;\n      };\n      if (Array.isArray(attrs)) {\n        attrs.forEach((fn2) => fn2(emit2, item, this));\n      } else {\n        attrs(emit2, item, this);\n      }\n      if (tag) {\n        style(object2, item, scene, tag, this._defs);\n      }\n      return object2;\n    }\n    /**\n     * Render SVG defs, as needed.\n     * Must be called *after* marks have been processed to ensure the\n     * collected state is current and accurate.\n     * @param {object} m - The markup context.\n     */\n    defs(m2) {\n      const gradient2 = this._defs.gradient, clipping = this._defs.clipping, count2 = Object.keys(gradient2).length + Object.keys(clipping).length;\n      if (count2 === 0) return;\n      m2.open(\"defs\");\n      for (const id2 in gradient2) {\n        const def2 = gradient2[id2], stops = def2.stops;\n        if (def2.gradient === \"radial\") {\n          m2.open(\"pattern\", {\n            id: patternPrefix + id2,\n            viewBox: \"0,0,1,1\",\n            width: \"100%\",\n            height: \"100%\",\n            preserveAspectRatio: \"xMidYMid slice\"\n          });\n          m2.open(\"rect\", {\n            width: \"1\",\n            height: \"1\",\n            fill: \"url(#\" + id2 + \")\"\n          }).close();\n          m2.close();\n          m2.open(\"radialGradient\", {\n            id: id2,\n            fx: def2.x1,\n            fy: def2.y1,\n            fr: def2.r1,\n            cx: def2.x2,\n            cy: def2.y2,\n            r: def2.r2\n          });\n        } else {\n          m2.open(\"linearGradient\", {\n            id: id2,\n            x1: def2.x1,\n            x2: def2.x2,\n            y1: def2.y1,\n            y2: def2.y2\n          });\n        }\n        for (let i = 0; i < stops.length; ++i) {\n          m2.open(\"stop\", {\n            offset: stops[i].offset,\n            \"stop-color\": stops[i].color\n          }).close();\n        }\n        m2.close();\n      }\n      for (const id2 in clipping) {\n        const def2 = clipping[id2];\n        m2.open(\"clipPath\", {\n          id: id2\n        });\n        if (def2.path) {\n          m2.open(\"path\", {\n            d: def2.path\n          }).close();\n        } else {\n          m2.open(\"rect\", {\n            x: 0,\n            y: 0,\n            width: def2.width,\n            height: def2.height\n          }).close();\n        }\n        m2.close();\n      }\n      m2.close();\n    }\n  }\n  function style(s2, item, scene, tag, defs) {\n    let styleList;\n    if (item == null) return s2;\n    if (tag === \"bgrect\" && scene.interactive === false) {\n      s2[\"pointer-events\"] = \"none\";\n    }\n    if (tag === \"bgfore\") {\n      if (scene.interactive === false) {\n        s2[\"pointer-events\"] = \"none\";\n      }\n      s2.display = \"none\";\n      if (item.fill !== null) return s2;\n    }\n    if (tag === \"image\" && item.smooth === false) {\n      styleList = [\"image-rendering: optimizeSpeed;\", \"image-rendering: pixelated;\"];\n    }\n    if (tag === \"text\") {\n      s2[\"font-family\"] = fontFamily(item);\n      s2[\"font-size\"] = fontSize(item) + \"px\";\n      s2[\"font-style\"] = item.fontStyle;\n      s2[\"font-variant\"] = item.fontVariant;\n      s2[\"font-weight\"] = item.fontWeight;\n    }\n    for (const prop in stylesAttr) {\n      let value2 = item[prop];\n      const name = stylesAttr[prop];\n      if (value2 === \"transparent\" && (name === \"fill\" || name === \"stroke\")) ;\n      else if (value2 != null) {\n        if (isGradient(value2)) {\n          value2 = gradientRef(value2, defs.gradient, \"\");\n        }\n        s2[name] = value2;\n      }\n    }\n    for (const prop in stylesCss) {\n      const value2 = item[prop];\n      if (value2 != null) {\n        styleList = styleList || [];\n        styleList.push(`${stylesCss[prop]}: ${value2};`);\n      }\n    }\n    if (styleList) {\n      s2.style = styleList.join(\" \");\n    }\n    return s2;\n  }\n  const OPTS = {\n    svgMarkTypes: [\"text\"],\n    svgOnTop: true,\n    debug: false\n  };\n  function setHybridRendererOptions(options2) {\n    OPTS[\"svgMarkTypes\"] = options2.svgMarkTypes ?? [\"text\"];\n    OPTS[\"svgOnTop\"] = options2.svgOnTop ?? true;\n    OPTS[\"debug\"] = options2.debug ?? false;\n  }\n  class HybridRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._svgRenderer = new SVGRenderer(loader2);\n      this._canvasRenderer = new CanvasRenderer(loader2);\n    }\n    /**\n     * Initialize a new HybridRenderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {HybridRenderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._root_el = domChild(el, 0, \"div\");\n      const bottomEl = domChild(this._root_el, 0, \"div\");\n      const topEl = domChild(this._root_el, 1, \"div\");\n      this._root_el.style.position = \"relative\";\n      if (!OPTS.debug) {\n        bottomEl.style.height = \"100%\";\n        topEl.style.position = \"absolute\";\n        topEl.style.top = \"0\";\n        topEl.style.left = \"0\";\n        topEl.style.height = \"100%\";\n        topEl.style.width = \"100%\";\n      }\n      this._svgEl = OPTS.svgOnTop ? topEl : bottomEl;\n      this._canvasEl = OPTS.svgOnTop ? bottomEl : topEl;\n      this._svgEl.style.pointerEvents = \"none\";\n      this._canvasRenderer.initialize(this._canvasEl, width2, height2, origin, scaleFactor);\n      this._svgRenderer.initialize(this._svgEl, width2, height2, origin, scaleFactor);\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Flag a mark item as dirty.\n     * @param {Item} item - The mark item.\n     */\n    dirty(item) {\n      if (OPTS.svgMarkTypes.includes(item.mark.marktype)) {\n        this._svgRenderer.dirty(item);\n      } else {\n        this._canvasRenderer.dirty(item);\n      }\n      return this;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render(scene, markTypes) {\n      const allMarkTypes = markTypes ?? [\"arc\", \"area\", \"image\", \"line\", \"path\", \"rect\", \"rule\", \"shape\", \"symbol\", \"text\", \"trail\"];\n      const canvasMarkTypes = allMarkTypes.filter((m2) => !OPTS.svgMarkTypes.includes(m2));\n      this._svgRenderer.render(scene, OPTS.svgMarkTypes);\n      this._canvasRenderer.render(scene, canvasMarkTypes);\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      this._svgRenderer.resize(width2, height2, origin, scaleFactor);\n      this._canvasRenderer.resize(width2, height2, origin, scaleFactor);\n      return this;\n    }\n    background(bgcolor) {\n      if (OPTS.svgOnTop) {\n        this._canvasRenderer.background(bgcolor);\n      } else {\n        this._svgRenderer.background(bgcolor);\n      }\n      return this;\n    }\n  }\n  class HybridHandler extends CanvasHandler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n    }\n    initialize(el, origin, obj2) {\n      const canvas = domChild(domChild(el, 0, \"div\"), OPTS.svgOnTop ? 0 : 1, \"div\");\n      return super.initialize(canvas, origin, obj2);\n    }\n  }\n  const Canvas = \"canvas\";\n  const Hybrid = \"hybrid\";\n  const PNG = \"png\";\n  const SVG = \"svg\";\n  const None$1 = \"none\";\n  const RenderType = {\n    Canvas,\n    PNG,\n    SVG,\n    Hybrid,\n    None: None$1\n  };\n  const modules = {};\n  modules[Canvas] = modules[PNG] = {\n    renderer: CanvasRenderer,\n    headless: CanvasRenderer,\n    handler: CanvasHandler\n  };\n  modules[SVG] = {\n    renderer: SVGRenderer,\n    headless: SVGStringRenderer,\n    handler: SVGHandler\n  };\n  modules[Hybrid] = {\n    renderer: HybridRenderer,\n    headless: HybridRenderer,\n    handler: HybridHandler\n  };\n  modules[None$1] = {};\n  function renderModule(name, _) {\n    name = String(name || \"\").toLowerCase();\n    if (arguments.length > 1) {\n      modules[name] = _;\n      return this;\n    } else {\n      return modules[name];\n    }\n  }\n  function intersect$2(scene, bounds2, filter2) {\n    const hits = [], box2 = new Bounds().union(bounds2), type2 = scene.marktype;\n    return type2 ? intersectMark(scene, box2, filter2, hits) : type2 === \"group\" ? intersectGroup(scene, box2, filter2, hits) : error(\"Intersect scene must be mark node or group item.\");\n  }\n  function intersectMark(mark, box2, filter2, hits) {\n    if (visitMark(mark, box2, filter2)) {\n      const items = mark.items, type2 = mark.marktype, n = items.length;\n      let i = 0;\n      if (type2 === \"group\") {\n        for (; i < n; ++i) {\n          intersectGroup(items[i], box2, filter2, hits);\n        }\n      } else {\n        for (const test2 = Marks[type2].isect; i < n; ++i) {\n          const item = items[i];\n          if (intersectItem(item, box2, test2)) hits.push(item);\n        }\n      }\n    }\n    return hits;\n  }\n  function visitMark(mark, box2, filter2) {\n    return mark.bounds && box2.intersects(mark.bounds) && (mark.marktype === \"group\" || mark.interactive !== false && (!filter2 || filter2(mark)));\n  }\n  function intersectGroup(group2, box2, filter2, hits) {\n    if (filter2 && filter2(group2.mark) && intersectItem(group2, box2, Marks.group.isect)) {\n      hits.push(group2);\n    }\n    const marks = group2.items, n = marks && marks.length;\n    if (n) {\n      const x2 = group2.x || 0, y2 = group2.y || 0;\n      box2.translate(-x2, -y2);\n      for (let i = 0; i < n; ++i) {\n        intersectMark(marks[i], box2, filter2, hits);\n      }\n      box2.translate(x2, y2);\n    }\n    return hits;\n  }\n  function intersectItem(item, box2, test2) {\n    const bounds2 = item.bounds;\n    return box2.encloses(bounds2) || box2.intersects(bounds2) && test2(item, box2);\n  }\n  const clipBounds = new Bounds();\n  function boundClip(mark) {\n    const clip2 = mark.clip;\n    if (isFunction(clip2)) {\n      clip2(boundContext(clipBounds.clear()));\n    } else if (clip2) {\n      clipBounds.set(0, 0, mark.group.width, mark.group.height);\n    } else return;\n    mark.bounds.intersect(clipBounds);\n  }\n  const TOLERANCE = 1e-9;\n  function sceneEqual(a2, b2, key2) {\n    return a2 === b2 ? true : key2 === \"path\" ? pathEqual(a2, b2) : a2 instanceof Date && b2 instanceof Date ? +a2 === +b2 : isNumber$1(a2) && isNumber$1(b2) ? Math.abs(a2 - b2) <= TOLERANCE : !a2 || !b2 || !isObject(a2) && !isObject(b2) ? a2 == b2 : objectEqual(a2, b2);\n  }\n  function pathEqual(a2, b2) {\n    return sceneEqual(parse$3(a2), parse$3(b2));\n  }\n  function objectEqual(a2, b2) {\n    var ka = Object.keys(a2), kb = Object.keys(b2), key2, i;\n    if (ka.length !== kb.length) return false;\n    ka.sort();\n    kb.sort();\n    for (i = ka.length - 1; i >= 0; i--) {\n      if (ka[i] != kb[i]) return false;\n    }\n    for (i = ka.length - 1; i >= 0; i--) {\n      key2 = ka[i];\n      if (!sceneEqual(a2[key2], b2[key2], key2)) return false;\n    }\n    return typeof a2 === typeof b2;\n  }\n  function resetSVGDefIds() {\n    resetSVGClipId();\n    resetSVGGradientId();\n  }\n  const Top$1 = \"top\";\n  const Left$1 = \"left\";\n  const Right$1 = \"right\";\n  const Bottom$1 = \"bottom\";\n  const TopLeft = \"top-left\";\n  const TopRight = \"top-right\";\n  const BottomLeft = \"bottom-left\";\n  const BottomRight = \"bottom-right\";\n  const Start$1 = \"start\";\n  const Middle$1 = \"middle\";\n  const End$1 = \"end\";\n  const X = \"x\";\n  const Y = \"y\";\n  const Group = \"group\";\n  const AxisRole$1 = \"axis\";\n  const TitleRole$1 = \"title\";\n  const FrameRole$1 = \"frame\";\n  const ScopeRole$1 = \"scope\";\n  const LegendRole$1 = \"legend\";\n  const RowHeader = \"row-header\";\n  const RowFooter = \"row-footer\";\n  const RowTitle = \"row-title\";\n  const ColHeader = \"column-header\";\n  const ColFooter = \"column-footer\";\n  const ColTitle = \"column-title\";\n  const Padding$1 = \"padding\";\n  const Symbols$1 = \"symbol\";\n  const Fit = \"fit\";\n  const FitX = \"fit-x\";\n  const FitY = \"fit-y\";\n  const Pad = \"pad\";\n  const None = \"none\";\n  const All = \"all\";\n  const Each = \"each\";\n  const Flush = \"flush\";\n  const Column = \"column\";\n  const Row = \"row\";\n  function Bound$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Bound$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow, mark = _.mark, type2 = mark.marktype, entry2 = Marks[type2], bound2 = entry2.bound;\n      let markBounds = mark.bounds, rebound;\n      if (entry2.nested) {\n        if (mark.items.length) view.dirty(mark.items[0]);\n        markBounds = boundItem(mark, bound2);\n        mark.items.forEach((item) => {\n          item.bounds.clear().union(markBounds);\n        });\n      } else if (type2 === Group || _.modified()) {\n        pulse2.visit(pulse2.MOD, (item) => view.dirty(item));\n        markBounds.clear();\n        mark.items.forEach((item) => markBounds.union(boundItem(item, bound2)));\n        switch (mark.role) {\n          case AxisRole$1:\n          case LegendRole$1:\n          case TitleRole$1:\n            pulse2.reflow();\n        }\n      } else {\n        rebound = pulse2.changed(pulse2.REM);\n        pulse2.visit(pulse2.ADD, (item) => {\n          markBounds.union(boundItem(item, bound2));\n        });\n        pulse2.visit(pulse2.MOD, (item) => {\n          rebound = rebound || markBounds.alignsWith(item.bounds);\n          view.dirty(item);\n          markBounds.union(boundItem(item, bound2));\n        });\n        if (rebound) {\n          markBounds.clear();\n          mark.items.forEach((item) => markBounds.union(item.bounds));\n        }\n      }\n      boundClip(mark);\n      return pulse2.modifies(\"bounds\");\n    }\n  });\n  function boundItem(item, bound2, opt) {\n    return bound2(item.bounds.clear(), item, opt);\n  }\n  const COUNTER_NAME = \":vega_identifier:\";\n  function Identifier$1(params2) {\n    Transform.call(this, 0, params2);\n  }\n  Identifier$1.Definition = {\n    \"type\": \"Identifier\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"required\": true\n    }]\n  };\n  inherits(Identifier$1, Transform, {\n    transform(_, pulse2) {\n      const counter = getCounter(pulse2.dataflow), as = _.as;\n      let id2 = counter.value;\n      pulse2.visit(pulse2.ADD, (t) => t[as] = t[as] || ++id2);\n      counter.set(this.value = id2);\n      return pulse2;\n    }\n  });\n  function getCounter(view) {\n    return view._signals[COUNTER_NAME] || (view._signals[COUNTER_NAME] = view.add(0));\n  }\n  function Mark$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Mark$1, Transform, {\n    transform(_, pulse2) {\n      let mark = this.value;\n      if (!mark) {\n        mark = pulse2.dataflow.scenegraph().mark(_.markdef, lookup$1$1(_), _.index);\n        mark.group.context = _.context;\n        if (!_.context.group) _.context.group = mark.group;\n        mark.source = this.source;\n        mark.clip = _.clip;\n        mark.interactive = _.interactive;\n        this.value = mark;\n      }\n      const Init = mark.marktype === Group ? GroupItem : Item;\n      pulse2.visit(pulse2.ADD, (item) => Init.call(item, mark));\n      if (_.modified(\"clip\") || _.modified(\"interactive\")) {\n        mark.clip = _.clip;\n        mark.interactive = !!_.interactive;\n        mark.zdirty = true;\n        pulse2.reflow();\n      }\n      mark.items = pulse2.source;\n      return pulse2;\n    }\n  });\n  function lookup$1$1(_) {\n    const g = _.groups, p = _.parent;\n    return g && g.size === 1 ? g.get(Object.keys(g.object)[0]) : g && p ? g.lookup(p) : null;\n  }\n  function Overlap$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  const methods = {\n    parity: (items) => items.filter((item, i) => i % 2 ? item.opacity = 0 : 1),\n    greedy: (items, sep) => {\n      let a2;\n      return items.filter((b2, i) => !i || !intersect$1(a2.bounds, b2.bounds, sep) ? (a2 = b2, 1) : b2.opacity = 0);\n    }\n  };\n  const intersect$1 = (a2, b2, sep) => sep > Math.max(b2.x1 - a2.x2, a2.x1 - b2.x2, b2.y1 - a2.y2, a2.y1 - b2.y2);\n  const hasOverlap = (items, pad2) => {\n    for (var i = 1, n = items.length, a2 = items[0].bounds, b2; i < n; a2 = b2, ++i) {\n      if (intersect$1(a2, b2 = items[i].bounds, pad2)) return true;\n    }\n  };\n  const hasBounds = (item) => {\n    const b2 = item.bounds;\n    return b2.width() > 1 && b2.height() > 1;\n  };\n  const boundTest = (scale2, orient, tolerance) => {\n    var range2 = scale2.range(), b2 = new Bounds();\n    if (orient === Top$1 || orient === Bottom$1) {\n      b2.set(range2[0], -Infinity, range2[1], Infinity);\n    } else {\n      b2.set(-Infinity, range2[0], Infinity, range2[1]);\n    }\n    b2.expand(tolerance || 1);\n    return (item) => b2.encloses(item.bounds);\n  };\n  const reset = (source2) => {\n    source2.forEach((item) => item.opacity = 1);\n    return source2;\n  };\n  const reflow = (pulse2, _) => pulse2.reflow(_.modified()).modifies(\"opacity\");\n  inherits(Overlap$1, Transform, {\n    transform(_, pulse2) {\n      const reduce = methods[_.method] || methods.parity, sep = _.separation || 0;\n      let source2 = pulse2.materialize(pulse2.SOURCE).source, items, test2;\n      if (!source2 || !source2.length) return;\n      if (!_.method) {\n        if (_.modified(\"method\")) {\n          reset(source2);\n          pulse2 = reflow(pulse2, _);\n        }\n        return pulse2;\n      }\n      source2 = source2.filter(hasBounds);\n      if (!source2.length) return;\n      if (_.sort) {\n        source2 = source2.slice().sort(_.sort);\n      }\n      items = reset(source2);\n      pulse2 = reflow(pulse2, _);\n      if (items.length >= 3 && hasOverlap(items, sep)) {\n        do {\n          items = reduce(items, sep);\n        } while (items.length >= 3 && hasOverlap(items, sep));\n        if (items.length < 3 && !peek$1(source2).opacity) {\n          if (items.length > 1) peek$1(items).opacity = 0;\n          peek$1(source2).opacity = 1;\n        }\n      }\n      if (_.boundScale && _.boundTolerance >= 0) {\n        test2 = boundTest(_.boundScale, _.boundOrient, +_.boundTolerance);\n        source2.forEach((item) => {\n          if (!test2(item)) item.opacity = 0;\n        });\n      }\n      const bounds2 = items[0].mark.bounds.clear();\n      source2.forEach((item) => {\n        if (item.opacity) bounds2.union(item.bounds);\n      });\n      return pulse2;\n    }\n  });\n  function Render$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Render$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow;\n      pulse2.visit(pulse2.ALL, (item) => view.dirty(item));\n      if (pulse2.fields && pulse2.fields[\"zindex\"]) {\n        const item = pulse2.source && pulse2.source[0];\n        if (item) item.mark.zdirty = true;\n      }\n    }\n  });\n  const tempBounds = new Bounds();\n  function set$2(item, property2, value2) {\n    return item[property2] === value2 ? 0 : (item[property2] = value2, 1);\n  }\n  function isYAxis(mark) {\n    var orient = mark.items[0].orient;\n    return orient === Left$1 || orient === Right$1;\n  }\n  function axisIndices(datum2) {\n    let index2 = +datum2.grid;\n    return [\n      datum2.ticks ? index2++ : -1,\n      // ticks index\n      datum2.labels ? index2++ : -1,\n      // labels index\n      index2 + +datum2.domain\n      // title index\n    ];\n  }\n  function axisLayout(view, axis, width2, height2) {\n    var item = axis.items[0], datum2 = item.datum, delta = item.translate != null ? item.translate : 0.5, orient = item.orient, indices = axisIndices(datum2), range2 = item.range, offset2 = item.offset, position2 = item.position, minExtent = item.minExtent, maxExtent = item.maxExtent, title = datum2.title && item.items[indices[2]].items[0], titlePadding = item.titlePadding, bounds2 = item.bounds, dl = title && multiLineOffset(title), x2 = 0, y2 = 0, i, s2;\n    tempBounds.clear().union(bounds2);\n    bounds2.clear();\n    if ((i = indices[0]) > -1) bounds2.union(item.items[i].bounds);\n    if ((i = indices[1]) > -1) bounds2.union(item.items[i].bounds);\n    switch (orient) {\n      case Top$1:\n        x2 = position2 || 0;\n        y2 = -offset2;\n        s2 = Math.max(minExtent, Math.min(maxExtent, -bounds2.y1));\n        bounds2.add(0, -s2).add(range2, 0);\n        if (title) axisTitleLayout(view, title, s2, titlePadding, dl, 0, -1, bounds2);\n        break;\n      case Left$1:\n        x2 = -offset2;\n        y2 = position2 || 0;\n        s2 = Math.max(minExtent, Math.min(maxExtent, -bounds2.x1));\n        bounds2.add(-s2, 0).add(0, range2);\n        if (title) axisTitleLayout(view, title, s2, titlePadding, dl, 1, -1, bounds2);\n        break;\n      case Right$1:\n        x2 = width2 + offset2;\n        y2 = position2 || 0;\n        s2 = Math.max(minExtent, Math.min(maxExtent, bounds2.x2));\n        bounds2.add(0, 0).add(s2, range2);\n        if (title) axisTitleLayout(view, title, s2, titlePadding, dl, 1, 1, bounds2);\n        break;\n      case Bottom$1:\n        x2 = position2 || 0;\n        y2 = height2 + offset2;\n        s2 = Math.max(minExtent, Math.min(maxExtent, bounds2.y2));\n        bounds2.add(0, 0).add(range2, s2);\n        if (title) axisTitleLayout(view, title, s2, titlePadding, 0, 0, 1, bounds2);\n        break;\n      default:\n        x2 = item.x;\n        y2 = item.y;\n    }\n    boundStroke(bounds2.translate(x2, y2), item);\n    if (set$2(item, \"x\", x2 + delta) | set$2(item, \"y\", y2 + delta)) {\n      item.bounds = tempBounds;\n      view.dirty(item);\n      item.bounds = bounds2;\n      view.dirty(item);\n    }\n    return item.mark.bounds.clear().union(bounds2);\n  }\n  function axisTitleLayout(view, title, offset2, pad2, dl, isYAxis2, sign2, bounds2) {\n    const b2 = title.bounds;\n    if (title.auto) {\n      const v = sign2 * (offset2 + dl + pad2);\n      let dx = 0, dy = 0;\n      view.dirty(title);\n      isYAxis2 ? dx = (title.x || 0) - (title.x = v) : dy = (title.y || 0) - (title.y = v);\n      title.mark.bounds.clear().union(b2.translate(-dx, -dy));\n      view.dirty(title);\n    }\n    bounds2.union(b2);\n  }\n  const min = (a2, b2) => Math.floor(Math.min(a2, b2));\n  const max = (a2, b2) => Math.ceil(Math.max(a2, b2));\n  function gridLayoutGroups(group2) {\n    var groups = group2.items, n = groups.length, i = 0, mark, items;\n    const views = {\n      marks: [],\n      rowheaders: [],\n      rowfooters: [],\n      colheaders: [],\n      colfooters: [],\n      rowtitle: null,\n      coltitle: null\n    };\n    for (; i < n; ++i) {\n      mark = groups[i];\n      items = mark.items;\n      if (mark.marktype === Group) {\n        switch (mark.role) {\n          case AxisRole$1:\n          case LegendRole$1:\n          case TitleRole$1:\n            break;\n          case RowHeader:\n            views.rowheaders.push(...items);\n            break;\n          case RowFooter:\n            views.rowfooters.push(...items);\n            break;\n          case ColHeader:\n            views.colheaders.push(...items);\n            break;\n          case ColFooter:\n            views.colfooters.push(...items);\n            break;\n          case RowTitle:\n            views.rowtitle = items[0];\n            break;\n          case ColTitle:\n            views.coltitle = items[0];\n            break;\n          default:\n            views.marks.push(...items);\n        }\n      }\n    }\n    return views;\n  }\n  function bboxFlush(item) {\n    return new Bounds().set(0, 0, item.width || 0, item.height || 0);\n  }\n  function bboxFull(item) {\n    const b2 = item.bounds.clone();\n    return b2.empty() ? b2.set(0, 0, 0, 0) : b2.translate(-(item.x || 0), -(item.y || 0));\n  }\n  function get$1(opt, key2, d2) {\n    const v = isObject(opt) ? opt[key2] : opt;\n    return v != null ? v : d2 !== void 0 ? d2 : 0;\n  }\n  function offsetValue$1(v) {\n    return v < 0 ? Math.ceil(-v) : 0;\n  }\n  function gridLayout(view, groups, opt) {\n    var dirty = !opt.nodirty, bbox = opt.bounds === Flush ? bboxFlush : bboxFull, bounds2 = tempBounds.set(0, 0, 0, 0), alignCol = get$1(opt.align, Column), alignRow = get$1(opt.align, Row), padCol = get$1(opt.padding, Column), padRow = get$1(opt.padding, Row), ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), n = groups.length, xOffset = Array(n), xExtent = Array(ncols), xMax = 0, yOffset = Array(n), yExtent = Array(nrows), yMax = 0, dx = Array(n), dy = Array(n), boxes = Array(n), m2, i, c2, r, b2, g, px2, py2, x2, y2, offset2;\n    for (i = 0; i < ncols; ++i) xExtent[i] = 0;\n    for (i = 0; i < nrows; ++i) yExtent[i] = 0;\n    for (i = 0; i < n; ++i) {\n      g = groups[i];\n      b2 = boxes[i] = bbox(g);\n      g.x = g.x || 0;\n      dx[i] = 0;\n      g.y = g.y || 0;\n      dy[i] = 0;\n      c2 = i % ncols;\n      r = ~~(i / ncols);\n      xMax = Math.max(xMax, px2 = Math.ceil(b2.x2));\n      yMax = Math.max(yMax, py2 = Math.ceil(b2.y2));\n      xExtent[c2] = Math.max(xExtent[c2], px2);\n      yExtent[r] = Math.max(yExtent[r], py2);\n      xOffset[i] = padCol + offsetValue$1(b2.x1);\n      yOffset[i] = padRow + offsetValue$1(b2.y1);\n      if (dirty) view.dirty(groups[i]);\n    }\n    for (i = 0; i < n; ++i) {\n      if (i % ncols === 0) xOffset[i] = 0;\n      if (i < ncols) yOffset[i] = 0;\n    }\n    if (alignCol === Each) {\n      for (c2 = 1; c2 < ncols; ++c2) {\n        for (offset2 = 0, i = c2; i < n; i += ncols) {\n          if (offset2 < xOffset[i]) offset2 = xOffset[i];\n        }\n        for (i = c2; i < n; i += ncols) {\n          xOffset[i] = offset2 + xExtent[c2 - 1];\n        }\n      }\n    } else if (alignCol === All) {\n      for (offset2 = 0, i = 0; i < n; ++i) {\n        if (i % ncols && offset2 < xOffset[i]) offset2 = xOffset[i];\n      }\n      for (i = 0; i < n; ++i) {\n        if (i % ncols) xOffset[i] = offset2 + xMax;\n      }\n    } else {\n      for (alignCol = false, c2 = 1; c2 < ncols; ++c2) {\n        for (i = c2; i < n; i += ncols) {\n          xOffset[i] += xExtent[c2 - 1];\n        }\n      }\n    }\n    if (alignRow === Each) {\n      for (r = 1; r < nrows; ++r) {\n        for (offset2 = 0, i = r * ncols, m2 = i + ncols; i < m2; ++i) {\n          if (offset2 < yOffset[i]) offset2 = yOffset[i];\n        }\n        for (i = r * ncols; i < m2; ++i) {\n          yOffset[i] = offset2 + yExtent[r - 1];\n        }\n      }\n    } else if (alignRow === All) {\n      for (offset2 = 0, i = ncols; i < n; ++i) {\n        if (offset2 < yOffset[i]) offset2 = yOffset[i];\n      }\n      for (i = ncols; i < n; ++i) {\n        yOffset[i] = offset2 + yMax;\n      }\n    } else {\n      for (alignRow = false, r = 1; r < nrows; ++r) {\n        for (i = r * ncols, m2 = i + ncols; i < m2; ++i) {\n          yOffset[i] += yExtent[r - 1];\n        }\n      }\n    }\n    for (x2 = 0, i = 0; i < n; ++i) {\n      x2 = xOffset[i] + (i % ncols ? x2 : 0);\n      dx[i] += x2 - groups[i].x;\n    }\n    for (c2 = 0; c2 < ncols; ++c2) {\n      for (y2 = 0, i = c2; i < n; i += ncols) {\n        y2 += yOffset[i];\n        dy[i] += y2 - groups[i].y;\n      }\n    }\n    if (alignCol && get$1(opt.center, Column) && nrows > 1) {\n      for (i = 0; i < n; ++i) {\n        b2 = alignCol === All ? xMax : xExtent[i % ncols];\n        x2 = b2 - boxes[i].x2 - groups[i].x - dx[i];\n        if (x2 > 0) dx[i] += x2 / 2;\n      }\n    }\n    if (alignRow && get$1(opt.center, Row) && ncols !== 1) {\n      for (i = 0; i < n; ++i) {\n        b2 = alignRow === All ? yMax : yExtent[~~(i / ncols)];\n        y2 = b2 - boxes[i].y2 - groups[i].y - dy[i];\n        if (y2 > 0) dy[i] += y2 / 2;\n      }\n    }\n    for (i = 0; i < n; ++i) {\n      bounds2.union(boxes[i].translate(dx[i], dy[i]));\n    }\n    x2 = get$1(opt.anchor, X);\n    y2 = get$1(opt.anchor, Y);\n    switch (get$1(opt.anchor, Column)) {\n      case End$1:\n        x2 -= bounds2.width();\n        break;\n      case Middle$1:\n        x2 -= bounds2.width() / 2;\n    }\n    switch (get$1(opt.anchor, Row)) {\n      case End$1:\n        y2 -= bounds2.height();\n        break;\n      case Middle$1:\n        y2 -= bounds2.height() / 2;\n    }\n    x2 = Math.round(x2);\n    y2 = Math.round(y2);\n    bounds2.clear();\n    for (i = 0; i < n; ++i) {\n      groups[i].mark.bounds.clear();\n    }\n    for (i = 0; i < n; ++i) {\n      g = groups[i];\n      g.x += dx[i] += x2;\n      g.y += dy[i] += y2;\n      bounds2.union(g.mark.bounds.union(g.bounds.translate(dx[i], dy[i])));\n      if (dirty) view.dirty(g);\n    }\n    return bounds2;\n  }\n  function trellisLayout(view, group2, opt) {\n    var views = gridLayoutGroups(group2), groups = views.marks, bbox = opt.bounds === Flush ? boundFlush : boundFull, off = opt.offset, ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), cells = nrows * ncols, x2, y2, x22, y22, anchor, band2, offset2;\n    const bounds2 = gridLayout(view, groups, opt);\n    if (bounds2.empty()) bounds2.set(0, 0, 0, 0);\n    if (views.rowheaders) {\n      band2 = get$1(opt.headerBand, Row, null);\n      x2 = layoutHeaders(view, views.rowheaders, groups, ncols, nrows, -get$1(off, \"rowHeader\"), min, 0, bbox, \"x1\", 0, ncols, 1, band2);\n    }\n    if (views.colheaders) {\n      band2 = get$1(opt.headerBand, Column, null);\n      y2 = layoutHeaders(view, views.colheaders, groups, ncols, ncols, -get$1(off, \"columnHeader\"), min, 1, bbox, \"y1\", 0, 1, ncols, band2);\n    }\n    if (views.rowfooters) {\n      band2 = get$1(opt.footerBand, Row, null);\n      x22 = layoutHeaders(view, views.rowfooters, groups, ncols, nrows, get$1(off, \"rowFooter\"), max, 0, bbox, \"x2\", ncols - 1, ncols, 1, band2);\n    }\n    if (views.colfooters) {\n      band2 = get$1(opt.footerBand, Column, null);\n      y22 = layoutHeaders(view, views.colfooters, groups, ncols, ncols, get$1(off, \"columnFooter\"), max, 1, bbox, \"y2\", cells - ncols, 1, ncols, band2);\n    }\n    if (views.rowtitle) {\n      anchor = get$1(opt.titleAnchor, Row);\n      offset2 = get$1(off, \"rowTitle\");\n      offset2 = anchor === End$1 ? x22 + offset2 : x2 - offset2;\n      band2 = get$1(opt.titleBand, Row, 0.5);\n      layoutTitle(view, views.rowtitle, offset2, 0, bounds2, band2);\n    }\n    if (views.coltitle) {\n      anchor = get$1(opt.titleAnchor, Column);\n      offset2 = get$1(off, \"columnTitle\");\n      offset2 = anchor === End$1 ? y22 + offset2 : y2 - offset2;\n      band2 = get$1(opt.titleBand, Column, 0.5);\n      layoutTitle(view, views.coltitle, offset2, 1, bounds2, band2);\n    }\n  }\n  function boundFlush(item, field2) {\n    return field2 === \"x1\" ? item.x || 0 : field2 === \"y1\" ? item.y || 0 : field2 === \"x2\" ? (item.x || 0) + (item.width || 0) : field2 === \"y2\" ? (item.y || 0) + (item.height || 0) : void 0;\n  }\n  function boundFull(item, field2) {\n    return item.bounds[field2];\n  }\n  function layoutHeaders(view, headers, groups, ncols, limit, offset2, agg, isX2, bound2, bf, start, stride, back, band2) {\n    var n = groups.length, init2 = 0, edge = 0, i, j, k, m2, b2, h2, g, x2, y2;\n    if (!n) return init2;\n    for (i = start; i < n; i += stride) {\n      if (groups[i]) init2 = agg(init2, bound2(groups[i], bf));\n    }\n    if (!headers.length) return init2;\n    if (headers.length > limit) {\n      view.warn(\"Grid headers exceed limit: \" + limit);\n      headers = headers.slice(0, limit);\n    }\n    init2 += offset2;\n    for (j = 0, m2 = headers.length; j < m2; ++j) {\n      view.dirty(headers[j]);\n      headers[j].mark.bounds.clear();\n    }\n    for (i = start, j = 0, m2 = headers.length; j < m2; ++j, i += stride) {\n      h2 = headers[j];\n      b2 = h2.mark.bounds;\n      for (k = i; k >= 0 && (g = groups[k]) == null; k -= back) ;\n      if (isX2) {\n        x2 = band2 == null ? g.x : Math.round(g.bounds.x1 + band2 * g.bounds.width());\n        y2 = init2;\n      } else {\n        x2 = init2;\n        y2 = band2 == null ? g.y : Math.round(g.bounds.y1 + band2 * g.bounds.height());\n      }\n      b2.union(h2.bounds.translate(x2 - (h2.x || 0), y2 - (h2.y || 0)));\n      h2.x = x2;\n      h2.y = y2;\n      view.dirty(h2);\n      edge = agg(edge, b2[bf]);\n    }\n    return edge;\n  }\n  function layoutTitle(view, g, offset2, isX2, bounds2, band2) {\n    if (!g) return;\n    view.dirty(g);\n    var x2 = offset2, y2 = offset2;\n    isX2 ? x2 = Math.round(bounds2.x1 + band2 * bounds2.width()) : y2 = Math.round(bounds2.y1 + band2 * bounds2.height());\n    g.bounds.translate(x2 - (g.x || 0), y2 - (g.y || 0));\n    g.mark.bounds.clear().union(g.bounds);\n    g.x = x2;\n    g.y = y2;\n    view.dirty(g);\n  }\n  function lookup$3(config, orient) {\n    const opt = config[orient] || {};\n    return (key2, d2) => opt[key2] != null ? opt[key2] : config[key2] != null ? config[key2] : d2;\n  }\n  function offsets(legends, value2) {\n    let max2 = -Infinity;\n    legends.forEach((item) => {\n      if (item.offset != null) max2 = Math.max(max2, item.offset);\n    });\n    return max2 > -Infinity ? max2 : value2;\n  }\n  function legendParams(g, orient, config, xb, yb, w2, h2) {\n    const _ = lookup$3(config, orient), offset2 = offsets(g, _(\"offset\", 0)), anchor = _(\"anchor\", Start$1), mult2 = anchor === End$1 ? 1 : anchor === Middle$1 ? 0.5 : 0;\n    const p = {\n      align: Each,\n      bounds: _(\"bounds\", Flush),\n      columns: _(\"direction\") === \"vertical\" ? 1 : g.length,\n      padding: _(\"margin\", 8),\n      center: _(\"center\"),\n      nodirty: true\n    };\n    switch (orient) {\n      case Left$1:\n        p.anchor = {\n          x: Math.floor(xb.x1) - offset2,\n          column: End$1,\n          y: mult2 * (h2 || xb.height() + 2 * xb.y1),\n          row: anchor\n        };\n        break;\n      case Right$1:\n        p.anchor = {\n          x: Math.ceil(xb.x2) + offset2,\n          y: mult2 * (h2 || xb.height() + 2 * xb.y1),\n          row: anchor\n        };\n        break;\n      case Top$1:\n        p.anchor = {\n          y: Math.floor(yb.y1) - offset2,\n          row: End$1,\n          x: mult2 * (w2 || yb.width() + 2 * yb.x1),\n          column: anchor\n        };\n        break;\n      case Bottom$1:\n        p.anchor = {\n          y: Math.ceil(yb.y2) + offset2,\n          x: mult2 * (w2 || yb.width() + 2 * yb.x1),\n          column: anchor\n        };\n        break;\n      case TopLeft:\n        p.anchor = {\n          x: offset2,\n          y: offset2\n        };\n        break;\n      case TopRight:\n        p.anchor = {\n          x: w2 - offset2,\n          y: offset2,\n          column: End$1\n        };\n        break;\n      case BottomLeft:\n        p.anchor = {\n          x: offset2,\n          y: h2 - offset2,\n          row: End$1\n        };\n        break;\n      case BottomRight:\n        p.anchor = {\n          x: w2 - offset2,\n          y: h2 - offset2,\n          column: End$1,\n          row: End$1\n        };\n        break;\n    }\n    return p;\n  }\n  function legendLayout(view, legend2) {\n    var item = legend2.items[0], datum2 = item.datum, orient = item.orient, bounds2 = item.bounds, x2 = item.x, y2 = item.y, w2, h2;\n    item._bounds ? item._bounds.clear().union(bounds2) : item._bounds = bounds2.clone();\n    bounds2.clear();\n    legendGroupLayout(view, item, item.items[0].items[0]);\n    bounds2 = legendBounds(item, bounds2);\n    w2 = 2 * item.padding;\n    h2 = 2 * item.padding;\n    if (!bounds2.empty()) {\n      w2 = Math.ceil(bounds2.width() + w2);\n      h2 = Math.ceil(bounds2.height() + h2);\n    }\n    if (datum2.type === Symbols$1) {\n      legendEntryLayout(item.items[0].items[0].items[0].items);\n    }\n    if (orient !== None) {\n      item.x = x2 = 0;\n      item.y = y2 = 0;\n    }\n    item.width = w2;\n    item.height = h2;\n    boundStroke(bounds2.set(x2, y2, x2 + w2, y2 + h2), item);\n    item.mark.bounds.clear().union(bounds2);\n    return item;\n  }\n  function legendBounds(item, b2) {\n    item.items.forEach((_) => b2.union(_.bounds));\n    b2.x1 = item.padding;\n    b2.y1 = item.padding;\n    return b2;\n  }\n  function legendGroupLayout(view, item, entry2) {\n    var pad2 = item.padding, ex = pad2 - entry2.x, ey = pad2 - entry2.y;\n    if (!item.datum.title) {\n      if (ex || ey) translate(view, entry2, ex, ey);\n    } else {\n      var title = item.items[1].items[0], anchor = title.anchor, tpad = item.titlePadding || 0, tx2 = pad2 - title.x, ty2 = pad2 - title.y;\n      switch (title.orient) {\n        case Left$1:\n          ex += Math.ceil(title.bounds.width()) + tpad;\n          break;\n        case Right$1:\n        case Bottom$1:\n          break;\n        default:\n          ey += title.bounds.height() + tpad;\n      }\n      if (ex || ey) translate(view, entry2, ex, ey);\n      switch (title.orient) {\n        case Left$1:\n          ty2 += legendTitleOffset(item, entry2, title, anchor, 1, 1);\n          break;\n        case Right$1:\n          tx2 += legendTitleOffset(item, entry2, title, End$1, 0, 0) + tpad;\n          ty2 += legendTitleOffset(item, entry2, title, anchor, 1, 1);\n          break;\n        case Bottom$1:\n          tx2 += legendTitleOffset(item, entry2, title, anchor, 0, 0);\n          ty2 += legendTitleOffset(item, entry2, title, End$1, -1, 0, 1) + tpad;\n          break;\n        default:\n          tx2 += legendTitleOffset(item, entry2, title, anchor, 0, 0);\n      }\n      if (tx2 || ty2) translate(view, title, tx2, ty2);\n      if ((tx2 = Math.round(title.bounds.x1 - pad2)) < 0) {\n        translate(view, entry2, -tx2, 0);\n        translate(view, title, -tx2, 0);\n      }\n    }\n  }\n  function legendTitleOffset(item, entry2, title, anchor, y2, lr, noBar) {\n    const grad = item.datum.type !== \"symbol\", vgrad = title.datum.vgrad, e = grad && (lr || !vgrad) && !noBar ? entry2.items[0] : entry2, s2 = e.bounds[y2 ? \"y2\" : \"x2\"] - item.padding, u2 = vgrad && lr ? s2 : 0, v = vgrad && lr ? 0 : s2, o = y2 <= 0 ? 0 : multiLineOffset(title);\n    return Math.round(anchor === Start$1 ? u2 : anchor === End$1 ? v - o : 0.5 * (s2 - o));\n  }\n  function translate(view, item, dx, dy) {\n    item.x += dx;\n    item.y += dy;\n    item.bounds.translate(dx, dy);\n    item.mark.bounds.translate(dx, dy);\n    view.dirty(item);\n  }\n  function legendEntryLayout(entries) {\n    const widths = entries.reduce((w2, g) => {\n      w2[g.column] = Math.max(g.bounds.x2 - g.x, w2[g.column] || 0);\n      return w2;\n    }, {});\n    entries.forEach((g) => {\n      g.width = widths[g.column];\n      g.height = g.bounds.y2 - g.y;\n    });\n  }\n  function titleLayout(view, mark, width2, height2, viewBounds2) {\n    var group2 = mark.items[0], frame2 = group2.frame, orient = group2.orient, anchor = group2.anchor, offset2 = group2.offset, padding2 = group2.padding, title = group2.items[0].items[0], subtitle = group2.items[1] && group2.items[1].items[0], end = orient === Left$1 || orient === Right$1 ? height2 : width2, start = 0, x2 = 0, y2 = 0, sx = 0, sy = 0, pos;\n    if (frame2 !== Group) {\n      orient === Left$1 ? (start = viewBounds2.y2, end = viewBounds2.y1) : orient === Right$1 ? (start = viewBounds2.y1, end = viewBounds2.y2) : (start = viewBounds2.x1, end = viewBounds2.x2);\n    } else if (orient === Left$1) {\n      start = height2, end = 0;\n    }\n    pos = anchor === Start$1 ? start : anchor === End$1 ? end : (start + end) / 2;\n    if (subtitle && subtitle.text) {\n      switch (orient) {\n        case Top$1:\n        case Bottom$1:\n          sy = title.bounds.height() + padding2;\n          break;\n        case Left$1:\n          sx = title.bounds.width() + padding2;\n          break;\n        case Right$1:\n          sx = -title.bounds.width() - padding2;\n          break;\n      }\n      tempBounds.clear().union(subtitle.bounds);\n      tempBounds.translate(sx - (subtitle.x || 0), sy - (subtitle.y || 0));\n      if (set$2(subtitle, \"x\", sx) | set$2(subtitle, \"y\", sy)) {\n        view.dirty(subtitle);\n        subtitle.bounds.clear().union(tempBounds);\n        subtitle.mark.bounds.clear().union(tempBounds);\n        view.dirty(subtitle);\n      }\n      tempBounds.clear().union(subtitle.bounds);\n    } else {\n      tempBounds.clear();\n    }\n    tempBounds.union(title.bounds);\n    switch (orient) {\n      case Top$1:\n        x2 = pos;\n        y2 = viewBounds2.y1 - tempBounds.height() - offset2;\n        break;\n      case Left$1:\n        x2 = viewBounds2.x1 - tempBounds.width() - offset2;\n        y2 = pos;\n        break;\n      case Right$1:\n        x2 = viewBounds2.x2 + tempBounds.width() + offset2;\n        y2 = pos;\n        break;\n      case Bottom$1:\n        x2 = pos;\n        y2 = viewBounds2.y2 + offset2;\n        break;\n      default:\n        x2 = group2.x;\n        y2 = group2.y;\n    }\n    if (set$2(group2, \"x\", x2) | set$2(group2, \"y\", y2)) {\n      tempBounds.translate(x2, y2);\n      view.dirty(group2);\n      group2.bounds.clear().union(tempBounds);\n      mark.bounds.clear().union(tempBounds);\n      view.dirty(group2);\n    }\n    return group2.bounds;\n  }\n  function ViewLayout$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(ViewLayout$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow;\n      _.mark.items.forEach((group2) => {\n        if (_.layout) trellisLayout(view, group2, _.layout);\n        layoutGroup(view, group2, _);\n      });\n      return shouldReflow(_.mark.group) ? pulse2.reflow() : pulse2;\n    }\n  });\n  function shouldReflow(group2) {\n    return group2 && group2.mark.role !== \"legend-entry\";\n  }\n  function layoutGroup(view, group2, _) {\n    var items = group2.items, width2 = Math.max(0, group2.width || 0), height2 = Math.max(0, group2.height || 0), viewBounds2 = new Bounds().set(0, 0, width2, height2), xBounds = viewBounds2.clone(), yBounds = viewBounds2.clone(), legends = [], title, mark, orient, b2, i, n;\n    for (i = 0, n = items.length; i < n; ++i) {\n      mark = items[i];\n      switch (mark.role) {\n        case AxisRole$1:\n          b2 = isYAxis(mark) ? xBounds : yBounds;\n          b2.union(axisLayout(view, mark, width2, height2));\n          break;\n        case TitleRole$1:\n          title = mark;\n          break;\n        case LegendRole$1:\n          legends.push(legendLayout(view, mark));\n          break;\n        case FrameRole$1:\n        case ScopeRole$1:\n        case RowHeader:\n        case RowFooter:\n        case RowTitle:\n        case ColHeader:\n        case ColFooter:\n        case ColTitle:\n          xBounds.union(mark.bounds);\n          yBounds.union(mark.bounds);\n          break;\n        default:\n          viewBounds2.union(mark.bounds);\n      }\n    }\n    if (legends.length) {\n      const l = {};\n      legends.forEach((item) => {\n        orient = item.orient || Right$1;\n        if (orient !== None) (l[orient] || (l[orient] = [])).push(item);\n      });\n      for (const orient2 in l) {\n        const g = l[orient2];\n        gridLayout(view, g, legendParams(g, orient2, _.legends, xBounds, yBounds, width2, height2));\n      }\n      legends.forEach((item) => {\n        const b3 = item.bounds;\n        if (!b3.equals(item._bounds)) {\n          item.bounds = item._bounds;\n          view.dirty(item);\n          item.bounds = b3;\n          view.dirty(item);\n        }\n        if (_.autosize && (_.autosize.type === Fit || _.autosize.type === FitX || _.autosize.type === FitY)) {\n          switch (item.orient) {\n            case Left$1:\n            case Right$1:\n              viewBounds2.add(b3.x1, 0).add(b3.x2, 0);\n              break;\n            case Top$1:\n            case Bottom$1:\n              viewBounds2.add(0, b3.y1).add(0, b3.y2);\n          }\n        } else {\n          viewBounds2.union(b3);\n        }\n      });\n    }\n    viewBounds2.union(xBounds).union(yBounds);\n    if (title) {\n      viewBounds2.union(titleLayout(view, title, width2, height2, viewBounds2));\n    }\n    if (group2.clip) {\n      viewBounds2.set(0, 0, group2.width || 0, group2.height || 0);\n    }\n    viewSizeLayout(view, group2, viewBounds2, _);\n  }\n  function viewSizeLayout(view, group2, viewBounds2, _) {\n    const auto = _.autosize || {}, type2 = auto.type;\n    if (view._autosize < 1 || !type2) return;\n    let viewWidth2 = view._width, viewHeight2 = view._height, width2 = Math.max(0, group2.width || 0), left = Math.max(0, Math.ceil(-viewBounds2.x1)), height2 = Math.max(0, group2.height || 0), top = Math.max(0, Math.ceil(-viewBounds2.y1));\n    const right = Math.max(0, Math.ceil(viewBounds2.x2 - width2)), bottom = Math.max(0, Math.ceil(viewBounds2.y2 - height2));\n    if (auto.contains === Padding$1) {\n      const padding2 = view.padding();\n      viewWidth2 -= padding2.left + padding2.right;\n      viewHeight2 -= padding2.top + padding2.bottom;\n    }\n    if (type2 === None) {\n      left = 0;\n      top = 0;\n      width2 = viewWidth2;\n      height2 = viewHeight2;\n    } else if (type2 === Fit) {\n      width2 = Math.max(0, viewWidth2 - left - right);\n      height2 = Math.max(0, viewHeight2 - top - bottom);\n    } else if (type2 === FitX) {\n      width2 = Math.max(0, viewWidth2 - left - right);\n      viewHeight2 = height2 + top + bottom;\n    } else if (type2 === FitY) {\n      viewWidth2 = width2 + left + right;\n      height2 = Math.max(0, viewHeight2 - top - bottom);\n    } else if (type2 === Pad) {\n      viewWidth2 = width2 + left + right;\n      viewHeight2 = height2 + top + bottom;\n    }\n    view._resizeView(viewWidth2, viewHeight2, width2, height2, [left, top], auto.resize);\n  }\n  const vtx = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    bound: Bound$1,\n    identifier: Identifier$1,\n    mark: Mark$1,\n    overlap: Overlap$1,\n    render: Render$1,\n    viewlayout: ViewLayout$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function AxisTicks$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(AxisTicks$1, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var locale2 = pulse2.dataflow.locale(), out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), ticks2 = this.value, scale2 = _.scale, tally = _.count == null ? _.values ? _.values.length : 10 : _.count, count2 = tickCount(scale2, tally, _.minstep), format2 = _.format || tickFormat(locale2, scale2, count2, _.formatSpecifier, _.formatType, !!_.values), values2 = _.values ? validTicks(scale2, _.values, count2) : tickValues(scale2, count2);\n      if (ticks2) out.rem = ticks2;\n      ticks2 = values2.map((value2, i) => ingest$1({\n        index: i / (values2.length - 1 || 1),\n        value: value2,\n        label: format2(value2)\n      }));\n      if (_.extra && ticks2.length) {\n        ticks2.push(ingest$1({\n          index: -1,\n          extra: {\n            value: ticks2[0].value\n          },\n          label: \"\"\n        }));\n      }\n      out.source = ticks2;\n      out.add = ticks2;\n      this.value = ticks2;\n      return out;\n    }\n  });\n  function DataJoin$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  function defaultItemCreate() {\n    return ingest$1({});\n  }\n  function newMap(key2) {\n    const map2 = fastmap().test((t) => t.exit);\n    map2.lookup = (t) => map2.get(key2(t));\n    return map2;\n  }\n  inherits(DataJoin$1, Transform, {\n    transform(_, pulse2) {\n      var df = pulse2.dataflow, out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), item = _.item || defaultItemCreate, key2 = _.key || tupleid, map2 = this.value;\n      if (isArray(out.encode)) {\n        out.encode = null;\n      }\n      if (map2 && (_.modified(\"key\") || pulse2.modified(key2))) {\n        error(\"DataJoin does not support modified key function or fields.\");\n      }\n      if (!map2) {\n        pulse2 = pulse2.addAll();\n        this.value = map2 = newMap(key2);\n      }\n      pulse2.visit(pulse2.ADD, (t) => {\n        const k = key2(t);\n        let x2 = map2.get(k);\n        if (x2) {\n          if (x2.exit) {\n            map2.empty--;\n            out.add.push(x2);\n          } else {\n            out.mod.push(x2);\n          }\n        } else {\n          x2 = item(t);\n          map2.set(k, x2);\n          out.add.push(x2);\n        }\n        x2.datum = t;\n        x2.exit = false;\n      });\n      pulse2.visit(pulse2.MOD, (t) => {\n        const k = key2(t), x2 = map2.get(k);\n        if (x2) {\n          x2.datum = t;\n          out.mod.push(x2);\n        }\n      });\n      pulse2.visit(pulse2.REM, (t) => {\n        const k = key2(t), x2 = map2.get(k);\n        if (t === x2.datum && !x2.exit) {\n          out.rem.push(x2);\n          x2.exit = true;\n          ++map2.empty;\n        }\n      });\n      if (pulse2.changed(pulse2.ADD_MOD)) out.modifies(\"datum\");\n      if (pulse2.clean() || _.clean && map2.empty > df.cleanThreshold) {\n        df.runAfter(map2.clean);\n      }\n      return out;\n    }\n  });\n  function Encode$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Encode$1, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ADD_REM), fmod = _.mod || false, encoders = _.encoders, encode2 = pulse2.encode;\n      if (isArray(encode2)) {\n        if (out.changed() || encode2.every((e) => encoders[e])) {\n          encode2 = encode2[0];\n          out.encode = null;\n        } else {\n          return pulse2.StopPropagation;\n        }\n      }\n      var reenter = encode2 === \"enter\", update2 = encoders.update || falsy, enter = encoders.enter || falsy, exit = encoders.exit || falsy, set2 = (encode2 && !reenter ? encoders[encode2] : update2) || falsy;\n      if (pulse2.changed(pulse2.ADD)) {\n        pulse2.visit(pulse2.ADD, (t) => {\n          enter(t, _);\n          update2(t, _);\n        });\n        out.modifies(enter.output);\n        out.modifies(update2.output);\n        if (set2 !== falsy && set2 !== update2) {\n          pulse2.visit(pulse2.ADD, (t) => {\n            set2(t, _);\n          });\n          out.modifies(set2.output);\n        }\n      }\n      if (pulse2.changed(pulse2.REM) && exit !== falsy) {\n        pulse2.visit(pulse2.REM, (t) => {\n          exit(t, _);\n        });\n        out.modifies(exit.output);\n      }\n      if (reenter || set2 !== falsy) {\n        const flag2 = pulse2.MOD | (_.modified() ? pulse2.REFLOW : 0);\n        if (reenter) {\n          pulse2.visit(flag2, (t) => {\n            const mod = enter(t, _) || fmod;\n            if (set2(t, _) || mod) out.mod.push(t);\n          });\n          if (out.mod.length) out.modifies(enter.output);\n        } else {\n          pulse2.visit(flag2, (t) => {\n            if (set2(t, _) || fmod) out.mod.push(t);\n          });\n        }\n        if (out.mod.length) out.modifies(set2.output);\n      }\n      return out.changed() ? out : pulse2.StopPropagation;\n    }\n  });\n  function LegendEntries$1(params2) {\n    Transform.call(this, [], params2);\n  }\n  inherits(LegendEntries$1, Transform, {\n    transform(_, pulse2) {\n      if (this.value != null && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var locale2 = pulse2.dataflow.locale(), out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), items = this.value, type2 = _.type || SymbolLegend, scale2 = _.scale, limit = +_.limit, count2 = tickCount(scale2, _.count == null ? 5 : _.count, _.minstep), lskip = !!_.values || type2 === SymbolLegend, format2 = _.format || labelFormat(locale2, scale2, count2, type2, _.formatSpecifier, _.formatType, lskip), values2 = _.values || labelValues(scale2, count2), domain2, fraction, size, offset2, ellipsis;\n      if (items) out.rem = items;\n      if (type2 === SymbolLegend) {\n        if (limit && values2.length > limit) {\n          pulse2.dataflow.warn(\"Symbol legend count exceeds limit, filtering items.\");\n          items = values2.slice(0, limit - 1);\n          ellipsis = true;\n        } else {\n          items = values2;\n        }\n        if (isFunction(size = _.size)) {\n          if (!_.values && scale2(items[0]) === 0) {\n            items = items.slice(1);\n          }\n          offset2 = items.reduce((max2, value2) => Math.max(max2, size(value2, _)), 0);\n        } else {\n          size = constant$4(offset2 = size || 8);\n        }\n        items = items.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, items),\n          value: value2,\n          offset: offset2,\n          size: size(value2, _)\n        }));\n        if (ellipsis) {\n          ellipsis = values2[items.length];\n          items.push(ingest$1({\n            index: items.length,\n            label: `…${values2.length - items.length} entries`,\n            value: ellipsis,\n            offset: offset2,\n            size: size(ellipsis, _)\n          }));\n        }\n      } else if (type2 === GradientLegend) {\n        domain2 = scale2.domain(), fraction = scaleFraction(scale2, domain2[0], peek$1(domain2));\n        if (values2.length < 3 && !_.values && domain2[0] !== peek$1(domain2)) {\n          values2 = [domain2[0], peek$1(domain2)];\n        }\n        items = values2.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, values2),\n          value: value2,\n          perc: fraction(value2)\n        }));\n      } else {\n        size = values2.length - 1;\n        fraction = labelFraction(scale2);\n        items = values2.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, values2),\n          value: value2,\n          perc: index2 ? fraction(value2) : 0,\n          perc2: index2 === size ? 1 : fraction(values2[index2 + 1])\n        }));\n      }\n      out.source = items;\n      out.add = items;\n      this.value = items;\n      return out;\n    }\n  });\n  const sourceX = (t) => t.source.x;\n  const sourceY = (t) => t.source.y;\n  const targetX = (t) => t.target.x;\n  const targetY = (t) => t.target.y;\n  function LinkPath(params2) {\n    Transform.call(this, {}, params2);\n  }\n  LinkPath.Definition = {\n    \"type\": \"LinkPath\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"sourceX\",\n      \"type\": \"field\",\n      \"default\": \"source.x\"\n    }, {\n      \"name\": \"sourceY\",\n      \"type\": \"field\",\n      \"default\": \"source.y\"\n    }, {\n      \"name\": \"targetX\",\n      \"type\": \"field\",\n      \"default\": \"target.x\"\n    }, {\n      \"name\": \"targetY\",\n      \"type\": \"field\",\n      \"default\": \"target.y\"\n    }, {\n      \"name\": \"orient\",\n      \"type\": \"enum\",\n      \"default\": \"vertical\",\n      \"values\": [\"horizontal\", \"vertical\", \"radial\"]\n    }, {\n      \"name\": \"shape\",\n      \"type\": \"enum\",\n      \"default\": \"line\",\n      \"values\": [\"line\", \"arc\", \"curve\", \"diagonal\", \"orthogonal\"]\n    }, {\n      \"name\": \"require\",\n      \"type\": \"signal\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  inherits(LinkPath, Transform, {\n    transform(_, pulse2) {\n      var sx = _.sourceX || sourceX, sy = _.sourceY || sourceY, tx2 = _.targetX || targetX, ty2 = _.targetY || targetY, as = _.as || \"path\", orient = _.orient || \"vertical\", shape2 = _.shape || \"line\", path2 = Paths.get(shape2 + \"-\" + orient) || Paths.get(shape2);\n      if (!path2) {\n        error(\"LinkPath unsupported type: \" + _.shape + (_.orient ? \"-\" + _.orient : \"\"));\n      }\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        t[as] = path2(sx(t), sy(t), tx2(t), ty2(t));\n      });\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  const line = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"L\" + tx2 + \",\" + ty2;\n  const lineR = (sa2, sr, ta, tr2) => line(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const arc = (sx, sy, tx2, ty2) => {\n    var dx = tx2 - sx, dy = ty2 - sy, rr = Math.hypot(dx, dy) / 2, ra = 180 * Math.atan2(dy, dx) / Math.PI;\n    return \"M\" + sx + \",\" + sy + \"A\" + rr + \",\" + rr + \" \" + ra + \" 0 1 \" + tx2 + \",\" + ty2;\n  };\n  const arcR = (sa2, sr, ta, tr2) => arc(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const curve = (sx, sy, tx2, ty2) => {\n    const dx = tx2 - sx, dy = ty2 - sy, ix = 0.2 * (dx + dy), iy = 0.2 * (dy - dx);\n    return \"M\" + sx + \",\" + sy + \"C\" + (sx + ix) + \",\" + (sy + iy) + \" \" + (tx2 + iy) + \",\" + (ty2 - ix) + \" \" + tx2 + \",\" + ty2;\n  };\n  const curveR = (sa2, sr, ta, tr2) => curve(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const orthoX = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"V\" + ty2 + \"H\" + tx2;\n  const orthoY = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"H\" + tx2 + \"V\" + ty2;\n  const orthoR = (sa2, sr, ta, tr2) => {\n    const sc = Math.cos(sa2), ss = Math.sin(sa2), tc = Math.cos(ta), ts2 = Math.sin(ta), sf = Math.abs(ta - sa2) > Math.PI ? ta <= sa2 : ta > sa2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"A\" + sr + \",\" + sr + \" 0 0,\" + (sf ? 1 : 0) + \" \" + sr * tc + \",\" + sr * ts2 + \"L\" + tr2 * tc + \",\" + tr2 * ts2;\n  };\n  const diagonalX = (sx, sy, tx2, ty2) => {\n    const m2 = (sx + tx2) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + m2 + \",\" + sy + \" \" + m2 + \",\" + ty2 + \" \" + tx2 + \",\" + ty2;\n  };\n  const diagonalY = (sx, sy, tx2, ty2) => {\n    const m2 = (sy + ty2) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + sx + \",\" + m2 + \" \" + tx2 + \",\" + m2 + \" \" + tx2 + \",\" + ty2;\n  };\n  const diagonalR = (sa2, sr, ta, tr2) => {\n    const sc = Math.cos(sa2), ss = Math.sin(sa2), tc = Math.cos(ta), ts2 = Math.sin(ta), mr = (sr + tr2) / 2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"C\" + mr * sc + \",\" + mr * ss + \" \" + mr * tc + \",\" + mr * ts2 + \" \" + tr2 * tc + \",\" + tr2 * ts2;\n  };\n  const Paths = fastmap({\n    \"line\": line,\n    \"line-radial\": lineR,\n    \"arc\": arc,\n    \"arc-radial\": arcR,\n    \"curve\": curve,\n    \"curve-radial\": curveR,\n    \"orthogonal-horizontal\": orthoX,\n    \"orthogonal-vertical\": orthoY,\n    \"orthogonal-radial\": orthoR,\n    \"diagonal-horizontal\": diagonalX,\n    \"diagonal-vertical\": diagonalY,\n    \"diagonal-radial\": diagonalR\n  });\n  function Pie(params2) {\n    Transform.call(this, null, params2);\n  }\n  Pie.Definition = {\n    \"type\": \"Pie\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"startAngle\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"endAngle\",\n      \"type\": \"number\",\n      \"default\": 6.283185307179586\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"startAngle\", \"endAngle\"]\n    }]\n  };\n  inherits(Pie, Transform, {\n    transform(_, pulse2) {\n      var as = _.as || [\"startAngle\", \"endAngle\"], startAngle = as[0], endAngle = as[1], field2 = _.field || one$1, start = _.startAngle || 0, stop2 = _.endAngle != null ? _.endAngle : 2 * Math.PI, data2 = pulse2.source, values2 = data2.map(field2), n = values2.length, a2 = start, k = (stop2 - start) / sum$1(values2), index2 = range$3(n), i, t, v;\n      if (_.sort) {\n        index2.sort((a3, b2) => values2[a3] - values2[b2]);\n      }\n      for (i = 0; i < n; ++i) {\n        v = values2[index2[i]];\n        t = data2[index2[i]];\n        t[startAngle] = a2;\n        t[endAngle] = a2 += v * k;\n      }\n      this.value = values2;\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  const DEFAULT_COUNT = 5;\n  function includeZero(scale2) {\n    const type2 = scale2.type;\n    return !scale2.bins && (type2 === Linear || type2 === Pow || type2 === Sqrt);\n  }\n  function includePad(type2) {\n    return isContinuous(type2) && type2 !== Sequential;\n  }\n  const SKIP$1 = toSet([\"set\", \"modified\", \"clear\", \"type\", \"scheme\", \"schemeExtent\", \"schemeCount\", \"domain\", \"domainMin\", \"domainMid\", \"domainMax\", \"domainRaw\", \"domainImplicit\", \"nice\", \"zero\", \"bins\", \"range\", \"rangeStep\", \"round\", \"reverse\", \"interpolate\", \"interpolateGamma\"]);\n  function Scale$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Scale$1, Transform, {\n    transform(_, pulse2) {\n      var df = pulse2.dataflow, scale$12 = this.value, key2 = scaleKey(_);\n      if (!scale$12 || key2 !== scale$12.type) {\n        this.value = scale$12 = scale$4(key2)();\n      }\n      for (key2 in _) if (!SKIP$1[key2]) {\n        if (key2 === \"padding\" && includePad(scale$12.type)) continue;\n        isFunction(scale$12[key2]) ? scale$12[key2](_[key2]) : df.warn(\"Unsupported scale property: \" + key2);\n      }\n      configureRange(scale$12, _, configureBins(scale$12, _, configureDomain(scale$12, _, df)));\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function scaleKey(_) {\n    var t = _.type, d2 = \"\", n;\n    if (t === Sequential) return Sequential + \"-\" + Linear;\n    if (isContinuousColor(_)) {\n      n = _.rawDomain ? _.rawDomain.length : _.domain ? _.domain.length + +(_.domainMid != null) : 0;\n      d2 = n === 2 ? Sequential + \"-\" : n === 3 ? Diverging + \"-\" : \"\";\n    }\n    return (d2 + t || Linear).toLowerCase();\n  }\n  function isContinuousColor(_) {\n    const t = _.type;\n    return isContinuous(t) && t !== Time && t !== UTC && (_.scheme || _.range && _.range.length && _.range.every(isString));\n  }\n  function configureDomain(scale2, _, df) {\n    const raw = rawDomain(scale2, _.domainRaw, df);\n    if (raw > -1) return raw;\n    var domain2 = _.domain, type2 = scale2.type, zero2 = _.zero || _.zero === void 0 && includeZero(scale2), n, mid;\n    if (!domain2) return 0;\n    if (zero2 || _.domainMin != null || _.domainMax != null || _.domainMid != null) {\n      n = (domain2 = domain2.slice()).length - 1 || 1;\n      if (zero2) {\n        if (domain2[0] > 0) domain2[0] = 0;\n        if (domain2[n] < 0) domain2[n] = 0;\n      }\n      if (_.domainMin != null) domain2[0] = _.domainMin;\n      if (_.domainMax != null) domain2[n] = _.domainMax;\n      if (_.domainMid != null) {\n        mid = _.domainMid;\n        const i = mid > domain2[n] ? n + 1 : mid < domain2[0] ? 0 : n;\n        if (i !== n) df.warn(\"Scale domainMid exceeds domain min or max.\", mid);\n        domain2.splice(i, 0, mid);\n      }\n    }\n    if (includePad(type2) && _.padding && domain2[0] !== peek$1(domain2)) {\n      domain2 = padDomain(type2, domain2, _.range, _.padding, _.exponent, _.constant);\n    }\n    scale2.domain(domainCheck(type2, domain2, df));\n    if (type2 === Ordinal) {\n      scale2.unknown(_.domainImplicit ? implicit : void 0);\n    }\n    if (_.nice && scale2.nice) {\n      scale2.nice(_.nice !== true && tickCount(scale2, _.nice) || null);\n    }\n    return domain2.length;\n  }\n  function rawDomain(scale2, raw, df) {\n    if (raw) {\n      scale2.domain(domainCheck(scale2.type, raw, df));\n      return raw.length;\n    } else {\n      return -1;\n    }\n  }\n  function padDomain(type2, domain2, range2, pad2, exponent2, constant2) {\n    var span2 = Math.abs(peek$1(range2) - range2[0]), frac = span2 / (span2 - 2 * pad2), d2 = type2 === Log ? zoomLog(domain2, null, frac) : type2 === Sqrt ? zoomPow(domain2, null, frac, 0.5) : type2 === Pow ? zoomPow(domain2, null, frac, exponent2 || 1) : type2 === Symlog ? zoomSymlog(domain2, null, frac, constant2 || 1) : zoomLinear(domain2, null, frac);\n    domain2 = domain2.slice();\n    domain2[0] = d2[0];\n    domain2[domain2.length - 1] = d2[1];\n    return domain2;\n  }\n  function domainCheck(type2, domain2, df) {\n    if (isLogarithmic(type2)) {\n      var s2 = Math.abs(domain2.reduce((s3, v) => s3 + (v < 0 ? -1 : v > 0 ? 1 : 0), 0));\n      if (s2 !== domain2.length) {\n        df.warn(\"Log scale domain includes zero: \" + $(domain2));\n      }\n    }\n    return domain2;\n  }\n  function configureBins(scale2, _, count2) {\n    let bins = _.bins;\n    if (bins && !isArray(bins)) {\n      const domain2 = scale2.domain(), lo = domain2[0], hi = peek$1(domain2), step = bins.step;\n      let start = bins.start == null ? lo : bins.start, stop2 = bins.stop == null ? hi : bins.stop;\n      if (!step) error(\"Scale bins parameter missing step property.\");\n      if (start < lo) start = step * Math.ceil(lo / step);\n      if (stop2 > hi) stop2 = step * Math.floor(hi / step);\n      bins = range$3(start, stop2 + step / 2, step);\n    }\n    if (bins) {\n      scale2.bins = bins;\n    } else if (scale2.bins) {\n      delete scale2.bins;\n    }\n    if (scale2.type === BinOrdinal) {\n      if (!bins) {\n        scale2.bins = scale2.domain();\n      } else if (!_.domain && !_.domainRaw) {\n        scale2.domain(bins);\n        count2 = bins.length;\n      }\n    }\n    return count2;\n  }\n  function configureRange(scale2, _, count2) {\n    var type2 = scale2.type, round = _.round || false, range2 = _.range;\n    if (_.rangeStep != null) {\n      range2 = configureRangeStep(type2, _, count2);\n    } else if (_.scheme) {\n      range2 = configureScheme(type2, _, count2);\n      if (isFunction(range2)) {\n        if (scale2.interpolator) {\n          return scale2.interpolator(range2);\n        } else {\n          error(`Scale type ${type2} does not support interpolating color schemes.`);\n        }\n      }\n    }\n    if (range2 && isInterpolating(type2)) {\n      return scale2.interpolator(interpolateColors(flip(range2, _.reverse), _.interpolate, _.interpolateGamma));\n    }\n    if (range2 && _.interpolate && scale2.interpolate) {\n      scale2.interpolate(interpolate(_.interpolate, _.interpolateGamma));\n    } else if (isFunction(scale2.round)) {\n      scale2.round(round);\n    } else if (isFunction(scale2.rangeRound)) {\n      scale2.interpolate(round ? interpolateRound : interpolate$1);\n    }\n    if (range2) scale2.range(flip(range2, _.reverse));\n  }\n  function configureRangeStep(type2, _, count2) {\n    if (type2 !== Band && type2 !== Point) {\n      error(\"Only band and point scales support rangeStep.\");\n    }\n    var outer = (_.paddingOuter != null ? _.paddingOuter : _.padding) || 0, inner = type2 === Point ? 1 : (_.paddingInner != null ? _.paddingInner : _.padding) || 0;\n    return [0, _.rangeStep * bandSpace(count2, inner, outer)];\n  }\n  function configureScheme(type2, _, count2) {\n    var extent2 = _.schemeExtent, name, scheme$1;\n    if (isArray(_.scheme)) {\n      scheme$1 = interpolateColors(_.scheme, _.interpolate, _.interpolateGamma);\n    } else {\n      name = _.scheme.toLowerCase();\n      scheme$1 = scheme(name);\n      if (!scheme$1) error(`Unrecognized scheme name: ${_.scheme}`);\n    }\n    count2 = type2 === Threshold ? count2 + 1 : type2 === BinOrdinal ? count2 - 1 : type2 === Quantile || type2 === Quantize ? +_.schemeCount || DEFAULT_COUNT : count2;\n    return isInterpolating(type2) ? adjustScheme(scheme$1, extent2, _.reverse) : isFunction(scheme$1) ? quantizeInterpolator(adjustScheme(scheme$1, extent2), count2) : type2 === Ordinal ? scheme$1 : scheme$1.slice(0, count2);\n  }\n  function adjustScheme(scheme2, extent2, reverse2) {\n    return isFunction(scheme2) && (extent2 || reverse2) ? interpolateRange(scheme2, flip(extent2 || [0, 1], reverse2)) : scheme2;\n  }\n  function flip(array2, reverse2) {\n    return reverse2 ? array2.slice().reverse() : array2;\n  }\n  function SortItems$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(SortItems$1, Transform, {\n    transform(_, pulse2) {\n      const mod = _.modified(\"sort\") || pulse2.changed(pulse2.ADD) || pulse2.modified(_.sort.fields) || pulse2.modified(\"datum\");\n      if (mod) pulse2.source.sort(stableCompare(_.sort));\n      this.modified(mod);\n      return pulse2;\n    }\n  });\n  const Zero = \"zero\", Center$1 = \"center\", Normalize = \"normalize\", DefOutput = [\"y0\", \"y1\"];\n  function Stack(params2) {\n    Transform.call(this, null, params2);\n  }\n  Stack.Definition = {\n    \"type\": \"Stack\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"offset\",\n      \"type\": \"enum\",\n      \"default\": Zero,\n      \"values\": [Zero, Center$1, Normalize]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": DefOutput\n    }]\n  };\n  inherits(Stack, Transform, {\n    transform(_, pulse2) {\n      var as = _.as || DefOutput, y02 = as[0], y12 = as[1], sort2 = stableCompare(_.sort), field2 = _.field || one$1, stack = _.offset === Center$1 ? stackCenter : _.offset === Normalize ? stackNormalize : stackZero, groups, i, n, max2;\n      groups = partition$3(pulse2.source, _.groupby, sort2, field2);\n      for (i = 0, n = groups.length, max2 = groups.max; i < n; ++i) {\n        stack(groups[i], max2, field2, y02, y12);\n      }\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  function stackCenter(group2, max2, field2, y02, y12) {\n    var last = (max2 - group2.sum) / 2, m2 = group2.length, j = 0, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      t[y02] = last;\n      t[y12] = last += Math.abs(field2(t));\n    }\n  }\n  function stackNormalize(group2, max2, field2, y02, y12) {\n    var scale2 = 1 / group2.sum, last = 0, m2 = group2.length, j = 0, v = 0, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      t[y02] = last;\n      t[y12] = last = scale2 * (v += Math.abs(field2(t)));\n    }\n  }\n  function stackZero(group2, max2, field2, y02, y12) {\n    var lastPos = 0, lastNeg = 0, m2 = group2.length, j = 0, v, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      v = +field2(t);\n      if (v < 0) {\n        t[y02] = lastNeg;\n        t[y12] = lastNeg += v;\n      } else {\n        t[y02] = lastPos;\n        t[y12] = lastPos += v;\n      }\n    }\n  }\n  function partition$3(data2, groupby, sort2, field2) {\n    var groups = [], get2 = (f) => f(t), map2, i, n, m2, t, k, g, s2, max2;\n    if (groupby == null) {\n      groups.push(data2.slice());\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    for (k = 0, max2 = 0, m2 = groups.length; k < m2; ++k) {\n      g = groups[k];\n      for (i = 0, s2 = 0, n = g.length; i < n; ++i) {\n        s2 += Math.abs(field2(g[i]));\n      }\n      g.sum = s2;\n      if (s2 > max2) max2 = s2;\n      if (sort2) g.sort(sort2);\n    }\n    groups.max = max2;\n    return groups;\n  }\n  const encode$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    axisticks: AxisTicks$1,\n    datajoin: DataJoin$1,\n    encode: Encode$1,\n    legendentries: LegendEntries$1,\n    linkpath: LinkPath,\n    pie: Pie,\n    scale: Scale$1,\n    sortitems: SortItems$1,\n    stack: Stack\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var epsilon$3 = 1e-6;\n  var epsilon2 = 1e-12;\n  var pi$1 = Math.PI;\n  var halfPi$1 = pi$1 / 2;\n  var quarterPi = pi$1 / 4;\n  var tau$1 = pi$1 * 2;\n  var degrees = 180 / pi$1;\n  var radians = pi$1 / 180;\n  var abs$1 = Math.abs;\n  var atan = Math.atan;\n  var atan2 = Math.atan2;\n  var cos$1 = Math.cos;\n  var ceil = Math.ceil;\n  var exp = Math.exp;\n  var hypot = Math.hypot;\n  var log$1 = Math.log;\n  var pow$1 = Math.pow;\n  var sin$1 = Math.sin;\n  var sign = Math.sign || function(x2) {\n    return x2 > 0 ? 1 : x2 < 0 ? -1 : 0;\n  };\n  var sqrt$1 = Math.sqrt;\n  var tan = Math.tan;\n  function acos(x2) {\n    return x2 > 1 ? 0 : x2 < -1 ? pi$1 : Math.acos(x2);\n  }\n  function asin$1(x2) {\n    return x2 > 1 ? halfPi$1 : x2 < -1 ? -halfPi$1 : Math.asin(x2);\n  }\n  function noop$2() {\n  }\n  function streamGeometry(geometry, stream2) {\n    if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n      streamGeometryType[geometry.type](geometry, stream2);\n    }\n  }\n  var streamObjectType = {\n    Feature: function(object2, stream2) {\n      streamGeometry(object2.geometry, stream2);\n    },\n    FeatureCollection: function(object2, stream2) {\n      var features = object2.features, i = -1, n = features.length;\n      while (++i < n) streamGeometry(features[i].geometry, stream2);\n    }\n  };\n  var streamGeometryType = {\n    Sphere: function(object2, stream2) {\n      stream2.sphere();\n    },\n    Point: function(object2, stream2) {\n      object2 = object2.coordinates;\n      stream2.point(object2[0], object2[1], object2[2]);\n    },\n    MultiPoint: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object2 = coordinates[i], stream2.point(object2[0], object2[1], object2[2]);\n    },\n    LineString: function(object2, stream2) {\n      streamLine(object2.coordinates, stream2, 0);\n    },\n    MultiLineString: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) streamLine(coordinates[i], stream2, 0);\n    },\n    Polygon: function(object2, stream2) {\n      streamPolygon(object2.coordinates, stream2);\n    },\n    MultiPolygon: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) streamPolygon(coordinates[i], stream2);\n    },\n    GeometryCollection: function(object2, stream2) {\n      var geometries = object2.geometries, i = -1, n = geometries.length;\n      while (++i < n) streamGeometry(geometries[i], stream2);\n    }\n  };\n  function streamLine(coordinates, stream2, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    stream2.lineStart();\n    while (++i < n) coordinate = coordinates[i], stream2.point(coordinate[0], coordinate[1], coordinate[2]);\n    stream2.lineEnd();\n  }\n  function streamPolygon(coordinates, stream2) {\n    var i = -1, n = coordinates.length;\n    stream2.polygonStart();\n    while (++i < n) streamLine(coordinates[i], stream2, 1);\n    stream2.polygonEnd();\n  }\n  function geoStream(object2, stream2) {\n    if (object2 && streamObjectType.hasOwnProperty(object2.type)) {\n      streamObjectType[object2.type](object2, stream2);\n    } else {\n      streamGeometry(object2, stream2);\n    }\n  }\n  var areaRingSum$1 = new Adder();\n  var areaSum$1 = new Adder(), lambda00$2, phi00$2, lambda0$1, cosPhi0, sinPhi0;\n  var areaStream$1 = {\n    point: noop$2,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: function() {\n      areaRingSum$1 = new Adder();\n      areaStream$1.lineStart = areaRingStart$1;\n      areaStream$1.lineEnd = areaRingEnd$1;\n    },\n    polygonEnd: function() {\n      var areaRing = +areaRingSum$1;\n      areaSum$1.add(areaRing < 0 ? tau$1 + areaRing : areaRing);\n      this.lineStart = this.lineEnd = this.point = noop$2;\n    },\n    sphere: function() {\n      areaSum$1.add(tau$1);\n    }\n  };\n  function areaRingStart$1() {\n    areaStream$1.point = areaPointFirst$1;\n  }\n  function areaRingEnd$1() {\n    areaPoint$1(lambda00$2, phi00$2);\n  }\n  function areaPointFirst$1(lambda, phi2) {\n    areaStream$1.point = areaPoint$1;\n    lambda00$2 = lambda, phi00$2 = phi2;\n    lambda *= radians, phi2 *= radians;\n    lambda0$1 = lambda, cosPhi0 = cos$1(phi2 = phi2 / 2 + quarterPi), sinPhi0 = sin$1(phi2);\n  }\n  function areaPoint$1(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    phi2 = phi2 / 2 + quarterPi;\n    var dLambda = lambda - lambda0$1, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos$1(phi2), sinPhi = sin$1(phi2), k = sinPhi0 * sinPhi, u2 = cosPhi0 * cosPhi + k * cos$1(adLambda), v = k * sdLambda * sin$1(adLambda);\n    areaRingSum$1.add(atan2(v, u2));\n    lambda0$1 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n  }\n  function geoArea$1(object2) {\n    areaSum$1 = new Adder();\n    geoStream(object2, areaStream$1);\n    return areaSum$1 * 2;\n  }\n  function spherical(cartesian2) {\n    return [atan2(cartesian2[1], cartesian2[0]), asin$1(cartesian2[2])];\n  }\n  function cartesian(spherical2) {\n    var lambda = spherical2[0], phi2 = spherical2[1], cosPhi = cos$1(phi2);\n    return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi2)];\n  }\n  function cartesianDot(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];\n  }\n  function cartesianCross(a2, b2) {\n    return [a2[1] * b2[2] - a2[2] * b2[1], a2[2] * b2[0] - a2[0] * b2[2], a2[0] * b2[1] - a2[1] * b2[0]];\n  }\n  function cartesianAddInPlace(a2, b2) {\n    a2[0] += b2[0], a2[1] += b2[1], a2[2] += b2[2];\n  }\n  function cartesianScale(vector, k) {\n    return [vector[0] * k, vector[1] * k, vector[2] * k];\n  }\n  function cartesianNormalizeInPlace(d2) {\n    var l = sqrt$1(d2[0] * d2[0] + d2[1] * d2[1] + d2[2] * d2[2]);\n    d2[0] /= l, d2[1] /= l, d2[2] /= l;\n  }\n  var lambda0, phi0, lambda1, phi1, lambda2, lambda00$1, phi00$1, p0, deltaSum, ranges, range$2;\n  var boundsStream$1 = {\n    point: boundsPoint$1,\n    lineStart: boundsLineStart,\n    lineEnd: boundsLineEnd,\n    polygonStart: function() {\n      boundsStream$1.point = boundsRingPoint;\n      boundsStream$1.lineStart = boundsRingStart;\n      boundsStream$1.lineEnd = boundsRingEnd;\n      deltaSum = new Adder();\n      areaStream$1.polygonStart();\n    },\n    polygonEnd: function() {\n      areaStream$1.polygonEnd();\n      boundsStream$1.point = boundsPoint$1;\n      boundsStream$1.lineStart = boundsLineStart;\n      boundsStream$1.lineEnd = boundsLineEnd;\n      if (areaRingSum$1 < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n      else if (deltaSum > epsilon$3) phi1 = 90;\n      else if (deltaSum < -epsilon$3) phi0 = -90;\n      range$2[0] = lambda0, range$2[1] = lambda1;\n    },\n    sphere: function() {\n      lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n    }\n  };\n  function boundsPoint$1(lambda, phi2) {\n    ranges.push(range$2 = [lambda0 = lambda, lambda1 = lambda]);\n    if (phi2 < phi0) phi0 = phi2;\n    if (phi2 > phi1) phi1 = phi2;\n  }\n  function linePoint(lambda, phi2) {\n    var p = cartesian([lambda * radians, phi2 * radians]);\n    if (p0) {\n      var normal = cartesianCross(p0, p), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal);\n      cartesianNormalizeInPlace(inflection);\n      inflection = spherical(inflection);\n      var delta = lambda - lambda2, sign2 = delta > 0 ? 1 : -1, lambdai = inflection[0] * degrees * sign2, phii, antimeridian = abs$1(delta) > 180;\n      if (antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {\n        phii = inflection[1] * degrees;\n        if (phii > phi1) phi1 = phii;\n      } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {\n        phii = -inflection[1] * degrees;\n        if (phii < phi0) phi0 = phii;\n      } else {\n        if (phi2 < phi0) phi0 = phi2;\n        if (phi2 > phi1) phi1 = phi2;\n      }\n      if (antimeridian) {\n        if (lambda < lambda2) {\n          if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n        } else {\n          if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        }\n      } else {\n        if (lambda1 >= lambda0) {\n          if (lambda < lambda0) lambda0 = lambda;\n          if (lambda > lambda1) lambda1 = lambda;\n        } else {\n          if (lambda > lambda2) {\n            if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n          } else {\n            if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n          }\n        }\n      }\n    } else {\n      ranges.push(range$2 = [lambda0 = lambda, lambda1 = lambda]);\n    }\n    if (phi2 < phi0) phi0 = phi2;\n    if (phi2 > phi1) phi1 = phi2;\n    p0 = p, lambda2 = lambda;\n  }\n  function boundsLineStart() {\n    boundsStream$1.point = linePoint;\n  }\n  function boundsLineEnd() {\n    range$2[0] = lambda0, range$2[1] = lambda1;\n    boundsStream$1.point = boundsPoint$1;\n    p0 = null;\n  }\n  function boundsRingPoint(lambda, phi2) {\n    if (p0) {\n      var delta = lambda - lambda2;\n      deltaSum.add(abs$1(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n    } else {\n      lambda00$1 = lambda, phi00$1 = phi2;\n    }\n    areaStream$1.point(lambda, phi2);\n    linePoint(lambda, phi2);\n  }\n  function boundsRingStart() {\n    areaStream$1.lineStart();\n  }\n  function boundsRingEnd() {\n    boundsRingPoint(lambda00$1, phi00$1);\n    areaStream$1.lineEnd();\n    if (abs$1(deltaSum) > epsilon$3) lambda0 = -(lambda1 = 180);\n    range$2[0] = lambda0, range$2[1] = lambda1;\n    p0 = null;\n  }\n  function angle(lambda02, lambda12) {\n    return (lambda12 -= lambda02) < 0 ? lambda12 + 360 : lambda12;\n  }\n  function rangeCompare(a2, b2) {\n    return a2[0] - b2[0];\n  }\n  function rangeContains(range2, x2) {\n    return range2[0] <= range2[1] ? range2[0] <= x2 && x2 <= range2[1] : x2 < range2[0] || range2[1] < x2;\n  }\n  function geoBounds$1(feature2) {\n    var i, n, a2, b2, merged, deltaMax, delta;\n    phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n    ranges = [];\n    geoStream(feature2, boundsStream$1);\n    if (n = ranges.length) {\n      ranges.sort(rangeCompare);\n      for (i = 1, a2 = ranges[0], merged = [a2]; i < n; ++i) {\n        b2 = ranges[i];\n        if (rangeContains(a2, b2[0]) || rangeContains(a2, b2[1])) {\n          if (angle(a2[0], b2[1]) > angle(a2[0], a2[1])) a2[1] = b2[1];\n          if (angle(b2[0], a2[1]) > angle(a2[0], a2[1])) a2[0] = b2[0];\n        } else {\n          merged.push(a2 = b2);\n        }\n      }\n      for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a2 = merged[n]; i <= n; a2 = b2, ++i) {\n        b2 = merged[i];\n        if ((delta = angle(a2[1], b2[0])) > deltaMax) deltaMax = delta, lambda0 = b2[0], lambda1 = a2[1];\n      }\n    }\n    ranges = range$2 = null;\n    return lambda0 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0, phi0], [lambda1, phi1]];\n  }\n  var W0, W1, X0$1, Y0$1, Z0$1, X1$1, Y1$1, Z1$1, X2$1, Y2$1, Z2$1, lambda00, phi00, x0$4, y0$4, z0;\n  var centroidStream$1 = {\n    sphere: noop$2,\n    point: centroidPoint$1,\n    lineStart: centroidLineStart$1,\n    lineEnd: centroidLineEnd$1,\n    polygonStart: function() {\n      centroidStream$1.lineStart = centroidRingStart$1;\n      centroidStream$1.lineEnd = centroidRingEnd$1;\n    },\n    polygonEnd: function() {\n      centroidStream$1.lineStart = centroidLineStart$1;\n      centroidStream$1.lineEnd = centroidLineEnd$1;\n    }\n  };\n  function centroidPoint$1(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2);\n    centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi2));\n  }\n  function centroidPointCartesian(x2, y2, z2) {\n    ++W0;\n    X0$1 += (x2 - X0$1) / W0;\n    Y0$1 += (y2 - Y0$1) / W0;\n    Z0$1 += (z2 - Z0$1) / W0;\n  }\n  function centroidLineStart$1() {\n    centroidStream$1.point = centroidLinePointFirst;\n  }\n  function centroidLinePointFirst(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2);\n    x0$4 = cosPhi * cos$1(lambda);\n    y0$4 = cosPhi * sin$1(lambda);\n    z0 = sin$1(phi2);\n    centroidStream$1.point = centroidLinePoint;\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidLinePoint(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2), x2 = cosPhi * cos$1(lambda), y2 = cosPhi * sin$1(lambda), z2 = sin$1(phi2), w2 = atan2(sqrt$1((w2 = y0$4 * z2 - z0 * y2) * w2 + (w2 = z0 * x2 - x0$4 * z2) * w2 + (w2 = x0$4 * y2 - y0$4 * x2) * w2), x0$4 * x2 + y0$4 * y2 + z0 * z2);\n    W1 += w2;\n    X1$1 += w2 * (x0$4 + (x0$4 = x2));\n    Y1$1 += w2 * (y0$4 + (y0$4 = y2));\n    Z1$1 += w2 * (z0 + (z0 = z2));\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidLineEnd$1() {\n    centroidStream$1.point = centroidPoint$1;\n  }\n  function centroidRingStart$1() {\n    centroidStream$1.point = centroidRingPointFirst;\n  }\n  function centroidRingEnd$1() {\n    centroidRingPoint(lambda00, phi00);\n    centroidStream$1.point = centroidPoint$1;\n  }\n  function centroidRingPointFirst(lambda, phi2) {\n    lambda00 = lambda, phi00 = phi2;\n    lambda *= radians, phi2 *= radians;\n    centroidStream$1.point = centroidRingPoint;\n    var cosPhi = cos$1(phi2);\n    x0$4 = cosPhi * cos$1(lambda);\n    y0$4 = cosPhi * sin$1(lambda);\n    z0 = sin$1(phi2);\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidRingPoint(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2), x2 = cosPhi * cos$1(lambda), y2 = cosPhi * sin$1(lambda), z2 = sin$1(phi2), cx = y0$4 * z2 - z0 * y2, cy = z0 * x2 - x0$4 * z2, cz = x0$4 * y2 - y0$4 * x2, m2 = hypot(cx, cy, cz), w2 = asin$1(m2), v = m2 && -w2 / m2;\n    X2$1.add(v * cx);\n    Y2$1.add(v * cy);\n    Z2$1.add(v * cz);\n    W1 += w2;\n    X1$1 += w2 * (x0$4 + (x0$4 = x2));\n    Y1$1 += w2 * (y0$4 + (y0$4 = y2));\n    Z1$1 += w2 * (z0 + (z0 = z2));\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function geoCentroid$1(object2) {\n    W0 = W1 = X0$1 = Y0$1 = Z0$1 = X1$1 = Y1$1 = Z1$1 = 0;\n    X2$1 = new Adder();\n    Y2$1 = new Adder();\n    Z2$1 = new Adder();\n    geoStream(object2, centroidStream$1);\n    var x2 = +X2$1, y2 = +Y2$1, z2 = +Z2$1, m2 = hypot(x2, y2, z2);\n    if (m2 < epsilon2) {\n      x2 = X1$1, y2 = Y1$1, z2 = Z1$1;\n      if (W1 < epsilon$3) x2 = X0$1, y2 = Y0$1, z2 = Z0$1;\n      m2 = hypot(x2, y2, z2);\n      if (m2 < epsilon2) return [NaN, NaN];\n    }\n    return [atan2(y2, x2) * degrees, asin$1(z2 / m2) * degrees];\n  }\n  function compose(a2, b2) {\n    function compose2(x2, y2) {\n      return x2 = a2(x2, y2), b2(x2[0], x2[1]);\n    }\n    if (a2.invert && b2.invert) compose2.invert = function(x2, y2) {\n      return x2 = b2.invert(x2, y2), x2 && a2.invert(x2[0], x2[1]);\n    };\n    return compose2;\n  }\n  function rotationIdentity(lambda, phi2) {\n    if (abs$1(lambda) > pi$1) lambda -= Math.round(lambda / tau$1) * tau$1;\n    return [lambda, phi2];\n  }\n  rotationIdentity.invert = rotationIdentity;\n  function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n    return (deltaLambda %= tau$1) ? deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;\n  }\n  function forwardRotationLambda(deltaLambda) {\n    return function(lambda, phi2) {\n      lambda += deltaLambda;\n      if (abs$1(lambda) > pi$1) lambda -= Math.round(lambda / tau$1) * tau$1;\n      return [lambda, phi2];\n    };\n  }\n  function rotationLambda(deltaLambda) {\n    var rotation2 = forwardRotationLambda(deltaLambda);\n    rotation2.invert = forwardRotationLambda(-deltaLambda);\n    return rotation2;\n  }\n  function rotationPhiGamma(deltaPhi, deltaGamma) {\n    var cosDeltaPhi = cos$1(deltaPhi), sinDeltaPhi = sin$1(deltaPhi), cosDeltaGamma = cos$1(deltaGamma), sinDeltaGamma = sin$1(deltaGamma);\n    function rotation2(lambda, phi2) {\n      var cosPhi = cos$1(phi2), x2 = cos$1(lambda) * cosPhi, y2 = sin$1(lambda) * cosPhi, z2 = sin$1(phi2), k = z2 * cosDeltaPhi + x2 * sinDeltaPhi;\n      return [\n        atan2(y2 * cosDeltaGamma - k * sinDeltaGamma, x2 * cosDeltaPhi - z2 * sinDeltaPhi),\n        asin$1(k * cosDeltaGamma + y2 * sinDeltaGamma)\n      ];\n    }\n    rotation2.invert = function(lambda, phi2) {\n      var cosPhi = cos$1(phi2), x2 = cos$1(lambda) * cosPhi, y2 = sin$1(lambda) * cosPhi, z2 = sin$1(phi2), k = z2 * cosDeltaGamma - y2 * sinDeltaGamma;\n      return [\n        atan2(y2 * cosDeltaGamma + z2 * sinDeltaGamma, x2 * cosDeltaPhi + k * sinDeltaPhi),\n        asin$1(k * cosDeltaPhi - x2 * sinDeltaPhi)\n      ];\n    };\n    return rotation2;\n  }\n  function rotation(rotate2) {\n    rotate2 = rotateRadians(rotate2[0] * radians, rotate2[1] * radians, rotate2.length > 2 ? rotate2[2] * radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate2(coordinates[0] * radians, coordinates[1] * radians);\n      return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate2.invert(coordinates[0] * radians, coordinates[1] * radians);\n      return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n    };\n    return forward;\n  }\n  function circleStream(stream2, radius2, delta, direction, t02, t12) {\n    if (!delta) return;\n    var cosRadius = cos$1(radius2), sinRadius = sin$1(radius2), step = direction * delta;\n    if (t02 == null) {\n      t02 = radius2 + direction * tau$1;\n      t12 = radius2 - step / 2;\n    } else {\n      t02 = circleRadius(cosRadius, t02);\n      t12 = circleRadius(cosRadius, t12);\n      if (direction > 0 ? t02 < t12 : t02 > t12) t02 += direction * tau$1;\n    }\n    for (var point2, t = t02; direction > 0 ? t > t12 : t < t12; t -= step) {\n      point2 = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);\n      stream2.point(point2[0], point2[1]);\n    }\n  }\n  function circleRadius(cosRadius, point2) {\n    point2 = cartesian(point2), point2[0] -= cosRadius;\n    cartesianNormalizeInPlace(point2);\n    var radius2 = acos(-point2[1]);\n    return ((-point2[2] < 0 ? -radius2 : radius2) + tau$1 - epsilon$3) % tau$1;\n  }\n  function clipBuffer() {\n    var lines = [], line2;\n    return {\n      point: function(x2, y2, m2) {\n        line2.push([x2, y2, m2]);\n      },\n      lineStart: function() {\n        lines.push(line2 = []);\n      },\n      lineEnd: noop$2,\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      },\n      result: function() {\n        var result = lines;\n        lines = [];\n        line2 = null;\n        return result;\n      }\n    };\n  }\n  function pointEqual(a2, b2) {\n    return abs$1(a2[0] - b2[0]) < epsilon$3 && abs$1(a2[1] - b2[1]) < epsilon$3;\n  }\n  function Intersection(point2, points2, other, entry2) {\n    this.x = point2;\n    this.z = points2;\n    this.o = other;\n    this.e = entry2;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function clipRejoin(segments2, compareIntersection2, startInside, interpolate2, stream2) {\n    var subject = [], clip2 = [], i, n;\n    segments2.forEach(function(segment) {\n      if ((n2 = segment.length - 1) <= 0) return;\n      var n2, p02 = segment[0], p1 = segment[n2], x2;\n      if (pointEqual(p02, p1)) {\n        if (!p02[2] && !p1[2]) {\n          stream2.lineStart();\n          for (i = 0; i < n2; ++i) stream2.point((p02 = segment[i])[0], p02[1]);\n          stream2.lineEnd();\n          return;\n        }\n        p1[0] += 2 * epsilon$3;\n      }\n      subject.push(x2 = new Intersection(p02, segment, null, true));\n      clip2.push(x2.o = new Intersection(p02, null, x2, false));\n      subject.push(x2 = new Intersection(p1, segment, null, false));\n      clip2.push(x2.o = new Intersection(p1, null, x2, true));\n    });\n    if (!subject.length) return;\n    clip2.sort(compareIntersection2);\n    link(subject);\n    link(clip2);\n    for (i = 0, n = clip2.length; i < n; ++i) {\n      clip2[i].e = startInside = !startInside;\n    }\n    var start = subject[0], points2, point2;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points2 = current.z;\n      stream2.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (i = 0, n = points2.length; i < n; ++i) stream2.point((point2 = points2[i])[0], point2[1]);\n          } else {\n            interpolate2(current.x, current.n.x, 1, stream2);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points2 = current.p.z;\n            for (i = points2.length - 1; i >= 0; --i) stream2.point((point2 = points2[i])[0], point2[1]);\n          } else {\n            interpolate2(current.x, current.p.x, -1, stream2);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points2 = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      stream2.lineEnd();\n    }\n  }\n  function link(array2) {\n    if (!(n = array2.length)) return;\n    var n, i = 0, a2 = array2[0], b2;\n    while (++i < n) {\n      a2.n = b2 = array2[i];\n      b2.p = a2;\n      a2 = b2;\n    }\n    a2.n = b2 = array2[0];\n    b2.p = a2;\n  }\n  function longitude(point2) {\n    return abs$1(point2[0]) <= pi$1 ? point2[0] : sign(point2[0]) * ((abs$1(point2[0]) + pi$1) % tau$1 - pi$1);\n  }\n  function polygonContains(polygon, point2) {\n    var lambda = longitude(point2), phi2 = point2[1], sinPhi = sin$1(phi2), normal = [sin$1(lambda), -cos$1(lambda), 0], angle2 = 0, winding = 0;\n    var sum2 = new Adder();\n    if (sinPhi === 1) phi2 = halfPi$1 + epsilon$3;\n    else if (sinPhi === -1) phi2 = -halfPi$1 - epsilon$3;\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      if (!(m2 = (ring = polygon[i]).length)) continue;\n      var ring, m2, point0 = ring[m2 - 1], lambda02 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi02 = sin$1(phi02), cosPhi02 = cos$1(phi02);\n      for (var j = 0; j < m2; ++j, lambda02 = lambda12, sinPhi02 = sinPhi1, cosPhi02 = cosPhi1, point0 = point1) {\n        var point1 = ring[j], lambda12 = longitude(point1), phi12 = point1[1] / 2 + quarterPi, sinPhi1 = sin$1(phi12), cosPhi1 = cos$1(phi12), delta = lambda12 - lambda02, sign2 = delta >= 0 ? 1 : -1, absDelta = sign2 * delta, antimeridian = absDelta > pi$1, k = sinPhi02 * sinPhi1;\n        sum2.add(atan2(k * sign2 * sin$1(absDelta), cosPhi02 * cosPhi1 + k * cos$1(absDelta)));\n        angle2 += antimeridian ? delta + sign2 * tau$1 : delta;\n        if (antimeridian ^ lambda02 >= lambda ^ lambda12 >= lambda) {\n          var arc2 = cartesianCross(cartesian(point0), cartesian(point1));\n          cartesianNormalizeInPlace(arc2);\n          var intersection2 = cartesianCross(normal, arc2);\n          cartesianNormalizeInPlace(intersection2);\n          var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection2[2]);\n          if (phi2 > phiArc || phi2 === phiArc && (arc2[0] || arc2[1])) {\n            winding += antimeridian ^ delta >= 0 ? 1 : -1;\n          }\n        }\n      }\n    }\n    return (angle2 < -epsilon$3 || angle2 < epsilon$3 && sum2 < -epsilon2) ^ winding & 1;\n  }\n  function clip$1(pointVisible, clipLine2, interpolate2, start) {\n    return function(sink) {\n      var line2 = clipLine2(sink), ringBuffer = clipBuffer(), ringSink = clipLine2(ringBuffer), polygonStarted = false, polygon, segments2, ring;\n      var clip2 = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart: function() {\n          clip2.point = pointRing;\n          clip2.lineStart = ringStart;\n          clip2.lineEnd = ringEnd;\n          segments2 = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip2.point = point2;\n          clip2.lineStart = lineStart;\n          clip2.lineEnd = lineEnd;\n          segments2 = merge$4(segments2);\n          var startInside = polygonContains(polygon, start);\n          if (segments2.length) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            clipRejoin(segments2, compareIntersection, startInside, interpolate2, sink);\n          } else if (startInside) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            sink.lineStart();\n            interpolate2(null, null, 1, sink);\n            sink.lineEnd();\n          }\n          if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n          segments2 = polygon = null;\n        },\n        sphere: function() {\n          sink.polygonStart();\n          sink.lineStart();\n          interpolate2(null, null, 1, sink);\n          sink.lineEnd();\n          sink.polygonEnd();\n        }\n      };\n      function point2(lambda, phi2) {\n        if (pointVisible(lambda, phi2)) sink.point(lambda, phi2);\n      }\n      function pointLine(lambda, phi2) {\n        line2.point(lambda, phi2);\n      }\n      function lineStart() {\n        clip2.point = pointLine;\n        line2.lineStart();\n      }\n      function lineEnd() {\n        clip2.point = point2;\n        line2.lineEnd();\n      }\n      function pointRing(lambda, phi2) {\n        ring.push([lambda, phi2]);\n        ringSink.point(lambda, phi2);\n      }\n      function ringStart() {\n        ringSink.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringSink.lineEnd();\n        var clean = ringSink.clean(), ringSegments = ringBuffer.result(), i, n = ringSegments.length, m2, segment, point3;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          if ((m2 = segment.length - 1) > 0) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            sink.lineStart();\n            for (i = 0; i < m2; ++i) sink.point((point3 = segment[i])[0], point3[1]);\n            sink.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments2.push(ringSegments.filter(validSegment));\n      }\n      return clip2;\n    };\n  }\n  function validSegment(segment) {\n    return segment.length > 1;\n  }\n  function compareIntersection(a2, b2) {\n    return ((a2 = a2.x)[0] < 0 ? a2[1] - halfPi$1 - epsilon$3 : halfPi$1 - a2[1]) - ((b2 = b2.x)[0] < 0 ? b2[1] - halfPi$1 - epsilon$3 : halfPi$1 - b2[1]);\n  }\n  const clipAntimeridian = clip$1(\n    function() {\n      return true;\n    },\n    clipAntimeridianLine,\n    clipAntimeridianInterpolate,\n    [-pi$1, -halfPi$1]\n  );\n  function clipAntimeridianLine(stream2) {\n    var lambda02 = NaN, phi02 = NaN, sign0 = NaN, clean;\n    return {\n      lineStart: function() {\n        stream2.lineStart();\n        clean = 1;\n      },\n      point: function(lambda12, phi12) {\n        var sign1 = lambda12 > 0 ? pi$1 : -pi$1, delta = abs$1(lambda12 - lambda02);\n        if (abs$1(delta - pi$1) < epsilon$3) {\n          stream2.point(lambda02, phi02 = (phi02 + phi12) / 2 > 0 ? halfPi$1 : -halfPi$1);\n          stream2.point(sign0, phi02);\n          stream2.lineEnd();\n          stream2.lineStart();\n          stream2.point(sign1, phi02);\n          stream2.point(lambda12, phi02);\n          clean = 0;\n        } else if (sign0 !== sign1 && delta >= pi$1) {\n          if (abs$1(lambda02 - sign0) < epsilon$3) lambda02 -= sign0 * epsilon$3;\n          if (abs$1(lambda12 - sign1) < epsilon$3) lambda12 -= sign1 * epsilon$3;\n          phi02 = clipAntimeridianIntersect(lambda02, phi02, lambda12, phi12);\n          stream2.point(sign0, phi02);\n          stream2.lineEnd();\n          stream2.lineStart();\n          stream2.point(sign1, phi02);\n          clean = 0;\n        }\n        stream2.point(lambda02 = lambda12, phi02 = phi12);\n        sign0 = sign1;\n      },\n      lineEnd: function() {\n        stream2.lineEnd();\n        lambda02 = phi02 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function clipAntimeridianIntersect(lambda02, phi02, lambda12, phi12) {\n    var cosPhi02, cosPhi1, sinLambda0Lambda1 = sin$1(lambda02 - lambda12);\n    return abs$1(sinLambda0Lambda1) > epsilon$3 ? atan((sin$1(phi02) * (cosPhi1 = cos$1(phi12)) * sin$1(lambda12) - sin$1(phi12) * (cosPhi02 = cos$1(phi02)) * sin$1(lambda02)) / (cosPhi02 * cosPhi1 * sinLambda0Lambda1)) : (phi02 + phi12) / 2;\n  }\n  function clipAntimeridianInterpolate(from, to, direction, stream2) {\n    var phi2;\n    if (from == null) {\n      phi2 = direction * halfPi$1;\n      stream2.point(-pi$1, phi2);\n      stream2.point(0, phi2);\n      stream2.point(pi$1, phi2);\n      stream2.point(pi$1, 0);\n      stream2.point(pi$1, -phi2);\n      stream2.point(0, -phi2);\n      stream2.point(-pi$1, -phi2);\n      stream2.point(-pi$1, 0);\n      stream2.point(-pi$1, phi2);\n    } else if (abs$1(from[0] - to[0]) > epsilon$3) {\n      var lambda = from[0] < to[0] ? pi$1 : -pi$1;\n      phi2 = direction * lambda / 2;\n      stream2.point(-lambda, phi2);\n      stream2.point(0, phi2);\n      stream2.point(lambda, phi2);\n    } else {\n      stream2.point(to[0], to[1]);\n    }\n  }\n  function clipCircle(radius2) {\n    var cr2 = cos$1(radius2), delta = 2 * radians, smallRadius = cr2 > 0, notHemisphere = abs$1(cr2) > epsilon$3;\n    function interpolate2(from, to, direction, stream2) {\n      circleStream(stream2, radius2, delta, direction, from, to);\n    }\n    function visible(lambda, phi2) {\n      return cos$1(lambda) * cos$1(phi2) > cr2;\n    }\n    function clipLine2(stream2) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(lambda, phi2) {\n          var point1 = [lambda, phi2], point2, v = visible(lambda, phi2), c2 = smallRadius ? v ? 0 : code(lambda, phi2) : v ? code(lambda + (lambda < 0 ? pi$1 : -pi$1), phi2) : 0;\n          if (!point0 && (v00 = v0 = v)) stream2.lineStart();\n          if (v !== v0) {\n            point2 = intersect2(point0, point1);\n            if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2))\n              point1[2] = 1;\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              stream2.lineStart();\n              point2 = intersect2(point1, point0);\n              stream2.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect2(point0, point1);\n              stream2.point(point2[0], point2[1], 2);\n              stream2.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c2 & c0) && (t = intersect2(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                stream2.lineStart();\n                stream2.point(t[0][0], t[0][1]);\n                stream2.point(t[1][0], t[1][1]);\n                stream2.lineEnd();\n              } else {\n                stream2.point(t[1][0], t[1][1]);\n                stream2.lineEnd();\n                stream2.lineStart();\n                stream2.point(t[0][0], t[0][1], 3);\n              }\n            }\n          }\n          if (v && (!point0 || !pointEqual(point0, point1))) {\n            stream2.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c2;\n        },\n        lineEnd: function() {\n          if (v0) stream2.lineEnd();\n          point0 = null;\n        },\n        // Rejoin first and last segments if there were intersections and the first\n        // and last points were visible.\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect2(a2, b2, two) {\n      var pa2 = cartesian(a2), pb = cartesian(b2);\n      var n1 = [1, 0, 0], n2 = cartesianCross(pa2, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a2;\n      var c1 = cr2 * n2n2 / determinant, c2 = -cr2 * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A5 = cartesianScale(n1, c1), B2 = cartesianScale(n2, c2);\n      cartesianAddInPlace(A5, B2);\n      var u2 = n1xn2, w2 = cartesianDot(A5, u2), uu = cartesianDot(u2, u2), t22 = w2 * w2 - uu * (cartesianDot(A5, A5) - 1);\n      if (t22 < 0) return;\n      var t = sqrt$1(t22), q = cartesianScale(u2, (-w2 - t) / uu);\n      cartesianAddInPlace(q, A5);\n      q = spherical(q);\n      if (!two) return q;\n      var lambda02 = a2[0], lambda12 = b2[0], phi02 = a2[1], phi12 = b2[1], z2;\n      if (lambda12 < lambda02) z2 = lambda02, lambda02 = lambda12, lambda12 = z2;\n      var delta2 = lambda12 - lambda02, polar = abs$1(delta2 - pi$1) < epsilon$3, meridian = polar || delta2 < epsilon$3;\n      if (!polar && phi12 < phi02) z2 = phi02, phi02 = phi12, phi12 = z2;\n      if (meridian ? polar ? phi02 + phi12 > 0 ^ q[1] < (abs$1(q[0] - lambda02) < epsilon$3 ? phi02 : phi12) : phi02 <= q[1] && q[1] <= phi12 : delta2 > pi$1 ^ (lambda02 <= q[0] && q[0] <= lambda12)) {\n        var q1 = cartesianScale(u2, (-w2 + t) / uu);\n        cartesianAddInPlace(q1, A5);\n        return [q, spherical(q1)];\n      }\n    }\n    function code(lambda, phi2) {\n      var r = smallRadius ? radius2 : pi$1 - radius2, code2 = 0;\n      if (lambda < -r) code2 |= 1;\n      else if (lambda > r) code2 |= 2;\n      if (phi2 < -r) code2 |= 4;\n      else if (phi2 > r) code2 |= 8;\n      return code2;\n    }\n    return clip$1(visible, clipLine2, interpolate2, smallRadius ? [0, -radius2] : [-pi$1, radius2 - pi$1]);\n  }\n  function clipLine(a2, b2, x02, y02, x12, y12) {\n    var ax = a2[0], ay = a2[1], bx = b2[0], by = b2[1], t02 = 0, t12 = 1, dx = bx - ax, dy = by - ay, r;\n    r = x02 - ax;\n    if (!dx && r > 0) return;\n    r /= dx;\n    if (dx < 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    } else if (dx > 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    }\n    r = x12 - ax;\n    if (!dx && r < 0) return;\n    r /= dx;\n    if (dx < 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    } else if (dx > 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    }\n    r = y02 - ay;\n    if (!dy && r > 0) return;\n    r /= dy;\n    if (dy < 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    } else if (dy > 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    }\n    r = y12 - ay;\n    if (!dy && r < 0) return;\n    r /= dy;\n    if (dy < 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    } else if (dy > 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    }\n    if (t02 > 0) a2[0] = ax + t02 * dx, a2[1] = ay + t02 * dy;\n    if (t12 < 1) b2[0] = ax + t12 * dx, b2[1] = ay + t12 * dy;\n    return true;\n  }\n  var clipMax = 1e9, clipMin = -clipMax;\n  function clipRectangle(x02, y02, x12, y12) {\n    function visible(x2, y2) {\n      return x02 <= x2 && x2 <= x12 && y02 <= y2 && y2 <= y12;\n    }\n    function interpolate2(from, to, direction, stream2) {\n      var a2 = 0, a1 = 0;\n      if (from == null || (a2 = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {\n        do\n          stream2.point(a2 === 0 || a2 === 3 ? x02 : x12, a2 > 1 ? y12 : y02);\n        while ((a2 = (a2 + direction + 4) % 4) !== a1);\n      } else {\n        stream2.point(to[0], to[1]);\n      }\n    }\n    function corner(p, direction) {\n      return abs$1(p[0] - x02) < epsilon$3 ? direction > 0 ? 0 : 3 : abs$1(p[0] - x12) < epsilon$3 ? direction > 0 ? 2 : 1 : abs$1(p[1] - y02) < epsilon$3 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compareIntersection2(a2, b2) {\n      return comparePoint(a2.x, b2.x);\n    }\n    function comparePoint(a2, b2) {\n      var ca = corner(a2, 1), cb = corner(b2, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b2[1] - a2[1] : ca === 1 ? a2[0] - b2[0] : ca === 2 ? a2[1] - b2[1] : b2[0] - a2[0];\n    }\n    return function(stream2) {\n      var activeStream = stream2, bufferStream = clipBuffer(), segments2, polygon, ring, x__, y__, v__, x_, y_, v_, first, clean;\n      var clipStream = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart,\n        polygonEnd\n      };\n      function point2(x2, y2) {\n        if (visible(x2, y2)) activeStream.point(x2, y2);\n      }\n      function polygonInside() {\n        var winding = 0;\n        for (var i = 0, n = polygon.length; i < n; ++i) {\n          for (var ring2 = polygon[i], j = 1, m2 = ring2.length, point3 = ring2[0], a0, a1, b0 = point3[0], b1 = point3[1]; j < m2; ++j) {\n            a0 = b0, a1 = b1, point3 = ring2[j], b0 = point3[0], b1 = point3[1];\n            if (a1 <= y12) {\n              if (b1 > y12 && (b0 - a0) * (y12 - a1) > (b1 - a1) * (x02 - a0)) ++winding;\n            } else {\n              if (b1 <= y12 && (b0 - a0) * (y12 - a1) < (b1 - a1) * (x02 - a0)) --winding;\n            }\n          }\n        }\n        return winding;\n      }\n      function polygonStart() {\n        activeStream = bufferStream, segments2 = [], polygon = [], clean = true;\n      }\n      function polygonEnd() {\n        var startInside = polygonInside(), cleanInside = clean && startInside, visible2 = (segments2 = merge$4(segments2)).length;\n        if (cleanInside || visible2) {\n          stream2.polygonStart();\n          if (cleanInside) {\n            stream2.lineStart();\n            interpolate2(null, null, 1, stream2);\n            stream2.lineEnd();\n          }\n          if (visible2) {\n            clipRejoin(segments2, compareIntersection2, startInside, interpolate2, stream2);\n          }\n          stream2.polygonEnd();\n        }\n        activeStream = stream2, segments2 = polygon = ring = null;\n      }\n      function lineStart() {\n        clipStream.point = linePoint2;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments2) {\n          linePoint2(x__, y__);\n          if (v__ && v_) bufferStream.rejoin();\n          segments2.push(bufferStream.result());\n        }\n        clipStream.point = point2;\n        if (v_) activeStream.lineEnd();\n      }\n      function linePoint2(x2, y2) {\n        var v = visible(x2, y2);\n        if (polygon) ring.push([x2, y2]);\n        if (first) {\n          x__ = x2, y__ = y2, v__ = v;\n          first = false;\n          if (v) {\n            activeStream.lineStart();\n            activeStream.point(x2, y2);\n          }\n        } else {\n          if (v && v_) activeStream.point(x2, y2);\n          else {\n            var a2 = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], b2 = [x2 = Math.max(clipMin, Math.min(clipMax, x2)), y2 = Math.max(clipMin, Math.min(clipMax, y2))];\n            if (clipLine(a2, b2, x02, y02, x12, y12)) {\n              if (!v_) {\n                activeStream.lineStart();\n                activeStream.point(a2[0], a2[1]);\n              }\n              activeStream.point(b2[0], b2[1]);\n              if (!v) activeStream.lineEnd();\n              clean = false;\n            } else if (v) {\n              activeStream.lineStart();\n              activeStream.point(x2, y2);\n              clean = false;\n            }\n          }\n        }\n        x_ = x2, y_ = y2, v_ = v;\n      }\n      return clipStream;\n    };\n  }\n  function graticuleX(y02, y12, dy) {\n    var y2 = range$3(y02, y12 - epsilon$3, dy).concat(y12);\n    return function(x2) {\n      return y2.map(function(y3) {\n        return [x2, y3];\n      });\n    };\n  }\n  function graticuleY(x02, x12, dx) {\n    var x2 = range$3(x02, x12 - epsilon$3, dx).concat(x12);\n    return function(y2) {\n      return x2.map(function(x3) {\n        return [x3, y2];\n      });\n    };\n  }\n  function graticule() {\n    var x12, x02, X12, X02, y12, y02, Y12, Y02, dx = 10, dy = dx, DX = 90, DY = 360, x2, y2, X3, Y3, precision = 2.5;\n    function graticule2() {\n      return { type: \"MultiLineString\", coordinates: lines() };\n    }\n    function lines() {\n      return range$3(ceil(X02 / DX) * DX, X12, DX).map(X3).concat(range$3(ceil(Y02 / DY) * DY, Y12, DY).map(Y3)).concat(range$3(ceil(x02 / dx) * dx, x12, dx).filter(function(x3) {\n        return abs$1(x3 % DX) > epsilon$3;\n      }).map(x2)).concat(range$3(ceil(y02 / dy) * dy, y12, dy).filter(function(y3) {\n        return abs$1(y3 % DY) > epsilon$3;\n      }).map(y2));\n    }\n    graticule2.lines = function() {\n      return lines().map(function(coordinates) {\n        return { type: \"LineString\", coordinates };\n      });\n    };\n    graticule2.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [\n          X3(X02).concat(\n            Y3(Y12).slice(1),\n            X3(X12).reverse().slice(1),\n            Y3(Y02).reverse().slice(1)\n          )\n        ]\n      };\n    };\n    graticule2.extent = function(_) {\n      if (!arguments.length) return graticule2.extentMinor();\n      return graticule2.extentMajor(_).extentMinor(_);\n    };\n    graticule2.extentMajor = function(_) {\n      if (!arguments.length) return [[X02, Y02], [X12, Y12]];\n      X02 = +_[0][0], X12 = +_[1][0];\n      Y02 = +_[0][1], Y12 = +_[1][1];\n      if (X02 > X12) _ = X02, X02 = X12, X12 = _;\n      if (Y02 > Y12) _ = Y02, Y02 = Y12, Y12 = _;\n      return graticule2.precision(precision);\n    };\n    graticule2.extentMinor = function(_) {\n      if (!arguments.length) return [[x02, y02], [x12, y12]];\n      x02 = +_[0][0], x12 = +_[1][0];\n      y02 = +_[0][1], y12 = +_[1][1];\n      if (x02 > x12) _ = x02, x02 = x12, x12 = _;\n      if (y02 > y12) _ = y02, y02 = y12, y12 = _;\n      return graticule2.precision(precision);\n    };\n    graticule2.step = function(_) {\n      if (!arguments.length) return graticule2.stepMinor();\n      return graticule2.stepMajor(_).stepMinor(_);\n    };\n    graticule2.stepMajor = function(_) {\n      if (!arguments.length) return [DX, DY];\n      DX = +_[0], DY = +_[1];\n      return graticule2;\n    };\n    graticule2.stepMinor = function(_) {\n      if (!arguments.length) return [dx, dy];\n      dx = +_[0], dy = +_[1];\n      return graticule2;\n    };\n    graticule2.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x2 = graticuleX(y02, y12, 90);\n      y2 = graticuleY(x02, x12, precision);\n      X3 = graticuleX(Y02, Y12, 90);\n      Y3 = graticuleY(X02, X12, precision);\n      return graticule2;\n    };\n    return graticule2.extentMajor([[-180, -90 + epsilon$3], [180, 90 - epsilon$3]]).extentMinor([[-180, -80 - epsilon$3], [180, 80 + epsilon$3]]);\n  }\n  const identity = (x2) => x2;\n  var areaSum = new Adder(), areaRingSum = new Adder(), x00$2, y00$2, x0$3, y0$3;\n  var areaStream = {\n    point: noop$2,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: function() {\n      areaStream.lineStart = areaRingStart;\n      areaStream.lineEnd = areaRingEnd;\n    },\n    polygonEnd: function() {\n      areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$2;\n      areaSum.add(abs$1(areaRingSum));\n      areaRingSum = new Adder();\n    },\n    result: function() {\n      var area2 = areaSum / 2;\n      areaSum = new Adder();\n      return area2;\n    }\n  };\n  function areaRingStart() {\n    areaStream.point = areaPointFirst;\n  }\n  function areaPointFirst(x2, y2) {\n    areaStream.point = areaPoint;\n    x00$2 = x0$3 = x2, y00$2 = y0$3 = y2;\n  }\n  function areaPoint(x2, y2) {\n    areaRingSum.add(y0$3 * x2 - x0$3 * y2);\n    x0$3 = x2, y0$3 = y2;\n  }\n  function areaRingEnd() {\n    areaPoint(x00$2, y00$2);\n  }\n  var x0$2 = Infinity, y0$2 = x0$2, x1 = -x0$2, y1 = x1;\n  var boundsStream = {\n    point: boundsPoint,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: noop$2,\n    polygonEnd: noop$2,\n    result: function() {\n      var bounds2 = [[x0$2, y0$2], [x1, y1]];\n      x1 = y1 = -(y0$2 = x0$2 = Infinity);\n      return bounds2;\n    }\n  };\n  function boundsPoint(x2, y2) {\n    if (x2 < x0$2) x0$2 = x2;\n    if (x2 > x1) x1 = x2;\n    if (y2 < y0$2) y0$2 = y2;\n    if (y2 > y1) y1 = y2;\n  }\n  var X0 = 0, Y0 = 0, Z0 = 0, X1 = 0, Y1 = 0, Z1 = 0, X2 = 0, Y2 = 0, Z2 = 0, x00$1, y00$1, x0$1, y0$1;\n  var centroidStream = {\n    point: centroidPoint,\n    lineStart: centroidLineStart,\n    lineEnd: centroidLineEnd,\n    polygonStart: function() {\n      centroidStream.lineStart = centroidRingStart;\n      centroidStream.lineEnd = centroidRingEnd;\n    },\n    polygonEnd: function() {\n      centroidStream.point = centroidPoint;\n      centroidStream.lineStart = centroidLineStart;\n      centroidStream.lineEnd = centroidLineEnd;\n    },\n    result: function() {\n      var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];\n      X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;\n      return centroid;\n    }\n  };\n  function centroidPoint(x2, y2) {\n    X0 += x2;\n    Y0 += y2;\n    ++Z0;\n  }\n  function centroidLineStart() {\n    centroidStream.point = centroidPointFirstLine;\n  }\n  function centroidPointFirstLine(x2, y2) {\n    centroidStream.point = centroidPointLine;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function centroidPointLine(x2, y2) {\n    var dx = x2 - x0$1, dy = y2 - y0$1, z2 = sqrt$1(dx * dx + dy * dy);\n    X1 += z2 * (x0$1 + x2) / 2;\n    Y1 += z2 * (y0$1 + y2) / 2;\n    Z1 += z2;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function centroidLineEnd() {\n    centroidStream.point = centroidPoint;\n  }\n  function centroidRingStart() {\n    centroidStream.point = centroidPointFirstRing;\n  }\n  function centroidRingEnd() {\n    centroidPointRing(x00$1, y00$1);\n  }\n  function centroidPointFirstRing(x2, y2) {\n    centroidStream.point = centroidPointRing;\n    centroidPoint(x00$1 = x0$1 = x2, y00$1 = y0$1 = y2);\n  }\n  function centroidPointRing(x2, y2) {\n    var dx = x2 - x0$1, dy = y2 - y0$1, z2 = sqrt$1(dx * dx + dy * dy);\n    X1 += z2 * (x0$1 + x2) / 2;\n    Y1 += z2 * (y0$1 + y2) / 2;\n    Z1 += z2;\n    z2 = y0$1 * x2 - x0$1 * y2;\n    X2 += z2 * (x0$1 + x2);\n    Y2 += z2 * (y0$1 + y2);\n    Z2 += z2 * 3;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function PathContext(context2) {\n    this._context = context2;\n  }\n  PathContext.prototype = {\n    _radius: 4.5,\n    pointRadius: function(_) {\n      return this._radius = _, this;\n    },\n    polygonStart: function() {\n      this._line = 0;\n    },\n    polygonEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line === 0) this._context.closePath();\n      this._point = NaN;\n    },\n    point: function(x2, y2) {\n      switch (this._point) {\n        case 0: {\n          this._context.moveTo(x2, y2);\n          this._point = 1;\n          break;\n        }\n        case 1: {\n          this._context.lineTo(x2, y2);\n          break;\n        }\n        default: {\n          this._context.moveTo(x2 + this._radius, y2);\n          this._context.arc(x2, y2, this._radius, 0, tau$1);\n          break;\n        }\n      }\n    },\n    result: noop$2\n  };\n  var lengthSum = new Adder(), lengthRing, x00, y00, x0, y0;\n  var lengthStream = {\n    point: noop$2,\n    lineStart: function() {\n      lengthStream.point = lengthPointFirst;\n    },\n    lineEnd: function() {\n      if (lengthRing) lengthPoint(x00, y00);\n      lengthStream.point = noop$2;\n    },\n    polygonStart: function() {\n      lengthRing = true;\n    },\n    polygonEnd: function() {\n      lengthRing = null;\n    },\n    result: function() {\n      var length2 = +lengthSum;\n      lengthSum = new Adder();\n      return length2;\n    }\n  };\n  function lengthPointFirst(x2, y2) {\n    lengthStream.point = lengthPoint;\n    x00 = x0 = x2, y00 = y0 = y2;\n  }\n  function lengthPoint(x2, y2) {\n    x0 -= x2, y0 -= y2;\n    lengthSum.add(sqrt$1(x0 * x0 + y0 * y0));\n    x0 = x2, y0 = y2;\n  }\n  let cacheDigits, cacheAppend, cacheRadius, cacheCircle;\n  class PathString {\n    constructor(digits) {\n      this._append = digits == null ? append : appendRound(digits);\n      this._radius = 4.5;\n      this._ = \"\";\n    }\n    pointRadius(_) {\n      this._radius = +_;\n      return this;\n    }\n    polygonStart() {\n      this._line = 0;\n    }\n    polygonEnd() {\n      this._line = NaN;\n    }\n    lineStart() {\n      this._point = 0;\n    }\n    lineEnd() {\n      if (this._line === 0) this._ += \"Z\";\n      this._point = NaN;\n    }\n    point(x2, y2) {\n      switch (this._point) {\n        case 0: {\n          this._append`M${x2},${y2}`;\n          this._point = 1;\n          break;\n        }\n        case 1: {\n          this._append`L${x2},${y2}`;\n          break;\n        }\n        default: {\n          this._append`M${x2},${y2}`;\n          if (this._radius !== cacheRadius || this._append !== cacheAppend) {\n            const r = this._radius;\n            const s2 = this._;\n            this._ = \"\";\n            this._append`m0,${r}a${r},${r} 0 1,1 0,${-2 * r}a${r},${r} 0 1,1 0,${2 * r}z`;\n            cacheRadius = r;\n            cacheAppend = this._append;\n            cacheCircle = this._;\n            this._ = s2;\n          }\n          this._ += cacheCircle;\n          break;\n        }\n      }\n    }\n    result() {\n      const result = this._;\n      this._ = \"\";\n      return result.length ? result : null;\n    }\n  }\n  function append(strings2) {\n    let i = 1;\n    this._ += strings2[0];\n    for (const j = strings2.length; i < j; ++i) {\n      this._ += arguments[i] + strings2[i];\n    }\n  }\n  function appendRound(digits) {\n    const d2 = Math.floor(digits);\n    if (!(d2 >= 0)) throw new RangeError(`invalid digits: ${digits}`);\n    if (d2 > 15) return append;\n    if (d2 !== cacheDigits) {\n      const k = 10 ** d2;\n      cacheDigits = d2;\n      cacheAppend = function append2(strings2) {\n        let i = 1;\n        this._ += strings2[0];\n        for (const j = strings2.length; i < j; ++i) {\n          this._ += Math.round(arguments[i] * k) / k + strings2[i];\n        }\n      };\n    }\n    return cacheAppend;\n  }\n  function geoPath(projection2, context2) {\n    let digits = 3, pointRadius = 4.5, projectionStream, contextStream;\n    function path2(object2) {\n      if (object2) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        geoStream(object2, projectionStream(contextStream));\n      }\n      return contextStream.result();\n    }\n    path2.area = function(object2) {\n      geoStream(object2, projectionStream(areaStream));\n      return areaStream.result();\n    };\n    path2.measure = function(object2) {\n      geoStream(object2, projectionStream(lengthStream));\n      return lengthStream.result();\n    };\n    path2.bounds = function(object2) {\n      geoStream(object2, projectionStream(boundsStream));\n      return boundsStream.result();\n    };\n    path2.centroid = function(object2) {\n      geoStream(object2, projectionStream(centroidStream));\n      return centroidStream.result();\n    };\n    path2.projection = function(_) {\n      if (!arguments.length) return projection2;\n      projectionStream = _ == null ? (projection2 = null, identity) : (projection2 = _).stream;\n      return path2;\n    };\n    path2.context = function(_) {\n      if (!arguments.length) return context2;\n      contextStream = _ == null ? (context2 = null, new PathString(digits)) : new PathContext(context2 = _);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return path2;\n    };\n    path2.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path2;\n    };\n    path2.digits = function(_) {\n      if (!arguments.length) return digits;\n      if (_ == null) digits = null;\n      else {\n        const d2 = Math.floor(_);\n        if (!(d2 >= 0)) throw new RangeError(`invalid digits: ${_}`);\n        digits = d2;\n      }\n      if (context2 === null) contextStream = new PathString(digits);\n      return path2;\n    };\n    return path2.projection(projection2).digits(digits).context(context2);\n  }\n  function transformer(methods2) {\n    return function(stream2) {\n      var s2 = new TransformStream();\n      for (var key2 in methods2) s2[key2] = methods2[key2];\n      s2.stream = stream2;\n      return s2;\n    };\n  }\n  function TransformStream() {\n  }\n  TransformStream.prototype = {\n    constructor: TransformStream,\n    point: function(x2, y2) {\n      this.stream.point(x2, y2);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function fit$1(projection2, fitBounds, object2) {\n    var clip2 = projection2.clipExtent && projection2.clipExtent();\n    projection2.scale(150).translate([0, 0]);\n    if (clip2 != null) projection2.clipExtent(null);\n    geoStream(object2, projection2.stream(boundsStream));\n    fitBounds(boundsStream.result());\n    if (clip2 != null) projection2.clipExtent(clip2);\n    return projection2;\n  }\n  function fitExtent(projection2, extent2, object2) {\n    return fit$1(projection2, function(b2) {\n      var w2 = extent2[1][0] - extent2[0][0], h2 = extent2[1][1] - extent2[0][1], k = Math.min(w2 / (b2[1][0] - b2[0][0]), h2 / (b2[1][1] - b2[0][1])), x2 = +extent2[0][0] + (w2 - k * (b2[1][0] + b2[0][0])) / 2, y2 = +extent2[0][1] + (h2 - k * (b2[1][1] + b2[0][1])) / 2;\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  function fitSize(projection2, size, object2) {\n    return fitExtent(projection2, [[0, 0], size], object2);\n  }\n  function fitWidth(projection2, width2, object2) {\n    return fit$1(projection2, function(b2) {\n      var w2 = +width2, k = w2 / (b2[1][0] - b2[0][0]), x2 = (w2 - k * (b2[1][0] + b2[0][0])) / 2, y2 = -k * b2[0][1];\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  function fitHeight(projection2, height2, object2) {\n    return fit$1(projection2, function(b2) {\n      var h2 = +height2, k = h2 / (b2[1][1] - b2[0][1]), x2 = -k * b2[0][0], y2 = (h2 - k * (b2[1][1] + b2[0][1])) / 2;\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  var maxDepth = 16, cosMinDistance = cos$1(30 * radians);\n  function resample(project2, delta2) {\n    return +delta2 ? resample$1(project2, delta2) : resampleNone(project2);\n  }\n  function resampleNone(project2) {\n    return transformer({\n      point: function(x2, y2) {\n        x2 = project2(x2, y2);\n        this.stream.point(x2[0], x2[1]);\n      }\n    });\n  }\n  function resample$1(project2, delta2) {\n    function resampleLineTo(x02, y02, lambda02, a0, b0, c0, x12, y12, lambda12, a1, b1, c1, depth, stream2) {\n      var dx = x12 - x02, dy = y12 - y02, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * delta2 && depth--) {\n        var a2 = a0 + a1, b2 = b0 + b1, c2 = c0 + c1, m2 = sqrt$1(a2 * a2 + b2 * b2 + c2 * c2), phi2 = asin$1(c2 /= m2), lambda22 = abs$1(abs$1(c2) - 1) < epsilon$3 || abs$1(lambda02 - lambda12) < epsilon$3 ? (lambda02 + lambda12) / 2 : atan2(b2, a2), p = project2(lambda22, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x02, dy2 = y2 - y02, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > delta2 || abs$1((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x02, y02, lambda02, a0, b0, c0, x2, y2, lambda22, a2 /= m2, b2 /= m2, c2, depth, stream2);\n          stream2.point(x2, y2);\n          resampleLineTo(x2, y2, lambda22, a2, b2, c2, x12, y12, lambda12, a1, b1, c1, depth, stream2);\n        }\n      }\n    }\n    return function(stream2) {\n      var lambda002, x002, y002, a00, b00, c00, lambda02, x02, y02, a0, b0, c0;\n      var resampleStream = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart: function() {\n          stream2.polygonStart();\n          resampleStream.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream2.polygonEnd();\n          resampleStream.lineStart = lineStart;\n        }\n      };\n      function point2(x2, y2) {\n        x2 = project2(x2, y2);\n        stream2.point(x2[0], x2[1]);\n      }\n      function lineStart() {\n        x02 = NaN;\n        resampleStream.point = linePoint2;\n        stream2.lineStart();\n      }\n      function linePoint2(lambda, phi2) {\n        var c2 = cartesian([lambda, phi2]), p = project2(lambda, phi2);\n        resampleLineTo(x02, y02, lambda02, a0, b0, c0, x02 = p[0], y02 = p[1], lambda02 = lambda, a0 = c2[0], b0 = c2[1], c0 = c2[2], maxDepth, stream2);\n        stream2.point(x02, y02);\n      }\n      function lineEnd() {\n        resampleStream.point = point2;\n        stream2.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resampleStream.point = ringPoint;\n        resampleStream.lineEnd = ringEnd;\n      }\n      function ringPoint(lambda, phi2) {\n        linePoint2(lambda002 = lambda, phi2), x002 = x02, y002 = y02, a00 = a0, b00 = b0, c00 = c0;\n        resampleStream.point = linePoint2;\n      }\n      function ringEnd() {\n        resampleLineTo(x02, y02, lambda02, a0, b0, c0, x002, y002, lambda002, a00, b00, c00, maxDepth, stream2);\n        resampleStream.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resampleStream;\n    };\n  }\n  var transformRadians = transformer({\n    point: function(x2, y2) {\n      this.stream.point(x2 * radians, y2 * radians);\n    }\n  });\n  function transformRotate(rotate2) {\n    return transformer({\n      point: function(x2, y2) {\n        var r = rotate2(x2, y2);\n        return this.stream.point(r[0], r[1]);\n      }\n    });\n  }\n  function scaleTranslate(k, dx, dy, sx, sy) {\n    function transform2(x2, y2) {\n      x2 *= sx;\n      y2 *= sy;\n      return [dx + k * x2, dy - k * y2];\n    }\n    transform2.invert = function(x2, y2) {\n      return [(x2 - dx) / k * sx, (dy - y2) / k * sy];\n    };\n    return transform2;\n  }\n  function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n    if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n    var cosAlpha = cos$1(alpha), sinAlpha = sin$1(alpha), a2 = cosAlpha * k, b2 = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;\n    function transform2(x2, y2) {\n      x2 *= sx;\n      y2 *= sy;\n      return [a2 * x2 - b2 * y2 + dx, dy - b2 * x2 - a2 * y2];\n    }\n    transform2.invert = function(x2, y2) {\n      return [sx * (ai * x2 - bi * y2 + ci), sy * (fi - bi * x2 - ai * y2)];\n    };\n    return transform2;\n  }\n  function projection$1(project2) {\n    return projectionMutator(function() {\n      return project2;\n    })();\n  }\n  function projectionMutator(projectAt) {\n    var project2, k = 150, x2 = 480, y2 = 250, lambda = 0, phi2 = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate2, alpha = 0, sx = 1, sy = 1, theta = null, preclip = clipAntimeridian, x02 = null, y02, x12, y12, postclip = identity, delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache2, cacheStream;\n    function projection2(point2) {\n      return projectRotateTransform(point2[0] * radians, point2[1] * radians);\n    }\n    function invert2(point2) {\n      point2 = projectRotateTransform.invert(point2[0], point2[1]);\n      return point2 && [point2[0] * degrees, point2[1] * degrees];\n    }\n    projection2.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = transformRadians(transformRotate(rotate2)(preclip(projectResample(postclip(cacheStream = stream2)))));\n    };\n    projection2.preclip = function(_) {\n      return arguments.length ? (preclip = _, theta = void 0, reset2()) : preclip;\n    };\n    projection2.postclip = function(_) {\n      return arguments.length ? (postclip = _, x02 = y02 = x12 = y12 = null, reset2()) : postclip;\n    };\n    projection2.clipAngle = function(_) {\n      return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset2()) : theta * degrees;\n    };\n    projection2.clipExtent = function(_) {\n      return arguments.length ? (postclip = _ == null ? (x02 = y02 = x12 = y12 = null, identity) : clipRectangle(x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset2()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    projection2.scale = function(_) {\n      return arguments.length ? (k = +_, recenter()) : k;\n    };\n    projection2.translate = function(_) {\n      return arguments.length ? (x2 = +_[0], y2 = +_[1], recenter()) : [x2, y2];\n    };\n    projection2.center = function(_) {\n      return arguments.length ? (lambda = _[0] % 360 * radians, phi2 = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi2 * degrees];\n    };\n    projection2.rotate = function(_) {\n      return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n    };\n    projection2.angle = function(_) {\n      return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n    };\n    projection2.reflectX = function(_) {\n      return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n    };\n    projection2.reflectY = function(_) {\n      return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n    };\n    projection2.precision = function(_) {\n      return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset2()) : sqrt$1(delta2);\n    };\n    projection2.fitExtent = function(extent2, object2) {\n      return fitExtent(projection2, extent2, object2);\n    };\n    projection2.fitSize = function(size, object2) {\n      return fitSize(projection2, size, object2);\n    };\n    projection2.fitWidth = function(width2, object2) {\n      return fitWidth(projection2, width2, object2);\n    };\n    projection2.fitHeight = function(height2, object2) {\n      return fitHeight(projection2, height2, object2);\n    };\n    function recenter() {\n      var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project2(lambda, phi2)), transform2 = scaleTranslateRotate(k, x2 - center[0], y2 - center[1], sx, sy, alpha);\n      rotate2 = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n      projectTransform = compose(project2, transform2);\n      projectRotateTransform = compose(rotate2, projectTransform);\n      projectResample = resample(projectTransform, delta2);\n      return reset2();\n    }\n    function reset2() {\n      cache2 = cacheStream = null;\n      return projection2;\n    }\n    return function() {\n      project2 = projectAt.apply(this, arguments);\n      projection2.invert = project2.invert && invert2;\n      return recenter();\n    };\n  }\n  function conicProjection(projectAt) {\n    var phi02 = 0, phi12 = pi$1 / 3, m2 = projectionMutator(projectAt), p = m2(phi02, phi12);\n    p.parallels = function(_) {\n      return arguments.length ? m2(phi02 = _[0] * radians, phi12 = _[1] * radians) : [phi02 * degrees, phi12 * degrees];\n    };\n    return p;\n  }\n  function cylindricalEqualAreaRaw(phi02) {\n    var cosPhi02 = cos$1(phi02);\n    function forward(lambda, phi2) {\n      return [lambda * cosPhi02, sin$1(phi2) / cosPhi02];\n    }\n    forward.invert = function(x2, y2) {\n      return [x2 / cosPhi02, asin$1(y2 * cosPhi02)];\n    };\n    return forward;\n  }\n  function conicEqualAreaRaw(y02, y12) {\n    var sy0 = sin$1(y02), n = (sy0 + sin$1(y12)) / 2;\n    if (abs$1(n) < epsilon$3) return cylindricalEqualAreaRaw(y02);\n    var c2 = 1 + sy0 * (2 * n - sy0), r0 = sqrt$1(c2) / n;\n    function project2(x2, y2) {\n      var r = sqrt$1(c2 - 2 * n * sin$1(y2)) / n;\n      return [r * sin$1(x2 *= n), r0 - r * cos$1(x2)];\n    }\n    project2.invert = function(x2, y2) {\n      var r0y = r0 - y2, l = atan2(x2, abs$1(r0y)) * sign(r0y);\n      if (r0y * n < 0)\n        l -= pi$1 * sign(x2) * sign(r0y);\n      return [l / n, asin$1((c2 - (x2 * x2 + r0y * r0y) * n * n) / (2 * n))];\n    };\n    return project2;\n  }\n  function geoConicEqualArea() {\n    return conicProjection(conicEqualAreaRaw).scale(155.424).center([0, 33.6442]);\n  }\n  function geoAlbers() {\n    return geoConicEqualArea().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]);\n  }\n  function multiplex(streams) {\n    var n = streams.length;\n    return {\n      point: function(x2, y2) {\n        var i = -1;\n        while (++i < n) streams[i].point(x2, y2);\n      },\n      sphere: function() {\n        var i = -1;\n        while (++i < n) streams[i].sphere();\n      },\n      lineStart: function() {\n        var i = -1;\n        while (++i < n) streams[i].lineStart();\n      },\n      lineEnd: function() {\n        var i = -1;\n        while (++i < n) streams[i].lineEnd();\n      },\n      polygonStart: function() {\n        var i = -1;\n        while (++i < n) streams[i].polygonStart();\n      },\n      polygonEnd: function() {\n        var i = -1;\n        while (++i < n) streams[i].polygonEnd();\n      }\n    };\n  }\n  function geoAlbersUsa() {\n    var cache2, cacheStream, lower48 = geoAlbers(), lower48Point, alaska = geoConicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, hawaii = geoConicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, point2, pointStream = { point: function(x2, y2) {\n      point2 = [x2, y2];\n    } };\n    function albersUsa(coordinates) {\n      var x2 = coordinates[0], y2 = coordinates[1];\n      return point2 = null, (lower48Point.point(x2, y2), point2) || (alaskaPoint.point(x2, y2), point2) || (hawaiiPoint.point(x2, y2), point2);\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x2 = (coordinates[0] - t[0]) / k, y2 = (coordinates[1] - t[1]) / k;\n      return (y2 >= 0.12 && y2 < 0.234 && x2 >= -0.425 && x2 < -0.214 ? alaska : y2 >= 0.166 && y2 < 0.234 && x2 >= -0.214 && x2 < -0.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = multiplex([lower48.stream(cacheStream = stream2), alaska.stream(stream2), hawaii.stream(stream2)]);\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n      return reset2();\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x2 = +_[0], y2 = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([[x2 - 0.455 * k, y2 - 0.238 * k], [x2 + 0.455 * k, y2 + 0.238 * k]]).stream(pointStream);\n      alaskaPoint = alaska.translate([x2 - 0.307 * k, y2 + 0.201 * k]).clipExtent([[x2 - 0.425 * k + epsilon$3, y2 + 0.12 * k + epsilon$3], [x2 - 0.214 * k - epsilon$3, y2 + 0.234 * k - epsilon$3]]).stream(pointStream);\n      hawaiiPoint = hawaii.translate([x2 - 0.205 * k, y2 + 0.212 * k]).clipExtent([[x2 - 0.214 * k + epsilon$3, y2 + 0.166 * k + epsilon$3], [x2 - 0.115 * k - epsilon$3, y2 + 0.234 * k - epsilon$3]]).stream(pointStream);\n      return reset2();\n    };\n    albersUsa.fitExtent = function(extent2, object2) {\n      return fitExtent(albersUsa, extent2, object2);\n    };\n    albersUsa.fitSize = function(size, object2) {\n      return fitSize(albersUsa, size, object2);\n    };\n    albersUsa.fitWidth = function(width2, object2) {\n      return fitWidth(albersUsa, width2, object2);\n    };\n    albersUsa.fitHeight = function(height2, object2) {\n      return fitHeight(albersUsa, height2, object2);\n    };\n    function reset2() {\n      cache2 = cacheStream = null;\n      return albersUsa;\n    }\n    return albersUsa.scale(1070);\n  }\n  function azimuthalRaw(scale2) {\n    return function(x2, y2) {\n      var cx = cos$1(x2), cy = cos$1(y2), k = scale2(cx * cy);\n      if (k === Infinity) return [2, 0];\n      return [\n        k * cy * sin$1(x2),\n        k * sin$1(y2)\n      ];\n    };\n  }\n  function azimuthalInvert(angle2) {\n    return function(x2, y2) {\n      var z2 = sqrt$1(x2 * x2 + y2 * y2), c2 = angle2(z2), sc = sin$1(c2), cc = cos$1(c2);\n      return [\n        atan2(x2 * sc, z2 * cc),\n        asin$1(z2 && y2 * sc / z2)\n      ];\n    };\n  }\n  var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\n    return sqrt$1(2 / (1 + cxcy));\n  });\n  azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z2) {\n    return 2 * asin$1(z2 / 2);\n  });\n  function geoAzimuthalEqualArea() {\n    return projection$1(azimuthalEqualAreaRaw).scale(124.75).clipAngle(180 - 1e-3);\n  }\n  var azimuthalEquidistantRaw = azimuthalRaw(function(c2) {\n    return (c2 = acos(c2)) && c2 / sin$1(c2);\n  });\n  azimuthalEquidistantRaw.invert = azimuthalInvert(function(z2) {\n    return z2;\n  });\n  function geoAzimuthalEquidistant() {\n    return projection$1(azimuthalEquidistantRaw).scale(79.4188).clipAngle(180 - 1e-3);\n  }\n  function mercatorRaw(lambda, phi2) {\n    return [lambda, log$1(tan((halfPi$1 + phi2) / 2))];\n  }\n  mercatorRaw.invert = function(x2, y2) {\n    return [x2, 2 * atan(exp(y2)) - halfPi$1];\n  };\n  function geoMercator() {\n    return mercatorProjection(mercatorRaw).scale(961 / tau$1);\n  }\n  function mercatorProjection(project2) {\n    var m2 = projection$1(project2), center = m2.center, scale2 = m2.scale, translate2 = m2.translate, clipExtent = m2.clipExtent, x02 = null, y02, x12, y12;\n    m2.scale = function(_) {\n      return arguments.length ? (scale2(_), reclip()) : scale2();\n    };\n    m2.translate = function(_) {\n      return arguments.length ? (translate2(_), reclip()) : translate2();\n    };\n    m2.center = function(_) {\n      return arguments.length ? (center(_), reclip()) : center();\n    };\n    m2.clipExtent = function(_) {\n      return arguments.length ? (_ == null ? x02 = y02 = x12 = y12 = null : (x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reclip()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    function reclip() {\n      var k = pi$1 * scale2(), t = m2(rotation(m2.rotate()).invert([0, 0]));\n      return clipExtent(x02 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project2 === mercatorRaw ? [[Math.max(t[0] - k, x02), y02], [Math.min(t[0] + k, x12), y12]] : [[x02, Math.max(t[1] - k, y02)], [x12, Math.min(t[1] + k, y12)]]);\n    }\n    return reclip();\n  }\n  function tany(y2) {\n    return tan((halfPi$1 + y2) / 2);\n  }\n  function conicConformalRaw(y02, y12) {\n    var cy0 = cos$1(y02), n = y02 === y12 ? sin$1(y02) : log$1(cy0 / cos$1(y12)) / log$1(tany(y12) / tany(y02)), f = cy0 * pow$1(tany(y02), n) / n;\n    if (!n) return mercatorRaw;\n    function project2(x2, y2) {\n      if (f > 0) {\n        if (y2 < -halfPi$1 + epsilon$3) y2 = -halfPi$1 + epsilon$3;\n      } else {\n        if (y2 > halfPi$1 - epsilon$3) y2 = halfPi$1 - epsilon$3;\n      }\n      var r = f / pow$1(tany(y2), n);\n      return [r * sin$1(n * x2), f - r * cos$1(n * x2)];\n    }\n    project2.invert = function(x2, y2) {\n      var fy = f - y2, r = sign(n) * sqrt$1(x2 * x2 + fy * fy), l = atan2(x2, abs$1(fy)) * sign(fy);\n      if (fy * n < 0)\n        l -= pi$1 * sign(x2) * sign(fy);\n      return [l / n, 2 * atan(pow$1(f / r, 1 / n)) - halfPi$1];\n    };\n    return project2;\n  }\n  function geoConicConformal() {\n    return conicProjection(conicConformalRaw).scale(109.5).parallels([30, 30]);\n  }\n  function equirectangularRaw(lambda, phi2) {\n    return [lambda, phi2];\n  }\n  equirectangularRaw.invert = equirectangularRaw;\n  function geoEquirectangular() {\n    return projection$1(equirectangularRaw).scale(152.63);\n  }\n  function conicEquidistantRaw(y02, y12) {\n    var cy0 = cos$1(y02), n = y02 === y12 ? sin$1(y02) : (cy0 - cos$1(y12)) / (y12 - y02), g = cy0 / n + y02;\n    if (abs$1(n) < epsilon$3) return equirectangularRaw;\n    function project2(x2, y2) {\n      var gy = g - y2, nx = n * x2;\n      return [gy * sin$1(nx), g - gy * cos$1(nx)];\n    }\n    project2.invert = function(x2, y2) {\n      var gy = g - y2, l = atan2(x2, abs$1(gy)) * sign(gy);\n      if (gy * n < 0)\n        l -= pi$1 * sign(x2) * sign(gy);\n      return [l / n, g - sign(n) * sqrt$1(x2 * x2 + gy * gy)];\n    };\n    return project2;\n  }\n  function geoConicEquidistant() {\n    return conicProjection(conicEquidistantRaw).scale(131.154).center([0, 13.9389]);\n  }\n  var A1 = 1.340264, A2 = -0.081106, A3 = 893e-6, A4 = 3796e-6, M = sqrt$1(3) / 2, iterations = 12;\n  function equalEarthRaw(lambda, phi2) {\n    var l = asin$1(M * sin$1(phi2)), l2 = l * l, l6 = l2 * l2 * l2;\n    return [\n      lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n      l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n    ];\n  }\n  equalEarthRaw.invert = function(x2, y2) {\n    var l = y2, l2 = l * l, l6 = l2 * l2 * l2;\n    for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n      fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y2;\n      fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n      l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n      if (abs$1(delta) < epsilon2) break;\n    }\n    return [\n      M * x2 * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),\n      asin$1(sin$1(l) / M)\n    ];\n  };\n  function geoEqualEarth() {\n    return projection$1(equalEarthRaw).scale(177.158);\n  }\n  function gnomonicRaw(x2, y2) {\n    var cy = cos$1(y2), k = cos$1(x2) * cy;\n    return [cy * sin$1(x2) / k, sin$1(y2) / k];\n  }\n  gnomonicRaw.invert = azimuthalInvert(atan);\n  function geoGnomonic() {\n    return projection$1(gnomonicRaw).scale(144.049).clipAngle(60);\n  }\n  function geoIdentity() {\n    var k = 1, tx2 = 0, ty2 = 0, sx = 1, sy = 1, alpha = 0, ca, sa2, x02 = null, y02, x12, y12, kx = 1, ky = 1, transform2 = transformer({\n      point: function(x2, y2) {\n        var p = projection2([x2, y2]);\n        this.stream.point(p[0], p[1]);\n      }\n    }), postclip = identity, cache2, cacheStream;\n    function reset2() {\n      kx = k * sx;\n      ky = k * sy;\n      cache2 = cacheStream = null;\n      return projection2;\n    }\n    function projection2(p) {\n      var x2 = p[0] * kx, y2 = p[1] * ky;\n      if (alpha) {\n        var t = y2 * ca - x2 * sa2;\n        x2 = x2 * ca + y2 * sa2;\n        y2 = t;\n      }\n      return [x2 + tx2, y2 + ty2];\n    }\n    projection2.invert = function(p) {\n      var x2 = p[0] - tx2, y2 = p[1] - ty2;\n      if (alpha) {\n        var t = y2 * ca + x2 * sa2;\n        x2 = x2 * ca - y2 * sa2;\n        y2 = t;\n      }\n      return [x2 / kx, y2 / ky];\n    };\n    projection2.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = transform2(postclip(cacheStream = stream2));\n    };\n    projection2.postclip = function(_) {\n      return arguments.length ? (postclip = _, x02 = y02 = x12 = y12 = null, reset2()) : postclip;\n    };\n    projection2.clipExtent = function(_) {\n      return arguments.length ? (postclip = _ == null ? (x02 = y02 = x12 = y12 = null, identity) : clipRectangle(x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset2()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    projection2.scale = function(_) {\n      return arguments.length ? (k = +_, reset2()) : k;\n    };\n    projection2.translate = function(_) {\n      return arguments.length ? (tx2 = +_[0], ty2 = +_[1], reset2()) : [tx2, ty2];\n    };\n    projection2.angle = function(_) {\n      return arguments.length ? (alpha = _ % 360 * radians, sa2 = sin$1(alpha), ca = cos$1(alpha), reset2()) : alpha * degrees;\n    };\n    projection2.reflectX = function(_) {\n      return arguments.length ? (sx = _ ? -1 : 1, reset2()) : sx < 0;\n    };\n    projection2.reflectY = function(_) {\n      return arguments.length ? (sy = _ ? -1 : 1, reset2()) : sy < 0;\n    };\n    projection2.fitExtent = function(extent2, object2) {\n      return fitExtent(projection2, extent2, object2);\n    };\n    projection2.fitSize = function(size, object2) {\n      return fitSize(projection2, size, object2);\n    };\n    projection2.fitWidth = function(width2, object2) {\n      return fitWidth(projection2, width2, object2);\n    };\n    projection2.fitHeight = function(height2, object2) {\n      return fitHeight(projection2, height2, object2);\n    };\n    return projection2;\n  }\n  function naturalEarth1Raw(lambda, phi2) {\n    var phi22 = phi2 * phi2, phi4 = phi22 * phi22;\n    return [\n      lambda * (0.8707 - 0.131979 * phi22 + phi4 * (-0.013791 + phi4 * (3971e-6 * phi22 - 1529e-6 * phi4))),\n      phi2 * (1.007226 + phi22 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi22 - 5916e-6 * phi4)))\n    ];\n  }\n  naturalEarth1Raw.invert = function(x2, y2) {\n    var phi2 = y2, i = 25, delta;\n    do {\n      var phi22 = phi2 * phi2, phi4 = phi22 * phi22;\n      phi2 -= delta = (phi2 * (1.007226 + phi22 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi22 - 5916e-6 * phi4))) - y2) / (1.007226 + phi22 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi22 - 5916e-6 * 11 * phi4)));\n    } while (abs$1(delta) > epsilon$3 && --i > 0);\n    return [\n      x2 / (0.8707 + (phi22 = phi2 * phi2) * (-0.131979 + phi22 * (-0.013791 + phi22 * phi22 * phi22 * (3971e-6 - 1529e-6 * phi22)))),\n      phi2\n    ];\n  };\n  function geoNaturalEarth1() {\n    return projection$1(naturalEarth1Raw).scale(175.295);\n  }\n  function orthographicRaw(x2, y2) {\n    return [cos$1(y2) * sin$1(x2), sin$1(y2)];\n  }\n  orthographicRaw.invert = azimuthalInvert(asin$1);\n  function geoOrthographic() {\n    return projection$1(orthographicRaw).scale(249.5).clipAngle(90 + epsilon$3);\n  }\n  function stereographicRaw(x2, y2) {\n    var cy = cos$1(y2), k = 1 + cos$1(x2) * cy;\n    return [cy * sin$1(x2) / k, sin$1(y2) / k];\n  }\n  stereographicRaw.invert = azimuthalInvert(function(z2) {\n    return 2 * atan(z2);\n  });\n  function geoStereographic() {\n    return projection$1(stereographicRaw).scale(250).clipAngle(142);\n  }\n  function transverseMercatorRaw(lambda, phi2) {\n    return [log$1(tan((halfPi$1 + phi2) / 2)), -lambda];\n  }\n  transverseMercatorRaw.invert = function(x2, y2) {\n    return [-y2, 2 * atan(exp(x2)) - halfPi$1];\n  };\n  function geoTransverseMercator() {\n    var m2 = mercatorProjection(transverseMercatorRaw), center = m2.center, rotate2 = m2.rotate;\n    m2.center = function(_) {\n      return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);\n    };\n    m2.rotate = function(_) {\n      return arguments.length ? rotate2([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate2(), [_[0], _[1], _[2] - 90]);\n    };\n    return rotate2([0, 0, 90]).scale(159.155);\n  }\n  var abs = Math.abs;\n  var cos = Math.cos;\n  var sin = Math.sin;\n  var epsilon$2 = 1e-6;\n  var pi = Math.PI;\n  var halfPi = pi / 2;\n  var sqrt2 = sqrt(2);\n  function asin(x2) {\n    return x2 > 1 ? halfPi : x2 < -1 ? -halfPi : Math.asin(x2);\n  }\n  function sqrt(x2) {\n    return x2 > 0 ? Math.sqrt(x2) : 0;\n  }\n  function mollweideBromleyTheta(cp, phi2) {\n    var cpsinPhi = cp * sin(phi2), i = 30, delta;\n    do\n      phi2 -= delta = (phi2 + sin(phi2) - cpsinPhi) / (1 + cos(phi2));\n    while (abs(delta) > epsilon$2 && --i > 0);\n    return phi2 / 2;\n  }\n  function mollweideBromleyRaw(cx, cy, cp) {\n    function forward(lambda, phi2) {\n      return [cx * lambda * cos(phi2 = mollweideBromleyTheta(cp, phi2)), cy * sin(phi2)];\n    }\n    forward.invert = function(x2, y2) {\n      return y2 = asin(y2 / cy), [x2 / (cx * cos(y2)), asin((2 * y2 + sin(2 * y2)) / cp)];\n    };\n    return forward;\n  }\n  var mollweideRaw = mollweideBromleyRaw(sqrt2 / halfPi, sqrt2, pi);\n  function geoMollweide() {\n    return projection$1(mollweideRaw).scale(169.529);\n  }\n  const defaultPath = geoPath();\n  const projectionProperties = [\n    // standard properties in d3-geo\n    \"clipAngle\",\n    \"clipExtent\",\n    \"scale\",\n    \"translate\",\n    \"center\",\n    \"rotate\",\n    \"parallels\",\n    \"precision\",\n    \"reflectX\",\n    \"reflectY\",\n    // extended properties in d3-geo-projections\n    \"coefficient\",\n    \"distance\",\n    \"fraction\",\n    \"lobes\",\n    \"parallel\",\n    \"radius\",\n    \"ratio\",\n    \"spacing\",\n    \"tilt\"\n  ];\n  function create$1(type2, constructor) {\n    return function projection2() {\n      const p = constructor();\n      p.type = type2;\n      p.path = geoPath().projection(p);\n      p.copy = p.copy || function() {\n        const c2 = projection2();\n        projectionProperties.forEach((prop) => {\n          if (p[prop]) c2[prop](p[prop]());\n        });\n        c2.path.pointRadius(p.path.pointRadius());\n        return c2;\n      };\n      return registerScale(p);\n    };\n  }\n  function projection(type2, proj) {\n    if (!type2 || typeof type2 !== \"string\") {\n      throw new Error(\"Projection type must be a name string.\");\n    }\n    type2 = type2.toLowerCase();\n    if (arguments.length > 1) {\n      projections[type2] = create$1(type2, proj);\n      return this;\n    } else {\n      return projections[type2] || null;\n    }\n  }\n  function getProjectionPath(proj) {\n    return proj && proj.path || defaultPath;\n  }\n  const projections = {\n    // base d3-geo projection types\n    albers: geoAlbers,\n    albersusa: geoAlbersUsa,\n    azimuthalequalarea: geoAzimuthalEqualArea,\n    azimuthalequidistant: geoAzimuthalEquidistant,\n    conicconformal: geoConicConformal,\n    conicequalarea: geoConicEqualArea,\n    conicequidistant: geoConicEquidistant,\n    equalEarth: geoEqualEarth,\n    equirectangular: geoEquirectangular,\n    gnomonic: geoGnomonic,\n    identity: geoIdentity,\n    mercator: geoMercator,\n    mollweide: geoMollweide,\n    naturalEarth1: geoNaturalEarth1,\n    orthographic: geoOrthographic,\n    stereographic: geoStereographic,\n    transversemercator: geoTransverseMercator\n  };\n  for (const key2 in projections) {\n    projection(key2, projections[key2]);\n  }\n  function noop$1() {\n  }\n  const cases = [[], [[[1, 1.5], [0.5, 1]]], [[[1.5, 1], [1, 1.5]]], [[[1.5, 1], [0.5, 1]]], [[[1, 0.5], [1.5, 1]]], [[[1, 1.5], [0.5, 1]], [[1, 0.5], [1.5, 1]]], [[[1, 0.5], [1, 1.5]]], [[[1, 0.5], [0.5, 1]]], [[[0.5, 1], [1, 0.5]]], [[[1, 1.5], [1, 0.5]]], [[[0.5, 1], [1, 0.5]], [[1.5, 1], [1, 1.5]]], [[[1.5, 1], [1, 0.5]]], [[[0.5, 1], [1.5, 1]]], [[[1, 1.5], [1.5, 1]]], [[[0.5, 1], [1, 1.5]]], []];\n  function contours() {\n    var dx = 1, dy = 1, smooth = smoothLinear;\n    function contours2(values2, tz) {\n      return tz.map((value2) => contour(values2, value2));\n    }\n    function contour(values2, value2) {\n      var polygons = [], holes = [];\n      isorings(values2, value2, (ring) => {\n        smooth(ring, values2, value2);\n        if (area(ring) > 0) polygons.push([ring]);\n        else holes.push(ring);\n      });\n      holes.forEach((hole) => {\n        for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\n          if (contains((polygon = polygons[i])[0], hole) !== -1) {\n            polygon.push(hole);\n            return;\n          }\n        }\n      });\n      return {\n        type: \"MultiPolygon\",\n        value: value2,\n        coordinates: polygons\n      };\n    }\n    function isorings(values2, value2, callback) {\n      var fragmentByStart = [], fragmentByEnd = [], x2, y2, t02, t12, t22, t32;\n      x2 = y2 = -1;\n      t12 = values2[0] >= value2;\n      cases[t12 << 1].forEach(stitch2);\n      while (++x2 < dx - 1) {\n        t02 = t12, t12 = values2[x2 + 1] >= value2;\n        cases[t02 | t12 << 1].forEach(stitch2);\n      }\n      cases[t12 << 0].forEach(stitch2);\n      while (++y2 < dy - 1) {\n        x2 = -1;\n        t12 = values2[y2 * dx + dx] >= value2;\n        t22 = values2[y2 * dx] >= value2;\n        cases[t12 << 1 | t22 << 2].forEach(stitch2);\n        while (++x2 < dx - 1) {\n          t02 = t12, t12 = values2[y2 * dx + dx + x2 + 1] >= value2;\n          t32 = t22, t22 = values2[y2 * dx + x2 + 1] >= value2;\n          cases[t02 | t12 << 1 | t22 << 2 | t32 << 3].forEach(stitch2);\n        }\n        cases[t12 | t22 << 3].forEach(stitch2);\n      }\n      x2 = -1;\n      t22 = values2[y2 * dx] >= value2;\n      cases[t22 << 2].forEach(stitch2);\n      while (++x2 < dx - 1) {\n        t32 = t22, t22 = values2[y2 * dx + x2 + 1] >= value2;\n        cases[t22 << 2 | t32 << 3].forEach(stitch2);\n      }\n      cases[t22 << 3].forEach(stitch2);\n      function stitch2(line2) {\n        var start = [line2[0][0] + x2, line2[0][1] + y2], end = [line2[1][0] + x2, line2[1][1] + y2], startIndex = index2(start), endIndex = index2(end), f, g;\n        if (f = fragmentByEnd[startIndex]) {\n          if (g = fragmentByStart[endIndex]) {\n            delete fragmentByEnd[f.end];\n            delete fragmentByStart[g.start];\n            if (f === g) {\n              f.ring.push(end);\n              callback(f.ring);\n            } else {\n              fragmentByStart[f.start] = fragmentByEnd[g.end] = {\n                start: f.start,\n                end: g.end,\n                ring: f.ring.concat(g.ring)\n              };\n            }\n          } else {\n            delete fragmentByEnd[f.end];\n            f.ring.push(end);\n            fragmentByEnd[f.end = endIndex] = f;\n          }\n        } else if (f = fragmentByStart[endIndex]) {\n          if (g = fragmentByEnd[startIndex]) {\n            delete fragmentByStart[f.start];\n            delete fragmentByEnd[g.end];\n            if (f === g) {\n              f.ring.push(end);\n              callback(f.ring);\n            } else {\n              fragmentByStart[g.start] = fragmentByEnd[f.end] = {\n                start: g.start,\n                end: f.end,\n                ring: g.ring.concat(f.ring)\n              };\n            }\n          } else {\n            delete fragmentByStart[f.start];\n            f.ring.unshift(start);\n            fragmentByStart[f.start = startIndex] = f;\n          }\n        } else {\n          fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {\n            start: startIndex,\n            end: endIndex,\n            ring: [start, end]\n          };\n        }\n      }\n    }\n    function index2(point2) {\n      return point2[0] * 2 + point2[1] * (dx + 1) * 4;\n    }\n    function smoothLinear(ring, values2, value2) {\n      ring.forEach((point2) => {\n        var x2 = point2[0], y2 = point2[1], xt = x2 | 0, yt = y2 | 0, v0, v1 = values2[yt * dx + xt];\n        if (x2 > 0 && x2 < dx && xt === x2) {\n          v0 = values2[yt * dx + xt - 1];\n          point2[0] = x2 + (value2 - v0) / (v1 - v0) - 0.5;\n        }\n        if (y2 > 0 && y2 < dy && yt === y2) {\n          v0 = values2[(yt - 1) * dx + xt];\n          point2[1] = y2 + (value2 - v0) / (v1 - v0) - 0.5;\n        }\n      });\n    }\n    contours2.contour = contour;\n    contours2.size = function(_) {\n      if (!arguments.length) return [dx, dy];\n      var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]);\n      if (!(_0 >= 0 && _1 >= 0)) error(\"invalid size\");\n      return dx = _0, dy = _1, contours2;\n    };\n    contours2.smooth = function(_) {\n      return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours2) : smooth === smoothLinear;\n    };\n    return contours2;\n  }\n  function area(ring) {\n    var i = 0, n = ring.length, area2 = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n    while (++i < n) area2 += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n    return area2;\n  }\n  function contains(ring, hole) {\n    var i = -1, n = hole.length, c2;\n    while (++i < n) if (c2 = ringContains(ring, hole[i])) return c2;\n    return 0;\n  }\n  function ringContains(ring, point2) {\n    var x2 = point2[0], y2 = point2[1], contains2 = -1;\n    for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\n      var pi2 = ring[i], xi = pi2[0], yi = pi2[1], pj = ring[j], xj = pj[0], yj = pj[1];\n      if (segmentContains(pi2, pj, point2)) return 0;\n      if (yi > y2 !== yj > y2 && x2 < (xj - xi) * (y2 - yi) / (yj - yi) + xi) contains2 = -contains2;\n    }\n    return contains2;\n  }\n  function segmentContains(a2, b2, c2) {\n    var i;\n    return collinear$1(a2, b2, c2) && within(a2[i = +(a2[0] === b2[0])], c2[i], b2[i]);\n  }\n  function collinear$1(a2, b2, c2) {\n    return (b2[0] - a2[0]) * (c2[1] - a2[1]) === (c2[0] - a2[0]) * (b2[1] - a2[1]);\n  }\n  function within(p, q, r) {\n    return p <= q && q <= r || r <= q && q <= p;\n  }\n  function quantize(k, nice2, zero2) {\n    return function(values2) {\n      var ex = extent(values2), start = zero2 ? Math.min(ex[0], 0) : ex[0], stop2 = ex[1], span2 = stop2 - start, step = nice2 ? tickStep(start, stop2, k) : span2 / (k + 1);\n      return range$3(start + step, stop2, step);\n    };\n  }\n  function Isocontour(params2) {\n    Transform.call(this, null, params2);\n  }\n  Isocontour.Definition = {\n    \"type\": \"Isocontour\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"thresholds\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"levels\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"zero\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"scale\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"translate\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"default\": \"contour\"\n    }]\n  };\n  inherits(Isocontour, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), source2 = pulse2.materialize(pulse2.SOURCE).source, field2 = _.field || identity$2, contour = contours().smooth(_.smooth !== false), tz = _.thresholds || levels(source2, field2, _), as = _.as === null ? null : _.as || \"contour\", values2 = [];\n      source2.forEach((t) => {\n        const grid2 = field2(t);\n        const paths = contour.size([grid2.width, grid2.height])(grid2.values, isArray(tz) ? tz : tz(grid2.values));\n        transformPaths(paths, grid2, t, _);\n        paths.forEach((p) => {\n          values2.push(rederive(t, ingest$1(as != null ? {\n            [as]: p\n          } : p)));\n        });\n      });\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = values2;\n      return out;\n    }\n  });\n  function levels(values2, f, _) {\n    const q = quantize(_.levels || 10, _.nice, _.zero !== false);\n    return _.resolve !== \"shared\" ? q : q(values2.map((t) => max$2(f(t).values)));\n  }\n  function transformPaths(paths, grid2, datum2, _) {\n    let s2 = _.scale || grid2.scale, t = _.translate || grid2.translate;\n    if (isFunction(s2)) s2 = s2(datum2, _);\n    if (isFunction(t)) t = t(datum2, _);\n    if ((s2 === 1 || s2 == null) && !t) return;\n    const sx = (isNumber$1(s2) ? s2 : s2[0]) || 1, sy = (isNumber$1(s2) ? s2 : s2[1]) || 1, tx2 = t && t[0] || 0, ty2 = t && t[1] || 0;\n    paths.forEach(transform$1(grid2, sx, sy, tx2, ty2));\n  }\n  function transform$1(grid2, sx, sy, tx2, ty2) {\n    const x12 = grid2.x1 || 0, y12 = grid2.y1 || 0, flip2 = sx * sy < 0;\n    function transformPolygon(coordinates) {\n      coordinates.forEach(transformRing);\n    }\n    function transformRing(coordinates) {\n      if (flip2) coordinates.reverse();\n      coordinates.forEach(transformPoint);\n    }\n    function transformPoint(coordinates) {\n      coordinates[0] = (coordinates[0] - x12) * sx + tx2;\n      coordinates[1] = (coordinates[1] - y12) * sy + ty2;\n    }\n    return function(geometry) {\n      geometry.coordinates.forEach(transformPolygon);\n      return geometry;\n    };\n  }\n  function radius(bw, data2, f) {\n    const v = bw >= 0 ? bw : estimateBandwidth(data2, f);\n    return Math.round((Math.sqrt(4 * v * v + 1) - 1) / 2);\n  }\n  function number$2(_) {\n    return isFunction(_) ? _ : constant$4(+_);\n  }\n  function density2D() {\n    var x2 = (d2) => d2[0], y2 = (d2) => d2[1], weight = one$1, bandwidth2 = [-1, -1], dx = 960, dy = 500, k = 2;\n    function density2(data2, counts) {\n      const rx = radius(bandwidth2[0], data2, x2) >> k, ry = radius(bandwidth2[1], data2, y2) >> k, ox = rx ? rx + 2 : 0, oy = ry ? ry + 2 : 0, n = 2 * ox + (dx >> k), m2 = 2 * oy + (dy >> k), values0 = new Float32Array(n * m2), values1 = new Float32Array(n * m2);\n      let values2 = values0;\n      data2.forEach((d2) => {\n        const xi = ox + (+x2(d2) >> k), yi = oy + (+y2(d2) >> k);\n        if (xi >= 0 && xi < n && yi >= 0 && yi < m2) {\n          values0[xi + yi * n] += +weight(d2);\n        }\n      });\n      if (rx > 0 && ry > 0) {\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n      } else if (rx > 0) {\n        blurX(n, m2, values0, values1, rx);\n        blurX(n, m2, values1, values0, rx);\n        blurX(n, m2, values0, values1, rx);\n        values2 = values1;\n      } else if (ry > 0) {\n        blurY(n, m2, values0, values1, ry);\n        blurY(n, m2, values1, values0, ry);\n        blurY(n, m2, values0, values1, ry);\n        values2 = values1;\n      }\n      const s2 = counts ? Math.pow(2, -2 * k) : 1 / sum$1(values2);\n      for (let i = 0, sz2 = n * m2; i < sz2; ++i) values2[i] *= s2;\n      return {\n        values: values2,\n        scale: 1 << k,\n        width: n,\n        height: m2,\n        x1: ox,\n        y1: oy,\n        x2: ox + (dx >> k),\n        y2: oy + (dy >> k)\n      };\n    }\n    density2.x = function(_) {\n      return arguments.length ? (x2 = number$2(_), density2) : x2;\n    };\n    density2.y = function(_) {\n      return arguments.length ? (y2 = number$2(_), density2) : y2;\n    };\n    density2.weight = function(_) {\n      return arguments.length ? (weight = number$2(_), density2) : weight;\n    };\n    density2.size = function(_) {\n      if (!arguments.length) return [dx, dy];\n      var _0 = +_[0], _1 = +_[1];\n      if (!(_0 >= 0 && _1 >= 0)) error(\"invalid size\");\n      return dx = _0, dy = _1, density2;\n    };\n    density2.cellSize = function(_) {\n      if (!arguments.length) return 1 << k;\n      if (!((_ = +_) >= 1)) error(\"invalid cell size\");\n      k = Math.floor(Math.log(_) / Math.LN2);\n      return density2;\n    };\n    density2.bandwidth = function(_) {\n      if (!arguments.length) return bandwidth2;\n      _ = array$4(_);\n      if (_.length === 1) _ = [+_[0], +_[0]];\n      if (_.length !== 2) error(\"invalid bandwidth\");\n      return bandwidth2 = _, density2;\n    };\n    return density2;\n  }\n  function blurX(n, m2, source2, target2, r) {\n    const w2 = (r << 1) + 1;\n    for (let j = 0; j < m2; ++j) {\n      for (let i = 0, sr = 0; i < n + r; ++i) {\n        if (i < n) {\n          sr += source2[i + j * n];\n        }\n        if (i >= r) {\n          if (i >= w2) {\n            sr -= source2[i - w2 + j * n];\n          }\n          target2[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w2 - i, w2);\n        }\n      }\n    }\n  }\n  function blurY(n, m2, source2, target2, r) {\n    const w2 = (r << 1) + 1;\n    for (let i = 0; i < n; ++i) {\n      for (let j = 0, sr = 0; j < m2 + r; ++j) {\n        if (j < m2) {\n          sr += source2[i + j * n];\n        }\n        if (j >= r) {\n          if (j >= w2) {\n            sr -= source2[i + (j - w2) * n];\n          }\n          target2[i + (j - r) * n] = sr / Math.min(j + 1, m2 - 1 + w2 - j, w2);\n        }\n      }\n    }\n  }\n  function KDE2D(params2) {\n    Transform.call(this, null, params2);\n  }\n  KDE2D.Definition = {\n    \"type\": \"KDE2D\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"weight\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"cellSize\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"counts\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"grid\"\n    }]\n  };\n  const PARAMS = [\"x\", \"y\", \"weight\", \"size\", \"cellSize\", \"bandwidth\"];\n  function params(obj2, _) {\n    PARAMS.forEach((param2) => _[param2] != null ? obj2[param2](_[param2]) : 0);\n    return obj2;\n  }\n  inherits(KDE2D, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) return pulse2.StopPropagation;\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$2(source2, _.groupby), names = (_.groupby || []).map(accessorName), kde2 = params(density2D(), _), as = _.as || \"grid\", values2 = [];\n      function set2(t, vals) {\n        for (let i = 0; i < names.length; ++i) t[names[i]] = vals[i];\n        return t;\n      }\n      values2 = groups.map((g) => ingest$1(set2({\n        [as]: kde2(g, _.counts)\n      }, g.dims)));\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = values2;\n      return out;\n    }\n  });\n  function partition$2(data2, groupby) {\n    var groups = [], get2 = (f) => f(t), map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2);\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    return groups;\n  }\n  function Contour(params2) {\n    Transform.call(this, null, params2);\n  }\n  Contour.Definition = {\n    \"type\": \"Contour\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"values\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"x\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"weight\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"cellSize\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"count\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"thresholds\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }]\n  };\n  inherits(Contour, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), contour = contours().smooth(_.smooth !== false), values2 = _.values, thresh = _.thresholds || quantize(_.count || 10, _.nice, !!values2), size = _.size, grid2, post;\n      if (!values2) {\n        values2 = pulse2.materialize(pulse2.SOURCE).source;\n        grid2 = params(density2D(), _)(values2, true);\n        post = transform$1(grid2, grid2.scale || 1, grid2.scale || 1, 0, 0);\n        size = [grid2.width, grid2.height];\n        values2 = grid2.values;\n      }\n      thresh = isArray(thresh) ? thresh : thresh(values2);\n      values2 = contour.size(size)(values2, thresh);\n      if (post) values2.forEach(post);\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = (values2 || []).map(ingest$1);\n      return out;\n    }\n  });\n  const Feature = \"Feature\";\n  const FeatureCollection = \"FeatureCollection\";\n  const MultiPoint = \"MultiPoint\";\n  function GeoJSON(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoJSON.Definition = {\n    \"type\": \"GeoJSON\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"geojson\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(GeoJSON, Transform, {\n    transform(_, pulse2) {\n      var features = this._features, points2 = this._points, fields = _.fields, lon = fields && fields[0], lat = fields && fields[1], geojson = _.geojson || !fields && identity$2, flag2 = pulse2.ADD, mod;\n      mod = _.modified() || pulse2.changed(pulse2.REM) || pulse2.modified(accessorFields(geojson)) || lon && pulse2.modified(accessorFields(lon)) || lat && pulse2.modified(accessorFields(lat));\n      if (!this.value || mod) {\n        flag2 = pulse2.SOURCE;\n        this._features = features = [];\n        this._points = points2 = [];\n      }\n      if (geojson) {\n        pulse2.visit(flag2, (t) => features.push(geojson(t)));\n      }\n      if (lon && lat) {\n        pulse2.visit(flag2, (t) => {\n          var x2 = lon(t), y2 = lat(t);\n          if (x2 != null && y2 != null && (x2 = +x2) === x2 && (y2 = +y2) === y2) {\n            points2.push([x2, y2]);\n          }\n        });\n        features = features.concat({\n          type: Feature,\n          geometry: {\n            type: MultiPoint,\n            coordinates: points2\n          }\n        });\n      }\n      this.value = {\n        type: FeatureCollection,\n        features\n      };\n    }\n  });\n  function GeoPath(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoPath.Definition = {\n    \"type\": \"GeoPath\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\"\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"pointRadius\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  inherits(GeoPath, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), path2 = this.value, field2 = _.field || identity$2, as = _.as || \"path\", flag2 = out.SOURCE;\n      if (!path2 || _.modified()) {\n        this.value = path2 = getProjectionPath(_.projection);\n        out.materialize().reflow();\n      } else {\n        flag2 = field2 === identity$2 || pulse2.modified(field2.fields) ? out.ADD_MOD : out.ADD;\n      }\n      const prev = initPath(path2, _.pointRadius);\n      out.visit(flag2, (t) => t[as] = path2(field2(t)));\n      path2.pointRadius(prev);\n      return out.modifies(as);\n    }\n  });\n  function initPath(path2, pointRadius) {\n    const prev = path2.pointRadius();\n    path2.context(null);\n    if (pointRadius != null) {\n      path2.pointRadius(pointRadius);\n    }\n    return prev;\n  }\n  function GeoPoint(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoPoint.Definition = {\n    \"type\": \"GeoPoint\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\",\n      \"required\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"x\", \"y\"]\n    }]\n  };\n  inherits(GeoPoint, Transform, {\n    transform(_, pulse2) {\n      var proj = _.projection, lon = _.fields[0], lat = _.fields[1], as = _.as || [\"x\", \"y\"], x2 = as[0], y2 = as[1], mod;\n      function set2(t) {\n        const xy = proj([lon(t), lat(t)]);\n        if (xy) {\n          t[x2] = xy[0];\n          t[y2] = xy[1];\n        } else {\n          t[x2] = void 0;\n          t[y2] = void 0;\n        }\n      }\n      if (_.modified()) {\n        pulse2 = pulse2.materialize().reflow(true).visit(pulse2.SOURCE, set2);\n      } else {\n        mod = pulse2.modified(lon.fields) || pulse2.modified(lat.fields);\n        pulse2.visit(mod ? pulse2.ADD_MOD : pulse2.ADD, set2);\n      }\n      return pulse2.modifies(as);\n    }\n  });\n  function GeoShape(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoShape.Definition = {\n    \"type\": \"GeoShape\",\n    \"metadata\": {\n      \"modifies\": true,\n      \"nomod\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\"\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"default\": \"datum\"\n    }, {\n      \"name\": \"pointRadius\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"shape\"\n    }]\n  };\n  inherits(GeoShape, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), shape2 = this.value, as = _.as || \"shape\", flag2 = out.ADD;\n      if (!shape2 || _.modified()) {\n        this.value = shape2 = shapeGenerator(getProjectionPath(_.projection), _.field || field$1(\"datum\"), _.pointRadius);\n        out.materialize().reflow();\n        flag2 = out.SOURCE;\n      }\n      out.visit(flag2, (t) => t[as] = shape2);\n      return out.modifies(as);\n    }\n  });\n  function shapeGenerator(path2, field2, pointRadius) {\n    const shape2 = pointRadius == null ? (_) => path2(field2(_)) : (_) => {\n      var prev = path2.pointRadius(), value2 = path2.pointRadius(pointRadius)(field2(_));\n      path2.pointRadius(prev);\n      return value2;\n    };\n    shape2.context = (_) => {\n      path2.context(_);\n      return shape2;\n    };\n    return shape2;\n  }\n  function Graticule(params2) {\n    Transform.call(this, [], params2);\n    this.generator = graticule();\n  }\n  Graticule.Definition = {\n    \"type\": \"Graticule\",\n    \"metadata\": {\n      \"changes\": true,\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"extent\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"extentMajor\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"extentMinor\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"stepMajor\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [90, 360]\n    }, {\n      \"name\": \"stepMinor\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [10, 10]\n    }, {\n      \"name\": \"precision\",\n      \"type\": \"number\",\n      \"default\": 2.5\n    }]\n  };\n  inherits(Graticule, Transform, {\n    transform(_, pulse2) {\n      var src = this.value, gen = this.generator, t;\n      if (!src.length || _.modified()) {\n        for (const prop in _) {\n          if (isFunction(gen[prop])) {\n            gen[prop](_[prop]);\n          }\n        }\n      }\n      t = gen();\n      if (src.length) {\n        pulse2.mod.push(replace$1(src[0], t));\n      } else {\n        pulse2.add.push(ingest$1(t));\n      }\n      src[0] = t;\n      return pulse2;\n    }\n  });\n  function Heatmap(params2) {\n    Transform.call(this, null, params2);\n  }\n  Heatmap.Definition = {\n    \"type\": \"heatmap\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"color\",\n      \"type\": \"string\",\n      \"expr\": true\n    }, {\n      \"name\": \"opacity\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"image\"\n    }]\n  };\n  inherits(Heatmap, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var source2 = pulse2.materialize(pulse2.SOURCE).source, shared = _.resolve === \"shared\", field2 = _.field || identity$2, opacity2 = opacity_(_.opacity, _), color2 = color_(_.color, _), as = _.as || \"image\", obj2 = {\n        $x: 0,\n        $y: 0,\n        $value: 0,\n        $max: shared ? max$2(source2.map((t) => max$2(field2(t).values))) : 0\n      };\n      source2.forEach((t) => {\n        const v = field2(t);\n        const o = extend({}, t, obj2);\n        if (!shared) o.$max = max$2(v.values || []);\n        t[as] = toCanvas(v, o, color2.dep ? color2 : constant$4(color2(o)), opacity2.dep ? opacity2 : constant$4(opacity2(o)));\n      });\n      return pulse2.reflow(true).modifies(as);\n    }\n  });\n  function color_(color2, _) {\n    let f;\n    if (isFunction(color2)) {\n      f = (obj2) => rgb$1(color2(obj2, _));\n      f.dep = dependency(color2);\n    } else {\n      f = constant$4(rgb$1(color2 || \"#888\"));\n    }\n    return f;\n  }\n  function opacity_(opacity2, _) {\n    let f;\n    if (isFunction(opacity2)) {\n      f = (obj2) => opacity2(obj2, _);\n      f.dep = dependency(opacity2);\n    } else if (opacity2) {\n      f = constant$4(opacity2);\n    } else {\n      f = (obj2) => obj2.$value / obj2.$max || 0;\n      f.dep = true;\n    }\n    return f;\n  }\n  function dependency(f) {\n    if (!isFunction(f)) return false;\n    const set2 = toSet(accessorFields(f));\n    return set2.$x || set2.$y || set2.$value || set2.$max;\n  }\n  function toCanvas(grid2, obj2, color2, opacity2) {\n    const n = grid2.width, m2 = grid2.height, x12 = grid2.x1 || 0, y12 = grid2.y1 || 0, x2 = grid2.x2 || n, y2 = grid2.y2 || m2, val = grid2.values, value2 = val ? (i) => val[i] : zero$1, can = domCanvas(x2 - x12, y2 - y12), ctx = can.getContext(\"2d\"), img = ctx.getImageData(0, 0, x2 - x12, y2 - y12), pix = img.data;\n    for (let j = y12, k = 0; j < y2; ++j) {\n      obj2.$y = j - y12;\n      for (let i = x12, r = j * n; i < x2; ++i, k += 4) {\n        obj2.$x = i - x12;\n        obj2.$value = value2(i + r);\n        const v = color2(obj2);\n        pix[k + 0] = v.r;\n        pix[k + 1] = v.g;\n        pix[k + 2] = v.b;\n        pix[k + 3] = ~~(255 * opacity2(obj2));\n      }\n    }\n    ctx.putImageData(img, 0, 0);\n    return can;\n  }\n  function Projection$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Projection$1, Transform, {\n    transform(_, pulse2) {\n      let proj = this.value;\n      if (!proj || _.modified(\"type\")) {\n        this.value = proj = create(_.type);\n        projectionProperties.forEach((prop) => {\n          if (_[prop] != null) set$1(proj, prop, _[prop]);\n        });\n      } else {\n        projectionProperties.forEach((prop) => {\n          if (_.modified(prop)) set$1(proj, prop, _[prop]);\n        });\n      }\n      if (_.pointRadius != null) proj.path.pointRadius(_.pointRadius);\n      if (_.fit) fit(proj, _);\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function fit(proj, _) {\n    const data2 = collectGeoJSON(_.fit);\n    _.extent ? proj.fitExtent(_.extent, data2) : _.size ? proj.fitSize(_.size, data2) : 0;\n  }\n  function create(type2) {\n    const constructor = projection((type2 || \"mercator\").toLowerCase());\n    if (!constructor) error(\"Unrecognized projection type: \" + type2);\n    return constructor();\n  }\n  function set$1(proj, key2, value2) {\n    if (isFunction(proj[key2])) proj[key2](value2);\n  }\n  function collectGeoJSON(data2) {\n    data2 = array$4(data2);\n    return data2.length === 1 ? data2[0] : {\n      type: FeatureCollection,\n      features: data2.reduce((a2, f) => a2.concat(featurize(f)), [])\n    };\n  }\n  function featurize(f) {\n    return f.type === FeatureCollection ? f.features : array$4(f).filter((d2) => d2 != null).map((d2) => d2.type === Feature ? d2 : {\n      type: Feature,\n      geometry: d2\n    });\n  }\n  const geo = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    contour: Contour,\n    geojson: GeoJSON,\n    geopath: GeoPath,\n    geopoint: GeoPoint,\n    geoshape: GeoShape,\n    graticule: Graticule,\n    heatmap: Heatmap,\n    isocontour: Isocontour,\n    kde2d: KDE2D,\n    projection: Projection$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function forceCenter(x2, y2) {\n    var nodes, strength = 1;\n    if (x2 == null) x2 = 0;\n    if (y2 == null) y2 = 0;\n    function force2() {\n      var i, n = nodes.length, node, sx = 0, sy = 0;\n      for (i = 0; i < n; ++i) {\n        node = nodes[i], sx += node.x, sy += node.y;\n      }\n      for (sx = (sx / n - x2) * strength, sy = (sy / n - y2) * strength, i = 0; i < n; ++i) {\n        node = nodes[i], node.x -= sx, node.y -= sy;\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n    };\n    force2.x = function(_) {\n      return arguments.length ? (x2 = +_, force2) : x2;\n    };\n    force2.y = function(_) {\n      return arguments.length ? (y2 = +_, force2) : y2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = +_, force2) : strength;\n    };\n    return force2;\n  }\n  function tree_add(d2) {\n    const x2 = +this._x.call(null, d2), y2 = +this._y.call(null, d2);\n    return add(this.cover(x2, y2), x2, y2, d2);\n  }\n  function add(tree2, x2, y2, d2) {\n    if (isNaN(x2) || isNaN(y2)) return tree2;\n    var parent, node = tree2._root, leaf = { data: d2 }, x02 = tree2._x0, y02 = tree2._y0, x12 = tree2._x1, y12 = tree2._y1, xm, ym, xp, yp, right, bottom, i, j;\n    if (!node) return tree2._root = leaf, tree2;\n    while (node.length) {\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n      if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree2;\n    }\n    xp = +tree2._x.call(null, node.data);\n    yp = +tree2._y.call(null, node.data);\n    if (x2 === xp && y2 === yp) return leaf.next = node, parent ? parent[i] = leaf : tree2._root = leaf, tree2;\n    do {\n      parent = parent ? parent[i] = new Array(4) : tree2._root = new Array(4);\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n    } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));\n    return parent[j] = node, parent[i] = leaf, tree2;\n  }\n  function addAll(data2) {\n    var d2, i, n = data2.length, x2, y2, xz = new Array(n), yz = new Array(n), x02 = Infinity, y02 = Infinity, x12 = -Infinity, y12 = -Infinity;\n    for (i = 0; i < n; ++i) {\n      if (isNaN(x2 = +this._x.call(null, d2 = data2[i])) || isNaN(y2 = +this._y.call(null, d2))) continue;\n      xz[i] = x2;\n      yz[i] = y2;\n      if (x2 < x02) x02 = x2;\n      if (x2 > x12) x12 = x2;\n      if (y2 < y02) y02 = y2;\n      if (y2 > y12) y12 = y2;\n    }\n    if (x02 > x12 || y02 > y12) return this;\n    this.cover(x02, y02).cover(x12, y12);\n    for (i = 0; i < n; ++i) {\n      add(this, xz[i], yz[i], data2[i]);\n    }\n    return this;\n  }\n  function tree_cover(x2, y2) {\n    if (isNaN(x2 = +x2) || isNaN(y2 = +y2)) return this;\n    var x02 = this._x0, y02 = this._y0, x12 = this._x1, y12 = this._y1;\n    if (isNaN(x02)) {\n      x12 = (x02 = Math.floor(x2)) + 1;\n      y12 = (y02 = Math.floor(y2)) + 1;\n    } else {\n      var z2 = x12 - x02 || 1, node = this._root, parent, i;\n      while (x02 > x2 || x2 >= x12 || y02 > y2 || y2 >= y12) {\n        i = (y2 < y02) << 1 | x2 < x02;\n        parent = new Array(4), parent[i] = node, node = parent, z2 *= 2;\n        switch (i) {\n          case 0:\n            x12 = x02 + z2, y12 = y02 + z2;\n            break;\n          case 1:\n            x02 = x12 - z2, y12 = y02 + z2;\n            break;\n          case 2:\n            x12 = x02 + z2, y02 = y12 - z2;\n            break;\n          case 3:\n            x02 = x12 - z2, y02 = y12 - z2;\n            break;\n        }\n      }\n      if (this._root && this._root.length) this._root = node;\n    }\n    this._x0 = x02;\n    this._y0 = y02;\n    this._x1 = x12;\n    this._y1 = y12;\n    return this;\n  }\n  function tree_data() {\n    var data2 = [];\n    this.visit(function(node) {\n      if (!node.length) do\n        data2.push(node.data);\n      while (node = node.next);\n    });\n    return data2;\n  }\n  function tree_extent(_) {\n    return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]];\n  }\n  function Quad(node, x02, y02, x12, y12) {\n    this.node = node;\n    this.x0 = x02;\n    this.y0 = y02;\n    this.x1 = x12;\n    this.y1 = y12;\n  }\n  function tree_find(x2, y2, radius2) {\n    var data2, x02 = this._x0, y02 = this._y0, x12, y12, x22, y22, x3 = this._x1, y3 = this._y1, quads = [], node = this._root, q, i;\n    if (node) quads.push(new Quad(node, x02, y02, x3, y3));\n    if (radius2 == null) radius2 = Infinity;\n    else {\n      x02 = x2 - radius2, y02 = y2 - radius2;\n      x3 = x2 + radius2, y3 = y2 + radius2;\n      radius2 *= radius2;\n    }\n    while (q = quads.pop()) {\n      if (!(node = q.node) || (x12 = q.x0) > x3 || (y12 = q.y0) > y3 || (x22 = q.x1) < x02 || (y22 = q.y1) < y02) continue;\n      if (node.length) {\n        var xm = (x12 + x22) / 2, ym = (y12 + y22) / 2;\n        quads.push(\n          new Quad(node[3], xm, ym, x22, y22),\n          new Quad(node[2], x12, ym, xm, y22),\n          new Quad(node[1], xm, y12, x22, ym),\n          new Quad(node[0], x12, y12, xm, ym)\n        );\n        if (i = (y2 >= ym) << 1 | x2 >= xm) {\n          q = quads[quads.length - 1];\n          quads[quads.length - 1] = quads[quads.length - 1 - i];\n          quads[quads.length - 1 - i] = q;\n        }\n      } else {\n        var dx = x2 - +this._x.call(null, node.data), dy = y2 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;\n        if (d2 < radius2) {\n          var d3 = Math.sqrt(radius2 = d2);\n          x02 = x2 - d3, y02 = y2 - d3;\n          x3 = x2 + d3, y3 = y2 + d3;\n          data2 = node.data;\n        }\n      }\n    }\n    return data2;\n  }\n  function tree_remove(d2) {\n    if (isNaN(x2 = +this._x.call(null, d2)) || isNaN(y2 = +this._y.call(null, d2))) return this;\n    var parent, node = this._root, retainer, previous, next, x02 = this._x0, y02 = this._y0, x12 = this._x1, y12 = this._y1, x2, y2, xm, ym, right, bottom, i, j;\n    if (!node) return this;\n    if (node.length) while (true) {\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n      if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n      if (!node.length) break;\n      if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) retainer = parent, j = i;\n    }\n    while (node.data !== d2) if (!(previous = node, node = node.next)) return this;\n    if (next = node.next) delete node.next;\n    if (previous) return next ? previous.next = next : delete previous.next, this;\n    if (!parent) return this._root = next, this;\n    next ? parent[i] = next : delete parent[i];\n    if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {\n      if (retainer) retainer[j] = node;\n      else this._root = node;\n    }\n    return this;\n  }\n  function removeAll(data2) {\n    for (var i = 0, n = data2.length; i < n; ++i) this.remove(data2[i]);\n    return this;\n  }\n  function tree_root() {\n    return this._root;\n  }\n  function tree_size() {\n    var size = 0;\n    this.visit(function(node) {\n      if (!node.length) do\n        ++size;\n      while (node = node.next);\n    });\n    return size;\n  }\n  function tree_visit(callback) {\n    var quads = [], q, node = this._root, child, x02, y02, x12, y12;\n    if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n    while (q = quads.pop()) {\n      if (!callback(node = q.node, x02 = q.x0, y02 = q.y0, x12 = q.x1, y12 = q.y1) && node.length) {\n        var xm = (x02 + x12) / 2, ym = (y02 + y12) / 2;\n        if (child = node[3]) quads.push(new Quad(child, xm, ym, x12, y12));\n        if (child = node[2]) quads.push(new Quad(child, x02, ym, xm, y12));\n        if (child = node[1]) quads.push(new Quad(child, xm, y02, x12, ym));\n        if (child = node[0]) quads.push(new Quad(child, x02, y02, xm, ym));\n      }\n    }\n    return this;\n  }\n  function tree_visitAfter(callback) {\n    var quads = [], next = [], q;\n    if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n    while (q = quads.pop()) {\n      var node = q.node;\n      if (node.length) {\n        var child, x02 = q.x0, y02 = q.y0, x12 = q.x1, y12 = q.y1, xm = (x02 + x12) / 2, ym = (y02 + y12) / 2;\n        if (child = node[0]) quads.push(new Quad(child, x02, y02, xm, ym));\n        if (child = node[1]) quads.push(new Quad(child, xm, y02, x12, ym));\n        if (child = node[2]) quads.push(new Quad(child, x02, ym, xm, y12));\n        if (child = node[3]) quads.push(new Quad(child, xm, ym, x12, y12));\n      }\n      next.push(q);\n    }\n    while (q = next.pop()) {\n      callback(q.node, q.x0, q.y0, q.x1, q.y1);\n    }\n    return this;\n  }\n  function defaultX(d2) {\n    return d2[0];\n  }\n  function tree_x(_) {\n    return arguments.length ? (this._x = _, this) : this._x;\n  }\n  function defaultY(d2) {\n    return d2[1];\n  }\n  function tree_y(_) {\n    return arguments.length ? (this._y = _, this) : this._y;\n  }\n  function quadtree(nodes, x2, y2) {\n    var tree2 = new Quadtree(x2 == null ? defaultX : x2, y2 == null ? defaultY : y2, NaN, NaN, NaN, NaN);\n    return nodes == null ? tree2 : tree2.addAll(nodes);\n  }\n  function Quadtree(x2, y2, x02, y02, x12, y12) {\n    this._x = x2;\n    this._y = y2;\n    this._x0 = x02;\n    this._y0 = y02;\n    this._x1 = x12;\n    this._y1 = y12;\n    this._root = void 0;\n  }\n  function leaf_copy(leaf) {\n    var copy2 = { data: leaf.data }, next = copy2;\n    while (leaf = leaf.next) next = next.next = { data: leaf.data };\n    return copy2;\n  }\n  var treeProto = quadtree.prototype = Quadtree.prototype;\n  treeProto.copy = function() {\n    var copy2 = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child;\n    if (!node) return copy2;\n    if (!node.length) return copy2._root = leaf_copy(node), copy2;\n    nodes = [{ source: node, target: copy2._root = new Array(4) }];\n    while (node = nodes.pop()) {\n      for (var i = 0; i < 4; ++i) {\n        if (child = node.source[i]) {\n          if (child.length) nodes.push({ source: child, target: node.target[i] = new Array(4) });\n          else node.target[i] = leaf_copy(child);\n        }\n      }\n    }\n    return copy2;\n  };\n  treeProto.add = tree_add;\n  treeProto.addAll = addAll;\n  treeProto.cover = tree_cover;\n  treeProto.data = tree_data;\n  treeProto.extent = tree_extent;\n  treeProto.find = tree_find;\n  treeProto.remove = tree_remove;\n  treeProto.removeAll = removeAll;\n  treeProto.root = tree_root;\n  treeProto.size = tree_size;\n  treeProto.visit = tree_visit;\n  treeProto.visitAfter = tree_visitAfter;\n  treeProto.x = tree_x;\n  treeProto.y = tree_y;\n  function constant$1(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  function jiggle(random2) {\n    return (random2() - 0.5) * 1e-6;\n  }\n  function x$1(d2) {\n    return d2.x + d2.vx;\n  }\n  function y$1(d2) {\n    return d2.y + d2.vy;\n  }\n  function forceCollide(radius2) {\n    var nodes, radii, random2, strength = 1, iterations2 = 1;\n    if (typeof radius2 !== \"function\") radius2 = constant$1(radius2 == null ? 1 : +radius2);\n    function force2() {\n      var i, n = nodes.length, tree2, node, xi, yi, ri, ri2;\n      for (var k = 0; k < iterations2; ++k) {\n        tree2 = quadtree(nodes, x$1, y$1).visitAfter(prepare2);\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          ri = radii[node.index], ri2 = ri * ri;\n          xi = node.x + node.vx;\n          yi = node.y + node.vy;\n          tree2.visit(apply2);\n        }\n      }\n      function apply2(quad2, x02, y02, x12, y12) {\n        var data2 = quad2.data, rj = quad2.r, r = ri + rj;\n        if (data2) {\n          if (data2.index > node.index) {\n            var x2 = xi - data2.x - data2.vx, y2 = yi - data2.y - data2.vy, l = x2 * x2 + y2 * y2;\n            if (l < r * r) {\n              if (x2 === 0) x2 = jiggle(random2), l += x2 * x2;\n              if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n              l = (r - (l = Math.sqrt(l))) / l * strength;\n              node.vx += (x2 *= l) * (r = (rj *= rj) / (ri2 + rj));\n              node.vy += (y2 *= l) * r;\n              data2.vx -= x2 * (r = 1 - r);\n              data2.vy -= y2 * r;\n            }\n          }\n          return;\n        }\n        return x02 > xi + r || x12 < xi - r || y02 > yi + r || y12 < yi - r;\n      }\n    }\n    function prepare2(quad2) {\n      if (quad2.data) return quad2.r = radii[quad2.data.index];\n      for (var i = quad2.r = 0; i < 4; ++i) {\n        if (quad2[i] && quad2[i].r > quad2.r) {\n          quad2.r = quad2[i].r;\n        }\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, node;\n      radii = new Array(n);\n      for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius2(node, i, nodes);\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.iterations = function(_) {\n      return arguments.length ? (iterations2 = +_, force2) : iterations2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = +_, force2) : strength;\n    };\n    force2.radius = function(_) {\n      return arguments.length ? (radius2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : radius2;\n    };\n    return force2;\n  }\n  function index$1(d2) {\n    return d2.index;\n  }\n  function find$1(nodeById, nodeId) {\n    var node = nodeById.get(nodeId);\n    if (!node) throw new Error(\"node not found: \" + nodeId);\n    return node;\n  }\n  function forceLink(links) {\n    var id2 = index$1, strength = defaultStrength, strengths, distance2 = constant$1(30), distances, nodes, count2, bias, random2, iterations2 = 1;\n    if (links == null) links = [];\n    function defaultStrength(link2) {\n      return 1 / Math.min(count2[link2.source.index], count2[link2.target.index]);\n    }\n    function force2(alpha) {\n      for (var k = 0, n = links.length; k < iterations2; ++k) {\n        for (var i = 0, link2, source2, target2, x2, y2, l, b2; i < n; ++i) {\n          link2 = links[i], source2 = link2.source, target2 = link2.target;\n          x2 = target2.x + target2.vx - source2.x - source2.vx || jiggle(random2);\n          y2 = target2.y + target2.vy - source2.y - source2.vy || jiggle(random2);\n          l = Math.sqrt(x2 * x2 + y2 * y2);\n          l = (l - distances[i]) / l * alpha * strengths[i];\n          x2 *= l, y2 *= l;\n          target2.vx -= x2 * (b2 = bias[i]);\n          target2.vy -= y2 * b2;\n          source2.vx += x2 * (b2 = 1 - b2);\n          source2.vy += y2 * b2;\n        }\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d2, i2) => [id2(d2, i2, nodes), d2])), link2;\n      for (i = 0, count2 = new Array(n); i < m2; ++i) {\n        link2 = links[i], link2.index = i;\n        if (typeof link2.source !== \"object\") link2.source = find$1(nodeById, link2.source);\n        if (typeof link2.target !== \"object\") link2.target = find$1(nodeById, link2.target);\n        count2[link2.source.index] = (count2[link2.source.index] || 0) + 1;\n        count2[link2.target.index] = (count2[link2.target.index] || 0) + 1;\n      }\n      for (i = 0, bias = new Array(m2); i < m2; ++i) {\n        link2 = links[i], bias[i] = count2[link2.source.index] / (count2[link2.source.index] + count2[link2.target.index]);\n      }\n      strengths = new Array(m2), initializeStrength();\n      distances = new Array(m2), initializeDistance();\n    }\n    function initializeStrength() {\n      if (!nodes) return;\n      for (var i = 0, n = links.length; i < n; ++i) {\n        strengths[i] = +strength(links[i], i, links);\n      }\n    }\n    function initializeDistance() {\n      if (!nodes) return;\n      for (var i = 0, n = links.length; i < n; ++i) {\n        distances[i] = +distance2(links[i], i, links);\n      }\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.links = function(_) {\n      return arguments.length ? (links = _, initialize2(), force2) : links;\n    };\n    force2.id = function(_) {\n      return arguments.length ? (id2 = _, force2) : id2;\n    };\n    force2.iterations = function(_) {\n      return arguments.length ? (iterations2 = +_, force2) : iterations2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initializeStrength(), force2) : strength;\n    };\n    force2.distance = function(_) {\n      return arguments.length ? (distance2 = typeof _ === \"function\" ? _ : constant$1(+_), initializeDistance(), force2) : distance2;\n    };\n    return force2;\n  }\n  var noop = { value: () => {\n  } };\n  function dispatch() {\n    for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n      if (!(t = arguments[i] + \"\") || t in _ || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n      _[t] = [];\n    }\n    return new Dispatch(_);\n  }\n  function Dispatch(_) {\n    this._ = _;\n  }\n  function parseTypenames(typenames, types2) {\n    return typenames.trim().split(/^|\\s+/).map(function(t) {\n      var name = \"\", i = t.indexOf(\".\");\n      if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n      if (t && !types2.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n      return { type: t, name };\n    });\n  }\n  Dispatch.prototype = dispatch.prototype = {\n    constructor: Dispatch,\n    on: function(typename, callback) {\n      var _ = this._, T = parseTypenames(typename + \"\", _), t, i = -1, n = T.length;\n      if (arguments.length < 2) {\n        while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n        return;\n      }\n      if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n      while (++i < n) {\n        if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n        else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n      }\n      return this;\n    },\n    copy: function() {\n      var copy2 = {}, _ = this._;\n      for (var t in _) copy2[t] = _[t].slice();\n      return new Dispatch(copy2);\n    },\n    call: function(type2, that) {\n      if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n      if (!this._.hasOwnProperty(type2)) throw new Error(\"unknown type: \" + type2);\n      for (t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n    },\n    apply: function(type2, that, args) {\n      if (!this._.hasOwnProperty(type2)) throw new Error(\"unknown type: \" + type2);\n      for (var t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n    }\n  };\n  function get(type2, name) {\n    for (var i = 0, n = type2.length, c2; i < n; ++i) {\n      if ((c2 = type2[i]).name === name) {\n        return c2.value;\n      }\n    }\n  }\n  function set(type2, name, callback) {\n    for (var i = 0, n = type2.length; i < n; ++i) {\n      if (type2[i].name === name) {\n        type2[i] = noop, type2 = type2.slice(0, i).concat(type2.slice(i + 1));\n        break;\n      }\n    }\n    if (callback != null) type2.push({ name, value: callback });\n    return type2;\n  }\n  var frame = 0, timeout = 0, interval$1 = 0, pokeDelay = 1e3, taskHead, taskTail, clockLast = 0, clockNow = 0, clockSkew = 0, clock = typeof performance === \"object\" && performance.now ? performance : Date, setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {\n    setTimeout(f, 17);\n  };\n  function now() {\n    return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n  }\n  function clearNow() {\n    clockNow = 0;\n  }\n  function Timer$1() {\n    this._call = this._time = this._next = null;\n  }\n  Timer$1.prototype = timer$1.prototype = {\n    constructor: Timer$1,\n    restart: function(callback, delay, time2) {\n      if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n      time2 = (time2 == null ? now() : +time2) + (delay == null ? 0 : +delay);\n      if (!this._next && taskTail !== this) {\n        if (taskTail) taskTail._next = this;\n        else taskHead = this;\n        taskTail = this;\n      }\n      this._call = callback;\n      this._time = time2;\n      sleep();\n    },\n    stop: function() {\n      if (this._call) {\n        this._call = null;\n        this._time = Infinity;\n        sleep();\n      }\n    }\n  };\n  function timer$1(callback, delay, time2) {\n    var t = new Timer$1();\n    t.restart(callback, delay, time2);\n    return t;\n  }\n  function timerFlush() {\n    now();\n    ++frame;\n    var t = taskHead, e;\n    while (t) {\n      if ((e = clockNow - t._time) >= 0) t._call.call(void 0, e);\n      t = t._next;\n    }\n    --frame;\n  }\n  function wake() {\n    clockNow = (clockLast = clock.now()) + clockSkew;\n    frame = timeout = 0;\n    try {\n      timerFlush();\n    } finally {\n      frame = 0;\n      nap();\n      clockNow = 0;\n    }\n  }\n  function poke() {\n    var now2 = clock.now(), delay = now2 - clockLast;\n    if (delay > pokeDelay) clockSkew -= delay, clockLast = now2;\n  }\n  function nap() {\n    var t02, t12 = taskHead, t22, time2 = Infinity;\n    while (t12) {\n      if (t12._call) {\n        if (time2 > t12._time) time2 = t12._time;\n        t02 = t12, t12 = t12._next;\n      } else {\n        t22 = t12._next, t12._next = null;\n        t12 = t02 ? t02._next = t22 : taskHead = t22;\n      }\n    }\n    taskTail = t02;\n    sleep(time2);\n  }\n  function sleep(time2) {\n    if (frame) return;\n    if (timeout) timeout = clearTimeout(timeout);\n    var delay = time2 - clockNow;\n    if (delay > 24) {\n      if (time2 < Infinity) timeout = setTimeout(wake, time2 - clock.now() - clockSkew);\n      if (interval$1) interval$1 = clearInterval(interval$1);\n    } else {\n      if (!interval$1) clockLast = clock.now(), interval$1 = setInterval(poke, pokeDelay);\n      frame = 1, setFrame(wake);\n    }\n  }\n  function interval(callback, delay, time2) {\n    var t = new Timer$1(), total = delay;\n    if (delay == null) return t.restart(callback, delay, time2), t;\n    t._restart = t.restart;\n    t.restart = function(callback2, delay2, time3) {\n      delay2 = +delay2, time3 = time3 == null ? now() : +time3;\n      t._restart(function tick(elapsed) {\n        elapsed += total;\n        t._restart(tick, total += delay2, time3);\n        callback2(elapsed);\n      }, delay2, time3);\n    };\n    t.restart(callback, delay, time2);\n    return t;\n  }\n  const a$1 = 1664525;\n  const c$1 = 1013904223;\n  const m$1 = 4294967296;\n  function lcg$1() {\n    let s2 = 1;\n    return () => (s2 = (a$1 * s2 + c$1) % m$1) / m$1;\n  }\n  function x(d2) {\n    return d2.x;\n  }\n  function y(d2) {\n    return d2.y;\n  }\n  var initialRadius = 10, initialAngle = Math.PI * (3 - Math.sqrt(5));\n  function forceSimulation(nodes) {\n    var simulation2, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer$1(step), event2 = dispatch(\"tick\", \"end\"), random2 = lcg$1();\n    if (nodes == null) nodes = [];\n    function step() {\n      tick();\n      event2.call(\"tick\", simulation2);\n      if (alpha < alphaMin) {\n        stepper.stop();\n        event2.call(\"end\", simulation2);\n      }\n    }\n    function tick(iterations2) {\n      var i, n = nodes.length, node;\n      if (iterations2 === void 0) iterations2 = 1;\n      for (var k = 0; k < iterations2; ++k) {\n        alpha += (alphaTarget - alpha) * alphaDecay;\n        forces.forEach(function(force2) {\n          force2(alpha);\n        });\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          if (node.fx == null) node.x += node.vx *= velocityDecay;\n          else node.x = node.fx, node.vx = 0;\n          if (node.fy == null) node.y += node.vy *= velocityDecay;\n          else node.y = node.fy, node.vy = 0;\n        }\n      }\n      return simulation2;\n    }\n    function initializeNodes() {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.index = i;\n        if (node.fx != null) node.x = node.fx;\n        if (node.fy != null) node.y = node.fy;\n        if (isNaN(node.x) || isNaN(node.y)) {\n          var radius2 = initialRadius * Math.sqrt(0.5 + i), angle2 = i * initialAngle;\n          node.x = radius2 * Math.cos(angle2);\n          node.y = radius2 * Math.sin(angle2);\n        }\n        if (isNaN(node.vx) || isNaN(node.vy)) {\n          node.vx = node.vy = 0;\n        }\n      }\n    }\n    function initializeForce(force2) {\n      if (force2.initialize) force2.initialize(nodes, random2);\n      return force2;\n    }\n    initializeNodes();\n    return simulation2 = {\n      tick,\n      restart: function() {\n        return stepper.restart(step), simulation2;\n      },\n      stop: function() {\n        return stepper.stop(), simulation2;\n      },\n      nodes: function(_) {\n        return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation2) : nodes;\n      },\n      alpha: function(_) {\n        return arguments.length ? (alpha = +_, simulation2) : alpha;\n      },\n      alphaMin: function(_) {\n        return arguments.length ? (alphaMin = +_, simulation2) : alphaMin;\n      },\n      alphaDecay: function(_) {\n        return arguments.length ? (alphaDecay = +_, simulation2) : +alphaDecay;\n      },\n      alphaTarget: function(_) {\n        return arguments.length ? (alphaTarget = +_, simulation2) : alphaTarget;\n      },\n      velocityDecay: function(_) {\n        return arguments.length ? (velocityDecay = 1 - _, simulation2) : 1 - velocityDecay;\n      },\n      randomSource: function(_) {\n        return arguments.length ? (random2 = _, forces.forEach(initializeForce), simulation2) : random2;\n      },\n      force: function(name, _) {\n        return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation2) : forces.get(name);\n      },\n      find: function(x2, y2, radius2) {\n        var i = 0, n = nodes.length, dx, dy, d2, node, closest;\n        if (radius2 == null) radius2 = Infinity;\n        else radius2 *= radius2;\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          dx = x2 - node.x;\n          dy = y2 - node.y;\n          d2 = dx * dx + dy * dy;\n          if (d2 < radius2) closest = node, radius2 = d2;\n        }\n        return closest;\n      },\n      on: function(name, _) {\n        return arguments.length > 1 ? (event2.on(name, _), simulation2) : event2.on(name);\n      }\n    };\n  }\n  function forceManyBody() {\n    var nodes, node, random2, alpha, strength = constant$1(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81;\n    function force2(_) {\n      var i, n = nodes.length, tree2 = quadtree(nodes, x, y).visitAfter(accumulate);\n      for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree2.visit(apply2);\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, node2;\n      strengths = new Array(n);\n      for (i = 0; i < n; ++i) node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes);\n    }\n    function accumulate(quad2) {\n      var strength2 = 0, q, c2, weight = 0, x2, y2, i;\n      if (quad2.length) {\n        for (x2 = y2 = i = 0; i < 4; ++i) {\n          if ((q = quad2[i]) && (c2 = Math.abs(q.value))) {\n            strength2 += q.value, weight += c2, x2 += c2 * q.x, y2 += c2 * q.y;\n          }\n        }\n        quad2.x = x2 / weight;\n        quad2.y = y2 / weight;\n      } else {\n        q = quad2;\n        q.x = q.data.x;\n        q.y = q.data.y;\n        do\n          strength2 += strengths[q.data.index];\n        while (q = q.next);\n      }\n      quad2.value = strength2;\n    }\n    function apply2(quad2, x12, _, x2) {\n      if (!quad2.value) return true;\n      var x3 = quad2.x - node.x, y2 = quad2.y - node.y, w2 = x2 - x12, l = x3 * x3 + y2 * y2;\n      if (w2 * w2 / theta2 < l) {\n        if (l < distanceMax2) {\n          if (x3 === 0) x3 = jiggle(random2), l += x3 * x3;\n          if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n          if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n          node.vx += x3 * quad2.value * alpha / l;\n          node.vy += y2 * quad2.value * alpha / l;\n        }\n        return true;\n      } else if (quad2.length || l >= distanceMax2) return;\n      if (quad2.data !== node || quad2.next) {\n        if (x3 === 0) x3 = jiggle(random2), l += x3 * x3;\n        if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n        if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n      }\n      do\n        if (quad2.data !== node) {\n          w2 = strengths[quad2.data.index] * alpha / l;\n          node.vx += x3 * w2;\n          node.vy += y2 * w2;\n        }\n      while (quad2 = quad2.next);\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.distanceMin = function(_) {\n      return arguments.length ? (distanceMin2 = _ * _, force2) : Math.sqrt(distanceMin2);\n    };\n    force2.distanceMax = function(_) {\n      return arguments.length ? (distanceMax2 = _ * _, force2) : Math.sqrt(distanceMax2);\n    };\n    force2.theta = function(_) {\n      return arguments.length ? (theta2 = _ * _, force2) : Math.sqrt(theta2);\n    };\n    return force2;\n  }\n  function forceX(x2) {\n    var strength = constant$1(0.1), nodes, strengths, xz;\n    if (typeof x2 !== \"function\") x2 = constant$1(x2 == null ? 0 : +x2);\n    function force2(alpha) {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length;\n      strengths = new Array(n);\n      xz = new Array(n);\n      for (i = 0; i < n; ++i) {\n        strengths[i] = isNaN(xz[i] = +x2(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.x = function(_) {\n      return arguments.length ? (x2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : x2;\n    };\n    return force2;\n  }\n  function forceY(y2) {\n    var strength = constant$1(0.1), nodes, strengths, yz;\n    if (typeof y2 !== \"function\") y2 = constant$1(y2 == null ? 0 : +y2);\n    function force2(alpha) {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length;\n      strengths = new Array(n);\n      yz = new Array(n);\n      for (i = 0; i < n; ++i) {\n        strengths[i] = isNaN(yz[i] = +y2(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.y = function(_) {\n      return arguments.length ? (y2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : y2;\n    };\n    return force2;\n  }\n  const ForceMap = {\n    center: forceCenter,\n    collide: forceCollide,\n    nbody: forceManyBody,\n    link: forceLink,\n    x: forceX,\n    y: forceY\n  };\n  const Forces = \"forces\", ForceParams = [\"alpha\", \"alphaMin\", \"alphaTarget\", \"velocityDecay\", \"forces\"], ForceConfig = [\"static\", \"iterations\"], ForceOutput = [\"x\", \"y\", \"vx\", \"vy\"];\n  function Force(params2) {\n    Transform.call(this, null, params2);\n  }\n  Force.Definition = {\n    \"type\": \"Force\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"static\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"restart\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"iterations\",\n      \"type\": \"number\",\n      \"default\": 300\n    }, {\n      \"name\": \"alpha\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"alphaMin\",\n      \"type\": \"number\",\n      \"default\": 1e-3\n    }, {\n      \"name\": \"alphaTarget\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"velocityDecay\",\n      \"type\": \"number\",\n      \"default\": 0.4\n    }, {\n      \"name\": \"forces\",\n      \"type\": \"param\",\n      \"array\": true,\n      \"params\": [{\n        \"key\": {\n          \"force\": \"center\"\n        },\n        \"params\": [{\n          \"name\": \"x\",\n          \"type\": \"number\",\n          \"default\": 0\n        }, {\n          \"name\": \"y\",\n          \"type\": \"number\",\n          \"default\": 0\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"collide\"\n        },\n        \"params\": [{\n          \"name\": \"radius\",\n          \"type\": \"number\",\n          \"expr\": true\n        }, {\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.7\n        }, {\n          \"name\": \"iterations\",\n          \"type\": \"number\",\n          \"default\": 1\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"nbody\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": -30,\n          \"expr\": true\n        }, {\n          \"name\": \"theta\",\n          \"type\": \"number\",\n          \"default\": 0.9\n        }, {\n          \"name\": \"distanceMin\",\n          \"type\": \"number\",\n          \"default\": 1\n        }, {\n          \"name\": \"distanceMax\",\n          \"type\": \"number\"\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"link\"\n        },\n        \"params\": [{\n          \"name\": \"links\",\n          \"type\": \"data\"\n        }, {\n          \"name\": \"id\",\n          \"type\": \"field\"\n        }, {\n          \"name\": \"distance\",\n          \"type\": \"number\",\n          \"default\": 30,\n          \"expr\": true\n        }, {\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"expr\": true\n        }, {\n          \"name\": \"iterations\",\n          \"type\": \"number\",\n          \"default\": 1\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"x\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.1\n        }, {\n          \"name\": \"x\",\n          \"type\": \"field\"\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"y\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.1\n        }, {\n          \"name\": \"y\",\n          \"type\": \"field\"\n        }]\n      }]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"modify\": false,\n      \"default\": ForceOutput\n    }]\n  };\n  inherits(Force, Transform, {\n    transform(_, pulse2) {\n      var sim = this.value, change2 = pulse2.changed(pulse2.ADD_REM), params2 = _.modified(ForceParams), iters = _.iterations || 300;\n      if (!sim) {\n        this.value = sim = simulation(pulse2.source, _);\n        sim.on(\"tick\", rerun(pulse2.dataflow, this));\n        if (!_.static) {\n          change2 = true;\n          sim.tick();\n        }\n        pulse2.modifies(\"index\");\n      } else {\n        if (change2) {\n          pulse2.modifies(\"index\");\n          sim.nodes(pulse2.source);\n        }\n        if (params2 || pulse2.changed(pulse2.MOD)) {\n          setup(sim, _, 0, pulse2);\n        }\n      }\n      if (params2 || change2 || _.modified(ForceConfig) || pulse2.changed() && _.restart) {\n        sim.alpha(Math.max(sim.alpha(), _.alpha || 1)).alphaDecay(1 - Math.pow(sim.alphaMin(), 1 / iters));\n        if (_.static) {\n          for (sim.stop(); --iters >= 0; ) sim.tick();\n        } else {\n          if (sim.stopped()) sim.restart();\n          if (!change2) return pulse2.StopPropagation;\n        }\n      }\n      return this.finish(_, pulse2);\n    },\n    finish(_, pulse2) {\n      const dataflow = pulse2.dataflow;\n      for (let args = this._argops, j = 0, m2 = args.length, arg; j < m2; ++j) {\n        arg = args[j];\n        if (arg.name !== Forces || arg.op._argval.force !== \"link\") {\n          continue;\n        }\n        for (var ops2 = arg.op._argops, i = 0, n = ops2.length, op; i < n; ++i) {\n          if (ops2[i].name === \"links\" && (op = ops2[i].op.source)) {\n            dataflow.pulse(op, dataflow.changeset().reflow());\n            break;\n          }\n        }\n      }\n      return pulse2.reflow(_.modified()).modifies(ForceOutput);\n    }\n  });\n  function rerun(df, op) {\n    return () => df.touch(op).run();\n  }\n  function simulation(nodes, _) {\n    const sim = forceSimulation(nodes), stop2 = sim.stop, restart = sim.restart;\n    let stopped = false;\n    sim.stopped = () => stopped;\n    sim.restart = () => (stopped = false, restart());\n    sim.stop = () => (stopped = true, stop2());\n    return setup(sim, _, true).on(\"end\", () => stopped = true);\n  }\n  function setup(sim, _, init2, pulse2) {\n    var f = array$4(_.forces), i, n, p, name;\n    for (i = 0, n = ForceParams.length; i < n; ++i) {\n      p = ForceParams[i];\n      if (p !== Forces && _.modified(p)) sim[p](_[p]);\n    }\n    for (i = 0, n = f.length; i < n; ++i) {\n      name = Forces + i;\n      p = init2 || _.modified(Forces, i) ? getForce(f[i]) : pulse2 && modified(f[i], pulse2) ? sim.force(name) : null;\n      if (p) sim.force(name, p);\n    }\n    for (n = sim.numForces || 0; i < n; ++i) {\n      sim.force(Forces + i, null);\n    }\n    sim.numForces = f.length;\n    return sim;\n  }\n  function modified(f, pulse2) {\n    var k, v;\n    for (k in f) {\n      if (isFunction(v = f[k]) && pulse2.modified(accessorFields(v))) return 1;\n    }\n    return 0;\n  }\n  function getForce(_) {\n    var f, p;\n    if (!has$1(ForceMap, _.force)) {\n      error(\"Unrecognized force: \" + _.force);\n    }\n    f = ForceMap[_.force]();\n    for (p in _) {\n      if (isFunction(f[p])) setForceParam(f[p], _[p], _);\n    }\n    return f;\n  }\n  function setForceParam(f, v, _) {\n    f(isFunction(v) ? (d2) => v(d2, _) : v);\n  }\n  const force = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    force: Force\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function defaultSeparation$2(a2, b2) {\n    return a2.parent === b2.parent ? 1 : 2;\n  }\n  function meanX(children2) {\n    return children2.reduce(meanXReduce, 0) / children2.length;\n  }\n  function meanXReduce(x2, c2) {\n    return x2 + c2.x;\n  }\n  function maxY(children2) {\n    return 1 + children2.reduce(maxYReduce, 0);\n  }\n  function maxYReduce(y2, c2) {\n    return Math.max(y2, c2.y);\n  }\n  function leafLeft(node) {\n    var children2;\n    while (children2 = node.children) node = children2[0];\n    return node;\n  }\n  function leafRight(node) {\n    var children2;\n    while (children2 = node.children) node = children2[children2.length - 1];\n    return node;\n  }\n  function cluster() {\n    var separation = defaultSeparation$2, dx = 1, dy = 1, nodeSize = false;\n    function cluster2(root) {\n      var previousNode, x2 = 0;\n      root.eachAfter(function(node) {\n        var children2 = node.children;\n        if (children2) {\n          node.x = meanX(children2);\n          node.y = maxY(children2);\n        } else {\n          node.x = previousNode ? x2 += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = leafLeft(root), right = leafRight(root), x02 = left.x - separation(left, right) / 2, x12 = right.x + separation(right, left) / 2;\n      return root.eachAfter(nodeSize ? function(node) {\n        node.x = (node.x - root.x) * dx;\n        node.y = (root.y - node.y) * dy;\n      } : function(node) {\n        node.x = (node.x - x02) / (x12 - x02) * dx;\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n      });\n    }\n    cluster2.separation = function(x2) {\n      return arguments.length ? (separation = x2, cluster2) : separation;\n    };\n    cluster2.size = function(x2) {\n      return arguments.length ? (nodeSize = false, dx = +x2[0], dy = +x2[1], cluster2) : nodeSize ? null : [dx, dy];\n    };\n    cluster2.nodeSize = function(x2) {\n      return arguments.length ? (nodeSize = true, dx = +x2[0], dy = +x2[1], cluster2) : nodeSize ? [dx, dy] : null;\n    };\n    return cluster2;\n  }\n  function count(node) {\n    var sum2 = 0, children2 = node.children, i = children2 && children2.length;\n    if (!i) sum2 = 1;\n    else while (--i >= 0) sum2 += children2[i].value;\n    node.value = sum2;\n  }\n  function node_count() {\n    return this.eachAfter(count);\n  }\n  function node_each(callback, that) {\n    let index2 = -1;\n    for (const node of this) {\n      callback.call(that, node, ++index2, this);\n    }\n    return this;\n  }\n  function node_eachBefore(callback, that) {\n    var node = this, nodes = [node], children2, i, index2 = -1;\n    while (node = nodes.pop()) {\n      callback.call(that, node, ++index2, this);\n      if (children2 = node.children) {\n        for (i = children2.length - 1; i >= 0; --i) {\n          nodes.push(children2[i]);\n        }\n      }\n    }\n    return this;\n  }\n  function node_eachAfter(callback, that) {\n    var node = this, nodes = [node], next = [], children2, i, n, index2 = -1;\n    while (node = nodes.pop()) {\n      next.push(node);\n      if (children2 = node.children) {\n        for (i = 0, n = children2.length; i < n; ++i) {\n          nodes.push(children2[i]);\n        }\n      }\n    }\n    while (node = next.pop()) {\n      callback.call(that, node, ++index2, this);\n    }\n    return this;\n  }\n  function node_find(callback, that) {\n    let index2 = -1;\n    for (const node of this) {\n      if (callback.call(that, node, ++index2, this)) {\n        return node;\n      }\n    }\n  }\n  function node_sum(value2) {\n    return this.eachAfter(function(node) {\n      var sum2 = +value2(node.data) || 0, children2 = node.children, i = children2 && children2.length;\n      while (--i >= 0) sum2 += children2[i].value;\n      node.value = sum2;\n    });\n  }\n  function node_sort(compare2) {\n    return this.eachBefore(function(node) {\n      if (node.children) {\n        node.children.sort(compare2);\n      }\n    });\n  }\n  function node_path(end) {\n    var start = this, ancestor = leastCommonAncestor(start, end), nodes = [start];\n    while (start !== ancestor) {\n      start = start.parent;\n      nodes.push(start);\n    }\n    var k = nodes.length;\n    while (end !== ancestor) {\n      nodes.splice(k, 0, end);\n      end = end.parent;\n    }\n    return nodes;\n  }\n  function leastCommonAncestor(a2, b2) {\n    if (a2 === b2) return a2;\n    var aNodes = a2.ancestors(), bNodes = b2.ancestors(), c2 = null;\n    a2 = aNodes.pop();\n    b2 = bNodes.pop();\n    while (a2 === b2) {\n      c2 = a2;\n      a2 = aNodes.pop();\n      b2 = bNodes.pop();\n    }\n    return c2;\n  }\n  function node_ancestors() {\n    var node = this, nodes = [node];\n    while (node = node.parent) {\n      nodes.push(node);\n    }\n    return nodes;\n  }\n  function node_descendants() {\n    return Array.from(this);\n  }\n  function node_leaves() {\n    var leaves = [];\n    this.eachBefore(function(node) {\n      if (!node.children) {\n        leaves.push(node);\n      }\n    });\n    return leaves;\n  }\n  function node_links() {\n    var root = this, links = [];\n    root.each(function(node) {\n      if (node !== root) {\n        links.push({ source: node.parent, target: node });\n      }\n    });\n    return links;\n  }\n  function* node_iterator() {\n    var node = this, current, next = [node], children2, i, n;\n    do {\n      current = next.reverse(), next = [];\n      while (node = current.pop()) {\n        yield node;\n        if (children2 = node.children) {\n          for (i = 0, n = children2.length; i < n; ++i) {\n            next.push(children2[i]);\n          }\n        }\n      }\n    } while (next.length);\n  }\n  function hierarchy(data2, children2) {\n    if (data2 instanceof Map) {\n      data2 = [void 0, data2];\n      if (children2 === void 0) children2 = mapChildren;\n    } else if (children2 === void 0) {\n      children2 = objectChildren;\n    }\n    var root = new Node$2(data2), node, nodes = [root], child, childs, i, n;\n    while (node = nodes.pop()) {\n      if ((childs = children2(node.data)) && (n = (childs = Array.from(childs)).length)) {\n        node.children = childs;\n        for (i = n - 1; i >= 0; --i) {\n          nodes.push(child = childs[i] = new Node$2(childs[i]));\n          child.parent = node;\n          child.depth = node.depth + 1;\n        }\n      }\n    }\n    return root.eachBefore(computeHeight);\n  }\n  function node_copy() {\n    return hierarchy(this).eachBefore(copyData);\n  }\n  function objectChildren(d2) {\n    return d2.children;\n  }\n  function mapChildren(d2) {\n    return Array.isArray(d2) ? d2[1] : null;\n  }\n  function copyData(node) {\n    if (node.data.value !== void 0) node.value = node.data.value;\n    node.data = node.data.data;\n  }\n  function computeHeight(node) {\n    var height2 = 0;\n    do\n      node.height = height2;\n    while ((node = node.parent) && node.height < ++height2);\n  }\n  function Node$2(data2) {\n    this.data = data2;\n    this.depth = this.height = 0;\n    this.parent = null;\n  }\n  Node$2.prototype = hierarchy.prototype = {\n    constructor: Node$2,\n    count: node_count,\n    each: node_each,\n    eachAfter: node_eachAfter,\n    eachBefore: node_eachBefore,\n    find: node_find,\n    sum: node_sum,\n    sort: node_sort,\n    path: node_path,\n    ancestors: node_ancestors,\n    descendants: node_descendants,\n    leaves: node_leaves,\n    links: node_links,\n    copy: node_copy,\n    [Symbol.iterator]: node_iterator\n  };\n  function optional(f) {\n    return f == null ? null : required(f);\n  }\n  function required(f) {\n    if (typeof f !== \"function\") throw new Error();\n    return f;\n  }\n  function constantZero() {\n    return 0;\n  }\n  function constant(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  const a = 1664525;\n  const c = 1013904223;\n  const m = 4294967296;\n  function lcg() {\n    let s2 = 1;\n    return () => (s2 = (a * s2 + c) % m) / m;\n  }\n  function array$2(x2) {\n    return typeof x2 === \"object\" && \"length\" in x2 ? x2 : Array.from(x2);\n  }\n  function shuffle(array2, random2) {\n    let m2 = array2.length, t, i;\n    while (m2) {\n      i = random2() * m2-- | 0;\n      t = array2[m2];\n      array2[m2] = array2[i];\n      array2[i] = t;\n    }\n    return array2;\n  }\n  function packEncloseRandom(circles, random2) {\n    var i = 0, n = (circles = shuffle(Array.from(circles), random2)).length, B2 = [], p, e;\n    while (i < n) {\n      p = circles[i];\n      if (e && enclosesWeak(e, p)) ++i;\n      else e = encloseBasis(B2 = extendBasis(B2, p)), i = 0;\n    }\n    return e;\n  }\n  function extendBasis(B2, p) {\n    var i, j;\n    if (enclosesWeakAll(p, B2)) return [p];\n    for (i = 0; i < B2.length; ++i) {\n      if (enclosesNot(p, B2[i]) && enclosesWeakAll(encloseBasis2(B2[i], p), B2)) {\n        return [B2[i], p];\n      }\n    }\n    for (i = 0; i < B2.length - 1; ++i) {\n      for (j = i + 1; j < B2.length; ++j) {\n        if (enclosesNot(encloseBasis2(B2[i], B2[j]), p) && enclosesNot(encloseBasis2(B2[i], p), B2[j]) && enclosesNot(encloseBasis2(B2[j], p), B2[i]) && enclosesWeakAll(encloseBasis3(B2[i], B2[j], p), B2)) {\n          return [B2[i], B2[j], p];\n        }\n      }\n    }\n    throw new Error();\n  }\n  function enclosesNot(a2, b2) {\n    var dr = a2.r - b2.r, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr < 0 || dr * dr < dx * dx + dy * dy;\n  }\n  function enclosesWeak(a2, b2) {\n    var dr = a2.r - b2.r + Math.max(a2.r, b2.r, 1) * 1e-9, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n  }\n  function enclosesWeakAll(a2, B2) {\n    for (var i = 0; i < B2.length; ++i) {\n      if (!enclosesWeak(a2, B2[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function encloseBasis(B2) {\n    switch (B2.length) {\n      case 1:\n        return encloseBasis1(B2[0]);\n      case 2:\n        return encloseBasis2(B2[0], B2[1]);\n      case 3:\n        return encloseBasis3(B2[0], B2[1], B2[2]);\n    }\n  }\n  function encloseBasis1(a2) {\n    return {\n      x: a2.x,\n      y: a2.y,\n      r: a2.r\n    };\n  }\n  function encloseBasis2(a2, b2) {\n    var x12 = a2.x, y12 = a2.y, r1 = a2.r, x2 = b2.x, y2 = b2.y, r2 = b2.r, x21 = x2 - x12, y21 = y2 - y12, r21 = r2 - r1, l = Math.sqrt(x21 * x21 + y21 * y21);\n    return {\n      x: (x12 + x2 + x21 / l * r21) / 2,\n      y: (y12 + y2 + y21 / l * r21) / 2,\n      r: (l + r1 + r2) / 2\n    };\n  }\n  function encloseBasis3(a2, b2, c2) {\n    var x12 = a2.x, y12 = a2.y, r1 = a2.r, x2 = b2.x, y2 = b2.y, r2 = b2.r, x3 = c2.x, y3 = c2.y, r3 = c2.r, a22 = x12 - x2, a3 = x12 - x3, b22 = y12 - y2, b3 = y12 - y3, c22 = r2 - r1, c3 = r3 - r1, d1 = x12 * x12 + y12 * y12 - r1 * r1, d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, ab = a3 * b22 - a22 * b3, xa = (b22 * d3 - b3 * d2) / (ab * 2) - x12, xb = (b3 * c22 - b22 * c3) / ab, ya = (a3 * d2 - a22 * d3) / (ab * 2) - y12, yb = (a22 * c3 - a3 * c22) / ab, A5 = xb * xb + yb * yb - 1, B2 = 2 * (r1 + xa * xb + ya * yb), C3 = xa * xa + ya * ya - r1 * r1, r = -(Math.abs(A5) > 1e-6 ? (B2 + Math.sqrt(B2 * B2 - 4 * A5 * C3)) / (2 * A5) : C3 / B2);\n    return {\n      x: x12 + xa + xb * r,\n      y: y12 + ya + yb * r,\n      r\n    };\n  }\n  function place(b2, a2, c2) {\n    var dx = b2.x - a2.x, x2, a22, dy = b2.y - a2.y, y2, b22, d2 = dx * dx + dy * dy;\n    if (d2) {\n      a22 = a2.r + c2.r, a22 *= a22;\n      b22 = b2.r + c2.r, b22 *= b22;\n      if (a22 > b22) {\n        x2 = (d2 + b22 - a22) / (2 * d2);\n        y2 = Math.sqrt(Math.max(0, b22 / d2 - x2 * x2));\n        c2.x = b2.x - x2 * dx - y2 * dy;\n        c2.y = b2.y - x2 * dy + y2 * dx;\n      } else {\n        x2 = (d2 + a22 - b22) / (2 * d2);\n        y2 = Math.sqrt(Math.max(0, a22 / d2 - x2 * x2));\n        c2.x = a2.x + x2 * dx - y2 * dy;\n        c2.y = a2.y + x2 * dy + y2 * dx;\n      }\n    } else {\n      c2.x = a2.x + c2.r;\n      c2.y = a2.y;\n    }\n  }\n  function intersects(a2, b2) {\n    var dr = a2.r + b2.r - 1e-6, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n  }\n  function score(node) {\n    var a2 = node._, b2 = node.next._, ab = a2.r + b2.r, dx = (a2.x * b2.r + b2.x * a2.r) / ab, dy = (a2.y * b2.r + b2.y * a2.r) / ab;\n    return dx * dx + dy * dy;\n  }\n  function Node$1(circle2) {\n    this._ = circle2;\n    this.next = null;\n    this.previous = null;\n  }\n  function packSiblingsRandom(circles, random2) {\n    if (!(n = (circles = array$2(circles)).length)) return 0;\n    var a2, b2, c2, n, aa, ca, i, j, k, sj, sk;\n    a2 = circles[0], a2.x = 0, a2.y = 0;\n    if (!(n > 1)) return a2.r;\n    b2 = circles[1], a2.x = -b2.r, b2.x = a2.r, b2.y = 0;\n    if (!(n > 2)) return a2.r + b2.r;\n    place(b2, a2, c2 = circles[2]);\n    a2 = new Node$1(a2), b2 = new Node$1(b2), c2 = new Node$1(c2);\n    a2.next = c2.previous = b2;\n    b2.next = a2.previous = c2;\n    c2.next = b2.previous = a2;\n    pack: for (i = 3; i < n; ++i) {\n      place(a2._, b2._, c2 = circles[i]), c2 = new Node$1(c2);\n      j = b2.next, k = a2.previous, sj = b2._.r, sk = a2._.r;\n      do {\n        if (sj <= sk) {\n          if (intersects(j._, c2._)) {\n            b2 = j, a2.next = b2, b2.previous = a2, --i;\n            continue pack;\n          }\n          sj += j._.r, j = j.next;\n        } else {\n          if (intersects(k._, c2._)) {\n            a2 = k, a2.next = b2, b2.previous = a2, --i;\n            continue pack;\n          }\n          sk += k._.r, k = k.previous;\n        }\n      } while (j !== k.next);\n      c2.previous = a2, c2.next = b2, a2.next = b2.previous = b2 = c2;\n      aa = score(a2);\n      while ((c2 = c2.next) !== b2) {\n        if ((ca = score(c2)) < aa) {\n          a2 = c2, aa = ca;\n        }\n      }\n      b2 = a2.next;\n    }\n    a2 = [b2._], c2 = b2;\n    while ((c2 = c2.next) !== b2) a2.push(c2._);\n    c2 = packEncloseRandom(a2, random2);\n    for (i = 0; i < n; ++i) a2 = circles[i], a2.x -= c2.x, a2.y -= c2.y;\n    return c2.r;\n  }\n  function defaultRadius(d2) {\n    return Math.sqrt(d2.value);\n  }\n  function pack() {\n    var radius2 = null, dx = 1, dy = 1, padding2 = constantZero;\n    function pack2(root) {\n      const random2 = lcg();\n      root.x = dx / 2, root.y = dy / 2;\n      if (radius2) {\n        root.eachBefore(radiusLeaf(radius2)).eachAfter(packChildrenRandom(padding2, 0.5, random2)).eachBefore(translateChild(1));\n      } else {\n        root.eachBefore(radiusLeaf(defaultRadius)).eachAfter(packChildrenRandom(constantZero, 1, random2)).eachAfter(packChildrenRandom(padding2, root.r / Math.min(dx, dy), random2)).eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n      }\n      return root;\n    }\n    pack2.radius = function(x2) {\n      return arguments.length ? (radius2 = optional(x2), pack2) : radius2;\n    };\n    pack2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], pack2) : [dx, dy];\n    };\n    pack2.padding = function(x2) {\n      return arguments.length ? (padding2 = typeof x2 === \"function\" ? x2 : constant(+x2), pack2) : padding2;\n    };\n    return pack2;\n  }\n  function radiusLeaf(radius2) {\n    return function(node) {\n      if (!node.children) {\n        node.r = Math.max(0, +radius2(node) || 0);\n      }\n    };\n  }\n  function packChildrenRandom(padding2, k, random2) {\n    return function(node) {\n      if (children2 = node.children) {\n        var children2, i, n = children2.length, r = padding2(node) * k || 0, e;\n        if (r) for (i = 0; i < n; ++i) children2[i].r += r;\n        e = packSiblingsRandom(children2, random2);\n        if (r) for (i = 0; i < n; ++i) children2[i].r -= r;\n        node.r = e + r;\n      }\n    };\n  }\n  function translateChild(k) {\n    return function(node) {\n      var parent = node.parent;\n      node.r *= k;\n      if (parent) {\n        node.x = parent.x + k * node.x;\n        node.y = parent.y + k * node.y;\n      }\n    };\n  }\n  function roundNode(node) {\n    node.x0 = Math.round(node.x0);\n    node.y0 = Math.round(node.y0);\n    node.x1 = Math.round(node.x1);\n    node.y1 = Math.round(node.y1);\n  }\n  function treemapDice(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (x12 - x02) / parent.value;\n    while (++i < n) {\n      node = nodes[i], node.y0 = y02, node.y1 = y12;\n      node.x0 = x02, node.x1 = x02 += node.value * k;\n    }\n  }\n  function partition$1() {\n    var dx = 1, dy = 1, padding2 = 0, round = false;\n    function partition2(root) {\n      var n = root.height + 1;\n      root.x0 = root.y0 = padding2;\n      root.x1 = dx;\n      root.y1 = dy / n;\n      root.eachBefore(positionNode(dy, n));\n      if (round) root.eachBefore(roundNode);\n      return root;\n    }\n    function positionNode(dy2, n) {\n      return function(node) {\n        if (node.children) {\n          treemapDice(node, node.x0, dy2 * (node.depth + 1) / n, node.x1, dy2 * (node.depth + 2) / n);\n        }\n        var x02 = node.x0, y02 = node.y0, x12 = node.x1 - padding2, y12 = node.y1 - padding2;\n        if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n        if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n        node.x0 = x02;\n        node.y0 = y02;\n        node.x1 = x12;\n        node.y1 = y12;\n      };\n    }\n    partition2.round = function(x2) {\n      return arguments.length ? (round = !!x2, partition2) : round;\n    };\n    partition2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], partition2) : [dx, dy];\n    };\n    partition2.padding = function(x2) {\n      return arguments.length ? (padding2 = +x2, partition2) : padding2;\n    };\n    return partition2;\n  }\n  var preroot = { depth: -1 }, ambiguous = {}, imputed = {};\n  function defaultId(d2) {\n    return d2.id;\n  }\n  function defaultParentId(d2) {\n    return d2.parentId;\n  }\n  function stratify() {\n    var id2 = defaultId, parentId = defaultParentId, path2;\n    function stratify2(data2) {\n      var nodes = Array.from(data2), currentId = id2, currentParentId = parentId, n, d2, i, root, parent, node, nodeId, nodeKey, nodeByKey = /* @__PURE__ */ new Map();\n      if (path2 != null) {\n        const I = nodes.map((d3, i2) => normalize(path2(d3, i2, data2)));\n        const P = I.map(parentof);\n        const S = new Set(I).add(\"\");\n        for (const i2 of P) {\n          if (!S.has(i2)) {\n            S.add(i2);\n            I.push(i2);\n            P.push(parentof(i2));\n            nodes.push(imputed);\n          }\n        }\n        currentId = (_, i2) => I[i2];\n        currentParentId = (_, i2) => P[i2];\n      }\n      for (i = 0, n = nodes.length; i < n; ++i) {\n        d2 = nodes[i], node = nodes[i] = new Node$2(d2);\n        if ((nodeId = currentId(d2, i, data2)) != null && (nodeId += \"\")) {\n          nodeKey = node.id = nodeId;\n          nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node);\n        }\n        if ((nodeId = currentParentId(d2, i, data2)) != null && (nodeId += \"\")) {\n          node.parent = nodeId;\n        }\n      }\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        if (nodeId = node.parent) {\n          parent = nodeByKey.get(nodeId);\n          if (!parent) throw new Error(\"missing: \" + nodeId);\n          if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n          if (parent.children) parent.children.push(node);\n          else parent.children = [node];\n          node.parent = parent;\n        } else {\n          if (root) throw new Error(\"multiple roots\");\n          root = node;\n        }\n      }\n      if (!root) throw new Error(\"no root\");\n      if (path2 != null) {\n        while (root.data === imputed && root.children.length === 1) {\n          root = root.children[0], --n;\n        }\n        for (let i2 = nodes.length - 1; i2 >= 0; --i2) {\n          node = nodes[i2];\n          if (node.data !== imputed) break;\n          node.data = null;\n        }\n      }\n      root.parent = preroot;\n      root.eachBefore(function(node2) {\n        node2.depth = node2.parent.depth + 1;\n        --n;\n      }).eachBefore(computeHeight);\n      root.parent = null;\n      if (n > 0) throw new Error(\"cycle\");\n      return root;\n    }\n    stratify2.id = function(x2) {\n      return arguments.length ? (id2 = optional(x2), stratify2) : id2;\n    };\n    stratify2.parentId = function(x2) {\n      return arguments.length ? (parentId = optional(x2), stratify2) : parentId;\n    };\n    stratify2.path = function(x2) {\n      return arguments.length ? (path2 = optional(x2), stratify2) : path2;\n    };\n    return stratify2;\n  }\n  function normalize(path2) {\n    path2 = `${path2}`;\n    let i = path2.length;\n    if (slash(path2, i - 1) && !slash(path2, i - 2)) path2 = path2.slice(0, -1);\n    return path2[0] === \"/\" ? path2 : `/${path2}`;\n  }\n  function parentof(path2) {\n    let i = path2.length;\n    if (i < 2) return \"\";\n    while (--i > 1) if (slash(path2, i)) break;\n    return path2.slice(0, i);\n  }\n  function slash(path2, i) {\n    if (path2[i] === \"/\") {\n      let k = 0;\n      while (i > 0 && path2[--i] === \"\\\\\") ++k;\n      if ((k & 1) === 0) return true;\n    }\n    return false;\n  }\n  function defaultSeparation$1(a2, b2) {\n    return a2.parent === b2.parent ? 1 : 2;\n  }\n  function nextLeft(v) {\n    var children2 = v.children;\n    return children2 ? children2[0] : v.t;\n  }\n  function nextRight(v) {\n    var children2 = v.children;\n    return children2 ? children2[children2.length - 1] : v.t;\n  }\n  function moveSubtree(wm, wp, shift) {\n    var change2 = shift / (wp.i - wm.i);\n    wp.c -= change2;\n    wp.s += shift;\n    wm.c += change2;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function executeShifts(v) {\n    var shift = 0, change2 = 0, children2 = v.children, i = children2.length, w2;\n    while (--i >= 0) {\n      w2 = children2[i];\n      w2.z += shift;\n      w2.m += shift;\n      shift += w2.s + (change2 += w2.c);\n    }\n  }\n  function nextAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  function TreeNode(node, i) {\n    this._ = node;\n    this.parent = null;\n    this.children = null;\n    this.A = null;\n    this.a = this;\n    this.z = 0;\n    this.m = 0;\n    this.c = 0;\n    this.s = 0;\n    this.t = null;\n    this.i = i;\n  }\n  TreeNode.prototype = Object.create(Node$2.prototype);\n  function treeRoot(root) {\n    var tree2 = new TreeNode(root, 0), node, nodes = [tree2], child, children2, i, n;\n    while (node = nodes.pop()) {\n      if (children2 = node._.children) {\n        node.children = new Array(n = children2.length);\n        for (i = n - 1; i >= 0; --i) {\n          nodes.push(child = node.children[i] = new TreeNode(children2[i], i));\n          child.parent = node;\n        }\n      }\n    }\n    (tree2.parent = new TreeNode(null, 0)).children = [tree2];\n    return tree2;\n  }\n  function tree$1() {\n    var separation = defaultSeparation$1, dx = 1, dy = 1, nodeSize = null;\n    function tree2(root) {\n      var t = treeRoot(root);\n      t.eachAfter(firstWalk), t.parent.m = -t.z;\n      t.eachBefore(secondWalk);\n      if (nodeSize) root.eachBefore(sizeNode);\n      else {\n        var left = root, right = root, bottom = root;\n        root.eachBefore(function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var s2 = left === right ? 1 : separation(left, right) / 2, tx2 = s2 - left.x, kx = dx / (right.x + s2 + tx2), ky = dy / (bottom.depth || 1);\n        root.eachBefore(function(node) {\n          node.x = (node.x + tx2) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return root;\n    }\n    function firstWalk(v) {\n      var children2 = v.children, siblings = v.parent.children, w2 = v.i ? siblings[v.i - 1] : null;\n      if (children2) {\n        executeShifts(v);\n        var midpoint = (children2[0].z + children2[children2.length - 1].z) / 2;\n        if (w2) {\n          v.z = w2.z + separation(v._, w2._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w2) {\n        v.z = w2.z + separation(v._, w2._);\n      }\n      v.parent.A = apportion(v, w2, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w2, ancestor) {\n      if (w2) {\n        var vip = v, vop = v, vim = w2, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n          vom = nextLeft(vom);\n          vop = nextRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !nextRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !nextLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= dx;\n      node.y = node.depth * dy;\n    }\n    tree2.separation = function(x2) {\n      return arguments.length ? (separation = x2, tree2) : separation;\n    };\n    tree2.size = function(x2) {\n      return arguments.length ? (nodeSize = false, dx = +x2[0], dy = +x2[1], tree2) : nodeSize ? null : [dx, dy];\n    };\n    tree2.nodeSize = function(x2) {\n      return arguments.length ? (nodeSize = true, dx = +x2[0], dy = +x2[1], tree2) : nodeSize ? [dx, dy] : null;\n    };\n    return tree2;\n  }\n  function treemapSlice(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (y12 - y02) / parent.value;\n    while (++i < n) {\n      node = nodes[i], node.x0 = x02, node.x1 = x12;\n      node.y0 = y02, node.y1 = y02 += node.value * k;\n    }\n  }\n  var phi = (1 + Math.sqrt(5)) / 2;\n  function squarifyRatio(ratio, parent, x02, y02, x12, y12) {\n    var rows = [], nodes = parent.children, row, nodeValue, i0 = 0, i1 = 0, n = nodes.length, dx, dy, value2 = parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta;\n    while (i0 < n) {\n      dx = x12 - x02, dy = y12 - y02;\n      do\n        sumValue = nodes[i1++].value;\n      while (!sumValue && i1 < n);\n      minValue = maxValue = sumValue;\n      alpha = Math.max(dy / dx, dx / dy) / (value2 * ratio);\n      beta = sumValue * sumValue * alpha;\n      minRatio = Math.max(maxValue / beta, beta / minValue);\n      for (; i1 < n; ++i1) {\n        sumValue += nodeValue = nodes[i1].value;\n        if (nodeValue < minValue) minValue = nodeValue;\n        if (nodeValue > maxValue) maxValue = nodeValue;\n        beta = sumValue * sumValue * alpha;\n        newRatio = Math.max(maxValue / beta, beta / minValue);\n        if (newRatio > minRatio) {\n          sumValue -= nodeValue;\n          break;\n        }\n        minRatio = newRatio;\n      }\n      rows.push(row = { value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1) });\n      if (row.dice) treemapDice(row, x02, y02, x12, value2 ? y02 += dy * sumValue / value2 : y12);\n      else treemapSlice(row, x02, y02, value2 ? x02 += dx * sumValue / value2 : x12, y12);\n      value2 -= sumValue, i0 = i1;\n    }\n    return rows;\n  }\n  const treemapSquarify = (function custom2(ratio) {\n    function squarify(parent, x02, y02, x12, y12) {\n      squarifyRatio(ratio, parent, x02, y02, x12, y12);\n    }\n    squarify.ratio = function(x2) {\n      return custom2((x2 = +x2) > 1 ? x2 : 1);\n    };\n    return squarify;\n  })(phi);\n  function treemap() {\n    var tile = treemapSquarify, round = false, dx = 1, dy = 1, paddingStack = [0], paddingInner = constantZero, paddingTop = constantZero, paddingRight = constantZero, paddingBottom = constantZero, paddingLeft = constantZero;\n    function treemap2(root) {\n      root.x0 = root.y0 = 0;\n      root.x1 = dx;\n      root.y1 = dy;\n      root.eachBefore(positionNode);\n      paddingStack = [0];\n      if (round) root.eachBefore(roundNode);\n      return root;\n    }\n    function positionNode(node) {\n      var p = paddingStack[node.depth], x02 = node.x0 + p, y02 = node.y0 + p, x12 = node.x1 - p, y12 = node.y1 - p;\n      if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n      if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n      node.x0 = x02;\n      node.y0 = y02;\n      node.x1 = x12;\n      node.y1 = y12;\n      if (node.children) {\n        p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n        x02 += paddingLeft(node) - p;\n        y02 += paddingTop(node) - p;\n        x12 -= paddingRight(node) - p;\n        y12 -= paddingBottom(node) - p;\n        if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n        if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n        tile(node, x02, y02, x12, y12);\n      }\n    }\n    treemap2.round = function(x2) {\n      return arguments.length ? (round = !!x2, treemap2) : round;\n    };\n    treemap2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], treemap2) : [dx, dy];\n    };\n    treemap2.tile = function(x2) {\n      return arguments.length ? (tile = required(x2), treemap2) : tile;\n    };\n    treemap2.padding = function(x2) {\n      return arguments.length ? treemap2.paddingInner(x2).paddingOuter(x2) : treemap2.paddingInner();\n    };\n    treemap2.paddingInner = function(x2) {\n      return arguments.length ? (paddingInner = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingInner;\n    };\n    treemap2.paddingOuter = function(x2) {\n      return arguments.length ? treemap2.paddingTop(x2).paddingRight(x2).paddingBottom(x2).paddingLeft(x2) : treemap2.paddingTop();\n    };\n    treemap2.paddingTop = function(x2) {\n      return arguments.length ? (paddingTop = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingTop;\n    };\n    treemap2.paddingRight = function(x2) {\n      return arguments.length ? (paddingRight = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingRight;\n    };\n    treemap2.paddingBottom = function(x2) {\n      return arguments.length ? (paddingBottom = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingBottom;\n    };\n    treemap2.paddingLeft = function(x2) {\n      return arguments.length ? (paddingLeft = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingLeft;\n    };\n    return treemap2;\n  }\n  function treemapBinary(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, i, n = nodes.length, sum2, sums = new Array(n + 1);\n    for (sums[0] = sum2 = i = 0; i < n; ++i) {\n      sums[i + 1] = sum2 += nodes[i].value;\n    }\n    partition2(0, n, parent.value, x02, y02, x12, y12);\n    function partition2(i2, j, value2, x03, y03, x13, y13) {\n      if (i2 >= j - 1) {\n        var node = nodes[i2];\n        node.x0 = x03, node.y0 = y03;\n        node.x1 = x13, node.y1 = y13;\n        return;\n      }\n      var valueOffset = sums[i2], valueTarget = value2 / 2 + valueOffset, k = i2 + 1, hi = j - 1;\n      while (k < hi) {\n        var mid = k + hi >>> 1;\n        if (sums[mid] < valueTarget) k = mid + 1;\n        else hi = mid;\n      }\n      if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i2 + 1 < k) --k;\n      var valueLeft = sums[k] - valueOffset, valueRight = value2 - valueLeft;\n      if (x13 - x03 > y13 - y03) {\n        var xk = value2 ? (x03 * valueRight + x13 * valueLeft) / value2 : x13;\n        partition2(i2, k, valueLeft, x03, y03, xk, y13);\n        partition2(k, j, valueRight, xk, y03, x13, y13);\n      } else {\n        var yk = value2 ? (y03 * valueRight + y13 * valueLeft) / value2 : y13;\n        partition2(i2, k, valueLeft, x03, y03, x13, yk);\n        partition2(k, j, valueRight, x03, yk, x13, y13);\n      }\n    }\n  }\n  function treemapSliceDice(parent, x02, y02, x12, y12) {\n    (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x02, y02, x12, y12);\n  }\n  const treemapResquarify = (function custom2(ratio) {\n    function resquarify(parent, x02, y02, x12, y12) {\n      if ((rows = parent._squarify) && rows.ratio === ratio) {\n        var rows, row, nodes, i, j = -1, n, m2 = rows.length, value2 = parent.value;\n        while (++j < m2) {\n          row = rows[j], nodes = row.children;\n          for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n          if (row.dice) treemapDice(row, x02, y02, x12, value2 ? y02 += (y12 - y02) * row.value / value2 : y12);\n          else treemapSlice(row, x02, y02, value2 ? x02 += (x12 - x02) * row.value / value2 : x12, y12);\n          value2 -= row.value;\n        }\n      } else {\n        parent._squarify = rows = squarifyRatio(ratio, parent, x02, y02, x12, y12);\n        rows.ratio = ratio;\n      }\n    }\n    resquarify.ratio = function(x2) {\n      return custom2((x2 = +x2) > 1 ? x2 : 1);\n    };\n    return resquarify;\n  })(phi);\n  function lookup$2(tree2, key2, filter2) {\n    const map2 = {};\n    tree2.each((node) => {\n      const t = node.data;\n      if (filter2(t)) map2[key2(t)] = node;\n    });\n    tree2.lookup = map2;\n    return tree2;\n  }\n  function Nest(params2) {\n    Transform.call(this, null, params2);\n  }\n  Nest.Definition = {\n    \"type\": \"Nest\",\n    \"metadata\": {\n      \"treesource\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"keys\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"generate\",\n      \"type\": \"boolean\"\n    }]\n  };\n  const children$1 = (n) => n.values;\n  inherits(Nest, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source) {\n        error(\"Nest transform requires an upstream data source.\");\n      }\n      var gen = _.generate, mod = _.modified(), out = pulse2.clone(), tree2 = this.value;\n      if (!tree2 || mod || pulse2.changed()) {\n        if (tree2) {\n          tree2.each((node) => {\n            if (node.children && isTuple(node.data)) {\n              out.rem.push(node.data);\n            }\n          });\n        }\n        this.value = tree2 = hierarchy({\n          values: array$4(_.keys).reduce((n, k) => {\n            n.key(k);\n            return n;\n          }, nest()).entries(out.source)\n        }, children$1);\n        if (gen) {\n          tree2.each((node) => {\n            if (node.children) {\n              node = ingest$1(node.data);\n              out.add.push(node);\n              out.source.push(node);\n            }\n          });\n        }\n        lookup$2(tree2, tupleid, tupleid);\n      }\n      out.source.root = tree2;\n      return out;\n    }\n  });\n  function nest() {\n    const keys2 = [], nest2 = {\n      entries: (array2) => entries(apply2(array2, 0), 0),\n      key: (d2) => (keys2.push(d2), nest2)\n    };\n    function apply2(array2, depth) {\n      if (depth >= keys2.length) {\n        return array2;\n      }\n      const n = array2.length, key2 = keys2[depth++], valuesByKey = {}, result = {};\n      let i = -1, keyValue, value2, values2;\n      while (++i < n) {\n        keyValue = key2(value2 = array2[i]) + \"\";\n        if (values2 = valuesByKey[keyValue]) {\n          values2.push(value2);\n        } else {\n          valuesByKey[keyValue] = [value2];\n        }\n      }\n      for (keyValue in valuesByKey) {\n        result[keyValue] = apply2(valuesByKey[keyValue], depth);\n      }\n      return result;\n    }\n    function entries(map2, depth) {\n      if (++depth > keys2.length) return map2;\n      const array2 = [];\n      for (const key2 in map2) {\n        array2.push({\n          key: key2,\n          values: entries(map2[key2], depth)\n        });\n      }\n      return array2;\n    }\n    return nest2;\n  }\n  function HierarchyLayout(params2) {\n    Transform.call(this, null, params2);\n  }\n  const defaultSeparation = (a2, b2) => a2.parent === b2.parent ? 1 : 2;\n  inherits(HierarchyLayout, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source || !pulse2.source.root) {\n        error(this.constructor.name + \" transform requires a backing tree data source.\");\n      }\n      const layout = this.layout(_.method), fields = this.fields, root = pulse2.source.root, as = _.as || fields;\n      if (_.field) root.sum(_.field);\n      else root.count();\n      if (_.sort) root.sort(stableCompare(_.sort, (d2) => d2.data));\n      setParams(layout, this.params, _);\n      if (layout.separation) {\n        layout.separation(_.separation !== false ? defaultSeparation : one$1);\n      }\n      try {\n        this.value = layout(root);\n      } catch (err) {\n        error(err);\n      }\n      root.each((node) => setFields(node, fields, as));\n      return pulse2.reflow(_.modified()).modifies(as).modifies(\"leaf\");\n    }\n  });\n  function setParams(layout, params2, _) {\n    for (let p, i = 0, n = params2.length; i < n; ++i) {\n      p = params2[i];\n      if (p in _) layout[p](_[p]);\n    }\n  }\n  function setFields(node, fields, as) {\n    const t = node.data, n = fields.length - 1;\n    for (let i = 0; i < n; ++i) {\n      t[as[i]] = node[fields[i]];\n    }\n    t[as[n]] = node.children ? node.children.length : 0;\n  }\n  const Output$3 = [\"x\", \"y\", \"r\", \"depth\", \"children\"];\n  function Pack(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Pack.Definition = {\n    \"type\": \"Pack\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"radius\",\n      \"type\": \"field\",\n      \"default\": null\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$3.length,\n      \"default\": Output$3\n    }]\n  };\n  inherits(Pack, HierarchyLayout, {\n    layout: pack,\n    params: [\"radius\", \"size\", \"padding\"],\n    fields: Output$3\n  });\n  const Output$2 = [\"x0\", \"y0\", \"x1\", \"y1\", \"depth\", \"children\"];\n  function Partition(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Partition.Definition = {\n    \"type\": \"Partition\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"round\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$2.length,\n      \"default\": Output$2\n    }]\n  };\n  inherits(Partition, HierarchyLayout, {\n    layout: partition$1,\n    params: [\"size\", \"round\", \"padding\"],\n    fields: Output$2\n  });\n  function Stratify(params2) {\n    Transform.call(this, null, params2);\n  }\n  Stratify.Definition = {\n    \"type\": \"Stratify\",\n    \"metadata\": {\n      \"treesource\": true\n    },\n    \"params\": [{\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"parentKey\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  };\n  inherits(Stratify, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source) {\n        error(\"Stratify transform requires an upstream data source.\");\n      }\n      let tree2 = this.value;\n      const mod = _.modified(), out = pulse2.fork(pulse2.ALL).materialize(pulse2.SOURCE), run2 = !tree2 || mod || pulse2.changed(pulse2.ADD_REM) || pulse2.modified(_.key.fields) || pulse2.modified(_.parentKey.fields);\n      out.source = out.source.slice();\n      if (run2) {\n        tree2 = out.source.length ? lookup$2(stratify().id(_.key).parentId(_.parentKey)(out.source), _.key, truthy) : lookup$2(stratify()([{}]), _.key, _.key);\n      }\n      out.source.root = this.value = tree2;\n      return out;\n    }\n  });\n  const Layouts = {\n    tidy: tree$1,\n    cluster\n  };\n  const Output$1$1 = [\"x\", \"y\", \"depth\", \"children\"];\n  function Tree(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Tree.Definition = {\n    \"type\": \"Tree\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"tidy\",\n      \"values\": [\"tidy\", \"cluster\"]\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"nodeSize\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"separation\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$1$1.length,\n      \"default\": Output$1$1\n    }]\n  };\n  inherits(Tree, HierarchyLayout, {\n    /**\n     * Tree layout generator. Supports both 'tidy' and 'cluster' layouts.\n     */\n    layout(method2) {\n      const m2 = method2 || \"tidy\";\n      if (has$1(Layouts, m2)) return Layouts[m2]();\n      else error(\"Unrecognized Tree layout method: \" + m2);\n    },\n    params: [\"size\", \"nodeSize\"],\n    fields: Output$1$1\n  });\n  function TreeLinks(params2) {\n    Transform.call(this, [], params2);\n  }\n  TreeLinks.Definition = {\n    \"type\": \"TreeLinks\",\n    \"metadata\": {\n      \"tree\": true,\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": []\n  };\n  inherits(TreeLinks, Transform, {\n    transform(_, pulse2) {\n      const links = this.value, tree2 = pulse2.source && pulse2.source.root, out = pulse2.fork(pulse2.NO_SOURCE), lut = {};\n      if (!tree2) error(\"TreeLinks transform requires a tree data source.\");\n      if (pulse2.changed(pulse2.ADD_REM)) {\n        out.rem = links;\n        pulse2.visit(pulse2.SOURCE, (t) => lut[tupleid(t)] = 1);\n        tree2.each((node) => {\n          const t = node.data, p = node.parent && node.parent.data;\n          if (p && lut[tupleid(t)] && lut[tupleid(p)]) {\n            out.add.push(ingest$1({\n              source: p,\n              target: t\n            }));\n          }\n        });\n        this.value = out.add;\n      } else if (pulse2.changed(pulse2.MOD)) {\n        pulse2.visit(pulse2.MOD, (t) => lut[tupleid(t)] = 1);\n        links.forEach((link2) => {\n          if (lut[tupleid(link2.source)] || lut[tupleid(link2.target)]) {\n            out.mod.push(link2);\n          }\n        });\n      }\n      return out;\n    }\n  });\n  const Tiles = {\n    binary: treemapBinary,\n    dice: treemapDice,\n    slice: treemapSlice,\n    slicedice: treemapSliceDice,\n    squarify: treemapSquarify,\n    resquarify: treemapResquarify\n  };\n  const Output$4 = [\"x0\", \"y0\", \"x1\", \"y1\", \"depth\", \"children\"];\n  function Treemap(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Treemap.Definition = {\n    \"type\": \"Treemap\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"squarify\",\n      \"values\": [\"squarify\", \"resquarify\", \"binary\", \"dice\", \"slice\", \"slicedice\"]\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingInner\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingOuter\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingTop\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingRight\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingBottom\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingLeft\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"ratio\",\n      \"type\": \"number\",\n      \"default\": 1.618033988749895\n    }, {\n      \"name\": \"round\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$4.length,\n      \"default\": Output$4\n    }]\n  };\n  inherits(Treemap, HierarchyLayout, {\n    /**\n     * Treemap layout generator. Adds 'method' and 'ratio' parameters\n     * to configure the underlying tile method.\n     */\n    layout() {\n      const x2 = treemap();\n      x2.ratio = (_) => {\n        const t = x2.tile();\n        if (t.ratio) x2.tile(t.ratio(_));\n      };\n      x2.method = (_) => {\n        if (has$1(Tiles, _)) x2.tile(Tiles[_]);\n        else error(\"Unrecognized Treemap layout method: \" + _);\n      };\n      return x2;\n    },\n    params: [\"method\", \"ratio\", \"size\", \"round\", \"padding\", \"paddingInner\", \"paddingOuter\", \"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"],\n    fields: Output$4\n  });\n  const tree = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    nest: Nest,\n    pack: Pack,\n    partition: Partition,\n    stratify: Stratify,\n    tree: Tree,\n    treelinks: TreeLinks,\n    treemap: Treemap\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const ALPHA_MASK = 4278190080;\n  function baseBitmaps($2, data2) {\n    const bitmap = $2.bitmap();\n    (data2 || []).forEach((d2) => bitmap.set($2(d2.boundary[0]), $2(d2.boundary[3])));\n    return [bitmap, void 0];\n  }\n  function markBitmaps($2, baseMark, avoidMarks, labelInside, isGroupArea) {\n    const width2 = $2.width, height2 = $2.height, border = labelInside || isGroupArea, context2 = domCanvas(width2, height2).getContext(\"2d\"), baseMarkContext = domCanvas(width2, height2).getContext(\"2d\"), strokeContext = border && domCanvas(width2, height2).getContext(\"2d\");\n    avoidMarks.forEach((items) => draw(context2, items, false));\n    draw(baseMarkContext, baseMark, false);\n    if (border) {\n      draw(strokeContext, baseMark, true);\n    }\n    const buffer = getBuffer(context2, width2, height2), baseMarkBuffer = getBuffer(baseMarkContext, width2, height2), strokeBuffer = border && getBuffer(strokeContext, width2, height2), layer1 = $2.bitmap(), layer2 = border && $2.bitmap();\n    let x2, y2, u2, v, index2, alpha, strokeAlpha, baseMarkAlpha;\n    for (y2 = 0; y2 < height2; ++y2) {\n      for (x2 = 0; x2 < width2; ++x2) {\n        index2 = y2 * width2 + x2;\n        alpha = buffer[index2] & ALPHA_MASK;\n        baseMarkAlpha = baseMarkBuffer[index2] & ALPHA_MASK;\n        strokeAlpha = border && strokeBuffer[index2] & ALPHA_MASK;\n        if (alpha || strokeAlpha || baseMarkAlpha) {\n          u2 = $2(x2);\n          v = $2(y2);\n          if (!isGroupArea && (alpha || baseMarkAlpha)) layer1.set(u2, v);\n          if (border && (alpha || strokeAlpha)) layer2.set(u2, v);\n        }\n      }\n    }\n    return [layer1, layer2];\n  }\n  function getBuffer(context2, width2, height2) {\n    return new Uint32Array(context2.getImageData(0, 0, width2, height2).data.buffer);\n  }\n  function draw(context2, items, interior) {\n    if (!items.length) return;\n    const type2 = items[0].mark.marktype;\n    if (type2 === \"group\") {\n      items.forEach((group2) => {\n        group2.items.forEach((mark) => draw(context2, mark.items, interior));\n      });\n    } else {\n      Marks[type2].draw(context2, {\n        items: interior ? items.map(prepare) : items\n      });\n    }\n  }\n  function prepare(source2) {\n    const item = rederive(source2, {});\n    if (item.stroke && item.strokeOpacity !== 0 || item.fill && item.fillOpacity !== 0) {\n      return {\n        ...item,\n        strokeOpacity: 1,\n        stroke: \"#000\",\n        fillOpacity: 0\n      };\n    }\n    return item;\n  }\n  const DIV = 5, MOD = 31, SIZE = 32, RIGHT0 = new Uint32Array(SIZE + 1), RIGHT1 = new Uint32Array(SIZE + 1);\n  RIGHT1[0] = 0;\n  RIGHT0[0] = ~RIGHT1[0];\n  for (let i = 1; i <= SIZE; ++i) {\n    RIGHT1[i] = RIGHT1[i - 1] << 1 | 1;\n    RIGHT0[i] = ~RIGHT1[i];\n  }\n  function Bitmap(w2, h2) {\n    const array2 = new Uint32Array(~~((w2 * h2 + SIZE) / SIZE));\n    function _set(index2, mask) {\n      array2[index2] |= mask;\n    }\n    function _clear(index2, mask) {\n      array2[index2] &= mask;\n    }\n    return {\n      array: array2,\n      get: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        return array2[index2 >>> DIV] & 1 << (index2 & MOD);\n      },\n      set: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        _set(index2 >>> DIV, 1 << (index2 & MOD));\n      },\n      clear: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        _clear(index2 >>> DIV, ~(1 << (index2 & MOD)));\n      },\n      getRange: (x2, y2, x22, y22) => {\n        let r = y22, start, end, indexStart, indexEnd;\n        for (; r >= y2; --r) {\n          start = r * w2 + x2;\n          end = r * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            if (array2[indexStart] & RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]) {\n              return true;\n            }\n          } else {\n            if (array2[indexStart] & RIGHT0[start & MOD]) return true;\n            if (array2[indexEnd] & RIGHT1[(end & MOD) + 1]) return true;\n            for (let i = indexStart + 1; i < indexEnd; ++i) {\n              if (array2[i]) return true;\n            }\n          }\n        }\n        return false;\n      },\n      setRange: (x2, y2, x22, y22) => {\n        let start, end, indexStart, indexEnd, i;\n        for (; y2 <= y22; ++y2) {\n          start = y2 * w2 + x2;\n          end = y2 * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            _set(indexStart, RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]);\n          } else {\n            _set(indexStart, RIGHT0[start & MOD]);\n            _set(indexEnd, RIGHT1[(end & MOD) + 1]);\n            for (i = indexStart + 1; i < indexEnd; ++i) _set(i, 4294967295);\n          }\n        }\n      },\n      clearRange: (x2, y2, x22, y22) => {\n        let start, end, indexStart, indexEnd, i;\n        for (; y2 <= y22; ++y2) {\n          start = y2 * w2 + x2;\n          end = y2 * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            _clear(indexStart, RIGHT1[start & MOD] | RIGHT0[(end & MOD) + 1]);\n          } else {\n            _clear(indexStart, RIGHT1[start & MOD]);\n            _clear(indexEnd, RIGHT0[(end & MOD) + 1]);\n            for (i = indexStart + 1; i < indexEnd; ++i) _clear(i, 0);\n          }\n        }\n      },\n      outOfBounds: (x2, y2, x22, y22) => x2 < 0 || y2 < 0 || y22 >= h2 || x22 >= w2\n    };\n  }\n  function scaler(width2, height2, padding2) {\n    const ratio = Math.max(1, Math.sqrt(width2 * height2 / 1e6)), w2 = ~~((width2 + 2 * padding2 + ratio) / ratio), h2 = ~~((height2 + 2 * padding2 + ratio) / ratio), scale2 = (_) => ~~((_ + padding2) / ratio);\n    scale2.invert = (_) => _ * ratio - padding2;\n    scale2.bitmap = () => Bitmap(w2, h2);\n    scale2.ratio = ratio;\n    scale2.padding = padding2;\n    scale2.width = width2;\n    scale2.height = height2;\n    return scale2;\n  }\n  function placeAreaLabelNaive($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height;\n    return function(d2) {\n      const items = d2.datum.datum.items[markIndex].items, n = items.length, textHeight = d2.datum.fontSize, textWidth = textMetrics.width(d2.datum, d2.datum.text);\n      let maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, areaWidth;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        x3 = (x12 + x2) / 2;\n        y3 = (y12 + y2) / 2;\n        areaWidth = Math.abs(x2 - x12 + y2 - y12);\n        if (areaWidth >= maxAreaWidth) {\n          maxAreaWidth = areaWidth;\n          d2.x = x3;\n          d2.y = y3;\n        }\n      }\n      x3 = textWidth / 2;\n      y3 = textHeight / 2;\n      x12 = d2.x - x3;\n      x2 = d2.x + x3;\n      y12 = d2.y - y3;\n      y2 = d2.y + y3;\n      d2.align = \"center\";\n      if (x12 < 0 && x2 <= width2) {\n        d2.align = \"left\";\n      } else if (0 <= x12 && width2 < x2) {\n        d2.align = \"right\";\n      }\n      d2.baseline = \"middle\";\n      if (y12 < 0 && y2 <= height2) {\n        d2.baseline = \"top\";\n      } else if (0 <= y12 && height2 < y2) {\n        d2.baseline = \"bottom\";\n      }\n      return true;\n    };\n  }\n  function outOfBounds(x2, y2, textWidth, textHeight, width2, height2) {\n    let r = textWidth / 2;\n    return x2 - r < 0 || x2 + r > width2 || y2 - (r = textHeight / 2) < 0 || y2 + r > height2;\n  }\n  function collision($2, x2, y2, textHeight, textWidth, h2, bm0, bm1) {\n    const w2 = textWidth * h2 / (textHeight * 2), x12 = $2(x2 - w2), x22 = $2(x2 + w2), y12 = $2(y2 - (h2 = h2 / 2)), y22 = $2(y2 + h2);\n    return bm0.outOfBounds(x12, y12, x22, y22) || bm0.getRange(x12, y12, x22, y22) || bm1 && bm1.getRange(x12, y12, x22, y22);\n  }\n  function placeAreaLabelReducedSearch($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1];\n    function tryLabel(_x, _y, maxSize, textWidth, textHeight) {\n      const x2 = $2.invert(_x), y2 = $2.invert(_y);\n      let lo = maxSize, hi = height2, mid;\n      if (!outOfBounds(x2, y2, textWidth, textHeight, width2, height2) && !collision($2, x2, y2, textHeight, textWidth, lo, bm0, bm1) && !collision($2, x2, y2, textHeight, textWidth, textHeight, bm0, null)) {\n        while (hi - lo >= 1) {\n          mid = (lo + hi) / 2;\n          if (collision($2, x2, y2, textHeight, textWidth, mid, bm0, bm1)) {\n            hi = mid;\n          } else {\n            lo = mid;\n          }\n        }\n        if (lo > maxSize) {\n          return [x2, y2, lo, true];\n        }\n      }\n    }\n    return function(d2) {\n      const items = d2.datum.datum.items[markIndex].items, n = items.length, textHeight = d2.datum.fontSize, textWidth = textMetrics.width(d2.datum, d2.datum.text);\n      let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, _x, _y, _x1, _xMid, _x2, _y1, _yMid, _y2, areaWidth, result, swapTmp;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        if (x12 > x2) {\n          swapTmp = x12;\n          x12 = x2;\n          x2 = swapTmp;\n        }\n        if (y12 > y2) {\n          swapTmp = y12;\n          y12 = y2;\n          y2 = swapTmp;\n        }\n        _x1 = $2(x12);\n        _x2 = $2(x2);\n        _xMid = ~~((_x1 + _x2) / 2);\n        _y1 = $2(y12);\n        _y2 = $2(y2);\n        _yMid = ~~((_y1 + _y2) / 2);\n        for (_x = _xMid; _x >= _x1; --_x) {\n          for (_y = _yMid; _y >= _y1; --_y) {\n            result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n            if (result) {\n              [d2.x, d2.y, maxSize, labelPlaced] = result;\n            }\n          }\n        }\n        for (_x = _xMid; _x <= _x2; ++_x) {\n          for (_y = _yMid; _y <= _y2; ++_y) {\n            result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n            if (result) {\n              [d2.x, d2.y, maxSize, labelPlaced] = result;\n            }\n          }\n        }\n        if (!labelPlaced && !avoidBaseMark) {\n          areaWidth = Math.abs(x2 - x12 + y2 - y12);\n          x3 = (x12 + x2) / 2;\n          y3 = (y12 + y2) / 2;\n          if (areaWidth >= maxAreaWidth && !outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            maxAreaWidth = areaWidth;\n            d2.x = x3;\n            d2.y = y3;\n            labelPlaced2 = true;\n          }\n        }\n      }\n      if (labelPlaced || labelPlaced2) {\n        x3 = textWidth / 2;\n        y3 = textHeight / 2;\n        bm0.setRange($2(d2.x - x3), $2(d2.y - y3), $2(d2.x + x3), $2(d2.y + y3));\n        d2.align = \"center\";\n        d2.baseline = \"middle\";\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n  const X_DIR = [-1, -1, 1, 1];\n  const Y_DIR = [-1, 1, -1, 1];\n  function placeAreaLabelFloodFill($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1], bm2 = $2.bitmap();\n    return function(d2) {\n      const items = d2.datum.datum.items[markIndex].items, n = items.length, textHeight = d2.datum.fontSize, textWidth = textMetrics.width(d2.datum, d2.datum.text), stack = [];\n      let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, _x, _y, lo, hi, mid, areaWidth;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        stack.push([$2((x12 + x2) / 2), $2((y12 + y2) / 2)]);\n        while (stack.length) {\n          [_x, _y] = stack.pop();\n          if (bm0.get(_x, _y) || bm1.get(_x, _y) || bm2.get(_x, _y)) continue;\n          bm2.set(_x, _y);\n          for (let j = 0; j < 4; ++j) {\n            x3 = _x + X_DIR[j];\n            y3 = _y + Y_DIR[j];\n            if (!bm2.outOfBounds(x3, y3, x3, y3)) stack.push([x3, y3]);\n          }\n          x3 = $2.invert(_x);\n          y3 = $2.invert(_y);\n          lo = maxSize;\n          hi = height2;\n          if (!outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, lo, bm0, bm1) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            while (hi - lo >= 1) {\n              mid = (lo + hi) / 2;\n              if (collision($2, x3, y3, textHeight, textWidth, mid, bm0, bm1)) {\n                hi = mid;\n              } else {\n                lo = mid;\n              }\n            }\n            if (lo > maxSize) {\n              d2.x = x3;\n              d2.y = y3;\n              maxSize = lo;\n              labelPlaced = true;\n            }\n          }\n        }\n        if (!labelPlaced && !avoidBaseMark) {\n          areaWidth = Math.abs(x2 - x12 + y2 - y12);\n          x3 = (x12 + x2) / 2;\n          y3 = (y12 + y2) / 2;\n          if (areaWidth >= maxAreaWidth && !outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            maxAreaWidth = areaWidth;\n            d2.x = x3;\n            d2.y = y3;\n            labelPlaced2 = true;\n          }\n        }\n      }\n      if (labelPlaced || labelPlaced2) {\n        x3 = textWidth / 2;\n        y3 = textHeight / 2;\n        bm0.setRange($2(d2.x - x3), $2(d2.y - y3), $2(d2.x + x3), $2(d2.y + y3));\n        d2.align = \"center\";\n        d2.baseline = \"middle\";\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n  const Aligns = [\"right\", \"center\", \"left\"], Baselines = [\"bottom\", \"middle\", \"top\"];\n  function placeMarkLabel($2, bitmaps, anchors, offsets2) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1], n = offsets2.length;\n    return function(d2) {\n      const boundary = d2.boundary, textHeight = d2.datum.fontSize;\n      if (boundary[2] < 0 || boundary[5] < 0 || boundary[0] > width2 || boundary[3] > height2) {\n        return false;\n      }\n      let textWidth = d2.textWidth ?? 0, dx, dy, isInside, sizeFactor, insideFactor, x12, x2, y12, y2, xc, yc, _x1, _x2, _y1, _y2;\n      for (let i = 0; i < n; ++i) {\n        dx = (anchors[i] & 3) - 1;\n        dy = (anchors[i] >>> 2 & 3) - 1;\n        isInside = dx === 0 && dy === 0 || offsets2[i] < 0;\n        sizeFactor = dx && dy ? Math.SQRT1_2 : 1;\n        insideFactor = offsets2[i] < 0 ? -1 : 1;\n        x12 = boundary[1 + dx] + offsets2[i] * dx * sizeFactor;\n        yc = boundary[4 + dy] + insideFactor * textHeight * dy / 2 + offsets2[i] * dy * sizeFactor;\n        y12 = yc - textHeight / 2;\n        y2 = yc + textHeight / 2;\n        _x1 = $2(x12);\n        _y1 = $2(y12);\n        _y2 = $2(y2);\n        if (!textWidth) {\n          if (!test(_x1, _x1, _y1, _y2, bm0, bm1, x12, x12, y12, y2, boundary, isInside)) {\n            continue;\n          } else {\n            textWidth = textMetrics.width(d2.datum, d2.datum.text);\n          }\n        }\n        xc = x12 + insideFactor * textWidth * dx / 2;\n        x12 = xc - textWidth / 2;\n        x2 = xc + textWidth / 2;\n        _x1 = $2(x12);\n        _x2 = $2(x2);\n        if (test(_x1, _x2, _y1, _y2, bm0, bm1, x12, x2, y12, y2, boundary, isInside)) {\n          d2.x = !dx ? xc : dx * insideFactor < 0 ? x2 : x12;\n          d2.y = !dy ? yc : dy * insideFactor < 0 ? y2 : y12;\n          d2.align = Aligns[dx * insideFactor + 1];\n          d2.baseline = Baselines[dy * insideFactor + 1];\n          bm0.setRange(_x1, _y1, _x2, _y2);\n          return true;\n        }\n      }\n      return false;\n    };\n  }\n  function test(_x1, _x2, _y1, _y2, bm0, bm1, x12, x2, y12, y2, boundary, isInside) {\n    return !(bm0.outOfBounds(_x1, _y1, _x2, _y2) || (isInside && bm1 || bm0).getRange(_x1, _y1, _x2, _y2));\n  }\n  const TOP = 0, MIDDLE = 4, BOTTOM = 8, LEFT = 0, CENTER = 1, RIGHT = 2;\n  const anchorCode = {\n    \"top-left\": TOP + LEFT,\n    \"top\": TOP + CENTER,\n    \"top-right\": TOP + RIGHT,\n    \"left\": MIDDLE + LEFT,\n    \"middle\": MIDDLE + CENTER,\n    \"right\": MIDDLE + RIGHT,\n    \"bottom-left\": BOTTOM + LEFT,\n    \"bottom\": BOTTOM + CENTER,\n    \"bottom-right\": BOTTOM + RIGHT\n  };\n  const placeAreaLabel = {\n    \"naive\": placeAreaLabelNaive,\n    \"reduced-search\": placeAreaLabelReducedSearch,\n    \"floodfill\": placeAreaLabelFloodFill\n  };\n  function labelLayout(texts, size, compare2, offset2, anchor, avoidMarks, avoidBaseMark, lineAnchor, markIndex, padding2, method2) {\n    if (!texts.length) return texts;\n    const positions2 = Math.max(offset2.length, anchor.length), offsets2 = getOffsets(offset2, positions2), anchors = getAnchors(anchor, positions2), marktype = markType(texts[0].datum), grouptype = marktype === \"group\" && texts[0].datum.items[markIndex].marktype, isGroupArea = grouptype === \"area\", boundary = markBoundary(marktype, grouptype, lineAnchor, markIndex), infPadding = padding2 === null || padding2 === Infinity, isNaiveGroupArea = isGroupArea && method2 === \"naive\";\n    let maxTextWidth = -1, maxTextHeight = -1;\n    const data2 = texts.map((d2) => {\n      const textWidth = infPadding ? textMetrics.width(d2, d2.text) : void 0;\n      maxTextWidth = Math.max(maxTextWidth, textWidth);\n      maxTextHeight = Math.max(maxTextHeight, d2.fontSize);\n      return {\n        datum: d2,\n        opacity: 0,\n        x: void 0,\n        y: void 0,\n        align: void 0,\n        baseline: void 0,\n        boundary: boundary(d2),\n        textWidth\n      };\n    });\n    padding2 = padding2 === null || padding2 === Infinity ? Math.max(maxTextWidth, maxTextHeight) + Math.max(...offset2) : padding2;\n    const $2 = scaler(size[0], size[1], padding2);\n    let bitmaps;\n    if (!isNaiveGroupArea) {\n      if (compare2) {\n        data2.sort((a2, b2) => compare2(a2.datum, b2.datum));\n      }\n      let labelInside = false;\n      for (let i = 0; i < anchors.length && !labelInside; ++i) {\n        labelInside = anchors[i] === 5 || offsets2[i] < 0;\n      }\n      const baseMark = (marktype && avoidBaseMark || isGroupArea) && texts.map((d2) => d2.datum);\n      bitmaps = avoidMarks.length || baseMark ? markBitmaps($2, baseMark || [], avoidMarks, labelInside, isGroupArea) : baseBitmaps($2, avoidBaseMark && data2);\n    }\n    const place2 = isGroupArea ? placeAreaLabel[method2]($2, bitmaps, avoidBaseMark, markIndex) : placeMarkLabel($2, bitmaps, anchors, offsets2);\n    data2.forEach((d2) => d2.opacity = +place2(d2));\n    return data2;\n  }\n  function getOffsets(_, count2) {\n    const offsets2 = new Float64Array(count2), n = _.length;\n    for (let i = 0; i < n; ++i) offsets2[i] = _[i] || 0;\n    for (let i = n; i < count2; ++i) offsets2[i] = offsets2[n - 1];\n    return offsets2;\n  }\n  function getAnchors(_, count2) {\n    const anchors = new Int8Array(count2), n = _.length;\n    for (let i = 0; i < n; ++i) anchors[i] |= anchorCode[_[i]];\n    for (let i = n; i < count2; ++i) anchors[i] = anchors[n - 1];\n    return anchors;\n  }\n  function markType(item) {\n    return item && item.mark && item.mark.marktype;\n  }\n  function markBoundary(marktype, grouptype, lineAnchor, markIndex) {\n    const xy = (d2) => [d2.x, d2.x, d2.x, d2.y, d2.y, d2.y];\n    if (!marktype) {\n      return xy;\n    } else if (marktype === \"line\" || marktype === \"area\") {\n      return (d2) => xy(d2.datum);\n    } else if (grouptype === \"line\") {\n      return (d2) => {\n        const items = d2.datum.items[markIndex].items;\n        return xy(items.length ? items[lineAnchor === \"start\" ? 0 : items.length - 1] : {\n          x: NaN,\n          y: NaN\n        });\n      };\n    } else {\n      return (d2) => {\n        const b2 = d2.datum.bounds;\n        return [b2.x1, (b2.x1 + b2.x2) / 2, b2.x2, b2.y1, (b2.y1 + b2.y2) / 2, b2.y2];\n      };\n    }\n  }\n  const Output$1 = [\"x\", \"y\", \"opacity\", \"align\", \"baseline\"];\n  const Anchors = [\"top-left\", \"left\", \"bottom-left\", \"top\", \"bottom\", \"top-right\", \"right\", \"bottom-right\"];\n  function Label$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Label$1.Definition = {\n    type: \"Label\",\n    metadata: {\n      modifies: true\n    },\n    params: [{\n      name: \"size\",\n      type: \"number\",\n      array: true,\n      length: 2,\n      required: true\n    }, {\n      name: \"sort\",\n      type: \"compare\"\n    }, {\n      name: \"anchor\",\n      type: \"string\",\n      array: true,\n      default: Anchors\n    }, {\n      name: \"offset\",\n      type: \"number\",\n      array: true,\n      default: [1]\n    }, {\n      name: \"padding\",\n      type: \"number\",\n      default: 0,\n      null: true\n    }, {\n      name: \"lineAnchor\",\n      type: \"string\",\n      values: [\"start\", \"end\"],\n      default: \"end\"\n    }, {\n      name: \"markIndex\",\n      type: \"number\",\n      default: 0\n    }, {\n      name: \"avoidBaseMark\",\n      type: \"boolean\",\n      default: true\n    }, {\n      name: \"avoidMarks\",\n      type: \"data\",\n      array: true\n    }, {\n      name: \"method\",\n      type: \"string\",\n      default: \"naive\"\n    }, {\n      name: \"as\",\n      type: \"string\",\n      array: true,\n      length: Output$1.length,\n      default: Output$1\n    }]\n  };\n  inherits(Label$1, Transform, {\n    transform(_, pulse2) {\n      function modp(param2) {\n        const p = _[param2];\n        return isFunction(p) && pulse2.modified(p.fields);\n      }\n      const mod = _.modified();\n      if (!(mod || pulse2.changed(pulse2.ADD_REM) || modp(\"sort\"))) return;\n      if (!_.size || _.size.length !== 2) {\n        error(\"Size parameter should be specified as a [width, height] array.\");\n      }\n      const as = _.as || Output$1;\n      labelLayout(pulse2.materialize(pulse2.SOURCE).source || [], _.size, _.sort, array$4(_.offset == null ? 1 : _.offset), array$4(_.anchor || Anchors), _.avoidMarks || [], _.avoidBaseMark !== false, _.lineAnchor || \"end\", _.markIndex || 0, _.padding === void 0 ? 0 : _.padding, _.method || \"naive\").forEach((l) => {\n        const t = l.datum;\n        t[as[0]] = l.x;\n        t[as[1]] = l.y;\n        t[as[2]] = l.opacity;\n        t[as[3]] = l.align;\n        t[as[4]] = l.baseline;\n      });\n      return pulse2.reflow(mod).modifies(as);\n    }\n  });\n  const label = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    label: Label$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function partition(data2, groupby) {\n    var groups = [], get2 = function(f) {\n      return f(t);\n    }, map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2);\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    return groups;\n  }\n  function Loess(params2) {\n    Transform.call(this, null, params2);\n  }\n  Loess.Definition = {\n    \"type\": \"Loess\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0.3\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Loess, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition(source2, _.groupby), names = (_.groupby || []).map(accessorName), m2 = names.length, as = _.as || [accessorName(_.x), accessorName(_.y)], values2 = [];\n        groups.forEach((g) => {\n          loess(g, _.x, _.y, _.bandwidth || 0.3).forEach((p) => {\n            const t = {};\n            for (let i = 0; i < m2; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = p[0];\n            t[as[1]] = p[1];\n            values2.push(ingest$1(t));\n          });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  const Methods = {\n    constant: constant$3,\n    linear,\n    log: log$2,\n    exp: exp$1,\n    pow: pow$2,\n    quad,\n    poly\n  };\n  const degreesOfFreedom = (method2, order) => method2 === \"poly\" ? order : method2 === \"quad\" ? 2 : 1;\n  function Regression(params2) {\n    Transform.call(this, null, params2);\n  }\n  Regression.Definition = {\n    \"type\": \"Regression\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"method\",\n      \"type\": \"string\",\n      \"default\": \"linear\",\n      \"values\": Object.keys(Methods)\n    }, {\n      \"name\": \"order\",\n      \"type\": \"number\",\n      \"default\": 3\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"params\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Regression, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition(source2, _.groupby), names = (_.groupby || []).map(accessorName), method2 = _.method || \"linear\", order = _.order == null ? 3 : _.order, dof = degreesOfFreedom(method2, order), as = _.as || [accessorName(_.x), accessorName(_.y)], fit2 = Methods[method2], values2 = [];\n        let domain2 = _.extent;\n        if (!has$1(Methods, method2)) {\n          error(\"Invalid regression method: \" + method2);\n        }\n        if (domain2 != null) {\n          if (method2 === \"log\" && domain2[0] <= 0) {\n            pulse2.dataflow.warn(\"Ignoring extent with values <= 0 for log regression.\");\n            domain2 = null;\n          }\n        }\n        groups.forEach((g) => {\n          const n = g.length;\n          if (n <= dof) {\n            pulse2.dataflow.warn(\"Skipping regression with more parameters than data points.\");\n            return;\n          }\n          const model = fit2(g, _.x, _.y, order);\n          if (_.params) {\n            values2.push(ingest$1({\n              keys: g.dims,\n              coef: model.coef,\n              rSquared: model.rSquared\n            }));\n            return;\n          }\n          const dom = domain2 || extent(g, _.x), add2 = (p) => {\n            const t = {};\n            for (let i = 0; i < names.length; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = p[0];\n            t[as[1]] = p[1];\n            values2.push(ingest$1(t));\n          };\n          if (method2 === \"linear\" || method2 === \"constant\") {\n            dom.forEach((x2) => add2([x2, model.predict(x2)]));\n          } else {\n            sampleCurve(model.predict, dom, 25, 200).forEach(add2);\n          }\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  const reg = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    loess: Loess,\n    regression: Regression\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const epsilon$1 = 11102230246251565e-32;\n  const splitter = 134217729;\n  const resulterrbound = (3 + 8 * epsilon$1) * epsilon$1;\n  function sum(elen, e, flen, f, h2) {\n    let Q, Qnew, hh, bvirt;\n    let enow = e[0];\n    let fnow = f[0];\n    let eindex = 0;\n    let findex = 0;\n    if (fnow > enow === fnow > -enow) {\n      Q = enow;\n      enow = e[++eindex];\n    } else {\n      Q = fnow;\n      fnow = f[++findex];\n    }\n    let hindex = 0;\n    if (eindex < elen && findex < flen) {\n      if (fnow > enow === fnow > -enow) {\n        Qnew = enow + Q;\n        hh = Q - (Qnew - enow);\n        enow = e[++eindex];\n      } else {\n        Qnew = fnow + Q;\n        hh = Q - (Qnew - fnow);\n        fnow = f[++findex];\n      }\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n      while (eindex < elen && findex < flen) {\n        if (fnow > enow === fnow > -enow) {\n          Qnew = Q + enow;\n          bvirt = Qnew - Q;\n          hh = Q - (Qnew - bvirt) + (enow - bvirt);\n          enow = e[++eindex];\n        } else {\n          Qnew = Q + fnow;\n          bvirt = Qnew - Q;\n          hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n          fnow = f[++findex];\n        }\n        Q = Qnew;\n        if (hh !== 0) {\n          h2[hindex++] = hh;\n        }\n      }\n    }\n    while (eindex < elen) {\n      Qnew = Q + enow;\n      bvirt = Qnew - Q;\n      hh = Q - (Qnew - bvirt) + (enow - bvirt);\n      enow = e[++eindex];\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n    }\n    while (findex < flen) {\n      Qnew = Q + fnow;\n      bvirt = Qnew - Q;\n      hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n      fnow = f[++findex];\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n    }\n    if (Q !== 0 || hindex === 0) {\n      h2[hindex++] = Q;\n    }\n    return hindex;\n  }\n  function estimate(elen, e) {\n    let Q = e[0];\n    for (let i = 1; i < elen; i++) Q += e[i];\n    return Q;\n  }\n  function vec(n) {\n    return new Float64Array(n);\n  }\n  const ccwerrboundA = (3 + 16 * epsilon$1) * epsilon$1;\n  const ccwerrboundB = (2 + 12 * epsilon$1) * epsilon$1;\n  const ccwerrboundC = (9 + 64 * epsilon$1) * epsilon$1 * epsilon$1;\n  const B = vec(4);\n  const C1 = vec(8);\n  const C2 = vec(12);\n  const D = vec(16);\n  const u = vec(4);\n  function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n    let acxtail, acytail, bcxtail, bcytail;\n    let bvirt, c2, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t12, t02, u3;\n    const acx = ax - cx;\n    const bcx = bx - cx;\n    const acy = ay - cy;\n    const bcy = by - cy;\n    s1 = acx * bcy;\n    c2 = splitter * acx;\n    ahi = c2 - (c2 - acx);\n    alo = acx - ahi;\n    c2 = splitter * bcy;\n    bhi = c2 - (c2 - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acy * bcx;\n    c2 = splitter * acy;\n    ahi = c2 - (c2 - acy);\n    alo = acy - ahi;\n    c2 = splitter * bcx;\n    bhi = c2 - (c2 - bcx);\n    blo = bcx - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    B[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    B[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    B[3] = u3;\n    let det = estimate(4, B);\n    let errbound = ccwerrboundB * detsum;\n    if (det >= errbound || -det >= errbound) {\n      return det;\n    }\n    bvirt = ax - acx;\n    acxtail = ax - (acx + bvirt) + (bvirt - cx);\n    bvirt = bx - bcx;\n    bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n    bvirt = ay - acy;\n    acytail = ay - (acy + bvirt) + (bvirt - cy);\n    bvirt = by - bcy;\n    bcytail = by - (bcy + bvirt) + (bvirt - cy);\n    if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n      return det;\n    }\n    errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n    det += acx * bcytail + bcy * acxtail - (acy * bcxtail + bcx * acytail);\n    if (det >= errbound || -det >= errbound) return det;\n    s1 = acxtail * bcy;\n    c2 = splitter * acxtail;\n    ahi = c2 - (c2 - acxtail);\n    alo = acxtail - ahi;\n    c2 = splitter * bcy;\n    bhi = c2 - (c2 - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acytail * bcx;\n    c2 = splitter * acytail;\n    ahi = c2 - (c2 - acytail);\n    alo = acytail - ahi;\n    c2 = splitter * bcx;\n    bhi = c2 - (c2 - bcx);\n    blo = bcx - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C1len = sum(4, B, 4, u, C1);\n    s1 = acx * bcytail;\n    c2 = splitter * acx;\n    ahi = c2 - (c2 - acx);\n    alo = acx - ahi;\n    c2 = splitter * bcytail;\n    bhi = c2 - (c2 - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acy * bcxtail;\n    c2 = splitter * acy;\n    ahi = c2 - (c2 - acy);\n    alo = acy - ahi;\n    c2 = splitter * bcxtail;\n    bhi = c2 - (c2 - bcxtail);\n    blo = bcxtail - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C2len = sum(C1len, C1, 4, u, C2);\n    s1 = acxtail * bcytail;\n    c2 = splitter * acxtail;\n    ahi = c2 - (c2 - acxtail);\n    alo = acxtail - ahi;\n    c2 = splitter * bcytail;\n    bhi = c2 - (c2 - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acytail * bcxtail;\n    c2 = splitter * acytail;\n    ahi = c2 - (c2 - acytail);\n    alo = acytail - ahi;\n    c2 = splitter * bcxtail;\n    bhi = c2 - (c2 - bcxtail);\n    blo = bcxtail - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const Dlen = sum(C2len, C2, 4, u, D);\n    return D[Dlen - 1];\n  }\n  function orient2d(ax, ay, bx, by, cx, cy) {\n    const detleft = (ay - cy) * (bx - cx);\n    const detright = (ax - cx) * (by - cy);\n    const det = detleft - detright;\n    const detsum = Math.abs(detleft + detright);\n    if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n    return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n  }\n  const EPSILON = Math.pow(2, -52);\n  const EDGE_STACK = new Uint32Array(512);\n  class Delaunator {\n    static from(points2, getX = defaultGetX, getY = defaultGetY) {\n      const n = points2.length;\n      const coords = new Float64Array(n * 2);\n      for (let i = 0; i < n; i++) {\n        const p = points2[i];\n        coords[2 * i] = getX(p);\n        coords[2 * i + 1] = getY(p);\n      }\n      return new Delaunator(coords);\n    }\n    constructor(coords) {\n      const n = coords.length >> 1;\n      if (n > 0 && typeof coords[0] !== \"number\") throw new Error(\"Expected coords to contain numbers.\");\n      this.coords = coords;\n      const maxTriangles = Math.max(2 * n - 5, 0);\n      this._triangles = new Uint32Array(maxTriangles * 3);\n      this._halfedges = new Int32Array(maxTriangles * 3);\n      this._hashSize = Math.ceil(Math.sqrt(n));\n      this._hullPrev = new Uint32Array(n);\n      this._hullNext = new Uint32Array(n);\n      this._hullTri = new Uint32Array(n);\n      this._hullHash = new Int32Array(this._hashSize);\n      this._ids = new Uint32Array(n);\n      this._dists = new Float64Array(n);\n      this.update();\n    }\n    update() {\n      const { coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash } = this;\n      const n = coords.length >> 1;\n      let minX = Infinity;\n      let minY = Infinity;\n      let maxX = -Infinity;\n      let maxY2 = -Infinity;\n      for (let i = 0; i < n; i++) {\n        const x2 = coords[2 * i];\n        const y2 = coords[2 * i + 1];\n        if (x2 < minX) minX = x2;\n        if (y2 < minY) minY = y2;\n        if (x2 > maxX) maxX = x2;\n        if (y2 > maxY2) maxY2 = y2;\n        this._ids[i] = i;\n      }\n      const cx = (minX + maxX) / 2;\n      const cy = (minY + maxY2) / 2;\n      let i0, i1, i2;\n      for (let i = 0, minDist = Infinity; i < n; i++) {\n        const d2 = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);\n        if (d2 < minDist) {\n          i0 = i;\n          minDist = d2;\n        }\n      }\n      const i0x = coords[2 * i0];\n      const i0y = coords[2 * i0 + 1];\n      for (let i = 0, minDist = Infinity; i < n; i++) {\n        if (i === i0) continue;\n        const d2 = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);\n        if (d2 < minDist && d2 > 0) {\n          i1 = i;\n          minDist = d2;\n        }\n      }\n      let i1x = coords[2 * i1];\n      let i1y = coords[2 * i1 + 1];\n      let minRadius = Infinity;\n      for (let i = 0; i < n; i++) {\n        if (i === i0 || i === i1) continue;\n        const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);\n        if (r < minRadius) {\n          i2 = i;\n          minRadius = r;\n        }\n      }\n      let i2x = coords[2 * i2];\n      let i2y = coords[2 * i2 + 1];\n      if (minRadius === Infinity) {\n        for (let i = 0; i < n; i++) {\n          this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];\n        }\n        quicksort(this._ids, this._dists, 0, n - 1);\n        const hull = new Uint32Array(n);\n        let j = 0;\n        for (let i = 0, d0 = -Infinity; i < n; i++) {\n          const id2 = this._ids[i];\n          const d2 = this._dists[id2];\n          if (d2 > d0) {\n            hull[j++] = id2;\n            d0 = d2;\n          }\n        }\n        this.hull = hull.subarray(0, j);\n        this.triangles = new Uint32Array(0);\n        this.halfedges = new Uint32Array(0);\n        return;\n      }\n      if (orient2d(i0x, i0y, i1x, i1y, i2x, i2y) < 0) {\n        const i = i1;\n        const x2 = i1x;\n        const y2 = i1y;\n        i1 = i2;\n        i1x = i2x;\n        i1y = i2y;\n        i2 = i;\n        i2x = x2;\n        i2y = y2;\n      }\n      const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n      this._cx = center.x;\n      this._cy = center.y;\n      for (let i = 0; i < n; i++) {\n        this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);\n      }\n      quicksort(this._ids, this._dists, 0, n - 1);\n      this._hullStart = i0;\n      let hullSize = 3;\n      hullNext[i0] = hullPrev[i2] = i1;\n      hullNext[i1] = hullPrev[i0] = i2;\n      hullNext[i2] = hullPrev[i1] = i0;\n      hullTri[i0] = 0;\n      hullTri[i1] = 1;\n      hullTri[i2] = 2;\n      hullHash.fill(-1);\n      hullHash[this._hashKey(i0x, i0y)] = i0;\n      hullHash[this._hashKey(i1x, i1y)] = i1;\n      hullHash[this._hashKey(i2x, i2y)] = i2;\n      this.trianglesLen = 0;\n      this._addTriangle(i0, i1, i2, -1, -1, -1);\n      for (let k = 0, xp, yp; k < this._ids.length; k++) {\n        const i = this._ids[k];\n        const x2 = coords[2 * i];\n        const y2 = coords[2 * i + 1];\n        if (k > 0 && Math.abs(x2 - xp) <= EPSILON && Math.abs(y2 - yp) <= EPSILON) continue;\n        xp = x2;\n        yp = y2;\n        if (i === i0 || i === i1 || i === i2) continue;\n        let start = 0;\n        for (let j = 0, key2 = this._hashKey(x2, y2); j < this._hashSize; j++) {\n          start = hullHash[(key2 + j) % this._hashSize];\n          if (start !== -1 && start !== hullNext[start]) break;\n        }\n        start = hullPrev[start];\n        let e = start, q;\n        while (q = hullNext[e], orient2d(x2, y2, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]) >= 0) {\n          e = q;\n          if (e === start) {\n            e = -1;\n            break;\n          }\n        }\n        if (e === -1) continue;\n        let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n        hullTri[i] = this._legalize(t + 2);\n        hullTri[e] = t;\n        hullSize++;\n        let n2 = hullNext[e];\n        while (q = hullNext[n2], orient2d(x2, y2, coords[2 * n2], coords[2 * n2 + 1], coords[2 * q], coords[2 * q + 1]) < 0) {\n          t = this._addTriangle(n2, i, q, hullTri[i], -1, hullTri[n2]);\n          hullTri[i] = this._legalize(t + 2);\n          hullNext[n2] = n2;\n          hullSize--;\n          n2 = q;\n        }\n        if (e === start) {\n          while (q = hullPrev[e], orient2d(x2, y2, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]) < 0) {\n            t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n            this._legalize(t + 2);\n            hullTri[q] = t;\n            hullNext[e] = e;\n            hullSize--;\n            e = q;\n          }\n        }\n        this._hullStart = hullPrev[i] = e;\n        hullNext[e] = hullPrev[n2] = i;\n        hullNext[i] = n2;\n        hullHash[this._hashKey(x2, y2)] = i;\n        hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n      }\n      this.hull = new Uint32Array(hullSize);\n      for (let i = 0, e = this._hullStart; i < hullSize; i++) {\n        this.hull[i] = e;\n        e = hullNext[e];\n      }\n      this.triangles = this._triangles.subarray(0, this.trianglesLen);\n      this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n    }\n    _hashKey(x2, y2) {\n      return Math.floor(pseudoAngle(x2 - this._cx, y2 - this._cy) * this._hashSize) % this._hashSize;\n    }\n    _legalize(a2) {\n      const { _triangles: triangles, _halfedges: halfedges, coords } = this;\n      let i = 0;\n      let ar = 0;\n      while (true) {\n        const b2 = halfedges[a2];\n        const a0 = a2 - a2 % 3;\n        ar = a0 + (a2 + 2) % 3;\n        if (b2 === -1) {\n          if (i === 0) break;\n          a2 = EDGE_STACK[--i];\n          continue;\n        }\n        const b0 = b2 - b2 % 3;\n        const al = a0 + (a2 + 1) % 3;\n        const bl2 = b0 + (b2 + 2) % 3;\n        const p02 = triangles[ar];\n        const pr = triangles[a2];\n        const pl = triangles[al];\n        const p1 = triangles[bl2];\n        const illegal = inCircle(\n          coords[2 * p02],\n          coords[2 * p02 + 1],\n          coords[2 * pr],\n          coords[2 * pr + 1],\n          coords[2 * pl],\n          coords[2 * pl + 1],\n          coords[2 * p1],\n          coords[2 * p1 + 1]\n        );\n        if (illegal) {\n          triangles[a2] = p1;\n          triangles[b2] = p02;\n          const hbl = halfedges[bl2];\n          if (hbl === -1) {\n            let e = this._hullStart;\n            do {\n              if (this._hullTri[e] === bl2) {\n                this._hullTri[e] = a2;\n                break;\n              }\n              e = this._hullPrev[e];\n            } while (e !== this._hullStart);\n          }\n          this._link(a2, hbl);\n          this._link(b2, halfedges[ar]);\n          this._link(ar, bl2);\n          const br2 = b0 + (b2 + 1) % 3;\n          if (i < EDGE_STACK.length) {\n            EDGE_STACK[i++] = br2;\n          }\n        } else {\n          if (i === 0) break;\n          a2 = EDGE_STACK[--i];\n        }\n      }\n      return ar;\n    }\n    _link(a2, b2) {\n      this._halfedges[a2] = b2;\n      if (b2 !== -1) this._halfedges[b2] = a2;\n    }\n    // add a new triangle given vertex indices and adjacent half-edge ids\n    _addTriangle(i0, i1, i2, a2, b2, c2) {\n      const t = this.trianglesLen;\n      this._triangles[t] = i0;\n      this._triangles[t + 1] = i1;\n      this._triangles[t + 2] = i2;\n      this._link(t, a2);\n      this._link(t + 1, b2);\n      this._link(t + 2, c2);\n      this.trianglesLen += 3;\n      return t;\n    }\n  }\n  function pseudoAngle(dx, dy) {\n    const p = dx / (Math.abs(dx) + Math.abs(dy));\n    return (dy > 0 ? 3 - p : 1 + p) / 4;\n  }\n  function dist(ax, ay, bx, by) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return dx * dx + dy * dy;\n  }\n  function inCircle(ax, ay, bx, by, cx, cy, px2, py2) {\n    const dx = ax - px2;\n    const dy = ay - py2;\n    const ex = bx - px2;\n    const ey = by - py2;\n    const fx = cx - px2;\n    const fy = cy - py2;\n    const ap = dx * dx + dy * dy;\n    const bp = ex * ex + ey * ey;\n    const cp = fx * fx + fy * fy;\n    return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n  }\n  function circumradius(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl2 = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d2 = 0.5 / (dx * ey - dy * ex);\n    const x2 = (ey * bl2 - dy * cl) * d2;\n    const y2 = (dx * cl - ex * bl2) * d2;\n    return x2 * x2 + y2 * y2;\n  }\n  function circumcenter(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl2 = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d2 = 0.5 / (dx * ey - dy * ex);\n    const x2 = ax + (ey * bl2 - dy * cl) * d2;\n    const y2 = ay + (dx * cl - ex * bl2) * d2;\n    return { x: x2, y: y2 };\n  }\n  function quicksort(ids, dists, left, right) {\n    if (right - left <= 20) {\n      for (let i = left + 1; i <= right; i++) {\n        const temp2 = ids[i];\n        const tempDist = dists[temp2];\n        let j = i - 1;\n        while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--];\n        ids[j + 1] = temp2;\n      }\n    } else {\n      const median2 = left + right >> 1;\n      let i = left + 1;\n      let j = right;\n      swap(ids, median2, i);\n      if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n      if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n      if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n      const temp2 = ids[i];\n      const tempDist = dists[temp2];\n      while (true) {\n        do\n          i++;\n        while (dists[ids[i]] < tempDist);\n        do\n          j--;\n        while (dists[ids[j]] > tempDist);\n        if (j < i) break;\n        swap(ids, i, j);\n      }\n      ids[left + 1] = ids[j];\n      ids[j] = temp2;\n      if (right - i + 1 >= j - left) {\n        quicksort(ids, dists, i, right);\n        quicksort(ids, dists, left, j - 1);\n      } else {\n        quicksort(ids, dists, left, j - 1);\n        quicksort(ids, dists, i, right);\n      }\n    }\n  }\n  function swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n  }\n  function defaultGetX(p) {\n    return p[0];\n  }\n  function defaultGetY(p) {\n    return p[1];\n  }\n  const epsilon = 1e-6;\n  class Path {\n    constructor() {\n      this._x0 = this._y0 = // start of current subpath\n      this._x1 = this._y1 = null;\n      this._ = \"\";\n    }\n    moveTo(x2, y2) {\n      this._ += `M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;\n    }\n    closePath() {\n      if (this._x1 !== null) {\n        this._x1 = this._x0, this._y1 = this._y0;\n        this._ += \"Z\";\n      }\n    }\n    lineTo(x2, y2) {\n      this._ += `L${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    arc(x2, y2, r) {\n      x2 = +x2, y2 = +y2, r = +r;\n      const x02 = x2 + r;\n      const y02 = y2;\n      if (r < 0) throw new Error(\"negative radius\");\n      if (this._x1 === null) this._ += `M${x02},${y02}`;\n      else if (Math.abs(this._x1 - x02) > epsilon || Math.abs(this._y1 - y02) > epsilon) this._ += \"L\" + x02 + \",\" + y02;\n      if (!r) return;\n      this._ += `A${r},${r},0,1,1,${x2 - r},${y2}A${r},${r},0,1,1,${this._x1 = x02},${this._y1 = y02}`;\n    }\n    rect(x2, y2, w2, h2) {\n      this._ += `M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${+w2}v${+h2}h${-w2}Z`;\n    }\n    value() {\n      return this._ || null;\n    }\n  }\n  class Polygon {\n    constructor() {\n      this._ = [];\n    }\n    moveTo(x2, y2) {\n      this._.push([x2, y2]);\n    }\n    closePath() {\n      this._.push(this._[0].slice());\n    }\n    lineTo(x2, y2) {\n      this._.push([x2, y2]);\n    }\n    value() {\n      return this._.length ? this._ : null;\n    }\n  }\n  let Voronoi$1 = class Voronoi {\n    constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) {\n      if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error(\"invalid bounds\");\n      this.delaunay = delaunay;\n      this._circumcenters = new Float64Array(delaunay.points.length * 2);\n      this.vectors = new Float64Array(delaunay.points.length * 2);\n      this.xmax = xmax, this.xmin = xmin;\n      this.ymax = ymax, this.ymin = ymin;\n      this._init();\n    }\n    update() {\n      this.delaunay.update();\n      this._init();\n      return this;\n    }\n    _init() {\n      const { delaunay: { points: points2, hull, triangles }, vectors } = this;\n      let bx, by;\n      const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);\n      for (let i = 0, j = 0, n = triangles.length, x2, y2; i < n; i += 3, j += 2) {\n        const t12 = triangles[i] * 2;\n        const t22 = triangles[i + 1] * 2;\n        const t32 = triangles[i + 2] * 2;\n        const x13 = points2[t12];\n        const y13 = points2[t12 + 1];\n        const x22 = points2[t22];\n        const y22 = points2[t22 + 1];\n        const x3 = points2[t32];\n        const y3 = points2[t32 + 1];\n        const dx = x22 - x13;\n        const dy = y22 - y13;\n        const ex = x3 - x13;\n        const ey = y3 - y13;\n        const ab = (dx * ey - dy * ex) * 2;\n        if (Math.abs(ab) < 1e-9) {\n          if (bx === void 0) {\n            bx = by = 0;\n            for (const i2 of hull) bx += points2[i2 * 2], by += points2[i2 * 2 + 1];\n            bx /= hull.length, by /= hull.length;\n          }\n          const a2 = 1e9 * Math.sign((bx - x13) * ey - (by - y13) * ex);\n          x2 = (x13 + x3) / 2 - a2 * ey;\n          y2 = (y13 + y3) / 2 + a2 * ex;\n        } else {\n          const d2 = 1 / ab;\n          const bl2 = dx * dx + dy * dy;\n          const cl = ex * ex + ey * ey;\n          x2 = x13 + (ey * bl2 - dy * cl) * d2;\n          y2 = y13 + (dx * cl - ex * bl2) * d2;\n        }\n        circumcenters[j] = x2;\n        circumcenters[j + 1] = y2;\n      }\n      let h2 = hull[hull.length - 1];\n      let p02, p1 = h2 * 4;\n      let x02, x12 = points2[2 * h2];\n      let y02, y12 = points2[2 * h2 + 1];\n      vectors.fill(0);\n      for (let i = 0; i < hull.length; ++i) {\n        h2 = hull[i];\n        p02 = p1, x02 = x12, y02 = y12;\n        p1 = h2 * 4, x12 = points2[2 * h2], y12 = points2[2 * h2 + 1];\n        vectors[p02 + 2] = vectors[p1] = y02 - y12;\n        vectors[p02 + 3] = vectors[p1 + 1] = x12 - x02;\n      }\n    }\n    render(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { delaunay: { halfedges, inedges, hull }, circumcenters, vectors } = this;\n      if (hull.length <= 1) return null;\n      for (let i = 0, n = halfedges.length; i < n; ++i) {\n        const j = halfedges[i];\n        if (j < i) continue;\n        const ti = Math.floor(i / 3) * 2;\n        const tj = Math.floor(j / 3) * 2;\n        const xi = circumcenters[ti];\n        const yi = circumcenters[ti + 1];\n        const xj = circumcenters[tj];\n        const yj = circumcenters[tj + 1];\n        this._renderSegment(xi, yi, xj, yj, context2);\n      }\n      let h0, h1 = hull[hull.length - 1];\n      for (let i = 0; i < hull.length; ++i) {\n        h0 = h1, h1 = hull[i];\n        const t = Math.floor(inedges[h1] / 3) * 2;\n        const x2 = circumcenters[t];\n        const y2 = circumcenters[t + 1];\n        const v = h0 * 4;\n        const p = this._project(x2, y2, vectors[v + 2], vectors[v + 3]);\n        if (p) this._renderSegment(x2, y2, p[0], p[1], context2);\n      }\n      return buffer && buffer.value();\n    }\n    renderBounds(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      context2.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin);\n      return buffer && buffer.value();\n    }\n    renderCell(i, context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const points2 = this._clip(i);\n      if (points2 === null || !points2.length) return;\n      context2.moveTo(points2[0], points2[1]);\n      let n = points2.length;\n      while (points2[0] === points2[n - 2] && points2[1] === points2[n - 1] && n > 1) n -= 2;\n      for (let i2 = 2; i2 < n; i2 += 2) {\n        if (points2[i2] !== points2[i2 - 2] || points2[i2 + 1] !== points2[i2 - 1])\n          context2.lineTo(points2[i2], points2[i2 + 1]);\n      }\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    *cellPolygons() {\n      const { delaunay: { points: points2 } } = this;\n      for (let i = 0, n = points2.length / 2; i < n; ++i) {\n        const cell2 = this.cellPolygon(i);\n        if (cell2) cell2.index = i, yield cell2;\n      }\n    }\n    cellPolygon(i) {\n      const polygon = new Polygon();\n      this.renderCell(i, polygon);\n      return polygon.value();\n    }\n    _renderSegment(x02, y02, x12, y12, context2) {\n      let S;\n      const c0 = this._regioncode(x02, y02);\n      const c1 = this._regioncode(x12, y12);\n      if (c0 === 0 && c1 === 0) {\n        context2.moveTo(x02, y02);\n        context2.lineTo(x12, y12);\n      } else if (S = this._clipSegment(x02, y02, x12, y12, c0, c1)) {\n        context2.moveTo(S[0], S[1]);\n        context2.lineTo(S[2], S[3]);\n      }\n    }\n    contains(i, x2, y2) {\n      if ((x2 = +x2, x2 !== x2) || (y2 = +y2, y2 !== y2)) return false;\n      return this.delaunay._step(i, x2, y2) === i;\n    }\n    *neighbors(i) {\n      const ci = this._clip(i);\n      if (ci) for (const j of this.delaunay.neighbors(i)) {\n        const cj = this._clip(j);\n        if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) {\n          for (let aj = 0, lj = cj.length; aj < lj; aj += 2) {\n            if (ci[ai] === cj[aj] && ci[ai + 1] === cj[aj + 1] && ci[(ai + 2) % li] === cj[(aj + lj - 2) % lj] && ci[(ai + 3) % li] === cj[(aj + lj - 1) % lj]) {\n              yield j;\n              break loop;\n            }\n          }\n        }\n      }\n    }\n    _cell(i) {\n      const { circumcenters, delaunay: { inedges, halfedges, triangles } } = this;\n      const e0 = inedges[i];\n      if (e0 === -1) return null;\n      const points2 = [];\n      let e = e0;\n      do {\n        const t = Math.floor(e / 3);\n        points2.push(circumcenters[t * 2], circumcenters[t * 2 + 1]);\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) break;\n        e = halfedges[e];\n      } while (e !== e0 && e !== -1);\n      return points2;\n    }\n    _clip(i) {\n      if (i === 0 && this.delaunay.hull.length === 1) {\n        return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n      }\n      const points2 = this._cell(i);\n      if (points2 === null) return null;\n      const { vectors: V } = this;\n      const v = i * 4;\n      return this._simplify(V[v] || V[v + 1] ? this._clipInfinite(i, points2, V[v], V[v + 1], V[v + 2], V[v + 3]) : this._clipFinite(i, points2));\n    }\n    _clipFinite(i, points2) {\n      const n = points2.length;\n      let P = null;\n      let x02, y02, x12 = points2[n - 2], y12 = points2[n - 1];\n      let c0, c1 = this._regioncode(x12, y12);\n      let e0, e1 = 0;\n      for (let j = 0; j < n; j += 2) {\n        x02 = x12, y02 = y12, x12 = points2[j], y12 = points2[j + 1];\n        c0 = c1, c1 = this._regioncode(x12, y12);\n        if (c0 === 0 && c1 === 0) {\n          e0 = e1, e1 = 0;\n          if (P) P.push(x12, y12);\n          else P = [x12, y12];\n        } else {\n          let S, sx0, sy0, sx1, sy1;\n          if (c0 === 0) {\n            if ((S = this._clipSegment(x02, y02, x12, y12, c0, c1)) === null) continue;\n            [sx0, sy0, sx1, sy1] = S;\n          } else {\n            if ((S = this._clipSegment(x12, y12, x02, y02, c1, c0)) === null) continue;\n            [sx1, sy1, sx0, sy0] = S;\n            e0 = e1, e1 = this._edgecode(sx0, sy0);\n            if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n            if (P) P.push(sx0, sy0);\n            else P = [sx0, sy0];\n          }\n          e0 = e1, e1 = this._edgecode(sx1, sy1);\n          if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n          if (P) P.push(sx1, sy1);\n          else P = [sx1, sy1];\n        }\n      }\n      if (P) {\n        e0 = e1, e1 = this._edgecode(P[0], P[1]);\n        if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n      } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n        return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n      }\n      return P;\n    }\n    _clipSegment(x02, y02, x12, y12, c0, c1) {\n      const flip2 = c0 < c1;\n      if (flip2) [x02, y02, x12, y12, c0, c1] = [x12, y12, x02, y02, c1, c0];\n      while (true) {\n        if (c0 === 0 && c1 === 0) return flip2 ? [x12, y12, x02, y02] : [x02, y02, x12, y12];\n        if (c0 & c1) return null;\n        let x2, y2, c2 = c0 || c1;\n        if (c2 & 8) x2 = x02 + (x12 - x02) * (this.ymax - y02) / (y12 - y02), y2 = this.ymax;\n        else if (c2 & 4) x2 = x02 + (x12 - x02) * (this.ymin - y02) / (y12 - y02), y2 = this.ymin;\n        else if (c2 & 2) y2 = y02 + (y12 - y02) * (this.xmax - x02) / (x12 - x02), x2 = this.xmax;\n        else y2 = y02 + (y12 - y02) * (this.xmin - x02) / (x12 - x02), x2 = this.xmin;\n        if (c0) x02 = x2, y02 = y2, c0 = this._regioncode(x02, y02);\n        else x12 = x2, y12 = y2, c1 = this._regioncode(x12, y12);\n      }\n    }\n    _clipInfinite(i, points2, vx0, vy0, vxn, vyn) {\n      let P = Array.from(points2), p;\n      if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]);\n      if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]);\n      if (P = this._clipFinite(i, P)) {\n        for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) {\n          c0 = c1, c1 = this._edgecode(P[j], P[j + 1]);\n          if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length;\n        }\n      } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n        P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax];\n      }\n      return P;\n    }\n    _edge(i, e0, e1, P, j) {\n      while (e0 !== e1) {\n        let x2, y2;\n        switch (e0) {\n          case 5:\n            e0 = 4;\n            continue;\n          // top-left\n          case 4:\n            e0 = 6, x2 = this.xmax, y2 = this.ymin;\n            break;\n          // top\n          case 6:\n            e0 = 2;\n            continue;\n          // top-right\n          case 2:\n            e0 = 10, x2 = this.xmax, y2 = this.ymax;\n            break;\n          // right\n          case 10:\n            e0 = 8;\n            continue;\n          // bottom-right\n          case 8:\n            e0 = 9, x2 = this.xmin, y2 = this.ymax;\n            break;\n          // bottom\n          case 9:\n            e0 = 1;\n            continue;\n          // bottom-left\n          case 1:\n            e0 = 5, x2 = this.xmin, y2 = this.ymin;\n            break;\n        }\n        if ((P[j] !== x2 || P[j + 1] !== y2) && this.contains(i, x2, y2)) {\n          P.splice(j, 0, x2, y2), j += 2;\n        }\n      }\n      return j;\n    }\n    _project(x02, y02, vx, vy) {\n      let t = Infinity, c2, x2, y2;\n      if (vy < 0) {\n        if (y02 <= this.ymin) return null;\n        if ((c2 = (this.ymin - y02) / vy) < t) y2 = this.ymin, x2 = x02 + (t = c2) * vx;\n      } else if (vy > 0) {\n        if (y02 >= this.ymax) return null;\n        if ((c2 = (this.ymax - y02) / vy) < t) y2 = this.ymax, x2 = x02 + (t = c2) * vx;\n      }\n      if (vx > 0) {\n        if (x02 >= this.xmax) return null;\n        if ((c2 = (this.xmax - x02) / vx) < t) x2 = this.xmax, y2 = y02 + (t = c2) * vy;\n      } else if (vx < 0) {\n        if (x02 <= this.xmin) return null;\n        if ((c2 = (this.xmin - x02) / vx) < t) x2 = this.xmin, y2 = y02 + (t = c2) * vy;\n      }\n      return [x2, y2];\n    }\n    _edgecode(x2, y2) {\n      return (x2 === this.xmin ? 1 : x2 === this.xmax ? 2 : 0) | (y2 === this.ymin ? 4 : y2 === this.ymax ? 8 : 0);\n    }\n    _regioncode(x2, y2) {\n      return (x2 < this.xmin ? 1 : x2 > this.xmax ? 2 : 0) | (y2 < this.ymin ? 4 : y2 > this.ymax ? 8 : 0);\n    }\n    _simplify(P) {\n      if (P && P.length > 4) {\n        for (let i = 0; i < P.length; i += 2) {\n          const j = (i + 2) % P.length, k = (i + 4) % P.length;\n          if (P[i] === P[j] && P[j] === P[k] || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) {\n            P.splice(j, 2), i -= 2;\n          }\n        }\n        if (!P.length) P = null;\n      }\n      return P;\n    }\n  };\n  const tau = 2 * Math.PI, pow = Math.pow;\n  function pointX(p) {\n    return p[0];\n  }\n  function pointY(p) {\n    return p[1];\n  }\n  function collinear(d2) {\n    const { triangles, coords } = d2;\n    for (let i = 0; i < triangles.length; i += 3) {\n      const a2 = 2 * triangles[i], b2 = 2 * triangles[i + 1], c2 = 2 * triangles[i + 2], cross2 = (coords[c2] - coords[a2]) * (coords[b2 + 1] - coords[a2 + 1]) - (coords[b2] - coords[a2]) * (coords[c2 + 1] - coords[a2 + 1]);\n      if (cross2 > 1e-10) return false;\n    }\n    return true;\n  }\n  function jitter(x2, y2, r) {\n    return [x2 + Math.sin(x2 + y2) * r, y2 + Math.cos(x2 - y2) * r];\n  }\n  class Delaunay {\n    static from(points2, fx = pointX, fy = pointY, that) {\n      return new Delaunay(\"length\" in points2 ? flatArray(points2, fx, fy, that) : Float64Array.from(flatIterable(points2, fx, fy, that)));\n    }\n    constructor(points2) {\n      this._delaunator = new Delaunator(points2);\n      this.inedges = new Int32Array(points2.length / 2);\n      this._hullIndex = new Int32Array(points2.length / 2);\n      this.points = this._delaunator.coords;\n      this._init();\n    }\n    update() {\n      this._delaunator.update();\n      this._init();\n      return this;\n    }\n    _init() {\n      const d2 = this._delaunator, points2 = this.points;\n      if (d2.hull && d2.hull.length > 2 && collinear(d2)) {\n        this.collinear = Int32Array.from({ length: points2.length / 2 }, (_, i) => i).sort((i, j) => points2[2 * i] - points2[2 * j] || points2[2 * i + 1] - points2[2 * j + 1]);\n        const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds2 = [points2[2 * e], points2[2 * e + 1], points2[2 * f], points2[2 * f + 1]], r = 1e-8 * Math.hypot(bounds2[3] - bounds2[1], bounds2[2] - bounds2[0]);\n        for (let i = 0, n = points2.length / 2; i < n; ++i) {\n          const p = jitter(points2[2 * i], points2[2 * i + 1], r);\n          points2[2 * i] = p[0];\n          points2[2 * i + 1] = p[1];\n        }\n        this._delaunator = new Delaunator(points2);\n      } else {\n        delete this.collinear;\n      }\n      const halfedges = this.halfedges = this._delaunator.halfedges;\n      const hull = this.hull = this._delaunator.hull;\n      const triangles = this.triangles = this._delaunator.triangles;\n      const inedges = this.inedges.fill(-1);\n      const hullIndex = this._hullIndex.fill(-1);\n      for (let e = 0, n = halfedges.length; e < n; ++e) {\n        const p = triangles[e % 3 === 2 ? e - 2 : e + 1];\n        if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e;\n      }\n      for (let i = 0, n = hull.length; i < n; ++i) {\n        hullIndex[hull[i]] = i;\n      }\n      if (hull.length <= 2 && hull.length > 0) {\n        this.triangles = new Int32Array(3).fill(-1);\n        this.halfedges = new Int32Array(3).fill(-1);\n        this.triangles[0] = hull[0];\n        inedges[hull[0]] = 1;\n        if (hull.length === 2) {\n          inedges[hull[1]] = 0;\n          this.triangles[1] = hull[1];\n          this.triangles[2] = hull[1];\n        }\n      }\n    }\n    voronoi(bounds2) {\n      return new Voronoi$1(this, bounds2);\n    }\n    *neighbors(i) {\n      const { inedges, hull, _hullIndex, halfedges, triangles, collinear: collinear2 } = this;\n      if (collinear2) {\n        const l = collinear2.indexOf(i);\n        if (l > 0) yield collinear2[l - 1];\n        if (l < collinear2.length - 1) yield collinear2[l + 1];\n        return;\n      }\n      const e0 = inedges[i];\n      if (e0 === -1) return;\n      let e = e0, p02 = -1;\n      do {\n        yield p02 = triangles[e];\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) return;\n        e = halfedges[e];\n        if (e === -1) {\n          const p = hull[(_hullIndex[i] + 1) % hull.length];\n          if (p !== p02) yield p;\n          return;\n        }\n      } while (e !== e0);\n    }\n    find(x2, y2, i = 0) {\n      if ((x2 = +x2, x2 !== x2) || (y2 = +y2, y2 !== y2)) return -1;\n      const i0 = i;\n      let c2;\n      while ((c2 = this._step(i, x2, y2)) >= 0 && c2 !== i && c2 !== i0) i = c2;\n      return c2;\n    }\n    _step(i, x2, y2) {\n      const { inedges, hull, _hullIndex, halfedges, triangles, points: points2 } = this;\n      if (inedges[i] === -1 || !points2.length) return (i + 1) % (points2.length >> 1);\n      let c2 = i;\n      let dc = pow(x2 - points2[i * 2], 2) + pow(y2 - points2[i * 2 + 1], 2);\n      const e0 = inedges[i];\n      let e = e0;\n      do {\n        let t = triangles[e];\n        const dt = pow(x2 - points2[t * 2], 2) + pow(y2 - points2[t * 2 + 1], 2);\n        if (dt < dc) dc = dt, c2 = t;\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) break;\n        e = halfedges[e];\n        if (e === -1) {\n          e = hull[(_hullIndex[i] + 1) % hull.length];\n          if (e !== t) {\n            if (pow(x2 - points2[e * 2], 2) + pow(y2 - points2[e * 2 + 1], 2) < dc) return e;\n          }\n          break;\n        }\n      } while (e !== e0);\n      return c2;\n    }\n    render(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2, halfedges, triangles } = this;\n      for (let i = 0, n = halfedges.length; i < n; ++i) {\n        const j = halfedges[i];\n        if (j < i) continue;\n        const ti = triangles[i] * 2;\n        const tj = triangles[j] * 2;\n        context2.moveTo(points2[ti], points2[ti + 1]);\n        context2.lineTo(points2[tj], points2[tj + 1]);\n      }\n      this.renderHull(context2);\n      return buffer && buffer.value();\n    }\n    renderPoints(context2, r) {\n      if (r === void 0 && (!context2 || typeof context2.moveTo !== \"function\")) r = context2, context2 = null;\n      r = r == void 0 ? 2 : +r;\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2 } = this;\n      for (let i = 0, n = points2.length; i < n; i += 2) {\n        const x2 = points2[i], y2 = points2[i + 1];\n        context2.moveTo(x2 + r, y2);\n        context2.arc(x2, y2, r, 0, tau);\n      }\n      return buffer && buffer.value();\n    }\n    renderHull(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { hull, points: points2 } = this;\n      const h2 = hull[0] * 2, n = hull.length;\n      context2.moveTo(points2[h2], points2[h2 + 1]);\n      for (let i = 1; i < n; ++i) {\n        const h3 = 2 * hull[i];\n        context2.lineTo(points2[h3], points2[h3 + 1]);\n      }\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    hullPolygon() {\n      const polygon = new Polygon();\n      this.renderHull(polygon);\n      return polygon.value();\n    }\n    renderTriangle(i, context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2, triangles } = this;\n      const t02 = triangles[i *= 3] * 2;\n      const t12 = triangles[i + 1] * 2;\n      const t22 = triangles[i + 2] * 2;\n      context2.moveTo(points2[t02], points2[t02 + 1]);\n      context2.lineTo(points2[t12], points2[t12 + 1]);\n      context2.lineTo(points2[t22], points2[t22 + 1]);\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    *trianglePolygons() {\n      const { triangles } = this;\n      for (let i = 0, n = triangles.length / 3; i < n; ++i) {\n        yield this.trianglePolygon(i);\n      }\n    }\n    trianglePolygon(i) {\n      const polygon = new Polygon();\n      this.renderTriangle(i, polygon);\n      return polygon.value();\n    }\n  }\n  function flatArray(points2, fx, fy, that) {\n    const n = points2.length;\n    const array2 = new Float64Array(n * 2);\n    for (let i = 0; i < n; ++i) {\n      const p = points2[i];\n      array2[i * 2] = fx.call(that, p, i, points2);\n      array2[i * 2 + 1] = fy.call(that, p, i, points2);\n    }\n    return array2;\n  }\n  function* flatIterable(points2, fx, fy, that) {\n    let i = 0;\n    for (const p of points2) {\n      yield fx.call(that, p, i, points2);\n      yield fy.call(that, p, i, points2);\n      ++i;\n    }\n  }\n  function Voronoi(params2) {\n    Transform.call(this, null, params2);\n  }\n  Voronoi.Definition = {\n    \"type\": \"Voronoi\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [[-1e5, -1e5], [1e5, 1e5]],\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  const defaultExtent = [-1e5, -1e5, 1e5, 1e5];\n  inherits(Voronoi, Transform, {\n    transform(_, pulse2) {\n      const as = _.as || \"path\", data2 = pulse2.source;\n      if (!data2 || !data2.length) return pulse2;\n      let s2 = _.size;\n      s2 = s2 ? [0, 0, s2[0], s2[1]] : (s2 = _.extent) ? [s2[0][0], s2[0][1], s2[1][0], s2[1][1]] : defaultExtent;\n      const voronoi2 = this.value = Delaunay.from(data2, _.x, _.y).voronoi(s2);\n      for (let i = 0, n = data2.length; i < n; ++i) {\n        const polygon = voronoi2.cellPolygon(i);\n        data2[i][as] = polygon && !isPoint(polygon) ? toPathString(polygon) : null;\n      }\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  function toPathString(p) {\n    const x2 = p[0][0], y2 = p[0][1];\n    let n = p.length - 1;\n    for (; p[n][0] === x2 && p[n][1] === y2; --n) ;\n    return \"M\" + p.slice(0, n + 1).join(\"L\") + \"Z\";\n  }\n  function isPoint(p) {\n    return p.length === 2 && p[0][0] === p[1][0] && p[0][1] === p[1][1];\n  }\n  const voronoi = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    voronoi: Voronoi\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var cloudRadians = Math.PI / 180, cw = 1 << 11 >> 5, ch = 1 << 11;\n  function cloud() {\n    var size = [256, 256], text2, font2, fontSize2, fontStyle, fontWeight, rotate2, padding2, spiral = archimedeanSpiral, words = [], random2 = Math.random, cloud2 = {};\n    cloud2.layout = function() {\n      var contextAndRatio = getContext2(domCanvas()), board = zeroArray((size[0] >> 5) * size[1]), bounds2 = null, n = words.length, i = -1, tags = [], data2 = words.map((d3) => ({\n        text: text2(d3),\n        font: font2(d3),\n        style: fontStyle(d3),\n        weight: fontWeight(d3),\n        rotate: rotate2(d3),\n        size: ~~(fontSize2(d3) + 1e-14),\n        padding: padding2(d3),\n        xoff: 0,\n        yoff: 0,\n        x1: 0,\n        y1: 0,\n        x0: 0,\n        y0: 0,\n        hasText: false,\n        sprite: null,\n        datum: d3\n      })).sort((a2, b2) => b2.size - a2.size);\n      while (++i < n) {\n        var d2 = data2[i];\n        d2.x = size[0] * (random2() + 0.5) >> 1;\n        d2.y = size[1] * (random2() + 0.5) >> 1;\n        cloudSprite(contextAndRatio, d2, data2, i);\n        if (d2.hasText && place2(board, d2, bounds2)) {\n          tags.push(d2);\n          if (bounds2) cloudBounds(bounds2, d2);\n          else bounds2 = [{\n            x: d2.x + d2.x0,\n            y: d2.y + d2.y0\n          }, {\n            x: d2.x + d2.x1,\n            y: d2.y + d2.y1\n          }];\n          d2.x -= size[0] >> 1;\n          d2.y -= size[1] >> 1;\n        }\n      }\n      return tags;\n    };\n    function getContext2(canvas) {\n      canvas.width = canvas.height = 1;\n      var ratio = Math.sqrt(canvas.getContext(\"2d\").getImageData(0, 0, 1, 1).data.length >> 2);\n      canvas.width = (cw << 5) / ratio;\n      canvas.height = ch / ratio;\n      var context2 = canvas.getContext(\"2d\");\n      context2.fillStyle = context2.strokeStyle = \"red\";\n      context2.textAlign = \"center\";\n      return {\n        context: context2,\n        ratio\n      };\n    }\n    function place2(board, tag, bounds2) {\n      var startX = tag.x, startY = tag.y, maxDelta = Math.hypot(size[0], size[1]), s2 = spiral(size), dt = random2() < 0.5 ? 1 : -1, t = -dt, dxdy, dx, dy;\n      while (dxdy = s2(t += dt)) {\n        dx = ~~dxdy[0];\n        dy = ~~dxdy[1];\n        if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break;\n        tag.x = startX + dx;\n        tag.y = startY + dy;\n        if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue;\n        if (!bounds2 || !cloudCollide(tag, board, size[0])) {\n          if (!bounds2 || collideRects(tag, bounds2)) {\n            var sprite = tag.sprite, w2 = tag.width >> 5, sw = size[0] >> 5, lx2 = tag.x - (w2 << 4), sx = lx2 & 127, msx = 32 - sx, h2 = tag.y1 - tag.y0, x2 = (tag.y + tag.y0) * sw + (lx2 >> 5), last;\n            for (var j = 0; j < h2; j++) {\n              last = 0;\n              for (var i = 0; i <= w2; i++) {\n                board[x2 + i] |= last << msx | (i < w2 ? (last = sprite[j * w2 + i]) >>> sx : 0);\n              }\n              x2 += sw;\n            }\n            tag.sprite = null;\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n    cloud2.words = function(_) {\n      if (arguments.length) {\n        words = _;\n        return cloud2;\n      } else {\n        return words;\n      }\n    };\n    cloud2.size = function(_) {\n      if (arguments.length) {\n        size = [+_[0], +_[1]];\n        return cloud2;\n      } else {\n        return size;\n      }\n    };\n    cloud2.font = function(_) {\n      if (arguments.length) {\n        font2 = functor(_);\n        return cloud2;\n      } else {\n        return font2;\n      }\n    };\n    cloud2.fontStyle = function(_) {\n      if (arguments.length) {\n        fontStyle = functor(_);\n        return cloud2;\n      } else {\n        return fontStyle;\n      }\n    };\n    cloud2.fontWeight = function(_) {\n      if (arguments.length) {\n        fontWeight = functor(_);\n        return cloud2;\n      } else {\n        return fontWeight;\n      }\n    };\n    cloud2.rotate = function(_) {\n      if (arguments.length) {\n        rotate2 = functor(_);\n        return cloud2;\n      } else {\n        return rotate2;\n      }\n    };\n    cloud2.text = function(_) {\n      if (arguments.length) {\n        text2 = functor(_);\n        return cloud2;\n      } else {\n        return text2;\n      }\n    };\n    cloud2.spiral = function(_) {\n      if (arguments.length) {\n        spiral = spirals[_] || _;\n        return cloud2;\n      } else {\n        return spiral;\n      }\n    };\n    cloud2.fontSize = function(_) {\n      if (arguments.length) {\n        fontSize2 = functor(_);\n        return cloud2;\n      } else {\n        return fontSize2;\n      }\n    };\n    cloud2.padding = function(_) {\n      if (arguments.length) {\n        padding2 = functor(_);\n        return cloud2;\n      } else {\n        return padding2;\n      }\n    };\n    cloud2.random = function(_) {\n      if (arguments.length) {\n        random2 = _;\n        return cloud2;\n      } else {\n        return random2;\n      }\n    };\n    return cloud2;\n  }\n  function cloudSprite(contextAndRatio, d2, data2, di) {\n    if (d2.sprite) return;\n    var c2 = contextAndRatio.context, ratio = contextAndRatio.ratio;\n    c2.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);\n    var x2 = 0, y2 = 0, maxh = 0, n = data2.length, w2, w32, h2, i, j;\n    --di;\n    while (++di < n) {\n      d2 = data2[di];\n      c2.save();\n      c2.font = d2.style + \" \" + d2.weight + \" \" + ~~((d2.size + 1) / ratio) + \"px \" + d2.font;\n      w2 = c2.measureText(d2.text + \"m\").width * ratio;\n      h2 = d2.size << 1;\n      if (d2.rotate) {\n        var sr = Math.sin(d2.rotate * cloudRadians), cr2 = Math.cos(d2.rotate * cloudRadians), wcr = w2 * cr2, wsr = w2 * sr, hcr = h2 * cr2, hsr = h2 * sr;\n        w2 = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 31 >> 5 << 5;\n        h2 = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));\n      } else {\n        w2 = w2 + 31 >> 5 << 5;\n      }\n      if (h2 > maxh) maxh = h2;\n      if (x2 + w2 >= cw << 5) {\n        x2 = 0;\n        y2 += maxh;\n        maxh = 0;\n      }\n      if (y2 + h2 >= ch) break;\n      c2.translate((x2 + (w2 >> 1)) / ratio, (y2 + (h2 >> 1)) / ratio);\n      if (d2.rotate) c2.rotate(d2.rotate * cloudRadians);\n      c2.fillText(d2.text, 0, 0);\n      if (d2.padding) {\n        c2.lineWidth = 2 * d2.padding;\n        c2.strokeText(d2.text, 0, 0);\n      }\n      c2.restore();\n      d2.width = w2;\n      d2.height = h2;\n      d2.xoff = x2;\n      d2.yoff = y2;\n      d2.x1 = w2 >> 1;\n      d2.y1 = h2 >> 1;\n      d2.x0 = -d2.x1;\n      d2.y0 = -d2.y1;\n      d2.hasText = true;\n      x2 += w2;\n    }\n    var pixels = c2.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, sprite = [];\n    while (--di >= 0) {\n      d2 = data2[di];\n      if (!d2.hasText) continue;\n      w2 = d2.width;\n      w32 = w2 >> 5;\n      h2 = d2.y1 - d2.y0;\n      for (i = 0; i < h2 * w32; i++) sprite[i] = 0;\n      x2 = d2.xoff;\n      if (x2 == null) return;\n      y2 = d2.yoff;\n      var seen = 0, seenRow = -1;\n      for (j = 0; j < h2; j++) {\n        for (i = 0; i < w2; i++) {\n          var k = w32 * j + (i >> 5), m2 = pixels[(y2 + j) * (cw << 5) + (x2 + i) << 2] ? 1 << 31 - i % 32 : 0;\n          sprite[k] |= m2;\n          seen |= m2;\n        }\n        if (seen) seenRow = j;\n        else {\n          d2.y0++;\n          h2--;\n          j--;\n          y2++;\n        }\n      }\n      d2.y1 = d2.y0 + seenRow;\n      d2.sprite = sprite.slice(0, (d2.y1 - d2.y0) * w32);\n    }\n  }\n  function cloudCollide(tag, board, sw) {\n    sw >>= 5;\n    var sprite = tag.sprite, w2 = tag.width >> 5, lx2 = tag.x - (w2 << 4), sx = lx2 & 127, msx = 32 - sx, h2 = tag.y1 - tag.y0, x2 = (tag.y + tag.y0) * sw + (lx2 >> 5), last;\n    for (var j = 0; j < h2; j++) {\n      last = 0;\n      for (var i = 0; i <= w2; i++) {\n        if ((last << msx | (i < w2 ? (last = sprite[j * w2 + i]) >>> sx : 0)) & board[x2 + i]) return true;\n      }\n      x2 += sw;\n    }\n    return false;\n  }\n  function cloudBounds(bounds2, d2) {\n    var b0 = bounds2[0], b1 = bounds2[1];\n    if (d2.x + d2.x0 < b0.x) b0.x = d2.x + d2.x0;\n    if (d2.y + d2.y0 < b0.y) b0.y = d2.y + d2.y0;\n    if (d2.x + d2.x1 > b1.x) b1.x = d2.x + d2.x1;\n    if (d2.y + d2.y1 > b1.y) b1.y = d2.y + d2.y1;\n  }\n  function collideRects(a2, b2) {\n    return a2.x + a2.x1 > b2[0].x && a2.x + a2.x0 < b2[1].x && a2.y + a2.y1 > b2[0].y && a2.y + a2.y0 < b2[1].y;\n  }\n  function archimedeanSpiral(size) {\n    var e = size[0] / size[1];\n    return function(t) {\n      return [e * (t *= 0.1) * Math.cos(t), t * Math.sin(t)];\n    };\n  }\n  function rectangularSpiral(size) {\n    var dy = 4, dx = dy * size[0] / size[1], x2 = 0, y2 = 0;\n    return function(t) {\n      var sign2 = t < 0 ? -1 : 1;\n      switch (Math.sqrt(1 + 4 * sign2 * t) - sign2 & 3) {\n        case 0:\n          x2 += dx;\n          break;\n        case 1:\n          y2 += dy;\n          break;\n        case 2:\n          x2 -= dx;\n          break;\n        default:\n          y2 -= dy;\n          break;\n      }\n      return [x2, y2];\n    };\n  }\n  function zeroArray(n) {\n    var a2 = [], i = -1;\n    while (++i < n) a2[i] = 0;\n    return a2;\n  }\n  function functor(d2) {\n    return typeof d2 === \"function\" ? d2 : function() {\n      return d2;\n    };\n  }\n  var spirals = {\n    archimedean: archimedeanSpiral,\n    rectangular: rectangularSpiral\n  };\n  const Output = [\"x\", \"y\", \"font\", \"fontSize\", \"fontStyle\", \"fontWeight\", \"angle\"];\n  const Params$1 = [\"text\", \"font\", \"rotate\", \"fontSize\", \"fontStyle\", \"fontWeight\"];\n  function Wordcloud(params2) {\n    Transform.call(this, cloud(), params2);\n  }\n  Wordcloud.Definition = {\n    \"type\": \"Wordcloud\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"font\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"sans-serif\"\n    }, {\n      \"name\": \"fontStyle\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"normal\"\n    }, {\n      \"name\": \"fontWeight\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"normal\"\n    }, {\n      \"name\": \"fontSize\",\n      \"type\": \"number\",\n      \"expr\": true,\n      \"default\": 14\n    }, {\n      \"name\": \"fontSizeRange\",\n      \"type\": \"number\",\n      \"array\": \"nullable\",\n      \"default\": [10, 50]\n    }, {\n      \"name\": \"rotate\",\n      \"type\": \"number\",\n      \"expr\": true,\n      \"default\": 0\n    }, {\n      \"name\": \"text\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"spiral\",\n      \"type\": \"string\",\n      \"values\": [\"archimedean\", \"rectangular\"]\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 7,\n      \"default\": Output\n    }]\n  };\n  inherits(Wordcloud, Transform, {\n    transform(_, pulse2) {\n      if (_.size && !(_.size[0] && _.size[1])) {\n        error(\"Wordcloud size dimensions must be non-zero.\");\n      }\n      function modp(param2) {\n        const p = _[param2];\n        return isFunction(p) && pulse2.modified(p.fields);\n      }\n      const mod = _.modified();\n      if (!(mod || pulse2.changed(pulse2.ADD_REM) || Params$1.some(modp))) return;\n      const data2 = pulse2.materialize(pulse2.SOURCE).source, layout = this.value, as = _.as || Output;\n      let fontSize2 = _.fontSize || 14, range2;\n      isFunction(fontSize2) ? range2 = _.fontSizeRange : fontSize2 = constant$4(fontSize2);\n      if (range2) {\n        const fsize = fontSize2, sizeScale = scale$4(\"sqrt\")().domain(extent(data2, fsize)).range(range2);\n        fontSize2 = (x2) => sizeScale(fsize(x2));\n      }\n      data2.forEach((t) => {\n        t[as[0]] = NaN;\n        t[as[1]] = NaN;\n        t[as[3]] = 0;\n      });\n      const words = layout.words(data2).text(_.text).size(_.size || [500, 500]).padding(_.padding || 1).spiral(_.spiral || \"archimedean\").rotate(_.rotate || 0).font(_.font || \"sans-serif\").fontStyle(_.fontStyle || \"normal\").fontWeight(_.fontWeight || \"normal\").fontSize(fontSize2).random(random).layout();\n      const size = layout.size(), dx = size[0] >> 1, dy = size[1] >> 1, n = words.length;\n      for (let i = 0, w2, t; i < n; ++i) {\n        w2 = words[i];\n        t = w2.datum;\n        t[as[0]] = w2.x + dx;\n        t[as[1]] = w2.y + dy;\n        t[as[2]] = w2.font;\n        t[as[3]] = w2.size;\n        t[as[4]] = w2.style;\n        t[as[5]] = w2.weight;\n        t[as[6]] = w2.rotate;\n      }\n      return pulse2.reflow(mod).modifies(as);\n    }\n  });\n  const wordcloud = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    wordcloud: Wordcloud\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const array8 = (n) => new Uint8Array(n);\n  const array16 = (n) => new Uint16Array(n);\n  const array32 = (n) => new Uint32Array(n);\n  function Bitmaps() {\n    let width2 = 8, data2 = [], seen = array32(0), curr = array$1(0, width2), prev = array$1(0, width2);\n    return {\n      data: () => data2,\n      seen: () => seen = lengthen(seen, data2.length),\n      add(array2) {\n        for (let i = 0, j = data2.length, n = array2.length, t; i < n; ++i) {\n          t = array2[i];\n          t._index = j++;\n          data2.push(t);\n        }\n      },\n      remove(num, map2) {\n        const n = data2.length, copy2 = Array(n - num), reindex = data2;\n        let t, i, j;\n        for (i = 0; !map2[i] && i < n; ++i) {\n          copy2[i] = data2[i];\n          reindex[i] = i;\n        }\n        for (j = i; i < n; ++i) {\n          t = data2[i];\n          if (!map2[i]) {\n            reindex[i] = j;\n            curr[j] = curr[i];\n            prev[j] = prev[i];\n            copy2[j] = t;\n            t._index = j++;\n          } else {\n            reindex[i] = -1;\n          }\n          curr[i] = 0;\n        }\n        data2 = copy2;\n        return reindex;\n      },\n      size: () => data2.length,\n      curr: () => curr,\n      prev: () => prev,\n      reset: (k) => prev[k] = curr[k],\n      all: () => width2 < 257 ? 255 : width2 < 65537 ? 65535 : 4294967295,\n      set(k, one2) {\n        curr[k] |= one2;\n      },\n      clear(k, one2) {\n        curr[k] &= ~one2;\n      },\n      resize(n, m2) {\n        const k = curr.length;\n        if (n > k || m2 > width2) {\n          width2 = Math.max(m2, width2);\n          curr = array$1(n, width2, curr);\n          prev = array$1(n, width2);\n        }\n      }\n    };\n  }\n  function lengthen(array2, length2, copy2) {\n    if (array2.length >= length2) return array2;\n    copy2 = copy2 || new array2.constructor(length2);\n    copy2.set(array2);\n    return copy2;\n  }\n  function array$1(n, m2, array2) {\n    const copy2 = (m2 < 257 ? array8 : m2 < 65537 ? array16 : array32)(n);\n    if (array2) copy2.set(array2);\n    return copy2;\n  }\n  function Dimension(index2, i, query) {\n    const bit = 1 << i;\n    return {\n      one: bit,\n      zero: ~bit,\n      range: query.slice(),\n      bisect: index2.bisect,\n      index: index2.index,\n      size: index2.size,\n      onAdd(added, curr) {\n        const dim = this, range2 = dim.bisect(dim.range, added.value), idx = added.index, lo = range2[0], hi = range2[1], n1 = idx.length;\n        let i2;\n        for (i2 = 0; i2 < lo; ++i2) curr[idx[i2]] |= bit;\n        for (i2 = hi; i2 < n1; ++i2) curr[idx[i2]] |= bit;\n        return dim;\n      }\n    };\n  }\n  function SortedIndex() {\n    let index2 = array32(0), value2 = [], size = 0;\n    function insert2(key2, data2, base2) {\n      if (!data2.length) return [];\n      const n0 = size, n1 = data2.length, addi = array32(n1);\n      let addv = Array(n1), oldv, oldi, i;\n      for (i = 0; i < n1; ++i) {\n        addv[i] = key2(data2[i]);\n        addi[i] = i;\n      }\n      addv = sort$1(addv, addi);\n      if (n0) {\n        oldv = value2;\n        oldi = index2;\n        value2 = Array(n0 + n1);\n        index2 = array32(n0 + n1);\n        merge$1(base2, oldv, oldi, n0, addv, addi, n1, value2, index2);\n      } else {\n        if (base2 > 0) for (i = 0; i < n1; ++i) {\n          addi[i] += base2;\n        }\n        value2 = addv;\n        index2 = addi;\n      }\n      size = n0 + n1;\n      return {\n        index: addi,\n        value: addv\n      };\n    }\n    function remove2(num, map2) {\n      const n = size;\n      let idx, i, j;\n      for (i = 0; !map2[index2[i]] && i < n; ++i) ;\n      for (j = i; i < n; ++i) {\n        if (!map2[idx = index2[i]]) {\n          index2[j] = idx;\n          value2[j] = value2[i];\n          ++j;\n        }\n      }\n      size = n - num;\n    }\n    function reindex(map2) {\n      for (let i = 0, n = size; i < n; ++i) {\n        index2[i] = map2[index2[i]];\n      }\n    }\n    function bisect2(range2, array2) {\n      let n;\n      if (array2) {\n        n = array2.length;\n      } else {\n        array2 = value2;\n        n = size;\n      }\n      return [bisectLeft$1(array2, range2[0], 0, n), bisectRight$1(array2, range2[1], 0, n)];\n    }\n    return {\n      insert: insert2,\n      remove: remove2,\n      bisect: bisect2,\n      reindex,\n      index: () => index2,\n      size: () => size\n    };\n  }\n  function sort$1(values2, index2) {\n    values2.sort.call(index2, (a2, b2) => {\n      const x2 = values2[a2], y2 = values2[b2];\n      return x2 < y2 ? -1 : x2 > y2 ? 1 : 0;\n    });\n    return permute(values2, index2);\n  }\n  function merge$1(base2, value0, index0, n0, value1, index1, n1, value2, index2) {\n    let i0 = 0, i1 = 0, i;\n    for (i = 0; i0 < n0 && i1 < n1; ++i) {\n      if (value0[i0] < value1[i1]) {\n        value2[i] = value0[i0];\n        index2[i] = index0[i0++];\n      } else {\n        value2[i] = value1[i1];\n        index2[i] = index1[i1++] + base2;\n      }\n    }\n    for (; i0 < n0; ++i0, ++i) {\n      value2[i] = value0[i0];\n      index2[i] = index0[i0];\n    }\n    for (; i1 < n1; ++i1, ++i) {\n      value2[i] = value1[i1];\n      index2[i] = index1[i1] + base2;\n    }\n  }\n  function CrossFilter(params2) {\n    Transform.call(this, Bitmaps(), params2);\n    this._indices = null;\n    this._dims = null;\n  }\n  CrossFilter.Definition = {\n    \"type\": \"CrossFilter\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"query\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"required\": true,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }]\n  };\n  inherits(CrossFilter, Transform, {\n    transform(_, pulse2) {\n      if (!this._dims) {\n        return this.init(_, pulse2);\n      } else {\n        var init2 = _.modified(\"fields\") || _.fields.some((f) => pulse2.modified(f.fields));\n        return init2 ? this.reinit(_, pulse2) : this.eval(_, pulse2);\n      }\n    },\n    init(_, pulse2) {\n      const fields = _.fields, query = _.query, indices = this._indices = {}, dims = this._dims = [], m2 = query.length;\n      let i = 0, key2, index2;\n      for (; i < m2; ++i) {\n        key2 = fields[i].fname;\n        index2 = indices[key2] || (indices[key2] = SortedIndex());\n        dims.push(Dimension(index2, i, query[i]));\n      }\n      return this.eval(_, pulse2);\n    },\n    reinit(_, pulse2) {\n      const output2 = pulse2.materialize().fork(), fields = _.fields, query = _.query, indices = this._indices, dims = this._dims, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), out = output2.rem = output2.add, mod = output2.mod, m2 = query.length, adds = {};\n      let add2, index2, key2, mods, remMap, modMap, i, n, f;\n      prev.set(curr);\n      if (pulse2.rem.length) {\n        remMap = this.remove(_, pulse2, output2);\n      }\n      if (pulse2.add.length) {\n        bits.add(pulse2.add);\n      }\n      if (pulse2.mod.length) {\n        modMap = {};\n        for (mods = pulse2.mod, i = 0, n = mods.length; i < n; ++i) {\n          modMap[mods[i]._index] = 1;\n        }\n      }\n      for (i = 0; i < m2; ++i) {\n        f = fields[i];\n        if (!dims[i] || _.modified(\"fields\", i) || pulse2.modified(f.fields)) {\n          key2 = f.fname;\n          if (!(add2 = adds[key2])) {\n            indices[key2] = index2 = SortedIndex();\n            adds[key2] = add2 = index2.insert(f, pulse2.source, 0);\n          }\n          dims[i] = Dimension(index2, i, query[i]).onAdd(add2, curr);\n        }\n      }\n      for (i = 0, n = bits.data().length; i < n; ++i) {\n        if (remMap[i]) {\n          continue;\n        } else if (prev[i] !== curr[i]) {\n          out.push(i);\n        } else if (modMap[i] && curr[i] !== all) {\n          mod.push(i);\n        }\n      }\n      bits.mask = (1 << m2) - 1;\n      return output2;\n    },\n    eval(_, pulse2) {\n      const output2 = pulse2.materialize().fork(), m2 = this._dims.length;\n      let mask = 0;\n      if (pulse2.rem.length) {\n        this.remove(_, pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      if (_.modified(\"query\") && !_.modified(\"fields\")) {\n        mask |= this.update(_, pulse2, output2);\n      }\n      if (pulse2.add.length) {\n        this.insert(_, pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      if (pulse2.mod.length) {\n        this.modify(pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      this.value.mask = mask;\n      return output2;\n    },\n    insert(_, pulse2, output2) {\n      const tuples = pulse2.add, bits = this.value, dims = this._dims, indices = this._indices, fields = _.fields, adds = {}, out = output2.add, n = bits.size() + tuples.length, m2 = dims.length;\n      let k = bits.size(), j, key2, add2;\n      bits.resize(n, m2);\n      bits.add(tuples);\n      const curr = bits.curr(), prev = bits.prev(), all = bits.all();\n      for (j = 0; j < m2; ++j) {\n        key2 = fields[j].fname;\n        add2 = adds[key2] || (adds[key2] = indices[key2].insert(fields[j], tuples, k));\n        dims[j].onAdd(add2, curr);\n      }\n      for (; k < n; ++k) {\n        prev[k] = all;\n        if (curr[k] !== all) out.push(k);\n      }\n    },\n    modify(pulse2, output2) {\n      const out = output2.mod, bits = this.value, curr = bits.curr(), all = bits.all(), tuples = pulse2.mod;\n      let i, n, k;\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        k = tuples[i]._index;\n        if (curr[k] !== all) out.push(k);\n      }\n    },\n    remove(_, pulse2, output2) {\n      const indices = this._indices, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), map2 = {}, out = output2.rem, tuples = pulse2.rem;\n      let i, n, k, f;\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        k = tuples[i]._index;\n        map2[k] = 1;\n        prev[k] = f = curr[k];\n        curr[k] = all;\n        if (f !== all) out.push(k);\n      }\n      for (k in indices) {\n        indices[k].remove(n, map2);\n      }\n      this.reindex(pulse2, n, map2);\n      return map2;\n    },\n    // reindex filters and indices after propagation completes\n    reindex(pulse2, num, map2) {\n      const indices = this._indices, bits = this.value;\n      pulse2.runAfter(() => {\n        const indexMap = bits.remove(num, map2);\n        for (const key2 in indices) indices[key2].reindex(indexMap);\n      });\n    },\n    update(_, pulse2, output2) {\n      const dims = this._dims, query = _.query, stamp = pulse2.stamp, m2 = dims.length;\n      let mask = 0, i, q;\n      output2.filters = 0;\n      for (q = 0; q < m2; ++q) {\n        if (_.modified(\"query\", q)) {\n          i = q;\n          ++mask;\n        }\n      }\n      if (mask === 1) {\n        mask = dims[i].one;\n        this.incrementOne(dims[i], query[i], output2.add, output2.rem);\n      } else {\n        for (q = 0, mask = 0; q < m2; ++q) {\n          if (!_.modified(\"query\", q)) continue;\n          mask |= dims[q].one;\n          this.incrementAll(dims[q], query[q], stamp, output2.add);\n          output2.rem = output2.add;\n        }\n      }\n      return mask;\n    },\n    incrementAll(dim, query, stamp, out) {\n      const bits = this.value, seen = bits.seen(), curr = bits.curr(), prev = bits.prev(), index2 = dim.index(), old = dim.bisect(dim.range), range2 = dim.bisect(query), lo1 = range2[0], hi1 = range2[1], lo0 = old[0], hi0 = old[1], one2 = dim.one;\n      let i, j, k;\n      if (lo1 < lo0) {\n        for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      } else if (lo1 > lo0) {\n        for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      }\n      if (hi1 > hi0) {\n        for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      } else if (hi1 < hi0) {\n        for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      }\n      dim.range = query.slice();\n    },\n    incrementOne(dim, query, add2, rem2) {\n      const bits = this.value, curr = bits.curr(), index2 = dim.index(), old = dim.bisect(dim.range), range2 = dim.bisect(query), lo1 = range2[0], hi1 = range2[1], lo0 = old[0], hi0 = old[1], one2 = dim.one;\n      let i, j, k;\n      if (lo1 < lo0) {\n        for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          add2.push(k);\n        }\n      } else if (lo1 > lo0) {\n        for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          rem2.push(k);\n        }\n      }\n      if (hi1 > hi0) {\n        for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          add2.push(k);\n        }\n      } else if (hi1 < hi0) {\n        for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          rem2.push(k);\n        }\n      }\n      dim.range = query.slice();\n    }\n  });\n  function ResolveFilter(params2) {\n    Transform.call(this, null, params2);\n  }\n  ResolveFilter.Definition = {\n    \"type\": \"ResolveFilter\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"ignore\",\n      \"type\": \"number\",\n      \"required\": true,\n      \"description\": \"A bit mask indicating which filters to ignore.\"\n    }, {\n      \"name\": \"filter\",\n      \"type\": \"object\",\n      \"required\": true,\n      \"description\": \"Per-tuple filter bitmaps from a CrossFilter transform.\"\n    }]\n  };\n  inherits(ResolveFilter, Transform, {\n    transform(_, pulse2) {\n      const ignore = ~(_.ignore || 0), bitmap = _.filter, mask = bitmap.mask;\n      if ((mask & ignore) === 0) return pulse2.StopPropagation;\n      const output2 = pulse2.fork(pulse2.ALL), data2 = bitmap.data(), curr = bitmap.curr(), prev = bitmap.prev(), pass = (k) => !(curr[k] & ignore) ? data2[k] : null;\n      output2.filter(output2.MOD, pass);\n      if (!(mask & mask - 1)) {\n        output2.filter(output2.ADD, pass);\n        output2.filter(output2.REM, (k) => (curr[k] & ignore) === mask ? data2[k] : null);\n      } else {\n        output2.filter(output2.ADD, (k) => {\n          const c2 = curr[k] & ignore, f = !c2 && c2 ^ prev[k] & ignore;\n          return f ? data2[k] : null;\n        });\n        output2.filter(output2.REM, (k) => {\n          const c2 = curr[k] & ignore, f = c2 && !(c2 ^ (c2 ^ prev[k] & ignore));\n          return f ? data2[k] : null;\n        });\n      }\n      return output2.filter(output2.SOURCE, (t) => pass(t._index));\n    }\n  });\n  const xf = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    crossfilter: CrossFilter,\n    resolvefilter: ResolveFilter\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const RawCode = \"RawCode\";\n  const Literal = \"Literal\";\n  const Property = \"Property\";\n  const Identifier = \"Identifier\";\n  const ArrayExpression = \"ArrayExpression\";\n  const BinaryExpression = \"BinaryExpression\";\n  const CallExpression = \"CallExpression\";\n  const ConditionalExpression = \"ConditionalExpression\";\n  const LogicalExpression = \"LogicalExpression\";\n  const MemberExpression = \"MemberExpression\";\n  const ObjectExpression = \"ObjectExpression\";\n  const UnaryExpression = \"UnaryExpression\";\n  function ASTNode(type2) {\n    this.type = type2;\n  }\n  ASTNode.prototype.visit = function(visitor) {\n    let c2, i, n;\n    if (visitor(this)) return 1;\n    for (c2 = children(this), i = 0, n = c2.length; i < n; ++i) {\n      if (c2[i].visit(visitor)) return 1;\n    }\n  };\n  function children(node) {\n    switch (node.type) {\n      case ArrayExpression:\n        return node.elements;\n      case BinaryExpression:\n      case LogicalExpression:\n        return [node.left, node.right];\n      case CallExpression:\n        return [node.callee].concat(node.arguments);\n      case ConditionalExpression:\n        return [node.test, node.consequent, node.alternate];\n      case MemberExpression:\n        return [node.object, node.property];\n      case ObjectExpression:\n        return node.properties;\n      case Property:\n        return [node.key, node.value];\n      case UnaryExpression:\n        return [node.argument];\n      case Identifier:\n      case Literal:\n      case RawCode:\n      default:\n        return [];\n    }\n  }\n  var TokenName, source, index, length, lookahead;\n  var TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\n  TokenName = {};\n  TokenName[TokenBooleanLiteral] = \"Boolean\";\n  TokenName[TokenEOF] = \"<end>\";\n  TokenName[TokenIdentifier] = \"Identifier\";\n  TokenName[TokenKeyword] = \"Keyword\";\n  TokenName[TokenNullLiteral] = \"Null\";\n  TokenName[TokenNumericLiteral] = \"Numeric\";\n  TokenName[TokenPunctuator] = \"Punctuator\";\n  TokenName[TokenStringLiteral] = \"String\";\n  TokenName[TokenRegularExpression] = \"RegularExpression\";\n  var SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\";\n  var MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\n  var ILLEGAL$1 = \"ILLEGAL\", DISABLED = \"Disabled.\";\n  var RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), RegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\");\n  function assert(condition, message) {\n    if (!condition) {\n      throw new Error(\"ASSERT: \" + message);\n    }\n  }\n  function isDecimalDigit(ch2) {\n    return ch2 >= 48 && ch2 <= 57;\n  }\n  function isHexDigit(ch2) {\n    return \"0123456789abcdefABCDEF\".includes(ch2);\n  }\n  function isOctalDigit(ch2) {\n    return \"01234567\".includes(ch2);\n  }\n  function isWhiteSpace(ch2) {\n    return ch2 === 32 || ch2 === 9 || ch2 === 11 || ch2 === 12 || ch2 === 160 || ch2 >= 5760 && [5760, 6158, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8239, 8287, 12288, 65279].includes(ch2);\n  }\n  function isLineTerminator(ch2) {\n    return ch2 === 10 || ch2 === 13 || ch2 === 8232 || ch2 === 8233;\n  }\n  function isIdentifierStart(ch2) {\n    return ch2 === 36 || ch2 === 95 || // $ (dollar) and _ (underscore)\n    ch2 >= 65 && ch2 <= 90 || // A..Z\n    ch2 >= 97 && ch2 <= 122 || // a..z\n    ch2 === 92 || // \\ (backslash)\n    ch2 >= 128 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch2));\n  }\n  function isIdentifierPart(ch2) {\n    return ch2 === 36 || ch2 === 95 || // $ (dollar) and _ (underscore)\n    ch2 >= 65 && ch2 <= 90 || // A..Z\n    ch2 >= 97 && ch2 <= 122 || // a..z\n    ch2 >= 48 && ch2 <= 57 || // 0..9\n    ch2 === 92 || // \\ (backslash)\n    ch2 >= 128 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch2));\n  }\n  const keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n  };\n  function skipComment() {\n    while (index < length) {\n      const ch2 = source.charCodeAt(index);\n      if (isWhiteSpace(ch2) || isLineTerminator(ch2)) {\n        ++index;\n      } else {\n        break;\n      }\n    }\n  }\n  function scanHexEscape(prefix) {\n    var i, len2, ch2, code = 0;\n    len2 = prefix === \"u\" ? 4 : 2;\n    for (i = 0; i < len2; ++i) {\n      if (index < length && isHexDigit(source[index])) {\n        ch2 = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch2.toLowerCase());\n      } else {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n    }\n    return String.fromCharCode(code);\n  }\n  function scanUnicodeCodePointEscape() {\n    var ch2, code, cu1, cu2;\n    ch2 = source[index];\n    code = 0;\n    if (ch2 === \"}\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    while (index < length) {\n      ch2 = source[index++];\n      if (!isHexDigit(ch2)) {\n        break;\n      }\n      code = code * 16 + \"0123456789abcdef\".indexOf(ch2.toLowerCase());\n    }\n    if (code > 1114111 || ch2 !== \"}\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (code <= 65535) {\n      return String.fromCharCode(code);\n    }\n    cu1 = (code - 65536 >> 10) + 55296;\n    cu2 = (code - 65536 & 1023) + 56320;\n    return String.fromCharCode(cu1, cu2);\n  }\n  function getEscapedIdentifier() {\n    var ch2, id2;\n    ch2 = source.charCodeAt(index++);\n    id2 = String.fromCharCode(ch2);\n    if (ch2 === 92) {\n      if (source.charCodeAt(index) !== 117) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n      ++index;\n      ch2 = scanHexEscape(\"u\");\n      if (!ch2 || ch2 === \"\\\\\" || !isIdentifierStart(ch2.charCodeAt(0))) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n      id2 = ch2;\n    }\n    while (index < length) {\n      ch2 = source.charCodeAt(index);\n      if (!isIdentifierPart(ch2)) {\n        break;\n      }\n      ++index;\n      id2 += String.fromCharCode(ch2);\n      if (ch2 === 92) {\n        id2 = id2.substr(0, id2.length - 1);\n        if (source.charCodeAt(index) !== 117) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n        ++index;\n        ch2 = scanHexEscape(\"u\");\n        if (!ch2 || ch2 === \"\\\\\" || !isIdentifierPart(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n        id2 += ch2;\n      }\n    }\n    return id2;\n  }\n  function getIdentifier() {\n    var start, ch2;\n    start = index++;\n    while (index < length) {\n      ch2 = source.charCodeAt(index);\n      if (ch2 === 92) {\n        index = start;\n        return getEscapedIdentifier();\n      }\n      if (isIdentifierPart(ch2)) {\n        ++index;\n      } else {\n        break;\n      }\n    }\n    return source.slice(start, index);\n  }\n  function scanIdentifier() {\n    var start, id2, type2;\n    start = index;\n    id2 = source.charCodeAt(index) === 92 ? getEscapedIdentifier() : getIdentifier();\n    if (id2.length === 1) {\n      type2 = TokenIdentifier;\n    } else if (keywords.hasOwnProperty(id2)) {\n      type2 = TokenKeyword;\n    } else if (id2 === \"null\") {\n      type2 = TokenNullLiteral;\n    } else if (id2 === \"true\" || id2 === \"false\") {\n      type2 = TokenBooleanLiteral;\n    } else {\n      type2 = TokenIdentifier;\n    }\n    return {\n      type: type2,\n      value: id2,\n      start,\n      end: index\n    };\n  }\n  function scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch (code) {\n      // Check for most common single-character punctuators.\n      case 46:\n      // . dot\n      case 40:\n      // ( open bracket\n      case 41:\n      // ) close bracket\n      case 59:\n      // ; semicolon\n      case 44:\n      // , comma\n      case 123:\n      // { open curly brace\n      case 125:\n      // } close curly brace\n      case 91:\n      // [\n      case 93:\n      // ]\n      case 58:\n      // :\n      case 63:\n      // ?\n      case 126:\n        ++index;\n        return {\n          type: TokenPunctuator,\n          value: String.fromCharCode(code),\n          start,\n          end: index\n        };\n      default:\n        code2 = source.charCodeAt(index + 1);\n        if (code2 === 61) {\n          switch (code) {\n            case 43:\n            // +\n            case 45:\n            // -\n            case 47:\n            // /\n            case 60:\n            // <\n            case 62:\n            // >\n            case 94:\n            // ^\n            case 124:\n            // |\n            case 37:\n            // %\n            case 38:\n            // &\n            case 42:\n              index += 2;\n              return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code) + String.fromCharCode(code2),\n                start,\n                end: index\n              };\n            case 33:\n            // !\n            case 61:\n              index += 2;\n              if (source.charCodeAt(index) === 61) {\n                ++index;\n              }\n              return {\n                type: TokenPunctuator,\n                value: source.slice(start, index),\n                start,\n                end: index\n              };\n          }\n        }\n    }\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n      index += 4;\n      return {\n        type: TokenPunctuator,\n        value: ch4,\n        start,\n        end: index\n      };\n    }\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n      index += 3;\n      return {\n        type: TokenPunctuator,\n        value: ch3,\n        start,\n        end: index\n      };\n    }\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".includes(ch1) || ch2 === \"=>\") {\n      index += 2;\n      return {\n        type: TokenPunctuator,\n        value: ch2,\n        start,\n        end: index\n      };\n    }\n    if (ch2 === \"//\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (\"<>=!+-*%&|^/\".includes(ch1)) {\n      ++index;\n      return {\n        type: TokenPunctuator,\n        value: ch1,\n        start,\n        end: index\n      };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n  }\n  function scanHexLiteral(start) {\n    let number2 = \"\";\n    while (index < length) {\n      if (!isHexDigit(source[index])) {\n        break;\n      }\n      number2 += source[index++];\n    }\n    if (number2.length === 0) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseInt(\"0x\" + number2, 16),\n      start,\n      end: index\n    };\n  }\n  function scanOctalLiteral(start) {\n    let number2 = \"0\" + source[index++];\n    while (index < length) {\n      if (!isOctalDigit(source[index])) {\n        break;\n      }\n      number2 += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseInt(number2, 8),\n      octal: true,\n      start,\n      end: index\n    };\n  }\n  function scanNumericLiteral() {\n    var number2, start, ch2;\n    ch2 = source[index];\n    assert(isDecimalDigit(ch2.charCodeAt(0)) || ch2 === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number2 = \"\";\n    if (ch2 !== \".\") {\n      number2 = source[index++];\n      ch2 = source[index];\n      if (number2 === \"0\") {\n        if (ch2 === \"x\" || ch2 === \"X\") {\n          ++index;\n          return scanHexLiteral(start);\n        }\n        if (isOctalDigit(ch2)) {\n          return scanOctalLiteral(start);\n        }\n        if (ch2 && isDecimalDigit(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n      }\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number2 += source[index++];\n      }\n      ch2 = source[index];\n    }\n    if (ch2 === \".\") {\n      number2 += source[index++];\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number2 += source[index++];\n      }\n      ch2 = source[index];\n    }\n    if (ch2 === \"e\" || ch2 === \"E\") {\n      number2 += source[index++];\n      ch2 = source[index];\n      if (ch2 === \"+\" || ch2 === \"-\") {\n        number2 += source[index++];\n      }\n      if (isDecimalDigit(source.charCodeAt(index))) {\n        while (isDecimalDigit(source.charCodeAt(index))) {\n          number2 += source[index++];\n        }\n      } else {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseFloat(number2),\n      start,\n      end: index\n    };\n  }\n  function scanStringLiteral() {\n    var str = \"\", quote, start, ch2, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while (index < length) {\n      ch2 = source[index++];\n      if (ch2 === quote) {\n        quote = \"\";\n        break;\n      } else if (ch2 === \"\\\\\") {\n        ch2 = source[index++];\n        if (!ch2 || !isLineTerminator(ch2.charCodeAt(0))) {\n          switch (ch2) {\n            case \"u\":\n            case \"x\":\n              if (source[index] === \"{\") {\n                ++index;\n                str += scanUnicodeCodePointEscape();\n              } else {\n                str += scanHexEscape(ch2);\n              }\n              break;\n            case \"n\":\n              str += \"\\n\";\n              break;\n            case \"r\":\n              str += \"\\r\";\n              break;\n            case \"t\":\n              str += \"\t\";\n              break;\n            case \"b\":\n              str += \"\\b\";\n              break;\n            case \"f\":\n              str += \"\\f\";\n              break;\n            case \"v\":\n              str += \"\\v\";\n              break;\n            default:\n              if (isOctalDigit(ch2)) {\n                code = \"01234567\".indexOf(ch2);\n                if (code !== 0) {\n                  octal = true;\n                }\n                if (index < length && isOctalDigit(source[index])) {\n                  octal = true;\n                  code = code * 8 + \"01234567\".indexOf(source[index++]);\n                  if (\"0123\".includes(ch2) && index < length && isOctalDigit(source[index])) {\n                    code = code * 8 + \"01234567\".indexOf(source[index++]);\n                  }\n                }\n                str += String.fromCharCode(code);\n              } else {\n                str += ch2;\n              }\n              break;\n          }\n        } else {\n          if (ch2 === \"\\r\" && source[index] === \"\\n\") {\n            ++index;\n          }\n        }\n      } else if (isLineTerminator(ch2.charCodeAt(0))) {\n        break;\n      } else {\n        str += ch2;\n      }\n    }\n    if (quote !== \"\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenStringLiteral,\n      value: str,\n      octal,\n      start,\n      end: index\n    };\n  }\n  function testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.includes(\"u\")) {\n      tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1) => {\n        if (parseInt($1, 16) <= 1114111) {\n          return \"x\";\n        }\n        throwError({}, MessageInvalidRegExp);\n      }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n    }\n    try {\n      new RegExp(tmp);\n    } catch (e) {\n      throwError({}, MessageInvalidRegExp);\n    }\n    try {\n      return new RegExp(pattern, flags);\n    } catch (exception) {\n      return null;\n    }\n  }\n  function scanRegExpBody() {\n    var ch2, str, classMarker, terminated, body;\n    ch2 = source[index];\n    assert(ch2 === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while (index < length) {\n      ch2 = source[index++];\n      str += ch2;\n      if (ch2 === \"\\\\\") {\n        ch2 = source[index++];\n        if (isLineTerminator(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnterminatedRegExp);\n        }\n        str += ch2;\n      } else if (isLineTerminator(ch2.charCodeAt(0))) {\n        throwError({}, MessageUnterminatedRegExp);\n      } else if (classMarker) {\n        if (ch2 === \"]\") {\n          classMarker = false;\n        }\n      } else {\n        if (ch2 === \"/\") {\n          terminated = true;\n          break;\n        } else if (ch2 === \"[\") {\n          classMarker = true;\n        }\n      }\n    }\n    if (!terminated) {\n      throwError({}, MessageUnterminatedRegExp);\n    }\n    body = str.substr(1, str.length - 2);\n    return {\n      value: body,\n      literal: str\n    };\n  }\n  function scanRegExpFlags() {\n    var ch2, str, flags;\n    str = \"\";\n    flags = \"\";\n    while (index < length) {\n      ch2 = source[index];\n      if (!isIdentifierPart(ch2.charCodeAt(0))) {\n        break;\n      }\n      ++index;\n      if (ch2 === \"\\\\\" && index < length) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      } else {\n        flags += ch2;\n        str += ch2;\n      }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) {\n      throwError({}, MessageInvalidRegExp, flags);\n    }\n    return {\n      value: flags,\n      literal: str\n    };\n  }\n  function scanRegExp() {\n    var start, body, flags, value2;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value2 = testRegExp(body.value, flags.value);\n    return {\n      literal: body.literal + flags.literal,\n      value: value2,\n      regex: {\n        pattern: body.value,\n        flags: flags.value\n      },\n      start,\n      end: index\n    };\n  }\n  function isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n  }\n  function advance() {\n    skipComment();\n    if (index >= length) {\n      return {\n        type: TokenEOF,\n        start: index,\n        end: index\n      };\n    }\n    const ch2 = source.charCodeAt(index);\n    if (isIdentifierStart(ch2)) {\n      return scanIdentifier();\n    }\n    if (ch2 === 40 || ch2 === 41 || ch2 === 59) {\n      return scanPunctuator();\n    }\n    if (ch2 === 39 || ch2 === 34) {\n      return scanStringLiteral();\n    }\n    if (ch2 === 46) {\n      if (isDecimalDigit(source.charCodeAt(index + 1))) {\n        return scanNumericLiteral();\n      }\n      return scanPunctuator();\n    }\n    if (isDecimalDigit(ch2)) {\n      return scanNumericLiteral();\n    }\n    return scanPunctuator();\n  }\n  function lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n  }\n  function peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n  }\n  function finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n  }\n  function finishBinaryExpression(operator2, left, right) {\n    const node = new ASTNode(operator2 === \"||\" || operator2 === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator2;\n    node.left = left;\n    node.right = right;\n    return node;\n  }\n  function finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n  }\n  function finishConditionalExpression(test2, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test2;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n  }\n  function finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n  }\n  function finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n      if (node.raw === \"//\") {\n        node.raw = \"/(?:)/\";\n      }\n      node.regex = token.regex;\n    }\n    return node;\n  }\n  function finishMemberExpression(accessor2, object2, property2) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor2 === \"[\";\n    node.object = object2;\n    node.property = property2;\n    if (!node.computed) property2.member = true;\n    return node;\n  }\n  function finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n  }\n  function finishProperty(kind, key2, value2) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key2;\n    node.value = value2;\n    node.kind = kind;\n    return node;\n  }\n  function finishUnaryExpression(operator2, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator2;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n  }\n  function throwError(token, messageFormat) {\n    var error2, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index2) => {\n      assert(index2 < args.length, \"Message reference must be in range\");\n      return args[index2];\n    });\n    error2 = new Error(msg);\n    error2.index = index;\n    error2.description = msg;\n    throw error2;\n  }\n  function throwUnexpected(token) {\n    if (token.type === TokenEOF) {\n      throwError(token, MessageUnexpectedEOS);\n    }\n    if (token.type === TokenNumericLiteral) {\n      throwError(token, MessageUnexpectedNumber);\n    }\n    if (token.type === TokenStringLiteral) {\n      throwError(token, MessageUnexpectedString);\n    }\n    if (token.type === TokenIdentifier) {\n      throwError(token, MessageUnexpectedIdentifier);\n    }\n    if (token.type === TokenKeyword) {\n      throwError(token, MessageUnexpectedReserved);\n    }\n    throwError(token, MessageUnexpectedToken, token.value);\n  }\n  function expect(value2) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value2) {\n      throwUnexpected(token);\n    }\n  }\n  function match(value2) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value2;\n  }\n  function matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n  }\n  function parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while (!match(\"]\")) {\n      if (match(\",\")) {\n        lex();\n        elements.push(null);\n      } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) {\n          expect(\",\");\n        }\n      }\n    }\n    lex();\n    return finishArrayExpression(elements);\n  }\n  function parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex();\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n      if (token.octal) {\n        throwError(token, MessageStrictOctalLiteral);\n      }\n      return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n  }\n  function parseObjectProperty() {\n    var token, key2, id2, value2;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n      id2 = parseObjectPropertyKey();\n      expect(\":\");\n      value2 = parseConditionalExpression();\n      return finishProperty(\"init\", id2, value2);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) {\n      throwUnexpected(token);\n    } else {\n      key2 = parseObjectPropertyKey();\n      expect(\":\");\n      value2 = parseConditionalExpression();\n      return finishProperty(\"init\", key2, value2);\n    }\n  }\n  function parseObjectInitialiser() {\n    var properties = [], property2, name, key2, map2 = {}, toString2 = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while (!match(\"}\")) {\n      property2 = parseObjectProperty();\n      if (property2.key.type === SyntaxIdentifier) {\n        name = property2.key.name;\n      } else {\n        name = toString2(property2.key.value);\n      }\n      key2 = \"$\" + name;\n      if (Object.prototype.hasOwnProperty.call(map2, key2)) {\n        throwError({}, MessageStrictDuplicateProperty);\n      } else {\n        map2[key2] = true;\n      }\n      properties.push(property2);\n      if (!match(\"}\")) {\n        expect(\",\");\n      }\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n  }\n  function parseGroupExpression() {\n    expect(\"(\");\n    const expr2 = parseExpression();\n    expect(\")\");\n    return expr2;\n  }\n  const legalKeywords = {\n    \"if\": 1\n  };\n  function parsePrimaryExpression() {\n    var type2, token, expr2;\n    if (match(\"(\")) {\n      return parseGroupExpression();\n    }\n    if (match(\"[\")) {\n      return parseArrayInitialiser();\n    }\n    if (match(\"{\")) {\n      return parseObjectInitialiser();\n    }\n    type2 = lookahead.type;\n    index = lookahead.start;\n    if (type2 === TokenIdentifier || legalKeywords[lookahead.value]) {\n      expr2 = finishIdentifier(lex().value);\n    } else if (type2 === TokenStringLiteral || type2 === TokenNumericLiteral) {\n      if (lookahead.octal) {\n        throwError(lookahead, MessageStrictOctalLiteral);\n      }\n      expr2 = finishLiteral(lex());\n    } else if (type2 === TokenKeyword) {\n      throw new Error(DISABLED);\n    } else if (type2 === TokenBooleanLiteral) {\n      token = lex();\n      token.value = token.value === \"true\";\n      expr2 = finishLiteral(token);\n    } else if (type2 === TokenNullLiteral) {\n      token = lex();\n      token.value = null;\n      expr2 = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n      expr2 = finishLiteral(scanRegExp());\n      peek();\n    } else {\n      throwUnexpected(lex());\n    }\n    return expr2;\n  }\n  function parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) {\n      while (index < length) {\n        args.push(parseConditionalExpression());\n        if (match(\")\")) {\n          break;\n        }\n        expect(\",\");\n      }\n    }\n    expect(\")\");\n    return args;\n  }\n  function parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) {\n      throwUnexpected(token);\n    }\n    return finishIdentifier(token.value);\n  }\n  function parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n  }\n  function parseComputedMember() {\n    expect(\"[\");\n    const expr2 = parseExpression();\n    expect(\"]\");\n    return expr2;\n  }\n  function parseLeftHandSideExpressionAllowCall() {\n    var expr2, args, property2;\n    expr2 = parsePrimaryExpression();\n    for (; ; ) {\n      if (match(\".\")) {\n        property2 = parseNonComputedMember();\n        expr2 = finishMemberExpression(\".\", expr2, property2);\n      } else if (match(\"(\")) {\n        args = parseArguments();\n        expr2 = finishCallExpression(expr2, args);\n      } else if (match(\"[\")) {\n        property2 = parseComputedMember();\n        expr2 = finishMemberExpression(\"[\", expr2, property2);\n      } else {\n        break;\n      }\n    }\n    return expr2;\n  }\n  function parsePostfixExpression() {\n    const expr2 = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n      if (match(\"++\") || match(\"--\")) {\n        throw new Error(DISABLED);\n      }\n    }\n    return expr2;\n  }\n  function parseUnaryExpression() {\n    var token, expr2;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) {\n      expr2 = parsePostfixExpression();\n    } else if (match(\"++\") || match(\"--\")) {\n      throw new Error(DISABLED);\n    } else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n      token = lex();\n      expr2 = parseUnaryExpression();\n      expr2 = finishUnaryExpression(token.value, expr2);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) {\n      throw new Error(DISABLED);\n    } else {\n      expr2 = parsePostfixExpression();\n    }\n    return expr2;\n  }\n  function binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) {\n      return 0;\n    }\n    switch (token.value) {\n      case \"||\":\n        prec = 1;\n        break;\n      case \"&&\":\n        prec = 2;\n        break;\n      case \"|\":\n        prec = 3;\n        break;\n      case \"^\":\n        prec = 4;\n        break;\n      case \"&\":\n        prec = 5;\n        break;\n      case \"==\":\n      case \"!=\":\n      case \"===\":\n      case \"!==\":\n        prec = 6;\n        break;\n      case \"<\":\n      case \">\":\n      case \"<=\":\n      case \">=\":\n      case \"instanceof\":\n      case \"in\":\n        prec = 7;\n        break;\n      case \"<<\":\n      case \">>\":\n      case \">>>\":\n        prec = 8;\n        break;\n      case \"+\":\n      case \"-\":\n        prec = 9;\n        break;\n      case \"*\":\n      case \"/\":\n      case \"%\":\n        prec = 11;\n        break;\n    }\n    return prec;\n  }\n  function parseBinaryExpression() {\n    var marker, markers, expr2, token, prec, stack, right, operator2, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) {\n      return left;\n    }\n    token.prec = prec;\n    lex();\n    markers = [marker, lookahead];\n    right = parseUnaryExpression();\n    stack = [left, token, right];\n    while ((prec = binaryPrecedence(lookahead)) > 0) {\n      while (stack.length > 2 && prec <= stack[stack.length - 2].prec) {\n        right = stack.pop();\n        operator2 = stack.pop().value;\n        left = stack.pop();\n        markers.pop();\n        expr2 = finishBinaryExpression(operator2, left, right);\n        stack.push(expr2);\n      }\n      token = lex();\n      token.prec = prec;\n      stack.push(token);\n      markers.push(lookahead);\n      expr2 = parseUnaryExpression();\n      stack.push(expr2);\n    }\n    i = stack.length - 1;\n    expr2 = stack[i];\n    markers.pop();\n    while (i > 1) {\n      markers.pop();\n      expr2 = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr2);\n      i -= 2;\n    }\n    return expr2;\n  }\n  function parseConditionalExpression() {\n    var expr2, consequent, alternate;\n    expr2 = parseBinaryExpression();\n    if (match(\"?\")) {\n      lex();\n      consequent = parseConditionalExpression();\n      expect(\":\");\n      alternate = parseConditionalExpression();\n      expr2 = finishConditionalExpression(expr2, consequent, alternate);\n    }\n    return expr2;\n  }\n  function parseExpression() {\n    const expr2 = parseConditionalExpression();\n    if (match(\",\")) {\n      throw new Error(DISABLED);\n    }\n    return expr2;\n  }\n  function parser$1(code) {\n    source = code;\n    index = 0;\n    length = source.length;\n    lookahead = null;\n    peek();\n    const expr2 = parseExpression();\n    if (lookahead.type !== TokenEOF) {\n      throw new Error(\"Unexpect token after expression.\");\n    }\n    return expr2;\n  }\n  var Constants = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n  };\n  function Functions(codegen2) {\n    function fncall(name, args, cast, type2) {\n      let obj2 = codegen2(args[0]);\n      if (cast) {\n        obj2 = cast + \"(\" + obj2 + \")\";\n        if (cast.lastIndexOf(\"new \", 0) === 0) obj2 = \"(\" + obj2 + \")\";\n      }\n      return obj2 + \".\" + name + (type2 < 0 ? \"\" : type2 === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen2).join(\",\") + \")\");\n    }\n    function fn2(name, cast, type2) {\n      return (args) => fncall(name, args, cast, type2);\n    }\n    const DATE2 = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n      // MATH functions\n      isNaN: \"Number.isNaN\",\n      isFinite: \"Number.isFinite\",\n      abs: \"Math.abs\",\n      acos: \"Math.acos\",\n      asin: \"Math.asin\",\n      atan: \"Math.atan\",\n      atan2: \"Math.atan2\",\n      ceil: \"Math.ceil\",\n      cos: \"Math.cos\",\n      exp: \"Math.exp\",\n      floor: \"Math.floor\",\n      hypot: \"Math.hypot\",\n      log: \"Math.log\",\n      max: \"Math.max\",\n      min: \"Math.min\",\n      pow: \"Math.pow\",\n      random: \"Math.random\",\n      round: \"Math.round\",\n      sin: \"Math.sin\",\n      sqrt: \"Math.sqrt\",\n      tan: \"Math.tan\",\n      clamp: function(args) {\n        if (args.length < 3) error(\"Missing arguments to clamp function.\");\n        if (args.length > 3) error(\"Too many arguments to clamp function.\");\n        const a2 = args.map(codegen2);\n        return \"Math.max(\" + a2[1] + \", Math.min(\" + a2[2] + \",\" + a2[0] + \"))\";\n      },\n      // DATE functions\n      now: \"Date.now\",\n      utc: \"Date.UTC\",\n      datetime: DATE2,\n      date: fn2(\"getDate\", DATE2, 0),\n      day: fn2(\"getDay\", DATE2, 0),\n      year: fn2(\"getFullYear\", DATE2, 0),\n      month: fn2(\"getMonth\", DATE2, 0),\n      hours: fn2(\"getHours\", DATE2, 0),\n      minutes: fn2(\"getMinutes\", DATE2, 0),\n      seconds: fn2(\"getSeconds\", DATE2, 0),\n      milliseconds: fn2(\"getMilliseconds\", DATE2, 0),\n      time: fn2(\"getTime\", DATE2, 0),\n      timezoneoffset: fn2(\"getTimezoneOffset\", DATE2, 0),\n      utcdate: fn2(\"getUTCDate\", DATE2, 0),\n      utcday: fn2(\"getUTCDay\", DATE2, 0),\n      utcyear: fn2(\"getUTCFullYear\", DATE2, 0),\n      utcmonth: fn2(\"getUTCMonth\", DATE2, 0),\n      utchours: fn2(\"getUTCHours\", DATE2, 0),\n      utcminutes: fn2(\"getUTCMinutes\", DATE2, 0),\n      utcseconds: fn2(\"getUTCSeconds\", DATE2, 0),\n      utcmilliseconds: fn2(\"getUTCMilliseconds\", DATE2, 0),\n      // sequence functions\n      length: fn2(\"length\", null, -1),\n      // STRING functions\n      parseFloat: \"parseFloat\",\n      parseInt: \"parseInt\",\n      upper: fn2(\"toUpperCase\", STRING, 0),\n      lower: fn2(\"toLowerCase\", STRING, 0),\n      substring: fn2(\"substring\", STRING),\n      split: fn2(\"split\", STRING),\n      trim: fn2(\"trim\", STRING, 0),\n      // base64 encode/decode\n      btoa: \"btoa\",\n      atob: \"atob\",\n      // REGEXP functions\n      regexp: REGEXP,\n      test: fn2(\"test\", REGEXP),\n      // Control Flow functions\n      if: function(args) {\n        if (args.length < 3) error(\"Missing arguments to if function.\");\n        if (args.length > 3) error(\"Too many arguments to if function.\");\n        const a2 = args.map(codegen2);\n        return \"(\" + a2[0] + \"?\" + a2[1] + \":\" + a2[2] + \")\";\n      }\n    };\n  }\n  function stripQuotes(s2) {\n    const n = s2 && s2.length - 1;\n    return n && (s2[0] === '\"' && s2[n] === '\"' || s2[0] === \"'\" && s2[n] === \"'\") ? s2.slice(1, -1) : s2;\n  }\n  function codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? toSet(opt.allowed) : {}, forbidden = opt.forbidden ? toSet(opt.forbidden) : {}, constants2 = opt.constants || Constants, functions = (opt.functions || Functions)(visit2), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = isFunction(globalvar) ? globalvar : (id2) => `${globalvar}[\"${id2}\"]`;\n    /* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype).filter((name) => typeof Object.prototype[name] === \"function\"), \"__proto__\"]);\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit2(ast) {\n      if (isString(ast)) return ast;\n      const generator = Generators[ast.type];\n      if (generator == null) error(\"Unsupported type: \" + ast.type);\n      return generator(ast);\n    }\n    const Generators = {\n      Literal: (n) => n.raw,\n      Identifier: (n) => {\n        const id2 = n.name;\n        if (memberDepth > 0) {\n          return id2;\n        } else if (has$1(forbidden, id2)) {\n          return error(\"Illegal identifier: \" + id2);\n        } else if (has$1(constants2, id2)) {\n          return constants2[id2];\n        } else if (has$1(allowed, id2)) {\n          return id2;\n        } else {\n          globals[id2] = 1;\n          return outputGlobal(id2);\n        }\n      },\n      MemberExpression: (n) => {\n        const d2 = !n.computed, o = visit2(n.object);\n        if (d2) memberDepth += 1;\n        const p = visit2(n.property);\n        if (o === fieldvar) {\n          fields[stripQuotes(p)] = 1;\n        }\n        if (d2) memberDepth -= 1;\n        return o + (d2 ? \".\" + p : \"[\" + p + \"]\");\n      },\n      CallExpression: (n) => {\n        if (n.callee.type !== \"Identifier\") {\n          error(\"Illegal callee type: \" + n.callee.type);\n        }\n        const callee = n.callee.name, args = n.arguments, fn2 = has$1(functions, callee) && functions[callee];\n        if (!fn2) error(\"Unrecognized function: \" + callee);\n        return isFunction(fn2) ? fn2(args) : fn2 + \"(\" + args.map(visit2).join(\",\") + \")\";\n      },\n      ArrayExpression: (n) => \"[\" + n.elements.map(visit2).join(\",\") + \"]\",\n      BinaryExpression: (n) => \"(\" + visit2(n.left) + \" \" + n.operator + \" \" + visit2(n.right) + \")\",\n      UnaryExpression: (n) => \"(\" + n.operator + visit2(n.argument) + \")\",\n      ConditionalExpression: (n) => \"(\" + visit2(n.test) + \"?\" + visit2(n.consequent) + \":\" + visit2(n.alternate) + \")\",\n      LogicalExpression: (n) => \"(\" + visit2(n.left) + n.operator + visit2(n.right) + \")\",\n      ObjectExpression: (n) => {\n        for (const prop of n.properties) {\n          const keyName = prop.key.name;\n          if (DisallowedObjectProperties.has(keyName)) {\n            error(\"Illegal property: \" + keyName);\n          }\n        }\n        return \"{\" + n.properties.map(visit2).join(\",\") + \"}\";\n      },\n      Property: (n) => {\n        memberDepth += 1;\n        const k = visit2(n.key);\n        memberDepth -= 1;\n        return k + \":\" + visit2(n.value);\n      }\n    };\n    function codegen2(ast) {\n      const result = {\n        code: visit2(ast),\n        globals: Object.keys(globals),\n        fields: Object.keys(fields)\n      };\n      globals = {};\n      fields = {};\n      return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants2;\n    return codegen2;\n  }\n  const SELECTION_GETTER = Symbol(\"vega_selection_getter\");\n  function getter(f) {\n    if (!f.getter || !f.getter[SELECTION_GETTER]) {\n      f.getter = field$1(f.field);\n      f.getter[SELECTION_GETTER] = true;\n    }\n    return f.getter;\n  }\n  const Intersect = \"intersect\";\n  const Union = \"union\";\n  const VlMulti = \"vlMulti\";\n  const VlPoint = \"vlPoint\";\n  const Or = \"or\";\n  const And = \"and\";\n  const SelectionId = \"_vgsid_\";\n  const $selectionId = field$1(SelectionId);\n  const TYPE_ENUM = \"E\", TYPE_RANGE_INC = \"R\", TYPE_RANGE_EXC = \"R-E\", TYPE_RANGE_LE = \"R-LE\", TYPE_RANGE_RE = \"R-RE\", TYPE_PRED_LT = \"E-LT\", TYPE_PRED_LTE = \"E-LTE\", TYPE_PRED_GT = \"E-GT\", TYPE_PRED_GTE = \"E-GTE\", TYPE_PRED_VALID = \"E-VALID\", TYPE_PRED_ONE_OF = \"E-ONE\", UNIT_INDEX = \"index:unit\";\n  function testPoint(datum2, entry2) {\n    var fields = entry2.fields, values2 = entry2.values, n = fields.length, i = 0, dval, f;\n    for (; i < n; ++i) {\n      f = fields[i];\n      dval = getter(f)(datum2);\n      if (isDate$1(dval)) dval = toNumber(dval);\n      if (isDate$1(values2[i])) values2[i] = toNumber(values2[i]);\n      if (isArray(values2[i]) && isDate$1(values2[i][0])) values2[i] = values2[i].map(toNumber);\n      if (f.type === TYPE_ENUM) {\n        if (isArray(values2[i]) ? !values2[i].includes(dval) : dval !== values2[i]) {\n          return false;\n        }\n      } else {\n        if (f.type === TYPE_RANGE_INC) {\n          if (!inrange(dval, values2[i])) return false;\n        } else if (f.type === TYPE_RANGE_RE) {\n          if (!inrange(dval, values2[i], true, false)) return false;\n        } else if (f.type === TYPE_RANGE_EXC) {\n          if (!inrange(dval, values2[i], false, false)) return false;\n        } else if (f.type === TYPE_RANGE_LE) {\n          if (!inrange(dval, values2[i], false, true)) return false;\n        } else if (f.type === TYPE_PRED_LT) {\n          if (dval >= values2[i]) return false;\n        } else if (f.type === TYPE_PRED_LTE) {\n          if (dval > values2[i]) return false;\n        } else if (f.type === TYPE_PRED_GT) {\n          if (dval <= values2[i]) return false;\n        } else if (f.type === TYPE_PRED_GTE) {\n          if (dval < values2[i]) return false;\n        } else if (f.type === TYPE_PRED_VALID) {\n          if (dval === null || isNaN(dval)) return false;\n        } else if (f.type === TYPE_PRED_ONE_OF) {\n          if (values2[i].indexOf(dval) === -1) return false;\n        }\n      }\n    }\n    return true;\n  }\n  function selectionTest(name, datum2, op) {\n    var data2 = this.context.data[name], entries = data2 ? data2.values.value : [], unitIdx = data2 ? data2[UNIT_INDEX] && data2[UNIT_INDEX].value : void 0, intersect2 = op === Intersect, n = entries.length, i = 0, entry2, miss, count2, unit2, b2;\n    for (; i < n; ++i) {\n      entry2 = entries[i];\n      if (unitIdx && intersect2) {\n        miss = miss || {};\n        count2 = miss[unit2 = entry2.unit] || 0;\n        if (count2 === -1) continue;\n        b2 = testPoint(datum2, entry2);\n        miss[unit2] = b2 ? -1 : ++count2;\n        if (b2 && unitIdx.size === 1) return true;\n        if (!b2 && count2 === unitIdx.get(unit2).count) return false;\n      } else {\n        b2 = testPoint(datum2, entry2);\n        if (intersect2 ^ b2) return b2;\n      }\n    }\n    return n && intersect2;\n  }\n  const bisect = bisector($selectionId), bisectLeft = bisect.left, bisectRight = bisect.right;\n  function selectionIdTest(name, datum2, op) {\n    const data2 = this.context.data[name], entries = data2 ? data2.values.value : [], unitIdx = data2 ? data2[UNIT_INDEX] && data2[UNIT_INDEX].value : void 0, intersect2 = op === Intersect, value2 = $selectionId(datum2), index2 = bisectLeft(entries, value2);\n    if (index2 === entries.length) return false;\n    if ($selectionId(entries[index2]) !== value2) return false;\n    if (unitIdx && intersect2) {\n      if (unitIdx.size === 1) return true;\n      if (bisectRight(entries, value2) - index2 < unitIdx.size) return false;\n    }\n    return true;\n  }\n  function selectionTuples(array2, base2) {\n    if (!isArray(array2)) {\n      error(\"First argument to selectionTuples must be an array.\");\n    }\n    if (!isObject(base2)) {\n      error(\"Second argument to selectionTuples must be an object.\");\n    }\n    return array2.map((x2) => extend(base2.fields ? {\n      values: base2.fields.map((f) => getter(f)(x2.datum))\n    } : {\n      [SelectionId]: $selectionId(x2.datum)\n    }, base2));\n  }\n  function selectionResolve(name, op, isMulti, vl5) {\n    var data2 = this.context.data[name], entries = data2 ? data2.values.value : [], resolved = {}, multiRes = {}, types2 = {}, entry2, fields, values2, unit2, field2, value2, res, resUnit, type2, union2, n = entries.length, i = 0, j, m2;\n    for (; i < n; ++i) {\n      entry2 = entries[i];\n      unit2 = entry2.unit;\n      fields = entry2.fields;\n      values2 = entry2.values;\n      if (fields && values2) {\n        for (j = 0, m2 = fields.length; j < m2; ++j) {\n          field2 = fields[j];\n          res = resolved[field2.field] || (resolved[field2.field] = {});\n          resUnit = res[unit2] || (res[unit2] = []);\n          types2[field2.field] = type2 = field2.type.charAt(0);\n          union2 = ops[`${type2}_union`];\n          res[unit2] = union2(resUnit, array$4(values2[j]));\n        }\n        if (isMulti) {\n          resUnit = multiRes[unit2] || (multiRes[unit2] = []);\n          resUnit.push(array$4(values2).reduce((obj2, curr, j2) => (obj2[fields[j2].field] = curr, obj2), {}));\n        }\n      } else {\n        field2 = SelectionId;\n        value2 = $selectionId(entry2);\n        res = resolved[field2] || (resolved[field2] = {});\n        resUnit = res[unit2] || (res[unit2] = []);\n        resUnit.push(value2);\n        if (isMulti) {\n          resUnit = multiRes[unit2] || (multiRes[unit2] = []);\n          resUnit.push({\n            [SelectionId]: value2\n          });\n        }\n      }\n    }\n    op = op || Union;\n    if (resolved[SelectionId]) {\n      resolved[SelectionId] = ops[`${SelectionId}_${op}`](...Object.values(resolved[SelectionId]));\n    } else {\n      Object.keys(resolved).forEach((field3) => {\n        resolved[field3] = Object.keys(resolved[field3]).map((unit3) => resolved[field3][unit3]).reduce((acc, curr) => acc === void 0 ? curr : ops[`${types2[field3]}_${op}`](acc, curr));\n      });\n    }\n    entries = Object.keys(multiRes);\n    if (isMulti && entries.length) {\n      const key2 = vl5 ? VlPoint : VlMulti;\n      resolved[key2] = op === Union ? {\n        [Or]: entries.reduce((acc, k) => (acc.push(...multiRes[k]), acc), [])\n      } : {\n        [And]: entries.map((k) => ({\n          [Or]: multiRes[k]\n        }))\n      };\n    }\n    return resolved;\n  }\n  var ops = {\n    [`${SelectionId}_union`]: union,\n    [`${SelectionId}_intersect`]: intersection,\n    E_union: function(base2, value2) {\n      if (!base2.length) return value2;\n      var i = 0, n = value2.length;\n      for (; i < n; ++i) if (!base2.includes(value2[i])) base2.push(value2[i]);\n      return base2;\n    },\n    E_intersect: function(base2, value2) {\n      return !base2.length ? value2 : base2.filter((v) => value2.includes(v));\n    },\n    R_union: function(base2, value2) {\n      var lo = toNumber(value2[0]), hi = toNumber(value2[1]);\n      if (lo > hi) {\n        lo = value2[1];\n        hi = value2[0];\n      }\n      if (!base2.length) return [lo, hi];\n      if (base2[0] > lo) base2[0] = lo;\n      if (base2[1] < hi) base2[1] = hi;\n      return base2;\n    },\n    R_intersect: function(base2, value2) {\n      var lo = toNumber(value2[0]), hi = toNumber(value2[1]);\n      if (lo > hi) {\n        lo = value2[1];\n        hi = value2[0];\n      }\n      if (!base2.length) return [lo, hi];\n      if (hi < base2[0] || base2[1] < lo) {\n        return [];\n      } else {\n        if (base2[0] < lo) base2[0] = lo;\n        if (base2[1] > hi) base2[1] = hi;\n      }\n      return base2;\n    }\n  };\n  const DataPrefix$1 = \":\", IndexPrefix$1 = \"@\";\n  function selectionVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) error(\"First argument to selection functions must be a string literal.\");\n    const data2 = args[0].value, op = args.length >= 2 && peek$1(args).value, field2 = \"unit\", indexName = IndexPrefix$1 + field2, dataName = DataPrefix$1 + data2;\n    if (op === Intersect && !has$1(params2, indexName)) {\n      params2[indexName] = scope.getData(data2).indataRef(scope, field2);\n    }\n    if (!has$1(params2, dataName)) {\n      params2[dataName] = scope.getData(data2).tuplesRef();\n    }\n  }\n  function data$1(name) {\n    const data2 = this.context.data[name];\n    return data2 ? data2.values.value : [];\n  }\n  function indata(name, field2, value2) {\n    const index2 = this.context.data[name][\"index:\" + field2], entry2 = index2 ? index2.value.get(value2) : void 0;\n    return entry2 ? entry2.count : entry2;\n  }\n  function setdata(name, tuples) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input;\n    df.pulse(input, df.changeset().remove(truthy).insert(tuples));\n    return 1;\n  }\n  function encode(item, name, retval) {\n    if (item) {\n      const df = this.context.dataflow, target2 = item.mark.source;\n      df.pulse(target2, df.changeset().encode(item, name));\n    }\n    return retval !== void 0 ? retval : item;\n  }\n  const wrap = (method2) => function(value2, spec) {\n    const locale2 = this.context.dataflow.locale();\n    return value2 === null ? \"null\" : locale2[method2](spec)(value2);\n  };\n  const format = wrap(\"format\");\n  const timeFormat = wrap(\"timeFormat\");\n  const utcFormat = wrap(\"utcFormat\");\n  const timeParse = wrap(\"timeParse\");\n  const utcParse = wrap(\"utcParse\");\n  const dateObj = new Date(2e3, 0, 1);\n  function time(month, day, specifier) {\n    if (!Number.isInteger(month) || !Number.isInteger(day)) return \"\";\n    dateObj.setYear(2e3);\n    dateObj.setMonth(month);\n    dateObj.setDate(day);\n    return timeFormat.call(this, dateObj, specifier);\n  }\n  function monthFormat(month) {\n    return time.call(this, month, 1, \"%B\");\n  }\n  function monthAbbrevFormat(month) {\n    return time.call(this, month, 1, \"%b\");\n  }\n  function dayFormat(day) {\n    return time.call(this, 0, 2 + day, \"%A\");\n  }\n  function dayAbbrevFormat(day) {\n    return time.call(this, 0, 2 + day, \"%a\");\n  }\n  const DataPrefix = \":\";\n  const IndexPrefix = \"@\";\n  const ScalePrefix = \"%\";\n  const SignalPrefix = \"$\";\n  function dataVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) {\n      error(\"First argument to data functions must be a string literal.\");\n    }\n    const data2 = args[0].value, dataName = DataPrefix + data2;\n    if (!has$1(dataName, params2)) {\n      try {\n        params2[dataName] = scope.getData(data2).tuplesRef();\n      } catch (err) {\n      }\n    }\n  }\n  function indataVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) error(\"First argument to indata must be a string literal.\");\n    if (args[1].type !== Literal) error(\"Second argument to indata must be a string literal.\");\n    const data2 = args[0].value, field2 = args[1].value, indexName = IndexPrefix + field2;\n    if (!has$1(indexName, params2)) {\n      params2[indexName] = scope.getData(data2).indataRef(scope, field2);\n    }\n  }\n  function scaleVisitor(name, args, scope, params2) {\n    if (args[0].type === Literal) {\n      addScaleDependency(scope, params2, args[0].value);\n    } else {\n      for (name in scope.scales) {\n        addScaleDependency(scope, params2, name);\n      }\n    }\n  }\n  function addScaleDependency(scope, params2, name) {\n    const scaleName = ScalePrefix + name;\n    if (!has$1(params2, scaleName)) {\n      try {\n        params2[scaleName] = scope.scaleRef(name);\n      } catch (err) {\n      }\n    }\n  }\n  function getScale(nameOrFunction, ctx) {\n    if (isString(nameOrFunction)) {\n      const maybeScale = ctx.scales[nameOrFunction];\n      return maybeScale && isRegisteredScale(maybeScale.value) ? maybeScale.value : void 0;\n    } else if (isFunction(nameOrFunction)) {\n      return isRegisteredScale(nameOrFunction) ? nameOrFunction : void 0;\n    }\n    return void 0;\n  }\n  function internalScaleFunctions(codegen2, fnctx, visitors) {\n    fnctx.__bandwidth = (s2) => s2 && s2.bandwidth ? s2.bandwidth() : 0;\n    visitors._bandwidth = scaleVisitor;\n    visitors._range = scaleVisitor;\n    visitors._scale = scaleVisitor;\n    const ref2 = (arg) => \"_[\" + (arg.type === Literal ? $(ScalePrefix + arg.value) : $(ScalePrefix) + \"+\" + codegen2(arg)) + \"]\";\n    return {\n      _bandwidth: (args) => `this.__bandwidth(${ref2(args[0])})`,\n      _range: (args) => `${ref2(args[0])}.range()`,\n      _scale: (args) => `${ref2(args[0])}(${codegen2(args[1])})`\n    };\n  }\n  function geoMethod(methodName, globalMethod) {\n    return function(projection2, geojson, group2) {\n      if (projection2) {\n        const p = getScale(projection2, (group2 || this).context);\n        return p && p.path[methodName](geojson);\n      } else {\n        return globalMethod(geojson);\n      }\n    };\n  }\n  const geoArea = geoMethod(\"area\", geoArea$1);\n  const geoBounds = geoMethod(\"bounds\", geoBounds$1);\n  const geoCentroid = geoMethod(\"centroid\", geoCentroid$1);\n  function geoScale(projection2, group2) {\n    const p = getScale(projection2, (group2 || this).context);\n    return p && p.scale();\n  }\n  function inScope(item) {\n    const group2 = this.context.group;\n    let value2 = false;\n    if (group2) while (item) {\n      if (item === group2) {\n        value2 = true;\n        break;\n      }\n      item = item.mark.group;\n    }\n    return value2;\n  }\n  function log(df, method2, args) {\n    try {\n      df[method2].apply(df, [\"EXPRESSION\"].concat([].slice.call(args)));\n    } catch (err) {\n      df.warn(err);\n    }\n    return args[args.length - 1];\n  }\n  function warn() {\n    return log(this.context.dataflow, \"warn\", arguments);\n  }\n  function info() {\n    return log(this.context.dataflow, \"info\", arguments);\n  }\n  function debug() {\n    return log(this.context.dataflow, \"debug\", arguments);\n  }\n  function channel_luminance_value(channelValue) {\n    const val = channelValue / 255;\n    if (val <= 0.03928) {\n      return val / 12.92;\n    }\n    return Math.pow((val + 0.055) / 1.055, 2.4);\n  }\n  function luminance(color2) {\n    const c2 = rgb$1(color2), r = channel_luminance_value(c2.r), g = channel_luminance_value(c2.g), b2 = channel_luminance_value(c2.b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b2;\n  }\n  function contrast(color1, color2) {\n    const lum1 = luminance(color1), lum2 = luminance(color2), lumL = Math.max(lum1, lum2), lumD = Math.min(lum1, lum2);\n    return (lumL + 0.05) / (lumD + 0.05);\n  }\n  function merge() {\n    const args = [].slice.call(arguments);\n    args.unshift({});\n    return extend(...args);\n  }\n  function equal(a2, b2) {\n    return a2 === b2 || a2 !== a2 && b2 !== b2 ? true : isArray(a2) ? isArray(b2) && a2.length === b2.length ? equalArray(a2, b2) : false : isObject(a2) && isObject(b2) ? equalObject(a2, b2) : false;\n  }\n  function equalArray(a2, b2) {\n    for (let i = 0, n = a2.length; i < n; ++i) {\n      if (!equal(a2[i], b2[i])) return false;\n    }\n    return true;\n  }\n  function equalObject(a2, b2) {\n    for (const key2 in a2) {\n      if (!equal(a2[key2], b2[key2])) return false;\n    }\n    return true;\n  }\n  function removePredicate(props) {\n    return (_) => equalObject(props, _);\n  }\n  function modify(name, insert2, remove2, toggle, modify2, values2) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input, stamp = df.stamp();\n    let changes = data2.changes, predicate, key2;\n    if (df._trigger === false || !(input.value.length || insert2 || toggle)) {\n      return 0;\n    }\n    if (!changes || changes.stamp < stamp) {\n      data2.changes = changes = df.changeset();\n      changes.stamp = stamp;\n      df.runAfter(() => {\n        data2.modified = true;\n        df.pulse(input, changes).run();\n      }, true, 1);\n    }\n    if (remove2) {\n      predicate = remove2 === true ? truthy : isArray(remove2) || isTuple(remove2) ? remove2 : removePredicate(remove2);\n      changes.remove(predicate);\n    }\n    if (insert2) {\n      changes.insert(insert2);\n    }\n    if (toggle) {\n      predicate = removePredicate(toggle);\n      if (input.value.some(predicate)) {\n        changes.remove(predicate);\n      } else {\n        changes.insert(toggle);\n      }\n    }\n    if (modify2) {\n      for (key2 in values2) {\n        changes.modify(modify2, key2, values2[key2]);\n      }\n    }\n    return 1;\n  }\n  function pinchDistance(event2) {\n    const t = event2.touches, dx = t[0].clientX - t[1].clientX, dy = t[0].clientY - t[1].clientY;\n    return Math.hypot(dx, dy);\n  }\n  function pinchAngle(event2) {\n    const t = event2.touches;\n    return Math.atan2(t[0].clientY - t[1].clientY, t[0].clientX - t[1].clientX);\n  }\n  const accessors = {};\n  function pluck(data2, name) {\n    const accessor2 = accessors[name] || (accessors[name] = field$1(name));\n    return isArray(data2) ? data2.map(accessor2) : accessor2(data2);\n  }\n  function array(seq) {\n    return isArray(seq) || ArrayBuffer.isView(seq) ? seq : null;\n  }\n  function sequence(seq) {\n    return array(seq) || (isString(seq) ? seq : null);\n  }\n  function join(seq, ...args) {\n    return array(seq).join(...args);\n  }\n  function indexof(seq, ...args) {\n    return sequence(seq).indexOf(...args);\n  }\n  function lastindexof(seq, ...args) {\n    return sequence(seq).lastIndexOf(...args);\n  }\n  function slice(seq, ...args) {\n    return sequence(seq).slice(...args);\n  }\n  function replace(str, pattern, repl) {\n    if (isFunction(repl)) error(\"Function argument passed to replace.\");\n    if (!isString(pattern) && !isRegExp(pattern)) error(\"Please pass a string or RegExp argument to replace.\");\n    return String(str).replace(pattern, repl);\n  }\n  function reverse(seq) {\n    return array(seq).slice().reverse();\n  }\n  function sort(seq) {\n    return array(seq).slice().sort(ascending$1);\n  }\n  function bandspace(count2, paddingInner, paddingOuter) {\n    return bandSpace(count2 || 0, paddingInner || 0, paddingOuter || 0);\n  }\n  function bandwidth(name, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 && s2.bandwidth ? s2.bandwidth() : 0;\n  }\n  function copy(name, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 ? s2.copy() : void 0;\n  }\n  function domain(name, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 ? s2.domain() : [];\n  }\n  function invert(name, range2, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return !s2 ? void 0 : isArray(range2) ? (s2.invertRange || s2.invert)(range2) : (s2.invert || s2.invertExtent)(range2);\n  }\n  function range$1(name, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 && s2.range ? s2.range() : [];\n  }\n  function scale$2(name, value2, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 ? s2(value2) : void 0;\n  }\n  function scaleGradient(scale2, p02, p1, count2, group2) {\n    scale2 = getScale(scale2, (group2 || this).context);\n    const gradient2 = Gradient$1(p02, p1);\n    let stops = scale2.domain(), min2 = stops[0], max2 = peek$1(stops), fraction = identity$2;\n    if (!(max2 - min2)) {\n      scale2 = (scale2.interpolator ? scale$4(\"sequential\")().interpolator(scale2.interpolator()) : scale$4(\"linear\")().interpolate(scale2.interpolate()).range(scale2.range())).domain([min2 = 0, max2 = 1]);\n    } else {\n      fraction = scaleFraction(scale2, min2, max2);\n    }\n    if (scale2.ticks) {\n      stops = scale2.ticks(+count2 || 15);\n      if (min2 !== stops[0]) stops.unshift(min2);\n      if (max2 !== peek$1(stops)) stops.push(max2);\n    }\n    stops.forEach((_) => gradient2.stop(fraction(_), scale2(_)));\n    return gradient2;\n  }\n  function geoShape(projection2, geojson, group2) {\n    const p = getScale(projection2, (group2 || this).context);\n    return function(context2) {\n      return p ? p.path.context(context2)(geojson) : \"\";\n    };\n  }\n  function pathShape(path2) {\n    let p = null;\n    return function(context2) {\n      return context2 ? pathRender(context2, p = p || parse$3(path2)) : path2;\n    };\n  }\n  const datum = (d2) => d2.data;\n  function treeNodes(name, context2) {\n    const tree2 = data$1.call(context2, name);\n    return tree2.root && tree2.root.lookup || {};\n  }\n  function treePath(name, source2, target2) {\n    const nodes = treeNodes(name, this), s2 = nodes[source2], t = nodes[target2];\n    return s2 && t ? s2.path(t).map(datum) : void 0;\n  }\n  function treeAncestors(name, node) {\n    const n = treeNodes(name, this)[node];\n    return n ? n.ancestors().map(datum) : void 0;\n  }\n  const _window = () => typeof window !== \"undefined\" && window || null;\n  function screen() {\n    const w2 = _window();\n    return w2 ? w2.screen : {};\n  }\n  function windowSize() {\n    const w2 = _window();\n    return w2 ? [w2.innerWidth, w2.innerHeight] : [void 0, void 0];\n  }\n  function containerSize() {\n    const view = this.context.dataflow, el = view.container && view.container();\n    return el ? [el.clientWidth, el.clientHeight] : [void 0, void 0];\n  }\n  function intersect(b2, opt, group2) {\n    if (!b2) return [];\n    const [u2, v] = b2, box2 = new Bounds().set(u2[0], u2[1], v[0], v[1]), scene = group2 || this.context.dataflow.scenegraph().root;\n    return intersect$2(scene, box2, filter(opt));\n  }\n  function filter(opt) {\n    let p = null;\n    if (opt) {\n      const types2 = array$4(opt.marktype), names = array$4(opt.markname);\n      p = (_) => (!types2.length || types2.some((t) => _.marktype === t)) && (!names.length || names.some((s2) => _.name === s2));\n    }\n    return p;\n  }\n  function lassoAppend(lasso, x2, y2, minDist = 5) {\n    lasso = array$4(lasso);\n    const last = lasso[lasso.length - 1];\n    return last === void 0 || Math.hypot(last[0] - x2, last[1] - y2) > minDist ? [...lasso, [x2, y2]] : lasso;\n  }\n  function lassoPath(lasso) {\n    return array$4(lasso).reduce((svg, [x2, y2], i) => {\n      return svg += i == 0 ? `M ${x2},${y2} ` : i === lasso.length - 1 ? \" Z\" : `L ${x2},${y2} `;\n    }, \"\");\n  }\n  function intersectLasso(markname, pixelLasso, unit2) {\n    const {\n      x: x2,\n      y: y2,\n      mark\n    } = unit2;\n    const bb = new Bounds().set(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER);\n    for (const [px2, py2] of pixelLasso) {\n      if (px2 < bb.x1) bb.x1 = px2;\n      if (px2 > bb.x2) bb.x2 = px2;\n      if (py2 < bb.y1) bb.y1 = py2;\n      if (py2 > bb.y2) bb.y2 = py2;\n    }\n    bb.translate(x2, y2);\n    const intersection2 = intersect([[bb.x1, bb.y1], [bb.x2, bb.y2]], markname, mark);\n    return intersection2.filter((tuple) => pointInPolygon(tuple.x, tuple.y, pixelLasso));\n  }\n  function pointInPolygon(testx, testy, polygon) {\n    let intersections = 0;\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n      const [prevX, prevY] = polygon[j];\n      const [x2, y2] = polygon[i];\n      if (y2 > testy != prevY > testy && testx < (prevX - x2) * (testy - y2) / (prevY - y2) + x2) {\n        intersections++;\n      }\n    }\n    return intersections & 1;\n  }\n  const functionContext = {\n    random() {\n      return random();\n    },\n    // override default\n    cumulativeNormal,\n    cumulativeLogNormal,\n    cumulativeUniform,\n    densityNormal,\n    densityLogNormal,\n    densityUniform,\n    quantileNormal,\n    quantileLogNormal,\n    quantileUniform,\n    sampleNormal,\n    sampleLogNormal,\n    sampleUniform,\n    isArray,\n    isBoolean: isBoolean$1,\n    isDate: isDate$1,\n    isDefined(_) {\n      return _ !== void 0;\n    },\n    isNumber: isNumber$1,\n    isObject,\n    isRegExp,\n    isString,\n    isTuple,\n    isValid(_) {\n      return _ != null && _ === _;\n    },\n    toBoolean,\n    toDate(_) {\n      return toDate(_);\n    },\n    // suppress extra arguments\n    toNumber,\n    toString,\n    indexof,\n    join,\n    lastindexof,\n    replace,\n    reverse,\n    sort,\n    slice,\n    flush,\n    lerp,\n    merge,\n    pad: pad$1,\n    peek: peek$1,\n    pluck,\n    span,\n    inrange,\n    truncate: truncate$1,\n    rgb: rgb$1,\n    lab: lab$1,\n    hcl: hcl$1,\n    hsl: hsl$1,\n    luminance,\n    contrast,\n    sequence: range$3,\n    format,\n    utcFormat,\n    utcParse,\n    utcOffset,\n    utcSequence,\n    timeFormat,\n    timeParse,\n    timeOffset,\n    timeSequence,\n    timeUnitSpecifier,\n    monthFormat,\n    monthAbbrevFormat,\n    dayFormat,\n    dayAbbrevFormat,\n    quarter,\n    utcquarter,\n    week,\n    utcweek,\n    dayofyear,\n    utcdayofyear,\n    warn,\n    info,\n    debug,\n    extent(_) {\n      return extent(_);\n    },\n    // suppress extra arguments\n    inScope,\n    intersect,\n    clampRange,\n    pinchDistance,\n    pinchAngle,\n    screen,\n    containerSize,\n    windowSize,\n    bandspace,\n    setdata,\n    pathShape,\n    panLinear,\n    panLog,\n    panPow,\n    panSymlog,\n    zoomLinear,\n    zoomLog,\n    zoomPow,\n    zoomSymlog,\n    encode,\n    modify,\n    lassoAppend,\n    lassoPath,\n    intersectLasso\n  };\n  const eventFunctions = [\"view\", \"item\", \"group\", \"xy\", \"x\", \"y\"], eventPrefix = \"event.vega.\", thisPrefix = \"this.\", astVisitors = {};\n  const codegenParams = {\n    forbidden: [\"_\"],\n    allowed: [\"datum\", \"event\", \"item\"],\n    fieldvar: \"datum\",\n    globalvar: (id2) => `_[${$(SignalPrefix + id2)}]`,\n    functions: buildFunctions,\n    constants: Constants,\n    visitors: astVisitors\n  };\n  const codeGenerator = codegen(codegenParams);\n  function buildFunctions(codegen2) {\n    const fn2 = Functions(codegen2);\n    eventFunctions.forEach((name) => fn2[name] = eventPrefix + name);\n    for (const name in functionContext) {\n      fn2[name] = thisPrefix + name;\n    }\n    extend(fn2, internalScaleFunctions(codegen2, functionContext, astVisitors));\n    return fn2;\n  }\n  function expressionFunction(name, fn2, visitor) {\n    if (arguments.length === 1) {\n      return functionContext[name];\n    }\n    functionContext[name] = fn2;\n    if (visitor) astVisitors[name] = visitor;\n    if (codeGenerator) codeGenerator.functions[name] = thisPrefix + name;\n    return this;\n  }\n  expressionFunction(\"bandwidth\", bandwidth, scaleVisitor);\n  expressionFunction(\"copy\", copy, scaleVisitor);\n  expressionFunction(\"domain\", domain, scaleVisitor);\n  expressionFunction(\"range\", range$1, scaleVisitor);\n  expressionFunction(\"invert\", invert, scaleVisitor);\n  expressionFunction(\"scale\", scale$2, scaleVisitor);\n  expressionFunction(\"gradient\", scaleGradient, scaleVisitor);\n  expressionFunction(\"geoArea\", geoArea, scaleVisitor);\n  expressionFunction(\"geoBounds\", geoBounds, scaleVisitor);\n  expressionFunction(\"geoCentroid\", geoCentroid, scaleVisitor);\n  expressionFunction(\"geoShape\", geoShape, scaleVisitor);\n  expressionFunction(\"geoScale\", geoScale, scaleVisitor);\n  expressionFunction(\"indata\", indata, indataVisitor);\n  expressionFunction(\"data\", data$1, dataVisitor);\n  expressionFunction(\"treePath\", treePath, dataVisitor);\n  expressionFunction(\"treeAncestors\", treeAncestors, dataVisitor);\n  expressionFunction(\"vlSelectionTest\", selectionTest, selectionVisitor);\n  expressionFunction(\"vlSelectionIdTest\", selectionIdTest, selectionVisitor);\n  expressionFunction(\"vlSelectionResolve\", selectionResolve, selectionVisitor);\n  expressionFunction(\"vlSelectionTuples\", selectionTuples);\n  function parser(expr2, scope) {\n    const params2 = {};\n    let ast;\n    try {\n      expr2 = isString(expr2) ? expr2 : $(expr2) + \"\";\n      ast = parser$1(expr2);\n    } catch (err) {\n      error(\"Expression parse error: \" + expr2);\n    }\n    ast.visit((node) => {\n      if (node.type !== CallExpression) return;\n      const name = node.callee.name, visit2 = codegenParams.visitors[name];\n      if (visit2) visit2(name, node.arguments, scope, params2);\n    });\n    const gen = codeGenerator(ast);\n    gen.globals.forEach((name) => {\n      const signalName = SignalPrefix + name;\n      if (!has$1(params2, signalName) && scope.getSignal(name)) {\n        params2[signalName] = scope.signalRef(name);\n      }\n    });\n    return {\n      $expr: extend({\n        code: gen.code\n      }, scope.options.ast ? {\n        ast\n      } : null),\n      $fields: gen.fields,\n      $params: params2\n    };\n  }\n  function parse$2(spec) {\n    const ctx = this, operators = spec.operators || [];\n    if (spec.background) {\n      ctx.background = spec.background;\n    }\n    if (spec.eventConfig) {\n      ctx.eventConfig = spec.eventConfig;\n    }\n    if (spec.locale) {\n      ctx.locale = spec.locale;\n    }\n    operators.forEach((entry2) => ctx.parseOperator(entry2));\n    operators.forEach((entry2) => ctx.parseOperatorParameters(entry2));\n    (spec.streams || []).forEach((entry2) => ctx.parseStream(entry2));\n    (spec.updates || []).forEach((entry2) => ctx.parseUpdate(entry2));\n    return ctx.resolve();\n  }\n  const Skip$2 = toSet([\"rule\"]), Swap = toSet([\"group\", \"image\", \"rect\"]);\n  function adjustSpatial(encode2, marktype) {\n    let code = \"\";\n    if (Skip$2[marktype]) return code;\n    if (encode2.x2) {\n      if (encode2.x) {\n        if (Swap[marktype]) {\n          code += \"if(o.x>o.x2)$=o.x,o.x=o.x2,o.x2=$;\";\n        }\n        code += \"o.width=o.x2-o.x;\";\n      } else {\n        code += \"o.x=o.x2-(o.width||0);\";\n      }\n    }\n    if (encode2.xc) {\n      code += \"o.x=o.xc-(o.width||0)/2;\";\n    }\n    if (encode2.y2) {\n      if (encode2.y) {\n        if (Swap[marktype]) {\n          code += \"if(o.y>o.y2)$=o.y,o.y=o.y2,o.y2=$;\";\n        }\n        code += \"o.height=o.y2-o.y;\";\n      } else {\n        code += \"o.y=o.y2-(o.height||0);\";\n      }\n    }\n    if (encode2.yc) {\n      code += \"o.y=o.yc-(o.height||0)/2;\";\n    }\n    return code;\n  }\n  function canonicalType(type2) {\n    return (type2 + \"\").toLowerCase();\n  }\n  function isOperator(type2) {\n    return canonicalType(type2) === \"operator\";\n  }\n  function isCollect(type2) {\n    return canonicalType(type2) === \"collect\";\n  }\n  function expression(ctx, args, code) {\n    if (!code.endsWith(\";\")) {\n      code = \"return(\" + code + \");\";\n    }\n    const fn2 = Function(...args.concat(code));\n    return ctx && ctx.functions ? fn2.bind(ctx.functions) : fn2;\n  }\n  function _compare(u2, v, lt, gt) {\n    return `((u = ${u2}) < (v = ${v}) || u == null) && v != null ? ${lt}\n  : (u > v || v == null) && u != null ? ${gt}\n  : ((v = v instanceof Date ? +v : v), (u = u instanceof Date ? +u : u)) !== u && v === v ? ${lt}\n  : v !== v && u === u ? ${gt} : `;\n  }\n  var expressionCodegen = {\n    /**\n     * Parse an expression used to update an operator value.\n     */\n    operator: (ctx, expr2) => expression(ctx, [\"_\"], expr2.code),\n    /**\n     * Parse an expression provided as an operator parameter value.\n     */\n    parameter: (ctx, expr2) => expression(ctx, [\"datum\", \"_\"], expr2.code),\n    /**\n     * Parse an expression applied to an event stream.\n     */\n    event: (ctx, expr2) => expression(ctx, [\"event\"], expr2.code),\n    /**\n     * Parse an expression used to handle an event-driven operator update.\n     */\n    handler: (ctx, expr2) => {\n      const code = `var datum=event.item&&event.item.datum;return ${expr2.code};`;\n      return expression(ctx, [\"_\", \"event\"], code);\n    },\n    /**\n     * Parse an expression that performs visual encoding.\n     */\n    encode: (ctx, encode2) => {\n      const {\n        marktype,\n        channels\n      } = encode2;\n      let code = \"var o=item,datum=o.datum,m=0,$;\";\n      for (const name in channels) {\n        const o = \"o[\" + $(name) + \"]\";\n        code += `$=${channels[name].code};if(${o}!==$)${o}=$,m=1;`;\n      }\n      code += adjustSpatial(channels, marktype);\n      code += \"return m;\";\n      return expression(ctx, [\"item\", \"_\"], code);\n    },\n    /**\n     * Optimized code generators for access and comparison.\n     */\n    codegen: {\n      get(path2) {\n        const ref2 = `[${path2.map($).join(\"][\")}]`;\n        const get2 = Function(\"_\", `return _${ref2};`);\n        get2.path = ref2;\n        return get2;\n      },\n      comparator(fields, orders) {\n        let t;\n        const map2 = (f, i) => {\n          const o = orders[i];\n          let u2, v;\n          if (f.path) {\n            u2 = `a${f.path}`;\n            v = `b${f.path}`;\n          } else {\n            (t = t || {})[\"f\" + i] = f;\n            u2 = `this.f${i}(a)`;\n            v = `this.f${i}(b)`;\n          }\n          return _compare(u2, v, -o, o);\n        };\n        const fn2 = Function(\"a\", \"b\", \"var u, v; return \" + fields.map(map2).join(\"\") + \"0;\");\n        return t ? fn2.bind(t) : fn2;\n      }\n    }\n  };\n  function parseOperator(spec) {\n    const ctx = this;\n    if (isOperator(spec.type) || !spec.type) {\n      ctx.operator(spec, spec.update ? ctx.operatorExpression(spec.update) : null);\n    } else {\n      ctx.transform(spec, spec.type);\n    }\n  }\n  function parseOperatorParameters(spec) {\n    const ctx = this;\n    if (spec.params) {\n      const op = ctx.get(spec.id);\n      if (!op) error(\"Invalid operator id: \" + spec.id);\n      ctx.dataflow.connect(op, op.parameters(ctx.parseParameters(spec.params), spec.react, spec.initonly));\n    }\n  }\n  function parseParameters$1(spec, params2) {\n    params2 = params2 || {};\n    const ctx = this;\n    for (const key2 in spec) {\n      const value2 = spec[key2];\n      params2[key2] = isArray(value2) ? value2.map((v) => parseParameter$2(v, ctx, params2)) : parseParameter$2(value2, ctx, params2);\n    }\n    return params2;\n  }\n  function parseParameter$2(spec, ctx, params2) {\n    if (!spec || !isObject(spec)) return spec;\n    for (let i = 0, n = PARSERS.length, p; i < n; ++i) {\n      p = PARSERS[i];\n      if (has$1(spec, p.key)) {\n        return p.parse(spec, ctx, params2);\n      }\n    }\n    return spec;\n  }\n  var PARSERS = [{\n    key: \"$ref\",\n    parse: getOperator\n  }, {\n    key: \"$key\",\n    parse: getKey\n  }, {\n    key: \"$expr\",\n    parse: getExpression\n  }, {\n    key: \"$field\",\n    parse: getField\n  }, {\n    key: \"$encode\",\n    parse: getEncode\n  }, {\n    key: \"$compare\",\n    parse: getCompare\n  }, {\n    key: \"$context\",\n    parse: getContext\n  }, {\n    key: \"$subflow\",\n    parse: getSubflow\n  }, {\n    key: \"$tupleid\",\n    parse: getTupleId\n  }];\n  function getOperator(_, ctx) {\n    return ctx.get(_.$ref) || error(\"Operator not defined: \" + _.$ref);\n  }\n  function getExpression(_, ctx, params2) {\n    if (_.$params) {\n      ctx.parseParameters(_.$params, params2);\n    }\n    const k = \"e:\" + _.$expr.code;\n    return ctx.fn[k] || (ctx.fn[k] = accessor(ctx.parameterExpression(_.$expr), _.$fields));\n  }\n  function getKey(_, ctx) {\n    const k = \"k:\" + _.$key + \"_\" + !!_.$flat;\n    return ctx.fn[k] || (ctx.fn[k] = key(_.$key, _.$flat, ctx.expr.codegen));\n  }\n  function getField(_, ctx) {\n    if (!_.$field) return null;\n    const k = \"f:\" + _.$field + \"_\" + _.$name;\n    return ctx.fn[k] || (ctx.fn[k] = field$1(_.$field, _.$name, ctx.expr.codegen));\n  }\n  function getCompare(_, ctx) {\n    const k = \"c:\" + _.$compare + \"_\" + _.$order, c2 = array$4(_.$compare).map((_2) => _2 && _2.$tupleid ? tupleid : _2);\n    return ctx.fn[k] || (ctx.fn[k] = compare$1(c2, _.$order, ctx.expr.codegen));\n  }\n  function getEncode(_, ctx) {\n    const spec = _.$encode, encode2 = {};\n    for (const name in spec) {\n      const enc = spec[name];\n      encode2[name] = accessor(ctx.encodeExpression(enc.$expr), enc.$fields);\n      encode2[name].output = enc.$output;\n    }\n    return encode2;\n  }\n  function getContext(_, ctx) {\n    return ctx;\n  }\n  function getSubflow(_, ctx) {\n    const spec = _.$subflow;\n    return function(dataflow, key2, parent) {\n      const subctx = ctx.fork().parse(spec), op = subctx.get(spec.operators[0].id), p = subctx.signals.parent;\n      if (p) p.set(parent);\n      op.detachSubflow = () => ctx.detach(subctx);\n      return op;\n    };\n  }\n  function getTupleId() {\n    return tupleid;\n  }\n  function parseStream$2(spec) {\n    var ctx = this, filter2 = spec.filter != null ? ctx.eventExpression(spec.filter) : void 0, stream2 = spec.stream != null ? ctx.get(spec.stream) : void 0, args;\n    if (spec.source) {\n      stream2 = ctx.events(spec.source, spec.type, filter2);\n    } else if (spec.merge) {\n      args = spec.merge.map((_) => ctx.get(_));\n      stream2 = args[0].merge.apply(args[0], args.slice(1));\n    }\n    if (spec.between) {\n      args = spec.between.map((_) => ctx.get(_));\n      stream2 = stream2.between(args[0], args[1]);\n    }\n    if (spec.filter) {\n      stream2 = stream2.filter(filter2);\n    }\n    if (spec.throttle != null) {\n      stream2 = stream2.throttle(+spec.throttle);\n    }\n    if (spec.debounce != null) {\n      stream2 = stream2.debounce(+spec.debounce);\n    }\n    if (stream2 == null) {\n      error(\"Invalid stream definition: \" + JSON.stringify(spec));\n    }\n    if (spec.consume) stream2.consume(true);\n    ctx.stream(spec, stream2);\n  }\n  function parseUpdate$1(spec) {\n    var ctx = this, srcid = isObject(srcid = spec.source) ? srcid.$ref : srcid, source2 = ctx.get(srcid), target2 = null, update2 = spec.update, params2 = void 0;\n    if (!source2) error(\"Source not defined: \" + spec.source);\n    target2 = spec.target && spec.target.$expr ? ctx.eventExpression(spec.target.$expr) : ctx.get(spec.target);\n    if (update2 && update2.$expr) {\n      if (update2.$params) {\n        params2 = ctx.parseParameters(update2.$params);\n      }\n      update2 = ctx.handlerExpression(update2.$expr);\n    }\n    ctx.update(spec, source2, target2, update2, params2);\n  }\n  const SKIP = {\n    skip: true\n  };\n  function getState$1(options2) {\n    var ctx = this, state = {};\n    if (options2.signals) {\n      var signals = state.signals = {};\n      Object.keys(ctx.signals).forEach((key2) => {\n        const op = ctx.signals[key2];\n        if (options2.signals(key2, op)) {\n          signals[key2] = op.value;\n        }\n      });\n    }\n    if (options2.data) {\n      var data2 = state.data = {};\n      Object.keys(ctx.data).forEach((key2) => {\n        const dataset = ctx.data[key2];\n        if (options2.data(key2, dataset)) {\n          data2[key2] = dataset.input.value;\n        }\n      });\n    }\n    if (ctx.subcontext && options2.recurse !== false) {\n      state.subcontext = ctx.subcontext.map((ctx2) => ctx2.getState(options2));\n    }\n    return state;\n  }\n  function setState$1(state) {\n    var ctx = this, df = ctx.dataflow, data2 = state.data, signals = state.signals;\n    Object.keys(signals || {}).forEach((key2) => {\n      df.update(ctx.signals[key2], signals[key2], SKIP);\n    });\n    Object.keys(data2 || {}).forEach((key2) => {\n      df.pulse(ctx.data[key2].input, df.changeset().remove(truthy).insert(data2[key2]));\n    });\n    (state.subcontext || []).forEach((substate, i) => {\n      const subctx = ctx.subcontext[i];\n      if (subctx) subctx.setState(substate);\n    });\n  }\n  function context(df, transforms2, functions, expr2) {\n    return new Context(df, transforms2, functions, expr2);\n  }\n  function Context(df, transforms2, functions, expr2) {\n    this.dataflow = df;\n    this.transforms = transforms2;\n    this.events = df.events.bind(df);\n    this.expr = expr2 || expressionCodegen, this.signals = {};\n    this.scales = {};\n    this.nodes = {};\n    this.data = {};\n    this.fn = {};\n    if (functions) {\n      this.functions = Object.create(functions);\n      this.functions.context = this;\n    }\n  }\n  function Subcontext(ctx) {\n    this.dataflow = ctx.dataflow;\n    this.transforms = ctx.transforms;\n    this.events = ctx.events;\n    this.expr = ctx.expr;\n    this.signals = Object.create(ctx.signals);\n    this.scales = Object.create(ctx.scales);\n    this.nodes = Object.create(ctx.nodes);\n    this.data = Object.create(ctx.data);\n    this.fn = Object.create(ctx.fn);\n    if (ctx.functions) {\n      this.functions = Object.create(ctx.functions);\n      this.functions.context = this;\n    }\n  }\n  Context.prototype = Subcontext.prototype = {\n    fork() {\n      const ctx = new Subcontext(this);\n      (this.subcontext || (this.subcontext = [])).push(ctx);\n      return ctx;\n    },\n    detach(ctx) {\n      this.subcontext = this.subcontext.filter((c2) => c2 !== ctx);\n      const keys2 = Object.keys(ctx.nodes);\n      for (const key2 of keys2) ctx.nodes[key2]._targets = null;\n      for (const key2 of keys2) ctx.nodes[key2].detach();\n      ctx.nodes = null;\n    },\n    get(id2) {\n      return this.nodes[id2];\n    },\n    set(id2, node) {\n      return this.nodes[id2] = node;\n    },\n    add(spec, op) {\n      const ctx = this, df = ctx.dataflow, data2 = spec.value;\n      ctx.set(spec.id, op);\n      if (isCollect(spec.type) && data2) {\n        if (data2.$ingest) {\n          df.ingest(op, data2.$ingest, data2.$format);\n        } else if (data2.$request) {\n          df.preload(op, data2.$request, data2.$format);\n        } else {\n          df.pulse(op, df.changeset().insert(data2));\n        }\n      }\n      if (spec.root) {\n        ctx.root = op;\n      }\n      if (spec.parent) {\n        let p = ctx.get(spec.parent.$ref);\n        if (p) {\n          df.connect(p, [op]);\n          op.targets().add(p);\n        } else {\n          (ctx.unresolved = ctx.unresolved || []).push(() => {\n            p = ctx.get(spec.parent.$ref);\n            df.connect(p, [op]);\n            op.targets().add(p);\n          });\n        }\n      }\n      if (spec.signal) {\n        ctx.signals[spec.signal] = op;\n      }\n      if (spec.scale) {\n        ctx.scales[spec.scale] = op;\n      }\n      if (spec.data) {\n        for (const name in spec.data) {\n          const data3 = ctx.data[name] || (ctx.data[name] = {});\n          spec.data[name].forEach((role) => data3[role] = op);\n        }\n      }\n    },\n    resolve() {\n      (this.unresolved || []).forEach((fn2) => fn2());\n      delete this.unresolved;\n      return this;\n    },\n    operator(spec, update2) {\n      this.add(spec, this.dataflow.add(spec.value, update2));\n    },\n    transform(spec, type2) {\n      this.add(spec, this.dataflow.add(this.transforms[canonicalType(type2)]));\n    },\n    stream(spec, stream2) {\n      this.set(spec.id, stream2);\n    },\n    update(spec, stream2, target2, update2, params2) {\n      this.dataflow.on(stream2, target2, update2, params2, spec.options);\n    },\n    // expression parsing\n    operatorExpression(expr2) {\n      return this.expr.operator(this, expr2);\n    },\n    parameterExpression(expr2) {\n      return this.expr.parameter(this, expr2);\n    },\n    eventExpression(expr2) {\n      return this.expr.event(this, expr2);\n    },\n    handlerExpression(expr2) {\n      return this.expr.handler(this, expr2);\n    },\n    encodeExpression(encode2) {\n      return this.expr.encode(this, encode2);\n    },\n    // parse methods\n    parse: parse$2,\n    parseOperator,\n    parseOperatorParameters,\n    parseParameters: parseParameters$1,\n    parseStream: parseStream$2,\n    parseUpdate: parseUpdate$1,\n    // state methods\n    getState: getState$1,\n    setState: setState$1\n  };\n  function initializeAria(view) {\n    const el = view.container();\n    if (el) {\n      el.setAttribute(\"role\", \"graphics-document\");\n      el.setAttribute(\"aria-roleDescription\", \"visualization\");\n      ariaLabel(el, view.description());\n    }\n  }\n  function ariaLabel(el, desc) {\n    if (el) desc == null ? el.removeAttribute(\"aria-label\") : el.setAttribute(\"aria-label\", desc);\n  }\n  function background(view) {\n    view.add(null, (_) => {\n      view._background = _.bg;\n      view._resize = 1;\n      return _.bg;\n    }, {\n      bg: view._signals.background\n    });\n  }\n  const Default = \"default\";\n  function cursor(view) {\n    const cursor2 = view._signals.cursor || (view._signals.cursor = view.add({\n      user: Default,\n      item: null\n    }));\n    view.on(view.events(\"view\", \"pointermove\"), cursor2, (_, event2) => {\n      const value2 = cursor2.value, user = value2 ? isString(value2) ? value2 : value2.user : Default, item = event2.item && event2.item.cursor || null;\n      return value2 && user === value2.user && item == value2.item ? value2 : {\n        user,\n        item\n      };\n    });\n    view.add(null, function(_) {\n      let user = _.cursor, item = this.value;\n      if (!isString(user)) {\n        item = user.item;\n        user = user.user;\n      }\n      setCursor(view, user && user !== Default ? user : item || user);\n      return item;\n    }, {\n      cursor: cursor2\n    });\n  }\n  function setCursor(view, cursor2) {\n    const el = view.globalCursor() ? typeof document !== \"undefined\" && document.body : view.container();\n    if (el) {\n      return cursor2 == null ? el.style.removeProperty(\"cursor\") : el.style.cursor = cursor2;\n    }\n  }\n  function dataref(view, name) {\n    var data2 = view._runtime.data;\n    if (!has$1(data2, name)) {\n      error(\"Unrecognized data set: \" + name);\n    }\n    return data2[name];\n  }\n  function data(name, values2) {\n    return arguments.length < 2 ? dataref(this, name).values.value : change.call(this, name, changeset().remove(truthy).insert(values2));\n  }\n  function change(name, changes) {\n    if (!isChangeSet(changes)) {\n      error(\"Second argument to changes must be a changeset.\");\n    }\n    const dataset = dataref(this, name);\n    dataset.modified = true;\n    return this.pulse(dataset.input, changes);\n  }\n  function insert(name, _) {\n    return change.call(this, name, changeset().insert(_));\n  }\n  function remove(name, _) {\n    return change.call(this, name, changeset().remove(_));\n  }\n  function width(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewWidth + padding2.left + padding2.right);\n  }\n  function height(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewHeight + padding2.top + padding2.bottom);\n  }\n  function offset(view) {\n    var padding2 = view.padding(), origin = view._origin;\n    return [padding2.left + origin[0], padding2.top + origin[1]];\n  }\n  function resizeRenderer(view) {\n    var origin = offset(view), w2 = width(view), h2 = height(view);\n    view._renderer.background(view.background());\n    view._renderer.resize(w2, h2, origin);\n    view._handler.origin(origin);\n    view._resizeListeners.forEach((handler) => {\n      try {\n        handler(w2, h2);\n      } catch (error2) {\n        view.error(error2);\n      }\n    });\n  }\n  function eventExtend(view, event2, item) {\n    var r = view._renderer, el = r && r.canvas(), p, e, translate2;\n    if (el) {\n      translate2 = offset(view);\n      e = event2.changedTouches ? event2.changedTouches[0] : event2;\n      p = point(e, el);\n      p[0] -= translate2[0];\n      p[1] -= translate2[1];\n    }\n    event2.dataflow = view;\n    event2.item = item;\n    event2.vega = extension(view, item, p);\n    return event2;\n  }\n  function extension(view, item, point2) {\n    const itemGroup = item ? item.mark.marktype === \"group\" ? item : item.mark.group : null;\n    function group2(name) {\n      var g = itemGroup, i;\n      if (name) for (i = item; i; i = i.mark.group) {\n        if (i.mark.name === name) {\n          g = i;\n          break;\n        }\n      }\n      return g && g.mark && g.mark.interactive ? g : {};\n    }\n    function xy(item2) {\n      if (!item2) return point2;\n      if (isString(item2)) item2 = group2(item2);\n      const p = point2.slice();\n      while (item2) {\n        p[0] -= item2.x || 0;\n        p[1] -= item2.y || 0;\n        item2 = item2.mark && item2.mark.group;\n      }\n      return p;\n    }\n    return {\n      view: constant$4(view),\n      item: constant$4(item || {}),\n      group: group2,\n      xy,\n      x: (item2) => xy(item2)[0],\n      y: (item2) => xy(item2)[1]\n    };\n  }\n  const VIEW$1 = \"view\", TIMER = \"timer\", WINDOW = \"window\", NO_TRAP = {\n    trap: false\n  };\n  function initializeEventConfig(config) {\n    const events2 = extend({\n      defaults: {}\n    }, config);\n    const unpack = (obj2, keys2) => {\n      keys2.forEach((k) => {\n        if (isArray(obj2[k])) obj2[k] = toSet(obj2[k]);\n      });\n    };\n    unpack(events2.defaults, [\"prevent\", \"allow\"]);\n    unpack(events2, [\"view\", \"window\", \"selector\"]);\n    return events2;\n  }\n  function trackEventListener(view, sources, type2, handler) {\n    view._eventListeners.push({\n      type: type2,\n      sources: array$4(sources),\n      handler\n    });\n  }\n  function prevent(view, type2) {\n    var def2 = view._eventConfig.defaults, prevent2 = def2.prevent, allow = def2.allow;\n    return prevent2 === false || allow === true ? false : prevent2 === true || allow === false ? true : prevent2 ? prevent2[type2] : allow ? !allow[type2] : view.preventDefault();\n  }\n  function permit(view, key2, type2) {\n    const rule2 = view._eventConfig && view._eventConfig[key2];\n    if (rule2 === false || isObject(rule2) && !rule2[type2]) {\n      view.warn(`Blocked ${key2} ${type2} event listener.`);\n      return false;\n    }\n    return true;\n  }\n  function events(source2, type2, filter2) {\n    var view = this, s2 = new EventStream(filter2), send = function(e, item) {\n      view.runAsync(null, () => {\n        if (source2 === VIEW$1 && prevent(view, type2)) {\n          e.preventDefault();\n        }\n        s2.receive(eventExtend(view, e, item));\n      });\n    }, sources;\n    if (source2 === TIMER) {\n      if (permit(view, \"timer\", type2)) {\n        view.timer(send, type2);\n      }\n    } else if (source2 === VIEW$1) {\n      if (permit(view, \"view\", type2)) {\n        view.addEventListener(type2, send, NO_TRAP);\n      }\n    } else {\n      if (source2 === WINDOW) {\n        if (permit(view, \"window\", type2) && typeof window !== \"undefined\") {\n          sources = [window];\n        }\n      } else if (typeof document !== \"undefined\") {\n        if (permit(view, \"selector\", type2)) {\n          sources = Array.from(document.querySelectorAll(source2));\n        }\n      }\n      if (!sources) {\n        view.warn(\"Can not resolve event source: \" + source2);\n      } else {\n        for (var i = 0, n = sources.length; i < n; ++i) {\n          sources[i].addEventListener(type2, send);\n        }\n        trackEventListener(view, sources, type2, send);\n      }\n    }\n    return s2;\n  }\n  function itemFilter(event2) {\n    return event2.item;\n  }\n  function markTarget(event2) {\n    return event2.item.mark.source;\n  }\n  function invoke(name) {\n    return function(_, event2) {\n      return event2.vega.view().changeset().encode(event2.item, name);\n    };\n  }\n  function hover(hoverSet, leaveSet) {\n    hoverSet = [hoverSet || \"hover\"];\n    leaveSet = [leaveSet || \"update\", hoverSet[0]];\n    this.on(this.events(\"view\", \"pointerover\", itemFilter), markTarget, invoke(hoverSet));\n    this.on(this.events(\"view\", \"pointerout\", itemFilter), markTarget, invoke(leaveSet));\n    return this;\n  }\n  function finalize() {\n    var tooltip = this._tooltip, timers = this._timers, handlers = this._handler.handlers(), listeners = this._eventListeners, n, m2, e, h2, t;\n    n = timers.length;\n    while (--n >= 0) {\n      timers[n].stop();\n    }\n    n = listeners.length;\n    while (--n >= 0) {\n      e = listeners[n];\n      m2 = e.sources.length;\n      while (--m2 >= 0) {\n        e.sources[m2].removeEventListener(e.type, e.handler);\n      }\n    }\n    if (tooltip) {\n      tooltip.call(this, this._handler, null, null, null);\n    }\n    n = handlers.length;\n    while (--n >= 0) {\n      t = handlers[n].type;\n      h2 = handlers[n].handler;\n      this._handler.off(t, h2);\n    }\n    return this;\n  }\n  function element(tag, attr2, text2) {\n    const el = document.createElement(tag);\n    for (const key2 in attr2) el.setAttribute(key2, attr2[key2]);\n    if (text2 != null) el.textContent = text2;\n    return el;\n  }\n  const BindClass = \"vega-bind\", NameClass = \"vega-bind-name\", RadioClass = \"vega-bind-radio\";\n  function bind(view, el, binding) {\n    if (!el) return;\n    const param2 = binding.param;\n    let bind2 = binding.state;\n    if (!bind2) {\n      bind2 = binding.state = {\n        elements: null,\n        active: false,\n        set: null,\n        update: (value2) => {\n          if (value2 != view.signal(param2.signal)) {\n            view.runAsync(null, () => {\n              bind2.source = true;\n              view.signal(param2.signal, value2);\n            });\n          }\n        }\n      };\n      if (param2.debounce) {\n        bind2.update = debounce(param2.debounce, bind2.update);\n      }\n    }\n    const create2 = param2.input == null && param2.element ? target : generate;\n    create2(bind2, el, param2, view);\n    if (!bind2.active) {\n      view.on(view._signals[param2.signal], null, () => {\n        bind2.source ? bind2.source = false : bind2.set(view.signal(param2.signal));\n      });\n      bind2.active = true;\n    }\n    return bind2;\n  }\n  function target(bind2, node, param2, view) {\n    const type2 = param2.event || \"input\";\n    const handler = () => bind2.update(node.value);\n    view.signal(param2.signal, node.value);\n    node.addEventListener(type2, handler);\n    trackEventListener(view, node, type2, handler);\n    bind2.set = (value2) => {\n      node.value = value2;\n      node.dispatchEvent(event(type2));\n    };\n  }\n  function event(type2) {\n    return typeof Event !== \"undefined\" ? new Event(type2) : {\n      type: type2\n    };\n  }\n  function generate(bind2, el, param2, view) {\n    const value2 = view.signal(param2.signal);\n    const div = element(\"div\", {\n      \"class\": BindClass\n    });\n    const wrapper = param2.input === \"radio\" ? div : div.appendChild(element(\"label\"));\n    wrapper.appendChild(element(\"span\", {\n      \"class\": NameClass\n    }, param2.name || param2.signal));\n    el.appendChild(div);\n    let input = form;\n    switch (param2.input) {\n      case \"checkbox\":\n        input = checkbox;\n        break;\n      case \"select\":\n        input = select;\n        break;\n      case \"radio\":\n        input = radio;\n        break;\n      case \"range\":\n        input = range;\n        break;\n    }\n    input(bind2, wrapper, param2, value2);\n  }\n  function form(bind2, el, param2, value2) {\n    const node = element(\"input\");\n    for (const key2 in param2) {\n      if (key2 !== \"signal\" && key2 !== \"element\") {\n        node.setAttribute(key2 === \"input\" ? \"type\" : key2, param2[key2]);\n      }\n    }\n    node.setAttribute(\"name\", param2.signal);\n    node.value = value2;\n    el.appendChild(node);\n    node.addEventListener(\"input\", () => bind2.update(node.value));\n    bind2.elements = [node];\n    bind2.set = (value3) => node.value = value3;\n  }\n  function checkbox(bind2, el, param2, value2) {\n    const attr2 = {\n      type: \"checkbox\",\n      name: param2.signal\n    };\n    if (value2) attr2.checked = true;\n    const node = element(\"input\", attr2);\n    el.appendChild(node);\n    node.addEventListener(\"change\", () => bind2.update(node.checked));\n    bind2.elements = [node];\n    bind2.set = (value3) => node.checked = !!value3 || null;\n  }\n  function select(bind2, el, param2, value2) {\n    const node = element(\"select\", {\n      name: param2.signal\n    }), labels = param2.labels || [];\n    param2.options.forEach((option, i) => {\n      const attr2 = {\n        value: option\n      };\n      if (valuesEqual(option, value2)) attr2.selected = true;\n      node.appendChild(element(\"option\", attr2, (labels[i] || option) + \"\"));\n    });\n    el.appendChild(node);\n    node.addEventListener(\"change\", () => {\n      bind2.update(param2.options[node.selectedIndex]);\n    });\n    bind2.elements = [node];\n    bind2.set = (value3) => {\n      for (let i = 0, n = param2.options.length; i < n; ++i) {\n        if (valuesEqual(param2.options[i], value3)) {\n          node.selectedIndex = i;\n          return;\n        }\n      }\n    };\n  }\n  function radio(bind2, el, param2, value2) {\n    const group2 = element(\"span\", {\n      \"class\": RadioClass\n    }), labels = param2.labels || [];\n    el.appendChild(group2);\n    bind2.elements = param2.options.map((option, i) => {\n      const attr2 = {\n        type: \"radio\",\n        name: param2.signal,\n        value: option\n      };\n      if (valuesEqual(option, value2)) attr2.checked = true;\n      const input = element(\"input\", attr2);\n      input.addEventListener(\"change\", () => bind2.update(option));\n      const label2 = element(\"label\", {}, (labels[i] || option) + \"\");\n      label2.prepend(input);\n      group2.appendChild(label2);\n      return input;\n    });\n    bind2.set = (value3) => {\n      const nodes = bind2.elements, n = nodes.length;\n      for (let i = 0; i < n; ++i) {\n        if (valuesEqual(nodes[i].value, value3)) nodes[i].checked = true;\n      }\n    };\n  }\n  function range(bind2, el, param2, value2) {\n    value2 = value2 !== void 0 ? value2 : (+param2.max + +param2.min) / 2;\n    const max2 = param2.max != null ? param2.max : Math.max(100, +value2) || 100, min2 = param2.min || Math.min(0, max2, +value2) || 0, step = param2.step || tickStep(min2, max2, 100);\n    const node = element(\"input\", {\n      type: \"range\",\n      name: param2.signal,\n      min: min2,\n      max: max2,\n      step\n    });\n    node.value = value2;\n    const span2 = element(\"span\", {}, +value2);\n    el.appendChild(node);\n    el.appendChild(span2);\n    const update2 = () => {\n      span2.textContent = node.value;\n      bind2.update(+node.value);\n    };\n    node.addEventListener(\"input\", update2);\n    node.addEventListener(\"change\", update2);\n    bind2.elements = [node];\n    bind2.set = (value3) => {\n      node.value = value3;\n      span2.textContent = value3;\n    };\n  }\n  function valuesEqual(a2, b2) {\n    return a2 === b2 || a2 + \"\" === b2 + \"\";\n  }\n  function initializeRenderer(view, r, el, constructor, scaleFactor, opt) {\n    r = r || new constructor(view.loader());\n    return r.initialize(el, width(view), height(view), offset(view), scaleFactor, opt).background(view.background());\n  }\n  function trap(view, fn2) {\n    return !fn2 ? null : function() {\n      try {\n        fn2.apply(this, arguments);\n      } catch (error2) {\n        view.error(error2);\n      }\n    };\n  }\n  function initializeHandler(view, prevHandler, el, constructor) {\n    const handler = new constructor(view.loader(), trap(view, view.tooltip())).scene(view.scenegraph().root).initialize(el, offset(view), view);\n    if (prevHandler) {\n      prevHandler.handlers().forEach((h2) => {\n        handler.on(h2.type, h2.handler);\n      });\n    }\n    return handler;\n  }\n  function initialize(el, elBind) {\n    const view = this, type2 = view._renderType, config = view._eventConfig.bind, module2 = renderModule(type2);\n    el = view._el = el ? lookup$1(view, el, true) : null;\n    initializeAria(view);\n    if (!module2) view.error(\"Unrecognized renderer type: \" + type2);\n    const Handler2 = module2.handler || CanvasHandler, Renderer2 = el ? module2.renderer : module2.headless;\n    view._renderer = !Renderer2 ? null : initializeRenderer(view, view._renderer, el, Renderer2);\n    view._handler = initializeHandler(view, view._handler, el, Handler2);\n    view._redraw = true;\n    if (el && config !== \"none\") {\n      elBind = elBind ? view._elBind = lookup$1(view, elBind, true) : el.appendChild(element(\"form\", {\n        \"class\": \"vega-bindings\"\n      }));\n      view._bind.forEach((_) => {\n        if (_.param.element && config !== \"container\") {\n          _.element = lookup$1(view, _.param.element, !!_.param.input);\n        }\n      });\n      view._bind.forEach((_) => {\n        bind(view, _.element || elBind, _);\n      });\n    }\n    return view;\n  }\n  function lookup$1(view, el, clear) {\n    if (typeof el === \"string\") {\n      if (typeof document !== \"undefined\") {\n        el = document.querySelector(el);\n        if (!el) {\n          view.error(\"Signal bind element not found: \" + el);\n          return null;\n        }\n      } else {\n        view.error(\"DOM document instance not found.\");\n        return null;\n      }\n    }\n    if (el && clear) {\n      try {\n        el.textContent = \"\";\n      } catch (e) {\n        el = null;\n        view.error(e);\n      }\n    }\n    return el;\n  }\n  const number$1 = (_) => +_ || 0;\n  const paddingObject$1 = (_) => ({\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  });\n  function padding(_) {\n    return isObject(_) ? {\n      top: number$1(_.top),\n      bottom: number$1(_.bottom),\n      left: number$1(_.left),\n      right: number$1(_.right)\n    } : paddingObject$1(number$1(_));\n  }\n  async function renderHeadless(view, type2, scaleFactor, opt) {\n    const module2 = renderModule(type2), ctr = module2 && module2.headless;\n    if (!ctr) error(\"Unrecognized renderer type: \" + type2);\n    await view.runAsync();\n    return initializeRenderer(view, null, null, ctr, scaleFactor, opt).renderAsync(view._scenegraph.root);\n  }\n  async function renderToImageURL(type2, scaleFactor) {\n    if (type2 !== RenderType.Canvas && type2 !== RenderType.SVG && type2 !== RenderType.PNG) {\n      error(\"Unrecognized image type: \" + type2);\n    }\n    const r = await renderHeadless(this, type2, scaleFactor);\n    return type2 === RenderType.SVG ? toBlobURL(r.svg(), \"image/svg+xml\") : r.canvas().toDataURL(\"image/png\");\n  }\n  function toBlobURL(data2, mime) {\n    const blob = new Blob([data2], {\n      type: mime\n    });\n    return window.URL.createObjectURL(blob);\n  }\n  async function renderToCanvas(scaleFactor, opt) {\n    const r = await renderHeadless(this, RenderType.Canvas, scaleFactor, opt);\n    return r.canvas();\n  }\n  async function renderToSVG(scaleFactor) {\n    const r = await renderHeadless(this, RenderType.SVG, scaleFactor);\n    return r.svg();\n  }\n  function runtime(view, spec, expr2) {\n    return context(view, transforms, functionContext, expr2).parse(spec);\n  }\n  function scale$1(name) {\n    var scales2 = this._runtime.scales;\n    if (!has$1(scales2, name)) {\n      error(\"Unrecognized scale or projection: \" + name);\n    }\n    return scales2[name].value;\n  }\n  var Width = \"width\", Height = \"height\", Padding = \"padding\", Skip$1 = {\n    skip: true\n  };\n  function viewWidth(view, width2) {\n    var a2 = view.autosize(), p = view.padding();\n    return width2 - (a2 && a2.contains === Padding ? p.left + p.right : 0);\n  }\n  function viewHeight(view, height2) {\n    var a2 = view.autosize(), p = view.padding();\n    return height2 - (a2 && a2.contains === Padding ? p.top + p.bottom : 0);\n  }\n  function initializeResize(view) {\n    var s2 = view._signals, w2 = s2[Width], h2 = s2[Height], p = s2[Padding];\n    function resetSize() {\n      view._autosize = view._resize = 1;\n    }\n    view._resizeWidth = view.add(null, (_) => {\n      view._width = _.size;\n      view._viewWidth = viewWidth(view, _.size);\n      resetSize();\n    }, {\n      size: w2\n    });\n    view._resizeHeight = view.add(null, (_) => {\n      view._height = _.size;\n      view._viewHeight = viewHeight(view, _.size);\n      resetSize();\n    }, {\n      size: h2\n    });\n    const resizePadding = view.add(null, resetSize, {\n      pad: p\n    });\n    view._resizeWidth.rank = w2.rank + 1;\n    view._resizeHeight.rank = h2.rank + 1;\n    resizePadding.rank = p.rank + 1;\n  }\n  function resizeView(viewWidth2, viewHeight2, width2, height2, origin, auto) {\n    this.runAfter((view) => {\n      let rerun2 = 0;\n      view._autosize = 0;\n      if (view.width() !== width2) {\n        rerun2 = 1;\n        view.signal(Width, width2, Skip$1);\n        view._resizeWidth.skip(true);\n      }\n      if (view.height() !== height2) {\n        rerun2 = 1;\n        view.signal(Height, height2, Skip$1);\n        view._resizeHeight.skip(true);\n      }\n      if (view._viewWidth !== viewWidth2) {\n        view._resize = 1;\n        view._viewWidth = viewWidth2;\n      }\n      if (view._viewHeight !== viewHeight2) {\n        view._resize = 1;\n        view._viewHeight = viewHeight2;\n      }\n      if (view._origin[0] !== origin[0] || view._origin[1] !== origin[1]) {\n        view._resize = 1;\n        view._origin = origin;\n      }\n      if (rerun2) view.run(\"enter\");\n      if (auto) view.runAfter((v) => v.resize());\n    }, false, 1);\n  }\n  function getState(options2) {\n    return this._runtime.getState(options2 || {\n      data: dataTest,\n      signals: signalTest,\n      recurse: true\n    });\n  }\n  function dataTest(name, data2) {\n    return data2.modified && isArray(data2.input.value) && !name.startsWith(\"_:vega:_\");\n  }\n  function signalTest(name, op) {\n    return !(name === \"parent\" || op instanceof transforms.proxy);\n  }\n  function setState(state) {\n    this.runAsync(null, (v) => {\n      v._trigger = false;\n      v._runtime.setState(state);\n    }, (v) => {\n      v._trigger = true;\n    });\n    return this;\n  }\n  function timer(callback, delay) {\n    function tick(elapsed) {\n      callback({\n        timestamp: Date.now(),\n        elapsed\n      });\n    }\n    this._timers.push(interval(tick, delay));\n  }\n  function defaultTooltip(handler, event2, item, value2) {\n    const el = handler.element();\n    if (el) el.setAttribute(\"title\", formatTooltip(value2));\n  }\n  function formatTooltip(value2) {\n    return value2 == null ? \"\" : isArray(value2) ? formatArray(value2) : isObject(value2) && !isDate$1(value2) ? formatObject(value2) : value2 + \"\";\n  }\n  function formatObject(obj2) {\n    return Object.keys(obj2).map((key2) => {\n      const v = obj2[key2];\n      return key2 + \": \" + (isArray(v) ? formatArray(v) : formatValue(v));\n    }).join(\"\\n\");\n  }\n  function formatArray(value2) {\n    return \"[\" + value2.map(formatValue).join(\", \") + \"]\";\n  }\n  function formatValue(value2) {\n    return isArray(value2) ? \"[…]\" : isObject(value2) && !isDate$1(value2) ? \"{…}\" : value2;\n  }\n  function watchPixelRatio() {\n    if (this.renderer() === \"canvas\" && this._renderer._canvas) {\n      let remove2 = null;\n      const updatePixelRatio = () => {\n        if (remove2 != null) {\n          remove2();\n        }\n        const media = matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n        media.addEventListener(\"change\", updatePixelRatio);\n        remove2 = () => {\n          media.removeEventListener(\"change\", updatePixelRatio);\n        };\n        this._renderer._canvas.getContext(\"2d\").pixelRatio = window.devicePixelRatio || 1;\n        this._redraw = true;\n        this._resize = 1;\n        this.resize().runAsync();\n      };\n      updatePixelRatio();\n    }\n  }\n  function View$1(spec, options2) {\n    const view = this;\n    options2 = options2 || {};\n    Dataflow.call(view);\n    if (options2.loader) view.loader(options2.loader);\n    if (options2.logger) view.logger(options2.logger);\n    if (options2.logLevel != null) view.logLevel(options2.logLevel);\n    if (options2.locale || spec.locale) {\n      const loc = extend({}, spec.locale, options2.locale);\n      view.locale(locale(loc.number, loc.time));\n    }\n    view._el = null;\n    view._elBind = null;\n    view._renderType = options2.renderer || RenderType.Canvas;\n    view._scenegraph = new Scenegraph();\n    const root = view._scenegraph.root;\n    view._renderer = null;\n    view._tooltip = options2.tooltip || defaultTooltip, view._redraw = true;\n    view._handler = new CanvasHandler().scene(root);\n    view._globalCursor = false;\n    view._preventDefault = false;\n    view._timers = [];\n    view._eventListeners = [];\n    view._resizeListeners = [];\n    view._eventConfig = initializeEventConfig(spec.eventConfig);\n    view.globalCursor(view._eventConfig.globalCursor);\n    const ctx = runtime(view, spec, options2.expr);\n    view._runtime = ctx;\n    view._signals = ctx.signals;\n    view._bind = (spec.bindings || []).map((_) => ({\n      state: null,\n      param: extend({}, _)\n    }));\n    if (ctx.root) ctx.root.set(root);\n    root.source = ctx.data.root.input;\n    view.pulse(ctx.data.root.input, view.changeset().insert(root.items));\n    view._width = view.width();\n    view._height = view.height();\n    view._viewWidth = viewWidth(view, view._width);\n    view._viewHeight = viewHeight(view, view._height);\n    view._origin = [0, 0];\n    view._resize = 0;\n    view._autosize = 1;\n    initializeResize(view);\n    background(view);\n    cursor(view);\n    view.description(spec.description);\n    if (options2.hover) view.hover();\n    if (options2.container) view.initialize(options2.container, options2.bind);\n    if (options2.watchPixelRatio) view._watchPixelRatio();\n  }\n  function lookupSignal(view, name) {\n    return has$1(view._signals, name) ? view._signals[name] : error(\"Unrecognized signal name: \" + $(name));\n  }\n  function findOperatorHandler(op, handler) {\n    const h2 = (op._targets || []).filter((op2) => op2._update && op2._update.handler === handler);\n    return h2.length ? h2[0] : null;\n  }\n  function addOperatorListener(view, name, op, handler) {\n    let h2 = findOperatorHandler(op, handler);\n    if (!h2) {\n      h2 = trap(view, () => handler(name, op.value));\n      h2.handler = handler;\n      view.on(op, null, h2);\n    }\n    return view;\n  }\n  function removeOperatorListener(view, op, handler) {\n    const h2 = findOperatorHandler(op, handler);\n    if (h2) op._targets.remove(h2);\n    return view;\n  }\n  inherits(View$1, Dataflow, {\n    // -- DATAFLOW / RENDERING ----\n    async evaluate(encode2, prerun, postrun) {\n      await Dataflow.prototype.evaluate.call(this, encode2, prerun);\n      if (this._redraw || this._resize) {\n        try {\n          if (this._renderer) {\n            if (this._resize) {\n              this._resize = 0;\n              resizeRenderer(this);\n            }\n            await this._renderer.renderAsync(this._scenegraph.root);\n          }\n          this._redraw = false;\n        } catch (e) {\n          this.error(e);\n        }\n      }\n      if (postrun) asyncCallback(this, postrun);\n      return this;\n    },\n    dirty(item) {\n      this._redraw = true;\n      this._renderer && this._renderer.dirty(item);\n    },\n    // -- GET / SET ----\n    description(text2) {\n      if (arguments.length) {\n        const desc = text2 != null ? text2 + \"\" : null;\n        if (desc !== this._desc) ariaLabel(this._el, this._desc = desc);\n        return this;\n      }\n      return this._desc;\n    },\n    container() {\n      return this._el;\n    },\n    scenegraph() {\n      return this._scenegraph;\n    },\n    origin() {\n      return this._origin.slice();\n    },\n    signal(name, value2, options2) {\n      const op = lookupSignal(this, name);\n      return arguments.length === 1 ? op.value : this.update(op, value2, options2);\n    },\n    width(_) {\n      return arguments.length ? this.signal(\"width\", _) : this.signal(\"width\");\n    },\n    height(_) {\n      return arguments.length ? this.signal(\"height\", _) : this.signal(\"height\");\n    },\n    padding(_) {\n      return arguments.length ? this.signal(\"padding\", padding(_)) : padding(this.signal(\"padding\"));\n    },\n    autosize(_) {\n      return arguments.length ? this.signal(\"autosize\", _) : this.signal(\"autosize\");\n    },\n    background(_) {\n      return arguments.length ? this.signal(\"background\", _) : this.signal(\"background\");\n    },\n    renderer(type2) {\n      if (!arguments.length) return this._renderType;\n      if (!renderModule(type2)) error(\"Unrecognized renderer type: \" + type2);\n      if (type2 !== this._renderType) {\n        this._renderType = type2;\n        this._resetRenderer();\n      }\n      return this;\n    },\n    tooltip(handler) {\n      if (!arguments.length) return this._tooltip;\n      if (handler !== this._tooltip) {\n        this._tooltip = handler;\n        this._resetRenderer();\n      }\n      return this;\n    },\n    loader(loader2) {\n      if (!arguments.length) return this._loader;\n      if (loader2 !== this._loader) {\n        Dataflow.prototype.loader.call(this, loader2);\n        this._resetRenderer();\n      }\n      return this;\n    },\n    resize() {\n      this._autosize = 1;\n      return this.touch(lookupSignal(this, \"autosize\"));\n    },\n    _resetRenderer() {\n      if (this._renderer) {\n        this._renderer = null;\n        this.initialize(this._el, this._elBind);\n      }\n    },\n    // -- SIZING ----\n    _resizeView: resizeView,\n    // -- EVENT HANDLING ----\n    addEventListener(type2, handler, options2) {\n      let callback = handler;\n      if (!(options2 && options2.trap === false)) {\n        callback = trap(this, handler);\n        callback.raw = handler;\n      }\n      this._handler.on(type2, callback);\n      return this;\n    },\n    removeEventListener(type2, handler) {\n      var handlers = this._handler.handlers(type2), i = handlers.length, h2, t;\n      while (--i >= 0) {\n        t = handlers[i].type;\n        h2 = handlers[i].handler;\n        if (type2 === t && (handler === h2 || handler === h2.raw)) {\n          this._handler.off(t, h2);\n          break;\n        }\n      }\n      return this;\n    },\n    addResizeListener(handler) {\n      const l = this._resizeListeners;\n      if (!l.includes(handler)) {\n        l.push(handler);\n      }\n      return this;\n    },\n    removeResizeListener(handler) {\n      var l = this._resizeListeners, i = l.indexOf(handler);\n      if (i >= 0) {\n        l.splice(i, 1);\n      }\n      return this;\n    },\n    addSignalListener(name, handler) {\n      return addOperatorListener(this, name, lookupSignal(this, name), handler);\n    },\n    removeSignalListener(name, handler) {\n      return removeOperatorListener(this, lookupSignal(this, name), handler);\n    },\n    addDataListener(name, handler) {\n      return addOperatorListener(this, name, dataref(this, name).values, handler);\n    },\n    removeDataListener(name, handler) {\n      return removeOperatorListener(this, dataref(this, name).values, handler);\n    },\n    globalCursor(_) {\n      if (arguments.length) {\n        if (this._globalCursor !== !!_) {\n          const prev = setCursor(this, null);\n          this._globalCursor = !!_;\n          if (prev) setCursor(this, prev);\n        }\n        return this;\n      } else {\n        return this._globalCursor;\n      }\n    },\n    preventDefault(_) {\n      if (arguments.length) {\n        this._preventDefault = _;\n        return this;\n      } else {\n        return this._preventDefault;\n      }\n    },\n    timer,\n    events,\n    finalize,\n    hover,\n    // -- DATA ----\n    data,\n    change,\n    insert,\n    remove,\n    // -- SCALES --\n    scale: scale$1,\n    // -- INITIALIZATION ----\n    initialize,\n    // -- HEADLESS RENDERING ----\n    toImageURL: renderToImageURL,\n    toCanvas: renderToCanvas,\n    toSVG: renderToSVG,\n    // -- SAVE / RESTORE STATE ----\n    getState,\n    setState,\n    // RE-RENDER ON ZOOM\n    _watchPixelRatio: watchPixelRatio\n  });\n  const VIEW = \"view\", LBRACK = \"[\", RBRACK = \"]\", LBRACE = \"{\", RBRACE = \"}\", COLON = \":\", COMMA = \",\", NAME = \"@\", GT = \">\", ILLEGAL = /[[\\]{}]/, DEFAULT_MARKS = {\n    \"*\": 1,\n    arc: 1,\n    area: 1,\n    group: 1,\n    image: 1,\n    line: 1,\n    path: 1,\n    rect: 1,\n    rule: 1,\n    shape: 1,\n    symbol: 1,\n    text: 1,\n    trail: 1\n  };\n  let DEFAULT_SOURCE, MARKS;\n  function eventSelector(selector, source2, marks) {\n    DEFAULT_SOURCE = source2 || VIEW;\n    MARKS = marks || DEFAULT_MARKS;\n    return parseMerge(selector.trim()).map(parseSelector);\n  }\n  function isMarkType(type2) {\n    return MARKS[type2];\n  }\n  function find(s2, i, endChar, pushChar, popChar) {\n    const n = s2.length;\n    let count2 = 0, c2;\n    for (; i < n; ++i) {\n      c2 = s2[i];\n      if (!count2 && c2 === endChar) return i;\n      else if (popChar && popChar.includes(c2)) --count2;\n      else if (pushChar && pushChar.includes(c2)) ++count2;\n    }\n    return i;\n  }\n  function parseMerge(s2) {\n    const output2 = [], n = s2.length;\n    let start = 0, i = 0;\n    while (i < n) {\n      i = find(s2, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n      output2.push(s2.substring(start, i).trim());\n      start = ++i;\n    }\n    if (output2.length === 0) {\n      throw \"Empty event selector: \" + s2;\n    }\n    return output2;\n  }\n  function parseSelector(s2) {\n    return s2[0] === \"[\" ? parseBetween(s2) : parseStream$1(s2);\n  }\n  function parseBetween(s2) {\n    const n = s2.length;\n    let i = 1, b2;\n    i = find(s2, i, RBRACK, LBRACK, RBRACK);\n    if (i === n) {\n      throw \"Empty between selector: \" + s2;\n    }\n    b2 = parseMerge(s2.substring(1, i));\n    if (b2.length !== 2) {\n      throw \"Between selector must have two elements: \" + s2;\n    }\n    s2 = s2.slice(i + 1).trim();\n    if (s2[0] !== GT) {\n      throw \"Expected '>' after between selector: \" + s2;\n    }\n    b2 = b2.map(parseSelector);\n    const stream2 = parseSelector(s2.slice(1).trim());\n    if (stream2.between) {\n      return {\n        between: b2,\n        stream: stream2\n      };\n    } else {\n      stream2.between = b2;\n    }\n    return stream2;\n  }\n  function parseStream$1(s2) {\n    const stream2 = {\n      source: DEFAULT_SOURCE\n    }, source2 = [];\n    let throttle = [0, 0], markname = 0, start = 0, n = s2.length, i = 0, j, filter2;\n    if (s2[n - 1] === RBRACE) {\n      i = s2.lastIndexOf(LBRACE);\n      if (i >= 0) {\n        try {\n          throttle = parseThrottle(s2.substring(i + 1, n - 1));\n        } catch (e) {\n          throw \"Invalid throttle specification: \" + s2;\n        }\n        s2 = s2.slice(0, i).trim();\n        n = s2.length;\n      } else throw \"Unmatched right brace: \" + s2;\n      i = 0;\n    }\n    if (!n) throw s2;\n    if (s2[0] === NAME) markname = ++i;\n    j = find(s2, i, COLON);\n    if (j < n) {\n      source2.push(s2.substring(start, j).trim());\n      start = i = ++j;\n    }\n    i = find(s2, i, LBRACK);\n    if (i === n) {\n      source2.push(s2.substring(start, n).trim());\n    } else {\n      source2.push(s2.substring(start, i).trim());\n      filter2 = [];\n      start = ++i;\n      if (start === n) throw \"Unmatched left bracket: \" + s2;\n    }\n    while (i < n) {\n      i = find(s2, i, RBRACK);\n      if (i === n) throw \"Unmatched left bracket: \" + s2;\n      filter2.push(s2.substring(start, i).trim());\n      if (i < n - 1 && s2[++i] !== LBRACK) throw \"Expected left bracket: \" + s2;\n      start = ++i;\n    }\n    if (!(n = source2.length) || ILLEGAL.test(source2[n - 1])) {\n      throw \"Invalid event selector: \" + s2;\n    }\n    if (n > 1) {\n      stream2.type = source2[1];\n      if (markname) {\n        stream2.markname = source2[0].slice(1);\n      } else if (isMarkType(source2[0])) {\n        stream2.marktype = source2[0];\n      } else {\n        stream2.source = source2[0];\n      }\n    } else {\n      stream2.type = source2[0];\n    }\n    if (stream2.type.slice(-1) === \"!\") {\n      stream2.consume = true;\n      stream2.type = stream2.type.slice(0, -1);\n    }\n    if (filter2 != null) stream2.filter = filter2;\n    if (throttle[0]) stream2.throttle = throttle[0];\n    if (throttle[1]) stream2.debounce = throttle[1];\n    return stream2;\n  }\n  function parseThrottle(s2) {\n    const a2 = s2.split(COMMA);\n    if (!s2.length || a2.length > 2) throw s2;\n    return a2.map((_) => {\n      const x2 = +_;\n      if (x2 !== x2) throw s2;\n      return x2;\n    });\n  }\n  function parseAutosize(spec) {\n    return isObject(spec) ? spec : {\n      type: spec || \"pad\"\n    };\n  }\n  const number = (_) => +_ || 0;\n  const paddingObject = (_) => ({\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  });\n  function parsePadding(spec) {\n    return !isObject(spec) ? paddingObject(number(spec)) : spec.signal ? spec : {\n      top: number(spec.top),\n      bottom: number(spec.bottom),\n      left: number(spec.left),\n      right: number(spec.right)\n    };\n  }\n  const encoder = (_) => isObject(_) && !isArray(_) ? extend({}, _) : {\n    value: _\n  };\n  function addEncode(object2, name, value2, set2) {\n    if (value2 != null) {\n      const isEncoder = isObject(value2) && !isArray(value2) || isArray(value2) && value2.length && isObject(value2[0]);\n      if (isEncoder) {\n        object2.update[name] = value2;\n      } else {\n        object2[set2 || \"enter\"][name] = {\n          value: value2\n        };\n      }\n      return 1;\n    } else {\n      return 0;\n    }\n  }\n  function addEncoders(object2, enter, update2) {\n    for (const name in enter) {\n      addEncode(object2, name, enter[name]);\n    }\n    for (const name in update2) {\n      addEncode(object2, name, update2[name], \"update\");\n    }\n  }\n  function extendEncode(encode2, extra, skip) {\n    for (const name in extra) {\n      if (skip && has$1(skip, name)) continue;\n      encode2[name] = extend(encode2[name] || {}, extra[name]);\n    }\n    return encode2;\n  }\n  function has(key2, encode2) {\n    return encode2 && (encode2.enter && encode2.enter[key2] || encode2.update && encode2.update[key2]);\n  }\n  const MarkRole = \"mark\";\n  const FrameRole = \"frame\";\n  const ScopeRole = \"scope\";\n  const AxisRole = \"axis\";\n  const AxisDomainRole = \"axis-domain\";\n  const AxisGridRole = \"axis-grid\";\n  const AxisLabelRole = \"axis-label\";\n  const AxisTickRole = \"axis-tick\";\n  const AxisTitleRole = \"axis-title\";\n  const LegendRole = \"legend\";\n  const LegendBandRole = \"legend-band\";\n  const LegendEntryRole = \"legend-entry\";\n  const LegendGradientRole = \"legend-gradient\";\n  const LegendLabelRole = \"legend-label\";\n  const LegendSymbolRole = \"legend-symbol\";\n  const LegendTitleRole = \"legend-title\";\n  const TitleRole = \"title\";\n  const TitleTextRole = \"title-text\";\n  const TitleSubtitleRole = \"title-subtitle\";\n  function applyDefaults(encode2, type2, role, style2, config) {\n    const defaults2 = {}, enter = {};\n    let update2, key2, skip, props;\n    key2 = \"lineBreak\";\n    if (type2 === \"text\" && config[key2] != null && !has(key2, encode2)) {\n      applyDefault(defaults2, key2, config[key2]);\n    }\n    if (role == \"legend\" || String(role).startsWith(\"axis\")) {\n      role = null;\n    }\n    props = role === FrameRole ? config.group : role === MarkRole ? extend({}, config.mark, config[type2]) : null;\n    for (key2 in props) {\n      skip = has(key2, encode2) || (key2 === \"fill\" || key2 === \"stroke\") && (has(\"fill\", encode2) || has(\"stroke\", encode2));\n      if (!skip) applyDefault(defaults2, key2, props[key2]);\n    }\n    array$4(style2).forEach((name) => {\n      const props2 = config.style && config.style[name];\n      for (const key3 in props2) {\n        if (!has(key3, encode2)) {\n          applyDefault(defaults2, key3, props2[key3]);\n        }\n      }\n    });\n    encode2 = extend({}, encode2);\n    for (key2 in defaults2) {\n      props = defaults2[key2];\n      if (props.signal) {\n        (update2 = update2 || {})[key2] = props;\n      } else {\n        enter[key2] = props;\n      }\n    }\n    encode2.enter = extend(enter, encode2.enter);\n    if (update2) encode2.update = extend(update2, encode2.update);\n    return encode2;\n  }\n  function applyDefault(defaults2, key2, value2) {\n    defaults2[key2] = value2 && value2.signal ? {\n      signal: value2.signal\n    } : {\n      value: value2\n    };\n  }\n  const scaleRef = (scale2) => isString(scale2) ? $(scale2) : scale2.signal ? `(${scale2.signal})` : field(scale2);\n  function entry$1(enc) {\n    if (enc.gradient != null) {\n      return gradient(enc);\n    }\n    let value2 = enc.signal ? `(${enc.signal})` : enc.color ? color(enc.color) : enc.field != null ? field(enc.field) : enc.value !== void 0 ? $(enc.value) : void 0;\n    if (enc.scale != null) {\n      value2 = scale(enc, value2);\n    }\n    if (value2 === void 0) {\n      value2 = null;\n    }\n    if (enc.exponent != null) {\n      value2 = `pow(${value2},${property(enc.exponent)})`;\n    }\n    if (enc.mult != null) {\n      value2 += `*${property(enc.mult)}`;\n    }\n    if (enc.offset != null) {\n      value2 += `+${property(enc.offset)}`;\n    }\n    if (enc.round) {\n      value2 = `round(${value2})`;\n    }\n    return value2;\n  }\n  const _color = (type2, x2, y2, z2) => `(${type2}(${[x2, y2, z2].map(entry$1).join(\",\")})+'')`;\n  function color(enc) {\n    return enc.c ? _color(\"hcl\", enc.h, enc.c, enc.l) : enc.h || enc.s ? _color(\"hsl\", enc.h, enc.s, enc.l) : enc.l || enc.a ? _color(\"lab\", enc.l, enc.a, enc.b) : enc.r || enc.g || enc.b ? _color(\"rgb\", enc.r, enc.g, enc.b) : null;\n  }\n  function gradient(enc) {\n    const args = [enc.start, enc.stop, enc.count].map((_) => _ == null ? null : $(_));\n    while (args.length && peek$1(args) == null) args.pop();\n    args.unshift(scaleRef(enc.gradient));\n    return `gradient(${args.join(\",\")})`;\n  }\n  function property(property2) {\n    return isObject(property2) ? \"(\" + entry$1(property2) + \")\" : property2;\n  }\n  function field(ref2) {\n    return resolveField(isObject(ref2) ? ref2 : {\n      datum: ref2\n    });\n  }\n  function resolveField(ref2) {\n    let object2, level, field2;\n    if (ref2.signal) {\n      object2 = \"datum\";\n      field2 = ref2.signal;\n    } else if (ref2.group || ref2.parent) {\n      level = Math.max(1, ref2.level || 1);\n      object2 = \"item\";\n      while (level-- > 0) {\n        object2 += \".mark.group\";\n      }\n      if (ref2.parent) {\n        field2 = ref2.parent;\n        object2 += \".datum\";\n      } else {\n        field2 = ref2.group;\n      }\n    } else if (ref2.datum) {\n      object2 = \"datum\";\n      field2 = ref2.datum;\n    } else {\n      error(\"Invalid field reference: \" + $(ref2));\n    }\n    if (!ref2.signal) {\n      field2 = isString(field2) ? splitAccessPath(field2).map($).join(\"][\") : resolveField(field2);\n    }\n    return object2 + \"[\" + field2 + \"]\";\n  }\n  function scale(enc, value2) {\n    const scale2 = scaleRef(enc.scale);\n    if (enc.range != null) {\n      value2 = `lerp(_range(${scale2}), ${+enc.range})`;\n    } else {\n      if (value2 !== void 0) value2 = `_scale(${scale2}, ${value2})`;\n      if (enc.band) {\n        value2 = (value2 ? value2 + \"+\" : \"\") + `_bandwidth(${scale2})` + (+enc.band === 1 ? \"\" : \"*\" + property(enc.band));\n        if (enc.extra) {\n          value2 = `(datum.extra ? _scale(${scale2}, datum.extra.value) : ${value2})`;\n        }\n      }\n      if (value2 == null) value2 = \"0\";\n    }\n    return value2;\n  }\n  function rule(enc) {\n    let code = \"\";\n    enc.forEach((rule2) => {\n      const value2 = entry$1(rule2);\n      code += rule2.test ? `(${rule2.test})?${value2}:` : value2;\n    });\n    if (peek$1(code) === \":\") {\n      code += \"null\";\n    }\n    return code;\n  }\n  function parseEncode(encode2, type2, role, style2, scope, params2) {\n    const enc = {};\n    params2 = params2 || {};\n    params2.encoders = {\n      $encode: enc\n    };\n    encode2 = applyDefaults(encode2, type2, role, style2, scope.config);\n    for (const key2 in encode2) {\n      enc[key2] = parseBlock(encode2[key2], type2, params2, scope);\n    }\n    return params2;\n  }\n  function parseBlock(block, marktype, params2, scope) {\n    const channels = {}, fields = {};\n    for (const name in block) {\n      if (block[name] != null) {\n        channels[name] = parse$1(expr(block[name]), scope, params2, fields);\n      }\n    }\n    return {\n      $expr: {\n        marktype,\n        channels\n      },\n      $fields: Object.keys(fields),\n      $output: Object.keys(block)\n    };\n  }\n  function expr(enc) {\n    return isArray(enc) ? rule(enc) : entry$1(enc);\n  }\n  function parse$1(code, scope, params2, fields) {\n    const expr2 = parser(code, scope);\n    expr2.$fields.forEach((name) => fields[name] = 1);\n    extend(params2, expr2.$params);\n    return expr2.$expr;\n  }\n  const OUTER = \"outer\", OUTER_INVALID = [\"value\", \"update\", \"init\", \"react\", \"bind\"];\n  function outerError(prefix, name) {\n    error(prefix + ' for \"outer\" push: ' + $(name));\n  }\n  function parseSignal(signal, scope) {\n    const name = signal.name;\n    if (signal.push === OUTER) {\n      if (!scope.signals[name]) outerError(\"No prior signal definition\", name);\n      OUTER_INVALID.forEach((prop) => {\n        if (signal[prop] !== void 0) outerError(\"Invalid property \", prop);\n      });\n    } else {\n      const op = scope.addSignal(name, signal.value);\n      if (signal.react === false) op.react = false;\n      if (signal.bind) scope.addBinding(name, signal.bind);\n    }\n  }\n  function Entry(type2, value2, params2, parent) {\n    this.id = -1;\n    this.type = type2;\n    this.value = value2;\n    this.params = params2;\n    if (parent) this.parent = parent;\n  }\n  function entry(type2, value2, params2, parent) {\n    return new Entry(type2, value2, params2, parent);\n  }\n  function operator(value2, params2) {\n    return entry(\"operator\", value2, params2);\n  }\n  function ref(op) {\n    const ref2 = {\n      $ref: op.id\n    };\n    if (op.id < 0) (op.refs = op.refs || []).push(ref2);\n    return ref2;\n  }\n  function fieldRef$1(field2, name) {\n    return name ? {\n      $field: field2,\n      $name: name\n    } : {\n      $field: field2\n    };\n  }\n  const keyFieldRef = fieldRef$1(\"key\");\n  function compareRef(fields, orders) {\n    return {\n      $compare: fields,\n      $order: orders\n    };\n  }\n  function keyRef(fields, flat) {\n    const ref2 = {\n      $key: fields\n    };\n    if (flat) ref2.$flat = true;\n    return ref2;\n  }\n  const Ascending = \"ascending\";\n  const Descending = \"descending\";\n  function sortKey(sort2) {\n    return !isObject(sort2) ? \"\" : (sort2.order === Descending ? \"-\" : \"+\") + aggrField(sort2.op, sort2.field);\n  }\n  function aggrField(op, field2) {\n    return (op && op.signal ? \"$\" + op.signal : op || \"\") + (op && field2 ? \"_\" : \"\") + (field2 && field2.signal ? \"$\" + field2.signal : field2 || \"\");\n  }\n  const Scope$1 = \"scope\";\n  const View = \"view\";\n  function isSignal(_) {\n    return _ && _.signal;\n  }\n  function isExpr$1(_) {\n    return _ && _.expr;\n  }\n  function hasSignal(_) {\n    if (isSignal(_)) return true;\n    if (isObject(_)) for (const key2 in _) {\n      if (hasSignal(_[key2])) return true;\n    }\n    return false;\n  }\n  function value(specValue, defaultValue) {\n    return specValue != null ? specValue : defaultValue;\n  }\n  function deref(v) {\n    return v && v.signal || v;\n  }\n  const Timer = \"timer\";\n  function parseStream(stream2, scope) {\n    const method2 = stream2.merge ? mergeStream : stream2.stream ? nestedStream : stream2.type ? eventStream : error(\"Invalid stream specification: \" + $(stream2));\n    return method2(stream2, scope);\n  }\n  function eventSource(source2) {\n    return source2 === Scope$1 ? View : source2 || View;\n  }\n  function mergeStream(stream2, scope) {\n    const list = stream2.merge.map((s2) => parseStream(s2, scope)), entry2 = streamParameters({\n      merge: list\n    }, stream2, scope);\n    return scope.addStream(entry2).id;\n  }\n  function nestedStream(stream2, scope) {\n    const id2 = parseStream(stream2.stream, scope), entry2 = streamParameters({\n      stream: id2\n    }, stream2, scope);\n    return scope.addStream(entry2).id;\n  }\n  function eventStream(stream2, scope) {\n    let id2;\n    if (stream2.type === Timer) {\n      id2 = scope.event(Timer, stream2.throttle);\n      stream2 = {\n        between: stream2.between,\n        filter: stream2.filter\n      };\n    } else {\n      id2 = scope.event(eventSource(stream2.source), stream2.type);\n    }\n    const entry2 = streamParameters({\n      stream: id2\n    }, stream2, scope);\n    return Object.keys(entry2).length === 1 ? id2 : scope.addStream(entry2).id;\n  }\n  function streamParameters(entry2, stream2, scope) {\n    let param2 = stream2.between;\n    if (param2) {\n      if (param2.length !== 2) {\n        error('Stream \"between\" parameter must have 2 entries: ' + $(stream2));\n      }\n      entry2.between = [parseStream(param2[0], scope), parseStream(param2[1], scope)];\n    }\n    param2 = stream2.filter ? [].concat(stream2.filter) : [];\n    if (stream2.marktype || stream2.markname || stream2.markrole) {\n      param2.push(filterMark(stream2.marktype, stream2.markname, stream2.markrole));\n    }\n    if (stream2.source === Scope$1) {\n      param2.push(\"inScope(event.item)\");\n    }\n    if (param2.length) {\n      entry2.filter = parser(\"(\" + param2.join(\")&&(\") + \")\", scope).$expr;\n    }\n    if ((param2 = stream2.throttle) != null) {\n      entry2.throttle = +param2;\n    }\n    if ((param2 = stream2.debounce) != null) {\n      entry2.debounce = +param2;\n    }\n    if (stream2.consume) {\n      entry2.consume = true;\n    }\n    return entry2;\n  }\n  function filterMark(type2, name, role) {\n    const item = \"event.item\";\n    return item + (type2 && type2 !== \"*\" ? \"&&\" + item + \".mark.marktype==='\" + type2 + \"'\" : \"\") + (role ? \"&&\" + item + \".mark.role==='\" + role + \"'\" : \"\") + (name ? \"&&\" + item + \".mark.name==='\" + name + \"'\" : \"\");\n  }\n  const OP_VALUE_EXPR = {\n    code: \"_.$value\",\n    ast: {\n      type: \"Identifier\",\n      value: \"value\"\n    }\n  };\n  function parseUpdate(spec, scope, target2) {\n    const encode2 = spec.encode, entry2 = {\n      target: target2\n    };\n    let events2 = spec.events, update2 = spec.update, sources = [];\n    if (!events2) {\n      error(\"Signal update missing events specification.\");\n    }\n    if (isString(events2)) {\n      events2 = eventSelector(events2, scope.isSubscope() ? Scope$1 : View);\n    }\n    events2 = array$4(events2).filter((s2) => s2.signal || s2.scale ? (sources.push(s2), 0) : 1);\n    if (sources.length > 1) {\n      sources = [mergeSources(sources)];\n    }\n    if (events2.length) {\n      sources.push(events2.length > 1 ? {\n        merge: events2\n      } : events2[0]);\n    }\n    if (encode2 != null) {\n      if (update2) error(\"Signal encode and update are mutually exclusive.\");\n      update2 = \"encode(item(),\" + $(encode2) + \")\";\n    }\n    entry2.update = isString(update2) ? parser(update2, scope) : update2.expr != null ? parser(update2.expr, scope) : update2.value != null ? update2.value : update2.signal != null ? {\n      $expr: OP_VALUE_EXPR,\n      $params: {\n        $value: scope.signalRef(update2.signal)\n      }\n    } : error(\"Invalid signal update specification.\");\n    if (spec.force) {\n      entry2.options = {\n        force: true\n      };\n    }\n    sources.forEach((source2) => scope.addUpdate(extend(streamSource(source2, scope), entry2)));\n  }\n  function streamSource(stream2, scope) {\n    return {\n      source: stream2.signal ? scope.signalRef(stream2.signal) : stream2.scale ? scope.scaleRef(stream2.scale) : parseStream(stream2, scope)\n    };\n  }\n  function mergeSources(sources) {\n    return {\n      signal: \"[\" + sources.map((s2) => s2.scale ? 'scale(\"' + s2.scale + '\")' : s2.signal) + \"]\"\n    };\n  }\n  function parseSignalUpdates(signal, scope) {\n    const op = scope.getSignal(signal.name);\n    let expr2 = signal.update;\n    if (signal.init) {\n      if (expr2) {\n        error(\"Signals can not include both init and update expressions.\");\n      } else {\n        expr2 = signal.init;\n        op.initonly = true;\n      }\n    }\n    if (expr2) {\n      expr2 = parser(expr2, scope);\n      op.update = expr2.$expr;\n      op.params = expr2.$params;\n    }\n    if (signal.on) {\n      signal.on.forEach((_) => parseUpdate(_, scope, op.id));\n    }\n  }\n  const transform = (name) => (params2, value2, parent) => entry(name, value2, params2 || void 0, parent);\n  const Aggregate = transform(\"aggregate\");\n  const AxisTicks = transform(\"axisticks\");\n  const Bound = transform(\"bound\");\n  const Collect = transform(\"collect\");\n  const Compare = transform(\"compare\");\n  const DataJoin = transform(\"datajoin\");\n  const Encode = transform(\"encode\");\n  const Expression = transform(\"expression\");\n  const Facet = transform(\"facet\");\n  const Field = transform(\"field\");\n  const Key = transform(\"key\");\n  const LegendEntries = transform(\"legendentries\");\n  const Load = transform(\"load\");\n  const Mark = transform(\"mark\");\n  const MultiExtent = transform(\"multiextent\");\n  const MultiValues = transform(\"multivalues\");\n  const Overlap = transform(\"overlap\");\n  const Params = transform(\"params\");\n  const PreFacet = transform(\"prefacet\");\n  const Projection = transform(\"projection\");\n  const Proxy = transform(\"proxy\");\n  const Relay = transform(\"relay\");\n  const Render = transform(\"render\");\n  const Scale = transform(\"scale\");\n  const Sieve = transform(\"sieve\");\n  const SortItems = transform(\"sortitems\");\n  const ViewLayout = transform(\"viewlayout\");\n  const Values = transform(\"values\");\n  let FIELD_REF_ID = 0;\n  const MULTIDOMAIN_SORT_OPS = {\n    min: \"min\",\n    max: \"max\",\n    count: \"sum\"\n  };\n  function initScale(spec, scope) {\n    const type2 = spec.type || \"linear\";\n    if (!isValidScaleType(type2)) {\n      error(\"Unrecognized scale type: \" + $(type2));\n    }\n    scope.addScale(spec.name, {\n      type: type2,\n      domain: void 0\n    });\n  }\n  function parseScale(spec, scope) {\n    const params2 = scope.getScale(spec.name).params;\n    let key2;\n    params2.domain = parseScaleDomain(spec.domain, spec, scope);\n    if (spec.range != null) {\n      params2.range = parseScaleRange(spec, scope, params2);\n    }\n    if (spec.interpolate != null) {\n      parseScaleInterpolate(spec.interpolate, params2);\n    }\n    if (spec.nice != null) {\n      params2.nice = parseScaleNice(spec.nice, scope);\n    }\n    if (spec.bins != null) {\n      params2.bins = parseScaleBins(spec.bins, scope);\n    }\n    for (key2 in spec) {\n      if (has$1(params2, key2) || key2 === \"name\") continue;\n      params2[key2] = parseLiteral(spec[key2], scope);\n    }\n  }\n  function parseLiteral(v, scope) {\n    return !isObject(v) ? v : v.signal ? scope.signalRef(v.signal) : error(\"Unsupported object: \" + $(v));\n  }\n  function parseArray(v, scope) {\n    return v.signal ? scope.signalRef(v.signal) : v.map((v2) => parseLiteral(v2, scope));\n  }\n  function dataLookupError(name) {\n    error(\"Can not find data set: \" + $(name));\n  }\n  function parseScaleDomain(domain2, spec, scope) {\n    if (!domain2) {\n      if (spec.domainMin != null || spec.domainMax != null) {\n        error(\"No scale domain defined for domainMin/domainMax to override.\");\n      }\n      return;\n    }\n    return domain2.signal ? scope.signalRef(domain2.signal) : (isArray(domain2) ? explicitDomain : domain2.fields ? multipleDomain : singularDomain)(domain2, spec, scope);\n  }\n  function explicitDomain(domain2, spec, scope) {\n    return domain2.map((v) => parseLiteral(v, scope));\n  }\n  function singularDomain(domain2, spec, scope) {\n    const data2 = scope.getData(domain2.data);\n    if (!data2) dataLookupError(domain2.data);\n    return isDiscrete(spec.type) ? data2.valuesRef(scope, domain2.field, parseSort(domain2.sort, false)) : isQuantile(spec.type) ? data2.domainRef(scope, domain2.field) : data2.extentRef(scope, domain2.field);\n  }\n  function multipleDomain(domain2, spec, scope) {\n    const data2 = domain2.data, fields = domain2.fields.reduce((dom, d2) => {\n      d2 = isString(d2) ? {\n        data: data2,\n        field: d2\n      } : isArray(d2) || d2.signal ? fieldRef(d2, scope) : d2;\n      dom.push(d2);\n      return dom;\n    }, []);\n    return (isDiscrete(spec.type) ? ordinalMultipleDomain : isQuantile(spec.type) ? quantileMultipleDomain : numericMultipleDomain)(domain2, scope, fields);\n  }\n  function fieldRef(data2, scope) {\n    const name = \"_:vega:_\" + FIELD_REF_ID++, coll = Collect({});\n    if (isArray(data2)) {\n      coll.value = {\n        $ingest: data2\n      };\n    } else if (data2.signal) {\n      const code = \"setdata(\" + $(name) + \",\" + data2.signal + \")\";\n      coll.params.input = scope.signalRef(code);\n    }\n    scope.addDataPipeline(name, [coll, Sieve({})]);\n    return {\n      data: name,\n      field: \"data\"\n    };\n  }\n  function ordinalMultipleDomain(domain2, scope, fields) {\n    const sort2 = parseSort(domain2.sort, true);\n    let a2, v;\n    const counts = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.countsRef(scope, f.field, sort2);\n    });\n    const p = {\n      groupby: keyFieldRef,\n      pulse: counts\n    };\n    if (sort2) {\n      a2 = sort2.op || \"count\";\n      v = sort2.field ? aggrField(a2, sort2.field) : \"count\";\n      p.ops = [MULTIDOMAIN_SORT_OPS[a2]];\n      p.fields = [scope.fieldRef(v)];\n      p.as = [v];\n    }\n    a2 = scope.add(Aggregate(p));\n    const c2 = scope.add(Collect({\n      pulse: ref(a2)\n    }));\n    v = scope.add(Values({\n      field: keyFieldRef,\n      sort: scope.sortRef(sort2),\n      pulse: ref(c2)\n    }));\n    return ref(v);\n  }\n  function parseSort(sort2, multidomain) {\n    if (sort2) {\n      if (!sort2.field && !sort2.op) {\n        if (isObject(sort2)) sort2.field = \"key\";\n        else sort2 = {\n          field: \"key\"\n        };\n      } else if (!sort2.field && sort2.op !== \"count\") {\n        error(\"No field provided for sort aggregate op: \" + sort2.op);\n      } else if (multidomain && sort2.field) {\n        if (sort2.op && !MULTIDOMAIN_SORT_OPS[sort2.op]) {\n          error(\"Multiple domain scales can not be sorted using \" + sort2.op);\n        }\n      }\n    }\n    return sort2;\n  }\n  function quantileMultipleDomain(domain2, scope, fields) {\n    const values2 = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.domainRef(scope, f.field);\n    });\n    return ref(scope.add(MultiValues({\n      values: values2\n    })));\n  }\n  function numericMultipleDomain(domain2, scope, fields) {\n    const extents = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.extentRef(scope, f.field);\n    });\n    return ref(scope.add(MultiExtent({\n      extents\n    })));\n  }\n  function parseScaleBins(v, scope) {\n    return v.signal || isArray(v) ? parseArray(v, scope) : scope.objectProperty(v);\n  }\n  function parseScaleNice(nice2, scope) {\n    return nice2.signal ? scope.signalRef(nice2.signal) : isObject(nice2) ? {\n      interval: parseLiteral(nice2.interval),\n      step: parseLiteral(nice2.step)\n    } : parseLiteral(nice2);\n  }\n  function parseScaleInterpolate(interpolate2, params2) {\n    params2.interpolate = parseLiteral(interpolate2.type || interpolate2);\n    if (interpolate2.gamma != null) {\n      params2.interpolateGamma = parseLiteral(interpolate2.gamma);\n    }\n  }\n  function parseScaleRange(spec, scope, params2) {\n    const config = scope.config.range;\n    let range2 = spec.range;\n    if (range2.signal) {\n      return scope.signalRef(range2.signal);\n    } else if (isString(range2)) {\n      if (config && has$1(config, range2)) {\n        spec = extend({}, spec, {\n          range: config[range2]\n        });\n        return parseScaleRange(spec, scope, params2);\n      } else if (range2 === \"width\") {\n        range2 = [0, {\n          signal: \"width\"\n        }];\n      } else if (range2 === \"height\") {\n        range2 = isDiscrete(spec.type) ? [0, {\n          signal: \"height\"\n        }] : [{\n          signal: \"height\"\n        }, 0];\n      } else {\n        error(\"Unrecognized scale range value: \" + $(range2));\n      }\n    } else if (range2.scheme) {\n      params2.scheme = isArray(range2.scheme) ? parseArray(range2.scheme, scope) : parseLiteral(range2.scheme, scope);\n      if (range2.extent) params2.schemeExtent = parseArray(range2.extent, scope);\n      if (range2.count) params2.schemeCount = parseLiteral(range2.count, scope);\n      return;\n    } else if (range2.step) {\n      params2.rangeStep = parseLiteral(range2.step, scope);\n      return;\n    } else if (isDiscrete(spec.type) && !isArray(range2)) {\n      return parseScaleDomain(range2, spec, scope);\n    } else if (!isArray(range2)) {\n      error(\"Unsupported range type: \" + $(range2));\n    }\n    return range2.map((v) => (isArray(v) ? parseArray : parseLiteral)(v, scope));\n  }\n  function parseProjection(proj, scope) {\n    const config = scope.config.projection || {}, params2 = {};\n    for (const name in proj) {\n      if (name === \"name\") continue;\n      params2[name] = parseParameter$1(proj[name], name, scope);\n    }\n    for (const name in config) {\n      if (params2[name] == null) {\n        params2[name] = parseParameter$1(config[name], name, scope);\n      }\n    }\n    scope.addProjection(proj.name, params2);\n  }\n  function parseParameter$1(_, name, scope) {\n    return isArray(_) ? _.map((_2) => parseParameter$1(_2, name, scope)) : !isObject(_) ? _ : _.signal ? scope.signalRef(_.signal) : name === \"fit\" ? _ : error(\"Unsupported parameter object: \" + $(_));\n  }\n  const Top = \"top\";\n  const Left = \"left\";\n  const Right = \"right\";\n  const Bottom = \"bottom\";\n  const Center = \"center\";\n  const Vertical = \"vertical\";\n  const Start = \"start\";\n  const Middle = \"middle\";\n  const End = \"end\";\n  const Index = \"index\";\n  const Label = \"label\";\n  const Offset = \"offset\";\n  const Perc = \"perc\";\n  const Perc2 = \"perc2\";\n  const Value = \"value\";\n  const GuideLabelStyle = \"guide-label\";\n  const GuideTitleStyle = \"guide-title\";\n  const GroupTitleStyle = \"group-title\";\n  const GroupSubtitleStyle = \"group-subtitle\";\n  const Symbols = \"symbol\";\n  const Gradient = \"gradient\";\n  const Discrete = \"discrete\";\n  const Size = \"size\";\n  const Shape = \"shape\";\n  const Fill = \"fill\";\n  const Stroke = \"stroke\";\n  const StrokeWidth = \"strokeWidth\";\n  const StrokeDash = \"strokeDash\";\n  const Opacity = \"opacity\";\n  const LegendScales = [Size, Shape, Fill, Stroke, StrokeWidth, StrokeDash, Opacity];\n  const Skip = {\n    name: 1,\n    style: 1,\n    interactive: 1\n  };\n  const zero = {\n    value: 0\n  };\n  const one = {\n    value: 1\n  };\n  const GroupMark = \"group\";\n  const RectMark = \"rect\";\n  const RuleMark = \"rule\";\n  const SymbolMark = \"symbol\";\n  const TextMark = \"text\";\n  function guideGroup(mark) {\n    mark.type = GroupMark;\n    mark.interactive = mark.interactive || false;\n    return mark;\n  }\n  function lookup(spec, config) {\n    const _ = (name, dflt) => value(spec[name], value(config[name], dflt));\n    _.isVertical = (s2) => Vertical === value(spec.direction, config.direction || (s2 ? config.symbolDirection : config.gradientDirection));\n    _.gradientLength = () => value(spec.gradientLength, config.gradientLength || config.gradientWidth);\n    _.gradientThickness = () => value(spec.gradientThickness, config.gradientThickness || config.gradientHeight);\n    _.entryColumns = () => value(spec.columns, value(config.columns, +_.isVertical(true)));\n    return _;\n  }\n  function getEncoding(name, encode2) {\n    const v = encode2 && (encode2.update && encode2.update[name] || encode2.enter && encode2.enter[name]);\n    return v && v.signal ? v : v ? v.value : null;\n  }\n  function getStyle(name, scope, style2) {\n    const s2 = scope.config.style[style2];\n    return s2 && s2[name];\n  }\n  function anchorExpr(s2, e, m2) {\n    return `item.anchor === '${Start}' ? ${s2} : item.anchor === '${End}' ? ${e} : ${m2}`;\n  }\n  const alignExpr$1 = anchorExpr($(Left), $(Right), $(Center));\n  function tickBand(_) {\n    const v = _(\"tickBand\");\n    let offset2 = _(\"tickOffset\"), band2, extra;\n    if (!v) {\n      band2 = _(\"bandPosition\");\n      extra = _(\"tickExtra\");\n    } else if (v.signal) {\n      band2 = {\n        signal: `(${v.signal}) === 'extent' ? 1 : 0.5`\n      };\n      extra = {\n        signal: `(${v.signal}) === 'extent'`\n      };\n      if (!isObject(offset2)) {\n        offset2 = {\n          signal: `(${v.signal}) === 'extent' ? 0 : ${offset2}`\n        };\n      }\n    } else if (v === \"extent\") {\n      band2 = 1;\n      extra = true;\n      offset2 = 0;\n    } else {\n      band2 = 0.5;\n      extra = false;\n    }\n    return {\n      extra,\n      band: band2,\n      offset: offset2\n    };\n  }\n  function extendOffset(value2, offset2) {\n    return !offset2 ? value2 : !value2 ? offset2 : !isObject(value2) ? {\n      value: value2,\n      offset: offset2\n    } : Object.assign({}, value2, {\n      offset: extendOffset(value2.offset, offset2)\n    });\n  }\n  function guideMark(mark, extras) {\n    if (extras) {\n      mark.name = extras.name;\n      mark.style = extras.style || mark.style;\n      mark.interactive = !!extras.interactive;\n      mark.encode = extendEncode(mark.encode, extras, Skip);\n    } else {\n      mark.interactive = false;\n    }\n    return mark;\n  }\n  function legendGradient(spec, scale2, config, userEncode) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length2 = _.gradientLength();\n    let enter, start, stop2, width2, height2;\n    if (vertical) {\n      start = [0, 1];\n      stop2 = [0, 0];\n      width2 = thickness;\n      height2 = length2;\n    } else {\n      start = [0, 0];\n      stop2 = [1, 0];\n      width2 = length2;\n      height2 = thickness;\n    }\n    const encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: zero,\n        y: zero,\n        width: encoder(width2),\n        height: encoder(height2)\n      },\n      update: extend({}, enter, {\n        opacity: one,\n        fill: {\n          gradient: scale2,\n          start,\n          stop: stop2\n        }\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gradientStrokeColor\"),\n      strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n      type: RectMark,\n      role: LegendGradientRole,\n      encode: encode2\n    }, userEncode);\n  }\n  function legendGradientDiscrete(spec, scale2, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length2 = _.gradientLength();\n    let u2, v, uu, vv, adjust = \"\";\n    vertical ? (u2 = \"y\", uu = \"y2\", v = \"x\", vv = \"width\", adjust = \"1-\") : (u2 = \"x\", uu = \"x2\", v = \"y\", vv = \"height\");\n    const enter = {\n      opacity: zero,\n      fill: {\n        scale: scale2,\n        field: Value\n      }\n    };\n    enter[u2] = {\n      signal: adjust + \"datum.\" + Perc,\n      mult: length2\n    };\n    enter[v] = zero;\n    enter[uu] = {\n      signal: adjust + \"datum.\" + Perc2,\n      mult: length2\n    };\n    enter[vv] = encoder(thickness);\n    const encode2 = {\n      enter,\n      update: extend({}, enter, {\n        opacity: one\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gradientStrokeColor\"),\n      strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n      type: RectMark,\n      role: LegendBandRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  const alignExpr = `datum.${Perc}<=0?\"${Left}\":datum.${Perc}>=1?\"${Right}\":\"${Center}\"`, baselineExpr = `datum.${Perc}<=0?\"${Bottom}\":datum.${Perc}>=1?\"${Top}\":\"${Middle}\"`;\n  function legendGradientLabels(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = encoder(_.gradientThickness()), length2 = _.gradientLength();\n    let overlap = _(\"labelOverlap\"), enter, update2, u2, v, adjust = \"\";\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        }\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontStyle: _(\"labelFontStyle\"),\n      fontWeight: _(\"labelFontWeight\"),\n      limit: value(spec.labelLimit, config.gradientLabelLimit)\n    });\n    if (vertical) {\n      enter.align = {\n        value: \"left\"\n      };\n      enter.baseline = update2.baseline = {\n        signal: baselineExpr\n      };\n      u2 = \"y\";\n      v = \"x\";\n      adjust = \"1-\";\n    } else {\n      enter.align = update2.align = {\n        signal: alignExpr\n      };\n      enter.baseline = {\n        value: \"top\"\n      };\n      u2 = \"x\";\n      v = \"y\";\n    }\n    enter[u2] = update2[u2] = {\n      signal: adjust + \"datum.\" + Perc,\n      mult: length2\n    };\n    enter[v] = update2[v] = thickness;\n    thickness.offset = value(spec.labelOffset, config.gradientLabelOffset) || 0;\n    overlap = overlap ? {\n      separation: _(\"labelSeparation\"),\n      method: overlap,\n      order: \"datum.\" + Index\n    } : void 0;\n    return guideMark({\n      type: TextMark,\n      role: LegendLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: dataRef,\n      encode: encode2,\n      overlap\n    }, userEncode);\n  }\n  function legendSymbolGroups(spec, config, userEncode, dataRef, columns) {\n    const _ = lookup(spec, config), entries = userEncode.entries, interactive2 = !!(entries && entries.interactive), name = entries ? entries.name : void 0, height2 = _(\"clipHeight\"), symbolOffset = _(\"symbolOffset\"), valueRef = {\n      data: \"value\"\n    }, xSignal = `(${columns}) ? datum.${Offset} : datum.${Size}`, yEncode = height2 ? encoder(height2) : {\n      field: Size\n    }, index2 = `datum.${Index}`, ncols = `max(1, ${columns})`;\n    let encode2, enter, update2, nrows, sort2;\n    yEncode.mult = 0.5;\n    encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: {\n          signal: xSignal,\n          mult: 0.5,\n          offset: symbolOffset\n        },\n        y: yEncode\n      },\n      update: update2 = {\n        opacity: one,\n        x: enter.x,\n        y: enter.y\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    let baseFill = null, baseStroke = null;\n    if (!spec.fill) {\n      baseFill = config.symbolBaseFillColor;\n      baseStroke = config.symbolBaseStrokeColor;\n    }\n    addEncoders(encode2, {\n      fill: _(\"symbolFillColor\", baseFill),\n      shape: _(\"symbolType\"),\n      size: _(\"symbolSize\"),\n      stroke: _(\"symbolStrokeColor\", baseStroke),\n      strokeDash: _(\"symbolDash\"),\n      strokeDashOffset: _(\"symbolDashOffset\"),\n      strokeWidth: _(\"symbolStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"symbolOpacity\")\n    });\n    LegendScales.forEach((scale2) => {\n      if (spec[scale2]) {\n        update2[scale2] = enter[scale2] = {\n          scale: spec[scale2],\n          field: Value\n        };\n      }\n    });\n    const symbols2 = guideMark({\n      type: SymbolMark,\n      role: LegendSymbolRole,\n      key: Value,\n      from: valueRef,\n      clip: height2 ? true : void 0,\n      encode: encode2\n    }, userEncode.symbols);\n    const labelOffset = encoder(symbolOffset);\n    labelOffset.offset = _(\"labelOffset\");\n    encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: {\n          signal: xSignal,\n          offset: labelOffset\n        },\n        y: yEncode\n      },\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        },\n        x: enter.x,\n        y: enter.y\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      align: _(\"labelAlign\"),\n      baseline: _(\"labelBaseline\"),\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontStyle: _(\"labelFontStyle\"),\n      fontWeight: _(\"labelFontWeight\"),\n      limit: _(\"labelLimit\")\n    });\n    const labels = guideMark({\n      type: TextMark,\n      role: LegendLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: valueRef,\n      encode: encode2\n    }, userEncode.labels);\n    encode2 = {\n      enter: {\n        noBound: {\n          value: !height2\n        },\n        // ignore width/height in bounds calc\n        width: zero,\n        height: height2 ? encoder(height2) : zero,\n        opacity: zero\n      },\n      exit: {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one,\n        row: {\n          signal: null\n        },\n        column: {\n          signal: null\n        }\n      }\n    };\n    if (_.isVertical(true)) {\n      nrows = `ceil(item.mark.items.length / ${ncols})`;\n      update2.row.signal = `${index2}%${nrows}`;\n      update2.column.signal = `floor(${index2} / ${nrows})`;\n      sort2 = {\n        field: [\"row\", index2]\n      };\n    } else {\n      update2.row.signal = `floor(${index2} / ${ncols})`;\n      update2.column.signal = `${index2} % ${ncols}`;\n      sort2 = {\n        field: index2\n      };\n    }\n    update2.column.signal = `(${columns})?${update2.column.signal}:${index2}`;\n    dataRef = {\n      facet: {\n        data: dataRef,\n        name: \"value\",\n        groupby: Index\n      }\n    };\n    return guideGroup({\n      role: ScopeRole,\n      from: dataRef,\n      encode: extendEncode(encode2, entries, Skip),\n      marks: [symbols2, labels],\n      name,\n      interactive: interactive2,\n      sort: sort2\n    });\n  }\n  function legendSymbolLayout(spec, config) {\n    const _ = lookup(spec, config);\n    return {\n      align: _(\"gridAlign\"),\n      columns: _.entryColumns(),\n      center: {\n        row: true,\n        column: false\n      },\n      padding: {\n        row: _(\"rowPadding\"),\n        column: _(\"columnPadding\")\n      }\n    };\n  }\n  const isL = 'item.orient === \"left\"', isR = 'item.orient === \"right\"', isLR = `(${isL} || ${isR})`, isVG = `datum.vgrad && ${isLR}`, baseline = anchorExpr('\"top\"', '\"bottom\"', '\"middle\"'), alignFlip = anchorExpr('\"right\"', '\"left\"', '\"center\"'), exprAlign = `datum.vgrad && ${isR} ? (${alignFlip}) : (${isLR} && !(datum.vgrad && ${isL})) ? \"left\" : ${alignExpr$1}`, exprAnchor = `item._anchor || (${isLR} ? \"middle\" : \"start\")`, exprAngle = `${isVG} ? (${isL} ? -90 : 90) : 0`, exprBaseline = `${isLR} ? (datum.vgrad ? (${isR} ? \"bottom\" : \"top\") : ${baseline}) : \"top\"`;\n  function legendTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config);\n    const encode2 = {\n      enter: {\n        opacity: zero\n      },\n      update: {\n        opacity: one,\n        x: {\n          field: {\n            group: \"padding\"\n          }\n        },\n        y: {\n          field: {\n            group: \"padding\"\n          }\n        }\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      orient: _(\"titleOrient\"),\n      _anchor: _(\"titleAnchor\"),\n      anchor: {\n        signal: exprAnchor\n      },\n      angle: {\n        signal: exprAngle\n      },\n      align: {\n        signal: exprAlign\n      },\n      baseline: {\n        signal: exprBaseline\n      },\n      text: spec.title,\n      fill: _(\"titleColor\"),\n      fillOpacity: _(\"titleOpacity\"),\n      font: _(\"titleFont\"),\n      fontSize: _(\"titleFontSize\"),\n      fontStyle: _(\"titleFontStyle\"),\n      fontWeight: _(\"titleFontWeight\"),\n      limit: _(\"titleLimit\"),\n      lineHeight: _(\"titleLineHeight\")\n    }, {\n      // require update\n      align: _(\"titleAlign\"),\n      baseline: _(\"titleBaseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: LegendTitleRole,\n      style: GuideTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function clip(clip2, scope) {\n    let expr2;\n    if (isObject(clip2)) {\n      if (clip2.signal) {\n        expr2 = clip2.signal;\n      } else if (clip2.path) {\n        expr2 = \"pathShape(\" + param(clip2.path) + \")\";\n      } else if (clip2.sphere) {\n        expr2 = \"geoShape(\" + param(clip2.sphere) + ', {type: \"Sphere\"})';\n      }\n    }\n    return expr2 ? scope.signalRef(expr2) : !!clip2;\n  }\n  function param(value2) {\n    return isObject(value2) && value2.signal ? value2.signal : $(value2);\n  }\n  function getRole(spec) {\n    const role = spec.role || \"\";\n    return role.startsWith(\"axis\") || role.startsWith(\"legend\") || role.startsWith(\"title\") ? role : spec.type === GroupMark ? ScopeRole : role || MarkRole;\n  }\n  function definition(spec) {\n    return {\n      marktype: spec.type,\n      name: spec.name || void 0,\n      role: spec.role || getRole(spec),\n      zindex: +spec.zindex || void 0,\n      aria: spec.aria,\n      description: spec.description\n    };\n  }\n  function interactive(spec, scope) {\n    return spec && spec.signal ? scope.signalRef(spec.signal) : spec === false ? false : true;\n  }\n  function parseTransform(spec, scope) {\n    const def2 = definition$1(spec.type);\n    if (!def2) error(\"Unrecognized transform type: \" + $(spec.type));\n    const t = entry(def2.type.toLowerCase(), null, parseParameters(def2, spec, scope));\n    if (spec.signal) scope.addSignal(spec.signal, scope.proxy(t));\n    t.metadata = def2.metadata || {};\n    return t;\n  }\n  function parseParameters(def2, spec, scope) {\n    const params2 = {}, n = def2.params.length;\n    for (let i = 0; i < n; ++i) {\n      const pdef = def2.params[i];\n      params2[pdef.name] = parseParameter(pdef, spec, scope);\n    }\n    return params2;\n  }\n  function parseParameter(def2, spec, scope) {\n    const type2 = def2.type, value2 = spec[def2.name];\n    if (type2 === \"index\") {\n      return parseIndexParameter(def2, spec, scope);\n    } else if (value2 === void 0) {\n      if (def2.required) {\n        error(\"Missing required \" + $(spec.type) + \" parameter: \" + $(def2.name));\n      }\n      return;\n    } else if (type2 === \"param\") {\n      return parseSubParameters(def2, spec, scope);\n    } else if (type2 === \"projection\") {\n      return scope.projectionRef(spec[def2.name]);\n    }\n    return def2.array && !isSignal(value2) ? value2.map((v) => parameterValue(def2, v, scope)) : parameterValue(def2, value2, scope);\n  }\n  function parameterValue(def2, value2, scope) {\n    const type2 = def2.type;\n    if (isSignal(value2)) {\n      return isExpr(type2) ? error(\"Expression references can not be signals.\") : isField(type2) ? scope.fieldRef(value2) : isCompare(type2) ? scope.compareRef(value2) : scope.signalRef(value2.signal);\n    } else {\n      const expr2 = def2.expr || isField(type2);\n      return expr2 && outerExpr(value2) ? scope.exprRef(value2.expr, value2.as) : expr2 && outerField(value2) ? fieldRef$1(value2.field, value2.as) : isExpr(type2) ? parser(value2, scope) : isData(type2) ? ref(scope.getData(value2).values) : isField(type2) ? fieldRef$1(value2) : isCompare(type2) ? scope.compareRef(value2) : value2;\n    }\n  }\n  function parseIndexParameter(def2, spec, scope) {\n    if (!isString(spec.from)) {\n      error('Lookup \"from\" parameter must be a string literal.');\n    }\n    return scope.getData(spec.from).lookupRef(scope, spec.key);\n  }\n  function parseSubParameters(def2, spec, scope) {\n    const value2 = spec[def2.name];\n    if (def2.array) {\n      if (!isArray(value2)) {\n        error(\"Expected an array of sub-parameters. Instead: \" + $(value2));\n      }\n      return value2.map((v) => parseSubParameter(def2, v, scope));\n    } else {\n      return parseSubParameter(def2, value2, scope);\n    }\n  }\n  function parseSubParameter(def2, value2, scope) {\n    const n = def2.params.length;\n    let pdef;\n    for (let i = 0; i < n; ++i) {\n      pdef = def2.params[i];\n      for (const k in pdef.key) {\n        if (pdef.key[k] !== value2[k]) {\n          pdef = null;\n          break;\n        }\n      }\n      if (pdef) break;\n    }\n    if (!pdef) error(\"Unsupported parameter: \" + $(value2));\n    const params2 = extend(parseParameters(pdef, value2, scope), pdef.key);\n    return ref(scope.add(Params(params2)));\n  }\n  const outerExpr = (_) => _ && _.expr;\n  const outerField = (_) => _ && _.field;\n  const isData = (_) => _ === \"data\";\n  const isExpr = (_) => _ === \"expr\";\n  const isField = (_) => _ === \"field\";\n  const isCompare = (_) => _ === \"compare\";\n  function parseData$1(from, group2, scope) {\n    let facet, key2, op, dataRef, parent;\n    if (!from) {\n      dataRef = ref(scope.add(Collect(null, [{}])));\n    } else if (facet = from.facet) {\n      if (!group2) error(\"Only group marks can be faceted.\");\n      if (facet.field != null) {\n        dataRef = parent = getDataRef(facet, scope);\n      } else {\n        if (!from.data) {\n          op = parseTransform(extend({\n            type: \"aggregate\",\n            groupby: array$4(facet.groupby)\n          }, facet.aggregate), scope);\n          op.params.key = scope.keyRef(facet.groupby);\n          op.params.pulse = getDataRef(facet, scope);\n          dataRef = parent = ref(scope.add(op));\n        } else {\n          parent = ref(scope.getData(from.data).aggregate);\n        }\n        key2 = scope.keyRef(facet.groupby, true);\n      }\n    }\n    if (!dataRef) {\n      dataRef = getDataRef(from, scope);\n    }\n    return {\n      key: key2,\n      pulse: dataRef,\n      parent\n    };\n  }\n  function getDataRef(from, scope) {\n    return from.$ref ? from : from.data && from.data.$ref ? from.data : ref(scope.getData(from.data).output);\n  }\n  function DataScope(scope, input, output2, values2, aggr) {\n    this.scope = scope;\n    this.input = input;\n    this.output = output2;\n    this.values = values2;\n    this.aggregate = aggr;\n    this.index = {};\n  }\n  DataScope.fromEntries = function(scope, entries) {\n    const n = entries.length, values2 = entries[n - 1], output2 = entries[n - 2];\n    let input = entries[0], aggr = null, i = 1;\n    if (input && input.type === \"load\") {\n      input = entries[1];\n    }\n    scope.add(entries[0]);\n    for (; i < n; ++i) {\n      entries[i].params.pulse = ref(entries[i - 1]);\n      scope.add(entries[i]);\n      if (entries[i].type === \"aggregate\") aggr = entries[i];\n    }\n    return new DataScope(scope, input, output2, values2, aggr);\n  };\n  function fieldKey(field2) {\n    return isString(field2) ? field2 : null;\n  }\n  function addSortField(scope, p, sort2) {\n    const as = aggrField(sort2.op, sort2.field);\n    let s2;\n    if (p.ops) {\n      for (let i = 0, n = p.as.length; i < n; ++i) {\n        if (p.as[i] === as) return;\n      }\n    } else {\n      p.ops = [\"count\"];\n      p.fields = [null];\n      p.as = [\"count\"];\n    }\n    if (sort2.op) {\n      p.ops.push((s2 = sort2.op.signal) ? scope.signalRef(s2) : sort2.op);\n      p.fields.push(scope.fieldRef(sort2.field));\n      p.as.push(as);\n    }\n  }\n  function cache(scope, ds, name, optype, field2, counts, index2) {\n    const cache2 = ds[name] || (ds[name] = {}), sort2 = sortKey(counts);\n    let k = fieldKey(field2), v, op;\n    if (k != null) {\n      scope = ds.scope;\n      k = k + (sort2 ? \"|\" + sort2 : \"\");\n      v = cache2[k];\n    }\n    if (!v) {\n      const params2 = counts ? {\n        field: keyFieldRef,\n        pulse: ds.countsRef(scope, field2, counts)\n      } : {\n        field: scope.fieldRef(field2),\n        pulse: ref(ds.output)\n      };\n      if (sort2) params2.sort = scope.sortRef(counts);\n      op = scope.add(entry(optype, void 0, params2));\n      if (index2) ds.index[field2] = op;\n      v = ref(op);\n      if (k != null) cache2[k] = v;\n    }\n    return v;\n  }\n  DataScope.prototype = {\n    countsRef(scope, field2, sort2) {\n      const ds = this, cache2 = ds.counts || (ds.counts = {}), k = fieldKey(field2);\n      let v, a2, p;\n      if (k != null) {\n        scope = ds.scope;\n        v = cache2[k];\n      }\n      if (!v) {\n        p = {\n          groupby: scope.fieldRef(field2, \"key\"),\n          pulse: ref(ds.output)\n        };\n        if (sort2 && sort2.field) addSortField(scope, p, sort2);\n        a2 = scope.add(Aggregate(p));\n        v = scope.add(Collect({\n          pulse: ref(a2)\n        }));\n        v = {\n          agg: a2,\n          ref: ref(v)\n        };\n        if (k != null) cache2[k] = v;\n      } else if (sort2 && sort2.field) {\n        addSortField(scope, v.agg.params, sort2);\n      }\n      return v.ref;\n    },\n    tuplesRef() {\n      return ref(this.values);\n    },\n    extentRef(scope, field2) {\n      return cache(scope, this, \"extent\", \"extent\", field2, false);\n    },\n    domainRef(scope, field2) {\n      return cache(scope, this, \"domain\", \"values\", field2, false);\n    },\n    valuesRef(scope, field2, sort2) {\n      return cache(scope, this, \"vals\", \"values\", field2, sort2 || true);\n    },\n    lookupRef(scope, field2) {\n      return cache(scope, this, \"lookup\", \"tupleindex\", field2, false);\n    },\n    indataRef(scope, field2) {\n      return cache(scope, this, \"indata\", \"tupleindex\", field2, true, true);\n    }\n  };\n  function parseFacet(spec, scope, group2) {\n    const facet = spec.from.facet, name = facet.name, data2 = getDataRef(facet, scope);\n    let op;\n    if (!facet.name) {\n      error(\"Facet must have a name: \" + $(facet));\n    }\n    if (!facet.data) {\n      error(\"Facet must reference a data set: \" + $(facet));\n    }\n    if (facet.field) {\n      op = scope.add(PreFacet({\n        field: scope.fieldRef(facet.field),\n        pulse: data2\n      }));\n    } else if (facet.groupby) {\n      op = scope.add(Facet({\n        key: scope.keyRef(facet.groupby),\n        group: ref(scope.proxy(group2.parent)),\n        pulse: data2\n      }));\n    } else {\n      error(\"Facet must specify groupby or field: \" + $(facet));\n    }\n    const subscope = scope.fork(), source2 = subscope.add(Collect()), values2 = subscope.add(Sieve({\n      pulse: ref(source2)\n    }));\n    subscope.addData(name, new DataScope(subscope, source2, source2, values2));\n    subscope.addSignal(\"parent\", null);\n    op.params.subflow = {\n      $subflow: subscope.parse(spec).toRuntime()\n    };\n  }\n  function parseSubflow(spec, scope, input) {\n    const op = scope.add(PreFacet({\n      pulse: input.pulse\n    })), subscope = scope.fork();\n    subscope.add(Sieve());\n    subscope.addSignal(\"parent\", null);\n    op.params.subflow = {\n      $subflow: subscope.parse(spec).toRuntime()\n    };\n  }\n  function parseTrigger(spec, scope, name) {\n    const remove2 = spec.remove, insert2 = spec.insert, toggle = spec.toggle, modify2 = spec.modify, values2 = spec.values, op = scope.add(operator());\n    const update2 = \"if(\" + spec.trigger + ',modify(\"' + name + '\",' + [insert2, remove2, toggle, modify2, values2].map((_) => _ == null ? \"null\" : _).join(\",\") + \"),0)\";\n    const expr2 = parser(update2, scope);\n    op.update = expr2.$expr;\n    op.params = expr2.$params;\n  }\n  function parseMark(spec, scope) {\n    const role = getRole(spec), group2 = spec.type === GroupMark, facet = spec.from && spec.from.facet, overlap = spec.overlap;\n    let layout = spec.layout || role === ScopeRole || role === FrameRole, ops2, op, store, enc, name, layoutRef, boundRef;\n    const nested = role === MarkRole || layout || facet;\n    const input = parseData$1(spec.from, group2, scope);\n    op = scope.add(DataJoin({\n      key: input.key || (spec.key ? fieldRef$1(spec.key) : void 0),\n      pulse: input.pulse,\n      clean: !group2\n    }));\n    const joinRef = ref(op);\n    op = store = scope.add(Collect({\n      pulse: joinRef\n    }));\n    op = scope.add(Mark({\n      markdef: definition(spec),\n      interactive: interactive(spec.interactive, scope),\n      clip: clip(spec.clip, scope),\n      context: {\n        $context: true\n      },\n      groups: scope.lookup(),\n      parent: scope.signals.parent ? scope.signalRef(\"parent\") : null,\n      index: scope.markpath(),\n      pulse: ref(op)\n    }));\n    const markRef = ref(op);\n    op = enc = scope.add(Encode(parseEncode(spec.encode, spec.type, role, spec.style, scope, {\n      mod: false,\n      pulse: markRef\n    })));\n    op.params.parent = scope.encode();\n    if (spec.transform) {\n      spec.transform.forEach((_) => {\n        const tx2 = parseTransform(_, scope), md2 = tx2.metadata;\n        if (md2.generates || md2.changes) {\n          error(\"Mark transforms should not generate new data.\");\n        }\n        if (!md2.nomod) enc.params.mod = true;\n        tx2.params.pulse = ref(op);\n        scope.add(op = tx2);\n      });\n    }\n    if (spec.sort) {\n      op = scope.add(SortItems({\n        sort: scope.compareRef(spec.sort),\n        pulse: ref(op)\n      }));\n    }\n    const encodeRef = ref(op);\n    if (facet || layout) {\n      layout = scope.add(ViewLayout({\n        layout: scope.objectProperty(spec.layout),\n        legends: scope.legends,\n        mark: markRef,\n        pulse: encodeRef\n      }));\n      layoutRef = ref(layout);\n    }\n    const bound2 = scope.add(Bound({\n      mark: markRef,\n      pulse: layoutRef || encodeRef\n    }));\n    boundRef = ref(bound2);\n    if (group2) {\n      if (nested) {\n        ops2 = scope.operators;\n        ops2.pop();\n        if (layout) ops2.pop();\n      }\n      scope.pushState(encodeRef, layoutRef || boundRef, joinRef);\n      facet ? parseFacet(spec, scope, input) : nested ? parseSubflow(spec, scope, input) : scope.parse(spec);\n      scope.popState();\n      if (nested) {\n        if (layout) ops2.push(layout);\n        ops2.push(bound2);\n      }\n    }\n    if (overlap) {\n      boundRef = parseOverlap(overlap, boundRef, scope);\n    }\n    const render = scope.add(Render({\n      pulse: boundRef\n    })), sieve = scope.add(Sieve({\n      pulse: ref(render)\n    }, void 0, scope.parent()));\n    if (spec.name != null) {\n      name = spec.name;\n      scope.addData(name, new DataScope(scope, store, render, sieve));\n      if (spec.on) spec.on.forEach((on2) => {\n        if (on2.insert || on2.remove || on2.toggle) {\n          error(\"Marks only support modify triggers.\");\n        }\n        parseTrigger(on2, scope, name);\n      });\n    }\n  }\n  function parseOverlap(overlap, source2, scope) {\n    const method2 = overlap.method, bound2 = overlap.bound, sep = overlap.separation;\n    const params2 = {\n      separation: isSignal(sep) ? scope.signalRef(sep.signal) : sep,\n      method: isSignal(method2) ? scope.signalRef(method2.signal) : method2,\n      pulse: source2\n    };\n    if (overlap.order) {\n      params2.sort = scope.compareRef({\n        field: overlap.order\n      });\n    }\n    if (bound2) {\n      const tol = bound2.tolerance;\n      params2.boundTolerance = isSignal(tol) ? scope.signalRef(tol.signal) : +tol;\n      params2.boundScale = scope.scaleRef(bound2.scale);\n      params2.boundOrient = bound2.orient;\n    }\n    return ref(scope.add(Overlap(params2)));\n  }\n  function parseLegend(spec, scope) {\n    const config = scope.config.legend, encode2 = spec.encode || {}, _ = lookup(spec, config), legendEncode = encode2.legend || {}, name = legendEncode.name || void 0, interactive2 = legendEncode.interactive, style2 = legendEncode.style, scales2 = {};\n    let scale2 = 0, entryLayout, params2, children2;\n    LegendScales.forEach((s2) => spec[s2] ? (scales2[s2] = spec[s2], scale2 = scale2 || spec[s2]) : 0);\n    if (!scale2) error(\"Missing valid scale for legend.\");\n    const type2 = legendType(spec, scope.scaleType(scale2));\n    const datum2 = {\n      title: spec.title != null,\n      scales: scales2,\n      type: type2,\n      vgrad: type2 !== \"symbol\" && _.isVertical()\n    };\n    const dataRef = ref(scope.add(Collect(null, [datum2])));\n    const entryEncode = {\n      enter: {\n        x: {\n          value: 0\n        },\n        y: {\n          value: 0\n        }\n      }\n    };\n    const entryRef = ref(scope.add(LegendEntries(params2 = {\n      type: type2,\n      scale: scope.scaleRef(scale2),\n      count: scope.objectProperty(_(\"tickCount\")),\n      limit: scope.property(_(\"symbolLimit\")),\n      values: scope.objectProperty(spec.values),\n      minstep: scope.property(spec.tickMinStep),\n      formatType: scope.property(spec.formatType),\n      formatSpecifier: scope.property(spec.format)\n    })));\n    if (type2 === Gradient) {\n      children2 = [legendGradient(spec, scale2, config, encode2.gradient), legendGradientLabels(spec, config, encode2.labels, entryRef)];\n      params2.count = params2.count || scope.signalRef(`max(2,2*floor((${deref(_.gradientLength())})/100))`);\n    } else if (type2 === Discrete) {\n      children2 = [legendGradientDiscrete(spec, scale2, config, encode2.gradient, entryRef), legendGradientLabels(spec, config, encode2.labels, entryRef)];\n    } else {\n      entryLayout = legendSymbolLayout(spec, config);\n      children2 = [legendSymbolGroups(spec, config, encode2, entryRef, deref(entryLayout.columns))];\n      params2.size = sizeExpression(spec, scope, children2[0].marks);\n    }\n    children2 = [guideGroup({\n      role: LegendEntryRole,\n      from: dataRef,\n      encode: entryEncode,\n      marks: children2,\n      layout: entryLayout,\n      interactive: interactive2\n    })];\n    if (datum2.title) {\n      children2.push(legendTitle(spec, config, encode2.title, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: LegendRole,\n      from: dataRef,\n      encode: extendEncode(buildLegendEncode(_, spec, config), legendEncode, Skip),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function legendType(spec, scaleType) {\n    let type2 = spec.type || Symbols;\n    if (!spec.type && scaleCount(spec) === 1 && (spec.fill || spec.stroke)) {\n      type2 = isContinuous(scaleType) ? Gradient : isDiscretizing(scaleType) ? Discrete : Symbols;\n    }\n    return type2 !== Gradient ? type2 : isDiscretizing(scaleType) ? Discrete : Gradient;\n  }\n  function scaleCount(spec) {\n    return LegendScales.reduce((count2, type2) => count2 + (spec[type2] ? 1 : 0), 0);\n  }\n  function buildLegendEncode(_, spec, config) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      offset: _(\"offset\"),\n      padding: _(\"padding\"),\n      titlePadding: _(\"titlePadding\"),\n      cornerRadius: _(\"cornerRadius\"),\n      fill: _(\"fillColor\"),\n      stroke: _(\"strokeColor\"),\n      strokeWidth: config.strokeWidth,\n      strokeDash: config.strokeDash,\n      x: _(\"legendX\"),\n      y: _(\"legendY\"),\n      // accessibility support\n      format: spec.format,\n      formatType: spec.formatType\n    });\n    return encode2;\n  }\n  function sizeExpression(spec, scope, marks) {\n    const size = deref(getChannel(\"size\", spec, marks)), strokeWidth = deref(getChannel(\"strokeWidth\", spec, marks)), fontSize2 = deref(getFontSize(marks[1].encode, scope, GuideLabelStyle));\n    return parser(`max(ceil(sqrt(${size})+${strokeWidth}),${fontSize2})`, scope);\n  }\n  function getChannel(name, spec, marks) {\n    return spec[name] ? `scale(\"${spec[name]}\",datum)` : getEncoding(name, marks[0].encode);\n  }\n  function getFontSize(encode2, scope, style2) {\n    return getEncoding(\"fontSize\", encode2) || getStyle(\"fontSize\", scope, style2);\n  }\n  const angleExpr = `item.orient===\"${Left}\"?-90:item.orient===\"${Right}\"?90:0`;\n  function parseTitle(spec, scope) {\n    spec = isString(spec) ? {\n      text: spec\n    } : spec;\n    const _ = lookup(spec, scope.config.title), encode2 = spec.encode || {}, userEncode = encode2.group || {}, name = userEncode.name || void 0, interactive2 = userEncode.interactive, style2 = userEncode.style, children2 = [];\n    const datum2 = {}, dataRef = ref(scope.add(Collect(null, [datum2])));\n    children2.push(buildTitle(spec, _, titleEncode(spec), dataRef));\n    if (spec.subtitle) {\n      children2.push(buildSubTitle(spec, _, encode2.subtitle, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: TitleRole,\n      from: dataRef,\n      encode: groupEncode(_, userEncode),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function titleEncode(spec) {\n    const encode2 = spec.encode;\n    return encode2 && encode2.title || extend({\n      name: spec.name,\n      interactive: spec.interactive,\n      style: spec.style\n    }, encode2);\n  }\n  function groupEncode(_, userEncode) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      anchor: _(\"anchor\"),\n      align: {\n        signal: alignExpr$1\n      },\n      angle: {\n        signal: angleExpr\n      },\n      limit: _(\"limit\"),\n      frame: _(\"frame\"),\n      offset: _(\"offset\") || 0,\n      padding: _(\"subtitlePadding\")\n    });\n    return extendEncode(encode2, userEncode, Skip);\n  }\n  function buildTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n      value: 0\n    }, text2 = spec.text, encode2 = {\n      enter: {\n        opacity: zero2\n      },\n      update: {\n        opacity: {\n          value: 1\n        }\n      },\n      exit: {\n        opacity: zero2\n      }\n    };\n    addEncoders(encode2, {\n      text: text2,\n      align: {\n        signal: \"item.mark.group.align\"\n      },\n      angle: {\n        signal: \"item.mark.group.angle\"\n      },\n      limit: {\n        signal: \"item.mark.group.limit\"\n      },\n      baseline: \"top\",\n      dx: _(\"dx\"),\n      dy: _(\"dy\"),\n      fill: _(\"color\"),\n      font: _(\"font\"),\n      fontSize: _(\"fontSize\"),\n      fontStyle: _(\"fontStyle\"),\n      fontWeight: _(\"fontWeight\"),\n      lineHeight: _(\"lineHeight\")\n    }, {\n      // update\n      align: _(\"align\"),\n      angle: _(\"angle\"),\n      baseline: _(\"baseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: TitleTextRole,\n      style: GroupTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function buildSubTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n      value: 0\n    }, text2 = spec.subtitle, encode2 = {\n      enter: {\n        opacity: zero2\n      },\n      update: {\n        opacity: {\n          value: 1\n        }\n      },\n      exit: {\n        opacity: zero2\n      }\n    };\n    addEncoders(encode2, {\n      text: text2,\n      align: {\n        signal: \"item.mark.group.align\"\n      },\n      angle: {\n        signal: \"item.mark.group.angle\"\n      },\n      limit: {\n        signal: \"item.mark.group.limit\"\n      },\n      baseline: \"top\",\n      dx: _(\"dx\"),\n      dy: _(\"dy\"),\n      fill: _(\"subtitleColor\"),\n      font: _(\"subtitleFont\"),\n      fontSize: _(\"subtitleFontSize\"),\n      fontStyle: _(\"subtitleFontStyle\"),\n      fontWeight: _(\"subtitleFontWeight\"),\n      lineHeight: _(\"subtitleLineHeight\")\n    }, {\n      // update\n      align: _(\"align\"),\n      angle: _(\"angle\"),\n      baseline: _(\"baseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: TitleSubtitleRole,\n      style: GroupSubtitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function parseData(data2, scope) {\n    const transforms2 = [];\n    if (data2.transform) {\n      data2.transform.forEach((tx2) => {\n        transforms2.push(parseTransform(tx2, scope));\n      });\n    }\n    if (data2.on) {\n      data2.on.forEach((on2) => {\n        parseTrigger(on2, scope, data2.name);\n      });\n    }\n    scope.addDataPipeline(data2.name, analyze(data2, scope, transforms2));\n  }\n  function analyze(data2, scope, ops2) {\n    const output2 = [];\n    let source2 = null, modify2 = false, generate2 = false, upstream, i, n, t, m2;\n    if (data2.values) {\n      if (isSignal(data2.values) || hasSignal(data2.format)) {\n        output2.push(load(scope, data2));\n        output2.push(source2 = collect());\n      } else {\n        output2.push(source2 = collect({\n          $ingest: data2.values,\n          $format: data2.format\n        }));\n      }\n    } else if (data2.url) {\n      if (hasSignal(data2.url) || hasSignal(data2.format)) {\n        output2.push(load(scope, data2));\n        output2.push(source2 = collect());\n      } else {\n        output2.push(source2 = collect({\n          $request: data2.url,\n          $format: data2.format\n        }));\n      }\n    } else if (data2.source) {\n      source2 = upstream = array$4(data2.source).map((d2) => ref(scope.getData(d2).output));\n      output2.push(null);\n    }\n    for (i = 0, n = ops2.length; i < n; ++i) {\n      t = ops2[i];\n      m2 = t.metadata;\n      if (!source2 && !m2.source) {\n        output2.push(source2 = collect());\n      }\n      output2.push(t);\n      if (m2.generates) generate2 = true;\n      if (m2.modifies && !generate2) modify2 = true;\n      if (m2.source) source2 = t;\n      else if (m2.changes) source2 = null;\n    }\n    if (upstream) {\n      n = upstream.length - 1;\n      output2[0] = Relay({\n        derive: modify2,\n        pulse: n ? upstream : upstream[0]\n      });\n      if (modify2 || n) {\n        output2.splice(1, 0, collect());\n      }\n    }\n    if (!source2) output2.push(collect());\n    output2.push(Sieve({}));\n    return output2;\n  }\n  function collect(values2) {\n    const s2 = Collect({}, values2);\n    s2.metadata = {\n      source: true\n    };\n    return s2;\n  }\n  function load(scope, data2) {\n    return Load({\n      url: data2.url ? scope.property(data2.url) : void 0,\n      async: data2.async ? scope.property(data2.async) : void 0,\n      values: data2.values ? scope.property(data2.values) : void 0,\n      format: scope.objectProperty(data2.format)\n    });\n  }\n  const isX = (orient) => orient === Bottom || orient === Top;\n  const getSign = (orient, a2, b2) => isSignal(orient) ? ifLeftTopExpr(orient.signal, a2, b2) : orient === Left || orient === Top ? a2 : b2;\n  const ifX = (orient, a2, b2) => isSignal(orient) ? ifXEnc(orient.signal, a2, b2) : isX(orient) ? a2 : b2;\n  const ifY = (orient, a2, b2) => isSignal(orient) ? ifYEnc(orient.signal, a2, b2) : isX(orient) ? b2 : a2;\n  const ifTop = (orient, a2, b2) => isSignal(orient) ? ifTopExpr(orient.signal, a2, b2) : orient === Top ? {\n    value: a2\n  } : {\n    value: b2\n  };\n  const ifRight = (orient, a2, b2) => isSignal(orient) ? ifRightExpr(orient.signal, a2, b2) : orient === Right ? {\n    value: a2\n  } : {\n    value: b2\n  };\n  const ifXEnc = ($orient, a2, b2) => ifEnc(`${$orient} === '${Top}' || ${$orient} === '${Bottom}'`, a2, b2);\n  const ifYEnc = ($orient, a2, b2) => ifEnc(`${$orient} !== '${Top}' && ${$orient} !== '${Bottom}'`, a2, b2);\n  const ifLeftTopExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Left}' || ${$orient} === '${Top}'`, a2, b2);\n  const ifTopExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Top}'`, a2, b2);\n  const ifRightExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Right}'`, a2, b2);\n  const ifEnc = (test2, a2, b2) => {\n    a2 = a2 != null ? encoder(a2) : a2;\n    b2 = b2 != null ? encoder(b2) : b2;\n    if (isSimple(a2) && isSimple(b2)) {\n      a2 = a2 ? a2.signal || $(a2.value) : null;\n      b2 = b2 ? b2.signal || $(b2.value) : null;\n      return {\n        signal: `${test2} ? (${a2}) : (${b2})`\n      };\n    } else {\n      return [extend({\n        test: test2\n      }, a2)].concat(b2 || []);\n    }\n  };\n  const isSimple = (enc) => enc == null || Object.keys(enc).length === 1;\n  const ifExpr = (test2, a2, b2) => ({\n    signal: `${test2} ? (${toExpr(a2)}) : (${toExpr(b2)})`\n  });\n  const ifOrient = ($orient, t, b2, l, r) => ({\n    signal: (l != null ? `${$orient} === '${Left}' ? (${toExpr(l)}) : ` : \"\") + (b2 != null ? `${$orient} === '${Bottom}' ? (${toExpr(b2)}) : ` : \"\") + (r != null ? `${$orient} === '${Right}' ? (${toExpr(r)}) : ` : \"\") + (t != null ? `${$orient} === '${Top}' ? (${toExpr(t)}) : ` : \"\") + \"(null)\"\n  });\n  const toExpr = (v) => isSignal(v) ? v.signal : v == null ? null : $(v);\n  const mult = (sign2, value2) => value2 === 0 ? 0 : isSignal(sign2) ? {\n    signal: `(${sign2.signal}) * ${value2}`\n  } : {\n    value: sign2 * value2\n  };\n  const patch = (value2, base2) => {\n    const s2 = value2.signal;\n    return s2 && s2.endsWith(\"(null)\") ? {\n      signal: s2.slice(0, -6) + base2.signal\n    } : value2;\n  };\n  function fallback(prop, config, axisConfig2, style2) {\n    let styleProp;\n    if (config && has$1(config, prop)) {\n      return config[prop];\n    } else if (has$1(axisConfig2, prop)) {\n      return axisConfig2[prop];\n    } else if (prop.startsWith(\"title\")) {\n      switch (prop) {\n        case \"titleColor\":\n          styleProp = \"fill\";\n          break;\n        case \"titleFont\":\n        case \"titleFontSize\":\n        case \"titleFontWeight\":\n          styleProp = prop[5].toLowerCase() + prop.slice(6);\n      }\n      return style2[GuideTitleStyle][styleProp];\n    } else if (prop.startsWith(\"label\")) {\n      switch (prop) {\n        case \"labelColor\":\n          styleProp = \"fill\";\n          break;\n        case \"labelFont\":\n        case \"labelFontSize\":\n          styleProp = prop[5].toLowerCase() + prop.slice(6);\n      }\n      return style2[GuideLabelStyle][styleProp];\n    }\n    return null;\n  }\n  function keys(objects) {\n    const map2 = {};\n    for (const obj2 of objects) {\n      if (!obj2) continue;\n      for (const key2 in obj2) map2[key2] = 1;\n    }\n    return Object.keys(map2);\n  }\n  function axisConfig(spec, scope) {\n    var config = scope.config, style2 = config.style, axis = config.axis, band2 = scope.scaleType(spec.scale) === \"band\" && config.axisBand, orient = spec.orient, xy, or2, key2;\n    if (isSignal(orient)) {\n      const xyKeys = keys([config.axisX, config.axisY]), orientKeys = keys([config.axisTop, config.axisBottom, config.axisLeft, config.axisRight]);\n      xy = {};\n      for (key2 of xyKeys) {\n        xy[key2] = ifX(orient, fallback(key2, config.axisX, axis, style2), fallback(key2, config.axisY, axis, style2));\n      }\n      or2 = {};\n      for (key2 of orientKeys) {\n        or2[key2] = ifOrient(orient.signal, fallback(key2, config.axisTop, axis, style2), fallback(key2, config.axisBottom, axis, style2), fallback(key2, config.axisLeft, axis, style2), fallback(key2, config.axisRight, axis, style2));\n      }\n    } else {\n      xy = orient === Top || orient === Bottom ? config.axisX : config.axisY;\n      or2 = config[\"axis\" + orient[0].toUpperCase() + orient.slice(1)];\n    }\n    const result = xy || or2 || band2 ? extend({}, axis, xy, or2, band2) : axis;\n    return result;\n  }\n  function axisDomain(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient;\n    let enter, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"domainColor\"),\n      strokeCap: _(\"domainCap\"),\n      strokeDash: _(\"domainDash\"),\n      strokeDashOffset: _(\"domainDashOffset\"),\n      strokeWidth: _(\"domainWidth\"),\n      strokeOpacity: _(\"domainOpacity\")\n    });\n    const pos0 = position(spec, 0);\n    const pos1 = position(spec, 1);\n    enter.x = update2.x = ifX(orient, pos0, zero);\n    enter.x2 = update2.x2 = ifX(orient, pos1);\n    enter.y = update2.y = ifY(orient, pos0, zero);\n    enter.y2 = update2.y2 = ifY(orient, pos1);\n    return guideMark({\n      type: RuleMark,\n      role: AxisDomainRole,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function position(spec, pos) {\n    return {\n      scale: spec.scale,\n      range: pos\n    };\n  }\n  function axisGrid(spec, config, userEncode, dataRef, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, vscale = spec.gridScale, sign2 = getSign(orient, 1, -1), offset2 = offsetValue(spec.offset, sign2);\n    let enter, exit, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: exit = {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gridColor\"),\n      strokeCap: _(\"gridCap\"),\n      strokeDash: _(\"gridDash\"),\n      strokeDashOffset: _(\"gridDashOffset\"),\n      strokeOpacity: _(\"gridOpacity\"),\n      strokeWidth: _(\"gridWidth\")\n    });\n    const tickPos = {\n      scale: spec.scale,\n      field: Value,\n      band: band2.band,\n      extra: band2.extra,\n      offset: band2.offset,\n      round: _(\"tickRound\")\n    };\n    const sz2 = ifX(orient, {\n      signal: \"height\"\n    }, {\n      signal: \"width\"\n    });\n    const gridStart = vscale ? {\n      scale: vscale,\n      range: 0,\n      mult: sign2,\n      offset: offset2\n    } : {\n      value: 0,\n      offset: offset2\n    };\n    const gridEnd = vscale ? {\n      scale: vscale,\n      range: 1,\n      mult: sign2,\n      offset: offset2\n    } : extend(sz2, {\n      mult: sign2,\n      offset: offset2\n    });\n    enter.x = update2.x = ifX(orient, tickPos, gridStart);\n    enter.y = update2.y = ifY(orient, tickPos, gridStart);\n    enter.x2 = update2.x2 = ifY(orient, gridEnd);\n    enter.y2 = update2.y2 = ifX(orient, gridEnd);\n    exit.x = ifX(orient, tickPos);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n      type: RuleMark,\n      role: AxisGridRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function offsetValue(offset2, sign2) {\n    if (sign2 === 1) ;\n    else if (!isObject(offset2)) {\n      offset2 = isSignal(sign2) ? {\n        signal: `(${sign2.signal}) * (${offset2 || 0})`\n      } : sign2 * (offset2 || 0);\n    } else {\n      let entry2 = offset2 = extend({}, offset2);\n      while (entry2.mult != null) {\n        if (!isObject(entry2.mult)) {\n          entry2.mult = isSignal(sign2) ? {\n            signal: `(${entry2.mult}) * (${sign2.signal})`\n          } : entry2.mult * sign2;\n          return offset2;\n        } else {\n          entry2 = entry2.mult = extend({}, entry2.mult);\n        }\n      }\n      entry2.mult = sign2;\n    }\n    return offset2;\n  }\n  function axisTicks(spec, config, userEncode, dataRef, size, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, sign2 = getSign(orient, -1, 1);\n    let enter, exit, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: exit = {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"tickColor\"),\n      strokeCap: _(\"tickCap\"),\n      strokeDash: _(\"tickDash\"),\n      strokeDashOffset: _(\"tickDashOffset\"),\n      strokeOpacity: _(\"tickOpacity\"),\n      strokeWidth: _(\"tickWidth\")\n    });\n    const tickSize = encoder(size);\n    tickSize.mult = sign2;\n    const tickPos = {\n      scale: spec.scale,\n      field: Value,\n      band: band2.band,\n      extra: band2.extra,\n      offset: band2.offset,\n      round: _(\"tickRound\")\n    };\n    update2.y = enter.y = ifX(orient, zero, tickPos);\n    update2.y2 = enter.y2 = ifX(orient, tickSize);\n    exit.x = ifX(orient, tickPos);\n    update2.x = enter.x = ifY(orient, zero, tickPos);\n    update2.x2 = enter.x2 = ifY(orient, tickSize);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n      type: RuleMark,\n      role: AxisTickRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function flushExpr(scale2, threshold2, a2, b2, c2) {\n    return {\n      signal: 'flush(range(\"' + scale2 + '\"), scale(\"' + scale2 + '\", datum.value), ' + threshold2 + \",\" + a2 + \",\" + b2 + \",\" + c2 + \")\"\n    };\n  }\n  function axisLabels(spec, config, userEncode, dataRef, size, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, scale2 = spec.scale, sign2 = getSign(orient, -1, 1), flush2 = deref(_(\"labelFlush\")), flushOffset = deref(_(\"labelFlushOffset\")), labelAlign = _(\"labelAlign\"), labelBaseline = _(\"labelBaseline\");\n    let flushOn = flush2 === 0 || !!flush2, update2;\n    const tickSize = encoder(size);\n    tickSize.mult = sign2;\n    tickSize.offset = encoder(_(\"labelPadding\") || 0);\n    tickSize.offset.mult = sign2;\n    const tickPos = {\n      scale: scale2,\n      field: Value,\n      band: 0.5,\n      offset: extendOffset(band2.offset, _(\"labelOffset\"))\n    };\n    const align = ifX(orient, flushOn ? flushExpr(scale2, flush2, '\"left\"', '\"right\"', '\"center\"') : {\n      value: \"center\"\n    }, ifRight(orient, \"left\", \"right\"));\n    const baseline2 = ifX(orient, ifTop(orient, \"bottom\", \"top\"), flushOn ? flushExpr(scale2, flush2, '\"top\"', '\"bottom\"', '\"middle\"') : {\n      value: \"middle\"\n    });\n    const offsetExpr = flushExpr(scale2, flush2, `-(${flushOffset})`, flushOffset, 0);\n    flushOn = flushOn && flushOffset;\n    const enter = {\n      opacity: zero,\n      x: ifX(orient, tickPos, tickSize),\n      y: ifY(orient, tickPos, tickSize)\n    };\n    const encode2 = {\n      enter,\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        },\n        x: enter.x,\n        y: enter.y,\n        align,\n        baseline: baseline2\n      },\n      exit: {\n        opacity: zero,\n        x: enter.x,\n        y: enter.y\n      }\n    };\n    addEncoders(encode2, {\n      dx: !labelAlign && flushOn ? ifX(orient, offsetExpr) : null,\n      dy: !labelBaseline && flushOn ? ifY(orient, offsetExpr) : null\n    });\n    addEncoders(encode2, {\n      angle: _(\"labelAngle\"),\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontWeight: _(\"labelFontWeight\"),\n      fontStyle: _(\"labelFontStyle\"),\n      limit: _(\"labelLimit\"),\n      lineHeight: _(\"labelLineHeight\")\n    }, {\n      align: labelAlign,\n      baseline: labelBaseline\n    });\n    const bound2 = _(\"labelBound\");\n    let overlap = _(\"labelOverlap\");\n    overlap = overlap || bound2 ? {\n      separation: _(\"labelSeparation\"),\n      method: overlap,\n      order: \"datum.index\",\n      bound: bound2 ? {\n        scale: scale2,\n        orient,\n        tolerance: bound2\n      } : null\n    } : void 0;\n    if (update2.align !== align) {\n      update2.align = patch(update2.align, align);\n    }\n    if (update2.baseline !== baseline2) {\n      update2.baseline = patch(update2.baseline, baseline2);\n    }\n    return guideMark({\n      type: TextMark,\n      role: AxisLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: dataRef,\n      encode: encode2,\n      overlap\n    }, userEncode);\n  }\n  function axisTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient, sign2 = getSign(orient, -1, 1);\n    let enter, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero,\n        anchor: encoder(_(\"titleAnchor\", null)),\n        align: {\n          signal: alignExpr$1\n        }\n      },\n      update: update2 = extend({}, enter, {\n        opacity: one,\n        text: encoder(spec.title)\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    const titlePos = {\n      signal: `lerp(range(\"${spec.scale}\"), ${anchorExpr(0, 1, 0.5)})`\n    };\n    update2.x = ifX(orient, titlePos);\n    update2.y = ifY(orient, titlePos);\n    enter.angle = ifX(orient, zero, mult(sign2, 90));\n    enter.baseline = ifX(orient, ifTop(orient, Bottom, Top), {\n      value: Bottom\n    });\n    update2.angle = enter.angle;\n    update2.baseline = enter.baseline;\n    addEncoders(encode2, {\n      fill: _(\"titleColor\"),\n      fillOpacity: _(\"titleOpacity\"),\n      font: _(\"titleFont\"),\n      fontSize: _(\"titleFontSize\"),\n      fontStyle: _(\"titleFontStyle\"),\n      fontWeight: _(\"titleFontWeight\"),\n      limit: _(\"titleLimit\"),\n      lineHeight: _(\"titleLineHeight\")\n    }, {\n      // require update\n      align: _(\"titleAlign\"),\n      angle: _(\"titleAngle\"),\n      baseline: _(\"titleBaseline\")\n    });\n    autoLayout(_, orient, encode2, userEncode);\n    encode2.update.align = patch(encode2.update.align, enter.align);\n    encode2.update.angle = patch(encode2.update.angle, enter.angle);\n    encode2.update.baseline = patch(encode2.update.baseline, enter.baseline);\n    return guideMark({\n      type: TextMark,\n      role: AxisTitleRole,\n      style: GuideTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function autoLayout(_, orient, encode2, userEncode) {\n    const auto = (value2, dim) => value2 != null ? (encode2.update[dim] = patch(encoder(value2), encode2.update[dim]), false) : !has(dim, userEncode) ? true : false;\n    const autoY = auto(_(\"titleX\"), \"x\"), autoX = auto(_(\"titleY\"), \"y\");\n    encode2.enter.auto = autoX === autoY ? encoder(autoX) : ifX(orient, encoder(autoX), encoder(autoY));\n  }\n  function parseAxis(spec, scope) {\n    const config = axisConfig(spec, scope), encode2 = spec.encode || {}, axisEncode = encode2.axis || {}, name = axisEncode.name || void 0, interactive2 = axisEncode.interactive, style2 = axisEncode.style, _ = lookup(spec, config), band2 = tickBand(_);\n    const datum2 = {\n      scale: spec.scale,\n      ticks: !!_(\"ticks\"),\n      labels: !!_(\"labels\"),\n      grid: !!_(\"grid\"),\n      domain: !!_(\"domain\"),\n      title: spec.title != null\n    };\n    const dataRef = ref(scope.add(Collect({}, [datum2])));\n    const ticksRef = ref(scope.add(AxisTicks({\n      scale: scope.scaleRef(spec.scale),\n      extra: scope.property(band2.extra),\n      count: scope.objectProperty(spec.tickCount),\n      values: scope.objectProperty(spec.values),\n      minstep: scope.property(spec.tickMinStep),\n      formatType: scope.property(spec.formatType),\n      formatSpecifier: scope.property(spec.format)\n    })));\n    const children2 = [];\n    let size;\n    if (datum2.grid) {\n      children2.push(axisGrid(spec, config, encode2.grid, ticksRef, band2));\n    }\n    if (datum2.ticks) {\n      size = _(\"tickSize\");\n      children2.push(axisTicks(spec, config, encode2.ticks, ticksRef, size, band2));\n    }\n    if (datum2.labels) {\n      size = datum2.ticks ? size : 0;\n      children2.push(axisLabels(spec, config, encode2.labels, ticksRef, size, band2));\n    }\n    if (datum2.domain) {\n      children2.push(axisDomain(spec, config, encode2.domain, dataRef));\n    }\n    if (datum2.title) {\n      children2.push(axisTitle(spec, config, encode2.title, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: AxisRole,\n      from: dataRef,\n      encode: extendEncode(buildAxisEncode(_, spec), axisEncode, Skip),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function buildAxisEncode(_, spec) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      offset: _(\"offset\") || 0,\n      position: value(spec.position, 0),\n      titlePadding: _(\"titlePadding\"),\n      minExtent: _(\"minExtent\"),\n      maxExtent: _(\"maxExtent\"),\n      range: {\n        signal: `abs(span(range(\"${spec.scale}\")))`\n      },\n      translate: _(\"translate\"),\n      // accessibility support\n      format: spec.format,\n      formatType: spec.formatType\n    });\n    return encode2;\n  }\n  function parseScope(spec, scope, preprocessed) {\n    const signals = array$4(spec.signals), scales2 = array$4(spec.scales);\n    if (!preprocessed) signals.forEach((_) => parseSignal(_, scope));\n    array$4(spec.projections).forEach((_) => parseProjection(_, scope));\n    scales2.forEach((_) => initScale(_, scope));\n    array$4(spec.data).forEach((_) => parseData(_, scope));\n    scales2.forEach((_) => parseScale(_, scope));\n    (preprocessed || signals).forEach((_) => parseSignalUpdates(_, scope));\n    array$4(spec.axes).forEach((_) => parseAxis(_, scope));\n    array$4(spec.marks).forEach((_) => parseMark(_, scope));\n    array$4(spec.legends).forEach((_) => parseLegend(_, scope));\n    if (spec.title) parseTitle(spec.title, scope);\n    scope.parseLambdas();\n    return scope;\n  }\n  const rootEncode = (spec) => extendEncode({\n    enter: {\n      x: {\n        value: 0\n      },\n      y: {\n        value: 0\n      }\n    },\n    update: {\n      width: {\n        signal: \"width\"\n      },\n      height: {\n        signal: \"height\"\n      }\n    }\n  }, spec);\n  function parseView(spec, scope) {\n    const config = scope.config;\n    const root = ref(scope.root = scope.add(operator()));\n    const signals = collectSignals(spec, config);\n    signals.forEach((_) => parseSignal(_, scope));\n    scope.description = spec.description || config.description;\n    scope.eventConfig = config.events;\n    scope.legends = scope.objectProperty(config.legend && config.legend.layout);\n    scope.locale = config.locale;\n    const input = scope.add(Collect());\n    const encode2 = scope.add(Encode(parseEncode(rootEncode(spec.encode), GroupMark, FrameRole, spec.style, scope, {\n      pulse: ref(input)\n    })));\n    const parent = scope.add(ViewLayout({\n      layout: scope.objectProperty(spec.layout),\n      legends: scope.legends,\n      autosize: scope.signalRef(\"autosize\"),\n      mark: root,\n      pulse: ref(encode2)\n    }));\n    scope.operators.pop();\n    scope.pushState(ref(encode2), ref(parent), null);\n    parseScope(spec, scope, signals);\n    scope.operators.push(parent);\n    let op = scope.add(Bound({\n      mark: root,\n      pulse: ref(parent)\n    }));\n    op = scope.add(Render({\n      pulse: ref(op)\n    }));\n    op = scope.add(Sieve({\n      pulse: ref(op)\n    }));\n    scope.addData(\"root\", new DataScope(scope, input, input, op));\n    return scope;\n  }\n  function signalObject(name, value2) {\n    return value2 && value2.signal ? {\n      name,\n      update: value2.signal\n    } : {\n      name,\n      value: value2\n    };\n  }\n  function collectSignals(spec, config) {\n    const _ = (name) => value(spec[name], config[name]), signals = [signalObject(\"background\", _(\"background\")), signalObject(\"autosize\", parseAutosize(_(\"autosize\"))), signalObject(\"padding\", parsePadding(_(\"padding\"))), signalObject(\"width\", _(\"width\") || 0), signalObject(\"height\", _(\"height\") || 0)], pre = signals.reduce((p, s2) => (p[s2.name] = s2, p), {}), map2 = {};\n    array$4(spec.signals).forEach((s2) => {\n      if (has$1(pre, s2.name)) {\n        s2 = extend(pre[s2.name], s2);\n      } else {\n        signals.push(s2);\n      }\n      map2[s2.name] = s2;\n    });\n    array$4(config.signals).forEach((s2) => {\n      if (!has$1(map2, s2.name) && !has$1(pre, s2.name)) {\n        signals.push(s2);\n      }\n    });\n    return signals;\n  }\n  function Scope(config, options2) {\n    this.config = config || {};\n    this.options = options2 || {};\n    this.bindings = [];\n    this.field = {};\n    this.signals = {};\n    this.lambdas = {};\n    this.scales = {};\n    this.events = {};\n    this.data = {};\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this.eventConfig = null;\n    this.locale = null;\n    this._id = 0;\n    this._subid = 0;\n    this._nextsub = [0];\n    this._parent = [];\n    this._encode = [];\n    this._lookup = [];\n    this._markpath = [];\n  }\n  function Subscope(scope) {\n    this.config = scope.config;\n    this.options = scope.options;\n    this.legends = scope.legends;\n    this.field = Object.create(scope.field);\n    this.signals = Object.create(scope.signals);\n    this.lambdas = Object.create(scope.lambdas);\n    this.scales = Object.create(scope.scales);\n    this.events = Object.create(scope.events);\n    this.data = Object.create(scope.data);\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this._id = 0;\n    this._subid = ++scope._nextsub[0];\n    this._nextsub = scope._nextsub;\n    this._parent = scope._parent.slice();\n    this._encode = scope._encode.slice();\n    this._lookup = scope._lookup.slice();\n    this._markpath = scope._markpath;\n  }\n  Scope.prototype = Subscope.prototype = {\n    parse(spec) {\n      return parseScope(spec, this);\n    },\n    fork() {\n      return new Subscope(this);\n    },\n    isSubscope() {\n      return this._subid > 0;\n    },\n    toRuntime() {\n      this.finish();\n      return {\n        description: this.description,\n        operators: this.operators,\n        streams: this.streams,\n        updates: this.updates,\n        bindings: this.bindings,\n        eventConfig: this.eventConfig,\n        locale: this.locale\n      };\n    },\n    id() {\n      return (this._subid ? this._subid + \":\" : 0) + this._id++;\n    },\n    add(op) {\n      this.operators.push(op);\n      op.id = this.id();\n      if (op.refs) {\n        op.refs.forEach((ref2) => {\n          ref2.$ref = op.id;\n        });\n        op.refs = null;\n      }\n      return op;\n    },\n    proxy(op) {\n      const vref = op instanceof Entry ? ref(op) : op;\n      return this.add(Proxy({\n        value: vref\n      }));\n    },\n    addStream(stream2) {\n      this.streams.push(stream2);\n      stream2.id = this.id();\n      return stream2;\n    },\n    addUpdate(update2) {\n      this.updates.push(update2);\n      return update2;\n    },\n    // Apply metadata\n    finish() {\n      let name, ds;\n      if (this.root) this.root.root = true;\n      for (name in this.signals) {\n        this.signals[name].signal = name;\n      }\n      for (name in this.scales) {\n        this.scales[name].scale = name;\n      }\n      function annotate(op, name2, type2) {\n        let data2, list;\n        if (op) {\n          data2 = op.data || (op.data = {});\n          list = data2[name2] || (data2[name2] = []);\n          list.push(type2);\n        }\n      }\n      for (name in this.data) {\n        ds = this.data[name];\n        annotate(ds.input, name, \"input\");\n        annotate(ds.output, name, \"output\");\n        annotate(ds.values, name, \"values\");\n        for (const field2 in ds.index) {\n          annotate(ds.index[field2], name, \"index:\" + field2);\n        }\n      }\n      return this;\n    },\n    // ----\n    pushState(encode2, parent, lookup2) {\n      this._encode.push(ref(this.add(Sieve({\n        pulse: encode2\n      }))));\n      this._parent.push(parent);\n      this._lookup.push(lookup2 ? ref(this.proxy(lookup2)) : null);\n      this._markpath.push(-1);\n    },\n    popState() {\n      this._encode.pop();\n      this._parent.pop();\n      this._lookup.pop();\n      this._markpath.pop();\n    },\n    parent() {\n      return peek$1(this._parent);\n    },\n    encode() {\n      return peek$1(this._encode);\n    },\n    lookup() {\n      return peek$1(this._lookup);\n    },\n    markpath() {\n      const p = this._markpath;\n      return ++p[p.length - 1];\n    },\n    // ----\n    fieldRef(field2, name) {\n      if (isString(field2)) return fieldRef$1(field2, name);\n      if (!field2.signal) {\n        error(\"Unsupported field reference: \" + $(field2));\n      }\n      const s2 = field2.signal;\n      let f = this.field[s2];\n      if (!f) {\n        const params2 = {\n          name: this.signalRef(s2)\n        };\n        if (name) params2.as = name;\n        this.field[s2] = f = ref(this.add(Field(params2)));\n      }\n      return f;\n    },\n    compareRef(cmp) {\n      let signal = false;\n      const check = (_) => isSignal(_) ? (signal = true, this.signalRef(_.signal)) : isExpr$1(_) ? (signal = true, this.exprRef(_.expr)) : _;\n      const fields = array$4(cmp.field).map(check), orders = array$4(cmp.order).map(check);\n      return signal ? ref(this.add(Compare({\n        fields,\n        orders\n      }))) : compareRef(fields, orders);\n    },\n    keyRef(fields, flat) {\n      let signal = false;\n      const check = (_) => isSignal(_) ? (signal = true, ref(sig[_.signal])) : _;\n      const sig = this.signals;\n      fields = array$4(fields).map(check);\n      return signal ? ref(this.add(Key({\n        fields,\n        flat\n      }))) : keyRef(fields, flat);\n    },\n    sortRef(sort2) {\n      if (!sort2) return sort2;\n      const a2 = aggrField(sort2.op, sort2.field), o = sort2.order || Ascending;\n      return o.signal ? ref(this.add(Compare({\n        fields: a2,\n        orders: this.signalRef(o.signal)\n      }))) : compareRef(a2, o);\n    },\n    // ----\n    event(source2, type2) {\n      const key2 = source2 + \":\" + type2;\n      if (!this.events[key2]) {\n        const id2 = this.id();\n        this.streams.push({\n          id: id2,\n          source: source2,\n          type: type2\n        });\n        this.events[key2] = id2;\n      }\n      return this.events[key2];\n    },\n    // ----\n    hasOwnSignal(name) {\n      return has$1(this.signals, name);\n    },\n    addSignal(name, value2) {\n      if (this.hasOwnSignal(name)) {\n        error(\"Duplicate signal name: \" + $(name));\n      }\n      const op = value2 instanceof Entry ? value2 : this.add(operator(value2));\n      return this.signals[name] = op;\n    },\n    getSignal(name) {\n      if (!this.signals[name]) {\n        error(\"Unrecognized signal name: \" + $(name));\n      }\n      return this.signals[name];\n    },\n    signalRef(s2) {\n      if (this.signals[s2]) {\n        return ref(this.signals[s2]);\n      } else if (!has$1(this.lambdas, s2)) {\n        this.lambdas[s2] = this.add(operator(null));\n      }\n      return ref(this.lambdas[s2]);\n    },\n    parseLambdas() {\n      const code = Object.keys(this.lambdas);\n      for (let i = 0, n = code.length; i < n; ++i) {\n        const s2 = code[i], e = parser(s2, this), op = this.lambdas[s2];\n        op.params = e.$params;\n        op.update = e.$expr;\n      }\n    },\n    property(spec) {\n      return spec && spec.signal ? this.signalRef(spec.signal) : spec;\n    },\n    objectProperty(spec) {\n      return !spec || !isObject(spec) ? spec : this.signalRef(spec.signal || propertyLambda(spec));\n    },\n    exprRef(code, name) {\n      const params2 = {\n        expr: parser(code, this)\n      };\n      if (name) params2.expr.$name = name;\n      return ref(this.add(Expression(params2)));\n    },\n    addBinding(name, bind2) {\n      if (!this.bindings) {\n        error(\"Nested signals do not support binding: \" + $(name));\n      }\n      this.bindings.push(extend({\n        signal: name\n      }, bind2));\n    },\n    // ----\n    addScaleProj(name, transform2) {\n      if (has$1(this.scales, name)) {\n        error(\"Duplicate scale or projection name: \" + $(name));\n      }\n      this.scales[name] = this.add(transform2);\n    },\n    addScale(name, params2) {\n      this.addScaleProj(name, Scale(params2));\n    },\n    addProjection(name, params2) {\n      this.addScaleProj(name, Projection(params2));\n    },\n    getScale(name) {\n      if (!this.scales[name]) {\n        error(\"Unrecognized scale name: \" + $(name));\n      }\n      return this.scales[name];\n    },\n    scaleRef(name) {\n      return ref(this.getScale(name));\n    },\n    scaleType(name) {\n      return this.getScale(name).params.type;\n    },\n    projectionRef(name) {\n      return this.scaleRef(name);\n    },\n    projectionType(name) {\n      return this.scaleType(name);\n    },\n    // ----\n    addData(name, dataScope) {\n      if (has$1(this.data, name)) {\n        error(\"Duplicate data set name: \" + $(name));\n      }\n      return this.data[name] = dataScope;\n    },\n    getData(name) {\n      if (!this.data[name]) {\n        error(\"Undefined data set name: \" + $(name));\n      }\n      return this.data[name];\n    },\n    addDataPipeline(name, entries) {\n      if (has$1(this.data, name)) {\n        error(\"Duplicate data set name: \" + $(name));\n      }\n      return this.addData(name, DataScope.fromEntries(this, entries));\n    }\n  };\n  function propertyLambda(spec) {\n    return (isArray(spec) ? arrayLambda : objectLambda)(spec);\n  }\n  function arrayLambda(array2) {\n    const n = array2.length;\n    let code = \"[\";\n    for (let i = 0; i < n; ++i) {\n      const value2 = array2[i];\n      code += (i > 0 ? \",\" : \"\") + (isObject(value2) ? value2.signal || propertyLambda(value2) : $(value2));\n    }\n    return code + \"]\";\n  }\n  function objectLambda(obj2) {\n    let code = \"{\", i = 0, key2, value2;\n    for (key2 in obj2) {\n      value2 = obj2[key2];\n      code += (++i > 1 ? \",\" : \"\") + $(key2) + \":\" + (isObject(value2) ? value2.signal || propertyLambda(value2) : $(value2));\n    }\n    return code + \"}\";\n  }\n  function defaults() {\n    const defaultFont = \"sans-serif\", defaultSymbolSize = 30, defaultStrokeWidth = 2, defaultColor = \"#4c78a8\", black = \"#000\", gray = \"#888\", lightGray = \"#ddd\";\n    return {\n      // default visualization description\n      description: \"Vega visualization\",\n      // default padding around visualization\n      padding: 0,\n      // default for automatic sizing; options: 'none', 'pad', 'fit'\n      // or provide an object (e.g., {'type': 'pad', 'resize': true})\n      autosize: \"pad\",\n      // default view background color\n      // covers the entire view component\n      background: null,\n      // default event handling configuration\n      // preventDefault for view-sourced event types except 'wheel'\n      events: {\n        defaults: {\n          allow: [\"wheel\"]\n        }\n      },\n      // defaults for top-level group marks\n      // accepts mark properties (fill, stroke, etc)\n      // covers the data rectangle within group width/height\n      group: null,\n      // defaults for basic mark types\n      // each subset accepts mark properties (fill, stroke, etc)\n      mark: null,\n      arc: {\n        fill: defaultColor\n      },\n      area: {\n        fill: defaultColor\n      },\n      image: null,\n      line: {\n        stroke: defaultColor,\n        strokeWidth: defaultStrokeWidth\n      },\n      path: {\n        stroke: defaultColor\n      },\n      rect: {\n        fill: defaultColor\n      },\n      rule: {\n        stroke: black\n      },\n      shape: {\n        stroke: defaultColor\n      },\n      symbol: {\n        fill: defaultColor,\n        size: 64\n      },\n      text: {\n        fill: black,\n        font: defaultFont,\n        fontSize: 11\n      },\n      trail: {\n        fill: defaultColor,\n        size: defaultStrokeWidth\n      },\n      // style definitions\n      style: {\n        // axis & legend labels\n        \"guide-label\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 10\n        },\n        // axis & legend titles\n        \"guide-title\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 11,\n          fontWeight: \"bold\"\n        },\n        // headers, including chart title\n        \"group-title\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 13,\n          fontWeight: \"bold\"\n        },\n        // chart subtitle\n        \"group-subtitle\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 12\n        },\n        // defaults for styled point marks in Vega-Lite\n        point: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth,\n          shape: \"circle\"\n        },\n        circle: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth\n        },\n        square: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth,\n          shape: \"square\"\n        },\n        // defaults for styled group marks in Vega-Lite\n        cell: {\n          fill: \"transparent\",\n          stroke: lightGray\n        },\n        view: {\n          fill: \"transparent\"\n        }\n      },\n      // defaults for title\n      title: {\n        orient: \"top\",\n        anchor: \"middle\",\n        offset: 4,\n        subtitlePadding: 3\n      },\n      // defaults for axes\n      axis: {\n        minExtent: 0,\n        maxExtent: 200,\n        bandPosition: 0.5,\n        domain: true,\n        domainWidth: 1,\n        domainColor: gray,\n        grid: false,\n        gridWidth: 1,\n        gridColor: lightGray,\n        labels: true,\n        labelAngle: 0,\n        labelLimit: 180,\n        labelOffset: 0,\n        labelPadding: 2,\n        ticks: true,\n        tickColor: gray,\n        tickOffset: 0,\n        tickRound: true,\n        tickSize: 5,\n        tickWidth: 1,\n        titlePadding: 4\n      },\n      // correction for centering bias\n      axisBand: {\n        tickOffset: -0.5\n      },\n      // defaults for cartographic projection\n      projection: {\n        type: \"mercator\"\n      },\n      // defaults for legends\n      legend: {\n        orient: \"right\",\n        padding: 0,\n        gridAlign: \"each\",\n        columnPadding: 10,\n        rowPadding: 2,\n        symbolDirection: \"vertical\",\n        gradientDirection: \"vertical\",\n        gradientLength: 200,\n        gradientThickness: 16,\n        gradientStrokeColor: lightGray,\n        gradientStrokeWidth: 0,\n        gradientLabelOffset: 2,\n        labelAlign: \"left\",\n        labelBaseline: \"middle\",\n        labelLimit: 160,\n        labelOffset: 4,\n        labelOverlap: true,\n        symbolLimit: 30,\n        symbolType: \"circle\",\n        symbolSize: 100,\n        symbolOffset: 0,\n        symbolStrokeWidth: 1.5,\n        symbolBaseFillColor: \"transparent\",\n        symbolBaseStrokeColor: gray,\n        titleLimit: 180,\n        titleOrient: \"top\",\n        titlePadding: 5,\n        layout: {\n          offset: 18,\n          direction: \"horizontal\",\n          left: {\n            direction: \"vertical\"\n          },\n          right: {\n            direction: \"vertical\"\n          }\n        }\n      },\n      // defaults for scale ranges\n      range: {\n        category: {\n          scheme: \"tableau10\"\n        },\n        ordinal: {\n          scheme: \"blues\"\n        },\n        heatmap: {\n          scheme: \"yellowgreenblue\"\n        },\n        ramp: {\n          scheme: \"blues\"\n        },\n        diverging: {\n          scheme: \"blueorange\",\n          extent: [1, 0]\n        },\n        symbol: [\"circle\", \"square\", \"triangle-up\", \"cross\", \"diamond\", \"triangle-right\", \"triangle-down\", \"triangle-left\"]\n      }\n    };\n  }\n  function parse(spec, config, options2) {\n    if (!isObject(spec)) {\n      error(\"Input Vega specification must be an object.\");\n    }\n    config = mergeConfig(defaults(), config, spec.config);\n    return parseView(spec, new Scope(config, options2)).toRuntime();\n  }\n  var version$1 = \"6.2.0\";\n  extend(transforms, tx, vtx, encode$1, geo, force, label, tree, reg, voronoi, wordcloud, xf);\n  const version = version$1;\n  const vega = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Bounds,\n    CanvasHandler,\n    CanvasRenderer,\n    DATE,\n    DAY,\n    DAYOFYEAR,\n    Dataflow,\n    Debug,\n    DisallowedObjectProperties,\n    Error: Error$1,\n    EventStream,\n    Gradient: Gradient$1,\n    GroupItem,\n    HOURS,\n    Handler,\n    HybridHandler,\n    HybridRenderer,\n    Info,\n    Item,\n    MILLISECONDS,\n    MINUTES,\n    MONTH,\n    Marks,\n    MultiPulse,\n    None: None$2,\n    Operator,\n    Parameters,\n    Pulse,\n    QUARTER,\n    RenderType,\n    Renderer,\n    ResourceLoader,\n    SECONDS,\n    SVGHandler,\n    SVGRenderer,\n    SVGStringRenderer,\n    Scenegraph,\n    TIME_UNITS,\n    Transform,\n    View: View$1,\n    WEEK,\n    Warn,\n    YEAR,\n    accessor,\n    accessorFields,\n    accessorName,\n    array: array$4,\n    ascending: ascending$1,\n    bandwidthNRD: estimateBandwidth,\n    bin,\n    bootstrapCI,\n    boundClip,\n    boundContext,\n    boundItem: boundItem$1,\n    boundMark,\n    boundStroke,\n    changeset,\n    clampRange,\n    codegenExpression: codegen,\n    compare: compare$1,\n    constant: constant$4,\n    cumulativeLogNormal,\n    cumulativeNormal,\n    cumulativeUniform,\n    dayofyear,\n    debounce,\n    defaultLocale,\n    definition: definition$1,\n    densityLogNormal,\n    densityNormal,\n    densityUniform,\n    domChild,\n    domClear,\n    domCreate,\n    domFind,\n    dotbin,\n    error,\n    expressionFunction,\n    extend,\n    extent,\n    extentIndex,\n    falsy,\n    fastmap,\n    field: field$1,\n    flush,\n    font,\n    fontFamily,\n    fontSize,\n    format: format$2,\n    formatLocale: numberFormatDefaultLocale,\n    formats: formats$1,\n    hasOwnProperty: has$1,\n    id,\n    identity: identity$2,\n    inferType,\n    inferTypes,\n    ingest: ingest$1,\n    inherits,\n    inrange,\n    interpolate,\n    interpolateColors,\n    interpolateRange,\n    intersect: intersect$2,\n    intersectBoxLine,\n    intersectPath,\n    intersectPoint,\n    intersectRule,\n    isArray,\n    isBoolean: isBoolean$1,\n    isDate: isDate$1,\n    isFunction,\n    isIterable,\n    isNumber: isNumber$1,\n    isObject,\n    isRegExp,\n    isString,\n    isTuple,\n    key,\n    lerp,\n    lineHeight,\n    loader,\n    locale,\n    logger,\n    lruCache,\n    markup,\n    merge: merge$2,\n    mergeConfig,\n    multiLineOffset,\n    one: one$1,\n    pad: pad$1,\n    panLinear,\n    panLog,\n    panPow,\n    panSymlog,\n    parse,\n    parseExpression: parser$1,\n    parseSelector: eventSelector,\n    path: path$3,\n    pathCurves: curves,\n    pathEqual,\n    pathParse: parse$3,\n    pathRectangle: vg_rect,\n    pathRender,\n    pathSymbols: symbols,\n    pathTrail: vg_trail,\n    peek: peek$1,\n    point,\n    projection,\n    quantileLogNormal,\n    quantileNormal,\n    quantileUniform,\n    quantiles,\n    quantizeInterpolator,\n    quarter,\n    quartiles,\n    get random() {\n      return random;\n    },\n    randomInteger: integer,\n    randomKDE: kde,\n    randomLCG: lcg$2,\n    randomLogNormal: lognormal,\n    randomMixture: mixture$1,\n    randomNormal: gaussian,\n    randomUniform: uniform,\n    read,\n    regressionConstant: constant$3,\n    regressionExp: exp$1,\n    regressionLinear: linear,\n    regressionLoess: loess,\n    regressionLog: log$2,\n    regressionPoly: poly,\n    regressionPow: pow$2,\n    regressionQuad: quad,\n    renderModule,\n    repeat,\n    resetDefaultLocale,\n    resetSVGDefIds,\n    responseType,\n    runtimeContext: context,\n    sampleCurve,\n    sampleLogNormal,\n    sampleNormal,\n    sampleUniform,\n    scale: scale$4,\n    sceneEqual,\n    sceneFromJSON,\n    scenePickVisit: pickVisit,\n    sceneToJSON,\n    sceneVisit: visit,\n    sceneZOrder: zorder,\n    scheme,\n    serializeXML,\n    setHybridRendererOptions,\n    setRandom,\n    span,\n    splitAccessPath,\n    stringValue: $,\n    textMetrics,\n    timeBin: bin$1,\n    timeFloor,\n    timeFormatLocale: timeFormatDefaultLocale,\n    timeInterval,\n    timeOffset,\n    timeSequence,\n    timeUnitSpecifier,\n    timeUnits,\n    toBoolean,\n    toDate,\n    toNumber,\n    toSet,\n    toString,\n    transform: transform$2,\n    transforms,\n    truncate: truncate$1,\n    truthy,\n    tupleid,\n    typeParsers,\n    utcFloor,\n    utcInterval,\n    utcOffset,\n    utcSequence,\n    utcdayofyear,\n    utcquarter,\n    utcweek,\n    version,\n    visitArray,\n    week,\n    writeConfig,\n    zero: zero$1,\n    zoomLinear,\n    zoomLog,\n    zoomPow,\n    zoomSymlog\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  use$1(fluentUI, vega);\n  const staticContent = Array.from(document.querySelectorAll(\"a.sanddance-app-static-content\"));\n  const dataSets = staticContent.filter((f) => f.id).map((n) => {\n    const forData = staticContent.filter((f) => f.dataset[\"for\"] === n.id)[0];\n    return {\n      dataSourceType: \"sample\",\n      id: n.id,\n      displayName: n.dataset[\"displayName\"],\n      dataUrl: n.href,\n      type: n.dataset[\"type\"],\n      snapshotsUrl: forData ? forData.href : null\n    };\n  });\n  let explorer;\n  const undef = \"undefined\";\n  ReactDOM__namespace.render(React__namespace.createElement(SandDanceApp, { setTheme: typeof setTheme !== undef && setTheme, darkTheme: typeof darkTheme !== undef && darkTheme, insights: typeof insights !== undef && insights, initialOptions: typeof options !== undef && options, themeColors: typeof themeColors !== undef && themeColors, dataSources: dataSets, mounted: (app) => {\n    explorer = app.explorer;\n  } }), document.getElementById(\"app\"));\n  const z = \"z\".charCodeAt(0);\n  const Z = \"Z\".charCodeAt(0);\n  document.onkeyup = (e) => {\n    if (e.ctrlKey && (e.keyCode === z || e.keyCode === Z)) {\n      if (e.shiftKey) {\n        explorer.redo();\n      } else {\n        explorer.undo();\n      }\n    }\n  };\n  window[\"SandDanceApp\"] = { explorer, SandDanceExplorer };\n}));\n"
  },
  {
    "path": "docs/assets/css/main.scss",
    "content": "---\n---\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n// SETTINGS\n$inuit-global-font-size: 16px;\n@import \"inuitcss/settings/settings.core\";\n@import \"settings/settings.global\";\n@import \"settings/settings.colors\";\n\n// TOOLS\n@import \"inuitcss/tools/tools.font-size\";\n@import \"inuitcss/tools/tools.clearfix\";\n@import \"inuitcss/tools/tools.hidden\";\n@import \"sass-mq/mq\";\n\n// GENERIC\n@import \"inuitcss/generic/generic.reset\";\n@import \"inuitcss/generic/generic.box-sizing\";\n@import \"inuitcss/generic/generic.normalize\";\n@import \"inuitcss/generic/generic.shared\";\n@import \"generic/generic.syntax-highlight\";\n\n// ELEMENTS\n$inuit-font-size-h1: 40px;\n$inuit-font-size-h2: 28px;\n$inuit-font-size-h3: 19px;\n$inuit-font-size-h4: 16px;\n$inuit-font-size-h5: 14px;\n$inuit-font-size-h6: 13px;\n@import \"inuitcss/elements/elements.page\";\n@import \"elements/elements.page\";\n@import \"inuitcss/elements/elements.headings\";\n@import \"elements/elements.headings\";\n@import \"inuitcss/elements/elements.images\";\n@import \"inuitcss/elements/elements.tables\";\n@import \"elements/elements.links\";\n@import \"elements/elements.code\";\n@import \"elements/elements.hr\";\n@import \"elements/elements.tables\";\n\n// OBJECTS\n$inuit-wrapper-width: 1280px;\n@import \"inuitcss/objects/objects.layout\";\n@import \"inuitcss/objects/objects.wrapper\";\n@import \"inuitcss/objects/objects.media\";\n@import \"inuitcss/objects/objects.flag\";\n@import \"inuitcss/objects/objects.list-bare\";\n@import \"inuitcss/objects/objects.list-inline\";\n@import \"inuitcss/objects/objects.box\";\n@import \"inuitcss/objects/objects.block\";\n@import \"inuitcss/objects/objects.table\";\n\n// COMPONENTS\n@import \"components/components.buttons\";\n@import \"components/components.tree\";\n@import \"components/components.site-nav\";\n@import \"components/components.page-head\";\n@import \"components/components.breadcrumbs\";\n@import \"components/components.page-main\";\n@import \"components/components.page-content\";\n@import \"components/components.page-foot\";\n\n// UTILITIES\n@import \"inuitcss/utilities/utilities.widths\";\n@import \"inuitcss/utilities/utilities.headings\";\n@import \"inuitcss/utilities/utilities.spacings\";\n$inuit-responsive-spacing-directions: (\n  null: null,\n  \"-bottom\": \"-bottom\",\n);\n$inuit-responsive-spacing-properties: (\n  \"margin\": \"margin\",\n);\n$inuit-responsive-spacing-sizes: $inuit-spacing-sizes !default;\n@import \"inuitcss/utilities/utilities.responsive-spacings\";\n@import \"inuitcss/utilities/utilities.hide\";"
  },
  {
    "path": "docs/assets/css/typedoc.css",
    "content": ":root {\n  --color-menu-divider-focus: #000;\n  --color-panel-divider: #eee;\n}\n\n.row {\n  display: flex;\n  position: relative;\n}\n.row:after {\n  visibility: hidden;\n  display: block;\n  content: \"\";\n  clear: both;\n  height: 0;\n}\n\n.col, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 {\n  box-sizing: border-box;\n  float: left;\n  padding: 0 10px;\n}\n\n.col-1 {\n  width: 8.3333333333%;\n}\n\n.offset-1 {\n  margin-left: 8.3333333333%;\n}\n\n.col-2 {\n  width: 16.6666666667%;\n}\n\n.offset-2 {\n  margin-left: 16.6666666667%;\n}\n\n.col-3 {\n  width: 25%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.col-4 {\n  width: 33.3333333333%;\n}\n\n.offset-4 {\n  margin-left: 33.3333333333%;\n}\n\n.col-5 {\n  width: 41.6666666667%;\n}\n\n.offset-5 {\n  margin-left: 41.6666666667%;\n}\n\n.col-6 {\n  width: 50%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.col-7 {\n  width: 58.3333333333%;\n}\n\n.offset-7 {\n  margin-left: 58.3333333333%;\n}\n\n.col-8 {\n  width: 66.6666666667%;\n}\n\n.offset-8 {\n  margin-left: 66.6666666667%;\n}\n\n.col-9 {\n  width: 75%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.col-10 {\n  width: 83.3333333333%;\n}\n\n.offset-10 {\n  margin-left: 83.3333333333%;\n}\n\n.col-11 {\n  width: 91.6666666667%;\n}\n\n.offset-11 {\n  margin-left: 91.6666666667%;\n}\n\n.tsd-kind-icon {\n  display: block;\n  position: relative;\n  padding-left: 20px;\n  text-indent: -20px;\n}\n.tsd-kind-icon:before {\n  content: \"\";\n  display: inline-block;\n  vertical-align: middle;\n  width: 17px;\n  height: 17px;\n  margin: 0 3px 2px 0;\n  background-image: url(../images/icons.png);\n}\n@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) {\n  .tsd-kind-icon:before {\n    background-image: url(../images/icons@2x.png);\n    background-size: 238px 204px;\n  }\n}\n\n.tsd-signature.tsd-kind-icon:before {\n  background-position: 0 -153px;\n}\n\n.tsd-kind-object-literal > .tsd-kind-icon:before {\n  background-position: 0px -17px;\n}\n.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -17px;\n}\n.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -17px;\n}\n\n.tsd-kind-class > .tsd-kind-icon:before {\n  background-position: 0px -34px;\n}\n.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -34px;\n}\n.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -34px;\n}\n\n.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before {\n  background-position: 0px -51px;\n}\n.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -51px;\n}\n.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -51px;\n}\n\n.tsd-kind-interface > .tsd-kind-icon:before {\n  background-position: 0px -68px;\n}\n.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -68px;\n}\n.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -68px;\n}\n\n.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before {\n  background-position: 0px -85px;\n}\n.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -85px;\n}\n.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -85px;\n}\n\n.tsd-kind-namespace > .tsd-kind-icon:before {\n  background-position: 0px -102px;\n}\n.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -102px;\n}\n.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -102px;\n}\n\n.tsd-kind-module > .tsd-kind-icon:before {\n  background-position: 0px -102px;\n}\n.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -102px;\n}\n.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -102px;\n}\n\n.tsd-kind-enum > .tsd-kind-icon:before {\n  background-position: 0px -119px;\n}\n.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -119px;\n}\n.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -119px;\n}\n\n.tsd-kind-enum-member > .tsd-kind-icon:before {\n  background-position: 0px -136px;\n}\n.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -136px;\n}\n.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -136px;\n}\n\n.tsd-kind-signature > .tsd-kind-icon:before {\n  background-position: 0px -153px;\n}\n.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -153px;\n}\n.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -153px;\n}\n\n.tsd-kind-type-alias > .tsd-kind-icon:before {\n  background-position: 0px -170px;\n}\n.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -170px;\n}\n.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -170px;\n}\n\n.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before {\n  background-position: 0px -187px;\n}\n.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -17px -187px;\n}\n.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -34px -187px;\n}\n\n.tsd-kind-variable > .tsd-kind-icon:before {\n  background-position: -136px -0px;\n}\n.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -0px;\n}\n.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -0px;\n}\n.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -0px;\n}\n\n.tsd-kind-property > .tsd-kind-icon:before {\n  background-position: -136px -0px;\n}\n.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -0px;\n}\n.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -0px;\n}\n.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -0px;\n}\n\n.tsd-kind-get-signature > .tsd-kind-icon:before {\n  background-position: -136px -17px;\n}\n.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -17px;\n}\n.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -17px;\n}\n.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -17px;\n}\n\n.tsd-kind-set-signature > .tsd-kind-icon:before {\n  background-position: -136px -34px;\n}\n.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -34px;\n}\n.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -34px;\n}\n.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -34px;\n}\n\n.tsd-kind-accessor > .tsd-kind-icon:before {\n  background-position: -136px -51px;\n}\n.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -51px;\n}\n.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -51px;\n}\n.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -51px;\n}\n\n.tsd-kind-function > .tsd-kind-icon:before {\n  background-position: -136px -68px;\n}\n.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -68px;\n}\n.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -68px;\n}\n.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -68px;\n}\n\n.tsd-kind-method > .tsd-kind-icon:before {\n  background-position: -136px -68px;\n}\n.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -68px;\n}\n.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -68px;\n}\n.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -68px;\n}\n\n.tsd-kind-call-signature > .tsd-kind-icon:before {\n  background-position: -136px -68px;\n}\n.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -68px;\n}\n.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -68px;\n}\n.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -68px;\n}\n\n.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before {\n  background-position: -136px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -85px;\n}\n.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -85px;\n}\n\n.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before {\n  background-position: -136px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -85px;\n}\n.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -85px;\n}\n\n.tsd-kind-constructor > .tsd-kind-icon:before {\n  background-position: -136px -102px;\n}\n.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -102px;\n}\n.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -102px;\n}\n.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -102px;\n}\n\n.tsd-kind-constructor-signature > .tsd-kind-icon:before {\n  background-position: -136px -102px;\n}\n.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -102px;\n}\n.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -102px;\n}\n.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -102px;\n}\n\n.tsd-kind-index-signature > .tsd-kind-icon:before {\n  background-position: -136px -119px;\n}\n.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -119px;\n}\n.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -119px;\n}\n.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -119px;\n}\n\n.tsd-kind-event > .tsd-kind-icon:before {\n  background-position: -136px -136px;\n}\n.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -136px;\n}\n.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -136px;\n}\n.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -136px;\n}\n\n.tsd-is-static > .tsd-kind-icon:before {\n  background-position: -136px -153px;\n}\n.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -153px;\n}\n.tsd-is-static.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -153px;\n}\n.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -153px;\n}\n.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -153px;\n}\n.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -153px;\n}\n.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -153px;\n}\n.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -153px;\n}\n.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -153px;\n}\n.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -153px;\n}\n.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -153px;\n}\n.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -153px;\n}\n.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -153px;\n}\n\n.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before {\n  background-position: -136px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -170px;\n}\n.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -170px;\n}\n\n.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before {\n  background-position: -136px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -170px;\n}\n.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -170px;\n}\n\n.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before {\n  background-position: -136px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -170px;\n}\n.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -170px;\n}\n\n.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before {\n  background-position: -136px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -153px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before {\n  background-position: -51px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -68px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -85px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -102px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before {\n  background-position: -170px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before {\n  background-position: -187px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before {\n  background-position: -119px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before {\n  background-position: -204px -187px;\n}\n.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before {\n  background-position: -221px -187px;\n}\n\n.tsd-typography {\n  line-height: 1.333em;\n}\n.tsd-typography ul {\n  list-style: square;\n  padding: 0 0 0 20px;\n  margin: 0;\n}\n\n.tsd-breadcrumb {\n  margin: 0;\n  padding: 0;\n}\n.tsd-breadcrumb a {\n  text-decoration: none;\n}\n.tsd-breadcrumb a:hover {\n  text-decoration: underline;\n}\n.tsd-breadcrumb li {\n  display: inline;\n}\n.tsd-breadcrumb li:after {\n  content: \" / \";\n}\n\n\ndl.tsd-comment-tags {\n  overflow: hidden;\n}\ndl.tsd-comment-tags dt {\n  float: left;\n  padding: 1px 5px;\n  margin: 0 10px 0 0;\n  border-radius: 4px;\n  font-size: 0.8em;\n  font-weight: normal;\n}\ndl.tsd-comment-tags dd {\n  margin: 0 0 10px 0;\n}\ndl.tsd-comment-tags dd:before, dl.tsd-comment-tags dd:after {\n  display: table;\n  content: \" \";\n}\ndl.tsd-comment-tags dd pre, dl.tsd-comment-tags dd:after {\n  clear: both;\n}\ndl.tsd-comment-tags p {\n  margin: 0;\n}\n\n\nfooter .tsd-legend {\n  display: inline-block;\n  width: 25%;\n  padding: 0;\n  font-size: small;\n  list-style: none;\n  line-height: 1.333em;\n  vertical-align: top;\n}\n@media (max-width: 900px) {\n  footer .tsd-legend {\n    width: 50%;\n  }\n}\n\n.tsd-hierarchy {\n  list-style: square;\n  padding: 0 0 0 20px;\n  margin: 0;\n}\n.tsd-hierarchy .target {\n  font-weight: bold;\n}\n\n.tsd-index-panel .tsd-index-content {\n  margin-bottom: -30px !important;\n}\n.tsd-index-panel .tsd-index-section {\n  margin-bottom: 30px !important;\n}\n.tsd-index-panel ul.tsd-index-list {\n  -webkit-column-count: 3;\n  -moz-column-count: 3;\n  -ms-column-count: 3;\n  -o-column-count: 3;\n  column-count: 3;\n  -webkit-column-gap: 20px;\n  -moz-column-gap: 20px;\n  -ms-column-gap: 20px;\n  -o-column-gap: 20px;\n  column-gap: 20px;\n  padding: 0;\n  list-style: none;\n  line-height: 1.333em;\n}\n@media (max-width: 900px) {\n  .tsd-index-panel ul.tsd-index-list {\n    -webkit-column-count: 1;\n    -moz-column-count: 1;\n    -ms-column-count: 1;\n    -o-column-count: 1;\n    column-count: 1;\n  }\n}\n@media (min-width: 901px) and (max-width: 1024px) {\n  .tsd-index-panel ul.tsd-index-list {\n    -webkit-column-count: 2;\n    -moz-column-count: 2;\n    -ms-column-count: 2;\n    -o-column-count: 2;\n    column-count: 2;\n  }\n}\n.tsd-index-panel ul.tsd-index-list li {\n  -webkit-page-break-inside: avoid;\n  -moz-page-break-inside: avoid;\n  -ms-page-break-inside: avoid;\n  -o-page-break-inside: avoid;\n  page-break-inside: avoid;\n}\n\n.tsd-flag {\n  display: inline-block;\n  padding: 1px 5px;\n  border-radius: 4px;\n  text-indent: 0;\n  font-size: 14px;\n  font-weight: normal;\n}\n\n.tsd-anchor {\n  position: absolute;\n  top: -100px;\n}\n\n.tsd-member {\n  position: relative;\n}\n\n.tsd-navigation {\n  margin: 0 0 0 40px;\n}\n.tsd-navigation a {\n  display: block;\n  padding-top: 2px;\n  padding-bottom: 2px;\n  border-left: 2px solid transparent;\n  text-decoration: none;\n  transition: border-left-color 0.1s;\n}\n.tsd-navigation a:hover {\n  text-decoration: underline;\n}\n.tsd-navigation ul {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.tsd-navigation li {\n  padding: 0;\n}\n\n.tsd-navigation.primary {\n  padding-bottom: 40px;\n}\n.tsd-navigation.primary a {\n  display: block;\n  padding-top: 6px;\n  padding-bottom: 6px;\n}\n.tsd-navigation.primary ul li a {\n  padding-left: 5px;\n}\n.tsd-navigation.primary ul li li a {\n  padding-left: 25px;\n}\n.tsd-navigation.primary ul li li li a {\n  padding-left: 45px;\n}\n.tsd-navigation.primary ul li li li li a {\n  padding-left: 65px;\n}\n.tsd-navigation.primary ul li li li li li a {\n  padding-left: 85px;\n}\n.tsd-navigation.primary ul li li li li li li a {\n  padding-left: 105px;\n}\n.tsd-navigation.primary > ul {\n  border-bottom: 1px solid var(--color-panel-divider);\n}\n.tsd-navigation.primary li {\n  border-top: 1px solid var(--color-panel-divider);\n}\n.tsd-navigation.primary li.current > a {\n  font-weight: bold;\n}\n.tsd-navigation.primary li.label span {\n  display: block;\n  padding: 20px 0 6px 5px;\n}\n.tsd-navigation.primary li.globals + li > span, .tsd-navigation.primary li.globals + li > a {\n  padding-top: 20px;\n}\n\n.tsd-navigation.secondary ul li a {\n  padding-left: 25px;\n}\n.tsd-navigation.secondary ul li li a {\n  padding-left: 45px;\n}\n.tsd-navigation.secondary ul li li li a {\n  padding-left: 65px;\n}\n.tsd-navigation.secondary ul li li li li a {\n  padding-left: 85px;\n}\n.tsd-navigation.secondary ul li li li li li a {\n  padding-left: 105px;\n}\n.tsd-navigation.secondary ul li li li li li li a {\n  padding-left: 125px;\n}\n.tsd-navigation.secondary ul.current a {\n  border-left-color: var(--color-panel-divider);\n}\n.tsd-navigation.secondary li.focus > a,\n.tsd-navigation.secondary ul.current li.focus > a {\n  border-left-color: var(--color-menu-divider-focus);\n}\n.tsd-navigation.secondary li.current {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border-left-color: var(--color-panel-divider);\n}\n.tsd-navigation.secondary li.current > a {\n  font-weight: bold;\n}\n\n.tsd-panel {\n  margin: 20px 0;\n  padding: 20px;\n  border: 1px solid #ccc;\n  overflow: auto;\n}\n\n.tsd-panel pre {\n  background-color: #fff;\n}\n\n.tsd-panel:empty {\n  display: none;\n}\n.tsd-panel table {\n  display: block;\n  width: 100%;\n  overflow: auto;\n  margin-top: 10px;\n  word-break: normal;\n  word-break: keep-all;\n}\n.tsd-panel table th {\n  font-weight: bold;\n}\n.tsd-panel table th, .tsd-panel table td {\n  padding: 6px 13px;\n}\n\n.tsd-signature {\n  margin: 0 0 1em 0;\n  padding: 10px;\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  font-size: 14px;\n  overflow-x: auto;\n}\n.tsd-signature.tsd-kind-icon {\n  padding-left: 30px;\n}\n.tsd-signature.tsd-kind-icon:before {\n  top: 10px;\n  left: 10px;\n}\n.tsd-panel > .tsd-signature {\n  margin-left: -20px;\n  margin-right: -20px;\n  border-width: 1px 0;\n}\n.tsd-panel > .tsd-signature.tsd-kind-icon {\n  padding-left: 40px;\n}\n.tsd-panel > .tsd-signature.tsd-kind-icon:before {\n  left: 20px;\n}\n\n.tsd-signature-symbol {\n  font-weight: normal;\n}\n\n.tsd-signature-type {\n  font-style: italic;\n  font-weight: normal;\n}\n\n.tsd-signatures {\n  padding: 0;\n  margin: 0 0 1em 0;\n}\n.tsd-signatures .tsd-signature {\n  margin: 0;\n  border-width: 1px 0 0 0;\n  transition: background-color 0.1s;\n}\n.tsd-signatures .tsd-signature:first-child {\n  border-top-width: 0;\n}\n.tsd-signatures .tsd-signature.current {\n  background-color: var(--color-panel-divider);\n}\n.tsd-signatures.active > .tsd-signature {\n  cursor: pointer;\n}\n.tsd-panel > .tsd-signatures {\n  margin-left: -20px;\n  margin-right: -20px;\n  border-width: 1px 0;\n}\n.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon {\n  padding-left: 40px;\n}\n.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before {\n  left: 20px;\n}\n.tsd-panel > a.anchor + .tsd-signatures {\n  border-top-width: 0;\n  margin-top: -20px;\n}\n\nul.tsd-descriptions {\n  position: relative;\n  overflow: hidden;\n  padding: 0;\n  list-style: none;\n}\nul.tsd-descriptions.active > .tsd-description {\n  display: none;\n}\nul.tsd-descriptions.active > .tsd-description.current {\n  display: block;\n}\nul.tsd-descriptions.active > .tsd-description.fade-in {\n  animation: fade-in-delayed 0.3s;\n}\nul.tsd-descriptions.active > .tsd-description.fade-out {\n  animation: fade-out-delayed 0.3s;\n  position: absolute;\n  display: block;\n  top: 0;\n  left: 0;\n  right: 0;\n  opacity: 0;\n  visibility: hidden;\n}\n\nul.tsd-parameters,\nul.tsd-type-parameters {\n  list-style: square;\n  margin: 0;\n  padding-left: 20px;\n}\nul.tsd-parameters > li.tsd-parameter-signature,\nul.tsd-type-parameters > li.tsd-parameter-signature {\n  list-style: none;\n  margin-left: -20px;\n}\nul.tsd-parameters h5,\nul.tsd-type-parameters h5 {\n  font-size: 16px;\n  margin: 1em 0 0.5em 0;\n}\nul.tsd-parameters .tsd-comment,\nul.tsd-type-parameters .tsd-comment {\n  margin-top: -0.5em;\n}\n\n.tsd-sources {\n  font-size: 14px;\n  margin: 0 0 1em 0;\n}\n.tsd-sources a {\n  text-decoration: underline;\n}\n.tsd-sources ul, .tsd-sources p {\n  margin: 0 !important;\n}\n.tsd-sources ul {\n  list-style: none;\n  padding: 0;\n}\n"
  },
  {
    "path": "docs/assets/js/main.js",
    "content": "const SiteNav = {\n    elems: {\n        toggle: document.querySelector('#site-nav-toggle'),\n        nav: document.querySelector('#site-nav')\n    },\n\n    is_open: false,\n\n    toggle: function () {\n        if (this.is_open) {\n            this.close();\n        } else {\n            this.open();\n        }\n    },\n\n    open: function () {\n        document.documentElement.classList.add('is-nav-open');\n        this.elems.nav.classList.add('is-open');\n        this.is_open = true;\n\n        // Close other menu\n        TreeNav.close();\n    },\n\n    close: function () {\n        document.documentElement.classList.remove('is-nav-open');\n        this.elems.nav.classList.remove('is-open');\n        this.is_open = false;\n    },\n\n    init: function () {\n        // Show/hide menu when toggle is clicked\n        this.elems.toggle.addEventListener('click', (e) => {\n            this.toggle();\n        });\n    }\n}\nSiteNav.init();\n\n\nconst TreeNav = {\n    elems: {\n        toggle: document.querySelector('#site-tree-toggle'),\n        nav: document.querySelector('#site-tree')\n    },\n\n    is_open: false,\n\n    toggle: function () {\n        if (this.is_open) {\n            this.close();\n        } else {\n            this.open();\n        }\n    },\n\n    open: function () {\n        document.documentElement.classList.add('is-tree-open');\n        this.elems.nav.classList.add('is-open');\n        this.is_open = true;\n\n        // Close other menu\n        SiteNav.close();\n    },\n\n    close: function () {\n        document.documentElement.classList.remove('is-tree-open');\n        if (this.elems.nav) {\n            this.elems.nav.classList.remove('is-open');\n        }\n        this.is_open = false;\n    },\n\n    init: function () {\n        if (!this.elems.nav) {\n            this.elems.toggle.style.display = 'none';\n            return;\n        }\n\n        // Show/hide menu when toggle is clicked\n        this.elems.toggle.addEventListener('click', (e) => {\n            this.toggle();\n        });\n\n        const toggles = document.querySelectorAll('.js-tree-toggle');\n\n        toggles.forEach((el) => {\n            const ul = el.nextElementSibling;\n            let h = ul.clientHeight;\n\n            // Collapse if this list doesn't contain the active item\n            const links = ul.querySelectorAll('a');\n            let active = false;\n\n            if (el.querySelector('a') && el.querySelector('a').classList.contains('is-active')) {\n                active = true;\n            } else {\n                links.forEach((link) => {\n                    if (link.classList.contains('is-active')) {\n                        active = true;\n                        el.classList.add('is-open');\n                    }\n                });\n            }\n\n            if (!active) ul.classList.add('u-hidden-visually');\n\n            el.addEventListener('click', (e) => {\n                el.classList.toggle('is-open');\n\n                if (el.classList.contains('is-open')) {\n                    // Open submenu\n                    ul.style.height = 0;\n                    ul.classList.remove('u-hidden-visually');\n                    ul.style.height = h + 'px';\n                } else {\n                    // Close submenu\n                    ul.style.height = 0;\n                    setTimeout(() => {\n                        ul.classList.add('u-hidden-visually');\n                    }, 250);\n                }\n            });\n        });\n    }\n}\nTreeNav.init();\n\n\nconst Page = {\n    settings: {\n        darkClass: 'dark-theme',\n        themeStorageKey: 'theme',\n        themeSwitch: document.getElementById('dark-mode-toggle'),\n        themes: ['Light', 'Dark']\n    },\n\n    setTheme: function (themeIndex) {\n        if (themeIndex) {\n            document.body.classList.add(this.settings.darkClass);\n        } else {\n            document.body.classList.remove(this.settings.darkClass);\n        }\n        var theme = this.settings.themes[themeIndex];\n        this.settings.themeSwitch.innerText = this.settings.themes[1 - themeIndex];\n        localStorage.setItem(this.settings.themeStorageKey, theme);\n    },\n\n    init: function () {\n        var themeIndex = ~~(this.settings.themes.indexOf(localStorage.getItem(this.settings.themeStorageKey)) > 0);\n        this.setTheme(themeIndex);\n\n        this.settings.themeSwitch.addEventListener('click', (e) => {\n            e.preventDefault();\n            themeIndex = ~~!themeIndex;\n            this.setTheme(themeIndex);\n        });\n    }\n}\nPage.init();"
  },
  {
    "path": "docs/dist/sanddance/v1/sanddance.css",
    "content": ".sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%; }\n\n.sanddance-gl {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0; }\n  .sanddance-gl.show-center {\n    background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%); }\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em; }\n\n.sanddance-legend table {\n  border-collapse: collapse; }\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em; }\n\n.sanddance-legend .legend-row {\n  cursor: pointer; }\n  .sanddance-legend .legend-row td {\n    padding: 2px; }\n  .sanddance-legend .legend-row:hover {\n    background-color: #efefef; }\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px; }\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden; }\n\n.sanddance-details {\n  font-size: smaller; }\n\n.sanddance-details-scroll {\n  padding-bottom: 1em; }\n\n.sanddance-tooltip {\n  z-index: 1; }\n  .sanddance-tooltip table {\n    background: #333;\n    color: #fff;\n    font-size: smaller;\n    margin: 1em;\n    min-width: 16em;\n    padding: 6px;\n    position: absolute; }\n  .sanddance-tooltip td {\n    text-align: left;\n    vertical-align: top;\n    width: 75%; }\n    .sanddance-tooltip td:first-child {\n      width: 25%; }\n"
  },
  {
    "path": "docs/dist/sanddance/v1/sanddance.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (factory((global.SandDance = {})));\n}(this, (function (exports) { 'use strict';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const FieldNames = {\n        Active: '__SandDance__Active',\n        Collapsed: '__SandDance__Collapsed',\n        Selected: '__SandDance__Selected',\n        Top: '__SandDance__Top',\n        TopIndex: '__SandDance__TopIndex',\n        Index: '__SandDance__Index',\n        PowerBISelectionId: '__SandDance__PowerBISelectionId',\n        BarChartBin0: '__SandDance__BarChartBin0',\n        BarChartBin1: '__SandDance__BarChartBin1',\n        BarChartStack0: '__SandDance__BarChartStack0',\n        BarChartStack1: '__SandDance__BarChartStack1',\n        DensityCount: '__SandDance__DensityCount',\n        DensityRow: '__SandDance__DensityRow',\n        DensityXBin0: '__SandDance__DensityXBin0',\n        DensityXBin1: '__SandDance__DensityXBin1',\n        DensityYBin0: '__SandDance__DensityYBin0',\n        DensityYBin1: '__SandDance__DensityYBin1',\n        FacetBin0: '__SandDance__FacetBin0',\n        FacetBin1: '__SandDance__FacetBin1',\n        GridIndex: '__SandDance__GridIndex',\n        StacksLatBin0: '__SandDance__StacksLatBin0',\n        StacksLatBin1: '__SandDance__StacksLatBin1',\n        StacksLongBin0: '__SandDance__StacksLongBin0',\n        StacksLongBin1: '__SandDance__StacksLongBin1',\n        StacksStart: '__SandDance__StacksStart',\n        StacksEnd: '__SandDance__StacksEnd',\n        TreemapStackChildren: '__SandDance__TreemapStackChildren',\n        TreemapStackDepth: '__SandDance__TreemapStackDepth',\n        TreemapStackX0: '__SandDance__TreemapStackX0',\n        TreemapStackX1: '__SandDance__TreemapStackX1',\n        TreemapStackY0: '__SandDance__TreemapStackY0',\n        TreemapStackY1: '__SandDance__TreemapStackY1',\n    };\n    const DataNames = {\n        Pre: 'PreData',\n        Main: 'MainData',\n        EmptyBin: 'EmptyBinsData',\n        TopLookup: 'TopData',\n        Legend: 'LegendData',\n        FacetGroupCell: 'FacetGroupCellData',\n        FacetCellTitles: 'FacetCellTitlesData',\n        QuantitativeData: 'QuantitativeData'\n    };\n    const ScaleNames = {\n        Color: 'ColorScale',\n        X: 'MainXScale',\n        Y: 'MainYScale',\n        Z: 'MainZScale'\n    };\n    //Signal names\n    const SignalNames = {\n        ColorBinCount: 'RoleColor_BinCountSignal',\n        ColorReverse: 'RoleColor_ReverseSignal',\n        FacetColumns: 'RoleFacet_ColumnsSignal',\n        FacetRows: 'RoleFacet_RowsSignal',\n        InnerPadding: 'Chart_InnerPadding',\n        OuterPadding: 'Chart_OuterPadding',\n        MarkOpacity: 'Mark_OpacitySignal',\n        PointSize: 'Chart_PointSizeSignal',\n        TextAngleX: 'Text_AngleXSignal',\n        TextAngleY: 'Text_AngleYSignal',\n        TextScale: 'Text_ScaleSignal',\n        TextSize: 'Text_SizeSignal',\n        TextTitleSize: 'Text_TitleSizeSignal',\n        TreeMapMethod: 'Chart_TreeMapMethodSignal',\n        XDomain: 'RoleX_DomainSignal',\n        XBins: 'RoleX_BinsSignal',\n        XGridSize: 'Chart_XGridSize',\n        YBins: 'RoleY_BinsSignal',\n        YDomain: 'RoleY_DomainSignal',\n        YGridSize: 'Chart_YGridSize',\n        ZHeight: 'RoleZ_HeightSignal',\n        ZProportion: 'RoleZ_ProportionSignal'\n    };\n    //These are special formulaic data values\n    const Other = '__Other';\n    //name of the \"no-color\" palette\n    const ColorScaleNone = 'none';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var constants = /*#__PURE__*/Object.freeze({\n        ColorScaleNone: ColorScaleNone,\n        FieldNames: FieldNames,\n        ScaleNames: ScaleNames,\n        SignalNames: SignalNames\n    });\n\n    function isSearchExpressionGroup(search) {\n        if (!search) {\n            return false;\n        }\n        return !!search.expressions;\n    }\n    function createGroupFromExpression(input) {\n        const output = {\n            expressions: [input]\n        };\n        return output;\n    }\n    function ensureSearchExpressionGroupArray(search) {\n        if (Array.isArray(search)) {\n            return [...search];\n        }\n        else if (isSearchExpressionGroup(search)) {\n            return [search];\n        }\n        else {\n            return [createGroupFromExpression(search)];\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const expressionKeys = Object.keys({\n        clause: null,\n        name: null,\n        operator: null,\n        value: null\n    });\n    function compareExpression(a, b) {\n        for (let k = 0; k < expressionKeys.length; k++) {\n            let key = expressionKeys[k];\n            if (a[key] != b[key])\n                return false;\n        }\n        return true;\n    }\n    const groupKeys = Object.keys({\n        clause: null\n    });\n    function compareGroup(a, b) {\n        for (let k = 0; k < groupKeys.length; k++) {\n            let key = groupKeys[k];\n            if (a[key] != b[key])\n                return false;\n        }\n        if (a.expressions.length != b.expressions.length)\n            return false;\n        for (let i = 0; i < a.expressions.length; i++) {\n            if (!compareExpression(a.expressions[i], b.expressions[i]))\n                return false;\n        }\n        return true;\n    }\n    function compare(a, b) {\n        if (a == b)\n            return true;\n        if (!a || !b)\n            return false;\n        let arrs = [a, b].map(ensureSearchExpressionGroupArray);\n        let [arrA, arrB] = arrs;\n        if (arrA.length != arrB.length)\n            return false;\n        for (let i = 0; i < arrA.length; i++) {\n            if (!compareGroup(arrA[i], arrB[i]))\n                return false;\n        }\n        return true;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function invertSearchExpressionGroup(input) {\n        //this only works if all expressions in this group have the same clause\n        const output = {\n            expressions: input.expressions.map(invertSearchExpression)\n        };\n        if (input.clause) {\n            output.clause = invertedClauses[input.clause];\n        }\n        return output;\n    }\n    const invertedOperators = {\n        '!=': '==',\n        '==': '!=',\n        '<': '>=',\n        '>=': '<',\n        '<=': '>',\n        '>': '<=',\n        '!contains': 'contains',\n        'contains': '!contains',\n        '!isnullorEmpty': 'isnullorEmpty',\n        'isnullorEmpty': '!isnullorEmpty',\n        '!starts': 'starts',\n        'starts': '!starts'\n    };\n    const invertedClauses = {\n        '&&': '||',\n        '||': '&&'\n    };\n    function invertSearchExpression(input) {\n        const operator = invertedOperators[input.operator];\n        const output = Object.assign(Object.assign({}, input), { operator });\n        if (input.clause) {\n            output.clause = invertedClauses[input.clause];\n        }\n        return output;\n    }\n    function invert(search) {\n        if (Array.isArray(search)) {\n            return search.map(invertSearchExpressionGroup);\n        }\n        else if (isSearchExpressionGroup(search)) {\n            return invertSearchExpressionGroup(search);\n        }\n        else {\n            return invertSearchExpression(search);\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function narrow(a, b) {\n        if (!a) {\n            return b;\n        }\n        let arrs = [a, b].map(ensureSearchExpressionGroupArray);\n        let [arrA, arrB] = arrs;\n        arrB[0].clause = '&&';\n        return arrA.concat(arrB);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var index = /*#__PURE__*/Object.freeze({\n        compareExpression: compareExpression,\n        compareGroup: compareGroup,\n        compare: compare,\n        invert: invert,\n        narrow: narrow\n    });\n\n\n\n    var types = /*#__PURE__*/Object.freeze({\n\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const GL_ORDINAL = 'GL_ORDINAL';\n    const layerNames = {\n        cubes: 'LAYER_CUBES',\n        lines: 'LAYER_LINES',\n        text: 'LAYER_TEXT'\n    };\n\n    var constants$1 = /*#__PURE__*/Object.freeze({\n        GL_ORDINAL: GL_ORDINAL,\n        layerNames: layerNames\n    });\n\n    function unwrapExports (x) {\n    \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n    }\n\n    function createCommonjsModule(fn, module) {\n    \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n    }\n\n    var xregexp = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n    /*!\n     * XRegExp 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2007-2017 MIT License\n     */\n\n    /**\n     * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and\n     * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to\n     * make your client-side grepping simpler and more powerful, while freeing you from related\n     * cross-browser inconsistencies.\n     */\n\n    // ==--------------------------==\n    // Private stuff\n    // ==--------------------------==\n\n    // Property name used for extended regex instance data\n    var REGEX_DATA = 'xregexp';\n    // Optional features that can be installed and uninstalled\n    var features = {\n        astral: false\n    };\n    // Native methods to use and restore ('native' is an ES3 reserved keyword)\n    var nativ = {\n        exec: RegExp.prototype.exec,\n        test: RegExp.prototype.test,\n        match: String.prototype.match,\n        replace: String.prototype.replace,\n        split: String.prototype.split\n    };\n    // Storage for fixed/extended native methods\n    var fixed = {};\n    // Storage for regexes cached by `XRegExp.cache`\n    var regexCache = {};\n    // Storage for pattern details cached by the `XRegExp` constructor\n    var patternCache = {};\n    // Storage for regex syntax tokens added internally or by `XRegExp.addToken`\n    var tokens = [];\n    // Token scopes\n    var defaultScope = 'default';\n    var classScope = 'class';\n    // Regexes that match native regex syntax, including octals\n    var nativeTokens = {\n        // Any native multicharacter token in default scope, or any single character\n        'default': /\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|\\(\\?(?:[:=!]|<[=!])|[?*+]\\?|{\\d+(?:,\\d*)?}\\??|[\\s\\S]/,\n        // Any native multicharacter token in character class scope, or any single character\n        'class': /\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|[\\s\\S]/\n    };\n    // Any backreference or dollar-prefixed character in replacement strings\n    var replacementToken = /\\$(?:{([\\w$]+)}|<([\\w$]+)>|(\\d\\d?|[\\s\\S]))/g;\n    // Check for correct `exec` handling of nonparticipating capturing groups\n    var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined;\n    // Check for ES6 `flags` prop support\n    var hasFlagsProp = /x/.flags !== undefined;\n    // Shortcut to `Object.prototype.toString`\n    var toString = {}.toString;\n\n    function hasNativeFlag(flag) {\n        // Can't check based on the presence of properties/getters since browsers might support such\n        // properties even when they don't support the corresponding flag in regex construction (tested\n        // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`\n        // throws an error)\n        var isSupported = true;\n        try {\n        } catch (exception) {\n            isSupported = false;\n        }\n        return isSupported;\n    }\n    // Check for ES6 `u` flag support\n    var hasNativeU = hasNativeFlag('u');\n    // Check for ES6 `y` flag support\n    var hasNativeY = hasNativeFlag('y');\n    // Tracker for known flags, including addon flags\n    var registeredFlags = {\n        g: true,\n        i: true,\n        m: true,\n        u: hasNativeU,\n        y: hasNativeY\n    };\n\n    /**\n     * Attaches extended data and `XRegExp.prototype` properties to a regex object.\n     *\n     * @private\n     * @param {RegExp} regex Regex to augment.\n     * @param {Array} captureNames Array with capture names, or `null`.\n     * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.\n     * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.\n     * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal\n     *   operations, and never exposed to users. For internal-only regexes, we can improve perf by\n     *   skipping some operations like attaching `XRegExp.prototype` properties.\n     * @returns {RegExp} Augmented regex.\n     */\n    function augment(regex, captureNames, xSource, xFlags, isInternalOnly) {\n        var p = void 0;\n\n        regex[REGEX_DATA] = {\n            captureNames: captureNames\n        };\n\n        if (isInternalOnly) {\n            return regex;\n        }\n\n        // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value\n        if (regex.__proto__) {\n            regex.__proto__ = XRegExp.prototype;\n        } else {\n            for (p in XRegExp.prototype) {\n                // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this\n                // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`\n                // extensions exist on `regex.prototype` anyway\n                regex[p] = XRegExp.prototype[p];\n            }\n        }\n\n        regex[REGEX_DATA].source = xSource;\n        // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order\n        regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;\n\n        return regex;\n    }\n\n    /**\n     * Removes any duplicate characters from the provided string.\n     *\n     * @private\n     * @param {String} str String to remove duplicate characters from.\n     * @returns {String} String with any duplicate characters removed.\n     */\n    function clipDuplicates(str) {\n        return nativ.replace.call(str, /([\\s\\S])(?=[\\s\\S]*\\1)/g, '');\n    }\n\n    /**\n     * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`\n     * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing\n     * flags g and y while copying the regex.\n     *\n     * @private\n     * @param {RegExp} regex Regex to copy.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `addG` {Boolean} Add flag g while copying the regex.\n     *   - `addY` {Boolean} Add flag y while copying the regex.\n     *   - `removeG` {Boolean} Remove flag g while copying the regex.\n     *   - `removeY` {Boolean} Remove flag y while copying the regex.\n     *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal\n     *     operations, and never exposed to users. For internal-only regexes, we can improve perf by\n     *     skipping some operations like attaching `XRegExp.prototype` properties.\n     *   - `source` {String} Overrides `<regex>.source`, for special cases.\n     * @returns {RegExp} Copy of the provided regex, possibly with modified flags.\n     */\n    function copyRegex(regex, options) {\n        if (!XRegExp.isRegExp(regex)) {\n            throw new TypeError('Type RegExp expected');\n        }\n\n        var xData = regex[REGEX_DATA] || {};\n        var flags = getNativeFlags(regex);\n        var flagsToAdd = '';\n        var flagsToRemove = '';\n        var xregexpSource = null;\n        var xregexpFlags = null;\n\n        options = options || {};\n\n        if (options.removeG) {\n            flagsToRemove += 'g';\n        }\n        if (options.removeY) {\n            flagsToRemove += 'y';\n        }\n        if (flagsToRemove) {\n            flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), '');\n        }\n\n        if (options.addG) {\n            flagsToAdd += 'g';\n        }\n        if (options.addY) {\n            flagsToAdd += 'y';\n        }\n        if (flagsToAdd) {\n            flags = clipDuplicates(flags + flagsToAdd);\n        }\n\n        if (!options.isInternalOnly) {\n            if (xData.source !== undefined) {\n                xregexpSource = xData.source;\n            }\n            // null or undefined; don't want to add to `flags` if the previous value was null, since\n            // that indicates we're not tracking original precompilation flags\n            if (xData.flags != null) {\n                // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never\n                // removed for non-internal regexes, so don't need to handle it\n                xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;\n            }\n        }\n\n        // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid\n        // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and\n        // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the\n        // translation to native regex syntax\n        regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);\n\n        return regex;\n    }\n\n    /**\n     * Converts hexadecimal to decimal.\n     *\n     * @private\n     * @param {String} hex\n     * @returns {Number}\n     */\n    function dec(hex) {\n        return parseInt(hex, 16);\n    }\n\n    /**\n     * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an\n     * inline comment or whitespace with flag x. This is used directly as a token handler function\n     * passed to `XRegExp.addToken`.\n     *\n     * @private\n     * @param {String} match Match arg of `XRegExp.addToken` handler\n     * @param {String} scope Scope arg of `XRegExp.addToken` handler\n     * @param {String} flags Flags arg of `XRegExp.addToken` handler\n     * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.\n     */\n    function getContextualTokenSeparator(match, scope, flags) {\n        if (\n        // No need to separate tokens if at the beginning or end of a group\n        match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' ||\n        // Avoid separating tokens when the following token is a quantifier\n        isQuantifierNext(match.input, match.index + match[0].length, flags)) {\n            return '';\n        }\n        // Keep tokens separated. This avoids e.g. inadvertedly changing `\\1 1` or `\\1(?#)1` to `\\11`.\n        // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax\n        // error `(? :` into `(?:`.\n        return '(?:)';\n    }\n\n    /**\n     * Returns native `RegExp` flags used by a regex object.\n     *\n     * @private\n     * @param {RegExp} regex Regex to check.\n     * @returns {String} Native flags in use.\n     */\n    function getNativeFlags(regex) {\n        return hasFlagsProp ? regex.flags :\n        // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation\n        // with an empty string) allows this to continue working predictably when\n        // `XRegExp.proptotype.toString` is overridden\n        nativ.exec.call(/\\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];\n    }\n\n    /**\n     * Determines whether a regex has extended instance data used to track capture names.\n     *\n     * @private\n     * @param {RegExp} regex Regex to check.\n     * @returns {Boolean} Whether the regex uses named capture.\n     */\n    function hasNamedCapture(regex) {\n        return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);\n    }\n\n    /**\n     * Converts decimal to hexadecimal.\n     *\n     * @private\n     * @param {Number|String} dec\n     * @returns {String}\n     */\n    function hex(dec) {\n        return parseInt(dec, 10).toString(16);\n    }\n\n    /**\n     * Checks whether the next nonignorable token after the specified position is a quantifier.\n     *\n     * @private\n     * @param {String} pattern Pattern to search within.\n     * @param {Number} pos Index in `pattern` to search at.\n     * @param {String} flags Flags used by the pattern.\n     * @returns {Boolean} Whether the next nonignorable token is a quantifier.\n     */\n    function isQuantifierNext(pattern, pos, flags) {\n        return nativ.test.call(flags.indexOf('x') !== -1 ?\n        // Ignore any leading whitespace, line comments, and inline comments\n        /^(?:\\s|#[^#\\n]*|\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/ :\n        // Ignore any leading inline comments\n        /^(?:\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/, pattern.slice(pos));\n    }\n\n    /**\n     * Determines whether a value is of the specified type, by resolving its internal [[Class]].\n     *\n     * @private\n     * @param {*} value Object to check.\n     * @param {String} type Type to check for, in TitleCase.\n     * @returns {Boolean} Whether the object matches the type.\n     */\n    function isType(value, type) {\n        return toString.call(value) === '[object ' + type + ']';\n    }\n\n    /**\n     * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.\n     *\n     * @private\n     * @param {String} str\n     * @returns {String}\n     */\n    function pad4(str) {\n        while (str.length < 4) {\n            str = '0' + str;\n        }\n        return str;\n    }\n\n    /**\n     * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads\n     * the flag preparation logic from the `XRegExp` constructor.\n     *\n     * @private\n     * @param {String} pattern Regex pattern, possibly with a leading mode modifier.\n     * @param {String} flags Any combination of flags.\n     * @returns {Object} Object with properties `pattern` and `flags`.\n     */\n    function prepareFlags(pattern, flags) {\n        var i = void 0;\n\n        // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags\n        if (clipDuplicates(flags) !== flags) {\n            throw new SyntaxError('Invalid duplicate regex flag ' + flags);\n        }\n\n        // Strip and apply a leading mode modifier with any combination of flags except g or y\n        pattern = nativ.replace.call(pattern, /^\\(\\?([\\w$]+)\\)/, function ($0, $1) {\n            if (nativ.test.call(/[gy]/, $1)) {\n                throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0);\n            }\n            // Allow duplicate flags within the mode modifier\n            flags = clipDuplicates(flags + $1);\n            return '';\n        });\n\n        // Throw on unknown native or nonnative flags\n        for (i = 0; i < flags.length; ++i) {\n            if (!registeredFlags[flags[i]]) {\n                throw new SyntaxError('Unknown regex flag ' + flags[i]);\n            }\n        }\n\n        return {\n            pattern: pattern,\n            flags: flags\n        };\n    }\n\n    /**\n     * Prepares an options object from the given value.\n     *\n     * @private\n     * @param {String|Object} value Value to convert to an options object.\n     * @returns {Object} Options object.\n     */\n    function prepareOptions(value) {\n        var options = {};\n\n        if (isType(value, 'String')) {\n            XRegExp.forEach(value, /[^\\s,]+/, function (match) {\n                options[match] = true;\n            });\n\n            return options;\n        }\n\n        return value;\n    }\n\n    /**\n     * Registers a flag so it doesn't throw an 'unknown flag' error.\n     *\n     * @private\n     * @param {String} flag Single-character flag to register.\n     */\n    function registerFlag(flag) {\n        if (!/^[\\w$]$/.test(flag)) {\n            throw new Error('Flag must be a single character A-Za-z0-9_$');\n        }\n\n        registeredFlags[flag] = true;\n    }\n\n    /**\n     * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified\n     * position, until a match is found.\n     *\n     * @private\n     * @param {String} pattern Original pattern from which an XRegExp object is being built.\n     * @param {String} flags Flags being used to construct the regex.\n     * @param {Number} pos Position to search for tokens within `pattern`.\n     * @param {Number} scope Regex scope to apply: 'default' or 'class'.\n     * @param {Object} context Context object to use for token handler functions.\n     * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.\n     */\n    function runTokens(pattern, flags, pos, scope, context) {\n        var i = tokens.length;\n        var leadChar = pattern[pos];\n        var result = null;\n        var match = void 0;\n        var t = void 0;\n\n        // Run in reverse insertion order\n        while (i--) {\n            t = tokens[i];\n            if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(flags.indexOf(t.flag) !== -1)) {\n                continue;\n            }\n\n            match = XRegExp.exec(pattern, t.regex, pos, 'sticky');\n            if (match) {\n                result = {\n                    matchLength: match[0].length,\n                    output: t.handler.call(context, match, scope, flags),\n                    reparse: t.reparse\n                };\n                // Finished with token tests\n                break;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to\n     * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if\n     * the Unicode Base addon is not available, since flag A is registered by that addon.\n     *\n     * @private\n     * @param {Boolean} on `true` to enable; `false` to disable.\n     */\n    function setAstral(on) {\n        features.astral = on;\n    }\n\n    /**\n     * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow\n     * the ES5 abstract operation `ToObject`.\n     *\n     * @private\n     * @param {*} value Object to check and return.\n     * @returns {*} The provided object.\n     */\n    function toObject(value) {\n        // null or undefined\n        if (value == null) {\n            throw new TypeError('Cannot convert null or undefined to object');\n        }\n\n        return value;\n    }\n\n    // ==--------------------------==\n    // Constructor\n    // ==--------------------------==\n\n    /**\n     * Creates an extended regular expression object for matching text with a pattern. Differs from a\n     * native regular expression in that additional syntax and flags are supported. The returned object\n     * is in fact a native `RegExp` and works with all native methods.\n     *\n     * @class XRegExp\n     * @constructor\n     * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.\n     * @param {String} [flags] Any combination of flags.\n     *   Native flags:\n     *     - `g` - global\n     *     - `i` - ignore case\n     *     - `m` - multiline anchors\n     *     - `u` - unicode (ES6)\n     *     - `y` - sticky (Firefox 3+, ES6)\n     *   Additional XRegExp flags:\n     *     - `n` - explicit capture\n     *     - `s` - dot matches all (aka singleline)\n     *     - `x` - free-spacing and line comments (aka extended)\n     *     - `A` - astral (requires the Unicode Base addon)\n     *   Flags cannot be provided when constructing one `RegExp` from another.\n     * @returns {RegExp} Extended regular expression object.\n     * @example\n     *\n     * // With named capture and flag x\n     * XRegExp(`(?<year>  [0-9]{4} ) -?  # year\n     *          (?<month> [0-9]{2} ) -?  # month\n     *          (?<day>   [0-9]{2} )     # day`, 'x');\n     *\n     * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)\n     * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and\n     * // have fresh `lastIndex` properties (set to zero).\n     * XRegExp(/regex/);\n     */\n    function XRegExp(pattern, flags) {\n        if (XRegExp.isRegExp(pattern)) {\n            if (flags !== undefined) {\n                throw new TypeError('Cannot supply flags when copying a RegExp');\n            }\n            return copyRegex(pattern);\n        }\n\n        // Copy the argument behavior of `RegExp`\n        pattern = pattern === undefined ? '' : String(pattern);\n        flags = flags === undefined ? '' : String(flags);\n\n        if (XRegExp.isInstalled('astral') && !(flags.indexOf('A') !== -1)) {\n            // This causes an error to be thrown if the Unicode Base addon is not available\n            flags += 'A';\n        }\n\n        if (!patternCache[pattern]) {\n            patternCache[pattern] = {};\n        }\n\n        if (!patternCache[pattern][flags]) {\n            var context = {\n                hasNamedCapture: false,\n                captureNames: []\n            };\n            var scope = defaultScope;\n            var output = '';\n            var pos = 0;\n            var result = void 0;\n\n            // Check for flag-related errors, and strip/apply flags in a leading mode modifier\n            var applied = prepareFlags(pattern, flags);\n            var appliedPattern = applied.pattern;\n            var appliedFlags = applied.flags;\n\n            // Use XRegExp's tokens to translate the pattern to a native regex pattern.\n            // `appliedPattern.length` may change on each iteration if tokens use `reparse`\n            while (pos < appliedPattern.length) {\n                do {\n                    // Check for custom tokens at the current position\n                    result = runTokens(appliedPattern, appliedFlags, pos, scope, context);\n                    // If the matched token used the `reparse` option, splice its output into the\n                    // pattern before running tokens again at the same position\n                    if (result && result.reparse) {\n                        appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength);\n                    }\n                } while (result && result.reparse);\n\n                if (result) {\n                    output += result.output;\n                    pos += result.matchLength || 1;\n                } else {\n                    // Get the native token at the current position\n                    var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0];\n                    output += token;\n                    pos += token.length;\n                    if (token === '[' && scope === defaultScope) {\n                        scope = classScope;\n                    } else if (token === ']' && scope === classScope) {\n                        scope = defaultScope;\n                    }\n                }\n            }\n\n            patternCache[pattern][flags] = {\n                // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty\n                // groups are sometimes inserted during regex transpilation in order to keep tokens\n                // separated. However, more than one empty group in a row is never needed.\n                pattern: nativ.replace.call(output, /(?:\\(\\?:\\))+/g, '(?:)'),\n                // Strip all but native flags\n                flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),\n                // `context.captureNames` has an item for each capturing group, even if unnamed\n                captures: context.hasNamedCapture ? context.captureNames : null\n            };\n        }\n\n        var generated = patternCache[pattern][flags];\n        return augment(new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags);\n    }\n\n    // Add `RegExp.prototype` to the prototype chain\n    XRegExp.prototype = /(?:)/;\n\n    // ==--------------------------==\n    // Public properties\n    // ==--------------------------==\n\n    /**\n     * The XRegExp version number as a string containing three dot-separated parts. For example,\n     * '2.0.0-beta-3'.\n     *\n     * @static\n     * @memberOf XRegExp\n     * @type String\n     */\n    XRegExp.version = '4.0.0';\n\n    // ==--------------------------==\n    // Public methods\n    // ==--------------------------==\n\n    // Intentionally undocumented; used in tests and addons\n    XRegExp._clipDuplicates = clipDuplicates;\n    XRegExp._hasNativeFlag = hasNativeFlag;\n    XRegExp._dec = dec;\n    XRegExp._hex = hex;\n    XRegExp._pad4 = pad4;\n\n    /**\n     * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to\n     * create XRegExp addons. If more than one token can match the same string, the last added wins.\n     *\n     * @memberOf XRegExp\n     * @param {RegExp} regex Regex object that matches the new token.\n     * @param {Function} handler Function that returns a new pattern string (using native regex syntax)\n     *   to replace the matched token within all future XRegExp regexes. Has access to persistent\n     *   properties of the regex being built, through `this`. Invoked with three arguments:\n     *   - The match array, with named backreference properties.\n     *   - The regex scope where the match was found: 'default' or 'class'.\n     *   - The flags used by the regex, including any flags in a leading mode modifier.\n     *   The handler function becomes part of the XRegExp construction process, so be careful not to\n     *   construct XRegExps within the function or you will trigger infinite recursion.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.\n     *   - `flag` {String} Single-character flag that triggers the token. This also registers the\n     *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.\n     *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are\n     *     not required to trigger the token. This registers the flags, to prevent XRegExp from\n     *     throwing an 'unknown flag' error when any of the flags are used.\n     *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as\n     *     final, and instead be reparseable by other tokens (including the current token). Allows\n     *     token chaining or deferring.\n     *   - `leadChar` {String} Single character that occurs at the beginning of any successful match\n     *     of the token (not always applicable). This doesn't change the behavior of the token unless\n     *     you provide an erroneous value. However, providing it can increase the token's performance\n     *     since the token can be skipped at any positions where this character doesn't appear.\n     * @example\n     *\n     * // Basic usage: Add \\a for the ALERT control code\n     * XRegExp.addToken(\n     *   /\\\\a/,\n     *   () => '\\\\x07',\n     *   {scope: 'all'}\n     * );\n     * XRegExp('\\\\a[\\\\a-\\\\n]+').test('\\x07\\n\\x07'); // -> true\n     *\n     * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.\n     * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of\n     * // character classes only)\n     * XRegExp.addToken(\n     *   /([?*+]|{\\d+(?:,\\d*)?})(\\??)/,\n     *   (match) => `${match[1]}${match[2] ? '' : '?'}`,\n     *   {flag: 'U'}\n     * );\n     * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'\n     * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'\n     */\n    XRegExp.addToken = function (regex, handler, options) {\n        options = options || {};\n        var optionalFlags = options.optionalFlags;\n        var i = void 0;\n\n        if (options.flag) {\n            registerFlag(options.flag);\n        }\n\n        if (optionalFlags) {\n            optionalFlags = nativ.split.call(optionalFlags, '');\n            for (i = 0; i < optionalFlags.length; ++i) {\n                registerFlag(optionalFlags[i]);\n            }\n        }\n\n        // Add to the private list of syntax tokens\n        tokens.push({\n            regex: copyRegex(regex, {\n                addG: true,\n                addY: hasNativeY,\n                isInternalOnly: true\n            }),\n            handler: handler,\n            scope: options.scope || defaultScope,\n            flag: options.flag,\n            reparse: options.reparse,\n            leadChar: options.leadChar\n        });\n\n        // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags\n        // might now produce different results\n        XRegExp.cache.flush('patterns');\n    };\n\n    /**\n     * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with\n     * the same pattern and flag combination, the cached copy of the regex is returned.\n     *\n     * @memberOf XRegExp\n     * @param {String} pattern Regex pattern string.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {RegExp} Cached XRegExp object.\n     * @example\n     *\n     * while (match = XRegExp.cache('.', 'gs').exec(str)) {\n     *   // The regex is compiled once only\n     * }\n     */\n    XRegExp.cache = function (pattern, flags) {\n        if (!regexCache[pattern]) {\n            regexCache[pattern] = {};\n        }\n        return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));\n    };\n\n    // Intentionally undocumented; used in tests\n    XRegExp.cache.flush = function (cacheName) {\n        if (cacheName === 'patterns') {\n            // Flush the pattern cache used by the `XRegExp` constructor\n            patternCache = {};\n        } else {\n            // Flush the regex cache populated by `XRegExp.cache`\n            regexCache = {};\n        }\n    };\n\n    /**\n     * Escapes any regular expression metacharacters, for use when matching literal strings. The result\n     * can safely be used at any point within a regex that uses any flags.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to escape.\n     * @returns {String} String with regex metacharacters escaped.\n     * @example\n     *\n     * XRegExp.escape('Escaped? <.>');\n     * // -> 'Escaped\\?\\ <\\.>'\n     */\n    XRegExp.escape = function (str) {\n        return nativ.replace.call(toObject(str), /[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n    };\n\n    /**\n     * Executes a regex search in a specified string. Returns a match array or `null`. If the provided\n     * regex uses named capture, named backreference properties are included on the match array.\n     * Optional `pos` and `sticky` arguments specify the search start position, and whether the match\n     * must start at the specified position only. The `lastIndex` property of the provided regex is not\n     * used, but is updated for compatibility. Also fixes browser bugs compared to the native\n     * `RegExp.prototype.exec` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Number} [pos=0] Zero-based index at which to start the search.\n     * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n     *   only. The string `'sticky'` is accepted as an alternative to `true`.\n     * @returns {Array} Match array with named backreference properties, or `null`.\n     * @example\n     *\n     * // Basic use, with named backreference\n     * let match = XRegExp.exec('U+2620', XRegExp('U\\\\+(?<hex>[0-9A-F]{4})'));\n     * match.hex; // -> '2620'\n     *\n     * // With pos and sticky, in a loop\n     * let pos = 2, result = [], match;\n     * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\\d)>/, pos, 'sticky')) {\n     *   result.push(match[1]);\n     *   pos = match.index + match[0].length;\n     * }\n     * // result -> ['2', '3', '4']\n     */\n    XRegExp.exec = function (str, regex, pos, sticky) {\n        var cacheKey = 'g';\n        var addY = false;\n        var fakeY = false;\n        var match = void 0;\n\n        addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);\n        if (addY) {\n            cacheKey += 'y';\n        } else if (sticky) {\n            // Simulate sticky matching by appending an empty capture to the original regex. The\n            // resulting regex will succeed no matter what at the current index (set with `lastIndex`),\n            // and will not search the rest of the subject string. We'll know that the original regex\n            // has failed if that last capture is `''` rather than `undefined` (i.e., if that last\n            // capture participated in the match).\n            fakeY = true;\n            cacheKey += 'FakeY';\n        }\n\n        regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.match`/`replace`\n        var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n            addG: true,\n            addY: addY,\n            source: fakeY ? regex.source + '|()' : undefined,\n            removeY: sticky === false,\n            isInternalOnly: true\n        }));\n\n        pos = pos || 0;\n        r2.lastIndex = pos;\n\n        // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.\n        match = fixed.exec.call(r2, str);\n\n        // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means\n        // the original regexp failed (see above).\n        if (fakeY && match && match.pop() === '') {\n            match = null;\n        }\n\n        if (regex.global) {\n            regex.lastIndex = match ? r2.lastIndex : 0;\n        }\n\n        return match;\n    };\n\n    /**\n     * Executes a provided function once per regex match. Searches always start at the beginning of the\n     * string and continue until the end, regardless of the state of the regex's `global` property and\n     * initial `lastIndex`.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Function} callback Function to execute for each match. Invoked with four arguments:\n     *   - The match array, with named backreference properties.\n     *   - The zero-based match index.\n     *   - The string being traversed.\n     *   - The regex object being used to traverse the string.\n     * @example\n     *\n     * // Extracts every other digit from a string\n     * const evens = [];\n     * XRegExp.forEach('1a2345', /\\d/, (match, i) => {\n     *   if (i % 2) evens.push(+match[0]);\n     * });\n     * // evens -> [2, 4]\n     */\n    XRegExp.forEach = function (str, regex, callback) {\n        var pos = 0;\n        var i = -1;\n        var match = void 0;\n\n        while (match = XRegExp.exec(str, regex, pos)) {\n            // Because `regex` is provided to `callback`, the function could use the deprecated/\n            // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`\n            // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,\n            // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of\n            // regexes, mutating the regex will not have any effect on the iteration or matched strings,\n            // which is a nice side effect that brings extra safety.\n            callback(match, ++i, str, regex);\n\n            pos = match.index + (match[0].length || 1);\n        }\n    };\n\n    /**\n     * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with\n     * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native\n     * regexes are not recompiled using XRegExp syntax.\n     *\n     * @memberOf XRegExp\n     * @param {RegExp} regex Regex to globalize.\n     * @returns {RegExp} Copy of the provided regex with flag `g` added.\n     * @example\n     *\n     * const globalCopy = XRegExp.globalize(/regex/);\n     * globalCopy.global; // -> true\n     */\n    XRegExp.globalize = function (regex) {\n        return copyRegex(regex, { addG: true });\n    };\n\n    /**\n     * Installs optional features according to the specified options. Can be undone using\n     * `XRegExp.uninstall`.\n     *\n     * @memberOf XRegExp\n     * @param {Object|String} options Options object or string.\n     * @example\n     *\n     * // With an options object\n     * XRegExp.install({\n     *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)\n     *   astral: true\n     * });\n     *\n     * // With an options string\n     * XRegExp.install('astral');\n     */\n    XRegExp.install = function (options) {\n        options = prepareOptions(options);\n\n        if (!features.astral && options.astral) {\n            setAstral(true);\n        }\n    };\n\n    /**\n     * Checks whether an individual optional feature is installed.\n     *\n     * @memberOf XRegExp\n     * @param {String} feature Name of the feature to check. One of:\n     *   - `astral`\n     * @returns {Boolean} Whether the feature is installed.\n     * @example\n     *\n     * XRegExp.isInstalled('astral');\n     */\n    XRegExp.isInstalled = function (feature) {\n        return !!features[feature];\n    };\n\n    /**\n     * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes\n     * created in another frame, when `instanceof` and `constructor` checks would fail.\n     *\n     * @memberOf XRegExp\n     * @param {*} value Object to check.\n     * @returns {Boolean} Whether the object is a `RegExp` object.\n     * @example\n     *\n     * XRegExp.isRegExp('string'); // -> false\n     * XRegExp.isRegExp(/regex/i); // -> true\n     * XRegExp.isRegExp(RegExp('^', 'm')); // -> true\n     * XRegExp.isRegExp(XRegExp('(?s).')); // -> true\n     */\n    XRegExp.isRegExp = function (value) {\n        return toString.call(value) === '[object RegExp]';\n    }; // isType(value, 'RegExp');\n\n    /**\n     * Returns the first matched string, or in global mode, an array containing all matched strings.\n     * This is essentially a more convenient re-implementation of `String.prototype.match` that gives\n     * the result types you actually want (string instead of `exec`-style array in match-first mode,\n     * and an empty array instead of `null` when no matches are found in match-all mode). It also lets\n     * you override flag g and ignore `lastIndex`, and fixes browser bugs.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to\n     *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,\n     *   `scope` is 'all'.\n     * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all\n     *   mode: Array of all matched strings, or an empty array.\n     * @example\n     *\n     * // Match first\n     * XRegExp.match('abc', /\\w/); // -> 'a'\n     * XRegExp.match('abc', /\\w/g, 'one'); // -> 'a'\n     * XRegExp.match('abc', /x/g, 'one'); // -> null\n     *\n     * // Match all\n     * XRegExp.match('abc', /\\w/g); // -> ['a', 'b', 'c']\n     * XRegExp.match('abc', /\\w/, 'all'); // -> ['a', 'b', 'c']\n     * XRegExp.match('abc', /x/, 'all'); // -> []\n     */\n    XRegExp.match = function (str, regex, scope) {\n        var global = regex.global && scope !== 'one' || scope === 'all';\n        var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';\n\n        regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.exec`/`replace`\n        var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n            addG: !!global,\n            removeG: scope === 'one',\n            isInternalOnly: true\n        }));\n\n        var result = nativ.match.call(toObject(str), r2);\n\n        if (regex.global) {\n            regex.lastIndex = scope === 'one' && result ?\n            // Can't use `r2.lastIndex` since `r2` is nonglobal in this case\n            result.index + result[0].length : 0;\n        }\n\n        return global ? result || [] : result && result[0];\n    };\n\n    /**\n     * Retrieves the matches from searching a string using a chain of regexes that successively search\n     * within previous matches. The provided `chain` array can contain regexes and or objects with\n     * `regex` and `backref` properties. When a backreference is specified, the named or numbered\n     * backreference is passed forward to the next regex or returned.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {Array} chain Regexes that each search for matches within preceding results.\n     * @returns {Array} Matches by the last regex in the chain, or an empty array.\n     * @example\n     *\n     * // Basic usage; matches numbers within <b> tags\n     * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [\n     *   XRegExp('(?is)<b>.*?</b>'),\n     *   /\\d+/\n     * ]);\n     * // -> ['2', '4', '56']\n     *\n     * // Passing forward and returning specific backreferences\n     * html = '<a href=\"http://xregexp.com/api/\">XRegExp</a>\\\n     *         <a href=\"http://www.google.com/\">Google</a>';\n     * XRegExp.matchChain(html, [\n     *   {regex: /<a href=\"([^\"]+)\">/i, backref: 1},\n     *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}\n     * ]);\n     * // -> ['xregexp.com', 'www.google.com']\n     */\n    XRegExp.matchChain = function (str, chain) {\n        return function recurseChain(values, level) {\n            var item = chain[level].regex ? chain[level] : { regex: chain[level] };\n            var matches = [];\n\n            function addMatch(match) {\n                if (item.backref) {\n                    // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the\n                    // `undefined`s for backreferences to nonparticipating capturing groups. In such\n                    // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw\n                    // the exception, so also check if the backreference is a number that is within the\n                    // bounds of the array.\n                    if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) {\n                        throw new ReferenceError('Backreference to undefined group: ' + item.backref);\n                    }\n\n                    matches.push(match[item.backref] || '');\n                } else {\n                    matches.push(match[0]);\n                }\n            }\n\n            for (var i = 0; i < values.length; ++i) {\n                XRegExp.forEach(values[i], item.regex, addMatch);\n            }\n\n            return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);\n        }([str], 0);\n    };\n\n    /**\n     * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string\n     * or regex, and the replacement can be a string or a function to be called for each match. To\n     * perform a global search and replace, use the optional `scope` argument or include flag g if using\n     * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.\n     * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser\n     * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp|String} search Search pattern to be replaced.\n     * @param {String|Function} replacement Replacement string or a function invoked to create it.\n     *   Replacement strings can include special replacement syntax:\n     *     - $$ - Inserts a literal $ character.\n     *     - $&, $0 - Inserts the matched substring.\n     *     - $` - Inserts the string that precedes the matched substring (left context).\n     *     - $' - Inserts the string that follows the matched substring (right context).\n     *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts\n     *       backreference n/nn.\n     *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing\n     *       group, inserts backreference n.\n     *   Replacement functions are invoked with three or more arguments:\n     *     - The matched substring (corresponds to $& above). Named backreferences are accessible as\n     *       properties of this first argument.\n     *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).\n     *     - The zero-based index of the match within the total search string.\n     *     - The total string being searched.\n     * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not\n     *   explicitly specified and using a regex with flag g, `scope` is 'all'.\n     * @returns {String} New string with one or all matches replaced.\n     * @example\n     *\n     * // Regex search, using named backreferences in replacement string\n     * const name = XRegExp('(?<first>\\\\w+) (?<last>\\\\w+)');\n     * XRegExp.replace('John Smith', name, '$<last>, $<first>');\n     * // -> 'Smith, John'\n     *\n     * // Regex search, using named backreferences in replacement function\n     * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);\n     * // -> 'Smith, John'\n     *\n     * // String search, with replace-all\n     * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');\n     * // -> 'XRegExp builds XRegExps'\n     */\n    XRegExp.replace = function (str, search, replacement, scope) {\n        var isRegex = XRegExp.isRegExp(search);\n        var global = search.global && scope !== 'one' || scope === 'all';\n        var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';\n        var s2 = search;\n\n        if (isRegex) {\n            search[REGEX_DATA] = search[REGEX_DATA] || {};\n\n            // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s\n            // `lastIndex` isn't updated *during* replacement iterations\n            s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {\n                addG: !!global,\n                removeG: scope === 'one',\n                isInternalOnly: true\n            }));\n        } else if (global) {\n            s2 = new RegExp(XRegExp.escape(String(search)), 'g');\n        }\n\n        // Fixed `replace` required for named backreferences, etc.\n        var result = fixed.replace.call(toObject(str), s2, replacement);\n\n        if (isRegex && search.global) {\n            // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n            search.lastIndex = 0;\n        }\n\n        return result;\n    };\n\n    /**\n     * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an\n     * array of replacement details. Later replacements operate on the output of earlier replacements.\n     * Replacement details are accepted as an array with a regex or string to search for, the\n     * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp\n     * replacement text syntax, which supports named backreference properties via `${name}` or\n     * `$<name>`.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {Array} replacements Array of replacement detail arrays.\n     * @returns {String} New string with all replacements.\n     * @example\n     *\n     * str = XRegExp.replaceEach(str, [\n     *   [XRegExp('(?<name>a)'), 'z${name}'],\n     *   [/b/gi, 'y'],\n     *   [/c/g, 'x', 'one'], // scope 'one' overrides /g\n     *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g\n     *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings\n     *   [/f/g, ($0) => $0.toUpperCase()]\n     * ]);\n     */\n    XRegExp.replaceEach = function (str, replacements) {\n        var i = void 0;\n        var r = void 0;\n\n        for (i = 0; i < replacements.length; ++i) {\n            r = replacements[i];\n            str = XRegExp.replace(str, r[0], r[1], r[2]);\n        }\n\n        return str;\n    };\n\n    /**\n     * Splits a string into an array of strings using a regex or string separator. Matches of the\n     * separator are not included in the result array. However, if `separator` is a regex that contains\n     * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n     * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n     * cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to split.\n     * @param {RegExp|String} separator Regex or string to use for separating the string.\n     * @param {Number} [limit] Maximum number of items to include in the result array.\n     * @returns {Array} Array of substrings.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.split('a b c', ' ');\n     * // -> ['a', 'b', 'c']\n     *\n     * // With limit\n     * XRegExp.split('a b c', ' ', 2);\n     * // -> ['a', 'b']\n     *\n     * // Backreferences in result array\n     * XRegExp.split('..word1..', /([a-z]+)(\\d+)/i);\n     * // -> ['..', 'word', '1', '..']\n     */\n    XRegExp.split = function (str, separator, limit) {\n        return fixed.split.call(toObject(str), separator, limit);\n    };\n\n    /**\n     * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and\n     * `sticky` arguments specify the search start position, and whether the match must start at the\n     * specified position only. The `lastIndex` property of the provided regex is not used, but is\n     * updated for compatibility. Also fixes browser bugs compared to the native\n     * `RegExp.prototype.test` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Number} [pos=0] Zero-based index at which to start the search.\n     * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n     *   only. The string `'sticky'` is accepted as an alternative to `true`.\n     * @returns {Boolean} Whether the regex matched the provided value.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.test('abc', /c/); // -> true\n     *\n     * // With pos and sticky\n     * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false\n     * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true\n     */\n    // Do this the easy way :-)\n    XRegExp.test = function (str, regex, pos, sticky) {\n        return !!XRegExp.exec(str, regex, pos, sticky);\n    };\n\n    /**\n     * Uninstalls optional features according to the specified options. All optional features start out\n     * uninstalled, so this is used to undo the actions of `XRegExp.install`.\n     *\n     * @memberOf XRegExp\n     * @param {Object|String} options Options object or string.\n     * @example\n     *\n     * // With an options object\n     * XRegExp.uninstall({\n     *   // Disables support for astral code points in Unicode addons\n     *   astral: true\n     * });\n     *\n     * // With an options string\n     * XRegExp.uninstall('astral');\n     */\n    XRegExp.uninstall = function (options) {\n        options = prepareOptions(options);\n\n        if (features.astral && options.astral) {\n            setAstral(false);\n        }\n    };\n\n    /**\n     * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as\n     * regex objects or strings. Metacharacters are escaped in patterns provided as strings.\n     * Backreferences in provided regex objects are automatically renumbered to work correctly within\n     * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the\n     * `flags` argument.\n     *\n     * @memberOf XRegExp\n     * @param {Array} patterns Regexes and strings to combine.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.\n     * @returns {RegExp} Union of the provided regexes and strings.\n     * @example\n     *\n     * XRegExp.union(['a+b*c', /(dogs)\\1/, /(cats)\\1/], 'i');\n     * // -> /a\\+b\\*c|(dogs)\\1|(cats)\\2/i\n     *\n     * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});\n     * // -> /manbearpig/i\n     */\n    XRegExp.union = function (patterns, flags, options) {\n        options = options || {};\n        var conjunction = options.conjunction || 'or';\n        var numCaptures = 0;\n        var numPriorCaptures = void 0;\n        var captureNames = void 0;\n\n        function rewrite(match, paren, backref) {\n            var name = captureNames[numCaptures - numPriorCaptures];\n\n            // Capturing group\n            if (paren) {\n                ++numCaptures;\n                // If the current capture has a name, preserve the name\n                if (name) {\n                    return '(?<' + name + '>';\n                }\n                // Backreference\n            } else if (backref) {\n                // Rewrite the backreference\n                return '\\\\' + (+backref + numPriorCaptures);\n            }\n\n            return match;\n        }\n\n        if (!(isType(patterns, 'Array') && patterns.length)) {\n            throw new TypeError('Must provide a nonempty array of patterns to merge');\n        }\n\n        var parts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n        var output = [];\n        var pattern = void 0;\n        for (var i = 0; i < patterns.length; ++i) {\n            pattern = patterns[i];\n\n            if (XRegExp.isRegExp(pattern)) {\n                numPriorCaptures = numCaptures;\n                captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || [];\n\n                // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are\n                // independently valid; helps keep this simple. Named captures are put back\n                output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));\n            } else {\n                output.push(XRegExp.escape(pattern));\n            }\n        }\n\n        var separator = conjunction === 'none' ? '' : '|';\n        return XRegExp(output.join(separator), flags);\n    };\n\n    // ==--------------------------==\n    // Fixed/extended native methods\n    // ==--------------------------==\n\n    /**\n     * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n     * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.\n     *\n     * @memberOf RegExp\n     * @param {String} str String to search.\n     * @returns {Array} Match array with named backreference properties, or `null`.\n     */\n    fixed.exec = function (str) {\n        var origLastIndex = this.lastIndex;\n        var match = nativ.exec.apply(this, arguments);\n\n        if (match) {\n            // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing\n            // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9\n            // in standards mode follows the spec.\n            if (!correctExecNpcg && match.length > 1 && match.indexOf('') !== -1) {\n                var r2 = copyRegex(this, {\n                    removeG: true,\n                    isInternalOnly: true\n                });\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                nativ.replace.call(String(str).slice(match.index), r2, function () {\n                    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                        args[_key] = arguments[_key];\n                    }\n\n                    var len = args.length;\n                    // Skip index 0 and the last 2\n                    for (var i = 1; i < len - 2; ++i) {\n                        if (args[i] === undefined) {\n                            match[i] = undefined;\n                        }\n                    }\n                });\n            }\n\n            // Attach named capture properties\n            if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {\n                // Skip index 0\n                for (var i = 1; i < match.length; ++i) {\n                    var name = this[REGEX_DATA].captureNames[i - 1];\n                    if (name) {\n                        match[name] = match[i];\n                    }\n                }\n            }\n\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (this.global && !match[0].length && this.lastIndex > match.index) {\n                this.lastIndex = match.index;\n            }\n        }\n\n        if (!this.global) {\n            // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n            this.lastIndex = origLastIndex;\n        }\n\n        return match;\n    };\n\n    /**\n     * Fixes browser bugs in the native `RegExp.prototype.test`.\n     *\n     * @memberOf RegExp\n     * @param {String} str String to search.\n     * @returns {Boolean} Whether the regex matched the provided value.\n     */\n    fixed.test = function (str) {\n        // Do this the easy way :-)\n        return !!fixed.exec.call(this, str);\n    };\n\n    /**\n     * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n     * bugs in the native `String.prototype.match`.\n     *\n     * @memberOf String\n     * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.\n     * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,\n     *   the result of calling `regex.exec(this)`.\n     */\n    fixed.match = function (regex) {\n        if (!XRegExp.isRegExp(regex)) {\n            // Use the native `RegExp` rather than `XRegExp`\n            regex = new RegExp(regex);\n        } else if (regex.global) {\n            var result = nativ.match.apply(this, arguments);\n            // Fixes IE bug\n            regex.lastIndex = 0;\n\n            return result;\n        }\n\n        return fixed.exec.call(regex, toObject(this));\n    };\n\n    /**\n     * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement\n     * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also\n     * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex\n     * search value, and the value of a replacement regex's `lastIndex` property during replacement\n     * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third\n     * (`flags`) argument. Use via `XRegExp.replace`.\n     *\n     * @memberOf String\n     * @param {RegExp|String} search Search pattern to be replaced.\n     * @param {String|Function} replacement Replacement string or a function invoked to create it.\n     * @returns {String} New string with one or all matches replaced.\n     */\n    fixed.replace = function (search, replacement) {\n        var isRegex = XRegExp.isRegExp(search);\n        var origLastIndex = void 0;\n        var captureNames = void 0;\n        var result = void 0;\n\n        if (isRegex) {\n            if (search[REGEX_DATA]) {\n                captureNames = search[REGEX_DATA].captureNames;\n            }\n            // Only needed if `search` is nonglobal\n            origLastIndex = search.lastIndex;\n        } else {\n            search += ''; // Type-convert\n        }\n\n        // Don't use `typeof`; some older browsers return 'function' for regex objects\n        if (isType(replacement, 'Function')) {\n            // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement\n            // functions isn't type-converted to a string\n            result = nativ.replace.call(String(this), search, function () {\n                for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                    args[_key2] = arguments[_key2];\n                }\n\n                if (captureNames) {\n                    // Change the `args[0]` string primitive to a `String` object that can store\n                    // properties. This really does need to use `String` as a constructor\n                    args[0] = new String(args[0]);\n                    // Store named backreferences on the first argument\n                    for (var i = 0; i < captureNames.length; ++i) {\n                        if (captureNames[i]) {\n                            args[0][captureNames[i]] = args[i + 1];\n                        }\n                    }\n                }\n                // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari\n                // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)\n                if (isRegex && search.global) {\n                    search.lastIndex = args[args.length - 2] + args[0].length;\n                }\n                // ES6 specs the context for replacement functions as `undefined`\n                return replacement.apply(undefined, args);\n            });\n        } else {\n            // Ensure that the last value of `args` will be a string when given nonstring `this`,\n            // while still throwing on null or undefined context\n            result = nativ.replace.call(this == null ? this : String(this), search, function () {\n                for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n                    args[_key3] = arguments[_key3];\n                }\n\n                return nativ.replace.call(String(replacement), replacementToken, replacer);\n\n                function replacer($0, bracketed, angled, dollarToken) {\n                    bracketed = bracketed || angled;\n                    // Named or numbered backreference with curly or angled braces\n                    if (bracketed) {\n                        // XRegExp behavior for `${n}` or `$<n>`:\n                        // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the\n                        //    entire match. Any number of leading zeros may be used.\n                        // 2. Backreference to named capture `n`, if it exists and is not an integer\n                        //    overridden by numbered capture. In practice, this does not overlap with\n                        //    numbered capture since XRegExp does not allow named capture to use a bare\n                        //    integer as the name.\n                        // 3. If the name or number does not refer to an existing capturing group, it's\n                        //    an error.\n                        var n = +bracketed; // Type-convert; drop leading zeros\n                        if (n <= args.length - 3) {\n                            return args[n] || '';\n                        }\n                        // Groups with the same name is an error, else would need `lastIndexOf`\n                        n = captureNames ? captureNames.indexOf(bracketed) : -1;\n                        if (n < 0) {\n                            throw new SyntaxError('Backreference to undefined group ' + $0);\n                        }\n                        return args[n + 1] || '';\n                    }\n                    // Else, special variable or numbered backreference without curly braces\n                    if (dollarToken === '$') {\n                        // $$\n                        return '$';\n                    }\n                    if (dollarToken === '&' || +dollarToken === 0) {\n                        // $&, $0 (not followed by 1-9), $00\n                        return args[0];\n                    }\n                    if (dollarToken === '`') {\n                        // $` (left context)\n                        return args[args.length - 1].slice(0, args[args.length - 2]);\n                    }\n                    if (dollarToken === \"'\") {\n                        // $' (right context)\n                        return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                    }\n                    // Else, numbered backreference without braces\n                    dollarToken = +dollarToken; // Type-convert; drop leading zero\n                    // XRegExp behavior for `$n` and `$nn`:\n                    // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.\n                    // - `$1` is an error if no capturing groups.\n                    // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`\n                    //   instead.\n                    // - `$01` is `$1` if at least one capturing group, else it's an error.\n                    // - `$0` (not followed by 1-9) and `$00` are the entire match.\n                    // Native behavior, for comparison:\n                    // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.\n                    // - `$1` is a literal `$1` if no capturing groups.\n                    // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.\n                    // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.\n                    // - `$0` is a literal `$0`.\n                    if (!isNaN(dollarToken)) {\n                        if (dollarToken > args.length - 3) {\n                            throw new SyntaxError('Backreference to undefined group ' + $0);\n                        }\n                        return args[dollarToken] || '';\n                    }\n                    // `$` followed by an unsupported char is an error, unlike native JS\n                    throw new SyntaxError('Invalid token ' + $0);\n                }\n            });\n        }\n\n        if (isRegex) {\n            if (search.global) {\n                // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n                search.lastIndex = 0;\n            } else {\n                // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n                search.lastIndex = origLastIndex;\n            }\n        }\n\n        return result;\n    };\n\n    /**\n     * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.\n     *\n     * @memberOf String\n     * @param {RegExp|String} separator Regex or string to use for separating the string.\n     * @param {Number} [limit] Maximum number of items to include in the result array.\n     * @returns {Array} Array of substrings.\n     */\n    fixed.split = function (separator, limit) {\n        if (!XRegExp.isRegExp(separator)) {\n            // Browsers handle nonregex split correctly, so use the faster native method\n            return nativ.split.apply(this, arguments);\n        }\n\n        var str = String(this);\n        var output = [];\n        var origLastIndex = separator.lastIndex;\n        var lastLastIndex = 0;\n        var lastLength = void 0;\n\n        // Values for `limit`, per the spec:\n        // If undefined: pow(2,32) - 1\n        // If 0, Infinity, or NaN: 0\n        // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);\n        // If negative number: pow(2,32) - floor(abs(limit))\n        // If other: Type-convert, then use the above rules\n        // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless\n        // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+\n        limit = (limit === undefined ? -1 : limit) >>> 0;\n\n        XRegExp.forEach(str, separator, function (match) {\n            // This condition is not the same as `if (match[0].length)`\n            if (match.index + match[0].length > lastLastIndex) {\n                output.push(str.slice(lastLastIndex, match.index));\n                if (match.length > 1 && match.index < str.length) {\n                    Array.prototype.push.apply(output, match.slice(1));\n                }\n                lastLength = match[0].length;\n                lastLastIndex = match.index + lastLength;\n            }\n        });\n\n        if (lastLastIndex === str.length) {\n            if (!nativ.test.call(separator, '') || lastLength) {\n                output.push('');\n            }\n        } else {\n            output.push(str.slice(lastLastIndex));\n        }\n\n        separator.lastIndex = origLastIndex;\n        return output.length > limit ? output.slice(0, limit) : output;\n    };\n\n    // ==--------------------------==\n    // Built-in syntax/flag tokens\n    // ==--------------------------==\n\n    /*\n     * Letter escapes that natively match literal characters: `\\a`, `\\A`, etc. These should be\n     * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser\n     * consistency and to reserve their syntax, but lets them be superseded by addons.\n     */\n    XRegExp.addToken(/\\\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|x(?![\\dA-Fa-f]{2}))/, function (match, scope) {\n        // \\B is allowed in default scope only\n        if (match[1] === 'B' && scope === defaultScope) {\n            return match[0];\n        }\n        throw new SyntaxError('Invalid escape ' + match[0]);\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Unicode code point escape with curly braces: `\\u{N..}`. `N..` is any one or more digit\n     * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag\n     * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to\n     * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior\n     * if you follow a `\\u{N..}` token that references a code point above U+FFFF with a quantifier, or\n     * if you use the same in a character class.\n     */\n    XRegExp.addToken(/\\\\u{([\\dA-Fa-f]+)}/, function (match, scope, flags) {\n        var code = dec(match[1]);\n        if (code > 0x10FFFF) {\n            throw new SyntaxError('Invalid Unicode code point ' + match[0]);\n        }\n        if (code <= 0xFFFF) {\n            // Converting to \\uNNNN avoids needing to escape the literal character and keep it\n            // separate from preceding tokens\n            return '\\\\u' + pad4(hex(code));\n        }\n        // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling\n        if (hasNativeU && flags.indexOf('u') !== -1) {\n            return match[0];\n        }\n        throw new SyntaxError('Cannot use Unicode code point above \\\\u{FFFF} without flag u');\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.\n     * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because\n     * character class endings can't be determined.\n     */\n    XRegExp.addToken(/\\[(\\^?)\\]/,\n    // For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n    // (?!) should work like \\b\\B, but is unreliable in some versions of Firefox\n    /* eslint-disable no-confusing-arrow */\n    function (match) {\n        return match[1] ? '[\\\\s\\\\S]' : '\\\\b\\\\B';\n    },\n    /* eslint-enable no-confusing-arrow */\n    { leadChar: '[' });\n\n    /*\n     * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in\n     * free-spacing mode (flag x).\n     */\n    XRegExp.addToken(/\\(\\?#[^)]*\\)/, getContextualTokenSeparator, { leadChar: '(' });\n\n    /*\n     * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.\n     */\n    XRegExp.addToken(/\\s+|#[^\\n]*\\n?/, getContextualTokenSeparator, { flag: 'x' });\n\n    /*\n     * Dot, in dotall mode (aka singleline mode, flag s) only.\n     */\n    XRegExp.addToken(/\\./, function () {\n        return '[\\\\s\\\\S]';\n    }, {\n        flag: 's',\n        leadChar: '.'\n    });\n\n    /*\n     * Named backreference: `\\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,\n     * and $ only. Also allows numbered backreferences as `\\k<n>`.\n     */\n    XRegExp.addToken(/\\\\k<([\\w$]+)>/, function (match) {\n        // Groups with the same name is an error, else would need `lastIndexOf`\n        var index = isNaN(match[1]) ? this.captureNames.indexOf(match[1]) + 1 : +match[1];\n        var endIndex = match.index + match[0].length;\n        if (!index || index > this.captureNames.length) {\n            throw new SyntaxError('Backreference to undefined group ' + match[0]);\n        }\n        // Keep backreferences separate from subsequent literal numbers. This avoids e.g.\n        // inadvertedly changing `(?<n>)\\k<n>1` to `()\\11`.\n        return '\\\\' + index + (endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');\n    }, { leadChar: '\\\\' });\n\n    /*\n     * Numbered backreference or octal, plus any following digits: `\\0`, `\\11`, etc. Octals except `\\0`\n     * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches\n     * are returned unaltered. IE < 9 doesn't support backreferences above `\\99` in regex syntax.\n     */\n    XRegExp.addToken(/\\\\(\\d+)/, function (match, scope) {\n        if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {\n            throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]);\n        }\n        return match[0];\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the\n     * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style\n     * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively\n     * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to\n     * Python-style named capture as octals.\n     */\n    XRegExp.addToken(/\\(\\?P?<([\\w$]+)>/, function (match) {\n        // Disallow bare integers as names because named backreferences are added to match arrays\n        // and therefore numeric properties may lead to incorrect lookups\n        if (!isNaN(match[1])) {\n            throw new SyntaxError('Cannot use integer as capture name ' + match[0]);\n        }\n        if (match[1] === 'length' || match[1] === '__proto__') {\n            throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]);\n        }\n        if (this.captureNames.indexOf(match[1]) !== -1) {\n            throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]);\n        }\n        this.captureNames.push(match[1]);\n        this.hasNamedCapture = true;\n        return '(';\n    }, { leadChar: '(' });\n\n    /*\n     * Capturing group; match the opening parenthesis only. Required for support of named capturing\n     * groups. Also adds explicit capture mode (flag n).\n     */\n    XRegExp.addToken(/\\((?!\\?)/, function (match, scope, flags) {\n        if (flags.indexOf('n') !== -1) {\n            return '(?:';\n        }\n        this.captureNames.push(null);\n        return '(';\n    }, {\n        optionalFlags: 'n',\n        leadChar: '('\n    });\n\n    exports.default = XRegExp;\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(xregexp);\n\n    var build = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp.build 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2012-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n        var REGEX_DATA = 'xregexp';\n        var subParts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n        var parts = XRegExp.union([/\\({{([\\w$]+)}}\\)|{{([\\w$]+)}}/, subParts], 'g', {\n            conjunction: 'or'\n        });\n\n        /**\n         * Strips a leading `^` and trailing unescaped `$`, if both are present.\n         *\n         * @private\n         * @param {String} pattern Pattern to process.\n         * @returns {String} Pattern with edge anchors removed.\n         */\n        function deanchor(pattern) {\n            // Allow any number of empty noncapturing groups before/after anchors, because regexes\n            // built/generated by XRegExp sometimes include them\n            var leadingAnchor = /^(?:\\(\\?:\\))*\\^/;\n            var trailingAnchor = /\\$(?:\\(\\?:\\))*$/;\n\n            if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) &&\n            // Ensure that the trailing `$` isn't escaped\n            trailingAnchor.test(pattern.replace(/\\\\[\\s\\S]/g, ''))) {\n                return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');\n            }\n\n            return pattern;\n        }\n\n        /**\n         * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.\n         *\n         * @private\n         * @param {String|RegExp} value Value to convert.\n         * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not\n         *   already a regex generated by XRegExp\n         * @returns {RegExp} XRegExp object with XRegExp syntax applied.\n         */\n        function asXRegExp(value, addFlagX) {\n            var flags = addFlagX ? 'x' : '';\n            return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ?\n            // Don't recompile, to preserve capture names\n            value :\n            // Recompile as XRegExp\n            XRegExp(value.source, flags) :\n            // Compile string as XRegExp\n            XRegExp(value, flags);\n        }\n\n        function interpolate(substitution) {\n            return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);\n        }\n\n        function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {\n            subpatterns['subpattern' + subpatternIndex] = interpolated;\n            return subpatterns;\n        }\n\n        function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {\n            var hasSubpattern = subpatternIndex < rawLiterals.length - 1;\n            return raw + (hasSubpattern ? '{{subpattern' + subpatternIndex + '}}' : '');\n        }\n\n        /**\n         * Provides tagged template literals that create regexes with XRegExp syntax and flags. The\n         * provided pattern is handled as a raw string, so backslashes don't need to be escaped.\n         *\n         * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated\n         * patterns are treated as atomic units when quantified, interpolated strings have their special\n         * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated\n         * regexes if both are present, and any backreferences within an interpolated regex are\n         * rewritten to work within the overall pattern.\n         *\n         * @memberOf XRegExp\n         * @param {String} [flags] Any combination of XRegExp flags.\n         * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.\n         * @example\n         *\n         * const h12 = /1[0-2]|0?[1-9]/;\n         * const h24 = /2[0-3]|[01][0-9]/;\n         * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;\n         * const minutes = /^[0-5][0-9]$/;\n         * // Note that explicitly naming the 'minutes' group is required for named backreferences\n         * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;\n         * time.test('10:59'); // -> true\n         * XRegExp.exec('10:59', time).minutes; // -> '59'\n         */\n        XRegExp.tag = function (flags) {\n            return function (literals) {\n                for (var _len = arguments.length, substitutions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                    substitutions[_key - 1] = arguments[_key];\n                }\n\n                var subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});\n                var pattern = literals.raw.map(embedSubpatternAfter).join('');\n                return XRegExp.build(pattern, subpatterns, flags);\n            };\n        };\n\n        /**\n         * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in\n         * the outer pattern and provided subpatterns are automatically renumbered to work correctly.\n         * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.\n         *\n         * @memberOf XRegExp\n         * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows\n         *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within\n         *   character classes.\n         * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A\n         *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.\n         * @param {String} [flags] Any combination of XRegExp flags.\n         * @returns {RegExp} Regex with interpolated subpatterns.\n         * @example\n         *\n         * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {\n         *   hours: XRegExp.build('{{h12}} : | {{h24}}', {\n         *     h12: /1[0-2]|0?[1-9]/,\n         *     h24: /2[0-3]|[01][0-9]/\n         *   }, 'x'),\n         *   minutes: /^[0-5][0-9]$/\n         * });\n         * time.test('10:59'); // -> true\n         * XRegExp.exec('10:59', time).minutes; // -> '59'\n         */\n        XRegExp.build = function (pattern, subs, flags) {\n            flags = flags || '';\n            // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how\n            // some browsers convert `RegExp('\\n')` to a regex that contains the literal characters `\\`\n            // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.\n            var addFlagX = flags.indexOf('x') !== -1;\n            var inlineFlags = /^\\(\\?([\\w$]+)\\)/.exec(pattern);\n            // Add flags within a leading mode modifier to the overall pattern's flags\n            if (inlineFlags) {\n                flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);\n            }\n\n            var data = {};\n            for (var p in subs) {\n                if (subs.hasOwnProperty(p)) {\n                    // Passing to XRegExp enables extended syntax and ensures independent validity,\n                    // lest an unescaped `(`, `)`, `[`, or trailing `\\` breaks the `(?:)` wrapper. For\n                    // subpatterns provided as native regexes, it dies on octals and adds the property\n                    // used to hold extended regex instance data, for simplicity.\n                    var sub = asXRegExp(subs[p], addFlagX);\n                    data[p] = {\n                        // Deanchoring allows embedding independently useful anchored regexes. If you\n                        // really need to keep your anchors, double them (i.e., `^^...$$`).\n                        pattern: deanchor(sub.source),\n                        names: sub[REGEX_DATA].captureNames || []\n                    };\n                }\n            }\n\n            // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;\n            // helps keep this simple. Named captures will be put back.\n            var patternAsRegex = asXRegExp(pattern, addFlagX);\n\n            // 'Caps' is short for 'captures'\n            var numCaps = 0;\n            var numPriorCaps = void 0;\n            var numOuterCaps = 0;\n            var outerCapsMap = [0];\n            var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];\n            var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {\n                var subName = $1 || $2;\n                var capName = void 0;\n                var intro = void 0;\n                var localCapIndex = void 0;\n                // Named subpattern\n                if (subName) {\n                    if (!data.hasOwnProperty(subName)) {\n                        throw new ReferenceError('Undefined property ' + $0);\n                    }\n                    // Named subpattern was wrapped in a capturing group\n                    if ($1) {\n                        capName = outerCapNames[numOuterCaps];\n                        outerCapsMap[++numOuterCaps] = ++numCaps;\n                        // If it's a named group, preserve the name. Otherwise, use the subpattern name\n                        // as the capture name\n                        intro = '(?<' + (capName || subName) + '>';\n                    } else {\n                        intro = '(?:';\n                    }\n                    numPriorCaps = numCaps;\n                    var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {\n                        // Capturing group\n                        if (paren) {\n                            capName = data[subName].names[numCaps - numPriorCaps];\n                            ++numCaps;\n                            // If the current capture has a name, preserve the name\n                            if (capName) {\n                                return '(?<' + capName + '>';\n                            }\n                            // Backreference\n                        } else if (backref) {\n                            localCapIndex = +backref - 1;\n                            // Rewrite the backreference\n                            return data[subName].names[localCapIndex] ?\n                            // Need to preserve the backreference name in case using flag `n`\n                            '\\\\k<' + data[subName].names[localCapIndex] + '>' : '\\\\' + (+backref + numPriorCaps);\n                        }\n                        return match;\n                    });\n                    return '' + intro + rewrittenSubpattern + ')';\n                }\n                // Capturing group\n                if ($3) {\n                    capName = outerCapNames[numOuterCaps];\n                    outerCapsMap[++numOuterCaps] = ++numCaps;\n                    // If the current capture has a name, preserve the name\n                    if (capName) {\n                        return '(?<' + capName + '>';\n                    }\n                    // Backreference\n                } else if ($4) {\n                    localCapIndex = +$4 - 1;\n                    // Rewrite the backreference\n                    return outerCapNames[localCapIndex] ?\n                    // Need to preserve the backreference name in case using flag `n`\n                    '\\\\k<' + outerCapNames[localCapIndex] + '>' : '\\\\' + outerCapsMap[+$4];\n                }\n                return $0;\n            });\n\n            return XRegExp(output, flags);\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(build);\n\n    var matchrecursive = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp.matchRecursive 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2009-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Returns a match detail object composed of the provided values.\n         *\n         * @private\n         */\n        function row(name, value, start, end) {\n            return {\n                name: name,\n                value: value,\n                start: start,\n                end: end\n            };\n        }\n\n        /**\n         * Returns an array of match strings between outermost left and right delimiters, or an array of\n         * objects with detailed match parts and position data. An error is thrown if delimiters are\n         * unbalanced within the data.\n         *\n         * @memberOf XRegExp\n         * @param {String} str String to search.\n         * @param {String} left Left delimiter as an XRegExp pattern.\n         * @param {String} right Right delimiter as an XRegExp pattern.\n         * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.\n         * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.\n         * @returns {Array} Array of matches, or an empty array.\n         * @example\n         *\n         * // Basic usage\n         * let str = '(t((e))s)t()(ing)';\n         * XRegExp.matchRecursive(str, '\\\\(', '\\\\)', 'g');\n         * // -> ['t((e))s', '', 'ing']\n         *\n         * // Extended information mode with valueNames\n         * str = 'Here is <div> <div>an</div></div> example';\n         * XRegExp.matchRecursive(str, '<div\\\\s*>', '</div>', 'gi', {\n         *   valueNames: ['between', 'left', 'match', 'right']\n         * });\n         * // -> [\n         * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},\n         * // {name: 'left',    value: '<div>',          start: 8,  end: 13},\n         * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},\n         * // {name: 'right',   value: '</div>',         start: 27, end: 33},\n         * // {name: 'between', value: ' example',       start: 33, end: 41}\n         * // ]\n         *\n         * // Omitting unneeded parts with null valueNames, and using escapeChar\n         * str = '...{1}.\\\\{{function(x,y){return {y:x}}}';\n         * XRegExp.matchRecursive(str, '{', '}', 'g', {\n         *   valueNames: ['literal', null, 'value', null],\n         *   escapeChar: '\\\\'\n         * });\n         * // -> [\n         * // {name: 'literal', value: '...',  start: 0, end: 3},\n         * // {name: 'value',   value: '1',    start: 4, end: 5},\n         * // {name: 'literal', value: '.\\\\{', start: 6, end: 9},\n         * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}\n         * // ]\n         *\n         * // Sticky mode via flag y\n         * str = '<1><<<2>>><3>4<5>';\n         * XRegExp.matchRecursive(str, '<', '>', 'gy');\n         * // -> ['1', '<<2>>', '3']\n         */\n        XRegExp.matchRecursive = function (str, left, right, flags, options) {\n            flags = flags || '';\n            options = options || {};\n            var global = flags.indexOf('g') !== -1;\n            var sticky = flags.indexOf('y') !== -1;\n            // Flag `y` is controlled internally\n            var basicFlags = flags.replace(/y/g, '');\n            var escapeChar = options.escapeChar;\n            var vN = options.valueNames;\n            var output = [];\n            var openTokens = 0;\n            var delimStart = 0;\n            var delimEnd = 0;\n            var lastOuterEnd = 0;\n            var outerStart = void 0;\n            var innerStart = void 0;\n            var leftMatch = void 0;\n            var rightMatch = void 0;\n            var esc = void 0;\n            left = XRegExp(left, basicFlags);\n            right = XRegExp(right, basicFlags);\n\n            if (escapeChar) {\n                if (escapeChar.length > 1) {\n                    throw new Error('Cannot use more than one escape character');\n                }\n                escapeChar = XRegExp.escape(escapeChar);\n                // Example of concatenated `esc` regex:\n                // `escapeChar`: '%'\n                // `left`: '<'\n                // `right`: '>'\n                // Regex is: /(?:%[\\S\\s]|(?:(?!<|>)[^%])+)+/\n                esc = new RegExp('(?:' + escapeChar + '[\\\\S\\\\s]|(?:(?!' +\n                // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.\n                // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax\n                // transformation resulting from those flags was already applied to `left` and\n                // `right` when they were passed through the XRegExp constructor above.\n                XRegExp.union([left, right], '', { conjunction: 'or' }).source + ')[^' + escapeChar + '])+)+',\n                // Flags `gy` not needed here\n                flags.replace(/[^imu]+/g, ''));\n            }\n\n            while (true) {\n                // If using an escape character, advance to the delimiter's next starting position,\n                // skipping any escaped characters in between\n                if (escapeChar) {\n                    delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;\n                }\n                leftMatch = XRegExp.exec(str, left, delimEnd);\n                rightMatch = XRegExp.exec(str, right, delimEnd);\n                // Keep the leftmost match only\n                if (leftMatch && rightMatch) {\n                    if (leftMatch.index <= rightMatch.index) {\n                        rightMatch = null;\n                    } else {\n                        leftMatch = null;\n                    }\n                }\n                // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):\n                // LM | RM | OT | Result\n                // 1  | 0  | 1  | loop\n                // 1  | 0  | 0  | loop\n                // 0  | 1  | 1  | loop\n                // 0  | 1  | 0  | throw\n                // 0  | 0  | 1  | throw\n                // 0  | 0  | 0  | break\n                // The paths above don't include the sticky mode special case. The loop ends after the\n                // first completed match if not `global`.\n                if (leftMatch || rightMatch) {\n                    delimStart = (leftMatch || rightMatch).index;\n                    delimEnd = delimStart + (leftMatch || rightMatch)[0].length;\n                } else if (!openTokens) {\n                    break;\n                }\n                if (sticky && !openTokens && delimStart > lastOuterEnd) {\n                    break;\n                }\n                if (leftMatch) {\n                    if (!openTokens) {\n                        outerStart = delimStart;\n                        innerStart = delimEnd;\n                    }\n                    ++openTokens;\n                } else if (rightMatch && openTokens) {\n                    if (! --openTokens) {\n                        if (vN) {\n                            if (vN[0] && outerStart > lastOuterEnd) {\n                                output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));\n                            }\n                            if (vN[1]) {\n                                output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));\n                            }\n                            if (vN[2]) {\n                                output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));\n                            }\n                            if (vN[3]) {\n                                output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));\n                            }\n                        } else {\n                            output.push(str.slice(innerStart, delimStart));\n                        }\n                        lastOuterEnd = delimEnd;\n                        if (!global) {\n                            break;\n                        }\n                    }\n                } else {\n                    throw new Error('Unbalanced delimiter found in string');\n                }\n                // If the delimiter matched an empty string, avoid an infinite loop\n                if (delimStart === delimEnd) {\n                    ++delimEnd;\n                }\n            }\n\n            if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {\n                output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));\n            }\n\n            return output;\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(matchrecursive);\n\n    var unicodeBase = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Base 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2008-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds base support for Unicode matching:\n         * - Adds syntax `\\p{..}` for matching Unicode tokens. Tokens can be inverted using `\\P{..}` or\n         *   `\\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the\n         *   braces for token names that are a single letter (e.g. `\\pL` or `PL`).\n         * - Adds flag A (astral), which enables 21-bit Unicode support.\n         * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.\n         *\n         * Unicode Base relies on externally provided Unicode character data. Official addons are\n         * available to provide data for Unicode categories, scripts, blocks, and properties.\n         *\n         * @requires XRegExp\n         */\n\n        // ==--------------------------==\n        // Private stuff\n        // ==--------------------------==\n\n        // Storage for Unicode data\n        var unicode = {};\n\n        // Reuse utils\n        var dec = XRegExp._dec;\n        var hex = XRegExp._hex;\n        var pad4 = XRegExp._pad4;\n\n        // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed\n        function normalize(name) {\n            return name.replace(/[- _]+/g, '').toLowerCase();\n        }\n\n        // Gets the decimal code of a literal code unit, \\xHH, \\uHHHH, or a backslash-escaped literal\n        function charCode(chr) {\n            var esc = /^\\\\[xu](.+)/.exec(chr);\n            return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\\\' ? 1 : 0);\n        }\n\n        // Inverts a list of ordered BMP characters and ranges\n        function invertBmp(range) {\n            var output = '';\n            var lastEnd = -1;\n\n            XRegExp.forEach(range, /(\\\\x..|\\\\u....|\\\\?[\\s\\S])(?:-(\\\\x..|\\\\u....|\\\\?[\\s\\S]))?/, function (m) {\n                var start = charCode(m[1]);\n                if (start > lastEnd + 1) {\n                    output += '\\\\u' + pad4(hex(lastEnd + 1));\n                    if (start > lastEnd + 2) {\n                        output += '-\\\\u' + pad4(hex(start - 1));\n                    }\n                }\n                lastEnd = charCode(m[2] || m[1]);\n            });\n\n            if (lastEnd < 0xFFFF) {\n                output += '\\\\u' + pad4(hex(lastEnd + 1));\n                if (lastEnd < 0xFFFE) {\n                    output += '-\\\\uFFFF';\n                }\n            }\n\n            return output;\n        }\n\n        // Generates an inverted BMP range on first use\n        function cacheInvertedBmp(slug) {\n            var prop = 'b!';\n            return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));\n        }\n\n        // Combines and optionally negates BMP and astral data\n        function buildAstral(slug, isNegated) {\n            var item = unicode[slug];\n            var combined = '';\n\n            if (item.bmp && !item.isBmpLast) {\n                combined = '[' + item.bmp + ']' + (item.astral ? '|' : '');\n            }\n            if (item.astral) {\n                combined += item.astral;\n            }\n            if (item.isBmpLast && item.bmp) {\n                combined += (item.astral ? '|' : '') + '[' + item.bmp + ']';\n            }\n\n            // Astral Unicode tokens always match a code point, never a code unit\n            return isNegated ? '(?:(?!' + combined + ')(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\0-\\uFFFF]))' : '(?:' + combined + ')';\n        }\n\n        // Builds a complete astral pattern on first use\n        function cacheAstral(slug, isNegated) {\n            var prop = isNegated ? 'a!' : 'a=';\n            return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));\n        }\n\n        // ==--------------------------==\n        // Core functionality\n        // ==--------------------------==\n\n        /*\n         * Add astral mode (flag A) and Unicode token syntax: `\\p{..}`, `\\P{..}`, `\\p{^..}`, `\\pC`.\n         */\n        XRegExp.addToken(\n        // Use `*` instead of `+` to avoid capturing `^` as the token name in `\\p{^}`\n        /\\\\([pP])(?:{(\\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {\n            var ERR_DOUBLE_NEG = 'Invalid double negation ';\n            var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';\n            var ERR_UNKNOWN_REF = 'Unicode token missing data ';\n            var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';\n            var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';\n            // Negated via \\P{..} or \\p{^..}\n            var isNegated = match[1] === 'P' || !!match[2];\n            // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A\n            var isAstralMode = flags.indexOf('A') !== -1;\n            // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\\p{}`\n            var slug = normalize(match[4] || match[3]);\n            // Token data object\n            var item = unicode[slug];\n\n            if (match[1] === 'P' && match[2]) {\n                throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);\n            }\n            if (!unicode.hasOwnProperty(slug)) {\n                throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);\n            }\n\n            // Switch to the negated form of the referenced Unicode token\n            if (item.inverseOf) {\n                slug = normalize(item.inverseOf);\n                if (!unicode.hasOwnProperty(slug)) {\n                    throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf);\n                }\n                item = unicode[slug];\n                isNegated = !isNegated;\n            }\n\n            if (!(item.bmp || isAstralMode)) {\n                throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);\n            }\n            if (isAstralMode) {\n                if (scope === 'class') {\n                    throw new SyntaxError(ERR_ASTRAL_IN_CLASS);\n                }\n\n                return cacheAstral(slug, isNegated);\n            }\n\n            return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : (isNegated ? '[^' : '[') + item.bmp + ']';\n        }, {\n            scope: 'all',\n            optionalFlags: 'A',\n            leadChar: '\\\\'\n        });\n\n        /**\n         * Adds to the list of Unicode tokens that XRegExp regexes can match via `\\p` or `\\P`.\n         *\n         * @memberOf XRegExp\n         * @param {Array} data Objects with named character ranges. Each object may have properties\n         *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are\n         *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If\n         *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,\n         *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are\n         *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and\n         *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan\n         *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and\n         *   `astral` data should be a combination of literal characters and `\\xHH` or `\\uHHHH` escape\n         *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be\n         *   escaped, apart from range-creating hyphens. The `astral` data can additionally use\n         *   character classes and alternation, and should use surrogate pairs to represent astral code\n         *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is\n         *   defined as the exact inverse of another token.\n         * @example\n         *\n         * // Basic use\n         * XRegExp.addUnicodeData([{\n         *   name: 'XDigit',\n         *   alias: 'Hexadecimal',\n         *   bmp: '0-9A-Fa-f'\n         * }]);\n         * XRegExp('\\\\p{XDigit}:\\\\p{Hexadecimal}+').test('0:3D'); // -> true\n         */\n        XRegExp.addUnicodeData = function (data) {\n            var ERR_NO_NAME = 'Unicode token requires name';\n            var ERR_NO_DATA = 'Unicode token has no character data ';\n            var item = void 0;\n\n            for (var i = 0; i < data.length; ++i) {\n                item = data[i];\n                if (!item.name) {\n                    throw new Error(ERR_NO_NAME);\n                }\n                if (!(item.inverseOf || item.bmp || item.astral)) {\n                    throw new Error(ERR_NO_DATA + item.name);\n                }\n                unicode[normalize(item.name)] = item;\n                if (item.alias) {\n                    unicode[normalize(item.alias)] = item;\n                }\n            }\n\n            // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and\n            // flags might now produce different results\n            XRegExp.cache.flush('patterns');\n        };\n\n        /**\n         * @ignore\n         *\n         * Return a reference to the internal Unicode definition structure for the given Unicode\n         * Property if the given name is a legal Unicode Property for use in XRegExp `\\p` or `\\P` regex\n         * constructs.\n         *\n         * @memberOf XRegExp\n         * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),\n         *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode\n         *   Properties and Property Aliases.\n         * @returns {Object} Reference to definition structure when the name matches a Unicode Property.\n         *\n         * @note\n         * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.\n         *\n         * @note\n         * This method is *not* part of the officially documented API and may change or be removed in\n         * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode\n         * structures set up by XRegExp.\n         */\n        XRegExp._getUnicodeProperty = function (name) {\n            var slug = normalize(name);\n            return unicode[slug];\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeBase);\n\n    var unicodeBlocks = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Blocks 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,\n         * `\\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and\n         * underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'InAdlam',\n            astral: '\\uD83A[\\uDD00-\\uDD5F]'\n        }, {\n            name: 'InAegean_Numbers',\n            astral: '\\uD800[\\uDD00-\\uDD3F]'\n        }, {\n            name: 'InAhom',\n            astral: '\\uD805[\\uDF00-\\uDF3F]'\n        }, {\n            name: 'InAlchemical_Symbols',\n            astral: '\\uD83D[\\uDF00-\\uDF7F]'\n        }, {\n            name: 'InAlphabetic_Presentation_Forms',\n            bmp: '\\uFB00-\\uFB4F'\n        }, {\n            name: 'InAnatolian_Hieroglyphs',\n            astral: '\\uD811[\\uDC00-\\uDE7F]'\n        }, {\n            name: 'InAncient_Greek_Musical_Notation',\n            astral: '\\uD834[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InAncient_Greek_Numbers',\n            astral: '\\uD800[\\uDD40-\\uDD8F]'\n        }, {\n            name: 'InAncient_Symbols',\n            astral: '\\uD800[\\uDD90-\\uDDCF]'\n        }, {\n            name: 'InArabic',\n            bmp: '\\u0600-\\u06FF'\n        }, {\n            name: 'InArabic_Extended_A',\n            bmp: '\\u08A0-\\u08FF'\n        }, {\n            name: 'InArabic_Mathematical_Alphabetic_Symbols',\n            astral: '\\uD83B[\\uDE00-\\uDEFF]'\n        }, {\n            name: 'InArabic_Presentation_Forms_A',\n            bmp: '\\uFB50-\\uFDFF'\n        }, {\n            name: 'InArabic_Presentation_Forms_B',\n            bmp: '\\uFE70-\\uFEFF'\n        }, {\n            name: 'InArabic_Supplement',\n            bmp: '\\u0750-\\u077F'\n        }, {\n            name: 'InArmenian',\n            bmp: '\\u0530-\\u058F'\n        }, {\n            name: 'InArrows',\n            bmp: '\\u2190-\\u21FF'\n        }, {\n            name: 'InAvestan',\n            astral: '\\uD802[\\uDF00-\\uDF3F]'\n        }, {\n            name: 'InBalinese',\n            bmp: '\\u1B00-\\u1B7F'\n        }, {\n            name: 'InBamum',\n            bmp: '\\uA6A0-\\uA6FF'\n        }, {\n            name: 'InBamum_Supplement',\n            astral: '\\uD81A[\\uDC00-\\uDE3F]'\n        }, {\n            name: 'InBasic_Latin',\n            bmp: '\\0-\\x7F'\n        }, {\n            name: 'InBassa_Vah',\n            astral: '\\uD81A[\\uDED0-\\uDEFF]'\n        }, {\n            name: 'InBatak',\n            bmp: '\\u1BC0-\\u1BFF'\n        }, {\n            name: 'InBengali',\n            bmp: '\\u0980-\\u09FF'\n        }, {\n            name: 'InBhaiksuki',\n            astral: '\\uD807[\\uDC00-\\uDC6F]'\n        }, {\n            name: 'InBlock_Elements',\n            bmp: '\\u2580-\\u259F'\n        }, {\n            name: 'InBopomofo',\n            bmp: '\\u3100-\\u312F'\n        }, {\n            name: 'InBopomofo_Extended',\n            bmp: '\\u31A0-\\u31BF'\n        }, {\n            name: 'InBox_Drawing',\n            bmp: '\\u2500-\\u257F'\n        }, {\n            name: 'InBrahmi',\n            astral: '\\uD804[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InBraille_Patterns',\n            bmp: '\\u2800-\\u28FF'\n        }, {\n            name: 'InBuginese',\n            bmp: '\\u1A00-\\u1A1F'\n        }, {\n            name: 'InBuhid',\n            bmp: '\\u1740-\\u175F'\n        }, {\n            name: 'InByzantine_Musical_Symbols',\n            astral: '\\uD834[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InCJK_Compatibility',\n            bmp: '\\u3300-\\u33FF'\n        }, {\n            name: 'InCJK_Compatibility_Forms',\n            bmp: '\\uFE30-\\uFE4F'\n        }, {\n            name: 'InCJK_Compatibility_Ideographs',\n            bmp: '\\uF900-\\uFAFF'\n        }, {\n            name: 'InCJK_Compatibility_Ideographs_Supplement',\n            astral: '\\uD87E[\\uDC00-\\uDE1F]'\n        }, {\n            name: 'InCJK_Radicals_Supplement',\n            bmp: '\\u2E80-\\u2EFF'\n        }, {\n            name: 'InCJK_Strokes',\n            bmp: '\\u31C0-\\u31EF'\n        }, {\n            name: 'InCJK_Symbols_and_Punctuation',\n            bmp: '\\u3000-\\u303F'\n        }, {\n            name: 'InCJK_Unified_Ideographs',\n            bmp: '\\u4E00-\\u9FFF'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_A',\n            bmp: '\\u3400-\\u4DBF'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_B',\n            astral: '[\\uD840-\\uD868][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDEDF]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_C',\n            astral: '\\uD869[\\uDF00-\\uDFFF]|[\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF3F]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_D',\n            astral: '\\uD86D[\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1F]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_E',\n            astral: '\\uD86E[\\uDC20-\\uDFFF]|[\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD873[\\uDC00-\\uDEAF]'\n        }, {\n            name: 'InCarian',\n            astral: '\\uD800[\\uDEA0-\\uDEDF]'\n        }, {\n            name: 'InCaucasian_Albanian',\n            astral: '\\uD801[\\uDD30-\\uDD6F]'\n        }, {\n            name: 'InChakma',\n            astral: '\\uD804[\\uDD00-\\uDD4F]'\n        }, {\n            name: 'InCham',\n            bmp: '\\uAA00-\\uAA5F'\n        }, {\n            name: 'InCherokee',\n            bmp: '\\u13A0-\\u13FF'\n        }, {\n            name: 'InCherokee_Supplement',\n            bmp: '\\uAB70-\\uABBF'\n        }, {\n            name: 'InCombining_Diacritical_Marks',\n            bmp: '\\u0300-\\u036F'\n        }, {\n            name: 'InCombining_Diacritical_Marks_Extended',\n            bmp: '\\u1AB0-\\u1AFF'\n        }, {\n            name: 'InCombining_Diacritical_Marks_Supplement',\n            bmp: '\\u1DC0-\\u1DFF'\n        }, {\n            name: 'InCombining_Diacritical_Marks_for_Symbols',\n            bmp: '\\u20D0-\\u20FF'\n        }, {\n            name: 'InCombining_Half_Marks',\n            bmp: '\\uFE20-\\uFE2F'\n        }, {\n            name: 'InCommon_Indic_Number_Forms',\n            bmp: '\\uA830-\\uA83F'\n        }, {\n            name: 'InControl_Pictures',\n            bmp: '\\u2400-\\u243F'\n        }, {\n            name: 'InCoptic',\n            bmp: '\\u2C80-\\u2CFF'\n        }, {\n            name: 'InCoptic_Epact_Numbers',\n            astral: '\\uD800[\\uDEE0-\\uDEFF]'\n        }, {\n            name: 'InCounting_Rod_Numerals',\n            astral: '\\uD834[\\uDF60-\\uDF7F]'\n        }, {\n            name: 'InCuneiform',\n            astral: '\\uD808[\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InCuneiform_Numbers_and_Punctuation',\n            astral: '\\uD809[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InCurrency_Symbols',\n            bmp: '\\u20A0-\\u20CF'\n        }, {\n            name: 'InCypriot_Syllabary',\n            astral: '\\uD802[\\uDC00-\\uDC3F]'\n        }, {\n            name: 'InCyrillic',\n            bmp: '\\u0400-\\u04FF'\n        }, {\n            name: 'InCyrillic_Extended_A',\n            bmp: '\\u2DE0-\\u2DFF'\n        }, {\n            name: 'InCyrillic_Extended_B',\n            bmp: '\\uA640-\\uA69F'\n        }, {\n            name: 'InCyrillic_Extended_C',\n            bmp: '\\u1C80-\\u1C8F'\n        }, {\n            name: 'InCyrillic_Supplement',\n            bmp: '\\u0500-\\u052F'\n        }, {\n            name: 'InDeseret',\n            astral: '\\uD801[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'InDevanagari',\n            bmp: '\\u0900-\\u097F'\n        }, {\n            name: 'InDevanagari_Extended',\n            bmp: '\\uA8E0-\\uA8FF'\n        }, {\n            name: 'InDingbats',\n            bmp: '\\u2700-\\u27BF'\n        }, {\n            name: 'InDomino_Tiles',\n            astral: '\\uD83C[\\uDC30-\\uDC9F]'\n        }, {\n            name: 'InDuployan',\n            astral: '\\uD82F[\\uDC00-\\uDC9F]'\n        }, {\n            name: 'InEarly_Dynastic_Cuneiform',\n            astral: '\\uD809[\\uDC80-\\uDD4F]'\n        }, {\n            name: 'InEgyptian_Hieroglyphs',\n            astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InElbasan',\n            astral: '\\uD801[\\uDD00-\\uDD2F]'\n        }, {\n            name: 'InEmoticons',\n            astral: '\\uD83D[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InEnclosed_Alphanumeric_Supplement',\n            astral: '\\uD83C[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InEnclosed_Alphanumerics',\n            bmp: '\\u2460-\\u24FF'\n        }, {\n            name: 'InEnclosed_CJK_Letters_and_Months',\n            bmp: '\\u3200-\\u32FF'\n        }, {\n            name: 'InEnclosed_Ideographic_Supplement',\n            astral: '\\uD83C[\\uDE00-\\uDEFF]'\n        }, {\n            name: 'InEthiopic',\n            bmp: '\\u1200-\\u137F'\n        }, {\n            name: 'InEthiopic_Extended',\n            bmp: '\\u2D80-\\u2DDF'\n        }, {\n            name: 'InEthiopic_Extended_A',\n            bmp: '\\uAB00-\\uAB2F'\n        }, {\n            name: 'InEthiopic_Supplement',\n            bmp: '\\u1380-\\u139F'\n        }, {\n            name: 'InGeneral_Punctuation',\n            bmp: '\\u2000-\\u206F'\n        }, {\n            name: 'InGeometric_Shapes',\n            bmp: '\\u25A0-\\u25FF'\n        }, {\n            name: 'InGeometric_Shapes_Extended',\n            astral: '\\uD83D[\\uDF80-\\uDFFF]'\n        }, {\n            name: 'InGeorgian',\n            bmp: '\\u10A0-\\u10FF'\n        }, {\n            name: 'InGeorgian_Supplement',\n            bmp: '\\u2D00-\\u2D2F'\n        }, {\n            name: 'InGlagolitic',\n            bmp: '\\u2C00-\\u2C5F'\n        }, {\n            name: 'InGlagolitic_Supplement',\n            astral: '\\uD838[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InGothic',\n            astral: '\\uD800[\\uDF30-\\uDF4F]'\n        }, {\n            name: 'InGrantha',\n            astral: '\\uD804[\\uDF00-\\uDF7F]'\n        }, {\n            name: 'InGreek_Extended',\n            bmp: '\\u1F00-\\u1FFF'\n        }, {\n            name: 'InGreek_and_Coptic',\n            bmp: '\\u0370-\\u03FF'\n        }, {\n            name: 'InGujarati',\n            bmp: '\\u0A80-\\u0AFF'\n        }, {\n            name: 'InGurmukhi',\n            bmp: '\\u0A00-\\u0A7F'\n        }, {\n            name: 'InHalfwidth_and_Fullwidth_Forms',\n            bmp: '\\uFF00-\\uFFEF'\n        }, {\n            name: 'InHangul_Compatibility_Jamo',\n            bmp: '\\u3130-\\u318F'\n        }, {\n            name: 'InHangul_Jamo',\n            bmp: '\\u1100-\\u11FF'\n        }, {\n            name: 'InHangul_Jamo_Extended_A',\n            bmp: '\\uA960-\\uA97F'\n        }, {\n            name: 'InHangul_Jamo_Extended_B',\n            bmp: '\\uD7B0-\\uD7FF'\n        }, {\n            name: 'InHangul_Syllables',\n            bmp: '\\uAC00-\\uD7AF'\n        }, {\n            name: 'InHanunoo',\n            bmp: '\\u1720-\\u173F'\n        }, {\n            name: 'InHatran',\n            astral: '\\uD802[\\uDCE0-\\uDCFF]'\n        }, {\n            name: 'InHebrew',\n            bmp: '\\u0590-\\u05FF'\n        }, {\n            name: 'InHigh_Private_Use_Surrogates',\n            bmp: '\\uDB80-\\uDBFF'\n        }, {\n            name: 'InHigh_Surrogates',\n            bmp: '\\uD800-\\uDB7F'\n        }, {\n            name: 'InHiragana',\n            bmp: '\\u3040-\\u309F'\n        }, {\n            name: 'InIPA_Extensions',\n            bmp: '\\u0250-\\u02AF'\n        }, {\n            name: 'InIdeographic_Description_Characters',\n            bmp: '\\u2FF0-\\u2FFF'\n        }, {\n            name: 'InIdeographic_Symbols_and_Punctuation',\n            astral: '\\uD81B[\\uDFE0-\\uDFFF]'\n        }, {\n            name: 'InImperial_Aramaic',\n            astral: '\\uD802[\\uDC40-\\uDC5F]'\n        }, {\n            name: 'InInscriptional_Pahlavi',\n            astral: '\\uD802[\\uDF60-\\uDF7F]'\n        }, {\n            name: 'InInscriptional_Parthian',\n            astral: '\\uD802[\\uDF40-\\uDF5F]'\n        }, {\n            name: 'InJavanese',\n            bmp: '\\uA980-\\uA9DF'\n        }, {\n            name: 'InKaithi',\n            astral: '\\uD804[\\uDC80-\\uDCCF]'\n        }, {\n            name: 'InKana_Supplement',\n            astral: '\\uD82C[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InKanbun',\n            bmp: '\\u3190-\\u319F'\n        }, {\n            name: 'InKangxi_Radicals',\n            bmp: '\\u2F00-\\u2FDF'\n        }, {\n            name: 'InKannada',\n            bmp: '\\u0C80-\\u0CFF'\n        }, {\n            name: 'InKatakana',\n            bmp: '\\u30A0-\\u30FF'\n        }, {\n            name: 'InKatakana_Phonetic_Extensions',\n            bmp: '\\u31F0-\\u31FF'\n        }, {\n            name: 'InKayah_Li',\n            bmp: '\\uA900-\\uA92F'\n        }, {\n            name: 'InKharoshthi',\n            astral: '\\uD802[\\uDE00-\\uDE5F]'\n        }, {\n            name: 'InKhmer',\n            bmp: '\\u1780-\\u17FF'\n        }, {\n            name: 'InKhmer_Symbols',\n            bmp: '\\u19E0-\\u19FF'\n        }, {\n            name: 'InKhojki',\n            astral: '\\uD804[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InKhudawadi',\n            astral: '\\uD804[\\uDEB0-\\uDEFF]'\n        }, {\n            name: 'InLao',\n            bmp: '\\u0E80-\\u0EFF'\n        }, {\n            name: 'InLatin_Extended_Additional',\n            bmp: '\\u1E00-\\u1EFF'\n        }, {\n            name: 'InLatin_Extended_A',\n            bmp: '\\u0100-\\u017F'\n        }, {\n            name: 'InLatin_Extended_B',\n            bmp: '\\u0180-\\u024F'\n        }, {\n            name: 'InLatin_Extended_C',\n            bmp: '\\u2C60-\\u2C7F'\n        }, {\n            name: 'InLatin_Extended_D',\n            bmp: '\\uA720-\\uA7FF'\n        }, {\n            name: 'InLatin_Extended_E',\n            bmp: '\\uAB30-\\uAB6F'\n        }, {\n            name: 'InLatin_1_Supplement',\n            bmp: '\\x80-\\xFF'\n        }, {\n            name: 'InLepcha',\n            bmp: '\\u1C00-\\u1C4F'\n        }, {\n            name: 'InLetterlike_Symbols',\n            bmp: '\\u2100-\\u214F'\n        }, {\n            name: 'InLimbu',\n            bmp: '\\u1900-\\u194F'\n        }, {\n            name: 'InLinear_A',\n            astral: '\\uD801[\\uDE00-\\uDF7F]'\n        }, {\n            name: 'InLinear_B_Ideograms',\n            astral: '\\uD800[\\uDC80-\\uDCFF]'\n        }, {\n            name: 'InLinear_B_Syllabary',\n            astral: '\\uD800[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InLisu',\n            bmp: '\\uA4D0-\\uA4FF'\n        }, {\n            name: 'InLow_Surrogates',\n            bmp: '\\uDC00-\\uDFFF'\n        }, {\n            name: 'InLycian',\n            astral: '\\uD800[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'InLydian',\n            astral: '\\uD802[\\uDD20-\\uDD3F]'\n        }, {\n            name: 'InMahajani',\n            astral: '\\uD804[\\uDD50-\\uDD7F]'\n        }, {\n            name: 'InMahjong_Tiles',\n            astral: '\\uD83C[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InMalayalam',\n            bmp: '\\u0D00-\\u0D7F'\n        }, {\n            name: 'InMandaic',\n            bmp: '\\u0840-\\u085F'\n        }, {\n            name: 'InManichaean',\n            astral: '\\uD802[\\uDEC0-\\uDEFF]'\n        }, {\n            name: 'InMarchen',\n            astral: '\\uD807[\\uDC70-\\uDCBF]'\n        }, {\n            name: 'InMathematical_Alphanumeric_Symbols',\n            astral: '\\uD835[\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InMathematical_Operators',\n            bmp: '\\u2200-\\u22FF'\n        }, {\n            name: 'InMeetei_Mayek',\n            bmp: '\\uABC0-\\uABFF'\n        }, {\n            name: 'InMeetei_Mayek_Extensions',\n            bmp: '\\uAAE0-\\uAAFF'\n        }, {\n            name: 'InMende_Kikakui',\n            astral: '\\uD83A[\\uDC00-\\uDCDF]'\n        }, {\n            name: 'InMeroitic_Cursive',\n            astral: '\\uD802[\\uDDA0-\\uDDFF]'\n        }, {\n            name: 'InMeroitic_Hieroglyphs',\n            astral: '\\uD802[\\uDD80-\\uDD9F]'\n        }, {\n            name: 'InMiao',\n            astral: '\\uD81B[\\uDF00-\\uDF9F]'\n        }, {\n            name: 'InMiscellaneous_Mathematical_Symbols_A',\n            bmp: '\\u27C0-\\u27EF'\n        }, {\n            name: 'InMiscellaneous_Mathematical_Symbols_B',\n            bmp: '\\u2980-\\u29FF'\n        }, {\n            name: 'InMiscellaneous_Symbols',\n            bmp: '\\u2600-\\u26FF'\n        }, {\n            name: 'InMiscellaneous_Symbols_and_Arrows',\n            bmp: '\\u2B00-\\u2BFF'\n        }, {\n            name: 'InMiscellaneous_Symbols_and_Pictographs',\n            astral: '\\uD83C[\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDDFF]'\n        }, {\n            name: 'InMiscellaneous_Technical',\n            bmp: '\\u2300-\\u23FF'\n        }, {\n            name: 'InModi',\n            astral: '\\uD805[\\uDE00-\\uDE5F]'\n        }, {\n            name: 'InModifier_Tone_Letters',\n            bmp: '\\uA700-\\uA71F'\n        }, {\n            name: 'InMongolian',\n            bmp: '\\u1800-\\u18AF'\n        }, {\n            name: 'InMongolian_Supplement',\n            astral: '\\uD805[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InMro',\n            astral: '\\uD81A[\\uDE40-\\uDE6F]'\n        }, {\n            name: 'InMultani',\n            astral: '\\uD804[\\uDE80-\\uDEAF]'\n        }, {\n            name: 'InMusical_Symbols',\n            astral: '\\uD834[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InMyanmar',\n            bmp: '\\u1000-\\u109F'\n        }, {\n            name: 'InMyanmar_Extended_A',\n            bmp: '\\uAA60-\\uAA7F'\n        }, {\n            name: 'InMyanmar_Extended_B',\n            bmp: '\\uA9E0-\\uA9FF'\n        }, {\n            name: 'InNKo',\n            bmp: '\\u07C0-\\u07FF'\n        }, {\n            name: 'InNabataean',\n            astral: '\\uD802[\\uDC80-\\uDCAF]'\n        }, {\n            name: 'InNew_Tai_Lue',\n            bmp: '\\u1980-\\u19DF'\n        }, {\n            name: 'InNewa',\n            astral: '\\uD805[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InNumber_Forms',\n            bmp: '\\u2150-\\u218F'\n        }, {\n            name: 'InOgham',\n            bmp: '\\u1680-\\u169F'\n        }, {\n            name: 'InOl_Chiki',\n            bmp: '\\u1C50-\\u1C7F'\n        }, {\n            name: 'InOld_Hungarian',\n            astral: '\\uD803[\\uDC80-\\uDCFF]'\n        }, {\n            name: 'InOld_Italic',\n            astral: '\\uD800[\\uDF00-\\uDF2F]'\n        }, {\n            name: 'InOld_North_Arabian',\n            astral: '\\uD802[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'InOld_Permic',\n            astral: '\\uD800[\\uDF50-\\uDF7F]'\n        }, {\n            name: 'InOld_Persian',\n            astral: '\\uD800[\\uDFA0-\\uDFDF]'\n        }, {\n            name: 'InOld_South_Arabian',\n            astral: '\\uD802[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InOld_Turkic',\n            astral: '\\uD803[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'InOptical_Character_Recognition',\n            bmp: '\\u2440-\\u245F'\n        }, {\n            name: 'InOriya',\n            bmp: '\\u0B00-\\u0B7F'\n        }, {\n            name: 'InOrnamental_Dingbats',\n            astral: '\\uD83D[\\uDE50-\\uDE7F]'\n        }, {\n            name: 'InOsage',\n            astral: '\\uD801[\\uDCB0-\\uDCFF]'\n        }, {\n            name: 'InOsmanya',\n            astral: '\\uD801[\\uDC80-\\uDCAF]'\n        }, {\n            name: 'InPahawh_Hmong',\n            astral: '\\uD81A[\\uDF00-\\uDF8F]'\n        }, {\n            name: 'InPalmyrene',\n            astral: '\\uD802[\\uDC60-\\uDC7F]'\n        }, {\n            name: 'InPau_Cin_Hau',\n            astral: '\\uD806[\\uDEC0-\\uDEFF]'\n        }, {\n            name: 'InPhags_pa',\n            bmp: '\\uA840-\\uA87F'\n        }, {\n            name: 'InPhaistos_Disc',\n            astral: '\\uD800[\\uDDD0-\\uDDFF]'\n        }, {\n            name: 'InPhoenician',\n            astral: '\\uD802[\\uDD00-\\uDD1F]'\n        }, {\n            name: 'InPhonetic_Extensions',\n            bmp: '\\u1D00-\\u1D7F'\n        }, {\n            name: 'InPhonetic_Extensions_Supplement',\n            bmp: '\\u1D80-\\u1DBF'\n        }, {\n            name: 'InPlaying_Cards',\n            astral: '\\uD83C[\\uDCA0-\\uDCFF]'\n        }, {\n            name: 'InPrivate_Use_Area',\n            bmp: '\\uE000-\\uF8FF'\n        }, {\n            name: 'InPsalter_Pahlavi',\n            astral: '\\uD802[\\uDF80-\\uDFAF]'\n        }, {\n            name: 'InRejang',\n            bmp: '\\uA930-\\uA95F'\n        }, {\n            name: 'InRumi_Numeral_Symbols',\n            astral: '\\uD803[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InRunic',\n            bmp: '\\u16A0-\\u16FF'\n        }, {\n            name: 'InSamaritan',\n            bmp: '\\u0800-\\u083F'\n        }, {\n            name: 'InSaurashtra',\n            bmp: '\\uA880-\\uA8DF'\n        }, {\n            name: 'InSharada',\n            astral: '\\uD804[\\uDD80-\\uDDDF]'\n        }, {\n            name: 'InShavian',\n            astral: '\\uD801[\\uDC50-\\uDC7F]'\n        }, {\n            name: 'InShorthand_Format_Controls',\n            astral: '\\uD82F[\\uDCA0-\\uDCAF]'\n        }, {\n            name: 'InSiddham',\n            astral: '\\uD805[\\uDD80-\\uDDFF]'\n        }, {\n            name: 'InSinhala',\n            bmp: '\\u0D80-\\u0DFF'\n        }, {\n            name: 'InSinhala_Archaic_Numbers',\n            astral: '\\uD804[\\uDDE0-\\uDDFF]'\n        }, {\n            name: 'InSmall_Form_Variants',\n            bmp: '\\uFE50-\\uFE6F'\n        }, {\n            name: 'InSora_Sompeng',\n            astral: '\\uD804[\\uDCD0-\\uDCFF]'\n        }, {\n            name: 'InSpacing_Modifier_Letters',\n            bmp: '\\u02B0-\\u02FF'\n        }, {\n            name: 'InSpecials',\n            bmp: '\\uFFF0-\\uFFFF'\n        }, {\n            name: 'InSundanese',\n            bmp: '\\u1B80-\\u1BBF'\n        }, {\n            name: 'InSundanese_Supplement',\n            bmp: '\\u1CC0-\\u1CCF'\n        }, {\n            name: 'InSuperscripts_and_Subscripts',\n            bmp: '\\u2070-\\u209F'\n        }, {\n            name: 'InSupplemental_Arrows_A',\n            bmp: '\\u27F0-\\u27FF'\n        }, {\n            name: 'InSupplemental_Arrows_B',\n            bmp: '\\u2900-\\u297F'\n        }, {\n            name: 'InSupplemental_Arrows_C',\n            astral: '\\uD83E[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InSupplemental_Mathematical_Operators',\n            bmp: '\\u2A00-\\u2AFF'\n        }, {\n            name: 'InSupplemental_Punctuation',\n            bmp: '\\u2E00-\\u2E7F'\n        }, {\n            name: 'InSupplemental_Symbols_and_Pictographs',\n            astral: '\\uD83E[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InSupplementary_Private_Use_Area_A',\n            astral: '[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InSupplementary_Private_Use_Area_B',\n            astral: '[\\uDBC0-\\uDBFF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InSutton_SignWriting',\n            astral: '\\uD836[\\uDC00-\\uDEAF]'\n        }, {\n            name: 'InSyloti_Nagri',\n            bmp: '\\uA800-\\uA82F'\n        }, {\n            name: 'InSyriac',\n            bmp: '\\u0700-\\u074F'\n        }, {\n            name: 'InTagalog',\n            bmp: '\\u1700-\\u171F'\n        }, {\n            name: 'InTagbanwa',\n            bmp: '\\u1760-\\u177F'\n        }, {\n            name: 'InTags',\n            astral: '\\uDB40[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InTai_Le',\n            bmp: '\\u1950-\\u197F'\n        }, {\n            name: 'InTai_Tham',\n            bmp: '\\u1A20-\\u1AAF'\n        }, {\n            name: 'InTai_Viet',\n            bmp: '\\uAA80-\\uAADF'\n        }, {\n            name: 'InTai_Xuan_Jing_Symbols',\n            astral: '\\uD834[\\uDF00-\\uDF5F]'\n        }, {\n            name: 'InTakri',\n            astral: '\\uD805[\\uDE80-\\uDECF]'\n        }, {\n            name: 'InTamil',\n            bmp: '\\u0B80-\\u0BFF'\n        }, {\n            name: 'InTangut',\n            astral: '[\\uD81C-\\uD821][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InTangut_Components',\n            astral: '\\uD822[\\uDC00-\\uDEFF]'\n        }, {\n            name: 'InTelugu',\n            bmp: '\\u0C00-\\u0C7F'\n        }, {\n            name: 'InThaana',\n            bmp: '\\u0780-\\u07BF'\n        }, {\n            name: 'InThai',\n            bmp: '\\u0E00-\\u0E7F'\n        }, {\n            name: 'InTibetan',\n            bmp: '\\u0F00-\\u0FFF'\n        }, {\n            name: 'InTifinagh',\n            bmp: '\\u2D30-\\u2D7F'\n        }, {\n            name: 'InTirhuta',\n            astral: '\\uD805[\\uDC80-\\uDCDF]'\n        }, {\n            name: 'InTransport_and_Map_Symbols',\n            astral: '\\uD83D[\\uDE80-\\uDEFF]'\n        }, {\n            name: 'InUgaritic',\n            astral: '\\uD800[\\uDF80-\\uDF9F]'\n        }, {\n            name: 'InUnified_Canadian_Aboriginal_Syllabics',\n            bmp: '\\u1400-\\u167F'\n        }, {\n            name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended',\n            bmp: '\\u18B0-\\u18FF'\n        }, {\n            name: 'InVai',\n            bmp: '\\uA500-\\uA63F'\n        }, {\n            name: 'InVariation_Selectors',\n            bmp: '\\uFE00-\\uFE0F'\n        }, {\n            name: 'InVariation_Selectors_Supplement',\n            astral: '\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'InVedic_Extensions',\n            bmp: '\\u1CD0-\\u1CFF'\n        }, {\n            name: 'InVertical_Forms',\n            bmp: '\\uFE10-\\uFE1F'\n        }, {\n            name: 'InWarang_Citi',\n            astral: '\\uD806[\\uDCA0-\\uDCFF]'\n        }, {\n            name: 'InYi_Radicals',\n            bmp: '\\uA490-\\uA4CF'\n        }, {\n            name: 'InYi_Syllables',\n            bmp: '\\uA000-\\uA48F'\n        }, {\n            name: 'InYijing_Hexagram_Symbols',\n            bmp: '\\u4DC0-\\u4DFF'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeBlocks);\n\n    var unicodeCategories = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Categories 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for Unicode's general categories. E.g., `\\p{Lu}` or `\\p{Uppercase Letter}`. See\n         * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token\n         * names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'C',\n            alias: 'Other',\n            isBmpLast: true,\n            bmp: '\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u08E2\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180E\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',\n            astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCBD\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA0-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDD73-\\uDD7A\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]'\n        }, {\n            name: 'Cc',\n            alias: 'Control',\n            bmp: '\\0-\\x1F\\x7F-\\x9F'\n        }, {\n            name: 'Cf',\n            alias: 'Format',\n            bmp: '\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB',\n            astral: '\\uD804\\uDCBD|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n        }, {\n            name: 'Cn',\n            alias: 'Unassigned',\n            bmp: '\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u05FF\\u061D\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF',\n            astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n        }, {\n            name: 'Co',\n            alias: 'Private_Use',\n            bmp: '\\uE000-\\uF8FF',\n            astral: '[\\uDB80-\\uDBBE\\uDBC0-\\uDBFE][\\uDC00-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDC00-\\uDFFD]'\n        }, {\n            name: 'Cs',\n            alias: 'Surrogate',\n            bmp: '\\uD800-\\uDFFF'\n        }, {\n            name: 'L',\n            alias: 'Letter',\n            bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Ll',\n            alias: 'Lowercase_Letter',\n            bmp: 'a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n            astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n        }, {\n            name: 'Lm',\n            alias: 'Modifier_Letter',\n            bmp: '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E\\uFF9F',\n            astral: '\\uD81A[\\uDF40-\\uDF43]|\\uD81B[\\uDF93-\\uDF9F\\uDFE0]'\n        }, {\n            name: 'Lo',\n            alias: 'Other_Letter',\n            bmp: '\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC50-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Lt',\n            alias: 'Titlecase_Letter',\n            bmp: '\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC'\n        }, {\n            name: 'Lu',\n            alias: 'Uppercase_Letter',\n            bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n            astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]'\n        }, {\n            name: 'M',\n            alias: 'Mark',\n            bmp: '\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n            astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDDCA-\\uDDCC\\uDE2C-\\uDE37\\uDE3E\\uDEDF-\\uDEEA\\uDF00-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC35-\\uDC46\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDDDC\\uDDDD\\uDE30-\\uDE40\\uDEAB-\\uDEB7\\uDF1D-\\uDF2B]|\\uD807[\\uDC2F-\\uDC36\\uDC38-\\uDC3F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'Mc',\n            alias: 'Spacing_Mark',\n            bmp: '\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\u1CF3\\u302E\\u302F\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC',\n            astral: '\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3E\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB0-\\uDCB2\\uDCB9\\uDCBB-\\uDCBE\\uDCC1\\uDDAF-\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF20\\uDF21\\uDF26]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4]|\\uD81B[\\uDF51-\\uDF7E]|\\uD834[\\uDD65\\uDD66\\uDD6D-\\uDD72]'\n        }, {\n            name: 'Me',\n            alias: 'Enclosing_Mark',\n            bmp: '\\u0488\\u0489\\u1ABE\\u20DD-\\u20E0\\u20E2-\\u20E4\\uA670-\\uA672'\n        }, {\n            name: 'Mn',\n            alias: 'Nonspacing_Mark',\n            bmp: '\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D01\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n            astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDCA-\\uDDCC\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3C\\uDF40\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDCB3-\\uDCB8\\uDCBA\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'N',\n            alias: 'Number',\n            bmp: '0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n            astral: '\\uD800[\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD801[\\uDCA0-\\uDCA9]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDDE1-\\uDDF4\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF3B]|\\uD806[\\uDCE0-\\uDCF2]|\\uD807[\\uDC50-\\uDC6C]|\\uD809[\\uDC00-\\uDC6E]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDCC7-\\uDCCF\\uDD50-\\uDD59]|\\uD83C[\\uDD00-\\uDD0C]'\n        }, {\n            name: 'Nd',\n            alias: 'Decimal_Number',\n            bmp: '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n            astral: '\\uD801[\\uDCA0-\\uDCA9]|\\uD804[\\uDC66-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF39]|\\uD806[\\uDCE0-\\uDCE9]|\\uD807[\\uDC50-\\uDC59]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDD50-\\uDD59]'\n        }, {\n            name: 'Nl',\n            alias: 'Letter_Number',\n            bmp: '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',\n            astral: '\\uD800[\\uDD40-\\uDD74\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD809[\\uDC00-\\uDC6E]'\n        }, {\n            name: 'No',\n            alias: 'Other_Number',\n            bmp: '\\xB2\\xB3\\xB9\\xBC-\\xBE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',\n            astral: '\\uD800[\\uDD07-\\uDD33\\uDD75-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC65\\uDDE1-\\uDDF4]|\\uD805[\\uDF3A\\uDF3B]|\\uD806[\\uDCEA-\\uDCF2]|\\uD807[\\uDC5A-\\uDC6C]|\\uD81A[\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD83A[\\uDCC7-\\uDCCF]|\\uD83C[\\uDD00-\\uDD0C]'\n        }, {\n            name: 'P',\n            alias: 'Punctuation',\n            bmp: '\\x21-\\x23\\x25-\\\\x2A\\x2C-\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5B-\\\\x5D\\x5F\\\\x7B\\x7D\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E44\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Pc',\n            alias: 'Connector_Punctuation',\n            bmp: '\\x5F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F'\n        }, {\n            name: 'Pd',\n            alias: 'Dash_Punctuation',\n            bmp: '\\\\x2D\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D'\n        }, {\n            name: 'Pe',\n            alias: 'Close_Punctuation',\n            bmp: '\\\\x29\\\\x5D\\x7D\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63'\n        }, {\n            name: 'Pf',\n            alias: 'Final_Punctuation',\n            bmp: '\\xBB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21'\n        }, {\n            name: 'Pi',\n            alias: 'Initial_Punctuation',\n            bmp: '\\xAB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20'\n        }, {\n            name: 'Po',\n            alias: 'Other_Punctuation',\n            bmp: '\\x21-\\x23\\x25-\\x27\\\\x2A\\x2C\\\\x2E\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5C\\xA1\\xA7\\xB6\\xB7\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166D\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43\\u2E44\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Ps',\n            alias: 'Open_Punctuation',\n            bmp: '\\\\x28\\\\x5B\\\\x7B\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62'\n        }, {\n            name: 'S',\n            alias: 'Symbol',\n            bmp: '\\\\x24\\\\x2B\\x3C-\\x3E\\\\x5E\\x60\\\\x7C\\x7E\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20BE\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uFB29\\uFBB2-\\uFBC1\\uFDFC\\uFDFD\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',\n            astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83B[\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n        }, {\n            name: 'Sc',\n            alias: 'Currency_Symbol',\n            bmp: '\\\\x24\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BE\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6'\n        }, {\n            name: 'Sk',\n            alias: 'Modifier_Symbol',\n            bmp: '\\\\x5E\\x60\\xA8\\xAF\\xB4\\xB8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uFBB2-\\uFBC1\\uFF3E\\uFF40\\uFFE3',\n            astral: '\\uD83C[\\uDFFB-\\uDFFF]'\n        }, {\n            name: 'Sm',\n            alias: 'Math_Symbol',\n            bmp: '\\\\x2B\\x3C-\\x3E\\\\x7C\\x7E\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',\n            astral: '\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD83B[\\uDEF0\\uDEF1]'\n        }, {\n            name: 'So',\n            alias: 'Other_Symbol',\n            bmp: '\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',\n            astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFA]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n        }, {\n            name: 'Z',\n            alias: 'Separator',\n            bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n        }, {\n            name: 'Zl',\n            alias: 'Line_Separator',\n            bmp: '\\u2028'\n        }, {\n            name: 'Zp',\n            alias: 'Paragraph_Separator',\n            bmp: '\\u2029'\n        }, {\n            name: 'Zs',\n            alias: 'Space_Separator',\n            bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeCategories);\n\n    var unicodeProperties = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Properties 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2012-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See\n         * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from\n         * UAX #44 <http://unicode.org/reports/tr44/>:\n         *\n         * - Alphabetic\n         *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +\n         *   Lo + Nl + Other_Alphabetic.\n         *\n         * - Default_Ignorable_Code_Point\n         *   For programmatic determination of default ignorable code points. New characters that should\n         *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,\n         *   permitting programs to correctly handle the default rendering of such characters when not\n         *   otherwise supported.\n         *\n         * - Lowercase\n         *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.\n         *\n         * - Noncharacter_Code_Point\n         *   Code points permanently reserved for internal use.\n         *\n         * - Uppercase\n         *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.\n         *\n         * - White_Space\n         *   Spaces, separator characters and other control characters which should be treated by\n         *   programming languages as \"white space\" for the purpose of parsing elements.\n         *\n         * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS\n         * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are\n         * included in XRegExp's Unicode Categories and Unicode Scripts addons.\n         *\n         * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');\n        }\n\n        var unicodeData = [{\n            name: 'ASCII',\n            bmp: '\\0-\\x7F'\n        }, {\n            name: 'Alphabetic',\n            bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0345\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05B0-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0657\\u0659-\\u065F\\u066E-\\u06D3\\u06D5-\\u06DC\\u06E1-\\u06E8\\u06ED-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710-\\u073F\\u074D-\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0817\\u081A-\\u082C\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08DF\\u08E3-\\u08E9\\u08F0-\\u093B\\u093D-\\u094C\\u094E-\\u0950\\u0955-\\u0963\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD-\\u09C4\\u09C7\\u09C8\\u09CB\\u09CC\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09F0\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A70-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB\\u0ACC\\u0AD0\\u0AE0-\\u0AE3\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D-\\u0B44\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD0\\u0BD7\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4C\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCC\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E46\\u0E4D\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ECD\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F81\\u0F88-\\u0F97\\u0F99-\\u0FBC\\u1000-\\u1036\\u1038\\u103B-\\u103F\\u1050-\\u1062\\u1065-\\u1068\\u106E-\\u1086\\u108E\\u109C\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1713\\u1720-\\u1733\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17B3\\u17B6-\\u17C8\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u1938\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A61-\\u1A74\\u1AA7\\u1B00-\\u1B33\\u1B35-\\u1B43\\u1B45-\\u1B4B\\u1B80-\\u1BA9\\u1BAC-\\u1BAF\\u1BBA-\\u1BE5\\u1BE7-\\u1BF1\\u1C00-\\u1C35\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1DE7-\\u1DF4\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u24B6-\\u24E9\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA674-\\uA67B\\uA67F-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA827\\uA840-\\uA873\\uA880-\\uA8C3\\uA8C5\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA92A\\uA930-\\uA952\\uA960-\\uA97C\\uA980-\\uA9B2\\uA9B4-\\uA9BF\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAABE\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF5\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC45\\uDC82-\\uDCB8\\uDCD0-\\uDCE8\\uDD00-\\uDD32\\uDD50-\\uDD72\\uDD76\\uDD80-\\uDDBF\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE34\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEE8\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D-\\uDF44\\uDF47\\uDF48\\uDF4B\\uDF4C\\uDF50\\uDF57\\uDF5D-\\uDF63]|\\uD805[\\uDC00-\\uDC41\\uDC43-\\uDC45\\uDC47-\\uDC4A\\uDC80-\\uDCC1\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDB5\\uDDB8-\\uDDBE\\uDDD8-\\uDDDD\\uDE00-\\uDE3E\\uDE40\\uDE44\\uDE80-\\uDEB5\\uDF00-\\uDF19\\uDF1D-\\uDF2A]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC3E\\uDC40\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9E]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD47]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Any',\n            isBmpLast: true,\n            bmp: '\\0-\\uFFFF',\n            astral: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'Default_Ignorable_Code_Point',\n            bmp: '\\xAD\\u034F\\u061C\\u115F\\u1160\\u17B4\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8',\n            astral: '\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|[\\uDB40-\\uDB43][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'Lowercase',\n            bmp: 'a-z\\xAA\\xB5\\xBA\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02B8\\u02C0\\u02C1\\u02E0-\\u02E4\\u0345\\u0371\\u0373\\u0377\\u037A-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1DBF\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u2090-\\u209C\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2170-\\u217F\\u2184\\u24D0-\\u24E9\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7D\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B-\\uA69D\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7F8-\\uA7FA\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n            astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n        }, {\n            name: 'Noncharacter_Code_Point',\n            bmp: '\\uFDD0-\\uFDEF\\uFFFE\\uFFFF',\n            astral: '[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n        }, {\n            name: 'Uppercase',\n            bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n            astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]'\n        }, {\n            name: 'White_Space',\n            bmp: '\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n        }];\n\n        // Add non-generated data\n        unicodeData.push({\n            name: 'Assigned',\n            // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode\n            // Categories addon is required to use this property\n            inverseOf: 'Cn'\n        });\n\n        XRegExp.addUnicodeData(unicodeData);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeProperties);\n\n    var unicodeScripts = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Scripts 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for all Unicode scripts. E.g., `\\p{Latin}`. Token names are case insensitive,\n         * and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'Adlam',\n            astral: '\\uD83A[\\uDD00-\\uDD4A\\uDD50-\\uDD59\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Ahom',\n            astral: '\\uD805[\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF3F]'\n        }, {\n            name: 'Anatolian_Hieroglyphs',\n            astral: '\\uD811[\\uDC00-\\uDE46]'\n        }, {\n            name: 'Arabic',\n            bmp: '\\u0600-\\u0604\\u0606-\\u060B\\u060D-\\u061A\\u061E\\u0620-\\u063F\\u0641-\\u064A\\u0656-\\u066F\\u0671-\\u06DC\\u06DE-\\u06FF\\u0750-\\u077F\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u08FF\\uFB50-\\uFBC1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFD\\uFE70-\\uFE74\\uFE76-\\uFEFC',\n            astral: '\\uD803[\\uDE60-\\uDE7E]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB\\uDEF0\\uDEF1]'\n        }, {\n            name: 'Armenian',\n            bmp: '\\u0531-\\u0556\\u0559-\\u055F\\u0561-\\u0587\\u058A\\u058D-\\u058F\\uFB13-\\uFB17'\n        }, {\n            name: 'Avestan',\n            astral: '\\uD802[\\uDF00-\\uDF35\\uDF39-\\uDF3F]'\n        }, {\n            name: 'Balinese',\n            bmp: '\\u1B00-\\u1B4B\\u1B50-\\u1B7C'\n        }, {\n            name: 'Bamum',\n            bmp: '\\uA6A0-\\uA6F7',\n            astral: '\\uD81A[\\uDC00-\\uDE38]'\n        }, {\n            name: 'Bassa_Vah',\n            astral: '\\uD81A[\\uDED0-\\uDEED\\uDEF0-\\uDEF5]'\n        }, {\n            name: 'Batak',\n            bmp: '\\u1BC0-\\u1BF3\\u1BFC-\\u1BFF'\n        }, {\n            name: 'Bengali',\n            bmp: '\\u0980-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FB'\n        }, {\n            name: 'Bhaiksuki',\n            astral: '\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC45\\uDC50-\\uDC6C]'\n        }, {\n            name: 'Bopomofo',\n            bmp: '\\u02EA\\u02EB\\u3105-\\u312D\\u31A0-\\u31BA'\n        }, {\n            name: 'Brahmi',\n            astral: '\\uD804[\\uDC00-\\uDC4D\\uDC52-\\uDC6F\\uDC7F]'\n        }, {\n            name: 'Braille',\n            bmp: '\\u2800-\\u28FF'\n        }, {\n            name: 'Buginese',\n            bmp: '\\u1A00-\\u1A1B\\u1A1E\\u1A1F'\n        }, {\n            name: 'Buhid',\n            bmp: '\\u1740-\\u1753'\n        }, {\n            name: 'Canadian_Aboriginal',\n            bmp: '\\u1400-\\u167F\\u18B0-\\u18F5'\n        }, {\n            name: 'Carian',\n            astral: '\\uD800[\\uDEA0-\\uDED0]'\n        }, {\n            name: 'Caucasian_Albanian',\n            astral: '\\uD801[\\uDD30-\\uDD63\\uDD6F]'\n        }, {\n            name: 'Chakma',\n            astral: '\\uD804[\\uDD00-\\uDD34\\uDD36-\\uDD43]'\n        }, {\n            name: 'Cham',\n            bmp: '\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA5C-\\uAA5F'\n        }, {\n            name: 'Cherokee',\n            bmp: '\\u13A0-\\u13F5\\u13F8-\\u13FD\\uAB70-\\uABBF'\n        }, {\n            name: 'Common',\n            bmp: '\\0-\\x40\\\\x5B-\\x60\\\\x7B-\\xA9\\xAB-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02B9-\\u02DF\\u02E5-\\u02E9\\u02EC-\\u02FF\\u0374\\u037E\\u0385\\u0387\\u0589\\u0605\\u060C\\u061B\\u061C\\u061F\\u0640\\u06DD\\u08E2\\u0964\\u0965\\u0E3F\\u0FD5-\\u0FD8\\u10FB\\u16EB-\\u16ED\\u1735\\u1736\\u1802\\u1803\\u1805\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u2000-\\u200B\\u200E-\\u2064\\u2066-\\u2070\\u2074-\\u207E\\u2080-\\u208E\\u20A0-\\u20BE\\u2100-\\u2125\\u2127-\\u2129\\u212C-\\u2131\\u2133-\\u214D\\u214F-\\u215F\\u2189-\\u218B\\u2190-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u2460-\\u27FF\\u2900-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2E00-\\u2E44\\u2FF0-\\u2FFB\\u3000-\\u3004\\u3006\\u3008-\\u3020\\u3030-\\u3037\\u303C-\\u303F\\u309B\\u309C\\u30A0\\u30FB\\u30FC\\u3190-\\u319F\\u31C0-\\u31E3\\u3220-\\u325F\\u327F-\\u32CF\\u3358-\\u33FF\\u4DC0-\\u4DFF\\uA700-\\uA721\\uA788-\\uA78A\\uA830-\\uA839\\uA92E\\uA9CF\\uAB5B\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFEFF\\uFF01-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFF70\\uFF9E\\uFF9F\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFF9-\\uFFFD',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDD07-\\uDD33\\uDD37-\\uDD3F\\uDD90-\\uDD9B\\uDDD0-\\uDDFC\\uDEE1-\\uDEFB]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD66\\uDD6A-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDF00-\\uDF56\\uDF60-\\uDF71]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD00-\\uDD0C\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n        }, {\n            name: 'Coptic',\n            bmp: '\\u03E2-\\u03EF\\u2C80-\\u2CF3\\u2CF9-\\u2CFF'\n        }, {\n            name: 'Cuneiform',\n            astral: '\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC70-\\uDC74\\uDC80-\\uDD43]'\n        }, {\n            name: 'Cypriot',\n            astral: '\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F]'\n        }, {\n            name: 'Cyrillic',\n            bmp: '\\u0400-\\u0484\\u0487-\\u052F\\u1C80-\\u1C88\\u1D2B\\u1D78\\u2DE0-\\u2DFF\\uA640-\\uA69F\\uFE2E\\uFE2F'\n        }, {\n            name: 'Deseret',\n            astral: '\\uD801[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'Devanagari',\n            bmp: '\\u0900-\\u0950\\u0953-\\u0963\\u0966-\\u097F\\uA8E0-\\uA8FD'\n        }, {\n            name: 'Duployan',\n            astral: '\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9C-\\uDC9F]'\n        }, {\n            name: 'Egyptian_Hieroglyphs',\n            astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]'\n        }, {\n            name: 'Elbasan',\n            astral: '\\uD801[\\uDD00-\\uDD27]'\n        }, {\n            name: 'Ethiopic',\n            bmp: '\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u137C\\u1380-\\u1399\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E'\n        }, {\n            name: 'Georgian',\n            bmp: '\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u10FF\\u2D00-\\u2D25\\u2D27\\u2D2D'\n        }, {\n            name: 'Glagolitic',\n            bmp: '\\u2C00-\\u2C2E\\u2C30-\\u2C5E',\n            astral: '\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]'\n        }, {\n            name: 'Gothic',\n            astral: '\\uD800[\\uDF30-\\uDF4A]'\n        }, {\n            name: 'Grantha',\n            astral: '\\uD804[\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]'\n        }, {\n            name: 'Greek',\n            bmp: '\\u0370-\\u0373\\u0375-\\u0377\\u037A-\\u037D\\u037F\\u0384\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03E1\\u03F0-\\u03FF\\u1D26-\\u1D2A\\u1D5D-\\u1D61\\u1D66-\\u1D6A\\u1DBF\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FC4\\u1FC6-\\u1FD3\\u1FD6-\\u1FDB\\u1FDD-\\u1FEF\\u1FF2-\\u1FF4\\u1FF6-\\u1FFE\\u2126\\uAB65',\n            astral: '\\uD800[\\uDD40-\\uDD8E\\uDDA0]|\\uD834[\\uDE00-\\uDE45]'\n        }, {\n            name: 'Gujarati',\n            bmp: '\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AF1\\u0AF9'\n        }, {\n            name: 'Gurmukhi',\n            bmp: '\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75'\n        }, {\n            name: 'Han',\n            bmp: '\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uF900-\\uFA6D\\uFA70-\\uFAD9',\n            astral: '[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Hangul',\n            bmp: '\\u1100-\\u11FF\\u302E\\u302F\\u3131-\\u318E\\u3200-\\u321E\\u3260-\\u327E\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n        }, {\n            name: 'Hanunoo',\n            bmp: '\\u1720-\\u1734'\n        }, {\n            name: 'Hatran',\n            astral: '\\uD802[\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDCFF]'\n        }, {\n            name: 'Hebrew',\n            bmp: '\\u0591-\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F4\\uFB1D-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFB4F'\n        }, {\n            name: 'Hiragana',\n            bmp: '\\u3041-\\u3096\\u309D-\\u309F',\n            astral: '\\uD82C\\uDC01|\\uD83C\\uDE00'\n        }, {\n            name: 'Imperial_Aramaic',\n            astral: '\\uD802[\\uDC40-\\uDC55\\uDC57-\\uDC5F]'\n        }, {\n            name: 'Inherited',\n            bmp: '\\u0300-\\u036F\\u0485\\u0486\\u064B-\\u0655\\u0670\\u0951\\u0952\\u1AB0-\\u1ABE\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u200C\\u200D\\u20D0-\\u20F0\\u302A-\\u302D\\u3099\\u309A\\uFE00-\\uFE0F\\uFE20-\\uFE2D',\n            astral: '\\uD800[\\uDDFD\\uDEE0]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'Inscriptional_Pahlavi',\n            astral: '\\uD802[\\uDF60-\\uDF72\\uDF78-\\uDF7F]'\n        }, {\n            name: 'Inscriptional_Parthian',\n            astral: '\\uD802[\\uDF40-\\uDF55\\uDF58-\\uDF5F]'\n        }, {\n            name: 'Javanese',\n            bmp: '\\uA980-\\uA9CD\\uA9D0-\\uA9D9\\uA9DE\\uA9DF'\n        }, {\n            name: 'Kaithi',\n            astral: '\\uD804[\\uDC80-\\uDCC1]'\n        }, {\n            name: 'Kannada',\n            bmp: '\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2'\n        }, {\n            name: 'Katakana',\n            bmp: '\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D',\n            astral: '\\uD82C\\uDC00'\n        }, {\n            name: 'Kayah_Li',\n            bmp: '\\uA900-\\uA92D\\uA92F'\n        }, {\n            name: 'Kharoshthi',\n            astral: '\\uD802[\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F-\\uDE47\\uDE50-\\uDE58]'\n        }, {\n            name: 'Khmer',\n            bmp: '\\u1780-\\u17DD\\u17E0-\\u17E9\\u17F0-\\u17F9\\u19E0-\\u19FF'\n        }, {\n            name: 'Khojki',\n            astral: '\\uD804[\\uDE00-\\uDE11\\uDE13-\\uDE3E]'\n        }, {\n            name: 'Khudawadi',\n            astral: '\\uD804[\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9]'\n        }, {\n            name: 'Lao',\n            bmp: '\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF'\n        }, {\n            name: 'Latin',\n            bmp: 'A-Za-z\\xAA\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02B8\\u02E0-\\u02E4\\u1D00-\\u1D25\\u1D2C-\\u1D5C\\u1D62-\\u1D65\\u1D6B-\\u1D77\\u1D79-\\u1DBE\\u1E00-\\u1EFF\\u2071\\u207F\\u2090-\\u209C\\u212A\\u212B\\u2132\\u214E\\u2160-\\u2188\\u2C60-\\u2C7F\\uA722-\\uA787\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA7FF\\uAB30-\\uAB5A\\uAB5C-\\uAB64\\uFB00-\\uFB06\\uFF21-\\uFF3A\\uFF41-\\uFF5A'\n        }, {\n            name: 'Lepcha',\n            bmp: '\\u1C00-\\u1C37\\u1C3B-\\u1C49\\u1C4D-\\u1C4F'\n        }, {\n            name: 'Limbu',\n            bmp: '\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1940\\u1944-\\u194F'\n        }, {\n            name: 'Linear_A',\n            astral: '\\uD801[\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]'\n        }, {\n            name: 'Linear_B',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA]'\n        }, {\n            name: 'Lisu',\n            bmp: '\\uA4D0-\\uA4FF'\n        }, {\n            name: 'Lycian',\n            astral: '\\uD800[\\uDE80-\\uDE9C]'\n        }, {\n            name: 'Lydian',\n            astral: '\\uD802[\\uDD20-\\uDD39\\uDD3F]'\n        }, {\n            name: 'Mahajani',\n            astral: '\\uD804[\\uDD50-\\uDD76]'\n        }, {\n            name: 'Malayalam',\n            bmp: '\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4F\\u0D54-\\u0D63\\u0D66-\\u0D7F'\n        }, {\n            name: 'Mandaic',\n            bmp: '\\u0840-\\u085B\\u085E'\n        }, {\n            name: 'Manichaean',\n            astral: '\\uD802[\\uDEC0-\\uDEE6\\uDEEB-\\uDEF6]'\n        }, {\n            name: 'Marchen',\n            astral: '\\uD807[\\uDC70-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]'\n        }, {\n            name: 'Meetei_Mayek',\n            bmp: '\\uAAE0-\\uAAF6\\uABC0-\\uABED\\uABF0-\\uABF9'\n        }, {\n            name: 'Mende_Kikakui',\n            astral: '\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCD6]'\n        }, {\n            name: 'Meroitic_Cursive',\n            astral: '\\uD802[\\uDDA0-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDDFF]'\n        }, {\n            name: 'Meroitic_Hieroglyphs',\n            astral: '\\uD802[\\uDD80-\\uDD9F]'\n        }, {\n            name: 'Miao',\n            astral: '\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]'\n        }, {\n            name: 'Modi',\n            astral: '\\uD805[\\uDE00-\\uDE44\\uDE50-\\uDE59]'\n        }, {\n            name: 'Mongolian',\n            bmp: '\\u1800\\u1801\\u1804\\u1806-\\u180E\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA',\n            astral: '\\uD805[\\uDE60-\\uDE6C]'\n        }, {\n            name: 'Mro',\n            astral: '\\uD81A[\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE6E\\uDE6F]'\n        }, {\n            name: 'Multani',\n            astral: '\\uD804[\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA9]'\n        }, {\n            name: 'Myanmar',\n            bmp: '\\u1000-\\u109F\\uA9E0-\\uA9FE\\uAA60-\\uAA7F'\n        }, {\n            name: 'Nabataean',\n            astral: '\\uD802[\\uDC80-\\uDC9E\\uDCA7-\\uDCAF]'\n        }, {\n            name: 'New_Tai_Lue',\n            bmp: '\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u19DE\\u19DF'\n        }, {\n            name: 'Newa',\n            astral: '\\uD805[\\uDC00-\\uDC59\\uDC5B\\uDC5D]'\n        }, {\n            name: 'Nko',\n            bmp: '\\u07C0-\\u07FA'\n        }, {\n            name: 'Ogham',\n            bmp: '\\u1680-\\u169C'\n        }, {\n            name: 'Ol_Chiki',\n            bmp: '\\u1C50-\\u1C7F'\n        }, {\n            name: 'Old_Hungarian',\n            astral: '\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDCFF]'\n        }, {\n            name: 'Old_Italic',\n            astral: '\\uD800[\\uDF00-\\uDF23]'\n        }, {\n            name: 'Old_North_Arabian',\n            astral: '\\uD802[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'Old_Permic',\n            astral: '\\uD800[\\uDF50-\\uDF7A]'\n        }, {\n            name: 'Old_Persian',\n            astral: '\\uD800[\\uDFA0-\\uDFC3\\uDFC8-\\uDFD5]'\n        }, {\n            name: 'Old_South_Arabian',\n            astral: '\\uD802[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'Old_Turkic',\n            astral: '\\uD803[\\uDC00-\\uDC48]'\n        }, {\n            name: 'Oriya',\n            bmp: '\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B77'\n        }, {\n            name: 'Osage',\n            astral: '\\uD801[\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB]'\n        }, {\n            name: 'Osmanya',\n            astral: '\\uD801[\\uDC80-\\uDC9D\\uDCA0-\\uDCA9]'\n        }, {\n            name: 'Pahawh_Hmong',\n            astral: '\\uD81A[\\uDF00-\\uDF45\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]'\n        }, {\n            name: 'Palmyrene',\n            astral: '\\uD802[\\uDC60-\\uDC7F]'\n        }, {\n            name: 'Pau_Cin_Hau',\n            astral: '\\uD806[\\uDEC0-\\uDEF8]'\n        }, {\n            name: 'Phags_Pa',\n            bmp: '\\uA840-\\uA877'\n        }, {\n            name: 'Phoenician',\n            astral: '\\uD802[\\uDD00-\\uDD1B\\uDD1F]'\n        }, {\n            name: 'Psalter_Pahlavi',\n            astral: '\\uD802[\\uDF80-\\uDF91\\uDF99-\\uDF9C\\uDFA9-\\uDFAF]'\n        }, {\n            name: 'Rejang',\n            bmp: '\\uA930-\\uA953\\uA95F'\n        }, {\n            name: 'Runic',\n            bmp: '\\u16A0-\\u16EA\\u16EE-\\u16F8'\n        }, {\n            name: 'Samaritan',\n            bmp: '\\u0800-\\u082D\\u0830-\\u083E'\n        }, {\n            name: 'Saurashtra',\n            bmp: '\\uA880-\\uA8C5\\uA8CE-\\uA8D9'\n        }, {\n            name: 'Sharada',\n            astral: '\\uD804[\\uDD80-\\uDDCD\\uDDD0-\\uDDDF]'\n        }, {\n            name: 'Shavian',\n            astral: '\\uD801[\\uDC50-\\uDC7F]'\n        }, {\n            name: 'Siddham',\n            astral: '\\uD805[\\uDD80-\\uDDB5\\uDDB8-\\uDDDD]'\n        }, {\n            name: 'SignWriting',\n            astral: '\\uD836[\\uDC00-\\uDE8B\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]'\n        }, {\n            name: 'Sinhala',\n            bmp: '\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2-\\u0DF4',\n            astral: '\\uD804[\\uDDE1-\\uDDF4]'\n        }, {\n            name: 'Sora_Sompeng',\n            astral: '\\uD804[\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9]'\n        }, {\n            name: 'Sundanese',\n            bmp: '\\u1B80-\\u1BBF\\u1CC0-\\u1CC7'\n        }, {\n            name: 'Syloti_Nagri',\n            bmp: '\\uA800-\\uA82B'\n        }, {\n            name: 'Syriac',\n            bmp: '\\u0700-\\u070D\\u070F-\\u074A\\u074D-\\u074F'\n        }, {\n            name: 'Tagalog',\n            bmp: '\\u1700-\\u170C\\u170E-\\u1714'\n        }, {\n            name: 'Tagbanwa',\n            bmp: '\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773'\n        }, {\n            name: 'Tai_Le',\n            bmp: '\\u1950-\\u196D\\u1970-\\u1974'\n        }, {\n            name: 'Tai_Tham',\n            bmp: '\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA0-\\u1AAD'\n        }, {\n            name: 'Tai_Viet',\n            bmp: '\\uAA80-\\uAAC2\\uAADB-\\uAADF'\n        }, {\n            name: 'Takri',\n            astral: '\\uD805[\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]'\n        }, {\n            name: 'Tamil',\n            bmp: '\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BFA'\n        }, {\n            name: 'Tangut',\n            astral: '\\uD81B\\uDFE0|[\\uD81C-\\uD820][\\uDC00-\\uDFFF]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]'\n        }, {\n            name: 'Telugu',\n            bmp: '\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C78-\\u0C7F'\n        }, {\n            name: 'Thaana',\n            bmp: '\\u0780-\\u07B1'\n        }, {\n            name: 'Thai',\n            bmp: '\\u0E01-\\u0E3A\\u0E40-\\u0E5B'\n        }, {\n            name: 'Tibetan',\n            bmp: '\\u0F00-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F97\\u0F99-\\u0FBC\\u0FBE-\\u0FCC\\u0FCE-\\u0FD4\\u0FD9\\u0FDA'\n        }, {\n            name: 'Tifinagh',\n            bmp: '\\u2D30-\\u2D67\\u2D6F\\u2D70\\u2D7F'\n        }, {\n            name: 'Tirhuta',\n            astral: '\\uD805[\\uDC80-\\uDCC7\\uDCD0-\\uDCD9]'\n        }, {\n            name: 'Ugaritic',\n            astral: '\\uD800[\\uDF80-\\uDF9D\\uDF9F]'\n        }, {\n            name: 'Vai',\n            bmp: '\\uA500-\\uA62B'\n        }, {\n            name: 'Warang_Citi',\n            astral: '\\uD806[\\uDCA0-\\uDCF2\\uDCFF]'\n        }, {\n            name: 'Yi',\n            bmp: '\\uA000-\\uA48C\\uA490-\\uA4C6'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeScripts);\n\n    var lib = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n\n\n\n    var _xregexp2 = _interopRequireDefault(xregexp);\n\n\n\n    var _build2 = _interopRequireDefault(build);\n\n\n\n    var _matchrecursive2 = _interopRequireDefault(matchrecursive);\n\n\n\n    var _unicodeBase2 = _interopRequireDefault(unicodeBase);\n\n\n\n    var _unicodeBlocks2 = _interopRequireDefault(unicodeBlocks);\n\n\n\n    var _unicodeCategories2 = _interopRequireDefault(unicodeCategories);\n\n\n\n    var _unicodeProperties2 = _interopRequireDefault(unicodeProperties);\n\n\n\n    var _unicodeScripts2 = _interopRequireDefault(unicodeScripts);\n\n    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n    (0, _build2.default)(_xregexp2.default);\n    (0, _matchrecursive2.default)(_xregexp2.default);\n    (0, _unicodeBase2.default)(_xregexp2.default);\n    (0, _unicodeBlocks2.default)(_xregexp2.default);\n    (0, _unicodeCategories2.default)(_xregexp2.default);\n    (0, _unicodeProperties2.default)(_xregexp2.default);\n    (0, _unicodeScripts2.default)(_xregexp2.default);\n\n    exports.default = _xregexp2.default;\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(lib);\n\n    var decamelize = (text, separator) => {\n    \tif (typeof text !== 'string') {\n    \t\tthrow new TypeError('Expected a string');\n    \t}\n\n    \tseparator = typeof separator === 'undefined' ? '_' : separator;\n\n    \tconst regex1 = lib('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n    \tconst regex2 = lib('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n\n    \treturn text\n    \t\t// TODO: Use this instead of `xregexp` when targeting Node.js 10:\n    \t\t// .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n    \t\t// .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n    \t\t.replace(regex1, `$1${separator}$2`)\n    \t\t.replace(regex2, `$1${separator}$2`)\n    \t\t.toLowerCase();\n    };\n\n    var _decamelize = /*#__PURE__*/Object.freeze({\n        default: decamelize,\n        __moduleExports: decamelize\n    });\n\n    //handle es6 / bundling\n    const decamelize$1 = (decamelize || _decamelize);\n    function createElement(tag, attrs, ...children) {\n        if (typeof tag === 'function') {\n            const fn = tag;\n            const props = attrs;\n            props.children = children;\n            return fn(props);\n        }\n        else {\n            const el = document.createElement(tag);\n            const map = attrs;\n            for (let name in map) {\n                if (name && map.hasOwnProperty(name)) {\n                    let value = map[name];\n                    if (name === 'className' && value !== void 0) {\n                        el.setAttribute('class', value.toString());\n                    }\n                    else if (value === false || value === null || value === undefined) {\n                        continue;\n                    }\n                    else if (value === true) {\n                        el.setAttribute(name, name);\n                    }\n                    else if (typeof value === 'function') {\n                        el[name.toLowerCase()] = value;\n                    }\n                    else if (typeof value === 'object') {\n                        el.setAttribute(name, flatten(value));\n                    }\n                    else {\n                        el.setAttribute(name, value.toString());\n                    }\n                }\n            }\n            if (children && children.length > 0) {\n                appendChildren(el, children);\n            }\n            return el;\n        }\n    }\n    function flatten(o) {\n        const arr = [];\n        for (let prop in o)\n            arr.push(`${decamelize$1(prop, '-')}:${o[prop]}`);\n        return arr.join(';');\n    }\n    function addChild(parentElement, child) {\n        if (child === null || child === undefined || typeof child === \"boolean\") {\n            return;\n        }\n        else if (Array.isArray(child)) {\n            appendChildren(parentElement, child);\n        }\n        else if (isElement(child)) {\n            parentElement.appendChild(child);\n        }\n        else {\n            parentElement.appendChild(document.createTextNode(child.toString()));\n        }\n    }\n    function appendChildren(parentElement, children) {\n        children.forEach(child => addChild(parentElement, child));\n    }\n    function isElement(el) {\n        //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n        return !!el.nodeType;\n    }\n    function mount(element, container) {\n        const activeChildPositions = getActiveChildPositions(container);\n        container.innerHTML = '';\n        if (element) {\n            addChild(container, element);\n            if (activeChildPositions)\n                focusChildAtPosition(container, activeChildPositions);\n        }\n    }\n    function focusChildAtPosition(element, childPositions) {\n        while (element && childPositions.length)\n            element = element.children.item(childPositions.shift());\n        if (element)\n            element.focus();\n    }\n    function getActiveChildPositions(containerElement) {\n        var active = document.activeElement;\n        var childPositions = [];\n        while (active !== document.body && active !== containerElement) {\n            childPositions.unshift(childPosition(active));\n            active = active.parentElement;\n        }\n        if (active === containerElement && childPositions.length)\n            return childPositions;\n    }\n    function childPosition(element) {\n        let i = 0;\n        while (element = element.previousElementSibling)\n            i++;\n        return i;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const KeyCodes = {\n        ENTER: 13\n    };\n    const Table = (props) => {\n        return (createElement(\"table\", { className: props.className },\n            props.children,\n            props.rows.map((row, i) => (createElement(\"tr\", { className: props.rowClassName || '', onClick: e => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: e => {\n                    if (e.keyCode === KeyCodes.ENTER && props.onRowClick) {\n                        props.onRowClick(e, i);\n                    }\n                } }, row.cells.map((cell, i) => (createElement(\"td\", { className: cell.className || '', title: cell.title || '' }, cell.content))))))));\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var controls = /*#__PURE__*/Object.freeze({\n        Table: Table\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n\n    var types$1 = /*#__PURE__*/Object.freeze({\n\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * Create a new element as a child of another element.\n     * @param tagName Tag name of the new tag to create.\n     * @param parentElement Reference of the element to append to.\n     * @returns new HTMLElement.\n     */\n    function addEl(tagName, parentElement) {\n        const el = document.createElement(tagName);\n        parentElement.appendChild(el);\n        return el;\n    }\n    /**\n     * Create a new div HTMLElement as a child of another element.\n     * @param parentElement Reference of the element to append to.\n     * @param className Optional css class name to apply to the div.\n     */\n    function addDiv(parentElement, className) {\n        const div = addEl('div', parentElement);\n        if (className) {\n            div.className = className;\n        }\n        return div;\n    }\n    /**\n     * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n     * @param el HTML Element to measure.\n     */\n    function outerSize(el) {\n        const cs = getComputedStyle(el);\n        const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n        const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n        return { height, width };\n    }\n\n    var isMergeableObject = function isMergeableObject(value) {\n    \treturn isNonNullObject(value)\n    \t\t&& !isSpecial(value)\n    };\n\n    function isNonNullObject(value) {\n    \treturn !!value && typeof value === 'object'\n    }\n\n    function isSpecial(value) {\n    \tvar stringValue = Object.prototype.toString.call(value);\n\n    \treturn stringValue === '[object RegExp]'\n    \t\t|| stringValue === '[object Date]'\n    \t\t|| isReactElement(value)\n    }\n\n    // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n    var canUseSymbol = typeof Symbol === 'function' && Symbol.for;\n    var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\n    function isReactElement(value) {\n    \treturn value.$$typeof === REACT_ELEMENT_TYPE\n    }\n\n    function emptyTarget(val) {\n    \treturn Array.isArray(val) ? [] : {}\n    }\n\n    function cloneUnlessOtherwiseSpecified(value, options) {\n    \treturn (options.clone !== false && options.isMergeableObject(value))\n    \t\t? deepmerge(emptyTarget(value), value, options)\n    \t\t: value\n    }\n\n    function defaultArrayMerge(target, source, options) {\n    \treturn target.concat(source).map(function(element) {\n    \t\treturn cloneUnlessOtherwiseSpecified(element, options)\n    \t})\n    }\n\n    function mergeObject(target, source, options) {\n    \tvar destination = {};\n    \tif (options.isMergeableObject(target)) {\n    \t\tObject.keys(target).forEach(function(key) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    \t\t});\n    \t}\n    \tObject.keys(source).forEach(function(key) {\n    \t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    \t\t} else {\n    \t\t\tdestination[key] = deepmerge(target[key], source[key], options);\n    \t\t}\n    \t});\n    \treturn destination\n    }\n\n    function deepmerge(target, source, options) {\n    \toptions = options || {};\n    \toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    \toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n    \tvar sourceIsArray = Array.isArray(source);\n    \tvar targetIsArray = Array.isArray(target);\n    \tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n    \tif (!sourceAndTargetTypesMatch) {\n    \t\treturn cloneUnlessOtherwiseSpecified(source, options)\n    \t} else if (sourceIsArray) {\n    \t\treturn options.arrayMerge(target, source, options)\n    \t} else {\n    \t\treturn mergeObject(target, source, options)\n    \t}\n    }\n\n    deepmerge.all = function deepmergeAll(array, options) {\n    \tif (!Array.isArray(array)) {\n    \t\tthrow new Error('first argument should be an array')\n    \t}\n\n    \treturn array.reduce(function(prev, next) {\n    \t\treturn deepmerge(prev, next, options)\n    \t}, {})\n    };\n\n    var deepmerge_1 = deepmerge;\n\n    var _deepmerge = /*#__PURE__*/Object.freeze({\n        default: deepmerge_1\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const deepmerge$1 = (deepmerge_1 || _deepmerge);\n    function clone(objectToClone) {\n        if (!objectToClone)\n            return objectToClone;\n        return deepmerge$1.all([objectToClone]);\n    }\n    const dontMerge = (destination, source) => source;\n    function deepMerge(...objectsToMerge) {\n        const objects = objectsToMerge.filter(Boolean);\n        return deepmerge$1.all(objects, { arrayMerge: dontMerge });\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n        reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n        reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n        reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n        reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n        reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color, color, {\n      copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable: function() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb: function() {\n        return this;\n      },\n      displayable: function() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n    }\n\n    function rgb_formatRgb() {\n      var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n      return (a === 1 ? \"rgb(\" : \"rgba(\")\n          + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n          + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n\n    function hex(value) {\n      value = Math.max(0, Math.min(255, Math.round(value) || 0));\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl: function() {\n        var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\")\n            + (this.h || 0) + \", \"\n            + (this.s || 0) * 100 + \"%, \"\n            + (this.l || 0) * 100 + \"%\"\n            + (a === 1 ? \")\" : \", \" + a + \")\");\n      }\n    }));\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    var deg2rad = Math.PI / 180;\n    var rad2deg = 180 / Math.PI;\n\n    // https://observablehq.com/@mbostock/lab-and-rgb\n    var K = 18,\n        Xn = 0.96422,\n        Yn = 1,\n        Zn = 0.82521,\n        t0 = 4 / 29,\n        t1 = 6 / 29,\n        t2 = 3 * t1 * t1,\n        t3 = t1 * t1 * t1;\n\n    function labConvert(o) {\n      if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n      if (o instanceof Hcl) return hcl2lab(o);\n      if (!(o instanceof Rgb)) o = rgbConvert(o);\n      var r = rgb2lrgb(o.r),\n          g = rgb2lrgb(o.g),\n          b = rgb2lrgb(o.b),\n          y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n      if (r === g && g === b) x = z = y; else {\n        x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n        z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n      }\n      return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n    }\n\n    function lab(l, a, b, opacity) {\n      return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n    }\n\n    function Lab(l, a, b, opacity) {\n      this.l = +l;\n      this.a = +a;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Lab, lab, extend(Color, {\n      brighter: function(k) {\n        return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n      },\n      darker: function(k) {\n        return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n      },\n      rgb: function() {\n        var y = (this.l + 16) / 116,\n            x = isNaN(this.a) ? y : y + this.a / 500,\n            z = isNaN(this.b) ? y : y - this.b / 200;\n        x = Xn * lab2xyz(x);\n        y = Yn * lab2xyz(y);\n        z = Zn * lab2xyz(z);\n        return new Rgb(\n          lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n          lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n          lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n          this.opacity\n        );\n      }\n    }));\n\n    function xyz2lab(t) {\n      return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n    }\n\n    function lab2xyz(t) {\n      return t > t1 ? t * t * t : t2 * (t - t0);\n    }\n\n    function lrgb2rgb(x) {\n      return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n    }\n\n    function rgb2lrgb(x) {\n      return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n    }\n\n    function hclConvert(o) {\n      if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n      if (!(o instanceof Lab)) o = labConvert(o);\n      if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n      var h = Math.atan2(o.b, o.a) * rad2deg;\n      return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n    }\n\n    function hcl(h, c, l, opacity) {\n      return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hcl(h, c, l, opacity) {\n      this.h = +h;\n      this.c = +c;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    function hcl2lab(o) {\n      if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n      var h = o.h * deg2rad;\n      return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n    }\n\n    define(Hcl, hcl, extend(Color, {\n      brighter: function(k) {\n        return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n      },\n      darker: function(k) {\n        return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n      },\n      rgb: function() {\n        return hcl2lab(this).rgb();\n      }\n    }));\n\n    var A = -0.14861,\n        B = +1.78277,\n        C = -0.29227,\n        D = -0.90649,\n        E = +1.97294,\n        ED = E * D,\n        EB = E * B,\n        BC_DA = B * C - D * A;\n\n    function cubehelixConvert(o) {\n      if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Rgb)) o = rgbConvert(o);\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n          bl = b - l,\n          k = (E * (g - l) - C * bl) / D,\n          s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n          h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n      return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n    }\n\n    function cubehelix(h, s, l, opacity) {\n      return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Cubehelix(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Cubehelix, cubehelix, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb: function() {\n        var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n            l = +this.l,\n            a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n            cosh = Math.cos(h),\n            sinh = Math.sin(h);\n        return new Rgb(\n          255 * (l + a * (A * cosh + B * sinh)),\n          255 * (l + a * (C * cosh + D * sinh)),\n          255 * (l + a * (E * cosh)),\n          this.opacity\n        );\n      }\n    }));\n\n    function rgbToDeckglColor(c) {\n        return [c.r, c.g, c.b, c.opacity * 255];\n    }\n    /**\n     * Compares 2 colors to see if they are equal.\n     * @param a Color to compare\n     * @param b Color to compare\n     * @returns True if colors are equal.\n     */\n    function colorIsEqual(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    /**\n     * Convert a CSS color string to a Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n     * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n     */\n    function colorFromString(cssColorSpecifier) {\n        if (cssColorSpecifier) {\n            const dc = color(cssColorSpecifier);\n            if (dc) {\n                const c = dc.rgb();\n                return rgbToDeckglColor(c);\n            }\n        }\n    }\n    /**\n     * Convert a Deck.gl color to a CSS rgba() string.\n     * @param color A Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n     */\n    function colorToString(color$$1) {\n        const c = [...color$$1];\n        if (c.length > 3) {\n            c[3] /= 255;\n        }\n        return `rgba(${c.join(',')})`;\n    }\n    function desaturate(color$$1, value) {\n        const rgb$$1 = rgb(color$$1[0], color$$1[1], color$$1[2], color$$1[3] / 255);\n        const hslColor = hsl(rgb$$1);\n        hslColor.s = value;\n        const c = hslColor.rgb();\n        return rgbToDeckglColor(c);\n    }\n    function isColor(cssColorSpecifier) {\n        return !!color(cssColorSpecifier);\n    }\n\n    let vega = {\n        CanvasHandler: null,\n        inferType: null,\n        inferTypes: null,\n        loader: null,\n        parse: null,\n        read: null,\n        renderModule: null,\n        Renderer: null,\n        sceneVisit: null,\n        scheme: null,\n        View: null\n    };\n    let deck = {\n        CompositeLayer: null,\n        COORDINATE_SYSTEM: null,\n        Deck: null,\n        Layer: null,\n        LinearInterpolator: null,\n        OrbitView: null,\n        _OrbitController: null\n    };\n    let layers = {\n        IconLayer: null,\n        LineLayer: null,\n        PolygonLayer: null,\n        TextLayer: null\n    };\n    let luma = {\n        CubeGeometry: null,\n        fp64: null,\n        Model: null,\n        Texture2D: null\n    };\n    /**\n     * References to dependency libraries.\n     */\n    const base = {\n        deck,\n        layers,\n        luma,\n        vega\n    };\n    /**\n     * Specify the dependency libraries to use for rendering.\n     * @param vega Vega library.\n     * @param deck deck/core library.\n     * @param layers deck/layers library.\n     * @param luma luma.gl library.\n     */\n    function use(vega, deck, layers, luma) {\n        base.deck = deck;\n        base.layers = layers;\n        base.luma = luma;\n        base.vega = vega;\n    }\n\n    var tinySdf = TinySDF;\n    var default_1 = TinySDF;\n\n    var INF = 1e20;\n\n    function TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) {\n        this.fontSize = fontSize || 24;\n        this.buffer = buffer === undefined ? 3 : buffer;\n        this.cutoff = cutoff || 0.25;\n        this.fontFamily = fontFamily || 'sans-serif';\n        this.fontWeight = fontWeight || 'normal';\n        this.radius = radius || 8;\n        var size = this.size = this.fontSize + this.buffer * 2;\n\n        this.canvas = document.createElement('canvas');\n        this.canvas.width = this.canvas.height = size;\n\n        this.ctx = this.canvas.getContext('2d');\n        this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily;\n        this.ctx.textBaseline = 'middle';\n        this.ctx.fillStyle = 'black';\n\n        // temporary arrays for the distance transform\n        this.gridOuter = new Float64Array(size * size);\n        this.gridInner = new Float64Array(size * size);\n        this.f = new Float64Array(size);\n        this.d = new Float64Array(size);\n        this.z = new Float64Array(size + 1);\n        this.v = new Int16Array(size);\n\n        // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852\n        this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1));\n    }\n\n    TinySDF.prototype.draw = function (char) {\n        this.ctx.clearRect(0, 0, this.size, this.size);\n        this.ctx.fillText(char, this.buffer, this.middle);\n\n        var imgData = this.ctx.getImageData(0, 0, this.size, this.size);\n        var alphaChannel = new Uint8ClampedArray(this.size * this.size);\n\n        for (var i = 0; i < this.size * this.size; i++) {\n            var a = imgData.data[i * 4 + 3] / 255; // alpha value\n            this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2);\n            this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2);\n        }\n\n        edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z);\n        edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z);\n\n        for (i = 0; i < this.size * this.size; i++) {\n            var d = this.gridOuter[i] - this.gridInner[i];\n            alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff))));\n        }\n\n        return alphaChannel;\n    };\n\n    // 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\n    function edt(data, width, height, f, d, v, z) {\n        for (var x = 0; x < width; x++) {\n            for (var y = 0; y < height; y++) {\n                f[y] = data[y * width + x];\n            }\n            edt1d(f, d, v, z, height);\n            for (y = 0; y < height; y++) {\n                data[y * width + x] = d[y];\n            }\n        }\n        for (y = 0; y < height; y++) {\n            for (x = 0; x < width; x++) {\n                f[x] = data[y * width + x];\n            }\n            edt1d(f, d, v, z, width);\n            for (x = 0; x < width; x++) {\n                data[y * width + x] = Math.sqrt(d[x]);\n            }\n        }\n    }\n\n    // 1D squared distance transform\n    function edt1d(f, d, v, z, n) {\n        v[0] = 0;\n        z[0] = -INF;\n        z[1] = +INF;\n\n        for (var q = 1, k = 0; q < n; q++) {\n            var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n            while (s <= z[k]) {\n                k--;\n                s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n            }\n            k++;\n            v[k] = q;\n            z[k] = s;\n            z[k + 1] = +INF;\n        }\n\n        for (q = 0, k = 0; q < n; q++) {\n            while (z[k + 1] < q) k++;\n            d[q] = (q - v[k]) * (q - v[k]) + f[v[k]];\n        }\n    }\n    tinySdf.default = default_1;\n\n    //from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/font-atlas.js\n    const GL_TEXTURE_WRAP_S = 0x2802;\n    const GL_TEXTURE_WRAP_T = 0x2803;\n    const GL_CLAMP_TO_EDGE = 0x812f;\n    const MAX_CANVAS_WIDTH = 1024;\n    const BASELINE_SCALE = 0.9;\n    const HEIGHT_SCALE = 1.2;\n    function getDefaultCharacterSet() {\n        const charSet = [];\n        for (let i = 32; i < 128; i++) {\n            charSet.push(String.fromCharCode(i));\n        }\n        return charSet;\n    }\n    const DEFAULT_CHAR_SET = getDefaultCharacterSet();\n    const DEFAULT_FONT_FAMILY = 'Monaco, monospace';\n    const DEFAULT_FONT_WEIGHT = 'normal';\n    const DEFAULT_FONT_SETTINGS = {\n        fontSize: 64,\n        buffer: 2,\n        sdf: false,\n        cutoff: 0.25,\n        radius: 3\n    };\n    function populateAlphaChannel(alphaChannel, imageData) {\n        // populate distance value from tinySDF to image alpha channel\t\n        for (let i = 0; i < alphaChannel.length; i++) {\n            imageData.data[4 * i + 3] = alphaChannel[i];\n        }\n    }\n    function setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n        ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n        ctx.fillStyle = '#000';\n        ctx.textBaseline = 'alphabetic';\n        ctx.textAlign = 'left';\n    }\n    function buildMapping({ ctx, fontHeight, buffer, characterSet, maxCanvasWidth }) {\n        const mapping = {};\n        let row = 0;\n        let x = 0;\n        Array.from(characterSet).forEach(char => {\n            // measure texts\n            // TODO - use Advanced text metrics when they are adopted:\n            // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n            const { width } = ctx.measureText(char);\n            if (x + width + buffer * 2 > maxCanvasWidth) {\n                x = 0;\n                row++;\n            }\n            mapping[char] = {\n                x: x + buffer,\n                y: row * (fontHeight + buffer * 2) + buffer,\n                width,\n                height: fontHeight,\n                mask: true\n            };\n            x += width + buffer * 2;\n        });\n        const canvasHeight = (row + 1) * (fontHeight + buffer * 2);\n        return { mapping, canvasHeight };\n    }\n    function makeFontAtlas(gl, fontSettings) {\n        const mergedFontSettings = Object.assign({\n            fontFamily: DEFAULT_FONT_FAMILY,\n            fontWeight: DEFAULT_FONT_WEIGHT,\n            characterSet: DEFAULT_CHAR_SET\n        }, DEFAULT_FONT_SETTINGS, fontSettings);\n        const { fontFamily, fontWeight, characterSet, fontSize, buffer, sdf, radius, cutoff } = mergedFontSettings;\n        const canvas = document.createElement('canvas');\n        const ctx = canvas.getContext('2d');\n        // build mapping\n        setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n        const fontHeight = fontSize * HEIGHT_SCALE;\n        const { canvasHeight, mapping } = buildMapping({\n            ctx,\n            fontHeight,\n            buffer,\n            characterSet,\n            maxCanvasWidth: MAX_CANVAS_WIDTH\n        });\n        canvas.width = MAX_CANVAS_WIDTH;\n        canvas.height = canvasHeight;\n        setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n        // layout characters\n        if (sdf) {\n            const tinySDF = new tinySdf(fontSize, buffer, radius, cutoff, fontFamily, fontWeight);\n            // used to store distance values from tinySDF\t\n            const imageData = ctx.createImageData(tinySDF.size, tinySDF.size);\n            for (const char of characterSet) {\n                populateAlphaChannel(tinySDF.draw(char), imageData);\n                ctx.putImageData(imageData, mapping[char].x - buffer, mapping[char].y - buffer);\n            }\n        }\n        else {\n            for (const char of characterSet) {\n                ctx.fillText(char, mapping[char].x, mapping[char].y + fontSize * BASELINE_SCALE);\n            }\n        }\n        return {\n            scale: HEIGHT_SCALE,\n            mapping,\n            texture: new base.luma.Texture2D(gl, {\n                pixels: canvas,\n                // padding is added only between the characters but not for borders\n                // enforce CLAMP_TO_EDGE to avoid any artifacts.\n                parameters: {\n                    [GL_TEXTURE_WRAP_S]: GL_CLAMP_TO_EDGE,\n                    [GL_TEXTURE_WRAP_T]: GL_CLAMP_TO_EDGE\n                }\n            })\n        };\n    }\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    //adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-fragment.glsl.js\n    var fs = `\\\n#define SHADER_NAME multi-icon-layer-fragment-shader\n\nprecision highp float;\n\nuniform sampler2D iconsTexture;\nuniform float buffer;\nuniform bool sdf;\n\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nconst float MIN_ALPHA = 0.05;\n\nvoid main(void) {\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\n  \n  float alpha = texColor.a;\n\n  // if enable sdf (signed distance fields)\t\n  if (sdf) {\t\n    float distance = texture2D(iconsTexture, vTextureCoords).a;\t\n    alpha = smoothstep(buffer - vGamma, buffer + vGamma, distance);\t\n  }\n\n  // Take the global opacity and the alpha from vColor into account for the alpha component\n  float a = alpha * vColor.a;\n\n  if (picking_uActive) {\n\n    // use picking color for entire rectangle\n    gl_FragColor = vec4(picking_vRGBcolor_Aselected.rgb, 1.0);\n  \n  } else {\n\n    if (a < MIN_ALPHA) {\n      discard;\n    } else {\n\n      gl_FragColor = vec4(vColor.rgb, a);\n\n      // use highlight color if this fragment belongs to the selected object.\n      bool selected = bool(picking_vRGBcolor_Aselected.a);\n      if (selected) {\n        gl_FragColor = vec4(vHighlightColor.rgb, a);\n      }\n    }\n  }\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    //adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-vertex.glsl.js\n    var vs = `\\\n#define SHADER_NAME multi-icon-layer-vertex-shader\n\nattribute vec2 positions;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute float instanceSizes;\nattribute float instanceAngles;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\nattribute vec4 instanceIconFrames;\nattribute float instanceColorModes;\nattribute vec2 instanceOffsets;\n\n// the following three attributes are for the multi-icon layer\nattribute vec2 instancePixelOffset;\nattribute vec4 instanceHighlightColors;\n\nuniform float sizeScale;\nuniform vec2 iconsTextureDim;\nuniform float gamma;\nuniform float opacity;\n\nvarying float vColorMode;\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nvec2 rotate_by_angle(vec2 vertex, float angle) {\n  float angle_radian = angle * PI / 180.0;\n  float cos_angle = cos(angle_radian);\n  float sin_angle = sin(angle_radian);\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\n  return rotationMatrix * vertex;\n}\n\nvoid main(void) {\n  vec2 iconSize = instanceIconFrames.zw;\n  // scale icon height to match instanceSize\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : instanceSizes / iconSize.y;\n\n  // scale and rotate vertex in \"pixel\" value and convert back to fraction in clipspace\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\n\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * sizeScale * instanceScale;\n  pixelOffset += instancePixelOffset;\n  pixelOffset.y *= -1.0;\n\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.0));\n  gl_Position += project_pixel_to_clipspace(pixelOffset);\n\n  vTextureCoords = mix(\n    instanceIconFrames.xy,\n    instanceIconFrames.xy + iconSize,\n    (positions.xy + 1.0) / 2.0\n  ) / iconsTextureDim;\n\n  vTextureCoords.y = 1.0 - vTextureCoords.y;\n\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\n  vHighlightColor = vec4(instanceHighlightColors.rgb, instanceHighlightColors.a * opacity) / 255.;\n\n  picking_setPickingColor(instancePickingColors);\n\n  vGamma = gamma / (sizeScale * iconSize.y);\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    // TODO expose as layer properties\n    const DEFAULT_GAMMA = 0.2;\n    const DEFAULT_BUFFER = 192.0 / 256;\n    const defaultProps = {\n        getShiftInQueue: { type: 'accessor', value: x => x.shift || 0 },\n        getLengthOfQueue: { type: 'accessor', value: x => x.len || 1 },\n        // 1: left, 0: middle, -1: right\n        getAnchorX: { type: 'accessor', value: x => x.anchorX || 0 },\n        // 1: top, 0: center, -1: bottom\n        getAnchorY: { type: 'accessor', value: x => x.anchorY || 0 },\n        getPixelOffset: { type: 'accessor', value: [0, 0] },\n        // object with the same pickingIndex will be picked when any one of them is being picked\n        getPickingIndex: { type: 'accessor', value: x => x.objectIndex }\n    };\n    //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n    const UNSIGNED_BYTE = 0x1401;\n    function _MultiIconLayer(...props) {\n        class __MultiIconLayer extends base.layers.IconLayer {\n            constructor(...props) {\n                super(...arguments);\n            }\n            getShaders() {\n                return Object.assign({}, super.getShaders(), {\n                    vs,\n                    fs\n                });\n            }\n            initializeState() {\n                super.initializeState();\n                const attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePixelOffset: {\n                        size: 2,\n                        transition: true,\n                        accessor: 'getPixelOffset'\n                    },\n                    instanceHighlightColors: {\n                        size: 4,\n                        type: UNSIGNED_BYTE,\n                        transition: true,\n                        accessor: 'getHighlightColor',\n                        defaultValue: [0, 255, 0, 255]\n                    }\n                });\n            }\n            updateState(updateParams) {\n                super.updateState(updateParams);\n                const { changeFlags } = updateParams;\n                if (changeFlags.updateTriggersChanged &&\n                    (changeFlags.updateTriggersChanged.getAnchorX || changeFlags.updateTriggersChanged.getAnchorY)) {\n                    this.getAttributeManager().invalidate('instanceOffsets');\n                }\n            }\n            draw({ uniforms }) {\n                const { sdf } = this.props;\n                super.draw({\n                    uniforms: Object.assign({}, uniforms, {\n                        // Refer the following doc about gamma and buffer\n                        // https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817\n                        buffer: DEFAULT_BUFFER,\n                        gamma: DEFAULT_GAMMA,\n                        sdf: Boolean(sdf)\n                    })\n                });\n            }\n            calculateInstanceOffsets(attribute) {\n                const { data, iconMapping, getIcon, getAnchorX, getAnchorY, getLengthOfQueue, getShiftInQueue } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                for (const object of data) {\n                    const icon = getIcon(object);\n                    const rect = iconMapping[icon] || {};\n                    const len = getLengthOfQueue(object);\n                    const shiftX = getShiftInQueue(object);\n                    value[i++] = ((getAnchorX(object) - 1) * len) / 2 + rect.width / 2 + shiftX || 0;\n                    value[i++] = (rect.height / 2) * getAnchorY(object) || 0;\n                }\n            }\n            calculateInstancePickingColors(attribute) {\n                const { data, getPickingIndex } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                const pickingColor = [];\n                for (const point of data) {\n                    const index = getPickingIndex(point);\n                    this.encodePickingColor(index, pickingColor);\n                    value[i++] = pickingColor[0];\n                    value[i++] = pickingColor[1];\n                    value[i++] = pickingColor[2];\n                }\n            }\n        }\n        __MultiIconLayer.layerName = 'MultiIconLayer';\n        __MultiIconLayer.defaultProps = defaultProps;\n        const instance = new __MultiIconLayer(...arguments);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * CubeLayer - a Deck.gl layer to render cuboids.\n     * This is instantiatable by calling `new MultiIconLayer()`.\n     */\n    const MultiIconLayer = _MultiIconLayer;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    const TEXT_ANCHOR = {\n        start: 1,\n        middle: 0,\n        end: -1\n    };\n    const ALIGNMENT_BASELINE = {\n        top: 1,\n        center: 0,\n        bottom: -1\n    };\n    const DEFAULT_COLOR = [0, 0, 0, 255];\n    const MISSING_CHAR_WIDTH = 32;\n    const FONT_SETTINGS_PROPS = ['fontSize', 'buffer', 'sdf', 'radius', 'cutoff'];\n    const defaultProps$1 = {\n        fp64: false,\n        sizeScale: 1,\n        characterSet: DEFAULT_CHAR_SET,\n        fontFamily: DEFAULT_FONT_FAMILY,\n        fontWeight: DEFAULT_FONT_WEIGHT,\n        fontSettings: {},\n        getText: { type: 'accessor', value: x => x.text },\n        getPosition: { type: 'accessor', value: x => x.position },\n        getColor: { type: 'accessor', value: DEFAULT_COLOR },\n        getSize: { type: 'accessor', value: 32 },\n        getAngle: { type: 'accessor', value: 0 },\n        getHighlightColor: { type: 'accessor', value: DEFAULT_COLOR },\n        getTextAnchor: { type: 'accessor', value: 'middle' },\n        getAlignmentBaseline: { type: 'accessor', value: 'center' },\n        getPixelOffset: { type: 'accessor', value: [0, 0] }\n    };\n    function _ChromaticTextLayer(props) {\n        class __ChromaticTextLayer extends base.deck.CompositeLayer {\n            updateState({ props, oldProps, changeFlags }) {\n                const fontChanged = this.fontChanged(oldProps, props);\n                if (fontChanged) {\n                    this.updateFontAtlas();\n                }\n                if (changeFlags.dataChanged ||\n                    fontChanged ||\n                    (changeFlags.updateTriggersChanged &&\n                        (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText))) {\n                    this.transformStringToLetters();\n                }\n            }\n            updateFontAtlas() {\n                const { gl } = this.context;\n                const { fontSettings, fontFamily, fontWeight, characterSet } = this.props;\n                const mergedFontSettings = Object.assign({}, DEFAULT_FONT_SETTINGS, fontSettings, {\n                    fontFamily,\n                    fontWeight,\n                    characterSet\n                });\n                const { scale, mapping, texture } = makeFontAtlas(gl, mergedFontSettings);\n                this.setState({\n                    scale,\n                    iconAtlas: texture,\n                    iconMapping: mapping\n                });\n            }\n            fontChanged(oldProps, props) {\n                if (oldProps.fontFamily !== props.fontFamily ||\n                    oldProps.characterSet !== props.characterSet ||\n                    oldProps.fontWeight !== props.fontWeight) {\n                    return true;\n                }\n                if (oldProps.fontSettings === props.fontSettings) {\n                    return false;\n                }\n                const oldFontSettings = oldProps.fontSettings || {};\n                const fontSettings = props.fontSettings || {};\n                return FONT_SETTINGS_PROPS.some(prop => oldFontSettings[prop] !== fontSettings[prop]);\n            }\n            getPickingInfo({ info }) {\n                // because `TextLayer` assign the same pickingInfoIndex for one text label,\n                // here info.index refers the index of text label in props.data\n                return Object.assign(info, {\n                    // override object with original data\n                    object: info.index >= 0 ? this.props.data[info.index] : null\n                });\n            }\n            /* eslint-disable no-loop-func */\n            transformStringToLetters() {\n                const { data, getText } = this.props;\n                const { iconMapping } = this.state;\n                const transformedData = [];\n                let objectIndex = 0;\n                for (const val of data) {\n                    const text = getText(val);\n                    if (text) {\n                        const letters = Array.from(text);\n                        const offsets = [0];\n                        let offsetLeft = 0;\n                        letters.forEach((letter, i) => {\n                            const datum = {\n                                text: letter,\n                                index: i,\n                                offsets,\n                                len: text.length,\n                                // reference of original object and object index\n                                object: val,\n                                objectIndex\n                            };\n                            const frame = iconMapping[letter];\n                            if (frame) {\n                                offsetLeft += frame.width;\n                            }\n                            else {\n                                //log.warn(`Missing character: ${letter}`)();\n                                offsetLeft += MISSING_CHAR_WIDTH;\n                            }\n                            offsets.push(offsetLeft);\n                            transformedData.push(datum);\n                        });\n                    }\n                    objectIndex++;\n                }\n                this.setState({ data: transformedData });\n            }\n            /* eslint-enable no-loop-func */\n            getLetterOffset(datum) {\n                return datum.offsets[datum.index];\n            }\n            getTextLength(datum) {\n                return datum.offsets[datum.offsets.length - 1];\n            }\n            _getAccessor(accessor) {\n                if (typeof accessor === 'function') {\n                    return x => accessor(x.object);\n                }\n                return accessor;\n            }\n            getAnchorXFromTextAnchor(getTextAnchor) {\n                return x => {\n                    const textAnchor = typeof getTextAnchor === 'function' ? getTextAnchor(x.object) : getTextAnchor;\n                    if (!TEXT_ANCHOR.hasOwnProperty(textAnchor)) {\n                        throw new Error(`Invalid text anchor parameter: ${textAnchor}`);\n                    }\n                    return TEXT_ANCHOR[textAnchor];\n                };\n            }\n            getAnchorYFromAlignmentBaseline(getAlignmentBaseline) {\n                return x => {\n                    const alignmentBaseline = typeof getAlignmentBaseline === 'function'\n                        ? getAlignmentBaseline(x.object)\n                        : getAlignmentBaseline;\n                    if (!ALIGNMENT_BASELINE.hasOwnProperty(alignmentBaseline)) {\n                        throw new Error(`Invalid alignment baseline parameter: ${alignmentBaseline}`);\n                    }\n                    return ALIGNMENT_BASELINE[alignmentBaseline];\n                };\n            }\n            renderLayers() {\n                const { data, scale, iconAtlas, iconMapping } = this.state;\n                const { getPosition, getColor, getSize, getAngle, getHighlightColor, getTextAnchor, getAlignmentBaseline, getPixelOffset, fp64, sdf, sizeScale, transitions, updateTriggers } = this.props;\n                const SubLayerClass = this.getSubLayerClass('characters', MultiIconLayer);\n                return new SubLayerClass({\n                    sdf,\n                    iconAtlas,\n                    iconMapping,\n                    getPosition: d => getPosition(d.object),\n                    getColor: this._getAccessor(getColor),\n                    getSize: this._getAccessor(getSize),\n                    getAngle: this._getAccessor(getAngle),\n                    getHighlightColor: this._getAccessor(getHighlightColor),\n                    getAnchorX: this.getAnchorXFromTextAnchor(getTextAnchor),\n                    getAnchorY: this.getAnchorYFromAlignmentBaseline(getAlignmentBaseline),\n                    getPixelOffset: this._getAccessor(getPixelOffset),\n                    fp64,\n                    sizeScale: sizeScale * scale,\n                    transitions: transitions && {\n                        getPosition: transitions.getPosition,\n                        getAngle: transitions.getAngle,\n                        getHighlightColor: transitions.getHighlightColor,\n                        getColor: transitions.getColor,\n                        getSize: transitions.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset\n                    }\n                }, this.getSubLayerProps({\n                    id: 'characters',\n                    updateTriggers: {\n                        getPosition: updateTriggers.getPosition,\n                        getAngle: updateTriggers.getAngle,\n                        getHighlightColor: updateTriggers.getHighlightColor,\n                        getColor: updateTriggers.getColor,\n                        getSize: updateTriggers.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset,\n                        getAnchorX: updateTriggers.getTextAnchor,\n                        getAnchorY: updateTriggers.getAlignmentBaseline\n                    }\n                }), {\n                    data,\n                    getIcon: d => d.text,\n                    getShiftInQueue: d => this.getLetterOffset(d),\n                    getLengthOfQueue: d => this.getTextLength(d)\n                });\n            }\n        }\n        __ChromaticTextLayer.layerName = 'TextLayer';\n        __ChromaticTextLayer.defaultProps = defaultProps$1;\n        const instance = new __ChromaticTextLayer(props);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * TextLayer - a modification of deck.gl's TextLayer.\n     * This is instantiatable by calling `new TextLayer()`.\n     */\n    const ChromaticTextLayer = _ChromaticTextLayer;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    function concat(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []);\n    }\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    var fs$1 = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n\n    const minHeight = '100px';\n    const minWidth = '100px';\n    const lightSettings = {\n        '2d': {},\n        '3d': {\n            lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n            ambientRatio: 0.3,\n            diffuseRatio: 0.6,\n            specularRatio: 0.4,\n            lightsStrength: [0.3, 0.0, 0.8, 0.0],\n            numberOfLights: 2\n        }\n    };\n    const defaultPresenterStyle = {\n        cssPrefix: 'vega-deckgl-',\n        defaultCubeColor: [128, 128, 128, 255],\n        highlightColor: [0, 0, 0, 255],\n        lightSettings\n    };\n    const defaultPresenterConfig = {\n        onCubeClick: (e, cube) => { },\n        onCubeHover: (e, cube) => { },\n        transitionDurations: {\n            color: 100,\n            position: 600,\n            size: 600,\n            view: 600\n        }\n    };\n    function createStage(view) {\n        const stage = {\n            view,\n            cubeData: [],\n            axes: {\n                x: [],\n                y: []\n            },\n            gridLines: [],\n            textData: [],\n            legend: {\n                rows: {}\n            },\n            facets: []\n        };\n        return stage;\n    }\n    const groupStrokeWidth = 1;\n    const lineZ = -1;\n    const defaultView = '2d';\n    const min3dDepth = 0.05;\n    const minPixelSize = 0.5;\n\n    var defaults = /*#__PURE__*/Object.freeze({\n        minHeight: minHeight,\n        minWidth: minWidth,\n        defaultPresenterStyle: defaultPresenterStyle,\n        defaultPresenterConfig: defaultPresenterConfig,\n        createStage: createStage,\n        groupStrokeWidth: groupStrokeWidth,\n        lineZ: lineZ,\n        defaultView: defaultView,\n        min3dDepth: min3dDepth,\n        minPixelSize: minPixelSize\n    });\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    var vs$1 = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_scale(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_scale(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_scale(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, offset, position_worldspace);\n\n  float lightWeight = 1.0;\n  \n  //allow for a small amount of error around the min3dDepth \n  if (instanceSizes.z >= ${min3dDepth.toFixed(4)} - 0.0001) {\n    lightWeight = lighting_getLightWeight(\n      position_worldspace.xyz, // the w component is always 1.0\n      normals\n    );\n  }\n\n  vec3 lightWeightedColor = lightWeight * instanceColors.rgb;\n  vec3 mixedLight = mix(instanceColors.rgb, lightWeightedColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n    const UNSIGNED_BYTE$1 = 0x1401;\n    const DEFAULT_COLOR$1 = [255, 0, 255, 255];\n    const defaultProps$2 = {\n        lightingMix: 0.5,\n        fp64: false,\n        getSize: x => x.size,\n        getPosition: x => x.position,\n        getColor: x => x.color\n    };\n    function _CubeLayer(props) {\n        //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n        class __CubeLayer extends base.deck.Layer {\n            getShaders() {\n                const projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n                return { vs: vs$1, fs: fs$1, modules: [projectModule, 'lighting', 'picking'] };\n            }\n            initializeState() {\n                const attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        transition: true,\n                        accessor: 'getPosition'\n                    },\n                    instancePositions64xyLow: {\n                        size: 3,\n                        accessor: 'getPosition',\n                        update: this.calculateInstancePositions64xyLow\n                    },\n                    instanceSizes: {\n                        size: 3,\n                        transition: true,\n                        accessor: 'getSize'\n                    },\n                    instanceColors: {\n                        size: 4,\n                        type: UNSIGNED_BYTE$1,\n                        transition: true,\n                        accessor: 'getColor',\n                        defaultValue: DEFAULT_COLOR$1\n                    }\n                });\n            }\n            updateState({ props, oldProps, changeFlags }) {\n                super.updateState({ props, oldProps, changeFlags }); //TODO add parameter type to deck.gl-typings\n                // Re-generate model if geometry changed\n                if (props.fp64 !== oldProps.fp64) {\n                    const { gl } = this.context;\n                    if (this.state.model) {\n                        this.state.model.delete();\n                    }\n                    this.setState({ model: this._getModel(gl) });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n            _getModel(gl) {\n                return new base.luma.Model(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new base.luma.CubeGeometry(),\n                    isInstanced: true,\n                    shaderCache: this.context.shaderCache\n                }));\n            }\n            draw({ uniforms }) {\n                let { lightingMix } = this.props;\n                if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n                    lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n                }\n                this.state.model.render(Object.assign({}, uniforms, {\n                    lightingMix\n                }));\n            }\n            calculateInstancePositions64xyLow(attribute) {\n                const isFP64 = this.use64bitPositions();\n                attribute.constant = !isFP64;\n                if (!isFP64) {\n                    attribute.value = new Float32Array(2);\n                    return;\n                }\n                const { data, getPosition } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                for (const point of data) {\n                    const position = getPosition(point);\n                    value[i++] = base.luma.fp64.fp64LowPart(position[0]);\n                    value[i++] = base.luma.fp64.fp64LowPart(position[1]);\n                }\n            }\n        }\n        __CubeLayer.layerName = 'CubeLayer';\n        __CubeLayer.defaultProps = defaultProps$2;\n        const instance = new __CubeLayer(props);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * CubeLayer - a Deck.gl layer to render cuboids.\n     * This is instantiatable by calling `new CubeLayer()`.\n     */\n    const CubeLayer = _CubeLayer;\n\n    var pi = Math.PI;\n\n    function expInOut(t) {\n      return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n    }\n\n    var tau = 2 * Math.PI;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getLayers(presenter, config, stage, lightSettings, lightingMix, interpolator, guideLines) {\n        const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n        const { x, y } = stage.axes;\n        const lines = concat(stage.gridLines, guideLines);\n        const texts = [...stage.textData];\n        [x, y].forEach(axes => {\n            axes.forEach(axis => {\n                if (axis.domain)\n                    lines.push(axis.domain);\n                if (axis.ticks)\n                    lines.push.apply(lines, axis.ticks);\n                if (axis.tickText)\n                    texts.push.apply(texts, axis.tickText);\n                if (axis.title)\n                    texts.push(axis.title);\n            });\n        });\n        if (stage.facets) {\n            stage.facets.forEach(f => {\n                if (f.lines)\n                    lines.push.apply(lines, f.lines);\n                if (f.facetTitle)\n                    texts.push(f.facetTitle);\n            });\n        }\n        const lineLayer = newLineLayer(layerNames.lines, lines);\n        const textLayer = newTextLayer(presenter, layerNames.text, texts, config, presenter.style.fontFamily);\n        return [textLayer, cubeLayer, lineLayer];\n    }\n    function newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings, lightingMix, interpolator) {\n        const getPosition = getTiming(config.transitionDurations.position, expInOut);\n        const getSize = getTiming(config.transitionDurations.size, expInOut);\n        const getColor = getTiming(config.transitionDurations.color);\n        const cubeLayerProps = {\n            interpolator,\n            lightingMix,\n            id: layerNames.cubes,\n            data: cubeData,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            pickable: true,\n            autoHighlight: true,\n            highlightColor,\n            onClick: (o, e) => {\n                config.onCubeClick(e && e.srcEvent, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onCube = false;\n                    config.onCubeHover(e && e.srcEvent, null);\n                }\n                else {\n                    presenter.deckgl.interactiveState.onCube = true;\n                    config.onCubeHover(e && e.srcEvent, o.object);\n                }\n            },\n            lightSettings,\n            transitions: {\n                getPosition,\n                getColor,\n                getSize\n            }\n        };\n        return new CubeLayer(cubeLayerProps);\n    }\n    function newLineLayer(id, data) {\n        return new base.layers.LineLayer({\n            id,\n            data,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            getColor: (o) => o.color,\n            getStrokeWidth: (o) => o.strokeWidth\n        });\n    }\n    function newTextLayer(presenter, id, data, config, fontFamily) {\n        const props = {\n            id,\n            data,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            autoHighlight: true,\n            pickable: true,\n            getHighlightColor: config.getTextHighlightColor || (o => o.color),\n            onClick: (o, e) => {\n                let pe = e && e.srcEvent;\n                //handle iOS event\n                if (e.center) {\n                    pe = { clientX: e.center.x, clientY: e.center.y };\n                }\n                config.onTextClick && config.onTextClick(pe, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onText = false;\n                }\n                else {\n                    presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n                }\n            },\n            getColor: config.getTextColor || (o => o.color),\n            getTextAnchor: o => o.textAnchor,\n            getSize: o => o.size,\n            getAngle: o => o.angle,\n            fontSettings: {\n                sdf: true,\n                fontSize: 128\n            }\n        };\n        if (fontFamily) {\n            props.fontFamily = fontFamily;\n        }\n        return new ChromaticTextLayer(props);\n    }\n    function getTiming(duration, easing) {\n        let timing;\n        if (duration) {\n            timing = {\n                duration\n            };\n            if (easing) {\n                timing.easing = easing;\n            }\n        }\n        return timing;\n    }\n    function getCubeLayer(deckProps) {\n        return deckProps.layers.filter(layer => layer.id === layerNames.cubes)[0];\n    }\n    function getCubes(deckProps) {\n        const cubeLayer = getCubeLayer(deckProps);\n        if (!cubeLayer)\n            return;\n        const cubeLayerProps = cubeLayer.props;\n        return cubeLayerProps.data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var util = /*#__PURE__*/Object.freeze({\n        addDiv: addDiv,\n        addEl: addEl,\n        clone: clone,\n        colorFromString: colorFromString,\n        colorIsEqual: colorIsEqual,\n        colorToString: colorToString,\n        deepMerge: deepMerge,\n        isColor: isColor,\n        getCubeLayer: getCubeLayer,\n        getCubes: getCubes,\n        outerSize: outerSize\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const markStager = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            var x1, y1, x2, y2;\n            x1 = item.x || 0;\n            y1 = item.y || 0;\n            x2 = item.x2 != null ? item.x2 : x1;\n            y2 = item.y2 != null ? item.y2 : y1;\n            const lineItem = styledLine(x1 + x - options.offsetX, y1 + y - options.offsetY, x2 + x - options.offsetX, y2 + y - options.offsetY, item.stroke, item.strokeWidth);\n            if (item.mark.role === 'axis-tick') {\n                options.currAxis.ticks.push(lineItem);\n            }\n            else if (item.mark.role === 'axis-domain') {\n                options.currAxis.domain = lineItem;\n            }\n            else {\n                stage.gridLines.push(lineItem);\n            }\n        });\n    };\n    function styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n        const line = {\n            sourcePosition: [x1, -y1, lineZ],\n            targetPosition: [x2, -y2, lineZ],\n            color: colorFromString(stroke),\n            strokeWidth: strokeWidth * 10 //translate width to deck.gl\n        };\n        return line;\n    }\n    function box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n        const lines = [\n            styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n            styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n            styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n            styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)\n        ];\n        if (diagonals) {\n            lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n            lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n        }\n        return lines;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * HTML elements outputted by the presenter.\n     */\n    var PresenterElement;\n    (function (PresenterElement) {\n        PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n        PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n        PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n        PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n        PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n    })(PresenterElement || (PresenterElement = {}));\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function initializePanel(presenter) {\n        const rootDiv = (createElement(\"div\", { className: className(PresenterElement.root, presenter) },\n            createElement(\"div\", { className: className(PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n            createElement(\"div\", { className: className(PresenterElement.panel, presenter) },\n                createElement(\"div\", { className: className(PresenterElement.vegaControls, presenter) }),\n                createElement(\"div\", { className: className(PresenterElement.legend, presenter) }))));\n        mount(rootDiv, presenter.el);\n    }\n    function className(type, presenter) {\n        return `${presenter.style.cssPrefix}${PresenterElement[type]}`;\n    }\n\n    function createOrbitControllerClass(factoryOptions) {\n        function wrapper(props) {\n            class OrbitControllerInternal extends base.deck._OrbitController {\n                constructor(props) {\n                    super(props);\n                    this.invertPan = true;\n                }\n                _onDoubleTap(event) {\n                    if (factoryOptions && factoryOptions.doubleClickHandler) {\n                        factoryOptions.doubleClickHandler(event, this);\n                    }\n                    else {\n                        super._onDoubleTap(event);\n                    }\n                }\n                _onPanRotate(event) {\n                    if (!this.dragRotate) {\n                        return false;\n                    }\n                    return this._onPanRotateStandard(event);\n                }\n            }\n            const instance = new OrbitControllerInternal(props);\n            return instance;\n        }\n        return wrapper;\n    }\n\n    //adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\n    const CANVAS_STYLE = {\n        position: 'absolute',\n        left: 0,\n        top: 0,\n        width: '100%',\n        height: '100%'\n    };\n    // Create canvas elements for map and deck\n    function createCanvas(props) {\n        let { container = document.body } = props;\n        if (typeof container === 'string') {\n            container = document.getElementById(container);\n        }\n        if (!container) {\n            throw Error('Deck: container not found');\n        }\n        // Add DOM elements\n        const containerStyle = window.getComputedStyle(container);\n        if (containerStyle.position === 'static') {\n            container.style.position = 'relative';\n        }\n        const deckCanvas = document.createElement('canvas');\n        container.appendChild(deckCanvas);\n        Object.assign(deckCanvas.style, CANVAS_STYLE);\n        return { container, deckCanvas };\n    }\n    /**\n     * Creates Deck.gl classes for rendering WebGL.\n     * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n     */\n    function createDeckGLClassesForPresenter(factoryOptions) {\n        const OrbitControllerClass = createOrbitControllerClass(factoryOptions);\n        //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n        //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n        function wrapper(props) {\n            /**\n             * @params container (Element) - DOM element to add deck.gl canvas to\n             * @params controller (Object) - Controller class. Leave empty for auto detection\n             */\n            class DeckGLInternal extends base.deck.Deck {\n                constructor(props = {}) {\n                    if (typeof document === 'undefined') {\n                        // Not browser\n                        throw Error('Deck can only be used in the browser');\n                    }\n                    const { deckCanvas } = createCanvas(props);\n                    const viewState = props.initialViewState || props.viewState || {};\n                    super(Object.assign({}, props, {\n                        width: '100%',\n                        height: '100%',\n                        canvas: deckCanvas,\n                        controller: OrbitControllerClass,\n                        initialViewState: viewState\n                    }));\n                    // Callback for the controller\n                    this._updateViewState = params => {\n                        if (this.onViewStateChange) {\n                            this.onViewStateChange(params);\n                        }\n                    };\n                }\n                setProps(props) {\n                    // this._updateViewState must be bound to `this`\n                    // but we don't have access to the current instance before calling super().\n                    if ('onViewStateChange' in props && this._updateViewState) {\n                        // This is called at least once at _onRendererInitialized\n                        this.onViewStateChange = props.onViewStateChange;\n                        props.onViewStateChange = this._updateViewState;\n                    }\n                    super.setProps(props);\n                }\n            }\n            const instance = new DeckGLInternal(props);\n            return instance;\n        }\n        return {\n            OrbitControllerClass,\n            DeckGL_Class: wrapper\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const LegendView = (props) => {\n        const rows = [];\n        const addRow = (row, i) => {\n            const fn = symbolMap[row.symbol.shape];\n            let jsx;\n            if (fn) {\n                jsx = fn(row.symbol);\n            }\n            else {\n                jsx = createElement(\"span\", null, \"x\");\n                //console.log(`need to render ${row.symbol.shape} symbol shape`);\n            }\n            rows.push({\n                cells: [\n                    { className: 'symbol', content: jsx },\n                    { className: 'label', content: row.label, title: row.label }\n                ]\n            });\n        };\n        var sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n        sorted.forEach(i => addRow(props.legend.rows[i], +i));\n        if (sorted.length) {\n            return (createElement(Table, { rows: rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\"tr\", { onClick: e => props.onClick(e, props.legend, null) },\n                createElement(\"th\", { colSpan: 2 }, props.legend.title))));\n        }\n    };\n    const symbolMap = {\n        square: function (symbol) {\n            return (createElement(\"div\", { style: {\n                    height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                    width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                    backgroundColor: symbol.fill,\n                    borderColor: symbol.fill\n                } }));\n        }\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function wrapper(props) {\n        class LinearInterpolatorInternal extends base.deck.LinearInterpolator {\n            constructor(transitionProps) {\n                super(transitionProps);\n            }\n            interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n                if (this.layerStartProps && this.layerEndProps) {\n                    this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n                }\n                return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n            }\n        }\n        const instance = new LinearInterpolatorInternal(props);\n        return instance;\n    }\n    const LinearInterpolator = wrapper;\n\n    function patchCubeArray(allocatedSize, empty, cubes) {\n        const patched = new Array(allocatedSize);\n        patched.fill(empty);\n        cubes.forEach(cube => patched[cube.ordinal] = cube);\n        return patched;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const legendMap = {\n        'legend-title': function (legend, textItem) {\n            legend.title = textItem.text;\n        },\n        'legend-symbol': function (legend, symbol) {\n            const { bounds, fill, shape } = symbol;\n            //this object is safe for serialization\n            const legendRowSymbol = { bounds, fill, shape };\n            const i = symbol.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            legend.rows[i].symbol = legendRowSymbol;\n        },\n        'legend-label': function (legend, label) {\n            const i = label.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            const row = legend.rows[i];\n            row.label = label.text;\n            row.value = label.datum.value;\n        }\n    };\n    const markStager$1 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const fn = legendMap[item.mark.role];\n            if (fn) {\n                fn(stage.legend, item);\n            }\n        });\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const markStager$2 = (options, stage, scene, x, y, groupType) => {\n        let i = 0;\n        base.vega.sceneVisit(scene, function (item) {\n            //for orthographic (2d) - always use 0 or else Deck will not show them\n            const z = stage.view === '2d' ? 0 : (item.z || 0);\n            const depth = (stage.view === '2d' ? 0 : (item.depth || 0)) + min3dDepth;\n            //change direction of y from SVG to GL\n            const ty = -1;\n            let ordinal = i;\n            if (item.datum.GL_ORDINAL !== void 0) {\n                options.ordinalsSpecified = true;\n                ordinal = item.datum.GL_ORDINAL;\n                if (ordinal > options.maxOrdinal) {\n                    options.maxOrdinal = ordinal;\n                }\n            }\n            const cube = {\n                ordinal,\n                size: [item.width, item.height, depth],\n                position: [x + (item.x || 0) - options.offsetX, ty * (y + (item.y || 0) - options.offsetY) - item.height, z],\n                color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n            };\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n            stage.cubeData.push(cube);\n            i++;\n        });\n    };\n\n    const markStager$3 = (options, stage, scene, x, y, groupType) => {\n        //scale Deck.Gl text to Vega size\n        const fontScale = 6;\n        //Deck.gl centers text on Y. TODO: is this correct on x axis?\n        const offsetYCenter = 16;\n        //change direction of y from SVG to GL\n        const ty = -1;\n        base.vega.sceneVisit(scene, function (item) {\n            if (!item.text)\n                return;\n            const size = item.fontSize * fontScale;\n            const textItem = {\n                color: colorFromString(item.fill),\n                text: item.text.toString(),\n                position: [x + item.x - options.offsetX, ty * (y + item.y + offsetYCenter - options.offsetY), 0],\n                size,\n                angle: convertAngle(item.angle),\n                textAnchor: convertAlignment(item.align),\n                alignmentBaseline: convertBaseline(item.baseline)\n            };\n            if (item.mark.role === 'axis-label') {\n                const tickText = textItem;\n                tickText.value = item.datum.value;\n                options.currAxis.tickText.push(tickText);\n            }\n            else if (item.mark.role === 'axis-title') {\n                options.currAxis.title = textItem;\n            }\n            else if (options.currFacetRect && !options.currFacetRect.facetTitle) {\n                options.currFacetRect.facetTitle = textItem;\n            }\n            else {\n                stage.textData.push(textItem);\n            }\n        });\n    };\n    function convertAngle(vegaTextAngle) {\n        if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n            return 360 - vegaTextAngle;\n        }\n        return 0;\n    }\n    function convertAlignment(textAlign) {\n        switch (textAlign) {\n            case 'center': return 'middle';\n            case 'left': return 'start';\n            case 'right': return 'end';\n        }\n        return 'start';\n    }\n    function convertBaseline(baseline) {\n        switch (baseline) {\n            case 'middle': return 'center';\n        }\n        return baseline || 'bottom';\n    }\n\n    var GroupType;\n    (function (GroupType) {\n        GroupType[GroupType[\"none\"] = 0] = \"none\";\n        GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n        GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n        GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n    })(GroupType || (GroupType = {}));\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function convertGroupRole(group) {\n        if (group.mark.role === 'legend')\n            return GroupType.legend;\n        if (group.mark.role === 'axis') {\n            var vegaAxisDatum = group.datum;\n            if (vegaAxisDatum) {\n                switch (vegaAxisDatum.orient) {\n                    case 'bottom':\n                    case 'top':\n                        return GroupType.xAxis;\n                    case 'left':\n                    case 'right':\n                        return GroupType.yAxis;\n                }\n            }\n        }\n    }\n    const group = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (g) {\n            if (g.bounds.x1 < options.offsetX) {\n                options.offsetX = g.bounds.x1;\n            }\n            if (g.bounds.y1 < options.offsetY) {\n                options.offsetY = g.bounds.y1;\n            }\n            const gx = g.x || 0, gy = g.y || 0;\n            if (g.context && g.context.background && !stage.backgroundColor) {\n                stage.backgroundColor = colorFromString(g.context.background);\n            }\n            if (g.stroke) {\n                const facetRect = {\n                    lines: box(gx + x - options.offsetX, gy + y - options.offsetY, g.height, g.width, g.stroke, groupStrokeWidth)\n                };\n                stage.facets.push(facetRect);\n                options.currFacetRect = facetRect;\n            }\n            groupType = convertGroupRole(g) || groupType;\n            setCurrentAxis(options, stage, groupType);\n            // draw group contents\n            base.vega.sceneVisit(g, function (item) {\n                mainStager(options, stage, item, gx + x, gy + y, groupType);\n            });\n        });\n    };\n    function setCurrentAxis(options, stage, groupType) {\n        let axes;\n        switch (groupType) {\n            case GroupType.xAxis:\n                axes = stage.axes.x;\n                break;\n            case GroupType.yAxis:\n                axes = stage.axes.y;\n                break;\n            default:\n                return;\n        }\n        options.currAxis = {\n            domain: null,\n            tickText: [],\n            ticks: []\n        };\n        axes.push(options.currAxis);\n    }\n    const markStagers = {\n        group,\n        legend: markStager$1,\n        rect: markStager$2,\n        rule: markStager,\n        text: markStager$3\n    };\n    var mainStager = (options, stage, scene, x, y, groupType) => {\n        if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n            markStager$1(options, stage, scene, x, y, groupType);\n        }\n        else {\n            var markStager$$1 = markStagers[scene.marktype];\n            if (markStager$$1) {\n                markStager$$1(options, stage, scene, x, y, groupType);\n            }\n        }\n    };\n    function sceneToStage(options, stage, scene) {\n        mainStager(options, stage, scene, 0, 0, null);\n        sortAxis(stage.axes.x, 0);\n        sortAxis(stage.axes.y, 1);\n    }\n    function sortAxis(axes, dim) {\n        axes.forEach(axis => {\n            if (axis.domain)\n                orderDomain(axis.domain, dim);\n            axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n            axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n        });\n    }\n    function orderDomain(domain, dim) {\n        if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n            const temp = domain.targetPosition;\n            domain.targetPosition = domain.sourcePosition;\n            domain.sourcePosition = temp;\n        }\n    }\n\n    const viewStateProps = ['distance', 'fov', 'lookAt', 'rotationOrbit', 'rotationX', 'zoom'];\n    function targetViewState(height, width, view) {\n        const distance = 10;\n        const fov = 60;\n        const lookAt = [width / 2, -height / 2, 0];\n        //add a 4th dimension to make transitions work\n        lookAt.push(1);\n        if (view === '2d') {\n            return {\n                distance,\n                fov,\n                lookAt,\n                rotationOrbit: 0,\n                rotationX: 0,\n                zoom: 10 / height\n            };\n        }\n        else {\n            return {\n                distance,\n                fov,\n                lookAt,\n                rotationOrbit: -25,\n                rotationX: 60,\n                zoom: 9 / height\n            };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    /**\n     * Class which presents a Stage of chart data using Deck.gl to render.\n     */\n    class Presenter {\n        /**\n         * Instantiate a new Presenter.\n         * @param el Parent HTMLElement to present within.\n         * @param style Optional PresenterStyle styling options.\n         */\n        constructor(el, style) {\n            this.el = el;\n            this.style = deepMerge(defaultPresenterStyle, style);\n            initializePanel(this);\n            this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n        }\n        /**\n         * Get the previously rendered Stage object.\n         */\n        get stage() {\n            return this._last.stage;\n        }\n        /**\n         * Get the current View camera type.\n         */\n        get view() {\n            return this._last.view;\n        }\n        /**\n         * Cancels any pending animation, calling animationCanceled() on original queue.\n         */\n        animationCancel() {\n            if (this.animationTimer) {\n                clearTimeout(this.animationTimer);\n                this.animationTimer = null;\n                if (this.logger) {\n                    this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n                }\n                if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                    this.queuedAnimationOptions.animationCanceled.call(null);\n                }\n            }\n        }\n        /**\n         * Stops the current animation and queues a new animation.\n         * @param handler Function to invoke when timeout is complete.\n         * @param timeout Length of time to wait before invoking the handler.\n         * @param options Optional QueuedAnimationOptions object.\n         */\n        animationQueue(handler, timeout, options) {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...`);\n            }\n            this.animationCancel();\n            this.animationTimer = setTimeout(() => {\n                if (this.logger) {\n                    this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n                }\n                handler();\n            }, timeout);\n        }\n        /**\n         * Retrieve a sub-element of the rendered output.\n         * @param type PresenterElement type of the HTMLElement to retrieve.\n         */\n        getElement(type) {\n            const elements = this.el.getElementsByClassName(className(type, this));\n            if (elements && elements.length) {\n                return elements[0];\n            }\n        }\n        /**\n         * Present the Vega Scene, or Stage object using Deck.gl.\n         * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n         * @param height Height of the rendering area.\n         * @param width Width of the rendering area.\n         * @param config Optional presentation configuration object.\n         */\n        present(sceneOrStage, height, width, config) {\n            this.animationCancel();\n            let scene = sceneOrStage;\n            let stage;\n            let options = {\n                offsetX: 0,\n                offsetY: 0,\n                maxOrdinal: -1,\n                ordinalsSpecified: false,\n                currAxis: null,\n                currFacetRect: null,\n                defaultCubeColor: this.style.defaultCubeColor\n            };\n            //determine if this is a vega scene\n            if (scene.marktype) {\n                stage = createStage(scene.view);\n                sceneToStage(options, stage, scene);\n            }\n            else {\n                stage = sceneOrStage;\n            }\n            if (!this.deckgl) {\n                const classes = createDeckGLClassesForPresenter({\n                    doubleClickHandler: () => {\n                        this.homeCamera();\n                    }\n                });\n                this.OrbitControllerClass = classes.OrbitControllerClass;\n                const deckProps = {\n                    onLayerClick: config && config.onLayerClick,\n                    views: [new base.deck.OrbitView({ controller: this.OrbitControllerClass })],\n                    container: this.getElement(PresenterElement.gl),\n                    getCursor: (interactiveState) => {\n                        if (interactiveState.onText || interactiveState.onAxisSelection) {\n                            return 'pointer';\n                        }\n                        else if (interactiveState.onCube) {\n                            return 'default';\n                        }\n                        else {\n                            return 'grab';\n                        }\n                    }\n                };\n                if (stage.backgroundColor) {\n                    deckProps.style = { 'background-color': colorToString(stage.backgroundColor) };\n                }\n                this.deckgl = new classes.DeckGL_Class(deckProps);\n            }\n            let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n            if (options.ordinalsSpecified) {\n                cubeCount = Math.max(cubeCount, options.maxOrdinal + 1);\n                const empty = {\n                    isEmpty: true,\n                    color: [0, 0, 0, 0] // possibly a bug in Deck.gl? set color to invisible.\n                };\n                stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n            }\n            this.setDeckProps(stage, height, width, cubeCount, config);\n            mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement.legend));\n            if (config && config.onPresent) {\n                config.onPresent();\n            }\n        }\n        /**\n         * Present the same recently rendered Stage with only slight modifications such as a color change,\n         * using the previous Stage values as a basis.\n         * @param stage Partially populated Stage object containing changes.\n         * @param modifyConfig Optional presentation configuration object.\n         */\n        rePresent(stage, modifyConfig) {\n            const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n            this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n        }\n        isNewBounds(view, height, width, cubeCount) {\n            const lastBounds = this.lastBounds();\n            for (let prop in lastBounds) {\n                if (lastBounds[prop] === null)\n                    return true;\n            }\n            const newBounds = { cubeCount, height, view, width };\n            for (let prop in lastBounds) {\n                if (lastBounds[prop] !== newBounds[prop])\n                    return true;\n            }\n        }\n        lastBounds() {\n            const { cubeCount, height, view, width } = this._last;\n            return { cubeCount, height, view, width };\n        }\n        setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n            const config = deepMerge(defaultPresenterConfig, modifyConfig);\n            const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n            let lightSettings = this.style.lightSettings[stage.view];\n            let lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n            let linearInterpolator;\n            //choose the current OrbitView viewstate if possible\n            let viewState = (this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView)\n                //otherwise use the initial viewstate if any\n                || this.deckgl.props.viewState;\n            if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n                viewState = targetViewState(height, width, stage.view);\n                const oldCubeLayer = getCubeLayer(this.deckgl.props);\n                if (oldCubeLayer) {\n                    linearInterpolator = new LinearInterpolator(viewStateProps);\n                    linearInterpolator.layerStartProps = { lightingMix: oldCubeLayer.props.lightingMix };\n                    linearInterpolator.layerEndProps = { lightingMix };\n                    viewState.transitionDuration = config.transitionDurations.view;\n                    viewState.transitionEasing = expInOut;\n                    viewState.transitionInterpolator = linearInterpolator;\n                }\n                if (stage.view === '2d') {\n                    lightSettings = this.style.lightSettings['3d'];\n                }\n            }\n            const guideLines = this._showGuides && box(0, 0, height, width, '#0f0', 1, true);\n            config.preLayer && config.preLayer(stage);\n            const layers = getLayers(this, config, stage, lightSettings, lightingMix, linearInterpolator, guideLines);\n            const deckProps = {\n                views: [new base.deck.OrbitView({ controller: this.OrbitControllerClass })],\n                viewState,\n                layers\n            };\n            if (config && config.preStage) {\n                config.preStage(stage, deckProps);\n            }\n            this.deckgl.setProps(deckProps);\n            delete stage.cubeData;\n            this._last = {\n                cubeCount,\n                height,\n                width,\n                stage: stage,\n                view: stage.view\n            };\n        }\n        /**\n         * Home the camera to the last initial position.\n         */\n        homeCamera() {\n            const viewState = targetViewState(this._last.height, this._last.width, this._last.view);\n            viewState.transitionDuration = defaultPresenterConfig.transitionDurations.view;\n            viewState.transitionEasing = expInOut;\n            viewState.transitionInterpolator = new LinearInterpolator(viewStateProps);\n            const deckProps = {\n                views: this.deckgl.props.views,\n                viewState,\n                layers: this.deckgl.props.layers\n            };\n            this.deckgl.setProps(deckProps);\n        }\n        /**\n         * Get cube data array from the cubes layer.\n         */\n        getCubeData() {\n            return getCubes(this.deckgl.props);\n        }\n        /**\n         * Show guidelines of rendering height/width and center of OrbitView.\n         */\n        showGuides() {\n            this._showGuides = true;\n            this.getElement(PresenterElement.gl).classList.add('show-center');\n            this.rePresent(Object.assign(Object.assign({}, this._last.stage), { cubeData: this.getCubeData() }));\n        }\n        finalize() {\n            this.animationCancel();\n            if (this.deckgl)\n                this.deckgl.finalize();\n            if (this.el)\n                this.el.innerHTML = '';\n            this._last = null;\n            this.deckgl = null;\n            this.el = null;\n            this.logger = null;\n            this.queuedAnimationOptions = null;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    //pass in the SuperClass, which should be a vega.View\n    function _RendererGl(loader) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class RendererGlInternal extends base.vega.Renderer {\n            initialize(el, width, height, origin) {\n                this.height = height;\n                this.width = width;\n                // this method will invoke resize to size the canvas appropriately\n                return super.initialize(el, width, height, origin);\n            }\n            resize(width, height, origin) {\n                super.resize(width, height, origin);\n                this.origin = origin;\n                this.height = height;\n                this.width = width;\n                //rteturn this for vega\n                return this;\n            }\n            _render(scene, items) {\n                const scene3d = scene;\n                scene3d.view = this.getView();\n                this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n                //return this for vega\n                return this;\n            }\n        }\n        const instance = new RendererGlInternal(loader);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n     * This is instantiated by ViewGl.\n     */\n    const RendererGl = _RendererGl;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    let registered = false;\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n    //pass in the SuperClass, which should be a vega.View\n    function _ViewGl(runtime, config) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class ViewGlInternal extends base.vega.View {\n            constructor(runtime, config = {}) {\n                super(runtime, config);\n                this.config = config;\n                this.presenter = config.presenter;\n                config.presenterConfig = config.presenterConfig || {};\n                config.presenterConfig.redraw = () => {\n                    this._redraw = true; //use Vega View private member _redraw\n                    this.run();\n                };\n            }\n            renderer(renderer) {\n                if (renderer === 'deck.gl' && !registered) {\n                    base.vega.renderModule('deck.gl', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                    registered = true;\n                }\n                return super.renderer(renderer);\n            }\n            initialize(el) {\n                if (!this.presenter) {\n                    this.presenter = new Presenter(el);\n                }\n                super.initialize(this.presenter.getElement(PresenterElement.vegaControls));\n                const renderer = this._renderer;\n                renderer.presenterConfig = this.config.presenterConfig;\n                renderer.presenter = this.presenter;\n                renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView);\n                return this;\n            }\n            error(e) {\n                if (this.presenter.logger) {\n                    this.presenter.logger(e);\n                }\n            }\n        }\n        const instance = new ViewGlInternal(runtime, config);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.View, with added properties for accessing a Presenter.\n     * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n     */\n    const ViewGl = _ViewGl;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var index$2 = /*#__PURE__*/Object.freeze({\n        constants: constants$1,\n        controls: controls,\n        defaults: defaults,\n        types: types$1,\n        util: util,\n        base: base,\n        use: use,\n        Presenter: Presenter,\n        ViewGl: ViewGl,\n        get PresenterElement () { return PresenterElement; }\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function isQuantitative(column) {\n        return column.type === 'number' || column.type === 'integer';\n    }\n    /**\n     * Derive column metadata from the data array.\n     * @param data Array of data objects.\n     */\n    function getColumnsFromData(data, columnTypes) {\n        const sample = data[0];\n        const fields = sample ? Object.keys(sample) : [];\n        const inferences = Object.assign(Object.assign({}, base.vega.inferTypes(data, fields)), columnTypes);\n        const columns = fields.map(name => {\n            const column = {\n                name,\n                type: inferences[name]\n            };\n            return column;\n        });\n        inferAll(columns, data);\n        return columns;\n    }\n    /**\n     * Populate columns with type inferences and stats.\n     * @param columns Array of columns.\n     * @param data Array of data objects.\n     */\n    function inferAll(columns, data) {\n        columns.forEach(column => {\n            if (column) {\n                if (typeof column.quantitative !== 'boolean') {\n                    column.quantitative = isQuantitative(column);\n                }\n                if (column.type === 'string') {\n                    checkIsColorData(data, column);\n                }\n                if (!column.stats) {\n                    column.stats = getStats(data, column);\n                }\n            }\n        });\n    }\n    function checkIsColorData(data, column) {\n        for (let i = 0; i < data.length; i++) {\n            if (!isColor(data[i][column.name])) {\n                return;\n            }\n        }\n        column.isColorData = true;\n    }\n    function getStats(data, column) {\n        const distinctMap = {};\n        const stats = {\n            distinctValueCount: null,\n            max: null,\n            mean: null,\n            min: null\n        };\n        let sum = 0;\n        for (let i = 0; i < data.length; i++) {\n            let row = data[i];\n            let value = row[column.name];\n            distinctMap[value] = true;\n            if (stats.max === null || value > stats.max) {\n                stats.max = value;\n            }\n            if (stats.min === null || value < stats.min) {\n                stats.min = value;\n            }\n            let num = +value;\n            if (!isNaN(num)) {\n                sum += num;\n            }\n            if (column.type === 'string' && !stats.hasColorData && isColor(value)) {\n                stats.hasColorData = true;\n            }\n        }\n        if (column.quantitative) {\n            stats.mean = data.length > 0 && (sum / data.length);\n            stats.hasNegative = detectNegative(column, data);\n            if (column.type === 'integer') {\n                stats.isSequential = detectSequentialColumn(column, data);\n            }\n        }\n        stats.distinctValueCount = Object.keys(distinctMap).length;\n        return stats;\n    }\n    function detectNegative(column, data) {\n        for (let i = 1; i < data.length; i++) {\n            if (data[i][column.name] < 0)\n                return true;\n        }\n        return false;\n    }\n    function detectSequentialColumn(column, data) {\n        if (data.length < 2)\n            return false;\n        let colname = column.name;\n        for (let i = 1; i < data.length; i++) {\n            if (data[i][colname] !== data[i - 1][colname] + 1)\n                return false;\n        }\n        return true;\n    }\n\n    const defaultViewerOptions = {\n        colors: {\n            activeCube: [128, 0, 128, 255],\n            defaultCube: defaultPresenterStyle.defaultCubeColor,\n            hoveredCube: defaultPresenterStyle.highlightColor,\n            selectedCube: [255, 255, 0, 255],\n            axisSelectHighlight: [128, 128, 128, 128],\n            axisLine: [0, 0, 0, 255],\n            axisText: [0, 0, 0, 255],\n            cellFillerLine: [128, 128, 128, 255],\n            unselectedColorMethod: (color) => {\n                const c = desaturate(color, 0.05);\n                c[3] = 171;\n                return c;\n            }\n        },\n        language: {\n            headers: {\n                chart: 'Chart',\n                details: 'Details',\n                legend: 'Legend',\n                selection: 'Select & Filter'\n            },\n            bing: 'bing',\n            newColorMap: 'remap color to filtered items',\n            oldColorMap: 'keep same colors',\n            deselect: 'deselect',\n            exclude: 'exclude',\n            isolate: 'isolate',\n            legendOther: 'other',\n            nextDetail: '>',\n            previousDetail: '<',\n            reset: 'reset',\n            colorBinCount: 'Color bin count',\n            colorReverse: 'Color reverse',\n            count: 'Count',\n            scatterPointSize: 'Point size',\n            XBinSize: 'X axis bin size',\n            YBinSize: 'Y axis bin size',\n            XGridSize: 'X grid size',\n            YGridSize: 'Y grid size',\n            InnerPaddingSize: 'Inner padding size',\n            OuterPaddingSize: 'Outer padding size',\n            treeMapMethod: 'Method',\n            facetColumns: 'Facet columns',\n            facetRows: 'Facet rows',\n            markOpacitySignal: 'Mark opacity',\n            textScaleSignal: 'Text scale',\n            xAxisTextAngleSignal: 'X axis text angle',\n            yAxisTextAngleSignal: 'Y axis text angle',\n            zScaleProportion: 'Z scale proportion to Y',\n            selectionCount: count => `${count} items selected`\n        },\n        maxLegends: 19,\n        onError: (errors) => {\n            //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n        },\n        transitionDurations: Object.assign(Object.assign({}, defaultPresenterConfig.transitionDurations), { scope: 600 }),\n        selectionPolygonZ: -1,\n        tickSize: 10,\n        facetMargins: {\n            column: 40,\n            row: 40,\n            title: 40\n        }\n    };\n    function getPresenterStyle(options) {\n        var style = {\n            cssPrefix,\n            fontFamily: options.fontFamily,\n            defaultCubeColor: options.colors.defaultCube\n        };\n        if (options.colors.hoveredCube) {\n            style.highlightColor = options.colors.hoveredCube;\n        }\n        if (options.lightSettings) {\n            style.lightSettings = options.lightSettings;\n        }\n        return style;\n    }\n    const cssPrefix = 'sanddance-';\n    const dualColorSchemeColors = {\n        black: '#212121',\n        gray: '#D2D2D2',\n        blue: '#0060F0',\n        green: '#00C000',\n        orange: '#FF9900',\n        red: '#E00000'\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function isInternalFieldName(columnName, includeVegaDeckGLFields = false) {\n        if (includeVegaDeckGLFields) {\n            if (columnName === GL_ORDINAL)\n                return true;\n        }\n        for (let f in FieldNames) {\n            if (columnName === FieldNames[f])\n                return true;\n        }\n        return false;\n    }\n\n    var util$1 = /*#__PURE__*/Object.freeze({\n        isInternalFieldName: isInternalFieldName,\n        getColumnsFromData: getColumnsFromData,\n        inferAll: inferAll,\n        ensureSearchExpressionGroupArray: ensureSearchExpressionGroupArray,\n        getPresenterStyle: getPresenterStyle\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const dualPairs = [\n        [dualColorSchemeColors.black, dualColorSchemeColors.gray],\n        [dualColorSchemeColors.red, dualColorSchemeColors.green],\n        [dualColorSchemeColors.red, dualColorSchemeColors.blue],\n        [dualColorSchemeColors.black, dualColorSchemeColors.red],\n        [dualColorSchemeColors.black, dualColorSchemeColors.orange],\n        [dualColorSchemeColors.black, dualColorSchemeColors.green]\n    ];\n    /**\n     * Array of color schemes.\n     */\n    const colorSchemes = [\n        {\n            scheme: ColorScaleNone,\n            colors: [colorToString(defaultViewerOptions.colors.defaultCube)]\n        }\n    ];\n    createDualColorSchemes();\n    function registerColorSchemes(vega) {\n        colorSchemes.forEach(cs => {\n            if (cs.colors.length === 1) {\n                vega.scheme(cs.scheme, x => cs.colors[0]);\n            }\n            else {\n                vega.scheme(cs.scheme, cs.colors);\n            }\n        });\n    }\n    function createPair(names, colors) {\n        const scheme = `dual_${names[0]}${names[1]}`;\n        colorSchemes.push({ scheme, colors });\n    }\n    function createDualColorSchemes() {\n        dualPairs.forEach(colors => {\n            const names = colors.map(color => {\n                for (let key in dualColorSchemeColors)\n                    if (color === dualColorSchemeColors[key])\n                        return key;\n            });\n            createPair(names, colors);\n            createPair([...names].reverse(), [...colors].reverse());\n        });\n    }\n\n    var DataLayoutChange;\n    (function (DataLayoutChange) {\n        DataLayoutChange[DataLayoutChange[\"same\"] = 0] = \"same\";\n        DataLayoutChange[DataLayoutChange[\"reset\"] = 1] = \"reset\";\n        DataLayoutChange[DataLayoutChange[\"refine\"] = 2] = \"refine\";\n    })(DataLayoutChange || (DataLayoutChange = {}));\n    class Animator {\n        constructor(dataScope, props) {\n            this.dataScope = dataScope;\n            this.props = props;\n        }\n        select(search) {\n            return new Promise((resolve, reject) => {\n                this.dataScope.select(search);\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        deselect() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deselect();\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        filter(search, keepData, collapseData) {\n            this.dataScope.collapse(true, collapseData);\n            return new Promise((resolve, reject) => {\n                this.props.onAnimateDataChange(DataLayoutChange.refine, 'before refine', 'refine').then(() => {\n                    this.dataScope.deselect();\n                    this.dataScope.filteredData = keepData;\n                    this.props.onDataChanged(DataLayoutChange.refine, search);\n                    resolve();\n                }).catch(reject);\n            });\n        }\n        reset() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deselect();\n                this.dataScope.filteredData = null;\n                this.props.onAnimateDataChange(DataLayoutChange.reset, 'before reset', 'reset').then(() => {\n                    this.dataScope.collapse(false);\n                    this.props.onDataChanged(DataLayoutChange.reset);\n                    resolve();\n                }).catch(reject);\n            });\n        }\n        activate(datum) {\n            return new Promise((resolve, reject) => {\n                this.dataScope.activate(datum);\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        deactivate() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deactivate();\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSelectedColorMap(currentData, showSelectedData, showActive, viewerOptions) {\n        function getSelectionColorItem(datum) {\n            let item;\n            if (showSelectedData) {\n                item = datum[FieldNames.Selected] ?\n                    { color: viewerOptions.colors.selectedCube }\n                    :\n                        { unSelected: true };\n            }\n            if (showActive && datum[FieldNames.Active]) {\n                item = { color: viewerOptions.colors.activeCube };\n            }\n            return item;\n        }\n        const colorMap = {};\n        currentData.forEach(datum => {\n            const selectionColor = getSelectionColorItem(datum);\n            if (selectionColor) {\n                const ordinal = datum[GL_ORDINAL];\n                colorMap[ordinal] = selectionColor;\n            }\n        });\n        return colorMap;\n    }\n    function colorMapFromCubes(cubes) {\n        const map = {};\n        cubes.forEach(cube => {\n            map[cube.ordinal] = { color: cube.color };\n        });\n        return map;\n    }\n    function populateColorContext(colorContext, presenter) {\n        if (!colorContext.colorMap) {\n            const cubes = presenter.getCubeData();\n            colorContext.colorMap = colorMapFromCubes(cubes);\n        }\n        colorContext.legend = clone(presenter.stage.legend);\n        colorContext.legendElement = presenter.getElement(PresenterElement.legend).children[0];\n    }\n    function applyColorMapToCubes(maps, cubes, unselectedColorMethod) {\n        Object.keys(maps[0]).forEach(ordinal => {\n            const cube = cubes[+ordinal];\n            if (cube && !cube.isEmpty) {\n                const actualColorMappedItem = maps[0][ordinal];\n                if (maps.length > 1) {\n                    const selectedColorMappedItem = maps[1][ordinal];\n                    if (selectedColorMappedItem) {\n                        if (selectedColorMappedItem.unSelected && unselectedColorMethod) {\n                            cube.color = unselectedColorMethod(actualColorMappedItem.color);\n                        }\n                        else {\n                            cube.color = selectedColorMappedItem.color;\n                        }\n                        return;\n                    }\n                }\n                cube.color = actualColorMappedItem.color;\n            }\n        });\n    }\n\n    function applySignalValues(sv, b) {\n        if (!sv || !b || !b.signals || !b.signals.length)\n            return;\n        for (let key in sv) {\n            let value = sv[key];\n            let signalB = b.signals.filter(signal => signal.name === key)[0];\n            if (signalB && signalB.bind) {\n                signalB.value = value;\n            }\n        }\n    }\n    function extractSignalValuesFromView(view, spec) {\n        if (!view || !spec || !spec.signals || !spec.signals.length)\n            return;\n        const result = {};\n        spec.signals.forEach((signalA) => {\n            //bound to a UI control\n            if (signalA.bind) {\n                try {\n                    result[signalA.name] = view.signal(signalA.name);\n                }\n                catch (e) {\n                    // continue regardless of error\n                }\n            }\n        });\n        return result;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function assignOrdinals(columns, data, ordinalMap) {\n        const uCol = columns.uid && columns.uid.name;\n        if (ordinalMap) {\n            data.forEach((d, i) => {\n                const key = uCol ? d[uCol] : i;\n                d[GL_ORDINAL] = ordinalMap[key];\n            });\n        }\n        else {\n            ordinalMap = {};\n            data.forEach((d, i) => {\n                d[GL_ORDINAL] = i;\n                const uColValue = uCol ? d[uCol] : i;\n                ordinalMap[uColValue] = i;\n            });\n        }\n        return ordinalMap;\n    }\n    function getSpecColumns(insight, columns) {\n        function getColumnByName(name) {\n            return columns.filter(c => c.name === name)[0];\n        }\n        return {\n            color: getColumnByName(insight.columns && insight.columns.color),\n            facet: getColumnByName(insight.columns && insight.columns.facet),\n            group: getColumnByName(insight.columns && insight.columns.group),\n            size: getColumnByName(insight.columns && insight.columns.size),\n            sort: getColumnByName(insight.columns && insight.columns.sort),\n            uid: getColumnByName(insight.columns && insight.columns.uid),\n            x: getColumnByName(insight.columns && insight.columns.x),\n            y: getColumnByName(insight.columns && insight.columns.y),\n            z: getColumnByName(insight.columns && insight.columns.z)\n        };\n    }\n    function getDataIndexOfCube(cube, data) {\n        const len = data.length;\n        for (let i = 0; i < len; i++) {\n            if (data[i][GL_ORDINAL] === cube.ordinal) {\n                return i;\n            }\n        }\n    }\n\n    const FacetColumnsSequence = 'FacetColumnsSequence';\n    const FacetRowsSequence = 'FacetRowsSequence';\n    const SequenceNumber = 'SequenceNumber';\n    const CellTitle = 'CellTitle';\n    const CellFiller = 'CellFiller';\n    const facetTitleSeparator = ' - ';\n    function facetSignals(context) {\n        const { insight } = context;\n        const { facets } = insight;\n        const signals = [\n            {\n                name: SignalNames.FacetColumns,\n                value: facets.columns,\n            },\n            {\n                name: SignalNames.FacetRows,\n                value: facets.rows,\n            }\n        ];\n        return signals;\n    }\n    function checkForFacetErrors(facets, errors) {\n        if (facets) {\n            const gridCapacity = facets.columns * facets.rows;\n            if (!gridCapacity) {\n                errors.push('Must set facets columns & rows to non-zero.');\n            }\n            if (gridCapacity < 2) {\n                errors.push('Not enough facets to facet.');\n            }\n            if (!facets.columns || facets.columns < 1) {\n                errors.push('Facet column columns must be greater than 1.');\n            }\n            if (!facets.rows || facets.rows < 1) {\n                errors.push('Facet column rows must be greater than 1.');\n            }\n        }\n    }\n    function facetSize(context) {\n        const { insight, specViewOptions } = context;\n        const { facets, size } = insight;\n        return {\n            height: (size.height - (facets.rows + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.column)) / facets.columns,\n            width: (size.width - (facets.columns + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.row)) / facets.rows,\n        };\n    }\n    function layout(context) {\n        const { specViewOptions } = context;\n        const layout = {\n            columns: {\n                signal: SignalNames.FacetColumns\n            },\n            bounds: 'full',\n            padding: {\n                column: specViewOptions.facetMargins.column,\n                row: specViewOptions.facetMargins.row\n            }\n        };\n        return layout;\n    }\n    function facetBinStep(facetColumn, facetCount) {\n        const range = facetColumn.stats.max - facetColumn.stats.min;\n        return range / facetCount;\n    }\n    function emptyBinsDataSource(name, facetColumn, facets) {\n        const gridCapacity = facets.columns * facets.rows;\n        const step = facetBinStep(facetColumn, gridCapacity);\n        const steps = [];\n        for (let i = 0; i < gridCapacity; i++) {\n            steps[i] = facetColumn.stats.min + i * step + step / 2;\n        }\n        const values = steps.map(s => {\n            const obj = {};\n            obj[FieldNames.Collapsed] = true;\n            obj[facetColumn.name] = s;\n            return obj;\n        });\n        const data = { name, values };\n        return data;\n    }\n    function facetSourceData(facetColumn, facets, name) {\n        let data;\n        if (facetColumn && facetColumn.quantitative) {\n            data = [\n                {\n                    name: DataNames.Pre\n                },\n                emptyBinsDataSource(DataNames.EmptyBin, facetColumn, facets),\n                {\n                    name,\n                    source: [DataNames.Pre, DataNames.EmptyBin]\n                }\n            ];\n        }\n        else {\n            data = [{ name }];\n        }\n        return data;\n    }\n    function facetGroupData(source) {\n        const data = [\n            {\n                name: DataNames.FacetCellTitles,\n                source,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: [CellTitle]\n                    }\n                ]\n            },\n            {\n                name: CellFiller,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 0,\n                        step: 1,\n                        stop: { signal: `${SignalNames.FacetColumns} * ${SignalNames.FacetRows} - length(data('${DataNames.FacetCellTitles}'))` }\n                    }\n                ]\n            },\n            {\n                name: FacetColumnsSequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 0,\n                        stop: {\n                            signal: SignalNames.FacetColumns\n                        },\n                        as: SequenceNumber\n                    }\n                ]\n            },\n            {\n                name: FacetRowsSequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 0,\n                        stop: {\n                            signal: SignalNames.FacetRows\n                        },\n                        as: SequenceNumber\n                    }\n                ]\n            }\n        ];\n        return data;\n    }\n    function facetTransforms(facetColumn, facets) {\n        let transforms;\n        if (facetColumn.quantitative) {\n            const gridCapacity = facets.columns * facets.rows;\n            const step = facetBinStep(facetColumn, gridCapacity);\n            transforms = [\n                {\n                    type: 'bin',\n                    field: facetColumn.name,\n                    step,\n                    nice: false,\n                    extent: [facetColumn.stats.min, facetColumn.stats.max],\n                    as: [\n                        FieldNames.FacetBin0,\n                        FieldNames.FacetBin1\n                    ]\n                },\n                {\n                    type: 'collect',\n                    sort: {\n                        field: FieldNames.FacetBin0\n                    }\n                },\n                {\n                    type: 'formula',\n                    expr: `format(datum.${FieldNames.FacetBin0}, '~r') + '${facetTitleSeparator}' + format(datum.${FieldNames.FacetBin1}, '~r')`,\n                    as: CellTitle\n                }\n            ];\n        }\n        else {\n            transforms = [\n                {\n                    type: 'formula',\n                    expr: `datum[${JSON.stringify(facetColumn.name)}]`,\n                    as: CellTitle\n                }\n            ];\n        }\n        return transforms;\n    }\n    function facetMarks(specViewOptions, sourceDataName, childMarks, childAxes, childData) {\n        //TODO: create a style\n        const cellFillerLineColor = colorToString(specViewOptions.colors.cellFillerLine);\n        const style = 'cell';\n        const mark = {\n            style,\n            type: 'group',\n            from: {\n                facet: {\n                    name: DataNames.FacetGroupCell,\n                    data: sourceDataName,\n                    groupby: [CellTitle]\n                }\n            },\n            title: {\n                frame: 'group',\n                offset: specViewOptions.facetMargins.title,\n                text: {\n                    signal: `parent['${CellTitle}']`\n                },\n                limit: {\n                    signal: 'width'\n                },\n                color: colorToString(specViewOptions.colors.axisText),\n                fontSize: {\n                    signal: SignalNames.TextSize\n                }\n            },\n            encode: {\n                update: {\n                    width: {\n                        signal: 'width'\n                    },\n                    height: {\n                        signal: 'height'\n                    }\n                }\n            },\n            data: childData,\n            marks: childMarks.map(mark => {\n                if (mark.from && mark.from.data && mark.from.data === sourceDataName) {\n                    mark.from.data = DataNames.FacetGroupCell;\n                }\n                return mark;\n            })\n        };\n        if (childAxes) {\n            mark.axes = childAxes.map(axis => {\n                const clone$$1 = clone(axis);\n                //remove all labels and titles\n                clone$$1.labels = false;\n                delete clone$$1.title;\n                delete clone$$1.titleAlign;\n                delete clone$$1.titleAngle;\n                delete clone$$1.titleFontSize;\n                return clone$$1;\n            });\n        }\n        const filler = {\n            style: 'cell',\n            type: 'group',\n            from: { data: CellFiller },\n            title: {\n                frame: 'group',\n                offset: specViewOptions.facetMargins.title,\n                text: '',\n                fontSize: {\n                    signal: SignalNames.TextSize\n                }\n            },\n            encode: {\n                update: {\n                    width: { signal: 'width' },\n                    height: { signal: 'height' }\n                }\n            }\n        };\n        if (childAxes) {\n            filler.axes = childAxes.map(axis => {\n                const clone$$1 = clone(axis);\n                //remove all labels and titles\n                clone$$1.labels = false;\n                delete clone$$1.title;\n                delete clone$$1.titleAlign;\n                delete clone$$1.titleAngle;\n                delete clone$$1.titleFontSize;\n                //change tick & domain color\n                clone$$1.tickColor = cellFillerLineColor;\n                clone$$1.domainColor = cellFillerLineColor;\n                return clone$$1;\n            });\n        }\n        const rowHeader = {\n            type: 'group',\n            role: 'row-header',\n            from: {\n                facet: {\n                    name: 'row-headers',\n                    data: FacetRowsSequence,\n                    groupby: [\n                        SequenceNumber\n                    ]\n                }\n            }\n        };\n        if (childAxes) {\n            rowHeader.axes = [\n                cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'left')[0], specViewOptions.facetMargins.column)\n            ];\n        }\n        const columnFooter = {\n            type: 'group',\n            role: 'column-footer',\n            from: {\n                facet: {\n                    name: 'column-footers',\n                    data: FacetColumnsSequence,\n                    groupby: [\n                        SequenceNumber\n                    ]\n                }\n            }\n        };\n        if (childAxes) {\n            columnFooter.axes = [\n                cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'bottom')[0], specViewOptions.facetMargins.row)\n            ];\n        }\n        const marks = [\n            mark,\n            filler,\n            rowHeader,\n            columnFooter\n        ];\n        return marks;\n    }\n    function cloneAndOffsetAxis(axis, margin) {\n        if (axis) {\n            const clone$$1 = clone(axis);\n            clone$$1.offset = margin;\n            return clone$$1;\n        }\n    }\n\n    function notNice(niceValue) {\n        //convert \"nice\" numbers to numeric value\n        return (niceValue + '').replace(/,/g, '');\n    }\n    function tickValue(axis, i) {\n        const tick = axis.tickText[i];\n        let value;\n        if (tick) {\n            value = axis.tickText[i].value;\n        }\n        return { tick, value };\n    }\n    function selectNullOrEmpty(column) {\n        const searchExpression = {\n            name: column.name,\n            operator: 'isnullorEmpty'\n        };\n        return searchExpression;\n    }\n    function selectExact(column, value) {\n        if (value == null) {\n            return selectNullOrEmpty(column);\n        }\n        const searchExpression = {\n            name: column.name,\n            operator: '==',\n            value\n        };\n        return searchExpression;\n    }\n    function selectNone(column, values) {\n        const expressions = values.map((value, i) => {\n            const searchExpression = {\n                name: column.name,\n                operator: '!=',\n                value\n            };\n            if (i) {\n                searchExpression.clause = '&&';\n            }\n            return searchExpression;\n        });\n        const searchExpressionGroup = {\n            expressions\n        };\n        return searchExpressionGroup;\n    }\n    function selectExactAxis(axis, column, i) {\n        const result = tickValue(axis, i);\n        if (result.tick) {\n            return selectExact(column, result.value);\n        }\n    }\n    function selectBetween(column, lowValue, highValue, lowOperator = '>=', highOperator = '<') {\n        const expressions = [];\n        if (lowValue !== undefined) {\n            expressions.push({\n                name: column.name,\n                operator: lowOperator,\n                value: lowValue\n            });\n        }\n        if (highValue !== undefined) {\n            expressions.push({\n                name: column.name,\n                operator: highOperator,\n                value: highValue\n            });\n        }\n        if (expressions.length > 1) {\n            expressions[1].clause = '&&';\n        }\n        const searchExpressionGroup = {\n            expressions\n        };\n        return searchExpressionGroup;\n    }\n    function selectBetweenAxis(axis, column, i) {\n        const low = tickValue(axis, i);\n        const high = tickValue(axis, i + 1);\n        return selectBetween(column, low.value, high.value);\n    }\n    function selectBetweenFacet(column, title, isFirst, isLast) {\n        const values = title.split(facetTitleSeparator);\n        return selectBetween(column, isFirst ? undefined : values[0], isLast ? undefined : values[1]);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function axisSelectionLayer(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n        const polygons = [];\n        const xRole = specCapabilities.roles.filter(r => r.role === 'x')[0];\n        if (xRole && xRole.axisSelection) {\n            stage.axes.x.filter(axis => axis.tickText.length).forEach(axis => {\n                polygons.push.apply(polygons, axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n            });\n        }\n        const yRole = specCapabilities.roles.filter(r => r.role === 'y')[0];\n        if (yRole && yRole.axisSelection) {\n            stage.axes.y.filter(axis => axis.tickText.length).forEach(axis => {\n                polygons.push.apply(polygons, axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n            });\n        }\n        if (stage.facets) {\n            polygons.push.apply(polygons, facetSelectionPolygons(stage.facets, columns.facet));\n        }\n        //move polygons to Z\n        polygons.forEach(datum => {\n            datum.polygon.forEach(p => {\n                p[2] = polygonZ;\n            });\n        });\n        const onClick = (o, e) => clickHandler(e.srcEvent, o.object.search);\n        const polygonLayer = new base.layers.PolygonLayer({\n            autoHighlight: true,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            data: polygons,\n            extruded: false,\n            highlightColor,\n            id: 'selections',\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onAxisSelection = false;\n                }\n                else {\n                    presenter.deckgl.interactiveState.onAxisSelection = true;\n                }\n            },\n            onClick,\n            getElevation: () => 0,\n            getFillColor: () => [0, 0, 0, 0],\n            pickable: true,\n            stroked: false\n        });\n        return polygonLayer;\n    }\n    function axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n        const polygons = [];\n        const size = 50;\n        const getSearch = axisSelectionType === 'exact' ?\n            (a, c, i) => ({ expressions: [selectExactAxis(a, c, i)] })\n            :\n                selectBetweenAxis;\n        const { domain, ticks } = axis;\n        if (ticks.length > 0 && domain) {\n            const dim = vertical ? 1 : 0;\n            const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n            let divisions;\n            if (between) {\n                divisions = [];\n                for (let i = 1; i < ticks.length; i++) {\n                    divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n                }\n            }\n            else {\n                divisions = ticks.slice(1, -1).map(tick => tick.sourcePosition[dim]);\n            }\n            const add = (p2, i) => {\n                var coords = [[p1, q1], [p2, q1], [p2, q2], [p1, q2]];\n                polygons.push({\n                    search: getSearch(axis, column, i),\n                    polygon: vertical ? coords.map(xy => xy.reverse()) : coords\n                });\n                p1 = p2;\n            };\n            let p1 = domain.sourcePosition[dim];\n            const q1 = domain.sourcePosition[vertical ? 0 : 1];\n            const q2 = q1 - size;\n            divisions.forEach(add);\n            add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n        }\n        return polygons;\n    }\n    function facetSelectionPolygons(facetRects, facetColumn) {\n        const polygons = [];\n        facetRects.forEach((facetRect, i) => {\n            //take any 2 lines to get a box dimension\n            const [x, y] = minMaxPoints(facetRect.lines.slice(2));\n            const search = facetRect.facetTitle ?\n                facetColumn.quantitative ?\n                    selectBetweenFacet(facetColumn, facetRect.facetTitle.text, i === 0, i === facetRects.length - 1)\n                    :\n                        { expressions: [selectExact(facetColumn, facetRect.facetTitle.text)] }\n                :\n                    { expressions: [selectNullOrEmpty(facetColumn)] };\n            polygons.push({\n                search,\n                polygon: [[x.min, y.min], [x.max, y.min], [x.max, y.max], [x.min, y.max]]\n            });\n        });\n        return polygons;\n    }\n    function minMaxPoints(lines) {\n        const points = [];\n        lines.forEach(line => {\n            [line.sourcePosition, line.targetPosition].forEach(point => {\n                points.push(point);\n            });\n        });\n        return [0, 1].map(dim => {\n            let minMax = { min: null, max: null };\n            points.forEach(point => {\n                if (minMax.max == null) {\n                    minMax.max = point[dim];\n                }\n                else {\n                    minMax.max = Math.max(minMax.max, point[dim]);\n                }\n                if (minMax.min == null) {\n                    minMax.min = point[dim];\n                }\n                else {\n                    minMax.min = Math.min(minMax.min, point[dim]);\n                }\n            });\n            return minMax;\n        });\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const BarChartScaleNames = {\n        bucketScale: 'bucketScale',\n        levelScale: 'levelScale',\n        compartmentScale: 'compartmentScale'\n    };\n    const BarChartSignalNames = {\n        aspectRatioSignal: 'aspectRatioSignal',\n        compartmentsPerLevelSignal: 'compartmentsPerLevelSignal',\n        compartmentHeightSignal: 'compartmentHeightSignal',\n        levelExtentSignal: 'levelExtentSignal',\n        quantitativeBinSignal: 'quantitativeBinSignal'\n    };\n\n    function partialAxes(specViewOptions, xColumnQuantitative, yColumnQuantitative) {\n        const lineColor = colorToString(specViewOptions.colors.axisLine);\n        const axisColor = {\n            domainColor: lineColor,\n            tickColor: lineColor,\n            labelColor: colorToString(specViewOptions.colors.axisText)\n        };\n        const bottom = Object.assign({ orient: 'bottom', labelAlign: 'left', labelAngle: {\n                signal: SignalNames.TextAngleX\n            }, labelFontSize: {\n                signal: SignalNames.TextSize\n            }, titleAngle: {\n                signal: SignalNames.TextAngleX\n            }, titleAlign: 'left', titleFontSize: {\n                signal: SignalNames.TextTitleSize\n            }, titleColor: colorToString(specViewOptions.colors.axisText), tickSize: specViewOptions.tickSize }, axisColor);\n        if (xColumnQuantitative) {\n            bottom.format = '~r';\n        }\n        const left = Object.assign({ orient: 'left', labelAlign: 'right', labelAngle: {\n                signal: SignalNames.TextAngleY\n            }, labelFontSize: {\n                signal: SignalNames.TextSize\n            }, titleAngle: {\n                signal: SignalNames.TextAngleY\n            }, titleAlign: 'right', titleFontSize: {\n                signal: SignalNames.TextTitleSize\n            }, titleColor: colorToString(specViewOptions.colors.axisText), tickSize: specViewOptions.tickSize }, axisColor);\n        if (yColumnQuantitative) {\n            left.format = '~r';\n        }\n        return { left, bottom };\n    }\n\n    function getAxes (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, true, specColumns.y.quantitative);\n        const axes = [\n            Object.assign({ scale: ScaleNames.Y, title: specColumns.y.name }, pa.left),\n            Object.assign({ scale: BarChartScaleNames.levelScale, title: specViewOptions.language.count, encode: {\n                    labels: {\n                        update: {\n                            text: {\n                                signal: `${BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n                            }\n                        }\n                    }\n                } }, pa.bottom)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getQualitative (context) {\n        const { specColumns } = context;\n        const stackTransform = {\n            type: 'stack',\n            groupby: [\n                {\n                    field: specColumns.y.name\n                }\n            ],\n            as: [\n                FieldNames.BarChartStack0,\n                FieldNames.BarChartStack1\n            ]\n        };\n        if (specColumns.sort) {\n            stackTransform.sort = {\n                field: specColumns.sort.name\n            };\n        }\n        const transforms = [\n            stackTransform,\n            {\n                type: 'extent',\n                signal: BarChartSignalNames.levelExtentSignal,\n                field: FieldNames.BarChartStack1\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getQuantitative (context, groupBy) {\n        const { specColumns } = context;\n        const bucket_extent = 'bucket_extent';\n        const stackTransform = {\n            type: 'stack',\n            groupby: [\n                FieldNames.BarChartBin0\n            ],\n            as: [\n                FieldNames.BarChartStack0,\n                FieldNames.BarChartStack1\n            ]\n        };\n        if (groupBy) {\n            stackTransform.groupby.push(groupBy.name);\n        }\n        if (specColumns.sort) {\n            stackTransform.sort = {\n                field: specColumns.sort.name\n            };\n        }\n        const transforms = [\n            {\n                type: 'extent',\n                field: specColumns.y.name,\n                signal: bucket_extent\n            },\n            {\n                type: 'bin',\n                field: specColumns.y.name,\n                extent: {\n                    signal: bucket_extent\n                },\n                maxbins: {\n                    signal: SignalNames.YBins\n                },\n                as: [\n                    FieldNames.BarChartBin0,\n                    FieldNames.BarChartBin1\n                ],\n                signal: BarChartSignalNames.quantitativeBinSignal\n            },\n            stackTransform,\n            {\n                type: 'extent',\n                signal: BarChartSignalNames.levelExtentSignal,\n                field: FieldNames.BarChartStack1\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * Returns array with items which are truthy.\n     * @param args array or arrays to concat into a single array.\n     */\n    function allTruthy(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n    }\n\n    function topLookup(column, count) {\n        const data = [\n            {\n                name: DataNames.TopLookup,\n                source: DataNames.Main,\n                transform: [\n                    { type: 'aggregate', groupby: [column.name] },\n                    {\n                        type: 'window',\n                        ops: [\n                            'count'\n                        ],\n                        as: [\n                            FieldNames.TopIndex\n                        ]\n                    },\n                    { type: 'filter', expr: `datum.${FieldNames.TopIndex} <= ${count}` }\n                ]\n            },\n            {\n                name: DataNames.Legend,\n                source: DataNames.Main,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: DataNames.TopLookup,\n                        key: column.name,\n                        fields: [column.name],\n                        values: [column.name],\n                        as: [FieldNames.Top]\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.${FieldNames.Top} == null ? '${Other}' : datum.${FieldNames.Top}`,\n                        as: FieldNames.Top\n                    }\n                ]\n            }\n        ];\n        return data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData (context, namespace) {\n        const { specColumns, insight, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? DataNames.Pre : DataNames.Main;\n        const data = allTruthy(facetSourceData(specColumns.facet, insight.facets, DataNames.Main), categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), [\n            bucketed(context, namespace, categoricalColor ? DataNames.Legend : nestedDataName),\n            stacked(namespace, namespace.bucket, specColumns.facet && facetTransforms(specColumns.facet, insight.facets))\n        ], specColumns.y.quantitative && [\n            {\n                name: DataNames.QuantitativeData,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.start`\n                        },\n                        stop: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.stop`\n                        },\n                        step: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.step`\n                        }\n                    }\n                ]\n            }\n        ], specColumns.facet && facetGroupData(namespace.stacked));\n        return data;\n    }\n    function bucketed(context, namespace, source) {\n        const { specColumns: columns } = context;\n        const data = {\n            name: namespace.bucket,\n            source,\n            transform: columns.y.quantitative ?\n                getQuantitative(context, columns.facet)\n                :\n                    getQualitative(context)\n        };\n        return data;\n    }\n    function stacked(namespace, source, transforms) {\n        const data = {\n            name: namespace.stacked,\n            source,\n            transform: allTruthy(transforms, xy(namespace))\n        };\n        return data;\n    }\n    function xy(namespace) {\n        const transforms = [\n            {\n                type: 'formula',\n                expr: `floor(datum.${FieldNames.BarChartStack0} / ${BarChartSignalNames.compartmentsPerLevelSignal})`,\n                as: namespace.__level\n            },\n            {\n                type: 'formula',\n                expr: `datum.${FieldNames.BarChartStack0} % ${BarChartSignalNames.compartmentsPerLevelSignal}`,\n                as: namespace.__compartment\n            }\n        ];\n        return transforms;\n    }\n\n    function fill(context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const colorColumn = specColumns.color;\n        return colorColumn ?\n            colorColumn.isColorData || insight.directColor ?\n                {\n                    field: colorColumn.name\n                }\n                :\n                    {\n                        scale: ScaleNames.Color,\n                        field: colorColumn.quantitative ? colorColumn.name : FieldNames.Top\n                    }\n            :\n                {\n                    value: colorToString(specViewOptions.colors.defaultCube)\n                };\n    }\n    function opacity(context) {\n        const result = {\n            signal: SignalNames.MarkOpacity\n        };\n        return result;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function testForCollapseSelection() {\n        return `datum.${FieldNames.Collapsed}`;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks (context, namespace) {\n        const { specColumns } = context;\n        const mark = {\n            type: 'rect',\n            from: {\n                data: namespace.stacked\n            },\n            encode: {\n                update: {\n                    y: {\n                        scale: ScaleNames.Y,\n                        field: specColumns.y.quantitative ? FieldNames.BarChartBin0 : specColumns.y.name,\n                        offset: {\n                            scale: BarChartScaleNames.compartmentScale,\n                            field: namespace.__compartment\n                        }\n                    },\n                    height: [\n                        {\n                            test: `bandwidth('${BarChartScaleNames.compartmentScale}') < 1`,\n                            value: minPixelSize\n                        },\n                        {\n                            scale: BarChartScaleNames.compartmentScale,\n                            band: 1\n                        }\n                    ],\n                    x: [\n                        {\n                            scale: ScaleNames.X,\n                            test: testForCollapseSelection(),\n                            signal: `${SignalNames.XDomain}[0]`\n                        },\n                        {\n                            scale: ScaleNames.X,\n                            field: namespace.__level,\n                            band: 1,\n                            offset: {\n                                signal: `-bandwidth('${ScaleNames.X}')-1`\n                            }\n                        }\n                    ],\n                    width: [\n                        {\n                            test: testForCollapseSelection(),\n                            value: 0\n                        },\n                        {\n                            test: `bandwidth('${ScaleNames.X}') < 1`,\n                            value: minPixelSize\n                        },\n                        {\n                            scale: ScaleNames.X,\n                            band: 1\n                        }\n                    ],\n                    fill: fill(context),\n                    opacity: opacity(context)\n                }\n            }\n        };\n        if (specColumns.z) {\n            const update = mark.encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return [mark];\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function qualitativeScales (context, namespace) {\n        const { specColumns } = context;\n        const scales = [\n            {\n                name: BarChartScaleNames.bucketScale,\n                type: 'band',\n                range: 'height',\n                domain: {\n                    data: namespace.bucket,\n                    field: specColumns.y.name,\n                    sort: true\n                }\n            },\n            {\n                name: ScaleNames.Y,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'height'\n                    }\n                ],\n                padding: 0.01,\n                domain: {\n                    data: namespace.stacked,\n                    field: specColumns.y.name,\n                    sort: true\n                },\n                reverse: true\n            }\n        ];\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function quantitativeScales () {\n        const scales = [\n            {\n                name: ScaleNames.Y,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'height'\n                    }\n                ],\n                padding: 0.01,\n                domain: {\n                    data: DataNames.QuantitativeData,\n                    field: 'data',\n                    sort: true\n                },\n                reverse: true\n            }\n        ];\n        return scales;\n    }\n\n    function linearScale(name, data, field, range, reverse, zero) {\n        const scale = {\n            name,\n            type: 'linear',\n            range,\n            round: true,\n            reverse,\n            domain: {\n                data,\n                field\n            },\n            zero,\n            nice: true\n        };\n        return scale;\n    }\n    function pointScale(name, data, range, field, reverse) {\n        const scale = {\n            name,\n            type: 'point',\n            range,\n            domain: {\n                data,\n                field,\n                sort: true\n            },\n            padding: 0.5\n        };\n        if (reverse !== undefined) {\n            scale.reverse = reverse;\n        }\n        return scale;\n    }\n    function binnableColorScale(colorBin, data, field, scheme) {\n        scheme = scheme || ColorScaleNone;\n        const name = ScaleNames.Color;\n        const domain = {\n            data,\n            field\n        };\n        const range = {\n            scheme\n        };\n        const reverse = { signal: SignalNames.ColorReverse };\n        if (colorBin !== 'continuous') {\n            range.count = { signal: SignalNames.ColorBinCount };\n        }\n        switch (colorBin) {\n            case 'continuous': {\n                const sequentialScale = {\n                    name,\n                    type: 'sequential',\n                    domain,\n                    range,\n                    reverse\n                };\n                return sequentialScale;\n            }\n            case 'quantile': {\n                const quantileScale = {\n                    name,\n                    type: 'quantile',\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantileScale;\n            }\n            default: {\n                const quantizeScale = {\n                    name,\n                    type: 'quantize',\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantizeScale;\n            }\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales (context, namespace) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: BarChartScaleNames.compartmentScale,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: BarChartSignalNames.compartmentHeightSignal\n                    }\n                ],\n                padding: 0.1,\n                domain: {\n                    signal: `sequence(0, ${BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n                }\n            },\n            {\n                name: BarChartScaleNames.levelScale,\n                range: [\n                    {\n                        signal: '0'\n                    },\n                    {\n                        signal: 'width'\n                    }\n                ],\n                round: true,\n                domain: {\n                    data: namespace.stacked,\n                    field: namespace.__level,\n                    sort: true\n                },\n                zero: true,\n                nice: true\n            },\n            {\n                name: ScaleNames.X,\n                type: 'band',\n                range: [\n                    {\n                        signal: '0'\n                    },\n                    {\n                        signal: 'width'\n                    }\n                ],\n                padding: 0.1,\n                round: false,\n                reverse: false,\n                align: 1,\n                domain: {\n                    data: namespace.stacked,\n                    field: namespace.__level,\n                    sort: true\n                }\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: namespace.bucket,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, true)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales.concat(specColumns.y.quantitative ? quantitativeScales() : qualitativeScales(context, namespace));\n    }\n\n    const defaultZProportion = 0.6;\n    function textSignals(context) {\n        const { specViewOptions } = context;\n        const signals = [\n            {\n                name: SignalNames.ZProportion,\n                value: defaultZProportion,\n                bind: {\n                    name: specViewOptions.language.zScaleProportion,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0.2,\n                    max: 2,\n                    step: 0.1\n                }\n            },\n            {\n                name: SignalNames.ZHeight,\n                update: `height * ${SignalNames.ZProportion}`\n            },\n            {\n                name: SignalNames.TextScale,\n                value: 2,\n                bind: {\n                    name: specViewOptions.language.textScaleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 1,\n                    max: 5,\n                    step: 0.5\n                }\n            },\n            {\n                name: SignalNames.TextSize,\n                update: `${SignalNames.TextScale} * 10`\n            },\n            {\n                name: SignalNames.TextTitleSize,\n                update: `${SignalNames.TextScale} * 15`\n            },\n            {\n                name: SignalNames.TextAngleX,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.xAxisTextAngleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0,\n                    max: 90,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.TextAngleY,\n                value: 0,\n                bind: {\n                    name: specViewOptions.language.yAxisTextAngleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: -90,\n                    max: 0,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.MarkOpacity,\n                value: 1,\n                bind: {\n                    name: specViewOptions.language.markOpacitySignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0.1,\n                    max: 1,\n                    step: 0.05\n                }\n            }\n        ];\n        return signals;\n    }\n    function colorBinCountSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorBinCount,\n            value: 7,\n            bind: {\n                name: specViewOptions.language.colorBinCount,\n                input: 'range',\n                min: 1,\n                max: specViewOptions.maxLegends + 1,\n                step: 1\n            }\n        };\n        return signal;\n    }\n    function colorReverseSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorReverse,\n            value: false,\n            bind: {\n                name: specViewOptions.language.colorReverse,\n                input: 'checkbox'\n            }\n        };\n        return signal;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals (context) {\n        const { specColumns, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            {\n                name: SignalNames.XDomain,\n                update: `domain('${ScaleNames.X}')`\n            },\n            specColumns.y.quantitative && {\n                name: SignalNames.YBins,\n                value: 7,\n                bind: {\n                    name: specViewOptions.language.YBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 20,\n                    step: 1\n                }\n            },\n            {\n                name: BarChartSignalNames.compartmentHeightSignal,\n                update: `bandwidth('${specColumns.y.quantitative ? ScaleNames.Y : BarChartScaleNames.bucketScale}')`\n            },\n            {\n                name: BarChartSignalNames.aspectRatioSignal,\n                update: `${BarChartSignalNames.compartmentHeightSignal}/width`\n            },\n            {\n                name: BarChartSignalNames.compartmentsPerLevelSignal,\n                update: `ceil(sqrt(${BarChartSignalNames.aspectRatioSignal}*${BarChartSignalNames.levelExtentSignal}[1]))`\n            },\n            colorBinCountSignal(context),\n            colorReverseSignal(context)\n        ], specColumns.facet && facetSignals(context));\n        return signals;\n    }\n\n    function legend(column) {\n        const legend = {\n            orient: 'none',\n            title: column.name,\n            fill: ScaleNames.Color,\n            encode: {\n                symbols: {\n                    update: {\n                        shape: {\n                            value: 'square'\n                        }\n                    }\n                }\n            }\n        };\n        if (column.quantitative) {\n            legend.type = 'symbol';\n            legend.format = '~r';\n        }\n        return legend;\n    }\n    function getLegends(context) {\n        const { specColumns, insight } = context;\n        if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n            return [legend(specColumns.color)];\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    class NameSpace {\n        constructor(nameSpace = '') {\n            ['bucket', 'stacked', '__compartment', '__level'].forEach(name => {\n                this[name] = `${name}${nameSpace}`;\n            });\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const barchartH = (context) => {\n        const { specColumns, insight, specViewOptions } = context;\n        const errors = [];\n        if (!specColumns.y)\n            errors.push('Must set a field for y axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.YBins]\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const rootNamespace = new NameSpace();\n        let axes;\n        if (!insight.hideAxes) {\n            axes = getAxes(context);\n        }\n        let marks;\n        if (specColumns.facet) {\n            const cellNamespace = new NameSpace('Cell');\n            const cellMarks = getMarks(context, cellNamespace);\n            const cd = specColumns.y.quantitative ?\n                [\n                    stacked(cellNamespace, DataNames.FacetGroupCell)\n                ]\n                :\n                    [\n                        bucketed(context, cellNamespace, DataNames.FacetGroupCell),\n                        stacked(cellNamespace, cellNamespace.bucket)\n                    ];\n            marks = facetMarks(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n            axes = [];\n        }\n        else {\n            marks = getMarks(context, rootNamespace);\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals(context),\n            scales: getScales(context, rootNamespace),\n            data: getData(context, rootNamespace),\n            marks\n        };\n        if (!insight.hideAxes && axes && axes.length) {\n            vegaSpec.axes = axes;\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const BarChartScaleNames$1 = {\n        bucketScale: 'bucketScale',\n        levelScale: 'levelScale',\n        compartmentScale: 'compartmentScale'\n    };\n    const BarChartSignalNames$1 = {\n        aspectRatioSignal: 'aspectRatioSignal',\n        compartmentsPerLevelSignal: 'compartmentsPerLevelSignal',\n        compartmentWidthSignal: 'compartmentWidthSignal',\n        levelExtentSignal: 'levelExtentSignal',\n        quantitativeBinSignal: 'quantitativeBinSignal'\n    };\n\n    function getAxes$1 (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, specColumns.x.quantitative, true);\n        const axes = [\n            Object.assign({ scale: ScaleNames.X, title: specColumns.x.name }, pa.bottom),\n            Object.assign({ scale: BarChartScaleNames$1.levelScale, title: specViewOptions.language.count, encode: {\n                    labels: {\n                        update: {\n                            text: {\n                                signal: `${BarChartSignalNames$1.compartmentsPerLevelSignal} * datum.value`\n                            }\n                        }\n                    }\n                } }, pa.left)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getQualitative$1 (context) {\n        const { specColumns } = context;\n        const stackTransform = {\n            type: 'stack',\n            groupby: [\n                {\n                    field: specColumns.x.name\n                }\n            ],\n            as: [\n                FieldNames.BarChartStack0,\n                FieldNames.BarChartStack1\n            ]\n        };\n        if (specColumns.sort) {\n            stackTransform.sort = {\n                field: specColumns.sort.name\n            };\n        }\n        const transforms = [\n            stackTransform,\n            {\n                type: 'extent',\n                signal: BarChartSignalNames$1.levelExtentSignal,\n                field: FieldNames.BarChartStack1\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getQuantitative$1 (context, groupBy) {\n        const { specColumns } = context;\n        const bucket_extent = 'bucket_extent';\n        const stackTransform = {\n            type: 'stack',\n            groupby: [\n                FieldNames.BarChartBin0\n            ],\n            as: [\n                FieldNames.BarChartStack0,\n                FieldNames.BarChartStack1\n            ]\n        };\n        if (groupBy) {\n            stackTransform.groupby.push(groupBy.name);\n        }\n        if (specColumns.sort) {\n            stackTransform.sort = {\n                field: specColumns.sort.name\n            };\n        }\n        const transforms = [\n            {\n                type: 'extent',\n                field: specColumns.x.name,\n                signal: bucket_extent\n            },\n            {\n                type: 'bin',\n                field: specColumns.x.name,\n                extent: {\n                    signal: bucket_extent\n                },\n                maxbins: {\n                    signal: SignalNames.XBins\n                },\n                as: [\n                    FieldNames.BarChartBin0,\n                    FieldNames.BarChartBin1\n                ],\n                signal: BarChartSignalNames$1.quantitativeBinSignal\n            },\n            stackTransform,\n            {\n                type: 'extent',\n                signal: BarChartSignalNames$1.levelExtentSignal,\n                field: FieldNames.BarChartStack1\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$1 (context, namespace) {\n        const { specColumns, insight, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? DataNames.Pre : DataNames.Main;\n        const data = allTruthy(facetSourceData(specColumns.facet, insight.facets, DataNames.Main), categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), [\n            bucketed$1(context, namespace, categoricalColor ? DataNames.Legend : nestedDataName),\n            stacked$1(namespace, namespace.bucket, specColumns.facet && facetTransforms(specColumns.facet, insight.facets))\n        ], specColumns.x.quantitative && [\n            {\n                name: DataNames.QuantitativeData,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: `${BarChartSignalNames$1.quantitativeBinSignal}.start`\n                        },\n                        stop: {\n                            signal: `${BarChartSignalNames$1.quantitativeBinSignal}.stop`\n                        },\n                        step: {\n                            signal: `${BarChartSignalNames$1.quantitativeBinSignal}.step`\n                        }\n                    }\n                ]\n            }\n        ], specColumns.facet && facetGroupData(namespace.stacked));\n        return data;\n    }\n    function bucketed$1(context, namespace, source) {\n        const { specColumns: columns } = context;\n        const data = {\n            name: namespace.bucket,\n            source,\n            transform: columns.x.quantitative ?\n                getQuantitative$1(context, columns.facet)\n                :\n                    getQualitative$1(context)\n        };\n        return data;\n    }\n    function stacked$1(namespace, source, transforms) {\n        const data = {\n            name: namespace.stacked,\n            source,\n            transform: allTruthy(transforms, xy$1(namespace))\n        };\n        return data;\n    }\n    function xy$1(namespace) {\n        const transforms = [\n            {\n                type: 'formula',\n                expr: `floor(datum.${FieldNames.BarChartStack0} / ${BarChartSignalNames$1.compartmentsPerLevelSignal})`,\n                as: namespace.__level\n            },\n            {\n                type: 'formula',\n                expr: `datum.${FieldNames.BarChartStack0} % ${BarChartSignalNames$1.compartmentsPerLevelSignal}`,\n                as: namespace.__compartment\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$1 (context, namespace) {\n        const { specColumns } = context;\n        const mark = {\n            type: 'rect',\n            from: {\n                data: namespace.stacked\n            },\n            encode: {\n                update: {\n                    x: {\n                        scale: ScaleNames.X,\n                        field: specColumns.x.quantitative ? FieldNames.BarChartBin0 : specColumns.x.name,\n                        offset: {\n                            scale: BarChartScaleNames$1.compartmentScale,\n                            field: namespace.__compartment\n                        }\n                    },\n                    width: [\n                        {\n                            test: `bandwidth('${BarChartScaleNames$1.compartmentScale}') < 1`,\n                            value: minPixelSize\n                        },\n                        {\n                            scale: BarChartScaleNames$1.compartmentScale,\n                            band: 1\n                        }\n                    ],\n                    y: [\n                        {\n                            scale: ScaleNames.Y,\n                            test: testForCollapseSelection(),\n                            signal: `${SignalNames.YDomain}[0]`\n                        },\n                        {\n                            scale: ScaleNames.Y,\n                            field: namespace.__level,\n                            band: 1,\n                            offset: {\n                                signal: `-bandwidth('${ScaleNames.Y}')-1`\n                            }\n                        }\n                    ],\n                    height: [\n                        {\n                            test: testForCollapseSelection(),\n                            value: 0\n                        },\n                        {\n                            test: `bandwidth('${ScaleNames.Y}') < 1`,\n                            value: minPixelSize\n                        },\n                        {\n                            scale: ScaleNames.Y,\n                            band: 1\n                        }\n                    ],\n                    fill: fill(context),\n                    opacity: opacity(context)\n                }\n            }\n        };\n        if (specColumns.z) {\n            const update = mark.encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return [mark];\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function qualitativeScales$1 (context, namespace) {\n        const { specColumns } = context;\n        const scales = [\n            {\n                name: BarChartScaleNames$1.bucketScale,\n                type: 'band',\n                range: 'width',\n                domain: {\n                    data: namespace.bucket,\n                    field: specColumns.x.name,\n                    sort: true\n                }\n            },\n            {\n                name: ScaleNames.X,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'width'\n                    }\n                ],\n                padding: 0.01,\n                domain: {\n                    data: namespace.stacked,\n                    field: specColumns.x.name,\n                    sort: true\n                }\n            }\n        ];\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function quantitativeScales$1 () {\n        const scales = [\n            {\n                name: ScaleNames.X,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'width'\n                    }\n                ],\n                padding: 0.01,\n                domain: {\n                    data: DataNames.QuantitativeData,\n                    field: 'data',\n                    sort: true\n                }\n            }\n        ];\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$1 (context, namespace) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: BarChartScaleNames$1.compartmentScale,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: BarChartSignalNames$1.compartmentWidthSignal\n                    }\n                ],\n                padding: 0.1,\n                domain: {\n                    signal: `sequence(0, ${BarChartSignalNames$1.compartmentsPerLevelSignal}+1, 1)`\n                }\n            },\n            {\n                name: BarChartScaleNames$1.levelScale,\n                range: [\n                    {\n                        signal: 'height'\n                    },\n                    {\n                        signal: '0'\n                    }\n                ],\n                round: true,\n                domain: {\n                    data: namespace.stacked,\n                    field: namespace.__level,\n                    sort: true\n                },\n                zero: true,\n                nice: true\n            },\n            {\n                name: ScaleNames.Y,\n                type: 'band',\n                range: [\n                    {\n                        signal: 'height'\n                    },\n                    {\n                        signal: '0'\n                    }\n                ],\n                padding: 0.1,\n                round: false,\n                reverse: false,\n                align: 1,\n                domain: {\n                    data: namespace.stacked,\n                    field: namespace.__level,\n                    sort: true\n                }\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: namespace.bucket,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, true)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales.concat(specColumns.x.quantitative ? quantitativeScales$1() : qualitativeScales$1(context, namespace));\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$1 (context) {\n        const { specColumns, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            {\n                name: SignalNames.YDomain,\n                update: `domain('${ScaleNames.Y}')`\n            },\n            specColumns.x.quantitative && {\n                name: SignalNames.XBins,\n                value: 7,\n                bind: {\n                    name: specViewOptions.language.XBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 20,\n                    step: 1\n                }\n            },\n            {\n                name: BarChartSignalNames$1.compartmentWidthSignal,\n                update: `bandwidth('${specColumns.x.quantitative ? ScaleNames.X : BarChartScaleNames$1.bucketScale}')`\n            },\n            {\n                name: BarChartSignalNames$1.aspectRatioSignal,\n                update: `${BarChartSignalNames$1.compartmentWidthSignal}/height`\n            },\n            {\n                name: BarChartSignalNames$1.compartmentsPerLevelSignal,\n                update: `ceil(sqrt(${BarChartSignalNames$1.aspectRatioSignal}*${BarChartSignalNames$1.levelExtentSignal}[1]))`\n            },\n            colorBinCountSignal(context),\n            colorReverseSignal(context)\n        ], specColumns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    class NameSpace$1 {\n        constructor(nameSpace = '') {\n            ['bucket', 'stacked', '__compartment', '__level'].forEach(name => {\n                this[name] = `${name}${nameSpace}`;\n            });\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const barchartV = (context) => {\n        const { specColumns, insight, specViewOptions } = context;\n        const errors = [];\n        if (!specColumns.x)\n            errors.push('Must set a field for x axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.XBins]\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const rootNamespace = new NameSpace$1();\n        let axes;\n        if (!insight.hideAxes) {\n            axes = getAxes$1(context);\n        }\n        let marks;\n        if (specColumns.facet) {\n            const cellNamespace = new NameSpace$1('Cell');\n            const cellMarks = getMarks$1(context, cellNamespace);\n            const cd = specColumns.x.quantitative ?\n                [\n                    stacked$1(cellNamespace, DataNames.FacetGroupCell)\n                ]\n                :\n                    [\n                        bucketed$1(context, cellNamespace, DataNames.FacetGroupCell),\n                        stacked$1(cellNamespace, cellNamespace.bucket)\n                    ];\n            marks = facetMarks(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n            axes = [];\n        }\n        else {\n            marks = getMarks$1(context, rootNamespace);\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$1(context),\n            scales: getScales$1(context, rootNamespace),\n            data: getData$1(context, rootNamespace),\n            marks\n        };\n        if (!insight.hideAxes && axes && axes.length) {\n            vegaSpec.axes = axes;\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    function getAxes$2 (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, specColumns.x.quantitative, specColumns.y.quantitative);\n        const axes = [\n            Object.assign({ scale: 'xscale', title: specColumns.x.name, bandPosition: 0.5, grid: true, labelFlush: true }, pa.bottom),\n            Object.assign({ scale: 'yscale', title: specColumns.y.name, bandPosition: specColumns.y.quantitative ? 0 : 0.5, grid: true, labelFlush: true }, pa.left)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$2 (context) {\n        const { specColumns, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const data = allTruthy([\n            {\n                name: DataNames.Main,\n                transform: allTruthy(specColumns.x.quantitative && [\n                    {\n                        type: 'extent',\n                        field: specColumns.x.name,\n                        signal: 'var_Xextent'\n                    },\n                    {\n                        type: 'bin',\n                        field: specColumns.x.name,\n                        extent: {\n                            signal: 'var_Xextent'\n                        },\n                        maxbins: {\n                            signal: SignalNames.XBins\n                        },\n                        as: [\n                            FieldNames.DensityXBin0,\n                            FieldNames.DensityXBin1\n                        ],\n                        signal: 'binXSignal'\n                    }\n                ], specColumns.y.quantitative && [\n                    {\n                        type: 'extent',\n                        field: specColumns.y.name,\n                        signal: 'var_Yextent'\n                    },\n                    {\n                        type: 'bin',\n                        field: specColumns.y.name,\n                        extent: {\n                            signal: 'var_Yextent'\n                        },\n                        maxbins: {\n                            signal: SignalNames.YBins\n                        },\n                        as: [\n                            FieldNames.DensityYBin0,\n                            FieldNames.DensityYBin1\n                        ],\n                        signal: 'binYSignal'\n                    }\n                ])\n            }\n        ], specColumns.x.quantitative && [\n            {\n                name: 'xaxisdata',\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: 'binXSignal.start'\n                        },\n                        stop: {\n                            signal: 'binXSignal.stop'\n                        },\n                        step: {\n                            signal: 'binXSignal.step'\n                        }\n                    }\n                ]\n            }\n        ], specColumns.y.quantitative && [\n            {\n                name: 'yaxisdata',\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: 'binYSignal.start'\n                        },\n                        stop: {\n                            signal: 'binYSignal.stop'\n                        },\n                        step: {\n                            signal: 'binYSignal.step'\n                        }\n                    }\n                ]\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), [\n            {\n                name: 'aggregated',\n                source: categoricalColor ? DataNames.Legend : DataNames.Main,\n                transform: [\n                    {\n                        type: 'joinaggregate',\n                        groupby: [\n                            specColumns.x.quantitative ? FieldNames.DensityXBin0 : specColumns.x.name,\n                            specColumns.y.quantitative ? FieldNames.DensityYBin0 : specColumns.y.name\n                        ],\n                        ops: [\n                            'count'\n                        ],\n                        as: [\n                            FieldNames.DensityCount\n                        ]\n                    },\n                    windowTransform(specColumns),\n                    {\n                        type: 'extent',\n                        field: FieldNames.DensityRow,\n                        signal: 'cextent'\n                    }\n                ]\n            }\n        ]);\n        return data;\n    }\n    function windowTransform(columns) {\n        const t = {\n            type: 'window',\n            groupby: [\n                columns.x.quantitative ? FieldNames.DensityXBin0 : columns.x.name,\n                columns.y.quantitative ? FieldNames.DensityYBin0 : columns.y.name\n            ],\n            ops: [\n                'row_number'\n            ],\n            as: [\n                FieldNames.DensityRow\n            ]\n        };\n        if (columns.sort) {\n            t.sort = {\n                field: [columns.sort.name],\n                order: [\n                    'descending'\n                ]\n            };\n        }\n        return t;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$2 (context) {\n        const { specColumns } = context;\n        const mark = {\n            type: 'rect',\n            from: {\n                data: 'aggregated'\n            },\n            sort: {\n                field: [\n                    specColumns.x.name,\n                    specColumns.y.name\n                ],\n                order: [\n                    'ascending',\n                    'ascending'\n                ]\n            },\n            encode: {\n                update: {\n                    xc: {\n                        scale: 'xscale',\n                        field: specColumns.x.quantitative ? FieldNames.DensityXBin0 : specColumns.x.name,\n                        offset: {\n                            signal: `scale('sizescale', ((datum.${FieldNames.DensityRow}-1) % floor(sqrt(datum.${FieldNames.DensityCount}))))-scale('sizescale', sqrt(datum.${FieldNames.DensityCount})-2)/2`\n                        }\n                    },\n                    yc: {\n                        scale: 'yscale',\n                        field: specColumns.y.quantitative ? FieldNames.DensityYBin0 : specColumns.y.name,\n                        offset: {\n                            signal: `scale('sizescale',height/width*floor(((datum.${FieldNames.DensityRow}-1) / floor(sqrt(datum.${FieldNames.DensityCount}))))) - scale('sizescale', height/width*sqrt(datum.${FieldNames.DensityCount})+2)/2`\n                        }\n                    },\n                    width: {\n                        signal: 'unitsize'\n                    },\n                    height: {\n                        signal: 'height/width*unitsize'\n                    },\n                    fill: fill(context),\n                    opacity: opacity(context)\n                }\n            }\n        };\n        if (specColumns.z) {\n            const update = mark.encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return [mark];\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$2 (context) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: 'xscale',\n                type: 'point',\n                domain: specColumns.x.quantitative ?\n                    {\n                        data: 'xaxisdata',\n                        field: 'data',\n                        sort: true\n                    }\n                    :\n                        {\n                            data: DataNames.Main,\n                            field: specColumns.x.name,\n                            sort: true\n                        },\n                range: 'width',\n                padding: 0.5\n            },\n            {\n                name: 'yscale',\n                type: 'point',\n                domain: specColumns.y.quantitative ?\n                    {\n                        data: 'yaxisdata',\n                        field: 'data',\n                        sort: true\n                    }\n                    :\n                        {\n                            data: DataNames.Main,\n                            field: specColumns.y.name,\n                            sort: true\n                        },\n                range: 'height',\n                reverse: true,\n                padding: 0.5\n            },\n            {\n                name: 'sizescale',\n                type: 'linear',\n                domain: [\n                    0,\n                    {\n                        signal: 'sqrt(cextent[1])'\n                    }\n                ],\n                range: [\n                    0,\n                    {\n                        signal: 'width/max(xsize,ysize)'\n                    }\n                ]\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, true)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$2 (context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            colorBinCountSignal(context),\n            colorReverseSignal(context),\n            {\n                name: 'unitpad',\n                value: 0.1,\n                bind: {\n                    name: SignalNames.InnerPadding,\n                    input: 'range',\n                    min: 0.1,\n                    max: 1.0,\n                    step: 0.1\n                }\n            },\n            {\n                name: 'xsize',\n                update: 'domain(\\'xscale\\').length'\n            },\n            {\n                name: 'ysize',\n                update: 'domain(\\'yscale\\').length'\n            },\n            {\n                name: 'cellwidth',\n                update: 'width/max(xsize,ysize)'\n            },\n            {\n                name: 'maxnumbers',\n                update: 'sqrt(cextent[1])'\n            },\n            {\n                name: 'unitsize',\n                update: 'cellwidth/((1 + unitpad)*maxnumbers)'\n            },\n            specColumns.x.quantitative && {\n                name: SignalNames.XBins,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.XBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 60,\n                    step: 1\n                }\n            },\n            specColumns.y.quantitative && {\n                name: SignalNames.YBins,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.YBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 60,\n                    step: 1\n                }\n            }\n        ], insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const density = (context) => {\n        const { specColumns, insight } = context;\n        const errors = [];\n        if (!specColumns.x)\n            errors.push('Must set a field for x axis');\n        if (!specColumns.y)\n            errors.push('Must set a field for y axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.XBins]\n                },\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.YBins]\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$2(context),\n            data: getData$2(context),\n            scales: getScales$2(context),\n            marks: getMarks$2(context)\n        };\n        if (!insight.hideAxes) {\n            vegaSpec.axes = getAxes$2(context);\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$3 (context) {\n        const { specColumns, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const data = allTruthy([\n            {\n                name: DataNames.Main,\n                transform: allTruthy([\n                    specColumns.sort && {\n                        type: 'collect',\n                        sort: { field: specColumns.sort.name }\n                    },\n                    {\n                        type: 'window',\n                        ops: [\n                            'count'\n                        ],\n                        as: [\n                            FieldNames.GridIndex\n                        ]\n                    }\n                ])\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends));\n        return data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const ColumnCount = 'columncount';\n    const RowCount = 'rowcount';\n    const Total = 'total';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$3 (context, data) {\n        const { specColumns } = context;\n        const marks = [\n            {\n                type: 'rect',\n                from: {\n                    data\n                },\n                encode: {\n                    update: {\n                        x: {\n                            signal: `(datum.${FieldNames.GridIndex}-1)%${ColumnCount}`,\n                            scale: ScaleNames.X\n                        },\n                        width: {\n                            scale: ScaleNames.X,\n                            band: true\n                        },\n                        y: {\n                            signal: `floor((datum.${FieldNames.GridIndex}-1)/${ColumnCount})`,\n                            scale: ScaleNames.Y\n                        },\n                        height: {\n                            scale: ScaleNames.Y,\n                            band: true\n                        },\n                        fill: fill(context),\n                        opacity: opacity(context)\n                    }\n                }\n            }\n        ];\n        if (specColumns.z) {\n            const update = marks[0].encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return marks;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$3 (context) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: ScaleNames.X,\n                type: 'band',\n                domain: {\n                    signal: `sequence(0, ${ColumnCount}, 1)`\n                },\n                range: 'width',\n                paddingInner: 0.1,\n                paddingOuter: 0\n            },\n            {\n                name: ScaleNames.Y,\n                type: 'band',\n                domain: {\n                    signal: `sequence(0, ${RowCount}, 1)`\n                },\n                range: 'height',\n                paddingInner: 0.1,\n                paddingOuter: 0\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, false)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$3 (context) {\n        const { insight } = context;\n        const signals = allTruthy(textSignals(context), [\n            colorBinCountSignal(context),\n            {\n                name: Total,\n                update: `data('${DataNames.Main}').length`\n            },\n            {\n                name: ColumnCount,\n                update: `ceil(sqrt((width/height)*${Total}))`\n            },\n            {\n                name: RowCount,\n                update: `${Total}/${ColumnCount}`\n            },\n            colorReverseSignal(context)\n        ], insight.columns && insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const grid = (context) => {\n        const { specColumns, insight } = context;\n        const errors = [];\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const dataName = categoricalColor ? DataNames.Legend : DataNames.Main;\n        const size = insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$3(context),\n            scales: getScales$3(context),\n            data: getData$3(context),\n            marks: getMarks$3(context, dataName)\n        };\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        //use autosize only when not faceting\n        vegaSpec.autosize = 'fit';\n        return { vegaSpec, specCapabilities };\n    };\n\n    function getAxes$3 (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, specColumns.x.quantitative, specColumns.y.quantitative);\n        const axes = [\n            Object.assign({ scale: ScaleNames.X, title: specColumns.x.name }, pa.bottom),\n            Object.assign({ scale: ScaleNames.Y, title: specColumns.y.name }, pa.left)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$4 (context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const ScatterDataName = 'SandDanceScatterPlotData';\n        const data = allTruthy(facetSourceData(specColumns.facet, insight.facets, ScatterDataName), [\n            {\n                name: DataNames.Main,\n                source: ScatterDataName,\n                transform: allTruthy(filterInvalidWhenNumeric(specColumns.x), filterInvalidWhenNumeric(specColumns.y), filterInvalidWhenNumeric(specColumns.z), specColumns.facet && facetTransforms(specColumns.facet, insight.facets))\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), specColumns.facet && facetGroupData(DataNames.Main));\n        return data;\n    }\n    function filterInvalidWhenNumeric(column) {\n        if (column && column.quantitative) {\n            const transforms = [\n                {\n                    type: 'filter',\n                    expr: `datum[${JSON.stringify(column.name)}] != null`\n                }\n            ];\n            return transforms;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$4 (context) {\n        const { specColumns } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const marks = [\n            {\n                type: 'rect',\n                from: {\n                    data: categoricalColor ? DataNames.Legend : DataNames.Main\n                },\n                encode: {\n                    update: {\n                        x: {\n                            scale: ScaleNames.X,\n                            field: specColumns.x.name,\n                            offset: 1\n                        },\n                        width: { signal: SignalNames.PointSize },\n                        y: [\n                            {\n                                scale: ScaleNames.Y,\n                                test: testForCollapseSelection(),\n                                signal: `${SignalNames.YDomain}[0]`\n                            },\n                            {\n                                scale: ScaleNames.Y,\n                                field: specColumns.y.name,\n                                offset: {\n                                    signal: `-${SignalNames.PointSize}`\n                                }\n                            }\n                        ],\n                        height: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0\n                            },\n                            {\n                                signal: SignalNames.PointSize\n                            }\n                        ],\n                        fill: fill(context),\n                        opacity: opacity(context)\n                    }\n                }\n            }\n        ];\n        if (specColumns.z) {\n            const update = marks[0].encode.update;\n            update.z = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n            update.depth = { signal: SignalNames.PointSize };\n        }\n        return marks;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$4 (context) {\n        const { specColumns, insight } = context;\n        const scales = [\n            (specColumns.x.quantitative ?\n                linearScale(ScaleNames.X, DataNames.Main, specColumns.x.name, 'width', false, false)\n                :\n                    pointScale(ScaleNames.X, DataNames.Main, 'width', specColumns.x.name)),\n            (specColumns.y.quantitative ?\n                linearScale(ScaleNames.Y, DataNames.Main, specColumns.y.name, 'height', false, false)\n                :\n                    pointScale(ScaleNames.Y, DataNames.Main, 'height', specColumns.y.name, true))\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, false)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$4 (context) {\n        const { insight, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            {\n                name: SignalNames.YDomain,\n                update: `domain('${ScaleNames.Y}')`\n            },\n            {\n                name: SignalNames.PointSize,\n                value: 5,\n                bind: {\n                    name: specViewOptions.language.scatterPointSize,\n                    debounce: 50,\n                    input: 'range',\n                    min: 1,\n                    max: 25,\n                    step: 1\n                }\n            },\n            colorBinCountSignal(context),\n            colorReverseSignal(context)\n        ], insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const scatterplot = (context) => {\n        const { specColumns, insight, specViewOptions } = context;\n        const errors = [];\n        if (!specColumns.x)\n            errors.push('Must set a field for x axis');\n        if (!specColumns.y)\n            errors.push('Must set a field for y axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'x',\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact'\n                },\n                {\n                    role: 'y',\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact'\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true\n                }\n            ],\n            signals: [SignalNames.PointSize]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        let axes;\n        if (!insight.hideAxes) {\n            axes = getAxes$3(context);\n        }\n        let marks = getMarks$4(context);\n        if (specColumns.facet) {\n            marks = facetMarks(specViewOptions, marks[0].from.data, marks, axes);\n            axes = [];\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$4(context),\n            data: getData$4(context),\n            scales: getScales$4(context),\n            marks\n        };\n        if (!insight.hideAxes && axes && axes.length) {\n            vegaSpec.axes = axes;\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    function getAxes$4 (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, specColumns.x.quantitative, specColumns.y.quantitative);\n        const axes = [\n            Object.assign({ scale: 'xband', title: specColumns.x.name, bandPosition: 0.5, grid: true, labelFlush: true }, pa.bottom),\n            Object.assign({ scale: 'yband', title: specColumns.y.name, bandPosition: specColumns.y.quantitative ? 0 : 0.5, grid: true, labelFlush: true }, pa.left)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$5 (context) {\n        const { specColumns, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const data = allTruthy([\n            {\n                name: DataNames.Main,\n                transform: allTruthy([\n                    {\n                        type: 'extent',\n                        field: specColumns.x.name,\n                        signal: 'long_extent'\n                    },\n                    {\n                        type: 'extent',\n                        field: specColumns.y.name,\n                        signal: 'lat_extent'\n                    },\n                    specColumns.x.quantitative && {\n                        type: 'bin',\n                        field: specColumns.x.name,\n                        extent: {\n                            signal: 'long_extent'\n                        },\n                        maxbins: {\n                            signal: SignalNames.XBins\n                        },\n                        nice: false,\n                        as: [\n                            FieldNames.StacksLongBin0,\n                            FieldNames.StacksLongBin1\n                        ],\n                        signal: 'binXSignal'\n                    },\n                    specColumns.y.quantitative && {\n                        type: 'bin',\n                        field: specColumns.y.name,\n                        extent: {\n                            signal: 'lat_extent'\n                        },\n                        nice: false,\n                        maxbins: {\n                            signal: SignalNames.YBins\n                        },\n                        as: [\n                            FieldNames.StacksLatBin0,\n                            FieldNames.StacksLatBin1\n                        ],\n                        signal: 'binYSignal'\n                    }\n                ])\n            }\n        ], specColumns.x.quantitative && [\n            {\n                name: 'xaxisdata',\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: 'binXSignal.start'\n                        },\n                        stop: {\n                            signal: 'binXSignal.stop'\n                        },\n                        step: {\n                            signal: 'binXSignal.step'\n                        }\n                    }\n                ]\n            }\n        ], specColumns.y.quantitative && [\n            {\n                name: 'yaxisdata',\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: 'binYSignal.start'\n                        },\n                        stop: {\n                            signal: 'binYSignal.stop'\n                        },\n                        step: {\n                            signal: 'binYSignal.step'\n                        }\n                    }\n                ]\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), [\n            {\n                name: 'stackedgroup',\n                source: categoricalColor ? DataNames.Legend : DataNames.Main,\n                transform: [\n                    stackTransform(specColumns.sort, specColumns.x, specColumns.y),\n                    {\n                        type: 'extent',\n                        signal: 'xtent',\n                        field: FieldNames.StacksStart\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.${FieldNames.StacksEnd} % columns`,\n                        as: '_columns'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `floor(datum.${FieldNames.StacksStart} / columns)`,\n                        as: 'row'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.${FieldNames.StacksStart} % ${SignalNames.XGridSize}`,\n                        as: 'column'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `floor((datum.${FieldNames.StacksStart} % columns)/ ${SignalNames.XGridSize})`,\n                        as: 'depth'\n                    },\n                    {\n                        type: 'extent',\n                        signal: 'rowxtent',\n                        field: 'row'\n                    }\n                ]\n            }\n        ]);\n        return data;\n    }\n    function stackTransform(sortColumn, xColumn, yColumn) {\n        const st = {\n            type: 'stack',\n            groupby: [\n                yColumn.quantitative ? FieldNames.StacksLatBin0 : yColumn.name,\n                xColumn.quantitative ? FieldNames.StacksLongBin0 : xColumn.name\n            ],\n            as: [\n                FieldNames.StacksStart,\n                FieldNames.StacksEnd\n            ]\n        };\n        if (sortColumn) {\n            st.sort = {\n                field: sortColumn.name\n            };\n        }\n        return st;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$5 (context) {\n        const { specColumns } = context;\n        const marks = [\n            {\n                name: 'marks2',\n                type: 'rect',\n                from: {\n                    data: 'stackedgroup'\n                },\n                encode: {\n                    update: {\n                        x: {\n                            scale: 'xband',\n                            field: specColumns.x.quantitative ? FieldNames.StacksLongBin0 : specColumns.x.name,\n                            offset: {\n                                scale: 'xinternalscale',\n                                field: 'column'\n                            }\n                        },\n                        y: {\n                            scale: 'yband',\n                            field: specColumns.y.quantitative ? FieldNames.StacksLatBin0 : specColumns.y.name,\n                            offset: {\n                                scale: 'yinternalscale',\n                                field: 'depth'\n                            }\n                        },\n                        z: {\n                            scale: 'zband',\n                            field: 'row'\n                        },\n                        depth: {\n                            scale: 'zband',\n                            band: true\n                        },\n                        width: {\n                            signal: 'actsize'\n                        },\n                        height: {\n                            signal: 'actsize'\n                        },\n                        fill: fill(context),\n                        opacity: opacity(context)\n                    }\n                }\n            }\n        ];\n        return marks;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$5 (context) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: 'xband',\n                type: 'band',\n                domain: specColumns.x.quantitative ?\n                    {\n                        data: 'xaxisdata',\n                        field: 'data',\n                        sort: true\n                    }\n                    :\n                        {\n                            data: DataNames.Main,\n                            field: specColumns.x.quantitative ? FieldNames.StacksLongBin0 : specColumns.x.name,\n                            sort: true\n                        },\n                range: [\n                    0,\n                    {\n                        signal: 'width'\n                    }\n                ],\n                padding: { signal: SignalNames.OuterPadding },\n                round: true\n            },\n            {\n                name: 'yband',\n                type: 'band',\n                reverse: true,\n                domain: specColumns.y.quantitative ?\n                    {\n                        data: 'yaxisdata',\n                        field: 'data',\n                        sort: true\n                    }\n                    :\n                        {\n                            data: DataNames.Main,\n                            field: specColumns.y.quantitative ? FieldNames.StacksLatBin0 : specColumns.y.name,\n                            sort: true\n                        },\n                range: 'height',\n                padding: { signal: SignalNames.OuterPadding },\n                round: true\n            },\n            {\n                name: 'zband',\n                type: 'band',\n                reverse: false,\n                domain: {\n                    data: 'stackedgroup',\n                    field: 'row',\n                    sort: true\n                },\n                align: 0.0,\n                range: [\n                    0,\n                    {\n                        signal: 'countheight'\n                    }\n                ],\n                padding: { signal: SignalNames.InnerPadding },\n                round: false\n            },\n            {\n                name: 'xinternalscale',\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'xbandw'\n                    }\n                ],\n                padding: {\n                    signal: SignalNames.InnerPadding\n                },\n                domain: {\n                    data: 'stackedgroup',\n                    field: 'column',\n                    sort: true\n                }\n            },\n            {\n                name: 'yinternalscale',\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'ybandw'\n                    }\n                ],\n                padding: {\n                    signal: SignalNames.InnerPadding\n                },\n                domain: {\n                    data: 'stackedgroup',\n                    field: 'depth',\n                    sort: true\n                }\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$5 (context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            colorBinCountSignal(context),\n            colorReverseSignal(context),\n            {\n                name: SignalNames.XGridSize,\n                value: 3,\n                bind: {\n                    name: specViewOptions.language.XGridSize,\n                    input: 'range',\n                    min: 1,\n                    max: 20,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.YGridSize,\n                value: 3,\n                bind: {\n                    name: specViewOptions.language.YGridSize,\n                    input: 'range',\n                    min: 1,\n                    max: 20,\n                    step: 1\n                }\n            },\n            specColumns.x.quantitative && {\n                name: SignalNames.XBins,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.XBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 60,\n                    step: 1\n                }\n            },\n            specColumns.y.quantitative && {\n                name: SignalNames.YBins,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.YBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 60,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.InnerPadding,\n                value: 0.1,\n                bind: {\n                    name: specViewOptions.language.InnerPaddingSize,\n                    input: 'range',\n                    min: 0.1,\n                    max: 0.6,\n                    step: 0.1\n                }\n            },\n            {\n                name: SignalNames.OuterPadding,\n                value: 0.2,\n                bind: {\n                    name: specViewOptions.language.OuterPaddingSize,\n                    input: 'range',\n                    min: 0.1,\n                    max: 0.6,\n                    step: 0.1\n                }\n            },\n            {\n                name: 'columns',\n                update: `${SignalNames.XGridSize}*${SignalNames.YGridSize}`\n            },\n            {\n                name: 'xbandw',\n                update: 'bandwidth(\\'xband\\')'\n            },\n            {\n                name: 'xbandsize',\n                update: `(xbandw / (${SignalNames.XGridSize} + ${SignalNames.InnerPadding}))*(1-${SignalNames.InnerPadding})`\n            },\n            {\n                name: 'ybandw',\n                update: `height/((${specColumns.y.quantitative ? SignalNames.YBins : specColumns.y.stats.distinctValueCount}) * (1 + ${SignalNames.OuterPadding}))`\n            },\n            {\n                name: 'ybandsize',\n                update: `(ybandw / (${SignalNames.YGridSize} + ${SignalNames.InnerPadding}))*(1-${SignalNames.InnerPadding})`\n            },\n            {\n                name: 'actsize',\n                update: 'min(xbandsize,ybandsize)'\n            },\n            {\n                name: 'countheight',\n                update: `rowxtent[1]*actsize*${SignalNames.ZProportion}/${defaultZProportion}`\n            }\n        ], insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const stacks = (context) => {\n        const { specColumns, insight } = context;\n        const errors = [];\n        if (!specColumns.x)\n            errors.push('Must set a field for x axis');\n        if (!specColumns.y)\n            errors.push('Must set a field for y axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.XBins]\n                },\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.YBins]\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$5(context),\n            data: getData$5(context),\n            scales: getScales$5(context),\n            marks: getMarks$5(context)\n        };\n        if (!insight.hideAxes) {\n            vegaSpec.axes = getAxes$4(context);\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$6 (context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const TreeMapDataName = 'SandDanceTreeMapData';\n        const data = allTruthy(facetSourceData(specColumns.facet, insight.facets, TreeMapDataName), [\n            {\n                name: DataNames.Main,\n                source: TreeMapDataName,\n                transform: allTruthy(specColumns.facet && facetTransforms(specColumns.facet, insight.facets), !specColumns.facet && treemapTransforms(insight))\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), specColumns.facet && facetGroupData(DataNames.Main));\n        return data;\n    }\n    function treemapTransforms(insight) {\n        const transforms = [\n            {\n                type: 'nest',\n                keys: [insight.columns.group || '__NONE__']\n            },\n            {\n                type: 'treemap',\n                field: insight.columns.size,\n                sort: { field: 'value', order: 'descending' },\n                round: true,\n                method: { signal: SignalNames.TreeMapMethod },\n                padding: 1,\n                size: [{ signal: 'width' }, { signal: 'height' }],\n                as: [\n                    FieldNames.TreemapStackX0,\n                    FieldNames.TreemapStackY0,\n                    FieldNames.TreemapStackX1,\n                    FieldNames.TreemapStackY1,\n                    FieldNames.TreemapStackDepth,\n                    FieldNames.TreemapStackChildren\n                ]\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$6 (context, data) {\n        const { specColumns } = context;\n        const marks = [\n            {\n                type: 'rect',\n                from: {\n                    data\n                },\n                encode: {\n                    update: {\n                        x: { field: FieldNames.TreemapStackX0 },\n                        y: { field: FieldNames.TreemapStackY0 },\n                        x2: { field: FieldNames.TreemapStackX1 },\n                        y2: { field: FieldNames.TreemapStackY1 },\n                        fill: fill(context),\n                        opacity: opacity(context)\n                    }\n                }\n            }\n        ];\n        if (specColumns.z) {\n            const update = marks[0].encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return marks;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$6 (context) {\n        const { specColumns, insight } = context;\n        const scales = [];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, false)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$6 (context) {\n        const { insight, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            colorBinCountSignal(context),\n            {\n                name: SignalNames.TreeMapMethod,\n                value: 'squarify',\n                bind: {\n                    name: specViewOptions.language.treeMapMethod,\n                    input: 'select',\n                    options: [\n                        'squarify', 'binary'\n                    ]\n                }\n            },\n            colorReverseSignal(context)\n        ], insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const treemap = (context) => {\n        const { specColumns, insight, specViewOptions } = context;\n        const errors = [];\n        if (!specColumns.size)\n            errors.push('Must set a field for size');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'size',\n                    excludeCategoric: true\n                },\n                {\n                    role: 'group',\n                    allowNone: true\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true\n                }\n            ],\n            signals: [SignalNames.TreeMapMethod]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const dataName = categoricalColor ? DataNames.Legend : DataNames.Main;\n        const TreeMapName = 'SandDanceTreeMapFaceted';\n        const data = getData$6(context);\n        let marks = getMarks$6(context, specColumns.facet ? TreeMapName : dataName);\n        if (specColumns.facet) {\n            const childData = {\n                name: TreeMapName,\n                source: DataNames.FacetGroupCell,\n                transform: treemapTransforms(insight)\n            };\n            marks = facetMarks(specViewOptions, dataName, marks, null, [childData]);\n            marks[0].marks;\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$6(context),\n            data,\n            scales: getScales$6(context),\n            marks\n        };\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const creators = {\n        barchart: barchartV,\n        barchartH,\n        barchartV,\n        density,\n        grid,\n        scatterplot,\n        stacks,\n        treemap\n    };\n    function create(context) {\n        const { insight } = context;\n        const creator = creators[insight.chart];\n        if (creator) {\n            const specResult = creator(context);\n            //TODO: find why Vega is doing this. fixup for facets\n            if (specResult.vegaSpec && insight.columns && insight.columns.facet && insight.facets.columns === 2 && insight.facets.rows === 1) {\n                specResult.vegaSpec.width = insight.size.width / 3;\n            }\n            return specResult;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function cloneVegaSpecWithData(context, currData) {\n        const { specColumns } = context;\n        const columns = [\n            specColumns.color,\n            specColumns.facet,\n            specColumns.group,\n            specColumns.size,\n            specColumns.sort,\n            specColumns.x,\n            specColumns.y,\n            specColumns.z\n        ];\n        inferAll(columns, currData);\n        const specResult = create(context);\n        if (!specResult.errors) {\n            const data0 = specResult.vegaSpec.data[0];\n            data0.values = currData;\n        }\n        return specResult;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function valueToBoolean(value) {\n        if (typeof value === 'string') {\n            switch (value.toLowerCase()) {\n                case 'true':\n                    return true;\n                case 'false':\n                    return false;\n            }\n        }\n        return !!value;\n    }\n    function valueToString(value) {\n        if (value == null) {\n            return '';\n        }\n        switch (typeof value) {\n            case 'string':\n                return value;\n            case 'boolean':\n            case 'number':\n                return value.toString();\n        }\n        return '';\n    }\n    function isStringOperation(ex) {\n        switch (ex.operator) {\n            case 'contains':\n            case '!contains':\n            case 'starts':\n            case '!starts':\n                return true;\n        }\n        return false;\n    }\n    function isnullorEmpty(value) {\n        if (value == null)\n            return true; //double equal sign to also catch undefined\n        if (typeof value === 'string' && value.length === 0)\n            return true;\n        return false;\n    }\n    class Exec {\n        constructor(search, columns) {\n            this.columns = columns;\n            this.groups = clone(ensureSearchExpressionGroupArray(search));\n            this.groups.forEach(group => {\n                group.expressions.forEach(ex => {\n                    ex.column = this.getColumn(ex.name);\n                    ex.valueBool = valueToBoolean(ex.value);\n                    ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n                    ex.stringOperation = isStringOperation(ex);\n                });\n            });\n        }\n        getColumn(name) {\n            for (let i = 0; i < this.columns.length; i++) {\n                if (this.columns[i].name == name) {\n                    return this.columns[i];\n                }\n            }\n        }\n        runExpressionOnColumn(datum, ex) {\n            const actualDataValue = datum[ex.name];\n            if (ex.operator === 'isnullorEmpty') {\n                return isnullorEmpty(actualDataValue);\n            }\n            else if (ex.operator === '!isnullorEmpty') {\n                return !isnullorEmpty(actualDataValue);\n            }\n            let dataValue = actualDataValue;\n            let expressionValue = ex.value;\n            if (ex.column) {\n                if (ex.column.type === 'string' || ex.stringOperation) {\n                    dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n                    expressionValue = ex.valueLow;\n                }\n                else if (ex.column.type === 'boolean') {\n                    dataValue = valueToBoolean(actualDataValue);\n                    expressionValue = ex.valueBool;\n                }\n                else if (ex.column.quantitative) {\n                    dataValue = +actualDataValue;\n                    expressionValue = +ex.value;\n                }\n            }\n            switch (ex.operator) {\n                case '!=':\n                    return dataValue != expressionValue;\n                case '<':\n                    return dataValue < expressionValue;\n                case '<=':\n                    return dataValue <= expressionValue;\n                case '==':\n                    return dataValue == expressionValue;\n                case '>':\n                    return dataValue > expressionValue;\n                case '>=':\n                    return dataValue >= expressionValue;\n                case 'contains':\n                    return dataValue.indexOf(expressionValue) >= 0;\n                case '!contains':\n                    return dataValue.indexOf(expressionValue) < 0;\n                case 'starts':\n                    return dataValue.indexOf(expressionValue) == 0;\n                case '!starts':\n                    return dataValue.indexOf(expressionValue) !== 0;\n            }\n        }\n        runExpression(datum, ex) {\n            if (ex.name == null) {\n                //run on all columns\n                const group = {\n                    expressions: this.columns.map((column, i) => {\n                        const ex2 = Object.assign(Object.assign({}, ex), { column, name: column.name });\n                        if (i) {\n                            ex2.clause = '||';\n                        }\n                        return ex2;\n                    })\n                };\n                return this.runGroup(datum, group);\n            }\n            else {\n                return this.runExpressionOnColumn(datum, ex);\n            }\n        }\n        runGroup(datum, group) {\n            let accumulator = this.runExpression(datum, group.expressions[0]);\n            for (let i = 1; i < group.expressions.length; i++) {\n                let ex = group.expressions[i];\n                switch (ex.clause) {\n                    case '&&':\n                        accumulator = accumulator && this.runExpression(datum, ex);\n                        break;\n                    case '||':\n                        accumulator = accumulator || this.runExpression(datum, ex);\n                        break;\n                }\n            }\n            return accumulator;\n        }\n        run(datum) {\n            let accumulator = this.runGroup(datum, this.groups[0]);\n            for (let i = 1; i < this.groups.length; i++) {\n                let group = this.groups[i];\n                switch (group.clause) {\n                    case '&&':\n                        accumulator = accumulator && this.runGroup(datum, group);\n                        break;\n                    case '||':\n                        accumulator = accumulator || this.runGroup(datum, group);\n                        break;\n                }\n            }\n            return accumulator;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class DataScope {\n        setData(data, columns) {\n            const differentData = this.data !== data;\n            if (differentData) {\n                if (this.data) {\n                    //clean up things we added to old data\n                    this.deselect();\n                }\n                this.data = data;\n                this.columns = columns;\n                this.filteredData = null;\n            }\n            return differentData;\n        }\n        getColumns(columnTypes) {\n            if (!this.columns) {\n                this.columns = getColumnsFromData(this.data, columnTypes);\n            }\n            return this.columns;\n        }\n        currentData() {\n            return this.filteredData || this.data;\n        }\n        select(search) {\n            this.deselect();\n            if (search) {\n                this.selection = this.createUserSelection(search, true);\n                if (this.selection.included.length) {\n                    this.activate(this.selection.included[0]);\n                }\n            }\n        }\n        createUserSelection(search, assign) {\n            const exec = new Exec(search, this.getColumns());\n            const s = {\n                search,\n                included: [],\n                excluded: []\n            };\n            this.currentData().forEach(datum => {\n                if (exec.run(datum)) {\n                    if (assign) {\n                        datum[FieldNames.Selected] = true;\n                    }\n                    s.included.push(datum);\n                }\n                else {\n                    s.excluded.push(datum);\n                }\n            });\n            return s;\n        }\n        deselect() {\n            this.deactivate();\n            this.data.forEach(datum => {\n                delete datum[FieldNames.Selected];\n            });\n            this.selection = null;\n        }\n        hasSelectedData() {\n            return !!this.selection;\n        }\n        collapse(collapsed, data = this.data) {\n            data.forEach(datum => {\n                datum[FieldNames.Collapsed] = collapsed;\n            });\n            this.isCollapsed = collapsed;\n        }\n        activate(datum) {\n            this.deactivate();\n            datum[FieldNames.Active] = true;\n            this.active = datum;\n        }\n        deactivate() {\n            if (this.active) {\n                delete this.active[FieldNames.Active];\n            }\n            this.active = null;\n        }\n        ordinalIndexWithinSelection(ordinal) {\n            if (this.selection) {\n                for (let i = 0; i < this.selection.included.length; i++) {\n                    let datum = this.selection.included[i];\n                    if (datum[GL_ORDINAL] === ordinal) {\n                        return { datum, index: i };\n                    }\n                }\n            }\n            return { datum: null, index: -1 };\n        }\n        finalize() {\n            this.data = null;\n            this.filteredData = null;\n            if (this.selection) {\n                this.selection.excluded = null;\n                this.selection.included = null;\n                this.selection = null;\n            }\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    var Action;\n    (function (Action) {\n        Action[Action[\"deselect\"] = 0] = \"deselect\";\n        Action[Action[\"isolate\"] = 1] = \"isolate\";\n        Action[Action[\"exclude\"] = 2] = \"exclude\";\n        Action[Action[\"reset\"] = 3] = \"reset\";\n        Action[Action[\"next\"] = 4] = \"next\";\n        Action[Action[\"previous\"] = 5] = \"previous\";\n    })(Action || (Action = {}));\n    class Details {\n        constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n            this.language = language;\n            this.animator = animator;\n            this.dataScope = dataScope;\n            this.colorMapHandler = colorMapHandler;\n            this.hasColorMaps = hasColorMaps;\n            this.element = addDiv(parentElement, `${cssPrefix}unitControls`);\n            this.clear();\n        }\n        finalize() {\n            if (this.element)\n                this.element.innerHTML = '';\n            this.dataScope = null;\n            this.element = null;\n        }\n        clear() {\n            this.state = {\n                userSelection: null,\n                index: -1,\n                remapColor: false\n            };\n            this.render();\n        }\n        clearSelection() {\n            this.state.userSelection = null;\n            this.state.index = -1;\n            this.render();\n        }\n        populate(userSelection, index = 0) {\n            this.state.userSelection = userSelection;\n            this.state.index = index;\n            this.render();\n        }\n        selectByNameValue(columnName, value) {\n            const search = {\n                name: columnName,\n                operator: '==',\n                value\n            };\n            this.clearSelection();\n            this.animator.select(search);\n            this.populate(this.dataScope.selection);\n        }\n        remapChanged(remap) {\n            this.state.remapColor = remap;\n            this.colorMapHandler(remap);\n            this.render();\n        }\n        handleAction(action) {\n            let p;\n            const u = this.state.userSelection;\n            switch (action) {\n                case Action.deselect:\n                    this.clearSelection();\n                    p = this.animator.deselect();\n                    break;\n                case Action.exclude:\n                    this.clearSelection();\n                    p = this.animator.filter(invert(u.search), u.excluded, u.included);\n                    this.state.remapColor = false;\n                    break;\n                case Action.isolate:\n                    this.clearSelection();\n                    p = this.animator.filter(u.search, u.included, u.excluded);\n                    this.state.remapColor = false;\n                    break;\n                case Action.reset:\n                    this.clear();\n                    p = this.animator.reset();\n                    break;\n                default:\n                    switch (action) {\n                        case Action.previous:\n                            this.state.index--;\n                            if (this.state.index < 0) {\n                                this.state.index = this.state.userSelection.included.length - 1;\n                            }\n                            break;\n                        case Action.next:\n                            this.state.index++;\n                            if (this.state.index >= this.state.userSelection.included.length) {\n                                this.state.index = 0;\n                            }\n                            break;\n                    }\n                    this.render();\n                    p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n            }\n            p.then(() => this.render());\n        }\n        render() {\n            const hasRefinedData = !!this.dataScope.filteredData;\n            const renderProps = {\n                language: this.language,\n                actionHandler: action => this.handleAction(action),\n                selectionHandler: (columnName, value) => this.selectByNameValue(columnName, value),\n                count: this.state.userSelection && this.state.userSelection.included.length,\n                hasRefinedData,\n                item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n                remapColorHandler: remap => this.remapChanged(remap),\n                hasColorMaps: this.hasColorMaps() && hasRefinedData,\n                remapColor: this.state.remapColor\n            };\n            mount(renderDetails(renderProps), this.element);\n        }\n    }\n    const renderDetails = (props) => {\n        const controlButtons = [\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.deselect) }, props.language.deselect),\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.isolate) }, props.language.isolate),\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.exclude) }, props.language.exclude)\n        ];\n        const colorMapping = (createElement(\"div\", null,\n            createElement(\"button\", { disabled: props.remapColor, onClick: e => props.remapColorHandler(true) }, props.language.newColorMap),\n            createElement(\"button\", { disabled: !props.remapColor, onClick: e => props.remapColorHandler(false) }, props.language.oldColorMap)));\n        const singleItem = props.count === 1;\n        const scrollButtons = [\n            createElement(\"button\", { disabled: singleItem, onClick: e => props.actionHandler(Action.previous) }, props.language.previousDetail),\n            createElement(\"button\", { disabled: singleItem, onClick: e => props.actionHandler(Action.next) }, props.language.nextDetail),\n            createElement(\"span\", null,\n                \" \",\n                props.language.selectionCount(props.count))\n        ];\n        const rows = [];\n        for (let prop in props.item) {\n            if (prop === GL_ORDINAL) {\n                continue;\n            }\n            if (isInternalFieldName(prop)) {\n                continue;\n            }\n            rows.push({\n                cells: [\n                    { content: prop }, { content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler) }\n                ]\n            });\n        }\n        return (createElement(\"div\", null,\n            props.hasColorMaps && colorMapping,\n            createElement(\"h4\", null, props.language.headers.selection),\n            createElement(\"div\", { className: `${cssPrefix}selection` },\n                controlButtons,\n                createElement(\"button\", { disabled: !props.hasRefinedData, onClick: e => props.actionHandler(Action.reset) }, \"reset\")),\n            props.item && createElement(\"h4\", null, props.language.headers.details),\n            createElement(\"div\", null,\n                createElement(\"div\", { className: `${cssPrefix}details-scroll` }, props.item && scrollButtons),\n                createElement(\"div\", { className: `${cssPrefix}details` }, props.item && createElement(Table, { rows: rows })))));\n    };\n    function linkSelect(language, columnName, value, selectionHandler) {\n        return (createElement(\"span\", null,\n            createElement(\"a\", { href: \"#\", onClick: e => selectionHandler(columnName, value) }, value),\n            isNaN(value) ? [' ', createElement(\"a\", { className: \"bing-search\", href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`, target: \"_blank\" }, language.bing)] : ''));\n    }\n\n    function ensureHeaders(presenter, headers) {\n        const vegaControls = presenter.getElement(PresenterElement.vegaControls);\n        conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n        const legend = presenter.getElement(PresenterElement.legend);\n        conditionalHeader(!!legend.children.length, legend, headers.legend);\n    }\n    function conditionalHeader(condition, element, header) {\n        var existing = existingHeader(element, header);\n        if (condition && !existing) {\n            addHeader(element, header);\n        }\n        if (!condition && existing) {\n            existing.remove();\n        }\n    }\n    function addHeader(element, header) {\n        const h = document.createElement('h4');\n        h.innerHTML = header;\n        element.insertAdjacentElement('beforebegin', h);\n    }\n    function existingHeader(element, header) {\n        const { previousElementSibling } = element;\n        if (previousElementSibling && previousElementSibling.innerHTML === header) {\n            return previousElementSibling;\n        }\n    }\n\n    function legendRange(colorBinType, column, legend, clickedIndex) {\n        if (column.quantitative) {\n            return selectQuantitative(colorBinType, column, legend, clickedIndex);\n        }\n        else {\n            return selectCategorical(column, legend, clickedIndex);\n        }\n    }\n    function selectCategorical(column, legend, clickedIndex) {\n        const value = legend.rows[clickedIndex].value;\n        if (value === Other) {\n            const values = [];\n            for (let i in legend.rows) {\n                if (+i !== clickedIndex) {\n                    values.push(legend.rows[i].value);\n                }\n            }\n            return selectNone(column, values);\n        }\n        else {\n            //select equal\n            return { expressions: [selectExact(column, legend.rows[clickedIndex].value)] };\n        }\n    }\n    function selectQuantitative(colorBinType, column, legend, clickedIndex) {\n        const keys = Object.keys(legend.rows).map(key => +key).sort((a, b) => +a - +b);\n        let lowValue;\n        let lowOperator;\n        let highValue;\n        let highOperator;\n        const rowText = legend.rows[clickedIndex].label;\n        switch (colorBinType) {\n            case 'continuous': {\n                lowValue = rowText;\n                if (clickedIndex < keys.length - 1) {\n                    highValue = legend.rows[clickedIndex + 1].value;\n                }\n                break;\n            }\n            default: {\n                if (rowText.indexOf('null') > 0) {\n                    const ex = {\n                        expressions: [selectNullOrEmpty(column)]\n                    };\n                    return ex;\n                }\n                const dash = rowText.indexOf('–'); //this is not the common dash character!\n                if (dash > 0) {\n                    //bug in Vega for quantize?\n                    //lowOperator = '>';\n                    //highOperator = '<=';\n                    lowValue = rowText.substr(0, dash);\n                    highValue = rowText.substr(dash + 1);\n                }\n                else {\n                    if (rowText.indexOf('<') >= 0) {\n                        highValue = rowText.substring(2);\n                    }\n                    else {\n                        if (rowText.indexOf('≥') >= 0) {\n                            lowValue = rowText.substring(2);\n                        }\n                    }\n                }\n            }\n        }\n        if (lowValue)\n            lowValue = notNice(lowValue);\n        if (highValue)\n            highValue = notNice(highValue);\n        return selectBetween(column, lowValue, highValue, lowOperator, highOperator);\n    }\n    function finalizeLegend(colorBinType, colorColumn, legend, language) {\n        const rowTexts = [];\n        for (let i in legend.rows) {\n            let row = legend.rows[i];\n            row.search = legendRange(colorBinType, colorColumn, legend, +i);\n            if (row.value === Other) {\n                row.label = language.legendOther;\n            }\n            else if (rowTexts.indexOf(row.value) >= 0) {\n                delete legend.rows[i];\n            }\n            else {\n                rowTexts.push(row.value);\n            }\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function cloneAxis(axes, axisColor, axisTextColor) {\n        return axes.map(axis => {\n            const newAxis = deepMerge(axis);\n            newAxis.domain.color = axisColor;\n            newAxis.title.color = axisTextColor;\n            newAxis.ticks.forEach(t => { t.color = axisColor; });\n            newAxis.tickText.forEach(t => { t.color = axisTextColor; });\n            return newAxis;\n        });\n    }\n    function cloneTextData(textData, color) {\n        return textData.map(t => {\n            return Object.assign(Object.assign({}, t), { color });\n        });\n    }\n    function colorEquals(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    function recolorAxes(stage, oldColors, newColors) {\n        const hasNewLineColor = newColors.axisLine && !colorEquals(newColors.axisLine, oldColors.axisLine);\n        const hasNewTextColor = newColors.axisText && !colorEquals(newColors.axisText, oldColors.axisText);\n        let axes;\n        let textData;\n        if (hasNewLineColor || hasNewTextColor) {\n            const lineColor = newColors.axisLine || oldColors.axisLine;\n            const textColor = newColors.axisText || oldColors.axisText;\n            axes = {\n                x: cloneAxis(stage.axes.x, lineColor, textColor),\n                y: cloneAxis(stage.axes.y, lineColor, textColor)\n            };\n        }\n        if (hasNewTextColor) {\n            textData = cloneTextData(stage.textData, newColors.axisText);\n        }\n        return { axes, textData };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Tooltip {\n        constructor(props) {\n            const renderProps = {\n                cssPrefix: props.cssPrefix,\n                rows: getRows(props.item, props.options)\n            };\n            this.element = renderTooltip(renderProps);\n            if (this.element) {\n                this.element.style.position = 'absolute';\n                this.child = this.element.firstChild;\n                document.body.appendChild(this.element);\n                //measure and move as necessary\n                let m = outerSize(this.child);\n                while (m.height > document.documentElement.clientHeight) {\n                    let tr = this.child.querySelector('tr:last-child');\n                    if (tr) {\n                        tr.parentElement.removeChild(tr);\n                    }\n                    else {\n                        break;\n                    }\n                    m = outerSize(this.child);\n                }\n                if (props.position.clientX + m.width >= document.documentElement.clientWidth) {\n                    this.child.style.right = '0';\n                }\n                let moveTop = true;\n                if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n                    if (props.position.clientY - m.height > 0) {\n                        this.child.style.bottom = '0';\n                    }\n                    else {\n                        moveTop = false;\n                    }\n                }\n                if (moveTop) {\n                    this.element.style.top = `${props.position.clientY}px`;\n                }\n                this.element.style.left = `${props.position.clientX}px`;\n            }\n        }\n        finalize() {\n            if (this.element) {\n                document.body.removeChild(this.element);\n            }\n            this.element = null;\n        }\n    }\n    function getRows(item, options) {\n        const rows = [];\n        for (let columnName in item) {\n            if (columnName === GL_ORDINAL) {\n                continue;\n            }\n            if (isInternalFieldName(columnName)) {\n                continue;\n            }\n            if (options && options.exclude) {\n                if (options.exclude(columnName)) {\n                    continue;\n                }\n            }\n            let value = item[columnName];\n            let content;\n            if (options && options.displayValue) {\n                content = options.displayValue(value);\n            }\n            else {\n                switch (value) {\n                    case null:\n                        content = createElement(\"i\", null, \"null\");\n                        break;\n                    case undefined:\n                        content = createElement(\"i\", null, \"undefined\");\n                        break;\n                    default:\n                        content = value.toString();\n                }\n            }\n            rows.push({\n                cells: [\n                    { content: columnName + ':' },\n                    { content }\n                ]\n            });\n        }\n        return rows;\n    }\n    const renderTooltip = (props) => {\n        return props.rows.length === 0 ? null : (createElement(\"div\", { className: `${props.cssPrefix}tooltip` }, Table({ rows: props.rows })));\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    let didRegisterColorSchemes = false;\n    /**\n     * Component to view a SandDance data visualization.\n     */\n    class Viewer {\n        /**\n         * Instantiate a new Viewer.\n         * @param element Parent HTMLElement to present within.\n         * @param options Optional viewer options object.\n         */\n        constructor(element, options) {\n            this.element = element;\n            this.options = deepMerge(defaultViewerOptions, options);\n            this.presenter = new Presenter(element, getPresenterStyle(this.options));\n            this._dataScope = new DataScope();\n            this._animator = new Animator(this._dataScope, {\n                onDataChanged: this.onDataChanged.bind(this),\n                onAnimateDataChange: this.onAnimateDataChange.bind(this)\n            });\n            this._details = new Details(this.presenter.getElement(PresenterElement.panel), this.options.language, this._animator, this._dataScope, remap => {\n                this.currentColorContext = ~~remap;\n                this.renderSameLayout();\n            }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n            this.insight = {};\n            this._signalValues = {};\n        }\n        changeColorContexts(colorContexts) {\n            this.colorContexts = colorContexts;\n            this.currentColorContext = 0;\n            this.options.onColorContextChange && this.options.onColorContextChange();\n        }\n        applyLegendColorContext(colorContext) {\n            mount(colorContext.legendElement, this.presenter.getElement(PresenterElement.legend));\n            this.presenter.stage.legend = colorContext.legend;\n        }\n        onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n            if (dataChange === DataLayoutChange.refine) {\n                const oldColorContext = this.colorContexts[this.currentColorContext];\n                this.renderNewLayout({\n                    preStage: (stage, deckProps) => {\n                        finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                        applyColorMapToCubes([oldColorContext.colorMap], getCubes(deckProps));\n                        if (this.options.onStage) {\n                            this.options.onStage(stage, deckProps);\n                        }\n                    }\n                });\n                //apply old legend\n                this.applyLegendColorContext(oldColorContext);\n            }\n            else {\n                this.renderNewLayout({\n                    preStage: (stage, deckProps) => {\n                        finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                        if (this.options.onStage) {\n                            this.options.onStage(stage, deckProps);\n                        }\n                    }\n                });\n            }\n            return new Promise((resolve, reject) => {\n                this.presenter.animationQueue(resolve, this.options.transitionDurations.position, { waitingLabel, handlerLabel, animationCanceled: reject });\n            });\n        }\n        onDataChanged(dataLayout, filter) {\n            switch (dataLayout) {\n                case DataLayoutChange.same: {\n                    this.renderSameLayout();\n                    break;\n                }\n                case DataLayoutChange.refine: {\n                    //save cube colors\n                    const oldColorContext = this.colorContexts[this.currentColorContext];\n                    let colorMap;\n                    this.renderNewLayout({\n                        preStage: (stage, deckProps) => {\n                            //save off the spec colors\n                            colorMap = colorMapFromCubes(stage.cubeData);\n                            applyColorMapToCubes([oldColorContext.colorMap], getCubes(deckProps));\n                            this.preStage(stage, deckProps);\n                        },\n                        onPresent: () => {\n                            //save new legend\n                            const newColorContext = {\n                                colorMap,\n                                legend: clone(this.presenter.stage.legend),\n                                legendElement: this.presenter.getElement(PresenterElement.legend).children[0]\n                            };\n                            //apply old legend\n                            this.applyLegendColorContext(oldColorContext);\n                            this.changeColorContexts([oldColorContext, newColorContext]);\n                        }\n                    });\n                    this.insight.filter = narrow(this.insight.filter, filter);\n                    if (this.options.onDataFilter) {\n                        this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                    }\n                    break;\n                }\n                case DataLayoutChange.reset: {\n                    const colorContext = {\n                        colorMap: null,\n                        legend: null,\n                        legendElement: null\n                    };\n                    this.changeColorContexts([colorContext]);\n                    this.renderNewLayout({\n                        onPresent: () => {\n                            populateColorContext(colorContext, this.presenter);\n                        }\n                    });\n                    delete this.insight.filter;\n                    if (this.options.onDataFilter) {\n                        this.options.onDataFilter(null, null);\n                    }\n                    break;\n                }\n            }\n            if (this.options.onSelectionChanged) {\n                const sel = this.getSelection();\n                this.options.onSelectionChanged((sel && sel.search) || null, 0, (sel && sel.selectedData) || null);\n            }\n        }\n        renderNewLayout(c, view) {\n            const currData = this._dataScope.currentData();\n            const context = { specColumns: this._specColumns, insight: this.insight, specViewOptions: this.options };\n            const specResult = cloneVegaSpecWithData(context, currData);\n            if (!specResult.errors) {\n                const uiValues = extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n                this._signalValues = Object.assign(Object.assign(Object.assign({}, this._signalValues), uiValues), this.insight.signalValues);\n                applySignalValues(this._signalValues, specResult.vegaSpec);\n                this.vegaSpec = specResult.vegaSpec;\n                this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n                this.specCapabilities = specResult.specCapabilities;\n                const config = this.createConfig(c);\n                if (view) {\n                    config.getView = () => view;\n                }\n                if (!didRegisterColorSchemes) {\n                    registerColorSchemes(base.vega);\n                    didRegisterColorSchemes = true;\n                }\n                try {\n                    const runtime = base.vega.parse(this.vegaSpec);\n                    this.vegaViewGl = new ViewGl(runtime, config)\n                        .renderer('deck.gl')\n                        .initialize(this.element)\n                        .run();\n                    //capture new color color contexts via signals\n                    this.configForSignalCapture(config.presenterConfig);\n                }\n                catch (e) {\n                    specResult.errors = [e.message];\n                }\n                if (!specResult.errors) {\n                    ensureHeaders(this.presenter, this.options.language.headers);\n                }\n            }\n            if (specResult.errors) {\n                if (this.options.onError) {\n                    this.options.onError(specResult.errors);\n                }\n                else if (this.presenter.logger) {\n                    this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n                }\n            }\n            return specResult;\n        }\n        /**\n         * Render the same layout with new options.\n         * @param newViewerOptions New options object.\n         */\n        renderSameLayout(newViewerOptions) {\n            const colorContext = this.colorContexts[this.currentColorContext];\n            const clonedCubes = this.presenter.getCubeData().map(cube => {\n                return Object.assign({}, cube);\n            });\n            this.applyLegendColorContext(colorContext);\n            let { axes, textData } = this.presenter.stage;\n            let recoloredAxes;\n            if (newViewerOptions) {\n                if (newViewerOptions.colors) {\n                    recoloredAxes = recolorAxes(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n                    axes = recoloredAxes.axes || axes;\n                    textData = recoloredAxes.textData || textData;\n                }\n                this.options = deepMerge(this.options, newViewerOptions);\n            }\n            let colorMaps = [colorContext.colorMap];\n            let colorMethod;\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            const hasActive = !!this._dataScope.active;\n            if (hasSelectedData || hasActive) {\n                const selectedColorMap = getSelectedColorMap(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                colorMaps.push(selectedColorMap);\n                colorMethod = this.options.colors.unselectedColorMethod;\n            }\n            applyColorMapToCubes(colorMaps, clonedCubes, colorMethod);\n            const stage = { cubeData: clonedCubes, axes, textData };\n            this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n        }\n        getView(view) {\n            if (view === undefined) {\n                if (this.presenter.view === null) {\n                    return defaultView;\n                }\n                else {\n                    return this.presenter.view;\n                }\n            }\n            else {\n                return view;\n            }\n        }\n        /**\n         * Render data into a visualization.\n         * @param insight Object to create a visualization specification.\n         * @param data Array of data objects.\n         * @param view Optional View to specify camera type.\n         * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n         */\n        render(insight, data, options = {}) {\n            return new Promise((resolve, reject) => {\n                let result;\n                const layout = () => {\n                    result = this._render(insight, data, options);\n                };\n                //see if refine expression has changed\n                if (!compare(insight.filter, this.insight.filter)) {\n                    if (insight.filter) {\n                        //refining\n                        layout();\n                        this.presenter.animationQueue(() => {\n                            this.filter(insight.filter);\n                        }, this.options.transitionDurations.position, { waitingLabel: 'layout before refine', handlerLabel: 'refine after layout' });\n                    }\n                    else {\n                        //not refining\n                        this._dataScope.filteredData = null;\n                        layout();\n                        this.presenter.animationQueue(() => {\n                            this.reset();\n                        }, 0, { waitingLabel: 'layout before reset', handlerLabel: 'reset after layout' });\n                    }\n                }\n                else {\n                    layout();\n                }\n                resolve(result);\n            });\n        }\n        shouldViewstateTransition(newInsight, oldInsight) {\n            if (!oldInsight.columns)\n                return false;\n            if (oldInsight.chart !== newInsight.chart)\n                return true;\n            if (oldInsight.size.height !== newInsight.size.height)\n                return true;\n            if (oldInsight.size.width !== newInsight.size.width)\n                return true;\n            if (oldInsight.columns.facet !== newInsight.columns.facet)\n                return true;\n            return false;\n        }\n        configForSignalCapture(presenterConfig) {\n            const colorContext = {\n                colorMap: null,\n                legend: null,\n                legendElement: null\n            };\n            //now be ready to capture color changing signals \n            presenterConfig.preStage = (stage, deckProps) => {\n                if (this._shouldSaveColorContext()) {\n                    //save off the colors from Vega layout\n                    colorContext.colorMap = colorMapFromCubes(stage.cubeData);\n                }\n                this.preStage(stage, deckProps);\n            };\n            presenterConfig.onPresent = () => {\n                if (this._shouldSaveColorContext()) {\n                    populateColorContext(colorContext, this.presenter);\n                    this.changeColorContexts([colorContext]);\n                    this._dataScope.deselect();\n                }\n            };\n        }\n        _render(insight, data, options) {\n            if (this._tooltip) {\n                this._tooltip.finalize();\n                this._tooltip = null;\n            }\n            if (this._dataScope.setData(data, options.columns)) {\n                //data is different, reset the signal value cache\n                this._signalValues = {};\n            }\n            this._specColumns = getSpecColumns(insight, this._dataScope.getColumns(options.columnTypes));\n            const ordinalMap = assignOrdinals(this._specColumns, data, options.ordinalMap);\n            this.insight = clone(insight);\n            this._lastColorOptions = clone(this.options.colors);\n            this._shouldSaveColorContext = () => !options.initialColorContext;\n            const colorContext = options.initialColorContext || {\n                colorMap: null,\n                legend: null,\n                legendElement: null\n            };\n            const specResult = this.renderNewLayout({\n                preStage: (stage, deckProps) => {\n                    if (this._shouldSaveColorContext()) {\n                        //save off the colors from Vega layout\n                        colorContext.colorMap = colorMapFromCubes(stage.cubeData);\n                    }\n                    else {\n                        //apply passed colorContext\n                        applyColorMapToCubes([colorContext.colorMap], getCubes(deckProps));\n                    }\n                    //if items are selected, repaint\n                    const hasSelectedData = !!this._dataScope.hasSelectedData();\n                    const hasActive = !!this._dataScope.active;\n                    if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n                        const selectedColorMap = getSelectedColorMap(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                        applyColorMapToCubes([colorContext.colorMap, selectedColorMap], stage.cubeData, this.options.colors.unselectedColorMethod);\n                    }\n                    this.preStage(stage, deckProps);\n                },\n                onPresent: () => {\n                    if (this._shouldSaveColorContext()) {\n                        populateColorContext(colorContext, this.presenter);\n                        this.changeColorContexts([colorContext]);\n                    }\n                    else {\n                        //apply passed colorContext\n                        this.applyLegendColorContext(colorContext);\n                    }\n                },\n                shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight)\n            }, this.getView(insight.view));\n            //future signal changes should save the color context\n            this._shouldSaveColorContext = () => !options.discardColorContextUpdates || !options.discardColorContextUpdates();\n            this._details.render();\n            const result = { ordinalMap, specResult };\n            return result;\n        }\n        preStage(stage, deckProps) {\n            const onClick = (e, search) => {\n                if (this.options.onAxisClick) {\n                    this.options.onAxisClick(e, search);\n                }\n                else {\n                    this.select(search);\n                }\n            };\n            const polygonLayer = axisSelectionLayer(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n            const order = 1; //after textlayer but before others\n            deckProps.layers.splice(order, 0, polygonLayer);\n            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            if (this.options.onStage) {\n                this.options.onStage(stage, deckProps);\n            }\n        }\n        onCubeClick(e, cube) {\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n                //if active is within selection, keep the selection and activate the one.\n                const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n                if (indexWithinSelection.index >= 0) {\n                    this.activate(indexWithinSelection.datum);\n                    this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                    if (this.options.onSelectionChanged) {\n                        const sel = this.getSelection();\n                        this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                    }\n                    return;\n                }\n            }\n            if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][GL_ORDINAL] === cube.ordinal) {\n                this.deselect();\n                return;\n            }\n            const search = {\n                name: GL_ORDINAL,\n                operator: '==',\n                value: cube.ordinal\n            };\n            this.select(search);\n        }\n        onCubeHover(e, cube) {\n            if (this._tooltip) {\n                this._tooltip.finalize();\n                this._tooltip = null;\n            }\n            if (!cube) {\n                return;\n            }\n            const currentData = this._dataScope.currentData();\n            const index = getDataIndexOfCube(cube, currentData);\n            if (index >= 0) {\n                this._tooltip = new Tooltip({\n                    options: this.options.tooltipOptions,\n                    item: currentData[index],\n                    position: e,\n                    cssPrefix: this.presenter.style.cssPrefix\n                });\n            }\n        }\n        onTextHover(e, t) {\n            //return true if highlight color is different\n            if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor)\n                return false;\n            return !colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n        }\n        createConfig(c) {\n            const { getTextColor, getTextHighlightColor, onTextClick } = this.options;\n            const defaultPresenterConfig$$1 = {\n                getTextColor,\n                getTextHighlightColor,\n                onTextClick,\n                onCubeClick: this.onCubeClick.bind(this),\n                onCubeHover: this.onCubeHover.bind(this),\n                onTextHover: this.onTextHover.bind(this),\n                preStage: this.preStage.bind(this),\n                onPresent: this.options.onPresent,\n                onLayerClick: (info, pickedInfos, e) => {\n                    if (!info) {\n                        this.deselect();\n                    }\n                },\n                onLegendClick: (e, legend, clickedIndex) => {\n                    const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n                    if (legendRow) {\n                        if (this.options.onLegendRowClick) {\n                            this.options.onLegendRowClick(e, legendRow);\n                        }\n                        else {\n                            this.select(legendRow.search);\n                        }\n                    }\n                    else if (this.options.onLegendHeaderClick) {\n                        //header clicked\n                        this.options.onLegendHeaderClick(e);\n                    }\n                }\n            };\n            if (this.options.onBeforeCreateLayers) {\n                defaultPresenterConfig$$1.preLayer = stage => this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n            }\n            const config = {\n                presenter: this.presenter,\n                presenterConfig: Object.assign(defaultPresenterConfig$$1, c)\n            };\n            if (this.options.transitionDurations) {\n                config.presenterConfig.transitionDurations = this.options.transitionDurations;\n            }\n            return config;\n        }\n        /**\n         * Filter the data and animate.\n         * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n         */\n        filter(search) {\n            const u = this._dataScope.createUserSelection(search, false);\n            return new Promise((resolve, reject) => {\n                this._animator.filter(search, u.included, u.excluded).then(() => {\n                    this._details.clear();\n                    this._details.clearSelection();\n                    this._details.populate(this._dataScope.selection);\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Remove any filtration and animate.\n         */\n        reset() {\n            return new Promise((resolve, reject) => {\n                this._animator.reset().then(() => {\n                    this._details.clear();\n                    this._details.clearSelection();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Select cubes by a filter expression.\n         * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n         */\n        select(search) {\n            return new Promise((resolve, reject) => {\n                this._animator.select(search).then(() => {\n                    this._details.populate(this._dataScope.selection);\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Removes any selection.\n         */\n        deselect() {\n            return new Promise((resolve, reject) => {\n                this._animator.deselect().then(() => {\n                    this._details.clearSelection();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Gets the current selection.\n         */\n        getSelection() {\n            if (!this._dataScope)\n                return null;\n            const selectionState = {\n                search: (this._dataScope.selection && this._dataScope.selection.search) || null,\n                selectedData: (this._dataScope.selection && this._dataScope.selection.included) || null,\n                active: this._dataScope.active\n            };\n            return selectionState;\n        }\n        /**\n         * Set one data row to the active state.\n         */\n        activate(datum) {\n            return new Promise((resolve, reject) => {\n                this._animator.activate(datum).then(() => {\n                    this._details.render();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Deactivate item.\n         */\n        deActivate() {\n            return new Promise((resolve, reject) => {\n                if (this._dataScope && this._dataScope.active) {\n                    this._animator.deactivate().then(() => {\n                        this._details.render();\n                        resolve();\n                    });\n                }\n                else {\n                    resolve();\n                }\n            });\n        }\n        /**\n         * Gets the current insight with signal values.\n         */\n        getInsight() {\n            const insight = Object.assign({}, this.insight);\n            insight.signalValues = this.getSignalValues();\n            return insight;\n        }\n        /**\n         * Gets current signal values.\n         */\n        getSignalValues() {\n            return extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n        }\n        finalize() {\n            if (this._dataScope)\n                this._dataScope.finalize();\n            if (this._details)\n                this._details.finalize();\n            if (this._tooltip)\n                this._tooltip.finalize();\n            if (this.vegaViewGl)\n                this.vegaViewGl.finalize();\n            if (this.presenter)\n                this.presenter.finalize();\n            if (this.element)\n                this.element.innerHTML = '';\n            this.colorContexts = null;\n            this.element = null;\n            this.options = null;\n            this.presenter = null;\n            this.vegaSpec = null;\n            this.vegaViewGl = null;\n            this._animator = null;\n            this._dataScope = null;\n            this._details = null;\n            this._tooltip = null;\n        }\n    }\n    /**\n     * Default Viewer options.\n     */\n    Viewer.defaultViewerOptions = defaultViewerOptions;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const version = '1.6.7';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    exports.colorSchemes = colorSchemes;\n    exports.constants = constants;\n    exports.searchExpression = index;\n    exports.types = types;\n    exports.use = use;\n    exports.util = util$1;\n    exports.VegaDeckGl = index$2;\n    exports.Viewer = Viewer;\n    exports.version = version;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"
  },
  {
    "path": "docs/dist/sanddance/v2/sanddance.css",
    "content": ".sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%; }\n\n.sanddance-gl {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0; }\n  .sanddance-gl.show-center {\n    background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%); }\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em; }\n\n.sanddance-legend table {\n  border-collapse: collapse; }\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em; }\n\n.sanddance-legend .legend-row {\n  cursor: pointer; }\n  .sanddance-legend .legend-row td {\n    padding: 2px; }\n  .sanddance-legend .legend-row:hover {\n    background-color: #efefef; }\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px; }\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden; }\n\n.sanddance-details {\n  font-size: smaller; }\n\n.sanddance-details-scroll {\n  padding-bottom: 1em; }\n\n.sanddance-tooltip {\n  z-index: 1; }\n  .sanddance-tooltip table {\n    background: #333;\n    color: #fff;\n    font-size: smaller;\n    margin: 1em;\n    min-width: 16em;\n    padding: 6px;\n    position: absolute; }\n  .sanddance-tooltip td {\n    text-align: left;\n    vertical-align: top;\n    width: 75%; }\n    .sanddance-tooltip td:first-child {\n      width: 25%; }\n"
  },
  {
    "path": "docs/dist/sanddance/v2/sanddance.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (factory((global.SandDance = {})));\n}(this, (function (exports) { 'use strict';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const FieldNames = {\n        Active: '__SandDance__Active',\n        Collapsed: '__SandDance__Collapsed',\n        Selected: '__SandDance__Selected',\n        Top: '__SandDance__Top',\n        TopIndex: '__SandDance__TopIndex',\n        Index: '__SandDance__Index',\n        PowerBISelectionId: '__SandDance__PowerBISelectionId',\n        BarChartBin0: '__SandDance__BarChartBin0',\n        BarChartBin1: '__SandDance__BarChartBin1',\n        BarChartStack0: '__SandDance__BarChartStack0',\n        BarChartStack1: '__SandDance__BarChartStack1',\n        DensityCount: '__SandDance__DensityCount',\n        DensityRow: '__SandDance__DensityRow',\n        DensityXBin0: '__SandDance__DensityXBin0',\n        DensityXBin1: '__SandDance__DensityXBin1',\n        DensityYBin0: '__SandDance__DensityYBin0',\n        DensityYBin1: '__SandDance__DensityYBin1',\n        FacetBin0: '__SandDance__FacetBin0',\n        FacetBin1: '__SandDance__FacetBin1',\n        GridIndex: '__SandDance__GridIndex',\n        StacksLatBin0: '__SandDance__StacksLatBin0',\n        StacksLatBin1: '__SandDance__StacksLatBin1',\n        StacksLongBin0: '__SandDance__StacksLongBin0',\n        StacksLongBin1: '__SandDance__StacksLongBin1',\n        StacksStart: '__SandDance__StacksStart',\n        StacksEnd: '__SandDance__StacksEnd',\n        TreemapStackChildren: '__SandDance__TreemapStackChildren',\n        TreemapStackDepth: '__SandDance__TreemapStackDepth',\n        TreemapStackX0: '__SandDance__TreemapStackX0',\n        TreemapStackX1: '__SandDance__TreemapStackX1',\n        TreemapStackY0: '__SandDance__TreemapStackY0',\n        TreemapStackY1: '__SandDance__TreemapStackY1',\n    };\n    const DataNames = {\n        Pre: 'PreData',\n        Main: 'MainData',\n        EmptyBin: 'EmptyBinsData',\n        TopLookup: 'TopData',\n        Legend: 'LegendData',\n        FacetGroupCell: 'FacetGroupCellData',\n        FacetCellTitles: 'FacetCellTitlesData',\n        QuantitativeData: 'QuantitativeData'\n    };\n    const ScaleNames = {\n        Color: 'ColorScale',\n        X: 'MainXScale',\n        Y: 'MainYScale',\n        Z: 'MainZScale'\n    };\n    //Signal names\n    const SignalNames = {\n        ColorBinCount: 'RoleColor_BinCountSignal',\n        ColorReverse: 'RoleColor_ReverseSignal',\n        FacetColumns: 'RoleFacet_ColumnsSignal',\n        FacetRows: 'RoleFacet_RowsSignal',\n        InnerPadding: 'Chart_InnerPadding',\n        OuterPadding: 'Chart_OuterPadding',\n        MarkOpacity: 'Mark_OpacitySignal',\n        PointSize: 'Chart_PointSizeSignal',\n        TextAngleX: 'Text_AngleXSignal',\n        TextAngleY: 'Text_AngleYSignal',\n        TextScale: 'Text_ScaleSignal',\n        TextSize: 'Text_SizeSignal',\n        TextTitleSize: 'Text_TitleSizeSignal',\n        TreeMapMethod: 'Chart_TreeMapMethodSignal',\n        XDomain: 'RoleX_DomainSignal',\n        XBins: 'RoleX_BinsSignal',\n        XGridSize: 'Chart_XGridSize',\n        YBins: 'RoleY_BinsSignal',\n        YDomain: 'RoleY_DomainSignal',\n        YGridSize: 'Chart_YGridSize',\n        ZHeight: 'RoleZ_HeightSignal',\n        ZProportion: 'RoleZ_ProportionSignal'\n    };\n    const BarChartScaleNames = {\n        bucketScale: 'bucketScale',\n        levelScale: 'levelScale',\n        compartmentScale: 'compartmentScale'\n    };\n    const BarChartSignalNames = {\n        aspectRatioSignal: 'aspectRatioSignal',\n        compartmentsPerLevelSignal: 'compartmentsPerLevelSignal',\n        compartmentHeightSignal: 'compartmentHeightSignal',\n        compartmentWidthSignal: 'compartmentWidthSignal',\n        levelExtentSignal: 'levelExtentSignal',\n        quantitativeBinSignal: 'quantitativeBinSignal'\n    };\n    //These are special formulaic data values\n    const Other = '__Other';\n    //name of the \"no-color\" palette\n    const ColorScaleNone = 'none';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var constants = /*#__PURE__*/Object.freeze({\n        ColorScaleNone: ColorScaleNone,\n        FieldNames: FieldNames,\n        ScaleNames: ScaleNames,\n        SignalNames: SignalNames\n    });\n\n    function isSearchExpressionGroup(search) {\n        if (!search) {\n            return false;\n        }\n        return !!search.expressions;\n    }\n    function createGroupFromExpression(input) {\n        const output = {\n            expressions: [input]\n        };\n        return output;\n    }\n    function ensureSearchExpressionGroupArray(search) {\n        if (Array.isArray(search)) {\n            return [...search];\n        }\n        else if (isSearchExpressionGroup(search)) {\n            return [search];\n        }\n        else {\n            return [createGroupFromExpression(search)];\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const expressionKeys = Object.keys({\n        clause: null,\n        name: null,\n        operator: null,\n        value: null\n    });\n    function compareExpression(a, b) {\n        if (a && b) {\n            for (let k = 0; k < expressionKeys.length; k++) {\n                let key = expressionKeys[k];\n                if (a[key] != b[key])\n                    return false;\n            }\n        }\n        else {\n            return !a && !b;\n        }\n        return true;\n    }\n    const groupKeys = Object.keys({\n        clause: null\n    });\n    function compareGroup(a, b) {\n        for (let k = 0; k < groupKeys.length; k++) {\n            let key = groupKeys[k];\n            if (a[key] != b[key])\n                return false;\n        }\n        if (a.expressions.length != b.expressions.length)\n            return false;\n        for (let i = 0; i < a.expressions.length; i++) {\n            if (!compareExpression(a.expressions[i], b.expressions[i]))\n                return false;\n        }\n        return true;\n    }\n    function compare(a, b) {\n        if (a == b)\n            return true;\n        if (!a || !b)\n            return false;\n        let arrs = [a, b].map(ensureSearchExpressionGroupArray);\n        let [arrA, arrB] = arrs;\n        if (arrA.length != arrB.length)\n            return false;\n        for (let i = 0; i < arrA.length; i++) {\n            if (!compareGroup(arrA[i], arrB[i]))\n                return false;\n        }\n        return true;\n    }\n    function startsWith(whole, part) {\n        if (!part)\n            return true;\n        let arrs = [whole, part].map(ensureSearchExpressionGroupArray);\n        let [wholeArray, partArray] = arrs;\n        if (partArray.length > wholeArray.length)\n            return false;\n        for (let i = 0; i < partArray.length; i++) {\n            if (!compareGroup(wholeArray[i], partArray[i]))\n                return false;\n        }\n        return true;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function invertSearchExpressionGroup(input) {\n        //this only works if all expressions in this group have the same clause\n        const output = {\n            expressions: input.expressions.map(invertSearchExpression)\n        };\n        if (input.clause) {\n            output.clause = invertedClauses[input.clause];\n        }\n        return output;\n    }\n    const invertedOperators = {\n        '!=': '==',\n        '==': '!=',\n        '<': '>=',\n        '>=': '<',\n        '<=': '>',\n        '>': '<=',\n        '!contains': 'contains',\n        'contains': '!contains',\n        '!isnullorEmpty': 'isnullorEmpty',\n        'isnullorEmpty': '!isnullorEmpty',\n        '!starts': 'starts',\n        'starts': '!starts'\n    };\n    const invertedClauses = {\n        '&&': '||',\n        '||': '&&'\n    };\n    function invertSearchExpression(input) {\n        const operator = invertedOperators[input.operator];\n        const output = Object.assign(Object.assign({}, input), { operator });\n        if (input.clause) {\n            output.clause = invertedClauses[input.clause];\n        }\n        return output;\n    }\n    function invert(search) {\n        if (Array.isArray(search)) {\n            return search.map(invertSearchExpressionGroup);\n        }\n        else if (isSearchExpressionGroup(search)) {\n            return invertSearchExpressionGroup(search);\n        }\n        else {\n            return invertSearchExpression(search);\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function narrow(a, b) {\n        if (!a) {\n            return b;\n        }\n        let arrs = [a, b].map(ensureSearchExpressionGroupArray);\n        let [arrA, arrB] = arrs;\n        arrB[0].clause = '&&';\n        return arrA.concat(arrB);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var index = /*#__PURE__*/Object.freeze({\n        compareExpression: compareExpression,\n        compareGroup: compareGroup,\n        compare: compare,\n        startsWith: startsWith,\n        invert: invert,\n        narrow: narrow\n    });\n\n\n\n    var types = /*#__PURE__*/Object.freeze({\n\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const GL_ORDINAL = 'GL_ORDINAL';\n    const layerNames = {\n        cubes: 'LAYER_CUBES',\n        lines: 'LAYER_LINES',\n        text: 'LAYER_TEXT'\n    };\n\n    var constants$1 = /*#__PURE__*/Object.freeze({\n        GL_ORDINAL: GL_ORDINAL,\n        layerNames: layerNames\n    });\n\n    function unwrapExports (x) {\n    \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n    }\n\n    function createCommonjsModule(fn, module) {\n    \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n    }\n\n    var xregexp = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n    /*!\n     * XRegExp 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2007-2017 MIT License\n     */\n\n    /**\n     * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and\n     * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to\n     * make your client-side grepping simpler and more powerful, while freeing you from related\n     * cross-browser inconsistencies.\n     */\n\n    // ==--------------------------==\n    // Private stuff\n    // ==--------------------------==\n\n    // Property name used for extended regex instance data\n    var REGEX_DATA = 'xregexp';\n    // Optional features that can be installed and uninstalled\n    var features = {\n        astral: false\n    };\n    // Native methods to use and restore ('native' is an ES3 reserved keyword)\n    var nativ = {\n        exec: RegExp.prototype.exec,\n        test: RegExp.prototype.test,\n        match: String.prototype.match,\n        replace: String.prototype.replace,\n        split: String.prototype.split\n    };\n    // Storage for fixed/extended native methods\n    var fixed = {};\n    // Storage for regexes cached by `XRegExp.cache`\n    var regexCache = {};\n    // Storage for pattern details cached by the `XRegExp` constructor\n    var patternCache = {};\n    // Storage for regex syntax tokens added internally or by `XRegExp.addToken`\n    var tokens = [];\n    // Token scopes\n    var defaultScope = 'default';\n    var classScope = 'class';\n    // Regexes that match native regex syntax, including octals\n    var nativeTokens = {\n        // Any native multicharacter token in default scope, or any single character\n        'default': /\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|\\(\\?(?:[:=!]|<[=!])|[?*+]\\?|{\\d+(?:,\\d*)?}\\??|[\\s\\S]/,\n        // Any native multicharacter token in character class scope, or any single character\n        'class': /\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|[\\s\\S]/\n    };\n    // Any backreference or dollar-prefixed character in replacement strings\n    var replacementToken = /\\$(?:{([\\w$]+)}|<([\\w$]+)>|(\\d\\d?|[\\s\\S]))/g;\n    // Check for correct `exec` handling of nonparticipating capturing groups\n    var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined;\n    // Check for ES6 `flags` prop support\n    var hasFlagsProp = /x/.flags !== undefined;\n    // Shortcut to `Object.prototype.toString`\n    var toString = {}.toString;\n\n    function hasNativeFlag(flag) {\n        // Can't check based on the presence of properties/getters since browsers might support such\n        // properties even when they don't support the corresponding flag in regex construction (tested\n        // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`\n        // throws an error)\n        var isSupported = true;\n        try {\n        } catch (exception) {\n            isSupported = false;\n        }\n        return isSupported;\n    }\n    // Check for ES6 `u` flag support\n    var hasNativeU = hasNativeFlag('u');\n    // Check for ES6 `y` flag support\n    var hasNativeY = hasNativeFlag('y');\n    // Tracker for known flags, including addon flags\n    var registeredFlags = {\n        g: true,\n        i: true,\n        m: true,\n        u: hasNativeU,\n        y: hasNativeY\n    };\n\n    /**\n     * Attaches extended data and `XRegExp.prototype` properties to a regex object.\n     *\n     * @private\n     * @param {RegExp} regex Regex to augment.\n     * @param {Array} captureNames Array with capture names, or `null`.\n     * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.\n     * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.\n     * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal\n     *   operations, and never exposed to users. For internal-only regexes, we can improve perf by\n     *   skipping some operations like attaching `XRegExp.prototype` properties.\n     * @returns {RegExp} Augmented regex.\n     */\n    function augment(regex, captureNames, xSource, xFlags, isInternalOnly) {\n        var p = void 0;\n\n        regex[REGEX_DATA] = {\n            captureNames: captureNames\n        };\n\n        if (isInternalOnly) {\n            return regex;\n        }\n\n        // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value\n        if (regex.__proto__) {\n            regex.__proto__ = XRegExp.prototype;\n        } else {\n            for (p in XRegExp.prototype) {\n                // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this\n                // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`\n                // extensions exist on `regex.prototype` anyway\n                regex[p] = XRegExp.prototype[p];\n            }\n        }\n\n        regex[REGEX_DATA].source = xSource;\n        // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order\n        regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;\n\n        return regex;\n    }\n\n    /**\n     * Removes any duplicate characters from the provided string.\n     *\n     * @private\n     * @param {String} str String to remove duplicate characters from.\n     * @returns {String} String with any duplicate characters removed.\n     */\n    function clipDuplicates(str) {\n        return nativ.replace.call(str, /([\\s\\S])(?=[\\s\\S]*\\1)/g, '');\n    }\n\n    /**\n     * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`\n     * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing\n     * flags g and y while copying the regex.\n     *\n     * @private\n     * @param {RegExp} regex Regex to copy.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `addG` {Boolean} Add flag g while copying the regex.\n     *   - `addY` {Boolean} Add flag y while copying the regex.\n     *   - `removeG` {Boolean} Remove flag g while copying the regex.\n     *   - `removeY` {Boolean} Remove flag y while copying the regex.\n     *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal\n     *     operations, and never exposed to users. For internal-only regexes, we can improve perf by\n     *     skipping some operations like attaching `XRegExp.prototype` properties.\n     *   - `source` {String} Overrides `<regex>.source`, for special cases.\n     * @returns {RegExp} Copy of the provided regex, possibly with modified flags.\n     */\n    function copyRegex(regex, options) {\n        if (!XRegExp.isRegExp(regex)) {\n            throw new TypeError('Type RegExp expected');\n        }\n\n        var xData = regex[REGEX_DATA] || {};\n        var flags = getNativeFlags(regex);\n        var flagsToAdd = '';\n        var flagsToRemove = '';\n        var xregexpSource = null;\n        var xregexpFlags = null;\n\n        options = options || {};\n\n        if (options.removeG) {\n            flagsToRemove += 'g';\n        }\n        if (options.removeY) {\n            flagsToRemove += 'y';\n        }\n        if (flagsToRemove) {\n            flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), '');\n        }\n\n        if (options.addG) {\n            flagsToAdd += 'g';\n        }\n        if (options.addY) {\n            flagsToAdd += 'y';\n        }\n        if (flagsToAdd) {\n            flags = clipDuplicates(flags + flagsToAdd);\n        }\n\n        if (!options.isInternalOnly) {\n            if (xData.source !== undefined) {\n                xregexpSource = xData.source;\n            }\n            // null or undefined; don't want to add to `flags` if the previous value was null, since\n            // that indicates we're not tracking original precompilation flags\n            if (xData.flags != null) {\n                // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never\n                // removed for non-internal regexes, so don't need to handle it\n                xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;\n            }\n        }\n\n        // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid\n        // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and\n        // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the\n        // translation to native regex syntax\n        regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);\n\n        return regex;\n    }\n\n    /**\n     * Converts hexadecimal to decimal.\n     *\n     * @private\n     * @param {String} hex\n     * @returns {Number}\n     */\n    function dec(hex) {\n        return parseInt(hex, 16);\n    }\n\n    /**\n     * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an\n     * inline comment or whitespace with flag x. This is used directly as a token handler function\n     * passed to `XRegExp.addToken`.\n     *\n     * @private\n     * @param {String} match Match arg of `XRegExp.addToken` handler\n     * @param {String} scope Scope arg of `XRegExp.addToken` handler\n     * @param {String} flags Flags arg of `XRegExp.addToken` handler\n     * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.\n     */\n    function getContextualTokenSeparator(match, scope, flags) {\n        if (\n        // No need to separate tokens if at the beginning or end of a group\n        match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' ||\n        // Avoid separating tokens when the following token is a quantifier\n        isQuantifierNext(match.input, match.index + match[0].length, flags)) {\n            return '';\n        }\n        // Keep tokens separated. This avoids e.g. inadvertedly changing `\\1 1` or `\\1(?#)1` to `\\11`.\n        // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax\n        // error `(? :` into `(?:`.\n        return '(?:)';\n    }\n\n    /**\n     * Returns native `RegExp` flags used by a regex object.\n     *\n     * @private\n     * @param {RegExp} regex Regex to check.\n     * @returns {String} Native flags in use.\n     */\n    function getNativeFlags(regex) {\n        return hasFlagsProp ? regex.flags :\n        // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation\n        // with an empty string) allows this to continue working predictably when\n        // `XRegExp.proptotype.toString` is overridden\n        nativ.exec.call(/\\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];\n    }\n\n    /**\n     * Determines whether a regex has extended instance data used to track capture names.\n     *\n     * @private\n     * @param {RegExp} regex Regex to check.\n     * @returns {Boolean} Whether the regex uses named capture.\n     */\n    function hasNamedCapture(regex) {\n        return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);\n    }\n\n    /**\n     * Converts decimal to hexadecimal.\n     *\n     * @private\n     * @param {Number|String} dec\n     * @returns {String}\n     */\n    function hex(dec) {\n        return parseInt(dec, 10).toString(16);\n    }\n\n    /**\n     * Checks whether the next nonignorable token after the specified position is a quantifier.\n     *\n     * @private\n     * @param {String} pattern Pattern to search within.\n     * @param {Number} pos Index in `pattern` to search at.\n     * @param {String} flags Flags used by the pattern.\n     * @returns {Boolean} Whether the next nonignorable token is a quantifier.\n     */\n    function isQuantifierNext(pattern, pos, flags) {\n        return nativ.test.call(flags.indexOf('x') !== -1 ?\n        // Ignore any leading whitespace, line comments, and inline comments\n        /^(?:\\s|#[^#\\n]*|\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/ :\n        // Ignore any leading inline comments\n        /^(?:\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/, pattern.slice(pos));\n    }\n\n    /**\n     * Determines whether a value is of the specified type, by resolving its internal [[Class]].\n     *\n     * @private\n     * @param {*} value Object to check.\n     * @param {String} type Type to check for, in TitleCase.\n     * @returns {Boolean} Whether the object matches the type.\n     */\n    function isType(value, type) {\n        return toString.call(value) === '[object ' + type + ']';\n    }\n\n    /**\n     * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.\n     *\n     * @private\n     * @param {String} str\n     * @returns {String}\n     */\n    function pad4(str) {\n        while (str.length < 4) {\n            str = '0' + str;\n        }\n        return str;\n    }\n\n    /**\n     * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads\n     * the flag preparation logic from the `XRegExp` constructor.\n     *\n     * @private\n     * @param {String} pattern Regex pattern, possibly with a leading mode modifier.\n     * @param {String} flags Any combination of flags.\n     * @returns {Object} Object with properties `pattern` and `flags`.\n     */\n    function prepareFlags(pattern, flags) {\n        var i = void 0;\n\n        // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags\n        if (clipDuplicates(flags) !== flags) {\n            throw new SyntaxError('Invalid duplicate regex flag ' + flags);\n        }\n\n        // Strip and apply a leading mode modifier with any combination of flags except g or y\n        pattern = nativ.replace.call(pattern, /^\\(\\?([\\w$]+)\\)/, function ($0, $1) {\n            if (nativ.test.call(/[gy]/, $1)) {\n                throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0);\n            }\n            // Allow duplicate flags within the mode modifier\n            flags = clipDuplicates(flags + $1);\n            return '';\n        });\n\n        // Throw on unknown native or nonnative flags\n        for (i = 0; i < flags.length; ++i) {\n            if (!registeredFlags[flags[i]]) {\n                throw new SyntaxError('Unknown regex flag ' + flags[i]);\n            }\n        }\n\n        return {\n            pattern: pattern,\n            flags: flags\n        };\n    }\n\n    /**\n     * Prepares an options object from the given value.\n     *\n     * @private\n     * @param {String|Object} value Value to convert to an options object.\n     * @returns {Object} Options object.\n     */\n    function prepareOptions(value) {\n        var options = {};\n\n        if (isType(value, 'String')) {\n            XRegExp.forEach(value, /[^\\s,]+/, function (match) {\n                options[match] = true;\n            });\n\n            return options;\n        }\n\n        return value;\n    }\n\n    /**\n     * Registers a flag so it doesn't throw an 'unknown flag' error.\n     *\n     * @private\n     * @param {String} flag Single-character flag to register.\n     */\n    function registerFlag(flag) {\n        if (!/^[\\w$]$/.test(flag)) {\n            throw new Error('Flag must be a single character A-Za-z0-9_$');\n        }\n\n        registeredFlags[flag] = true;\n    }\n\n    /**\n     * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified\n     * position, until a match is found.\n     *\n     * @private\n     * @param {String} pattern Original pattern from which an XRegExp object is being built.\n     * @param {String} flags Flags being used to construct the regex.\n     * @param {Number} pos Position to search for tokens within `pattern`.\n     * @param {Number} scope Regex scope to apply: 'default' or 'class'.\n     * @param {Object} context Context object to use for token handler functions.\n     * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.\n     */\n    function runTokens(pattern, flags, pos, scope, context) {\n        var i = tokens.length;\n        var leadChar = pattern[pos];\n        var result = null;\n        var match = void 0;\n        var t = void 0;\n\n        // Run in reverse insertion order\n        while (i--) {\n            t = tokens[i];\n            if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(flags.indexOf(t.flag) !== -1)) {\n                continue;\n            }\n\n            match = XRegExp.exec(pattern, t.regex, pos, 'sticky');\n            if (match) {\n                result = {\n                    matchLength: match[0].length,\n                    output: t.handler.call(context, match, scope, flags),\n                    reparse: t.reparse\n                };\n                // Finished with token tests\n                break;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to\n     * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if\n     * the Unicode Base addon is not available, since flag A is registered by that addon.\n     *\n     * @private\n     * @param {Boolean} on `true` to enable; `false` to disable.\n     */\n    function setAstral(on) {\n        features.astral = on;\n    }\n\n    /**\n     * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow\n     * the ES5 abstract operation `ToObject`.\n     *\n     * @private\n     * @param {*} value Object to check and return.\n     * @returns {*} The provided object.\n     */\n    function toObject(value) {\n        // null or undefined\n        if (value == null) {\n            throw new TypeError('Cannot convert null or undefined to object');\n        }\n\n        return value;\n    }\n\n    // ==--------------------------==\n    // Constructor\n    // ==--------------------------==\n\n    /**\n     * Creates an extended regular expression object for matching text with a pattern. Differs from a\n     * native regular expression in that additional syntax and flags are supported. The returned object\n     * is in fact a native `RegExp` and works with all native methods.\n     *\n     * @class XRegExp\n     * @constructor\n     * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.\n     * @param {String} [flags] Any combination of flags.\n     *   Native flags:\n     *     - `g` - global\n     *     - `i` - ignore case\n     *     - `m` - multiline anchors\n     *     - `u` - unicode (ES6)\n     *     - `y` - sticky (Firefox 3+, ES6)\n     *   Additional XRegExp flags:\n     *     - `n` - explicit capture\n     *     - `s` - dot matches all (aka singleline)\n     *     - `x` - free-spacing and line comments (aka extended)\n     *     - `A` - astral (requires the Unicode Base addon)\n     *   Flags cannot be provided when constructing one `RegExp` from another.\n     * @returns {RegExp} Extended regular expression object.\n     * @example\n     *\n     * // With named capture and flag x\n     * XRegExp(`(?<year>  [0-9]{4} ) -?  # year\n     *          (?<month> [0-9]{2} ) -?  # month\n     *          (?<day>   [0-9]{2} )     # day`, 'x');\n     *\n     * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)\n     * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and\n     * // have fresh `lastIndex` properties (set to zero).\n     * XRegExp(/regex/);\n     */\n    function XRegExp(pattern, flags) {\n        if (XRegExp.isRegExp(pattern)) {\n            if (flags !== undefined) {\n                throw new TypeError('Cannot supply flags when copying a RegExp');\n            }\n            return copyRegex(pattern);\n        }\n\n        // Copy the argument behavior of `RegExp`\n        pattern = pattern === undefined ? '' : String(pattern);\n        flags = flags === undefined ? '' : String(flags);\n\n        if (XRegExp.isInstalled('astral') && !(flags.indexOf('A') !== -1)) {\n            // This causes an error to be thrown if the Unicode Base addon is not available\n            flags += 'A';\n        }\n\n        if (!patternCache[pattern]) {\n            patternCache[pattern] = {};\n        }\n\n        if (!patternCache[pattern][flags]) {\n            var context = {\n                hasNamedCapture: false,\n                captureNames: []\n            };\n            var scope = defaultScope;\n            var output = '';\n            var pos = 0;\n            var result = void 0;\n\n            // Check for flag-related errors, and strip/apply flags in a leading mode modifier\n            var applied = prepareFlags(pattern, flags);\n            var appliedPattern = applied.pattern;\n            var appliedFlags = applied.flags;\n\n            // Use XRegExp's tokens to translate the pattern to a native regex pattern.\n            // `appliedPattern.length` may change on each iteration if tokens use `reparse`\n            while (pos < appliedPattern.length) {\n                do {\n                    // Check for custom tokens at the current position\n                    result = runTokens(appliedPattern, appliedFlags, pos, scope, context);\n                    // If the matched token used the `reparse` option, splice its output into the\n                    // pattern before running tokens again at the same position\n                    if (result && result.reparse) {\n                        appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength);\n                    }\n                } while (result && result.reparse);\n\n                if (result) {\n                    output += result.output;\n                    pos += result.matchLength || 1;\n                } else {\n                    // Get the native token at the current position\n                    var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0];\n                    output += token;\n                    pos += token.length;\n                    if (token === '[' && scope === defaultScope) {\n                        scope = classScope;\n                    } else if (token === ']' && scope === classScope) {\n                        scope = defaultScope;\n                    }\n                }\n            }\n\n            patternCache[pattern][flags] = {\n                // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty\n                // groups are sometimes inserted during regex transpilation in order to keep tokens\n                // separated. However, more than one empty group in a row is never needed.\n                pattern: nativ.replace.call(output, /(?:\\(\\?:\\))+/g, '(?:)'),\n                // Strip all but native flags\n                flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),\n                // `context.captureNames` has an item for each capturing group, even if unnamed\n                captures: context.hasNamedCapture ? context.captureNames : null\n            };\n        }\n\n        var generated = patternCache[pattern][flags];\n        return augment(new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags);\n    }\n\n    // Add `RegExp.prototype` to the prototype chain\n    XRegExp.prototype = /(?:)/;\n\n    // ==--------------------------==\n    // Public properties\n    // ==--------------------------==\n\n    /**\n     * The XRegExp version number as a string containing three dot-separated parts. For example,\n     * '2.0.0-beta-3'.\n     *\n     * @static\n     * @memberOf XRegExp\n     * @type String\n     */\n    XRegExp.version = '4.0.0';\n\n    // ==--------------------------==\n    // Public methods\n    // ==--------------------------==\n\n    // Intentionally undocumented; used in tests and addons\n    XRegExp._clipDuplicates = clipDuplicates;\n    XRegExp._hasNativeFlag = hasNativeFlag;\n    XRegExp._dec = dec;\n    XRegExp._hex = hex;\n    XRegExp._pad4 = pad4;\n\n    /**\n     * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to\n     * create XRegExp addons. If more than one token can match the same string, the last added wins.\n     *\n     * @memberOf XRegExp\n     * @param {RegExp} regex Regex object that matches the new token.\n     * @param {Function} handler Function that returns a new pattern string (using native regex syntax)\n     *   to replace the matched token within all future XRegExp regexes. Has access to persistent\n     *   properties of the regex being built, through `this`. Invoked with three arguments:\n     *   - The match array, with named backreference properties.\n     *   - The regex scope where the match was found: 'default' or 'class'.\n     *   - The flags used by the regex, including any flags in a leading mode modifier.\n     *   The handler function becomes part of the XRegExp construction process, so be careful not to\n     *   construct XRegExps within the function or you will trigger infinite recursion.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.\n     *   - `flag` {String} Single-character flag that triggers the token. This also registers the\n     *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.\n     *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are\n     *     not required to trigger the token. This registers the flags, to prevent XRegExp from\n     *     throwing an 'unknown flag' error when any of the flags are used.\n     *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as\n     *     final, and instead be reparseable by other tokens (including the current token). Allows\n     *     token chaining or deferring.\n     *   - `leadChar` {String} Single character that occurs at the beginning of any successful match\n     *     of the token (not always applicable). This doesn't change the behavior of the token unless\n     *     you provide an erroneous value. However, providing it can increase the token's performance\n     *     since the token can be skipped at any positions where this character doesn't appear.\n     * @example\n     *\n     * // Basic usage: Add \\a for the ALERT control code\n     * XRegExp.addToken(\n     *   /\\\\a/,\n     *   () => '\\\\x07',\n     *   {scope: 'all'}\n     * );\n     * XRegExp('\\\\a[\\\\a-\\\\n]+').test('\\x07\\n\\x07'); // -> true\n     *\n     * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.\n     * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of\n     * // character classes only)\n     * XRegExp.addToken(\n     *   /([?*+]|{\\d+(?:,\\d*)?})(\\??)/,\n     *   (match) => `${match[1]}${match[2] ? '' : '?'}`,\n     *   {flag: 'U'}\n     * );\n     * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'\n     * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'\n     */\n    XRegExp.addToken = function (regex, handler, options) {\n        options = options || {};\n        var optionalFlags = options.optionalFlags;\n        var i = void 0;\n\n        if (options.flag) {\n            registerFlag(options.flag);\n        }\n\n        if (optionalFlags) {\n            optionalFlags = nativ.split.call(optionalFlags, '');\n            for (i = 0; i < optionalFlags.length; ++i) {\n                registerFlag(optionalFlags[i]);\n            }\n        }\n\n        // Add to the private list of syntax tokens\n        tokens.push({\n            regex: copyRegex(regex, {\n                addG: true,\n                addY: hasNativeY,\n                isInternalOnly: true\n            }),\n            handler: handler,\n            scope: options.scope || defaultScope,\n            flag: options.flag,\n            reparse: options.reparse,\n            leadChar: options.leadChar\n        });\n\n        // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags\n        // might now produce different results\n        XRegExp.cache.flush('patterns');\n    };\n\n    /**\n     * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with\n     * the same pattern and flag combination, the cached copy of the regex is returned.\n     *\n     * @memberOf XRegExp\n     * @param {String} pattern Regex pattern string.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {RegExp} Cached XRegExp object.\n     * @example\n     *\n     * while (match = XRegExp.cache('.', 'gs').exec(str)) {\n     *   // The regex is compiled once only\n     * }\n     */\n    XRegExp.cache = function (pattern, flags) {\n        if (!regexCache[pattern]) {\n            regexCache[pattern] = {};\n        }\n        return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));\n    };\n\n    // Intentionally undocumented; used in tests\n    XRegExp.cache.flush = function (cacheName) {\n        if (cacheName === 'patterns') {\n            // Flush the pattern cache used by the `XRegExp` constructor\n            patternCache = {};\n        } else {\n            // Flush the regex cache populated by `XRegExp.cache`\n            regexCache = {};\n        }\n    };\n\n    /**\n     * Escapes any regular expression metacharacters, for use when matching literal strings. The result\n     * can safely be used at any point within a regex that uses any flags.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to escape.\n     * @returns {String} String with regex metacharacters escaped.\n     * @example\n     *\n     * XRegExp.escape('Escaped? <.>');\n     * // -> 'Escaped\\?\\ <\\.>'\n     */\n    XRegExp.escape = function (str) {\n        return nativ.replace.call(toObject(str), /[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n    };\n\n    /**\n     * Executes a regex search in a specified string. Returns a match array or `null`. If the provided\n     * regex uses named capture, named backreference properties are included on the match array.\n     * Optional `pos` and `sticky` arguments specify the search start position, and whether the match\n     * must start at the specified position only. The `lastIndex` property of the provided regex is not\n     * used, but is updated for compatibility. Also fixes browser bugs compared to the native\n     * `RegExp.prototype.exec` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Number} [pos=0] Zero-based index at which to start the search.\n     * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n     *   only. The string `'sticky'` is accepted as an alternative to `true`.\n     * @returns {Array} Match array with named backreference properties, or `null`.\n     * @example\n     *\n     * // Basic use, with named backreference\n     * let match = XRegExp.exec('U+2620', XRegExp('U\\\\+(?<hex>[0-9A-F]{4})'));\n     * match.hex; // -> '2620'\n     *\n     * // With pos and sticky, in a loop\n     * let pos = 2, result = [], match;\n     * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\\d)>/, pos, 'sticky')) {\n     *   result.push(match[1]);\n     *   pos = match.index + match[0].length;\n     * }\n     * // result -> ['2', '3', '4']\n     */\n    XRegExp.exec = function (str, regex, pos, sticky) {\n        var cacheKey = 'g';\n        var addY = false;\n        var fakeY = false;\n        var match = void 0;\n\n        addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);\n        if (addY) {\n            cacheKey += 'y';\n        } else if (sticky) {\n            // Simulate sticky matching by appending an empty capture to the original regex. The\n            // resulting regex will succeed no matter what at the current index (set with `lastIndex`),\n            // and will not search the rest of the subject string. We'll know that the original regex\n            // has failed if that last capture is `''` rather than `undefined` (i.e., if that last\n            // capture participated in the match).\n            fakeY = true;\n            cacheKey += 'FakeY';\n        }\n\n        regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.match`/`replace`\n        var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n            addG: true,\n            addY: addY,\n            source: fakeY ? regex.source + '|()' : undefined,\n            removeY: sticky === false,\n            isInternalOnly: true\n        }));\n\n        pos = pos || 0;\n        r2.lastIndex = pos;\n\n        // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.\n        match = fixed.exec.call(r2, str);\n\n        // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means\n        // the original regexp failed (see above).\n        if (fakeY && match && match.pop() === '') {\n            match = null;\n        }\n\n        if (regex.global) {\n            regex.lastIndex = match ? r2.lastIndex : 0;\n        }\n\n        return match;\n    };\n\n    /**\n     * Executes a provided function once per regex match. Searches always start at the beginning of the\n     * string and continue until the end, regardless of the state of the regex's `global` property and\n     * initial `lastIndex`.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Function} callback Function to execute for each match. Invoked with four arguments:\n     *   - The match array, with named backreference properties.\n     *   - The zero-based match index.\n     *   - The string being traversed.\n     *   - The regex object being used to traverse the string.\n     * @example\n     *\n     * // Extracts every other digit from a string\n     * const evens = [];\n     * XRegExp.forEach('1a2345', /\\d/, (match, i) => {\n     *   if (i % 2) evens.push(+match[0]);\n     * });\n     * // evens -> [2, 4]\n     */\n    XRegExp.forEach = function (str, regex, callback) {\n        var pos = 0;\n        var i = -1;\n        var match = void 0;\n\n        while (match = XRegExp.exec(str, regex, pos)) {\n            // Because `regex` is provided to `callback`, the function could use the deprecated/\n            // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`\n            // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,\n            // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of\n            // regexes, mutating the regex will not have any effect on the iteration or matched strings,\n            // which is a nice side effect that brings extra safety.\n            callback(match, ++i, str, regex);\n\n            pos = match.index + (match[0].length || 1);\n        }\n    };\n\n    /**\n     * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with\n     * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native\n     * regexes are not recompiled using XRegExp syntax.\n     *\n     * @memberOf XRegExp\n     * @param {RegExp} regex Regex to globalize.\n     * @returns {RegExp} Copy of the provided regex with flag `g` added.\n     * @example\n     *\n     * const globalCopy = XRegExp.globalize(/regex/);\n     * globalCopy.global; // -> true\n     */\n    XRegExp.globalize = function (regex) {\n        return copyRegex(regex, { addG: true });\n    };\n\n    /**\n     * Installs optional features according to the specified options. Can be undone using\n     * `XRegExp.uninstall`.\n     *\n     * @memberOf XRegExp\n     * @param {Object|String} options Options object or string.\n     * @example\n     *\n     * // With an options object\n     * XRegExp.install({\n     *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)\n     *   astral: true\n     * });\n     *\n     * // With an options string\n     * XRegExp.install('astral');\n     */\n    XRegExp.install = function (options) {\n        options = prepareOptions(options);\n\n        if (!features.astral && options.astral) {\n            setAstral(true);\n        }\n    };\n\n    /**\n     * Checks whether an individual optional feature is installed.\n     *\n     * @memberOf XRegExp\n     * @param {String} feature Name of the feature to check. One of:\n     *   - `astral`\n     * @returns {Boolean} Whether the feature is installed.\n     * @example\n     *\n     * XRegExp.isInstalled('astral');\n     */\n    XRegExp.isInstalled = function (feature) {\n        return !!features[feature];\n    };\n\n    /**\n     * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes\n     * created in another frame, when `instanceof` and `constructor` checks would fail.\n     *\n     * @memberOf XRegExp\n     * @param {*} value Object to check.\n     * @returns {Boolean} Whether the object is a `RegExp` object.\n     * @example\n     *\n     * XRegExp.isRegExp('string'); // -> false\n     * XRegExp.isRegExp(/regex/i); // -> true\n     * XRegExp.isRegExp(RegExp('^', 'm')); // -> true\n     * XRegExp.isRegExp(XRegExp('(?s).')); // -> true\n     */\n    XRegExp.isRegExp = function (value) {\n        return toString.call(value) === '[object RegExp]';\n    }; // isType(value, 'RegExp');\n\n    /**\n     * Returns the first matched string, or in global mode, an array containing all matched strings.\n     * This is essentially a more convenient re-implementation of `String.prototype.match` that gives\n     * the result types you actually want (string instead of `exec`-style array in match-first mode,\n     * and an empty array instead of `null` when no matches are found in match-all mode). It also lets\n     * you override flag g and ignore `lastIndex`, and fixes browser bugs.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to\n     *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,\n     *   `scope` is 'all'.\n     * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all\n     *   mode: Array of all matched strings, or an empty array.\n     * @example\n     *\n     * // Match first\n     * XRegExp.match('abc', /\\w/); // -> 'a'\n     * XRegExp.match('abc', /\\w/g, 'one'); // -> 'a'\n     * XRegExp.match('abc', /x/g, 'one'); // -> null\n     *\n     * // Match all\n     * XRegExp.match('abc', /\\w/g); // -> ['a', 'b', 'c']\n     * XRegExp.match('abc', /\\w/, 'all'); // -> ['a', 'b', 'c']\n     * XRegExp.match('abc', /x/, 'all'); // -> []\n     */\n    XRegExp.match = function (str, regex, scope) {\n        var global = regex.global && scope !== 'one' || scope === 'all';\n        var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';\n\n        regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.exec`/`replace`\n        var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n            addG: !!global,\n            removeG: scope === 'one',\n            isInternalOnly: true\n        }));\n\n        var result = nativ.match.call(toObject(str), r2);\n\n        if (regex.global) {\n            regex.lastIndex = scope === 'one' && result ?\n            // Can't use `r2.lastIndex` since `r2` is nonglobal in this case\n            result.index + result[0].length : 0;\n        }\n\n        return global ? result || [] : result && result[0];\n    };\n\n    /**\n     * Retrieves the matches from searching a string using a chain of regexes that successively search\n     * within previous matches. The provided `chain` array can contain regexes and or objects with\n     * `regex` and `backref` properties. When a backreference is specified, the named or numbered\n     * backreference is passed forward to the next regex or returned.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {Array} chain Regexes that each search for matches within preceding results.\n     * @returns {Array} Matches by the last regex in the chain, or an empty array.\n     * @example\n     *\n     * // Basic usage; matches numbers within <b> tags\n     * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [\n     *   XRegExp('(?is)<b>.*?</b>'),\n     *   /\\d+/\n     * ]);\n     * // -> ['2', '4', '56']\n     *\n     * // Passing forward and returning specific backreferences\n     * html = '<a href=\"http://xregexp.com/api/\">XRegExp</a>\\\n     *         <a href=\"http://www.google.com/\">Google</a>';\n     * XRegExp.matchChain(html, [\n     *   {regex: /<a href=\"([^\"]+)\">/i, backref: 1},\n     *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}\n     * ]);\n     * // -> ['xregexp.com', 'www.google.com']\n     */\n    XRegExp.matchChain = function (str, chain) {\n        return function recurseChain(values, level) {\n            var item = chain[level].regex ? chain[level] : { regex: chain[level] };\n            var matches = [];\n\n            function addMatch(match) {\n                if (item.backref) {\n                    // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the\n                    // `undefined`s for backreferences to nonparticipating capturing groups. In such\n                    // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw\n                    // the exception, so also check if the backreference is a number that is within the\n                    // bounds of the array.\n                    if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) {\n                        throw new ReferenceError('Backreference to undefined group: ' + item.backref);\n                    }\n\n                    matches.push(match[item.backref] || '');\n                } else {\n                    matches.push(match[0]);\n                }\n            }\n\n            for (var i = 0; i < values.length; ++i) {\n                XRegExp.forEach(values[i], item.regex, addMatch);\n            }\n\n            return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);\n        }([str], 0);\n    };\n\n    /**\n     * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string\n     * or regex, and the replacement can be a string or a function to be called for each match. To\n     * perform a global search and replace, use the optional `scope` argument or include flag g if using\n     * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.\n     * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser\n     * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp|String} search Search pattern to be replaced.\n     * @param {String|Function} replacement Replacement string or a function invoked to create it.\n     *   Replacement strings can include special replacement syntax:\n     *     - $$ - Inserts a literal $ character.\n     *     - $&, $0 - Inserts the matched substring.\n     *     - $` - Inserts the string that precedes the matched substring (left context).\n     *     - $' - Inserts the string that follows the matched substring (right context).\n     *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts\n     *       backreference n/nn.\n     *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing\n     *       group, inserts backreference n.\n     *   Replacement functions are invoked with three or more arguments:\n     *     - The matched substring (corresponds to $& above). Named backreferences are accessible as\n     *       properties of this first argument.\n     *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).\n     *     - The zero-based index of the match within the total search string.\n     *     - The total string being searched.\n     * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not\n     *   explicitly specified and using a regex with flag g, `scope` is 'all'.\n     * @returns {String} New string with one or all matches replaced.\n     * @example\n     *\n     * // Regex search, using named backreferences in replacement string\n     * const name = XRegExp('(?<first>\\\\w+) (?<last>\\\\w+)');\n     * XRegExp.replace('John Smith', name, '$<last>, $<first>');\n     * // -> 'Smith, John'\n     *\n     * // Regex search, using named backreferences in replacement function\n     * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);\n     * // -> 'Smith, John'\n     *\n     * // String search, with replace-all\n     * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');\n     * // -> 'XRegExp builds XRegExps'\n     */\n    XRegExp.replace = function (str, search, replacement, scope) {\n        var isRegex = XRegExp.isRegExp(search);\n        var global = search.global && scope !== 'one' || scope === 'all';\n        var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';\n        var s2 = search;\n\n        if (isRegex) {\n            search[REGEX_DATA] = search[REGEX_DATA] || {};\n\n            // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s\n            // `lastIndex` isn't updated *during* replacement iterations\n            s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {\n                addG: !!global,\n                removeG: scope === 'one',\n                isInternalOnly: true\n            }));\n        } else if (global) {\n            s2 = new RegExp(XRegExp.escape(String(search)), 'g');\n        }\n\n        // Fixed `replace` required for named backreferences, etc.\n        var result = fixed.replace.call(toObject(str), s2, replacement);\n\n        if (isRegex && search.global) {\n            // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n            search.lastIndex = 0;\n        }\n\n        return result;\n    };\n\n    /**\n     * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an\n     * array of replacement details. Later replacements operate on the output of earlier replacements.\n     * Replacement details are accepted as an array with a regex or string to search for, the\n     * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp\n     * replacement text syntax, which supports named backreference properties via `${name}` or\n     * `$<name>`.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {Array} replacements Array of replacement detail arrays.\n     * @returns {String} New string with all replacements.\n     * @example\n     *\n     * str = XRegExp.replaceEach(str, [\n     *   [XRegExp('(?<name>a)'), 'z${name}'],\n     *   [/b/gi, 'y'],\n     *   [/c/g, 'x', 'one'], // scope 'one' overrides /g\n     *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g\n     *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings\n     *   [/f/g, ($0) => $0.toUpperCase()]\n     * ]);\n     */\n    XRegExp.replaceEach = function (str, replacements) {\n        var i = void 0;\n        var r = void 0;\n\n        for (i = 0; i < replacements.length; ++i) {\n            r = replacements[i];\n            str = XRegExp.replace(str, r[0], r[1], r[2]);\n        }\n\n        return str;\n    };\n\n    /**\n     * Splits a string into an array of strings using a regex or string separator. Matches of the\n     * separator are not included in the result array. However, if `separator` is a regex that contains\n     * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n     * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n     * cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to split.\n     * @param {RegExp|String} separator Regex or string to use for separating the string.\n     * @param {Number} [limit] Maximum number of items to include in the result array.\n     * @returns {Array} Array of substrings.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.split('a b c', ' ');\n     * // -> ['a', 'b', 'c']\n     *\n     * // With limit\n     * XRegExp.split('a b c', ' ', 2);\n     * // -> ['a', 'b']\n     *\n     * // Backreferences in result array\n     * XRegExp.split('..word1..', /([a-z]+)(\\d+)/i);\n     * // -> ['..', 'word', '1', '..']\n     */\n    XRegExp.split = function (str, separator, limit) {\n        return fixed.split.call(toObject(str), separator, limit);\n    };\n\n    /**\n     * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and\n     * `sticky` arguments specify the search start position, and whether the match must start at the\n     * specified position only. The `lastIndex` property of the provided regex is not used, but is\n     * updated for compatibility. Also fixes browser bugs compared to the native\n     * `RegExp.prototype.test` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Number} [pos=0] Zero-based index at which to start the search.\n     * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n     *   only. The string `'sticky'` is accepted as an alternative to `true`.\n     * @returns {Boolean} Whether the regex matched the provided value.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.test('abc', /c/); // -> true\n     *\n     * // With pos and sticky\n     * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false\n     * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true\n     */\n    // Do this the easy way :-)\n    XRegExp.test = function (str, regex, pos, sticky) {\n        return !!XRegExp.exec(str, regex, pos, sticky);\n    };\n\n    /**\n     * Uninstalls optional features according to the specified options. All optional features start out\n     * uninstalled, so this is used to undo the actions of `XRegExp.install`.\n     *\n     * @memberOf XRegExp\n     * @param {Object|String} options Options object or string.\n     * @example\n     *\n     * // With an options object\n     * XRegExp.uninstall({\n     *   // Disables support for astral code points in Unicode addons\n     *   astral: true\n     * });\n     *\n     * // With an options string\n     * XRegExp.uninstall('astral');\n     */\n    XRegExp.uninstall = function (options) {\n        options = prepareOptions(options);\n\n        if (features.astral && options.astral) {\n            setAstral(false);\n        }\n    };\n\n    /**\n     * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as\n     * regex objects or strings. Metacharacters are escaped in patterns provided as strings.\n     * Backreferences in provided regex objects are automatically renumbered to work correctly within\n     * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the\n     * `flags` argument.\n     *\n     * @memberOf XRegExp\n     * @param {Array} patterns Regexes and strings to combine.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.\n     * @returns {RegExp} Union of the provided regexes and strings.\n     * @example\n     *\n     * XRegExp.union(['a+b*c', /(dogs)\\1/, /(cats)\\1/], 'i');\n     * // -> /a\\+b\\*c|(dogs)\\1|(cats)\\2/i\n     *\n     * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});\n     * // -> /manbearpig/i\n     */\n    XRegExp.union = function (patterns, flags, options) {\n        options = options || {};\n        var conjunction = options.conjunction || 'or';\n        var numCaptures = 0;\n        var numPriorCaptures = void 0;\n        var captureNames = void 0;\n\n        function rewrite(match, paren, backref) {\n            var name = captureNames[numCaptures - numPriorCaptures];\n\n            // Capturing group\n            if (paren) {\n                ++numCaptures;\n                // If the current capture has a name, preserve the name\n                if (name) {\n                    return '(?<' + name + '>';\n                }\n                // Backreference\n            } else if (backref) {\n                // Rewrite the backreference\n                return '\\\\' + (+backref + numPriorCaptures);\n            }\n\n            return match;\n        }\n\n        if (!(isType(patterns, 'Array') && patterns.length)) {\n            throw new TypeError('Must provide a nonempty array of patterns to merge');\n        }\n\n        var parts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n        var output = [];\n        var pattern = void 0;\n        for (var i = 0; i < patterns.length; ++i) {\n            pattern = patterns[i];\n\n            if (XRegExp.isRegExp(pattern)) {\n                numPriorCaptures = numCaptures;\n                captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || [];\n\n                // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are\n                // independently valid; helps keep this simple. Named captures are put back\n                output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));\n            } else {\n                output.push(XRegExp.escape(pattern));\n            }\n        }\n\n        var separator = conjunction === 'none' ? '' : '|';\n        return XRegExp(output.join(separator), flags);\n    };\n\n    // ==--------------------------==\n    // Fixed/extended native methods\n    // ==--------------------------==\n\n    /**\n     * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n     * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.\n     *\n     * @memberOf RegExp\n     * @param {String} str String to search.\n     * @returns {Array} Match array with named backreference properties, or `null`.\n     */\n    fixed.exec = function (str) {\n        var origLastIndex = this.lastIndex;\n        var match = nativ.exec.apply(this, arguments);\n\n        if (match) {\n            // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing\n            // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9\n            // in standards mode follows the spec.\n            if (!correctExecNpcg && match.length > 1 && match.indexOf('') !== -1) {\n                var r2 = copyRegex(this, {\n                    removeG: true,\n                    isInternalOnly: true\n                });\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                nativ.replace.call(String(str).slice(match.index), r2, function () {\n                    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                        args[_key] = arguments[_key];\n                    }\n\n                    var len = args.length;\n                    // Skip index 0 and the last 2\n                    for (var i = 1; i < len - 2; ++i) {\n                        if (args[i] === undefined) {\n                            match[i] = undefined;\n                        }\n                    }\n                });\n            }\n\n            // Attach named capture properties\n            if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {\n                // Skip index 0\n                for (var i = 1; i < match.length; ++i) {\n                    var name = this[REGEX_DATA].captureNames[i - 1];\n                    if (name) {\n                        match[name] = match[i];\n                    }\n                }\n            }\n\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (this.global && !match[0].length && this.lastIndex > match.index) {\n                this.lastIndex = match.index;\n            }\n        }\n\n        if (!this.global) {\n            // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n            this.lastIndex = origLastIndex;\n        }\n\n        return match;\n    };\n\n    /**\n     * Fixes browser bugs in the native `RegExp.prototype.test`.\n     *\n     * @memberOf RegExp\n     * @param {String} str String to search.\n     * @returns {Boolean} Whether the regex matched the provided value.\n     */\n    fixed.test = function (str) {\n        // Do this the easy way :-)\n        return !!fixed.exec.call(this, str);\n    };\n\n    /**\n     * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n     * bugs in the native `String.prototype.match`.\n     *\n     * @memberOf String\n     * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.\n     * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,\n     *   the result of calling `regex.exec(this)`.\n     */\n    fixed.match = function (regex) {\n        if (!XRegExp.isRegExp(regex)) {\n            // Use the native `RegExp` rather than `XRegExp`\n            regex = new RegExp(regex);\n        } else if (regex.global) {\n            var result = nativ.match.apply(this, arguments);\n            // Fixes IE bug\n            regex.lastIndex = 0;\n\n            return result;\n        }\n\n        return fixed.exec.call(regex, toObject(this));\n    };\n\n    /**\n     * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement\n     * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also\n     * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex\n     * search value, and the value of a replacement regex's `lastIndex` property during replacement\n     * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third\n     * (`flags`) argument. Use via `XRegExp.replace`.\n     *\n     * @memberOf String\n     * @param {RegExp|String} search Search pattern to be replaced.\n     * @param {String|Function} replacement Replacement string or a function invoked to create it.\n     * @returns {String} New string with one or all matches replaced.\n     */\n    fixed.replace = function (search, replacement) {\n        var isRegex = XRegExp.isRegExp(search);\n        var origLastIndex = void 0;\n        var captureNames = void 0;\n        var result = void 0;\n\n        if (isRegex) {\n            if (search[REGEX_DATA]) {\n                captureNames = search[REGEX_DATA].captureNames;\n            }\n            // Only needed if `search` is nonglobal\n            origLastIndex = search.lastIndex;\n        } else {\n            search += ''; // Type-convert\n        }\n\n        // Don't use `typeof`; some older browsers return 'function' for regex objects\n        if (isType(replacement, 'Function')) {\n            // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement\n            // functions isn't type-converted to a string\n            result = nativ.replace.call(String(this), search, function () {\n                for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                    args[_key2] = arguments[_key2];\n                }\n\n                if (captureNames) {\n                    // Change the `args[0]` string primitive to a `String` object that can store\n                    // properties. This really does need to use `String` as a constructor\n                    args[0] = new String(args[0]);\n                    // Store named backreferences on the first argument\n                    for (var i = 0; i < captureNames.length; ++i) {\n                        if (captureNames[i]) {\n                            args[0][captureNames[i]] = args[i + 1];\n                        }\n                    }\n                }\n                // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari\n                // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)\n                if (isRegex && search.global) {\n                    search.lastIndex = args[args.length - 2] + args[0].length;\n                }\n                // ES6 specs the context for replacement functions as `undefined`\n                return replacement.apply(undefined, args);\n            });\n        } else {\n            // Ensure that the last value of `args` will be a string when given nonstring `this`,\n            // while still throwing on null or undefined context\n            result = nativ.replace.call(this == null ? this : String(this), search, function () {\n                for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n                    args[_key3] = arguments[_key3];\n                }\n\n                return nativ.replace.call(String(replacement), replacementToken, replacer);\n\n                function replacer($0, bracketed, angled, dollarToken) {\n                    bracketed = bracketed || angled;\n                    // Named or numbered backreference with curly or angled braces\n                    if (bracketed) {\n                        // XRegExp behavior for `${n}` or `$<n>`:\n                        // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the\n                        //    entire match. Any number of leading zeros may be used.\n                        // 2. Backreference to named capture `n`, if it exists and is not an integer\n                        //    overridden by numbered capture. In practice, this does not overlap with\n                        //    numbered capture since XRegExp does not allow named capture to use a bare\n                        //    integer as the name.\n                        // 3. If the name or number does not refer to an existing capturing group, it's\n                        //    an error.\n                        var n = +bracketed; // Type-convert; drop leading zeros\n                        if (n <= args.length - 3) {\n                            return args[n] || '';\n                        }\n                        // Groups with the same name is an error, else would need `lastIndexOf`\n                        n = captureNames ? captureNames.indexOf(bracketed) : -1;\n                        if (n < 0) {\n                            throw new SyntaxError('Backreference to undefined group ' + $0);\n                        }\n                        return args[n + 1] || '';\n                    }\n                    // Else, special variable or numbered backreference without curly braces\n                    if (dollarToken === '$') {\n                        // $$\n                        return '$';\n                    }\n                    if (dollarToken === '&' || +dollarToken === 0) {\n                        // $&, $0 (not followed by 1-9), $00\n                        return args[0];\n                    }\n                    if (dollarToken === '`') {\n                        // $` (left context)\n                        return args[args.length - 1].slice(0, args[args.length - 2]);\n                    }\n                    if (dollarToken === \"'\") {\n                        // $' (right context)\n                        return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                    }\n                    // Else, numbered backreference without braces\n                    dollarToken = +dollarToken; // Type-convert; drop leading zero\n                    // XRegExp behavior for `$n` and `$nn`:\n                    // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.\n                    // - `$1` is an error if no capturing groups.\n                    // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`\n                    //   instead.\n                    // - `$01` is `$1` if at least one capturing group, else it's an error.\n                    // - `$0` (not followed by 1-9) and `$00` are the entire match.\n                    // Native behavior, for comparison:\n                    // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.\n                    // - `$1` is a literal `$1` if no capturing groups.\n                    // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.\n                    // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.\n                    // - `$0` is a literal `$0`.\n                    if (!isNaN(dollarToken)) {\n                        if (dollarToken > args.length - 3) {\n                            throw new SyntaxError('Backreference to undefined group ' + $0);\n                        }\n                        return args[dollarToken] || '';\n                    }\n                    // `$` followed by an unsupported char is an error, unlike native JS\n                    throw new SyntaxError('Invalid token ' + $0);\n                }\n            });\n        }\n\n        if (isRegex) {\n            if (search.global) {\n                // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n                search.lastIndex = 0;\n            } else {\n                // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n                search.lastIndex = origLastIndex;\n            }\n        }\n\n        return result;\n    };\n\n    /**\n     * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.\n     *\n     * @memberOf String\n     * @param {RegExp|String} separator Regex or string to use for separating the string.\n     * @param {Number} [limit] Maximum number of items to include in the result array.\n     * @returns {Array} Array of substrings.\n     */\n    fixed.split = function (separator, limit) {\n        if (!XRegExp.isRegExp(separator)) {\n            // Browsers handle nonregex split correctly, so use the faster native method\n            return nativ.split.apply(this, arguments);\n        }\n\n        var str = String(this);\n        var output = [];\n        var origLastIndex = separator.lastIndex;\n        var lastLastIndex = 0;\n        var lastLength = void 0;\n\n        // Values for `limit`, per the spec:\n        // If undefined: pow(2,32) - 1\n        // If 0, Infinity, or NaN: 0\n        // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);\n        // If negative number: pow(2,32) - floor(abs(limit))\n        // If other: Type-convert, then use the above rules\n        // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless\n        // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+\n        limit = (limit === undefined ? -1 : limit) >>> 0;\n\n        XRegExp.forEach(str, separator, function (match) {\n            // This condition is not the same as `if (match[0].length)`\n            if (match.index + match[0].length > lastLastIndex) {\n                output.push(str.slice(lastLastIndex, match.index));\n                if (match.length > 1 && match.index < str.length) {\n                    Array.prototype.push.apply(output, match.slice(1));\n                }\n                lastLength = match[0].length;\n                lastLastIndex = match.index + lastLength;\n            }\n        });\n\n        if (lastLastIndex === str.length) {\n            if (!nativ.test.call(separator, '') || lastLength) {\n                output.push('');\n            }\n        } else {\n            output.push(str.slice(lastLastIndex));\n        }\n\n        separator.lastIndex = origLastIndex;\n        return output.length > limit ? output.slice(0, limit) : output;\n    };\n\n    // ==--------------------------==\n    // Built-in syntax/flag tokens\n    // ==--------------------------==\n\n    /*\n     * Letter escapes that natively match literal characters: `\\a`, `\\A`, etc. These should be\n     * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser\n     * consistency and to reserve their syntax, but lets them be superseded by addons.\n     */\n    XRegExp.addToken(/\\\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|x(?![\\dA-Fa-f]{2}))/, function (match, scope) {\n        // \\B is allowed in default scope only\n        if (match[1] === 'B' && scope === defaultScope) {\n            return match[0];\n        }\n        throw new SyntaxError('Invalid escape ' + match[0]);\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Unicode code point escape with curly braces: `\\u{N..}`. `N..` is any one or more digit\n     * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag\n     * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to\n     * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior\n     * if you follow a `\\u{N..}` token that references a code point above U+FFFF with a quantifier, or\n     * if you use the same in a character class.\n     */\n    XRegExp.addToken(/\\\\u{([\\dA-Fa-f]+)}/, function (match, scope, flags) {\n        var code = dec(match[1]);\n        if (code > 0x10FFFF) {\n            throw new SyntaxError('Invalid Unicode code point ' + match[0]);\n        }\n        if (code <= 0xFFFF) {\n            // Converting to \\uNNNN avoids needing to escape the literal character and keep it\n            // separate from preceding tokens\n            return '\\\\u' + pad4(hex(code));\n        }\n        // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling\n        if (hasNativeU && flags.indexOf('u') !== -1) {\n            return match[0];\n        }\n        throw new SyntaxError('Cannot use Unicode code point above \\\\u{FFFF} without flag u');\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.\n     * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because\n     * character class endings can't be determined.\n     */\n    XRegExp.addToken(/\\[(\\^?)\\]/,\n    // For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n    // (?!) should work like \\b\\B, but is unreliable in some versions of Firefox\n    /* eslint-disable no-confusing-arrow */\n    function (match) {\n        return match[1] ? '[\\\\s\\\\S]' : '\\\\b\\\\B';\n    },\n    /* eslint-enable no-confusing-arrow */\n    { leadChar: '[' });\n\n    /*\n     * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in\n     * free-spacing mode (flag x).\n     */\n    XRegExp.addToken(/\\(\\?#[^)]*\\)/, getContextualTokenSeparator, { leadChar: '(' });\n\n    /*\n     * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.\n     */\n    XRegExp.addToken(/\\s+|#[^\\n]*\\n?/, getContextualTokenSeparator, { flag: 'x' });\n\n    /*\n     * Dot, in dotall mode (aka singleline mode, flag s) only.\n     */\n    XRegExp.addToken(/\\./, function () {\n        return '[\\\\s\\\\S]';\n    }, {\n        flag: 's',\n        leadChar: '.'\n    });\n\n    /*\n     * Named backreference: `\\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,\n     * and $ only. Also allows numbered backreferences as `\\k<n>`.\n     */\n    XRegExp.addToken(/\\\\k<([\\w$]+)>/, function (match) {\n        // Groups with the same name is an error, else would need `lastIndexOf`\n        var index = isNaN(match[1]) ? this.captureNames.indexOf(match[1]) + 1 : +match[1];\n        var endIndex = match.index + match[0].length;\n        if (!index || index > this.captureNames.length) {\n            throw new SyntaxError('Backreference to undefined group ' + match[0]);\n        }\n        // Keep backreferences separate from subsequent literal numbers. This avoids e.g.\n        // inadvertedly changing `(?<n>)\\k<n>1` to `()\\11`.\n        return '\\\\' + index + (endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');\n    }, { leadChar: '\\\\' });\n\n    /*\n     * Numbered backreference or octal, plus any following digits: `\\0`, `\\11`, etc. Octals except `\\0`\n     * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches\n     * are returned unaltered. IE < 9 doesn't support backreferences above `\\99` in regex syntax.\n     */\n    XRegExp.addToken(/\\\\(\\d+)/, function (match, scope) {\n        if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {\n            throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]);\n        }\n        return match[0];\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the\n     * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style\n     * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively\n     * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to\n     * Python-style named capture as octals.\n     */\n    XRegExp.addToken(/\\(\\?P?<([\\w$]+)>/, function (match) {\n        // Disallow bare integers as names because named backreferences are added to match arrays\n        // and therefore numeric properties may lead to incorrect lookups\n        if (!isNaN(match[1])) {\n            throw new SyntaxError('Cannot use integer as capture name ' + match[0]);\n        }\n        if (match[1] === 'length' || match[1] === '__proto__') {\n            throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]);\n        }\n        if (this.captureNames.indexOf(match[1]) !== -1) {\n            throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]);\n        }\n        this.captureNames.push(match[1]);\n        this.hasNamedCapture = true;\n        return '(';\n    }, { leadChar: '(' });\n\n    /*\n     * Capturing group; match the opening parenthesis only. Required for support of named capturing\n     * groups. Also adds explicit capture mode (flag n).\n     */\n    XRegExp.addToken(/\\((?!\\?)/, function (match, scope, flags) {\n        if (flags.indexOf('n') !== -1) {\n            return '(?:';\n        }\n        this.captureNames.push(null);\n        return '(';\n    }, {\n        optionalFlags: 'n',\n        leadChar: '('\n    });\n\n    exports.default = XRegExp;\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(xregexp);\n\n    var build = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp.build 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2012-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n        var REGEX_DATA = 'xregexp';\n        var subParts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n        var parts = XRegExp.union([/\\({{([\\w$]+)}}\\)|{{([\\w$]+)}}/, subParts], 'g', {\n            conjunction: 'or'\n        });\n\n        /**\n         * Strips a leading `^` and trailing unescaped `$`, if both are present.\n         *\n         * @private\n         * @param {String} pattern Pattern to process.\n         * @returns {String} Pattern with edge anchors removed.\n         */\n        function deanchor(pattern) {\n            // Allow any number of empty noncapturing groups before/after anchors, because regexes\n            // built/generated by XRegExp sometimes include them\n            var leadingAnchor = /^(?:\\(\\?:\\))*\\^/;\n            var trailingAnchor = /\\$(?:\\(\\?:\\))*$/;\n\n            if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) &&\n            // Ensure that the trailing `$` isn't escaped\n            trailingAnchor.test(pattern.replace(/\\\\[\\s\\S]/g, ''))) {\n                return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');\n            }\n\n            return pattern;\n        }\n\n        /**\n         * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.\n         *\n         * @private\n         * @param {String|RegExp} value Value to convert.\n         * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not\n         *   already a regex generated by XRegExp\n         * @returns {RegExp} XRegExp object with XRegExp syntax applied.\n         */\n        function asXRegExp(value, addFlagX) {\n            var flags = addFlagX ? 'x' : '';\n            return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ?\n            // Don't recompile, to preserve capture names\n            value :\n            // Recompile as XRegExp\n            XRegExp(value.source, flags) :\n            // Compile string as XRegExp\n            XRegExp(value, flags);\n        }\n\n        function interpolate(substitution) {\n            return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);\n        }\n\n        function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {\n            subpatterns['subpattern' + subpatternIndex] = interpolated;\n            return subpatterns;\n        }\n\n        function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {\n            var hasSubpattern = subpatternIndex < rawLiterals.length - 1;\n            return raw + (hasSubpattern ? '{{subpattern' + subpatternIndex + '}}' : '');\n        }\n\n        /**\n         * Provides tagged template literals that create regexes with XRegExp syntax and flags. The\n         * provided pattern is handled as a raw string, so backslashes don't need to be escaped.\n         *\n         * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated\n         * patterns are treated as atomic units when quantified, interpolated strings have their special\n         * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated\n         * regexes if both are present, and any backreferences within an interpolated regex are\n         * rewritten to work within the overall pattern.\n         *\n         * @memberOf XRegExp\n         * @param {String} [flags] Any combination of XRegExp flags.\n         * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.\n         * @example\n         *\n         * const h12 = /1[0-2]|0?[1-9]/;\n         * const h24 = /2[0-3]|[01][0-9]/;\n         * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;\n         * const minutes = /^[0-5][0-9]$/;\n         * // Note that explicitly naming the 'minutes' group is required for named backreferences\n         * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;\n         * time.test('10:59'); // -> true\n         * XRegExp.exec('10:59', time).minutes; // -> '59'\n         */\n        XRegExp.tag = function (flags) {\n            return function (literals) {\n                for (var _len = arguments.length, substitutions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                    substitutions[_key - 1] = arguments[_key];\n                }\n\n                var subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});\n                var pattern = literals.raw.map(embedSubpatternAfter).join('');\n                return XRegExp.build(pattern, subpatterns, flags);\n            };\n        };\n\n        /**\n         * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in\n         * the outer pattern and provided subpatterns are automatically renumbered to work correctly.\n         * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.\n         *\n         * @memberOf XRegExp\n         * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows\n         *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within\n         *   character classes.\n         * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A\n         *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.\n         * @param {String} [flags] Any combination of XRegExp flags.\n         * @returns {RegExp} Regex with interpolated subpatterns.\n         * @example\n         *\n         * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {\n         *   hours: XRegExp.build('{{h12}} : | {{h24}}', {\n         *     h12: /1[0-2]|0?[1-9]/,\n         *     h24: /2[0-3]|[01][0-9]/\n         *   }, 'x'),\n         *   minutes: /^[0-5][0-9]$/\n         * });\n         * time.test('10:59'); // -> true\n         * XRegExp.exec('10:59', time).minutes; // -> '59'\n         */\n        XRegExp.build = function (pattern, subs, flags) {\n            flags = flags || '';\n            // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how\n            // some browsers convert `RegExp('\\n')` to a regex that contains the literal characters `\\`\n            // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.\n            var addFlagX = flags.indexOf('x') !== -1;\n            var inlineFlags = /^\\(\\?([\\w$]+)\\)/.exec(pattern);\n            // Add flags within a leading mode modifier to the overall pattern's flags\n            if (inlineFlags) {\n                flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);\n            }\n\n            var data = {};\n            for (var p in subs) {\n                if (subs.hasOwnProperty(p)) {\n                    // Passing to XRegExp enables extended syntax and ensures independent validity,\n                    // lest an unescaped `(`, `)`, `[`, or trailing `\\` breaks the `(?:)` wrapper. For\n                    // subpatterns provided as native regexes, it dies on octals and adds the property\n                    // used to hold extended regex instance data, for simplicity.\n                    var sub = asXRegExp(subs[p], addFlagX);\n                    data[p] = {\n                        // Deanchoring allows embedding independently useful anchored regexes. If you\n                        // really need to keep your anchors, double them (i.e., `^^...$$`).\n                        pattern: deanchor(sub.source),\n                        names: sub[REGEX_DATA].captureNames || []\n                    };\n                }\n            }\n\n            // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;\n            // helps keep this simple. Named captures will be put back.\n            var patternAsRegex = asXRegExp(pattern, addFlagX);\n\n            // 'Caps' is short for 'captures'\n            var numCaps = 0;\n            var numPriorCaps = void 0;\n            var numOuterCaps = 0;\n            var outerCapsMap = [0];\n            var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];\n            var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {\n                var subName = $1 || $2;\n                var capName = void 0;\n                var intro = void 0;\n                var localCapIndex = void 0;\n                // Named subpattern\n                if (subName) {\n                    if (!data.hasOwnProperty(subName)) {\n                        throw new ReferenceError('Undefined property ' + $0);\n                    }\n                    // Named subpattern was wrapped in a capturing group\n                    if ($1) {\n                        capName = outerCapNames[numOuterCaps];\n                        outerCapsMap[++numOuterCaps] = ++numCaps;\n                        // If it's a named group, preserve the name. Otherwise, use the subpattern name\n                        // as the capture name\n                        intro = '(?<' + (capName || subName) + '>';\n                    } else {\n                        intro = '(?:';\n                    }\n                    numPriorCaps = numCaps;\n                    var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {\n                        // Capturing group\n                        if (paren) {\n                            capName = data[subName].names[numCaps - numPriorCaps];\n                            ++numCaps;\n                            // If the current capture has a name, preserve the name\n                            if (capName) {\n                                return '(?<' + capName + '>';\n                            }\n                            // Backreference\n                        } else if (backref) {\n                            localCapIndex = +backref - 1;\n                            // Rewrite the backreference\n                            return data[subName].names[localCapIndex] ?\n                            // Need to preserve the backreference name in case using flag `n`\n                            '\\\\k<' + data[subName].names[localCapIndex] + '>' : '\\\\' + (+backref + numPriorCaps);\n                        }\n                        return match;\n                    });\n                    return '' + intro + rewrittenSubpattern + ')';\n                }\n                // Capturing group\n                if ($3) {\n                    capName = outerCapNames[numOuterCaps];\n                    outerCapsMap[++numOuterCaps] = ++numCaps;\n                    // If the current capture has a name, preserve the name\n                    if (capName) {\n                        return '(?<' + capName + '>';\n                    }\n                    // Backreference\n                } else if ($4) {\n                    localCapIndex = +$4 - 1;\n                    // Rewrite the backreference\n                    return outerCapNames[localCapIndex] ?\n                    // Need to preserve the backreference name in case using flag `n`\n                    '\\\\k<' + outerCapNames[localCapIndex] + '>' : '\\\\' + outerCapsMap[+$4];\n                }\n                return $0;\n            });\n\n            return XRegExp(output, flags);\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(build);\n\n    var matchrecursive = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp.matchRecursive 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2009-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Returns a match detail object composed of the provided values.\n         *\n         * @private\n         */\n        function row(name, value, start, end) {\n            return {\n                name: name,\n                value: value,\n                start: start,\n                end: end\n            };\n        }\n\n        /**\n         * Returns an array of match strings between outermost left and right delimiters, or an array of\n         * objects with detailed match parts and position data. An error is thrown if delimiters are\n         * unbalanced within the data.\n         *\n         * @memberOf XRegExp\n         * @param {String} str String to search.\n         * @param {String} left Left delimiter as an XRegExp pattern.\n         * @param {String} right Right delimiter as an XRegExp pattern.\n         * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.\n         * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.\n         * @returns {Array} Array of matches, or an empty array.\n         * @example\n         *\n         * // Basic usage\n         * let str = '(t((e))s)t()(ing)';\n         * XRegExp.matchRecursive(str, '\\\\(', '\\\\)', 'g');\n         * // -> ['t((e))s', '', 'ing']\n         *\n         * // Extended information mode with valueNames\n         * str = 'Here is <div> <div>an</div></div> example';\n         * XRegExp.matchRecursive(str, '<div\\\\s*>', '</div>', 'gi', {\n         *   valueNames: ['between', 'left', 'match', 'right']\n         * });\n         * // -> [\n         * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},\n         * // {name: 'left',    value: '<div>',          start: 8,  end: 13},\n         * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},\n         * // {name: 'right',   value: '</div>',         start: 27, end: 33},\n         * // {name: 'between', value: ' example',       start: 33, end: 41}\n         * // ]\n         *\n         * // Omitting unneeded parts with null valueNames, and using escapeChar\n         * str = '...{1}.\\\\{{function(x,y){return {y:x}}}';\n         * XRegExp.matchRecursive(str, '{', '}', 'g', {\n         *   valueNames: ['literal', null, 'value', null],\n         *   escapeChar: '\\\\'\n         * });\n         * // -> [\n         * // {name: 'literal', value: '...',  start: 0, end: 3},\n         * // {name: 'value',   value: '1',    start: 4, end: 5},\n         * // {name: 'literal', value: '.\\\\{', start: 6, end: 9},\n         * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}\n         * // ]\n         *\n         * // Sticky mode via flag y\n         * str = '<1><<<2>>><3>4<5>';\n         * XRegExp.matchRecursive(str, '<', '>', 'gy');\n         * // -> ['1', '<<2>>', '3']\n         */\n        XRegExp.matchRecursive = function (str, left, right, flags, options) {\n            flags = flags || '';\n            options = options || {};\n            var global = flags.indexOf('g') !== -1;\n            var sticky = flags.indexOf('y') !== -1;\n            // Flag `y` is controlled internally\n            var basicFlags = flags.replace(/y/g, '');\n            var escapeChar = options.escapeChar;\n            var vN = options.valueNames;\n            var output = [];\n            var openTokens = 0;\n            var delimStart = 0;\n            var delimEnd = 0;\n            var lastOuterEnd = 0;\n            var outerStart = void 0;\n            var innerStart = void 0;\n            var leftMatch = void 0;\n            var rightMatch = void 0;\n            var esc = void 0;\n            left = XRegExp(left, basicFlags);\n            right = XRegExp(right, basicFlags);\n\n            if (escapeChar) {\n                if (escapeChar.length > 1) {\n                    throw new Error('Cannot use more than one escape character');\n                }\n                escapeChar = XRegExp.escape(escapeChar);\n                // Example of concatenated `esc` regex:\n                // `escapeChar`: '%'\n                // `left`: '<'\n                // `right`: '>'\n                // Regex is: /(?:%[\\S\\s]|(?:(?!<|>)[^%])+)+/\n                esc = new RegExp('(?:' + escapeChar + '[\\\\S\\\\s]|(?:(?!' +\n                // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.\n                // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax\n                // transformation resulting from those flags was already applied to `left` and\n                // `right` when they were passed through the XRegExp constructor above.\n                XRegExp.union([left, right], '', { conjunction: 'or' }).source + ')[^' + escapeChar + '])+)+',\n                // Flags `gy` not needed here\n                flags.replace(/[^imu]+/g, ''));\n            }\n\n            while (true) {\n                // If using an escape character, advance to the delimiter's next starting position,\n                // skipping any escaped characters in between\n                if (escapeChar) {\n                    delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;\n                }\n                leftMatch = XRegExp.exec(str, left, delimEnd);\n                rightMatch = XRegExp.exec(str, right, delimEnd);\n                // Keep the leftmost match only\n                if (leftMatch && rightMatch) {\n                    if (leftMatch.index <= rightMatch.index) {\n                        rightMatch = null;\n                    } else {\n                        leftMatch = null;\n                    }\n                }\n                // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):\n                // LM | RM | OT | Result\n                // 1  | 0  | 1  | loop\n                // 1  | 0  | 0  | loop\n                // 0  | 1  | 1  | loop\n                // 0  | 1  | 0  | throw\n                // 0  | 0  | 1  | throw\n                // 0  | 0  | 0  | break\n                // The paths above don't include the sticky mode special case. The loop ends after the\n                // first completed match if not `global`.\n                if (leftMatch || rightMatch) {\n                    delimStart = (leftMatch || rightMatch).index;\n                    delimEnd = delimStart + (leftMatch || rightMatch)[0].length;\n                } else if (!openTokens) {\n                    break;\n                }\n                if (sticky && !openTokens && delimStart > lastOuterEnd) {\n                    break;\n                }\n                if (leftMatch) {\n                    if (!openTokens) {\n                        outerStart = delimStart;\n                        innerStart = delimEnd;\n                    }\n                    ++openTokens;\n                } else if (rightMatch && openTokens) {\n                    if (! --openTokens) {\n                        if (vN) {\n                            if (vN[0] && outerStart > lastOuterEnd) {\n                                output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));\n                            }\n                            if (vN[1]) {\n                                output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));\n                            }\n                            if (vN[2]) {\n                                output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));\n                            }\n                            if (vN[3]) {\n                                output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));\n                            }\n                        } else {\n                            output.push(str.slice(innerStart, delimStart));\n                        }\n                        lastOuterEnd = delimEnd;\n                        if (!global) {\n                            break;\n                        }\n                    }\n                } else {\n                    throw new Error('Unbalanced delimiter found in string');\n                }\n                // If the delimiter matched an empty string, avoid an infinite loop\n                if (delimStart === delimEnd) {\n                    ++delimEnd;\n                }\n            }\n\n            if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {\n                output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));\n            }\n\n            return output;\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(matchrecursive);\n\n    var unicodeBase = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Base 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2008-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds base support for Unicode matching:\n         * - Adds syntax `\\p{..}` for matching Unicode tokens. Tokens can be inverted using `\\P{..}` or\n         *   `\\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the\n         *   braces for token names that are a single letter (e.g. `\\pL` or `PL`).\n         * - Adds flag A (astral), which enables 21-bit Unicode support.\n         * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.\n         *\n         * Unicode Base relies on externally provided Unicode character data. Official addons are\n         * available to provide data for Unicode categories, scripts, blocks, and properties.\n         *\n         * @requires XRegExp\n         */\n\n        // ==--------------------------==\n        // Private stuff\n        // ==--------------------------==\n\n        // Storage for Unicode data\n        var unicode = {};\n\n        // Reuse utils\n        var dec = XRegExp._dec;\n        var hex = XRegExp._hex;\n        var pad4 = XRegExp._pad4;\n\n        // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed\n        function normalize(name) {\n            return name.replace(/[- _]+/g, '').toLowerCase();\n        }\n\n        // Gets the decimal code of a literal code unit, \\xHH, \\uHHHH, or a backslash-escaped literal\n        function charCode(chr) {\n            var esc = /^\\\\[xu](.+)/.exec(chr);\n            return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\\\' ? 1 : 0);\n        }\n\n        // Inverts a list of ordered BMP characters and ranges\n        function invertBmp(range) {\n            var output = '';\n            var lastEnd = -1;\n\n            XRegExp.forEach(range, /(\\\\x..|\\\\u....|\\\\?[\\s\\S])(?:-(\\\\x..|\\\\u....|\\\\?[\\s\\S]))?/, function (m) {\n                var start = charCode(m[1]);\n                if (start > lastEnd + 1) {\n                    output += '\\\\u' + pad4(hex(lastEnd + 1));\n                    if (start > lastEnd + 2) {\n                        output += '-\\\\u' + pad4(hex(start - 1));\n                    }\n                }\n                lastEnd = charCode(m[2] || m[1]);\n            });\n\n            if (lastEnd < 0xFFFF) {\n                output += '\\\\u' + pad4(hex(lastEnd + 1));\n                if (lastEnd < 0xFFFE) {\n                    output += '-\\\\uFFFF';\n                }\n            }\n\n            return output;\n        }\n\n        // Generates an inverted BMP range on first use\n        function cacheInvertedBmp(slug) {\n            var prop = 'b!';\n            return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));\n        }\n\n        // Combines and optionally negates BMP and astral data\n        function buildAstral(slug, isNegated) {\n            var item = unicode[slug];\n            var combined = '';\n\n            if (item.bmp && !item.isBmpLast) {\n                combined = '[' + item.bmp + ']' + (item.astral ? '|' : '');\n            }\n            if (item.astral) {\n                combined += item.astral;\n            }\n            if (item.isBmpLast && item.bmp) {\n                combined += (item.astral ? '|' : '') + '[' + item.bmp + ']';\n            }\n\n            // Astral Unicode tokens always match a code point, never a code unit\n            return isNegated ? '(?:(?!' + combined + ')(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\0-\\uFFFF]))' : '(?:' + combined + ')';\n        }\n\n        // Builds a complete astral pattern on first use\n        function cacheAstral(slug, isNegated) {\n            var prop = isNegated ? 'a!' : 'a=';\n            return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));\n        }\n\n        // ==--------------------------==\n        // Core functionality\n        // ==--------------------------==\n\n        /*\n         * Add astral mode (flag A) and Unicode token syntax: `\\p{..}`, `\\P{..}`, `\\p{^..}`, `\\pC`.\n         */\n        XRegExp.addToken(\n        // Use `*` instead of `+` to avoid capturing `^` as the token name in `\\p{^}`\n        /\\\\([pP])(?:{(\\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {\n            var ERR_DOUBLE_NEG = 'Invalid double negation ';\n            var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';\n            var ERR_UNKNOWN_REF = 'Unicode token missing data ';\n            var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';\n            var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';\n            // Negated via \\P{..} or \\p{^..}\n            var isNegated = match[1] === 'P' || !!match[2];\n            // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A\n            var isAstralMode = flags.indexOf('A') !== -1;\n            // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\\p{}`\n            var slug = normalize(match[4] || match[3]);\n            // Token data object\n            var item = unicode[slug];\n\n            if (match[1] === 'P' && match[2]) {\n                throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);\n            }\n            if (!unicode.hasOwnProperty(slug)) {\n                throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);\n            }\n\n            // Switch to the negated form of the referenced Unicode token\n            if (item.inverseOf) {\n                slug = normalize(item.inverseOf);\n                if (!unicode.hasOwnProperty(slug)) {\n                    throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf);\n                }\n                item = unicode[slug];\n                isNegated = !isNegated;\n            }\n\n            if (!(item.bmp || isAstralMode)) {\n                throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);\n            }\n            if (isAstralMode) {\n                if (scope === 'class') {\n                    throw new SyntaxError(ERR_ASTRAL_IN_CLASS);\n                }\n\n                return cacheAstral(slug, isNegated);\n            }\n\n            return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : (isNegated ? '[^' : '[') + item.bmp + ']';\n        }, {\n            scope: 'all',\n            optionalFlags: 'A',\n            leadChar: '\\\\'\n        });\n\n        /**\n         * Adds to the list of Unicode tokens that XRegExp regexes can match via `\\p` or `\\P`.\n         *\n         * @memberOf XRegExp\n         * @param {Array} data Objects with named character ranges. Each object may have properties\n         *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are\n         *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If\n         *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,\n         *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are\n         *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and\n         *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan\n         *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and\n         *   `astral` data should be a combination of literal characters and `\\xHH` or `\\uHHHH` escape\n         *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be\n         *   escaped, apart from range-creating hyphens. The `astral` data can additionally use\n         *   character classes and alternation, and should use surrogate pairs to represent astral code\n         *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is\n         *   defined as the exact inverse of another token.\n         * @example\n         *\n         * // Basic use\n         * XRegExp.addUnicodeData([{\n         *   name: 'XDigit',\n         *   alias: 'Hexadecimal',\n         *   bmp: '0-9A-Fa-f'\n         * }]);\n         * XRegExp('\\\\p{XDigit}:\\\\p{Hexadecimal}+').test('0:3D'); // -> true\n         */\n        XRegExp.addUnicodeData = function (data) {\n            var ERR_NO_NAME = 'Unicode token requires name';\n            var ERR_NO_DATA = 'Unicode token has no character data ';\n            var item = void 0;\n\n            for (var i = 0; i < data.length; ++i) {\n                item = data[i];\n                if (!item.name) {\n                    throw new Error(ERR_NO_NAME);\n                }\n                if (!(item.inverseOf || item.bmp || item.astral)) {\n                    throw new Error(ERR_NO_DATA + item.name);\n                }\n                unicode[normalize(item.name)] = item;\n                if (item.alias) {\n                    unicode[normalize(item.alias)] = item;\n                }\n            }\n\n            // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and\n            // flags might now produce different results\n            XRegExp.cache.flush('patterns');\n        };\n\n        /**\n         * @ignore\n         *\n         * Return a reference to the internal Unicode definition structure for the given Unicode\n         * Property if the given name is a legal Unicode Property for use in XRegExp `\\p` or `\\P` regex\n         * constructs.\n         *\n         * @memberOf XRegExp\n         * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),\n         *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode\n         *   Properties and Property Aliases.\n         * @returns {Object} Reference to definition structure when the name matches a Unicode Property.\n         *\n         * @note\n         * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.\n         *\n         * @note\n         * This method is *not* part of the officially documented API and may change or be removed in\n         * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode\n         * structures set up by XRegExp.\n         */\n        XRegExp._getUnicodeProperty = function (name) {\n            var slug = normalize(name);\n            return unicode[slug];\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeBase);\n\n    var unicodeBlocks = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Blocks 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,\n         * `\\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and\n         * underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'InAdlam',\n            astral: '\\uD83A[\\uDD00-\\uDD5F]'\n        }, {\n            name: 'InAegean_Numbers',\n            astral: '\\uD800[\\uDD00-\\uDD3F]'\n        }, {\n            name: 'InAhom',\n            astral: '\\uD805[\\uDF00-\\uDF3F]'\n        }, {\n            name: 'InAlchemical_Symbols',\n            astral: '\\uD83D[\\uDF00-\\uDF7F]'\n        }, {\n            name: 'InAlphabetic_Presentation_Forms',\n            bmp: '\\uFB00-\\uFB4F'\n        }, {\n            name: 'InAnatolian_Hieroglyphs',\n            astral: '\\uD811[\\uDC00-\\uDE7F]'\n        }, {\n            name: 'InAncient_Greek_Musical_Notation',\n            astral: '\\uD834[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InAncient_Greek_Numbers',\n            astral: '\\uD800[\\uDD40-\\uDD8F]'\n        }, {\n            name: 'InAncient_Symbols',\n            astral: '\\uD800[\\uDD90-\\uDDCF]'\n        }, {\n            name: 'InArabic',\n            bmp: '\\u0600-\\u06FF'\n        }, {\n            name: 'InArabic_Extended_A',\n            bmp: '\\u08A0-\\u08FF'\n        }, {\n            name: 'InArabic_Mathematical_Alphabetic_Symbols',\n            astral: '\\uD83B[\\uDE00-\\uDEFF]'\n        }, {\n            name: 'InArabic_Presentation_Forms_A',\n            bmp: '\\uFB50-\\uFDFF'\n        }, {\n            name: 'InArabic_Presentation_Forms_B',\n            bmp: '\\uFE70-\\uFEFF'\n        }, {\n            name: 'InArabic_Supplement',\n            bmp: '\\u0750-\\u077F'\n        }, {\n            name: 'InArmenian',\n            bmp: '\\u0530-\\u058F'\n        }, {\n            name: 'InArrows',\n            bmp: '\\u2190-\\u21FF'\n        }, {\n            name: 'InAvestan',\n            astral: '\\uD802[\\uDF00-\\uDF3F]'\n        }, {\n            name: 'InBalinese',\n            bmp: '\\u1B00-\\u1B7F'\n        }, {\n            name: 'InBamum',\n            bmp: '\\uA6A0-\\uA6FF'\n        }, {\n            name: 'InBamum_Supplement',\n            astral: '\\uD81A[\\uDC00-\\uDE3F]'\n        }, {\n            name: 'InBasic_Latin',\n            bmp: '\\0-\\x7F'\n        }, {\n            name: 'InBassa_Vah',\n            astral: '\\uD81A[\\uDED0-\\uDEFF]'\n        }, {\n            name: 'InBatak',\n            bmp: '\\u1BC0-\\u1BFF'\n        }, {\n            name: 'InBengali',\n            bmp: '\\u0980-\\u09FF'\n        }, {\n            name: 'InBhaiksuki',\n            astral: '\\uD807[\\uDC00-\\uDC6F]'\n        }, {\n            name: 'InBlock_Elements',\n            bmp: '\\u2580-\\u259F'\n        }, {\n            name: 'InBopomofo',\n            bmp: '\\u3100-\\u312F'\n        }, {\n            name: 'InBopomofo_Extended',\n            bmp: '\\u31A0-\\u31BF'\n        }, {\n            name: 'InBox_Drawing',\n            bmp: '\\u2500-\\u257F'\n        }, {\n            name: 'InBrahmi',\n            astral: '\\uD804[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InBraille_Patterns',\n            bmp: '\\u2800-\\u28FF'\n        }, {\n            name: 'InBuginese',\n            bmp: '\\u1A00-\\u1A1F'\n        }, {\n            name: 'InBuhid',\n            bmp: '\\u1740-\\u175F'\n        }, {\n            name: 'InByzantine_Musical_Symbols',\n            astral: '\\uD834[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InCJK_Compatibility',\n            bmp: '\\u3300-\\u33FF'\n        }, {\n            name: 'InCJK_Compatibility_Forms',\n            bmp: '\\uFE30-\\uFE4F'\n        }, {\n            name: 'InCJK_Compatibility_Ideographs',\n            bmp: '\\uF900-\\uFAFF'\n        }, {\n            name: 'InCJK_Compatibility_Ideographs_Supplement',\n            astral: '\\uD87E[\\uDC00-\\uDE1F]'\n        }, {\n            name: 'InCJK_Radicals_Supplement',\n            bmp: '\\u2E80-\\u2EFF'\n        }, {\n            name: 'InCJK_Strokes',\n            bmp: '\\u31C0-\\u31EF'\n        }, {\n            name: 'InCJK_Symbols_and_Punctuation',\n            bmp: '\\u3000-\\u303F'\n        }, {\n            name: 'InCJK_Unified_Ideographs',\n            bmp: '\\u4E00-\\u9FFF'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_A',\n            bmp: '\\u3400-\\u4DBF'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_B',\n            astral: '[\\uD840-\\uD868][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDEDF]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_C',\n            astral: '\\uD869[\\uDF00-\\uDFFF]|[\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF3F]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_D',\n            astral: '\\uD86D[\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1F]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_E',\n            astral: '\\uD86E[\\uDC20-\\uDFFF]|[\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD873[\\uDC00-\\uDEAF]'\n        }, {\n            name: 'InCarian',\n            astral: '\\uD800[\\uDEA0-\\uDEDF]'\n        }, {\n            name: 'InCaucasian_Albanian',\n            astral: '\\uD801[\\uDD30-\\uDD6F]'\n        }, {\n            name: 'InChakma',\n            astral: '\\uD804[\\uDD00-\\uDD4F]'\n        }, {\n            name: 'InCham',\n            bmp: '\\uAA00-\\uAA5F'\n        }, {\n            name: 'InCherokee',\n            bmp: '\\u13A0-\\u13FF'\n        }, {\n            name: 'InCherokee_Supplement',\n            bmp: '\\uAB70-\\uABBF'\n        }, {\n            name: 'InCombining_Diacritical_Marks',\n            bmp: '\\u0300-\\u036F'\n        }, {\n            name: 'InCombining_Diacritical_Marks_Extended',\n            bmp: '\\u1AB0-\\u1AFF'\n        }, {\n            name: 'InCombining_Diacritical_Marks_Supplement',\n            bmp: '\\u1DC0-\\u1DFF'\n        }, {\n            name: 'InCombining_Diacritical_Marks_for_Symbols',\n            bmp: '\\u20D0-\\u20FF'\n        }, {\n            name: 'InCombining_Half_Marks',\n            bmp: '\\uFE20-\\uFE2F'\n        }, {\n            name: 'InCommon_Indic_Number_Forms',\n            bmp: '\\uA830-\\uA83F'\n        }, {\n            name: 'InControl_Pictures',\n            bmp: '\\u2400-\\u243F'\n        }, {\n            name: 'InCoptic',\n            bmp: '\\u2C80-\\u2CFF'\n        }, {\n            name: 'InCoptic_Epact_Numbers',\n            astral: '\\uD800[\\uDEE0-\\uDEFF]'\n        }, {\n            name: 'InCounting_Rod_Numerals',\n            astral: '\\uD834[\\uDF60-\\uDF7F]'\n        }, {\n            name: 'InCuneiform',\n            astral: '\\uD808[\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InCuneiform_Numbers_and_Punctuation',\n            astral: '\\uD809[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InCurrency_Symbols',\n            bmp: '\\u20A0-\\u20CF'\n        }, {\n            name: 'InCypriot_Syllabary',\n            astral: '\\uD802[\\uDC00-\\uDC3F]'\n        }, {\n            name: 'InCyrillic',\n            bmp: '\\u0400-\\u04FF'\n        }, {\n            name: 'InCyrillic_Extended_A',\n            bmp: '\\u2DE0-\\u2DFF'\n        }, {\n            name: 'InCyrillic_Extended_B',\n            bmp: '\\uA640-\\uA69F'\n        }, {\n            name: 'InCyrillic_Extended_C',\n            bmp: '\\u1C80-\\u1C8F'\n        }, {\n            name: 'InCyrillic_Supplement',\n            bmp: '\\u0500-\\u052F'\n        }, {\n            name: 'InDeseret',\n            astral: '\\uD801[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'InDevanagari',\n            bmp: '\\u0900-\\u097F'\n        }, {\n            name: 'InDevanagari_Extended',\n            bmp: '\\uA8E0-\\uA8FF'\n        }, {\n            name: 'InDingbats',\n            bmp: '\\u2700-\\u27BF'\n        }, {\n            name: 'InDomino_Tiles',\n            astral: '\\uD83C[\\uDC30-\\uDC9F]'\n        }, {\n            name: 'InDuployan',\n            astral: '\\uD82F[\\uDC00-\\uDC9F]'\n        }, {\n            name: 'InEarly_Dynastic_Cuneiform',\n            astral: '\\uD809[\\uDC80-\\uDD4F]'\n        }, {\n            name: 'InEgyptian_Hieroglyphs',\n            astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InElbasan',\n            astral: '\\uD801[\\uDD00-\\uDD2F]'\n        }, {\n            name: 'InEmoticons',\n            astral: '\\uD83D[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InEnclosed_Alphanumeric_Supplement',\n            astral: '\\uD83C[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InEnclosed_Alphanumerics',\n            bmp: '\\u2460-\\u24FF'\n        }, {\n            name: 'InEnclosed_CJK_Letters_and_Months',\n            bmp: '\\u3200-\\u32FF'\n        }, {\n            name: 'InEnclosed_Ideographic_Supplement',\n            astral: '\\uD83C[\\uDE00-\\uDEFF]'\n        }, {\n            name: 'InEthiopic',\n            bmp: '\\u1200-\\u137F'\n        }, {\n            name: 'InEthiopic_Extended',\n            bmp: '\\u2D80-\\u2DDF'\n        }, {\n            name: 'InEthiopic_Extended_A',\n            bmp: '\\uAB00-\\uAB2F'\n        }, {\n            name: 'InEthiopic_Supplement',\n            bmp: '\\u1380-\\u139F'\n        }, {\n            name: 'InGeneral_Punctuation',\n            bmp: '\\u2000-\\u206F'\n        }, {\n            name: 'InGeometric_Shapes',\n            bmp: '\\u25A0-\\u25FF'\n        }, {\n            name: 'InGeometric_Shapes_Extended',\n            astral: '\\uD83D[\\uDF80-\\uDFFF]'\n        }, {\n            name: 'InGeorgian',\n            bmp: '\\u10A0-\\u10FF'\n        }, {\n            name: 'InGeorgian_Supplement',\n            bmp: '\\u2D00-\\u2D2F'\n        }, {\n            name: 'InGlagolitic',\n            bmp: '\\u2C00-\\u2C5F'\n        }, {\n            name: 'InGlagolitic_Supplement',\n            astral: '\\uD838[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InGothic',\n            astral: '\\uD800[\\uDF30-\\uDF4F]'\n        }, {\n            name: 'InGrantha',\n            astral: '\\uD804[\\uDF00-\\uDF7F]'\n        }, {\n            name: 'InGreek_Extended',\n            bmp: '\\u1F00-\\u1FFF'\n        }, {\n            name: 'InGreek_and_Coptic',\n            bmp: '\\u0370-\\u03FF'\n        }, {\n            name: 'InGujarati',\n            bmp: '\\u0A80-\\u0AFF'\n        }, {\n            name: 'InGurmukhi',\n            bmp: '\\u0A00-\\u0A7F'\n        }, {\n            name: 'InHalfwidth_and_Fullwidth_Forms',\n            bmp: '\\uFF00-\\uFFEF'\n        }, {\n            name: 'InHangul_Compatibility_Jamo',\n            bmp: '\\u3130-\\u318F'\n        }, {\n            name: 'InHangul_Jamo',\n            bmp: '\\u1100-\\u11FF'\n        }, {\n            name: 'InHangul_Jamo_Extended_A',\n            bmp: '\\uA960-\\uA97F'\n        }, {\n            name: 'InHangul_Jamo_Extended_B',\n            bmp: '\\uD7B0-\\uD7FF'\n        }, {\n            name: 'InHangul_Syllables',\n            bmp: '\\uAC00-\\uD7AF'\n        }, {\n            name: 'InHanunoo',\n            bmp: '\\u1720-\\u173F'\n        }, {\n            name: 'InHatran',\n            astral: '\\uD802[\\uDCE0-\\uDCFF]'\n        }, {\n            name: 'InHebrew',\n            bmp: '\\u0590-\\u05FF'\n        }, {\n            name: 'InHigh_Private_Use_Surrogates',\n            bmp: '\\uDB80-\\uDBFF'\n        }, {\n            name: 'InHigh_Surrogates',\n            bmp: '\\uD800-\\uDB7F'\n        }, {\n            name: 'InHiragana',\n            bmp: '\\u3040-\\u309F'\n        }, {\n            name: 'InIPA_Extensions',\n            bmp: '\\u0250-\\u02AF'\n        }, {\n            name: 'InIdeographic_Description_Characters',\n            bmp: '\\u2FF0-\\u2FFF'\n        }, {\n            name: 'InIdeographic_Symbols_and_Punctuation',\n            astral: '\\uD81B[\\uDFE0-\\uDFFF]'\n        }, {\n            name: 'InImperial_Aramaic',\n            astral: '\\uD802[\\uDC40-\\uDC5F]'\n        }, {\n            name: 'InInscriptional_Pahlavi',\n            astral: '\\uD802[\\uDF60-\\uDF7F]'\n        }, {\n            name: 'InInscriptional_Parthian',\n            astral: '\\uD802[\\uDF40-\\uDF5F]'\n        }, {\n            name: 'InJavanese',\n            bmp: '\\uA980-\\uA9DF'\n        }, {\n            name: 'InKaithi',\n            astral: '\\uD804[\\uDC80-\\uDCCF]'\n        }, {\n            name: 'InKana_Supplement',\n            astral: '\\uD82C[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InKanbun',\n            bmp: '\\u3190-\\u319F'\n        }, {\n            name: 'InKangxi_Radicals',\n            bmp: '\\u2F00-\\u2FDF'\n        }, {\n            name: 'InKannada',\n            bmp: '\\u0C80-\\u0CFF'\n        }, {\n            name: 'InKatakana',\n            bmp: '\\u30A0-\\u30FF'\n        }, {\n            name: 'InKatakana_Phonetic_Extensions',\n            bmp: '\\u31F0-\\u31FF'\n        }, {\n            name: 'InKayah_Li',\n            bmp: '\\uA900-\\uA92F'\n        }, {\n            name: 'InKharoshthi',\n            astral: '\\uD802[\\uDE00-\\uDE5F]'\n        }, {\n            name: 'InKhmer',\n            bmp: '\\u1780-\\u17FF'\n        }, {\n            name: 'InKhmer_Symbols',\n            bmp: '\\u19E0-\\u19FF'\n        }, {\n            name: 'InKhojki',\n            astral: '\\uD804[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InKhudawadi',\n            astral: '\\uD804[\\uDEB0-\\uDEFF]'\n        }, {\n            name: 'InLao',\n            bmp: '\\u0E80-\\u0EFF'\n        }, {\n            name: 'InLatin_Extended_Additional',\n            bmp: '\\u1E00-\\u1EFF'\n        }, {\n            name: 'InLatin_Extended_A',\n            bmp: '\\u0100-\\u017F'\n        }, {\n            name: 'InLatin_Extended_B',\n            bmp: '\\u0180-\\u024F'\n        }, {\n            name: 'InLatin_Extended_C',\n            bmp: '\\u2C60-\\u2C7F'\n        }, {\n            name: 'InLatin_Extended_D',\n            bmp: '\\uA720-\\uA7FF'\n        }, {\n            name: 'InLatin_Extended_E',\n            bmp: '\\uAB30-\\uAB6F'\n        }, {\n            name: 'InLatin_1_Supplement',\n            bmp: '\\x80-\\xFF'\n        }, {\n            name: 'InLepcha',\n            bmp: '\\u1C00-\\u1C4F'\n        }, {\n            name: 'InLetterlike_Symbols',\n            bmp: '\\u2100-\\u214F'\n        }, {\n            name: 'InLimbu',\n            bmp: '\\u1900-\\u194F'\n        }, {\n            name: 'InLinear_A',\n            astral: '\\uD801[\\uDE00-\\uDF7F]'\n        }, {\n            name: 'InLinear_B_Ideograms',\n            astral: '\\uD800[\\uDC80-\\uDCFF]'\n        }, {\n            name: 'InLinear_B_Syllabary',\n            astral: '\\uD800[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InLisu',\n            bmp: '\\uA4D0-\\uA4FF'\n        }, {\n            name: 'InLow_Surrogates',\n            bmp: '\\uDC00-\\uDFFF'\n        }, {\n            name: 'InLycian',\n            astral: '\\uD800[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'InLydian',\n            astral: '\\uD802[\\uDD20-\\uDD3F]'\n        }, {\n            name: 'InMahajani',\n            astral: '\\uD804[\\uDD50-\\uDD7F]'\n        }, {\n            name: 'InMahjong_Tiles',\n            astral: '\\uD83C[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InMalayalam',\n            bmp: '\\u0D00-\\u0D7F'\n        }, {\n            name: 'InMandaic',\n            bmp: '\\u0840-\\u085F'\n        }, {\n            name: 'InManichaean',\n            astral: '\\uD802[\\uDEC0-\\uDEFF]'\n        }, {\n            name: 'InMarchen',\n            astral: '\\uD807[\\uDC70-\\uDCBF]'\n        }, {\n            name: 'InMathematical_Alphanumeric_Symbols',\n            astral: '\\uD835[\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InMathematical_Operators',\n            bmp: '\\u2200-\\u22FF'\n        }, {\n            name: 'InMeetei_Mayek',\n            bmp: '\\uABC0-\\uABFF'\n        }, {\n            name: 'InMeetei_Mayek_Extensions',\n            bmp: '\\uAAE0-\\uAAFF'\n        }, {\n            name: 'InMende_Kikakui',\n            astral: '\\uD83A[\\uDC00-\\uDCDF]'\n        }, {\n            name: 'InMeroitic_Cursive',\n            astral: '\\uD802[\\uDDA0-\\uDDFF]'\n        }, {\n            name: 'InMeroitic_Hieroglyphs',\n            astral: '\\uD802[\\uDD80-\\uDD9F]'\n        }, {\n            name: 'InMiao',\n            astral: '\\uD81B[\\uDF00-\\uDF9F]'\n        }, {\n            name: 'InMiscellaneous_Mathematical_Symbols_A',\n            bmp: '\\u27C0-\\u27EF'\n        }, {\n            name: 'InMiscellaneous_Mathematical_Symbols_B',\n            bmp: '\\u2980-\\u29FF'\n        }, {\n            name: 'InMiscellaneous_Symbols',\n            bmp: '\\u2600-\\u26FF'\n        }, {\n            name: 'InMiscellaneous_Symbols_and_Arrows',\n            bmp: '\\u2B00-\\u2BFF'\n        }, {\n            name: 'InMiscellaneous_Symbols_and_Pictographs',\n            astral: '\\uD83C[\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDDFF]'\n        }, {\n            name: 'InMiscellaneous_Technical',\n            bmp: '\\u2300-\\u23FF'\n        }, {\n            name: 'InModi',\n            astral: '\\uD805[\\uDE00-\\uDE5F]'\n        }, {\n            name: 'InModifier_Tone_Letters',\n            bmp: '\\uA700-\\uA71F'\n        }, {\n            name: 'InMongolian',\n            bmp: '\\u1800-\\u18AF'\n        }, {\n            name: 'InMongolian_Supplement',\n            astral: '\\uD805[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InMro',\n            astral: '\\uD81A[\\uDE40-\\uDE6F]'\n        }, {\n            name: 'InMultani',\n            astral: '\\uD804[\\uDE80-\\uDEAF]'\n        }, {\n            name: 'InMusical_Symbols',\n            astral: '\\uD834[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InMyanmar',\n            bmp: '\\u1000-\\u109F'\n        }, {\n            name: 'InMyanmar_Extended_A',\n            bmp: '\\uAA60-\\uAA7F'\n        }, {\n            name: 'InMyanmar_Extended_B',\n            bmp: '\\uA9E0-\\uA9FF'\n        }, {\n            name: 'InNKo',\n            bmp: '\\u07C0-\\u07FF'\n        }, {\n            name: 'InNabataean',\n            astral: '\\uD802[\\uDC80-\\uDCAF]'\n        }, {\n            name: 'InNew_Tai_Lue',\n            bmp: '\\u1980-\\u19DF'\n        }, {\n            name: 'InNewa',\n            astral: '\\uD805[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InNumber_Forms',\n            bmp: '\\u2150-\\u218F'\n        }, {\n            name: 'InOgham',\n            bmp: '\\u1680-\\u169F'\n        }, {\n            name: 'InOl_Chiki',\n            bmp: '\\u1C50-\\u1C7F'\n        }, {\n            name: 'InOld_Hungarian',\n            astral: '\\uD803[\\uDC80-\\uDCFF]'\n        }, {\n            name: 'InOld_Italic',\n            astral: '\\uD800[\\uDF00-\\uDF2F]'\n        }, {\n            name: 'InOld_North_Arabian',\n            astral: '\\uD802[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'InOld_Permic',\n            astral: '\\uD800[\\uDF50-\\uDF7F]'\n        }, {\n            name: 'InOld_Persian',\n            astral: '\\uD800[\\uDFA0-\\uDFDF]'\n        }, {\n            name: 'InOld_South_Arabian',\n            astral: '\\uD802[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InOld_Turkic',\n            astral: '\\uD803[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'InOptical_Character_Recognition',\n            bmp: '\\u2440-\\u245F'\n        }, {\n            name: 'InOriya',\n            bmp: '\\u0B00-\\u0B7F'\n        }, {\n            name: 'InOrnamental_Dingbats',\n            astral: '\\uD83D[\\uDE50-\\uDE7F]'\n        }, {\n            name: 'InOsage',\n            astral: '\\uD801[\\uDCB0-\\uDCFF]'\n        }, {\n            name: 'InOsmanya',\n            astral: '\\uD801[\\uDC80-\\uDCAF]'\n        }, {\n            name: 'InPahawh_Hmong',\n            astral: '\\uD81A[\\uDF00-\\uDF8F]'\n        }, {\n            name: 'InPalmyrene',\n            astral: '\\uD802[\\uDC60-\\uDC7F]'\n        }, {\n            name: 'InPau_Cin_Hau',\n            astral: '\\uD806[\\uDEC0-\\uDEFF]'\n        }, {\n            name: 'InPhags_pa',\n            bmp: '\\uA840-\\uA87F'\n        }, {\n            name: 'InPhaistos_Disc',\n            astral: '\\uD800[\\uDDD0-\\uDDFF]'\n        }, {\n            name: 'InPhoenician',\n            astral: '\\uD802[\\uDD00-\\uDD1F]'\n        }, {\n            name: 'InPhonetic_Extensions',\n            bmp: '\\u1D00-\\u1D7F'\n        }, {\n            name: 'InPhonetic_Extensions_Supplement',\n            bmp: '\\u1D80-\\u1DBF'\n        }, {\n            name: 'InPlaying_Cards',\n            astral: '\\uD83C[\\uDCA0-\\uDCFF]'\n        }, {\n            name: 'InPrivate_Use_Area',\n            bmp: '\\uE000-\\uF8FF'\n        }, {\n            name: 'InPsalter_Pahlavi',\n            astral: '\\uD802[\\uDF80-\\uDFAF]'\n        }, {\n            name: 'InRejang',\n            bmp: '\\uA930-\\uA95F'\n        }, {\n            name: 'InRumi_Numeral_Symbols',\n            astral: '\\uD803[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InRunic',\n            bmp: '\\u16A0-\\u16FF'\n        }, {\n            name: 'InSamaritan',\n            bmp: '\\u0800-\\u083F'\n        }, {\n            name: 'InSaurashtra',\n            bmp: '\\uA880-\\uA8DF'\n        }, {\n            name: 'InSharada',\n            astral: '\\uD804[\\uDD80-\\uDDDF]'\n        }, {\n            name: 'InShavian',\n            astral: '\\uD801[\\uDC50-\\uDC7F]'\n        }, {\n            name: 'InShorthand_Format_Controls',\n            astral: '\\uD82F[\\uDCA0-\\uDCAF]'\n        }, {\n            name: 'InSiddham',\n            astral: '\\uD805[\\uDD80-\\uDDFF]'\n        }, {\n            name: 'InSinhala',\n            bmp: '\\u0D80-\\u0DFF'\n        }, {\n            name: 'InSinhala_Archaic_Numbers',\n            astral: '\\uD804[\\uDDE0-\\uDDFF]'\n        }, {\n            name: 'InSmall_Form_Variants',\n            bmp: '\\uFE50-\\uFE6F'\n        }, {\n            name: 'InSora_Sompeng',\n            astral: '\\uD804[\\uDCD0-\\uDCFF]'\n        }, {\n            name: 'InSpacing_Modifier_Letters',\n            bmp: '\\u02B0-\\u02FF'\n        }, {\n            name: 'InSpecials',\n            bmp: '\\uFFF0-\\uFFFF'\n        }, {\n            name: 'InSundanese',\n            bmp: '\\u1B80-\\u1BBF'\n        }, {\n            name: 'InSundanese_Supplement',\n            bmp: '\\u1CC0-\\u1CCF'\n        }, {\n            name: 'InSuperscripts_and_Subscripts',\n            bmp: '\\u2070-\\u209F'\n        }, {\n            name: 'InSupplemental_Arrows_A',\n            bmp: '\\u27F0-\\u27FF'\n        }, {\n            name: 'InSupplemental_Arrows_B',\n            bmp: '\\u2900-\\u297F'\n        }, {\n            name: 'InSupplemental_Arrows_C',\n            astral: '\\uD83E[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InSupplemental_Mathematical_Operators',\n            bmp: '\\u2A00-\\u2AFF'\n        }, {\n            name: 'InSupplemental_Punctuation',\n            bmp: '\\u2E00-\\u2E7F'\n        }, {\n            name: 'InSupplemental_Symbols_and_Pictographs',\n            astral: '\\uD83E[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InSupplementary_Private_Use_Area_A',\n            astral: '[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InSupplementary_Private_Use_Area_B',\n            astral: '[\\uDBC0-\\uDBFF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InSutton_SignWriting',\n            astral: '\\uD836[\\uDC00-\\uDEAF]'\n        }, {\n            name: 'InSyloti_Nagri',\n            bmp: '\\uA800-\\uA82F'\n        }, {\n            name: 'InSyriac',\n            bmp: '\\u0700-\\u074F'\n        }, {\n            name: 'InTagalog',\n            bmp: '\\u1700-\\u171F'\n        }, {\n            name: 'InTagbanwa',\n            bmp: '\\u1760-\\u177F'\n        }, {\n            name: 'InTags',\n            astral: '\\uDB40[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InTai_Le',\n            bmp: '\\u1950-\\u197F'\n        }, {\n            name: 'InTai_Tham',\n            bmp: '\\u1A20-\\u1AAF'\n        }, {\n            name: 'InTai_Viet',\n            bmp: '\\uAA80-\\uAADF'\n        }, {\n            name: 'InTai_Xuan_Jing_Symbols',\n            astral: '\\uD834[\\uDF00-\\uDF5F]'\n        }, {\n            name: 'InTakri',\n            astral: '\\uD805[\\uDE80-\\uDECF]'\n        }, {\n            name: 'InTamil',\n            bmp: '\\u0B80-\\u0BFF'\n        }, {\n            name: 'InTangut',\n            astral: '[\\uD81C-\\uD821][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InTangut_Components',\n            astral: '\\uD822[\\uDC00-\\uDEFF]'\n        }, {\n            name: 'InTelugu',\n            bmp: '\\u0C00-\\u0C7F'\n        }, {\n            name: 'InThaana',\n            bmp: '\\u0780-\\u07BF'\n        }, {\n            name: 'InThai',\n            bmp: '\\u0E00-\\u0E7F'\n        }, {\n            name: 'InTibetan',\n            bmp: '\\u0F00-\\u0FFF'\n        }, {\n            name: 'InTifinagh',\n            bmp: '\\u2D30-\\u2D7F'\n        }, {\n            name: 'InTirhuta',\n            astral: '\\uD805[\\uDC80-\\uDCDF]'\n        }, {\n            name: 'InTransport_and_Map_Symbols',\n            astral: '\\uD83D[\\uDE80-\\uDEFF]'\n        }, {\n            name: 'InUgaritic',\n            astral: '\\uD800[\\uDF80-\\uDF9F]'\n        }, {\n            name: 'InUnified_Canadian_Aboriginal_Syllabics',\n            bmp: '\\u1400-\\u167F'\n        }, {\n            name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended',\n            bmp: '\\u18B0-\\u18FF'\n        }, {\n            name: 'InVai',\n            bmp: '\\uA500-\\uA63F'\n        }, {\n            name: 'InVariation_Selectors',\n            bmp: '\\uFE00-\\uFE0F'\n        }, {\n            name: 'InVariation_Selectors_Supplement',\n            astral: '\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'InVedic_Extensions',\n            bmp: '\\u1CD0-\\u1CFF'\n        }, {\n            name: 'InVertical_Forms',\n            bmp: '\\uFE10-\\uFE1F'\n        }, {\n            name: 'InWarang_Citi',\n            astral: '\\uD806[\\uDCA0-\\uDCFF]'\n        }, {\n            name: 'InYi_Radicals',\n            bmp: '\\uA490-\\uA4CF'\n        }, {\n            name: 'InYi_Syllables',\n            bmp: '\\uA000-\\uA48F'\n        }, {\n            name: 'InYijing_Hexagram_Symbols',\n            bmp: '\\u4DC0-\\u4DFF'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeBlocks);\n\n    var unicodeCategories = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Categories 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for Unicode's general categories. E.g., `\\p{Lu}` or `\\p{Uppercase Letter}`. See\n         * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token\n         * names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'C',\n            alias: 'Other',\n            isBmpLast: true,\n            bmp: '\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u08E2\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180E\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',\n            astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCBD\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA0-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDD73-\\uDD7A\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]'\n        }, {\n            name: 'Cc',\n            alias: 'Control',\n            bmp: '\\0-\\x1F\\x7F-\\x9F'\n        }, {\n            name: 'Cf',\n            alias: 'Format',\n            bmp: '\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB',\n            astral: '\\uD804\\uDCBD|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n        }, {\n            name: 'Cn',\n            alias: 'Unassigned',\n            bmp: '\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u05FF\\u061D\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF',\n            astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n        }, {\n            name: 'Co',\n            alias: 'Private_Use',\n            bmp: '\\uE000-\\uF8FF',\n            astral: '[\\uDB80-\\uDBBE\\uDBC0-\\uDBFE][\\uDC00-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDC00-\\uDFFD]'\n        }, {\n            name: 'Cs',\n            alias: 'Surrogate',\n            bmp: '\\uD800-\\uDFFF'\n        }, {\n            name: 'L',\n            alias: 'Letter',\n            bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Ll',\n            alias: 'Lowercase_Letter',\n            bmp: 'a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n            astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n        }, {\n            name: 'Lm',\n            alias: 'Modifier_Letter',\n            bmp: '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E\\uFF9F',\n            astral: '\\uD81A[\\uDF40-\\uDF43]|\\uD81B[\\uDF93-\\uDF9F\\uDFE0]'\n        }, {\n            name: 'Lo',\n            alias: 'Other_Letter',\n            bmp: '\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC50-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Lt',\n            alias: 'Titlecase_Letter',\n            bmp: '\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC'\n        }, {\n            name: 'Lu',\n            alias: 'Uppercase_Letter',\n            bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n            astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]'\n        }, {\n            name: 'M',\n            alias: 'Mark',\n            bmp: '\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n            astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDDCA-\\uDDCC\\uDE2C-\\uDE37\\uDE3E\\uDEDF-\\uDEEA\\uDF00-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC35-\\uDC46\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDDDC\\uDDDD\\uDE30-\\uDE40\\uDEAB-\\uDEB7\\uDF1D-\\uDF2B]|\\uD807[\\uDC2F-\\uDC36\\uDC38-\\uDC3F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'Mc',\n            alias: 'Spacing_Mark',\n            bmp: '\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\u1CF3\\u302E\\u302F\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC',\n            astral: '\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3E\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB0-\\uDCB2\\uDCB9\\uDCBB-\\uDCBE\\uDCC1\\uDDAF-\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF20\\uDF21\\uDF26]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4]|\\uD81B[\\uDF51-\\uDF7E]|\\uD834[\\uDD65\\uDD66\\uDD6D-\\uDD72]'\n        }, {\n            name: 'Me',\n            alias: 'Enclosing_Mark',\n            bmp: '\\u0488\\u0489\\u1ABE\\u20DD-\\u20E0\\u20E2-\\u20E4\\uA670-\\uA672'\n        }, {\n            name: 'Mn',\n            alias: 'Nonspacing_Mark',\n            bmp: '\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D01\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n            astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDCA-\\uDDCC\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3C\\uDF40\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDCB3-\\uDCB8\\uDCBA\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'N',\n            alias: 'Number',\n            bmp: '0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n            astral: '\\uD800[\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD801[\\uDCA0-\\uDCA9]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDDE1-\\uDDF4\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF3B]|\\uD806[\\uDCE0-\\uDCF2]|\\uD807[\\uDC50-\\uDC6C]|\\uD809[\\uDC00-\\uDC6E]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDCC7-\\uDCCF\\uDD50-\\uDD59]|\\uD83C[\\uDD00-\\uDD0C]'\n        }, {\n            name: 'Nd',\n            alias: 'Decimal_Number',\n            bmp: '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n            astral: '\\uD801[\\uDCA0-\\uDCA9]|\\uD804[\\uDC66-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF39]|\\uD806[\\uDCE0-\\uDCE9]|\\uD807[\\uDC50-\\uDC59]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDD50-\\uDD59]'\n        }, {\n            name: 'Nl',\n            alias: 'Letter_Number',\n            bmp: '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',\n            astral: '\\uD800[\\uDD40-\\uDD74\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD809[\\uDC00-\\uDC6E]'\n        }, {\n            name: 'No',\n            alias: 'Other_Number',\n            bmp: '\\xB2\\xB3\\xB9\\xBC-\\xBE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',\n            astral: '\\uD800[\\uDD07-\\uDD33\\uDD75-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC65\\uDDE1-\\uDDF4]|\\uD805[\\uDF3A\\uDF3B]|\\uD806[\\uDCEA-\\uDCF2]|\\uD807[\\uDC5A-\\uDC6C]|\\uD81A[\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD83A[\\uDCC7-\\uDCCF]|\\uD83C[\\uDD00-\\uDD0C]'\n        }, {\n            name: 'P',\n            alias: 'Punctuation',\n            bmp: '\\x21-\\x23\\x25-\\\\x2A\\x2C-\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5B-\\\\x5D\\x5F\\\\x7B\\x7D\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E44\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Pc',\n            alias: 'Connector_Punctuation',\n            bmp: '\\x5F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F'\n        }, {\n            name: 'Pd',\n            alias: 'Dash_Punctuation',\n            bmp: '\\\\x2D\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D'\n        }, {\n            name: 'Pe',\n            alias: 'Close_Punctuation',\n            bmp: '\\\\x29\\\\x5D\\x7D\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63'\n        }, {\n            name: 'Pf',\n            alias: 'Final_Punctuation',\n            bmp: '\\xBB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21'\n        }, {\n            name: 'Pi',\n            alias: 'Initial_Punctuation',\n            bmp: '\\xAB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20'\n        }, {\n            name: 'Po',\n            alias: 'Other_Punctuation',\n            bmp: '\\x21-\\x23\\x25-\\x27\\\\x2A\\x2C\\\\x2E\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5C\\xA1\\xA7\\xB6\\xB7\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166D\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43\\u2E44\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Ps',\n            alias: 'Open_Punctuation',\n            bmp: '\\\\x28\\\\x5B\\\\x7B\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62'\n        }, {\n            name: 'S',\n            alias: 'Symbol',\n            bmp: '\\\\x24\\\\x2B\\x3C-\\x3E\\\\x5E\\x60\\\\x7C\\x7E\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20BE\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uFB29\\uFBB2-\\uFBC1\\uFDFC\\uFDFD\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',\n            astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83B[\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n        }, {\n            name: 'Sc',\n            alias: 'Currency_Symbol',\n            bmp: '\\\\x24\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BE\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6'\n        }, {\n            name: 'Sk',\n            alias: 'Modifier_Symbol',\n            bmp: '\\\\x5E\\x60\\xA8\\xAF\\xB4\\xB8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uFBB2-\\uFBC1\\uFF3E\\uFF40\\uFFE3',\n            astral: '\\uD83C[\\uDFFB-\\uDFFF]'\n        }, {\n            name: 'Sm',\n            alias: 'Math_Symbol',\n            bmp: '\\\\x2B\\x3C-\\x3E\\\\x7C\\x7E\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',\n            astral: '\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD83B[\\uDEF0\\uDEF1]'\n        }, {\n            name: 'So',\n            alias: 'Other_Symbol',\n            bmp: '\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',\n            astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFA]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n        }, {\n            name: 'Z',\n            alias: 'Separator',\n            bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n        }, {\n            name: 'Zl',\n            alias: 'Line_Separator',\n            bmp: '\\u2028'\n        }, {\n            name: 'Zp',\n            alias: 'Paragraph_Separator',\n            bmp: '\\u2029'\n        }, {\n            name: 'Zs',\n            alias: 'Space_Separator',\n            bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeCategories);\n\n    var unicodeProperties = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Properties 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2012-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See\n         * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from\n         * UAX #44 <http://unicode.org/reports/tr44/>:\n         *\n         * - Alphabetic\n         *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +\n         *   Lo + Nl + Other_Alphabetic.\n         *\n         * - Default_Ignorable_Code_Point\n         *   For programmatic determination of default ignorable code points. New characters that should\n         *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,\n         *   permitting programs to correctly handle the default rendering of such characters when not\n         *   otherwise supported.\n         *\n         * - Lowercase\n         *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.\n         *\n         * - Noncharacter_Code_Point\n         *   Code points permanently reserved for internal use.\n         *\n         * - Uppercase\n         *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.\n         *\n         * - White_Space\n         *   Spaces, separator characters and other control characters which should be treated by\n         *   programming languages as \"white space\" for the purpose of parsing elements.\n         *\n         * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS\n         * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are\n         * included in XRegExp's Unicode Categories and Unicode Scripts addons.\n         *\n         * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');\n        }\n\n        var unicodeData = [{\n            name: 'ASCII',\n            bmp: '\\0-\\x7F'\n        }, {\n            name: 'Alphabetic',\n            bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0345\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05B0-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0657\\u0659-\\u065F\\u066E-\\u06D3\\u06D5-\\u06DC\\u06E1-\\u06E8\\u06ED-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710-\\u073F\\u074D-\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0817\\u081A-\\u082C\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08DF\\u08E3-\\u08E9\\u08F0-\\u093B\\u093D-\\u094C\\u094E-\\u0950\\u0955-\\u0963\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD-\\u09C4\\u09C7\\u09C8\\u09CB\\u09CC\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09F0\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A70-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB\\u0ACC\\u0AD0\\u0AE0-\\u0AE3\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D-\\u0B44\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD0\\u0BD7\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4C\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCC\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E46\\u0E4D\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ECD\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F81\\u0F88-\\u0F97\\u0F99-\\u0FBC\\u1000-\\u1036\\u1038\\u103B-\\u103F\\u1050-\\u1062\\u1065-\\u1068\\u106E-\\u1086\\u108E\\u109C\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1713\\u1720-\\u1733\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17B3\\u17B6-\\u17C8\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u1938\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A61-\\u1A74\\u1AA7\\u1B00-\\u1B33\\u1B35-\\u1B43\\u1B45-\\u1B4B\\u1B80-\\u1BA9\\u1BAC-\\u1BAF\\u1BBA-\\u1BE5\\u1BE7-\\u1BF1\\u1C00-\\u1C35\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1DE7-\\u1DF4\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u24B6-\\u24E9\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA674-\\uA67B\\uA67F-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA827\\uA840-\\uA873\\uA880-\\uA8C3\\uA8C5\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA92A\\uA930-\\uA952\\uA960-\\uA97C\\uA980-\\uA9B2\\uA9B4-\\uA9BF\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAABE\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF5\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC45\\uDC82-\\uDCB8\\uDCD0-\\uDCE8\\uDD00-\\uDD32\\uDD50-\\uDD72\\uDD76\\uDD80-\\uDDBF\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE34\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEE8\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D-\\uDF44\\uDF47\\uDF48\\uDF4B\\uDF4C\\uDF50\\uDF57\\uDF5D-\\uDF63]|\\uD805[\\uDC00-\\uDC41\\uDC43-\\uDC45\\uDC47-\\uDC4A\\uDC80-\\uDCC1\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDB5\\uDDB8-\\uDDBE\\uDDD8-\\uDDDD\\uDE00-\\uDE3E\\uDE40\\uDE44\\uDE80-\\uDEB5\\uDF00-\\uDF19\\uDF1D-\\uDF2A]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC3E\\uDC40\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9E]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD47]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Any',\n            isBmpLast: true,\n            bmp: '\\0-\\uFFFF',\n            astral: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'Default_Ignorable_Code_Point',\n            bmp: '\\xAD\\u034F\\u061C\\u115F\\u1160\\u17B4\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8',\n            astral: '\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|[\\uDB40-\\uDB43][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'Lowercase',\n            bmp: 'a-z\\xAA\\xB5\\xBA\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02B8\\u02C0\\u02C1\\u02E0-\\u02E4\\u0345\\u0371\\u0373\\u0377\\u037A-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1DBF\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u2090-\\u209C\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2170-\\u217F\\u2184\\u24D0-\\u24E9\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7D\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B-\\uA69D\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7F8-\\uA7FA\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n            astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n        }, {\n            name: 'Noncharacter_Code_Point',\n            bmp: '\\uFDD0-\\uFDEF\\uFFFE\\uFFFF',\n            astral: '[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n        }, {\n            name: 'Uppercase',\n            bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n            astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]'\n        }, {\n            name: 'White_Space',\n            bmp: '\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n        }];\n\n        // Add non-generated data\n        unicodeData.push({\n            name: 'Assigned',\n            // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode\n            // Categories addon is required to use this property\n            inverseOf: 'Cn'\n        });\n\n        XRegExp.addUnicodeData(unicodeData);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeProperties);\n\n    var unicodeScripts = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Scripts 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for all Unicode scripts. E.g., `\\p{Latin}`. Token names are case insensitive,\n         * and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'Adlam',\n            astral: '\\uD83A[\\uDD00-\\uDD4A\\uDD50-\\uDD59\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Ahom',\n            astral: '\\uD805[\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF3F]'\n        }, {\n            name: 'Anatolian_Hieroglyphs',\n            astral: '\\uD811[\\uDC00-\\uDE46]'\n        }, {\n            name: 'Arabic',\n            bmp: '\\u0600-\\u0604\\u0606-\\u060B\\u060D-\\u061A\\u061E\\u0620-\\u063F\\u0641-\\u064A\\u0656-\\u066F\\u0671-\\u06DC\\u06DE-\\u06FF\\u0750-\\u077F\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u08FF\\uFB50-\\uFBC1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFD\\uFE70-\\uFE74\\uFE76-\\uFEFC',\n            astral: '\\uD803[\\uDE60-\\uDE7E]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB\\uDEF0\\uDEF1]'\n        }, {\n            name: 'Armenian',\n            bmp: '\\u0531-\\u0556\\u0559-\\u055F\\u0561-\\u0587\\u058A\\u058D-\\u058F\\uFB13-\\uFB17'\n        }, {\n            name: 'Avestan',\n            astral: '\\uD802[\\uDF00-\\uDF35\\uDF39-\\uDF3F]'\n        }, {\n            name: 'Balinese',\n            bmp: '\\u1B00-\\u1B4B\\u1B50-\\u1B7C'\n        }, {\n            name: 'Bamum',\n            bmp: '\\uA6A0-\\uA6F7',\n            astral: '\\uD81A[\\uDC00-\\uDE38]'\n        }, {\n            name: 'Bassa_Vah',\n            astral: '\\uD81A[\\uDED0-\\uDEED\\uDEF0-\\uDEF5]'\n        }, {\n            name: 'Batak',\n            bmp: '\\u1BC0-\\u1BF3\\u1BFC-\\u1BFF'\n        }, {\n            name: 'Bengali',\n            bmp: '\\u0980-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FB'\n        }, {\n            name: 'Bhaiksuki',\n            astral: '\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC45\\uDC50-\\uDC6C]'\n        }, {\n            name: 'Bopomofo',\n            bmp: '\\u02EA\\u02EB\\u3105-\\u312D\\u31A0-\\u31BA'\n        }, {\n            name: 'Brahmi',\n            astral: '\\uD804[\\uDC00-\\uDC4D\\uDC52-\\uDC6F\\uDC7F]'\n        }, {\n            name: 'Braille',\n            bmp: '\\u2800-\\u28FF'\n        }, {\n            name: 'Buginese',\n            bmp: '\\u1A00-\\u1A1B\\u1A1E\\u1A1F'\n        }, {\n            name: 'Buhid',\n            bmp: '\\u1740-\\u1753'\n        }, {\n            name: 'Canadian_Aboriginal',\n            bmp: '\\u1400-\\u167F\\u18B0-\\u18F5'\n        }, {\n            name: 'Carian',\n            astral: '\\uD800[\\uDEA0-\\uDED0]'\n        }, {\n            name: 'Caucasian_Albanian',\n            astral: '\\uD801[\\uDD30-\\uDD63\\uDD6F]'\n        }, {\n            name: 'Chakma',\n            astral: '\\uD804[\\uDD00-\\uDD34\\uDD36-\\uDD43]'\n        }, {\n            name: 'Cham',\n            bmp: '\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA5C-\\uAA5F'\n        }, {\n            name: 'Cherokee',\n            bmp: '\\u13A0-\\u13F5\\u13F8-\\u13FD\\uAB70-\\uABBF'\n        }, {\n            name: 'Common',\n            bmp: '\\0-\\x40\\\\x5B-\\x60\\\\x7B-\\xA9\\xAB-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02B9-\\u02DF\\u02E5-\\u02E9\\u02EC-\\u02FF\\u0374\\u037E\\u0385\\u0387\\u0589\\u0605\\u060C\\u061B\\u061C\\u061F\\u0640\\u06DD\\u08E2\\u0964\\u0965\\u0E3F\\u0FD5-\\u0FD8\\u10FB\\u16EB-\\u16ED\\u1735\\u1736\\u1802\\u1803\\u1805\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u2000-\\u200B\\u200E-\\u2064\\u2066-\\u2070\\u2074-\\u207E\\u2080-\\u208E\\u20A0-\\u20BE\\u2100-\\u2125\\u2127-\\u2129\\u212C-\\u2131\\u2133-\\u214D\\u214F-\\u215F\\u2189-\\u218B\\u2190-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u2460-\\u27FF\\u2900-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2E00-\\u2E44\\u2FF0-\\u2FFB\\u3000-\\u3004\\u3006\\u3008-\\u3020\\u3030-\\u3037\\u303C-\\u303F\\u309B\\u309C\\u30A0\\u30FB\\u30FC\\u3190-\\u319F\\u31C0-\\u31E3\\u3220-\\u325F\\u327F-\\u32CF\\u3358-\\u33FF\\u4DC0-\\u4DFF\\uA700-\\uA721\\uA788-\\uA78A\\uA830-\\uA839\\uA92E\\uA9CF\\uAB5B\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFEFF\\uFF01-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFF70\\uFF9E\\uFF9F\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFF9-\\uFFFD',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDD07-\\uDD33\\uDD37-\\uDD3F\\uDD90-\\uDD9B\\uDDD0-\\uDDFC\\uDEE1-\\uDEFB]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD66\\uDD6A-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDF00-\\uDF56\\uDF60-\\uDF71]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD00-\\uDD0C\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n        }, {\n            name: 'Coptic',\n            bmp: '\\u03E2-\\u03EF\\u2C80-\\u2CF3\\u2CF9-\\u2CFF'\n        }, {\n            name: 'Cuneiform',\n            astral: '\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC70-\\uDC74\\uDC80-\\uDD43]'\n        }, {\n            name: 'Cypriot',\n            astral: '\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F]'\n        }, {\n            name: 'Cyrillic',\n            bmp: '\\u0400-\\u0484\\u0487-\\u052F\\u1C80-\\u1C88\\u1D2B\\u1D78\\u2DE0-\\u2DFF\\uA640-\\uA69F\\uFE2E\\uFE2F'\n        }, {\n            name: 'Deseret',\n            astral: '\\uD801[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'Devanagari',\n            bmp: '\\u0900-\\u0950\\u0953-\\u0963\\u0966-\\u097F\\uA8E0-\\uA8FD'\n        }, {\n            name: 'Duployan',\n            astral: '\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9C-\\uDC9F]'\n        }, {\n            name: 'Egyptian_Hieroglyphs',\n            astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]'\n        }, {\n            name: 'Elbasan',\n            astral: '\\uD801[\\uDD00-\\uDD27]'\n        }, {\n            name: 'Ethiopic',\n            bmp: '\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u137C\\u1380-\\u1399\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E'\n        }, {\n            name: 'Georgian',\n            bmp: '\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u10FF\\u2D00-\\u2D25\\u2D27\\u2D2D'\n        }, {\n            name: 'Glagolitic',\n            bmp: '\\u2C00-\\u2C2E\\u2C30-\\u2C5E',\n            astral: '\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]'\n        }, {\n            name: 'Gothic',\n            astral: '\\uD800[\\uDF30-\\uDF4A]'\n        }, {\n            name: 'Grantha',\n            astral: '\\uD804[\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]'\n        }, {\n            name: 'Greek',\n            bmp: '\\u0370-\\u0373\\u0375-\\u0377\\u037A-\\u037D\\u037F\\u0384\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03E1\\u03F0-\\u03FF\\u1D26-\\u1D2A\\u1D5D-\\u1D61\\u1D66-\\u1D6A\\u1DBF\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FC4\\u1FC6-\\u1FD3\\u1FD6-\\u1FDB\\u1FDD-\\u1FEF\\u1FF2-\\u1FF4\\u1FF6-\\u1FFE\\u2126\\uAB65',\n            astral: '\\uD800[\\uDD40-\\uDD8E\\uDDA0]|\\uD834[\\uDE00-\\uDE45]'\n        }, {\n            name: 'Gujarati',\n            bmp: '\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AF1\\u0AF9'\n        }, {\n            name: 'Gurmukhi',\n            bmp: '\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75'\n        }, {\n            name: 'Han',\n            bmp: '\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uF900-\\uFA6D\\uFA70-\\uFAD9',\n            astral: '[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Hangul',\n            bmp: '\\u1100-\\u11FF\\u302E\\u302F\\u3131-\\u318E\\u3200-\\u321E\\u3260-\\u327E\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n        }, {\n            name: 'Hanunoo',\n            bmp: '\\u1720-\\u1734'\n        }, {\n            name: 'Hatran',\n            astral: '\\uD802[\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDCFF]'\n        }, {\n            name: 'Hebrew',\n            bmp: '\\u0591-\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F4\\uFB1D-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFB4F'\n        }, {\n            name: 'Hiragana',\n            bmp: '\\u3041-\\u3096\\u309D-\\u309F',\n            astral: '\\uD82C\\uDC01|\\uD83C\\uDE00'\n        }, {\n            name: 'Imperial_Aramaic',\n            astral: '\\uD802[\\uDC40-\\uDC55\\uDC57-\\uDC5F]'\n        }, {\n            name: 'Inherited',\n            bmp: '\\u0300-\\u036F\\u0485\\u0486\\u064B-\\u0655\\u0670\\u0951\\u0952\\u1AB0-\\u1ABE\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u200C\\u200D\\u20D0-\\u20F0\\u302A-\\u302D\\u3099\\u309A\\uFE00-\\uFE0F\\uFE20-\\uFE2D',\n            astral: '\\uD800[\\uDDFD\\uDEE0]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'Inscriptional_Pahlavi',\n            astral: '\\uD802[\\uDF60-\\uDF72\\uDF78-\\uDF7F]'\n        }, {\n            name: 'Inscriptional_Parthian',\n            astral: '\\uD802[\\uDF40-\\uDF55\\uDF58-\\uDF5F]'\n        }, {\n            name: 'Javanese',\n            bmp: '\\uA980-\\uA9CD\\uA9D0-\\uA9D9\\uA9DE\\uA9DF'\n        }, {\n            name: 'Kaithi',\n            astral: '\\uD804[\\uDC80-\\uDCC1]'\n        }, {\n            name: 'Kannada',\n            bmp: '\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2'\n        }, {\n            name: 'Katakana',\n            bmp: '\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D',\n            astral: '\\uD82C\\uDC00'\n        }, {\n            name: 'Kayah_Li',\n            bmp: '\\uA900-\\uA92D\\uA92F'\n        }, {\n            name: 'Kharoshthi',\n            astral: '\\uD802[\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F-\\uDE47\\uDE50-\\uDE58]'\n        }, {\n            name: 'Khmer',\n            bmp: '\\u1780-\\u17DD\\u17E0-\\u17E9\\u17F0-\\u17F9\\u19E0-\\u19FF'\n        }, {\n            name: 'Khojki',\n            astral: '\\uD804[\\uDE00-\\uDE11\\uDE13-\\uDE3E]'\n        }, {\n            name: 'Khudawadi',\n            astral: '\\uD804[\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9]'\n        }, {\n            name: 'Lao',\n            bmp: '\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF'\n        }, {\n            name: 'Latin',\n            bmp: 'A-Za-z\\xAA\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02B8\\u02E0-\\u02E4\\u1D00-\\u1D25\\u1D2C-\\u1D5C\\u1D62-\\u1D65\\u1D6B-\\u1D77\\u1D79-\\u1DBE\\u1E00-\\u1EFF\\u2071\\u207F\\u2090-\\u209C\\u212A\\u212B\\u2132\\u214E\\u2160-\\u2188\\u2C60-\\u2C7F\\uA722-\\uA787\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA7FF\\uAB30-\\uAB5A\\uAB5C-\\uAB64\\uFB00-\\uFB06\\uFF21-\\uFF3A\\uFF41-\\uFF5A'\n        }, {\n            name: 'Lepcha',\n            bmp: '\\u1C00-\\u1C37\\u1C3B-\\u1C49\\u1C4D-\\u1C4F'\n        }, {\n            name: 'Limbu',\n            bmp: '\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1940\\u1944-\\u194F'\n        }, {\n            name: 'Linear_A',\n            astral: '\\uD801[\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]'\n        }, {\n            name: 'Linear_B',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA]'\n        }, {\n            name: 'Lisu',\n            bmp: '\\uA4D0-\\uA4FF'\n        }, {\n            name: 'Lycian',\n            astral: '\\uD800[\\uDE80-\\uDE9C]'\n        }, {\n            name: 'Lydian',\n            astral: '\\uD802[\\uDD20-\\uDD39\\uDD3F]'\n        }, {\n            name: 'Mahajani',\n            astral: '\\uD804[\\uDD50-\\uDD76]'\n        }, {\n            name: 'Malayalam',\n            bmp: '\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4F\\u0D54-\\u0D63\\u0D66-\\u0D7F'\n        }, {\n            name: 'Mandaic',\n            bmp: '\\u0840-\\u085B\\u085E'\n        }, {\n            name: 'Manichaean',\n            astral: '\\uD802[\\uDEC0-\\uDEE6\\uDEEB-\\uDEF6]'\n        }, {\n            name: 'Marchen',\n            astral: '\\uD807[\\uDC70-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]'\n        }, {\n            name: 'Meetei_Mayek',\n            bmp: '\\uAAE0-\\uAAF6\\uABC0-\\uABED\\uABF0-\\uABF9'\n        }, {\n            name: 'Mende_Kikakui',\n            astral: '\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCD6]'\n        }, {\n            name: 'Meroitic_Cursive',\n            astral: '\\uD802[\\uDDA0-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDDFF]'\n        }, {\n            name: 'Meroitic_Hieroglyphs',\n            astral: '\\uD802[\\uDD80-\\uDD9F]'\n        }, {\n            name: 'Miao',\n            astral: '\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]'\n        }, {\n            name: 'Modi',\n            astral: '\\uD805[\\uDE00-\\uDE44\\uDE50-\\uDE59]'\n        }, {\n            name: 'Mongolian',\n            bmp: '\\u1800\\u1801\\u1804\\u1806-\\u180E\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA',\n            astral: '\\uD805[\\uDE60-\\uDE6C]'\n        }, {\n            name: 'Mro',\n            astral: '\\uD81A[\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE6E\\uDE6F]'\n        }, {\n            name: 'Multani',\n            astral: '\\uD804[\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA9]'\n        }, {\n            name: 'Myanmar',\n            bmp: '\\u1000-\\u109F\\uA9E0-\\uA9FE\\uAA60-\\uAA7F'\n        }, {\n            name: 'Nabataean',\n            astral: '\\uD802[\\uDC80-\\uDC9E\\uDCA7-\\uDCAF]'\n        }, {\n            name: 'New_Tai_Lue',\n            bmp: '\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u19DE\\u19DF'\n        }, {\n            name: 'Newa',\n            astral: '\\uD805[\\uDC00-\\uDC59\\uDC5B\\uDC5D]'\n        }, {\n            name: 'Nko',\n            bmp: '\\u07C0-\\u07FA'\n        }, {\n            name: 'Ogham',\n            bmp: '\\u1680-\\u169C'\n        }, {\n            name: 'Ol_Chiki',\n            bmp: '\\u1C50-\\u1C7F'\n        }, {\n            name: 'Old_Hungarian',\n            astral: '\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDCFF]'\n        }, {\n            name: 'Old_Italic',\n            astral: '\\uD800[\\uDF00-\\uDF23]'\n        }, {\n            name: 'Old_North_Arabian',\n            astral: '\\uD802[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'Old_Permic',\n            astral: '\\uD800[\\uDF50-\\uDF7A]'\n        }, {\n            name: 'Old_Persian',\n            astral: '\\uD800[\\uDFA0-\\uDFC3\\uDFC8-\\uDFD5]'\n        }, {\n            name: 'Old_South_Arabian',\n            astral: '\\uD802[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'Old_Turkic',\n            astral: '\\uD803[\\uDC00-\\uDC48]'\n        }, {\n            name: 'Oriya',\n            bmp: '\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B77'\n        }, {\n            name: 'Osage',\n            astral: '\\uD801[\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB]'\n        }, {\n            name: 'Osmanya',\n            astral: '\\uD801[\\uDC80-\\uDC9D\\uDCA0-\\uDCA9]'\n        }, {\n            name: 'Pahawh_Hmong',\n            astral: '\\uD81A[\\uDF00-\\uDF45\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]'\n        }, {\n            name: 'Palmyrene',\n            astral: '\\uD802[\\uDC60-\\uDC7F]'\n        }, {\n            name: 'Pau_Cin_Hau',\n            astral: '\\uD806[\\uDEC0-\\uDEF8]'\n        }, {\n            name: 'Phags_Pa',\n            bmp: '\\uA840-\\uA877'\n        }, {\n            name: 'Phoenician',\n            astral: '\\uD802[\\uDD00-\\uDD1B\\uDD1F]'\n        }, {\n            name: 'Psalter_Pahlavi',\n            astral: '\\uD802[\\uDF80-\\uDF91\\uDF99-\\uDF9C\\uDFA9-\\uDFAF]'\n        }, {\n            name: 'Rejang',\n            bmp: '\\uA930-\\uA953\\uA95F'\n        }, {\n            name: 'Runic',\n            bmp: '\\u16A0-\\u16EA\\u16EE-\\u16F8'\n        }, {\n            name: 'Samaritan',\n            bmp: '\\u0800-\\u082D\\u0830-\\u083E'\n        }, {\n            name: 'Saurashtra',\n            bmp: '\\uA880-\\uA8C5\\uA8CE-\\uA8D9'\n        }, {\n            name: 'Sharada',\n            astral: '\\uD804[\\uDD80-\\uDDCD\\uDDD0-\\uDDDF]'\n        }, {\n            name: 'Shavian',\n            astral: '\\uD801[\\uDC50-\\uDC7F]'\n        }, {\n            name: 'Siddham',\n            astral: '\\uD805[\\uDD80-\\uDDB5\\uDDB8-\\uDDDD]'\n        }, {\n            name: 'SignWriting',\n            astral: '\\uD836[\\uDC00-\\uDE8B\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]'\n        }, {\n            name: 'Sinhala',\n            bmp: '\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2-\\u0DF4',\n            astral: '\\uD804[\\uDDE1-\\uDDF4]'\n        }, {\n            name: 'Sora_Sompeng',\n            astral: '\\uD804[\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9]'\n        }, {\n            name: 'Sundanese',\n            bmp: '\\u1B80-\\u1BBF\\u1CC0-\\u1CC7'\n        }, {\n            name: 'Syloti_Nagri',\n            bmp: '\\uA800-\\uA82B'\n        }, {\n            name: 'Syriac',\n            bmp: '\\u0700-\\u070D\\u070F-\\u074A\\u074D-\\u074F'\n        }, {\n            name: 'Tagalog',\n            bmp: '\\u1700-\\u170C\\u170E-\\u1714'\n        }, {\n            name: 'Tagbanwa',\n            bmp: '\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773'\n        }, {\n            name: 'Tai_Le',\n            bmp: '\\u1950-\\u196D\\u1970-\\u1974'\n        }, {\n            name: 'Tai_Tham',\n            bmp: '\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA0-\\u1AAD'\n        }, {\n            name: 'Tai_Viet',\n            bmp: '\\uAA80-\\uAAC2\\uAADB-\\uAADF'\n        }, {\n            name: 'Takri',\n            astral: '\\uD805[\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]'\n        }, {\n            name: 'Tamil',\n            bmp: '\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BFA'\n        }, {\n            name: 'Tangut',\n            astral: '\\uD81B\\uDFE0|[\\uD81C-\\uD820][\\uDC00-\\uDFFF]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]'\n        }, {\n            name: 'Telugu',\n            bmp: '\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C78-\\u0C7F'\n        }, {\n            name: 'Thaana',\n            bmp: '\\u0780-\\u07B1'\n        }, {\n            name: 'Thai',\n            bmp: '\\u0E01-\\u0E3A\\u0E40-\\u0E5B'\n        }, {\n            name: 'Tibetan',\n            bmp: '\\u0F00-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F97\\u0F99-\\u0FBC\\u0FBE-\\u0FCC\\u0FCE-\\u0FD4\\u0FD9\\u0FDA'\n        }, {\n            name: 'Tifinagh',\n            bmp: '\\u2D30-\\u2D67\\u2D6F\\u2D70\\u2D7F'\n        }, {\n            name: 'Tirhuta',\n            astral: '\\uD805[\\uDC80-\\uDCC7\\uDCD0-\\uDCD9]'\n        }, {\n            name: 'Ugaritic',\n            astral: '\\uD800[\\uDF80-\\uDF9D\\uDF9F]'\n        }, {\n            name: 'Vai',\n            bmp: '\\uA500-\\uA62B'\n        }, {\n            name: 'Warang_Citi',\n            astral: '\\uD806[\\uDCA0-\\uDCF2\\uDCFF]'\n        }, {\n            name: 'Yi',\n            bmp: '\\uA000-\\uA48C\\uA490-\\uA4C6'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeScripts);\n\n    var lib = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n\n\n\n    var _xregexp2 = _interopRequireDefault(xregexp);\n\n\n\n    var _build2 = _interopRequireDefault(build);\n\n\n\n    var _matchrecursive2 = _interopRequireDefault(matchrecursive);\n\n\n\n    var _unicodeBase2 = _interopRequireDefault(unicodeBase);\n\n\n\n    var _unicodeBlocks2 = _interopRequireDefault(unicodeBlocks);\n\n\n\n    var _unicodeCategories2 = _interopRequireDefault(unicodeCategories);\n\n\n\n    var _unicodeProperties2 = _interopRequireDefault(unicodeProperties);\n\n\n\n    var _unicodeScripts2 = _interopRequireDefault(unicodeScripts);\n\n    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n    (0, _build2.default)(_xregexp2.default);\n    (0, _matchrecursive2.default)(_xregexp2.default);\n    (0, _unicodeBase2.default)(_xregexp2.default);\n    (0, _unicodeBlocks2.default)(_xregexp2.default);\n    (0, _unicodeCategories2.default)(_xregexp2.default);\n    (0, _unicodeProperties2.default)(_xregexp2.default);\n    (0, _unicodeScripts2.default)(_xregexp2.default);\n\n    exports.default = _xregexp2.default;\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(lib);\n\n    var decamelize = (text, separator) => {\n    \tif (typeof text !== 'string') {\n    \t\tthrow new TypeError('Expected a string');\n    \t}\n\n    \tseparator = typeof separator === 'undefined' ? '_' : separator;\n\n    \tconst regex1 = lib('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n    \tconst regex2 = lib('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n\n    \treturn text\n    \t\t// TODO: Use this instead of `xregexp` when targeting Node.js 10:\n    \t\t// .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n    \t\t// .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n    \t\t.replace(regex1, `$1${separator}$2`)\n    \t\t.replace(regex2, `$1${separator}$2`)\n    \t\t.toLowerCase();\n    };\n\n    var _decamelize = /*#__PURE__*/Object.freeze({\n        default: decamelize,\n        __moduleExports: decamelize\n    });\n\n    //handle es6 / bundling\n    const decamelize$1 = (decamelize || _decamelize);\n    function createElement(tag, attrs, ...children) {\n        if (typeof tag === 'function') {\n            const fn = tag;\n            const props = attrs;\n            props.children = children;\n            return fn(props);\n        }\n        else {\n            const el = document.createElement(tag);\n            const map = attrs;\n            for (let name in map) {\n                if (name && map.hasOwnProperty(name)) {\n                    let value = map[name];\n                    if (name === 'className' && value !== void 0) {\n                        el.setAttribute('class', value.toString());\n                    }\n                    else if (value === false || value === null || value === undefined) {\n                        continue;\n                    }\n                    else if (value === true) {\n                        el.setAttribute(name, name);\n                    }\n                    else if (typeof value === 'function') {\n                        el[name.toLowerCase()] = value;\n                    }\n                    else if (typeof value === 'object') {\n                        el.setAttribute(name, flatten(value));\n                    }\n                    else {\n                        el.setAttribute(name, value.toString());\n                    }\n                }\n            }\n            if (children && children.length > 0) {\n                appendChildren(el, children);\n            }\n            return el;\n        }\n    }\n    function flatten(o) {\n        const arr = [];\n        for (let prop in o)\n            arr.push(`${decamelize$1(prop, '-')}:${o[prop]}`);\n        return arr.join(';');\n    }\n    function addChild(parentElement, child) {\n        if (child === null || child === undefined || typeof child === \"boolean\") {\n            return;\n        }\n        else if (Array.isArray(child)) {\n            appendChildren(parentElement, child);\n        }\n        else if (isElement(child)) {\n            parentElement.appendChild(child);\n        }\n        else {\n            parentElement.appendChild(document.createTextNode(child.toString()));\n        }\n    }\n    function appendChildren(parentElement, children) {\n        children.forEach(child => addChild(parentElement, child));\n    }\n    function isElement(el) {\n        //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n        return !!el.nodeType;\n    }\n    function mount(element, container) {\n        const activeChildPositions = getActiveChildPositions(container);\n        container.innerHTML = '';\n        if (element) {\n            addChild(container, element);\n            if (activeChildPositions)\n                focusChildAtPosition(container, activeChildPositions);\n        }\n    }\n    function focusChildAtPosition(element, childPositions) {\n        while (element && childPositions.length)\n            element = element.children.item(childPositions.shift());\n        if (element)\n            element.focus();\n    }\n    function getActiveChildPositions(containerElement) {\n        var active = document.activeElement;\n        var childPositions = [];\n        while (active !== document.body && active !== containerElement) {\n            childPositions.unshift(childPosition(active));\n            active = active.parentElement;\n        }\n        if (active === containerElement && childPositions.length)\n            return childPositions;\n    }\n    function childPosition(element) {\n        let i = 0;\n        while (element = element.previousElementSibling)\n            i++;\n        return i;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const KeyCodes = {\n        ENTER: 13\n    };\n    const Table = (props) => {\n        return (createElement(\"table\", { className: props.className },\n            props.children,\n            props.rows.map((row, i) => (createElement(\"tr\", { className: props.rowClassName || '', onClick: e => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: e => {\n                    if (e.keyCode === KeyCodes.ENTER && props.onRowClick) {\n                        props.onRowClick(e, i);\n                    }\n                } }, row.cells.map((cell, i) => (createElement(\"td\", { className: cell.className || '', title: cell.title || '' }, cell.content))))))));\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var controls = /*#__PURE__*/Object.freeze({\n        Table: Table\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n\n    var types$1 = /*#__PURE__*/Object.freeze({\n\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * Create a new element as a child of another element.\n     * @param tagName Tag name of the new tag to create.\n     * @param parentElement Reference of the element to append to.\n     * @returns new HTMLElement.\n     */\n    function addEl(tagName, parentElement) {\n        const el = document.createElement(tagName);\n        parentElement.appendChild(el);\n        return el;\n    }\n    /**\n     * Create a new div HTMLElement as a child of another element.\n     * @param parentElement Reference of the element to append to.\n     * @param className Optional css class name to apply to the div.\n     */\n    function addDiv(parentElement, className) {\n        const div = addEl('div', parentElement);\n        if (className) {\n            div.className = className;\n        }\n        return div;\n    }\n    /**\n     * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n     * @param el HTML Element to measure.\n     */\n    function outerSize(el) {\n        const cs = getComputedStyle(el);\n        const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n        const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n        return { height, width };\n    }\n\n    var isMergeableObject = function isMergeableObject(value) {\n    \treturn isNonNullObject(value)\n    \t\t&& !isSpecial(value)\n    };\n\n    function isNonNullObject(value) {\n    \treturn !!value && typeof value === 'object'\n    }\n\n    function isSpecial(value) {\n    \tvar stringValue = Object.prototype.toString.call(value);\n\n    \treturn stringValue === '[object RegExp]'\n    \t\t|| stringValue === '[object Date]'\n    \t\t|| isReactElement(value)\n    }\n\n    // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n    var canUseSymbol = typeof Symbol === 'function' && Symbol.for;\n    var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\n    function isReactElement(value) {\n    \treturn value.$$typeof === REACT_ELEMENT_TYPE\n    }\n\n    function emptyTarget(val) {\n    \treturn Array.isArray(val) ? [] : {}\n    }\n\n    function cloneUnlessOtherwiseSpecified(value, options) {\n    \treturn (options.clone !== false && options.isMergeableObject(value))\n    \t\t? deepmerge(emptyTarget(value), value, options)\n    \t\t: value\n    }\n\n    function defaultArrayMerge(target, source, options) {\n    \treturn target.concat(source).map(function(element) {\n    \t\treturn cloneUnlessOtherwiseSpecified(element, options)\n    \t})\n    }\n\n    function mergeObject(target, source, options) {\n    \tvar destination = {};\n    \tif (options.isMergeableObject(target)) {\n    \t\tObject.keys(target).forEach(function(key) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    \t\t});\n    \t}\n    \tObject.keys(source).forEach(function(key) {\n    \t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    \t\t} else {\n    \t\t\tdestination[key] = deepmerge(target[key], source[key], options);\n    \t\t}\n    \t});\n    \treturn destination\n    }\n\n    function deepmerge(target, source, options) {\n    \toptions = options || {};\n    \toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    \toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n    \tvar sourceIsArray = Array.isArray(source);\n    \tvar targetIsArray = Array.isArray(target);\n    \tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n    \tif (!sourceAndTargetTypesMatch) {\n    \t\treturn cloneUnlessOtherwiseSpecified(source, options)\n    \t} else if (sourceIsArray) {\n    \t\treturn options.arrayMerge(target, source, options)\n    \t} else {\n    \t\treturn mergeObject(target, source, options)\n    \t}\n    }\n\n    deepmerge.all = function deepmergeAll(array, options) {\n    \tif (!Array.isArray(array)) {\n    \t\tthrow new Error('first argument should be an array')\n    \t}\n\n    \treturn array.reduce(function(prev, next) {\n    \t\treturn deepmerge(prev, next, options)\n    \t}, {})\n    };\n\n    var deepmerge_1 = deepmerge;\n\n    var _deepmerge = /*#__PURE__*/Object.freeze({\n        default: deepmerge_1\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const deepmerge$1 = (deepmerge_1 || _deepmerge);\n    function clone(objectToClone) {\n        if (!objectToClone)\n            return objectToClone;\n        return deepmerge$1.all([objectToClone]);\n    }\n    const dontMerge = (destination, source) => source;\n    function deepMerge(...objectsToMerge) {\n        const objects = objectsToMerge.filter(Boolean);\n        return deepmerge$1.all(objects, { arrayMerge: dontMerge });\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n        reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n        reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n        reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n        reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n        reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color, color, {\n      copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable: function() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb: function() {\n        return this;\n      },\n      displayable: function() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n    }\n\n    function rgb_formatRgb() {\n      var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n      return (a === 1 ? \"rgb(\" : \"rgba(\")\n          + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n          + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n\n    function hex(value) {\n      value = Math.max(0, Math.min(255, Math.round(value) || 0));\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl: function() {\n        var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\")\n            + (this.h || 0) + \", \"\n            + (this.s || 0) * 100 + \"%, \"\n            + (this.l || 0) * 100 + \"%\"\n            + (a === 1 ? \")\" : \", \" + a + \")\");\n      }\n    }));\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    var deg2rad = Math.PI / 180;\n    var rad2deg = 180 / Math.PI;\n\n    // https://observablehq.com/@mbostock/lab-and-rgb\n    var K = 18,\n        Xn = 0.96422,\n        Yn = 1,\n        Zn = 0.82521,\n        t0 = 4 / 29,\n        t1 = 6 / 29,\n        t2 = 3 * t1 * t1,\n        t3 = t1 * t1 * t1;\n\n    function labConvert(o) {\n      if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n      if (o instanceof Hcl) return hcl2lab(o);\n      if (!(o instanceof Rgb)) o = rgbConvert(o);\n      var r = rgb2lrgb(o.r),\n          g = rgb2lrgb(o.g),\n          b = rgb2lrgb(o.b),\n          y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n      if (r === g && g === b) x = z = y; else {\n        x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n        z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n      }\n      return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n    }\n\n    function lab(l, a, b, opacity) {\n      return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n    }\n\n    function Lab(l, a, b, opacity) {\n      this.l = +l;\n      this.a = +a;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Lab, lab, extend(Color, {\n      brighter: function(k) {\n        return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n      },\n      darker: function(k) {\n        return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n      },\n      rgb: function() {\n        var y = (this.l + 16) / 116,\n            x = isNaN(this.a) ? y : y + this.a / 500,\n            z = isNaN(this.b) ? y : y - this.b / 200;\n        x = Xn * lab2xyz(x);\n        y = Yn * lab2xyz(y);\n        z = Zn * lab2xyz(z);\n        return new Rgb(\n          lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n          lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n          lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n          this.opacity\n        );\n      }\n    }));\n\n    function xyz2lab(t) {\n      return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n    }\n\n    function lab2xyz(t) {\n      return t > t1 ? t * t * t : t2 * (t - t0);\n    }\n\n    function lrgb2rgb(x) {\n      return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n    }\n\n    function rgb2lrgb(x) {\n      return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n    }\n\n    function hclConvert(o) {\n      if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n      if (!(o instanceof Lab)) o = labConvert(o);\n      if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n      var h = Math.atan2(o.b, o.a) * rad2deg;\n      return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n    }\n\n    function hcl(h, c, l, opacity) {\n      return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hcl(h, c, l, opacity) {\n      this.h = +h;\n      this.c = +c;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    function hcl2lab(o) {\n      if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n      var h = o.h * deg2rad;\n      return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n    }\n\n    define(Hcl, hcl, extend(Color, {\n      brighter: function(k) {\n        return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n      },\n      darker: function(k) {\n        return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n      },\n      rgb: function() {\n        return hcl2lab(this).rgb();\n      }\n    }));\n\n    var A = -0.14861,\n        B = +1.78277,\n        C = -0.29227,\n        D = -0.90649,\n        E = +1.97294,\n        ED = E * D,\n        EB = E * B,\n        BC_DA = B * C - D * A;\n\n    function cubehelixConvert(o) {\n      if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Rgb)) o = rgbConvert(o);\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n          bl = b - l,\n          k = (E * (g - l) - C * bl) / D,\n          s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n          h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n      return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n    }\n\n    function cubehelix(h, s, l, opacity) {\n      return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Cubehelix(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Cubehelix, cubehelix, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb: function() {\n        var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n            l = +this.l,\n            a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n            cosh = Math.cos(h),\n            sinh = Math.sin(h);\n        return new Rgb(\n          255 * (l + a * (A * cosh + B * sinh)),\n          255 * (l + a * (C * cosh + D * sinh)),\n          255 * (l + a * (E * cosh)),\n          this.opacity\n        );\n      }\n    }));\n\n    function rgbToDeckglColor(c) {\n        return [c.r, c.g, c.b, c.opacity * 255];\n    }\n    /**\n     * Compares 2 colors to see if they are equal.\n     * @param a Color to compare\n     * @param b Color to compare\n     * @returns True if colors are equal.\n     */\n    function colorIsEqual(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    /**\n     * Convert a CSS color string to a Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n     * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n     */\n    function colorFromString(cssColorSpecifier) {\n        if (cssColorSpecifier) {\n            const dc = color(cssColorSpecifier);\n            if (dc) {\n                const c = dc.rgb();\n                return rgbToDeckglColor(c);\n            }\n        }\n    }\n    /**\n     * Convert a Deck.gl color to a CSS rgba() string.\n     * @param color A Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n     */\n    function colorToString(color$$1) {\n        const c = [...color$$1];\n        if (c.length > 3) {\n            c[3] /= 255;\n        }\n        return `rgba(${c.join(',')})`;\n    }\n    function desaturate(color$$1, value) {\n        const rgb$$1 = rgb(color$$1[0], color$$1[1], color$$1[2], color$$1[3] / 255);\n        const hslColor = hsl(rgb$$1);\n        hslColor.s = value;\n        const c = hslColor.rgb();\n        return rgbToDeckglColor(c);\n    }\n    function isColor(cssColorSpecifier) {\n        return !!color(cssColorSpecifier);\n    }\n\n    let vega = {\n        CanvasHandler: null,\n        inferType: null,\n        inferTypes: null,\n        loader: null,\n        parse: null,\n        read: null,\n        renderModule: null,\n        Renderer: null,\n        sceneVisit: null,\n        scheme: null,\n        View: null\n    };\n    let deck = {\n        CompositeLayer: null,\n        COORDINATE_SYSTEM: null,\n        Deck: null,\n        Layer: null,\n        LinearInterpolator: null,\n        OrbitView: null,\n        _OrbitController: null\n    };\n    let layers = {\n        IconLayer: null,\n        LineLayer: null,\n        PolygonLayer: null,\n        TextLayer: null\n    };\n    let luma = {\n        CubeGeometry: null,\n        fp64: null,\n        Model: null,\n        Texture2D: null\n    };\n    /**\n     * References to dependency libraries.\n     */\n    const base = {\n        deck,\n        layers,\n        luma,\n        vega\n    };\n    /**\n     * Specify the dependency libraries to use for rendering.\n     * @param vega Vega library.\n     * @param deck deck/core library.\n     * @param layers deck/layers library.\n     * @param luma luma.gl library.\n     */\n    function use(vega, deck, layers, luma) {\n        base.deck = deck;\n        base.layers = layers;\n        base.luma = luma;\n        base.vega = vega;\n    }\n\n    var tinySdf = TinySDF;\n    var default_1 = TinySDF;\n\n    var INF = 1e20;\n\n    function TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) {\n        this.fontSize = fontSize || 24;\n        this.buffer = buffer === undefined ? 3 : buffer;\n        this.cutoff = cutoff || 0.25;\n        this.fontFamily = fontFamily || 'sans-serif';\n        this.fontWeight = fontWeight || 'normal';\n        this.radius = radius || 8;\n        var size = this.size = this.fontSize + this.buffer * 2;\n\n        this.canvas = document.createElement('canvas');\n        this.canvas.width = this.canvas.height = size;\n\n        this.ctx = this.canvas.getContext('2d');\n        this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily;\n        this.ctx.textBaseline = 'middle';\n        this.ctx.fillStyle = 'black';\n\n        // temporary arrays for the distance transform\n        this.gridOuter = new Float64Array(size * size);\n        this.gridInner = new Float64Array(size * size);\n        this.f = new Float64Array(size);\n        this.d = new Float64Array(size);\n        this.z = new Float64Array(size + 1);\n        this.v = new Int16Array(size);\n\n        // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852\n        this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1));\n    }\n\n    TinySDF.prototype.draw = function (char) {\n        this.ctx.clearRect(0, 0, this.size, this.size);\n        this.ctx.fillText(char, this.buffer, this.middle);\n\n        var imgData = this.ctx.getImageData(0, 0, this.size, this.size);\n        var alphaChannel = new Uint8ClampedArray(this.size * this.size);\n\n        for (var i = 0; i < this.size * this.size; i++) {\n            var a = imgData.data[i * 4 + 3] / 255; // alpha value\n            this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2);\n            this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2);\n        }\n\n        edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z);\n        edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z);\n\n        for (i = 0; i < this.size * this.size; i++) {\n            var d = this.gridOuter[i] - this.gridInner[i];\n            alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff))));\n        }\n\n        return alphaChannel;\n    };\n\n    // 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\n    function edt(data, width, height, f, d, v, z) {\n        for (var x = 0; x < width; x++) {\n            for (var y = 0; y < height; y++) {\n                f[y] = data[y * width + x];\n            }\n            edt1d(f, d, v, z, height);\n            for (y = 0; y < height; y++) {\n                data[y * width + x] = d[y];\n            }\n        }\n        for (y = 0; y < height; y++) {\n            for (x = 0; x < width; x++) {\n                f[x] = data[y * width + x];\n            }\n            edt1d(f, d, v, z, width);\n            for (x = 0; x < width; x++) {\n                data[y * width + x] = Math.sqrt(d[x]);\n            }\n        }\n    }\n\n    // 1D squared distance transform\n    function edt1d(f, d, v, z, n) {\n        v[0] = 0;\n        z[0] = -INF;\n        z[1] = +INF;\n\n        for (var q = 1, k = 0; q < n; q++) {\n            var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n            while (s <= z[k]) {\n                k--;\n                s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n            }\n            k++;\n            v[k] = q;\n            z[k] = s;\n            z[k + 1] = +INF;\n        }\n\n        for (q = 0, k = 0; q < n; q++) {\n            while (z[k + 1] < q) k++;\n            d[q] = (q - v[k]) * (q - v[k]) + f[v[k]];\n        }\n    }\n    tinySdf.default = default_1;\n\n    //from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/font-atlas.js\n    const GL_TEXTURE_WRAP_S = 0x2802;\n    const GL_TEXTURE_WRAP_T = 0x2803;\n    const GL_CLAMP_TO_EDGE = 0x812f;\n    const MAX_CANVAS_WIDTH = 1024;\n    const BASELINE_SCALE = 0.9;\n    const HEIGHT_SCALE = 1.2;\n    function getDefaultCharacterSet() {\n        const charSet = [];\n        for (let i = 32; i < 128; i++) {\n            charSet.push(String.fromCharCode(i));\n        }\n        return charSet;\n    }\n    const DEFAULT_CHAR_SET = getDefaultCharacterSet();\n    const DEFAULT_FONT_FAMILY = 'Monaco, monospace';\n    const DEFAULT_FONT_WEIGHT = 'normal';\n    const DEFAULT_FONT_SETTINGS = {\n        fontSize: 64,\n        buffer: 2,\n        sdf: false,\n        cutoff: 0.25,\n        radius: 3\n    };\n    function populateAlphaChannel(alphaChannel, imageData) {\n        // populate distance value from tinySDF to image alpha channel\t\n        for (let i = 0; i < alphaChannel.length; i++) {\n            imageData.data[4 * i + 3] = alphaChannel[i];\n        }\n    }\n    function setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n        ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n        ctx.fillStyle = '#000';\n        ctx.textBaseline = 'alphabetic';\n        ctx.textAlign = 'left';\n    }\n    function buildMapping({ ctx, fontHeight, buffer, characterSet, maxCanvasWidth }) {\n        const mapping = {};\n        let row = 0;\n        let x = 0;\n        Array.from(characterSet).forEach(char => {\n            // measure texts\n            // TODO - use Advanced text metrics when they are adopted:\n            // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n            const { width } = ctx.measureText(char);\n            if (x + width + buffer * 2 > maxCanvasWidth) {\n                x = 0;\n                row++;\n            }\n            mapping[char] = {\n                x: x + buffer,\n                y: row * (fontHeight + buffer * 2) + buffer,\n                width,\n                height: fontHeight,\n                mask: true\n            };\n            x += width + buffer * 2;\n        });\n        const canvasHeight = (row + 1) * (fontHeight + buffer * 2);\n        return { mapping, canvasHeight };\n    }\n    function makeFontAtlas(gl, fontSettings) {\n        const mergedFontSettings = Object.assign({\n            fontFamily: DEFAULT_FONT_FAMILY,\n            fontWeight: DEFAULT_FONT_WEIGHT,\n            characterSet: DEFAULT_CHAR_SET\n        }, DEFAULT_FONT_SETTINGS, fontSettings);\n        const { fontFamily, fontWeight, characterSet, fontSize, buffer, sdf, radius, cutoff } = mergedFontSettings;\n        const canvas = document.createElement('canvas');\n        const ctx = canvas.getContext('2d');\n        // build mapping\n        setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n        const fontHeight = fontSize * HEIGHT_SCALE;\n        const { canvasHeight, mapping } = buildMapping({\n            ctx,\n            fontHeight,\n            buffer,\n            characterSet,\n            maxCanvasWidth: MAX_CANVAS_WIDTH\n        });\n        canvas.width = MAX_CANVAS_WIDTH;\n        canvas.height = canvasHeight;\n        setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n        // layout characters\n        if (sdf) {\n            const tinySDF = new tinySdf(fontSize, buffer, radius, cutoff, fontFamily, fontWeight);\n            // used to store distance values from tinySDF\t\n            const imageData = ctx.createImageData(tinySDF.size, tinySDF.size);\n            for (const char of characterSet) {\n                populateAlphaChannel(tinySDF.draw(char), imageData);\n                ctx.putImageData(imageData, mapping[char].x - buffer, mapping[char].y - buffer);\n            }\n        }\n        else {\n            for (const char of characterSet) {\n                ctx.fillText(char, mapping[char].x, mapping[char].y + fontSize * BASELINE_SCALE);\n            }\n        }\n        return {\n            scale: HEIGHT_SCALE,\n            mapping,\n            texture: new base.luma.Texture2D(gl, {\n                pixels: canvas,\n                // padding is added only between the characters but not for borders\n                // enforce CLAMP_TO_EDGE to avoid any artifacts.\n                parameters: {\n                    [GL_TEXTURE_WRAP_S]: GL_CLAMP_TO_EDGE,\n                    [GL_TEXTURE_WRAP_T]: GL_CLAMP_TO_EDGE\n                }\n            })\n        };\n    }\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    //adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-fragment.glsl.js\n    var fs = `\\\n#define SHADER_NAME multi-icon-layer-fragment-shader\n\nprecision highp float;\n\nuniform sampler2D iconsTexture;\nuniform float buffer;\nuniform bool sdf;\n\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nconst float MIN_ALPHA = 0.05;\n\nvoid main(void) {\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\n  \n  float alpha = texColor.a;\n\n  // if enable sdf (signed distance fields)\t\n  if (sdf) {\t\n    float distance = texture2D(iconsTexture, vTextureCoords).a;\t\n    alpha = smoothstep(buffer - vGamma, buffer + vGamma, distance);\t\n  }\n\n  // Take the global opacity and the alpha from vColor into account for the alpha component\n  float a = alpha * vColor.a;\n\n  if (picking_uActive) {\n\n    // use picking color for entire rectangle\n    gl_FragColor = vec4(picking_vRGBcolor_Aselected.rgb, 1.0);\n  \n  } else {\n\n    if (a < MIN_ALPHA) {\n      discard;\n    } else {\n\n      gl_FragColor = vec4(vColor.rgb, a);\n\n      // use highlight color if this fragment belongs to the selected object.\n      bool selected = bool(picking_vRGBcolor_Aselected.a);\n      if (selected) {\n        gl_FragColor = vec4(vHighlightColor.rgb, a);\n      }\n    }\n  }\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    //adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-vertex.glsl.js\n    var vs = `\\\n#define SHADER_NAME multi-icon-layer-vertex-shader\n\nattribute vec2 positions;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute float instanceSizes;\nattribute float instanceAngles;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\nattribute vec4 instanceIconFrames;\nattribute float instanceColorModes;\nattribute vec2 instanceOffsets;\n\n// the following three attributes are for the multi-icon layer\nattribute vec2 instancePixelOffset;\nattribute vec4 instanceHighlightColors;\n\nuniform float sizeScale;\nuniform vec2 iconsTextureDim;\nuniform float gamma;\nuniform float opacity;\n\nvarying float vColorMode;\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nvec2 rotate_by_angle(vec2 vertex, float angle) {\n  float angle_radian = angle * PI / 180.0;\n  float cos_angle = cos(angle_radian);\n  float sin_angle = sin(angle_radian);\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\n  return rotationMatrix * vertex;\n}\n\nvoid main(void) {\n  vec2 iconSize = instanceIconFrames.zw;\n  // scale icon height to match instanceSize\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : instanceSizes / iconSize.y;\n\n  // scale and rotate vertex in \"pixel\" value and convert back to fraction in clipspace\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\n\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * sizeScale * instanceScale;\n  pixelOffset += instancePixelOffset;\n  pixelOffset.y *= -1.0;\n\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.0));\n  gl_Position += project_pixel_to_clipspace(pixelOffset);\n\n  vTextureCoords = mix(\n    instanceIconFrames.xy,\n    instanceIconFrames.xy + iconSize,\n    (positions.xy + 1.0) / 2.0\n  ) / iconsTextureDim;\n\n  vTextureCoords.y = 1.0 - vTextureCoords.y;\n\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\n  vHighlightColor = vec4(instanceHighlightColors.rgb, instanceHighlightColors.a * opacity) / 255.;\n\n  picking_setPickingColor(instancePickingColors);\n\n  vGamma = gamma / (sizeScale * iconSize.y);\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    // TODO expose as layer properties\n    const DEFAULT_GAMMA = 0.2;\n    const DEFAULT_BUFFER = 192.0 / 256;\n    const defaultProps = {\n        getShiftInQueue: { type: 'accessor', value: x => x.shift || 0 },\n        getLengthOfQueue: { type: 'accessor', value: x => x.len || 1 },\n        // 1: left, 0: middle, -1: right\n        getAnchorX: { type: 'accessor', value: x => x.anchorX || 0 },\n        // 1: top, 0: center, -1: bottom\n        getAnchorY: { type: 'accessor', value: x => x.anchorY || 0 },\n        getPixelOffset: { type: 'accessor', value: [0, 0] },\n        // object with the same pickingIndex will be picked when any one of them is being picked\n        getPickingIndex: { type: 'accessor', value: x => x.objectIndex }\n    };\n    //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n    const UNSIGNED_BYTE = 0x1401;\n    function _MultiIconLayer(...props) {\n        class __MultiIconLayer extends base.layers.IconLayer {\n            constructor(...props) {\n                super(...arguments);\n            }\n            getShaders() {\n                return Object.assign({}, super.getShaders(), {\n                    vs,\n                    fs\n                });\n            }\n            initializeState() {\n                super.initializeState();\n                const attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePixelOffset: {\n                        size: 2,\n                        transition: true,\n                        accessor: 'getPixelOffset'\n                    },\n                    instanceHighlightColors: {\n                        size: 4,\n                        type: UNSIGNED_BYTE,\n                        transition: true,\n                        accessor: 'getHighlightColor',\n                        defaultValue: [0, 255, 0, 255]\n                    }\n                });\n            }\n            updateState(updateParams) {\n                super.updateState(updateParams);\n                const { changeFlags } = updateParams;\n                if (changeFlags.updateTriggersChanged &&\n                    (changeFlags.updateTriggersChanged.getAnchorX || changeFlags.updateTriggersChanged.getAnchorY)) {\n                    this.getAttributeManager().invalidate('instanceOffsets');\n                }\n            }\n            draw({ uniforms }) {\n                const { sdf } = this.props;\n                super.draw({\n                    uniforms: Object.assign({}, uniforms, {\n                        // Refer the following doc about gamma and buffer\n                        // https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817\n                        buffer: DEFAULT_BUFFER,\n                        gamma: DEFAULT_GAMMA,\n                        sdf: Boolean(sdf)\n                    })\n                });\n            }\n            calculateInstanceOffsets(attribute) {\n                const { data, iconMapping, getIcon, getAnchorX, getAnchorY, getLengthOfQueue, getShiftInQueue } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                for (const object of data) {\n                    const icon = getIcon(object);\n                    const rect = iconMapping[icon] || {};\n                    const len = getLengthOfQueue(object);\n                    const shiftX = getShiftInQueue(object);\n                    value[i++] = ((getAnchorX(object) - 1) * len) / 2 + rect.width / 2 + shiftX || 0;\n                    value[i++] = (rect.height / 2) * getAnchorY(object) || 0;\n                }\n            }\n            calculateInstancePickingColors(attribute) {\n                const { data, getPickingIndex } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                const pickingColor = [];\n                for (const point of data) {\n                    const index = getPickingIndex(point);\n                    this.encodePickingColor(index, pickingColor);\n                    value[i++] = pickingColor[0];\n                    value[i++] = pickingColor[1];\n                    value[i++] = pickingColor[2];\n                }\n            }\n        }\n        __MultiIconLayer.layerName = 'MultiIconLayer';\n        __MultiIconLayer.defaultProps = defaultProps;\n        const instance = new __MultiIconLayer(...arguments);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * CubeLayer - a Deck.gl layer to render cuboids.\n     * This is instantiatable by calling `new MultiIconLayer()`.\n     */\n    const MultiIconLayer = _MultiIconLayer;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    const TEXT_ANCHOR = {\n        start: 1,\n        middle: 0,\n        end: -1\n    };\n    const ALIGNMENT_BASELINE = {\n        top: 1,\n        center: 0,\n        bottom: -1\n    };\n    const DEFAULT_COLOR = [0, 0, 0, 255];\n    const MISSING_CHAR_WIDTH = 32;\n    const FONT_SETTINGS_PROPS = ['fontSize', 'buffer', 'sdf', 'radius', 'cutoff'];\n    const defaultProps$1 = {\n        fp64: false,\n        sizeScale: 1,\n        characterSet: DEFAULT_CHAR_SET,\n        fontFamily: DEFAULT_FONT_FAMILY,\n        fontWeight: DEFAULT_FONT_WEIGHT,\n        fontSettings: {},\n        getText: { type: 'accessor', value: x => x.text },\n        getPosition: { type: 'accessor', value: x => x.position },\n        getColor: { type: 'accessor', value: DEFAULT_COLOR },\n        getSize: { type: 'accessor', value: 32 },\n        getAngle: { type: 'accessor', value: 0 },\n        getHighlightColor: { type: 'accessor', value: DEFAULT_COLOR },\n        getTextAnchor: { type: 'accessor', value: 'middle' },\n        getAlignmentBaseline: { type: 'accessor', value: 'center' },\n        getPixelOffset: { type: 'accessor', value: [0, 0] }\n    };\n    function _ChromaticTextLayer(props) {\n        class __ChromaticTextLayer extends base.deck.CompositeLayer {\n            updateState({ props, oldProps, changeFlags }) {\n                const fontChanged = this.fontChanged(oldProps, props);\n                if (fontChanged) {\n                    this.updateFontAtlas();\n                }\n                if (changeFlags.dataChanged ||\n                    fontChanged ||\n                    (changeFlags.updateTriggersChanged &&\n                        (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText))) {\n                    this.transformStringToLetters();\n                }\n            }\n            updateFontAtlas() {\n                const { gl } = this.context;\n                const { fontSettings, fontFamily, fontWeight, characterSet } = this.props;\n                const mergedFontSettings = Object.assign({}, DEFAULT_FONT_SETTINGS, fontSettings, {\n                    fontFamily,\n                    fontWeight,\n                    characterSet\n                });\n                const { scale, mapping, texture } = makeFontAtlas(gl, mergedFontSettings);\n                this.setState({\n                    scale,\n                    iconAtlas: texture,\n                    iconMapping: mapping\n                });\n            }\n            fontChanged(oldProps, props) {\n                if (oldProps.fontFamily !== props.fontFamily ||\n                    oldProps.characterSet !== props.characterSet ||\n                    oldProps.fontWeight !== props.fontWeight) {\n                    return true;\n                }\n                if (oldProps.fontSettings === props.fontSettings) {\n                    return false;\n                }\n                const oldFontSettings = oldProps.fontSettings || {};\n                const fontSettings = props.fontSettings || {};\n                return FONT_SETTINGS_PROPS.some(prop => oldFontSettings[prop] !== fontSettings[prop]);\n            }\n            getPickingInfo({ info }) {\n                // because `TextLayer` assign the same pickingInfoIndex for one text label,\n                // here info.index refers the index of text label in props.data\n                return Object.assign(info, {\n                    // override object with original data\n                    object: info.index >= 0 ? this.props.data[info.index] : null\n                });\n            }\n            /* eslint-disable no-loop-func */\n            transformStringToLetters() {\n                const { data, getText } = this.props;\n                const { iconMapping } = this.state;\n                const transformedData = [];\n                let objectIndex = 0;\n                for (const val of data) {\n                    const text = getText(val);\n                    if (text) {\n                        const letters = Array.from(text);\n                        const offsets = [0];\n                        let offsetLeft = 0;\n                        letters.forEach((letter, i) => {\n                            const datum = {\n                                text: letter,\n                                index: i,\n                                offsets,\n                                len: text.length,\n                                // reference of original object and object index\n                                object: val,\n                                objectIndex\n                            };\n                            const frame = iconMapping[letter];\n                            if (frame) {\n                                offsetLeft += frame.width;\n                            }\n                            else {\n                                //log.warn(`Missing character: ${letter}`)();\n                                offsetLeft += MISSING_CHAR_WIDTH;\n                            }\n                            offsets.push(offsetLeft);\n                            transformedData.push(datum);\n                        });\n                    }\n                    objectIndex++;\n                }\n                this.setState({ data: transformedData });\n            }\n            /* eslint-enable no-loop-func */\n            getLetterOffset(datum) {\n                return datum.offsets[datum.index];\n            }\n            getTextLength(datum) {\n                return datum.offsets[datum.offsets.length - 1];\n            }\n            _getAccessor(accessor) {\n                if (typeof accessor === 'function') {\n                    return x => accessor(x.object);\n                }\n                return accessor;\n            }\n            getAnchorXFromTextAnchor(getTextAnchor) {\n                return x => {\n                    const textAnchor = typeof getTextAnchor === 'function' ? getTextAnchor(x.object) : getTextAnchor;\n                    if (!TEXT_ANCHOR.hasOwnProperty(textAnchor)) {\n                        throw new Error(`Invalid text anchor parameter: ${textAnchor}`);\n                    }\n                    return TEXT_ANCHOR[textAnchor];\n                };\n            }\n            getAnchorYFromAlignmentBaseline(getAlignmentBaseline) {\n                return x => {\n                    const alignmentBaseline = typeof getAlignmentBaseline === 'function'\n                        ? getAlignmentBaseline(x.object)\n                        : getAlignmentBaseline;\n                    if (!ALIGNMENT_BASELINE.hasOwnProperty(alignmentBaseline)) {\n                        throw new Error(`Invalid alignment baseline parameter: ${alignmentBaseline}`);\n                    }\n                    return ALIGNMENT_BASELINE[alignmentBaseline];\n                };\n            }\n            renderLayers() {\n                const { data, scale, iconAtlas, iconMapping } = this.state;\n                const { getPosition, getColor, getSize, getAngle, getHighlightColor, getTextAnchor, getAlignmentBaseline, getPixelOffset, fp64, sdf, sizeScale, transitions, updateTriggers } = this.props;\n                const SubLayerClass = this.getSubLayerClass('characters', MultiIconLayer);\n                return new SubLayerClass({\n                    sdf,\n                    iconAtlas,\n                    iconMapping,\n                    getPosition: d => getPosition(d.object),\n                    getColor: this._getAccessor(getColor),\n                    getSize: this._getAccessor(getSize),\n                    getAngle: this._getAccessor(getAngle),\n                    getHighlightColor: this._getAccessor(getHighlightColor),\n                    getAnchorX: this.getAnchorXFromTextAnchor(getTextAnchor),\n                    getAnchorY: this.getAnchorYFromAlignmentBaseline(getAlignmentBaseline),\n                    getPixelOffset: this._getAccessor(getPixelOffset),\n                    fp64,\n                    sizeScale: sizeScale * scale,\n                    transitions: transitions && {\n                        getPosition: transitions.getPosition,\n                        getAngle: transitions.getAngle,\n                        getHighlightColor: transitions.getHighlightColor,\n                        getColor: transitions.getColor,\n                        getSize: transitions.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset\n                    }\n                }, this.getSubLayerProps({\n                    id: 'characters',\n                    updateTriggers: {\n                        getPosition: updateTriggers.getPosition,\n                        getAngle: updateTriggers.getAngle,\n                        getHighlightColor: updateTriggers.getHighlightColor,\n                        getColor: updateTriggers.getColor,\n                        getSize: updateTriggers.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset,\n                        getAnchorX: updateTriggers.getTextAnchor,\n                        getAnchorY: updateTriggers.getAlignmentBaseline\n                    }\n                }), {\n                    data,\n                    getIcon: d => d.text,\n                    getShiftInQueue: d => this.getLetterOffset(d),\n                    getLengthOfQueue: d => this.getTextLength(d)\n                });\n            }\n        }\n        __ChromaticTextLayer.layerName = 'TextLayer';\n        __ChromaticTextLayer.defaultProps = defaultProps$1;\n        const instance = new __ChromaticTextLayer(props);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * TextLayer - a modification of deck.gl's TextLayer.\n     * This is instantiatable by calling `new TextLayer()`.\n     */\n    const ChromaticTextLayer = _ChromaticTextLayer;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    function concat(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []);\n    }\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    var fs$1 = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n\n    const minHeight = '100px';\n    const minWidth = '100px';\n    const lightSettings = {\n        '2d': {},\n        '3d': {\n            lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n            ambientRatio: 0.3,\n            diffuseRatio: 0.6,\n            specularRatio: 0.4,\n            lightsStrength: [0.3, 0.0, 0.8, 0.0],\n            numberOfLights: 2\n        }\n    };\n    const defaultPresenterStyle = {\n        cssPrefix: 'vega-deckgl-',\n        defaultCubeColor: [128, 128, 128, 255],\n        highlightColor: [0, 0, 0, 255],\n        lightSettings\n    };\n    const defaultPresenterConfig = {\n        onCubeClick: (e, cube) => { },\n        onCubeHover: (e, cube) => { },\n        transitionDurations: {\n            color: 100,\n            position: 600,\n            size: 600,\n            view: 600\n        }\n    };\n    function createStage(view) {\n        const stage = {\n            view,\n            cubeData: [],\n            axes: {\n                x: [],\n                y: []\n            },\n            gridLines: [],\n            textData: [],\n            legend: {\n                rows: {}\n            },\n            facets: []\n        };\n        return stage;\n    }\n    const groupStrokeWidth = 1;\n    const lineZ = -1;\n    const defaultView = '2d';\n    const min3dDepth = 0.05;\n    const minPixelSize = 0.5;\n\n    var defaults = /*#__PURE__*/Object.freeze({\n        minHeight: minHeight,\n        minWidth: minWidth,\n        defaultPresenterStyle: defaultPresenterStyle,\n        defaultPresenterConfig: defaultPresenterConfig,\n        createStage: createStage,\n        groupStrokeWidth: groupStrokeWidth,\n        lineZ: lineZ,\n        defaultView: defaultView,\n        min3dDepth: min3dDepth,\n        minPixelSize: minPixelSize\n    });\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    var vs$1 = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_scale(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_scale(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_scale(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, offset, position_worldspace);\n\n  float lightWeight = 1.0;\n  \n  //allow for a small amount of error around the min3dDepth \n  if (instanceSizes.z >= ${min3dDepth.toFixed(4)} - 0.0001) {\n    lightWeight = lighting_getLightWeight(\n      position_worldspace.xyz, // the w component is always 1.0\n      normals\n    );\n  }\n\n  vec3 lightWeightedColor = lightWeight * instanceColors.rgb;\n  vec3 mixedLight = mix(instanceColors.rgb, lightWeightedColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n    const UNSIGNED_BYTE$1 = 0x1401;\n    const DEFAULT_COLOR$1 = [255, 0, 255, 255];\n    const defaultProps$2 = {\n        lightingMix: 0.5,\n        fp64: false,\n        getSize: x => x.size,\n        getPosition: x => x.position,\n        getColor: x => x.color\n    };\n    function _CubeLayer(props) {\n        //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n        class __CubeLayer extends base.deck.Layer {\n            getShaders() {\n                const projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n                return { vs: vs$1, fs: fs$1, modules: [projectModule, 'lighting', 'picking'] };\n            }\n            initializeState() {\n                const attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        transition: true,\n                        accessor: 'getPosition'\n                    },\n                    instancePositions64xyLow: {\n                        size: 3,\n                        accessor: 'getPosition',\n                        update: this.calculateInstancePositions64xyLow\n                    },\n                    instanceSizes: {\n                        size: 3,\n                        transition: true,\n                        accessor: 'getSize'\n                    },\n                    instanceColors: {\n                        size: 4,\n                        type: UNSIGNED_BYTE$1,\n                        transition: true,\n                        accessor: 'getColor',\n                        defaultValue: DEFAULT_COLOR$1\n                    }\n                });\n            }\n            updateState({ props, oldProps, changeFlags }) {\n                super.updateState({ props, oldProps, changeFlags }); //TODO add parameter type to deck.gl-typings\n                // Re-generate model if geometry changed\n                if (props.fp64 !== oldProps.fp64) {\n                    const { gl } = this.context;\n                    if (this.state.model) {\n                        this.state.model.delete();\n                    }\n                    this.setState({ model: this._getModel(gl) });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n            _getModel(gl) {\n                return new base.luma.Model(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new base.luma.CubeGeometry(),\n                    isInstanced: true,\n                    shaderCache: this.context.shaderCache\n                }));\n            }\n            draw({ uniforms }) {\n                let { lightingMix } = this.props;\n                if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n                    lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n                }\n                this.state.model.render(Object.assign({}, uniforms, {\n                    lightingMix\n                }));\n            }\n            calculateInstancePositions64xyLow(attribute) {\n                const isFP64 = this.use64bitPositions();\n                attribute.constant = !isFP64;\n                if (!isFP64) {\n                    attribute.value = new Float32Array(2);\n                    return;\n                }\n                const { data, getPosition } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                for (const point of data) {\n                    const position = getPosition(point);\n                    value[i++] = base.luma.fp64.fp64LowPart(position[0]);\n                    value[i++] = base.luma.fp64.fp64LowPart(position[1]);\n                }\n            }\n        }\n        __CubeLayer.layerName = 'CubeLayer';\n        __CubeLayer.defaultProps = defaultProps$2;\n        const instance = new __CubeLayer(props);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * CubeLayer - a Deck.gl layer to render cuboids.\n     * This is instantiatable by calling `new CubeLayer()`.\n     */\n    const CubeLayer = _CubeLayer;\n\n    var pi = Math.PI;\n\n    function expInOut(t) {\n      return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n    }\n\n    var tau = 2 * Math.PI;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getLayers(presenter, config, stage, lightSettings, lightingMix, interpolator, guideLines) {\n        const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n        const { x, y } = stage.axes;\n        const lines = concat(stage.gridLines, guideLines);\n        const texts = [...stage.textData];\n        [x, y].forEach(axes => {\n            axes.forEach(axis => {\n                if (axis.domain)\n                    lines.push(axis.domain);\n                if (axis.ticks)\n                    lines.push.apply(lines, axis.ticks);\n                if (axis.tickText)\n                    texts.push.apply(texts, axis.tickText);\n                if (axis.title)\n                    texts.push(axis.title);\n            });\n        });\n        if (stage.facets) {\n            stage.facets.forEach(f => {\n                if (f.lines)\n                    lines.push.apply(lines, f.lines);\n                if (f.facetTitle)\n                    texts.push(f.facetTitle);\n            });\n        }\n        const lineLayer = newLineLayer(layerNames.lines, lines);\n        const textLayer = newTextLayer(presenter, layerNames.text, texts, config, presenter.style.fontFamily);\n        return [textLayer, cubeLayer, lineLayer];\n    }\n    function newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings, lightingMix, interpolator) {\n        const getPosition = getTiming(config.transitionDurations.position, expInOut);\n        const getSize = getTiming(config.transitionDurations.size, expInOut);\n        const getColor = getTiming(config.transitionDurations.color);\n        const cubeLayerProps = {\n            interpolator,\n            lightingMix,\n            id: layerNames.cubes,\n            data: cubeData,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            pickable: true,\n            autoHighlight: true,\n            highlightColor,\n            onClick: (o, e) => {\n                config.onCubeClick(e && e.srcEvent, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onCube = false;\n                    config.onCubeHover(e && e.srcEvent, null);\n                }\n                else {\n                    presenter.deckgl.interactiveState.onCube = true;\n                    config.onCubeHover(e && e.srcEvent, o.object);\n                }\n            },\n            lightSettings,\n            transitions: {\n                getPosition,\n                getColor,\n                getSize\n            }\n        };\n        return new CubeLayer(cubeLayerProps);\n    }\n    function newLineLayer(id, data) {\n        return new base.layers.LineLayer({\n            id,\n            data,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            getColor: (o) => o.color,\n            getStrokeWidth: (o) => o.strokeWidth\n        });\n    }\n    function newTextLayer(presenter, id, data, config, fontFamily) {\n        const props = {\n            id,\n            data,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            autoHighlight: true,\n            pickable: true,\n            getHighlightColor: config.getTextHighlightColor || (o => o.color),\n            onClick: (o, e) => {\n                let pe = e && e.srcEvent;\n                //handle iOS event\n                if (e.center) {\n                    pe = { clientX: e.center.x, clientY: e.center.y };\n                }\n                config.onTextClick && config.onTextClick(pe, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onText = false;\n                }\n                else {\n                    presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n                }\n            },\n            getColor: config.getTextColor || (o => o.color),\n            getTextAnchor: o => o.textAnchor,\n            getSize: o => o.size,\n            getAngle: o => o.angle,\n            fontSettings: {\n                sdf: true,\n                fontSize: 128,\n                buffer: 3\n            }\n        };\n        if (fontFamily) {\n            props.fontFamily = fontFamily;\n        }\n        return new ChromaticTextLayer(props);\n    }\n    function getTiming(duration, easing) {\n        let timing;\n        if (duration) {\n            timing = {\n                duration\n            };\n            if (easing) {\n                timing.easing = easing;\n            }\n        }\n        return timing;\n    }\n    function getCubeLayer(deckProps) {\n        return deckProps.layers.filter(layer => layer.id === layerNames.cubes)[0];\n    }\n    function getCubes(deckProps) {\n        const cubeLayer = getCubeLayer(deckProps);\n        if (!cubeLayer)\n            return;\n        const cubeLayerProps = cubeLayer.props;\n        return cubeLayerProps.data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var util = /*#__PURE__*/Object.freeze({\n        addDiv: addDiv,\n        addEl: addEl,\n        clone: clone,\n        colorFromString: colorFromString,\n        colorIsEqual: colorIsEqual,\n        colorToString: colorToString,\n        deepMerge: deepMerge,\n        desaturate: desaturate,\n        isColor: isColor,\n        getCubeLayer: getCubeLayer,\n        getCubes: getCubes,\n        outerSize: outerSize\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const markStager = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            var x1, y1, x2, y2;\n            x1 = item.x || 0;\n            y1 = item.y || 0;\n            x2 = item.x2 != null ? item.x2 : x1;\n            y2 = item.y2 != null ? item.y2 : y1;\n            const lineItem = styledLine(x1 + x - options.offsetX, y1 + y - options.offsetY, x2 + x - options.offsetX, y2 + y - options.offsetY, item.stroke, item.strokeWidth);\n            if (item.mark.role === 'axis-tick') {\n                options.currAxis.ticks.push(lineItem);\n            }\n            else if (item.mark.role === 'axis-domain') {\n                options.currAxis.domain = lineItem;\n            }\n            else {\n                stage.gridLines.push(lineItem);\n            }\n        });\n    };\n    function styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n        const line = {\n            sourcePosition: [x1, -y1, lineZ],\n            targetPosition: [x2, -y2, lineZ],\n            color: colorFromString(stroke),\n            strokeWidth: strokeWidth * 10 //translate width to deck.gl\n        };\n        return line;\n    }\n    function box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n        const lines = [\n            styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n            styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n            styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n            styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)\n        ];\n        if (diagonals) {\n            lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n            lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n        }\n        return lines;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * HTML elements outputted by the presenter.\n     */\n    var PresenterElement;\n    (function (PresenterElement) {\n        PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n        PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n        PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n        PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n        PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n    })(PresenterElement || (PresenterElement = {}));\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function initializePanel(presenter) {\n        const rootDiv = (createElement(\"div\", { className: className(PresenterElement.root, presenter) },\n            createElement(\"div\", { className: className(PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n            createElement(\"div\", { className: className(PresenterElement.panel, presenter) },\n                createElement(\"div\", { className: className(PresenterElement.vegaControls, presenter) }),\n                createElement(\"div\", { className: className(PresenterElement.legend, presenter) }))));\n        mount(rootDiv, presenter.el);\n    }\n    function className(type, presenter) {\n        return `${presenter.style.cssPrefix}${PresenterElement[type]}`;\n    }\n\n    function createOrbitControllerClass(factoryOptions) {\n        function wrapper(props) {\n            class OrbitControllerInternal extends base.deck._OrbitController {\n                constructor(props) {\n                    super(props);\n                    this.invertPan = true;\n                }\n                _onDoubleTap(event) {\n                    if (factoryOptions && factoryOptions.doubleClickHandler) {\n                        factoryOptions.doubleClickHandler(event, this);\n                    }\n                    else {\n                        super._onDoubleTap(event);\n                    }\n                }\n                _onPanRotate(event) {\n                    if (!this.dragRotate) {\n                        return false;\n                    }\n                    return this._onPanRotateStandard(event);\n                }\n            }\n            const instance = new OrbitControllerInternal(props);\n            return instance;\n        }\n        return wrapper;\n    }\n\n    //adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\n    const CANVAS_STYLE = {\n        position: 'absolute',\n        left: 0,\n        top: 0,\n        width: '100%',\n        height: '100%'\n    };\n    // Create canvas elements for map and deck\n    function createCanvas(props) {\n        let { container = document.body } = props;\n        if (typeof container === 'string') {\n            container = document.getElementById(container);\n        }\n        if (!container) {\n            throw Error('Deck: container not found');\n        }\n        // Add DOM elements\n        const containerStyle = window.getComputedStyle(container);\n        if (containerStyle.position === 'static') {\n            container.style.position = 'relative';\n        }\n        const deckCanvas = document.createElement('canvas');\n        container.appendChild(deckCanvas);\n        Object.assign(deckCanvas.style, CANVAS_STYLE);\n        return { container, deckCanvas };\n    }\n    /**\n     * Creates Deck.gl classes for rendering WebGL.\n     * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n     */\n    function createDeckGLClassesForPresenter(factoryOptions) {\n        const OrbitControllerClass = createOrbitControllerClass(factoryOptions);\n        //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n        //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n        function wrapper(props) {\n            /**\n             * @params container (Element) - DOM element to add deck.gl canvas to\n             * @params controller (Object) - Controller class. Leave empty for auto detection\n             */\n            class DeckGLInternal extends base.deck.Deck {\n                constructor(props = {}) {\n                    if (typeof document === 'undefined') {\n                        // Not browser\n                        throw Error('Deck can only be used in the browser');\n                    }\n                    const { deckCanvas } = createCanvas(props);\n                    const viewState = props.initialViewState || props.viewState || {};\n                    super(Object.assign({}, props, {\n                        width: '100%',\n                        height: '100%',\n                        canvas: deckCanvas,\n                        controller: OrbitControllerClass,\n                        initialViewState: viewState\n                    }));\n                    // Callback for the controller\n                    this._updateViewState = params => {\n                        if (this.onViewStateChange) {\n                            this.onViewStateChange(params);\n                        }\n                    };\n                }\n                setProps(props) {\n                    // this._updateViewState must be bound to `this`\n                    // but we don't have access to the current instance before calling super().\n                    if ('onViewStateChange' in props && this._updateViewState) {\n                        // This is called at least once at _onRendererInitialized\n                        this.onViewStateChange = props.onViewStateChange;\n                        props.onViewStateChange = this._updateViewState;\n                    }\n                    super.setProps(props);\n                }\n            }\n            const instance = new DeckGLInternal(props);\n            return instance;\n        }\n        return {\n            OrbitControllerClass,\n            DeckGL_Class: wrapper\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const LegendView = (props) => {\n        const rows = [];\n        const addRow = (row, i) => {\n            const fn = symbolMap[row.symbol.shape];\n            let jsx;\n            if (fn) {\n                jsx = fn(row.symbol);\n            }\n            else {\n                jsx = createElement(\"span\", null, \"x\");\n                //console.log(`need to render ${row.symbol.shape} symbol shape`);\n            }\n            rows.push({\n                cells: [\n                    { className: 'symbol', content: jsx },\n                    { className: 'label', content: row.label, title: row.label }\n                ]\n            });\n        };\n        var sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n        sorted.forEach(i => addRow(props.legend.rows[i], +i));\n        if (sorted.length) {\n            return (createElement(Table, { rows: rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\"tr\", { onClick: e => props.onClick(e, props.legend, null) },\n                createElement(\"th\", { colSpan: 2 }, props.legend.title))));\n        }\n    };\n    const symbolMap = {\n        square: function (symbol) {\n            return (createElement(\"div\", { style: {\n                    height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                    width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                    backgroundColor: symbol.fill,\n                    borderColor: symbol.fill\n                } }));\n        }\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function wrapper(props) {\n        class LinearInterpolatorInternal extends base.deck.LinearInterpolator {\n            constructor(transitionProps) {\n                super(transitionProps);\n            }\n            interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n                if (this.layerStartProps && this.layerEndProps) {\n                    this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n                }\n                return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n            }\n        }\n        const instance = new LinearInterpolatorInternal(props);\n        return instance;\n    }\n    const LinearInterpolator = wrapper;\n\n    function patchCubeArray(allocatedSize, empty, cubes) {\n        const patched = new Array(allocatedSize);\n        patched.fill(empty);\n        cubes.forEach(cube => patched[cube.ordinal] = cube);\n        return patched;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const legendMap = {\n        'legend-title': function (legend, textItem) {\n            legend.title = textItem.text;\n        },\n        'legend-symbol': function (legend, symbol) {\n            const { bounds, fill, shape } = symbol;\n            //this object is safe for serialization\n            const legendRowSymbol = { bounds, fill, shape };\n            const i = symbol.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            legend.rows[i].symbol = legendRowSymbol;\n        },\n        'legend-label': function (legend, label) {\n            const i = label.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            const row = legend.rows[i];\n            row.label = label.text;\n            row.value = label.datum.value;\n        }\n    };\n    const markStager$1 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const fn = legendMap[item.mark.role];\n            if (fn) {\n                fn(stage.legend, item);\n            }\n        });\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const markStager$2 = (options, stage, scene, x, y, groupType) => {\n        let i = 0;\n        base.vega.sceneVisit(scene, function (item) {\n            //for orthographic (2d) - always use 0 or else Deck will not show them\n            const z = stage.view === '2d' ? 0 : (item.z || 0);\n            const depth = (stage.view === '2d' ? 0 : (item.depth || 0)) + min3dDepth;\n            //change direction of y from SVG to GL\n            const ty = -1;\n            let ordinal = i;\n            if (item.datum.GL_ORDINAL !== void 0) {\n                options.ordinalsSpecified = true;\n                ordinal = item.datum.GL_ORDINAL;\n                if (ordinal > options.maxOrdinal) {\n                    options.maxOrdinal = ordinal;\n                }\n            }\n            const cube = {\n                ordinal,\n                size: [item.width, item.height, depth],\n                position: [x + (item.x || 0) - options.offsetX, ty * (y + (item.y || 0) - options.offsetY) - item.height, z],\n                color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n            };\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n            stage.cubeData.push(cube);\n            i++;\n        });\n    };\n\n    const markStager$3 = (options, stage, scene, x, y, groupType) => {\n        //scale Deck.Gl text to Vega size\n        const fontScale = 6;\n        //Deck.gl centers text on Y. TODO: is this correct on x axis?\n        const offsetYCenter = 16;\n        //change direction of y from SVG to GL\n        const ty = -1;\n        base.vega.sceneVisit(scene, function (item) {\n            if (!item.text)\n                return;\n            const size = item.fontSize * fontScale;\n            const textItem = {\n                color: colorFromString(item.fill),\n                text: item.text.toString(),\n                position: [x + item.x - options.offsetX, ty * (y + item.y + offsetYCenter - options.offsetY), 0],\n                size,\n                angle: convertAngle(item.angle),\n                textAnchor: convertAlignment(item.align),\n                alignmentBaseline: convertBaseline(item.baseline)\n            };\n            if (item.mark.role === 'axis-label') {\n                const tickText = textItem;\n                tickText.value = item.datum.value;\n                options.currAxis.tickText.push(tickText);\n            }\n            else if (item.mark.role === 'axis-title') {\n                options.currAxis.title = textItem;\n            }\n            else if (options.currFacetRect && !options.currFacetRect.facetTitle) {\n                options.currFacetRect.facetTitle = textItem;\n                textItem.position = [x - options.offsetX, ty * (y + offsetYCenter - options.offsetY), 0];\n            }\n            else {\n                stage.textData.push(textItem);\n            }\n        });\n    };\n    function convertAngle(vegaTextAngle) {\n        if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n            return 360 - vegaTextAngle;\n        }\n        return 0;\n    }\n    function convertAlignment(textAlign) {\n        switch (textAlign) {\n            case 'center': return 'middle';\n            case 'left': return 'start';\n            case 'right': return 'end';\n        }\n        return 'start';\n    }\n    function convertBaseline(baseline) {\n        switch (baseline) {\n            case 'middle': return 'center';\n        }\n        return baseline || 'bottom';\n    }\n\n    var GroupType;\n    (function (GroupType) {\n        GroupType[GroupType[\"none\"] = 0] = \"none\";\n        GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n        GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n        GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n    })(GroupType || (GroupType = {}));\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function convertGroupRole(group) {\n        if (group.mark.role === 'legend')\n            return GroupType.legend;\n        if (group.mark.role === 'axis') {\n            var vegaAxisDatum = group.datum;\n            if (vegaAxisDatum) {\n                switch (vegaAxisDatum.orient) {\n                    case 'bottom':\n                    case 'top':\n                        return GroupType.xAxis;\n                    case 'left':\n                    case 'right':\n                        return GroupType.yAxis;\n                }\n            }\n        }\n    }\n    const group = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (g) {\n            if (g.bounds.x1 < options.offsetX) {\n                options.offsetX = g.bounds.x1;\n            }\n            if (g.bounds.y1 < options.offsetY) {\n                options.offsetY = g.bounds.y1;\n            }\n            const gx = g.x || 0, gy = g.y || 0;\n            if (g.context && g.context.background && !stage.backgroundColor) {\n                stage.backgroundColor = colorFromString(g.context.background);\n            }\n            if (g.stroke) {\n                const facetRect = {\n                    lines: box(gx + x - options.offsetX, gy + y - options.offsetY, g.height, g.width, g.stroke, groupStrokeWidth)\n                };\n                stage.facets.push(facetRect);\n                options.currFacetRect = facetRect;\n            }\n            groupType = convertGroupRole(g) || groupType;\n            setCurrentAxis(options, stage, groupType);\n            // draw group contents\n            base.vega.sceneVisit(g, function (item) {\n                mainStager(options, stage, item, gx + x, gy + y, groupType);\n            });\n        });\n    };\n    function setCurrentAxis(options, stage, groupType) {\n        let axes;\n        switch (groupType) {\n            case GroupType.xAxis:\n                axes = stage.axes.x;\n                break;\n            case GroupType.yAxis:\n                axes = stage.axes.y;\n                break;\n            default:\n                return;\n        }\n        options.currAxis = {\n            domain: null,\n            tickText: [],\n            ticks: []\n        };\n        axes.push(options.currAxis);\n    }\n    const markStagers = {\n        group,\n        legend: markStager$1,\n        rect: markStager$2,\n        rule: markStager,\n        text: markStager$3\n    };\n    var mainStager = (options, stage, scene, x, y, groupType) => {\n        if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n            markStager$1(options, stage, scene, x, y, groupType);\n        }\n        else {\n            var markStager$$1 = markStagers[scene.marktype];\n            if (markStager$$1) {\n                markStager$$1(options, stage, scene, x, y, groupType);\n            }\n        }\n    };\n    function sceneToStage(options, stage, scene) {\n        mainStager(options, stage, scene, 0, 0, null);\n        sortAxis(stage.axes.x, 0);\n        sortAxis(stage.axes.y, 1);\n    }\n    function sortAxis(axes, dim) {\n        axes.forEach(axis => {\n            if (axis.domain)\n                orderDomain(axis.domain, dim);\n            axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n            axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n        });\n    }\n    function orderDomain(domain, dim) {\n        if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n            const temp = domain.targetPosition;\n            domain.targetPosition = domain.sourcePosition;\n            domain.sourcePosition = temp;\n        }\n    }\n\n    const viewStateProps = ['distance', 'fov', 'lookAt', 'rotationOrbit', 'rotationX', 'zoom'];\n    function targetViewState(height, width, view) {\n        const distance = 10;\n        const fov = 60;\n        const lookAt = [width / 2, -height / 2, 0];\n        //add a 4th dimension to make transitions work\n        lookAt.push(1);\n        if (view === '2d') {\n            return {\n                distance,\n                fov,\n                lookAt,\n                rotationOrbit: 0,\n                rotationX: 0,\n                zoom: 10 / height\n            };\n        }\n        else {\n            return {\n                distance,\n                fov,\n                lookAt,\n                rotationOrbit: -25,\n                rotationX: 60,\n                zoom: 9 / height\n            };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    /**\n     * Class which presents a Stage of chart data using Deck.gl to render.\n     */\n    class Presenter {\n        /**\n         * Instantiate a new Presenter.\n         * @param el Parent HTMLElement to present within.\n         * @param style Optional PresenterStyle styling options.\n         */\n        constructor(el, style) {\n            this.el = el;\n            this.style = deepMerge(defaultPresenterStyle, style);\n            initializePanel(this);\n            this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n        }\n        /**\n         * Get the previously rendered Stage object.\n         */\n        get stage() {\n            return this._last.stage;\n        }\n        /**\n         * Get the current View camera type.\n         */\n        get view() {\n            return this._last.view;\n        }\n        /**\n         * Cancels any pending animation, calling animationCanceled() on original queue.\n         */\n        animationCancel() {\n            if (this.animationTimer) {\n                clearTimeout(this.animationTimer);\n                this.animationTimer = null;\n                if (this.logger) {\n                    this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n                }\n                if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                    this.queuedAnimationOptions.animationCanceled.call(null);\n                }\n            }\n        }\n        /**\n         * Stops the current animation and queues a new animation.\n         * @param handler Function to invoke when timeout is complete.\n         * @param timeout Length of time to wait before invoking the handler.\n         * @param options Optional QueuedAnimationOptions object.\n         */\n        animationQueue(handler, timeout, options) {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...`);\n            }\n            this.animationCancel();\n            this.animationTimer = setTimeout(() => {\n                if (this.logger) {\n                    this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n                }\n                handler();\n            }, timeout);\n        }\n        /**\n         * Retrieve a sub-element of the rendered output.\n         * @param type PresenterElement type of the HTMLElement to retrieve.\n         */\n        getElement(type) {\n            const elements = this.el.getElementsByClassName(className(type, this));\n            if (elements && elements.length) {\n                return elements[0];\n            }\n        }\n        /**\n         * Present the Vega Scene, or Stage object using Deck.gl.\n         * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n         * @param height Height of the rendering area.\n         * @param width Width of the rendering area.\n         * @param config Optional presentation configuration object.\n         */\n        present(sceneOrStage, height, width, config) {\n            this.animationCancel();\n            let scene = sceneOrStage;\n            let stage;\n            let options = {\n                offsetX: 0,\n                offsetY: 0,\n                maxOrdinal: -1,\n                ordinalsSpecified: false,\n                currAxis: null,\n                currFacetRect: null,\n                defaultCubeColor: this.style.defaultCubeColor\n            };\n            //determine if this is a vega scene\n            if (scene.marktype) {\n                stage = createStage(scene.view);\n                sceneToStage(options, stage, scene);\n            }\n            else {\n                stage = sceneOrStage;\n            }\n            if (!this.deckgl) {\n                const classes = createDeckGLClassesForPresenter({\n                    doubleClickHandler: () => {\n                        this.homeCamera();\n                    }\n                });\n                this.OrbitControllerClass = classes.OrbitControllerClass;\n                const deckProps = {\n                    onLayerClick: config && config.onLayerClick,\n                    views: [new base.deck.OrbitView({ controller: this.OrbitControllerClass })],\n                    container: this.getElement(PresenterElement.gl),\n                    getCursor: (interactiveState) => {\n                        if (interactiveState.onText || interactiveState.onAxisSelection) {\n                            return 'pointer';\n                        }\n                        else if (interactiveState.onCube) {\n                            return 'default';\n                        }\n                        else {\n                            return 'grab';\n                        }\n                    }\n                };\n                if (stage.backgroundColor) {\n                    deckProps.style = { 'background-color': colorToString(stage.backgroundColor) };\n                }\n                this.deckgl = new classes.DeckGL_Class(deckProps);\n            }\n            let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n            if (options.ordinalsSpecified) {\n                cubeCount = Math.max(cubeCount, options.maxOrdinal + 1);\n                const empty = {\n                    isEmpty: true,\n                    color: [0, 0, 0, 0] // possibly a bug in Deck.gl? set color to invisible.\n                };\n                stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n            }\n            this.setDeckProps(stage, height, width, cubeCount, config);\n            mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement.legend));\n            if (config && config.onPresent) {\n                config.onPresent();\n            }\n        }\n        /**\n         * Present the same recently rendered Stage with only slight modifications such as a color change,\n         * using the previous Stage values as a basis.\n         * @param stage Partially populated Stage object containing changes.\n         * @param modifyConfig Optional presentation configuration object.\n         */\n        rePresent(stage, modifyConfig) {\n            const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n            this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n        }\n        isNewBounds(view, height, width, cubeCount) {\n            const lastBounds = this.lastBounds();\n            for (let prop in lastBounds) {\n                if (lastBounds[prop] === null)\n                    return true;\n            }\n            const newBounds = { cubeCount, height, view, width };\n            for (let prop in lastBounds) {\n                if (lastBounds[prop] !== newBounds[prop])\n                    return true;\n            }\n        }\n        lastBounds() {\n            const { cubeCount, height, view, width } = this._last;\n            return { cubeCount, height, view, width };\n        }\n        setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n            const config = deepMerge(defaultPresenterConfig, modifyConfig);\n            const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n            let lightSettings = this.style.lightSettings[stage.view];\n            let lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n            let linearInterpolator;\n            //choose the current OrbitView viewstate if possible\n            let viewState = (this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView)\n                //otherwise use the initial viewstate if any\n                || this.deckgl.props.viewState;\n            if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n                viewState = targetViewState(height, width, stage.view);\n                const oldCubeLayer = getCubeLayer(this.deckgl.props);\n                if (oldCubeLayer) {\n                    linearInterpolator = new LinearInterpolator(viewStateProps);\n                    linearInterpolator.layerStartProps = { lightingMix: oldCubeLayer.props.lightingMix };\n                    linearInterpolator.layerEndProps = { lightingMix };\n                    viewState.transitionDuration = config.transitionDurations.view;\n                    viewState.transitionEasing = expInOut;\n                    viewState.transitionInterpolator = linearInterpolator;\n                }\n                if (stage.view === '2d') {\n                    lightSettings = this.style.lightSettings['3d'];\n                }\n            }\n            const guideLines = this._showGuides && box(0, 0, height, width, '#0f0', 1, true);\n            config.preLayer && config.preLayer(stage);\n            const layers = getLayers(this, config, stage, lightSettings, lightingMix, linearInterpolator, guideLines);\n            const deckProps = {\n                views: [new base.deck.OrbitView({ controller: this.OrbitControllerClass })],\n                viewState,\n                layers\n            };\n            if (config && config.preStage) {\n                config.preStage(stage, deckProps);\n            }\n            this.deckgl.setProps(deckProps);\n            delete stage.cubeData;\n            this._last = {\n                cubeCount,\n                height,\n                width,\n                stage: stage,\n                view: stage.view\n            };\n        }\n        /**\n         * Home the camera to the last initial position.\n         */\n        homeCamera() {\n            const viewState = targetViewState(this._last.height, this._last.width, this._last.view);\n            viewState.transitionDuration = defaultPresenterConfig.transitionDurations.view;\n            viewState.transitionEasing = expInOut;\n            viewState.transitionInterpolator = new LinearInterpolator(viewStateProps);\n            const deckProps = {\n                views: this.deckgl.props.views,\n                viewState,\n                layers: this.deckgl.props.layers\n            };\n            this.deckgl.setProps(deckProps);\n        }\n        /**\n         * Get cube data array from the cubes layer.\n         */\n        getCubeData() {\n            return getCubes(this.deckgl.props);\n        }\n        /**\n         * Show guidelines of rendering height/width and center of OrbitView.\n         */\n        showGuides() {\n            this._showGuides = true;\n            this.getElement(PresenterElement.gl).classList.add('show-center');\n            this.rePresent(Object.assign(Object.assign({}, this._last.stage), { cubeData: this.getCubeData() }));\n        }\n        finalize() {\n            this.animationCancel();\n            if (this.deckgl)\n                this.deckgl.finalize();\n            if (this.el)\n                this.el.innerHTML = '';\n            this._last = null;\n            this.deckgl = null;\n            this.el = null;\n            this.logger = null;\n            this.queuedAnimationOptions = null;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    //pass in the SuperClass, which should be a vega.View\n    function _RendererGl(loader) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class RendererGlInternal extends base.vega.Renderer {\n            initialize(el, width, height, origin) {\n                this.height = height;\n                this.width = width;\n                // this method will invoke resize to size the canvas appropriately\n                return super.initialize(el, width, height, origin);\n            }\n            resize(width, height, origin) {\n                super.resize(width, height, origin);\n                this.origin = origin;\n                this.height = height;\n                this.width = width;\n                //rteturn this for vega\n                return this;\n            }\n            _render(scene, items) {\n                const scene3d = scene;\n                scene3d.view = this.getView();\n                this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n                //return this for vega\n                return this;\n            }\n        }\n        const instance = new RendererGlInternal(loader);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n     * This is instantiated by ViewGl.\n     */\n    const RendererGl = _RendererGl;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    let registered = false;\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n    //pass in the SuperClass, which should be a vega.View\n    function _ViewGl(runtime, config) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class ViewGlInternal extends base.vega.View {\n            constructor(runtime, config = {}) {\n                super(runtime, config);\n                this.config = config;\n                this.presenter = config.presenter;\n                config.presenterConfig = config.presenterConfig || {};\n                config.presenterConfig.redraw = () => {\n                    this._redraw = true; //use Vega View private member _redraw\n                    this.run();\n                };\n            }\n            renderer(renderer) {\n                if (renderer === 'deck.gl' && !registered) {\n                    base.vega.renderModule('deck.gl', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                    registered = true;\n                }\n                return super.renderer(renderer);\n            }\n            initialize(el) {\n                if (!this.presenter) {\n                    this.presenter = new Presenter(el);\n                }\n                super.initialize(this.presenter.getElement(PresenterElement.vegaControls));\n                const renderer = this._renderer;\n                renderer.presenterConfig = this.config.presenterConfig;\n                renderer.presenter = this.presenter;\n                renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView);\n                return this;\n            }\n            error(e) {\n                if (this.presenter.logger) {\n                    this.presenter.logger(e);\n                }\n            }\n        }\n        const instance = new ViewGlInternal(runtime, config);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.View, with added properties for accessing a Presenter.\n     * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n     */\n    const ViewGl = _ViewGl;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var index$2 = /*#__PURE__*/Object.freeze({\n        constants: constants$1,\n        controls: controls,\n        defaults: defaults,\n        types: types$1,\n        util: util,\n        base: base,\n        use: use,\n        Presenter: Presenter,\n        ViewGl: ViewGl,\n        get PresenterElement () { return PresenterElement; }\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function isQuantitative(column) {\n        return column.type === 'number' || column.type === 'integer';\n    }\n    /**\n     * Derive column metadata from the data array.\n     * @param data Array of data objects.\n     */\n    function getColumnsFromData(data, columnTypes) {\n        const sample = data[0];\n        const fields = sample ? Object.keys(sample) : [];\n        const inferences = Object.assign(Object.assign({}, base.vega.inferTypes(data, fields)), columnTypes);\n        const columns = fields.map(name => {\n            const column = {\n                name,\n                type: inferences[name]\n            };\n            return column;\n        });\n        inferAll(columns, data);\n        return columns;\n    }\n    /**\n     * Populate columns with type inferences and stats.\n     * @param columns Array of columns.\n     * @param data Array of data objects.\n     */\n    function inferAll(columns, data) {\n        columns.forEach(column => {\n            if (column) {\n                if (typeof column.quantitative !== 'boolean') {\n                    column.quantitative = isQuantitative(column);\n                }\n                if (column.type === 'string') {\n                    checkIsColorData(data, column);\n                }\n                if (!column.stats) {\n                    column.stats = getStats(data, column);\n                }\n            }\n        });\n    }\n    function checkIsColorData(data, column) {\n        for (let i = 0; i < data.length; i++) {\n            if (!isColor(data[i][column.name])) {\n                return;\n            }\n        }\n        column.isColorData = true;\n    }\n    function getStats(data, column) {\n        const distinctMap = {};\n        const stats = {\n            distinctValueCount: null,\n            max: null,\n            mean: null,\n            min: null\n        };\n        let sum = 0;\n        for (let i = 0; i < data.length; i++) {\n            let row = data[i];\n            let value = row[column.name];\n            distinctMap[value] = true;\n            if (stats.max === null || value > stats.max) {\n                stats.max = value;\n            }\n            if (stats.min === null || value < stats.min) {\n                stats.min = value;\n            }\n            let num = +value;\n            if (!isNaN(num)) {\n                sum += num;\n            }\n            if (column.type === 'string' && !stats.hasColorData && isColor(value)) {\n                stats.hasColorData = true;\n            }\n        }\n        if (column.quantitative) {\n            stats.mean = data.length > 0 && (sum / data.length);\n            stats.hasNegative = detectNegative(column, data);\n            if (column.type === 'integer') {\n                stats.isSequential = detectSequentialColumn(column, data);\n            }\n        }\n        stats.distinctValueCount = Object.keys(distinctMap).length;\n        return stats;\n    }\n    function detectNegative(column, data) {\n        for (let i = 1; i < data.length; i++) {\n            if (data[i][column.name] < 0)\n                return true;\n        }\n        return false;\n    }\n    function detectSequentialColumn(column, data) {\n        if (data.length < 2)\n            return false;\n        let colname = column.name;\n        for (let i = 1; i < data.length; i++) {\n            if (data[i][colname] !== data[i - 1][colname] + 1)\n                return false;\n        }\n        return true;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const { defaultPresenterConfig: defaultPresenterConfig$1, defaultPresenterStyle: defaultPresenterStyle$1 } = defaults;\n    const { desaturate: desaturate$1 } = util;\n    const defaultViewerOptions = {\n        colors: {\n            activeCube: [128, 0, 128, 255],\n            defaultCube: defaultPresenterStyle$1.defaultCubeColor,\n            hoveredCube: defaultPresenterStyle$1.highlightColor,\n            selectedCube: [255, 255, 0, 255],\n            axisSelectHighlight: [128, 128, 128, 128],\n            axisLine: [0, 0, 0, 255],\n            axisText: [0, 0, 0, 255],\n            cellFillerLine: [128, 128, 128, 255],\n            unselectedColorMethod: (color) => {\n                const c = desaturate$1(color, 0.05);\n                c[3] = 171;\n                return c;\n            }\n        },\n        language: {\n            headers: {\n                chart: 'Chart',\n                details: 'Details',\n                legend: 'Legend',\n                selection: 'Select & Filter'\n            },\n            bing: 'bing',\n            newColorMap: 'remap color to filtered items',\n            oldColorMap: 'keep same colors',\n            deselect: 'deselect',\n            exclude: 'exclude',\n            isolate: 'isolate',\n            legendOther: 'other',\n            nextDetail: '>',\n            previousDetail: '<',\n            reset: 'reset',\n            colorBinCount: 'Color bin count',\n            colorReverse: 'Color reverse',\n            count: 'Count',\n            scatterPointSize: 'Point size',\n            XBinSize: 'X axis bin size',\n            YBinSize: 'Y axis bin size',\n            XGridSize: 'X grid size',\n            YGridSize: 'Y grid size',\n            InnerPaddingSize: 'Inner padding size',\n            OuterPaddingSize: 'Outer padding size',\n            treeMapMethod: 'Method',\n            facetColumns: 'Facet columns',\n            facetRows: 'Facet rows',\n            markOpacitySignal: 'Mark opacity',\n            textScaleSignal: 'Text scale',\n            xAxisTextAngleSignal: 'X axis text angle',\n            yAxisTextAngleSignal: 'Y axis text angle',\n            zScaleProportion: 'Z scale proportion to Y',\n            selectionCount: count => `${count} items selected`\n        },\n        maxLegends: 19,\n        onError: (errors) => {\n            //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n        },\n        transitionDurations: Object.assign(Object.assign({}, defaultPresenterConfig$1.transitionDurations), { scope: 600 }),\n        selectionPolygonZ: -1,\n        tickSize: 10,\n        facetMargins: {\n            column: 40,\n            row: 40,\n            title: 40\n        }\n    };\n    function getPresenterStyle(options) {\n        var style = {\n            cssPrefix,\n            fontFamily: options.fontFamily,\n            defaultCubeColor: options.colors.defaultCube\n        };\n        if (options.colors.hoveredCube) {\n            style.highlightColor = options.colors.hoveredCube;\n        }\n        if (options.lightSettings) {\n            style.lightSettings = options.lightSettings;\n        }\n        return style;\n    }\n    const cssPrefix = 'sanddance-';\n    const dualColorSchemeColors = {\n        black: '#212121',\n        gray: '#D2D2D2',\n        blue: '#0060F0',\n        green: '#00C000',\n        orange: '#FF9900',\n        red: '#E00000'\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const { GL_ORDINAL: GL_ORDINAL$1 } = constants$1;\n    function isInternalFieldName(columnName, includeVegaDeckGLFields = false) {\n        if (includeVegaDeckGLFields) {\n            if (columnName === GL_ORDINAL$1)\n                return true;\n        }\n        for (let f in FieldNames) {\n            if (columnName === FieldNames[f])\n                return true;\n        }\n        return false;\n    }\n\n    var util$1 = /*#__PURE__*/Object.freeze({\n        isInternalFieldName: isInternalFieldName,\n        getColumnsFromData: getColumnsFromData,\n        getStats: getStats,\n        inferAll: inferAll,\n        ensureSearchExpressionGroupArray: ensureSearchExpressionGroupArray,\n        getPresenterStyle: getPresenterStyle\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const dualPairs = [\n        [dualColorSchemeColors.black, dualColorSchemeColors.gray],\n        [dualColorSchemeColors.red, dualColorSchemeColors.green],\n        [dualColorSchemeColors.red, dualColorSchemeColors.blue],\n        [dualColorSchemeColors.black, dualColorSchemeColors.red],\n        [dualColorSchemeColors.black, dualColorSchemeColors.orange],\n        [dualColorSchemeColors.black, dualColorSchemeColors.green]\n    ];\n    /**\n     * Array of color schemes.\n     */\n    const colorSchemes = [\n        {\n            scheme: ColorScaleNone,\n            colors: [colorToString(defaultViewerOptions.colors.defaultCube)]\n        }\n    ];\n    createDualColorSchemes();\n    function registerColorSchemes(vega) {\n        colorSchemes.forEach(cs => {\n            if (cs.colors.length === 1) {\n                vega.scheme(cs.scheme, x => cs.colors[0]);\n            }\n            else {\n                vega.scheme(cs.scheme, cs.colors);\n            }\n        });\n    }\n    function createPair(names, colors) {\n        const scheme = `dual_${names[0]}${names[1]}`;\n        colorSchemes.push({ scheme, colors });\n    }\n    function createDualColorSchemes() {\n        dualPairs.forEach(colors => {\n            const names = colors.map(color => {\n                for (let key in dualColorSchemeColors)\n                    if (color === dualColorSchemeColors[key])\n                        return key;\n            });\n            createPair(names, colors);\n            createPair([...names].reverse(), [...colors].reverse());\n        });\n    }\n\n    var DataLayoutChange;\n    (function (DataLayoutChange) {\n        DataLayoutChange[DataLayoutChange[\"same\"] = 0] = \"same\";\n        DataLayoutChange[DataLayoutChange[\"reset\"] = 1] = \"reset\";\n        DataLayoutChange[DataLayoutChange[\"refine\"] = 2] = \"refine\";\n    })(DataLayoutChange || (DataLayoutChange = {}));\n    class Animator {\n        constructor(dataScope, props) {\n            this.dataScope = dataScope;\n            this.props = props;\n        }\n        select(search) {\n            return new Promise((resolve, reject) => {\n                this.dataScope.select(search);\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        deselect() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deselect();\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        filter(search, keepData, collapseData) {\n            this.dataScope.collapse(true, collapseData);\n            return new Promise((resolve, reject) => {\n                this.props.onAnimateDataChange(DataLayoutChange.refine, 'before refine', 'refine').then(() => {\n                    this.dataScope.deselect();\n                    this.dataScope.setFilteredData(keepData);\n                    this.props.onDataChanged(DataLayoutChange.refine, search);\n                    resolve();\n                }).catch(reject);\n            });\n        }\n        reset() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deselect();\n                this.dataScope.setFilteredData(null);\n                this.props.onAnimateDataChange(DataLayoutChange.reset, 'before reset', 'reset').then(() => {\n                    this.dataScope.collapse(false);\n                    this.props.onDataChanged(DataLayoutChange.reset);\n                    resolve();\n                }).catch(reject);\n            });\n        }\n        activate(datum) {\n            return new Promise((resolve, reject) => {\n                this.dataScope.activate(datum);\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        deactivate() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deactivate();\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSelectedColorMap(currentData, showSelectedData, showActive, viewerOptions) {\n        function getSelectionColorItem(datum) {\n            let item;\n            if (showSelectedData) {\n                item = datum[FieldNames.Selected] ?\n                    { color: viewerOptions.colors.selectedCube }\n                    :\n                        { unSelected: true };\n            }\n            if (showActive && datum[FieldNames.Active]) {\n                item = { color: viewerOptions.colors.activeCube };\n            }\n            return item;\n        }\n        const colorMap = {};\n        currentData.forEach(datum => {\n            const selectionColor = getSelectionColorItem(datum);\n            if (selectionColor) {\n                const ordinal = datum[GL_ORDINAL];\n                colorMap[ordinal] = selectionColor;\n            }\n        });\n        return colorMap;\n    }\n    function colorMapFromCubes(cubes) {\n        const map = {};\n        cubes.forEach(cube => {\n            map[cube.ordinal] = { color: cube.color };\n        });\n        return map;\n    }\n    function populateColorContext(colorContext, presenter) {\n        if (!colorContext.colorMap) {\n            const cubes = presenter.getCubeData();\n            colorContext.colorMap = colorMapFromCubes(cubes);\n        }\n        colorContext.legend = clone(presenter.stage.legend);\n        colorContext.legendElement = presenter.getElement(PresenterElement.legend).children[0];\n    }\n    function applyColorMapToCubes(maps, cubes, unselectedColorMethod) {\n        Object.keys(maps[0]).forEach(ordinal => {\n            const cube = cubes[+ordinal];\n            if (cube && !cube.isEmpty) {\n                const actualColorMappedItem = maps[0][ordinal];\n                if (maps.length > 1) {\n                    const selectedColorMappedItem = maps[1][ordinal];\n                    if (selectedColorMappedItem) {\n                        if (selectedColorMappedItem.unSelected && unselectedColorMethod) {\n                            cube.color = unselectedColorMethod(actualColorMappedItem.color);\n                        }\n                        else {\n                            cube.color = selectedColorMappedItem.color;\n                        }\n                        return;\n                    }\n                }\n                cube.color = actualColorMappedItem.color;\n            }\n        });\n    }\n\n    function applySignalValues(sv, b) {\n        if (!sv || !b || !b.signals || !b.signals.length)\n            return;\n        for (let key in sv) {\n            let value = sv[key];\n            let signalB = b.signals.filter(signal => signal.name === key)[0];\n            if (signalB && signalB.bind) {\n                signalB.value = value;\n            }\n        }\n    }\n    function extractSignalValuesFromView(view, spec) {\n        if (!view || !spec || !spec.signals || !spec.signals.length)\n            return;\n        const result = {};\n        spec.signals.forEach((signalA) => {\n            //bound to a UI control\n            if (signalA.bind) {\n                try {\n                    result[signalA.name] = view.signal(signalA.name);\n                }\n                catch (e) {\n                    // continue regardless of error\n                }\n            }\n        });\n        return result;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function assignOrdinals(columns, data, ordinalMap) {\n        const uCol = columns.uid && columns.uid.name;\n        if (ordinalMap) {\n            data.forEach((d, i) => {\n                const key = uCol ? d[uCol] : i;\n                d[GL_ORDINAL] = ordinalMap[key];\n            });\n        }\n        else {\n            ordinalMap = {};\n            data.forEach((d, i) => {\n                d[GL_ORDINAL] = i;\n                const uColValue = uCol ? d[uCol] : i;\n                ordinalMap[uColValue] = i;\n            });\n        }\n        return ordinalMap;\n    }\n    function getSpecColumns(insight, columns) {\n        function getColumnByName(name) {\n            return columns.filter(c => c.name === name)[0];\n        }\n        return {\n            color: getColumnByName(insight.columns && insight.columns.color),\n            facet: getColumnByName(insight.columns && insight.columns.facet),\n            group: getColumnByName(insight.columns && insight.columns.group),\n            size: getColumnByName(insight.columns && insight.columns.size),\n            sort: getColumnByName(insight.columns && insight.columns.sort),\n            uid: getColumnByName(insight.columns && insight.columns.uid),\n            x: getColumnByName(insight.columns && insight.columns.x),\n            y: getColumnByName(insight.columns && insight.columns.y),\n            z: getColumnByName(insight.columns && insight.columns.z)\n        };\n    }\n    function getDataIndexOfCube(cube, data) {\n        const len = data.length;\n        for (let i = 0; i < len; i++) {\n            if (data[i][GL_ORDINAL] === cube.ordinal) {\n                return i;\n            }\n        }\n    }\n\n    const FacetColumnsSequence = 'FacetColumnsSequence';\n    const FacetRowsSequence = 'FacetRowsSequence';\n    const SequenceNumber = 'SequenceNumber';\n    const CellTitle = 'CellTitle';\n    const CellFiller = 'CellFiller';\n    const facetTitleSeparator = ' - ';\n    function facetSignals(context) {\n        const { insight } = context;\n        const { facets } = insight;\n        const signals = [\n            {\n                name: SignalNames.FacetColumns,\n                value: facets.columns,\n            },\n            {\n                name: SignalNames.FacetRows,\n                value: facets.rows,\n            }\n        ];\n        return signals;\n    }\n    function checkForFacetErrors(facets, errors) {\n        if (facets) {\n            const gridCapacity = facets.columns * facets.rows;\n            if (!gridCapacity) {\n                errors.push('Must set facets columns & rows to non-zero.');\n            }\n            if (gridCapacity < 2) {\n                errors.push('Not enough facets to facet.');\n            }\n            if (!facets.columns || facets.columns < 1) {\n                errors.push('Facet column columns must be greater than 1.');\n            }\n            if (!facets.rows || facets.rows < 1) {\n                errors.push('Facet column rows must be greater than 1.');\n            }\n        }\n    }\n    function facetSize(context) {\n        const { insight, specViewOptions } = context;\n        const { facets, size } = insight;\n        return {\n            height: (size.height - (facets.rows + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.column)) / facets.columns,\n            width: (size.width - (facets.columns + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.row)) / facets.rows,\n        };\n    }\n    function layout(context) {\n        const { specViewOptions } = context;\n        const layout = {\n            columns: {\n                signal: SignalNames.FacetColumns\n            },\n            bounds: 'full',\n            padding: {\n                column: specViewOptions.facetMargins.column,\n                row: specViewOptions.facetMargins.row\n            }\n        };\n        return layout;\n    }\n    function facetBinStep(facetColumn, facetCount) {\n        const range = facetColumn.stats.max - facetColumn.stats.min;\n        return range / facetCount;\n    }\n    function emptyBinsDataSource(name, facetColumn, facets) {\n        const gridCapacity = facets.columns * facets.rows;\n        const step = facetBinStep(facetColumn, gridCapacity);\n        const steps = [];\n        for (let i = 0; i < gridCapacity; i++) {\n            steps[i] = facetColumn.stats.min + i * step + step / 2;\n        }\n        const values = steps.map(s => {\n            const obj = {};\n            obj[FieldNames.Collapsed] = true;\n            obj[facetColumn.name] = s;\n            return obj;\n        });\n        const data = { name, values };\n        return data;\n    }\n    function facetSourceData(facetColumn, facets, name) {\n        let data;\n        if (facetColumn && facetColumn.quantitative) {\n            data = [\n                {\n                    name: DataNames.Pre\n                },\n                emptyBinsDataSource(DataNames.EmptyBin, facetColumn, facets),\n                {\n                    name,\n                    source: [DataNames.Pre, DataNames.EmptyBin]\n                }\n            ];\n        }\n        else {\n            data = [{ name }];\n        }\n        return data;\n    }\n    function facetGroupData(source) {\n        const data = [\n            {\n                name: DataNames.FacetCellTitles,\n                source,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: [CellTitle]\n                    }\n                ]\n            },\n            {\n                name: CellFiller,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 0,\n                        step: 1,\n                        stop: { signal: `${SignalNames.FacetColumns} * ${SignalNames.FacetRows} - length(data('${DataNames.FacetCellTitles}'))` }\n                    }\n                ]\n            },\n            {\n                name: FacetColumnsSequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 0,\n                        stop: {\n                            signal: SignalNames.FacetColumns\n                        },\n                        as: SequenceNumber\n                    }\n                ]\n            },\n            {\n                name: FacetRowsSequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 0,\n                        stop: {\n                            signal: SignalNames.FacetRows\n                        },\n                        as: SequenceNumber\n                    }\n                ]\n            }\n        ];\n        return data;\n    }\n    function facetTransforms(facetColumn, facets) {\n        let transforms;\n        if (facetColumn.quantitative) {\n            const gridCapacity = facets.columns * facets.rows;\n            const step = facetBinStep(facetColumn, gridCapacity);\n            transforms = [\n                {\n                    type: 'bin',\n                    field: facetColumn.name,\n                    step,\n                    nice: false,\n                    extent: [facetColumn.stats.min, facetColumn.stats.max],\n                    as: [\n                        FieldNames.FacetBin0,\n                        FieldNames.FacetBin1\n                    ]\n                },\n                {\n                    type: 'collect',\n                    sort: {\n                        field: FieldNames.FacetBin0\n                    }\n                },\n                {\n                    type: 'formula',\n                    expr: `format(datum.${FieldNames.FacetBin0}, '~r') + '${facetTitleSeparator}' + format(datum.${FieldNames.FacetBin1}, '~r')`,\n                    as: CellTitle\n                }\n            ];\n        }\n        else {\n            transforms = [\n                {\n                    type: 'formula',\n                    expr: `datum[${JSON.stringify(facetColumn.name)}]`,\n                    as: CellTitle\n                }\n            ];\n        }\n        return transforms;\n    }\n    function facetMarks(specViewOptions, sourceDataName, childMarks, childAxes, childData) {\n        //TODO: create a style\n        const cellFillerLineColor = colorToString(specViewOptions.colors.cellFillerLine);\n        const style = 'cell';\n        const mark = {\n            style,\n            type: 'group',\n            from: {\n                facet: {\n                    name: DataNames.FacetGroupCell,\n                    data: sourceDataName,\n                    groupby: [CellTitle]\n                }\n            },\n            title: {\n                frame: 'group',\n                offset: specViewOptions.facetMargins.title,\n                text: {\n                    signal: `parent['${CellTitle}']`\n                },\n                limit: {\n                    signal: 'width'\n                },\n                color: colorToString(specViewOptions.colors.axisText),\n                fontSize: {\n                    signal: SignalNames.TextSize\n                }\n            },\n            encode: {\n                update: {\n                    width: {\n                        signal: 'width'\n                    },\n                    height: {\n                        signal: 'height'\n                    }\n                }\n            },\n            data: childData,\n            marks: childMarks.map(mark => {\n                if (mark.from && mark.from.data && mark.from.data === sourceDataName) {\n                    mark.from.data = DataNames.FacetGroupCell;\n                }\n                return mark;\n            })\n        };\n        if (childAxes) {\n            mark.axes = childAxes.map(axis => {\n                const clone$$1 = clone(axis);\n                //remove all labels and titles\n                clone$$1.labels = false;\n                delete clone$$1.title;\n                delete clone$$1.titleAlign;\n                delete clone$$1.titleAngle;\n                delete clone$$1.titleFontSize;\n                return clone$$1;\n            });\n        }\n        const filler = {\n            style: 'cell',\n            type: 'group',\n            from: { data: CellFiller },\n            title: {\n                frame: 'group',\n                offset: specViewOptions.facetMargins.title,\n                text: '',\n                fontSize: {\n                    signal: SignalNames.TextSize\n                }\n            },\n            encode: {\n                update: {\n                    width: { signal: 'width' },\n                    height: { signal: 'height' }\n                }\n            }\n        };\n        if (childAxes) {\n            filler.axes = childAxes.map(axis => {\n                const clone$$1 = clone(axis);\n                //remove all labels and titles\n                clone$$1.labels = false;\n                delete clone$$1.title;\n                delete clone$$1.titleAlign;\n                delete clone$$1.titleAngle;\n                delete clone$$1.titleFontSize;\n                //change tick & domain color\n                clone$$1.tickColor = cellFillerLineColor;\n                clone$$1.domainColor = cellFillerLineColor;\n                return clone$$1;\n            });\n        }\n        const rowHeader = {\n            type: 'group',\n            role: 'row-header',\n            from: {\n                facet: {\n                    name: 'row-headers',\n                    data: FacetRowsSequence,\n                    groupby: [\n                        SequenceNumber\n                    ]\n                }\n            }\n        };\n        if (childAxes) {\n            rowHeader.axes = [\n                cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'left')[0], specViewOptions.facetMargins.column)\n            ];\n        }\n        const columnFooter = {\n            type: 'group',\n            role: 'column-footer',\n            from: {\n                facet: {\n                    name: 'column-footers',\n                    data: FacetColumnsSequence,\n                    groupby: [\n                        SequenceNumber\n                    ]\n                }\n            }\n        };\n        if (childAxes) {\n            columnFooter.axes = [\n                cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'bottom')[0], specViewOptions.facetMargins.row)\n            ];\n        }\n        const marks = [\n            mark,\n            filler,\n            rowHeader,\n            columnFooter\n        ];\n        return marks;\n    }\n    function cloneAndOffsetAxis(axis, margin) {\n        if (axis) {\n            const clone$$1 = clone(axis);\n            clone$$1.offset = margin;\n            return clone$$1;\n        }\n    }\n\n    function notNice(niceValue) {\n        //convert \"nice\" numbers to numeric value\n        return (niceValue + '').replace(/,/g, '');\n    }\n    function tickValue(axis, i) {\n        const tick = axis.tickText[i];\n        let value;\n        if (tick) {\n            value = axis.tickText[i].value;\n        }\n        return { tick, value };\n    }\n    function selectNullOrEmpty(column) {\n        const searchExpression = {\n            name: column.name,\n            operator: 'isnullorEmpty'\n        };\n        return searchExpression;\n    }\n    function selectExact(column, value) {\n        if (value == null) {\n            return selectNullOrEmpty(column);\n        }\n        const searchExpression = {\n            name: column.name,\n            operator: '==',\n            value\n        };\n        return searchExpression;\n    }\n    function selectNone(column, values) {\n        const expressions = values.map((value, i) => {\n            const searchExpression = {\n                name: column.name,\n                operator: '!=',\n                value\n            };\n            if (i) {\n                searchExpression.clause = '&&';\n            }\n            return searchExpression;\n        });\n        const searchExpressionGroup = {\n            expressions\n        };\n        return searchExpressionGroup;\n    }\n    function selectExactAxis(axis, column, i) {\n        const result = tickValue(axis, i);\n        if (result.tick) {\n            return selectExact(column, result.value);\n        }\n    }\n    function selectBetween(column, lowValue, highValue, lowOperator = '>=', highOperator = '<') {\n        const expressions = [];\n        if (lowValue !== undefined) {\n            expressions.push({\n                name: column.name,\n                operator: lowOperator,\n                value: lowValue\n            });\n        }\n        if (highValue !== undefined) {\n            expressions.push({\n                name: column.name,\n                operator: highOperator,\n                value: highValue\n            });\n        }\n        if (expressions.length > 1) {\n            expressions[1].clause = '&&';\n        }\n        const searchExpressionGroup = {\n            expressions\n        };\n        return searchExpressionGroup;\n    }\n    function selectBetweenAxis(axis, column, i) {\n        const low = tickValue(axis, i);\n        const high = tickValue(axis, i + 1);\n        return selectBetween(column, low.value, high.value);\n    }\n    function selectBetweenFacet(column, title, isFirst, isLast) {\n        const values = title.split(facetTitleSeparator);\n        return selectBetween(column, isFirst ? undefined : values[0], isLast ? undefined : values[1]);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function axisSelectionLayer(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n        const polygons = [];\n        const xRole = specCapabilities.roles.filter(r => r.role === 'x')[0];\n        if (xRole && xRole.axisSelection) {\n            stage.axes.x.filter(axis => axis.tickText.length).forEach(axis => {\n                polygons.push.apply(polygons, axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n            });\n        }\n        const yRole = specCapabilities.roles.filter(r => r.role === 'y')[0];\n        if (yRole && yRole.axisSelection) {\n            stage.axes.y.filter(axis => axis.tickText.length).forEach(axis => {\n                polygons.push.apply(polygons, axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n            });\n        }\n        if (stage.facets) {\n            polygons.push.apply(polygons, facetSelectionPolygons(stage.facets, columns.facet));\n        }\n        //move polygons to Z\n        polygons.forEach(datum => {\n            datum.polygon.forEach(p => {\n                p[2] = polygonZ;\n            });\n        });\n        const onClick = (o, e) => clickHandler(e.srcEvent, o.object.search);\n        const polygonLayer = new base.layers.PolygonLayer({\n            autoHighlight: true,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            data: polygons,\n            extruded: false,\n            highlightColor,\n            id: 'selections',\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onAxisSelection = false;\n                }\n                else {\n                    presenter.deckgl.interactiveState.onAxisSelection = true;\n                }\n            },\n            onClick,\n            getElevation: () => 0,\n            getFillColor: () => [0, 0, 0, 0],\n            pickable: true,\n            stroked: false\n        });\n        return polygonLayer;\n    }\n    function axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n        const polygons = [];\n        const size = 50;\n        const getSearch = axisSelectionType === 'exact' ?\n            (a, c, i) => ({ expressions: [selectExactAxis(a, c, i)] })\n            :\n                selectBetweenAxis;\n        const { domain, ticks } = axis;\n        if (ticks.length > 0 && domain) {\n            const dim = vertical ? 1 : 0;\n            const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n            let divisions;\n            if (between) {\n                divisions = [];\n                for (let i = 1; i < ticks.length; i++) {\n                    divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n                }\n            }\n            else {\n                divisions = ticks.slice(1, -1).map(tick => tick.sourcePosition[dim]);\n            }\n            const add = (p2, i) => {\n                var coords = [[p1, q1], [p2, q1], [p2, q2], [p1, q2]];\n                polygons.push({\n                    search: getSearch(axis, column, i),\n                    polygon: vertical ? coords.map(xy => xy.reverse()) : coords\n                });\n                p1 = p2;\n            };\n            let p1 = domain.sourcePosition[dim];\n            const q1 = domain.sourcePosition[vertical ? 0 : 1];\n            const q2 = q1 - size;\n            divisions.forEach(add);\n            add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n        }\n        return polygons;\n    }\n    function facetSelectionPolygons(facetRects, facetColumn) {\n        const polygons = [];\n        facetRects.forEach((facetRect, i) => {\n            //take any 2 lines to get a box dimension\n            const [x, y] = minMaxPoints(facetRect.lines.slice(2));\n            const search = facetRect.facetTitle ?\n                facetColumn.quantitative ?\n                    selectBetweenFacet(facetColumn, facetRect.facetTitle.text, i === 0, i === facetRects.length - 1)\n                    :\n                        { expressions: [selectExact(facetColumn, facetRect.facetTitle.text)] }\n                :\n                    { expressions: [selectNullOrEmpty(facetColumn)] };\n            polygons.push({\n                search,\n                polygon: [[x.min, y.min], [x.max, y.min], [x.max, y.max], [x.min, y.max]]\n            });\n        });\n        return polygons;\n    }\n    function minMaxPoints(lines) {\n        const points = [];\n        lines.forEach(line => {\n            [line.sourcePosition, line.targetPosition].forEach(point => {\n                points.push(point);\n            });\n        });\n        return [0, 1].map(dim => {\n            let minMax = { min: null, max: null };\n            points.forEach(point => {\n                if (minMax.max == null) {\n                    minMax.max = point[dim];\n                }\n                else {\n                    minMax.max = Math.max(minMax.max, point[dim]);\n                }\n                if (minMax.min == null) {\n                    minMax.min = point[dim];\n                }\n                else {\n                    minMax.min = Math.min(minMax.min, point[dim]);\n                }\n            });\n            return minMax;\n        });\n    }\n\n    var AxisType;\n    (function (AxisType) {\n        AxisType[AxisType[\"quantitative\"] = 0] = \"quantitative\";\n        AxisType[AxisType[\"categoric\"] = 1] = \"categoric\";\n        AxisType[AxisType[\"date\"] = 2] = \"date\";\n    })(AxisType || (AxisType = {}));\n    function columnToAxisType(c) {\n        if (c.quantitative) {\n            return AxisType.quantitative;\n        }\n        return AxisType.categoric;\n    }\n    function partialAxes(specViewOptions, bottomType, leftType) {\n        const lineColor = colorToString(specViewOptions.colors.axisLine);\n        const axisColor = {\n            domainColor: lineColor,\n            tickColor: lineColor,\n            labelColor: colorToString(specViewOptions.colors.axisText)\n        };\n        const bottom = Object.assign({ orient: 'bottom', labelAlign: 'left', labelAngle: {\n                signal: SignalNames.TextAngleX\n            }, labelFontSize: {\n                signal: SignalNames.TextSize\n            }, titleAngle: {\n                signal: SignalNames.TextAngleX\n            }, titleAlign: 'left', titleFontSize: {\n                signal: SignalNames.TextTitleSize\n            }, titleColor: colorToString(specViewOptions.colors.axisText), tickSize: specViewOptions.tickSize }, axisColor);\n        if (bottomType === AxisType.quantitative) {\n            bottom.format = '~r';\n        }\n        const left = Object.assign({ orient: 'left', labelAlign: 'right', labelAngle: {\n                signal: SignalNames.TextAngleY\n            }, labelFontSize: {\n                signal: SignalNames.TextSize\n            }, titleAngle: {\n                signal: SignalNames.TextAngleY\n            }, titleAlign: 'right', titleFontSize: {\n                signal: SignalNames.TextTitleSize\n            }, titleColor: colorToString(specViewOptions.colors.axisText), tickSize: specViewOptions.tickSize }, axisColor);\n        if (leftType === AxisType.quantitative) {\n            left.format = '~r';\n        }\n        return { left, bottom };\n    }\n\n    function getAxes (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, AxisType.quantitative, columnToAxisType(specColumns.y));\n        const axes = [\n            Object.assign({ scale: ScaleNames.Y, title: specColumns.y.name }, pa.left),\n            Object.assign({ scale: BarChartScaleNames.levelScale, title: specViewOptions.language.count, encode: {\n                    labels: {\n                        update: {\n                            text: {\n                                signal: `${BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n                            }\n                        }\n                    }\n                } }, pa.bottom)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getQualitative (context) {\n        const { specColumns } = context;\n        const stackTransform = {\n            type: 'stack',\n            groupby: [\n                {\n                    field: specColumns.y.name\n                }\n            ],\n            as: [\n                FieldNames.BarChartStack0,\n                FieldNames.BarChartStack1\n            ]\n        };\n        if (specColumns.sort) {\n            stackTransform.sort = {\n                field: specColumns.sort.name\n            };\n        }\n        const transforms = [\n            stackTransform,\n            {\n                type: 'extent',\n                signal: BarChartSignalNames.levelExtentSignal,\n                field: FieldNames.BarChartStack1\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getQuantitative (context, groupBy) {\n        const { specColumns } = context;\n        const bucket_extent = 'bucket_extent';\n        const stackTransform = {\n            type: 'stack',\n            groupby: [\n                FieldNames.BarChartBin0\n            ],\n            as: [\n                FieldNames.BarChartStack0,\n                FieldNames.BarChartStack1\n            ]\n        };\n        if (groupBy) {\n            stackTransform.groupby.push(groupBy.name);\n        }\n        if (specColumns.sort) {\n            stackTransform.sort = {\n                field: specColumns.sort.name\n            };\n        }\n        const transforms = [\n            {\n                type: 'extent',\n                field: specColumns.y.name,\n                signal: bucket_extent\n            },\n            {\n                type: 'bin',\n                field: specColumns.y.name,\n                extent: {\n                    signal: bucket_extent\n                },\n                maxbins: {\n                    signal: SignalNames.YBins\n                },\n                as: [\n                    FieldNames.BarChartBin0,\n                    FieldNames.BarChartBin1\n                ],\n                signal: BarChartSignalNames.quantitativeBinSignal\n            },\n            stackTransform,\n            {\n                type: 'extent',\n                signal: BarChartSignalNames.levelExtentSignal,\n                field: FieldNames.BarChartStack1\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * Returns array with items which are truthy.\n     * @param args array or arrays to concat into a single array.\n     */\n    function allTruthy(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n    }\n\n    function topLookup(column, count) {\n        const data = [\n            {\n                name: DataNames.TopLookup,\n                source: DataNames.Main,\n                transform: [\n                    { type: 'aggregate', groupby: [column.name] },\n                    {\n                        type: 'window',\n                        ops: [\n                            'count'\n                        ],\n                        as: [\n                            FieldNames.TopIndex\n                        ]\n                    },\n                    { type: 'filter', expr: `datum.${FieldNames.TopIndex} <= ${count}` }\n                ]\n            },\n            {\n                name: DataNames.Legend,\n                source: DataNames.Main,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: DataNames.TopLookup,\n                        key: column.name,\n                        fields: [column.name],\n                        values: [column.name],\n                        as: [FieldNames.Top]\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.${FieldNames.Top} == null ? '${Other}' : datum.${FieldNames.Top}`,\n                        as: FieldNames.Top\n                    }\n                ]\n            }\n        ];\n        return data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData (context, namespace) {\n        const { specColumns, insight, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? DataNames.Pre : DataNames.Main;\n        const data = allTruthy(facetSourceData(specColumns.facet, insight.facets, DataNames.Main), categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), [\n            bucketed(context, namespace, categoricalColor ? DataNames.Legend : nestedDataName),\n            stacked(namespace, namespace.bucket, specColumns.facet && facetTransforms(specColumns.facet, insight.facets))\n        ], specColumns.y.quantitative && [\n            {\n                name: DataNames.QuantitativeData,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.start`\n                        },\n                        stop: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.stop`\n                        },\n                        step: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.step`\n                        }\n                    }\n                ]\n            }\n        ], specColumns.facet && facetGroupData(namespace.stacked));\n        return data;\n    }\n    function bucketed(context, namespace, source) {\n        const { specColumns: columns } = context;\n        const data = {\n            name: namespace.bucket,\n            source,\n            transform: columns.y.quantitative ?\n                getQuantitative(context, columns.facet)\n                :\n                    getQualitative(context)\n        };\n        return data;\n    }\n    function stacked(namespace, source, transforms) {\n        const data = {\n            name: namespace.stacked,\n            source,\n            transform: allTruthy(transforms, xy(namespace))\n        };\n        return data;\n    }\n    function xy(namespace) {\n        const transforms = [\n            {\n                type: 'formula',\n                expr: `floor(datum.${FieldNames.BarChartStack0} / ${BarChartSignalNames.compartmentsPerLevelSignal})`,\n                as: namespace.__level\n            },\n            {\n                type: 'formula',\n                expr: `datum.${FieldNames.BarChartStack0} % ${BarChartSignalNames.compartmentsPerLevelSignal}`,\n                as: namespace.__compartment\n            }\n        ];\n        return transforms;\n    }\n\n    function fill(context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const colorColumn = specColumns.color;\n        return colorColumn ?\n            colorColumn.isColorData || insight.directColor ?\n                {\n                    field: colorColumn.name\n                }\n                :\n                    {\n                        scale: ScaleNames.Color,\n                        field: colorColumn.quantitative ? colorColumn.name : FieldNames.Top\n                    }\n            :\n                {\n                    value: colorToString(specViewOptions.colors.defaultCube)\n                };\n    }\n    function opacity(context) {\n        const result = {\n            signal: SignalNames.MarkOpacity\n        };\n        return result;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function testForCollapseSelection() {\n        return `datum.${FieldNames.Collapsed}`;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks (context, namespace) {\n        const { specColumns } = context;\n        const mark = {\n            type: 'rect',\n            from: {\n                data: namespace.stacked\n            },\n            encode: {\n                update: {\n                    y: {\n                        scale: ScaleNames.Y,\n                        field: specColumns.y.quantitative ? FieldNames.BarChartBin0 : specColumns.y.name,\n                        offset: {\n                            scale: BarChartScaleNames.compartmentScale,\n                            field: namespace.__compartment\n                        }\n                    },\n                    height: [\n                        {\n                            test: `bandwidth('${BarChartScaleNames.compartmentScale}') < 1`,\n                            value: minPixelSize\n                        },\n                        {\n                            scale: BarChartScaleNames.compartmentScale,\n                            band: 1\n                        }\n                    ],\n                    x: [\n                        {\n                            scale: ScaleNames.X,\n                            test: testForCollapseSelection(),\n                            signal: `${SignalNames.XDomain}[0]`\n                        },\n                        {\n                            scale: ScaleNames.X,\n                            field: namespace.__level,\n                            band: 1,\n                            offset: {\n                                signal: `-bandwidth('${ScaleNames.X}')-1`\n                            }\n                        }\n                    ],\n                    width: [\n                        {\n                            test: testForCollapseSelection(),\n                            value: 0\n                        },\n                        {\n                            test: `bandwidth('${ScaleNames.X}') < 1`,\n                            value: minPixelSize\n                        },\n                        {\n                            scale: ScaleNames.X,\n                            band: 1\n                        }\n                    ],\n                    fill: fill(context),\n                    opacity: opacity(context)\n                }\n            }\n        };\n        if (specColumns.z) {\n            const update = mark.encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return [mark];\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function qualitativeScales (context, namespace) {\n        const { specColumns } = context;\n        const scales = [\n            {\n                name: BarChartScaleNames.bucketScale,\n                type: 'band',\n                range: 'height',\n                domain: {\n                    data: namespace.bucket,\n                    field: specColumns.y.name,\n                    sort: true\n                }\n            },\n            {\n                name: ScaleNames.Y,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'height'\n                    }\n                ],\n                padding: 0.01,\n                domain: {\n                    data: namespace.stacked,\n                    field: specColumns.y.name,\n                    sort: true\n                },\n                reverse: true\n            }\n        ];\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function quantitativeScales () {\n        const scales = [\n            {\n                name: ScaleNames.Y,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'height'\n                    }\n                ],\n                padding: 0.01,\n                domain: {\n                    data: DataNames.QuantitativeData,\n                    field: 'data',\n                    sort: true\n                },\n                reverse: true\n            }\n        ];\n        return scales;\n    }\n\n    function linearScale(name, data, field, range, reverse, zero) {\n        const scale = {\n            name,\n            type: 'linear',\n            range,\n            round: true,\n            reverse,\n            domain: {\n                data,\n                field\n            },\n            zero,\n            nice: true\n        };\n        return scale;\n    }\n    function pointScale(name, data, range, field, reverse) {\n        const scale = {\n            name,\n            type: 'point',\n            range,\n            domain: {\n                data,\n                field,\n                sort: true\n            },\n            padding: 0.5\n        };\n        if (reverse !== undefined) {\n            scale.reverse = reverse;\n        }\n        return scale;\n    }\n    function binnableColorScale(colorBin, data, field, scheme) {\n        scheme = scheme || ColorScaleNone;\n        const name = ScaleNames.Color;\n        const domain = {\n            data,\n            field\n        };\n        const range = {\n            scheme\n        };\n        const reverse = { signal: SignalNames.ColorReverse };\n        if (colorBin !== 'continuous') {\n            range.count = { signal: SignalNames.ColorBinCount };\n        }\n        switch (colorBin) {\n            case 'continuous': {\n                const sequentialScale = {\n                    name,\n                    type: 'linear',\n                    domain,\n                    range,\n                    reverse\n                };\n                return sequentialScale;\n            }\n            case 'quantile': {\n                const quantileScale = {\n                    name,\n                    type: 'quantile',\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantileScale;\n            }\n            default: {\n                const quantizeScale = {\n                    name,\n                    type: 'quantize',\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantizeScale;\n            }\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales (context, namespace) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: BarChartScaleNames.compartmentScale,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: BarChartSignalNames.compartmentHeightSignal\n                    }\n                ],\n                padding: 0.1,\n                domain: {\n                    signal: `sequence(0, ${BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n                }\n            },\n            {\n                name: BarChartScaleNames.levelScale,\n                range: [\n                    {\n                        signal: '0'\n                    },\n                    {\n                        signal: 'width'\n                    }\n                ],\n                round: true,\n                domain: {\n                    data: namespace.stacked,\n                    field: namespace.__level,\n                    sort: true\n                },\n                zero: true,\n                nice: true\n            },\n            {\n                name: ScaleNames.X,\n                type: 'band',\n                range: [\n                    {\n                        signal: '0'\n                    },\n                    {\n                        signal: 'width'\n                    }\n                ],\n                padding: 0.1,\n                round: false,\n                reverse: false,\n                align: 1,\n                domain: {\n                    data: namespace.stacked,\n                    field: namespace.__level,\n                    sort: true\n                }\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: namespace.bucket,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, true)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales.concat(specColumns.y.quantitative ? quantitativeScales() : qualitativeScales(context, namespace));\n    }\n\n    const defaultZProportion = 0.6;\n    function textSignals(context) {\n        const { specViewOptions } = context;\n        const signals = [\n            {\n                name: SignalNames.ZProportion,\n                value: defaultZProportion,\n                bind: {\n                    name: specViewOptions.language.zScaleProportion,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0.2,\n                    max: 2,\n                    step: 0.1\n                }\n            },\n            {\n                name: SignalNames.ZHeight,\n                update: `height * ${SignalNames.ZProportion}`\n            },\n            {\n                name: SignalNames.TextScale,\n                value: 2,\n                bind: {\n                    name: specViewOptions.language.textScaleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 1,\n                    max: 5,\n                    step: 0.5\n                }\n            },\n            {\n                name: SignalNames.TextSize,\n                update: `${SignalNames.TextScale} * 10`\n            },\n            {\n                name: SignalNames.TextTitleSize,\n                update: `${SignalNames.TextScale} * 15`\n            },\n            {\n                name: SignalNames.TextAngleX,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.xAxisTextAngleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0,\n                    max: 90,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.TextAngleY,\n                value: 0,\n                bind: {\n                    name: specViewOptions.language.yAxisTextAngleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: -90,\n                    max: 0,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.MarkOpacity,\n                value: 1,\n                bind: {\n                    name: specViewOptions.language.markOpacitySignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0.1,\n                    max: 1,\n                    step: 0.05\n                }\n            }\n        ];\n        return signals;\n    }\n    function colorBinCountSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorBinCount,\n            value: 7,\n            bind: {\n                name: specViewOptions.language.colorBinCount,\n                input: 'range',\n                min: 1,\n                max: specViewOptions.maxLegends + 1,\n                step: 1\n            }\n        };\n        return signal;\n    }\n    function colorReverseSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorReverse,\n            value: false,\n            bind: {\n                name: specViewOptions.language.colorReverse,\n                input: 'checkbox'\n            }\n        };\n        return signal;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals (context) {\n        const { specColumns, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            {\n                name: SignalNames.XDomain,\n                update: `domain('${ScaleNames.X}')`\n            },\n            specColumns.y.quantitative && {\n                name: SignalNames.YBins,\n                value: 7,\n                bind: {\n                    name: specViewOptions.language.YBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 20,\n                    step: 1\n                }\n            },\n            {\n                name: BarChartSignalNames.compartmentHeightSignal,\n                update: `bandwidth('${specColumns.y.quantitative ? ScaleNames.Y : BarChartScaleNames.bucketScale}')`\n            },\n            {\n                name: BarChartSignalNames.aspectRatioSignal,\n                update: `${BarChartSignalNames.compartmentHeightSignal}/width`\n            },\n            {\n                name: BarChartSignalNames.compartmentsPerLevelSignal,\n                update: `ceil(sqrt(${BarChartSignalNames.aspectRatioSignal}*${BarChartSignalNames.levelExtentSignal}[1]))`\n            },\n            colorBinCountSignal(context),\n            colorReverseSignal(context)\n        ], specColumns.facet && facetSignals(context));\n        return signals;\n    }\n\n    function legend(column) {\n        const legend = {\n            orient: 'none',\n            title: column.name,\n            fill: ScaleNames.Color,\n            encode: {\n                symbols: {\n                    update: {\n                        shape: {\n                            value: 'square'\n                        }\n                    }\n                }\n            }\n        };\n        if (column.quantitative) {\n            legend.type = 'symbol';\n            legend.format = '~r';\n        }\n        return legend;\n    }\n    function getLegends(context) {\n        const { specColumns, insight } = context;\n        if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n            return [legend(specColumns.color)];\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    class BarChartNameSpace {\n        constructor(nameSpace = '') {\n            ['bucket', 'stacked', '__compartment', '__level'].forEach(name => {\n                this[name] = `${name}${nameSpace}`;\n            });\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const barchartH = (context) => {\n        const { specColumns, insight, specViewOptions } = context;\n        const errors = [];\n        if (!specColumns.y)\n            errors.push('Must set a field for y axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.YBins]\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const rootNamespace = new BarChartNameSpace();\n        let axes;\n        if (!insight.hideAxes) {\n            axes = getAxes(context);\n        }\n        let marks;\n        if (specColumns.facet) {\n            const cellNamespace = new BarChartNameSpace('Cell');\n            const cellMarks = getMarks(context, cellNamespace);\n            const cd = specColumns.y.quantitative ?\n                [\n                    stacked(cellNamespace, DataNames.FacetGroupCell)\n                ]\n                :\n                    [\n                        bucketed(context, cellNamespace, DataNames.FacetGroupCell),\n                        stacked(cellNamespace, cellNamespace.bucket)\n                    ];\n            marks = facetMarks(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n            axes = [];\n        }\n        else {\n            marks = getMarks(context, rootNamespace);\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals(context),\n            scales: getScales(context, rootNamespace),\n            data: getData(context, rootNamespace),\n            marks\n        };\n        if (!insight.hideAxes && axes && axes.length) {\n            vegaSpec.axes = axes;\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    function getAxes$1 (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, columnToAxisType(specColumns.x), AxisType.quantitative);\n        const axes = [\n            Object.assign({ scale: ScaleNames.X, title: specColumns.x.name }, pa.bottom),\n            Object.assign({ scale: BarChartScaleNames.levelScale, title: specViewOptions.language.count, encode: {\n                    labels: {\n                        update: {\n                            text: {\n                                signal: `${BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n                            }\n                        }\n                    }\n                } }, pa.left)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getQualitative$1 (context) {\n        const { specColumns } = context;\n        const stackTransform = {\n            type: 'stack',\n            groupby: [\n                {\n                    field: specColumns.x.name\n                }\n            ],\n            as: [\n                FieldNames.BarChartStack0,\n                FieldNames.BarChartStack1\n            ]\n        };\n        if (specColumns.sort) {\n            stackTransform.sort = {\n                field: specColumns.sort.name\n            };\n        }\n        const transforms = [\n            stackTransform,\n            {\n                type: 'extent',\n                signal: BarChartSignalNames.levelExtentSignal,\n                field: FieldNames.BarChartStack1\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getQuantitative$1 (context, groupBy) {\n        const { specColumns } = context;\n        const bucket_extent = 'bucket_extent';\n        const stackTransform = {\n            type: 'stack',\n            groupby: [\n                FieldNames.BarChartBin0\n            ],\n            as: [\n                FieldNames.BarChartStack0,\n                FieldNames.BarChartStack1\n            ]\n        };\n        if (groupBy) {\n            stackTransform.groupby.push(groupBy.name);\n        }\n        if (specColumns.sort) {\n            stackTransform.sort = {\n                field: specColumns.sort.name\n            };\n        }\n        const transforms = [\n            {\n                type: 'extent',\n                field: specColumns.x.name,\n                signal: bucket_extent\n            },\n            {\n                type: 'bin',\n                field: specColumns.x.name,\n                extent: {\n                    signal: bucket_extent\n                },\n                maxbins: {\n                    signal: SignalNames.XBins\n                },\n                as: [\n                    FieldNames.BarChartBin0,\n                    FieldNames.BarChartBin1\n                ],\n                signal: BarChartSignalNames.quantitativeBinSignal\n            },\n            stackTransform,\n            {\n                type: 'extent',\n                signal: BarChartSignalNames.levelExtentSignal,\n                field: FieldNames.BarChartStack1\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$1 (context, namespace) {\n        const { specColumns, insight, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? DataNames.Pre : DataNames.Main;\n        const data = allTruthy(facetSourceData(specColumns.facet, insight.facets, DataNames.Main), categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), [\n            bucketed$1(context, namespace, categoricalColor ? DataNames.Legend : nestedDataName),\n            stacked$1(namespace, namespace.bucket, specColumns.facet && facetTransforms(specColumns.facet, insight.facets))\n        ], specColumns.x.quantitative && [\n            {\n                name: DataNames.QuantitativeData,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.start`\n                        },\n                        stop: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.stop`\n                        },\n                        step: {\n                            signal: `${BarChartSignalNames.quantitativeBinSignal}.step`\n                        }\n                    }\n                ]\n            }\n        ], specColumns.facet && facetGroupData(namespace.stacked));\n        return data;\n    }\n    function bucketed$1(context, namespace, source) {\n        const { specColumns: columns } = context;\n        const data = {\n            name: namespace.bucket,\n            source,\n            transform: columns.x.quantitative ?\n                getQuantitative$1(context, columns.facet)\n                :\n                    getQualitative$1(context)\n        };\n        return data;\n    }\n    function stacked$1(namespace, source, transforms) {\n        const data = {\n            name: namespace.stacked,\n            source,\n            transform: allTruthy(transforms, xy$1(namespace))\n        };\n        return data;\n    }\n    function xy$1(namespace) {\n        const transforms = [\n            {\n                type: 'formula',\n                expr: `floor(datum.${FieldNames.BarChartStack0} / ${BarChartSignalNames.compartmentsPerLevelSignal})`,\n                as: namespace.__level\n            },\n            {\n                type: 'formula',\n                expr: `datum.${FieldNames.BarChartStack0} % ${BarChartSignalNames.compartmentsPerLevelSignal}`,\n                as: namespace.__compartment\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$1 (context, namespace) {\n        const { specColumns } = context;\n        const mark = {\n            type: 'rect',\n            from: {\n                data: namespace.stacked\n            },\n            encode: {\n                update: {\n                    x: {\n                        scale: ScaleNames.X,\n                        field: specColumns.x.quantitative ? FieldNames.BarChartBin0 : specColumns.x.name,\n                        offset: {\n                            scale: BarChartScaleNames.compartmentScale,\n                            field: namespace.__compartment\n                        }\n                    },\n                    width: [\n                        {\n                            test: `bandwidth('${BarChartScaleNames.compartmentScale}') < 1`,\n                            value: minPixelSize\n                        },\n                        {\n                            scale: BarChartScaleNames.compartmentScale,\n                            band: 1\n                        }\n                    ],\n                    y: [\n                        {\n                            scale: ScaleNames.Y,\n                            test: testForCollapseSelection(),\n                            signal: `${SignalNames.YDomain}[0]`\n                        },\n                        {\n                            scale: ScaleNames.Y,\n                            field: namespace.__level,\n                            band: 1,\n                            offset: {\n                                signal: `-bandwidth('${ScaleNames.Y}')-1`\n                            }\n                        }\n                    ],\n                    height: [\n                        {\n                            test: testForCollapseSelection(),\n                            value: 0\n                        },\n                        {\n                            test: `bandwidth('${ScaleNames.Y}') < 1`,\n                            value: minPixelSize\n                        },\n                        {\n                            scale: ScaleNames.Y,\n                            band: 1\n                        }\n                    ],\n                    fill: fill(context),\n                    opacity: opacity(context)\n                }\n            }\n        };\n        if (specColumns.z) {\n            const update = mark.encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return [mark];\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function qualitativeScales$1 (context, namespace) {\n        const { specColumns } = context;\n        const scales = [\n            {\n                name: BarChartScaleNames.bucketScale,\n                type: 'band',\n                range: 'width',\n                domain: {\n                    data: namespace.bucket,\n                    field: specColumns.x.name,\n                    sort: true\n                }\n            },\n            {\n                name: ScaleNames.X,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'width'\n                    }\n                ],\n                padding: 0.01,\n                domain: {\n                    data: namespace.stacked,\n                    field: specColumns.x.name,\n                    sort: true\n                }\n            }\n        ];\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function quantitativeScales$1 () {\n        const scales = [\n            {\n                name: ScaleNames.X,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'width'\n                    }\n                ],\n                padding: 0.01,\n                domain: {\n                    data: DataNames.QuantitativeData,\n                    field: 'data',\n                    sort: true\n                }\n            }\n        ];\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$1 (context, namespace) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: BarChartScaleNames.compartmentScale,\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: BarChartSignalNames.compartmentWidthSignal\n                    }\n                ],\n                padding: 0.1,\n                domain: {\n                    signal: `sequence(0, ${BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n                }\n            },\n            {\n                name: BarChartScaleNames.levelScale,\n                range: [\n                    {\n                        signal: 'height'\n                    },\n                    {\n                        signal: '0'\n                    }\n                ],\n                round: true,\n                domain: {\n                    data: namespace.stacked,\n                    field: namespace.__level,\n                    sort: true\n                },\n                zero: true,\n                nice: true\n            },\n            {\n                name: ScaleNames.Y,\n                type: 'band',\n                range: [\n                    {\n                        signal: 'height'\n                    },\n                    {\n                        signal: '0'\n                    }\n                ],\n                padding: 0.1,\n                round: false,\n                reverse: false,\n                align: 1,\n                domain: {\n                    data: namespace.stacked,\n                    field: namespace.__level,\n                    sort: true\n                }\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: namespace.bucket,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, true)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales.concat(specColumns.x.quantitative ? quantitativeScales$1() : qualitativeScales$1(context, namespace));\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$1 (context) {\n        const { specColumns, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            {\n                name: SignalNames.YDomain,\n                update: `domain('${ScaleNames.Y}')`\n            },\n            specColumns.x.quantitative && {\n                name: SignalNames.XBins,\n                value: 7,\n                bind: {\n                    name: specViewOptions.language.XBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 20,\n                    step: 1\n                }\n            },\n            {\n                name: BarChartSignalNames.compartmentWidthSignal,\n                update: `bandwidth('${specColumns.x.quantitative ? ScaleNames.X : BarChartScaleNames.bucketScale}')`\n            },\n            {\n                name: BarChartSignalNames.aspectRatioSignal,\n                update: `${BarChartSignalNames.compartmentWidthSignal}/height`\n            },\n            {\n                name: BarChartSignalNames.compartmentsPerLevelSignal,\n                update: `ceil(sqrt(${BarChartSignalNames.aspectRatioSignal}*${BarChartSignalNames.levelExtentSignal}[1]))`\n            },\n            colorBinCountSignal(context),\n            colorReverseSignal(context)\n        ], specColumns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const barchartV = (context) => {\n        const { specColumns, insight, specViewOptions } = context;\n        const errors = [];\n        if (!specColumns.x)\n            errors.push('Must set a field for x axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.XBins]\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const rootNamespace = new BarChartNameSpace();\n        let axes;\n        if (!insight.hideAxes) {\n            axes = getAxes$1(context);\n        }\n        let marks;\n        if (specColumns.facet) {\n            const cellNamespace = new BarChartNameSpace('Cell');\n            const cellMarks = getMarks$1(context, cellNamespace);\n            const cd = specColumns.x.quantitative ?\n                [\n                    stacked$1(cellNamespace, DataNames.FacetGroupCell)\n                ]\n                :\n                    [\n                        bucketed$1(context, cellNamespace, DataNames.FacetGroupCell),\n                        stacked$1(cellNamespace, cellNamespace.bucket)\n                    ];\n            marks = facetMarks(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n            axes = [];\n        }\n        else {\n            marks = getMarks$1(context, rootNamespace);\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$1(context),\n            scales: getScales$1(context, rootNamespace),\n            data: getData$1(context, rootNamespace),\n            marks\n        };\n        if (!insight.hideAxes && axes && axes.length) {\n            vegaSpec.axes = axes;\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    function getAxes$2 (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, columnToAxisType(specColumns.x), columnToAxisType(specColumns.y));\n        const axes = [\n            Object.assign({ scale: 'xscale', title: specColumns.x.name, bandPosition: 0.5, grid: true, labelFlush: true }, pa.bottom),\n            Object.assign({ scale: 'yscale', title: specColumns.y.name, bandPosition: specColumns.y.quantitative ? 0 : 0.5, grid: true, labelFlush: true }, pa.left)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$2 (context) {\n        const { specColumns, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const data = allTruthy([\n            {\n                name: DataNames.Main,\n                transform: allTruthy(specColumns.x.quantitative && [\n                    {\n                        type: 'extent',\n                        field: specColumns.x.name,\n                        signal: 'var_Xextent'\n                    },\n                    {\n                        type: 'bin',\n                        field: specColumns.x.name,\n                        extent: {\n                            signal: 'var_Xextent'\n                        },\n                        maxbins: {\n                            signal: SignalNames.XBins\n                        },\n                        as: [\n                            FieldNames.DensityXBin0,\n                            FieldNames.DensityXBin1\n                        ],\n                        signal: 'binXSignal'\n                    }\n                ], specColumns.y.quantitative && [\n                    {\n                        type: 'extent',\n                        field: specColumns.y.name,\n                        signal: 'var_Yextent'\n                    },\n                    {\n                        type: 'bin',\n                        field: specColumns.y.name,\n                        extent: {\n                            signal: 'var_Yextent'\n                        },\n                        maxbins: {\n                            signal: SignalNames.YBins\n                        },\n                        as: [\n                            FieldNames.DensityYBin0,\n                            FieldNames.DensityYBin1\n                        ],\n                        signal: 'binYSignal'\n                    }\n                ])\n            }\n        ], specColumns.x.quantitative && [\n            {\n                name: 'xaxisdata',\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: 'binXSignal.start'\n                        },\n                        stop: {\n                            signal: 'binXSignal.stop'\n                        },\n                        step: {\n                            signal: 'binXSignal.step'\n                        }\n                    }\n                ]\n            }\n        ], specColumns.y.quantitative && [\n            {\n                name: 'yaxisdata',\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: 'binYSignal.start'\n                        },\n                        stop: {\n                            signal: 'binYSignal.stop'\n                        },\n                        step: {\n                            signal: 'binYSignal.step'\n                        }\n                    }\n                ]\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), [\n            {\n                name: 'aggregated',\n                source: categoricalColor ? DataNames.Legend : DataNames.Main,\n                transform: [\n                    {\n                        type: 'joinaggregate',\n                        groupby: [\n                            specColumns.x.quantitative ? FieldNames.DensityXBin0 : specColumns.x.name,\n                            specColumns.y.quantitative ? FieldNames.DensityYBin0 : specColumns.y.name\n                        ],\n                        ops: [\n                            'count'\n                        ],\n                        as: [\n                            FieldNames.DensityCount\n                        ]\n                    },\n                    windowTransform(specColumns),\n                    {\n                        type: 'extent',\n                        field: FieldNames.DensityRow,\n                        signal: 'cextent'\n                    }\n                ]\n            }\n        ]);\n        return data;\n    }\n    function windowTransform(columns) {\n        const t = {\n            type: 'window',\n            groupby: [\n                columns.x.quantitative ? FieldNames.DensityXBin0 : columns.x.name,\n                columns.y.quantitative ? FieldNames.DensityYBin0 : columns.y.name\n            ],\n            ops: [\n                'row_number'\n            ],\n            as: [\n                FieldNames.DensityRow\n            ]\n        };\n        if (columns.sort) {\n            t.sort = {\n                field: [columns.sort.name],\n                order: [\n                    'descending'\n                ]\n            };\n        }\n        return t;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$2 (context) {\n        const { specColumns } = context;\n        const mark = {\n            type: 'rect',\n            from: {\n                data: 'aggregated'\n            },\n            sort: {\n                field: [\n                    specColumns.x.name,\n                    specColumns.y.name\n                ],\n                order: [\n                    'ascending',\n                    'ascending'\n                ]\n            },\n            encode: {\n                update: {\n                    xc: {\n                        scale: 'xscale',\n                        field: specColumns.x.quantitative ? FieldNames.DensityXBin0 : specColumns.x.name,\n                        offset: {\n                            signal: `scale('sizescale', ((datum.${FieldNames.DensityRow}-1) % floor(sqrt(datum.${FieldNames.DensityCount}))))-scale('sizescale', sqrt(datum.${FieldNames.DensityCount})-2)/2`\n                        }\n                    },\n                    yc: {\n                        scale: 'yscale',\n                        field: specColumns.y.quantitative ? FieldNames.DensityYBin0 : specColumns.y.name,\n                        offset: {\n                            signal: `scale('sizescale',height/width*floor(((datum.${FieldNames.DensityRow}-1) / floor(sqrt(datum.${FieldNames.DensityCount}))))) - scale('sizescale', height/width*sqrt(datum.${FieldNames.DensityCount})+2)/2`\n                        }\n                    },\n                    width: {\n                        signal: 'unitsize'\n                    },\n                    height: {\n                        signal: 'height/width*unitsize'\n                    },\n                    fill: fill(context),\n                    opacity: opacity(context)\n                }\n            }\n        };\n        if (specColumns.z) {\n            const update = mark.encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return [mark];\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$2 (context) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: 'xscale',\n                type: 'point',\n                domain: specColumns.x.quantitative ?\n                    {\n                        data: 'xaxisdata',\n                        field: 'data',\n                        sort: true\n                    }\n                    :\n                        {\n                            data: DataNames.Main,\n                            field: specColumns.x.name,\n                            sort: true\n                        },\n                range: 'width',\n                padding: 0.5\n            },\n            {\n                name: 'yscale',\n                type: 'point',\n                domain: specColumns.y.quantitative ?\n                    {\n                        data: 'yaxisdata',\n                        field: 'data',\n                        sort: true\n                    }\n                    :\n                        {\n                            data: DataNames.Main,\n                            field: specColumns.y.name,\n                            sort: true\n                        },\n                range: 'height',\n                reverse: true,\n                padding: 0.5\n            },\n            {\n                name: 'sizescale',\n                type: 'linear',\n                domain: [\n                    0,\n                    {\n                        signal: 'sqrt(cextent[1])'\n                    }\n                ],\n                range: [\n                    0,\n                    {\n                        signal: 'width/max(xsize,ysize)'\n                    }\n                ]\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, true)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$2 (context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            colorBinCountSignal(context),\n            colorReverseSignal(context),\n            {\n                name: 'unitpad',\n                value: 0.1,\n                bind: {\n                    name: SignalNames.InnerPadding,\n                    input: 'range',\n                    min: 0.1,\n                    max: 1.0,\n                    step: 0.1\n                }\n            },\n            {\n                name: 'xsize',\n                update: 'domain(\\'xscale\\').length'\n            },\n            {\n                name: 'ysize',\n                update: 'domain(\\'yscale\\').length'\n            },\n            {\n                name: 'cellwidth',\n                update: 'width/max(xsize,ysize)'\n            },\n            {\n                name: 'maxnumbers',\n                update: 'sqrt(cextent[1])'\n            },\n            {\n                name: 'unitsize',\n                update: 'cellwidth/((1 + unitpad)*maxnumbers)'\n            },\n            specColumns.x.quantitative && {\n                name: SignalNames.XBins,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.XBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 60,\n                    step: 1\n                }\n            },\n            specColumns.y.quantitative && {\n                name: SignalNames.YBins,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.YBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 60,\n                    step: 1\n                }\n            }\n        ], insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const density = (context) => {\n        const { specColumns, insight } = context;\n        const errors = [];\n        if (!specColumns.x)\n            errors.push('Must set a field for x axis');\n        if (!specColumns.y)\n            errors.push('Must set a field for y axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.XBins]\n                },\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.YBins]\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$2(context),\n            data: getData$2(context),\n            scales: getScales$2(context),\n            marks: getMarks$2(context)\n        };\n        if (!insight.hideAxes) {\n            vegaSpec.axes = getAxes$2(context);\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$3 (context) {\n        const { specColumns, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const data = allTruthy([\n            {\n                name: DataNames.Main,\n                transform: allTruthy([\n                    specColumns.sort && {\n                        type: 'collect',\n                        sort: { field: specColumns.sort.name }\n                    },\n                    {\n                        type: 'window',\n                        ops: [\n                            'count'\n                        ],\n                        as: [\n                            FieldNames.GridIndex\n                        ]\n                    }\n                ])\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends));\n        return data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const ColumnCount = 'columncount';\n    const RowCount = 'rowcount';\n    const Total = 'total';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$3 (context, data) {\n        const { specColumns } = context;\n        const marks = [\n            {\n                type: 'rect',\n                from: {\n                    data\n                },\n                encode: {\n                    update: {\n                        x: {\n                            signal: `(datum.${FieldNames.GridIndex}-1)%${ColumnCount}`,\n                            scale: ScaleNames.X\n                        },\n                        width: {\n                            scale: ScaleNames.X,\n                            band: true\n                        },\n                        y: {\n                            signal: `floor((datum.${FieldNames.GridIndex}-1)/${ColumnCount})`,\n                            scale: ScaleNames.Y\n                        },\n                        height: {\n                            scale: ScaleNames.Y,\n                            band: true\n                        },\n                        fill: fill(context),\n                        opacity: opacity(context)\n                    }\n                }\n            }\n        ];\n        if (specColumns.z) {\n            const update = marks[0].encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return marks;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$3 (context) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: ScaleNames.X,\n                type: 'band',\n                domain: {\n                    signal: `sequence(0, ${ColumnCount}, 1)`\n                },\n                range: 'width',\n                paddingInner: 0.1,\n                paddingOuter: 0\n            },\n            {\n                name: ScaleNames.Y,\n                type: 'band',\n                domain: {\n                    signal: `sequence(0, ${RowCount}, 1)`\n                },\n                range: 'height',\n                paddingInner: 0.1,\n                paddingOuter: 0\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, false)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$3 (context) {\n        const { insight } = context;\n        const signals = allTruthy(textSignals(context), [\n            colorBinCountSignal(context),\n            {\n                name: Total,\n                update: `data('${DataNames.Main}').length`\n            },\n            {\n                name: ColumnCount,\n                update: `ceil(sqrt((width/height)*${Total}))`\n            },\n            {\n                name: RowCount,\n                update: `${Total}/${ColumnCount}`\n            },\n            colorReverseSignal(context)\n        ], insight.columns && insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const grid = (context) => {\n        const { specColumns, insight } = context;\n        const errors = [];\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const dataName = categoricalColor ? DataNames.Legend : DataNames.Main;\n        const size = insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$3(context),\n            scales: getScales$3(context),\n            data: getData$3(context),\n            marks: getMarks$3(context, dataName)\n        };\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        //use autosize only when not faceting\n        vegaSpec.autosize = 'fit';\n        return { vegaSpec, specCapabilities };\n    };\n\n    function getAxes$3 (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, columnToAxisType(specColumns.x), columnToAxisType(specColumns.y));\n        const axes = [\n            Object.assign({ scale: ScaleNames.X, title: specColumns.x.name }, pa.bottom),\n            Object.assign({ scale: ScaleNames.Y, title: specColumns.y.name }, pa.left)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$4 (context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const ScatterDataName = 'SandDanceScatterPlotData';\n        const data = allTruthy(facetSourceData(specColumns.facet, insight.facets, ScatterDataName), [\n            {\n                name: DataNames.Main,\n                source: ScatterDataName,\n                transform: allTruthy(filterInvalidWhenNumeric(specColumns.x), filterInvalidWhenNumeric(specColumns.y), filterInvalidWhenNumeric(specColumns.z), specColumns.facet && facetTransforms(specColumns.facet, insight.facets))\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), specColumns.facet && facetGroupData(DataNames.Main));\n        return data;\n    }\n    function filterInvalidWhenNumeric(column) {\n        if (column && column.quantitative) {\n            const transforms = [\n                {\n                    type: 'filter',\n                    expr: `datum[${JSON.stringify(column.name)}] != null`\n                }\n            ];\n            return transforms;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$4 (context) {\n        const { specColumns } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const marks = [\n            {\n                type: 'rect',\n                from: {\n                    data: categoricalColor ? DataNames.Legend : DataNames.Main\n                },\n                encode: {\n                    update: {\n                        x: {\n                            scale: ScaleNames.X,\n                            field: specColumns.x.name,\n                            offset: 1\n                        },\n                        width: { signal: SignalNames.PointSize },\n                        y: [\n                            {\n                                scale: ScaleNames.Y,\n                                test: testForCollapseSelection(),\n                                signal: `${SignalNames.YDomain}[0]`\n                            },\n                            {\n                                scale: ScaleNames.Y,\n                                field: specColumns.y.name,\n                                offset: {\n                                    signal: `-${SignalNames.PointSize}`\n                                }\n                            }\n                        ],\n                        height: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0\n                            },\n                            {\n                                signal: SignalNames.PointSize\n                            }\n                        ],\n                        fill: fill(context),\n                        opacity: opacity(context)\n                    }\n                }\n            }\n        ];\n        if (specColumns.z) {\n            const update = marks[0].encode.update;\n            update.z = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n            update.depth = { signal: SignalNames.PointSize };\n        }\n        return marks;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$4 (context) {\n        const { specColumns, insight } = context;\n        const scales = [\n            (specColumns.x.quantitative ?\n                linearScale(ScaleNames.X, DataNames.Main, specColumns.x.name, 'width', false, false)\n                :\n                    pointScale(ScaleNames.X, DataNames.Main, 'width', specColumns.x.name)),\n            (specColumns.y.quantitative ?\n                linearScale(ScaleNames.Y, DataNames.Main, specColumns.y.name, 'height', false, false)\n                :\n                    pointScale(ScaleNames.Y, DataNames.Main, 'height', specColumns.y.name, true))\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, false)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$4 (context) {\n        const { insight, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            {\n                name: SignalNames.YDomain,\n                update: `domain('${ScaleNames.Y}')`\n            },\n            {\n                name: SignalNames.PointSize,\n                value: 5,\n                bind: {\n                    name: specViewOptions.language.scatterPointSize,\n                    debounce: 50,\n                    input: 'range',\n                    min: 1,\n                    max: 25,\n                    step: 1\n                }\n            },\n            colorBinCountSignal(context),\n            colorReverseSignal(context)\n        ], insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const scatterplot = (context) => {\n        const { specColumns, insight, specViewOptions } = context;\n        const errors = [];\n        if (!specColumns.x)\n            errors.push('Must set a field for x axis');\n        if (!specColumns.y)\n            errors.push('Must set a field for y axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'x',\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact'\n                },\n                {\n                    role: 'y',\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact'\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true\n                }\n            ],\n            signals: [SignalNames.PointSize]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        let axes;\n        if (!insight.hideAxes) {\n            axes = getAxes$3(context);\n        }\n        let marks = getMarks$4(context);\n        if (specColumns.facet) {\n            marks = facetMarks(specViewOptions, marks[0].from.data, marks, axes);\n            axes = [];\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$4(context),\n            data: getData$4(context),\n            scales: getScales$4(context),\n            marks\n        };\n        if (!insight.hideAxes && axes && axes.length) {\n            vegaSpec.axes = axes;\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    function getAxes$4 (context) {\n        const { specColumns, specViewOptions } = context;\n        const pa = partialAxes(specViewOptions, columnToAxisType(specColumns.x), columnToAxisType(specColumns.y));\n        const axes = [\n            Object.assign({ scale: 'xband', title: specColumns.x.name, bandPosition: 0.5, grid: true, labelFlush: true }, pa.bottom),\n            Object.assign({ scale: 'yband', title: specColumns.y.name, bandPosition: specColumns.y.quantitative ? 0 : 0.5, grid: true, labelFlush: true }, pa.left)\n        ];\n        return axes;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$5 (context) {\n        const { specColumns, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const data = allTruthy([\n            {\n                name: DataNames.Main,\n                transform: allTruthy([\n                    {\n                        type: 'extent',\n                        field: specColumns.x.name,\n                        signal: 'long_extent'\n                    },\n                    {\n                        type: 'extent',\n                        field: specColumns.y.name,\n                        signal: 'lat_extent'\n                    },\n                    specColumns.x.quantitative && {\n                        type: 'bin',\n                        field: specColumns.x.name,\n                        extent: {\n                            signal: 'long_extent'\n                        },\n                        maxbins: {\n                            signal: SignalNames.XBins\n                        },\n                        nice: false,\n                        as: [\n                            FieldNames.StacksLongBin0,\n                            FieldNames.StacksLongBin1\n                        ],\n                        signal: 'binXSignal'\n                    },\n                    specColumns.y.quantitative && {\n                        type: 'bin',\n                        field: specColumns.y.name,\n                        extent: {\n                            signal: 'lat_extent'\n                        },\n                        nice: false,\n                        maxbins: {\n                            signal: SignalNames.YBins\n                        },\n                        as: [\n                            FieldNames.StacksLatBin0,\n                            FieldNames.StacksLatBin1\n                        ],\n                        signal: 'binYSignal'\n                    }\n                ])\n            }\n        ], specColumns.x.quantitative && [\n            {\n                name: 'xaxisdata',\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: 'binXSignal.start'\n                        },\n                        stop: {\n                            signal: 'binXSignal.stop'\n                        },\n                        step: {\n                            signal: 'binXSignal.step'\n                        }\n                    }\n                ]\n            }\n        ], specColumns.y.quantitative && [\n            {\n                name: 'yaxisdata',\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: 'binYSignal.start'\n                        },\n                        stop: {\n                            signal: 'binYSignal.stop'\n                        },\n                        step: {\n                            signal: 'binYSignal.step'\n                        }\n                    }\n                ]\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), [\n            {\n                name: 'stackedgroup',\n                source: categoricalColor ? DataNames.Legend : DataNames.Main,\n                transform: [\n                    stackTransform(specColumns.sort, specColumns.x, specColumns.y),\n                    {\n                        type: 'extent',\n                        signal: 'xtent',\n                        field: FieldNames.StacksStart\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.${FieldNames.StacksEnd} % columns`,\n                        as: '_columns'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `floor(datum.${FieldNames.StacksStart} / columns)`,\n                        as: 'row'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.${FieldNames.StacksStart} % ${SignalNames.XGridSize}`,\n                        as: 'column'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `floor((datum.${FieldNames.StacksStart} % columns)/ ${SignalNames.XGridSize})`,\n                        as: 'depth'\n                    },\n                    {\n                        type: 'extent',\n                        signal: 'rowxtent',\n                        field: 'row'\n                    }\n                ]\n            }\n        ]);\n        return data;\n    }\n    function stackTransform(sortColumn, xColumn, yColumn) {\n        const st = {\n            type: 'stack',\n            groupby: [\n                yColumn.quantitative ? FieldNames.StacksLatBin0 : yColumn.name,\n                xColumn.quantitative ? FieldNames.StacksLongBin0 : xColumn.name\n            ],\n            as: [\n                FieldNames.StacksStart,\n                FieldNames.StacksEnd\n            ]\n        };\n        if (sortColumn) {\n            st.sort = {\n                field: sortColumn.name\n            };\n        }\n        return st;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$5 (context) {\n        const { specColumns } = context;\n        const marks = [\n            {\n                name: 'marks2',\n                type: 'rect',\n                from: {\n                    data: 'stackedgroup'\n                },\n                encode: {\n                    update: {\n                        x: {\n                            scale: 'xband',\n                            field: specColumns.x.quantitative ? FieldNames.StacksLongBin0 : specColumns.x.name,\n                            offset: {\n                                scale: 'xinternalscale',\n                                field: 'column'\n                            }\n                        },\n                        y: {\n                            scale: 'yband',\n                            field: specColumns.y.quantitative ? FieldNames.StacksLatBin0 : specColumns.y.name,\n                            offset: {\n                                scale: 'yinternalscale',\n                                field: 'depth'\n                            }\n                        },\n                        z: {\n                            scale: 'zband',\n                            field: 'row'\n                        },\n                        depth: {\n                            scale: 'zband',\n                            band: true\n                        },\n                        width: {\n                            signal: 'actsize'\n                        },\n                        height: {\n                            signal: 'actsize'\n                        },\n                        fill: fill(context),\n                        opacity: opacity(context)\n                    }\n                }\n            }\n        ];\n        return marks;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$5 (context) {\n        const { specColumns, insight } = context;\n        const scales = [\n            {\n                name: 'xband',\n                type: 'band',\n                domain: specColumns.x.quantitative ?\n                    {\n                        data: 'xaxisdata',\n                        field: 'data',\n                        sort: true\n                    }\n                    :\n                        {\n                            data: DataNames.Main,\n                            field: specColumns.x.quantitative ? FieldNames.StacksLongBin0 : specColumns.x.name,\n                            sort: true\n                        },\n                range: [\n                    0,\n                    {\n                        signal: 'width'\n                    }\n                ],\n                padding: { signal: SignalNames.OuterPadding },\n                round: true\n            },\n            {\n                name: 'yband',\n                type: 'band',\n                reverse: true,\n                domain: specColumns.y.quantitative ?\n                    {\n                        data: 'yaxisdata',\n                        field: 'data',\n                        sort: true\n                    }\n                    :\n                        {\n                            data: DataNames.Main,\n                            field: specColumns.y.quantitative ? FieldNames.StacksLatBin0 : specColumns.y.name,\n                            sort: true\n                        },\n                range: 'height',\n                padding: { signal: SignalNames.OuterPadding },\n                round: true\n            },\n            {\n                name: 'zband',\n                type: 'band',\n                reverse: false,\n                domain: {\n                    data: 'stackedgroup',\n                    field: 'row',\n                    sort: true\n                },\n                align: 0.0,\n                range: [\n                    0,\n                    {\n                        signal: 'countheight'\n                    }\n                ],\n                padding: { signal: SignalNames.InnerPadding },\n                round: false\n            },\n            {\n                name: 'xinternalscale',\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'xbandw'\n                    }\n                ],\n                padding: {\n                    signal: SignalNames.InnerPadding\n                },\n                domain: {\n                    data: 'stackedgroup',\n                    field: 'column',\n                    sort: true\n                }\n            },\n            {\n                name: 'yinternalscale',\n                type: 'band',\n                range: [\n                    0,\n                    {\n                        signal: 'ybandw'\n                    }\n                ],\n                padding: {\n                    signal: SignalNames.InnerPadding\n                },\n                domain: {\n                    data: 'stackedgroup',\n                    field: 'depth',\n                    sort: true\n                }\n            }\n        ];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$5 (context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            colorBinCountSignal(context),\n            colorReverseSignal(context),\n            {\n                name: SignalNames.XGridSize,\n                value: 3,\n                bind: {\n                    name: specViewOptions.language.XGridSize,\n                    input: 'range',\n                    min: 1,\n                    max: 20,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.YGridSize,\n                value: 3,\n                bind: {\n                    name: specViewOptions.language.YGridSize,\n                    input: 'range',\n                    min: 1,\n                    max: 20,\n                    step: 1\n                }\n            },\n            specColumns.x.quantitative && {\n                name: SignalNames.XBins,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.XBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 60,\n                    step: 1\n                }\n            },\n            specColumns.y.quantitative && {\n                name: SignalNames.YBins,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.YBinSize,\n                    input: 'range',\n                    min: 1,\n                    max: 60,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.InnerPadding,\n                value: 0.1,\n                bind: {\n                    name: specViewOptions.language.InnerPaddingSize,\n                    input: 'range',\n                    min: 0.1,\n                    max: 0.6,\n                    step: 0.1\n                }\n            },\n            {\n                name: SignalNames.OuterPadding,\n                value: 0.2,\n                bind: {\n                    name: specViewOptions.language.OuterPaddingSize,\n                    input: 'range',\n                    min: 0.1,\n                    max: 0.6,\n                    step: 0.1\n                }\n            },\n            {\n                name: 'columns',\n                update: `${SignalNames.XGridSize}*${SignalNames.YGridSize}`\n            },\n            {\n                name: 'xbandw',\n                update: 'bandwidth(\\'xband\\')'\n            },\n            {\n                name: 'xbandsize',\n                update: `(xbandw / (${SignalNames.XGridSize} + ${SignalNames.InnerPadding}))*(1-${SignalNames.InnerPadding})`\n            },\n            {\n                name: 'ybandw',\n                update: `height/((${specColumns.y.quantitative ? SignalNames.YBins : specColumns.y.stats.distinctValueCount}) * (1 + ${SignalNames.OuterPadding}))`\n            },\n            {\n                name: 'ybandsize',\n                update: `(ybandw / (${SignalNames.YGridSize} + ${SignalNames.InnerPadding}))*(1-${SignalNames.InnerPadding})`\n            },\n            {\n                name: 'actsize',\n                update: 'min(xbandsize,ybandsize)'\n            },\n            {\n                name: 'countheight',\n                update: `rowxtent[1]*actsize*${SignalNames.ZProportion}/${defaultZProportion}`\n            }\n        ], insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const stacks = (context) => {\n        const { specColumns, insight } = context;\n        const errors = [];\n        if (!specColumns.x)\n            errors.push('Must set a field for x axis');\n        if (!specColumns.y)\n            errors.push('Must set a field for y axis');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.XBins]\n                },\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                    signals: [SignalNames.YBins]\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                }\n            ]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$5(context),\n            data: getData$5(context),\n            scales: getScales$5(context),\n            marks: getMarks$5(context)\n        };\n        if (!insight.hideAxes) {\n            vegaSpec.axes = getAxes$4(context);\n        }\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getData$6 (context) {\n        const { specColumns, insight, specViewOptions } = context;\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const TreeMapDataName = 'SandDanceTreeMapData';\n        const data = allTruthy(facetSourceData(specColumns.facet, insight.facets, TreeMapDataName), [\n            {\n                name: DataNames.Main,\n                source: TreeMapDataName,\n                transform: allTruthy(specColumns.facet && facetTransforms(specColumns.facet, insight.facets), !specColumns.facet && treemapTransforms(insight))\n            }\n        ], categoricalColor && topLookup(specColumns.color, specViewOptions.maxLegends), specColumns.facet && facetGroupData(DataNames.Main));\n        return data;\n    }\n    function treemapTransforms(insight) {\n        const transforms = [\n            {\n                type: 'nest',\n                keys: [insight.columns.group || '__NONE__']\n            },\n            {\n                type: 'treemap',\n                field: insight.columns.size,\n                sort: { field: 'value', order: 'descending' },\n                round: true,\n                method: { signal: SignalNames.TreeMapMethod },\n                padding: 1,\n                size: [{ signal: 'width' }, { signal: 'height' }],\n                as: [\n                    FieldNames.TreemapStackX0,\n                    FieldNames.TreemapStackY0,\n                    FieldNames.TreemapStackX1,\n                    FieldNames.TreemapStackY1,\n                    FieldNames.TreemapStackDepth,\n                    FieldNames.TreemapStackChildren\n                ]\n            }\n        ];\n        return transforms;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getMarks$6 (context, data) {\n        const { specColumns } = context;\n        const marks = [\n            {\n                type: 'rect',\n                from: {\n                    data\n                },\n                encode: {\n                    update: {\n                        x: { field: FieldNames.TreemapStackX0 },\n                        y: { field: FieldNames.TreemapStackY0 },\n                        x2: { field: FieldNames.TreemapStackX1 },\n                        y2: { field: FieldNames.TreemapStackY1 },\n                        fill: fill(context),\n                        opacity: opacity(context)\n                    }\n                }\n            }\n        ];\n        if (specColumns.z) {\n            const update = marks[0].encode.update;\n            update.z = {\n                value: 0\n            };\n            update.depth = [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0\n                },\n                {\n                    scale: ScaleNames.Z,\n                    field: specColumns.z.name\n                }\n            ];\n        }\n        return marks;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getScales$6 (context) {\n        const { specColumns, insight } = context;\n        const scales = [];\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                scales.push(binnableColorScale(insight.colorBin, DataNames.Main, specColumns.color.name, insight.scheme));\n            }\n            else {\n                scales.push({\n                    name: ScaleNames.Color,\n                    type: 'ordinal',\n                    domain: {\n                        data: DataNames.Legend,\n                        field: FieldNames.Top,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: SignalNames.ColorReverse }\n                });\n            }\n        }\n        if (specColumns.z) {\n            const zRange = [0, { signal: SignalNames.ZHeight }];\n            scales.push(specColumns.z.quantitative ?\n                linearScale(ScaleNames.Z, DataNames.Main, specColumns.z.name, zRange, false, false)\n                :\n                    pointScale(ScaleNames.Z, DataNames.Main, zRange, specColumns.z.name));\n        }\n        return scales;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSignals$6 (context) {\n        const { insight, specViewOptions } = context;\n        const signals = allTruthy(textSignals(context), [\n            colorBinCountSignal(context),\n            {\n                name: SignalNames.TreeMapMethod,\n                value: 'squarify',\n                bind: {\n                    name: specViewOptions.language.treeMapMethod,\n                    input: 'select',\n                    options: [\n                        'squarify', 'binary'\n                    ]\n                }\n            },\n            colorReverseSignal(context)\n        ], insight.columns.facet && facetSignals(context));\n        return signals;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const treemap = (context) => {\n        const { specColumns, insight, specViewOptions } = context;\n        const errors = [];\n        if (!specColumns.size)\n            errors.push('Must set a field for size');\n        checkForFacetErrors(insight.facets, errors);\n        const specCapabilities = {\n            roles: [\n                {\n                    role: 'size',\n                    excludeCategoric: true\n                },\n                {\n                    role: 'group',\n                    allowNone: true\n                },\n                {\n                    role: 'z',\n                    allowNone: true\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true\n                }\n            ],\n            signals: [SignalNames.TreeMapMethod]\n        };\n        if (errors.length) {\n            return {\n                errors,\n                specCapabilities,\n                vegaSpec: null,\n            };\n        }\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        const dataName = categoricalColor ? DataNames.Legend : DataNames.Main;\n        const TreeMapName = 'SandDanceTreeMapFaceted';\n        const data = getData$6(context);\n        let marks = getMarks$6(context, specColumns.facet ? TreeMapName : dataName);\n        if (specColumns.facet) {\n            const childData = {\n                name: TreeMapName,\n                source: DataNames.FacetGroupCell,\n                transform: treemapTransforms(insight)\n            };\n            marks = facetMarks(specViewOptions, dataName, marks, null, [childData]);\n            marks[0].marks;\n        }\n        const size = specColumns.facet ? facetSize(context) : insight.size;\n        var vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v3.json',\n            height: size.height,\n            width: size.width,\n            signals: getSignals$6(context),\n            data,\n            scales: getScales$6(context),\n            marks\n        };\n        const legends = getLegends(context);\n        if (legends) {\n            vegaSpec.legends = legends;\n        }\n        if (specColumns.facet) {\n            vegaSpec.layout = layout(context);\n        }\n        else {\n            //use autosize only when not faceting\n            vegaSpec.autosize = 'fit';\n        }\n        return { vegaSpec, specCapabilities };\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const creators = {\n        barchart: barchartV,\n        barchartH,\n        barchartV,\n        density,\n        grid,\n        scatterplot,\n        stacks,\n        treemap\n    };\n    function create(context) {\n        const { insight } = context;\n        const creator = creators[insight.chart];\n        if (creator) {\n            const specResult = creator(context);\n            //TODO: find why Vega is doing this. fixup for facets\n            if (specResult.vegaSpec && insight.columns && insight.columns.facet && insight.facets.columns === 2 && insight.facets.rows === 1) {\n                specResult.vegaSpec.width = insight.size.width / 3;\n            }\n            return specResult;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function cloneVegaSpecWithData(context, currData) {\n        const { specColumns } = context;\n        const columns = [\n            specColumns.color,\n            specColumns.facet,\n            specColumns.group,\n            specColumns.size,\n            specColumns.sort,\n            specColumns.x,\n            specColumns.y,\n            specColumns.z\n        ];\n        inferAll(columns, currData);\n        const specResult = create(context);\n        if (!specResult.errors) {\n            const data0 = specResult.vegaSpec.data[0];\n            data0.values = currData;\n        }\n        return specResult;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function valueToBoolean(value) {\n        if (typeof value === 'string') {\n            switch (value.toLowerCase()) {\n                case 'true':\n                    return true;\n                case 'false':\n                    return false;\n            }\n        }\n        return !!value;\n    }\n    function valueToString(value) {\n        if (value == null) {\n            return '';\n        }\n        switch (typeof value) {\n            case 'string':\n                return value;\n            case 'boolean':\n            case 'number':\n                return value.toString();\n        }\n        return '';\n    }\n    function isStringOperation(ex) {\n        switch (ex.operator) {\n            case 'contains':\n            case '!contains':\n            case 'starts':\n            case '!starts':\n                return true;\n        }\n        return false;\n    }\n    function isnullorEmpty(value) {\n        if (value == null)\n            return true; //double equal sign to also catch undefined\n        if (typeof value === 'string' && value.length === 0)\n            return true;\n        return false;\n    }\n    class Exec {\n        constructor(search, columns) {\n            this.columns = columns;\n            this.groups = clone(ensureSearchExpressionGroupArray(search));\n            this.groups.forEach(group => {\n                group.expressions.forEach(ex => {\n                    ex.column = this.getColumn(ex.name);\n                    ex.valueBool = valueToBoolean(ex.value);\n                    ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n                    ex.stringOperation = isStringOperation(ex);\n                });\n            });\n        }\n        getColumn(name) {\n            for (let i = 0; i < this.columns.length; i++) {\n                if (this.columns[i].name == name) {\n                    return this.columns[i];\n                }\n            }\n        }\n        runExpressionOnColumn(datum, ex) {\n            const actualDataValue = datum[ex.name];\n            if (ex.operator === 'isnullorEmpty') {\n                return isnullorEmpty(actualDataValue);\n            }\n            else if (ex.operator === '!isnullorEmpty') {\n                return !isnullorEmpty(actualDataValue);\n            }\n            let dataValue = actualDataValue;\n            let expressionValue = ex.value;\n            if (ex.column) {\n                if (ex.column.type === 'string' || ex.stringOperation) {\n                    dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n                    expressionValue = ex.valueLow;\n                }\n                else if (ex.column.type === 'boolean') {\n                    dataValue = valueToBoolean(actualDataValue);\n                    expressionValue = ex.valueBool;\n                }\n                else if (ex.column.quantitative) {\n                    dataValue = +actualDataValue;\n                    expressionValue = +ex.value;\n                }\n            }\n            switch (ex.operator) {\n                case '!=':\n                    return dataValue != expressionValue;\n                case '<':\n                    return dataValue < expressionValue;\n                case '<=':\n                    return dataValue <= expressionValue;\n                case '==':\n                    return dataValue == expressionValue;\n                case '>':\n                    return dataValue > expressionValue;\n                case '>=':\n                    return dataValue >= expressionValue;\n                case 'contains':\n                    return dataValue.indexOf(expressionValue) >= 0;\n                case '!contains':\n                    return dataValue.indexOf(expressionValue) < 0;\n                case 'starts':\n                    return dataValue.indexOf(expressionValue) == 0;\n                case '!starts':\n                    return dataValue.indexOf(expressionValue) !== 0;\n            }\n        }\n        runExpression(datum, ex) {\n            if (ex.name == null) {\n                //run on all columns\n                const group = {\n                    expressions: this.columns.map((column, i) => {\n                        const ex2 = Object.assign(Object.assign({}, ex), { column, name: column.name });\n                        if (i) {\n                            ex2.clause = '||';\n                        }\n                        return ex2;\n                    })\n                };\n                return this.runGroup(datum, group);\n            }\n            else {\n                return this.runExpressionOnColumn(datum, ex);\n            }\n        }\n        runGroup(datum, group) {\n            let accumulator = this.runExpression(datum, group.expressions[0]);\n            for (let i = 1; i < group.expressions.length; i++) {\n                let ex = group.expressions[i];\n                switch (ex.clause) {\n                    case '&&':\n                        accumulator = accumulator && this.runExpression(datum, ex);\n                        break;\n                    case '||':\n                        accumulator = accumulator || this.runExpression(datum, ex);\n                        break;\n                }\n            }\n            return accumulator;\n        }\n        run(datum) {\n            let accumulator = this.runGroup(datum, this.groups[0]);\n            for (let i = 1; i < this.groups.length; i++) {\n                let group = this.groups[i];\n                switch (group.clause) {\n                    case '&&':\n                        accumulator = accumulator && this.runGroup(datum, group);\n                        break;\n                    case '||':\n                        accumulator = accumulator || this.runGroup(datum, group);\n                        break;\n                }\n            }\n            return accumulator;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class DataScope {\n        constructor() {\n            this.filteredColumnsStats = {};\n        }\n        setData(data, columns) {\n            const differentData = this.data !== data;\n            if (differentData) {\n                if (this.data) {\n                    //clean up things we added to old data\n                    this.deselect();\n                }\n                this.data = data;\n                this.columns = columns;\n                this.filteredData = null;\n                this.filteredColumnsStats = {};\n            }\n            return differentData;\n        }\n        setFilteredData(filteredData) {\n            this.filteredData = filteredData;\n            this.filteredColumnsStats = {};\n        }\n        getColumns(columnTypes) {\n            if (!this.columns) {\n                this.columns = getColumnsFromData(this.data, columnTypes);\n            }\n            return this.columns;\n        }\n        getFilteredColumnStats(columnName) {\n            if (!this.filteredColumnsStats[columnName]) {\n                this.filteredColumnsStats[columnName] = getStats(this.filteredData, this.columns.filter(c => c.name === columnName)[0]);\n            }\n            return this.filteredColumnsStats[columnName];\n        }\n        currentData() {\n            return this.filteredData || this.data;\n        }\n        select(search) {\n            this.deselect();\n            if (search) {\n                this.selection = this.createUserSelection(search, true);\n                if (this.selection.included.length) {\n                    this.activate(this.selection.included[0]);\n                }\n            }\n        }\n        createUserSelection(search, assign) {\n            const exec = new Exec(search, this.getColumns());\n            const s = {\n                search,\n                included: [],\n                excluded: []\n            };\n            this.currentData().forEach(datum => {\n                if (exec.run(datum)) {\n                    if (assign) {\n                        datum[FieldNames.Selected] = true;\n                    }\n                    s.included.push(datum);\n                }\n                else {\n                    s.excluded.push(datum);\n                }\n            });\n            return s;\n        }\n        deselect() {\n            this.deactivate();\n            this.data.forEach(datum => {\n                delete datum[FieldNames.Selected];\n            });\n            this.selection = null;\n        }\n        hasFilteredData() {\n            return !!this.filteredData;\n        }\n        hasSelectedData() {\n            return !!this.selection;\n        }\n        collapse(collapsed, data = this.data) {\n            data.forEach(datum => {\n                datum[FieldNames.Collapsed] = collapsed;\n            });\n            this.isCollapsed = collapsed;\n        }\n        activate(datum) {\n            this.deactivate();\n            datum[FieldNames.Active] = true;\n            this.active = datum;\n        }\n        deactivate() {\n            if (this.active) {\n                delete this.active[FieldNames.Active];\n            }\n            this.active = null;\n        }\n        ordinalIndexWithinSelection(ordinal) {\n            if (this.selection) {\n                for (let i = 0; i < this.selection.included.length; i++) {\n                    let datum = this.selection.included[i];\n                    if (datum[GL_ORDINAL] === ordinal) {\n                        return { datum, index: i };\n                    }\n                }\n            }\n            return { datum: null, index: -1 };\n        }\n        finalize() {\n            this.data = null;\n            this.filteredData = null;\n            this.filteredColumnsStats = null;\n            if (this.selection) {\n                this.selection.excluded = null;\n                this.selection.included = null;\n                this.selection = null;\n            }\n        }\n    }\n\n    var xregexp$2 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n    /*!\n     * XRegExp 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2007-2017 MIT License\n     */\n\n    /**\n     * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and\n     * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to\n     * make your client-side grepping simpler and more powerful, while freeing you from related\n     * cross-browser inconsistencies.\n     */\n\n    // ==--------------------------==\n    // Private stuff\n    // ==--------------------------==\n\n    // Property name used for extended regex instance data\n    var REGEX_DATA = 'xregexp';\n    // Optional features that can be installed and uninstalled\n    var features = {\n        astral: false\n    };\n    // Native methods to use and restore ('native' is an ES3 reserved keyword)\n    var nativ = {\n        exec: RegExp.prototype.exec,\n        test: RegExp.prototype.test,\n        match: String.prototype.match,\n        replace: String.prototype.replace,\n        split: String.prototype.split\n    };\n    // Storage for fixed/extended native methods\n    var fixed = {};\n    // Storage for regexes cached by `XRegExp.cache`\n    var regexCache = {};\n    // Storage for pattern details cached by the `XRegExp` constructor\n    var patternCache = {};\n    // Storage for regex syntax tokens added internally or by `XRegExp.addToken`\n    var tokens = [];\n    // Token scopes\n    var defaultScope = 'default';\n    var classScope = 'class';\n    // Regexes that match native regex syntax, including octals\n    var nativeTokens = {\n        // Any native multicharacter token in default scope, or any single character\n        'default': /\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|\\(\\?(?:[:=!]|<[=!])|[?*+]\\?|{\\d+(?:,\\d*)?}\\??|[\\s\\S]/,\n        // Any native multicharacter token in character class scope, or any single character\n        'class': /\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|[\\s\\S]/\n    };\n    // Any backreference or dollar-prefixed character in replacement strings\n    var replacementToken = /\\$(?:{([\\w$]+)}|<([\\w$]+)>|(\\d\\d?|[\\s\\S]))/g;\n    // Check for correct `exec` handling of nonparticipating capturing groups\n    var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined;\n    // Check for ES6 `flags` prop support\n    var hasFlagsProp = /x/.flags !== undefined;\n    // Shortcut to `Object.prototype.toString`\n    var toString = {}.toString;\n\n    function hasNativeFlag(flag) {\n        // Can't check based on the presence of properties/getters since browsers might support such\n        // properties even when they don't support the corresponding flag in regex construction (tested\n        // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`\n        // throws an error)\n        var isSupported = true;\n        try {\n        } catch (exception) {\n            isSupported = false;\n        }\n        return isSupported;\n    }\n    // Check for ES6 `u` flag support\n    var hasNativeU = hasNativeFlag('u');\n    // Check for ES6 `y` flag support\n    var hasNativeY = hasNativeFlag('y');\n    // Tracker for known flags, including addon flags\n    var registeredFlags = {\n        g: true,\n        i: true,\n        m: true,\n        u: hasNativeU,\n        y: hasNativeY\n    };\n\n    /**\n     * Attaches extended data and `XRegExp.prototype` properties to a regex object.\n     *\n     * @private\n     * @param {RegExp} regex Regex to augment.\n     * @param {Array} captureNames Array with capture names, or `null`.\n     * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.\n     * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.\n     * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal\n     *   operations, and never exposed to users. For internal-only regexes, we can improve perf by\n     *   skipping some operations like attaching `XRegExp.prototype` properties.\n     * @returns {RegExp} Augmented regex.\n     */\n    function augment(regex, captureNames, xSource, xFlags, isInternalOnly) {\n        var p = void 0;\n\n        regex[REGEX_DATA] = {\n            captureNames: captureNames\n        };\n\n        if (isInternalOnly) {\n            return regex;\n        }\n\n        // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value\n        if (regex.__proto__) {\n            regex.__proto__ = XRegExp.prototype;\n        } else {\n            for (p in XRegExp.prototype) {\n                // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this\n                // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`\n                // extensions exist on `regex.prototype` anyway\n                regex[p] = XRegExp.prototype[p];\n            }\n        }\n\n        regex[REGEX_DATA].source = xSource;\n        // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order\n        regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;\n\n        return regex;\n    }\n\n    /**\n     * Removes any duplicate characters from the provided string.\n     *\n     * @private\n     * @param {String} str String to remove duplicate characters from.\n     * @returns {String} String with any duplicate characters removed.\n     */\n    function clipDuplicates(str) {\n        return nativ.replace.call(str, /([\\s\\S])(?=[\\s\\S]*\\1)/g, '');\n    }\n\n    /**\n     * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`\n     * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing\n     * flags g and y while copying the regex.\n     *\n     * @private\n     * @param {RegExp} regex Regex to copy.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `addG` {Boolean} Add flag g while copying the regex.\n     *   - `addY` {Boolean} Add flag y while copying the regex.\n     *   - `removeG` {Boolean} Remove flag g while copying the regex.\n     *   - `removeY` {Boolean} Remove flag y while copying the regex.\n     *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal\n     *     operations, and never exposed to users. For internal-only regexes, we can improve perf by\n     *     skipping some operations like attaching `XRegExp.prototype` properties.\n     *   - `source` {String} Overrides `<regex>.source`, for special cases.\n     * @returns {RegExp} Copy of the provided regex, possibly with modified flags.\n     */\n    function copyRegex(regex, options) {\n        if (!XRegExp.isRegExp(regex)) {\n            throw new TypeError('Type RegExp expected');\n        }\n\n        var xData = regex[REGEX_DATA] || {};\n        var flags = getNativeFlags(regex);\n        var flagsToAdd = '';\n        var flagsToRemove = '';\n        var xregexpSource = null;\n        var xregexpFlags = null;\n\n        options = options || {};\n\n        if (options.removeG) {\n            flagsToRemove += 'g';\n        }\n        if (options.removeY) {\n            flagsToRemove += 'y';\n        }\n        if (flagsToRemove) {\n            flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), '');\n        }\n\n        if (options.addG) {\n            flagsToAdd += 'g';\n        }\n        if (options.addY) {\n            flagsToAdd += 'y';\n        }\n        if (flagsToAdd) {\n            flags = clipDuplicates(flags + flagsToAdd);\n        }\n\n        if (!options.isInternalOnly) {\n            if (xData.source !== undefined) {\n                xregexpSource = xData.source;\n            }\n            // null or undefined; don't want to add to `flags` if the previous value was null, since\n            // that indicates we're not tracking original precompilation flags\n            if (xData.flags != null) {\n                // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never\n                // removed for non-internal regexes, so don't need to handle it\n                xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;\n            }\n        }\n\n        // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid\n        // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and\n        // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the\n        // translation to native regex syntax\n        regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);\n\n        return regex;\n    }\n\n    /**\n     * Converts hexadecimal to decimal.\n     *\n     * @private\n     * @param {String} hex\n     * @returns {Number}\n     */\n    function dec(hex) {\n        return parseInt(hex, 16);\n    }\n\n    /**\n     * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an\n     * inline comment or whitespace with flag x. This is used directly as a token handler function\n     * passed to `XRegExp.addToken`.\n     *\n     * @private\n     * @param {String} match Match arg of `XRegExp.addToken` handler\n     * @param {String} scope Scope arg of `XRegExp.addToken` handler\n     * @param {String} flags Flags arg of `XRegExp.addToken` handler\n     * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.\n     */\n    function getContextualTokenSeparator(match, scope, flags) {\n        if (\n        // No need to separate tokens if at the beginning or end of a group\n        match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' ||\n        // Avoid separating tokens when the following token is a quantifier\n        isQuantifierNext(match.input, match.index + match[0].length, flags)) {\n            return '';\n        }\n        // Keep tokens separated. This avoids e.g. inadvertedly changing `\\1 1` or `\\1(?#)1` to `\\11`.\n        // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax\n        // error `(? :` into `(?:`.\n        return '(?:)';\n    }\n\n    /**\n     * Returns native `RegExp` flags used by a regex object.\n     *\n     * @private\n     * @param {RegExp} regex Regex to check.\n     * @returns {String} Native flags in use.\n     */\n    function getNativeFlags(regex) {\n        return hasFlagsProp ? regex.flags :\n        // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation\n        // with an empty string) allows this to continue working predictably when\n        // `XRegExp.proptotype.toString` is overridden\n        nativ.exec.call(/\\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];\n    }\n\n    /**\n     * Determines whether a regex has extended instance data used to track capture names.\n     *\n     * @private\n     * @param {RegExp} regex Regex to check.\n     * @returns {Boolean} Whether the regex uses named capture.\n     */\n    function hasNamedCapture(regex) {\n        return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);\n    }\n\n    /**\n     * Converts decimal to hexadecimal.\n     *\n     * @private\n     * @param {Number|String} dec\n     * @returns {String}\n     */\n    function hex(dec) {\n        return parseInt(dec, 10).toString(16);\n    }\n\n    /**\n     * Checks whether the next nonignorable token after the specified position is a quantifier.\n     *\n     * @private\n     * @param {String} pattern Pattern to search within.\n     * @param {Number} pos Index in `pattern` to search at.\n     * @param {String} flags Flags used by the pattern.\n     * @returns {Boolean} Whether the next nonignorable token is a quantifier.\n     */\n    function isQuantifierNext(pattern, pos, flags) {\n        return nativ.test.call(flags.indexOf('x') !== -1 ?\n        // Ignore any leading whitespace, line comments, and inline comments\n        /^(?:\\s|#[^#\\n]*|\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/ :\n        // Ignore any leading inline comments\n        /^(?:\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/, pattern.slice(pos));\n    }\n\n    /**\n     * Determines whether a value is of the specified type, by resolving its internal [[Class]].\n     *\n     * @private\n     * @param {*} value Object to check.\n     * @param {String} type Type to check for, in TitleCase.\n     * @returns {Boolean} Whether the object matches the type.\n     */\n    function isType(value, type) {\n        return toString.call(value) === '[object ' + type + ']';\n    }\n\n    /**\n     * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.\n     *\n     * @private\n     * @param {String} str\n     * @returns {String}\n     */\n    function pad4(str) {\n        while (str.length < 4) {\n            str = '0' + str;\n        }\n        return str;\n    }\n\n    /**\n     * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads\n     * the flag preparation logic from the `XRegExp` constructor.\n     *\n     * @private\n     * @param {String} pattern Regex pattern, possibly with a leading mode modifier.\n     * @param {String} flags Any combination of flags.\n     * @returns {Object} Object with properties `pattern` and `flags`.\n     */\n    function prepareFlags(pattern, flags) {\n        var i = void 0;\n\n        // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags\n        if (clipDuplicates(flags) !== flags) {\n            throw new SyntaxError('Invalid duplicate regex flag ' + flags);\n        }\n\n        // Strip and apply a leading mode modifier with any combination of flags except g or y\n        pattern = nativ.replace.call(pattern, /^\\(\\?([\\w$]+)\\)/, function ($0, $1) {\n            if (nativ.test.call(/[gy]/, $1)) {\n                throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0);\n            }\n            // Allow duplicate flags within the mode modifier\n            flags = clipDuplicates(flags + $1);\n            return '';\n        });\n\n        // Throw on unknown native or nonnative flags\n        for (i = 0; i < flags.length; ++i) {\n            if (!registeredFlags[flags[i]]) {\n                throw new SyntaxError('Unknown regex flag ' + flags[i]);\n            }\n        }\n\n        return {\n            pattern: pattern,\n            flags: flags\n        };\n    }\n\n    /**\n     * Prepares an options object from the given value.\n     *\n     * @private\n     * @param {String|Object} value Value to convert to an options object.\n     * @returns {Object} Options object.\n     */\n    function prepareOptions(value) {\n        var options = {};\n\n        if (isType(value, 'String')) {\n            XRegExp.forEach(value, /[^\\s,]+/, function (match) {\n                options[match] = true;\n            });\n\n            return options;\n        }\n\n        return value;\n    }\n\n    /**\n     * Registers a flag so it doesn't throw an 'unknown flag' error.\n     *\n     * @private\n     * @param {String} flag Single-character flag to register.\n     */\n    function registerFlag(flag) {\n        if (!/^[\\w$]$/.test(flag)) {\n            throw new Error('Flag must be a single character A-Za-z0-9_$');\n        }\n\n        registeredFlags[flag] = true;\n    }\n\n    /**\n     * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified\n     * position, until a match is found.\n     *\n     * @private\n     * @param {String} pattern Original pattern from which an XRegExp object is being built.\n     * @param {String} flags Flags being used to construct the regex.\n     * @param {Number} pos Position to search for tokens within `pattern`.\n     * @param {Number} scope Regex scope to apply: 'default' or 'class'.\n     * @param {Object} context Context object to use for token handler functions.\n     * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.\n     */\n    function runTokens(pattern, flags, pos, scope, context) {\n        var i = tokens.length;\n        var leadChar = pattern[pos];\n        var result = null;\n        var match = void 0;\n        var t = void 0;\n\n        // Run in reverse insertion order\n        while (i--) {\n            t = tokens[i];\n            if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(flags.indexOf(t.flag) !== -1)) {\n                continue;\n            }\n\n            match = XRegExp.exec(pattern, t.regex, pos, 'sticky');\n            if (match) {\n                result = {\n                    matchLength: match[0].length,\n                    output: t.handler.call(context, match, scope, flags),\n                    reparse: t.reparse\n                };\n                // Finished with token tests\n                break;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to\n     * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if\n     * the Unicode Base addon is not available, since flag A is registered by that addon.\n     *\n     * @private\n     * @param {Boolean} on `true` to enable; `false` to disable.\n     */\n    function setAstral(on) {\n        features.astral = on;\n    }\n\n    /**\n     * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow\n     * the ES5 abstract operation `ToObject`.\n     *\n     * @private\n     * @param {*} value Object to check and return.\n     * @returns {*} The provided object.\n     */\n    function toObject(value) {\n        // null or undefined\n        if (value == null) {\n            throw new TypeError('Cannot convert null or undefined to object');\n        }\n\n        return value;\n    }\n\n    // ==--------------------------==\n    // Constructor\n    // ==--------------------------==\n\n    /**\n     * Creates an extended regular expression object for matching text with a pattern. Differs from a\n     * native regular expression in that additional syntax and flags are supported. The returned object\n     * is in fact a native `RegExp` and works with all native methods.\n     *\n     * @class XRegExp\n     * @constructor\n     * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.\n     * @param {String} [flags] Any combination of flags.\n     *   Native flags:\n     *     - `g` - global\n     *     - `i` - ignore case\n     *     - `m` - multiline anchors\n     *     - `u` - unicode (ES6)\n     *     - `y` - sticky (Firefox 3+, ES6)\n     *   Additional XRegExp flags:\n     *     - `n` - explicit capture\n     *     - `s` - dot matches all (aka singleline)\n     *     - `x` - free-spacing and line comments (aka extended)\n     *     - `A` - astral (requires the Unicode Base addon)\n     *   Flags cannot be provided when constructing one `RegExp` from another.\n     * @returns {RegExp} Extended regular expression object.\n     * @example\n     *\n     * // With named capture and flag x\n     * XRegExp(`(?<year>  [0-9]{4} ) -?  # year\n     *          (?<month> [0-9]{2} ) -?  # month\n     *          (?<day>   [0-9]{2} )     # day`, 'x');\n     *\n     * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)\n     * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and\n     * // have fresh `lastIndex` properties (set to zero).\n     * XRegExp(/regex/);\n     */\n    function XRegExp(pattern, flags) {\n        if (XRegExp.isRegExp(pattern)) {\n            if (flags !== undefined) {\n                throw new TypeError('Cannot supply flags when copying a RegExp');\n            }\n            return copyRegex(pattern);\n        }\n\n        // Copy the argument behavior of `RegExp`\n        pattern = pattern === undefined ? '' : String(pattern);\n        flags = flags === undefined ? '' : String(flags);\n\n        if (XRegExp.isInstalled('astral') && !(flags.indexOf('A') !== -1)) {\n            // This causes an error to be thrown if the Unicode Base addon is not available\n            flags += 'A';\n        }\n\n        if (!patternCache[pattern]) {\n            patternCache[pattern] = {};\n        }\n\n        if (!patternCache[pattern][flags]) {\n            var context = {\n                hasNamedCapture: false,\n                captureNames: []\n            };\n            var scope = defaultScope;\n            var output = '';\n            var pos = 0;\n            var result = void 0;\n\n            // Check for flag-related errors, and strip/apply flags in a leading mode modifier\n            var applied = prepareFlags(pattern, flags);\n            var appliedPattern = applied.pattern;\n            var appliedFlags = applied.flags;\n\n            // Use XRegExp's tokens to translate the pattern to a native regex pattern.\n            // `appliedPattern.length` may change on each iteration if tokens use `reparse`\n            while (pos < appliedPattern.length) {\n                do {\n                    // Check for custom tokens at the current position\n                    result = runTokens(appliedPattern, appliedFlags, pos, scope, context);\n                    // If the matched token used the `reparse` option, splice its output into the\n                    // pattern before running tokens again at the same position\n                    if (result && result.reparse) {\n                        appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength);\n                    }\n                } while (result && result.reparse);\n\n                if (result) {\n                    output += result.output;\n                    pos += result.matchLength || 1;\n                } else {\n                    // Get the native token at the current position\n                    var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0];\n                    output += token;\n                    pos += token.length;\n                    if (token === '[' && scope === defaultScope) {\n                        scope = classScope;\n                    } else if (token === ']' && scope === classScope) {\n                        scope = defaultScope;\n                    }\n                }\n            }\n\n            patternCache[pattern][flags] = {\n                // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty\n                // groups are sometimes inserted during regex transpilation in order to keep tokens\n                // separated. However, more than one empty group in a row is never needed.\n                pattern: nativ.replace.call(output, /(?:\\(\\?:\\))+/g, '(?:)'),\n                // Strip all but native flags\n                flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),\n                // `context.captureNames` has an item for each capturing group, even if unnamed\n                captures: context.hasNamedCapture ? context.captureNames : null\n            };\n        }\n\n        var generated = patternCache[pattern][flags];\n        return augment(new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags);\n    }\n\n    // Add `RegExp.prototype` to the prototype chain\n    XRegExp.prototype = /(?:)/;\n\n    // ==--------------------------==\n    // Public properties\n    // ==--------------------------==\n\n    /**\n     * The XRegExp version number as a string containing three dot-separated parts. For example,\n     * '2.0.0-beta-3'.\n     *\n     * @static\n     * @memberOf XRegExp\n     * @type String\n     */\n    XRegExp.version = '4.0.0';\n\n    // ==--------------------------==\n    // Public methods\n    // ==--------------------------==\n\n    // Intentionally undocumented; used in tests and addons\n    XRegExp._clipDuplicates = clipDuplicates;\n    XRegExp._hasNativeFlag = hasNativeFlag;\n    XRegExp._dec = dec;\n    XRegExp._hex = hex;\n    XRegExp._pad4 = pad4;\n\n    /**\n     * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to\n     * create XRegExp addons. If more than one token can match the same string, the last added wins.\n     *\n     * @memberOf XRegExp\n     * @param {RegExp} regex Regex object that matches the new token.\n     * @param {Function} handler Function that returns a new pattern string (using native regex syntax)\n     *   to replace the matched token within all future XRegExp regexes. Has access to persistent\n     *   properties of the regex being built, through `this`. Invoked with three arguments:\n     *   - The match array, with named backreference properties.\n     *   - The regex scope where the match was found: 'default' or 'class'.\n     *   - The flags used by the regex, including any flags in a leading mode modifier.\n     *   The handler function becomes part of the XRegExp construction process, so be careful not to\n     *   construct XRegExps within the function or you will trigger infinite recursion.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.\n     *   - `flag` {String} Single-character flag that triggers the token. This also registers the\n     *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.\n     *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are\n     *     not required to trigger the token. This registers the flags, to prevent XRegExp from\n     *     throwing an 'unknown flag' error when any of the flags are used.\n     *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as\n     *     final, and instead be reparseable by other tokens (including the current token). Allows\n     *     token chaining or deferring.\n     *   - `leadChar` {String} Single character that occurs at the beginning of any successful match\n     *     of the token (not always applicable). This doesn't change the behavior of the token unless\n     *     you provide an erroneous value. However, providing it can increase the token's performance\n     *     since the token can be skipped at any positions where this character doesn't appear.\n     * @example\n     *\n     * // Basic usage: Add \\a for the ALERT control code\n     * XRegExp.addToken(\n     *   /\\\\a/,\n     *   () => '\\\\x07',\n     *   {scope: 'all'}\n     * );\n     * XRegExp('\\\\a[\\\\a-\\\\n]+').test('\\x07\\n\\x07'); // -> true\n     *\n     * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.\n     * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of\n     * // character classes only)\n     * XRegExp.addToken(\n     *   /([?*+]|{\\d+(?:,\\d*)?})(\\??)/,\n     *   (match) => `${match[1]}${match[2] ? '' : '?'}`,\n     *   {flag: 'U'}\n     * );\n     * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'\n     * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'\n     */\n    XRegExp.addToken = function (regex, handler, options) {\n        options = options || {};\n        var optionalFlags = options.optionalFlags;\n        var i = void 0;\n\n        if (options.flag) {\n            registerFlag(options.flag);\n        }\n\n        if (optionalFlags) {\n            optionalFlags = nativ.split.call(optionalFlags, '');\n            for (i = 0; i < optionalFlags.length; ++i) {\n                registerFlag(optionalFlags[i]);\n            }\n        }\n\n        // Add to the private list of syntax tokens\n        tokens.push({\n            regex: copyRegex(regex, {\n                addG: true,\n                addY: hasNativeY,\n                isInternalOnly: true\n            }),\n            handler: handler,\n            scope: options.scope || defaultScope,\n            flag: options.flag,\n            reparse: options.reparse,\n            leadChar: options.leadChar\n        });\n\n        // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags\n        // might now produce different results\n        XRegExp.cache.flush('patterns');\n    };\n\n    /**\n     * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with\n     * the same pattern and flag combination, the cached copy of the regex is returned.\n     *\n     * @memberOf XRegExp\n     * @param {String} pattern Regex pattern string.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {RegExp} Cached XRegExp object.\n     * @example\n     *\n     * while (match = XRegExp.cache('.', 'gs').exec(str)) {\n     *   // The regex is compiled once only\n     * }\n     */\n    XRegExp.cache = function (pattern, flags) {\n        if (!regexCache[pattern]) {\n            regexCache[pattern] = {};\n        }\n        return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));\n    };\n\n    // Intentionally undocumented; used in tests\n    XRegExp.cache.flush = function (cacheName) {\n        if (cacheName === 'patterns') {\n            // Flush the pattern cache used by the `XRegExp` constructor\n            patternCache = {};\n        } else {\n            // Flush the regex cache populated by `XRegExp.cache`\n            regexCache = {};\n        }\n    };\n\n    /**\n     * Escapes any regular expression metacharacters, for use when matching literal strings. The result\n     * can safely be used at any point within a regex that uses any flags.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to escape.\n     * @returns {String} String with regex metacharacters escaped.\n     * @example\n     *\n     * XRegExp.escape('Escaped? <.>');\n     * // -> 'Escaped\\?\\ <\\.>'\n     */\n    XRegExp.escape = function (str) {\n        return nativ.replace.call(toObject(str), /[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n    };\n\n    /**\n     * Executes a regex search in a specified string. Returns a match array or `null`. If the provided\n     * regex uses named capture, named backreference properties are included on the match array.\n     * Optional `pos` and `sticky` arguments specify the search start position, and whether the match\n     * must start at the specified position only. The `lastIndex` property of the provided regex is not\n     * used, but is updated for compatibility. Also fixes browser bugs compared to the native\n     * `RegExp.prototype.exec` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Number} [pos=0] Zero-based index at which to start the search.\n     * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n     *   only. The string `'sticky'` is accepted as an alternative to `true`.\n     * @returns {Array} Match array with named backreference properties, or `null`.\n     * @example\n     *\n     * // Basic use, with named backreference\n     * let match = XRegExp.exec('U+2620', XRegExp('U\\\\+(?<hex>[0-9A-F]{4})'));\n     * match.hex; // -> '2620'\n     *\n     * // With pos and sticky, in a loop\n     * let pos = 2, result = [], match;\n     * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\\d)>/, pos, 'sticky')) {\n     *   result.push(match[1]);\n     *   pos = match.index + match[0].length;\n     * }\n     * // result -> ['2', '3', '4']\n     */\n    XRegExp.exec = function (str, regex, pos, sticky) {\n        var cacheKey = 'g';\n        var addY = false;\n        var fakeY = false;\n        var match = void 0;\n\n        addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);\n        if (addY) {\n            cacheKey += 'y';\n        } else if (sticky) {\n            // Simulate sticky matching by appending an empty capture to the original regex. The\n            // resulting regex will succeed no matter what at the current index (set with `lastIndex`),\n            // and will not search the rest of the subject string. We'll know that the original regex\n            // has failed if that last capture is `''` rather than `undefined` (i.e., if that last\n            // capture participated in the match).\n            fakeY = true;\n            cacheKey += 'FakeY';\n        }\n\n        regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.match`/`replace`\n        var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n            addG: true,\n            addY: addY,\n            source: fakeY ? regex.source + '|()' : undefined,\n            removeY: sticky === false,\n            isInternalOnly: true\n        }));\n\n        pos = pos || 0;\n        r2.lastIndex = pos;\n\n        // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.\n        match = fixed.exec.call(r2, str);\n\n        // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means\n        // the original regexp failed (see above).\n        if (fakeY && match && match.pop() === '') {\n            match = null;\n        }\n\n        if (regex.global) {\n            regex.lastIndex = match ? r2.lastIndex : 0;\n        }\n\n        return match;\n    };\n\n    /**\n     * Executes a provided function once per regex match. Searches always start at the beginning of the\n     * string and continue until the end, regardless of the state of the regex's `global` property and\n     * initial `lastIndex`.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Function} callback Function to execute for each match. Invoked with four arguments:\n     *   - The match array, with named backreference properties.\n     *   - The zero-based match index.\n     *   - The string being traversed.\n     *   - The regex object being used to traverse the string.\n     * @example\n     *\n     * // Extracts every other digit from a string\n     * const evens = [];\n     * XRegExp.forEach('1a2345', /\\d/, (match, i) => {\n     *   if (i % 2) evens.push(+match[0]);\n     * });\n     * // evens -> [2, 4]\n     */\n    XRegExp.forEach = function (str, regex, callback) {\n        var pos = 0;\n        var i = -1;\n        var match = void 0;\n\n        while (match = XRegExp.exec(str, regex, pos)) {\n            // Because `regex` is provided to `callback`, the function could use the deprecated/\n            // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`\n            // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,\n            // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of\n            // regexes, mutating the regex will not have any effect on the iteration or matched strings,\n            // which is a nice side effect that brings extra safety.\n            callback(match, ++i, str, regex);\n\n            pos = match.index + (match[0].length || 1);\n        }\n    };\n\n    /**\n     * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with\n     * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native\n     * regexes are not recompiled using XRegExp syntax.\n     *\n     * @memberOf XRegExp\n     * @param {RegExp} regex Regex to globalize.\n     * @returns {RegExp} Copy of the provided regex with flag `g` added.\n     * @example\n     *\n     * const globalCopy = XRegExp.globalize(/regex/);\n     * globalCopy.global; // -> true\n     */\n    XRegExp.globalize = function (regex) {\n        return copyRegex(regex, { addG: true });\n    };\n\n    /**\n     * Installs optional features according to the specified options. Can be undone using\n     * `XRegExp.uninstall`.\n     *\n     * @memberOf XRegExp\n     * @param {Object|String} options Options object or string.\n     * @example\n     *\n     * // With an options object\n     * XRegExp.install({\n     *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)\n     *   astral: true\n     * });\n     *\n     * // With an options string\n     * XRegExp.install('astral');\n     */\n    XRegExp.install = function (options) {\n        options = prepareOptions(options);\n\n        if (!features.astral && options.astral) {\n            setAstral(true);\n        }\n    };\n\n    /**\n     * Checks whether an individual optional feature is installed.\n     *\n     * @memberOf XRegExp\n     * @param {String} feature Name of the feature to check. One of:\n     *   - `astral`\n     * @returns {Boolean} Whether the feature is installed.\n     * @example\n     *\n     * XRegExp.isInstalled('astral');\n     */\n    XRegExp.isInstalled = function (feature) {\n        return !!features[feature];\n    };\n\n    /**\n     * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes\n     * created in another frame, when `instanceof` and `constructor` checks would fail.\n     *\n     * @memberOf XRegExp\n     * @param {*} value Object to check.\n     * @returns {Boolean} Whether the object is a `RegExp` object.\n     * @example\n     *\n     * XRegExp.isRegExp('string'); // -> false\n     * XRegExp.isRegExp(/regex/i); // -> true\n     * XRegExp.isRegExp(RegExp('^', 'm')); // -> true\n     * XRegExp.isRegExp(XRegExp('(?s).')); // -> true\n     */\n    XRegExp.isRegExp = function (value) {\n        return toString.call(value) === '[object RegExp]';\n    }; // isType(value, 'RegExp');\n\n    /**\n     * Returns the first matched string, or in global mode, an array containing all matched strings.\n     * This is essentially a more convenient re-implementation of `String.prototype.match` that gives\n     * the result types you actually want (string instead of `exec`-style array in match-first mode,\n     * and an empty array instead of `null` when no matches are found in match-all mode). It also lets\n     * you override flag g and ignore `lastIndex`, and fixes browser bugs.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to\n     *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,\n     *   `scope` is 'all'.\n     * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all\n     *   mode: Array of all matched strings, or an empty array.\n     * @example\n     *\n     * // Match first\n     * XRegExp.match('abc', /\\w/); // -> 'a'\n     * XRegExp.match('abc', /\\w/g, 'one'); // -> 'a'\n     * XRegExp.match('abc', /x/g, 'one'); // -> null\n     *\n     * // Match all\n     * XRegExp.match('abc', /\\w/g); // -> ['a', 'b', 'c']\n     * XRegExp.match('abc', /\\w/, 'all'); // -> ['a', 'b', 'c']\n     * XRegExp.match('abc', /x/, 'all'); // -> []\n     */\n    XRegExp.match = function (str, regex, scope) {\n        var global = regex.global && scope !== 'one' || scope === 'all';\n        var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';\n\n        regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.exec`/`replace`\n        var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n            addG: !!global,\n            removeG: scope === 'one',\n            isInternalOnly: true\n        }));\n\n        var result = nativ.match.call(toObject(str), r2);\n\n        if (regex.global) {\n            regex.lastIndex = scope === 'one' && result ?\n            // Can't use `r2.lastIndex` since `r2` is nonglobal in this case\n            result.index + result[0].length : 0;\n        }\n\n        return global ? result || [] : result && result[0];\n    };\n\n    /**\n     * Retrieves the matches from searching a string using a chain of regexes that successively search\n     * within previous matches. The provided `chain` array can contain regexes and or objects with\n     * `regex` and `backref` properties. When a backreference is specified, the named or numbered\n     * backreference is passed forward to the next regex or returned.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {Array} chain Regexes that each search for matches within preceding results.\n     * @returns {Array} Matches by the last regex in the chain, or an empty array.\n     * @example\n     *\n     * // Basic usage; matches numbers within <b> tags\n     * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [\n     *   XRegExp('(?is)<b>.*?</b>'),\n     *   /\\d+/\n     * ]);\n     * // -> ['2', '4', '56']\n     *\n     * // Passing forward and returning specific backreferences\n     * html = '<a href=\"http://xregexp.com/api/\">XRegExp</a>\\\n     *         <a href=\"http://www.google.com/\">Google</a>';\n     * XRegExp.matchChain(html, [\n     *   {regex: /<a href=\"([^\"]+)\">/i, backref: 1},\n     *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}\n     * ]);\n     * // -> ['xregexp.com', 'www.google.com']\n     */\n    XRegExp.matchChain = function (str, chain) {\n        return function recurseChain(values, level) {\n            var item = chain[level].regex ? chain[level] : { regex: chain[level] };\n            var matches = [];\n\n            function addMatch(match) {\n                if (item.backref) {\n                    // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the\n                    // `undefined`s for backreferences to nonparticipating capturing groups. In such\n                    // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw\n                    // the exception, so also check if the backreference is a number that is within the\n                    // bounds of the array.\n                    if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) {\n                        throw new ReferenceError('Backreference to undefined group: ' + item.backref);\n                    }\n\n                    matches.push(match[item.backref] || '');\n                } else {\n                    matches.push(match[0]);\n                }\n            }\n\n            for (var i = 0; i < values.length; ++i) {\n                XRegExp.forEach(values[i], item.regex, addMatch);\n            }\n\n            return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);\n        }([str], 0);\n    };\n\n    /**\n     * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string\n     * or regex, and the replacement can be a string or a function to be called for each match. To\n     * perform a global search and replace, use the optional `scope` argument or include flag g if using\n     * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.\n     * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser\n     * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp|String} search Search pattern to be replaced.\n     * @param {String|Function} replacement Replacement string or a function invoked to create it.\n     *   Replacement strings can include special replacement syntax:\n     *     - $$ - Inserts a literal $ character.\n     *     - $&, $0 - Inserts the matched substring.\n     *     - $` - Inserts the string that precedes the matched substring (left context).\n     *     - $' - Inserts the string that follows the matched substring (right context).\n     *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts\n     *       backreference n/nn.\n     *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing\n     *       group, inserts backreference n.\n     *   Replacement functions are invoked with three or more arguments:\n     *     - The matched substring (corresponds to $& above). Named backreferences are accessible as\n     *       properties of this first argument.\n     *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).\n     *     - The zero-based index of the match within the total search string.\n     *     - The total string being searched.\n     * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not\n     *   explicitly specified and using a regex with flag g, `scope` is 'all'.\n     * @returns {String} New string with one or all matches replaced.\n     * @example\n     *\n     * // Regex search, using named backreferences in replacement string\n     * const name = XRegExp('(?<first>\\\\w+) (?<last>\\\\w+)');\n     * XRegExp.replace('John Smith', name, '$<last>, $<first>');\n     * // -> 'Smith, John'\n     *\n     * // Regex search, using named backreferences in replacement function\n     * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);\n     * // -> 'Smith, John'\n     *\n     * // String search, with replace-all\n     * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');\n     * // -> 'XRegExp builds XRegExps'\n     */\n    XRegExp.replace = function (str, search, replacement, scope) {\n        var isRegex = XRegExp.isRegExp(search);\n        var global = search.global && scope !== 'one' || scope === 'all';\n        var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';\n        var s2 = search;\n\n        if (isRegex) {\n            search[REGEX_DATA] = search[REGEX_DATA] || {};\n\n            // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s\n            // `lastIndex` isn't updated *during* replacement iterations\n            s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {\n                addG: !!global,\n                removeG: scope === 'one',\n                isInternalOnly: true\n            }));\n        } else if (global) {\n            s2 = new RegExp(XRegExp.escape(String(search)), 'g');\n        }\n\n        // Fixed `replace` required for named backreferences, etc.\n        var result = fixed.replace.call(toObject(str), s2, replacement);\n\n        if (isRegex && search.global) {\n            // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n            search.lastIndex = 0;\n        }\n\n        return result;\n    };\n\n    /**\n     * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an\n     * array of replacement details. Later replacements operate on the output of earlier replacements.\n     * Replacement details are accepted as an array with a regex or string to search for, the\n     * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp\n     * replacement text syntax, which supports named backreference properties via `${name}` or\n     * `$<name>`.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {Array} replacements Array of replacement detail arrays.\n     * @returns {String} New string with all replacements.\n     * @example\n     *\n     * str = XRegExp.replaceEach(str, [\n     *   [XRegExp('(?<name>a)'), 'z${name}'],\n     *   [/b/gi, 'y'],\n     *   [/c/g, 'x', 'one'], // scope 'one' overrides /g\n     *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g\n     *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings\n     *   [/f/g, ($0) => $0.toUpperCase()]\n     * ]);\n     */\n    XRegExp.replaceEach = function (str, replacements) {\n        var i = void 0;\n        var r = void 0;\n\n        for (i = 0; i < replacements.length; ++i) {\n            r = replacements[i];\n            str = XRegExp.replace(str, r[0], r[1], r[2]);\n        }\n\n        return str;\n    };\n\n    /**\n     * Splits a string into an array of strings using a regex or string separator. Matches of the\n     * separator are not included in the result array. However, if `separator` is a regex that contains\n     * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n     * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n     * cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to split.\n     * @param {RegExp|String} separator Regex or string to use for separating the string.\n     * @param {Number} [limit] Maximum number of items to include in the result array.\n     * @returns {Array} Array of substrings.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.split('a b c', ' ');\n     * // -> ['a', 'b', 'c']\n     *\n     * // With limit\n     * XRegExp.split('a b c', ' ', 2);\n     * // -> ['a', 'b']\n     *\n     * // Backreferences in result array\n     * XRegExp.split('..word1..', /([a-z]+)(\\d+)/i);\n     * // -> ['..', 'word', '1', '..']\n     */\n    XRegExp.split = function (str, separator, limit) {\n        return fixed.split.call(toObject(str), separator, limit);\n    };\n\n    /**\n     * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and\n     * `sticky` arguments specify the search start position, and whether the match must start at the\n     * specified position only. The `lastIndex` property of the provided regex is not used, but is\n     * updated for compatibility. Also fixes browser bugs compared to the native\n     * `RegExp.prototype.test` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Number} [pos=0] Zero-based index at which to start the search.\n     * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n     *   only. The string `'sticky'` is accepted as an alternative to `true`.\n     * @returns {Boolean} Whether the regex matched the provided value.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.test('abc', /c/); // -> true\n     *\n     * // With pos and sticky\n     * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false\n     * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true\n     */\n    // Do this the easy way :-)\n    XRegExp.test = function (str, regex, pos, sticky) {\n        return !!XRegExp.exec(str, regex, pos, sticky);\n    };\n\n    /**\n     * Uninstalls optional features according to the specified options. All optional features start out\n     * uninstalled, so this is used to undo the actions of `XRegExp.install`.\n     *\n     * @memberOf XRegExp\n     * @param {Object|String} options Options object or string.\n     * @example\n     *\n     * // With an options object\n     * XRegExp.uninstall({\n     *   // Disables support for astral code points in Unicode addons\n     *   astral: true\n     * });\n     *\n     * // With an options string\n     * XRegExp.uninstall('astral');\n     */\n    XRegExp.uninstall = function (options) {\n        options = prepareOptions(options);\n\n        if (features.astral && options.astral) {\n            setAstral(false);\n        }\n    };\n\n    /**\n     * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as\n     * regex objects or strings. Metacharacters are escaped in patterns provided as strings.\n     * Backreferences in provided regex objects are automatically renumbered to work correctly within\n     * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the\n     * `flags` argument.\n     *\n     * @memberOf XRegExp\n     * @param {Array} patterns Regexes and strings to combine.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.\n     * @returns {RegExp} Union of the provided regexes and strings.\n     * @example\n     *\n     * XRegExp.union(['a+b*c', /(dogs)\\1/, /(cats)\\1/], 'i');\n     * // -> /a\\+b\\*c|(dogs)\\1|(cats)\\2/i\n     *\n     * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});\n     * // -> /manbearpig/i\n     */\n    XRegExp.union = function (patterns, flags, options) {\n        options = options || {};\n        var conjunction = options.conjunction || 'or';\n        var numCaptures = 0;\n        var numPriorCaptures = void 0;\n        var captureNames = void 0;\n\n        function rewrite(match, paren, backref) {\n            var name = captureNames[numCaptures - numPriorCaptures];\n\n            // Capturing group\n            if (paren) {\n                ++numCaptures;\n                // If the current capture has a name, preserve the name\n                if (name) {\n                    return '(?<' + name + '>';\n                }\n                // Backreference\n            } else if (backref) {\n                // Rewrite the backreference\n                return '\\\\' + (+backref + numPriorCaptures);\n            }\n\n            return match;\n        }\n\n        if (!(isType(patterns, 'Array') && patterns.length)) {\n            throw new TypeError('Must provide a nonempty array of patterns to merge');\n        }\n\n        var parts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n        var output = [];\n        var pattern = void 0;\n        for (var i = 0; i < patterns.length; ++i) {\n            pattern = patterns[i];\n\n            if (XRegExp.isRegExp(pattern)) {\n                numPriorCaptures = numCaptures;\n                captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || [];\n\n                // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are\n                // independently valid; helps keep this simple. Named captures are put back\n                output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));\n            } else {\n                output.push(XRegExp.escape(pattern));\n            }\n        }\n\n        var separator = conjunction === 'none' ? '' : '|';\n        return XRegExp(output.join(separator), flags);\n    };\n\n    // ==--------------------------==\n    // Fixed/extended native methods\n    // ==--------------------------==\n\n    /**\n     * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n     * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.\n     *\n     * @memberOf RegExp\n     * @param {String} str String to search.\n     * @returns {Array} Match array with named backreference properties, or `null`.\n     */\n    fixed.exec = function (str) {\n        var origLastIndex = this.lastIndex;\n        var match = nativ.exec.apply(this, arguments);\n\n        if (match) {\n            // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing\n            // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9\n            // in standards mode follows the spec.\n            if (!correctExecNpcg && match.length > 1 && match.indexOf('') !== -1) {\n                var r2 = copyRegex(this, {\n                    removeG: true,\n                    isInternalOnly: true\n                });\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                nativ.replace.call(String(str).slice(match.index), r2, function () {\n                    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                        args[_key] = arguments[_key];\n                    }\n\n                    var len = args.length;\n                    // Skip index 0 and the last 2\n                    for (var i = 1; i < len - 2; ++i) {\n                        if (args[i] === undefined) {\n                            match[i] = undefined;\n                        }\n                    }\n                });\n            }\n\n            // Attach named capture properties\n            if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {\n                // Skip index 0\n                for (var i = 1; i < match.length; ++i) {\n                    var name = this[REGEX_DATA].captureNames[i - 1];\n                    if (name) {\n                        match[name] = match[i];\n                    }\n                }\n            }\n\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (this.global && !match[0].length && this.lastIndex > match.index) {\n                this.lastIndex = match.index;\n            }\n        }\n\n        if (!this.global) {\n            // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n            this.lastIndex = origLastIndex;\n        }\n\n        return match;\n    };\n\n    /**\n     * Fixes browser bugs in the native `RegExp.prototype.test`.\n     *\n     * @memberOf RegExp\n     * @param {String} str String to search.\n     * @returns {Boolean} Whether the regex matched the provided value.\n     */\n    fixed.test = function (str) {\n        // Do this the easy way :-)\n        return !!fixed.exec.call(this, str);\n    };\n\n    /**\n     * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n     * bugs in the native `String.prototype.match`.\n     *\n     * @memberOf String\n     * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.\n     * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,\n     *   the result of calling `regex.exec(this)`.\n     */\n    fixed.match = function (regex) {\n        if (!XRegExp.isRegExp(regex)) {\n            // Use the native `RegExp` rather than `XRegExp`\n            regex = new RegExp(regex);\n        } else if (regex.global) {\n            var result = nativ.match.apply(this, arguments);\n            // Fixes IE bug\n            regex.lastIndex = 0;\n\n            return result;\n        }\n\n        return fixed.exec.call(regex, toObject(this));\n    };\n\n    /**\n     * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement\n     * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also\n     * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex\n     * search value, and the value of a replacement regex's `lastIndex` property during replacement\n     * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third\n     * (`flags`) argument. Use via `XRegExp.replace`.\n     *\n     * @memberOf String\n     * @param {RegExp|String} search Search pattern to be replaced.\n     * @param {String|Function} replacement Replacement string or a function invoked to create it.\n     * @returns {String} New string with one or all matches replaced.\n     */\n    fixed.replace = function (search, replacement) {\n        var isRegex = XRegExp.isRegExp(search);\n        var origLastIndex = void 0;\n        var captureNames = void 0;\n        var result = void 0;\n\n        if (isRegex) {\n            if (search[REGEX_DATA]) {\n                captureNames = search[REGEX_DATA].captureNames;\n            }\n            // Only needed if `search` is nonglobal\n            origLastIndex = search.lastIndex;\n        } else {\n            search += ''; // Type-convert\n        }\n\n        // Don't use `typeof`; some older browsers return 'function' for regex objects\n        if (isType(replacement, 'Function')) {\n            // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement\n            // functions isn't type-converted to a string\n            result = nativ.replace.call(String(this), search, function () {\n                for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                    args[_key2] = arguments[_key2];\n                }\n\n                if (captureNames) {\n                    // Change the `args[0]` string primitive to a `String` object that can store\n                    // properties. This really does need to use `String` as a constructor\n                    args[0] = new String(args[0]);\n                    // Store named backreferences on the first argument\n                    for (var i = 0; i < captureNames.length; ++i) {\n                        if (captureNames[i]) {\n                            args[0][captureNames[i]] = args[i + 1];\n                        }\n                    }\n                }\n                // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari\n                // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)\n                if (isRegex && search.global) {\n                    search.lastIndex = args[args.length - 2] + args[0].length;\n                }\n                // ES6 specs the context for replacement functions as `undefined`\n                return replacement.apply(undefined, args);\n            });\n        } else {\n            // Ensure that the last value of `args` will be a string when given nonstring `this`,\n            // while still throwing on null or undefined context\n            result = nativ.replace.call(this == null ? this : String(this), search, function () {\n                for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n                    args[_key3] = arguments[_key3];\n                }\n\n                return nativ.replace.call(String(replacement), replacementToken, replacer);\n\n                function replacer($0, bracketed, angled, dollarToken) {\n                    bracketed = bracketed || angled;\n                    // Named or numbered backreference with curly or angled braces\n                    if (bracketed) {\n                        // XRegExp behavior for `${n}` or `$<n>`:\n                        // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the\n                        //    entire match. Any number of leading zeros may be used.\n                        // 2. Backreference to named capture `n`, if it exists and is not an integer\n                        //    overridden by numbered capture. In practice, this does not overlap with\n                        //    numbered capture since XRegExp does not allow named capture to use a bare\n                        //    integer as the name.\n                        // 3. If the name or number does not refer to an existing capturing group, it's\n                        //    an error.\n                        var n = +bracketed; // Type-convert; drop leading zeros\n                        if (n <= args.length - 3) {\n                            return args[n] || '';\n                        }\n                        // Groups with the same name is an error, else would need `lastIndexOf`\n                        n = captureNames ? captureNames.indexOf(bracketed) : -1;\n                        if (n < 0) {\n                            throw new SyntaxError('Backreference to undefined group ' + $0);\n                        }\n                        return args[n + 1] || '';\n                    }\n                    // Else, special variable or numbered backreference without curly braces\n                    if (dollarToken === '$') {\n                        // $$\n                        return '$';\n                    }\n                    if (dollarToken === '&' || +dollarToken === 0) {\n                        // $&, $0 (not followed by 1-9), $00\n                        return args[0];\n                    }\n                    if (dollarToken === '`') {\n                        // $` (left context)\n                        return args[args.length - 1].slice(0, args[args.length - 2]);\n                    }\n                    if (dollarToken === \"'\") {\n                        // $' (right context)\n                        return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                    }\n                    // Else, numbered backreference without braces\n                    dollarToken = +dollarToken; // Type-convert; drop leading zero\n                    // XRegExp behavior for `$n` and `$nn`:\n                    // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.\n                    // - `$1` is an error if no capturing groups.\n                    // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`\n                    //   instead.\n                    // - `$01` is `$1` if at least one capturing group, else it's an error.\n                    // - `$0` (not followed by 1-9) and `$00` are the entire match.\n                    // Native behavior, for comparison:\n                    // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.\n                    // - `$1` is a literal `$1` if no capturing groups.\n                    // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.\n                    // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.\n                    // - `$0` is a literal `$0`.\n                    if (!isNaN(dollarToken)) {\n                        if (dollarToken > args.length - 3) {\n                            throw new SyntaxError('Backreference to undefined group ' + $0);\n                        }\n                        return args[dollarToken] || '';\n                    }\n                    // `$` followed by an unsupported char is an error, unlike native JS\n                    throw new SyntaxError('Invalid token ' + $0);\n                }\n            });\n        }\n\n        if (isRegex) {\n            if (search.global) {\n                // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n                search.lastIndex = 0;\n            } else {\n                // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n                search.lastIndex = origLastIndex;\n            }\n        }\n\n        return result;\n    };\n\n    /**\n     * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.\n     *\n     * @memberOf String\n     * @param {RegExp|String} separator Regex or string to use for separating the string.\n     * @param {Number} [limit] Maximum number of items to include in the result array.\n     * @returns {Array} Array of substrings.\n     */\n    fixed.split = function (separator, limit) {\n        if (!XRegExp.isRegExp(separator)) {\n            // Browsers handle nonregex split correctly, so use the faster native method\n            return nativ.split.apply(this, arguments);\n        }\n\n        var str = String(this);\n        var output = [];\n        var origLastIndex = separator.lastIndex;\n        var lastLastIndex = 0;\n        var lastLength = void 0;\n\n        // Values for `limit`, per the spec:\n        // If undefined: pow(2,32) - 1\n        // If 0, Infinity, or NaN: 0\n        // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);\n        // If negative number: pow(2,32) - floor(abs(limit))\n        // If other: Type-convert, then use the above rules\n        // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless\n        // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+\n        limit = (limit === undefined ? -1 : limit) >>> 0;\n\n        XRegExp.forEach(str, separator, function (match) {\n            // This condition is not the same as `if (match[0].length)`\n            if (match.index + match[0].length > lastLastIndex) {\n                output.push(str.slice(lastLastIndex, match.index));\n                if (match.length > 1 && match.index < str.length) {\n                    Array.prototype.push.apply(output, match.slice(1));\n                }\n                lastLength = match[0].length;\n                lastLastIndex = match.index + lastLength;\n            }\n        });\n\n        if (lastLastIndex === str.length) {\n            if (!nativ.test.call(separator, '') || lastLength) {\n                output.push('');\n            }\n        } else {\n            output.push(str.slice(lastLastIndex));\n        }\n\n        separator.lastIndex = origLastIndex;\n        return output.length > limit ? output.slice(0, limit) : output;\n    };\n\n    // ==--------------------------==\n    // Built-in syntax/flag tokens\n    // ==--------------------------==\n\n    /*\n     * Letter escapes that natively match literal characters: `\\a`, `\\A`, etc. These should be\n     * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser\n     * consistency and to reserve their syntax, but lets them be superseded by addons.\n     */\n    XRegExp.addToken(/\\\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|x(?![\\dA-Fa-f]{2}))/, function (match, scope) {\n        // \\B is allowed in default scope only\n        if (match[1] === 'B' && scope === defaultScope) {\n            return match[0];\n        }\n        throw new SyntaxError('Invalid escape ' + match[0]);\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Unicode code point escape with curly braces: `\\u{N..}`. `N..` is any one or more digit\n     * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag\n     * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to\n     * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior\n     * if you follow a `\\u{N..}` token that references a code point above U+FFFF with a quantifier, or\n     * if you use the same in a character class.\n     */\n    XRegExp.addToken(/\\\\u{([\\dA-Fa-f]+)}/, function (match, scope, flags) {\n        var code = dec(match[1]);\n        if (code > 0x10FFFF) {\n            throw new SyntaxError('Invalid Unicode code point ' + match[0]);\n        }\n        if (code <= 0xFFFF) {\n            // Converting to \\uNNNN avoids needing to escape the literal character and keep it\n            // separate from preceding tokens\n            return '\\\\u' + pad4(hex(code));\n        }\n        // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling\n        if (hasNativeU && flags.indexOf('u') !== -1) {\n            return match[0];\n        }\n        throw new SyntaxError('Cannot use Unicode code point above \\\\u{FFFF} without flag u');\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.\n     * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because\n     * character class endings can't be determined.\n     */\n    XRegExp.addToken(/\\[(\\^?)\\]/,\n    // For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n    // (?!) should work like \\b\\B, but is unreliable in some versions of Firefox\n    /* eslint-disable no-confusing-arrow */\n    function (match) {\n        return match[1] ? '[\\\\s\\\\S]' : '\\\\b\\\\B';\n    },\n    /* eslint-enable no-confusing-arrow */\n    { leadChar: '[' });\n\n    /*\n     * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in\n     * free-spacing mode (flag x).\n     */\n    XRegExp.addToken(/\\(\\?#[^)]*\\)/, getContextualTokenSeparator, { leadChar: '(' });\n\n    /*\n     * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.\n     */\n    XRegExp.addToken(/\\s+|#[^\\n]*\\n?/, getContextualTokenSeparator, { flag: 'x' });\n\n    /*\n     * Dot, in dotall mode (aka singleline mode, flag s) only.\n     */\n    XRegExp.addToken(/\\./, function () {\n        return '[\\\\s\\\\S]';\n    }, {\n        flag: 's',\n        leadChar: '.'\n    });\n\n    /*\n     * Named backreference: `\\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,\n     * and $ only. Also allows numbered backreferences as `\\k<n>`.\n     */\n    XRegExp.addToken(/\\\\k<([\\w$]+)>/, function (match) {\n        // Groups with the same name is an error, else would need `lastIndexOf`\n        var index = isNaN(match[1]) ? this.captureNames.indexOf(match[1]) + 1 : +match[1];\n        var endIndex = match.index + match[0].length;\n        if (!index || index > this.captureNames.length) {\n            throw new SyntaxError('Backreference to undefined group ' + match[0]);\n        }\n        // Keep backreferences separate from subsequent literal numbers. This avoids e.g.\n        // inadvertedly changing `(?<n>)\\k<n>1` to `()\\11`.\n        return '\\\\' + index + (endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');\n    }, { leadChar: '\\\\' });\n\n    /*\n     * Numbered backreference or octal, plus any following digits: `\\0`, `\\11`, etc. Octals except `\\0`\n     * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches\n     * are returned unaltered. IE < 9 doesn't support backreferences above `\\99` in regex syntax.\n     */\n    XRegExp.addToken(/\\\\(\\d+)/, function (match, scope) {\n        if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {\n            throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]);\n        }\n        return match[0];\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the\n     * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style\n     * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively\n     * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to\n     * Python-style named capture as octals.\n     */\n    XRegExp.addToken(/\\(\\?P?<([\\w$]+)>/, function (match) {\n        // Disallow bare integers as names because named backreferences are added to match arrays\n        // and therefore numeric properties may lead to incorrect lookups\n        if (!isNaN(match[1])) {\n            throw new SyntaxError('Cannot use integer as capture name ' + match[0]);\n        }\n        if (match[1] === 'length' || match[1] === '__proto__') {\n            throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]);\n        }\n        if (this.captureNames.indexOf(match[1]) !== -1) {\n            throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]);\n        }\n        this.captureNames.push(match[1]);\n        this.hasNamedCapture = true;\n        return '(';\n    }, { leadChar: '(' });\n\n    /*\n     * Capturing group; match the opening parenthesis only. Required for support of named capturing\n     * groups. Also adds explicit capture mode (flag n).\n     */\n    XRegExp.addToken(/\\((?!\\?)/, function (match, scope, flags) {\n        if (flags.indexOf('n') !== -1) {\n            return '(?:';\n        }\n        this.captureNames.push(null);\n        return '(';\n    }, {\n        optionalFlags: 'n',\n        leadChar: '('\n    });\n\n    exports.default = XRegExp;\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(xregexp$2);\n\n    var build$2 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp.build 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2012-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n        var REGEX_DATA = 'xregexp';\n        var subParts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n        var parts = XRegExp.union([/\\({{([\\w$]+)}}\\)|{{([\\w$]+)}}/, subParts], 'g', {\n            conjunction: 'or'\n        });\n\n        /**\n         * Strips a leading `^` and trailing unescaped `$`, if both are present.\n         *\n         * @private\n         * @param {String} pattern Pattern to process.\n         * @returns {String} Pattern with edge anchors removed.\n         */\n        function deanchor(pattern) {\n            // Allow any number of empty noncapturing groups before/after anchors, because regexes\n            // built/generated by XRegExp sometimes include them\n            var leadingAnchor = /^(?:\\(\\?:\\))*\\^/;\n            var trailingAnchor = /\\$(?:\\(\\?:\\))*$/;\n\n            if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) &&\n            // Ensure that the trailing `$` isn't escaped\n            trailingAnchor.test(pattern.replace(/\\\\[\\s\\S]/g, ''))) {\n                return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');\n            }\n\n            return pattern;\n        }\n\n        /**\n         * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.\n         *\n         * @private\n         * @param {String|RegExp} value Value to convert.\n         * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not\n         *   already a regex generated by XRegExp\n         * @returns {RegExp} XRegExp object with XRegExp syntax applied.\n         */\n        function asXRegExp(value, addFlagX) {\n            var flags = addFlagX ? 'x' : '';\n            return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ?\n            // Don't recompile, to preserve capture names\n            value :\n            // Recompile as XRegExp\n            XRegExp(value.source, flags) :\n            // Compile string as XRegExp\n            XRegExp(value, flags);\n        }\n\n        function interpolate(substitution) {\n            return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);\n        }\n\n        function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {\n            subpatterns['subpattern' + subpatternIndex] = interpolated;\n            return subpatterns;\n        }\n\n        function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {\n            var hasSubpattern = subpatternIndex < rawLiterals.length - 1;\n            return raw + (hasSubpattern ? '{{subpattern' + subpatternIndex + '}}' : '');\n        }\n\n        /**\n         * Provides tagged template literals that create regexes with XRegExp syntax and flags. The\n         * provided pattern is handled as a raw string, so backslashes don't need to be escaped.\n         *\n         * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated\n         * patterns are treated as atomic units when quantified, interpolated strings have their special\n         * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated\n         * regexes if both are present, and any backreferences within an interpolated regex are\n         * rewritten to work within the overall pattern.\n         *\n         * @memberOf XRegExp\n         * @param {String} [flags] Any combination of XRegExp flags.\n         * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.\n         * @example\n         *\n         * const h12 = /1[0-2]|0?[1-9]/;\n         * const h24 = /2[0-3]|[01][0-9]/;\n         * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;\n         * const minutes = /^[0-5][0-9]$/;\n         * // Note that explicitly naming the 'minutes' group is required for named backreferences\n         * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;\n         * time.test('10:59'); // -> true\n         * XRegExp.exec('10:59', time).minutes; // -> '59'\n         */\n        XRegExp.tag = function (flags) {\n            return function (literals) {\n                for (var _len = arguments.length, substitutions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                    substitutions[_key - 1] = arguments[_key];\n                }\n\n                var subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});\n                var pattern = literals.raw.map(embedSubpatternAfter).join('');\n                return XRegExp.build(pattern, subpatterns, flags);\n            };\n        };\n\n        /**\n         * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in\n         * the outer pattern and provided subpatterns are automatically renumbered to work correctly.\n         * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.\n         *\n         * @memberOf XRegExp\n         * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows\n         *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within\n         *   character classes.\n         * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A\n         *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.\n         * @param {String} [flags] Any combination of XRegExp flags.\n         * @returns {RegExp} Regex with interpolated subpatterns.\n         * @example\n         *\n         * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {\n         *   hours: XRegExp.build('{{h12}} : | {{h24}}', {\n         *     h12: /1[0-2]|0?[1-9]/,\n         *     h24: /2[0-3]|[01][0-9]/\n         *   }, 'x'),\n         *   minutes: /^[0-5][0-9]$/\n         * });\n         * time.test('10:59'); // -> true\n         * XRegExp.exec('10:59', time).minutes; // -> '59'\n         */\n        XRegExp.build = function (pattern, subs, flags) {\n            flags = flags || '';\n            // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how\n            // some browsers convert `RegExp('\\n')` to a regex that contains the literal characters `\\`\n            // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.\n            var addFlagX = flags.indexOf('x') !== -1;\n            var inlineFlags = /^\\(\\?([\\w$]+)\\)/.exec(pattern);\n            // Add flags within a leading mode modifier to the overall pattern's flags\n            if (inlineFlags) {\n                flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);\n            }\n\n            var data = {};\n            for (var p in subs) {\n                if (subs.hasOwnProperty(p)) {\n                    // Passing to XRegExp enables extended syntax and ensures independent validity,\n                    // lest an unescaped `(`, `)`, `[`, or trailing `\\` breaks the `(?:)` wrapper. For\n                    // subpatterns provided as native regexes, it dies on octals and adds the property\n                    // used to hold extended regex instance data, for simplicity.\n                    var sub = asXRegExp(subs[p], addFlagX);\n                    data[p] = {\n                        // Deanchoring allows embedding independently useful anchored regexes. If you\n                        // really need to keep your anchors, double them (i.e., `^^...$$`).\n                        pattern: deanchor(sub.source),\n                        names: sub[REGEX_DATA].captureNames || []\n                    };\n                }\n            }\n\n            // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;\n            // helps keep this simple. Named captures will be put back.\n            var patternAsRegex = asXRegExp(pattern, addFlagX);\n\n            // 'Caps' is short for 'captures'\n            var numCaps = 0;\n            var numPriorCaps = void 0;\n            var numOuterCaps = 0;\n            var outerCapsMap = [0];\n            var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];\n            var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {\n                var subName = $1 || $2;\n                var capName = void 0;\n                var intro = void 0;\n                var localCapIndex = void 0;\n                // Named subpattern\n                if (subName) {\n                    if (!data.hasOwnProperty(subName)) {\n                        throw new ReferenceError('Undefined property ' + $0);\n                    }\n                    // Named subpattern was wrapped in a capturing group\n                    if ($1) {\n                        capName = outerCapNames[numOuterCaps];\n                        outerCapsMap[++numOuterCaps] = ++numCaps;\n                        // If it's a named group, preserve the name. Otherwise, use the subpattern name\n                        // as the capture name\n                        intro = '(?<' + (capName || subName) + '>';\n                    } else {\n                        intro = '(?:';\n                    }\n                    numPriorCaps = numCaps;\n                    var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {\n                        // Capturing group\n                        if (paren) {\n                            capName = data[subName].names[numCaps - numPriorCaps];\n                            ++numCaps;\n                            // If the current capture has a name, preserve the name\n                            if (capName) {\n                                return '(?<' + capName + '>';\n                            }\n                            // Backreference\n                        } else if (backref) {\n                            localCapIndex = +backref - 1;\n                            // Rewrite the backreference\n                            return data[subName].names[localCapIndex] ?\n                            // Need to preserve the backreference name in case using flag `n`\n                            '\\\\k<' + data[subName].names[localCapIndex] + '>' : '\\\\' + (+backref + numPriorCaps);\n                        }\n                        return match;\n                    });\n                    return '' + intro + rewrittenSubpattern + ')';\n                }\n                // Capturing group\n                if ($3) {\n                    capName = outerCapNames[numOuterCaps];\n                    outerCapsMap[++numOuterCaps] = ++numCaps;\n                    // If the current capture has a name, preserve the name\n                    if (capName) {\n                        return '(?<' + capName + '>';\n                    }\n                    // Backreference\n                } else if ($4) {\n                    localCapIndex = +$4 - 1;\n                    // Rewrite the backreference\n                    return outerCapNames[localCapIndex] ?\n                    // Need to preserve the backreference name in case using flag `n`\n                    '\\\\k<' + outerCapNames[localCapIndex] + '>' : '\\\\' + outerCapsMap[+$4];\n                }\n                return $0;\n            });\n\n            return XRegExp(output, flags);\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(build$2);\n\n    var matchrecursive$2 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp.matchRecursive 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2009-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Returns a match detail object composed of the provided values.\n         *\n         * @private\n         */\n        function row(name, value, start, end) {\n            return {\n                name: name,\n                value: value,\n                start: start,\n                end: end\n            };\n        }\n\n        /**\n         * Returns an array of match strings between outermost left and right delimiters, or an array of\n         * objects with detailed match parts and position data. An error is thrown if delimiters are\n         * unbalanced within the data.\n         *\n         * @memberOf XRegExp\n         * @param {String} str String to search.\n         * @param {String} left Left delimiter as an XRegExp pattern.\n         * @param {String} right Right delimiter as an XRegExp pattern.\n         * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.\n         * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.\n         * @returns {Array} Array of matches, or an empty array.\n         * @example\n         *\n         * // Basic usage\n         * let str = '(t((e))s)t()(ing)';\n         * XRegExp.matchRecursive(str, '\\\\(', '\\\\)', 'g');\n         * // -> ['t((e))s', '', 'ing']\n         *\n         * // Extended information mode with valueNames\n         * str = 'Here is <div> <div>an</div></div> example';\n         * XRegExp.matchRecursive(str, '<div\\\\s*>', '</div>', 'gi', {\n         *   valueNames: ['between', 'left', 'match', 'right']\n         * });\n         * // -> [\n         * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},\n         * // {name: 'left',    value: '<div>',          start: 8,  end: 13},\n         * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},\n         * // {name: 'right',   value: '</div>',         start: 27, end: 33},\n         * // {name: 'between', value: ' example',       start: 33, end: 41}\n         * // ]\n         *\n         * // Omitting unneeded parts with null valueNames, and using escapeChar\n         * str = '...{1}.\\\\{{function(x,y){return {y:x}}}';\n         * XRegExp.matchRecursive(str, '{', '}', 'g', {\n         *   valueNames: ['literal', null, 'value', null],\n         *   escapeChar: '\\\\'\n         * });\n         * // -> [\n         * // {name: 'literal', value: '...',  start: 0, end: 3},\n         * // {name: 'value',   value: '1',    start: 4, end: 5},\n         * // {name: 'literal', value: '.\\\\{', start: 6, end: 9},\n         * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}\n         * // ]\n         *\n         * // Sticky mode via flag y\n         * str = '<1><<<2>>><3>4<5>';\n         * XRegExp.matchRecursive(str, '<', '>', 'gy');\n         * // -> ['1', '<<2>>', '3']\n         */\n        XRegExp.matchRecursive = function (str, left, right, flags, options) {\n            flags = flags || '';\n            options = options || {};\n            var global = flags.indexOf('g') !== -1;\n            var sticky = flags.indexOf('y') !== -1;\n            // Flag `y` is controlled internally\n            var basicFlags = flags.replace(/y/g, '');\n            var escapeChar = options.escapeChar;\n            var vN = options.valueNames;\n            var output = [];\n            var openTokens = 0;\n            var delimStart = 0;\n            var delimEnd = 0;\n            var lastOuterEnd = 0;\n            var outerStart = void 0;\n            var innerStart = void 0;\n            var leftMatch = void 0;\n            var rightMatch = void 0;\n            var esc = void 0;\n            left = XRegExp(left, basicFlags);\n            right = XRegExp(right, basicFlags);\n\n            if (escapeChar) {\n                if (escapeChar.length > 1) {\n                    throw new Error('Cannot use more than one escape character');\n                }\n                escapeChar = XRegExp.escape(escapeChar);\n                // Example of concatenated `esc` regex:\n                // `escapeChar`: '%'\n                // `left`: '<'\n                // `right`: '>'\n                // Regex is: /(?:%[\\S\\s]|(?:(?!<|>)[^%])+)+/\n                esc = new RegExp('(?:' + escapeChar + '[\\\\S\\\\s]|(?:(?!' +\n                // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.\n                // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax\n                // transformation resulting from those flags was already applied to `left` and\n                // `right` when they were passed through the XRegExp constructor above.\n                XRegExp.union([left, right], '', { conjunction: 'or' }).source + ')[^' + escapeChar + '])+)+',\n                // Flags `gy` not needed here\n                flags.replace(/[^imu]+/g, ''));\n            }\n\n            while (true) {\n                // If using an escape character, advance to the delimiter's next starting position,\n                // skipping any escaped characters in between\n                if (escapeChar) {\n                    delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;\n                }\n                leftMatch = XRegExp.exec(str, left, delimEnd);\n                rightMatch = XRegExp.exec(str, right, delimEnd);\n                // Keep the leftmost match only\n                if (leftMatch && rightMatch) {\n                    if (leftMatch.index <= rightMatch.index) {\n                        rightMatch = null;\n                    } else {\n                        leftMatch = null;\n                    }\n                }\n                // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):\n                // LM | RM | OT | Result\n                // 1  | 0  | 1  | loop\n                // 1  | 0  | 0  | loop\n                // 0  | 1  | 1  | loop\n                // 0  | 1  | 0  | throw\n                // 0  | 0  | 1  | throw\n                // 0  | 0  | 0  | break\n                // The paths above don't include the sticky mode special case. The loop ends after the\n                // first completed match if not `global`.\n                if (leftMatch || rightMatch) {\n                    delimStart = (leftMatch || rightMatch).index;\n                    delimEnd = delimStart + (leftMatch || rightMatch)[0].length;\n                } else if (!openTokens) {\n                    break;\n                }\n                if (sticky && !openTokens && delimStart > lastOuterEnd) {\n                    break;\n                }\n                if (leftMatch) {\n                    if (!openTokens) {\n                        outerStart = delimStart;\n                        innerStart = delimEnd;\n                    }\n                    ++openTokens;\n                } else if (rightMatch && openTokens) {\n                    if (! --openTokens) {\n                        if (vN) {\n                            if (vN[0] && outerStart > lastOuterEnd) {\n                                output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));\n                            }\n                            if (vN[1]) {\n                                output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));\n                            }\n                            if (vN[2]) {\n                                output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));\n                            }\n                            if (vN[3]) {\n                                output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));\n                            }\n                        } else {\n                            output.push(str.slice(innerStart, delimStart));\n                        }\n                        lastOuterEnd = delimEnd;\n                        if (!global) {\n                            break;\n                        }\n                    }\n                } else {\n                    throw new Error('Unbalanced delimiter found in string');\n                }\n                // If the delimiter matched an empty string, avoid an infinite loop\n                if (delimStart === delimEnd) {\n                    ++delimEnd;\n                }\n            }\n\n            if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {\n                output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));\n            }\n\n            return output;\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(matchrecursive$2);\n\n    var unicodeBase$2 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Base 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2008-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds base support for Unicode matching:\n         * - Adds syntax `\\p{..}` for matching Unicode tokens. Tokens can be inverted using `\\P{..}` or\n         *   `\\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the\n         *   braces for token names that are a single letter (e.g. `\\pL` or `PL`).\n         * - Adds flag A (astral), which enables 21-bit Unicode support.\n         * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.\n         *\n         * Unicode Base relies on externally provided Unicode character data. Official addons are\n         * available to provide data for Unicode categories, scripts, blocks, and properties.\n         *\n         * @requires XRegExp\n         */\n\n        // ==--------------------------==\n        // Private stuff\n        // ==--------------------------==\n\n        // Storage for Unicode data\n        var unicode = {};\n\n        // Reuse utils\n        var dec = XRegExp._dec;\n        var hex = XRegExp._hex;\n        var pad4 = XRegExp._pad4;\n\n        // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed\n        function normalize(name) {\n            return name.replace(/[- _]+/g, '').toLowerCase();\n        }\n\n        // Gets the decimal code of a literal code unit, \\xHH, \\uHHHH, or a backslash-escaped literal\n        function charCode(chr) {\n            var esc = /^\\\\[xu](.+)/.exec(chr);\n            return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\\\' ? 1 : 0);\n        }\n\n        // Inverts a list of ordered BMP characters and ranges\n        function invertBmp(range) {\n            var output = '';\n            var lastEnd = -1;\n\n            XRegExp.forEach(range, /(\\\\x..|\\\\u....|\\\\?[\\s\\S])(?:-(\\\\x..|\\\\u....|\\\\?[\\s\\S]))?/, function (m) {\n                var start = charCode(m[1]);\n                if (start > lastEnd + 1) {\n                    output += '\\\\u' + pad4(hex(lastEnd + 1));\n                    if (start > lastEnd + 2) {\n                        output += '-\\\\u' + pad4(hex(start - 1));\n                    }\n                }\n                lastEnd = charCode(m[2] || m[1]);\n            });\n\n            if (lastEnd < 0xFFFF) {\n                output += '\\\\u' + pad4(hex(lastEnd + 1));\n                if (lastEnd < 0xFFFE) {\n                    output += '-\\\\uFFFF';\n                }\n            }\n\n            return output;\n        }\n\n        // Generates an inverted BMP range on first use\n        function cacheInvertedBmp(slug) {\n            var prop = 'b!';\n            return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));\n        }\n\n        // Combines and optionally negates BMP and astral data\n        function buildAstral(slug, isNegated) {\n            var item = unicode[slug];\n            var combined = '';\n\n            if (item.bmp && !item.isBmpLast) {\n                combined = '[' + item.bmp + ']' + (item.astral ? '|' : '');\n            }\n            if (item.astral) {\n                combined += item.astral;\n            }\n            if (item.isBmpLast && item.bmp) {\n                combined += (item.astral ? '|' : '') + '[' + item.bmp + ']';\n            }\n\n            // Astral Unicode tokens always match a code point, never a code unit\n            return isNegated ? '(?:(?!' + combined + ')(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\0-\\uFFFF]))' : '(?:' + combined + ')';\n        }\n\n        // Builds a complete astral pattern on first use\n        function cacheAstral(slug, isNegated) {\n            var prop = isNegated ? 'a!' : 'a=';\n            return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));\n        }\n\n        // ==--------------------------==\n        // Core functionality\n        // ==--------------------------==\n\n        /*\n         * Add astral mode (flag A) and Unicode token syntax: `\\p{..}`, `\\P{..}`, `\\p{^..}`, `\\pC`.\n         */\n        XRegExp.addToken(\n        // Use `*` instead of `+` to avoid capturing `^` as the token name in `\\p{^}`\n        /\\\\([pP])(?:{(\\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {\n            var ERR_DOUBLE_NEG = 'Invalid double negation ';\n            var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';\n            var ERR_UNKNOWN_REF = 'Unicode token missing data ';\n            var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';\n            var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';\n            // Negated via \\P{..} or \\p{^..}\n            var isNegated = match[1] === 'P' || !!match[2];\n            // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A\n            var isAstralMode = flags.indexOf('A') !== -1;\n            // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\\p{}`\n            var slug = normalize(match[4] || match[3]);\n            // Token data object\n            var item = unicode[slug];\n\n            if (match[1] === 'P' && match[2]) {\n                throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);\n            }\n            if (!unicode.hasOwnProperty(slug)) {\n                throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);\n            }\n\n            // Switch to the negated form of the referenced Unicode token\n            if (item.inverseOf) {\n                slug = normalize(item.inverseOf);\n                if (!unicode.hasOwnProperty(slug)) {\n                    throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf);\n                }\n                item = unicode[slug];\n                isNegated = !isNegated;\n            }\n\n            if (!(item.bmp || isAstralMode)) {\n                throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);\n            }\n            if (isAstralMode) {\n                if (scope === 'class') {\n                    throw new SyntaxError(ERR_ASTRAL_IN_CLASS);\n                }\n\n                return cacheAstral(slug, isNegated);\n            }\n\n            return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : (isNegated ? '[^' : '[') + item.bmp + ']';\n        }, {\n            scope: 'all',\n            optionalFlags: 'A',\n            leadChar: '\\\\'\n        });\n\n        /**\n         * Adds to the list of Unicode tokens that XRegExp regexes can match via `\\p` or `\\P`.\n         *\n         * @memberOf XRegExp\n         * @param {Array} data Objects with named character ranges. Each object may have properties\n         *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are\n         *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If\n         *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,\n         *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are\n         *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and\n         *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan\n         *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and\n         *   `astral` data should be a combination of literal characters and `\\xHH` or `\\uHHHH` escape\n         *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be\n         *   escaped, apart from range-creating hyphens. The `astral` data can additionally use\n         *   character classes and alternation, and should use surrogate pairs to represent astral code\n         *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is\n         *   defined as the exact inverse of another token.\n         * @example\n         *\n         * // Basic use\n         * XRegExp.addUnicodeData([{\n         *   name: 'XDigit',\n         *   alias: 'Hexadecimal',\n         *   bmp: '0-9A-Fa-f'\n         * }]);\n         * XRegExp('\\\\p{XDigit}:\\\\p{Hexadecimal}+').test('0:3D'); // -> true\n         */\n        XRegExp.addUnicodeData = function (data) {\n            var ERR_NO_NAME = 'Unicode token requires name';\n            var ERR_NO_DATA = 'Unicode token has no character data ';\n            var item = void 0;\n\n            for (var i = 0; i < data.length; ++i) {\n                item = data[i];\n                if (!item.name) {\n                    throw new Error(ERR_NO_NAME);\n                }\n                if (!(item.inverseOf || item.bmp || item.astral)) {\n                    throw new Error(ERR_NO_DATA + item.name);\n                }\n                unicode[normalize(item.name)] = item;\n                if (item.alias) {\n                    unicode[normalize(item.alias)] = item;\n                }\n            }\n\n            // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and\n            // flags might now produce different results\n            XRegExp.cache.flush('patterns');\n        };\n\n        /**\n         * @ignore\n         *\n         * Return a reference to the internal Unicode definition structure for the given Unicode\n         * Property if the given name is a legal Unicode Property for use in XRegExp `\\p` or `\\P` regex\n         * constructs.\n         *\n         * @memberOf XRegExp\n         * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),\n         *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode\n         *   Properties and Property Aliases.\n         * @returns {Object} Reference to definition structure when the name matches a Unicode Property.\n         *\n         * @note\n         * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.\n         *\n         * @note\n         * This method is *not* part of the officially documented API and may change or be removed in\n         * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode\n         * structures set up by XRegExp.\n         */\n        XRegExp._getUnicodeProperty = function (name) {\n            var slug = normalize(name);\n            return unicode[slug];\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeBase$2);\n\n    var unicodeBlocks$2 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Blocks 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,\n         * `\\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and\n         * underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'InAdlam',\n            astral: '\\uD83A[\\uDD00-\\uDD5F]'\n        }, {\n            name: 'InAegean_Numbers',\n            astral: '\\uD800[\\uDD00-\\uDD3F]'\n        }, {\n            name: 'InAhom',\n            astral: '\\uD805[\\uDF00-\\uDF3F]'\n        }, {\n            name: 'InAlchemical_Symbols',\n            astral: '\\uD83D[\\uDF00-\\uDF7F]'\n        }, {\n            name: 'InAlphabetic_Presentation_Forms',\n            bmp: '\\uFB00-\\uFB4F'\n        }, {\n            name: 'InAnatolian_Hieroglyphs',\n            astral: '\\uD811[\\uDC00-\\uDE7F]'\n        }, {\n            name: 'InAncient_Greek_Musical_Notation',\n            astral: '\\uD834[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InAncient_Greek_Numbers',\n            astral: '\\uD800[\\uDD40-\\uDD8F]'\n        }, {\n            name: 'InAncient_Symbols',\n            astral: '\\uD800[\\uDD90-\\uDDCF]'\n        }, {\n            name: 'InArabic',\n            bmp: '\\u0600-\\u06FF'\n        }, {\n            name: 'InArabic_Extended_A',\n            bmp: '\\u08A0-\\u08FF'\n        }, {\n            name: 'InArabic_Mathematical_Alphabetic_Symbols',\n            astral: '\\uD83B[\\uDE00-\\uDEFF]'\n        }, {\n            name: 'InArabic_Presentation_Forms_A',\n            bmp: '\\uFB50-\\uFDFF'\n        }, {\n            name: 'InArabic_Presentation_Forms_B',\n            bmp: '\\uFE70-\\uFEFF'\n        }, {\n            name: 'InArabic_Supplement',\n            bmp: '\\u0750-\\u077F'\n        }, {\n            name: 'InArmenian',\n            bmp: '\\u0530-\\u058F'\n        }, {\n            name: 'InArrows',\n            bmp: '\\u2190-\\u21FF'\n        }, {\n            name: 'InAvestan',\n            astral: '\\uD802[\\uDF00-\\uDF3F]'\n        }, {\n            name: 'InBalinese',\n            bmp: '\\u1B00-\\u1B7F'\n        }, {\n            name: 'InBamum',\n            bmp: '\\uA6A0-\\uA6FF'\n        }, {\n            name: 'InBamum_Supplement',\n            astral: '\\uD81A[\\uDC00-\\uDE3F]'\n        }, {\n            name: 'InBasic_Latin',\n            bmp: '\\0-\\x7F'\n        }, {\n            name: 'InBassa_Vah',\n            astral: '\\uD81A[\\uDED0-\\uDEFF]'\n        }, {\n            name: 'InBatak',\n            bmp: '\\u1BC0-\\u1BFF'\n        }, {\n            name: 'InBengali',\n            bmp: '\\u0980-\\u09FF'\n        }, {\n            name: 'InBhaiksuki',\n            astral: '\\uD807[\\uDC00-\\uDC6F]'\n        }, {\n            name: 'InBlock_Elements',\n            bmp: '\\u2580-\\u259F'\n        }, {\n            name: 'InBopomofo',\n            bmp: '\\u3100-\\u312F'\n        }, {\n            name: 'InBopomofo_Extended',\n            bmp: '\\u31A0-\\u31BF'\n        }, {\n            name: 'InBox_Drawing',\n            bmp: '\\u2500-\\u257F'\n        }, {\n            name: 'InBrahmi',\n            astral: '\\uD804[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InBraille_Patterns',\n            bmp: '\\u2800-\\u28FF'\n        }, {\n            name: 'InBuginese',\n            bmp: '\\u1A00-\\u1A1F'\n        }, {\n            name: 'InBuhid',\n            bmp: '\\u1740-\\u175F'\n        }, {\n            name: 'InByzantine_Musical_Symbols',\n            astral: '\\uD834[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InCJK_Compatibility',\n            bmp: '\\u3300-\\u33FF'\n        }, {\n            name: 'InCJK_Compatibility_Forms',\n            bmp: '\\uFE30-\\uFE4F'\n        }, {\n            name: 'InCJK_Compatibility_Ideographs',\n            bmp: '\\uF900-\\uFAFF'\n        }, {\n            name: 'InCJK_Compatibility_Ideographs_Supplement',\n            astral: '\\uD87E[\\uDC00-\\uDE1F]'\n        }, {\n            name: 'InCJK_Radicals_Supplement',\n            bmp: '\\u2E80-\\u2EFF'\n        }, {\n            name: 'InCJK_Strokes',\n            bmp: '\\u31C0-\\u31EF'\n        }, {\n            name: 'InCJK_Symbols_and_Punctuation',\n            bmp: '\\u3000-\\u303F'\n        }, {\n            name: 'InCJK_Unified_Ideographs',\n            bmp: '\\u4E00-\\u9FFF'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_A',\n            bmp: '\\u3400-\\u4DBF'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_B',\n            astral: '[\\uD840-\\uD868][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDEDF]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_C',\n            astral: '\\uD869[\\uDF00-\\uDFFF]|[\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF3F]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_D',\n            astral: '\\uD86D[\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1F]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_E',\n            astral: '\\uD86E[\\uDC20-\\uDFFF]|[\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD873[\\uDC00-\\uDEAF]'\n        }, {\n            name: 'InCarian',\n            astral: '\\uD800[\\uDEA0-\\uDEDF]'\n        }, {\n            name: 'InCaucasian_Albanian',\n            astral: '\\uD801[\\uDD30-\\uDD6F]'\n        }, {\n            name: 'InChakma',\n            astral: '\\uD804[\\uDD00-\\uDD4F]'\n        }, {\n            name: 'InCham',\n            bmp: '\\uAA00-\\uAA5F'\n        }, {\n            name: 'InCherokee',\n            bmp: '\\u13A0-\\u13FF'\n        }, {\n            name: 'InCherokee_Supplement',\n            bmp: '\\uAB70-\\uABBF'\n        }, {\n            name: 'InCombining_Diacritical_Marks',\n            bmp: '\\u0300-\\u036F'\n        }, {\n            name: 'InCombining_Diacritical_Marks_Extended',\n            bmp: '\\u1AB0-\\u1AFF'\n        }, {\n            name: 'InCombining_Diacritical_Marks_Supplement',\n            bmp: '\\u1DC0-\\u1DFF'\n        }, {\n            name: 'InCombining_Diacritical_Marks_for_Symbols',\n            bmp: '\\u20D0-\\u20FF'\n        }, {\n            name: 'InCombining_Half_Marks',\n            bmp: '\\uFE20-\\uFE2F'\n        }, {\n            name: 'InCommon_Indic_Number_Forms',\n            bmp: '\\uA830-\\uA83F'\n        }, {\n            name: 'InControl_Pictures',\n            bmp: '\\u2400-\\u243F'\n        }, {\n            name: 'InCoptic',\n            bmp: '\\u2C80-\\u2CFF'\n        }, {\n            name: 'InCoptic_Epact_Numbers',\n            astral: '\\uD800[\\uDEE0-\\uDEFF]'\n        }, {\n            name: 'InCounting_Rod_Numerals',\n            astral: '\\uD834[\\uDF60-\\uDF7F]'\n        }, {\n            name: 'InCuneiform',\n            astral: '\\uD808[\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InCuneiform_Numbers_and_Punctuation',\n            astral: '\\uD809[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InCurrency_Symbols',\n            bmp: '\\u20A0-\\u20CF'\n        }, {\n            name: 'InCypriot_Syllabary',\n            astral: '\\uD802[\\uDC00-\\uDC3F]'\n        }, {\n            name: 'InCyrillic',\n            bmp: '\\u0400-\\u04FF'\n        }, {\n            name: 'InCyrillic_Extended_A',\n            bmp: '\\u2DE0-\\u2DFF'\n        }, {\n            name: 'InCyrillic_Extended_B',\n            bmp: '\\uA640-\\uA69F'\n        }, {\n            name: 'InCyrillic_Extended_C',\n            bmp: '\\u1C80-\\u1C8F'\n        }, {\n            name: 'InCyrillic_Supplement',\n            bmp: '\\u0500-\\u052F'\n        }, {\n            name: 'InDeseret',\n            astral: '\\uD801[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'InDevanagari',\n            bmp: '\\u0900-\\u097F'\n        }, {\n            name: 'InDevanagari_Extended',\n            bmp: '\\uA8E0-\\uA8FF'\n        }, {\n            name: 'InDingbats',\n            bmp: '\\u2700-\\u27BF'\n        }, {\n            name: 'InDomino_Tiles',\n            astral: '\\uD83C[\\uDC30-\\uDC9F]'\n        }, {\n            name: 'InDuployan',\n            astral: '\\uD82F[\\uDC00-\\uDC9F]'\n        }, {\n            name: 'InEarly_Dynastic_Cuneiform',\n            astral: '\\uD809[\\uDC80-\\uDD4F]'\n        }, {\n            name: 'InEgyptian_Hieroglyphs',\n            astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InElbasan',\n            astral: '\\uD801[\\uDD00-\\uDD2F]'\n        }, {\n            name: 'InEmoticons',\n            astral: '\\uD83D[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InEnclosed_Alphanumeric_Supplement',\n            astral: '\\uD83C[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InEnclosed_Alphanumerics',\n            bmp: '\\u2460-\\u24FF'\n        }, {\n            name: 'InEnclosed_CJK_Letters_and_Months',\n            bmp: '\\u3200-\\u32FF'\n        }, {\n            name: 'InEnclosed_Ideographic_Supplement',\n            astral: '\\uD83C[\\uDE00-\\uDEFF]'\n        }, {\n            name: 'InEthiopic',\n            bmp: '\\u1200-\\u137F'\n        }, {\n            name: 'InEthiopic_Extended',\n            bmp: '\\u2D80-\\u2DDF'\n        }, {\n            name: 'InEthiopic_Extended_A',\n            bmp: '\\uAB00-\\uAB2F'\n        }, {\n            name: 'InEthiopic_Supplement',\n            bmp: '\\u1380-\\u139F'\n        }, {\n            name: 'InGeneral_Punctuation',\n            bmp: '\\u2000-\\u206F'\n        }, {\n            name: 'InGeometric_Shapes',\n            bmp: '\\u25A0-\\u25FF'\n        }, {\n            name: 'InGeometric_Shapes_Extended',\n            astral: '\\uD83D[\\uDF80-\\uDFFF]'\n        }, {\n            name: 'InGeorgian',\n            bmp: '\\u10A0-\\u10FF'\n        }, {\n            name: 'InGeorgian_Supplement',\n            bmp: '\\u2D00-\\u2D2F'\n        }, {\n            name: 'InGlagolitic',\n            bmp: '\\u2C00-\\u2C5F'\n        }, {\n            name: 'InGlagolitic_Supplement',\n            astral: '\\uD838[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InGothic',\n            astral: '\\uD800[\\uDF30-\\uDF4F]'\n        }, {\n            name: 'InGrantha',\n            astral: '\\uD804[\\uDF00-\\uDF7F]'\n        }, {\n            name: 'InGreek_Extended',\n            bmp: '\\u1F00-\\u1FFF'\n        }, {\n            name: 'InGreek_and_Coptic',\n            bmp: '\\u0370-\\u03FF'\n        }, {\n            name: 'InGujarati',\n            bmp: '\\u0A80-\\u0AFF'\n        }, {\n            name: 'InGurmukhi',\n            bmp: '\\u0A00-\\u0A7F'\n        }, {\n            name: 'InHalfwidth_and_Fullwidth_Forms',\n            bmp: '\\uFF00-\\uFFEF'\n        }, {\n            name: 'InHangul_Compatibility_Jamo',\n            bmp: '\\u3130-\\u318F'\n        }, {\n            name: 'InHangul_Jamo',\n            bmp: '\\u1100-\\u11FF'\n        }, {\n            name: 'InHangul_Jamo_Extended_A',\n            bmp: '\\uA960-\\uA97F'\n        }, {\n            name: 'InHangul_Jamo_Extended_B',\n            bmp: '\\uD7B0-\\uD7FF'\n        }, {\n            name: 'InHangul_Syllables',\n            bmp: '\\uAC00-\\uD7AF'\n        }, {\n            name: 'InHanunoo',\n            bmp: '\\u1720-\\u173F'\n        }, {\n            name: 'InHatran',\n            astral: '\\uD802[\\uDCE0-\\uDCFF]'\n        }, {\n            name: 'InHebrew',\n            bmp: '\\u0590-\\u05FF'\n        }, {\n            name: 'InHigh_Private_Use_Surrogates',\n            bmp: '\\uDB80-\\uDBFF'\n        }, {\n            name: 'InHigh_Surrogates',\n            bmp: '\\uD800-\\uDB7F'\n        }, {\n            name: 'InHiragana',\n            bmp: '\\u3040-\\u309F'\n        }, {\n            name: 'InIPA_Extensions',\n            bmp: '\\u0250-\\u02AF'\n        }, {\n            name: 'InIdeographic_Description_Characters',\n            bmp: '\\u2FF0-\\u2FFF'\n        }, {\n            name: 'InIdeographic_Symbols_and_Punctuation',\n            astral: '\\uD81B[\\uDFE0-\\uDFFF]'\n        }, {\n            name: 'InImperial_Aramaic',\n            astral: '\\uD802[\\uDC40-\\uDC5F]'\n        }, {\n            name: 'InInscriptional_Pahlavi',\n            astral: '\\uD802[\\uDF60-\\uDF7F]'\n        }, {\n            name: 'InInscriptional_Parthian',\n            astral: '\\uD802[\\uDF40-\\uDF5F]'\n        }, {\n            name: 'InJavanese',\n            bmp: '\\uA980-\\uA9DF'\n        }, {\n            name: 'InKaithi',\n            astral: '\\uD804[\\uDC80-\\uDCCF]'\n        }, {\n            name: 'InKana_Supplement',\n            astral: '\\uD82C[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InKanbun',\n            bmp: '\\u3190-\\u319F'\n        }, {\n            name: 'InKangxi_Radicals',\n            bmp: '\\u2F00-\\u2FDF'\n        }, {\n            name: 'InKannada',\n            bmp: '\\u0C80-\\u0CFF'\n        }, {\n            name: 'InKatakana',\n            bmp: '\\u30A0-\\u30FF'\n        }, {\n            name: 'InKatakana_Phonetic_Extensions',\n            bmp: '\\u31F0-\\u31FF'\n        }, {\n            name: 'InKayah_Li',\n            bmp: '\\uA900-\\uA92F'\n        }, {\n            name: 'InKharoshthi',\n            astral: '\\uD802[\\uDE00-\\uDE5F]'\n        }, {\n            name: 'InKhmer',\n            bmp: '\\u1780-\\u17FF'\n        }, {\n            name: 'InKhmer_Symbols',\n            bmp: '\\u19E0-\\u19FF'\n        }, {\n            name: 'InKhojki',\n            astral: '\\uD804[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InKhudawadi',\n            astral: '\\uD804[\\uDEB0-\\uDEFF]'\n        }, {\n            name: 'InLao',\n            bmp: '\\u0E80-\\u0EFF'\n        }, {\n            name: 'InLatin_Extended_Additional',\n            bmp: '\\u1E00-\\u1EFF'\n        }, {\n            name: 'InLatin_Extended_A',\n            bmp: '\\u0100-\\u017F'\n        }, {\n            name: 'InLatin_Extended_B',\n            bmp: '\\u0180-\\u024F'\n        }, {\n            name: 'InLatin_Extended_C',\n            bmp: '\\u2C60-\\u2C7F'\n        }, {\n            name: 'InLatin_Extended_D',\n            bmp: '\\uA720-\\uA7FF'\n        }, {\n            name: 'InLatin_Extended_E',\n            bmp: '\\uAB30-\\uAB6F'\n        }, {\n            name: 'InLatin_1_Supplement',\n            bmp: '\\x80-\\xFF'\n        }, {\n            name: 'InLepcha',\n            bmp: '\\u1C00-\\u1C4F'\n        }, {\n            name: 'InLetterlike_Symbols',\n            bmp: '\\u2100-\\u214F'\n        }, {\n            name: 'InLimbu',\n            bmp: '\\u1900-\\u194F'\n        }, {\n            name: 'InLinear_A',\n            astral: '\\uD801[\\uDE00-\\uDF7F]'\n        }, {\n            name: 'InLinear_B_Ideograms',\n            astral: '\\uD800[\\uDC80-\\uDCFF]'\n        }, {\n            name: 'InLinear_B_Syllabary',\n            astral: '\\uD800[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InLisu',\n            bmp: '\\uA4D0-\\uA4FF'\n        }, {\n            name: 'InLow_Surrogates',\n            bmp: '\\uDC00-\\uDFFF'\n        }, {\n            name: 'InLycian',\n            astral: '\\uD800[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'InLydian',\n            astral: '\\uD802[\\uDD20-\\uDD3F]'\n        }, {\n            name: 'InMahajani',\n            astral: '\\uD804[\\uDD50-\\uDD7F]'\n        }, {\n            name: 'InMahjong_Tiles',\n            astral: '\\uD83C[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InMalayalam',\n            bmp: '\\u0D00-\\u0D7F'\n        }, {\n            name: 'InMandaic',\n            bmp: '\\u0840-\\u085F'\n        }, {\n            name: 'InManichaean',\n            astral: '\\uD802[\\uDEC0-\\uDEFF]'\n        }, {\n            name: 'InMarchen',\n            astral: '\\uD807[\\uDC70-\\uDCBF]'\n        }, {\n            name: 'InMathematical_Alphanumeric_Symbols',\n            astral: '\\uD835[\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InMathematical_Operators',\n            bmp: '\\u2200-\\u22FF'\n        }, {\n            name: 'InMeetei_Mayek',\n            bmp: '\\uABC0-\\uABFF'\n        }, {\n            name: 'InMeetei_Mayek_Extensions',\n            bmp: '\\uAAE0-\\uAAFF'\n        }, {\n            name: 'InMende_Kikakui',\n            astral: '\\uD83A[\\uDC00-\\uDCDF]'\n        }, {\n            name: 'InMeroitic_Cursive',\n            astral: '\\uD802[\\uDDA0-\\uDDFF]'\n        }, {\n            name: 'InMeroitic_Hieroglyphs',\n            astral: '\\uD802[\\uDD80-\\uDD9F]'\n        }, {\n            name: 'InMiao',\n            astral: '\\uD81B[\\uDF00-\\uDF9F]'\n        }, {\n            name: 'InMiscellaneous_Mathematical_Symbols_A',\n            bmp: '\\u27C0-\\u27EF'\n        }, {\n            name: 'InMiscellaneous_Mathematical_Symbols_B',\n            bmp: '\\u2980-\\u29FF'\n        }, {\n            name: 'InMiscellaneous_Symbols',\n            bmp: '\\u2600-\\u26FF'\n        }, {\n            name: 'InMiscellaneous_Symbols_and_Arrows',\n            bmp: '\\u2B00-\\u2BFF'\n        }, {\n            name: 'InMiscellaneous_Symbols_and_Pictographs',\n            astral: '\\uD83C[\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDDFF]'\n        }, {\n            name: 'InMiscellaneous_Technical',\n            bmp: '\\u2300-\\u23FF'\n        }, {\n            name: 'InModi',\n            astral: '\\uD805[\\uDE00-\\uDE5F]'\n        }, {\n            name: 'InModifier_Tone_Letters',\n            bmp: '\\uA700-\\uA71F'\n        }, {\n            name: 'InMongolian',\n            bmp: '\\u1800-\\u18AF'\n        }, {\n            name: 'InMongolian_Supplement',\n            astral: '\\uD805[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InMro',\n            astral: '\\uD81A[\\uDE40-\\uDE6F]'\n        }, {\n            name: 'InMultani',\n            astral: '\\uD804[\\uDE80-\\uDEAF]'\n        }, {\n            name: 'InMusical_Symbols',\n            astral: '\\uD834[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InMyanmar',\n            bmp: '\\u1000-\\u109F'\n        }, {\n            name: 'InMyanmar_Extended_A',\n            bmp: '\\uAA60-\\uAA7F'\n        }, {\n            name: 'InMyanmar_Extended_B',\n            bmp: '\\uA9E0-\\uA9FF'\n        }, {\n            name: 'InNKo',\n            bmp: '\\u07C0-\\u07FF'\n        }, {\n            name: 'InNabataean',\n            astral: '\\uD802[\\uDC80-\\uDCAF]'\n        }, {\n            name: 'InNew_Tai_Lue',\n            bmp: '\\u1980-\\u19DF'\n        }, {\n            name: 'InNewa',\n            astral: '\\uD805[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InNumber_Forms',\n            bmp: '\\u2150-\\u218F'\n        }, {\n            name: 'InOgham',\n            bmp: '\\u1680-\\u169F'\n        }, {\n            name: 'InOl_Chiki',\n            bmp: '\\u1C50-\\u1C7F'\n        }, {\n            name: 'InOld_Hungarian',\n            astral: '\\uD803[\\uDC80-\\uDCFF]'\n        }, {\n            name: 'InOld_Italic',\n            astral: '\\uD800[\\uDF00-\\uDF2F]'\n        }, {\n            name: 'InOld_North_Arabian',\n            astral: '\\uD802[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'InOld_Permic',\n            astral: '\\uD800[\\uDF50-\\uDF7F]'\n        }, {\n            name: 'InOld_Persian',\n            astral: '\\uD800[\\uDFA0-\\uDFDF]'\n        }, {\n            name: 'InOld_South_Arabian',\n            astral: '\\uD802[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InOld_Turkic',\n            astral: '\\uD803[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'InOptical_Character_Recognition',\n            bmp: '\\u2440-\\u245F'\n        }, {\n            name: 'InOriya',\n            bmp: '\\u0B00-\\u0B7F'\n        }, {\n            name: 'InOrnamental_Dingbats',\n            astral: '\\uD83D[\\uDE50-\\uDE7F]'\n        }, {\n            name: 'InOsage',\n            astral: '\\uD801[\\uDCB0-\\uDCFF]'\n        }, {\n            name: 'InOsmanya',\n            astral: '\\uD801[\\uDC80-\\uDCAF]'\n        }, {\n            name: 'InPahawh_Hmong',\n            astral: '\\uD81A[\\uDF00-\\uDF8F]'\n        }, {\n            name: 'InPalmyrene',\n            astral: '\\uD802[\\uDC60-\\uDC7F]'\n        }, {\n            name: 'InPau_Cin_Hau',\n            astral: '\\uD806[\\uDEC0-\\uDEFF]'\n        }, {\n            name: 'InPhags_pa',\n            bmp: '\\uA840-\\uA87F'\n        }, {\n            name: 'InPhaistos_Disc',\n            astral: '\\uD800[\\uDDD0-\\uDDFF]'\n        }, {\n            name: 'InPhoenician',\n            astral: '\\uD802[\\uDD00-\\uDD1F]'\n        }, {\n            name: 'InPhonetic_Extensions',\n            bmp: '\\u1D00-\\u1D7F'\n        }, {\n            name: 'InPhonetic_Extensions_Supplement',\n            bmp: '\\u1D80-\\u1DBF'\n        }, {\n            name: 'InPlaying_Cards',\n            astral: '\\uD83C[\\uDCA0-\\uDCFF]'\n        }, {\n            name: 'InPrivate_Use_Area',\n            bmp: '\\uE000-\\uF8FF'\n        }, {\n            name: 'InPsalter_Pahlavi',\n            astral: '\\uD802[\\uDF80-\\uDFAF]'\n        }, {\n            name: 'InRejang',\n            bmp: '\\uA930-\\uA95F'\n        }, {\n            name: 'InRumi_Numeral_Symbols',\n            astral: '\\uD803[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InRunic',\n            bmp: '\\u16A0-\\u16FF'\n        }, {\n            name: 'InSamaritan',\n            bmp: '\\u0800-\\u083F'\n        }, {\n            name: 'InSaurashtra',\n            bmp: '\\uA880-\\uA8DF'\n        }, {\n            name: 'InSharada',\n            astral: '\\uD804[\\uDD80-\\uDDDF]'\n        }, {\n            name: 'InShavian',\n            astral: '\\uD801[\\uDC50-\\uDC7F]'\n        }, {\n            name: 'InShorthand_Format_Controls',\n            astral: '\\uD82F[\\uDCA0-\\uDCAF]'\n        }, {\n            name: 'InSiddham',\n            astral: '\\uD805[\\uDD80-\\uDDFF]'\n        }, {\n            name: 'InSinhala',\n            bmp: '\\u0D80-\\u0DFF'\n        }, {\n            name: 'InSinhala_Archaic_Numbers',\n            astral: '\\uD804[\\uDDE0-\\uDDFF]'\n        }, {\n            name: 'InSmall_Form_Variants',\n            bmp: '\\uFE50-\\uFE6F'\n        }, {\n            name: 'InSora_Sompeng',\n            astral: '\\uD804[\\uDCD0-\\uDCFF]'\n        }, {\n            name: 'InSpacing_Modifier_Letters',\n            bmp: '\\u02B0-\\u02FF'\n        }, {\n            name: 'InSpecials',\n            bmp: '\\uFFF0-\\uFFFF'\n        }, {\n            name: 'InSundanese',\n            bmp: '\\u1B80-\\u1BBF'\n        }, {\n            name: 'InSundanese_Supplement',\n            bmp: '\\u1CC0-\\u1CCF'\n        }, {\n            name: 'InSuperscripts_and_Subscripts',\n            bmp: '\\u2070-\\u209F'\n        }, {\n            name: 'InSupplemental_Arrows_A',\n            bmp: '\\u27F0-\\u27FF'\n        }, {\n            name: 'InSupplemental_Arrows_B',\n            bmp: '\\u2900-\\u297F'\n        }, {\n            name: 'InSupplemental_Arrows_C',\n            astral: '\\uD83E[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InSupplemental_Mathematical_Operators',\n            bmp: '\\u2A00-\\u2AFF'\n        }, {\n            name: 'InSupplemental_Punctuation',\n            bmp: '\\u2E00-\\u2E7F'\n        }, {\n            name: 'InSupplemental_Symbols_and_Pictographs',\n            astral: '\\uD83E[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InSupplementary_Private_Use_Area_A',\n            astral: '[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InSupplementary_Private_Use_Area_B',\n            astral: '[\\uDBC0-\\uDBFF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InSutton_SignWriting',\n            astral: '\\uD836[\\uDC00-\\uDEAF]'\n        }, {\n            name: 'InSyloti_Nagri',\n            bmp: '\\uA800-\\uA82F'\n        }, {\n            name: 'InSyriac',\n            bmp: '\\u0700-\\u074F'\n        }, {\n            name: 'InTagalog',\n            bmp: '\\u1700-\\u171F'\n        }, {\n            name: 'InTagbanwa',\n            bmp: '\\u1760-\\u177F'\n        }, {\n            name: 'InTags',\n            astral: '\\uDB40[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InTai_Le',\n            bmp: '\\u1950-\\u197F'\n        }, {\n            name: 'InTai_Tham',\n            bmp: '\\u1A20-\\u1AAF'\n        }, {\n            name: 'InTai_Viet',\n            bmp: '\\uAA80-\\uAADF'\n        }, {\n            name: 'InTai_Xuan_Jing_Symbols',\n            astral: '\\uD834[\\uDF00-\\uDF5F]'\n        }, {\n            name: 'InTakri',\n            astral: '\\uD805[\\uDE80-\\uDECF]'\n        }, {\n            name: 'InTamil',\n            bmp: '\\u0B80-\\u0BFF'\n        }, {\n            name: 'InTangut',\n            astral: '[\\uD81C-\\uD821][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InTangut_Components',\n            astral: '\\uD822[\\uDC00-\\uDEFF]'\n        }, {\n            name: 'InTelugu',\n            bmp: '\\u0C00-\\u0C7F'\n        }, {\n            name: 'InThaana',\n            bmp: '\\u0780-\\u07BF'\n        }, {\n            name: 'InThai',\n            bmp: '\\u0E00-\\u0E7F'\n        }, {\n            name: 'InTibetan',\n            bmp: '\\u0F00-\\u0FFF'\n        }, {\n            name: 'InTifinagh',\n            bmp: '\\u2D30-\\u2D7F'\n        }, {\n            name: 'InTirhuta',\n            astral: '\\uD805[\\uDC80-\\uDCDF]'\n        }, {\n            name: 'InTransport_and_Map_Symbols',\n            astral: '\\uD83D[\\uDE80-\\uDEFF]'\n        }, {\n            name: 'InUgaritic',\n            astral: '\\uD800[\\uDF80-\\uDF9F]'\n        }, {\n            name: 'InUnified_Canadian_Aboriginal_Syllabics',\n            bmp: '\\u1400-\\u167F'\n        }, {\n            name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended',\n            bmp: '\\u18B0-\\u18FF'\n        }, {\n            name: 'InVai',\n            bmp: '\\uA500-\\uA63F'\n        }, {\n            name: 'InVariation_Selectors',\n            bmp: '\\uFE00-\\uFE0F'\n        }, {\n            name: 'InVariation_Selectors_Supplement',\n            astral: '\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'InVedic_Extensions',\n            bmp: '\\u1CD0-\\u1CFF'\n        }, {\n            name: 'InVertical_Forms',\n            bmp: '\\uFE10-\\uFE1F'\n        }, {\n            name: 'InWarang_Citi',\n            astral: '\\uD806[\\uDCA0-\\uDCFF]'\n        }, {\n            name: 'InYi_Radicals',\n            bmp: '\\uA490-\\uA4CF'\n        }, {\n            name: 'InYi_Syllables',\n            bmp: '\\uA000-\\uA48F'\n        }, {\n            name: 'InYijing_Hexagram_Symbols',\n            bmp: '\\u4DC0-\\u4DFF'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeBlocks$2);\n\n    var unicodeCategories$2 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Categories 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for Unicode's general categories. E.g., `\\p{Lu}` or `\\p{Uppercase Letter}`. See\n         * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token\n         * names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'C',\n            alias: 'Other',\n            isBmpLast: true,\n            bmp: '\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u08E2\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180E\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',\n            astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCBD\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA0-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDD73-\\uDD7A\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]'\n        }, {\n            name: 'Cc',\n            alias: 'Control',\n            bmp: '\\0-\\x1F\\x7F-\\x9F'\n        }, {\n            name: 'Cf',\n            alias: 'Format',\n            bmp: '\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB',\n            astral: '\\uD804\\uDCBD|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n        }, {\n            name: 'Cn',\n            alias: 'Unassigned',\n            bmp: '\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u05FF\\u061D\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF',\n            astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n        }, {\n            name: 'Co',\n            alias: 'Private_Use',\n            bmp: '\\uE000-\\uF8FF',\n            astral: '[\\uDB80-\\uDBBE\\uDBC0-\\uDBFE][\\uDC00-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDC00-\\uDFFD]'\n        }, {\n            name: 'Cs',\n            alias: 'Surrogate',\n            bmp: '\\uD800-\\uDFFF'\n        }, {\n            name: 'L',\n            alias: 'Letter',\n            bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Ll',\n            alias: 'Lowercase_Letter',\n            bmp: 'a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n            astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n        }, {\n            name: 'Lm',\n            alias: 'Modifier_Letter',\n            bmp: '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E\\uFF9F',\n            astral: '\\uD81A[\\uDF40-\\uDF43]|\\uD81B[\\uDF93-\\uDF9F\\uDFE0]'\n        }, {\n            name: 'Lo',\n            alias: 'Other_Letter',\n            bmp: '\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC50-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Lt',\n            alias: 'Titlecase_Letter',\n            bmp: '\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC'\n        }, {\n            name: 'Lu',\n            alias: 'Uppercase_Letter',\n            bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n            astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]'\n        }, {\n            name: 'M',\n            alias: 'Mark',\n            bmp: '\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n            astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDDCA-\\uDDCC\\uDE2C-\\uDE37\\uDE3E\\uDEDF-\\uDEEA\\uDF00-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC35-\\uDC46\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDDDC\\uDDDD\\uDE30-\\uDE40\\uDEAB-\\uDEB7\\uDF1D-\\uDF2B]|\\uD807[\\uDC2F-\\uDC36\\uDC38-\\uDC3F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'Mc',\n            alias: 'Spacing_Mark',\n            bmp: '\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\u1CF3\\u302E\\u302F\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC',\n            astral: '\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3E\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB0-\\uDCB2\\uDCB9\\uDCBB-\\uDCBE\\uDCC1\\uDDAF-\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF20\\uDF21\\uDF26]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4]|\\uD81B[\\uDF51-\\uDF7E]|\\uD834[\\uDD65\\uDD66\\uDD6D-\\uDD72]'\n        }, {\n            name: 'Me',\n            alias: 'Enclosing_Mark',\n            bmp: '\\u0488\\u0489\\u1ABE\\u20DD-\\u20E0\\u20E2-\\u20E4\\uA670-\\uA672'\n        }, {\n            name: 'Mn',\n            alias: 'Nonspacing_Mark',\n            bmp: '\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D01\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n            astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDCA-\\uDDCC\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3C\\uDF40\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDCB3-\\uDCB8\\uDCBA\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'N',\n            alias: 'Number',\n            bmp: '0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n            astral: '\\uD800[\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD801[\\uDCA0-\\uDCA9]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDDE1-\\uDDF4\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF3B]|\\uD806[\\uDCE0-\\uDCF2]|\\uD807[\\uDC50-\\uDC6C]|\\uD809[\\uDC00-\\uDC6E]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDCC7-\\uDCCF\\uDD50-\\uDD59]|\\uD83C[\\uDD00-\\uDD0C]'\n        }, {\n            name: 'Nd',\n            alias: 'Decimal_Number',\n            bmp: '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n            astral: '\\uD801[\\uDCA0-\\uDCA9]|\\uD804[\\uDC66-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF39]|\\uD806[\\uDCE0-\\uDCE9]|\\uD807[\\uDC50-\\uDC59]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDD50-\\uDD59]'\n        }, {\n            name: 'Nl',\n            alias: 'Letter_Number',\n            bmp: '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',\n            astral: '\\uD800[\\uDD40-\\uDD74\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD809[\\uDC00-\\uDC6E]'\n        }, {\n            name: 'No',\n            alias: 'Other_Number',\n            bmp: '\\xB2\\xB3\\xB9\\xBC-\\xBE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',\n            astral: '\\uD800[\\uDD07-\\uDD33\\uDD75-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC65\\uDDE1-\\uDDF4]|\\uD805[\\uDF3A\\uDF3B]|\\uD806[\\uDCEA-\\uDCF2]|\\uD807[\\uDC5A-\\uDC6C]|\\uD81A[\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD83A[\\uDCC7-\\uDCCF]|\\uD83C[\\uDD00-\\uDD0C]'\n        }, {\n            name: 'P',\n            alias: 'Punctuation',\n            bmp: '\\x21-\\x23\\x25-\\\\x2A\\x2C-\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5B-\\\\x5D\\x5F\\\\x7B\\x7D\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E44\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Pc',\n            alias: 'Connector_Punctuation',\n            bmp: '\\x5F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F'\n        }, {\n            name: 'Pd',\n            alias: 'Dash_Punctuation',\n            bmp: '\\\\x2D\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D'\n        }, {\n            name: 'Pe',\n            alias: 'Close_Punctuation',\n            bmp: '\\\\x29\\\\x5D\\x7D\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63'\n        }, {\n            name: 'Pf',\n            alias: 'Final_Punctuation',\n            bmp: '\\xBB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21'\n        }, {\n            name: 'Pi',\n            alias: 'Initial_Punctuation',\n            bmp: '\\xAB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20'\n        }, {\n            name: 'Po',\n            alias: 'Other_Punctuation',\n            bmp: '\\x21-\\x23\\x25-\\x27\\\\x2A\\x2C\\\\x2E\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5C\\xA1\\xA7\\xB6\\xB7\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166D\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43\\u2E44\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Ps',\n            alias: 'Open_Punctuation',\n            bmp: '\\\\x28\\\\x5B\\\\x7B\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62'\n        }, {\n            name: 'S',\n            alias: 'Symbol',\n            bmp: '\\\\x24\\\\x2B\\x3C-\\x3E\\\\x5E\\x60\\\\x7C\\x7E\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20BE\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uFB29\\uFBB2-\\uFBC1\\uFDFC\\uFDFD\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',\n            astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83B[\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n        }, {\n            name: 'Sc',\n            alias: 'Currency_Symbol',\n            bmp: '\\\\x24\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BE\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6'\n        }, {\n            name: 'Sk',\n            alias: 'Modifier_Symbol',\n            bmp: '\\\\x5E\\x60\\xA8\\xAF\\xB4\\xB8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uFBB2-\\uFBC1\\uFF3E\\uFF40\\uFFE3',\n            astral: '\\uD83C[\\uDFFB-\\uDFFF]'\n        }, {\n            name: 'Sm',\n            alias: 'Math_Symbol',\n            bmp: '\\\\x2B\\x3C-\\x3E\\\\x7C\\x7E\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',\n            astral: '\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD83B[\\uDEF0\\uDEF1]'\n        }, {\n            name: 'So',\n            alias: 'Other_Symbol',\n            bmp: '\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',\n            astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFA]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n        }, {\n            name: 'Z',\n            alias: 'Separator',\n            bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n        }, {\n            name: 'Zl',\n            alias: 'Line_Separator',\n            bmp: '\\u2028'\n        }, {\n            name: 'Zp',\n            alias: 'Paragraph_Separator',\n            bmp: '\\u2029'\n        }, {\n            name: 'Zs',\n            alias: 'Space_Separator',\n            bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeCategories$2);\n\n    var unicodeProperties$2 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Properties 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2012-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See\n         * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from\n         * UAX #44 <http://unicode.org/reports/tr44/>:\n         *\n         * - Alphabetic\n         *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +\n         *   Lo + Nl + Other_Alphabetic.\n         *\n         * - Default_Ignorable_Code_Point\n         *   For programmatic determination of default ignorable code points. New characters that should\n         *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,\n         *   permitting programs to correctly handle the default rendering of such characters when not\n         *   otherwise supported.\n         *\n         * - Lowercase\n         *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.\n         *\n         * - Noncharacter_Code_Point\n         *   Code points permanently reserved for internal use.\n         *\n         * - Uppercase\n         *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.\n         *\n         * - White_Space\n         *   Spaces, separator characters and other control characters which should be treated by\n         *   programming languages as \"white space\" for the purpose of parsing elements.\n         *\n         * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS\n         * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are\n         * included in XRegExp's Unicode Categories and Unicode Scripts addons.\n         *\n         * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');\n        }\n\n        var unicodeData = [{\n            name: 'ASCII',\n            bmp: '\\0-\\x7F'\n        }, {\n            name: 'Alphabetic',\n            bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0345\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05B0-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0657\\u0659-\\u065F\\u066E-\\u06D3\\u06D5-\\u06DC\\u06E1-\\u06E8\\u06ED-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710-\\u073F\\u074D-\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0817\\u081A-\\u082C\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08DF\\u08E3-\\u08E9\\u08F0-\\u093B\\u093D-\\u094C\\u094E-\\u0950\\u0955-\\u0963\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD-\\u09C4\\u09C7\\u09C8\\u09CB\\u09CC\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09F0\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A70-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB\\u0ACC\\u0AD0\\u0AE0-\\u0AE3\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D-\\u0B44\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD0\\u0BD7\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4C\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCC\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E46\\u0E4D\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ECD\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F81\\u0F88-\\u0F97\\u0F99-\\u0FBC\\u1000-\\u1036\\u1038\\u103B-\\u103F\\u1050-\\u1062\\u1065-\\u1068\\u106E-\\u1086\\u108E\\u109C\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1713\\u1720-\\u1733\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17B3\\u17B6-\\u17C8\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u1938\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A61-\\u1A74\\u1AA7\\u1B00-\\u1B33\\u1B35-\\u1B43\\u1B45-\\u1B4B\\u1B80-\\u1BA9\\u1BAC-\\u1BAF\\u1BBA-\\u1BE5\\u1BE7-\\u1BF1\\u1C00-\\u1C35\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1DE7-\\u1DF4\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u24B6-\\u24E9\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA674-\\uA67B\\uA67F-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA827\\uA840-\\uA873\\uA880-\\uA8C3\\uA8C5\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA92A\\uA930-\\uA952\\uA960-\\uA97C\\uA980-\\uA9B2\\uA9B4-\\uA9BF\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAABE\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF5\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC45\\uDC82-\\uDCB8\\uDCD0-\\uDCE8\\uDD00-\\uDD32\\uDD50-\\uDD72\\uDD76\\uDD80-\\uDDBF\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE34\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEE8\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D-\\uDF44\\uDF47\\uDF48\\uDF4B\\uDF4C\\uDF50\\uDF57\\uDF5D-\\uDF63]|\\uD805[\\uDC00-\\uDC41\\uDC43-\\uDC45\\uDC47-\\uDC4A\\uDC80-\\uDCC1\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDB5\\uDDB8-\\uDDBE\\uDDD8-\\uDDDD\\uDE00-\\uDE3E\\uDE40\\uDE44\\uDE80-\\uDEB5\\uDF00-\\uDF19\\uDF1D-\\uDF2A]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC3E\\uDC40\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9E]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD47]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Any',\n            isBmpLast: true,\n            bmp: '\\0-\\uFFFF',\n            astral: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'Default_Ignorable_Code_Point',\n            bmp: '\\xAD\\u034F\\u061C\\u115F\\u1160\\u17B4\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8',\n            astral: '\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|[\\uDB40-\\uDB43][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'Lowercase',\n            bmp: 'a-z\\xAA\\xB5\\xBA\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02B8\\u02C0\\u02C1\\u02E0-\\u02E4\\u0345\\u0371\\u0373\\u0377\\u037A-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1DBF\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u2090-\\u209C\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2170-\\u217F\\u2184\\u24D0-\\u24E9\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7D\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B-\\uA69D\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7F8-\\uA7FA\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n            astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n        }, {\n            name: 'Noncharacter_Code_Point',\n            bmp: '\\uFDD0-\\uFDEF\\uFFFE\\uFFFF',\n            astral: '[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n        }, {\n            name: 'Uppercase',\n            bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n            astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]'\n        }, {\n            name: 'White_Space',\n            bmp: '\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n        }];\n\n        // Add non-generated data\n        unicodeData.push({\n            name: 'Assigned',\n            // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode\n            // Categories addon is required to use this property\n            inverseOf: 'Cn'\n        });\n\n        XRegExp.addUnicodeData(unicodeData);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeProperties$2);\n\n    var unicodeScripts$2 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Scripts 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for all Unicode scripts. E.g., `\\p{Latin}`. Token names are case insensitive,\n         * and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'Adlam',\n            astral: '\\uD83A[\\uDD00-\\uDD4A\\uDD50-\\uDD59\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Ahom',\n            astral: '\\uD805[\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF3F]'\n        }, {\n            name: 'Anatolian_Hieroglyphs',\n            astral: '\\uD811[\\uDC00-\\uDE46]'\n        }, {\n            name: 'Arabic',\n            bmp: '\\u0600-\\u0604\\u0606-\\u060B\\u060D-\\u061A\\u061E\\u0620-\\u063F\\u0641-\\u064A\\u0656-\\u066F\\u0671-\\u06DC\\u06DE-\\u06FF\\u0750-\\u077F\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u08FF\\uFB50-\\uFBC1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFD\\uFE70-\\uFE74\\uFE76-\\uFEFC',\n            astral: '\\uD803[\\uDE60-\\uDE7E]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB\\uDEF0\\uDEF1]'\n        }, {\n            name: 'Armenian',\n            bmp: '\\u0531-\\u0556\\u0559-\\u055F\\u0561-\\u0587\\u058A\\u058D-\\u058F\\uFB13-\\uFB17'\n        }, {\n            name: 'Avestan',\n            astral: '\\uD802[\\uDF00-\\uDF35\\uDF39-\\uDF3F]'\n        }, {\n            name: 'Balinese',\n            bmp: '\\u1B00-\\u1B4B\\u1B50-\\u1B7C'\n        }, {\n            name: 'Bamum',\n            bmp: '\\uA6A0-\\uA6F7',\n            astral: '\\uD81A[\\uDC00-\\uDE38]'\n        }, {\n            name: 'Bassa_Vah',\n            astral: '\\uD81A[\\uDED0-\\uDEED\\uDEF0-\\uDEF5]'\n        }, {\n            name: 'Batak',\n            bmp: '\\u1BC0-\\u1BF3\\u1BFC-\\u1BFF'\n        }, {\n            name: 'Bengali',\n            bmp: '\\u0980-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FB'\n        }, {\n            name: 'Bhaiksuki',\n            astral: '\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC45\\uDC50-\\uDC6C]'\n        }, {\n            name: 'Bopomofo',\n            bmp: '\\u02EA\\u02EB\\u3105-\\u312D\\u31A0-\\u31BA'\n        }, {\n            name: 'Brahmi',\n            astral: '\\uD804[\\uDC00-\\uDC4D\\uDC52-\\uDC6F\\uDC7F]'\n        }, {\n            name: 'Braille',\n            bmp: '\\u2800-\\u28FF'\n        }, {\n            name: 'Buginese',\n            bmp: '\\u1A00-\\u1A1B\\u1A1E\\u1A1F'\n        }, {\n            name: 'Buhid',\n            bmp: '\\u1740-\\u1753'\n        }, {\n            name: 'Canadian_Aboriginal',\n            bmp: '\\u1400-\\u167F\\u18B0-\\u18F5'\n        }, {\n            name: 'Carian',\n            astral: '\\uD800[\\uDEA0-\\uDED0]'\n        }, {\n            name: 'Caucasian_Albanian',\n            astral: '\\uD801[\\uDD30-\\uDD63\\uDD6F]'\n        }, {\n            name: 'Chakma',\n            astral: '\\uD804[\\uDD00-\\uDD34\\uDD36-\\uDD43]'\n        }, {\n            name: 'Cham',\n            bmp: '\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA5C-\\uAA5F'\n        }, {\n            name: 'Cherokee',\n            bmp: '\\u13A0-\\u13F5\\u13F8-\\u13FD\\uAB70-\\uABBF'\n        }, {\n            name: 'Common',\n            bmp: '\\0-\\x40\\\\x5B-\\x60\\\\x7B-\\xA9\\xAB-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02B9-\\u02DF\\u02E5-\\u02E9\\u02EC-\\u02FF\\u0374\\u037E\\u0385\\u0387\\u0589\\u0605\\u060C\\u061B\\u061C\\u061F\\u0640\\u06DD\\u08E2\\u0964\\u0965\\u0E3F\\u0FD5-\\u0FD8\\u10FB\\u16EB-\\u16ED\\u1735\\u1736\\u1802\\u1803\\u1805\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u2000-\\u200B\\u200E-\\u2064\\u2066-\\u2070\\u2074-\\u207E\\u2080-\\u208E\\u20A0-\\u20BE\\u2100-\\u2125\\u2127-\\u2129\\u212C-\\u2131\\u2133-\\u214D\\u214F-\\u215F\\u2189-\\u218B\\u2190-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u2460-\\u27FF\\u2900-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2E00-\\u2E44\\u2FF0-\\u2FFB\\u3000-\\u3004\\u3006\\u3008-\\u3020\\u3030-\\u3037\\u303C-\\u303F\\u309B\\u309C\\u30A0\\u30FB\\u30FC\\u3190-\\u319F\\u31C0-\\u31E3\\u3220-\\u325F\\u327F-\\u32CF\\u3358-\\u33FF\\u4DC0-\\u4DFF\\uA700-\\uA721\\uA788-\\uA78A\\uA830-\\uA839\\uA92E\\uA9CF\\uAB5B\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFEFF\\uFF01-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFF70\\uFF9E\\uFF9F\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFF9-\\uFFFD',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDD07-\\uDD33\\uDD37-\\uDD3F\\uDD90-\\uDD9B\\uDDD0-\\uDDFC\\uDEE1-\\uDEFB]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD66\\uDD6A-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDF00-\\uDF56\\uDF60-\\uDF71]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD00-\\uDD0C\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n        }, {\n            name: 'Coptic',\n            bmp: '\\u03E2-\\u03EF\\u2C80-\\u2CF3\\u2CF9-\\u2CFF'\n        }, {\n            name: 'Cuneiform',\n            astral: '\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC70-\\uDC74\\uDC80-\\uDD43]'\n        }, {\n            name: 'Cypriot',\n            astral: '\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F]'\n        }, {\n            name: 'Cyrillic',\n            bmp: '\\u0400-\\u0484\\u0487-\\u052F\\u1C80-\\u1C88\\u1D2B\\u1D78\\u2DE0-\\u2DFF\\uA640-\\uA69F\\uFE2E\\uFE2F'\n        }, {\n            name: 'Deseret',\n            astral: '\\uD801[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'Devanagari',\n            bmp: '\\u0900-\\u0950\\u0953-\\u0963\\u0966-\\u097F\\uA8E0-\\uA8FD'\n        }, {\n            name: 'Duployan',\n            astral: '\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9C-\\uDC9F]'\n        }, {\n            name: 'Egyptian_Hieroglyphs',\n            astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]'\n        }, {\n            name: 'Elbasan',\n            astral: '\\uD801[\\uDD00-\\uDD27]'\n        }, {\n            name: 'Ethiopic',\n            bmp: '\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u137C\\u1380-\\u1399\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E'\n        }, {\n            name: 'Georgian',\n            bmp: '\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u10FF\\u2D00-\\u2D25\\u2D27\\u2D2D'\n        }, {\n            name: 'Glagolitic',\n            bmp: '\\u2C00-\\u2C2E\\u2C30-\\u2C5E',\n            astral: '\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]'\n        }, {\n            name: 'Gothic',\n            astral: '\\uD800[\\uDF30-\\uDF4A]'\n        }, {\n            name: 'Grantha',\n            astral: '\\uD804[\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]'\n        }, {\n            name: 'Greek',\n            bmp: '\\u0370-\\u0373\\u0375-\\u0377\\u037A-\\u037D\\u037F\\u0384\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03E1\\u03F0-\\u03FF\\u1D26-\\u1D2A\\u1D5D-\\u1D61\\u1D66-\\u1D6A\\u1DBF\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FC4\\u1FC6-\\u1FD3\\u1FD6-\\u1FDB\\u1FDD-\\u1FEF\\u1FF2-\\u1FF4\\u1FF6-\\u1FFE\\u2126\\uAB65',\n            astral: '\\uD800[\\uDD40-\\uDD8E\\uDDA0]|\\uD834[\\uDE00-\\uDE45]'\n        }, {\n            name: 'Gujarati',\n            bmp: '\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AF1\\u0AF9'\n        }, {\n            name: 'Gurmukhi',\n            bmp: '\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75'\n        }, {\n            name: 'Han',\n            bmp: '\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uF900-\\uFA6D\\uFA70-\\uFAD9',\n            astral: '[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Hangul',\n            bmp: '\\u1100-\\u11FF\\u302E\\u302F\\u3131-\\u318E\\u3200-\\u321E\\u3260-\\u327E\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n        }, {\n            name: 'Hanunoo',\n            bmp: '\\u1720-\\u1734'\n        }, {\n            name: 'Hatran',\n            astral: '\\uD802[\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDCFF]'\n        }, {\n            name: 'Hebrew',\n            bmp: '\\u0591-\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F4\\uFB1D-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFB4F'\n        }, {\n            name: 'Hiragana',\n            bmp: '\\u3041-\\u3096\\u309D-\\u309F',\n            astral: '\\uD82C\\uDC01|\\uD83C\\uDE00'\n        }, {\n            name: 'Imperial_Aramaic',\n            astral: '\\uD802[\\uDC40-\\uDC55\\uDC57-\\uDC5F]'\n        }, {\n            name: 'Inherited',\n            bmp: '\\u0300-\\u036F\\u0485\\u0486\\u064B-\\u0655\\u0670\\u0951\\u0952\\u1AB0-\\u1ABE\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u200C\\u200D\\u20D0-\\u20F0\\u302A-\\u302D\\u3099\\u309A\\uFE00-\\uFE0F\\uFE20-\\uFE2D',\n            astral: '\\uD800[\\uDDFD\\uDEE0]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'Inscriptional_Pahlavi',\n            astral: '\\uD802[\\uDF60-\\uDF72\\uDF78-\\uDF7F]'\n        }, {\n            name: 'Inscriptional_Parthian',\n            astral: '\\uD802[\\uDF40-\\uDF55\\uDF58-\\uDF5F]'\n        }, {\n            name: 'Javanese',\n            bmp: '\\uA980-\\uA9CD\\uA9D0-\\uA9D9\\uA9DE\\uA9DF'\n        }, {\n            name: 'Kaithi',\n            astral: '\\uD804[\\uDC80-\\uDCC1]'\n        }, {\n            name: 'Kannada',\n            bmp: '\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2'\n        }, {\n            name: 'Katakana',\n            bmp: '\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D',\n            astral: '\\uD82C\\uDC00'\n        }, {\n            name: 'Kayah_Li',\n            bmp: '\\uA900-\\uA92D\\uA92F'\n        }, {\n            name: 'Kharoshthi',\n            astral: '\\uD802[\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F-\\uDE47\\uDE50-\\uDE58]'\n        }, {\n            name: 'Khmer',\n            bmp: '\\u1780-\\u17DD\\u17E0-\\u17E9\\u17F0-\\u17F9\\u19E0-\\u19FF'\n        }, {\n            name: 'Khojki',\n            astral: '\\uD804[\\uDE00-\\uDE11\\uDE13-\\uDE3E]'\n        }, {\n            name: 'Khudawadi',\n            astral: '\\uD804[\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9]'\n        }, {\n            name: 'Lao',\n            bmp: '\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF'\n        }, {\n            name: 'Latin',\n            bmp: 'A-Za-z\\xAA\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02B8\\u02E0-\\u02E4\\u1D00-\\u1D25\\u1D2C-\\u1D5C\\u1D62-\\u1D65\\u1D6B-\\u1D77\\u1D79-\\u1DBE\\u1E00-\\u1EFF\\u2071\\u207F\\u2090-\\u209C\\u212A\\u212B\\u2132\\u214E\\u2160-\\u2188\\u2C60-\\u2C7F\\uA722-\\uA787\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA7FF\\uAB30-\\uAB5A\\uAB5C-\\uAB64\\uFB00-\\uFB06\\uFF21-\\uFF3A\\uFF41-\\uFF5A'\n        }, {\n            name: 'Lepcha',\n            bmp: '\\u1C00-\\u1C37\\u1C3B-\\u1C49\\u1C4D-\\u1C4F'\n        }, {\n            name: 'Limbu',\n            bmp: '\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1940\\u1944-\\u194F'\n        }, {\n            name: 'Linear_A',\n            astral: '\\uD801[\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]'\n        }, {\n            name: 'Linear_B',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA]'\n        }, {\n            name: 'Lisu',\n            bmp: '\\uA4D0-\\uA4FF'\n        }, {\n            name: 'Lycian',\n            astral: '\\uD800[\\uDE80-\\uDE9C]'\n        }, {\n            name: 'Lydian',\n            astral: '\\uD802[\\uDD20-\\uDD39\\uDD3F]'\n        }, {\n            name: 'Mahajani',\n            astral: '\\uD804[\\uDD50-\\uDD76]'\n        }, {\n            name: 'Malayalam',\n            bmp: '\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4F\\u0D54-\\u0D63\\u0D66-\\u0D7F'\n        }, {\n            name: 'Mandaic',\n            bmp: '\\u0840-\\u085B\\u085E'\n        }, {\n            name: 'Manichaean',\n            astral: '\\uD802[\\uDEC0-\\uDEE6\\uDEEB-\\uDEF6]'\n        }, {\n            name: 'Marchen',\n            astral: '\\uD807[\\uDC70-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]'\n        }, {\n            name: 'Meetei_Mayek',\n            bmp: '\\uAAE0-\\uAAF6\\uABC0-\\uABED\\uABF0-\\uABF9'\n        }, {\n            name: 'Mende_Kikakui',\n            astral: '\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCD6]'\n        }, {\n            name: 'Meroitic_Cursive',\n            astral: '\\uD802[\\uDDA0-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDDFF]'\n        }, {\n            name: 'Meroitic_Hieroglyphs',\n            astral: '\\uD802[\\uDD80-\\uDD9F]'\n        }, {\n            name: 'Miao',\n            astral: '\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]'\n        }, {\n            name: 'Modi',\n            astral: '\\uD805[\\uDE00-\\uDE44\\uDE50-\\uDE59]'\n        }, {\n            name: 'Mongolian',\n            bmp: '\\u1800\\u1801\\u1804\\u1806-\\u180E\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA',\n            astral: '\\uD805[\\uDE60-\\uDE6C]'\n        }, {\n            name: 'Mro',\n            astral: '\\uD81A[\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE6E\\uDE6F]'\n        }, {\n            name: 'Multani',\n            astral: '\\uD804[\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA9]'\n        }, {\n            name: 'Myanmar',\n            bmp: '\\u1000-\\u109F\\uA9E0-\\uA9FE\\uAA60-\\uAA7F'\n        }, {\n            name: 'Nabataean',\n            astral: '\\uD802[\\uDC80-\\uDC9E\\uDCA7-\\uDCAF]'\n        }, {\n            name: 'New_Tai_Lue',\n            bmp: '\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u19DE\\u19DF'\n        }, {\n            name: 'Newa',\n            astral: '\\uD805[\\uDC00-\\uDC59\\uDC5B\\uDC5D]'\n        }, {\n            name: 'Nko',\n            bmp: '\\u07C0-\\u07FA'\n        }, {\n            name: 'Ogham',\n            bmp: '\\u1680-\\u169C'\n        }, {\n            name: 'Ol_Chiki',\n            bmp: '\\u1C50-\\u1C7F'\n        }, {\n            name: 'Old_Hungarian',\n            astral: '\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDCFF]'\n        }, {\n            name: 'Old_Italic',\n            astral: '\\uD800[\\uDF00-\\uDF23]'\n        }, {\n            name: 'Old_North_Arabian',\n            astral: '\\uD802[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'Old_Permic',\n            astral: '\\uD800[\\uDF50-\\uDF7A]'\n        }, {\n            name: 'Old_Persian',\n            astral: '\\uD800[\\uDFA0-\\uDFC3\\uDFC8-\\uDFD5]'\n        }, {\n            name: 'Old_South_Arabian',\n            astral: '\\uD802[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'Old_Turkic',\n            astral: '\\uD803[\\uDC00-\\uDC48]'\n        }, {\n            name: 'Oriya',\n            bmp: '\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B77'\n        }, {\n            name: 'Osage',\n            astral: '\\uD801[\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB]'\n        }, {\n            name: 'Osmanya',\n            astral: '\\uD801[\\uDC80-\\uDC9D\\uDCA0-\\uDCA9]'\n        }, {\n            name: 'Pahawh_Hmong',\n            astral: '\\uD81A[\\uDF00-\\uDF45\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]'\n        }, {\n            name: 'Palmyrene',\n            astral: '\\uD802[\\uDC60-\\uDC7F]'\n        }, {\n            name: 'Pau_Cin_Hau',\n            astral: '\\uD806[\\uDEC0-\\uDEF8]'\n        }, {\n            name: 'Phags_Pa',\n            bmp: '\\uA840-\\uA877'\n        }, {\n            name: 'Phoenician',\n            astral: '\\uD802[\\uDD00-\\uDD1B\\uDD1F]'\n        }, {\n            name: 'Psalter_Pahlavi',\n            astral: '\\uD802[\\uDF80-\\uDF91\\uDF99-\\uDF9C\\uDFA9-\\uDFAF]'\n        }, {\n            name: 'Rejang',\n            bmp: '\\uA930-\\uA953\\uA95F'\n        }, {\n            name: 'Runic',\n            bmp: '\\u16A0-\\u16EA\\u16EE-\\u16F8'\n        }, {\n            name: 'Samaritan',\n            bmp: '\\u0800-\\u082D\\u0830-\\u083E'\n        }, {\n            name: 'Saurashtra',\n            bmp: '\\uA880-\\uA8C5\\uA8CE-\\uA8D9'\n        }, {\n            name: 'Sharada',\n            astral: '\\uD804[\\uDD80-\\uDDCD\\uDDD0-\\uDDDF]'\n        }, {\n            name: 'Shavian',\n            astral: '\\uD801[\\uDC50-\\uDC7F]'\n        }, {\n            name: 'Siddham',\n            astral: '\\uD805[\\uDD80-\\uDDB5\\uDDB8-\\uDDDD]'\n        }, {\n            name: 'SignWriting',\n            astral: '\\uD836[\\uDC00-\\uDE8B\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]'\n        }, {\n            name: 'Sinhala',\n            bmp: '\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2-\\u0DF4',\n            astral: '\\uD804[\\uDDE1-\\uDDF4]'\n        }, {\n            name: 'Sora_Sompeng',\n            astral: '\\uD804[\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9]'\n        }, {\n            name: 'Sundanese',\n            bmp: '\\u1B80-\\u1BBF\\u1CC0-\\u1CC7'\n        }, {\n            name: 'Syloti_Nagri',\n            bmp: '\\uA800-\\uA82B'\n        }, {\n            name: 'Syriac',\n            bmp: '\\u0700-\\u070D\\u070F-\\u074A\\u074D-\\u074F'\n        }, {\n            name: 'Tagalog',\n            bmp: '\\u1700-\\u170C\\u170E-\\u1714'\n        }, {\n            name: 'Tagbanwa',\n            bmp: '\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773'\n        }, {\n            name: 'Tai_Le',\n            bmp: '\\u1950-\\u196D\\u1970-\\u1974'\n        }, {\n            name: 'Tai_Tham',\n            bmp: '\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA0-\\u1AAD'\n        }, {\n            name: 'Tai_Viet',\n            bmp: '\\uAA80-\\uAAC2\\uAADB-\\uAADF'\n        }, {\n            name: 'Takri',\n            astral: '\\uD805[\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]'\n        }, {\n            name: 'Tamil',\n            bmp: '\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BFA'\n        }, {\n            name: 'Tangut',\n            astral: '\\uD81B\\uDFE0|[\\uD81C-\\uD820][\\uDC00-\\uDFFF]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]'\n        }, {\n            name: 'Telugu',\n            bmp: '\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C78-\\u0C7F'\n        }, {\n            name: 'Thaana',\n            bmp: '\\u0780-\\u07B1'\n        }, {\n            name: 'Thai',\n            bmp: '\\u0E01-\\u0E3A\\u0E40-\\u0E5B'\n        }, {\n            name: 'Tibetan',\n            bmp: '\\u0F00-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F97\\u0F99-\\u0FBC\\u0FBE-\\u0FCC\\u0FCE-\\u0FD4\\u0FD9\\u0FDA'\n        }, {\n            name: 'Tifinagh',\n            bmp: '\\u2D30-\\u2D67\\u2D6F\\u2D70\\u2D7F'\n        }, {\n            name: 'Tirhuta',\n            astral: '\\uD805[\\uDC80-\\uDCC7\\uDCD0-\\uDCD9]'\n        }, {\n            name: 'Ugaritic',\n            astral: '\\uD800[\\uDF80-\\uDF9D\\uDF9F]'\n        }, {\n            name: 'Vai',\n            bmp: '\\uA500-\\uA62B'\n        }, {\n            name: 'Warang_Citi',\n            astral: '\\uD806[\\uDCA0-\\uDCF2\\uDCFF]'\n        }, {\n            name: 'Yi',\n            bmp: '\\uA000-\\uA48C\\uA490-\\uA4C6'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeScripts$2);\n\n    var lib$1 = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n\n\n\n    var _xregexp2 = _interopRequireDefault(xregexp$2);\n\n\n\n    var _build2 = _interopRequireDefault(build$2);\n\n\n\n    var _matchrecursive2 = _interopRequireDefault(matchrecursive$2);\n\n\n\n    var _unicodeBase2 = _interopRequireDefault(unicodeBase$2);\n\n\n\n    var _unicodeBlocks2 = _interopRequireDefault(unicodeBlocks$2);\n\n\n\n    var _unicodeCategories2 = _interopRequireDefault(unicodeCategories$2);\n\n\n\n    var _unicodeProperties2 = _interopRequireDefault(unicodeProperties$2);\n\n\n\n    var _unicodeScripts2 = _interopRequireDefault(unicodeScripts$2);\n\n    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n    (0, _build2.default)(_xregexp2.default);\n    (0, _matchrecursive2.default)(_xregexp2.default);\n    (0, _unicodeBase2.default)(_xregexp2.default);\n    (0, _unicodeBlocks2.default)(_xregexp2.default);\n    (0, _unicodeCategories2.default)(_xregexp2.default);\n    (0, _unicodeProperties2.default)(_xregexp2.default);\n    (0, _unicodeScripts2.default)(_xregexp2.default);\n\n    exports.default = _xregexp2.default;\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(lib$1);\n\n    var decamelize$2 = (text, separator) => {\n    \tif (typeof text !== 'string') {\n    \t\tthrow new TypeError('Expected a string');\n    \t}\n\n    \tseparator = typeof separator === 'undefined' ? '_' : separator;\n\n    \tconst regex1 = lib$1('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n    \tconst regex2 = lib$1('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n\n    \treturn text\n    \t\t// TODO: Use this instead of `xregexp` when targeting Node.js 10:\n    \t\t// .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n    \t\t// .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n    \t\t.replace(regex1, `$1${separator}$2`)\n    \t\t.replace(regex2, `$1${separator}$2`)\n    \t\t.toLowerCase();\n    };\n\n    var _decamelize$1 = /*#__PURE__*/Object.freeze({\n        default: decamelize$2,\n        __moduleExports: decamelize$2\n    });\n\n    //handle es6 / bundling\n    const decamelize$3 = (decamelize$2 || _decamelize$1);\n    function createElement$1(tag, attrs, ...children) {\n        if (typeof tag === 'function') {\n            const fn = tag;\n            const props = attrs;\n            props.children = children;\n            return fn(props);\n        }\n        else {\n            const el = document.createElement(tag);\n            const map = attrs;\n            for (let name in map) {\n                if (name && map.hasOwnProperty(name)) {\n                    let value = map[name];\n                    if (name === 'className' && value !== void 0) {\n                        el.setAttribute('class', value.toString());\n                    }\n                    else if (value === false || value === null || value === undefined) {\n                        continue;\n                    }\n                    else if (value === true) {\n                        el.setAttribute(name, name);\n                    }\n                    else if (typeof value === 'function') {\n                        el[name.toLowerCase()] = value;\n                    }\n                    else if (typeof value === 'object') {\n                        el.setAttribute(name, flatten$1(value));\n                    }\n                    else {\n                        el.setAttribute(name, value.toString());\n                    }\n                }\n            }\n            if (children && children.length > 0) {\n                appendChildren$1(el, children);\n            }\n            return el;\n        }\n    }\n    function flatten$1(o) {\n        const arr = [];\n        for (let prop in o)\n            arr.push(`${decamelize$3(prop, '-')}:${o[prop]}`);\n        return arr.join(';');\n    }\n    function addChild$1(parentElement, child) {\n        if (child === null || child === undefined || typeof child === \"boolean\") {\n            return;\n        }\n        else if (Array.isArray(child)) {\n            appendChildren$1(parentElement, child);\n        }\n        else if (isElement$1(child)) {\n            parentElement.appendChild(child);\n        }\n        else {\n            parentElement.appendChild(document.createTextNode(child.toString()));\n        }\n    }\n    function appendChildren$1(parentElement, children) {\n        children.forEach(child => addChild$1(parentElement, child));\n    }\n    function isElement$1(el) {\n        //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n        return !!el.nodeType;\n    }\n    function mount$1(element, container) {\n        const activeChildPositions = getActiveChildPositions$1(container);\n        container.innerHTML = '';\n        if (element) {\n            addChild$1(container, element);\n            if (activeChildPositions)\n                focusChildAtPosition$1(container, activeChildPositions);\n        }\n    }\n    function focusChildAtPosition$1(element, childPositions) {\n        while (element && childPositions.length)\n            element = element.children.item(childPositions.shift());\n        if (element)\n            element.focus();\n    }\n    function getActiveChildPositions$1(containerElement) {\n        var active = document.activeElement;\n        var childPositions = [];\n        while (active !== document.body && active !== containerElement) {\n            childPositions.unshift(childPosition$1(active));\n            active = active.parentElement;\n        }\n        if (active === containerElement && childPositions.length)\n            return childPositions;\n    }\n    function childPosition$1(element) {\n        let i = 0;\n        while (element = element.previousElementSibling)\n            i++;\n        return i;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    var Action;\n    (function (Action) {\n        Action[Action[\"deselect\"] = 0] = \"deselect\";\n        Action[Action[\"isolate\"] = 1] = \"isolate\";\n        Action[Action[\"exclude\"] = 2] = \"exclude\";\n        Action[Action[\"reset\"] = 3] = \"reset\";\n        Action[Action[\"next\"] = 4] = \"next\";\n        Action[Action[\"previous\"] = 5] = \"previous\";\n    })(Action || (Action = {}));\n    class Details {\n        constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n            this.language = language;\n            this.animator = animator;\n            this.dataScope = dataScope;\n            this.colorMapHandler = colorMapHandler;\n            this.hasColorMaps = hasColorMaps;\n            this.element = addDiv(parentElement, `${cssPrefix}unitControls`);\n            this.clear();\n        }\n        finalize() {\n            if (this.element)\n                this.element.innerHTML = '';\n            this.dataScope = null;\n            this.element = null;\n        }\n        clear() {\n            this.state = {\n                userSelection: null,\n                index: -1,\n                remapColor: false\n            };\n            this.render();\n        }\n        clearSelection() {\n            this.state.userSelection = null;\n            this.state.index = -1;\n            this.render();\n        }\n        populate(userSelection, index = 0) {\n            this.state.userSelection = userSelection;\n            this.state.index = index;\n            this.render();\n        }\n        selectByNameValue(columnName, value) {\n            const search = {\n                name: columnName,\n                operator: '==',\n                value\n            };\n            this.clearSelection();\n            this.animator.select(search);\n            this.populate(this.dataScope.selection);\n        }\n        remapChanged(remap) {\n            this.state.remapColor = remap;\n            this.colorMapHandler(remap);\n            this.render();\n        }\n        handleAction(action) {\n            let p;\n            const u = this.state.userSelection;\n            switch (action) {\n                case Action.deselect: {\n                    this.clearSelection();\n                    p = this.animator.deselect();\n                    break;\n                }\n                case Action.exclude: {\n                    this.clearSelection();\n                    p = this.animator.filter(invert(u.search), u.excluded, u.included);\n                    this.state.remapColor = false;\n                    break;\n                }\n                case Action.isolate: {\n                    this.clearSelection();\n                    p = this.animator.filter(u.search, u.included, u.excluded);\n                    this.state.remapColor = false;\n                    break;\n                }\n                case Action.reset: {\n                    this.clear();\n                    p = this.animator.reset();\n                    break;\n                }\n                default: {\n                    switch (action) {\n                        case Action.previous: {\n                            this.state.index--;\n                            if (this.state.index < 0) {\n                                this.state.index = this.state.userSelection.included.length - 1;\n                            }\n                            break;\n                        }\n                        case Action.next: {\n                            this.state.index++;\n                            if (this.state.index >= this.state.userSelection.included.length) {\n                                this.state.index = 0;\n                            }\n                            break;\n                        }\n                    }\n                    this.render();\n                    p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n                }\n            }\n            p.then(() => this.render());\n        }\n        render() {\n            const hasRefinedData = this.dataScope.hasFilteredData();\n            const renderProps = {\n                language: this.language,\n                actionHandler: action => this.handleAction(action),\n                selectionHandler: (columnName, value) => this.selectByNameValue(columnName, value),\n                count: this.state.userSelection && this.state.userSelection.included.length,\n                hasRefinedData,\n                item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n                remapColorHandler: remap => this.remapChanged(remap),\n                hasColorMaps: this.hasColorMaps() && hasRefinedData,\n                remapColor: this.state.remapColor\n            };\n            mount$1(renderDetails(renderProps), this.element);\n        }\n    }\n    const renderDetails = (props) => {\n        const controlButtons = [\n            createElement$1(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.deselect) }, props.language.deselect),\n            createElement$1(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.isolate) }, props.language.isolate),\n            createElement$1(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.exclude) }, props.language.exclude)\n        ];\n        const colorMapping = (createElement$1(\"div\", null,\n            createElement$1(\"button\", { disabled: props.remapColor, onClick: e => props.remapColorHandler(true) }, props.language.newColorMap),\n            createElement$1(\"button\", { disabled: !props.remapColor, onClick: e => props.remapColorHandler(false) }, props.language.oldColorMap)));\n        const singleItem = props.count === 1;\n        const scrollButtons = [\n            createElement$1(\"button\", { disabled: singleItem, onClick: e => props.actionHandler(Action.previous) }, props.language.previousDetail),\n            createElement$1(\"button\", { disabled: singleItem, onClick: e => props.actionHandler(Action.next) }, props.language.nextDetail),\n            createElement$1(\"span\", null,\n                \" \",\n                props.language.selectionCount(props.count))\n        ];\n        const rows = [];\n        for (let prop in props.item) {\n            if (prop === GL_ORDINAL) {\n                continue;\n            }\n            if (isInternalFieldName(prop)) {\n                continue;\n            }\n            rows.push({\n                cells: [\n                    { content: prop }, { content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler) }\n                ]\n            });\n        }\n        return (createElement$1(\"div\", null,\n            props.hasColorMaps && colorMapping,\n            createElement$1(\"h4\", null, props.language.headers.selection),\n            createElement$1(\"div\", { className: `${cssPrefix}selection` },\n                controlButtons,\n                createElement$1(\"button\", { disabled: !props.hasRefinedData, onClick: e => props.actionHandler(Action.reset) }, \"reset\")),\n            props.item && createElement$1(\"h4\", null, props.language.headers.details),\n            createElement$1(\"div\", null,\n                createElement$1(\"div\", { className: `${cssPrefix}details-scroll` }, props.item && scrollButtons),\n                createElement$1(\"div\", { className: `${cssPrefix}details` }, props.item && createElement$1(Table, { rows: rows })))));\n    };\n    function linkSelect(language, columnName, value, selectionHandler) {\n        return (createElement$1(\"span\", null,\n            createElement$1(\"a\", { href: \"#\", onClick: e => selectionHandler(columnName, value) }, value),\n            isNaN(value) ? [' ', createElement$1(\"a\", { className: \"bing-search\", href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`, target: \"_blank\" }, language.bing)] : ''));\n    }\n\n    function ensureHeaders(presenter, headers) {\n        const vegaControls = presenter.getElement(PresenterElement.vegaControls);\n        conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n        const legend = presenter.getElement(PresenterElement.legend);\n        conditionalHeader(!!legend.children.length, legend, headers.legend);\n    }\n    function conditionalHeader(condition, element, header) {\n        var existing = existingHeader(element, header);\n        if (condition && !existing) {\n            addHeader(element, header);\n        }\n        if (!condition && existing) {\n            existing.remove();\n        }\n    }\n    function addHeader(element, header) {\n        const h = document.createElement('h4');\n        h.innerHTML = header;\n        element.insertAdjacentElement('beforebegin', h);\n    }\n    function existingHeader(element, header) {\n        const { previousElementSibling } = element;\n        if (previousElementSibling && previousElementSibling.innerHTML === header) {\n            return previousElementSibling;\n        }\n    }\n\n    function legendRange(colorBinType, column, legend, clickedIndex) {\n        if (column.quantitative) {\n            return selectQuantitative(colorBinType, column, legend, clickedIndex);\n        }\n        else {\n            return selectCategorical(column, legend, clickedIndex);\n        }\n    }\n    function selectCategorical(column, legend, clickedIndex) {\n        const value = legend.rows[clickedIndex].value;\n        if (value === Other) {\n            const values = [];\n            for (let i in legend.rows) {\n                if (+i !== clickedIndex) {\n                    values.push(legend.rows[i].value);\n                }\n            }\n            return selectNone(column, values);\n        }\n        else {\n            //select equal\n            return { expressions: [selectExact(column, legend.rows[clickedIndex].value)] };\n        }\n    }\n    function selectQuantitative(colorBinType, column, legend, clickedIndex) {\n        const keys = Object.keys(legend.rows).map(key => +key).sort((a, b) => +a - +b);\n        let lowValue;\n        let lowOperator;\n        let highValue;\n        let highOperator;\n        const rowText = legend.rows[clickedIndex].label;\n        switch (colorBinType) {\n            case 'continuous': {\n                lowValue = rowText;\n                if (clickedIndex < keys.length - 1) {\n                    highValue = legend.rows[clickedIndex + 1].value;\n                }\n                break;\n            }\n            default: {\n                if (rowText.indexOf('null') > 0) {\n                    const ex = {\n                        expressions: [selectNullOrEmpty(column)]\n                    };\n                    return ex;\n                }\n                const dash = rowText.indexOf('–'); //this is not the common dash character!\n                if (dash > 0) {\n                    //bug in Vega for quantize?\n                    //lowOperator = '>';\n                    //highOperator = '<=';\n                    lowValue = rowText.substr(0, dash);\n                    highValue = rowText.substr(dash + 1);\n                }\n                else {\n                    if (rowText.indexOf('<') >= 0) {\n                        highValue = rowText.substring(2);\n                    }\n                    else {\n                        if (rowText.indexOf('≥') >= 0) {\n                            lowValue = rowText.substring(2);\n                        }\n                    }\n                }\n            }\n        }\n        if (lowValue)\n            lowValue = notNice(lowValue);\n        if (highValue)\n            highValue = notNice(highValue);\n        return selectBetween(column, lowValue, highValue, lowOperator, highOperator);\n    }\n    function finalizeLegend(colorBinType, colorColumn, legend, language) {\n        const rowTexts = [];\n        for (let i in legend.rows) {\n            let row = legend.rows[i];\n            row.search = legendRange(colorBinType, colorColumn, legend, +i);\n            if (row.value === Other) {\n                row.label = language.legendOther;\n            }\n            else if (rowTexts.indexOf(row.value) >= 0) {\n                delete legend.rows[i];\n            }\n            else {\n                rowTexts.push(row.value);\n            }\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function cloneAxis(axes, axisColor, axisTextColor) {\n        return axes.map(axis => {\n            const newAxis = deepMerge(axis);\n            newAxis.domain.color = axisColor;\n            newAxis.title.color = axisTextColor;\n            newAxis.ticks.forEach(t => { t.color = axisColor; });\n            newAxis.tickText.forEach(t => { t.color = axisTextColor; });\n            return newAxis;\n        });\n    }\n    function cloneTextData(textData, color) {\n        return textData.map(t => {\n            return Object.assign(Object.assign({}, t), { color });\n        });\n    }\n    function colorEquals(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    function recolorAxes(stage, oldColors, newColors) {\n        const hasNewLineColor = newColors.axisLine && !colorEquals(newColors.axisLine, oldColors.axisLine);\n        const hasNewTextColor = newColors.axisText && !colorEquals(newColors.axisText, oldColors.axisText);\n        let axes;\n        let textData;\n        if (hasNewLineColor || hasNewTextColor) {\n            const lineColor = newColors.axisLine || oldColors.axisLine;\n            const textColor = newColors.axisText || oldColors.axisText;\n            axes = {\n                x: cloneAxis(stage.axes.x, lineColor, textColor),\n                y: cloneAxis(stage.axes.y, lineColor, textColor)\n            };\n        }\n        if (hasNewTextColor) {\n            textData = cloneTextData(stage.textData, newColors.axisText);\n        }\n        return { axes, textData };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const { GL_ORDINAL: GL_ORDINAL$2 } = constants$1;\n    const { outerSize: outerSize$1 } = util;\n    const { Table: Table$1 } = controls;\n    class Tooltip {\n        constructor(props) {\n            const renderProps = {\n                cssPrefix: props.cssPrefix,\n                rows: getRows(props.item, props.options)\n            };\n            this.element = renderTooltip(renderProps);\n            if (this.element) {\n                this.element.style.position = 'absolute';\n                this.child = this.element.firstChild;\n                document.body.appendChild(this.element);\n                //measure and move as necessary\n                let m = outerSize$1(this.child);\n                while (m.height > document.documentElement.clientHeight) {\n                    let tr = this.child.querySelector('tr:last-child');\n                    if (tr) {\n                        tr.parentElement.removeChild(tr);\n                    }\n                    else {\n                        break;\n                    }\n                    m = outerSize$1(this.child);\n                }\n                if (props.position.clientX + m.width >= document.documentElement.clientWidth) {\n                    this.child.style.right = '0';\n                }\n                let moveTop = true;\n                if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n                    if (props.position.clientY - m.height > 0) {\n                        this.child.style.bottom = '0';\n                    }\n                    else {\n                        moveTop = false;\n                    }\n                }\n                if (moveTop) {\n                    this.element.style.top = `${props.position.clientY}px`;\n                }\n                this.element.style.left = `${props.position.clientX}px`;\n            }\n        }\n        finalize() {\n            if (this.element) {\n                document.body.removeChild(this.element);\n            }\n            this.element = null;\n        }\n    }\n    function getRows(item, options) {\n        const rows = [];\n        for (let columnName in item) {\n            if (columnName === GL_ORDINAL$2) {\n                continue;\n            }\n            if (isInternalFieldName(columnName)) {\n                continue;\n            }\n            if (options && options.exclude) {\n                if (options.exclude(columnName)) {\n                    continue;\n                }\n            }\n            let value = item[columnName];\n            let content;\n            if (options && options.displayValue) {\n                content = options.displayValue(value);\n            }\n            else {\n                switch (value) {\n                    case null:\n                        content = createElement$1(\"i\", null, \"null\");\n                        break;\n                    case undefined:\n                        content = createElement$1(\"i\", null, \"undefined\");\n                        break;\n                    default:\n                        content = value.toString();\n                }\n            }\n            rows.push({\n                cells: [\n                    { content: columnName + ':' },\n                    { content }\n                ]\n            });\n        }\n        return rows;\n    }\n    const renderTooltip = (props) => {\n        return props.rows.length === 0 ? null : (createElement$1(\"div\", { className: `${props.cssPrefix}tooltip` }, Table$1({ rows: props.rows })));\n    };\n\n    var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    const { defaultView: defaultView$1 } = defaults;\n    let didRegisterColorSchemes = false;\n    /**\n     * Component to view a SandDance data visualization.\n     */\n    class Viewer {\n        /**\n         * Instantiate a new Viewer.\n         * @param element Parent HTMLElement to present within.\n         * @param options Optional viewer options object.\n         */\n        constructor(element, options) {\n            this.element = element;\n            this.options = deepMerge(defaultViewerOptions, options);\n            this.presenter = new Presenter(element, getPresenterStyle(this.options));\n            this._dataScope = new DataScope();\n            this._animator = new Animator(this._dataScope, {\n                onDataChanged: this.onDataChanged.bind(this),\n                onAnimateDataChange: this.onAnimateDataChange.bind(this)\n            });\n            this._details = new Details(this.presenter.getElement(PresenterElement.panel), this.options.language, this._animator, this._dataScope, remap => {\n                this.currentColorContext = ~~remap;\n                this.renderSameLayout();\n            }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n            this.insight = {};\n            this._signalValues = {};\n        }\n        changeColorContexts(colorContexts) {\n            this.colorContexts = colorContexts;\n            this.currentColorContext = 0;\n            this.options.onColorContextChange && this.options.onColorContextChange();\n        }\n        applyLegendColorContext(colorContext) {\n            mount$1(colorContext.legendElement, this.presenter.getElement(PresenterElement.legend));\n            this.presenter.stage.legend = colorContext.legend;\n        }\n        onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n            return new Promise((resolve, reject) => {\n                let innerPromise;\n                if (dataChange === DataLayoutChange.refine) {\n                    const oldColorContext = this.colorContexts[this.currentColorContext];\n                    innerPromise = new Promise(innerResolve => {\n                        this.renderNewLayout({\n                            preStage: (stage, deckProps) => {\n                                finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                                this.overrideAxisLabels(stage);\n                                applyColorMapToCubes([oldColorContext.colorMap], getCubes(deckProps));\n                                if (this.options.onStage) {\n                                    this.options.onStage(stage, deckProps);\n                                }\n                            }\n                        }).then(() => {\n                            //apply old legend\n                            this.applyLegendColorContext(oldColorContext);\n                            innerResolve();\n                        });\n                    });\n                }\n                else {\n                    innerPromise = this.renderNewLayout({\n                        preStage: (stage, deckProps) => {\n                            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                            this.overrideAxisLabels(stage);\n                            if (this.options.onStage) {\n                                this.options.onStage(stage, deckProps);\n                            }\n                        }\n                    });\n                }\n                innerPromise.then(() => {\n                    this.presenter.animationQueue(resolve, this.options.transitionDurations.position, { waitingLabel, handlerLabel, animationCanceled: reject });\n                });\n            });\n        }\n        onDataChanged(dataLayout, filter) {\n            return __awaiter(this, void 0, void 0, function* () {\n                switch (dataLayout) {\n                    case DataLayoutChange.same: {\n                        this.renderSameLayout();\n                        break;\n                    }\n                    case DataLayoutChange.refine: {\n                        //save cube colors\n                        const oldColorContext = this.colorContexts[this.currentColorContext];\n                        let colorMap;\n                        yield this.renderNewLayout({\n                            preStage: (stage, deckProps) => {\n                                //save off the spec colors\n                                colorMap = colorMapFromCubes(stage.cubeData);\n                                applyColorMapToCubes([oldColorContext.colorMap], getCubes(deckProps));\n                                this.preStage(stage, deckProps);\n                            },\n                            onPresent: () => {\n                                //save new legend\n                                const newColorContext = {\n                                    colorMap,\n                                    legend: clone(this.presenter.stage.legend),\n                                    legendElement: this.presenter.getElement(PresenterElement.legend).children[0]\n                                };\n                                //apply old legend\n                                this.applyLegendColorContext(oldColorContext);\n                                this.changeColorContexts([oldColorContext, newColorContext]);\n                            }\n                        });\n                        //narrow the filter only if it is different\n                        if (!compare(this.insight.filter, filter)) {\n                            this.insight.filter = narrow(this.insight.filter, filter);\n                        }\n                        if (this.options.onDataFilter) {\n                            this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                        }\n                        break;\n                    }\n                    case DataLayoutChange.reset: {\n                        const colorContext = {\n                            colorMap: null,\n                            legend: null,\n                            legendElement: null\n                        };\n                        this.changeColorContexts([colorContext]);\n                        yield this.renderNewLayout({\n                            onPresent: () => {\n                                populateColorContext(colorContext, this.presenter);\n                            }\n                        });\n                        delete this.insight.filter;\n                        if (this.options.onDataFilter) {\n                            this.options.onDataFilter(null, null);\n                        }\n                        break;\n                    }\n                }\n                if (this.options.onSelectionChanged) {\n                    const sel = this.getSelection();\n                    this.options.onSelectionChanged((sel && sel.search) || null, 0, (sel && sel.selectedData) || null);\n                }\n            });\n        }\n        getSpecColumnsWithFilteredStats() {\n            if (!this._dataScope.hasFilteredData()) {\n                return this._specColumns;\n            }\n            const roles = ['color', 'facet', 'group', 'size', 'sort', 'x', 'y', 'z'];\n            const specColumns = Object.assign({}, this._specColumns);\n            roles.forEach(r => {\n                if (specColumns[r]) {\n                    const column = Object.assign({}, specColumns[r]);\n                    column.stats = this.getColumnStats(column);\n                    specColumns[r] = column;\n                }\n            });\n            return specColumns;\n        }\n        renderNewLayout(c, view) {\n            return __awaiter(this, void 0, void 0, function* () {\n                const currData = this._dataScope.currentData();\n                const context = { specColumns: this.getSpecColumnsWithFilteredStats(), insight: this.insight, specViewOptions: this.options };\n                const specResult = cloneVegaSpecWithData(context, currData);\n                if (!specResult.errors) {\n                    const uiValues = extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n                    this._signalValues = Object.assign(Object.assign(Object.assign({}, this._signalValues), uiValues), this.insight.signalValues);\n                    applySignalValues(this._signalValues, specResult.vegaSpec);\n                    this.vegaSpec = specResult.vegaSpec;\n                    this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n                    this.specCapabilities = specResult.specCapabilities;\n                    const config = this.createConfig(c);\n                    if (view) {\n                        config.getView = () => view;\n                    }\n                    if (!didRegisterColorSchemes) {\n                        registerColorSchemes(base.vega);\n                        didRegisterColorSchemes = true;\n                    }\n                    try {\n                        const runtime = base.vega.parse(this.vegaSpec);\n                        this.vegaViewGl = new ViewGl(runtime, config)\n                            .renderer('deck.gl')\n                            .initialize(this.element);\n                        yield this.vegaViewGl.runAsync();\n                        //capture new color color contexts via signals\n                        this.configForSignalCapture(config.presenterConfig);\n                    }\n                    catch (e) {\n                        specResult.errors = [e.message];\n                    }\n                    if (!specResult.errors) {\n                        ensureHeaders(this.presenter, this.options.language.headers);\n                    }\n                }\n                if (specResult.errors) {\n                    if (this.options.onError) {\n                        this.options.onError(specResult.errors);\n                    }\n                    else if (this.presenter.logger) {\n                        this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n                    }\n                }\n                return specResult;\n            });\n        }\n        /**\n         * Render the same layout with new options.\n         * @param newViewerOptions New options object.\n         */\n        renderSameLayout(newViewerOptions) {\n            const colorContext = this.colorContexts[this.currentColorContext];\n            const clonedCubes = this.presenter.getCubeData().map(cube => {\n                return Object.assign({}, cube);\n            });\n            this.applyLegendColorContext(colorContext);\n            let { axes, textData } = this.presenter.stage;\n            let recoloredAxes;\n            if (newViewerOptions) {\n                if (newViewerOptions.colors) {\n                    recoloredAxes = recolorAxes(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n                    axes = recoloredAxes.axes || axes;\n                    textData = recoloredAxes.textData || textData;\n                }\n                this.options = deepMerge(this.options, newViewerOptions);\n            }\n            let colorMaps = [colorContext.colorMap];\n            let colorMethod;\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            const hasActive = !!this._dataScope.active;\n            if (hasSelectedData || hasActive) {\n                const selectedColorMap = getSelectedColorMap(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                colorMaps.push(selectedColorMap);\n                colorMethod = this.options.colors.unselectedColorMethod;\n            }\n            applyColorMapToCubes(colorMaps, clonedCubes, colorMethod);\n            const stage = { cubeData: clonedCubes, axes, textData };\n            this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n        }\n        getView(view) {\n            if (view === undefined) {\n                if (this.presenter.view === null) {\n                    return defaultView$1;\n                }\n                else {\n                    return this.presenter.view;\n                }\n            }\n            else {\n                return view;\n            }\n        }\n        transformData(values, transform) {\n            try {\n                const runtime = base.vega.parse({\n                    $schema: 'https://vega.github.io/schema/vega/v4.json',\n                    data: [{\n                            name: 'source',\n                            values,\n                            transform\n                        }]\n                });\n                new ViewGl(runtime).run();\n            }\n            catch (e) {\n                // continue regardless of error\n            }\n            return values;\n        }\n        /**\n         * Render data into a visualization.\n         * @param insight Object to create a visualization specification.\n         * @param data Array of data objects.\n         * @param view Optional View to specify camera type.\n         * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n         */\n        render(insight, data, options = {}) {\n            return __awaiter(this, void 0, void 0, function* () {\n                let result;\n                //see if refine expression has changed\n                if (!compare(insight.filter, this.insight.filter)) {\n                    const allowAsyncRenderTime = 100;\n                    if (insight.filter) {\n                        //refining\n                        result = yield this._render(insight, data, options);\n                        this.presenter.animationQueue(() => {\n                            this.filter(insight.filter);\n                        }, allowAsyncRenderTime, { waitingLabel: 'layout before refine', handlerLabel: 'refine after layout' });\n                    }\n                    else {\n                        //not refining\n                        this._dataScope.setFilteredData(null);\n                        result = yield this._render(insight, data, options);\n                        this.presenter.animationQueue(() => {\n                            this.reset();\n                        }, allowAsyncRenderTime, { waitingLabel: 'layout before reset', handlerLabel: 'reset after layout' });\n                    }\n                }\n                else {\n                    result = yield this._render(insight, data, options);\n                }\n                return result;\n            });\n        }\n        shouldViewstateTransition(newInsight, oldInsight) {\n            if (!oldInsight.columns)\n                return false;\n            if (oldInsight.chart !== newInsight.chart)\n                return true;\n            if (oldInsight.size.height !== newInsight.size.height)\n                return true;\n            if (oldInsight.size.width !== newInsight.size.width)\n                return true;\n            if (oldInsight.columns.facet !== newInsight.columns.facet)\n                return true;\n            return false;\n        }\n        configForSignalCapture(presenterConfig) {\n            const colorContext = {\n                colorMap: null,\n                legend: null,\n                legendElement: null\n            };\n            //now be ready to capture color changing signals \n            presenterConfig.preStage = (stage, deckProps) => {\n                if (this._shouldSaveColorContext()) {\n                    //save off the colors from Vega layout\n                    colorContext.colorMap = colorMapFromCubes(stage.cubeData);\n                }\n                this.preStage(stage, deckProps);\n            };\n            presenterConfig.onPresent = () => {\n                if (this._shouldSaveColorContext()) {\n                    populateColorContext(colorContext, this.presenter);\n                    this.changeColorContexts([colorContext]);\n                    this._dataScope.deselect();\n                }\n            };\n        }\n        _render(insight, data, options) {\n            return __awaiter(this, void 0, void 0, function* () {\n                if (this._tooltip) {\n                    this._tooltip.finalize();\n                    this._tooltip = null;\n                }\n                if (this._dataScope.setData(data, options.columns)) {\n                    //data is different, reset the signal value cache\n                    this._signalValues = {};\n                    //apply transform to the data\n                    this.transformData(data, insight.transform);\n                }\n                this._specColumns = getSpecColumns(insight, this._dataScope.getColumns(options.columnTypes));\n                const ordinalMap = assignOrdinals(this._specColumns, data, options.ordinalMap);\n                this.insight = clone(insight);\n                this._lastColorOptions = clone(this.options.colors);\n                this._shouldSaveColorContext = () => !options.initialColorContext;\n                const colorContext = options.initialColorContext || {\n                    colorMap: null,\n                    legend: null,\n                    legendElement: null\n                };\n                const specResult = yield this.renderNewLayout({\n                    preStage: (stage, deckProps) => {\n                        if (this._shouldSaveColorContext()) {\n                            //save off the colors from Vega layout\n                            colorContext.colorMap = colorMapFromCubes(stage.cubeData);\n                        }\n                        else {\n                            //apply passed colorContext\n                            applyColorMapToCubes([colorContext.colorMap], getCubes(deckProps));\n                        }\n                        //if items are selected, repaint\n                        const hasSelectedData = !!this._dataScope.hasSelectedData();\n                        const hasActive = !!this._dataScope.active;\n                        if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n                            const selectedColorMap = getSelectedColorMap(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                            applyColorMapToCubes([colorContext.colorMap, selectedColorMap], stage.cubeData, this.options.colors.unselectedColorMethod);\n                        }\n                        this.preStage(stage, deckProps);\n                    },\n                    onPresent: () => {\n                        if (this._shouldSaveColorContext()) {\n                            populateColorContext(colorContext, this.presenter);\n                            this.changeColorContexts([colorContext]);\n                        }\n                        else {\n                            //apply passed colorContext\n                            this.applyLegendColorContext(colorContext);\n                        }\n                    },\n                    shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight)\n                }, this.getView(insight.view));\n                //future signal changes should save the color context\n                this._shouldSaveColorContext = () => !options.discardColorContextUpdates || !options.discardColorContextUpdates();\n                this._details.render();\n                const result = { ordinalMap, specResult };\n                return result;\n            });\n        }\n        overrideAxisLabels(stage) {\n            // if (this._specColumns.x && this._specColumns.x.type === 'date') {\n            //     stage.axes.x.forEach(axis => makeDateRange(\n            //         axis.tickText,\n            //         this.getColumnStats(this._specColumns.x)\n            //     ));\n            // }\n            // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n            //     stage.axes.y.forEach(axis => makeDateRange(\n            //         axis.tickText,\n            //         this.getColumnStats(this._specColumns.y)\n            //     ));\n            // }\n        }\n        preStage(stage, deckProps) {\n            const onClick = (e, search) => {\n                if (this.options.onAxisClick) {\n                    this.options.onAxisClick(e, search);\n                }\n                else {\n                    this.select(search);\n                }\n            };\n            this.overrideAxisLabels(stage);\n            const polygonLayer = axisSelectionLayer(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n            const order = 1; //after textlayer but before others\n            deckProps.layers.splice(order, 0, polygonLayer);\n            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            if (this.options.onStage) {\n                this.options.onStage(stage, deckProps);\n            }\n        }\n        onCubeClick(e, cube) {\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n                //if active is within selection, keep the selection and activate the one.\n                const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n                if (indexWithinSelection.index >= 0) {\n                    this.activate(indexWithinSelection.datum);\n                    this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                    if (this.options.onSelectionChanged) {\n                        const sel = this.getSelection();\n                        this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                    }\n                    return;\n                }\n            }\n            if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][GL_ORDINAL] === cube.ordinal) {\n                this.deselect();\n                return;\n            }\n            const search = {\n                name: GL_ORDINAL,\n                operator: '==',\n                value: cube.ordinal\n            };\n            this.select(search);\n        }\n        onCubeHover(e, cube) {\n            if (this._tooltip) {\n                this._tooltip.finalize();\n                this._tooltip = null;\n            }\n            if (!cube) {\n                return;\n            }\n            const currentData = this._dataScope.currentData();\n            const index = getDataIndexOfCube(cube, currentData);\n            if (index >= 0) {\n                this._tooltip = new Tooltip({\n                    options: this.options.tooltipOptions,\n                    item: currentData[index],\n                    position: e,\n                    cssPrefix: this.presenter.style.cssPrefix\n                });\n            }\n        }\n        onTextHover(e, t) {\n            //return true if highlight color is different\n            if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor)\n                return false;\n            return !colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n        }\n        createConfig(c) {\n            const { getTextColor, getTextHighlightColor, onTextClick } = this.options;\n            const defaultPresenterConfig$$1 = {\n                getTextColor,\n                getTextHighlightColor,\n                onTextClick,\n                onCubeClick: this.onCubeClick.bind(this),\n                onCubeHover: this.onCubeHover.bind(this),\n                onTextHover: this.onTextHover.bind(this),\n                preStage: this.preStage.bind(this),\n                onPresent: this.options.onPresent,\n                onLayerClick: (info, pickedInfos, e) => {\n                    if (!info) {\n                        this.deselect();\n                    }\n                },\n                onLegendClick: (e, legend, clickedIndex) => {\n                    const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n                    if (legendRow) {\n                        if (this.options.onLegendRowClick) {\n                            this.options.onLegendRowClick(e, legendRow);\n                        }\n                        else {\n                            this.select(legendRow.search);\n                        }\n                    }\n                    else if (this.options.onLegendHeaderClick) {\n                        //header clicked\n                        this.options.onLegendHeaderClick(e);\n                    }\n                }\n            };\n            if (this.options.onBeforeCreateLayers) {\n                defaultPresenterConfig$$1.preLayer = stage => this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n            }\n            const config = {\n                presenter: this.presenter,\n                presenterConfig: Object.assign(defaultPresenterConfig$$1, c)\n            };\n            if (this.options.transitionDurations) {\n                config.presenterConfig.transitionDurations = this.options.transitionDurations;\n            }\n            return config;\n        }\n        /**\n         * Filter the data and animate.\n         * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n         */\n        filter(search) {\n            const u = this._dataScope.createUserSelection(search, false);\n            return new Promise((resolve, reject) => {\n                this._animator.filter(search, u.included, u.excluded).then(() => {\n                    this._details.clear();\n                    this._details.clearSelection();\n                    this._details.populate(this._dataScope.selection);\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Remove any filtration and animate.\n         */\n        reset() {\n            return new Promise((resolve, reject) => {\n                this._animator.reset().then(() => {\n                    this._details.clear();\n                    this._details.clearSelection();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Select cubes by a filter expression.\n         * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n         */\n        select(search) {\n            return new Promise((resolve, reject) => {\n                this._animator.select(search).then(() => {\n                    this._details.populate(this._dataScope.selection);\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Removes any selection.\n         */\n        deselect() {\n            return new Promise((resolve, reject) => {\n                this._animator.deselect().then(() => {\n                    this._details.clearSelection();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Gets the current selection.\n         */\n        getSelection() {\n            if (!this._dataScope)\n                return null;\n            const selectionState = {\n                search: (this._dataScope.selection && this._dataScope.selection.search) || null,\n                selectedData: (this._dataScope.selection && this._dataScope.selection.included) || null,\n                active: this._dataScope.active\n            };\n            return selectionState;\n        }\n        /**\n         * Set one data row to the active state.\n         */\n        activate(datum) {\n            return new Promise((resolve, reject) => {\n                this._animator.activate(datum).then(() => {\n                    this._details.render();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Deactivate item.\n         */\n        deActivate() {\n            return new Promise((resolve, reject) => {\n                if (this._dataScope && this._dataScope.active) {\n                    this._animator.deactivate().then(() => {\n                        this._details.render();\n                        resolve();\n                    });\n                }\n                else {\n                    resolve();\n                }\n            });\n        }\n        /**\n         * Gets the current insight with signal values.\n         */\n        getInsight() {\n            const insight = Object.assign({}, this.insight);\n            insight.signalValues = this.getSignalValues();\n            return insight;\n        }\n        /**\n         * Gets column stats from current data (filtered or all).\n         * @param column Column to get stats for.\n         */\n        getColumnStats(column) {\n            return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n        }\n        /**\n         * Gets current signal values.\n         */\n        getSignalValues() {\n            return extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n        }\n        finalize() {\n            if (this._dataScope)\n                this._dataScope.finalize();\n            if (this._details)\n                this._details.finalize();\n            if (this._tooltip)\n                this._tooltip.finalize();\n            if (this.vegaViewGl)\n                this.vegaViewGl.finalize();\n            if (this.presenter)\n                this.presenter.finalize();\n            if (this.element)\n                this.element.innerHTML = '';\n            this.colorContexts = null;\n            this.element = null;\n            this.options = null;\n            this.presenter = null;\n            this.vegaSpec = null;\n            this.vegaViewGl = null;\n            this._animator = null;\n            this._dataScope = null;\n            this._details = null;\n            this._tooltip = null;\n        }\n    }\n    /**\n     * Default Viewer options.\n     */\n    Viewer.defaultViewerOptions = defaultViewerOptions;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const version = '2.1.0';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const use$1 = use;\n\n    exports.colorSchemes = colorSchemes;\n    exports.constants = constants;\n    exports.searchExpression = index;\n    exports.types = types;\n    exports.use = use$1;\n    exports.util = util$1;\n    exports.VegaDeckGl = index$2;\n    exports.Viewer = Viewer;\n    exports.version = version;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"
  },
  {
    "path": "docs/dist/sanddance/v3/sanddance.css",
    "content": ".sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%;\n}\n\n.sanddance-gl {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%);\n}\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em;\n}\n\n.sanddance-legend table {\n  border-collapse: collapse;\n}\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em;\n}\n.sanddance-legend .legend-row {\n  cursor: pointer;\n}\n.sanddance-legend .legend-row td {\n  padding: 2px;\n}\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef;\n}\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px;\n}\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n.sanddance-details {\n  font-size: smaller;\n}\n\n.sanddance-details-scroll {\n  padding-bottom: 1em;\n}\n\n.sanddance-tooltip {\n  z-index: 1;\n}\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute;\n}\n.sanddance-tooltip td {\n  max-width: 16em;\n  overflow: hidden;\n  text-align: left;\n  text-overflow: ellipsis;\n  vertical-align: top;\n  width: 75%;\n}\n.sanddance-tooltip td:first-child {\n  width: 25%;\n}\n\n/*# sourceMappingURL=sanddance.css.map */\n"
  },
  {
    "path": "docs/dist/sanddance/v3/sanddance.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.SandDance = {}));\n})(this, (function (exports) { 'use strict';\n\n    function _mergeNamespaces(n, m) {\n        m.forEach(function (e) {\n            e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n                if (k !== 'default' && !(k in n)) {\n                    var d = Object.getOwnPropertyDescriptor(e, k);\n                    Object.defineProperty(n, k, d.get ? d : {\n                        enumerable: true,\n                        get: function () { return e[k]; }\n                    });\n                }\n            });\n        });\n        return Object.freeze(n);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const FieldNames = {\n        Active: '__SandDance__Active',\n        Collapsed: '__SandDance__Collapsed',\n        Contains: '__SandDance__Contains',\n        Count: '__SandDance__Count',\n        Sum: '__SandDance__Sum',\n        SumOfCount: '__SandDance__CountSum',\n        SumOfSum: '__SandDance__SumSum',\n        Selected: '__SandDance__Selected',\n        First: '__SandDance__First',\n        Last: '__SandDance__Last',\n        Top: '__SandDance__Top',\n        TopColor: '__SandDance__TopColor',\n        TopIndex: '__SandDance__TopIndex',\n        PowerBISelectionId: '__SandDance__PowerBISelectionId',\n        FacetSearch: '__SandDance__FacetSearch',\n        FacetTitle: '__SandDance__FacetTitle',\n        Ordinal: '__SandDance__Ordinal',\n        WrapCol: '__SandDance__WrapCol',\n        WrapRow: '__SandDance__WrapRow',\n        Value: '__SandDance__Value',\n        OffsetX: '__SandDance__X',\n        OffsetY: '__SandDance__Y',\n        OffsetHeight: '__SandDance__H',\n        OffsetWidth: '__SandDance__W'\n    };\n    const ScaleNames = {\n        Color: 'scale_color',\n        X: 'scale_x',\n        Y: 'scale_y',\n        Z: 'scale_z'\n    };\n    //Signal names\n    const SignalNames = {\n        ViewportWidth: 'ViewportWidth',\n        ViewportHeight: 'ViewportHeight',\n        MinCellWidth: 'MinCellWidth',\n        MinCellHeight: 'MinCellHeight',\n        PlotOffsetLeft: 'PlotOffsetLeft',\n        PlotOffsetTop: 'PlotOffsetTop',\n        PlotOffsetBottom: 'PlotOffsetBottom',\n        PlotOffsetRight: 'PlotOffsetRight',\n        PlotHeightIn: 'PlotHeightIn',\n        PlotWidthIn: 'PlotWidthIn',\n        PlotHeightOut: 'PlotHeightOut',\n        PlotWidthOut: 'PlotWidthOut',\n        ColorBinCount: 'RoleColor_BinCountSignal',\n        ColorReverse: 'RoleColor_ReverseSignal',\n        FacetBins: 'RoleFacet_BinsSignal',\n        FacetVBins: 'RoleFacetV_BinsSignal',\n        FacetPaddingTop: 'FacetPaddingTop',\n        FacetPaddingBottom: 'FacetPaddingBottom',\n        FacetPaddingLeft: 'FacetPaddingLeft',\n        MarkOpacity: 'Mark_OpacitySignal',\n        PointScale: 'Chart_PointScaleSignal',\n        TextAngleX: 'Text_AngleXSignal',\n        TextAngleY: 'Text_AngleYSignal',\n        TextScale: 'Text_ScaleSignal',\n        TextSize: 'Text_SizeSignal',\n        TextTitleSize: 'Text_TitleSizeSignal',\n        TreeMapMethod: 'Chart_TreeMapMethodSignal',\n        XBins: 'RoleX_BinsSignal',\n        YBins: 'RoleY_BinsSignal',\n        ZHeight: 'RoleZ_HeightSignal',\n        ZGrounded: 'RoleZ_Grounded',\n        ZProportion: 'RoleZ_ProportionSignal'\n    };\n    //These are special formulaic data values\n    const Other = '__Other';\n    //name of the \"no-color\" palette\n    const ColorScaleNone = 'none';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    //TODO move these to options\n    const defaultBins = 10;\n    const maxbins = 100;\n    const minBarBandWidth = 15;\n    const minFacetWidth = 140;\n    const minFacetHeight = 180;\n    const facetPaddingLeft = 40;\n    const facetPaddingTop = 40;\n    const facetPaddingBottom = 40;\n    const facetPaddingRight = 40;\n    const axesLabelLimit = 100;\n    const axesTitleLimit = 100;\n    const axesTitlePaddingX = 30;\n    const axesTitlePaddingY = 60;\n    const axesTitlePaddingFacetX = 69;\n    const axesTitlePaddingFacetY = 92;\n    const axesOffsetX = 120;\n    const axesOffsetY = 120;\n    const scatterSizedDiv = 20;\n\n    function allowNoneForSize(specContext) {\n        switch (specContext.insight.totalStyle) {\n            case 'sum-strip':\n            case 'sum-strip-percent':\n            case 'sum-treemap':\n                return false;\n            default:\n                //if totalStyle is blank, count is assumed\n                return true;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function barchartH (specContext) {\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { language } = specViewOptions;\n        const bandProps = {\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes: true\n        };\n        const x = { title: null };\n        const axisScales = {\n            x,\n            y: { title: specColumns.y && specColumns.y.name },\n            z: { title: specColumns.z && specColumns.z.name }\n        };\n        const layouts = [{\n                layoutType: 'Band',\n                props: bandProps\n            }];\n        if (insight.totalStyle === 'sum-strip-percent') {\n            x.aggregate = 'percent';\n            x.title = language.percent;\n            const stripProps = {\n                addPercentageScale: true,\n                sortOrder: 'ascending',\n                orientation: 'horizontal',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps\n            });\n        }\n        else {\n            const aggProps = {\n                niceScale: true,\n                dock: 'left',\n                globalAggregateMaxExtentSignal: 'aggMaxExtent',\n                globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n                sumBy: specColumns.size,\n                showAxes: true\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props: aggProps\n            });\n            switch (insight.totalStyle) {\n                case 'sum-treemap': {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const treemapProps = {\n                        corner: 'top-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps\n                    });\n                    break;\n                }\n                case 'sum-strip': {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps\n                    });\n                    break;\n                }\n                case 'count-strip': {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps\n                    });\n                    break;\n                }\n                default: {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'down-right',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps\n                    });\n                    break;\n                }\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                percentage: true,\n                roles: [\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins]\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: specColumns.z && specColumns.z.quantitative ? 'range' : 'exact',\n                        allowNone: true\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod]\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins]\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins]\n                    }\n                ]\n            }\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function barchartV (specContext) {\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { language } = specViewOptions;\n        const bandProps = {\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes: true\n        };\n        const y = { title: null };\n        const axisScales = {\n            x: { title: specColumns.x && specColumns.x.name },\n            y,\n            z: { title: specColumns.z && specColumns.z.name }\n        };\n        const layouts = [{\n                layoutType: 'Band',\n                props: bandProps\n            }];\n        if (insight.totalStyle === 'sum-strip-percent') {\n            y.aggregate = 'percent';\n            y.title = language.percent;\n            const stripProps = {\n                addPercentageScale: true,\n                sortOrder: 'descending',\n                orientation: 'vertical',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps\n            });\n        }\n        else {\n            const aggProps = {\n                niceScale: true,\n                dock: 'bottom',\n                globalAggregateMaxExtentSignal: 'aggMaxExtent',\n                globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n                sumBy: specColumns.size,\n                showAxes: true\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props: aggProps\n            });\n            switch (insight.totalStyle) {\n                case 'sum-treemap': {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const treemapProps = {\n                        corner: 'bottom-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps\n                    });\n                    break;\n                }\n                case 'sum-strip': {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps\n                    });\n                    break;\n                }\n                case 'count-strip': {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps\n                    });\n                    break;\n                }\n                default: {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'right-up',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps\n                    });\n                    break;\n                }\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                percentage: true,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins]\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: specColumns.z && specColumns.z.quantitative ? 'range' : 'exact',\n                        allowNone: true\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod]\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins]\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins]\n                    }\n                ]\n            }\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function density (specContext) {\n        const { insight, specColumns, specViewOptions } = specContext;\n        const axisScales = {\n            x: { title: specColumns.x && specColumns.x.name },\n            y: { title: specColumns.y && specColumns.y.name },\n            z: { title: specColumns.z && specColumns.z.name }\n        };\n        const hBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes: true\n        };\n        const vBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes: true\n        };\n        const aggProps = {\n            onBuild: null,\n            aggregation: null,\n            sumBy: specColumns.size\n        };\n        const layouts = [\n            {\n                layoutType: 'Band',\n                props: vBandProps\n            },\n            {\n                layoutType: 'Band',\n                props: hBandProps\n            },\n            {\n                layoutType: 'AggregateSquare',\n                props: aggProps\n            }\n        ];\n        switch (insight.totalStyle) {\n            case 'sum-treemap': {\n                aggProps.aggregation = 'sum';\n                const treemapProps = {\n                    corner: 'bottom-left',\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: 'Treemap',\n                    props: treemapProps\n                });\n                break;\n            }\n            case 'sum-strip': {\n                aggProps.aggregation = 'sum';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps\n                });\n                break;\n            }\n            case 'count-strip': {\n                aggProps.aggregation = 'count';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    sort: specColumns.sort,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps\n                });\n                break;\n            }\n            default: {\n                aggProps.aggregation = 'count';\n                const squareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: 'right-down',\n                    z: specColumns.z,\n                    maxGroupedUnits: null,\n                    maxGroupedFillSize: null\n                };\n                aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled) => {\n                    squareProps.maxGroupedUnits = aggMaxExtent;\n                    squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n                };\n                layouts.push({\n                    layoutType: 'Square',\n                    props: squareProps\n                });\n                break;\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins]\n                    },\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins]\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: specColumns.z && specColumns.z.quantitative ? 'range' : 'exact',\n                        allowNone: true\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod]\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins]\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins]\n                    }\n                ]\n            }\n        };\n    }\n\n    function grid (specContext) {\n        const { specColumns } = specContext;\n        const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: 'right-down',\n            z: specColumns.z,\n            collapseYHeight: true\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name }\n        };\n        return {\n            axisScales,\n            layouts: [\n                {\n                    layoutType: 'Square',\n                    props: squareProps\n                }\n            ],\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'z',\n                        axisSelection: specColumns.z && specColumns.z.quantitative ? 'range' : 'exact',\n                        allowNone: true\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins]\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins]\n                    }\n                ]\n            }\n        };\n    }\n\n    function scatterplot (specContext) {\n        const { specColumns, specViewOptions } = specContext;\n        const scatterProps = {\n            x: specColumns.x,\n            y: specColumns.y,\n            z: specColumns.z,\n            size: specColumns.size,\n            scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n            zGrounded: specViewOptions.language.zGrounded\n        };\n        const axisScales = {\n            x: { title: specColumns.x && specColumns.x.name },\n            y: { title: specColumns.y && specColumns.y.name },\n            z: { title: specColumns.z && specColumns.z.name }\n        };\n        return {\n            axisScales,\n            layouts: [\n                {\n                    layoutType: 'Scatter',\n                    props: scatterProps\n                }\n            ],\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'x',\n                        axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact'\n                    },\n                    {\n                        role: 'y',\n                        axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact'\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: specColumns.z && specColumns.z.quantitative ? 'range' : 'exact',\n                        allowNone: true\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true\n                    },\n                    {\n                        role: 'size',\n                        excludeCategoric: true,\n                        allowNone: true\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins]\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins]\n                    }\n                ],\n                signals: [SignalNames.PointScale, SignalNames.ZGrounded]\n            }\n        };\n    }\n\n    function stacks (specContext) {\n        const { specColumns, specViewOptions } = specContext;\n        const axisScales = {\n            x: { title: specColumns.x && specColumns.x.name },\n            y: { title: specColumns.y && specColumns.y.name },\n            z: { title: specViewOptions.language.count }\n        };\n        const hBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes: true\n        };\n        const vBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes: true\n        };\n        const stackProps = {\n            sort: specColumns.sort\n        };\n        return {\n            axisScales,\n            customZScale: true,\n            layouts: [\n                {\n                    layoutType: 'Band',\n                    props: vBandProps\n                },\n                {\n                    layoutType: 'Band',\n                    props: hBandProps\n                },\n                {\n                    layoutType: 'Stack',\n                    props: stackProps\n                }\n            ],\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins]\n                    },\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins]\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins]\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins]\n                    }\n                ]\n            }\n        };\n    }\n\n    function strips (specContext) {\n        const { specColumns } = specContext;\n        const stripProps = {\n            sortOrder: 'ascending',\n            orientation: 'vertical',\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name }\n        };\n        const layouts = [];\n        if (specColumns.facet) {\n            axisScales.y = {\n                title: null,\n                aggregate: specColumns.size ? 'sum' : 'count'\n            };\n            const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n            const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n            const props = {\n                dock: 'top',\n                niceScale: false,\n                globalAggregateMaxExtentScaledSignal,\n                globalAggregateMaxExtentSignal,\n                sumBy: specColumns.size,\n                showAxes: false\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props\n            });\n        }\n        layouts.push({\n            layoutType: 'Strip',\n            props: stripProps\n        });\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'size',\n                        allowNone: true,\n                        excludeCategoric: true\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: specColumns.z && specColumns.z.quantitative ? 'range' : 'exact',\n                        allowNone: true\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins]\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins]\n                    }\n                ]\n            }\n        };\n    }\n\n    function treemap (specContext) {\n        const { specColumns, specViewOptions } = specContext;\n        const treemapProps = {\n            corner: 'top-left',\n            group: specColumns.group,\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name }\n        };\n        const layouts = [];\n        if (specColumns.facet) {\n            axisScales.y = {\n                title: null,\n                aggregate: 'sum'\n            };\n            const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n            const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n            const props = {\n                dock: 'top',\n                niceScale: false,\n                globalAggregateMaxExtentScaledSignal,\n                globalAggregateMaxExtentSignal,\n                sumBy: specColumns.size,\n                showAxes: false\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props\n            });\n        }\n        layouts.push({\n            layoutType: 'Treemap',\n            props: treemapProps\n        });\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'size',\n                        excludeCategoric: true,\n                    },\n                    {\n                        role: 'group',\n                        allowNone: true\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: specColumns.z && specColumns.z.quantitative ? 'range' : 'exact',\n                        allowNone: true\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins]\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins]\n                    }\n                ],\n                signals: [SignalNames.TreeMapMethod]\n            }\n        };\n    }\n\n    function getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n        let layoutPair;\n        const groupby = facetColumn;\n        const plotPadding = {\n            x: 0,\n            y: 0\n        };\n        let facetPadding;\n        switch (facetStyle) {\n            case 'cross': {\n                const props = {\n                    axisTextColor,\n                    colRowTitles: true,\n                    groupbyX: groupby,\n                    groupbyY: facetVColumn\n                };\n                layoutPair = {\n                    layoutType: 'Cross',\n                    props\n                };\n                facetPadding = {\n                    bottom: facetPaddingBottom,\n                    left: facetPaddingLeft,\n                    top: 0\n                };\n                plotPadding.y = facetPaddingTop;\n                plotPadding.x = facetPaddingRight;\n                break;\n            }\n            case 'wrap':\n            default: {\n                const props = {\n                    axisTextColor,\n                    cellTitles: true,\n                    groupby\n                };\n                layoutPair = {\n                    layoutType: 'Wrap',\n                    props\n                };\n                facetPadding =\n                    {\n                        bottom: facetPaddingBottom,\n                        left: facetPaddingLeft,\n                        top: facetPaddingTop\n                    };\n                break;\n            }\n        }\n        const facetLayout = {\n            facetPadding,\n            plotPadding\n        };\n        return {\n            layoutPair,\n            facetLayout\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const map = {\n        barchart: barchartV,\n        barchartH,\n        barchartV,\n        density,\n        grid,\n        scatterplot,\n        stacks,\n        strips,\n        treemap\n    };\n    function getSpecBuilderPropsForChart(specContext) {\n        const { insight, specColumns, specViewOptions } = specContext;\n        const fn = map[insight.chart];\n        if (fn) {\n            const props = fn(specContext);\n            if (insight.columns.facet) {\n                const discreteFacetColumn = {\n                    column: specColumns.facet,\n                    defaultBins,\n                    maxbins,\n                    maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                    maxbinsSignalName: SignalNames.FacetBins\n                };\n                const discreteFacetVColumn = {\n                    column: specColumns.facetV,\n                    defaultBins,\n                    maxbins,\n                    maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                    maxbinsSignalName: SignalNames.FacetVBins\n                };\n                const { facetLayout, layoutPair } = getFacetLayout(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n                props.layouts.unshift(layoutPair);\n                props.facetLayout = facetLayout;\n            }\n            return props;\n        }\n    }\n\n    function define$1(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend$1(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color$1() {}\n\n    var darker$1 = 0.7;\n    var brighter$1 = 1 / darker$1;\n\n    var reI$1 = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN$1 = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP$1 = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex$1 = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger$1 = new RegExp(\"^rgb\\\\(\" + [reI$1, reI$1, reI$1] + \"\\\\)$\"),\n        reRgbPercent$1 = new RegExp(\"^rgb\\\\(\" + [reP$1, reP$1, reP$1] + \"\\\\)$\"),\n        reRgbaInteger$1 = new RegExp(\"^rgba\\\\(\" + [reI$1, reI$1, reI$1, reN$1] + \"\\\\)$\"),\n        reRgbaPercent$1 = new RegExp(\"^rgba\\\\(\" + [reP$1, reP$1, reP$1, reN$1] + \"\\\\)$\"),\n        reHslPercent$1 = new RegExp(\"^hsl\\\\(\" + [reN$1, reP$1, reP$1] + \"\\\\)$\"),\n        reHslaPercent$1 = new RegExp(\"^hsla\\\\(\" + [reN$1, reP$1, reP$1, reN$1] + \"\\\\)$\");\n\n    var named$1 = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define$1(Color$1, color$1, {\n      copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable: function() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex$1, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex$1,\n      formatHsl: color_formatHsl$1,\n      formatRgb: color_formatRgb$1,\n      toString: color_formatRgb$1\n    });\n\n    function color_formatHex$1() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHsl$1() {\n      return hslConvert$1(this).formatHsl();\n    }\n\n    function color_formatRgb$1() {\n      return this.rgb().formatRgb();\n    }\n\n    function color$1(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex$1.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn$1(m) // #ff0000\n          : l === 3 ? new Rgb$1((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? rgba$1(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? rgba$1((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger$1.exec(format)) ? new Rgb$1(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent$1.exec(format)) ? new Rgb$1(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger$1.exec(format)) ? rgba$1(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent$1.exec(format)) ? rgba$1(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent$1.exec(format)) ? hsla$1(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent$1.exec(format)) ? hsla$1(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named$1.hasOwnProperty(format) ? rgbn$1(named$1[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb$1(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn$1(n) {\n      return new Rgb$1(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba$1(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb$1(r, g, b, a);\n    }\n\n    function rgbConvert$1(o) {\n      if (!(o instanceof Color$1)) o = color$1(o);\n      if (!o) return new Rgb$1;\n      o = o.rgb();\n      return new Rgb$1(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb$1(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert$1(r) : new Rgb$1(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb$1(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define$1(Rgb$1, rgb$1, extend$1(Color$1, {\n      brighter: function(k) {\n        k = k == null ? brighter$1 : Math.pow(brighter$1, k);\n        return new Rgb$1(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker$1 : Math.pow(darker$1, k);\n        return new Rgb$1(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb: function() {\n        return this;\n      },\n      displayable: function() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex$1, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex$1,\n      formatRgb: rgb_formatRgb$1,\n      toString: rgb_formatRgb$1\n    }));\n\n    function rgb_formatHex$1() {\n      return \"#\" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b);\n    }\n\n    function rgb_formatRgb$1() {\n      var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n      return (a === 1 ? \"rgb(\" : \"rgba(\")\n          + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n          + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n\n    function hex$1(value) {\n      value = Math.max(0, Math.min(255, Math.round(value) || 0));\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla$1(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl$1(h, s, l, a);\n    }\n\n    function hslConvert$1(o) {\n      if (o instanceof Hsl$1) return new Hsl$1(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color$1)) o = color$1(o);\n      if (!o) return new Hsl$1;\n      if (o instanceof Hsl$1) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl$1(h, s, l, o.opacity);\n    }\n\n    function hsl$1(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert$1(h) : new Hsl$1(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl$1(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define$1(Hsl$1, hsl$1, extend$1(Color$1, {\n      brighter: function(k) {\n        k = k == null ? brighter$1 : Math.pow(brighter$1, k);\n        return new Hsl$1(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker$1 : Math.pow(darker$1, k);\n        return new Hsl$1(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb$1(\n          hsl2rgb$1(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb$1(h, m1, m2),\n          hsl2rgb$1(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl: function() {\n        var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\")\n            + (this.h || 0) + \", \"\n            + (this.s || 0) * 100 + \"%, \"\n            + (this.l || 0) * 100 + \"%\"\n            + (a === 1 ? \")\" : \", \" + a + \")\");\n      }\n    }));\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb$1(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function isColor(cssColorSpecifier) {\n        return !!color$1(cssColorSpecifier);\n    }\n    function isQuantitative(column) {\n        return column.type === 'number' || column.type === 'integer';\n    }\n    /**\n     * Derive column metadata from the data array.\n     * @param data Array of data objects.\n     */\n    function getColumnsFromData(inferTypesFn, data, columnTypes) {\n        const sample = data[0];\n        const fields = sample ? Object.keys(sample) : [];\n        const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n        const columns = fields.map(name => {\n            const column = {\n                name,\n                type: inferences[name]\n            };\n            return column;\n        });\n        inferAll(columns, data);\n        return columns;\n    }\n    /**\n     * Get columns associated with each Insight role.\n     * @param insight Insight to specify column roles.\n     * @param columns Array of Columns inferred from the data.\n     */\n    function getSpecColumns(insight, columns) {\n        function getColumnByName(name) {\n            return columns.filter(c => c.name === name)[0];\n        }\n        return {\n            color: getColumnByName(insight.columns && insight.columns.color),\n            facet: getColumnByName(insight.columns && insight.columns.facet),\n            facetV: getColumnByName(insight.columns && insight.columns.facetV),\n            group: getColumnByName(insight.columns && insight.columns.group),\n            size: getColumnByName(insight.columns && insight.columns.size),\n            sort: getColumnByName(insight.columns && insight.columns.sort),\n            uid: getColumnByName(insight.columns && insight.columns.uid),\n            x: getColumnByName(insight.columns && insight.columns.x),\n            y: getColumnByName(insight.columns && insight.columns.y),\n            z: getColumnByName(insight.columns && insight.columns.z)\n        };\n    }\n    /**\n     * Populate columns with type inferences and stats.\n     * @param columns Array of columns.\n     * @param data Array of data objects.\n     */\n    function inferAll(columns, data) {\n        columns.forEach(column => {\n            if (column) {\n                if (typeof column.quantitative !== 'boolean') {\n                    column.quantitative = isQuantitative(column);\n                }\n                if (!column.stats) {\n                    column.stats = getStats(data, column);\n                }\n                if (column.type === 'string' && typeof column.isColorData !== 'boolean') {\n                    checkIsColorData(data, column);\n                }\n            }\n        });\n    }\n    function checkIsColorData(data, column) {\n        if (!column.stats.hasColorData) {\n            column.isColorData = false;\n            return;\n        }\n        for (let i = 0; i < data.length; i++) {\n            if (!isColor(data[i][column.name])) {\n                column.isColorData = false;\n                return;\n            }\n        }\n        column.isColorData = true;\n    }\n    function getStats(data, column) {\n        const distinctMap = {};\n        const stats = {\n            distinctValueCount: null,\n            max: null,\n            mean: null,\n            min: null\n        };\n        let sum = 0;\n        for (let i = 0; i < data.length; i++) {\n            let row = data[i];\n            let value = row[column.name];\n            distinctMap[value] = true;\n            if (stats.max === null || value > stats.max) {\n                stats.max = value;\n            }\n            if (stats.min === null || value < stats.min) {\n                stats.min = value;\n            }\n            let num = +value;\n            if (!isNaN(num)) {\n                sum += num;\n            }\n            if (column.type === 'string' && !stats.hasColorData && isColor(value)) {\n                stats.hasColorData = true;\n            }\n        }\n        if (column.quantitative) {\n            stats.mean = data.length > 0 && (sum / data.length);\n            stats.hasNegative = detectNegative(column, data);\n            if (column.type === 'integer') {\n                stats.isSequential = detectSequentialColumn(column, data);\n            }\n        }\n        stats.distinctValueCount = Object.keys(distinctMap).length;\n        return stats;\n    }\n    function detectNegative(column, data) {\n        for (let i = 1; i < data.length; i++) {\n            if (data[i][column.name] < 0)\n                return true;\n        }\n        return false;\n    }\n    function detectSequentialColumn(column, data) {\n        if (data.length < 2)\n            return false;\n        let colname = column.name;\n        for (let i = 1; i < data.length; i++) {\n            if (data[i][colname] !== data[i - 1][colname] + 1)\n                return false;\n        }\n        return true;\n    }\n\n    function addAxes(scope, ...axis) {\n        if (!scope.axes) {\n            scope.axes = [];\n        }\n        scope.axes.push(...axis);\n    }\n    function addData(scope, ...data) {\n        if (!scope.data) {\n            scope.data = [];\n        }\n        scope.data.push(...data);\n    }\n    function addMarks(scope, ...marks) {\n        if (!scope.marks) {\n            scope.marks = [];\n        }\n        scope.marks.push(...marks);\n    }\n    function addScales(scope, ...scale) {\n        if (!scope.scales) {\n            scope.scales = [];\n        }\n        scope.scales.push(...scale.filter(Boolean));\n    }\n    function addSignals(scope, ...signal) {\n        if (!scope.signals) {\n            scope.signals = [];\n        }\n        scope.signals.push(...signal);\n    }\n    function addTransforms(data, ...transforms) {\n        if (!data.transform) {\n            data.transform = [];\n        }\n        data.transform.push(...transforms);\n    }\n    function getDataByName(data, dataName) {\n        for (let i = 0; i < data.length; i++) {\n            if (data[i].name === dataName)\n                return { data: data[i], index: i };\n        }\n    }\n    function getGroupBy(groupings) {\n        const groupby = groupings.map(g => g.groupby);\n        return groupby.reduce((acc, val) => acc.concat(val), []);\n    }\n    function addOffsets(...offsets) {\n        return offsets.filter(Boolean).join(' + ');\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function addGlobalAxes(props) {\n        const { axesOffsets, axisScales, axesScopes, axesTitlePadding, allGlobalScales, globalScope, labelBaseline, plotOffsetSignals, specColumns, specViewOptions } = props;\n        const { scope } = globalScope;\n        allGlobalScales.forEach(globalScales => {\n            const { scales } = globalScales;\n            for (let xyz in scales) {\n                let _scales = scales[xyz];\n                if (_scales) {\n                    addScales(scope, ..._scales);\n                    let { showAxes } = globalScales;\n                    let zindex = undefined;\n                    if (xyz === 'z') {\n                        showAxes = false;\n                        if (props.view === '3d' && specViewOptions.zAxisOptions && !props.faceted) {\n                            if (specViewOptions.zAxisOptions.showZAxis) {\n                                showAxes = true;\n                                zindex = specViewOptions.zAxisOptions.zIndex;\n                            }\n                        }\n                    }\n                    if (showAxes && axisScales) {\n                        let axisScale = axisScales[xyz];\n                        if (axisScale) {\n                            const lineColor = specViewOptions.colors.axisLine;\n                            const horizontal = xyz === 'x';\n                            const column = specColumns[xyz] || { quantitative: true };\n                            const title = axisScale.title;\n                            const props = {\n                                title,\n                                horizontal,\n                                column,\n                                specViewOptions,\n                                lineColor,\n                                titlePadding: axesTitlePadding[xyz],\n                                labelBaseline: labelBaseline[xyz],\n                                zindex\n                            };\n                            axesScopes['main'].forEach(a => addAxes(a.scope, createAxis(Object.assign(Object.assign({}, props), { scale: a.scale || _scales[0], showTitle: a.title, showLabels: a.labels, showLines: a.lines }))));\n                            if (axesScopes[xyz]) {\n                                axesScopes[xyz].forEach(a => addAxes(a.scope, createAxis(Object.assign(Object.assign({}, props), { scale: a.scale || _scales[0], showTitle: a.title, showLabels: a.labels, showLines: a.lines }))));\n                            }\n                            if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                                const plotOffsetSignal = plotOffsetSignals[xyz];\n                                plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                            }\n                        }\n                    }\n                }\n            }\n        });\n    }\n    function createAxis(props) {\n        const { column, horizontal, labelBaseline, lineColor, scale, showLabels, showTitle, showLines, specViewOptions, title, titlePadding, zindex } = props;\n        const axis = Object.assign(Object.assign(Object.assign(Object.assign({ zindex, scale: scale.name, orient: horizontal ? 'bottom' : 'left', domain: showLines, ticks: showLines }, showLines && {\n            domainColor: lineColor,\n            tickColor: lineColor,\n            tickSize: specViewOptions.tickSize\n        }), showTitle && {\n            title,\n            titleAlign: horizontal ? 'left' : 'right',\n            titleAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY\n            },\n            titleColor: specViewOptions.colors.axisText,\n            titleFontSize: {\n                signal: SignalNames.TextTitleSize\n            },\n            titleLimit: axesTitleLimit,\n            titlePadding\n        }), { labels: showLabels }), showLabels && {\n            labelAlign: horizontal ? 'left' : 'right',\n            labelBaseline,\n            labelAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY\n            },\n            labelColor: specViewOptions.colors.axisText,\n            labelFontSize: {\n                signal: SignalNames.TextSize\n            },\n            labelLimit: axesLabelLimit\n        });\n        if (column.quantitative) {\n            axis.format = '~r';\n        }\n        return axis;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * Make sure that the field name is accessible via Vega's Field type\n     * https://vega.github.io/vega/docs/types/#Field\n     * examples: \"source.x\", \"target['x']\", \"[my.field]\"\n     */\n    function safeFieldName(field) {\n        return field.replace('.', '\\\\.').replace('[', '\\\\[').replace(']', '\\\\]');\n    }\n    /**\n     * Make sure the field name is usable in a Vega expression\n     */\n    function exprSafeFieldName(field) {\n        //remove whitespace, period, accessors and logical modifiers\n        return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, '');\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function linearScale(scaleName, data, field, range, reverse, zero) {\n        const scale = {\n            name: scaleName,\n            type: 'linear',\n            range,\n            round: true,\n            reverse,\n            domain: {\n                data,\n                field: safeFieldName(field)\n            },\n            zero,\n            nice: true\n        };\n        return scale;\n    }\n    function pointScale(scaleName, data, range, field, reverse) {\n        const scale = {\n            name: scaleName,\n            type: 'point',\n            range,\n            domain: {\n                data,\n                field: safeFieldName(field),\n                sort: true\n            },\n            padding: 0.5\n        };\n        if (reverse !== undefined) {\n            scale.reverse = reverse;\n        }\n        return scale;\n    }\n    function binnableColorScale(scaleName, colorBin, data, field, scheme) {\n        scheme = scheme || ColorScaleNone;\n        const domain = {\n            data,\n            field: safeFieldName(field)\n        };\n        const range = {\n            scheme\n        };\n        const reverse = { signal: SignalNames.ColorReverse };\n        if (colorBin !== 'continuous') {\n            range.count = { signal: SignalNames.ColorBinCount };\n        }\n        switch (colorBin) {\n            case 'continuous': {\n                const sequentialScale = {\n                    name: scaleName,\n                    type: 'linear',\n                    domain,\n                    range,\n                    reverse\n                };\n                return sequentialScale;\n            }\n            case 'quantile': {\n                const quantileScale = {\n                    name: scaleName,\n                    type: 'quantile',\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantileScale;\n            }\n            default: {\n                const quantizeScale = {\n                    name: scaleName,\n                    type: 'quantize',\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantizeScale;\n            }\n        }\n    }\n\n    const defaultZProportion = 0.6;\n    function textSignals(context, heightSignal) {\n        const { specViewOptions } = context;\n        const signals = [\n            {\n                name: SignalNames.ZProportion,\n                value: defaultZProportion,\n                bind: {\n                    name: specViewOptions.language.zScaleProportion,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0.2,\n                    max: 2,\n                    step: 0.1\n                }\n            },\n            {\n                name: SignalNames.ZHeight,\n                update: `${heightSignal} * ${SignalNames.ZProportion}`\n            },\n            {\n                name: SignalNames.TextScale,\n                value: 1.2,\n                bind: {\n                    name: specViewOptions.language.textScaleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0.5,\n                    max: 2,\n                    step: 0.1\n                }\n            },\n            {\n                name: SignalNames.TextSize,\n                update: `${SignalNames.TextScale} * 10`\n            },\n            {\n                name: SignalNames.TextTitleSize,\n                update: `${SignalNames.TextScale} * 15`\n            },\n            {\n                name: SignalNames.TextAngleX,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.xAxisTextAngleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0,\n                    max: 90,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.TextAngleY,\n                value: 0,\n                bind: {\n                    name: specViewOptions.language.yAxisTextAngleSignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: -90,\n                    max: 0,\n                    step: 1\n                }\n            },\n            {\n                name: SignalNames.MarkOpacity,\n                value: 1,\n                bind: {\n                    name: specViewOptions.language.markOpacitySignal,\n                    debounce: 50,\n                    input: 'range',\n                    min: 0.1,\n                    max: 1,\n                    step: 0.05\n                }\n            }\n        ];\n        return signals;\n    }\n    function colorBinCountSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorBinCount,\n            value: 7,\n            bind: {\n                name: specViewOptions.language.colorBinCount,\n                input: 'range',\n                min: 1,\n                max: specViewOptions.maxLegends + 1,\n                step: 1\n            }\n        };\n        return signal;\n    }\n    function colorReverseSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorReverse,\n            value: false,\n            bind: {\n                name: specViewOptions.language.colorReverse,\n                input: 'checkbox'\n            }\n        };\n        return signal;\n    }\n    function modifySignal(s, fn, update) {\n        s.update = `${fn}((${s.update}), (${update}))`;\n    }\n\n    function legend(column, fill) {\n        const legend = {\n            orient: 'none',\n            title: column.name,\n            fill,\n            encode: {\n                symbols: {\n                    update: {\n                        shape: {\n                            value: 'square'\n                        }\n                    }\n                }\n            }\n        };\n        if (column.quantitative) {\n            legend.type = 'symbol';\n            legend.format = '~r';\n        }\n        return legend;\n    }\n    function getLegends(context, fill) {\n        const { specColumns, insight } = context;\n        if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n            return [legend(specColumns.color, fill)];\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function topLookup(column, count, source, legend, lookupName, fieldName, indexName) {\n        const data = [\n            {\n                name: lookupName,\n                source,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: [safeFieldName(column.name)]\n                    },\n                    {\n                        type: 'window',\n                        ops: ['count'],\n                        as: [indexName]\n                    },\n                    {\n                        type: 'filter',\n                        expr: `datum[${JSON.stringify(indexName)}] <= ${count}`\n                    }\n                ]\n            },\n            {\n                name: legend,\n                source,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: lookupName,\n                        key: safeFieldName(column.name),\n                        fields: [column.name].map(safeFieldName),\n                        values: [column.name].map(safeFieldName),\n                        as: [fieldName]\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum[${JSON.stringify(fieldName)}] == null ? '${Other}' : datum[${JSON.stringify(fieldName)}]`,\n                        as: fieldName\n                    }\n                ]\n            }\n        ];\n        return data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function addColor(props) {\n        const { colorReverseSignalName, dataName, scope, legendDataName, scaleName, specContext, topLookupName } = props;\n        let colorDataName = dataName;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const legends = getLegends(specContext, scaleName);\n        if (legends) {\n            scope.legends = legends;\n        }\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        if (categoricalColor) {\n            addData(scope, ...topLookup(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, FieldNames.TopColor, FieldNames.TopIndex));\n            colorDataName = legendDataName;\n        }\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                addScales(scope, binnableColorScale(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n            }\n            else {\n                addScales(scope, {\n                    name: scaleName,\n                    type: 'ordinal',\n                    domain: {\n                        data: colorDataName,\n                        field: FieldNames.TopColor,\n                        sort: true\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone\n                    },\n                    reverse: { signal: colorReverseSignalName }\n                });\n            }\n        }\n        addSignals(scope, colorBinCountSignal(specContext), colorReverseSignal(specContext));\n        return { topColorField: FieldNames.TopColor, colorDataName };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n        const titleSignal = `parent[${JSON.stringify(FieldNames.FacetTitle)}]`;\n        const index = `datum[${JSON.stringify(FieldNames.Ordinal)}] - 1`;\n        const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index);\n        const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index);\n        addMarks(globalScope, col.header, row.footer);\n        addMarks(col.header, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center'\n                    },\n                    baseline: {\n                        value: 'middle'\n                    },\n                    fill: {\n                        value: axisTextColor\n                    }\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n                    },\n                    x: {\n                        signal: `${sizeSignals.layoutWidth} / 2`\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize\n                    },\n                    text: {\n                        signal: titleSignal\n                    }\n                }\n            }\n        });\n        addMarks(row.footer, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'left'\n                    },\n                    baseline: {\n                        value: 'middle'\n                    },\n                    fill: {\n                        value: axisTextColor\n                    }\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n                    },\n                    y: {\n                        signal: `${sizeSignals.layoutHeight} / 2`\n                    },\n                    limit: {\n                        signal: SignalNames.PlotOffsetRight\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize\n                    },\n                    text: {\n                        signal: titleSignal\n                    }\n                }\n            }\n        });\n    }\n    function addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n        addMarks(scope, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center'\n                    },\n                    baseline: {\n                        value: 'bottom'\n                    },\n                    fill: {\n                        value: axisTextColor\n                    }\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n                    },\n                    x: {\n                        signal: `(${sizeSignals.layoutWidth}) / 2`\n                    },\n                    text: {\n                        signal: `parent[${JSON.stringify(FieldNames.FacetTitle)}]`\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth\n                    },\n                    y: {\n                        signal: `-${SignalNames.FacetPaddingTop} / 2`\n                    }\n                }\n            }\n        });\n    }\n    function addFacetAxesGroupMarks(props) {\n        const { colSeqName, colTitleScale, globalScope, facetScope, plotScope, rowSeqName, rowTitleScale } = props;\n        const { sizeSignals } = facetScope;\n        const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n        const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n        const index = 'datum.data';\n        const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index);\n        const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index);\n        addData(globalScope, colSequence, rowSequence);\n        addMarks(globalScope, col.footer, row.header);\n        addScales(globalScope, colTitleScale, rowTitleScale);\n        const map = {\n            main: [\n                {\n                    scope: facetScope.facetScope,\n                    lines: true,\n                    labels: false,\n                    title: false\n                }\n            ],\n            x: [\n                {\n                    scope: col.footer,\n                    lines: true,\n                    labels: true,\n                    title: false\n                },\n                {\n                    scope: plotScope,\n                    scale: colTitleScale,\n                    lines: false,\n                    labels: false,\n                    title: true\n                }\n            ],\n            y: [\n                {\n                    scope: row.header,\n                    lines: true,\n                    labels: true,\n                    title: false\n                },\n                {\n                    scope: plotScope,\n                    scale: rowTitleScale,\n                    lines: false,\n                    labels: false,\n                    title: true\n                }\n            ]\n        };\n        return map;\n    }\n    function facetRowHeaderFooter(data, sizeSignals, index) {\n        const rowFn = (xSignal) => {\n            return {\n                type: 'group',\n                from: { data },\n                encode: {\n                    update: {\n                        x: { signal: xSignal },\n                        y: {\n                            signal: `${SignalNames.PlotOffsetTop} + ${SignalNames.FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`\n                        },\n                        height: { signal: sizeSignals.layoutHeight }\n                    }\n                }\n            };\n        };\n        const header = rowFn(SignalNames.PlotOffsetLeft);\n        const footer = rowFn(`${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetRight} / 2`);\n        return { header, footer };\n    }\n    function facetColumnHeaderFooter(data, sizeSignals, index) {\n        const colFn = (ySignal) => {\n            return {\n                type: 'group',\n                from: { data },\n                encode: {\n                    update: {\n                        x: {\n                            signal: `(${index}) * (${sizeSignals.layoutWidth} + ${SignalNames.FacetPaddingLeft}) + ${SignalNames.FacetPaddingLeft} + ${SignalNames.PlotOffsetLeft}`\n                        },\n                        y: { signal: ySignal },\n                        width: { signal: sizeSignals.layoutWidth }\n                    }\n                }\n            };\n        };\n        //create group marks based on data sequences\n        const header = colFn(`${SignalNames.PlotOffsetTop} / 2`);\n        const footer = colFn(`${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut}`);\n        return { header, footer };\n    }\n    function createSequence(dataName, countSignal) {\n        return {\n            name: dataName,\n            transform: [\n                {\n                    type: 'sequence',\n                    start: 0,\n                    stop: {\n                        signal: countSignal\n                    }\n                }\n            ]\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function fill(context, colorFieldName, scale) {\n        const { specColumns, insight, specViewOptions } = context;\n        const colorColumn = specColumns.color;\n        return colorColumn ?\n            colorColumn.isColorData || insight.directColor ?\n                {\n                    field: safeFieldName(colorColumn.name)\n                }\n                :\n                    {\n                        scale,\n                        field: colorColumn.quantitative ? safeFieldName(colorColumn.name) : colorFieldName\n                    }\n            :\n                {\n                    value: specViewOptions.colors.defaultCube\n                };\n    }\n    function opacity(context) {\n        const result = {\n            signal: SignalNames.MarkOpacity\n        };\n        return result;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class GlobalScope {\n        constructor(props) {\n            const { dataName, markGroup, scope, signals } = props;\n            this.scope = scope;\n            this._markGroup = markGroup;\n            this.signals = signals;\n            this.data = getDataByName(scope.data, dataName).data;\n            this._markDataName = dataName;\n            this.offsets = {\n                x: '0',\n                y: '0',\n                h: SignalNames.PlotHeightIn,\n                w: SignalNames.PlotWidthIn\n            };\n            this.sizeSignals = {\n                layoutHeight: SignalNames.PlotHeightIn,\n                layoutWidth: SignalNames.PlotWidthIn\n            };\n            this.zSize = SignalNames.PlotHeightIn;\n        }\n        get markDataName() {\n            return this._markDataName;\n        }\n        setMarkDataName(markDataName) {\n            this._markDataName = markDataName;\n        }\n        get markGroup() {\n            return this._markGroup;\n        }\n        setMarkGroup(markGroup) {\n            this._markGroup = markGroup;\n        }\n    }\n\n    class Layout {\n        constructor(props) {\n            this.props = props;\n            this.id = props.id;\n        }\n        getGrouping() {\n            return null;\n        }\n        getAggregateSumOp() {\n            return null;\n        }\n        build() {\n            throw 'Not implemented';\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function testForCollapseSelection() {\n        return `datum.${FieldNames.Collapsed}`;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class AggregateContainer extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const a = this.aggregation = this.getAggregation();\n            const p = this.prefix = `agg_${this.id}`;\n            this.names = {\n                barCount: `${p}_count`,\n                aggregateField: `${p}_aggregate_value`,\n                globalAggregateExtentSignal: `${p}_${a}_extent`,\n                scale: `scale_${p}`,\n                extentData: `data_${p}_extent`,\n                offsets: `data_${p}_offsets`\n            };\n        }\n        getAggregateSumOp() {\n            if (this.aggregation === 'sum') {\n                const fieldOp = {\n                    field: safeFieldName(this.props.sumBy.name),\n                    op: 'sum',\n                    as: FieldNames.Sum\n                };\n                return fieldOp;\n            }\n        }\n        build() {\n            const { aggregation, names, props } = this;\n            const { dock, globalScope, groupings, niceScale, parentScope, showAxes } = props;\n            addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal\n            });\n            addSignals(globalScope.scope, {\n                name: props.globalAggregateMaxExtentSignal,\n                update: `${names.globalAggregateExtentSignal}[1]`\n            });\n            const horizontal = dock === 'left';\n            const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n            const offsets = {\n                x: parentScope.offsets.x,\n                y: addOffsets(parentScope.offsets.y, dock === 'bottom' ?\n                    groupScaled\n                    :\n                        ''),\n                h: horizontal ?\n                    parentScope.offsets.h\n                    :\n                        dock === 'top'\n                            ? groupScaled\n                            : `${parentScope.offsets.h} - ${groupScaled}`,\n                w: horizontal ?\n                    groupScaled\n                    :\n                        parentScope.offsets.w\n            };\n            const scale = {\n                type: 'linear',\n                name: names.scale,\n                domain: [\n                    0,\n                    {\n                        signal: props.globalAggregateMaxExtentSignal\n                    }\n                ],\n                range: horizontal ?\n                    [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth\n                        }\n                    ]\n                    :\n                        [\n                            {\n                                signal: parentScope.sizeSignals.layoutHeight\n                            },\n                            0\n                        ],\n                nice: niceScale,\n                zero: true,\n                reverse: dock === 'top'\n            };\n            const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n            addSignals(globalScope.scope, {\n                name: props.globalAggregateMaxExtentScaledSignal,\n                update: dock === 'bottom'\n                    ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}`\n                    : globalAggregateMaxExtentScaledValue\n            });\n            return {\n                offsets,\n                sizeSignals: horizontal ?\n                    {\n                        layoutHeight: parentScope.sizeSignals.layoutHeight,\n                        layoutWidth: null\n                    }\n                    :\n                        {\n                            layoutHeight: null,\n                            layoutWidth: parentScope.sizeSignals.layoutWidth\n                        },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? [scale] : undefined,\n                        y: horizontal ? undefined : [scale]\n                    }\n                },\n                encodingRuleMap: horizontal ?\n                    {\n                        x: [{\n                                test: testForCollapseSelection(),\n                                signal: parentScope.offsets.x\n                            }],\n                        width: [{\n                                test: testForCollapseSelection(),\n                                value: 0\n                            }]\n                    }\n                    :\n                        {\n                            y: [{\n                                    test: testForCollapseSelection(),\n                                    signal: dock === 'top'\n                                        ? parentScope.offsets.y\n                                        : addOffsets(parentScope.offsets.y, parentScope.offsets.h)\n                                }],\n                            height: [{\n                                    test: testForCollapseSelection(),\n                                    value: 0\n                                }]\n                        }\n            };\n        }\n        getTransforms(aggregation, groupby) {\n            const trans = {\n                type: 'joinaggregate',\n                groupby: groupby.map(safeFieldName),\n                ops: [aggregation]\n            };\n            if (aggregation === 'sum') {\n                trans.fields = [this.props.sumBy.name].map(safeFieldName);\n            }\n            return trans;\n        }\n        getAggregation() {\n            const { props } = this;\n            let s;\n            if (props.dock === 'left') {\n                s = props.axesScales.x;\n            }\n            else {\n                s = props.axesScales.y;\n            }\n            switch (s.aggregate) {\n                case 'sum':\n                    return 'sum';\n                default:\n                    return 'count';\n            }\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class AggregateSquare extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const a = this.props.aggregation;\n            const p = this.prefix = `agg_${this.id}`;\n            this.names = {\n                barCount: `${p}_count`,\n                aggregateField: `${p}_aggregate_value`,\n                globalAggregateExtentSignal: `${p}_${a}_extent`,\n                extentData: `data_${p}_extent`\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { aggregation, globalScope, groupings, onBuild, parentScope } = props;\n            const { sizeSignals } = parentScope;\n            addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal\n            });\n            const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n            const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n            const squareMaxArea = `(${[squareMaxSide, squareMaxSide].join(' * ')})`;\n            const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n            const squareArea = `(${[squareMaxArea, shrinkRatio].join(' * ')})`;\n            const squareSide = `sqrt(${squareArea})`;\n            const localAggregateMaxExtentScaled = squareSide;\n            onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n                y: addOffsets(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n                h: squareSide,\n                w: squareSide\n            };\n            return {\n                offsets,\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null\n                },\n                encodingRuleMap: {\n                    y: [{\n                            test: testForCollapseSelection(),\n                            signal: offsets.y\n                        }],\n                    height: [{\n                            test: testForCollapseSelection(),\n                            value: 0\n                        }]\n                }\n            };\n        }\n        getTransforms(aggregation, groupby) {\n            const trans = {\n                type: 'joinaggregate',\n                groupby: groupby.map(safeFieldName),\n                ops: [aggregation]\n            };\n            if (aggregation === 'sum') {\n                trans.fields = [this.props.sumBy.name].map(safeFieldName);\n            }\n            return trans;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function binnable(prefix, domainDataName, discreteColumn) {\n        const { column, defaultBins, maxbins, maxbinsSignalDisplayName, maxbinsSignalName } = discreteColumn;\n        if (column.quantitative) {\n            const field = `${prefix}_bin_${exprSafeFieldName(column.name)}`;\n            const fieldEnd = `${field}_end`;\n            const binSignal = `${field}_bins`;\n            const extentSignal = `${field}_bin_extent`;\n            domainDataName = `${field}_sequence`; //override the data name\n            const extentTransform = {\n                type: 'extent',\n                field: safeFieldName(column.name),\n                signal: extentSignal\n            };\n            const maxbinsSignal = {\n                name: maxbinsSignalName,\n                value: defaultBins,\n                bind: {\n                    name: maxbinsSignalDisplayName,\n                    debounce: 50,\n                    input: 'range',\n                    min: 1,\n                    max: maxbins,\n                    step: 1\n                }\n            };\n            const binTransform = {\n                type: 'bin',\n                field: safeFieldName(column.name),\n                as: [\n                    field,\n                    fieldEnd,\n                ],\n                signal: binSignal,\n                extent: {\n                    signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`, //add a tiny bit to the upper extent to force the extra bin - https://github.com/vega/vega/issues/2899\n                },\n                maxbins: {\n                    signal: maxbinsSignalName\n                }\n            };\n            const dataSequence = {\n                name: domainDataName,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: `${binSignal}.start`\n                        },\n                        stop: {\n                            signal: `${binSignal}.stop`\n                        },\n                        step: {\n                            signal: `${binSignal}.step`\n                        }\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data',\n                        as: field\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data + ${binSignal}.step`,\n                        as: fieldEnd\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number'],\n                        as: [FieldNames.Ordinal]\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data === ${binSignal}.start`,\n                        as: FieldNames.First\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                        as: FieldNames.Last\n                    }\n                ]\n            };\n            const augmentBinnable = {\n                discreteColumn,\n                native: false,\n                transforms: [extentTransform, binTransform],\n                fields: [field, fieldEnd],\n                binSignal,\n                dataSequence,\n                domainDataName,\n                signals: [maxbinsSignal],\n                fullScaleDataname: dataSequence.name\n            };\n            return augmentBinnable;\n        }\n        else {\n            const nativeBinnable = {\n                discreteColumn,\n                native: true,\n                fields: [column.name],\n                domainDataName,\n                fullScaleDataname: domainDataName\n            };\n            return nativeBinnable;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Band extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `band_${this.id}`;\n            this.names = {\n                xScale: `scale_${p}_x`,\n                yScale: `scale_${p}_y`,\n                bandWidth: `${p}_bandwidth`,\n                accumulative: `${p}_accumulative`\n            };\n            this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n        }\n        getGrouping() {\n            return this.bin.fields;\n        }\n        build() {\n            const { bin, names, props } = this;\n            const { globalScope, minBandWidth, orientation, parentScope, showAxes } = props;\n            const binField = bin.fields[0];\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n            }\n            //TODO don't add this, use existing dataset\n            addData(globalScope.scope, {\n                name: names.accumulative,\n                source: bin.fullScaleDataname,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: this.getGrouping().map(safeFieldName),\n                        ops: ['count']\n                    }\n                ]\n            });\n            const horizontal = orientation === 'horizontal';\n            const minCellSignal = (horizontal) ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n            modifySignal(minCellSignal, 'max', `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n            addSignals(globalScope.scope, {\n                name: names.bandWidth,\n                update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`\n            });\n            const scales = this.getScales(bin, horizontal);\n            let encodingRuleMap;\n            if (!props.excludeEncodingRuleMap) {\n                encodingRuleMap = horizontal ?\n                    {\n                        x: [\n                            {\n                                test: testForCollapseSelection(),\n                                signal: parentScope.offsets.x\n                            }\n                        ],\n                        width: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0\n                            }\n                        ]\n                    }\n                    :\n                        {\n                            y: [\n                                {\n                                    test: testForCollapseSelection(),\n                                    signal: addOffsets(parentScope.offsets.y, parentScope.offsets.h)\n                                }\n                            ],\n                            height: [\n                                {\n                                    test: testForCollapseSelection(),\n                                    value: 0\n                                }\n                            ]\n                        };\n            }\n            return {\n                offsets: this.getOffset(horizontal, binField),\n                sizeSignals: horizontal ?\n                    {\n                        layoutHeight: names.bandWidth,\n                        layoutWidth: parentScope.sizeSignals.layoutWidth\n                    }\n                    :\n                        {\n                            layoutHeight: parentScope.sizeSignals.layoutHeight,\n                            layoutWidth: names.bandWidth\n                        },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? undefined : scales,\n                        y: horizontal ? scales : undefined\n                    }\n                },\n                encodingRuleMap\n            };\n        }\n        getOffset(horizontal, binField) {\n            const { names, props } = this;\n            const { parentScope } = props;\n            return {\n                x: addOffsets(parentScope.offsets.x, horizontal ?\n                    ''\n                    :\n                        `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n                y: addOffsets(parentScope.offsets.y, horizontal ?\n                    `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])`\n                    :\n                        ''),\n                h: horizontal ?\n                    names.bandWidth\n                    :\n                        parentScope.offsets.h,\n                w: horizontal ?\n                    parentScope.offsets.w\n                    :\n                        names.bandWidth\n            };\n        }\n        getScales(bin, horizontal) {\n            const { names } = this;\n            const { parentScope } = this.props;\n            const binField = safeFieldName(bin.fields[0]);\n            const scales = [];\n            let bandScale;\n            if (horizontal) {\n                bandScale = {\n                    type: 'band',\n                    name: names.yScale,\n                    range: [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutHeight\n                        }\n                    ],\n                    padding: 0.1,\n                    domain: {\n                        data: bin.domainDataName,\n                        field: binField,\n                        sort: true\n                    },\n                    reverse: true\n                };\n            }\n            else {\n                bandScale = {\n                    type: 'band',\n                    name: names.xScale,\n                    range: [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth\n                        }\n                    ],\n                    padding: 0.1,\n                    domain: {\n                        data: bin.domainDataName,\n                        field: binField,\n                        sort: true\n                    }\n                };\n            }\n            scales.push(bandScale);\n            return scales;\n        }\n    }\n\n    function displayBin(bin) {\n        const val = (index) => `datum[${JSON.stringify(bin.fields[index])}]`;\n        return bin.discreteColumn.column.quantitative ?\n            `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')`\n            :\n                val(0);\n    }\n    function obj(nameValues, clause) {\n        if (clause) {\n            nameValues = [clause, ...nameValues];\n        }\n        return `{${nameValues.join()}}`;\n    }\n    function serializeAsVegaExpression(bin, firstFieldName, lastFieldName, clause) {\n        if (bin.discreteColumn.column.quantitative) {\n            const low = [\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'>=\\'',\n                `value:datum[${JSON.stringify(bin.fields[0])}]`\n            ];\n            const high = [\n                'clause:\\'&&\\'',\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'<\\'',\n                `value:datum[${JSON.stringify(bin.fields[1])}]`\n            ];\n            return obj([\n                `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`\n            ], clause);\n        }\n        else {\n            const exact = [\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'==\\'',\n                `value:datum[${JSON.stringify(bin.fields[0])}]`\n            ];\n            return obj([\n                `expressions:[${obj(exact)}]`\n            ], clause);\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function createOrdinals(source, prefix, binFields, sortOrder) {\n        const _binFields = binFields.map(safeFieldName);\n        const dataName = `${prefix}_bin_order`;\n        const data = {\n            name: dataName,\n            source,\n            transform: [\n                {\n                    type: 'aggregate',\n                    groupby: _binFields\n                },\n                {\n                    type: 'collect',\n                    sort: {\n                        field: _binFields,\n                        order: _binFields.map(f => sortOrder)\n                    }\n                },\n                {\n                    type: 'window',\n                    ops: ['row_number'],\n                    as: [FieldNames.Ordinal]\n                }\n            ]\n        };\n        return {\n            data,\n            scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields)\n        };\n    }\n    function ordinalScale(dataName, scaleName, binFields) {\n        return {\n            type: 'ordinal',\n            name: scaleName,\n            domain: {\n                data: dataName,\n                field: safeFieldName(binFields[0])\n            },\n            range: {\n                data: dataName,\n                field: FieldNames.Ordinal\n            }\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Cross extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `cross_${this.id}`;\n            this.binX = binnable(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n            this.binY = binnable(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n            this.names = {\n                facetDataName: `data_${p}_facet`,\n                searchUnion: `data_${p}_search`,\n                dimScale: `scale_${p}`,\n                dimCount: `${p}_count`,\n                dimCategorical: `data_${p}_cat`,\n                dimCellSize: `${p}_cell_size`,\n                dimCellSizeCalc: `${p}_cell_calc`\n            };\n        }\n        getGrouping() {\n            return this.binX.fields.concat(this.binY.fields);\n        }\n        build() {\n            const { binX, binY, names, prefix, props } = this;\n            const { axisTextColor, colRowTitles, globalScope, parentScope } = props;\n            const titles = { x: { dataName: null, quantitative: null }, y: { dataName: null, quantitative: null } };\n            const dx = {\n                dim: 'x',\n                bin: binX,\n                sortOrder: 'ascending',\n                size: parentScope.sizeSignals.layoutWidth,\n                layout: parentScope.sizeSignals.layoutWidth,\n                min: globalScope.signals.minCellWidth.name,\n                out: globalScope.signals.plotWidthOut,\n                offset: SignalNames.FacetPaddingLeft,\n                padding: SignalNames.FacetPaddingLeft,\n                dataOut: null,\n                scaleName: null,\n                position: null\n            };\n            const dy = {\n                dim: 'y',\n                bin: binY,\n                sortOrder: 'ascending',\n                size: parentScope.sizeSignals.layoutHeight,\n                layout: parentScope.sizeSignals.layoutHeight,\n                min: globalScope.signals.minCellHeight.name,\n                out: globalScope.signals.plotHeightOut,\n                offset: SignalNames.FacetPaddingTop,\n                padding: `(${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n                dataOut: null,\n                scaleName: null,\n                position: null\n            };\n            const dimensions = [dx, dy];\n            dimensions.forEach(d => {\n                const { bin, dim, padding, sortOrder } = d;\n                let data;\n                let dataName;\n                let countSignal;\n                let scale;\n                const titleSource = titles[dim];\n                if (bin.native === false) {\n                    addSignals(globalScope.scope, ...bin.signals);\n                    addTransforms(globalScope.data, ...bin.transforms);\n                    addData(globalScope.scope, bin.dataSequence);\n                    addTransforms(bin.dataSequence, {\n                        type: 'formula',\n                        expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                        as: FieldNames.Contains\n                    });\n                    data = bin.dataSequence;\n                    dataName = bin.dataSequence.name;\n                    countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                    scale = ordinalScale(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                    titleSource.dataName = bin.dataSequence.name;\n                }\n                else {\n                    dataName = globalScope.markDataName;\n                    const ord = createOrdinals(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                    data = ord.data;\n                    addData(globalScope.scope, ord.data);\n                    countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                    scale = ord.scale;\n                    titleSource.dataName = ord.data.name;\n                }\n                titleSource.quantitative = bin.discreteColumn.column.quantitative;\n                d.dataOut = data;\n                d.scaleName = scale.name;\n                addTransforms(data, {\n                    type: 'formula',\n                    expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                    as: FieldNames.FacetSearch\n                }, {\n                    type: 'formula',\n                    expr: displayBin(bin),\n                    as: FieldNames.FacetTitle\n                });\n                addScales(globalScope.scope, scale);\n                const count = `${names.dimCount}_${dim}`;\n                const calc = `${names.dimCellSizeCalc}_${dim}`;\n                const size = `${names.dimCellSize}_${dim}`;\n                addSignals(globalScope.scope, { name: count, update: countSignal });\n                addSignals(globalScope.scope, {\n                    name: calc,\n                    update: `${d.layout} / ${count}`\n                }, {\n                    name: size,\n                    update: `max(${d.min}, (${calc} - ${padding}))`\n                });\n                modifySignal(d.out, 'max', `((${size} + ${padding}) * ${count})`);\n                d.position = this.dimensionOffset(d);\n            });\n            const groupRow = {\n                type: 'group',\n                encode: {\n                    update: {\n                        y: {\n                            signal: dy.position\n                        }\n                    }\n                },\n                from: {\n                    data: dy.dataOut.name\n                },\n                data: [\n                    {\n                        name: names.searchUnion,\n                        source: dx.dataOut.name,\n                        transform: [\n                            {\n                                type: 'formula',\n                                expr: `[datum[${JSON.stringify(FieldNames.FacetSearch)}], merge(parent[${JSON.stringify(FieldNames.FacetSearch)}], { clause: '&&'})]`,\n                                as: FieldNames.FacetSearch\n                            }\n                        ]\n                    }\n                ]\n            };\n            const groupCol = {\n                style: 'cell',\n                name: prefix,\n                type: 'group',\n                encode: {\n                    update: {\n                        height: {\n                            signal: `${names.dimCellSize}_y`\n                        },\n                        width: {\n                            signal: `${names.dimCellSize}_x`\n                        },\n                        x: {\n                            signal: dx.position\n                        }\n                    }\n                },\n                from: {\n                    data: names.searchUnion\n                }\n            };\n            addMarks(globalScope.markGroup, groupRow);\n            addMarks(groupRow, groupCol);\n            const offsets = {\n                x: this.dimensionOffset(dx),\n                y: this.dimensionOffset(dy),\n                h: `${names.dimCellSize}_y`,\n                w: `${names.dimCellSize}_x`\n            };\n            const sizeSignals = {\n                layoutHeight: `${names.dimCellSize}_y`,\n                layoutWidth: `${names.dimCellSize}_x`,\n                colCount: `${names.dimCount}_x`,\n                rowCount: `${names.dimCount}_y`\n            };\n            if (colRowTitles) {\n                addFacetColRowTitles(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n            }\n            return {\n                facetScope: groupCol,\n                offsets,\n                sizeSignals,\n                titles\n            };\n        }\n        dimensionOffset(d) {\n            const { names } = this;\n            return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Scatter extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `scatter_${this.id}`;\n            this.names = {\n                aggregateData: `data_${p}_aggregate`,\n                markData: `data_${p}_mark`,\n                sizeExtent: `${p}_sizeExtent`,\n                sizeRange: `${p}_sizeRange`,\n                sizeScale: `${p}_sizeScale`,\n                xScale: `scale_${p}_x`,\n                yScale: `scale_${p}_y`,\n                zScale: `scale_${p}_z`\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { globalScope, parentScope, scatterPointScaleDisplay, size, x, y, z, zGrounded } = props;\n            const qsize = size && size.quantitative && size;\n            addSignals(globalScope.scope, {\n                name: SignalNames.PointScale,\n                value: 5,\n                bind: {\n                    name: scatterPointScaleDisplay,\n                    debounce: 50,\n                    input: 'range',\n                    min: 1,\n                    max: 10,\n                    step: 1\n                }\n            }, {\n                name: SignalNames.ZGrounded,\n                value: false,\n                bind: {\n                    name: zGrounded,\n                    input: 'checkbox'\n                }\n            });\n            if (qsize) {\n                addTransforms(globalScope.data, {\n                    type: 'extent',\n                    field: safeFieldName(qsize.name),\n                    signal: names.sizeExtent\n                });\n                addScales(globalScope.scope, {\n                    name: names.sizeScale,\n                    type: 'linear',\n                    domain: [0, { signal: `${names.sizeExtent}[1]` }],\n                    range: [0, { signal: names.sizeRange }]\n                });\n                addSignals(globalScope.scope, {\n                    name: names.sizeRange,\n                    update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${scatterSizedDiv}`\n                });\n            }\n            addData(globalScope.scope, {\n                name: names.markData,\n                source: globalScope.markDataName,\n                transform: [x, y, z].map(c => {\n                    if (!c || !c.quantitative)\n                        return;\n                    const t = {\n                        type: 'filter',\n                        expr: `isValid(datum[${JSON.stringify(c.name)}])`\n                    };\n                    return t;\n                }).filter(Boolean)\n            });\n            globalScope.setMarkDataName(names.markData);\n            const globalScales = { showAxes: true, scales: {} };\n            const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n            const sizeValueSignal = qsize ?\n                `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${SignalNames.PointScale}`\n                : SignalNames.PointScale;\n            const update = Object.assign({ height: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0\n                    },\n                    {\n                        signal: sizeValueSignal\n                    }\n                ], width: {\n                    signal: sizeValueSignal\n                } }, z && {\n                z: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0\n                    },\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`\n                    }\n                ],\n                depth: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0\n                    },\n                    {\n                        signal: `${SignalNames.ZGrounded} ? ${zValue} : ${sizeValueSignal}`\n                    }\n                ]\n            });\n            const columnSignals = [\n                {\n                    column: x,\n                    xyz: 'x',\n                    scaleName: names.xScale,\n                    reverse: false,\n                    signal: parentScope.sizeSignals.layoutWidth\n                },\n                {\n                    column: y,\n                    xyz: 'y',\n                    scaleName: names.yScale,\n                    reverse: true,\n                    signal: parentScope.sizeSignals.layoutHeight\n                },\n                {\n                    column: z,\n                    xyz: 'z',\n                    scaleName: names.zScale,\n                    reverse: false,\n                    signal: `(${globalScope.zSize}) * ${SignalNames.ZProportion}`\n                }\n            ];\n            columnSignals.forEach(cs => {\n                const { column, reverse, scaleName, signal, xyz } = cs;\n                if (!column)\n                    return;\n                let scale;\n                if (column.quantitative) {\n                    scale = linearScale(scaleName, globalScope.data.name, column.name, [0, { signal }], reverse, false);\n                }\n                else {\n                    scale = pointScale(scaleName, globalScope.data.name, [0, { signal }], column.name, reverse);\n                }\n                globalScales.scales[xyz] = [scale];\n            });\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: globalScope.markDataName },\n                encode: { update }\n            };\n            addMarks(globalScope.markGroup, mark);\n            return {\n                offsets: {\n                    x: addOffsets(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                    y: addOffsets(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                    h: sizeValueSignal,\n                    w: sizeValueSignal\n                },\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null\n                },\n                globalScales,\n                mark,\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: addOffsets(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight)\n                        }\n                    ]\n                }\n            };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function addZScale(z, zSize, dataName, zScaleName) {\n        if (z) {\n            const zRange = [0, { signal: `(${zSize}) * ${SignalNames.ZProportion}` }];\n            const scale = z.quantitative\n                ?\n                    linearScale(zScaleName, dataName, z.name, zRange, false, true)\n                :\n                    pointScale(zScaleName, dataName, zRange, z.name, false);\n            return scale;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Square extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `square_${this.id}`;\n            this.names = {\n                bandWidth: this.getBandWidth(),\n                maxGroupField: `${p}_max_group`,\n                maxGroupSignal: `${p}_max_grouping`,\n                stack0: `${p}_stack0`,\n                stack1: `${p}_stack1`,\n                zScale: `scale_${p}_z`\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { fillDirection, globalScope, groupings, parentScope, collapseYHeight, sortBy, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            addTransforms(globalScope.data, Object.assign({ type: 'stack', groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sortBy && {\n                sort: {\n                    field: safeFieldName(sortBy.name),\n                    order: 'ascending'\n                }\n            }));\n            const { gap, levelSize, size, squaresPerBand } = this.addSignals();\n            const heightSignal = {\n                signal: fillDirection === 'down-right' ? size : levelSize\n            };\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: {\n                    data: globalScope.markDataName\n                },\n                encode: {\n                    update: Object.assign({ height: collapseYHeight ?\n                            [\n                                {\n                                    test: testForCollapseSelection(),\n                                    value: 0\n                                },\n                                heightSignal\n                            ]\n                            :\n                                heightSignal, width: {\n                            signal: fillDirection === 'down-right' ? levelSize : size\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0\n                            },\n                            {\n                                scale: names.zScale,\n                                field: safeFieldName(z.name)\n                            }\n                        ]\n                    })\n                }\n            };\n            addMarks(globalScope.markGroup, mark);\n            const { tx, ty } = this.transformXY(gap, levelSize, squaresPerBand);\n            return Object.assign(Object.assign(Object.assign({}, z && {\n                globalScales: {\n                    showAxes: true,\n                    scales: {\n                        z: [zScale]\n                    }\n                }\n            }), { offsets: {\n                    x: addOffsets(parentScope.offsets.x, tx.expr),\n                    y: addOffsets(parentScope.offsets.y, ty.expr),\n                    h: size,\n                    w: size\n                }, mark, sizeSignals: {\n                    layoutHeight: size,\n                    layoutWidth: size\n                } }), collapseYHeight && {\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y\n                        }\n                    ]\n                }\n            });\n        }\n        getBandWidth() {\n            const { offsets } = this.props.parentScope;\n            switch (this.props.fillDirection) {\n                case 'down-right':\n                    return offsets.h;\n                default:\n                    return offsets.w;\n            }\n        }\n        addSignals() {\n            const { names, props } = this;\n            const { fillDirection, globalScope, groupings, parentScope } = props;\n            let { maxGroupedFillSize, maxGroupedUnits } = props;\n            if (!maxGroupedUnits) {\n                if (groupings) {\n                    addTransforms(globalScope.data, {\n                        type: 'joinaggregate',\n                        groupby: getGroupBy(groupings).map(safeFieldName),\n                        ops: ['count'],\n                        as: [names.maxGroupField]\n                    }, {\n                        type: 'extent',\n                        field: names.maxGroupField,\n                        signal: names.maxGroupSignal\n                    });\n                    maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n                }\n                else {\n                    maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n                }\n            }\n            if (!maxGroupedFillSize) {\n                maxGroupedFillSize = fillDirection === 'down-right' ? parentScope.offsets.w : parentScope.offsets.h;\n            }\n            const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n            const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n            const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n            const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n            const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n            const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n            return { gap, levelSize, size, squaresPerBand };\n        }\n        transformXY(gap, levelSize, squaresPerBand) {\n            const { names, prefix } = this;\n            const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n            const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n            const { fillDirection, parentScope } = this.props;\n            const tx = {\n                type: 'formula',\n                expr: null,\n                as: `${prefix}_${FieldNames.OffsetX}`\n            };\n            const ty = {\n                type: 'formula',\n                expr: null,\n                as: `${prefix}_${FieldNames.OffsetY}`\n            };\n            switch (fillDirection) {\n                case 'down-right': {\n                    tx.expr = `${level} * (${levelSize} + ${gap})`;\n                    ty.expr = compartment;\n                    break;\n                }\n                case 'right-up': {\n                    tx.expr = compartment;\n                    ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                    break;\n                }\n                case 'right-down':\n                default: {\n                    tx.expr = compartment;\n                    ty.expr = `${level} * (${levelSize} + ${gap})`;\n                    break;\n                }\n            }\n            return { tx, ty };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Stack extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `stack_${this.id}`;\n            this.names = {\n                cube: `${p}_cube`,\n                globalDataName: `data_${p}_count`,\n                globalExtent: `${p}_global_extent`,\n                levelDataName: `data_${p}_level`,\n                count: `${p}_count`,\n                stack0: `${p}_stack0`,\n                stack1: `${p}_stack1`,\n                sequence: `data_${p}_sequence`,\n                sides: `${p}_sides`,\n                size: `${p}_size`,\n                squared: `${p}_squared`,\n                maxCount: `${p}_maxCount`,\n                maxLevels: `${p}_maxLevels`,\n                zScale: `${p}_zScale`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { globalScope, groupings, parentScope, sort } = props;\n            const { sizeSignals } = parentScope;\n            addTransforms(globalScope.data, {\n                type: 'joinaggregate',\n                groupby: getGroupBy(groupings).map(safeFieldName),\n                ops: ['count'],\n                as: [names.count]\n            }, {\n                type: 'extent',\n                field: names.count,\n                signal: names.globalExtent\n            }, Object.assign({ type: 'stack', groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sort && {\n                sort: {\n                    field: safeFieldName(sort.name),\n                    order: 'ascending'\n                }\n            }));\n            addData(globalScope.scope, {\n                name: names.sequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `max(sqrt(${names.globalExtent}[1]),2)`\n                        }\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data * datum.data',\n                        as: 'squared'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                        as: 'maxlevels'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                        as: 'side'\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.side * datum.maxlevels + datum.maxlevels - 1',\n                        as: 'sidecubeheight'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                        as: 'heightmatch'\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: 'heightmatch',\n                            order: 'ascending'\n                        }\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number']\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.row_number === 1'\n                    }\n                ]\n            });\n            addSignals(globalScope.scope, {\n                name: names.size,\n                update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`\n            }, {\n                name: names.squared,\n                update: `data('${names.sequence}')[0].squared`\n            }, {\n                name: names.sides,\n                update: `sqrt(${names.squared})`\n            }, {\n                name: names.cube,\n                update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`\n            }, {\n                name: names.maxLevels,\n                update: `data('${names.sequence}')[0].maxlevels`\n            }, {\n                name: names.maxCount,\n                update: `${names.maxLevels} * ${names.squared}`\n            });\n            const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n            const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n            const cubeX = `(${layerOrdinal} % ${names.sides})`;\n            const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n            const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n            const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n                y: addOffsets(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n                h: names.size,\n                w: names.size\n            };\n            const mark = {\n                type: 'rect',\n                from: { data: this.names.levelDataName },\n                encode: {\n                    update: {\n                        z: {\n                            signal: `${zLevel} * (${names.cube} + 1)`\n                        },\n                        height: {\n                            signal: names.cube\n                        },\n                        width: {\n                            signal: names.cube\n                        },\n                        depth: {\n                            signal: names.cube\n                        }\n                    }\n                }\n            };\n            addMarks(globalScope.markGroup, mark);\n            const zScale = {\n                type: 'linear',\n                name: names.zScale,\n                domain: [\n                    0,\n                    {\n                        signal: names.maxCount\n                    }\n                ],\n                range: [\n                    0,\n                    {\n                        signal: `${names.maxLevels} * (${names.cube} + 1) - 1`\n                    }\n                ],\n                nice: false\n            };\n            return {\n                offsets,\n                mark,\n                sizeSignals: {\n                    layoutHeight: names.size,\n                    layoutWidth: names.size\n                },\n                globalScales: {\n                    showAxes: true,\n                    scales: {\n                        z: [zScale]\n                    }\n                },\n                encodingRuleMap: {\n                    y: [{\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y\n                        }],\n                    z: [{\n                            test: testForCollapseSelection(),\n                            value: 0\n                        }],\n                    depth: [{\n                            test: testForCollapseSelection(),\n                            value: 0\n                        }],\n                    height: [{\n                            test: testForCollapseSelection(),\n                            value: 0\n                        }]\n                }\n            };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Strip extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `strip_${this.id}`;\n            this.names = {\n                firstField: `${p}${FieldNames.First}`,\n                lastField: `${p}${FieldNames.Last}`,\n                valueField: `${p}${FieldNames.Value}`,\n                scale: `scale_${p}`,\n                zScale: `scale_${p}_z`\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { addPercentageScale, globalScope, groupings, orientation, size, sort, sortOrder, parentScope, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            const horizontal = orientation === 'horizontal';\n            const transform = [];\n            if (sort) {\n                transform.push({\n                    type: 'collect',\n                    sort: {\n                        field: safeFieldName(sort.name),\n                        order: sortOrder\n                    }\n                });\n            }\n            let stackField;\n            if (size) {\n                stackField = size.name;\n                transform.push({\n                    type: 'filter',\n                    expr: `datum[${JSON.stringify(size.name)}] > 0`\n                });\n            }\n            else {\n                stackField = names.valueField;\n                transform.push({\n                    type: 'formula',\n                    expr: '1',\n                    as: stackField\n                });\n            }\n            const stackTransform = {\n                type: 'stack',\n                field: safeFieldName(stackField),\n                offset: 'normalize',\n                as: [names.firstField, names.lastField]\n            };\n            if (groupings.length) {\n                stackTransform.groupby = getGroupBy(groupings).map(safeFieldName);\n            }\n            transform.push(stackTransform);\n            addTransforms(globalScope.data, ...transform);\n            const span = [names.lastField, names.firstField].map(f => `datum[${JSON.stringify(f)}]`).join(' - ');\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, horizontal ?\n                    `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})`\n                    :\n                        ''),\n                y: addOffsets(parentScope.offsets.y, horizontal ?\n                    ''\n                    :\n                        `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n                h: horizontal\n                    ? parentScope.offsets.h\n                    : `(${span}) * (${parentScope.offsets.h})`,\n                w: horizontal\n                    ? `(${span}) * (${parentScope.offsets.w})`\n                    : parentScope.offsets.w\n            };\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: globalScope.markDataName },\n                encode: {\n                    update: Object.assign({ height: {\n                            signal: offsets.h\n                        }, width: {\n                            signal: offsets.w\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0\n                            },\n                            {\n                                scale: names.zScale,\n                                field: safeFieldName(z.name)\n                            }\n                        ]\n                    })\n                }\n            };\n            addMarks(globalScope.markGroup, mark);\n            let percentageScale;\n            if (addPercentageScale) {\n                percentageScale = [{\n                        type: 'linear',\n                        name: names.scale,\n                        domain: [0, 100],\n                        range: horizontal ?\n                            [\n                                0,\n                                {\n                                    signal: parentScope.sizeSignals.layoutWidth\n                                }\n                            ]\n                            :\n                                [\n                                    {\n                                        signal: parentScope.sizeSignals.layoutHeight\n                                    },\n                                    0\n                                ]\n                    }];\n            }\n            return {\n                globalScales: {\n                    showAxes: true,\n                    scales: {\n                        x: horizontal ? percentageScale : undefined,\n                        y: horizontal ? undefined : percentageScale,\n                        z: zScale && [zScale]\n                    }\n                },\n                offsets,\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null\n                },\n                mark\n            };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Treemap extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `treemap_${this.id}`;\n            this.names = {\n                dataName: `data_${p}`,\n                dataHeightWidth: `data_${p}_hw`,\n                dataExtents: `data_${p}_extents`,\n                dataFacet: `data_${p}_facet`,\n                dataFacetMark: `data_${p}_facetMark`,\n                fieldChildren: `${p}_children`,\n                fieldDepth: `${p}_depth`,\n                fieldX0: `${p}_x0`,\n                fieldX1: `${p}_x1`,\n                fieldY0: `${p}_y0`,\n                fieldY1: `${p}_y1`,\n                fieldHeight: `${p}_h`,\n                fieldWidth: `${p}_w`,\n                heightExtent: `${p}_heightExtent`,\n                widthExtent: `${p}_widthExtent`,\n                zScale: `scale_${p}_z`\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { globalScope, parentScope, treeMapMethod, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, fn(names.fieldX0)),\n                y: addOffsets(parentScope.offsets.y, fn(names.fieldY0)),\n                h: subtract(names.fieldY1, names.fieldY0),\n                w: subtract(names.fieldX1, names.fieldX0)\n            };\n            const mark = this.transformedMark(offsets);\n            addSignals(globalScope.scope, {\n                name: SignalNames.TreeMapMethod,\n                value: 'squarify',\n                bind: {\n                    name: treeMapMethod,\n                    input: 'select',\n                    options: [\n                        'squarify', 'binary'\n                    ]\n                }\n            });\n            return Object.assign(Object.assign({}, z && {\n                globalScales: {\n                    showAxes: true,\n                    scales: {\n                        z: [zScale]\n                    }\n                }\n            }), { mark,\n                offsets, sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null\n                } });\n        }\n        transformedMark(offsets) {\n            const { names, props } = this;\n            const { globalScope, groupings, parentScope } = props;\n            if (groupings.length) {\n                //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n                addData(globalScope.scope, {\n                    name: names.dataHeightWidth,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.h,\n                            as: names.fieldHeight\n                        },\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.w,\n                            as: names.fieldWidth\n                        }\n                    ]\n                });\n                const treemapData = {\n                    name: names.dataFacetMark,\n                    source: names.dataFacet\n                };\n                const facets = {\n                    type: 'group',\n                    from: {\n                        facet: {\n                            name: names.dataFacet,\n                            data: names.dataHeightWidth,\n                            groupby: getGroupBy(groupings).map(safeFieldName)\n                        }\n                    },\n                    data: [\n                        {\n                            name: names.dataExtents,\n                            source: names.dataFacet,\n                            transform: [\n                                {\n                                    type: 'extent',\n                                    field: names.fieldHeight,\n                                    signal: names.heightExtent\n                                },\n                                {\n                                    type: 'extent',\n                                    field: names.fieldWidth,\n                                    signal: names.widthExtent\n                                }\n                            ]\n                        },\n                        treemapData\n                    ]\n                };\n                globalScope.setMarkDataName(names.dataFacetMark);\n                addMarks(globalScope.markGroup, facets);\n                //assign new markgroup after adding mark to original group\n                globalScope.setMarkGroup(facets);\n                this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n                return this.addMark(offsets, facets, globalScope.markDataName);\n            }\n            else {\n                this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n                return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n            }\n        }\n        addMark(offsets, markParent, markDataName) {\n            const { names, prefix, props } = this;\n            const { z } = props;\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: markDataName },\n                encode: {\n                    update: Object.assign({ width: {\n                            signal: offsets.w\n                        }, height: {\n                            signal: offsets.h\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0\n                            },\n                            {\n                                scale: names.zScale,\n                                field: safeFieldName(z.name)\n                            }\n                        ]\n                    })\n                }\n            };\n            addMarks(markParent, mark);\n            return mark;\n        }\n        treemapTransform(treemapData, widthSignal, heightSignal) {\n            const { names, props } = this;\n            const { group, size } = props;\n            addTransforms(treemapData, {\n                type: 'filter',\n                expr: `datum[${JSON.stringify(size.name)}] > 0`\n            }, {\n                type: 'nest',\n                keys: [(group && group.name) || '__NONE__']\n            }, {\n                type: 'treemap',\n                field: safeFieldName(size.name),\n                sort: { field: 'value', order: 'descending' },\n                round: true,\n                method: { signal: SignalNames.TreeMapMethod },\n                paddingInner: 1,\n                paddingOuter: 0,\n                size: [\n                    { signal: widthSignal },\n                    { signal: heightSignal }\n                ],\n                as: [\n                    names.fieldX0,\n                    names.fieldY0,\n                    names.fieldX1,\n                    names.fieldY1,\n                    names.fieldDepth,\n                    names.fieldChildren\n                ]\n            });\n        }\n    }\n    function fn(n) {\n        return `datum[${JSON.stringify(n)}]`;\n    }\n    function subtract(...fields) {\n        return fields.map(n => fn(n)).join(' - ');\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class Wrap extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `wrap_${this.id}`;\n            this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n            this.names = {\n                outputData: `data_${p}_out`,\n                rowColumnDataName: `data_${p}_row_col`,\n                cellHeight: `${p}_cellHeight`,\n                cellWidth: `${p}_cellWidth`,\n                fits: `${p}_fits`,\n                target: `${p}_target`,\n                minArea: `${p}_minArea`,\n                aspect: `${p}_aspect`,\n                minAspect: `${p}_minAspect`,\n                idealAspect: `${p}_idealAspect`,\n                dataLength: `${p}_dataLength`,\n                rxc0: `${p}_rxc0`,\n                rxc1: `${p}_rxc1`,\n                rxc2: `${p}_rxc2`,\n                rxc: `${p}_rxc`,\n                growColCount: `${p}_growColCount`,\n                growCellWidth: `${p}_growCellWidth`,\n                fitsArea: `${p}_fitsArea`,\n                colCount: `${p}_colCount`\n            };\n        }\n        getGrouping() {\n            return this.bin.fields;\n        }\n        build() {\n            const { bin, names, prefix, props } = this;\n            const { axisTextColor, cellTitles, globalScope, parentScope } = props;\n            let ordinalBinData;\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n                addTransforms(bin.dataSequence, {\n                    type: 'formula',\n                    expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                    as: FieldNames.Contains\n                });\n                ordinalBinData = bin.dataSequence.name;\n            }\n            else {\n                const ord = createOrdinals(globalScope.data.name, prefix, bin.fields, 'ascending');\n                addData(globalScope.scope, ord.data);\n                ordinalBinData = ord.data.name;\n            }\n            addData(globalScope.scope, {\n                name: names.rxc0,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `ceil(sqrt(${names.dataLength})) + 1`\n                        }\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.data)`,\n                        as: 'complement'\n                    }\n                ]\n            }, {\n                name: names.rxc1,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['data'],\n                        as: ['cols']\n                    }\n                ]\n            }, {\n                name: names.rxc2,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['complement'],\n                        as: ['cols']\n                    }\n                ]\n            }, {\n                name: names.rxc,\n                source: [names.rxc1, names.rxc2],\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.cols)`,\n                        as: 'rows'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                        as: 'cellw'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.cols === 1 ? max(datum.cellw, ${SignalNames.MinCellWidth}) : datum.cellw`,\n                        as: 'cellw'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                        as: 'cellh'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.rows === 1 ? max(datum.cellh, ${SignalNames.MinCellHeight}) : datum.cellh`,\n                        as: 'cellh'\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum.cellw >= ${SignalNames.MinCellWidth} && datum.cellh >= ${SignalNames.MinCellHeight})`,\n                        as: 'meetsmin'\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.meetsmin'\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.cellw / datum.cellh',\n                        as: names.aspect\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(datum.${names.aspect} - ${names.target})`,\n                        as: names.idealAspect\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                        as: 'coverage'\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: [names.idealAspect, 'coverage'],\n                            order: ['ascending', 'descending']\n                        }\n                    }\n                ]\n            }, {\n                name: names.rowColumnDataName,\n                source: ordinalBinData,\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `floor((datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) / ${names.colCount})`,\n                        as: FieldNames.WrapRow\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) % ${names.colCount}`,\n                        as: FieldNames.WrapCol\n                    },\n                    {\n                        type: 'formula',\n                        expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                        as: FieldNames.FacetSearch\n                    },\n                    {\n                        type: 'formula',\n                        expr: displayBin(bin),\n                        as: FieldNames.FacetTitle\n                    }\n                ]\n            });\n            const dataOut = {\n                name: names.outputData,\n                source: globalScope.data.name,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: names.rowColumnDataName,\n                        key: safeFieldName(bin.fields[0]),\n                        fields: [bin.fields[0]].map(safeFieldName),\n                        values: [FieldNames.WrapRow, FieldNames.WrapCol]\n                    }\n                ]\n            };\n            addData(globalScope.scope, dataOut);\n            globalScope.setMarkDataName(names.outputData);\n            addSignals(globalScope.scope, {\n                name: names.minAspect,\n                update: `${SignalNames.MinCellWidth} / ${SignalNames.MinCellHeight}`\n            }, {\n                name: names.target,\n                update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`\n            }, {\n                name: names.minArea,\n                update: `${SignalNames.MinCellWidth}*${SignalNames.MinCellHeight}`\n            }, {\n                name: names.aspect,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`\n            }, {\n                name: names.dataLength,\n                update: `data(${JSON.stringify(ordinalBinData)}).length`\n            }, {\n                name: names.growColCount,\n                update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${SignalNames.MinCellWidth}), 1)`\n            }, {\n                name: names.growCellWidth,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`\n            }, {\n                name: names.fitsArea,\n                update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`\n            }, {\n                name: names.fits,\n                update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`\n            }, {\n                name: names.colCount,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`\n            }, {\n                name: names.cellWidth,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`\n            }, {\n                name: names.cellHeight,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${SignalNames.MinCellHeight}`\n            });\n            modifySignal(globalScope.signals.plotHeightOut, 'max', `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n            modifySignal(globalScope.signals.plotWidthOut, 'max', `(${names.cellWidth} * ${names.colCount})`);\n            const signalH = [names.cellHeight, SignalNames.FacetPaddingTop, SignalNames.FacetPaddingBottom].join(' - ');\n            const signalW = [names.cellWidth, SignalNames.FacetPaddingLeft].join(' - ');\n            const signalX = addOffsets(parentScope.offsets.x, `datum[${JSON.stringify(FieldNames.WrapCol)}] * ${names.cellWidth}`, SignalNames.FacetPaddingLeft);\n            const signalY = addOffsets(parentScope.offsets.y, `datum[${JSON.stringify(FieldNames.WrapRow)}] * ${names.cellHeight}`, SignalNames.FacetPaddingTop);\n            const update = {\n                height: {\n                    signal: signalH\n                },\n                width: {\n                    signal: signalW\n                },\n                x: {\n                    signal: signalX\n                },\n                y: {\n                    signal: signalY\n                }\n            };\n            const offsets = {\n                x: signalX,\n                y: signalY,\n                h: signalH,\n                w: signalW\n            };\n            const group = {\n                style: 'cell',\n                name: prefix,\n                type: 'group',\n                from: {\n                    data: names.rowColumnDataName\n                },\n                encode: { update }\n            };\n            addMarks(globalScope.markGroup, group);\n            const sizeSignals = {\n                layoutHeight: `(${names.cellHeight} - ${SignalNames.FacetPaddingTop} - ${SignalNames.FacetPaddingBottom})`,\n                layoutWidth: `(${names.cellWidth} - ${SignalNames.FacetPaddingLeft})`,\n                colCount: names.colCount,\n                rowCount: `ceil(${names.dataLength} / ${names.colCount})`\n            };\n            if (cellTitles) {\n                addFacetCellTitles(group, sizeSignals, axisTextColor);\n            }\n            return {\n                facetScope: group,\n                sizeSignals,\n                offsets\n            };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const layoutClasses = {\n        AggregateContainer,\n        AggregateSquare,\n        Band,\n        Cross,\n        Scatter,\n        Square,\n        Stack,\n        Strip,\n        Treemap,\n        Wrap\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class SpecBuilder {\n        constructor(props, specContext) {\n            this.props = props;\n            this.specContext = specContext;\n            this.globalSignals = {\n                minCellWidth: {\n                    name: SignalNames.MinCellWidth,\n                    update: `${minFacetWidth}`\n                },\n                minCellHeight: { name: SignalNames.MinCellHeight, update: `${minFacetHeight}` },\n                plotOffsetLeft: { name: SignalNames.PlotOffsetLeft, update: '0' },\n                plotOffsetTop: { name: SignalNames.PlotOffsetTop, update: '0' },\n                plotOffsetBottom: { name: SignalNames.PlotOffsetBottom, update: '0' },\n                plotOffsetRight: { name: SignalNames.PlotOffsetRight, update: '0' },\n                plotHeightOut: { name: SignalNames.PlotHeightOut, update: SignalNames.PlotHeightIn },\n                plotWidthOut: { name: SignalNames.PlotWidthOut, update: SignalNames.PlotWidthIn }\n            };\n        }\n        validate() {\n            const { specContext } = this;\n            const { specCapabilities } = this.props;\n            const { roles } = specCapabilities;\n            const required = roles.filter(r => {\n                switch (typeof r.allowNone) {\n                    case 'boolean':\n                        return !r.allowNone;\n                    case 'undefined':\n                        return true;\n                    case 'function':\n                        return !r.allowNone(specContext);\n                }\n            });\n            const numeric = roles.filter(r => r.excludeCategoric);\n            const errors = required\n                .map(r => {\n                if (specContext.specColumns[r.role]) {\n                    return null;\n                }\n                else {\n                    return `Field ${r.role} is required.`;\n                }\n            })\n                .concat(numeric.map(r => {\n                if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) {\n                    return `Field ${r.role} must be quantitative.`;\n                }\n                else {\n                    return null;\n                }\n            }))\n                .filter(Boolean);\n            return errors;\n        }\n        build() {\n            const { specContext } = this;\n            const { facetLayout, specCapabilities } = this.props;\n            const { insight, specColumns, specViewOptions } = specContext;\n            const dataName = 'data_source';\n            const { vegaSpec, groupMark } = this.initSpec(dataName);\n            const { topColorField, colorDataName } = addColor({\n                scope: vegaSpec,\n                dataName,\n                specContext,\n                scaleName: ScaleNames.Color,\n                legendDataName: 'data_legend',\n                topLookupName: 'data_topcolorlookup',\n                colorReverseSignalName: SignalNames.ColorReverse\n            });\n            const globalScope = new GlobalScope({\n                dataName: colorDataName,\n                markGroup: groupMark,\n                scope: vegaSpec,\n                signals: this.globalSignals\n            });\n            if (facetLayout) {\n                addSignals(vegaSpec, {\n                    name: SignalNames.FacetPaddingBottom,\n                    update: `${facetLayout.facetPadding.bottom}`\n                }, {\n                    name: SignalNames.FacetPaddingLeft,\n                    update: `${facetLayout.facetPadding.left}`\n                }, {\n                    name: SignalNames.FacetPaddingTop,\n                    update: `${facetLayout.facetPadding.top}`\n                });\n                this.globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n                this.globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n            }\n            const { firstScope, finalScope, specResult, allGlobalScales, allEncodingRules } = this.iterateLayouts(globalScope, (i, innerScope) => {\n                if (facetLayout && i === 0) {\n                    globalScope.zSize = innerScope.offsets.h;\n                }\n            });\n            if (specResult) {\n                return specResult;\n            }\n            if (allGlobalScales.length > 0) {\n                const plotHeightOut = this.globalSignals.plotHeightOut.name;\n                const plotWidthOut = this.globalSignals.plotWidthOut.name;\n                const colTitleScale = {\n                    type: 'linear',\n                    name: 'scale_facet_col_title',\n                    domain: [0, 1],\n                    range: [0, { signal: plotWidthOut }]\n                };\n                const rowTitleScale = {\n                    type: 'linear',\n                    name: 'scale_facet_row_title',\n                    domain: [0, 1],\n                    range: [{ signal: plotHeightOut }, 0]\n                };\n                let axesScopes = facetLayout ?\n                    addFacetAxesGroupMarks({\n                        globalScope: globalScope.scope,\n                        plotScope: groupMark,\n                        facetScope: firstScope,\n                        colTitleScale,\n                        rowTitleScale,\n                        colSeqName: 'data_FacetCellColTitles',\n                        rowSeqName: 'data_FacetCellRowTitles'\n                    })\n                    :\n                        {\n                            main: [{\n                                    scope: groupMark,\n                                    lines: true,\n                                    labels: true,\n                                    title: true\n                                }]\n                        };\n                addGlobalAxes({\n                    globalScope,\n                    allGlobalScales,\n                    axisScales: this.props.axisScales,\n                    plotOffsetSignals: { x: this.globalSignals.plotOffsetLeft, y: this.globalSignals.plotOffsetBottom },\n                    axesOffsets: { x: axesOffsetX, y: axesOffsetY },\n                    axesTitlePadding: facetLayout ? { x: axesTitlePaddingFacetX, y: axesTitlePaddingFacetY } : { x: axesTitlePaddingX, y: axesTitlePaddingY },\n                    labelBaseline: { x: 'top', y: 'middle' },\n                    specColumns,\n                    specViewOptions,\n                    axesScopes,\n                    faceted: !!facetLayout,\n                    view: insight.view\n                });\n            }\n            //add mark to the final scope\n            if (finalScope.mark) {\n                const { update } = finalScope.mark.encode;\n                const outputDataName = 'output';\n                finalScope.mark.from.data = outputDataName;\n                addData(globalScope.markGroup, {\n                    name: outputDataName,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.x,\n                            as: FieldNames.OffsetX\n                        },\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.y,\n                            as: FieldNames.OffsetY\n                        }\n                    ]\n                });\n                update.x = {\n                    field: FieldNames.OffsetX\n                };\n                update.y = {\n                    field: FieldNames.OffsetY\n                };\n                allEncodingRules.forEach(map => {\n                    for (let key in map) {\n                        if (update[key]) {\n                            let arrIn = map[key];\n                            if (!Array.isArray(update[key])) {\n                                let value = update[key];\n                                let arrOut = [];\n                                update[key] = arrOut;\n                                arrIn.forEach(rule => arrOut.push(rule));\n                                arrOut.push(value);\n                            }\n                            else {\n                                let arrOut = update[key];\n                                arrIn.forEach(rule => arrOut.unshift(rule));\n                            }\n                        }\n                    }\n                });\n                update.fill = fill(specContext, topColorField, ScaleNames.Color);\n                update.opacity = opacity();\n            }\n            return {\n                specCapabilities,\n                vegaSpec\n            };\n        }\n        initSpec(dataName) {\n            const { globalSignals } = this;\n            const { minCellWidth, minCellHeight, plotOffsetLeft, plotOffsetBottom, plotOffsetTop, plotOffsetRight, plotHeightOut, plotWidthOut } = globalSignals;\n            const { specContext } = this;\n            const { insight } = specContext;\n            const groupMark = {\n                type: 'group',\n                //style: 'cell',\n                encode: {\n                    update: {\n                        x: { signal: SignalNames.PlotOffsetLeft },\n                        y: { signal: SignalNames.PlotOffsetTop },\n                        height: { signal: SignalNames.PlotHeightOut },\n                        width: { signal: SignalNames.PlotWidthOut }\n                    }\n                }\n            };\n            const inputDataname = 'input';\n            const vegaSpec = {\n                $schema: 'https://vega.github.io/schema/vega/v5.json',\n                //style: 'cell',\n                data: [{ name: inputDataname }, { name: dataName, source: inputDataname, transform: [] }],\n                marks: [groupMark],\n                signals: textSignals(specContext, SignalNames.ViewportHeight).concat([\n                    minCellWidth,\n                    minCellHeight,\n                    {\n                        name: SignalNames.ViewportHeight,\n                        update: `max(${SignalNames.MinCellHeight}, ${insight.size.height})`\n                    },\n                    {\n                        name: SignalNames.ViewportWidth,\n                        update: `max(${SignalNames.MinCellWidth}, ${insight.size.width})`\n                    },\n                    plotOffsetLeft,\n                    plotOffsetTop,\n                    plotOffsetBottom,\n                    plotOffsetRight,\n                    {\n                        name: SignalNames.PlotHeightIn,\n                        update: `${SignalNames.ViewportHeight} - ${SignalNames.PlotOffsetBottom}`\n                    },\n                    {\n                        name: SignalNames.PlotWidthIn,\n                        update: `${SignalNames.ViewportWidth} - ${SignalNames.PlotOffsetLeft} - ${SignalNames.PlotOffsetRight}`\n                    },\n                    plotHeightOut,\n                    plotWidthOut,\n                    {\n                        name: 'height',\n                        update: `${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut} + ${SignalNames.PlotOffsetBottom}`\n                    },\n                    {\n                        name: 'width',\n                        update: `${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotOffsetRight}`\n                    }\n                ])\n            };\n            return { vegaSpec, groupMark };\n        }\n        iterateLayouts(globalScope, onLayoutBuild) {\n            let specResult;\n            let parentScope = {\n                sizeSignals: globalScope.sizeSignals,\n                offsets: globalScope.offsets\n            };\n            let firstScope;\n            let childScope;\n            const groupings = [];\n            let { layouts, specCapabilities } = this.props;\n            const allGlobalScales = [];\n            const allEncodingRules = [];\n            for (let i = 0; i < layouts.length; i++) {\n                if (!parentScope)\n                    continue;\n                let buildProps = {\n                    globalScope,\n                    parentScope,\n                    axesScales: this.props.axisScales,\n                    groupings,\n                    id: i\n                };\n                let layout = this.createLayout(layouts[i], buildProps);\n                try {\n                    childScope = layout.build();\n                    childScope.id = i;\n                    let groupby = layout.getGrouping();\n                    if (groupby) {\n                        groupings.push({\n                            id: i,\n                            groupby,\n                            fieldOps: [\n                                { field: null, op: 'count', as: FieldNames.Count }\n                            ]\n                        });\n                    }\n                    let sumOp = layout.getAggregateSumOp();\n                    if (sumOp) {\n                        groupings[groupings.length - 1].fieldOps.push(sumOp);\n                    }\n                    onLayoutBuild(i, childScope);\n                }\n                catch (e) {\n                    specResult = {\n                        errors: [e.stack],\n                        specCapabilities,\n                        vegaSpec: null\n                    };\n                    break;\n                }\n                if (childScope && childScope.globalScales) {\n                    allGlobalScales.push(childScope.globalScales);\n                }\n                if (childScope.encodingRuleMap) {\n                    allEncodingRules.push(childScope.encodingRuleMap);\n                }\n                if (i === 0) {\n                    firstScope = childScope;\n                }\n                parentScope = childScope;\n            }\n            return { firstScope, finalScope: parentScope, specResult, allGlobalScales, allEncodingRules };\n        }\n        createLayout(layoutPair, buildProps) {\n            const { layoutType, props } = layoutPair;\n            const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n            const layoutClass = layoutClasses[layoutType];\n            const layout = new layoutClass(layoutBuildProps);\n            layout.id = buildProps.id;\n            return layout;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function build(specContext, currData) {\n        const { specColumns } = specContext;\n        const columns = [\n            specColumns.color,\n            specColumns.facet,\n            specColumns.facetV,\n            specColumns.group,\n            specColumns.size,\n            specColumns.sort,\n            specColumns.x,\n            specColumns.y,\n            specColumns.z\n        ];\n        inferAll(columns, currData);\n        const specBuilderProps = getSpecBuilderPropsForChart(specContext);\n        const specBuilder = new SpecBuilder(specBuilderProps, specContext);\n        let specResult;\n        if (specBuilder) {\n            try {\n                const errors = specBuilder.validate();\n                if (errors.length) {\n                    specResult = {\n                        errors,\n                        specCapabilities: specBuilderProps.specCapabilities,\n                        vegaSpec: null\n                    };\n                }\n                else {\n                    specResult = specBuilder.build();\n                }\n            }\n            catch (e) {\n                specResult = {\n                    specCapabilities: null,\n                    vegaSpec: null,\n                    errors: [e.stack]\n                };\n            }\n            if (!specResult.errors) {\n                const data0 = specResult.vegaSpec.data[0];\n                data0.values = currData;\n            }\n        }\n        else {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [`could not build spec for ${specContext.insight.chart}`]\n            };\n        }\n        return specResult;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var index$2 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        build: build,\n        FieldNames: FieldNames,\n        ScaleNames: ScaleNames,\n        SignalNames: SignalNames,\n        Other: Other,\n        ColorScaleNone: ColorScaleNone,\n        getColumnsFromData: getColumnsFromData,\n        getSpecColumns: getSpecColumns,\n        inferAll: inferAll,\n        getStats: getStats\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const GL_ORDINAL = 'GL_ORDINAL';\n\n    var constants$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        GL_ORDINAL: GL_ORDINAL,\n        ColorScaleNone: ColorScaleNone,\n        FieldNames: FieldNames,\n        ScaleNames: ScaleNames,\n        SignalNames: SignalNames\n    });\n\n    function isSearchExpressionGroup(search) {\n        if (!search) {\n            return false;\n        }\n        return !!search.expressions;\n    }\n    function createGroupFromExpression(input) {\n        const output = {\n            expressions: [input]\n        };\n        return output;\n    }\n    function ensureSearchExpressionGroupArray(search) {\n        if (Array.isArray(search)) {\n            return [...search];\n        }\n        else if (isSearchExpressionGroup(search)) {\n            return [search];\n        }\n        else {\n            return [createGroupFromExpression(search)];\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const expressionKeys = Object.keys({\n        clause: null,\n        name: null,\n        operator: null,\n        value: null\n    });\n    function compareExpression(a, b) {\n        if (a && b) {\n            for (let k = 0; k < expressionKeys.length; k++) {\n                let key = expressionKeys[k];\n                if (a[key] != b[key])\n                    return false;\n            }\n        }\n        else {\n            return !a && !b;\n        }\n        return true;\n    }\n    const groupKeys = Object.keys({\n        clause: null\n    });\n    function compareGroup(a, b) {\n        for (let k = 0; k < groupKeys.length; k++) {\n            let key = groupKeys[k];\n            if (a[key] != b[key])\n                return false;\n        }\n        if (!a.expressions && !b.expressions)\n            return true;\n        if (!a.expressions || !b.expressions)\n            return false;\n        if (a.expressions.length != b.expressions.length)\n            return false;\n        for (let i = 0; i < a.expressions.length; i++) {\n            if (!compareExpression(a.expressions[i], b.expressions[i]))\n                return false;\n        }\n        return true;\n    }\n    function compare(a, b) {\n        if (a == b)\n            return true;\n        if (!a || !b)\n            return false;\n        let arrs = [a, b].map(ensureSearchExpressionGroupArray);\n        let [arrA, arrB] = arrs;\n        if (arrA.length != arrB.length)\n            return false;\n        for (let i = 0; i < arrA.length; i++) {\n            if (!compareGroup(arrA[i], arrB[i]))\n                return false;\n        }\n        return true;\n    }\n    function startsWith(whole, part) {\n        if (!part)\n            return true;\n        let arrs = [whole, part].map(ensureSearchExpressionGroupArray);\n        let [wholeArray, partArray] = arrs;\n        if (partArray.length > wholeArray.length)\n            return false;\n        for (let i = 0; i < partArray.length; i++) {\n            if (!compareGroup(wholeArray[i], partArray[i]))\n                return false;\n        }\n        return true;\n    }\n\n    function valueToBoolean(value) {\n        if (typeof value === 'string') {\n            switch (value.toLowerCase()) {\n                case 'true':\n                    return true;\n                case 'false':\n                    return false;\n            }\n        }\n        return !!value;\n    }\n    function valueToString(value) {\n        if (value == null) {\n            return '';\n        }\n        switch (typeof value) {\n            case 'string':\n                return value;\n            case 'boolean':\n            case 'number':\n                return value.toString();\n        }\n        return '';\n    }\n    function isStringOperation(ex) {\n        switch (ex.operator) {\n            case 'contains':\n            case '!contains':\n            case 'starts':\n            case '!starts':\n                return true;\n        }\n        return false;\n    }\n    function isnullorEmpty(value) {\n        if (value == null)\n            return true; //double equal sign to also catch undefined\n        if (typeof value === 'string' && value.length === 0)\n            return true;\n        return false;\n    }\n    class Exec {\n        constructor(search, columns) {\n            this.columns = columns;\n            this.groups = ensureSearchExpressionGroupArray(search).map(g => {\n                const expressions = g.expressions.filter(Boolean);\n                expressions.forEach(ex => {\n                    ex.column = this.getColumn(ex.name);\n                    ex.valueBool = valueToBoolean(ex.value);\n                    ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n                    ex.stringOperation = isStringOperation(ex);\n                });\n                const group = Object.assign(Object.assign({}, g), { expressions });\n                return group;\n            });\n        }\n        getColumn(name) {\n            for (let i = 0; i < this.columns.length; i++) {\n                if (this.columns[i].name == name) {\n                    return this.columns[i];\n                }\n            }\n        }\n        runExpressionOnColumn(datum, ex) {\n            const actualDataValue = datum[ex.name];\n            if (ex.operator === 'isnullorEmpty') {\n                return isnullorEmpty(actualDataValue);\n            }\n            else if (ex.operator === '!isnullorEmpty') {\n                return !isnullorEmpty(actualDataValue);\n            }\n            let dataValue = actualDataValue;\n            let expressionValue = ex.value;\n            if (ex.column) {\n                if (ex.column.type === 'string' || ex.stringOperation) {\n                    dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n                    expressionValue = ex.valueLow;\n                }\n                else if (ex.column.type === 'boolean') {\n                    dataValue = valueToBoolean(actualDataValue);\n                    expressionValue = ex.valueBool;\n                }\n                else if (ex.column.quantitative) {\n                    dataValue = +actualDataValue;\n                    expressionValue = +ex.value;\n                }\n            }\n            switch (ex.operator) {\n                case '!=':\n                    return dataValue != expressionValue;\n                case '<':\n                    return dataValue < expressionValue;\n                case '<=':\n                    return dataValue <= expressionValue;\n                case '==':\n                    return dataValue == expressionValue;\n                case '>':\n                    return dataValue > expressionValue;\n                case '>=':\n                    return dataValue >= expressionValue;\n                case 'contains':\n                    return dataValue.indexOf(expressionValue) >= 0;\n                case '!contains':\n                    return dataValue.indexOf(expressionValue) < 0;\n                case 'starts':\n                    return dataValue.indexOf(expressionValue) == 0;\n                case '!starts':\n                    return dataValue.indexOf(expressionValue) !== 0;\n            }\n        }\n        runExpression(datum, ex) {\n            if (ex.name == null) {\n                //run on all columns\n                const group = {\n                    expressions: this.columns.map((column, i) => {\n                        const ex2 = Object.assign(Object.assign({}, ex), { column, name: column.name });\n                        if (i) {\n                            ex2.clause = '||';\n                        }\n                        return ex2;\n                    })\n                };\n                return this.runGroup(datum, group);\n            }\n            else {\n                return this.runExpressionOnColumn(datum, ex);\n            }\n        }\n        runGroup(datum, group) {\n            let accumulator = this.runExpression(datum, group.expressions[0]);\n            for (let i = 1; i < group.expressions.length; i++) {\n                let ex = group.expressions[i];\n                switch (ex.clause) {\n                    case '&&':\n                        accumulator = accumulator && this.runExpression(datum, ex);\n                        break;\n                    case '||':\n                        accumulator = accumulator || this.runExpression(datum, ex);\n                        break;\n                }\n            }\n            return accumulator;\n        }\n        run(datum) {\n            let accumulator = this.runGroup(datum, this.groups[0]);\n            for (let i = 1; i < this.groups.length; i++) {\n                let group = this.groups[i];\n                switch (group.clause) {\n                    case '&&':\n                        accumulator = accumulator && this.runGroup(datum, group);\n                        break;\n                    case '||':\n                        accumulator = accumulator || this.runGroup(datum, group);\n                        break;\n                }\n            }\n            return accumulator;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function invertSearchExpressionGroup(input) {\n        //this only works if all expressions in this group have the same clause\n        const output = {\n            expressions: input.expressions.map(invertSearchExpression)\n        };\n        if (input.clause) {\n            output.clause = invertedClauses[input.clause];\n        }\n        return output;\n    }\n    const invertedOperators = {\n        '!=': '==',\n        '==': '!=',\n        '<': '>=',\n        '>=': '<',\n        '<=': '>',\n        '>': '<=',\n        '!contains': 'contains',\n        'contains': '!contains',\n        '!isnullorEmpty': 'isnullorEmpty',\n        'isnullorEmpty': '!isnullorEmpty',\n        '!starts': 'starts',\n        'starts': '!starts'\n    };\n    const invertedClauses = {\n        '&&': '||',\n        '||': '&&'\n    };\n    function invertSearchExpression(input) {\n        const operator = invertedOperators[input.operator];\n        const output = Object.assign(Object.assign({}, input), { operator });\n        if (input.clause) {\n            output.clause = invertedClauses[input.clause];\n        }\n        return output;\n    }\n    function invert(search) {\n        if (Array.isArray(search)) {\n            return search.map(invertSearchExpressionGroup);\n        }\n        else if (isSearchExpressionGroup(search)) {\n            return invertSearchExpressionGroup(search);\n        }\n        else {\n            return invertSearchExpression(search);\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function narrow(a, b) {\n        if (!a) {\n            return b;\n        }\n        let arrs = [a, b].map(ensureSearchExpressionGroupArray);\n        let [arrA, arrB] = arrs;\n        arrB[0].clause = '&&';\n        return arrA.concat(arrB);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var index$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        compareExpression: compareExpression,\n        compareGroup: compareGroup,\n        compare: compare,\n        startsWith: startsWith,\n        Exec: Exec,\n        isSearchExpressionGroup: isSearchExpressionGroup,\n        createGroupFromExpression: createGroupFromExpression,\n        ensureSearchExpressionGroupArray: ensureSearchExpressionGroupArray,\n        invert: invert,\n        narrow: narrow\n    });\n\n    var types$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const layerNames = {\n        cubes: 'LAYER_CUBES',\n        lines: 'LAYER_LINES',\n        text: 'LAYER_TEXT',\n        paths: 'LAYER_PATHS',\n        polygons: 'LAYER_POLYGONS'\n    };\n\n    var constants = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        layerNames: layerNames\n    });\n\n    var require$$0$1 = [\n    \t\"a\",\n    \t\"abbr\",\n    \t\"address\",\n    \t\"area\",\n    \t\"article\",\n    \t\"aside\",\n    \t\"audio\",\n    \t\"b\",\n    \t\"base\",\n    \t\"bdi\",\n    \t\"bdo\",\n    \t\"blockquote\",\n    \t\"body\",\n    \t\"br\",\n    \t\"button\",\n    \t\"canvas\",\n    \t\"caption\",\n    \t\"cite\",\n    \t\"code\",\n    \t\"col\",\n    \t\"colgroup\",\n    \t\"data\",\n    \t\"datalist\",\n    \t\"dd\",\n    \t\"del\",\n    \t\"details\",\n    \t\"dfn\",\n    \t\"dialog\",\n    \t\"div\",\n    \t\"dl\",\n    \t\"dt\",\n    \t\"em\",\n    \t\"embed\",\n    \t\"fieldset\",\n    \t\"figcaption\",\n    \t\"figure\",\n    \t\"footer\",\n    \t\"form\",\n    \t\"h1\",\n    \t\"h2\",\n    \t\"h3\",\n    \t\"h4\",\n    \t\"h5\",\n    \t\"h6\",\n    \t\"head\",\n    \t\"header\",\n    \t\"hgroup\",\n    \t\"hr\",\n    \t\"html\",\n    \t\"i\",\n    \t\"iframe\",\n    \t\"img\",\n    \t\"input\",\n    \t\"ins\",\n    \t\"kbd\",\n    \t\"keygen\",\n    \t\"label\",\n    \t\"legend\",\n    \t\"li\",\n    \t\"link\",\n    \t\"main\",\n    \t\"map\",\n    \t\"mark\",\n    \t\"math\",\n    \t\"menu\",\n    \t\"menuitem\",\n    \t\"meta\",\n    \t\"meter\",\n    \t\"nav\",\n    \t\"noscript\",\n    \t\"object\",\n    \t\"ol\",\n    \t\"optgroup\",\n    \t\"option\",\n    \t\"output\",\n    \t\"p\",\n    \t\"param\",\n    \t\"picture\",\n    \t\"pre\",\n    \t\"progress\",\n    \t\"q\",\n    \t\"rb\",\n    \t\"rp\",\n    \t\"rt\",\n    \t\"rtc\",\n    \t\"ruby\",\n    \t\"s\",\n    \t\"samp\",\n    \t\"script\",\n    \t\"section\",\n    \t\"select\",\n    \t\"slot\",\n    \t\"small\",\n    \t\"source\",\n    \t\"span\",\n    \t\"strong\",\n    \t\"style\",\n    \t\"sub\",\n    \t\"summary\",\n    \t\"sup\",\n    \t\"svg\",\n    \t\"table\",\n    \t\"tbody\",\n    \t\"td\",\n    \t\"template\",\n    \t\"textarea\",\n    \t\"tfoot\",\n    \t\"th\",\n    \t\"thead\",\n    \t\"time\",\n    \t\"title\",\n    \t\"tr\",\n    \t\"track\",\n    \t\"u\",\n    \t\"ul\",\n    \t\"var\",\n    \t\"video\",\n    \t\"wbr\"\n    ];\n\n    var htmlTags = require$$0$1;\n\n    var htmlTags$1 = /*#__PURE__*/_mergeNamespaces({\n        __proto__: null,\n        'default': htmlTags\n    }, [htmlTags]);\n\n    var require$$0 = [\n    \t\"a\",\n    \t\"altGlyph\",\n    \t\"altGlyphDef\",\n    \t\"altGlyphItem\",\n    \t\"animate\",\n    \t\"animateColor\",\n    \t\"animateMotion\",\n    \t\"animateTransform\",\n    \t\"circle\",\n    \t\"clipPath\",\n    \t\"color-profile\",\n    \t\"cursor\",\n    \t\"defs\",\n    \t\"desc\",\n    \t\"ellipse\",\n    \t\"feBlend\",\n    \t\"feColorMatrix\",\n    \t\"feComponentTransfer\",\n    \t\"feComposite\",\n    \t\"feConvolveMatrix\",\n    \t\"feDiffuseLighting\",\n    \t\"feDisplacementMap\",\n    \t\"feDistantLight\",\n    \t\"feFlood\",\n    \t\"feFuncA\",\n    \t\"feFuncB\",\n    \t\"feFuncG\",\n    \t\"feFuncR\",\n    \t\"feGaussianBlur\",\n    \t\"feImage\",\n    \t\"feMerge\",\n    \t\"feMergeNode\",\n    \t\"feMorphology\",\n    \t\"feOffset\",\n    \t\"fePointLight\",\n    \t\"feSpecularLighting\",\n    \t\"feSpotLight\",\n    \t\"feTile\",\n    \t\"feTurbulence\",\n    \t\"filter\",\n    \t\"font\",\n    \t\"font-face\",\n    \t\"font-face-format\",\n    \t\"font-face-name\",\n    \t\"font-face-src\",\n    \t\"font-face-uri\",\n    \t\"foreignObject\",\n    \t\"g\",\n    \t\"glyph\",\n    \t\"glyphRef\",\n    \t\"hkern\",\n    \t\"image\",\n    \t\"line\",\n    \t\"linearGradient\",\n    \t\"marker\",\n    \t\"mask\",\n    \t\"metadata\",\n    \t\"missing-glyph\",\n    \t\"mpath\",\n    \t\"path\",\n    \t\"pattern\",\n    \t\"polygon\",\n    \t\"polyline\",\n    \t\"radialGradient\",\n    \t\"rect\",\n    \t\"script\",\n    \t\"set\",\n    \t\"stop\",\n    \t\"style\",\n    \t\"svg\",\n    \t\"switch\",\n    \t\"symbol\",\n    \t\"text\",\n    \t\"textPath\",\n    \t\"title\",\n    \t\"tref\",\n    \t\"tspan\",\n    \t\"use\",\n    \t\"view\",\n    \t\"vkern\"\n    ];\n\n    var lib = require$$0;\n\n    var svgTags = /*#__PURE__*/_mergeNamespaces({\n        __proto__: null,\n        'default': lib\n    }, [lib]);\n\n    const htmlTagArray = htmlTags || htmlTags$1;\n    const svgTagArray = lib || svgTags;\n    /**\n     * Decamelizes a string with/without a custom separator (hyphen by default).\n     * from: https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript\n     *\n     * @param str String in camelcase\n     * @param separator Separator for the new decamelized string.\n     */\n    function decamelize(str, separator = '-') {\n        return str\n            .replace(/([a-z\\d])([A-Z])/g, '$1' + separator + '$2')\n            .replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, '$1' + separator + '$2')\n            .toLowerCase();\n    }\n    function createElement(tag, attrs, ...children) {\n        if (typeof tag === 'function') {\n            const fn = tag;\n            const props = attrs;\n            props.children = children;\n            return fn(props);\n        }\n        else {\n            const ns = tagNamespace(tag);\n            const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n            const map = attrs;\n            let ref;\n            for (let name in map) {\n                if (name && map.hasOwnProperty(name)) {\n                    let value = map[name];\n                    if (name === 'className' && value !== void 0) {\n                        setAttribute(el, ns, 'class', value.toString());\n                    }\n                    else if (name === 'disabled' && !value) ;\n                    else if (value === null || value === undefined) {\n                        continue;\n                    }\n                    else if (value === true) {\n                        setAttribute(el, ns, name, name);\n                    }\n                    else if (typeof value === 'function') {\n                        if (name === 'ref') {\n                            ref = value;\n                        }\n                        else {\n                            el[name.toLowerCase()] = value;\n                        }\n                    }\n                    else if (typeof value === 'object') {\n                        setAttribute(el, ns, name, flatten(value));\n                    }\n                    else {\n                        setAttribute(el, ns, name, value.toString());\n                    }\n                }\n            }\n            if (children && children.length > 0) {\n                appendChildren(el, children);\n            }\n            if (ref) {\n                ref(el);\n            }\n            return el;\n        }\n    }\n    function setAttribute(el, ns, name, value) {\n        if (ns) {\n            el.setAttributeNS(null, name, value);\n        }\n        else {\n            el.setAttribute(name, value);\n        }\n    }\n    function flatten(o) {\n        const arr = [];\n        for (let prop in o)\n            arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n        return arr.join(';');\n    }\n    function addChild(parentElement, child) {\n        if (child === null || child === undefined || typeof child === \"boolean\") {\n            return;\n        }\n        else if (Array.isArray(child)) {\n            appendChildren(parentElement, child);\n        }\n        else if (isElement(child)) {\n            parentElement.appendChild(child);\n        }\n        else {\n            parentElement.appendChild(document.createTextNode(child.toString()));\n        }\n    }\n    function appendChildren(parentElement, children) {\n        children.forEach(child => addChild(parentElement, child));\n    }\n    function isElement(el) {\n        //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n        return !!el.nodeType;\n    }\n    function mount(element, container) {\n        container.innerHTML = '';\n        if (element) {\n            addChild(container, element);\n        }\n    }\n    function findElementByChildPositions(childPositions, container) {\n        let element = container || document.body;\n        let childPosition;\n        while (element && childPositions.length) {\n            childPosition = childPositions.shift();\n            element = element.children.item(childPosition);\n        }\n        if (element) {\n            return element;\n        }\n    }\n    function focusActiveElement(element, activeElementInfo) {\n        element.focus();\n        element.scrollTop = activeElementInfo.scrollTop;\n        const input = element;\n        if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) {\n            input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n        }\n    }\n    function setActiveElement(activeElementInfo, container) {\n        if (activeElementInfo) {\n            const element = findElementByChildPositions(activeElementInfo.childPositions, container);\n            if (element) {\n                focusActiveElement(element, activeElementInfo);\n            }\n        }\n    }\n    function getActiveElementInfo(container) {\n        let element = document.activeElement;\n        const { scrollTop, selectionDirection, selectionEnd, selectionStart } = element;\n        const activeElementInfo = {\n            childPositions: [],\n            scrollTop,\n            selectionDirection,\n            selectionEnd,\n            selectionStart\n        };\n        while (element && element !== document.body && element !== container) {\n            activeElementInfo.childPositions.unshift(getChildPosition(element));\n            element = element.parentElement;\n        }\n        if ((element === document.body || element === container) && activeElementInfo.childPositions.length)\n            return activeElementInfo;\n    }\n    function getChildPosition(element) {\n        let childPosition = 0;\n        while (element = element.previousElementSibling)\n            childPosition++;\n        return childPosition;\n    }\n    function tagNamespace(tag) {\n        //issue: this won't disambiguate certain tags which exist in both svg and html: <a>, <title> ...\n        if (tag === 'svg' || (svgTagArray.indexOf(tag) >= 0 && !(htmlTagArray.indexOf(tag) >= 0))) {\n            return \"http://www.w3.org/2000/svg\";\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const KeyCodes = {\n        ENTER: 'Enter',\n    };\n    const Table$1 = (props) => {\n        return (createElement(\"table\", { className: props.className },\n            props.children,\n            props.rows.map((row, i) => (createElement(\"tr\", { className: props.rowClassName || '', onClick: e => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: e => {\n                    if (e.key === KeyCodes.ENTER && props.onRowClick) {\n                        props.onRowClick(e, i);\n                    }\n                } }, row.cells.map((cell, i) => (createElement(\"td\", { className: cell.className || '', title: cell.title || '' }, cell.content))))))));\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var controls = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        Table: Table$1\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var types = /*#__PURE__*/Object.freeze({\n        __proto__: null\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    function concat$1(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []);\n    }\n    /**\n     * Returns array with items which are truthy.\n     * @param args array or arrays to concat into a single array.\n     */\n    function allTruthy$1(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n    }\n    /**\n     * Add an array to an existing array in place.\n     * @param arr Array to append to.\n     * @param items Arrof of items to append.\n     */\n    function push$1(arr, items) {\n        arr.push.apply(arr, items);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * Create a new element as a child of another element.\n     * @param tagName Tag name of the new tag to create.\n     * @param parentElement Reference of the element to append to.\n     * @returns new HTMLElement.\n     */\n    function addEl(tagName, parentElement) {\n        const el = document.createElement(tagName);\n        parentElement.appendChild(el);\n        return el;\n    }\n    /**\n     * Create a new div HTMLElement as a child of another element.\n     * @param parentElement Reference of the element to append to.\n     * @param className Optional css class name to apply to the div.\n     */\n    function addDiv(parentElement, className) {\n        const div = addEl('div', parentElement);\n        if (className) {\n            div.className = className;\n        }\n        return div;\n    }\n    /**\n     * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n     * @param el HTML Element to measure.\n     */\n    function outerSize$1(el) {\n        const cs = getComputedStyle(el);\n        const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n        const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n        return { height, width };\n    }\n\n    var isMergeableObject = function isMergeableObject(value) {\n    \treturn isNonNullObject(value)\n    \t\t&& !isSpecial(value)\n    };\n\n    function isNonNullObject(value) {\n    \treturn !!value && typeof value === 'object'\n    }\n\n    function isSpecial(value) {\n    \tvar stringValue = Object.prototype.toString.call(value);\n\n    \treturn stringValue === '[object RegExp]'\n    \t\t|| stringValue === '[object Date]'\n    \t\t|| isReactElement(value)\n    }\n\n    // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n    var canUseSymbol = typeof Symbol === 'function' && Symbol.for;\n    var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\n    function isReactElement(value) {\n    \treturn value.$$typeof === REACT_ELEMENT_TYPE\n    }\n\n    function emptyTarget(val) {\n    \treturn Array.isArray(val) ? [] : {}\n    }\n\n    function cloneUnlessOtherwiseSpecified(value, options) {\n    \treturn (options.clone !== false && options.isMergeableObject(value))\n    \t\t? deepmerge$1(emptyTarget(value), value, options)\n    \t\t: value\n    }\n\n    function defaultArrayMerge(target, source, options) {\n    \treturn target.concat(source).map(function(element) {\n    \t\treturn cloneUnlessOtherwiseSpecified(element, options)\n    \t})\n    }\n\n    function mergeObject(target, source, options) {\n    \tvar destination = {};\n    \tif (options.isMergeableObject(target)) {\n    \t\tObject.keys(target).forEach(function(key) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    \t\t});\n    \t}\n    \tObject.keys(source).forEach(function(key) {\n    \t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    \t\t} else {\n    \t\t\tdestination[key] = deepmerge$1(target[key], source[key], options);\n    \t\t}\n    \t});\n    \treturn destination\n    }\n\n    function deepmerge$1(target, source, options) {\n    \toptions = options || {};\n    \toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    \toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n    \tvar sourceIsArray = Array.isArray(source);\n    \tvar targetIsArray = Array.isArray(target);\n    \tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n    \tif (!sourceAndTargetTypesMatch) {\n    \t\treturn cloneUnlessOtherwiseSpecified(source, options)\n    \t} else if (sourceIsArray) {\n    \t\treturn options.arrayMerge(target, source, options)\n    \t} else {\n    \t\treturn mergeObject(target, source, options)\n    \t}\n    }\n\n    deepmerge$1.all = function deepmergeAll(array, options) {\n    \tif (!Array.isArray(array)) {\n    \t\tthrow new Error('first argument should be an array')\n    \t}\n\n    \treturn array.reduce(function(prev, next) {\n    \t\treturn deepmerge$1(prev, next, options)\n    \t}, {})\n    };\n\n    var deepmerge_1 = deepmerge$1;\n\n    var _deepmerge = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        'default': deepmerge_1\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const deepmerge = (deepmerge_1 || _deepmerge);\n    function clone(objectToClone) {\n        if (!objectToClone)\n            return objectToClone;\n        return deepmerge.all([objectToClone]);\n    }\n    const dontMerge = (destination, source) => source;\n    function deepMerge(...objectsToMerge) {\n        const objects = objectsToMerge.filter(Boolean);\n        return deepmerge.all(objects, { arrayMerge: dontMerge });\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n        reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n        reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n        reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n        reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n        reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color, color, {\n      copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable: function() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb: function() {\n        return this;\n      },\n      displayable: function() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n    }\n\n    function rgb_formatRgb() {\n      var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n      return (a === 1 ? \"rgb(\" : \"rgba(\")\n          + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n          + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n\n    function hex(value) {\n      value = Math.max(0, Math.min(255, Math.round(value) || 0));\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl: function() {\n        var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\")\n            + (this.h || 0) + \", \"\n            + (this.s || 0) * 100 + \"%, \"\n            + (this.l || 0) * 100 + \"%\"\n            + (a === 1 ? \")\" : \", \" + a + \")\");\n      }\n    }));\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    function rgbToDeckglColor(c) {\n        return [c.r, c.g, c.b, c.opacity * 255];\n    }\n    /**\n     * Compares 2 colors to see if they are equal.\n     * @param a RGBAColor to compare\n     * @param b RGBAColor to compare\n     * @returns True if colors are equal.\n     */\n    function colorIsEqual(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    /**\n     * Convert a CSS color string to a Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n     * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n     */\n    function colorFromString(cssColorSpecifier) {\n        if (cssColorSpecifier) {\n            const dc = color(cssColorSpecifier);\n            if (dc) {\n                const c = dc.rgb();\n                return rgbToDeckglColor(c);\n            }\n        }\n    }\n    /**\n     * Convert a Deck.gl color to a CSS rgba() string.\n     * @param color A Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n     */\n    function colorToString(color) {\n        const c = [...color];\n        if (c.length > 3) {\n            c[3] /= 255;\n        }\n        return `rgba(${c.join(',')})`;\n    }\n    function desaturate$1(color, value) {\n        const rgb$1 = rgb(color[0], color[1], color[2], color[3] / 255);\n        const hslColor = hsl(rgb$1);\n        hslColor.s = value;\n        const c = hslColor.rgb();\n        return rgbToDeckglColor(c);\n    }\n\n    let vega = {\n        CanvasHandler: null,\n        inferType: null,\n        inferTypes: null,\n        loader: null,\n        parse: null,\n        read: null,\n        renderModule: null,\n        Renderer: null,\n        sceneVisit: null,\n        scheme: null,\n        truncate: null,\n        View: null\n    };\n    let deck = {\n        _CameraLight: null,\n        AmbientLight: null,\n        CompositeLayer: null,\n        COORDINATE_SYSTEM: null,\n        Deck: null,\n        DirectionalLight: null,\n        Layer: null,\n        LightingEffect: null,\n        LinearInterpolator: null,\n        OrbitView: null,\n        OrbitController: null,\n        gouraudLighting: null,\n        picking: null,\n        project32: null\n    };\n    let layers = {\n        IconLayer: null,\n        LineLayer: null,\n        PathLayer: null,\n        PolygonLayer: null,\n        TextLayer: null\n    };\n    let luma = {\n        CubeGeometry: null,\n        Model: null,\n        Texture2D: null\n    };\n    /**\n     * References to dependency libraries.\n     */\n    const base = {\n        deck,\n        layers,\n        luma,\n        vega\n    };\n    /**\n     * Specify the dependency libraries to use for rendering.\n     * @param vega Vega library.\n     * @param deck deck/core library.\n     * @param layers deck/layers library.\n     * @param luma luma.gl library.\n     */\n    function use$1(vega, deck, layers, luma) {\n        base.deck = deck;\n        base.layers = layers;\n        base.luma = luma;\n        base.vega = vega;\n    }\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    var fs = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n\n    const minHeight = '100px';\n    const minWidth = '100px';\n    // const lightSettings: { [view in View]: LightSettings } = {\n    //     '2d': {},\n    //     '3d': {\n    //         lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n    //         ambientRatio: 0.3,\n    //         diffuseRatio: 0.6,\n    //         specularRatio: 0.4,\n    //         lightsStrength: [0.3, 0.0, 0.8, 0.0],\n    //         numberOfLights: 2\n    //     }\n    // };\n    const defaultPresenterStyle$1 = {\n        cssPrefix: 'vega-deckgl-',\n        defaultCubeColor: [128, 128, 128, 255],\n        highlightColor: [0, 0, 0, 255],\n        //lightSettings\n    };\n    const defaultPresenterConfig$1 = {\n        onCubeClick: (e, cube) => { },\n        onCubeHover: (e, cube) => { },\n        transitionDurations: {\n            color: 100,\n            position: 600,\n            size: 600,\n            view: 600\n        }\n    };\n    function createStage(view) {\n        const stage = {\n            view,\n            cubeData: [],\n            pathData: [],\n            polygonData: [],\n            axes: {\n                x: [],\n                y: [],\n                z: [],\n            },\n            gridLines: [],\n            textData: [],\n            legend: {\n                rows: {}\n            },\n            facets: []\n        };\n        return stage;\n    }\n    const groupStrokeWidth = 1;\n    const lineZ = -1;\n    const defaultView$1 = '2d';\n    const min3dDepth = 0.05;\n    const minPixelSize = 0.5;\n\n    var defaults = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        minHeight: minHeight,\n        minWidth: minWidth,\n        defaultPresenterStyle: defaultPresenterStyle$1,\n        defaultPresenterConfig: defaultPresenterConfig$1,\n        createStage: createStage,\n        groupStrokeWidth: groupStrokeWidth,\n        lineZ: lineZ,\n        defaultView: defaultView$1,\n        min3dDepth: min3dDepth,\n        minPixelSize: minPixelSize\n    });\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    var vs = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec3 instancePositions64Low;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_size(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_size(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_size(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset, position_worldspace);\n  \n  vec3 lightColor = lighting_getLightColor(instanceColors.rgb, project_uCameraPosition, position_worldspace.xyz, project_normal(normals));\n  vec3 mixedLight = mix(instanceColors.rgb, lightColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n    const UNSIGNED_BYTE = 0x1401;\n    const DOUBLE = 0x140a;\n    const DEFAULT_COLOR = [255, 0, 255, 255];\n    const defaultProps = {\n        lightingMix: 0.5,\n        getSize: x => x.size,\n        getPosition: x => x.position,\n        getColor: x => x.color,\n        material: { ambient: 0.5, diffuse: 1 }\n    };\n    function _CubeLayer(props) {\n        //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n        class __CubeLayer extends base.deck.Layer {\n            getShaders() {\n                return { vs, fs, modules: [base.deck.project32, base.deck.gouraudLighting, base.deck.picking] };\n            }\n            initializeState() {\n                const attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: DOUBLE,\n                        transition: true,\n                        accessor: 'getPosition'\n                    },\n                    instanceSizes: {\n                        size: 3,\n                        transition: true,\n                        accessor: 'getSize'\n                    },\n                    instanceColors: {\n                        size: 4,\n                        type: UNSIGNED_BYTE,\n                        transition: true,\n                        accessor: 'getColor',\n                        defaultValue: DEFAULT_COLOR\n                    }\n                });\n            }\n            updateState({ props, oldProps, changeFlags }) {\n                super.updateState({ props, oldProps, changeFlags }); //TODO add parameter type to deck.gl-typings\n                // Re-generate model if geometry changed\n                //if (props.fp64 !== oldProps.fp64) {\n                const { gl } = this.context;\n                if (this.state.model) {\n                    this.state.model.delete();\n                }\n                this.setState({ model: this._getModel(gl) });\n                this.getAttributeManager().invalidateAll();\n                //}\n            }\n            _getModel(gl) {\n                return new base.luma.Model(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new base.luma.CubeGeometry(),\n                    isInstanced: true,\n                    //shaderCache: this.context['shaderCache']\n                }));\n            }\n            draw({ uniforms }) {\n                let { lightingMix } = this.props;\n                if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n                    lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n                }\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    lightingMix\n                })).draw();\n            }\n        }\n        __CubeLayer.layerName = 'CubeLayer';\n        __CubeLayer.defaultProps = defaultProps;\n        const instance = new __CubeLayer(props);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * CubeLayer - a Deck.gl layer to render cuboids.\n     * This is instantiatable by calling `new CubeLayer()`.\n     */\n    const CubeLayer = _CubeLayer;\n\n    // tpmt is two power minus ten times t scaled to [0,1]\n    function tpmt(x) {\n      return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n    }\n\n    function expInOut(t) {\n      return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function easing(t) {\n        if (t === 0 || t === 1)\n            return t;\n        return expInOut(t);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getLayers(presenter, config, stage, lightSettings /*LightSettings*/, lightingMix, interpolator, guideLines) {\n        const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n        const { x, y, z } = stage.axes;\n        const lines = concat$1(stage.gridLines, guideLines);\n        const texts = [...stage.textData];\n        [x, y, z].forEach(axes => {\n            axes.forEach(axis => {\n                if (axis.domain)\n                    lines.push(axis.domain);\n                if (axis.ticks)\n                    lines.push.apply(lines, axis.ticks);\n                if (axis.tickText)\n                    texts.push.apply(texts, axis.tickText);\n                if (axis.title)\n                    texts.push(axis.title);\n            });\n        });\n        let characterSet;\n        if (config.getCharacterSet) {\n            characterSet = config.getCharacterSet(stage);\n        }\n        else {\n            //Basic symbols, numbers, and uppercase / lowercase alphabet\n            characterSet = new Array(95).fill(1).map((_, i) => String.fromCharCode(32 + i));\n        }\n        if (stage.facets) {\n            stage.facets.forEach(f => {\n                if (f.lines)\n                    lines.push.apply(lines, f.lines);\n            });\n        }\n        const lineLayer = newLineLayer(layerNames.lines, lines);\n        const textLayer = newTextLayer(presenter, layerNames.text, texts, config, presenter.style.fontFamily, characterSet);\n        const pathLayer = newPathLayer(layerNames.paths, stage.pathData);\n        const polygonLayer = newPolygonLayer(layerNames.polygons, stage.polygonData);\n        return [textLayer, cubeLayer, lineLayer, pathLayer, polygonLayer];\n    }\n    function newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings /*LightSettings*/, lightingMix, interpolator) {\n        const getPosition = getTiming(config.transitionDurations.position, easing);\n        const getSize = getTiming(config.transitionDurations.size, easing);\n        const getColor = getTiming(config.transitionDurations.color);\n        const cubeLayerProps = {\n            interpolator,\n            lightingMix,\n            id: layerNames.cubes,\n            data: cubeData,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            pickable: true,\n            autoHighlight: true,\n            highlightColor,\n            onClick: (o, e) => {\n                config.onCubeClick(e && e.srcEvent, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onCube = false;\n                    config.onCubeHover(e && e.srcEvent, null);\n                }\n                else {\n                    presenter.deckgl.interactiveState.onCube = true;\n                    config.onCubeHover(e && e.srcEvent, o.object);\n                }\n            },\n            //lightSettings,\n            transitions: {\n                getPosition,\n                getColor,\n                getSize\n            }\n        };\n        return new CubeLayer(cubeLayerProps);\n    }\n    function newLineLayer(id, data) {\n        return new base.layers.LineLayer({\n            id,\n            data,\n            widthUnits: 'pixels',\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            getColor: (o) => o.color,\n            getWidth: (o) => o.strokeWidth\n        });\n    }\n    function newPathLayer(id, data) {\n        if (!data)\n            return null;\n        return new base.layers.PathLayer({\n            id,\n            data,\n            billboard: true,\n            widthScale: 1,\n            widthMinPixels: 2,\n            widthUnits: 'pixels',\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            getPath: (o) => o.positions,\n            getColor: (o) => o.strokeColor,\n            getWidth: (o) => o.strokeWidth\n        });\n    }\n    function newPolygonLayer(id, data) {\n        if (!data)\n            return null;\n        let newlayer = new base.layers.PolygonLayer({\n            id,\n            data,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            getPolygon: (o) => o.positions,\n            getFillColor: (o) => o.fillColor,\n            getLineColor: (o) => o.strokeColor,\n            wireframe: false,\n            filled: true,\n            stroked: true,\n            pickable: true,\n            extruded: true,\n            getElevation: (o) => o.depth,\n            getLineWidth: (o) => o.strokeWidth\n        });\n        return newlayer;\n    }\n    function newTextLayer(presenter, id, data, config, fontFamily, characterSet) {\n        let alphaCutoff = config.getTextHighlightAlphaCutoff && config.getTextHighlightAlphaCutoff();\n        if (alphaCutoff === undefined) {\n            alphaCutoff = 0.1;\n        }\n        const props = {\n            id,\n            data,\n            characterSet,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            sizeUnits: 'pixels',\n            autoHighlight: true,\n            pickable: true,\n            highlightColor: p => {\n                if (config.getTextHighlightColor) {\n                    return config.getTextHighlightColor(p.object);\n                }\n                else {\n                    return [0, 0, 0, 0];\n                }\n            },\n            onClick: (o, e) => {\n                let pe = e && e.srcEvent;\n                config.onTextClick && config.onTextClick(pe, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onText = false;\n                }\n                else {\n                    presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n                }\n            },\n            getColor: config.getTextColor || (o => o.color),\n            getTextAnchor: o => o.textAnchor,\n            getSize: o => o.size,\n            getAngle: o => o.angle,\n            fontSettings: {\n                sdf: false,\n                fontSize: 128,\n                buffer: 3\n            },\n            _subLayerProps: { characters: { alphaCutoff } }\n        };\n        if (fontFamily) {\n            props.fontFamily = fontFamily;\n        }\n        return new base.layers.TextLayer(props);\n    }\n    function getTiming(duration, easing) {\n        let timing;\n        if (duration) {\n            timing = {\n                duration,\n                type: 'interpolation'\n            };\n            if (easing) {\n                timing.easing = easing;\n            }\n        }\n        return timing;\n    }\n    function getCubeLayer(deckProps) {\n        return deckProps.layers.filter(layer => layer && layer.id === layerNames.cubes)[0];\n    }\n    function getCubes(deckProps) {\n        const cubeLayer = getCubeLayer(deckProps);\n        if (!cubeLayer)\n            return;\n        const cubeLayerProps = cubeLayer.props;\n        return cubeLayerProps.data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var util$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        addDiv: addDiv,\n        addEl: addEl,\n        allTruthy: allTruthy$1,\n        clone: clone,\n        colorFromString: colorFromString,\n        colorIsEqual: colorIsEqual,\n        colorToString: colorToString,\n        concat: concat$1,\n        createElement: createElement,\n        deepMerge: deepMerge,\n        desaturate: desaturate$1,\n        getActiveElementInfo: getActiveElementInfo,\n        getCubeLayer: getCubeLayer,\n        getCubes: getCubes,\n        mount: mount,\n        outerSize: outerSize$1,\n        push: push$1,\n        setActiveElement: setActiveElement\n    });\n\n    function createOrbitControllerClass(factoryOptions) {\n        function wrapper(props) {\n            class OrbitControllerInternal extends base.deck.OrbitController {\n                constructor(props) {\n                    super(props);\n                    this.invertPan = true;\n                }\n                handleEvent(event) {\n                    if (event.type === 'doubletap') {\n                        if (factoryOptions && factoryOptions.doubleClickHandler) {\n                            return factoryOptions.doubleClickHandler(event, this);\n                        }\n                    }\n                    return super.handleEvent(event);\n                }\n            }\n            const instance = new OrbitControllerInternal(props);\n            return instance;\n        }\n        return wrapper;\n    }\n\n    //adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\n    const CANVAS_STYLE = {\n        position: 'absolute',\n        left: 0,\n        top: 0,\n        width: '100%',\n        height: '100%'\n    };\n    // Create canvas elements for map and deck\n    function createCanvas(props) {\n        let { container = document.body } = props;\n        if (typeof container === 'string') {\n            container = document.getElementById(container);\n        }\n        if (!container) {\n            throw Error('Deck: container not found');\n        }\n        // Add DOM elements\n        const containerStyle = window.getComputedStyle(container);\n        if (containerStyle.position === 'static') {\n            container.style.position = 'relative';\n        }\n        const deckCanvas = document.createElement('canvas');\n        container.appendChild(deckCanvas);\n        Object.assign(deckCanvas.style, CANVAS_STYLE);\n        return { container, deckCanvas };\n    }\n    /**\n     * Creates Deck.gl classes for rendering WebGL.\n     * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n     */\n    function createDeckGLClassesForPresenter(factoryOptions) {\n        const OrbitControllerClass = createOrbitControllerClass(factoryOptions);\n        //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n        //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n        function wrapper(props) {\n            /**\n             * @params container (Element) - DOM element to add deck.gl canvas to\n             * @params controller (Object) - Controller class. Leave empty for auto detection\n             */\n            class DeckGLInternal extends base.deck.Deck {\n                constructor(props) {\n                    if (typeof document === 'undefined') {\n                        // Not browser\n                        throw Error('Deck can only be used in the browser');\n                    }\n                    const { deckCanvas } = createCanvas(props);\n                    const viewState = props.initialViewState || props.viewState || {};\n                    super(Object.assign({}, props, {\n                        width: '100%',\n                        height: '100%',\n                        canvas: deckCanvas,\n                        controller: OrbitControllerClass,\n                        initialViewState: viewState\n                    }));\n                    // Callback for the controller\n                    this._updateViewState = params => {\n                        if (this.onViewStateChange) {\n                            this.onViewStateChange(params);\n                        }\n                    };\n                }\n                setProps(props) {\n                    // this._updateViewState must be bound to `this`\n                    // but we don't have access to the current instance before calling super().\n                    if ('onViewStateChange' in props && this._updateViewState) {\n                        // This is called at least once at _onRendererInitialized\n                        this.onViewStateChange = props.onViewStateChange;\n                        props.onViewStateChange = this._updateViewState;\n                    }\n                    super.setProps(props);\n                }\n            }\n            const instance = new DeckGLInternal(props);\n            return instance;\n        }\n        return {\n            OrbitControllerClass,\n            DeckGL_Class: wrapper\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function wrapper(props) {\n        class LinearInterpolatorInternal extends base.deck.LinearInterpolator {\n            constructor(transitionProps) {\n                super(transitionProps);\n            }\n            interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n                if (this.layerStartProps && this.layerEndProps) {\n                    this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n                }\n                return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n            }\n        }\n        const instance = new LinearInterpolatorInternal(props);\n        return instance;\n    }\n    const LinearInterpolator = wrapper;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function lightingEffects() {\n        const ambientLight = new base.deck.AmbientLight({\n            color: [255, 255, 255],\n            intensity: 0.3\n        });\n        const cameraLight = new base.deck._CameraLight({\n            color: [255, 255, 255],\n            intensity: 1\n        });\n        // const directionalLight = new base.deck.DirectionalLight({\n        //     color: [255, 255, 255],\n        //     direction: [0, 0, -1],\n        //     intensity: 0.2\n        //   });\n        return [new base.deck.LightingEffect({ ambientLight, cameraLight })];\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * HTML elements outputted by the presenter.\n     */\n    var PresenterElement;\n    (function (PresenterElement) {\n        PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n        PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n        PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n        PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n        PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n    })(PresenterElement || (PresenterElement = {}));\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const LegendView = (props) => {\n        const rows = [];\n        const addRow = (row, i) => {\n            const fn = symbolMap[row.symbol.shape];\n            let jsx;\n            if (fn) {\n                jsx = fn(row.symbol);\n            }\n            else {\n                jsx = createElement(\"span\", null, \"x\");\n                //console.log(`need to render ${row.symbol.shape} symbol shape`);\n            }\n            rows.push({\n                cells: [\n                    { className: 'symbol', content: jsx },\n                    { className: 'label', content: row.label, title: row.label }\n                ]\n            });\n        };\n        var sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n        sorted.forEach(i => addRow(props.legend.rows[i]));\n        if (sorted.length) {\n            return (createElement(Table$1, { rows: rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== undefined && (createElement(\"tr\", { tabIndex: props.onClick ? 0 : -1, onClick: e => props.onClick(e, props.legend, null), onKeyUp: e => {\n                    if (e.key === KeyCodes.ENTER && props.onClick) {\n                        props.onClick(e, props.legend, null);\n                    }\n                } },\n                createElement(\"th\", { colSpan: 2 }, props.legend.title)))));\n        }\n    };\n    const symbolMap = {\n        square: function (symbol) {\n            return (createElement(\"div\", { style: {\n                    height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                    width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                    backgroundColor: symbol.fill,\n                    borderColor: symbol.fill\n                } }));\n        }\n    };\n\n    function zSwap(v3) {\n        let temp = -v3[1]; //negeative y to positive z\n        if (v3[0] === lineZ) {\n            v3[0] = 0;\n        }\n        v3[1] = v3[2];\n        v3[2] = temp;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const markStager$5 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const x1 = item.x || 0;\n            const y1 = item.y || 0;\n            const x2 = item.x2 != null ? item.x2 : x1;\n            const y2 = item.y2 != null ? item.y2 : y1;\n            const lineItem = styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n            if (item.mark.role === 'axis-tick') {\n                if (options.currAxis.role === 'z') {\n                    zSwap(lineItem.sourcePosition);\n                    zSwap(lineItem.targetPosition);\n                }\n                options.currAxis.ticks.push(lineItem);\n            }\n            else if (item.mark.role === 'axis-domain') {\n                if (options.currAxis.role === 'z') {\n                    zSwap(lineItem.sourcePosition);\n                    zSwap(lineItem.targetPosition);\n                }\n                options.currAxis.domain = lineItem;\n            }\n            else {\n                stage.gridLines.push(lineItem);\n            }\n        });\n    };\n    function styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n        const line = {\n            sourcePosition: [x1, -y1, lineZ],\n            targetPosition: [x2, -y2, lineZ],\n            color: colorFromString(stroke),\n            strokeWidth: strokeWidth\n        };\n        return line;\n    }\n    function box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n        const lines = [\n            styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n            styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n            styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n            styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)\n        ];\n        if (diagonals) {\n            lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n            lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n        }\n        return lines;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function initializePanel(presenter) {\n        const rootDiv = (createElement(\"div\", { className: className(PresenterElement.root, presenter) },\n            createElement(\"div\", { className: className(PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n            createElement(\"div\", { className: className(PresenterElement.panel, presenter) },\n                createElement(\"div\", { className: className(PresenterElement.vegaControls, presenter) }),\n                createElement(\"div\", { className: className(PresenterElement.legend, presenter) }))));\n        mount(rootDiv, presenter.el);\n    }\n    function className(type, presenter) {\n        return `${presenter.style.cssPrefix}${PresenterElement[type]}`;\n    }\n\n    function patchCubeArray(allocatedSize, empty, cubes) {\n        const patched = new Array(allocatedSize);\n        patched.fill(empty);\n        cubes.forEach(cube => patched[cube.ordinal] = cube);\n        return patched;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const legendMap = {\n        'legend-title': function (legend, textItem) {\n            legend.title = textItem.text;\n        },\n        'legend-symbol': function (legend, symbol) {\n            const { bounds, fill, shape } = symbol;\n            //this object is safe for serialization\n            const legendRowSymbol = { bounds, fill, shape };\n            const i = symbol.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            legend.rows[i].symbol = legendRowSymbol;\n        },\n        'legend-label': function (legend, label) {\n            const i = label.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            const row = legend.rows[i];\n            row.label = label.text;\n            row.value = label.datum.value;\n        }\n    };\n    const markStager$4 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const fn = legendMap[item.mark.role];\n            if (fn) {\n                fn(stage.legend, item);\n            }\n        });\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const markStager$3 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            //for orthographic (2d) - always use 0 or else Deck will not show them\n            const z = stage.view === '2d' ? 0 : (item.z || 0);\n            const depth = (stage.view === '2d' ? 0 : (item.depth || 0)) + min3dDepth;\n            //change direction of y from SVG to GL\n            const ty = -1;\n            let ordinal = options.assignCubeOrdinal(item.datum);\n            if (ordinal > options.maxOrdinal) {\n                options.maxOrdinal = ordinal;\n            }\n            if (ordinal === undefined) ;\n            else {\n                const cube = {\n                    ordinal,\n                    size: [item.width, item.height, depth],\n                    position: [x + (item.x || 0), ty * (y + (item.y || 0)) - item.height, z],\n                    color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n                };\n                cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n                stage.cubeData.push(cube);\n            }\n        });\n    };\n\n    //change direction of y from SVG to GL\n    const ty$1 = -1;\n    const markStager$2 = (options, stage, scene, x, y, groupType) => {\n        const g = Object.assign({ opacity: 1, strokeOpacity: 1, strokeWidth: 1 }, scene.items[0]);\n        const path = {\n            strokeWidth: g.strokeWidth,\n            strokeColor: colorFromString(g.stroke),\n            positions: scene.items.map((it) => [\n                it.x,\n                ty$1 * it.y,\n                it.z || 0\n            ])\n        };\n        path.strokeColor[3] *= g.strokeOpacity;\n        path.strokeColor[3] *= g.opacity;\n        stage.pathData.push(path);\n    };\n\n    const markStager$1 = (options, stage, scene, x, y, groupType) => {\n        //scale Deck.Gl text to Vega size\n        const fontScale = 1;\n        //change direction of y from SVG to GL\n        const ty = -1;\n        base.vega.sceneVisit(scene, function (item) {\n            if (!item.text)\n                return;\n            const size = item.fontSize * fontScale;\n            const alignmentBaseline = convertBaseline(item.baseline);\n            const yOffset = alignmentBaseline === 'top' ? item.fontSize / 2 : 0; //fixup to get tick text correct\n            const textItem = {\n                color: colorFromString(item.fill),\n                text: item.limit === undefined ? item.text : base.vega.truncate(item.text, item.limit, 'right', item.ellipsis || '...'),\n                position: [x + (item.x || 0), ty * (y + (item.y || 0) + yOffset), 0],\n                size,\n                angle: convertAngle(item.angle),\n                textAnchor: convertAlignment(item.align),\n                alignmentBaseline,\n                metaData: item.metaData\n            };\n            if (item.mark.role === 'axis-label') {\n                const tickText = textItem;\n                tickText.value = item.datum.value;\n                if (options.currAxis.role === 'z') {\n                    zSwap(tickText.position);\n                }\n                options.currAxis.tickText.push(tickText);\n            }\n            else if (item.mark.role === 'axis-title') {\n                if (options.currAxis.role === 'z') {\n                    zSwap(textItem.position);\n                }\n                options.currAxis.title = textItem;\n            }\n            else {\n                stage.textData.push(textItem);\n            }\n        });\n    };\n    function convertAngle(vegaTextAngle) {\n        if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n            return 360 - vegaTextAngle;\n        }\n        return 0;\n    }\n    function convertAlignment(textAlign) {\n        switch (textAlign) {\n            case 'center': return 'middle';\n            case 'left': return 'start';\n            case 'right': return 'end';\n        }\n        return 'start';\n    }\n    function convertBaseline(baseline) {\n        switch (baseline) {\n            case 'middle': return 'center';\n        }\n        return baseline || 'bottom';\n    }\n\n    //change direction of y from SVG to GL\n    const ty = -1;\n    const markStager = (options, stage, scene, x, y, groupType) => {\n        const g = Object.assign({ fillOpacity: 1, opacity: 1, strokeOpacity: 1, strokeWidth: 0, depth: 0 }, scene.items[0]);\n        const points = scene.items.map((item) => {\n            item = Object.assign({ z: 0 }, item);\n            item = Object.assign({ x2: item.x, y2: item.y, z2: item.z }, item);\n            return [\n                item.x,\n                ty * item.y,\n                item.z,\n                item.x2,\n                ty * item.y2,\n                item.z2\n            ];\n        });\n        let positions = [];\n        let startpoint = [points[0][0], points[0][1], points[0][2]];\n        points.forEach(p => {\n            positions.push([p[0], p[1], p[2]]);\n        });\n        points.reverse().forEach(p => {\n            positions.push([p[3], p[4], p[5]]);\n        });\n        positions.push(startpoint);\n        const polygon = {\n            fillColor: colorFromString(g.fill) || [0, 0, 0, 0],\n            positions,\n            strokeColor: colorFromString(g.stroke) || [0, 0, 0, 0],\n            strokeWidth: g.strokeWidth,\n            depth: g.depth\n        };\n        polygon.fillColor[3] *= g.fillOpacity;\n        polygon.fillColor[3] *= g.opacity;\n        polygon.strokeColor[3] *= g.strokeOpacity;\n        polygon.strokeColor[3] *= g.opacity;\n        stage.polygonData.push(polygon);\n    };\n\n    var GroupType;\n    (function (GroupType) {\n        GroupType[GroupType[\"none\"] = 0] = \"none\";\n        GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n        GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n        GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n        GroupType[GroupType[\"zAxis\"] = 4] = \"zAxis\";\n    })(GroupType || (GroupType = {}));\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getOrientItem(group) {\n        if (group.orient) {\n            return group;\n        }\n        return group.datum;\n    }\n    function convertGroupRole(group, options) {\n        if (group.mark.role === 'legend')\n            return GroupType.legend;\n        if (group.mark.role === 'axis') {\n            if ((group.mark).zindex === options.zAxisZindex && options.zAxisZindex !== undefined) {\n                return GroupType.zAxis;\n            }\n            const orientItem = getOrientItem(group);\n            if (orientItem) {\n                switch (orientItem.orient) {\n                    case 'bottom':\n                    case 'top':\n                        return GroupType.xAxis;\n                    case 'left':\n                    case 'right':\n                        return GroupType.yAxis;\n                }\n            }\n        }\n    }\n    const group = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (g) {\n            const gx = g.x || 0, gy = g.y || 0;\n            if (g.context && g.context.background && !stage.backgroundColor) {\n                stage.backgroundColor = colorFromString(g.context.background);\n            }\n            if (g.stroke) {\n                const facetRect = {\n                    datum: g.datum,\n                    lines: box(gx + x, gy + y, g.height, g.width, g.stroke, groupStrokeWidth)\n                };\n                stage.facets.push(facetRect);\n            }\n            groupType = convertGroupRole(g, options) || groupType;\n            setCurrentAxis(options, stage, groupType);\n            // draw group contents\n            base.vega.sceneVisit(g, function (item) {\n                mainStager(options, stage, item, gx + x, gy + y, groupType);\n            });\n        });\n    };\n    function setCurrentAxis(options, stage, groupType) {\n        let axes;\n        let role;\n        switch (groupType) {\n            case GroupType.xAxis:\n                axes = stage.axes.x;\n                role = 'x';\n                break;\n            case GroupType.yAxis:\n                axes = stage.axes.y;\n                role = 'y';\n                break;\n            case GroupType.zAxis:\n                axes = stage.axes.z;\n                role = 'z';\n                break;\n            default:\n                return;\n        }\n        options.currAxis = {\n            domain: null,\n            tickText: [],\n            ticks: [],\n            role\n        };\n        axes.push(options.currAxis);\n    }\n    const markStagers = {\n        group,\n        legend: markStager$4,\n        rect: markStager$3,\n        rule: markStager$5,\n        line: markStager$2,\n        area: markStager,\n        text: markStager$1\n    };\n    const mainStager = (options, stage, scene, x, y, groupType) => {\n        if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n            markStager$4(options, stage, scene);\n        }\n        else {\n            const markStager = markStagers[scene.marktype];\n            if (markStager) {\n                markStager(options, stage, scene, x, y, groupType);\n            }\n        }\n    };\n    function sceneToStage(options, stage, scene) {\n        mainStager(options, stage, scene, 0, 0, null);\n        sortAxis(stage.axes.x, 0);\n        sortAxis(stage.axes.y, 1);\n    }\n    function sortAxis(axes, dim) {\n        axes.forEach(axis => {\n            if (axis.domain)\n                orderDomain(axis.domain, dim);\n            axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n            axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n        });\n    }\n    function orderDomain(domain, dim) {\n        if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n            const temp = domain.targetPosition;\n            domain.targetPosition = domain.sourcePosition;\n            domain.sourcePosition = temp;\n        }\n    }\n\n    const viewStateProps = ['target', 'rotationOrbit', 'rotationX', 'zoom'];\n    function targetViewState(height, width, view) {\n        const target = [width / 2, -height / 2, 0];\n        if (view === '2d') {\n            return {\n                target,\n                rotationOrbit: 0,\n                rotationX: 90,\n                zoom: -0.2\n            };\n        }\n        else {\n            return {\n                target,\n                rotationOrbit: 25,\n                rotationX: 30,\n                zoom: -0.4\n            };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    /**\n     * Class which presents a Stage of chart data using Deck.gl to render.\n     */\n    class Presenter {\n        /**\n         * Instantiate a new Presenter.\n         * @param el Parent HTMLElement to present within.\n         * @param style Optional PresenterStyle styling options.\n         */\n        constructor(el, style) {\n            this.el = el;\n            this.style = deepMerge(defaultPresenterStyle$1, style);\n            initializePanel(this);\n            this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n        }\n        /**\n         * Get the previously rendered Stage object.\n         */\n        get stage() {\n            return this._last.stage;\n        }\n        /**\n         * Get the current View camera type.\n         */\n        get view() {\n            return this._last.view;\n        }\n        /**\n         * Cancels any pending animation, calling animationCanceled() on original queue.\n         */\n        animationCancel() {\n            if (this.animationTimer) {\n                clearTimeout(this.animationTimer);\n                this.animationTimer = null;\n                if (this.logger) {\n                    this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n                }\n                if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                    this.queuedAnimationOptions.animationCanceled.call(null);\n                }\n            }\n        }\n        /**\n         * Stops the current animation and queues a new animation.\n         * @param handler Function to invoke when timeout is complete.\n         * @param timeout Length of time to wait before invoking the handler.\n         * @param options Optional QueuedAnimationOptions object.\n         */\n        animationQueue(handler, timeout, options) {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...`);\n            }\n            this.animationCancel();\n            this.animationTimer = setTimeout(() => {\n                if (this.logger) {\n                    this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n                }\n                handler();\n            }, timeout);\n        }\n        /**\n         * Retrieve a sub-element of the rendered output.\n         * @param type PresenterElement type of the HTMLElement to retrieve.\n         */\n        getElement(type) {\n            const elements = this.el.getElementsByClassName(className(type, this));\n            if (elements && elements.length) {\n                return elements[0];\n            }\n        }\n        /**\n         * Present the Vega Scene, or Stage object using Deck.gl.\n         * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n         * @param height Height of the rendering area.\n         * @param width Width of the rendering area.\n         * @param config Optional presentation configuration object.\n         */\n        present(sceneOrStage, height, width, config) {\n            this.animationCancel();\n            let scene = sceneOrStage;\n            let stage;\n            let options = {\n                maxOrdinal: 0,\n                currAxis: null,\n                defaultCubeColor: this.style.defaultCubeColor,\n                assignCubeOrdinal: (config === null || config === void 0 ? void 0 : config.onSceneRectAssignCubeOrdinal) || (() => options.maxOrdinal++),\n                zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n            };\n            //determine if this is a vega scene\n            if (scene.marktype) {\n                stage = createStage(scene.view);\n                sceneToStage(options, stage, scene);\n            }\n            else {\n                stage = sceneOrStage;\n            }\n            if (!this.deckgl) {\n                const classes = createDeckGLClassesForPresenter({\n                    doubleClickHandler: () => {\n                        this.homeCamera();\n                    }\n                });\n                this.OrbitControllerClass = classes.OrbitControllerClass;\n                const initialViewState = targetViewState(height, width, stage.view);\n                let glOptions;\n                if (config && config.preserveDrawingBuffer) {\n                    glOptions = { preserveDrawingBuffer: true };\n                }\n                const deckProps = {\n                    glOptions,\n                    height: null,\n                    width: null,\n                    effects: lightingEffects(),\n                    layers: [],\n                    onClick: config && config.onLayerClick,\n                    views: [new base.deck.OrbitView({ controller: base.deck.OrbitController })],\n                    initialViewState,\n                    container: this.getElement(PresenterElement.gl),\n                    getCursor: (interactiveState) => {\n                        if (interactiveState.onText || interactiveState.onAxisSelection) {\n                            return 'pointer';\n                        }\n                        else if (interactiveState.onCube) {\n                            return 'default';\n                        }\n                        else {\n                            return 'grab';\n                        }\n                    }\n                };\n                if (stage.backgroundColor) {\n                    deckProps.style = { 'background-color': colorToString(stage.backgroundColor) };\n                }\n                this.deckgl = new classes.DeckGL_Class(deckProps);\n            }\n            let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n            if (options.maxOrdinal) {\n                cubeCount = Math.max(cubeCount, options.maxOrdinal);\n                const empty = {\n                    isEmpty: true,\n                    color: [0, 0, 0, 0] // possibly a bug in Deck.gl? set color to invisible.\n                };\n                stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n            }\n            this.setDeckProps(stage, height, width, cubeCount, config);\n            const a = getActiveElementInfo();\n            mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement.legend));\n            setActiveElement(a);\n            if (config && config.onPresent) {\n                config.onPresent();\n            }\n        }\n        /**\n         * Present the same recently rendered Stage with only slight modifications such as a color change,\n         * using the previous Stage values as a basis.\n         * @param stage Partially populated Stage object containing changes.\n         * @param modifyConfig Optional presentation configuration object.\n         */\n        rePresent(stage, modifyConfig) {\n            const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n            this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n        }\n        isNewBounds(view, height, width, cubeCount) {\n            const lastBounds = this.lastBounds();\n            for (let prop in lastBounds) {\n                if (lastBounds[prop] === null)\n                    return true;\n            }\n            const newBounds = { cubeCount, height, view, width };\n            for (let prop in lastBounds) {\n                if (lastBounds[prop] !== newBounds[prop])\n                    return true;\n            }\n        }\n        lastBounds() {\n            const { cubeCount, height, view, width } = this._last;\n            return { cubeCount, height, view, width };\n        }\n        setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n            const config = deepMerge(defaultPresenterConfig$1, modifyConfig);\n            const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n            //let lightSettings = this.style.lightSettings[stage.view];\n            let lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n            let linearInterpolator;\n            //choose the current OrbitView viewstate if possible\n            let viewState = (this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView)\n                //otherwise use the initial viewstate if any\n                || this.deckgl.props.viewState;\n            if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n                let newViewStateTarget = true;\n                if (config && config.onTargetViewState) {\n                    const result = config.onTargetViewState(height, width);\n                    height = result.height;\n                    width = result.width;\n                    if (result.newViewStateTarget !== undefined) {\n                        newViewStateTarget = result.newViewStateTarget;\n                    }\n                }\n                if (!viewState || newViewStateTarget) {\n                    viewState = targetViewState(height, width, stage.view);\n                }\n                const oldCubeLayer = getCubeLayer(this.deckgl.props);\n                if (oldCubeLayer) {\n                    linearInterpolator = new LinearInterpolator(viewStateProps);\n                    linearInterpolator.layerStartProps = { lightingMix: oldCubeLayer.props.lightingMix };\n                    linearInterpolator.layerEndProps = { lightingMix };\n                    viewState.transitionDuration = config.transitionDurations.view;\n                    viewState.transitionEasing = easing;\n                    viewState.transitionInterpolator = linearInterpolator;\n                }\n                if (stage.view === '2d') ;\n            }\n            const guideLines = this._showGuides && box(0, 0, height, width, '#0f0', 1, true);\n            config.preLayer && config.preLayer(stage);\n            const layers = getLayers(this, config, stage, /*lightSettings*/ null, lightingMix, linearInterpolator, guideLines);\n            const deckProps = {\n                effects: lightingEffects(),\n                views: [new base.deck.OrbitView({ controller: base.deck.OrbitController })],\n                initialViewState: viewState,\n                layers\n            };\n            if (config && config.preStage) {\n                config.preStage(stage, deckProps);\n            }\n            requestAnimationFrame(() => this.deckgl.setProps(Object.assign(Object.assign({}, deckProps), { onAfterRender: () => {\n                    if (this._afterRenderHandler) {\n                        this._afterRenderHandler();\n                    }\n                } })));\n            delete stage.cubeData;\n            this._last = {\n                cubeCount,\n                height,\n                width,\n                stage: stage,\n                view: stage.view\n            };\n        }\n        canvasToDataURL() {\n            return new Promise((resolve, reject) => {\n                this._afterRenderHandler = () => {\n                    this._afterRenderHandler = null;\n                    const png = this.deckgl.canvas.toDataURL('image/png');\n                    resolve(png);\n                };\n            });\n        }\n        /**\n         * Home the camera to the last initial position.\n         */\n        homeCamera() {\n            const viewState = targetViewState(this._last.height, this._last.width, this._last.view);\n            viewState.transitionDuration = defaultPresenterConfig$1.transitionDurations.view;\n            viewState.transitionEasing = easing;\n            viewState.transitionInterpolator = new LinearInterpolator(viewStateProps);\n            const deckProps = {\n                effects: lightingEffects(),\n                views: this.deckgl.props.views,\n                initialViewState: viewState,\n                layers: this.deckgl.props.layers\n            };\n            this.deckgl.setProps(deckProps);\n        }\n        /**\n         * Get cube data array from the cubes layer.\n         */\n        getCubeData() {\n            return getCubes(this.deckgl.props);\n        }\n        /**\n         * Show guidelines of rendering height/width and center of OrbitView.\n         */\n        showGuides() {\n            this._showGuides = true;\n            this.getElement(PresenterElement.gl).classList.add('show-center');\n            this.rePresent(Object.assign(Object.assign({}, this._last.stage), { cubeData: this.getCubeData() }));\n        }\n        finalize() {\n            this.animationCancel();\n            if (this.deckgl)\n                this.deckgl.finalize();\n            if (this.el)\n                this.el.innerHTML = '';\n            this._last = null;\n            this.deckgl = null;\n            this.el = null;\n            this.logger = null;\n            this.queuedAnimationOptions = null;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    //pass in the SuperClass, which should be a vega.View\n    function _RendererGl(loader) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class RendererGlInternal extends base.vega.Renderer {\n            initialize(el, width, height, origin) {\n                this.height = height;\n                this.width = width;\n                // this method will invoke resize to size the canvas appropriately\n                return super.initialize(el, width, height, origin);\n            }\n            resize(width, height, origin) {\n                super.resize(width, height, origin);\n                this.origin = origin;\n                this.height = height;\n                this.width = width;\n                //rteturn this for vega\n                return this;\n            }\n            _render(scene, items) {\n                const scene3d = scene;\n                scene3d.view = this.getView();\n                this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n                //return this for vega\n                return this;\n            }\n        }\n        const instance = new RendererGlInternal(loader);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n     * This is instantiated by ViewGl.\n     */\n    const RendererGl = _RendererGl;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    let registered = false;\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n    //pass in the SuperClass, which should be a vega.View\n    function _ViewGl(runtime, config) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class ViewGlInternal extends base.vega.View {\n            constructor(runtime, config = {}) {\n                super(runtime, config);\n                this.config = config;\n                this.presenter = config.presenter;\n                config.presenterConfig = config.presenterConfig || {};\n                config.presenterConfig.redraw = () => {\n                    this._redraw = true; //use Vega View private member _redraw\n                    this.run();\n                };\n            }\n            renderer(...args) {\n                if (args && args.length) {\n                    const renderer = args[0];\n                    if (renderer === 'deck.gl' && !registered) {\n                        base.vega.renderModule('deck.gl', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                        registered = true;\n                    }\n                    return super.renderer(renderer);\n                }\n                else {\n                    return super.renderer();\n                }\n            }\n            initialize(el) {\n                if (!this.presenter) {\n                    this.presenter = new Presenter(el);\n                }\n                super.initialize(this.presenter.getElement(PresenterElement.vegaControls));\n                const renderer = this._renderer;\n                renderer.presenterConfig = this.config.presenterConfig;\n                renderer.presenter = this.presenter;\n                renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView$1);\n                return this;\n            }\n            error(e) {\n                if (this.presenter.logger) {\n                    this.presenter.logger(e);\n                }\n            }\n        }\n        const instance = new ViewGlInternal(runtime, config);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.View, with added properties for accessing a Presenter.\n     * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n     */\n    const ViewGl = _ViewGl;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var index = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        constants: constants,\n        controls: controls,\n        defaults: defaults,\n        types: types,\n        util: util$1,\n        base: base,\n        use: use$1,\n        Presenter: Presenter,\n        ViewGl: ViewGl,\n        get PresenterElement () { return PresenterElement; }\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const { defaultPresenterConfig, defaultPresenterStyle } = defaults;\n    const { desaturate } = util$1;\n    const defaultViewerOptions = {\n        colors: {\n            activeCube: 'purple',\n            defaultCube: colorToString(defaultPresenterStyle.defaultCubeColor),\n            hoveredCube: colorToString(defaultPresenterStyle.highlightColor),\n            selectedCube: 'yellow',\n            axisSelectHighlight: colorToString([128, 128, 128, 128]),\n            axisLine: '#000',\n            axisText: '#000',\n            unselectedColorMethod: (color) => {\n                const c = desaturate(color, 0.05);\n                c[3] = 171;\n                return c;\n            }\n        },\n        language: {\n            headers: {\n                chart: 'Chart',\n                details: 'Details',\n                legend: 'Legend',\n                selection: 'Select & Filter'\n            },\n            bing: 'bing',\n            newColorMap: 'remap color to filtered items',\n            oldColorMap: 'keep same colors',\n            deselect: 'deselect',\n            exclude: 'exclude',\n            isolate: 'isolate',\n            legendOther: 'other',\n            nextDetail: '>',\n            previousDetail: '<',\n            reset: 'reset',\n            colorBinCount: 'Color bin count',\n            colorReverse: 'Color reverse',\n            count: 'Count',\n            percent: 'Percent',\n            sum: 'Sum',\n            scatterPointScale: 'Point scale',\n            FacetMaxBins: 'Facet max bins',\n            FacetVMaxBins: 'Cross facet max bins',\n            XMaxBins: 'X axis max bins',\n            YMaxBins: 'Y axis max bins',\n            XGridSize: 'X grid size',\n            YGridSize: 'Y grid size',\n            InnerPaddingSize: 'Inner padding size',\n            OuterPaddingSize: 'Outer padding size',\n            treeMapMethod: 'Treemap layout',\n            facetColumns: 'Facet columns',\n            facetRows: 'Facet rows',\n            markOpacitySignal: 'Mark opacity',\n            textScaleSignal: 'Text scale',\n            xAxisTextAngleSignal: 'X axis text angle',\n            yAxisTextAngleSignal: 'Y axis text angle',\n            zGrounded: 'Z grounded',\n            zScaleProportion: 'Z scale proportion to Y',\n            selectionCount: count => `${count} items selected`\n        },\n        maxLegends: 19,\n        onError: (errors) => {\n            //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n        },\n        transitionDurations: Object.assign(Object.assign({}, defaultPresenterConfig.transitionDurations), { scope: 600 }),\n        selectionPolygonZ: -1,\n        tickSize: 10\n    };\n    function getPresenterStyle(options) {\n        var style = {\n            cssPrefix,\n            fontFamily: options.fontFamily,\n            defaultCubeColor: colorFromString(options.colors.defaultCube)\n        };\n        if (options.colors.hoveredCube) {\n            style.highlightColor = colorFromString(options.colors.hoveredCube);\n        }\n        //if (options.lightSettings) {\n        // style.lightSettings = options.lightSettings;\n        //}\n        return style;\n    }\n    const cssPrefix = 'sanddance-';\n    const dualColorSchemeColors = {\n        black: '#212121',\n        gray: '#D2D2D2',\n        blue: '#0060F0',\n        green: '#00C000',\n        orange: '#FF9900',\n        red: '#E00000'\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function isInternalFieldName(columnName, includeVegaDeckGLFields = false) {\n        if (includeVegaDeckGLFields) {\n            if (columnName === GL_ORDINAL)\n                return true;\n        }\n        for (let f in FieldNames) {\n            if (columnName === FieldNames[f])\n                return true;\n        }\n        return false;\n    }\n\n    var util = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        isInternalFieldName: isInternalFieldName,\n        getColumnsFromData: getColumnsFromData,\n        getStats: getStats,\n        inferAll: inferAll,\n        getPresenterStyle: getPresenterStyle\n    });\n\n    const dualPairs = [\n        [dualColorSchemeColors.black, dualColorSchemeColors.gray],\n        [dualColorSchemeColors.red, dualColorSchemeColors.green],\n        [dualColorSchemeColors.red, dualColorSchemeColors.blue],\n        [dualColorSchemeColors.black, dualColorSchemeColors.red],\n        [dualColorSchemeColors.black, dualColorSchemeColors.orange],\n        [dualColorSchemeColors.black, dualColorSchemeColors.green]\n    ];\n    /**\n     * Array of color schemes.\n     */\n    const colorSchemes = [\n        {\n            scheme: ColorScaleNone,\n            colors: [defaultViewerOptions.colors.defaultCube]\n        }\n    ];\n    createDualColorSchemes();\n    function registerColorSchemes(vega) {\n        colorSchemes.forEach(cs => {\n            if (cs.colors.length === 1) {\n                vega.scheme(cs.scheme, x => cs.colors[0]);\n            }\n            else {\n                vega.scheme(cs.scheme, cs.colors);\n            }\n        });\n    }\n    function createPair(names, colors) {\n        const scheme = `dual_${names[0]}${names[1]}`;\n        colorSchemes.push({ scheme, colors });\n    }\n    function createDualColorSchemes() {\n        dualPairs.forEach(colors => {\n            const names = colors.map(color => {\n                for (let key in dualColorSchemeColors)\n                    if (color === dualColorSchemeColors[key])\n                        return key;\n            });\n            createPair(names, colors);\n            createPair([...names].reverse(), [...colors].reverse());\n        });\n    }\n\n    var DataLayoutChange;\n    (function (DataLayoutChange) {\n        DataLayoutChange[DataLayoutChange[\"same\"] = 0] = \"same\";\n        DataLayoutChange[DataLayoutChange[\"reset\"] = 1] = \"reset\";\n        DataLayoutChange[DataLayoutChange[\"refine\"] = 2] = \"refine\";\n    })(DataLayoutChange || (DataLayoutChange = {}));\n    class Animator {\n        constructor(dataScope, props) {\n            this.dataScope = dataScope;\n            this.props = props;\n        }\n        select(search) {\n            return new Promise((resolve, reject) => {\n                this.dataScope.select(search);\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        deselect() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deselect();\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        filter(search, keepData, collapseData, rebase) {\n            if (rebase) {\n                this.dataScope.collapse(false, keepData);\n            }\n            this.dataScope.collapse(true, collapseData);\n            return new Promise((resolve, reject) => {\n                this.props.onAnimateDataChange(DataLayoutChange.refine, 'before refine', 'refine').then(() => {\n                    this.dataScope.deselect();\n                    this.dataScope.setFilteredData(keepData);\n                    this.props.onDataChanged(DataLayoutChange.refine, search);\n                    resolve();\n                }).catch(reject);\n            });\n        }\n        reset() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deselect();\n                this.dataScope.setFilteredData(null);\n                this.props.onAnimateDataChange(DataLayoutChange.reset, 'before reset', 'reset').then(() => {\n                    this.dataScope.collapse(false);\n                    this.props.onDataChanged(DataLayoutChange.reset);\n                    resolve();\n                }).catch(reject);\n            });\n        }\n        activate(datum) {\n            return new Promise((resolve, reject) => {\n                this.dataScope.activate(datum);\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        deactivate() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deactivate();\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n    }\n\n    function cloneAxis(axes, axisColor, axisTextColor) {\n        return axes.map(axis => {\n            const newAxis = deepMerge(axis);\n            if (newAxis.domain) {\n                newAxis.domain.color = axisColor;\n            }\n            if (newAxis.title) {\n                newAxis.title.color = axisTextColor;\n            }\n            newAxis.ticks.forEach(t => { t.color = axisColor; });\n            newAxis.tickText.forEach(t => { t.color = axisTextColor; });\n            return newAxis;\n        });\n    }\n    function cloneTextData(textData, color) {\n        return textData.map(t => {\n            return Object.assign(Object.assign({}, t), { color });\n        });\n    }\n    function recolorAxes(stage, oldColors, newColors) {\n        const hasNewLineColor = newColors.axisLine && newColors.axisLine !== oldColors.axisLine;\n        const hasNewTextColor = newColors.axisText && newColors.axisText !== oldColors.axisText;\n        let axes;\n        let textData;\n        if (hasNewLineColor || hasNewTextColor) {\n            const lineColor = colorFromString(newColors.axisLine || oldColors.axisLine);\n            const textColor = colorFromString(newColors.axisText || oldColors.axisText);\n            axes = {\n                x: cloneAxis(stage.axes.x, lineColor, textColor),\n                y: cloneAxis(stage.axes.y, lineColor, textColor),\n                z: cloneAxis(stage.axes.z, lineColor, textColor)\n            };\n        }\n        if (hasNewTextColor) {\n            textData = cloneTextData(stage.textData, colorFromString(newColors.axisText));\n        }\n        return { axes, textData };\n    }\n\n    function notNice(niceValue) {\n        //convert \"nice\" numbers to numeric value\n        return (niceValue + '').replace(/[\\s,]/g, '');\n    }\n    function tickValue(axis, i) {\n        const tick = axis.tickText[i];\n        let value;\n        if (tick) {\n            value = axis.tickText[i].value;\n        }\n        return { tick, value };\n    }\n    function selectNullOrEmpty(column) {\n        const searchExpression = {\n            name: column.name,\n            operator: 'isnullorEmpty'\n        };\n        return searchExpression;\n    }\n    function selectExact(column, value) {\n        if (value == null) {\n            return selectNullOrEmpty(column);\n        }\n        const searchExpression = {\n            name: column.name,\n            operator: '==',\n            value\n        };\n        return searchExpression;\n    }\n    function selectNone(column, values) {\n        const expressions = values.map((value, i) => {\n            const searchExpression = {\n                name: column.name,\n                operator: '!=',\n                value\n            };\n            if (i) {\n                searchExpression.clause = '&&';\n            }\n            return searchExpression;\n        });\n        const searchExpressionGroup = {\n            expressions\n        };\n        return searchExpressionGroup;\n    }\n    function selectExactAxis(axis, column, i) {\n        const result = tickValue(axis, i);\n        if (result.tick) {\n            return selectExact(column, result.value);\n        }\n    }\n    function selectBetween(column, lowValue, highValue, lowOperator = '>=', highOperator = '<') {\n        const expressions = [];\n        if (lowValue !== undefined) {\n            expressions.push({\n                name: column.name,\n                operator: lowOperator,\n                value: lowValue\n            });\n        }\n        if (highValue !== undefined) {\n            expressions.push({\n                name: column.name,\n                operator: highOperator,\n                value: highValue\n            });\n        }\n        if (expressions.length > 1) {\n            expressions[1].clause = '&&';\n        }\n        const searchExpressionGroup = {\n            expressions\n        };\n        return searchExpressionGroup;\n    }\n    function selectBetweenAxis(axis, column, i) {\n        const low = tickValue(axis, i);\n        const high = tickValue(axis, i + 1);\n        return selectBetween(column, low.value, high.value);\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const { allTruthy, concat, push } = util$1;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSearchGroupFromVegaValue(search) {\n        let group;\n        const vegaSearch = search;\n        if (Array.isArray(vegaSearch)) {\n            //flatten into one group\n            group = { expressions: [] };\n            vegaSearch.forEach(g => {\n                const clonedExpressions = clone(g.expressions).filter(Boolean);\n                clonedExpressions[0].clause = '&&';\n                push(group.expressions, clonedExpressions);\n            });\n        }\n        else {\n            group = vegaSearch ?\n                { expressions: vegaSearch.expressions.filter(Boolean) }\n                : null;\n        }\n        return group;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function axisSelectionLayer(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n        const polygons = [];\n        const xRole = specCapabilities.roles.filter(r => r.role === 'x')[0];\n        if (xRole && xRole.axisSelection) {\n            stage.axes.x.filter(axis => axis.tickText.length).forEach(axis => {\n                polygons.push.apply(polygons, axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n            });\n        }\n        const yRole = specCapabilities.roles.filter(r => r.role === 'y')[0];\n        if (yRole && yRole.axisSelection) {\n            stage.axes.y.filter(axis => axis.tickText.length).forEach(axis => {\n                polygons.push.apply(polygons, axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n            });\n        }\n        if (stage.facets && columns.facet) {\n            polygons.push.apply(polygons, facetSelectionPolygons(stage.facets));\n        }\n        //move polygons to Z\n        polygons.forEach(datum => {\n            datum.polygon.forEach(p => {\n                p[2] = polygonZ;\n            });\n        });\n        const onClick = (o, e) => clickHandler(e.srcEvent, o.object.search);\n        const polygonLayer = new base.layers.PolygonLayer({\n            autoHighlight: true,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            data: polygons,\n            extruded: false,\n            highlightColor: colorFromString(highlightColor),\n            id: 'selections',\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onAxisSelection = false;\n                }\n                else {\n                    presenter.deckgl.interactiveState.onAxisSelection = true;\n                }\n            },\n            onClick,\n            getElevation: () => 0,\n            getFillColor: () => [0, 0, 0, 0],\n            pickable: true,\n            stroked: false\n        });\n        return polygonLayer;\n    }\n    function axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n        const polygons = [];\n        const size = 50;\n        const getSearch = axisSelectionType === 'exact' ?\n            (a, c, i) => ({ expressions: [selectExactAxis(a, c, i)] })\n            :\n                selectBetweenAxis;\n        const { domain, ticks } = axis;\n        if (ticks.length > 0 && domain) {\n            const dim = vertical ? 1 : 0;\n            const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n            let divisions;\n            if (between) {\n                divisions = [];\n                for (let i = 1; i < ticks.length; i++) {\n                    divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n                }\n            }\n            else {\n                divisions = ticks.slice(1, -1).map(tick => tick.sourcePosition[dim]);\n            }\n            const add = (p2, i) => {\n                const coords = [[p1, q1], [p2, q1], [p2, q2], [p1, q2]];\n                polygons.push({\n                    search: getSearch(axis, column, i),\n                    polygon: vertical ? coords.map(xy => xy.reverse()) : coords\n                });\n                p1 = p2;\n            };\n            let p1 = domain.sourcePosition[dim];\n            const q1 = domain.sourcePosition[vertical ? 0 : 1];\n            const q2 = q1 - size;\n            divisions.forEach(add);\n            add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n        }\n        return polygons;\n    }\n    function facetSelectionPolygons(facetRects) {\n        const polygons = [];\n        const linesAndSearches = facetRects.map(({ datum, lines }, i) => {\n            let group = getSearchGroupFromVegaValue(datum[FieldNames.FacetSearch]);\n            return {\n                lines,\n                search: group\n            };\n        });\n        linesAndSearches.forEach(({ lines, search }, i) => {\n            //take any 2 lines to get a box dimension\n            const [x, y] = minMaxPoints(lines.slice(2));\n            polygons.push({\n                search,\n                polygon: [[x.min, y.min], [x.max, y.min], [x.max, y.max], [x.min, y.max]]\n            });\n        });\n        return polygons;\n    }\n    function minMaxPoints(lines) {\n        const points = [];\n        lines.forEach(line => {\n            [line.sourcePosition, line.targetPosition].forEach(point => {\n                points.push(point);\n            });\n        });\n        return [0, 1].map(dim => {\n            let minMax = { min: null, max: null };\n            points.forEach(point => {\n                if (minMax.max == null) {\n                    minMax.max = point[dim];\n                }\n                else {\n                    minMax.max = Math.max(minMax.max, point[dim]);\n                }\n                if (minMax.min == null) {\n                    minMax.min = point[dim];\n                }\n                else {\n                    minMax.min = Math.min(minMax.min, point[dim]);\n                }\n            });\n            return minMax;\n        });\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getSelectedColorMap(currentData, showSelectedData, showActive, viewerOptions) {\n        function getSelectionColorItem(datum) {\n            let item;\n            if (showSelectedData) {\n                item = datum[FieldNames.Selected] ?\n                    { color: colorFromString(viewerOptions.colors.selectedCube) }\n                    :\n                        { unSelected: true };\n            }\n            if (showActive && datum[FieldNames.Active]) {\n                item = { color: colorFromString(viewerOptions.colors.activeCube) };\n            }\n            return item;\n        }\n        const colorMap = {};\n        currentData.forEach(datum => {\n            const selectionColor = getSelectionColorItem(datum);\n            if (selectionColor) {\n                const ordinal = datum[GL_ORDINAL];\n                colorMap[ordinal] = selectionColor;\n            }\n        });\n        return colorMap;\n    }\n    function colorMapFromCubes(cubes) {\n        const map = {};\n        cubes.forEach(cube => {\n            map[cube.ordinal] = { color: cube.color };\n        });\n        return map;\n    }\n    function populateColorContext(colorContext, presenter) {\n        if (!colorContext.colorMap) {\n            const cubes = presenter.getCubeData();\n            colorContext.colorMap = colorMapFromCubes(cubes);\n        }\n        colorContext.legend = clone(presenter.stage.legend);\n        colorContext.legendElement = presenter.getElement(PresenterElement.legend).children[0];\n    }\n    function applyColorMapToCubes(maps, cubes, unselectedColorMethod) {\n        Object.keys(maps[0]).forEach(ordinal => {\n            const cube = cubes[+ordinal];\n            if (cube && !cube.isEmpty) {\n                const actualColorMappedItem = maps[0][ordinal];\n                if (maps.length > 1) {\n                    const selectedColorMappedItem = maps[1][ordinal];\n                    if (selectedColorMappedItem) {\n                        if (selectedColorMappedItem.unSelected && unselectedColorMethod) {\n                            cube.color = unselectedColorMethod(actualColorMappedItem.color);\n                        }\n                        else {\n                            cube.color = selectedColorMappedItem.color;\n                        }\n                        return;\n                    }\n                }\n                cube.color = actualColorMappedItem.color;\n            }\n        });\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    class DataScope {\n        constructor() {\n            this.filteredColumnsStats = {};\n        }\n        setData(data, columns) {\n            const differentData = this.data !== data;\n            if (differentData) {\n                if (this.data) {\n                    //clean up things we added to old data\n                    this.deselect();\n                }\n                this.data = data;\n                this.columns = columns;\n                this.filteredData = null;\n                this.filteredColumnsStats = {};\n            }\n            return differentData;\n        }\n        setFilteredData(filteredData) {\n            this.filteredData = filteredData;\n            this.filteredColumnsStats = {};\n        }\n        getColumns(columnTypes) {\n            if (!this.columns) {\n                this.columns = getColumnsFromData(base.vega.inferTypes, this.data, columnTypes);\n            }\n            return this.columns;\n        }\n        getFilteredColumnStats(columnName) {\n            if (!this.filteredColumnsStats[columnName]) {\n                this.filteredColumnsStats[columnName] = getStats(this.filteredData, this.columns.filter(c => c.name === columnName)[0]);\n            }\n            return this.filteredColumnsStats[columnName];\n        }\n        currentData() {\n            return this.filteredData || this.data;\n        }\n        select(search) {\n            this.deselect();\n            if (search) {\n                this.selection = this.createUserSelection(search, true, false);\n                if (this.selection.included.length) {\n                    this.activate(this.selection.included[0]);\n                }\n            }\n        }\n        createUserSelection(search, assign, rebase) {\n            const exec = new Exec(search, this.getColumns());\n            const s = {\n                search,\n                included: [],\n                excluded: []\n            };\n            const data = rebase ? this.data : this.currentData();\n            data.forEach(datum => {\n                if (exec.run(datum)) {\n                    if (assign) {\n                        datum[FieldNames.Selected] = true;\n                    }\n                    s.included.push(datum);\n                }\n                else {\n                    s.excluded.push(datum);\n                }\n            });\n            return s;\n        }\n        deselect() {\n            this.deactivate();\n            this.data.forEach(datum => {\n                delete datum[FieldNames.Selected];\n            });\n            this.selection = null;\n        }\n        hasFilteredData() {\n            return !!this.filteredData;\n        }\n        hasSelectedData() {\n            return !!this.selection;\n        }\n        collapse(collapsed, data = this.data) {\n            data.forEach(datum => {\n                datum[FieldNames.Collapsed] = collapsed;\n            });\n            this.isCollapsed = collapsed;\n        }\n        activate(datum) {\n            this.deactivate();\n            datum[FieldNames.Active] = true;\n            this.active = datum;\n        }\n        deactivate() {\n            if (this.active) {\n                delete this.active[FieldNames.Active];\n            }\n            this.active = null;\n        }\n        ordinalIndexWithinSelection(ordinal) {\n            if (this.selection) {\n                for (let i = 0; i < this.selection.included.length; i++) {\n                    let datum = this.selection.included[i];\n                    if (datum[GL_ORDINAL] === ordinal) {\n                        return { datum, index: i };\n                    }\n                }\n            }\n            return { datum: null, index: -1 };\n        }\n        finalize() {\n            this.data = null;\n            this.filteredData = null;\n            this.filteredColumnsStats = null;\n            if (this.selection) {\n                this.selection.excluded = null;\n                this.selection.included = null;\n                this.selection = null;\n            }\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    var Action;\n    (function (Action) {\n        Action[Action[\"deselect\"] = 0] = \"deselect\";\n        Action[Action[\"isolate\"] = 1] = \"isolate\";\n        Action[Action[\"exclude\"] = 2] = \"exclude\";\n        Action[Action[\"reset\"] = 3] = \"reset\";\n        Action[Action[\"next\"] = 4] = \"next\";\n        Action[Action[\"previous\"] = 5] = \"previous\";\n    })(Action || (Action = {}));\n    class Details {\n        constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n            this.language = language;\n            this.animator = animator;\n            this.dataScope = dataScope;\n            this.colorMapHandler = colorMapHandler;\n            this.hasColorMaps = hasColorMaps;\n            this.element = addDiv(parentElement, `${cssPrefix}unitControls`);\n            this.clear();\n        }\n        finalize() {\n            if (this.element)\n                this.element.innerHTML = '';\n            this.dataScope = null;\n            this.element = null;\n        }\n        clear() {\n            this.state = {\n                userSelection: null,\n                index: -1,\n                remapColor: false\n            };\n            this.render();\n        }\n        clearSelection() {\n            this.state.userSelection = null;\n            this.state.index = -1;\n            this.render();\n        }\n        populate(userSelection, index = 0) {\n            this.state.userSelection = userSelection;\n            this.state.index = index;\n            this.render();\n        }\n        selectByNameValue(columnName, value) {\n            const search = {\n                name: columnName,\n                operator: '==',\n                value\n            };\n            this.clearSelection();\n            this.animator.select(search);\n            this.populate(this.dataScope.selection);\n        }\n        remapChanged(remap) {\n            this.state.remapColor = remap;\n            this.colorMapHandler(remap);\n            this.render();\n        }\n        handleAction(action) {\n            let p;\n            const u = this.state.userSelection;\n            switch (action) {\n                case Action.deselect: {\n                    this.clearSelection();\n                    p = this.animator.deselect();\n                    break;\n                }\n                case Action.exclude: {\n                    this.clearSelection();\n                    p = this.animator.filter(invert(u.search), u.excluded, u.included, false);\n                    this.state.remapColor = false;\n                    break;\n                }\n                case Action.isolate: {\n                    this.clearSelection();\n                    p = this.animator.filter(u.search, u.included, u.excluded, false);\n                    this.state.remapColor = false;\n                    break;\n                }\n                case Action.reset: {\n                    this.clear();\n                    p = this.animator.reset();\n                    break;\n                }\n                default: {\n                    switch (action) {\n                        case Action.previous: {\n                            this.state.index--;\n                            if (this.state.index < 0) {\n                                this.state.index = this.state.userSelection.included.length - 1;\n                            }\n                            break;\n                        }\n                        case Action.next: {\n                            this.state.index++;\n                            if (this.state.index >= this.state.userSelection.included.length) {\n                                this.state.index = 0;\n                            }\n                            break;\n                        }\n                    }\n                    this.render();\n                    p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n                }\n            }\n            p.then(() => this.render());\n        }\n        render() {\n            const hasRefinedData = this.dataScope.hasFilteredData();\n            const renderProps = {\n                language: this.language,\n                actionHandler: action => this.handleAction(action),\n                selectionHandler: (columnName, value) => this.selectByNameValue(columnName, value),\n                count: this.state.userSelection && this.state.userSelection.included.length,\n                hasRefinedData,\n                item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n                remapColorHandler: remap => this.remapChanged(remap),\n                hasColorMaps: this.hasColorMaps() && hasRefinedData,\n                remapColor: this.state.remapColor\n            };\n            const a = getActiveElementInfo();\n            mount(renderDetails(renderProps), this.element);\n            setActiveElement(a);\n        }\n    }\n    const renderDetails = (props) => {\n        const controlButtons = [\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.deselect) }, props.language.deselect),\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.isolate) }, props.language.isolate),\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.exclude) }, props.language.exclude)\n        ];\n        const colorMapping = (createElement(\"div\", null,\n            createElement(\"button\", { disabled: props.remapColor, onClick: e => props.remapColorHandler(true) }, props.language.newColorMap),\n            createElement(\"button\", { disabled: !props.remapColor, onClick: e => props.remapColorHandler(false) }, props.language.oldColorMap)));\n        const singleItem = props.count === 1;\n        const scrollButtons = [\n            createElement(\"button\", { disabled: singleItem, onClick: e => props.actionHandler(Action.previous) }, props.language.previousDetail),\n            createElement(\"button\", { disabled: singleItem, onClick: e => props.actionHandler(Action.next) }, props.language.nextDetail),\n            createElement(\"span\", null,\n                \" \",\n                props.language.selectionCount(props.count))\n        ];\n        const rows = [];\n        for (let prop in props.item) {\n            if (prop === GL_ORDINAL) {\n                continue;\n            }\n            if (isInternalFieldName(prop)) {\n                continue;\n            }\n            rows.push({\n                cells: [\n                    { content: prop }, { content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler) }\n                ]\n            });\n        }\n        return (createElement(\"div\", null,\n            props.hasColorMaps && colorMapping,\n            createElement(\"h4\", null, props.language.headers.selection),\n            createElement(\"div\", { className: `${cssPrefix}selection` },\n                controlButtons,\n                createElement(\"button\", { disabled: !props.hasRefinedData, onClick: e => props.actionHandler(Action.reset) }, \"reset\")),\n            props.item && createElement(\"h4\", null, props.language.headers.details),\n            createElement(\"div\", null,\n                createElement(\"div\", { className: `${cssPrefix}details-scroll` }, props.item && scrollButtons),\n                createElement(\"div\", { className: `${cssPrefix}details` }, props.item && createElement(Table$1, { rows: rows })))));\n    };\n    function linkSelect(language, columnName, value, selectionHandler) {\n        return (createElement(\"span\", null,\n            createElement(\"a\", { href: \"#\", onClick: e => selectionHandler(columnName, value) }, value),\n            isNaN(value) ? [' ', createElement(\"a\", { className: \"bing-search\", href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`, target: \"_blank\" }, language.bing)] : ''));\n    }\n\n    function ensureHeaders(presenter, headers) {\n        const vegaControls = presenter.getElement(PresenterElement.vegaControls);\n        conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n        const legend = presenter.getElement(PresenterElement.legend);\n        conditionalHeader(!!legend.children.length, legend, headers.legend);\n    }\n    function conditionalHeader(condition, element, header) {\n        var existing = existingHeader(element, header);\n        if (condition && !existing) {\n            addHeader(element, header);\n        }\n        if (!condition && existing) {\n            existing.remove();\n        }\n    }\n    function addHeader(element, header) {\n        const h = document.createElement('h4');\n        h.innerHTML = header;\n        element.insertAdjacentElement('beforebegin', h);\n    }\n    function existingHeader(element, header) {\n        const { previousElementSibling } = element;\n        if (previousElementSibling && previousElementSibling.innerHTML === header) {\n            return previousElementSibling;\n        }\n    }\n\n    function legendRange(colorBinType, column, legend, clickedIndex) {\n        if (column.quantitative) {\n            return selectQuantitative(colorBinType, column, legend, clickedIndex);\n        }\n        else {\n            return selectCategorical(column, legend, clickedIndex);\n        }\n    }\n    function selectCategorical(column, legend, clickedIndex) {\n        const value = legend.rows[clickedIndex].value;\n        if (value === Other) {\n            const values = [];\n            for (let i in legend.rows) {\n                if (+i !== clickedIndex) {\n                    values.push(legend.rows[i].value);\n                }\n            }\n            return selectNone(column, values);\n        }\n        else {\n            //select equal\n            return { expressions: [selectExact(column, legend.rows[clickedIndex].value)] };\n        }\n    }\n    function selectQuantitative(colorBinType, column, legend, clickedIndex) {\n        const keys = Object.keys(legend.rows).map(key => +key).sort((a, b) => +a - +b);\n        let lowValue;\n        let lowOperator;\n        let highValue;\n        let highOperator;\n        const rowText = legend.rows[clickedIndex].label;\n        switch (colorBinType) {\n            case 'continuous': {\n                lowValue = rowText;\n                if (clickedIndex < keys.length - 1) {\n                    highValue = legend.rows[clickedIndex + 1].value;\n                }\n                break;\n            }\n            default: {\n                if (rowText.indexOf('null') > 0) {\n                    const ex = {\n                        expressions: [selectNullOrEmpty(column)]\n                    };\n                    return ex;\n                }\n                const dash = rowText.indexOf('–'); //this is not the common dash character!\n                if (dash > 0) {\n                    //bug in Vega for quantize?\n                    //lowOperator = '>';\n                    //highOperator = '<=';\n                    lowValue = rowText.substr(0, dash);\n                    highValue = rowText.substr(dash + 1);\n                }\n                else {\n                    if (rowText.indexOf('<') >= 0) {\n                        highValue = rowText.substring(2);\n                    }\n                    else {\n                        if (rowText.indexOf('≥') >= 0) {\n                            lowValue = rowText.substring(2);\n                        }\n                    }\n                }\n            }\n        }\n        if (lowValue)\n            lowValue = notNice(lowValue);\n        if (highValue)\n            highValue = notNice(highValue);\n        if (lowValue === highValue) {\n            return { expressions: [selectExact(column, lowValue)] };\n        }\n        else {\n            return selectBetween(column, lowValue, highValue, lowOperator, highOperator);\n        }\n    }\n    function finalizeLegend(colorBinType, colorColumn, legend, language) {\n        const rowTexts = [];\n        for (let i in legend.rows) {\n            let row = legend.rows[i];\n            row.search = legendRange(colorBinType, colorColumn, legend, +i);\n            if (row.value === Other) {\n                row.label = language.legendOther;\n            }\n            else {\n                rowTexts.push(row.value);\n            }\n        }\n    }\n\n    function assignOrdinals(columns, data, ordinalMap) {\n        const uCol = columns.uid && columns.uid.name;\n        if (ordinalMap) {\n            data.forEach((d, i) => {\n                const key = uCol ? d[uCol] : i;\n                d[GL_ORDINAL] = ordinalMap[key];\n            });\n        }\n        else {\n            ordinalMap = {};\n            data.forEach((d, i) => {\n                d[GL_ORDINAL] = i;\n                const uColValue = uCol ? d[uCol] : i;\n                ordinalMap[uColValue] = i;\n            });\n        }\n        return ordinalMap;\n    }\n    function getDataIndexOfCube(cube, data) {\n        const len = data.length;\n        for (let i = 0; i < len; i++) {\n            if (data[i][GL_ORDINAL] === cube.ordinal) {\n                return i;\n            }\n        }\n    }\n\n    function applySignalValues(sv, b) {\n        if (!sv || !b || !b.signals || !b.signals.length)\n            return;\n        for (let key in sv) {\n            let value = sv[key];\n            let signalB = b.signals.filter(signal => signal.name === key)[0];\n            if (signalB && signalB.bind) {\n                signalB.value = value;\n            }\n        }\n    }\n    function extractSignalValuesFromView(view, spec) {\n        if (!view || !spec || !spec.signals || !spec.signals.length)\n            return;\n        const result = {};\n        spec.signals.forEach((signalA) => {\n            //bound to a UI control\n            if (signalA.bind) {\n                try {\n                    result[signalA.name] = view.signal(signalA.name);\n                }\n                catch (e) {\n                    // continue regardless of error\n                }\n            }\n        });\n        return result;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const { outerSize } = util$1;\n    const { Table } = controls;\n    class Tooltip {\n        constructor(props) {\n            const renderProps = {\n                cssPrefix: props.cssPrefix,\n                rows: getRows(props.item, props.options)\n            };\n            this.element = renderTooltip(renderProps);\n            if (this.element) {\n                this.element.style.position = 'absolute';\n                this.child = this.element.firstChild;\n                document.body.appendChild(this.element);\n                //measure and move as necessary\n                let m = outerSize(this.child);\n                while (m.height > document.documentElement.clientHeight) {\n                    let tr = this.child.querySelector('tr:last-child');\n                    if (tr) {\n                        tr.parentElement.removeChild(tr);\n                    }\n                    else {\n                        break;\n                    }\n                    m = outerSize(this.child);\n                }\n                if (props.position.clientX + m.width >= document.documentElement.clientWidth) {\n                    this.child.style.right = '0';\n                }\n                let moveTop = true;\n                if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n                    if (props.position.clientY - m.height > 0) {\n                        this.child.style.bottom = '0';\n                    }\n                    else {\n                        moveTop = false;\n                    }\n                }\n                if (moveTop) {\n                    this.element.style.top = `${props.position.clientY}px`;\n                }\n                this.element.style.left = `${props.position.clientX}px`;\n            }\n        }\n        finalize() {\n            if (this.element) {\n                document.body.removeChild(this.element);\n            }\n            this.element = null;\n        }\n    }\n    function getRows(item, options) {\n        const rows = [];\n        for (let columnName in item) {\n            if (columnName === GL_ORDINAL) {\n                continue;\n            }\n            if (isInternalFieldName(columnName)) {\n                continue;\n            }\n            if (options && options.exclude) {\n                if (options.exclude(columnName)) {\n                    continue;\n                }\n            }\n            let value = item[columnName];\n            let content;\n            if (options && options.displayValue) {\n                content = options.displayValue(value);\n            }\n            else {\n                switch (value) {\n                    case null:\n                        content = createElement(\"i\", null, \"null\");\n                        break;\n                    case undefined:\n                        content = createElement(\"i\", null, \"undefined\");\n                        break;\n                    default:\n                        content = value.toString();\n                }\n            }\n            rows.push({\n                cells: [\n                    { content: columnName + ':' },\n                    { content }\n                ]\n            });\n        }\n        return rows;\n    }\n    const renderTooltip = (props) => {\n        return props.rows.length === 0 ? null : (createElement(\"div\", { className: `${props.cssPrefix}tooltip` }, Table({ rows: props.rows })));\n    };\n\n    class CharacterSet {\n        resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n            if (forceNewCharacterSet || needsNewCharacterSet(oldInsight, newInsight)) {\n                this.chars = undefined;\n            }\n        }\n        getCharacterSet(stage) {\n            if (!this.chars) {\n                const map = {};\n                const addText = (text) => {\n                    Array.from(text).forEach(char => { map[char] = true; });\n                };\n                stage.textData.forEach(t => addText(t.text));\n                const { x, y, z } = stage.axes;\n                [x, y, z].forEach(axes => {\n                    axes.forEach(axis => {\n                        if (axis.tickText)\n                            axis.tickText.forEach(t => addText(t.text));\n                        if (axis.title)\n                            addText(axis.title.text);\n                    });\n                });\n                this.chars = Object.keys(map);\n            }\n            return this.chars;\n        }\n    }\n    function needsNewCharacterSet(oldInsight, newInsight) {\n        if (!oldInsight)\n            return true;\n        if (!newInsight)\n            return true;\n        if (oldInsight.chart !== newInsight.chart)\n            return true;\n        if (oldInsight.facetStyle !== newInsight.facetStyle)\n            return true;\n        if (oldInsight.totalStyle !== newInsight.totalStyle)\n            return true;\n        if (oldInsight.hideAxes !== newInsight.hideAxes)\n            return true;\n        if (oldInsight.view !== newInsight.view)\n            return true;\n        if (differentObjectValues(oldInsight.signalValues, newInsight.signalValues))\n            return true;\n        if (differentObjectValues(oldInsight.size, newInsight.size))\n            return true;\n        const oldColumns = oldInsight.columns;\n        const newColumns = newInsight.columns;\n        if (oldColumns.facet !== newColumns.facet)\n            return true;\n        if (oldColumns.facetV !== newColumns.facetV)\n            return true;\n        if (oldColumns.x !== newColumns.x)\n            return true;\n        if (oldColumns.y !== newColumns.y)\n            return true;\n        if (oldColumns.z !== newColumns.z)\n            return true;\n        return false;\n    }\n    function differentObjectValues(a, b) {\n        if (!a && !b)\n            return false;\n        if (!a || !b)\n            return true;\n        const keys = Object.keys(b);\n        for (let i = 0; i < keys.length; i++) {\n            let key = keys[i];\n            let ta = typeof a;\n            let tb = typeof b;\n            if (ta !== tb)\n                return true;\n            if (ta === 'object') {\n                return differentObjectValues(a[key], b[key]);\n            }\n            else {\n                if (a[key] !== b[key])\n                    return true;\n            }\n        }\n        return false;\n    }\n\n    var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    const { defaultView } = defaults;\n    const zAxisZindex = 1010;\n    let didRegisterColorSchemes = false;\n    /**\n     * Component to view a SandDance data visualization.\n     */\n    class Viewer {\n        /**\n         * Instantiate a new Viewer.\n         * @param element Parent HTMLElement to present within.\n         * @param options Optional viewer options object.\n         */\n        constructor(element, options) {\n            this.element = element;\n            this.options = deepMerge(defaultViewerOptions, options);\n            this.presenter = new Presenter(element, getPresenterStyle(this.options));\n            this._characterSet = new CharacterSet();\n            this._dataScope = new DataScope();\n            this._animator = new Animator(this._dataScope, {\n                onDataChanged: this.onDataChanged.bind(this),\n                onAnimateDataChange: this.onAnimateDataChange.bind(this)\n            });\n            this._details = new Details(this.presenter.getElement(PresenterElement.panel), this.options.language, this._animator, this._dataScope, remap => {\n                this.currentColorContext = ~~remap;\n                this.renderSameLayout();\n            }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n            this.insight = {};\n        }\n        changeColorContexts(colorContexts) {\n            this.colorContexts = colorContexts;\n            this.currentColorContext = 0;\n            this.options.onColorContextChange && this.options.onColorContextChange();\n        }\n        applyLegendColorContext(colorContext) {\n            const a = getActiveElementInfo();\n            mount(colorContext.legendElement, this.presenter.getElement(PresenterElement.legend));\n            setActiveElement(a);\n            this.presenter.stage.legend = colorContext.legend;\n        }\n        onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n            return new Promise((resolve, reject) => {\n                let innerPromise;\n                if (dataChange === DataLayoutChange.refine) {\n                    const oldColorContext = this.colorContexts[this.currentColorContext];\n                    innerPromise = new Promise(innerResolve => {\n                        this.renderNewLayout({}, {\n                            preStage: (stage, deckProps) => {\n                                finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                                this.overrideAxisLabels(stage);\n                                applyColorMapToCubes([oldColorContext.colorMap], getCubes(deckProps));\n                                if (this.options.onStage) {\n                                    this.options.onStage(stage, deckProps);\n                                }\n                            }\n                        }).then(() => {\n                            //apply old legend\n                            this.applyLegendColorContext(oldColorContext);\n                            innerResolve();\n                        });\n                    });\n                }\n                else {\n                    innerPromise = this.renderNewLayout({}, {\n                        preStage: (stage, deckProps) => {\n                            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                            this.overrideAxisLabels(stage);\n                            if (this.options.onStage) {\n                                this.options.onStage(stage, deckProps);\n                            }\n                        }\n                    });\n                }\n                innerPromise.then(() => {\n                    this.presenter.animationQueue(resolve, this.options.transitionDurations.position, { waitingLabel, handlerLabel, animationCanceled: reject });\n                });\n            });\n        }\n        onDataChanged(dataLayout, filter) {\n            return __awaiter(this, void 0, void 0, function* () {\n                switch (dataLayout) {\n                    case DataLayoutChange.same: {\n                        this.renderSameLayout();\n                        break;\n                    }\n                    case DataLayoutChange.refine: {\n                        //save cube colors\n                        const oldColorContext = this.colorContexts[this.currentColorContext];\n                        let colorMap;\n                        yield this.renderNewLayout({}, {\n                            preStage: (stage, deckProps) => {\n                                //save off the spec colors\n                                colorMap = colorMapFromCubes(stage.cubeData);\n                                applyColorMapToCubes([oldColorContext.colorMap], getCubes(deckProps));\n                                this.preStage(stage, deckProps);\n                            },\n                            onPresent: () => {\n                                //save new legend\n                                const newColorContext = {\n                                    colorMap,\n                                    legend: clone(this.presenter.stage.legend),\n                                    legendElement: this.presenter.getElement(PresenterElement.legend).children[0]\n                                };\n                                //apply old legend\n                                this.applyLegendColorContext(oldColorContext);\n                                this.changeColorContexts([oldColorContext, newColorContext]);\n                            }\n                        });\n                        //narrow the filter only if it is different\n                        if (!compare(this.insight.filter, filter)) {\n                            this.insight.filter = narrow(this.insight.filter, filter);\n                        }\n                        if (this.options.onDataFilter) {\n                            this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                        }\n                        break;\n                    }\n                    case DataLayoutChange.reset: {\n                        const colorContext = {\n                            colorMap: null,\n                            legend: null,\n                            legendElement: null\n                        };\n                        this.changeColorContexts([colorContext]);\n                        yield this.renderNewLayout({}, {\n                            onPresent: () => {\n                                populateColorContext(colorContext, this.presenter);\n                            }\n                        });\n                        delete this.insight.filter;\n                        if (this.options.onDataFilter) {\n                            this.options.onDataFilter(null, null);\n                        }\n                        break;\n                    }\n                }\n                if (this.options.onSelectionChanged) {\n                    const sel = this.getSelection();\n                    this.options.onSelectionChanged((sel && sel.search) || null, 0, (sel && sel.selectedData) || null);\n                }\n            });\n        }\n        getSpecColumnsWithFilteredStats() {\n            if (!this._dataScope.hasFilteredData()) {\n                return this._specColumns;\n            }\n            const roles = ['color', 'facet', 'group', 'size', 'sort', 'sum', 'x', 'y', 'z'];\n            const specColumns = Object.assign({}, this._specColumns);\n            roles.forEach(r => {\n                if (specColumns[r]) {\n                    const column = Object.assign({}, specColumns[r]);\n                    column.stats = this.getColumnStats(column);\n                    specColumns[r] = column;\n                }\n            });\n            return specColumns;\n        }\n        renderNewLayout(signalValues, presenterConfig, view) {\n            return __awaiter(this, void 0, void 0, function* () {\n                const currData = this._dataScope.currentData();\n                const context = {\n                    specColumns: this.getSpecColumnsWithFilteredStats(),\n                    insight: this.insight,\n                    specViewOptions: Object.assign(Object.assign({}, this.options), { zAxisOptions: {\n                            showZAxis: true,\n                            zIndex: zAxisZindex\n                        } })\n                };\n                const specResult = build(context, currData);\n                if (!specResult.errors) {\n                    const uiValues = extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n                    applySignalValues(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n                    this.vegaSpec = specResult.vegaSpec;\n                    this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n                    this.specCapabilities = specResult.specCapabilities;\n                    const config = this.createConfig(presenterConfig);\n                    if (view) {\n                        config.getView = () => view;\n                    }\n                    if (!didRegisterColorSchemes) {\n                        registerColorSchemes(base.vega);\n                        didRegisterColorSchemes = true;\n                    }\n                    try {\n                        if (this.vegaViewGl) {\n                            this.vegaViewGl.finalize();\n                        }\n                        const runtime = base.vega.parse(this.vegaSpec);\n                        this.vegaViewGl = new ViewGl(runtime, config)\n                            .renderer('deck.gl')\n                            .initialize(this.element);\n                        yield this.vegaViewGl.runAsync();\n                        const handler = (n, v) => {\n                            this._characterSet.resetCharacterSet(true);\n                        };\n                        this.vegaSpec.signals.forEach(s => {\n                            this.vegaViewGl.addSignalListener(s.name, handler);\n                        });\n                        //capture new color color contexts via signals\n                        this.configForSignalCapture(config.presenterConfig);\n                    }\n                    catch (e) {\n                        specResult.errors = [e.message];\n                    }\n                    if (!specResult.errors) {\n                        ensureHeaders(this.presenter, this.options.language.headers);\n                    }\n                }\n                if (specResult.errors) {\n                    if (this.options.onError) {\n                        this.options.onError(specResult.errors);\n                    }\n                    else if (this.presenter.logger) {\n                        this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n                    }\n                }\n                return specResult;\n            });\n        }\n        /**\n         * Render the same layout with new options.\n         * @param newViewerOptions New options object.\n         */\n        renderSameLayout(newViewerOptions) {\n            const colorContext = this.colorContexts[this.currentColorContext];\n            const clonedCubes = this.presenter.getCubeData().map(cube => {\n                return Object.assign({}, cube);\n            });\n            this.applyLegendColorContext(colorContext);\n            let { axes, textData } = this.presenter.stage;\n            let recoloredAxes;\n            if (newViewerOptions) {\n                if (newViewerOptions.colors) {\n                    recoloredAxes = recolorAxes(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n                    this._lastColorOptions = clone(newViewerOptions.colors);\n                    axes = recoloredAxes.axes || axes;\n                    textData = recoloredAxes.textData || textData;\n                }\n                this.options = deepMerge(this.options, newViewerOptions);\n            }\n            let colorMaps = [colorContext.colorMap];\n            let colorMethod;\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            const hasActive = !!this._dataScope.active;\n            if (hasSelectedData || hasActive) {\n                const selectedColorMap = getSelectedColorMap(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                colorMaps.push(selectedColorMap);\n                colorMethod = this.options.colors.unselectedColorMethod;\n            }\n            applyColorMapToCubes(colorMaps, clonedCubes, colorMethod);\n            const stage = { cubeData: clonedCubes, axes, textData };\n            this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n        }\n        getView(view) {\n            if (view === undefined) {\n                if (this.presenter.view === null) {\n                    return defaultView;\n                }\n                else {\n                    return this.presenter.view;\n                }\n            }\n            else {\n                return view;\n            }\n        }\n        transformData(values, transform) {\n            try {\n                const runtime = base.vega.parse({\n                    $schema: 'https://vega.github.io/schema/vega/v4.json',\n                    data: [{\n                            name: 'source',\n                            values,\n                            transform\n                        }]\n                });\n                new ViewGl(runtime).run();\n            }\n            catch (e) {\n                // continue regardless of error\n            }\n            return values;\n        }\n        /**\n         * Render data into a visualization.\n         * @param insight Object to create a visualization specification.\n         * @param data Array of data objects.\n         * @param view Optional View to specify camera type.\n         * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n         */\n        render(insight, data, options = {}) {\n            return __awaiter(this, void 0, void 0, function* () {\n                let result;\n                //see if refine expression has changed\n                if (!compare(insight.filter, this.insight.filter)) {\n                    const allowAsyncRenderTime = 100;\n                    if (insight.filter) {\n                        //refining\n                        result = yield this._render(insight, data, options, true);\n                        this.presenter.animationQueue(() => {\n                            this.filter(insight.filter, options.rebaseFilter && options.rebaseFilter());\n                        }, allowAsyncRenderTime, { waitingLabel: 'layout before refine', handlerLabel: 'refine after layout' });\n                    }\n                    else {\n                        //not refining\n                        this._dataScope.setFilteredData(null);\n                        result = yield this._render(insight, data, options, true);\n                        this.presenter.animationQueue(() => {\n                            this.reset();\n                        }, allowAsyncRenderTime, { waitingLabel: 'layout before reset', handlerLabel: 'reset after layout' });\n                    }\n                }\n                else {\n                    result = yield this._render(insight, data, options, false);\n                }\n                return result;\n            });\n        }\n        shouldViewstateTransition(newInsight, oldInsight) {\n            if (!oldInsight.columns)\n                return false;\n            if (oldInsight.chart !== newInsight.chart)\n                return true;\n            if (oldInsight.size.height !== newInsight.size.height)\n                return true;\n            if (oldInsight.size.width !== newInsight.size.width)\n                return true;\n            if (oldInsight.columns.facet !== newInsight.columns.facet)\n                return true;\n            return false;\n        }\n        configForSignalCapture(presenterConfig) {\n            const colorContext = {\n                colorMap: null,\n                legend: null,\n                legendElement: null\n            };\n            //now be ready to capture color changing signals \n            presenterConfig.preStage = (stage, deckProps) => {\n                if (this._shouldSaveColorContext()) {\n                    //save off the colors from Vega layout\n                    colorContext.colorMap = colorMapFromCubes(stage.cubeData);\n                }\n                this.preStage(stage, deckProps);\n            };\n            presenterConfig.onPresent = () => {\n                if (this._shouldSaveColorContext()) {\n                    populateColorContext(colorContext, this.presenter);\n                    this.changeColorContexts([colorContext]);\n                    this._dataScope.deselect();\n                }\n            };\n        }\n        _render(insight, data, options, forceNewCharacterSet) {\n            return __awaiter(this, void 0, void 0, function* () {\n                if (this._tooltip) {\n                    this._tooltip.finalize();\n                    this._tooltip = null;\n                }\n                if (this._dataScope.setData(data, options.columns)) {\n                    //apply transform to the data\n                    this.transformData(data, insight.transform);\n                }\n                this._specColumns = getSpecColumns(insight, this._dataScope.getColumns(options.columnTypes));\n                const ordinalMap = assignOrdinals(this._specColumns, data, options.ordinalMap);\n                this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n                this.insight = clone(insight);\n                this._lastColorOptions = clone(this.options.colors);\n                this._shouldSaveColorContext = () => !options.initialColorContext;\n                const colorContext = options.initialColorContext || {\n                    colorMap: null,\n                    legend: null,\n                    legendElement: null\n                };\n                const specResult = yield this.renderNewLayout(insight.signalValues, {\n                    preStage: (stage, deckProps) => {\n                        if (this._shouldSaveColorContext()) {\n                            //save off the colors from Vega layout\n                            colorContext.colorMap = colorMapFromCubes(stage.cubeData);\n                        }\n                        else {\n                            //apply passed colorContext\n                            applyColorMapToCubes([colorContext.colorMap], getCubes(deckProps));\n                        }\n                        //if items are selected, repaint\n                        const hasSelectedData = !!this._dataScope.hasSelectedData();\n                        const hasActive = !!this._dataScope.active;\n                        if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n                            const selectedColorMap = getSelectedColorMap(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                            applyColorMapToCubes([colorContext.colorMap, selectedColorMap], stage.cubeData, this.options.colors.unselectedColorMethod);\n                        }\n                        this.preStage(stage, deckProps);\n                    },\n                    onPresent: () => {\n                        if (this._shouldSaveColorContext()) {\n                            populateColorContext(colorContext, this.presenter);\n                            this.changeColorContexts([colorContext]);\n                        }\n                        else {\n                            //apply passed colorContext\n                            this.applyLegendColorContext(colorContext);\n                        }\n                    },\n                    shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight)\n                }, this.getView(insight.view));\n                //future signal changes should save the color context\n                this._shouldSaveColorContext = () => !options.discardColorContextUpdates || !options.discardColorContextUpdates();\n                this._details.render();\n                const result = { ordinalMap, specResult };\n                return result;\n            });\n        }\n        overrideAxisLabels(stage) {\n            // if (this._specColumns.x && this._specColumns.x.type === 'date') {\n            //     stage.axes.x.forEach(axis => makeDateRange(\n            //         axis.tickText,\n            //         this.getColumnStats(this._specColumns.x)\n            //     ));\n            // }\n            // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n            //     stage.axes.y.forEach(axis => makeDateRange(\n            //         axis.tickText,\n            //         this.getColumnStats(this._specColumns.y)\n            //     ));\n            // }\n        }\n        preStage(stage, deckProps) {\n            const onClick = (e, search) => {\n                if (this.options.onAxisClick) {\n                    this.options.onAxisClick(e, search);\n                }\n                else {\n                    this.select(search);\n                }\n            };\n            this.overrideAxisLabels(stage);\n            const polygonLayer = axisSelectionLayer(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n            const order = 1; //after textlayer but before others\n            deckProps.layers.splice(order, 0, polygonLayer);\n            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            if (this.options.onStage) {\n                this.options.onStage(stage, deckProps);\n            }\n        }\n        onCubeClick(e, cube) {\n            this.options.onCubeClick && this.options.onCubeClick(e, cube);\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n                //if active is within selection, keep the selection and activate the one.\n                const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n                if (indexWithinSelection.index >= 0) {\n                    this.activate(indexWithinSelection.datum);\n                    this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                    if (this.options.onSelectionChanged) {\n                        const sel = this.getSelection();\n                        this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                    }\n                    return;\n                }\n            }\n            if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][GL_ORDINAL] === cube.ordinal) {\n                this.deselect();\n                return;\n            }\n            const search = {\n                name: GL_ORDINAL,\n                operator: '==',\n                value: cube.ordinal\n            };\n            this.select(search);\n        }\n        onCubeHover(e, cube) {\n            if (this._tooltip) {\n                this._tooltip.finalize();\n                this._tooltip = null;\n            }\n            if (!cube) {\n                return;\n            }\n            const currentData = this._dataScope.currentData();\n            const index = getDataIndexOfCube(cube, currentData);\n            if (index >= 0) {\n                this._tooltip = new Tooltip({\n                    options: this.options.tooltipOptions,\n                    item: currentData[index],\n                    position: e,\n                    cssPrefix: this.presenter.style.cssPrefix\n                });\n            }\n        }\n        onTextHover(e, t) {\n            //return true if highlight color is different\n            if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor)\n                return false;\n            return !colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n        }\n        createConfig(c) {\n            const { getTextColor, getTextHighlightColor, getTextHighlightAlphaCutoff, onTextClick } = this.options;\n            const defaultPresenterConfig = {\n                zAxisZindex,\n                getCharacterSet: stage => this._characterSet.getCharacterSet(stage),\n                getTextColor,\n                getTextHighlightColor,\n                getTextHighlightAlphaCutoff,\n                onTextClick: (e, t) => {\n                    if (t.metaData && t.metaData.search) {\n                        const search = getSearchGroupFromVegaValue(t.metaData.search);\n                        if (this.options.onAxisClick) {\n                            this.options.onAxisClick(e, search);\n                        }\n                        else {\n                            this.select(search);\n                        }\n                    }\n                    if (onTextClick) {\n                        onTextClick(e, t);\n                    }\n                },\n                onCubeClick: this.onCubeClick.bind(this),\n                onCubeHover: this.onCubeHover.bind(this),\n                onTextHover: this.onTextHover.bind(this),\n                preStage: this.preStage.bind(this),\n                onPresent: this.options.onPresent,\n                onLayerClick: (info, e) => {\n                    if (!info || !info.object) {\n                        this.deselect();\n                    }\n                },\n                onLegendClick: (e, legend, clickedIndex) => {\n                    const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n                    if (legendRow) {\n                        if (this.options.onLegendRowClick) {\n                            this.options.onLegendRowClick(e, legendRow);\n                        }\n                        else {\n                            this.select(legendRow.search);\n                        }\n                    }\n                    else if (this.options.onLegendHeaderClick) {\n                        //header clicked\n                        this.options.onLegendHeaderClick(e);\n                    }\n                },\n                onSceneRectAssignCubeOrdinal: datum => {\n                    //TODO see if datum is a facet selection rect\n                    return datum[GL_ORDINAL];\n                },\n                onTargetViewState: (h, w) => {\n                    const { height, width } = this.insight.size;\n                    let newViewStateTarget;\n                    if (this.options.onNewViewStateTarget) {\n                        newViewStateTarget = this.options.onNewViewStateTarget();\n                    }\n                    return { height, width, newViewStateTarget };\n                },\n                preserveDrawingBuffer: this.options.preserveDrawingBuffer\n            };\n            if (this.options.onBeforeCreateLayers) {\n                defaultPresenterConfig.preLayer = stage => {\n                    this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n                };\n            }\n            const config = {\n                presenter: this.presenter,\n                presenterConfig: Object.assign(defaultPresenterConfig, c)\n            };\n            if (this.options.transitionDurations) {\n                config.presenterConfig.transitionDurations = this.options.transitionDurations;\n            }\n            return config;\n        }\n        /**\n         * Filter the data and animate.\n         * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n         * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n         */\n        filter(search, rebase = false) {\n            const u = this._dataScope.createUserSelection(search, false, rebase);\n            return new Promise((resolve, reject) => {\n                this._animator.filter(search, u.included, u.excluded, rebase).then(() => {\n                    this._details.clear();\n                    this._details.clearSelection();\n                    this._details.populate(this._dataScope.selection);\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Remove any filtration and animate.\n         */\n        reset() {\n            return new Promise((resolve, reject) => {\n                this._animator.reset().then(() => {\n                    this._details.clear();\n                    this._details.clearSelection();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Select cubes by a filter expression.\n         * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n         */\n        select(search) {\n            return new Promise((resolve, reject) => {\n                this._animator.select(search).then(() => {\n                    this._details.populate(this._dataScope.selection);\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Removes any selection.\n         */\n        deselect() {\n            return new Promise((resolve, reject) => {\n                this._animator.deselect().then(() => {\n                    this._details.clearSelection();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Gets the current selection.\n         */\n        getSelection() {\n            if (!this._dataScope)\n                return null;\n            const selectionState = {\n                search: (this._dataScope.selection && this._dataScope.selection.search) || null,\n                selectedData: (this._dataScope.selection && this._dataScope.selection.included) || null,\n                active: this._dataScope.active\n            };\n            return selectionState;\n        }\n        /**\n         * Set one data row to the active state.\n         */\n        activate(datum) {\n            return new Promise((resolve, reject) => {\n                this._animator.activate(datum).then(() => {\n                    this._details.render();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Deactivate item.\n         */\n        deActivate() {\n            return new Promise((resolve, reject) => {\n                if (this._dataScope && this._dataScope.active) {\n                    this._animator.deactivate().then(() => {\n                        this._details.render();\n                        resolve();\n                    });\n                }\n                else {\n                    resolve();\n                }\n            });\n        }\n        /**\n         * Gets the current insight with signal values.\n         */\n        getInsight() {\n            const insight = Object.assign({}, this.insight);\n            insight.signalValues = this.getSignalValues();\n            return insight;\n        }\n        /**\n         * Gets column stats from current data (filtered or all).\n         * @param column Column to get stats for.\n         */\n        getColumnStats(column) {\n            return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n        }\n        /**\n         * Gets current signal values.\n         */\n        getSignalValues() {\n            return extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n        }\n        finalize() {\n            if (this._dataScope)\n                this._dataScope.finalize();\n            if (this._details)\n                this._details.finalize();\n            if (this._tooltip)\n                this._tooltip.finalize();\n            if (this.vegaViewGl)\n                this.vegaViewGl.finalize();\n            if (this.presenter)\n                this.presenter.finalize();\n            if (this.element)\n                this.element.innerHTML = '';\n            this.colorContexts = null;\n            this.element = null;\n            this.options = null;\n            this.presenter = null;\n            this.vegaSpec = null;\n            this.vegaViewGl = null;\n            this._animator = null;\n            this._dataScope = null;\n            this._details = null;\n            this._tooltip = null;\n        }\n    }\n    /**\n     * Default Viewer options.\n     */\n    Viewer.defaultViewerOptions = defaultViewerOptions;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const version = '3.2.1';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const use = use$1;\n\n    exports.VegaDeckGl = index;\n    exports.Viewer = Viewer;\n    exports.colorSchemes = colorSchemes;\n    exports.constants = constants$1;\n    exports.searchExpression = index$1;\n    exports.specs = index$2;\n    exports.types = types$1;\n    exports.use = use;\n    exports.util = util;\n    exports.version = version;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n"
  },
  {
    "path": "docs/dist/sanddance/v4/sanddance.css",
    "content": ".sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%;\n}\n\n.sanddance-gl {\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%);\n}\n.sanddance-gl canvas {\n  outline: none;\n}\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em;\n}\n\n.sanddance-legend table {\n  border-collapse: collapse;\n}\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em;\n}\n.sanddance-legend .legend-row {\n  cursor: pointer;\n}\n.sanddance-legend .legend-row td {\n  padding: 2px;\n}\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef;\n}\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px;\n}\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n.sanddance-details {\n  font-size: smaller;\n}\n\n.sanddance-details-scroll {\n  padding-bottom: 1em;\n}\n\n.sanddance-tooltip {\n  z-index: 1;\n}\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute;\n}\n.sanddance-tooltip td {\n  max-width: 16em;\n  overflow: hidden;\n  text-align: left;\n  text-overflow: ellipsis;\n  vertical-align: top;\n  width: 75%;\n}\n.sanddance-tooltip td:first-child {\n  width: 25%;\n}\n\n/*# sourceMappingURL=sanddance.css.map */\n"
  },
  {
    "path": "docs/dist/sanddance/v4/sanddance.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.SandDance = {}));\n})(this, (function (exports) { 'use strict';\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const FieldNames = {\n        Active: '__SandDance__Active',\n        Collapsed: '__SandDance__Collapsed',\n        Contains: '__SandDance__Contains',\n        Count: '__SandDance__Count',\n        Sum: '__SandDance__Sum',\n        SumOfCount: '__SandDance__CountSum',\n        SumOfSum: '__SandDance__SumSum',\n        Selected: '__SandDance__Selected',\n        First: '__SandDance__First',\n        Last: '__SandDance__Last',\n        Top: '__SandDance__Top',\n        TopColor: '__SandDance__TopColor',\n        TopIndex: '__SandDance__TopIndex',\n        PowerBISelectionId: '__SandDance__PowerBISelectionId',\n        FacetSearch: '__SandDance__FacetSearch',\n        FacetTitle: '__SandDance__FacetTitle',\n        Ordinal: '__SandDance__Ordinal',\n        WrapCol: '__SandDance__WrapCol',\n        WrapRow: '__SandDance__WrapRow',\n        Value: '__SandDance__Value',\n        OffsetX: '__SandDance__X',\n        OffsetY: '__SandDance__Y',\n        OffsetHeight: '__SandDance__H',\n        OffsetWidth: '__SandDance__W',\n    };\n    const ScaleNames = {\n        Color: 'scale_color',\n        X: 'scale_x',\n        Y: 'scale_y',\n        Z: 'scale_z',\n    };\n    //Signal names\n    const SignalNames = {\n        ViewportWidth: 'ViewportWidth',\n        ViewportHeight: 'ViewportHeight',\n        MinCellWidth: 'MinCellWidth',\n        MinCellHeight: 'MinCellHeight',\n        PlotOffsetLeft: 'PlotOffsetLeft',\n        PlotOffsetTop: 'PlotOffsetTop',\n        PlotOffsetBottom: 'PlotOffsetBottom',\n        PlotOffsetRight: 'PlotOffsetRight',\n        PlotHeightIn: 'PlotHeightIn',\n        PlotWidthIn: 'PlotWidthIn',\n        PlotHeightOut: 'PlotHeightOut',\n        PlotWidthOut: 'PlotWidthOut',\n        ColorBinCount: 'RoleColor_BinCountSignal',\n        ColorReverse: 'RoleColor_ReverseSignal',\n        FacetAxesAdjustX: 'RoleFacet_AxesAdjustSignalX',\n        FacetAxesAdjustY: 'RoleFacet_AxesAdjustSignalY',\n        FacetBins: 'RoleFacet_BinsSignal',\n        FacetVBins: 'RoleFacetV_BinsSignal',\n        FacetPaddingTop: 'FacetPaddingTop',\n        FacetPaddingBottom: 'FacetPaddingBottom',\n        FacetPaddingLeft: 'FacetPaddingLeft',\n        MarkOpacity: 'Mark_OpacitySignal',\n        PointScale: 'Chart_PointScaleSignal',\n        TextAngleX: 'Text_AngleXSignal',\n        TextAngleY: 'Text_AngleYSignal',\n        TextScale: 'Text_ScaleSignal',\n        TextSize: 'Text_SizeSignal',\n        TextTitleSize: 'Text_TitleSizeSignal',\n        TreeMapMethod: 'Chart_TreeMapMethodSignal',\n        XBins: 'RoleX_BinsSignal',\n        YBins: 'RoleY_BinsSignal',\n        ZHeight: 'RoleZ_HeightSignal',\n        ZGrounded: 'RoleZ_Grounded',\n        ZProportion: 'RoleZ_ProportionSignal',\n    };\n    //These are special formulaic data values\n    const Other = '__Other';\n    //name of the \"no-color\" palette\n    const ColorScaleNone = 'none';\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //TODO move these to options\n    const defaultBins = 10;\n    const maxbins = 100;\n    const minBarBandWidth = 15;\n    const minFacetWidth = 140;\n    const minFacetHeight = 180;\n    const facetPaddingLeft = 40;\n    const facetPaddingTop = 40;\n    const facetPaddingBottom = 40;\n    const facetPaddingRight = 40;\n    const axesLabelLimit = 100;\n    const axesTitleLimit = 100;\n    const axesTitlePaddingX = 30;\n    const axesTitlePaddingY = 60;\n    const axesTitlePaddingFacetX = 69;\n    const axesTitlePaddingFacetY = 92;\n    const axesOffsetX = 120;\n    const axesOffsetY = 120;\n    const scatterSizedDiv = 20;\n    const debounce = 250;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function allowNoneForSize(specContext) {\n        switch (specContext.insight.totalStyle) {\n            case 'sum-strip':\n            case 'sum-strip-percent':\n            case 'sum-treemap':\n                return false;\n            default:\n                //if totalStyle is blank, count is assumed\n                return true;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function barchartH (specContext) {\n        var _a, _b, _c, _d;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { language } = specViewOptions;\n        const showAxes = !insight.hideAxes;\n        const bandProps = {\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n        };\n        const x = { title: null };\n        const axisScales = {\n            x,\n            y: { title: (_a = specColumns.y) === null || _a === void 0 ? void 0 : _a.name },\n            z: { title: (_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.name },\n        };\n        const layouts = [{\n                layoutType: 'Band',\n                props: bandProps,\n            }];\n        const { totalStyle, view } = insight;\n        if (totalStyle === 'sum-strip-percent') {\n            x.aggregate = 'percent';\n            x.title = language.percent;\n            const stripProps = {\n                addPercentageScale: true,\n                sortOrder: 'ascending',\n                orientation: 'horizontal',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps,\n            });\n        }\n        else {\n            const aggProps = {\n                niceScale: true,\n                dock: 'left',\n                globalAggregateMaxExtentSignal: 'aggMaxExtent',\n                globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n                sumBy: specColumns.size,\n                showAxes,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props: aggProps,\n            });\n            switch (totalStyle) {\n                case 'sum-treemap': {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const treemapProps = {\n                        corner: 'top-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps,\n                    });\n                    break;\n                }\n                case 'sum-strip': {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                case 'count-strip': {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                default: {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'down-right',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps,\n                    });\n                    break;\n                }\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                percentage: true,\n                roles: [\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_c = specColumns.y) === null || _c === void 0 ? void 0 : _c.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_d = specColumns.z) === null || _d === void 0 ? void 0 : _d.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function barchartV (specContext) {\n        var _a, _b;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { language } = specViewOptions;\n        const showAxes = !insight.hideAxes;\n        const bandProps = {\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n        };\n        const y = { title: null };\n        const axisScales = {\n            x: { title: specColumns.x && specColumns.x.name },\n            y,\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [{\n                layoutType: 'Band',\n                props: bandProps,\n            }];\n        const { totalStyle, view } = insight;\n        if (totalStyle === 'sum-strip-percent') {\n            y.aggregate = 'percent';\n            y.title = language.percent;\n            const stripProps = {\n                addPercentageScale: true,\n                sortOrder: 'descending',\n                orientation: 'vertical',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps,\n            });\n        }\n        else {\n            const aggProps = {\n                niceScale: true,\n                dock: 'bottom',\n                globalAggregateMaxExtentSignal: 'aggMaxExtent',\n                globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n                sumBy: specColumns.size,\n                showAxes,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props: aggProps,\n            });\n            switch (totalStyle) {\n                case 'sum-treemap': {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const treemapProps = {\n                        corner: 'bottom-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps,\n                    });\n                    break;\n                }\n                case 'sum-strip': {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                case 'count-strip': {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                default: {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'right-up',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps,\n                    });\n                    break;\n                }\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                percentage: true,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function density (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const axisScales = {\n            x: { title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name },\n            y: { title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name },\n            z: { title: (_c = specColumns.z) === null || _c === void 0 ? void 0 : _c.name },\n        };\n        const backgroundImage = ((_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.quantitative) && ((_f = insight.backgroundImage) === null || _f === void 0 ? void 0 : _f.extents) && insight.backgroundImage;\n        const showAxes = !(backgroundImage || insight.hideAxes);\n        const hBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom },\n        };\n        const vBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left },\n        };\n        const aggProps = {\n            onBuild: null,\n            aggregation: null,\n            sumBy: specColumns.size,\n        };\n        const layouts = [\n            {\n                layoutType: 'Band',\n                props: vBandProps,\n            },\n            {\n                layoutType: 'Band',\n                props: hBandProps,\n            },\n            {\n                layoutType: 'AggregateSquare',\n                props: aggProps,\n            },\n        ];\n        const { totalStyle, view } = insight;\n        switch (totalStyle) {\n            case 'sum-treemap': {\n                aggProps.aggregation = 'sum';\n                const treemapProps = {\n                    corner: 'bottom-left',\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Treemap',\n                    props: treemapProps,\n                });\n                break;\n            }\n            case 'sum-strip': {\n                aggProps.aggregation = 'sum';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            case 'count-strip': {\n                aggProps.aggregation = 'count';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            default: {\n                aggProps.aggregation = 'count';\n                const squareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: 'right-down',\n                    z: specColumns.z,\n                    maxGroupedUnits: null,\n                    maxGroupedFillSize: null,\n                    showAxes,\n                    view,\n                };\n                aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled) => {\n                    squareProps.maxGroupedUnits = aggMaxExtent;\n                    squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n                };\n                layouts.push({\n                    layoutType: 'Square',\n                    props: squareProps,\n                });\n                break;\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: true,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function grid (specContext) {\n        var _a;\n        const { insight, specColumns } = specContext;\n        const { view } = insight;\n        const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: 'right-down',\n            z: specColumns.z,\n            collapseYHeight: true,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        return {\n            axisScales,\n            layouts: [\n                {\n                    layoutType: 'Square',\n                    props: squareProps,\n                },\n            ],\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function scatterplot (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const backgroundImageExtents = ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative) && ((_c = insight.backgroundImage) === null || _c === void 0 ? void 0 : _c.extents);\n        const scatterProps = {\n            x: specColumns.x,\n            y: specColumns.y,\n            z: specColumns.z,\n            size: specColumns.size,\n            scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n            zGrounded: specViewOptions.language.zGrounded,\n            backgroundImageExtents,\n            showAxes: !(backgroundImageExtents || insight.hideAxes),\n            view: insight.view,\n        };\n        const axisScales = {\n            x: { title: (_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.name },\n            y: { title: (_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.name },\n            z: { title: (_f = specColumns.z) === null || _f === void 0 ? void 0 : _f.name },\n        };\n        return {\n            axisScales,\n            layouts: [\n                {\n                    layoutType: 'Scatter',\n                    props: scatterProps,\n                },\n            ],\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'x',\n                        axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                    },\n                    {\n                        role: 'y',\n                        axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? 'range' : 'exact',\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: false,\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        excludeCategoric: true,\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n                signals: [SignalNames.PointScale, SignalNames.ZGrounded],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function stacks (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const axisScales = {\n            x: { title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name },\n            y: { title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name },\n            z: { title: specViewOptions.language.count },\n        };\n        const backgroundImage = ((_c = specColumns.x) === null || _c === void 0 ? void 0 : _c.quantitative) && ((_d = specColumns.y) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = insight.backgroundImage) === null || _e === void 0 ? void 0 : _e.extents) && insight.backgroundImage;\n        const showAxes = !(backgroundImage || insight.hideAxes);\n        const hBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom },\n        };\n        const vBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left },\n        };\n        const stackProps = {\n            sort: specColumns.sort,\n            showAxes,\n        };\n        return {\n            axisScales,\n            customZScale: true,\n            layouts: [\n                {\n                    layoutType: 'Band',\n                    props: vBandProps,\n                },\n                {\n                    layoutType: 'Band',\n                    props: hBandProps,\n                },\n                {\n                    layoutType: 'Stack',\n                    props: stackProps,\n                },\n            ],\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_f = specColumns.x) === null || _f === void 0 ? void 0 : _f.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_g = specColumns.y) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function strips (specContext) {\n        var _a;\n        const { insight, specColumns } = specContext;\n        const { view } = insight;\n        const stripProps = {\n            sortOrder: 'ascending',\n            orientation: 'vertical',\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [];\n        if (specColumns.facet) {\n            axisScales.y = {\n                title: null,\n                aggregate: specColumns.size ? 'sum' : 'count',\n            };\n            const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n            const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n            const props = {\n                dock: 'top',\n                niceScale: false,\n                globalAggregateMaxExtentScaledSignal,\n                globalAggregateMaxExtentSignal,\n                sumBy: specColumns.size,\n                showAxes: false,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props,\n            });\n        }\n        layouts.push({\n            layoutType: 'Strip',\n            props: stripProps,\n        });\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'size',\n                        allowNone: true, //size by none is a count\n                        excludeCategoric: true,\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function treemap (specContext) {\n        var _a;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { view } = insight;\n        const treemapProps = {\n            corner: 'top-left',\n            group: specColumns.group,\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [];\n        if (specColumns.facet) {\n            axisScales.y = {\n                title: null,\n                aggregate: 'sum',\n            };\n            const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n            const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n            const props = {\n                dock: 'top',\n                niceScale: false,\n                globalAggregateMaxExtentScaledSignal,\n                globalAggregateMaxExtentSignal,\n                sumBy: specColumns.size,\n                showAxes: false,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props,\n            });\n        }\n        layouts.push({\n            layoutType: 'Treemap',\n            props: treemapProps,\n        });\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'size',\n                        excludeCategoric: true,\n                    },\n                    {\n                        role: 'group',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n                signals: [SignalNames.TreeMapMethod],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n        let layoutPair;\n        const groupby = facetColumn;\n        const plotPadding = {\n            x: 0,\n            y: 0,\n        };\n        let facetPadding;\n        switch (facetStyle) {\n            case 'cross': {\n                const props = {\n                    axisTextColor,\n                    colRowTitles: true,\n                    groupbyX: groupby,\n                    groupbyY: facetVColumn,\n                };\n                layoutPair = {\n                    layoutType: 'Cross',\n                    props,\n                };\n                facetPadding = {\n                    bottom: facetPaddingBottom,\n                    left: facetPaddingLeft,\n                    top: 0,\n                };\n                plotPadding.y = facetPaddingTop;\n                plotPadding.x = facetPaddingRight;\n                break;\n            }\n            case 'wrap':\n            default: {\n                const props = {\n                    axisTextColor,\n                    cellTitles: true,\n                    groupby,\n                };\n                layoutPair = {\n                    layoutType: 'Wrap',\n                    props,\n                };\n                facetPadding =\n                    {\n                        bottom: facetPaddingBottom,\n                        left: facetPaddingLeft,\n                        top: facetPaddingTop,\n                    };\n                break;\n            }\n        }\n        const facetLayout = {\n            facetPadding,\n            plotPadding,\n        };\n        return {\n            layoutPair,\n            facetLayout,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const map$1 = {\n        barchart: barchartV,\n        barchartH,\n        barchartV,\n        density,\n        grid,\n        scatterplot,\n        stacks,\n        strips,\n        treemap,\n    };\n    function getSpecBuilderPropsForChart(specContext) {\n        const { insight, specColumns, specViewOptions } = specContext;\n        const fn = map$1[insight.chart];\n        if (fn) {\n            const props = fn(specContext);\n            if (insight.columns.facet) {\n                const discreteFacetColumn = {\n                    column: specColumns.facet,\n                    defaultBins,\n                    maxbins,\n                    maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                    maxbinsSignalName: SignalNames.FacetBins,\n                };\n                const discreteFacetVColumn = {\n                    column: specColumns.facetV,\n                    defaultBins,\n                    maxbins,\n                    maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                    maxbinsSignalName: SignalNames.FacetVBins,\n                };\n                const { facetLayout, layoutPair } = getFacetLayout(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n                props.layouts.unshift(layoutPair);\n                props.facetLayout = facetLayout;\n                props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n            }\n            return props;\n        }\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color$1() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n        reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n        reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n        reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n        reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n        reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color$1, color, {\n      copy(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHex8: color_formatHex8,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHex8() {\n      return this.rgb().formatHex8();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color$1)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb$1(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb$1, extend(Color$1, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb() {\n        return this;\n      },\n      clamp() {\n        return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n      },\n      displayable() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatHex8: rgb_formatHex8,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n    }\n\n    function rgb_formatHex8() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n    }\n\n    function rgb_formatRgb() {\n      const a = clampa(this.opacity);\n      return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n    }\n\n    function clampa(opacity) {\n      return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n    }\n\n    function clampi(value) {\n      return Math.max(0, Math.min(255, Math.round(value) || 0));\n    }\n\n    function hex(value) {\n      value = clampi(value);\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color$1)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color$1, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      clamp() {\n        return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n      },\n      displayable() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl() {\n        const a = clampa(this.opacity);\n        return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n      }\n    }));\n\n    function clamph(value) {\n      value = (value || 0) % 360;\n      return value < 0 ? value + 360 : value;\n    }\n\n    function clampt(value) {\n      return Math.max(0, Math.min(1, value || 0));\n    }\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function isColor(cssColorSpecifier) {\n        return !!color(cssColorSpecifier);\n    }\n    function checkIsColorData(data, column) {\n        if (!column.stats.hasColorData) {\n            column.isColorData = false;\n            return;\n        }\n        for (let i = 0; i < data.length; i++) {\n            if (!isColor(data[i][column.name])) {\n                column.isColorData = false;\n                return;\n            }\n        }\n        column.isColorData = true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function isQuantitative(column) {\n        return column.type === 'number' || column.type === 'integer';\n    }\n    function detectNegative(columnName, data) {\n        for (let i = 1; i < data.length; i++) {\n            const value = columnName == null ? data[i] : data[i][columnName];\n            if (value < 0)\n                return true;\n        }\n        return false;\n    }\n    function detectSequentialColumn(columnName, data) {\n        if (data.length < 2)\n            return false;\n        for (let i = 1; i < data.length; i++) {\n            const curr = columnName == null ? data[i] : data[i][columnName];\n            const prev = columnName == null ? data[i - 1] : data[i - 1][columnName];\n            if (curr !== prev + 1)\n                return false;\n        }\n        return true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getStats(data, ...args) {\n        let columnName;\n        let columnType;\n        let columnQuantitative;\n        let distinctValuesCallback;\n        if (args.length <= 2) {\n            const column = args[0];\n            columnName = column.name;\n            columnType = column.type;\n            columnQuantitative = column.quantitative;\n            distinctValuesCallback = args[1];\n        }\n        else {\n            columnName = args[0];\n            columnType = args[1];\n            columnQuantitative = args[2];\n            distinctValuesCallback = args[3];\n        }\n        const distinctMap = {};\n        const stats = {\n            nonNull: 0,\n            distinctValueCount: null,\n            max: null,\n            mean: null,\n            min: null,\n        };\n        const columnIsString = columnType === 'string';\n        let sum = 0;\n        for (let i = 0; i < data.length; i++) {\n            const row = data[i];\n            const value = columnName == null ? row : row[columnName];\n            if (columnIsString) {\n                if (value !== '') {\n                    stats.nonNull++;\n                }\n            }\n            else if (value != null) {\n                stats.nonNull++;\n            }\n            const num = +value;\n            distinctMap[value] = true;\n            if (!isNaN(num)) {\n                if (stats.max === null || num > stats.max) {\n                    stats.max = num;\n                }\n                if (stats.min === null || num < stats.min) {\n                    stats.min = num;\n                }\n                sum += num;\n            }\n            // hex codes, ex. #003300, are parsed as dates\n            if ((columnType === 'date' || columnIsString) && !stats.hasColorData && isColor(value)) {\n                stats.hasColorData = true;\n            }\n        }\n        if (columnQuantitative) {\n            stats.mean = data.length > 0 && (sum / data.length);\n            stats.hasNegative = detectNegative(columnName, data);\n            if (columnType === 'integer') {\n                stats.isSequential = detectSequentialColumn(columnName, data);\n            }\n        }\n        const distinctValues = Object.keys(distinctMap);\n        if (distinctValuesCallback) {\n            distinctValues.sort();\n            distinctValuesCallback(distinctValues);\n        }\n        stats.distinctValueCount = distinctValues.length;\n        return stats;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Derive column metadata from the data array.\n     * @param data Array of data objects.\n     */\n    function getColumnsFromData(inferTypesFn, data, columnTypes) {\n        const sample = data[0];\n        const fields = sample ? Object.keys(sample) : [];\n        const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n        const columns = fields.map(name => {\n            const column = {\n                name,\n                type: inferences[name],\n            };\n            return column;\n        });\n        inferAll(columns, data);\n        return columns;\n    }\n    /**\n     * Populate columns with type inferences and stats.\n     * @param columns Array of columns.\n     * @param data Array of data objects.\n     */\n    function inferAll(columns, data) {\n        columns.forEach(column => {\n            if (column) {\n                if (typeof column.quantitative !== 'boolean') {\n                    column.quantitative = isQuantitative(column);\n                }\n                if (!column.stats) {\n                    column.stats = getStats(data, column);\n                }\n                // hex codes, ex. #003300, are parsed as dates\n                if ((column.type === 'date' || column.type === 'string') && typeof column.isColorData !== 'boolean') {\n                    checkIsColorData(data, column);\n                }\n            }\n        });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    let Table$2 = class Table {\n        constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = 'right') {\n            this.columns = columns;\n            this.rows = rows;\n            this.maxWidth = maxWidth;\n            this.underlineHeaders = underlineHeaders;\n            this.align = align;\n            // Calculate maximum width for each column\n            this.columnWidths = this.columns.map((col, idx) => Math.max(col.length, ...this.rows.map(row => { var _a; return ((_a = row[idx]) === null || _a === void 0 ? void 0 : _a.length) || 0; })));\n        }\n        createSpaces(num) {\n            return ' '.repeat(num);\n        }\n        groupColumns() {\n            let cumulativeWidth = 0;\n            const columnGroups = [];\n            let currentGroup = [];\n            this.columns.forEach((col, idx) => {\n                const columnSpace = this.columnWidths[idx] + 1; // account for one space between columns\n                if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n                    columnGroups.push(currentGroup);\n                    cumulativeWidth = columnSpace;\n                    currentGroup = [col];\n                }\n                else {\n                    cumulativeWidth += columnSpace;\n                    currentGroup.push(col);\n                }\n            });\n            if (currentGroup.length > 0) {\n                columnGroups.push(currentGroup);\n            }\n            return columnGroups;\n        }\n        formatRow(row, group) {\n            return group.map(col => {\n                const idx = this.columns.indexOf(col);\n                const cellValue = row[idx] == null ? '' : row[idx].toString();\n                return this.align === 'right'\n                    ? cellValue.padStart(this.columnWidths[idx], ' ')\n                    : cellValue.padEnd(this.columnWidths[idx], ' ');\n            }).join(this.createSpaces(1));\n        }\n        formatHeader(group) {\n            return group.map(col => {\n                const idx = this.columns.indexOf(col);\n                return this.align === 'right'\n                    ? col.padStart(this.columnWidths[idx], ' ')\n                    : col.padEnd(this.columnWidths[idx], ' ');\n            }).join(this.createSpaces(1));\n        }\n        underlineHeader(group) {\n            return group.map(col => '-'.repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n        }\n        render() {\n            const output = [];\n            const columnGroups = this.groupColumns();\n            columnGroups.forEach((group, groupIndex) => {\n                const headerRow = this.formatHeader(group);\n                let section = headerRow + (groupIndex < columnGroups.length - 1 ? ' \\\\' : '') + '\\n';\n                if (this.underlineHeaders) {\n                    section += this.underlineHeader(group) + '\\n';\n                }\n                this.rows.forEach((row) => {\n                    section += this.formatRow(row, group) + '\\n';\n                });\n                output.push(section);\n                if (groupIndex < columnGroups.length - 1) {\n                    output.push('\\n');\n                }\n            });\n            return output.join('');\n        }\n    };\n    var pandasSimulation;\n    (function (pandasSimulation) {\n        // Mapping TypeScript types to Python-like dtypes\n        const typeMapping = {\n            boolean: 'bool',\n            number: 'float64', // Assuming 'number' is used for floating-point numbers\n            date: 'datetime64[ns]',\n            string: 'object',\n            integer: 'int64',\n        };\n        function head(columns, data, maxWidth = 80) {\n            const numRows = 5; // Number of rows as in `head(5)` from pandas\n            const top = data.slice(0, numRows); // Get the top `numRows` rows\n            // Create a \"fake\" row number column\n            const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n            // Extract column names and rows for the table\n            const columnNames = [''].concat(columns.map(col => col.name));\n            const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map(col => { var _a; return ((_a = row[col.name]) === null || _a === void 0 ? void 0 : _a.toString()) || ''; })));\n            // Create and render the table with right alignment\n            const table = new Table$2(columnNames, rows, maxWidth, false, 'right'); // Right alignment\n            return table.render();\n        }\n        pandasSimulation.head = head;\n        function info(columns, data, maxWidth = 80) {\n            const numRows = data.length;\n            const output = [];\n            // Summary header\n            output.push('<class \\'pandas.core.frame.DataFrame\\'>');\n            output.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n            output.push(`Data columns (total ${columns.length} columns):\\n`);\n            // Column headers and details\n            const columnHeaders = ['#', 'Column', 'Non-Null Count', 'Dtype'];\n            const rows = columns.map((col, idx) => {\n                const nonNullCount = col.stats.nonNull.toString();\n                const dtype = typeMapping[col.type] || 'unknown';\n                return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n            });\n            // Create and render the table with left alignment and header underline\n            const table = new Table$2(columnHeaders, rows, maxWidth, true, 'left'); // Left alignment\n            output.push(table.render());\n            // Memory usage estimation\n            const memoryUsage = columns.reduce((total, col) => {\n                var _a;\n                const exampleValue = (_a = data.find(row => row[col.name] != null)) === null || _a === void 0 ? void 0 : _a[col.name];\n                if (exampleValue == null)\n                    return total;\n                const size = new Blob([exampleValue.toString()]).size;\n                return total + (size * numRows);\n            }, 0);\n            output.push(`\\ndtypes: ${columns.filter(col => col.type === 'number').length} float64, ` +\n                `${columns.filter(col => col.type === 'integer').length} int64, ` +\n                `${columns.filter(col => col.type === 'string').length} object`);\n            output.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n            return output.join('\\n');\n        }\n        pandasSimulation.info = info;\n    })(pandasSimulation || (pandasSimulation = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Get columns associated with each Insight role.\n     * @param insight Insight to specify column roles.\n     * @param columns Array of Columns inferred from the data.\n     */\n    function getSpecColumns(insight, columns) {\n        function getColumnByName(name) {\n            return columns.filter(c => c.name === name)[0];\n        }\n        return {\n            color: getColumnByName(insight.columns && insight.columns.color),\n            facet: getColumnByName(insight.columns && insight.columns.facet),\n            facetV: getColumnByName(insight.columns && insight.columns.facetV),\n            group: getColumnByName(insight.columns && insight.columns.group),\n            size: getColumnByName(insight.columns && insight.columns.size),\n            sort: getColumnByName(insight.columns && insight.columns.sort),\n            uid: getColumnByName(insight.columns && insight.columns.uid),\n            x: getColumnByName(insight.columns && insight.columns.x),\n            y: getColumnByName(insight.columns && insight.columns.y),\n            z: getColumnByName(insight.columns && insight.columns.z),\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addAxes(scope, ...axes) {\n        if (!axes || !axes.length)\n            return;\n        if (!scope.axes)\n            scope.axes = [];\n        scope.axes.push(...axes.filter(Boolean));\n    }\n    function addData(scope, ...datas) {\n        if (!datas || !datas.length)\n            return;\n        if (!scope.data)\n            scope.data = [];\n        scope.data.push(...datas.filter(Boolean));\n    }\n    function addMarks(scope, ...marks) {\n        if (!marks || !marks.length)\n            return;\n        if (!scope.marks)\n            scope.marks = [];\n        scope.marks.push(...marks.filter(Boolean));\n    }\n    function addScales(scope, ...scales) {\n        if (!scales || !scales.length)\n            return;\n        if (!scope.scales)\n            scope.scales = [];\n        scope.scales.push(...scales.filter(Boolean));\n    }\n    function addSignals(scope, ...signals) {\n        if (!signals || !signals.length)\n            return;\n        if (!scope.signals)\n            scope.signals = [];\n        scope.signals.push(...signals.filter(Boolean));\n    }\n    function addTransforms(data, ...transforms) {\n        if (!transforms || !transforms.length)\n            return;\n        if (!data.transform)\n            data.transform = [];\n        data.transform.push(...transforms.filter(Boolean));\n    }\n    function getDataByName(data, dataName) {\n        for (let i = 0; i < data.length; i++) {\n            if (data[i].name === dataName)\n                return { data: data[i], index: i };\n        }\n    }\n    function getGroupBy(groupings) {\n        const groupby = groupings.map(g => g.groupby);\n        return groupby.reduce((acc, val) => acc.concat(val), []);\n    }\n    function addOffsets(...offsets) {\n        return offsets.filter(Boolean).join(' + ');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addGlobalAxes(props) {\n        const { axesOffsets, axisScales, axesScopes, axesTitlePadding, allGlobalScales, globalScope, labelBaseline, plotOffsetSignals, specColumns, specViewOptions } = props;\n        const { scope } = globalScope;\n        allGlobalScales.forEach(globalScales => {\n            const { scales } = globalScales;\n            for (const xyz in scales) {\n                const _scales = scales[xyz];\n                if (_scales) {\n                    addScales(scope, ..._scales);\n                    let { showAxes } = globalScales;\n                    let zindex = undefined;\n                    if (xyz === 'z') {\n                        showAxes = false;\n                        if (props.view === '3d' && specViewOptions.zAxisOptions && !props.hideZAxis) {\n                            if (specViewOptions.zAxisOptions.showZAxis) {\n                                showAxes = true;\n                                zindex = specViewOptions.zAxisOptions.zIndex;\n                            }\n                        }\n                    }\n                    if (showAxes && axisScales) {\n                        const axisScale = axisScales[xyz];\n                        if (axisScale) {\n                            const lineColor = specViewOptions.colors.axisLine;\n                            const horizontal = xyz === 'x';\n                            const column = specColumns[xyz] || { quantitative: true };\n                            const title = axisScale.title;\n                            const props = {\n                                title,\n                                horizontal,\n                                column,\n                                specViewOptions,\n                                lineColor,\n                                titlePadding: axesTitlePadding[xyz],\n                                labelBaseline: labelBaseline[xyz],\n                                zindex,\n                            };\n                            axesScopes['main'].forEach(a => addAxes(a.scope, createAxis(Object.assign(Object.assign({}, props), { scale: a.scale || _scales[0], showTitle: a.title, showLabels: a.labels, showLines: a.lines }))));\n                            if (axesScopes[xyz]) {\n                                axesScopes[xyz].forEach(a => addAxes(a.scope, createAxis(Object.assign(Object.assign({}, props), { scale: a.scale || _scales[0], showTitle: a.title, showLabels: a.labels, showLines: a.lines }))));\n                            }\n                            if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                                const plotOffsetSignal = plotOffsetSignals[xyz];\n                                plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                            }\n                        }\n                    }\n                }\n            }\n        });\n    }\n    function createAxis(props) {\n        const { column, horizontal, labelBaseline, lineColor, scale, showLabels, showTitle, showLines, specViewOptions, title, titlePadding, zindex } = props;\n        const axis = Object.assign(Object.assign(Object.assign(Object.assign({ zindex, scale: scale.name, orient: horizontal ? 'bottom' : 'left', domain: showLines, ticks: showLines }, showLines && {\n            domainColor: lineColor,\n            tickColor: lineColor,\n            tickSize: specViewOptions.tickSize,\n        }), showTitle && {\n            title,\n            titleAlign: horizontal ? 'left' : 'right',\n            titleAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY,\n            },\n            titleColor: specViewOptions.colors.axisText,\n            titleFontSize: {\n                signal: SignalNames.TextTitleSize,\n            },\n            titleLimit: axesTitleLimit,\n            titlePadding,\n        }), { labels: showLabels }), showLabels && {\n            labelAlign: horizontal ? 'left' : 'right',\n            labelBaseline,\n            labelAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY,\n            },\n            labelColor: specViewOptions.colors.axisText,\n            labelFontSize: {\n                signal: SignalNames.TextSize,\n            },\n            labelLimit: axesLabelLimit,\n        });\n        if (column.quantitative) {\n            axis.format = '~r';\n        }\n        return axis;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Make sure that the field name is accessible via Vega's Field type\n     * https://vega.github.io/vega/docs/types/#Field\n     * examples: \"source.x\", \"target['x']\", \"[my.field]\"\n     */\n    function safeFieldName(field) {\n        return field\n            .replace(/\\\\/g, '\\\\\\\\') //escape backslashes\n            .replace(/'/g, '\\\\\\'') //escape single quotes\n            .replace(/\"/g, '\\\\\"') //escape double quotes\n            .replace(/\\./g, '\\\\.') //escape periods\n            .replace(/\\[/g, '\\\\[') //escape left square brackets\n            .replace(/\\]/g, '\\\\]') //escape right square brackets\n        ;\n    }\n    /**\n     * Make sure the field name is usable in a Vega expression\n     */\n    function exprSafeFieldName(field) {\n        //remove whitespace, period, accessors and logical modifiers\n        return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, '');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function linearScale(scaleName, domain, range, reverse, zero, nice = true) {\n        const scale = {\n            name: scaleName,\n            type: 'linear',\n            range,\n            round: true,\n            reverse,\n            domain,\n            zero,\n            nice,\n        };\n        return scale;\n    }\n    function pointScale(scaleName, data, range, field, reverse) {\n        const scale = {\n            name: scaleName,\n            type: 'point',\n            range,\n            domain: {\n                data,\n                field: safeFieldName(field),\n                sort: true,\n            },\n            padding: 0.5,\n        };\n        if (reverse !== undefined) {\n            scale.reverse = reverse;\n        }\n        return scale;\n    }\n    function binnableColorScale(scaleName, colorBin, data, field, scheme) {\n        scheme = scheme || ColorScaleNone;\n        const domain = {\n            data,\n            field: safeFieldName(field),\n        };\n        const range = {\n            scheme,\n        };\n        const reverse = { signal: SignalNames.ColorReverse };\n        if (colorBin !== 'continuous') {\n            range.count = { signal: SignalNames.ColorBinCount };\n        }\n        switch (colorBin) {\n            case 'continuous': {\n                const sequentialScale = {\n                    name: scaleName,\n                    type: 'linear',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return sequentialScale;\n            }\n            case 'quantile': {\n                const quantileScale = {\n                    name: scaleName,\n                    type: 'quantile',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return quantileScale;\n            }\n            default: {\n                const quantizeScale = {\n                    name: scaleName,\n                    type: 'quantize',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return quantizeScale;\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const defaultZProportion = 0.6;\n    function textSignals(context, heightSignal) {\n        const { specViewOptions } = context;\n        const signals = [\n            {\n                name: SignalNames.ZProportion,\n                value: defaultZProportion,\n                bind: {\n                    name: specViewOptions.language.zScaleProportion,\n                    debounce,\n                    input: 'range',\n                    min: 0.1,\n                    max: 2,\n                    step: 0.1,\n                },\n            },\n            {\n                name: SignalNames.ZHeight,\n                update: `${heightSignal} * ${SignalNames.ZProportion}`,\n            },\n            {\n                name: SignalNames.TextScale,\n                value: 1.2,\n                bind: {\n                    name: specViewOptions.language.textScaleSignal,\n                    debounce,\n                    input: 'range',\n                    min: 0.5,\n                    max: 2,\n                    step: 0.1,\n                },\n            },\n            {\n                name: SignalNames.TextSize,\n                update: `${SignalNames.TextScale} * 10`,\n            },\n            {\n                name: SignalNames.TextTitleSize,\n                update: `${SignalNames.TextScale} * 15`,\n            },\n            {\n                name: SignalNames.TextAngleX,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.xAxisTextAngleSignal,\n                    debounce,\n                    input: 'range',\n                    min: 0,\n                    max: 90,\n                    step: 1,\n                },\n            },\n            {\n                name: SignalNames.TextAngleY,\n                value: 0,\n                bind: {\n                    name: specViewOptions.language.yAxisTextAngleSignal,\n                    debounce,\n                    input: 'range',\n                    min: -90,\n                    max: 0,\n                    step: 1,\n                },\n            },\n            {\n                name: SignalNames.MarkOpacity,\n                value: 1,\n                bind: {\n                    name: specViewOptions.language.markOpacitySignal,\n                    debounce,\n                    input: 'range',\n                    min: 0.1,\n                    max: 1,\n                    step: 0.05,\n                },\n            },\n        ];\n        return signals;\n    }\n    function colorBinCountSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorBinCount,\n            value: 7,\n            bind: {\n                name: specViewOptions.language.colorBinCount,\n                debounce,\n                input: 'range',\n                min: 1,\n                max: specViewOptions.maxLegends + 1,\n                step: 1,\n            },\n        };\n        return signal;\n    }\n    function colorReverseSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorReverse,\n            value: false,\n            bind: {\n                name: specViewOptions.language.colorReverse,\n                input: 'checkbox',\n            },\n        };\n        return signal;\n    }\n    function modifySignal(s, fn, update) {\n        s.update = `${fn}((${s.update}), (${update}))`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function legend(column, fill) {\n        const legend = {\n            orient: 'none',\n            title: column.name,\n            fill,\n            encode: {\n                symbols: {\n                    update: {\n                        shape: {\n                            value: 'square',\n                        },\n                    },\n                },\n            },\n        };\n        if (column.quantitative) {\n            legend.type = 'symbol';\n            legend.format = '~r';\n        }\n        return legend;\n    }\n    function getLegends(context, fill) {\n        const { specColumns, insight } = context;\n        if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n            return [legend(specColumns.color, fill)];\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function topLookup(column, count, source, legend, lookupName, fieldName, indexName) {\n        const data = [\n            {\n                name: lookupName,\n                source,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: [safeFieldName(column.name)],\n                    },\n                    {\n                        type: 'window',\n                        ops: ['count'],\n                        as: [indexName],\n                    },\n                    {\n                        type: 'filter',\n                        expr: `datum[${JSON.stringify(indexName)}] <= ${count}`,\n                    },\n                ],\n            },\n            {\n                name: legend,\n                source,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: lookupName,\n                        key: safeFieldName(column.name),\n                        fields: [column.name].map(safeFieldName),\n                        values: [column.name].map(safeFieldName),\n                        as: [fieldName],\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum[${JSON.stringify(fieldName)}] == null ? '${Other}' : datum[${JSON.stringify(fieldName)}]`,\n                        as: fieldName,\n                    },\n                ],\n            },\n        ];\n        return data;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addColor(props) {\n        const { colorReverseSignalName, dataName, scope, legendDataName, scaleName, specContext, topLookupName } = props;\n        let colorDataName = dataName;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const legends = getLegends(specContext, scaleName);\n        if (legends) {\n            scope.legends = legends;\n        }\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        if (categoricalColor) {\n            addData(scope, ...topLookup(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, FieldNames.TopColor, FieldNames.TopIndex));\n            colorDataName = legendDataName;\n        }\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                addScales(scope, binnableColorScale(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n            }\n            else {\n                addScales(scope, {\n                    name: scaleName,\n                    type: 'ordinal',\n                    domain: {\n                        data: colorDataName,\n                        field: FieldNames.TopColor,\n                        sort: true,\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone,\n                    },\n                    reverse: { signal: colorReverseSignalName },\n                });\n            }\n        }\n        addSignals(scope, colorBinCountSignal(specContext), colorReverseSignal(specContext));\n        return { topColorField: FieldNames.TopColor, colorDataName };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n        const titleSignal = `parent[${JSON.stringify(FieldNames.FacetTitle)}]`;\n        const index = `datum[${JSON.stringify(FieldNames.Ordinal)}] - 1`;\n        const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index);\n        const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index);\n        addMarks(globalScope, col.header, row.footer);\n        addMarks(col.header, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center',\n                    },\n                    baseline: {\n                        value: 'middle',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    x: {\n                        signal: `${sizeSignals.layoutWidth} / 2`,\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    text: {\n                        signal: titleSignal,\n                    },\n                },\n            },\n        });\n        addMarks(row.footer, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'left',\n                    },\n                    baseline: {\n                        value: 'middle',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    y: {\n                        signal: `${sizeSignals.layoutHeight} / 2`,\n                    },\n                    limit: {\n                        signal: SignalNames.PlotOffsetRight,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    text: {\n                        signal: titleSignal,\n                    },\n                },\n            },\n        });\n    }\n    function addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n        addMarks(scope, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center',\n                    },\n                    baseline: {\n                        value: 'bottom',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    x: {\n                        signal: `(${sizeSignals.layoutWidth}) / 2`,\n                    },\n                    text: {\n                        signal: `parent[${JSON.stringify(FieldNames.FacetTitle)}]`,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth,\n                    },\n                    y: {\n                        signal: `-${SignalNames.FacetPaddingTop} / 2`,\n                    },\n                },\n            },\n        });\n    }\n    function addFacetAxesGroupMarks(props) {\n        const { colSeqName, colTitleScale, globalScope, facetScope, plotScope, rowSeqName, rowTitleScale } = props;\n        const { sizeSignals } = facetScope;\n        const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n        const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n        const index = 'datum.data';\n        const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index);\n        const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index);\n        addData(globalScope, colSequence, rowSequence);\n        addMarks(globalScope, col.footer, row.header);\n        addScales(globalScope, colTitleScale, rowTitleScale);\n        const map = {\n            main: [\n                {\n                    scope: facetScope.facetScope,\n                    lines: true,\n                    labels: false,\n                    title: false,\n                },\n            ],\n            x: [\n                {\n                    scope: col.footer,\n                    lines: true,\n                    labels: true,\n                    title: false,\n                },\n                {\n                    scope: plotScope,\n                    scale: colTitleScale,\n                    lines: false,\n                    labels: false,\n                    title: true,\n                },\n            ],\n            y: [\n                {\n                    scope: row.header,\n                    lines: true,\n                    labels: true,\n                    title: false,\n                },\n                {\n                    scope: plotScope,\n                    scale: rowTitleScale,\n                    lines: false,\n                    labels: false,\n                    title: true,\n                },\n            ],\n        };\n        return map;\n    }\n    function facetRowHeaderFooter(data, sizeSignals, index) {\n        const rowFn = (xSignal) => {\n            return {\n                type: 'group',\n                from: { data },\n                encode: {\n                    update: {\n                        x: { signal: xSignal },\n                        y: {\n                            signal: `${SignalNames.PlotOffsetTop} + ${SignalNames.FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n                        },\n                        height: { signal: sizeSignals.layoutHeight },\n                    },\n                },\n            };\n        };\n        const header = rowFn(SignalNames.PlotOffsetLeft);\n        const footer = rowFn(`${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetRight} / 2`);\n        return { header, footer };\n    }\n    function facetColumnHeaderFooter(data, sizeSignals, index) {\n        const colFn = (ySignal) => {\n            return {\n                type: 'group',\n                from: { data },\n                encode: {\n                    update: {\n                        x: {\n                            signal: `(${index}) * (${sizeSignals.layoutWidth} + ${SignalNames.FacetPaddingLeft}) + ${SignalNames.FacetPaddingLeft} + ${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}`,\n                        },\n                        y: { signal: `${ySignal} - ${SignalNames.FacetAxesAdjustY}` },\n                        width: { signal: sizeSignals.layoutWidth },\n                    },\n                },\n            };\n        };\n        //create group marks based on data sequences\n        const header = colFn(`${SignalNames.PlotOffsetTop} / 2`);\n        const footer = colFn(`${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut}`);\n        return { header, footer };\n    }\n    function createSequence(dataName, countSignal) {\n        return {\n            name: dataName,\n            transform: [\n                {\n                    type: 'sequence',\n                    start: 0,\n                    stop: {\n                        signal: countSignal,\n                    },\n                },\n            ],\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function fill(context, colorFieldName, scale) {\n        const { specColumns, insight, specViewOptions } = context;\n        const colorColumn = specColumns.color;\n        return colorColumn ?\n            colorColumn.isColorData || insight.directColor ?\n                {\n                    field: safeFieldName(colorColumn.name),\n                }\n                :\n                    {\n                        scale,\n                        field: colorColumn.quantitative ? safeFieldName(colorColumn.name) : colorFieldName,\n                    }\n            :\n                {\n                    value: specViewOptions.colors.defaultCube,\n                };\n    }\n    function opacity(context) {\n        const result = {\n            signal: SignalNames.MarkOpacity,\n        };\n        return result;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class GlobalScope {\n        constructor(props) {\n            const { dataName, markGroup, scope, signals } = props;\n            this.scope = scope;\n            this._markGroup = markGroup;\n            this.signals = signals;\n            this.data = getDataByName(scope.data, dataName).data;\n            this._markDataName = dataName;\n            this.offsets = {\n                x: '0',\n                y: '0',\n                h: SignalNames.PlotHeightIn,\n                w: SignalNames.PlotWidthIn,\n            };\n            this.sizeSignals = {\n                layoutHeight: SignalNames.PlotHeightIn,\n                layoutWidth: SignalNames.PlotWidthIn,\n            };\n            this.zSize = SignalNames.PlotHeightIn;\n        }\n        get markDataName() {\n            return this._markDataName;\n        }\n        setMarkDataName(markDataName) {\n            this._markDataName = markDataName;\n        }\n        get markGroup() {\n            return this._markGroup;\n        }\n        setMarkGroup(markGroup) {\n            this._markGroup = markGroup;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Layout {\n        constructor(props) {\n            this.props = props;\n            this.id = props.id;\n        }\n        getGrouping() {\n            return null;\n        }\n        getAggregateSumOp() {\n            return null;\n        }\n        build() {\n            throw 'Not implemented';\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function testForCollapseSelection() {\n        return `datum.${FieldNames.Collapsed}`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class AggregateContainer extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const a = this.aggregation = this.getAggregation();\n            const p = this.prefix = `agg_${this.id}`;\n            this.names = {\n                barCount: `${p}_count`,\n                aggregateField: `${p}_aggregate_value`,\n                globalAggregateExtentSignal: `${p}_${a}_extent`,\n                scale: `scale_${p}`,\n                extentData: `data_${p}_extent`,\n                offsets: `data_${p}_offsets`,\n            };\n        }\n        getAggregateSumOp() {\n            if (this.aggregation === 'sum') {\n                const fieldOp = {\n                    field: safeFieldName(this.props.sumBy.name),\n                    op: 'sum',\n                    as: FieldNames.Sum,\n                };\n                return fieldOp;\n            }\n        }\n        build() {\n            const { aggregation, names, props } = this;\n            const { dock, globalScope, groupings, niceScale, parentScope, showAxes } = props;\n            addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal,\n            });\n            addSignals(globalScope.scope, {\n                name: props.globalAggregateMaxExtentSignal,\n                update: `${names.globalAggregateExtentSignal}[1]`,\n            });\n            const horizontal = dock === 'left';\n            const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n            const offsets = {\n                x: parentScope.offsets.x,\n                y: addOffsets(parentScope.offsets.y, dock === 'bottom' ?\n                    groupScaled\n                    :\n                        ''),\n                h: horizontal ?\n                    parentScope.offsets.h\n                    :\n                        dock === 'top'\n                            ? groupScaled\n                            : `${parentScope.offsets.h} - ${groupScaled}`,\n                w: horizontal ?\n                    groupScaled\n                    :\n                        parentScope.offsets.w,\n            };\n            const scale = {\n                type: 'linear',\n                name: names.scale,\n                domain: [\n                    0,\n                    {\n                        signal: props.globalAggregateMaxExtentSignal,\n                    },\n                ],\n                range: horizontal ?\n                    [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth,\n                        },\n                    ]\n                    :\n                        [\n                            {\n                                signal: parentScope.sizeSignals.layoutHeight,\n                            },\n                            0,\n                        ],\n                nice: niceScale,\n                zero: true,\n                reverse: dock === 'top',\n            };\n            const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n            addSignals(globalScope.scope, {\n                name: props.globalAggregateMaxExtentScaledSignal,\n                update: dock === 'bottom'\n                    ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}`\n                    : globalAggregateMaxExtentScaledValue,\n            });\n            return {\n                offsets,\n                sizeSignals: horizontal ?\n                    {\n                        layoutHeight: parentScope.sizeSignals.layoutHeight,\n                        layoutWidth: null,\n                    }\n                    :\n                        {\n                            layoutHeight: null,\n                            layoutWidth: parentScope.sizeSignals.layoutWidth,\n                        },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? [scale] : undefined,\n                        y: horizontal ? undefined : [scale],\n                    },\n                },\n                encodingRuleMap: horizontal ?\n                    {\n                        x: [{\n                                test: testForCollapseSelection(),\n                                signal: parentScope.offsets.x,\n                            }],\n                        width: [{\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            }],\n                    }\n                    :\n                        {\n                            y: [{\n                                    test: testForCollapseSelection(),\n                                    signal: dock === 'top'\n                                        ? parentScope.offsets.y\n                                        : addOffsets(parentScope.offsets.y, parentScope.offsets.h),\n                                }],\n                            height: [{\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                }],\n                        },\n            };\n        }\n        getTransforms(aggregation, groupby) {\n            const trans = {\n                type: 'joinaggregate',\n                groupby: groupby.map(safeFieldName),\n                ops: [aggregation],\n            };\n            if (aggregation === 'sum') {\n                trans.fields = [this.props.sumBy.name].map(safeFieldName);\n            }\n            return trans;\n        }\n        getAggregation() {\n            const { props } = this;\n            let s;\n            if (props.dock === 'left') {\n                s = props.axesScales.x;\n            }\n            else {\n                s = props.axesScales.y;\n            }\n            switch (s.aggregate) {\n                case 'sum':\n                    return 'sum';\n                default:\n                    return 'count';\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class AggregateSquare extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const a = this.props.aggregation;\n            const p = this.prefix = `agg_${this.id}`;\n            this.names = {\n                barCount: `${p}_count`,\n                aggregateField: `${p}_aggregate_value`,\n                globalAggregateExtentSignal: `${p}_${a}_extent`,\n                extentData: `data_${p}_extent`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { aggregation, globalScope, groupings, onBuild, parentScope } = props;\n            const { sizeSignals } = parentScope;\n            addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal,\n            });\n            const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n            const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n            const squareMaxArea = `(${[squareMaxSide, squareMaxSide].join(' * ')})`;\n            const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n            const squareArea = `(${[squareMaxArea, shrinkRatio].join(' * ')})`;\n            const squareSide = `sqrt(${squareArea})`;\n            const localAggregateMaxExtentScaled = squareSide;\n            onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n                y: addOffsets(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n                h: squareSide,\n                w: squareSide,\n            };\n            return {\n                offsets,\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                encodingRuleMap: {\n                    y: [{\n                            test: testForCollapseSelection(),\n                            signal: offsets.y,\n                        }],\n                    height: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                },\n            };\n        }\n        getTransforms(aggregation, groupby) {\n            const trans = {\n                type: 'joinaggregate',\n                groupby: groupby.map(safeFieldName),\n                ops: [aggregation],\n            };\n            if (aggregation === 'sum') {\n                trans.fields = [this.props.sumBy.name].map(safeFieldName);\n            }\n            return trans;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function dataExtent(column, signal) {\n        return {\n            type: 'extent',\n            field: safeFieldName(column.name),\n            signal,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function binnable(prefix, domainDataName, discreteColumn, outerSignalExtents) {\n        const { column, defaultBins, maxbins, maxbinsSignalDisplayName, maxbinsSignalName } = discreteColumn;\n        if (column.quantitative) {\n            const field = `${prefix}_bin_${exprSafeFieldName(column.name)}`;\n            const fieldEnd = `${field}_end`;\n            const binSignal = `${field}_bins`;\n            const dataExtentSignal = `${field}_bin_extent`;\n            const dataExtentSpanSignal = `${field}_bin_extent_span`;\n            const outerSignal = `${field}_outer_extent`;\n            domainDataName = `${field}_sequence`; //override the data name\n            const extentTransform = dataExtent(column, dataExtentSignal);\n            let imageSignal;\n            if (outerSignalExtents) {\n                imageSignal = outerExtentSignal(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n            }\n            const maxbinsSignal = {\n                name: maxbinsSignalName,\n                value: defaultBins,\n                bind: {\n                    name: maxbinsSignalDisplayName,\n                    debounce,\n                    input: 'range',\n                    min: 1,\n                    max: maxbins,\n                    step: 1,\n                },\n            };\n            const extentSignal = (imageSignal === null || imageSignal === void 0 ? void 0 : imageSignal.name) || dataExtentSignal;\n            const binTransform = {\n                type: 'bin',\n                field: safeFieldName(column.name),\n                as: [\n                    field,\n                    fieldEnd,\n                ],\n                signal: binSignal,\n                extent: {\n                    signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`, //add a tiny bit to the upper extent to force the extra bin - https://github.com/vega/vega/issues/2899\n                },\n                minstep: shouldBeIntegralBinStep(column) ? 1 : 0,\n                maxbins: {\n                    signal: maxbinsSignalName,\n                },\n            };\n            const dataSequence = {\n                name: domainDataName,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: `${binSignal}.start`,\n                        },\n                        stop: {\n                            signal: `${binSignal}.stop`,\n                        },\n                        step: {\n                            signal: `${binSignal}.step`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data',\n                        as: field,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data + ${binSignal}.step`,\n                        as: fieldEnd,\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number'],\n                        as: [FieldNames.Ordinal],\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data === ${binSignal}.start`,\n                        as: FieldNames.First,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                        as: FieldNames.Last,\n                    },\n                    {\n                        // when there is only one bin, use only first sequence element\n                        type: 'filter',\n                        expr: `${dataExtentSpanSignal} === 0 ? datum[${JSON.stringify(FieldNames.First)}] : true`,\n                    },\n                ],\n            };\n            const signals = [\n                maxbinsSignal,\n                {\n                    name: dataExtentSpanSignal,\n                    update: `${extentSignal}[1] - ${extentSignal}[0]`,\n                },\n            ];\n            if (imageSignal) {\n                signals.push(imageSignal);\n            }\n            const augmentBinnable = {\n                discreteColumn,\n                native: false,\n                transforms: [extentTransform, binTransform],\n                fields: [field, fieldEnd],\n                binSignal,\n                extentSignal,\n                dataSequence,\n                domainDataName,\n                signals,\n                fullScaleDataname: dataSequence.name,\n            };\n            return augmentBinnable;\n        }\n        else {\n            const nativeBinnable = {\n                discreteColumn,\n                native: true,\n                fields: [column.name],\n                domainDataName,\n                fullScaleDataname: domainDataName,\n            };\n            return nativeBinnable;\n        }\n    }\n    function outerExtentSignal(name, min, max, dataExtent) {\n        return {\n            name,\n            update: `[min(${min}, ${dataExtent}[0]), max(${max}, ${dataExtent}[1])]`,\n        };\n    }\n    function shouldBeIntegralBinStep(column) {\n        //prevent Vega from showing \".5\" steps between integer scale values\n        return column.quantitative && (column.type === 'integer' && (column.stats.max - column.stats.min) <= 7);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const bandScaleLinearSuffix = '_linear';\n    class Band extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `band_${this.id}`;\n            this.names = {\n                xScale: `scale_${p}_x`,\n                yScale: `scale_${p}_y`,\n                bandWidth: `${p}_bandwidth`,\n                accumulative: `${p}_accumulative`,\n            };\n            this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n        }\n        getGrouping() {\n            return this.bin.fields;\n        }\n        build() {\n            const { bin, names, props } = this;\n            const { globalScope, minBandWidth, orientation, parentScope, showAxes } = props;\n            const binField = bin.fields[0];\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n            }\n            //TODO don't add this, use existing dataset\n            addData(globalScope.scope, {\n                name: names.accumulative,\n                source: bin.fullScaleDataname,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: this.getGrouping().map(safeFieldName),\n                        ops: ['count'],\n                    },\n                ],\n            });\n            const horizontal = orientation === 'horizontal';\n            const minCellSignal = (horizontal) ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n            modifySignal(minCellSignal, 'max', `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n            addSignals(globalScope.scope, {\n                name: names.bandWidth,\n                update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`,\n            });\n            const scale = this.getScale(bin, horizontal);\n            if (props.outerSignalExtents && bin.native === false) {\n                //add a linear scale for use by background image\n                addScales(globalScope.scope, linearScale(scale.name + bandScaleLinearSuffix, { signal: bin.extentSignal }, scale.range, scale.reverse, false, false));\n            }\n            let encodingRuleMap;\n            if (!props.excludeEncodingRuleMap) {\n                encodingRuleMap = horizontal ?\n                    {\n                        x: [\n                            {\n                                test: testForCollapseSelection(),\n                                signal: parentScope.offsets.x,\n                            },\n                        ],\n                        width: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                        ],\n                    }\n                    :\n                        {\n                            y: [\n                                {\n                                    test: testForCollapseSelection(),\n                                    signal: addOffsets(parentScope.offsets.y, parentScope.offsets.h),\n                                },\n                            ],\n                            height: [\n                                {\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                },\n                            ],\n                        };\n            }\n            return {\n                offsets: this.getOffset(horizontal, binField),\n                sizeSignals: horizontal ?\n                    {\n                        layoutHeight: names.bandWidth,\n                        layoutWidth: parentScope.sizeSignals.layoutWidth,\n                    }\n                    :\n                        {\n                            layoutHeight: parentScope.sizeSignals.layoutHeight,\n                            layoutWidth: names.bandWidth,\n                        },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? undefined : [scale],\n                        y: horizontal ? [scale] : undefined,\n                    },\n                },\n                encodingRuleMap,\n            };\n        }\n        getOffset(horizontal, binField) {\n            const { names, props } = this;\n            const { parentScope } = props;\n            return {\n                x: addOffsets(parentScope.offsets.x, horizontal ?\n                    ''\n                    :\n                        `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n                y: addOffsets(parentScope.offsets.y, horizontal ?\n                    `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])`\n                    :\n                        ''),\n                h: horizontal ?\n                    names.bandWidth\n                    :\n                        parentScope.offsets.h,\n                w: horizontal ?\n                    parentScope.offsets.w\n                    :\n                        names.bandWidth,\n            };\n        }\n        getScale(bin, horizontal) {\n            const { names } = this;\n            const { parentScope } = this.props;\n            const binField = safeFieldName(bin.fields[0]);\n            let bandScale;\n            if (horizontal) {\n                bandScale = {\n                    type: 'band',\n                    name: names.yScale,\n                    range: [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutHeight,\n                        },\n                    ],\n                    padding: 0.1,\n                    domain: {\n                        data: bin.domainDataName,\n                        field: binField,\n                        sort: true,\n                    },\n                    reverse: true,\n                };\n            }\n            else {\n                bandScale = {\n                    type: 'band',\n                    name: names.xScale,\n                    range: [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth,\n                        },\n                    ],\n                    padding: 0.1,\n                    domain: {\n                        data: bin.domainDataName,\n                        field: binField,\n                        sort: true,\n                    },\n                };\n            }\n            return bandScale;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function displayBin(bin) {\n        const val = (index) => `datum[${JSON.stringify(bin.fields[index])}]`;\n        return bin.discreteColumn.column.quantitative ?\n            `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')`\n            :\n                val(0);\n    }\n    function obj(nameValues, clause) {\n        return `{${nameValues.join()}}`;\n    }\n    function serializeAsVegaExpression(bin, firstFieldName, lastFieldName, clause) {\n        if (bin.discreteColumn.column.quantitative) {\n            const low = [\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'>=\\'',\n                `value:datum[${JSON.stringify(bin.fields[0])}]`,\n            ];\n            const high = [\n                'clause:\\'&&\\'',\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'<\\'',\n                `value:datum[${JSON.stringify(bin.fields[1])}]`,\n            ];\n            return obj([\n                `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`,\n            ]);\n        }\n        else {\n            const exact = [\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'==\\'',\n                `value:datum[${JSON.stringify(bin.fields[0])}]`,\n            ];\n            return obj([\n                `expressions:[${obj(exact)}]`,\n            ]);\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function createOrdinals(source, prefix, binFields, sortOrder) {\n        const _binFields = binFields.map(safeFieldName);\n        const dataName = `${prefix}_bin_order`;\n        const data = {\n            name: dataName,\n            source,\n            transform: [\n                {\n                    type: 'aggregate',\n                    groupby: _binFields,\n                },\n                {\n                    type: 'collect',\n                    sort: {\n                        field: _binFields,\n                        order: _binFields.map(f => sortOrder),\n                    },\n                },\n                {\n                    type: 'window',\n                    ops: ['row_number'],\n                    as: [FieldNames.Ordinal],\n                },\n            ],\n        };\n        return {\n            data,\n            scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields),\n        };\n    }\n    function ordinalScale(dataName, scaleName, binFields) {\n        return {\n            type: 'ordinal',\n            name: scaleName,\n            domain: {\n                data: dataName,\n                field: safeFieldName(binFields[0]),\n            },\n            range: {\n                data: dataName,\n                field: FieldNames.Ordinal,\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Cross extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `cross_${this.id}`;\n            this.binX = binnable(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n            this.binY = binnable(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n            this.names = {\n                facetDataName: `data_${p}_facet`,\n                searchUnion: `data_${p}_search`,\n                dimScale: `scale_${p}`,\n                dimCount: `${p}_count`,\n                dimCategorical: `data_${p}_cat`,\n                dimCellSize: `${p}_cell_size`,\n                dimCellSizeCalc: `${p}_cell_calc`,\n            };\n        }\n        getGrouping() {\n            return this.binX.fields.concat(this.binY.fields);\n        }\n        build() {\n            const { binX, binY, names, prefix, props } = this;\n            const { axisTextColor, colRowTitles, globalScope, parentScope } = props;\n            const titles = { x: { dataName: null, quantitative: null }, y: { dataName: null, quantitative: null } };\n            const dx = {\n                dim: 'x',\n                bin: binX,\n                sortOrder: 'ascending',\n                size: parentScope.sizeSignals.layoutWidth,\n                layout: parentScope.sizeSignals.layoutWidth,\n                min: globalScope.signals.minCellWidth.name,\n                out: globalScope.signals.plotWidthOut,\n                offset: SignalNames.FacetPaddingLeft,\n                padding: SignalNames.FacetPaddingLeft,\n                dataOut: null,\n                scaleName: null,\n                position: null,\n            };\n            const dy = {\n                dim: 'y',\n                bin: binY,\n                sortOrder: 'ascending',\n                size: parentScope.sizeSignals.layoutHeight,\n                layout: parentScope.sizeSignals.layoutHeight,\n                min: globalScope.signals.minCellHeight.name,\n                out: globalScope.signals.plotHeightOut,\n                offset: SignalNames.FacetPaddingTop,\n                padding: `(${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n                dataOut: null,\n                scaleName: null,\n                position: null,\n            };\n            const dimensions = [dx, dy];\n            dimensions.forEach(d => {\n                const { bin, dim, padding, sortOrder } = d;\n                let data;\n                let dataName;\n                let countSignal;\n                let scale;\n                const titleSource = titles[dim];\n                if (bin.native === false) {\n                    addSignals(globalScope.scope, ...bin.signals);\n                    addTransforms(globalScope.data, ...bin.transforms);\n                    addData(globalScope.scope, bin.dataSequence);\n                    addTransforms(bin.dataSequence, {\n                        type: 'formula',\n                        expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                        as: FieldNames.Contains,\n                    });\n                    data = bin.dataSequence;\n                    dataName = bin.dataSequence.name;\n                    countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                    scale = ordinalScale(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                    titleSource.dataName = bin.dataSequence.name;\n                }\n                else {\n                    dataName = globalScope.markDataName;\n                    const ord = createOrdinals(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                    data = ord.data;\n                    addData(globalScope.scope, ord.data);\n                    countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                    scale = ord.scale;\n                    titleSource.dataName = ord.data.name;\n                }\n                titleSource.quantitative = bin.discreteColumn.column.quantitative;\n                d.dataOut = data;\n                d.scaleName = scale.name;\n                addTransforms(data, {\n                    type: 'formula',\n                    expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                    as: FieldNames.FacetSearch,\n                }, {\n                    type: 'formula',\n                    expr: displayBin(bin),\n                    as: FieldNames.FacetTitle,\n                });\n                addScales(globalScope.scope, scale);\n                const count = `${names.dimCount}_${dim}`;\n                const calc = `${names.dimCellSizeCalc}_${dim}`;\n                const size = `${names.dimCellSize}_${dim}`;\n                addSignals(globalScope.scope, { name: count, update: countSignal });\n                addSignals(globalScope.scope, {\n                    name: calc,\n                    update: `${d.layout} / ${count}`,\n                }, {\n                    name: size,\n                    update: `max(${d.min}, (${calc} - ${padding}))`,\n                });\n                modifySignal(d.out, 'max', `((${size} + ${padding}) * ${count})`);\n                d.position = this.dimensionOffset(d);\n            });\n            const groupRow = {\n                type: 'group',\n                encode: {\n                    update: {\n                        y: {\n                            signal: dy.position,\n                        },\n                    },\n                },\n                from: {\n                    data: dy.dataOut.name,\n                },\n                data: [\n                    {\n                        name: names.searchUnion,\n                        source: dx.dataOut.name,\n                        transform: [\n                            {\n                                type: 'formula',\n                                expr: `[datum[${JSON.stringify(FieldNames.FacetSearch)}], merge(parent[${JSON.stringify(FieldNames.FacetSearch)}], { clause: '&&'})]`,\n                                as: FieldNames.FacetSearch,\n                            },\n                        ],\n                    },\n                ],\n            };\n            const groupCol = {\n                style: 'cell',\n                name: prefix,\n                type: 'group',\n                encode: {\n                    update: {\n                        height: {\n                            signal: `${names.dimCellSize}_y`,\n                        },\n                        width: {\n                            signal: `${names.dimCellSize}_x`,\n                        },\n                        x: {\n                            signal: dx.position,\n                        },\n                    },\n                },\n                from: {\n                    data: names.searchUnion,\n                },\n            };\n            addMarks(globalScope.markGroup, groupRow);\n            addMarks(groupRow, groupCol);\n            const offsets = {\n                x: this.dimensionOffset(dx),\n                y: this.dimensionOffset(dy),\n                h: `${names.dimCellSize}_y`,\n                w: `${names.dimCellSize}_x`,\n            };\n            const sizeSignals = {\n                layoutHeight: `${names.dimCellSize}_y`,\n                layoutWidth: `${names.dimCellSize}_x`,\n                colCount: `${names.dimCount}_x`,\n                rowCount: `${names.dimCount}_y`,\n            };\n            if (colRowTitles) {\n                addFacetColRowTitles(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n            }\n            return {\n                facetScope: groupCol,\n                offsets,\n                sizeSignals,\n                titles,\n            };\n        }\n        dimensionOffset(d) {\n            const { names } = this;\n            return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    let Scatter$1 = class Scatter extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `scatter_${this.id}`;\n            this.names = {\n                aggregateData: `data_${p}_aggregate`,\n                markData: `data_${p}_mark`,\n                xDataExtent: `${p}_xDataExtent`,\n                yDataExtent: `${p}_yDataExtent`,\n                xExtent: `${p}_xExtent`,\n                yExtent: `${p}_yExtent`,\n                sizeExtent: `${p}_sizeExtent`,\n                sizeRange: `${p}_sizeRange`,\n                sizeScale: `${p}_sizeScale`,\n                xScale: `scale_${p}_x`,\n                yScale: `scale_${p}_y`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { backgroundImageExtents, globalScope, parentScope, scatterPointScaleDisplay, showAxes, size, view, x, y, z, zGrounded } = props;\n            const qsize = size && size.quantitative && size;\n            addSignals(globalScope.scope, {\n                name: SignalNames.PointScale,\n                value: 5,\n                bind: {\n                    name: scatterPointScaleDisplay,\n                    debounce,\n                    input: 'range',\n                    min: 1,\n                    max: 10,\n                    step: 0.1,\n                },\n            }, {\n                name: SignalNames.ZGrounded,\n                value: false,\n                bind: {\n                    name: zGrounded,\n                    input: 'checkbox',\n                },\n            });\n            if (backgroundImageExtents) {\n                addTransforms(globalScope.data, dataExtent(x, names.xDataExtent), dataExtent(y, names.yDataExtent));\n                const xSignal = outerExtentSignal(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n                const ySignal = outerExtentSignal(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n                addSignals(globalScope.scope, xSignal, ySignal);\n            }\n            if (qsize) {\n                addTransforms(globalScope.data, {\n                    type: 'extent',\n                    field: safeFieldName(qsize.name),\n                    signal: names.sizeExtent,\n                });\n                addScales(globalScope.scope, {\n                    name: names.sizeScale,\n                    type: 'pow',\n                    exponent: 0.5,\n                    domain: [0, { signal: `${names.sizeExtent}[1]` }],\n                    range: [0, { signal: names.sizeRange }],\n                });\n                addSignals(globalScope.scope, {\n                    name: names.sizeRange,\n                    update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${scatterSizedDiv}`,\n                });\n            }\n            addData(globalScope.scope, {\n                name: names.markData,\n                source: globalScope.markDataName,\n                transform: [x, y, z].map(c => {\n                    if (!c || !c.quantitative)\n                        return;\n                    const t = {\n                        type: 'filter',\n                        expr: `isValid(datum[${JSON.stringify(c.name)}])`,\n                    };\n                    return t;\n                }).filter(Boolean),\n            });\n            globalScope.setMarkDataName(names.markData);\n            const globalScales = { showAxes, scales: {} };\n            const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n            const sizeValueSignal = qsize ?\n                `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${SignalNames.PointScale}`\n                : SignalNames.PointScale;\n            const update = Object.assign({ height: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: sizeValueSignal,\n                    },\n                ], width: {\n                    signal: sizeValueSignal,\n                } }, z && {\n                z: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`,\n                    },\n                ],\n                zindex: [\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`,\n                    },\n                ],\n                depth: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: view === '3d'\n                            ? `${SignalNames.ZGrounded} ? ${zValue} : ${sizeValueSignal}`\n                            : '0',\n                    },\n                ],\n            });\n            const columnSignals = [\n                {\n                    column: x,\n                    xyz: 'x',\n                    scaleName: names.xScale,\n                    domain: backgroundImageExtents ?\n                        {\n                            signal: names.xExtent,\n                        }\n                        :\n                            {\n                                data: globalScope.data.name,\n                                field: safeFieldName(x.name),\n                            },\n                    reverse: false,\n                    signal: parentScope.sizeSignals.layoutWidth,\n                },\n                {\n                    column: y,\n                    xyz: 'y',\n                    scaleName: names.yScale,\n                    domain: backgroundImageExtents ?\n                        {\n                            signal: names.yExtent,\n                        }\n                        :\n                            {\n                                data: globalScope.data.name,\n                                field: safeFieldName(y.name),\n                            },\n                    reverse: true,\n                    signal: parentScope.sizeSignals.layoutHeight,\n                },\n                {\n                    column: z,\n                    xyz: 'z',\n                    scaleName: names.zScale,\n                    domain: {\n                        data: globalScope.data.name,\n                        field: z ? safeFieldName(z.name) : null,\n                    },\n                    reverse: false,\n                    signal: view === '3d'\n                        ? `(${globalScope.zSize}) * ${SignalNames.ZProportion}`\n                        : `10 * ${SignalNames.ZProportion}`,\n                },\n            ];\n            columnSignals.forEach(cs => {\n                const { column, domain, reverse, scaleName, signal, xyz } = cs;\n                if (!column)\n                    return;\n                let scale;\n                if (column.quantitative) {\n                    scale = linearScale(scaleName, domain, [0, { signal }], reverse, false, showAxes);\n                    if (shouldBeIntegralBinStep(column)) {\n                        scale.bins = { step: 1 };\n                    }\n                }\n                else {\n                    scale = pointScale(scaleName, globalScope.data.name, [0, { signal }], column.name, reverse);\n                }\n                globalScales.scales[xyz] = [scale];\n            });\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: globalScope.markDataName },\n                encode: { update },\n            };\n            addMarks(globalScope.markGroup, mark);\n            return {\n                offsets: {\n                    x: addOffsets(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                    y: addOffsets(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                    h: sizeValueSignal,\n                    w: sizeValueSignal,\n                },\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                globalScales,\n                mark,\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: addOffsets(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight),\n                        },\n                    ],\n                },\n            };\n        }\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addZScale(z, zSize, dataName, zScaleName) {\n        if (z) {\n            const zRange = [0, { signal: `(${zSize}) * ${SignalNames.ZProportion}` }];\n            const scale = z.quantitative\n                ?\n                    linearScale(zScaleName, {\n                        data: dataName,\n                        field: safeFieldName(z.name),\n                    }, zRange, false, true)\n                :\n                    pointScale(zScaleName, dataName, zRange, z.name, false);\n            return scale;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Square extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `square_${this.id}`;\n            this.names = {\n                bandWidth: this.getBandWidth(),\n                maxGroupField: `${p}_max_group`,\n                maxGroupSignal: `${p}_max_grouping`,\n                stack0: `${p}_stack0`,\n                stack1: `${p}_stack1`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { fillDirection, globalScope, groupings, parentScope, collapseYHeight, showAxes, sortBy, view, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            addTransforms(globalScope.data, Object.assign({ type: 'stack', groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sortBy && {\n                sort: {\n                    field: safeFieldName(sortBy.name),\n                    order: 'ascending',\n                },\n            }));\n            const { gap, levelSize, size, squaresPerBand } = this.addSignals();\n            const heightSignal = {\n                signal: fillDirection === 'down-right' ? size : levelSize,\n            };\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: {\n                    data: globalScope.markDataName,\n                },\n                encode: {\n                    update: Object.assign({ height: collapseYHeight ?\n                            [\n                                {\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                },\n                                heightSignal,\n                            ]\n                            :\n                                heightSignal, width: {\n                            signal: fillDirection === 'down-right' ? levelSize : size,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            const { tx, ty } = this.transformXY(gap, levelSize, squaresPerBand);\n            return Object.assign(Object.assign(Object.assign({}, z && {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n            }), { offsets: {\n                    x: addOffsets(parentScope.offsets.x, tx.expr),\n                    y: addOffsets(parentScope.offsets.y, ty.expr),\n                    h: size,\n                    w: size,\n                }, mark, sizeSignals: {\n                    layoutHeight: size,\n                    layoutWidth: size,\n                } }), collapseYHeight && {\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y,\n                        },\n                    ],\n                },\n            });\n        }\n        getBandWidth() {\n            const { offsets } = this.props.parentScope;\n            switch (this.props.fillDirection) {\n                case 'down-right':\n                    return offsets.h;\n                default:\n                    return offsets.w;\n            }\n        }\n        addSignals() {\n            const { names, props } = this;\n            const { fillDirection, globalScope, groupings, parentScope } = props;\n            let { maxGroupedFillSize, maxGroupedUnits } = props;\n            if (!maxGroupedUnits) {\n                if (groupings) {\n                    addTransforms(globalScope.data, {\n                        type: 'joinaggregate',\n                        groupby: getGroupBy(groupings).map(safeFieldName),\n                        ops: ['count'],\n                        as: [names.maxGroupField],\n                    }, {\n                        type: 'extent',\n                        field: names.maxGroupField,\n                        signal: names.maxGroupSignal,\n                    });\n                    maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n                }\n                else {\n                    maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n                }\n            }\n            if (!maxGroupedFillSize) {\n                maxGroupedFillSize = fillDirection === 'down-right' ? parentScope.offsets.w : parentScope.offsets.h;\n            }\n            const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n            const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n            const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n            const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n            const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n            const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n            return { gap, levelSize, size, squaresPerBand };\n        }\n        transformXY(gap, levelSize, squaresPerBand) {\n            const { names, prefix } = this;\n            const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n            const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n            const { fillDirection, parentScope } = this.props;\n            const tx = {\n                type: 'formula',\n                expr: null,\n                as: `${prefix}_${FieldNames.OffsetX}`,\n            };\n            const ty = {\n                type: 'formula',\n                expr: null,\n                as: `${prefix}_${FieldNames.OffsetY}`,\n            };\n            switch (fillDirection) {\n                case 'down-right': {\n                    tx.expr = `${level} * (${levelSize} + ${gap})`;\n                    ty.expr = compartment;\n                    break;\n                }\n                case 'right-up': {\n                    tx.expr = compartment;\n                    ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                    break;\n                }\n                case 'right-down':\n                default: {\n                    tx.expr = compartment;\n                    ty.expr = `${level} * (${levelSize} + ${gap})`;\n                    break;\n                }\n            }\n            return { tx, ty };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Stack extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `stack_${this.id}`;\n            this.names = {\n                cube: `${p}_cube`,\n                globalDataName: `data_${p}_count`,\n                globalExtent: `${p}_global_extent`,\n                levelDataName: `data_${p}_level`,\n                count: `${p}_count`,\n                stack0: `${p}_stack0`,\n                stack1: `${p}_stack1`,\n                sequence: `data_${p}_sequence`,\n                sides: `${p}_sides`,\n                size: `${p}_size`,\n                squared: `${p}_squared`,\n                maxCount: `${p}_maxCount`,\n                maxLevels: `${p}_maxLevels`,\n                zScale: `${p}_zScale`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { globalScope, groupings, parentScope, showAxes, sort } = props;\n            const { sizeSignals } = parentScope;\n            addTransforms(globalScope.data, {\n                type: 'joinaggregate',\n                groupby: getGroupBy(groupings).map(safeFieldName),\n                ops: ['count'],\n                as: [names.count],\n            }, {\n                type: 'extent',\n                field: names.count,\n                signal: names.globalExtent,\n            }, Object.assign({ type: 'stack', groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sort && {\n                sort: {\n                    field: safeFieldName(sort.name),\n                    order: 'ascending',\n                },\n            }));\n            addData(globalScope.scope, {\n                name: names.sequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `sqrt(${names.globalExtent}[1])`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data * datum.data',\n                        as: 'squared',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                        as: 'maxlevels',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                        as: 'side',\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.side * datum.maxlevels + datum.maxlevels - 1',\n                        as: 'sidecubeheight',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                        as: 'heightmatch',\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: 'heightmatch',\n                            order: 'ascending',\n                        },\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number'],\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.row_number === 1',\n                    },\n                ],\n            });\n            addSignals(globalScope.scope, {\n                name: names.size,\n                update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`,\n            }, {\n                name: names.squared,\n                update: `data('${names.sequence}')[0].squared`,\n            }, {\n                name: names.sides,\n                update: `sqrt(${names.squared})`,\n            }, {\n                name: names.cube,\n                update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`,\n            }, {\n                name: names.maxLevels,\n                update: `data('${names.sequence}')[0].maxlevels`,\n            }, {\n                name: names.maxCount,\n                update: `${names.maxLevels} * ${names.squared}`,\n            });\n            const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n            const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n            const cubeX = `(${layerOrdinal} % ${names.sides})`;\n            const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n            const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n            const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n                y: addOffsets(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n                h: names.size,\n                w: names.size,\n            };\n            const mark = {\n                type: 'rect',\n                from: { data: this.names.levelDataName },\n                encode: {\n                    update: {\n                        z: {\n                            signal: `${zLevel} * (${names.cube} + 1)`,\n                        },\n                        height: {\n                            signal: names.cube,\n                        },\n                        width: {\n                            signal: names.cube,\n                        },\n                        depth: {\n                            signal: names.cube,\n                        },\n                    },\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            const zScale = {\n                type: 'linear',\n                name: names.zScale,\n                domain: [\n                    0,\n                    {\n                        signal: names.maxCount,\n                    },\n                ],\n                range: [\n                    0,\n                    {\n                        signal: `${names.maxLevels} * (${names.cube} + 1) - 1`,\n                    },\n                ],\n                nice: false,\n            };\n            return {\n                offsets,\n                mark,\n                sizeSignals: {\n                    layoutHeight: names.size,\n                    layoutWidth: names.size,\n                },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n                encodingRuleMap: {\n                    y: [{\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y,\n                        }],\n                    z: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                    depth: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                    height: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                },\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Strip extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `strip_${this.id}`;\n            this.names = {\n                firstField: `${p}${FieldNames.First}`,\n                lastField: `${p}${FieldNames.Last}`,\n                valueField: `${p}${FieldNames.Value}`,\n                scale: `scale_${p}`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { addPercentageScale, globalScope, groupings, orientation, showAxes, size, sort, sortOrder, parentScope, view, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            const horizontal = orientation === 'horizontal';\n            const transform = [];\n            if (sort) {\n                transform.push({\n                    type: 'collect',\n                    sort: {\n                        field: safeFieldName(sort.name),\n                        order: sortOrder,\n                    },\n                });\n            }\n            let stackField;\n            if (size) {\n                stackField = size.name;\n                transform.push({\n                    type: 'filter',\n                    expr: `datum[${JSON.stringify(size.name)}] > 0`,\n                });\n            }\n            else {\n                stackField = names.valueField;\n                transform.push({\n                    type: 'formula',\n                    expr: '1',\n                    as: stackField,\n                });\n            }\n            const stackTransform = {\n                type: 'stack',\n                field: safeFieldName(stackField),\n                offset: 'normalize',\n                as: [names.firstField, names.lastField],\n            };\n            if (groupings.length) {\n                stackTransform.groupby = getGroupBy(groupings).map(safeFieldName);\n            }\n            transform.push(stackTransform);\n            addTransforms(globalScope.data, ...transform);\n            const span = [names.lastField, names.firstField].map(f => `datum[${JSON.stringify(f)}]`).join(' - ');\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, horizontal ?\n                    `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})`\n                    :\n                        ''),\n                y: addOffsets(parentScope.offsets.y, horizontal ?\n                    ''\n                    :\n                        `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n                h: horizontal\n                    ? parentScope.offsets.h\n                    : `(${span}) * (${parentScope.offsets.h})`,\n                w: horizontal\n                    ? `(${span}) * (${parentScope.offsets.w})`\n                    : parentScope.offsets.w,\n            };\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: globalScope.markDataName },\n                encode: {\n                    update: Object.assign({ height: {\n                            signal: offsets.h,\n                        }, width: {\n                            signal: offsets.w,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            let percentageScale;\n            if (addPercentageScale) {\n                percentageScale = [{\n                        type: 'linear',\n                        name: names.scale,\n                        domain: [0, 100],\n                        range: horizontal ?\n                            [\n                                0,\n                                {\n                                    signal: parentScope.sizeSignals.layoutWidth,\n                                },\n                            ]\n                            :\n                                [\n                                    {\n                                        signal: parentScope.sizeSignals.layoutHeight,\n                                    },\n                                    0,\n                                ],\n                    }];\n            }\n            return {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? percentageScale : undefined,\n                        y: horizontal ? undefined : percentageScale,\n                        z: zScale && [zScale],\n                    },\n                },\n                offsets,\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                mark,\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Treemap extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `treemap_${this.id}`;\n            this.names = {\n                dataName: `data_${p}`,\n                dataHeightWidth: `data_${p}_hw`,\n                dataExtents: `data_${p}_extents`,\n                dataFacet: `data_${p}_facet`,\n                dataFacetMark: `data_${p}_facetMark`,\n                fieldChildren: `${p}_children`,\n                fieldDepth: `${p}_depth`,\n                fieldX0: `${p}_x0`,\n                fieldX1: `${p}_x1`,\n                fieldY0: `${p}_y0`,\n                fieldY1: `${p}_y1`,\n                fieldHeight: `${p}_h`,\n                fieldWidth: `${p}_w`,\n                heightExtent: `${p}_heightExtent`,\n                widthExtent: `${p}_widthExtent`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { globalScope, parentScope, showAxes, treeMapMethod, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, fn(names.fieldX0)),\n                y: addOffsets(parentScope.offsets.y, fn(names.fieldY0)),\n                h: subtract$1(names.fieldY1, names.fieldY0),\n                w: subtract$1(names.fieldX1, names.fieldX0),\n            };\n            const mark = this.transformedMark(offsets);\n            addSignals(globalScope.scope, {\n                name: SignalNames.TreeMapMethod,\n                value: 'squarify',\n                bind: {\n                    name: treeMapMethod,\n                    input: 'select',\n                    options: [\n                        'squarify', 'binary',\n                    ],\n                },\n            });\n            return Object.assign(Object.assign({}, z && {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n            }), { mark,\n                offsets, sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                } });\n        }\n        transformedMark(offsets) {\n            const { names, props } = this;\n            const { globalScope, groupings, parentScope } = props;\n            if (groupings.length) {\n                //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n                addData(globalScope.scope, {\n                    name: names.dataHeightWidth,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.h,\n                            as: names.fieldHeight,\n                        },\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.w,\n                            as: names.fieldWidth,\n                        },\n                    ],\n                });\n                const treemapData = {\n                    name: names.dataFacetMark,\n                    source: names.dataFacet,\n                };\n                const facets = {\n                    type: 'group',\n                    from: {\n                        facet: {\n                            name: names.dataFacet,\n                            data: names.dataHeightWidth,\n                            groupby: getGroupBy(groupings).map(safeFieldName),\n                        },\n                    },\n                    data: [\n                        {\n                            name: names.dataExtents,\n                            source: names.dataFacet,\n                            transform: [\n                                {\n                                    type: 'extent',\n                                    field: names.fieldHeight,\n                                    signal: names.heightExtent,\n                                },\n                                {\n                                    type: 'extent',\n                                    field: names.fieldWidth,\n                                    signal: names.widthExtent,\n                                },\n                            ],\n                        },\n                        treemapData,\n                    ],\n                };\n                globalScope.setMarkDataName(names.dataFacetMark);\n                addMarks(globalScope.markGroup, facets);\n                //assign new markgroup after adding mark to original group\n                globalScope.setMarkGroup(facets);\n                this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n                return this.addMark(offsets, facets, globalScope.markDataName);\n            }\n            else {\n                this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n                return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n            }\n        }\n        addMark(offsets, markParent, markDataName) {\n            const { names, prefix, props } = this;\n            const { view, z } = props;\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: markDataName },\n                encode: {\n                    update: Object.assign({ width: {\n                            signal: offsets.w,\n                        }, height: {\n                            signal: offsets.h,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(markParent, mark);\n            return mark;\n        }\n        treemapTransform(treemapData, widthSignal, heightSignal) {\n            const { names, props } = this;\n            const { group, size } = props;\n            addTransforms(treemapData, {\n                type: 'filter',\n                expr: `datum[${JSON.stringify(size.name)}] > 0`,\n            }, {\n                type: 'nest',\n                keys: [(group && group.name) || '__NONE__'],\n            }, {\n                type: 'treemap',\n                field: safeFieldName(size.name),\n                sort: { field: 'value', order: 'descending' },\n                round: true,\n                method: { signal: SignalNames.TreeMapMethod },\n                paddingInner: 1,\n                paddingOuter: 0,\n                size: [\n                    { signal: widthSignal },\n                    { signal: heightSignal },\n                ],\n                as: [\n                    names.fieldX0,\n                    names.fieldY0,\n                    names.fieldX1,\n                    names.fieldY1,\n                    names.fieldDepth,\n                    names.fieldChildren,\n                ],\n            });\n        }\n    }\n    function fn(n) {\n        return `datum[${JSON.stringify(n)}]`;\n    }\n    function subtract$1(...fields) {\n        return fields.map(n => fn(n)).join(' - ');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Wrap extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `wrap_${this.id}`;\n            this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n            this.names = {\n                outputData: `data_${p}_out`,\n                rowColumnDataName: `data_${p}_row_col`,\n                cellHeight: `${p}_cellHeight`,\n                cellWidth: `${p}_cellWidth`,\n                fits: `${p}_fits`,\n                target: `${p}_target`,\n                minArea: `${p}_minArea`,\n                aspect: `${p}_aspect`,\n                minAspect: `${p}_minAspect`,\n                idealAspect: `${p}_idealAspect`,\n                dataLength: `${p}_dataLength`,\n                rxc0: `${p}_rxc0`,\n                rxc1: `${p}_rxc1`,\n                rxc2: `${p}_rxc2`,\n                rxc: `${p}_rxc`,\n                growColCount: `${p}_growColCount`,\n                growCellWidth: `${p}_growCellWidth`,\n                fitsArea: `${p}_fitsArea`,\n                colCount: `${p}_colCount`,\n            };\n        }\n        getGrouping() {\n            return this.bin.fields;\n        }\n        build() {\n            const { bin, names, prefix, props } = this;\n            const { axisTextColor, cellTitles, globalScope, parentScope } = props;\n            let ordinalBinData;\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n                addTransforms(bin.dataSequence, {\n                    type: 'formula',\n                    expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                    as: FieldNames.Contains,\n                });\n                ordinalBinData = bin.dataSequence.name;\n            }\n            else {\n                const ord = createOrdinals(globalScope.data.name, prefix, bin.fields, 'ascending');\n                addData(globalScope.scope, ord.data);\n                ordinalBinData = ord.data.name;\n            }\n            addData(globalScope.scope, {\n                name: names.rxc0,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `ceil(sqrt(${names.dataLength})) + 1`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.data)`,\n                        as: 'complement',\n                    },\n                ],\n            }, {\n                name: names.rxc1,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['data'],\n                        as: ['cols'],\n                    },\n                ],\n            }, {\n                name: names.rxc2,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['complement'],\n                        as: ['cols'],\n                    },\n                ],\n            }, {\n                name: names.rxc,\n                source: [names.rxc1, names.rxc2],\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.cols)`,\n                        as: 'rows',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                        as: 'cellw',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.cols === 1 ? max(datum.cellw, ${SignalNames.MinCellWidth}) : datum.cellw`,\n                        as: 'cellw',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                        as: 'cellh',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.rows === 1 ? max(datum.cellh, ${SignalNames.MinCellHeight}) : datum.cellh`,\n                        as: 'cellh',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum.cellw >= ${SignalNames.MinCellWidth} && datum.cellh >= ${SignalNames.MinCellHeight})`,\n                        as: 'meetsmin',\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.meetsmin',\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.cellw / datum.cellh',\n                        as: names.aspect,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(datum.${names.aspect} - ${names.target})`,\n                        as: names.idealAspect,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                        as: 'coverage',\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: [names.idealAspect, 'coverage'],\n                            order: ['ascending', 'descending'],\n                        },\n                    },\n                ],\n            }, {\n                name: names.rowColumnDataName,\n                source: ordinalBinData,\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `floor((datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) / ${names.colCount})`,\n                        as: FieldNames.WrapRow,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) % ${names.colCount}`,\n                        as: FieldNames.WrapCol,\n                    },\n                    {\n                        type: 'formula',\n                        expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                        as: FieldNames.FacetSearch,\n                    },\n                    {\n                        type: 'formula',\n                        expr: displayBin(bin),\n                        as: FieldNames.FacetTitle,\n                    },\n                ],\n            });\n            const dataOut = {\n                name: names.outputData,\n                source: globalScope.data.name,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: names.rowColumnDataName,\n                        key: safeFieldName(bin.fields[0]),\n                        fields: [bin.fields[0]].map(safeFieldName),\n                        values: [FieldNames.WrapRow, FieldNames.WrapCol],\n                    },\n                ],\n            };\n            addData(globalScope.scope, dataOut);\n            globalScope.setMarkDataName(names.outputData);\n            addSignals(globalScope.scope, {\n                name: names.minAspect,\n                update: `${SignalNames.MinCellWidth} / ${SignalNames.MinCellHeight}`,\n            }, {\n                name: names.target,\n                update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`,\n            }, {\n                name: names.minArea,\n                update: `${SignalNames.MinCellWidth}*${SignalNames.MinCellHeight}`,\n            }, {\n                name: names.aspect,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`,\n            }, {\n                name: names.dataLength,\n                update: `data(${JSON.stringify(ordinalBinData)}).length`,\n            }, {\n                name: names.growColCount,\n                update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${SignalNames.MinCellWidth}), 1)`,\n            }, {\n                name: names.growCellWidth,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`,\n            }, {\n                name: names.fitsArea,\n                update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`,\n            }, {\n                name: names.fits,\n                update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`,\n            }, {\n                name: names.colCount,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`,\n            }, {\n                name: names.cellWidth,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`,\n            }, {\n                name: names.cellHeight,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${SignalNames.MinCellHeight}`,\n            });\n            modifySignal(globalScope.signals.plotHeightOut, 'max', `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n            modifySignal(globalScope.signals.plotWidthOut, 'max', `(${names.cellWidth} * ${names.colCount})`);\n            const signalH = [names.cellHeight, SignalNames.FacetPaddingTop, SignalNames.FacetPaddingBottom].join(' - ');\n            const signalW = [names.cellWidth, SignalNames.FacetPaddingLeft].join(' - ');\n            const signalX = addOffsets(parentScope.offsets.x, `datum[${JSON.stringify(FieldNames.WrapCol)}] * ${names.cellWidth}`, SignalNames.FacetPaddingLeft);\n            const signalY = addOffsets(parentScope.offsets.y, `datum[${JSON.stringify(FieldNames.WrapRow)}] * ${names.cellHeight}`, SignalNames.FacetPaddingTop);\n            const update = {\n                height: {\n                    signal: signalH,\n                },\n                width: {\n                    signal: signalW,\n                },\n                x: {\n                    signal: signalX,\n                },\n                y: {\n                    signal: signalY,\n                },\n            };\n            const offsets = {\n                x: signalX,\n                y: signalY,\n                h: signalH,\n                w: signalW,\n            };\n            const group = {\n                style: 'cell',\n                name: prefix,\n                type: 'group',\n                from: {\n                    data: names.rowColumnDataName,\n                },\n                encode: { update },\n            };\n            addMarks(globalScope.markGroup, group);\n            const sizeSignals = {\n                layoutHeight: `(${names.cellHeight} - ${SignalNames.FacetPaddingTop} - ${SignalNames.FacetPaddingBottom})`,\n                layoutWidth: `(${names.cellWidth} - ${SignalNames.FacetPaddingLeft})`,\n                colCount: names.colCount,\n                rowCount: `ceil(${names.dataLength} / ${names.colCount})`,\n            };\n            if (cellTitles) {\n                addFacetCellTitles(group, sizeSignals, axisTextColor);\n            }\n            return {\n                facetScope: group,\n                sizeSignals,\n                offsets,\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const layoutClasses = {\n        AggregateContainer,\n        AggregateSquare,\n        Band,\n        Cross,\n        Scatter: Scatter$1,\n        Square,\n        Stack,\n        Strip,\n        Treemap,\n        Wrap,\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getImageMark(backgroundImage, allGlobalScales) {\n        const xScale = allGlobalScales.filter(s => s.scales.x)[0].scales.x[0];\n        const yScale = allGlobalScales.filter(s => s.scales.y)[0].scales.y[0];\n        const [xScaleName, yScaleName] = [xScale, yScale].map(s => s.name + (xScale.type === 'band' ? bandScaleLinearSuffix : ''));\n        return {\n            type: 'image',\n            encode: {\n                update: {\n                    url: {\n                        value: backgroundImage.url,\n                    },\n                    aspect: {\n                        value: false,\n                    },\n                    baseline: {\n                        value: 'bottom',\n                    },\n                    height: {\n                        signal: getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top),\n                    },\n                    y: {\n                        signal: getScaledValue(yScaleName, backgroundImage.extents.bottom),\n                    },\n                    width: {\n                        signal: getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left),\n                    },\n                    x: {\n                        signal: getScaledValue(xScaleName, backgroundImage.extents.left),\n                    },\n                },\n            },\n        };\n    }\n    function getScaledSpan(scaleName, low, high) {\n        return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n    }\n    function getScaledValue(scaleName, value) {\n        return `scale('${scaleName}', ${value})`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class SpecBuilder {\n        constructor(props, specContext) {\n            this.props = props;\n            this.specContext = specContext;\n            this.globalSignals = {\n                facetAxesAdjustX: { name: SignalNames.FacetAxesAdjustX, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingLeft.toString() : '0' },\n                facetAxesAdjustY: { name: SignalNames.FacetAxesAdjustY, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingBottom.toString() : '0' },\n                minCellWidth: {\n                    name: SignalNames.MinCellWidth,\n                    update: `${minFacetWidth}`,\n                },\n                minCellHeight: { name: SignalNames.MinCellHeight, update: `${minFacetHeight}` },\n                plotOffsetLeft: { name: SignalNames.PlotOffsetLeft, update: '0' },\n                plotOffsetTop: { name: SignalNames.PlotOffsetTop, update: '0' },\n                plotOffsetBottom: { name: SignalNames.PlotOffsetBottom, update: '0' },\n                plotOffsetRight: { name: SignalNames.PlotOffsetRight, update: '0' },\n                plotHeightOut: { name: SignalNames.PlotHeightOut, update: SignalNames.PlotHeightIn },\n                plotWidthOut: { name: SignalNames.PlotWidthOut, update: SignalNames.PlotWidthIn },\n            };\n        }\n        validate() {\n            const { specContext } = this;\n            const { specCapabilities } = this.props;\n            const { roles } = specCapabilities;\n            const required = roles.filter(r => {\n                switch (typeof r.allowNone) {\n                    case 'boolean':\n                        return !r.allowNone;\n                    case 'undefined':\n                        return true;\n                    case 'function':\n                        return !r.allowNone(specContext);\n                }\n            });\n            const numeric = roles.filter(r => r.excludeCategoric);\n            const errors = required\n                .map(r => {\n                if (specContext.specColumns[r.role]) {\n                    return null;\n                }\n                else {\n                    return `Field ${r.role} is required.`;\n                }\n            })\n                .concat(numeric.map(r => {\n                if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) {\n                    return `Field ${r.role} must be quantitative.`;\n                }\n                else {\n                    return null;\n                }\n            }))\n                .filter(Boolean);\n            const { backgroundImage } = specContext.insight;\n            if (backgroundImage && !backgroundImage.extents) {\n                errors.push('BackgroundImage must have extents.');\n            }\n            return errors;\n        }\n        build() {\n            var _a, _b;\n            const { globalSignals, specContext } = this;\n            const { facetLayout, specCapabilities } = this.props;\n            const { insight, specColumns, specViewOptions } = specContext;\n            const dataName = 'data_source';\n            const { vegaSpec, groupMark } = this.initSpec(dataName);\n            const { topColorField, colorDataName } = addColor({\n                scope: vegaSpec,\n                dataName,\n                specContext,\n                scaleName: ScaleNames.Color,\n                legendDataName: 'data_legend',\n                topLookupName: 'data_topcolorlookup',\n                colorReverseSignalName: SignalNames.ColorReverse,\n            });\n            const globalScope = new GlobalScope({\n                dataName: colorDataName,\n                markGroup: groupMark,\n                scope: vegaSpec,\n                signals: globalSignals,\n            });\n            if (facetLayout) {\n                addSignals(vegaSpec, {\n                    name: SignalNames.FacetPaddingBottom,\n                    update: `${facetLayout.facetPadding.bottom}`,\n                }, {\n                    name: SignalNames.FacetPaddingLeft,\n                    update: `${facetLayout.facetPadding.left}`,\n                }, {\n                    name: SignalNames.FacetPaddingTop,\n                    update: `${facetLayout.facetPadding.top}`,\n                });\n                globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n                globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n            }\n            const { firstScope, finalScope, specResult, allGlobalScales, allEncodingRules, } = this.iterateLayouts(globalScope, (i, innerScope) => {\n                if (facetLayout && i === 0) {\n                    globalScope.zSize = innerScope.offsets.h;\n                }\n            });\n            if (specResult) {\n                return specResult;\n            }\n            if (allGlobalScales.length > 0) {\n                const plotHeightOut = globalSignals.plotHeightOut.name;\n                const plotWidthOut = globalSignals.plotWidthOut.name;\n                const colTitleScale = {\n                    type: 'linear',\n                    name: 'scale_facet_col_title',\n                    domain: [0, 1],\n                    range: [0, { signal: plotWidthOut }],\n                };\n                const rowTitleScale = {\n                    type: 'linear',\n                    name: 'scale_facet_row_title',\n                    domain: [0, 1],\n                    range: [{ signal: plotHeightOut }, 0],\n                };\n                const facetScope = facetLayout ? firstScope : null;\n                const backgroundGroup = facetLayout ? facetScope.facetScope : groupMark;\n                //TODO if capability and numeric x,y\n                if (insight.backgroundImage && specCapabilities.backgroundImage && ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative)) {\n                    //backgroundGroup.encode.update.fill = { value: 'pink' }\n                    if (!backgroundGroup.marks) {\n                        backgroundGroup.marks = [];\n                    }\n                    const imageMark = getImageMark(insight.backgroundImage, allGlobalScales);\n                    backgroundGroup.marks.unshift(imageMark);\n                }\n                const axesScopes = facetLayout ?\n                    addFacetAxesGroupMarks({\n                        globalScope: globalScope.scope,\n                        plotScope: groupMark,\n                        facetScope,\n                        colTitleScale,\n                        rowTitleScale,\n                        colSeqName: 'data_FacetCellColTitles',\n                        rowSeqName: 'data_FacetCellRowTitles',\n                    })\n                    :\n                        {\n                            main: [{\n                                    scope: groupMark,\n                                    lines: true,\n                                    labels: true,\n                                    title: true,\n                                }],\n                        };\n                addGlobalAxes({\n                    globalScope,\n                    allGlobalScales,\n                    axisScales: this.props.axisScales,\n                    plotOffsetSignals: { x: globalSignals.plotOffsetLeft, y: globalSignals.plotOffsetBottom },\n                    axesOffsets: { x: axesOffsetX, y: axesOffsetY },\n                    axesTitlePadding: facetLayout ? { x: axesTitlePaddingFacetX, y: axesTitlePaddingFacetY } : { x: axesTitlePaddingX, y: axesTitlePaddingY },\n                    labelBaseline: { x: 'top', y: 'middle' },\n                    specColumns,\n                    specViewOptions,\n                    axesScopes,\n                    hideZAxis: !!facetLayout,\n                    view: insight.view,\n                });\n            }\n            //add mark to the final scope\n            if (finalScope.mark) {\n                const { update } = finalScope.mark.encode;\n                const outputDataName = 'output';\n                finalScope.mark.from.data = outputDataName;\n                addData(globalScope.markGroup, {\n                    name: outputDataName,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.x,\n                            as: FieldNames.OffsetX,\n                        },\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.y,\n                            as: FieldNames.OffsetY,\n                        },\n                    ],\n                });\n                update.x = {\n                    field: FieldNames.OffsetX,\n                };\n                update.y = {\n                    field: FieldNames.OffsetY,\n                };\n                allEncodingRules.forEach(map => {\n                    for (const key in map) {\n                        if (update[key]) {\n                            const arrIn = map[key];\n                            if (!Array.isArray(update[key])) {\n                                const value = update[key];\n                                const arrOut = [];\n                                update[key] = arrOut;\n                                arrIn.forEach(rule => arrOut.push(rule));\n                                arrOut.push(value);\n                            }\n                            else {\n                                const arrOut = update[key];\n                                arrIn.forEach(rule => arrOut.unshift(rule));\n                            }\n                        }\n                    }\n                });\n                update.fill = fill(specContext, topColorField, ScaleNames.Color);\n                update.opacity = opacity();\n            }\n            return {\n                specCapabilities,\n                vegaSpec,\n            };\n        }\n        initSpec(dataName) {\n            const { globalSignals } = this;\n            const { facetAxesAdjustX, facetAxesAdjustY, minCellWidth, minCellHeight, plotOffsetLeft, plotOffsetBottom, plotOffsetTop, plotOffsetRight, plotHeightOut, plotWidthOut } = globalSignals;\n            const { specContext } = this;\n            const { insight } = specContext;\n            const groupMark = {\n                type: 'group',\n                //style: 'cell',\n                encode: {\n                    update: {\n                        x: { signal: `${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}` },\n                        y: { signal: SignalNames.PlotOffsetTop },\n                        height: { signal: `${SignalNames.PlotHeightOut} - ${SignalNames.FacetAxesAdjustY}` },\n                        width: { signal: `${SignalNames.PlotWidthOut} + ${SignalNames.FacetAxesAdjustX}` },\n                    },\n                },\n            };\n            const inputDataname = 'input';\n            const vegaSpec = {\n                $schema: 'https://vega.github.io/schema/vega/v5.json',\n                //style: 'cell',\n                data: [{ name: inputDataname }, { name: dataName, source: inputDataname, transform: [] }],\n                marks: [groupMark],\n                signals: textSignals(specContext, SignalNames.ViewportHeight).concat([\n                    minCellWidth,\n                    minCellHeight,\n                    {\n                        name: SignalNames.ViewportHeight,\n                        update: `max(${SignalNames.MinCellHeight}, ${insight.size.height})`,\n                    },\n                    {\n                        name: SignalNames.ViewportWidth,\n                        update: `max(${SignalNames.MinCellWidth}, ${insight.size.width})`,\n                    },\n                    plotOffsetLeft,\n                    plotOffsetTop,\n                    plotOffsetBottom,\n                    plotOffsetRight,\n                    facetAxesAdjustX,\n                    facetAxesAdjustY,\n                    {\n                        name: SignalNames.PlotHeightIn,\n                        update: `${SignalNames.ViewportHeight} - ${SignalNames.PlotOffsetBottom} + ${SignalNames.FacetAxesAdjustY}`,\n                    },\n                    {\n                        name: SignalNames.PlotWidthIn,\n                        update: `${SignalNames.ViewportWidth} - ${SignalNames.PlotOffsetLeft} - ${SignalNames.PlotOffsetRight}`,\n                    },\n                    plotHeightOut,\n                    plotWidthOut,\n                    {\n                        name: 'height',\n                        update: `${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut} + ${SignalNames.PlotOffsetBottom} - ${SignalNames.FacetAxesAdjustY}`,\n                    },\n                    {\n                        name: 'width',\n                        update: `${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotOffsetRight}`,\n                    },\n                ]),\n            };\n            return { vegaSpec, groupMark };\n        }\n        iterateLayouts(globalScope, onLayoutBuild) {\n            let specResult;\n            let parentScope = {\n                sizeSignals: globalScope.sizeSignals,\n                offsets: globalScope.offsets,\n            };\n            let firstScope;\n            let childScope;\n            const groupings = [];\n            const { layouts, specCapabilities } = this.props;\n            const allGlobalScales = [];\n            const allEncodingRules = [];\n            for (let i = 0; i < layouts.length; i++) {\n                if (!parentScope)\n                    continue;\n                const buildProps = {\n                    globalScope,\n                    parentScope,\n                    axesScales: this.props.axisScales,\n                    groupings,\n                    id: i,\n                };\n                const layout = this.createLayout(layouts[i], buildProps);\n                try {\n                    childScope = layout.build();\n                    childScope.id = i;\n                    const groupby = layout.getGrouping();\n                    if (groupby) {\n                        groupings.push({\n                            id: i,\n                            groupby,\n                            fieldOps: [\n                                { field: null, op: 'count', as: FieldNames.Count },\n                            ],\n                        });\n                    }\n                    const sumOp = layout.getAggregateSumOp();\n                    if (sumOp) {\n                        groupings[groupings.length - 1].fieldOps.push(sumOp);\n                    }\n                    onLayoutBuild(i, childScope);\n                }\n                catch (e) {\n                    specResult = {\n                        errors: [e.stack],\n                        specCapabilities,\n                        vegaSpec: null,\n                    };\n                    break;\n                }\n                if (childScope && childScope.globalScales) {\n                    allGlobalScales.push(childScope.globalScales);\n                }\n                if (childScope.encodingRuleMap) {\n                    allEncodingRules.push(childScope.encodingRuleMap);\n                }\n                if (i === 0) {\n                    firstScope = childScope;\n                }\n                parentScope = childScope;\n            }\n            return { firstScope, finalScope: parentScope, specResult, allGlobalScales, allEncodingRules };\n        }\n        createLayout(layoutPair, buildProps) {\n            const { layoutType, props } = layoutPair;\n            const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n            const layoutClass = layoutClasses[layoutType];\n            const layout = new layoutClass(layoutBuildProps);\n            layout.id = buildProps.id;\n            return layout;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function build(specContext, currData) {\n        const { specColumns } = specContext;\n        const columns = [\n            specColumns.color,\n            specColumns.facet,\n            specColumns.facetV,\n            specColumns.group,\n            specColumns.size,\n            specColumns.sort,\n            specColumns.x,\n            specColumns.y,\n            specColumns.z,\n        ];\n        inferAll(columns, currData);\n        const specBuilderProps = getSpecBuilderPropsForChart(specContext);\n        const specBuilder = new SpecBuilder(specBuilderProps, specContext);\n        let specResult;\n        if (specBuilder) {\n            try {\n                const errors = specBuilder.validate();\n                if (errors.length) {\n                    specResult = {\n                        errors,\n                        specCapabilities: specBuilderProps.specCapabilities,\n                        vegaSpec: null,\n                    };\n                }\n                else {\n                    specResult = specBuilder.build();\n                }\n            }\n            catch (e) {\n                specResult = {\n                    specCapabilities: null,\n                    vegaSpec: null,\n                    errors: [e.stack],\n                };\n            }\n            if (!specResult.errors) {\n                const data0 = specResult.vegaSpec.data[0];\n                data0.values = currData;\n            }\n        }\n        else {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [`could not build spec for ${specContext.insight.chart}`],\n            };\n        }\n        return specResult;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n\n    var index$2 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        ColorScaleNone: ColorScaleNone,\n        FieldNames: FieldNames,\n        Other: Other,\n        ScaleNames: ScaleNames,\n        SignalNames: SignalNames,\n        build: build,\n        getColumnsFromData: getColumnsFromData,\n        getSpecColumns: getSpecColumns,\n        getStats: getStats,\n        inferAll: inferAll\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const GL_ORDINAL = 'GL_ORDINAL';\n\n    var constants$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        ColorScaleNone: ColorScaleNone,\n        FieldNames: FieldNames,\n        GL_ORDINAL: GL_ORDINAL,\n        ScaleNames: ScaleNames,\n        SignalNames: SignalNames\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function isSearchExpressionGroup(search) {\n        if (!search) {\n            return false;\n        }\n        return !!search.expressions;\n    }\n    function createGroupFromExpression(input) {\n        const output = {\n            expressions: [input],\n        };\n        return output;\n    }\n    function ensureSearchExpressionGroupArray(search) {\n        if (Array.isArray(search)) {\n            return [...search];\n        }\n        else if (isSearchExpressionGroup(search)) {\n            return [search];\n        }\n        else {\n            return [createGroupFromExpression(search)];\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const expressionKeys = Object.keys({\n        clause: null,\n        name: null,\n        operator: null,\n        value: null,\n    });\n    function compareExpression(a, b) {\n        if (a && b) {\n            for (let k = 0; k < expressionKeys.length; k++) {\n                const key = expressionKeys[k];\n                if (a[key] != b[key])\n                    return false;\n            }\n        }\n        else {\n            return !a && !b;\n        }\n        return true;\n    }\n    const groupKeys = Object.keys({\n        clause: null,\n    });\n    function compareGroup(a, b) {\n        for (let k = 0; k < groupKeys.length; k++) {\n            const key = groupKeys[k];\n            if (a[key] != b[key])\n                return false;\n        }\n        if (!a.expressions && !b.expressions)\n            return true;\n        if (!a.expressions || !b.expressions)\n            return false;\n        if (a.expressions.length != b.expressions.length)\n            return false;\n        for (let i = 0; i < a.expressions.length; i++) {\n            if (!compareExpression(a.expressions[i], b.expressions[i]))\n                return false;\n        }\n        return true;\n    }\n    function compare(a, b) {\n        if (a == b)\n            return true;\n        if (!a || !b)\n            return false;\n        const arrs = [a, b].map(ensureSearchExpressionGroupArray);\n        const [arrA, arrB] = arrs;\n        if (arrA.length != arrB.length)\n            return false;\n        for (let i = 0; i < arrA.length; i++) {\n            if (!compareGroup(arrA[i], arrB[i]))\n                return false;\n        }\n        return true;\n    }\n    function startsWith(whole, part) {\n        if (!part)\n            return true;\n        const arrs = [whole, part].map(ensureSearchExpressionGroupArray);\n        const [wholeArray, partArray] = arrs;\n        if (partArray.length > wholeArray.length)\n            return false;\n        for (let i = 0; i < partArray.length; i++) {\n            if (!compareGroup(wholeArray[i], partArray[i]))\n                return false;\n        }\n        return true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function valueToBoolean(value) {\n        if (typeof value === 'string') {\n            switch (value.toLowerCase()) {\n                case 'true':\n                    return true;\n                case 'false':\n                    return false;\n            }\n        }\n        return !!value;\n    }\n    function valueToString(value) {\n        if (value == null) {\n            return '';\n        }\n        switch (typeof value) {\n            case 'string':\n                return value;\n            case 'boolean':\n            case 'number':\n                return value.toString();\n        }\n        return '';\n    }\n    function isStringOperation(ex) {\n        switch (ex.operator) {\n            case 'contains':\n            case '!contains':\n            case 'starts':\n            case '!starts':\n                return true;\n        }\n        return false;\n    }\n    function isnullorEmpty(value) {\n        if (value == null)\n            return true; //double equal sign to also catch undefined\n        if (typeof value === 'string' && value.length === 0)\n            return true;\n        return false;\n    }\n    class Exec {\n        constructor(search, columns) {\n            this.columns = columns;\n            this.groups = ensureSearchExpressionGroupArray(search).map(g => {\n                const expressions = g.expressions.filter(Boolean);\n                expressions.forEach(ex => {\n                    ex.column = this.getColumn(ex.name);\n                    ex.valueBool = valueToBoolean(ex.value);\n                    ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n                    ex.stringOperation = isStringOperation(ex);\n                });\n                const group = Object.assign(Object.assign({}, g), { expressions });\n                return group;\n            });\n        }\n        getColumn(name) {\n            for (let i = 0; i < this.columns.length; i++) {\n                if (this.columns[i].name == name) {\n                    return this.columns[i];\n                }\n            }\n        }\n        runExpressionOnColumn(datum, ex) {\n            const actualDataValue = datum[ex.name];\n            if (ex.operator === 'isnullorEmpty') {\n                return isnullorEmpty(actualDataValue);\n            }\n            else if (ex.operator === '!isnullorEmpty') {\n                return !isnullorEmpty(actualDataValue);\n            }\n            let dataValue = actualDataValue;\n            let expressionValue = ex.value;\n            if (ex.column) {\n                if (ex.column.type === 'string' || ex.stringOperation) {\n                    dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n                    expressionValue = ex.valueLow;\n                }\n                else if (ex.column.type === 'boolean') {\n                    dataValue = valueToBoolean(actualDataValue);\n                    expressionValue = ex.valueBool;\n                }\n                else if (ex.column.quantitative) {\n                    dataValue = +actualDataValue;\n                    expressionValue = +ex.value;\n                }\n            }\n            switch (ex.operator) {\n                case '!=':\n                    return dataValue != expressionValue;\n                case '<':\n                    return dataValue < expressionValue;\n                case '<=':\n                    return dataValue <= expressionValue;\n                case '==':\n                    return dataValue == expressionValue;\n                case '>':\n                    return dataValue > expressionValue;\n                case '>=':\n                    return dataValue >= expressionValue;\n                case 'contains':\n                    return dataValue.indexOf(expressionValue) >= 0;\n                case '!contains':\n                    return dataValue.indexOf(expressionValue) < 0;\n                case 'starts':\n                    return dataValue.indexOf(expressionValue) == 0;\n                case '!starts':\n                    return dataValue.indexOf(expressionValue) !== 0;\n            }\n        }\n        runExpression(datum, ex) {\n            if (ex.name == null) {\n                //run on all columns\n                const group = {\n                    expressions: this.columns.map((column, i) => {\n                        const ex2 = Object.assign(Object.assign({}, ex), { column, name: column.name });\n                        if (i) {\n                            ex2.clause = '||';\n                        }\n                        return ex2;\n                    }),\n                };\n                return this.runGroup(datum, group);\n            }\n            else {\n                return this.runExpressionOnColumn(datum, ex);\n            }\n        }\n        runGroup(datum, group) {\n            let accumulator = this.runExpression(datum, group.expressions[0]);\n            for (let i = 1; i < group.expressions.length; i++) {\n                const ex = group.expressions[i];\n                switch (ex.clause) {\n                    case '&&':\n                        accumulator = accumulator && this.runExpression(datum, ex);\n                        break;\n                    case '||':\n                        accumulator = accumulator || this.runExpression(datum, ex);\n                        break;\n                }\n            }\n            return accumulator;\n        }\n        run(datum) {\n            let accumulator = this.runGroup(datum, this.groups[0]);\n            for (let i = 1; i < this.groups.length; i++) {\n                const group = this.groups[i];\n                switch (group.clause) {\n                    case '&&':\n                        accumulator = accumulator && this.runGroup(datum, group);\n                        break;\n                    case '||':\n                        accumulator = accumulator || this.runGroup(datum, group);\n                        break;\n                }\n            }\n            return accumulator;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function invertSearchExpressionGroup(input) {\n        //this only works if all expressions in this group have the same clause\n        const output = {\n            expressions: input.expressions.map(invertSearchExpression),\n        };\n        if (input.clause) {\n            output.clause = invertedClauses[input.clause];\n        }\n        return output;\n    }\n    const invertedOperators = {\n        '!=': '==',\n        '==': '!=',\n        '<': '>=',\n        '>=': '<',\n        '<=': '>',\n        '>': '<=',\n        '!contains': 'contains',\n        'contains': '!contains',\n        '!isnullorEmpty': 'isnullorEmpty',\n        'isnullorEmpty': '!isnullorEmpty',\n        '!starts': 'starts',\n        'starts': '!starts',\n    };\n    const invertedClauses = {\n        '&&': '||',\n        '||': '&&',\n    };\n    function invertSearchExpression(input) {\n        const operator = invertedOperators[input.operator];\n        const output = Object.assign(Object.assign({}, input), { operator });\n        if (input.clause) {\n            output.clause = invertedClauses[input.clause];\n        }\n        return output;\n    }\n    function invert$1(search) {\n        if (Array.isArray(search)) {\n            return search.map(invertSearchExpressionGroup);\n        }\n        else if (isSearchExpressionGroup(search)) {\n            return invertSearchExpressionGroup(search);\n        }\n        else {\n            return invertSearchExpression(search);\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function narrow(a, b) {\n        if (!a) {\n            return b;\n        }\n        const arrs = [a, b].map(ensureSearchExpressionGroupArray);\n        const [arrA, arrB] = arrs;\n        arrB[0].clause = '&&';\n        return arrA.concat(arrB);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n\n    var index$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        Exec: Exec,\n        compare: compare,\n        compareExpression: compareExpression,\n        compareGroup: compareGroup,\n        createGroupFromExpression: createGroupFromExpression,\n        ensureSearchExpressionGroupArray: ensureSearchExpressionGroupArray,\n        invert: invert$1,\n        isSearchExpressionGroup: isSearchExpressionGroup,\n        narrow: narrow,\n        startsWith: startsWith\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n\n    var types$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null\n    });\n\n    const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n    /**\n     * Decamelizes a string with/without a custom separator (hyphen by default).\n     * from: https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript\n     *\n     * @param str String in camelcase\n     * @param separator Separator for the new decamelized string.\n     */\n    function decamelize(str, separator = '-') {\n        return str\n            .replace(/([a-z\\d])([A-Z])/g, '$1' + separator + '$2')\n            .replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, '$1' + separator + '$2')\n            .toLowerCase();\n    }\n    function createElement(tag, attrs, ...children) {\n        if (typeof tag === 'function') {\n            const fn = tag;\n            let props = attrs;\n            // Handle case where props is null but children are provided\n            if (props === null || props === undefined) {\n                props = { children };\n            }\n            else {\n                props.children = children;\n            }\n            return fn(props);\n        }\n        else {\n            const ns = (tag === 'svg') ? SVG_NAMESPACE : null;\n            const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n            const map = attrs;\n            let ref;\n            for (let name in map) {\n                if (name && map.hasOwnProperty(name)) {\n                    let value = map[name];\n                    if (name === 'className' && value !== void 0) {\n                        setAttribute(el, ns, 'class', value.toString());\n                    }\n                    else if (name === 'disabled' && !value) ;\n                    else if (value === null || value === undefined) {\n                        continue;\n                    }\n                    else if (value === true) {\n                        setAttribute(el, ns, name, name);\n                    }\n                    else if (typeof value === 'function') {\n                        if (name === 'ref') {\n                            ref = value;\n                        }\n                        else {\n                            el[name.toLowerCase()] = value;\n                        }\n                    }\n                    else if (typeof value === 'object') {\n                        setAttribute(el, ns, name, flatten(value));\n                    }\n                    else {\n                        setAttribute(el, ns, name, value.toString());\n                    }\n                }\n            }\n            if (children && children.length > 0) {\n                appendChildren(el, children);\n            }\n            if (ref) {\n                ref(el);\n            }\n            return el;\n        }\n    }\n    function setAttribute(el, ns, name, value) {\n        if (ns) {\n            el.setAttributeNS(null, name, value);\n        }\n        else {\n            el.setAttribute(name, value);\n        }\n    }\n    function flatten(o) {\n        const arr = [];\n        for (let prop in o)\n            arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n        return arr.join(';');\n    }\n    function isInsideForeignObject(element) {\n        let current = element;\n        while (current) {\n            if (current.tagName.toLowerCase() === 'foreignobject') {\n                return true;\n            }\n            current = current.parentElement;\n        }\n        return false;\n    }\n    function recreateWithSvgNamespace(element) {\n        const svgElement = document.createElementNS(SVG_NAMESPACE, element.tagName.toLowerCase());\n        // Copy attributes\n        for (let i = 0; i < element.attributes.length; i++) {\n            const attr = element.attributes[i];\n            svgElement.setAttributeNS(null, attr.name, attr.value);\n        }\n        // Copy event handlers and other properties\n        // Common event handlers that need to be copied\n        const eventProperties = ['onclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmouseout',\n            'onmousemove', 'onkeydown', 'onkeyup', 'onkeypress', 'onfocus', 'onblur'];\n        for (const prop of eventProperties) {\n            if (element[prop]) {\n                svgElement[prop] = element[prop];\n            }\n        }\n        // Copy children recursively\n        for (let i = 0; i < element.childNodes.length; i++) {\n            const child = element.childNodes[i];\n            if (child.nodeType === Node.ELEMENT_NODE) {\n                svgElement.appendChild(recreateWithSvgNamespace(child));\n            }\n            else {\n                svgElement.appendChild(child.cloneNode(true));\n            }\n        }\n        return svgElement;\n    }\n    function addChild(parentElement, child) {\n        if (child === null || child === undefined || typeof child === \"boolean\") {\n            return;\n        }\n        else if (Array.isArray(child)) {\n            appendChildren(parentElement, child);\n        }\n        else if (isElement(child)) {\n            const childEl = child;\n            // If parent is SVG and child was created with wrong namespace, recreate it\n            // Exception: don't recreate elements inside foreignObject as they should remain HTML\n            if (parentElement.namespaceURI === SVG_NAMESPACE &&\n                childEl.namespaceURI !== SVG_NAMESPACE &&\n                childEl.tagName.toLowerCase() !== 'foreignobject' &&\n                !isInsideForeignObject(parentElement)) {\n                const recreated = recreateWithSvgNamespace(childEl);\n                parentElement.appendChild(recreated);\n            }\n            else {\n                parentElement.appendChild(childEl);\n            }\n        }\n        else {\n            parentElement.appendChild(document.createTextNode(child.toString()));\n        }\n    }\n    function appendChildren(parentElement, children) {\n        children.forEach(child => addChild(parentElement, child));\n    }\n    function isElement(el) {\n        //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n        return !!el.nodeType;\n    }\n    function mount(element, container) {\n        container.innerHTML = '';\n        if (element) {\n            addChild(container, element);\n        }\n    }\n    function findElementByChildPositions(childPositions, container) {\n        let element = container || document.body;\n        let childPosition;\n        while (element && childPositions.length) {\n            childPosition = childPositions.shift();\n            element = element.children.item(childPosition);\n        }\n        if (element) {\n            return element;\n        }\n    }\n    function focusActiveElement(element, activeElementInfo) {\n        element.focus();\n        element.scrollTop = activeElementInfo.scrollTop;\n        const input = element;\n        if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) {\n            input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n        }\n    }\n    function setActiveElement(activeElementInfo, container) {\n        if (activeElementInfo) {\n            const element = findElementByChildPositions(activeElementInfo.childPositions, container);\n            if (element) {\n                focusActiveElement(element, activeElementInfo);\n            }\n        }\n    }\n    function getActiveElementInfo(container) {\n        let element = document.activeElement;\n        const { scrollTop, selectionDirection, selectionEnd, selectionStart } = element;\n        const activeElementInfo = {\n            childPositions: [],\n            scrollTop,\n            selectionDirection,\n            selectionEnd,\n            selectionStart\n        };\n        while (element && element !== document.body && element !== container) {\n            activeElementInfo.childPositions.unshift(getChildPosition(element));\n            element = element.parentElement;\n        }\n        if ((element === document.body || element === container) && activeElementInfo.childPositions.length)\n            return activeElementInfo;\n    }\n    function getChildPosition(element) {\n        let childPosition = 0;\n        while (element = element.previousElementSibling)\n            childPosition++;\n        return childPosition;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const KeyCodes = {\n        ENTER: 'Enter',\n    };\n    const Table$1 = (props) => {\n        return (createElement(\"table\", { className: props.className },\n            props.children,\n            props.rows.map((row, i) => (createElement(\"tr\", { className: props.rowClassName || '', onClick: e => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: e => {\n                    if (e.key === KeyCodes.ENTER && props.onRowClick) {\n                        props.onRowClick(e, i);\n                    }\n                } }, row.cells.map((cell, i) => (createElement(\"td\", { className: cell.className || '', title: cell.title || '' }, cell.content))))))));\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * This file is for external facing export only, do not use this for internal references,\n     * as it may cause circular dependencies in Rollup.\n     */\n\n    var controls = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        Table: Table$1\n    });\n\n    /**\n     * Common utilities\n     * @module glMatrix\n     */\n\n    // Configuration Constants\n    var EPSILON = 0.000001;\n    var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\n\n    /**\n     * Sets the type of array used when creating new vectors and matrices\n     *\n     * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n     */\n    function setMatrixArrayType(type) {\n      ARRAY_TYPE = type;\n    }\n\n    /**\n     * 3x3 Matrix\n     * @module mat3\n     */\n\n    /**\n     * Creates a new identity mat3\n     *\n     * @returns {mat3} a new 3x3 matrix\n     */\n    function create$5() {\n      var out = new ARRAY_TYPE(9);\n      if (ARRAY_TYPE != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[5] = 0;\n        out[6] = 0;\n        out[7] = 0;\n      }\n      out[0] = 1;\n      out[4] = 1;\n      out[8] = 1;\n      return out;\n    }\n\n    /**\n     * Copies the upper-left 3x3 values into the given mat3.\n     *\n     * @param {mat3} out the receiving 3x3 matrix\n     * @param {ReadonlyMat4} a   the source 4x4 matrix\n     * @returns {mat3} out\n     */\n    function fromMat4(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      out[3] = a[4];\n      out[4] = a[5];\n      out[5] = a[6];\n      out[6] = a[8];\n      out[7] = a[9];\n      out[8] = a[10];\n      return out;\n    }\n\n    /**\n     * Create a new mat3 with the given values\n     *\n     * @param {Number} m00 Component in column 0, row 0 position (index 0)\n     * @param {Number} m01 Component in column 0, row 1 position (index 1)\n     * @param {Number} m02 Component in column 0, row 2 position (index 2)\n     * @param {Number} m10 Component in column 1, row 0 position (index 3)\n     * @param {Number} m11 Component in column 1, row 1 position (index 4)\n     * @param {Number} m12 Component in column 1, row 2 position (index 5)\n     * @param {Number} m20 Component in column 2, row 0 position (index 6)\n     * @param {Number} m21 Component in column 2, row 1 position (index 7)\n     * @param {Number} m22 Component in column 2, row 2 position (index 8)\n     * @returns {mat3} A new mat3\n     */\n    function fromValues$5(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n      var out = new ARRAY_TYPE(9);\n      out[0] = m00;\n      out[1] = m01;\n      out[2] = m02;\n      out[3] = m10;\n      out[4] = m11;\n      out[5] = m12;\n      out[6] = m20;\n      out[7] = m21;\n      out[8] = m22;\n      return out;\n    }\n\n    /**\n     * Calculates a 3x3 matrix from the given quaternion\n     *\n     * @param {mat3} out mat3 receiving operation result\n     * @param {ReadonlyQuat} q Quaternion to create matrix from\n     *\n     * @returns {mat3} out\n     */\n    function fromQuat$1(out, q) {\n      var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n      var x2 = x + x;\n      var y2 = y + y;\n      var z2 = z + z;\n      var xx = x * x2;\n      var yx = y * x2;\n      var yy = y * y2;\n      var zx = z * x2;\n      var zy = z * y2;\n      var zz = z * z2;\n      var wx = w * x2;\n      var wy = w * y2;\n      var wz = w * z2;\n      out[0] = 1 - yy - zz;\n      out[3] = yx - wz;\n      out[6] = zx + wy;\n      out[1] = yx + wz;\n      out[4] = 1 - xx - zz;\n      out[7] = zy - wx;\n      out[2] = zx - wy;\n      out[5] = zy + wx;\n      out[8] = 1 - xx - yy;\n      return out;\n    }\n\n    /**\n     * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n     * @module mat4\n     */\n\n    /**\n     * Creates a new identity mat4\n     *\n     * @returns {mat4} a new 4x4 matrix\n     */\n    function create$4() {\n      var out = new ARRAY_TYPE(16);\n      if (ARRAY_TYPE != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[4] = 0;\n        out[6] = 0;\n        out[7] = 0;\n        out[8] = 0;\n        out[9] = 0;\n        out[11] = 0;\n        out[12] = 0;\n        out[13] = 0;\n        out[14] = 0;\n      }\n      out[0] = 1;\n      out[5] = 1;\n      out[10] = 1;\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Copy the values from one mat4 to another\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the source matrix\n     * @returns {mat4} out\n     */\n    function copy$5(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      out[3] = a[3];\n      out[4] = a[4];\n      out[5] = a[5];\n      out[6] = a[6];\n      out[7] = a[7];\n      out[8] = a[8];\n      out[9] = a[9];\n      out[10] = a[10];\n      out[11] = a[11];\n      out[12] = a[12];\n      out[13] = a[13];\n      out[14] = a[14];\n      out[15] = a[15];\n      return out;\n    }\n\n    /**\n     * Create a new mat4 with the given values\n     *\n     * @param {Number} m00 Component in column 0, row 0 position (index 0)\n     * @param {Number} m01 Component in column 0, row 1 position (index 1)\n     * @param {Number} m02 Component in column 0, row 2 position (index 2)\n     * @param {Number} m03 Component in column 0, row 3 position (index 3)\n     * @param {Number} m10 Component in column 1, row 0 position (index 4)\n     * @param {Number} m11 Component in column 1, row 1 position (index 5)\n     * @param {Number} m12 Component in column 1, row 2 position (index 6)\n     * @param {Number} m13 Component in column 1, row 3 position (index 7)\n     * @param {Number} m20 Component in column 2, row 0 position (index 8)\n     * @param {Number} m21 Component in column 2, row 1 position (index 9)\n     * @param {Number} m22 Component in column 2, row 2 position (index 10)\n     * @param {Number} m23 Component in column 2, row 3 position (index 11)\n     * @param {Number} m30 Component in column 3, row 0 position (index 12)\n     * @param {Number} m31 Component in column 3, row 1 position (index 13)\n     * @param {Number} m32 Component in column 3, row 2 position (index 14)\n     * @param {Number} m33 Component in column 3, row 3 position (index 15)\n     * @returns {mat4} A new mat4\n     */\n    function fromValues$4(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n      var out = new ARRAY_TYPE(16);\n      out[0] = m00;\n      out[1] = m01;\n      out[2] = m02;\n      out[3] = m03;\n      out[4] = m10;\n      out[5] = m11;\n      out[6] = m12;\n      out[7] = m13;\n      out[8] = m20;\n      out[9] = m21;\n      out[10] = m22;\n      out[11] = m23;\n      out[12] = m30;\n      out[13] = m31;\n      out[14] = m32;\n      out[15] = m33;\n      return out;\n    }\n\n    /**\n     * Set a mat4 to the identity matrix\n     *\n     * @param {mat4} out the receiving matrix\n     * @returns {mat4} out\n     */\n    function identity$2(out) {\n      out[0] = 1;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = 1;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[10] = 1;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Inverts a mat4\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the source matrix\n     * @returns {mat4 | null} out, or null if source matrix is not invertible\n     */\n    function invert(out, a) {\n      var a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n      var a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n      var a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n      var a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n      var b00 = a00 * a11 - a01 * a10;\n      var b01 = a00 * a12 - a02 * a10;\n      var b02 = a00 * a13 - a03 * a10;\n      var b03 = a01 * a12 - a02 * a11;\n      var b04 = a01 * a13 - a03 * a11;\n      var b05 = a02 * a13 - a03 * a12;\n      var b06 = a20 * a31 - a21 * a30;\n      var b07 = a20 * a32 - a22 * a30;\n      var b08 = a20 * a33 - a23 * a30;\n      var b09 = a21 * a32 - a22 * a31;\n      var b10 = a21 * a33 - a23 * a31;\n      var b11 = a22 * a33 - a23 * a32;\n\n      // Calculate the determinant\n      var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n      if (!det) {\n        return null;\n      }\n      det = 1.0 / det;\n      out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n      out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n      out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n      out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n      out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n      out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n      out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n      out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n      out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n      out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n      out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n      out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n      out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n      out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n      out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n      out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n      return out;\n    }\n\n    /**\n     * Multiplies two mat4s\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the first operand\n     * @param {ReadonlyMat4} b the second operand\n     * @returns {mat4} out\n     */\n    function multiply$2(out, a, b) {\n      var a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n      var a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n      var a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n      var a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n      // Cache only the current line of the second matrix\n      var b0 = b[0],\n        b1 = b[1],\n        b2 = b[2],\n        b3 = b[3];\n      out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n      out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n      out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n      out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n      b0 = b[4];\n      b1 = b[5];\n      b2 = b[6];\n      b3 = b[7];\n      out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n      out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n      out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n      out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n      b0 = b[8];\n      b1 = b[9];\n      b2 = b[10];\n      b3 = b[11];\n      out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n      out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n      out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n      out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n      b0 = b[12];\n      b1 = b[13];\n      b2 = b[14];\n      b3 = b[15];\n      out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n      out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n      out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n      out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n      return out;\n    }\n\n    /**\n     * Translate a mat4 by the given vector\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the matrix to translate\n     * @param {ReadonlyVec3} v vector to translate by\n     * @returns {mat4} out\n     */\n    function translate(out, a, v) {\n      var x = v[0],\n        y = v[1],\n        z = v[2];\n      var a00, a01, a02, a03;\n      var a10, a11, a12, a13;\n      var a20, a21, a22, a23;\n      if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n      } else {\n        a00 = a[0];\n        a01 = a[1];\n        a02 = a[2];\n        a03 = a[3];\n        a10 = a[4];\n        a11 = a[5];\n        a12 = a[6];\n        a13 = a[7];\n        a20 = a[8];\n        a21 = a[9];\n        a22 = a[10];\n        a23 = a[11];\n        out[0] = a00;\n        out[1] = a01;\n        out[2] = a02;\n        out[3] = a03;\n        out[4] = a10;\n        out[5] = a11;\n        out[6] = a12;\n        out[7] = a13;\n        out[8] = a20;\n        out[9] = a21;\n        out[10] = a22;\n        out[11] = a23;\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n      }\n      return out;\n    }\n\n    /**\n     * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the matrix to scale\n     * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n     * @returns {mat4} out\n     **/\n    function scale$1(out, a, v) {\n      var x = v[0],\n        y = v[1],\n        z = v[2];\n      out[0] = a[0] * x;\n      out[1] = a[1] * x;\n      out[2] = a[2] * x;\n      out[3] = a[3] * x;\n      out[4] = a[4] * y;\n      out[5] = a[5] * y;\n      out[6] = a[6] * y;\n      out[7] = a[7] * y;\n      out[8] = a[8] * z;\n      out[9] = a[9] * z;\n      out[10] = a[10] * z;\n      out[11] = a[11] * z;\n      out[12] = a[12];\n      out[13] = a[13];\n      out[14] = a[14];\n      out[15] = a[15];\n      return out;\n    }\n\n    /**\n     * Creates a matrix from a vector scaling\n     * This is equivalent to (but much faster than):\n     *\n     *     mat4.identity(dest);\n     *     mat4.scale(dest, dest, vec);\n     *\n     * @param {mat4} out mat4 receiving operation result\n     * @param {ReadonlyVec3} v Scaling vector\n     * @returns {mat4} out\n     */\n    function fromScaling(out, v) {\n      out[0] = v[0];\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = v[1];\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[10] = v[2];\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Creates a matrix from a quaternion rotation, vector translation and vector scale\n     * This is equivalent to (but much faster than):\n     *\n     *     mat4.identity(dest);\n     *     mat4.translate(dest, dest, vec);\n     *     let quatMat = mat4.create();\n     *     mat4.fromQuat(quatMat, quat);\n     *     mat4.multiply(dest, dest, quatMat);\n     *     mat4.scale(dest, dest, scale)\n     *\n     * @param {mat4} out mat4 receiving operation result\n     * @param {quat} q Rotation quaternion\n     * @param {ReadonlyVec3} v Translation vector\n     * @param {ReadonlyVec3} s Scaling vector\n     * @returns {mat4} out\n     */\n    function fromRotationTranslationScale(out, q, v, s) {\n      // Quaternion math\n      var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n      var x2 = x + x;\n      var y2 = y + y;\n      var z2 = z + z;\n      var xx = x * x2;\n      var xy = x * y2;\n      var xz = x * z2;\n      var yy = y * y2;\n      var yz = y * z2;\n      var zz = z * z2;\n      var wx = w * x2;\n      var wy = w * y2;\n      var wz = w * z2;\n      var sx = s[0];\n      var sy = s[1];\n      var sz = s[2];\n      out[0] = (1 - (yy + zz)) * sx;\n      out[1] = (xy + wz) * sx;\n      out[2] = (xz - wy) * sx;\n      out[3] = 0;\n      out[4] = (xy - wz) * sy;\n      out[5] = (1 - (xx + zz)) * sy;\n      out[6] = (yz + wx) * sy;\n      out[7] = 0;\n      out[8] = (xz + wy) * sz;\n      out[9] = (yz - wx) * sz;\n      out[10] = (1 - (xx + yy)) * sz;\n      out[11] = 0;\n      out[12] = v[0];\n      out[13] = v[1];\n      out[14] = v[2];\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n     * This is equivalent to (but much faster than):\n     *\n     *     mat4.identity(dest);\n     *     mat4.translate(dest, dest, vec);\n     *     mat4.translate(dest, dest, origin);\n     *     let quatMat = mat4.create();\n     *     mat4.fromQuat(quatMat, quat);\n     *     mat4.multiply(dest, dest, quatMat);\n     *     mat4.scale(dest, dest, scale)\n     *     mat4.translate(dest, dest, negativeOrigin);\n     *\n     * @param {mat4} out mat4 receiving operation result\n     * @param {quat} q Rotation quaternion\n     * @param {ReadonlyVec3} v Translation vector\n     * @param {ReadonlyVec3} s Scaling vector\n     * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n     * @returns {mat4} out\n     */\n    function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n      // Quaternion math\n      var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n      var x2 = x + x;\n      var y2 = y + y;\n      var z2 = z + z;\n      var xx = x * x2;\n      var xy = x * y2;\n      var xz = x * z2;\n      var yy = y * y2;\n      var yz = y * z2;\n      var zz = z * z2;\n      var wx = w * x2;\n      var wy = w * y2;\n      var wz = w * z2;\n      var sx = s[0];\n      var sy = s[1];\n      var sz = s[2];\n      var ox = o[0];\n      var oy = o[1];\n      var oz = o[2];\n      var out0 = (1 - (yy + zz)) * sx;\n      var out1 = (xy + wz) * sx;\n      var out2 = (xz - wy) * sx;\n      var out4 = (xy - wz) * sy;\n      var out5 = (1 - (xx + zz)) * sy;\n      var out6 = (yz + wx) * sy;\n      var out8 = (xz + wy) * sz;\n      var out9 = (yz - wx) * sz;\n      var out10 = (1 - (xx + yy)) * sz;\n      out[0] = out0;\n      out[1] = out1;\n      out[2] = out2;\n      out[3] = 0;\n      out[4] = out4;\n      out[5] = out5;\n      out[6] = out6;\n      out[7] = 0;\n      out[8] = out8;\n      out[9] = out9;\n      out[10] = out10;\n      out[11] = 0;\n      out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n      out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n      out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Calculates a 4x4 matrix from the given quaternion\n     *\n     * @param {mat4} out mat4 receiving operation result\n     * @param {ReadonlyQuat} q Quaternion to create matrix from\n     *\n     * @returns {mat4} out\n     */\n    function fromQuat(out, q) {\n      var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n      var x2 = x + x;\n      var y2 = y + y;\n      var z2 = z + z;\n      var xx = x * x2;\n      var yx = y * x2;\n      var yy = y * y2;\n      var zx = z * x2;\n      var zy = z * y2;\n      var zz = z * z2;\n      var wx = w * x2;\n      var wy = w * y2;\n      var wz = w * z2;\n      out[0] = 1 - yy - zz;\n      out[1] = yx + wz;\n      out[2] = zx - wy;\n      out[3] = 0;\n      out[4] = yx - wz;\n      out[5] = 1 - xx - zz;\n      out[6] = zy + wx;\n      out[7] = 0;\n      out[8] = zx + wy;\n      out[9] = zy - wx;\n      out[10] = 1 - xx - yy;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Generates a frustum matrix with the given bounds\n     *\n     * @param {mat4} out mat4 frustum matrix will be written into\n     * @param {Number} left Left bound of the frustum\n     * @param {Number} right Right bound of the frustum\n     * @param {Number} bottom Bottom bound of the frustum\n     * @param {Number} top Top bound of the frustum\n     * @param {Number} near Near bound of the frustum\n     * @param {Number} far Far bound of the frustum\n     * @returns {mat4} out\n     */\n    function frustum(out, left, right, bottom, top, near, far) {\n      var rl = 1 / (right - left);\n      var tb = 1 / (top - bottom);\n      var nf = 1 / (near - far);\n      out[0] = near * 2 * rl;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = near * 2 * tb;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = (right + left) * rl;\n      out[9] = (top + bottom) * tb;\n      out[10] = (far + near) * nf;\n      out[11] = -1;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = far * near * 2 * nf;\n      out[15] = 0;\n      return out;\n    }\n\n    /**\n     * Generates a perspective projection matrix with the given bounds.\n     * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n     * which matches WebGL/OpenGL's clip volume.\n     * Passing null/undefined/no value for far will generate infinite projection matrix.\n     *\n     * @param {mat4} out mat4 frustum matrix will be written into\n     * @param {number} fovy Vertical field of view in radians\n     * @param {number} aspect Aspect ratio. typically viewport width/height\n     * @param {number} near Near bound of the frustum\n     * @param {number} far Far bound of the frustum, can be null or Infinity\n     * @returns {mat4} out\n     */\n    function perspectiveNO(out, fovy, aspect, near, far) {\n      var f = 1.0 / Math.tan(fovy / 2);\n      out[0] = f / aspect;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = f;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[11] = -1;\n      out[12] = 0;\n      out[13] = 0;\n      out[15] = 0;\n      if (far != null && far !== Infinity) {\n        var nf = 1 / (near - far);\n        out[10] = (far + near) * nf;\n        out[14] = 2 * far * near * nf;\n      } else {\n        out[10] = -1;\n        out[14] = -2 * near;\n      }\n      return out;\n    }\n\n    /**\n     * Alias for {@link mat4.perspectiveNO}\n     * @function\n     */\n    var perspective = perspectiveNO;\n\n    /**\n     * Generates a look-at matrix with the given eye position, focal point, and up axis.\n     * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n     *\n     * @param {mat4} out mat4 frustum matrix will be written into\n     * @param {ReadonlyVec3} eye Position of the viewer\n     * @param {ReadonlyVec3} center Point the viewer is looking at\n     * @param {ReadonlyVec3} up vec3 pointing up\n     * @returns {mat4} out\n     */\n    function lookAt(out, eye, center, up) {\n      var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n      var eyex = eye[0];\n      var eyey = eye[1];\n      var eyez = eye[2];\n      var upx = up[0];\n      var upy = up[1];\n      var upz = up[2];\n      var centerx = center[0];\n      var centery = center[1];\n      var centerz = center[2];\n      if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) {\n        return identity$2(out);\n      }\n      z0 = eyex - centerx;\n      z1 = eyey - centery;\n      z2 = eyez - centerz;\n      len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n      z0 *= len;\n      z1 *= len;\n      z2 *= len;\n      x0 = upy * z2 - upz * z1;\n      x1 = upz * z0 - upx * z2;\n      x2 = upx * z1 - upy * z0;\n      len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n      if (!len) {\n        x0 = 0;\n        x1 = 0;\n        x2 = 0;\n      } else {\n        len = 1 / len;\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n      }\n      y0 = z1 * x2 - z2 * x1;\n      y1 = z2 * x0 - z0 * x2;\n      y2 = z0 * x1 - z1 * x0;\n      len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n      if (!len) {\n        y0 = 0;\n        y1 = 0;\n        y2 = 0;\n      } else {\n        len = 1 / len;\n        y0 *= len;\n        y1 *= len;\n        y2 *= len;\n      }\n      out[0] = x0;\n      out[1] = y0;\n      out[2] = z0;\n      out[3] = 0;\n      out[4] = x1;\n      out[5] = y1;\n      out[6] = z1;\n      out[7] = 0;\n      out[8] = x2;\n      out[9] = y2;\n      out[10] = z2;\n      out[11] = 0;\n      out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n      out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n      out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Alias for {@link mat4.multiply}\n     * @function\n     */\n    var mul = multiply$2;\n\n    /**\n     * 3 Dimensional Vector\n     * @module vec3\n     */\n\n    /**\n     * Creates a new, empty vec3\n     *\n     * @returns {vec3} a new 3D vector\n     */\n    function create$3() {\n      var out = new ARRAY_TYPE(3);\n      if (ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n      }\n      return out;\n    }\n\n    /**\n     * Creates a new vec3 initialized with values from an existing vector\n     *\n     * @param {ReadonlyVec3} a vector to clone\n     * @returns {vec3} a new 3D vector\n     */\n    function clone$4(a) {\n      var out = new ARRAY_TYPE(3);\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      return out;\n    }\n\n    /**\n     * Calculates the length of a vec3\n     *\n     * @param {ReadonlyVec3} a vector to calculate length of\n     * @returns {Number} length of a\n     */\n    function length(a) {\n      var x = a[0];\n      var y = a[1];\n      var z = a[2];\n      return Math.sqrt(x * x + y * y + z * z);\n    }\n\n    /**\n     * Creates a new vec3 initialized with the given values\n     *\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @returns {vec3} a new 3D vector\n     */\n    function fromValues$3(x, y, z) {\n      var out = new ARRAY_TYPE(3);\n      out[0] = x;\n      out[1] = y;\n      out[2] = z;\n      return out;\n    }\n\n    /**\n     * Copy the values from one vec3 to another\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the source vector\n     * @returns {vec3} out\n     */\n    function copy$4(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      return out;\n    }\n\n    /**\n     * Set the components of a vec3 to the given values\n     *\n     * @param {vec3} out the receiving vector\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @returns {vec3} out\n     */\n    function set$3(out, x, y, z) {\n      out[0] = x;\n      out[1] = y;\n      out[2] = z;\n      return out;\n    }\n\n    /**\n     * Adds two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function add(out, a, b) {\n      out[0] = a[0] + b[0];\n      out[1] = a[1] + b[1];\n      out[2] = a[2] + b[2];\n      return out;\n    }\n\n    /**\n     * Subtracts vector b from vector a\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function subtract(out, a, b) {\n      out[0] = a[0] - b[0];\n      out[1] = a[1] - b[1];\n      out[2] = a[2] - b[2];\n      return out;\n    }\n\n    /**\n     * Multiplies two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function multiply$1(out, a, b) {\n      out[0] = a[0] * b[0];\n      out[1] = a[1] * b[1];\n      out[2] = a[2] * b[2];\n      return out;\n    }\n\n    /**\n     * Returns the minimum of two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function min(out, a, b) {\n      out[0] = Math.min(a[0], b[0]);\n      out[1] = Math.min(a[1], b[1]);\n      out[2] = Math.min(a[2], b[2]);\n      return out;\n    }\n\n    /**\n     * Returns the maximum of two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function max(out, a, b) {\n      out[0] = Math.max(a[0], b[0]);\n      out[1] = Math.max(a[1], b[1]);\n      out[2] = Math.max(a[2], b[2]);\n      return out;\n    }\n\n    /**\n     * Scales a vec3 by a scalar number\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the vector to scale\n     * @param {Number} b amount to scale the vector by\n     * @returns {vec3} out\n     */\n    function scale(out, a, b) {\n      out[0] = a[0] * b;\n      out[1] = a[1] * b;\n      out[2] = a[2] * b;\n      return out;\n    }\n\n    /**\n     * Adds two vec3's after scaling the second operand by a scalar value\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @param {Number} scale the amount to scale b by before adding\n     * @returns {vec3} out\n     */\n    function scaleAndAdd(out, a, b, scale) {\n      out[0] = a[0] + b[0] * scale;\n      out[1] = a[1] + b[1] * scale;\n      out[2] = a[2] + b[2] * scale;\n      return out;\n    }\n\n    /**\n     * Calculates the euclidian distance between two vec3's\n     *\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {Number} distance between a and b\n     */\n    function distance(a, b) {\n      var x = b[0] - a[0];\n      var y = b[1] - a[1];\n      var z = b[2] - a[2];\n      return Math.sqrt(x * x + y * y + z * z);\n    }\n\n    /**\n     * Calculates the squared euclidian distance between two vec3's\n     *\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {Number} squared distance between a and b\n     */\n    function squaredDistance(a, b) {\n      var x = b[0] - a[0];\n      var y = b[1] - a[1];\n      var z = b[2] - a[2];\n      return x * x + y * y + z * z;\n    }\n\n    /**\n     * Calculates the squared length of a vec3\n     *\n     * @param {ReadonlyVec3} a vector to calculate squared length of\n     * @returns {Number} squared length of a\n     */\n    function squaredLength(a) {\n      var x = a[0];\n      var y = a[1];\n      var z = a[2];\n      return x * x + y * y + z * z;\n    }\n\n    /**\n     * Negates the components of a vec3\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a vector to negate\n     * @returns {vec3} out\n     */\n    function negate(out, a) {\n      out[0] = -a[0];\n      out[1] = -a[1];\n      out[2] = -a[2];\n      return out;\n    }\n\n    /**\n     * Normalize a vec3\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a vector to normalize\n     * @returns {vec3} out\n     */\n    function normalize$3(out, a) {\n      var x = a[0];\n      var y = a[1];\n      var z = a[2];\n      var len = x * x + y * y + z * z;\n      if (len > 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n      }\n      out[0] = a[0] * len;\n      out[1] = a[1] * len;\n      out[2] = a[2] * len;\n      return out;\n    }\n\n    /**\n     * Calculates the dot product of two vec3's\n     *\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {Number} dot product of a and b\n     */\n    function dot$1(a, b) {\n      return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n    }\n\n    /**\n     * Computes the cross product of two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function cross(out, a, b) {\n      var ax = a[0],\n        ay = a[1],\n        az = a[2];\n      var bx = b[0],\n        by = b[1],\n        bz = b[2];\n      out[0] = ay * bz - az * by;\n      out[1] = az * bx - ax * bz;\n      out[2] = ax * by - ay * bx;\n      return out;\n    }\n\n    /**\n     * Performs a linear interpolation between two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n     * @returns {vec3} out\n     */\n    function lerp(out, a, b, t) {\n      var ax = a[0];\n      var ay = a[1];\n      var az = a[2];\n      out[0] = ax + t * (b[0] - ax);\n      out[1] = ay + t * (b[1] - ay);\n      out[2] = az + t * (b[2] - az);\n      return out;\n    }\n\n    /**\n     * Transforms the vec3 with a mat4.\n     * 4th vector component is implicitly '1'\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the vector to transform\n     * @param {ReadonlyMat4} m matrix to transform with\n     * @returns {vec3} out\n     */\n    function transformMat4$2(out, a, m) {\n      var x = a[0],\n        y = a[1],\n        z = a[2];\n      var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n      w = w || 1.0;\n      out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n      out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n      out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n      return out;\n    }\n\n    /**\n     * Transforms the vec3 with a mat3.\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the vector to transform\n     * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n     * @returns {vec3} out\n     */\n    function transformMat3(out, a, m) {\n      var x = a[0],\n        y = a[1],\n        z = a[2];\n      out[0] = x * m[0] + y * m[3] + z * m[6];\n      out[1] = x * m[1] + y * m[4] + z * m[7];\n      out[2] = x * m[2] + y * m[5] + z * m[8];\n      return out;\n    }\n\n    /**\n     * Transforms the vec3 with a quat\n     * Can also be used for dual quaternions. (Multiply it with the real part)\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the vector to transform\n     * @param {ReadonlyQuat} q normalized quaternion to transform with\n     * @returns {vec3} out\n     */\n    function transformQuat(out, a, q) {\n      // Fast Vector Rotation using Quaternions by Robert Eisele\n      // https://raw.org/proof/vector-rotation-using-quaternions/\n\n      var qx = q[0],\n        qy = q[1],\n        qz = q[2],\n        qw = q[3];\n      var vx = a[0],\n        vy = a[1],\n        vz = a[2];\n\n      // t = q x v\n      var tx = qy * vz - qz * vy;\n      var ty = qz * vx - qx * vz;\n      var tz = qx * vy - qy * vx;\n\n      // t = 2t\n      tx = tx + tx;\n      ty = ty + ty;\n      tz = tz + tz;\n\n      // v + w t + q x t\n      out[0] = vx + qw * tx + qy * tz - qz * ty;\n      out[1] = vy + qw * ty + qz * tx - qx * tz;\n      out[2] = vz + qw * tz + qx * ty - qy * tx;\n      return out;\n    }\n\n    /**\n     * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n     *\n     * @param {ReadonlyVec3} a The first vector.\n     * @param {ReadonlyVec3} b The second vector.\n     * @returns {Boolean} True if the vectors are equal, false otherwise.\n     */\n    function exactEquals$1(a, b) {\n      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n    }\n\n    /**\n     * Returns whether or not the vectors have approximately the same elements in the same position.\n     *\n     * @param {ReadonlyVec3} a The first vector.\n     * @param {ReadonlyVec3} b The second vector.\n     * @returns {Boolean} True if the vectors are equal, false otherwise.\n     */\n    function equals$2(a, b) {\n      var a0 = a[0],\n        a1 = a[1],\n        a2 = a[2];\n      var b0 = b[0],\n        b1 = b[1],\n        b2 = b[2];\n      return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n    }\n\n    /**\n     * Alias for {@link vec3.length}\n     * @function\n     */\n    var len = length;\n\n    /**\n     * Perform some operation over an array of vec3s.\n     *\n     * @param {Array} a the array of vectors to iterate over\n     * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n     * @param {Number} offset Number of elements to skip at the beginning of the array\n     * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n     * @param {Function} fn Function to call for each vector in the array\n     * @param {Object} [arg] additional argument to pass to fn\n     * @returns {Array} a\n     * @function\n     */\n    (function () {\n      var vec = create$3();\n      return function (a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) {\n          stride = 3;\n        }\n        if (!offset) {\n          offset = 0;\n        }\n        if (count) {\n          l = Math.min(count * stride + offset, a.length);\n        } else {\n          l = a.length;\n        }\n        for (i = offset; i < l; i += stride) {\n          vec[0] = a[i];\n          vec[1] = a[i + 1];\n          vec[2] = a[i + 2];\n          fn(vec, vec, arg);\n          a[i] = vec[0];\n          a[i + 1] = vec[1];\n          a[i + 2] = vec[2];\n        }\n        return a;\n      };\n    })();\n\n    /**\n     * 4 Dimensional Vector\n     * @module vec4\n     */\n\n    /**\n     * Creates a new, empty vec4\n     *\n     * @returns {vec4} a new 4D vector\n     */\n    function create$2() {\n      var out = new ARRAY_TYPE(4);\n      if (ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n      }\n      return out;\n    }\n\n    /**\n     * Creates a new vec4 initialized with values from an existing vector\n     *\n     * @param {ReadonlyVec4} a vector to clone\n     * @returns {vec4} a new 4D vector\n     */\n    function clone$3(a) {\n      var out = new ARRAY_TYPE(4);\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      out[3] = a[3];\n      return out;\n    }\n\n    /**\n     * Creates a new vec4 initialized with the given values\n     *\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @param {Number} w W component\n     * @returns {vec4} a new 4D vector\n     */\n    function fromValues$2(x, y, z, w) {\n      var out = new ARRAY_TYPE(4);\n      out[0] = x;\n      out[1] = y;\n      out[2] = z;\n      out[3] = w;\n      return out;\n    }\n\n    /**\n     * Copy the values from one vec4 to another\n     *\n     * @param {vec4} out the receiving vector\n     * @param {ReadonlyVec4} a the source vector\n     * @returns {vec4} out\n     */\n    function copy$3(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      out[3] = a[3];\n      return out;\n    }\n\n    /**\n     * Set the components of a vec4 to the given values\n     *\n     * @param {vec4} out the receiving vector\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @param {Number} w W component\n     * @returns {vec4} out\n     */\n    function set$2(out, x, y, z, w) {\n      out[0] = x;\n      out[1] = y;\n      out[2] = z;\n      out[3] = w;\n      return out;\n    }\n\n    /**\n     * Normalize a vec4\n     *\n     * @param {vec4} out the receiving vector\n     * @param {ReadonlyVec4} a vector to normalize\n     * @returns {vec4} out\n     */\n    function normalize$2(out, a) {\n      var x = a[0];\n      var y = a[1];\n      var z = a[2];\n      var w = a[3];\n      var len = x * x + y * y + z * z + w * w;\n      if (len > 0) {\n        len = 1 / Math.sqrt(len);\n      }\n      out[0] = x * len;\n      out[1] = y * len;\n      out[2] = z * len;\n      out[3] = w * len;\n      return out;\n    }\n\n    /**\n     * Calculates the dot product of two vec4's\n     *\n     * @param {ReadonlyVec4} a the first operand\n     * @param {ReadonlyVec4} b the second operand\n     * @returns {Number} dot product of a and b\n     */\n    function dot(a, b) {\n      return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n    }\n\n    /**\n     * Transforms the vec4 with a mat4.\n     *\n     * @param {vec4} out the receiving vector\n     * @param {ReadonlyVec4} a the vector to transform\n     * @param {ReadonlyMat4} m matrix to transform with\n     * @returns {vec4} out\n     */\n    function transformMat4$1(out, a, m) {\n      var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n      out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n      out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n      out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n      out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n      return out;\n    }\n\n    /**\n     * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n     *\n     * @param {ReadonlyVec4} a The first vector.\n     * @param {ReadonlyVec4} b The second vector.\n     * @returns {Boolean} True if the vectors are equal, false otherwise.\n     */\n    function exactEquals(a, b) {\n      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n    }\n\n    /**\n     * Perform some operation over an array of vec4s.\n     *\n     * @param {Array} a the array of vectors to iterate over\n     * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n     * @param {Number} offset Number of elements to skip at the beginning of the array\n     * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n     * @param {Function} fn Function to call for each vector in the array\n     * @param {Object} [arg] additional argument to pass to fn\n     * @returns {Array} a\n     * @function\n     */\n    (function () {\n      var vec = create$2();\n      return function (a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) {\n          stride = 4;\n        }\n        if (!offset) {\n          offset = 0;\n        }\n        if (count) {\n          l = Math.min(count * stride + offset, a.length);\n        } else {\n          l = a.length;\n        }\n        for (i = offset; i < l; i += stride) {\n          vec[0] = a[i];\n          vec[1] = a[i + 1];\n          vec[2] = a[i + 2];\n          vec[3] = a[i + 3];\n          fn(vec, vec, arg);\n          a[i] = vec[0];\n          a[i + 1] = vec[1];\n          a[i + 2] = vec[2];\n          a[i + 3] = vec[3];\n        }\n        return a;\n      };\n    })();\n\n    /**\n     * Quaternion in the format XYZW\n     * @module quat\n     */\n\n    /**\n     * Creates a new identity quat\n     *\n     * @returns {quat} a new quaternion\n     */\n    function create$1() {\n      var out = new ARRAY_TYPE(4);\n      if (ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n      }\n      out[3] = 1;\n      return out;\n    }\n\n    /**\n     * Sets a quat from the given angle and rotation axis,\n     * then returns it.\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyVec3} axis the axis around which to rotate\n     * @param {Number} rad the angle in radians\n     * @returns {quat} out\n     **/\n    function setAxisAngle(out, axis, rad) {\n      rad = rad * 0.5;\n      var s = Math.sin(rad);\n      out[0] = s * axis[0];\n      out[1] = s * axis[1];\n      out[2] = s * axis[2];\n      out[3] = Math.cos(rad);\n      return out;\n    }\n\n    /**\n     * Multiplies two quat's\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a the first operand\n     * @param {ReadonlyQuat} b the second operand\n     * @returns {quat} out\n     */\n    function multiply(out, a, b) {\n      var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n      var bx = b[0],\n        by = b[1],\n        bz = b[2],\n        bw = b[3];\n      out[0] = ax * bw + aw * bx + ay * bz - az * by;\n      out[1] = ay * bw + aw * by + az * bx - ax * bz;\n      out[2] = az * bw + aw * bz + ax * by - ay * bx;\n      out[3] = aw * bw - ax * bx - ay * by - az * bz;\n      return out;\n    }\n\n    /**\n     * Rotates a quaternion by the given angle about the X axis\n     *\n     * @param {quat} out quat receiving operation result\n     * @param {ReadonlyQuat} a quat to rotate\n     * @param {number} rad angle (in radians) to rotate\n     * @returns {quat} out\n     */\n    function rotateX(out, a, rad) {\n      rad *= 0.5;\n      var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n      var bx = Math.sin(rad),\n        bw = Math.cos(rad);\n      out[0] = ax * bw + aw * bx;\n      out[1] = ay * bw + az * bx;\n      out[2] = az * bw - ay * bx;\n      out[3] = aw * bw - ax * bx;\n      return out;\n    }\n\n    /**\n     * Rotates a quaternion by the given angle about the Y axis\n     *\n     * @param {quat} out quat receiving operation result\n     * @param {ReadonlyQuat} a quat to rotate\n     * @param {number} rad angle (in radians) to rotate\n     * @returns {quat} out\n     */\n    function rotateY(out, a, rad) {\n      rad *= 0.5;\n      var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n      var by = Math.sin(rad),\n        bw = Math.cos(rad);\n      out[0] = ax * bw - az * by;\n      out[1] = ay * bw + aw * by;\n      out[2] = az * bw + ax * by;\n      out[3] = aw * bw - ay * by;\n      return out;\n    }\n\n    /**\n     * Performs a spherical linear interpolation between two quat\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a the first operand\n     * @param {ReadonlyQuat} b the second operand\n     * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n     * @returns {quat} out\n     */\n    function slerp(out, a, b, t) {\n      // benchmarks:\n      //    http://jsperf.com/quaternion-slerp-implementations\n      var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n      var bx = b[0],\n        by = b[1],\n        bz = b[2],\n        bw = b[3];\n      var omega, cosom, sinom, scale0, scale1;\n\n      // calc cosine\n      cosom = ax * bx + ay * by + az * bz + aw * bw;\n      // adjust signs (if necessary)\n      if (cosom < 0.0) {\n        cosom = -cosom;\n        bx = -bx;\n        by = -by;\n        bz = -bz;\n        bw = -bw;\n      }\n      // calculate coefficients\n      if (1.0 - cosom > EPSILON) {\n        // standard case (slerp)\n        omega = Math.acos(cosom);\n        sinom = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n      } else {\n        // \"from\" and \"to\" quaternions are very close\n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n      }\n      // calculate final values\n      out[0] = scale0 * ax + scale1 * bx;\n      out[1] = scale0 * ay + scale1 * by;\n      out[2] = scale0 * az + scale1 * bz;\n      out[3] = scale0 * aw + scale1 * bw;\n      return out;\n    }\n\n    /**\n     * Calculates the conjugate of a quat\n     * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a quat to calculate conjugate of\n     * @returns {quat} out\n     */\n    function conjugate(out, a) {\n      out[0] = -a[0];\n      out[1] = -a[1];\n      out[2] = -a[2];\n      out[3] = a[3];\n      return out;\n    }\n\n    /**\n     * Creates a quaternion from the given 3x3 rotation matrix.\n     *\n     * NOTE: The resultant quaternion is not normalized, so you should be sure\n     * to renormalize the quaternion yourself where necessary.\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyMat3} m rotation matrix\n     * @returns {quat} out\n     * @function\n     */\n    function fromMat3(out, m) {\n      // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n      // article \"Quaternion Calculus and Fast Animation\".\n      var fTrace = m[0] + m[4] + m[8];\n      var fRoot;\n      if (fTrace > 0.0) {\n        // |w| > 1/2, may as well choose w > 1/2\n        fRoot = Math.sqrt(fTrace + 1.0); // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot; // 1/(4w)\n        out[0] = (m[5] - m[7]) * fRoot;\n        out[1] = (m[6] - m[2]) * fRoot;\n        out[2] = (m[1] - m[3]) * fRoot;\n      } else {\n        // |w| <= 1/2\n        var i = 0;\n        if (m[4] > m[0]) i = 1;\n        if (m[8] > m[i * 3 + i]) i = 2;\n        var j = (i + 1) % 3;\n        var k = (i + 2) % 3;\n        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n      }\n      return out;\n    }\n\n    /**\n     * Creates a new quat initialized with values from an existing quaternion\n     *\n     * @param {ReadonlyQuat} a quaternion to clone\n     * @returns {quat} a new quaternion\n     * @function\n     */\n    var clone$2 = clone$3;\n\n    /**\n     * Creates a new quat initialized with the given values\n     *\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @param {Number} w W component\n     * @returns {quat} a new quaternion\n     * @function\n     */\n    var fromValues$1 = fromValues$2;\n\n    /**\n     * Copy the values from one quat to another\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a the source quaternion\n     * @returns {quat} out\n     * @function\n     */\n    var copy$2 = copy$3;\n\n    /**\n     * Set the components of a quat to the given values\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @param {Number} w W component\n     * @returns {quat} out\n     * @function\n     */\n    var set$1 = set$2;\n\n    /**\n     * Normalize a quat\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a quaternion to normalize\n     * @returns {quat} out\n     * @function\n     */\n    var normalize$1 = normalize$2;\n\n    /**\n     * Returns whether or not the quaternions point approximately to the same direction.\n     *\n     * Both quaternions are assumed to be unit length.\n     *\n     * @param {ReadonlyQuat} a The first unit quaternion.\n     * @param {ReadonlyQuat} b The second unit quaternion.\n     * @returns {Boolean} True if the quaternions are equal, false otherwise.\n     */\n    function equals$1(a, b) {\n      return Math.abs(dot(a, b)) >= 1 - EPSILON;\n    }\n\n    /**\n     * Sets a quaternion to represent the shortest rotation from one\n     * vector to another.\n     *\n     * Both vectors are assumed to be unit length.\n     *\n     * @param {quat} out the receiving quaternion.\n     * @param {ReadonlyVec3} a the initial vector\n     * @param {ReadonlyVec3} b the destination vector\n     * @returns {quat} out\n     */\n    var rotationTo = function () {\n      var tmpvec3 = create$3();\n      var xUnitVec3 = fromValues$3(1, 0, 0);\n      var yUnitVec3 = fromValues$3(0, 1, 0);\n      return function (out, a, b) {\n        var dot = dot$1(a, b);\n        if (dot < -0.999999) {\n          cross(tmpvec3, xUnitVec3, a);\n          if (len(tmpvec3) < 0.000001) cross(tmpvec3, yUnitVec3, a);\n          normalize$3(tmpvec3, tmpvec3);\n          setAxisAngle(out, tmpvec3, Math.PI);\n          return out;\n        } else if (dot > 0.999999) {\n          out[0] = 0;\n          out[1] = 0;\n          out[2] = 0;\n          out[3] = 1;\n          return out;\n        } else {\n          cross(tmpvec3, a, b);\n          out[0] = tmpvec3[0];\n          out[1] = tmpvec3[1];\n          out[2] = tmpvec3[2];\n          out[3] = 1 + dot;\n          return normalize$1(out, out);\n        }\n      };\n    }();\n\n    /**\n     * Performs a spherical linear interpolation with two control points\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a the first operand\n     * @param {ReadonlyQuat} b the second operand\n     * @param {ReadonlyQuat} c the third operand\n     * @param {ReadonlyQuat} d the fourth operand\n     * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n     * @returns {quat} out\n     */\n    (function () {\n      var temp1 = create$1();\n      var temp2 = create$1();\n      return function (out, a, b, c, d, t) {\n        slerp(temp1, a, d, t);\n        slerp(temp2, b, c, t);\n        slerp(out, temp1, temp2, 2 * t * (1 - t));\n        return out;\n      };\n    })();\n\n    /**\n     * Sets the specified quaternion with values corresponding to the given\n     * axes. Each axis is a vec3 and is expected to be unit length and\n     * perpendicular to all other specified axes.\n     *\n     * @param {ReadonlyVec3} view  the vector representing the viewing direction\n     * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n     * @param {ReadonlyVec3} up    the vector representing the local \"up\" direction\n     * @returns {quat} out\n     */\n    (function () {\n      var matr = create$5();\n      return function (out, view, right, up) {\n        matr[0] = right[0];\n        matr[3] = right[1];\n        matr[6] = right[2];\n        matr[1] = up[0];\n        matr[4] = up[1];\n        matr[7] = up[2];\n        matr[2] = -view[0];\n        matr[5] = -view[1];\n        matr[8] = -view[2];\n        return normalize$1(out, fromMat3(out, matr));\n      };\n    })();\n\n    /**\n     * 2 Dimensional Vector\n     * @module vec2\n     */\n\n    /**\n     * Creates a new, empty vec2\n     *\n     * @returns {vec2} a new 2D vector\n     */\n    function create() {\n      var out = new ARRAY_TYPE(2);\n      if (ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n      }\n      return out;\n    }\n\n    /**\n     * Creates a new vec2 initialized with values from an existing vector\n     *\n     * @param {ReadonlyVec2} a vector to clone\n     * @returns {vec2} a new 2D vector\n     */\n    function clone$1(a) {\n      var out = new ARRAY_TYPE(2);\n      out[0] = a[0];\n      out[1] = a[1];\n      return out;\n    }\n\n    /**\n     * Creates a new vec2 initialized with the given values\n     *\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @returns {vec2} a new 2D vector\n     */\n    function fromValues(x, y) {\n      var out = new ARRAY_TYPE(2);\n      out[0] = x;\n      out[1] = y;\n      return out;\n    }\n\n    /**\n     * Copy the values from one vec2 to another\n     *\n     * @param {vec2} out the receiving vector\n     * @param {ReadonlyVec2} a the source vector\n     * @returns {vec2} out\n     */\n    function copy$1(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      return out;\n    }\n\n    /**\n     * Set the components of a vec2 to the given values\n     *\n     * @param {vec2} out the receiving vector\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @returns {vec2} out\n     */\n    function set(out, x, y) {\n      out[0] = x;\n      out[1] = y;\n      return out;\n    }\n\n    /**\n     * Transforms the vec2 with a mat4\n     * 3rd vector component is implicitly '0'\n     * 4th vector component is implicitly '1'\n     *\n     * @param {vec2} out the receiving vector\n     * @param {ReadonlyVec2} a the vector to transform\n     * @param {ReadonlyMat4} m matrix to transform with\n     * @returns {vec2} out\n     */\n    function transformMat4(out, a, m) {\n      var x = a[0];\n      var y = a[1];\n      out[0] = m[0] * x + m[4] * y + m[12];\n      out[1] = m[1] * x + m[5] * y + m[13];\n      return out;\n    }\n\n    /**\n     * Returns whether or not the vectors have approximately the same elements in the same position.\n     *\n     * @param {ReadonlyVec2} a The first vector.\n     * @param {ReadonlyVec2} b The second vector.\n     * @returns {Boolean} True if the vectors are equal, false otherwise.\n     */\n    function equals(a, b) {\n      var a0 = a[0],\n        a1 = a[1];\n      var b0 = b[0],\n        b1 = b[1];\n      return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n    }\n\n    /**\n     * Perform some operation over an array of vec2s.\n     *\n     * @param {Array} a the array of vectors to iterate over\n     * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n     * @param {Number} offset Number of elements to skip at the beginning of the array\n     * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n     * @param {Function} fn Function to call for each vector in the array\n     * @param {Object} [arg] additional argument to pass to fn\n     * @returns {Array} a\n     * @function\n     */\n    (function () {\n      var vec = create();\n      return function (a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) {\n          stride = 2;\n        }\n        if (!offset) {\n          offset = 0;\n        }\n        if (count) {\n          l = Math.min(count * stride + offset, a.length);\n        } else {\n          l = a.length;\n        }\n        for (i = offset; i < l; i += stride) {\n          vec[0] = a[i];\n          vec[1] = a[i + 1];\n          fn(vec, vec, arg);\n          a[i] = vec[0];\n          a[i + 1] = vec[1];\n        }\n        return a;\n      };\n    })();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Constants {\n    }\n    Constants.TWO_PI = 6.283185307179586;\n    Constants.PI = 3.141592653589793;\n    Constants.PI_OVER_TWO = 1.5707963267948966;\n    Constants.PI_OVER_THREE = 1.0471975511965976;\n    Constants.PI_OVER_FOUR = 0.7853981633974483;\n    Constants.PI_OVER_SIX = 0.5235987755982988;\n    Constants.LOG_2 = 0.6931471805599453;\n    Constants.RADIANS_PER_DEGREE = 0.017453292519943295;\n    Constants.DEGREES_PER_RADIAN = 57.29577951308232;\n    Constants.ROOT_TWO = 1.4142135623730951;\n    Constants.ROOT_TWO_OVER_TWO = 0.7071067811865476;\n    Constants.ROOT_THREE = 1.7320508075688772;\n    Constants.ROOT_THREE_OVER_TWO = 0.8660254037844386;\n    Constants.ROOT_THREE_OVER_THREE = 0.5773502691896257;\n    Constants.VECTOR2_ZERO = fromValues(0, 0);\n    Constants.VECTOR2_ONE = fromValues(1, 1);\n    Constants.VECTOR2_UNITX = fromValues(1, 0);\n    Constants.VECTOR2_UNITY = fromValues(0, 1);\n    Constants.VECTOR3_ZERO = fromValues$3(0, 0, 0);\n    Constants.VECTOR3_ONE = fromValues$3(1, 1, 1);\n    Constants.VECTOR3_UNITX = fromValues$3(1, 0, 0);\n    Constants.VECTOR3_UNITY = fromValues$3(0, 1, 0);\n    Constants.VECTOR3_UNITZ = fromValues$3(0, 0, 1);\n    Constants.VECTOR3_REFLECTX = fromValues$3(1, -1, -1);\n    Constants.VECTOR3_REFLECTY = fromValues$3(-1, 1, -1);\n    Constants.VECTOR3_REFLECTZ = fromValues$3(-1, -1, 1);\n    Constants.VECTOR4_ZERO = fromValues$2(0, 0, 0, 0);\n    Constants.VECTOR4_ONE = fromValues$2(1, 1, 1, 1);\n    Constants.VECTOR4_UNITX = fromValues$2(1, 0, 0, 0);\n    Constants.VECTOR4_UNITY = fromValues$2(0, 1, 0, 0);\n    Constants.VECTOR4_UNITZ = fromValues$2(0, 0, 1, 0);\n    Constants.VECTOR4_UNITW = fromValues$2(0, 0, 0, 1);\n    Constants.MAT3_IDENTITY = create$5();\n    Constants.MAT4_IDENTITY = create$4();\n    Constants.MAT4_ROTATION_MINUS_90 = fromValues$4(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n    Constants.QUAT_IDENTITY = create$1();\n    Constants.QUAT_ROTATEX_PLUS_90 = fromValues$1(Constants.ROOT_TWO_OVER_TWO, 0, 0, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEX_MINUS_90 = fromValues$1(-Constants.ROOT_TWO_OVER_TWO, 0, 0, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEY_PLUS_90 = fromValues$1(0, Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEY_MINUS_90 = fromValues$1(0, -Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEZ_PLUS_90 = fromValues$1(0, 0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEZ_MINUS_90 = fromValues$1(0, 0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO);\n    Constants.MILLISECONDS_PER_DAY = 86400000;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class MathHelper {\n        static simpleLinearRegression(points) {\n            const n = points.length;\n            let sumX = 0;\n            let sumY = 0;\n            let sumXY = 0;\n            let sumXX = 0;\n            for (let i = 0; i < n; i++) {\n                sumX += points[i].x;\n                sumY += points[i].y;\n                sumXY += points[i].x * points[i].y;\n                sumXX += points[i].x * points[i].x;\n            }\n            const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n            const yIntercept = (sumY - slope * sumX) / n;\n            return { slope, yIntercept };\n        }\n        static clamp(value, min, max) {\n            return Math.max(Math.min(value, max), min);\n        }\n        static lerp(value1, value2, amount) {\n            return value1 + (value2 - value1) * amount;\n        }\n        static normalize(value, min, max, from = 0, to = 1) {\n            return max - min == 0 ? 0 : Math.max(Math.min((to - from) * (value - min) / (max - min) + from, to), from);\n        }\n        static splitExponent(value, result) {\n            let exponent = Math.round(Math.log10(Math.abs(value)));\n            let coefficient = value / Math.pow(10, exponent);\n            if (coefficient < 1) {\n                coefficient *= 10;\n                exponent--;\n            }\n            result[0] = coefficient;\n            result[1] = exponent;\n        }\n        static combineExponent(mantissa, exponent) {\n            return mantissa * Math.pow(10, exponent);\n        }\n        static isPowerOf2(value) {\n            return (value & (value - 1)) == 0;\n        }\n    }\n    class PseudoRandom {\n        constructor(seed) {\n            this._seed = seed % 2147483647;\n            if (this._seed <= 0)\n                this._seed += 2147483646;\n        }\n        next() {\n            return this._seed = this._seed * 16807 % 2147483647;\n        }\n        ;\n        nextFloat() {\n            return (this.next() - 1) / 2147483646;\n        }\n        ;\n        nextInteger(min, max) {\n            return Math.floor(this.nextFloat() * (max - min + 1) + min);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AngleHelper {\n        static degreesToRadians(degrees) {\n            return degrees * Constants.RADIANS_PER_DEGREE;\n        }\n        static radiansToDegrees(radians) {\n            return radians * Constants.DEGREES_PER_RADIAN;\n        }\n        static wrapAngle(angle) {\n            if (angle > Constants.PI)\n                angle = angle - Constants.TWO_PI;\n            else if (angle < -Constants.PI)\n                angle += Constants.TWO_PI;\n            return angle;\n        }\n        static sphericalToCartesian(altitude, longitude, latitude, result) {\n            latitude = AngleHelper.degreesToRadians(latitude);\n            longitude = AngleHelper.degreesToRadians(longitude);\n            const scale = Math.cos(latitude);\n            result[0] = altitude * scale * Math.sin(longitude);\n            result[1] = altitude * Math.sin(latitude);\n            result[2] = altitude * scale * Math.cos(longitude);\n        }\n        static cartesianToSpherical(x, y, z, result) {\n            result[0] = Math.atan2(x, z);\n            result[1] = Math.asin(y);\n        }\n        static angleBetweenVectors(from, to) {\n            if (exactEquals$1(from, to)) {\n                return 0;\n            }\n            else {\n                const dot = MathHelper.clamp(dot$1(from, to), -1, 1);\n                return Math.acos(dot);\n            }\n        }\n        static signedAngleBetweenVectors(from, to, up) {\n            if (exactEquals$1(from, to)) {\n                return 0;\n            }\n            else {\n                const dot = MathHelper.clamp(dot$1(from, to), -1, 1);\n                let angle = Math.acos(dot);\n                cross(AngleHelper._vec3, from, to);\n                if (dot$1(AngleHelper._vec3, up) < 0) {\n                    angle = -angle;\n                }\n                return angle;\n            }\n        }\n    }\n    AngleHelper._vec3 = create$3();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class CameraBase {\n        getView(view) {\n            this.getPosition(view.position);\n        }\n        setView(view, isSmooth) {\n            this.setPosition(view.position, isSmooth);\n        }\n        lerpView(from, to, time) {\n            lerp(this._vec3, from.position, to.position, time);\n            this.setPosition(this._vec3, false);\n        }\n        get vMatrices() { return this._vMatrices; }\n        get inverseVMatrices() { return this._inverseVMatrices; }\n        get mvMatrices() { return this._mvMatrices; }\n        get pMatrices() { return this._pMatrices; }\n        get inversePMatrices() { return this._inversePMatrices; }\n        get pickVMatrix() { return this._pickVMatrix; }\n        get rMatrix() { return this._mat3; }\n        getOrbit(value) { copy$2(value, this._orbitRotation); }\n        setOrbit(value, isSmooth) {\n            copy$2(this._orbitRotation, value);\n            if (!isSmooth) {\n                copy$2(this._smoothedOrbitRotation, value);\n            }\n        }\n        ;\n        getPosition(value) { copy$4(value, this._cameraPosition); }\n        setPosition(value, isSmooth) {\n            copy$4(this._cameraPosition, value);\n            if (!isSmooth) {\n                copy$4(this._smoothedCameraPosition, value);\n            }\n        }\n        ;\n        constructor(core) {\n            this._core = core;\n            this._vec3 = create$3();\n            this._quat = create$1();\n            this._mat3 = create$5();\n            this._right = create$3();\n            this._up = create$3();\n            this._forward = create$3();\n            this._modelManipulationOrigin = create$3();\n            this.modelPosition = create$3();\n            this.modelScale = create$3();\n            this.modelRotation = create$1();\n            this._orbitRotation = create$1();\n            this._orbitDirection = create$1();\n            this._smoothedOrbitRotation = create$1();\n            this._smoothedCameraPosition = create$3();\n            this._smoothedCameraRotation = create$1();\n            this._cameraPosition = create$3();\n            this._cameraRotation = create$1();\n            this._combinedPosition = create$3();\n            this._combinedRotation = create$1();\n            this._leftToRightEye = create$3();\n            this._pickVMatrix = create$4();\n            this._eyePositions = [create$3(), create$3()];\n            this._vMatrices = [create$4(), create$4()];\n            this._mvMatrices = [create$4(), create$4()];\n            this._pMatrices = [create$4(), create$4()];\n            this._inverseVMatrices = [create$4(), create$4()];\n            this._inversePMatrices = [create$4(), create$4()];\n        }\n        reset(isSmooth) {\n            copy$4(this._cameraPosition, Constants.VECTOR3_ZERO);\n            copy$2(this._cameraRotation, Constants.QUAT_IDENTITY);\n            copy$2(this._orbitRotation, Constants.QUAT_IDENTITY);\n            if (!isSmooth) {\n                this.syncSmooth();\n            }\n        }\n        update(elapsedTime) {\n            let amount = Math.min(elapsedTime * this._core.config.positionSmoothing, 1);\n            lerp(this._smoothedCameraPosition, this._smoothedCameraPosition, this._cameraPosition, amount);\n            amount = Math.min(elapsedTime * this._core.config.rotationSmoothing, 1);\n            slerp(this._smoothedCameraRotation, this._smoothedCameraRotation, this._cameraRotation, amount);\n            slerp(this._smoothedOrbitRotation, this._smoothedOrbitRotation, this._orbitRotation, amount);\n            const epsilon = 0.000001;\n            let x;\n            let y;\n            let z;\n            let w;\n            x = this._smoothedCameraPosition[0] - this._cameraPosition[0];\n            y = this._smoothedCameraPosition[1] - this._cameraPosition[1];\n            z = this._smoothedCameraPosition[2] - this._cameraPosition[2];\n            if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon) {\n                copy$4(this._smoothedCameraPosition, this._cameraPosition);\n            }\n            x = this._smoothedCameraRotation[0] - this._cameraRotation[0];\n            y = this._smoothedCameraRotation[1] - this._cameraRotation[1];\n            z = this._smoothedCameraRotation[2] - this._cameraRotation[2];\n            w = this._smoothedCameraRotation[3] - this._cameraRotation[3];\n            if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon && Math.abs(w) < epsilon) {\n                copy$2(this._smoothedCameraRotation, this._cameraRotation);\n            }\n            x = this._smoothedOrbitRotation[0] - this._orbitRotation[0];\n            y = this._smoothedOrbitRotation[1] - this._orbitRotation[1];\n            z = this._smoothedOrbitRotation[2] - this._orbitRotation[2];\n            w = this._smoothedOrbitRotation[3] - this._orbitRotation[3];\n            if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon && Math.abs(w) < epsilon) {\n                copy$2(this._smoothedOrbitRotation, this._orbitRotation);\n            }\n            normalize$1(this._smoothedCameraRotation, this._smoothedCameraRotation);\n            normalize$1(this._smoothedOrbitRotation, this._smoothedOrbitRotation);\n            conjugate(this._orbitDirection, this._smoothedOrbitRotation);\n            transformMat4$2(this._modelManipulationOrigin, this.modelManipulationOrigin, this.modelMMatrix);\n            subtract(this._vec3, this._smoothedCameraPosition, this._modelManipulationOrigin);\n            transformQuat(this._combinedPosition, this._vec3, this._orbitDirection);\n            add(this._combinedPosition, this._combinedPosition, this._modelManipulationOrigin);\n            multiply(this._combinedRotation, this._orbitDirection, this._smoothedCameraRotation);\n            fromQuat$1(this._mat3, this._combinedRotation);\n            this._right[0] = this._mat3[0];\n            this._right[1] = this._mat3[1];\n            this._right[2] = this._mat3[2];\n            this._up[0] = this._mat3[3];\n            this._up[1] = this._mat3[4];\n            this._up[2] = this._mat3[5];\n            this._forward[0] = this._mat3[6];\n            this._forward[1] = this._mat3[7];\n            this._forward[2] = this._mat3[8];\n            const view = this._vMatrices[0];\n            view[0] = this._right[0];\n            view[1] = this._up[0];\n            view[2] = this._forward[0];\n            view[4] = this._right[1];\n            view[5] = this._up[1];\n            view[6] = this._forward[1];\n            view[8] = this._right[2];\n            view[9] = this._up[2];\n            view[10] = this._forward[2];\n            view[12] = -dot$1(this._right, this._combinedPosition);\n            view[13] = -dot$1(this._up, this._combinedPosition);\n            view[14] = -dot$1(this._forward, this._combinedPosition);\n            const aspectRatio = this.width / this.height;\n            if (this._core.config.stereoMode == StereoMode.none) {\n                if (this._core.config.tilesX != 1 || this._core.config.tilesY != 1) {\n                    const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n                    const bottom = -top;\n                    const left = -aspectRatio * top;\n                    const right = aspectRatio * top;\n                    const width = right - left;\n                    const height = top - bottom;\n                    const tileWidth = width / this._core.config.tilesX;\n                    const tileHeight = height / this._core.config.tilesY;\n                    frustum(this._pMatrices[0], left + this._core.config.tileOffsetX * tileWidth, left + (this._core.config.tileOffsetX + 1) * tileWidth, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY - 1) * tileHeight, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY) * tileHeight, this._core.config.nearPlane, this._core.config.farPlane);\n                }\n                else {\n                    perspective(this.pMatrices[0], this._core.config.fov, aspectRatio, this._core.config.nearPlane, this._core.config.farPlane);\n                }\n                multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n                invert(this._inverseVMatrices[0], this.vMatrices[0]);\n                invert(this._inversePMatrices[0], this.pMatrices[0]);\n            }\n            else {\n                cross(this._leftToRightEye, this._forward, this._up);\n                normalize$3(this._leftToRightEye, this._leftToRightEye);\n                scaleAndAdd(this._eyePositions[0], this._combinedPosition, this._leftToRightEye, -this._core.config.ipd);\n                scaleAndAdd(this._eyePositions[1], this._combinedPosition, this._leftToRightEye, this._core.config.ipd);\n                this._vMatrices[0][12] += this._core.config.ipd * 0.5;\n                copy$5(this._vMatrices[1], this._vMatrices[0]);\n                this._vMatrices[1][12] -= this._core.config.ipd;\n                const frustumShift = this._core.config.ipd * 0.5 * this._core.config.nearPlane / this._core.config.screenDistance;\n                const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n                const bottom = -top;\n                let left = -aspectRatio * top + frustumShift;\n                let right = aspectRatio * top + frustumShift;\n                frustum(this._pMatrices[0], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n                left = -aspectRatio * top - frustumShift;\n                right = aspectRatio * top - frustumShift;\n                frustum(this._pMatrices[1], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n                multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n                multiply$2(this._mvMatrices[1], this._vMatrices[1], this.modelMMatrix);\n                invert(this._inverseVMatrices[0], this._vMatrices[0]);\n                invert(this._inversePMatrices[0], this._pMatrices[0]);\n                copy$5(this._inverseVMatrices[1], this._inverseVMatrices[0]);\n                this._inverseVMatrices[1][12] += this._core.config.ipd;\n                invert(this._inversePMatrices[1], this._pMatrices[1]);\n            }\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`cam off ${this._cameraPosition[0] < 0 ? \"\" : \" \"}${this._cameraPosition[0].toFixed(3)},${this._cameraPosition[1] < 0 ? \"\" : \" \"}${this._cameraPosition[1].toFixed(3)},${this._cameraPosition[2] < 0 ? \"\" : \" \"}${this._cameraPosition[2].toFixed(3)}`);\n                this._core.debugText.addLine(`cam pos ${this._combinedPosition[0] < 0 ? \"\" : \" \"}${this._combinedPosition[0].toFixed(3)},${this._combinedPosition[1] < 0 ? \"\" : \" \"}${this._combinedPosition[1].toFixed(3)},${this._combinedPosition[2] < 0 ? \"\" : \" \"}${this._combinedPosition[2].toFixed(3)}`);\n                this._core.debugText.addLine(`cam rot ${this._combinedRotation[0] < 0 ? \"\" : \" \"}${this._combinedRotation[0].toFixed(3)},${this._combinedRotation[1] < 0 ? \"\" : \" \"}${this._combinedRotation[1].toFixed(3)},${this._combinedRotation[2] < 0 ? \"\" : \" \"}${this._combinedRotation[2].toFixed(3)},${this._combinedRotation[3] < 0 ? \"\" : \" \"}${this._combinedRotation[3].toFixed(3)}`);\n            }\n        }\n        _zoom(direction, distance) {\n            scaleAndAdd(this._cameraPosition, this._cameraPosition, direction, distance);\n        }\n        rotate(translationDelta) { }\n        zoom(zoomDelta, x, y) {\n            this.unproject(this._vec3, x, y, 1);\n            normalize$3(this._vec3, this._vec3);\n            const distance$1 = zoomDelta * distance(this._combinedPosition, this.modelPosition);\n            transformQuat(this._vec3, this._vec3, this._orbitRotation);\n            this._zoom(this._vec3, distance$1);\n        }\n        _twist(axis, angle) { }\n        twist(angle, x, y) { }\n        updatePickVMatrix(x, y) {\n            this.unproject(this._vec3, x, y, 1);\n            lookAt(this._pickVMatrix, this._combinedPosition, this._vec3, this._up);\n        }\n        syncSmooth() {\n            copy$4(this._smoothedCameraPosition, this._cameraPosition);\n            copy$2(this._smoothedCameraRotation, this._cameraRotation);\n            copy$2(this._smoothedOrbitRotation, this._orbitRotation);\n        }\n        updateModelManipulationOrigin(from, to) {\n            const a = create$3();\n            const b = create$3();\n            const c = create$3();\n            const d = create$3();\n            transformMat4$2(a, from, this.modelMMatrix);\n            transformMat4$2(b, to, this.modelMMatrix);\n            subtract(a, this._cameraPosition, a);\n            subtract(b, this._cameraPosition, b);\n            transformQuat(c, a, this._orbitDirection);\n            transformQuat(d, b, this._orbitDirection);\n            subtract(c, c, a);\n            subtract(d, d, b);\n            subtract(this._vec3, c, d);\n            transformQuat(this._vec3, this._vec3, this._orbitRotation);\n            add(this._cameraPosition, this._cameraPosition, this._vec3);\n            add(this._smoothedCameraPosition, this._smoothedCameraPosition, this._vec3);\n        }\n        unproject(position, x, y, z) {\n            set$3(position, 2 * x / this.width - 1, 1 - 2 * y / this.height, z);\n            transformMat4$2(position, position, this._inversePMatrices[0]);\n            transformMat4$2(position, position, this._inverseVMatrices[0]);\n        }\n        translate(translationDelta) {\n            const distance$1 = distance(this.modelPosition, this._combinedPosition);\n            const height = 2 * Math.tan(this._core.config.fov / 2) * distance$1 / this.height;\n            set$3(this._vec3, height * translationDelta[0], -height * translationDelta[1], 0);\n            transformQuat(this._vec3, this._vec3, this._combinedRotation);\n            transformQuat(this._vec3, this._vec3, this._orbitRotation);\n            subtract(this._cameraPosition, this._cameraPosition, this._vec3);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AltAzimuthCamera extends CameraBase {\n        getView(view) {\n            super.getView(view);\n            view.altitude = this.altitude;\n            view.azimuth = this.azimuth;\n            view.fov = this._core.config.fov;\n        }\n        setView(view, isSmooth) {\n            super.setView(view, isSmooth);\n            this.setAltAzimuth(view.altitude, view.azimuth, isSmooth);\n            this._core.config.fov = view.fov;\n        }\n        lerpView(from, to, time) {\n            super.lerpView(from, to, time);\n            this.setAltAzimuth(MathHelper.lerp(from.altitude, to.altitude, time), MathHelper.lerp(from.azimuth, to.azimuth, time), false);\n            this._core.config.fov = MathHelper.lerp(from.fov, to.fov, time);\n        }\n        update(elapsedTime) {\n            super.update(elapsedTime);\n            if (this._core.config.isDebugVisible) {\n                const altitude = AngleHelper.radiansToDegrees(this.altitude);\n                const azimuth = AngleHelper.radiansToDegrees(this.azimuth);\n                this._core.debugText.addLine(`cam alt ${altitude < 0 ? \"\" : \" \"}${altitude.toFixed(1)}`);\n                this._core.debugText.addLine(`cam azi ${azimuth < 0 ? \"\" : \" \"}${azimuth.toFixed(1)}`);\n            }\n        }\n        get altitude() {\n            transformQuat(this._up, Constants.VECTOR3_UNITY, this._combinedRotation);\n            transformQuat(this._right, Constants.VECTOR3_UNITX, this._combinedRotation);\n            return -AngleHelper.signedAngleBetweenVectors(Constants.VECTOR3_UNITY, this._up, this._right);\n        }\n        get azimuth() {\n            transformQuat(this._up, Constants.VECTOR3_UNITY, this._combinedRotation);\n            transformQuat(this._right, Constants.VECTOR3_UNITX, this._combinedRotation);\n            return -AngleHelper.signedAngleBetweenVectors(Constants.VECTOR3_UNITX, this._right, this._up);\n        }\n        setAltAzimuth(altitude, azimuth, isSmooth) {\n            setAxisAngle(this._quat, Constants.VECTOR3_UNITX, altitude);\n            multiply(this._orbitRotation, this._quat, Constants.QUAT_IDENTITY);\n            setAxisAngle(this._quat, Constants.VECTOR3_UNITY, azimuth);\n            multiply(this._orbitRotation, this._orbitRotation, this._quat);\n            if (!isSmooth) {\n                this.syncSmooth();\n            }\n        }\n        rotate(translationDelta) {\n            const length = Math.min(this.width, this.height);\n            let angle = translationDelta[1] * Constants.PI / length;\n            setAxisAngle(this._quat, Constants.VECTOR3_UNITX, angle);\n            multiply(this._orbitRotation, this._quat, this._orbitRotation);\n            angle = translationDelta[0] * Constants.PI / length;\n            setAxisAngle(this._quat, Constants.VECTOR3_UNITY, angle);\n            multiply(this._orbitRotation, this._orbitRotation, this._quat);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Config$2 = class Config {\n        constructor(core) {\n            this.reset();\n        }\n        reset() {\n            this.isDebugVisible = false;\n            this.logLevel = LogLevel.warn;\n            this.shaderPath = \"shaders\";\n            this.fontPath = \"fonts\";\n            this.modelDistance = 0.5;\n            this.modelSize = 0.25;\n            this.stereoMode = StereoMode.none;\n            this.ipd = 0.06;\n            this.screenDistance = 0.5;\n            this.fov = AngleHelper.degreesToRadians(30);\n            this.nearPlane = 0.01;\n            this.farPlane = 100;\n            this.pickWidth = 512;\n            this.pickHeight = 512;\n            this.pickHoldDelay = 1000;\n            this.pickSelectDelay = 100;\n            this.resizeMinimumDelay = 250;\n            this.rotationSmoothing = 0.02;\n            this.positionSmoothing = 0.02;\n            this.focusSmoothing = 0.01;\n            this.scaleSmoothing = 0.02;\n            this.mouseWheelZoomScale = -2e-3;\n            this.mouseWheelRotationScale = -2e-3;\n            this.dragToleranceSquared = 100;\n            this.manipulatorMinRelativeDistanceSquared = 100;\n            this.isMultiTouchEnabled = true;\n            this.isMultiTouchZoomEnabled = true;\n            this.isMultiTouchTwistEnabled = true;\n            this.isMultiTouchRotateEnabled = true;\n            this.isMultiTouchTranslateEnabled = true;\n            this.multiTouchZoomScale = 1;\n            this.cameraMinDistance = 0.1;\n            this.cameraMaxDistance = 10;\n            this.xrControllerRayColor = fromValues$3(0.5, 0.5, 0.5);\n            this.xrControllerProfile = \"windows-mixed-reality\";\n            this.xrControllerHandedness = \"right\";\n            this.paletteColor = new Uint8Array([0x80, 0x80, 0x80, 0]);\n            this.textColor = create$3();\n            this.textHoverColor = create$3();\n            this.textBorderColor = create$3();\n            this.textBorderWidth = 0x18 / 0xff;\n            this.identityRotation = Constants.VECTOR3_UNITY;\n            this.axesTextLabelMaxGlyphs = 32;\n            this.axesTextColor = create$3();\n            this.axesTextBorderColor = create$3();\n            this.axesTextHoverColor = create$3();\n            this.axesTextLabelMajorSize = 0.03;\n            this.axesTextLabelMinorSize = 0.02;\n            this.axesTextTitleMaxGlyphs = 127;\n            this.axesTextTitleSize = 0.05;\n            this.axesTextHeadingMaxGlyphs = 128;\n            this.axesTextHeadingSize = 0.075;\n            this.axesTextTitleLineHeight = 1.5;\n            this.axesTextHeadingLineHeight = 1.5;\n            this.axesTextLabelLineHeight = 1.5;\n            this.axesGridMajorThickness = 0.0002;\n            this.axesGridMinorThickness = 0.0001;\n            this.axesGridZeroThickness = 0.002;\n            this.axesGridPickDivisionHeight = 0.025;\n            this.axesGridBackgroundColor = create$3();\n            this.axesGridHighlightColor = create$3();\n            this.axesGridMinorColor = create$3();\n            this.axesGridMajorColor = create$3();\n            this.axesGridZeroColor = create$3();\n            this.axesGridDefaultDivisions = 10;\n            this.keyTitleMaxGlyphs = 64;\n            this.keyLabelMaxGlyphs = 64;\n            this.selectionColor = create$3();\n            this.hoverColor = create$3();\n            this.activeColor = create$3();\n            this.highlightMode = HighlightMode.color;\n            this.lassoThickness = 4;\n            this.lassoDashWidth = 2;\n            this.lassoColor = create$3();\n            this.minCubifiedTreeMapSlice = 0.01;\n            this.sdfBuffer = 0xc0;\n            this.sdfBorder = 0x0;\n            this.forceDirectIsEnabled = false;\n            this.forceDirectAttraction = 1;\n            this.forceDirectRepulsion = 1;\n            this.forceDirectGravity = 1;\n            this.forceDirectInterval = 0.1;\n            this.forceDirectMaxDistance = 0.1;\n            this.forceDirectTheta = 1;\n            this.forceDirectIterationsPerLayout = 1;\n            this.forceDirectEdgeWeightPower = 1;\n            this.forceDirectLockX = false;\n            this.forceDirectLockY = false;\n            this.forceDirectLockZ = false;\n            this.transitionDuration = 400;\n            this.transitionStaggering = 100;\n            this.transitionView = true;\n            this.isTransitionPickingEnabled = false;\n            this.backgroundColor = create$2();\n            this.theme = Theme.light;\n            this.ambientColor = create$3();\n            this.renderMode = RenderMode.color;\n            this.tilesX = 1;\n            this.tilesY = 1;\n            this.tileOffsetX = 0;\n            this.tileOffsetY = 0;\n        }\n        get theme() { return this._theme; }\n        set theme(value) {\n            if (this._theme != value) {\n                this._theme = value;\n                switch (value) {\n                    case Theme.dark:\n                        set$2(this.backgroundColor, 0, 0, 0, 1);\n                        set$3(this.textColor, 0.9, 0.9, 0.9);\n                        set$3(this.textHoverColor, 1, 1, 1);\n                        set$3(this.textBorderColor, 0, 0, 0);\n                        set$3(this.axesTextColor, 0.9, 0.9, 0.9);\n                        set$3(this.axesTextBorderColor, 0, 0, 0);\n                        set$3(this.axesTextHoverColor, 1, 1, 1);\n                        set$3(this.axesGridBackgroundColor, 0.02, 0.02, 0.02);\n                        set$3(this.axesGridHighlightColor, 0.04, 0.04, 0.04);\n                        set$3(this.axesGridMinorColor, 0.05, 0.05, 0.05);\n                        set$3(this.axesGridMajorColor, 0.1, 0.1, 0.1);\n                        set$3(this.axesGridZeroColor, 0.05, 0.1, 0.1);\n                        set$3(this.selectionColor, 1, 1, 0);\n                        set$3(this.hoverColor, 1, 0, 1);\n                        set$3(this.activeColor, 0, 1, 1);\n                        set$3(this.lassoColor, 0.9, 0.9, 0.9);\n                        break;\n                    case Theme.light:\n                        set$2(this.backgroundColor, 1, 1, 1, 1);\n                        set$3(this.textColor, 0, 0, 0);\n                        set$3(this.textHoverColor, 0.1, 0.1, 0.1);\n                        set$3(this.textBorderColor, 1, 1, 1);\n                        set$3(this.axesTextColor, 0, 0, 0);\n                        set$3(this.axesTextBorderColor, 1, 1, 1);\n                        set$3(this.axesTextHoverColor, 0.1, 0.1, 0.1);\n                        set$3(this.axesGridBackgroundColor, 1, 1, 1);\n                        set$3(this.axesGridHighlightColor, 0.925, 0.925, 0.925);\n                        set$3(this.axesGridMinorColor, 0.9, 0.9, 0.9);\n                        set$3(this.axesGridMajorColor, 0.8, 0.8, 0.8);\n                        set$3(this.axesGridZeroColor, 0.7, 0.9, 0.9);\n                        set$3(this.selectionColor, 1, 1, 0);\n                        set$3(this.hoverColor, 1, 0, 1);\n                        set$3(this.activeColor, 0, 1, 1);\n                        set$3(this.lassoColor, 0.1, 0.1, 0.1);\n                        break;\n                }\n                if (this.themeChangedCallback) {\n                    this.themeChangedCallback(this._theme);\n                }\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DebugText {\n        get text() { return this._text; }\n        constructor() {\n            this.clear();\n        }\n        clear() {\n            this._text = \"\";\n        }\n        addLine(value) {\n            this._text += value + \"\\n\";\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Fps {\n        get frameCounter() { return this._frameCounter; }\n        get totalFrames() { return this._totalFrames; }\n        constructor(core) {\n            this._core = core;\n            this._totalFrames = 0;\n            this.reset();\n        }\n        update(elapsedTime) {\n            this._elapsedTime += elapsedTime;\n            if (this._elapsedTime > 1000) {\n                this._elapsedTime -= 1000;\n                this._fps = this._frameCounter;\n                this._frameCounter = 0;\n            }\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`fps      ${this._fps}`);\n            }\n        }\n        render() {\n            this._frameCounter++;\n            this._totalFrames++;\n        }\n        reset() {\n            this._fps = 0;\n            this._frameCounter = 0;\n            this._elapsedTime = 0;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    const PaletteType = {\n        sequentialsinglehue: \"sequentialsinglehue\",\n        sequentialmultihue: \"sequentialmultihue\",\n        diverging: \"diverging\",\n        qualitative: \"qualitative\",\n    };\n    class PaletteResources {\n        constructor() {\n            this.palettes = {\n                \"blues\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 251, 255, 222, 235, 247, 198, 219, 239, 158, 202, 225, 107, 174, 214, 66, 146, 198, 33, 113, 181, 8, 81, 156, 8, 48, 107]) },\n                \"greens\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 252, 245, 229, 245, 224, 199, 233, 192, 161, 217, 155, 116, 196, 118, 65, 171, 93, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n                \"greys\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 255, 255, 240, 240, 240, 217, 217, 217, 189, 189, 189, 150, 150, 150, 115, 115, 115, 82, 82, 82, 37, 37, 37, 0, 0, 0]) },\n                \"oranges\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 235, 254, 230, 206, 253, 208, 162, 253, 174, 107, 253, 141, 60, 241, 105, 19, 217, 72, 1, 166, 54, 3, 127, 39, 4]) },\n                \"purples\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([252, 251, 253, 239, 237, 245, 218, 218, 235, 188, 189, 220, 158, 154, 200, 128, 125, 186, 106, 81, 163, 84, 39, 143, 63, 0, 125]) },\n                \"reds\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 240, 254, 224, 210, 252, 187, 161, 252, 146, 114, 251, 106, 74, 239, 59, 44, 203, 24, 29, 165, 15, 21, 103, 0, 13]) },\n                \"viridis\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([0x48, 0x25, 0x75, 0x41, 0x44, 0x87, 0x35, 0x60, 0x8d, 0x2a, 0x78, 0x8e, 0x21, 0x91, 0x8d, 0x22, 0xa8, 0x84, 0x43, 0xbf, 0x71, 0x7a, 0xd1, 0x51, 0xbc, 0xdf, 0x27]) },\n                \"inferno\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([0x17, 0x0c, 0x3b, 0x42, 0x0a, 0x68, 0x6b, 0x17, 0x6e, 0x93, 0x26, 0x67, 0xbb, 0x37, 0x55, 0xdd, 0x51, 0x3a, 0xf3, 0x77, 0x1a, 0xfc, 0xa5, 0x0a, 0xf6, 0xd6, 0x45]) },\n                \"magma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([0x15, 0x0e, 0x37, 0x3b, 0x0f, 0x70, 0x65, 0x1a, 0x80, 0x8c, 0x29, 0x81, 0xb6, 0x37, 0x7a, 0xde, 0x49, 0x68, 0xf7, 0x6f, 0x5c, 0xfe, 0x9f, 0x6d, 0xfe, 0xce, 0x91]) },\n                \"plasma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([0x42, 0x03, 0x9d, 0x6a, 0x00, 0xa8, 0x90, 0x0d, 0xa4, 0xb1, 0x2a, 0x90, 0xcb, 0x47, 0x79, 0xe1, 0x64, 0x62, 0xf2, 0x83, 0x4c, 0xfc, 0xa6, 0x36, 0xfc, 0xce, 0x25]) },\n                \"bluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 229, 245, 249, 204, 236, 230, 153, 216, 201, 102, 194, 164, 65, 174, 118, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n                \"bluepurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 224, 236, 244, 191, 211, 230, 158, 188, 218, 140, 150, 198, 140, 107, 177, 136, 65, 157, 129, 15, 124, 77, 0, 75]) },\n                \"greenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 240, 224, 243, 219, 204, 235, 197, 168, 221, 181, 123, 204, 196, 78, 179, 211, 43, 140, 190, 8, 104, 172, 8, 64, 129]) },\n                \"orangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 236, 254, 232, 200, 253, 212, 158, 253, 187, 132, 252, 141, 89, 239, 101, 72, 215, 48, 31, 179, 0, 0, 127, 0, 0]) },\n                \"purpleblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 231, 242, 208, 209, 230, 166, 189, 219, 116, 169, 207, 54, 144, 192, 5, 112, 176, 4, 90, 141, 2, 56, 88]) },\n                \"purplebluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 226, 240, 208, 209, 230, 166, 189, 219, 103, 169, 207, 54, 144, 192, 2, 129, 138, 1, 108, 89, 1, 70, 54]) },\n                \"purplered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 244, 249, 231, 225, 239, 212, 185, 218, 201, 148, 199, 223, 101, 176, 231, 41, 138, 206, 18, 86, 152, 0, 67, 103, 0, 31]) },\n                \"redpurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 243, 253, 224, 221, 252, 197, 192, 250, 159, 181, 247, 104, 161, 221, 52, 151, 174, 1, 126, 122, 1, 119, 73, 0, 106]) },\n                \"yellowgreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 247, 252, 185, 217, 240, 163, 173, 221, 142, 120, 198, 121, 65, 171, 93, 35, 132, 67, 0, 104, 55, 0, 69, 41]) },\n                \"yellowgreenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 217, 237, 248, 177, 199, 233, 180, 127, 205, 187, 65, 182, 196, 29, 145, 192, 34, 94, 168, 37, 52, 148, 8, 29, 88]) },\n                \"yelloworangebrown\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 255, 247, 188, 254, 227, 145, 254, 196, 79, 254, 153, 41, 236, 112, 20, 204, 76, 2, 153, 52, 4, 102, 37, 6]) },\n                \"yelloworangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 204, 255, 237, 160, 254, 217, 118, 254, 178, 76, 253, 141, 60, 252, 78, 42, 227, 26, 28, 189, 0, 38, 128, 0, 38]) },\n                \"brownbluegreen\": { type: PaletteType.diverging, colors: new Uint8Array([84, 48, 5, 140, 81, 10, 191, 129, 45, 223, 194, 125, 246, 232, 195, 245, 245, 245, 199, 234, 229, 128, 205, 193, 53, 151, 143, 1, 102, 94, 0, 60, 48]) },\n                \"pinkyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([142, 1, 82, 197, 27, 125, 222, 119, 174, 241, 182, 218, 253, 224, 239, 247, 247, 247, 230, 245, 208, 184, 225, 134, 127, 188, 65, 77, 146, 33, 39, 100, 25]) },\n                \"purplegreen\": { type: PaletteType.diverging, colors: new Uint8Array([64, 0, 75, 118, 42, 131, 153, 112, 171, 194, 165, 207, 231, 212, 232, 247, 247, 247, 217, 240, 211, 166, 219, 160, 90, 174, 97, 27, 120, 55, 0, 68, 27]) },\n                \"purpleorange\": { type: PaletteType.diverging, colors: new Uint8Array([127, 59, 8, 179, 88, 6, 224, 130, 20, 253, 184, 99, 254, 224, 182, 247, 247, 247, 216, 218, 235, 178, 171, 210, 128, 115, 172, 84, 39, 136, 45, 0, 75]) },\n                \"redblue\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 247, 247, 247, 209, 229, 240, 146, 197, 222, 67, 147, 195, 33, 102, 172, 5, 48, 97]) },\n                \"redgrey\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 255, 255, 255, 224, 224, 224, 186, 186, 186, 135, 135, 135, 77, 77, 77, 26, 26, 26]) },\n                \"redyellowblue\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 144, 255, 255, 191, 224, 243, 248, 171, 217, 233, 116, 173, 209, 69, 117, 180, 49, 54, 149]) },\n                \"redyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 217, 239, 139, 166, 217, 106, 102, 189, 99, 26, 152, 80, 0, 104, 55]) },\n                \"spectral\": { type: PaletteType.diverging, colors: new Uint8Array([158, 1, 66, 213, 62, 79, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 230, 245, 152, 171, 221, 164, 102, 194, 165, 50, 136, 189, 94, 79, 162]) },\n                \"accent\": { type: PaletteType.qualitative, colors: new Uint8Array([127, 201, 127, 190, 174, 212, 253, 192, 134, 255, 255, 153, 56, 108, 176, 240, 2, 127, 191, 91, 23, 102, 102, 102]) },\n                \"category10\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 255, 127, 14, 44, 160, 44, 214, 39, 40, 148, 103, 189, 140, 86, 75, 227, 119, 194, 127, 127, 127, 188, 189, 34, 23, 190, 207]) },\n                \"category20\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 174, 199, 232, 255, 127, 14, 255, 187, 120, 44, 160, 44, 152, 223, 138, 214, 39, 40, 255, 152, 150, 148, 103, 189, 197, 176, 213, 140, 86, 75, 196, 156, 148, 227, 119, 194, 247, 182, 210, 127, 127, 127, 199, 199, 199, 188, 189, 34, 219, 219, 141, 23, 190, 207, 158, 218, 229]) },\n                \"dark2\": { type: PaletteType.qualitative, colors: new Uint8Array([27, 158, 119, 217, 95, 2, 117, 112, 179, 231, 41, 138, 102, 166, 30, 230, 171, 2, 166, 118, 29, 102, 102, 102]) },\n                \"paired\": { type: PaletteType.qualitative, colors: new Uint8Array([166, 206, 227, 31, 120, 180, 178, 223, 138, 51, 160, 44, 251, 154, 153, 227, 26, 28, 253, 191, 111, 255, 127, 0, 202, 178, 214, 106, 61, 154, 255, 255, 153, 177, 89, 40]) },\n                \"pastel1\": { type: PaletteType.qualitative, colors: new Uint8Array([251, 180, 174, 179, 205, 227, 204, 235, 197, 222, 203, 228, 254, 217, 166, 255, 255, 204, 229, 216, 189, 253, 218, 236, 242, 242, 242]) },\n                \"pastel2\": { type: PaletteType.qualitative, colors: new Uint8Array([179, 226, 205, 253, 205, 172, 203, 213, 232, 244, 202, 228, 230, 245, 201, 255, 242, 174, 241, 226, 204, 204, 204, 204]) },\n                \"set1\": { type: PaletteType.qualitative, colors: new Uint8Array([228, 26, 28, 55, 126, 184, 77, 175, 74, 152, 78, 163, 255, 127, 0, 255, 255, 51, 166, 86, 40, 247, 129, 191, 153, 153, 153]) },\n                \"set2\": { type: PaletteType.qualitative, colors: new Uint8Array([102, 194, 165, 252, 141, 98, 141, 160, 203, 231, 138, 195, 166, 216, 84, 255, 217, 47, 229, 196, 148, 179, 179, 179]) },\n                \"set3\": { type: PaletteType.qualitative, colors: new Uint8Array([141, 211, 199, 255, 255, 179, 190, 186, 218, 251, 128, 114, 128, 177, 211, 253, 180, 98, 179, 222, 105, 252, 205, 229, 217, 217, 217, 188, 128, 189, 204, 235, 197, 255, 237, 111]) },\n            };\n        }\n    }\n    class PaletteBase {\n        get colors() { return this._colors; }\n        set colors(value) {\n            if (this._colors != value) {\n                this._colors = value;\n                this._changed = true;\n            }\n        }\n        constructor() {\n            this._colors = null;\n        }\n        copyFrom(palette) {\n            if (palette.colors) {\n                this.colors = new Uint8Array(palette.colors);\n            }\n            else {\n                this.colors = null;\n            }\n        }\n        update() { }\n    }\n    let Palette$2 = class Palette extends PaletteBase {\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class PositionVertex {\n        static getPosition(buffer, index, value) {\n            const offset = index * PositionVertex.SIZE;\n            set$3(value, buffer[offset], buffer[offset + 1], buffer[offset + 2]);\n        }\n        static setPosition(buffer, index, value) {\n            const offset = index * PositionVertex.SIZE;\n            buffer[offset] = value[0];\n            buffer[offset + 1] = value[1];\n            buffer[offset + 2] = value[2];\n        }\n    }\n    PositionVertex.SIZE = 3;\n    PositionVertex.SIZE_BYTES = 12;\n    class PositionColorVertex {\n        static getPosition(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setPosition(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getColor(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n            set$3(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF);\n        }\n        static setColor(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n        }\n    }\n    PositionColorVertex.SIZE_BYTES = 16;\n    PositionColorVertex.POSITION_OFFSET_BYTES = 0;\n    PositionColorVertex.COLOR_OFFSET_BYTES = 12;\n    class PositionTextureVertex {\n        static getPosition(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setPosition(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        }\n    }\n    PositionTextureVertex.SIZE_BYTES = 16;\n    PositionTextureVertex.POSITION_OFFSET_BYTES = 0;\n    PositionTextureVertex.TEX_COORD_OFFSET_BYTES = 12;\n    class PositionTexturePickVertex {\n        static getPosition(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setPosition(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        }\n        static getIdColor(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            set$2(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n        }\n        static setIdColor(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n            bufferView.setUint8(offset + 3, value[3] * 0xFF);\n        }\n    }\n    PositionTexturePickVertex.SIZE_BYTES = 20;\n    PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES = 0;\n    PositionTexturePickVertex.POSITION_OFFSET_BYTES = 4;\n    PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES = 16;\n    class PositionNormalTextureVertex {\n        static getPosition(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setPosition(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getNormal(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n            set$3(value, bufferView.getInt8(offset) / 0x7F, bufferView.getInt8(offset + 1) / 0x7F, bufferView.getInt8(offset + 2) / 0x7F);\n        }\n        static setNormal(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n            bufferView.setInt8(offset, value[0] * 0x7F);\n            bufferView.setInt8(offset + 1, value[1] * 0x7F);\n            bufferView.setInt8(offset + 2, value[2] * 0x7F);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        }\n    }\n    PositionNormalTextureVertex.SIZE_BYTES = 20;\n    PositionNormalTextureVertex.POSITION_OFFSET_BYTES = 0;\n    PositionNormalTextureVertex.NORMAL_OFFSET_BYTES = 12;\n    PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES = 16;\n    class PickGridVertex {\n        static getTranslation(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setTranslation(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getNormal(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n            set$3(value, bufferView.getInt8(offset) / 0x7F, bufferView.getInt8(offset + 1) / 0x7F, bufferView.getInt8(offset + 2) / 0x7F);\n        }\n        static setNormal(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n            bufferView.setInt8(offset, value[0] * 0x7F);\n            bufferView.setInt8(offset + 1, value[1] * 0x7F);\n            bufferView.setInt8(offset + 2, value[2] * 0x7F);\n        }\n        static getIdColor(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            set$2(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n        }\n        static setIdColor(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n            bufferView.setUint8(offset + 3, value[3] * 0xFF);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        }\n        static getBounds(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.BOUNDS_OFFSET_BYTES;\n            set$2(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF, bufferView.getUint16(offset + 4, true) / 0xFFFF, bufferView.getUint16(offset + 6, true) / 0xFFFF);\n        }\n        static setBounds(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.BOUNDS_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n            bufferView.setUint16(offset + 4, value[2] * 0xFFFF, true);\n            bufferView.setUint16(offset + 6, value[3] * 0xFFFF, true);\n        }\n    }\n    PickGridVertex.SIZE_BYTES = 32;\n    PickGridVertex.TRANSLATION_OFFSET_BYTES = 0;\n    PickGridVertex.NORMAL_OFFSET_BYTES = 12;\n    PickGridVertex.ID_COLOR_OFFSET_BYTES = 16;\n    PickGridVertex.TEX_COORD_OFFSET_BYTES = 20;\n    PickGridVertex.BOUNDS_OFFSET_BYTES = 24;\n    class UnitVertex {\n        static getIdHover(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.ID_HOVER_OFFSET_BYTES, true);\n        }\n        static setIdHover(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.ID_HOVER_OFFSET_BYTES, value, true);\n        }\n        static copyIdHover(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ID_HOVER_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ID_HOVER_OFFSET_BYTES, true), true);\n        }\n        static getTranslation(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setTranslation(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static copyTranslation(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TRANSLATION_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TRANSLATION_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n            toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n        }\n        static getColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n            set(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF);\n        }\n        static setColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n        }\n        static copyColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.COLOR_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.COLOR_OFFSET_BYTES;\n            toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n            toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n        }\n        static getOrder(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ORDER_OFFSET_BYTES;\n            set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true));\n        }\n        static setOrder(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ORDER_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n        }\n        static copyOrder(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ORDER_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ORDER_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n        }\n        static getScale(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.SCALE_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setScale(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.SCALE_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static copyScale(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SCALE_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SCALE_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n            toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n        }\n        static getRotation(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ROTATION_OFFSET_BYTES;\n            set$1(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true), bufferView.getFloat32(offset + 12, true));\n        }\n        static setRotation(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ROTATION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n            bufferView.setFloat32(offset + 12, value[3], true);\n        }\n        static copyRotation(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ROTATION_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ROTATION_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n            toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n            toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.TEXCOORD_OFFSET_BYTES;\n            set$1(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true), bufferView.getFloat32(offset + 12, true));\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.TEXCOORD_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n            bufferView.setFloat32(offset + 12, value[3], true);\n        }\n        static copyTexCoord(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TEXCOORD_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TEXCOORD_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n            toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n            toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n        }\n        static getIdColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            set$2(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n        }\n        static setIdColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n            bufferView.setUint8(offset + 3, value[3] * 0xFF);\n        }\n        static getSelected(bufferView, index) {\n            return bufferView.getInt8(UnitVertex.SIZE_BYTES * index + this.SELECTED_OFFSET_BYTES) / 0x7F;\n        }\n        static setSelected(bufferView, index, value) {\n            bufferView.setInt8(UnitVertex.SIZE_BYTES * index + this.SELECTED_OFFSET_BYTES, value * 0x7F);\n        }\n        static copySelected(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setInt8(UnitVertex.SIZE_BYTES * toIndex + this.SELECTED_OFFSET_BYTES, fromBufferView.getInt8(UnitVertex.SIZE_BYTES * fromIndex + this.SELECTED_OFFSET_BYTES));\n        }\n        static getRounding(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.ROUNDING_OFFSET_BYTES, true);\n        }\n        static setRounding(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.ROUNDING_OFFSET_BYTES, value, true);\n        }\n        static copyRounding(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ROUNDING_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ROUNDING_OFFSET_BYTES, true), true);\n        }\n        static getParameter1(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.PARAMETER_1_OFFSET_BYTES, true);\n        }\n        static setParameter1(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.PARAMETER_1_OFFSET_BYTES, value, true);\n        }\n        static copyParameter1(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_1_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_1_OFFSET_BYTES, true), true);\n        }\n        static getParameter2(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.PARAMETER_2_OFFSET_BYTES, true);\n        }\n        static setParameter2(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.PARAMETER_2_OFFSET_BYTES, value, true);\n        }\n        static copyParameter2(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_2_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_2_OFFSET_BYTES, true), true);\n        }\n        static getMaterial(bufferView, index) {\n            return bufferView.getUint16(UnitVertex.SIZE_BYTES * index + this.MATERIAL_OFFSET_BYTES);\n        }\n        static setMaterial(bufferView, index, value) {\n            bufferView.setUint16(UnitVertex.SIZE_BYTES * index + this.MATERIAL_OFFSET_BYTES, value);\n        }\n        static copyMaterial(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint16(UnitVertex.SIZE_BYTES * toIndex + this.MATERIAL_OFFSET_BYTES, fromBufferView.getUint16(UnitVertex.SIZE_BYTES * fromIndex + this.MATERIAL_OFFSET_BYTES, true), true);\n        }\n        static getTexture(bufferView, index) {\n            return bufferView.getUint8(UnitVertex.SIZE_BYTES * index + this.TEXTURE_OFFSET_BYTES);\n        }\n        static setTexture(bufferView, index, value) {\n            bufferView.setUint8(UnitVertex.SIZE_BYTES * index + this.TEXTURE_OFFSET_BYTES, value);\n        }\n        static copyTexture(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.TEXTURE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.TEXTURE_OFFSET_BYTES));\n        }\n        static getSdfBuffer(bufferView, index) {\n            return bufferView.getUint8(UnitVertex.SIZE_BYTES * index + this.SDF_BUFFER_OFFSET_BYTES);\n        }\n        static setSdfBuffer(bufferView, index, value) {\n            bufferView.setUint8(UnitVertex.SIZE_BYTES * index + this.SDF_BUFFER_OFFSET_BYTES, value);\n        }\n        static copySdfBuffer(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BUFFER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BUFFER_OFFSET_BYTES));\n        }\n        static getSdfBorder(bufferView, index) {\n            return bufferView.getUint8(UnitVertex.SIZE_BYTES * index + this.SDF_BORDER_OFFSET_BYTES);\n        }\n        static setSdfBorder(bufferView, index, value) {\n            bufferView.setUint8(UnitVertex.SIZE_BYTES * index + this.SDF_BORDER_OFFSET_BYTES, value);\n        }\n        static copySdfBorder(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BORDER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BORDER_OFFSET_BYTES));\n        }\n        static getMatId(bufferView, index) {\n            return bufferView.getUint8(UnitVertex.SIZE_BYTES * index + this.MAT_TYPE_OFFSET_BYTES);\n        }\n        static setMatId(bufferView, index, value) {\n            bufferView.setUint8(UnitVertex.SIZE_BYTES * index + this.MAT_TYPE_OFFSET_BYTES, value);\n        }\n        static copyMatId(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_TYPE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_TYPE_OFFSET_BYTES));\n        }\n        static getMatColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_COLOR_OFFSET_BYTES;\n            value[0] = bufferView.getUint16(offset) / 0xFF;\n            value[1] = bufferView.getUint16(offset + 2) / 0xFF;\n            value[2] = bufferView.getUint16(offset + 4) / 0xFF;\n        }\n        static setMatColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_COLOR_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFF);\n            bufferView.setUint16(offset + 2, value[1] * 0xFF);\n            bufferView.setUint16(offset + 4, value[2] * 0xFF);\n        }\n        static copyMatColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.MAT_COLOR_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.MAT_COLOR_OFFSET_BYTES;\n            toBufferView.setUint16(toOffset, fromBufferView.getUint16(fromOffset));\n            toBufferView.setUint16(toOffset + 2, fromBufferView.getUint16(fromOffset + 2));\n            toBufferView.setUint16(toOffset + 4, fromBufferView.getUint16(fromOffset + 4));\n        }\n        static getMatFuzz(bufferView, index) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_FUZZ_OFFSET_BYTES;\n            return bufferView.getUint8(offset) / 0xFF;\n        }\n        static setMatFuzz(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_FUZZ_OFFSET_BYTES;\n            bufferView.setUint8(offset, value * 0xFF);\n        }\n        static copyMatFuzz(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_FUZZ_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_FUZZ_OFFSET_BYTES));\n        }\n        static getMatGloss(bufferView, index) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_GLOSS_OFFSET_BYTES;\n            return bufferView.getUint8(offset) / 0xFF;\n        }\n        static setMatGloss(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_GLOSS_OFFSET_BYTES;\n            bufferView.setUint8(offset, value * 0xFF);\n        }\n        static copyMatGloss(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_GLOSS_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_GLOSS_OFFSET_BYTES));\n        }\n        static getMatDensity(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.MAT_DENSITY_OFFSET_BYTES, true);\n        }\n        static setMatDensity(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.MAT_DENSITY_OFFSET_BYTES, value, true);\n        }\n        static copyMatDensity(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_DENSITY_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_DENSITY_OFFSET_BYTES, true), true);\n        }\n        static getMatRefractiveIndex(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true);\n        }\n        static setMatRefractiveIndex(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, value, true);\n        }\n        static copyMatRefractiveIndex(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true), true);\n        }\n        static getSegColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.SEG_COLOR_OFFSET_BYTES;\n            value[0] = bufferView.getUint8(offset) / 0xFF;\n            value[1] = bufferView.getUint8(offset + 1) / 0xFF;\n            value[2] = bufferView.getUint8(offset + 2) / 0xFF;\n            value[3] = bufferView.getUint8(offset + 3) / 0xFF;\n        }\n        static setSegColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.SEG_COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n            bufferView.setUint8(offset + 3, value[3] * 0xFF);\n        }\n        static copySegColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SEG_COLOR_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SEG_COLOR_OFFSET_BYTES;\n            toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n            toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n            toBufferView.setUint8(toOffset + 2, fromBufferView.getUint8(fromOffset + 2));\n            toBufferView.setUint8(toOffset + 3, fromBufferView.getUint8(fromOffset + 3));\n        }\n    }\n    UnitVertex.SIZE_BYTES = 120;\n    UnitVertex.ID_HOVER_OFFSET_BYTES = 0;\n    UnitVertex.ID_COLOR_OFFSET_BYTES = 4;\n    UnitVertex.ORDER_OFFSET_BYTES = 8;\n    UnitVertex.STAGGER_ORDER_OFFSET_BYTES = 12;\n    UnitVertex.SELECTED_OFFSET_BYTES = 80;\n    UnitVertex.TRANSLATION_OFFSET_BYTES = 16;\n    UnitVertex.COLOR_OFFSET_BYTES = 28;\n    UnitVertex.MATERIAL_OFFSET_BYTES = 30;\n    UnitVertex.SCALE_OFFSET_BYTES = 32;\n    UnitVertex.ROUNDING_OFFSET_BYTES = 44;\n    UnitVertex.ROTATION_OFFSET_BYTES = 48;\n    UnitVertex.TEXCOORD_OFFSET_BYTES = 64;\n    UnitVertex.TEXTURE_OFFSET_BYTES = 81;\n    UnitVertex.SDF_BUFFER_OFFSET_BYTES = 82;\n    UnitVertex.SDF_BORDER_OFFSET_BYTES = 83;\n    UnitVertex.PARAMETER_1_OFFSET_BYTES = 84;\n    UnitVertex.PARAMETER_2_OFFSET_BYTES = 88;\n    UnitVertex.MAT_TYPE_OFFSET_BYTES = 92;\n    UnitVertex.MAT_COLOR_OFFSET_BYTES = 112;\n    UnitVertex.MAT_FUZZ_OFFSET_BYTES = 96;\n    UnitVertex.MAT_GLOSS_OFFSET_BYTES = 97;\n    UnitVertex.MAT_DENSITY_OFFSET_BYTES = 100;\n    UnitVertex.MAT_REFRACTIVE_INDEX_OFFSET_BYTES = 104;\n    UnitVertex.SEG_COLOR_OFFSET_BYTES = 108;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ObjMesh {\n    }\n    class ObjHelper {\n        constructor(core) {\n            this._core = core;\n        }\n        read(data) {\n            const start = window.performance.now();\n            const indices = [];\n            const positions = [];\n            const normals = [];\n            const texCoords = [];\n            const meshes = [];\n            const indexOffsets = [];\n            const indexCounts = [];\n            const faceLookup = {};\n            const lines = data.split(\"\\n\");\n            let faceCount = 0;\n            for (let i = 0; i < lines.length; i++) {\n                const parts = lines[i].trim().split(\" \");\n                if (parts.length > 0) {\n                    switch (parts[0]) {\n                        case \"o\":\n                            meshes.push(parts[1]);\n                            indexOffsets.push(indices.length);\n                            break;\n                        case \"v\":\n                            positions.push(parseFloat(parts[1]));\n                            positions.push(parseFloat(parts[2]));\n                            positions.push(parseFloat(parts[3]));\n                            break;\n                        case \"vt\":\n                            texCoords.push(parseFloat(parts[1]));\n                            texCoords.push(parseFloat(parts[2]));\n                            break;\n                        case \"vn\":\n                            normals.push(parseFloat(parts[1]));\n                            normals.push(parseFloat(parts[2]));\n                            normals.push(parseFloat(parts[3]));\n                            break;\n                        case \"f\":\n                            for (let i = 0; i < parts.length - 1; i++) {\n                                const part = parts[i + 1];\n                                if (faceLookup[part] == undefined) {\n                                    faceLookup[part] = faceCount++;\n                                }\n                                indices.push(faceLookup[part]);\n                            }\n                            break;\n                    }\n                }\n            }\n            for (let i = 0; i < meshes.length - 1; i++) {\n                indexCounts.push(indexOffsets[i + 1] - indexOffsets[i]);\n            }\n            indexCounts.push(indices.length - indexOffsets[meshes.length - 1]);\n            const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * Object.keys(faceLookup).length);\n            const dataView = new DataView(vertices);\n            let minX = Number.MAX_VALUE;\n            let minY = Number.MAX_VALUE;\n            let minZ = Number.MAX_VALUE;\n            let maxX = -Number.MAX_VALUE;\n            let maxY = -Number.MAX_VALUE;\n            let maxZ = -Number.MAX_VALUE;\n            const faces = Object.keys(faceLookup);\n            const _vec2 = create();\n            const _vec3 = create$3();\n            let hasTexCoords, hasNormals;\n            if (faces.length > 0) {\n                const faceParts = faces[0].split(\"/\");\n                hasTexCoords = faceParts.length > 1 && !isNaN(parseInt(faceParts[1]));\n                hasNormals = faceParts.length > 2 && !isNaN(parseInt(faceParts[2]));\n            }\n            for (let i = 0; i < faces.length; i++) {\n                const faceParts = faces[i].split(\"/\");\n                let index = (parseInt(faceParts[0]) - 1) * 3;\n                const x = positions[index];\n                const y = positions[index + 1];\n                const z = positions[index + 2];\n                set$3(_vec3, x, y, z);\n                PositionNormalTextureVertex.setPosition(dataView, i, _vec3);\n                minX = Math.min(x, minX);\n                minY = Math.min(y, minY);\n                minZ = Math.min(z, minZ);\n                maxX = Math.max(x, maxX);\n                maxY = Math.max(y, maxY);\n                maxZ = Math.max(z, maxZ);\n                if (hasNormals) {\n                    index = (parseInt(faceParts[2]) - 1) * 3;\n                    set$3(_vec3, normals[index], normals[index + 1], normals[index + 2]);\n                    PositionNormalTextureVertex.setNormal(dataView, i, _vec3);\n                }\n                if (hasTexCoords) {\n                    index = (parseInt(faceParts[1]) - 1) * 2;\n                    set(_vec2, texCoords[index], texCoords[index + 1]);\n                    PositionNormalTextureVertex.setTexCoord(dataView, i, _vec2);\n                }\n            }\n            const originX = (minX + maxX) / 2;\n            const originY = (minY + maxY) / 2;\n            const originZ = (minZ + maxZ) / 2;\n            const objMesh = new ObjMesh();\n            objMesh.vertices = vertices;\n            objMesh.indices = new Uint16Array(indices);\n            objMesh.meshes = meshes;\n            objMesh.indexOffsets = indexOffsets;\n            objMesh.indexCounts = indexCounts;\n            objMesh.indexCount = indices.length;\n            objMesh.minX = minX;\n            objMesh.minY = minY;\n            objMesh.minZ = minZ;\n            objMesh.maxX = maxX;\n            objMesh.maxY = maxY;\n            objMesh.maxZ = maxZ;\n            objMesh.originX = originX;\n            objMesh.originY = originY;\n            objMesh.originZ = originZ;\n            this._core.log.write(LogLevel.info, `obj loaded ${Math.round(window.performance.now() - start)}ms`);\n            return objMesh;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cube {\n    }\n    Cube.POSITIONS = new Float32Array([\n        -0.5, 0.5, 0.5,\n        0.5, 0.5, 0.5,\n        0.5, -0.5, 0.5,\n        -0.5, -0.5, 0.5,\n        -0.5, 0.5, -0.5,\n        0.5, 0.5, -0.5,\n        0.5, -0.5, -0.5,\n        -0.5, -0.5, -0.5\n    ]);\n    Cube.INDICES = new Uint16Array([5, 4, 1, 0, 3, 4, 7, 5, 6, 1, 2, 3, 6, 7]);\n    Cube.CUBE_MAP_INDICES = new Uint16Array([2, 3, 1, 0, 4, 3, 7, 2, 6, 1, 5, 4, 6, 7]);\n    Cube.FACE_NORMALS = [\n        fromValues$3(0, 1, 0),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, -1, 0),\n        fromValues$3(-1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 0, -1)\n    ];\n    Cube.FACE_POSITIONS = [\n        fromValues$3(0.0, 0.5, 0.0),\n        fromValues$3(0.5, 0.0, 0.0),\n        fromValues$3(0.0, -0.5, 0.0),\n        fromValues$3(-0.5, 0.0, 0.0),\n        fromValues$3(0.0, 0.0, 0.5),\n        fromValues$3(0.0, 0.0, -0.5)\n    ];\n    Cube.FACE_ROTATIONS = [\n        fromValues$5(1, 0, 0, 0, 0, -1, 0, 1, 0),\n        fromValues$5(0, 0, -1, 0, 1, 0, 1, 0, 0),\n        fromValues$5(1, 0, 0, 0, 0, 1, 0, -1, 0),\n        fromValues$5(0, 0, 1, 0, 1, 0, -1, 0, 0),\n        fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n        fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n    ];\n    Cube.EDGE_POSITIONS = [\n        fromValues$3(0, 0.5, 0.5),\n        fromValues$3(0.5, 0.5, 0),\n        fromValues$3(0, 0.5, -0.5),\n        fromValues$3(-0.5, 0.5, 0),\n        fromValues$3(0, -0.5, 0.5),\n        fromValues$3(0.5, -0.5, 0),\n        fromValues$3(0, -0.5, -0.5),\n        fromValues$3(-0.5, -0.5, 0),\n        fromValues$3(0.5, 0, 0.5),\n        fromValues$3(0.5, 0, -0.5),\n        fromValues$3(-0.5, 0, -0.5),\n        fromValues$3(-0.5, 0, 0.5)\n    ];\n    Cube.EDGE_NORMALS = [\n        fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO)\n    ];\n    Cube.EDGE_CORNERS = [\n        [0, 1],\n        [1, 5],\n        [4, 5],\n        [0, 4],\n        [2, 3],\n        [2, 6],\n        [6, 7],\n        [3, 7],\n        [1, 2],\n        [5, 6],\n        [4, 7],\n        [0, 3]\n    ];\n    Cube.EDGE_FACES = [\n        [0, 4],\n        [0, 1],\n        [0, 5],\n        [0, 3],\n        [2, 4],\n        [2, 1],\n        [2, 5],\n        [2, 3],\n        [1, 4],\n        [1, 5],\n        [3, 5],\n        [3, 4]\n    ];\n    Cube.EDGE_AXIS = [\n        0,\n        2,\n        0,\n        2,\n        0,\n        2,\n        0,\n        2,\n        1,\n        1,\n        1,\n        1\n    ];\n    Cube.AXIS_EDGES = [\n        [0, 2, 4, 6],\n        [8, 9, 10, 11],\n        [1, 3, 5, 7]\n    ];\n    Cube.AXIS_FACES = [\n        [1, 3],\n        [0, 2],\n        [4, 5]\n    ];\n    Cube.OPPOSITE_FACES = [\n        2,\n        3,\n        0,\n        1,\n        5,\n        4\n    ];\n    Cube.EDGE_POSITIVES = [\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 1, 0),\n        fromValues$3(0, 1, 0),\n        fromValues$3(0, 1, 0),\n        fromValues$3(0, 1, 0)\n    ];\n    Cube.EDGE_FORWARDS = [\n        fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO)\n    ];\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let ControllerVisual$1 = class ControllerVisual {\n        render(elapsedTime, xrFrame) { }\n        update(elapsedTime) { }\n        constructor(controller) {\n            this.controller = controller;\n        }\n    };\n    class Controller {\n        get isInitialized() { return this._isInitialized; }\n        get mMatrix() { return this._mMatrix; }\n        get indexCount() { return this._indexCount; }\n        get vertices() { return this._vertices; }\n        get indices() { return this._indices; }\n        get texture() { return this._texture; }\n        get rayMMatrix() { return this._rayMMatrix; }\n        get rayIndexCount() { return this._rayIndexCount; }\n        get rayVertices() { return this._rayVertices; }\n        get rayIndices() { return this._rayIndices; }\n        constructor(core, options) {\n            this._cubeObj = `o Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 -1.000000\nv 1.000000 1.000000 -0.999999\nv 0.999999 1.000000 1.000001\nv -1.000000 1.000000 1.000000\nv -1.000000 1.000000 -1.000000\nvt 1.000000 0.333333\nvt 1.000000 0.666667\nvt 0.666667 0.666667\nvt 0.666667 0.333333\nvt 0.666667 0.000000\nvt 0.000000 0.333333\nvt 0.000000 0.000000\nvt 0.333333 0.000000\nvt 0.333333 1.000000\nvt 0.000000 1.000000\nvt 0.000000 0.666667\nvt 0.333333 0.333333\nvt 0.333333 0.666667\nvt 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.000000 0.000000 1.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\ns off\nf 2/1/1 3/2/1 4/3/1\nf 8/1/2 7/4/2 6/5/2\nf 5/6/3 6/7/3 2/8/3\nf 6/8/4 7/5/4 3/4/4\nf 3/9/5 7/10/5 8/11/5\nf 1/12/6 4/13/6 8/11/6\nf 1/4/1 2/1/1 4/3/1\nf 5/14/2 8/1/2 6/5/2\nf 1/12/3 5/6/3 2/8/3\nf 2/12/4 6/8/4 3/4/4\nf 4/13/5 3/9/5 8/11/5\nf 5/6/6 1/12/6 8/11/6`;\n            this._core = core;\n            this._obj = options.obj;\n            this._texture = options.texture || new ImageData(new Uint8ClampedArray([0, 0, 0, 255]), 1, 1);\n        }\n        initialize() {\n            const _vec3 = create$3();\n            this._mMatrix = create$4();\n            const objMesh = new ObjHelper(this._core).read(this._obj || this._cubeObj);\n            if (!this._obj) {\n                this.useRayPose = true;\n                const modelThickness = 0.02;\n                const modelLength = 0.1;\n                set$3(_vec3, modelThickness, modelThickness, modelLength);\n                fromScaling(this._mMatrix, _vec3);\n                set$3(_vec3, 0, 0, 1);\n                translate(this._mMatrix, this._mMatrix, _vec3);\n            }\n            this._vertices = objMesh.vertices;\n            this._indices = objMesh.indices;\n            this._indexCount = objMesh.indexCount;\n            this._rayMMatrix = create$4();\n            const rayVertices = Cube.POSITIONS;\n            this._rayVertices = new ArrayBuffer(PositionColorVertex.SIZE_BYTES * rayVertices.length / PositionVertex.SIZE);\n            const rayVerticesView = new DataView(this._rayVertices);\n            const rayIndices = Cube.INDICES;\n            this._rayIndices = new Uint16Array(rayIndices);\n            const rayVertexCount = rayVertices.length / PositionVertex.SIZE;\n            this._rayIndexCount = rayIndices.length;\n            for (let i = 0; i < rayVertexCount; i++) {\n                set$3(_vec3, rayVertices[i * PositionVertex.SIZE], rayVertices[i * PositionVertex.SIZE + 1], rayVertices[i * PositionVertex.SIZE + 2]);\n                PositionColorVertex.setPosition(rayVerticesView, i, _vec3);\n                PositionColorVertex.setColor(rayVerticesView, i, this._core.config.xrControllerRayColor);\n            }\n            const rayThickness = 0.0025;\n            const rayLength = 10;\n            set$3(_vec3, rayThickness, rayThickness, rayLength);\n            fromScaling(this._rayMMatrix, _vec3);\n            set$3(_vec3, 0, 0, -0.5);\n            translate(this._rayMMatrix, this._rayMMatrix, _vec3);\n            this._isInitialized = true;\n            this._core.log.write(LogLevel.info, \"controller initialized\");\n        }\n        update(elapsedTime) { }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class MatrixHelper {\n        static fieldOfViewFromProjectionMatrix(p) {\n            return 2 * Math.atan(1 / p[5]);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AxesVisual {\n        render(elapsedTime, xrFrame) { }\n        update(elapsedTime) { }\n        constructor(axes) {\n            this.axes = axes;\n        }\n    }\n    class AxesBase {\n        get isInitialized() { return this._isInitialized; }\n        set vMatrix(value) { this._vMatrix = value; }\n        pickGrid(id) {\n            const offset = id * 3;\n            return {\n                divisionX: this._pickGrid[offset] - 1,\n                divisionY: this._pickGrid[offset + 1] - 1,\n                divisionZ: this._pickGrid[offset + 2] - 1,\n            };\n        }\n        pickTitle(id) {\n            return { axis: this._pickTitle[id], };\n        }\n        pickLabel(id) {\n            const offset = id * 2;\n            return {\n                axis: this._pickLabel[offset],\n                label: this._pickLabel[offset + 1],\n            };\n        }\n        pickHeading(id) {\n            return { axis: this._pickHeading[id], };\n        }\n        getFromValues(index) { return this._fromValues[index]; }\n        setFromValues(index, value) {\n            if (this._fromValues[index] != value) {\n                this._fromValues[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getToValues(index) { return this._toValues[index]; }\n        setToValues(index, value) {\n            if (this._toValues[index] != value) {\n                this._toValues[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        get font() { return this._font; }\n        set font(value) {\n            if (this._font != value) {\n                this._font = value;\n                this._hasChanged = true;\n            }\n        }\n        get gridPickDivisionHeight() { return this._gridPickDivisionHeight; }\n        set gridPickDivisionHeight(value) {\n            if (this._gridPickDivisionHeight != value) {\n                this._gridPickDivisionHeight = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core) {\n            this._core = core;\n            this._mMatrix = create$4();\n            this._mvMatrix = create$4();\n            this._textMetric = { maxTop: 0, width: 0, maxHeight: 0 };\n            this._gridPickDivisionHeight = core.config.axesGridPickDivisionHeight;\n            this.textBorderWidth = core.config.textBorderWidth;\n            this.gamma = 0;\n            this.gridMajorThickness = core.config.axesGridMajorThickness;\n            this.gridMinorThickness = core.config.axesGridMinorThickness;\n            this.gridZeroThickness = core.config.axesGridZeroThickness;\n            this._font = core.font;\n            this.isGridPickingEnabled = false;\n        }\n        update(elapsedTime) { }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Quad$2 = class Quad {\n        static positions(transform) {\n            const positions = new Float32Array(12);\n            const position = create$3();\n            for (let i = 0; i < 4; i++) {\n                set$3(position, this.POSITIONS[i * 3], this.POSITIONS[i * 3 + 1], this.POSITIONS[i * 3 + 2]);\n                transformMat4$2(position, position, transform);\n                positions[i * 3] = position[0];\n                positions[i * 3 + 1] = position[1];\n                positions[i * 3 + 2] = position[2];\n            }\n            return positions;\n        }\n        static textured(transform, texTransform = Constants.MAT4_IDENTITY) {\n            const positions = this.positions(transform);\n            const texCoords = this.TEX_COORDS;\n            const vertices = new ArrayBuffer(PositionTextureVertex.SIZE_BYTES * positions.length / 3);\n            const verticesView = new DataView(vertices);\n            const position = create$3();\n            const texCoord = create();\n            for (let i = 0; i < positions.length / PositionVertex.SIZE; i++) {\n                set$3(position, positions[i * PositionVertex.SIZE], positions[i * PositionVertex.SIZE + 1], positions[i * PositionVertex.SIZE + 2]);\n                set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n                transformMat4(texCoord, texCoord, texTransform);\n                PositionTextureVertex.setPosition(verticesView, i, position);\n                PositionTextureVertex.setTexCoord(verticesView, i, texCoord);\n            }\n            return verticesView;\n        }\n        static normalTextured(transform, texTransform = Constants.MAT4_IDENTITY) {\n            const positions = this.positions(transform);\n            const texCoords = this.TEX_COORDS;\n            const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * positions.length / 3);\n            const verticesView = new DataView(vertices);\n            const position = create$3();\n            const texCoord = create();\n            const normal3 = create$3();\n            const normal4 = create$2();\n            for (let i = 0; i < positions.length / PositionVertex.SIZE; i++) {\n                set$3(position, positions[i * PositionVertex.SIZE], positions[i * PositionVertex.SIZE + 1], positions[i * PositionVertex.SIZE + 2]);\n                set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n                transformMat4(texCoord, texCoord, texTransform);\n                PositionNormalTextureVertex.setPosition(verticesView, i, position);\n                set$2(normal4, 0.0, 0.0, 1.0, 0.0);\n                transformMat4$1(normal4, normal4, transform);\n                set$3(normal3, normal4[0], normal4[1], normal4[2]);\n                normalize$3(normal3, normal3);\n                PositionNormalTextureVertex.setNormal(verticesView, i, normal3);\n                PositionNormalTextureVertex.setTexCoord(verticesView, i, texCoord);\n            }\n            return verticesView;\n        }\n    };\n    Quad$2.FACE_NORMALS = [\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 0, -1)\n    ];\n    Quad$2.FACE_ROTATIONS = [\n        fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n        fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n    ];\n    Quad$2.EDGE_POSITIONS = [\n        fromValues$3(0, 0.5, 0),\n        fromValues$3(0.5, 0, 0),\n        fromValues$3(0, -0.5, 0),\n        fromValues$3(-0.5, 0, 0)\n    ];\n    Quad$2.EDGE_NORMALS = [\n        fromValues$3(0, 1, 0),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, -1, 0),\n        fromValues$3(-1, 0, 0)\n    ];\n    Quad$2.EDGE_POSITIVES = [\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 1, 0),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 1, 0)\n    ];\n    Quad$2.EDGE_FORWARDS = [\n        fromValues$3(0, 0, -1),\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 0, -1)\n    ];\n    Quad$2.AXIS_EDGES = [\n        [0, 2],\n        [1, 3]\n    ];\n    Quad$2.POSITIONS = new Float32Array([\n        -0.5, 0.5, 0,\n        0.5, 0.5, 0,\n        -0.5, -0.5, 0,\n        0.5, -0.5, 0\n    ]);\n    Quad$2.INDICES = new Uint16Array([0, 2, 1, 1, 2, 3]);\n    Quad$2.TEX_COORDS = new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]);\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class TextHelper {\n        static truncate(text, length) {\n            return text.length > length ? `${text.substr(0, length - 1)}…` : text;\n        }\n        static measure(font, text, size) {\n            size.width = 0;\n            let maxDescent = 0;\n            for (const char of text) {\n                let glyph = font.glyphs[char];\n                if (!glyph) {\n                    font.addGlyph(char);\n                    glyph = font.glyphs[char];\n                }\n                size.width += glyph.advance;\n                size.maxTop = Math.max(glyph.top, size.maxTop);\n                maxDescent = Math.max(glyph.height - glyph.top, maxDescent);\n            }\n            size.maxHeight = size.maxTop + maxDescent;\n        }\n        static wrap(font, text, maxWidth) {\n            const lines = [];\n            let width = 0;\n            let start = 0;\n            let lastBreakingChar = -1;\n            let widthAfterLastBreakingChar = 0;\n            for (let i = 0; i < text.length; i++) {\n                let char = text.charAt(i);\n                let glyph = font.glyphs[char];\n                if (!glyph) {\n                    font.addGlyph(char);\n                    glyph = font.glyphs[char];\n                }\n                width += glyph.advance;\n                if (char == \" \" || char == \"-\") {\n                    widthAfterLastBreakingChar = width;\n                    lastBreakingChar = i;\n                }\n                if (width > maxWidth) {\n                    if (lastBreakingChar == -1) {\n                        lines.push(text.substring(start, i));\n                        start = i;\n                        width += glyph.advance;\n                    }\n                    else {\n                        lines.push(text.substring(start, lastBreakingChar));\n                        start = lastBreakingChar + 1;\n                        width -= widthAfterLastBreakingChar;\n                        widthAfterLastBreakingChar = 0;\n                        lastBreakingChar = -1;\n                    }\n                }\n            }\n            lines.push(text.substring(start, text.length));\n            return lines;\n        }\n        static addString(font, text, vertices, indices, index, position, scale, offset, rotation, idColor) {\n            for (const char of text) {\n                this.addGlyph(font, char, vertices, indices, index++, position, scale, offset, rotation, idColor);\n            }\n        }\n        static addGlyph(font, char, vertices, indices, index, position, scale, offset, rotation, idColor) {\n            let glyph = font.glyphs[char];\n            if (!glyph) {\n                font.addGlyph(char);\n                glyph = font.glyphs[char];\n            }\n            const vertexOffset = index * 4;\n            const width = glyph.width * scale;\n            const height = glyph.height * scale;\n            const top = glyph.top * scale;\n            const border = font.border * scale;\n            const x0 = offset[0] - border;\n            const x1 = offset[0] + width + border;\n            const y0 = offset[1] + top + border;\n            const y1 = offset[1] + top - height - border;\n            const z0 = offset[2];\n            set$3(this._topLeft, x0, y0, z0);\n            set$3(this._topRight, x1, y0, z0);\n            set$3(this._bottomLeft, x0, y1, z0);\n            set$3(this._bottomRight, x1, y1, z0);\n            if (rotation) {\n                transformQuat(this._topLeft, this._topLeft, rotation);\n                transformQuat(this._topRight, this._topRight, rotation);\n                transformQuat(this._bottomLeft, this._bottomLeft, rotation);\n                transformQuat(this._bottomRight, this._bottomRight, rotation);\n            }\n            add(this._vec3, this._topLeft, position);\n            PositionTexturePickVertex.setPosition(vertices, vertexOffset, this._vec3);\n            add(this._vec3, this._topRight, position);\n            PositionTexturePickVertex.setPosition(vertices, vertexOffset + 1, this._vec3);\n            add(this._vec3, this._bottomLeft, position);\n            PositionTexturePickVertex.setPosition(vertices, vertexOffset + 2, this._vec3);\n            add(this._vec3, this._bottomRight, position);\n            PositionTexturePickVertex.setPosition(vertices, vertexOffset + 3, this._vec3);\n            set(this._vec2, glyph.u0, glyph.v0);\n            PositionTexturePickVertex.setTexCoord(vertices, vertexOffset, this._vec2);\n            set(this._vec2, glyph.u1, glyph.v0);\n            PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 1, this._vec2);\n            set(this._vec2, glyph.u0, glyph.v1);\n            PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 2, this._vec2);\n            set(this._vec2, glyph.u1, glyph.v1);\n            PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 3, this._vec2);\n            PositionTexturePickVertex.setIdColor(vertices, vertexOffset, idColor);\n            PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 1, idColor);\n            PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 2, idColor);\n            PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 3, idColor);\n            offset[0] += glyph.advance * scale;\n            const indexTemplate = Quad$2.INDICES;\n            const indexOffset = index * 6;\n            for (let i = 0; i < 6; i++) {\n                indices[indexOffset + i] = indexTemplate[i] + vertexOffset;\n            }\n        }\n    }\n    TextHelper._vec2 = create();\n    TextHelper._vec3 = create$3();\n    TextHelper._topLeft = create$3();\n    TextHelper._topRight = create$3();\n    TextHelper._bottomLeft = create$3();\n    TextHelper._bottomRight = create$3();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class PickHelper {\n        static nextPickId() { return this._pickId++; }\n        static encodeNumber(number, type, color) {\n            const encoded = number | PickHelper.encodeType(type);\n            PickHelper.float32ToVec4(encoded, color);\n        }\n        static decodeNumber(color) {\n            return color[0] + (color[1] << 8) + (color[2] << 16);\n        }\n        static encodeVec3(vec3, type, color) {\n            const encoded = vec3[0] | (vec3[1] << 8) | (vec3[2] << 16) | PickHelper.encodeType(type);\n            PickHelper.float32ToVec4(encoded, color);\n        }\n        static decodeVec3(color, axes) {\n            axes[0] = color[0];\n            axes[1] = color[1];\n            axes[2] = color[2];\n        }\n        static encodeType(type) {\n            return type << 24;\n        }\n        static decodeType(color) {\n            return color[3];\n        }\n        static float32ToVec4(number, color) {\n            color[0] = ((number & 0xFF) >>> 0) / 0xFF;\n            color[1] = ((number & 0xFF00) >>> 8) / 0xFF;\n            color[2] = ((number & 0xFF0000) >>> 16) / 0xFF;\n            color[3] = ((number & 0xFF000000) >>> 24) / 0xFF;\n        }\n        static uint8ArrayToNumber(color) {\n            return color[0] + (color[1] << 8) + (color[2] << 16) + (color[3] << 24);\n        }\n    }\n    PickHelper._pickId = 1;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cartesian3dAxes extends AxesBase {\n        get size() { return this._size; }\n        get isDiscreteX() { return this._isDiscrete[0]; }\n        set isDiscreteX(value) {\n            if (value != this._isDiscrete[0]) {\n                this._isDiscrete[0] = value;\n                this._hasChanged = true;\n            }\n        }\n        get isDiscreteY() { return this._isDiscrete[1]; }\n        set isDiscreteY(value) {\n            if (value != this._isDiscrete[1]) {\n                this._isDiscrete[1] = value;\n                this._hasChanged = true;\n            }\n        }\n        get isDiscreteZ() { return this._isDiscrete[2]; }\n        set isDiscreteZ(value) {\n            if (value != this._isDiscrete[2]) {\n                this._isDiscrete[2] = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsX() { return this._minBoundsX; }\n        set minBoundsX(value) {\n            if (value != this._minBoundsX) {\n                this._minBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsX() { return this._maxBoundsX; }\n        set maxBoundsX(value) {\n            if (value != this._minBoundsX) {\n                this._maxBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsY() { return this._minBoundsY; }\n        set minBoundsY(value) {\n            if (value != this._minBoundsY) {\n                this._minBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsY() { return this._maxBoundsY; }\n        set maxBoundsY(value) {\n            if (value != this._minBoundsY) {\n                this._maxBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsZ() { return this._minBoundsZ; }\n        set minBoundsZ(value) {\n            if (value != this._minBoundsZ) {\n                this._minBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsZ() { return this._maxBoundsZ; }\n        set maxBoundsZ(value) {\n            if (value != this._minBoundsZ) {\n                this._maxBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        getIsOutsideEdge(index) { return this._isOutsideEdge[index]; }\n        getIsForwardFace(index) { return this._isForwardFace[index]; }\n        get textVertices() { return this._textVertices; }\n        get textIndices() { return this._textIndices; }\n        getLabelMMatrix(index) { return this._labelMMatrices[index]; }\n        setLabelPositions(index, value) {\n            if (this._labelPositions[index] != value) {\n                this._labelPositions[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setLabels(index, value) {\n            if (this._labels[index] != value) {\n                this._labels[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setLabelSizes(index, value) {\n            if (this._labelSizes[index] != value) {\n                this._labelSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getLabelOrientation(index) { return this._orientations[index]; }\n        setLabelOrientation(index, orientation) {\n            if (this._orientations[index] != orientation) {\n                this._orientations[index] = orientation;\n                this._hasChanged = true;\n            }\n        }\n        getTitleIndexCount(index) { return this._titleIndexCounts[index]; }\n        getTitleIndexOffset(index) { return this._titleIndexOffsets[index]; }\n        getTitleMMatrix(index) { return this._titleMMatrices[index]; }\n        setTitle(index, value) {\n            if (this._titles[index] != value) {\n                this._titles[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setTitleSize(index, value) {\n            if (this._titleSizes[index] != value) {\n                this._titleSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getHeadingIndexCount(index) { return this._headingIndexCounts[index]; }\n        getHeadingIndexOffset(index) { return this._headingIndexOffsets[index]; }\n        getHeadingMMatrix(index) { return this._headingMMatrices[index]; }\n        setHeading(index, value) {\n            if (this._headings[index] != value) {\n                this._headings[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setHeadingSize(index, value) {\n            if (this._headingSizes[index] != value) {\n                this._headingSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getIsLeftToRightHorizontal(index) { return this._isLeftToRightHorizontal[index]; }\n        getIsLeftToRightVertical(index) { return this._isLeftToRightVertical[index]; }\n        getAxesLeftToRightIndexCount(index) { return this._axesLeftToRightIndexCounts[index]; }\n        getAxesRightToLeftIndexCount(index) { return this._axesRightToLeftIndexCounts[index]; }\n        getAxesLeftToRightIndexOffset(index) { return this._axesLeftToRightIndexOffsets[index]; }\n        getAxesRightToLeftIndexOffset(index) { return this._axesRightToLeftIndexOffsets[index]; }\n        get gridVertices() { return this._gridVertices; }\n        get gridIndices() { return this._gridIndices; }\n        getGridTicksIndexCount(index) { return this._gridTicksIndexCounts[index]; }\n        getGridTicksIndexOffset(index) { return this._gridTicksIndexOffsets[index]; }\n        getGridFaceIndexCount(index) { return this._gridFaceIndexCounts[index]; }\n        getGridFaceIndexOffset(index) { return this._gridFaceIndexOffsets[index]; }\n        getGridTicksMMatrix(index) { return this._gridTicksMMatrices[index]; }\n        getGridFaceMMatrix(index) { return this._gridFaceMMatrices[index]; }\n        getGridTicksScale(index) { return this._gridTicksScales[index]; }\n        getGridFaceZero(index) { return this._gridFaceZeros[index]; }\n        getGridTicksZero(index) { return this._gridTicksZeros[index]; }\n        getGridFaceMinorGridlines(index) { return this._gridFaceMinorGridlines[index]; }\n        getGridTicksMinorGridlines(index) { return this._gridTicksMinorGridlines[index]; }\n        setTickPositions(index, value) {\n            if (this._gridTicksPositions[index] != value) {\n                this._gridTicksPositions[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingX() { return this._scalingX; }\n        set scalingX(value) {\n            if (value != this._scalingX) {\n                this._scalingX = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingY() { return this._scalingY; }\n        set scalingY(value) {\n            if (value != this._scalingY) {\n                this._scalingY = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingZ() { return this._scalingZ; }\n        set scalingZ(value) {\n            if (value != this._scalingZ) {\n                this._scalingZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetX() { return this._offset[12]; }\n        set offsetX(value) {\n            if (value != this._offset[12]) {\n                this._offset[12] = value;\n            }\n        }\n        get offsetY() { return this._offset[13]; }\n        set offsetY(value) {\n            if (value != this._offset[13]) {\n                this._offset[13] = value;\n            }\n        }\n        get offsetZ() { return this._offset[14]; }\n        set offsetZ(value) {\n            if (value != this._offset[14]) {\n                this._offset[14] = value;\n            }\n        }\n        constructor(core) {\n            super(core);\n            this._size = create$3();\n            this._translation = create$3();\n            this._normal = create$3();\n            this._forward = create$3();\n            this._right = create$3();\n            this._up = create$3();\n            this._texCoord = create();\n            this._bounds = create$2();\n            this._vec3 = create$3();\n            this._vec4 = create$2();\n            this._mat3 = create$5();\n            this._isDiscrete = [false, false, false];\n            this._minBoundsX = 0;\n            this._minBoundsY = 0;\n            this._minBoundsZ = 0;\n            this._maxBoundsX = 0;\n            this._maxBoundsY = 0;\n            this._maxBoundsZ = 0;\n            this._isForwardFace = [];\n            this._isForwardEdge = [];\n            this._isOutsideEdge = [];\n            for (let i = 0; i < 6; i++) {\n                this._isForwardFace.push(false);\n            }\n            for (let i = 0; i < 12; i++) {\n                this._isForwardEdge.push(false);\n                this._isOutsideEdge.push(false);\n            }\n            this._textOffset = create$3();\n            this._textPosition = create$3();\n            this._distances = [];\n            for (let i = 0; i < 12; i++) {\n                this._distances.push(0);\n            }\n            this._labelPositions = [];\n            this._labels = [];\n            this._labelSizes = [];\n            this._maxLabelSize = [];\n            this._axesLeftToRightIndexCounts = [];\n            this._axesRightToLeftIndexCounts = [];\n            this._axesLeftToRightIndexOffsets = [];\n            this._axesRightToLeftIndexOffsets = [];\n            this._labelMMatrices = [];\n            this._orientations = [];\n            for (let i = 0; i < 3; i++) {\n                this._maxLabelSize.push(create());\n                this._orientations.push(AxesTextOrientation.parallel);\n                this._axesLeftToRightIndexCounts.push(0);\n                this._axesRightToLeftIndexCounts.push(0);\n                this._axesLeftToRightIndexOffsets.push(0);\n                this._axesRightToLeftIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 12; i++) {\n                this._labelMMatrices.push(create$4());\n            }\n            this._titles = [];\n            this._titleSizes = [];\n            this._titleIndexCounts = [];\n            this._titleIndexOffsets = [];\n            this._titleMMatrices = [];\n            for (let i = 0; i < 3; i++) {\n                this._titles.push(null);\n                this._titleSizes.push(core.config.axesTextTitleSize);\n                this._titleIndexCounts.push(0);\n                this._titleIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 12; i++) {\n                this._titleMMatrices.push(create$4());\n            }\n            this._headings = [];\n            this._headingSizes = [];\n            this._headingIndexCounts = [];\n            this._headingIndexOffsets = [];\n            this._headingMMatrices = [];\n            this.isHeadingVisible = [];\n            for (let i = 0; i < 3; i++) {\n                this._headings.push(null);\n                this._headingSizes.push(core.config.axesTextHeadingSize);\n                this._headingIndexCounts.push(0);\n                this._headingIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 12; i++) {\n                this._headingMMatrices.push(create$4());\n                this.isHeadingVisible.push(true);\n            }\n            this.isEdgeVisible = [];\n            this._edgePosition = create$3();\n            this._edgePositive = create$3();\n            this._edgeNormal = create$3();\n            this._edgeNormalTemp = create$3();\n            this._edgePositiveTemp = create$3();\n            this._isLeftToRightHorizontal = [];\n            this._isLeftToRightVertical = [];\n            this._edgeHorizontalRight = [];\n            this._edgeHorizontalUp = [];\n            this._edgeHorizontalForward = [];\n            this._edgeVerticalRight = [];\n            this._edgeVerticalUp = [];\n            this._edgeVerticalForward = [];\n            for (let i = 0; i < 12; i++) {\n                this.isEdgeVisible.push(true);\n                this._isLeftToRightHorizontal.push(false);\n                this._isLeftToRightVertical.push(false);\n                this._edgeHorizontalRight.push(create$3());\n                this._edgeHorizontalUp.push(create$3());\n                this._edgeHorizontalForward.push(create$3());\n                this._edgeVerticalRight.push(create$3());\n                this._edgeVerticalUp.push(create$3());\n                this._edgeVerticalForward.push(create$3());\n            }\n            this.isFaceVisible = [];\n            for (let i = 0; i < 6; i++) {\n                this.isFaceVisible.push(true);\n            }\n            this.arePickDivisionsVisible = [];\n            this.areFacesVisible = [];\n            this._indexTemplate = Quad$2.INDICES;\n            this.zero = create$3();\n            this._gridTicksZeros = [];\n            this._gridFaceZeros = [];\n            this.minorGridlines = fromValues$3(1, 1, 1);\n            this._gridTicksMinorGridlines = [];\n            this._gridFaceMinorGridlines = [];\n            this._gridTicksPositions = [];\n            this._gridTicksScales = [];\n            this._gridTicksIndexCounts = [];\n            this._gridTicksIndexOffsets = [];\n            this._gridFaceScale = create$3();\n            this._gridFaceIndexCounts = [];\n            this._gridFaceIndexOffsets = [];\n            this._gridFaceMMatrices = [];\n            this._gridTicksMMatrices = [];\n            this._gridTicksRotations = [];\n            for (let i = 0; i < 3; i++) {\n                this.arePickDivisionsVisible.push(true);\n                this.areFacesVisible.push(true);\n                this._gridTicksZeros.push(create());\n                this._gridFaceZeros.push(create());\n                this._gridTicksMinorGridlines.push(create());\n                this._gridFaceMinorGridlines.push(create());\n                this._gridTicksScales.push(create$3());\n                this._gridTicksIndexCounts.push(0);\n                this._gridTicksIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 6; i++) {\n                this._gridFaceIndexCounts.push(0);\n                this._gridFaceIndexOffsets.push(0);\n                this._gridFaceMMatrices.push(create$4());\n            }\n            for (let i = 0; i < 12; i++) {\n                this._gridTicksMMatrices.push(create$4());\n                this._gridTicksRotations.push(create$4());\n                const _mat4 = this._gridTicksRotations[i];\n                _mat4[0] = Cube.EDGE_POSITIVES[i][0];\n                _mat4[1] = Cube.EDGE_POSITIVES[i][1];\n                _mat4[2] = Cube.EDGE_POSITIVES[i][2];\n                _mat4[4] = Cube.EDGE_NORMALS[i][0];\n                _mat4[5] = Cube.EDGE_NORMALS[i][1];\n                _mat4[6] = Cube.EDGE_NORMALS[i][2];\n                cross(this._vec3, Cube.EDGE_POSITIVES[i], Cube.EDGE_NORMALS[i]);\n                _mat4[8] = this._vec3[0];\n                _mat4[9] = this._vec3[1];\n                _mat4[10] = this._vec3[2];\n            }\n            this._fromValues = [null, null, null];\n            this._toValues = [null, null, null];\n            this.isDivisionPickingEnabled = [false, false, false];\n            this.isLabelPickingEnabled = [false, false, false];\n            this.isTitlePickingEnabled = [false, false, false];\n            this.isHeadingPickingEnabled = [false, false, false];\n            this.isAxisReversed = [false, false, false];\n            this._scalingX = 1;\n            this._scalingY = 1;\n            this._scalingZ = 1;\n            this._offset = create$4();\n        }\n        initialize() {\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this.isInitialized) {\n                if (this._hasChanged) {\n                    const start = window.performance.now();\n                    this._hasChanged = false;\n                    set$3(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, this._maxBoundsZ - this._minBoundsZ);\n                    const maxBounds = Math.max(this._size[0], Math.max(this._size[1], this._size[2]));\n                    this._size[0] *= this._scalingX / maxBounds;\n                    this._size[1] *= this._scalingY / maxBounds;\n                    this._size[2] *= this._scalingZ / maxBounds;\n                    this._updateGrids(this._size);\n                    this._updateText(this._size);\n                    if (this.hasChangedCallback) {\n                        this.hasChangedCallback();\n                    }\n                    this._core.log.write(LogLevel.info, `cartesian3d updated ${Math.round(window.performance.now() - start)}ms`);\n                }\n                multiply$2(this._mMatrix, this.mMatrix, this._offset);\n                this._mvMatrix = create$4();\n                multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n                fromMat4(this._mat3, this._mvMatrix);\n                for (let faceId = 0; faceId < 6; faceId++) {\n                    multiply$1(this._vec3, Cube.FACE_POSITIONS[faceId], this._size);\n                    transformMat4$2(this._forward, this._vec3, this._mvMatrix);\n                    transformMat3(this._normal, Cube.FACE_NORMALS[faceId], this._mat3);\n                    this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n                }\n                this._forward[0] = this._mat3[2];\n                this._forward[1] = this._mat3[5];\n                this._forward[2] = this._mat3[8];\n                for (let edgeId = 0; edgeId < 12; edgeId++) {\n                    const faceIds = Cube.EDGE_FACES[edgeId];\n                    const forward1 = this._isForwardFace[faceIds[0]];\n                    const forward2 = this._isForwardFace[faceIds[1]];\n                    const outsideEdge = forward1 != forward2;\n                    this._isOutsideEdge[edgeId] = outsideEdge;\n                    if (outsideEdge) {\n                        this._isForwardEdge[edgeId] = dot$1(Cube.EDGE_FORWARDS[edgeId], this._forward) < 0;\n                    }\n                    this._distances[edgeId] = 0;\n                }\n                for (let axisId = 0; axisId < 3; axisId++) {\n                    if (this.arePickDivisionsVisible[axisId]) {\n                        set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n                        set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n                        const gridTicksScale = this._gridTicksScales[axisId];\n                        for (let edge = 0; edge < 4; edge++) {\n                            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                            if (this._isOutsideEdge[edgeId] && this.isEdgeVisible[edgeId]) {\n                                let distance = this._distances[edgeId];\n                                distance += this._gridPickDivisionHeight * 0.5;\n                                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                                multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n                                scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance);\n                                translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                                if (!this._isForwardEdge[edgeId]) {\n                                    scale$1(gridTicksMMatrix, gridTicksMMatrix, Constants.VECTOR3_REFLECTX);\n                                }\n                                scale$1(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                                distance += this._gridPickDivisionHeight * 0.5;\n                                this._distances[edgeId] = distance;\n                            }\n                        }\n                    }\n                }\n                for (let axisId = 0; axisId < 3; axisId++) {\n                    if (this.areFacesVisible[axisId]) {\n                        const axisId2 = axisId == 0 ? 1 : 0;\n                        const axisId3 = axisId == 2 ? 1 : 2;\n                        set(this._gridFaceZeros[axisId], this.zero[axisId2], this.zero[axisId3]);\n                        set(this._gridFaceMinorGridlines[axisId], this.minorGridlines[axisId2], this.minorGridlines[axisId3]);\n                        for (let face = 0; face < 2; face++) {\n                            const faceId = Cube.AXIS_FACES[axisId][face];\n                            if (this._isForwardFace[faceId]) {\n                                const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                                scale$1(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                                if (this._size[axisId] > 0) {\n                                    translate(gridFaceMMatrix, gridFaceMMatrix, Cube.FACE_POSITIONS[faceId]);\n                                }\n                            }\n                        }\n                    }\n                }\n                for (let axisId = 0; axisId < 3; axisId++) {\n                    for (let edge = 0; edge < 4; edge++) {\n                        const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                        if (this._isOutsideEdge[edgeId]) {\n                            multiply$1(this._edgePosition, Cube.EDGE_POSITIONS[edgeId], this._size);\n                            transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n                            normalize$3(this._forward, this._edgePosition);\n                            negate(this._forward, this._forward);\n                            cross(this._right, Constants.VECTOR3_UNITY, this._forward);\n                            normalize$3(this._right, this._right);\n                            cross(this._up, this._forward, this._right);\n                            transformMat3(this._edgeNormal, Cube.EDGE_NORMALS[edgeId], this._mat3);\n                            transformMat3(this._edgePositive, Cube.EDGE_POSITIVES[edgeId], this._mat3);\n                            copy$4(this._edgeNormalTemp, this._edgeNormal);\n                            copy$4(this._edgePositiveTemp, this._edgePositive);\n                            const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n                            const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n                            const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n                            if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n                                copy$4(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n                            }\n                            else {\n                                negate(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n                                negate(this._edgeNormalTemp, this._edgeNormalTemp);\n                            }\n                            if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n                                this._isLeftToRightHorizontal[edgeId] = true;\n                                copy$4(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n                            }\n                            else {\n                                this._isLeftToRightHorizontal[edgeId] = false;\n                                negate(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n                                negate(this._edgePositiveTemp, this._edgePositiveTemp);\n                            }\n                            cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n                            if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n                                this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                                negate(edgeHorizontalRight, edgeHorizontalRight);\n                            }\n                            cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n                            const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n                            const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n                            const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n                            if (dot$1(this._edgeNormal, this._right) < 0) {\n                                copy$4(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n                            }\n                            else {\n                                negate(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n                                negate(this._edgeNormal, this._edgeNormal);\n                            }\n                            if (dot$1(this._edgePositive, this._up) < 0) {\n                                this._isLeftToRightVertical[edgeId] = true;\n                                copy$4(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n                            }\n                            else {\n                                this._isLeftToRightVertical[edgeId] = false;\n                                negate(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n                                negate(this._edgePositive, this._edgePositive);\n                            }\n                            cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n                            if (dot$1(edgeVerticalForward, this._forward) < 0) {\n                                this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                                negate(edgeVerticalRight, edgeVerticalRight);\n                            }\n                            cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n                            if (this.isEdgeVisible[edgeId]) {\n                                if (this._labels[axisId]) {\n                                    this._updateLabels(axisId, edgeId);\n                                }\n                                if (this._titles[axisId]) {\n                                    this._updateTitle(axisId, edgeId);\n                                }\n                            }\n                            if (this.isHeadingVisible[edgeId]) {\n                                this._updateHeading(axisId, edgeId);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        _updateLabels(axisId, edgeId) {\n            const orientation = this._orientations[axisId];\n            let distance = this._distances[edgeId];\n            let maxLabelSize = this._maxLabelSize[axisId][1];\n            if (orientation == AxesTextOrientation.parallel)\n                maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n            distance += maxLabelSize * 0.5;\n            multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance);\n            const labelMMatrix = this._labelMMatrices[edgeId];\n            labelMMatrix[12] = this._vec3[0];\n            labelMMatrix[13] = this._vec3[1];\n            labelMMatrix[14] = this._vec3[2];\n            if (orientation == AxesTextOrientation.parallel) {\n                const right = this._edgeHorizontalRight[edgeId];\n                const up = this._edgeHorizontalUp[edgeId];\n                const forward = this._edgeHorizontalForward[edgeId];\n                labelMMatrix[0] = right[0];\n                labelMMatrix[1] = right[1];\n                labelMMatrix[2] = right[2];\n                labelMMatrix[4] = up[0];\n                labelMMatrix[5] = up[1];\n                labelMMatrix[6] = up[2];\n                labelMMatrix[8] = forward[0];\n                labelMMatrix[9] = forward[1];\n                labelMMatrix[10] = forward[2];\n            }\n            else {\n                const right = this._edgeVerticalRight[edgeId];\n                const up = this._edgeVerticalUp[edgeId];\n                const forward = this._edgeVerticalForward[edgeId];\n                labelMMatrix[0] = right[0];\n                labelMMatrix[1] = right[1];\n                labelMMatrix[2] = right[2];\n                labelMMatrix[4] = up[0];\n                labelMMatrix[5] = up[1];\n                labelMMatrix[6] = up[2];\n                labelMMatrix[8] = forward[0];\n                labelMMatrix[9] = forward[1];\n                labelMMatrix[10] = forward[2];\n            }\n            multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n            if (orientation == AxesTextOrientation.perpendicular) {\n                multiply$2(labelMMatrix, labelMMatrix, Constants.MAT4_ROTATION_MINUS_90);\n            }\n            distance += maxLabelSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateTitle(axisId, edgeId) {\n            let distance = this._distances[edgeId];\n            const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n            distance += titleTextSize * 0.5;\n            multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance);\n            const titleMMatrix = this._titleMMatrices[edgeId];\n            titleMMatrix[12] = this._vec3[0];\n            titleMMatrix[13] = this._vec3[1];\n            titleMMatrix[14] = this._vec3[2];\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            titleMMatrix[0] = right[0];\n            titleMMatrix[1] = right[1];\n            titleMMatrix[2] = right[2];\n            titleMMatrix[4] = up[0];\n            titleMMatrix[5] = up[1];\n            titleMMatrix[6] = up[2];\n            titleMMatrix[8] = forward[0];\n            titleMMatrix[9] = forward[1];\n            titleMMatrix[10] = forward[2];\n            multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n            distance += titleTextSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateHeading(axisId, edgeId) {\n            let distance = this._distances[edgeId];\n            const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n            distance += headingTextSize * 0.5;\n            multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance);\n            const headingMMatrix = this._headingMMatrices[edgeId];\n            headingMMatrix[12] = this._vec3[0];\n            headingMMatrix[13] = this._vec3[1];\n            headingMMatrix[14] = this._vec3[2];\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            headingMMatrix[0] = right[0];\n            headingMMatrix[1] = right[1];\n            headingMMatrix[2] = right[2];\n            headingMMatrix[4] = up[0];\n            headingMMatrix[5] = up[1];\n            headingMMatrix[6] = up[2];\n            headingMMatrix[8] = forward[0];\n            headingMMatrix[9] = forward[1];\n            headingMMatrix[10] = forward[2];\n            multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n            distance += headingTextSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateGrids(size) {\n            let offset = 0;\n            this.pickGridLookup = {};\n            this._pickGrid = [];\n            const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n            const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n            const zDivisions = this._gridTicksPositions[2] ? this._gridTicksPositions[2].length - 1 : 0;\n            const count = 2 * (xDivisions * yDivisions) +\n                2 * (xDivisions * zDivisions) +\n                2 * (yDivisions * zDivisions) +\n                xDivisions +\n                yDivisions +\n                zDivisions;\n            const byteLength = PickGridVertex.SIZE_BYTES * count * 4;\n            if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n                this._gridVertices = new ArrayBuffer(byteLength);\n                this._gridVerticesView = new DataView(this._gridVertices);\n                this._gridIndices = new Uint16Array(count * 6);\n            }\n            for (let axisId = 0; axisId < 3; axisId++) {\n                const width = size[axisId];\n                set$3(this._gridTicksScales[axisId], width, this._gridPickDivisionHeight, 1);\n                offset = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset);\n                for (let face = 0; face < 2; face++) {\n                    const faceId = Cube.AXIS_FACES[axisId][face];\n                    offset = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset);\n                }\n                this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n            }\n        }\n        _updateText(size) {\n            let glyphOffset = 0;\n            let count = 0;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                const labels = this._labels[axisId];\n                if (labels) {\n                    for (let i = 0; i < labels.length; i++) {\n                        count += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n                    }\n                }\n                const title = this._titles[axisId];\n                if (title) {\n                    count += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n                }\n                const heading = this._headings[axisId];\n                if (heading) {\n                    count += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n                }\n            }\n            const byteLength = PositionTexturePickVertex.SIZE_BYTES * count * 4;\n            if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n                this._textVertices = new ArrayBuffer(byteLength);\n                this._textVerticesView = new DataView(this._textVertices);\n                this._textIndices = new Uint16Array(count * 6);\n            }\n            this.pickLabelLookup = {};\n            this._pickLabel = [];\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (this._labels[axisId]) {\n                    const width = size[axisId];\n                    const maxLabelSize = this._maxLabelSize[axisId];\n                    const orientation = this._orientations[axisId];\n                    set(maxLabelSize, 0, 0);\n                    this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n                    glyphOffset = this._updateLeftToRightAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n                    this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n                    this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n                    glyphOffset = this._updateRightToLeftAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n                    this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n                }\n                else {\n                    this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n                    this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n                    this._axesLeftToRightIndexCounts[axisId] = 0;\n                    this._axesRightToLeftIndexCounts[axisId] = 0;\n                    this._maxLabelSize[axisId][0] = 0;\n                    this._maxLabelSize[axisId][1] = 0;\n                }\n            }\n            this.pickTitleLookup = {};\n            this._pickTitle = [];\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (this._titles[axisId]) {\n                    set$3(this._textPosition, 0, 0, 0);\n                    set$3(this._textOffset, 0, 0, 0);\n                    this._titleIndexOffsets[axisId] = glyphOffset * 6;\n                    const text = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n                    const scale = this._titleSizes[axisId] / this._font.size;\n                    TextHelper.measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const maxGlyphTop = this._textMetric.maxTop * scale;\n                    const lineHeight = this._font.size * scale;\n                    this._textOffset[0] -= width / 2;\n                    this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n                    this.pickTitleLookup[pickId] = this._pickTitle.length;\n                    this._pickTitle.push(axisId);\n                    TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                    glyphOffset += text.length;\n                    this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n                }\n                else {\n                    this._titleIndexOffsets[axisId] = glyphOffset * 6;\n                    this._titleIndexCounts[axisId] = 0;\n                }\n            }\n            this.pickHeadingLookup = {};\n            this._pickHeading = [];\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (this._headings[axisId]) {\n                    set$3(this._textPosition, 0, 0, 0);\n                    set$3(this._textOffset, 0, 0, 0);\n                    this._headingIndexOffsets[axisId] = glyphOffset * 6;\n                    const text = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n                    const scale = this._headingSizes[axisId] / this._font.size;\n                    TextHelper.measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const maxGlyphTop = this._textMetric.maxTop * scale;\n                    const lineHeight = this._font.size * scale;\n                    this._textOffset[0] -= width / 2;\n                    this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n                    this.pickHeadingLookup[pickId] = this._pickHeading.length;\n                    this._pickHeading.push(axisId);\n                    TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                    glyphOffset += text.length;\n                    this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n                }\n                else {\n                    this._headingIndexOffsets[axisId] = glyphOffset * 6;\n                    this._headingIndexCounts[axisId] = 0;\n                }\n            }\n        }\n        _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n            const isAxisReversed = this.isAxisReversed[axisId];\n            for (let label = 0; label < labels.length; label++) {\n                const text = TextHelper.truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n                const lineHeight = scales[label];\n                const scale = lineHeight / this._font.size;\n                TextHelper.measure(this._font, text, this._textMetric);\n                const width = this._textMetric.width * scale;\n                const maxGlyphTop = this._textMetric.maxTop * scale;\n                const position = isAxisReversed ? 1 - positions[label] : positions[label];\n                switch (orientation) {\n                    case AxesTextOrientation.parallel:\n                        set$3(this._textPosition, (position - 0.5) * size, 0, 0);\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[0] = -width / 2;\n                        }\n                        else {\n                            this._textOffset[0] = position == 0 ? 0 : position == 1 ? -width : -width / 2;\n                        }\n                        this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                        maxSize[0] = Math.max(width, maxSize[0]);\n                        maxSize[1] = Math.max(lineHeight, maxSize[1]);\n                        break;\n                    case AxesTextOrientation.perpendicular:\n                        set$3(this._textPosition, 0, (position - 0.5) * size, 0);\n                        this._textOffset[0] = -width / 2;\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[1] = -maxGlyphTop / 2;\n                        }\n                        else {\n                            this._textOffset[1] = position == 0 ? 0 : position == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n                        }\n                        maxSize[0] = Math.max(lineHeight, maxSize[0]);\n                        maxSize[1] = Math.max(width, maxSize[1]);\n                        break;\n                }\n                const pickId = PickHelper.nextPickId();\n                PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n                this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n                this._pickLabel.push(axisId);\n                this._pickLabel.push(label);\n                TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                glyphOffset += text.length;\n            }\n            return glyphOffset;\n        }\n        _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n            const isAxisReversed = this.isAxisReversed[axisId];\n            for (let label = 0; label < labels.length; label++) {\n                const text = TextHelper.truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n                const lineHeight = scales[label];\n                const scale = lineHeight / this._font.size;\n                TextHelper.measure(this._font, text, this._textMetric);\n                const width = this._textMetric.width * scale;\n                const maxGlyphTop = this._textMetric.maxTop * scale;\n                const position = isAxisReversed ? 1 - positions[label] : positions[label];\n                switch (orientation) {\n                    case AxesTextOrientation.parallel:\n                        set$3(this._textPosition, (0.5 - position) * size, 0, 0);\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[0] = -width / 2;\n                        }\n                        else {\n                            this._textOffset[0] = label == 0 ? -width : label == labels.length - 1 ? 0 : -width / 2;\n                        }\n                        this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                        break;\n                    case AxesTextOrientation.perpendicular:\n                        set$3(this._textPosition, 0, (0.5 - position) * size, 0);\n                        this._textOffset[0] = -width / 2;\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[1] = -maxGlyphTop / 2;\n                        }\n                        else {\n                            this._textOffset[1] = label == 0 ? -maxGlyphTop : label == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n                        }\n                        break;\n                }\n                const pickId = PickHelper.nextPickId();\n                PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n                this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n                this._pickLabel.push(axisId);\n                this._pickLabel.push(label);\n                TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                glyphOffset += text.length;\n            }\n            return glyphOffset;\n        }\n        _updateGridTicks(axisId, dataView, indices, offset) {\n            this._gridTicksIndexOffsets[axisId] = offset * 6;\n            if (this._gridTicksPositions[axisId]) {\n                const axes = create$3();\n                const positions = this._gridTicksPositions[axisId];\n                const isAxisReversed = this.isAxisReversed[axisId];\n                let vertexOffset = offset * 4;\n                for (let position = 0; position < positions.length - 1; position++) {\n                    const left = isAxisReversed ? 1 - positions[position + 1] - 0.5 : positions[position] - 0.5;\n                    const right = isAxisReversed ? 1 - positions[position] - 0.5 : positions[position + 1] - 0.5;\n                    axes[axisId] = position + 1;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n                    this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                    this._pickGrid.push(axes[0]);\n                    this._pickGrid.push(axes[1]);\n                    this._pickGrid.push(axes[2]);\n                    let indexOffset = offset * 6;\n                    for (let j = 0; j < this._indexTemplate.length; j++) {\n                        indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n                    }\n                    set$2(this._bounds, left + 0.5, 0, right + 0.5, 1);\n                    this._translation[0] = left;\n                    this._translation[1] = 0.5;\n                    this._translation[2] = 0;\n                    this._texCoord[0] = left + 0.5;\n                    this._texCoord[1] = 1;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = right;\n                    this._texCoord[0] = right + 0.5;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = left;\n                    this._translation[1] = -0.5;\n                    this._texCoord[0] = left + 0.5;\n                    this._texCoord[1] = 0;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = right;\n                    this._texCoord[0] = right + 0.5;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    offset++;\n                }\n            }\n            this._gridTicksIndexCounts[axisId] = offset * 6 - this._gridTicksIndexOffsets[axisId];\n            return offset;\n        }\n        _updateGridFace(axisId, faceId, dataView, indices, offset) {\n            set$3(this._translation, 0, 0, 0);\n            this._gridFaceIndexOffsets[faceId] = offset * 6;\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n                const axes = create$3();\n                negate(this._normal, Cube.FACE_NORMALS[faceId]);\n                const positions2 = this._gridTicksPositions[axisId2];\n                const positions3 = this._gridTicksPositions[axisId3];\n                const isAxisReversed2 = this.isAxisReversed[axisId2];\n                const isAxisReversed3 = this.isAxisReversed[axisId3];\n                for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n                    const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n                    const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n                    axes[axisId2] = position2 + 1;\n                    let vertexOffset = offset * 4;\n                    for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n                        const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n                        const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n                        axes[axisId3] = position3 + 1;\n                        const pickId = PickHelper.nextPickId();\n                        PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n                        this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                        this._pickGrid.push(axes[0]);\n                        this._pickGrid.push(axes[1]);\n                        this._pickGrid.push(axes[2]);\n                        let indexOffset = offset * 6;\n                        for (let i = 0; i < this._indexTemplate.length; i++) {\n                            indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n                        }\n                        set$2(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n                        this._translation[axisId2] = min2;\n                        this._translation[axisId3] = max3;\n                        this._texCoord[0] = min2 + 0.5;\n                        this._texCoord[1] = max3 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = max2;\n                        this._texCoord[0] = max2 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = min2;\n                        this._translation[axisId3] = min3;\n                        this._texCoord[0] = min2 + 0.5;\n                        this._texCoord[1] = min3 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = max2;\n                        this._texCoord[0] = max2 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        offset++;\n                    }\n                }\n            }\n            this._gridFaceIndexCounts[faceId] = offset * 6 - this._gridFaceIndexOffsets[faceId];\n            return offset;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cartesian2dAxes extends AxesBase {\n        get size() { return this._size; }\n        get isDiscreteX() { return this._isDiscrete[0]; }\n        set isDiscreteX(value) {\n            if (value != this._isDiscrete[0]) {\n                this._isDiscrete[0] = value;\n                this._hasChanged = true;\n            }\n        }\n        get isDiscreteY() { return this._isDiscrete[1]; }\n        set isDiscreteY(value) {\n            if (value != this._isDiscrete[1]) {\n                this._isDiscrete[1] = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsX() { return this._minBoundsX; }\n        set minBoundsX(value) {\n            if (value != this._minBoundsX) {\n                this._minBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsX() { return this._maxBoundsX; }\n        set maxBoundsX(value) {\n            if (value != this._minBoundsX) {\n                this._maxBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsY() { return this._minBoundsY; }\n        set minBoundsY(value) {\n            if (value != this._minBoundsY) {\n                this._minBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsY() { return this._maxBoundsY; }\n        set maxBoundsY(value) {\n            if (value != this._minBoundsY) {\n                this._maxBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        getIsOutsideEdge(index) { return this._isOutsideEdge[index]; }\n        getIsForwardFace(index) { return this._isForwardFace[index]; }\n        get textVertices() { return this._textVertices; }\n        get textIndices() { return this._textIndices; }\n        getLabelMMatrix(index) { return this._labelMMatrices[index]; }\n        setLabelPositions(index, value) {\n            if (this._labelPositions[index] != value) {\n                this._labelPositions[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setLabels(index, value) {\n            if (this._labels[index] != value) {\n                this._labels[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setLabelSizes(index, value) {\n            if (this._labelSizes[index] != value) {\n                this._labelSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getLabelOrientation(index) { return this._orientations[index]; }\n        setLabelOrientation(index, orientation) {\n            if (this._orientations[index] != orientation) {\n                this._orientations[index] = orientation;\n                this._hasChanged = true;\n            }\n        }\n        getTitleIndexCount(index) { return this._titleIndexCounts[index]; }\n        getTitleIndexOffset(index) { return this._titleIndexOffsets[index]; }\n        getTitleMMatrix(index) { return this._titleMMatrices[index]; }\n        setTitle(index, value) {\n            if (this._titles[index] != value) {\n                this._titles[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setTitleSize(index, value) {\n            if (this._titleSizes[index] != value) {\n                this._titleSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getHeadingIndexCount(index) { return this._headingIndexCounts[index]; }\n        getHeadingIndexOffset(index) { return this._headingIndexOffsets[index]; }\n        getHeadingMMatrix(index) { return this._headingMMatrices[index]; }\n        setHeading(index, value) {\n            if (this._headings[index] != value) {\n                this._headings[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setHeadingSize(index, value) {\n            if (this._headingSizes[index] != value) {\n                this._headingSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getIsLeftToRightHorizontal(index) { return this._isLeftToRightHorizontal[index]; }\n        getIsLeftToRightVertical(index) { return this._isLeftToRightVertical[index]; }\n        getAxesLeftToRightIndexCount(index) { return this._axesLeftToRightIndexCounts[index]; }\n        getAxesRightToLeftIndexCount(index) { return this._axesRightToLeftIndexCounts[index]; }\n        getAxesLeftToRightIndexOffset(index) { return this._axesLeftToRightIndexOffsets[index]; }\n        getAxesRightToLeftIndexOffset(index) { return this._axesRightToLeftIndexOffsets[index]; }\n        get gridVertices() { return this._gridVertices; }\n        get gridIndices() { return this._gridIndices; }\n        getGridTicksIndexCount(index) { return this._gridTicksIndexCounts[index]; }\n        getGridTicksIndexOffset(index) { return this._gridTicksIndexOffsets[index]; }\n        getGridFaceIndexCount(index) { return this._gridFaceIndexCounts[index]; }\n        getGridFaceIndexOffset(index) { return this._gridFaceIndexOffsets[index]; }\n        getGridTicksMMatrix(index) { return this._gridTicksMMatrices[index]; }\n        getGridFaceMMatrix(index) { return this._gridFaceMMatrices[index]; }\n        getGridTicksScale(index) { return this._gridTicksScales[index]; }\n        getGridTicksZero(index) { return this._gridTicksZeros[index]; }\n        get gridFaceZero() { return this._gridFaceZeros; }\n        get gridFaceMinorGridlines() { return this._gridFaceMinorGridlines; }\n        getGridTicksMinorGridlines(index) { return this._gridTicksMinorGridlines[index]; }\n        setTickPositions(index, value) {\n            if (this._gridTicksPositions[index] != value) {\n                this._gridTicksPositions[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingX() { return this._scalingX; }\n        set scalingX(value) {\n            if (value != this._scalingX) {\n                this._scalingX = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingY() { return this._scalingY; }\n        set scalingY(value) {\n            if (value != this._scalingY) {\n                this._scalingY = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetX() { return this._offset[12]; }\n        set offsetX(value) {\n            if (value != this._offset[12]) {\n                this._offset[12] = value;\n            }\n        }\n        get offsetY() { return this._offset[13]; }\n        set offsetY(value) {\n            if (value != this._offset[13]) {\n                this._offset[13] = value;\n            }\n        }\n        set rotation(value) {\n            if (this._rotation != value) {\n                this._rotation = value;\n                this._rMatrix = create$4();\n                fromQuat(this._rMatrix, value);\n            }\n        }\n        constructor(core) {\n            super(core);\n            this._size = create$3();\n            this._translation = create$3();\n            this._normal = create$3();\n            this._forward = create$3();\n            this._right = create$3();\n            this._up = create$3();\n            this._texCoord = create();\n            this._bounds = create$2();\n            this._vec3 = create$3();\n            this._vec4 = create$2();\n            this._mat3 = create$5();\n            this._isDiscrete = [false, false];\n            this._minBoundsX = 0;\n            this._minBoundsY = 0;\n            this._maxBoundsX = 0;\n            this._maxBoundsY = 0;\n            this._isForwardFace = [];\n            this._isForwardEdge = [];\n            this._isOutsideEdge = [];\n            for (let i = 0; i < 2; i++) {\n                this._isForwardFace.push(false);\n            }\n            for (let i = 0; i < 4; i++) {\n                this._isForwardEdge.push(false);\n                this._isOutsideEdge.push(false);\n            }\n            this._textOffset = create$3();\n            this._textPosition = create$3();\n            this._distances = [];\n            for (let i = 0; i < 4; i++) {\n                this._distances.push(0);\n            }\n            this._labelPositions = [];\n            this._labels = [];\n            this._labelSizes = [];\n            this._maxLabelSize = [];\n            this._axesLeftToRightIndexCounts = [];\n            this._axesRightToLeftIndexCounts = [];\n            this._axesLeftToRightIndexOffsets = [];\n            this._axesRightToLeftIndexOffsets = [];\n            this._labelMMatrices = [];\n            this._orientations = [];\n            for (let i = 0; i < 2; i++) {\n                this._maxLabelSize.push(create());\n                this._orientations.push(AxesTextOrientation.parallel);\n                this._axesLeftToRightIndexCounts.push(0);\n                this._axesRightToLeftIndexCounts.push(0);\n                this._axesLeftToRightIndexOffsets.push(0);\n                this._axesRightToLeftIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 4; i++) {\n                this._labelMMatrices.push(create$4());\n            }\n            this._titles = [];\n            this._titleSizes = [];\n            this._titleIndexCounts = [];\n            this._titleIndexOffsets = [];\n            this._titleMMatrices = [];\n            for (let i = 0; i < 2; i++) {\n                this._titles.push(null);\n                this._titleSizes.push(core.config.axesTextTitleSize);\n                this._titleIndexCounts.push(0);\n                this._titleIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 4; i++) {\n                this._titleMMatrices.push(create$4());\n            }\n            this._headings = [];\n            this._headingSizes = [];\n            this._headingIndexCounts = [];\n            this._headingIndexOffsets = [];\n            this._headingMMatrices = [];\n            this.isHeadingVisible = [];\n            for (let i = 0; i < 2; i++) {\n                this._headings.push(null);\n                this._headingSizes.push(core.config.axesTextHeadingSize);\n                this._headingIndexCounts.push(0);\n                this._headingIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 4; i++) {\n                this._headingMMatrices.push(create$4());\n                this.isHeadingVisible.push(true);\n            }\n            this.isEdgeVisible = [];\n            this._edgePosition = create$3();\n            this._edgePositive = create$3();\n            this._edgeNormal = create$3();\n            this._edgeNormalTemp = create$3();\n            this._edgePositiveTemp = create$3();\n            this._isLeftToRightHorizontal = [];\n            this._isLeftToRightVertical = [];\n            this._edgeHorizontalRight = [];\n            this._edgeHorizontalUp = [];\n            this._edgeHorizontalForward = [];\n            this._edgeVerticalRight = [];\n            this._edgeVerticalUp = [];\n            this._edgeVerticalForward = [];\n            for (let i = 0; i < 4; i++) {\n                this.isEdgeVisible.push(true);\n                this._isLeftToRightHorizontal.push(false);\n                this._isLeftToRightVertical.push(false);\n                this._edgeHorizontalRight.push(create$3());\n                this._edgeHorizontalUp.push(create$3());\n                this._edgeHorizontalForward.push(create$3());\n                this._edgeVerticalRight.push(create$3());\n                this._edgeVerticalUp.push(create$3());\n                this._edgeVerticalForward.push(create$3());\n            }\n            this.isFaceVisible = [];\n            for (let i = 0; i < 2; i++) {\n                this.isFaceVisible.push(true);\n            }\n            this.arePickDivisionsVisible = [];\n            this.areFacesVisible = [];\n            this._indexTemplate = Quad$2.INDICES;\n            this.zero = create$3();\n            this._gridTicksZeros = [];\n            this._gridFaceZeros = create();\n            this.minorGridlines = fromValues$3(1, 1, 1);\n            this._gridTicksMinorGridlines = [];\n            this._gridFaceMinorGridlines = create();\n            this._gridTicksPositions = [];\n            this._gridTicksScales = [];\n            this._gridTicksIndexCounts = [];\n            this._gridTicksIndexOffsets = [];\n            this._gridFaceScale = create$3();\n            this._gridFaceIndexCounts = [];\n            this._gridFaceIndexOffsets = [];\n            this._gridFaceMMatrices = [];\n            this._gridTicksMMatrices = [];\n            this._gridTicksRotations = [];\n            for (let i = 0; i < 2; i++) {\n                this.arePickDivisionsVisible.push(true);\n                this.areFacesVisible.push(true);\n                this._gridTicksZeros.push(create());\n                this._gridTicksMinorGridlines.push(create());\n                this._gridTicksScales.push(create$3());\n                this._gridTicksIndexCounts.push(0);\n                this._gridTicksIndexOffsets.push(0);\n                this._gridFaceIndexCounts.push(0);\n                this._gridFaceIndexOffsets.push(0);\n                this._gridFaceMMatrices.push(create$4());\n            }\n            for (let i = 0; i < 4; i++) {\n                this._gridTicksMMatrices.push(create$4());\n                this._gridTicksRotations.push(create$4());\n                const _mat4 = this._gridTicksRotations[i];\n                _mat4[0] = Quad$2.EDGE_POSITIVES[i][0];\n                _mat4[1] = Quad$2.EDGE_POSITIVES[i][1];\n                _mat4[2] = Quad$2.EDGE_POSITIVES[i][2];\n                _mat4[4] = Quad$2.EDGE_NORMALS[i][0];\n                _mat4[5] = Quad$2.EDGE_NORMALS[i][1];\n                _mat4[6] = Quad$2.EDGE_NORMALS[i][2];\n                cross(this._vec3, Quad$2.EDGE_POSITIVES[i], Quad$2.EDGE_NORMALS[i]);\n                _mat4[8] = this._vec3[0];\n                _mat4[9] = this._vec3[1];\n                _mat4[10] = this._vec3[2];\n            }\n            this._fromValues = [null, null];\n            this._toValues = [null, null];\n            this.isDivisionPickingEnabled = [false, false];\n            this.isLabelPickingEnabled = [false, false];\n            this.isTitlePickingEnabled = [false, false];\n            this.isHeadingPickingEnabled = [false, false];\n            this.isAxisReversed = [false, false];\n            this._scalingX = 1;\n            this._scalingY = 1;\n            this._offset = create$4();\n        }\n        initialize() {\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this.isInitialized) {\n                if (this._hasChanged) {\n                    const start = window.performance.now();\n                    this._hasChanged = false;\n                    set$3(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, 0);\n                    const maxBounds = Math.max(this._size[0], this._size[1]);\n                    this._size[0] *= this._scalingX / maxBounds;\n                    this._size[1] *= this._scalingY / maxBounds;\n                    this._updateGrids(this._size);\n                    this._updateText(this._size);\n                    if (this.hasChangedCallback) {\n                        this.hasChangedCallback();\n                    }\n                    this._core.log.write(LogLevel.info, `cartesian2d updated ${Math.round(window.performance.now() - start)}ms`);\n                }\n                if (this._rMatrix) {\n                    mul(this._mMatrix, this.mMatrix, this._rMatrix);\n                    mul(this._mMatrix, this._mMatrix, this._offset);\n                }\n                else {\n                    multiply$2(this._mMatrix, this.mMatrix, this._offset);\n                }\n                this._mvMatrix = create$4();\n                multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n                fromMat4(this._mat3, this._mvMatrix);\n                for (let faceId = 0; faceId < 2; faceId++) {\n                    transformMat4$2(this._forward, Constants.VECTOR3_ZERO, this._mvMatrix);\n                    transformMat3(this._normal, Quad$2.FACE_NORMALS[faceId], this._mat3);\n                    this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n                }\n                this._forward[0] = this._mat3[2];\n                this._forward[1] = this._mat3[5];\n                this._forward[2] = this._mat3[8];\n                for (let edgeId = 0; edgeId < 4; edgeId++) {\n                    this._isForwardEdge[edgeId] = dot$1(Quad$2.EDGE_FORWARDS[edgeId], this._forward) < 0;\n                    this._distances[edgeId] = 0;\n                }\n                for (let axisId = 0; axisId < 2; axisId++) {\n                    if (this.arePickDivisionsVisible[axisId]) {\n                        set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n                        set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n                        const gridTicksScale = this._gridTicksScales[axisId];\n                        for (let edge = 0; edge < 2; edge++) {\n                            const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                            if (this.isEdgeVisible[edgeId]) {\n                                let distance = this._distances[edgeId];\n                                distance += this._gridPickDivisionHeight * 0.5;\n                                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                                multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n                                scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance);\n                                translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                                if (!this._isForwardEdge[edgeId]) {\n                                    scale$1(gridTicksMMatrix, gridTicksMMatrix, Constants.VECTOR3_REFLECTX);\n                                }\n                                scale$1(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                                distance += this._gridPickDivisionHeight * 0.5;\n                                this._distances[edgeId] = distance;\n                            }\n                        }\n                    }\n                }\n                set(this._gridFaceZeros, this.zero[0], this.zero[1]);\n                set(this._gridFaceMinorGridlines, this.minorGridlines[0], this.minorGridlines[1]);\n                for (let faceId = 0; faceId < 2; faceId++) {\n                    if (this._isForwardFace[faceId]) {\n                        const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                        scale$1(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                    }\n                }\n                for (let axisId = 0; axisId < 2; axisId++) {\n                    for (let edge = 0; edge < 2; edge++) {\n                        const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                        multiply$1(this._edgePosition, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n                        transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n                        normalize$3(this._forward, this._edgePosition);\n                        negate(this._forward, this._forward);\n                        cross(this._right, Constants.VECTOR3_UNITY, this._forward);\n                        normalize$3(this._right, this._right);\n                        cross(this._up, this._forward, this._right);\n                        transformMat3(this._edgeNormal, Quad$2.EDGE_NORMALS[edgeId], this._mat3);\n                        transformMat3(this._edgePositive, Quad$2.EDGE_POSITIVES[edgeId], this._mat3);\n                        copy$4(this._edgeNormalTemp, this._edgeNormal);\n                        copy$4(this._edgePositiveTemp, this._edgePositive);\n                        const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n                        const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n                        const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n                        if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n                            copy$4(edgeHorizontalUp, Quad$2.EDGE_NORMALS[edgeId]);\n                        }\n                        else {\n                            negate(edgeHorizontalUp, Quad$2.EDGE_NORMALS[edgeId]);\n                            negate(this._edgeNormalTemp, this._edgeNormalTemp);\n                        }\n                        if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n                            this._isLeftToRightHorizontal[edgeId] = true;\n                            copy$4(edgeHorizontalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n                        }\n                        else {\n                            this._isLeftToRightHorizontal[edgeId] = false;\n                            negate(edgeHorizontalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n                            negate(this._edgePositiveTemp, this._edgePositiveTemp);\n                        }\n                        cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n                        if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n                            this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                            negate(edgeHorizontalRight, edgeHorizontalRight);\n                        }\n                        cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n                        const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n                        const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n                        const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n                        if (dot$1(this._edgeNormal, this._right) < 0) {\n                            copy$4(edgeVerticalUp, Quad$2.EDGE_NORMALS[edgeId]);\n                        }\n                        else {\n                            negate(edgeVerticalUp, Quad$2.EDGE_NORMALS[edgeId]);\n                            negate(this._edgeNormal, this._edgeNormal);\n                        }\n                        if (dot$1(this._edgePositive, this._up) < 0) {\n                            this._isLeftToRightVertical[edgeId] = true;\n                            copy$4(edgeVerticalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n                        }\n                        else {\n                            this._isLeftToRightVertical[edgeId] = false;\n                            negate(edgeVerticalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n                            negate(this._edgePositive, this._edgePositive);\n                        }\n                        cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n                        if (dot$1(edgeVerticalForward, this._forward) < 0) {\n                            this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                            negate(edgeVerticalRight, edgeVerticalRight);\n                        }\n                        cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n                        if (this.isEdgeVisible[edgeId]) {\n                            if (this._labels[axisId]) {\n                                this._updateLabels(axisId, edgeId);\n                            }\n                            if (this._titles[axisId]) {\n                                this._updateTitle(axisId, edgeId);\n                            }\n                        }\n                        if (this.isHeadingVisible[edgeId]) {\n                            this._updateHeading(axisId, edgeId);\n                        }\n                    }\n                }\n            }\n        }\n        _updateLabels(axisId, edgeId) {\n            const orientation = this._orientations[axisId];\n            let distance = this._distances[edgeId];\n            let maxLabelSize = this._maxLabelSize[axisId][1];\n            if (orientation == AxesTextOrientation.parallel)\n                maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n            distance += maxLabelSize * 0.5;\n            multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance);\n            const labelMMatrix = this._labelMMatrices[edgeId];\n            labelMMatrix[12] = this._vec3[0];\n            labelMMatrix[13] = this._vec3[1];\n            labelMMatrix[14] = this._vec3[2];\n            if (orientation == AxesTextOrientation.parallel) {\n                const right = this._edgeHorizontalRight[edgeId];\n                const up = this._edgeHorizontalUp[edgeId];\n                const forward = this._edgeHorizontalForward[edgeId];\n                labelMMatrix[0] = right[0];\n                labelMMatrix[1] = right[1];\n                labelMMatrix[2] = right[2];\n                labelMMatrix[4] = up[0];\n                labelMMatrix[5] = up[1];\n                labelMMatrix[6] = up[2];\n                labelMMatrix[8] = forward[0];\n                labelMMatrix[9] = forward[1];\n                labelMMatrix[10] = forward[2];\n            }\n            else {\n                const right = this._edgeVerticalRight[edgeId];\n                const up = this._edgeVerticalUp[edgeId];\n                const forward = this._edgeVerticalForward[edgeId];\n                labelMMatrix[0] = right[0];\n                labelMMatrix[1] = right[1];\n                labelMMatrix[2] = right[2];\n                labelMMatrix[4] = up[0];\n                labelMMatrix[5] = up[1];\n                labelMMatrix[6] = up[2];\n                labelMMatrix[8] = forward[0];\n                labelMMatrix[9] = forward[1];\n                labelMMatrix[10] = forward[2];\n            }\n            multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n            if (orientation == AxesTextOrientation.perpendicular) {\n                multiply$2(labelMMatrix, labelMMatrix, Constants.MAT4_ROTATION_MINUS_90);\n            }\n            distance += maxLabelSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateTitle(axisId, edgeId) {\n            let distance = this._distances[edgeId];\n            const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n            distance += titleTextSize * 0.5;\n            multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance);\n            const titleMMatrix = this._titleMMatrices[edgeId];\n            titleMMatrix[12] = this._vec3[0];\n            titleMMatrix[13] = this._vec3[1];\n            titleMMatrix[14] = this._vec3[2];\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            titleMMatrix[0] = right[0];\n            titleMMatrix[1] = right[1];\n            titleMMatrix[2] = right[2];\n            titleMMatrix[4] = up[0];\n            titleMMatrix[5] = up[1];\n            titleMMatrix[6] = up[2];\n            titleMMatrix[8] = forward[0];\n            titleMMatrix[9] = forward[1];\n            titleMMatrix[10] = forward[2];\n            multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n            distance += titleTextSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateHeading(axisId, edgeId) {\n            let distance = this._distances[edgeId];\n            const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n            distance += headingTextSize * 0.5;\n            multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance);\n            const headingMMatrix = this._headingMMatrices[edgeId];\n            headingMMatrix[12] = this._vec3[0];\n            headingMMatrix[13] = this._vec3[1];\n            headingMMatrix[14] = this._vec3[2];\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            headingMMatrix[0] = right[0];\n            headingMMatrix[1] = right[1];\n            headingMMatrix[2] = right[2];\n            headingMMatrix[4] = up[0];\n            headingMMatrix[5] = up[1];\n            headingMMatrix[6] = up[2];\n            headingMMatrix[8] = forward[0];\n            headingMMatrix[9] = forward[1];\n            headingMMatrix[10] = forward[2];\n            multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n            distance += headingTextSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateGrids(size) {\n            let offset = 0;\n            this.pickGridLookup = {};\n            this._pickGrid = [];\n            const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n            const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n            const count = 2 * (xDivisions * yDivisions) +\n                xDivisions +\n                yDivisions;\n            const byteLength = PickGridVertex.SIZE_BYTES * count * 4;\n            if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n                this._gridVertices = new ArrayBuffer(byteLength);\n                this._gridVerticesView = new DataView(this._gridVertices);\n                this._gridIndices = new Uint16Array(count * 6);\n            }\n            for (let axisId = 0; axisId < 2; axisId++) {\n                const width = size[axisId];\n                set$3(this._gridTicksScales[axisId], width, this._gridPickDivisionHeight, 1);\n                offset = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset);\n                this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n            }\n            const axisId = 2;\n            this._gridFaceScale[axisId] = 1;\n            for (let faceId = 0; faceId < 2; faceId++) {\n                offset = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset);\n            }\n        }\n        _updateText(size) {\n            let glyphOffset = 0;\n            let count = 0;\n            for (let axisId = 0; axisId < 2; axisId++) {\n                const labels = this._labels[axisId];\n                if (labels) {\n                    for (let i = 0; i < labels.length; i++) {\n                        count += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n                    }\n                }\n                const title = this._titles[axisId];\n                if (title) {\n                    count += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n                }\n                const heading = this._headings[axisId];\n                if (heading) {\n                    count += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n                }\n            }\n            const byteLength = PositionTexturePickVertex.SIZE_BYTES * count * 4;\n            if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n                this._textVertices = new ArrayBuffer(byteLength);\n                this._textVerticesView = new DataView(this._textVertices);\n                this._textIndices = new Uint16Array(count * 6);\n            }\n            this.pickLabelLookup = {};\n            this._pickLabel = [];\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (this._labels[axisId]) {\n                    const width = size[axisId];\n                    const maxLabelSize = this._maxLabelSize[axisId];\n                    const orientation = this._orientations[axisId];\n                    set(maxLabelSize, 0, 0);\n                    this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n                    glyphOffset = this._updateLeftToRightAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n                    this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n                    this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n                    glyphOffset = this._updateRightToLeftAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n                    this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n                }\n                else {\n                    this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n                    this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n                    this._axesLeftToRightIndexCounts[axisId] = 0;\n                    this._axesRightToLeftIndexCounts[axisId] = 0;\n                    this._maxLabelSize[axisId][0] = 0;\n                    this._maxLabelSize[axisId][1] = 0;\n                }\n            }\n            this.pickTitleLookup = {};\n            this._pickTitle = [];\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (this._titles[axisId]) {\n                    set$3(this._textPosition, 0, 0, 0);\n                    set$3(this._textOffset, 0, 0, 0);\n                    this._titleIndexOffsets[axisId] = glyphOffset * 6;\n                    const text = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n                    const scale = this._titleSizes[axisId] / this._font.size;\n                    TextHelper.measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const maxGlyphTop = this._textMetric.maxTop * scale;\n                    const lineHeight = this._font.size * scale;\n                    this._textOffset[0] -= width / 2;\n                    this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n                    this.pickTitleLookup[pickId] = this._pickTitle.length;\n                    this._pickTitle.push(axisId);\n                    TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                    glyphOffset += text.length;\n                    this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n                }\n                else {\n                    this._titleIndexOffsets[axisId] = glyphOffset * 6;\n                    this._titleIndexCounts[axisId] = 0;\n                }\n            }\n            this.pickHeadingLookup = {};\n            this._pickHeading = [];\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (this._headings[axisId]) {\n                    set$3(this._textPosition, 0, 0, 0);\n                    set$3(this._textOffset, 0, 0, 0);\n                    this._headingIndexOffsets[axisId] = glyphOffset * 6;\n                    const text = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n                    const scale = this._headingSizes[axisId] / this._font.size;\n                    TextHelper.measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const maxGlyphTop = this._textMetric.maxTop * scale;\n                    const lineHeight = this._font.size * scale;\n                    this._textOffset[0] -= width / 2;\n                    this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n                    this.pickHeadingLookup[pickId] = this._pickHeading.length;\n                    this._pickHeading.push(axisId);\n                    TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                    glyphOffset += text.length;\n                    this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n                }\n                else {\n                    this._headingIndexOffsets[axisId] = glyphOffset * 6;\n                    this._headingIndexCounts[axisId] = 0;\n                }\n            }\n        }\n        _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n            const isAxisReversed = this.isAxisReversed[axisId];\n            for (let label = 0; label < labels.length; label++) {\n                const text = TextHelper.truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n                const lineHeight = scales[label];\n                const scale = lineHeight / this._font.size;\n                TextHelper.measure(this._font, text, this._textMetric);\n                const width = this._textMetric.width * scale;\n                const maxGlyphTop = this._textMetric.maxTop * scale;\n                const position = isAxisReversed ? 1 - positions[label] : positions[label];\n                switch (orientation) {\n                    case AxesTextOrientation.parallel:\n                        set$3(this._textPosition, (position - 0.5) * size, 0, 0);\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[0] = -width / 2;\n                        }\n                        else {\n                            this._textOffset[0] = position == 0 ? 0 : position == 1 ? -width : -width / 2;\n                        }\n                        this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                        maxSize[0] = Math.max(width, maxSize[0]);\n                        maxSize[1] = Math.max(lineHeight, maxSize[1]);\n                        break;\n                    case AxesTextOrientation.perpendicular:\n                        set$3(this._textPosition, 0, (position - 0.5) * size, 0);\n                        this._textOffset[0] = -width / 2;\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[1] = -maxGlyphTop / 2;\n                        }\n                        else {\n                            this._textOffset[1] = position == 0 ? 0 : position == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n                        }\n                        maxSize[0] = Math.max(lineHeight, maxSize[0]);\n                        maxSize[1] = Math.max(width, maxSize[1]);\n                        break;\n                }\n                const pickId = PickHelper.nextPickId();\n                PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n                this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n                this._pickLabel.push(axisId);\n                this._pickLabel.push(label);\n                TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                glyphOffset += text.length;\n            }\n            return glyphOffset;\n        }\n        _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n            const isAxisReversed = this.isAxisReversed[axisId];\n            for (let label = 0; label < labels.length; label++) {\n                const text = TextHelper.truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n                const lineHeight = scales[label];\n                const scale = lineHeight / this._font.size;\n                TextHelper.measure(this._font, text, this._textMetric);\n                const width = this._textMetric.width * scale;\n                const maxGlyphTop = this._textMetric.maxTop * scale;\n                const position = isAxisReversed ? 1 - positions[label] : positions[label];\n                switch (orientation) {\n                    case AxesTextOrientation.parallel:\n                        set$3(this._textPosition, (0.5 - position) * size, 0, 0);\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[0] = -width / 2;\n                        }\n                        else {\n                            this._textOffset[0] = label == 0 ? -width : label == labels.length - 1 ? 0 : -width / 2;\n                        }\n                        this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                        break;\n                    case AxesTextOrientation.perpendicular:\n                        set$3(this._textPosition, 0, (0.5 - position) * size, 0);\n                        this._textOffset[0] = -width / 2;\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[1] = -maxGlyphTop / 2;\n                        }\n                        else {\n                            this._textOffset[1] = label == 0 ? -maxGlyphTop : label == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n                        }\n                        break;\n                }\n                const pickId = PickHelper.nextPickId();\n                PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n                this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n                this._pickLabel.push(axisId);\n                this._pickLabel.push(label);\n                TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                glyphOffset += text.length;\n            }\n            return glyphOffset;\n        }\n        _updateGridTicks(axisId, dataView, indices, offset) {\n            this._gridTicksIndexOffsets[axisId] = offset * 6;\n            if (this._gridTicksPositions[axisId]) {\n                const axes = create$3();\n                const positions = this._gridTicksPositions[axisId];\n                const isAxisReversed = this.isAxisReversed[axisId];\n                let vertexOffset = offset * 4;\n                for (let position = 0; position < positions.length - 1; position++) {\n                    const left = isAxisReversed ? 1 - positions[position + 1] - 0.5 : positions[position] - 0.5;\n                    const right = isAxisReversed ? 1 - positions[position] - 0.5 : positions[position + 1] - 0.5;\n                    axes[axisId] = position + 1;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n                    this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                    this._pickGrid.push(axes[0]);\n                    this._pickGrid.push(axes[1]);\n                    this._pickGrid.push(axes[2]);\n                    let indexOffset = offset * 6;\n                    for (let j = 0; j < this._indexTemplate.length; j++) {\n                        indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n                    }\n                    set$2(this._bounds, left + 0.5, 0, right + 0.5, 1);\n                    this._translation[0] = left;\n                    this._translation[1] = 0.5;\n                    this._translation[2] = 0;\n                    this._texCoord[0] = left + 0.5;\n                    this._texCoord[1] = 1;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = right;\n                    this._texCoord[0] = right + 0.5;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = left;\n                    this._translation[1] = -0.5;\n                    this._texCoord[0] = left + 0.5;\n                    this._texCoord[1] = 0;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = right;\n                    this._texCoord[0] = right + 0.5;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    offset++;\n                }\n            }\n            this._gridTicksIndexCounts[axisId] = offset * 6 - this._gridTicksIndexOffsets[axisId];\n            return offset;\n        }\n        _updateGridFace(axisId, faceId, dataView, indices, offset) {\n            set$3(this._translation, 0, 0, 0);\n            this._gridFaceIndexOffsets[faceId] = offset * 6;\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n                const axes = create$3();\n                negate(this._normal, Quad$2.FACE_NORMALS[faceId]);\n                const positions2 = this._gridTicksPositions[axisId2];\n                const positions3 = this._gridTicksPositions[axisId3];\n                const isAxisReversed2 = this.isAxisReversed[axisId2];\n                const isAxisReversed3 = this.isAxisReversed[axisId3];\n                for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n                    const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n                    const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n                    axes[axisId2] = position2 + 1;\n                    let vertexOffset = offset * 4;\n                    for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n                        const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n                        const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n                        axes[axisId3] = position3 + 1;\n                        const pickId = PickHelper.nextPickId();\n                        PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n                        this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                        this._pickGrid.push(axes[0]);\n                        this._pickGrid.push(axes[1]);\n                        this._pickGrid.push(axes[2]);\n                        let indexOffset = offset * 6;\n                        for (let i = 0; i < this._indexTemplate.length; i++) {\n                            indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n                        }\n                        set$2(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n                        this._translation[axisId2] = min2;\n                        this._translation[axisId3] = max3;\n                        this._texCoord[0] = min2 + 0.5;\n                        this._texCoord[1] = max3 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = max2;\n                        this._texCoord[0] = max2 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = min2;\n                        this._translation[axisId3] = min3;\n                        this._texCoord[0] = min2 + 0.5;\n                        this._texCoord[1] = min3 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = max2;\n                        this._texCoord[0] = max2 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        offset++;\n                    }\n                }\n            }\n            this._gridFaceIndexCounts[faceId] = offset * 6 - this._gridFaceIndexOffsets[faceId];\n            return offset;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Glyph {\n        toJSON() {\n            return {\n                key: this.key,\n                char: this.char,\n                width: this.width,\n                height: this.height,\n                top: this.top,\n                left: this.left,\n                advance: this.advance,\n                u0: this.u0,\n                v0: this.v0,\n                u1: this.u1,\n                v1: this.v1,\n            };\n        }\n    }\n    let FontVisual$2 = class FontVisual {\n        update() { }\n        constructor(font) {\n            this.font = font;\n        }\n    };\n    class Font {\n        get atlas() { return this._rasterizer.fontAtlas; }\n        get count() { return this._chars.size; }\n        constructor(core, rasterizer) {\n            this._core = core;\n            this._rasterizer = rasterizer;\n            this._chars = new Set();\n            this._previousSize = 0;\n            this.glyphs = {};\n        }\n        addGlyph(char) {\n            if (!this._chars.has(char)) {\n                this._chars.add(char);\n                this._rasterizer.draw(char);\n                this._hasChanged = true;\n            }\n        }\n        update() {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._core.log.write(LogLevel.info, `${this.name} added ${this._chars.size - this._previousSize} new glyphs`);\n                this._previousSize = this._chars.size;\n                if (this.hasChangedCallback) {\n                    this.hasChangedCallback();\n                }\n            }\n        }\n        toJSON() {\n            const glyphs = [];\n            for (let key in this.glyphs) {\n                const glyph = this.glyphs[key];\n                glyphs.push(glyph.toJSON());\n            }\n            return {\n                name: this.name,\n                size: this.size,\n                border: this.border,\n                glyphs: glyphs,\n                edgeValue: this.edgeValue,\n            };\n        }\n    }\n    class FontAtlas {\n        constructor(width, height) {\n            const canvas = document.createElement(\"canvas\");\n            canvas.width = width;\n            canvas.height = height;\n            const context = canvas.getContext(\"2d\");\n            context.clearRect(0, 0, width, height);\n            this.imageData = context.getImageData(0, 0, width, height);\n            this.x = 0;\n            this.top = new Uint16Array(width);\n        }\n    }\n    class FontRasterizer {\n        get font() { return this._font; }\n        get fontAtlas() { return this._fontAtlas; }\n        constructor(core, options) {\n            let start = performance.now();\n            this._core = core;\n            this._fontAtlas = options.fontAtlas;\n            this._fontSize = options.fontSize;\n            this._border = options.border;\n            this._fontFamily = options.fontFamily;\n            this._fontWeight = options.fontWeight;\n            this._fontStyle = options.fontStyle;\n            this._baseline = options.baseline;\n            this._maxDistance = options.maxDistance;\n            this._edgeValue = options.edgeValue;\n            this._font = new Font(core, this);\n            this._font.name = `${this._fontFamily}${this._fontSize}${this._fontWeight == \"normal\" ? \"\" : this._fontWeight}${this._fontStyle == \"normal\" ? \"\" : this._fontStyle}`.replace(/[^a-z0-9,]/ig, \"\").toLowerCase();\n            this._font.size = this._fontSize;\n            this._font.border = this._border;\n            this._font.edgeValue = this._edgeValue;\n            const glyphRasterizerOptions = {\n                baseline: this._baseline,\n                border: this._border,\n                edgeValue: this._edgeValue,\n                fontFamily: this._fontFamily,\n                fontSize: this._fontSize,\n                fontStyle: this._fontStyle,\n                fontWeight: this._fontWeight,\n                maxDistance: this._maxDistance,\n            };\n            this._glyphRasterizer = new GlyphRasterizer(core, glyphRasterizerOptions);\n            this._core.log.write(LogLevel.info, `font rasterizer ${Math.round(window.performance.now() - start)}ms`);\n        }\n        draw(char) {\n            const glyph = this._glyphRasterizer.draw(char);\n            const texWidth = glyph.width + 2 * this._border;\n            const texHeight = glyph.height + 2 * this._border;\n            const width = this._fontAtlas.imageData.width;\n            const height = this._fontAtlas.imageData.height;\n            if (this._fontAtlas.x + texWidth > width) {\n                this._fontAtlas.x = 0;\n            }\n            let y = 0;\n            for (let x = this._fontAtlas.x; x < this._fontAtlas.x + texWidth; x++) {\n                y = Math.max(y, this._fontAtlas.top[x]);\n            }\n            if (y + texHeight > height) {\n                this._core.log.write(LogLevel.warn, `${this._font.name} height overflow`);\n            }\n            for (let x = this._fontAtlas.x; x < this._fontAtlas.x + texWidth; x++) {\n                this._fontAtlas.top[x] = y + texHeight;\n            }\n            glyph.u0 = this._fontAtlas.x / width;\n            glyph.v0 = y / height;\n            glyph.u1 = (this._fontAtlas.x + texWidth) / width;\n            glyph.v1 = (y + texHeight) / height;\n            this._font.glyphs[char] = glyph;\n            for (let i = 0; i < glyph.distances.length; i++) {\n                const distance = glyph.distances[i];\n                const dataX = i % texWidth;\n                const dataY = Math.floor(i / texWidth);\n                const offset = (this._fontAtlas.x + dataX + (y + dataY) * width) * 4;\n                this._fontAtlas.imageData.data[offset + 0] = distance;\n                this._fontAtlas.imageData.data[offset + 1] = distance;\n                this._fontAtlas.imageData.data[offset + 2] = distance;\n                this._fontAtlas.imageData.data[offset + 3] = 0xff;\n            }\n            this._fontAtlas.x += texWidth;\n        }\n    }\n    class GlyphRasterizer {\n        constructor(core, options) {\n            let start = performance.now();\n            this._core = core;\n            this._fontSize = options.fontSize;\n            this._border = options.border;\n            this._fontFamily = options.fontFamily;\n            this._fontWeight = options.fontWeight;\n            this._fontStyle = options.fontStyle;\n            this._baseline = options.baseline;\n            this._maxDistance = options.maxDistance;\n            this._edgeValue = options.edgeValue;\n            this._size = this._fontSize + this._border * 2;\n            this._size += this._border * 2;\n            this._gridOuter = new Float64Array(this._size * this._size);\n            this._gridInner = new Float64Array(this._size * this._size);\n            this._f = new Float64Array(this._size);\n            this._z = new Float64Array(this._size + 1);\n            this._v = new Uint16Array(this._size);\n            const canvas = document.createElement(\"canvas\");\n            canvas.width = canvas.height = this._size;\n            this._context = canvas.getContext(\"2d\", { willReadFrequently: true });\n            this._context.font = `${this._fontStyle} ${this._fontWeight} ${this._fontSize}px ${this._fontFamily} `;\n            this._context.textBaseline = this._baseline;\n            this._context.textAlign = \"left\";\n            this._context.fillStyle = \"black\";\n            this._core.log.write(LogLevel.info, `glyph rasterizer ${Math.round(window.performance.now() - start)}ms`);\n        }\n        draw(char) {\n            const textMetrics = this._context.measureText(char);\n            const glyphLeft = 0;\n            const glyphTop = Math.floor(textMetrics.actualBoundingBoxAscent);\n            let glyphWidth = Math.ceil(textMetrics.actualBoundingBoxRight);\n            let glyphHeight = Math.ceil(textMetrics.actualBoundingBoxAscent) + Math.ceil(textMetrics.actualBoundingBoxDescent);\n            glyphWidth = Math.min(this._size - this._border, glyphWidth);\n            glyphHeight = Math.min(this._size - this._border, glyphHeight);\n            const width = glyphWidth + 2 * this._border;\n            const height = glyphHeight + 2 * this._border;\n            const length = width * height;\n            const distances = new Uint8ClampedArray(length);\n            const gradientsX = new Uint8ClampedArray(length);\n            const gradientsY = new Uint8ClampedArray(length);\n            const pixels = new Uint8ClampedArray(length);\n            const glyph = new Glyph();\n            glyph.char = char;\n            glyph.key = char.codePointAt(0);\n            glyph.distances = distances;\n            glyph.gradientsX = gradientsX;\n            glyph.gradientsY = gradientsY;\n            glyph.pixels = pixels;\n            glyph.width = glyphWidth;\n            glyph.height = glyphHeight;\n            glyph.top = glyphTop;\n            glyph.left = glyphLeft;\n            glyph.advance = textMetrics.width;\n            if (glyphWidth == 0 || glyphHeight == 0) {\n                return glyph;\n            }\n            this._context.clearRect(this._border, this._border, glyphWidth, glyphHeight);\n            this._context.fillText(char, this._border, this._border + glyphTop);\n            const imgData = this._context.getImageData(this._border, this._border, glyphWidth, glyphHeight);\n            for (let i = 0; i < length; i++) {\n                this._gridOuter[i] = Number.MAX_VALUE;\n                this._gridInner[i] = 0;\n            }\n            for (let y = 0; y < glyphHeight; y++) {\n                for (let x = 0; x < glyphWidth; x++) {\n                    const a = imgData.data[4 * (y * glyphWidth + x) + 3] / 0xff;\n                    if (a > 0) {\n                        const j = (y + this._border) * width + x + this._border;\n                        if (a == 1) {\n                            this._gridOuter[j] = 0;\n                            this._gridInner[j] = Number.MAX_VALUE;\n                        }\n                        else {\n                            const d = 0.5 - a;\n                            this._gridOuter[j] = d > 0 ? d * d : 0;\n                            this._gridInner[j] = d < 0 ? d * d : 0;\n                            pixels[j] = 0xff;\n                        }\n                    }\n                }\n            }\n            this._edt(this._gridOuter, 0, 0, width, height, width, this._f, this._v, this._z);\n            this._edt(this._gridInner, this._border, this._border, glyphWidth, glyphHeight, width, this._f, this._v, this._z);\n            const distances2 = new Float32Array(length);\n            for (let i = 0; i < length; i++) {\n                const distance = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n                distances[i] = Math.round(this._edgeValue - distance * 0xff / this._maxDistance);\n                distances2[i] = distance;\n            }\n            for (let i = 0; i < length; i++) {\n                const x = i % width;\n                const y = Math.floor(i / width);\n                const d = distances2[i];\n                const sign = d < 0 ? -1 : 1;\n                const x0 = x > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n                const x1 = x < width - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n                const y0 = y > 0 ? distances2[i - width] : Number.MAX_VALUE;\n                const y1 = y < height - 1 ? distances2[i + width] : Number.MAX_VALUE;\n                let gradientX = sign * x0 < sign * x1 ? d - x0 : x1 - d;\n                let gradientY = sign * y0 < sign * y1 ? y0 - d : d - y1;\n                gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 0xff);\n                gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 0xff);\n            }\n            return glyph;\n        }\n        _edt(data, x0, y0, width, height, gridSize, f, v, z) {\n            for (let x = x0; x < x0 + width; x++)\n                this._edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);\n            for (let y = y0; y < y0 + height; y++)\n                this._edt1d(data, y * gridSize + x0, 1, width, f, v, z);\n        }\n        _edt1d(grid, offset, stride, n, f, v, z) {\n            v[0] = 0;\n            z[0] = -Number.MAX_VALUE;\n            z[1] = Number.MAX_VALUE;\n            f[0] = grid[offset];\n            for (let q = 1, k = 0, s = 0; q < n; q++) {\n                f[q] = grid[offset + q * stride];\n                const q2 = q * q;\n                do {\n                    const r = v[k];\n                    s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n                } while (s <= z[k] && --k > -1);\n                k++;\n                v[k] = q;\n                z[k] = s;\n                z[k + 1] = Number.MAX_VALUE;\n            }\n            for (let q = 0, k = 0; q < n; q++) {\n                while (z[k + 1] < q) {\n                    k++;\n                }\n                const r = v[k];\n                const qr = q - r;\n                grid[offset + q * stride] = f[r] + qr * qr;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ManipulationProcessor {\n        get manipulators() { return this._manipulators; }\n        get count() { return this._count; }\n        get isDragging() { return this._isDragging; }\n        constructor(core) {\n            this._core = core;\n            this._count = 0;\n            this._centroid = create$3();\n            this._previousCentroid = create$3();\n            this._relativePositionToCentroid = create$3();\n            this._directionToCentroid = create$3();\n            this._previousDirectionToCentroid = create$3();\n            this._manipulators = {};\n            this._removedManipulators = [];\n            this.cumulativeTranslation = create$3();\n            this.translationDelta = create$3();\n            this.centroid = create$3();\n            this.maxScale = Number.MAX_VALUE;\n            this.twistAxis = fromValues$3(0, 0, 1);\n            this.initialize();\n        }\n        update(elapsedTime, manipulators) {\n            for (const key in this._manipulators) {\n                const manipulator = this._manipulators[key];\n                if (!manipulators[manipulator.id]) {\n                    if (this.removeManipulator) {\n                        this.removeManipulator(manipulator);\n                    }\n                    this._removedManipulators.push(manipulator.id);\n                }\n            }\n            if (this._removedManipulators.length > 0) {\n                for (let i = 0; i < this._removedManipulators.length; i++) {\n                    delete this._manipulators[this._removedManipulators[i]];\n                    this._count--;\n                }\n                this._removedManipulators = [];\n            }\n            for (const key in manipulators) {\n                const manipulator = manipulators[key];\n                if (!this._manipulators[manipulator.id]) {\n                    if (!this.addManipulator || this.addManipulator(manipulator)) {\n                        copy$4(manipulator.initialPosition, manipulator.position);\n                        this._manipulators[manipulator.id] = manipulator;\n                        this._count++;\n                    }\n                }\n            }\n            set$3(this.translationDelta, 0, 0, 0);\n            this.scaleDelta = 0;\n            this.twistDelta = 0;\n            if (this._count > 0) {\n                if (this._previousCount > 0) {\n                    if (this.prepareManipulation) {\n                        this.prepareManipulation();\n                    }\n                    this._process();\n                    if (this.processManipulation) {\n                        this.processManipulation(elapsedTime);\n                    }\n                }\n                else {\n                    this.initialize();\n                    if (this.beginManipulation) {\n                        this.beginManipulation();\n                    }\n                }\n            }\n            else {\n                if (this._previousCount > 0) {\n                    if (this.endManipulation) {\n                        this.endManipulation();\n                    }\n                }\n            }\n            this._isDragging = (this._count == 1 && squaredLength(this.cumulativeTranslation) > this._core.config.dragToleranceSquared) || this._count > 1;\n            this._previousCount = this._count;\n        }\n        initialize() {\n            set$3(this.centroid, 0, 0, 0);\n            set$3(this.cumulativeTranslation, 0, 0, 0);\n            this.cumulativeScale = 1;\n            this.cumulativeTwist = 0;\n        }\n        _process() {\n            if (this._previousCount > 0) {\n                let persisted = 0;\n                for (const key in this._manipulators) {\n                    const manipulator = this._manipulators[key];\n                    if (manipulator.isPersisted) {\n                        persisted++;\n                    }\n                }\n                const removed = this._previousCount - persisted;\n                if (persisted > 0) {\n                    if (removed > 0) {\n                        copy$4(this._centroid, this._previousCentroid);\n                    }\n                    else {\n                        set$3(this._centroid, 0, 0, 0);\n                        for (const key in this._manipulators) {\n                            const manipulator = this._manipulators[key];\n                            if (manipulator.isPersisted) {\n                                add(this._centroid, this._centroid, manipulator.position);\n                            }\n                        }\n                        scale(this._centroid, this._centroid, 1 / persisted);\n                    }\n                    for (const key in this._manipulators) {\n                        const manipulator = this._manipulators[key];\n                        if (manipulator.isPersisted) {\n                            manipulator.maxTranslationSquared = Math.max(manipulator.maxTranslationSquared, squaredDistance(manipulator.position, manipulator.initialPosition));\n                            add(this.translationDelta, this.translationDelta, manipulator.position);\n                            subtract(this.translationDelta, this.translationDelta, manipulator.previousPosition);\n                            subtract(this._relativePositionToCentroid, manipulator.position, this._centroid);\n                            const distanceToCentroidSquared = squaredLength(this._relativePositionToCentroid);\n                            if (distanceToCentroidSquared < this._core.config.manipulatorMinRelativeDistanceSquared) {\n                                this.scaleDelta += 1;\n                            }\n                            else {\n                                const distanceToCentroid = Math.sqrt(distanceToCentroidSquared);\n                                const previousDistanceToCentroidSquared = squaredLength(manipulator.previousPositionRelativeToCentroid);\n                                const previousDistanceToCentroid = Math.sqrt(previousDistanceToCentroidSquared);\n                                this.scaleDelta += distanceToCentroid / previousDistanceToCentroid;\n                                scale(this._directionToCentroid, this._relativePositionToCentroid, 1 / distanceToCentroid);\n                                scale(this._previousDirectionToCentroid, manipulator.previousPositionRelativeToCentroid, 1 / previousDistanceToCentroid);\n                                this.twistDelta += AngleHelper.signedAngleBetweenVectors(this._previousDirectionToCentroid, this._directionToCentroid, this.twistAxis);\n                            }\n                        }\n                    }\n                    scale(this.translationDelta, this.translationDelta, 1 / persisted);\n                    add(this.cumulativeTranslation, this.cumulativeTranslation, this.translationDelta);\n                    this.scaleDelta /= persisted;\n                    this.cumulativeScale = MathHelper.clamp(this.cumulativeScale * this.scaleDelta, this.minScale, this.maxScale);\n                    this.scaleDelta -= 1;\n                    this.twistDelta /= persisted;\n                    this.cumulativeTwist += this.twistDelta;\n                }\n            }\n            set$3(this.centroid, 0, 0, 0);\n            for (const key in this._manipulators) {\n                const manipulator = this._manipulators[key];\n                add(this.centroid, this.centroid, manipulator.position);\n            }\n            scale(this.centroid, this.centroid, 1 / this._count);\n            for (const key in this._manipulators) {\n                const manipulator = this._manipulators[key];\n                subtract(manipulator.positionRelativeToCentroid, manipulator.position, this.centroid);\n            }\n            copy$4(this._previousCentroid, this.centroid);\n            for (const key in this._manipulators) {\n                const manipulator = this._manipulators[key];\n                manipulator.isPersisted = true;\n                copy$4(manipulator.previousPosition, manipulator.position);\n                copy$4(manipulator.previousRotationAxis, manipulator.rotationAxis);\n                copy$4(manipulator.previousPositionRelativeToCentroid, manipulator.positionRelativeToCentroid);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class MouseWheel {\n        constructor(core) {\n            this._core = core;\n            this._previousTotal = 0;\n            this.total = 0;\n        }\n        initialize(element) {\n            element.addEventListener(\"wheel\", e => {\n                e.preventDefault();\n                const wheelEvent = e;\n                this.total += wheelEvent.deltaY;\n            }, { passive: false });\n        }\n        update(elapsedTime) {\n            const total = this.total;\n            this.delta = total - this._previousTotal;\n            this._previousTotal = total;\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`mse whl ${this.total < 0 ? \"\" : \" \"}${Math.round(this.total)}`);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Manipulator {\n        constructor() {\n            this.pickedIndex = 0;\n            this.maxTranslationSquared = 0;\n            this.initialPosition = create$3();\n            this.position = create$3();\n            this.previousPosition = create$3();\n            this.holdOrigin = create$3();\n            this.positionRelativeToCentroid = create$3();\n            this.previousPositionRelativeToCentroid = create$3();\n            this.rotationAxis = create$3();\n            this.previousRotationAxis = create$3();\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Pointers {\n        get hoverX() { return this._hoverX; }\n        ;\n        get hoverY() { return this._hoverY; }\n        ;\n        get hoverId() { return this._hoverId; }\n        ;\n        constructor(core, manipulators) {\n            this._core = core;\n            this._manipulators = manipulators;\n        }\n        initialize(element) {\n            this._element = element;\n            element.addEventListener(\"pointerdown\", (e) => this._handlePointerDown(e), { passive: true });\n            element.addEventListener(\"pointermove\", (e) => this._handlePointerMove(e), { passive: true });\n            element.addEventListener(\"pointerup\", (e) => this._handlePointerUp(e), { passive: true });\n            element.addEventListener(\"pointercancel\", (e) => this._handlePointerCancel(e), { passive: true });\n            element.addEventListener(\"pointerleave\", (e) => this._handlePointerLeave(e), { passive: true });\n            element.addEventListener(\"pointerout\", (e) => this._handlePointerOut(e), { passive: true });\n        }\n        update(elapsedTime) {\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`pen rot  ${(this._tiltX | 0).toFixed(3)},${(this._tiltY | 0).toFixed(3)},${(this._twist | 0).toFixed(3)}`);\n                this._core.debugText.addLine(`hov pos  ${this.hoverX ? `${this.hoverX.toFixed(3)},${this.hoverY.toFixed(3)}px` : \"\"}`);\n            }\n        }\n        _handlePointerDown(e) {\n            this._element.focus();\n            const devicePixelRatio = this._core.renderer.devicePixelRatio;\n            const manipulator = new Manipulator();\n            const id = e.pointerId;\n            const x = e.offsetX * devicePixelRatio;\n            const y = e.offsetY * devicePixelRatio;\n            manipulator.id = id;\n            manipulator.position[0] = x;\n            manipulator.position[1] = y;\n            manipulator.type = e.pointerType;\n            manipulator.button = e.button;\n            manipulator.shiftKey = e.shiftKey;\n            manipulator.ctrlKey = e.ctrlKey;\n            manipulator.altKey = e.altKey;\n            manipulator.event = e;\n            this._manipulators[id] = manipulator;\n            this._hoverId = id;\n            this._hoverX = x;\n            this._hoverY = y;\n        }\n        _handlePointerMove(e) {\n            const devicePixelRatio = this._core.renderer.devicePixelRatio;\n            const x = e.offsetX * devicePixelRatio;\n            const y = e.offsetY * devicePixelRatio;\n            const id = e.pointerId;\n            const manipulator = this._manipulators[id];\n            if (manipulator) {\n                manipulator.position[0] = x;\n                manipulator.position[1] = y;\n                manipulator.event = e;\n            }\n            switch (e.pointerType) {\n                case \"mouse\":\n                    this._hoverId = id;\n                    this._hoverX = x;\n                    this._hoverY = y;\n                    break;\n                case \"pen\":\n                    this._hoverId = id;\n                    this._hoverX = x;\n                    this._hoverY = y;\n                    this._tiltX = e.tiltX;\n                    this._tiltY = e.tiltY;\n                    this._twist = e.twist;\n                    break;\n            }\n        }\n        _handlePointerUp(e) {\n            const manipulator = this._manipulators[e.pointerId];\n            if (manipulator) {\n                manipulator.event = e;\n            }\n            this._remove(e.pointerId);\n        }\n        _handlePointerCancel(e) {\n            this._remove(e.pointerId);\n        }\n        _handlePointerLeave(e) {\n            this._resetHover();\n            this._remove(e.pointerId);\n        }\n        _handlePointerOut(e) {\n            this._resetHover();\n            this._remove(e.pointerId);\n        }\n        _resetHover() {\n            this._hoverId = null;\n            this._hoverX = null;\n            this._hoverY = null;\n        }\n        _remove(pointerId) {\n            const manipulator = this._manipulators[pointerId];\n            if (manipulator) {\n                delete this._manipulators[pointerId];\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AnimationHelper {\n        static smoothStep(value) {\n            return value * value * (3 - 2 * value);\n        }\n        static damp(value, target, threshold, dampening) {\n            if (Math.abs(target) < threshold) {\n                return MathHelper.lerp(value, 0, dampening);\n            }\n            else {\n                return MathHelper.lerp(value, target, dampening);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Keyboard {\n        constructor(core) {\n            this._core = core;\n            this._pressedKeys = new Set();\n            this._previousPressedKeys = new Set();\n        }\n        initialize(element) {\n            element.addEventListener(\"keydown\", (e) => { this._handleKeyDown(e); }, false);\n            element.addEventListener(\"keyup\", (e) => { this._handleKeyUp(e); }, false);\n        }\n        update(elapsedTime) {\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`key tot  ${this._pressedKeys.size}`);\n            }\n        }\n        isKeyDown(key) {\n            return this._pressedKeys.has(key);\n        }\n        wasKeyReleased(key) {\n            if (this._pressedKeys.has(key)) {\n                if (!this._previousPressedKeys.has(key)) {\n                    this._previousPressedKeys.add(key);\n                    return true;\n                }\n            }\n            else {\n                this._previousPressedKeys.delete(key);\n            }\n            return false;\n        }\n        _handleKeyDown(e) {\n            const keyboardEvent = e;\n            const key = keyboardEvent.key;\n            if (!this._pressedKeys.has(key)) {\n                this._pressedKeys.add(key);\n            }\n        }\n        _handleKeyUp(e) {\n            const keyboardEvent = e;\n            const key = keyboardEvent.key;\n            if (this._pressedKeys.has(key)) {\n                this._pressedKeys.delete(key);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Manager {\n        constructor(core) {\n            this._manipulators = {};\n            this._core = core;\n            this._vec3 = create$3();\n            this._manipulationProcessor = new ManipulationProcessor(core);\n            this._manipulators = {};\n            this._pointers = new Pointers(core, this._manipulators);\n            this._pointers.initialize(core.container);\n            this._mouseWheel = new MouseWheel(core);\n            this._mouseWheel.initialize(core.container);\n            this._keyboard = new Keyboard(core);\n            this._keyboard.initialize(core.container);\n            this.isPickingEnabled = true;\n            this.mouseWheelZoomScale = this._core.config.mouseWheelZoomScale;\n            this.mouseWheelRotationScale = this._core.config.mouseWheelRotationScale;\n            this.multiTouchZoomScale = this._core.config.multiTouchZoomScale;\n            this.pickHoldDelay = this._core.config.pickHoldDelay;\n            this.pickSelectDelay = this._core.config.pickSelectDelay;\n            const rightButton = 2;\n            this.singleTouchAction = (manipulator) => {\n                if ((manipulator.type == \"mouse\" && manipulator.button == rightButton) || manipulator.shiftKey || manipulator.ctrlKey) {\n                    return SingleTouchAction.translate;\n                }\n                else if (manipulator.altKey || (manipulator.type == \"pen\" && manipulator.button == rightButton)) {\n                    return SingleTouchAction.lasso;\n                }\n                else {\n                    return SingleTouchAction.rotate;\n                }\n            };\n            this.mouseWheelAction = (keyboard) => {\n                if (this._keyboard.isKeyDown(\"Control\")) {\n                    return MouseWheelAction.rotateY;\n                }\n                else {\n                    return MouseWheelAction.zoom;\n                }\n            };\n            this.lassoPickType = PickType.data;\n            this._thumbstickX = 0;\n            this._previousControllerButtonPressed = [false, false, false, false];\n            this._quat0 = create$1();\n            this._quat1 = create$1();\n        }\n        update(elapsedTime, xrFrame) {\n            if (xrFrame) {\n                const inputSources = this._core.webXRSession.inputSources;\n                if (inputSources.length > 0 && this._core.renderer.controllers.length > 0) {\n                    const inputSource = inputSources[0];\n                    const controllerVisual = this._core.renderer.controllers[0];\n                    if (inputSource.gripSpace && inputSource.targetRayMode == \"tracked-pointer\") {\n                        const gripPose = xrFrame.getPose(inputSource.gripSpace, this._core.renderer.webXRReferenceSpace);\n                        if (gripPose) {\n                            controllerVisual.mMatrix = gripPose.transform.matrix;\n                        }\n                        const gamepad = inputSource.gamepad;\n                        this._core.renderer.isPickingEnabled = false;\n                        const rayPose = xrFrame.getPose(inputSource.targetRaySpace, this._core.renderer.webXRReferenceSpace);\n                        if (rayPose) {\n                            controllerVisual.rayMMatrix = rayPose.transform.matrix;\n                            if (gamepad.buttons[0].value > 0 && this.isPickingEnabled) {\n                                this._core.renderer.pickVMatrix = rayPose.transform.inverse.matrix;\n                                this._core.renderer.isPickingEnabled = true;\n                            }\n                        }\n                        const threshold = 0.2;\n                        const dampening = Math.min(0.015 * elapsedTime, 1);\n                        this._thumbstickX = AnimationHelper.damp(this._thumbstickX, gamepad.axes[2], threshold, dampening);\n                        if (this._thumbstickX != 0) {\n                            setAxisAngle(this._quat0, Constants.VECTOR3_UNITY, 0.01 * this._thumbstickX * elapsedTime);\n                            this._core.getModelRotation(this._quat1);\n                            multiply(this._quat1, this._quat0, this._quat1);\n                            this._core.setModelRotation(this._quat1, true);\n                        }\n                        if (gamepad.buttons[2].pressed) {\n                            if (!this._previousControllerButtonPressed[2]) {\n                                this._previousControllerButtonPressed[2] = true;\n                                if (this.controllerButtonPressedCallback) {\n                                    this.controllerButtonPressedCallback(2);\n                                }\n                            }\n                        }\n                        else {\n                            this._previousControllerButtonPressed[2] = false;\n                        }\n                    }\n                }\n            }\n            else {\n                const camera = this._core.camera;\n                this._manipulationProcessor.update(elapsedTime, this._manipulators);\n                this._pointers.update(elapsedTime);\n                this._mouseWheel.update(elapsedTime);\n                this._keyboard.update(elapsedTime);\n                if (this._mouseWheel.delta != 0) {\n                    switch (this.mouseWheelAction(this._keyboard)) {\n                        case MouseWheelAction.zoom:\n                            if (this._pointers.hoverX, this._pointers.hoverY) {\n                                camera.zoom(this._mouseWheel.delta * this.mouseWheelZoomScale, this._pointers.hoverX, this._pointers.hoverY);\n                            }\n                            break;\n                        case MouseWheelAction.rotateY:\n                            setAxisAngle(this._quat0, Constants.VECTOR3_UNITY, this._mouseWheel.delta * this.mouseWheelRotationScale);\n                            camera.getOrbit(this._quat1);\n                            multiply(this._quat1, this._quat1, this._quat0);\n                            camera.setOrbit(this._quat1, true);\n                            break;\n                    }\n                }\n                const count = this._manipulationProcessor.count;\n                if (count == 0) {\n                    if (this._isLassoPicking) {\n                        this._isLassoPicking = false;\n                        this._core.renderer.isLassoPicking = false;\n                        const x0 = Math.min(this._lassoX0, this._lassoX1);\n                        const y0 = Math.min(this._lassoY0, this._lassoY1);\n                        const x1 = Math.max(this._lassoX0, this._lassoX1);\n                        const y1 = Math.max(this._lassoY0, this._lassoY1);\n                        if (x1 - x0 > 0 && y1 - y0 > 0) {\n                            const sets = this._core.pickLasso(x0, y0, x1, y1, this.lassoPickType);\n                            const result = {\n                                x0: x0,\n                                y0: y0,\n                                x1: x1,\n                                y1: y1,\n                                pickType: this.lassoPickType,\n                                ids: sets,\n                                manipulator: this._manipulator,\n                            };\n                            this.pickLassoCallback(result);\n                        }\n                    }\n                }\n                else if (count == 1) {\n                    const translationDelta = this._manipulationProcessor.translationDelta;\n                    if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n                        const manipulators = this._manipulationProcessor.manipulators;\n                        for (const key in manipulators) {\n                            const manipulator = manipulators[key];\n                            switch (this.singleTouchAction(manipulator)) {\n                                case SingleTouchAction.rotate:\n                                    camera.rotate(translationDelta);\n                                    break;\n                                case SingleTouchAction.translate:\n                                    camera.translate(translationDelta);\n                                    break;\n                                case SingleTouchAction.lasso:\n                                    if (this.pickLassoCallback) {\n                                        if (!this._isLassoPicking) {\n                                            this._isLassoPicking = true;\n                                            this._core.renderer.isLassoPicking = true;\n                                            this._lassoX0 = manipulator.position[0];\n                                            this._lassoY0 = manipulator.position[1];\n                                        }\n                                        this._lassoX1 = manipulator.position[0];\n                                        this._lassoY1 = manipulator.position[1];\n                                        this._core.renderer.lassoX0 = Math.min(this._lassoX0, this._lassoX1);\n                                        this._core.renderer.lassoY0 = Math.min(this._lassoY0, this._lassoY1);\n                                        this._core.renderer.lassoX1 = Math.max(this._lassoX0, this._lassoX1);\n                                        this._core.renderer.lassoY1 = Math.max(this._lassoY0, this._lassoY1);\n                                    }\n                                    break;\n                            }\n                            break;\n                        }\n                    }\n                }\n                else {\n                    const translationDelta = this._manipulationProcessor.translationDelta;\n                    const camera = this._core.camera;\n                    if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n                        camera.translate(translationDelta);\n                    }\n                    if (this._manipulationProcessor.scaleDelta != 0) {\n                        const distance = this._manipulationProcessor.scaleDelta * this.multiTouchZoomScale;\n                        camera.zoom(distance, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n                    }\n                    if (this._manipulationProcessor.twistDelta != 0) {\n                        camera.twist(this._manipulationProcessor.twistDelta, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n                    }\n                }\n                if (this.isPickingEnabled && !this._manipulationProcessor.isDragging && !this._isLassoPicking) {\n                    const camera = this._core.camera;\n                    const renderer = this._core.renderer;\n                    if (renderer.isCapturingPickImage) {\n                        camera.updatePickVMatrix(renderer.width / 2, renderer.height / 2);\n                        renderer.pickVMatrix = camera.pickVMatrix;\n                        renderer.isPickingEnabled = true;\n                        this._pickedTime = 0;\n                    }\n                    else if (this._pointers.hoverId > -1) {\n                        const pickingX = this._pointers.hoverX;\n                        const pickingY = this._pointers.hoverY;\n                        camera.updatePickVMatrix(pickingX, pickingY);\n                        renderer.pickVMatrix = camera.pickVMatrix;\n                        renderer.isPickingEnabled = true;\n                        if (this._pickedId != renderer.pickedId) {\n                            this._pickedId = renderer.pickedId;\n                            this._pickedTime = 0;\n                        }\n                        else {\n                            if (this._manipulationProcessor.count == 1) {\n                                this._pickedTime += elapsedTime;\n                                for (const key in this._manipulators) {\n                                    this._manipulator = this._manipulators[key];\n                                    break;\n                                }\n                            }\n                        }\n                        if (this._pickedTime > 0) {\n                            switch (renderer.pickedType) {\n                                case PickType.data:\n                                    if (this._pickedTime > this.pickHoldDelay) {\n                                        renderer.getVertexPosition(this._vec3, this._pickedId);\n                                        this._core.setModelManipulationOrigin(this._vec3);\n                                        this._pickedTime = 0;\n                                    }\n                                    else if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.transitionBuffers.length; i++) {\n                                                const transitionBuffer = renderer.transitionBuffers[i];\n                                                const id = transitionBuffer.pickIdLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = {\n                                                        transitionBuffer: i,\n                                                        id: id,\n                                                        manipulator: this._manipulator,\n                                                    };\n                                                    this._core.log.write(LogLevel.info, `picked id ${result.id}, transition buffer ${i}`);\n                                                    if (this.pickItemCallback) {\n                                                        this.pickItemCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.label:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.labelSets.length; i++) {\n                                                const labelSet = renderer.labelSets[i].label;\n                                                const id = labelSet.pickIdLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = {\n                                                        label: id,\n                                                        set: i,\n                                                        manipulator: this._manipulator,\n                                                    };\n                                                    this._core.log.write(LogLevel.info, `picked label ${result.label}, set ${result.set}`);\n                                                    if (this.pickLabelSetCallback) {\n                                                        this.pickLabelSetCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.axesDivision:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.currentAxes.length; i++) {\n                                                const axes = renderer.currentAxes[i].axes;\n                                                const id = axes.pickGridLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = axes.pickGrid(id);\n                                                    result.axes = i;\n                                                    result.manipulator = this._manipulator;\n                                                    this._core.log.write(LogLevel.info, `picked division (${result.divisionX}, ${result.divisionY}, ${result.divisionZ}), axes ${result.axes}`);\n                                                    if (this.pickAxesGridCallback) {\n                                                        this.pickAxesGridCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.axesTitle:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.currentAxes.length; i++) {\n                                                const axes = renderer.currentAxes[i].axes;\n                                                const id = axes.pickTitleLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = axes.pickTitle(id);\n                                                    result.axes = i;\n                                                    result.manipulator = this._manipulator;\n                                                    this._core.log.write(LogLevel.info, `picked title ${result.axis}, axes ${result.axes}`);\n                                                    if (this.pickAxesTitleCallback) {\n                                                        this.pickAxesTitleCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.axesLabel:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.currentAxes.length; i++) {\n                                                const axes = renderer.currentAxes[i].axes;\n                                                const id = axes.pickLabelLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = axes.pickLabel(id);\n                                                    result.axes = i;\n                                                    result.manipulator = this._manipulator;\n                                                    this._core.log.write(LogLevel.info, `picked label ${result.label}, axis ${result.axis}, axes ${result.axes}`);\n                                                    if (this.pickAxesLabelCallback) {\n                                                        this.pickAxesLabelCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.axesHeading:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.currentAxes.length; i++) {\n                                                const axes = renderer.currentAxes[i].axes;\n                                                const id = axes.pickHeadingLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = axes.pickHeading(id);\n                                                    result.axes = i;\n                                                    result.manipulator = this._manipulator;\n                                                    this._core.log.write(LogLevel.info, `picked heading ${result.axis}, axes ${result.axes}`);\n                                                    if (this.pickAxesHeadingCallback) {\n                                                        this.pickAxesHeadingCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                            }\n                        }\n                    }\n                    else {\n                        renderer.isPickingEnabled = false;\n                        this._pickedTime = 0;\n                    }\n                }\n                else {\n                    this._core.renderer.isPickingEnabled = false;\n                    this._pickedTime = 0;\n                }\n            }\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`man tot  ${this._manipulationProcessor.count}`);\n                this._core.debugText.addLine(`pck key  ${this._core.renderer.pickedId}`);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Log {\n        constructor(core) {\n            this._core = core;\n        }\n        write(level, value) {\n            if (level >= this._core.config.logLevel) {\n                switch (level) {\n                    case LogLevel.trace:\n                        console.trace(value);\n                        break;\n                    case LogLevel.debug:\n                        console.debug(value);\n                        break;\n                    case LogLevel.info:\n                        console.info(value);\n                        break;\n                    case LogLevel.warn:\n                        console.warn(value);\n                        break;\n                    case LogLevel.error:\n                        console.error(value);\n                        break;\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    var __awaiter$4 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    class Core {\n        get container() { return this._container; }\n        get started() { return this._started; }\n        get debugText() { return this._debugText; }\n        get log() { return this._log; }\n        get totalFrames() { return this._fps.totalFrames; }\n        get camera() { return this._camera; }\n        set camera(value) { this._camera = value; }\n        getModelRotation(value) { copy$2(value, this._modelRotation); }\n        setModelRotation(value, isSmooth) {\n            copy$2(this._modelRotation, value);\n            if (!isSmooth) {\n                copy$2(this._smoothedModelRotation, this._modelRotation);\n            }\n        }\n        getModelScale() { return this._modelScale[0]; }\n        setModelScale(value, isSmooth) {\n            set$3(this._modelScale, value, value, value);\n            if (!isSmooth) {\n                copy$4(this._smoothedModelScale, this._modelScale);\n            }\n        }\n        getModelManipulationOrigin(value) { copy$4(value, this._modelManipulationOrigin); }\n        setModelManipulationOrigin(value) { this._updateManipulationOrigin(value); }\n        getModelPosition(value) { copy$4(value, this._modelPosition); }\n        setModelPosition(value, isSmooth) {\n            copy$4(this._modelPosition, value);\n            if (!isSmooth) {\n                copy$4(this._smoothedModelPosition, this._modelPosition);\n            }\n        }\n        get webXRSession() { return this._webXRSession; }\n        get renderer() { return this._renderer; }\n        set renderer(renderer) {\n            if (this._renderer == renderer) {\n                return;\n            }\n            if (this._renderer) {\n                this.stop();\n                this._renderer.remove();\n            }\n            if (!renderer.isInitialized) {\n                renderer.initialize(this);\n            }\n            if (this._renderer) {\n                renderer.transitionTime = this._renderer.transitionTime;\n                for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n                    const previousTransitionBuffer = this._renderer.transitionBuffers[i];\n                    const transitionBuffer = renderer.createTransitionBuffer(previousTransitionBuffer.currentBuffer.ids);\n                    transitionBuffer.copyFrom(previousTransitionBuffer);\n                    renderer.transitionBuffers.push(transitionBuffer);\n                }\n                const currentAxes = this._renderer.currentAxes;\n                if (currentAxes) {\n                    renderer.currentAxes = [];\n                    for (let i = 0; i < currentAxes.length; i++) {\n                        const axesVisual = currentAxes[i];\n                        const axes = axesVisual.axes;\n                        if (axes instanceof Cartesian3dAxes) {\n                            const cartesian3dAxesVisual = renderer.createCartesian3dAxesVisual(axes);\n                            renderer.currentAxes.push(cartesian3dAxesVisual);\n                        }\n                        else if (axes instanceof Cartesian2dAxes) {\n                            renderer.currentAxes.push(renderer.createCartesian2dAxesVisual(axes));\n                        }\n                    }\n                }\n                const labelSets = this._renderer.labelSets;\n                if (labelSets) {\n                    renderer.labelSets = [];\n                    for (let i = 0; i < labelSets.length; i++) {\n                        renderer.labelSets.push(renderer.createLabelSetVisual(labelSets[i].label));\n                    }\n                }\n                const images = this._renderer.images;\n                if (images) {\n                    renderer.images = [];\n                    for (let i = 0; i < images.length; i++) {\n                        renderer.images.push(renderer.createImageVisual(images[i].image));\n                    }\n                }\n                const fonts = this._renderer.fonts;\n                if (fonts) {\n                    for (const key in fonts) {\n                        const font = fonts[key].font;\n                        renderer.fonts[font.name] = renderer.createFontVisual(font);\n                    }\n                }\n            }\n            else {\n                renderer.fonts[this._font.name] = renderer.createFontVisual(this._font);\n            }\n            if (this._renderer) {\n                this._renderer.finalize();\n            }\n            this._renderer = renderer;\n            this._fps.reset();\n            this.start();\n        }\n        get font() { return this._font; }\n        get paletteResources() { return this._paletteResources; }\n        get config() { return this._config; }\n        get inputManager() { return this._inputManager; }\n        constructor(options) {\n            setMatrixArrayType(Array);\n            this._vec3 = create$3();\n            this._quat = create$1();\n            this._mat4 = create$4();\n            this._container = options && options.container ? options.container : document.body;\n            this._config = new Config$2(this);\n            this._log = new Log(this);\n            this._debugText = new DebugText();\n            this._inputManager = (options && options.useInputManager === false) ? null : new Manager(this);\n            const fontRasterizerOptions = options && options.fontRasterizerOptions ? options.fontRasterizerOptions : {\n                fontAtlas: new FontAtlas(256, 512),\n                fontSize: 24,\n                border: 3,\n                fontFamily: \"\\\"segoe ui semibold\\\", sans-serif\",\n                fontWeight: \"normal\",\n                fontStyle: \"normal\",\n                baseline: \"alphabetic\",\n                maxDistance: 8,\n                edgeValue: 0xc0,\n            };\n            const fontRasterizer = new FontRasterizer(this, fontRasterizerOptions);\n            this._font = fontRasterizer.font;\n            this._paletteResources = new PaletteResources();\n            this._previousTime = 0;\n            this._fps = new Fps(this);\n            this._modelMMatrix = create$4();\n            this._modelPosition = create$3();\n            this._modelRotation = create$1();\n            this._modelScale = create$3();\n            this._smoothedModelPosition = create$3();\n            this._smoothedModelRotation = create$1();\n            this._smoothedModelScale = create$3();\n            this._modelManipulationOrigin = create$3();\n            this._camera = new AltAzimuthCamera(this);\n            this.resetModel(false);\n        }\n        getView(view) {\n            this.getModelPosition(view.position);\n            this.getModelRotation(view.rotation);\n            view.scale = this.getModelScale();\n        }\n        setView(view, isSmooth) {\n            this.setModelPosition(view.position, isSmooth);\n            this.setModelRotation(view.rotation, isSmooth);\n            this.setModelScale(view.scale, isSmooth);\n        }\n        lerpView(from, to, time) {\n            lerp(this._vec3, from.position, to.position, time);\n            this.setModelPosition(this._vec3, false);\n            slerp(this._quat, from.rotation, to.rotation, time);\n            this.setModelRotation(this._quat, false);\n            this.setModelScale(MathHelper.lerp(from.scale, to.scale, time), false);\n        }\n        resetModel(isSmooth) {\n            set$3(this._modelPosition, 0, 0, -this._config.modelDistance);\n            set$3(this._modelScale, this._config.modelSize, this._config.modelSize, this._config.modelSize);\n            set$1(this._modelRotation, 0, 0, 0, 1);\n            if (!isSmooth) {\n                this._syncSmooth();\n            }\n        }\n        resetManipulationOrigin() {\n            if (!exactEquals$1(this._modelManipulationOrigin, Constants.VECTOR3_ZERO)) {\n                this._updateManipulationOrigin(Constants.VECTOR3_ZERO);\n            }\n        }\n        reset(isSmooth) {\n            this.resetModel(isSmooth);\n            this.resetManipulationOrigin();\n            this._camera.reset(isSmooth);\n        }\n        start() {\n            if (!this._started && this._renderer) {\n                this._windowAnimationFrame = window.requestAnimationFrame((currentTime) => this._tick(currentTime));\n                this._started = true;\n                this._log.write(LogLevel.info, \"render loop started\");\n                if (this.startCallback) {\n                    this.startCallback();\n                }\n            }\n        }\n        stop() {\n            if (this._started) {\n                this._started = false;\n                if (this._windowAnimationFrame != null) {\n                    window.cancelAnimationFrame(this._windowAnimationFrame);\n                    this._windowAnimationFrame = null;\n                    this._log.write(LogLevel.info, \"render loop stopped\");\n                }\n                if (this.stopCallback) {\n                    this.stopCallback();\n                }\n            }\n        }\n        checkWebXRSupport() {\n            const xrSystem = navigator.xr;\n            if (xrSystem) {\n                xrSystem.isSessionSupported(\"immersive-vr\").then((supported) => {\n                    if (supported) {\n                        this._log.write(LogLevel.info, \"WebXR supported\");\n                        if (this.webXRSupportedCallback) {\n                            this.webXRSupportedCallback();\n                        }\n                    }\n                });\n            }\n        }\n        requestWebXRSession() {\n            if (this._webXRSession) {\n                this._webXRSession.end();\n            }\n            else {\n                navigator.xr.requestSession(\"immersive-vr\").then((session) => this._webXRSessionStarted(session));\n            }\n        }\n        _webXRSessionStarted(session) {\n            if (this.webXRSessionStartedCallback) {\n                this.webXRSessionStartedCallback();\n            }\n            this._webXRSession = session;\n            session.onend = () => this._webXRSessionEnded();\n            this._renderer.initializeWebXR(session).then(() => {\n                if (this._windowAnimationFrame) {\n                    window.cancelAnimationFrame(this._windowAnimationFrame);\n                    this._windowAnimationFrame = null;\n                }\n                session.requestAnimationFrame((currentTime, xrframe) => this._tick(currentTime, xrframe));\n            });\n            session.oninputsourceschange = (event) => this._webXRInputSourcesChanged(event);\n        }\n        _webXRSessionEnded() {\n            if (this.webXRSessionEndedCallback) {\n                this.webXRSessionEndedCallback();\n            }\n            this._webXRSession = null;\n            this._renderer.controllers.length = 0;\n            this.start();\n        }\n        _webXRInputSourcesChanged(event) {\n            if (event.added.length > 0) {\n                const added = event.added[0];\n                if (added.targetRayMode == \"tracked-pointer\") {\n                    const profiles = added.profiles;\n                    const handedness = added.handedness;\n                    if (this.webXRInputSourceRequestCallback) {\n                        this.webXRInputSourceRequestCallback(profiles, handedness, (response) => {\n                            const options = {\n                                profiles: profiles,\n                                handedness: handedness,\n                                obj: response.obj,\n                                texture: response.texture,\n                            };\n                            const controller = new Controller(this, options);\n                            this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n                        }, (e) => {\n                            this._log.write(LogLevel.error, e);\n                        });\n                    }\n                    else {\n                        const options = {};\n                        const controller = new Controller(this, options);\n                        this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n                    }\n                }\n            }\n            if (event.removed.length > 0) {\n                this.renderer.controllers.length = 0;\n            }\n        }\n        _tick(currentTime, xrFrame) {\n            return __awaiter$4(this, void 0, void 0, function* () {\n                let elapsedTime = currentTime - this._previousTime;\n                this._previousTime = currentTime;\n                if (elapsedTime > 0) {\n                    this.update(elapsedTime, xrFrame);\n                    yield this.render(elapsedTime, xrFrame);\n                }\n                if (xrFrame) {\n                    xrFrame.session.requestAnimationFrame((currentTime, xrframe) => this._tick(currentTime, xrframe));\n                }\n                else if (this._started) {\n                    this._windowAnimationFrame = window.requestAnimationFrame((currentTime) => this._tick(currentTime));\n                }\n            });\n        }\n        update(elapsedTime, xrFrame) {\n            this._renderer.setSize(elapsedTime);\n            if (this.updateCallback) {\n                this.updateCallback(elapsedTime, xrFrame);\n            }\n            if (this._config.isDebugVisible) {\n                this._debugText.clear();\n            }\n            this._fps.update(elapsedTime);\n            if (this._inputManager) {\n                this._inputManager.isPickingEnabled = this._config.isTransitionPickingEnabled || this._renderer.transitionTime == 1;\n                this._inputManager.update(elapsedTime, xrFrame);\n            }\n            let amount = Math.min(elapsedTime * this._config.positionSmoothing, 1);\n            lerp(this._smoothedModelPosition, this._smoothedModelPosition, this._modelPosition, amount);\n            amount = Math.min(elapsedTime * this._config.rotationSmoothing, 1);\n            slerp(this._smoothedModelRotation, this._smoothedModelRotation, this._modelRotation, amount);\n            amount = Math.min(elapsedTime * this._config.scaleSmoothing, 1);\n            lerp(this._smoothedModelScale, this._smoothedModelScale, this._modelScale, amount);\n            fromRotationTranslationScaleOrigin(this._modelMMatrix, this._smoothedModelRotation, this._smoothedModelPosition, this._smoothedModelScale, this._modelManipulationOrigin);\n            this._renderer.mMatrix = this._modelMMatrix;\n            if (this._config.isDebugVisible) {\n                this._debugText.addLine(`mod pos ${this._smoothedModelPosition[0] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[0].toFixed(3)},${this._smoothedModelPosition[1] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[1].toFixed(3)},${this._smoothedModelPosition[2] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[2].toFixed(3)}`);\n                this._debugText.addLine(`mod rot ${this._smoothedModelRotation[0] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[0].toFixed(3)},${this._smoothedModelRotation[1] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[1].toFixed(3)},${this._smoothedModelRotation[2] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[2].toFixed(3)},${this._smoothedModelRotation[3] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[3].toFixed(3)}`);\n                this._debugText.addLine(`mod siz  ${this._smoothedModelScale[0].toFixed(3)}`);\n                this._debugText.addLine(`man ori ${this._modelManipulationOrigin[0] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[0].toFixed(3)},${this._modelManipulationOrigin[1] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[1].toFixed(3)},${this._modelManipulationOrigin[2] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[2].toFixed(3)}`);\n                this._debugText.addLine(`scr dst  ${this._config.screenDistance.toFixed(3)}`);\n                this._debugText.addLine(`cam fov  ${Math.round(AngleHelper.radiansToDegrees(this._config.fov))}`);\n                this._debugText.addLine(`tbf tot  ${this._renderer.transitionBuffers.length}`);\n            }\n            if (!xrFrame) {\n                this._camera.width = this._renderer.width;\n                this._camera.height = this._renderer.height;\n                this._camera.modelMMatrix = this._modelMMatrix;\n                this._camera.modelPosition = this._smoothedModelPosition;\n                this._camera.modelRotation = this._smoothedModelRotation;\n                this._camera.modelScale = this._smoothedModelScale;\n                this._camera.modelManipulationOrigin = this._modelManipulationOrigin;\n                this._camera.update(elapsedTime);\n                this._renderer.vMatrices = this._camera.vMatrices;\n                this._renderer.mvMatrices = this._camera.mvMatrices;\n                this._renderer.pMatrices = this._camera.pMatrices;\n                this._renderer.inverseVMatrices = this._camera.inverseVMatrices;\n                this._renderer.inversePMatrices = this._camera.inversePMatrices;\n            }\n            this._renderer.prepare(xrFrame);\n            if (!xrFrame && this._config.stereoMode == StereoMode.none) {\n                this._renderer.pickPMatrix = this._camera.pMatrices[0];\n            }\n            else {\n                const fov = MatrixHelper.fieldOfViewFromProjectionMatrix(this._renderer.pMatrices[0]);\n                perspective(this._mat4, fov, this._renderer.width / this._renderer.height, this._config.nearPlane, this._config.farPlane);\n                this._renderer.pickPMatrix = this._mat4;\n            }\n            if (this._renderer.isInitialized) {\n                this._renderer.update(elapsedTime);\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            return __awaiter$4(this, void 0, void 0, function* () {\n                this._fps.render();\n                if (this._renderer.isInitialized) {\n                    yield this._renderer.render(elapsedTime, xrFrame);\n                    if (this.afterRenderCallback) {\n                        this.afterRenderCallback();\n                    }\n                }\n            });\n        }\n        _syncSmooth() {\n            copy$4(this._smoothedModelPosition, this._modelPosition);\n            copy$4(this._smoothedModelScale, this._modelScale);\n            copy$2(this._smoothedModelRotation, this._modelRotation);\n        }\n        _updateManipulationOrigin(position) {\n            this._log.write(LogLevel.info, `manipulation origin ${position[0].toFixed(3)},${position[1].toFixed(3)},${position[2].toFixed(3)}`);\n            this._camera.updateModelManipulationOrigin(this._modelManipulationOrigin, position);\n            copy$4(this._modelManipulationOrigin, position);\n            transformMat4$2(this._vec3, this._modelManipulationOrigin, this._modelMMatrix);\n            subtract(this._modelPosition, this._vec3, this._modelManipulationOrigin);\n            copy$4(this._smoothedModelPosition, this._modelPosition);\n            if (this.manipulationOriginChangedCallback) {\n                const result = {\n                    x: position[0],\n                    y: position[1],\n                    z: position[2],\n                };\n                this.manipulationOriginChangedCallback(result);\n            }\n        }\n        pickLasso(x0, y0, x1, y1, pickType) {\n            const inverseMMatrix = create$4();\n            invert(inverseMMatrix, this._modelMMatrix);\n            const sets = [];\n            const nearPositions = [create$3(), create$3(), create$3(), create$3()];\n            const farPositions = [create$3(), create$3(), create$3(), create$3()];\n            const directions = [create$3(), create$3(), create$3(), create$3()];\n            this._camera.unproject(nearPositions[0], x0, y1, -1);\n            this._camera.unproject(farPositions[0], x0, y1, 1);\n            this._camera.unproject(nearPositions[1], x1, y1, -1);\n            this._camera.unproject(farPositions[1], x1, y1, 1);\n            this._camera.unproject(nearPositions[2], x1, y0, -1);\n            this._camera.unproject(farPositions[2], x1, y0, 1);\n            this._camera.unproject(nearPositions[3], x0, y0, -1);\n            this._camera.unproject(farPositions[3], x0, y0, 1);\n            for (let i = 0; i < 4; i++) {\n                transformMat4$2(nearPositions[i], nearPositions[i], inverseMMatrix);\n                transformMat4$2(farPositions[i], farPositions[i], inverseMMatrix);\n                subtract(directions[i], farPositions[i], nearPositions[i]);\n                normalize$3(directions[i], directions[i]);\n            }\n            const normals = [create$3(), create$3(), create$3(), create$3()];\n            const d = [];\n            for (let i = 0; i < 4; i++) {\n                cross(normals[i], directions[(i + 1) % 4], directions[i]);\n                normalize$3(normals[i], normals[i]);\n                d.push(-dot$1(normals[i], nearPositions[i]));\n            }\n            if (pickType == PickType.data) {\n                const translation = create$3();\n                for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n                    const transitionBuffer = this._renderer.transitionBuffers[i];\n                    const set = new Set();\n                    if (transitionBuffer.isVisible) {\n                        const start = window.performance.now();\n                        const currentBuffer = transitionBuffer.currentBuffer;\n                        const lookup = currentBuffer.lookup;\n                        for (let j = 0; j < currentBuffer.length; j++) {\n                            const id = currentBuffer.ids[j];\n                            const index = lookup[id];\n                            if (index != null) {\n                                UnitVertex.getTranslation(currentBuffer.dataView, index, translation);\n                                let isInside = true;\n                                for (let k = 0; k < 4; k++) {\n                                    let distance = dot$1(normals[k], translation);\n                                    distance += d[k];\n                                    if (distance < 0) {\n                                        isInside = false;\n                                        break;\n                                    }\n                                }\n                                if (isInside) {\n                                    set.add(id);\n                                }\n                            }\n                        }\n                        if (set.size > 0) {\n                            this._log.write(LogLevel.info, `lasso transition buffer ${i} picked ${set.size} ${Math.round(window.performance.now() - start)}ms`);\n                        }\n                    }\n                    sets.push(set);\n                }\n            }\n            return sets;\n        }\n    }\n    const StereoMode = {\n        none: \"none\",\n        split: \"split\",\n        anaglyph: \"anaglyph\",\n        left: \"left\",\n        right: \"right\",\n    };\n    const HorizontalAlignment = {\n        left: \"left\",\n        center: \"center\",\n        right: \"right\",\n    };\n    const VerticalAlignment = {\n        top: \"top\",\n        center: \"center\",\n        bottom: \"bottom\",\n    };\n    const AxesTextOrientation = {\n        parallel: \"parallel\",\n        perpendicular: \"perpendicular\",\n    };\n    const AxesVisibility = {\n        none: \"none\",\n        current: \"current\",\n        previous: \"previous\",\n    };\n    const PickType = {\n        none: 0,\n        data: 1,\n        label: 2,\n        axesDivision: 3,\n        axesTitle: 4,\n        axesLabel: 5,\n        axesHeading: 6,\n    };\n    const Theme = {\n        dark: \"dark\",\n        light: \"light\",\n    };\n    const HighlightMode = {\n        luminance: \"luminance\",\n        color: \"color\",\n    };\n    const UnitType = {\n        block: \"block\",\n        blockSdf: \"blockSdf\",\n        sphere: \"sphere\",\n        sphereSdf: \"sphereSdf\",\n        cylinder: \"cylinder\",\n        cylinderSdf: \"cylinderSdf\",\n        hexPrism: \"hexPrism\",\n        hexPrismSdf: \"hexPrismSdf\",\n        sdf: \"sdf\",\n        disk: \"disk\",\n        ringSdf: \"ringSdf\"};\n    const SingleTouchAction = {\n        translate: \"translate\",\n        rotate: \"rotate\",\n        lasso: \"lasso\",\n    };\n    const MouseWheelAction = {\n        zoom: \"zoom\",\n        rotateY: \"rotateY\",\n    };\n    const LogLevel = {\n        trace: 0,\n        debug: 1,\n        info: 2,\n        warn: 3,\n        error: 4,\n    };\n    const Edge3D = {\n        topFront: 0,\n        topRight: 1,\n        topBack: 2,\n        bottomRight: 5,\n        frontRight: 8,\n        backRight: 9};\n    const RenderMode = {\n        color: \"color\"};\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let LabelSetVisual$2 = class LabelSetVisual {\n        render(elapsedTime, xrFrame) { }\n        update(elapsedTime) { }\n        constructor(labelSet) {\n            this.label = labelSet;\n        }\n    };\n    class LabelBase {\n        get material() { return this._material; }\n        get vertices() { return this._vertices; }\n        get verticesView() { return this._verticesView; }\n        get indices() { return this._indices; }\n        get indexCount() { return this._indexCount; }\n        get isInitialized() { return this._isInitialized; }\n        get mMatrix() { return this._mMatrix; }\n        get materialType() { return this._materialType; }\n        get materialColor() { return this._materialColor; }\n        get materialFuzz() { return this._materialFuzz; }\n        get materialGloss() { return this._materialGloss; }\n        get segmentColor() { return this._segmentColor; }\n        get scale() { return this._scale; }\n        set scale(value) {\n            if (this._scale != value) {\n                this._scale = value;\n                this._hasChanged = true;\n            }\n        }\n        get font() { return this._font; }\n        set font(value) {\n            if (this._font != value) {\n                this._font = value;\n                this._hasChanged = true;\n            }\n        }\n        get rotation() { return this._rotation; }\n        set rotation(value) {\n            if (this._rotation != value) {\n                this._rotation = value;\n                this._hasChanged = true;\n            }\n        }\n        set reverseX(value) {\n            if (this._reverseX != value) {\n                this._reverseX = value;\n                this._hasChanged = true;\n            }\n        }\n        set reverseY(value) {\n            if (this._reverseY != value) {\n                this._reverseY = value;\n                this._hasChanged = true;\n            }\n        }\n        set reverseZ(value) {\n            if (this._reverseZ != value) {\n                this._reverseZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get horizontalAlignment() { return this._horizontalAlignment; }\n        set horizontalAlignment(value) {\n            if (this._horizontalAlignment != value) {\n                this._horizontalAlignment = value;\n                this._hasChanged = true;\n            }\n        }\n        get verticalAlignment() { return this._verticalAlignment; }\n        set verticalAlignment(value) {\n            if (this._verticalAlignment != value) {\n                this._verticalAlignment = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetX() { return this._offsetX; }\n        set offsetX(value) {\n            if (this._offsetX != value) {\n                this._offsetX = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetY() { return this._offsetY; }\n        set offsetY(value) {\n            if (this._offsetY != value) {\n                this._offsetY = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetZ() { return this._offsetZ; }\n        set offsetZ(value) {\n            if (this._offsetZ != value) {\n                this._offsetZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxGlyphTop() { return this._maxGlyphTop; }\n        set maxGlyphTop(value) {\n            if (this._maxGlyphTop != value) {\n                this._maxGlyphTop = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxGlyphHeight() { return this._maxGlyphHeight; }\n        set maxGlyphHeight(value) {\n            if (this._maxGlyphHeight != value) {\n                this._maxGlyphHeight = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core, options) {\n            this._core = core;\n            this._offset = create$3();\n            this._vec3 = create$3();\n            this._vec4 = create$2();\n            this._mMatrix = create$4();\n            this._indexCount = 0;\n            this._maxGlyphs = options.maxGlyphs;\n            this._textMetric = { width: 0, maxHeight: 0, maxTop: 0 };\n            this.scale = options.scale ? options.scale : 1;\n            this.offsetX = options.offsetX ? options.offsetX : 0;\n            this.offsetY = options.offsetY ? options.offsetY : 0;\n            this.offsetZ = options.offsetZ ? options.offsetZ : 0;\n            this.reverseX = options.reverseX;\n            this.reverseY = options.reverseY;\n            this.reverseZ = options.reverseZ;\n            this.rotation = options.rotation;\n            this.maxGlyphTop = options.maxGlyphTop;\n            this.horizontalAlignment = options.horizontalAlignment === undefined ? HorizontalAlignment.center : options.horizontalAlignment;\n            this.verticalAlignment = options.verticalAlignment === undefined ? VerticalAlignment.center : options.verticalAlignment;\n            this._material = options.material;\n            this.borderWidth = core.config.textBorderWidth;\n            this.gamma = 0;\n            this._materialType = options.materialType || 0;\n            this._materialColor = options.materialColor || core.config.textColor;\n            this._materialFuzz = options.materialFuzz || 0;\n            this._materialGloss = options.materialGloss || 0;\n            this._segmentColor = options.segmentColor;\n        }\n        initialize() {\n            this._vertices = new ArrayBuffer(PositionTexturePickVertex.SIZE_BYTES * this._maxGlyphs * 4);\n            this._verticesView = new DataView(this._vertices);\n            this._indices = new Uint32Array(this._maxGlyphs * 6);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) { }\n    }\n    class LabelSet extends LabelBase {\n        get materials() { return this._materials; }\n        get materialTypes() { return this._materialTypes; }\n        get materialColors() { return this._materialColors; }\n        get materialFuzzes() { return this._materialFuzzes; }\n        get materialGlosses() { return this._materialGlosses; }\n        get segmentColors() { return this._segmentColors; }\n        get minBoundsX() { return this._minBoundsX; }\n        set minBoundsX(value) {\n            if (this._minBoundsX != value) {\n                this._minBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsY() { return this._minBoundsY; }\n        set minBoundsY(value) {\n            if (this._minBoundsY != value) {\n                this._minBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsZ() { return this._minBoundsZ; }\n        set minBoundsZ(value) {\n            if (this._minBoundsZ != value) {\n                this._minBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsX() { return this._maxBoundsX; }\n        set maxBoundsX(value) {\n            if (this._maxBoundsX != value) {\n                this._maxBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsY() { return this._maxBoundsY; }\n        set maxBoundsY(value) {\n            if (this._maxBoundsY != value) {\n                this._maxBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsZ() { return this._maxBoundsZ; }\n        set maxBoundsZ(value) {\n            if (this._maxBoundsZ != value) {\n                this._maxBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionsX() { return this._positionsX; }\n        set positionsX(value) {\n            if (this._positionsX != value) {\n                this._positionsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionsY() { return this._positionsY; }\n        set positionsY(value) {\n            if (this._positionsY != value) {\n                this._positionsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionsZ() { return this._positionsZ; }\n        set positionsZ(value) {\n            if (this._positionsZ != value) {\n                this._positionsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionScalingX() { return this._positionScalingX; }\n        set positionScalingX(value) {\n            if (this._positionScalingX != value) {\n                this._positionScalingX = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionScalingY() { return this._positionScalingY; }\n        set positionScalingY(value) {\n            if (this._positionScalingY != value) {\n                this._positionScalingY = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionScalingZ() { return this._positionScalingZ; }\n        set positionScalingZ(value) {\n            if (this._positionScalingZ != value) {\n                this._positionScalingZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get rotations() { return this._rotations; }\n        set rotations(value) {\n            if (this._rotations != value) {\n                this._rotations = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetsX() { return this._offsetsX; }\n        set offsetsX(value) {\n            if (this._offsetsX != value) {\n                this._offsetsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetsY() { return this._offsetsY; }\n        set offsetsY(value) {\n            if (this._offsetsY != value) {\n                this._offsetsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetsZ() { return this._offsetsZ; }\n        set offsetsZ(value) {\n            if (this._offsetsZ != value) {\n                this._offsetsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetScalingX() { return this._offsetScalingX; }\n        set offsetScalingX(value) {\n            if (this._offsetScalingX != value) {\n                this._offsetScalingX = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetScalingY() { return this._offsetScalingY; }\n        set offsetScalingY(value) {\n            if (this._offsetScalingY != value) {\n                this._offsetScalingY = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetScalingZ() { return this._offsetScalingZ; }\n        set offsetScalingZ(value) {\n            if (this._offsetScalingZ != value) {\n                this._offsetScalingZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get text() { return this._text; }\n        set text(value) {\n            if (this._text != value) {\n                this._text = value;\n                this._hasChanged = true;\n            }\n        }\n        get horizontalAlignments() { return this._horizontalAlignments; }\n        set horizontalAlignments(value) {\n            if (this._horizontalAlignments != value) {\n                this._horizontalAlignments = value;\n                this._hasChanged = true;\n            }\n        }\n        get verticalAlignments() { return this._verticalAlignments; }\n        set verticalAlignments(value) {\n            if (this._verticalAlignments != value) {\n                this._verticalAlignments = value;\n                this._hasChanged = true;\n            }\n        }\n        get scales() { return this._scales; }\n        set scales(value) {\n            if (this._scales != value) {\n                this._scales = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalesScaling() { return this._scalesScaling; }\n        set scalesScaling(value) {\n            if (this._scalesScaling != value) {\n                this._scalesScaling = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core, options) {\n            super(core, options);\n            this._quat = create$1();\n            this._materials = options.materials;\n            this._materialType = options.materialType;\n            this._materialColor = options.materialColors ? null : options.materialColor || core.config.textColor;\n            this._materialColors = options.materialColors;\n            this.minBoundsX = options.minBoundsX ? options.minBoundsX : 0;\n            this.minBoundsY = options.minBoundsY ? options.minBoundsY : 0;\n            this.minBoundsZ = options.minBoundsZ ? options.minBoundsZ : 0;\n            this.maxBoundsX = options.maxBoundsX ? options.maxBoundsX : 1;\n            this.maxBoundsY = options.maxBoundsY ? options.maxBoundsY : 1;\n            this.maxBoundsZ = options.maxBoundsZ ? options.maxBoundsZ : 1;\n            this._font = options.font || core.font;\n            this.text = options.text;\n            this.positionsX = options.positionsX;\n            this.positionsY = options.positionsY;\n            this.positionsZ = options.positionsZ;\n            this.positionScalingX = options.positionScalingX ? options.positionScalingX : 1;\n            this.positionScalingY = options.positionScalingY ? options.positionScalingY : 1;\n            this.positionScalingZ = options.positionScalingZ ? options.positionScalingZ : 1;\n            this.rotations = options.rotations;\n            this.offsetsX = options.offsetsX;\n            this.offsetsY = options.offsetsY;\n            this.offsetsZ = options.offsetsZ;\n            this.offsetScalingX = options.offsetScalingX ? options.offsetScalingX : 1;\n            this.offsetScalingY = options.offsetScalingY ? options.offsetScalingY : 1;\n            this.offsetScalingZ = options.offsetScalingZ ? options.offsetScalingZ : 1;\n            if (options.horizontalAlignments)\n                this.horizontalAlignments = options.horizontalAlignments;\n            if (options.verticalAlignments)\n                this.verticalAlignments = options.verticalAlignments;\n            if (options.scales)\n                this.scales = options.scales;\n            this.scalesScaling = options.scalesScaling ? options.scalesScaling : 1;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged && this._isInitialized) {\n                this._hasChanged = false;\n                this.pickIdLookup = {};\n                if (!this._text) {\n                    this._indexCount = 0;\n                }\n                else {\n                    const start = window.performance.now();\n                    const modelSizeX = this._maxBoundsX - this._minBoundsX;\n                    const modelSizeY = this._maxBoundsY - this._minBoundsY;\n                    const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n                    const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n                    const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n                    const modelOriginX = (this._minBoundsX + this._maxBoundsX) / 2;\n                    const modelOriginY = (this._minBoundsY + this._maxBoundsY) / 2;\n                    const modelOriginZ = (this._minBoundsZ + this._maxBoundsZ) / 2;\n                    if (this._rotation) {\n                        set$1(this._quat, this._rotation[0], this._rotation[1], this._rotation[2], this._rotation[3]);\n                    }\n                    let glyphs = 0;\n                    for (let i = 0; i < this._text.length; i++) {\n                        const offsetX = (this._offsetsX ? this._offsetsX[i] / 2 : this._offsetX) * boundsScaling * this._offsetScalingX;\n                        const offsetY = (this._offsetsY ? this._offsetsY[i] / 2 : this._offsetY) * boundsScaling * this._offsetScalingY;\n                        const offsetZ = (this._offsetsZ ? this._offsetsZ[i] / 2 : this._offsetZ) * boundsScaling * this._offsetScalingZ;\n                        const text = TextHelper.truncate(this._text[i], this._maxGlyphs - glyphs);\n                        const scale = (this._scales ? this._scales[i] * this._scalesScaling : this._scale) * boundsScaling / this._font.size;\n                        TextHelper.measure(this._font, text, this._textMetric);\n                        const width = this._textMetric.width * scale;\n                        const lineHeight = this._font.size * scale;\n                        const maxGlyphTop = (this._maxGlyphTop ? this._maxGlyphTop : this._textMetric.maxTop) * scale;\n                        const horizontalAlignment = this._horizontalAlignments ? this._horizontalAlignments[i] : this._horizontalAlignment;\n                        switch (horizontalAlignment) {\n                            case HorizontalAlignment.left:\n                                this._offset[0] = offsetX;\n                                break;\n                            case HorizontalAlignment.center:\n                                this._offset[0] = offsetX - width / 2;\n                                break;\n                            case HorizontalAlignment.right:\n                                this._offset[0] = offsetX - width;\n                                break;\n                        }\n                        const verticalAlignment = this._verticalAlignments ? this._verticalAlignments[i] : this._verticalAlignment;\n                        switch (verticalAlignment) {\n                            case VerticalAlignment.top:\n                                this._offset[1] = offsetY - lineHeight / 2;\n                                break;\n                            case VerticalAlignment.center:\n                                this._offset[1] = offsetY;\n                                break;\n                            case VerticalAlignment.bottom:\n                                this._offset[1] = offsetY + lineHeight / 2;\n                                break;\n                        }\n                        this._offset[1] -= maxGlyphTop / 2;\n                        this._offset[2] = offsetZ;\n                        let positionX = this.positionsX ? this.positionsX[i] * this.positionScalingX : 0;\n                        let positionY = this.positionsY ? this.positionsY[i] * this.positionScalingY : 0;\n                        let positionZ = this.positionsZ ? this.positionsZ[i] * this.positionScalingZ : 0;\n                        if (this._reverseX) {\n                            positionX = this.minBoundsX + this.maxBoundsX - positionX;\n                        }\n                        if (this._reverseY) {\n                            positionY = this.minBoundsY + this.maxBoundsY - positionY;\n                        }\n                        if (this._reverseZ) {\n                            positionZ = this.minBoundsZ + this.maxBoundsZ - positionZ;\n                        }\n                        set$3(this._vec3, (positionX - modelOriginX) * boundsScaling, (positionY - modelOriginY) * boundsScaling, (positionZ - modelOriginZ) * boundsScaling);\n                        if (this._rotations) {\n                            set$1(this._quat, this._rotations[i * 4], this._rotations[i * 4 + 1], this._rotations[i * 4 + 2], this._rotations[i * 4 + 3]);\n                        }\n                        const pickId = PickHelper.nextPickId();\n                        PickHelper.encodeNumber(pickId, PickType.label, this._vec4);\n                        this.pickIdLookup[pickId] = i;\n                        TextHelper.addString(this._font, text, this._verticesView, this._indices, glyphs, this._vec3, scale, this._offset, this._rotation || this._rotations ? this._quat : null, this._vec4);\n                        glyphs += text.length;\n                        if (glyphs >= this._maxGlyphs) {\n                            glyphs = this._maxGlyphs;\n                            break;\n                        }\n                    }\n                    this._indexCount = glyphs * 6;\n                    this._core.log.write(LogLevel.info, `label set updated ${Math.round(window.performance.now() - start)}ms`);\n                    if (this.hasChangedCallback) {\n                        this.hasChangedCallback();\n                    }\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let ImageVisual$2 = class ImageVisual {\n        render(elapsedTime, xrFrame) { }\n        update(elapsedTime) { }\n        constructor(image) {\n            this.image = image;\n        }\n    };\n    class ImageBase {\n        get material() { return this._material; }\n        get vertices() { return this._vertices; }\n        get indices() { return this._indices; }\n        get indexCount() { return this._indexCount; }\n        get isInitialized() { return this._isInitialized; }\n        get mMatrix() { return this._mMatrix; }\n        get imageData() { return this._imageData; }\n        set imageData(value) {\n            if (this._imageData != value) {\n                this._imageData = value;\n                this._hasChanged = true;\n            }\n        }\n        get rotation() { return this._rotation; }\n        set rotation(value) {\n            if (!equals$1(this._rotation, value)) {\n                copy$2(this._rotation, value);\n                this._hasChanged = true;\n            }\n        }\n        get position() { return this._position; }\n        set position(value) {\n            if (!equals$2(this._position, value)) {\n                copy$4(this._position, value);\n                this._hasChanged = true;\n            }\n        }\n        get texCoord0() { return this._texCoord0; }\n        set texCoord0(value) {\n            if (!equals(this._texCoord0, value)) {\n                copy$1(this._texCoord0, value);\n                this._hasChanged = true;\n            }\n        }\n        get texCoord1() { return this._texCoord1; }\n        set texCoord1(value) {\n            if (!equals(this._texCoord1, value)) {\n                copy$1(this._texCoord1, value);\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsX() { return this._minBoundsX; }\n        set minBoundsX(value) {\n            if (this._minBoundsX != value) {\n                this._minBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsY() { return this._minBoundsY; }\n        set minBoundsY(value) {\n            if (this._minBoundsY != value) {\n                this._minBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsZ() { return this._minBoundsZ; }\n        set minBoundsZ(value) {\n            if (this._minBoundsZ != value) {\n                this._minBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsX() { return this._maxBoundsX; }\n        set maxBoundsX(value) {\n            if (this._maxBoundsX != value) {\n                this._maxBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsY() { return this._maxBoundsY; }\n        set maxBoundsY(value) {\n            if (this._maxBoundsY != value) {\n                this._maxBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsZ() { return this._maxBoundsZ; }\n        set maxBoundsZ(value) {\n            if (this._maxBoundsZ != value) {\n                this._maxBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core, options) {\n            this._core = core;\n            this._mMatrix = create$4();\n            this._origin = create$3();\n            this._translation = create$3();\n            this._scale = create$3();\n            this._transform = create$4();\n            this._imageData = options.imageData;\n            this._minBoundsX = options.minBoundsX === undefined ? 0 : options.minBoundsX;\n            this._minBoundsY = options.minBoundsY === undefined ? 0 : options.minBoundsY;\n            this._minBoundsZ = options.minBoundsZ === undefined ? 0 : options.minBoundsZ;\n            this._maxBoundsX = options.maxBoundsX === undefined ? 1 : options.maxBoundsX;\n            this._maxBoundsY = options.maxBoundsY === undefined ? 1 : options.maxBoundsY;\n            this._maxBoundsZ = options.maxBoundsZ === undefined ? 1 : options.maxBoundsZ;\n            this._position = options.position ? clone$4(options.position) : create$3();\n            this._rotation = options.rotation ? clone$2(options.rotation) : create$1();\n            this._texCoord0 = options.texCoord0 ? clone$1(options.texCoord0) : fromValues(0, 0);\n            this._texCoord1 = options.texCoord1 ? clone$1(options.texCoord1) : fromValues(1, 1);\n            this._material = options.material === undefined ? -1 : options.material;\n            this._hasChanged = true;\n        }\n    }\n    class ImageQuad extends ImageBase {\n        get width() { return this._width; }\n        set width(value) {\n            if (this._width != value) {\n                this._width = value;\n                this._hasChanged = true;\n            }\n        }\n        get height() { return this._height; }\n        set height(value) {\n            if (this._height != value) {\n                this._height = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core, options) {\n            super(core, options);\n            this._width = options.width === undefined ? 1 : options.width;\n            this._height = options.height === undefined ? 1 : options.height;\n            this._texTransform = create$4();\n            translate(this._texTransform, this._texTransform, fromValues$3(0, 1, 0));\n            scale$1(this._texTransform, this._texTransform, fromValues$3(1, -1, 1));\n        }\n        initialize() {\n            this._vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * 4);\n            this._indices = Quad$2.INDICES;\n            this._indexCount = this._indices.length;\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged && this._isInitialized) {\n                this._hasChanged = false;\n                const modelSizeX = this._maxBoundsX - this._minBoundsX;\n                const modelSizeY = this._maxBoundsY - this._minBoundsY;\n                const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n                const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n                const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n                set$3(this._origin, (this._minBoundsX + this._maxBoundsX) / 2, (this._minBoundsY + this._maxBoundsY) / 2, (this._minBoundsZ + this._maxBoundsZ) / 2);\n                subtract(this._translation, this._position, this._origin);\n                scale(this._translation, this._translation, boundsScaling);\n                set$3(this._scale, this._width, this._height, 1);\n                scale(this._scale, this._scale, boundsScaling);\n                fromRotationTranslationScale(this._transform, this._rotation, this._translation, this._scale);\n                this._verticesView = Quad$2.normalTextured(this._transform, this._texTransform);\n                this._vertices = this._verticesView.buffer;\n                if (this.hasChangedCallback) {\n                    this.hasChangedCallback();\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class BoundsHelper {\n        static rotateBounds(minBounds, maxBounds, rotation, rotatedMinBounds, rotatedMaxBounds, offset) {\n            const sizeX = maxBounds[0] - minBounds[0];\n            const sizeY = maxBounds[1] - minBounds[1];\n            const sizeZ = maxBounds[2] - minBounds[2];\n            const min$1 = rotatedMinBounds;\n            const max$1 = rotatedMaxBounds;\n            set$3(min$1, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n            set$3(max$1, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n            const vertices = Cube.POSITIONS;\n            const position = create$3();\n            for (let i = 0; i < 8; i++) {\n                set$3(position, vertices[i * 3] * sizeX, vertices[i * 3 + 1] * sizeY, vertices[i * 3 + 2] * sizeZ);\n                add(position, position, offset);\n                transformQuat(position, position, rotation);\n                subtract(position, position, offset);\n                min(min$1, min$1, position);\n                max(max$1, max$1, position);\n            }\n            add(position, minBounds, maxBounds);\n            scale(position, position, 0.5);\n            add(min$1, min$1, position);\n            add(max$1, max$1, position);\n        }\n        static cylinder(pa, pb, radius, minBounds, maxBounds) {\n            const a = create$3();\n            subtract(a, pb, pa);\n            const aa = dot$1(a, a);\n            const ex = radius * Math.sqrt(1 - a[0] * a[0] / aa);\n            const ey = radius * Math.sqrt(1 - a[1] * a[1] / aa);\n            const ez = radius * Math.sqrt(1 - a[2] * a[2] / aa);\n            minBounds[0] = Math.min(pa[0] - ex, pb[0] - ex);\n            minBounds[1] = Math.min(pa[1] - ey, pb[1] - ey);\n            minBounds[2] = Math.min(pa[2] - ez, pb[2] - ez);\n            maxBounds[0] = Math.max(pa[0] + ex, pb[0] + ex);\n            maxBounds[1] = Math.max(pa[1] + ey, pb[1] + ey);\n            maxBounds[2] = Math.max(pa[2] + ez, pb[2] + ez);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class LayoutBase {\n        get facetScaling() { return this._facetScaling; }\n        offsetX(facetCoordX) { return (((facetCoordX + 0.5) / this._facetsX) - 0.5) * (this.maxModelBoundsX - this.minModelBoundsX) / this._maxBounds; }\n        offsetY(facetCoordY) { return (((facetCoordY + 0.5) / this._facetsY) - 0.5) * (this.maxModelBoundsY - this.minModelBoundsY) / this._maxBounds; }\n        offsetZ(facetCoordZ) { return (((facetCoordZ + 0.5) / this._facetsZ) - 0.5) * (this.maxModelBoundsZ - this.minModelBoundsZ) / this._maxBounds; }\n        constructor(core) {\n            this._core = core;\n            this.modelOriginX = 0;\n            this.modelOriginY = 0;\n            this.modelOriginZ = 0;\n            this.minModelBoundsX = 0;\n            this.minModelBoundsY = 0;\n            this.minModelBoundsZ = 0;\n            this.maxModelBoundsX = 0;\n            this.maxModelBoundsY = 0;\n            this.maxModelBoundsZ = 0;\n            this.minLayoutBoundsX = 0;\n            this.minLayoutBoundsY = 0;\n            this.minLayoutBoundsZ = 0;\n            this.maxLayoutBoundsX = 0;\n            this.maxLayoutBoundsY = 0;\n            this.maxLayoutBoundsZ = 0;\n            this._facetSpacingX = 0;\n            this._facetSpacingY = 0;\n            this._facetSpacingZ = 0;\n            this._facetSizeX = 0;\n            this._facetSizeY = 0;\n            this._facetSizeZ = 0;\n            this._facetsX = 1;\n            this._facetsY = 1;\n            this._facetsZ = 1;\n        }\n        _updateModelBounds(options) {\n            this.minModelBoundsX = options.minBoundsX === undefined ? this.minLayoutBoundsX : options.minBoundsX;\n            this.minModelBoundsY = options.minBoundsY === undefined ? this.minLayoutBoundsY : options.minBoundsY;\n            this.minModelBoundsZ = options.minBoundsZ === undefined ? this.minLayoutBoundsZ : options.minBoundsZ;\n            this.maxModelBoundsX = options.maxBoundsX === undefined ? this.maxLayoutBoundsX : options.maxBoundsX;\n            this.maxModelBoundsY = options.maxBoundsY === undefined ? this.maxLayoutBoundsY : options.maxBoundsY;\n            this.maxModelBoundsZ = options.maxBoundsZ === undefined ? this.maxLayoutBoundsZ : options.maxBoundsZ;\n            this._isFacetted =\n                (options.facetsX !== undefined && options.facetsX > 1 && options.facetCoordsX != null) ||\n                    (options.facetsY !== undefined && options.facetsY > 1 && options.facetCoordsY != null) ||\n                    (options.facetsZ !== undefined && options.facetsZ > 1 && options.facetCoordsZ != null);\n            this._facetSpacingX = options.facetSpacingX === undefined ? 0 : options.facetSpacingX;\n            this._facetSpacingY = options.facetSpacingY === undefined ? 0 : options.facetSpacingY;\n            this._facetSpacingZ = options.facetSpacingZ === undefined ? 0 : options.facetSpacingZ;\n            let modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n            let modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n            let modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n            const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n            this._facetSizeX = modelSizeX;\n            this._facetSizeY = modelSizeY;\n            this._facetSizeZ = modelSizeZ;\n            this._facetsX = options.facetCoordsX ? options.facetsX : 1;\n            this._facetsY = options.facetCoordsY ? options.facetsY : 1;\n            this._facetsZ = options.facetCoordsZ ? options.facetsZ : 1;\n            this.minModelBoundsX -= this._facetSizeX * this._facetSpacingX / 2;\n            this.minModelBoundsY -= this._facetSizeY * this._facetSpacingY / 2;\n            this.minModelBoundsZ -= this._facetSizeZ * this._facetSpacingZ / 2;\n            this.maxModelBoundsX = this.minModelBoundsX + this._facetsX * this._facetSizeX * (1 + this._facetSpacingX);\n            this.maxModelBoundsY = this.minModelBoundsY + this._facetsY * this._facetSizeY * (1 + this._facetSpacingY);\n            this.maxModelBoundsZ = this.minModelBoundsZ + this._facetsZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            this.modelOriginX = (this.minModelBoundsX + this.maxModelBoundsX) / 2;\n            this.modelOriginY = (this.minModelBoundsY + this.maxModelBoundsY) / 2;\n            this.modelOriginZ = (this.minModelBoundsZ + this.maxModelBoundsZ) / 2;\n            modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n            modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n            modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n            this._maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n            this._boundsScaling = this._maxBounds == 0 ? 1 : 1 / this._maxBounds;\n            this._facetScaling = maxBounds / this._maxBounds;\n        }\n        resetCumulativeLayoutBounds() {\n            this.minCumulativeLayoutBoundsX = undefined;\n            this.minCumulativeLayoutBoundsY = undefined;\n            this.minCumulativeLayoutBoundsZ = undefined;\n            this.maxCumulativeLayoutBoundsX = undefined;\n            this.maxCumulativeLayoutBoundsY = undefined;\n            this.maxCumulativeLayoutBoundsZ = undefined;\n        }\n        _updateCumulativeLayoutBounds() {\n            this.minCumulativeLayoutBoundsX = this.minCumulativeLayoutBoundsX === undefined ? this.minLayoutBoundsX : Math.min(this.minCumulativeLayoutBoundsX, this.minLayoutBoundsX);\n            this.minCumulativeLayoutBoundsY = this.minCumulativeLayoutBoundsY === undefined ? this.minLayoutBoundsY : Math.min(this.minCumulativeLayoutBoundsY, this.minLayoutBoundsY);\n            this.minCumulativeLayoutBoundsZ = this.minCumulativeLayoutBoundsZ === undefined ? this.minLayoutBoundsZ : Math.min(this.minCumulativeLayoutBoundsZ, this.minLayoutBoundsZ);\n            this.maxCumulativeLayoutBoundsX = this.maxCumulativeLayoutBoundsX === undefined ? this.maxLayoutBoundsX : Math.max(this.maxCumulativeLayoutBoundsX, this.maxLayoutBoundsX);\n            this.maxCumulativeLayoutBoundsY = this.maxCumulativeLayoutBoundsY === undefined ? this.maxLayoutBoundsY : Math.max(this.maxCumulativeLayoutBoundsY, this.maxLayoutBoundsY);\n            this.maxCumulativeLayoutBoundsZ = this.maxCumulativeLayoutBoundsZ === undefined ? this.maxLayoutBoundsZ : Math.max(this.maxCumulativeLayoutBoundsZ, this.maxLayoutBoundsZ);\n        }\n        unitToModelSize(unitSize) {\n            return unitSize / this._boundsScaling;\n        }\n        unitToModelPositionX(unitPositionX) {\n            return this.unitToModelSize(unitPositionX) + this.modelOriginX;\n        }\n        unitToModelPositionY(unitPositionY) {\n            return this.unitToModelSize(unitPositionY) + this.modelOriginY;\n        }\n        unitToModelPositionZ(unitPositionZ) {\n            return this.unitToModelSize(unitPositionZ) + this.modelOriginZ;\n        }\n        unitToModelPosition(unitPosition, modelPosition) {\n            modelPosition[0] = this.unitToModelPositionX(unitPosition[0]);\n            modelPosition[1] = this.unitToModelPositionY(unitPosition[1]);\n            modelPosition[2] = this.unitToModelPositionZ(unitPosition[2]);\n        }\n        modelToUnitSize(modelSize) {\n            return modelSize * this._boundsScaling;\n        }\n        modelToUnitPositionX(modelPositionX) {\n            return (modelPositionX - this.modelOriginX) * this._boundsScaling;\n        }\n        modelToUnitPositionY(modelPositionY) {\n            return (modelPositionY - this.modelOriginY) * this._boundsScaling;\n        }\n        modelToUnitPositionZ(modelPositionZ) {\n            return (modelPositionZ - this.modelOriginZ) * this._boundsScaling;\n        }\n        modelToUnitPosition(modelPosition, unitPosition) {\n            unitPosition[0] = this.modelToUnitPositionX(modelPosition[0]);\n            unitPosition[1] = this.modelToUnitPositionY(modelPosition[1]);\n            unitPosition[2] = this.modelToUnitPositionZ(modelPosition[2]);\n        }\n        inclusiveUnitBounds(buffer, ids, unitType, offset, count, minBounds, maxBounds) {\n            set$3(minBounds, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n            set$3(maxBounds, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n            const unitScale = create$3();\n            const unitRotation = create$1();\n            const unitTranslation = create$3();\n            const lookup = buffer.lookup;\n            const dataView = buffer.dataView;\n            let minBounds0;\n            let maxBounds0;\n            let minBounds1;\n            let maxBounds1;\n            switch (unitType) {\n                case UnitType.sphere:\n                case UnitType.sphereSdf:\n                    for (let i = 0; i < count; i++) {\n                        const id = ids[i + offset];\n                        const index = lookup[id];\n                        UnitVertex.getTranslation(dataView, index, unitTranslation);\n                        UnitVertex.getScale(dataView, index, unitScale);\n                        const radius = unitScale[0] / 2;\n                        minBounds[0] = Math.min(minBounds[0], unitTranslation[0] - radius);\n                        minBounds[1] = Math.min(minBounds[1], unitTranslation[1] - radius);\n                        minBounds[2] = Math.min(minBounds[2], unitTranslation[2] - radius);\n                        maxBounds[0] = Math.max(maxBounds[0], unitTranslation[0] + radius);\n                        maxBounds[1] = Math.max(maxBounds[1], unitTranslation[1] + radius);\n                        maxBounds[2] = Math.max(maxBounds[2], unitTranslation[2] + radius);\n                    }\n                    break;\n                case UnitType.hexPrism:\n                case UnitType.hexPrismSdf:\n                case UnitType.block:\n                case UnitType.blockSdf:\n                    minBounds0 = create$3();\n                    maxBounds0 = create$3();\n                    minBounds1 = create$3();\n                    maxBounds1 = create$3();\n                    for (let i = 0; i < count; i++) {\n                        const id = ids[i + offset];\n                        const index = lookup[id];\n                        UnitVertex.getTranslation(dataView, index, unitTranslation);\n                        UnitVertex.getRotation(dataView, index, unitRotation);\n                        UnitVertex.getScale(dataView, index, unitScale);\n                        minBounds0[0] = unitTranslation[0] - unitScale[0] / 2;\n                        minBounds0[1] = unitTranslation[1] - unitScale[1] / 2;\n                        minBounds0[2] = unitTranslation[2] - unitScale[2] / 2;\n                        maxBounds0[0] = unitTranslation[0] + unitScale[0] / 2;\n                        maxBounds0[1] = unitTranslation[1] + unitScale[1] / 2;\n                        maxBounds0[2] = unitTranslation[2] + unitScale[2] / 2;\n                        BoundsHelper.rotateBounds(minBounds0, maxBounds0, unitRotation, minBounds1, maxBounds1, Constants.VECTOR3_ZERO);\n                        min(minBounds, minBounds, minBounds1);\n                        max(maxBounds, maxBounds, maxBounds1);\n                    }\n                    break;\n                case UnitType.cylinder:\n                case UnitType.cylinderSdf:\n                    minBounds0 = create$3();\n                    maxBounds0 = create$3();\n                    const pa = create$3();\n                    const pb = create$3();\n                    const identityRotation = Constants.VECTOR3_UNITY;\n                    let ca;\n                    for (let i = 0; i < count; i++) {\n                        const id = ids[i + offset];\n                        const index = lookup[id];\n                        UnitVertex.getTranslation(dataView, index, unitTranslation);\n                        UnitVertex.getRotation(dataView, index, unitRotation);\n                        UnitVertex.getScale(dataView, index, unitScale);\n                        const length = unitScale[1];\n                        const radius = Math.max(unitScale[0], unitScale[2]);\n                        if (length != 0 && radius != 0) {\n                            if (equals$1(unitRotation, Constants.QUAT_IDENTITY)) {\n                                ca = identityRotation;\n                            }\n                            else {\n                                ca = create$3();\n                                transformQuat(ca, identityRotation, unitRotation);\n                            }\n                            scaleAndAdd(pa, unitTranslation, ca, -length * 0.5);\n                            scaleAndAdd(pb, unitTranslation, ca, length * 0.5);\n                            BoundsHelper.cylinder(pa, pb, radius, minBounds0, maxBounds0);\n                            min(minBounds, minBounds, minBounds0);\n                            max(maxBounds, maxBounds, maxBounds0);\n                        }\n                    }\n                    break;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Scatter extends LayoutBase {\n        layout(buffer, ids, options) {\n            const start = window.performance.now();\n            const offset = options.offset === undefined ? 0 : options.offset;\n            const count = options.count === undefined ? ids.length : options.count;\n            const positionScalingX = options.positionScalingX === undefined ? 1 : options.positionScalingX;\n            const positionScalingY = options.positionScalingY === undefined ? 1 : options.positionScalingY;\n            const positionScalingZ = options.positionScalingZ === undefined ? 1 : options.positionScalingZ;\n            if (!this._positions || this._positions.length < buffer.length * 3) {\n                this._positions = new Float32Array(buffer.length * 3);\n            }\n            this.minLayoutBoundsX = Number.MAX_VALUE;\n            this.minLayoutBoundsY = Number.MAX_VALUE;\n            this.minLayoutBoundsZ = Number.MAX_VALUE;\n            this.maxLayoutBoundsX = -Number.MAX_VALUE;\n            this.maxLayoutBoundsY = -Number.MAX_VALUE;\n            this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n            const lookup = buffer.lookup;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const index = lookup[id];\n                let positionX = options.positionsX ? options.positionsX[id] * positionScalingX : 0;\n                let positionY = options.positionsY ? options.positionsY[id] * positionScalingY : 0;\n                let positionZ = options.positionsZ ? options.positionsZ[id] * positionScalingZ : 0;\n                this._positions[index * 3] = positionX;\n                this._positions[index * 3 + 1] = positionY;\n                this._positions[index * 3 + 2] = positionZ;\n                this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, positionX);\n                this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, positionY);\n                this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, positionZ);\n                this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, positionX);\n                this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, positionY);\n                this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, positionZ);\n            }\n            this._updateCumulativeLayoutBounds();\n            this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        update(buffer, ids, options) {\n            const start = window.performance.now();\n            const offset = options.offset === undefined ? 0 : options.offset;\n            const count = options.count === undefined ? ids.length : options.count;\n            const dataView = buffer.dataView;\n            const _vec2 = create();\n            const _vec3 = create$3();\n            const _vec4 = create$2();\n            const _quat = create$1();\n            const sizeScalingX = options.sizeScaling === undefined ? options.sizeScalingX === undefined ? 1 : options.sizeScalingX : options.sizeScaling;\n            const sizeScalingY = options.sizeScaling === undefined ? options.sizeScalingY === undefined ? 1 : options.sizeScalingY : options.sizeScaling;\n            const sizeScalingZ = options.sizeScaling === undefined ? options.sizeScalingZ === undefined ? 1 : options.sizeScalingZ : options.sizeScaling;\n            const sizesX = options.sizes ? options.sizes : options.sizesX;\n            const sizesY = options.sizes ? options.sizes : options.sizesY;\n            const sizesZ = options.sizes ? options.sizes : options.sizesZ;\n            const minSize = options.minSize === undefined ? 0 : options.minSize;\n            const minColor = options.minColor === undefined ? 0 : options.minColor;\n            const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n            const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n            const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n            const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n            const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n            const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n            const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n            const reverseX = options.reverseX === undefined ? false : options.reverseX;\n            const reverseY = options.reverseY === undefined ? false : options.reverseY;\n            const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n            this._updateModelBounds(options);\n            if (options.rotation) {\n                _quat[0] = options.rotation[0];\n                _quat[1] = options.rotation[1];\n                _quat[2] = options.rotation[2];\n                _quat[3] = options.rotation[3];\n            }\n            else {\n                rotationTo(_quat, this._core.config.identityRotation, Constants.VECTOR3_UNITY);\n            }\n            if (options.texCoord) {\n                _vec4[0] = options.texCoord[0];\n                _vec4[1] = options.texCoord[1];\n                _vec4[2] = options.texCoord[2];\n                _vec4[3] = options.texCoord[3];\n            }\n            const lookup = buffer.lookup;\n            const selection = options.selected && options.selected.size > 0;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const index = lookup[id];\n                let positionX = this._positions[index * 3];\n                let positionY = this._positions[index * 3 + 1];\n                let positionZ = this._positions[index * 3 + 2];\n                if (this._isFacetted) {\n                    if (reverseX) {\n                        positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                    }\n                    if (reverseY) {\n                        positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                    }\n                    if (reverseZ) {\n                        positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                    }\n                    const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                    const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                    const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                    positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                    positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                    positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n                }\n                else {\n                    if (reverseX) {\n                        positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                    }\n                    if (reverseY) {\n                        positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                    }\n                    if (reverseZ) {\n                        positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n                    }\n                }\n                _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n                _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n                _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n                UnitVertex.setTranslation(dataView, index, _vec3);\n                _vec3[0] = Math.max((sizesX ? Math.abs(sizesX[id]) : 1) * sizeScalingX, minSize) * this._boundsScaling;\n                _vec3[1] = Math.max((sizesY ? Math.abs(sizesY[id]) : 1) * sizeScalingY, minSize) * this._boundsScaling;\n                _vec3[2] = Math.max((sizesZ ? Math.abs(sizesZ[id]) : 1) * sizeScalingZ, minSize) * this._boundsScaling;\n                UnitVertex.setScale(dataView, index, _vec3);\n                if (options.rotations) {\n                    _quat[0] = options.rotations[id * 4];\n                    _quat[1] = options.rotations[id * 4 + 1];\n                    _quat[2] = options.rotations[id * 4 + 2];\n                    _quat[3] = options.rotations[id * 4 + 3];\n                    UnitVertex.setRotation(dataView, index, _quat);\n                }\n                else {\n                    UnitVertex.setRotation(dataView, index, _quat);\n                }\n                if (options.colors) {\n                    const size = 1 / (maxColor - minColor + 1);\n                    const color = MathHelper.normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                    if (options.colors1) {\n                        const color1 = MathHelper.normalize(options.colors1[id], minColor, maxColor, size / 2, 1 - size / 2);\n                        set(_vec2, color, color1);\n                    }\n                    else {\n                        set(_vec2, color, color);\n                    }\n                    UnitVertex.setColor(dataView, index, _vec2);\n                }\n                else {\n                    UnitVertex.setColor(dataView, index, Constants.VECTOR2_ONE);\n                }\n                UnitVertex.setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n                UnitVertex.setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n                if (options.order !== undefined) {\n                    const order = MathHelper.normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                    _vec2[0] = orderReverse ? 1 - order : order;\n                }\n                else {\n                    _vec2[0] = count == 1 ? 0 : i / (count - 1);\n                }\n                if (options.staggerOrder !== undefined) {\n                    _vec2[1] = options.staggerOrder;\n                }\n                else if (options.staggerOrders) {\n                    const stagger = MathHelper.normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                    _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n                }\n                else {\n                    _vec2[1] = count == 1 ? 0 : i / (count - 1);\n                }\n                UnitVertex.setOrder(dataView, index, _vec2);\n                UnitVertex.setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n                UnitVertex.setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n                UnitVertex.setParameter1(dataView, index, options.parameter1 ? options.parameter1 : options.parameters1 ? options.parameters1[id] : 0);\n                UnitVertex.setParameter2(dataView, index, options.parameter2 ? options.parameter2 : options.parameters2 ? options.parameters2[id] : 0);\n                UnitVertex.setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n                UnitVertex.setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n                if (options.texCoords) {\n                    _vec4[0] = options.texCoords[id * 4];\n                    _vec4[1] = options.texCoords[id * 4 + 1];\n                    _vec4[2] = options.texCoords[id * 4 + 2];\n                    _vec4[3] = options.texCoords[id * 4 + 3];\n                    UnitVertex.setTexCoord(dataView, index, _vec4);\n                }\n                else {\n                    UnitVertex.setTexCoord(dataView, index, _vec4);\n                }\n                UnitVertex.setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n                UnitVertex.setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [options.materialColors[id * 3], options.materialColors[id * 3 + 1], options.materialColors[id * 3 + 2]] : [0, 0, 0]);\n                UnitVertex.setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n                UnitVertex.setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n                UnitVertex.setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n                UnitVertex.setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n                UnitVertex.setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [options.segmentColors[id * 4], options.segmentColors[id * 4 + 1], options.segmentColors[id * 4 + 2], options.segmentColors[id * 4 + 3]] : [buffer.idColors[id * 4], buffer.idColors[id * 4 + 1], buffer.idColors[id * 4 + 2], buffer.idColors[id * 4 + 3]]);\n            }\n            buffer.update();\n            this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    fromValues$3(0.2126, 0.7152, 0.0722);\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    create$3();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    create$3();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class PathHelper {\n        static getFilenameWithoutExtension(path) {\n            const dot = path.lastIndexOf('.');\n            if (dot == -1) {\n                return path;\n            }\n            else {\n                const start = path.lastIndexOf('/') == -1 ? 0 : path.lastIndexOf('/') + 1;\n                return path.substring(start, dot);\n            }\n        }\n        static getExtension(path) {\n            const dot = path.lastIndexOf('.');\n            if (dot == -1 || dot == path.length - 1) {\n                return null;\n            }\n            else {\n                return path.substring(dot + 1, path.length);\n            }\n        }\n        static getFilename(path) {\n            if (path.lastIndexOf('/') == -1) {\n                return path;\n            }\n            else {\n                const start = path.lastIndexOf('/') + 1;\n                return path.substring(start, path.length);\n            }\n        }\n        static getPath(path) {\n            if (path.lastIndexOf('/') == -1) {\n                return \"\";\n            }\n            else {\n                return path.substring(0, path.lastIndexOf('/'));\n            }\n        }\n        static combine(first, second) {\n            const seperator = first.lastIndexOf('/') == first.length - 1;\n            if (second.indexOf('/') == 0) {\n                if (seperator) {\n                    return first.substring(0, first.length - 1) + second;\n                }\n                else {\n                    return first + second;\n                }\n            }\n            else {\n                if (seperator) {\n                    return first + second;\n                }\n                else {\n                    return first + '/' + second;\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class TextureHelper {\n        static create(gl, width, height, format, type, filter, bytes, internalFormat = format) {\n            const texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n            gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, bytes);\n            return texture;\n        }\n        static fromImage(gl, image, mipmaps, filter) {\n            const texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, texture);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n            if (mipmaps && MathHelper.isPowerOf2(image.width) && MathHelper.isPowerOf2(image.height))\n                gl.generateMipmap(gl.TEXTURE_2D);\n            else {\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n            }\n            gl.bindTexture(gl.TEXTURE_2D, null);\n            return texture;\n        }\n        static cubemapFromImages(gl, images) {\n            const texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n            const targets = [\n                gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n                gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n                gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n                gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n                gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n                gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n            ];\n            for (let i = 0; i < 6; i++) {\n                gl.texImage2D(targets[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, images[i]);\n                gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            }\n            gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n            gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n            return texture;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Line extends LayoutBase {\n        layout(buffer, ids, fromIds, toIds, options) {\n            const start = window.performance.now();\n            const offset = options.offset === undefined ? 0 : options.offset;\n            const count = options.count === undefined ? ids.length : options.count;\n            const positionScalingX = options.positionScalingX === undefined ? 1 : options.positionScalingX;\n            const positionScalingY = options.positionScalingY === undefined ? 1 : options.positionScalingY;\n            const positionScalingZ = options.positionScalingZ === undefined ? 1 : options.positionScalingZ;\n            const sizeScalingX = options.sizeScaling === undefined ? options.sizeScalingX === undefined ? 1 : options.sizeScalingX : options.sizeScaling;\n            const sizeScalingY = options.sizeScaling === undefined ? options.sizeScalingY === undefined ? 1 : options.sizeScalingY : options.sizeScaling;\n            const sizeScalingZ = options.sizeScaling === undefined ? options.sizeScalingZ === undefined ? 1 : options.sizeScalingZ : options.sizeScaling;\n            const minSize = options.minSize === undefined ? 0 : options.minSize;\n            const offsetScaling = options.offsetScaling === undefined ? 1 : options.offsetScaling;\n            if (!this._positions || this._positions.length < buffer.length * 3) {\n                this._positions = new Float32Array(buffer.length * 3);\n                this._sizes = new Float32Array(buffer.length * 3);\n                this._rotations = new Float32Array(buffer.length * 4);\n            }\n            this.minLayoutBoundsX = Number.MAX_VALUE;\n            this.minLayoutBoundsY = Number.MAX_VALUE;\n            this.minLayoutBoundsZ = Number.MAX_VALUE;\n            this.maxLayoutBoundsX = -Number.MAX_VALUE;\n            this.maxLayoutBoundsY = -Number.MAX_VALUE;\n            this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n            const _vec3 = create$3();\n            const _quat = create$1();\n            const direction = create$3();\n            const lookup = buffer.lookup;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const fromId = fromIds[id];\n                const toId = toIds[id];\n                const index = lookup[id];\n                let toPositionX = options.positionsX ? options.positionsX[toId] * positionScalingX : 0;\n                let toPositionY = options.positionsY ? options.positionsY[toId] * positionScalingY : 0;\n                let toPositionZ = options.positionsZ ? options.positionsZ[toId] * positionScalingZ : 0;\n                let fromPositionX = options.positionsX ? options.positionsX[fromId] * positionScalingX : 0;\n                let fromPositionY = options.positionsY ? options.positionsY[fromId] * positionScalingY : 0;\n                let fromPositionZ = options.positionsZ ? options.positionsZ[fromId] * positionScalingZ : 0;\n                if (fromId == toId) {\n                    this._sizes[index * 3] = 0;\n                    this._sizes[index * 3 + 1] = 0;\n                    this._sizes[index * 3 + 2] = 0;\n                    this._rotations[index * 4] = 0;\n                    this._rotations[index * 4 + 1] = 0;\n                    this._rotations[index * 4 + 2] = 0;\n                    this._rotations[index * 4 + 3] = 1;\n                }\n                else {\n                    direction[0] = toPositionX - fromPositionX;\n                    direction[1] = toPositionY - fromPositionY;\n                    direction[2] = toPositionZ - fromPositionZ;\n                    let length$1 = length(direction);\n                    scale(direction, direction, 1 / length$1);\n                    rotationTo(_quat, this._core.config.identityRotation, direction);\n                    this._rotations[index * 4] = _quat[0];\n                    this._rotations[index * 4 + 1] = _quat[1];\n                    this._rotations[index * 4 + 2] = _quat[2];\n                    this._rotations[index * 4 + 3] = _quat[3];\n                    if (options.offsets) {\n                        const fromOffset = options.offsets[fromId] * offsetScaling / 2;\n                        const toOffset = options.offsets[toId] * offsetScaling / 2;\n                        toPositionX -= direction[0] * toOffset;\n                        toPositionY -= direction[1] * toOffset;\n                        toPositionZ -= direction[2] * toOffset;\n                        fromPositionX += direction[0] * fromOffset;\n                        fromPositionY += direction[1] * fromOffset;\n                        fromPositionZ += direction[2] * fromOffset;\n                        length$1 = Math.max(length$1 - toOffset - fromOffset, minSize);\n                    }\n                    this._sizes[index * 3 + 1] = Math.max(length$1 * sizeScalingY, minSize);\n                    if (options.lineSizes) {\n                        this._sizes[index * 3] = Math.max(options.lineSizes[id] * sizeScalingX, minSize);\n                        this._sizes[index * 3 + 2] = Math.max(options.lineSizes[id] * sizeScalingZ, minSize);\n                    }\n                    else if (options.endSizes) {\n                        this._sizes[index * 3] = Math.max(options.endSizes[fromId] * sizeScalingX, minSize);\n                        this._sizes[index * 3 + 2] = Math.max(options.endSizes[toId] * sizeScalingZ, minSize);\n                    }\n                    else {\n                        this._sizes[index * 3] = sizeScalingX;\n                        this._sizes[index * 3 + 2] = sizeScalingZ;\n                    }\n                }\n                _vec3[0] = (fromPositionX + toPositionX) / 2;\n                _vec3[1] = (fromPositionY + toPositionY) / 2;\n                _vec3[2] = (fromPositionZ + toPositionZ) / 2;\n                this._positions[index * 3] = _vec3[0];\n                this._positions[index * 3 + 1] = _vec3[1];\n                this._positions[index * 3 + 2] = _vec3[2];\n                this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, fromPositionX);\n                this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, fromPositionY);\n                this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, fromPositionZ);\n                this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, toPositionX);\n                this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, toPositionY);\n                this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, toPositionZ);\n                this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, fromPositionX);\n                this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, fromPositionY);\n                this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, fromPositionZ);\n                this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, toPositionX);\n                this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, toPositionY);\n                this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, toPositionZ);\n            }\n            this._updateCumulativeLayoutBounds();\n            this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        update(buffer, ids, fromIds, toIds, options) {\n            const start = window.performance.now();\n            const offset = options.offset === undefined ? 0 : options.offset;\n            const count = options.count === undefined ? ids.length : options.count;\n            const dataView = buffer.dataView;\n            const _vec2 = create();\n            const _vec3 = create$3();\n            const _quat = create$1();\n            const endMinColor = options.endMinColor === undefined ? 0 : options.endMinColor;\n            const endMaxColor = options.endMaxColor === undefined ? 1 : options.endMaxColor;\n            const lineMinColor = options.lineMinColor === undefined ? 0 : options.lineMinColor;\n            const lineMaxColor = options.lineMaxColor === undefined ? 1 : options.lineMaxColor;\n            const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n            const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n            const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n            const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n            const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n            const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n            const reverseX = options.reverseX === undefined ? false : options.reverseX;\n            const reverseY = options.reverseY === undefined ? false : options.reverseY;\n            const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n            this._updateModelBounds(options);\n            const lookup = buffer.lookup;\n            const selection = options.selected && options.selected.size > 0;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const fromId = fromIds[id];\n                const toId = toIds[id];\n                const index = lookup[id];\n                let positionX = this._positions[index * 3];\n                let positionY = this._positions[index * 3 + 1];\n                let positionZ = this._positions[index * 3 + 2];\n                if (this._isFacetted) {\n                    if (reverseX) {\n                        positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                    }\n                    if (reverseY) {\n                        positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                    }\n                    if (reverseZ) {\n                        positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                    }\n                    const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                    const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                    const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                    positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                    positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                    positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n                }\n                else {\n                    if (reverseX) {\n                        positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                    }\n                    if (reverseY) {\n                        positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                    }\n                    if (reverseZ) {\n                        positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n                    }\n                }\n                _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n                _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n                _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n                UnitVertex.setTranslation(dataView, index, _vec3);\n                _vec3[0] = this._sizes[index * 3] * this._boundsScaling;\n                _vec3[1] = this._sizes[index * 3 + 1] * this._boundsScaling;\n                _vec3[2] = this._sizes[index * 3 + 2] * this._boundsScaling;\n                UnitVertex.setScale(dataView, index, _vec3);\n                _quat[0] = this._rotations[index * 4];\n                _quat[1] = this._rotations[index * 4 + 1];\n                _quat[2] = this._rotations[index * 4 + 2];\n                _quat[3] = this._rotations[index * 4 + 3];\n                if (reverseX) {\n                    _quat[1] = -_quat[1];\n                    _quat[2] = -_quat[2];\n                }\n                if (reverseY) {\n                    _quat[0] = -_quat[0];\n                    _quat[2] = -_quat[2];\n                }\n                if (reverseZ) {\n                    _quat[0] = -_quat[0];\n                    _quat[1] = -_quat[1];\n                }\n                UnitVertex.setRotation(dataView, index, _quat);\n                let size;\n                if (options.endColors) {\n                    size = 1 / (endMaxColor - endMinColor + 1);\n                    const fromColor = MathHelper.normalize(options.endColors[fromId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n                    const toColor = MathHelper.normalize(options.endColors[toId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n                    set(_vec2, fromColor, toColor);\n                    UnitVertex.setColor(dataView, index, _vec2);\n                }\n                else if (options.lineColors) {\n                    size = 1 / (lineMaxColor - lineMinColor + 1);\n                    const color = MathHelper.normalize(options.lineColors[id], lineMinColor, lineMaxColor, size / 2, 1 - size / 2);\n                    set(_vec2, color, color);\n                    UnitVertex.setColor(dataView, index, _vec2);\n                }\n                else {\n                    UnitVertex.setColor(dataView, index, Constants.VECTOR2_ONE);\n                }\n                UnitVertex.setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n                UnitVertex.setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n                if (options.order !== undefined) {\n                    const order = MathHelper.normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                    _vec2[0] = orderReverse ? 1 - order : order;\n                }\n                else {\n                    _vec2[0] = count == 1 ? 0 : i / (count - 1);\n                }\n                if (options.staggerOrder !== undefined) {\n                    _vec2[1] = options.staggerOrder;\n                }\n                else if (options.staggerOrders) {\n                    const stagger = MathHelper.normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                    _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n                }\n                else {\n                    _vec2[1] = count == 1 ? 0 : i / (count - 1);\n                }\n                UnitVertex.setOrder(dataView, index, _vec2);\n                UnitVertex.setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n                UnitVertex.setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n                UnitVertex.setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n                UnitVertex.setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n                UnitVertex.setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n                UnitVertex.setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [options.materialColors[id * 3], options.materialColors[id * 3 + 1], options.materialColors[id * 3 + 2]] : [0, 0, 0]);\n                UnitVertex.setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n                UnitVertex.setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n                UnitVertex.setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n                UnitVertex.setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n                UnitVertex.setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [options.segmentColors[id * 4], options.segmentColors[id * 4 + 1], options.segmentColors[id * 4 + 2], options.segmentColors[id * 4 + 3]] : [buffer.idColors[id * 4], buffer.idColors[id * 4 + 1], buffer.idColors[id * 4 + 2], buffer.idColors[id * 4 + 3]]);\n            }\n            buffer.update();\n            this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AtlasBase {\n        get imageData() { return this._imageData; }\n        set imageData(value) {\n            if (this._imageData != value) {\n                this._imageData = value;\n                this._changed = true;\n            }\n        }\n        constructor() {\n            this._imageData = null;\n        }\n        copyFrom(atlas) {\n            if (atlas.imageData) {\n                this._imageData = atlas.imageData;\n                this._changed = true;\n            }\n            else {\n                this.imageData = null;\n            }\n        }\n        update() { }\n    }\n    let Atlas$2 = class Atlas extends AtlasBase {\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class BufferBase {\n        get isInitialized() { return this._isInitialized; }\n        get ids() { return this._ids; }\n        get dataView() { return this._dataView; }\n        get vertices() { return this._vertices; }\n        get lookup() { return this._lookup; }\n        get length() { return this._length; }\n        get selected() { return this._selected; }\n        constructor(core, ids) {\n            this._core = core;\n            this._ids = ids;\n            this._length = ids.length;\n            this._vertices = new ArrayBuffer(this._length * UnitVertex.SIZE_BYTES);\n            this._dataView = new DataView(this._vertices);\n            this._selected = new Set();\n            this.from = 0;\n            this.to = 1;\n            this.unitType = UnitType.block;\n            this._lookup = {};\n            for (let i = 0; i < this._length; i++) {\n                const id = ids[i];\n                this._lookup[id] = i;\n                UnitVertex.setRotation(this._dataView, i, Constants.QUAT_IDENTITY);\n            }\n        }\n        createShared() {\n            const buffer = Object.create(this);\n            buffer._vertices = new ArrayBuffer(buffer._vertices.byteLength);\n            buffer._dataView = new DataView(buffer._vertices);\n            return buffer;\n        }\n        copyFrom(buffer) {\n            const start = window.performance.now();\n            const fromDataView = buffer.dataView;\n            const toDataView = this._dataView;\n            const lookup = buffer.lookup;\n            for (let i = 0; i < this._length; i++) {\n                const index = lookup[this._ids[i]];\n                if (index != null) {\n                    UnitVertex.copyIdHover(fromDataView, index, toDataView, i);\n                    UnitVertex.copyTranslation(fromDataView, index, toDataView, i);\n                    UnitVertex.copyScale(fromDataView, index, toDataView, i);\n                    UnitVertex.copyRotation(fromDataView, index, toDataView, i);\n                    UnitVertex.copyColor(fromDataView, index, toDataView, i);\n                    UnitVertex.copySelected(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMaterial(fromDataView, index, toDataView, i);\n                    UnitVertex.copyRounding(fromDataView, index, toDataView, i);\n                    UnitVertex.copyOrder(fromDataView, index, toDataView, i);\n                    UnitVertex.copyTexCoord(fromDataView, index, toDataView, i);\n                    UnitVertex.copyTexture(fromDataView, index, toDataView, i);\n                    UnitVertex.copySdfBuffer(fromDataView, index, toDataView, i);\n                    UnitVertex.copySdfBorder(fromDataView, index, toDataView, i);\n                    UnitVertex.copyParameter1(fromDataView, index, toDataView, i);\n                    UnitVertex.copyParameter2(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatId(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatColor(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatFuzz(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatRefractiveIndex(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatGloss(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatDensity(fromDataView, index, toDataView, i);\n                    UnitVertex.copySegColor(fromDataView, index, toDataView, i);\n                }\n                else {\n                    UnitVertex.setRotation(toDataView, i, Constants.QUAT_IDENTITY);\n                }\n            }\n            this.unitType = buffer.unitType;\n            this._selected = buffer.selected;\n            this._core.log.write(LogLevel.info, `buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        update() { }\n        updateSelection(options) {\n            const start = window.performance.now();\n            const ids = options && options.ids ? options.ids : this._ids;\n            const offset = options && options.offset !== undefined ? options.offset : 0;\n            const count = options && options.count !== undefined ? options.count : ids.length;\n            const selection = this._selected.size > 0;\n            const dataView = this._dataView;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const index = this._lookup[id];\n                UnitVertex.setSelected(dataView, index, selection ? this._selected.has(id) ? 1 : -1 : 0);\n            }\n            this.update();\n            this._core.log.write(LogLevel.info, `buffer update selection ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n    class TransitionBufferBase {\n        get pickIdLookup() { return this._pickIdLookup; }\n        get currentBuffer() { return this._isBuffer1Current ? this._buffer1 : this._buffer2; }\n        get previousBuffer() { return this._isBuffer1Current ? this._buffer2 : this._buffer1; }\n        get currentPalette() { return this._isBuffer1Current ? this._palette1 : this._palette2; }\n        get previousPalette() { return this._isBuffer1Current ? this._palette2 : this._palette1; }\n        get currentAtlas() { return this._isBuffer1Current ? this._atlas1 : this._atlas2; }\n        get previousAtlas() { return this._isBuffer1Current ? this._atlas2 : this._atlas1; }\n        get isInitialized() { return this._isInitialized; }\n        get length() { return this._length; }\n        constructor(core, ids, bufferType, paletteType, atlasType) {\n            this.bufferType = bufferType;\n            this.paletteType = paletteType;\n            this.atlasType = atlasType;\n            this._core = core;\n            this._length = ids.length;\n            this.id = TransitionBufferBase._id++;\n            this.isVisible = true;\n            this.transitionTime = 1;\n            this.activeId = -1;\n            const start = window.performance.now();\n            this._buffer1 = new bufferType(core, ids);\n            this._buffer2 = this._buffer1.createShared();\n            this._palette1 = new paletteType();\n            this._palette2 = new paletteType();\n            this._atlas1 = new atlasType();\n            this._atlas2 = new atlasType();\n            this.isPickingEnabled = true;\n            this._pickIdLookup = {};\n            const dataView1 = this._buffer1.dataView;\n            const dataView2 = this._buffer2.dataView;\n            const _vec4 = create$2();\n            this.idColors = new Float32Array(this._length * 4);\n            this._buffer1.idColors = this.idColors;\n            this._buffer2.idColors = this.idColors;\n            for (let i = 0; i < this._length; i++) {\n                const id = ids[i];\n                const pickId = PickHelper.nextPickId();\n                this._pickIdLookup[pickId] = id;\n                PickHelper.encodeNumber(pickId, PickType.data, _vec4);\n                this.idColors[i * 4] = _vec4[0];\n                this.idColors[i * 4 + 1] = _vec4[1];\n                this.idColors[i * 4 + 2] = _vec4[2];\n                this.idColors[i * 4 + 3] = _vec4[3];\n                UnitVertex.setIdColor(dataView1, i, _vec4);\n                UnitVertex.setIdColor(dataView2, i, _vec4);\n            }\n            this._core.log.write(LogLevel.info, `transition buffer created ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        swap() {\n            this._isBuffer1Current = !this._isBuffer1Current;\n        }\n        copyFrom(transitionBuffer) {\n            const start = window.performance.now();\n            this.key = transitionBuffer.key;\n            this.isVisible = transitionBuffer.isVisible;\n            this.transitionTime = transitionBuffer.transitionTime;\n            this.isPickingEnabled = transitionBuffer.isPickingEnabled;\n            this.unitType = transitionBuffer.unitType;\n            this.activeId = transitionBuffer.activeId;\n            this.currentBuffer.copyFrom(transitionBuffer.currentBuffer);\n            this.previousBuffer.copyFrom(transitionBuffer.previousBuffer);\n            this.currentBuffer.update();\n            this.previousBuffer.update();\n            this.currentPalette.copyFrom(transitionBuffer.currentPalette);\n            this.previousPalette.copyFrom(transitionBuffer.previousPalette);\n            this.currentAtlas.copyFrom(transitionBuffer.currentAtlas);\n            this.previousAtlas.copyFrom(transitionBuffer.previousAtlas);\n            this._core.log.write(LogLevel.info, `transition buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n    TransitionBufferBase._id = 1;\n    let Buffer$2 = class Buffer extends BufferBase {\n        constructor(core, ids) {\n            super(core, ids);\n        }\n    };\n    let TransitionBuffer$2 = class TransitionBuffer extends TransitionBufferBase {\n        constructor(core, ids) {\n            super(core, ids, Buffer$2, Palette$2, Atlas$2);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DebugAxes {\n        get vertices() { return this._vertices; }\n        get indices() { return this._indices; }\n        get indexCount() { return this._indexCount; }\n        get isInitialized() { return this._isInitialized; }\n        initialize() {\n            let vertexOffset = 0;\n            let indexOffset = 0;\n            const axisVertices = Cube.POSITIONS;\n            const axisIndices = Cube.INDICES;\n            this._vertices = new ArrayBuffer(3 * PositionColorVertex.SIZE_BYTES * axisVertices.length / PositionVertex.SIZE);\n            const verticesView = new DataView(this._vertices);\n            this._indices = new Uint16Array(3 * axisIndices.length + 4);\n            const vertexCount = axisVertices.length / PositionVertex.SIZE;\n            const indexCount = axisIndices.length;\n            const transform = create$4();\n            const length = 1;\n            const width = 0.01;\n            transform[0] = length;\n            transform[5] = width;\n            transform[10] = width;\n            transform[12] = 0.5;\n            transform[13] = 0;\n            transform[14] = 0;\n            this._createAxis(axisVertices, axisIndices, verticesView, this._indices, Constants.VECTOR3_UNITX, transform, vertexOffset, indexOffset);\n            indexOffset += indexCount;\n            this._indices[indexOffset++] = axisIndices[indexCount - 1] + vertexOffset;\n            vertexOffset += vertexCount;\n            this._indices[indexOffset++] = axisIndices[0] + vertexOffset;\n            transform[0] = width;\n            transform[5] = length;\n            transform[10] = width;\n            transform[12] = 0;\n            transform[13] = 0.5;\n            transform[14] = 0;\n            this._createAxis(axisVertices, axisIndices, verticesView, this._indices, Constants.VECTOR3_UNITY, transform, vertexOffset, indexOffset);\n            indexOffset += indexCount;\n            this._indices[indexOffset++] = axisIndices[indexCount - 1] + vertexOffset;\n            vertexOffset += vertexCount;\n            this._indices[indexOffset++] = axisIndices[0] + vertexOffset;\n            transform[0] = width;\n            transform[5] = width;\n            transform[10] = length;\n            transform[12] = 0;\n            transform[13] = 0;\n            transform[14] = 0.5;\n            this._createAxis(axisVertices, axisIndices, verticesView, this._indices, Constants.VECTOR3_UNITZ, transform, vertexOffset, indexOffset);\n            this._indexCount = this._indices.length;\n            this._isInitialized = true;\n        }\n        update(elapsedTime) { }\n        _createAxis(axisVertices, axisIndices, verticesView, indices, color, transform, vertexOffset, indexOffset) {\n            const position = create$3();\n            const vertexCount = axisVertices.length / PositionVertex.SIZE;\n            const indexCount = axisIndices.length;\n            for (let i = 0; i < vertexCount; i++) {\n                set$3(position, axisVertices[i * PositionVertex.SIZE], axisVertices[i * PositionVertex.SIZE + 1], axisVertices[i * PositionVertex.SIZE + 2]);\n                transformMat4$2(position, position, transform);\n                PositionColorVertex.setPosition(verticesView, vertexOffset + i, position);\n                PositionColorVertex.setColor(verticesView, vertexOffset + i, color);\n            }\n            for (let i = 0; i < indexCount; i++) {\n                indices[indexOffset + i] = axisIndices[i] + vertexOffset;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    class RendererConfig {\n        reset() { }\n    }\n    class RendererBase {\n        get isInitialized() { return this._isInitialized; }\n        get config() { return this._config; }\n        get devicePixelRatio() { return this._devicePixelRatio; }\n        get width() { return this._canvas.width; }\n        set width(value) { this._options.width = value; }\n        get height() { return this._canvas.height; }\n        set height(value) { this._options.height = value; }\n        get webXRReferenceSpace() { return this._webXRReferenceSpace; }\n        get pickedType() { return this._pickedType; }\n        get pickedId() { return this._pickedId; }\n        get isCapturingPickImage() { return this._isCapturingPickImage; }\n        capturePickImage() {\n            this._isCapturingPickImage = true;\n        }\n        get backgroundColor() { return this._backgroundColor; }\n        set backgroundColor(value) {\n            if (!exactEquals(value, this._backgroundColor)) {\n                this._backgroundColor = value;\n            }\n        }\n        get ambientColor() { return this._ambientColor; }\n        set ambientColor(value) {\n            if (!exactEquals$1(value, this._ambientColor)) {\n                this._ambientColor = value;\n            }\n        }\n        get currentAxes() { return this._isAxes1Current ? this._axes1 : this._axes2; }\n        set currentAxes(value) { if (this._isAxes1Current) {\n            this._axes1 = value;\n        }\n        else {\n            this._axes2 = value;\n        } }\n        get previousAxes() { return this._isAxes1Current ? this._axes2 : this._axes1; }\n        set previousAxes(value) { if (this._isAxes1Current) {\n            this._axes2 = value;\n        }\n        else {\n            this._axes1 = value;\n        } }\n        swapAxes() { this._isAxes1Current = !this._isAxes1Current; }\n        createCartesian2dAxesVisual(axes) {\n            return new AxesVisual(axes);\n        }\n        createCartesian3dAxesVisual(axes) {\n            return new AxesVisual(axes);\n        }\n        _createDebugAxesVisual(debugAxes) { return null; }\n        createLabelSetVisual(labelSet) {\n            return new LabelSetVisual$2(labelSet);\n        }\n        createControllerVisual(controller) {\n            return new ControllerVisual$1(controller);\n        }\n        ;\n        createTransitionBuffer(ids) {\n            return new TransitionBuffer$2(this._core, ids);\n        }\n        createImageVisual(image) {\n            return new ImageVisual$2(image);\n        }\n        ;\n        createFontVisual(font) {\n            return new FontVisual$2(font);\n        }\n        constructor(options) {\n            this._options = options;\n            this.fonts = {};\n        }\n        get isWebXRSupported() { return false; }\n        initialize(core) {\n            this._core = core;\n            this._canvas = document.createElement(\"canvas\");\n            const contextmenu = this._options && this._options.contextmenu;\n            if (!contextmenu) {\n                this._canvas.addEventListener(\"contextmenu\", (e) => { e.preventDefault(); });\n            }\n            this._canvas.tabIndex = this._core.container.tabIndex;\n            this._canvas.style.display = \"block\";\n            this._canvas.style.touchAction = \"none\";\n            this._core.container.appendChild(this._canvas);\n            this._mvMatrices = [create$4(), create$4()];\n            this.pickPMatrix = create$4();\n            this.axesVisibility = AxesVisibility.current;\n            this._debugAxes = new DebugAxes();\n            this._debugAxesVisual = this._createDebugAxesVisual(this._debugAxes);\n            this.transitionTime = 1;\n            this.transitionBuffers = [];\n            this.areLabelsVisible = true;\n            this.labelSets = [];\n            this.controllers = [];\n            this.areImagesVisible = true;\n            this.images = [];\n            this._viewports = [new DOMRect(), new DOMRect()];\n            this.isPickingEnabled = false;\n            this._pickedType = PickType.none;\n            this._pickedId = 0;\n            this._lassoMMatrix = create$4();\n            this._lassoThickness = create();\n            this._resizeMinimumDelay = -1;\n            this._previousResizeWidth = -1;\n            this._previousResizeHeight = -1;\n        }\n        remove() {\n            this._core.container.removeChild(this._canvas);\n        }\n        finalize() {\n            this._isInitialized = false;\n        }\n        setSize(elapsedTime) {\n            if (this._options && this._options.width && this._options.height) {\n                this._devicePixelRatio = 1;\n                this._resizeWidth = this._options.width;\n                this._resizeHeight = this._options.height;\n            }\n            else {\n                this._devicePixelRatio = window.devicePixelRatio || 1;\n                this._resizeWidth = this._core.container.clientWidth * devicePixelRatio;\n                this._resizeHeight = this._core.container.clientHeight * devicePixelRatio;\n            }\n            if (this._resizeWidth != this._previousResizeWidth || this._resizeHeight != this._previousResizeHeight) {\n                this._previousResizeWidth = this._resizeWidth;\n                this._previousResizeHeight = this._resizeHeight;\n                this._isResizing = true;\n                this._resizeElapsedTime = elapsedTime;\n            }\n            if (this._isResizing) {\n                if (this._resizeElapsedTime > this._resizeMinimumDelay && this._isInitialized) {\n                    this._isResizing = false;\n                    this._resizeMinimumDelay = this._core.config.resizeMinimumDelay;\n                    this._resize(this._resizeWidth, this._resizeHeight);\n                }\n                else {\n                    this._resizeElapsedTime += elapsedTime;\n                }\n            }\n        }\n        _resize(width, height) {\n            this._canvas.style.width = `${Math.floor(width / this._devicePixelRatio)}px`;\n            this._canvas.style.height = `${Math.floor(height / this._devicePixelRatio)}px`;\n            width = Math.floor(width);\n            height = Math.floor(height);\n            this._canvas.width = width;\n            this._canvas.height = height;\n        }\n        update(elapsedTime) {\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                const transitionBuffer = this.transitionBuffers[i];\n                if (transitionBuffer.isVisible) {\n                    const previous = transitionBuffer.previousPalette;\n                    const current = transitionBuffer.currentPalette;\n                    if (previous) {\n                        previous.update();\n                    }\n                    if (current) {\n                        current.update();\n                    }\n                }\n            }\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                const transitionBuffer = this.transitionBuffers[i];\n                if (transitionBuffer.isVisible) {\n                    const previous = transitionBuffer.previousAtlas;\n                    const current = transitionBuffer.currentAtlas;\n                    if (previous) {\n                        previous.update();\n                    }\n                    if (current) {\n                        current.update();\n                    }\n                }\n            }\n            if (this._core.config.isDebugVisible) {\n                if (this._debugAxesVisual) {\n                    this._debugAxesVisual.mMatrix = this.mMatrix;\n                    this._debugAxesVisual.vMatrices = this.vMatrices;\n                    this._debugAxesVisual.pMatrices = this.pMatrices;\n                    this._debugAxesVisual.viewports = this._viewports;\n                    this._debugAxesVisual.viewportOffset = this._viewportOffset;\n                    this._debugAxesVisual.viewportCount = this._viewportCount;\n                }\n            }\n            if (this.areLabelsVisible) {\n                for (let i = 0; i < this.labelSets.length; i++) {\n                    const labelSetVisual = this.labelSets[i];\n                    if (labelSetVisual.isVisible) {\n                        this.labelSets[i].label.update(elapsedTime);\n                        labelSetVisual.mMatrix = this.mMatrix;\n                        labelSetVisual.vMatrices = this.vMatrices;\n                        labelSetVisual.pMatrices = this.pMatrices;\n                        labelSetVisual.isPickingEnabled = this.isPickingEnabled;\n                        labelSetVisual.pickPMatrix = this.pickPMatrix;\n                        labelSetVisual.pickVMatrix = this.pickVMatrix;\n                        labelSetVisual.viewports = this._viewports;\n                        labelSetVisual.viewportOffset = this._viewportOffset;\n                        labelSetVisual.viewportCount = this._viewportCount;\n                        labelSetVisual.update(elapsedTime);\n                    }\n                }\n            }\n            if (this.areImagesVisible) {\n                for (let i = 0; i < this.images.length; i++) {\n                    const imageVisual = this.images[i];\n                    if (imageVisual && imageVisual.isVisible) {\n                        const image = this.images[i].image;\n                        image.update(elapsedTime);\n                        imageVisual.mMatrix = this.mMatrix;\n                        imageVisual.vMatrices = this.vMatrices;\n                        imageVisual.pMatrices = this.pMatrices;\n                        imageVisual.isPickingEnabled = this.isPickingEnabled;\n                        imageVisual.pickPMatrix = this.pickPMatrix;\n                        imageVisual.pickVMatrix = this.pickVMatrix;\n                        imageVisual.viewports = this._viewports;\n                        imageVisual.viewportOffset = this._viewportOffset;\n                        imageVisual.viewportCount = this._viewportCount;\n                        imageVisual.update(elapsedTime);\n                    }\n                }\n            }\n            for (let i = 0; i < this.controllers.length; i++) {\n                const controllerVisual = this.controllers[i];\n                if (controllerVisual.isVisible) {\n                    const controller = this.controllers[i].controller;\n                    controller.update(elapsedTime);\n                    controllerVisual.vMatrices = this.vMatrices;\n                    controllerVisual.inverseVMatrices = this.vMatrices;\n                    controllerVisual.pMatrices = this.pMatrices;\n                    controllerVisual.viewports = this._viewports;\n                    controllerVisual.viewportOffset = this._viewportOffset;\n                    controllerVisual.viewportCount = this._viewportCount;\n                    controllerVisual.update(elapsedTime);\n                }\n            }\n            const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n            if (axesVisuals) {\n                for (let i = 0; i < axesVisuals.length; i++) {\n                    const axesVisual = axesVisuals[i];\n                    if (axesVisual.isVisible) {\n                        const axes = axesVisual.axes;\n                        axes.mMatrix = this.mMatrix;\n                        axes.vMatrix = this.vMatrices[0];\n                        axes.update(elapsedTime);\n                        axesVisual.vMatrices = this.vMatrices;\n                        axesVisual.pMatrices = this.pMatrices;\n                        axesVisual.isPickingEnabled = this.isPickingEnabled;\n                        axesVisual.pickPMatrix = this.pickPMatrix;\n                        axesVisual.pickVMatrix = this.pickVMatrix;\n                        axesVisual.viewports = this._viewports;\n                        axesVisual.viewportOffset = this._viewportOffset;\n                        axesVisual.viewportCount = this._viewportCount;\n                        axesVisual.update(elapsedTime);\n                    }\n                }\n            }\n            for (const key in this.fonts) {\n                const fontVisual = this.fonts[key];\n                const font = fontVisual.font;\n                font.update();\n                fontVisual.update();\n            }\n        }\n        getVertexPosition(position, pickedId) {\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                const transitionBuffer = this.transitionBuffers[i];\n                const id = transitionBuffer.pickIdLookup[pickedId];\n                if (id > -1) {\n                    const index = transitionBuffer.currentBuffer.lookup[id];\n                    const dataView = transitionBuffer.currentBuffer.dataView;\n                    UnitVertex.getTranslation(dataView, index, position);\n                    break;\n                }\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            return __awaiter$3(this, void 0, void 0, function* () { });\n        }\n        prepare(xrFrame) { }\n        initializeWebXR(session) {\n            return null;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Quad$1 = class Quad {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        get indexBuffer() { return this._indexBuffer; }\n        get indexCount() { return this._indexCount; }\n        initializeContext(gl) {\n            const _vec3 = fromValues$3(2, 2, 2);\n            const _mat4 = create$4();\n            fromScaling(_mat4, _vec3);\n            const vertices = Quad$2.positions(_mat4);\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Quad$2.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this._indexCount = indices.length;\n            this._isInitialized = true;\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Atlas$1 = class Atlas extends AtlasBase {\n        get texture() { return this._texture; }\n        get defaultTexture() { return this._defaultTexture; }\n        initializeContext(core, gl) {\n            this._gl = gl;\n            this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([0xff, 0xff, 0xff, 0xff]));\n            this._updateTexture();\n        }\n        update() {\n            super.update();\n            if (this._changed) {\n                this._changed = false;\n                this._updateTexture();\n            }\n        }\n        _updateTexture() {\n            if (this._imageData) {\n                this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n            }\n            else {\n                this._texture = null;\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Palette$1 = class Palette extends PaletteBase {\n        get texture() { return this._texture; }\n        get defaultTexture() { return this._defaultTexture; }\n        initializeContext(core, gl) {\n            this._gl = gl;\n            this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n            this._updateTexture();\n        }\n        update() {\n            super.update();\n            if (this._changed) {\n                this._changed = false;\n                this._updateTexture();\n            }\n        }\n        _updateTexture() {\n            if (this._colors) {\n                const colors = new Uint8Array(this._colors);\n                for (let i = 0; i < colors.length; i++) {\n                    colors[i] = Math.pow(colors[i] / 0xff, 2.2) * 0xff;\n                }\n                this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors);\n            }\n            else {\n                this._texture = null;\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Buffer$1 = class Buffer extends BufferBase {\n        get vertexBuffer() { return this._vertexBuffer; }\n        initializeContext(gl) {\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update() {\n            if (this._isInitialized) {\n                const start = window.performance.now();\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n                this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n            }\n        }\n    };\n    let TransitionBuffer$1 = class TransitionBuffer extends TransitionBufferBase {\n        constructor(core, ids) {\n            super(core, ids, Buffer$1, Palette$1, Atlas$1);\n        }\n        initializeContext(gl) {\n            this._buffer1.initializeContext(gl);\n            this._buffer2.initializeContext(gl);\n            this._palette1.initializeContext(this._core, gl);\n            this._palette2.initializeContext(this._core, gl);\n            this._atlas1.initializeContext(this._core, gl);\n            this._atlas2.initializeContext(this._core, gl);\n            this._isInitialized = true;\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Config$1 = class Config extends RendererConfig {\n        constructor() {\n            super();\n            this.reset();\n        }\n        reset() {\n            this.specularIntensity = 0.15;\n            this.specularPower = 150;\n            this.lightPosition = fromValues$3(-0.5, 0.5, 0);\n            this.ambient = 0.01;\n            const _quat1 = create$1();\n            const _quat2 = create$1();\n            let angle = AngleHelper.degreesToRadians(15);\n            setAxisAngle(_quat1, Constants.VECTOR3_UNITX, angle);\n            multiply(_quat2, _quat1, _quat2);\n            angle = AngleHelper.degreesToRadians(-15);\n            setAxisAngle(_quat1, Constants.VECTOR3_UNITY, angle);\n            multiply(_quat2, _quat2, _quat1);\n            this.directionToLight = create$3();\n            transformQuat(this.directionToLight, Constants.VECTOR3_UNITZ, _quat2);\n            this.halfAngle = create$3();\n            add(this.halfAngle, Constants.VECTOR3_UNITZ, this.directionToLight);\n            normalize$3(this.halfAngle, this.halfAngle);\n            this.isFxaaEnabled = false;\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Resources$1 = class Resources {\n        bindFramebuffer(framebuffer) {\n            if (this.framebuffer != framebuffer) {\n                this.framebuffer = framebuffer;\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n            }\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this.framebuffer = this._gl.createFramebuffer();\n            this.ANGLE_instanced_arrays = gl.getExtension(\"ANGLE_instanced_arrays\");\n            this.OES_standard_derivatives = gl.getExtension(\"OES_standard_derivatives\");\n            this.EXT_frag_depth = gl.getExtension(\"EXT_frag_depth\");\n            this.OES_element_index_uint = gl.getExtension(\"OES_element_index_uint\");\n            this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n        }\n    };\n    Resources$1.glsl = {\n        \"anaglyph.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nconst vec3 LEFT_MASK = vec3(1.0, 0.0, 0.0);\\nconst vec3 RIGHT_MASK = vec3(0.0, 1.0, 1.0);\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 color = LEFT_MASK * dot(texture2D(uSampler1, texCoords).rgb, LUMINANCE);\\ncolor += RIGHT_MASK * dot(texture2D(uSampler2, texCoords).rgb, LUMINANCE);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n\",\n        \"color.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec3 vColor;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(vColor, GAMMA), 1.0);\\n}\\n\",\n        \"color.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec3 aColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying lowp vec3 vColor;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvColor = aColor;\\n}\\n\",\n        \"lasso.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\ngl_FragColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n\",\n        \"lasso.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n        \"model.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform sampler2D uSampler;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(texture2D(uSampler, vTexCoord).xyz, GAMMA), 1.0);\\nvec3 color = texture2D(uSampler, vTexCoord).xyz;\\nfloat ambient = 0.01;\\nvec3 normal = normalize(vNormal);\\nfloat diffuse = 0.5 * max(dot(uDirectionToLight, normal), 0.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (ambient + diffuse);\\ncolor += specular;\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n\",\n        \"model.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nvTexCoord = aTexCoord;\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(aNormal, 0.0));\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\n}\\n\",\n        \"pickgrid.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#define Derivatives\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nuniform vec3 uDirectionToLight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick)\\n{\\ngl_FragColor = vColor;\\n}\\nelse\\n{\\nvec2 buffer;\\n#ifdef Derivatives\\nbuffer = fwidth(vTexCoord);\\n#else\\nbuffer = vec2(0.002);\\n#endif\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nfloat diffuse = 0.2 * max(dot(uDirectionToLight, vNormal), 0.0);\\nfloat ambient = 0.8;\\ncolor.xyz *= (ambient + diffuse);\\ncolor.xyz = pow(color.xyz, GAMMA);\\ngl_FragColor = color;\\n}\\n}\\n\",\n        \"pickgrid.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec4 aIdColor;\\nattribute mediump vec2 aTexCoord;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n        \"sdftext.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#define Derivatives\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse {\\nfloat distance = texture2D(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\ngl_FragColor = vec4(pow(mix(uBorderColor, mix(uColor, uHoverColor, vHover), value), GAMMA), 1.0);\\n}\\n}\\n\",\n        \"sdftext.vertex.fx\": \"#version 100\\nattribute lowp vec4 aIdColor;\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n        \"simple.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n        \"texture.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nif (uPick) {\\ngl_FragColor = vec4(0.0);\\n}\\nelse {\\ngl_FragColor = vec4(texture2D(uSampler, vTexCoord).xyz, 1.0);\\n}\\n}\\n\",\n        \"texture.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n        \"unitblock.fragment.fx\": \"#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void)\\n{\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n\",\n        \"unitblock.vertex.fx\": \"#version 100\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n        \"unitcylinder.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - sqrt(h1);\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - sqrt(h2);\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n        \"unitcylinder.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n        \"unithexprism.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform mat4 uVMatrix;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nvec4 iHexPrism( in vec3 ro, in vec3 rd, in float ra, in float he )\\n{\\nconst vec3 n1 = vec3( 1.0,0.0,0.0);\\nconst vec3 n2 = vec3( 0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n3 = vec3(-0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n4 = vec3( 0.0,1.0,0.0);\\nvec3 t1 = vec3((vec2(ra,-ra)-dot(ro,n1))/dot(rd,n1), 1.0);\\nvec3 t2 = vec3((vec2(ra,-ra)-dot(ro,n2))/dot(rd,n2), 1.0);\\nvec3 t3 = vec3((vec2(ra,-ra)-dot(ro,n3))/dot(rd,n3), 1.0);\\nvec3 t4 = vec3((vec2(he,-he)-dot(ro,n4))/dot(rd,n4), 1.0);\\nif( t1.y<t1.x ) t1=vec3(t1.yx,-1.0);\\nif( t2.y<t2.x ) t2=vec3(t2.yx,-1.0);\\nif( t3.y<t3.x ) t3=vec3(t3.yx,-1.0);\\nif( t4.y<t4.x ) t4=vec3(t4.yx,-1.0);\\nvec4 tN=vec4(t1.x,t1.z*n1);\\nif( t2.x>tN.x ) tN=vec4(t2.x,t2.z*n2);\\nif( t3.x>tN.x ) tN=vec4(t3.x,t3.z*n3);\\nif( t4.x>tN.x ) tN=vec4(t4.x,t4.z*n4);\\nfloat tF = min(min(t1.y,t2.y),min(t3.y,t4.y));\\nif( tN.x>tF || tF<0.0) return vec4(-1.0);\\nreturn tN;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = -vViewCenter;\\nmat3 rot = mat3(uVMatrix);\\nvec3 rdd = rd * rot;\\nvec3 roo = ro * rot;\\nvec4 tnor = iHexPrism(roo, rdd, vRadius * vScaling, vHeight * vScaling);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = rot * tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n        \"unithexprism.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvRadius = 0.0;\\nvHeight = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvRadius = scale.x * ROOT_THREE_OVER_TWO;\\nvHeight = scale.y;\\nvec3 position = aPosition;\\nposition.y *= scale.y;\\nposition.z *= scale.x;\\nposition.x *= scale.x * ROOT_THREE_OVER_TWO;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvScaling = length(uMMatrix[0].xyz) / 2.0;\\n}\\n}\\n\",\n        \"unitsdf.fragment.fx\": \"#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform vec3\t uBackgroundColor;\\nuniform float \t uBuffer;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nfloat distance = mix(texture2D(uPreviousSampler1, vPreviousTexCoord).r, texture2D(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer) {\\ndiscard;\\n}\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\nfloat uGamma = 0.0;\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer + gamma, uBuffer, distance);\\ngl_FragColor = vec4(mix(color, uBackgroundColor, value), 1.0);\\n}\\n}\\n\",\n        \"unitsdf.vertex.fx\": \"#version 100\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute mediump vec4 aTexCoord;\\nattribute mediump vec4 aPreviousTexCoord;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n\",\n        \"unitsphere.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat sphIntersect(in vec3 ro, in vec3 rd, in vec4 sph)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot(oc, rd);\\nfloat c = dot(oc, oc) - sph.w * sph.w;\\nfloat h = b * b - c;\\nif (h < 0.0) return -1.0;\\nreturn -b - sqrt(h);\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n        \"unitsphere.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute lowp float aColor;\\nattribute lowp float aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump float vRadius;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec4 translation = vec4(mix(aPreviousTranslation, aTranslation, animation), 1.0);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * translation).xyz;\\ntranslation.xyz += aPosition * scale;\\nvViewPosition = (mvMatrix * translation).xyz;\\ngl_Position = uPMatrix * vec4(vViewPosition, 1.0);\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n\",\n        \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nmat3 transpose(in mat3 mat) {\\nvec3 i0 = mat[0];\\nvec3 i1 = mat[1];\\nvec3 i2 = mat[2];\\nreturn mat3\\n(\\nvec3(i0.x, i1.x, i2.x),\\nvec3(i0.y, i1.y, i2.y),\\nvec3(i0.z, i1.z, i2.z)\\n);\\n}\\n\",\n        \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\",\n    };\n    let ShaderBase$1 = class ShaderBase {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        set vertexBuffer(value) {\n            if (this._vertexBuffer != value) {\n                this._vertexBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        get indexBuffer() { return this._indexBuffer; }\n        set indexBuffer(value) {\n            if (this._indexBuffer != value) {\n                this._indexBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        constructor(core, main) {\n            this._core = core;\n            this._main = main;\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n        }\n        _createProgram(vs, fs) {\n            const program = this._gl.createProgram();\n            this._gl.attachShader(program, vs);\n            this._gl.attachShader(program, fs);\n            this._gl.linkProgram(program);\n            if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n                this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n            }\n            return program;\n        }\n        _compileShader(source, type) {\n            const shader = this._gl.createShader(type);\n            this._gl.shaderSource(shader, source);\n            this._gl.compileShader(shader);\n            if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n                this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n            }\n            return shader;\n        }\n        _removeDirective(shaderSource, directive) {\n            const remove = `#define ${directive}`;\n            const index = shaderSource.indexOf(remove);\n            shaderSource = (index == -1) ? shaderSource : shaderSource.substring(0, index) + shaderSource.substring(index + remove.length);\n            return shaderSource;\n        }\n        prepare() {\n            if (this._program != this._main.shaderResources.currentProgram) {\n                if (this._main.shaderResources.currentShader) {\n                    this._main.shaderResources.currentShader.disableProgram();\n                }\n                this.enableProgram(this._program);\n                this.updateBuffers();\n                this.updateTextures();\n            }\n            else {\n                if (this._haveBuffersChanged) {\n                    this.updateBuffers();\n                }\n                if (this._haveTexturesChanged) {\n                    this.updateTextures();\n                }\n            }\n        }\n        apply() { }\n        applyModel() { }\n        applyView() { }\n        enableProgram(program) {\n            this._gl.useProgram(program);\n            this._main.shaderResources.currentProgram = program;\n            this._main.shaderResources.currentShader = this;\n        }\n        updateBuffers() {\n            this._haveBuffersChanged = false;\n        }\n        updateTextures() {\n            this._haveTexturesChanged = false;\n        }\n        disableProgram() {\n            this._main.shaderResources.currentShader = null;\n            this._main.shaderResources.currentProgram = null;\n        }\n        _shaderFromFile(vsName, fsName, callback) {\n            callback(this._includesFromFile(Resources$1.glsl[vsName]), this._includesFromFile(Resources$1.glsl[fsName]));\n        }\n        _shaderFromUrl(vsName, fsName, callback) {\n            this._sourceFromUrl(vsName, (vsSource) => {\n                this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n                    this._sourceFromUrl(fsName, (fsSource) => {\n                        this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n                            callback(vsIncSource, fsIncSource);\n                        });\n                    });\n                });\n            });\n        }\n        _sourceFromUrl(url, callback) {\n            const request = new XMLHttpRequest();\n            request.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n            request.onreadystatechange = () => {\n                if (request.readyState == XMLHttpRequest.DONE && request.status == 200) {\n                    callback(request.responseText);\n                }\n            };\n            request.send();\n        }\n        _includesFromFile(source) {\n            let index = 0;\n            do {\n                index = source.indexOf(\"#include\", index);\n                if (index != -1) {\n                    const start = source.indexOf(\"\\\"\", index);\n                    const end = source.indexOf(\"\\\"\", start + 1);\n                    const name = source.substring(start + 1, end);\n                    const inc = Resources$1.glsl[name];\n                    source = source.substring(0, index) + inc + source.substring(end + 1);\n                }\n            } while (index != -1);\n            return source;\n        }\n        _includesFromUrl(source, index, callback) {\n            index = source.indexOf(\"#include\", index);\n            if (index != -1) {\n                const start = source.indexOf(\"\\\"\", index);\n                const end = source.indexOf(\"\\\"\", start + 1);\n                const name = source.substring(start + 1, end);\n                this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n                    source = source.substring(0, index) + include + source.substring(end + 1);\n                    this._includesFromUrl(source, index, callback);\n                });\n            }\n            else {\n                callback(source);\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Color extends ShaderBase$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"color.vertex.fx\", \"color.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionColorVertex.SIZE_BYTES, PositionColorVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 3, this._gl.UNSIGNED_BYTE, true, PositionColorVertex.SIZE_BYTES, PositionColorVertex.COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Texture$1 = class Texture extends ShaderBase$1 {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1i(this._samplerUniform, 0);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Lasso$3 = class Lasso extends ShaderBase$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n            this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform3fv(this._colorUniform, this.color);\n            this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Model extends ShaderBase$1 {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"model.vertex.fx\", \"model.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n            this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n            this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n            this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n            this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n        }\n        applyView() {\n            this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n            this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let SdfText$1 = class SdfText extends ShaderBase$1 {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.OES_standard_derivatives == null) {\n                        fsSource = this._removeDirective(fsSource, \"Derivatives\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n            this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n            this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n            this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n            this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform3fv(this._colorUniform, this.color);\n            this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n            this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n            this._gl.uniform1f(this._gammaUniform, this.gamma);\n            this._gl.uniform1f(this._bufferUniform, this.buffer);\n            this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n            this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n        }\n        applyModel() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let PickGrid$1 = class PickGrid extends ShaderBase$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.OES_standard_derivatives == null) {\n                        fsSource = this._removeDirective(fsSource, \"Derivatives\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n            this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n            this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n            this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n            this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n            this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n            this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n            this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n            this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n            this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n            this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n            this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n            this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n            this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n            this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n            this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n            this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n            this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n            this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n            this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n            this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n            this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n            this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n            this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n            this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        ApplyFace() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n            this._gl.uniform2fv(this._zeroUniform, this.zero);\n            this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._boundsAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitShader$1 = class UnitShader extends ShaderBase$1 {\n        get paletteTexture() { return this._paletteTexture; }\n        set paletteTexture(value) {\n            if (this._paletteTexture != value) {\n                this._paletteTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get previousPaletteTexture() { return this._previousPaletteTexture; }\n        set previousPaletteTexture(value) {\n            if (this._previousPaletteTexture != value) {\n                this._previousPaletteTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get sdfTexture() { return this._sdfTexture; }\n        set sdfTexture(value) {\n            if (this._sdfTexture != value) {\n                this._sdfTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get previousSdfTexture() { return this._previousSdfTexture; }\n        set previousSdfTexture(value) {\n            if (this._previousSdfTexture != value) {\n                this._previousSdfTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        set instanceBuffer(value) {\n            if (this._instanceBuffer != value) {\n                this._instanceBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        set previousInstanceBuffer(value) {\n            if (this._previousInstanceBuffer != value) {\n                this._previousInstanceBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        initializeData() {\n            this._areBuffersInitialized = false;\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n            this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n            this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n            this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n            this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n            this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n            this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n            this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n            this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n            this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n            this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n            this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n            this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n            this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n            this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n            this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n            this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n            this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n            this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n            this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n            this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n            this._ambientUniform = gl.getUniformLocation(this._program, \"uAmbient\");\n            this._activeColorUniform = gl.getUniformLocation(this._program, \"uActiveColor\");\n            this._selectedColorUniform = gl.getUniformLocation(this._program, \"uSelectedColor\");\n            this._highlightModeUniform = gl.getUniformLocation(this._program, \"uHighlightMode\");\n            const vertices = Cube.POSITIONS;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Cube.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this.indexCount = indices.length;\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._updateCurrentBuffer();\n            this._updatePreviousBuffer();\n        }\n        _updateCurrentBuffer() {\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n            this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 1);\n            this._gl.enableVertexAttribArray(this._idAttribute);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._translationAttribute);\n            this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 1);\n            this._gl.enableVertexAttribArray(this._scaleAttribute);\n            this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 1);\n            this._gl.enableVertexAttribArray(this._selectedAttribute);\n            this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 1);\n            this._gl.enableVertexAttribArray(this._orderAttribute);\n        }\n        _updatePreviousBuffer() {\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            if (this._previousInstanceBuffer != this._instanceBuffer) {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n            }\n            this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n            this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n            this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1f(this._timeUniform, this.time);\n            this._gl.uniform1f(this._durationUniform, this.duration);\n            this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n            this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n            this._gl.uniform1i(this._previousSampler0Uniform, 0);\n            this._gl.uniform1i(this._sampler0Uniform, 1);\n            this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n            this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n            this._gl.uniform1f(this._ambientUniform, this.ambient);\n            this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n            this._gl.uniform3fv(this._activeColorUniform, this.activeColor);\n            this._gl.uniform3fv(this._selectedColorUniform, this.selectedColor);\n            this._gl.uniform1f(this._hoverUniform, this.hover);\n            this._gl.uniform1f(this._activeUniform, this.active);\n            this._gl.uniform1f(this._highlightModeUniform, this.highlightMode == HighlightMode.luminance ? 0.0 : 1.0);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n            this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n            this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n        }\n        updateTextures() {\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 0);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitBlock$1 = class UnitBlock extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.OES_standard_derivatives == null) {\n                        vsSource = this._removeDirective(vsSource, \"Derivatives\");\n                        fsSource = this._removeDirective(fsSource, \"Derivatives\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitSphere$1 = class UnitSphere extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.EXT_frag_depth == null) {\n                        fsSource = this._removeDirective(fsSource, \"FragDepth\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitCylinder$1 = class UnitCylinder extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.EXT_frag_depth == null) {\n                        fsSource = this._removeDirective(fsSource, \"FragDepth\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitHexPrism extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unithexprism.vertex.fx\", \"unithexprism.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.EXT_frag_depth == null) {\n                        fsSource = this._removeDirective(fsSource, \"FragDepth\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitSdf$1 = class UnitSdf extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.OES_standard_derivatives == null) {\n                        vsSource = this._removeDirective(vsSource, \"Derivatives\");\n                        fsSource = this._removeDirective(fsSource, \"Derivatives\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n            this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n            this._sdfBufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n            this._sdfBackgroundColorUniform = gl.getUniformLocation(this._program, \"uBackgroundColor\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 1);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        apply() {\n            super.apply();\n            this._gl.uniform1i(this._previousSampler1Uniform, 2);\n            this._gl.uniform1i(this._sampler1Uniform, 3);\n            this._gl.uniform1f(this._sdfBufferUniform, this.sdfBuffer);\n            this._gl.uniform3fv(this._sdfBackgroundColorUniform, this.sdfBackgroundColor);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n            this._gl.activeTexture(this._gl.TEXTURE3);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 0);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Anaglyph extends ShaderBase$1 {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"anaglyph.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DebugAxesVisual {\n        get isInitialized() { return this._isInitialized && this._main.colorShader.isInitialized; }\n        constructor(core, main, debugAxes) {\n            this._main = main;\n            this._debugAxes = debugAxes;\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._debugAxes.isInitialized) {\n                this._debugAxes.initialize();\n            }\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._debugAxes.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._debugAxes.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) { }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const colorShader = this._main.colorShader;\n                const shaderResources = this._main.shaderResources;\n                colorShader.vertexBuffer = this._vertexBuffer;\n                colorShader.indexBuffer = this._indexBuffer;\n                colorShader.prepare();\n                colorShader.mMatrix = this.mMatrix;\n                colorShader.apply();\n                for (let i = 0; i < this.viewportCount; i++) {\n                    const viewport = i + this.viewportOffset;\n                    shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    colorShader.vMatrix = this.vMatrices[viewport];\n                    colorShader.pMatrix = this.pMatrices[viewport];\n                    colorShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._debugAxes.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let AxesVisualBase$1 = class AxesVisualBase {\n        get isInitialized() { return this._isInitialized; }\n        get axes() { return this._axes; }\n        constructor(core) {\n            this._core = core;\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n        }\n        update(elapsedTime) { }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                this._renderGrid();\n                this._renderText();\n            }\n        }\n        _renderGrid() { }\n        _renderText() { }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Cartesian2dVisual$1 = class Cartesian2dVisual extends AxesVisualBase$1 {\n        get isInitialized() { return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized; }\n        constructor(core, main, cartesian2dAxes) {\n            super(core);\n            this._main = main;\n            this._axes = cartesian2dAxes;\n            this._axes.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            const axes = this._axes;\n            if (!axes.isInitialized) {\n                axes.initialize();\n            }\n            if (axes.gridVertices) {\n                this._createGridBuffers();\n            }\n            if (axes.textVertices) {\n                this._createTextBuffers();\n            }\n            this._isInitialized = true;\n        }\n        _createGridBuffers() {\n            const axes = this._axes;\n            this._gridVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n            this._gridIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n            this._gridBufferSize = axes.gridVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n        }\n        _createTextBuffers() {\n            const axes = this._axes;\n            this._textVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n            this._textIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n            this._textBufferSize = axes.textVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                const axes = this._axes;\n                if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n                    this._createGridBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                    this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n                }\n                if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n                    this._createTextBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                    this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n                }\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        _renderText() {\n            const axes = this._axes;\n            const shader = this._main.sdfTextShader;\n            const shaderResources = this._main.shaderResources;\n            const fontVisual = this._main.fonts[axes.font.name];\n            shader.vertexBuffer = this._textVertexBuffer;\n            shader.indexBuffer = this._textIndexBuffer;\n            shader.texture2D = fontVisual.texture;\n            shader.prepare();\n            shader.buffer = fontVisual.font.edgeValue / 0xff;\n            shader.gamma = axes.gamma;\n            shader.borderWidth = axes.textBorderWidth;\n            shader.color = axes.textColor || this._core.config.axesTextColor;\n            shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n            shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n            shader.pickedIdColor = this.pickedIdColor;\n            shader.apply();\n            let indexCount, indexOffset;\n            for (let axisId = 0; axisId < 2; axisId++) {\n                const orientation = axes.getLabelOrientation(axisId);\n                for (let edge = 0; edge < 2; edge++) {\n                    const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                    if (axes.isEdgeVisible[edgeId]) {\n                        if ((orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId)) || (orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId))) {\n                            indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                            indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                        }\n                        else {\n                            indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                            indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                        }\n                        if (indexCount > 0) {\n                            shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                        indexCount = axes.getTitleIndexCount(axisId);\n                        if (indexCount > 0) {\n                            indexOffset = axes.getTitleIndexOffset(axisId);\n                            shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                    indexCount = axes.getHeadingIndexCount(axisId);\n                    if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                        indexOffset = axes.getHeadingIndexOffset(axisId);\n                        shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        for (let i = 0; i < this.viewportCount; i++) {\n                            const viewport = i + this.viewportOffset;\n                            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                }\n            }\n        }\n        _renderGrid() {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            gridShader.vertexBuffer = this._gridVertexBuffer;\n            gridShader.indexBuffer = this._gridIndexBuffer;\n            gridShader.prepare();\n            gridShader.majorThickness = axes.gridMajorThickness;\n            gridShader.minorThickness = axes.gridMinorThickness;\n            gridShader.zeroThickness = axes.gridZeroThickness;\n            gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n            gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n            gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n            gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n            gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n            gridShader.pickedIdColor = this.pickedIdColor;\n            gridShader.directionToLight = Constants.VECTOR3_UNITZ;\n            gridShader.apply();\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (axes.arePickDivisionsVisible[axisId]) {\n                    const gridTicksScale = axes.getGridTicksScale(axisId);\n                    const width = gridTicksScale[0];\n                    const height = gridTicksScale[1];\n                    gridShader.zero = axes.getGridTicksZero(axisId);\n                    gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n                    for (let edge = 0; edge < 2; edge++) {\n                        const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                        if (axes.isEdgeVisible[edgeId]) {\n                            this._renderGridTicks(axisId, edgeId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.disable(this._gl.CULL_FACE);\n            const size = axes.size;\n            const axisId2 = 0;\n            const axisId3 = 1;\n            const width = size[axisId2];\n            const height = size[axisId3];\n            gridShader.zero = axes.gridFaceZero;\n            gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n            for (let face = 0; face < 2; face++) {\n                const faceId = face;\n                if (axes.getIsForwardFace(faceId)) {\n                    this._renderGridFace(faceId, width, height);\n                }\n            }\n            this._gl.enable(this._gl.CULL_FACE);\n        }\n        _renderGridTicks(axisId, edgeId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, this._axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, this._axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n        }\n        _renderGridFace(faceId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Cartesian3dVisual$1 = class Cartesian3dVisual extends AxesVisualBase$1 {\n        get isInitialized() { return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized; }\n        constructor(core, main, cartesian3dAxes) {\n            super(core);\n            this._main = main;\n            this._axes = cartesian3dAxes;\n            this._axes.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            const axes = this._axes;\n            if (!axes.isInitialized) {\n                axes.initialize();\n            }\n            if (axes.gridVertices) {\n                this._createGridBuffers();\n            }\n            if (axes.textVertices) {\n                this._createTextBuffers();\n            }\n            this._isInitialized = true;\n        }\n        _createGridBuffers() {\n            const axes = this._axes;\n            this._gridVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n            this._gridIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n            this._gridBufferSize = axes.gridVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n        }\n        _createTextBuffers() {\n            const axes = this._axes;\n            this._textVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n            this._textIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n            this._textBufferSize = axes.textVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                const axes = this._axes;\n                if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n                    this._createGridBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                    this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n                }\n                if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n                    this._createTextBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                    this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n                }\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        _renderText() {\n            const axes = this._axes;\n            const shader = this._main.sdfTextShader;\n            const shaderResources = this._main.shaderResources;\n            const fontVisual = this._main.fonts[axes.font.name];\n            shader.vertexBuffer = this._textVertexBuffer;\n            shader.indexBuffer = this._textIndexBuffer;\n            shader.texture2D = fontVisual.texture;\n            shader.prepare();\n            shader.buffer = fontVisual.font.edgeValue / 0xff;\n            shader.gamma = axes.gamma;\n            shader.borderWidth = axes.textBorderWidth;\n            shader.color = axes.textColor || this._core.config.axesTextColor;\n            shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n            shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n            shader.pickedIdColor = this.pickedIdColor;\n            shader.apply();\n            let indexCount, indexOffset;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                const orientation = axes.getLabelOrientation(axisId);\n                for (let edge = 0; edge < 4; edge++) {\n                    const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                    if (axes.getIsOutsideEdge(edgeId)) {\n                        if (axes.isEdgeVisible[edgeId]) {\n                            if ((orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId)) || (orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId))) {\n                                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                            }\n                            else {\n                                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                            }\n                            if (indexCount > 0) {\n                                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                                shader.applyModel();\n                                shader.isPickShader = false;\n                                for (let i = 0; i < this.viewportCount; i++) {\n                                    const viewport = i + this.viewportOffset;\n                                    shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                    shader.vMatrix = this.vMatrices[viewport];\n                                    shader.pMatrix = this.pMatrices[viewport];\n                                    shader.applyView();\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                    shader.isPickShader = true;\n                                    shader.pMatrix = this.pickPMatrix;\n                                    shader.vMatrix = this.pickVMatrix;\n                                    shader.applyView();\n                                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                            }\n                            indexCount = axes.getTitleIndexCount(axisId);\n                            if (indexCount > 0) {\n                                indexOffset = axes.getTitleIndexOffset(axisId);\n                                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                                shader.applyModel();\n                                shader.isPickShader = false;\n                                for (let i = 0; i < this.viewportCount; i++) {\n                                    const viewport = i + this.viewportOffset;\n                                    shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                    shader.vMatrix = this.vMatrices[viewport];\n                                    shader.pMatrix = this.pMatrices[viewport];\n                                    shader.applyView();\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                    shader.isPickShader = true;\n                                    shader.pMatrix = this.pickPMatrix;\n                                    shader.vMatrix = this.pickVMatrix;\n                                    shader.applyView();\n                                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                            }\n                        }\n                        indexCount = axes.getHeadingIndexCount(axisId);\n                        if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                            indexOffset = axes.getHeadingIndexOffset(axisId);\n                            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        _renderGrid() {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            gridShader.vertexBuffer = this._gridVertexBuffer;\n            gridShader.indexBuffer = this._gridIndexBuffer;\n            gridShader.prepare();\n            gridShader.majorThickness = axes.gridMajorThickness;\n            gridShader.minorThickness = axes.gridMinorThickness;\n            gridShader.zeroThickness = axes.gridZeroThickness;\n            gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n            gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n            gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n            gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n            gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n            gridShader.pickedIdColor = this.pickedIdColor;\n            gridShader.directionToLight = Constants.VECTOR3_UNITZ;\n            gridShader.apply();\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (axes.arePickDivisionsVisible[axisId]) {\n                    const gridTicksScale = axes.getGridTicksScale(axisId);\n                    const width = gridTicksScale[0];\n                    const height = gridTicksScale[1];\n                    gridShader.zero = axes.getGridTicksZero(axisId);\n                    gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n                    for (let edge = 0; edge < 4; edge++) {\n                        const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                        if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n                            this._renderGridTicks(axisId, edgeId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.disable(this._gl.CULL_FACE);\n            const size = axes.size;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (axes.areFacesVisible[axisId]) {\n                    const axisId2 = axisId == 0 ? 1 : 0;\n                    const axisId3 = axisId == 2 ? 1 : 2;\n                    const width = size[axisId2];\n                    const height = size[axisId3];\n                    gridShader.zero = axes.getGridFaceZero(axisId);\n                    gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n                    for (let face = 0; face < 2; face++) {\n                        const faceId = Cube.AXIS_FACES[axisId][face];\n                        if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n                            this._renderGridFace(faceId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.enable(this._gl.CULL_FACE);\n        }\n        _renderGridTicks(axisId, edgeId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n        }\n        _renderGridFace(faceId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ControllerVisual {\n        get isInitialized() { return this._isInitialized && this._modelShader.isInitialized && this._colorShader.isInitialized; }\n        get controller() { return this._controller; }\n        constructor(core, main, controller) {\n            this._core = core;\n            this._main = main;\n            this._mMatrix = create$4();\n            this._vec3 = create$3();\n            this._controller = controller;\n            this._modelShader = main.modelShader;\n            this._colorShader = main.colorShader;\n            this.mMatrix = create$4();\n            this.rayMMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._controller.isInitialized) {\n                this._controller.initialize();\n            }\n            this._initialize(gl);\n        }\n        _initialize(gl) {\n            this._gl = gl;\n            this.modelTexture = TextureHelper.fromImage(gl, this._controller.texture, false, gl.LINEAR);\n            this._modelVertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._modelVertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._controller.vertices, gl.STATIC_DRAW);\n            this._modelIndexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._modelIndexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.indices, gl.STATIC_DRAW);\n            this._rayVertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._rayVertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._controller.rayVertices, gl.STATIC_DRAW);\n            this._rayIndexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._rayIndexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.rayIndices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) { }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                this._modelShader.vertexBuffer = this._modelVertexBuffer;\n                this._modelShader.indexBuffer = this._modelIndexBuffer;\n                this._modelShader.texture2D = this.modelTexture;\n                this._modelShader.prepare();\n                multiply$2(this._mMatrix, this._controller.useRayPose ? this.rayMMatrix : this.mMatrix, this._controller.mMatrix);\n                this._modelShader.mMatrix = this._mMatrix;\n                this._modelShader.specularPower = 10;\n                this._modelShader.specularIntensity = 0.01;\n                this._modelShader.apply();\n                this._modelShader.applyModel();\n                for (let i = 0; i < this.viewportCount; i++) {\n                    const viewport = i + this.viewportOffset;\n                    this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    this._modelShader.directionToLight = Constants.VECTOR3_UNITZ;\n                    this._modelShader.halfAngle = Constants.VECTOR3_UNITZ;\n                    this._modelShader.vMatrix = this.vMatrices[viewport];\n                    this._modelShader.pMatrix = this.pMatrices[viewport];\n                    this._modelShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._controller.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this.isRayVisible) {\n                    this._colorShader.vertexBuffer = this._rayVertexBuffer;\n                    this._colorShader.indexBuffer = this._rayIndexBuffer;\n                    this._colorShader.prepare();\n                    multiply$2(this._mMatrix, this.rayMMatrix, this._controller.rayMMatrix);\n                    this._colorShader.mMatrix = this._mMatrix;\n                    this._colorShader.apply();\n                    this._colorShader.applyModel();\n                    for (let i = 0; i < this.viewportCount; i++) {\n                        const viewport = i + this.viewportOffset;\n                        this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                        this._colorShader.vMatrix = this.vMatrices[viewport];\n                        this._colorShader.pMatrix = this.pMatrices[viewport];\n                        this._colorShader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._controller.rayIndexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let ImageVisual$1 = class ImageVisual {\n        get isInitialized() { return this._isInitialized && this._main.textureShader.isInitialized; }\n        get image() { return this._image; }\n        constructor(core, main, image) {\n            this._core = core;\n            this._main = main;\n            this._image = image;\n            this._image.hasChangedCallback = () => { this._hasChanged = true; };\n            this.mMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._image.isInitialized) {\n                this._image.initialize();\n            }\n            this._gl = gl;\n            if (this._image.imageData) {\n                this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n            }\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const textureShader = this._main.textureShader;\n                const shaderResources = this._main.shaderResources;\n                textureShader.vertexBuffer = this._vertexBuffer;\n                textureShader.indexBuffer = this._indexBuffer;\n                textureShader.texture2D = this.texture;\n                textureShader.prepare();\n                textureShader.mMatrix = this.mMatrix;\n                textureShader.isPickShader = false;\n                textureShader.apply();\n                for (let i = 0; i < this.viewportCount; i++) {\n                    const viewport = i + this.viewportOffset;\n                    shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    textureShader.vMatrix = this.vMatrices[viewport];\n                    textureShader.pMatrix = this.pMatrices[viewport];\n                    textureShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this.isPickingEnabled) {\n                    textureShader.isPickShader = true;\n                    textureShader.vMatrix = this.pickVMatrix;\n                    textureShader.pMatrix = this.pickPMatrix;\n                    textureShader.applyView();\n                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let LabelVisualBase$1 = class LabelVisualBase {\n        get isInitialized() { return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized; }\n        constructor(core, main, label) {\n            this._core = core;\n            this._main = main;\n            this._label = label;\n            this._label.hasChangedCallback = () => { this._hasChanged = true; };\n            this._mMatrix = create$4();\n            this.mMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._label.isInitialized) {\n                this._label.initialize();\n            }\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const indexCount = this._label.indexCount;\n                if (indexCount > 0) {\n                    const shader = this._main.sdfTextShader;\n                    const fontVisual = this._main.fonts[this._label.font.name];\n                    shader.vertexBuffer = this._vertexBuffer;\n                    shader.indexBuffer = this._indexBuffer;\n                    shader.texture2D = fontVisual.texture;\n                    shader.prepare();\n                    shader.gamma = this._label.gamma;\n                    shader.buffer = fontVisual.font.edgeValue / 0xff;\n                    shader.borderWidth = this._label.borderWidth;\n                    shader.color = this._label.color || this._core.config.textColor;\n                    shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n                    shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n                    shader.pickedIdColor = this.pickedIdColor;\n                    shader.apply();\n                    multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n                    shader.mMatrix = this._mMatrix;\n                    shader.applyModel();\n                    shader.isPickShader = false;\n                    for (let i = 0; i < this.viewportCount; i++) {\n                        const viewport = i + this.viewportOffset;\n                        this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                        shader.vMatrix = this.vMatrices[viewport];\n                        shader.pMatrix = this.pMatrices[viewport];\n                        shader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n                    }\n                    if (this.isPickingEnabled) {\n                        shader.isPickShader = true;\n                        shader.pMatrix = this.pickPMatrix;\n                        shader.vMatrix = this.pickVMatrix;\n                        shader.applyView();\n                        this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n                        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n                    }\n                }\n            }\n        }\n    };\n    let LabelVisual$1 = class LabelVisual extends LabelVisualBase$1 {\n        get label() { return this._label; }\n        set text(value) { this._label.text = value; }\n        get text() { return this._label.text; }\n        constructor(core, main, label) {\n            super(core, main, label);\n        }\n    };\n    let LabelSetVisual$1 = class LabelSetVisual extends LabelVisualBase$1 {\n        get label() { return this._label; }\n        constructor(core, main, label) {\n            super(core, main, label);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let FontVisual$1 = class FontVisual {\n        get isInitialized() { return this._isInitialized; }\n        get font() { return this._font; }\n        constructor(core, font) {\n            this._core = core;\n            this._font = font;\n            font.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this._isInitialized = true;\n            if (this._font.count > 0) {\n                this._hasChanged = true;\n            }\n        }\n        update() {\n            if (this._hasChanged && this._isInitialized) {\n                this._hasChanged = false;\n                this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n                this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Lasso$2 = class Lasso {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        get indexBuffer() { return this._indexBuffer; }\n        get indexCount() { return this._indexCount; }\n        initializeContext(gl) {\n            const vertices = Quad$2.textured(Constants.MAT4_IDENTITY);\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Quad$2.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this._indexCount = indices.length;\n            this._isInitialized = true;\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    var __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    let Main$1 = class Main extends RendererBase {\n        get shaderResources() { return this._shaderResources; }\n        get colorShader() { return this._colorShader; }\n        get textureShader() { return this._textureShader; }\n        get lassoShader() { return this._lassoShader; }\n        get modelShader() { return this._modelShader; }\n        get sdfTextShader() { return this._sdfTextShader; }\n        get gridShader() { return this._gridShader; }\n        get blockShader() { return this._blockShader; }\n        get sphereShader() { return this._sphereShader; }\n        get cyclinderShader() { return this._cylinderShader; }\n        get hexPrismShader() { return this._hexPrismShader; }\n        get sdfShader() { return this._sdfShader; }\n        get anaglyphShader() { return this._anaglyphShader; }\n        get currentAxes() { return this._isAxes1Current ? this._axes1 : this._axes2; }\n        set currentAxes(value) { if (this._isAxes1Current) {\n            this._axes1 = value;\n        }\n        else {\n            this._axes2 = value;\n        } }\n        get previousAxes() { return this._isAxes1Current ? this._axes2 : this._axes1; }\n        set previousAxes(value) { if (this._isAxes1Current) {\n            this._axes2 = value;\n        }\n        else {\n            this._axes1 = value;\n        } }\n        get config() { return this._config; }\n        constructor(options) {\n            super(options);\n            this._config = new Config$1();\n            this._quad = new Quad$1();\n            this._lasso = new Lasso$2();\n            this._pickedPixels = new Uint8Array(4);\n            this._pickedIdColor = create$2();\n            this._mat3 = create$5();\n            this._directionToCamera = create$3();\n            this._directionToLight = create$3();\n            this._halfAngle = create$3();\n            this._cameraPosition = create$3();\n            this._modelPosition = create$3();\n            this.depthEnabled = true;\n        }\n        get isSupported() {\n            return this._createContext(document.createElement(\"canvas\")) !== null;\n        }\n        get isWebXRSupported() {\n            return true;\n        }\n        initialize(core) {\n            super.initialize(core);\n            this._shaderResources = new Resources$1();\n            this._colorShader = new Color(this._core, this);\n            this._textureShader = new Texture$1(this._core, this);\n            this._lassoShader = new Lasso$3(this._core, this);\n            this._modelShader = new Model(this._core, this);\n            this._sdfTextShader = new SdfText$1(this._core, this);\n            this._gridShader = new PickGrid$1(this._core, this);\n            this._anaglyphShader = new Anaglyph(this._core, this);\n            this._blockShader = new UnitBlock$1(this._core, this);\n            this._sphereShader = new UnitSphere$1(this._core, this);\n            this._cylinderShader = new UnitCylinder$1(this._core, this);\n            this._hexPrismShader = new UnitHexPrism(this._core, this);\n            this._sdfShader = new UnitSdf$1(this._core, this);\n            this._initializeContext(this._createContext(this._canvas));\n            this._canvas.addEventListener(\"webglcontextlost\", (event) => {\n                this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n                this._isInitialized = false;\n                event.preventDefault();\n            }, false);\n            this._canvas.addEventListener(\"webglcontextrestored\", () => {\n                this._initializeContext(this._createContext(this._canvas));\n                this._isInitialized = true;\n                this._core.log.write(LogLevel.info, \"WebGL context restored\");\n            }, false);\n            this._isInitialized = true;\n        }\n        _initializeContext(gl) {\n            this._gl = gl;\n            for (const key in this.fonts) {\n                const fontVisual = this.fonts[key];\n                fontVisual.initializeContext(gl);\n            }\n            this._shaderResources.initializeContext(this._gl);\n            this._colorShader.initializeContext(this._gl);\n            this._textureShader.initializeContext(this._gl);\n            this._lassoShader.initializeContext(this._gl);\n            this._modelShader.initializeContext(this._gl);\n            this._sdfTextShader.initializeContext(this._gl);\n            this._gridShader.initializeContext(this._gl);\n            this._anaglyphShader.initializeContext(this._gl);\n            this._blockShader.initializeContext(this._gl);\n            this._sphereShader.initializeContext(this._gl);\n            this._cylinderShader.initializeContext(this._gl);\n            this._hexPrismShader.initializeContext(this._gl);\n            this._sdfShader.initializeContext(this._gl);\n            this._quad.initializeContext(this._gl);\n            this._lasso.initializeContext(this._gl);\n            this._debugAxesVisual.initializeContext(this._gl);\n            this._framebuffers = [null, null];\n            const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n            const renderBuffer = this._gl.createRenderbuffer();\n            this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, this._core.config.pickWidth, this._core.config.pickHeight);\n            const framebuffer = this._gl.createFramebuffer();\n            this._shaderResources.bindFramebuffer(framebuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n            this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n            this._pickFrameBuffer = framebuffer;\n            this._anaglyphTextures = [null, null];\n            this.anaglyphFramebuffers = [null, null];\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                this.transitionBuffers[i].initializeContext(this._gl);\n            }\n            if (this._axes1) {\n                for (let i = 0; i < this._axes1.length; i++) {\n                    this._axes1[i].initializeContext(this._gl);\n                }\n            }\n            if (this._axes2) {\n                for (let i = 0; i < this._axes2.length; i++) {\n                    this._axes2[i].initializeContext(this._gl);\n                }\n            }\n            for (let i = 0; i < this.labelSets.length; i++) {\n                this.labelSets[i].initializeContext(this._gl);\n            }\n            for (let i = 0; i < this.images.length; i++) {\n                this.images[i].initializeContext(this._gl);\n            }\n            for (let i = 0; i < this.controllers.length; i++) {\n                this.controllers[i].initializeContext(this._gl);\n            }\n        }\n        _resize(width, height) {\n            super._resize(width, height);\n            for (let i = 0; i < 2; i++) {\n                const texture = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n                const renderBuffer = this._gl.createRenderbuffer();\n                this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n                this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, width, height);\n                const framebuffer = this._gl.createFramebuffer();\n                this._shaderResources.bindFramebuffer(framebuffer);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n                this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n                this._anaglyphTextures[i] = texture;\n                this.anaglyphFramebuffers[i] = framebuffer;\n            }\n            this._core.log.write(LogLevel.info, `buffers resized ${width},${height}`);\n        }\n        _createContext(canvas) {\n            const antialias = this._options ? this._options.antialias === undefined ? true : this._options.antialias : true;\n            const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === undefined ? false : this._options.preserveDrawingBuffer : false;\n            return canvas.getContext(\"webgl\", {\n                stencil: true,\n                alpha: true,\n                antialias: antialias,\n                preserveDrawingBuffer: preserveDrawingBuffer,\n            });\n        }\n        initializeWebXR(session) {\n            const promise = new Promise((resolve, reject) => {\n                this._gl.makeXRCompatible().then(() => {\n                    session.updateRenderState({\n                        baseLayer: new XRWebGLLayer(session, this._gl),\n                        depthNear: this._core.config.nearPlane,\n                        depthFar: this._core.config.farPlane\n                    });\n                    session.requestReferenceSpace('local').then((refSpace) => {\n                        this._webXRReferenceSpace = refSpace;\n                        resolve();\n                    });\n                });\n            });\n            return promise;\n        }\n        prepare(xrFrame) {\n            if (xrFrame) {\n                const pose = xrFrame.getViewerPose(this._webXRReferenceSpace);\n                if (pose) {\n                    const glLayer = xrFrame.session.renderState.baseLayer;\n                    for (let i = 0; i < pose.views.length; i++) {\n                        const view = pose.views[i];\n                        this.vMatrices[i] = view.transform.inverse.matrix;\n                        this.inverseVMatrices[i] = view.transform.matrix;\n                        multiply$2(this._mvMatrices[i], this.vMatrices[i], this.mMatrix);\n                        this.mvMatrices[i] = this._mvMatrices[i];\n                        this.pMatrices[i] = view.projectionMatrix;\n                        const viewport = glLayer.getViewport(view);\n                        this._viewports[i].x = viewport.x;\n                        this._viewports[i].y = viewport.y;\n                        this._viewports[i].width = viewport.width;\n                        this._viewports[i].height = viewport.height;\n                        this._framebuffers[i] = glLayer.framebuffer;\n                    }\n                }\n                this._viewportOffset = 0;\n                this._viewportCount = 2;\n            }\n            else {\n                let viewport;\n                switch (this._core.config.stereoMode) {\n                    case StereoMode.none:\n                        viewport = this._viewports[0];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 0;\n                        this._viewportCount = 1;\n                        this._framebuffers[0] = null;\n                        break;\n                    case StereoMode.left:\n                        viewport = this._viewports[0];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 0;\n                        this._viewportCount = 1;\n                        this._framebuffers[0] = null;\n                        break;\n                    case StereoMode.right:\n                        viewport = this._viewports[1];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 1;\n                        this._viewportCount = 1;\n                        this._framebuffers[1] = null;\n                        break;\n                    case StereoMode.anaglyph:\n                        viewport = this._viewports[0];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        viewport = this._viewports[1];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 0;\n                        this._viewportCount = 2;\n                        this._framebuffers[0] = this.anaglyphFramebuffers[0];\n                        this._framebuffers[1] = this.anaglyphFramebuffers[1];\n                        break;\n                    case StereoMode.split:\n                        viewport = this._viewports[0];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width / 2;\n                        viewport.height = this._canvas.height;\n                        viewport = this._viewports[1];\n                        viewport.x = this._canvas.width / 2;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width / 2;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 0;\n                        this._viewportCount = 2;\n                        this._framebuffers[0] = null;\n                        this._framebuffers[1] = null;\n                        break;\n                }\n            }\n        }\n        createTransitionBuffer(ids) {\n            const buffer = new TransitionBuffer$1(this._core, ids);\n            buffer.initializeContext(this._gl);\n            return buffer;\n        }\n        createControllerVisual(controller) {\n            const visual = new ControllerVisual(this._core, this, controller);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createCartesian2dAxesVisual(axes) {\n            const visual = new Cartesian2dVisual$1(this._core, this, axes);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createCartesian3dAxesVisual(axes) {\n            const visual = new Cartesian3dVisual$1(this._core, this, axes);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        _createDebugAxesVisual(debugAxes) {\n            return new DebugAxesVisual(this._core, this, debugAxes);\n        }\n        _createLabelVisual(label) {\n            return new LabelVisual$1(this._core, this, label);\n        }\n        createLabelSetVisual(labelSet) {\n            const visual = new LabelSetVisual$1(this._core, this, labelSet);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createImageVisual(image) {\n            const visual = new ImageVisual$1(this._core, this, image);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createFontVisual(font) {\n            const visual = new FontVisual$1(this._core, font);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        getDataUrl(mimeType) {\n            return this._canvas.toDataURL(mimeType);\n        }\n        render(elapsedTime, xrFrame) {\n            return __awaiter$2(this, void 0, void 0, function* () {\n                if (this.depthEnabled) {\n                    this._gl.enable(this._gl.DEPTH_TEST);\n                }\n                else {\n                    this._gl.disable(this._gl.DEPTH_TEST);\n                }\n                this._gl.enable(this._gl.CULL_FACE);\n                this._gl.disable(this._gl.BLEND);\n                if (this.isPickingEnabled) {\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.clearColor(0, 0, 0, 0);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n                this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], backgroundColor[3]);\n                if (xrFrame) {\n                    const glLayer = xrFrame.session.renderState.baseLayer;\n                    this._shaderResources.bindFramebuffer(glLayer.framebuffer);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                else if (this._core.config.stereoMode == StereoMode.anaglyph) {\n                    for (let i = 0; i < 2; i++) {\n                        this._shaderResources.bindFramebuffer(this.anaglyphFramebuffers[i]);\n                        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                    }\n                    this._shaderResources.bindFramebuffer(null);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                else {\n                    this._shaderResources.bindFramebuffer(null);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                if (this._core.config.isDebugVisible) {\n                    this._debugAxesVisual.framebuffers = this._framebuffers;\n                    this._debugAxesVisual.render(elapsedTime, xrFrame);\n                }\n                const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n                if (axesVisuals) {\n                    for (let i = 0; i < axesVisuals.length; i++) {\n                        const axesVisual = axesVisuals[i];\n                        if (axesVisual.isVisible) {\n                            axesVisual.pickedIdColor = this._pickedIdColor;\n                            axesVisual.pickFramebuffer = this._pickFrameBuffer;\n                            axesVisual.framebuffers = this._framebuffers;\n                            axesVisual.render(elapsedTime, xrFrame);\n                        }\n                    }\n                }\n                for (let i = 0; i < this.transitionBuffers.length; i++) {\n                    const transitionBuffer = this.transitionBuffers[i];\n                    if (transitionBuffer.isVisible) {\n                        this._renderTransitionBuffer(xrFrame, transitionBuffer);\n                    }\n                }\n                if (this.areLabelsVisible) {\n                    for (let i = 0; i < this.labelSets.length; i++) {\n                        const labelSetVisual = this.labelSets[i];\n                        if (labelSetVisual.isVisible) {\n                            labelSetVisual.pickedIdColor = this._pickedIdColor;\n                            labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n                            labelSetVisual.framebuffers = this._framebuffers;\n                            labelSetVisual.render(elapsedTime, xrFrame);\n                        }\n                    }\n                }\n                if (this.areImagesVisible) {\n                    for (let i = 0; i < this.images.length; i++) {\n                        const imageVisual = this.images[i];\n                        if (imageVisual.isVisible) {\n                            imageVisual.framebuffers = this._framebuffers;\n                            imageVisual.pickFramebuffer = this._pickFrameBuffer;\n                            imageVisual.isPickingEnabled = this.isPickingEnabled;\n                            imageVisual.render(elapsedTime, xrFrame);\n                        }\n                    }\n                }\n                for (let i = 0; i < this.controllers.length; i++) {\n                    const controllerVisual = this.controllers[i];\n                    if (controllerVisual.isVisible) {\n                        controllerVisual.isRayVisible = this.isPickingEnabled;\n                        controllerVisual.framebuffers = this._framebuffers;\n                        controllerVisual.render(elapsedTime, xrFrame);\n                    }\n                }\n                if (this.isPickingEnabled) {\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n                    this._pickedType = PickHelper.decodeType(this._pickedPixels);\n                    set$2(this._pickedIdColor, this._pickedPixels[0] / 0xff, this._pickedPixels[1] / 0xff, this._pickedPixels[2] / 0xff, this._pickedPixels[3] / 0xff);\n                    this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n                    if (this._isCapturingPickImage && this.capturePickImageCallback) {\n                        this._isCapturingPickImage = false;\n                        const data = new Uint8ClampedArray(this._core.config.pickWidth * this._core.config.pickHeight * 4);\n                        this._gl.readPixels(0, 0, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, data);\n                        for (let i = 0; i < data.length / 4; i++) {\n                            if (data[i * 4 + 3] == PickType.data) {\n                                data[i * 4 + 3] = 255;\n                            }\n                            else {\n                                data[i * 4] = 0;\n                                data[i * 4 + 1] = 0;\n                                data[i * 4 + 2] = 0;\n                                data[i * 4 + 3] = 0;\n                            }\n                        }\n                        const length = this._core.config.pickWidth * this._core.config.pickHeight * 4;\n                        const row = this._core.config.pickWidth * 4;\n                        const end = (this._core.config.pickHeight - 1) * row;\n                        const flipped = new Uint8ClampedArray(length);\n                        for (let i = 0; i < length; i += row) {\n                            flipped.set(data.subarray(i, i + row), end - i);\n                        }\n                        this.capturePickImageCallback(flipped, this._core.config.pickWidth, this._core.config.pickHeight);\n                    }\n                }\n                else {\n                    set$2(this._pickedIdColor, 0, 0, 0, 0);\n                    this._pickedId = 0;\n                }\n                if (this.isLassoPicking && this._lassoShader.isInitialized) {\n                    this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n                    this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n                    const lassoWidth = this.lassoX1 - this.lassoX0;\n                    const lassoHeight = this.lassoY1 - this.lassoY0;\n                    this._lassoShader.prepare();\n                    this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n                    this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n                    this._lassoShader.apply();\n                    const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n                    for (let i = 0; i < this._viewportCount; i++) {\n                        const viewportIndex = i + this._viewportOffset;\n                        this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n                        const viewport = this._viewports[viewportIndex];\n                        this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n                        this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n                        this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n                        this._lassoMMatrix[10] = 1;\n                        this._lassoMMatrix[12] = ((this.lassoX0 + lassoWidth / 2) / viewport.width) * 2 - 1;\n                        this._lassoMMatrix[13] = 1 - ((this.lassoY0 + lassoHeight / 2) / viewport.height) * 2;\n                        this._lassoShader.mMatrix = this._lassoMMatrix;\n                        set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n                        this._lassoShader.thickness = this._lassoThickness;\n                        this._lassoShader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n                if (this._core.config.stereoMode == StereoMode.anaglyph && this._anaglyphShader.isInitialized && this._quad.isInitialized) {\n                    this._shaderResources.bindFramebuffer(null);\n                    this._gl.viewport(this._viewports[0].x, this._viewports[0].y, this._viewports[0].width, this._viewports[0].height);\n                    this._anaglyphShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._anaglyphShader.indexBuffer = this._quad.indexBuffer;\n                    this._anaglyphShader.texture2D1 = this._anaglyphTextures[0];\n                    this._anaglyphShader.texture2D2 = this._anaglyphTextures[1];\n                    this._anaglyphShader.prepare();\n                    this._anaglyphShader.viewport = this._viewports[0];\n                    this._anaglyphShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            });\n        }\n        _renderTransitionBuffer(xrFrame, transitionBuffer) {\n            const currentBuffer = transitionBuffer.currentBuffer;\n            const previousBuffer = transitionBuffer.previousBuffer;\n            const currentPalette = transitionBuffer.currentPalette;\n            const previousPalette = transitionBuffer.previousPalette;\n            const currentAtlas = transitionBuffer.currentAtlas;\n            const previousAtlas = transitionBuffer.previousAtlas;\n            const unitType = transitionBuffer.unitType === undefined ? currentBuffer.unitType : transitionBuffer.unitType;\n            const id = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n            const hoverId = id > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id) : -1;\n            const activeId = transitionBuffer.activeId;\n            if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf || unitType == UnitType.ringSdf)) {\n                this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._blockShader.prepare();\n                this._blockShader.mMatrix = this.mMatrix;\n                this._blockShader.time = this.transitionTime;\n                this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._blockShader.rangeMin = 0;\n                this._blockShader.rangeMax = transitionBuffer.length - 1;\n                this._blockShader.hover = hoverId;\n                this._blockShader.active = activeId;\n                this._blockShader.selectedColor = this._core.config.selectionColor;\n                this._blockShader.hoverColor = this._core.config.hoverColor;\n                this._blockShader.activeColor = this._core.config.activeColor;\n                this._blockShader.highlightMode = this._core.config.highlightMode;\n                this._blockShader.specularPower = this._config.specularPower;\n                this._blockShader.specularIntensity = this._config.specularIntensity;\n                this._blockShader.ambient = this._config.ambient;\n                this._blockShader.apply();\n                this._blockShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$3(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$3(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$3(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._blockShader.directionToLight = this._directionToLight;\n                        this._blockShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._blockShader.directionToLight = this._config.directionToLight;\n                        this._blockShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._blockShader.vMatrix = vMatrix;\n                    this._blockShader.pMatrix = this.pMatrices[viewport];\n                    this._blockShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._blockShader.isPickShader = true;\n                    this._blockShader.pMatrix = this.pickPMatrix;\n                    this._blockShader.vMatrix = this.pickVMatrix;\n                    this._blockShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf || unitType == UnitType.disk)) {\n                this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._sphereShader.prepare();\n                this._sphereShader.mMatrix = this.mMatrix;\n                this._sphereShader.time = this.transitionTime;\n                this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._sphereShader.rangeMin = 0;\n                this._sphereShader.rangeMax = transitionBuffer.length - 1;\n                this._sphereShader.hover = hoverId;\n                this._sphereShader.active = activeId;\n                this._sphereShader.selectedColor = this._core.config.selectionColor;\n                this._sphereShader.hoverColor = this._core.config.hoverColor;\n                this._sphereShader.activeColor = this._core.config.activeColor;\n                this._sphereShader.highlightMode = this._core.config.highlightMode;\n                this._sphereShader.specularPower = this._config.specularPower;\n                this._sphereShader.specularIntensity = this._config.specularIntensity;\n                this._sphereShader.ambient = this._config.ambient;\n                this._sphereShader.apply();\n                this._sphereShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$3(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$3(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$3(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._sphereShader.directionToLight = this._directionToLight;\n                        this._sphereShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._sphereShader.directionToLight = this._config.directionToLight;\n                        this._sphereShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._sphereShader.vMatrix = vMatrix;\n                    this._sphereShader.pMatrix = this.pMatrices[viewport];\n                    this._sphereShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._sphereShader.isPickShader = true;\n                    this._sphereShader.pMatrix = this.pickPMatrix;\n                    this._sphereShader.vMatrix = this.pickVMatrix;\n                    this._sphereShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n                this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._cylinderShader.prepare();\n                this._cylinderShader.mMatrix = this.mMatrix;\n                this._cylinderShader.time = this.transitionTime;\n                this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._cylinderShader.rangeMin = 0;\n                this._cylinderShader.rangeMax = transitionBuffer.length - 1;\n                this._cylinderShader.hover = hoverId;\n                this._cylinderShader.active = activeId;\n                this._cylinderShader.selectedColor = this._core.config.selectionColor;\n                this._cylinderShader.hoverColor = this._core.config.hoverColor;\n                this._cylinderShader.activeColor = this._core.config.activeColor;\n                this._cylinderShader.highlightMode = this._core.config.highlightMode;\n                this._cylinderShader.specularPower = this._config.specularPower;\n                this._cylinderShader.specularIntensity = this._config.specularIntensity;\n                this._cylinderShader.ambient = this._config.ambient;\n                this._cylinderShader.apply();\n                this._cylinderShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$3(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$3(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$3(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._cylinderShader.directionToLight = this._directionToLight;\n                        this._cylinderShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._cylinderShader.directionToLight = this._config.directionToLight;\n                        this._cylinderShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._cylinderShader.vMatrix = vMatrix;\n                    this._cylinderShader.pMatrix = this.pMatrices[viewport];\n                    this._cylinderShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._cylinderShader.isPickShader = true;\n                    this._cylinderShader.pMatrix = this.pickPMatrix;\n                    this._cylinderShader.vMatrix = this.pickVMatrix;\n                    this._cylinderShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._hexPrismShader.isInitialized && (unitType == UnitType.hexPrism || unitType == UnitType.hexPrismSdf)) {\n                this._hexPrismShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._hexPrismShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._hexPrismShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._hexPrismShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._hexPrismShader.prepare();\n                this._hexPrismShader.mMatrix = this.mMatrix;\n                this._hexPrismShader.time = this.transitionTime;\n                this._hexPrismShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._hexPrismShader.rangeMin = 0;\n                this._hexPrismShader.rangeMax = transitionBuffer.length - 1;\n                this._hexPrismShader.hover = hoverId;\n                this._hexPrismShader.active = activeId;\n                this._hexPrismShader.selectedColor = this._core.config.selectionColor;\n                this._hexPrismShader.hoverColor = this._core.config.hoverColor;\n                this._hexPrismShader.activeColor = this._core.config.activeColor;\n                this._hexPrismShader.highlightMode = this._core.config.highlightMode;\n                this._hexPrismShader.specularPower = this._config.specularPower;\n                this._hexPrismShader.specularIntensity = this._config.specularIntensity;\n                this._hexPrismShader.ambient = this._config.ambient;\n                this._hexPrismShader.apply();\n                this._hexPrismShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$3(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$3(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$3(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._hexPrismShader.directionToLight = this._directionToLight;\n                        this._hexPrismShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._hexPrismShader.directionToLight = this._config.directionToLight;\n                        this._hexPrismShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._hexPrismShader.vMatrix = vMatrix;\n                    this._hexPrismShader.pMatrix = this.pMatrices[viewport];\n                    this._hexPrismShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._hexPrismShader.isPickShader = true;\n                    this._hexPrismShader.pMatrix = this.pickPMatrix;\n                    this._hexPrismShader.vMatrix = this.pickVMatrix;\n                    this._hexPrismShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n                this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n                this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n                this._sdfShader.prepare();\n                this._sdfShader.mMatrix = this.mMatrix;\n                this._sdfShader.time = this.transitionTime;\n                this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._sdfShader.rangeMin = 0;\n                this._sdfShader.rangeMax = transitionBuffer.length - 1;\n                this._sdfShader.hover = hoverId;\n                this._sdfShader.active = activeId;\n                this._sdfShader.selectedColor = this._core.config.selectionColor;\n                this._sdfShader.hoverColor = this._core.config.hoverColor;\n                this._sdfShader.activeColor = this._core.config.activeColor;\n                this._sdfShader.highlightMode = this._core.config.highlightMode;\n                this._sdfShader.sdfBuffer = (this.sdfBuffer || this._core.config.sdfBuffer) / 0xff;\n                this._sdfShader.sdfBackgroundColor = this.sdfBackgroundColor || fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n                this._sdfShader.specularPower = this._config.specularPower;\n                this._sdfShader.specularIntensity = this._config.specularIntensity;\n                this._sdfShader.ambient = this._config.ambient;\n                this._sdfShader.apply();\n                this._sdfShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$3(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$3(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$3(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._sdfShader.directionToLight = this._directionToLight;\n                        this._sdfShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._sdfShader.directionToLight = this._config.directionToLight;\n                        this._sdfShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._sdfShader.vMatrix = vMatrix;\n                    this._sdfShader.pMatrix = this.pMatrices[viewport];\n                    this._sdfShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._sdfShader.isPickShader = true;\n                    this._sdfShader.pMatrix = this.pickPMatrix;\n                    this._sdfShader.vMatrix = this.pickVMatrix;\n                    this._sdfShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Quad {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        get indexBuffer() { return this._indexBuffer; }\n        get indexCount() { return this._indexCount; }\n        initializeContext(gl) {\n            const _vec3 = fromValues$3(2, 2, 2);\n            const _mat4 = create$4();\n            fromScaling(_mat4, _vec3);\n            const vertices = Quad$2.positions(_mat4);\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Quad$2.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this._indexCount = indices.length;\n            this._isInitialized = true;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Atlas extends AtlasBase {\n        get texture() { return this._texture; }\n        get defaultTexture() { return this._defaultTexture; }\n        initializeContext(core, gl) {\n            this._gl = gl;\n            this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([0xff, 0xff, 0xff, 0xff]));\n            this._updateTexture();\n        }\n        update() {\n            super.update();\n            if (this._changed) {\n                this._changed = false;\n                this._updateTexture();\n            }\n        }\n        _updateTexture() {\n            if (this._imageData) {\n                this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n            }\n            else {\n                this._texture = null;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Palette extends PaletteBase {\n        get texture() { return this._texture; }\n        get defaultTexture() { return this._defaultTexture; }\n        initializeContext(core, gl) {\n            this._gl = gl;\n            this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n            this._updateTexture();\n        }\n        update() {\n            super.update();\n            if (this._changed) {\n                this._changed = false;\n                this._updateTexture();\n            }\n        }\n        _updateTexture() {\n            if (this._colors) {\n                const colors = new Uint8Array(this._colors);\n                for (let i = 0; i < colors.length; i++) {\n                    colors[i] = Math.pow(colors[i] / 0xff, 2.2) * 0xff;\n                }\n                this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors);\n            }\n            else {\n                this._texture = null;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Buffer extends BufferBase {\n        get vertexBuffer() { return this._vertexBuffer; }\n        constructor(core, ids) {\n            super(core, ids);\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update() {\n            if (this._isInitialized) {\n                const start = window.performance.now();\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n                this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n            }\n        }\n    }\n    class TransitionBuffer extends TransitionBufferBase {\n        constructor(core, ids) {\n            super(core, ids, Buffer, Palette, Atlas);\n        }\n        initializeContext(gl) {\n            this._buffer1.initializeContext(gl);\n            this._buffer2.initializeContext(gl);\n            this._palette1.initializeContext(this._core, gl);\n            this._palette2.initializeContext(this._core, gl);\n            this._atlas1.initializeContext(this._core, gl);\n            this._atlas2.initializeContext(this._core, gl);\n            this._isInitialized = true;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Config extends RendererConfig {\n        get keyLightAltitude() { return this._keyLightAltitude; }\n        set keyLightAltitude(value) {\n            this._keyLightAltitude = value;\n            this._updateLights();\n        }\n        get keyLightAzimuth() { return this._keyLightAzimuth; }\n        set keyLightAzimuth(value) {\n            this._keyLightAzimuth = value;\n            this._updateLights();\n        }\n        get keyLightDistance() { return this._keyLightDistance; }\n        set keyLightDistance(value) {\n            this._keyLightDistance = value;\n            this._updateLights();\n        }\n        get fillLight1Altitude() { return this._fillLight1Altitude; }\n        set fillLight1Altitude(value) {\n            this._fillLight1Altitude = value;\n            this._updateLights();\n        }\n        get fillLight1Azimuth() { return this._fillLight1Azimuth; }\n        set fillLight1Azimuth(value) {\n            this._fillLight1Azimuth = value;\n            this._updateLights();\n        }\n        get fillLight2Altitude() { return this._fillLight2Altitude; }\n        set fillLight2Altitude(value) {\n            this._fillLight2Altitude = value;\n            this._updateLights();\n        }\n        get fillLight2Azimuth() { return this._fillLight2Azimuth; }\n        set fillLight2Azimuth(value) {\n            this._fillLight2Azimuth = value;\n            this._updateLights();\n        }\n        constructor() {\n            super();\n            this._rotation = create$1();\n            this.keyLightPosition = create$3();\n            this.fillLight1Position = create$3();\n            this.fillLight2Position = create$3();\n            this.reset();\n        }\n        _updateLights() {\n            this._updateLight(this._keyLightAltitude, this._keyLightAzimuth, this._keyLightDistance, this.keyLightPosition);\n            this._updateLight(this._fillLight1Altitude, this._fillLight1Azimuth, 1, this.fillLight1Position);\n            this._updateLight(this._fillLight2Altitude, this._fillLight2Azimuth, 1, this.fillLight2Position);\n        }\n        _updateLight(altitude, azimuth, distance, position) {\n            rotateY(this._rotation, Constants.QUAT_IDENTITY, AngleHelper.degreesToRadians(azimuth));\n            rotateX(this._rotation, this._rotation, AngleHelper.degreesToRadians(-altitude));\n            transformQuat(position, Constants.VECTOR3_UNITZ, this._rotation);\n            scale(position, position, distance);\n        }\n        reset() {\n            this.isSsaoEnabled = true;\n            this.ssaoWidth = 1024;\n            this.ssaoHeight = 1024;\n            this.ssaoBlurEnabled = true;\n            this.ssaoKernelSize = 8;\n            this.ssaoNoiseSize = 4;\n            this.ssaoRadius = 0.02;\n            this.ssaoPower = 1;\n            this.isShadowEnabled = true;\n            this.shadowWidth = 1024;\n            this.shadowHeight = 1024;\n            this.isDofEnabled = false;\n            this.dofAutoFocus = true;\n            this.dofFocusDistance = 0.5;\n            this.dofFocusRange = 0.5;\n            this.dofMaxBackgroundBlur = 0.75;\n            this.isBloomEnabled = false;\n            this.bloomIntensity = 2;\n            this.specularIntensity = 0.15;\n            this.specularPower = 150;\n            this.ambientIntensity = 0.1;\n            this.materialIntensity = 0.5;\n            this.keyLightIntensity = 1.5;\n            this.fillLight1Intensity = 0.25;\n            this.fillLight2Intensity = 0.25;\n            this._keyLightAltitude = 30;\n            this._keyLightAzimuth = -45;\n            this._keyLightDistance = 1;\n            this._fillLight1Altitude = 30;\n            this._fillLight1Azimuth = 45;\n            this._fillLight2Altitude = 30;\n            this._fillLight2Azimuth = -135;\n            this._updateLights();\n            this.isFxaaEnabled = false;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Resources {\n        bindFramebuffer(framebuffer) {\n            if (this.framebuffer != framebuffer) {\n                this.framebuffer = framebuffer;\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n            }\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this.framebuffer = this._gl.createFramebuffer();\n            this.OES_texture_float = gl.getExtension(\"OES_texture_float\");\n            this.OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n            this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n        }\n    }\n    Resources.glsl = {\n        \"background.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\ngl_FragDepth = 0.99999;\\nmyPosition = vec4(0.0, 0.0, -FAR_PLANE, 0.0);\\nmyColor = vec4(uColor, 1.0);\\nmyNormal = vec4(0.0, 0.0, 1.0, 0.0);\\n}\\n\",\n        \"box.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nfloat result = 0.0;\\nfor (int x = -2; x < 2; x++)\\n{\\nfor (int y = -2; y < 2; y++)\\n{\\nvec2 offset = vec2(float(x) + 0.5, float(y) + 0.5) * texelSize;\\nresult += texture(uSampler, texCoords + offset).r;\\n}\\n}\\nresult /= 16.0;\\nmyOutputColor = vec4(vec3(result), 1.0);\\n}\\n\",\n        \"bright.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec4 color = texture(uSampler, texCoords);\\nmyOutputColor = vec4(color.rgb * color.a, 1.0);\\n}\\n\",\n        \"combine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform float uIntensity;\\nout vec4 myOutputColor;\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 bloom =\\ntexture(uSampler2, texCoords).rgb +\\ntexture(uSampler3, texCoords).rgb +\\ntexture(uSampler4, texCoords).rgb +\\ntexture(uSampler5, texCoords).rgb;\\nbloom *= uIntensity;\\nvec3 color = texture(uSampler1, texCoords).rgb;\\ncolor += bloom;\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n        \"deferred.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform mat4 uInverseVMatrix;\\nuniform mat4 uShadowVMatrix;\\nuniform mat4 uShadowPMatrix;\\nuniform bool uShadow;\\nuniform bool uSsao;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform vec3 uKeyLightHalfAngle;\\nuniform vec3 uDirectionToKeyLight;\\nuniform vec3 uDirectionToFillLight1;\\nuniform vec3 uDirectionToFillLight2;\\nuniform vec2 uShadowMapSize;\\nuniform float uKeyLightIntensity;\\nuniform float uFillLight1Intensity;\\nuniform float uFillLight2Intensity;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbientIntensity;\\nuniform float uMaterialIntensity;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec4 position = texture(uSampler1, texCoords);\\nvec4 color = texture(uSampler2, texCoords);\\nvec4 normal = texture(uSampler3, texCoords);\\nfloat shadow;\\nif (uShadow)\\n{\\nvec4 positionWorld = uInverseVMatrix * vec4(position.xyz, 1.0);\\nvec4 positionShadowView = uShadowVMatrix * positionWorld;\\nvec4 positionShadowViewProjection = uShadowPMatrix * positionShadowView;\\nvec3 projCoords = positionShadowViewProjection.xyz / positionShadowViewProjection.w;\\nprojCoords = projCoords * 0.5 + 0.5;\\nfloat minProjCoords = min(projCoords.x, projCoords.y);\\nfloat maxProjCoords = max(projCoords.x, projCoords.y);\\nif (minProjCoords < 0.0 || maxProjCoords > 1.0)\\n{\\nshadow = 1.0;\\n}\\nelse\\n{\\nfloat currentDepth = projCoords.z;\\nfloat bias = 0.0;\\nvec2 texelSize = 1.0 / uShadowMapSize;\\nfor(int x = -1; x <= 1; ++x)\\n{\\nfor(int y = -1; y <= 1; ++y)\\n{\\nfloat pcfDepth = texture(uSampler5, projCoords.xy + vec2(x, y) * texelSize).r;\\nshadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;\\n}\\n}\\nshadow /= 9.0;\\nshadow = clamp(1.0 - shadow, 0.0, 1.0);\\n}\\n}\\nelse\\n{\\nshadow = 1.0;\\n}\\nfloat ssao = uSsao ? texture(uSampler4, texCoords).r : 1.0;\\nfloat diffuseIntensity = clamp(dot(normal.rgb, uDirectionToKeyLight), 0.0, 1.0) * uKeyLightIntensity * shadow;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight1), 0.0, 1.0) * uFillLight1Intensity * ssao;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight2), 0.0, 1.0) * uFillLight2Intensity * ssao;\\nvec3 diffuse = color.rgb * diffuseIntensity * uMaterialIntensity;\\nvec3 ambient = uAmbientIntensity * color.rgb * ssao;\\nvec3 emissive = color.w * color.rgb;\\nfloat specular = normal.w * clamp(pow(clamp(dot(normal.rgb, uKeyLightHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity * uKeyLightIntensity * shadow, 0.0, 1.0);\\nvec3 result = min(ambient + diffuse + specular + emissive, 1.0);\\nresult = pow(result, GAMMA);\\nmyOutputColor = vec4(result, position.w);\\n}\\n\",\n        \"dofblur.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uNearFocusDepth;\\nuniform float uFarFocusDepth;\\nuniform float uMaxBackgroundBlur;\\nout vec4 myOutputColor;\\nfloat circleOfConfusion(in float depth )\\n{\\nfloat f;\\nif (depth < uFocusDepth)\\n{\\nf = (depth - uFocusDepth) / (uFocusDepth - uNearFocusDepth);\\nf = clamp(f, -1.0, 0.0);\\n}\\nelse\\n{\\nf = (depth - uFocusDepth) / (uFarFocusDepth - uFocusDepth);\\nf = clamp(f, 0.0, uMaxBackgroundBlur);\\n}\\nreturn f * 0.5 + 0.5;\\n}\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nvec4 color = texture(uSampler1, texCoords);\\nfloat depth = -texture(uSampler2, texCoords).z;\\nfloat coc = circleOfConfusion(depth);\\nmyOutputColor = vec4(coc);\\n}\\n\",\n        \"dofcombine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uAperture;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nout vec4 myOutputColor;\\nconst float MAX_CIRCLE_OF_CONFUSION = 3.0;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec2 texelSizeLow = texelSize * 4.0;\\nconst int NUM_TAPS = 13;\\nvec2 samples[NUM_TAPS];\\nsamples[0] = vec2(-0.326212,-0.405810);\\nsamples[1] = vec2(-0.840144,-0.073580);\\nsamples[2] = vec2(-0.695914, 0.457137);\\nsamples[3] = vec2(-0.203345, 0.620716);\\nsamples[4] = vec2( 0.962340,-0.194983);\\nsamples[5] = vec2( 0.473434,-0.480026);\\nsamples[6] = vec2( 0.519456, 0.767022);\\nsamples[7] = vec2( 0.185461,-0.893124);\\nsamples[8] = vec2( 0.507431, 0.064425);\\nsamples[9] = vec2( 0.896420, 0.412458);\\nsamples[10] = vec2(-0.321940,-0.932615);\\nsamples[11] = vec2(-0.791559,-0.597710);\\nsamples[12] = vec2( 0.000000, 0.000000);\\nconst float maxCoC = 5.0;\\nconst float radiusScale = 0.5;\\nvec4 cOut = texture(uSampler1, texCoords);\\nfloat coc = texture(uSampler2, texCoords).r;\\nfloat centerDepth = coc;\\nfloat discRadius = abs(coc * 2.0 - 1.0) * maxCoC;\\nfloat discRadiusLow = discRadius * radiusScale;\\ncOut = vec4(0.0);\\nfloat acc = 0.0;\\nfor (int t = 0; t < NUM_TAPS; t++)\\n{\\nvec2 coordLow = texCoords + (texelSizeLow * samples[t] * discRadiusLow);\\nvec2 coordHigh = texCoords + (texelSize * samples[t] * discRadius);\\nvec4 tapLow = texture(uSampler1, coordLow);\\nvec4 tapHigh = texture(uSampler1, coordHigh);\\nfloat cocLow = texture(uSampler2, coordLow).r;\\nfloat cocHigh = texture(uSampler2, coordHigh).r;\\nfloat tapBlur = abs(cocHigh * 2.0 - 1.0);\\nvec4 tap = mix(tapHigh, tapLow, tapBlur);\\nfloat cocBlur = mix(cocHigh, cocLow, tapBlur);\\ncocBlur = (cocBlur >= centerDepth) ? 1.0 : abs(cocBlur * 2.0 - 1.0);\\ncOut += tap * cocBlur;\\nacc += cocBlur;\\n}\\nvec4 result = cOut / acc;\\nmyOutputColor = result;\\n}\\n\",\n        \"downsample.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nmyOutputColor = texture(uSampler, texCoords);\\n}\\n\",\n        \"fxaa.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nconst float FXAA_SPAN_MAX = 8.0;\\nconst float FXAA_REDUCE_MUL = 1.0 / 8.0;\\nconst float FXAA_REDUCE_MIN = 1.0 / 128.0;\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec3 color = texture(uSampler, texCoords).rgb;\\nvec3 colorNW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorNE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorSW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y + texelSize.y)).rgb;\\nvec3 colorSE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y + texelSize.y)).rgb;\\nfloat luminance = dot(color, LUMINANCE);\\nfloat luminanceNW = dot(colorNW, LUMINANCE);\\nfloat luminanceNE = dot(colorNE, LUMINANCE);\\nfloat luminanceSW = dot(colorSW, LUMINANCE);\\nfloat luminanceSE = dot(colorSE, LUMINANCE);\\nfloat luminanceMin = min(luminance, min(min(luminanceNW, luminanceNE), min(luminanceSW, luminanceSE)));\\nfloat luminanceMax = max(luminance, max(max(luminanceNW, luminanceNE), max(luminanceSW, luminanceSE)));\\nvec2 dir = vec2(luminanceSW + luminanceSE - luminanceNW - luminanceNE, luminanceNW + luminanceSW - luminanceNE - luminanceSE);\\nfloat dirReduce = max((luminanceNW + luminanceNE + luminanceSW + luminanceSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\\nfloat rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\\ndir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texelSize;\\nvec3 colorA = 0.5 * (\\ntexture(uSampler, texCoords.xy + dir * (1.0/3.0 - 0.5)).rgb +\\ntexture(uSampler, texCoords.xy + dir * (2.0/3.0 - 0.5)).rgb);\\nvec3 colorB = colorA * 0.5 + 0.25 * (\\ntexture(uSampler, texCoords.xy - dir * 0.5).rgb +\\ntexture(uSampler, texCoords.xy + dir * 0.5).rgb);\\nluminance = dot(colorB, LUMINANCE);\\nif (luminance < luminanceMin || luminance > luminanceMax)\\n{\\nmyOutputColor = vec4(colorA, 1.0);\\n}\\nelse\\n{\\nmyOutputColor = vec4(colorB, 1.0);\\n}\\n}\\n\",\n        \"gaussian.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nuniform bool uHorizontal;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec2 texelSize = vec2(1.0) / uResolution;\\nconst int NUM_WEIGHTS = 3;\\nfloat weights[NUM_WEIGHTS];\\nweights[0] = 0.2270270270;\\nweights[1] = 0.3162162162;\\nweights[2] = 0.0702702703;\\nfloat offsets[NUM_WEIGHTS];\\noffsets[0] = 0.0;\\noffsets[1] = 1.3846153846;\\noffsets[2] = 3.2307692308;\\nvec3 color = texture(uSampler, texCoords).rgb * weights[0];\\nif (uHorizontal)\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\n}\\n}\\nelse\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\n}\\n}\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n        \"lasso.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nin mediump vec2 vTexCoord;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\nmyOutputColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n\",\n        \"lasso.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nout mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n        \"pickgrid.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nin lowp vec4 vColor;\\nin mediump vec2 vTexCoord;\\nin mediump vec4 vBounds;\\nin mediump vec3 vNormal;\\nin vec3 vViewPosition;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void) {\\nif (uPick)\\n{\\nmyPosition = vColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec2 buffer = fwidth(vTexCoord);\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\nmyColor.xyz = color.xyz;\\n}\\n}\\n\",\n        \"pickgrid.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin lowp vec4 aIdColor;\\nin mediump vec2 aTexCoord;\\nin mediump vec3 aNormal;\\nin mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nout lowp vec4 vColor;\\nout mediump vec2 vTexCoord;\\nout mediump vec4 vBounds;\\nout mediump vec3 vNormal;\\nout vec3 vViewPosition;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n        \"sdftext.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nin lowp vec4 vIdColor;\\nin lowp float vHover;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick) {\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nfloat distance = texture(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth)\\n{\\ndiscard;\\n}\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, mix(uColor, uHoverColor, vHover), value);\\nmyPosition.xyz = vViewPosition;\\nmyNormal.xyz = vNormal;\\nmyColor.w = 1.0;\\nmyPosition.w = 0.0;\\nmyNormal.w = 0.0;\\n}\\n}\\n\",\n        \"sdftext.vertex.fx\": \"#version 300 es\\nin lowp vec4 aIdColor;\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nout vec3 vViewPosition;\\nout vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nout lowp vec4 vIdColor;\\nout lowp float vHover;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(0.0, 0.0, 1.0, 0.0));\\nvec4 viewPosition = mvMatrix* vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n        \"simple.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n        \"ssao.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nconst int SSAO_KERNEL_SIZE = 8;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform mat4 uPMatrix;\\nuniform vec4 uViewport;\\nuniform float uSsaoNoiseSize;\\nuniform float uSsaoRadius;\\nuniform float uSsaoPower;\\nuniform vec3 uSsaoKernel[SSAO_KERNEL_SIZE];\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 position = texture(uSampler1, texCoords).rgb;\\nvec3 normal = texture(uSampler2, texCoords).rgb;\\nfloat occlusion = 0.0;\\nvec2 noiseScale = uViewport.zw / uSsaoNoiseSize;\\nvec3 randomVec = texture(uSampler3, texCoords * noiseScale).rgb;\\nvec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));\\nvec3 bitangent = cross(normal, tangent);\\nmat3 tbn = mat3(tangent, bitangent, normal);\\nfor(int i = 0; i < SSAO_KERNEL_SIZE; i++)\\n{\\nvec3 mySample = tbn * uSsaoKernel[i];\\nmySample = position + mySample * uSsaoRadius;\\nvec4 offset = vec4(mySample, 1.0);\\noffset = uPMatrix * offset;\\noffset.xy /= offset.w;\\noffset.xy = offset.xy * 0.5 + 0.5;\\nfloat sampleDepth = texture(uSampler1, offset.xy).z;\\nfloat rangeCheck = abs(position.z - sampleDepth) > uSsaoRadius ? 0.0 : 1.0;\\nocclusion += (sampleDepth < mySample.z ? 0.0 : 1.0) * rangeCheck;\\n}\\nocclusion /= float(SSAO_KERNEL_SIZE);\\nocclusion = pow(1.0 - occlusion, uSsaoPower);\\nmyOutputColor = vec4(occlusion, 0.0, 0.0, 1.0);\\n}\\n\",\n        \"texture.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform sampler2D uSampler;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nmyPosition.xyz = vViewPosition;\\nmyColor.xyz = pow(texture(uSampler, vTexCoord).xyz, INV_GAMMA);\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\n}\\n\",\n        \"texture.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec3 aNormal;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nout vec3 vViewPosition;\\nout mediump vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\n}\\n\",\n        \"unitblock.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n        \"unitblock.vertex.fx\": \"#version 300 es\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n        \"unitcylinder.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec4 vCircle1;\\nin vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w, uShadow ? -1.0 : 1.0);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n        \"unitcylinder.vertex.fx\": \"#version 300 es\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout vec3 vViewPosition;\\nout vec4 vCircle1;\\nout vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n        \"unitsdf.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec2 vTexCoord;\\nin mediump vec2 vPreviousTexCoord;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nfloat uBorderWidth = 0.0 / 255.0;\\nfloat uBuffer = 192.0 / 255.0;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat distance = mix(texture(uPreviousSampler1, vPreviousTexCoord).r, texture(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat uGamma = 0.0;\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, color, value);\\n}\\n}\\n\",\n        \"unitsdf.vertex.fx\": \"#version 300 es\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin mediump vec4 aTexCoord;\\nin mediump vec4 aPreviousTexCoord;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout mediump vec2 vTexCoord;\\nout mediump vec2 vPreviousTexCoord;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n\",\n        \"unitsphere.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec3 vViewCenter;\\nin mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s, uShadow ? -1.0 : 1.0);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n        \"unitsphere.vertex.fx\": \"#version 300 es\\n#include \\\"common.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin lowp float aColor;\\nin lowp float aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump float vRadius;\\nout vec3 vViewPosition;\\nout vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\ntranslation.xyz += aPosition * scale;\\nvec4 viewPosition = mvMatrix * vec4(translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n\",\n        \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\n\",\n        \"intersect.include.fx\": \"float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph, in float shadow)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot( oc, rd );\\nfloat c = dot( oc, oc ) - sph.w*sph.w;\\nfloat h = b*b - c;\\nif( h<0.0 ) return -1.0;\\nreturn -b - shadow * sqrt( h );\\n}\\nfloat roundedboxIntersect( in vec3 ro, in vec3 rd, in vec3 size, in float rad )\\n{\\nvec3 m = 1.0/rd;\\nvec3 n = m*ro;\\nvec3 k = abs(m)*(size+rad);\\nvec3 t1 = -n - k;\\nvec3 t2 = -n + k;\\nfloat tN = max( max( t1.x, t1.y ), t1.z );\\nfloat tF = min( min( t2.x, t2.y ), t2.z );\\nif( tN > tF || tF < 0.0) return -1.0;\\nfloat t = tN;\\nvec3 pos = ro+t*rd;\\nvec3 s = sign(pos);\\nro *= s;\\nrd *= s;\\npos *= s;\\npos -= size;\\npos = max( pos.xyz, pos.yzx );\\nif( min(min(pos.x,pos.y),pos.z)<0.0 ) return t;\\nvec3 oc = ro - size;\\nvec3 dd = rd*rd;\\nvec3 oo = oc*oc;\\nvec3 od = oc*rd;\\nfloat ra2 = rad*rad;\\nt = 1e20;\\n{\\nfloat b = od.x + od.y + od.z;\\nfloat c = oo.x + oo.y + oo.z - ra2;\\nfloat h = b*b - c;\\nif( h>0.0 ) t = -b-sqrt(h);\\n}\\n{\\nfloat a = dd.y + dd.z;\\nfloat b = od.y + od.z;\\nfloat c = oo.y + oo.z - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.x+rd.x*h)<size.x ) t = h;\\n}\\n}\\n{\\nfloat a = dd.z + dd.x;\\nfloat b = od.z + od.x;\\nfloat c = oo.z + oo.x - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.y+rd.y*h)<size.y ) t = h;\\n}\\n}\\n{\\nfloat a = dd.x + dd.y;\\nfloat b = od.x + od.y;\\nfloat c = oo.x + oo.y - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.z+rd.z*h)<size.z ) t = h;\\n}\\n}\\nif( t>1e19 ) t=-1.0;\\nreturn t;\\n}\\nvec3 roundedboxNormal( in vec3 pos, in vec3 siz, in float rad )\\n{\\nreturn sign(pos)*normalize(max(abs(pos)-siz,0.0));\\n}\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - shadow * sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-shadow * sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - shadow * sqrt( h1 );\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - shadow * sqrt( h2 );\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\n\",\n        \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\",\n    };\n    class ShaderBase {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        set vertexBuffer(value) {\n            if (this._vertexBuffer != value) {\n                this._vertexBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        get indexBuffer() { return this._indexBuffer; }\n        set indexBuffer(value) {\n            if (this._indexBuffer != value) {\n                this._indexBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        constructor(core, main) {\n            this._core = core;\n            this._main = main;\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n        }\n        _createProgram(vs, fs) {\n            const program = this._gl.createProgram();\n            this._gl.attachShader(program, vs);\n            this._gl.attachShader(program, fs);\n            this._gl.linkProgram(program);\n            if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n                this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n            }\n            return program;\n        }\n        _compileShader(source, type) {\n            const shader = this._gl.createShader(type);\n            this._gl.shaderSource(shader, source);\n            this._gl.compileShader(shader);\n            if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n                this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n            }\n            return shader;\n        }\n        _removeDirective(shaderSource, directive) {\n            const remove = `#define ${directive}`;\n            const index = shaderSource.indexOf(remove);\n            shaderSource = (index == -1) ? shaderSource : shaderSource.substring(0, index) + shaderSource.substring(index + remove.length);\n            return shaderSource;\n        }\n        prepare() {\n            if (this._program != this._main.shaderResources.currentProgram) {\n                if (this._main.shaderResources.currentShader) {\n                    this._main.shaderResources.currentShader.disableProgram();\n                }\n                this.enableProgram(this._program);\n                this.updateBuffers();\n                this.updateTextures();\n            }\n            else {\n                if (this._haveBuffersChanged) {\n                    this.updateBuffers();\n                }\n                if (this._haveTexturesChanged) {\n                    this.updateTextures();\n                }\n            }\n        }\n        apply() { }\n        applyModel() { }\n        applyView() { }\n        enableProgram(program) {\n            this._gl.useProgram(program);\n            this._main.shaderResources.currentProgram = program;\n            this._main.shaderResources.currentShader = this;\n        }\n        updateBuffers() {\n            this._haveBuffersChanged = false;\n        }\n        updateTextures() {\n            this._haveTexturesChanged = false;\n        }\n        disableProgram() {\n            this._main.shaderResources.currentShader = null;\n            this._main.shaderResources.currentProgram = null;\n        }\n        _shaderFromFile(vsName, fsName, callback) {\n            callback(this._includesFromFile(Resources.glsl[vsName]), this._includesFromFile(Resources.glsl[fsName]));\n        }\n        _shaderFromUrl(vsName, fsName, callback) {\n            this._sourceFromUrl(vsName, (vsSource) => {\n                this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n                    this._sourceFromUrl(fsName, (fsSource) => {\n                        this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n                            callback(vsIncSource, fsIncSource);\n                        });\n                    });\n                });\n            });\n        }\n        _sourceFromUrl(url, callback) {\n            const request = new XMLHttpRequest();\n            request.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n            request.onreadystatechange = () => {\n                if (request.readyState == XMLHttpRequest.DONE && request.status == 200) {\n                    callback(request.responseText);\n                }\n            };\n            request.send();\n        }\n        _includesFromFile(source) {\n            let index = 0;\n            do {\n                index = source.indexOf(\"#include\", index);\n                if (index != -1) {\n                    const start = source.indexOf(\"\\\"\", index);\n                    const end = source.indexOf(\"\\\"\", start + 1);\n                    const name = source.substring(start + 1, end);\n                    const inc = Resources.glsl[name];\n                    source = source.substring(0, index) + inc + source.substring(end + 1);\n                }\n            } while (index != -1);\n            return source;\n        }\n        _includesFromUrl(source, index, callback) {\n            index = source.indexOf(\"#include\", index);\n            if (index != -1) {\n                const start = source.indexOf(\"\\\"\", index);\n                const end = source.indexOf(\"\\\"\", start + 1);\n                const name = source.substring(start + 1, end);\n                this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n                    source = source.substring(0, index) + include + source.substring(end + 1);\n                    this._includesFromUrl(source, index, callback);\n                });\n            }\n            else {\n                callback(source);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Texture extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1i(this._samplerUniform, 0);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Lasso$1 = class Lasso extends ShaderBase {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n            this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform3fv(this._colorUniform, this.color);\n            this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class SdfText extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n            this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n            this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n            this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n            this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform3fv(this._colorUniform, this.color);\n            this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n            this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n            this._gl.uniform1f(this._gammaUniform, this.gamma);\n            this._gl.uniform1f(this._bufferUniform, this.buffer);\n            this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n            this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n        }\n        applyModel() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class PickGrid extends ShaderBase {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n            this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n            this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n            this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n            this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n            this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n            this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n            this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n            this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n            this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n            this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n            this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n            this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n            this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n            this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n            this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n            this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n            this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n            this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n            this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n            this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n            this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n            this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        ApplyFace() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n            this._gl.uniform2fv(this._zeroUniform, this.zero);\n            this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._boundsAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitShader extends ShaderBase {\n        get paletteTexture() { return this._paletteTexture; }\n        set paletteTexture(value) {\n            if (this._paletteTexture != value) {\n                this._paletteTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get previousPaletteTexture() { return this._previousPaletteTexture; }\n        set previousPaletteTexture(value) {\n            if (this._previousPaletteTexture != value) {\n                this._previousPaletteTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get sdfTexture() { return this._sdfTexture; }\n        set sdfTexture(value) {\n            if (this._sdfTexture != value) {\n                this._sdfTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get previousSdfTexture() { return this._previousSdfTexture; }\n        set previousSdfTexture(value) {\n            if (this._previousSdfTexture != value) {\n                this._previousSdfTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        set instanceBuffer(value) {\n            if (this._instanceBuffer != value) {\n                this._instanceBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        set previousInstanceBuffer(value) {\n            if (this._previousInstanceBuffer != value) {\n                this._previousInstanceBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        initializeData() {\n            this._areBuffersInitialized = false;\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n            this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n            this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n            this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n            this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n            this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n            this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n            this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n            this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n            this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n            this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n            this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n            this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n            this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n            this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n            this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n            this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n            const vertices = Cube.POSITIONS;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Cube.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this.indexCount = indices.length;\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._updateCurrentBuffer();\n            this._updatePreviousBuffer();\n        }\n        _updateCurrentBuffer() {\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n            this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._idAttribute, 1);\n            this._gl.enableVertexAttribArray(this._idAttribute);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._idColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._translationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._translationAttribute);\n            this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._scaleAttribute, 1);\n            this._gl.enableVertexAttribArray(this._scaleAttribute);\n            this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._selectedAttribute, 1);\n            this._gl.enableVertexAttribArray(this._selectedAttribute);\n            this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._orderAttribute, 1);\n            this._gl.enableVertexAttribArray(this._orderAttribute);\n        }\n        _updatePreviousBuffer() {\n            if (this._previousInstanceBuffer != this._instanceBuffer) {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n            }\n            this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n            this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousScaleAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n            this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1f(this._timeUniform, this.time);\n            this._gl.uniform1f(this._durationUniform, this.duration);\n            this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n            this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n            this._gl.uniform1i(this._previousSampler0Uniform, 0);\n            this._gl.uniform1i(this._sampler0Uniform, 1);\n            this._gl.uniform1f(this._hoverUniform, this.hover);\n            this._gl.uniform1f(this._activeUniform, this.active);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniform1i(this._shadowUniform, this.isShadowMap ? 1 : 0);\n        }\n        updateTextures() {\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n        }\n        disableProgram() {\n            super.disableProgram();\n            this._gl.vertexAttribDivisor(this._translationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._scaleAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousScaleAttribute, 0);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 0);\n            this._gl.vertexAttribDivisor(this._selectedAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 0);\n            this._gl.vertexAttribDivisor(this._orderAttribute, 0);\n            this._gl.vertexAttribDivisor(this._idAttribute, 0);\n            this._gl.vertexAttribDivisor(this._idColorAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitBlock extends UnitShader {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitSphere extends UnitShader {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitCylinder extends UnitShader {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitSdf extends UnitShader {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n            this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._texCoordAttribute, 1);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        apply() {\n            super.apply();\n            this._gl.uniform1i(this._previousSampler1Uniform, 2);\n            this._gl.uniform1i(this._sampler1Uniform, 3);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n            this._gl.activeTexture(this._gl.TEXTURE3);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n        }\n        disableProgram() {\n            super.disableProgram();\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._texCoordAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Background extends ShaderBase {\n        constructor(core, main) {\n            super(core, main);\n            this._quad = new Quad();\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            this._quad.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"background.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._isInitialized = true;\n            this._vao = gl.createVertexArray();\n            gl.bindVertexArray(this._vao);\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._quad.vertexBuffer);\n            gl.vertexAttribPointer(this._positionAttribute, 3, gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            gl.enableVertexAttribArray(this._positionAttribute);\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._quad.indexBuffer);\n            gl.bindVertexArray(null);\n        }\n        apply() {\n            this._gl.uniform3fv(this._colorUniform, this.color);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindVertexArray(this._vao);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Ssao extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D3() { return this._texture2D3; }\n        set texture2D3(value) {\n            if (this._texture2D3 != value) {\n                this._texture2D3 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"ssao.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._ssaoNoiseSizeUniform = gl.getUniformLocation(this._program, \"uSsaoNoiseSize\");\n            this._ssaoRadiusUniform = gl.getUniformLocation(this._program, \"uSsaoRadius\");\n            this._ssaoPowerUniform = gl.getUniformLocation(this._program, \"uSsaoPower\");\n            this._ssaoKernelUniform = gl.getUniformLocation(this._program, \"uSsaoKernel\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n            this._gl.uniform1i(this._samplerUniform3, 2);\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1f(this._ssaoNoiseSizeUniform, this.ssaoNoiseSize);\n            this._gl.uniform1f(this._ssaoRadiusUniform, this.ssaoRadius);\n            this._gl.uniform1f(this._ssaoPowerUniform, this.ssaoPower);\n            this._gl.uniform3fv(this._ssaoKernelUniform, this.ssaoKernel);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Box extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"box.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Deferred extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D3() { return this._texture2D3; }\n        set texture2D3(value) {\n            if (this._texture2D3 != value) {\n                this._texture2D3 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D4() { return this._texture2D4; }\n        set texture2D4(value) {\n            if (this._texture2D4 != value) {\n                this._texture2D4 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D5() { return this._texture2D5; }\n        set texture2D5(value) {\n            if (this._texture2D5 != value) {\n                this._texture2D5 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        constructor(core, main) {\n            super(core, main);\n            this.directionToKeyLight = create$3();\n            this.directionToFillLight1 = create$3();\n            this.directionToFillLight2 = create$3();\n            this.keyLightHalfAngle = create$3();\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"deferred.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n            this._ssaoUniform = gl.getUniformLocation(this._program, \"uSsao\");\n            this._inverseVMatrixUniform = gl.getUniformLocation(this._program, \"uInverseVMatrix\");\n            this._shadowVMatrixUniform = gl.getUniformLocation(this._program, \"uShadowVMatrix\");\n            this._shadowPMatrixUniform = gl.getUniformLocation(this._program, \"uShadowPMatrix\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n            this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n            this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._shadowMapSizeUniform = gl.getUniformLocation(this._program, \"uShadowMapSize\");\n            this._keyLightHalfAngleUniform = gl.getUniformLocation(this._program, \"uKeyLightHalfAngle\");\n            this._directionToKeyLightUniform = gl.getUniformLocation(this._program, \"uDirectionToKeyLight\");\n            this._directionToFillLight1Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight1\");\n            this._directionToFillLight2Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight2\");\n            this._keyLightIntensityUniform = gl.getUniformLocation(this._program, \"uKeyLightIntensity\");\n            this._fillLight1IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight1Intensity\");\n            this._fillLight2IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight2Intensity\");\n            this._ambientIntensityUniform = gl.getUniformLocation(this._program, \"uAmbientIntensity\");\n            this._materialIntensityUniform = gl.getUniformLocation(this._program, \"uMaterialIntensity\");\n            this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n            this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._shadowUniform, this.isShadowEnabled ? 1 : 0);\n            this._gl.uniform1i(this._ssaoUniform, this.isSsaoEnabled ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._inverseVMatrixUniform, false, this.inverseVMatrix);\n            this._gl.uniformMatrix4fv(this._shadowVMatrixUniform, false, this.shadowVMatrix);\n            this._gl.uniformMatrix4fv(this._shadowPMatrixUniform, false, this.shadowPMatrix);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n            this._gl.uniform1i(this._samplerUniform3, 2);\n            this._gl.uniform1i(this._samplerUniform4, 3);\n            this._gl.uniform1i(this._samplerUniform5, 4);\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform2f(this._shadowMapSizeUniform, this.shadowMapWidth, this.shadowMapHeight);\n            this._gl.uniform1f(this._keyLightIntensityUniform, this.keyLightIntensity);\n            this._gl.uniform1f(this._fillLight1IntensityUniform, this.fillLight1Intensity);\n            this._gl.uniform1f(this._fillLight2IntensityUniform, this.fillLight2Intensity);\n            this._gl.uniform1f(this._ambientIntensityUniform, this.ambientIntensity);\n            this._gl.uniform1f(this._materialIntensityUniform, this.materialIntensity);\n            this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n            this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n            this._gl.uniform3fv(this._directionToKeyLightUniform, this.directionToKeyLight);\n            this._gl.uniform3fv(this._directionToFillLight1Uniform, this.directionToFillLight1);\n            this._gl.uniform3fv(this._directionToFillLight2Uniform, this.directionToFillLight2);\n            this._gl.uniform3fv(this._keyLightHalfAngleUniform, this.keyLightHalfAngle);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n            this._gl.activeTexture(this._gl.TEXTURE3);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n            this._gl.activeTexture(this._gl.TEXTURE4);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Combine extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D3() { return this._texture2D3; }\n        set texture2D3(value) {\n            if (this._texture2D3 != value) {\n                this._texture2D3 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D4() { return this._texture2D4; }\n        set texture2D4(value) {\n            if (this._texture2D4 != value) {\n                this._texture2D4 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D5() { return this._texture2D5; }\n        set texture2D5(value) {\n            if (this._texture2D5 != value) {\n                this._texture2D5 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"combine.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._intensityUniform = gl.getUniformLocation(this._program, \"uIntensity\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n            this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n            this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n            this._gl.uniform1f(this._intensityUniform, this.intensity);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n            this._gl.uniform1i(this._samplerUniform3, 2);\n            this._gl.uniform1i(this._samplerUniform4, 3);\n            this._gl.uniform1i(this._samplerUniform5, 4);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n            this._gl.activeTexture(this._gl.TEXTURE3);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n            this._gl.activeTexture(this._gl.TEXTURE4);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DofBlur extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"dofblur.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n            this._nearFocusDepthUniform = gl.getUniformLocation(this._program, \"uNearFocusDepth\");\n            this._farFocusDepthUniform = gl.getUniformLocation(this._program, \"uFarFocusDepth\");\n            this._maxBackgroundBlurUniform = gl.getUniformLocation(this._program, \"uMaxBackgroundBlur\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n            this._gl.uniform1f(this._nearFocusDepthUniform, this.nearFocusDepth);\n            this._gl.uniform1f(this._farFocusDepthUniform, this.farFocusDepth);\n            this._gl.uniform1f(this._maxBackgroundBlurUniform, this.maxBackgroundBlur);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Downsample extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"downsample.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1i(this._samplerUniform, 0);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Gaussian extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"gaussian.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n            this._horizontalUniform = gl.getUniformLocation(this._program, \"uHorizontal\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n            this._gl.uniform1i(this._horizontalUniform, this.horizontal ? 1 : 0);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DofCombine extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D3() { return this._texture2D3; }\n        set texture2D3(value) {\n            if (this._texture2D3 != value) {\n                this._texture2D3 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"dofcombine.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n            this._apertureUniform = gl.getUniformLocation(this._program, \"uAperture\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n            this._gl.uniform1f(this._apertureUniform, this.aperture);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n            this._gl.uniform1i(this._samplerUniform3, 2);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Fxaa extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"fxaa.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1i(this._samplerUniform, 0);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Bright extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"bright.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AxesVisualBase {\n        get isInitialized() { return this._isInitialized; }\n        get axes() { return this._axes; }\n        constructor(core) {\n            this._core = core;\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n        }\n        update(elapsedTime) { }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                this._renderGrid();\n                this._renderText();\n            }\n        }\n        _renderGrid() { }\n        _renderText() { }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cartesian2dVisual extends AxesVisualBase {\n        get isInitialized() { return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized; }\n        constructor(core, main, cartesian2dAxes) {\n            super(core);\n            this._main = main;\n            this._axes = cartesian2dAxes;\n            this._axes.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            const axes = this._axes;\n            if (!axes.isInitialized) {\n                axes.initialize();\n            }\n            if (axes.gridVertices) {\n                this._createGridBuffers();\n            }\n            if (axes.textVertices) {\n                this._createTextBuffers();\n            }\n            this._isInitialized = true;\n        }\n        _createGridBuffers() {\n            const axes = this._axes;\n            this._gridVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n            this._gridIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n            this._gridBufferSize = axes.gridVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n        }\n        _createTextBuffers() {\n            const axes = this._axes;\n            this._textVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n            this._textIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n            this._textBufferSize = axes.textVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                const axes = this._axes;\n                if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n                    this._createGridBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                    this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n                }\n                if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n                    this._createTextBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                    this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n                }\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        _renderText() {\n            const shader = this._main.sdfTextShader;\n            const shaderResources = this._main.shaderResources;\n            const axes = this._axes;\n            const fontVisual = this._main.fonts[axes.font.name];\n            shader.vertexBuffer = this._textVertexBuffer;\n            shader.indexBuffer = this._textIndexBuffer;\n            shader.texture2D = fontVisual.texture;\n            shader.prepare();\n            shader.buffer = fontVisual.font.edgeValue / 0xff;\n            shader.gamma = axes.gamma;\n            shader.borderWidth = axes.textBorderWidth;\n            shader.color = axes.textColor || this._core.config.axesTextColor;\n            shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n            shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n            shader.pickedIdColor = this.pickedIdColor;\n            shader.apply();\n            let indexCount, indexOffset;\n            for (let axisId = 0; axisId < 2; axisId++) {\n                const orientation = axes.getLabelOrientation(axisId);\n                for (let edge = 0; edge < 2; edge++) {\n                    const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                    if (axes.isEdgeVisible[edgeId]) {\n                        if ((orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId)) || (orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId))) {\n                            indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                            indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                        }\n                        else {\n                            indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                            indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                        }\n                        if (indexCount > 0) {\n                            shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                        indexCount = axes.getTitleIndexCount(axisId);\n                        if (indexCount > 0) {\n                            indexOffset = axes.getTitleIndexOffset(axisId);\n                            shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                    indexCount = axes.getHeadingIndexCount(axisId);\n                    if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                        indexOffset = axes.getHeadingIndexOffset(axisId);\n                        shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                        for (let i = 0; i < this.viewportCount; i++) {\n                            const viewport = i + this.viewportOffset;\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                }\n            }\n        }\n        _renderGrid() {\n            const gridShader = this._main.gridShader;\n            const axes = this._axes;\n            gridShader.vertexBuffer = this._gridVertexBuffer;\n            gridShader.indexBuffer = this._gridIndexBuffer;\n            gridShader.prepare();\n            gridShader.majorThickness = axes.gridMajorThickness;\n            gridShader.minorThickness = axes.gridMinorThickness;\n            gridShader.zeroThickness = axes.gridZeroThickness;\n            gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n            gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n            gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n            gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n            gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n            gridShader.pickedIdColor = this.pickedIdColor;\n            gridShader.apply();\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (axes.arePickDivisionsVisible[axisId]) {\n                    const gridTicksScale = axes.getGridTicksScale(axisId);\n                    const width = gridTicksScale[0];\n                    const height = gridTicksScale[1];\n                    gridShader.zero = axes.getGridTicksZero(axisId);\n                    gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n                    for (let edge = 0; edge < 2; edge++) {\n                        const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                        if (axes.isEdgeVisible[edgeId]) {\n                            this._renderGridTicks(axisId, edgeId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.disable(this._gl.CULL_FACE);\n            const size = axes.size;\n            const axisId2 = 0;\n            const axisId3 = 1;\n            const width = size[axisId2];\n            const height = size[axisId3];\n            gridShader.zero = axes.gridFaceZero;\n            gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n            for (let face = 0; face < 2; face++) {\n                const faceId = face;\n                if (axes.getIsForwardFace(faceId)) {\n                    this._renderGridFace(faceId, width, height);\n                }\n            }\n            this._gl.enable(this._gl.CULL_FACE);\n        }\n        _renderGridTicks(axisId, edgeId, width, height) {\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            const axes = this._axes;\n            gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n        }\n        _renderGridFace(faceId, width, height) {\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            const axes = this._axes;\n            gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cartesian3dVisual extends AxesVisualBase {\n        get isInitialized() { return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized; }\n        constructor(core, main, cartesian3dAxes) {\n            super(core);\n            this._main = main;\n            this._axes = cartesian3dAxes;\n            this._axes.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            const axes = this._axes;\n            if (!axes.isInitialized) {\n                axes.initialize();\n            }\n            if (axes.gridVertices) {\n                this._createGridBuffers();\n            }\n            if (axes.textVertices) {\n                this._createTextBuffers();\n            }\n            this._isInitialized = true;\n        }\n        _createGridBuffers() {\n            const axes = this._axes;\n            this._gridVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n            this._gridIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n            this._gridBufferSize = axes.gridVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n        }\n        _createTextBuffers() {\n            const axes = this._axes;\n            this._textVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n            this._textIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n            this._textBufferSize = axes.textVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                const axes = this._axes;\n                if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n                    this._createGridBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                    this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n                }\n                if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n                    this._createTextBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                    this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n                }\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        _renderText() {\n            const axes = this._axes;\n            const shader = this._main.sdfTextShader;\n            const shaderResources = this._main.shaderResources;\n            const fontVisual = this._main.fonts[axes.font.name];\n            shader.vertexBuffer = this._textVertexBuffer;\n            shader.indexBuffer = this._textIndexBuffer;\n            shader.texture2D = fontVisual.texture;\n            shader.prepare();\n            shader.buffer = fontVisual.font.edgeValue / 0xff;\n            shader.gamma = axes.gamma;\n            shader.borderWidth = axes.textBorderWidth;\n            shader.color = axes.textColor || this._core.config.axesTextColor;\n            shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n            shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n            shader.pickedIdColor = this.pickedIdColor;\n            shader.apply();\n            let indexCount, indexOffset;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                const orientation = axes.getLabelOrientation(axisId);\n                for (let edge = 0; edge < 4; edge++) {\n                    const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                    if (axes.getIsOutsideEdge(edgeId)) {\n                        if (axes.isEdgeVisible[edgeId]) {\n                            if ((orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId)) || (orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId))) {\n                                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                            }\n                            else {\n                                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                            }\n                            if (indexCount > 0) {\n                                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                                shader.applyModel();\n                                shader.isPickShader = false;\n                                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                                for (let i = 0; i < this.viewportCount; i++) {\n                                    const viewport = i + this.viewportOffset;\n                                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                    shader.vMatrix = this.vMatrices[viewport];\n                                    shader.pMatrix = this.pMatrices[viewport];\n                                    shader.applyView();\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                    shader.isPickShader = true;\n                                    shader.pMatrix = this.pickPMatrix;\n                                    shader.vMatrix = this.pickVMatrix;\n                                    shader.applyView();\n                                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                            }\n                            indexCount = axes.getTitleIndexCount(axisId);\n                            if (indexCount > 0) {\n                                indexOffset = axes.getTitleIndexOffset(axisId);\n                                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                                shader.applyModel();\n                                shader.isPickShader = false;\n                                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                                for (let i = 0; i < this.viewportCount; i++) {\n                                    const viewport = i + this.viewportOffset;\n                                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                    shader.vMatrix = this.vMatrices[viewport];\n                                    shader.pMatrix = this.pMatrices[viewport];\n                                    shader.applyView();\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                    shader.isPickShader = true;\n                                    shader.pMatrix = this.pickPMatrix;\n                                    shader.vMatrix = this.pickVMatrix;\n                                    shader.applyView();\n                                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                            }\n                        }\n                        indexCount = axes.getHeadingIndexCount(axisId);\n                        if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                            indexOffset = axes.getHeadingIndexOffset(axisId);\n                            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        _renderGrid() {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            gridShader.vertexBuffer = this._gridVertexBuffer;\n            gridShader.indexBuffer = this._gridIndexBuffer;\n            gridShader.prepare();\n            gridShader.majorThickness = axes.gridMajorThickness;\n            gridShader.minorThickness = axes.gridMinorThickness;\n            gridShader.zeroThickness = axes.gridZeroThickness;\n            gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n            gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n            gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n            gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n            gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n            gridShader.pickedIdColor = this.pickedIdColor;\n            gridShader.apply();\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (axes.arePickDivisionsVisible[axisId]) {\n                    const gridTicksScale = axes.getGridTicksScale(axisId);\n                    const width = gridTicksScale[0];\n                    const height = gridTicksScale[1];\n                    gridShader.zero = axes.getGridTicksZero(axisId);\n                    gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n                    for (let edge = 0; edge < 4; edge++) {\n                        const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                        if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n                            this._renderGridTicks(axisId, edgeId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.disable(this._gl.CULL_FACE);\n            const size = axes.size;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (axes.areFacesVisible[axisId]) {\n                    const axisId2 = axisId == 0 ? 1 : 0;\n                    const axisId3 = axisId == 2 ? 1 : 2;\n                    const width = size[axisId2];\n                    const height = size[axisId3];\n                    gridShader.zero = axes.getGridFaceZero(axisId);\n                    gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n                    for (let face = 0; face < 2; face++) {\n                        const faceId = Cube.AXIS_FACES[axisId][face];\n                        if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n                            this._renderGridFace(faceId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.enable(this._gl.CULL_FACE);\n        }\n        _renderGridTicks(axisId, edgeId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n        }\n        _renderGridFace(faceId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class FontVisual {\n        get isInitialized() { return this._isInitialized; }\n        get font() { return this._font; }\n        constructor(core, font) {\n            this._core = core;\n            this._font = font;\n            font.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this._isInitialized = true;\n            if (this._font.count > 0) {\n                this._hasChanged = true;\n            }\n        }\n        update() {\n            if (this._hasChanged && this._isInitialized) {\n                this._hasChanged = false;\n                this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n                this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class LabelVisualBase {\n        get isInitialized() { return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized; }\n        constructor(core, main, label) {\n            this._core = core;\n            this._main = main;\n            this._label = label;\n            this._label.hasChangedCallback = () => { this._hasChanged = true; };\n            this._mMatrix = create$4();\n            this.mMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._label.isInitialized) {\n                this._label.initialize();\n            }\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const indexCount = this._label.indexCount;\n                if (indexCount > 0) {\n                    const shader = this._main.sdfTextShader;\n                    const fontVisual = this._main.fonts[this._label.font.name];\n                    shader.vertexBuffer = this._vertexBuffer;\n                    shader.indexBuffer = this._indexBuffer;\n                    shader.texture2D = fontVisual.texture;\n                    shader.prepare();\n                    shader.gamma = this._label.gamma;\n                    shader.buffer = fontVisual.font.edgeValue / 0xff;\n                    shader.borderWidth = this._label.borderWidth;\n                    shader.color = this._label.color || this._core.config.textColor;\n                    shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n                    shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n                    shader.pickedIdColor = this.pickedIdColor;\n                    shader.apply();\n                    multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n                    shader.mMatrix = this._mMatrix;\n                    shader.applyModel();\n                    shader.isPickShader = false;\n                    this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                    for (let i = 0; i < this.viewportCount; i++) {\n                        const viewport = i + this.viewportOffset;\n                        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                        shader.vMatrix = this.vMatrices[viewport];\n                        shader.pMatrix = this.pMatrices[viewport];\n                        shader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                    if (this.isPickingEnabled) {\n                        shader.isPickShader = true;\n                        shader.pMatrix = this.pickPMatrix;\n                        shader.vMatrix = this.pickVMatrix;\n                        shader.applyView();\n                        this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n                        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n            }\n        }\n    }\n    class LabelVisual extends LabelVisualBase {\n        get label() { return this._label; }\n        set text(value) { this._label.text = value; }\n        get text() { return this._label.text; }\n        constructor(core, main, label) {\n            super(core, main, label);\n        }\n    }\n    class LabelSetVisual extends LabelVisualBase {\n        get label() { return this._label; }\n        constructor(core, main, label) {\n            super(core, main, label);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ImageVisual {\n        get isInitialized() { return this._isInitialized && this._main.textureShader.isInitialized; }\n        get image() { return this._image; }\n        constructor(core, main, image) {\n            this._core = core;\n            this._main = main;\n            this._image = image;\n            this._image.hasChangedCallback = () => { this._hasChanged = true; };\n            this.mMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._image.isInitialized) {\n                this._image.initialize();\n            }\n            this._gl = gl;\n            if (this._image.imageData) {\n                this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n            }\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const textureShader = this._main.textureShader;\n                textureShader.vertexBuffer = this._vertexBuffer;\n                textureShader.indexBuffer = this._indexBuffer;\n                textureShader.texture2D = this.texture;\n                textureShader.prepare();\n                textureShader.mMatrix = this.mMatrix;\n                textureShader.apply();\n                this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                    const viewport = i + this.viewportOffset;\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    textureShader.vMatrix = this.vMatrices[viewport];\n                    textureShader.pMatrix = this.pMatrices[viewport];\n                    textureShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Lasso {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        get indexBuffer() { return this._indexBuffer; }\n        get indexCount() { return this._indexCount; }\n        initializeContext(gl) {\n            const vertices = Quad$2.textured(Constants.MAT4_IDENTITY);\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Quad$2.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this._indexCount = indices.length;\n            this._isInitialized = true;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    class Main extends RendererBase {\n        get shaderResources() { return this._shaderResources; }\n        get textureShader() { return this._textureShader; }\n        get lassoShader() { return this._lassoShader; }\n        get sdfTextShader() { return this._sdfTextShader; }\n        get gridShader() { return this._gridShader; }\n        get blockShader() { return this._blockShader; }\n        get sphereShader() { return this._sphereShader; }\n        get cyclinderShader() { return this._cylinderShader; }\n        get sdfShader() { return this._sdfShader; }\n        get currentAxes() { return this._isAxes1Current ? this._axes1 : this._axes2; }\n        set currentAxes(value) { if (this._isAxes1Current) {\n            this._axes1 = value;\n        }\n        else {\n            this._axes2 = value;\n        } }\n        get previousAxes() { return this._isAxes1Current ? this._axes2 : this._axes1; }\n        set previousAxes(value) { if (this._isAxes1Current) {\n            this._axes2 = value;\n        }\n        else {\n            this._axes1 = value;\n        } }\n        get config() { return this._config; }\n        constructor(options) {\n            super(options);\n            this._config = new Config();\n            this._quad = new Quad();\n            this._lasso = new Lasso();\n            this._pickedPixels = new Uint8Array(4);\n            this._pickedIdColor = create$2();\n            this._position = create$3();\n            this._direction = create$3();\n            this._cameraRotation = create$5();\n            this._cameraPosition = create$3();\n            this._modelPosition = create$3();\n            this._modelManipulationOrigin = create$3();\n            this._shadowVMatrix = create$4();\n            this._shadowPMatrix = create$4();\n        }\n        get isSupported() {\n            return this._createContext(document.createElement(\"canvas\")) !== null;\n        }\n        initialize(core) {\n            super.initialize(core);\n            this._shaderResources = new Resources();\n            this._textureShader = new Texture(core, this);\n            this._lassoShader = new Lasso$1(core, this);\n            this._sdfTextShader = new SdfText(core, this);\n            this._gridShader = new PickGrid(core, this);\n            this._blockShader = new UnitBlock(core, this);\n            this._sphereShader = new UnitSphere(core, this);\n            this._cylinderShader = new UnitCylinder(core, this);\n            this._sdfShader = new UnitSdf(core, this);\n            this._backgroundShader = new Background(core, this);\n            this._ssaoShader = new Ssao(core, this);\n            this._boxShader = new Box(core, this);\n            this._deferredShader = new Deferred(core, this);\n            this._combineShader = new Combine(core, this);\n            this._dofBlurShader = new DofBlur(core, this);\n            this._downsampleShader = new Downsample(core, this);\n            this._gaussianShader = new Gaussian(core, this);\n            this._dofCombineShader = new DofCombine(core, this);\n            this._fxaaShader = new Fxaa(core, this);\n            this._brightPassShader = new Bright(core, this);\n            this._initializeContext(this._createContext(this._canvas));\n            this._canvas.addEventListener(\"webglcontextlost\", (event) => {\n                this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n                event.preventDefault();\n            }, false);\n            this._canvas.addEventListener(\"webglcontextrestored\", () => {\n                this._initializeContext(this._createContext(this._canvas));\n                this._core.log.write(LogLevel.info, \"WebGL context restored\");\n            }, false);\n            this._isInitialized = true;\n        }\n        _initializeContext(gl) {\n            this._gl = gl;\n            for (const key in this.fonts) {\n                const fontVisual = this.fonts[key];\n                fontVisual.initializeContext(gl);\n            }\n            this._ssaoSampleKernel = new Float32Array(this._config.ssaoKernelSize * 3);\n            const random = new PseudoRandom(0);\n            const _vec3 = create$3();\n            for (let i = 0; i < this._config.ssaoKernelSize; i++) {\n                _vec3[0] = random.nextFloat() * 2 - 1;\n                _vec3[1] = random.nextFloat() * 2 - 1;\n                _vec3[2] = random.nextFloat();\n                normalize$3(_vec3, _vec3);\n                scale(_vec3, _vec3, random.nextFloat());\n                let scale$1 = i / this._config.ssaoKernelSize;\n                scale$1 = MathHelper.lerp(0.1, 1, scale$1 * scale$1);\n                scale(_vec3, _vec3, scale$1);\n                this._ssaoSampleKernel[i * 3] = _vec3[0];\n                this._ssaoSampleKernel[i * 3 + 1] = _vec3[1];\n                this._ssaoSampleKernel[i * 3 + 2] = _vec3[2];\n            }\n            const noise = new Float32Array(this._config.ssaoNoiseSize * this._config.ssaoNoiseSize * 4);\n            _vec3[2] = 0;\n            for (let i = 0; i < this._config.ssaoNoiseSize * this._config.ssaoNoiseSize; i++) {\n                _vec3[0] = random.nextFloat() * 2 - 1;\n                _vec3[1] = random.nextFloat() * 2 - 1;\n                normalize$3(_vec3, _vec3);\n                noise[i * 4] = _vec3[0];\n                noise[i * 4 + 1] = _vec3[1];\n            }\n            this._ssaoNoiseTexture = this._gl.createTexture();\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._ssaoNoiseTexture);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST);\n            this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA32F, this._config.ssaoNoiseSize, this._config.ssaoNoiseSize, 0, this._gl.RGBA, this._gl.FLOAT, noise);\n            this._ssaoWidth = -1;\n            this._ssaoHeight = -1;\n            this._shadowWidth = -1;\n            this._shadowHeight = -1;\n            this._shaderResources.initializeContext(this._gl);\n            this._textureShader.initializeContext(this._gl);\n            this._lassoShader.initializeContext(this._gl);\n            this._sdfTextShader.initializeContext(this._gl);\n            this._gridShader.initializeContext(this._gl);\n            this._blockShader.initializeContext(this._gl);\n            this._sphereShader.initializeContext(this._gl);\n            this._cylinderShader.initializeContext(this._gl);\n            this._sdfShader.initializeContext(this._gl);\n            this._backgroundShader.initializeContext(this._gl);\n            this._ssaoShader.initializeContext(this._gl);\n            this._boxShader.initializeContext(this._gl);\n            this._deferredShader.initializeContext(this._gl);\n            this._combineShader.initializeContext(this._gl);\n            this._dofBlurShader.initializeContext(this._gl);\n            this._downsampleShader.initializeContext(this._gl);\n            this._gaussianShader.initializeContext(this._gl);\n            this._dofCombineShader.initializeContext(this._gl);\n            this._fxaaShader.initializeContext(this._gl);\n            this._brightPassShader.initializeContext(this._gl);\n            this._quad.initializeContext(this._gl);\n            this._lasso.initializeContext(this._gl);\n            this._framebuffers = [null, null];\n            const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n            const renderBuffer = this._gl.createRenderbuffer();\n            this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, this._core.config.pickWidth, this._core.config.pickHeight);\n            const framebuffer = this._gl.createFramebuffer();\n            this._shaderResources.bindFramebuffer(framebuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n            this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n            this._pickFrameBuffer = framebuffer;\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                this.transitionBuffers[i].initializeContext(this._gl);\n            }\n            if (this._axes1) {\n                for (let i = 0; i < this._axes1.length; i++) {\n                    this._axes1[i].initializeContext(this._gl);\n                }\n            }\n            if (this._axes2) {\n                for (let i = 0; i < this._axes2.length; i++) {\n                    this._axes2[i].initializeContext(this._gl);\n                }\n            }\n            for (let i = 0; i < this.labelSets.length; i++) {\n                this.labelSets[i].initializeContext(this._gl);\n            }\n            for (let i = 0; i < this.images.length; i++) {\n                this.images[i].initializeContext(this._gl);\n            }\n        }\n        _resize(width, height) {\n            super._resize(width, height);\n            this._positionTexture = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.NEAREST, null, this._gl.RGBA32F);\n            this._colorTexture = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._normalTexture = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._geometryFrameBuffer = this._gl.createFramebuffer();\n            this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._positionTexture, 0);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT1, this._gl.TEXTURE_2D, this._colorTexture, 0);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT2, this._gl.TEXTURE_2D, this._normalTexture, 0);\n            const renderBuffer = this._gl.createRenderbuffer();\n            this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, width, height);\n            this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.drawBuffers([this._gl.COLOR_ATTACHMENT0, this._gl.COLOR_ATTACHMENT1, this._gl.COLOR_ATTACHMENT2]);\n            this._postProcessTexture1 = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessDepthTexture = TextureHelper.create(this._gl, width, height, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n            this._postProcessFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture1, 0);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._postProcessDepthTexture, 0);\n            this._postProcessTexture2 = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture2, 0);\n            this._postProcessDofTexture = TextureHelper.create(this._gl, width, height, this._gl.RED, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.R32F);\n            this._postProcessDofFrameBuffer = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessDofTexture, 0);\n            const widthHalf = Math.round(width / 2);\n            const heightHalf = Math.round(height / 2);\n            this._postProcessHalfTexture1 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessHalfFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture1, 0);\n            this._postProcessHalfTexture2 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessHalfFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture2, 0);\n            const widthQuarter = Math.round(widthHalf / 2);\n            const heightQuarter = Math.round(heightHalf / 2);\n            this._postProcessQuarterTexture1 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessQuarterFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture1, 0);\n            this._postProcessQuarterTexture2 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessQuarterFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture2, 0);\n            const widthEighth = Math.round(widthQuarter / 2);\n            const heightEighth = Math.round(heightQuarter / 2);\n            this._postProcessEighthTexture1 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessEighthFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture1, 0);\n            this._postProcessEighthTexture2 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessEighthFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture2, 0);\n            const widthSixteenth = Math.round(widthEighth / 2);\n            const hgeightSixteenth = Math.round(heightEighth / 2);\n            this._postProcessSixteenthTexture1 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessSixteenthFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture1, 0);\n            this._postProcessSixteenthTexture2 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessSixteenthFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture2, 0);\n            this._core.log.write(LogLevel.info, `buffers resized ${width},${height}`);\n        }\n        _createContext(canvas) {\n            let supported = false;\n            const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === undefined ? false : this._options.preserveDrawingBuffer : false;\n            const options = {\n                stencil: true,\n                alpha: false,\n                antialias: false,\n                preserveDrawingBuffer: preserveDrawingBuffer,\n            };\n            const gl = canvas.getContext(\"webgl2\", options);\n            if (gl) {\n                const OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n                const EXT_color_buffer_float = gl.getExtension(\"EXT_color_buffer_float\");\n                if (OES_texture_float_linear && EXT_color_buffer_float && gl.MAX_DRAW_BUFFERS > 3) {\n                    const texture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.FLOAT, gl.LINEAR, null, gl.RGBA32F);\n                    const framebuffer = gl.createFramebuffer();\n                    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n                    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n                    const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n                    if (status == gl.FRAMEBUFFER_COMPLETE) {\n                        supported = true;\n                    }\n                    gl.bindTexture(gl.TEXTURE_2D, null);\n                }\n            }\n            return supported ? gl : null;\n        }\n        prepare() {\n            let viewport;\n            switch (this._core.config.stereoMode) {\n                case StereoMode.none:\n                    viewport = this._viewports[0];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 0;\n                    this._viewportCount = 1;\n                    break;\n                case StereoMode.left:\n                    viewport = this._viewports[0];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 0;\n                    this._viewportCount = 1;\n                    break;\n                case StereoMode.right:\n                    viewport = this._viewports[1];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 1;\n                    this._viewportCount = 1;\n                    break;\n            }\n        }\n        createTransitionBuffer(ids) {\n            const buffer = new TransitionBuffer(this._core, ids);\n            buffer.initializeContext(this._gl);\n            return buffer;\n        }\n        createCartesian2dAxesVisual(axes) {\n            const visual = new Cartesian2dVisual(this._core, this, axes);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createCartesian3dAxesVisual(axes) {\n            const visual = new Cartesian3dVisual(this._core, this, axes);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        _createLabelVisual(label) {\n            return new LabelVisual(this._core, this, label);\n        }\n        createLabelSetVisual(labelSet) {\n            const visual = new LabelSetVisual(this._core, this, labelSet);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createImageVisual(image) {\n            const visual = new ImageVisual(this._core, this, image);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createFontVisual(font) {\n            const visual = new FontVisual(this._core, font);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        getDataUrl(mimeType) {\n            return this._canvas.toDataURL(mimeType);\n        }\n        update(elapsedTime) {\n            super.update(elapsedTime);\n            if (this._shadowWidth != this._config.shadowWidth || this._shadowHeight != this._config.shadowHeight) {\n                this._shadowWidth = this._config.shadowWidth;\n                this._shadowHeight = this._config.shadowHeight;\n                this._shadowColorTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n                this._shadowDepthTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n                this._shadowFrameBuffer = this._gl.createFramebuffer();\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._shadowFrameBuffer);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._shadowColorTexture, 0);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._shadowDepthTexture, 0);\n                this._core.log.write(LogLevel.info, `shadow map resized ${this._shadowWidth},${this._shadowHeight}`);\n            }\n            if (this._ssaoWidth != this._config.ssaoWidth || this._ssaoHeight != this._config.ssaoHeight) {\n                this._ssaoWidth = this._config.ssaoWidth;\n                this._ssaoHeight = this._config.ssaoHeight;\n                this._ssaoTexture1 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n                this._ssaoFrameBuffer1 = this._gl.createFramebuffer();\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer1);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture1, 0);\n                this._ssaoTexture2 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n                this._ssaoFrameBuffer2 = this._gl.createFramebuffer();\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer2);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture2, 0);\n                this._core.log.write(LogLevel.info, `ssao map resized ${this._ssaoWidth},${this._ssaoHeight}`);\n            }\n            if (this._config.isDofEnabled && this._config.dofAutoFocus) {\n                this._core.getModelManipulationOrigin(this._modelManipulationOrigin);\n                this._core.getModelPosition(this._modelPosition);\n                add(this._position, this._modelManipulationOrigin, this._modelPosition);\n                this._core.camera.getPosition(this._cameraPosition);\n                subtract(this._position, this._position, this._cameraPosition);\n                const distance = -this._position[2];\n                const amount = Math.min(elapsedTime * this._core.config.focusSmoothing, 1);\n                this._config.dofFocusDistance = MathHelper.lerp(this._config.dofFocusDistance, distance, amount);\n            }\n        }\n        render(elapsedTime) {\n            return __awaiter$1(this, void 0, void 0, function* () {\n                this._gl.enable(this._gl.DEPTH_TEST);\n                this._gl.enable(this._gl.CULL_FACE);\n                this._gl.cullFace(this._gl.BACK);\n                this._gl.disable(this._gl.BLEND);\n                if (this.isPickingEnabled) {\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.clearColor(0, 0, 0, 0);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n                this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT | this._gl.STENCIL_BUFFER_BIT);\n                if (this.config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.clear(this._gl.DEPTH_BUFFER_BIT);\n                    perspective(this._shadowPMatrix, AngleHelper.degreesToRadians(30), this._config.shadowWidth / this._config.shadowHeight, this._core.config.nearPlane, this._core.config.farPlane);\n                    set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                    fromMat4(this._cameraRotation, this.inverseVMatrices[0]);\n                    transformMat3(this._position, this._config.keyLightPosition, this._cameraRotation);\n                    add(this._position, this._position, this._modelPosition);\n                    lookAt(this._shadowVMatrix, this._position, this._modelPosition, Constants.VECTOR3_UNITY);\n                }\n                for (let i = 0; i < this.transitionBuffers.length; i++) {\n                    const transitionBuffer = this.transitionBuffers[i];\n                    if (transitionBuffer.isVisible) {\n                        this._renderTransitionBuffer(transitionBuffer);\n                    }\n                }\n                const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n                if (axesVisuals) {\n                    for (let i = 0; i < axesVisuals.length; i++) {\n                        const axesVisual = axesVisuals[i];\n                        if (axesVisual.isVisible) {\n                            axesVisual.pickedIdColor = this._pickedIdColor;\n                            axesVisual.pickFramebuffer = this._pickFrameBuffer;\n                            axesVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                            axesVisual.render(elapsedTime);\n                        }\n                    }\n                }\n                if (this.areLabelsVisible) {\n                    for (let i = 0; i < this.labelSets.length; i++) {\n                        const labelSetVisual = this.labelSets[i];\n                        if (labelSetVisual.isVisible) {\n                            labelSetVisual.pickedIdColor = this._pickedIdColor;\n                            labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n                            labelSetVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                            labelSetVisual.render(elapsedTime);\n                        }\n                    }\n                }\n                if (this.areImagesVisible) {\n                    for (let i = 0; i < this.images.length; i++) {\n                        const imageVisual = this.images[i];\n                        if (imageVisual.isVisible) {\n                            imageVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                            imageVisual.render(elapsedTime);\n                        }\n                    }\n                }\n                if (this._backgroundShader.isInitialized) {\n                    this._backgroundShader.prepare();\n                    this._backgroundShader.color = fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n                    this._backgroundShader.apply();\n                    this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                    for (let i = 0; i < this._viewportCount; i++) {\n                        const viewport = i + this._viewportOffset;\n                        this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                    this._gl.bindVertexArray(null);\n                }\n                if (this.isPickingEnabled) {\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n                    this._pickedType = PickHelper.decodeType(this._pickedPixels);\n                    set$2(this._pickedIdColor, this._pickedPixels[0] / 0xff, this._pickedPixels[1] / 0xff, this._pickedPixels[2] / 0xff, this._pickedPixels[3] / 0xff);\n                    this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n                }\n                else {\n                    set$2(this._pickedIdColor, 0, 0, 0, 0);\n                    this._pickedId = 0;\n                }\n                if (this.transitionBuffers.length > 0 && this._quad.isInitialized) {\n                    const viewport = this._viewportOffset;\n                    this._postProcess(this.vMatrices[viewport], this.inverseVMatrices[viewport], this.pMatrices[viewport], this._viewports[viewport]);\n                }\n                if (this.isLassoPicking && this._lassoShader.isInitialized) {\n                    this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n                    this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n                    const lassoWidth = this.lassoX1 - this.lassoX0;\n                    const lassoHeight = this.lassoY1 - this.lassoY0;\n                    this._lassoShader.prepare();\n                    this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n                    this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n                    this._lassoShader.apply();\n                    const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n                    for (let i = 0; i < this._viewportCount; i++) {\n                        const viewportIndex = i + this._viewportOffset;\n                        this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n                        const viewport = this._viewports[viewportIndex];\n                        this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n                        this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n                        this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n                        this._lassoMMatrix[10] = 1;\n                        this._lassoMMatrix[12] = ((this.lassoX0 + lassoWidth / 2) / viewport.width) * 2 - 1;\n                        this._lassoMMatrix[13] = 1 - ((this.lassoY0 + lassoHeight / 2) / viewport.height) * 2;\n                        this._lassoShader.mMatrix = this._lassoMMatrix;\n                        set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n                        this._lassoShader.thickness = this._lassoThickness;\n                        this._lassoShader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n            });\n        }\n        _renderTransitionBuffer(transitionBuffer) {\n            const currentBuffer = transitionBuffer.currentBuffer;\n            const previousBuffer = transitionBuffer.previousBuffer;\n            const currentPalette = transitionBuffer.currentPalette;\n            const previousPalette = transitionBuffer.previousPalette;\n            const currentAtlas = transitionBuffer.currentAtlas;\n            const previousAtlas = transitionBuffer.previousAtlas;\n            const unitType = transitionBuffer.unitType === undefined ? currentBuffer.unitType : transitionBuffer.unitType;\n            const id = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n            const hoverId = id > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id) : -1;\n            const activeId = transitionBuffer.activeId;\n            if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf)) {\n                this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._blockShader.prepare();\n                this._blockShader.mMatrix = this.mMatrix;\n                this._blockShader.time = this.transitionTime;\n                this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._blockShader.rangeMin = currentBuffer.from;\n                this._blockShader.rangeMax = currentBuffer.to;\n                this._blockShader.hover = hoverId;\n                this._blockShader.active = activeId;\n                this._blockShader.specularPower = this._config.specularPower;\n                this._blockShader.specularIntensity = this._config.specularIntensity;\n                this._blockShader.apply();\n                this._blockShader.isPickShader = false;\n                this._blockShader.isShadowMap = false;\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._blockShader.vMatrix = this.vMatrices[viewport];\n                    this._blockShader.pMatrix = this.pMatrices[viewport];\n                    this._blockShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this._config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                    this._gl.cullFace(this._gl.FRONT);\n                    this._blockShader.isPickShader = false;\n                    this._blockShader.isShadowMap = true;\n                    this._blockShader.vMatrix = this._shadowVMatrix;\n                    this._blockShader.pMatrix = this._shadowPMatrix;\n                    this._blockShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                    this._gl.colorMask(true, true, true, true);\n                    this._gl.cullFace(this._gl.BACK);\n                }\n                if (this.isPickingEnabled) {\n                    this._blockShader.isPickShader = true;\n                    this._blockShader.isShadowMap = false;\n                    this._blockShader.pMatrix = this.pickPMatrix;\n                    this._blockShader.vMatrix = this.pickVMatrix;\n                    this._blockShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf)) {\n                this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._sphereShader.prepare();\n                this._sphereShader.mMatrix = this.mMatrix;\n                this._sphereShader.time = this.transitionTime;\n                this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._sphereShader.rangeMin = currentBuffer.from;\n                this._sphereShader.rangeMax = currentBuffer.to;\n                this._sphereShader.hover = hoverId;\n                this._sphereShader.active = activeId;\n                this._sphereShader.specularPower = this._config.specularPower;\n                this._sphereShader.specularIntensity = this._config.specularIntensity;\n                this._sphereShader.apply();\n                this._sphereShader.isPickShader = false;\n                this._sphereShader.isShadowMap = false;\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._sphereShader.vMatrix = this.vMatrices[viewport];\n                    this._sphereShader.pMatrix = this.pMatrices[viewport];\n                    this._sphereShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this._config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                    this._sphereShader.isPickShader = false;\n                    this._sphereShader.isShadowMap = true;\n                    this._sphereShader.vMatrix = this._shadowVMatrix;\n                    this._sphereShader.pMatrix = this._shadowPMatrix;\n                    this._sphereShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                    this._gl.colorMask(true, true, true, true);\n                }\n                if (this.isPickingEnabled) {\n                    this._sphereShader.isPickShader = true;\n                    this._sphereShader.isShadowMap = false;\n                    this._sphereShader.pMatrix = this.pickPMatrix;\n                    this._sphereShader.vMatrix = this.pickVMatrix;\n                    this._sphereShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n                this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._cylinderShader.prepare();\n                this._cylinderShader.mMatrix = this.mMatrix;\n                this._cylinderShader.time = this.transitionTime;\n                this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._cylinderShader.rangeMin = currentBuffer.from;\n                this._cylinderShader.rangeMax = currentBuffer.to;\n                this._cylinderShader.hover = hoverId;\n                this._cylinderShader.active = activeId;\n                this._cylinderShader.specularPower = this._config.specularPower;\n                this._cylinderShader.specularIntensity = this._config.specularIntensity;\n                this._cylinderShader.apply();\n                this._cylinderShader.isPickShader = false;\n                this._cylinderShader.isShadowMap = false;\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._cylinderShader.vMatrix = this.vMatrices[viewport];\n                    this._cylinderShader.pMatrix = this.pMatrices[viewport];\n                    this._cylinderShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this._config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                    this._cylinderShader.isPickShader = false;\n                    this._cylinderShader.isShadowMap = true;\n                    this._cylinderShader.vMatrix = this._shadowVMatrix;\n                    this._cylinderShader.pMatrix = this._shadowPMatrix;\n                    this._cylinderShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                    this._gl.colorMask(true, true, true, true);\n                }\n                if (this.isPickingEnabled) {\n                    this._cylinderShader.isPickShader = true;\n                    this._cylinderShader.isShadowMap = false;\n                    this._cylinderShader.pMatrix = this.pickPMatrix;\n                    this._cylinderShader.vMatrix = this.pickVMatrix;\n                    this._cylinderShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n                this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n                this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n                this._sdfShader.prepare();\n                this._sdfShader.mMatrix = this.mMatrix;\n                this._sdfShader.time = this.transitionTime;\n                this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._sdfShader.rangeMin = currentBuffer.from;\n                this._sdfShader.rangeMax = currentBuffer.to;\n                this._sdfShader.hover = hoverId;\n                this._sdfShader.active = activeId;\n                this._sdfShader.specularPower = this._config.specularPower;\n                this._sdfShader.specularIntensity = this._config.specularIntensity;\n                this._sdfShader.apply();\n                this._sdfShader.isPickShader = false;\n                this._sdfShader.isShadowMap = false;\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._sdfShader.vMatrix = this.vMatrices[viewport];\n                    this._sdfShader.pMatrix = this.pMatrices[viewport];\n                    this._sdfShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this._config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                    this._gl.cullFace(this._gl.FRONT);\n                    this._sdfShader.isPickShader = false;\n                    this._sdfShader.isShadowMap = true;\n                    this._sdfShader.vMatrix = this._shadowVMatrix;\n                    this._sdfShader.pMatrix = this._shadowPMatrix;\n                    this._sdfShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                    this._gl.colorMask(true, true, true, true);\n                    this._gl.cullFace(this._gl.BACK);\n                }\n                if (this.isPickingEnabled) {\n                    this._sdfShader.isPickShader = true;\n                    this._sdfShader.isShadowMap = false;\n                    this._sdfShader.pMatrix = this.pickPMatrix;\n                    this._sdfShader.vMatrix = this.pickVMatrix;\n                    this._sdfShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n        }\n        _postProcess(vMatrix, inverseVMatrix, pMatrix, viewport) {\n            if (this._deferredShader.isInitialized) {\n                this._gl.disable(this._gl.DEPTH_TEST);\n                let ssaoTexture;\n                if (this._config.isSsaoEnabled && this._ssaoShader.isInitialized) {\n                    this._gl.viewport(0, 0, this._config.ssaoWidth, this._config.ssaoHeight);\n                    ssaoTexture = this._ssaoTexture1;\n                    this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer1);\n                    this._ssaoShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._ssaoShader.indexBuffer = this._quad.indexBuffer;\n                    this._ssaoShader.texture2D1 = this._positionTexture;\n                    this._ssaoShader.texture2D2 = this._normalTexture;\n                    this._ssaoShader.texture2D3 = this._ssaoNoiseTexture;\n                    this._ssaoShader.prepare();\n                    this._ssaoShader.pMatrix = pMatrix;\n                    this._ssaoShader.ssaoNoiseSize = this._config.ssaoNoiseSize;\n                    this._ssaoShader.ssaoRadius = this._config.ssaoRadius;\n                    this._ssaoShader.ssaoPower = this._config.ssaoPower;\n                    this._ssaoShader.ssaoKernel = this._ssaoSampleKernel;\n                    this._ssaoShader.left = 0;\n                    this._ssaoShader.top = 0;\n                    this._ssaoShader.width = this._config.ssaoWidth;\n                    this._ssaoShader.height = this._config.ssaoHeight;\n                    this._ssaoShader.apply();\n                    this._ssaoShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    if (this._config.ssaoBlurEnabled && this._boxShader.isInitialized) {\n                        ssaoTexture = this._ssaoTexture2;\n                        this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer2);\n                        this._boxShader.vertexBuffer = this._quad.vertexBuffer;\n                        this._boxShader.indexBuffer = this._quad.indexBuffer;\n                        this._boxShader.texture2D = this._ssaoTexture1;\n                        this._boxShader.prepare();\n                        this._boxShader.left = 0;\n                        this._boxShader.top = 0;\n                        this._boxShader.width = this._config.ssaoWidth;\n                        this._boxShader.height = this._config.ssaoHeight;\n                        this._boxShader.apply();\n                        this._boxShader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n                this._gl.viewport(viewport.left, viewport.top, viewport.width, viewport.height);\n                let postProcessFrameBuffer = this._postProcessFrameBuffer1;\n                this._shaderResources.bindFramebuffer(postProcessFrameBuffer);\n                this._deferredShader.vertexBuffer = this._quad.vertexBuffer;\n                this._deferredShader.indexBuffer = this._quad.indexBuffer;\n                this._deferredShader.texture2D1 = this._positionTexture;\n                this._deferredShader.texture2D2 = this._colorTexture;\n                this._deferredShader.texture2D3 = this._normalTexture;\n                this._deferredShader.texture2D4 = this._config.isSsaoEnabled ? ssaoTexture : null;\n                this._deferredShader.texture2D5 = this._shadowDepthTexture;\n                this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\n                this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n                this._deferredShader.prepare();\n                this._deferredShader.isShadowEnabled = this._config.isShadowEnabled;\n                this._deferredShader.isSsaoEnabled = this._config.isSsaoEnabled;\n                this._deferredShader.inverseVMatrix = inverseVMatrix;\n                this._deferredShader.shadowVMatrix = this._shadowVMatrix;\n                this._deferredShader.shadowPMatrix = this._shadowPMatrix;\n                this._deferredShader.vMatrix = vMatrix;\n                this._deferredShader.keyLightIntensity = this._config.keyLightIntensity;\n                this._deferredShader.fillLight1Intensity = this._config.fillLight1Intensity;\n                this._deferredShader.fillLight2Intensity = this._config.fillLight2Intensity;\n                this._core.camera.getPosition(this._cameraPosition);\n                fromMat4(this._cameraRotation, vMatrix);\n                set$3(this._position, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                normalize$3(this._deferredShader.directionToKeyLight, this._config.keyLightPosition);\n                subtract(this._direction, this._cameraPosition, this._position);\n                normalize$3(this._direction, this._direction);\n                add(this._deferredShader.keyLightHalfAngle, this._direction, this._deferredShader.directionToKeyLight);\n                normalize$3(this._deferredShader.keyLightHalfAngle, this._deferredShader.keyLightHalfAngle);\n                copy$4(this._deferredShader.directionToFillLight1, this._config.fillLight1Position);\n                copy$4(this._deferredShader.directionToFillLight2, this._config.fillLight2Position);\n                this._deferredShader.left = viewport.left;\n                this._deferredShader.top = viewport.top;\n                this._deferredShader.width = viewport.width;\n                this._deferredShader.height = viewport.height;\n                this._deferredShader.shadowMapWidth = this._config.shadowWidth;\n                this._deferredShader.shadowMapHeight = this._config.shadowHeight;\n                this._deferredShader.ambientIntensity = this._config.ambientIntensity;\n                this._deferredShader.materialIntensity = this._config.materialIntensity;\n                this._deferredShader.specularPower = this._config.specularPower;\n                this._deferredShader.specularIntensity = this._config.specularIntensity;\n                this._deferredShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                const widthHalf = Math.round(viewport.width / 2);\n                const heightHalf = Math.round(viewport.height / 2);\n                const widthQuarter = Math.round(widthHalf / 2);\n                const heightQuarter = Math.round(heightHalf / 2);\n                const widthEighth = Math.round(widthQuarter / 2);\n                const heightEighth = Math.round(heightQuarter / 2);\n                const widthSixteenth = Math.round(widthEighth / 2);\n                const heightSixteenth = Math.round(heightEighth / 2);\n                if (this._config.isDofEnabled && this._dofBlurShader.isInitialized && this._dofCombineShader.isInitialized) {\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n                    this._dofBlurShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._dofBlurShader.indexBuffer = this._quad.indexBuffer;\n                    this._dofBlurShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                    this._dofBlurShader.texture2D2 = this._positionTexture;\n                    this._dofBlurShader.prepare();\n                    this._dofBlurShader.focusDepth = this._config.dofFocusDistance;\n                    this._dofBlurShader.nearFocusDepth = this._config.dofFocusDistance - this._config.dofFocusRange / 2;\n                    this._dofBlurShader.farFocusDepth = this._config.dofFocusDistance + this._config.dofFocusRange / 2;\n                    this._dofBlurShader.maxBackgroundBlur = this._config.dofMaxBackgroundBlur;\n                    this._dofBlurShader.left = viewport.left;\n                    this._dofBlurShader.top = viewport.top;\n                    this._dofBlurShader.width = viewport.width;\n                    this._dofBlurShader.height = viewport.height;\n                    this._dofBlurShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n                    this._dofCombineShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._dofCombineShader.indexBuffer = this._quad.indexBuffer;\n                    this._dofCombineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                    this._dofCombineShader.texture2D2 = this._postProcessDofTexture;\n                    this._dofCombineShader.prepare();\n                    this._dofCombineShader.focusDepth = this._config.dofFocusDistance;\n                    this._dofCombineShader.left = viewport.left;\n                    this._dofCombineShader.top = viewport.top;\n                    this._dofCombineShader.width = viewport.width;\n                    this._dofCombineShader.height = viewport.height;\n                    this._dofCombineShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this._config.isBloomEnabled && this._brightPassShader.isInitialized && this._gaussianShader.isInitialized) {\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n                    this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                    this._brightPassShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n                    this._brightPassShader.prepare();\n                    this._brightPassShader.width = widthHalf;\n                    this._brightPassShader.height = heightHalf;\n                    this._brightPassShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n                    this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                    this._brightPassShader.texture2D = this._postProcessHalfTexture1;\n                    this._brightPassShader.prepare();\n                    this._brightPassShader.width = widthQuarter;\n                    this._brightPassShader.height = heightQuarter;\n                    this._brightPassShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n                    this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                    this._brightPassShader.texture2D = this._postProcessQuarterTexture1;\n                    this._brightPassShader.prepare();\n                    this._brightPassShader.width = widthEighth;\n                    this._brightPassShader.height = heightEighth;\n                    this._brightPassShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n                    this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                    this._brightPassShader.texture2D = this._postProcessEighthTexture1;\n                    this._brightPassShader.prepare();\n                    this._brightPassShader.width = widthSixteenth;\n                    this._brightPassShader.height = heightSixteenth;\n                    this._brightPassShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n                    this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                    this._gaussianShader.texture2D = this._postProcessHalfTexture1;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.width = widthHalf;\n                    this._gaussianShader.height = heightHalf;\n                    this._gaussianShader.horizontal = true;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n                    this._gaussianShader.texture2D = this._postProcessHalfTexture2;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.horizontal = false;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n                    this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                    this._gaussianShader.texture2D = this._postProcessQuarterTexture1;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.width = widthQuarter;\n                    this._gaussianShader.height = heightQuarter;\n                    this._gaussianShader.horizontal = true;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n                    this._gaussianShader.texture2D = this._postProcessQuarterTexture2;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.horizontal = false;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n                    this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                    this._gaussianShader.texture2D = this._postProcessEighthTexture1;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.width = widthEighth;\n                    this._gaussianShader.height = heightEighth;\n                    this._gaussianShader.horizontal = true;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n                    this._gaussianShader.texture2D = this._postProcessEighthTexture2;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.horizontal = false;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n                    this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                    this._gaussianShader.texture2D = this._postProcessSixteenthTexture1;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.width = widthSixteenth;\n                    this._gaussianShader.height = heightSixteenth;\n                    this._gaussianShader.horizontal = true;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n                    this._gaussianShader.texture2D = this._postProcessSixteenthTexture2;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.horizontal = false;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this._config.isFxaaEnabled && this._fxaaShader.isInitialized) {\n                    postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n                    this._fxaaShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._fxaaShader.indexBuffer = this._quad.indexBuffer;\n                    this._fxaaShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                    this._fxaaShader.prepare();\n                    this._fxaaShader.left = viewport.left;\n                    this._fxaaShader.top = viewport.top;\n                    this._fxaaShader.width = viewport.width;\n                    this._fxaaShader.height = viewport.height;\n                    this._fxaaShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                this._shaderResources.bindFramebuffer(null);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n                this._combineShader.vertexBuffer = this._quad.vertexBuffer;\n                this._combineShader.indexBuffer = this._quad.indexBuffer;\n                this._combineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n                if (this._config.isBloomEnabled) {\n                    this._combineShader.texture2D2 = this._postProcessHalfTexture1;\n                    this._combineShader.texture2D3 = this._postProcessQuarterTexture1;\n                    this._combineShader.texture2D4 = this._postProcessEighthTexture1;\n                    this._combineShader.texture2D5 = this._postProcessSixteenthTexture1;\n                }\n                else {\n                    this._combineShader.texture2D2 = null;\n                    this._combineShader.texture2D3 = null;\n                    this._combineShader.texture2D4 = null;\n                    this._combineShader.texture2D5 = null;\n                }\n                this._combineShader.prepare();\n                this._combineShader.viewport = viewport;\n                this._combineShader.intensity = this._config.bloomIntensity;\n                this._combineShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class MaterialBufferData extends Float32Array {\n        constructor(count) {\n            super(count * MaterialBufferData.SIZE);\n            this.TYPE_OFFSET = 0 / 4;\n            this.FUZZ_OFFSET = 4 / 4;\n            this.REFRACTIVE_INDEX_OFFSET = 8 / 4;\n            this.TEXTURE_ID_OFFSET = 12 / 4;\n            this.COLOR_OFFSET = 16 / 4;\n            this.GLOSSINESS_OFFSET = 28 / 4;\n            this.ID_COLOR_OFFSET = 32 / 4;\n            this.DENSITY_OFFSET = 48 / 4;\n        }\n        getType(index) {\n            return this[MaterialBufferData.SIZE * index + this.TYPE_OFFSET];\n        }\n        setType(index, value) {\n            this[MaterialBufferData.SIZE * index + this.TYPE_OFFSET] = value;\n        }\n        getFuzz(index) {\n            return this[MaterialBufferData.SIZE * index + this.FUZZ_OFFSET];\n        }\n        setFuzz(index, value) {\n            this[MaterialBufferData.SIZE * index + this.FUZZ_OFFSET] = value;\n        }\n        getRefractiveIndex(index) {\n            return this[MaterialBufferData.SIZE * index + this.REFRACTIVE_INDEX_OFFSET];\n        }\n        setRefractiveIndex(index, value) {\n            this[MaterialBufferData.SIZE * index + this.REFRACTIVE_INDEX_OFFSET] = value;\n        }\n        getTextureId(index) {\n            return this[MaterialBufferData.SIZE * index + this.TEXTURE_ID_OFFSET];\n        }\n        setTextureId(index, value) {\n            this[MaterialBufferData.SIZE * index + this.TEXTURE_ID_OFFSET] = value;\n        }\n        getColor(index, value) {\n            const offset = MaterialBufferData.SIZE * index + this.COLOR_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setColor(index, value) {\n            const offset = MaterialBufferData.SIZE * index + this.COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getGlossiness(index) {\n            return this[MaterialBufferData.SIZE * index + this.GLOSSINESS_OFFSET];\n        }\n        setGlossiness(index, value) {\n            this[MaterialBufferData.SIZE * index + this.GLOSSINESS_OFFSET] = value;\n        }\n        getDensity(index) {\n            return this[MaterialBufferData.SIZE * index + this.DENSITY_OFFSET];\n        }\n        setDensity(index, value) {\n            this[MaterialBufferData.SIZE * index + this.DENSITY_OFFSET] = value;\n        }\n        getIdColor(index, value) {\n            const offset = MaterialBufferData.SIZE * index + this.ID_COLOR_OFFSET;\n            set$2(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setIdColor(index, value) {\n            const offset = MaterialBufferData.SIZE * index + this.ID_COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n    }\n    MaterialBufferData.SIZE = 64 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class TextureBufferData extends Float32Array {\n        constructor(count) {\n            super(count * TextureBufferData.SIZE);\n            this.COLOR0_OFFSET = 0 / 4;\n            this.TYPE_OFFSET = 12 / 4;\n            this.COLOR1_OFFSET = 16 / 4;\n            this.SIZE0_OFFSET = 32 / 4;\n            this.SIZE1_OFFSET = 48 / 4;\n            this.CLIP_OFFSET = 64 / 4;\n            this.OFFSET_OFFSET = 80 / 4;\n        }\n        getType(index) {\n            return this[TextureBufferData.SIZE * index + this.TYPE_OFFSET];\n        }\n        setType(index, value) {\n            this[TextureBufferData.SIZE * index + this.TYPE_OFFSET] = value;\n        }\n        getColor0(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.COLOR0_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setColor0(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.COLOR0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getColor1(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.COLOR1_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setColor1(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.COLOR1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSize0(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.SIZE0_OFFSET;\n            set$2(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setSize0(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.SIZE0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getSize1(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.SIZE1_OFFSET;\n            set$2(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setSize1(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.SIZE1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getClip(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.CLIP_OFFSET;\n            set$2(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setClip(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.CLIP_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getOffset(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.OFFSET_OFFSET;\n            set(value, this[offset], this[offset + 1]);\n        }\n        setOffset(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.OFFSET_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n        }\n    }\n    TextureBufferData.SIZE = 96 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class HittableBufferData extends Float32Array {\n        constructor(count) {\n            super(count * HittableBufferData.SIZE);\n            this.CENTER0_OFFSET = 0 / 4;\n            this.TYPE_OFFSET = 12 / 4;\n            this.SIZE0_OFFSET = 16 / 4;\n            this.MATERIAL_ID_OFFSET = 28 / 4;\n            this.ROTATION0_OFFSET = 32 / 4;\n            this.ROTATION1_OFFSET = 48 / 4;\n            this.TEXCOORD0_OFFSET = 64 / 4;\n            this.TEXCOORD1_OFFSET = 72 / 4;\n            this.CENTER1_OFFSET = 80 / 4;\n            this.ROUNDING_OFFSET = 92 / 4;\n            this.SIZE1_OFFSET = 96 / 4;\n            this.BOUNDARY_TYPE_OFFSET = 108 / 4;\n            this.TIME0_OFFSET = 112 / 4;\n            this.TIME1_OFFSET = 116 / 4;\n            this.TEX_ID_OFFSET = 120 / 4;\n            this.SDF_BUFFER_OFFSET = 124 / 4;\n            this.SDF_BORDER_OFFSET = 128 / 4;\n            this.PARAMETER_1_OFFSET = 132 / 4;\n            this.PARAMETER_2_OFFSET = 136 / 4;\n            this.MATERIAL_FUZZ_OFFSET = 140 / 4;\n            this.MATERIAL_GLOSS_OFFSET = 144 / 4;\n            this.MATERIAL_DENSITY_OFFSET = 148 / 4;\n            this.MATERIAL_REFRACTIVE_INDEX_OFFSET = 152 / 4;\n            this.MATERIAL_COLOR_OFFSET = 160 / 4;\n            this.MATERIAL_TYPE_ID_OFFSET = 172 / 4;\n            this.SEGMENT_COLOR_OFFSET = 176 / 4;\n            this.TEXTURE_TYPE_ID_OFFSET = 192 / 4;\n            this.TEXTURE_ID_OFFSET = 196 / 4;\n        }\n        getType(index) {\n            return this[HittableBufferData.SIZE * index + this.TYPE_OFFSET];\n        }\n        setType(index, value) {\n            this[HittableBufferData.SIZE * index + this.TYPE_OFFSET] = value;\n        }\n        getCenter0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.CENTER0_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setCenter0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.CENTER0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getCenter1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.CENTER1_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setCenter1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.CENTER1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getTime0(index) {\n            return this[HittableBufferData.SIZE * index + this.TIME0_OFFSET];\n        }\n        setTime0(index, value) {\n            this[HittableBufferData.SIZE * index + this.TIME0_OFFSET] = value;\n        }\n        getTime1(index) {\n            return this[HittableBufferData.SIZE * index + this.TIME1_OFFSET];\n        }\n        setTime1(index, value) {\n            this[HittableBufferData.SIZE * index + this.TIME1_OFFSET] = value;\n        }\n        getSize0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SIZE0_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setSize0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SIZE0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSize1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SIZE1_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setSize1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SIZE1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getRotation0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.ROTATION0_OFFSET;\n            set$1(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setRotation0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.ROTATION0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getRotation1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.ROTATION1_OFFSET;\n            set$1(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setRotation1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.ROTATION1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getTexCoord0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.TEXCOORD0_OFFSET;\n            set(value, this[offset], this[offset + 1]);\n        }\n        setTexCoord0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.TEXCOORD0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n        }\n        getTexCoord1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.TEXCOORD1_OFFSET;\n            set(value, this[offset], this[offset + 1]);\n        }\n        setTexCoord1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.TEXCOORD1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n        }\n        getRounding(index) {\n            return this[HittableBufferData.SIZE * index + this.ROUNDING_OFFSET];\n        }\n        setRounding(index, value) {\n            this[HittableBufferData.SIZE * index + this.ROUNDING_OFFSET] = value;\n        }\n        getParameter1(index) {\n            return this[HittableBufferData.SIZE * index + this.PARAMETER_1_OFFSET];\n        }\n        setParameter1(index, value) {\n            this[HittableBufferData.SIZE * index + this.PARAMETER_1_OFFSET] = value;\n        }\n        getParameter2(index) {\n            return this[HittableBufferData.SIZE * index + this.PARAMETER_2_OFFSET];\n        }\n        setParameter2(index, value) {\n            this[HittableBufferData.SIZE * index + this.PARAMETER_2_OFFSET] = value;\n        }\n        getBoundaryType(index) {\n            return this[HittableBufferData.SIZE * index + this.BOUNDARY_TYPE_OFFSET];\n        }\n        setBoundaryType(index, value) {\n            this[HittableBufferData.SIZE * index + this.BOUNDARY_TYPE_OFFSET] = value;\n        }\n        getTexId(index) {\n            return this[HittableBufferData.SIZE * index + this.TEX_ID_OFFSET];\n        }\n        setTexId(index, value) {\n            this[HittableBufferData.SIZE * index + this.TEX_ID_OFFSET] = value;\n        }\n        getSdfBuffer(index) {\n            return this[HittableBufferData.SIZE * index + this.SDF_BUFFER_OFFSET];\n        }\n        setSdfBuffer(index, value) {\n            this[HittableBufferData.SIZE * index + this.SDF_BUFFER_OFFSET] = value;\n        }\n        getSdfBorder(index) {\n            return this[HittableBufferData.SIZE * index + this.SDF_BORDER_OFFSET];\n        }\n        setSdfBorder(index, value) {\n            this[HittableBufferData.SIZE * index + this.SDF_BORDER_OFFSET] = value;\n        }\n        getMaterialTypeId(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_TYPE_ID_OFFSET];\n        }\n        setMaterialTypeId(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_TYPE_ID_OFFSET] = value;\n        }\n        getMaterialFuzz(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_FUZZ_OFFSET];\n        }\n        setMaterialFuzz(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_FUZZ_OFFSET] = value;\n        }\n        getMaterialDensity(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_DENSITY_OFFSET];\n        }\n        setMaterialDensity(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_DENSITY_OFFSET] = value;\n        }\n        getMaterialGloss(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_GLOSS_OFFSET];\n        }\n        setMaterialGloss(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_GLOSS_OFFSET] = value;\n        }\n        getMaterialRefractiveIndex(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_REFRACTIVE_INDEX_OFFSET];\n        }\n        setMaterialRefractiveIndex(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_REFRACTIVE_INDEX_OFFSET] = value;\n        }\n        getMaterialColor(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.MATERIAL_COLOR_OFFSET;\n            value[0] = this[offset];\n            value[1] = this[offset + 1];\n            value[2] = this[offset + 2];\n        }\n        setMaterialColor(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.MATERIAL_COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSegmentColor(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SEGMENT_COLOR_OFFSET;\n            value[0] = this[offset];\n            value[1] = this[offset + 1];\n            value[2] = this[offset + 2];\n            value[3] = this[offset + 3];\n        }\n        setSegmentColor(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SEGMENT_COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n    }\n    HittableBufferData.SIZE = 208 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ComputeUniformBufferData extends Float32Array {\n        constructor() {\n            super(ComputeUniformBufferData.SIZE);\n            this.POSITION_OFFSET = 0 / 4;\n            this.WIDTH_OFFSET = 12 / 4;\n            this.RIGHT_OFFSET = 16 / 4;\n            this.HEIGHT_OFFSET = 28 / 4;\n            this.UP_OFFSET = 32 / 4;\n            this.SEED_OFFSET = 44 / 4;\n            this.FORWARD_OFFSET = 48 / 4;\n            this.FOV_OFFSET = 60 / 4;\n            this.BACKGROUND_COLOR_OFFSET = 64 / 4;\n            this.TIME0_OFFSET = 76 / 4;\n            this.AMBIENT_COLOR_OFFSET = 80 / 4;\n            this.TIME1_OFFSET = 92 / 4;\n            this.TILES_X = 96 / 4;\n            this.TILES_Y = 100 / 4;\n            this.TILE_OFFSET_X = 104 / 4;\n            this.TILE_OFFSET_Y = 108 / 4;\n            this.LOOKAT_OFFSET = 112 / 4;\n            this.APERTURE_OFFSET = 124 / 4;\n            this.FOCUS_DISTANCE_OFFSET = 128 / 4;\n            this.RAYS_PER_FRAME_OFFSET = 132 / 4;\n        }\n        getFocusDistance() {\n            return this[this.FOCUS_DISTANCE_OFFSET];\n        }\n        setFocusDistance(value) {\n            this[this.FOCUS_DISTANCE_OFFSET] = value;\n        }\n        getWidth() {\n            return this[this.WIDTH_OFFSET];\n        }\n        setWidth(value) {\n            this[this.WIDTH_OFFSET] = value;\n        }\n        getHeight() {\n            return this[this.HEIGHT_OFFSET];\n        }\n        setHeight(value) {\n            this[this.HEIGHT_OFFSET] = value;\n        }\n        getSeed() {\n            return this[this.SEED_OFFSET];\n        }\n        setSeed(value) {\n            this[this.SEED_OFFSET] = value;\n        }\n        getRaysPerFrame() {\n            return this[this.RAYS_PER_FRAME_OFFSET];\n        }\n        setRaysPerFrame(value) {\n            this[this.RAYS_PER_FRAME_OFFSET] = value;\n        }\n        getFieldOfView() {\n            return this[this.FOV_OFFSET];\n        }\n        setFieldOfView(value) {\n            this[this.FOV_OFFSET] = value;\n        }\n        getAperture() {\n            return this[this.APERTURE_OFFSET];\n        }\n        setAperture(value) {\n            this[this.APERTURE_OFFSET] = value;\n        }\n        getPosition(value) {\n            set$3(value, this[this.POSITION_OFFSET], this[this.POSITION_OFFSET + 1], this[this.POSITION_OFFSET + 2]);\n        }\n        setPosition(value) {\n            this[this.POSITION_OFFSET] = value[0];\n            this[this.POSITION_OFFSET + 1] = value[1];\n            this[this.POSITION_OFFSET + 2] = value[2];\n        }\n        getRight(value) {\n            set$3(value, this[this.RIGHT_OFFSET], this[this.RIGHT_OFFSET + 1], this[this.RIGHT_OFFSET + 2]);\n        }\n        setRight(value) {\n            this[this.RIGHT_OFFSET] = value[0];\n            this[this.RIGHT_OFFSET + 1] = value[1];\n            this[this.RIGHT_OFFSET + 2] = value[2];\n        }\n        getUp(value) {\n            set$3(value, this[this.UP_OFFSET], this[this.UP_OFFSET + 1], this[this.UP_OFFSET + 2]);\n        }\n        setUp(value) {\n            this[this.UP_OFFSET] = value[0];\n            this[this.UP_OFFSET + 1] = value[1];\n            this[this.UP_OFFSET + 2] = value[2];\n        }\n        getForward(value) {\n            set$3(value, this[this.FORWARD_OFFSET], this[this.FORWARD_OFFSET + 1], this[this.FORWARD_OFFSET + 2]);\n        }\n        setForward(value) {\n            this[this.FORWARD_OFFSET] = value[0];\n            this[this.FORWARD_OFFSET + 1] = value[1];\n            this[this.FORWARD_OFFSET + 2] = value[2];\n        }\n        getBackgroundColor(value) {\n            set$2(value, this[this.BACKGROUND_COLOR_OFFSET], this[this.BACKGROUND_COLOR_OFFSET + 1], this[this.BACKGROUND_COLOR_OFFSET + 2], this[this.BACKGROUND_COLOR_OFFSET + 3]);\n        }\n        setBackgroundColor(value) {\n            this[this.BACKGROUND_COLOR_OFFSET] = value[0];\n            this[this.BACKGROUND_COLOR_OFFSET + 1] = value[1];\n            this[this.BACKGROUND_COLOR_OFFSET + 2] = value[2];\n            this[this.BACKGROUND_COLOR_OFFSET + 3] = value[3];\n        }\n        getAmbientColor(value) {\n            set$3(value, this[this.AMBIENT_COLOR_OFFSET], this[this.AMBIENT_COLOR_OFFSET + 1], this[this.AMBIENT_COLOR_OFFSET + 2]);\n        }\n        setAmbientColor(value) {\n            this[this.AMBIENT_COLOR_OFFSET] = value[0];\n            this[this.AMBIENT_COLOR_OFFSET + 1] = value[1];\n            this[this.AMBIENT_COLOR_OFFSET + 2] = value[2];\n        }\n        getTime0() {\n            return this[this.TIME0_OFFSET];\n        }\n        setTime0(value) {\n            this[this.TIME0_OFFSET] = value;\n        }\n        getTime1() {\n            return this[this.TIME1_OFFSET];\n        }\n        setTime1(value) {\n            this[this.TIME1_OFFSET] = value;\n        }\n        getTilesX() {\n            return this[this.TILES_X];\n        }\n        setTilesX(value) {\n            this[this.TILES_X] = value;\n        }\n        getTilesY() {\n            return this[this.TILES_Y];\n        }\n        setTilesY(value) {\n            this[this.TILES_Y] = value;\n        }\n        getTileOffsetX() {\n            return this[this.TILE_OFFSET_X];\n        }\n        setTileOffsetX(value) {\n            this[this.TILE_OFFSET_X] = value;\n        }\n        getTileOffsetY() {\n            return this[this.TILE_OFFSET_Y];\n        }\n        setTileOffsetY(value) {\n            this[this.TILE_OFFSET_Y] = value;\n        }\n        getLookAt(value) {\n            set$3(value, this[this.LOOKAT_OFFSET], this[this.LOOKAT_OFFSET + 1], this[this.LOOKAT_OFFSET + 2]);\n        }\n        setLookAt(value) {\n            this[this.LOOKAT_OFFSET] = value[0];\n            this[this.LOOKAT_OFFSET + 1] = value[1];\n            this[this.LOOKAT_OFFSET + 2] = value[2];\n        }\n    }\n    ComputeUniformBufferData.SIZE = 144 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class FullscreenQuadUniformBufferData extends Float32Array {\n        constructor() {\n            super(FullscreenQuadUniformBufferData.SIZE);\n            this.WIDTH_OFFSET = 0 / 4;\n            this.HEIGHT_OFFSET = 4 / 4;\n            this.SPP_OFFSET = 8 / 4;\n            this.EXPOSURE_OFFSET = 12 / 4;\n            this.MIN_DEPTH_OFFSET = 16 / 4;\n            this.MAX_DEPTH_OFFSET = 20 / 4;\n            this.EDGE_NORMAL_OFFSET = 24 / 4;\n            this.EDGE_DEPTH_OFFSET = 28 / 4;\n            this.EDGE_FOREGROUND_OFFSET = 32 / 4;\n            this.EDGE_BACKGROUND_OFFSET = 48 / 4;\n        }\n        getWidth() {\n            return this[this.WIDTH_OFFSET];\n        }\n        setWidth(value) {\n            this[this.WIDTH_OFFSET] = value;\n        }\n        getHeight() {\n            return this[this.HEIGHT_OFFSET];\n        }\n        setHeight(value) {\n            this[this.HEIGHT_OFFSET] = value;\n        }\n        getSamplesPerPixel() {\n            return this[this.SPP_OFFSET];\n        }\n        setSamplesPerPixel(value) {\n            this[this.SPP_OFFSET] = value;\n        }\n        getExposure() {\n            return this[this.EXPOSURE_OFFSET];\n        }\n        setExposure(value) {\n            this[this.EXPOSURE_OFFSET] = value;\n        }\n        getMinDepth() {\n            return this[this.MIN_DEPTH_OFFSET];\n        }\n        setMinDepth(value) {\n            this[this.MIN_DEPTH_OFFSET] = value;\n        }\n        getMaxDepth() {\n            return this[this.MAX_DEPTH_OFFSET];\n        }\n        setMaxDepth(value) {\n            this[this.MAX_DEPTH_OFFSET] = value;\n        }\n        getEdgeDepth() {\n            return this[this.EDGE_DEPTH_OFFSET];\n        }\n        setEdgeDepth(value) {\n            this[this.EDGE_DEPTH_OFFSET] = value;\n        }\n        getEdgeNormal() {\n            return this[this.EDGE_NORMAL_OFFSET];\n        }\n        setEdgeNormal(value) {\n            this[this.EDGE_NORMAL_OFFSET] = value;\n        }\n        getEdgeForeground(value) {\n            set$2(value, this[this.EDGE_FOREGROUND_OFFSET], this[this.EDGE_FOREGROUND_OFFSET + 1], this[this.EDGE_FOREGROUND_OFFSET + 2], this[this.EDGE_FOREGROUND_OFFSET + 3]);\n        }\n        setEdgeForeground(value) {\n            this[this.EDGE_FOREGROUND_OFFSET] = value[0];\n            this[this.EDGE_FOREGROUND_OFFSET + 1] = value[1];\n            this[this.EDGE_FOREGROUND_OFFSET + 2] = value[2];\n            this[this.EDGE_FOREGROUND_OFFSET + 3] = value[3];\n        }\n        getEdgeBackground(value) {\n            set$2(value, this[this.EDGE_BACKGROUND_OFFSET], this[this.EDGE_BACKGROUND_OFFSET + 1], this[this.EDGE_BACKGROUND_OFFSET + 2], this[this.EDGE_BACKGROUND_OFFSET + 3]);\n        }\n        setEdgeBackground(value) {\n            this[this.EDGE_BACKGROUND_OFFSET] = value[0];\n            this[this.EDGE_BACKGROUND_OFFSET + 1] = value[1];\n            this[this.EDGE_BACKGROUND_OFFSET + 2] = value[2];\n            this[this.EDGE_BACKGROUND_OFFSET + 3] = value[3];\n        }\n    }\n    FullscreenQuadUniformBufferData.SIZE = 64 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class LinearBVHNodeBufferData extends Float32Array {\n        constructor(count) {\n            super(count * LinearBVHNodeBufferData.SIZE);\n            this.CENTER_OFFSET = 0 / 4;\n            this.SIZE_OFFSET = 16 / 4;\n            this.PRIMITIVES_OFFSET_OFFSET = 12 / 4;\n            this.SECOND_CHILD_OFFSET_OFFSET = 28 / 4;\n            this.N_PRIMITIVES_OFFSET = 32 / 4;\n            this.AXIS_OFFSET = 36 / 4;\n        }\n        getCenter(index, value) {\n            const offset = LinearBVHNodeBufferData.SIZE * index + this.CENTER_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setCenter(index, value) {\n            const offset = LinearBVHNodeBufferData.SIZE * index + this.CENTER_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSize(index, value) {\n            const offset = LinearBVHNodeBufferData.SIZE * index + this.SIZE_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setSize(index, value) {\n            const offset = LinearBVHNodeBufferData.SIZE * index + this.SIZE_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getPrimitivesOffset(index) {\n            return this[LinearBVHNodeBufferData.SIZE * index + this.PRIMITIVES_OFFSET_OFFSET];\n        }\n        setPrimitivesOffset(index, value) {\n            this[LinearBVHNodeBufferData.SIZE * index + this.PRIMITIVES_OFFSET_OFFSET] = value;\n        }\n        getSecondChildOffset(index) {\n            return this[LinearBVHNodeBufferData.SIZE * index + this.SECOND_CHILD_OFFSET_OFFSET];\n        }\n        setSecondChildOffset(index, value) {\n            this[LinearBVHNodeBufferData.SIZE * index + this.SECOND_CHILD_OFFSET_OFFSET] = value;\n        }\n        getNPrimitives(index) {\n            return this[LinearBVHNodeBufferData.SIZE * index + this.N_PRIMITIVES_OFFSET];\n        }\n        setNPrimitives(index, value) {\n            this[LinearBVHNodeBufferData.SIZE * index + this.N_PRIMITIVES_OFFSET] = value;\n        }\n        getAxis(index) {\n            return this[LinearBVHNodeBufferData.SIZE * index + this.AXIS_OFFSET];\n        }\n        setAxis(index, value) {\n            this[LinearBVHNodeBufferData.SIZE * index + this.AXIS_OFFSET] = value;\n        }\n    }\n    LinearBVHNodeBufferData.SIZE = 48 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class LightBufferData extends Float32Array {\n        constructor(count) {\n            super(count * LightBufferData.SIZE);\n            this.ROTATION_OFFSET = 0 / 4;\n            this.CENTER_OFFSET = 16 / 4;\n            this.TYPE_OFFSET = 28 / 4;\n            this.SIZE_OFFSET = 32 / 4;\n            this.COLOR_OFFSET = 48 / 4;\n        }\n        getType(index) {\n            return this[LightBufferData.SIZE * index + this.TYPE_OFFSET];\n        }\n        setType(index, value) {\n            this[LightBufferData.SIZE * index + this.TYPE_OFFSET] = value;\n        }\n        getCenter(index, value) {\n            const offset = LightBufferData.SIZE * index + this.CENTER_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setCenter(index, value) {\n            const offset = LightBufferData.SIZE * index + this.CENTER_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSize(index, value) {\n            const offset = LightBufferData.SIZE * index + this.SIZE_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setSize(index, value) {\n            const offset = LightBufferData.SIZE * index + this.SIZE_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getColor(index, value) {\n            const offset = LightBufferData.SIZE * index + this.COLOR_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setColor(index, value) {\n            const offset = LightBufferData.SIZE * index + this.COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getRotation(index, value) {\n            const offset = LightBufferData.SIZE * index + this.ROTATION_OFFSET;\n            set$1(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setRotation(index, value) {\n            const offset = LightBufferData.SIZE * index + this.ROTATION_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n    }\n    LightBufferData.SIZE = 64 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * This file is for external facing export only, do not use this for internal references,\n     * as it may cause circular dependencies in Rollup.\n     */\n\n    var types = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        MorphChartsCore: Core\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function concat(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []);\n    }\n    /**\n     * Returns array with items which are truthy.\n     * @param args array or arrays to concat into a single array.\n     */\n    function allTruthy(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n    }\n    /**\n     * Add an array to an existing array in place.\n     * @param arr Array to append to.\n     * @param items Arrof of items to append.\n     */\n    function push$1(arr, items) {\n        arr.push.apply(arr, items);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Create a new element as a child of another element.\n     * @param tagName Tag name of the new tag to create.\n     * @param parentElement Reference of the element to append to.\n     * @returns new HTMLElement.\n     */\n    function addEl(tagName, parentElement) {\n        const el = document.createElement(tagName);\n        parentElement.appendChild(el);\n        return el;\n    }\n    /**\n     * Create a new div HTMLElement as a child of another element.\n     * @param parentElement Reference of the element to append to.\n     * @param className Optional css class name to apply to the div.\n     */\n    function addDiv(parentElement, className) {\n        const div = addEl('div', parentElement);\n        if (className) {\n            div.className = className;\n        }\n        return div;\n    }\n    /**\n     * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n     * @param el HTML Element to measure.\n     */\n    function outerSize$1(el) {\n        const cs = getComputedStyle(el);\n        const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n        const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n        return { height, width };\n    }\n\n    var isMergeableObject = function isMergeableObject(value) {\n    \treturn isNonNullObject(value)\n    \t\t&& !isSpecial(value)\n    };\n\n    function isNonNullObject(value) {\n    \treturn !!value && typeof value === 'object'\n    }\n\n    function isSpecial(value) {\n    \tvar stringValue = Object.prototype.toString.call(value);\n\n    \treturn stringValue === '[object RegExp]'\n    \t\t|| stringValue === '[object Date]'\n    \t\t|| isReactElement(value)\n    }\n\n    // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n    var canUseSymbol = typeof Symbol === 'function' && Symbol.for;\n    var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\n    function isReactElement(value) {\n    \treturn value.$$typeof === REACT_ELEMENT_TYPE\n    }\n\n    function emptyTarget(val) {\n    \treturn Array.isArray(val) ? [] : {}\n    }\n\n    function cloneUnlessOtherwiseSpecified(value, options) {\n    \treturn (options.clone !== false && options.isMergeableObject(value))\n    \t\t? deepmerge$1(emptyTarget(value), value, options)\n    \t\t: value\n    }\n\n    function defaultArrayMerge(target, source, options) {\n    \treturn target.concat(source).map(function(element) {\n    \t\treturn cloneUnlessOtherwiseSpecified(element, options)\n    \t})\n    }\n\n    function mergeObject(target, source, options) {\n    \tvar destination = {};\n    \tif (options.isMergeableObject(target)) {\n    \t\tObject.keys(target).forEach(function(key) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    \t\t});\n    \t}\n    \tObject.keys(source).forEach(function(key) {\n    \t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    \t\t} else {\n    \t\t\tdestination[key] = deepmerge$1(target[key], source[key], options);\n    \t\t}\n    \t});\n    \treturn destination\n    }\n\n    function deepmerge$1(target, source, options) {\n    \toptions = options || {};\n    \toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    \toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n    \tvar sourceIsArray = Array.isArray(source);\n    \tvar targetIsArray = Array.isArray(target);\n    \tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n    \tif (!sourceAndTargetTypesMatch) {\n    \t\treturn cloneUnlessOtherwiseSpecified(source, options)\n    \t} else if (sourceIsArray) {\n    \t\treturn options.arrayMerge(target, source, options)\n    \t} else {\n    \t\treturn mergeObject(target, source, options)\n    \t}\n    }\n\n    deepmerge$1.all = function deepmergeAll(array, options) {\n    \tif (!Array.isArray(array)) {\n    \t\tthrow new Error('first argument should be an array')\n    \t}\n\n    \treturn array.reduce(function(prev, next) {\n    \t\treturn deepmerge$1(prev, next, options)\n    \t}, {})\n    };\n\n    var deepmerge_1 = deepmerge$1;\n\n    var _deepmerge = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        default: deepmerge_1\n    });\n\n    /*!\n     * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n     *\n     * Copyright (c) 2014-2017, Jon Schlinkert.\n     * Released under the MIT License.\n     */\n\n    function isObject(o) {\n      return Object.prototype.toString.call(o) === '[object Object]';\n    }\n\n    function isPlainObject(o) {\n      var ctor,prot;\n\n      if (isObject(o) === false) return false;\n\n      // If has modified constructor\n      ctor = o.constructor;\n      if (ctor === undefined) return true;\n\n      // If has modified prototype\n      prot = ctor.prototype;\n      if (isObject(prot) === false) return false;\n\n      // If constructor does not have an Object-specific method\n      if (prot.hasOwnProperty('isPrototypeOf') === false) {\n        return false;\n      }\n\n      // Most likely a plain Object\n      return true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const deepmerge = (deepmerge_1 || _deepmerge);\n    function clone(objectToClone) {\n        if (!objectToClone)\n            return objectToClone;\n        return deepmerge.all([objectToClone]);\n    }\n    const dontMerge = (destination, source) => source;\n    function deepMerge(...objectsToMerge) {\n        const objects = objectsToMerge.filter(Boolean);\n        return deepmerge.all(objects, { arrayMerge: dontMerge, isMergeableObject: isPlainObject });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function rgbToDeckglColor(c) {\n        return [c.r, c.g, c.b, c.opacity * 255];\n    }\n    /**\n     * Compares 2 colors to see if they are equal.\n     * @param a RGBAColor to compare\n     * @param b RGBAColor to compare\n     * @returns True if colors are equal.\n     */\n    function colorIsEqual(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    /**\n     * Convert a CSS color string to a Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n     * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n     */\n    function colorFromString(cssColorSpecifier) {\n        if (cssColorSpecifier) {\n            const dc = color(cssColorSpecifier);\n            if (dc) {\n                const c = dc.rgb();\n                return rgbToDeckglColor(c);\n            }\n        }\n    }\n    /**\n     * Convert a Deck.gl color to a CSS rgba() string.\n     * @param color A Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n     */\n    function colorToString(color) {\n        const c = [...color];\n        if (c.length > 3) {\n            c[3] /= 255;\n        }\n        return `rgba(${c.join(',')})`;\n    }\n    function desaturate(color, value) {\n        const rgb = rgb$1(color[0], color[1], color[2], color[3] / 255);\n        const hslColor = hsl(rgb);\n        hslColor.s = value;\n        const c = hslColor.rgb();\n        return rgbToDeckglColor(c);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * This file is for external facing export only, do not use this for internal references,\n     * as it may cause circular dependencies in Rollup.\n     */\n\n    var util$1 = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        addDiv: addDiv,\n        addEl: addEl,\n        allTruthy: allTruthy,\n        clone: clone,\n        colorFromString: colorFromString,\n        colorIsEqual: colorIsEqual,\n        colorToString: colorToString,\n        concat: concat,\n        createElement: createElement,\n        deepMerge: deepMerge,\n        desaturate: desaturate,\n        getActiveElementInfo: getActiveElementInfo,\n        mount: mount,\n        outerSize: outerSize$1,\n        push: push$1,\n        setActiveElement: setActiveElement\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const minHeight = '100px';\n    const minWidth = '100px';\n    const defaultPresenterStyle$1 = {\n        cssPrefix: 'vega-morphcharts-',\n        defaultCubeColor: [128, 128, 128, 255],\n        highlightColor: [0, 0, 0, 255],\n    };\n    const defaultPresenterConfig = {\n        onCubeClick: (e, cube) => { },\n        onCubeHover: (e, cube) => { },\n        transitionDurations: {\n            position: 600,\n            stagger: 600,\n            view: 600,\n        },\n        renderer: {\n            advanced: false,\n            advancedOptions: {},\n            basicOptions: {\n                antialias: true,\n            },\n        },\n    };\n    function createStage(view) {\n        const stage = {\n            view,\n            cubeData: [],\n            pathData: [],\n            axes: {\n                x: [],\n                y: [],\n                z: [],\n            },\n            gridLines: [],\n            textData: [],\n            legend: {\n                rows: {},\n            },\n            facets: [],\n        };\n        return stage;\n    }\n    const groupStrokeWidth = 1;\n    const lineZ = 0;\n    const defaultView$1 = '2d';\n    const minZ = 0.5;\n    const min3dDepth = 0.05;\n    const minPixelSize = 0.5;\n    const zAxisEncodeColor = [7, 7, 7, 255];\n    const zAxisOutColor = [0, 0, 0, 255];\n    function defaultOnAxisItem(vegaItem, stageItem, stage, currAxis) {\n        if (colorIsEqual(stageItem.color, zAxisEncodeColor)) {\n            stageItem.color = zAxisOutColor;\n            if (currAxis.axisRole !== 'z') {\n                const previousAxisRole = removeCurrentAxes(stage, currAxis);\n                if (previousAxisRole) {\n                    currAxis.axisRole = 'z';\n                    stage.axes.z.push(currAxis);\n                }\n            }\n        }\n    }\n    function removeCurrentAxes(stage, currAxis) {\n        //find the current axis, remove it from parent\n        for (const axisRole in stage.axes) {\n            const axes = stage.axes[axisRole];\n            for (let i = 0; i < axes.length; i++) {\n                if (axes[i] === currAxis) {\n                    axes.splice(i, 1);\n                    return axisRole;\n                }\n            }\n        }\n    }\n\n    var defaults = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        createStage: createStage,\n        defaultOnAxisItem: defaultOnAxisItem,\n        defaultPresenterConfig: defaultPresenterConfig,\n        defaultPresenterStyle: defaultPresenterStyle$1,\n        defaultView: defaultView$1,\n        groupStrokeWidth: groupStrokeWidth,\n        lineZ: lineZ,\n        min3dDepth: min3dDepth,\n        minHeight: minHeight,\n        minPixelSize: minPixelSize,\n        minWidth: minWidth,\n        minZ: minZ\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const vega = {\n        CanvasHandler: null,\n        inferType: null,\n        inferTypes: null,\n        loader: null,\n        parse: null,\n        read: null,\n        renderModule: null,\n        Renderer: null,\n        sceneVisit: null,\n        scheme: null,\n        truncate: null,\n        View: null,\n    };\n    /**\n     * References to dependency libraries.\n     */\n    const base = {\n        vega,\n    };\n    /**\n     * Specify the dependency libraries to use for rendering.\n     * @param vega Vega library.\n     */\n    function use$1(vega) {\n        base.vega = vega;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * HTML elements outputted by the presenter.\n     */\n    var PresenterElement;\n    (function (PresenterElement) {\n        PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n        PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n        PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n        PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n        PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n    })(PresenterElement || (PresenterElement = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const LegendView = (props) => {\n        const rows = [];\n        const addRow = (row, i) => {\n            const fn = symbolMap[row.symbol.shape];\n            let jsx;\n            if (fn) {\n                jsx = fn(row.symbol);\n            }\n            else {\n                jsx = createElement(\"span\", null, \"x\");\n                //console.log(`need to render ${row.symbol.shape} symbol shape`);\n            }\n            rows.push({\n                cells: [\n                    { className: 'symbol', content: jsx },\n                    { className: 'label', content: row.label, title: row.label },\n                ],\n            });\n        };\n        const sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n        sorted.forEach(i => addRow(props.legend.rows[i]));\n        if (sorted.length) {\n            return (createElement(Table$1, { rows: rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\"tr\", { onClick: e => props.onClick(e, props.legend, null) },\n                createElement(\"th\", { colSpan: 2 }, props.legend.title))));\n        }\n    };\n    const symbolMap = {\n        square: function (symbol) {\n            return (createElement(\"div\", { style: {\n                    height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                    width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                    backgroundColor: symbol.fill,\n                    borderColor: symbol.fill,\n                } }));\n        },\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function initializePanel(presenter) {\n        const rootDiv = (createElement(\"div\", { className: className(PresenterElement.root, presenter) },\n            createElement(\"div\", { className: className(PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n            createElement(\"div\", { className: className(PresenterElement.panel, presenter) },\n                createElement(\"div\", { className: className(PresenterElement.vegaControls, presenter) }),\n                createElement(\"div\", { className: className(PresenterElement.legend, presenter) }))));\n        mount(rootDiv, presenter.el);\n    }\n    function className(type, presenter) {\n        return `${presenter.style.cssPrefix}${PresenterElement[type]}`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function patchCubeArray(allocatedSize, empty, cubes) {\n        const patched = new Array(allocatedSize);\n        patched.fill(empty);\n        cubes.forEach(cube => patched[cube.ordinal] = cube);\n        return patched;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const legendMap = {\n        'legend-title': function (legend, textItem) {\n            legend.title = textItem.text;\n        },\n        'legend-symbol': function (legend, symbol) {\n            const { bounds, fill, shape } = symbol;\n            //this object is safe for serialization\n            const legendRowSymbol = { bounds, fill, shape };\n            const i = symbol.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            legend.rows[i].symbol = legendRowSymbol;\n        },\n        'legend-label': function (legend, label) {\n            const i = label.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            const row = legend.rows[i];\n            row.label = label.text;\n            row.value = label.datum.value;\n        },\n    };\n    const markStager$5 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const fn = legendMap[item.mark.role];\n            if (fn) {\n                fn(stage.legend, item);\n            }\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$4 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const { bounds, height, url, width } = item;\n            let { x1, x2, y1, y2 } = bounds;\n            x1 += x;\n            x2 += x;\n            y1 += y;\n            y2 += y;\n            if (!stage.backgroundImages) {\n                stage.backgroundImages = [];\n            }\n            stage.backgroundImages.push({ bounds: { x1, x2, y1, y2 }, height, url, width });\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$3 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const noZ = item.z === undefined;\n            const z = noZ ? 0 : (item.z || 0) + minZ;\n            const depth = (noZ ? 0 : (item.depth || 0)) + min3dDepth;\n            //change direction of y from SVG to GL\n            const ty = -1;\n            const ordinal = options.assignCubeOrdinal(item.datum);\n            if (ordinal > options.maxOrdinal) {\n                options.maxOrdinal = ordinal;\n            }\n            if (ordinal === undefined) ;\n            else {\n                const cube = {\n                    ordinal,\n                    size: [item.width, item.height, depth],\n                    position: [x + ((+item.x) || 0), ty * (y + ((+item.y) || 0)) - (+item.height), z],\n                    color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128],\n                };\n                cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n                stage.cubeData.push(cube);\n            }\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$2 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const x1 = item.x || 0;\n            const y1 = item.y || 0;\n            const x2 = item.x2 != null ? item.x2 : x1;\n            const y2 = item.y2 != null ? item.y2 : y1;\n            const lineItem = styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n            const { currAxis } = options;\n            if (options.modifyAxis) {\n                options.modifyAxis(item, lineItem, stage, currAxis);\n            }\n            if (item.mark.role === 'axis-tick') {\n                currAxis.ticks.push(lineItem);\n            }\n            else if (item.mark.role === 'axis-domain') {\n                currAxis.domain = lineItem;\n            }\n            else {\n                stage.gridLines.push(lineItem);\n            }\n        });\n    };\n    function styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n        const line = {\n            sourcePosition: [x1, -y1, lineZ], //-1 = change direction of y from SVG to GL\n            targetPosition: [x2, -y2, lineZ],\n            color: colorFromString(stroke),\n            strokeWidth: strokeWidth,\n        };\n        return line;\n    }\n    function box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n        const lines = [\n            styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n            styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n            styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n            styledLine(gx, gy + height, gx, gy, stroke, strokeWidth),\n        ];\n        if (diagonals) {\n            lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n            lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n        }\n        return lines;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //change direction of y from SVG to GL\n    const ty = -1;\n    const markStager$1 = (options, stage, scene, x, y, groupType) => {\n        const g = Object.assign({ opacity: 1, strokeOpacity: 1, strokeWidth: 1 }, scene.items[0]);\n        const path = {\n            strokeWidth: g.strokeWidth,\n            strokeColor: colorFromString(g.stroke),\n            positions: scene.items.map((it) => [\n                it.x,\n                ty * it.y,\n                it.z || 0,\n            ]),\n        };\n        path.strokeColor[3] *= g.strokeOpacity;\n        path.strokeColor[3] *= g.opacity;\n        stage.pathData.push(path);\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    // import { AlignmentBaseline, TextAnchor } from '@deck.gl/layers/text-layer/text-layer';\n    const markStager = (options, stage, scene, x, y, groupType) => {\n        //change direction of y from SVG to GL\n        const ty = -1;\n        base.vega.sceneVisit(scene, function (item) {\n            if (!item.text)\n                return;\n            const size = item.fontSize;\n            //const alignmentBaseline = convertBaseline(item.baseline);\n            //const yOffset = alignmentBaseline === 'top' ? item.fontSize / 2 : 0;    //fixup to get tick text correct\n            const yOffset = 0;\n            const textItem = {\n                color: colorFromString(item.fill),\n                text: item.limit === undefined ? item.text : base.vega.truncate(item.text, item.limit, 'right', item.ellipsis || '...'), //use dots instead of unicode ellipsis for\n                position: [x + (item.x || 0), ty * (y + (item.y || 0) + yOffset), 0],\n                size,\n                angle: convertAngle(item.angle),\n                //textAnchor: convertAlignment(item.align),\n                //alignmentBaseline,\n                metaData: item.metaData,\n            };\n            const { currAxis } = options;\n            if (options.modifyAxis) {\n                options.modifyAxis(item, textItem, stage, currAxis);\n            }\n            if (item.mark.role === 'axis-label') {\n                const tickText = textItem;\n                tickText.value = item.datum.value;\n                currAxis.tickText.push(tickText);\n            }\n            else if (item.mark.role === 'axis-title') {\n                currAxis.title = textItem;\n            }\n            else {\n                stage.textData.push(textItem);\n            }\n        });\n    };\n    function convertAngle(vegaTextAngle) {\n        if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n            return 360 - vegaTextAngle;\n        }\n        return 0;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    var GroupType;\n    (function (GroupType) {\n        GroupType[GroupType[\"none\"] = 0] = \"none\";\n        GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n        GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n        GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n        GroupType[GroupType[\"zAxis\"] = 4] = \"zAxis\";\n    })(GroupType || (GroupType = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getAxisGroupType(item, options) {\n        const axisItem = item;\n        const axisMark = axisItem === null || axisItem === void 0 ? void 0 : axisItem.mark;\n        if ((axisMark === null || axisMark === void 0 ? void 0 : axisMark.zindex) === options.zAxisZindex && options.zAxisZindex !== undefined) {\n            return GroupType.zAxis;\n        }\n        switch (axisItem.orient) {\n            case 'bottom':\n            case 'top':\n                return GroupType.xAxis;\n            case 'left':\n            case 'right':\n                return GroupType.yAxis;\n        }\n    }\n    function convertGroupRole(item, options) {\n        if (item.mark.role === 'legend')\n            return GroupType.legend;\n        if (item.mark.role === 'axis') {\n            const groupType = getAxisGroupType(item, options);\n            if (groupType !== undefined) {\n                return groupType;\n            }\n        }\n    }\n    const group = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (g) {\n            const gx = g.x || 0, gy = g.y || 0;\n            if (g.context && g.context.background && !stage.backgroundColor) {\n                stage.backgroundColor = colorFromString(g.context.background);\n            }\n            if (g.stroke) {\n                const facetRect = {\n                    datum: g.datum,\n                    lines: box(gx + x, gy + y, g.height, g.width, g.stroke, groupStrokeWidth),\n                };\n                stage.facets.push(facetRect);\n            }\n            groupType = convertGroupRole(g, options) || groupType;\n            setCurrentAxis(options, stage, groupType);\n            // draw group contents\n            base.vega.sceneVisit(g, function (item) {\n                mainStager(options, stage, item, gx + x, gy + y, groupType);\n            });\n        });\n    };\n    function setCurrentAxis(options, stage, groupType) {\n        let axisRole;\n        switch (groupType) {\n            case GroupType.xAxis:\n                axisRole = 'x';\n                break;\n            case GroupType.yAxis:\n                axisRole = 'y';\n                break;\n            case GroupType.zAxis:\n                axisRole = 'z';\n                break;\n            default:\n                return;\n        }\n        options.currAxis = {\n            axisRole,\n            domain: null,\n            tickText: [],\n            ticks: [],\n        };\n        stage.axes[axisRole].push(options.currAxis);\n    }\n    const markStagers = {\n        group,\n        legend: markStager$5,\n        image: markStager$4,\n        rect: markStager$3,\n        rule: markStager$2,\n        line: markStager$1,\n        text: markStager,\n    };\n    const mainStager = (options, stage, scene, x, y, groupType) => {\n        if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n            markStager$5(options, stage, scene);\n        }\n        else {\n            const markStager = markStagers[scene.marktype];\n            if (markStager) {\n                markStager(options, stage, scene, x, y, groupType);\n            }\n        }\n    };\n    function sceneToStage(options, stage, scene) {\n        mainStager(options, stage, scene, 0, 0, null);\n        sortAxis(stage.axes.x, 0);\n        sortAxis(stage.axes.y, 1);\n        sortAxis(stage.axes.z, 1);\n    }\n    function sortAxis(axes, dim) {\n        axes.forEach(axis => {\n            if (axis.domain)\n                orderDomain(axis.domain, dim);\n            axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n            axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n        });\n    }\n    function orderDomain(domain, dim) {\n        if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n            const temp = domain.targetPosition;\n            domain.targetPosition = domain.sourcePosition;\n            domain.sourcePosition = temp;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function outerBounds(b1, b2) {\n        if (!b1 && !b2)\n            return;\n        if (!b1)\n            return b2;\n        if (!b2)\n            return b1;\n        const minProps = [\n            'minBoundsX',\n            'minBoundsY',\n            'minBoundsZ',\n        ];\n        const maxProps = [\n            'maxBoundsX',\n            'maxBoundsY',\n            'maxBoundsZ',\n        ];\n        const result = {};\n        minProps.forEach(p => result[p] = notNull(Math.min, b1[p], b2[p]));\n        maxProps.forEach(p => result[p] = notNull(Math.max, b1[p], b2[p]));\n        return result;\n    }\n    function notNull(fn, v1, v2) {\n        if (v1 == null && v2 == null)\n            return null;\n        if (v1 == null)\n            return v2;\n        if (v2 == null)\n            return v1;\n        return fn(v1, v2);\n    }\n    function increment(b, minBoundsX, minBoundsY, minBoundsZ, maxBoundsX, maxBoundsY, maxBoundsZ) {\n        return outerBounds(b, {\n            minBoundsX,\n            minBoundsY,\n            minBoundsZ,\n            maxBoundsX,\n            maxBoundsY,\n            maxBoundsZ,\n        });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const createAxesLayer = (props) => {\n        const { config, height, ref, stage } = props;\n        const { core } = ref;\n        const { renderer } = core;\n        const { x, y, z } = stage.axes;\n        const xyz = [...x, ...y, ...z];\n        renderer.currentAxes = [];\n        if (!xyz.length) {\n            renderer.axesVisibility = AxesVisibility.none;\n            return;\n        }\n        renderer.axesVisibility = AxesVisibility.current;\n        const correlation = new AxesCorrelation(stage, 3);\n        const { axesSets, labels } = correlation;\n        const grid = correlation.getGrid();\n        if (grid.byColumn[0]) {\n            grid.byColumn[0].forEach(row => { row.axesSet.showFacetTitleY = true; });\n            grid.byRow[0].forEach(col => { col.axesSet.showFacetTitleX = true; });\n        }\n        if (grid.rows > 1) {\n            const { byRow } = grid;\n            byRow[0].forEach(({ axesSet }, col) => {\n                if (!axesSet.y) {\n                    if (byRow[1][col].axesSet) {\n                        //move x up\n                        byRow[1][col].axesSet.x.tickText = axesSet.x.tickText;\n                        byRow[1][col].axesSet.showFacetTitleX = axesSet.showFacetTitleX;\n                        delete axesSet.x;\n                    }\n                }\n            });\n        }\n        let bounds;\n        const allAxesSetBounds = [];\n        let anyZ = false;\n        for (let i = 0; i < axesSets.length; i++) {\n            if (axesSets[i].z) {\n                anyZ = true;\n                break;\n            }\n        }\n        const is3d = stage.view === '3d' && anyZ;\n        axesSets.forEach(axesSet => {\n            if (!axesSet.x && !axesSet.y)\n                return;\n            const axesSetBounds = {\n                axesSet,\n                maxBoundsX: null,\n                maxBoundsY: null,\n                maxBoundsZ: null,\n                minBoundsX: null,\n                minBoundsY: null,\n                minBoundsZ: null,\n            };\n            if (is3d) {\n                const zBounds = getDomainBounds(1, axesSet.z);\n                axesSetBounds.minBoundsZ = -zBounds.maxBounds;\n                axesSetBounds.maxBoundsZ = -zBounds.minBounds;\n            }\n            const yBounds = getDomainBounds(1, axesSet.y);\n            axesSetBounds.minBoundsY = yBounds.minBounds;\n            axesSetBounds.maxBoundsY = yBounds.maxBounds;\n            axesSetBounds.y = yBounds.minBounds;\n            axesSetBounds.h = yBounds.maxBounds - yBounds.minBounds;\n            const xBounds = getDomainBounds(0, axesSet.x);\n            axesSetBounds.minBoundsX = xBounds.minBounds;\n            axesSetBounds.maxBoundsX = xBounds.maxBounds;\n            axesSetBounds.x = xBounds.minBounds;\n            axesSetBounds.w = xBounds.maxBounds - xBounds.minBounds;\n            allAxesSetBounds.push(axesSetBounds);\n            bounds = outerBounds(bounds, axesSetBounds);\n        });\n        const facetLabelX = labels.filter(label => label.axisRole === 'x')[0];\n        const facetLabelY = labels.filter(label => label.axisRole === 'y')[0];\n        core.inputManager.pickAxesTitleCallback = ({ axis, axes, manipulator }) => {\n            const axesSet = axesSets[axes];\n            let a;\n            let f;\n            switch (axis) {\n                case 0: {\n                    a = axesSet.x;\n                    f = facetLabelX;\n                    break;\n                }\n                case 1: {\n                    a = axesSet.y;\n                    f = facetLabelY;\n                    break;\n                }\n                case 2: {\n                    a = axesSet.z;\n                    break;\n                }\n            }\n            if (a) {\n                config.onTextClick(manipulator.event, a.title || f.title);\n            }\n        };\n        allAxesSetBounds.forEach(axesSetBounds => {\n            const { axesSet } = axesSetBounds;\n            if (!axesSet.x && !axesSet.y)\n                return;\n            const cartesian = new (is3d ? Cartesian3dAxes : Cartesian2dAxes)(core);\n            cartesian.isDivisionPickingEnabled = [false, false, false];\n            cartesian.arePickDivisionsVisible = [false, false, false];\n            cartesian.isLabelPickingEnabled = [false, false, false];\n            cartesian.isTitlePickingEnabled = [false, false, false];\n            cartesian.isGridPickingEnabled = false;\n            cartesian.isHeadingPickingEnabled = [false, false, false];\n            createAxes(cartesian, 0, 0, axesSet.x, AxesTextOrientation.perpendicular, height, props, axesSet.showFacetTitleX && facetLabelX);\n            createAxes(cartesian, 1, 1, axesSet.y, AxesTextOrientation.perpendicular, height, props, axesSet.showFacetTitleY && facetLabelY);\n            if (is3d) {\n                createAxes(cartesian, 1, 2, axesSet.z, AxesTextOrientation.perpendicular, height, props);\n            }\n            configCartesianAxes(is3d, bounds, cartesian);\n            const { maxBoundsX, maxBoundsY, minBoundsX, minBoundsY, } = bounds;\n            const w = maxBoundsX - minBoundsX;\n            const h = maxBoundsY - minBoundsY;\n            cartesian.scalingX = axesSetBounds.w / w;\n            cartesian.scalingY = axesSetBounds.h / h;\n            cartesian.offsetX = ((axesSetBounds.x - minBoundsX + axesSetBounds.w / 2) / w) - 0.5;\n            cartesian.offsetY = ((axesSetBounds.y - minBoundsY + axesSetBounds.h / 2) / h) - 0.5;\n            const aspect = (h / w);\n            if (aspect > 1) {\n                cartesian.offsetX /= aspect;\n            }\n            else {\n                cartesian.offsetY *= aspect;\n            }\n            const axes = is3d ? renderer.createCartesian3dAxesVisual(cartesian) : renderer.createCartesian2dAxesVisual(cartesian);\n            renderer.currentAxes.push(axes);\n            props.config.onAxesComplete && props.config.onAxesComplete(cartesian);\n        });\n        return { bounds };\n    };\n    const nullDomain = {\n        sourcePosition: [0, 0, 0],\n        targetPosition: [0, 0, 0],\n    };\n    class AxesCorrelation {\n        constructor(stage, dimensions) {\n            this.dimensions = dimensions;\n            const { x, y, z } = stage.axes;\n            this.axesSets = [];\n            this.labels = [];\n            [x, y, z].forEach(axes => {\n                axes.forEach(axis => {\n                    if (this.axesSets.length === 0) {\n                        this.initialize(axis);\n                    }\n                    else {\n                        this.correlate(axis);\n                    }\n                });\n            });\n        }\n        getGrid() {\n            const mapCols = {};\n            const mapRows = {};\n            this.axesSets.forEach(axesSet => {\n                var _a;\n                const domain = (_a = axesSet === null || axesSet === void 0 ? void 0 : axesSet.x) === null || _a === void 0 ? void 0 : _a.domain;\n                if (!domain)\n                    return;\n                const col = domain.sourcePosition[0].toString();\n                const row = domain.sourcePosition[1].toString();\n                if (!mapCols[col]) {\n                    mapCols[col] = {};\n                }\n                mapCols[col][row] = axesSet;\n                mapRows[row] = null;\n            });\n            const colKeys = Object.keys(mapCols).sort((a, b) => +a - +b);\n            const rowKeys = Object.keys(mapRows).sort((a, b) => +a - +b);\n            return {\n                cols: colKeys.length,\n                rows: rowKeys.length,\n                byColumn: colKeys.map(colKey => rowKeys.map(rowKey => { return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] }; })),\n                byRow: rowKeys.map(rowKey => colKeys.map(colKey => { return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] }; })),\n            };\n        }\n        initialize(axis) {\n            if (!axis.domain) {\n                this.labels.push(axis);\n                return;\n            }\n            const axesSet = {};\n            axesSet[axis.axisRole] = axis;\n            this.axesSets.push(axesSet);\n        }\n        correlate(axis) {\n            if (!axis.domain) {\n                this.labels.push(axis);\n                return;\n            }\n            for (let i = 0; i < this.axesSets.length; i++) {\n                const axesSet = this.axesSets[i];\n                for (const axisRole in axesSet) {\n                    const test = axesSet[axisRole];\n                    if (this.matchDomains(axis.domain, test.domain)) {\n                        //prefer the axes with titles\n                        if (!axesSet[axis.axisRole] || (!axesSet[axis.axisRole].tickText.length && axis.tickText.length)) {\n                            axesSet[axis.axisRole] = axis;\n                        }\n                        return;\n                    }\n                }\n            }\n            this.initialize(axis);\n        }\n        matchDomains(a, b) {\n            if (this.matchPoint(a.sourcePosition, b.sourcePosition))\n                return true;\n            if (this.matchPoint(a.sourcePosition, b.targetPosition))\n                return true;\n            if (this.matchPoint(a.targetPosition, b.targetPosition))\n                return true;\n            if (this.matchPoint(a.targetPosition, b.sourcePosition))\n                return true;\n            return false;\n        }\n        matchPoint(a, b) {\n            for (let i = 0; i < this.dimensions; i++) {\n                if (a[i] !== b[i])\n                    return false;\n            }\n            return true;\n        }\n    }\n    function createAxes(cartesian, dim2d, dim3d, axis, orientation, height, props, facetLabel) {\n        const domain = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n        const { tickPositions, tickText, textPos, textSize } = convertAxis(axis, domain, dim2d, height);\n        if (axis.axisRole === 'z') {\n            tickPositions.forEach((t, i) => tickPositions[i] = 1 - t);\n            textPos.forEach((t, i) => textPos[i] = 1 - t);\n            tickText.reverse();\n            tickPositions.reverse();\n            textPos.reverse();\n        }\n        cartesian.setTickPositions(dim3d, tickPositions);\n        cartesian.zero[dim3d] = 0; //TODO get any \"zero\" gridline position from vega\n        cartesian.setLabelPositions(dim3d, textPos);\n        cartesian.setLabels(dim3d, tickText);\n        cartesian.setLabelSizes(dim3d, textSize);\n        const title = (axis === null || axis === void 0 ? void 0 : axis.title) || (facetLabel === null || facetLabel === void 0 ? void 0 : facetLabel.title);\n        if (title === null || title === void 0 ? void 0 : title.text) {\n            cartesian.setTitle(dim3d, title.text);\n            cartesian.setTitleSize(dim3d, title.size / height);\n        }\n        cartesian.setLabelOrientation(dim3d, orientation);\n        props.config.onAxisConfig && props.config.onAxisConfig(cartesian, dim3d, axis);\n        return {\n            tickText,\n        };\n    }\n    function configCartesianAxes(is3d, bounds, cartesian) {\n        if (is3d) {\n            cartesian.isEdgeVisible[Edge3D.topBack] = false;\n        }\n        cartesian.isEdgeVisible[Edge3D.backRight] = false;\n        cartesian.isEdgeVisible[Edge3D.bottomRight] = false;\n        cartesian.isEdgeVisible[Edge3D.frontRight] = false;\n        cartesian.isEdgeVisible[Edge3D.topFront] = false;\n        cartesian.isEdgeVisible[Edge3D.topRight] = false;\n        const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ, } = bounds;\n        cartesian.minBoundsX = minBoundsX;\n        cartesian.maxBoundsX = maxBoundsX;\n        cartesian.minBoundsY = minBoundsY;\n        cartesian.maxBoundsY = maxBoundsY;\n        if (is3d) {\n            cartesian.minBoundsZ = minBoundsZ;\n            cartesian.maxBoundsZ = maxBoundsZ;\n        }\n    }\n    function getDomainBounds(dim2d, axis) {\n        const domain = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n        const minBounds = domain.sourcePosition[dim2d];\n        const maxBounds = domain.targetPosition[dim2d];\n        return {\n            maxBounds,\n            minBounds,\n        };\n    }\n    function convertAxis(axis, domain, dim, height) {\n        const start = domain.sourcePosition[dim];\n        const span = domain.targetPosition[dim] - start;\n        const tickPositions = axis\n            ?\n                axis.ticks.map(t => (t.sourcePosition[dim] - start) / span)\n            :\n                [];\n        const tickText = axis ?\n            axis.tickText.map(t => t.text)\n            :\n                [];\n        const textPos = axis ?\n            axis.tickText.map(t => (t.position[dim] - start) / span)\n            :\n                [];\n        const textSize = axis ?\n            axis.tickText.map(t => t.size / height)\n            :\n                [];\n        if (tickPositions.length) {\n            if (tickPositions[0] !== 0) {\n                tickPositions[0] = 0;\n            }\n            if (tickPositions[tickPositions.length - 1] !== 1) {\n                tickPositions[tickPositions.length - 1] = 1;\n            }\n        }\n        return {\n            tickPositions,\n            tickText,\n            textPos,\n            textSize,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class ColorMap {\n        constructor(quant = 5) {\n            this.quant = quant;\n            this.colorMap = {};\n            this.colorArray = [];\n        }\n        getColorKey(rgbaColor) {\n            const color = rgbaColor.slice(0, 3).map(e => Math.floor(e / this.quant) * this.quant);\n            color[3] = rgbaColor[3]; //retain alpha\n            return JSON.stringify(color);\n        }\n        registerColor(rgbaColor) {\n            const colorKey = this.getColorKey(rgbaColor);\n            if (!this.colorMap[colorKey]) {\n                this.colorMap[colorKey] = {\n                    index: this.colorArray.length,\n                    rgbaColor,\n                };\n                this.colorArray.push(rgbaColor);\n            }\n            return this.colorMap[colorKey].index;\n        }\n        getPalette() {\n            return {\n                palette: new Uint8Array(this.colorArray.flat()),\n                maxColor: this.colorArray.length - 1,\n            };\n        }\n    }\n    function convert$3(newColor) {\n        const c = colorFromString(newColor).slice(0, 3);\n        return c.map(v => v / 255);\n    }\n    function colorConfig(ref, colors) {\n        if (!colors)\n            return;\n        const { config } = ref.core;\n        config.activeColor = convert$3(colors.activeItemColor);\n        config.backgroundColor = new Float32Array(convert$3(colors.backgroundColor));\n        config.textColor = convert$3(colors.textColor);\n        config.textBorderColor = convert$3(colors.textBorderColor);\n        config.axesTextColor = convert$3(colors.axesTextLabelColor);\n        config.axesGridBackgroundColor = convert$3(colors.axesGridBackgroundColor);\n        config.axesGridHighlightColor = convert$3(colors.axesGridHighlightColor);\n        config.axesGridMinorColor = convert$3(colors.axesGridMinorColor);\n        config.axesGridMajorColor = convert$3(colors.axesGridMajorColor);\n        config.axesGridZeroColor = convert$3(colors.axesGridZeroColor);\n        //TODO fix this - hack to reset the background color\n        ref.core.renderer['_theme'] = null;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const key$1 = 'cube';\n    const createCubeLayer = (props) => {\n        const { ref, stage } = props;\n        const { core } = ref;\n        const scatter = new Scatter(core);\n        const { ids, colors, positionsX, positionsY, positionsZ, sizesX, sizesY, sizesZ, bounds, maxColor, palette, } = convert$2(stage);\n        if (!ids.length)\n            return;\n        const { renderer } = core;\n        let cubeTransitionBuffer = renderer.transitionBuffers.find(t => t.key === key$1);\n        if (!cubeTransitionBuffer) {\n            cubeTransitionBuffer = renderer.createTransitionBuffer(ids);\n            cubeTransitionBuffer.key = key$1;\n            renderer.transitionBuffers.push(cubeTransitionBuffer);\n        }\n        else {\n            cubeTransitionBuffer.swap();\n        }\n        scatter.layout(cubeTransitionBuffer.currentBuffer, ids, {\n            positionsX,\n            positionsY,\n            positionsZ,\n        });\n        const layer = {\n            positionsX,\n            positionsY,\n            positionsZ,\n            update: (newBounds, selected, stagger) => {\n                const { colors, maxColor, minColor, palette } = layer.unitColorMap;\n                // reference off of core.renderer to get the actual buffer\n                const currCubeTransitionBuffer = core.renderer.transitionBuffers.find(t => t.key === key$1);\n                currCubeTransitionBuffer.currentBuffer.unitType = UnitType.block;\n                currCubeTransitionBuffer.currentPalette.colors = palette;\n                let options = Object.assign({ selected,\n                    colors,\n                    minColor,\n                    maxColor,\n                    sizesX,\n                    sizesY,\n                    sizesZ }, newBounds);\n                if (stagger === null || stagger === void 0 ? void 0 : stagger.staggerOrders) {\n                    const { maxStaggerOrder, minStaggerOrder, staggerOrders } = stagger;\n                    options = Object.assign(Object.assign({}, options), { maxStaggerOrder,\n                        minStaggerOrder,\n                        staggerOrders });\n                }\n                scatter.update(currCubeTransitionBuffer.currentBuffer, ids, options);\n            },\n            bounds,\n            unitColorMap: {\n                colors,\n                ids,\n                minColor: 0,\n                maxColor,\n                palette,\n            },\n        };\n        return layer;\n    };\n    function convert$2(stage) {\n        const { cubeData } = stage;\n        const { length } = cubeData;\n        const ids = [];\n        const colors = new Float64Array(length);\n        const positionsX = new Float64Array(length);\n        const positionsY = new Float64Array(length);\n        const positionsZ = new Float64Array(length);\n        const sizesX = new Float64Array(length);\n        const sizesY = new Float64Array(length);\n        const sizesZ = new Float64Array(length);\n        let bounds;\n        const colorMap = new ColorMap();\n        cubeData.forEach((cube, i) => {\n            ids.push(i);\n            if (cube.isEmpty) {\n                positionsX[i] = 0;\n                positionsY[i] = 0;\n                positionsZ[i] = 0;\n                sizesX[i] = 0;\n                sizesY[i] = 0;\n                sizesZ[i] = 0;\n                colors[i] = 0;\n            }\n            else {\n                //ids.push(cube.ordinal);\n                positionsX[i] = cube.position[0] + cube.size[0] * 0.5;\n                positionsY[i] = cube.position[1] + cube.size[1] * 0.5;\n                positionsZ[i] = cube.position[2] + cube.size[2] * 0.5;\n                sizesX[i] = cube.size[0];\n                sizesY[i] = cube.size[1];\n                sizesZ[i] = cube.size[2];\n                bounds = increment(bounds, cube.position[0], cube.position[1], cube.position[2], cube.position[0] + cube.size[0], cube.position[1] + cube.size[1], cube.position[2] + cube.size[2]);\n                colors[i] = colorMap.registerColor(cube.color);\n            }\n        });\n        const { palette, maxColor } = colorMap.getPalette();\n        return {\n            ids: new Uint32Array(ids),\n            colors,\n            positionsX,\n            positionsY,\n            positionsZ,\n            sizesX,\n            sizesY,\n            sizesZ,\n            bounds,\n            maxColor,\n            palette,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const key = 'line';\n    const createLineLayer = (props) => {\n        const { height, ref, stage} = props;\n        const { core } = ref;\n        const lines = new Line(core);\n        const { ids, fromIds, toIds, lineColors, lineSizes, bounds, positionsX, positionsY, positionsZ, lineMaxColor, palette, } = convert$1(stage, height);\n        if (!ids.length)\n            return;\n        const { renderer } = core;\n        let lineTransitionBuffer = renderer.transitionBuffers.find(t => t.key === key);\n        if (!lineTransitionBuffer) {\n            lineTransitionBuffer = renderer.createTransitionBuffer(ids);\n            lineTransitionBuffer.key = key;\n            renderer.transitionBuffers.push(lineTransitionBuffer);\n        }\n        else {\n            lineTransitionBuffer.swap();\n        }\n        lines.layout(lineTransitionBuffer.currentBuffer, ids, fromIds, toIds, {\n            positionsX,\n            positionsY,\n            positionsZ,\n            lineSizes,\n            sizeScaling: 1,\n        });\n        let options = {\n            lineColors,\n            lineMinColor: 0,\n            lineMaxColor,\n        };\n        // Unit type\n        lineTransitionBuffer.currentBuffer.unitType = UnitType.cylinder;\n        lineTransitionBuffer.currentPalette.colors = palette;\n        return {\n            update: newBounds => {\n                options = Object.assign(Object.assign({}, options), newBounds);\n                // reference off of core.renderer to get the actual buffer\n                const currLineTransitionBuffer = core.renderer.transitionBuffers.find(t => t.key === key);\n                lines.update(currLineTransitionBuffer.currentBuffer, ids, fromIds, toIds, options);\n            },\n            bounds,\n            unitColorMap: {\n                ids,\n                colors: lineColors,\n                minColor: 0,\n                maxColor: lineMaxColor,\n                palette,\n            },\n        };\n    };\n    function convert$1(stage, height, width) {\n        const { pathData } = stage;\n        const positions = [];\n        const lines = [];\n        const colorMap = new ColorMap();\n        pathData.forEach(path => {\n            const color = colorMap.registerColor(path.strokeColor);\n            let from = positions.length;\n            positions.push(path.positions[0]);\n            for (let i = 1; i < path.positions.length; i++) {\n                const to = positions.length;\n                positions.push(path.positions[i]);\n                lines.push({\n                    id: lines.length,\n                    from,\n                    to,\n                    color,\n                    size: path.strokeWidth,\n                });\n                from = to;\n            }\n        });\n        const ids = new Uint32Array(lines.length);\n        const fromIds = new Uint32Array(lines.length);\n        const toIds = new Uint32Array(lines.length);\n        const lineColors = new Float64Array(lines.length);\n        const lineSizes = new Float64Array(lines.length);\n        lines.forEach((line, i) => {\n            ids[i] = i;\n            fromIds[i] = line.from;\n            toIds[i] = line.to;\n            lineColors[i] = line.color;\n            lineSizes[i] = line.size;\n        });\n        const positionsX = new Float64Array(positions.length);\n        const positionsY = new Float64Array(positions.length);\n        const positionsZ = new Float64Array(positions.length);\n        let bounds;\n        positions.forEach((p, i) => {\n            positionsX[i] = p[0];\n            positionsY[i] = p[1] + height;\n            positionsZ[i] = p[2];\n            bounds = increment(bounds, positionsX[i], positionsY[i], positionsZ[i], positionsX[i], positionsY[i], positionsZ[i]);\n        });\n        const { palette, maxColor: lineMaxColor } = colorMap.getPalette();\n        return {\n            ids,\n            fromIds,\n            toIds,\n            lineColors,\n            lineSizes,\n            bounds,\n            positionsX,\n            positionsY,\n            positionsZ,\n            lineMaxColor,\n            palette,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const createTextLayer = (props) => {\n        const { ref, stage } = props;\n        const { core } = ref;\n        const { positionsX, positionsY, positionsZ, sizes, bounds, maxGlyphs, text, } = convert(stage);\n        if (text.length === 0) {\n            core.renderer.labelSets = [];\n            return;\n        }\n        const options = {\n            text,\n            maxGlyphs,\n            scales: sizes,\n        };\n        const labelSet = new LabelSet(core, options);\n        labelSet.positionsX = positionsX;\n        labelSet.positionsY = positionsY;\n        labelSet.positionsZ = positionsZ;\n        labelSet.horizontalAlignment = HorizontalAlignment.center;\n        labelSet.verticalAlignment = VerticalAlignment.center;\n        const layer = {\n            update: bounds => {\n                const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ, } = bounds;\n                labelSet.minBoundsX = minBoundsX;\n                labelSet.minBoundsY = minBoundsY;\n                labelSet.minBoundsZ = minBoundsZ;\n                labelSet.maxBoundsX = maxBoundsX;\n                labelSet.maxBoundsY = maxBoundsY;\n                labelSet.maxBoundsZ = maxBoundsZ;\n            },\n            bounds,\n        };\n        const labelSetVisual = core.renderer.createLabelSetVisual(labelSet);\n        core.renderer.labelSets = [labelSetVisual];\n        return layer;\n    };\n    function convert(stage) {\n        const { textData } = stage;\n        const { length } = textData;\n        const ids = [];\n        const text = [];\n        const colors = new Float64Array(length);\n        const positionsX = new Float64Array(length);\n        const positionsY = new Float64Array(length);\n        const positionsZ = new Float64Array(length);\n        const sizes = new Float64Array(length);\n        let bounds;\n        let maxGlyphs = 0;\n        const colorMap = new ColorMap();\n        textData.forEach((t, i) => {\n            ids.push(i);\n            text.push(t.text);\n            maxGlyphs += t.text.length;\n            positionsX[i] = t.position[0];\n            positionsY[i] = t.position[1];\n            positionsZ[i] = t.position[2];\n            sizes[i] = 1.5 * t.size; //scale similar to axes\n            bounds = increment(bounds, t.position[0], t.position[1], t.position[2], t.position[0], t.position[1], t.position[2]);\n            colors[i] = colorMap.registerColor(t.color);\n        });\n        const { palette, maxColor } = colorMap.getPalette();\n        return {\n            ids: new Uint32Array(ids),\n            colors,\n            positionsX,\n            positionsY,\n            positionsZ,\n            sizes,\n            bounds,\n            maxColor,\n            maxGlyphs,\n            palette,\n            text,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getImageData(url) {\n        return new Promise((resolve, reject) => {\n            const imageElement = document.createElement('img');\n            imageElement.onload = () => {\n                const canvas = document.createElement('canvas');\n                const ctx = canvas.getContext('2d');\n                const { height, width } = imageElement;\n                canvas.width = width;\n                canvas.height = height;\n                ctx.drawImage(imageElement, 0, 0);\n                resolve(ctx.getImageData(0, 0, width, height));\n            };\n            imageElement.src = url;\n        });\n    }\n    function createImageQuad(core, imageData, bounds, position, width, height) {\n        const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds;\n        const imageOptions = {\n            imageData,\n            position,\n            height,\n            width,\n            minBoundsX,\n            maxBoundsX,\n            minBoundsZ,\n            maxBoundsZ,\n            minBoundsY,\n            maxBoundsY,\n        };\n        return new ImageQuad(core, imageOptions);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function createCameraDefaults() {\n        const qModelRotation2d = create$1();\n        const qModelRotation3d = Constants.QUAT_ROTATEX_MINUS_90;\n        const qCameraRotation2d = create$1();\n        const qCameraRotation3d = create$1();\n        const qAngle = create$1();\n        const vCameraPosition = create$3();\n        // Altitude (pitch around local right axis)\n        setAxisAngle(qCameraRotation3d, Constants.VECTOR3_UNITX, AngleHelper.degreesToRadians(30));\n        // Azimuth (yaw around global up axis)\n        setAxisAngle(qAngle, Constants.VECTOR3_UNITY, AngleHelper.degreesToRadians(-25));\n        multiply(qCameraRotation3d, qCameraRotation3d, qAngle);\n        return {\n            qModelRotation2d,\n            qModelRotation3d,\n            qCameraRotation2d,\n            qCameraRotation3d,\n            vCameraPosition,\n        };\n    }\n    const cameraDefaults = createCameraDefaults();\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n    function applyCameraCallbacks(ref, lastPresenterConfig, lastView, transistion2dOnly) {\n        const { cameraTransitioner, core, modelTransitioner, positionTransitioner } = ref;\n        ref.reset = () => {\n            core.reset(true);\n            if (lastView === '3d') {\n                modelTransitioner.qRotation.to = qModelRotation3d;\n                cameraTransitioner.qRotation.to = qCameraRotation3d;\n                cameraTransitioner.vPosition.to = vCameraPosition;\n            }\n            else {\n                modelTransitioner.qRotation.to = qModelRotation2d;\n                cameraTransitioner.qRotation.to = qCameraRotation2d;\n                cameraTransitioner.vPosition.to = vCameraPosition;\n            }\n            slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.to, modelTransitioner.qRotation.to, 0);\n            core.setModelRotation(modelTransitioner.qRotation.current, true);\n            core.camera.setOrbit(cameraTransitioner.qRotation.to, true);\n            core.camera.setPosition(cameraTransitioner.vPosition.to, true);\n        };\n        const cam = (t) => {\n            slerp(cameraTransitioner.qRotation.current, cameraTransitioner.qRotation.from, cameraTransitioner.qRotation.to, t);\n            lerp(cameraTransitioner.vPosition.current, cameraTransitioner.vPosition.from, cameraTransitioner.vPosition.to, t);\n            core.camera.setOrbit(cameraTransitioner.qRotation.current, false);\n            core.camera.setPosition(cameraTransitioner.vPosition.current, false);\n            // disable picking during transitions, as the performance degradation could reduce the framerate\n            core.inputManager.isPickingEnabled = false;\n        };\n        core.updateCallback = (elapsedTime) => {\n            const { transitionDurations } = lastPresenterConfig;\n            if (positionTransitioner.isTransitioning) {\n                const t = positionTransitioner.elapse(elapsedTime, transitionDurations.position + transitionDurations.stagger);\n                core.renderer.transitionTime = t;\n                setTransitionTimeAxesVisibility(transistion2dOnly, core);\n            }\n            else {\n                core.inputManager.isPickingEnabled = true;\n            }\n            if (modelTransitioner.isTransitioning) {\n                const tm = modelTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n                if (modelTransitioner.shouldTransition) {\n                    slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.from, modelTransitioner.qRotation.to, tm);\n                    core.setModelRotation(modelTransitioner.qRotation.current, false);\n                }\n                cam(tm);\n            }\n            if (cameraTransitioner.isTransitioning) {\n                const t = cameraTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n                cam(t);\n            }\n        };\n    }\n    function setTransitionTimeAxesVisibility(transistion2dOnly, core) {\n        const t = core.renderer.transitionTime;\n        if (transistion2dOnly) {\n            if (t < 0.5) {\n                core.renderer.axesVisibility = AxesVisibility.previous;\n            }\n            else {\n                core.renderer.axesVisibility = AxesVisibility.current;\n            }\n        }\n        else {\n            if (t <= 0.01) {\n                core.renderer.axesVisibility = AxesVisibility.previous;\n            }\n            else if (t >= 0.99) {\n                core.renderer.axesVisibility = AxesVisibility.current;\n            }\n            else {\n                core.renderer.axesVisibility = AxesVisibility.none;\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function morphChartsRender(ref, prevStage, stage, height, width, preStage, colors, config) {\n        const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n        const { core, cameraTransitioner, modelTransitioner, positionTransitioner } = ref;\n        let transistion2dOnly = false;\n        let cameraTo;\n        let holdCamera;\n        if (config.camera === 'hold') {\n            holdCamera = true;\n        }\n        else {\n            cameraTo = config.camera;\n        }\n        if (prevStage && (prevStage.view !== stage.view)) {\n            modelTransitioner.shouldTransition = !holdCamera;\n            if (stage.view === '2d') {\n                modelTransitioner.qRotation.from = qModelRotation3d;\n                modelTransitioner.qRotation.to = qModelRotation2d;\n                cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d;\n                cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n            }\n            else {\n                modelTransitioner.qRotation.from = qModelRotation2d;\n                modelTransitioner.qRotation.to = qModelRotation3d;\n                cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d;\n                cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n            }\n        }\n        else {\n            modelTransitioner.shouldTransition = false;\n            if (stage.view === '2d') {\n                transistion2dOnly = true;\n                modelTransitioner.qRotation.to = qModelRotation2d;\n                cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d;\n                cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n            }\n            else {\n                modelTransitioner.qRotation.to = qModelRotation3d;\n                cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d;\n                cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n            }\n        }\n        core.camera.getOrbit(cameraTransitioner.qRotation.from);\n        core.camera.getPosition(cameraTransitioner.vPosition.from);\n        if (!prevStage) {\n            core.setModelRotation(modelTransitioner.qRotation.to, false);\n            core.camera.setOrbit(cameraTransitioner.qRotation.to, false);\n            core.camera.setPosition(cameraTransitioner.vPosition.to, false);\n        }\n        else if (!holdCamera) {\n            cameraTransitioner.begin();\n        }\n        positionTransitioner.begin();\n        if (modelTransitioner.shouldTransition) {\n            modelTransitioner.begin();\n        }\n        const props = { ref, stage, height, config };\n        const cubeLayer = createCubeLayer(props);\n        const lineLayer = createLineLayer(props);\n        const textLayer = createTextLayer(props);\n        const { backgroundImages } = stage;\n        let contentBounds = outerBounds(outerBounds(cubeLayer === null || cubeLayer === void 0 ? void 0 : cubeLayer.bounds, lineLayer === null || lineLayer === void 0 ? void 0 : lineLayer.bounds), outerBounds(textLayer === null || textLayer === void 0 ? void 0 : textLayer.bounds, null));\n        backgroundImages === null || backgroundImages === void 0 ? void 0 : backgroundImages.forEach(backgroundImage => {\n            contentBounds = outerBounds(contentBounds, convertBounds(backgroundImage.bounds));\n        });\n        props.bounds = contentBounds;\n        core.renderer.previousAxes = core.renderer.currentAxes;\n        const axesLayer = createAxesLayer(props);\n        core.config.transitionStaggering = config.transitionDurations.stagger;\n        core.config.transitionDuration = config.transitionDurations.position;\n        let bounds;\n        if (axesLayer && axesLayer.bounds) {\n            bounds = axesLayer.bounds;\n        }\n        else {\n            bounds = contentBounds;\n        }\n        ref.setMorphChartsRendererOptions(config.renderer);\n        if (preStage) {\n            preStage(stage, cubeLayer);\n        }\n        //add images\n        core.renderer.images = [];\n        if (backgroundImages) {\n            const addImage = (imageBounds, imageData) => {\n                const imageWidth = imageBounds.maxBoundsX - imageBounds.minBoundsX;\n                const imageHeight = imageBounds.maxBoundsY - imageBounds.minBoundsY;\n                const position = [imageBounds.minBoundsX + imageWidth / 2, imageBounds.minBoundsY + imageHeight / 2, 0];\n                const imageQuad = createImageQuad(core, imageData, contentBounds, position, imageWidth, imageHeight);\n                const imageVisual = core.renderer.createImageVisual(imageQuad);\n                core.renderer.images.push(imageVisual);\n            };\n            const imageDataCache = {};\n            backgroundImages.forEach(backgroundImage => {\n                const imageBounds = convertBounds(backgroundImage.bounds);\n                const imageData = imageDataCache[backgroundImage.url];\n                if (imageData) {\n                    addImage(imageBounds, imageData);\n                }\n                else {\n                    getImageData(backgroundImage.url).then(imageData => {\n                        imageDataCache[backgroundImage.url] = imageData;\n                        addImage(imageBounds, imageData);\n                    });\n                }\n            });\n        }\n        //Now call update on each layout\n        layersWithSelection(cubeLayer, lineLayer, textLayer, config.layerSelection, bounds, ref.layerStagger);\n        applyCameraCallbacks(ref, config, stage.view, transistion2dOnly);\n        core.renderer.transitionTime = 0; // Set renderer transition time for this render pass to prevent rendering target buffer for single frame\n        colorConfig(ref, colors);\n        return {\n            bounds,\n            getCubeLayer: () => cubeLayer,\n            update: layerSelection => layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds, ref.layerStagger),\n            activate: id => core.renderer.transitionBuffers[0].activeId = id,\n            moveCamera: (camera) => {\n                if (!(positionTransitioner.isTransitioning || modelTransitioner.isTransitioning)) {\n                    core.camera.getOrbit(cameraTransitioner.qRotation.from);\n                    core.camera.getPosition(cameraTransitioner.vPosition.from);\n                    cameraTransitioner.move(camera.position, camera.rotation);\n                }\n            },\n            setTransitionTimeAxesVisibility: () => {\n                setTransitionTimeAxesVisibility(transistion2dOnly, core);\n            },\n        };\n    }\n    function layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds, layerStagger) {\n        const layerItems = [\n            {\n                layer: cubeLayer,\n                selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.cubes,\n                stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.cubes,\n            },\n            {\n                layer: lineLayer,\n                selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.lines,\n                stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.lines,\n            },\n            {\n                layer: textLayer,\n                selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.texts,\n                stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.texts,\n            },\n        ];\n        layerItems.forEach(layerItem => { var _a; return (_a = layerItem.layer) === null || _a === void 0 ? void 0 : _a.update(bounds, layerItem.selection, layerItem.stagger); });\n    }\n    function convertBounds(bounds) {\n        if (!bounds)\n            return;\n        return {\n            minBoundsX: bounds.x1,\n            maxBoundsX: bounds.x2,\n            minBoundsY: -bounds.y2,\n            maxBoundsY: -bounds.y1,\n            minBoundsZ: minZ,\n            maxBoundsZ: minZ,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function shouldChangeRenderer(prev, next) {\n        var _a, _b;\n        if (!prev || !next)\n            return true;\n        if (prev.advanced !== next.advanced)\n            return true;\n        if (!prev.advanced) {\n            return ((_a = prev.basicOptions) === null || _a === void 0 ? void 0 : _a.antialias) != ((_b = next.basicOptions) === null || _b === void 0 ? void 0 : _b.antialias);\n        }\n    }\n    function getRenderer(mcRendererOptions, core) {\n        const advanced = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced;\n        const r = advanced ?\n            new Main()\n            :\n                new Main$1(mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.basicOptions);\n        core.renderer = r;\n        setRendererOptions(r, mcRendererOptions);\n        return r;\n    }\n    function setRendererOptions(renderer, mcRendererOptions) {\n        const o = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advancedOptions;\n        if ((mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced) && o) {\n            for (const key in o) {\n                renderer.config[key] = o[key];\n            }\n        }\n    }\n    function rendererEnabled(advanced) {\n        const r = advanced ?\n            new Main()\n            :\n                new Main$1();\n        return r.isSupported;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const rightButton = 2;\n    function listenCanvasEvents(core, options) {\n        const { container, pickGridCallback } = options;\n        const { inputManager } = core;\n        if (options.onLasso) {\n            inputManager.pickLassoCallback = result => {\n                options.onLasso(result.ids[0], result.manipulator.event);\n            };\n        }\n        inputManager.singleTouchAction = manipulator => {\n            if (manipulator.button == rightButton || manipulator.shiftKey || manipulator.ctrlKey) {\n                return SingleTouchAction.rotate;\n            }\n            else if (manipulator.altKey) {\n                return SingleTouchAction.lasso;\n            }\n            else {\n                return SingleTouchAction.translate;\n            }\n        };\n        inputManager.pickAxesGridCallback = ({ divisionX, divisionY, divisionZ, manipulator }) => {\n            clearClickTimeout();\n            const { altKey, button, shiftKey } = manipulator;\n            const me = { altKey, shiftKey, button };\n            const e = me;\n            pickGridCallback([divisionX, divisionY, divisionZ], e);\n        };\n        const canvas = container.getElementsByTagName('canvas')[0];\n        let pickedId;\n        const hover = (e) => {\n            if (core.renderer.pickedId !== pickedId) {\n                pickedId = core.renderer.pickedId;\n                const ordinal = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n                options.onCubeHover(e, ordinal);\n            }\n        };\n        canvas.addEventListener('mousemove', (e) => {\n            clearClickTimeout();\n            if (mousedown) {\n                options.onCubeHover(e, null);\n            }\n            hover(e);\n        });\n        canvas.addEventListener('mouseout', hover);\n        canvas.addEventListener('mouseover', hover);\n        let mousedown;\n        canvas.addEventListener('mousedown', () => {\n            mousedown = true;\n        });\n        canvas.addEventListener('mouseup', (e) => {\n            mousedown = false;\n        });\n        let canvasClickTimeout;\n        const clearClickTimeout = () => {\n            clearTimeout(canvasClickTimeout);\n            canvasClickTimeout = null;\n        };\n        canvas.addEventListener('click', (e) => {\n            canvasClickTimeout = setTimeout(() => {\n                options.onCanvasClick(e);\n            }, 50);\n        });\n        inputManager.pickItemCallback = ({ manipulator }) => {\n            clearClickTimeout();\n            const ordinal = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n            options.onCubeClick(manipulator.event, ordinal);\n        };\n    }\n\n    function cubicInOut(t) {\n      return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function easing(t) {\n        if (t === 0 || t === 1)\n            return t;\n        return cubicInOut(t);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Transitioner {\n        constructor() {\n            this.isTransitioning = false;\n        }\n        begin() {\n            this.isTransitioning = true;\n            this.time = 0;\n        }\n        elapse(elapsedTime, totalTime, ease = false) {\n            this.time += elapsedTime;\n            if (this.time >= totalTime) {\n                this.isTransitioning = false;\n                this.time = totalTime;\n                this.ended && this.ended();\n            }\n            const t = this.time / totalTime;\n            return ease ? easing(t) : t;\n        }\n    }\n    class CameraTransitioner extends Transitioner {\n        constructor() {\n            super();\n            this.qRotation = {\n                from: create$1(),\n                to: null,\n                current: create$1(),\n            };\n            this.vPosition = {\n                from: create$3(),\n                to: null,\n                current: create$3(),\n            };\n        }\n        move(position, rotation) {\n            this.begin();\n            this.qRotation.to = rotation;\n            this.vPosition.to = position;\n        }\n    }\n    class ModelTransitioner extends Transitioner {\n        constructor() {\n            super();\n            this.shouldTransition = false;\n            this.qRotation = {\n                from: null,\n                to: null,\n                current: create$1(),\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function init(options, mcRendererOptions) {\n        const { container } = options;\n        const core = new Core({ container });\n        getRenderer(mcRendererOptions, core);\n        listenCanvasEvents(core, options);\n        core.config.pickSelectDelay = 50;\n        const cameraTransitioner = new CameraTransitioner();\n        const modelTransitioner = new ModelTransitioner();\n        const positionTransitioner = new Transitioner();\n        positionTransitioner.ended = () => {\n            core.renderer.axesVisibility = AxesVisibility.current;\n        };\n        const ref = {\n            supportedRenders: {\n                advanced: rendererEnabled(true),\n                basic: rendererEnabled(false),\n            },\n            reset: null,\n            cameraTransitioner,\n            modelTransitioner,\n            positionTransitioner,\n            core,\n            setMorphChartsRendererOptions(mcRendererOptions) {\n                if (shouldChangeRenderer(ref.lastMorphChartsRendererOptions, mcRendererOptions)) {\n                    getRenderer(mcRendererOptions, core);\n                    listenCanvasEvents(core, options);\n                }\n                else {\n                    if (mcRendererOptions.advanced) {\n                        //same renderer, poke the config\n                        setRendererOptions(core.renderer, mcRendererOptions);\n                    }\n                }\n                ref.lastMorphChartsRendererOptions = mcRendererOptions;\n            },\n            lastMorphChartsRendererOptions: mcRendererOptions,\n            layerStagger: {},\n        };\n        return ref;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Class which presents a Stage of chart data using MorphCharts to render.\n     */\n    class Presenter {\n        /**\n         * Get the previously rendered Stage object.\n         */\n        get stage() {\n            return this._last.stage;\n        }\n        /**\n         * Get the current View camera type.\n         */\n        get view() {\n            return this._last.view;\n        }\n        /**\n         * Instantiate a new Presenter.\n         * @param el Parent HTMLElement to present within.\n         * @param style Optional PresenterStyle styling options.\n         */\n        constructor(el, style) {\n            this.el = el;\n            this.style = deepMerge(defaultPresenterStyle$1, style);\n            initializePanel(this);\n            this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n        }\n        /**\n         * Cancels any pending animation, calling animationCanceled() on original queue.\n         */\n        animationCancel() {\n            if (this.animationTimer) {\n                clearTimeout(this.animationTimer);\n                this.animationTimer = null;\n                if (this.logger) {\n                    this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n                }\n                if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                    this.queuedAnimationOptions.animationCanceled.call(null);\n                }\n            }\n        }\n        /**\n         * Stops the current animation and queues a new animation.\n         * @param handler Function to invoke when timeout is complete.\n         * @param timeout Length of time to wait before invoking the handler.\n         * @param options Optional QueuedAnimationOptions object.\n         */\n        animationQueue(handler, timeout, options) {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...(${timeout})`);\n            }\n            this.animationCancel();\n            this.animationTimer = setTimeout(() => {\n                if (this.logger) {\n                    this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n                }\n                handler();\n            }, timeout);\n        }\n        /**\n         * Retrieve a sub-element of the rendered output.\n         * @param type PresenterElement type of the HTMLElement to retrieve.\n         */\n        getElement(type) {\n            const elements = this.el.getElementsByClassName(className(type, this));\n            if (elements && elements.length) {\n                return elements[0];\n            }\n        }\n        /**\n         * Present the Vega Scene, or Stage object using Morphcharts.\n         * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n         * @param height Height of the rendering area.\n         * @param width Width of the rendering area.\n         * @param config Optional presentation configuration object.\n         */\n        present(sceneOrStage, height, width, config) {\n            this.animationCancel();\n            const scene = sceneOrStage;\n            let stage;\n            const options = {\n                maxOrdinal: 0,\n                currAxis: null,\n                defaultCubeColor: this.style.defaultCubeColor,\n                assignCubeOrdinal: (config && config.onSceneRectAssignCubeOrdinal) || (() => options.maxOrdinal++),\n                modifyAxis: (config === null || config === void 0 ? void 0 : config.onAxisItem) ? config.onAxisItem : defaultOnAxisItem,\n                zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex,\n            };\n            //determine if this is a vega scene\n            if (scene.marktype) {\n                stage = createStage(scene.view);\n                sceneToStage(options, stage, scene);\n            }\n            else {\n                stage = sceneOrStage;\n            }\n            const c = deepMerge(defaultPresenterConfig, config);\n            if (!this.morphchartsref) {\n                this._morphChartsOptions = {\n                    container: this.getElement(PresenterElement.gl),\n                    pickGridCallback: c.axisPickGridCallback,\n                    onCubeHover: (e, ordinal) => {\n                        c.onCubeHover(e, { ordinal, color: null, position: null, size: null });\n                    },\n                    onCubeClick: (e, ordinal) => {\n                        c.onCubeClick(e, { ordinal, color: null, position: null, size: null });\n                    },\n                    onCanvasClick: config === null || config === void 0 ? void 0 : config.onLayerClick,\n                    onLasso: config === null || config === void 0 ? void 0 : config.onLasso,\n                };\n                this.morphchartsref = init(this._morphChartsOptions, c.renderer || defaultPresenterConfig.renderer);\n            }\n            let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n            if (options.maxOrdinal) {\n                cubeCount = Math.max(cubeCount, options.maxOrdinal);\n                const empty = {\n                    isEmpty: true,\n                };\n                stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n            }\n            config.preLayer && config.preLayer(stage);\n            this.morphChartsRenderResult = morphChartsRender(this.morphchartsref, this._last.stage, stage, height, width, config && config.preStage, config && config.morphChartsColors, c);\n            delete stage.cubeData;\n            delete stage.redraw;\n            this._last = {\n                cubeCount,\n                height,\n                width,\n                stage,\n                view: stage.view,\n            };\n            const a = getActiveElementInfo();\n            mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement.legend));\n            setActiveElement(a);\n            if (config && config.onPresent) {\n                config.onPresent();\n            }\n        }\n        canvasToDataURL() {\n            return new Promise((resolve, reject) => {\n                this.morphchartsref.core.afterRenderCallback = () => {\n                    this.morphchartsref.core.afterRenderCallback = null;\n                    const canvas = this.getElement(PresenterElement.gl).getElementsByTagName('canvas')[0];\n                    const png = canvas.toDataURL('image/png');\n                    resolve(png);\n                };\n            });\n        }\n        configColors(mcColors) {\n            colorConfig(this.morphchartsref, mcColors);\n        }\n        /**\n         * Home the camera to the last initial position.\n         */\n        homeCamera() {\n            var _a;\n            (_a = this.morphchartsref) === null || _a === void 0 ? void 0 : _a.reset();\n        }\n        /**\n         * Show guidelines of rendering height/width and center of OrbitView.\n         */\n        showGuides() {\n            this.getElement(PresenterElement.gl).classList.add('show-center');\n            //TODO Morphcharts gridlines\n        }\n        finalize() {\n            this.animationCancel();\n            if (this.morphchartsref)\n                this.morphchartsref.core.stop();\n            if (this.el)\n                this.el.innerHTML = '';\n            this._last = null;\n            this.morphchartsref = null;\n            this.el = null;\n            this.logger = null;\n            this.queuedAnimationOptions = null;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //pass in the SuperClass, which should be a vega.View\n    function _RendererGl(loader) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class RendererGlInternal extends base.vega.Renderer {\n            initialize(el, width, height, origin) {\n                this.height = height;\n                this.width = width;\n                // this method will invoke resize to size the canvas appropriately\n                return super.initialize(el, width, height, origin);\n            }\n            resize(width, height, origin) {\n                super.resize(width, height, origin);\n                this.origin = origin;\n                this.height = height;\n                this.width = width;\n                //rteturn this for vega\n                return this;\n            }\n            _render(scene, items) {\n                const scene3d = scene;\n                scene3d.view = this.getView();\n                this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n                //return this for vega\n                return this;\n            }\n        }\n        const instance = new RendererGlInternal(loader);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n     * This is instantiated by ViewGl.\n     */\n    const RendererGl = _RendererGl;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    let registered = false;\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n    //pass in the SuperClass, which should be a vega.View\n    function _ViewGl(runtime, config) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class ViewGlInternal extends base.vega.View {\n            constructor(runtime, config = {}) {\n                super(runtime, config);\n                this.config = config;\n                this.presenter = config.presenter;\n                config.presenterConfig = config.presenterConfig || {};\n                config.presenterConfig.redraw = () => {\n                    this._redraw = true; //use Vega View private member _redraw\n                    this.run();\n                };\n            }\n            renderer(...args) {\n                if (args && args.length) {\n                    const renderer = args[0];\n                    if (renderer === 'morphcharts' && !registered) {\n                        base.vega.renderModule('morphcharts', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                        registered = true;\n                    }\n                    return super.renderer(renderer);\n                }\n                else {\n                    return super.renderer();\n                }\n            }\n            initialize(el) {\n                if (!this.presenter) {\n                    this.presenter = new Presenter(el);\n                }\n                super.initialize(this.presenter.getElement(PresenterElement.vegaControls));\n                const renderer = this._renderer;\n                renderer.presenterConfig = this.config.presenterConfig;\n                renderer.presenter = this.presenter;\n                renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView$1);\n                return this;\n            }\n            error(e) {\n                if (this.presenter.logger) {\n                    this.presenter.logger(e);\n                }\n            }\n        }\n        const instance = new ViewGlInternal(runtime, config);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.View, with added properties for accessing a Presenter.\n     * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n     */\n    const ViewGl = _ViewGl;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const version$1 = '1.0.6';\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n\n    var index = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        Presenter: Presenter,\n        get PresenterElement () { return PresenterElement; },\n        ViewGl: ViewGl,\n        base: base,\n        controls: controls,\n        defaults: defaults,\n        types: types,\n        use: use$1,\n        util: util$1,\n        version: version$1\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const { defaultPresenterStyle } = defaults;\n    const defaultViewerOptions = {\n        colors: {\n            activeCube: 'purple',\n            defaultCube: colorToString(defaultPresenterStyle.defaultCubeColor),\n            hoveredCube: colorToString(defaultPresenterStyle.highlightColor),\n            selectedCube: 'yellow',\n            axisSelectHighlight: colorToString([128, 128, 128, 128]),\n            axisLine: '#000',\n            axisText: '#000',\n            gridLine: '#CCC',\n            backgroundColor: '#FFF',\n        },\n        language: {\n            headers: {\n                chart: 'Chart',\n                details: 'Details',\n                legend: 'Legend',\n                selection: 'Select & Filter',\n            },\n            bing: 'bing',\n            newColorMap: 'remap color to filtered items',\n            oldColorMap: 'keep same colors',\n            deselect: 'deselect',\n            exclude: 'exclude',\n            isolate: 'isolate',\n            legendOther: 'other',\n            nextDetail: '>',\n            previousDetail: '<',\n            reset: 'reset',\n            colorBinCount: 'Color bin count',\n            colorReverse: 'Color reverse',\n            count: 'Count',\n            percent: 'Percent',\n            sum: 'Sum',\n            scatterPointScale: 'Point scale',\n            FacetMaxBins: 'Facet max bins',\n            FacetVMaxBins: 'Cross facet max bins',\n            XMaxBins: 'X axis max bins',\n            YMaxBins: 'Y axis max bins',\n            XGridSize: 'X grid size',\n            YGridSize: 'Y grid size',\n            InnerPaddingSize: 'Inner padding size',\n            OuterPaddingSize: 'Outer padding size',\n            treeMapMethod: 'Treemap layout',\n            facetColumns: 'Facet columns',\n            facetRows: 'Facet rows',\n            markOpacitySignal: 'Mark opacity',\n            textScaleSignal: 'Text scale',\n            xAxisTextAngleSignal: 'X axis text angle',\n            yAxisTextAngleSignal: 'Y axis text angle',\n            zGrounded: 'Z grounded',\n            zScaleProportion: 'Z scale proportion to Y',\n            selectionCount: count => `${count} items selected`,\n        },\n        maxLegends: 19, //20 would be \"other\"\n        onError: (errors) => {\n            //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n        },\n        filterRenderingTimerPadding: 200,\n        selectionPolygonZ: -1,\n        tickSize: 10,\n    };\n    function getPresenterStyle(options) {\n        const style = {\n            cssPrefix,\n            fontFamily: options.fontFamily,\n            defaultCubeColor: colorFromString(options.colors.defaultCube),\n        };\n        if (options.colors.hoveredCube) {\n            style.highlightColor = colorFromString(options.colors.hoveredCube);\n        }\n        //if (options.lightSettings) {\n        // style.lightSettings = options.lightSettings;\n        //}\n        return style;\n    }\n    const cssPrefix = 'sanddance-';\n    const dualColorSchemeColors = {\n        black: '#212121',\n        gray: '#D2D2D2',\n        blue: '#0060F0',\n        green: '#00C000',\n        orange: '#FF9900',\n        red: '#E00000',\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function isInternalFieldName(columnName, includeVegaMorphChartsFields = false) {\n        if (includeVegaMorphChartsFields) {\n            if (columnName === GL_ORDINAL)\n                return true;\n        }\n        for (const f in FieldNames) {\n            if (columnName === FieldNames[f])\n                return true;\n        }\n        return false;\n    }\n\n    var util = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        getColumnsFromData: getColumnsFromData,\n        getPresenterStyle: getPresenterStyle,\n        getStats: getStats,\n        inferAll: inferAll,\n        isInternalFieldName: isInternalFieldName\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const dualPairs = [\n        [dualColorSchemeColors.black, dualColorSchemeColors.gray],\n        [dualColorSchemeColors.red, dualColorSchemeColors.green],\n        [dualColorSchemeColors.red, dualColorSchemeColors.blue],\n        [dualColorSchemeColors.black, dualColorSchemeColors.red],\n        [dualColorSchemeColors.black, dualColorSchemeColors.orange],\n        [dualColorSchemeColors.black, dualColorSchemeColors.green],\n    ];\n    /**\n     * Array of color schemes.\n     */\n    const colorSchemes = [\n        {\n            scheme: ColorScaleNone,\n            colors: [defaultViewerOptions.colors.defaultCube],\n        },\n    ];\n    createDualColorSchemes();\n    function registerColorSchemes(vega) {\n        colorSchemes.forEach(cs => {\n            if (cs.colors.length === 1) {\n                vega.scheme(cs.scheme, x => cs.colors[0]);\n            }\n            else {\n                vega.scheme(cs.scheme, cs.colors);\n            }\n        });\n    }\n    function createPair(names, colors) {\n        const scheme = `dual_${names[0]}${names[1]}`;\n        colorSchemes.push({ scheme, colors });\n    }\n    function createDualColorSchemes() {\n        dualPairs.forEach(colors => {\n            const names = colors.map(color => {\n                for (const key in dualColorSchemeColors)\n                    if (color === dualColorSchemeColors[key])\n                        return key;\n            });\n            createPair(names, colors);\n            createPair([...names].reverse(), [...colors].reverse());\n        });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    var DataLayoutChange;\n    (function (DataLayoutChange) {\n        DataLayoutChange[DataLayoutChange[\"same\"] = 0] = \"same\";\n        DataLayoutChange[DataLayoutChange[\"reset\"] = 1] = \"reset\";\n        DataLayoutChange[DataLayoutChange[\"refine\"] = 2] = \"refine\";\n    })(DataLayoutChange || (DataLayoutChange = {}));\n    class Animator {\n        constructor(dataScope, props) {\n            this.dataScope = dataScope;\n            this.props = props;\n        }\n        select(search) {\n            return new Promise((resolve, reject) => {\n                this.dataScope.select(search);\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        deselect() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deselect();\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        filter(search, keepData, collapseData, rebase) {\n            if (rebase) {\n                this.dataScope.collapse(false, keepData);\n            }\n            this.dataScope.collapse(true, collapseData);\n            return new Promise((resolve, reject) => {\n                this.props.onAnimateDataChange(DataLayoutChange.refine, 'before refine', 'refine').then(() => {\n                    this.dataScope.deselect();\n                    this.dataScope.setFilteredData(keepData);\n                    this.props.onDataChanged(DataLayoutChange.refine, search);\n                    resolve();\n                }).catch(reject);\n            });\n        }\n        reset() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deselect();\n                let time;\n                if (!this.dataScope.hasFilteredData()) {\n                    time = 0;\n                }\n                else {\n                    this.dataScope.setFilteredData(null);\n                }\n                this.props.onAnimateDataChange(DataLayoutChange.reset, 'before reset', 'reset', time).then(() => {\n                    this.dataScope.collapse(false);\n                    this.props.onDataChanged(DataLayoutChange.reset);\n                    resolve();\n                }).catch(reject);\n            });\n        }\n        activate(datum) {\n            return new Promise((resolve, reject) => {\n                this.dataScope.activate(datum);\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n        deactivate() {\n            return new Promise((resolve, reject) => {\n                this.dataScope.deactivate();\n                this.props.onDataChanged(DataLayoutChange.same);\n                resolve();\n            });\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function notNice(niceValue) {\n        //convert \"nice\" numbers to numeric value\n        return (niceValue + '').replace(/[\\s,]/g, '');\n    }\n    function tickValue(axis, i) {\n        const tick = axis.tickText[i];\n        let value;\n        if (tick) {\n            value = axis.tickText[i].value;\n        }\n        return { tick, value };\n    }\n    function selectNullOrEmpty(column) {\n        const searchExpression = {\n            name: column.name,\n            operator: 'isnullorEmpty',\n        };\n        return searchExpression;\n    }\n    function selectExact(column, value) {\n        if (value == null) {\n            return selectNullOrEmpty(column);\n        }\n        const searchExpression = {\n            name: column.name,\n            operator: '==',\n            value,\n        };\n        return searchExpression;\n    }\n    function selectNone(column, values) {\n        const expressions = values.map((value, i) => {\n            const searchExpression = {\n                name: column.name,\n                operator: '!=',\n                value,\n            };\n            if (i) {\n                searchExpression.clause = '&&';\n            }\n            return searchExpression;\n        });\n        const searchExpressionGroup = {\n            expressions,\n        };\n        return searchExpressionGroup;\n    }\n    function selectExactAxis(axis, column, i) {\n        const result = tickValue(axis, i);\n        if (result.tick) {\n            return selectExact(column, result.value);\n        }\n    }\n    function selectBetween(column, lowValue, highValue, lowOperator = '>=', highOperator = '<') {\n        const expressions = [];\n        if (lowValue !== undefined) {\n            expressions.push({\n                name: column.name,\n                operator: lowOperator,\n                value: lowValue,\n            });\n        }\n        if (highValue !== undefined) {\n            expressions.push({\n                name: column.name,\n                operator: highOperator,\n                value: highValue,\n            });\n        }\n        if (expressions.length > 1) {\n            expressions[1].clause = '&&';\n        }\n        const searchExpressionGroup = {\n            expressions,\n        };\n        return searchExpressionGroup;\n    }\n    function selectBetweenAxis(axis, column, i) {\n        const low = tickValue(axis, i);\n        const high = tickValue(axis, i + 1);\n        return selectBetween(column, low.value, high.value);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const dimToRole = {\n        0: 'x',\n        1: 'y',\n        2: 'z',\n    };\n    const roleToDim = {\n        x: 0,\n        y: 1,\n        z: 1,\n    };\n    class AxisSelection {\n        constructor(specCapabilities, columns, stage) {\n            this.specCapabilities = specCapabilities;\n            this.columns = columns;\n            this.stage = stage;\n        }\n        convert(divisions) {\n            const searchRoles = [];\n            divisions.forEach((division, i) => {\n                const role = dimToRole[i];\n                const axes = this.stage.axes[role];\n                //all axes in a faceted chart should be the same\n                const axis = axes.filter(axis => axis.tickText.length)[0];\n                if (axis) {\n                    const capabilities = this.specCapabilities.roles.filter(r => r.role === role)[0];\n                    const column = this.columns[role];\n                    if (division >= 0 && (capabilities === null || capabilities === void 0 ? void 0 : capabilities.axisSelection)) {\n                        searchRoles.push({\n                            axis,\n                            role,\n                            capabilities,\n                            column,\n                            division,\n                        });\n                    }\n                }\n            });\n            switch (searchRoles.length) {\n                case 0: {\n                    return null;\n                }\n                case 1: {\n                    return this.getSearchFromSearchRole(searchRoles[0]);\n                }\n                default: {\n                    const roles = searchRoles.map(searchRole => this.getSearchFromSearchRole(searchRole));\n                    roles.forEach((role, i) => {\n                        if (i === 0)\n                            return;\n                        role.clause = '&&';\n                    });\n                    return roles;\n                }\n            }\n        }\n        getSearchFromSearchRole(searchRole) {\n            const getSearch = searchRole.capabilities.axisSelection === 'exact' ?\n                (a, c, i) => ({ expressions: [selectExactAxis(a, c, i)] })\n                :\n                    selectBetweenAxis;\n            const { axis, column, division } = searchRole;\n            return getSearch(axis, column, division);\n        }\n    }\n    function moveTicksBetween(axes) {\n        axes.forEach(axis => {\n            if (axis.ticks.length === 0)\n                return;\n            const dim = roleToDim[axis.axisRole];\n            const { color } = axis.ticks[0];\n            const newLine = (value) => {\n                const line = {\n                    sourcePosition: [0, 0, 0],\n                    targetPosition: [0, 0, 0],\n                    color,\n                };\n                line.sourcePosition[dim] = value;\n                return line;\n            };\n            const newTicks = [];\n            newTicks.push(newLine(axis.domain.sourcePosition[dim]));\n            for (let i = 1; i < axis.ticks.length; i++) {\n                newTicks.push(newLine((axis.ticks[i].sourcePosition[dim] + axis.ticks[i - 1].sourcePosition[dim]) / 2));\n            }\n            newTicks.push(newLine(axis.domain.targetPosition[dim]));\n            axis.ticks = newTicks;\n        });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function populateColorContext(colorContext, presenter) {\n        if (!colorContext.colorMap) {\n            colorContext.colorMap = presenter.morphChartsRenderResult.getCubeLayer().unitColorMap;\n        }\n        colorContext.legend = clone(presenter.stage.legend);\n        colorContext.legendElement = presenter.getElement(PresenterElement.legend).children[0];\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class DataScope {\n        constructor() {\n            this.filteredColumnsStats = {};\n        }\n        setData(data, columns) {\n            const differentData = this.data !== data;\n            if (differentData) {\n                if (this.data) {\n                    //clean up things we added to old data\n                    this.deselect();\n                }\n                this.data = data;\n                this.columns = columns;\n                this.filteredData = null;\n                this.filteredColumnsStats = {};\n            }\n            return differentData;\n        }\n        setFilteredData(filteredData) {\n            this.filteredData = filteredData;\n            this.filteredColumnsStats = {};\n        }\n        getColumns(columnTypes) {\n            if (!this.columns) {\n                this.columns = getColumnsFromData(base.vega.inferTypes, this.data, columnTypes);\n            }\n            return this.columns;\n        }\n        getFilteredColumnStats(columnName) {\n            if (!this.filteredColumnsStats[columnName]) {\n                this.filteredColumnsStats[columnName] = getStats(this.filteredData, this.columns.filter(c => c.name === columnName)[0]);\n            }\n            return this.filteredColumnsStats[columnName];\n        }\n        currentData() {\n            return this.filteredData || this.data;\n        }\n        select(search) {\n            this.deselect();\n            if (search) {\n                this.selection = this.createUserSelection(search, true, false);\n                if (this.selection.included.length) {\n                    this.activate(this.selection.included[0]);\n                }\n            }\n        }\n        createUserSelection(search, assign, rebase) {\n            const exec = new Exec(search, this.getColumns());\n            const s = {\n                search,\n                included: [],\n                excluded: [],\n            };\n            const data = rebase ? this.data : this.currentData();\n            data.forEach(datum => {\n                if (exec.run(datum)) {\n                    if (assign) {\n                        datum[FieldNames.Selected] = true;\n                    }\n                    s.included.push(datum);\n                }\n                else {\n                    s.excluded.push(datum);\n                }\n            });\n            return s;\n        }\n        deselect() {\n            this.deactivate();\n            this.data.forEach(datum => {\n                delete datum[FieldNames.Selected];\n            });\n            this.selection = null;\n        }\n        hasFilteredData() {\n            return !!this.filteredData;\n        }\n        hasSelectedData() {\n            return !!this.selection;\n        }\n        collapse(collapsed, data = this.data) {\n            data.forEach(datum => {\n                datum[FieldNames.Collapsed] = collapsed;\n            });\n            this.isCollapsed = collapsed;\n        }\n        activate(datum) {\n            this.deactivate();\n            datum[FieldNames.Active] = true;\n            this.active = datum;\n        }\n        deactivate() {\n            if (this.active) {\n                delete this.active[FieldNames.Active];\n            }\n            this.active = null;\n        }\n        ordinalIndexWithinSelection(ordinal) {\n            if (this.selection) {\n                for (let i = 0; i < this.selection.included.length; i++) {\n                    const datum = this.selection.included[i];\n                    if (datum[GL_ORDINAL] === ordinal) {\n                        return { datum, index: i };\n                    }\n                }\n            }\n            return { datum: null, index: -1 };\n        }\n        finalize() {\n            this.data = null;\n            this.filteredData = null;\n            this.filteredColumnsStats = null;\n            if (this.selection) {\n                this.selection.excluded = null;\n                this.selection.included = null;\n                this.selection = null;\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    var Action;\n    (function (Action) {\n        Action[Action[\"deselect\"] = 0] = \"deselect\";\n        Action[Action[\"isolate\"] = 1] = \"isolate\";\n        Action[Action[\"exclude\"] = 2] = \"exclude\";\n        Action[Action[\"reset\"] = 3] = \"reset\";\n        Action[Action[\"next\"] = 4] = \"next\";\n        Action[Action[\"previous\"] = 5] = \"previous\";\n    })(Action || (Action = {}));\n    class Details {\n        constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n            this.language = language;\n            this.animator = animator;\n            this.dataScope = dataScope;\n            this.colorMapHandler = colorMapHandler;\n            this.hasColorMaps = hasColorMaps;\n            this.element = addDiv(parentElement, `${cssPrefix}unitControls`);\n            this.clear();\n        }\n        finalize() {\n            if (this.element)\n                this.element.innerHTML = '';\n            this.dataScope = null;\n            this.element = null;\n        }\n        clear() {\n            this.state = {\n                userSelection: null,\n                index: -1,\n                remapColor: false,\n            };\n            this.render();\n        }\n        clearSelection() {\n            this.state.userSelection = null;\n            this.state.index = -1;\n            this.render();\n        }\n        populate(userSelection, index = 0) {\n            this.state.userSelection = userSelection;\n            this.state.index = index;\n            this.render();\n        }\n        selectByNameValue(columnName, value) {\n            const search = {\n                name: columnName,\n                operator: '==',\n                value,\n            };\n            this.clearSelection();\n            this.animator.select(search);\n            this.populate(this.dataScope.selection);\n        }\n        remapChanged(remap) {\n            this.state.remapColor = remap;\n            this.colorMapHandler(remap);\n            this.render();\n        }\n        handleAction(action) {\n            let p;\n            const u = this.state.userSelection;\n            switch (action) {\n                case Action.deselect: {\n                    this.clearSelection();\n                    p = this.animator.deselect();\n                    break;\n                }\n                case Action.exclude: {\n                    this.clearSelection();\n                    p = this.animator.filter(invert$1(u.search), u.excluded, u.included, false);\n                    this.state.remapColor = false;\n                    break;\n                }\n                case Action.isolate: {\n                    this.clearSelection();\n                    p = this.animator.filter(u.search, u.included, u.excluded, false);\n                    this.state.remapColor = false;\n                    break;\n                }\n                case Action.reset: {\n                    this.clear();\n                    p = this.animator.reset();\n                    break;\n                }\n                default: {\n                    switch (action) {\n                        case Action.previous: {\n                            this.state.index--;\n                            if (this.state.index < 0) {\n                                this.state.index = this.state.userSelection.included.length - 1;\n                            }\n                            break;\n                        }\n                        case Action.next: {\n                            this.state.index++;\n                            if (this.state.index >= this.state.userSelection.included.length) {\n                                this.state.index = 0;\n                            }\n                            break;\n                        }\n                    }\n                    this.render();\n                    p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n                }\n            }\n            p.then(() => this.render());\n        }\n        render() {\n            const hasRefinedData = this.dataScope.hasFilteredData();\n            const renderProps = {\n                language: this.language,\n                actionHandler: action => this.handleAction(action),\n                selectionHandler: (columnName, value) => this.selectByNameValue(columnName, value),\n                count: this.state.userSelection && this.state.userSelection.included.length,\n                hasRefinedData,\n                item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n                remapColorHandler: remap => this.remapChanged(remap),\n                hasColorMaps: this.hasColorMaps() && hasRefinedData,\n                remapColor: this.state.remapColor,\n            };\n            const a = getActiveElementInfo();\n            mount(renderDetails(renderProps), this.element);\n            setActiveElement(a);\n        }\n    }\n    const renderDetails = (props) => {\n        const controlButtons = [\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.deselect) }, props.language.deselect),\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.isolate) }, props.language.isolate),\n            createElement(\"button\", { disabled: !props.item, onClick: e => props.actionHandler(Action.exclude) }, props.language.exclude),\n        ];\n        const colorMapping = (createElement(\"div\", null,\n            createElement(\"button\", { disabled: props.remapColor, onClick: e => props.remapColorHandler(true) }, props.language.newColorMap),\n            createElement(\"button\", { disabled: !props.remapColor, onClick: e => props.remapColorHandler(false) }, props.language.oldColorMap)));\n        const singleItem = props.count === 1;\n        const scrollButtons = [\n            createElement(\"button\", { disabled: singleItem, onClick: e => props.actionHandler(Action.previous) }, props.language.previousDetail),\n            createElement(\"button\", { disabled: singleItem, onClick: e => props.actionHandler(Action.next) }, props.language.nextDetail),\n            createElement(\"span\", null,\n                \" \",\n                props.language.selectionCount(props.count)),\n        ];\n        const rows = [];\n        for (const prop in props.item) {\n            if (prop === GL_ORDINAL) {\n                continue;\n            }\n            if (isInternalFieldName(prop)) {\n                continue;\n            }\n            rows.push({\n                cells: [\n                    { content: prop }, { content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler) },\n                ],\n            });\n        }\n        return (createElement(\"div\", null,\n            props.hasColorMaps && colorMapping,\n            createElement(\"h4\", null, props.language.headers.selection),\n            createElement(\"div\", { className: `${cssPrefix}selection` },\n                controlButtons,\n                createElement(\"button\", { disabled: !props.hasRefinedData, onClick: e => props.actionHandler(Action.reset) }, \"reset\")),\n            props.item && createElement(\"h4\", null, props.language.headers.details),\n            createElement(\"div\", null,\n                createElement(\"div\", { className: `${cssPrefix}details-scroll` }, props.item && scrollButtons),\n                createElement(\"div\", { className: `${cssPrefix}details` }, props.item && createElement(Table$1, { rows: rows })))));\n    };\n    function linkSelect(language, columnName, value, selectionHandler) {\n        return (createElement(\"span\", null,\n            createElement(\"a\", { href: \"#\", onClick: e => selectionHandler(columnName, value) }, value),\n            isNaN(value) ? [' ', createElement(\"a\", { className: \"bing-search\", href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`, target: \"_blank\" }, language.bing)] : ''));\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function ensureHeaders(presenter, headers) {\n        const vegaControls = presenter.getElement(PresenterElement.vegaControls);\n        conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n        const legend = presenter.getElement(PresenterElement.legend);\n        conditionalHeader(!!legend.children.length, legend, headers.legend);\n    }\n    function conditionalHeader(condition, element, header) {\n        const existing = existingHeader(element, header);\n        if (condition && !existing) {\n            addHeader(element, header);\n        }\n        if (!condition && existing) {\n            existing.remove();\n        }\n    }\n    function addHeader(element, header) {\n        const h = document.createElement('h4');\n        h.innerHTML = header;\n        element.insertAdjacentElement('beforebegin', h);\n    }\n    function existingHeader(element, header) {\n        const { previousElementSibling } = element;\n        if (previousElementSibling && previousElementSibling.innerHTML === header) {\n            return previousElementSibling;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function legendRange(colorBinType, column, legend, clickedIndex) {\n        if (column.quantitative) {\n            return selectQuantitative(colorBinType, column, legend, clickedIndex);\n        }\n        else {\n            return selectCategorical(column, legend, clickedIndex);\n        }\n    }\n    function selectCategorical(column, legend, clickedIndex) {\n        const value = legend.rows[clickedIndex].value;\n        if (value === Other) {\n            const values = [];\n            for (const i in legend.rows) {\n                if (+i !== clickedIndex) {\n                    values.push(legend.rows[i].value);\n                }\n            }\n            return selectNone(column, values);\n        }\n        else {\n            //select equal\n            return { expressions: [selectExact(column, legend.rows[clickedIndex].value)] };\n        }\n    }\n    function selectQuantitative(colorBinType, column, legend, clickedIndex) {\n        const keys = Object.keys(legend.rows).map(key => +key).sort((a, b) => +a - +b);\n        let lowValue;\n        let lowOperator;\n        let highValue;\n        let highOperator;\n        const rowText = legend.rows[clickedIndex].label;\n        switch (colorBinType) {\n            case 'continuous': {\n                lowValue = rowText;\n                if (clickedIndex < keys.length - 1) {\n                    highValue = legend.rows[clickedIndex + 1].value;\n                }\n                break;\n            }\n            default: {\n                if (rowText.indexOf('null') > 0) {\n                    const ex = {\n                        expressions: [selectNullOrEmpty(column)],\n                    };\n                    return ex;\n                }\n                const dash = rowText.indexOf('–'); //this is not the common dash character!\n                if (dash > 0) {\n                    //bug in Vega for quantize?\n                    //lowOperator = '>';\n                    //highOperator = '<=';\n                    lowValue = rowText.substr(0, dash);\n                    highValue = rowText.substr(dash + 1);\n                }\n                else {\n                    if (rowText.indexOf('<') >= 0) {\n                        highValue = rowText.substring(2);\n                    }\n                    else {\n                        if (rowText.indexOf('≥') >= 0) {\n                            lowValue = rowText.substring(2);\n                        }\n                    }\n                }\n            }\n        }\n        if (lowValue)\n            lowValue = notNice(lowValue);\n        if (highValue)\n            highValue = notNice(highValue);\n        if (lowValue === highValue) {\n            return { expressions: [selectExact(column, lowValue)] };\n        }\n        else {\n            return selectBetween(column, lowValue, highValue, lowOperator, highOperator);\n        }\n    }\n    function finalizeLegend(colorBinType, colorColumn, legend, language) {\n        const rowTexts = [];\n        for (const i in legend.rows) {\n            const row = legend.rows[i];\n            row.search = legendRange(colorBinType, colorColumn, legend, +i);\n            if (row.value === Other) {\n                row.label = language.legendOther;\n            }\n            else {\n                rowTexts.push(row.value);\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function assignOrdinals(columns, data, ordinalMap) {\n        const uCol = columns.uid && columns.uid.name;\n        if (ordinalMap) {\n            data.forEach((d, i) => {\n                const key = uCol ? d[uCol] : i;\n                d[GL_ORDINAL] = ordinalMap[key];\n            });\n        }\n        else {\n            ordinalMap = {};\n            data.forEach((d, i) => {\n                d[GL_ORDINAL] = i;\n                const uColValue = uCol ? d[uCol] : i;\n                ordinalMap[uColValue] = i;\n            });\n        }\n        return ordinalMap;\n    }\n    function getDataIndexOfCube(cube, data) {\n        const len = data.length;\n        for (let i = 0; i < len; i++) {\n            if (data[i][GL_ORDINAL] === cube.ordinal) {\n                return i;\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const { push } = util$1;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getSearchGroupFromVegaValue(search) {\n        let group;\n        const vegaSearch = search;\n        if (Array.isArray(vegaSearch)) {\n            //flatten into one group\n            group = { expressions: [] };\n            vegaSearch.forEach(g => {\n                const clonedExpressions = clone(g.expressions).filter(Boolean);\n                clonedExpressions[0].clause = '&&';\n                push(group.expressions, clonedExpressions);\n            });\n        }\n        else {\n            group = vegaSearch ?\n                { expressions: vegaSearch.expressions.filter(Boolean) }\n                : null;\n        }\n        return group;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function applySignalValues(sv, b) {\n        if (!sv || !b || !b.signals || !b.signals.length)\n            return;\n        for (const key in sv) {\n            const value = sv[key];\n            const signalB = b.signals.filter(signal => signal.name === key)[0];\n            if (signalB && signalB.bind) {\n                signalB.value = value;\n            }\n        }\n    }\n    function extractSignalValuesFromView(view, spec) {\n        if (!view || !spec || !spec.signals || !spec.signals.length)\n            return;\n        const result = {};\n        spec.signals.forEach((signalA) => {\n            //bound to a UI control\n            if (signalA.bind) {\n                try {\n                    result[signalA.name] = view.signal(signalA.name);\n                }\n                catch (e) {\n                    // continue regardless of error\n                }\n            }\n        });\n        return result;\n    }\n    //signals not capable of handling with MorphCharts\n    const hideSignalUI = [\n        SignalNames.MarkOpacity,\n        SignalNames.TextAngleX,\n        SignalNames.TextAngleY,\n    ];\n    function unbindSignalUI(spec) {\n        spec.signals.forEach((signal) => {\n            if (hideSignalUI.indexOf(signal.name) >= 0) {\n                delete signal.bind;\n            }\n        });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const { outerSize } = util$1;\n    const { Table } = controls;\n    class Tooltip {\n        constructor(props) {\n            this.props = props;\n            const renderProps = {\n                cssPrefix: props.cssPrefix,\n                rows: getRows(props.dataItem),\n            };\n            this.finalizeHandler = () => this.destroy();\n            this.element = renderTooltip(renderProps);\n            if (this.element) {\n                this.element.style.position = 'absolute';\n                this.child = this.element.firstChild;\n                document.body.appendChild(this.element);\n                //measure and move as necessary\n                let m = outerSize(this.child);\n                while (m.height > document.documentElement.clientHeight) {\n                    const tr = this.child.querySelector('tr:last-child');\n                    if (tr) {\n                        tr.parentElement.removeChild(tr);\n                    }\n                    else {\n                        break;\n                    }\n                    m = outerSize(this.child);\n                }\n                let position;\n                const te = props.event;\n                if (te.touches) {\n                    position = te[0];\n                }\n                else {\n                    const pme = props.event;\n                    position = pme;\n                }\n                if (position.clientX + m.width >= document.documentElement.clientWidth) {\n                    this.child.style.right = '0';\n                }\n                let moveTop = true;\n                if (position.clientY + m.height >= document.documentElement.clientHeight) {\n                    if (position.clientY - m.height > 0) {\n                        this.child.style.bottom = '0';\n                    }\n                    else {\n                        moveTop = false;\n                    }\n                }\n                if (moveTop) {\n                    this.element.style.top = `${position.clientY}px`;\n                }\n                this.element.style.left = `${position.clientX}px`;\n                this.child.addEventListener('mouseenter', this.finalizeHandler);\n                this.child.addEventListener('mousemove', this.finalizeHandler);\n                this.child.addEventListener('mouseover', this.finalizeHandler);\n            }\n        }\n        destroy() {\n            this.child.removeEventListener('mouseenter', this.finalizeHandler);\n            this.child.removeEventListener('mousemove', this.finalizeHandler);\n            this.child.removeEventListener('mouseover', this.finalizeHandler);\n            if (this.element) {\n                document.body.removeChild(this.element);\n            }\n            this.element = null;\n        }\n    }\n    function cleanDataItem(item) {\n        const ret = {};\n        for (const columnName in item) {\n            if (columnName === GL_ORDINAL) {\n                continue;\n            }\n            if (isInternalFieldName(columnName)) {\n                continue;\n            }\n            ret[columnName] = item[columnName];\n        }\n        return ret;\n    }\n    function getRows(item) {\n        const rows = [];\n        for (const columnName in item) {\n            const value = item[columnName];\n            let content;\n            switch (value) {\n                case null:\n                    content = createElement(\"i\", null, \"null\");\n                    break;\n                case undefined:\n                    content = createElement(\"i\", null, \"undefined\");\n                    break;\n                default:\n                    content = value.toString();\n            }\n            //}\n            rows.push({\n                cells: [\n                    { content: columnName + ':' },\n                    { content },\n                ],\n            });\n        }\n        return rows;\n    }\n    const renderTooltip = (props) => {\n        return props.rows.length === 0 ? null : (createElement(\"div\", { className: `${props.cssPrefix}tooltip` }, Table({ rows: props.rows })));\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class CharacterSet {\n        resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n            if (forceNewCharacterSet || needsNewCharacterSet(oldInsight, newInsight)) {\n                this.chars = undefined;\n            }\n        }\n        getCharacterSet(stage) {\n            if (!this.chars) {\n                const map = {};\n                const addText = (text) => {\n                    Array.from(text).forEach(char => { map[char] = true; });\n                };\n                stage.textData.forEach(t => addText(t.text));\n                const { x, y } = stage.axes;\n                [x, y].forEach(axes => {\n                    axes.forEach(axis => {\n                        if (axis.tickText)\n                            axis.tickText.forEach(t => addText(t.text));\n                        if (axis.title)\n                            addText(axis.title.text);\n                    });\n                });\n                this.chars = Object.keys(map);\n            }\n            return this.chars;\n        }\n    }\n    function needsNewCharacterSet(oldInsight, newInsight) {\n        if (!oldInsight)\n            return true;\n        if (!newInsight)\n            return true;\n        if (oldInsight.chart !== newInsight.chart)\n            return true;\n        if (oldInsight.facetStyle !== newInsight.facetStyle)\n            return true;\n        if (oldInsight.totalStyle !== newInsight.totalStyle)\n            return true;\n        if (oldInsight.hideAxes !== newInsight.hideAxes)\n            return true;\n        if (differentObjectValues(oldInsight.signalValues, newInsight.signalValues))\n            return true;\n        if (differentObjectValues(oldInsight.size, newInsight.size))\n            return true;\n        const oldColumns = oldInsight.columns;\n        const newColumns = newInsight.columns;\n        if (oldColumns.facet !== newColumns.facet)\n            return true;\n        if (oldColumns.facetV !== newColumns.facetV)\n            return true;\n        if (oldColumns.x !== newColumns.x)\n            return true;\n        if (oldColumns.y !== newColumns.y)\n            return true;\n        if (oldColumns.z !== newColumns.z)\n            return true;\n        return false;\n    }\n    function differentObjectValues(a, b) {\n        if (!a && !b)\n            return false;\n        if (!a || !b)\n            return true;\n        const keys = Object.keys(b);\n        for (let i = 0; i < keys.length; i++) {\n            const key = keys[i];\n            const ta = typeof a;\n            const tb = typeof b;\n            if (ta !== tb)\n                return true;\n            if (ta === 'object') {\n                return differentObjectValues(a[key], b[key]);\n            }\n            else {\n                if (a[key] !== b[key])\n                    return true;\n            }\n        }\n        return false;\n    }\n\n    function ascending(a, b) {\n      return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n    }\n\n    function descending(a, b) {\n      return a == null || b == null ? NaN\n        : b < a ? -1\n        : b > a ? 1\n        : b >= a ? 0\n        : NaN;\n    }\n\n    function bisector(f) {\n      let compare1, compare2, delta;\n\n      // If an accessor is specified, promote it to a comparator. In this case we\n      // can test whether the search value is (self-) comparable. We can’t do this\n      // for a comparator (except for specific, known comparators) because we can’t\n      // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n      // used to test whether a single value is comparable.\n      if (f.length !== 2) {\n        compare1 = ascending;\n        compare2 = (d, x) => ascending(f(d), x);\n        delta = (d, x) => f(d) - x;\n      } else {\n        compare1 = f === ascending || f === descending ? f : zero$1;\n        compare2 = f;\n        delta = f;\n      }\n\n      function left(a, x, lo = 0, hi = a.length) {\n        if (lo < hi) {\n          if (compare1(x, x) !== 0) return hi;\n          do {\n            const mid = (lo + hi) >>> 1;\n            if (compare2(a[mid], x) < 0) lo = mid + 1;\n            else hi = mid;\n          } while (lo < hi);\n        }\n        return lo;\n      }\n\n      function right(a, x, lo = 0, hi = a.length) {\n        if (lo < hi) {\n          if (compare1(x, x) !== 0) return hi;\n          do {\n            const mid = (lo + hi) >>> 1;\n            if (compare2(a[mid], x) <= 0) lo = mid + 1;\n            else hi = mid;\n          } while (lo < hi);\n        }\n        return lo;\n      }\n\n      function center(a, x, lo = 0, hi = a.length) {\n        const i = left(a, x, lo, hi - 1);\n        return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n      }\n\n      return {left, center, right};\n    }\n\n    function zero$1() {\n      return 0;\n    }\n\n    function number$1(x) {\n      return x === null ? NaN : +x;\n    }\n\n    const ascendingBisect = bisector(ascending);\n    const bisectRight = ascendingBisect.right;\n    bisector(number$1).center;\n\n    const e10 = Math.sqrt(50),\n        e5 = Math.sqrt(10),\n        e2 = Math.sqrt(2);\n\n    function tickSpec(start, stop, count) {\n      const step = (stop - start) / Math.max(0, count),\n          power = Math.floor(Math.log10(step)),\n          error = step / Math.pow(10, power),\n          factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n      let i1, i2, inc;\n      if (power < 0) {\n        inc = Math.pow(10, -power) / factor;\n        i1 = Math.round(start * inc);\n        i2 = Math.round(stop * inc);\n        if (i1 / inc < start) ++i1;\n        if (i2 / inc > stop) --i2;\n        inc = -inc;\n      } else {\n        inc = Math.pow(10, power) * factor;\n        i1 = Math.round(start / inc);\n        i2 = Math.round(stop / inc);\n        if (i1 * inc < start) ++i1;\n        if (i2 * inc > stop) --i2;\n      }\n      if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n      return [i1, i2, inc];\n    }\n\n    function ticks(start, stop, count) {\n      stop = +stop, start = +start, count = +count;\n      if (!(count > 0)) return [];\n      if (start === stop) return [start];\n      const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n      if (!(i2 >= i1)) return [];\n      const n = i2 - i1 + 1, ticks = new Array(n);\n      if (reverse) {\n        if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n        else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n      } else {\n        if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n        else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n      }\n      return ticks;\n    }\n\n    function tickIncrement(start, stop, count) {\n      stop = +stop, start = +start, count = +count;\n      return tickSpec(start, stop, count)[2];\n    }\n\n    function tickStep(start, stop, count) {\n      stop = +stop, start = +start, count = +count;\n      const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n      return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n    }\n\n    function initRange(domain, range) {\n      switch (arguments.length) {\n        case 0: break;\n        case 1: this.range(domain); break;\n        default: this.range(range).domain(domain); break;\n      }\n      return this;\n    }\n\n    var constant = x => () => x;\n\n    function linear$1(a, d) {\n      return function(t) {\n        return a + t * d;\n      };\n    }\n\n    function exponential(a, b, y) {\n      return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n        return Math.pow(a + t * b, y);\n      };\n    }\n\n    function gamma(y) {\n      return (y = +y) === 1 ? nogamma : function(a, b) {\n        return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n      };\n    }\n\n    function nogamma(a, b) {\n      var d = b - a;\n      return d ? linear$1(a, d) : constant(isNaN(a) ? b : a);\n    }\n\n    var rgb = (function rgbGamma(y) {\n      var color = gamma(y);\n\n      function rgb(start, end) {\n        var r = color((start = rgb$1(start)).r, (end = rgb$1(end)).r),\n            g = color(start.g, end.g),\n            b = color(start.b, end.b),\n            opacity = nogamma(start.opacity, end.opacity);\n        return function(t) {\n          start.r = r(t);\n          start.g = g(t);\n          start.b = b(t);\n          start.opacity = opacity(t);\n          return start + \"\";\n        };\n      }\n\n      rgb.gamma = rgbGamma;\n\n      return rgb;\n    })(1);\n\n    function numberArray(a, b) {\n      if (!b) b = [];\n      var n = a ? Math.min(b.length, a.length) : 0,\n          c = b.slice(),\n          i;\n      return function(t) {\n        for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n        return c;\n      };\n    }\n\n    function isNumberArray(x) {\n      return ArrayBuffer.isView(x) && !(x instanceof DataView);\n    }\n\n    function genericArray(a, b) {\n      var nb = b ? b.length : 0,\n          na = a ? Math.min(nb, a.length) : 0,\n          x = new Array(na),\n          c = new Array(nb),\n          i;\n\n      for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);\n      for (; i < nb; ++i) c[i] = b[i];\n\n      return function(t) {\n        for (i = 0; i < na; ++i) c[i] = x[i](t);\n        return c;\n      };\n    }\n\n    function date(a, b) {\n      var d = new Date;\n      return a = +a, b = +b, function(t) {\n        return d.setTime(a * (1 - t) + b * t), d;\n      };\n    }\n\n    function interpolateNumber(a, b) {\n      return a = +a, b = +b, function(t) {\n        return a * (1 - t) + b * t;\n      };\n    }\n\n    function object(a, b) {\n      var i = {},\n          c = {},\n          k;\n\n      if (a === null || typeof a !== \"object\") a = {};\n      if (b === null || typeof b !== \"object\") b = {};\n\n      for (k in b) {\n        if (k in a) {\n          i[k] = interpolate(a[k], b[k]);\n        } else {\n          c[k] = b[k];\n        }\n      }\n\n      return function(t) {\n        for (k in i) c[k] = i[k](t);\n        return c;\n      };\n    }\n\n    var reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n        reB = new RegExp(reA.source, \"g\");\n\n    function zero(b) {\n      return function() {\n        return b;\n      };\n    }\n\n    function one(b) {\n      return function(t) {\n        return b(t) + \"\";\n      };\n    }\n\n    function string(a, b) {\n      var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n          am, // current match in a\n          bm, // current match in b\n          bs, // string preceding current number in b, if any\n          i = -1, // index in s\n          s = [], // string constants and placeholders\n          q = []; // number interpolators\n\n      // Coerce inputs to strings.\n      a = a + \"\", b = b + \"\";\n\n      // Interpolate pairs of numbers in a & b.\n      while ((am = reA.exec(a))\n          && (bm = reB.exec(b))) {\n        if ((bs = bm.index) > bi) { // a string precedes the next number in b\n          bs = b.slice(bi, bs);\n          if (s[i]) s[i] += bs; // coalesce with previous string\n          else s[++i] = bs;\n        }\n        if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n          if (s[i]) s[i] += bm; // coalesce with previous string\n          else s[++i] = bm;\n        } else { // interpolate non-matching numbers\n          s[++i] = null;\n          q.push({i: i, x: interpolateNumber(am, bm)});\n        }\n        bi = reB.lastIndex;\n      }\n\n      // Add remains of b.\n      if (bi < b.length) {\n        bs = b.slice(bi);\n        if (s[i]) s[i] += bs; // coalesce with previous string\n        else s[++i] = bs;\n      }\n\n      // Special optimization for only a single match.\n      // Otherwise, interpolate each of the numbers and rejoin the string.\n      return s.length < 2 ? (q[0]\n          ? one(q[0].x)\n          : zero(b))\n          : (b = q.length, function(t) {\n              for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n              return s.join(\"\");\n            });\n    }\n\n    function interpolate(a, b) {\n      var t = typeof b, c;\n      return b == null || t === \"boolean\" ? constant(b)\n          : (t === \"number\" ? interpolateNumber\n          : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n          : b instanceof color ? rgb\n          : b instanceof Date ? date\n          : isNumberArray(b) ? numberArray\n          : Array.isArray(b) ? genericArray\n          : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n          : interpolateNumber)(a, b);\n    }\n\n    function interpolateRound(a, b) {\n      return a = +a, b = +b, function(t) {\n        return Math.round(a * (1 - t) + b * t);\n      };\n    }\n\n    function constants(x) {\n      return function() {\n        return x;\n      };\n    }\n\n    function number(x) {\n      return +x;\n    }\n\n    var unit = [0, 1];\n\n    function identity$1(x) {\n      return x;\n    }\n\n    function normalize(a, b) {\n      return (b -= (a = +a))\n          ? function(x) { return (x - a) / b; }\n          : constants(isNaN(b) ? NaN : 0.5);\n    }\n\n    function clamper(a, b) {\n      var t;\n      if (a > b) t = a, a = b, b = t;\n      return function(x) { return Math.max(a, Math.min(b, x)); };\n    }\n\n    // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n    // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\n    function bimap(domain, range, interpolate) {\n      var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n      if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n      else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n      return function(x) { return r0(d0(x)); };\n    }\n\n    function polymap(domain, range, interpolate) {\n      var j = Math.min(domain.length, range.length) - 1,\n          d = new Array(j),\n          r = new Array(j),\n          i = -1;\n\n      // Reverse descending domains.\n      if (domain[j] < domain[0]) {\n        domain = domain.slice().reverse();\n        range = range.slice().reverse();\n      }\n\n      while (++i < j) {\n        d[i] = normalize(domain[i], domain[i + 1]);\n        r[i] = interpolate(range[i], range[i + 1]);\n      }\n\n      return function(x) {\n        var i = bisectRight(domain, x, 1, j) - 1;\n        return r[i](d[i](x));\n      };\n    }\n\n    function copy(source, target) {\n      return target\n          .domain(source.domain())\n          .range(source.range())\n          .interpolate(source.interpolate())\n          .clamp(source.clamp())\n          .unknown(source.unknown());\n    }\n\n    function transformer() {\n      var domain = unit,\n          range = unit,\n          interpolate$1 = interpolate,\n          transform,\n          untransform,\n          unknown,\n          clamp = identity$1,\n          piecewise,\n          output,\n          input;\n\n      function rescale() {\n        var n = Math.min(domain.length, range.length);\n        if (clamp !== identity$1) clamp = clamper(domain[0], domain[n - 1]);\n        piecewise = n > 2 ? polymap : bimap;\n        output = input = null;\n        return scale;\n      }\n\n      function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate$1)))(transform(clamp(x)));\n      }\n\n      scale.invert = function(y) {\n        return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n      };\n\n      scale.domain = function(_) {\n        return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n      };\n\n      scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n      };\n\n      scale.rangeRound = function(_) {\n        return range = Array.from(_), interpolate$1 = interpolateRound, rescale();\n      };\n\n      scale.clamp = function(_) {\n        return arguments.length ? (clamp = _ ? true : identity$1, rescale()) : clamp !== identity$1;\n      };\n\n      scale.interpolate = function(_) {\n        return arguments.length ? (interpolate$1 = _, rescale()) : interpolate$1;\n      };\n\n      scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n      };\n\n      return function(t, u) {\n        transform = t, untransform = u;\n        return rescale();\n      };\n    }\n\n    function continuous() {\n      return transformer()(identity$1, identity$1);\n    }\n\n    function formatDecimal(x) {\n      return Math.abs(x = Math.round(x)) >= 1e21\n          ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n          : x.toString(10);\n    }\n\n    // Computes the decimal coefficient and exponent of the specified number x with\n    // significant digits p, where x is positive and p is in [1, 21] or undefined.\n    // For example, formatDecimalParts(1.23) returns [\"123\", 0].\n    function formatDecimalParts(x, p) {\n      if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n      var i, coefficient = x.slice(0, i);\n\n      // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n      // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n      return [\n        coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n        +x.slice(i + 1)\n      ];\n    }\n\n    function exponent(x) {\n      return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n    }\n\n    function formatGroup(grouping, thousands) {\n      return function(value, width) {\n        var i = value.length,\n            t = [],\n            j = 0,\n            g = grouping[0],\n            length = 0;\n\n        while (i > 0 && g > 0) {\n          if (length + g + 1 > width) g = Math.max(1, width - length);\n          t.push(value.substring(i -= g, i + g));\n          if ((length += g + 1) > width) break;\n          g = grouping[j = (j + 1) % grouping.length];\n        }\n\n        return t.reverse().join(thousands);\n      };\n    }\n\n    function formatNumerals(numerals) {\n      return function(value) {\n        return value.replace(/[0-9]/g, function(i) {\n          return numerals[+i];\n        });\n      };\n    }\n\n    // [[fill]align][sign][symbol][0][width][,][.precision][~][type]\n    var re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\n    function formatSpecifier(specifier) {\n      if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n      var match;\n      return new FormatSpecifier({\n        fill: match[1],\n        align: match[2],\n        sign: match[3],\n        symbol: match[4],\n        zero: match[5],\n        width: match[6],\n        comma: match[7],\n        precision: match[8] && match[8].slice(1),\n        trim: match[9],\n        type: match[10]\n      });\n    }\n\n    formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\n    function FormatSpecifier(specifier) {\n      this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n      this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n      this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n      this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n      this.zero = !!specifier.zero;\n      this.width = specifier.width === undefined ? undefined : +specifier.width;\n      this.comma = !!specifier.comma;\n      this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n      this.trim = !!specifier.trim;\n      this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n    }\n\n    FormatSpecifier.prototype.toString = function() {\n      return this.fill\n          + this.align\n          + this.sign\n          + this.symbol\n          + (this.zero ? \"0\" : \"\")\n          + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n          + (this.comma ? \",\" : \"\")\n          + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n          + (this.trim ? \"~\" : \"\")\n          + this.type;\n    };\n\n    // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\n    function formatTrim(s) {\n      out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n        switch (s[i]) {\n          case \".\": i0 = i1 = i; break;\n          case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n          default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n        }\n      }\n      return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n    }\n\n    var prefixExponent;\n\n    function formatPrefixAuto(x, p) {\n      var d = formatDecimalParts(x, p);\n      if (!d) return x + \"\";\n      var coefficient = d[0],\n          exponent = d[1],\n          i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n          n = coefficient.length;\n      return i === n ? coefficient\n          : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n          : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n          : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n    }\n\n    function formatRounded(x, p) {\n      var d = formatDecimalParts(x, p);\n      if (!d) return x + \"\";\n      var coefficient = d[0],\n          exponent = d[1];\n      return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n          : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n          : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n    }\n\n    var formatTypes = {\n      \"%\": (x, p) => (x * 100).toFixed(p),\n      \"b\": (x) => Math.round(x).toString(2),\n      \"c\": (x) => x + \"\",\n      \"d\": formatDecimal,\n      \"e\": (x, p) => x.toExponential(p),\n      \"f\": (x, p) => x.toFixed(p),\n      \"g\": (x, p) => x.toPrecision(p),\n      \"o\": (x) => Math.round(x).toString(8),\n      \"p\": (x, p) => formatRounded(x * 100, p),\n      \"r\": formatRounded,\n      \"s\": formatPrefixAuto,\n      \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n      \"x\": (x) => Math.round(x).toString(16)\n    };\n\n    function identity(x) {\n      return x;\n    }\n\n    var map = Array.prototype.map,\n        prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\n    function formatLocale(locale) {\n      var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n          currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n          currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n          decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n          numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n          percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n          minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n          nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n      function newFormat(specifier) {\n        specifier = formatSpecifier(specifier);\n\n        var fill = specifier.fill,\n            align = specifier.align,\n            sign = specifier.sign,\n            symbol = specifier.symbol,\n            zero = specifier.zero,\n            width = specifier.width,\n            comma = specifier.comma,\n            precision = specifier.precision,\n            trim = specifier.trim,\n            type = specifier.type;\n\n        // The \"n\" type is an alias for \",g\".\n        if (type === \"n\") comma = true, type = \"g\";\n\n        // The \"\" type, and any invalid type, is an alias for \".12~g\".\n        else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n        // If zero fill is specified, padding goes after sign and before digits.\n        if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n        // Compute the prefix and suffix.\n        // For SI-prefix, the suffix is lazily computed.\n        var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n            suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n        // What format function should we use?\n        // Is this an integer type?\n        // Can this type generate exponential notation?\n        var formatType = formatTypes[type],\n            maybeSuffix = /[defgprs%]/.test(type);\n\n        // Set the default precision if not specified,\n        // or clamp the specified precision to the supported range.\n        // For significant precision, it must be in [1, 21].\n        // For fixed precision, it must be in [0, 20].\n        precision = precision === undefined ? 6\n            : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n            : Math.max(0, Math.min(20, precision));\n\n        function format(value) {\n          var valuePrefix = prefix,\n              valueSuffix = suffix,\n              i, n, c;\n\n          if (type === \"c\") {\n            valueSuffix = formatType(value) + valueSuffix;\n            value = \"\";\n          } else {\n            value = +value;\n\n            // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n            var valueNegative = value < 0 || 1 / value < 0;\n\n            // Perform the initial formatting.\n            value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n            // Trim insignificant zeros.\n            if (trim) value = formatTrim(value);\n\n            // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n            if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n            // Compute the prefix and suffix.\n            valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n            valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n            // Break the formatted value into the integer “value” part that can be\n            // grouped, and fractional or exponential “suffix” part that is not.\n            if (maybeSuffix) {\n              i = -1, n = value.length;\n              while (++i < n) {\n                if (c = value.charCodeAt(i), 48 > c || c > 57) {\n                  valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n                  value = value.slice(0, i);\n                  break;\n                }\n              }\n            }\n          }\n\n          // If the fill character is not \"0\", grouping is applied before padding.\n          if (comma && !zero) value = group(value, Infinity);\n\n          // Compute the padding.\n          var length = valuePrefix.length + value.length + valueSuffix.length,\n              padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n          // If the fill character is \"0\", grouping is applied after padding.\n          if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n          // Reconstruct the final output based on the desired alignment.\n          switch (align) {\n            case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n            case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n            case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n            default: value = padding + valuePrefix + value + valueSuffix; break;\n          }\n\n          return numerals(value);\n        }\n\n        format.toString = function() {\n          return specifier + \"\";\n        };\n\n        return format;\n      }\n\n      function formatPrefix(specifier, value) {\n        var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n            e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n            k = Math.pow(10, -e),\n            prefix = prefixes[8 + e / 3];\n        return function(value) {\n          return f(k * value) + prefix;\n        };\n      }\n\n      return {\n        format: newFormat,\n        formatPrefix: formatPrefix\n      };\n    }\n\n    var locale;\n    var format;\n    var formatPrefix;\n\n    defaultLocale({\n      thousands: \",\",\n      grouping: [3],\n      currency: [\"$\", \"\"]\n    });\n\n    function defaultLocale(definition) {\n      locale = formatLocale(definition);\n      format = locale.format;\n      formatPrefix = locale.formatPrefix;\n      return locale;\n    }\n\n    function precisionFixed(step) {\n      return Math.max(0, -exponent(Math.abs(step)));\n    }\n\n    function precisionPrefix(step, value) {\n      return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n    }\n\n    function precisionRound(step, max) {\n      step = Math.abs(step), max = Math.abs(max) - step;\n      return Math.max(0, exponent(max) - exponent(step)) + 1;\n    }\n\n    function tickFormat(start, stop, count, specifier) {\n      var step = tickStep(start, stop, count),\n          precision;\n      specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n      switch (specifier.type) {\n        case \"s\": {\n          var value = Math.max(Math.abs(start), Math.abs(stop));\n          if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n          return formatPrefix(specifier, value);\n        }\n        case \"\":\n        case \"e\":\n        case \"g\":\n        case \"p\":\n        case \"r\": {\n          if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n          break;\n        }\n        case \"f\":\n        case \"%\": {\n          if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n          break;\n        }\n      }\n      return format(specifier);\n    }\n\n    function linearish(scale) {\n      var domain = scale.domain;\n\n      scale.ticks = function(count) {\n        var d = domain();\n        return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n      };\n\n      scale.tickFormat = function(count, specifier) {\n        var d = domain();\n        return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n      };\n\n      scale.nice = function(count) {\n        if (count == null) count = 10;\n\n        var d = domain();\n        var i0 = 0;\n        var i1 = d.length - 1;\n        var start = d[i0];\n        var stop = d[i1];\n        var prestep;\n        var step;\n        var maxIter = 10;\n\n        if (stop < start) {\n          step = start, start = stop, stop = step;\n          step = i0, i0 = i1, i1 = step;\n        }\n        \n        while (maxIter-- > 0) {\n          step = tickIncrement(start, stop, count);\n          if (step === prestep) {\n            d[i0] = start;\n            d[i1] = stop;\n            return domain(d);\n          } else if (step > 0) {\n            start = Math.floor(start / step) * step;\n            stop = Math.ceil(stop / step) * step;\n          } else if (step < 0) {\n            start = Math.ceil(start * step) / step;\n            stop = Math.floor(stop * step) / step;\n          } else {\n            break;\n          }\n          prestep = step;\n        }\n\n        return scale;\n      };\n\n      return scale;\n    }\n\n    function linear() {\n      var scale = continuous();\n\n      scale.copy = function() {\n        return copy(scale, linear());\n      };\n\n      initRange.apply(scale, arguments);\n\n      return linearish(scale);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function assignTransitionStagger(transition, currentData, selection, presenter) {\n        const { layerStagger } = presenter.morphchartsref;\n        const { morphChartsRenderResult } = presenter;\n        const cubelayer = morphChartsRenderResult.getCubeLayer();\n        const range = transition.reverse ? [1, 0] : [0, 1];\n        if (!transition || transition.type === 'ordinal' && !transition.reverse) {\n            delete layerStagger.cubes;\n        }\n        else {\n            const staggerOrders = new Float64Array(cubelayer.positionsX.length);\n            switch (transition.type) {\n                case 'ordinal': {\n                    //reverse ordinal\n                    const scale = linear(range).domain([0, currentData.length]);\n                    currentData.forEach((datum, i) => {\n                        const glOrdinal = datum[GL_ORDINAL];\n                        staggerOrders[glOrdinal] = scale(i);\n                    });\n                    break;\n                }\n                case 'column': {\n                    if (transition.column.quantitative) {\n                        const values = new Float64Array(currentData.length);\n                        currentData.forEach((datum, i) => {\n                            values[i] = datum[transition.column.name];\n                        });\n                        const stats = getStats(currentData, transition.column);\n                        const scale = linear(range).domain([stats.min, stats.max]);\n                        currentData.forEach((datum, i) => {\n                            const glOrdinal = datum[GL_ORDINAL];\n                            staggerOrders[glOrdinal] = scale(values[i]);\n                        });\n                    }\n                    else {\n                        const strings = new Array(currentData.length);\n                        currentData.forEach((datum, i) => {\n                            strings[i] = datum[transition.column.name];\n                        });\n                        getStats(currentData, transition.column, distictValues => {\n                            currentData.forEach((datum, i) => {\n                                const glOrdinal = datum[GL_ORDINAL];\n                                const index = distictValues.indexOf(strings[i]);\n                                const staggerOrder = index / distictValues.length;\n                                staggerOrders[glOrdinal] = transition.reverse ? 1 - staggerOrder : staggerOrder;\n                            });\n                        });\n                    }\n                    break;\n                }\n                case 'position': {\n                    const dimensions = {\n                        x: cubelayer.positionsX,\n                        y: cubelayer.positionsY,\n                        z: cubelayer.positionsZ,\n                    };\n                    const positions = dimensions[transition.dimension];\n                    const values = new Float64Array(currentData.length);\n                    currentData.forEach((datum, i) => {\n                        const glOrdinal = datum[GL_ORDINAL];\n                        values[i] = positions[glOrdinal];\n                    });\n                    const stats = getStats(values, null, 'number', true);\n                    const scale = linear(range).domain([stats.min, stats.max]);\n                    currentData.forEach((datum, i) => {\n                        const glOrdinal = datum[GL_ORDINAL];\n                        staggerOrders[glOrdinal] = scale(values[i]);\n                    });\n                    break;\n                }\n            }\n            layerStagger.cubes = { staggerOrders, maxStaggerOrder: 1, minStaggerOrder: 0 };\n        }\n        cubelayer.update(morphChartsRenderResult.bounds, selection, layerStagger.cubes);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    const { defaultView } = defaults;\n    const zAxisZindex = 1010;\n    let didRegisterColorSchemes = false;\n    /**\n     * Component to view a SandDance data visualization.\n     */\n    class Viewer {\n        /**\n         * Instantiate a new Viewer.\n         * @param element Parent HTMLElement to present within.\n         * @param options Optional viewer options object.\n         */\n        constructor(element, options) {\n            this.element = element;\n            this.options = deepMerge(defaultViewerOptions, options);\n            this.presenter = new Presenter(element, getPresenterStyle(this.options));\n            //this.presenter.logger = console.log;\n            this._characterSet = new CharacterSet();\n            this._dataScope = new DataScope();\n            this._animator = new Animator(this._dataScope, {\n                onDataChanged: this.onDataChanged.bind(this),\n                onAnimateDataChange: this.onAnimateDataChange.bind(this),\n            });\n            this._details = new Details(this.presenter.getElement(PresenterElement.panel), this.options.language, this._animator, this._dataScope, remap => {\n                this.currentColorContext = ~~remap;\n                this.renderSameLayout();\n            }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n            this.insight = {};\n        }\n        changeColorContexts(colorContexts) {\n            this.colorContexts = colorContexts;\n            this.currentColorContext = 0;\n            this.options.onColorContextChange && this.options.onColorContextChange();\n        }\n        applyLegendColorContext(colorContext) {\n            const a = getActiveElementInfo();\n            mount(colorContext.legendElement, this.presenter.getElement(PresenterElement.legend));\n            setActiveElement(a);\n            this.presenter.stage.legend = colorContext.legend;\n        }\n        onAnimateDataChange(dataChange, waitingLabel, handlerLabel, time) {\n            var _a;\n            if (time === undefined) {\n                const transitionDurations = ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transitionDurations) || defaultPresenterConfig.transitionDurations;\n                time = transitionDurations.position + transitionDurations.stagger;\n            }\n            return new Promise((resolve, reject) => {\n                let innerPromise;\n                if (dataChange === DataLayoutChange.refine) {\n                    const oldColorContext = this.colorContexts[this.currentColorContext];\n                    innerPromise = new Promise(innerResolve => {\n                        this.renderNewLayout({}, Object.assign(Object.assign({}, (this.setup || {})), { preStage: (stage, cubeLayer) => {\n                                finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                                this.overrideAxisLabels(stage);\n                                cubeLayer.unitColorMap = oldColorContext.colorMap;\n                                if (this.options.onStage) {\n                                    this.options.onStage(stage);\n                                }\n                            } })).then(() => {\n                            //apply old legend\n                            this.applyLegendColorContext(oldColorContext);\n                            innerResolve();\n                        });\n                    });\n                }\n                else {\n                    innerPromise = this.renderNewLayout({}, Object.assign(Object.assign({}, (this.setup || {})), { preStage: (stage, colorMapper) => {\n                            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                            this.overrideAxisLabels(stage);\n                            if (this.options.onStage) {\n                                this.options.onStage(stage);\n                            }\n                        } }));\n                }\n                innerPromise.then(() => {\n                    this.presenter.animationQueue(resolve, time, { waitingLabel, handlerLabel, animationCanceled: reject });\n                });\n            });\n        }\n        onDataChanged(dataLayout, filter) {\n            return __awaiter(this, void 0, void 0, function* () {\n                switch (dataLayout) {\n                    case DataLayoutChange.same: {\n                        const hasSelectedData = this._dataScope.hasSelectedData();\n                        const hasActive = !!this._dataScope.active;\n                        if (hasSelectedData || hasActive) {\n                            this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n                        }\n                        else {\n                            this.presenter.morphChartsRenderResult.update({ cubes: null });\n                        }\n                        break;\n                    }\n                    case DataLayoutChange.refine: {\n                        //save cube colors\n                        const oldColorContext = this.colorContexts[this.currentColorContext];\n                        let colorMap;\n                        this.presenter.morphChartsRenderResult.update({ cubes: null });\n                        yield this.renderNewLayout({}, Object.assign(Object.assign({}, (this.setup || {})), { preStage: (stage, cubeLayer) => {\n                                //save off the spec colors\n                                colorMap = cubeLayer.unitColorMap;\n                                cubeLayer.unitColorMap = oldColorContext.colorMap;\n                                this.preStage(stage, cubeLayer);\n                            }, onPresent: () => {\n                                //save new legend\n                                const newColorContext = {\n                                    colorMap,\n                                    legend: clone(this.presenter.stage.legend),\n                                    legendElement: this.presenter.getElement(PresenterElement.legend).children[0],\n                                };\n                                //apply old legend\n                                this.applyLegendColorContext(oldColorContext);\n                                this.changeColorContexts([oldColorContext, newColorContext]);\n                                this.onPresent();\n                            } }));\n                        //narrow the filter only if it is different\n                        if (!compare(this.insight.filter, filter)) {\n                            this.insight.filter = narrow(this.insight.filter, filter);\n                        }\n                        if (this.options.onDataFilter) {\n                            this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                        }\n                        break;\n                    }\n                    case DataLayoutChange.reset: {\n                        const colorContext = {\n                            colorMap: null,\n                            legend: null,\n                            legendElement: null,\n                        };\n                        this.changeColorContexts([colorContext]);\n                        this.presenter.morphChartsRenderResult.update({ cubes: null });\n                        yield this.renderNewLayout({}, Object.assign(Object.assign({}, (this.setup || {})), { onPresent: () => {\n                                //color needs to change instantly\n                                populateColorContext(colorContext, this.presenter);\n                                this.onPresent();\n                            } }));\n                        delete this.insight.filter;\n                        if (this.options.onDataFilter) {\n                            this.options.onDataFilter(null, null);\n                        }\n                        break;\n                    }\n                }\n                if (this.options.onSelectionChanged) {\n                    const sel = this.getSelection();\n                    this.options.onSelectionChanged((sel && sel.search) || null, 0, (sel && sel.selectedData) || null);\n                }\n            });\n        }\n        convertSearchToSet() {\n            if (this._dataScope.selection) {\n                const s = new Set();\n                let found = false;\n                this._dataScope.selection.included.forEach((o, i) => {\n                    s.add(o[GL_ORDINAL]);\n                    found = true;\n                });\n                if (!found) {\n                    s.add(-1);\n                }\n                return s;\n            }\n        }\n        convertSetToSearch(s) {\n            const search = {\n                expressions: [],\n            };\n            s.forEach(value => {\n                search.expressions.push({\n                    name: GL_ORDINAL,\n                    operator: '==',\n                    value,\n                    clause: '||',\n                });\n            });\n            return search;\n        }\n        getSpecColumnsWithFilteredStats() {\n            if (!this._dataScope.hasFilteredData()) {\n                return this._specColumns;\n            }\n            const roles = ['color', 'facet', 'group', 'size', 'sort', 'sum', 'x', 'y', 'z'];\n            const specColumns = Object.assign({}, this._specColumns);\n            roles.forEach(r => {\n                if (specColumns[r]) {\n                    const column = Object.assign({}, specColumns[r]);\n                    column.stats = this.getColumnStats(column);\n                    specColumns[r] = column;\n                }\n            });\n            return specColumns;\n        }\n        renderNewLayout(signalValues, presenterConfig, view) {\n            return __awaiter(this, void 0, void 0, function* () {\n                const currData = this._dataScope.currentData();\n                const context = {\n                    specColumns: this.getSpecColumnsWithFilteredStats(),\n                    insight: this.insight,\n                    specViewOptions: Object.assign(Object.assign({}, this.options), { zAxisOptions: {\n                            showZAxis: true,\n                            zIndex: zAxisZindex,\n                        }, collapseFacetAxes: true }),\n                };\n                const specResult = build(context, currData);\n                if (!specResult.errors) {\n                    const uiValues = extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n                    applySignalValues(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n                    unbindSignalUI(specResult.vegaSpec);\n                    this.vegaSpec = specResult.vegaSpec;\n                    this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n                    this.specCapabilities = specResult.specCapabilities;\n                    const config = this.createConfig(presenterConfig);\n                    this._lastPresenterConfig = config.presenterConfig;\n                    if (view) {\n                        config.getView = () => view;\n                    }\n                    if (!didRegisterColorSchemes) {\n                        registerColorSchemes(base.vega);\n                        didRegisterColorSchemes = true;\n                    }\n                    try {\n                        if (this.vegaViewGl) {\n                            this.vegaViewGl.finalize();\n                        }\n                        const runtime = base.vega.parse(this.vegaSpec);\n                        this.vegaViewGl = new ViewGl(runtime, config)\n                            .renderer('morphcharts')\n                            .initialize(this.element);\n                        yield this.vegaViewGl.runAsync();\n                        const handler = (n, v) => {\n                            this._characterSet.resetCharacterSet(true);\n                        };\n                        this.vegaSpec.signals.forEach(s => {\n                            this.vegaViewGl.addSignalListener(s.name, handler);\n                        });\n                        //capture new color color contexts via signals\n                        this.configForSignalCapture(config.presenterConfig);\n                    }\n                    catch (e) {\n                        specResult.errors = [e.message];\n                    }\n                    if (!specResult.errors) {\n                        ensureHeaders(this.presenter, this.options.language.headers);\n                    }\n                }\n                if (specResult.errors) {\n                    if (this.options.onError) {\n                        this.options.onError(specResult.errors);\n                    }\n                    else if (this.presenter.logger) {\n                        this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n                    }\n                }\n                return specResult;\n            });\n        }\n        /**\n         * Render the same layout with new options.\n         * @param newViewerOptions New options object.\n         */\n        renderSameLayout(newViewerOptions) {\n            const colorContext = this.colorContexts[this.currentColorContext];\n            this.applyLegendColorContext(colorContext);\n            if (newViewerOptions) {\n                if (newViewerOptions.colors) {\n                    //set theme colors PresenterConfig\n                    const mcColors = this.getMorphChartsColors();\n                    this.presenter.configColors(mcColors);\n                    this._lastPresenterConfig.morphChartsColors = mcColors;\n                }\n                this.options = deepMerge(this.options, newViewerOptions);\n            }\n            this.presenter.morphChartsRenderResult.getCubeLayer().unitColorMap = colorContext.colorMap;\n            this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n        }\n        getView(view) {\n            if (view === undefined) {\n                if (this.presenter.view === null) {\n                    return defaultView;\n                }\n                else {\n                    return this.presenter.view;\n                }\n            }\n            else {\n                return view;\n            }\n        }\n        transformData(values, transform) {\n            try {\n                const runtime = base.vega.parse({\n                    $schema: 'https://vega.github.io/schema/vega/v4.json',\n                    data: [{\n                            name: 'source',\n                            values,\n                            transform,\n                        }],\n                });\n                new ViewGl(runtime).run();\n            }\n            catch (e) {\n                // continue regardless of error\n            }\n            return values;\n        }\n        /**\n         * Render data into a visualization.\n         * @param insightSetup InsightSetup object to create a visualization rendering.\n         * @param data Array of data objects.\n         * @param renderOptions Optional RenderOptions object.\n         */\n        render(insightSetup_1, data_1) {\n            return __awaiter(this, arguments, void 0, function* (insightSetup, data, renderOptions = {}) {\n                const { insight, setup } = insightSetup;\n                let result;\n                //see if refine expression has changed\n                if (!compare(insight.filter, this.insight.filter)) {\n                    const transitionDurations = (setup === null || setup === void 0 ? void 0 : setup.transitionDurations) || defaultPresenterConfig.transitionDurations;\n                    const renderTime = transitionDurations.position + transitionDurations.stagger;\n                    const allowAsyncRenderTime = renderTime + this.options.filterRenderingTimerPadding;\n                    if (insight.filter) {\n                        //refining\n                        result = yield this._render(insightSetup, data, renderOptions, true);\n                        this.presenter.animationQueue(() => {\n                            this.filter(insight.filter, renderOptions.rebaseFilter && renderOptions.rebaseFilter());\n                        }, allowAsyncRenderTime, { waitingLabel: 'layout before refine', handlerLabel: 'refine after layout' });\n                    }\n                    else {\n                        //not refining\n                        this._dataScope.setFilteredData(null);\n                        result = yield this._render(insightSetup, data, renderOptions, true);\n                        this.presenter.animationQueue(() => {\n                            this.reset();\n                        }, allowAsyncRenderTime, { waitingLabel: 'layout before reset', handlerLabel: 'reset after layout' });\n                    }\n                }\n                else {\n                    result = yield this._render(insightSetup, data, renderOptions, false);\n                }\n                return result;\n            });\n        }\n        shouldViewstateTransition(newInsight, oldInsight) {\n            if (!oldInsight.columns)\n                return false;\n            if (oldInsight.chart !== newInsight.chart)\n                return true;\n            if (oldInsight.size.height !== newInsight.size.height)\n                return true;\n            if (oldInsight.size.width !== newInsight.size.width)\n                return true;\n            if (oldInsight.columns.facet !== newInsight.columns.facet)\n                return true;\n            return false;\n        }\n        configForSignalCapture(presenterConfig) {\n            const colorContext = {\n                colorMap: null,\n                legend: null,\n                legendElement: null,\n            };\n            //now be ready to capture color changing signals \n            presenterConfig.preStage = (stage, cubeLayer) => {\n                if (this._shouldSaveColorContext()) {\n                    //save off the colors from Vega layout\n                    colorContext.colorMap = cubeLayer.unitColorMap;\n                }\n                this.preStage(stage, cubeLayer);\n            };\n            presenterConfig.onPresent = () => {\n                if (this._shouldSaveColorContext()) {\n                    populateColorContext(colorContext, this.presenter);\n                    this.changeColorContexts([colorContext]);\n                    this._dataScope.deselect();\n                }\n                this.onPresent();\n            };\n        }\n        onPresent() {\n            var _a;\n            if ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transition) {\n                assignTransitionStagger(this.setup.transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n            }\n            this.options.onPresent && this.options.onPresent();\n        }\n        _render(insightSetup, data, renderOptions, forceNewCharacterSet) {\n            return __awaiter(this, void 0, void 0, function* () {\n                const { insight, setup } = insightSetup;\n                if (this._tooltip) {\n                    this._tooltip.destroy();\n                    this._tooltip = null;\n                }\n                if (this._dataScope.setData(data, renderOptions.columns)) {\n                    //apply transform to the data\n                    this.transformData(data, insight.transform);\n                }\n                this._specColumns = getSpecColumns(insight, this._dataScope.getColumns(renderOptions.columnTypes));\n                const ordinalMap = assignOrdinals(this._specColumns, data, renderOptions.ordinalMap);\n                this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n                this.insight = clone(insight);\n                this.setup = setup;\n                this._shouldSaveColorContext = () => !renderOptions.initialColorContext;\n                const colorContext = renderOptions.initialColorContext || {\n                    colorMap: null,\n                    legend: null,\n                    legendElement: null,\n                };\n                const specResult = yield this.renderNewLayout(insight.signalValues, Object.assign(Object.assign({}, (setup || {})), { preStage: (stage, cubeLayer) => {\n                        if (this._shouldSaveColorContext()) {\n                            //save off the colors from Vega layout\n                            colorContext.colorMap = cubeLayer.unitColorMap;\n                        }\n                        else {\n                            //apply passed colorContext\n                            cubeLayer.unitColorMap = colorContext.colorMap;\n                        }\n                        //if items are selected, repaint\n                        const hasSelectedData = !!this._dataScope.hasSelectedData();\n                        //const hasActive = !!this._dataScope.active;\n                        if (hasSelectedData || this._dataScope.active) ;\n                        this.preStage(stage, cubeLayer);\n                    }, onPresent: () => {\n                        if (this._shouldSaveColorContext()) {\n                            populateColorContext(colorContext, this.presenter);\n                            this.changeColorContexts([colorContext]);\n                        }\n                        else {\n                            //apply passed colorContext\n                            this.applyLegendColorContext(colorContext);\n                        }\n                        this.onPresent();\n                    }, shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight) }), this.getView(insight.view));\n                //future signal changes should save the color context\n                this._shouldSaveColorContext = () => !renderOptions.discardColorContextUpdates || !renderOptions.discardColorContextUpdates();\n                this._details.render();\n                const result = { ordinalMap, specResult };\n                return result;\n            });\n        }\n        overrideAxisLabels(stage) {\n            // if (this._specColumns.x && this._specColumns.x.type === 'date') {\n            //     stage.axes.x.forEach(axis => makeDateRange(\n            //         axis.tickText,\n            //         this.getColumnStats(this._specColumns.x)\n            //     ));\n            // }\n            // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n            //     stage.axes.y.forEach(axis => makeDateRange(\n            //         axis.tickText,\n            //         this.getColumnStats(this._specColumns.y)\n            //     ));\n            // }\n        }\n        preLayer(stage) {\n            //convert ticks\n            let axisRole;\n            for (axisRole in stage.axes) {\n                const capability = this.specCapabilities.roles.filter(r => r.role === axisRole)[0];\n                if (capability && (capability.axisSelectionBetweenTicks || capability.axisSelection === 'exact')) {\n                    moveTicksBetween(stage.axes[axisRole]);\n                }\n            }\n        }\n        preStage(stage, cubeLayer) {\n            this.overrideAxisLabels(stage);\n            this._axisSelection = new AxisSelection(this.specCapabilities, this._specColumns, stage);\n            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            if (this.options.onStage) {\n                this.options.onStage(stage);\n            }\n        }\n        onCubeClick(e, cube) {\n            this.options.onCubeClick && this.options.onCubeClick(e, cube);\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n                //if active is within selection, keep the selection and activate the one.\n                const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n                if (indexWithinSelection.index >= 0) {\n                    this.activate(indexWithinSelection.datum);\n                    this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                    if (this.options.onSelectionChanged) {\n                        const sel = this.getSelection();\n                        this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                    }\n                    return;\n                }\n            }\n            if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][GL_ORDINAL] === cube.ordinal) {\n                this.deselect();\n                return;\n            }\n            const search = {\n                name: GL_ORDINAL,\n                operator: '==',\n                value: cube.ordinal,\n            };\n            this.select(search);\n        }\n        onCubeHover(event, cube) {\n            var _a, _b;\n            if (this._tooltip) {\n                this._tooltip.destroy();\n                this._tooltip = null;\n            }\n            if (!cube) {\n                return;\n            }\n            const currentData = this._dataScope.currentData();\n            const index = getDataIndexOfCube(cube, currentData);\n            if (index >= 0) {\n                const dataItem = cleanDataItem(((_a = this.options.tooltipOptions) === null || _a === void 0 ? void 0 : _a.prepareDataItem(currentData[index])) || currentData[index]);\n                const tooltipCreateOptions = {\n                    dataItem,\n                    event,\n                };\n                if ((_b = this.options.tooltipOptions) === null || _b === void 0 ? void 0 : _b.create) {\n                    this._tooltip = this.options.tooltipOptions.create(tooltipCreateOptions);\n                }\n                else {\n                    this._tooltip = new Tooltip(Object.assign(Object.assign({}, tooltipCreateOptions), { cssPrefix: this.presenter.style.cssPrefix }));\n                }\n            }\n        }\n        onTextHover(e, t) {\n            //return true if highlight color is different\n            if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor)\n                return false;\n            return !colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n        }\n        getMorphChartsColors() {\n            const { colors } = this.options;\n            return {\n                activeItemColor: colors.activeCube,\n                axesGridBackgroundColor: colors.backgroundColor,\n                axesGridHighlightColor: colors.axisSelectHighlight,\n                axesGridMajorColor: colors.gridLine,\n                axesGridMinorColor: colors.gridLine,\n                axesGridZeroColor: colors.gridLine,\n                axesTextHeadingColor: colors.axisText,\n                axesTextLabelColor: colors.axisText,\n                axesTextTitleColor: colors.axisText,\n                backgroundColor: colors.backgroundColor,\n                textBorderColor: colors.backgroundColor,\n                textColor: colors.axisText,\n            };\n        }\n        createConfig(c) {\n            var _a;\n            const { getTextColor, getTextHighlightColor, onTextClick } = this.options;\n            const defaultPresenterConfig = {\n                morphChartsColors: this.getMorphChartsColors(),\n                zAxisZindex,\n                getCharacterSet: stage => this._characterSet.getCharacterSet(stage),\n                getTextColor,\n                getTextHighlightColor,\n                onTextClick: (e, t) => {\n                    if (t.metaData && t.metaData.search) {\n                        //used by facets to select the facet\n                        const search = getSearchGroupFromVegaValue(t.metaData.search);\n                        if (this.options.onAxisClick) {\n                            this.options.onAxisClick(e, search);\n                        }\n                        else {\n                            this.select(search);\n                        }\n                    }\n                    if (onTextClick) {\n                        onTextClick(e, t);\n                    }\n                },\n                onCubeClick: this.onCubeClick.bind(this),\n                onCubeHover: this.onCubeHover.bind(this),\n                onTextHover: this.onTextHover.bind(this),\n                preLayer: this.preLayer.bind(this),\n                preStage: this.preStage.bind(this),\n                onPresent: this.onPresent.bind(this),\n                onAxisConfig: (cartesian, dim3d, axis) => {\n                    if (!axis)\n                        return;\n                    const role = this.specCapabilities.roles.filter(r => r.role === axis.axisRole)[0];\n                    if (role === null || role === void 0 ? void 0 : role.axisSelection) {\n                        cartesian.isDivisionPickingEnabled[dim3d] = true;\n                        cartesian.arePickDivisionsVisible[dim3d] = axis.tickText.length > 0;\n                        cartesian.isLabelPickingEnabled[dim3d] = true;\n                        cartesian.isTitlePickingEnabled[dim3d] = true;\n                        cartesian.isHeadingPickingEnabled[dim3d] = true;\n                        cartesian.isGridPickingEnabled = false;\n                    }\n                },\n                onAxesComplete: (cartesian) => {\n                },\n                axisPickGridCallback: (divisions, e) => {\n                    const search = this._axisSelection.convert(divisions);\n                    if (this.options.onAxisClick) {\n                        this.options.onAxisClick(e, search); //TODO change onAxisClick to accept Search\n                    }\n                    else {\n                        this.select(search);\n                    }\n                },\n                onLayerClick: (e) => {\n                    this.options.onCanvasClick && this.options.onCanvasClick(e);\n                    this.deselect();\n                },\n                onLegendClick: (e, legend, clickedIndex) => {\n                    const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n                    if (legendRow) {\n                        if (this.options.onLegendRowClick) {\n                            this.options.onLegendRowClick(e, legendRow);\n                        }\n                        else {\n                            this.select(legendRow.search);\n                        }\n                    }\n                    else if (this.options.onLegendHeaderClick) {\n                        //header clicked\n                        this.options.onLegendHeaderClick(e);\n                    }\n                },\n                onSceneRectAssignCubeOrdinal: datum => {\n                    //TODO see if datum is a facet selection rect\n                    return datum[GL_ORDINAL];\n                },\n                onTargetViewState: (h, w) => {\n                    const { height, width } = this.insight.size;\n                    let newViewStateTarget;\n                    if (this.options.onNewViewStateTarget) {\n                        newViewStateTarget = this.options.onNewViewStateTarget();\n                    }\n                    return { height, width, newViewStateTarget };\n                },\n                layerSelection: {\n                    cubes: this.convertSearchToSet(),\n                },\n                preserveDrawingBuffer: this.options.preserveDrawingBuffer,\n            };\n            if (!this.options.disableLasso) {\n                defaultPresenterConfig.onLasso = (ids, e) => {\n                    this.deselect();\n                    const search = this.convertSetToSearch(ids);\n                    this.select(search);\n                };\n            }\n            if (this.options.onBeforeCreateLayers) {\n                defaultPresenterConfig.preLayer = stage => {\n                    this.preLayer(stage);\n                    this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n                };\n            }\n            const config = {\n                presenter: this.presenter,\n                presenterConfig: Object.assign(defaultPresenterConfig, c),\n            };\n            if ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transitionDurations) {\n                config.presenterConfig.transitionDurations = this.setup.transitionDurations;\n            }\n            return config;\n        }\n        /**\n         * Filter the data and animate.\n         * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n         * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n         */\n        filter(search, rebase = false) {\n            const u = this._dataScope.createUserSelection(search, false, rebase);\n            return new Promise((resolve, reject) => {\n                this._animator.filter(search, u.included, u.excluded, rebase).then(() => {\n                    this._details.clear();\n                    this._details.clearSelection();\n                    this._details.populate(this._dataScope.selection);\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Remove any filtration and animate.\n         */\n        reset() {\n            return new Promise((resolve, reject) => {\n                this._animator.reset().then(() => {\n                    this._details.clear();\n                    this._details.clearSelection();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Select cubes by a filter expression.\n         * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n         */\n        select(search) {\n            return new Promise((resolve, reject) => {\n                this._animator.select(search).then(() => {\n                    this._details.populate(this._dataScope.selection);\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Removes any selection.\n         */\n        deselect() {\n            return new Promise((resolve, reject) => {\n                this._animator.deselect().then(() => {\n                    this._details.clearSelection();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Gets the current selection.\n         */\n        getSelection() {\n            if (!this._dataScope)\n                return null;\n            const selectionState = {\n                search: (this._dataScope.selection && this._dataScope.selection.search) || null,\n                selectedData: (this._dataScope.selection && this._dataScope.selection.included) || null,\n                active: this._dataScope.active,\n            };\n            return selectionState;\n        }\n        /**\n         * Set one data row to the active state.\n         */\n        activate(datum) {\n            return new Promise((resolve, reject) => {\n                this._animator.activate(datum).then(() => {\n                    this.presenter.morphChartsRenderResult.activate(datum[GL_ORDINAL]);\n                    this._details.render();\n                    resolve();\n                });\n            });\n        }\n        /**\n         * Deactivate item.\n         */\n        deActivate() {\n            return new Promise((resolve, reject) => {\n                if (this._dataScope && this._dataScope.active) {\n                    this._animator.deactivate().then(() => {\n                        this.presenter.morphChartsRenderResult.activate(-1);\n                        this._details.render();\n                        resolve();\n                    });\n                }\n                else {\n                    resolve();\n                }\n            });\n        }\n        /**\n         * Gets the current camera.\n         * @param transitionFinal Optional flag to get camera destination when transition completes.\n         */\n        getCamera(transitionFinal = false) {\n            var _a, _b, _c, _d, _e, _f, _g;\n            let position = [0, 0, 0];\n            let rotation = [0, 0, 0, 0];\n            if (transitionFinal) {\n                position = Array.from((_b = (_a = this.presenter) === null || _a === void 0 ? void 0 : _a.morphchartsref) === null || _b === void 0 ? void 0 : _b.cameraTransitioner.vPosition.to);\n                rotation = Array.from((_d = (_c = this.presenter) === null || _c === void 0 ? void 0 : _c.morphchartsref) === null || _d === void 0 ? void 0 : _d.cameraTransitioner.qRotation.to);\n            }\n            else {\n                const camera = (_g = (_f = (_e = this.presenter) === null || _e === void 0 ? void 0 : _e.morphchartsref) === null || _f === void 0 ? void 0 : _f.core) === null || _g === void 0 ? void 0 : _g.camera;\n                if (camera) {\n                    camera.getPosition(position);\n                    camera.getOrbit(rotation);\n                }\n            }\n            return { position, rotation, captureSize: this.insight.size };\n        }\n        /**\n         * Sets the current camera.\n         * @param camera Camera to set.\n         */\n        setCamera(camera) {\n            var _a, _b;\n            if (camera) {\n                (_b = (_a = this.presenter) === null || _a === void 0 ? void 0 : _a.morphChartsRenderResult) === null || _b === void 0 ? void 0 : _b.moveCamera(camera);\n            }\n        }\n        /**\n         * Gets the current insight with signal values.\n         */\n        getInsight() {\n            const insight = Object.assign({}, this.insight);\n            insight.signalValues = this.getSignalValues();\n            return insight;\n        }\n        /**\n         * Gets column stats from current data (filtered or all).\n         * @param column Column to get stats for.\n         */\n        getColumnStats(column) {\n            return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n        }\n        /**\n         * Gets current signal values.\n         */\n        getSignalValues() {\n            return extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n        }\n        assignTransitionStagger(transition) {\n            assignTransitionStagger(transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n        }\n        finalize() {\n            if (this._dataScope)\n                this._dataScope.finalize();\n            if (this._details)\n                this._details.finalize();\n            if (this._tooltip)\n                this._tooltip.destroy();\n            if (this.vegaViewGl)\n                this.vegaViewGl.finalize();\n            if (this.presenter)\n                this.presenter.finalize();\n            if (this.element)\n                this.element.innerHTML = '';\n            this.colorContexts = null;\n            this.element = null;\n            this.options = null;\n            this.presenter = null;\n            this.vegaSpec = null;\n            this.vegaViewGl = null;\n            this._animator = null;\n            this._dataScope = null;\n            this._details = null;\n            this._tooltip = null;\n        }\n    }\n    /**\n     * Default Viewer options.\n     */\n    Viewer.defaultViewerOptions = defaultViewerOptions;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const version = '4.0.6';\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const use = use$1;\n\n    exports.VegaMorphCharts = index;\n    exports.Viewer = Viewer;\n    exports.colorSchemes = colorSchemes;\n    exports.constants = constants$1;\n    exports.searchExpression = index$1;\n    exports.specs = index$2;\n    exports.types = types$1;\n    exports.use = use;\n    exports.util = util;\n    exports.version = version;\n\n}));\n"
  },
  {
    "path": "docs/dist/sanddance-explorer/v1/sanddance-explorer.css",
    "content": ".sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%; }\n\n.sanddance-gl {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0; }\n\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%); }\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em; }\n\n.sanddance-legend table {\n  border-collapse: collapse; }\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em; }\n\n.sanddance-legend .legend-row {\n  cursor: pointer; }\n\n.sanddance-legend .legend-row td {\n  padding: 2px; }\n\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef; }\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px; }\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden; }\n\n.sanddance-details {\n  font-size: smaller; }\n\n.sanddance-details-scroll {\n  padding-bottom: 1em; }\n\n.sanddance-tooltip {\n  z-index: 1; }\n\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute; }\n\n.sanddance-tooltip td {\n  text-align: left;\n  vertical-align: top;\n  width: 75%; }\n\n.sanddance-tooltip td:first-child {\n  width: 25%; }\n\n.sanddance-scheme.disabled {\n  filter: grayscale(95%); }\n\n.sanddance-scheme.option {\n  display: grid;\n  grid-template-columns: 10em auto;\n  width: 100%; }\n\n.sanddance-scheme.title {\n  justify-content: flex-start; }\n\n.sanddance-scheme span {\n  align-self: center; }\n\n.sanddance-scheme svg, .sanddance-scheme .swatch {\n  align-self: center;\n  border: thin solid #777;\n  height: 24px; }\n\n.sanddance-scheme svg {\n  width: 100%; }\n\n.sanddance-scheme .swatch div {\n  display: inline-block;\n  width: 10px;\n  height: 24px; }\n\n.sanddance-explorer-topbar {\n  background-color: #fff;\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: 300px auto;\n  height: 36px; }\n  .sanddance-explorer-topbar .logo {\n    color: #0078d4;\n    display: grid;\n    grid-template-columns: 50px auto;\n    padding: 6px 0; }\n    .sanddance-explorer-topbar .logo svg {\n      fill: #0078d4;\n      height: 24px;\n      margin: 0 auto;\n      width: 24px; }\n    .sanddance-explorer-topbar .logo a {\n      color: inherit;\n      font-size: 14px;\n      font-weight: bold;\n      line-height: 24px;\n      text-decoration: none; }\n\n.sanddance-explorer-commandbar {\n  position: relative; }\n  .sanddance-explorer-commandbar > div {\n    left: 0;\n    position: absolute;\n    right: 0; }\n  .sanddance-explorer-commandbar .ms-CommandBar {\n    height: 36px; }\n\n.dark-theme .sanddance-explorer-topbar {\n  background-color: #000; }\n  .dark-theme .sanddance-explorer-topbar .logo {\n    color: #00b4f0; }\n\n.sanddance-group {\n  border-top: 1px solid #ccc;\n  padding-bottom: 1.5em;\n  position: relative; }\n  .sanddance-group .group-head {\n    display: grid;\n    grid-template-columns: auto auto;\n    line-height: 16px;\n    margin: 1em 0; }\n    .sanddance-group .group-head label {\n      font-size: 11px;\n      font-weight: 600;\n      letter-spacing: 3px;\n      opacity: 0.8;\n      text-transform: uppercase; }\n    .sanddance-group .group-head .count {\n      color: #333;\n      font-size: 12px;\n      text-align: right; }\n  .sanddance-group .group-icon {\n    position: absolute;\n    top: -1px;\n    right: 0; }\n  .sanddance-group:first-child {\n    border-top: none; }\n    .sanddance-group:first-child .group-head {\n      margin-top: 0; }\n  .sanddance-group:last-child {\n    padding-bottom: 0; }\n\n.sanddance-sidebar {\n  background-color: #f9f9f9;\n  display: grid;\n  overflow: hidden;\n  position: relative;\n  transition: width 350ms cubic-bezier(0.4, 0, 0.2, 1);\n  width: 300px; }\n  .sanddance-sidebar:not(.pinned) {\n    bottom: 0;\n    position: absolute;\n    top: 0; }\n  .sanddance-sidebar .sidebar-content {\n    background-color: inherit;\n    display: grid;\n    grid-template-areas: \"stats stats\"\r \"tabs bar\";\n    grid-template-columns: 50px auto;\n    grid-template-rows: 0fr auto;\n    height: 100%;\n    overflow: hidden;\n    position: absolute;\n    z-index: 1; }\n  .sanddance-sidebar .vbuttons {\n    background-color: rgba(0, 0, 0, 0.1);\n    display: grid;\n    grid-area: tabs;\n    grid-template-rows: auto 0fr;\n    position: relative; }\n  .sanddance-sidebar .vbutton {\n    align-self: center;\n    display: grid;\n    height: 60px; }\n    .sanddance-sidebar .vbutton.selected {\n      background-color: #f9f9f9; }\n    .sanddance-sidebar .vbutton button {\n      height: 100%;\n      width: 100%; }\n      .sanddance-sidebar .vbutton button .ms-Button-icon {\n        font-size: 24px; }\n  .sanddance-sidebar .sidebar-dialogs .vbutton {\n    height: 16%;\n    max-height: 60px;\n    min-height: 32px; }\n  .sanddance-sidebar .scrollable-container {\n    width: 250px; }\n  .sanddance-sidebar .sidetab {\n    grid-area: bar;\n    padding: 12px; }\n  .sanddance-sidebar.closed {\n    width: 50px; }\n  .sanddance-sidebar.calculator .calculating {\n    background: rgba(249, 249, 249, 0.5);\n    height: 100%;\n    position: absolute;\n    top: 0;\n    width: 100%; }\n  .sanddance-sidebar.calculator .ms-Spinner {\n    margin-top: -16px;\n    position: relative;\n    top: 50%; }\n\n.dark-theme .sanddance-sidebar {\n  background-color: #272727;\n  color: #fff; }\n  .dark-theme .sanddance-sidebar .vbuttons {\n    background-color: rgba(0, 0, 0, 0.4); }\n  .dark-theme .sanddance-sidebar .vbutton.selected {\n    background-color: #272727; }\n  .dark-theme .sanddance-sidebar.calculator .calculating {\n    background: rgba(39, 39, 39, 0.5); }\n\n.sanddance-chart-type .ms-ChoiceFieldGroup-flexContainer {\n  display: grid;\n  grid-template-columns: repeat(2, 50%);\n  grid-auto-flow: column;\n  grid-template-rows: repeat(4, auto); }\n\n.sanddance-datascope {\n  grid-area: stats;\n  background-color: rgba(0, 0, 0, 0.05);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n  min-height: 5em; }\n  .sanddance-datascope.extended > div {\n    margin: 12px;\n    width: 276px; }\n  .sanddance-datascope label {\n    display: block;\n    font-size: 10px;\n    text-transform: uppercase; }\n  .sanddance-datascope.compact {\n    align-self: center;\n    cursor: pointer;\n    display: grid;\n    text-align: center;\n    width: 50px; }\n    .sanddance-datascope.compact > div {\n      align-self: center; }\n  .sanddance-datascope .datascope-button {\n    background-color: #fff;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    box-sizing: border-box;\n    height: 36px;\n    min-width: unset;\n    width: 33.333%; }\n    .sanddance-datascope .datascope-button:hover {\n      background-color: #0078d4;\n      color: #fff; }\n    .sanddance-datascope .datascope-button label {\n      cursor: inherit; }\n  .sanddance-datascope.active .datascope-button.selected {\n    border-color: #0078d4; }\n\n.dark-theme .sanddance-datascope {\n  background-color: rgba(0, 0, 0, 0.3);\n  border-bottom-color: rgba(255, 255, 255, 0.1); }\n  .dark-theme .sanddance-datascope .datascope-button {\n    background-color: #000;\n    border-color: rgba(255, 255, 255, 0.2);\n    color: #fff; }\n    .dark-theme .sanddance-datascope .datascope-button:hover {\n      background-color: #0078d4;\n      color: #fff; }\n\n.sanddance-dataItem {\n  background-color: #fff;\n  border: 1px solid #ddd; }\n  .sanddance-dataItem .name-value {\n    border-top: 1px solid #ddd;\n    cursor: pointer;\n    padding: 4px;\n    position: relative;\n    word-break: break-all; }\n    .sanddance-dataItem .name-value:hover {\n      background-color: #0078d4;\n      color: #fff; }\n    .sanddance-dataItem .name-value:first-child {\n      border-top: none; }\n  .sanddance-dataItem .column-name {\n    font-weight: 500; }\n  .sanddance-dataItem .bing-search {\n    text-align: right; }\n\n.dark-theme .sanddance-dataItem {\n  background-color: #000;\n  border-color: #222; }\n  .dark-theme .sanddance-dataItem .name-value {\n    border-top-color: #222; }\n  .dark-theme .sanddance-dataItem a {\n    color: #00b4f0; }\n\n.sanddance-dataIndex .index {\n  display: grid;\n  grid-template-columns: 32px auto 32px;\n  line-height: 32px;\n  margin: 0px -8px 6px -8px;\n  text-align: center; }\n\n.sanddance-dataIndex .item-filtered {\n  background-color: rgba(0, 0, 0, 0.1);\n  font-size: 10px;\n  padding: 2px 4px;\n  text-transform: uppercase; }\n\n.sanddance-dataIndex .ms-Dropdown-container {\n  margin-bottom: 0.5em; }\n\n.scrollable-container {\n  display: grid;\n  min-height: 200px;\n  position: relative; }\n\n.scrollable {\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  right: 0;\n  overflow-y: auto;\n  top: 0; }\n\n.sanddance-search .sanddance-search-group {\n  border: 1px solid rgba(0, 0, 0, 0.2); }\n\n.sanddance-search .sanddance-search-group {\n  background: #fff;\n  margin-top: 1em;\n  padding: 4px; }\n  .sanddance-search .sanddance-search-group:first-child {\n    margin-top: 0; }\n\n.sanddance-search .sanddance-search-expression {\n  background-color: rgba(0, 0, 0, 0.1);\n  margin: 12px 4px;\n  padding: 4px 8px 8px 8px; }\n\n.sanddance-search .search-action {\n  width: 100%; }\n\n.sanddance-search .search-bottom-action {\n  margin-top: 1em; }\n\n.sanddance-search .search-field {\n  margin-top: 4px; }\n\n.dark-theme .sanddance-search .sanddance-search-group {\n  border-color: rgba(255, 255, 255, 0.2);\n  background: #000; }\n\n.dark-theme .sanddance-search .sanddance-search-expression {\n  background-color: rgba(255, 255, 255, 0.2); }\n\n.sanddance-snapshots .snapshot {\n  cursor: pointer;\n  margin-top: 0.5em;\n  padding: 4px; }\n  .sanddance-snapshots .snapshot:hover {\n    background-color: rgba(0, 0, 0, 0.1); }\n\n.sanddance-snapshots .title {\n  display: grid;\n  grid-template-columns: auto 32px;\n  word-break: break-word; }\n\n.sanddance-snapshots img {\n  width: 100%; }\n\n.sanddance-snapshots .actions {\n  display: grid;\n  grid-auto-flow: column; }\n  .sanddance-snapshots .actions a {\n    align-self: center;\n    text-align: center; }\n  .sanddance-snapshots .actions button {\n    width: 100%; }\n\n.sanddance-columnMap {\n  position: relative; }\n  .sanddance-columnMap .ms-Dropdown-container {\n    margin-top: 10px; }\n  .sanddance-columnMap .column-options {\n    bottom: 3px;\n    position: absolute;\n    right: 0; }\n\n.sanddance-columnMap-absolute {\n  margin-bottom: 1em;\n  margin-left: -4em;\n  margin-right: 1em;\n  margin-top: -1em; }\n  .sanddance-columnMap-absolute .ms-Dropdown-container {\n    margin-top: 0; }\n\n.sanddance-tooltip {\n  z-index: 2; }\n\n.sanddance-tooltipMap {\n  margin-top: 10px; }\n\n.sanddance-explorer {\n  display: grid;\n  font-family: 'Segoe UI', sans-serif;\n  font-size: 13px;\n  grid-template-rows: 0fr auto; }\n  .sanddance-explorer.dark-theme {\n    background-color: black; }\n    .sanddance-explorer.dark-theme canvas {\n      background-color: black; }\n\n.sanddance-main {\n  display: grid;\n  position: relative;\n  transition: grid-template-columns 350ms cubic-bezier(0.4, 0, 0.2, 1); }\n  .sanddance-main .loading {\n    grid-row-end: span 2;\n    position: relative; }\n    .sanddance-main .loading .ms-Spinner {\n      position: absolute;\n      top: 50%;\n      width: 100%; }\n  .sanddance-main .sanddance-view {\n    display: grid;\n    position: relative; }\n  .sanddance-main .sanddance-layout-unpinned, .sanddance-main .sanddance-layout-pinned {\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 150px;\n    bottom: 0; }\n  .sanddance-main.hide-legend .sanddance-layout-unpinned, .sanddance-main.hide-legend .sanddance-layout-pinned {\n    right: 0; }\n  .sanddance-main .sanddance-layout-pinned {\n    left: 300px; }\n  .sanddance-main .sanddance-ReactViewer {\n    position: absolute;\n    top: 0;\n    left: -150px;\n    bottom: 0;\n    right: 0; }\n  .sanddance-main.hide-legend .sanddance-ReactViewer {\n    left: 0; }\n  .sanddance-main.show-center .sanddance-layout-unpinned, .sanddance-main.show-center .sanddance-layout-pinned {\n    background: linear-gradient(to right, transparent 49%, rgba(255, 0, 255, 0.2), transparent 51%);\n    background-color: rgba(0, 255, 255, 0.1); }\n  .sanddance-main.pinned {\n    grid-template-columns: 300px auto;\n    grid-template-areas: \"side main\"; }\n    .sanddance-main.pinned .sanddance-view {\n      grid-area: main; }\n    .sanddance-main.pinned .loading {\n      grid-area: main;\n      grid-row-end: unset; }\n    .sanddance-main.pinned .sanddance-slidePanel {\n      grid-area: side; }\n    .sanddance-main.pinned.closed {\n      grid-template-columns: 0 auto; }\n  .sanddance-main span.ms-layer {\n    display: none; }\n\n#sanddance-vega-spec {\n  border: 1px inset;\n  max-height: 20em;\n  overflow: scroll; }\n\n.sanddance-panel {\n  top: 5em;\n  bottom: unset;\n  overflow-y: unset;\n  padding-right: 1em;\n  padding-top: 32px; }\n  .sanddance-panel h4,\n  .sanddance-panel .sanddance-vegaControls,\n  .sanddance-panel .sanddance-unitControls {\n    display: none; }\n\n.sanddance-main.hide-legend .sanddance-panel {\n  display: none; }\n\n.sanddance-panel-tools {\n  position: absolute;\n  top: 0;\n  right: 0; }\n\n.sanddance-legend {\n  min-width: 54px; }\n\n.sanddance-explanation {\n  font-size: smaller;\n  font-style: italic;\n  margin-bottom: 1em; }\n  .sanddance-explanation .fieldname,\n  .sanddance-explanation .fieldtype {\n    font-style: italic; }\n\n.sanddance-signal {\n  margin-top: 1em; }\n\n.sanddance-legend th {\n  color: #005a9e;\n  cursor: pointer; }\n  .sanddance-legend th:hover {\n    color: #2b88d8; }\n\n.sanddance-legend .legend-row:hover {\n  background-color: #0078d4;\n  color: #fff; }\n\n.sanddance-dataExporter {\n  margin-top: 1em; }\n\n.sanddance-form-separate {\n  margin-top: 1em; }\n\n.dark-theme .sanddance-panel {\n  background-color: #000;\n  color: #fff; }\n\n.dark-theme .sanddance-legend th {\n  color: #3ac5f3; }\n  .dark-theme .sanddance-legend th:hover {\n    color: #009ed3; }\n"
  },
  {
    "path": "docs/dist/sanddance-explorer/v1/sanddance-explorer.js",
    "content": "// modules are defined as an array\n// [ module function, map of requires ]\n//\n// map of requires is short require name -> numeric require\n//\n// anything defined in a previous bundle is accessed via the\n// orig method which is the require for previous bundles\nparcelRequire = (function (modules, cache, entry, globalName) {\n  // Save the require from previous bundle to this closure if any\n  var previousRequire = typeof parcelRequire === 'function' && parcelRequire;\n  var nodeRequire = typeof require === 'function' && require;\n\n  function newRequire(name, jumped) {\n    if (!cache[name]) {\n      if (!modules[name]) {\n        // if we cannot find the module within our internal map or\n        // cache jump to the current global require ie. the last bundle\n        // that was added to the page.\n        var currentRequire = typeof parcelRequire === 'function' && parcelRequire;\n        if (!jumped && currentRequire) {\n          return currentRequire(name, true);\n        }\n\n        // If there are other bundles on this page the require from the\n        // previous one is saved to 'previousRequire'. Repeat this as\n        // many times as there are bundles until the module is found or\n        // we exhaust the require chain.\n        if (previousRequire) {\n          return previousRequire(name, true);\n        }\n\n        // Try the node require function if it exists.\n        if (nodeRequire && typeof name === 'string') {\n          return nodeRequire(name);\n        }\n\n        var err = new Error('Cannot find module \\'' + name + '\\'');\n        err.code = 'MODULE_NOT_FOUND';\n        throw err;\n      }\n\n      localRequire.resolve = resolve;\n      localRequire.cache = {};\n\n      var module = cache[name] = new newRequire.Module(name);\n\n      modules[name][0].call(module.exports, localRequire, module, module.exports, this);\n    }\n\n    return cache[name].exports;\n\n    function localRequire(x){\n      return newRequire(localRequire.resolve(x));\n    }\n\n    function resolve(x){\n      return modules[name][1][x] || x;\n    }\n  }\n\n  function Module(moduleName) {\n    this.id = moduleName;\n    this.bundle = newRequire;\n    this.exports = {};\n  }\n\n  newRequire.isParcelRequire = true;\n  newRequire.Module = Module;\n  newRequire.modules = modules;\n  newRequire.cache = cache;\n  newRequire.parent = previousRequire;\n  newRequire.register = function (id, exports) {\n    modules[id] = [function (require, module) {\n      module.exports = exports;\n    }, {}];\n  };\n\n  var error;\n  for (var i = 0; i < entry.length; i++) {\n    try {\n      newRequire(entry[i]);\n    } catch (e) {\n      // Save first error but execute all entries\n      if (!error) {\n        error = e;\n      }\n    }\n  }\n\n  if (entry.length) {\n    // Expose entry point to Node, AMD or browser globals\n    // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js\n    var mainExports = newRequire(entry[entry.length - 1]);\n\n    // CommonJS\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\n      module.exports = mainExports;\n\n    // RequireJS\n    } else if (typeof define === \"function\" && define.amd) {\n     define(function () {\n       return mainExports;\n     });\n\n    // <script>\n    } else if (globalName) {\n      this[globalName] = mainExports;\n    }\n  }\n\n  // Override the current require with this new one\n  parcelRequire = newRequire;\n\n  if (error) {\n    // throw error from earlier, _after updating parcelRequire_\n    throw error;\n  }\n\n  return newRequire;\n})({\"b0rV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ColorScaleNone = exports.Other = exports.SignalNames = exports.ScaleNames = exports.DataNames = exports.FieldNames = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst FieldNames = {\n  Active: '__SandDance__Active',\n  Collapsed: '__SandDance__Collapsed',\n  Selected: '__SandDance__Selected',\n  Top: '__SandDance__Top',\n  TopIndex: '__SandDance__TopIndex',\n  Index: '__SandDance__Index',\n  PowerBISelectionId: '__SandDance__PowerBISelectionId',\n  BarChartBin0: '__SandDance__BarChartBin0',\n  BarChartBin1: '__SandDance__BarChartBin1',\n  BarChartStack0: '__SandDance__BarChartStack0',\n  BarChartStack1: '__SandDance__BarChartStack1',\n  DensityCount: '__SandDance__DensityCount',\n  DensityRow: '__SandDance__DensityRow',\n  DensityXBin0: '__SandDance__DensityXBin0',\n  DensityXBin1: '__SandDance__DensityXBin1',\n  DensityYBin0: '__SandDance__DensityYBin0',\n  DensityYBin1: '__SandDance__DensityYBin1',\n  FacetBin0: '__SandDance__FacetBin0',\n  FacetBin1: '__SandDance__FacetBin1',\n  GridIndex: '__SandDance__GridIndex',\n  StacksLatBin0: '__SandDance__StacksLatBin0',\n  StacksLatBin1: '__SandDance__StacksLatBin1',\n  StacksLongBin0: '__SandDance__StacksLongBin0',\n  StacksLongBin1: '__SandDance__StacksLongBin1',\n  StacksStart: '__SandDance__StacksStart',\n  StacksEnd: '__SandDance__StacksEnd',\n  TreemapStackChildren: '__SandDance__TreemapStackChildren',\n  TreemapStackDepth: '__SandDance__TreemapStackDepth',\n  TreemapStackX0: '__SandDance__TreemapStackX0',\n  TreemapStackX1: '__SandDance__TreemapStackX1',\n  TreemapStackY0: '__SandDance__TreemapStackY0',\n  TreemapStackY1: '__SandDance__TreemapStackY1'\n};\nexports.FieldNames = FieldNames;\nconst DataNames = {\n  Pre: 'PreData',\n  Main: 'MainData',\n  EmptyBin: 'EmptyBinsData',\n  TopLookup: 'TopData',\n  Legend: 'LegendData',\n  FacetGroupCell: 'FacetGroupCellData',\n  FacetCellTitles: 'FacetCellTitlesData',\n  QuantitativeData: 'QuantitativeData'\n};\nexports.DataNames = DataNames;\nconst ScaleNames = {\n  Color: 'ColorScale',\n  X: 'MainXScale',\n  Y: 'MainYScale',\n  Z: 'MainZScale'\n}; //Signal names\n\nexports.ScaleNames = ScaleNames;\nconst SignalNames = {\n  ColorBinCount: 'RoleColor_BinCountSignal',\n  ColorReverse: 'RoleColor_ReverseSignal',\n  FacetColumns: 'RoleFacet_ColumnsSignal',\n  FacetRows: 'RoleFacet_RowsSignal',\n  InnerPadding: 'Chart_InnerPadding',\n  OuterPadding: 'Chart_OuterPadding',\n  MarkOpacity: 'Mark_OpacitySignal',\n  PointSize: 'Chart_PointSizeSignal',\n  TextAngleX: 'Text_AngleXSignal',\n  TextAngleY: 'Text_AngleYSignal',\n  TextScale: 'Text_ScaleSignal',\n  TextSize: 'Text_SizeSignal',\n  TextTitleSize: 'Text_TitleSizeSignal',\n  TreeMapMethod: 'Chart_TreeMapMethodSignal',\n  XDomain: 'RoleX_DomainSignal',\n  XBins: 'RoleX_BinsSignal',\n  XGridSize: 'Chart_XGridSize',\n  YBins: 'RoleY_BinsSignal',\n  YDomain: 'RoleY_DomainSignal',\n  YGridSize: 'Chart_YGridSize',\n  ZHeight: 'RoleZ_HeightSignal',\n  ZProportion: 'RoleZ_ProportionSignal'\n}; //These are special formulaic data values\n\nexports.SignalNames = SignalNames;\nconst Other = '__Other'; //name of the \"no-color\" palette\n\nexports.Other = Other;\nconst ColorScaleNone = 'none';\nexports.ColorScaleNone = ColorScaleNone;\n},{}],\"Syc7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"ColorScaleNone\", {\n  enumerable: true,\n  get: function () {\n    return _constants.ColorScaleNone;\n  }\n});\nObject.defineProperty(exports, \"FieldNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.FieldNames;\n  }\n});\nObject.defineProperty(exports, \"ScaleNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.ScaleNames;\n  }\n});\nObject.defineProperty(exports, \"SignalNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.SignalNames;\n  }\n});\n\nvar _constants = require(\"./specs/constants\");\n},{\"./specs/constants\":\"b0rV\"}],\"yy6X\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isSearchExpressionGroup = isSearchExpressionGroup;\nexports.createGroupFromExpression = createGroupFromExpression;\nexports.ensureSearchExpressionGroupArray = ensureSearchExpressionGroupArray;\n\nfunction isSearchExpressionGroup(search) {\n  if (!search) {\n    return false;\n  }\n\n  return !!search.expressions;\n}\n\nfunction createGroupFromExpression(input) {\n  const output = {\n    expressions: [input]\n  };\n  return output;\n}\n\nfunction ensureSearchExpressionGroupArray(search) {\n  if (Array.isArray(search)) {\n    return [...search];\n  } else if (isSearchExpressionGroup(search)) {\n    return [search];\n  } else {\n    return [createGroupFromExpression(search)];\n  }\n}\n},{}],\"r4by\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.compareExpression = compareExpression;\nexports.compareGroup = compareGroup;\nexports.compare = compare;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst expressionKeys = Object.keys({\n  clause: null,\n  name: null,\n  operator: null,\n  value: null\n});\n\nfunction compareExpression(a, b) {\n  for (let k = 0; k < expressionKeys.length; k++) {\n    let key = expressionKeys[k];\n    if (a[key] != b[key]) return false;\n  }\n\n  return true;\n}\n\nconst groupKeys = Object.keys({\n  clause: null\n});\n\nfunction compareGroup(a, b) {\n  for (let k = 0; k < groupKeys.length; k++) {\n    let key = groupKeys[k];\n    if (a[key] != b[key]) return false;\n  }\n\n  if (a.expressions.length != b.expressions.length) return false;\n\n  for (let i = 0; i < a.expressions.length; i++) {\n    if (!compareExpression(a.expressions[i], b.expressions[i])) return false;\n  }\n\n  return true;\n}\n\nfunction compare(a, b) {\n  if (a == b) return true;\n  if (!a || !b) return false;\n  let arrs = [a, b].map(_group.ensureSearchExpressionGroupArray);\n  let [arrA, arrB] = arrs;\n  if (arrA.length != arrB.length) return false;\n\n  for (let i = 0; i < arrA.length; i++) {\n    if (!compareGroup(arrA[i], arrB[i])) return false;\n  }\n\n  return true;\n}\n},{\"./group\":\"yy6X\"}],\"wNjT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.invert = invert;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction invertSearchExpressionGroup(input) {\n  //this only works if all expressions in this group have the same clause\n  const output = {\n    expressions: input.expressions.map(invertSearchExpression)\n  };\n\n  if (input.clause) {\n    output.clause = invertedClauses[input.clause];\n  }\n\n  return output;\n}\n\nconst invertedOperators = {\n  '!=': '==',\n  '==': '!=',\n  '<': '>=',\n  '>=': '<',\n  '<=': '>',\n  '>': '<=',\n  '!contains': 'contains',\n  'contains': '!contains',\n  '!isnullorEmpty': 'isnullorEmpty',\n  'isnullorEmpty': '!isnullorEmpty',\n  '!starts': 'starts',\n  'starts': '!starts'\n};\nconst invertedClauses = {\n  '&&': '||',\n  '||': '&&'\n};\n\nfunction invertSearchExpression(input) {\n  const operator = invertedOperators[input.operator];\n  const output = Object.assign(Object.assign({}, input), {\n    operator\n  });\n\n  if (input.clause) {\n    output.clause = invertedClauses[input.clause];\n  }\n\n  return output;\n}\n\nfunction invert(search) {\n  if (Array.isArray(search)) {\n    return search.map(invertSearchExpressionGroup);\n  } else if ((0, _group.isSearchExpressionGroup)(search)) {\n    return invertSearchExpressionGroup(search);\n  } else {\n    return invertSearchExpression(search);\n  }\n}\n},{\"./group\":\"yy6X\"}],\"hTOx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.narrow = narrow;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction narrow(a, b) {\n  if (!a) {\n    return b;\n  }\n\n  let arrs = [a, b].map(_group.ensureSearchExpressionGroupArray);\n  let [arrA, arrB] = arrs;\n  arrB[0].clause = '&&';\n  return arrA.concat(arrB);\n}\n},{\"./group\":\"yy6X\"}],\"mJgy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _compare = require(\"./compare\");\n\nObject.keys(_compare).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _compare[key];\n    }\n  });\n});\n\nvar _invert = require(\"./invert\");\n\nObject.keys(_invert).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _invert[key];\n    }\n  });\n});\n\nvar _narrow = require(\"./narrow\");\n\nObject.keys(_narrow).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _narrow[key];\n    }\n  });\n});\n},{\"./compare\":\"r4by\",\"./invert\":\"wNjT\",\"./narrow\":\"hTOx\"}],\"JCLk\":[function(require,module,exports) {\n\n},{}],\"ipKi\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.layerNames = exports.GL_ORDINAL = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst GL_ORDINAL = 'GL_ORDINAL';\nexports.GL_ORDINAL = GL_ORDINAL;\nconst layerNames = {\n  cubes: 'LAYER_CUBES',\n  lines: 'LAYER_LINES',\n  text: 'LAYER_TEXT'\n};\nexports.layerNames = layerNames;\n},{}],\"DOky\":[function(require,module,exports) {\nvar global = arguments[3];\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n/*!\n * XRegExp 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2007-2017 MIT License\n */\n\n/**\n * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and\n * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to\n * make your client-side grepping simpler and more powerful, while freeing you from related\n * cross-browser inconsistencies.\n */\n\n// ==--------------------------==\n// Private stuff\n// ==--------------------------==\n\n// Property name used for extended regex instance data\nvar REGEX_DATA = 'xregexp';\n// Optional features that can be installed and uninstalled\nvar features = {\n    astral: false\n};\n// Native methods to use and restore ('native' is an ES3 reserved keyword)\nvar nativ = {\n    exec: RegExp.prototype.exec,\n    test: RegExp.prototype.test,\n    match: String.prototype.match,\n    replace: String.prototype.replace,\n    split: String.prototype.split\n};\n// Storage for fixed/extended native methods\nvar fixed = {};\n// Storage for regexes cached by `XRegExp.cache`\nvar regexCache = {};\n// Storage for pattern details cached by the `XRegExp` constructor\nvar patternCache = {};\n// Storage for regex syntax tokens added internally or by `XRegExp.addToken`\nvar tokens = [];\n// Token scopes\nvar defaultScope = 'default';\nvar classScope = 'class';\n// Regexes that match native regex syntax, including octals\nvar nativeTokens = {\n    // Any native multicharacter token in default scope, or any single character\n    'default': /\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|\\(\\?(?:[:=!]|<[=!])|[?*+]\\?|{\\d+(?:,\\d*)?}\\??|[\\s\\S]/,\n    // Any native multicharacter token in character class scope, or any single character\n    'class': /\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|[\\s\\S]/\n};\n// Any backreference or dollar-prefixed character in replacement strings\nvar replacementToken = /\\$(?:{([\\w$]+)}|<([\\w$]+)>|(\\d\\d?|[\\s\\S]))/g;\n// Check for correct `exec` handling of nonparticipating capturing groups\nvar correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined;\n// Check for ES6 `flags` prop support\nvar hasFlagsProp = /x/.flags !== undefined;\n// Shortcut to `Object.prototype.toString`\nvar toString = {}.toString;\n\nfunction hasNativeFlag(flag) {\n    // Can't check based on the presence of properties/getters since browsers might support such\n    // properties even when they don't support the corresponding flag in regex construction (tested\n    // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`\n    // throws an error)\n    var isSupported = true;\n    try {\n        // Can't use regex literals for testing even in a `try` because regex literals with\n        // unsupported flags cause a compilation error in IE\n        new RegExp('', flag);\n    } catch (exception) {\n        isSupported = false;\n    }\n    return isSupported;\n}\n// Check for ES6 `u` flag support\nvar hasNativeU = hasNativeFlag('u');\n// Check for ES6 `y` flag support\nvar hasNativeY = hasNativeFlag('y');\n// Tracker for known flags, including addon flags\nvar registeredFlags = {\n    g: true,\n    i: true,\n    m: true,\n    u: hasNativeU,\n    y: hasNativeY\n};\n\n/**\n * Attaches extended data and `XRegExp.prototype` properties to a regex object.\n *\n * @private\n * @param {RegExp} regex Regex to augment.\n * @param {Array} captureNames Array with capture names, or `null`.\n * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.\n * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.\n * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal\n *   operations, and never exposed to users. For internal-only regexes, we can improve perf by\n *   skipping some operations like attaching `XRegExp.prototype` properties.\n * @returns {RegExp} Augmented regex.\n */\nfunction augment(regex, captureNames, xSource, xFlags, isInternalOnly) {\n    var p = void 0;\n\n    regex[REGEX_DATA] = {\n        captureNames: captureNames\n    };\n\n    if (isInternalOnly) {\n        return regex;\n    }\n\n    // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value\n    if (regex.__proto__) {\n        regex.__proto__ = XRegExp.prototype;\n    } else {\n        for (p in XRegExp.prototype) {\n            // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this\n            // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`\n            // extensions exist on `regex.prototype` anyway\n            regex[p] = XRegExp.prototype[p];\n        }\n    }\n\n    regex[REGEX_DATA].source = xSource;\n    // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order\n    regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;\n\n    return regex;\n}\n\n/**\n * Removes any duplicate characters from the provided string.\n *\n * @private\n * @param {String} str String to remove duplicate characters from.\n * @returns {String} String with any duplicate characters removed.\n */\nfunction clipDuplicates(str) {\n    return nativ.replace.call(str, /([\\s\\S])(?=[\\s\\S]*\\1)/g, '');\n}\n\n/**\n * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`\n * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing\n * flags g and y while copying the regex.\n *\n * @private\n * @param {RegExp} regex Regex to copy.\n * @param {Object} [options] Options object with optional properties:\n *   - `addG` {Boolean} Add flag g while copying the regex.\n *   - `addY` {Boolean} Add flag y while copying the regex.\n *   - `removeG` {Boolean} Remove flag g while copying the regex.\n *   - `removeY` {Boolean} Remove flag y while copying the regex.\n *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal\n *     operations, and never exposed to users. For internal-only regexes, we can improve perf by\n *     skipping some operations like attaching `XRegExp.prototype` properties.\n *   - `source` {String} Overrides `<regex>.source`, for special cases.\n * @returns {RegExp} Copy of the provided regex, possibly with modified flags.\n */\nfunction copyRegex(regex, options) {\n    if (!XRegExp.isRegExp(regex)) {\n        throw new TypeError('Type RegExp expected');\n    }\n\n    var xData = regex[REGEX_DATA] || {};\n    var flags = getNativeFlags(regex);\n    var flagsToAdd = '';\n    var flagsToRemove = '';\n    var xregexpSource = null;\n    var xregexpFlags = null;\n\n    options = options || {};\n\n    if (options.removeG) {\n        flagsToRemove += 'g';\n    }\n    if (options.removeY) {\n        flagsToRemove += 'y';\n    }\n    if (flagsToRemove) {\n        flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), '');\n    }\n\n    if (options.addG) {\n        flagsToAdd += 'g';\n    }\n    if (options.addY) {\n        flagsToAdd += 'y';\n    }\n    if (flagsToAdd) {\n        flags = clipDuplicates(flags + flagsToAdd);\n    }\n\n    if (!options.isInternalOnly) {\n        if (xData.source !== undefined) {\n            xregexpSource = xData.source;\n        }\n        // null or undefined; don't want to add to `flags` if the previous value was null, since\n        // that indicates we're not tracking original precompilation flags\n        if (xData.flags != null) {\n            // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never\n            // removed for non-internal regexes, so don't need to handle it\n            xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;\n        }\n    }\n\n    // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid\n    // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and\n    // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the\n    // translation to native regex syntax\n    regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);\n\n    return regex;\n}\n\n/**\n * Converts hexadecimal to decimal.\n *\n * @private\n * @param {String} hex\n * @returns {Number}\n */\nfunction dec(hex) {\n    return parseInt(hex, 16);\n}\n\n/**\n * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an\n * inline comment or whitespace with flag x. This is used directly as a token handler function\n * passed to `XRegExp.addToken`.\n *\n * @private\n * @param {String} match Match arg of `XRegExp.addToken` handler\n * @param {String} scope Scope arg of `XRegExp.addToken` handler\n * @param {String} flags Flags arg of `XRegExp.addToken` handler\n * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.\n */\nfunction getContextualTokenSeparator(match, scope, flags) {\n    if (\n    // No need to separate tokens if at the beginning or end of a group\n    match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' ||\n    // Avoid separating tokens when the following token is a quantifier\n    isQuantifierNext(match.input, match.index + match[0].length, flags)) {\n        return '';\n    }\n    // Keep tokens separated. This avoids e.g. inadvertedly changing `\\1 1` or `\\1(?#)1` to `\\11`.\n    // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax\n    // error `(? :` into `(?:`.\n    return '(?:)';\n}\n\n/**\n * Returns native `RegExp` flags used by a regex object.\n *\n * @private\n * @param {RegExp} regex Regex to check.\n * @returns {String} Native flags in use.\n */\nfunction getNativeFlags(regex) {\n    return hasFlagsProp ? regex.flags :\n    // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation\n    // with an empty string) allows this to continue working predictably when\n    // `XRegExp.proptotype.toString` is overridden\n    nativ.exec.call(/\\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];\n}\n\n/**\n * Determines whether a regex has extended instance data used to track capture names.\n *\n * @private\n * @param {RegExp} regex Regex to check.\n * @returns {Boolean} Whether the regex uses named capture.\n */\nfunction hasNamedCapture(regex) {\n    return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);\n}\n\n/**\n * Converts decimal to hexadecimal.\n *\n * @private\n * @param {Number|String} dec\n * @returns {String}\n */\nfunction hex(dec) {\n    return parseInt(dec, 10).toString(16);\n}\n\n/**\n * Checks whether the next nonignorable token after the specified position is a quantifier.\n *\n * @private\n * @param {String} pattern Pattern to search within.\n * @param {Number} pos Index in `pattern` to search at.\n * @param {String} flags Flags used by the pattern.\n * @returns {Boolean} Whether the next nonignorable token is a quantifier.\n */\nfunction isQuantifierNext(pattern, pos, flags) {\n    var inlineCommentPattern = '\\\\(\\\\?#[^)]*\\\\)';\n    var lineCommentPattern = '#[^#\\\\n]*';\n    var quantifierPattern = '[?*+]|{\\\\d+(?:,\\\\d*)?}';\n    return nativ.test.call(flags.indexOf('x') !== -1 ?\n    // Ignore any leading whitespace, line comments, and inline comments\n    /^(?:\\s|#[^#\\n]*|\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/ :\n    // Ignore any leading inline comments\n    /^(?:\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/, pattern.slice(pos));\n}\n\n/**\n * Determines whether a value is of the specified type, by resolving its internal [[Class]].\n *\n * @private\n * @param {*} value Object to check.\n * @param {String} type Type to check for, in TitleCase.\n * @returns {Boolean} Whether the object matches the type.\n */\nfunction isType(value, type) {\n    return toString.call(value) === '[object ' + type + ']';\n}\n\n/**\n * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.\n *\n * @private\n * @param {String} str\n * @returns {String}\n */\nfunction pad4(str) {\n    while (str.length < 4) {\n        str = '0' + str;\n    }\n    return str;\n}\n\n/**\n * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads\n * the flag preparation logic from the `XRegExp` constructor.\n *\n * @private\n * @param {String} pattern Regex pattern, possibly with a leading mode modifier.\n * @param {String} flags Any combination of flags.\n * @returns {Object} Object with properties `pattern` and `flags`.\n */\nfunction prepareFlags(pattern, flags) {\n    var i = void 0;\n\n    // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags\n    if (clipDuplicates(flags) !== flags) {\n        throw new SyntaxError('Invalid duplicate regex flag ' + flags);\n    }\n\n    // Strip and apply a leading mode modifier with any combination of flags except g or y\n    pattern = nativ.replace.call(pattern, /^\\(\\?([\\w$]+)\\)/, function ($0, $1) {\n        if (nativ.test.call(/[gy]/, $1)) {\n            throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0);\n        }\n        // Allow duplicate flags within the mode modifier\n        flags = clipDuplicates(flags + $1);\n        return '';\n    });\n\n    // Throw on unknown native or nonnative flags\n    for (i = 0; i < flags.length; ++i) {\n        if (!registeredFlags[flags[i]]) {\n            throw new SyntaxError('Unknown regex flag ' + flags[i]);\n        }\n    }\n\n    return {\n        pattern: pattern,\n        flags: flags\n    };\n}\n\n/**\n * Prepares an options object from the given value.\n *\n * @private\n * @param {String|Object} value Value to convert to an options object.\n * @returns {Object} Options object.\n */\nfunction prepareOptions(value) {\n    var options = {};\n\n    if (isType(value, 'String')) {\n        XRegExp.forEach(value, /[^\\s,]+/, function (match) {\n            options[match] = true;\n        });\n\n        return options;\n    }\n\n    return value;\n}\n\n/**\n * Registers a flag so it doesn't throw an 'unknown flag' error.\n *\n * @private\n * @param {String} flag Single-character flag to register.\n */\nfunction registerFlag(flag) {\n    if (!/^[\\w$]$/.test(flag)) {\n        throw new Error('Flag must be a single character A-Za-z0-9_$');\n    }\n\n    registeredFlags[flag] = true;\n}\n\n/**\n * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified\n * position, until a match is found.\n *\n * @private\n * @param {String} pattern Original pattern from which an XRegExp object is being built.\n * @param {String} flags Flags being used to construct the regex.\n * @param {Number} pos Position to search for tokens within `pattern`.\n * @param {Number} scope Regex scope to apply: 'default' or 'class'.\n * @param {Object} context Context object to use for token handler functions.\n * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.\n */\nfunction runTokens(pattern, flags, pos, scope, context) {\n    var i = tokens.length;\n    var leadChar = pattern[pos];\n    var result = null;\n    var match = void 0;\n    var t = void 0;\n\n    // Run in reverse insertion order\n    while (i--) {\n        t = tokens[i];\n        if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(flags.indexOf(t.flag) !== -1)) {\n            continue;\n        }\n\n        match = XRegExp.exec(pattern, t.regex, pos, 'sticky');\n        if (match) {\n            result = {\n                matchLength: match[0].length,\n                output: t.handler.call(context, match, scope, flags),\n                reparse: t.reparse\n            };\n            // Finished with token tests\n            break;\n        }\n    }\n\n    return result;\n}\n\n/**\n * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to\n * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if\n * the Unicode Base addon is not available, since flag A is registered by that addon.\n *\n * @private\n * @param {Boolean} on `true` to enable; `false` to disable.\n */\nfunction setAstral(on) {\n    features.astral = on;\n}\n\n/**\n * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow\n * the ES5 abstract operation `ToObject`.\n *\n * @private\n * @param {*} value Object to check and return.\n * @returns {*} The provided object.\n */\nfunction toObject(value) {\n    // null or undefined\n    if (value == null) {\n        throw new TypeError('Cannot convert null or undefined to object');\n    }\n\n    return value;\n}\n\n// ==--------------------------==\n// Constructor\n// ==--------------------------==\n\n/**\n * Creates an extended regular expression object for matching text with a pattern. Differs from a\n * native regular expression in that additional syntax and flags are supported. The returned object\n * is in fact a native `RegExp` and works with all native methods.\n *\n * @class XRegExp\n * @constructor\n * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.\n * @param {String} [flags] Any combination of flags.\n *   Native flags:\n *     - `g` - global\n *     - `i` - ignore case\n *     - `m` - multiline anchors\n *     - `u` - unicode (ES6)\n *     - `y` - sticky (Firefox 3+, ES6)\n *   Additional XRegExp flags:\n *     - `n` - explicit capture\n *     - `s` - dot matches all (aka singleline)\n *     - `x` - free-spacing and line comments (aka extended)\n *     - `A` - astral (requires the Unicode Base addon)\n *   Flags cannot be provided when constructing one `RegExp` from another.\n * @returns {RegExp} Extended regular expression object.\n * @example\n *\n * // With named capture and flag x\n * XRegExp(`(?<year>  [0-9]{4} ) -?  # year\n *          (?<month> [0-9]{2} ) -?  # month\n *          (?<day>   [0-9]{2} )     # day`, 'x');\n *\n * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)\n * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and\n * // have fresh `lastIndex` properties (set to zero).\n * XRegExp(/regex/);\n */\nfunction XRegExp(pattern, flags) {\n    if (XRegExp.isRegExp(pattern)) {\n        if (flags !== undefined) {\n            throw new TypeError('Cannot supply flags when copying a RegExp');\n        }\n        return copyRegex(pattern);\n    }\n\n    // Copy the argument behavior of `RegExp`\n    pattern = pattern === undefined ? '' : String(pattern);\n    flags = flags === undefined ? '' : String(flags);\n\n    if (XRegExp.isInstalled('astral') && !(flags.indexOf('A') !== -1)) {\n        // This causes an error to be thrown if the Unicode Base addon is not available\n        flags += 'A';\n    }\n\n    if (!patternCache[pattern]) {\n        patternCache[pattern] = {};\n    }\n\n    if (!patternCache[pattern][flags]) {\n        var context = {\n            hasNamedCapture: false,\n            captureNames: []\n        };\n        var scope = defaultScope;\n        var output = '';\n        var pos = 0;\n        var result = void 0;\n\n        // Check for flag-related errors, and strip/apply flags in a leading mode modifier\n        var applied = prepareFlags(pattern, flags);\n        var appliedPattern = applied.pattern;\n        var appliedFlags = applied.flags;\n\n        // Use XRegExp's tokens to translate the pattern to a native regex pattern.\n        // `appliedPattern.length` may change on each iteration if tokens use `reparse`\n        while (pos < appliedPattern.length) {\n            do {\n                // Check for custom tokens at the current position\n                result = runTokens(appliedPattern, appliedFlags, pos, scope, context);\n                // If the matched token used the `reparse` option, splice its output into the\n                // pattern before running tokens again at the same position\n                if (result && result.reparse) {\n                    appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength);\n                }\n            } while (result && result.reparse);\n\n            if (result) {\n                output += result.output;\n                pos += result.matchLength || 1;\n            } else {\n                // Get the native token at the current position\n                var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0];\n                output += token;\n                pos += token.length;\n                if (token === '[' && scope === defaultScope) {\n                    scope = classScope;\n                } else if (token === ']' && scope === classScope) {\n                    scope = defaultScope;\n                }\n            }\n        }\n\n        patternCache[pattern][flags] = {\n            // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty\n            // groups are sometimes inserted during regex transpilation in order to keep tokens\n            // separated. However, more than one empty group in a row is never needed.\n            pattern: nativ.replace.call(output, /(?:\\(\\?:\\))+/g, '(?:)'),\n            // Strip all but native flags\n            flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),\n            // `context.captureNames` has an item for each capturing group, even if unnamed\n            captures: context.hasNamedCapture ? context.captureNames : null\n        };\n    }\n\n    var generated = patternCache[pattern][flags];\n    return augment(new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags);\n}\n\n// Add `RegExp.prototype` to the prototype chain\nXRegExp.prototype = /(?:)/;\n\n// ==--------------------------==\n// Public properties\n// ==--------------------------==\n\n/**\n * The XRegExp version number as a string containing three dot-separated parts. For example,\n * '2.0.0-beta-3'.\n *\n * @static\n * @memberOf XRegExp\n * @type String\n */\nXRegExp.version = '4.0.0';\n\n// ==--------------------------==\n// Public methods\n// ==--------------------------==\n\n// Intentionally undocumented; used in tests and addons\nXRegExp._clipDuplicates = clipDuplicates;\nXRegExp._hasNativeFlag = hasNativeFlag;\nXRegExp._dec = dec;\nXRegExp._hex = hex;\nXRegExp._pad4 = pad4;\n\n/**\n * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to\n * create XRegExp addons. If more than one token can match the same string, the last added wins.\n *\n * @memberOf XRegExp\n * @param {RegExp} regex Regex object that matches the new token.\n * @param {Function} handler Function that returns a new pattern string (using native regex syntax)\n *   to replace the matched token within all future XRegExp regexes. Has access to persistent\n *   properties of the regex being built, through `this`. Invoked with three arguments:\n *   - The match array, with named backreference properties.\n *   - The regex scope where the match was found: 'default' or 'class'.\n *   - The flags used by the regex, including any flags in a leading mode modifier.\n *   The handler function becomes part of the XRegExp construction process, so be careful not to\n *   construct XRegExps within the function or you will trigger infinite recursion.\n * @param {Object} [options] Options object with optional properties:\n *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.\n *   - `flag` {String} Single-character flag that triggers the token. This also registers the\n *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.\n *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are\n *     not required to trigger the token. This registers the flags, to prevent XRegExp from\n *     throwing an 'unknown flag' error when any of the flags are used.\n *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as\n *     final, and instead be reparseable by other tokens (including the current token). Allows\n *     token chaining or deferring.\n *   - `leadChar` {String} Single character that occurs at the beginning of any successful match\n *     of the token (not always applicable). This doesn't change the behavior of the token unless\n *     you provide an erroneous value. However, providing it can increase the token's performance\n *     since the token can be skipped at any positions where this character doesn't appear.\n * @example\n *\n * // Basic usage: Add \\a for the ALERT control code\n * XRegExp.addToken(\n *   /\\\\a/,\n *   () => '\\\\x07',\n *   {scope: 'all'}\n * );\n * XRegExp('\\\\a[\\\\a-\\\\n]+').test('\\x07\\n\\x07'); // -> true\n *\n * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.\n * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of\n * // character classes only)\n * XRegExp.addToken(\n *   /([?*+]|{\\d+(?:,\\d*)?})(\\??)/,\n *   (match) => `${match[1]}${match[2] ? '' : '?'}`,\n *   {flag: 'U'}\n * );\n * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'\n * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'\n */\nXRegExp.addToken = function (regex, handler, options) {\n    options = options || {};\n    var optionalFlags = options.optionalFlags;\n    var i = void 0;\n\n    if (options.flag) {\n        registerFlag(options.flag);\n    }\n\n    if (optionalFlags) {\n        optionalFlags = nativ.split.call(optionalFlags, '');\n        for (i = 0; i < optionalFlags.length; ++i) {\n            registerFlag(optionalFlags[i]);\n        }\n    }\n\n    // Add to the private list of syntax tokens\n    tokens.push({\n        regex: copyRegex(regex, {\n            addG: true,\n            addY: hasNativeY,\n            isInternalOnly: true\n        }),\n        handler: handler,\n        scope: options.scope || defaultScope,\n        flag: options.flag,\n        reparse: options.reparse,\n        leadChar: options.leadChar\n    });\n\n    // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags\n    // might now produce different results\n    XRegExp.cache.flush('patterns');\n};\n\n/**\n * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with\n * the same pattern and flag combination, the cached copy of the regex is returned.\n *\n * @memberOf XRegExp\n * @param {String} pattern Regex pattern string.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @returns {RegExp} Cached XRegExp object.\n * @example\n *\n * while (match = XRegExp.cache('.', 'gs').exec(str)) {\n *   // The regex is compiled once only\n * }\n */\nXRegExp.cache = function (pattern, flags) {\n    if (!regexCache[pattern]) {\n        regexCache[pattern] = {};\n    }\n    return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));\n};\n\n// Intentionally undocumented; used in tests\nXRegExp.cache.flush = function (cacheName) {\n    if (cacheName === 'patterns') {\n        // Flush the pattern cache used by the `XRegExp` constructor\n        patternCache = {};\n    } else {\n        // Flush the regex cache populated by `XRegExp.cache`\n        regexCache = {};\n    }\n};\n\n/**\n * Escapes any regular expression metacharacters, for use when matching literal strings. The result\n * can safely be used at any point within a regex that uses any flags.\n *\n * @memberOf XRegExp\n * @param {String} str String to escape.\n * @returns {String} String with regex metacharacters escaped.\n * @example\n *\n * XRegExp.escape('Escaped? <.>');\n * // -> 'Escaped\\?\\ <\\.>'\n */\nXRegExp.escape = function (str) {\n    return nativ.replace.call(toObject(str), /[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n};\n\n/**\n * Executes a regex search in a specified string. Returns a match array or `null`. If the provided\n * regex uses named capture, named backreference properties are included on the match array.\n * Optional `pos` and `sticky` arguments specify the search start position, and whether the match\n * must start at the specified position only. The `lastIndex` property of the provided regex is not\n * used, but is updated for compatibility. Also fixes browser bugs compared to the native\n * `RegExp.prototype.exec` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Number} [pos=0] Zero-based index at which to start the search.\n * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n *   only. The string `'sticky'` is accepted as an alternative to `true`.\n * @returns {Array} Match array with named backreference properties, or `null`.\n * @example\n *\n * // Basic use, with named backreference\n * let match = XRegExp.exec('U+2620', XRegExp('U\\\\+(?<hex>[0-9A-F]{4})'));\n * match.hex; // -> '2620'\n *\n * // With pos and sticky, in a loop\n * let pos = 2, result = [], match;\n * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\\d)>/, pos, 'sticky')) {\n *   result.push(match[1]);\n *   pos = match.index + match[0].length;\n * }\n * // result -> ['2', '3', '4']\n */\nXRegExp.exec = function (str, regex, pos, sticky) {\n    var cacheKey = 'g';\n    var addY = false;\n    var fakeY = false;\n    var match = void 0;\n\n    addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);\n    if (addY) {\n        cacheKey += 'y';\n    } else if (sticky) {\n        // Simulate sticky matching by appending an empty capture to the original regex. The\n        // resulting regex will succeed no matter what at the current index (set with `lastIndex`),\n        // and will not search the rest of the subject string. We'll know that the original regex\n        // has failed if that last capture is `''` rather than `undefined` (i.e., if that last\n        // capture participated in the match).\n        fakeY = true;\n        cacheKey += 'FakeY';\n    }\n\n    regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n    // Shares cached copies with `XRegExp.match`/`replace`\n    var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n        addG: true,\n        addY: addY,\n        source: fakeY ? regex.source + '|()' : undefined,\n        removeY: sticky === false,\n        isInternalOnly: true\n    }));\n\n    pos = pos || 0;\n    r2.lastIndex = pos;\n\n    // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.\n    match = fixed.exec.call(r2, str);\n\n    // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means\n    // the original regexp failed (see above).\n    if (fakeY && match && match.pop() === '') {\n        match = null;\n    }\n\n    if (regex.global) {\n        regex.lastIndex = match ? r2.lastIndex : 0;\n    }\n\n    return match;\n};\n\n/**\n * Executes a provided function once per regex match. Searches always start at the beginning of the\n * string and continue until the end, regardless of the state of the regex's `global` property and\n * initial `lastIndex`.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Function} callback Function to execute for each match. Invoked with four arguments:\n *   - The match array, with named backreference properties.\n *   - The zero-based match index.\n *   - The string being traversed.\n *   - The regex object being used to traverse the string.\n * @example\n *\n * // Extracts every other digit from a string\n * const evens = [];\n * XRegExp.forEach('1a2345', /\\d/, (match, i) => {\n *   if (i % 2) evens.push(+match[0]);\n * });\n * // evens -> [2, 4]\n */\nXRegExp.forEach = function (str, regex, callback) {\n    var pos = 0;\n    var i = -1;\n    var match = void 0;\n\n    while (match = XRegExp.exec(str, regex, pos)) {\n        // Because `regex` is provided to `callback`, the function could use the deprecated/\n        // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`\n        // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,\n        // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of\n        // regexes, mutating the regex will not have any effect on the iteration or matched strings,\n        // which is a nice side effect that brings extra safety.\n        callback(match, ++i, str, regex);\n\n        pos = match.index + (match[0].length || 1);\n    }\n};\n\n/**\n * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with\n * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native\n * regexes are not recompiled using XRegExp syntax.\n *\n * @memberOf XRegExp\n * @param {RegExp} regex Regex to globalize.\n * @returns {RegExp} Copy of the provided regex with flag `g` added.\n * @example\n *\n * const globalCopy = XRegExp.globalize(/regex/);\n * globalCopy.global; // -> true\n */\nXRegExp.globalize = function (regex) {\n    return copyRegex(regex, { addG: true });\n};\n\n/**\n * Installs optional features according to the specified options. Can be undone using\n * `XRegExp.uninstall`.\n *\n * @memberOf XRegExp\n * @param {Object|String} options Options object or string.\n * @example\n *\n * // With an options object\n * XRegExp.install({\n *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)\n *   astral: true\n * });\n *\n * // With an options string\n * XRegExp.install('astral');\n */\nXRegExp.install = function (options) {\n    options = prepareOptions(options);\n\n    if (!features.astral && options.astral) {\n        setAstral(true);\n    }\n};\n\n/**\n * Checks whether an individual optional feature is installed.\n *\n * @memberOf XRegExp\n * @param {String} feature Name of the feature to check. One of:\n *   - `astral`\n * @returns {Boolean} Whether the feature is installed.\n * @example\n *\n * XRegExp.isInstalled('astral');\n */\nXRegExp.isInstalled = function (feature) {\n    return !!features[feature];\n};\n\n/**\n * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes\n * created in another frame, when `instanceof` and `constructor` checks would fail.\n *\n * @memberOf XRegExp\n * @param {*} value Object to check.\n * @returns {Boolean} Whether the object is a `RegExp` object.\n * @example\n *\n * XRegExp.isRegExp('string'); // -> false\n * XRegExp.isRegExp(/regex/i); // -> true\n * XRegExp.isRegExp(RegExp('^', 'm')); // -> true\n * XRegExp.isRegExp(XRegExp('(?s).')); // -> true\n */\nXRegExp.isRegExp = function (value) {\n    return toString.call(value) === '[object RegExp]';\n}; // isType(value, 'RegExp');\n\n/**\n * Returns the first matched string, or in global mode, an array containing all matched strings.\n * This is essentially a more convenient re-implementation of `String.prototype.match` that gives\n * the result types you actually want (string instead of `exec`-style array in match-first mode,\n * and an empty array instead of `null` when no matches are found in match-all mode). It also lets\n * you override flag g and ignore `lastIndex`, and fixes browser bugs.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to\n *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,\n *   `scope` is 'all'.\n * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all\n *   mode: Array of all matched strings, or an empty array.\n * @example\n *\n * // Match first\n * XRegExp.match('abc', /\\w/); // -> 'a'\n * XRegExp.match('abc', /\\w/g, 'one'); // -> 'a'\n * XRegExp.match('abc', /x/g, 'one'); // -> null\n *\n * // Match all\n * XRegExp.match('abc', /\\w/g); // -> ['a', 'b', 'c']\n * XRegExp.match('abc', /\\w/, 'all'); // -> ['a', 'b', 'c']\n * XRegExp.match('abc', /x/, 'all'); // -> []\n */\nXRegExp.match = function (str, regex, scope) {\n    var global = regex.global && scope !== 'one' || scope === 'all';\n    var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';\n\n    regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n    // Shares cached copies with `XRegExp.exec`/`replace`\n    var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n        addG: !!global,\n        removeG: scope === 'one',\n        isInternalOnly: true\n    }));\n\n    var result = nativ.match.call(toObject(str), r2);\n\n    if (regex.global) {\n        regex.lastIndex = scope === 'one' && result ?\n        // Can't use `r2.lastIndex` since `r2` is nonglobal in this case\n        result.index + result[0].length : 0;\n    }\n\n    return global ? result || [] : result && result[0];\n};\n\n/**\n * Retrieves the matches from searching a string using a chain of regexes that successively search\n * within previous matches. The provided `chain` array can contain regexes and or objects with\n * `regex` and `backref` properties. When a backreference is specified, the named or numbered\n * backreference is passed forward to the next regex or returned.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {Array} chain Regexes that each search for matches within preceding results.\n * @returns {Array} Matches by the last regex in the chain, or an empty array.\n * @example\n *\n * // Basic usage; matches numbers within <b> tags\n * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [\n *   XRegExp('(?is)<b>.*?</b>'),\n *   /\\d+/\n * ]);\n * // -> ['2', '4', '56']\n *\n * // Passing forward and returning specific backreferences\n * html = '<a href=\"http://xregexp.com/api/\">XRegExp</a>\\\n *         <a href=\"http://www.google.com/\">Google</a>';\n * XRegExp.matchChain(html, [\n *   {regex: /<a href=\"([^\"]+)\">/i, backref: 1},\n *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}\n * ]);\n * // -> ['xregexp.com', 'www.google.com']\n */\nXRegExp.matchChain = function (str, chain) {\n    return function recurseChain(values, level) {\n        var item = chain[level].regex ? chain[level] : { regex: chain[level] };\n        var matches = [];\n\n        function addMatch(match) {\n            if (item.backref) {\n                // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the\n                // `undefined`s for backreferences to nonparticipating capturing groups. In such\n                // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw\n                // the exception, so also check if the backreference is a number that is within the\n                // bounds of the array.\n                if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) {\n                    throw new ReferenceError('Backreference to undefined group: ' + item.backref);\n                }\n\n                matches.push(match[item.backref] || '');\n            } else {\n                matches.push(match[0]);\n            }\n        }\n\n        for (var i = 0; i < values.length; ++i) {\n            XRegExp.forEach(values[i], item.regex, addMatch);\n        }\n\n        return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);\n    }([str], 0);\n};\n\n/**\n * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string\n * or regex, and the replacement can be a string or a function to be called for each match. To\n * perform a global search and replace, use the optional `scope` argument or include flag g if using\n * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.\n * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser\n * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp|String} search Search pattern to be replaced.\n * @param {String|Function} replacement Replacement string or a function invoked to create it.\n *   Replacement strings can include special replacement syntax:\n *     - $$ - Inserts a literal $ character.\n *     - $&, $0 - Inserts the matched substring.\n *     - $` - Inserts the string that precedes the matched substring (left context).\n *     - $' - Inserts the string that follows the matched substring (right context).\n *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts\n *       backreference n/nn.\n *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing\n *       group, inserts backreference n.\n *   Replacement functions are invoked with three or more arguments:\n *     - The matched substring (corresponds to $& above). Named backreferences are accessible as\n *       properties of this first argument.\n *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).\n *     - The zero-based index of the match within the total search string.\n *     - The total string being searched.\n * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not\n *   explicitly specified and using a regex with flag g, `scope` is 'all'.\n * @returns {String} New string with one or all matches replaced.\n * @example\n *\n * // Regex search, using named backreferences in replacement string\n * const name = XRegExp('(?<first>\\\\w+) (?<last>\\\\w+)');\n * XRegExp.replace('John Smith', name, '$<last>, $<first>');\n * // -> 'Smith, John'\n *\n * // Regex search, using named backreferences in replacement function\n * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);\n * // -> 'Smith, John'\n *\n * // String search, with replace-all\n * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');\n * // -> 'XRegExp builds XRegExps'\n */\nXRegExp.replace = function (str, search, replacement, scope) {\n    var isRegex = XRegExp.isRegExp(search);\n    var global = search.global && scope !== 'one' || scope === 'all';\n    var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';\n    var s2 = search;\n\n    if (isRegex) {\n        search[REGEX_DATA] = search[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s\n        // `lastIndex` isn't updated *during* replacement iterations\n        s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {\n            addG: !!global,\n            removeG: scope === 'one',\n            isInternalOnly: true\n        }));\n    } else if (global) {\n        s2 = new RegExp(XRegExp.escape(String(search)), 'g');\n    }\n\n    // Fixed `replace` required for named backreferences, etc.\n    var result = fixed.replace.call(toObject(str), s2, replacement);\n\n    if (isRegex && search.global) {\n        // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n        search.lastIndex = 0;\n    }\n\n    return result;\n};\n\n/**\n * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an\n * array of replacement details. Later replacements operate on the output of earlier replacements.\n * Replacement details are accepted as an array with a regex or string to search for, the\n * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp\n * replacement text syntax, which supports named backreference properties via `${name}` or\n * `$<name>`.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {Array} replacements Array of replacement detail arrays.\n * @returns {String} New string with all replacements.\n * @example\n *\n * str = XRegExp.replaceEach(str, [\n *   [XRegExp('(?<name>a)'), 'z${name}'],\n *   [/b/gi, 'y'],\n *   [/c/g, 'x', 'one'], // scope 'one' overrides /g\n *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g\n *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings\n *   [/f/g, ($0) => $0.toUpperCase()]\n * ]);\n */\nXRegExp.replaceEach = function (str, replacements) {\n    var i = void 0;\n    var r = void 0;\n\n    for (i = 0; i < replacements.length; ++i) {\n        r = replacements[i];\n        str = XRegExp.replace(str, r[0], r[1], r[2]);\n    }\n\n    return str;\n};\n\n/**\n * Splits a string into an array of strings using a regex or string separator. Matches of the\n * separator are not included in the result array. However, if `separator` is a regex that contains\n * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n * cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to split.\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {Array} Array of substrings.\n * @example\n *\n * // Basic use\n * XRegExp.split('a b c', ' ');\n * // -> ['a', 'b', 'c']\n *\n * // With limit\n * XRegExp.split('a b c', ' ', 2);\n * // -> ['a', 'b']\n *\n * // Backreferences in result array\n * XRegExp.split('..word1..', /([a-z]+)(\\d+)/i);\n * // -> ['..', 'word', '1', '..']\n */\nXRegExp.split = function (str, separator, limit) {\n    return fixed.split.call(toObject(str), separator, limit);\n};\n\n/**\n * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and\n * `sticky` arguments specify the search start position, and whether the match must start at the\n * specified position only. The `lastIndex` property of the provided regex is not used, but is\n * updated for compatibility. Also fixes browser bugs compared to the native\n * `RegExp.prototype.test` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Number} [pos=0] Zero-based index at which to start the search.\n * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n *   only. The string `'sticky'` is accepted as an alternative to `true`.\n * @returns {Boolean} Whether the regex matched the provided value.\n * @example\n *\n * // Basic use\n * XRegExp.test('abc', /c/); // -> true\n *\n * // With pos and sticky\n * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false\n * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true\n */\n// Do this the easy way :-)\nXRegExp.test = function (str, regex, pos, sticky) {\n    return !!XRegExp.exec(str, regex, pos, sticky);\n};\n\n/**\n * Uninstalls optional features according to the specified options. All optional features start out\n * uninstalled, so this is used to undo the actions of `XRegExp.install`.\n *\n * @memberOf XRegExp\n * @param {Object|String} options Options object or string.\n * @example\n *\n * // With an options object\n * XRegExp.uninstall({\n *   // Disables support for astral code points in Unicode addons\n *   astral: true\n * });\n *\n * // With an options string\n * XRegExp.uninstall('astral');\n */\nXRegExp.uninstall = function (options) {\n    options = prepareOptions(options);\n\n    if (features.astral && options.astral) {\n        setAstral(false);\n    }\n};\n\n/**\n * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as\n * regex objects or strings. Metacharacters are escaped in patterns provided as strings.\n * Backreferences in provided regex objects are automatically renumbered to work correctly within\n * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the\n * `flags` argument.\n *\n * @memberOf XRegExp\n * @param {Array} patterns Regexes and strings to combine.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @param {Object} [options] Options object with optional properties:\n *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.\n * @returns {RegExp} Union of the provided regexes and strings.\n * @example\n *\n * XRegExp.union(['a+b*c', /(dogs)\\1/, /(cats)\\1/], 'i');\n * // -> /a\\+b\\*c|(dogs)\\1|(cats)\\2/i\n *\n * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});\n * // -> /manbearpig/i\n */\nXRegExp.union = function (patterns, flags, options) {\n    options = options || {};\n    var conjunction = options.conjunction || 'or';\n    var numCaptures = 0;\n    var numPriorCaptures = void 0;\n    var captureNames = void 0;\n\n    function rewrite(match, paren, backref) {\n        var name = captureNames[numCaptures - numPriorCaptures];\n\n        // Capturing group\n        if (paren) {\n            ++numCaptures;\n            // If the current capture has a name, preserve the name\n            if (name) {\n                return '(?<' + name + '>';\n            }\n            // Backreference\n        } else if (backref) {\n            // Rewrite the backreference\n            return '\\\\' + (+backref + numPriorCaptures);\n        }\n\n        return match;\n    }\n\n    if (!(isType(patterns, 'Array') && patterns.length)) {\n        throw new TypeError('Must provide a nonempty array of patterns to merge');\n    }\n\n    var parts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n    var output = [];\n    var pattern = void 0;\n    for (var i = 0; i < patterns.length; ++i) {\n        pattern = patterns[i];\n\n        if (XRegExp.isRegExp(pattern)) {\n            numPriorCaptures = numCaptures;\n            captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || [];\n\n            // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are\n            // independently valid; helps keep this simple. Named captures are put back\n            output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));\n        } else {\n            output.push(XRegExp.escape(pattern));\n        }\n    }\n\n    var separator = conjunction === 'none' ? '' : '|';\n    return XRegExp(output.join(separator), flags);\n};\n\n// ==--------------------------==\n// Fixed/extended native methods\n// ==--------------------------==\n\n/**\n * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.\n *\n * @memberOf RegExp\n * @param {String} str String to search.\n * @returns {Array} Match array with named backreference properties, or `null`.\n */\nfixed.exec = function (str) {\n    var origLastIndex = this.lastIndex;\n    var match = nativ.exec.apply(this, arguments);\n\n    if (match) {\n        // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing\n        // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9\n        // in standards mode follows the spec.\n        if (!correctExecNpcg && match.length > 1 && match.indexOf('') !== -1) {\n            var r2 = copyRegex(this, {\n                removeG: true,\n                isInternalOnly: true\n            });\n            // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n            // matching due to characters outside the match\n            nativ.replace.call(String(str).slice(match.index), r2, function () {\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                    args[_key] = arguments[_key];\n                }\n\n                var len = args.length;\n                // Skip index 0 and the last 2\n                for (var i = 1; i < len - 2; ++i) {\n                    if (args[i] === undefined) {\n                        match[i] = undefined;\n                    }\n                }\n            });\n        }\n\n        // Attach named capture properties\n        if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {\n            // Skip index 0\n            for (var i = 1; i < match.length; ++i) {\n                var name = this[REGEX_DATA].captureNames[i - 1];\n                if (name) {\n                    match[name] = match[i];\n                }\n            }\n        }\n\n        // Fix browsers that increment `lastIndex` after zero-length matches\n        if (this.global && !match[0].length && this.lastIndex > match.index) {\n            this.lastIndex = match.index;\n        }\n    }\n\n    if (!this.global) {\n        // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n        this.lastIndex = origLastIndex;\n    }\n\n    return match;\n};\n\n/**\n * Fixes browser bugs in the native `RegExp.prototype.test`.\n *\n * @memberOf RegExp\n * @param {String} str String to search.\n * @returns {Boolean} Whether the regex matched the provided value.\n */\nfixed.test = function (str) {\n    // Do this the easy way :-)\n    return !!fixed.exec.call(this, str);\n};\n\n/**\n * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n * bugs in the native `String.prototype.match`.\n *\n * @memberOf String\n * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.\n * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,\n *   the result of calling `regex.exec(this)`.\n */\nfixed.match = function (regex) {\n    if (!XRegExp.isRegExp(regex)) {\n        // Use the native `RegExp` rather than `XRegExp`\n        regex = new RegExp(regex);\n    } else if (regex.global) {\n        var result = nativ.match.apply(this, arguments);\n        // Fixes IE bug\n        regex.lastIndex = 0;\n\n        return result;\n    }\n\n    return fixed.exec.call(regex, toObject(this));\n};\n\n/**\n * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement\n * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also\n * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex\n * search value, and the value of a replacement regex's `lastIndex` property during replacement\n * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third\n * (`flags`) argument. Use via `XRegExp.replace`.\n *\n * @memberOf String\n * @param {RegExp|String} search Search pattern to be replaced.\n * @param {String|Function} replacement Replacement string or a function invoked to create it.\n * @returns {String} New string with one or all matches replaced.\n */\nfixed.replace = function (search, replacement) {\n    var isRegex = XRegExp.isRegExp(search);\n    var origLastIndex = void 0;\n    var captureNames = void 0;\n    var result = void 0;\n\n    if (isRegex) {\n        if (search[REGEX_DATA]) {\n            captureNames = search[REGEX_DATA].captureNames;\n        }\n        // Only needed if `search` is nonglobal\n        origLastIndex = search.lastIndex;\n    } else {\n        search += ''; // Type-convert\n    }\n\n    // Don't use `typeof`; some older browsers return 'function' for regex objects\n    if (isType(replacement, 'Function')) {\n        // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement\n        // functions isn't type-converted to a string\n        result = nativ.replace.call(String(this), search, function () {\n            for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                args[_key2] = arguments[_key2];\n            }\n\n            if (captureNames) {\n                // Change the `args[0]` string primitive to a `String` object that can store\n                // properties. This really does need to use `String` as a constructor\n                args[0] = new String(args[0]);\n                // Store named backreferences on the first argument\n                for (var i = 0; i < captureNames.length; ++i) {\n                    if (captureNames[i]) {\n                        args[0][captureNames[i]] = args[i + 1];\n                    }\n                }\n            }\n            // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari\n            // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)\n            if (isRegex && search.global) {\n                search.lastIndex = args[args.length - 2] + args[0].length;\n            }\n            // ES6 specs the context for replacement functions as `undefined`\n            return replacement.apply(undefined, args);\n        });\n    } else {\n        // Ensure that the last value of `args` will be a string when given nonstring `this`,\n        // while still throwing on null or undefined context\n        result = nativ.replace.call(this == null ? this : String(this), search, function () {\n            for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n                args[_key3] = arguments[_key3];\n            }\n\n            return nativ.replace.call(String(replacement), replacementToken, replacer);\n\n            function replacer($0, bracketed, angled, dollarToken) {\n                bracketed = bracketed || angled;\n                // Named or numbered backreference with curly or angled braces\n                if (bracketed) {\n                    // XRegExp behavior for `${n}` or `$<n>`:\n                    // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the\n                    //    entire match. Any number of leading zeros may be used.\n                    // 2. Backreference to named capture `n`, if it exists and is not an integer\n                    //    overridden by numbered capture. In practice, this does not overlap with\n                    //    numbered capture since XRegExp does not allow named capture to use a bare\n                    //    integer as the name.\n                    // 3. If the name or number does not refer to an existing capturing group, it's\n                    //    an error.\n                    var n = +bracketed; // Type-convert; drop leading zeros\n                    if (n <= args.length - 3) {\n                        return args[n] || '';\n                    }\n                    // Groups with the same name is an error, else would need `lastIndexOf`\n                    n = captureNames ? captureNames.indexOf(bracketed) : -1;\n                    if (n < 0) {\n                        throw new SyntaxError('Backreference to undefined group ' + $0);\n                    }\n                    return args[n + 1] || '';\n                }\n                // Else, special variable or numbered backreference without curly braces\n                if (dollarToken === '$') {\n                    // $$\n                    return '$';\n                }\n                if (dollarToken === '&' || +dollarToken === 0) {\n                    // $&, $0 (not followed by 1-9), $00\n                    return args[0];\n                }\n                if (dollarToken === '`') {\n                    // $` (left context)\n                    return args[args.length - 1].slice(0, args[args.length - 2]);\n                }\n                if (dollarToken === \"'\") {\n                    // $' (right context)\n                    return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                }\n                // Else, numbered backreference without braces\n                dollarToken = +dollarToken; // Type-convert; drop leading zero\n                // XRegExp behavior for `$n` and `$nn`:\n                // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.\n                // - `$1` is an error if no capturing groups.\n                // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`\n                //   instead.\n                // - `$01` is `$1` if at least one capturing group, else it's an error.\n                // - `$0` (not followed by 1-9) and `$00` are the entire match.\n                // Native behavior, for comparison:\n                // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.\n                // - `$1` is a literal `$1` if no capturing groups.\n                // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.\n                // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.\n                // - `$0` is a literal `$0`.\n                if (!isNaN(dollarToken)) {\n                    if (dollarToken > args.length - 3) {\n                        throw new SyntaxError('Backreference to undefined group ' + $0);\n                    }\n                    return args[dollarToken] || '';\n                }\n                // `$` followed by an unsupported char is an error, unlike native JS\n                throw new SyntaxError('Invalid token ' + $0);\n            }\n        });\n    }\n\n    if (isRegex) {\n        if (search.global) {\n            // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n            search.lastIndex = 0;\n        } else {\n            // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n            search.lastIndex = origLastIndex;\n        }\n    }\n\n    return result;\n};\n\n/**\n * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.\n *\n * @memberOf String\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {Array} Array of substrings.\n */\nfixed.split = function (separator, limit) {\n    if (!XRegExp.isRegExp(separator)) {\n        // Browsers handle nonregex split correctly, so use the faster native method\n        return nativ.split.apply(this, arguments);\n    }\n\n    var str = String(this);\n    var output = [];\n    var origLastIndex = separator.lastIndex;\n    var lastLastIndex = 0;\n    var lastLength = void 0;\n\n    // Values for `limit`, per the spec:\n    // If undefined: pow(2,32) - 1\n    // If 0, Infinity, or NaN: 0\n    // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);\n    // If negative number: pow(2,32) - floor(abs(limit))\n    // If other: Type-convert, then use the above rules\n    // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless\n    // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+\n    limit = (limit === undefined ? -1 : limit) >>> 0;\n\n    XRegExp.forEach(str, separator, function (match) {\n        // This condition is not the same as `if (match[0].length)`\n        if (match.index + match[0].length > lastLastIndex) {\n            output.push(str.slice(lastLastIndex, match.index));\n            if (match.length > 1 && match.index < str.length) {\n                Array.prototype.push.apply(output, match.slice(1));\n            }\n            lastLength = match[0].length;\n            lastLastIndex = match.index + lastLength;\n        }\n    });\n\n    if (lastLastIndex === str.length) {\n        if (!nativ.test.call(separator, '') || lastLength) {\n            output.push('');\n        }\n    } else {\n        output.push(str.slice(lastLastIndex));\n    }\n\n    separator.lastIndex = origLastIndex;\n    return output.length > limit ? output.slice(0, limit) : output;\n};\n\n// ==--------------------------==\n// Built-in syntax/flag tokens\n// ==--------------------------==\n\n/*\n * Letter escapes that natively match literal characters: `\\a`, `\\A`, etc. These should be\n * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser\n * consistency and to reserve their syntax, but lets them be superseded by addons.\n */\nXRegExp.addToken(/\\\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|x(?![\\dA-Fa-f]{2}))/, function (match, scope) {\n    // \\B is allowed in default scope only\n    if (match[1] === 'B' && scope === defaultScope) {\n        return match[0];\n    }\n    throw new SyntaxError('Invalid escape ' + match[0]);\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Unicode code point escape with curly braces: `\\u{N..}`. `N..` is any one or more digit\n * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag\n * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to\n * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior\n * if you follow a `\\u{N..}` token that references a code point above U+FFFF with a quantifier, or\n * if you use the same in a character class.\n */\nXRegExp.addToken(/\\\\u{([\\dA-Fa-f]+)}/, function (match, scope, flags) {\n    var code = dec(match[1]);\n    if (code > 0x10FFFF) {\n        throw new SyntaxError('Invalid Unicode code point ' + match[0]);\n    }\n    if (code <= 0xFFFF) {\n        // Converting to \\uNNNN avoids needing to escape the literal character and keep it\n        // separate from preceding tokens\n        return '\\\\u' + pad4(hex(code));\n    }\n    // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling\n    if (hasNativeU && flags.indexOf('u') !== -1) {\n        return match[0];\n    }\n    throw new SyntaxError('Cannot use Unicode code point above \\\\u{FFFF} without flag u');\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.\n * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because\n * character class endings can't be determined.\n */\nXRegExp.addToken(/\\[(\\^?)\\]/,\n// For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n// (?!) should work like \\b\\B, but is unreliable in some versions of Firefox\n/* eslint-disable no-confusing-arrow */\nfunction (match) {\n    return match[1] ? '[\\\\s\\\\S]' : '\\\\b\\\\B';\n},\n/* eslint-enable no-confusing-arrow */\n{ leadChar: '[' });\n\n/*\n * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in\n * free-spacing mode (flag x).\n */\nXRegExp.addToken(/\\(\\?#[^)]*\\)/, getContextualTokenSeparator, { leadChar: '(' });\n\n/*\n * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.\n */\nXRegExp.addToken(/\\s+|#[^\\n]*\\n?/, getContextualTokenSeparator, { flag: 'x' });\n\n/*\n * Dot, in dotall mode (aka singleline mode, flag s) only.\n */\nXRegExp.addToken(/\\./, function () {\n    return '[\\\\s\\\\S]';\n}, {\n    flag: 's',\n    leadChar: '.'\n});\n\n/*\n * Named backreference: `\\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,\n * and $ only. Also allows numbered backreferences as `\\k<n>`.\n */\nXRegExp.addToken(/\\\\k<([\\w$]+)>/, function (match) {\n    // Groups with the same name is an error, else would need `lastIndexOf`\n    var index = isNaN(match[1]) ? this.captureNames.indexOf(match[1]) + 1 : +match[1];\n    var endIndex = match.index + match[0].length;\n    if (!index || index > this.captureNames.length) {\n        throw new SyntaxError('Backreference to undefined group ' + match[0]);\n    }\n    // Keep backreferences separate from subsequent literal numbers. This avoids e.g.\n    // inadvertedly changing `(?<n>)\\k<n>1` to `()\\11`.\n    return '\\\\' + index + (endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');\n}, { leadChar: '\\\\' });\n\n/*\n * Numbered backreference or octal, plus any following digits: `\\0`, `\\11`, etc. Octals except `\\0`\n * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches\n * are returned unaltered. IE < 9 doesn't support backreferences above `\\99` in regex syntax.\n */\nXRegExp.addToken(/\\\\(\\d+)/, function (match, scope) {\n    if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {\n        throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]);\n    }\n    return match[0];\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the\n * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style\n * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively\n * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to\n * Python-style named capture as octals.\n */\nXRegExp.addToken(/\\(\\?P?<([\\w$]+)>/, function (match) {\n    // Disallow bare integers as names because named backreferences are added to match arrays\n    // and therefore numeric properties may lead to incorrect lookups\n    if (!isNaN(match[1])) {\n        throw new SyntaxError('Cannot use integer as capture name ' + match[0]);\n    }\n    if (match[1] === 'length' || match[1] === '__proto__') {\n        throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]);\n    }\n    if (this.captureNames.indexOf(match[1]) !== -1) {\n        throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]);\n    }\n    this.captureNames.push(match[1]);\n    this.hasNamedCapture = true;\n    return '(';\n}, { leadChar: '(' });\n\n/*\n * Capturing group; match the opening parenthesis only. Required for support of named capturing\n * groups. Also adds explicit capture mode (flag n).\n */\nXRegExp.addToken(/\\((?!\\?)/, function (match, scope, flags) {\n    if (flags.indexOf('n') !== -1) {\n        return '(?:';\n    }\n    this.captureNames.push(null);\n    return '(';\n}, {\n    optionalFlags: 'n',\n    leadChar: '('\n});\n\nexports.default = XRegExp;\nmodule.exports = exports['default'];\n},{}],\"DN8N\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp.build 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2012-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n    var REGEX_DATA = 'xregexp';\n    var subParts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n    var parts = XRegExp.union([/\\({{([\\w$]+)}}\\)|{{([\\w$]+)}}/, subParts], 'g', {\n        conjunction: 'or'\n    });\n\n    /**\n     * Strips a leading `^` and trailing unescaped `$`, if both are present.\n     *\n     * @private\n     * @param {String} pattern Pattern to process.\n     * @returns {String} Pattern with edge anchors removed.\n     */\n    function deanchor(pattern) {\n        // Allow any number of empty noncapturing groups before/after anchors, because regexes\n        // built/generated by XRegExp sometimes include them\n        var leadingAnchor = /^(?:\\(\\?:\\))*\\^/;\n        var trailingAnchor = /\\$(?:\\(\\?:\\))*$/;\n\n        if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) &&\n        // Ensure that the trailing `$` isn't escaped\n        trailingAnchor.test(pattern.replace(/\\\\[\\s\\S]/g, ''))) {\n            return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');\n        }\n\n        return pattern;\n    }\n\n    /**\n     * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.\n     *\n     * @private\n     * @param {String|RegExp} value Value to convert.\n     * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not\n     *   already a regex generated by XRegExp\n     * @returns {RegExp} XRegExp object with XRegExp syntax applied.\n     */\n    function asXRegExp(value, addFlagX) {\n        var flags = addFlagX ? 'x' : '';\n        return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ?\n        // Don't recompile, to preserve capture names\n        value :\n        // Recompile as XRegExp\n        XRegExp(value.source, flags) :\n        // Compile string as XRegExp\n        XRegExp(value, flags);\n    }\n\n    function interpolate(substitution) {\n        return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);\n    }\n\n    function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {\n        subpatterns['subpattern' + subpatternIndex] = interpolated;\n        return subpatterns;\n    }\n\n    function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {\n        var hasSubpattern = subpatternIndex < rawLiterals.length - 1;\n        return raw + (hasSubpattern ? '{{subpattern' + subpatternIndex + '}}' : '');\n    }\n\n    /**\n     * Provides tagged template literals that create regexes with XRegExp syntax and flags. The\n     * provided pattern is handled as a raw string, so backslashes don't need to be escaped.\n     *\n     * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated\n     * patterns are treated as atomic units when quantified, interpolated strings have their special\n     * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated\n     * regexes if both are present, and any backreferences within an interpolated regex are\n     * rewritten to work within the overall pattern.\n     *\n     * @memberOf XRegExp\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.\n     * @example\n     *\n     * const h12 = /1[0-2]|0?[1-9]/;\n     * const h24 = /2[0-3]|[01][0-9]/;\n     * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;\n     * const minutes = /^[0-5][0-9]$/;\n     * // Note that explicitly naming the 'minutes' group is required for named backreferences\n     * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;\n     * time.test('10:59'); // -> true\n     * XRegExp.exec('10:59', time).minutes; // -> '59'\n     */\n    XRegExp.tag = function (flags) {\n        return function (literals) {\n            for (var _len = arguments.length, substitutions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                substitutions[_key - 1] = arguments[_key];\n            }\n\n            var subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});\n            var pattern = literals.raw.map(embedSubpatternAfter).join('');\n            return XRegExp.build(pattern, subpatterns, flags);\n        };\n    };\n\n    /**\n     * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in\n     * the outer pattern and provided subpatterns are automatically renumbered to work correctly.\n     * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.\n     *\n     * @memberOf XRegExp\n     * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows\n     *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within\n     *   character classes.\n     * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A\n     *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {RegExp} Regex with interpolated subpatterns.\n     * @example\n     *\n     * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {\n     *   hours: XRegExp.build('{{h12}} : | {{h24}}', {\n     *     h12: /1[0-2]|0?[1-9]/,\n     *     h24: /2[0-3]|[01][0-9]/\n     *   }, 'x'),\n     *   minutes: /^[0-5][0-9]$/\n     * });\n     * time.test('10:59'); // -> true\n     * XRegExp.exec('10:59', time).minutes; // -> '59'\n     */\n    XRegExp.build = function (pattern, subs, flags) {\n        flags = flags || '';\n        // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how\n        // some browsers convert `RegExp('\\n')` to a regex that contains the literal characters `\\`\n        // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.\n        var addFlagX = flags.indexOf('x') !== -1;\n        var inlineFlags = /^\\(\\?([\\w$]+)\\)/.exec(pattern);\n        // Add flags within a leading mode modifier to the overall pattern's flags\n        if (inlineFlags) {\n            flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);\n        }\n\n        var data = {};\n        for (var p in subs) {\n            if (subs.hasOwnProperty(p)) {\n                // Passing to XRegExp enables extended syntax and ensures independent validity,\n                // lest an unescaped `(`, `)`, `[`, or trailing `\\` breaks the `(?:)` wrapper. For\n                // subpatterns provided as native regexes, it dies on octals and adds the property\n                // used to hold extended regex instance data, for simplicity.\n                var sub = asXRegExp(subs[p], addFlagX);\n                data[p] = {\n                    // Deanchoring allows embedding independently useful anchored regexes. If you\n                    // really need to keep your anchors, double them (i.e., `^^...$$`).\n                    pattern: deanchor(sub.source),\n                    names: sub[REGEX_DATA].captureNames || []\n                };\n            }\n        }\n\n        // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;\n        // helps keep this simple. Named captures will be put back.\n        var patternAsRegex = asXRegExp(pattern, addFlagX);\n\n        // 'Caps' is short for 'captures'\n        var numCaps = 0;\n        var numPriorCaps = void 0;\n        var numOuterCaps = 0;\n        var outerCapsMap = [0];\n        var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];\n        var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {\n            var subName = $1 || $2;\n            var capName = void 0;\n            var intro = void 0;\n            var localCapIndex = void 0;\n            // Named subpattern\n            if (subName) {\n                if (!data.hasOwnProperty(subName)) {\n                    throw new ReferenceError('Undefined property ' + $0);\n                }\n                // Named subpattern was wrapped in a capturing group\n                if ($1) {\n                    capName = outerCapNames[numOuterCaps];\n                    outerCapsMap[++numOuterCaps] = ++numCaps;\n                    // If it's a named group, preserve the name. Otherwise, use the subpattern name\n                    // as the capture name\n                    intro = '(?<' + (capName || subName) + '>';\n                } else {\n                    intro = '(?:';\n                }\n                numPriorCaps = numCaps;\n                var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {\n                    // Capturing group\n                    if (paren) {\n                        capName = data[subName].names[numCaps - numPriorCaps];\n                        ++numCaps;\n                        // If the current capture has a name, preserve the name\n                        if (capName) {\n                            return '(?<' + capName + '>';\n                        }\n                        // Backreference\n                    } else if (backref) {\n                        localCapIndex = +backref - 1;\n                        // Rewrite the backreference\n                        return data[subName].names[localCapIndex] ?\n                        // Need to preserve the backreference name in case using flag `n`\n                        '\\\\k<' + data[subName].names[localCapIndex] + '>' : '\\\\' + (+backref + numPriorCaps);\n                    }\n                    return match;\n                });\n                return '' + intro + rewrittenSubpattern + ')';\n            }\n            // Capturing group\n            if ($3) {\n                capName = outerCapNames[numOuterCaps];\n                outerCapsMap[++numOuterCaps] = ++numCaps;\n                // If the current capture has a name, preserve the name\n                if (capName) {\n                    return '(?<' + capName + '>';\n                }\n                // Backreference\n            } else if ($4) {\n                localCapIndex = +$4 - 1;\n                // Rewrite the backreference\n                return outerCapNames[localCapIndex] ?\n                // Need to preserve the backreference name in case using flag `n`\n                '\\\\k<' + outerCapNames[localCapIndex] + '>' : '\\\\' + outerCapsMap[+$4];\n            }\n            return $0;\n        });\n\n        return XRegExp(output, flags);\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"wN5b\":[function(require,module,exports) {\nvar global = arguments[3];\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp.matchRecursive 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2009-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Returns a match detail object composed of the provided values.\n     *\n     * @private\n     */\n    function row(name, value, start, end) {\n        return {\n            name: name,\n            value: value,\n            start: start,\n            end: end\n        };\n    }\n\n    /**\n     * Returns an array of match strings between outermost left and right delimiters, or an array of\n     * objects with detailed match parts and position data. An error is thrown if delimiters are\n     * unbalanced within the data.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {String} left Left delimiter as an XRegExp pattern.\n     * @param {String} right Right delimiter as an XRegExp pattern.\n     * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.\n     * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.\n     * @returns {Array} Array of matches, or an empty array.\n     * @example\n     *\n     * // Basic usage\n     * let str = '(t((e))s)t()(ing)';\n     * XRegExp.matchRecursive(str, '\\\\(', '\\\\)', 'g');\n     * // -> ['t((e))s', '', 'ing']\n     *\n     * // Extended information mode with valueNames\n     * str = 'Here is <div> <div>an</div></div> example';\n     * XRegExp.matchRecursive(str, '<div\\\\s*>', '</div>', 'gi', {\n     *   valueNames: ['between', 'left', 'match', 'right']\n     * });\n     * // -> [\n     * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},\n     * // {name: 'left',    value: '<div>',          start: 8,  end: 13},\n     * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},\n     * // {name: 'right',   value: '</div>',         start: 27, end: 33},\n     * // {name: 'between', value: ' example',       start: 33, end: 41}\n     * // ]\n     *\n     * // Omitting unneeded parts with null valueNames, and using escapeChar\n     * str = '...{1}.\\\\{{function(x,y){return {y:x}}}';\n     * XRegExp.matchRecursive(str, '{', '}', 'g', {\n     *   valueNames: ['literal', null, 'value', null],\n     *   escapeChar: '\\\\'\n     * });\n     * // -> [\n     * // {name: 'literal', value: '...',  start: 0, end: 3},\n     * // {name: 'value',   value: '1',    start: 4, end: 5},\n     * // {name: 'literal', value: '.\\\\{', start: 6, end: 9},\n     * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}\n     * // ]\n     *\n     * // Sticky mode via flag y\n     * str = '<1><<<2>>><3>4<5>';\n     * XRegExp.matchRecursive(str, '<', '>', 'gy');\n     * // -> ['1', '<<2>>', '3']\n     */\n    XRegExp.matchRecursive = function (str, left, right, flags, options) {\n        flags = flags || '';\n        options = options || {};\n        var global = flags.indexOf('g') !== -1;\n        var sticky = flags.indexOf('y') !== -1;\n        // Flag `y` is controlled internally\n        var basicFlags = flags.replace(/y/g, '');\n        var escapeChar = options.escapeChar;\n        var vN = options.valueNames;\n        var output = [];\n        var openTokens = 0;\n        var delimStart = 0;\n        var delimEnd = 0;\n        var lastOuterEnd = 0;\n        var outerStart = void 0;\n        var innerStart = void 0;\n        var leftMatch = void 0;\n        var rightMatch = void 0;\n        var esc = void 0;\n        left = XRegExp(left, basicFlags);\n        right = XRegExp(right, basicFlags);\n\n        if (escapeChar) {\n            if (escapeChar.length > 1) {\n                throw new Error('Cannot use more than one escape character');\n            }\n            escapeChar = XRegExp.escape(escapeChar);\n            // Example of concatenated `esc` regex:\n            // `escapeChar`: '%'\n            // `left`: '<'\n            // `right`: '>'\n            // Regex is: /(?:%[\\S\\s]|(?:(?!<|>)[^%])+)+/\n            esc = new RegExp('(?:' + escapeChar + '[\\\\S\\\\s]|(?:(?!' +\n            // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.\n            // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax\n            // transformation resulting from those flags was already applied to `left` and\n            // `right` when they were passed through the XRegExp constructor above.\n            XRegExp.union([left, right], '', { conjunction: 'or' }).source + ')[^' + escapeChar + '])+)+',\n            // Flags `gy` not needed here\n            flags.replace(/[^imu]+/g, ''));\n        }\n\n        while (true) {\n            // If using an escape character, advance to the delimiter's next starting position,\n            // skipping any escaped characters in between\n            if (escapeChar) {\n                delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;\n            }\n            leftMatch = XRegExp.exec(str, left, delimEnd);\n            rightMatch = XRegExp.exec(str, right, delimEnd);\n            // Keep the leftmost match only\n            if (leftMatch && rightMatch) {\n                if (leftMatch.index <= rightMatch.index) {\n                    rightMatch = null;\n                } else {\n                    leftMatch = null;\n                }\n            }\n            // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):\n            // LM | RM | OT | Result\n            // 1  | 0  | 1  | loop\n            // 1  | 0  | 0  | loop\n            // 0  | 1  | 1  | loop\n            // 0  | 1  | 0  | throw\n            // 0  | 0  | 1  | throw\n            // 0  | 0  | 0  | break\n            // The paths above don't include the sticky mode special case. The loop ends after the\n            // first completed match if not `global`.\n            if (leftMatch || rightMatch) {\n                delimStart = (leftMatch || rightMatch).index;\n                delimEnd = delimStart + (leftMatch || rightMatch)[0].length;\n            } else if (!openTokens) {\n                break;\n            }\n            if (sticky && !openTokens && delimStart > lastOuterEnd) {\n                break;\n            }\n            if (leftMatch) {\n                if (!openTokens) {\n                    outerStart = delimStart;\n                    innerStart = delimEnd;\n                }\n                ++openTokens;\n            } else if (rightMatch && openTokens) {\n                if (! --openTokens) {\n                    if (vN) {\n                        if (vN[0] && outerStart > lastOuterEnd) {\n                            output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));\n                        }\n                        if (vN[1]) {\n                            output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));\n                        }\n                        if (vN[2]) {\n                            output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));\n                        }\n                        if (vN[3]) {\n                            output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));\n                        }\n                    } else {\n                        output.push(str.slice(innerStart, delimStart));\n                    }\n                    lastOuterEnd = delimEnd;\n                    if (!global) {\n                        break;\n                    }\n                }\n            } else {\n                throw new Error('Unbalanced delimiter found in string');\n            }\n            // If the delimiter matched an empty string, avoid an infinite loop\n            if (delimStart === delimEnd) {\n                ++delimEnd;\n            }\n        }\n\n        if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {\n            output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));\n        }\n\n        return output;\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"s3hB\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Base 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2008-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds base support for Unicode matching:\n     * - Adds syntax `\\p{..}` for matching Unicode tokens. Tokens can be inverted using `\\P{..}` or\n     *   `\\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the\n     *   braces for token names that are a single letter (e.g. `\\pL` or `PL`).\n     * - Adds flag A (astral), which enables 21-bit Unicode support.\n     * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.\n     *\n     * Unicode Base relies on externally provided Unicode character data. Official addons are\n     * available to provide data for Unicode categories, scripts, blocks, and properties.\n     *\n     * @requires XRegExp\n     */\n\n    // ==--------------------------==\n    // Private stuff\n    // ==--------------------------==\n\n    // Storage for Unicode data\n    var unicode = {};\n\n    // Reuse utils\n    var dec = XRegExp._dec;\n    var hex = XRegExp._hex;\n    var pad4 = XRegExp._pad4;\n\n    // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed\n    function normalize(name) {\n        return name.replace(/[- _]+/g, '').toLowerCase();\n    }\n\n    // Gets the decimal code of a literal code unit, \\xHH, \\uHHHH, or a backslash-escaped literal\n    function charCode(chr) {\n        var esc = /^\\\\[xu](.+)/.exec(chr);\n        return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\\\' ? 1 : 0);\n    }\n\n    // Inverts a list of ordered BMP characters and ranges\n    function invertBmp(range) {\n        var output = '';\n        var lastEnd = -1;\n\n        XRegExp.forEach(range, /(\\\\x..|\\\\u....|\\\\?[\\s\\S])(?:-(\\\\x..|\\\\u....|\\\\?[\\s\\S]))?/, function (m) {\n            var start = charCode(m[1]);\n            if (start > lastEnd + 1) {\n                output += '\\\\u' + pad4(hex(lastEnd + 1));\n                if (start > lastEnd + 2) {\n                    output += '-\\\\u' + pad4(hex(start - 1));\n                }\n            }\n            lastEnd = charCode(m[2] || m[1]);\n        });\n\n        if (lastEnd < 0xFFFF) {\n            output += '\\\\u' + pad4(hex(lastEnd + 1));\n            if (lastEnd < 0xFFFE) {\n                output += '-\\\\uFFFF';\n            }\n        }\n\n        return output;\n    }\n\n    // Generates an inverted BMP range on first use\n    function cacheInvertedBmp(slug) {\n        var prop = 'b!';\n        return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));\n    }\n\n    // Combines and optionally negates BMP and astral data\n    function buildAstral(slug, isNegated) {\n        var item = unicode[slug];\n        var combined = '';\n\n        if (item.bmp && !item.isBmpLast) {\n            combined = '[' + item.bmp + ']' + (item.astral ? '|' : '');\n        }\n        if (item.astral) {\n            combined += item.astral;\n        }\n        if (item.isBmpLast && item.bmp) {\n            combined += (item.astral ? '|' : '') + '[' + item.bmp + ']';\n        }\n\n        // Astral Unicode tokens always match a code point, never a code unit\n        return isNegated ? '(?:(?!' + combined + ')(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\0-\\uFFFF]))' : '(?:' + combined + ')';\n    }\n\n    // Builds a complete astral pattern on first use\n    function cacheAstral(slug, isNegated) {\n        var prop = isNegated ? 'a!' : 'a=';\n        return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));\n    }\n\n    // ==--------------------------==\n    // Core functionality\n    // ==--------------------------==\n\n    /*\n     * Add astral mode (flag A) and Unicode token syntax: `\\p{..}`, `\\P{..}`, `\\p{^..}`, `\\pC`.\n     */\n    XRegExp.addToken(\n    // Use `*` instead of `+` to avoid capturing `^` as the token name in `\\p{^}`\n    /\\\\([pP])(?:{(\\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {\n        var ERR_DOUBLE_NEG = 'Invalid double negation ';\n        var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';\n        var ERR_UNKNOWN_REF = 'Unicode token missing data ';\n        var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';\n        var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';\n        // Negated via \\P{..} or \\p{^..}\n        var isNegated = match[1] === 'P' || !!match[2];\n        // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A\n        var isAstralMode = flags.indexOf('A') !== -1;\n        // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\\p{}`\n        var slug = normalize(match[4] || match[3]);\n        // Token data object\n        var item = unicode[slug];\n\n        if (match[1] === 'P' && match[2]) {\n            throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);\n        }\n        if (!unicode.hasOwnProperty(slug)) {\n            throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);\n        }\n\n        // Switch to the negated form of the referenced Unicode token\n        if (item.inverseOf) {\n            slug = normalize(item.inverseOf);\n            if (!unicode.hasOwnProperty(slug)) {\n                throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf);\n            }\n            item = unicode[slug];\n            isNegated = !isNegated;\n        }\n\n        if (!(item.bmp || isAstralMode)) {\n            throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);\n        }\n        if (isAstralMode) {\n            if (scope === 'class') {\n                throw new SyntaxError(ERR_ASTRAL_IN_CLASS);\n            }\n\n            return cacheAstral(slug, isNegated);\n        }\n\n        return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : (isNegated ? '[^' : '[') + item.bmp + ']';\n    }, {\n        scope: 'all',\n        optionalFlags: 'A',\n        leadChar: '\\\\'\n    });\n\n    /**\n     * Adds to the list of Unicode tokens that XRegExp regexes can match via `\\p` or `\\P`.\n     *\n     * @memberOf XRegExp\n     * @param {Array} data Objects with named character ranges. Each object may have properties\n     *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are\n     *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If\n     *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,\n     *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are\n     *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and\n     *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan\n     *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and\n     *   `astral` data should be a combination of literal characters and `\\xHH` or `\\uHHHH` escape\n     *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be\n     *   escaped, apart from range-creating hyphens. The `astral` data can additionally use\n     *   character classes and alternation, and should use surrogate pairs to represent astral code\n     *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is\n     *   defined as the exact inverse of another token.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.addUnicodeData([{\n     *   name: 'XDigit',\n     *   alias: 'Hexadecimal',\n     *   bmp: '0-9A-Fa-f'\n     * }]);\n     * XRegExp('\\\\p{XDigit}:\\\\p{Hexadecimal}+').test('0:3D'); // -> true\n     */\n    XRegExp.addUnicodeData = function (data) {\n        var ERR_NO_NAME = 'Unicode token requires name';\n        var ERR_NO_DATA = 'Unicode token has no character data ';\n        var item = void 0;\n\n        for (var i = 0; i < data.length; ++i) {\n            item = data[i];\n            if (!item.name) {\n                throw new Error(ERR_NO_NAME);\n            }\n            if (!(item.inverseOf || item.bmp || item.astral)) {\n                throw new Error(ERR_NO_DATA + item.name);\n            }\n            unicode[normalize(item.name)] = item;\n            if (item.alias) {\n                unicode[normalize(item.alias)] = item;\n            }\n        }\n\n        // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and\n        // flags might now produce different results\n        XRegExp.cache.flush('patterns');\n    };\n\n    /**\n     * @ignore\n     *\n     * Return a reference to the internal Unicode definition structure for the given Unicode\n     * Property if the given name is a legal Unicode Property for use in XRegExp `\\p` or `\\P` regex\n     * constructs.\n     *\n     * @memberOf XRegExp\n     * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),\n     *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode\n     *   Properties and Property Aliases.\n     * @returns {Object} Reference to definition structure when the name matches a Unicode Property.\n     *\n     * @note\n     * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.\n     *\n     * @note\n     * This method is *not* part of the officially documented API and may change or be removed in\n     * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode\n     * structures set up by XRegExp.\n     */\n    XRegExp._getUnicodeProperty = function (name) {\n        var slug = normalize(name);\n        return unicode[slug];\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"YWjk\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Blocks 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,\n     * `\\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and\n     * underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'InAdlam',\n        astral: '\\uD83A[\\uDD00-\\uDD5F]'\n    }, {\n        name: 'InAegean_Numbers',\n        astral: '\\uD800[\\uDD00-\\uDD3F]'\n    }, {\n        name: 'InAhom',\n        astral: '\\uD805[\\uDF00-\\uDF3F]'\n    }, {\n        name: 'InAlchemical_Symbols',\n        astral: '\\uD83D[\\uDF00-\\uDF7F]'\n    }, {\n        name: 'InAlphabetic_Presentation_Forms',\n        bmp: '\\uFB00-\\uFB4F'\n    }, {\n        name: 'InAnatolian_Hieroglyphs',\n        astral: '\\uD811[\\uDC00-\\uDE7F]'\n    }, {\n        name: 'InAncient_Greek_Musical_Notation',\n        astral: '\\uD834[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InAncient_Greek_Numbers',\n        astral: '\\uD800[\\uDD40-\\uDD8F]'\n    }, {\n        name: 'InAncient_Symbols',\n        astral: '\\uD800[\\uDD90-\\uDDCF]'\n    }, {\n        name: 'InArabic',\n        bmp: '\\u0600-\\u06FF'\n    }, {\n        name: 'InArabic_Extended_A',\n        bmp: '\\u08A0-\\u08FF'\n    }, {\n        name: 'InArabic_Mathematical_Alphabetic_Symbols',\n        astral: '\\uD83B[\\uDE00-\\uDEFF]'\n    }, {\n        name: 'InArabic_Presentation_Forms_A',\n        bmp: '\\uFB50-\\uFDFF'\n    }, {\n        name: 'InArabic_Presentation_Forms_B',\n        bmp: '\\uFE70-\\uFEFF'\n    }, {\n        name: 'InArabic_Supplement',\n        bmp: '\\u0750-\\u077F'\n    }, {\n        name: 'InArmenian',\n        bmp: '\\u0530-\\u058F'\n    }, {\n        name: 'InArrows',\n        bmp: '\\u2190-\\u21FF'\n    }, {\n        name: 'InAvestan',\n        astral: '\\uD802[\\uDF00-\\uDF3F]'\n    }, {\n        name: 'InBalinese',\n        bmp: '\\u1B00-\\u1B7F'\n    }, {\n        name: 'InBamum',\n        bmp: '\\uA6A0-\\uA6FF'\n    }, {\n        name: 'InBamum_Supplement',\n        astral: '\\uD81A[\\uDC00-\\uDE3F]'\n    }, {\n        name: 'InBasic_Latin',\n        bmp: '\\0-\\x7F'\n    }, {\n        name: 'InBassa_Vah',\n        astral: '\\uD81A[\\uDED0-\\uDEFF]'\n    }, {\n        name: 'InBatak',\n        bmp: '\\u1BC0-\\u1BFF'\n    }, {\n        name: 'InBengali',\n        bmp: '\\u0980-\\u09FF'\n    }, {\n        name: 'InBhaiksuki',\n        astral: '\\uD807[\\uDC00-\\uDC6F]'\n    }, {\n        name: 'InBlock_Elements',\n        bmp: '\\u2580-\\u259F'\n    }, {\n        name: 'InBopomofo',\n        bmp: '\\u3100-\\u312F'\n    }, {\n        name: 'InBopomofo_Extended',\n        bmp: '\\u31A0-\\u31BF'\n    }, {\n        name: 'InBox_Drawing',\n        bmp: '\\u2500-\\u257F'\n    }, {\n        name: 'InBrahmi',\n        astral: '\\uD804[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InBraille_Patterns',\n        bmp: '\\u2800-\\u28FF'\n    }, {\n        name: 'InBuginese',\n        bmp: '\\u1A00-\\u1A1F'\n    }, {\n        name: 'InBuhid',\n        bmp: '\\u1740-\\u175F'\n    }, {\n        name: 'InByzantine_Musical_Symbols',\n        astral: '\\uD834[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InCJK_Compatibility',\n        bmp: '\\u3300-\\u33FF'\n    }, {\n        name: 'InCJK_Compatibility_Forms',\n        bmp: '\\uFE30-\\uFE4F'\n    }, {\n        name: 'InCJK_Compatibility_Ideographs',\n        bmp: '\\uF900-\\uFAFF'\n    }, {\n        name: 'InCJK_Compatibility_Ideographs_Supplement',\n        astral: '\\uD87E[\\uDC00-\\uDE1F]'\n    }, {\n        name: 'InCJK_Radicals_Supplement',\n        bmp: '\\u2E80-\\u2EFF'\n    }, {\n        name: 'InCJK_Strokes',\n        bmp: '\\u31C0-\\u31EF'\n    }, {\n        name: 'InCJK_Symbols_and_Punctuation',\n        bmp: '\\u3000-\\u303F'\n    }, {\n        name: 'InCJK_Unified_Ideographs',\n        bmp: '\\u4E00-\\u9FFF'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_A',\n        bmp: '\\u3400-\\u4DBF'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_B',\n        astral: '[\\uD840-\\uD868][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDEDF]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_C',\n        astral: '\\uD869[\\uDF00-\\uDFFF]|[\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF3F]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_D',\n        astral: '\\uD86D[\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1F]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_E',\n        astral: '\\uD86E[\\uDC20-\\uDFFF]|[\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD873[\\uDC00-\\uDEAF]'\n    }, {\n        name: 'InCarian',\n        astral: '\\uD800[\\uDEA0-\\uDEDF]'\n    }, {\n        name: 'InCaucasian_Albanian',\n        astral: '\\uD801[\\uDD30-\\uDD6F]'\n    }, {\n        name: 'InChakma',\n        astral: '\\uD804[\\uDD00-\\uDD4F]'\n    }, {\n        name: 'InCham',\n        bmp: '\\uAA00-\\uAA5F'\n    }, {\n        name: 'InCherokee',\n        bmp: '\\u13A0-\\u13FF'\n    }, {\n        name: 'InCherokee_Supplement',\n        bmp: '\\uAB70-\\uABBF'\n    }, {\n        name: 'InCombining_Diacritical_Marks',\n        bmp: '\\u0300-\\u036F'\n    }, {\n        name: 'InCombining_Diacritical_Marks_Extended',\n        bmp: '\\u1AB0-\\u1AFF'\n    }, {\n        name: 'InCombining_Diacritical_Marks_Supplement',\n        bmp: '\\u1DC0-\\u1DFF'\n    }, {\n        name: 'InCombining_Diacritical_Marks_for_Symbols',\n        bmp: '\\u20D0-\\u20FF'\n    }, {\n        name: 'InCombining_Half_Marks',\n        bmp: '\\uFE20-\\uFE2F'\n    }, {\n        name: 'InCommon_Indic_Number_Forms',\n        bmp: '\\uA830-\\uA83F'\n    }, {\n        name: 'InControl_Pictures',\n        bmp: '\\u2400-\\u243F'\n    }, {\n        name: 'InCoptic',\n        bmp: '\\u2C80-\\u2CFF'\n    }, {\n        name: 'InCoptic_Epact_Numbers',\n        astral: '\\uD800[\\uDEE0-\\uDEFF]'\n    }, {\n        name: 'InCounting_Rod_Numerals',\n        astral: '\\uD834[\\uDF60-\\uDF7F]'\n    }, {\n        name: 'InCuneiform',\n        astral: '\\uD808[\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InCuneiform_Numbers_and_Punctuation',\n        astral: '\\uD809[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InCurrency_Symbols',\n        bmp: '\\u20A0-\\u20CF'\n    }, {\n        name: 'InCypriot_Syllabary',\n        astral: '\\uD802[\\uDC00-\\uDC3F]'\n    }, {\n        name: 'InCyrillic',\n        bmp: '\\u0400-\\u04FF'\n    }, {\n        name: 'InCyrillic_Extended_A',\n        bmp: '\\u2DE0-\\u2DFF'\n    }, {\n        name: 'InCyrillic_Extended_B',\n        bmp: '\\uA640-\\uA69F'\n    }, {\n        name: 'InCyrillic_Extended_C',\n        bmp: '\\u1C80-\\u1C8F'\n    }, {\n        name: 'InCyrillic_Supplement',\n        bmp: '\\u0500-\\u052F'\n    }, {\n        name: 'InDeseret',\n        astral: '\\uD801[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'InDevanagari',\n        bmp: '\\u0900-\\u097F'\n    }, {\n        name: 'InDevanagari_Extended',\n        bmp: '\\uA8E0-\\uA8FF'\n    }, {\n        name: 'InDingbats',\n        bmp: '\\u2700-\\u27BF'\n    }, {\n        name: 'InDomino_Tiles',\n        astral: '\\uD83C[\\uDC30-\\uDC9F]'\n    }, {\n        name: 'InDuployan',\n        astral: '\\uD82F[\\uDC00-\\uDC9F]'\n    }, {\n        name: 'InEarly_Dynastic_Cuneiform',\n        astral: '\\uD809[\\uDC80-\\uDD4F]'\n    }, {\n        name: 'InEgyptian_Hieroglyphs',\n        astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InElbasan',\n        astral: '\\uD801[\\uDD00-\\uDD2F]'\n    }, {\n        name: 'InEmoticons',\n        astral: '\\uD83D[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InEnclosed_Alphanumeric_Supplement',\n        astral: '\\uD83C[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InEnclosed_Alphanumerics',\n        bmp: '\\u2460-\\u24FF'\n    }, {\n        name: 'InEnclosed_CJK_Letters_and_Months',\n        bmp: '\\u3200-\\u32FF'\n    }, {\n        name: 'InEnclosed_Ideographic_Supplement',\n        astral: '\\uD83C[\\uDE00-\\uDEFF]'\n    }, {\n        name: 'InEthiopic',\n        bmp: '\\u1200-\\u137F'\n    }, {\n        name: 'InEthiopic_Extended',\n        bmp: '\\u2D80-\\u2DDF'\n    }, {\n        name: 'InEthiopic_Extended_A',\n        bmp: '\\uAB00-\\uAB2F'\n    }, {\n        name: 'InEthiopic_Supplement',\n        bmp: '\\u1380-\\u139F'\n    }, {\n        name: 'InGeneral_Punctuation',\n        bmp: '\\u2000-\\u206F'\n    }, {\n        name: 'InGeometric_Shapes',\n        bmp: '\\u25A0-\\u25FF'\n    }, {\n        name: 'InGeometric_Shapes_Extended',\n        astral: '\\uD83D[\\uDF80-\\uDFFF]'\n    }, {\n        name: 'InGeorgian',\n        bmp: '\\u10A0-\\u10FF'\n    }, {\n        name: 'InGeorgian_Supplement',\n        bmp: '\\u2D00-\\u2D2F'\n    }, {\n        name: 'InGlagolitic',\n        bmp: '\\u2C00-\\u2C5F'\n    }, {\n        name: 'InGlagolitic_Supplement',\n        astral: '\\uD838[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InGothic',\n        astral: '\\uD800[\\uDF30-\\uDF4F]'\n    }, {\n        name: 'InGrantha',\n        astral: '\\uD804[\\uDF00-\\uDF7F]'\n    }, {\n        name: 'InGreek_Extended',\n        bmp: '\\u1F00-\\u1FFF'\n    }, {\n        name: 'InGreek_and_Coptic',\n        bmp: '\\u0370-\\u03FF'\n    }, {\n        name: 'InGujarati',\n        bmp: '\\u0A80-\\u0AFF'\n    }, {\n        name: 'InGurmukhi',\n        bmp: '\\u0A00-\\u0A7F'\n    }, {\n        name: 'InHalfwidth_and_Fullwidth_Forms',\n        bmp: '\\uFF00-\\uFFEF'\n    }, {\n        name: 'InHangul_Compatibility_Jamo',\n        bmp: '\\u3130-\\u318F'\n    }, {\n        name: 'InHangul_Jamo',\n        bmp: '\\u1100-\\u11FF'\n    }, {\n        name: 'InHangul_Jamo_Extended_A',\n        bmp: '\\uA960-\\uA97F'\n    }, {\n        name: 'InHangul_Jamo_Extended_B',\n        bmp: '\\uD7B0-\\uD7FF'\n    }, {\n        name: 'InHangul_Syllables',\n        bmp: '\\uAC00-\\uD7AF'\n    }, {\n        name: 'InHanunoo',\n        bmp: '\\u1720-\\u173F'\n    }, {\n        name: 'InHatran',\n        astral: '\\uD802[\\uDCE0-\\uDCFF]'\n    }, {\n        name: 'InHebrew',\n        bmp: '\\u0590-\\u05FF'\n    }, {\n        name: 'InHigh_Private_Use_Surrogates',\n        bmp: '\\uDB80-\\uDBFF'\n    }, {\n        name: 'InHigh_Surrogates',\n        bmp: '\\uD800-\\uDB7F'\n    }, {\n        name: 'InHiragana',\n        bmp: '\\u3040-\\u309F'\n    }, {\n        name: 'InIPA_Extensions',\n        bmp: '\\u0250-\\u02AF'\n    }, {\n        name: 'InIdeographic_Description_Characters',\n        bmp: '\\u2FF0-\\u2FFF'\n    }, {\n        name: 'InIdeographic_Symbols_and_Punctuation',\n        astral: '\\uD81B[\\uDFE0-\\uDFFF]'\n    }, {\n        name: 'InImperial_Aramaic',\n        astral: '\\uD802[\\uDC40-\\uDC5F]'\n    }, {\n        name: 'InInscriptional_Pahlavi',\n        astral: '\\uD802[\\uDF60-\\uDF7F]'\n    }, {\n        name: 'InInscriptional_Parthian',\n        astral: '\\uD802[\\uDF40-\\uDF5F]'\n    }, {\n        name: 'InJavanese',\n        bmp: '\\uA980-\\uA9DF'\n    }, {\n        name: 'InKaithi',\n        astral: '\\uD804[\\uDC80-\\uDCCF]'\n    }, {\n        name: 'InKana_Supplement',\n        astral: '\\uD82C[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InKanbun',\n        bmp: '\\u3190-\\u319F'\n    }, {\n        name: 'InKangxi_Radicals',\n        bmp: '\\u2F00-\\u2FDF'\n    }, {\n        name: 'InKannada',\n        bmp: '\\u0C80-\\u0CFF'\n    }, {\n        name: 'InKatakana',\n        bmp: '\\u30A0-\\u30FF'\n    }, {\n        name: 'InKatakana_Phonetic_Extensions',\n        bmp: '\\u31F0-\\u31FF'\n    }, {\n        name: 'InKayah_Li',\n        bmp: '\\uA900-\\uA92F'\n    }, {\n        name: 'InKharoshthi',\n        astral: '\\uD802[\\uDE00-\\uDE5F]'\n    }, {\n        name: 'InKhmer',\n        bmp: '\\u1780-\\u17FF'\n    }, {\n        name: 'InKhmer_Symbols',\n        bmp: '\\u19E0-\\u19FF'\n    }, {\n        name: 'InKhojki',\n        astral: '\\uD804[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InKhudawadi',\n        astral: '\\uD804[\\uDEB0-\\uDEFF]'\n    }, {\n        name: 'InLao',\n        bmp: '\\u0E80-\\u0EFF'\n    }, {\n        name: 'InLatin_Extended_Additional',\n        bmp: '\\u1E00-\\u1EFF'\n    }, {\n        name: 'InLatin_Extended_A',\n        bmp: '\\u0100-\\u017F'\n    }, {\n        name: 'InLatin_Extended_B',\n        bmp: '\\u0180-\\u024F'\n    }, {\n        name: 'InLatin_Extended_C',\n        bmp: '\\u2C60-\\u2C7F'\n    }, {\n        name: 'InLatin_Extended_D',\n        bmp: '\\uA720-\\uA7FF'\n    }, {\n        name: 'InLatin_Extended_E',\n        bmp: '\\uAB30-\\uAB6F'\n    }, {\n        name: 'InLatin_1_Supplement',\n        bmp: '\\x80-\\xFF'\n    }, {\n        name: 'InLepcha',\n        bmp: '\\u1C00-\\u1C4F'\n    }, {\n        name: 'InLetterlike_Symbols',\n        bmp: '\\u2100-\\u214F'\n    }, {\n        name: 'InLimbu',\n        bmp: '\\u1900-\\u194F'\n    }, {\n        name: 'InLinear_A',\n        astral: '\\uD801[\\uDE00-\\uDF7F]'\n    }, {\n        name: 'InLinear_B_Ideograms',\n        astral: '\\uD800[\\uDC80-\\uDCFF]'\n    }, {\n        name: 'InLinear_B_Syllabary',\n        astral: '\\uD800[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InLisu',\n        bmp: '\\uA4D0-\\uA4FF'\n    }, {\n        name: 'InLow_Surrogates',\n        bmp: '\\uDC00-\\uDFFF'\n    }, {\n        name: 'InLycian',\n        astral: '\\uD800[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'InLydian',\n        astral: '\\uD802[\\uDD20-\\uDD3F]'\n    }, {\n        name: 'InMahajani',\n        astral: '\\uD804[\\uDD50-\\uDD7F]'\n    }, {\n        name: 'InMahjong_Tiles',\n        astral: '\\uD83C[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InMalayalam',\n        bmp: '\\u0D00-\\u0D7F'\n    }, {\n        name: 'InMandaic',\n        bmp: '\\u0840-\\u085F'\n    }, {\n        name: 'InManichaean',\n        astral: '\\uD802[\\uDEC0-\\uDEFF]'\n    }, {\n        name: 'InMarchen',\n        astral: '\\uD807[\\uDC70-\\uDCBF]'\n    }, {\n        name: 'InMathematical_Alphanumeric_Symbols',\n        astral: '\\uD835[\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InMathematical_Operators',\n        bmp: '\\u2200-\\u22FF'\n    }, {\n        name: 'InMeetei_Mayek',\n        bmp: '\\uABC0-\\uABFF'\n    }, {\n        name: 'InMeetei_Mayek_Extensions',\n        bmp: '\\uAAE0-\\uAAFF'\n    }, {\n        name: 'InMende_Kikakui',\n        astral: '\\uD83A[\\uDC00-\\uDCDF]'\n    }, {\n        name: 'InMeroitic_Cursive',\n        astral: '\\uD802[\\uDDA0-\\uDDFF]'\n    }, {\n        name: 'InMeroitic_Hieroglyphs',\n        astral: '\\uD802[\\uDD80-\\uDD9F]'\n    }, {\n        name: 'InMiao',\n        astral: '\\uD81B[\\uDF00-\\uDF9F]'\n    }, {\n        name: 'InMiscellaneous_Mathematical_Symbols_A',\n        bmp: '\\u27C0-\\u27EF'\n    }, {\n        name: 'InMiscellaneous_Mathematical_Symbols_B',\n        bmp: '\\u2980-\\u29FF'\n    }, {\n        name: 'InMiscellaneous_Symbols',\n        bmp: '\\u2600-\\u26FF'\n    }, {\n        name: 'InMiscellaneous_Symbols_and_Arrows',\n        bmp: '\\u2B00-\\u2BFF'\n    }, {\n        name: 'InMiscellaneous_Symbols_and_Pictographs',\n        astral: '\\uD83C[\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDDFF]'\n    }, {\n        name: 'InMiscellaneous_Technical',\n        bmp: '\\u2300-\\u23FF'\n    }, {\n        name: 'InModi',\n        astral: '\\uD805[\\uDE00-\\uDE5F]'\n    }, {\n        name: 'InModifier_Tone_Letters',\n        bmp: '\\uA700-\\uA71F'\n    }, {\n        name: 'InMongolian',\n        bmp: '\\u1800-\\u18AF'\n    }, {\n        name: 'InMongolian_Supplement',\n        astral: '\\uD805[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InMro',\n        astral: '\\uD81A[\\uDE40-\\uDE6F]'\n    }, {\n        name: 'InMultani',\n        astral: '\\uD804[\\uDE80-\\uDEAF]'\n    }, {\n        name: 'InMusical_Symbols',\n        astral: '\\uD834[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InMyanmar',\n        bmp: '\\u1000-\\u109F'\n    }, {\n        name: 'InMyanmar_Extended_A',\n        bmp: '\\uAA60-\\uAA7F'\n    }, {\n        name: 'InMyanmar_Extended_B',\n        bmp: '\\uA9E0-\\uA9FF'\n    }, {\n        name: 'InNKo',\n        bmp: '\\u07C0-\\u07FF'\n    }, {\n        name: 'InNabataean',\n        astral: '\\uD802[\\uDC80-\\uDCAF]'\n    }, {\n        name: 'InNew_Tai_Lue',\n        bmp: '\\u1980-\\u19DF'\n    }, {\n        name: 'InNewa',\n        astral: '\\uD805[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InNumber_Forms',\n        bmp: '\\u2150-\\u218F'\n    }, {\n        name: 'InOgham',\n        bmp: '\\u1680-\\u169F'\n    }, {\n        name: 'InOl_Chiki',\n        bmp: '\\u1C50-\\u1C7F'\n    }, {\n        name: 'InOld_Hungarian',\n        astral: '\\uD803[\\uDC80-\\uDCFF]'\n    }, {\n        name: 'InOld_Italic',\n        astral: '\\uD800[\\uDF00-\\uDF2F]'\n    }, {\n        name: 'InOld_North_Arabian',\n        astral: '\\uD802[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'InOld_Permic',\n        astral: '\\uD800[\\uDF50-\\uDF7F]'\n    }, {\n        name: 'InOld_Persian',\n        astral: '\\uD800[\\uDFA0-\\uDFDF]'\n    }, {\n        name: 'InOld_South_Arabian',\n        astral: '\\uD802[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InOld_Turkic',\n        astral: '\\uD803[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'InOptical_Character_Recognition',\n        bmp: '\\u2440-\\u245F'\n    }, {\n        name: 'InOriya',\n        bmp: '\\u0B00-\\u0B7F'\n    }, {\n        name: 'InOrnamental_Dingbats',\n        astral: '\\uD83D[\\uDE50-\\uDE7F]'\n    }, {\n        name: 'InOsage',\n        astral: '\\uD801[\\uDCB0-\\uDCFF]'\n    }, {\n        name: 'InOsmanya',\n        astral: '\\uD801[\\uDC80-\\uDCAF]'\n    }, {\n        name: 'InPahawh_Hmong',\n        astral: '\\uD81A[\\uDF00-\\uDF8F]'\n    }, {\n        name: 'InPalmyrene',\n        astral: '\\uD802[\\uDC60-\\uDC7F]'\n    }, {\n        name: 'InPau_Cin_Hau',\n        astral: '\\uD806[\\uDEC0-\\uDEFF]'\n    }, {\n        name: 'InPhags_pa',\n        bmp: '\\uA840-\\uA87F'\n    }, {\n        name: 'InPhaistos_Disc',\n        astral: '\\uD800[\\uDDD0-\\uDDFF]'\n    }, {\n        name: 'InPhoenician',\n        astral: '\\uD802[\\uDD00-\\uDD1F]'\n    }, {\n        name: 'InPhonetic_Extensions',\n        bmp: '\\u1D00-\\u1D7F'\n    }, {\n        name: 'InPhonetic_Extensions_Supplement',\n        bmp: '\\u1D80-\\u1DBF'\n    }, {\n        name: 'InPlaying_Cards',\n        astral: '\\uD83C[\\uDCA0-\\uDCFF]'\n    }, {\n        name: 'InPrivate_Use_Area',\n        bmp: '\\uE000-\\uF8FF'\n    }, {\n        name: 'InPsalter_Pahlavi',\n        astral: '\\uD802[\\uDF80-\\uDFAF]'\n    }, {\n        name: 'InRejang',\n        bmp: '\\uA930-\\uA95F'\n    }, {\n        name: 'InRumi_Numeral_Symbols',\n        astral: '\\uD803[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InRunic',\n        bmp: '\\u16A0-\\u16FF'\n    }, {\n        name: 'InSamaritan',\n        bmp: '\\u0800-\\u083F'\n    }, {\n        name: 'InSaurashtra',\n        bmp: '\\uA880-\\uA8DF'\n    }, {\n        name: 'InSharada',\n        astral: '\\uD804[\\uDD80-\\uDDDF]'\n    }, {\n        name: 'InShavian',\n        astral: '\\uD801[\\uDC50-\\uDC7F]'\n    }, {\n        name: 'InShorthand_Format_Controls',\n        astral: '\\uD82F[\\uDCA0-\\uDCAF]'\n    }, {\n        name: 'InSiddham',\n        astral: '\\uD805[\\uDD80-\\uDDFF]'\n    }, {\n        name: 'InSinhala',\n        bmp: '\\u0D80-\\u0DFF'\n    }, {\n        name: 'InSinhala_Archaic_Numbers',\n        astral: '\\uD804[\\uDDE0-\\uDDFF]'\n    }, {\n        name: 'InSmall_Form_Variants',\n        bmp: '\\uFE50-\\uFE6F'\n    }, {\n        name: 'InSora_Sompeng',\n        astral: '\\uD804[\\uDCD0-\\uDCFF]'\n    }, {\n        name: 'InSpacing_Modifier_Letters',\n        bmp: '\\u02B0-\\u02FF'\n    }, {\n        name: 'InSpecials',\n        bmp: '\\uFFF0-\\uFFFF'\n    }, {\n        name: 'InSundanese',\n        bmp: '\\u1B80-\\u1BBF'\n    }, {\n        name: 'InSundanese_Supplement',\n        bmp: '\\u1CC0-\\u1CCF'\n    }, {\n        name: 'InSuperscripts_and_Subscripts',\n        bmp: '\\u2070-\\u209F'\n    }, {\n        name: 'InSupplemental_Arrows_A',\n        bmp: '\\u27F0-\\u27FF'\n    }, {\n        name: 'InSupplemental_Arrows_B',\n        bmp: '\\u2900-\\u297F'\n    }, {\n        name: 'InSupplemental_Arrows_C',\n        astral: '\\uD83E[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InSupplemental_Mathematical_Operators',\n        bmp: '\\u2A00-\\u2AFF'\n    }, {\n        name: 'InSupplemental_Punctuation',\n        bmp: '\\u2E00-\\u2E7F'\n    }, {\n        name: 'InSupplemental_Symbols_and_Pictographs',\n        astral: '\\uD83E[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InSupplementary_Private_Use_Area_A',\n        astral: '[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InSupplementary_Private_Use_Area_B',\n        astral: '[\\uDBC0-\\uDBFF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InSutton_SignWriting',\n        astral: '\\uD836[\\uDC00-\\uDEAF]'\n    }, {\n        name: 'InSyloti_Nagri',\n        bmp: '\\uA800-\\uA82F'\n    }, {\n        name: 'InSyriac',\n        bmp: '\\u0700-\\u074F'\n    }, {\n        name: 'InTagalog',\n        bmp: '\\u1700-\\u171F'\n    }, {\n        name: 'InTagbanwa',\n        bmp: '\\u1760-\\u177F'\n    }, {\n        name: 'InTags',\n        astral: '\\uDB40[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InTai_Le',\n        bmp: '\\u1950-\\u197F'\n    }, {\n        name: 'InTai_Tham',\n        bmp: '\\u1A20-\\u1AAF'\n    }, {\n        name: 'InTai_Viet',\n        bmp: '\\uAA80-\\uAADF'\n    }, {\n        name: 'InTai_Xuan_Jing_Symbols',\n        astral: '\\uD834[\\uDF00-\\uDF5F]'\n    }, {\n        name: 'InTakri',\n        astral: '\\uD805[\\uDE80-\\uDECF]'\n    }, {\n        name: 'InTamil',\n        bmp: '\\u0B80-\\u0BFF'\n    }, {\n        name: 'InTangut',\n        astral: '[\\uD81C-\\uD821][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InTangut_Components',\n        astral: '\\uD822[\\uDC00-\\uDEFF]'\n    }, {\n        name: 'InTelugu',\n        bmp: '\\u0C00-\\u0C7F'\n    }, {\n        name: 'InThaana',\n        bmp: '\\u0780-\\u07BF'\n    }, {\n        name: 'InThai',\n        bmp: '\\u0E00-\\u0E7F'\n    }, {\n        name: 'InTibetan',\n        bmp: '\\u0F00-\\u0FFF'\n    }, {\n        name: 'InTifinagh',\n        bmp: '\\u2D30-\\u2D7F'\n    }, {\n        name: 'InTirhuta',\n        astral: '\\uD805[\\uDC80-\\uDCDF]'\n    }, {\n        name: 'InTransport_and_Map_Symbols',\n        astral: '\\uD83D[\\uDE80-\\uDEFF]'\n    }, {\n        name: 'InUgaritic',\n        astral: '\\uD800[\\uDF80-\\uDF9F]'\n    }, {\n        name: 'InUnified_Canadian_Aboriginal_Syllabics',\n        bmp: '\\u1400-\\u167F'\n    }, {\n        name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended',\n        bmp: '\\u18B0-\\u18FF'\n    }, {\n        name: 'InVai',\n        bmp: '\\uA500-\\uA63F'\n    }, {\n        name: 'InVariation_Selectors',\n        bmp: '\\uFE00-\\uFE0F'\n    }, {\n        name: 'InVariation_Selectors_Supplement',\n        astral: '\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'InVedic_Extensions',\n        bmp: '\\u1CD0-\\u1CFF'\n    }, {\n        name: 'InVertical_Forms',\n        bmp: '\\uFE10-\\uFE1F'\n    }, {\n        name: 'InWarang_Citi',\n        astral: '\\uD806[\\uDCA0-\\uDCFF]'\n    }, {\n        name: 'InYi_Radicals',\n        bmp: '\\uA490-\\uA4CF'\n    }, {\n        name: 'InYi_Syllables',\n        bmp: '\\uA000-\\uA48F'\n    }, {\n        name: 'InYijing_Hexagram_Symbols',\n        bmp: '\\u4DC0-\\u4DFF'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"nPWq\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Categories 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for Unicode's general categories. E.g., `\\p{Lu}` or `\\p{Uppercase Letter}`. See\n     * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token\n     * names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'C',\n        alias: 'Other',\n        isBmpLast: true,\n        bmp: '\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u08E2\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180E\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',\n        astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCBD\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA0-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDD73-\\uDD7A\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]'\n    }, {\n        name: 'Cc',\n        alias: 'Control',\n        bmp: '\\0-\\x1F\\x7F-\\x9F'\n    }, {\n        name: 'Cf',\n        alias: 'Format',\n        bmp: '\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB',\n        astral: '\\uD804\\uDCBD|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n    }, {\n        name: 'Cn',\n        alias: 'Unassigned',\n        bmp: '\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u05FF\\u061D\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF',\n        astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n    }, {\n        name: 'Co',\n        alias: 'Private_Use',\n        bmp: '\\uE000-\\uF8FF',\n        astral: '[\\uDB80-\\uDBBE\\uDBC0-\\uDBFE][\\uDC00-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDC00-\\uDFFD]'\n    }, {\n        name: 'Cs',\n        alias: 'Surrogate',\n        bmp: '\\uD800-\\uDFFF'\n    }, {\n        name: 'L',\n        alias: 'Letter',\n        bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Ll',\n        alias: 'Lowercase_Letter',\n        bmp: 'a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n        astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n    }, {\n        name: 'Lm',\n        alias: 'Modifier_Letter',\n        bmp: '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E\\uFF9F',\n        astral: '\\uD81A[\\uDF40-\\uDF43]|\\uD81B[\\uDF93-\\uDF9F\\uDFE0]'\n    }, {\n        name: 'Lo',\n        alias: 'Other_Letter',\n        bmp: '\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC50-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Lt',\n        alias: 'Titlecase_Letter',\n        bmp: '\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC'\n    }, {\n        name: 'Lu',\n        alias: 'Uppercase_Letter',\n        bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n        astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]'\n    }, {\n        name: 'M',\n        alias: 'Mark',\n        bmp: '\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n        astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDDCA-\\uDDCC\\uDE2C-\\uDE37\\uDE3E\\uDEDF-\\uDEEA\\uDF00-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC35-\\uDC46\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDDDC\\uDDDD\\uDE30-\\uDE40\\uDEAB-\\uDEB7\\uDF1D-\\uDF2B]|\\uD807[\\uDC2F-\\uDC36\\uDC38-\\uDC3F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'Mc',\n        alias: 'Spacing_Mark',\n        bmp: '\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\u1CF3\\u302E\\u302F\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC',\n        astral: '\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3E\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB0-\\uDCB2\\uDCB9\\uDCBB-\\uDCBE\\uDCC1\\uDDAF-\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF20\\uDF21\\uDF26]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4]|\\uD81B[\\uDF51-\\uDF7E]|\\uD834[\\uDD65\\uDD66\\uDD6D-\\uDD72]'\n    }, {\n        name: 'Me',\n        alias: 'Enclosing_Mark',\n        bmp: '\\u0488\\u0489\\u1ABE\\u20DD-\\u20E0\\u20E2-\\u20E4\\uA670-\\uA672'\n    }, {\n        name: 'Mn',\n        alias: 'Nonspacing_Mark',\n        bmp: '\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D01\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n        astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDCA-\\uDDCC\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3C\\uDF40\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDCB3-\\uDCB8\\uDCBA\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'N',\n        alias: 'Number',\n        bmp: '0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n        astral: '\\uD800[\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD801[\\uDCA0-\\uDCA9]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDDE1-\\uDDF4\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF3B]|\\uD806[\\uDCE0-\\uDCF2]|\\uD807[\\uDC50-\\uDC6C]|\\uD809[\\uDC00-\\uDC6E]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDCC7-\\uDCCF\\uDD50-\\uDD59]|\\uD83C[\\uDD00-\\uDD0C]'\n    }, {\n        name: 'Nd',\n        alias: 'Decimal_Number',\n        bmp: '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n        astral: '\\uD801[\\uDCA0-\\uDCA9]|\\uD804[\\uDC66-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF39]|\\uD806[\\uDCE0-\\uDCE9]|\\uD807[\\uDC50-\\uDC59]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDD50-\\uDD59]'\n    }, {\n        name: 'Nl',\n        alias: 'Letter_Number',\n        bmp: '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',\n        astral: '\\uD800[\\uDD40-\\uDD74\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD809[\\uDC00-\\uDC6E]'\n    }, {\n        name: 'No',\n        alias: 'Other_Number',\n        bmp: '\\xB2\\xB3\\xB9\\xBC-\\xBE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',\n        astral: '\\uD800[\\uDD07-\\uDD33\\uDD75-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC65\\uDDE1-\\uDDF4]|\\uD805[\\uDF3A\\uDF3B]|\\uD806[\\uDCEA-\\uDCF2]|\\uD807[\\uDC5A-\\uDC6C]|\\uD81A[\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD83A[\\uDCC7-\\uDCCF]|\\uD83C[\\uDD00-\\uDD0C]'\n    }, {\n        name: 'P',\n        alias: 'Punctuation',\n        bmp: '\\x21-\\x23\\x25-\\\\x2A\\x2C-\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5B-\\\\x5D\\x5F\\\\x7B\\x7D\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E44\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Pc',\n        alias: 'Connector_Punctuation',\n        bmp: '\\x5F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F'\n    }, {\n        name: 'Pd',\n        alias: 'Dash_Punctuation',\n        bmp: '\\\\x2D\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D'\n    }, {\n        name: 'Pe',\n        alias: 'Close_Punctuation',\n        bmp: '\\\\x29\\\\x5D\\x7D\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63'\n    }, {\n        name: 'Pf',\n        alias: 'Final_Punctuation',\n        bmp: '\\xBB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21'\n    }, {\n        name: 'Pi',\n        alias: 'Initial_Punctuation',\n        bmp: '\\xAB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20'\n    }, {\n        name: 'Po',\n        alias: 'Other_Punctuation',\n        bmp: '\\x21-\\x23\\x25-\\x27\\\\x2A\\x2C\\\\x2E\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5C\\xA1\\xA7\\xB6\\xB7\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166D\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43\\u2E44\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Ps',\n        alias: 'Open_Punctuation',\n        bmp: '\\\\x28\\\\x5B\\\\x7B\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62'\n    }, {\n        name: 'S',\n        alias: 'Symbol',\n        bmp: '\\\\x24\\\\x2B\\x3C-\\x3E\\\\x5E\\x60\\\\x7C\\x7E\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20BE\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uFB29\\uFBB2-\\uFBC1\\uFDFC\\uFDFD\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',\n        astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83B[\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n    }, {\n        name: 'Sc',\n        alias: 'Currency_Symbol',\n        bmp: '\\\\x24\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BE\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6'\n    }, {\n        name: 'Sk',\n        alias: 'Modifier_Symbol',\n        bmp: '\\\\x5E\\x60\\xA8\\xAF\\xB4\\xB8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uFBB2-\\uFBC1\\uFF3E\\uFF40\\uFFE3',\n        astral: '\\uD83C[\\uDFFB-\\uDFFF]'\n    }, {\n        name: 'Sm',\n        alias: 'Math_Symbol',\n        bmp: '\\\\x2B\\x3C-\\x3E\\\\x7C\\x7E\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',\n        astral: '\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD83B[\\uDEF0\\uDEF1]'\n    }, {\n        name: 'So',\n        alias: 'Other_Symbol',\n        bmp: '\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',\n        astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFA]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n    }, {\n        name: 'Z',\n        alias: 'Separator',\n        bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n    }, {\n        name: 'Zl',\n        alias: 'Line_Separator',\n        bmp: '\\u2028'\n    }, {\n        name: 'Zp',\n        alias: 'Paragraph_Separator',\n        bmp: '\\u2029'\n    }, {\n        name: 'Zs',\n        alias: 'Space_Separator',\n        bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"sqgh\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Properties 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2012-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See\n     * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from\n     * UAX #44 <http://unicode.org/reports/tr44/>:\n     *\n     * - Alphabetic\n     *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +\n     *   Lo + Nl + Other_Alphabetic.\n     *\n     * - Default_Ignorable_Code_Point\n     *   For programmatic determination of default ignorable code points. New characters that should\n     *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,\n     *   permitting programs to correctly handle the default rendering of such characters when not\n     *   otherwise supported.\n     *\n     * - Lowercase\n     *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.\n     *\n     * - Noncharacter_Code_Point\n     *   Code points permanently reserved for internal use.\n     *\n     * - Uppercase\n     *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.\n     *\n     * - White_Space\n     *   Spaces, separator characters and other control characters which should be treated by\n     *   programming languages as \"white space\" for the purpose of parsing elements.\n     *\n     * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS\n     * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are\n     * included in XRegExp's Unicode Categories and Unicode Scripts addons.\n     *\n     * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');\n    }\n\n    var unicodeData = [{\n        name: 'ASCII',\n        bmp: '\\0-\\x7F'\n    }, {\n        name: 'Alphabetic',\n        bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0345\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05B0-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0657\\u0659-\\u065F\\u066E-\\u06D3\\u06D5-\\u06DC\\u06E1-\\u06E8\\u06ED-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710-\\u073F\\u074D-\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0817\\u081A-\\u082C\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08DF\\u08E3-\\u08E9\\u08F0-\\u093B\\u093D-\\u094C\\u094E-\\u0950\\u0955-\\u0963\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD-\\u09C4\\u09C7\\u09C8\\u09CB\\u09CC\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09F0\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A70-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB\\u0ACC\\u0AD0\\u0AE0-\\u0AE3\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D-\\u0B44\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD0\\u0BD7\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4C\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCC\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E46\\u0E4D\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ECD\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F81\\u0F88-\\u0F97\\u0F99-\\u0FBC\\u1000-\\u1036\\u1038\\u103B-\\u103F\\u1050-\\u1062\\u1065-\\u1068\\u106E-\\u1086\\u108E\\u109C\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1713\\u1720-\\u1733\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17B3\\u17B6-\\u17C8\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u1938\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A61-\\u1A74\\u1AA7\\u1B00-\\u1B33\\u1B35-\\u1B43\\u1B45-\\u1B4B\\u1B80-\\u1BA9\\u1BAC-\\u1BAF\\u1BBA-\\u1BE5\\u1BE7-\\u1BF1\\u1C00-\\u1C35\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1DE7-\\u1DF4\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u24B6-\\u24E9\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA674-\\uA67B\\uA67F-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA827\\uA840-\\uA873\\uA880-\\uA8C3\\uA8C5\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA92A\\uA930-\\uA952\\uA960-\\uA97C\\uA980-\\uA9B2\\uA9B4-\\uA9BF\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAABE\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF5\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC45\\uDC82-\\uDCB8\\uDCD0-\\uDCE8\\uDD00-\\uDD32\\uDD50-\\uDD72\\uDD76\\uDD80-\\uDDBF\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE34\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEE8\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D-\\uDF44\\uDF47\\uDF48\\uDF4B\\uDF4C\\uDF50\\uDF57\\uDF5D-\\uDF63]|\\uD805[\\uDC00-\\uDC41\\uDC43-\\uDC45\\uDC47-\\uDC4A\\uDC80-\\uDCC1\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDB5\\uDDB8-\\uDDBE\\uDDD8-\\uDDDD\\uDE00-\\uDE3E\\uDE40\\uDE44\\uDE80-\\uDEB5\\uDF00-\\uDF19\\uDF1D-\\uDF2A]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC3E\\uDC40\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9E]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD47]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Any',\n        isBmpLast: true,\n        bmp: '\\0-\\uFFFF',\n        astral: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'Default_Ignorable_Code_Point',\n        bmp: '\\xAD\\u034F\\u061C\\u115F\\u1160\\u17B4\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8',\n        astral: '\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|[\\uDB40-\\uDB43][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'Lowercase',\n        bmp: 'a-z\\xAA\\xB5\\xBA\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02B8\\u02C0\\u02C1\\u02E0-\\u02E4\\u0345\\u0371\\u0373\\u0377\\u037A-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1DBF\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u2090-\\u209C\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2170-\\u217F\\u2184\\u24D0-\\u24E9\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7D\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B-\\uA69D\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7F8-\\uA7FA\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n        astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n    }, {\n        name: 'Noncharacter_Code_Point',\n        bmp: '\\uFDD0-\\uFDEF\\uFFFE\\uFFFF',\n        astral: '[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n    }, {\n        name: 'Uppercase',\n        bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n        astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]'\n    }, {\n        name: 'White_Space',\n        bmp: '\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n    }];\n\n    // Add non-generated data\n    unicodeData.push({\n        name: 'Assigned',\n        // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode\n        // Categories addon is required to use this property\n        inverseOf: 'Cn'\n    });\n\n    XRegExp.addUnicodeData(unicodeData);\n};\n\nmodule.exports = exports['default'];\n},{}],\"RtWW\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Scripts 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for all Unicode scripts. E.g., `\\p{Latin}`. Token names are case insensitive,\n     * and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'Adlam',\n        astral: '\\uD83A[\\uDD00-\\uDD4A\\uDD50-\\uDD59\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Ahom',\n        astral: '\\uD805[\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF3F]'\n    }, {\n        name: 'Anatolian_Hieroglyphs',\n        astral: '\\uD811[\\uDC00-\\uDE46]'\n    }, {\n        name: 'Arabic',\n        bmp: '\\u0600-\\u0604\\u0606-\\u060B\\u060D-\\u061A\\u061E\\u0620-\\u063F\\u0641-\\u064A\\u0656-\\u066F\\u0671-\\u06DC\\u06DE-\\u06FF\\u0750-\\u077F\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u08FF\\uFB50-\\uFBC1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFD\\uFE70-\\uFE74\\uFE76-\\uFEFC',\n        astral: '\\uD803[\\uDE60-\\uDE7E]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB\\uDEF0\\uDEF1]'\n    }, {\n        name: 'Armenian',\n        bmp: '\\u0531-\\u0556\\u0559-\\u055F\\u0561-\\u0587\\u058A\\u058D-\\u058F\\uFB13-\\uFB17'\n    }, {\n        name: 'Avestan',\n        astral: '\\uD802[\\uDF00-\\uDF35\\uDF39-\\uDF3F]'\n    }, {\n        name: 'Balinese',\n        bmp: '\\u1B00-\\u1B4B\\u1B50-\\u1B7C'\n    }, {\n        name: 'Bamum',\n        bmp: '\\uA6A0-\\uA6F7',\n        astral: '\\uD81A[\\uDC00-\\uDE38]'\n    }, {\n        name: 'Bassa_Vah',\n        astral: '\\uD81A[\\uDED0-\\uDEED\\uDEF0-\\uDEF5]'\n    }, {\n        name: 'Batak',\n        bmp: '\\u1BC0-\\u1BF3\\u1BFC-\\u1BFF'\n    }, {\n        name: 'Bengali',\n        bmp: '\\u0980-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FB'\n    }, {\n        name: 'Bhaiksuki',\n        astral: '\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC45\\uDC50-\\uDC6C]'\n    }, {\n        name: 'Bopomofo',\n        bmp: '\\u02EA\\u02EB\\u3105-\\u312D\\u31A0-\\u31BA'\n    }, {\n        name: 'Brahmi',\n        astral: '\\uD804[\\uDC00-\\uDC4D\\uDC52-\\uDC6F\\uDC7F]'\n    }, {\n        name: 'Braille',\n        bmp: '\\u2800-\\u28FF'\n    }, {\n        name: 'Buginese',\n        bmp: '\\u1A00-\\u1A1B\\u1A1E\\u1A1F'\n    }, {\n        name: 'Buhid',\n        bmp: '\\u1740-\\u1753'\n    }, {\n        name: 'Canadian_Aboriginal',\n        bmp: '\\u1400-\\u167F\\u18B0-\\u18F5'\n    }, {\n        name: 'Carian',\n        astral: '\\uD800[\\uDEA0-\\uDED0]'\n    }, {\n        name: 'Caucasian_Albanian',\n        astral: '\\uD801[\\uDD30-\\uDD63\\uDD6F]'\n    }, {\n        name: 'Chakma',\n        astral: '\\uD804[\\uDD00-\\uDD34\\uDD36-\\uDD43]'\n    }, {\n        name: 'Cham',\n        bmp: '\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA5C-\\uAA5F'\n    }, {\n        name: 'Cherokee',\n        bmp: '\\u13A0-\\u13F5\\u13F8-\\u13FD\\uAB70-\\uABBF'\n    }, {\n        name: 'Common',\n        bmp: '\\0-\\x40\\\\x5B-\\x60\\\\x7B-\\xA9\\xAB-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02B9-\\u02DF\\u02E5-\\u02E9\\u02EC-\\u02FF\\u0374\\u037E\\u0385\\u0387\\u0589\\u0605\\u060C\\u061B\\u061C\\u061F\\u0640\\u06DD\\u08E2\\u0964\\u0965\\u0E3F\\u0FD5-\\u0FD8\\u10FB\\u16EB-\\u16ED\\u1735\\u1736\\u1802\\u1803\\u1805\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u2000-\\u200B\\u200E-\\u2064\\u2066-\\u2070\\u2074-\\u207E\\u2080-\\u208E\\u20A0-\\u20BE\\u2100-\\u2125\\u2127-\\u2129\\u212C-\\u2131\\u2133-\\u214D\\u214F-\\u215F\\u2189-\\u218B\\u2190-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u2460-\\u27FF\\u2900-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2E00-\\u2E44\\u2FF0-\\u2FFB\\u3000-\\u3004\\u3006\\u3008-\\u3020\\u3030-\\u3037\\u303C-\\u303F\\u309B\\u309C\\u30A0\\u30FB\\u30FC\\u3190-\\u319F\\u31C0-\\u31E3\\u3220-\\u325F\\u327F-\\u32CF\\u3358-\\u33FF\\u4DC0-\\u4DFF\\uA700-\\uA721\\uA788-\\uA78A\\uA830-\\uA839\\uA92E\\uA9CF\\uAB5B\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFEFF\\uFF01-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFF70\\uFF9E\\uFF9F\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFF9-\\uFFFD',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDD07-\\uDD33\\uDD37-\\uDD3F\\uDD90-\\uDD9B\\uDDD0-\\uDDFC\\uDEE1-\\uDEFB]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD66\\uDD6A-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDF00-\\uDF56\\uDF60-\\uDF71]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD00-\\uDD0C\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n    }, {\n        name: 'Coptic',\n        bmp: '\\u03E2-\\u03EF\\u2C80-\\u2CF3\\u2CF9-\\u2CFF'\n    }, {\n        name: 'Cuneiform',\n        astral: '\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC70-\\uDC74\\uDC80-\\uDD43]'\n    }, {\n        name: 'Cypriot',\n        astral: '\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F]'\n    }, {\n        name: 'Cyrillic',\n        bmp: '\\u0400-\\u0484\\u0487-\\u052F\\u1C80-\\u1C88\\u1D2B\\u1D78\\u2DE0-\\u2DFF\\uA640-\\uA69F\\uFE2E\\uFE2F'\n    }, {\n        name: 'Deseret',\n        astral: '\\uD801[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'Devanagari',\n        bmp: '\\u0900-\\u0950\\u0953-\\u0963\\u0966-\\u097F\\uA8E0-\\uA8FD'\n    }, {\n        name: 'Duployan',\n        astral: '\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9C-\\uDC9F]'\n    }, {\n        name: 'Egyptian_Hieroglyphs',\n        astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]'\n    }, {\n        name: 'Elbasan',\n        astral: '\\uD801[\\uDD00-\\uDD27]'\n    }, {\n        name: 'Ethiopic',\n        bmp: '\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u137C\\u1380-\\u1399\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E'\n    }, {\n        name: 'Georgian',\n        bmp: '\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u10FF\\u2D00-\\u2D25\\u2D27\\u2D2D'\n    }, {\n        name: 'Glagolitic',\n        bmp: '\\u2C00-\\u2C2E\\u2C30-\\u2C5E',\n        astral: '\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]'\n    }, {\n        name: 'Gothic',\n        astral: '\\uD800[\\uDF30-\\uDF4A]'\n    }, {\n        name: 'Grantha',\n        astral: '\\uD804[\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]'\n    }, {\n        name: 'Greek',\n        bmp: '\\u0370-\\u0373\\u0375-\\u0377\\u037A-\\u037D\\u037F\\u0384\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03E1\\u03F0-\\u03FF\\u1D26-\\u1D2A\\u1D5D-\\u1D61\\u1D66-\\u1D6A\\u1DBF\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FC4\\u1FC6-\\u1FD3\\u1FD6-\\u1FDB\\u1FDD-\\u1FEF\\u1FF2-\\u1FF4\\u1FF6-\\u1FFE\\u2126\\uAB65',\n        astral: '\\uD800[\\uDD40-\\uDD8E\\uDDA0]|\\uD834[\\uDE00-\\uDE45]'\n    }, {\n        name: 'Gujarati',\n        bmp: '\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AF1\\u0AF9'\n    }, {\n        name: 'Gurmukhi',\n        bmp: '\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75'\n    }, {\n        name: 'Han',\n        bmp: '\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uF900-\\uFA6D\\uFA70-\\uFAD9',\n        astral: '[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Hangul',\n        bmp: '\\u1100-\\u11FF\\u302E\\u302F\\u3131-\\u318E\\u3200-\\u321E\\u3260-\\u327E\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n    }, {\n        name: 'Hanunoo',\n        bmp: '\\u1720-\\u1734'\n    }, {\n        name: 'Hatran',\n        astral: '\\uD802[\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDCFF]'\n    }, {\n        name: 'Hebrew',\n        bmp: '\\u0591-\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F4\\uFB1D-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFB4F'\n    }, {\n        name: 'Hiragana',\n        bmp: '\\u3041-\\u3096\\u309D-\\u309F',\n        astral: '\\uD82C\\uDC01|\\uD83C\\uDE00'\n    }, {\n        name: 'Imperial_Aramaic',\n        astral: '\\uD802[\\uDC40-\\uDC55\\uDC57-\\uDC5F]'\n    }, {\n        name: 'Inherited',\n        bmp: '\\u0300-\\u036F\\u0485\\u0486\\u064B-\\u0655\\u0670\\u0951\\u0952\\u1AB0-\\u1ABE\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u200C\\u200D\\u20D0-\\u20F0\\u302A-\\u302D\\u3099\\u309A\\uFE00-\\uFE0F\\uFE20-\\uFE2D',\n        astral: '\\uD800[\\uDDFD\\uDEE0]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'Inscriptional_Pahlavi',\n        astral: '\\uD802[\\uDF60-\\uDF72\\uDF78-\\uDF7F]'\n    }, {\n        name: 'Inscriptional_Parthian',\n        astral: '\\uD802[\\uDF40-\\uDF55\\uDF58-\\uDF5F]'\n    }, {\n        name: 'Javanese',\n        bmp: '\\uA980-\\uA9CD\\uA9D0-\\uA9D9\\uA9DE\\uA9DF'\n    }, {\n        name: 'Kaithi',\n        astral: '\\uD804[\\uDC80-\\uDCC1]'\n    }, {\n        name: 'Kannada',\n        bmp: '\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2'\n    }, {\n        name: 'Katakana',\n        bmp: '\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D',\n        astral: '\\uD82C\\uDC00'\n    }, {\n        name: 'Kayah_Li',\n        bmp: '\\uA900-\\uA92D\\uA92F'\n    }, {\n        name: 'Kharoshthi',\n        astral: '\\uD802[\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F-\\uDE47\\uDE50-\\uDE58]'\n    }, {\n        name: 'Khmer',\n        bmp: '\\u1780-\\u17DD\\u17E0-\\u17E9\\u17F0-\\u17F9\\u19E0-\\u19FF'\n    }, {\n        name: 'Khojki',\n        astral: '\\uD804[\\uDE00-\\uDE11\\uDE13-\\uDE3E]'\n    }, {\n        name: 'Khudawadi',\n        astral: '\\uD804[\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9]'\n    }, {\n        name: 'Lao',\n        bmp: '\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF'\n    }, {\n        name: 'Latin',\n        bmp: 'A-Za-z\\xAA\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02B8\\u02E0-\\u02E4\\u1D00-\\u1D25\\u1D2C-\\u1D5C\\u1D62-\\u1D65\\u1D6B-\\u1D77\\u1D79-\\u1DBE\\u1E00-\\u1EFF\\u2071\\u207F\\u2090-\\u209C\\u212A\\u212B\\u2132\\u214E\\u2160-\\u2188\\u2C60-\\u2C7F\\uA722-\\uA787\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA7FF\\uAB30-\\uAB5A\\uAB5C-\\uAB64\\uFB00-\\uFB06\\uFF21-\\uFF3A\\uFF41-\\uFF5A'\n    }, {\n        name: 'Lepcha',\n        bmp: '\\u1C00-\\u1C37\\u1C3B-\\u1C49\\u1C4D-\\u1C4F'\n    }, {\n        name: 'Limbu',\n        bmp: '\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1940\\u1944-\\u194F'\n    }, {\n        name: 'Linear_A',\n        astral: '\\uD801[\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]'\n    }, {\n        name: 'Linear_B',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA]'\n    }, {\n        name: 'Lisu',\n        bmp: '\\uA4D0-\\uA4FF'\n    }, {\n        name: 'Lycian',\n        astral: '\\uD800[\\uDE80-\\uDE9C]'\n    }, {\n        name: 'Lydian',\n        astral: '\\uD802[\\uDD20-\\uDD39\\uDD3F]'\n    }, {\n        name: 'Mahajani',\n        astral: '\\uD804[\\uDD50-\\uDD76]'\n    }, {\n        name: 'Malayalam',\n        bmp: '\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4F\\u0D54-\\u0D63\\u0D66-\\u0D7F'\n    }, {\n        name: 'Mandaic',\n        bmp: '\\u0840-\\u085B\\u085E'\n    }, {\n        name: 'Manichaean',\n        astral: '\\uD802[\\uDEC0-\\uDEE6\\uDEEB-\\uDEF6]'\n    }, {\n        name: 'Marchen',\n        astral: '\\uD807[\\uDC70-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]'\n    }, {\n        name: 'Meetei_Mayek',\n        bmp: '\\uAAE0-\\uAAF6\\uABC0-\\uABED\\uABF0-\\uABF9'\n    }, {\n        name: 'Mende_Kikakui',\n        astral: '\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCD6]'\n    }, {\n        name: 'Meroitic_Cursive',\n        astral: '\\uD802[\\uDDA0-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDDFF]'\n    }, {\n        name: 'Meroitic_Hieroglyphs',\n        astral: '\\uD802[\\uDD80-\\uDD9F]'\n    }, {\n        name: 'Miao',\n        astral: '\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]'\n    }, {\n        name: 'Modi',\n        astral: '\\uD805[\\uDE00-\\uDE44\\uDE50-\\uDE59]'\n    }, {\n        name: 'Mongolian',\n        bmp: '\\u1800\\u1801\\u1804\\u1806-\\u180E\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA',\n        astral: '\\uD805[\\uDE60-\\uDE6C]'\n    }, {\n        name: 'Mro',\n        astral: '\\uD81A[\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE6E\\uDE6F]'\n    }, {\n        name: 'Multani',\n        astral: '\\uD804[\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA9]'\n    }, {\n        name: 'Myanmar',\n        bmp: '\\u1000-\\u109F\\uA9E0-\\uA9FE\\uAA60-\\uAA7F'\n    }, {\n        name: 'Nabataean',\n        astral: '\\uD802[\\uDC80-\\uDC9E\\uDCA7-\\uDCAF]'\n    }, {\n        name: 'New_Tai_Lue',\n        bmp: '\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u19DE\\u19DF'\n    }, {\n        name: 'Newa',\n        astral: '\\uD805[\\uDC00-\\uDC59\\uDC5B\\uDC5D]'\n    }, {\n        name: 'Nko',\n        bmp: '\\u07C0-\\u07FA'\n    }, {\n        name: 'Ogham',\n        bmp: '\\u1680-\\u169C'\n    }, {\n        name: 'Ol_Chiki',\n        bmp: '\\u1C50-\\u1C7F'\n    }, {\n        name: 'Old_Hungarian',\n        astral: '\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDCFF]'\n    }, {\n        name: 'Old_Italic',\n        astral: '\\uD800[\\uDF00-\\uDF23]'\n    }, {\n        name: 'Old_North_Arabian',\n        astral: '\\uD802[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'Old_Permic',\n        astral: '\\uD800[\\uDF50-\\uDF7A]'\n    }, {\n        name: 'Old_Persian',\n        astral: '\\uD800[\\uDFA0-\\uDFC3\\uDFC8-\\uDFD5]'\n    }, {\n        name: 'Old_South_Arabian',\n        astral: '\\uD802[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'Old_Turkic',\n        astral: '\\uD803[\\uDC00-\\uDC48]'\n    }, {\n        name: 'Oriya',\n        bmp: '\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B77'\n    }, {\n        name: 'Osage',\n        astral: '\\uD801[\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB]'\n    }, {\n        name: 'Osmanya',\n        astral: '\\uD801[\\uDC80-\\uDC9D\\uDCA0-\\uDCA9]'\n    }, {\n        name: 'Pahawh_Hmong',\n        astral: '\\uD81A[\\uDF00-\\uDF45\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]'\n    }, {\n        name: 'Palmyrene',\n        astral: '\\uD802[\\uDC60-\\uDC7F]'\n    }, {\n        name: 'Pau_Cin_Hau',\n        astral: '\\uD806[\\uDEC0-\\uDEF8]'\n    }, {\n        name: 'Phags_Pa',\n        bmp: '\\uA840-\\uA877'\n    }, {\n        name: 'Phoenician',\n        astral: '\\uD802[\\uDD00-\\uDD1B\\uDD1F]'\n    }, {\n        name: 'Psalter_Pahlavi',\n        astral: '\\uD802[\\uDF80-\\uDF91\\uDF99-\\uDF9C\\uDFA9-\\uDFAF]'\n    }, {\n        name: 'Rejang',\n        bmp: '\\uA930-\\uA953\\uA95F'\n    }, {\n        name: 'Runic',\n        bmp: '\\u16A0-\\u16EA\\u16EE-\\u16F8'\n    }, {\n        name: 'Samaritan',\n        bmp: '\\u0800-\\u082D\\u0830-\\u083E'\n    }, {\n        name: 'Saurashtra',\n        bmp: '\\uA880-\\uA8C5\\uA8CE-\\uA8D9'\n    }, {\n        name: 'Sharada',\n        astral: '\\uD804[\\uDD80-\\uDDCD\\uDDD0-\\uDDDF]'\n    }, {\n        name: 'Shavian',\n        astral: '\\uD801[\\uDC50-\\uDC7F]'\n    }, {\n        name: 'Siddham',\n        astral: '\\uD805[\\uDD80-\\uDDB5\\uDDB8-\\uDDDD]'\n    }, {\n        name: 'SignWriting',\n        astral: '\\uD836[\\uDC00-\\uDE8B\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]'\n    }, {\n        name: 'Sinhala',\n        bmp: '\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2-\\u0DF4',\n        astral: '\\uD804[\\uDDE1-\\uDDF4]'\n    }, {\n        name: 'Sora_Sompeng',\n        astral: '\\uD804[\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9]'\n    }, {\n        name: 'Sundanese',\n        bmp: '\\u1B80-\\u1BBF\\u1CC0-\\u1CC7'\n    }, {\n        name: 'Syloti_Nagri',\n        bmp: '\\uA800-\\uA82B'\n    }, {\n        name: 'Syriac',\n        bmp: '\\u0700-\\u070D\\u070F-\\u074A\\u074D-\\u074F'\n    }, {\n        name: 'Tagalog',\n        bmp: '\\u1700-\\u170C\\u170E-\\u1714'\n    }, {\n        name: 'Tagbanwa',\n        bmp: '\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773'\n    }, {\n        name: 'Tai_Le',\n        bmp: '\\u1950-\\u196D\\u1970-\\u1974'\n    }, {\n        name: 'Tai_Tham',\n        bmp: '\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA0-\\u1AAD'\n    }, {\n        name: 'Tai_Viet',\n        bmp: '\\uAA80-\\uAAC2\\uAADB-\\uAADF'\n    }, {\n        name: 'Takri',\n        astral: '\\uD805[\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]'\n    }, {\n        name: 'Tamil',\n        bmp: '\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BFA'\n    }, {\n        name: 'Tangut',\n        astral: '\\uD81B\\uDFE0|[\\uD81C-\\uD820][\\uDC00-\\uDFFF]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]'\n    }, {\n        name: 'Telugu',\n        bmp: '\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C78-\\u0C7F'\n    }, {\n        name: 'Thaana',\n        bmp: '\\u0780-\\u07B1'\n    }, {\n        name: 'Thai',\n        bmp: '\\u0E01-\\u0E3A\\u0E40-\\u0E5B'\n    }, {\n        name: 'Tibetan',\n        bmp: '\\u0F00-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F97\\u0F99-\\u0FBC\\u0FBE-\\u0FCC\\u0FCE-\\u0FD4\\u0FD9\\u0FDA'\n    }, {\n        name: 'Tifinagh',\n        bmp: '\\u2D30-\\u2D67\\u2D6F\\u2D70\\u2D7F'\n    }, {\n        name: 'Tirhuta',\n        astral: '\\uD805[\\uDC80-\\uDCC7\\uDCD0-\\uDCD9]'\n    }, {\n        name: 'Ugaritic',\n        astral: '\\uD800[\\uDF80-\\uDF9D\\uDF9F]'\n    }, {\n        name: 'Vai',\n        bmp: '\\uA500-\\uA62B'\n    }, {\n        name: 'Warang_Citi',\n        astral: '\\uD806[\\uDCA0-\\uDCF2\\uDCFF]'\n    }, {\n        name: 'Yi',\n        bmp: '\\uA000-\\uA48C\\uA490-\\uA4C6'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"iuSj\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _xregexp = require('./xregexp');\n\nvar _xregexp2 = _interopRequireDefault(_xregexp);\n\nvar _build = require('./addons/build');\n\nvar _build2 = _interopRequireDefault(_build);\n\nvar _matchrecursive = require('./addons/matchrecursive');\n\nvar _matchrecursive2 = _interopRequireDefault(_matchrecursive);\n\nvar _unicodeBase = require('./addons/unicode-base');\n\nvar _unicodeBase2 = _interopRequireDefault(_unicodeBase);\n\nvar _unicodeBlocks = require('./addons/unicode-blocks');\n\nvar _unicodeBlocks2 = _interopRequireDefault(_unicodeBlocks);\n\nvar _unicodeCategories = require('./addons/unicode-categories');\n\nvar _unicodeCategories2 = _interopRequireDefault(_unicodeCategories);\n\nvar _unicodeProperties = require('./addons/unicode-properties');\n\nvar _unicodeProperties2 = _interopRequireDefault(_unicodeProperties);\n\nvar _unicodeScripts = require('./addons/unicode-scripts');\n\nvar _unicodeScripts2 = _interopRequireDefault(_unicodeScripts);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _build2.default)(_xregexp2.default);\n(0, _matchrecursive2.default)(_xregexp2.default);\n(0, _unicodeBase2.default)(_xregexp2.default);\n(0, _unicodeBlocks2.default)(_xregexp2.default);\n(0, _unicodeCategories2.default)(_xregexp2.default);\n(0, _unicodeProperties2.default)(_xregexp2.default);\n(0, _unicodeScripts2.default)(_xregexp2.default);\n\nexports.default = _xregexp2.default;\nmodule.exports = exports['default'];\n},{\"./xregexp\":\"DOky\",\"./addons/build\":\"DN8N\",\"./addons/matchrecursive\":\"wN5b\",\"./addons/unicode-base\":\"s3hB\",\"./addons/unicode-blocks\":\"YWjk\",\"./addons/unicode-categories\":\"nPWq\",\"./addons/unicode-properties\":\"sqgh\",\"./addons/unicode-scripts\":\"RtWW\"}],\"U3j9\":[function(require,module,exports) {\n'use strict';\n\nconst xRegExp = require('xregexp');\n\nmodule.exports = (text, separator) => {\n  if (typeof text !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n\n  separator = typeof separator === 'undefined' ? '_' : separator;\n  const regex1 = xRegExp('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n  const regex2 = xRegExp('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n  return text // TODO: Use this instead of `xregexp` when targeting Node.js 10:\n  // .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n  // .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n  .replace(regex1, \"$1\".concat(separator, \"$2\")).replace(regex2, \"$1\".concat(separator, \"$2\")).toLowerCase();\n};\n},{\"xregexp\":\"iuSj\"}],\"QGtg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createElement = createElement;\nexports.mount = mount;\n\nvar _decamelize = _interopRequireWildcard(require(\"decamelize\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n//handle es6 / bundling\nconst decamelize = _decamelize['default'] || _decamelize;\n\nfunction createElement(tag, attrs, ...children) {\n  if (typeof tag === 'function') {\n    const fn = tag;\n    const props = attrs;\n    props.children = children;\n    return fn(props);\n  } else {\n    const el = document.createElement(tag);\n    const map = attrs;\n\n    for (let name in map) {\n      if (name && map.hasOwnProperty(name)) {\n        let value = map[name];\n\n        if (name === 'className' && value !== void 0) {\n          el.setAttribute('class', value.toString());\n        } else if (value === false || value === null || value === undefined) {\n          continue;\n        } else if (value === true) {\n          el.setAttribute(name, name);\n        } else if (typeof value === 'function') {\n          el[name.toLowerCase()] = value;\n        } else if (typeof value === 'object') {\n          el.setAttribute(name, flatten(value));\n        } else {\n          el.setAttribute(name, value.toString());\n        }\n      }\n    }\n\n    if (children && children.length > 0) {\n      appendChildren(el, children);\n    }\n\n    return el;\n  }\n}\n\nfunction flatten(o) {\n  const arr = [];\n\n  for (let prop in o) arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n\n  return arr.join(';');\n}\n\nfunction addChild(parentElement, child) {\n  if (child === null || child === undefined || typeof child === \"boolean\") {\n    return;\n  } else if (Array.isArray(child)) {\n    appendChildren(parentElement, child);\n  } else if (isElement(child)) {\n    parentElement.appendChild(child);\n  } else {\n    parentElement.appendChild(document.createTextNode(child.toString()));\n  }\n}\n\nfunction appendChildren(parentElement, children) {\n  children.forEach(child => addChild(parentElement, child));\n}\n\nfunction isElement(el) {\n  //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n  return !!el.nodeType;\n}\n\nfunction mount(element, container) {\n  const activeChildPositions = getActiveChildPositions(container);\n  container.innerHTML = '';\n\n  if (element) {\n    addChild(container, element);\n    if (activeChildPositions) focusChildAtPosition(container, activeChildPositions);\n  }\n}\n\nfunction focusChildAtPosition(element, childPositions) {\n  while (element && childPositions.length) element = element.children.item(childPositions.shift());\n\n  if (element) element.focus();\n}\n\nfunction getActiveChildPositions(containerElement) {\n  var active = document.activeElement;\n  var childPositions = [];\n\n  while (active !== document.body && active !== containerElement) {\n    childPositions.unshift(childPosition(active));\n    active = active.parentElement;\n  }\n\n  if (active === containerElement && childPositions.length) return childPositions;\n}\n\nfunction childPosition(element) {\n  let i = 0;\n\n  while (element = element.previousElementSibling) i++;\n\n  return i;\n}\n},{\"decamelize\":\"U3j9\"}],\"AQhe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Table = void 0;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst KeyCodes = {\n  ENTER: 13\n};\n\nconst Table = props => {\n  return (0, _tsxCreateElement.createElement)(\"table\", {\n    className: props.className\n  }, props.children, props.rows.map((row, i) => (0, _tsxCreateElement.createElement)(\"tr\", {\n    className: props.rowClassName || '',\n    onClick: e => props.onRowClick && props.onRowClick(e, i),\n    tabIndex: props.onRowClick ? 0 : -1,\n    onKeyUp: e => {\n      if (e.keyCode === KeyCodes.ENTER && props.onRowClick) {\n        props.onRowClick(e, i);\n      }\n    }\n  }, row.cells.map((cell, i) => (0, _tsxCreateElement.createElement)(\"td\", {\n    className: cell.className || '',\n    title: cell.title || ''\n  }, cell.content)))));\n};\n\nexports.Table = Table;\n},{\"tsx-create-element\":\"QGtg\"}],\"P7sC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Table\", {\n  enumerable: true,\n  get: function () {\n    return _controls.Table;\n  }\n});\n\nvar _controls = require(\"../controls\");\n},{\"../controls\":\"AQhe\"}],\"lvA6\":[function(require,module,exports) {\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n},{}],\"todx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.addEl = addEl;\nexports.addDiv = addDiv;\nexports.outerSize = outerSize;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Create a new element as a child of another element.\n * @param tagName Tag name of the new tag to create.\n * @param parentElement Reference of the element to append to.\n * @returns new HTMLElement.\n */\nfunction addEl(tagName, parentElement) {\n  const el = document.createElement(tagName);\n  parentElement.appendChild(el);\n  return el;\n}\n/**\n * Create a new div HTMLElement as a child of another element.\n * @param parentElement Reference of the element to append to.\n * @param className Optional css class name to apply to the div.\n */\n\n\nfunction addDiv(parentElement, className) {\n  const div = addEl('div', parentElement);\n\n  if (className) {\n    div.className = className;\n  }\n\n  return div;\n}\n/**\n * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n * @param el HTML Element to measure.\n */\n\n\nfunction outerSize(el) {\n  const cs = getComputedStyle(el);\n  const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n  const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n  return {\n    height,\n    width\n  };\n}\n},{}],\"AEPa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar isMergeableObject = function isMergeableObject(value) {\n  return isNonNullObject(value) && !isSpecial(value);\n};\n\nfunction isNonNullObject(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isSpecial(value) {\n  var stringValue = Object.prototype.toString.call(value);\n  return stringValue === '[object RegExp]' || stringValue === '[object Date]' || isReactElement(value);\n} // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n\n\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n  return value.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nfunction emptyTarget(val) {\n  return Array.isArray(val) ? [] : {};\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n  return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value;\n}\n\nfunction defaultArrayMerge(target, source, options) {\n  return target.concat(source).map(function (element) {\n    return cloneUnlessOtherwiseSpecified(element, options);\n  });\n}\n\nfunction mergeObject(target, source, options) {\n  var destination = {};\n\n  if (options.isMergeableObject(target)) {\n    Object.keys(target).forEach(function (key) {\n      destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    });\n  }\n\n  Object.keys(source).forEach(function (key) {\n    if (!options.isMergeableObject(source[key]) || !target[key]) {\n      destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    } else {\n      destination[key] = deepmerge(target[key], source[key], options);\n    }\n  });\n  return destination;\n}\n\nfunction deepmerge(target, source, options) {\n  options = options || {};\n  options.arrayMerge = options.arrayMerge || defaultArrayMerge;\n  options.isMergeableObject = options.isMergeableObject || isMergeableObject;\n  var sourceIsArray = Array.isArray(source);\n  var targetIsArray = Array.isArray(target);\n  var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n  if (!sourceAndTargetTypesMatch) {\n    return cloneUnlessOtherwiseSpecified(source, options);\n  } else if (sourceIsArray) {\n    return options.arrayMerge(target, source, options);\n  } else {\n    return mergeObject(target, source, options);\n  }\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n  if (!Array.isArray(array)) {\n    throw new Error('first argument should be an array');\n  }\n\n  return array.reduce(function (prev, next) {\n    return deepmerge(prev, next, options);\n  }, {});\n};\n\nvar deepmerge_1 = deepmerge;\nvar _default = deepmerge_1;\nexports.default = _default;\n},{}],\"k3Ez\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.clone = clone;\nexports.deepMerge = deepMerge;\n\nvar _deepmerge = _interopRequireWildcard(require(\"deepmerge\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst deepmerge = _deepmerge.default || _deepmerge;\n\nfunction clone(objectToClone) {\n  if (!objectToClone) return objectToClone;\n  return deepmerge.all([objectToClone]);\n}\n\nconst dontMerge = (destination, source) => source;\n\nfunction deepMerge(...objectsToMerge) {\n  const objects = objectsToMerge.filter(Boolean);\n  return deepmerge.all(objects, {\n    arrayMerge: dontMerge\n  });\n}\n},{\"deepmerge\":\"AEPa\"}],\"VlPU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.extend = extend;\n\nfunction _default(constructor, factory, prototype) {\n  constructor.prototype = factory.prototype = prototype;\n  prototype.constructor = constructor;\n}\n\nfunction extend(parent, definition) {\n  var prototype = Object.create(parent.prototype);\n\n  for (var key in definition) prototype[key] = definition[key];\n\n  return prototype;\n}\n},{}],\"LQD5\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Color = Color;\nexports.default = color;\nexports.rgbConvert = rgbConvert;\nexports.rgb = rgb;\nexports.Rgb = Rgb;\nexports.hslConvert = hslConvert;\nexports.hsl = hsl;\nexports.brighter = exports.darker = void 0;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction Color() {}\n\nvar darker = 0.7;\nexports.darker = darker;\nvar brighter = 1 / darker;\nexports.brighter = brighter;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n    reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n    reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n    reHex = /^#([0-9a-f]{3,8})$/,\n    reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n    reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n    reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n    reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n    reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n    reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\nvar named = {\n  aliceblue: 0xf0f8ff,\n  antiquewhite: 0xfaebd7,\n  aqua: 0x00ffff,\n  aquamarine: 0x7fffd4,\n  azure: 0xf0ffff,\n  beige: 0xf5f5dc,\n  bisque: 0xffe4c4,\n  black: 0x000000,\n  blanchedalmond: 0xffebcd,\n  blue: 0x0000ff,\n  blueviolet: 0x8a2be2,\n  brown: 0xa52a2a,\n  burlywood: 0xdeb887,\n  cadetblue: 0x5f9ea0,\n  chartreuse: 0x7fff00,\n  chocolate: 0xd2691e,\n  coral: 0xff7f50,\n  cornflowerblue: 0x6495ed,\n  cornsilk: 0xfff8dc,\n  crimson: 0xdc143c,\n  cyan: 0x00ffff,\n  darkblue: 0x00008b,\n  darkcyan: 0x008b8b,\n  darkgoldenrod: 0xb8860b,\n  darkgray: 0xa9a9a9,\n  darkgreen: 0x006400,\n  darkgrey: 0xa9a9a9,\n  darkkhaki: 0xbdb76b,\n  darkmagenta: 0x8b008b,\n  darkolivegreen: 0x556b2f,\n  darkorange: 0xff8c00,\n  darkorchid: 0x9932cc,\n  darkred: 0x8b0000,\n  darksalmon: 0xe9967a,\n  darkseagreen: 0x8fbc8f,\n  darkslateblue: 0x483d8b,\n  darkslategray: 0x2f4f4f,\n  darkslategrey: 0x2f4f4f,\n  darkturquoise: 0x00ced1,\n  darkviolet: 0x9400d3,\n  deeppink: 0xff1493,\n  deepskyblue: 0x00bfff,\n  dimgray: 0x696969,\n  dimgrey: 0x696969,\n  dodgerblue: 0x1e90ff,\n  firebrick: 0xb22222,\n  floralwhite: 0xfffaf0,\n  forestgreen: 0x228b22,\n  fuchsia: 0xff00ff,\n  gainsboro: 0xdcdcdc,\n  ghostwhite: 0xf8f8ff,\n  gold: 0xffd700,\n  goldenrod: 0xdaa520,\n  gray: 0x808080,\n  green: 0x008000,\n  greenyellow: 0xadff2f,\n  grey: 0x808080,\n  honeydew: 0xf0fff0,\n  hotpink: 0xff69b4,\n  indianred: 0xcd5c5c,\n  indigo: 0x4b0082,\n  ivory: 0xfffff0,\n  khaki: 0xf0e68c,\n  lavender: 0xe6e6fa,\n  lavenderblush: 0xfff0f5,\n  lawngreen: 0x7cfc00,\n  lemonchiffon: 0xfffacd,\n  lightblue: 0xadd8e6,\n  lightcoral: 0xf08080,\n  lightcyan: 0xe0ffff,\n  lightgoldenrodyellow: 0xfafad2,\n  lightgray: 0xd3d3d3,\n  lightgreen: 0x90ee90,\n  lightgrey: 0xd3d3d3,\n  lightpink: 0xffb6c1,\n  lightsalmon: 0xffa07a,\n  lightseagreen: 0x20b2aa,\n  lightskyblue: 0x87cefa,\n  lightslategray: 0x778899,\n  lightslategrey: 0x778899,\n  lightsteelblue: 0xb0c4de,\n  lightyellow: 0xffffe0,\n  lime: 0x00ff00,\n  limegreen: 0x32cd32,\n  linen: 0xfaf0e6,\n  magenta: 0xff00ff,\n  maroon: 0x800000,\n  mediumaquamarine: 0x66cdaa,\n  mediumblue: 0x0000cd,\n  mediumorchid: 0xba55d3,\n  mediumpurple: 0x9370db,\n  mediumseagreen: 0x3cb371,\n  mediumslateblue: 0x7b68ee,\n  mediumspringgreen: 0x00fa9a,\n  mediumturquoise: 0x48d1cc,\n  mediumvioletred: 0xc71585,\n  midnightblue: 0x191970,\n  mintcream: 0xf5fffa,\n  mistyrose: 0xffe4e1,\n  moccasin: 0xffe4b5,\n  navajowhite: 0xffdead,\n  navy: 0x000080,\n  oldlace: 0xfdf5e6,\n  olive: 0x808000,\n  olivedrab: 0x6b8e23,\n  orange: 0xffa500,\n  orangered: 0xff4500,\n  orchid: 0xda70d6,\n  palegoldenrod: 0xeee8aa,\n  palegreen: 0x98fb98,\n  paleturquoise: 0xafeeee,\n  palevioletred: 0xdb7093,\n  papayawhip: 0xffefd5,\n  peachpuff: 0xffdab9,\n  peru: 0xcd853f,\n  pink: 0xffc0cb,\n  plum: 0xdda0dd,\n  powderblue: 0xb0e0e6,\n  purple: 0x800080,\n  rebeccapurple: 0x663399,\n  red: 0xff0000,\n  rosybrown: 0xbc8f8f,\n  royalblue: 0x4169e1,\n  saddlebrown: 0x8b4513,\n  salmon: 0xfa8072,\n  sandybrown: 0xf4a460,\n  seagreen: 0x2e8b57,\n  seashell: 0xfff5ee,\n  sienna: 0xa0522d,\n  silver: 0xc0c0c0,\n  skyblue: 0x87ceeb,\n  slateblue: 0x6a5acd,\n  slategray: 0x708090,\n  slategrey: 0x708090,\n  snow: 0xfffafa,\n  springgreen: 0x00ff7f,\n  steelblue: 0x4682b4,\n  tan: 0xd2b48c,\n  teal: 0x008080,\n  thistle: 0xd8bfd8,\n  tomato: 0xff6347,\n  turquoise: 0x40e0d0,\n  violet: 0xee82ee,\n  wheat: 0xf5deb3,\n  white: 0xffffff,\n  whitesmoke: 0xf5f5f5,\n  yellow: 0xffff00,\n  yellowgreen: 0x9acd32\n};\n(0, _define.default)(Color, color, {\n  copy: function (channels) {\n    return Object.assign(new this.constructor(), this, channels);\n  },\n  displayable: function () {\n    return this.rgb().displayable();\n  },\n  hex: color_formatHex,\n  // Deprecated! Use color.formatHex.\n  formatHex: color_formatHex,\n  formatHsl: color_formatHsl,\n  formatRgb: color_formatRgb,\n  toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n  return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n  return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n  return this.rgb().formatRgb();\n}\n\nfunction color(format) {\n  var m, l;\n  format = (format + \"\").trim().toLowerCase();\n  return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n  : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n  : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n  : l === 4 ? new Rgb(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n  : null // invalid hex\n  ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n  : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n  : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n  : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n  : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n  : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n  : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n  : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\n\nfunction rgbn(n) {\n  return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n  if (a <= 0) r = g = b = NaN;\n  return new Rgb(r, g, b, a);\n}\n\nfunction rgbConvert(o) {\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Rgb();\n  o = o.rgb();\n  return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nfunction rgb(r, g, b, opacity) {\n  return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nfunction Rgb(r, g, b, opacity) {\n  this.r = +r;\n  this.g = +g;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Rgb, rgb, (0, _define.extend)(Color, {\n  brighter: function (k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  rgb: function () {\n    return this;\n  },\n  displayable: function () {\n    return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n  },\n  hex: rgb_formatHex,\n  // Deprecated! Use color.formatHex.\n  formatHex: rgb_formatHex,\n  formatRgb: rgb_formatRgb,\n  toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n  return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n  var a = this.opacity;\n  a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n  return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n  value = Math.max(0, Math.min(255, Math.round(value) || 0));\n  return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n  if (a <= 0) h = s = l = NaN;else if (l <= 0 || l >= 1) h = s = NaN;else if (s <= 0) h = NaN;\n  return new Hsl(h, s, l, a);\n}\n\nfunction hslConvert(o) {\n  if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Hsl();\n  if (o instanceof Hsl) return o;\n  o = o.rgb();\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      h = NaN,\n      s = max - min,\n      l = (max + min) / 2;\n\n  if (s) {\n    if (r === max) h = (g - b) / s + (g < b) * 6;else if (g === max) h = (b - r) / s + 2;else h = (r - g) / s + 4;\n    s /= l < 0.5 ? max + min : 2 - max - min;\n    h *= 60;\n  } else {\n    s = l > 0 && l < 1 ? 0 : h;\n  }\n\n  return new Hsl(h, s, l, o.opacity);\n}\n\nfunction hsl(h, s, l, opacity) {\n  return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Hsl, hsl, (0, _define.extend)(Color, {\n  brighter: function (k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function () {\n    var h = this.h % 360 + (this.h < 0) * 360,\n        s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n        l = this.l,\n        m2 = l + (l < 0.5 ? l : 1 - l) * s,\n        m1 = 2 * l - m2;\n    return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n  },\n  displayable: function () {\n    return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n  },\n  formatHsl: function () {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n  }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */\n\nfunction hsl2rgb(h, m1, m2) {\n  return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n},{\"./define.js\":\"VlPU\"}],\"SQMv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.rad2deg = exports.deg2rad = void 0;\nvar deg2rad = Math.PI / 180;\nexports.deg2rad = deg2rad;\nvar rad2deg = 180 / Math.PI;\nexports.rad2deg = rad2deg;\n},{}],\"tX36\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.gray = gray;\nexports.default = lab;\nexports.Lab = Lab;\nexports.lch = lch;\nexports.hcl = hcl;\nexports.Hcl = Hcl;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nvar _color = require(\"./color.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n    Xn = 0.96422,\n    Yn = 1,\n    Zn = 0.82521,\n    t0 = 4 / 29,\n    t1 = 6 / 29,\n    t2 = 3 * t1 * t1,\n    t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n  if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n  if (o instanceof Hcl) return hcl2lab(o);\n  if (!(o instanceof _color.Rgb)) o = (0, _color.rgbConvert)(o);\n  var r = rgb2lrgb(o.r),\n      g = rgb2lrgb(o.g),\n      b = rgb2lrgb(o.b),\n      y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn),\n      x,\n      z;\n  if (r === g && g === b) x = z = y;else {\n    x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n    z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n  }\n  return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nfunction gray(l, opacity) {\n  return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nfunction lab(l, a, b, opacity) {\n  return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nfunction Lab(l, a, b, opacity) {\n  this.l = +l;\n  this.a = +a;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Lab, lab, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n  },\n  darker: function (k) {\n    return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n  },\n  rgb: function () {\n    var y = (this.l + 16) / 116,\n        x = isNaN(this.a) ? y : y + this.a / 500,\n        z = isNaN(this.b) ? y : y - this.b / 200;\n    x = Xn * lab2xyz(x);\n    y = Yn * lab2xyz(y);\n    z = Zn * lab2xyz(z);\n    return new _color.Rgb(lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity);\n  }\n}));\n\nfunction xyz2lab(t) {\n  return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n  return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n  return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n  return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n  if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n  if (!(o instanceof Lab)) o = labConvert(o);\n  if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n\n  var h = Math.atan2(o.b, o.a) * _math.rad2deg;\n\n  return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nfunction lch(l, c, h, opacity) {\n  return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction hcl(h, c, l, opacity) {\n  return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hcl(h, c, l, opacity) {\n  this.h = +h;\n  this.c = +c;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n  if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n  var h = o.h * _math.deg2rad;\n  return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\n(0, _define.default)(Hcl, hcl, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n  },\n  darker: function (k) {\n    return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n  },\n  rgb: function () {\n    return hcl2lab(this).rgb();\n  }\n}));\n},{\"./define.js\":\"VlPU\",\"./color.js\":\"LQD5\",\"./math.js\":\"SQMv\"}],\"rRwN\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cubehelix;\nexports.Cubehelix = Cubehelix;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nvar _color = require(\"./color.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar A = -0.14861,\n    B = +1.78277,\n    C = -0.29227,\n    D = -0.90649,\n    E = +1.97294,\n    ED = E * D,\n    EB = E * B,\n    BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n  if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof _color.Rgb)) o = (0, _color.rgbConvert)(o);\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n      bl = b - l,\n      k = (E * (g - l) - C * bl) / D,\n      s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)),\n      // NaN if l=0 or l=1\n  h = s ? Math.atan2(k, bl) * _math.rad2deg - 120 : NaN;\n  return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nfunction cubehelix(h, s, l, opacity) {\n  return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Cubehelix(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Cubehelix, cubehelix, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    k = k == null ? _color.brighter : Math.pow(_color.brighter, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? _color.darker : Math.pow(_color.darker, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function () {\n    var h = isNaN(this.h) ? 0 : (this.h + 120) * _math.deg2rad,\n        l = +this.l,\n        a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n        cosh = Math.cos(h),\n        sinh = Math.sin(h);\n    return new _color.Rgb(255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity);\n  }\n}));\n},{\"./define.js\":\"VlPU\",\"./color.js\":\"LQD5\",\"./math.js\":\"SQMv\"}],\"BlmO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"color\", {\n  enumerable: true,\n  get: function () {\n    return _color.default;\n  }\n});\nObject.defineProperty(exports, \"rgb\", {\n  enumerable: true,\n  get: function () {\n    return _color.rgb;\n  }\n});\nObject.defineProperty(exports, \"hsl\", {\n  enumerable: true,\n  get: function () {\n    return _color.hsl;\n  }\n});\nObject.defineProperty(exports, \"lab\", {\n  enumerable: true,\n  get: function () {\n    return _lab.default;\n  }\n});\nObject.defineProperty(exports, \"hcl\", {\n  enumerable: true,\n  get: function () {\n    return _lab.hcl;\n  }\n});\nObject.defineProperty(exports, \"lch\", {\n  enumerable: true,\n  get: function () {\n    return _lab.lch;\n  }\n});\nObject.defineProperty(exports, \"gray\", {\n  enumerable: true,\n  get: function () {\n    return _lab.gray;\n  }\n});\nObject.defineProperty(exports, \"cubehelix\", {\n  enumerable: true,\n  get: function () {\n    return _cubehelix.default;\n  }\n});\n\nvar _color = _interopRequireWildcard(require(\"./color.js\"));\n\nvar _lab = _interopRequireWildcard(require(\"./lab.js\"));\n\nvar _cubehelix = _interopRequireDefault(require(\"./cubehelix.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./color.js\":\"LQD5\",\"./lab.js\":\"tX36\",\"./cubehelix.js\":\"rRwN\"}],\"yCoU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.colorIsEqual = colorIsEqual;\nexports.colorFromString = colorFromString;\nexports.colorToString = colorToString;\nexports.desaturate = desaturate;\nexports.isColor = isColor;\n\nvar _d3Color = require(\"d3-color\");\n\nfunction rgbToDeckglColor(c) {\n  return [c.r, c.g, c.b, c.opacity * 255];\n}\n/**\n * Compares 2 colors to see if they are equal.\n * @param a Color to compare\n * @param b Color to compare\n * @returns True if colors are equal.\n */\n\n\nfunction colorIsEqual(a, b) {\n  if (a.length !== b.length) return false;\n\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return false;\n  }\n\n  return true;\n}\n/**\n * Convert a CSS color string to a Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n */\n\n\nfunction colorFromString(cssColorSpecifier) {\n  if (cssColorSpecifier) {\n    const dc = (0, _d3Color.color)(cssColorSpecifier);\n\n    if (dc) {\n      const c = dc.rgb();\n      return rgbToDeckglColor(c);\n    }\n  }\n}\n/**\n * Convert a Deck.gl color to a CSS rgba() string.\n * @param color A Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n */\n\n\nfunction colorToString(color) {\n  const c = [...color];\n\n  if (c.length > 3) {\n    c[3] /= 255;\n  }\n\n  return `rgba(${c.join(',')})`;\n}\n\nfunction desaturate(color, value) {\n  const rgb = (0, _d3Color.rgb)(color[0], color[1], color[2], color[3] / 255);\n  const hslColor = (0, _d3Color.hsl)(rgb);\n  hslColor.s = value;\n  const c = hslColor.rgb();\n  return rgbToDeckglColor(c);\n}\n\nfunction isColor(cssColorSpecifier) {\n  return !!(0, _d3Color.color)(cssColorSpecifier);\n}\n},{\"d3-color\":\"BlmO\"}],\"nnlJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.use = use;\nexports.base = void 0;\nlet vega = {\n  CanvasHandler: null,\n  inferType: null,\n  inferTypes: null,\n  loader: null,\n  parse: null,\n  read: null,\n  renderModule: null,\n  Renderer: null,\n  sceneVisit: null,\n  scheme: null,\n  View: null\n};\nlet deck = {\n  CompositeLayer: null,\n  COORDINATE_SYSTEM: null,\n  Deck: null,\n  Layer: null,\n  LinearInterpolator: null,\n  OrbitView: null,\n  _OrbitController: null\n};\nlet layers = {\n  IconLayer: null,\n  LineLayer: null,\n  PolygonLayer: null,\n  TextLayer: null\n};\nlet luma = {\n  CubeGeometry: null,\n  fp64: null,\n  Model: null,\n  Texture2D: null\n};\n/**\n * References to dependency libraries.\n */\n\nconst base = {\n  deck,\n  layers,\n  luma,\n  vega\n};\n/**\n * Specify the dependency libraries to use for rendering.\n * @param vega Vega library.\n * @param deck deck/core library.\n * @param layers deck/layers library.\n * @param luma luma.gl library.\n */\n\nexports.base = base;\n\nfunction use(vega, deck, layers, luma) {\n  base.deck = deck;\n  base.layers = layers;\n  base.luma = luma;\n  base.vega = vega;\n}\n},{}],\"mHLM\":[function(require,module,exports) {\n'use strict';\n\nmodule.exports = TinySDF;\nmodule.exports.default = TinySDF;\n\nvar INF = 1e20;\n\nfunction TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) {\n    this.fontSize = fontSize || 24;\n    this.buffer = buffer === undefined ? 3 : buffer;\n    this.cutoff = cutoff || 0.25;\n    this.fontFamily = fontFamily || 'sans-serif';\n    this.fontWeight = fontWeight || 'normal';\n    this.radius = radius || 8;\n    var size = this.size = this.fontSize + this.buffer * 2;\n\n    this.canvas = document.createElement('canvas');\n    this.canvas.width = this.canvas.height = size;\n\n    this.ctx = this.canvas.getContext('2d');\n    this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily;\n    this.ctx.textBaseline = 'middle';\n    this.ctx.fillStyle = 'black';\n\n    // temporary arrays for the distance transform\n    this.gridOuter = new Float64Array(size * size);\n    this.gridInner = new Float64Array(size * size);\n    this.f = new Float64Array(size);\n    this.d = new Float64Array(size);\n    this.z = new Float64Array(size + 1);\n    this.v = new Int16Array(size);\n\n    // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852\n    this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1));\n}\n\nTinySDF.prototype.draw = function (char) {\n    this.ctx.clearRect(0, 0, this.size, this.size);\n    this.ctx.fillText(char, this.buffer, this.middle);\n\n    var imgData = this.ctx.getImageData(0, 0, this.size, this.size);\n    var alphaChannel = new Uint8ClampedArray(this.size * this.size);\n\n    for (var i = 0; i < this.size * this.size; i++) {\n        var a = imgData.data[i * 4 + 3] / 255; // alpha value\n        this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2);\n        this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2);\n    }\n\n    edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z);\n    edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z);\n\n    for (i = 0; i < this.size * this.size; i++) {\n        var d = this.gridOuter[i] - this.gridInner[i];\n        alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff))));\n    }\n\n    return alphaChannel;\n};\n\n// 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\nfunction edt(data, width, height, f, d, v, z) {\n    for (var x = 0; x < width; x++) {\n        for (var y = 0; y < height; y++) {\n            f[y] = data[y * width + x];\n        }\n        edt1d(f, d, v, z, height);\n        for (y = 0; y < height; y++) {\n            data[y * width + x] = d[y];\n        }\n    }\n    for (y = 0; y < height; y++) {\n        for (x = 0; x < width; x++) {\n            f[x] = data[y * width + x];\n        }\n        edt1d(f, d, v, z, width);\n        for (x = 0; x < width; x++) {\n            data[y * width + x] = Math.sqrt(d[x]);\n        }\n    }\n}\n\n// 1D squared distance transform\nfunction edt1d(f, d, v, z, n) {\n    v[0] = 0;\n    z[0] = -INF;\n    z[1] = +INF;\n\n    for (var q = 1, k = 0; q < n; q++) {\n        var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n        while (s <= z[k]) {\n            k--;\n            s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n        }\n        k++;\n        v[k] = q;\n        z[k] = s;\n        z[k + 1] = +INF;\n    }\n\n    for (q = 0, k = 0; q < n; q++) {\n        while (z[k + 1] < q) k++;\n        d[q] = (q - v[k]) * (q - v[k]) + f[v[k]];\n    }\n}\n\n},{}],\"q7nD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.makeFontAtlas = makeFontAtlas;\nexports.DEFAULT_FONT_SETTINGS = exports.DEFAULT_FONT_WEIGHT = exports.DEFAULT_FONT_FAMILY = exports.DEFAULT_CHAR_SET = void 0;\n\nvar _tinySdf = _interopRequireDefault(require(\"@mapbox/tiny-sdf\"));\n\nvar _base = require(\"../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/font-atlas.js\n\n/* global document */\nconst GL_TEXTURE_WRAP_S = 0x2802;\nconst GL_TEXTURE_WRAP_T = 0x2803;\nconst GL_CLAMP_TO_EDGE = 0x812f;\nconst MAX_CANVAS_WIDTH = 1024;\nconst BASELINE_SCALE = 0.9;\nconst HEIGHT_SCALE = 1.2;\n\nfunction getDefaultCharacterSet() {\n  const charSet = [];\n\n  for (let i = 32; i < 128; i++) {\n    charSet.push(String.fromCharCode(i));\n  }\n\n  return charSet;\n}\n\nconst DEFAULT_CHAR_SET = getDefaultCharacterSet();\nexports.DEFAULT_CHAR_SET = DEFAULT_CHAR_SET;\nconst DEFAULT_FONT_FAMILY = 'Monaco, monospace';\nexports.DEFAULT_FONT_FAMILY = DEFAULT_FONT_FAMILY;\nconst DEFAULT_FONT_WEIGHT = 'normal';\nexports.DEFAULT_FONT_WEIGHT = DEFAULT_FONT_WEIGHT;\nconst DEFAULT_FONT_SETTINGS = {\n  fontSize: 64,\n  buffer: 2,\n  sdf: false,\n  cutoff: 0.25,\n  radius: 3\n};\nexports.DEFAULT_FONT_SETTINGS = DEFAULT_FONT_SETTINGS;\n\nfunction populateAlphaChannel(alphaChannel, imageData) {\n  // populate distance value from tinySDF to image alpha channel\t\n  for (let i = 0; i < alphaChannel.length; i++) {\n    imageData.data[4 * i + 3] = alphaChannel[i];\n  }\n}\n\nfunction setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n  ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n  ctx.fillStyle = '#000';\n  ctx.textBaseline = 'alphabetic';\n  ctx.textAlign = 'left';\n}\n\nfunction buildMapping({\n  ctx,\n  fontHeight,\n  buffer,\n  characterSet,\n  maxCanvasWidth\n}) {\n  const mapping = {};\n  let row = 0;\n  let x = 0;\n  Array.from(characterSet).forEach(char => {\n    // measure texts\n    // TODO - use Advanced text metrics when they are adopted:\n    // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n    const {\n      width\n    } = ctx.measureText(char);\n\n    if (x + width + buffer * 2 > maxCanvasWidth) {\n      x = 0;\n      row++;\n    }\n\n    mapping[char] = {\n      x: x + buffer,\n      y: row * (fontHeight + buffer * 2) + buffer,\n      width,\n      height: fontHeight,\n      mask: true\n    };\n    x += width + buffer * 2;\n  });\n  const canvasHeight = (row + 1) * (fontHeight + buffer * 2);\n  return {\n    mapping,\n    canvasHeight\n  };\n}\n\nfunction makeFontAtlas(gl, fontSettings) {\n  const mergedFontSettings = Object.assign({\n    fontFamily: DEFAULT_FONT_FAMILY,\n    fontWeight: DEFAULT_FONT_WEIGHT,\n    characterSet: DEFAULT_CHAR_SET\n  }, DEFAULT_FONT_SETTINGS, fontSettings);\n  const {\n    fontFamily,\n    fontWeight,\n    characterSet,\n    fontSize,\n    buffer,\n    sdf,\n    radius,\n    cutoff\n  } = mergedFontSettings;\n  const canvas = document.createElement('canvas');\n  const ctx = canvas.getContext('2d'); // build mapping\n\n  setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n  const fontHeight = fontSize * HEIGHT_SCALE;\n  const {\n    canvasHeight,\n    mapping\n  } = buildMapping({\n    ctx,\n    fontHeight,\n    buffer,\n    characterSet,\n    maxCanvasWidth: MAX_CANVAS_WIDTH\n  });\n  canvas.width = MAX_CANVAS_WIDTH;\n  canvas.height = canvasHeight;\n  setTextStyle(ctx, fontFamily, fontSize, fontWeight); // layout characters\n\n  if (sdf) {\n    const tinySDF = new _tinySdf.default(fontSize, buffer, radius, cutoff, fontFamily, fontWeight); // used to store distance values from tinySDF\t\n\n    const imageData = ctx.createImageData(tinySDF.size, tinySDF.size);\n\n    for (const char of characterSet) {\n      populateAlphaChannel(tinySDF.draw(char), imageData);\n      ctx.putImageData(imageData, mapping[char].x - buffer, mapping[char].y - buffer);\n    }\n  } else {\n    for (const char of characterSet) {\n      ctx.fillText(char, mapping[char].x, mapping[char].y + fontSize * BASELINE_SCALE);\n    }\n  }\n\n  return {\n    scale: HEIGHT_SCALE,\n    mapping,\n    texture: new _base.base.luma.Texture2D(gl, {\n      pixels: canvas,\n      // padding is added only between the characters but not for borders\n      // enforce CLAMP_TO_EDGE to avoid any artifacts.\n      parameters: {\n        [GL_TEXTURE_WRAP_S]: GL_CLAMP_TO_EDGE,\n        [GL_TEXTURE_WRAP_T]: GL_CLAMP_TO_EDGE\n      }\n    })\n  };\n}\n},{\"@mapbox/tiny-sdf\":\"mHLM\",\"../base\":\"nnlJ\"}],\"ETP3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-fragment.glsl.js\nvar _default = `\\\n#define SHADER_NAME multi-icon-layer-fragment-shader\n\nprecision highp float;\n\nuniform sampler2D iconsTexture;\nuniform float buffer;\nuniform bool sdf;\n\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nconst float MIN_ALPHA = 0.05;\n\nvoid main(void) {\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\n  \n  float alpha = texColor.a;\n\n  // if enable sdf (signed distance fields)\t\n  if (sdf) {\t\n    float distance = texture2D(iconsTexture, vTextureCoords).a;\t\n    alpha = smoothstep(buffer - vGamma, buffer + vGamma, distance);\t\n  }\n\n  // Take the global opacity and the alpha from vColor into account for the alpha component\n  float a = alpha * vColor.a;\n\n  if (picking_uActive) {\n\n    // use picking color for entire rectangle\n    gl_FragColor = vec4(picking_vRGBcolor_Aselected.rgb, 1.0);\n  \n  } else {\n\n    if (a < MIN_ALPHA) {\n      discard;\n    } else {\n\n      gl_FragColor = vec4(vColor.rgb, a);\n\n      // use highlight color if this fragment belongs to the selected object.\n      bool selected = bool(picking_vRGBcolor_Aselected.a);\n      if (selected) {\n        gl_FragColor = vec4(vHighlightColor.rgb, a);\n      }\n    }\n  }\n}\n`;\nexports.default = _default;\n},{}],\"V2Pd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-vertex.glsl.js\nvar _default = `\\\n#define SHADER_NAME multi-icon-layer-vertex-shader\n\nattribute vec2 positions;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute float instanceSizes;\nattribute float instanceAngles;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\nattribute vec4 instanceIconFrames;\nattribute float instanceColorModes;\nattribute vec2 instanceOffsets;\n\n// the following three attributes are for the multi-icon layer\nattribute vec2 instancePixelOffset;\nattribute vec4 instanceHighlightColors;\n\nuniform float sizeScale;\nuniform vec2 iconsTextureDim;\nuniform float gamma;\nuniform float opacity;\n\nvarying float vColorMode;\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nvec2 rotate_by_angle(vec2 vertex, float angle) {\n  float angle_radian = angle * PI / 180.0;\n  float cos_angle = cos(angle_radian);\n  float sin_angle = sin(angle_radian);\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\n  return rotationMatrix * vertex;\n}\n\nvoid main(void) {\n  vec2 iconSize = instanceIconFrames.zw;\n  // scale icon height to match instanceSize\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : instanceSizes / iconSize.y;\n\n  // scale and rotate vertex in \"pixel\" value and convert back to fraction in clipspace\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\n\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * sizeScale * instanceScale;\n  pixelOffset += instancePixelOffset;\n  pixelOffset.y *= -1.0;\n\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.0));\n  gl_Position += project_pixel_to_clipspace(pixelOffset);\n\n  vTextureCoords = mix(\n    instanceIconFrames.xy,\n    instanceIconFrames.xy + iconSize,\n    (positions.xy + 1.0) / 2.0\n  ) / iconsTextureDim;\n\n  vTextureCoords.y = 1.0 - vTextureCoords.y;\n\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\n  vHighlightColor = vec4(instanceHighlightColors.rgb, instanceHighlightColors.a * opacity) / 255.;\n\n  picking_setPickingColor(instancePickingColors);\n\n  vGamma = gamma / (sizeScale * iconSize.y);\n}\n`;\nexports.default = _default;\n},{}],\"sBB8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MultiIconLayer = void 0;\n\nvar _chromaticMultiIconLayerFragment = _interopRequireDefault(require(\"./chromatic-multi-icon-layer-fragment.glsl\"));\n\nvar _chromaticMultiIconLayerVertex = _interopRequireDefault(require(\"./chromatic-multi-icon-layer-vertex.glsl\"));\n\nvar _base = require(\"../../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer.js\n// TODO expose as layer properties\nconst DEFAULT_GAMMA = 0.2;\nconst DEFAULT_BUFFER = 192.0 / 256;\nconst defaultProps = {\n  getShiftInQueue: {\n    type: 'accessor',\n    value: x => x.shift || 0\n  },\n  getLengthOfQueue: {\n    type: 'accessor',\n    value: x => x.len || 1\n  },\n  // 1: left, 0: middle, -1: right\n  getAnchorX: {\n    type: 'accessor',\n    value: x => x.anchorX || 0\n  },\n  // 1: top, 0: center, -1: bottom\n  getAnchorY: {\n    type: 'accessor',\n    value: x => x.anchorY || 0\n  },\n  getPixelOffset: {\n    type: 'accessor',\n    value: [0, 0]\n  },\n  // object with the same pickingIndex will be picked when any one of them is being picked\n  getPickingIndex: {\n    type: 'accessor',\n    value: x => x.objectIndex\n  }\n}; //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n\nconst UNSIGNED_BYTE = 0x1401;\n\nfunction _MultiIconLayer(...props) {\n  class __MultiIconLayer extends _base.base.layers.IconLayer {\n    constructor(...props) {\n      super(...arguments);\n    }\n\n    getShaders() {\n      return Object.assign({}, super.getShaders(), {\n        vs: _chromaticMultiIconLayerVertex.default,\n        fs: _chromaticMultiIconLayerFragment.default\n      });\n    }\n\n    initializeState() {\n      super.initializeState();\n      const attributeManager = this.getAttributeManager();\n      attributeManager.addInstanced({\n        instancePixelOffset: {\n          size: 2,\n          transition: true,\n          accessor: 'getPixelOffset'\n        },\n        instanceHighlightColors: {\n          size: 4,\n          type: UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getHighlightColor',\n          defaultValue: [0, 255, 0, 255]\n        }\n      });\n    }\n\n    updateState(updateParams) {\n      super.updateState(updateParams);\n      const {\n        changeFlags\n      } = updateParams;\n\n      if (changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.getAnchorX || changeFlags.updateTriggersChanged.getAnchorY)) {\n        this.getAttributeManager().invalidate('instanceOffsets');\n      }\n    }\n\n    draw({\n      uniforms\n    }) {\n      const {\n        sdf\n      } = this.props;\n      super.draw({\n        uniforms: Object.assign({}, uniforms, {\n          // Refer the following doc about gamma and buffer\n          // https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817\n          buffer: DEFAULT_BUFFER,\n          gamma: DEFAULT_GAMMA,\n          sdf: Boolean(sdf)\n        })\n      });\n    }\n\n    calculateInstanceOffsets(attribute) {\n      const {\n        data,\n        iconMapping,\n        getIcon,\n        getAnchorX,\n        getAnchorY,\n        getLengthOfQueue,\n        getShiftInQueue\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n\n      for (const object of data) {\n        const icon = getIcon(object);\n        const rect = iconMapping[icon] || {};\n        const len = getLengthOfQueue(object);\n        const shiftX = getShiftInQueue(object);\n        value[i++] = (getAnchorX(object) - 1) * len / 2 + rect.width / 2 + shiftX || 0;\n        value[i++] = rect.height / 2 * getAnchorY(object) || 0;\n      }\n    }\n\n    calculateInstancePickingColors(attribute) {\n      const {\n        data,\n        getPickingIndex\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n      const pickingColor = [];\n\n      for (const point of data) {\n        const index = getPickingIndex(point);\n        this.encodePickingColor(index, pickingColor);\n        value[i++] = pickingColor[0];\n        value[i++] = pickingColor[1];\n        value[i++] = pickingColor[2];\n      }\n    }\n\n  }\n\n  __MultiIconLayer.layerName = 'MultiIconLayer';\n  __MultiIconLayer.defaultProps = defaultProps;\n  const instance = new __MultiIconLayer(...arguments);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * CubeLayer - a Deck.gl layer to render cuboids.\n * This is instantiatable by calling `new MultiIconLayer()`.\n */\n\n\nconst MultiIconLayer = _MultiIconLayer;\nexports.MultiIconLayer = MultiIconLayer;\n},{\"./chromatic-multi-icon-layer-fragment.glsl\":\"ETP3\",\"./chromatic-multi-icon-layer-vertex.glsl\":\"V2Pd\",\"../../base\":\"nnlJ\"}],\"EoSk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ChromaticTextLayer = void 0;\n\nvar _base = require(\"../base\");\n\nvar _fontAtlas = require(\"./font-atlas\");\n\nvar _chromaticMultiIconLayer = require(\"./chromatic-multi-icon-layer/chromatic-multi-icon-layer\");\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/text-layer.js\nconst TEXT_ANCHOR = {\n  start: 1,\n  middle: 0,\n  end: -1\n};\nconst ALIGNMENT_BASELINE = {\n  top: 1,\n  center: 0,\n  bottom: -1\n};\nconst DEFAULT_COLOR = [0, 0, 0, 255];\nconst MISSING_CHAR_WIDTH = 32;\nconst FONT_SETTINGS_PROPS = ['fontSize', 'buffer', 'sdf', 'radius', 'cutoff'];\nconst defaultProps = {\n  fp64: false,\n  sizeScale: 1,\n  characterSet: _fontAtlas.DEFAULT_CHAR_SET,\n  fontFamily: _fontAtlas.DEFAULT_FONT_FAMILY,\n  fontWeight: _fontAtlas.DEFAULT_FONT_WEIGHT,\n  fontSettings: {},\n  getText: {\n    type: 'accessor',\n    value: x => x.text\n  },\n  getPosition: {\n    type: 'accessor',\n    value: x => x.position\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getSize: {\n    type: 'accessor',\n    value: 32\n  },\n  getAngle: {\n    type: 'accessor',\n    value: 0\n  },\n  getHighlightColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getTextAnchor: {\n    type: 'accessor',\n    value: 'middle'\n  },\n  getAlignmentBaseline: {\n    type: 'accessor',\n    value: 'center'\n  },\n  getPixelOffset: {\n    type: 'accessor',\n    value: [0, 0]\n  }\n};\n\nfunction _ChromaticTextLayer(props) {\n  class __ChromaticTextLayer extends _base.base.deck.CompositeLayer {\n    updateState({\n      props,\n      oldProps,\n      changeFlags\n    }) {\n      const fontChanged = this.fontChanged(oldProps, props);\n\n      if (fontChanged) {\n        this.updateFontAtlas();\n      }\n\n      if (changeFlags.dataChanged || fontChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText)) {\n        this.transformStringToLetters();\n      }\n    }\n\n    updateFontAtlas() {\n      const {\n        gl\n      } = this.context;\n      const {\n        fontSettings,\n        fontFamily,\n        fontWeight,\n        characterSet\n      } = this.props;\n      const mergedFontSettings = Object.assign({}, _fontAtlas.DEFAULT_FONT_SETTINGS, fontSettings, {\n        fontFamily,\n        fontWeight,\n        characterSet\n      });\n      const {\n        scale,\n        mapping,\n        texture\n      } = (0, _fontAtlas.makeFontAtlas)(gl, mergedFontSettings);\n      this.setState({\n        scale,\n        iconAtlas: texture,\n        iconMapping: mapping\n      });\n    }\n\n    fontChanged(oldProps, props) {\n      if (oldProps.fontFamily !== props.fontFamily || oldProps.characterSet !== props.characterSet || oldProps.fontWeight !== props.fontWeight) {\n        return true;\n      }\n\n      if (oldProps.fontSettings === props.fontSettings) {\n        return false;\n      }\n\n      const oldFontSettings = oldProps.fontSettings || {};\n      const fontSettings = props.fontSettings || {};\n      return FONT_SETTINGS_PROPS.some(prop => oldFontSettings[prop] !== fontSettings[prop]);\n    }\n\n    getPickingInfo({\n      info\n    }) {\n      // because `TextLayer` assign the same pickingInfoIndex for one text label,\n      // here info.index refers the index of text label in props.data\n      return Object.assign(info, {\n        // override object with original data\n        object: info.index >= 0 ? this.props.data[info.index] : null\n      });\n    }\n    /* eslint-disable no-loop-func */\n\n\n    transformStringToLetters() {\n      const {\n        data,\n        getText\n      } = this.props;\n      const {\n        iconMapping\n      } = this.state;\n      const transformedData = [];\n      let objectIndex = 0;\n\n      for (const val of data) {\n        const text = getText(val);\n\n        if (text) {\n          const letters = Array.from(text);\n          const offsets = [0];\n          let offsetLeft = 0;\n          letters.forEach((letter, i) => {\n            const datum = {\n              text: letter,\n              index: i,\n              offsets,\n              len: text.length,\n              // reference of original object and object index\n              object: val,\n              objectIndex\n            };\n            const frame = iconMapping[letter];\n\n            if (frame) {\n              offsetLeft += frame.width;\n            } else {\n              //log.warn(`Missing character: ${letter}`)();\n              offsetLeft += MISSING_CHAR_WIDTH;\n            }\n\n            offsets.push(offsetLeft);\n            transformedData.push(datum);\n          });\n        }\n\n        objectIndex++;\n      }\n\n      this.setState({\n        data: transformedData\n      });\n    }\n    /* eslint-enable no-loop-func */\n\n\n    getLetterOffset(datum) {\n      return datum.offsets[datum.index];\n    }\n\n    getTextLength(datum) {\n      return datum.offsets[datum.offsets.length - 1];\n    }\n\n    _getAccessor(accessor) {\n      if (typeof accessor === 'function') {\n        return x => accessor(x.object);\n      }\n\n      return accessor;\n    }\n\n    getAnchorXFromTextAnchor(getTextAnchor) {\n      return x => {\n        const textAnchor = typeof getTextAnchor === 'function' ? getTextAnchor(x.object) : getTextAnchor;\n\n        if (!TEXT_ANCHOR.hasOwnProperty(textAnchor)) {\n          throw new Error(`Invalid text anchor parameter: ${textAnchor}`);\n        }\n\n        return TEXT_ANCHOR[textAnchor];\n      };\n    }\n\n    getAnchorYFromAlignmentBaseline(getAlignmentBaseline) {\n      return x => {\n        const alignmentBaseline = typeof getAlignmentBaseline === 'function' ? getAlignmentBaseline(x.object) : getAlignmentBaseline;\n\n        if (!ALIGNMENT_BASELINE.hasOwnProperty(alignmentBaseline)) {\n          throw new Error(`Invalid alignment baseline parameter: ${alignmentBaseline}`);\n        }\n\n        return ALIGNMENT_BASELINE[alignmentBaseline];\n      };\n    }\n\n    renderLayers() {\n      const {\n        data,\n        scale,\n        iconAtlas,\n        iconMapping\n      } = this.state;\n      const {\n        getPosition,\n        getColor,\n        getSize,\n        getAngle,\n        getHighlightColor,\n        getTextAnchor,\n        getAlignmentBaseline,\n        getPixelOffset,\n        fp64,\n        sdf,\n        sizeScale,\n        transitions,\n        updateTriggers\n      } = this.props;\n      const SubLayerClass = this.getSubLayerClass('characters', _chromaticMultiIconLayer.MultiIconLayer);\n      return new SubLayerClass({\n        sdf,\n        iconAtlas,\n        iconMapping,\n        getPosition: d => getPosition(d.object),\n        getColor: this._getAccessor(getColor),\n        getSize: this._getAccessor(getSize),\n        getAngle: this._getAccessor(getAngle),\n        getHighlightColor: this._getAccessor(getHighlightColor),\n        getAnchorX: this.getAnchorXFromTextAnchor(getTextAnchor),\n        getAnchorY: this.getAnchorYFromAlignmentBaseline(getAlignmentBaseline),\n        getPixelOffset: this._getAccessor(getPixelOffset),\n        fp64,\n        sizeScale: sizeScale * scale,\n        transitions: transitions && {\n          getPosition: transitions.getPosition,\n          getAngle: transitions.getAngle,\n          getHighlightColor: transitions.getHighlightColor,\n          getColor: transitions.getColor,\n          getSize: transitions.getSize,\n          getPixelOffset: updateTriggers.getPixelOffset\n        }\n      }, this.getSubLayerProps({\n        id: 'characters',\n        updateTriggers: {\n          getPosition: updateTriggers.getPosition,\n          getAngle: updateTriggers.getAngle,\n          getHighlightColor: updateTriggers.getHighlightColor,\n          getColor: updateTriggers.getColor,\n          getSize: updateTriggers.getSize,\n          getPixelOffset: updateTriggers.getPixelOffset,\n          getAnchorX: updateTriggers.getTextAnchor,\n          getAnchorY: updateTriggers.getAlignmentBaseline\n        }\n      }), {\n        data,\n        getIcon: d => d.text,\n        getShiftInQueue: d => this.getLetterOffset(d),\n        getLengthOfQueue: d => this.getTextLength(d)\n      });\n    }\n\n  }\n\n  __ChromaticTextLayer.layerName = 'TextLayer';\n  __ChromaticTextLayer.defaultProps = defaultProps;\n  const instance = new __ChromaticTextLayer(props);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * TextLayer - a modification of deck.gl's TextLayer.\n * This is instantiatable by calling `new TextLayer()`.\n */\n\n\nconst ChromaticTextLayer = _ChromaticTextLayer;\nexports.ChromaticTextLayer = ChromaticTextLayer;\n},{\"../base\":\"nnlJ\",\"./font-atlas\":\"q7nD\",\"./chromatic-multi-icon-layer/chromatic-multi-icon-layer\":\"sBB8\"}],\"gfAs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.concat = concat;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction concat(...args) {\n  return args.reduce((p, c) => c ? p.concat(c) : p, []);\n}\n},{}],\"kKa0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\nexports.default = _default;\n},{}],\"JuFU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createStage = createStage;\nexports.minPixelSize = exports.min3dDepth = exports.defaultView = exports.lineZ = exports.groupStrokeWidth = exports.defaultPresenterConfig = exports.defaultPresenterStyle = exports.minWidth = exports.minHeight = void 0;\nconst minHeight = '100px';\nexports.minHeight = minHeight;\nconst minWidth = '100px';\nexports.minWidth = minWidth;\nconst lightSettings = {\n  '2d': {},\n  '3d': {\n    lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n    ambientRatio: 0.3,\n    diffuseRatio: 0.6,\n    specularRatio: 0.4,\n    lightsStrength: [0.3, 0.0, 0.8, 0.0],\n    numberOfLights: 2\n  }\n};\nconst defaultPresenterStyle = {\n  cssPrefix: 'vega-deckgl-',\n  defaultCubeColor: [128, 128, 128, 255],\n  highlightColor: [0, 0, 0, 255],\n  lightSettings\n};\nexports.defaultPresenterStyle = defaultPresenterStyle;\nconst defaultPresenterConfig = {\n  onCubeClick: (e, cube) => {},\n  onCubeHover: (e, cube) => {},\n  transitionDurations: {\n    color: 100,\n    position: 600,\n    size: 600,\n    view: 600\n  }\n};\nexports.defaultPresenterConfig = defaultPresenterConfig;\n\nfunction createStage(view) {\n  const stage = {\n    view,\n    cubeData: [],\n    axes: {\n      x: [],\n      y: []\n    },\n    gridLines: [],\n    textData: [],\n    legend: {\n      rows: {}\n    },\n    facets: []\n  };\n  return stage;\n}\n\nconst groupStrokeWidth = 1;\nexports.groupStrokeWidth = groupStrokeWidth;\nconst lineZ = -1;\nexports.lineZ = lineZ;\nconst defaultView = '2d';\nexports.defaultView = defaultView;\nconst min3dDepth = 0.05;\nexports.min3dDepth = min3dDepth;\nconst minPixelSize = 0.5;\nexports.minPixelSize = minPixelSize;\n},{}],\"LG2Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${_defaults.minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${_defaults.minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_scale(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_scale(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_scale(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, offset, position_worldspace);\n\n  float lightWeight = 1.0;\n  \n  //allow for a small amount of error around the min3dDepth \n  if (instanceSizes.z >= ${_defaults.min3dDepth.toFixed(4)} - 0.0001) {\n    lightWeight = lighting_getLightWeight(\n      position_worldspace.xyz, // the w component is always 1.0\n      normals\n    );\n  }\n\n  vec3 lightWeightedColor = lightWeight * instanceColors.rgb;\n  vec3 mixedLight = mix(instanceColors.rgb, lightWeightedColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\nexports.default = _default;\n},{\"../defaults\":\"JuFU\"}],\"OJks\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CubeLayer = void 0;\n\nvar _cubeLayerFragment = _interopRequireDefault(require(\"./cube-layer-fragment.glsl\"));\n\nvar _cubeLayerVertex = _interopRequireDefault(require(\"./cube-layer-vertex.glsl\"));\n\nvar _base = require(\"../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/layers/src/grid-cell-layer/grid-cell-layer.js\n//https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\nconst UNSIGNED_BYTE = 0x1401;\nconst DEFAULT_COLOR = [255, 0, 255, 255];\nconst defaultProps = {\n  lightingMix: 0.5,\n  fp64: false,\n  getSize: x => x.size,\n  getPosition: x => x.position,\n  getColor: x => x.color\n};\n\nfunction _CubeLayer(props) {\n  //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n  class __CubeLayer extends _base.base.deck.Layer {\n    getShaders() {\n      const projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _cubeLayerVertex.default,\n        fs: _cubeLayerFragment.default,\n        modules: [projectModule, 'lighting', 'picking']\n      };\n    }\n\n    initializeState() {\n      const attributeManager = this.getAttributeManager();\n      attributeManager.addInstanced({\n        instancePositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getPosition'\n        },\n        instancePositions64xyLow: {\n          size: 3,\n          accessor: 'getPosition',\n          update: this.calculateInstancePositions64xyLow\n        },\n        instanceSizes: {\n          size: 3,\n          transition: true,\n          accessor: 'getSize'\n        },\n        instanceColors: {\n          size: 4,\n          type: UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getColor',\n          defaultValue: DEFAULT_COLOR\n        }\n      });\n    }\n\n    updateState({\n      props,\n      oldProps,\n      changeFlags\n    }) {\n      super.updateState({\n        props,\n        oldProps,\n        changeFlags\n      }); //TODO add parameter type to deck.gl-typings\n      // Re-generate model if geometry changed\n\n      if (props.fp64 !== oldProps.fp64) {\n        const {\n          gl\n        } = this.context;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n    }\n\n    _getModel(gl) {\n      return new _base.base.luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _base.base.luma.CubeGeometry(),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n\n    draw({\n      uniforms\n    }) {\n      let {\n        lightingMix\n      } = this.props;\n\n      if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n        lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n      }\n\n      this.state.model.render(Object.assign({}, uniforms, {\n        lightingMix\n      }));\n    }\n\n    calculateInstancePositions64xyLow(attribute) {\n      const isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      const {\n        data,\n        getPosition\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n\n      for (const point of data) {\n        const position = getPosition(point);\n        value[i++] = _base.base.luma.fp64.fp64LowPart(position[0]);\n        value[i++] = _base.base.luma.fp64.fp64LowPart(position[1]);\n      }\n    }\n\n  }\n\n  __CubeLayer.layerName = 'CubeLayer';\n  __CubeLayer.defaultProps = defaultProps;\n  const instance = new __CubeLayer(props);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * CubeLayer - a Deck.gl layer to render cuboids.\n * This is instantiatable by calling `new CubeLayer()`.\n */\n\n\nconst CubeLayer = _CubeLayer;\nexports.CubeLayer = CubeLayer;\n},{\"./cube-layer-fragment.glsl\":\"kKa0\",\"./cube-layer-vertex.glsl\":\"LG2Z\",\"../base\":\"nnlJ\"}],\"wV6r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linear = linear;\n\nfunction linear(t) {\n  return +t;\n}\n},{}],\"hUrk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.quadIn = quadIn;\nexports.quadOut = quadOut;\nexports.quadInOut = quadInOut;\n\nfunction quadIn(t) {\n  return t * t;\n}\n\nfunction quadOut(t) {\n  return t * (2 - t);\n}\n\nfunction quadInOut(t) {\n  return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n},{}],\"M57D\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cubicIn = cubicIn;\nexports.cubicOut = cubicOut;\nexports.cubicInOut = cubicInOut;\n\nfunction cubicIn(t) {\n  return t * t * t;\n}\n\nfunction cubicOut(t) {\n  return --t * t * t + 1;\n}\n\nfunction cubicInOut(t) {\n  return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n},{}],\"uaRh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.polyInOut = exports.polyOut = exports.polyIn = void 0;\nvar exponent = 3;\n\nvar polyIn = function custom(e) {\n  e = +e;\n\n  function polyIn(t) {\n    return Math.pow(t, e);\n  }\n\n  polyIn.exponent = custom;\n  return polyIn;\n}(exponent);\n\nexports.polyIn = polyIn;\n\nvar polyOut = function custom(e) {\n  e = +e;\n\n  function polyOut(t) {\n    return 1 - Math.pow(1 - t, e);\n  }\n\n  polyOut.exponent = custom;\n  return polyOut;\n}(exponent);\n\nexports.polyOut = polyOut;\n\nvar polyInOut = function custom(e) {\n  e = +e;\n\n  function polyInOut(t) {\n    return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n  }\n\n  polyInOut.exponent = custom;\n  return polyInOut;\n}(exponent);\n\nexports.polyInOut = polyInOut;\n},{}],\"Hzi1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sinIn = sinIn;\nexports.sinOut = sinOut;\nexports.sinInOut = sinInOut;\nvar pi = Math.PI,\n    halfPi = pi / 2;\n\nfunction sinIn(t) {\n  return 1 - Math.cos(t * halfPi);\n}\n\nfunction sinOut(t) {\n  return Math.sin(t * halfPi);\n}\n\nfunction sinInOut(t) {\n  return (1 - Math.cos(pi * t)) / 2;\n}\n},{}],\"MKko\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.expIn = expIn;\nexports.expOut = expOut;\nexports.expInOut = expInOut;\n\nfunction expIn(t) {\n  return Math.pow(2, 10 * t - 10);\n}\n\nfunction expOut(t) {\n  return 1 - Math.pow(2, -10 * t);\n}\n\nfunction expInOut(t) {\n  return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n}\n},{}],\"EaEa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.circleIn = circleIn;\nexports.circleOut = circleOut;\nexports.circleInOut = circleInOut;\n\nfunction circleIn(t) {\n  return 1 - Math.sqrt(1 - t * t);\n}\n\nfunction circleOut(t) {\n  return Math.sqrt(1 - --t * t);\n}\n\nfunction circleInOut(t) {\n  return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n},{}],\"SQ3i\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.bounceIn = bounceIn;\nexports.bounceOut = bounceOut;\nexports.bounceInOut = bounceInOut;\nvar b1 = 4 / 11,\n    b2 = 6 / 11,\n    b3 = 8 / 11,\n    b4 = 3 / 4,\n    b5 = 9 / 11,\n    b6 = 10 / 11,\n    b7 = 15 / 16,\n    b8 = 21 / 22,\n    b9 = 63 / 64,\n    b0 = 1 / b1 / b1;\n\nfunction bounceIn(t) {\n  return 1 - bounceOut(1 - t);\n}\n\nfunction bounceOut(t) {\n  return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nfunction bounceInOut(t) {\n  return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n},{}],\"yoXf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.backInOut = exports.backOut = exports.backIn = void 0;\nvar overshoot = 1.70158;\n\nvar backIn = function custom(s) {\n  s = +s;\n\n  function backIn(t) {\n    return t * t * ((s + 1) * t - s);\n  }\n\n  backIn.overshoot = custom;\n  return backIn;\n}(overshoot);\n\nexports.backIn = backIn;\n\nvar backOut = function custom(s) {\n  s = +s;\n\n  function backOut(t) {\n    return --t * t * ((s + 1) * t + s) + 1;\n  }\n\n  backOut.overshoot = custom;\n  return backOut;\n}(overshoot);\n\nexports.backOut = backOut;\n\nvar backInOut = function custom(s) {\n  s = +s;\n\n  function backInOut(t) {\n    return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n  }\n\n  backInOut.overshoot = custom;\n  return backInOut;\n}(overshoot);\n\nexports.backInOut = backInOut;\n},{}],\"DpDB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.elasticInOut = exports.elasticOut = exports.elasticIn = void 0;\nvar tau = 2 * Math.PI,\n    amplitude = 1,\n    period = 0.3;\n\nvar elasticIn = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticIn(t) {\n    return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n  }\n\n  elasticIn.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticIn.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticIn;\n}(amplitude, period);\n\nexports.elasticIn = elasticIn;\n\nvar elasticOut = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticOut(t) {\n    return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n  }\n\n  elasticOut.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticOut.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticOut;\n}(amplitude, period);\n\nexports.elasticOut = elasticOut;\n\nvar elasticInOut = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticInOut(t) {\n    return ((t = t * 2 - 1) < 0 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n  }\n\n  elasticInOut.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticInOut.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticInOut;\n}(amplitude, period);\n\nexports.elasticInOut = elasticInOut;\n},{}],\"bMsN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"easeLinear\", {\n  enumerable: true,\n  get: function () {\n    return _linear.linear;\n  }\n});\nObject.defineProperty(exports, \"easeQuad\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadInOut;\n  }\n});\nObject.defineProperty(exports, \"easeQuadIn\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadIn;\n  }\n});\nObject.defineProperty(exports, \"easeQuadOut\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadOut;\n  }\n});\nObject.defineProperty(exports, \"easeQuadInOut\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubic\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubicIn\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicIn;\n  }\n});\nObject.defineProperty(exports, \"easeCubicOut\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubicInOut\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicInOut;\n  }\n});\nObject.defineProperty(exports, \"easePoly\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyInOut;\n  }\n});\nObject.defineProperty(exports, \"easePolyIn\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyIn;\n  }\n});\nObject.defineProperty(exports, \"easePolyOut\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyOut;\n  }\n});\nObject.defineProperty(exports, \"easePolyInOut\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyInOut;\n  }\n});\nObject.defineProperty(exports, \"easeSin\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinInOut;\n  }\n});\nObject.defineProperty(exports, \"easeSinIn\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinIn;\n  }\n});\nObject.defineProperty(exports, \"easeSinOut\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinOut;\n  }\n});\nObject.defineProperty(exports, \"easeSinInOut\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinInOut;\n  }\n});\nObject.defineProperty(exports, \"easeExp\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expInOut;\n  }\n});\nObject.defineProperty(exports, \"easeExpIn\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expIn;\n  }\n});\nObject.defineProperty(exports, \"easeExpOut\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expOut;\n  }\n});\nObject.defineProperty(exports, \"easeExpInOut\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircle\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircleIn\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleIn;\n  }\n});\nObject.defineProperty(exports, \"easeCircleOut\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircleInOut\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounce\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounceIn\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceIn;\n  }\n});\nObject.defineProperty(exports, \"easeBounceOut\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounceInOut\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBack\", {\n  enumerable: true,\n  get: function () {\n    return _back.backInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBackIn\", {\n  enumerable: true,\n  get: function () {\n    return _back.backIn;\n  }\n});\nObject.defineProperty(exports, \"easeBackOut\", {\n  enumerable: true,\n  get: function () {\n    return _back.backOut;\n  }\n});\nObject.defineProperty(exports, \"easeBackInOut\", {\n  enumerable: true,\n  get: function () {\n    return _back.backInOut;\n  }\n});\nObject.defineProperty(exports, \"easeElastic\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticOut;\n  }\n});\nObject.defineProperty(exports, \"easeElasticIn\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticIn;\n  }\n});\nObject.defineProperty(exports, \"easeElasticOut\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticOut;\n  }\n});\nObject.defineProperty(exports, \"easeElasticInOut\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticInOut;\n  }\n});\n\nvar _linear = require(\"./linear\");\n\nvar _quad = require(\"./quad\");\n\nvar _cubic = require(\"./cubic\");\n\nvar _poly = require(\"./poly\");\n\nvar _sin = require(\"./sin\");\n\nvar _exp = require(\"./exp\");\n\nvar _circle = require(\"./circle\");\n\nvar _bounce = require(\"./bounce\");\n\nvar _back = require(\"./back\");\n\nvar _elastic = require(\"./elastic\");\n},{\"./linear\":\"wV6r\",\"./quad\":\"hUrk\",\"./cubic\":\"M57D\",\"./poly\":\"uaRh\",\"./sin\":\"Hzi1\",\"./exp\":\"MKko\",\"./circle\":\"EaEa\",\"./bounce\":\"SQ3i\",\"./back\":\"yoXf\",\"./elastic\":\"DpDB\"}],\"BGdw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLayers = getLayers;\nexports.getCubeLayer = getCubeLayer;\nexports.getCubes = getCubes;\n\nvar _base = require(\"./base\");\n\nvar _chromaticTextLayer = require(\"./chromatic-text-layer/chromatic-text-layer\");\n\nvar _array = require(\"./array\");\n\nvar _cubeLayer = require(\"./cube-layer/cube-layer\");\n\nvar _d3Ease = require(\"d3-ease\");\n\nvar _constants = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction getLayers(presenter, config, stage, lightSettings, lightingMix, interpolator, guideLines) {\n  const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n  const {\n    x,\n    y\n  } = stage.axes;\n  const lines = (0, _array.concat)(stage.gridLines, guideLines);\n  const texts = [...stage.textData];\n  [x, y].forEach(axes => {\n    axes.forEach(axis => {\n      if (axis.domain) lines.push(axis.domain);\n      if (axis.ticks) lines.push.apply(lines, axis.ticks);\n      if (axis.tickText) texts.push.apply(texts, axis.tickText);\n      if (axis.title) texts.push(axis.title);\n    });\n  });\n\n  if (stage.facets) {\n    stage.facets.forEach(f => {\n      if (f.lines) lines.push.apply(lines, f.lines);\n      if (f.facetTitle) texts.push(f.facetTitle);\n    });\n  }\n\n  const lineLayer = newLineLayer(_constants.layerNames.lines, lines);\n  const textLayer = newTextLayer(presenter, _constants.layerNames.text, texts, config, presenter.style.fontFamily);\n  return [textLayer, cubeLayer, lineLayer];\n}\n\nfunction newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings, lightingMix, interpolator) {\n  const getPosition = getTiming(config.transitionDurations.position, _d3Ease.easeExpInOut);\n  const getSize = getTiming(config.transitionDurations.size, _d3Ease.easeExpInOut);\n  const getColor = getTiming(config.transitionDurations.color);\n  const cubeLayerProps = {\n    interpolator,\n    lightingMix,\n    id: _constants.layerNames.cubes,\n    data: cubeData,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    pickable: true,\n    autoHighlight: true,\n    highlightColor,\n    onClick: (o, e) => {\n      config.onCubeClick(e && e.srcEvent, o.object);\n    },\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onCube = false;\n        config.onCubeHover(e && e.srcEvent, null);\n      } else {\n        presenter.deckgl.interactiveState.onCube = true;\n        config.onCubeHover(e && e.srcEvent, o.object);\n      }\n    },\n    lightSettings,\n    transitions: {\n      getPosition,\n      getColor,\n      getSize\n    }\n  };\n  return new _cubeLayer.CubeLayer(cubeLayerProps);\n}\n\nfunction newLineLayer(id, data) {\n  return new _base.base.layers.LineLayer({\n    id,\n    data,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    getColor: o => o.color,\n    getStrokeWidth: o => o.strokeWidth\n  });\n}\n\nfunction newTextLayer(presenter, id, data, config, fontFamily) {\n  const props = {\n    id,\n    data,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    autoHighlight: true,\n    pickable: true,\n    getHighlightColor: config.getTextHighlightColor || (o => o.color),\n    onClick: (o, e) => {\n      let pe = e && e.srcEvent; //handle iOS event\n\n      if (e.center) {\n        pe = {\n          clientX: e.center.x,\n          clientY: e.center.y\n        };\n      }\n\n      config.onTextClick && config.onTextClick(pe, o.object);\n    },\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onText = false;\n      } else {\n        presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n      }\n    },\n    getColor: config.getTextColor || (o => o.color),\n    getTextAnchor: o => o.textAnchor,\n    getSize: o => o.size,\n    getAngle: o => o.angle,\n    fontSettings: {\n      sdf: true,\n      fontSize: 128\n    }\n  };\n\n  if (fontFamily) {\n    props.fontFamily = fontFamily;\n  }\n\n  return new _chromaticTextLayer.ChromaticTextLayer(props);\n}\n\nfunction getTiming(duration, easing) {\n  let timing;\n\n  if (duration) {\n    timing = {\n      duration\n    };\n\n    if (easing) {\n      timing.easing = easing;\n    }\n  }\n\n  return timing;\n}\n\nfunction getCubeLayer(deckProps) {\n  return deckProps.layers.filter(layer => layer.id === _constants.layerNames.cubes)[0];\n}\n\nfunction getCubes(deckProps) {\n  const cubeLayer = getCubeLayer(deckProps);\n  if (!cubeLayer) return;\n  const cubeLayerProps = cubeLayer.props;\n  return cubeLayerProps.data;\n}\n},{\"./base\":\"nnlJ\",\"./chromatic-text-layer/chromatic-text-layer\":\"EoSk\",\"./array\":\"gfAs\",\"./cube-layer/cube-layer\":\"OJks\",\"d3-ease\":\"bMsN\",\"./constants\":\"ipKi\"}],\"y8T8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"addDiv\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.addDiv;\n  }\n});\nObject.defineProperty(exports, \"addEl\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.addEl;\n  }\n});\nObject.defineProperty(exports, \"outerSize\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.outerSize;\n  }\n});\nObject.defineProperty(exports, \"clone\", {\n  enumerable: true,\n  get: function () {\n    return _clone.clone;\n  }\n});\nObject.defineProperty(exports, \"deepMerge\", {\n  enumerable: true,\n  get: function () {\n    return _clone.deepMerge;\n  }\n});\nObject.defineProperty(exports, \"colorFromString\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorFromString;\n  }\n});\nObject.defineProperty(exports, \"colorIsEqual\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorIsEqual;\n  }\n});\nObject.defineProperty(exports, \"colorToString\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorToString;\n  }\n});\nObject.defineProperty(exports, \"isColor\", {\n  enumerable: true,\n  get: function () {\n    return _color.isColor;\n  }\n});\nObject.defineProperty(exports, \"getCubeLayer\", {\n  enumerable: true,\n  get: function () {\n    return _layers.getCubeLayer;\n  }\n});\nObject.defineProperty(exports, \"getCubes\", {\n  enumerable: true,\n  get: function () {\n    return _layers.getCubes;\n  }\n});\n\nvar _htmlHelpers = require(\"../htmlHelpers\");\n\nvar _clone = require(\"../clone\");\n\nvar _color = require(\"../color\");\n\nvar _layers = require(\"../layers\");\n},{\"../htmlHelpers\":\"todx\",\"../clone\":\"k3Ez\",\"../color\":\"yCoU\",\"../layers\":\"BGdw\"}],\"LdiJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.box = box;\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (item) {\n    var x1, y1, x2, y2;\n    x1 = item.x || 0;\n    y1 = item.y || 0;\n    x2 = item.x2 != null ? item.x2 : x1;\n    y2 = item.y2 != null ? item.y2 : y1;\n    const lineItem = styledLine(x1 + x - options.offsetX, y1 + y - options.offsetY, x2 + x - options.offsetX, y2 + y - options.offsetY, item.stroke, item.strokeWidth);\n\n    if (item.mark.role === 'axis-tick') {\n      options.currAxis.ticks.push(lineItem);\n    } else if (item.mark.role === 'axis-domain') {\n      options.currAxis.domain = lineItem;\n    } else {\n      stage.gridLines.push(lineItem);\n    }\n  });\n};\n\nfunction styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n  const line = {\n    sourcePosition: [x1, -y1, _defaults.lineZ],\n    targetPosition: [x2, -y2, _defaults.lineZ],\n    color: (0, _color.colorFromString)(stroke),\n    strokeWidth: strokeWidth * 10 //translate width to deck.gl\n\n  };\n  return line;\n}\n\nfunction box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n  const lines = [styledLine(gx, gy, gx + width, gy, stroke, strokeWidth), styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth), styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth), styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)];\n\n  if (diagonals) {\n    lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n    lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n  }\n\n  return lines;\n}\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"nnlJ\",\"../color\":\"yCoU\",\"../defaults\":\"JuFU\"}],\"tDiU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PresenterElement = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * HTML elements outputted by the presenter.\n */\nvar PresenterElement;\nexports.PresenterElement = PresenterElement;\n\n(function (PresenterElement) {\n  PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n  PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n  PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n  PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n  PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n})(PresenterElement || (exports.PresenterElement = PresenterElement = {}));\n},{}],\"r2Xb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initializePanel = initializePanel;\nexports.className = className;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _enums = require(\"./enums\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction initializePanel(presenter) {\n  const rootDiv = (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.root, presenter)\n  }, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.gl, presenter),\n    style: {\n      minHeight: _defaults.minHeight,\n      minWidth: _defaults.minWidth\n    }\n  }), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.panel, presenter)\n  }, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.vegaControls, presenter)\n  }), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.legend, presenter)\n  })));\n  (0, _tsxCreateElement.mount)(rootDiv, presenter.el);\n}\n\nfunction className(type, presenter) {\n  return `${presenter.style.cssPrefix}${_enums.PresenterElement[type]}`;\n}\n},{\"tsx-create-element\":\"QGtg\",\"./defaults\":\"JuFU\",\"./enums\":\"tDiU\"}],\"H2bu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createOrbitControllerClass = createOrbitControllerClass;\n\nvar _base = require(\"../base\");\n\nfunction createOrbitControllerClass(factoryOptions) {\n  function wrapper(props) {\n    class OrbitControllerInternal extends _base.base.deck._OrbitController {\n      constructor(props) {\n        super(props);\n        this.invertPan = true;\n      }\n\n      _onDoubleTap(event) {\n        if (factoryOptions && factoryOptions.doubleClickHandler) {\n          factoryOptions.doubleClickHandler(event, this);\n        } else {\n          super._onDoubleTap(event);\n        }\n      }\n\n      _onPanRotate(event) {\n        if (!this.dragRotate) {\n          return false;\n        }\n\n        return this._onPanRotateStandard(event);\n      }\n\n    }\n\n    const instance = new OrbitControllerInternal(props);\n    return instance;\n  }\n\n  return wrapper;\n}\n},{\"../base\":\"nnlJ\"}],\"KTEt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createDeckGLClassesForPresenter = createDeckGLClassesForPresenter;\n\nvar _base = require(\"../base\");\n\nvar _orbitController = require(\"./orbitController\");\n\n//adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\nconst CANVAS_STYLE = {\n  position: 'absolute',\n  left: 0,\n  top: 0,\n  width: '100%',\n  height: '100%'\n}; // Create canvas elements for map and deck\n\nfunction createCanvas(props) {\n  let {\n    container = document.body\n  } = props;\n\n  if (typeof container === 'string') {\n    container = document.getElementById(container);\n  }\n\n  if (!container) {\n    throw Error('Deck: container not found');\n  } // Add DOM elements\n\n\n  const containerStyle = window.getComputedStyle(container);\n\n  if (containerStyle.position === 'static') {\n    container.style.position = 'relative';\n  }\n\n  const deckCanvas = document.createElement('canvas');\n  container.appendChild(deckCanvas);\n  Object.assign(deckCanvas.style, CANVAS_STYLE);\n  return {\n    container,\n    deckCanvas\n  };\n}\n/**\n * Creates Deck.gl classes for rendering WebGL.\n * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n */\n\n\nfunction createDeckGLClassesForPresenter(factoryOptions) {\n  const OrbitControllerClass = (0, _orbitController.createOrbitControllerClass)(factoryOptions); //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n  //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n\n  function wrapper(props) {\n    /**\n     * @params container (Element) - DOM element to add deck.gl canvas to\n     * @params controller (Object) - Controller class. Leave empty for auto detection\n     */\n    class DeckGLInternal extends _base.base.deck.Deck {\n      constructor(props = {}) {\n        if (typeof document === 'undefined') {\n          // Not browser\n          throw Error('Deck can only be used in the browser');\n        }\n\n        const {\n          deckCanvas\n        } = createCanvas(props);\n        const viewState = props.initialViewState || props.viewState || {};\n        super(Object.assign({}, props, {\n          width: '100%',\n          height: '100%',\n          canvas: deckCanvas,\n          controller: OrbitControllerClass,\n          initialViewState: viewState\n        })); // Callback for the controller\n\n        this._updateViewState = params => {\n          if (this.onViewStateChange) {\n            this.onViewStateChange(params);\n          }\n        };\n      }\n\n      setProps(props) {\n        // this._updateViewState must be bound to `this`\n        // but we don't have access to the current instance before calling super().\n        if ('onViewStateChange' in props && this._updateViewState) {\n          // This is called at least once at _onRendererInitialized\n          this.onViewStateChange = props.onViewStateChange;\n          props.onViewStateChange = this._updateViewState;\n        }\n\n        super.setProps(props);\n      }\n\n    }\n\n    const instance = new DeckGLInternal(props);\n    return instance;\n  }\n\n  return {\n    OrbitControllerClass,\n    DeckGL_Class: wrapper\n  };\n}\n},{\"../base\":\"nnlJ\",\"./orbitController\":\"H2bu\"}],\"JaRI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LegendView = void 0;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _controls = require(\"./controls\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst LegendView = props => {\n  const rows = [];\n\n  const addRow = (row, i) => {\n    const fn = symbolMap[row.symbol.shape];\n    let jsx;\n\n    if (fn) {\n      jsx = fn(row.symbol);\n    } else {\n      jsx = (0, _tsxCreateElement.createElement)(\"span\", null, \"x\"); //console.log(`need to render ${row.symbol.shape} symbol shape`);\n    }\n\n    rows.push({\n      cells: [{\n        className: 'symbol',\n        content: jsx\n      }, {\n        className: 'label',\n        content: row.label,\n        title: row.label\n      }]\n    });\n  };\n\n  var sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n  sorted.forEach(i => addRow(props.legend.rows[i], +i));\n\n  if (sorted.length) {\n    return (0, _tsxCreateElement.createElement)(_controls.Table, {\n      rows: rows,\n      rowClassName: \"legend-row\",\n      onRowClick: (e, i) => props.onClick(e, props.legend, i)\n    }, props.legend.title !== void 0 && (0, _tsxCreateElement.createElement)(\"tr\", {\n      onClick: e => props.onClick(e, props.legend, null)\n    }, (0, _tsxCreateElement.createElement)(\"th\", {\n      colSpan: 2\n    }, props.legend.title)));\n  }\n};\n\nexports.LegendView = LegendView;\nconst symbolMap = {\n  square: function (symbol) {\n    return (0, _tsxCreateElement.createElement)(\"div\", {\n      style: {\n        height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n        width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n        backgroundColor: symbol.fill,\n        borderColor: symbol.fill\n      }\n    });\n  }\n};\n},{\"tsx-create-element\":\"QGtg\",\"./controls\":\"AQhe\"}],\"xmKH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LinearInterpolator = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction wrapper(props) {\n  class LinearInterpolatorInternal extends _base.base.deck.LinearInterpolator {\n    constructor(transitionProps) {\n      super(transitionProps);\n    }\n\n    interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n      if (this.layerStartProps && this.layerEndProps) {\n        this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n      }\n\n      return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n    }\n\n  }\n\n  const instance = new LinearInterpolatorInternal(props);\n  return instance;\n}\n\nconst LinearInterpolator = wrapper;\nexports.LinearInterpolator = LinearInterpolator;\n},{\"../base\":\"nnlJ\"}],\"eg4f\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.patchCubeArray = patchCubeArray;\n\nfunction patchCubeArray(allocatedSize, empty, cubes) {\n  const patched = new Array(allocatedSize);\n  patched.fill(empty);\n  cubes.forEach(cube => patched[cube.ordinal] = cube);\n  return patched;\n}\n},{}],\"bdVG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst legendMap = {\n  'legend-title': function (legend, textItem) {\n    legend.title = textItem.text;\n  },\n  'legend-symbol': function (legend, symbol) {\n    const {\n      bounds,\n      fill,\n      shape\n    } = symbol; //this object is safe for serialization\n\n    const legendRowSymbol = {\n      bounds,\n      fill,\n      shape\n    };\n    const i = symbol.datum.index;\n    legend.rows[i] = legend.rows[i] || {};\n    legend.rows[i].symbol = legendRowSymbol;\n  },\n  'legend-label': function (legend, label) {\n    const i = label.datum.index;\n    legend.rows[i] = legend.rows[i] || {};\n    const row = legend.rows[i];\n    row.label = label.text;\n    row.value = label.datum.value;\n  }\n};\n\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (item) {\n    const fn = legendMap[item.mark.role];\n\n    if (fn) {\n      fn(stage.legend, item);\n    } else {//console.log(`need to render legend ${item.mark.role}`);\n    }\n  });\n};\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"nnlJ\"}],\"e5xB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  let i = 0;\n\n  _base.base.vega.sceneVisit(scene, function (item) {\n    //for orthographic (2d) - always use 0 or else Deck will not show them\n    const z = stage.view === '2d' ? 0 : item.z || 0;\n    const depth = (stage.view === '2d' ? 0 : item.depth || 0) + _defaults.min3dDepth; //change direction of y from SVG to GL\n\n    const ty = -1;\n    let ordinal = i;\n\n    if (item.datum.GL_ORDINAL !== void 0) {\n      options.ordinalsSpecified = true;\n      ordinal = item.datum.GL_ORDINAL;\n\n      if (ordinal > options.maxOrdinal) {\n        options.maxOrdinal = ordinal;\n      }\n    }\n\n    const cube = {\n      ordinal,\n      size: [item.width, item.height, depth],\n      position: [x + (item.x || 0) - options.offsetX, ty * (y + (item.y || 0) - options.offsetY) - item.height, z],\n      color: (0, _color.colorFromString)(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n    };\n    cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n    stage.cubeData.push(cube);\n    i++;\n  });\n};\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"nnlJ\",\"../color\":\"yCoU\",\"../defaults\":\"JuFU\"}],\"U2Rd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  //scale Deck.Gl text to Vega size\n  const fontScale = 6; //Deck.gl centers text on Y. TODO: is this correct on x axis?\n\n  const offsetYCenter = 16; //change direction of y from SVG to GL\n\n  const ty = -1;\n\n  _base.base.vega.sceneVisit(scene, function (item) {\n    if (!item.text) return;\n    const size = item.fontSize * fontScale;\n    const textItem = {\n      color: (0, _color.colorFromString)(item.fill),\n      text: item.text.toString(),\n      position: [x + item.x - options.offsetX, ty * (y + item.y + offsetYCenter - options.offsetY), 0],\n      size,\n      angle: convertAngle(item.angle),\n      textAnchor: convertAlignment(item.align),\n      alignmentBaseline: convertBaseline(item.baseline)\n    };\n\n    if (item.mark.role === 'axis-label') {\n      const tickText = textItem;\n      tickText.value = item.datum.value;\n      options.currAxis.tickText.push(tickText);\n    } else if (item.mark.role === 'axis-title') {\n      options.currAxis.title = textItem;\n    } else if (options.currFacetRect && !options.currFacetRect.facetTitle) {\n      options.currFacetRect.facetTitle = textItem;\n    } else {\n      stage.textData.push(textItem);\n    }\n  });\n};\n\nfunction convertAngle(vegaTextAngle) {\n  if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n    return 360 - vegaTextAngle;\n  }\n\n  return 0;\n}\n\nfunction convertAlignment(textAlign) {\n  switch (textAlign) {\n    case 'center':\n      return 'middle';\n\n    case 'left':\n      return 'start';\n\n    case 'right':\n      return 'end';\n  }\n\n  return 'start';\n}\n\nfunction convertBaseline(baseline) {\n  switch (baseline) {\n    case 'middle':\n      return 'center';\n  }\n\n  return baseline || 'bottom';\n}\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"nnlJ\",\"../color\":\"yCoU\"}],\"nMFB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.GroupType = void 0;\nvar GroupType;\nexports.GroupType = GroupType;\n\n(function (GroupType) {\n  GroupType[GroupType[\"none\"] = 0] = \"none\";\n  GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n  GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n  GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n})(GroupType || (exports.GroupType = GroupType = {}));\n},{}],\"nVwG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sceneToStage = sceneToStage;\n\nvar _legend = _interopRequireDefault(require(\"./marks/legend\"));\n\nvar _rect = _interopRequireDefault(require(\"./marks/rect\"));\n\nvar _rule = _interopRequireWildcard(require(\"./marks/rule\"));\n\nvar _text = _interopRequireDefault(require(\"./marks/text\"));\n\nvar _base = require(\"./base\");\n\nvar _color = require(\"./color\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _interfaces = require(\"./marks/interfaces\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction convertGroupRole(group) {\n  if (group.mark.role === 'legend') return _interfaces.GroupType.legend;\n\n  if (group.mark.role === 'axis') {\n    var vegaAxisDatum = group.datum;\n\n    if (vegaAxisDatum) {\n      switch (vegaAxisDatum.orient) {\n        case 'bottom':\n        case 'top':\n          return _interfaces.GroupType.xAxis;\n\n        case 'left':\n        case 'right':\n          return _interfaces.GroupType.yAxis;\n      }\n    }\n  }\n}\n\nconst group = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (g) {\n    if (g.bounds.x1 < options.offsetX) {\n      options.offsetX = g.bounds.x1;\n    }\n\n    if (g.bounds.y1 < options.offsetY) {\n      options.offsetY = g.bounds.y1;\n    }\n\n    const gx = g.x || 0,\n          gy = g.y || 0;\n\n    if (g.context && g.context.background && !stage.backgroundColor) {\n      stage.backgroundColor = (0, _color.colorFromString)(g.context.background);\n    }\n\n    if (g.stroke) {\n      const facetRect = {\n        lines: (0, _rule.box)(gx + x - options.offsetX, gy + y - options.offsetY, g.height, g.width, g.stroke, _defaults.groupStrokeWidth)\n      };\n      stage.facets.push(facetRect);\n      options.currFacetRect = facetRect;\n    }\n\n    groupType = convertGroupRole(g) || groupType;\n    setCurrentAxis(options, stage, groupType); // draw group contents\n\n    _base.base.vega.sceneVisit(g, function (item) {\n      mainStager(options, stage, item, gx + x, gy + y, groupType);\n    });\n  });\n};\n\nfunction setCurrentAxis(options, stage, groupType) {\n  let axes;\n\n  switch (groupType) {\n    case _interfaces.GroupType.xAxis:\n      axes = stage.axes.x;\n      break;\n\n    case _interfaces.GroupType.yAxis:\n      axes = stage.axes.y;\n      break;\n\n    default:\n      return;\n  }\n\n  options.currAxis = {\n    domain: null,\n    tickText: [],\n    ticks: []\n  };\n  axes.push(options.currAxis);\n}\n\nconst markStagers = {\n  group,\n  legend: _legend.default,\n  rect: _rect.default,\n  rule: _rule.default,\n  text: _text.default\n};\n\nvar mainStager = (options, stage, scene, x, y, groupType) => {\n  if (scene.marktype !== 'group' && groupType === _interfaces.GroupType.legend) {\n    (0, _legend.default)(options, stage, scene, x, y, groupType);\n  } else {\n    var markStager = markStagers[scene.marktype];\n\n    if (markStager) {\n      markStager(options, stage, scene, x, y, groupType);\n    } else {//console.log(`need to render ${scene.marktype}`);\n    }\n  }\n};\n\nfunction sceneToStage(options, stage, scene) {\n  mainStager(options, stage, scene, 0, 0, null);\n  sortAxis(stage.axes.x, 0);\n  sortAxis(stage.axes.y, 1);\n}\n\nfunction sortAxis(axes, dim) {\n  axes.forEach(axis => {\n    if (axis.domain) orderDomain(axis.domain, dim);\n    axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n    axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n  });\n}\n\nfunction orderDomain(domain, dim) {\n  if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n    const temp = domain.targetPosition;\n    domain.targetPosition = domain.sourcePosition;\n    domain.sourcePosition = temp;\n  }\n}\n},{\"./marks/legend\":\"bdVG\",\"./marks/rect\":\"e5xB\",\"./marks/rule\":\"LdiJ\",\"./marks/text\":\"U2Rd\",\"./base\":\"nnlJ\",\"./color\":\"yCoU\",\"./defaults\":\"JuFU\",\"./marks/interfaces\":\"nMFB\"}],\"PXqU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.targetViewState = targetViewState;\nexports.viewStateProps = void 0;\nconst viewStateProps = ['distance', 'fov', 'lookAt', 'rotationOrbit', 'rotationX', 'zoom'];\nexports.viewStateProps = viewStateProps;\n\nfunction targetViewState(height, width, view) {\n  const distance = 10;\n  const fov = 60;\n  const lookAt = [width / 2, -height / 2, 0]; //add a 4th dimension to make transitions work\n\n  lookAt.push(1);\n\n  if (view === '2d') {\n    return {\n      distance,\n      fov,\n      lookAt,\n      rotationOrbit: 0,\n      rotationX: 0,\n      zoom: 10 / height\n    };\n  } else {\n    return {\n      distance,\n      fov,\n      lookAt,\n      rotationOrbit: -25,\n      rotationX: 60,\n      zoom: 9 / height\n    };\n  }\n}\n},{}],\"Ft4K\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Presenter = void 0;\n\nvar _base = require(\"./base\");\n\nvar _rule = require(\"./marks/rule\");\n\nvar _panel = require(\"./panel\");\n\nvar _color = require(\"./color\");\n\nvar _deckgl = require(\"./deck.gl-classes/deckgl\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _clone = require(\"./clone\");\n\nvar _d3Ease = require(\"d3-ease\");\n\nvar _layers = require(\"./layers\");\n\nvar _legend = require(\"./legend\");\n\nvar _linearInterpolator = require(\"./deck.gl-classes/linearInterpolator\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _patchedCubeArray = require(\"./patchedCubeArray\");\n\nvar _enums = require(\"./enums\");\n\nvar _stagers = require(\"./stagers\");\n\nvar _viewState = require(\"./viewState\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Class which presents a Stage of chart data using Deck.gl to render.\n */\nclass Presenter {\n  /**\n   * Instantiate a new Presenter.\n   * @param el Parent HTMLElement to present within.\n   * @param style Optional PresenterStyle styling options.\n   */\n  constructor(el, style) {\n    this.el = el;\n    this.style = (0, _clone.deepMerge)(_defaults.defaultPresenterStyle, style);\n    (0, _panel.initializePanel)(this);\n    this._last = {\n      view: null,\n      height: null,\n      width: null,\n      cubeCount: null,\n      stage: null\n    };\n  }\n  /**\n   * Get the previously rendered Stage object.\n   */\n\n\n  get stage() {\n    return this._last.stage;\n  }\n  /**\n   * Get the current View camera type.\n   */\n\n\n  get view() {\n    return this._last.view;\n  }\n  /**\n   * Cancels any pending animation, calling animationCanceled() on original queue.\n   */\n\n\n  animationCancel() {\n    if (this.animationTimer) {\n      clearTimeout(this.animationTimer);\n      this.animationTimer = null;\n\n      if (this.logger) {\n        this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || 'handler'}`);\n      }\n\n      if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n        this.queuedAnimationOptions.animationCanceled.call(null);\n      }\n    }\n  }\n  /**\n   * Stops the current animation and queues a new animation.\n   * @param handler Function to invoke when timeout is complete.\n   * @param timeout Length of time to wait before invoking the handler.\n   * @param options Optional QueuedAnimationOptions object.\n   */\n\n\n  animationQueue(handler, timeout, options) {\n    if (this.logger) {\n      this.logger(`queueing animation ${options && options.waitingLabel || 'waiting'}...`);\n    }\n\n    this.animationCancel();\n    this.animationTimer = setTimeout(() => {\n      if (this.logger) {\n        this.logger(`queueing animation ${options && options.handlerLabel || 'handler'}...`);\n      }\n\n      handler();\n    }, timeout);\n  }\n  /**\n   * Retrieve a sub-element of the rendered output.\n   * @param type PresenterElement type of the HTMLElement to retrieve.\n   */\n\n\n  getElement(type) {\n    const elements = this.el.getElementsByClassName((0, _panel.className)(type, this));\n\n    if (elements && elements.length) {\n      return elements[0];\n    }\n  }\n  /**\n   * Present the Vega Scene, or Stage object using Deck.gl.\n   * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n   * @param height Height of the rendering area.\n   * @param width Width of the rendering area.\n   * @param config Optional presentation configuration object.\n   */\n\n\n  present(sceneOrStage, height, width, config) {\n    this.animationCancel();\n    let scene = sceneOrStage;\n    let stage;\n    let options = {\n      offsetX: 0,\n      offsetY: 0,\n      maxOrdinal: -1,\n      ordinalsSpecified: false,\n      currAxis: null,\n      currFacetRect: null,\n      defaultCubeColor: this.style.defaultCubeColor\n    }; //determine if this is a vega scene\n\n    if (scene.marktype) {\n      stage = (0, _defaults.createStage)(scene.view);\n      (0, _stagers.sceneToStage)(options, stage, scene);\n    } else {\n      stage = sceneOrStage;\n    }\n\n    if (!this.deckgl) {\n      const classes = (0, _deckgl.createDeckGLClassesForPresenter)({\n        doubleClickHandler: () => {\n          this.homeCamera();\n        }\n      });\n      this.OrbitControllerClass = classes.OrbitControllerClass;\n      const deckProps = {\n        onLayerClick: config && config.onLayerClick,\n        views: [new _base.base.deck.OrbitView({\n          controller: this.OrbitControllerClass\n        })],\n        container: this.getElement(_enums.PresenterElement.gl),\n        getCursor: interactiveState => {\n          if (interactiveState.onText || interactiveState.onAxisSelection) {\n            return 'pointer';\n          } else if (interactiveState.onCube) {\n            return 'default';\n          } else {\n            return 'grab';\n          }\n        }\n      };\n\n      if (stage.backgroundColor) {\n        deckProps.style = {\n          'background-color': (0, _color.colorToString)(stage.backgroundColor)\n        };\n      }\n\n      this.deckgl = new classes.DeckGL_Class(deckProps);\n    }\n\n    let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n\n    if (options.ordinalsSpecified) {\n      cubeCount = Math.max(cubeCount, options.maxOrdinal + 1);\n      const empty = {\n        isEmpty: true,\n        color: [0, 0, 0, 0] // possibly a bug in Deck.gl? set color to invisible.\n\n      };\n      stage.cubeData = (0, _patchedCubeArray.patchCubeArray)(cubeCount, empty, stage.cubeData);\n    }\n\n    this.setDeckProps(stage, height, width, cubeCount, config);\n    (0, _tsxCreateElement.mount)((0, _legend.LegendView)({\n      legend: stage.legend,\n      onClick: config && config.onLegendClick\n    }), this.getElement(_enums.PresenterElement.legend));\n\n    if (config && config.onPresent) {\n      config.onPresent();\n    }\n  }\n  /**\n   * Present the same recently rendered Stage with only slight modifications such as a color change,\n   * using the previous Stage values as a basis.\n   * @param stage Partially populated Stage object containing changes.\n   * @param modifyConfig Optional presentation configuration object.\n   */\n\n\n  rePresent(stage, modifyConfig) {\n    const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n    this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n  }\n\n  isNewBounds(view, height, width, cubeCount) {\n    const lastBounds = this.lastBounds();\n\n    for (let prop in lastBounds) {\n      if (lastBounds[prop] === null) return true;\n    }\n\n    const newBounds = {\n      cubeCount,\n      height,\n      view,\n      width\n    };\n\n    for (let prop in lastBounds) {\n      if (lastBounds[prop] !== newBounds[prop]) return true;\n    }\n  }\n\n  lastBounds() {\n    const {\n      cubeCount,\n      height,\n      view,\n      width\n    } = this._last;\n    return {\n      cubeCount,\n      height,\n      view,\n      width\n    };\n  }\n\n  setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n    const config = (0, _clone.deepMerge)(_defaults.defaultPresenterConfig, modifyConfig);\n    const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n    let lightSettings = this.style.lightSettings[stage.view];\n    let lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n    let linearInterpolator; //choose the current OrbitView viewstate if possible\n\n    let viewState = this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView || //otherwise use the initial viewstate if any\n    this.deckgl.props.viewState;\n\n    if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n      viewState = (0, _viewState.targetViewState)(height, width, stage.view);\n      const oldCubeLayer = (0, _layers.getCubeLayer)(this.deckgl.props);\n\n      if (oldCubeLayer) {\n        linearInterpolator = new _linearInterpolator.LinearInterpolator(_viewState.viewStateProps);\n        linearInterpolator.layerStartProps = {\n          lightingMix: oldCubeLayer.props.lightingMix\n        };\n        linearInterpolator.layerEndProps = {\n          lightingMix\n        };\n        viewState.transitionDuration = config.transitionDurations.view;\n        viewState.transitionEasing = _d3Ease.easeExpInOut;\n        viewState.transitionInterpolator = linearInterpolator;\n      }\n\n      if (stage.view === '2d') {\n        lightSettings = this.style.lightSettings['3d'];\n      }\n    }\n\n    const guideLines = this._showGuides && (0, _rule.box)(0, 0, height, width, '#0f0', 1, true);\n    config.preLayer && config.preLayer(stage);\n    const layers = (0, _layers.getLayers)(this, config, stage, lightSettings, lightingMix, linearInterpolator, guideLines);\n    const deckProps = {\n      views: [new _base.base.deck.OrbitView({\n        controller: this.OrbitControllerClass\n      })],\n      viewState,\n      layers\n    };\n\n    if (config && config.preStage) {\n      config.preStage(stage, deckProps);\n    }\n\n    this.deckgl.setProps(deckProps);\n    delete stage.cubeData;\n    this._last = {\n      cubeCount,\n      height,\n      width,\n      stage: stage,\n      view: stage.view\n    };\n  }\n  /**\n   * Home the camera to the last initial position.\n   */\n\n\n  homeCamera() {\n    const viewState = (0, _viewState.targetViewState)(this._last.height, this._last.width, this._last.view);\n    viewState.transitionDuration = _defaults.defaultPresenterConfig.transitionDurations.view;\n    viewState.transitionEasing = _d3Ease.easeExpInOut;\n    viewState.transitionInterpolator = new _linearInterpolator.LinearInterpolator(_viewState.viewStateProps);\n    const deckProps = {\n      views: this.deckgl.props.views,\n      viewState,\n      layers: this.deckgl.props.layers\n    };\n    this.deckgl.setProps(deckProps);\n  }\n  /**\n   * Get cube data array from the cubes layer.\n   */\n\n\n  getCubeData() {\n    return (0, _layers.getCubes)(this.deckgl.props);\n  }\n  /**\n   * Show guidelines of rendering height/width and center of OrbitView.\n   */\n\n\n  showGuides() {\n    this._showGuides = true;\n    this.getElement(_enums.PresenterElement.gl).classList.add('show-center');\n    this.rePresent(Object.assign(Object.assign({}, this._last.stage), {\n      cubeData: this.getCubeData()\n    }));\n  }\n\n  finalize() {\n    this.animationCancel();\n    if (this.deckgl) this.deckgl.finalize();\n    if (this.el) this.el.innerHTML = '';\n    this._last = null;\n    this.deckgl = null;\n    this.el = null;\n    this.logger = null;\n    this.queuedAnimationOptions = null;\n  }\n\n}\n\nexports.Presenter = Presenter;\n},{\"./base\":\"nnlJ\",\"./marks/rule\":\"LdiJ\",\"./panel\":\"r2Xb\",\"./color\":\"yCoU\",\"./deck.gl-classes/deckgl\":\"KTEt\",\"./defaults\":\"JuFU\",\"./clone\":\"k3Ez\",\"d3-ease\":\"bMsN\",\"./layers\":\"BGdw\",\"./legend\":\"JaRI\",\"./deck.gl-classes/linearInterpolator\":\"xmKH\",\"tsx-create-element\":\"QGtg\",\"./patchedCubeArray\":\"eg4f\",\"./enums\":\"tDiU\",\"./stagers\":\"nVwG\",\"./viewState\":\"PXqU\"}],\"ySLZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.RendererGl = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n//pass in the SuperClass, which should be a vega.View\nfunction _RendererGl(loader) {\n  //dynamic superclass, since we don't know have vega.View in the declaration phase\n  class RendererGlInternal extends _base.base.vega.Renderer {\n    initialize(el, width, height, origin) {\n      this.height = height;\n      this.width = width; // this method will invoke resize to size the canvas appropriately\n\n      return super.initialize(el, width, height, origin);\n    }\n\n    resize(width, height, origin) {\n      super.resize(width, height, origin);\n      this.origin = origin;\n      this.height = height;\n      this.width = width; //rteturn this for vega\n\n      return this;\n    }\n\n    _render(scene, items) {\n      const scene3d = scene;\n      scene3d.view = this.getView();\n      this.presenter.present(scene3d, this.height, this.width, this.presenterConfig); //return this for vega\n\n      return this;\n    }\n\n  }\n\n  const instance = new RendererGlInternal(loader);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n * This is instantiated by ViewGl.\n */\n\n\nconst RendererGl = _RendererGl;\nexports.RendererGl = RendererGl;\n},{\"../base\":\"nnlJ\"}],\"C81u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ViewGl = void 0;\n\nvar _base = require(\"../base\");\n\nvar _defaults = require(\"../defaults\");\n\nvar _presenter = require(\"../presenter\");\n\nvar _enums = require(\"../enums\");\n\nvar _rendererGl = require(\"./rendererGl\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nlet registered = false; //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n//pass in the SuperClass, which should be a vega.View\n\nfunction _ViewGl(runtime, config) {\n  //dynamic superclass, since we don't know have vega.View in the declaration phase\n  class ViewGlInternal extends _base.base.vega.View {\n    constructor(runtime, config = {}) {\n      super(runtime, config);\n      this.config = config;\n      this.presenter = config.presenter;\n      config.presenterConfig = config.presenterConfig || {};\n\n      config.presenterConfig.redraw = () => {\n        this._redraw = true; //use Vega View private member _redraw\n\n        this.run();\n      };\n    }\n\n    renderer(renderer) {\n      if (renderer === 'deck.gl' && !registered) {\n        _base.base.vega.renderModule('deck.gl', {\n          handler: _base.base.vega.CanvasHandler,\n          renderer: _rendererGl.RendererGl\n        });\n\n        registered = true;\n      }\n\n      return super.renderer(renderer);\n    }\n\n    initialize(el) {\n      if (!this.presenter) {\n        this.presenter = new _presenter.Presenter(el);\n      }\n\n      super.initialize(this.presenter.getElement(_enums.PresenterElement.vegaControls));\n      const renderer = this._renderer;\n      renderer.presenterConfig = this.config.presenterConfig;\n      renderer.presenter = this.presenter;\n\n      renderer.getView = this.config && this.config.getView || (() => this.presenter.view || _defaults.defaultView);\n\n      return this;\n    }\n\n    error(e) {\n      if (this.presenter.logger) {\n        this.presenter.logger(e);\n      }\n    }\n\n  }\n\n  const instance = new ViewGlInternal(runtime, config);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.View, with added properties for accessing a Presenter.\n * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n */\n\n\nconst ViewGl = _ViewGl;\nexports.ViewGl = ViewGl;\n},{\"../base\":\"nnlJ\",\"../defaults\":\"JuFU\",\"../presenter\":\"Ft4K\",\"../enums\":\"tDiU\",\"./rendererGl\":\"ySLZ\"}],\"Uns8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar _exportNames = {\n  constants: true,\n  controls: true,\n  types: true,\n  util: true,\n  defaults: true,\n  base: true,\n  use: true,\n  Presenter: true,\n  ViewGl: true\n};\nObject.defineProperty(exports, \"base\", {\n  enumerable: true,\n  get: function () {\n    return _base.base;\n  }\n});\nObject.defineProperty(exports, \"use\", {\n  enumerable: true,\n  get: function () {\n    return _base.use;\n  }\n});\nObject.defineProperty(exports, \"Presenter\", {\n  enumerable: true,\n  get: function () {\n    return _presenter.Presenter;\n  }\n});\nObject.defineProperty(exports, \"ViewGl\", {\n  enumerable: true,\n  get: function () {\n    return _viewGl.ViewGl;\n  }\n});\nexports.defaults = exports.util = exports.types = exports.controls = exports.constants = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar controls = _interopRequireWildcard(require(\"./exports/controls\"));\n\nexports.controls = controls;\n\nvar types = _interopRequireWildcard(require(\"./exports/types\"));\n\nexports.types = types;\n\nvar util = _interopRequireWildcard(require(\"./exports/util\"));\n\nexports.util = util;\n\nvar defaults = _interopRequireWildcard(require(\"./defaults\"));\n\nexports.defaults = defaults;\n\nvar _base = require(\"./base\");\n\nvar _presenter = require(\"./presenter\");\n\nvar _viewGl = require(\"./vega-classes/viewGl\");\n\nvar _enums = require(\"./enums\");\n\nObject.keys(_enums).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _enums[key];\n    }\n  });\n});\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./constants\":\"ipKi\",\"./exports/controls\":\"P7sC\",\"./exports/types\":\"lvA6\",\"./exports/util\":\"y8T8\",\"./defaults\":\"JuFU\",\"./base\":\"nnlJ\",\"./presenter\":\"Ft4K\",\"./vega-classes/viewGl\":\"C81u\",\"./enums\":\"tDiU\"}],\"SLia\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getColumnsFromData = getColumnsFromData;\nexports.inferAll = inferAll;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"../vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction isQuantitative(column) {\n  return column.type === 'number' || column.type === 'integer';\n}\n/**\n * Derive column metadata from the data array.\n * @param data Array of data objects.\n */\n\n\nfunction getColumnsFromData(data, columnTypes) {\n  const sample = data[0];\n  const fields = sample ? Object.keys(sample) : [];\n  const inferences = Object.assign(Object.assign({}, VegaDeckGl.base.vega.inferTypes(data, fields)), columnTypes);\n  const columns = fields.map(name => {\n    const column = {\n      name,\n      type: inferences[name]\n    };\n    return column;\n  });\n  inferAll(columns, data);\n  return columns;\n}\n/**\n * Populate columns with type inferences and stats.\n * @param columns Array of columns.\n * @param data Array of data objects.\n */\n\n\nfunction inferAll(columns, data) {\n  columns.forEach(column => {\n    if (column) {\n      if (typeof column.quantitative !== 'boolean') {\n        column.quantitative = isQuantitative(column);\n      }\n\n      if (column.type === 'string') {\n        checkIsColorData(data, column);\n      }\n\n      if (!column.stats) {\n        column.stats = getStats(data, column);\n      }\n    }\n  });\n}\n\nfunction checkIsColorData(data, column) {\n  for (let i = 0; i < data.length; i++) {\n    if (!VegaDeckGl.util.isColor(data[i][column.name])) {\n      return;\n    }\n  }\n\n  column.isColorData = true;\n}\n\nfunction getStats(data, column) {\n  const distinctMap = {};\n  const stats = {\n    distinctValueCount: null,\n    max: null,\n    mean: null,\n    min: null\n  };\n  let sum = 0;\n\n  for (let i = 0; i < data.length; i++) {\n    let row = data[i];\n    let value = row[column.name];\n    distinctMap[value] = true;\n\n    if (stats.max === null || value > stats.max) {\n      stats.max = value;\n    }\n\n    if (stats.min === null || value < stats.min) {\n      stats.min = value;\n    }\n\n    let num = +value;\n\n    if (!isNaN(num)) {\n      sum += num;\n    }\n\n    if (column.type === 'string' && !stats.hasColorData && VegaDeckGl.util.isColor(value)) {\n      stats.hasColorData = true;\n    }\n  }\n\n  if (column.quantitative) {\n    stats.mean = data.length > 0 && sum / data.length;\n    stats.hasNegative = detectNegative(column, data);\n\n    if (column.type === 'integer') {\n      stats.isSequential = detectSequentialColumn(column, data);\n    }\n  }\n\n  stats.distinctValueCount = Object.keys(distinctMap).length;\n  return stats;\n}\n\nfunction detectNegative(column, data) {\n  for (let i = 1; i < data.length; i++) {\n    if (data[i][column.name] < 0) return true;\n  }\n\n  return false;\n}\n\nfunction detectSequentialColumn(column, data) {\n  if (data.length < 2) return false;\n  let colname = column.name;\n\n  for (let i = 1; i < data.length; i++) {\n    if (data[i][colname] !== data[i - 1][colname] + 1) return false;\n  }\n\n  return true;\n}\n},{\"../vega-deck.gl\":\"Uns8\"}],\"G0Md\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPresenterStyle = getPresenterStyle;\nexports.dualColorSchemeColors = exports.cssPrefix = exports.defaultViewerOptions = void 0;\n\nvar _defaults = require(\"./vega-deck.gl/defaults\");\n\nvar _color = require(\"./vega-deck.gl/color\");\n\nconst defaultViewerOptions = {\n  colors: {\n    activeCube: [128, 0, 128, 255],\n    defaultCube: _defaults.defaultPresenterStyle.defaultCubeColor,\n    hoveredCube: _defaults.defaultPresenterStyle.highlightColor,\n    selectedCube: [255, 255, 0, 255],\n    axisSelectHighlight: [128, 128, 128, 128],\n    axisLine: [0, 0, 0, 255],\n    axisText: [0, 0, 0, 255],\n    cellFillerLine: [128, 128, 128, 255],\n    unselectedColorMethod: color => {\n      const c = (0, _color.desaturate)(color, 0.05);\n      c[3] = 171;\n      return c;\n    }\n  },\n  language: {\n    headers: {\n      chart: 'Chart',\n      details: 'Details',\n      legend: 'Legend',\n      selection: 'Select & Filter'\n    },\n    bing: 'bing',\n    newColorMap: 'remap color to filtered items',\n    oldColorMap: 'keep same colors',\n    deselect: 'deselect',\n    exclude: 'exclude',\n    isolate: 'isolate',\n    legendOther: 'other',\n    nextDetail: '>',\n    previousDetail: '<',\n    reset: 'reset',\n    colorBinCount: 'Color bin count',\n    colorReverse: 'Color reverse',\n    count: 'Count',\n    scatterPointSize: 'Point size',\n    XBinSize: 'X axis bin size',\n    YBinSize: 'Y axis bin size',\n    XGridSize: 'X grid size',\n    YGridSize: 'Y grid size',\n    InnerPaddingSize: 'Inner padding size',\n    OuterPaddingSize: 'Outer padding size',\n    treeMapMethod: 'Method',\n    facetColumns: 'Facet columns',\n    facetRows: 'Facet rows',\n    markOpacitySignal: 'Mark opacity',\n    textScaleSignal: 'Text scale',\n    xAxisTextAngleSignal: 'X axis text angle',\n    yAxisTextAngleSignal: 'Y axis text angle',\n    zScaleProportion: 'Z scale proportion to Y',\n    selectionCount: count => `${count} items selected`\n  },\n  maxLegends: 19,\n  onError: errors => {//console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n  },\n  transitionDurations: Object.assign(Object.assign({}, _defaults.defaultPresenterConfig.transitionDurations), {\n    scope: 600\n  }),\n  selectionPolygonZ: -1,\n  tickSize: 10,\n  facetMargins: {\n    column: 40,\n    row: 40,\n    title: 40\n  }\n};\nexports.defaultViewerOptions = defaultViewerOptions;\n\nfunction getPresenterStyle(options) {\n  var style = {\n    cssPrefix,\n    fontFamily: options.fontFamily,\n    defaultCubeColor: options.colors.defaultCube\n  };\n\n  if (options.colors.hoveredCube) {\n    style.highlightColor = options.colors.hoveredCube;\n  }\n\n  if (options.lightSettings) {\n    style.lightSettings = options.lightSettings;\n  }\n\n  return style;\n}\n\nconst cssPrefix = 'sanddance-';\nexports.cssPrefix = cssPrefix;\nconst dualColorSchemeColors = {\n  black: '#212121',\n  gray: '#D2D2D2',\n  blue: '#0060F0',\n  green: '#00C000',\n  orange: '#FF9900',\n  red: '#E00000'\n};\nexports.dualColorSchemeColors = dualColorSchemeColors;\n},{\"./vega-deck.gl/defaults\":\"JuFU\",\"./vega-deck.gl/color\":\"yCoU\"}],\"BTLl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isInternalFieldName = isInternalFieldName;\nObject.defineProperty(exports, \"getColumnsFromData\", {\n  enumerable: true,\n  get: function () {\n    return _inference.getColumnsFromData;\n  }\n});\nObject.defineProperty(exports, \"inferAll\", {\n  enumerable: true,\n  get: function () {\n    return _inference.inferAll;\n  }\n});\nObject.defineProperty(exports, \"ensureSearchExpressionGroupArray\", {\n  enumerable: true,\n  get: function () {\n    return _group.ensureSearchExpressionGroupArray;\n  }\n});\nObject.defineProperty(exports, \"getPresenterStyle\", {\n  enumerable: true,\n  get: function () {\n    return _defaults.getPresenterStyle;\n  }\n});\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"./vega-deck.gl/constants\");\n\nvar _inference = require(\"./specs/inference\");\n\nvar _group = require(\"./searchExpression/group\");\n\nvar _defaults = require(\"./defaults\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction isInternalFieldName(columnName, includeVegaDeckGLFields = false) {\n  if (includeVegaDeckGLFields) {\n    if (columnName === _constants2.GL_ORDINAL) return true;\n  }\n\n  for (let f in _constants.FieldNames) {\n    if (columnName === _constants.FieldNames[f]) return true;\n  }\n\n  return false;\n}\n},{\"./constants\":\"Syc7\",\"./vega-deck.gl/constants\":\"ipKi\",\"./specs/inference\":\"SLia\",\"./searchExpression/group\":\"yy6X\",\"./defaults\":\"G0Md\"}],\"kNpg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.registerColorSchemes = registerColorSchemes;\nexports.colorSchemes = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"./vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nvar _defaults = require(\"./defaults\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst dualPairs = [[_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.gray], [_defaults.dualColorSchemeColors.red, _defaults.dualColorSchemeColors.green], [_defaults.dualColorSchemeColors.red, _defaults.dualColorSchemeColors.blue], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.red], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.orange], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.green]];\n/**\n * Array of color schemes.\n */\n\nconst colorSchemes = [{\n  scheme: _constants.ColorScaleNone,\n  colors: [VegaDeckGl.util.colorToString(_defaults.defaultViewerOptions.colors.defaultCube)]\n}];\nexports.colorSchemes = colorSchemes;\ncreateDualColorSchemes();\n\nfunction registerColorSchemes(vega) {\n  colorSchemes.forEach(cs => {\n    if (cs.colors.length === 1) {\n      vega.scheme(cs.scheme, x => cs.colors[0]);\n    } else {\n      vega.scheme(cs.scheme, cs.colors);\n    }\n  });\n}\n\nfunction createPair(names, colors) {\n  const scheme = `dual_${names[0]}${names[1]}`;\n  colorSchemes.push({\n    scheme,\n    colors\n  });\n}\n\nfunction createDualColorSchemes() {\n  dualPairs.forEach(colors => {\n    const names = colors.map(color => {\n      for (let key in _defaults.dualColorSchemeColors) if (color === _defaults.dualColorSchemeColors[key]) return key;\n    });\n    createPair(names, colors);\n    createPair([...names].reverse(), [...colors].reverse());\n  });\n}\n},{\"./vega-deck.gl\":\"Uns8\",\"./specs/constants\":\"b0rV\",\"./defaults\":\"G0Md\"}],\"U1OZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Animator = exports.DataLayoutChange = void 0;\nvar DataLayoutChange;\nexports.DataLayoutChange = DataLayoutChange;\n\n(function (DataLayoutChange) {\n  DataLayoutChange[DataLayoutChange[\"same\"] = 0] = \"same\";\n  DataLayoutChange[DataLayoutChange[\"reset\"] = 1] = \"reset\";\n  DataLayoutChange[DataLayoutChange[\"refine\"] = 2] = \"refine\";\n})(DataLayoutChange || (exports.DataLayoutChange = DataLayoutChange = {}));\n\nclass Animator {\n  constructor(dataScope, props) {\n    this.dataScope = dataScope;\n    this.props = props;\n  }\n\n  select(search) {\n    return new Promise((resolve, reject) => {\n      this.dataScope.select(search);\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  deselect() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deselect();\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  filter(search, keepData, collapseData) {\n    this.dataScope.collapse(true, collapseData);\n    return new Promise((resolve, reject) => {\n      this.props.onAnimateDataChange(DataLayoutChange.refine, 'before refine', 'refine').then(() => {\n        this.dataScope.deselect();\n        this.dataScope.filteredData = keepData;\n        this.props.onDataChanged(DataLayoutChange.refine, search);\n        resolve();\n      }).catch(reject);\n    });\n  }\n\n  reset() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deselect();\n      this.dataScope.filteredData = null;\n      this.props.onAnimateDataChange(DataLayoutChange.reset, 'before reset', 'reset').then(() => {\n        this.dataScope.collapse(false);\n        this.props.onDataChanged(DataLayoutChange.reset);\n        resolve();\n      }).catch(reject);\n    });\n  }\n\n  activate(datum) {\n    return new Promise((resolve, reject) => {\n      this.dataScope.activate(datum);\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  deactivate() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deactivate();\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n}\n\nexports.Animator = Animator;\n},{}],\"PfBA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getSelectedColorMap = getSelectedColorMap;\nexports.colorMapFromCubes = colorMapFromCubes;\nexports.populateColorContext = populateColorContext;\nexports.applyColorMapToCubes = applyColorMapToCubes;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"./vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction getSelectedColorMap(currentData, showSelectedData, showActive, viewerOptions) {\n  function getSelectionColorItem(datum) {\n    let item;\n\n    if (showSelectedData) {\n      item = datum[_constants.FieldNames.Selected] ? {\n        color: viewerOptions.colors.selectedCube\n      } : {\n        unSelected: true\n      };\n    }\n\n    if (showActive && datum[_constants.FieldNames.Active]) {\n      item = {\n        color: viewerOptions.colors.activeCube\n      };\n    }\n\n    return item;\n  }\n\n  const colorMap = {};\n  currentData.forEach(datum => {\n    const selectionColor = getSelectionColorItem(datum);\n\n    if (selectionColor) {\n      const ordinal = datum[VegaDeckGl.constants.GL_ORDINAL];\n      colorMap[ordinal] = selectionColor;\n    }\n  });\n  return colorMap;\n}\n\nfunction colorMapFromCubes(cubes) {\n  const map = {};\n  cubes.forEach(cube => {\n    map[cube.ordinal] = {\n      color: cube.color\n    };\n  });\n  return map;\n}\n\nfunction populateColorContext(colorContext, presenter) {\n  if (!colorContext.colorMap) {\n    const cubes = presenter.getCubeData();\n    colorContext.colorMap = colorMapFromCubes(cubes);\n  }\n\n  colorContext.legend = VegaDeckGl.util.clone(presenter.stage.legend);\n  colorContext.legendElement = presenter.getElement(VegaDeckGl.PresenterElement.legend).children[0];\n}\n\nfunction applyColorMapToCubes(maps, cubes, unselectedColorMethod) {\n  Object.keys(maps[0]).forEach(ordinal => {\n    const cube = cubes[+ordinal];\n\n    if (cube && !cube.isEmpty) {\n      const actualColorMappedItem = maps[0][ordinal];\n\n      if (maps.length > 1) {\n        const selectedColorMappedItem = maps[1][ordinal];\n\n        if (selectedColorMappedItem) {\n          if (selectedColorMappedItem.unSelected && unselectedColorMethod) {\n            cube.color = unselectedColorMethod(actualColorMappedItem.color);\n          } else {\n            cube.color = selectedColorMappedItem.color;\n          }\n\n          return;\n        }\n      }\n\n      cube.color = actualColorMappedItem.color;\n    }\n  });\n}\n},{\"./vega-deck.gl\":\"Uns8\",\"./specs/constants\":\"b0rV\"}],\"jmI2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.applySignalValues = applySignalValues;\nexports.extractSignalValuesFromView = extractSignalValuesFromView;\n\nfunction applySignalValues(sv, b) {\n  if (!sv || !b || !b.signals || !b.signals.length) return;\n\n  for (let key in sv) {\n    let value = sv[key];\n    let signalB = b.signals.filter(signal => signal.name === key)[0];\n\n    if (signalB && signalB.bind) {\n      signalB.value = value;\n    }\n  }\n}\n\nfunction extractSignalValuesFromView(view, spec) {\n  if (!view || !spec || !spec.signals || !spec.signals.length) return;\n  const result = {};\n  spec.signals.forEach(signalA => {\n    //bound to a UI control\n    if (signalA.bind) {\n      try {\n        result[signalA.name] = view.signal(signalA.name);\n      } catch (e) {// continue regardless of error\n      }\n    }\n  });\n  return result;\n}\n},{}],\"dxn8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.assignOrdinals = assignOrdinals;\nexports.getSpecColumns = getSpecColumns;\nexports.getDataIndexOfCube = getDataIndexOfCube;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"./vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction assignOrdinals(columns, data, ordinalMap) {\n  const uCol = columns.uid && columns.uid.name;\n\n  if (ordinalMap) {\n    data.forEach((d, i) => {\n      const key = uCol ? d[uCol] : i;\n      d[VegaDeckGl.constants.GL_ORDINAL] = ordinalMap[key];\n    });\n  } else {\n    ordinalMap = {};\n    data.forEach((d, i) => {\n      d[VegaDeckGl.constants.GL_ORDINAL] = i;\n      const uColValue = uCol ? d[uCol] : i;\n      ordinalMap[uColValue] = i;\n    });\n  }\n\n  return ordinalMap;\n}\n\nfunction getSpecColumns(insight, columns) {\n  function getColumnByName(name) {\n    return columns.filter(c => c.name === name)[0];\n  }\n\n  return {\n    color: getColumnByName(insight.columns && insight.columns.color),\n    facet: getColumnByName(insight.columns && insight.columns.facet),\n    group: getColumnByName(insight.columns && insight.columns.group),\n    size: getColumnByName(insight.columns && insight.columns.size),\n    sort: getColumnByName(insight.columns && insight.columns.sort),\n    uid: getColumnByName(insight.columns && insight.columns.uid),\n    x: getColumnByName(insight.columns && insight.columns.x),\n    y: getColumnByName(insight.columns && insight.columns.y),\n    z: getColumnByName(insight.columns && insight.columns.z)\n  };\n}\n\nfunction getDataIndexOfCube(cube, data) {\n  const len = data.length;\n\n  for (let i = 0; i < len; i++) {\n    if (data[i][VegaDeckGl.constants.GL_ORDINAL] === cube.ordinal) {\n      return i;\n    }\n  }\n}\n},{\"./vega-deck.gl\":\"Uns8\"}],\"Ifgo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.facetSignals = facetSignals;\nexports.checkForFacetErrors = checkForFacetErrors;\nexports.facetSize = facetSize;\nexports.layout = layout;\nexports.facetBinStep = facetBinStep;\nexports.facetSourceData = facetSourceData;\nexports.facetGroupData = facetGroupData;\nexports.facetTransforms = facetTransforms;\nexports.facetMarks = facetMarks;\nexports.facetTitleSeparator = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"../vega-deck.gl\");\n\nconst FacetColumnsSequence = 'FacetColumnsSequence';\nconst FacetRowsSequence = 'FacetRowsSequence';\nconst SequenceNumber = 'SequenceNumber';\nconst CellTitle = 'CellTitle';\nconst CellFiller = 'CellFiller';\nconst facetTitleSeparator = ' - ';\nexports.facetTitleSeparator = facetTitleSeparator;\n\nfunction facetSignals(context) {\n  const {\n    insight\n  } = context;\n  const {\n    facets\n  } = insight;\n  const signals = [{\n    name: _constants.SignalNames.FacetColumns,\n    value: facets.columns\n  }, {\n    name: _constants.SignalNames.FacetRows,\n    value: facets.rows\n  }];\n  return signals;\n}\n\nfunction checkForFacetErrors(facets, errors) {\n  if (facets) {\n    const gridCapacity = facets.columns * facets.rows;\n\n    if (!gridCapacity) {\n      errors.push('Must set facets columns & rows to non-zero.');\n    }\n\n    if (gridCapacity < 2) {\n      errors.push('Not enough facets to facet.');\n    }\n\n    if (!facets.columns || facets.columns < 1) {\n      errors.push('Facet column columns must be greater than 1.');\n    }\n\n    if (!facets.rows || facets.rows < 1) {\n      errors.push('Facet column rows must be greater than 1.');\n    }\n  }\n}\n\nfunction facetSize(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const {\n    facets,\n    size\n  } = insight;\n  return {\n    height: (size.height - (facets.rows + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.column)) / facets.columns,\n    width: (size.width - (facets.columns + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.row)) / facets.rows\n  };\n}\n\nfunction layout(context) {\n  const {\n    specViewOptions\n  } = context;\n  const layout = {\n    columns: {\n      signal: _constants.SignalNames.FacetColumns\n    },\n    bounds: 'full',\n    padding: {\n      column: specViewOptions.facetMargins.column,\n      row: specViewOptions.facetMargins.row\n    }\n  };\n  return layout;\n}\n\nfunction facetBinStep(facetColumn, facetCount) {\n  const range = facetColumn.stats.max - facetColumn.stats.min;\n  return range / facetCount;\n}\n\nfunction emptyBinsDataSource(name, facetColumn, facets) {\n  const gridCapacity = facets.columns * facets.rows;\n  const step = facetBinStep(facetColumn, gridCapacity);\n  const steps = [];\n\n  for (let i = 0; i < gridCapacity; i++) {\n    steps[i] = facetColumn.stats.min + i * step + step / 2;\n  }\n\n  const values = steps.map(s => {\n    const obj = {};\n    obj[_constants.FieldNames.Collapsed] = true;\n    obj[facetColumn.name] = s;\n    return obj;\n  });\n  const data = {\n    name,\n    values\n  };\n  return data;\n}\n\nfunction facetSourceData(facetColumn, facets, name) {\n  let data;\n\n  if (facetColumn && facetColumn.quantitative) {\n    data = [{\n      name: _constants.DataNames.Pre\n    }, emptyBinsDataSource(_constants.DataNames.EmptyBin, facetColumn, facets), {\n      name,\n      source: [_constants.DataNames.Pre, _constants.DataNames.EmptyBin]\n    }];\n  } else {\n    data = [{\n      name\n    }];\n  }\n\n  return data;\n}\n\nfunction facetGroupData(source) {\n  const data = [{\n    name: _constants.DataNames.FacetCellTitles,\n    source,\n    transform: [{\n      type: 'aggregate',\n      groupby: [CellTitle]\n    }]\n  }, {\n    name: CellFiller,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      step: 1,\n      stop: {\n        signal: `${_constants.SignalNames.FacetColumns} * ${_constants.SignalNames.FacetRows} - length(data('${_constants.DataNames.FacetCellTitles}'))`\n      }\n    }]\n  }, {\n    name: FacetColumnsSequence,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      stop: {\n        signal: _constants.SignalNames.FacetColumns\n      },\n      as: SequenceNumber\n    }]\n  }, {\n    name: FacetRowsSequence,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      stop: {\n        signal: _constants.SignalNames.FacetRows\n      },\n      as: SequenceNumber\n    }]\n  }];\n  return data;\n}\n\nfunction facetTransforms(facetColumn, facets) {\n  let transforms;\n\n  if (facetColumn.quantitative) {\n    const gridCapacity = facets.columns * facets.rows;\n    const step = facetBinStep(facetColumn, gridCapacity);\n    transforms = [{\n      type: 'bin',\n      field: facetColumn.name,\n      step,\n      nice: false,\n      extent: [facetColumn.stats.min, facetColumn.stats.max],\n      as: [_constants.FieldNames.FacetBin0, _constants.FieldNames.FacetBin1]\n    }, {\n      type: 'collect',\n      sort: {\n        field: _constants.FieldNames.FacetBin0\n      }\n    }, {\n      type: 'formula',\n      expr: `format(datum.${_constants.FieldNames.FacetBin0}, '~r') + '${facetTitleSeparator}' + format(datum.${_constants.FieldNames.FacetBin1}, '~r')`,\n      as: CellTitle\n    }];\n  } else {\n    transforms = [{\n      type: 'formula',\n      expr: `datum[${JSON.stringify(facetColumn.name)}]`,\n      as: CellTitle\n    }];\n  }\n\n  return transforms;\n}\n\nfunction facetMarks(specViewOptions, sourceDataName, childMarks, childAxes, childData) {\n  //TODO: create a style\n  const cellFillerLineColor = _vegaDeck.util.colorToString(specViewOptions.colors.cellFillerLine);\n\n  const style = 'cell';\n  const mark = {\n    style,\n    type: 'group',\n    from: {\n      facet: {\n        name: _constants.DataNames.FacetGroupCell,\n        data: sourceDataName,\n        groupby: [CellTitle]\n      }\n    },\n    title: {\n      frame: 'group',\n      offset: specViewOptions.facetMargins.title,\n      text: {\n        signal: `parent['${CellTitle}']`\n      },\n      limit: {\n        signal: 'width'\n      },\n      color: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n      fontSize: {\n        signal: _constants.SignalNames.TextSize\n      }\n    },\n    encode: {\n      update: {\n        width: {\n          signal: 'width'\n        },\n        height: {\n          signal: 'height'\n        }\n      }\n    },\n    data: childData,\n    marks: childMarks.map(mark => {\n      if (mark.from && mark.from.data && mark.from.data === sourceDataName) {\n        mark.from.data = _constants.DataNames.FacetGroupCell;\n      }\n\n      return mark;\n    })\n  };\n\n  if (childAxes) {\n    mark.axes = childAxes.map(axis => {\n      const clone = _vegaDeck.util.clone(axis); //remove all labels and titles\n\n\n      clone.labels = false;\n      delete clone.title;\n      delete clone.titleAlign;\n      delete clone.titleAngle;\n      delete clone.titleFontSize;\n      return clone;\n    });\n  }\n\n  const filler = {\n    style: 'cell',\n    type: 'group',\n    from: {\n      data: CellFiller\n    },\n    title: {\n      frame: 'group',\n      offset: specViewOptions.facetMargins.title,\n      text: '',\n      fontSize: {\n        signal: _constants.SignalNames.TextSize\n      }\n    },\n    encode: {\n      update: {\n        width: {\n          signal: 'width'\n        },\n        height: {\n          signal: 'height'\n        }\n      }\n    }\n  };\n\n  if (childAxes) {\n    filler.axes = childAxes.map(axis => {\n      const clone = _vegaDeck.util.clone(axis); //remove all labels and titles\n\n\n      clone.labels = false;\n      delete clone.title;\n      delete clone.titleAlign;\n      delete clone.titleAngle;\n      delete clone.titleFontSize; //change tick & domain color\n\n      clone.tickColor = cellFillerLineColor;\n      clone.domainColor = cellFillerLineColor;\n      return clone;\n    });\n  }\n\n  const rowHeader = {\n    type: 'group',\n    role: 'row-header',\n    from: {\n      facet: {\n        name: 'row-headers',\n        data: FacetRowsSequence,\n        groupby: [SequenceNumber]\n      }\n    }\n  };\n\n  if (childAxes) {\n    rowHeader.axes = [cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'left')[0], specViewOptions.facetMargins.column)];\n  }\n\n  const columnFooter = {\n    type: 'group',\n    role: 'column-footer',\n    from: {\n      facet: {\n        name: 'column-footers',\n        data: FacetColumnsSequence,\n        groupby: [SequenceNumber]\n      }\n    }\n  };\n\n  if (childAxes) {\n    columnFooter.axes = [cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'bottom')[0], specViewOptions.facetMargins.row)];\n  }\n\n  const marks = [mark, filler, rowHeader, columnFooter];\n  return marks;\n}\n\nfunction cloneAndOffsetAxis(axis, margin) {\n  if (axis) {\n    const clone = _vegaDeck.util.clone(axis);\n\n    clone.offset = margin;\n    return clone;\n  }\n}\n},{\"./constants\":\"b0rV\",\"../vega-deck.gl\":\"Uns8\"}],\"JTcr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.notNice = notNice;\nexports.selectNullOrEmpty = selectNullOrEmpty;\nexports.selectExact = selectExact;\nexports.selectNone = selectNone;\nexports.selectExactAxis = selectExactAxis;\nexports.selectBetween = selectBetween;\nexports.selectBetweenAxis = selectBetweenAxis;\nexports.selectBetweenFacet = selectBetweenFacet;\n\nvar _facet = require(\"./specs/facet\");\n\nfunction notNice(niceValue) {\n  //convert \"nice\" numbers to numeric value\n  return (niceValue + '').replace(/,/g, '');\n}\n\nfunction tickValue(axis, i) {\n  const tick = axis.tickText[i];\n  let value;\n\n  if (tick) {\n    value = axis.tickText[i].value;\n  }\n\n  return {\n    tick,\n    value\n  };\n}\n\nfunction selectNullOrEmpty(column) {\n  const searchExpression = {\n    name: column.name,\n    operator: 'isnullorEmpty'\n  };\n  return searchExpression;\n}\n\nfunction selectExact(column, value) {\n  if (value == null) {\n    return selectNullOrEmpty(column);\n  }\n\n  const searchExpression = {\n    name: column.name,\n    operator: '==',\n    value\n  };\n  return searchExpression;\n}\n\nfunction selectNone(column, values) {\n  const expressions = values.map((value, i) => {\n    const searchExpression = {\n      name: column.name,\n      operator: '!=',\n      value\n    };\n\n    if (i) {\n      searchExpression.clause = '&&';\n    }\n\n    return searchExpression;\n  });\n  const searchExpressionGroup = {\n    expressions\n  };\n  return searchExpressionGroup;\n}\n\nfunction selectExactAxis(axis, column, i) {\n  const result = tickValue(axis, i);\n\n  if (result.tick) {\n    return selectExact(column, result.value);\n  }\n}\n\nfunction selectBetween(column, lowValue, highValue, lowOperator = '>=', highOperator = '<') {\n  const expressions = [];\n\n  if (lowValue !== undefined) {\n    expressions.push({\n      name: column.name,\n      operator: lowOperator,\n      value: lowValue\n    });\n  }\n\n  if (highValue !== undefined) {\n    expressions.push({\n      name: column.name,\n      operator: highOperator,\n      value: highValue\n    });\n  }\n\n  if (expressions.length > 1) {\n    expressions[1].clause = '&&';\n  }\n\n  const searchExpressionGroup = {\n    expressions\n  };\n  return searchExpressionGroup;\n}\n\nfunction selectBetweenAxis(axis, column, i) {\n  const low = tickValue(axis, i);\n  const high = tickValue(axis, i + 1);\n  return selectBetween(column, low.value, high.value);\n}\n\nfunction selectBetweenFacet(column, title, isFirst, isLast) {\n  const values = title.split(_facet.facetTitleSeparator);\n  return selectBetween(column, isFirst ? undefined : values[0], isLast ? undefined : values[1]);\n}\n},{\"./specs/facet\":\"Ifgo\"}],\"oIzg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.axisSelectionLayer = axisSelectionLayer;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"./vega-deck.gl\"));\n\nvar _expression = require(\"./expression\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction axisSelectionLayer(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n  const polygons = [];\n  const xRole = specCapabilities.roles.filter(r => r.role === 'x')[0];\n\n  if (xRole && xRole.axisSelection) {\n    stage.axes.x.filter(axis => axis.tickText.length).forEach(axis => {\n      polygons.push.apply(polygons, axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n    });\n  }\n\n  const yRole = specCapabilities.roles.filter(r => r.role === 'y')[0];\n\n  if (yRole && yRole.axisSelection) {\n    stage.axes.y.filter(axis => axis.tickText.length).forEach(axis => {\n      polygons.push.apply(polygons, axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n    });\n  }\n\n  if (stage.facets) {\n    polygons.push.apply(polygons, facetSelectionPolygons(stage.facets, columns.facet));\n  } //move polygons to Z\n\n\n  polygons.forEach(datum => {\n    datum.polygon.forEach(p => {\n      p[2] = polygonZ;\n    });\n  });\n\n  const onClick = (o, e) => clickHandler(e.srcEvent, o.object.search);\n\n  const polygonLayer = new VegaDeckGl.base.layers.PolygonLayer({\n    autoHighlight: true,\n    coordinateSystem: VegaDeckGl.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    data: polygons,\n    extruded: false,\n    highlightColor,\n    id: 'selections',\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onAxisSelection = false;\n      } else {\n        presenter.deckgl.interactiveState.onAxisSelection = true;\n      }\n    },\n    onClick,\n    getElevation: () => 0,\n    getFillColor: () => [0, 0, 0, 0],\n    pickable: true,\n    stroked: false\n  });\n  return polygonLayer;\n}\n\nfunction axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n  const polygons = [];\n  const size = 50;\n  const getSearch = axisSelectionType === 'exact' ? (a, c, i) => ({\n    expressions: [(0, _expression.selectExactAxis)(a, c, i)]\n  }) : _expression.selectBetweenAxis;\n  const {\n    domain,\n    ticks\n  } = axis;\n\n  if (ticks.length > 0 && domain) {\n    const dim = vertical ? 1 : 0;\n    const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n    let divisions;\n\n    if (between) {\n      divisions = [];\n\n      for (let i = 1; i < ticks.length; i++) {\n        divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n      }\n    } else {\n      divisions = ticks.slice(1, -1).map(tick => tick.sourcePosition[dim]);\n    }\n\n    const add = (p2, i) => {\n      var coords = [[p1, q1], [p2, q1], [p2, q2], [p1, q2]];\n      polygons.push({\n        search: getSearch(axis, column, i),\n        polygon: vertical ? coords.map(xy => xy.reverse()) : coords\n      });\n      p1 = p2;\n    };\n\n    let p1 = domain.sourcePosition[dim];\n    const q1 = domain.sourcePosition[vertical ? 0 : 1];\n    const q2 = q1 - size;\n    divisions.forEach(add);\n    add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n  }\n\n  return polygons;\n}\n\nfunction facetSelectionPolygons(facetRects, facetColumn) {\n  const polygons = [];\n  facetRects.forEach((facetRect, i) => {\n    //take any 2 lines to get a box dimension\n    const [x, y] = minMaxPoints(facetRect.lines.slice(2));\n    const search = facetRect.facetTitle ? facetColumn.quantitative ? (0, _expression.selectBetweenFacet)(facetColumn, facetRect.facetTitle.text, i === 0, i === facetRects.length - 1) : {\n      expressions: [(0, _expression.selectExact)(facetColumn, facetRect.facetTitle.text)]\n    } : {\n      expressions: [(0, _expression.selectNullOrEmpty)(facetColumn)]\n    };\n    polygons.push({\n      search,\n      polygon: [[x.min, y.min], [x.max, y.min], [x.max, y.max], [x.min, y.max]]\n    });\n  });\n  return polygons;\n}\n\nfunction minMaxPoints(lines) {\n  const points = [];\n  lines.forEach(line => {\n    [line.sourcePosition, line.targetPosition].forEach(point => {\n      points.push(point);\n    });\n  });\n  return [0, 1].map(dim => {\n    let minMax = {\n      min: null,\n      max: null\n    };\n    points.forEach(point => {\n      if (minMax.max == null) {\n        minMax.max = point[dim];\n      } else {\n        minMax.max = Math.max(minMax.max, point[dim]);\n      }\n\n      if (minMax.min == null) {\n        minMax.min = point[dim];\n      } else {\n        minMax.min = Math.min(minMax.min, point[dim]);\n      }\n    });\n    return minMax;\n  });\n}\n},{\"./vega-deck.gl\":\"Uns8\",\"./expression\":\"JTcr\"}],\"v7Oc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.BarChartSignalNames = exports.BarChartScaleNames = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst BarChartScaleNames = {\n  bucketScale: 'bucketScale',\n  levelScale: 'levelScale',\n  compartmentScale: 'compartmentScale'\n};\nexports.BarChartScaleNames = BarChartScaleNames;\nconst BarChartSignalNames = {\n  aspectRatioSignal: 'aspectRatioSignal',\n  compartmentsPerLevelSignal: 'compartmentsPerLevelSignal',\n  compartmentHeightSignal: 'compartmentHeightSignal',\n  levelExtentSignal: 'levelExtentSignal',\n  quantitativeBinSignal: 'quantitativeBinSignal'\n};\nexports.BarChartSignalNames = BarChartSignalNames;\n},{}],\"m4Pj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.partialAxes = partialAxes;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"../vega-deck.gl\");\n\nfunction partialAxes(specViewOptions, xColumnQuantitative, yColumnQuantitative) {\n  const lineColor = _vegaDeck.util.colorToString(specViewOptions.colors.axisLine);\n\n  const axisColor = {\n    domainColor: lineColor,\n    tickColor: lineColor,\n    labelColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText)\n  };\n  const bottom = Object.assign({\n    orient: 'bottom',\n    labelAlign: 'left',\n    labelAngle: {\n      signal: _constants.SignalNames.TextAngleX\n    },\n    labelFontSize: {\n      signal: _constants.SignalNames.TextSize\n    },\n    titleAngle: {\n      signal: _constants.SignalNames.TextAngleX\n    },\n    titleAlign: 'left',\n    titleFontSize: {\n      signal: _constants.SignalNames.TextTitleSize\n    },\n    titleColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n    tickSize: specViewOptions.tickSize\n  }, axisColor);\n\n  if (xColumnQuantitative) {\n    bottom.format = '~r';\n  }\n\n  const left = Object.assign({\n    orient: 'left',\n    labelAlign: 'right',\n    labelAngle: {\n      signal: _constants.SignalNames.TextAngleY\n    },\n    labelFontSize: {\n      signal: _constants.SignalNames.TextSize\n    },\n    titleAngle: {\n      signal: _constants.SignalNames.TextAngleY\n    },\n    titleAlign: 'right',\n    titleFontSize: {\n      signal: _constants.SignalNames.TextTitleSize\n    },\n    titleColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n    tickSize: specViewOptions.tickSize\n  }, axisColor);\n\n  if (yColumnQuantitative) {\n    left.format = '~r';\n  }\n\n  return {\n    left,\n    bottom\n  };\n}\n},{\"./constants\":\"b0rV\",\"../vega-deck.gl\":\"Uns8\"}],\"clqN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _axes = require(\"../axes\");\n\nvar _constants2 = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, true, specColumns.y.quantitative);\n  const axes = [Object.assign({\n    scale: _constants2.ScaleNames.Y,\n    title: specColumns.y.name\n  }, pa.left), Object.assign({\n    scale: _constants.BarChartScaleNames.levelScale,\n    title: specViewOptions.language.count,\n    encode: {\n      labels: {\n        update: {\n          text: {\n            signal: `${_constants.BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n          }\n        }\n      }\n    }\n  }, pa.bottom)];\n  return axes;\n}\n},{\"./constants\":\"v7Oc\",\"../axes\":\"m4Pj\",\"../constants\":\"b0rV\"}],\"uuEv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const stackTransform = {\n    type: 'stack',\n    groupby: [{\n      field: specColumns.y.name\n    }],\n    as: [_constants2.FieldNames.BarChartStack0, _constants2.FieldNames.BarChartStack1]\n  };\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants2.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"./constants\":\"v7Oc\",\"../constants\":\"b0rV\"}],\"Re96\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, groupBy) {\n  const {\n    specColumns\n  } = context;\n  const bucket_extent = 'bucket_extent';\n  const stackTransform = {\n    type: 'stack',\n    groupby: [_constants2.FieldNames.BarChartBin0],\n    as: [_constants2.FieldNames.BarChartStack0, _constants2.FieldNames.BarChartStack1]\n  };\n\n  if (groupBy) {\n    stackTransform.groupby.push(groupBy.name);\n  }\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [{\n    type: 'extent',\n    field: specColumns.y.name,\n    signal: bucket_extent\n  }, {\n    type: 'bin',\n    field: specColumns.y.name,\n    extent: {\n      signal: bucket_extent\n    },\n    maxbins: {\n      signal: _constants2.SignalNames.YBins\n    },\n    as: [_constants2.FieldNames.BarChartBin0, _constants2.FieldNames.BarChartBin1],\n    signal: _constants.BarChartSignalNames.quantitativeBinSignal\n  }, stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants2.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"./constants\":\"v7Oc\",\"../constants\":\"b0rV\"}],\"bPo5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.allTruthy = allTruthy;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Returns array with items which are truthy.\n * @param args array or arrays to concat into a single array.\n */\nfunction allTruthy(...args) {\n  return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n}\n},{}],\"XoZh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.topLookup = topLookup;\n\nvar _constants = require(\"./constants\");\n\nfunction topLookup(column, count) {\n  const data = [{\n    name: _constants.DataNames.TopLookup,\n    source: _constants.DataNames.Main,\n    transform: [{\n      type: 'aggregate',\n      groupby: [column.name]\n    }, {\n      type: 'window',\n      ops: ['count'],\n      as: [_constants.FieldNames.TopIndex]\n    }, {\n      type: 'filter',\n      expr: `datum.${_constants.FieldNames.TopIndex} <= ${count}`\n    }]\n  }, {\n    name: _constants.DataNames.Legend,\n    source: _constants.DataNames.Main,\n    transform: [{\n      type: 'lookup',\n      from: _constants.DataNames.TopLookup,\n      key: column.name,\n      fields: [column.name],\n      values: [column.name],\n      as: [_constants.FieldNames.Top]\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.Top} == null ? '${_constants.Other}' : datum.${_constants.FieldNames.Top}`,\n      as: _constants.FieldNames.Top\n    }]\n  }];\n  return data;\n}\n},{\"./constants\":\"b0rV\"}],\"N8o5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.bucketed = bucketed;\nexports.stacked = stacked;\n\nvar _transform = _interopRequireDefault(require(\"./transform.qualitative\"));\n\nvar _transform2 = _interopRequireDefault(require(\"./transform.quantitative\"));\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? _constants2.DataNames.Pre : _constants2.DataNames.Main;\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, _constants2.DataNames.Main), categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [bucketed(context, namespace, categoricalColor ? _constants2.DataNames.Legend : nestedDataName), stacked(namespace, namespace.bucket, specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))], specColumns.y.quantitative && [{\n    name: _constants2.DataNames.QuantitativeData,\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.start`\n      },\n      stop: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.stop`\n      },\n      step: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.step`\n      }\n    }]\n  }], specColumns.facet && (0, _facet.facetGroupData)(namespace.stacked));\n  return data;\n}\n\nfunction bucketed(context, namespace, source) {\n  const {\n    specColumns: columns\n  } = context;\n  const data = {\n    name: namespace.bucket,\n    source,\n    transform: columns.y.quantitative ? (0, _transform2.default)(context, columns.facet) : (0, _transform.default)(context)\n  };\n  return data;\n}\n\nfunction stacked(namespace, source, transforms) {\n  const data = {\n    name: namespace.stacked,\n    source,\n    transform: (0, _array.allTruthy)(transforms, xy(namespace))\n  };\n  return data;\n}\n\nfunction xy(namespace) {\n  const transforms = [{\n    type: 'formula',\n    expr: `floor(datum.${_constants2.FieldNames.BarChartStack0} / ${_constants.BarChartSignalNames.compartmentsPerLevelSignal})`,\n    as: namespace.__level\n  }, {\n    type: 'formula',\n    expr: `datum.${_constants2.FieldNames.BarChartStack0} % ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}`,\n    as: namespace.__compartment\n  }];\n  return transforms;\n}\n},{\"./transform.qualitative\":\"uuEv\",\"./transform.quantitative\":\"Re96\",\"../../array\":\"bPo5\",\"./constants\":\"v7Oc\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\",\"../top\":\"XoZh\"}],\"S7Dm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fill = fill;\nexports.opacity = opacity;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"../vega-deck.gl\");\n\nfunction fill(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const colorColumn = specColumns.color;\n  return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n    field: colorColumn.name\n  } : {\n    scale: _constants.ScaleNames.Color,\n    field: colorColumn.quantitative ? colorColumn.name : _constants.FieldNames.Top\n  } : {\n    value: _vegaDeck.util.colorToString(specViewOptions.colors.defaultCube)\n  };\n}\n\nfunction opacity(context) {\n  const result = {\n    signal: _constants.SignalNames.MarkOpacity\n  };\n  return result;\n}\n},{\"./constants\":\"b0rV\",\"../vega-deck.gl\":\"Uns8\"}],\"Dq8R\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.testForCollapseSelection = testForCollapseSelection;\n\nvar _constants = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction testForCollapseSelection() {\n  return `datum.${_constants.FieldNames.Collapsed}`;\n}\n},{\"./constants\":\"b0rV\"}],\"BuYz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"../../vega-deck.gl\"));\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: namespace.stacked\n    },\n    encode: {\n      update: {\n        y: {\n          scale: _constants2.ScaleNames.Y,\n          field: specColumns.y.quantitative ? _constants2.FieldNames.BarChartBin0 : specColumns.y.name,\n          offset: {\n            scale: _constants.BarChartScaleNames.compartmentScale,\n            field: namespace.__compartment\n          }\n        },\n        height: [{\n          test: `bandwidth('${_constants.BarChartScaleNames.compartmentScale}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.BarChartScaleNames.compartmentScale,\n          band: 1\n        }],\n        x: [{\n          scale: _constants2.ScaleNames.X,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants2.SignalNames.XDomain}[0]`\n        }, {\n          scale: _constants2.ScaleNames.X,\n          field: namespace.__level,\n          band: 1,\n          offset: {\n            signal: `-bandwidth('${_constants2.ScaleNames.X}')-1`\n          }\n        }],\n        width: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          test: `bandwidth('${_constants2.ScaleNames.X}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants2.ScaleNames.X,\n          band: 1\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants2.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"../../vega-deck.gl\":\"Uns8\",\"./constants\":\"v7Oc\",\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"Po0S\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.bucketScale,\n    type: 'band',\n    range: 'height',\n    domain: {\n      data: namespace.bucket,\n      field: specColumns.y.name,\n      sort: true\n    }\n  }, {\n    name: _constants2.ScaleNames.Y,\n    type: 'band',\n    range: [0, {\n      signal: 'height'\n    }],\n    padding: 0.01,\n    domain: {\n      data: namespace.stacked,\n      field: specColumns.y.name,\n      sort: true\n    },\n    reverse: true\n  }];\n  return scales;\n}\n},{\"./constants\":\"v7Oc\",\"../constants\":\"b0rV\"}],\"w9lC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default() {\n  const scales = [{\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    range: [0, {\n      signal: 'height'\n    }],\n    padding: 0.01,\n    domain: {\n      data: _constants.DataNames.QuantitativeData,\n      field: 'data',\n      sort: true\n    },\n    reverse: true\n  }];\n  return scales;\n}\n},{\"../constants\":\"b0rV\"}],\"vYBt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linearScale = linearScale;\nexports.pointScale = pointScale;\nexports.binnableColorScale = binnableColorScale;\n\nvar _constants = require(\"./constants\");\n\nfunction linearScale(name, data, field, range, reverse, zero) {\n  const scale = {\n    name,\n    type: 'linear',\n    range,\n    round: true,\n    reverse,\n    domain: {\n      data,\n      field\n    },\n    zero,\n    nice: true\n  };\n  return scale;\n}\n\nfunction pointScale(name, data, range, field, reverse) {\n  const scale = {\n    name,\n    type: 'point',\n    range,\n    domain: {\n      data,\n      field,\n      sort: true\n    },\n    padding: 0.5\n  };\n\n  if (reverse !== undefined) {\n    scale.reverse = reverse;\n  }\n\n  return scale;\n}\n\nfunction binnableColorScale(colorBin, data, field, scheme) {\n  scheme = scheme || _constants.ColorScaleNone;\n  const name = _constants.ScaleNames.Color;\n  const domain = {\n    data,\n    field\n  };\n  const range = {\n    scheme\n  };\n  const reverse = {\n    signal: _constants.SignalNames.ColorReverse\n  };\n\n  if (colorBin !== 'continuous') {\n    range.count = {\n      signal: _constants.SignalNames.ColorBinCount\n    };\n  }\n\n  switch (colorBin) {\n    case 'continuous':\n      {\n        const sequentialScale = {\n          name,\n          type: 'sequential',\n          domain,\n          range,\n          reverse\n        };\n        return sequentialScale;\n      }\n\n    case 'quantile':\n      {\n        const quantileScale = {\n          name,\n          type: 'quantile',\n          domain,\n          range,\n          reverse\n        };\n        return quantileScale;\n      }\n\n    default:\n      {\n        const quantizeScale = {\n          name,\n          type: 'quantize',\n          domain,\n          range,\n          reverse\n        };\n        return quantizeScale;\n      }\n  }\n}\n},{\"./constants\":\"b0rV\"}],\"oliH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = _interopRequireDefault(require(\"./scales.qualitative\"));\n\nvar _scales2 = _interopRequireDefault(require(\"./scales.quantitative\"));\n\nvar _constants = require(\"./constants\");\n\nvar _scales3 = require(\"../scales\");\n\nvar _constants2 = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.compartmentScale,\n    type: 'band',\n    range: [0, {\n      signal: _constants.BarChartSignalNames.compartmentHeightSignal\n    }],\n    padding: 0.1,\n    domain: {\n      signal: `sequence(0, ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n    }\n  }, {\n    name: _constants.BarChartScaleNames.levelScale,\n    range: [{\n      signal: '0'\n    }, {\n      signal: 'width'\n    }],\n    round: true,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    },\n    zero: true,\n    nice: true\n  }, {\n    name: _constants2.ScaleNames.X,\n    type: 'band',\n    range: [{\n      signal: '0'\n    }, {\n      signal: 'width'\n    }],\n    padding: 0.1,\n    round: false,\n    reverse: false,\n    align: 1,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales3.binnableColorScale)(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants2.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: namespace.bucket,\n          field: _constants2.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants2.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants2.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants2.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales3.linearScale)(_constants2.ScaleNames.Z, _constants2.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales3.pointScale)(_constants2.ScaleNames.Z, _constants2.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales.concat(specColumns.y.quantitative ? (0, _scales2.default)() : (0, _scales.default)(context, namespace));\n}\n},{\"./scales.qualitative\":\"Po0S\",\"./scales.quantitative\":\"w9lC\",\"./constants\":\"v7Oc\",\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"N3c7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.textSignals = textSignals;\nexports.colorBinCountSignal = colorBinCountSignal;\nexports.colorReverseSignal = colorReverseSignal;\nexports.defaultZProportion = void 0;\n\nvar _constants = require(\"./constants\");\n\nconst defaultZProportion = 0.6;\nexports.defaultZProportion = defaultZProportion;\n\nfunction textSignals(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signals = [{\n    name: _constants.SignalNames.ZProportion,\n    value: defaultZProportion,\n    bind: {\n      name: specViewOptions.language.zScaleProportion,\n      debounce: 50,\n      input: 'range',\n      min: 0.2,\n      max: 2,\n      step: 0.1\n    }\n  }, {\n    name: _constants.SignalNames.ZHeight,\n    update: `height * ${_constants.SignalNames.ZProportion}`\n  }, {\n    name: _constants.SignalNames.TextScale,\n    value: 2,\n    bind: {\n      name: specViewOptions.language.textScaleSignal,\n      debounce: 50,\n      input: 'range',\n      min: 1,\n      max: 5,\n      step: 0.5\n    }\n  }, {\n    name: _constants.SignalNames.TextSize,\n    update: `${_constants.SignalNames.TextScale} * 10`\n  }, {\n    name: _constants.SignalNames.TextTitleSize,\n    update: `${_constants.SignalNames.TextScale} * 15`\n  }, {\n    name: _constants.SignalNames.TextAngleX,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.xAxisTextAngleSignal,\n      debounce: 50,\n      input: 'range',\n      min: 0,\n      max: 90,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.TextAngleY,\n    value: 0,\n    bind: {\n      name: specViewOptions.language.yAxisTextAngleSignal,\n      debounce: 50,\n      input: 'range',\n      min: -90,\n      max: 0,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.MarkOpacity,\n    value: 1,\n    bind: {\n      name: specViewOptions.language.markOpacitySignal,\n      debounce: 50,\n      input: 'range',\n      min: 0.1,\n      max: 1,\n      step: 0.05\n    }\n  }];\n  return signals;\n}\n\nfunction colorBinCountSignal(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signal = {\n    name: _constants.SignalNames.ColorBinCount,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.colorBinCount,\n      input: 'range',\n      min: 1,\n      max: specViewOptions.maxLegends + 1,\n      step: 1\n    }\n  };\n  return signal;\n}\n\nfunction colorReverseSignal(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signal = {\n    name: _constants.SignalNames.ColorReverse,\n    value: false,\n    bind: {\n      name: specViewOptions.language.colorReverse,\n      input: 'checkbox'\n    }\n  };\n  return signal;\n}\n},{\"./constants\":\"b0rV\"}],\"MejL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"./constants\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants2 = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants2.SignalNames.XDomain,\n    update: `domain('${_constants2.ScaleNames.X}')`\n  }, specColumns.y.quantitative && {\n    name: _constants2.SignalNames.YBins,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.BarChartSignalNames.compartmentHeightSignal,\n    update: `bandwidth('${specColumns.y.quantitative ? _constants2.ScaleNames.Y : _constants.BarChartScaleNames.bucketScale}')`\n  }, {\n    name: _constants.BarChartSignalNames.aspectRatioSignal,\n    update: `${_constants.BarChartSignalNames.compartmentHeightSignal}/width`\n  }, {\n    name: _constants.BarChartSignalNames.compartmentsPerLevelSignal,\n    update: `ceil(sqrt(${_constants.BarChartSignalNames.aspectRatioSignal}*${_constants.BarChartSignalNames.levelExtentSignal}[1]))`\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], specColumns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"./constants\":\"v7Oc\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"oTLg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLegends = getLegends;\n\nvar _constants = require(\"./constants\");\n\nfunction legend(column) {\n  const legend = {\n    orient: 'none',\n    title: column.name,\n    fill: _constants.ScaleNames.Color,\n    encode: {\n      symbols: {\n        update: {\n          shape: {\n            value: 'square'\n          }\n        }\n      }\n    }\n  };\n\n  if (column.quantitative) {\n    legend.type = 'symbol';\n    legend.format = '~r';\n  }\n\n  return legend;\n}\n\nfunction getLegends(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n\n  if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n    return [legend(specColumns.color)];\n  }\n}\n},{\"./constants\":\"b0rV\"}],\"IZ55\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.NameSpace = void 0;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nclass NameSpace {\n  constructor(nameSpace = '') {\n    ['bucket', 'stacked', '__compartment', '__level'].forEach(name => {\n      this[name] = `${name}${nameSpace}`;\n    });\n  }\n\n}\n\nexports.NameSpace = NameSpace;\n},{}],\"CIUm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.barchartH = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nvar _namespace = require(\"./namespace\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst barchartH = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const rootNamespace = new _namespace.NameSpace();\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks;\n\n  if (specColumns.facet) {\n    const cellNamespace = new _namespace.NameSpace('Cell');\n    const cellMarks = (0, _marks.default)(context, cellNamespace);\n    const cd = specColumns.y.quantitative ? [(0, _data.stacked)(cellNamespace, _constants.DataNames.FacetGroupCell)] : [(0, _data.bucketed)(context, cellNamespace, _constants.DataNames.FacetGroupCell), (0, _data.stacked)(cellNamespace, cellNamespace.bucket)];\n    marks = (0, _facet.facetMarks)(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n    axes = [];\n  } else {\n    marks = (0, _marks.default)(context, rootNamespace);\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context, rootNamespace),\n    data: (0, _data.default)(context, rootNamespace),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.barchartH = barchartH;\n},{\"./axes\":\"clqN\",\"./data\":\"N8o5\",\"./marks\":\"BuYz\",\"./scales\":\"oliH\",\"./signals\":\"MejL\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\",\"../legends\":\"oTLg\",\"./namespace\":\"IZ55\"}],\"kXgn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.BarChartSignalNames = exports.BarChartScaleNames = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst BarChartScaleNames = {\n  bucketScale: 'bucketScale',\n  levelScale: 'levelScale',\n  compartmentScale: 'compartmentScale'\n};\nexports.BarChartScaleNames = BarChartScaleNames;\nconst BarChartSignalNames = {\n  aspectRatioSignal: 'aspectRatioSignal',\n  compartmentsPerLevelSignal: 'compartmentsPerLevelSignal',\n  compartmentWidthSignal: 'compartmentWidthSignal',\n  levelExtentSignal: 'levelExtentSignal',\n  quantitativeBinSignal: 'quantitativeBinSignal'\n};\nexports.BarChartSignalNames = BarChartSignalNames;\n},{}],\"qaUm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _axes = require(\"../axes\");\n\nvar _constants2 = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, specColumns.x.quantitative, true);\n  const axes = [Object.assign({\n    scale: _constants2.ScaleNames.X,\n    title: specColumns.x.name\n  }, pa.bottom), Object.assign({\n    scale: _constants.BarChartScaleNames.levelScale,\n    title: specViewOptions.language.count,\n    encode: {\n      labels: {\n        update: {\n          text: {\n            signal: `${_constants.BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n          }\n        }\n      }\n    }\n  }, pa.left)];\n  return axes;\n}\n},{\"./constants\":\"kXgn\",\"../axes\":\"m4Pj\",\"../constants\":\"b0rV\"}],\"sGLW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const stackTransform = {\n    type: 'stack',\n    groupby: [{\n      field: specColumns.x.name\n    }],\n    as: [_constants2.FieldNames.BarChartStack0, _constants2.FieldNames.BarChartStack1]\n  };\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants2.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"./constants\":\"kXgn\",\"../constants\":\"b0rV\"}],\"D8M6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, groupBy) {\n  const {\n    specColumns\n  } = context;\n  const bucket_extent = 'bucket_extent';\n  const stackTransform = {\n    type: 'stack',\n    groupby: [_constants2.FieldNames.BarChartBin0],\n    as: [_constants2.FieldNames.BarChartStack0, _constants2.FieldNames.BarChartStack1]\n  };\n\n  if (groupBy) {\n    stackTransform.groupby.push(groupBy.name);\n  }\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [{\n    type: 'extent',\n    field: specColumns.x.name,\n    signal: bucket_extent\n  }, {\n    type: 'bin',\n    field: specColumns.x.name,\n    extent: {\n      signal: bucket_extent\n    },\n    maxbins: {\n      signal: _constants2.SignalNames.XBins\n    },\n    as: [_constants2.FieldNames.BarChartBin0, _constants2.FieldNames.BarChartBin1],\n    signal: _constants.BarChartSignalNames.quantitativeBinSignal\n  }, stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants2.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"./constants\":\"kXgn\",\"../constants\":\"b0rV\"}],\"MPMp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.bucketed = bucketed;\nexports.stacked = stacked;\n\nvar _transform = _interopRequireDefault(require(\"./transform.qualitative\"));\n\nvar _transform2 = _interopRequireDefault(require(\"./transform.quantitative\"));\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? _constants2.DataNames.Pre : _constants2.DataNames.Main;\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, _constants2.DataNames.Main), categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [bucketed(context, namespace, categoricalColor ? _constants2.DataNames.Legend : nestedDataName), stacked(namespace, namespace.bucket, specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))], specColumns.x.quantitative && [{\n    name: _constants2.DataNames.QuantitativeData,\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.start`\n      },\n      stop: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.stop`\n      },\n      step: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.step`\n      }\n    }]\n  }], specColumns.facet && (0, _facet.facetGroupData)(namespace.stacked));\n  return data;\n}\n\nfunction bucketed(context, namespace, source) {\n  const {\n    specColumns: columns\n  } = context;\n  const data = {\n    name: namespace.bucket,\n    source,\n    transform: columns.x.quantitative ? (0, _transform2.default)(context, columns.facet) : (0, _transform.default)(context)\n  };\n  return data;\n}\n\nfunction stacked(namespace, source, transforms) {\n  const data = {\n    name: namespace.stacked,\n    source,\n    transform: (0, _array.allTruthy)(transforms, xy(namespace))\n  };\n  return data;\n}\n\nfunction xy(namespace) {\n  const transforms = [{\n    type: 'formula',\n    expr: `floor(datum.${_constants2.FieldNames.BarChartStack0} / ${_constants.BarChartSignalNames.compartmentsPerLevelSignal})`,\n    as: namespace.__level\n  }, {\n    type: 'formula',\n    expr: `datum.${_constants2.FieldNames.BarChartStack0} % ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}`,\n    as: namespace.__compartment\n  }];\n  return transforms;\n}\n},{\"./transform.qualitative\":\"sGLW\",\"./transform.quantitative\":\"D8M6\",\"../../array\":\"bPo5\",\"./constants\":\"kXgn\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\",\"../top\":\"XoZh\"}],\"bUVh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"../../vega-deck.gl\"));\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: namespace.stacked\n    },\n    encode: {\n      update: {\n        x: {\n          scale: _constants2.ScaleNames.X,\n          field: specColumns.x.quantitative ? _constants2.FieldNames.BarChartBin0 : specColumns.x.name,\n          offset: {\n            scale: _constants.BarChartScaleNames.compartmentScale,\n            field: namespace.__compartment\n          }\n        },\n        width: [{\n          test: `bandwidth('${_constants.BarChartScaleNames.compartmentScale}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.BarChartScaleNames.compartmentScale,\n          band: 1\n        }],\n        y: [{\n          scale: _constants2.ScaleNames.Y,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants2.SignalNames.YDomain}[0]`\n        }, {\n          scale: _constants2.ScaleNames.Y,\n          field: namespace.__level,\n          band: 1,\n          offset: {\n            signal: `-bandwidth('${_constants2.ScaleNames.Y}')-1`\n          }\n        }],\n        height: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          test: `bandwidth('${_constants2.ScaleNames.Y}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants2.ScaleNames.Y,\n          band: 1\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants2.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"../../vega-deck.gl\":\"Uns8\",\"./constants\":\"kXgn\",\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"Od9T\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.bucketScale,\n    type: 'band',\n    range: 'width',\n    domain: {\n      data: namespace.bucket,\n      field: specColumns.x.name,\n      sort: true\n    }\n  }, {\n    name: _constants2.ScaleNames.X,\n    type: 'band',\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: 0.01,\n    domain: {\n      data: namespace.stacked,\n      field: specColumns.x.name,\n      sort: true\n    }\n  }];\n  return scales;\n}\n},{\"./constants\":\"kXgn\",\"../constants\":\"b0rV\"}],\"tWqL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default() {\n  const scales = [{\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: 0.01,\n    domain: {\n      data: _constants.DataNames.QuantitativeData,\n      field: 'data',\n      sort: true\n    }\n  }];\n  return scales;\n}\n},{\"../constants\":\"b0rV\"}],\"qKXg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = _interopRequireDefault(require(\"./scales.qualitative\"));\n\nvar _scales2 = _interopRequireDefault(require(\"./scales.quantitative\"));\n\nvar _constants = require(\"./constants\");\n\nvar _scales3 = require(\"../scales\");\n\nvar _constants2 = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.compartmentScale,\n    type: 'band',\n    range: [0, {\n      signal: _constants.BarChartSignalNames.compartmentWidthSignal\n    }],\n    padding: 0.1,\n    domain: {\n      signal: `sequence(0, ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n    }\n  }, {\n    name: _constants.BarChartScaleNames.levelScale,\n    range: [{\n      signal: 'height'\n    }, {\n      signal: '0'\n    }],\n    round: true,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    },\n    zero: true,\n    nice: true\n  }, {\n    name: _constants2.ScaleNames.Y,\n    type: 'band',\n    range: [{\n      signal: 'height'\n    }, {\n      signal: '0'\n    }],\n    padding: 0.1,\n    round: false,\n    reverse: false,\n    align: 1,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales3.binnableColorScale)(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants2.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: namespace.bucket,\n          field: _constants2.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants2.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants2.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants2.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales3.linearScale)(_constants2.ScaleNames.Z, _constants2.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales3.pointScale)(_constants2.ScaleNames.Z, _constants2.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales.concat(specColumns.x.quantitative ? (0, _scales2.default)() : (0, _scales.default)(context, namespace));\n}\n},{\"./scales.qualitative\":\"Od9T\",\"./scales.quantitative\":\"tWqL\",\"./constants\":\"kXgn\",\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"wEg1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"./constants\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants2 = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants2.SignalNames.YDomain,\n    update: `domain('${_constants2.ScaleNames.Y}')`\n  }, specColumns.x.quantitative && {\n    name: _constants2.SignalNames.XBins,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.BarChartSignalNames.compartmentWidthSignal,\n    update: `bandwidth('${specColumns.x.quantitative ? _constants2.ScaleNames.X : _constants.BarChartScaleNames.bucketScale}')`\n  }, {\n    name: _constants.BarChartSignalNames.aspectRatioSignal,\n    update: `${_constants.BarChartSignalNames.compartmentWidthSignal}/height`\n  }, {\n    name: _constants.BarChartSignalNames.compartmentsPerLevelSignal,\n    update: `ceil(sqrt(${_constants.BarChartSignalNames.aspectRatioSignal}*${_constants.BarChartSignalNames.levelExtentSignal}[1]))`\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], specColumns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"./constants\":\"kXgn\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"J9sm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.barchartV = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nvar _namespace = require(\"./namespace\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst barchartV = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const rootNamespace = new _namespace.NameSpace();\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks;\n\n  if (specColumns.facet) {\n    const cellNamespace = new _namespace.NameSpace('Cell');\n    const cellMarks = (0, _marks.default)(context, cellNamespace);\n    const cd = specColumns.x.quantitative ? [(0, _data.stacked)(cellNamespace, _constants.DataNames.FacetGroupCell)] : [(0, _data.bucketed)(context, cellNamespace, _constants.DataNames.FacetGroupCell), (0, _data.stacked)(cellNamespace, cellNamespace.bucket)];\n    marks = (0, _facet.facetMarks)(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n    axes = [];\n  } else {\n    marks = (0, _marks.default)(context, rootNamespace);\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context, rootNamespace),\n    data: (0, _data.default)(context, rootNamespace),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.barchartV = barchartV;\n},{\"./axes\":\"qaUm\",\"./data\":\"MPMp\",\"./marks\":\"bUVh\",\"./scales\":\"qKXg\",\"./signals\":\"wEg1\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\",\"../legends\":\"oTLg\",\"./namespace\":\"IZ55\"}],\"BUbq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, specColumns.x.quantitative, specColumns.y.quantitative);\n  const axes = [Object.assign({\n    scale: 'xscale',\n    title: specColumns.x.name,\n    bandPosition: 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.bottom), Object.assign({\n    scale: 'yscale',\n    title: specColumns.y.name,\n    bandPosition: specColumns.y.quantitative ? 0 : 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"m4Pj\"}],\"Y16r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)(specColumns.x.quantitative && [{\n      type: 'extent',\n      field: specColumns.x.name,\n      signal: 'var_Xextent'\n    }, {\n      type: 'bin',\n      field: specColumns.x.name,\n      extent: {\n        signal: 'var_Xextent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.XBins\n      },\n      as: [_constants.FieldNames.DensityXBin0, _constants.FieldNames.DensityXBin1],\n      signal: 'binXSignal'\n    }], specColumns.y.quantitative && [{\n      type: 'extent',\n      field: specColumns.y.name,\n      signal: 'var_Yextent'\n    }, {\n      type: 'bin',\n      field: specColumns.y.name,\n      extent: {\n        signal: 'var_Yextent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.YBins\n      },\n      as: [_constants.FieldNames.DensityYBin0, _constants.FieldNames.DensityYBin1],\n      signal: 'binYSignal'\n    }])\n  }], specColumns.x.quantitative && [{\n    name: 'xaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binXSignal.start'\n      },\n      stop: {\n        signal: 'binXSignal.stop'\n      },\n      step: {\n        signal: 'binXSignal.step'\n      }\n    }]\n  }], specColumns.y.quantitative && [{\n    name: 'yaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binYSignal.start'\n      },\n      stop: {\n        signal: 'binYSignal.stop'\n      },\n      step: {\n        signal: 'binYSignal.step'\n      }\n    }]\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [{\n    name: 'aggregated',\n    source: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main,\n    transform: [{\n      type: 'joinaggregate',\n      groupby: [specColumns.x.quantitative ? _constants.FieldNames.DensityXBin0 : specColumns.x.name, specColumns.y.quantitative ? _constants.FieldNames.DensityYBin0 : specColumns.y.name],\n      ops: ['count'],\n      as: [_constants.FieldNames.DensityCount]\n    }, windowTransform(specColumns), {\n      type: 'extent',\n      field: _constants.FieldNames.DensityRow,\n      signal: 'cextent'\n    }]\n  }]);\n  return data;\n}\n\nfunction windowTransform(columns) {\n  const t = {\n    type: 'window',\n    groupby: [columns.x.quantitative ? _constants.FieldNames.DensityXBin0 : columns.x.name, columns.y.quantitative ? _constants.FieldNames.DensityYBin0 : columns.y.name],\n    ops: ['row_number'],\n    as: [_constants.FieldNames.DensityRow]\n  };\n\n  if (columns.sort) {\n    t.sort = {\n      field: [columns.sort.name],\n      order: ['descending']\n    };\n  }\n\n  return t;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../top\":\"XoZh\"}],\"gFUs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: 'aggregated'\n    },\n    sort: {\n      field: [specColumns.x.name, specColumns.y.name],\n      order: ['ascending', 'ascending']\n    },\n    encode: {\n      update: {\n        xc: {\n          scale: 'xscale',\n          field: specColumns.x.quantitative ? _constants.FieldNames.DensityXBin0 : specColumns.x.name,\n          offset: {\n            signal: `scale('sizescale', ((datum.${_constants.FieldNames.DensityRow}-1) % floor(sqrt(datum.${_constants.FieldNames.DensityCount}))))-scale('sizescale', sqrt(datum.${_constants.FieldNames.DensityCount})-2)/2`\n          }\n        },\n        yc: {\n          scale: 'yscale',\n          field: specColumns.y.quantitative ? _constants.FieldNames.DensityYBin0 : specColumns.y.name,\n          offset: {\n            signal: `scale('sizescale',height/width*floor(((datum.${_constants.FieldNames.DensityRow}-1) / floor(sqrt(datum.${_constants.FieldNames.DensityCount}))))) - scale('sizescale', height/width*sqrt(datum.${_constants.FieldNames.DensityCount})+2)/2`\n          }\n        },\n        width: {\n          signal: 'unitsize'\n        },\n        height: {\n          signal: 'height/width*unitsize'\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"PKQh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: 'xscale',\n    type: 'point',\n    domain: specColumns.x.quantitative ? {\n      data: 'xaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.x.name,\n      sort: true\n    },\n    range: 'width',\n    padding: 0.5\n  }, {\n    name: 'yscale',\n    type: 'point',\n    domain: specColumns.y.quantitative ? {\n      data: 'yaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.y.name,\n      sort: true\n    },\n    range: 'height',\n    reverse: true,\n    padding: 0.5\n  }, {\n    name: 'sizescale',\n    type: 'linear',\n    domain: [0, {\n      signal: 'sqrt(cextent[1])'\n    }],\n    range: [0, {\n      signal: 'width/max(xsize,ysize)'\n    }]\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"oltd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context), {\n    name: 'unitpad',\n    value: 0.1,\n    bind: {\n      name: _constants.SignalNames.InnerPadding,\n      input: 'range',\n      min: 0.1,\n      max: 1.0,\n      step: 0.1\n    }\n  }, {\n    name: 'xsize',\n    update: 'domain(\\'xscale\\').length'\n  }, {\n    name: 'ysize',\n    update: 'domain(\\'yscale\\').length'\n  }, {\n    name: 'cellwidth',\n    update: 'width/max(xsize,ysize)'\n  }, {\n    name: 'maxnumbers',\n    update: 'sqrt(cextent[1])'\n  }, {\n    name: 'unitsize',\n    update: 'cellwidth/((1 + unitpad)*maxnumbers)'\n  }, specColumns.x.quantitative && {\n    name: _constants.SignalNames.XBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, specColumns.y.quantitative && {\n    name: _constants.SignalNames.YBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"yaW2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.density = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst density = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks: (0, _marks.default)(context)\n  };\n\n  if (!insight.hideAxes) {\n    vegaSpec.axes = (0, _axes.default)(context);\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.density = density;\n},{\"./axes\":\"BUbq\",\"./data\":\"Y16r\",\"./marks\":\"gFUs\",\"./scales\":\"PKQh\",\"./signals\":\"oltd\",\"../facet\":\"Ifgo\",\"../legends\":\"oTLg\",\"../constants\":\"b0rV\"}],\"iQ8b\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)([specColumns.sort && {\n      type: 'collect',\n      sort: {\n        field: specColumns.sort.name\n      }\n    }, {\n      type: 'window',\n      ops: ['count'],\n      as: [_constants.FieldNames.GridIndex]\n    }])\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends));\n  return data;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../top\":\"XoZh\"}],\"gPej\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Total = exports.RowCount = exports.ColumnCount = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst ColumnCount = 'columncount';\nexports.ColumnCount = ColumnCount;\nconst RowCount = 'rowcount';\nexports.RowCount = RowCount;\nconst Total = 'total';\nexports.Total = Total;\n},{}],\"qxOY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, data) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data\n    },\n    encode: {\n      update: {\n        x: {\n          signal: `(datum.${_constants2.FieldNames.GridIndex}-1)%${_constants.ColumnCount}`,\n          scale: _constants2.ScaleNames.X\n        },\n        width: {\n          scale: _constants2.ScaleNames.X,\n          band: true\n        },\n        y: {\n          signal: `floor((datum.${_constants2.FieldNames.GridIndex}-1)/${_constants.ColumnCount})`,\n          scale: _constants2.ScaleNames.Y\n        },\n        height: {\n          scale: _constants2.ScaleNames.Y,\n          band: true\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants2.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return marks;\n}\n},{\"./constants\":\"gPej\",\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"q7IG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\nvar _constants2 = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    domain: {\n      signal: `sequence(0, ${_constants2.ColumnCount}, 1)`\n    },\n    range: 'width',\n    paddingInner: 0.1,\n    paddingOuter: 0\n  }, {\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    domain: {\n      signal: `sequence(0, ${_constants2.RowCount}, 1)`\n    },\n    range: 'height',\n    paddingInner: 0.1,\n    paddingOuter: 0\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\",\"./constants\":\"gPej\"}],\"QhdK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), {\n    name: _constants.Total,\n    update: `data('${_constants2.DataNames.Main}').length`\n  }, {\n    name: _constants.ColumnCount,\n    update: `ceil(sqrt((width/height)*${_constants.Total}))`\n  }, {\n    name: _constants.RowCount,\n    update: `${_constants.Total}/${_constants.ColumnCount}`\n  }, (0, _signals.colorReverseSignal)(context)], insight.columns && insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"./constants\":\"gPej\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\"}],\"m34o\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.grid = void 0;\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst grid = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  const specCapabilities = {\n    roles: [{\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const dataName = categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main;\n  const size = insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context),\n    data: (0, _data.default)(context),\n    marks: (0, _marks.default)(context, dataName)\n  };\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  } //use autosize only when not faceting\n\n\n  vegaSpec.autosize = 'fit';\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.grid = grid;\n},{\"./data\":\"iQ8b\",\"./marks\":\"qxOY\",\"./scales\":\"q7IG\",\"./signals\":\"QhdK\",\"../constants\":\"b0rV\",\"../legends\":\"oTLg\"}],\"DRuS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nvar _constants = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, specColumns.x.quantitative, specColumns.y.quantitative);\n  const axes = [Object.assign({\n    scale: _constants.ScaleNames.X,\n    title: specColumns.x.name\n  }, pa.bottom), Object.assign({\n    scale: _constants.ScaleNames.Y,\n    title: specColumns.y.name\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"m4Pj\",\"../constants\":\"b0rV\"}],\"cCou\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const ScatterDataName = 'SandDanceScatterPlotData';\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, ScatterDataName), [{\n    name: _constants.DataNames.Main,\n    source: ScatterDataName,\n    transform: (0, _array.allTruthy)(filterInvalidWhenNumeric(specColumns.x), filterInvalidWhenNumeric(specColumns.y), filterInvalidWhenNumeric(specColumns.z), specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), specColumns.facet && (0, _facet.facetGroupData)(_constants.DataNames.Main));\n  return data;\n}\n\nfunction filterInvalidWhenNumeric(column) {\n  if (column && column.quantitative) {\n    const transforms = [{\n      type: 'filter',\n      expr: `datum[${JSON.stringify(column.name)}] != null`\n    }];\n    return transforms;\n  }\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\",\"../top\":\"XoZh\"}],\"Vq7N\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main\n    },\n    encode: {\n      update: {\n        x: {\n          scale: _constants.ScaleNames.X,\n          field: specColumns.x.name,\n          offset: 1\n        },\n        width: {\n          signal: _constants.SignalNames.PointSize\n        },\n        y: [{\n          scale: _constants.ScaleNames.Y,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants.SignalNames.YDomain}[0]`\n        }, {\n          scale: _constants.ScaleNames.Y,\n          field: specColumns.y.name,\n          offset: {\n            signal: `-${_constants.SignalNames.PointSize}`\n          }\n        }],\n        height: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          signal: _constants.SignalNames.PointSize\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n    update.depth = {\n      signal: _constants.SignalNames.PointSize\n    };\n  }\n\n  return marks;\n}\n},{\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"vZre\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [specColumns.x.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.X, _constants.DataNames.Main, specColumns.x.name, 'width', false, false) : (0, _scales.pointScale)(_constants.ScaleNames.X, _constants.DataNames.Main, 'width', specColumns.x.name), specColumns.y.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Y, _constants.DataNames.Main, specColumns.y.name, 'height', false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Y, _constants.DataNames.Main, 'height', specColumns.y.name, true)];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"jiD2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants.SignalNames.YDomain,\n    update: `domain('${_constants.ScaleNames.Y}')`\n  }, {\n    name: _constants.SignalNames.PointSize,\n    value: 5,\n    bind: {\n      name: specViewOptions.language.scatterPointSize,\n      debounce: 50,\n      input: 'range',\n      min: 1,\n      max: 25,\n      step: 1\n    }\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"Rl9U\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.scatterplot = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst scatterplot = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact'\n    }, {\n      role: 'y',\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact'\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }],\n    signals: [_constants.SignalNames.PointSize]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks = (0, _marks.default)(context);\n\n  if (specColumns.facet) {\n    marks = (0, _facet.facetMarks)(specViewOptions, marks[0].from.data, marks, axes);\n    axes = [];\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.scatterplot = scatterplot;\n},{\"./axes\":\"DRuS\",\"./data\":\"cCou\",\"./marks\":\"Vq7N\",\"./scales\":\"vZre\",\"./signals\":\"jiD2\",\"../facet\":\"Ifgo\",\"../legends\":\"oTLg\",\"../constants\":\"b0rV\"}],\"uVNM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, specColumns.x.quantitative, specColumns.y.quantitative);\n  const axes = [Object.assign({\n    scale: 'xband',\n    title: specColumns.x.name,\n    bandPosition: 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.bottom), Object.assign({\n    scale: 'yband',\n    title: specColumns.y.name,\n    bandPosition: specColumns.y.quantitative ? 0 : 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"m4Pj\"}],\"wBrd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)([{\n      type: 'extent',\n      field: specColumns.x.name,\n      signal: 'long_extent'\n    }, {\n      type: 'extent',\n      field: specColumns.y.name,\n      signal: 'lat_extent'\n    }, specColumns.x.quantitative && {\n      type: 'bin',\n      field: specColumns.x.name,\n      extent: {\n        signal: 'long_extent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.XBins\n      },\n      nice: false,\n      as: [_constants.FieldNames.StacksLongBin0, _constants.FieldNames.StacksLongBin1],\n      signal: 'binXSignal'\n    }, specColumns.y.quantitative && {\n      type: 'bin',\n      field: specColumns.y.name,\n      extent: {\n        signal: 'lat_extent'\n      },\n      nice: false,\n      maxbins: {\n        signal: _constants.SignalNames.YBins\n      },\n      as: [_constants.FieldNames.StacksLatBin0, _constants.FieldNames.StacksLatBin1],\n      signal: 'binYSignal'\n    }])\n  }], specColumns.x.quantitative && [{\n    name: 'xaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binXSignal.start'\n      },\n      stop: {\n        signal: 'binXSignal.stop'\n      },\n      step: {\n        signal: 'binXSignal.step'\n      }\n    }]\n  }], specColumns.y.quantitative && [{\n    name: 'yaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binYSignal.start'\n      },\n      stop: {\n        signal: 'binYSignal.stop'\n      },\n      step: {\n        signal: 'binYSignal.step'\n      }\n    }]\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [{\n    name: 'stackedgroup',\n    source: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main,\n    transform: [stackTransform(specColumns.sort, specColumns.x, specColumns.y), {\n      type: 'extent',\n      signal: 'xtent',\n      field: _constants.FieldNames.StacksStart\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.StacksEnd} % columns`,\n      as: '_columns'\n    }, {\n      type: 'formula',\n      expr: `floor(datum.${_constants.FieldNames.StacksStart} / columns)`,\n      as: 'row'\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.StacksStart} % ${_constants.SignalNames.XGridSize}`,\n      as: 'column'\n    }, {\n      type: 'formula',\n      expr: `floor((datum.${_constants.FieldNames.StacksStart} % columns)/ ${_constants.SignalNames.XGridSize})`,\n      as: 'depth'\n    }, {\n      type: 'extent',\n      signal: 'rowxtent',\n      field: 'row'\n    }]\n  }]);\n  return data;\n}\n\nfunction stackTransform(sortColumn, xColumn, yColumn) {\n  const st = {\n    type: 'stack',\n    groupby: [yColumn.quantitative ? _constants.FieldNames.StacksLatBin0 : yColumn.name, xColumn.quantitative ? _constants.FieldNames.StacksLongBin0 : xColumn.name],\n    as: [_constants.FieldNames.StacksStart, _constants.FieldNames.StacksEnd]\n  };\n\n  if (sortColumn) {\n    st.sort = {\n      field: sortColumn.name\n    };\n  }\n\n  return st;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../top\":\"XoZh\"}],\"x3xn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    name: 'marks2',\n    type: 'rect',\n    from: {\n      data: 'stackedgroup'\n    },\n    encode: {\n      update: {\n        x: {\n          scale: 'xband',\n          field: specColumns.x.quantitative ? _constants.FieldNames.StacksLongBin0 : specColumns.x.name,\n          offset: {\n            scale: 'xinternalscale',\n            field: 'column'\n          }\n        },\n        y: {\n          scale: 'yband',\n          field: specColumns.y.quantitative ? _constants.FieldNames.StacksLatBin0 : specColumns.y.name,\n          offset: {\n            scale: 'yinternalscale',\n            field: 'depth'\n          }\n        },\n        z: {\n          scale: 'zband',\n          field: 'row'\n        },\n        depth: {\n          scale: 'zband',\n          band: true\n        },\n        width: {\n          signal: 'actsize'\n        },\n        height: {\n          signal: 'actsize'\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n  return marks;\n}\n},{\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\"}],\"evLm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: 'xband',\n    type: 'band',\n    domain: specColumns.x.quantitative ? {\n      data: 'xaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.x.quantitative ? _constants.FieldNames.StacksLongBin0 : specColumns.x.name,\n      sort: true\n    },\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: {\n      signal: _constants.SignalNames.OuterPadding\n    },\n    round: true\n  }, {\n    name: 'yband',\n    type: 'band',\n    reverse: true,\n    domain: specColumns.y.quantitative ? {\n      data: 'yaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.y.quantitative ? _constants.FieldNames.StacksLatBin0 : specColumns.y.name,\n      sort: true\n    },\n    range: 'height',\n    padding: {\n      signal: _constants.SignalNames.OuterPadding\n    },\n    round: true\n  }, {\n    name: 'zband',\n    type: 'band',\n    reverse: false,\n    domain: {\n      data: 'stackedgroup',\n      field: 'row',\n      sort: true\n    },\n    align: 0.0,\n    range: [0, {\n      signal: 'countheight'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    round: false\n  }, {\n    name: 'xinternalscale',\n    type: 'band',\n    range: [0, {\n      signal: 'xbandw'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    domain: {\n      data: 'stackedgroup',\n      field: 'column',\n      sort: true\n    }\n  }, {\n    name: 'yinternalscale',\n    type: 'band',\n    range: [0, {\n      signal: 'ybandw'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    domain: {\n      data: 'stackedgroup',\n      field: 'depth',\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"uY1G\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context), {\n    name: _constants.SignalNames.XGridSize,\n    value: 3,\n    bind: {\n      name: specViewOptions.language.XGridSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.YGridSize,\n    value: 3,\n    bind: {\n      name: specViewOptions.language.YGridSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, specColumns.x.quantitative && {\n    name: _constants.SignalNames.XBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, specColumns.y.quantitative && {\n    name: _constants.SignalNames.YBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.InnerPadding,\n    value: 0.1,\n    bind: {\n      name: specViewOptions.language.InnerPaddingSize,\n      input: 'range',\n      min: 0.1,\n      max: 0.6,\n      step: 0.1\n    }\n  }, {\n    name: _constants.SignalNames.OuterPadding,\n    value: 0.2,\n    bind: {\n      name: specViewOptions.language.OuterPaddingSize,\n      input: 'range',\n      min: 0.1,\n      max: 0.6,\n      step: 0.1\n    }\n  }, {\n    name: 'columns',\n    update: `${_constants.SignalNames.XGridSize}*${_constants.SignalNames.YGridSize}`\n  }, {\n    name: 'xbandw',\n    update: 'bandwidth(\\'xband\\')'\n  }, {\n    name: 'xbandsize',\n    update: `(xbandw / (${_constants.SignalNames.XGridSize} + ${_constants.SignalNames.InnerPadding}))*(1-${_constants.SignalNames.InnerPadding})`\n  }, {\n    name: 'ybandw',\n    update: `height/((${specColumns.y.quantitative ? _constants.SignalNames.YBins : specColumns.y.stats.distinctValueCount}) * (1 + ${_constants.SignalNames.OuterPadding}))`\n  }, {\n    name: 'ybandsize',\n    update: `(ybandw / (${_constants.SignalNames.YGridSize} + ${_constants.SignalNames.InnerPadding}))*(1-${_constants.SignalNames.InnerPadding})`\n  }, {\n    name: 'actsize',\n    update: 'min(xbandsize,ybandsize)'\n  }, {\n    name: 'countheight',\n    update: `rowxtent[1]*actsize*${_constants.SignalNames.ZProportion}/${_signals.defaultZProportion}`\n  }], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"oOWF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.stacks = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst stacks = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks: (0, _marks.default)(context)\n  };\n\n  if (!insight.hideAxes) {\n    vegaSpec.axes = (0, _axes.default)(context);\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.stacks = stacks;\n},{\"./axes\":\"uVNM\",\"./data\":\"wBrd\",\"./marks\":\"x3xn\",\"./scales\":\"evLm\",\"./signals\":\"uY1G\",\"../facet\":\"Ifgo\",\"../legends\":\"oTLg\",\"../constants\":\"b0rV\"}],\"IV9v\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.treemapTransforms = treemapTransforms;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const TreeMapDataName = 'SandDanceTreeMapData';\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, TreeMapDataName), [{\n    name: _constants.DataNames.Main,\n    source: TreeMapDataName,\n    transform: (0, _array.allTruthy)(specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets), !specColumns.facet && treemapTransforms(insight))\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), specColumns.facet && (0, _facet.facetGroupData)(_constants.DataNames.Main));\n  return data;\n}\n\nfunction treemapTransforms(insight) {\n  const transforms = [{\n    type: 'nest',\n    keys: [insight.columns.group || '__NONE__']\n  }, {\n    type: 'treemap',\n    field: insight.columns.size,\n    sort: {\n      field: 'value',\n      order: 'descending'\n    },\n    round: true,\n    method: {\n      signal: _constants.SignalNames.TreeMapMethod\n    },\n    padding: 1,\n    size: [{\n      signal: 'width'\n    }, {\n      signal: 'height'\n    }],\n    as: [_constants.FieldNames.TreemapStackX0, _constants.FieldNames.TreemapStackY0, _constants.FieldNames.TreemapStackX1, _constants.FieldNames.TreemapStackY1, _constants.FieldNames.TreemapStackDepth, _constants.FieldNames.TreemapStackChildren]\n  }];\n  return transforms;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\",\"../top\":\"XoZh\"}],\"vhMR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, data) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data\n    },\n    encode: {\n      update: {\n        x: {\n          field: _constants.FieldNames.TreemapStackX0\n        },\n        y: {\n          field: _constants.FieldNames.TreemapStackY0\n        },\n        x2: {\n          field: _constants.FieldNames.TreemapStackX1\n        },\n        y2: {\n          field: _constants.FieldNames.TreemapStackY1\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return marks;\n}\n},{\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"dh30\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"Qrog\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), {\n    name: _constants.SignalNames.TreeMapMethod,\n    value: 'squarify',\n    bind: {\n      name: specViewOptions.language.treeMapMethod,\n      input: 'select',\n      options: ['squarify', 'binary']\n    }\n  }, (0, _signals.colorReverseSignal)(context)], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"MNHb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.treemap = void 0;\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst treemap = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.size) errors.push('Must set a field for size');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'size',\n      excludeCategoric: true\n    }, {\n      role: 'group',\n      allowNone: true\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }],\n    signals: [_constants.SignalNames.TreeMapMethod]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const dataName = categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main;\n  const TreeMapName = 'SandDanceTreeMapFaceted';\n  const data = (0, _data.default)(context);\n  let marks = (0, _marks.default)(context, specColumns.facet ? TreeMapName : dataName);\n\n  if (specColumns.facet) {\n    const childData = {\n      name: TreeMapName,\n      source: _constants.DataNames.FacetGroupCell,\n      transform: (0, _data.treemapTransforms)(insight)\n    };\n    marks = (0, _facet.facetMarks)(specViewOptions, dataName, marks, null, [childData]);\n    marks[0].marks;\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data,\n    scales: (0, _scales.default)(context),\n    marks\n  };\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.treemap = treemap;\n},{\"./data\":\"IV9v\",\"./marks\":\"vhMR\",\"./scales\":\"dh30\",\"./signals\":\"Qrog\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\",\"../legends\":\"oTLg\"}],\"zwMy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.constants = exports.creators = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar _barchartH = require(\"./barchartH\");\n\nvar _barchartV = require(\"./barchartV\");\n\nvar _density = require(\"./density\");\n\nvar _grid = require(\"./grid\");\n\nvar _scatterPlot = require(\"./scatterPlot\");\n\nvar _stacks = require(\"./stacks\");\n\nvar _treeMap = require(\"./treeMap\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst creators = {\n  barchart: _barchartV.barchartV,\n  barchartH: _barchartH.barchartH,\n  barchartV: _barchartV.barchartV,\n  density: _density.density,\n  grid: _grid.grid,\n  scatterplot: _scatterPlot.scatterplot,\n  stacks: _stacks.stacks,\n  treemap: _treeMap.treemap\n};\nexports.creators = creators;\n\nfunction create(context) {\n  const {\n    insight\n  } = context;\n  const creator = creators[insight.chart];\n\n  if (creator) {\n    const specResult = creator(context); //TODO: find why Vega is doing this. fixup for facets\n\n    if (specResult.vegaSpec && insight.columns && insight.columns.facet && insight.facets.columns === 2 && insight.facets.rows === 1) {\n      specResult.vegaSpec.width = insight.size.width / 3;\n    }\n\n    return specResult;\n  }\n}\n},{\"./constants\":\"b0rV\",\"./barchartH\":\"CIUm\",\"./barchartV\":\"J9sm\",\"./density\":\"yaW2\",\"./grid\":\"m34o\",\"./scatterPlot\":\"Rl9U\",\"./stacks\":\"oOWF\",\"./treeMap\":\"MNHb\"}],\"DO07\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cloneVegaSpecWithData = cloneVegaSpecWithData;\n\nvar _ = require(\".\");\n\nvar _inference = require(\"./inference\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction cloneVegaSpecWithData(context, currData) {\n  const {\n    specColumns\n  } = context;\n  const columns = [specColumns.color, specColumns.facet, specColumns.group, specColumns.size, specColumns.sort, specColumns.x, specColumns.y, specColumns.z];\n  (0, _inference.inferAll)(columns, currData);\n  const specResult = (0, _.create)(context);\n\n  if (!specResult.errors) {\n    const data0 = specResult.vegaSpec.data[0];\n    data0.values = currData;\n  }\n\n  return specResult;\n}\n},{\".\":\"zwMy\",\"./inference\":\"SLia\"}],\"TNG8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Exec = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"../vega-deck.gl\"));\n\nvar _group = require(\"./group\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction valueToBoolean(value) {\n  if (typeof value === 'string') {\n    switch (value.toLowerCase()) {\n      case 'true':\n        return true;\n\n      case 'false':\n        return false;\n    }\n  }\n\n  return !!value;\n}\n\nfunction valueToString(value) {\n  if (value == null) {\n    return '';\n  }\n\n  switch (typeof value) {\n    case 'string':\n      return value;\n\n    case 'boolean':\n    case 'number':\n      return value.toString();\n  }\n\n  return '';\n}\n\nfunction isStringOperation(ex) {\n  switch (ex.operator) {\n    case 'contains':\n    case '!contains':\n    case 'starts':\n    case '!starts':\n      return true;\n  }\n\n  return false;\n}\n\nfunction isnullorEmpty(value) {\n  if (value == null) return true; //double equal sign to also catch undefined\n\n  if (typeof value === 'string' && value.length === 0) return true;\n  return false;\n}\n\nclass Exec {\n  constructor(search, columns) {\n    this.columns = columns;\n    this.groups = VegaDeckGl.util.clone((0, _group.ensureSearchExpressionGroupArray)(search));\n    this.groups.forEach(group => {\n      group.expressions.forEach(ex => {\n        ex.column = this.getColumn(ex.name);\n        ex.valueBool = valueToBoolean(ex.value);\n        ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n        ex.stringOperation = isStringOperation(ex);\n      });\n    });\n  }\n\n  getColumn(name) {\n    for (let i = 0; i < this.columns.length; i++) {\n      if (this.columns[i].name == name) {\n        return this.columns[i];\n      }\n    }\n  }\n\n  runExpressionOnColumn(datum, ex) {\n    const actualDataValue = datum[ex.name];\n\n    if (ex.operator === 'isnullorEmpty') {\n      return isnullorEmpty(actualDataValue);\n    } else if (ex.operator === '!isnullorEmpty') {\n      return !isnullorEmpty(actualDataValue);\n    }\n\n    let dataValue = actualDataValue;\n    let expressionValue = ex.value;\n\n    if (ex.column) {\n      if (ex.column.type === 'string' || ex.stringOperation) {\n        dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n        expressionValue = ex.valueLow;\n      } else if (ex.column.type === 'boolean') {\n        dataValue = valueToBoolean(actualDataValue);\n        expressionValue = ex.valueBool;\n      } else if (ex.column.quantitative) {\n        dataValue = +actualDataValue;\n        expressionValue = +ex.value;\n      }\n    }\n\n    switch (ex.operator) {\n      case '!=':\n        return dataValue != expressionValue;\n\n      case '<':\n        return dataValue < expressionValue;\n\n      case '<=':\n        return dataValue <= expressionValue;\n\n      case '==':\n        return dataValue == expressionValue;\n\n      case '>':\n        return dataValue > expressionValue;\n\n      case '>=':\n        return dataValue >= expressionValue;\n\n      case 'contains':\n        return dataValue.indexOf(expressionValue) >= 0;\n\n      case '!contains':\n        return dataValue.indexOf(expressionValue) < 0;\n\n      case 'starts':\n        return dataValue.indexOf(expressionValue) == 0;\n\n      case '!starts':\n        return dataValue.indexOf(expressionValue) !== 0;\n    }\n  }\n\n  runExpression(datum, ex) {\n    if (ex.name == null) {\n      //run on all columns\n      const group = {\n        expressions: this.columns.map((column, i) => {\n          const ex2 = Object.assign(Object.assign({}, ex), {\n            column,\n            name: column.name\n          });\n\n          if (i) {\n            ex2.clause = '||';\n          }\n\n          return ex2;\n        })\n      };\n      return this.runGroup(datum, group);\n    } else {\n      return this.runExpressionOnColumn(datum, ex);\n    }\n  }\n\n  runGroup(datum, group) {\n    let accumulator = this.runExpression(datum, group.expressions[0]);\n\n    for (let i = 1; i < group.expressions.length; i++) {\n      let ex = group.expressions[i];\n\n      switch (ex.clause) {\n        case '&&':\n          accumulator = accumulator && this.runExpression(datum, ex);\n          break;\n\n        case '||':\n          accumulator = accumulator || this.runExpression(datum, ex);\n          break;\n      }\n    }\n\n    return accumulator;\n  }\n\n  run(datum) {\n    let accumulator = this.runGroup(datum, this.groups[0]);\n\n    for (let i = 1; i < this.groups.length; i++) {\n      let group = this.groups[i];\n\n      switch (group.clause) {\n        case '&&':\n          accumulator = accumulator && this.runGroup(datum, group);\n          break;\n\n        case '||':\n          accumulator = accumulator || this.runGroup(datum, group);\n          break;\n      }\n    }\n\n    return accumulator;\n  }\n\n}\n\nexports.Exec = Exec;\n},{\"../vega-deck.gl\":\"Uns8\",\"./group\":\"yy6X\"}],\"MJ1d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataScope = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"./vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nvar _exec = require(\"./searchExpression/exec\");\n\nvar _inference = require(\"./specs/inference\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nclass DataScope {\n  setData(data, columns) {\n    const differentData = this.data !== data;\n\n    if (differentData) {\n      if (this.data) {\n        //clean up things we added to old data\n        this.deselect();\n      }\n\n      this.data = data;\n      this.columns = columns;\n      this.filteredData = null;\n    }\n\n    return differentData;\n  }\n\n  getColumns(columnTypes) {\n    if (!this.columns) {\n      this.columns = (0, _inference.getColumnsFromData)(this.data, columnTypes);\n    }\n\n    return this.columns;\n  }\n\n  currentData() {\n    return this.filteredData || this.data;\n  }\n\n  select(search) {\n    this.deselect();\n\n    if (search) {\n      this.selection = this.createUserSelection(search, true);\n\n      if (this.selection.included.length) {\n        this.activate(this.selection.included[0]);\n      }\n    }\n  }\n\n  createUserSelection(search, assign) {\n    const exec = new _exec.Exec(search, this.getColumns());\n    const s = {\n      search,\n      included: [],\n      excluded: []\n    };\n    this.currentData().forEach(datum => {\n      if (exec.run(datum)) {\n        if (assign) {\n          datum[_constants.FieldNames.Selected] = true;\n        }\n\n        s.included.push(datum);\n      } else {\n        s.excluded.push(datum);\n      }\n    });\n    return s;\n  }\n\n  deselect() {\n    this.deactivate();\n    this.data.forEach(datum => {\n      delete datum[_constants.FieldNames.Selected];\n    });\n    this.selection = null;\n  }\n\n  hasSelectedData() {\n    return !!this.selection;\n  }\n\n  collapse(collapsed, data = this.data) {\n    data.forEach(datum => {\n      datum[_constants.FieldNames.Collapsed] = collapsed;\n    });\n    this.isCollapsed = collapsed;\n  }\n\n  activate(datum) {\n    this.deactivate();\n    datum[_constants.FieldNames.Active] = true;\n    this.active = datum;\n  }\n\n  deactivate() {\n    if (this.active) {\n      delete this.active[_constants.FieldNames.Active];\n    }\n\n    this.active = null;\n  }\n\n  ordinalIndexWithinSelection(ordinal) {\n    if (this.selection) {\n      for (let i = 0; i < this.selection.included.length; i++) {\n        let datum = this.selection.included[i];\n\n        if (datum[VegaDeckGl.constants.GL_ORDINAL] === ordinal) {\n          return {\n            datum,\n            index: i\n          };\n        }\n      }\n    }\n\n    return {\n      datum: null,\n      index: -1\n    };\n  }\n\n  finalize() {\n    this.data = null;\n    this.filteredData = null;\n\n    if (this.selection) {\n      this.selection.excluded = null;\n      this.selection.included = null;\n      this.selection = null;\n    }\n  }\n\n}\n\nexports.DataScope = DataScope;\n},{\"./vega-deck.gl\":\"Uns8\",\"./specs/constants\":\"b0rV\",\"./searchExpression/exec\":\"TNG8\",\"./specs/inference\":\"SLia\"}],\"KCB5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Details = void 0;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nvar _vegaDeck = require(\"./vega-deck.gl\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _util = require(\"./util\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar Action;\n\n(function (Action) {\n  Action[Action[\"deselect\"] = 0] = \"deselect\";\n  Action[Action[\"isolate\"] = 1] = \"isolate\";\n  Action[Action[\"exclude\"] = 2] = \"exclude\";\n  Action[Action[\"reset\"] = 3] = \"reset\";\n  Action[Action[\"next\"] = 4] = \"next\";\n  Action[Action[\"previous\"] = 5] = \"previous\";\n})(Action || (Action = {}));\n\nclass Details {\n  constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n    this.language = language;\n    this.animator = animator;\n    this.dataScope = dataScope;\n    this.colorMapHandler = colorMapHandler;\n    this.hasColorMaps = hasColorMaps;\n    this.element = _vegaDeck.util.addDiv(parentElement, `${_defaults.cssPrefix}unitControls`);\n    this.clear();\n  }\n\n  finalize() {\n    if (this.element) this.element.innerHTML = '';\n    this.dataScope = null;\n    this.element = null;\n  }\n\n  clear() {\n    this.state = {\n      userSelection: null,\n      index: -1,\n      remapColor: false\n    };\n    this.render();\n  }\n\n  clearSelection() {\n    this.state.userSelection = null;\n    this.state.index = -1;\n    this.render();\n  }\n\n  populate(userSelection, index = 0) {\n    this.state.userSelection = userSelection;\n    this.state.index = index;\n    this.render();\n  }\n\n  selectByNameValue(columnName, value) {\n    const search = {\n      name: columnName,\n      operator: '==',\n      value\n    };\n    this.clearSelection();\n    this.animator.select(search);\n    this.populate(this.dataScope.selection);\n  }\n\n  remapChanged(remap) {\n    this.state.remapColor = remap;\n    this.colorMapHandler(remap);\n    this.render();\n  }\n\n  handleAction(action) {\n    let p;\n    const u = this.state.userSelection;\n\n    switch (action) {\n      case Action.deselect:\n        this.clearSelection();\n        p = this.animator.deselect();\n        break;\n\n      case Action.exclude:\n        this.clearSelection();\n        p = this.animator.filter(searchExpression.invert(u.search), u.excluded, u.included);\n        this.state.remapColor = false;\n        break;\n\n      case Action.isolate:\n        this.clearSelection();\n        p = this.animator.filter(u.search, u.included, u.excluded);\n        this.state.remapColor = false;\n        break;\n\n      case Action.reset:\n        this.clear();\n        p = this.animator.reset();\n        break;\n\n      default:\n        switch (action) {\n          case Action.previous:\n            this.state.index--;\n\n            if (this.state.index < 0) {\n              this.state.index = this.state.userSelection.included.length - 1;\n            }\n\n            break;\n\n          case Action.next:\n            this.state.index++;\n\n            if (this.state.index >= this.state.userSelection.included.length) {\n              this.state.index = 0;\n            }\n\n            break;\n        }\n\n        this.render();\n        p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n    }\n\n    p.then(() => this.render());\n  }\n\n  render() {\n    const hasRefinedData = !!this.dataScope.filteredData;\n    const renderProps = {\n      language: this.language,\n      actionHandler: action => this.handleAction(action),\n      selectionHandler: (columnName, value) => this.selectByNameValue(columnName, value),\n      count: this.state.userSelection && this.state.userSelection.included.length,\n      hasRefinedData,\n      item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n      remapColorHandler: remap => this.remapChanged(remap),\n      hasColorMaps: this.hasColorMaps() && hasRefinedData,\n      remapColor: this.state.remapColor\n    };\n    (0, _tsxCreateElement.mount)(renderDetails(renderProps), this.element);\n  }\n\n}\n\nexports.Details = Details;\n\nconst renderDetails = props => {\n  const controlButtons = [(0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.deselect)\n  }, props.language.deselect), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.isolate)\n  }, props.language.isolate), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.exclude)\n  }, props.language.exclude)];\n  const colorMapping = (0, _tsxCreateElement.createElement)(\"div\", null, (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: props.remapColor,\n    onClick: e => props.remapColorHandler(true)\n  }, props.language.newColorMap), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.remapColor,\n    onClick: e => props.remapColorHandler(false)\n  }, props.language.oldColorMap));\n  const singleItem = props.count === 1;\n  const scrollButtons = [(0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: singleItem,\n    onClick: e => props.actionHandler(Action.previous)\n  }, props.language.previousDetail), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: singleItem,\n    onClick: e => props.actionHandler(Action.next)\n  }, props.language.nextDetail), (0, _tsxCreateElement.createElement)(\"span\", null, \" \", props.language.selectionCount(props.count))];\n  const rows = [];\n\n  for (let prop in props.item) {\n    if (prop === _vegaDeck.constants.GL_ORDINAL) {\n      continue;\n    }\n\n    if ((0, _util.isInternalFieldName)(prop)) {\n      continue;\n    }\n\n    rows.push({\n      cells: [{\n        content: prop\n      }, {\n        content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler)\n      }]\n    });\n  }\n\n  return (0, _tsxCreateElement.createElement)(\"div\", null, props.hasColorMaps && colorMapping, (0, _tsxCreateElement.createElement)(\"h4\", null, props.language.headers.selection), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}selection`\n  }, controlButtons, (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.hasRefinedData,\n    onClick: e => props.actionHandler(Action.reset)\n  }, \"reset\")), props.item && (0, _tsxCreateElement.createElement)(\"h4\", null, props.language.headers.details), (0, _tsxCreateElement.createElement)(\"div\", null, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}details-scroll`\n  }, props.item && scrollButtons), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}details`\n  }, props.item && (0, _tsxCreateElement.createElement)(_vegaDeck.controls.Table, {\n    rows: rows\n  }))));\n};\n\nfunction linkSelect(language, columnName, value, selectionHandler) {\n  return (0, _tsxCreateElement.createElement)(\"span\", null, (0, _tsxCreateElement.createElement)(\"a\", {\n    href: \"#\",\n    onClick: e => selectionHandler(columnName, value)\n  }, value), isNaN(value) ? [' ', (0, _tsxCreateElement.createElement)(\"a\", {\n    className: \"bing-search\",\n    href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n    target: \"_blank\"\n  }, language.bing)] : '');\n}\n},{\"./searchExpression\":\"mJgy\",\"./vega-deck.gl\":\"Uns8\",\"tsx-create-element\":\"QGtg\",\"./defaults\":\"G0Md\",\"./util\":\"BTLl\"}],\"nQLz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ensureHeaders = ensureHeaders;\n\nvar _vegaDeck = require(\"./vega-deck.gl\");\n\nfunction ensureHeaders(presenter, headers) {\n  const vegaControls = presenter.getElement(_vegaDeck.PresenterElement.vegaControls);\n  conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n  const legend = presenter.getElement(_vegaDeck.PresenterElement.legend);\n  conditionalHeader(!!legend.children.length, legend, headers.legend);\n}\n\nfunction conditionalHeader(condition, element, header) {\n  var existing = existingHeader(element, header);\n\n  if (condition && !existing) {\n    addHeader(element, header);\n  }\n\n  if (!condition && existing) {\n    existing.remove();\n  }\n}\n\nfunction addHeader(element, header) {\n  const h = document.createElement('h4');\n  h.innerHTML = header;\n  element.insertAdjacentElement('beforebegin', h);\n}\n\nfunction existingHeader(element, header) {\n  const {\n    previousElementSibling\n  } = element;\n\n  if (previousElementSibling && previousElementSibling.innerHTML === header) {\n    return previousElementSibling;\n  }\n}\n},{\"./vega-deck.gl\":\"Uns8\"}],\"rI67\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.finalizeLegend = finalizeLegend;\n\nvar _expression = require(\"./expression\");\n\nvar _constants = require(\"./specs/constants\");\n\nfunction legendRange(colorBinType, column, legend, clickedIndex) {\n  if (column.quantitative) {\n    return selectQuantitative(colorBinType, column, legend, clickedIndex);\n  } else {\n    return selectCategorical(column, legend, clickedIndex);\n  }\n}\n\nfunction selectCategorical(column, legend, clickedIndex) {\n  const value = legend.rows[clickedIndex].value;\n\n  if (value === _constants.Other) {\n    const values = [];\n\n    for (let i in legend.rows) {\n      if (+i !== clickedIndex) {\n        values.push(legend.rows[i].value);\n      }\n    }\n\n    return (0, _expression.selectNone)(column, values);\n  } else {\n    //select equal\n    return {\n      expressions: [(0, _expression.selectExact)(column, legend.rows[clickedIndex].value)]\n    };\n  }\n}\n\nfunction selectQuantitative(colorBinType, column, legend, clickedIndex) {\n  const keys = Object.keys(legend.rows).map(key => +key).sort((a, b) => +a - +b);\n  let lowValue;\n  let lowOperator;\n  let highValue;\n  let highOperator;\n  const rowText = legend.rows[clickedIndex].label;\n\n  switch (colorBinType) {\n    case 'continuous':\n      {\n        lowValue = rowText;\n\n        if (clickedIndex < keys.length - 1) {\n          highValue = legend.rows[clickedIndex + 1].value;\n        }\n\n        break;\n      }\n\n    default:\n      {\n        if (rowText.indexOf('null') > 0) {\n          const ex = {\n            expressions: [(0, _expression.selectNullOrEmpty)(column)]\n          };\n          return ex;\n        }\n\n        const dash = rowText.indexOf('–'); //this is not the common dash character!\n\n        if (dash > 0) {\n          //bug in Vega for quantize?\n          //lowOperator = '>';\n          //highOperator = '<=';\n          lowValue = rowText.substr(0, dash);\n          highValue = rowText.substr(dash + 1);\n        } else {\n          if (rowText.indexOf('<') >= 0) {\n            highValue = rowText.substring(2);\n          } else {\n            if (rowText.indexOf('≥') >= 0) {\n              lowValue = rowText.substring(2);\n            }\n          }\n        }\n      }\n  }\n\n  if (lowValue) lowValue = (0, _expression.notNice)(lowValue);\n  if (highValue) highValue = (0, _expression.notNice)(highValue);\n  return (0, _expression.selectBetween)(column, lowValue, highValue, lowOperator, highOperator);\n}\n\nfunction finalizeLegend(colorBinType, colorColumn, legend, language) {\n  const rowTexts = [];\n\n  for (let i in legend.rows) {\n    let row = legend.rows[i];\n    row.search = legendRange(colorBinType, colorColumn, legend, +i);\n\n    if (row.value === _constants.Other) {\n      row.label = language.legendOther;\n    } else if (rowTexts.indexOf(row.value) >= 0) {\n      delete legend.rows[i];\n    } else {\n      rowTexts.push(row.value);\n    }\n  }\n}\n},{\"./expression\":\"JTcr\",\"./specs/constants\":\"b0rV\"}],\"A7xy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.recolorAxes = recolorAxes;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"./vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction cloneAxis(axes, axisColor, axisTextColor) {\n  return axes.map(axis => {\n    const newAxis = VegaDeckGl.util.deepMerge(axis);\n    newAxis.domain.color = axisColor;\n    newAxis.title.color = axisTextColor;\n    newAxis.ticks.forEach(t => {\n      t.color = axisColor;\n    });\n    newAxis.tickText.forEach(t => {\n      t.color = axisTextColor;\n    });\n    return newAxis;\n  });\n}\n\nfunction cloneTextData(textData, color) {\n  return textData.map(t => {\n    return Object.assign(Object.assign({}, t), {\n      color\n    });\n  });\n}\n\nfunction colorEquals(a, b) {\n  if (a.length !== b.length) return false;\n\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return false;\n  }\n\n  return true;\n}\n\nfunction recolorAxes(stage, oldColors, newColors) {\n  const hasNewLineColor = newColors.axisLine && !colorEquals(newColors.axisLine, oldColors.axisLine);\n  const hasNewTextColor = newColors.axisText && !colorEquals(newColors.axisText, oldColors.axisText);\n  let axes;\n  let textData;\n\n  if (hasNewLineColor || hasNewTextColor) {\n    const lineColor = newColors.axisLine || oldColors.axisLine;\n    const textColor = newColors.axisText || oldColors.axisText;\n    axes = {\n      x: cloneAxis(stage.axes.x, lineColor, textColor),\n      y: cloneAxis(stage.axes.y, lineColor, textColor)\n    };\n  }\n\n  if (hasNewTextColor) {\n    textData = cloneTextData(stage.textData, newColors.axisText);\n  }\n\n  return {\n    axes,\n    textData\n  };\n}\n},{\"./vega-deck.gl\":\"Uns8\"}],\"bkgF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Tooltip = void 0;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _constants = require(\"./vega-deck.gl/constants\");\n\nvar _util = require(\"./util\");\n\nvar _htmlHelpers = require(\"./vega-deck.gl/htmlHelpers\");\n\nvar _controls = require(\"./vega-deck.gl/controls\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nclass Tooltip {\n  constructor(props) {\n    const renderProps = {\n      cssPrefix: props.cssPrefix,\n      rows: getRows(props.item, props.options)\n    };\n    this.element = renderTooltip(renderProps);\n\n    if (this.element) {\n      this.element.style.position = 'absolute';\n      this.child = this.element.firstChild;\n      document.body.appendChild(this.element); //measure and move as necessary\n\n      let m = (0, _htmlHelpers.outerSize)(this.child);\n\n      while (m.height > document.documentElement.clientHeight) {\n        let tr = this.child.querySelector('tr:last-child');\n\n        if (tr) {\n          tr.parentElement.removeChild(tr);\n        } else {\n          break;\n        }\n\n        m = (0, _htmlHelpers.outerSize)(this.child);\n      }\n\n      if (props.position.clientX + m.width >= document.documentElement.clientWidth) {\n        this.child.style.right = '0';\n      }\n\n      let moveTop = true;\n\n      if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n        if (props.position.clientY - m.height > 0) {\n          this.child.style.bottom = '0';\n        } else {\n          moveTop = false;\n        }\n      }\n\n      if (moveTop) {\n        this.element.style.top = `${props.position.clientY}px`;\n      }\n\n      this.element.style.left = `${props.position.clientX}px`;\n    }\n  }\n\n  finalize() {\n    if (this.element) {\n      document.body.removeChild(this.element);\n    }\n\n    this.element = null;\n  }\n\n}\n\nexports.Tooltip = Tooltip;\n\nfunction getRows(item, options) {\n  const rows = [];\n\n  for (let columnName in item) {\n    if (columnName === _constants.GL_ORDINAL) {\n      continue;\n    }\n\n    if ((0, _util.isInternalFieldName)(columnName)) {\n      continue;\n    }\n\n    if (options && options.exclude) {\n      if (options.exclude(columnName)) {\n        continue;\n      }\n    }\n\n    let value = item[columnName];\n    let content;\n\n    if (options && options.displayValue) {\n      content = options.displayValue(value);\n    } else {\n      switch (value) {\n        case null:\n          content = (0, _tsxCreateElement.createElement)(\"i\", null, \"null\");\n          break;\n\n        case undefined:\n          content = (0, _tsxCreateElement.createElement)(\"i\", null, \"undefined\");\n          break;\n\n        default:\n          content = value.toString();\n      }\n    }\n\n    rows.push({\n      cells: [{\n        content: columnName + ':'\n      }, {\n        content\n      }]\n    });\n  }\n\n  return rows;\n}\n\nconst renderTooltip = props => {\n  return props.rows.length === 0 ? null : (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${props.cssPrefix}tooltip`\n  }, (0, _controls.Table)({\n    rows: props.rows\n  }));\n};\n},{\"tsx-create-element\":\"QGtg\",\"./vega-deck.gl/constants\":\"ipKi\",\"./util\":\"BTLl\",\"./vega-deck.gl/htmlHelpers\":\"todx\",\"./vega-deck.gl/controls\":\"AQhe\"}],\"CdFf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Viewer = void 0;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"./vega-deck.gl\"));\n\nvar _animator = require(\"./animator\");\n\nvar _colorCubes = require(\"./colorCubes\");\n\nvar _signals = require(\"./signals\");\n\nvar _ordinal = require(\"./ordinal\");\n\nvar _axisSelection = require(\"./axisSelection\");\n\nvar _clone = require(\"./specs/clone\");\n\nvar _dataScope = require(\"./dataScope\");\n\nvar _defaults = require(\"./vega-deck.gl/defaults\");\n\nvar _defaults2 = require(\"./defaults\");\n\nvar _details = require(\"./details\");\n\nvar _headers = require(\"./headers\");\n\nvar _legend = require(\"./legend\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _axes = require(\"./axes\");\n\nvar _colorSchemes = require(\"./colorSchemes\");\n\nvar _tooltip = require(\"./tooltip\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nlet didRegisterColorSchemes = false;\n/**\n * Component to view a SandDance data visualization.\n */\n\nclass Viewer {\n  /**\n   * Instantiate a new Viewer.\n   * @param element Parent HTMLElement to present within.\n   * @param options Optional viewer options object.\n   */\n  constructor(element, options) {\n    this.element = element;\n    this.options = VegaDeckGl.util.deepMerge(_defaults2.defaultViewerOptions, options);\n    this.presenter = new VegaDeckGl.Presenter(element, (0, _defaults2.getPresenterStyle)(this.options));\n    this._dataScope = new _dataScope.DataScope();\n    this._animator = new _animator.Animator(this._dataScope, {\n      onDataChanged: this.onDataChanged.bind(this),\n      onAnimateDataChange: this.onAnimateDataChange.bind(this)\n    });\n    this._details = new _details.Details(this.presenter.getElement(VegaDeckGl.PresenterElement.panel), this.options.language, this._animator, this._dataScope, remap => {\n      this.currentColorContext = ~~remap;\n      this.renderSameLayout();\n    }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n    this.insight = {};\n    this._signalValues = {};\n  }\n\n  changeColorContexts(colorContexts) {\n    this.colorContexts = colorContexts;\n    this.currentColorContext = 0;\n    this.options.onColorContextChange && this.options.onColorContextChange();\n  }\n\n  applyLegendColorContext(colorContext) {\n    (0, _tsxCreateElement.mount)(colorContext.legendElement, this.presenter.getElement(VegaDeckGl.PresenterElement.legend));\n    this.presenter.stage.legend = colorContext.legend;\n  }\n\n  onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n    if (dataChange === _animator.DataLayoutChange.refine) {\n      const oldColorContext = this.colorContexts[this.currentColorContext];\n      this.renderNewLayout({\n        preStage: (stage, deckProps) => {\n          (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n          (0, _colorCubes.applyColorMapToCubes)([oldColorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n\n          if (this.options.onStage) {\n            this.options.onStage(stage, deckProps);\n          }\n        }\n      }); //apply old legend\n\n      this.applyLegendColorContext(oldColorContext);\n    } else {\n      this.renderNewLayout({\n        preStage: (stage, deckProps) => {\n          (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n\n          if (this.options.onStage) {\n            this.options.onStage(stage, deckProps);\n          }\n        }\n      });\n    }\n\n    return new Promise((resolve, reject) => {\n      this.presenter.animationQueue(resolve, this.options.transitionDurations.position, {\n        waitingLabel,\n        handlerLabel,\n        animationCanceled: reject\n      });\n    });\n  }\n\n  onDataChanged(dataLayout, filter) {\n    switch (dataLayout) {\n      case _animator.DataLayoutChange.same:\n        {\n          this.renderSameLayout();\n          break;\n        }\n\n      case _animator.DataLayoutChange.refine:\n        {\n          //save cube colors\n          const oldColorContext = this.colorContexts[this.currentColorContext];\n          let colorMap;\n          this.renderNewLayout({\n            preStage: (stage, deckProps) => {\n              //save off the spec colors\n              colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n              (0, _colorCubes.applyColorMapToCubes)([oldColorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n              this.preStage(stage, deckProps);\n            },\n            onPresent: () => {\n              //save new legend\n              const newColorContext = {\n                colorMap,\n                legend: VegaDeckGl.util.clone(this.presenter.stage.legend),\n                legendElement: this.presenter.getElement(VegaDeckGl.PresenterElement.legend).children[0]\n              }; //apply old legend\n\n              this.applyLegendColorContext(oldColorContext);\n              this.changeColorContexts([oldColorContext, newColorContext]);\n            }\n          });\n          this.insight.filter = searchExpression.narrow(this.insight.filter, filter);\n\n          if (this.options.onDataFilter) {\n            this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n          }\n\n          break;\n        }\n\n      case _animator.DataLayoutChange.reset:\n        {\n          const colorContext = {\n            colorMap: null,\n            legend: null,\n            legendElement: null\n          };\n          this.changeColorContexts([colorContext]);\n          this.renderNewLayout({\n            onPresent: () => {\n              (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n            }\n          });\n          delete this.insight.filter;\n\n          if (this.options.onDataFilter) {\n            this.options.onDataFilter(null, null);\n          }\n\n          break;\n        }\n    }\n\n    if (this.options.onSelectionChanged) {\n      const sel = this.getSelection();\n      this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n    }\n  }\n\n  renderNewLayout(c, view) {\n    const currData = this._dataScope.currentData();\n\n    const context = {\n      specColumns: this._specColumns,\n      insight: this.insight,\n      specViewOptions: this.options\n    };\n    const specResult = (0, _clone.cloneVegaSpecWithData)(context, currData);\n\n    if (!specResult.errors) {\n      const uiValues = (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n      this._signalValues = Object.assign(Object.assign(Object.assign({}, this._signalValues), uiValues), this.insight.signalValues);\n      (0, _signals.applySignalValues)(this._signalValues, specResult.vegaSpec);\n      this.vegaSpec = specResult.vegaSpec;\n      this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n      this.specCapabilities = specResult.specCapabilities;\n      const config = this.createConfig(c);\n\n      if (view) {\n        config.getView = () => view;\n      }\n\n      if (!didRegisterColorSchemes) {\n        (0, _colorSchemes.registerColorSchemes)(VegaDeckGl.base.vega);\n        didRegisterColorSchemes = true;\n      }\n\n      try {\n        const runtime = VegaDeckGl.base.vega.parse(this.vegaSpec);\n        this.vegaViewGl = new VegaDeckGl.ViewGl(runtime, config).renderer('deck.gl').initialize(this.element).run(); //capture new color color contexts via signals\n\n        this.configForSignalCapture(config.presenterConfig);\n      } catch (e) {\n        specResult.errors = [e.message];\n      }\n\n      if (!specResult.errors) {\n        (0, _headers.ensureHeaders)(this.presenter, this.options.language.headers);\n      }\n    }\n\n    if (specResult.errors) {\n      if (this.options.onError) {\n        this.options.onError(specResult.errors);\n      } else if (this.presenter.logger) {\n        this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n      }\n    }\n\n    return specResult;\n  }\n  /**\n   * Render the same layout with new options.\n   * @param newViewerOptions New options object.\n   */\n\n\n  renderSameLayout(newViewerOptions) {\n    const colorContext = this.colorContexts[this.currentColorContext];\n    const clonedCubes = this.presenter.getCubeData().map(cube => {\n      return Object.assign({}, cube);\n    });\n    this.applyLegendColorContext(colorContext);\n    let {\n      axes,\n      textData\n    } = this.presenter.stage;\n    let recoloredAxes;\n\n    if (newViewerOptions) {\n      if (newViewerOptions.colors) {\n        recoloredAxes = (0, _axes.recolorAxes)(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n        axes = recoloredAxes.axes || axes;\n        textData = recoloredAxes.textData || textData;\n      }\n\n      this.options = VegaDeckGl.util.deepMerge(this.options, newViewerOptions);\n    }\n\n    let colorMaps = [colorContext.colorMap];\n    let colorMethod;\n\n    const hasSelectedData = this._dataScope.hasSelectedData();\n\n    const hasActive = !!this._dataScope.active;\n\n    if (hasSelectedData || hasActive) {\n      const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n      colorMaps.push(selectedColorMap);\n      colorMethod = this.options.colors.unselectedColorMethod;\n    }\n\n    (0, _colorCubes.applyColorMapToCubes)(colorMaps, clonedCubes, colorMethod);\n    const stage = {\n      cubeData: clonedCubes,\n      axes,\n      textData\n    };\n    this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n  }\n\n  getView(view) {\n    if (view === undefined) {\n      if (this.presenter.view === null) {\n        return _defaults.defaultView;\n      } else {\n        return this.presenter.view;\n      }\n    } else {\n      return view;\n    }\n  }\n  /**\n   * Render data into a visualization.\n   * @param insight Object to create a visualization specification.\n   * @param data Array of data objects.\n   * @param view Optional View to specify camera type.\n   * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n   */\n\n\n  render(insight, data, options = {}) {\n    return new Promise((resolve, reject) => {\n      let result;\n\n      const layout = () => {\n        result = this._render(insight, data, options);\n      }; //see if refine expression has changed\n\n\n      if (!searchExpression.compare(insight.filter, this.insight.filter)) {\n        if (insight.filter) {\n          //refining\n          layout();\n          this.presenter.animationQueue(() => {\n            this.filter(insight.filter);\n          }, this.options.transitionDurations.position, {\n            waitingLabel: 'layout before refine',\n            handlerLabel: 'refine after layout'\n          });\n        } else {\n          //not refining\n          this._dataScope.filteredData = null;\n          layout();\n          this.presenter.animationQueue(() => {\n            this.reset();\n          }, 0, {\n            waitingLabel: 'layout before reset',\n            handlerLabel: 'reset after layout'\n          });\n        }\n      } else {\n        layout();\n      }\n\n      resolve(result);\n    });\n  }\n\n  shouldViewstateTransition(newInsight, oldInsight) {\n    if (!oldInsight.columns) return false;\n    if (oldInsight.chart !== newInsight.chart) return true;\n    if (oldInsight.size.height !== newInsight.size.height) return true;\n    if (oldInsight.size.width !== newInsight.size.width) return true;\n    if (oldInsight.columns.facet !== newInsight.columns.facet) return true;\n    return false;\n  }\n\n  configForSignalCapture(presenterConfig) {\n    const colorContext = {\n      colorMap: null,\n      legend: null,\n      legendElement: null\n    }; //now be ready to capture color changing signals \n\n    presenterConfig.preStage = (stage, deckProps) => {\n      if (this._shouldSaveColorContext()) {\n        //save off the colors from Vega layout\n        colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n      }\n\n      this.preStage(stage, deckProps);\n    };\n\n    presenterConfig.onPresent = () => {\n      if (this._shouldSaveColorContext()) {\n        (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n        this.changeColorContexts([colorContext]);\n\n        this._dataScope.deselect();\n      }\n    };\n  }\n\n  _render(insight, data, options) {\n    if (this._tooltip) {\n      this._tooltip.finalize();\n\n      this._tooltip = null;\n    }\n\n    if (this._dataScope.setData(data, options.columns)) {\n      //data is different, reset the signal value cache\n      this._signalValues = {};\n    }\n\n    this._specColumns = (0, _ordinal.getSpecColumns)(insight, this._dataScope.getColumns(options.columnTypes));\n    const ordinalMap = (0, _ordinal.assignOrdinals)(this._specColumns, data, options.ordinalMap);\n    this.insight = VegaDeckGl.util.clone(insight);\n    this._lastColorOptions = VegaDeckGl.util.clone(this.options.colors);\n\n    this._shouldSaveColorContext = () => !options.initialColorContext;\n\n    const colorContext = options.initialColorContext || {\n      colorMap: null,\n      legend: null,\n      legendElement: null\n    };\n    const specResult = this.renderNewLayout({\n      preStage: (stage, deckProps) => {\n        if (this._shouldSaveColorContext()) {\n          //save off the colors from Vega layout\n          colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n        } else {\n          //apply passed colorContext\n          (0, _colorCubes.applyColorMapToCubes)([colorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n        } //if items are selected, repaint\n\n\n        const hasSelectedData = !!this._dataScope.hasSelectedData();\n        const hasActive = !!this._dataScope.active;\n\n        if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n          const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n          (0, _colorCubes.applyColorMapToCubes)([colorContext.colorMap, selectedColorMap], stage.cubeData, this.options.colors.unselectedColorMethod);\n        }\n\n        this.preStage(stage, deckProps);\n      },\n      onPresent: () => {\n        if (this._shouldSaveColorContext()) {\n          (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n          this.changeColorContexts([colorContext]);\n        } else {\n          //apply passed colorContext\n          this.applyLegendColorContext(colorContext);\n        }\n      },\n      shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight)\n    }, this.getView(insight.view)); //future signal changes should save the color context\n\n    this._shouldSaveColorContext = () => !options.discardColorContextUpdates || !options.discardColorContextUpdates();\n\n    this._details.render();\n\n    const result = {\n      ordinalMap,\n      specResult\n    };\n    return result;\n  }\n\n  preStage(stage, deckProps) {\n    const onClick = (e, search) => {\n      if (this.options.onAxisClick) {\n        this.options.onAxisClick(e, search);\n      } else {\n        this.select(search);\n      }\n    };\n\n    const polygonLayer = (0, _axisSelection.axisSelectionLayer)(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n    const order = 1; //after textlayer but before others\n\n    deckProps.layers.splice(order, 0, polygonLayer);\n    (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n\n    if (this.options.onStage) {\n      this.options.onStage(stage, deckProps);\n    }\n  }\n\n  onCubeClick(e, cube) {\n    const hasSelectedData = this._dataScope.hasSelectedData();\n\n    if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n      //if active is within selection, keep the selection and activate the one.\n      const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n\n      if (indexWithinSelection.index >= 0) {\n        this.activate(indexWithinSelection.datum);\n\n        this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n\n        if (this.options.onSelectionChanged) {\n          const sel = this.getSelection();\n          this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n        }\n\n        return;\n      }\n    }\n\n    if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][VegaDeckGl.constants.GL_ORDINAL] === cube.ordinal) {\n      this.deselect();\n      return;\n    }\n\n    const search = {\n      name: VegaDeckGl.constants.GL_ORDINAL,\n      operator: '==',\n      value: cube.ordinal\n    };\n    this.select(search);\n  }\n\n  onCubeHover(e, cube) {\n    if (this._tooltip) {\n      this._tooltip.finalize();\n\n      this._tooltip = null;\n    }\n\n    if (!cube) {\n      return;\n    }\n\n    const currentData = this._dataScope.currentData();\n\n    const index = (0, _ordinal.getDataIndexOfCube)(cube, currentData);\n\n    if (index >= 0) {\n      this._tooltip = new _tooltip.Tooltip({\n        options: this.options.tooltipOptions,\n        item: currentData[index],\n        position: e,\n        cssPrefix: this.presenter.style.cssPrefix\n      });\n    }\n  }\n\n  onTextHover(e, t) {\n    //return true if highlight color is different\n    if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor) return false;\n    return !VegaDeckGl.util.colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n  }\n\n  createConfig(c) {\n    const {\n      getTextColor,\n      getTextHighlightColor,\n      onTextClick\n    } = this.options;\n    const defaultPresenterConfig = {\n      getTextColor,\n      getTextHighlightColor,\n      onTextClick,\n      onCubeClick: this.onCubeClick.bind(this),\n      onCubeHover: this.onCubeHover.bind(this),\n      onTextHover: this.onTextHover.bind(this),\n      preStage: this.preStage.bind(this),\n      onPresent: this.options.onPresent,\n      onLayerClick: (info, pickedInfos, e) => {\n        if (!info) {\n          this.deselect();\n        }\n      },\n      onLegendClick: (e, legend, clickedIndex) => {\n        const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n\n        if (legendRow) {\n          if (this.options.onLegendRowClick) {\n            this.options.onLegendRowClick(e, legendRow);\n          } else {\n            this.select(legendRow.search);\n          }\n        } else if (this.options.onLegendHeaderClick) {\n          //header clicked\n          this.options.onLegendHeaderClick(e);\n        }\n      }\n    };\n\n    if (this.options.onBeforeCreateLayers) {\n      defaultPresenterConfig.preLayer = stage => this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n    }\n\n    const config = {\n      presenter: this.presenter,\n      presenterConfig: Object.assign(defaultPresenterConfig, c)\n    };\n\n    if (this.options.transitionDurations) {\n      config.presenterConfig.transitionDurations = this.options.transitionDurations;\n    }\n\n    return config;\n  }\n  /**\n   * Filter the data and animate.\n   * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n   */\n\n\n  filter(search) {\n    const u = this._dataScope.createUserSelection(search, false);\n\n    return new Promise((resolve, reject) => {\n      this._animator.filter(search, u.included, u.excluded).then(() => {\n        this._details.clear();\n\n        this._details.clearSelection();\n\n        this._details.populate(this._dataScope.selection);\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Remove any filtration and animate.\n   */\n\n\n  reset() {\n    return new Promise((resolve, reject) => {\n      this._animator.reset().then(() => {\n        this._details.clear();\n\n        this._details.clearSelection();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Select cubes by a filter expression.\n   * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n   */\n\n\n  select(search) {\n    return new Promise((resolve, reject) => {\n      this._animator.select(search).then(() => {\n        this._details.populate(this._dataScope.selection);\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Removes any selection.\n   */\n\n\n  deselect() {\n    return new Promise((resolve, reject) => {\n      this._animator.deselect().then(() => {\n        this._details.clearSelection();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Gets the current selection.\n   */\n\n\n  getSelection() {\n    if (!this._dataScope) return null;\n    const selectionState = {\n      search: this._dataScope.selection && this._dataScope.selection.search || null,\n      selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n      active: this._dataScope.active\n    };\n    return selectionState;\n  }\n  /**\n   * Set one data row to the active state.\n   */\n\n\n  activate(datum) {\n    return new Promise((resolve, reject) => {\n      this._animator.activate(datum).then(() => {\n        this._details.render();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Deactivate item.\n   */\n\n\n  deActivate() {\n    return new Promise((resolve, reject) => {\n      if (this._dataScope && this._dataScope.active) {\n        this._animator.deactivate().then(() => {\n          this._details.render();\n\n          resolve();\n        });\n      } else {\n        resolve();\n      }\n    });\n  }\n  /**\n   * Gets the current insight with signal values.\n   */\n\n\n  getInsight() {\n    const insight = Object.assign({}, this.insight);\n    insight.signalValues = this.getSignalValues();\n    return insight;\n  }\n  /**\n   * Gets current signal values.\n   */\n\n\n  getSignalValues() {\n    return (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n  }\n\n  finalize() {\n    if (this._dataScope) this._dataScope.finalize();\n    if (this._details) this._details.finalize();\n    if (this._tooltip) this._tooltip.finalize();\n    if (this.vegaViewGl) this.vegaViewGl.finalize();\n    if (this.presenter) this.presenter.finalize();\n    if (this.element) this.element.innerHTML = '';\n    this.colorContexts = null;\n    this.element = null;\n    this.options = null;\n    this.presenter = null;\n    this.vegaSpec = null;\n    this.vegaViewGl = null;\n    this._animator = null;\n    this._dataScope = null;\n    this._details = null;\n    this._tooltip = null;\n  }\n\n}\n/**\n * Default Viewer options.\n */\n\n\nexports.Viewer = Viewer;\nViewer.defaultViewerOptions = _defaults2.defaultViewerOptions;\n},{\"./searchExpression\":\"mJgy\",\"./vega-deck.gl\":\"Uns8\",\"./animator\":\"U1OZ\",\"./colorCubes\":\"PfBA\",\"./signals\":\"jmI2\",\"./ordinal\":\"dxn8\",\"./axisSelection\":\"oIzg\",\"./specs/clone\":\"DO07\",\"./dataScope\":\"MJ1d\",\"./vega-deck.gl/defaults\":\"JuFU\",\"./defaults\":\"G0Md\",\"./details\":\"KCB5\",\"./headers\":\"nQLz\",\"./legend\":\"rI67\",\"tsx-create-element\":\"QGtg\",\"./axes\":\"A7xy\",\"./colorSchemes\":\"kNpg\",\"./tooltip\":\"bkgF\"}],\"DZif\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.version = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst version = '1.6.7';\nexports.version = version;\n},{}],\"rZaE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"use\", {\n  enumerable: true,\n  get: function () {\n    return VegaDeckGl.use;\n  }\n});\nObject.defineProperty(exports, \"colorSchemes\", {\n  enumerable: true,\n  get: function () {\n    return _colorSchemes.colorSchemes;\n  }\n});\nObject.defineProperty(exports, \"Viewer\", {\n  enumerable: true,\n  get: function () {\n    return _viewer.Viewer;\n  }\n});\nObject.defineProperty(exports, \"version\", {\n  enumerable: true,\n  get: function () {\n    return _version.version;\n  }\n});\nexports.VegaDeckGl = exports.util = exports.types = exports.searchExpression = exports.constants = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nexports.searchExpression = searchExpression;\n\nvar types = _interopRequireWildcard(require(\"./types\"));\n\nexports.types = types;\n\nvar util = _interopRequireWildcard(require(\"./util\"));\n\nexports.util = util;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"./vega-deck.gl\"));\n\nexports.VegaDeckGl = VegaDeckGl;\n\nvar _colorSchemes = require(\"./colorSchemes\");\n\nvar _viewer = require(\"./viewer\");\n\nvar _version = require(\"./version\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./constants\":\"Syc7\",\"./searchExpression\":\"mJgy\",\"./types\":\"JCLk\",\"./util\":\"BTLl\",\"./vega-deck.gl\":\"Uns8\",\"./colorSchemes\":\"kNpg\",\"./viewer\":\"CdFf\",\"./version\":\"DZif\"}],\"wkaK\":[function(require,module,exports) {\nmodule.exports = compare;\n\n/*\n  primitives: value1 === value2\n  functions: value1.toString == value2.toString\n  arrays: if length, sequence and values of properties are identical\n  objects: if length, names and values of properties are identical\n  compare([[1, [2, 3]], [[1, [2, 3]]); // true\n  compare([[1, [2, 3], 4], [[1, [2, 3]]); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3}); // true\n  compare({a: 2, b: 3}, {b: 3, a: 2}); // true\n  compare({a: 2, b: 3, c: 4}, {a: 2, b: 3}); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3, c: 4}); // false\n  compare([[1, [2, {a: 4}], 4], [[1, [2, {a: 4}]]); // true\n*/\n\nfunction compare(value1, value2) {\n  if (value1 === value2) {\n    return true;\n  }\n  /* eslint-disable no-self-compare */\n  // if both values are NaNs return true\n  if ((value1 !== value1) && (value2 !== value2)) {\n    return true;\n  }\n  if ({}.toString.call(value1) != {}.toString.call(value2)) {\n    return false;\n  }\n  if (value1 !== Object(value1)) {\n    // non equal primitives\n    return false;\n  }\n  if (!value1) {\n    return false;\n  }\n  if (Array.isArray(value1)) {\n    return compareArrays(value1, value2);\n  }\n  if ({}.toString.call(value1) == '[object Object]') {\n    return compareObjects(value1, value2);\n  } else {\n    return compareNativeSubtypes(value1, value2);\n  }\n}\n\nfunction compareNativeSubtypes(value1, value2) {\n  // e.g. Function, RegExp, Date\n  return value1.toString() === value2.toString();\n}\n\nfunction compareArrays(value1, value2) {\n  var len = value1.length;\n  if (len != value2.length) {\n    return false;\n  }\n  var alike = true;\n  for (var i = 0; i < len; i++) {\n    if (!compare(value1[i], value2[i])) {\n      alike = false;\n      break;\n    }\n  }\n  return alike;\n}\n\nfunction compareObjects(value1, value2) {\n  var keys1 = Object.keys(value1).sort();\n  var keys2 = Object.keys(value2).sort();\n  var len = keys1.length;\n  if (len != keys2.length) {\n    return false;\n  }\n  for (var i = 0; i < len; i++) {\n    var key1 = keys1[i];\n    var key2 = keys2[i];\n    if (!(key1 == key2 && compare(value1[key1], value2[key2]))) {\n      return false;\n    }\n  }\n  return true;\n}\n\n},{}],\"HI4Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.deepCompare = exports.classList = void 0;\n\nvar compare = _interopRequireWildcard(require(\"just-compare\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst classList = (...args) => {\n  return args.filter(Boolean).join(' ');\n};\n\nexports.classList = classList;\nconst deepCompare = compare.default || compare;\nexports.deepCompare = deepCompare;\n},{\"just-compare\":\"wkaK\"}],\"x5u5\":[function(require,module,exports) {\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n'use strict';\n/* eslint-disable no-unused-vars */\n\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n  if (val === null || val === undefined) {\n    throw new TypeError('Object.assign cannot be called with null or undefined');\n  }\n\n  return Object(val);\n}\n\nfunction shouldUseNative() {\n  try {\n    if (!Object.assign) {\n      return false;\n    } // Detect buggy property enumeration order in older V8 versions.\n    // https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\n\n    var test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\n    test1[5] = 'de';\n\n    if (Object.getOwnPropertyNames(test1)[0] === '5') {\n      return false;\n    } // https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\n\n    var test2 = {};\n\n    for (var i = 0; i < 10; i++) {\n      test2['_' + String.fromCharCode(i)] = i;\n    }\n\n    var order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n      return test2[n];\n    });\n\n    if (order2.join('') !== '0123456789') {\n      return false;\n    } // https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\n\n    var test3 = {};\n    'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n      test3[letter] = letter;\n    });\n\n    if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') {\n      return false;\n    }\n\n    return true;\n  } catch (err) {\n    // We don't expect any of the above to throw, but better to be safe.\n    return false;\n  }\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n  var from;\n  var to = toObject(target);\n  var symbols;\n\n  for (var s = 1; s < arguments.length; s++) {\n    from = Object(arguments[s]);\n\n    for (var key in from) {\n      if (hasOwnProperty.call(from, key)) {\n        to[key] = from[key];\n      }\n    }\n\n    if (getOwnPropertySymbols) {\n      symbols = getOwnPropertySymbols(from);\n\n      for (var i = 0; i < symbols.length; i++) {\n        if (propIsEnumerable.call(from, symbols[i])) {\n          to[symbols[i]] = from[symbols[i]];\n        }\n      }\n    }\n  }\n\n  return to;\n};\n},{}],\"N4VU\":[function(require,module,exports) {\n/** @license React v16.10.2\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';\n\nvar h = require(\"object-assign\"),\n    n = \"function\" === typeof Symbol && Symbol.for,\n    p = n ? Symbol.for(\"react.element\") : 60103,\n    q = n ? Symbol.for(\"react.portal\") : 60106,\n    r = n ? Symbol.for(\"react.fragment\") : 60107,\n    t = n ? Symbol.for(\"react.strict_mode\") : 60108,\n    u = n ? Symbol.for(\"react.profiler\") : 60114,\n    v = n ? Symbol.for(\"react.provider\") : 60109,\n    w = n ? Symbol.for(\"react.context\") : 60110,\n    x = n ? Symbol.for(\"react.forward_ref\") : 60112,\n    y = n ? Symbol.for(\"react.suspense\") : 60113,\n    aa = n ? Symbol.for(\"react.suspense_list\") : 60120,\n    ba = n ? Symbol.for(\"react.memo\") : 60115,\n    ca = n ? Symbol.for(\"react.lazy\") : 60116;\n\nn && Symbol.for(\"react.fundamental\");\nn && Symbol.for(\"react.responder\");\nn && Symbol.for(\"react.scope\");\nvar z = \"function\" === typeof Symbol && Symbol.iterator;\n\nfunction A(a) {\n  for (var b = a.message, c = \"https://reactjs.org/docs/error-decoder.html?invariant=\" + b, d = 1; d < arguments.length; d++) c += \"&args[]=\" + encodeURIComponent(arguments[d]);\n\n  a.message = \"Minified React error #\" + b + \"; visit \" + c + \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \";\n  return a;\n}\n\nvar B = {\n  isMounted: function () {\n    return !1;\n  },\n  enqueueForceUpdate: function () {},\n  enqueueReplaceState: function () {},\n  enqueueSetState: function () {}\n},\n    C = {};\n\nfunction D(a, b, c) {\n  this.props = a;\n  this.context = b;\n  this.refs = C;\n  this.updater = c || B;\n}\n\nD.prototype.isReactComponent = {};\n\nD.prototype.setState = function (a, b) {\n  if (\"object\" !== typeof a && \"function\" !== typeof a && null != a) throw A(Error(85));\n  this.updater.enqueueSetState(this, a, b, \"setState\");\n};\n\nD.prototype.forceUpdate = function (a) {\n  this.updater.enqueueForceUpdate(this, a, \"forceUpdate\");\n};\n\nfunction E() {}\n\nE.prototype = D.prototype;\n\nfunction F(a, b, c) {\n  this.props = a;\n  this.context = b;\n  this.refs = C;\n  this.updater = c || B;\n}\n\nvar G = F.prototype = new E();\nG.constructor = F;\nh(G, D.prototype);\nG.isPureReactComponent = !0;\nvar H = {\n  current: null\n},\n    I = {\n  suspense: null\n},\n    J = {\n  current: null\n},\n    K = Object.prototype.hasOwnProperty,\n    L = {\n  key: !0,\n  ref: !0,\n  __self: !0,\n  __source: !0\n};\n\nfunction M(a, b, c) {\n  var d,\n      e = {},\n      g = null,\n      l = null;\n  if (null != b) for (d in void 0 !== b.ref && (l = b.ref), void 0 !== b.key && (g = \"\" + b.key), b) K.call(b, d) && !L.hasOwnProperty(d) && (e[d] = b[d]);\n  var f = arguments.length - 2;\n  if (1 === f) e.children = c;else if (1 < f) {\n    for (var k = Array(f), m = 0; m < f; m++) k[m] = arguments[m + 2];\n\n    e.children = k;\n  }\n  if (a && a.defaultProps) for (d in f = a.defaultProps, f) void 0 === e[d] && (e[d] = f[d]);\n  return {\n    $$typeof: p,\n    type: a,\n    key: g,\n    ref: l,\n    props: e,\n    _owner: J.current\n  };\n}\n\nfunction da(a, b) {\n  return {\n    $$typeof: p,\n    type: a.type,\n    key: b,\n    ref: a.ref,\n    props: a.props,\n    _owner: a._owner\n  };\n}\n\nfunction N(a) {\n  return \"object\" === typeof a && null !== a && a.$$typeof === p;\n}\n\nfunction escape(a) {\n  var b = {\n    \"=\": \"=0\",\n    \":\": \"=2\"\n  };\n  return \"$\" + (\"\" + a).replace(/[=:]/g, function (a) {\n    return b[a];\n  });\n}\n\nvar O = /\\/+/g,\n    P = [];\n\nfunction Q(a, b, c, d) {\n  if (P.length) {\n    var e = P.pop();\n    e.result = a;\n    e.keyPrefix = b;\n    e.func = c;\n    e.context = d;\n    e.count = 0;\n    return e;\n  }\n\n  return {\n    result: a,\n    keyPrefix: b,\n    func: c,\n    context: d,\n    count: 0\n  };\n}\n\nfunction R(a) {\n  a.result = null;\n  a.keyPrefix = null;\n  a.func = null;\n  a.context = null;\n  a.count = 0;\n  10 > P.length && P.push(a);\n}\n\nfunction S(a, b, c, d) {\n  var e = typeof a;\n  if (\"undefined\" === e || \"boolean\" === e) a = null;\n  var g = !1;\n  if (null === a) g = !0;else switch (e) {\n    case \"string\":\n    case \"number\":\n      g = !0;\n      break;\n\n    case \"object\":\n      switch (a.$$typeof) {\n        case p:\n        case q:\n          g = !0;\n      }\n\n  }\n  if (g) return c(d, a, \"\" === b ? \".\" + T(a, 0) : b), 1;\n  g = 0;\n  b = \"\" === b ? \".\" : b + \":\";\n  if (Array.isArray(a)) for (var l = 0; l < a.length; l++) {\n    e = a[l];\n    var f = b + T(e, l);\n    g += S(e, f, c, d);\n  } else if (null === a || \"object\" !== typeof a ? f = null : (f = z && a[z] || a[\"@@iterator\"], f = \"function\" === typeof f ? f : null), \"function\" === typeof f) for (a = f.call(a), l = 0; !(e = a.next()).done;) e = e.value, f = b + T(e, l++), g += S(e, f, c, d);else if (\"object\" === e) throw c = \"\" + a, A(Error(31), \"[object Object]\" === c ? \"object with keys {\" + Object.keys(a).join(\", \") + \"}\" : c, \"\");\n  return g;\n}\n\nfunction U(a, b, c) {\n  return null == a ? 0 : S(a, \"\", b, c);\n}\n\nfunction T(a, b) {\n  return \"object\" === typeof a && null !== a && null != a.key ? escape(a.key) : b.toString(36);\n}\n\nfunction ea(a, b) {\n  a.func.call(a.context, b, a.count++);\n}\n\nfunction fa(a, b, c) {\n  var d = a.result,\n      e = a.keyPrefix;\n  a = a.func.call(a.context, b, a.count++);\n  Array.isArray(a) ? V(a, d, c, function (a) {\n    return a;\n  }) : null != a && (N(a) && (a = da(a, e + (!a.key || b && b.key === a.key ? \"\" : (\"\" + a.key).replace(O, \"$&/\") + \"/\") + c)), d.push(a));\n}\n\nfunction V(a, b, c, d, e) {\n  var g = \"\";\n  null != c && (g = (\"\" + c).replace(O, \"$&/\") + \"/\");\n  b = Q(b, g, d, e);\n  U(a, fa, b);\n  R(b);\n}\n\nfunction W() {\n  var a = H.current;\n  if (null === a) throw A(Error(321));\n  return a;\n}\n\nvar X = {\n  Children: {\n    map: function (a, b, c) {\n      if (null == a) return a;\n      var d = [];\n      V(a, d, null, b, c);\n      return d;\n    },\n    forEach: function (a, b, c) {\n      if (null == a) return a;\n      b = Q(null, null, b, c);\n      U(a, ea, b);\n      R(b);\n    },\n    count: function (a) {\n      return U(a, function () {\n        return null;\n      }, null);\n    },\n    toArray: function (a) {\n      var b = [];\n      V(a, b, null, function (a) {\n        return a;\n      });\n      return b;\n    },\n    only: function (a) {\n      if (!N(a)) throw A(Error(143));\n      return a;\n    }\n  },\n  createRef: function () {\n    return {\n      current: null\n    };\n  },\n  Component: D,\n  PureComponent: F,\n  createContext: function (a, b) {\n    void 0 === b && (b = null);\n    a = {\n      $$typeof: w,\n      _calculateChangedBits: b,\n      _currentValue: a,\n      _currentValue2: a,\n      _threadCount: 0,\n      Provider: null,\n      Consumer: null\n    };\n    a.Provider = {\n      $$typeof: v,\n      _context: a\n    };\n    return a.Consumer = a;\n  },\n  forwardRef: function (a) {\n    return {\n      $$typeof: x,\n      render: a\n    };\n  },\n  lazy: function (a) {\n    return {\n      $$typeof: ca,\n      _ctor: a,\n      _status: -1,\n      _result: null\n    };\n  },\n  memo: function (a, b) {\n    return {\n      $$typeof: ba,\n      type: a,\n      compare: void 0 === b ? null : b\n    };\n  },\n  useCallback: function (a, b) {\n    return W().useCallback(a, b);\n  },\n  useContext: function (a, b) {\n    return W().useContext(a, b);\n  },\n  useEffect: function (a, b) {\n    return W().useEffect(a, b);\n  },\n  useImperativeHandle: function (a, b, c) {\n    return W().useImperativeHandle(a, b, c);\n  },\n  useDebugValue: function () {},\n  useLayoutEffect: function (a, b) {\n    return W().useLayoutEffect(a, b);\n  },\n  useMemo: function (a, b) {\n    return W().useMemo(a, b);\n  },\n  useReducer: function (a, b, c) {\n    return W().useReducer(a, b, c);\n  },\n  useRef: function (a) {\n    return W().useRef(a);\n  },\n  useState: function (a) {\n    return W().useState(a);\n  },\n  Fragment: r,\n  Profiler: u,\n  StrictMode: t,\n  Suspense: y,\n  unstable_SuspenseList: aa,\n  createElement: M,\n  cloneElement: function (a, b, c) {\n    if (null === a || void 0 === a) throw A(Error(267), a);\n    var d = h({}, a.props),\n        e = a.key,\n        g = a.ref,\n        l = a._owner;\n\n    if (null != b) {\n      void 0 !== b.ref && (g = b.ref, l = J.current);\n      void 0 !== b.key && (e = \"\" + b.key);\n      if (a.type && a.type.defaultProps) var f = a.type.defaultProps;\n\n      for (k in b) K.call(b, k) && !L.hasOwnProperty(k) && (d[k] = void 0 === b[k] && void 0 !== f ? f[k] : b[k]);\n    }\n\n    var k = arguments.length - 2;\n    if (1 === k) d.children = c;else if (1 < k) {\n      f = Array(k);\n\n      for (var m = 0; m < k; m++) f[m] = arguments[m + 2];\n\n      d.children = f;\n    }\n    return {\n      $$typeof: p,\n      type: a.type,\n      key: e,\n      ref: g,\n      props: d,\n      _owner: l\n    };\n  },\n  createFactory: function (a) {\n    var b = M.bind(null, a);\n    b.type = a;\n    return b;\n  },\n  isValidElement: N,\n  version: \"16.10.2\",\n  unstable_withSuspenseConfig: function (a, b) {\n    var c = I.suspense;\n    I.suspense = void 0 === b ? null : b;\n\n    try {\n      a();\n    } finally {\n      I.suspense = c;\n    }\n  },\n  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n    ReactCurrentDispatcher: H,\n    ReactCurrentBatchConfig: I,\n    ReactCurrentOwner: J,\n    IsSomeRendererActing: {\n      current: !1\n    },\n    assign: h\n  }\n},\n    Y = {\n  default: X\n},\n    Z = Y && X || Y;\nmodule.exports = Z.default || Z;\n},{\"object-assign\":\"x5u5\"}],\"W4rj\":[function(require,module,exports) {\n'use strict';\n\nif (\"production\" === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n},{\"./cjs/react.production.min.js\":\"N4VU\"}],\"W2Ku\":[function(require,module,exports) {\n/** @license React v0.16.2\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';Object.defineProperty(exports,\"__esModule\",{value:!0});var f,g,h,k,l;\nif(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var p=null,q=null,t=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(t,0),b;}},u=Date.now();exports.unstable_now=function(){return Date.now()-u};f=function(a){null!==p?setTimeout(f,0,a):(p=a,setTimeout(t,0))};g=function(a,b){q=setTimeout(a,b)};h=function(){clearTimeout(q)};k=function(){return!1};l=exports.unstable_forceFrameRate=function(){}}else{var w=window.performance,x=window.Date,\ny=window.setTimeout,z=window.clearTimeout,A=window.requestAnimationFrame,B=window.cancelAnimationFrame;\"undefined\"!==typeof console&&(\"function\"!==typeof A&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"),\"function\"!==typeof B&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"));if(\"object\"===typeof w&&\n\"function\"===typeof w.now)exports.unstable_now=function(){return w.now()};else{var C=x.now();exports.unstable_now=function(){return x.now()-C}}var D=!1,E=null,F=-1,G=5,H=0;k=function(){return exports.unstable_now()>=H};l=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported\"):G=0<a?Math.floor(1E3/a):33.33};var I=new MessageChannel,J=I.port2;I.port1.onmessage=\nfunction(){if(null!==E){var a=exports.unstable_now();H=a+G;try{E(!0,a)?J.postMessage(null):(D=!1,E=null)}catch(b){throw J.postMessage(null),b;}}else D=!1};f=function(a){E=a;D||(D=!0,J.postMessage(null))};g=function(a,b){F=y(function(){a(exports.unstable_now())},b)};h=function(){z(F);F=-1}}function K(a,b){var c=a.length;a.push(b);a:for(;;){var d=Math.floor((c-1)/2),e=a[d];if(void 0!==e&&0<L(e,b))a[d]=b,a[c]=e,c=d;else break a}}function M(a){a=a[0];return void 0===a?null:a}\nfunction N(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>L(n,c))void 0!==r&&0>L(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>L(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function L(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var O=[],P=[],Q=1,R=null,S=3,T=!1,U=!1,V=!1;\nfunction W(a){for(var b=M(P);null!==b;){if(null===b.callback)N(P);else if(b.startTime<=a)N(P),b.sortIndex=b.expirationTime,K(O,b);else break;b=M(P)}}function X(a){V=!1;W(a);if(!U)if(null!==M(O))U=!0,f(Y);else{var b=M(P);null!==b&&g(X,b.startTime-a)}}\nfunction Y(a,b){U=!1;V&&(V=!1,h());T=!0;var c=S;try{W(b);for(R=M(O);null!==R&&(!(R.expirationTime>b)||a&&!k());){var d=R.callback;if(null!==d){R.callback=null;S=R.priorityLevel;var e=d(R.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?R.callback=e:R===M(O)&&N(O);W(b)}else N(O);R=M(O)}if(null!==R)var m=!0;else{var n=M(P);null!==n&&g(X,n.startTime-b);m=!1}return m}finally{R=null,S=c,T=!1}}\nfunction Z(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var aa=l;exports.unstable_ImmediatePriority=1;exports.unstable_UserBlockingPriority=2;exports.unstable_NormalPriority=3;exports.unstable_IdlePriority=5;exports.unstable_LowPriority=4;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=S;S=a;try{return b()}finally{S=c}};\nexports.unstable_next=function(a){switch(S){case 1:case 2:case 3:var b=3;break;default:b=S}var c=S;S=b;try{return a()}finally{S=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();if(\"object\"===typeof c&&null!==c){var e=c.delay;e=\"number\"===typeof e&&0<e?d+e:d;c=\"number\"===typeof c.timeout?c.timeout:Z(a)}else c=Z(a),e=d;c=e+c;a={id:Q++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,K(P,a),null===M(O)&&a===M(P)&&(V?h():V=!0,g(X,e-d))):(a.sortIndex=c,K(O,a),U||T||(U=!0,f(Y)));return a};exports.unstable_cancelCallback=function(a){a.callback=null};\nexports.unstable_wrapCallback=function(a){var b=S;return function(){var c=S;S=b;try{return a.apply(this,arguments)}finally{S=c}}};exports.unstable_getCurrentPriorityLevel=function(){return S};exports.unstable_shouldYield=function(){var a=exports.unstable_now();W(a);var b=M(O);return b!==R&&null!==R&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<R.expirationTime||k()};exports.unstable_requestPaint=aa;exports.unstable_continueExecution=function(){U||T||(U=!0,f(Y))};\nexports.unstable_pauseExecution=function(){};exports.unstable_getFirstCallbackNode=function(){return M(O)};exports.unstable_Profiling=null;\n\n},{}],\"KTa4\":[function(require,module,exports) {\n'use strict';\n\nif (\"production\" === 'production') {\n  module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n},{\"./cjs/scheduler.production.min.js\":\"W2Ku\"}],\"t7dJ\":[function(require,module,exports) {\n/** @license React v16.10.2\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),r=require(\"scheduler\");function t(a){for(var b=a.message,c=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+b,d=1;d<arguments.length;d++)c+=\"&args[]=\"+encodeURIComponent(arguments[d]);a.message=\"Minified React error #\"+b+\"; visit \"+c+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \";return a}if(!aa)throw t(Error(227));var ba=null,ca={};\nfunction da(){if(ba)for(var a in ca){var b=ca[a],c=ba.indexOf(a);if(!(-1<c))throw t(Error(96),a);if(!ea[c]){if(!b.extractEvents)throw t(Error(97),a);ea[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(fa.hasOwnProperty(h))throw t(Error(99),h);fa[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ha(k[e],g,h);e=!0}else f.registrationName?(ha(f.registrationName,g,h),e=!0):e=!1;if(!e)throw t(Error(98),d,a);}}}}\nfunction ha(a,b,c){if(ia[a])throw t(Error(100),a);ia[a]=b;ja[a]=b.eventTypes[c].dependencies}var ea=[],fa={},ia={},ja={};function ka(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var la=!1,ma=null,na=!1,oa=null,pa={onError:function(a){la=!0;ma=a}};function qa(a,b,c,d,e,f,g,h,k){la=!1;ma=null;ka.apply(pa,arguments)}\nfunction ra(a,b,c,d,e,f,g,h,k){qa.apply(this,arguments);if(la){if(la){var l=ma;la=!1;ma=null}else throw t(Error(198));na||(na=!0,oa=l)}}var sa=null,ta=null,ua=null;function va(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=ua(c);ra(d,b,void 0,a);a.currentTarget=null}function wa(a,b){if(null==b)throw t(Error(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}\nfunction xa(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var ya=null;function za(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)va(a,b[d],c[d]);else b&&va(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function Aa(a){null!==a&&(ya=wa(ya,a));a=ya;ya=null;if(a){xa(a,za);if(ya)throw t(Error(95));if(na)throw a=oa,na=!1,oa=null,a;}}\nvar Ba={injectEventPluginOrder:function(a){if(ba)throw t(Error(101));ba=Array.prototype.slice.call(a);da()},injectEventPluginsByName:function(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!ca.hasOwnProperty(c)||ca[c]!==d){if(ca[c])throw t(Error(102),c);ca[c]=d;b=!0}}b&&da()}};\nfunction Ca(a,b){var c=a.stateNode;if(!c)return null;var d=sa(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==typeof c)throw t(Error(231),b,typeof c);\nreturn c}var Da=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Da.hasOwnProperty(\"ReactCurrentDispatcher\")||(Da.ReactCurrentDispatcher={current:null});Da.hasOwnProperty(\"ReactCurrentBatchConfig\")||(Da.ReactCurrentBatchConfig={suspense:null});\nvar Ea=/^(.*)[\\\\\\/]/,x=\"function\"===typeof Symbol&&Symbol.for,Fa=x?Symbol.for(\"react.element\"):60103,Ga=x?Symbol.for(\"react.portal\"):60106,Ha=x?Symbol.for(\"react.fragment\"):60107,Ia=x?Symbol.for(\"react.strict_mode\"):60108,Ja=x?Symbol.for(\"react.profiler\"):60114,Ka=x?Symbol.for(\"react.provider\"):60109,La=x?Symbol.for(\"react.context\"):60110,Ma=x?Symbol.for(\"react.concurrent_mode\"):60111,Na=x?Symbol.for(\"react.forward_ref\"):60112,Oa=x?Symbol.for(\"react.suspense\"):60113,Pa=x?Symbol.for(\"react.suspense_list\"):\n60120,Qa=x?Symbol.for(\"react.memo\"):60115,Ra=x?Symbol.for(\"react.lazy\"):60116;x&&Symbol.for(\"react.fundamental\");x&&Symbol.for(\"react.responder\");x&&Symbol.for(\"react.scope\");var Sa=\"function\"===typeof Symbol&&Symbol.iterator;function Ta(a){if(null===a||\"object\"!==typeof a)return null;a=Sa&&a[Sa]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nfunction Ua(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}\nfunction Va(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case Ha:return\"Fragment\";case Ga:return\"Portal\";case Ja:return\"Profiler\";case Ia:return\"StrictMode\";case Oa:return\"Suspense\";case Pa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case La:return\"Context.Consumer\";case Ka:return\"Context.Provider\";case Na:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\n\"ForwardRef\");case Qa:return Va(a.type);case Ra:if(a=1===a._status?a._result:null)return Va(a)}return null}function Wa(a){var b=\"\";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c=\"\";break a;default:var d=a._debugOwner,e=a._debugSource,f=Va(a.type);c=null;d&&(c=Va(d.type));d=f;f=\"\";e?f=\" (at \"+e.fileName.replace(Ea,\"\")+\":\"+e.lineNumber+\")\":c&&(f=\" (created by \"+c+\")\");c=\"\\n    in \"+(d||\"Unknown\")+f}b+=c;a=a.return}while(a);return b}\nvar Xa=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),Ya=null,Za=null,$a=null;function ab(a){if(a=ta(a)){if(\"function\"!==typeof Ya)throw t(Error(280));var b=sa(a.stateNode);Ya(a.stateNode,a.type,b)}}function bb(a){Za?$a?$a.push(a):$a=[a]:Za=a}function cb(){if(Za){var a=Za,b=$a;$a=Za=null;ab(a);if(b)for(a=0;a<b.length;a++)ab(b[a])}}function db(a,b){return a(b)}function eb(a,b,c,d){return a(b,c,d)}function fb(){}\nvar gb=db,hb=!1,ib=!1;function jb(){if(null!==Za||null!==$a)fb(),cb()}new Map;new Map;new Map;var kb=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,lb=Object.prototype.hasOwnProperty,mb={},nb={};\nfunction ob(a){if(lb.call(nb,a))return!0;if(lb.call(mb,a))return!1;if(kb.test(a))return nb[a]=!0;mb[a]=!0;return!1}function pb(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction qb(a,b,c,d){if(null===b||\"undefined\"===typeof b||pb(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function B(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}var C={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){C[a]=new B(a,0,!1,a,null,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];C[b]=new B(b,1,!1,a[1],null,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){C[a]=new B(a,2,!1,a.toLowerCase(),null,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){C[a]=new B(a,2,!1,a,null,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){C[a]=new B(a,3,!1,a.toLowerCase(),null,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){C[a]=new B(a,3,!0,a,null,!1)});[\"capture\",\"download\"].forEach(function(a){C[a]=new B(a,4,!1,a,null,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){C[a]=new B(a,6,!1,a,null,!1)});[\"rowSpan\",\"start\"].forEach(function(a){C[a]=new B(a,5,!1,a.toLowerCase(),null,!1)});var rb=/[\\-:]([a-z])/g;function sb(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(rb,\nsb);C[b]=new B(b,1,!1,a,null,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(rb,sb);C[b]=new B(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(rb,sb);C[b]=new B(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){C[a]=new B(a,1,!1,a.toLowerCase(),null,!1)});\nC.xlinkHref=new B(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){C[a]=new B(a,1,!1,a.toLowerCase(),null,!0)});function tb(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}\nfunction ub(a,b,c,d){var e=C.hasOwnProperty(b)?C[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(qb(b,c,e,d)&&(c=null),d||null===e?ob(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nfunction vb(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction xb(a){var b=vb(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function yb(a){a._valueTracker||(a._valueTracker=xb(a))}function zb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=vb(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Ab(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\nfunction Bb(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=tb(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Cb(a,b){b=b.checked;null!=b&&ub(a,\"checked\",b,!1)}\nfunction Db(a,b){Cb(a,b);var c=tb(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?Eb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&Eb(a,b.type,tb(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction Gb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction Eb(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function Hb(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Ib(a,b){a=n({children:void 0},b);if(b=Hb(b.children))a.children=b;return a}\nfunction Jb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+tb(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction Kb(a,b){if(null!=b.dangerouslySetInnerHTML)throw t(Error(91));return n({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Lb(a,b){var c=b.value;if(null==c){c=b.defaultValue;b=b.children;if(null!=b){if(null!=c)throw t(Error(92));if(Array.isArray(b)){if(!(1>=b.length))throw t(Error(93));b=b[0]}c=b}null==c&&(c=\"\")}a._wrapperState={initialValue:tb(c)}}\nfunction Mb(a,b){var c=tb(b.value),d=tb(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function Nb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var Ob={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction Pb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Qb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Pb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar Rb,Sb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Ob.svg||\"innerHTML\"in a)a.innerHTML=b;else{Rb=Rb||document.createElement(\"div\");Rb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=Rb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Tb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}function Ub(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Vb={animationend:Ub(\"Animation\",\"AnimationEnd\"),animationiteration:Ub(\"Animation\",\"AnimationIteration\"),animationstart:Ub(\"Animation\",\"AnimationStart\"),transitionend:Ub(\"Transition\",\"TransitionEnd\")},Wb={},Xb={};\nXa&&(Xb=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Vb.animationend.animation,delete Vb.animationiteration.animation,delete Vb.animationstart.animation),\"TransitionEvent\"in window||delete Vb.transitionend.transition);function Yb(a){if(Wb[a])return Wb[a];if(!Vb[a])return a;var b=Vb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Xb)return Wb[a]=b[c];return a}\nvar Zb=Yb(\"animationend\"),$b=Yb(\"animationiteration\"),ac=Yb(\"animationstart\"),bc=Yb(\"transitionend\"),dc=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),ec=!1,fc=[],gc=null,hc=null,ic=null,jc=new Map,kc=new Map,lc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit\".split(\" \"),\nmc=\"focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture\".split(\" \");function nc(a){var b=oc(a);lc.forEach(function(c){pc(c,a,b)});mc.forEach(function(c){pc(c,a,b)})}function qc(a,b,c,d){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:d}}\nfunction rc(a,b){switch(a){case \"focus\":case \"blur\":gc=null;break;case \"dragenter\":case \"dragleave\":hc=null;break;case \"mouseover\":case \"mouseout\":ic=null;break;case \"pointerover\":case \"pointerout\":jc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":kc.delete(b.pointerId)}}function sc(a,b,c,d,e){if(null===a||a.nativeEvent!==e)return qc(b,c,d,e);a.eventSystemFlags|=d;return a}\nfunction tc(a,b,c,d){switch(b){case \"focus\":return gc=sc(gc,a,b,c,d),!0;case \"dragenter\":return hc=sc(hc,a,b,c,d),!0;case \"mouseover\":return ic=sc(ic,a,b,c,d),!0;case \"pointerover\":var e=d.pointerId;jc.set(e,sc(jc.get(e)||null,a,b,c,d));return!0;case \"gotpointercapture\":return e=d.pointerId,kc.set(e,sc(kc.get(e)||null,a,b,c,d)),!0}return!1}function uc(a){if(null!==a.blockedOn)return!1;var b=vc(a.topLevelType,a.eventSystemFlags,a.nativeEvent);return null!==b?(a.blockedOn=b,!1):!0}\nfunction wc(a,b,c){uc(a)&&c.delete(b)}function xc(){for(ec=!1;0<fc.length;){var a=fc[0];if(null!==a.blockedOn)break;var b=vc(a.topLevelType,a.eventSystemFlags,a.nativeEvent);null!==b?a.blockedOn=b:fc.shift()}null!==gc&&uc(gc)&&(gc=null);null!==hc&&uc(hc)&&(hc=null);null!==ic&&uc(ic)&&(ic=null);jc.forEach(wc);kc.forEach(wc)}function yc(a,b){a.blockedOn===b&&(a.blockedOn=null,ec||(ec=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,xc)))}\nfunction zc(a){function b(b){return yc(b,a)}if(0<fc.length){yc(fc[0],a);for(var c=1;c<fc.length;c++){var d=fc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==gc&&yc(gc,a);null!==hc&&yc(hc,a);null!==ic&&yc(ic,a);jc.forEach(b);kc.forEach(b)}var D=0,E=2,Ac=1024;function Bc(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,(b.effectTag&(E|Ac))!==D&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Cc(a){if(Bc(a)!==a)throw t(Error(188));}\nfunction Dc(a){var b=a.alternate;if(!b){b=Bc(a);if(null===b)throw t(Error(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Cc(e),a;if(f===d)return Cc(e),b;f=f.sibling}throw t(Error(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw t(Error(189));}}if(c.alternate!==d)throw t(Error(190));}if(3!==c.tag)throw t(Error(188));return c.stateNode.current===c?a:b}function Ec(a){a=Dc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nfunction Fc(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function Gc(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function Hc(a,b,c){if(b=Ca(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=wa(c._dispatchListeners,b),c._dispatchInstances=wa(c._dispatchInstances,a)}\nfunction Ic(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Gc(b);for(b=c.length;0<b--;)Hc(c[b],\"captured\",a);for(b=0;b<c.length;b++)Hc(c[b],\"bubbled\",a)}}function Jc(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Ca(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=wa(c._dispatchListeners,b),c._dispatchInstances=wa(c._dispatchInstances,a))}function Kc(a){a&&a.dispatchConfig.registrationName&&Jc(a._targetInst,null,a)}\nfunction Lc(a){xa(a,Ic)}function Mc(){return!0}function Nc(){return!1}function F(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?Mc:Nc;this.isPropagationStopped=Nc;return this}\nn(F.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=Mc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=Mc)},persist:function(){this.isPersistent=Mc},isPersistent:Nc,destructor:function(){var a=this.constructor.Interface,\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=Nc;this._dispatchInstances=this._dispatchListeners=null}});F.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nF.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;Oc(c);return c};Oc(F);function Pc(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}\nfunction Qc(a){if(!(a instanceof this))throw t(Error(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function Oc(a){a.eventPool=[];a.getPooled=Pc;a.release=Qc}var Rc=F.extend({animationName:null,elapsedTime:null,pseudoElement:null}),Sc=F.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Tc=F.extend({view:null,detail:null}),Uc=Tc.extend({relatedTarget:null});\nfunction Vc(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar Wc={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Xc={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Yc={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Zc(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Yc[a])?!!b[a]:!1}function $c(){return Zc}\nvar ad=Tc.extend({key:function(a){if(a.key){var b=Wc[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=Vc(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Xc[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:$c,charCode:function(a){return\"keypress\"===a.type?Vc(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?Vc(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),bd=0,cd=0,dd=!1,fd=!1,gd=Tc.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:$c,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if(\"movementX\"in a)return a.movementX;var b=bd;bd=a.screenX;return dd?\"mousemove\"===a.type?a.screenX-\nb:0:(dd=!0,0)},movementY:function(a){if(\"movementY\"in a)return a.movementY;var b=cd;cd=a.screenY;return fd?\"mousemove\"===a.type?a.screenY-b:0:(fd=!0,0)}}),hd=gd.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),id=gd.extend({dataTransfer:null}),jd=Tc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:$c}),kd=F.extend({propertyName:null,\nelapsedTime:null,pseudoElement:null}),ld=gd.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),md=[[\"blur\",\"blur\",0],[\"cancel\",\"cancel\",0],[\"click\",\"click\",0],[\"close\",\"close\",0],[\"contextmenu\",\"contextMenu\",0],[\"copy\",\"copy\",0],[\"cut\",\"cut\",0],[\"auxclick\",\"auxClick\",0],[\"dblclick\",\"doubleClick\",0],[\"dragend\",\"dragEnd\",\n0],[\"dragstart\",\"dragStart\",0],[\"drop\",\"drop\",0],[\"focus\",\"focus\",0],[\"input\",\"input\",0],[\"invalid\",\"invalid\",0],[\"keydown\",\"keyDown\",0],[\"keypress\",\"keyPress\",0],[\"keyup\",\"keyUp\",0],[\"mousedown\",\"mouseDown\",0],[\"mouseup\",\"mouseUp\",0],[\"paste\",\"paste\",0],[\"pause\",\"pause\",0],[\"play\",\"play\",0],[\"pointercancel\",\"pointerCancel\",0],[\"pointerdown\",\"pointerDown\",0],[\"pointerup\",\"pointerUp\",0],[\"ratechange\",\"rateChange\",0],[\"reset\",\"reset\",0],[\"seeked\",\"seeked\",0],[\"submit\",\"submit\",0],[\"touchcancel\",\"touchCancel\",\n0],[\"touchend\",\"touchEnd\",0],[\"touchstart\",\"touchStart\",0],[\"volumechange\",\"volumeChange\",0],[\"drag\",\"drag\",1],[\"dragenter\",\"dragEnter\",1],[\"dragexit\",\"dragExit\",1],[\"dragleave\",\"dragLeave\",1],[\"dragover\",\"dragOver\",1],[\"mousemove\",\"mouseMove\",1],[\"mouseout\",\"mouseOut\",1],[\"mouseover\",\"mouseOver\",1],[\"pointermove\",\"pointerMove\",1],[\"pointerout\",\"pointerOut\",1],[\"pointerover\",\"pointerOver\",1],[\"scroll\",\"scroll\",1],[\"toggle\",\"toggle\",1],[\"touchmove\",\"touchMove\",1],[\"wheel\",\"wheel\",1],[\"abort\",\"abort\",\n2],[Zb,\"animationEnd\",2],[$b,\"animationIteration\",2],[ac,\"animationStart\",2],[\"canplay\",\"canPlay\",2],[\"canplaythrough\",\"canPlayThrough\",2],[\"durationchange\",\"durationChange\",2],[\"emptied\",\"emptied\",2],[\"encrypted\",\"encrypted\",2],[\"ended\",\"ended\",2],[\"error\",\"error\",2],[\"gotpointercapture\",\"gotPointerCapture\",2],[\"load\",\"load\",2],[\"loadeddata\",\"loadedData\",2],[\"loadedmetadata\",\"loadedMetadata\",2],[\"loadstart\",\"loadStart\",2],[\"lostpointercapture\",\"lostPointerCapture\",2],[\"playing\",\"playing\",2],[\"progress\",\n\"progress\",2],[\"seeking\",\"seeking\",2],[\"stalled\",\"stalled\",2],[\"suspend\",\"suspend\",2],[\"timeupdate\",\"timeUpdate\",2],[bc,\"transitionEnd\",2],[\"waiting\",\"waiting\",2]],nd={},od={},pd=0;for(;pd<md.length;pd++){var qd=md[pd],rd=qd[0],sd=qd[1],td=qd[2],ud=\"on\"+(sd[0].toUpperCase()+sd.slice(1)),vd={phasedRegistrationNames:{bubbled:ud,captured:ud+\"Capture\"},dependencies:[rd],eventPriority:td};nd[sd]=vd;od[rd]=vd}\nvar wd={eventTypes:nd,getEventPriority:function(a){a=od[a];return void 0!==a?a.eventPriority:2},extractEvents:function(a,b,c,d){var e=od[a];if(!e)return null;switch(a){case \"keypress\":if(0===Vc(c))return null;case \"keydown\":case \"keyup\":a=ad;break;case \"blur\":case \"focus\":a=Uc;break;case \"click\":if(2===c.button)return null;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":a=gd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":a=\nid;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":a=jd;break;case Zb:case $b:case ac:a=Rc;break;case bc:a=kd;break;case \"scroll\":a=Tc;break;case \"wheel\":a=ld;break;case \"copy\":case \"cut\":case \"paste\":a=Sc;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":a=hd;break;default:a=F}b=a.getPooled(e,b,c,d);Lc(b);return b}},xd=wd.getEventPriority,zd=10,Ad=[];\nfunction Bd(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Cd(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Fc(a.nativeEvent);d=a.topLevelType;for(var f=a.nativeEvent,g=a.eventSystemFlags,h=null,k=0;k<ea.length;k++){var l=ea[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=wa(h,l))}Aa(h)}}\nvar Dd=!0;function G(a,b){Ed(b,a,!1)}function Ed(a,b,c){switch(xd(b)){case 0:var d=Fd.bind(null,b,1);break;case 1:d=Gd.bind(null,b,1);break;default:d=Hd.bind(null,b,1)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function Fd(a,b,c){hb||fb();var d=Hd,e=hb;hb=!0;try{eb(d,a,b,c)}finally{(hb=e)||jb()}}function Gd(a,b,c){Hd(a,b,c)}\nfunction Id(a,b,c,d){if(Ad.length){var e=Ad.pop();e.topLevelType=a;e.eventSystemFlags=b;e.nativeEvent=c;e.targetInst=d;a=e}else a={topLevelType:a,eventSystemFlags:b,nativeEvent:c,targetInst:d,ancestors:[]};try{if(b=Bd,c=a,ib)b(c,void 0);else{ib=!0;try{gb(b,c,void 0)}finally{ib=!1,jb()}}}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,Ad.length<zd&&Ad.push(a)}}\nfunction Hd(a,b,c){if(Dd)if(0<fc.length&&-1<lc.indexOf(a))a=qc(null,a,b,c),fc.push(a);else{var d=vc(a,b,c);null===d?rc(a,c):-1<lc.indexOf(a)?(a=qc(d,a,b,c),fc.push(a)):tc(d,a,b,c)||(rc(a,c),Id(a,b,c,null))}}\nfunction vc(a,b,c){var d=Fc(c),e=Cd(d);if(null!==e)if(d=Bc(e),null===d)e=null;else{var f=d.tag;if(13===f){a:{if(13===d.tag&&(e=d.memoizedState,null===e&&(d=d.alternate,null!==d&&(e=d.memoizedState)),null!==e)){d=e.dehydrated;break a}d=null}if(null!==d)return d;e=null}else if(3===f){if(d.stateNode.hydrate)return 3===d.tag?d.stateNode.containerInfo:null;e=null}else d!==e&&(e=null)}Id(a,b,c,e);return null}\nfunction Jd(a){if(!Xa)return!1;a=\"on\"+a;var b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}var Kd=new (\"function\"===typeof WeakMap?WeakMap:Map);function oc(a){var b=Kd.get(a);void 0===b&&(b=new Set,Kd.set(a,b));return b}\nfunction pc(a,b,c){if(!c.has(a)){switch(a){case \"scroll\":Ed(b,\"scroll\",!0);break;case \"focus\":case \"blur\":Ed(b,\"focus\",!0);Ed(b,\"blur\",!0);c.add(\"blur\");c.add(\"focus\");break;case \"cancel\":case \"close\":Jd(a)&&Ed(b,a,!0);break;case \"invalid\":case \"submit\":case \"reset\":break;default:-1===dc.indexOf(a)&&G(a,b)}c.add(a)}}\nvar Ld={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Md=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Ld).forEach(function(a){Md.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Ld[b]=Ld[a]})});function Nd(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||Ld.hasOwnProperty(a)&&Ld[a]?(\"\"+b).trim():b+\"px\"}\nfunction Od(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=Nd(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var Pd=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction Qd(a,b){if(b){if(Pd[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw t(Error(137),a,\"\");if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw t(Error(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw t(Error(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw t(Error(62),\"\");}}\nfunction Rd(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}function Sd(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=oc(a);b=ja[b];for(var d=0;d<b.length;d++)pc(b[d],a,c)}function Td(){}\nfunction Ud(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function Vd(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function Wd(a,b){var c=Vd(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Vd(c)}}\nfunction Xd(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Xd(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function Yd(){for(var a=window,b=Ud();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Ud(a.document)}return b}\nfunction Zd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}var $d=\"$\",ae=\"/$\",be=\"$?\",ce=\"$!\",de=null,ee=null;function fe(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nfunction ge(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var he=\"function\"===typeof setTimeout?setTimeout:void 0,ie=\"function\"===typeof clearTimeout?clearTimeout:void 0;function je(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}\nfunction ke(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===$d||c===ce||c===be){if(0===b)return a;b--}else c===ae&&b++}a=a.previousSibling}return null}var le=Math.random().toString(36).slice(2),me=\"__reactInternalInstance$\"+le,ne=\"__reactEventHandlers$\"+le,oe=\"__reactContainere$\"+le;\nfunction Cd(a){var b=a[me];if(b)return b;for(var c=a.parentNode;c;){if(b=c[oe]||c[me]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=ke(a);null!==a;){if(c=a[me])return c;a=ke(a)}return b}a=c;c=a.parentNode}return null}function pe(a){a=a[me]||a[oe];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function qe(a){if(5===a.tag||6===a.tag)return a.stateNode;throw t(Error(33));}function re(a){return a[ne]||null}var se=null,te=null,ue=null;\nfunction ve(){if(ue)return ue;var a,b=te,c=b.length,d,e=\"value\"in se?se.value:se.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return ue=e.slice(a,1<d?1-d:void 0)}var we=F.extend({data:null}),xe=F.extend({data:null}),ye=[9,13,27,32],ze=Xa&&\"CompositionEvent\"in window,Ae=null;Xa&&\"documentMode\"in document&&(Ae=document.documentMode);\nvar Be=Xa&&\"TextEvent\"in window&&!Ae,Ce=Xa&&(!ze||Ae&&8<Ae&&11>=Ae),De=String.fromCharCode(32),Ee={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},Fe=!1;\nfunction Ge(a,b){switch(a){case \"keyup\":return-1!==ye.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function He(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var Ie=!1;function Je(a,b){switch(a){case \"compositionend\":return He(b);case \"keypress\":if(32!==b.which)return null;Fe=!0;return De;case \"textInput\":return a=b.data,a===De&&Fe?null:a;default:return null}}\nfunction Ke(a,b){if(Ie)return\"compositionend\"===a||!ze&&Ge(a,b)?(a=ve(),ue=te=se=null,Ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return Ce&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar Le={eventTypes:Ee,extractEvents:function(a,b,c,d){var e;if(ze)b:{switch(a){case \"compositionstart\":var f=Ee.compositionStart;break b;case \"compositionend\":f=Ee.compositionEnd;break b;case \"compositionupdate\":f=Ee.compositionUpdate;break b}f=void 0}else Ie?Ge(a,c)&&(f=Ee.compositionEnd):\"keydown\"===a&&229===c.keyCode&&(f=Ee.compositionStart);f?(Ce&&\"ko\"!==c.locale&&(Ie||f!==Ee.compositionStart?f===Ee.compositionEnd&&Ie&&(e=ve()):(se=d,te=\"value\"in se?se.value:se.textContent,Ie=!0)),f=we.getPooled(f,\nb,c,d),e?f.data=e:(e=He(c),null!==e&&(f.data=e)),Lc(f),e=f):e=null;(a=Be?Je(a,c):Ke(a,c))?(b=xe.getPooled(Ee.beforeInput,b,c,d),b.data=a,Lc(b)):b=null;return null===e?b:null===b?e:[e,b]}},Me={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!Me[a.type]:\"textarea\"===b?!0:!1}\nvar Oe={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"blur change click focus input keydown keyup selectionchange\".split(\" \")}};function Pe(a,b,c){a=F.getPooled(Oe.change,a,b,c);a.type=\"change\";bb(c);Lc(a);return a}var Qe=null,Re=null;function Se(a){Aa(a)}function Te(a){var b=qe(a);if(zb(b))return a}function Ue(a,b){if(\"change\"===a)return b}var Ve=!1;Xa&&(Ve=Jd(\"input\")&&(!document.documentMode||9<document.documentMode));\nfunction We(){Qe&&(Qe.detachEvent(\"onpropertychange\",Xe),Re=Qe=null)}function Xe(a){if(\"value\"===a.propertyName&&Te(Re))if(a=Pe(Re,a,Fc(a)),hb)Aa(a);else{hb=!0;try{db(Se,a)}finally{hb=!1,jb()}}}function Ye(a,b,c){\"focus\"===a?(We(),Qe=b,Re=c,Qe.attachEvent(\"onpropertychange\",Xe)):\"blur\"===a&&We()}function Ze(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return Te(Re)}function $e(a,b){if(\"click\"===a)return Te(b)}function af(a,b){if(\"input\"===a||\"change\"===a)return Te(b)}\nvar bf={eventTypes:Oe,_isInputEventSupported:Ve,extractEvents:function(a,b,c,d){var e=b?qe(b):window,f=e.nodeName&&e.nodeName.toLowerCase();if(\"select\"===f||\"input\"===f&&\"file\"===e.type)var g=Ue;else if(Ne(e))if(Ve)g=af;else{g=Ze;var h=Ye}else(f=e.nodeName)&&\"input\"===f.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(g=$e);if(g&&(g=g(a,b)))return Pe(g,c,d);h&&h(a,e,b);\"blur\"===a&&(a=e._wrapperState)&&a.controlled&&\"number\"===e.type&&Eb(e,\"number\",e.value)}},cf={mouseEnter:{registrationName:\"onMouseEnter\",\ndependencies:[\"mouseout\",\"mouseover\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"mouseout\",\"mouseover\"]},pointerEnter:{registrationName:\"onPointerEnter\",dependencies:[\"pointerout\",\"pointerover\"]},pointerLeave:{registrationName:\"onPointerLeave\",dependencies:[\"pointerout\",\"pointerover\"]}},df={eventTypes:cf,extractEvents:function(a,b,c,d,e){var f=\"mouseover\"===a||\"pointerover\"===a,g=\"mouseout\"===a||\"pointerout\"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;\ne=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Cd(b):null,null!==b&&(f=Bc(b),b!==f||5!==b.tag&&6!==b.tag))b=null}else g=null;if(g===b)return null;if(\"mouseout\"===a||\"mouseover\"===a){var h=gd;var k=cf.mouseLeave;var l=cf.mouseEnter;var m=\"mouse\"}else if(\"pointerout\"===a||\"pointerover\"===a)h=hd,k=cf.pointerLeave,l=cf.pointerEnter,m=\"pointer\";a=null==g?e:qe(g);e=null==b?e:qe(b);k=h.getPooled(k,g,c,d);k.type=m+\"leave\";k.target=\na;k.relatedTarget=e;c=h.getPooled(l,b,c,d);c.type=m+\"enter\";c.target=e;c.relatedTarget=a;d=g;m=b;if(d&&m)a:{h=d;l=m;a=0;for(g=h;g;g=Gc(g))a++;g=0;for(b=l;b;b=Gc(b))g++;for(;0<a-g;)h=Gc(h),a--;for(;0<g-a;)l=Gc(l),g--;for(;a--;){if(h===l||h===l.alternate)break a;h=Gc(h);l=Gc(l)}h=null}else h=null;l=h;for(h=[];d&&d!==l;){a=d.alternate;if(null!==a&&a===l)break;h.push(d);d=Gc(d)}for(d=[];m&&m!==l;){a=m.alternate;if(null!==a&&a===l)break;d.push(m);m=Gc(m)}for(m=0;m<h.length;m++)Jc(h[m],\"bubbled\",k);for(m=\nd.length;0<m--;)Jc(d[m],\"captured\",c);return[k,c]}};function ef(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var ff=\"function\"===typeof Object.is?Object.is:ef,gf=Object.prototype.hasOwnProperty;function hf(a,b){if(ff(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!gf.call(b,c[d])||!ff(a[c[d]],b[c[d]]))return!1;return!0}\nvar jf=Xa&&\"documentMode\"in document&&11>=document.documentMode,kf={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},lf=null,mf=null,nf=null,of=!1;\nfunction pf(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(of||null==lf||lf!==Ud(c))return null;c=lf;\"selectionStart\"in c&&Zd(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return nf&&hf(nf,c)?null:(nf=c,a=F.getPooled(kf.select,mf,a,b),a.type=\"select\",a.target=lf,Lc(a),a)}\nvar qf={eventTypes:kf,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=oc(e);f=ja.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?qe(b):window;switch(a){case \"focus\":if(Ne(e)||\"true\"===e.contentEditable)lf=e,mf=b,nf=null;break;case \"blur\":nf=mf=lf=null;break;case \"mousedown\":of=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":return of=!1,pf(c,d);case \"selectionchange\":if(jf)break;\ncase \"keydown\":case \"keyup\":return pf(c,d)}return null}};Ba.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));sa=re;ta=pe;ua=qe;Ba.injectEventPluginsByName({SimpleEventPlugin:wd,EnterLeaveEventPlugin:df,ChangeEventPlugin:bf,SelectEventPlugin:qf,BeforeInputEventPlugin:Le});new Set;var rf=[],sf=-1;function H(a){0>sf||(a.current=rf[sf],rf[sf]=null,sf--)}\nfunction I(a,b){sf++;rf[sf]=a.current;a.current=b}var tf={},J={current:tf},K={current:!1},uf=tf;function vf(a,b){var c=a.type.contextTypes;if(!c)return tf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function N(a){a=a.childContextTypes;return null!==a&&void 0!==a}\nfunction wf(a){H(K,a);H(J,a)}function xf(a){H(K,a);H(J,a)}function zf(a,b,c){if(J.current!==tf)throw t(Error(168));I(J,b,a);I(K,c,a)}function Af(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw t(Error(108),Va(b)||\"Unknown\",e);return n({},c,{},d)}function Bf(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||tf;uf=J.current;I(J,b,a);I(K,K.current,a);return!0}\nfunction Cf(a,b,c){var d=a.stateNode;if(!d)throw t(Error(169));c?(b=Af(a,b,uf),d.__reactInternalMemoizedMergedChildContext=b,H(K,a),H(J,a),I(J,b,a)):H(K,a);I(K,c,a)}\nvar Df=r.unstable_runWithPriority,Ef=r.unstable_scheduleCallback,Ff=r.unstable_cancelCallback,Gf=r.unstable_shouldYield,Hf=r.unstable_requestPaint,If=r.unstable_now,Jf=r.unstable_getCurrentPriorityLevel,Kf=r.unstable_ImmediatePriority,Lf=r.unstable_UserBlockingPriority,Mf=r.unstable_NormalPriority,Nf=r.unstable_LowPriority,Of=r.unstable_IdlePriority,Pf={},Qf=void 0!==Hf?Hf:function(){},Rf=null,Sf=null,Tf=!1,Uf=If(),Vf=1E4>Uf?If:function(){return If()-Uf};\nfunction Wf(){switch(Jf()){case Kf:return 99;case Lf:return 98;case Mf:return 97;case Nf:return 96;case Of:return 95;default:throw t(Error(332));}}function Xf(a){switch(a){case 99:return Kf;case 98:return Lf;case 97:return Mf;case 96:return Nf;case 95:return Of;default:throw t(Error(332));}}function Yf(a,b){a=Xf(a);return Df(a,b)}function Zf(a,b,c){a=Xf(a);return Ef(a,b,c)}function $f(a){null===Rf?(Rf=[a],Sf=Ef(Kf,ag)):Rf.push(a);return Pf}function bg(){if(null!==Sf){var a=Sf;Sf=null;Ff(a)}ag()}\nfunction ag(){if(!Tf&&null!==Rf){Tf=!0;var a=0;try{var b=Rf;Yf(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});Rf=null}catch(c){throw null!==Rf&&(Rf=Rf.slice(a+1)),Ef(Kf,bg),c;}finally{Tf=!1}}}function cg(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}var dg={current:null},eg=null,fg=null,gg=null;function hg(){gg=fg=eg=null}function ig(a,b){var c=a.type._context;I(dg,c._currentValue,a);c._currentValue=b}\nfunction jg(a){var b=dg.current;H(dg,a);a.type._context._currentValue=b}function kg(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function lg(a,b){eg=a;gg=fg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(mg=!0),a.firstContext=null)}\nfunction ng(a,b){if(gg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)gg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===fg){if(null===eg)throw t(Error(308));fg=b;eg.dependencies={expirationTime:0,firstContext:b,responders:null}}else fg=fg.next=b}return a._currentValue}var og=!1;\nfunction pg(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function qg(a){return{baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}\nfunction rg(a,b){return{expirationTime:a,suspenseConfig:b,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function sg(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}\nfunction tg(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=pg(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=pg(a.memoizedState),e=c.updateQueue=pg(c.memoizedState)):d=a.updateQueue=qg(e):null===e&&(e=c.updateQueue=qg(d));null===e||d===e?sg(d,b):null===d.lastUpdate||null===e.lastUpdate?(sg(d,b),sg(e,b)):(sg(d,b),e.lastUpdate=b)}\nfunction ug(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=pg(a.memoizedState):vg(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b)}function vg(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=qg(b));return b}\nfunction wg(a,b,c,d,e,f){switch(c.tag){case 1:return a=c.payload,\"function\"===typeof a?a.call(f,d,e):a;case 3:a.effectTag=a.effectTag&-4097|64;case 0:a=c.payload;e=\"function\"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return n({},d,e);case 2:og=!0}return d}\nfunction xg(a,b,c,d,e){og=!1;b=vg(a,b);for(var f=b.baseState,g=null,h=0,k=b.firstUpdate,l=f;null!==k;){var m=k.expirationTime;m<e?(null===g&&(g=k,f=l),h<m&&(h=m)):(yg(m,k.suspenseConfig),l=wg(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastEffect?b.firstEffect=b.lastEffect=k:(b.lastEffect.nextEffect=k,b.lastEffect=k)));k=k.next}m=null;for(k=b.firstCapturedUpdate;null!==k;){var A=k.expirationTime;A<e?(null===m&&(m=k,null===g&&(f=l)),h<A&&(h=A)):(l=wg(a,b,k,l,c,d),null!==\nk.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastCapturedEffect?b.firstCapturedEffect=b.lastCapturedEffect=k:(b.lastCapturedEffect.nextEffect=k,b.lastCapturedEffect=k)));k=k.next}null===g&&(b.lastUpdate=null);null===m?b.lastCapturedUpdate=null:a.effectTag|=32;null===g&&null===m&&(f=l);b.baseState=f;b.firstUpdate=g;b.firstCapturedUpdate=m;zg(h);a.expirationTime=h;a.memoizedState=l}\nfunction Ag(a,b,c){null!==b.firstCapturedUpdate&&(null!==b.lastUpdate&&(b.lastUpdate.next=b.firstCapturedUpdate,b.lastUpdate=b.lastCapturedUpdate),b.firstCapturedUpdate=b.lastCapturedUpdate=null);Bg(b.firstEffect,c);b.firstEffect=b.lastEffect=null;Bg(b.firstCapturedEffect,c);b.firstCapturedEffect=b.lastCapturedEffect=null}function Bg(a,b){for(;null!==a;){var c=a.callback;if(null!==c){a.callback=null;var d=b;if(\"function\"!==typeof c)throw t(Error(191),c);c.call(d)}a=a.nextEffect}}\nvar Cg=Da.ReactCurrentBatchConfig,Dg=(new aa.Component).refs;function Eg(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}\nvar Ig={isMounted:function(a){return(a=a._reactInternalFiber)?Bc(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Fg(),e=Cg.suspense;d=Gg(d,a,e);e=rg(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);tg(a,e);Hg(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Fg(),e=Cg.suspense;d=Gg(d,a,e);e=rg(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);tg(a,e);Hg(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Fg(),d=Cg.suspense;\nc=Gg(c,a,d);d=rg(c,d);d.tag=2;void 0!==b&&null!==b&&(d.callback=b);tg(a,d);Hg(a,c)}};function Jg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!hf(c,d)||!hf(e,f):!0}\nfunction Kg(a,b,c){var d=!1,e=tf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=ng(f):(e=N(b)?uf:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?vf(a,e):tf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Ig;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Lg(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Ig.enqueueReplaceState(b,b.state,null)}\nfunction Mg(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Dg;var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=ng(f):(f=N(b)?uf:J.current,e.context=vf(a,f));f=a.updateQueue;null!==f&&(xg(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Eg(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==\ntypeof e.componentWillMount||(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Ig.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(xg(a,f,c,e,d),e.state=a.memoizedState));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var Ng=Array.isArray;\nfunction Og(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw t(Error(309));var d=c.stateNode}if(!d)throw t(Error(147),a);var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Dg&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw t(Error(284));if(!c._owner)throw t(Error(290),a);}return a}\nfunction Pg(a,b){if(\"textarea\"!==a.type)throw t(Error(31),\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\");}\nfunction Qg(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Rg(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\nE,c):d;b.effectTag=E;return c}function g(b){a&&null===b.alternate&&(b.effectTag=E);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Sg(c,a.mode,d),b.return=a,b;b=e(b,c,d);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props,d),d.ref=Og(a,b,c),d.return=a,d;d=Tg(c.type,c.key,c.props,null,a.mode,d);d.ref=Og(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==\nc.implementation)return b=Ug(c,a.mode,d),b.return=a,b;b=e(b,c.children||[],d);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Vg(c,a.mode,d,f),b.return=a,b;b=e(b,c,d);b.return=a;return b}function A(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Sg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case Fa:return c=Tg(b.type,b.key,b.props,null,a.mode,c),c.ref=Og(a,null,b),c.return=a,c;case Ga:return b=Ug(b,a.mode,c),b.return=a,b}if(Ng(b)||\nTa(b))return b=Vg(b,a.mode,c,null),b.return=a,b;Pg(a,b)}return null}function w(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case Fa:return c.key===e?c.type===Ha?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case Ga:return c.key===e?l(a,b,c,d):null}if(Ng(c)||Ta(c))return null!==e?null:m(a,b,c,d,null);Pg(a,c)}return null}function L(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=\na.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case Fa:return a=a.get(null===d.key?c:d.key)||null,d.type===Ha?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case Ga:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Ng(d)||Ta(d))return a=a.get(c)||null,m(b,a,d,e,null);Pg(b,d)}return null}function wb(e,g,h,k){for(var l=null,m=null,q=g,y=g=0,z=null;null!==q&&y<h.length;y++){q.index>y?(z=q,q=null):z=q.sibling;var p=w(e,q,h[y],k);if(null===p){null===q&&(q=z);break}a&&\nq&&null===p.alternate&&b(e,q);g=f(p,g,y);null===m?l=p:m.sibling=p;m=p;q=z}if(y===h.length)return c(e,q),l;if(null===q){for(;y<h.length;y++)q=A(e,h[y],k),null!==q&&(g=f(q,g,y),null===m?l=q:m.sibling=q,m=q);return l}for(q=d(e,q);y<h.length;y++)z=L(q,e,y,h[y],k),null!==z&&(a&&null!==z.alternate&&q.delete(null===z.key?y:z.key),g=f(z,g,y),null===m?l=z:m.sibling=z,m=z);a&&q.forEach(function(a){return b(e,a)});return l}function M(e,g,h,k){var l=Ta(h);if(\"function\"!==typeof l)throw t(Error(150));h=l.call(h);\nif(null==h)throw t(Error(151));for(var m=l=null,q=g,y=g=0,z=null,p=h.next();null!==q&&!p.done;y++,p=h.next()){q.index>y?(z=q,q=null):z=q.sibling;var M=w(e,q,p.value,k);if(null===M){null===q&&(q=z);break}a&&q&&null===M.alternate&&b(e,q);g=f(M,g,y);null===m?l=M:m.sibling=M;m=M;q=z}if(p.done)return c(e,q),l;if(null===q){for(;!p.done;y++,p=h.next())p=A(e,p.value,k),null!==p&&(g=f(p,g,y),null===m?l=p:m.sibling=p,m=p);return l}for(q=d(e,q);!p.done;y++,p=h.next())p=L(q,e,y,p.value,k),null!==p&&(a&&null!==\np.alternate&&q.delete(null===p.key?y:p.key),g=f(p,g,y),null===m?l=p:m.sibling=p,m=p);a&&q.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===Ha&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Fa:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){if(7===k.tag?f.type===Ha:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===Ha?f.props.children:f.props,h);d.ref=Og(a,k,f);d.return=a;a=d;break a}c(a,\nk);break}else b(a,k);k=k.sibling}f.type===Ha?(d=Vg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Tg(f.type,f.key,f.props,null,a.mode,h),h.ref=Og(a,d,f),h.return=a,a=h)}return g(a);case Ga:a:{for(k=f.key;null!==d;){if(d.key===k){if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}c(a,d);break}else b(a,d);d=d.sibling}d=Ug(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\n\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=a,a=d):(c(a,d),d=Sg(f,a.mode,h),d.return=a,a=d),g(a);if(Ng(f))return wb(a,d,f,h);if(Ta(f))return M(a,d,f,h);l&&Pg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,t(Error(152),a.displayName||a.name||\"Component\");}return c(a,d)}}var Wg=Qg(!0),Xg=Qg(!1),Yg={},Zg={current:Yg},$g={current:Yg},ah={current:Yg};function bh(a){if(a===Yg)throw t(Error(174));return a}\nfunction ch(a,b){I(ah,b,a);I($g,a,a);I(Zg,Yg,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Qb(null,\"\");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=Qb(b,c)}H(Zg,a);I(Zg,b,a)}function dh(a){H(Zg,a);H($g,a);H(ah,a)}function eh(a){bh(ah.current);var b=bh(Zg.current);var c=Qb(b,a.type);b!==c&&(I($g,a,a),I(Zg,c,a))}function fh(a){$g.current===a&&(H(Zg,a),H($g,a))}var O={current:0};\nfunction gh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===be||c.data===ce))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if((b.effectTag&64)!==D)return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function hh(a,b){return{responder:a,props:b}}\nvar ih=Da.ReactCurrentDispatcher,jh=0,kh=null,P=null,lh=null,mh=null,Q=null,nh=null,oh=0,ph=null,qh=0,rh=!1,sh=null,th=0;function uh(){throw t(Error(321));}function vh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!ff(a[c],b[c]))return!1;return!0}\nfunction wh(a,b,c,d,e,f){jh=f;kh=b;lh=null!==a?a.memoizedState:null;ih.current=null===lh?xh:yh;b=c(d,e);if(rh){do rh=!1,th+=1,lh=null!==a?a.memoizedState:null,nh=mh,ph=Q=P=null,ih.current=yh,b=c(d,e);while(rh);sh=null;th=0}ih.current=zh;a=kh;a.memoizedState=mh;a.expirationTime=oh;a.updateQueue=ph;a.effectTag|=qh;a=null!==P&&null!==P.next;jh=0;nh=Q=mh=lh=P=kh=null;oh=0;ph=null;qh=0;if(a)throw t(Error(300));return b}\nfunction Ah(){ih.current=zh;jh=0;nh=Q=mh=lh=P=kh=null;oh=0;ph=null;qh=0;rh=!1;sh=null;th=0}function Eh(){var a={memoizedState:null,baseState:null,queue:null,baseUpdate:null,next:null};null===Q?mh=Q=a:Q=Q.next=a;return Q}function Fh(){if(null!==nh)Q=nh,nh=Q.next,P=lh,lh=null!==P?P.next:null;else{if(null===lh)throw t(Error(310));P=lh;var a={memoizedState:P.memoizedState,baseState:P.baseState,queue:P.queue,baseUpdate:P.baseUpdate,next:null};Q=null===Q?mh=a:Q.next=a;lh=P.next}return Q}\nfunction Gh(a,b){return\"function\"===typeof b?b(a):b}\nfunction Hh(a){var b=Fh(),c=b.queue;if(null===c)throw t(Error(311));c.lastRenderedReducer=a;if(0<th){var d=c.dispatch;if(null!==sh){var e=sh.get(c);if(void 0!==e){sh.delete(c);var f=b.memoizedState;do f=a(f,e.action),e=e.next;while(null!==e);ff(f,b.memoizedState)||(mg=!0);b.memoizedState=f;b.baseUpdate===c.last&&(b.baseState=f);c.lastRenderedState=f;return[f,d]}}return[b.memoizedState,d]}d=c.last;var g=b.baseUpdate;f=b.baseState;null!==g?(null!==d&&(d.next=null),d=g.next):d=null!==d?d.next:null;if(null!==\nd){var h=e=null,k=d,l=!1;do{var m=k.expirationTime;m<jh?(l||(l=!0,h=g,e=f),m>oh&&(oh=m,zg(oh))):(yg(m,k.suspenseConfig),f=k.eagerReducer===a?k.eagerState:a(f,k.action));g=k;k=k.next}while(null!==k&&k!==d);l||(h=g,e=f);ff(f,b.memoizedState)||(mg=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.lastRenderedState=f}return[b.memoizedState,c.dispatch]}\nfunction Ih(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===ph?(ph={lastEffect:null},ph.lastEffect=a.next=a):(b=ph.lastEffect,null===b?ph.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,ph.lastEffect=a));return a}function Jh(a,b,c,d){var e=Eh();qh|=a;e.memoizedState=Ih(b,c,void 0,void 0===d?null:d)}\nfunction Kh(a,b,c,d){var e=Fh();d=void 0===d?null:d;var f=void 0;if(null!==P){var g=P.memoizedState;f=g.destroy;if(null!==d&&vh(d,g.deps)){Ih(0,c,f,d);return}}qh|=a;e.memoizedState=Ih(b,c,f,d)}function Lh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function Mh(){}\nfunction Nh(a,b,c){if(!(25>th))throw t(Error(301));var d=a.alternate;if(a===kh||null!==d&&d===kh)if(rh=!0,a={expirationTime:jh,suspenseConfig:null,action:c,eagerReducer:null,eagerState:null,next:null},null===sh&&(sh=new Map),c=sh.get(b),void 0===c)sh.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a}else{var e=Fg(),f=Cg.suspense;e=Gg(e,a,f);f={expirationTime:e,suspenseConfig:f,action:c,eagerReducer:null,eagerState:null,next:null};var g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&\n(f.next=h);g.next=f}b.last=f;if(0===a.expirationTime&&(null===d||0===d.expirationTime)&&(d=b.lastRenderedReducer,null!==d))try{var k=b.lastRenderedState,l=d(k,c);f.eagerReducer=d;f.eagerState=l;if(ff(l,k))return}catch(m){}finally{}Hg(a,e)}}\nvar zh={readContext:ng,useCallback:uh,useContext:uh,useEffect:uh,useImperativeHandle:uh,useLayoutEffect:uh,useMemo:uh,useReducer:uh,useRef:uh,useState:uh,useDebugValue:uh,useResponder:uh},xh={readContext:ng,useCallback:function(a,b){Eh().memoizedState=[a,void 0===b?null:b];return a},useContext:ng,useEffect:function(a,b){return Jh(516,192,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Jh(4,36,Lh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Jh(4,\n36,a,b)},useMemo:function(a,b){var c=Eh();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Eh();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=Nh.bind(null,kh,a);return[d.memoizedState,a]},useRef:function(a){var b=Eh();a={current:a};return b.memoizedState=a},useState:function(a){var b=Eh();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,\ndispatch:null,lastRenderedReducer:Gh,lastRenderedState:a};a=a.dispatch=Nh.bind(null,kh,a);return[b.memoizedState,a]},useDebugValue:Mh,useResponder:hh},yh={readContext:ng,useCallback:function(a,b){var c=Fh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&vh(b,d[1]))return d[0];c.memoizedState=[a,b];return a},useContext:ng,useEffect:function(a,b){return Kh(516,192,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Kh(4,36,Lh.bind(null,b,a),c)},\nuseLayoutEffect:function(a,b){return Kh(4,36,a,b)},useMemo:function(a,b){var c=Fh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&vh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:Hh,useRef:function(){return Fh().memoizedState},useState:function(a){return Hh(Gh,a)},useDebugValue:Mh,useResponder:hh},Oh=null,Ph=null,Qh=!1;\nfunction Rh(a,b){var c=Sh(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function Th(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction Uh(a){if(Qh){var b=Ph;if(b){var c=b;if(!Th(a,b)){b=je(c.nextSibling);if(!b||!Th(a,b)){a.effectTag=a.effectTag&~Ac|E;Qh=!1;Oh=a;return}Rh(Oh,c)}Oh=a;Ph=je(b.firstChild)}else a.effectTag=a.effectTag&~Ac|E,Qh=!1,Oh=a}}function Vh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;Oh=a}\nfunction Wh(a){if(a!==Oh)return!1;if(!Qh)return Vh(a),Qh=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!ge(b,a.memoizedProps))for(b=Ph;b;)Rh(a,b),b=je(b.nextSibling);Vh(a);if(13===a.tag)if(a=a.memoizedState,a=null!==a?a.dehydrated:null,null===a)a=Ph;else a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===ae){if(0===b){a=je(a.nextSibling);break a}b--}else c!==$d&&c!==ce&&c!==be||b++}a=a.nextSibling}a=null}else a=Oh?je(a.stateNode.nextSibling):null;Ph=a;return!0}\nfunction Xh(){Ph=Oh=null;Qh=!1}var Yh=Da.ReactCurrentOwner,mg=!1;function R(a,b,c,d){b.child=null===a?Xg(b,null,c,d):Wg(b,a.child,c,d)}function Zh(a,b,c,d,e){c=c.render;var f=b.ref;lg(b,e);d=wh(a,b,c,d,f,e);if(null!==a&&!mg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,d,e);return b.child}\nfunction ai(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!bi(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ci(a,b,g,d,e,f);a=Tg(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:hf,c(e,d)&&a.ref===b.ref))return $h(a,b,f);b.effectTag|=1;a=Rg(g,d,f);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ci(a,b,c,d,e,f){return null!==a&&hf(a.memoizedProps,d)&&a.ref===b.ref&&(mg=!1,e<f)?$h(a,b,f):di(a,b,c,d,f)}function ei(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function di(a,b,c,d,e){var f=N(c)?uf:J.current;f=vf(b,f);lg(b,e);c=wh(a,b,c,d,f,e);if(null!==a&&!mg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,c,e);return b.child}\nfunction fi(a,b,c,d,e){if(N(c)){var f=!0;Bf(b)}else f=!1;lg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=E),Kg(b,c,d,e),Mg(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=ng(l):(l=N(c)?uf:J.current,l=vf(b,l));var m=c.getDerivedStateFromProps,A=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;A||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Lg(b,g,d,l);og=!1;var w=b.memoizedState;k=g.state=w;var L=b.updateQueue;null!==L&&(xg(b,L,d,g,e),k=b.memoizedState);h!==d||w!==k||K.current||og?(\"function\"===typeof m&&(Eg(b,c,m,d),k=b.memoizedState),(h=og||Jg(b,c,h,d,w,k,l))?(A||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&\ng.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.effectTag|=4)):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,h=b.memoizedProps,g.props=b.type===b.elementType?h:cg(b.type,h),k=g.context,l=c.contextType,\"object\"===typeof l&&null!==l?l=ng(l):(l=N(c)?uf:J.current,l=vf(b,l)),m=c.getDerivedStateFromProps,(A=\n\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Lg(b,g,d,l),og=!1,k=b.memoizedState,w=g.state=k,L=b.updateQueue,null!==L&&(xg(b,L,d,g,e),w=b.memoizedState),h!==d||k!==w||K.current||og?(\"function\"===typeof m&&(Eg(b,c,m,d),w=b.memoizedState),(m=og||Jg(b,c,h,d,k,w,l))?(A||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||\n(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,w,l),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,w,l)),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=\nd,b.memoizedState=w),g.props=d,g.state=w,g.context=l,d=m):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return gi(a,b,c,d,f,e)}\nfunction gi(a,b,c,d,e,f){ei(a,b);var g=(b.effectTag&64)!==D;if(!d&&!g)return e&&Cf(b,c,!1),$h(a,b,f);d=b.stateNode;Yh.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=Wg(b,a.child,null,f),b.child=Wg(b,null,h,f)):R(a,b,h,f);b.memoizedState=d.state;e&&Cf(b,c,!0);return b.child}function hi(a){var b=a.stateNode;b.pendingContext?zf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&zf(a,b.context,!1);ch(a,b.containerInfo)}\nvar ii={dehydrated:null,retryTime:1};\nfunction ji(a,b,c){var d=b.mode,e=b.pendingProps,f=O.current,g=!1,h;(h=(b.effectTag&64)!==D)||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);I(O,f&1,b);if(null===a){if(g){g=e.fallback;e=Vg(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Vg(g,d,c,null);c.return=b;e.sibling=c;b.memoizedState=\nii;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Xg(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=Rg(a,a.pendingProps,0);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Rg(d,e,d.expirationTime);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=ii;b.child=c;return d}c=Wg(b,a.child,e.children,c);b.memoizedState=null;return b.child=c}a=a.child;\nif(g){g=e.fallback;e=Vg(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Vg(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=E;e.childExpirationTime=0;b.memoizedState=ii;b.child=e;return c}b.memoizedState=null;return b.child=Wg(b,a,e.children,c)}\nfunction ki(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,last:d,tail:c,tailExpiration:0,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.last=d,f.tail=c,f.tailExpiration=0,f.tailMode=e)}\nfunction li(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;R(a,b,d.children,c);d=O.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&(a.effectTag&64)!==D)a:for(a=b.child;null!==a;){if(13===a.tag){if(null!==a.memoizedState){a.expirationTime<c&&(a.expirationTime=c);var g=a.alternate;null!==g&&g.expirationTime<c&&(g.expirationTime=c);kg(a.return,c)}}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;\na=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(O,d,b);if(0===(b.mode&2))b.memoizedState=null;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)d=c.alternate,null!==d&&null===gh(d)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);ki(b,!1,e,c,f);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){d=e.alternate;if(null!==d&&null===gh(d)){b.child=e;break}d=e.sibling;e.sibling=c;c=e;e=d}ki(b,!0,c,null,f);break;case \"together\":ki(b,\n!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}function $h(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&zg(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw t(Error(153));if(null!==b.child){a=b.child;c=Rg(a,a.pendingProps,a.expirationTime);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Rg(a,a.pendingProps,a.expirationTime),c.return=b;c.sibling=null}return b.child}\nfunction mi(a){a.effectTag|=4}var ni,oi,pi,qi;ni=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};oi=function(){};\npi=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;bh(Zg.current);a=null;switch(c){case \"input\":f=Ab(g,f);d=Ab(g,d);a=[];break;case \"option\":f=Ib(g,f);d=Ib(g,d);a=[];break;case \"select\":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case \"textarea\":f=Kb(g,f);d=Kb(g,d);a=[];break;default:\"function\"!==typeof f.onClick&&\"function\"===typeof d.onClick&&(g.onclick=Td)}Qd(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if(\"style\"===\nh)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]=\"\");else\"dangerouslySetInnerHTML\"!==h&&\"children\"!==h&&\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(ia.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if(\"style\"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]=\"\");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),\nc[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else\"dangerouslySetInnerHTML\"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,\"\"+l)):\"children\"===h?g===l||\"string\"!==typeof l&&\"number\"!==typeof l||(a=a||[]).push(h,\"\"+l):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&(ia.hasOwnProperty(h)?(null!=l&&Sd(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push(\"style\",c);e=a;(b.updateQueue=e)&&mi(b)}};qi=function(a,b,c,d){c!==d&&mi(b)};\nfunction ri(a,b){switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction si(a){switch(a.tag){case 1:N(a.type)&&wf(a);var b=a.effectTag;return b&4096?(a.effectTag=b&-4097|64,a):null;case 3:dh(a);xf(a);b=a.effectTag;if((b&64)!==D)throw t(Error(285));a.effectTag=b&-4097|64;return a;case 5:return fh(a),null;case 13:return H(O,a),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return H(O,a),null;case 4:return dh(a),null;case 10:return jg(a),null;default:return null}}function ti(a,b){return{value:a,source:b,stack:Wa(b)}}\nvar ui=\"function\"===typeof WeakSet?WeakSet:Set;function vi(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Wa(c));null!==c&&Va(c.type);b=b.value;null!==a&&1===a.tag&&Va(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function wi(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){xi(a,c)}}function yi(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){xi(a,c)}else b.current=null}\nfunction Di(a,b){switch(b.tag){case 0:case 11:case 15:Ei(2,0,b);break;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:cg(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}break;case 3:case 5:case 6:case 4:case 17:break;default:throw t(Error(163));}}\nfunction Ei(a,b,c){c=c.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do{if(0!==(d.tag&a)){var e=d.destroy;d.destroy=void 0;void 0!==e&&e()}0!==(d.tag&b)&&(e=d.create,d.destroy=e());d=d.next}while(d!==c)}}\nfunction Fi(a,b,c){\"function\"===typeof Gi&&Gi(b);switch(b.tag){case 0:case 11:case 14:case 15:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;Yf(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){xi(g,h)}}a=a.next}while(a!==d)})}break;case 1:yi(b);c=b.stateNode;\"function\"===typeof c.componentWillUnmount&&wi(b,c);break;case 5:yi(b);break;case 4:Hi(a,b,c)}}\nfunction Ii(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;null!==b&&Ii(b)}function Ji(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Ki(a){a:{for(var b=a.return;null!==b;){if(Ji(b)){var c=b;break a}b=b.return}throw t(Error(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw t(Error(161));}c.effectTag&16&&(Tb(b,\"\"),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Ji(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&E)continue b;\nif(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&E)){c=c.stateNode;break a}}for(var e=a;;){var f=5===e.tag||6===e.tag;if(f){var g=f?e.stateNode:e.stateNode.instance;if(c)if(d){f=b;var h=g;g=c;8===f.nodeType?f.parentNode.insertBefore(h,g):f.insertBefore(h,g)}else b.insertBefore(g,c);else d?(h=b,8===h.nodeType?(f=h.parentNode,f.insertBefore(g,h)):(f=h,f.appendChild(g)),h=h._reactRootContainer,null!==h&&void 0!==h||null!==f.onclick||(f.onclick=Td)):b.appendChild(g)}else if(4!==\ne.tag&&null!==e.child){e.child.return=e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===e.return||e.return===a)return;e=e.return}e.sibling.return=e.return;e=e.sibling}}\nfunction Hi(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw t(Error(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Fi(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Fi(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}\nfunction Li(a,b){switch(b.tag){case 0:case 11:case 14:case 15:Ei(4,8,b);break;case 1:break;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[ne]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Cb(c,d);Rd(a,e);b=Rd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];\"style\"===g?Od(c,h):\"dangerouslySetInnerHTML\"===g?Sb(c,h):\"children\"===g?Tb(c,h):ub(c,g,h,b)}switch(a){case \"input\":Db(c,d);break;case \"textarea\":Mb(c,\nd);break;case \"select\":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?Jb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?Jb(c,!!d.multiple,d.defaultValue,!0):Jb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}break;case 6:if(null===b.stateNode)throw t(Error(162));b.stateNode.nodeValue=b.memoizedProps;break;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,zc(b.containerInfo));break;case 12:break;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,Mi=Vf());\nif(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null,f.style.display=Nd(\"display\",e));else if(6===a.tag)a.stateNode.nodeValue=d?\"\":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=\na;a=a.child;continue}if(a===c)break a;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Ni(b);break;case 19:Ni(b);break;case 17:break;case 20:break;case 21:break;default:throw t(Error(163));}}function Ni(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new ui);b.forEach(function(b){var d=Oi.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}var Pi=\"function\"===typeof WeakMap?WeakMap:Map;\nfunction Qi(a,b,c){c=rg(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Ri||(Ri=!0,Si=d);vi(a,b)};return c}\nfunction Ti(a,b,c){c=rg(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){vi(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===Ui?Ui=new Set([this]):Ui.add(this),vi(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nvar Vi=Math.ceil,Wi=Da.ReactCurrentDispatcher,Xi=Da.ReactCurrentOwner,S=0,Yi=8,Zi=16,$i=32,aj=0,bj=1,cj=2,dj=3,ej=4,fj=5,gj=6,T=S,U=null,V=null,W=0,X=aj,hj=null,ij=1073741823,jj=1073741823,kj=null,lj=0,mj=!1,Mi=0,nj=500,Y=null,Ri=!1,Si=null,Ui=null,oj=!1,pj=null,qj=90,rj=null,sj=0,tj=null,uj=0;function Fg(){return(T&(Zi|$i))!==S?1073741821-(Vf()/10|0):0!==uj?uj:uj=1073741821-(Vf()/10|0)}\nfunction Gg(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=Wf();if(0===(b&4))return 99===d?1073741823:1073741822;if((T&Zi)!==S)return W;if(null!==c)a=1073741821-25*(((1073741821-a+(c.timeoutMs|0||5E3)/10)/25|0)+1);else switch(d){case 99:a=1073741823;break;case 98:a=1073741821-10*(((1073741821-a+15)/10|0)+1);break;case 97:case 96:a=1073741821-25*(((1073741821-a+500)/25|0)+1);break;case 95:a=2;break;default:throw t(Error(326));}null!==U&&a===W&&--a;return a}var vj=0;\nfunction Hg(a,b){if(50<sj)throw sj=0,tj=null,t(Error(185));a=wj(a,b);if(null!==a){var c=Wf();1073741823===b?(T&Yi)!==S&&(T&(Zi|$i))===S?xj(a):(Z(a),T===S&&bg()):Z(a);(T&4)===S||98!==c&&99!==c||(null===rj?rj=new Map([[a,b]]):(c=rj.get(a),(void 0===c||c>b)&&rj.set(a,b)))}}\nfunction wj(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(U===e&&(zg(b),X===ej&&yj(e,W)),zj(e,b));return e}\nfunction Aj(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Bj(a,b))return b;b=a.lastPingedTime;a=a.nextKnownPendingLevel;return b>a?b:a}\nfunction Z(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=$f(xj.bind(null,a));else{var b=Aj(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=Fg();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Pf&&Ff(c)}a.callbackExpirationTime=\nb;a.callbackPriority=d;b=1073741823===b?$f(xj.bind(null,a)):Zf(d,Cj.bind(null,a),{timeout:10*(1073741821-b)-Vf()});a.callbackNode=b}}}\nfunction Cj(a,b){uj=0;if(b)return b=Fg(),Dj(a,b),Z(a),null;var c=Aj(a);if(0!==c){b=a.callbackNode;if((T&(Zi|$i))!==S)throw t(Error(327));Ej();a===U&&c===W||Fj(a,c);if(null!==V){var d=T;T|=Zi;var e=Gj(a);do try{Hj();break}catch(h){Ij(a,h)}while(1);hg();T=d;Wi.current=e;if(X===bj)throw b=hj,Fj(a,c),yj(a,c),Z(a),b;if(null===V)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,Jj(a,c),d=X,U=null,d){case aj:case bj:throw t(Error(345));case cj:if(2!==c){Dj(a,2);break}Kj(a);break;case dj:yj(a,\nc);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Lj(e));if(1073741823===ij&&(e=Mi+nj-Vf(),10<e)){if(mj){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Fj(a,c);break}}f=Aj(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=he(Kj.bind(null,a),e);break}Kj(a);break;case ej:yj(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Lj(e));if(mj&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Fj(a,c);break}e=Aj(a);if(0!==e&&e!==c)break;if(0!==\nd&&d!==c){a.lastPingedTime=d;break}1073741823!==jj?d=10*(1073741821-jj)-Vf():1073741823===ij?d=0:(d=10*(1073741821-ij)-5E3,e=Vf(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*Vi(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=he(Kj.bind(null,a),d);break}Kj(a);break;case fj:if(1073741823!==ij&&null!==kj){f=ij;var g=kj;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=Vf()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);\nif(10<d){yj(a,c);a.timeoutHandle=he(Kj.bind(null,a),d);break}}Kj(a);break;case gj:yj(a,c);break;default:throw t(Error(329));}Z(a);if(a.callbackNode===b)return Cj.bind(null,a)}}return null}\nfunction xj(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if(a.finishedExpirationTime===b)Kj(a);else{if((T&(Zi|$i))!==S)throw t(Error(327));Ej();a===U&&b===W||Fj(a,b);if(null!==V){var c=T;T|=Zi;var d=Gj(a);do try{Mj();break}catch(e){Ij(a,e)}while(1);hg();T=c;Wi.current=d;if(X===bj)throw c=hj,Fj(a,b),yj(a,b),Z(a),c;if(null!==V)throw t(Error(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;Jj(a,b);X===gj?yj(a,b):(U=null,Kj(a));Z(a)}}return null}\nfunction Nj(){(T&(1|Zi|$i))===S&&(Oj(),Ej())}function Jj(a,b){var c=a.firstBatch;null!==c&&c._defer&&c._expirationTime>=b&&(Zf(97,function(){c._onComplete();return null}),X=gj)}function Oj(){if(null!==rj){var a=rj;rj=null;a.forEach(function(a,c){Dj(c,a);Z(c)});bg()}}function Pj(a,b){var c=T;T|=1;try{return a(b)}finally{T=c,T===S&&bg()}}function Qj(a,b,c,d){var e=T;T|=4;try{return Yf(98,a.bind(null,b,c,d))}finally{T=e,T===S&&bg()}}\nfunction Rj(a,b){var c=T;T&=-2;T|=Yi;try{return a(b)}finally{T=c,T===S&&bg()}}\nfunction Fj(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,ie(c));if(null!==V)for(c=V.return;null!==c;){var d=c;switch(d.tag){case 1:var e=d.type.childContextTypes;null!==e&&void 0!==e&&wf(d);break;case 3:dh(d);xf(d);break;case 5:fh(d);break;case 4:dh(d);break;case 13:H(O,d);break;case 19:H(O,d);break;case 10:jg(d)}c=c.return}U=a;V=Rg(a.current,null,b);W=b;X=aj;hj=null;jj=ij=1073741823;kj=null;lj=0;mj=!1}\nfunction Ij(a,b){do{try{hg();Ah();if(null===V||null===V.return)return X=bj,hj=b,null;a:{var c=a,d=V.return,e=V,f=b;b=W;e.effectTag|=2048;e.firstEffect=e.lastEffect=null;if(null!==f&&\"object\"===typeof f&&\"function\"===typeof f.then){var g=f,h=0!==(O.current&1),k=d;do{var l;if(l=13===k.tag){var m=k.memoizedState;if(null!==m)l=null!==m.dehydrated?!0:!1;else{var A=k.memoizedProps;l=void 0===A.fallback?!1:!0!==A.unstable_avoidThisFallback?!0:h?!1:!0}}if(l){var w=k.updateQueue;if(null===w){var L=new Set;\nL.add(g);k.updateQueue=L}else w.add(g);if(0===(k.mode&2)){k.effectTag|=64;e.effectTag&=-2981;if(1===e.tag)if(null===e.alternate)e.tag=17;else{var wb=rg(1073741823,null);wb.tag=2;tg(e,wb)}e.expirationTime=1073741823;break a}f=void 0;e=b;var M=c.pingCache;null===M?(M=c.pingCache=new Pi,f=new Set,M.set(g,f)):(f=M.get(g),void 0===f&&(f=new Set,M.set(g,f)));if(!f.has(e)){f.add(e);var q=Sj.bind(null,c,g,e);g.then(q,q)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);f=Error((Va(e.type)||\n\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\"+Wa(e))}X!==fj&&(X=cj);f=ti(f,e);k=d;do{switch(k.tag){case 3:g=f;k.effectTag|=4096;k.expirationTime=b;var y=Qi(k,g,b);ug(k,y);break a;case 1:g=f;var z=k.type,p=k.stateNode;if((k.effectTag&64)===D&&(\"function\"===typeof z.getDerivedStateFromError||null!==p&&\"function\"===typeof p.componentDidCatch&&\n(null===Ui||!Ui.has(p)))){k.effectTag|=4096;k.expirationTime=b;var u=Ti(k,g,b);ug(k,u);break a}}k=k.return}while(null!==k)}V=Tj(V)}catch(v){b=v;continue}break}while(1)}function Gj(){var a=Wi.current;Wi.current=zh;return null===a?zh:a}function yg(a,b){a<ij&&2<a&&(ij=a);null!==b&&a<jj&&2<a&&(jj=a,kj=b)}function zg(a){a>lj&&(lj=a)}function Mj(){for(;null!==V;)V=Uj(V)}function Hj(){for(;null!==V&&!Gf();)V=Uj(V)}\nfunction Uj(a){var b=Vj(a.alternate,a,W);a.memoizedProps=a.pendingProps;null===b&&(b=Tj(a));Xi.current=null;return b}\nfunction Tj(a){V=a;do{var b=V.alternate;a=V.return;if((V.effectTag&2048)===D){a:{var c=b;b=V;var d=W,e=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:N(b.type)&&wf(b);break;case 3:dh(b);xf(b);d=b.stateNode;d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);(null===c||null===c.child)&&Wh(b)&&mi(b);oi(b);break;case 5:fh(b);d=bh(ah.current);var f=b.type;if(null!==c&&null!=b.stateNode)pi(c,b,f,e,d),c.ref!==b.ref&&(b.effectTag|=128);else if(e){var g=\nbh(Zg.current);if(Wh(b)){e=b;f=void 0;c=e.stateNode;var h=e.type,k=e.memoizedProps;c[me]=e;c[ne]=k;switch(h){case \"iframe\":case \"object\":case \"embed\":G(\"load\",c);break;case \"video\":case \"audio\":for(var l=0;l<dc.length;l++)G(dc[l],c);break;case \"source\":G(\"error\",c);break;case \"img\":case \"image\":case \"link\":G(\"error\",c);G(\"load\",c);break;case \"form\":G(\"reset\",c);G(\"submit\",c);break;case \"details\":G(\"toggle\",c);break;case \"input\":Bb(c,k);G(\"invalid\",c);Sd(d,\"onChange\");break;case \"select\":c._wrapperState=\n{wasMultiple:!!k.multiple};G(\"invalid\",c);Sd(d,\"onChange\");break;case \"textarea\":Lb(c,k),G(\"invalid\",c),Sd(d,\"onChange\")}Qd(h,k);l=null;for(f in k)k.hasOwnProperty(f)&&(g=k[f],\"children\"===f?\"string\"===typeof g?c.textContent!==g&&(l=[\"children\",g]):\"number\"===typeof g&&c.textContent!==\"\"+g&&(l=[\"children\",\"\"+g]):ia.hasOwnProperty(f)&&null!=g&&Sd(d,f));switch(h){case \"input\":yb(c);Gb(c,k,!0);break;case \"textarea\":yb(c);Nb(c,k);break;case \"select\":case \"option\":break;default:\"function\"===typeof k.onClick&&\n(c.onclick=Td)}d=l;e.updateQueue=d;null!==d&&mi(b)}else{k=f;c=e;h=b;l=9===d.nodeType?d:d.ownerDocument;g===Ob.html&&(g=Pb(k));g===Ob.html?\"script\"===k?(k=l.createElement(\"div\"),k.innerHTML=\"<script>\\x3c/script>\",l=k.removeChild(k.firstChild)):\"string\"===typeof c.is?l=l.createElement(k,{is:c.is}):(l=l.createElement(k),\"select\"===k&&(k=l,c.multiple?k.multiple=!0:c.size&&(k.size=c.size))):l=l.createElementNS(g,k);k=l;k[me]=h;k[ne]=c;c=k;ni(c,b,!1,!1);b.stateNode=c;g=d;var m=Rd(f,e);switch(f){case \"iframe\":case \"object\":case \"embed\":G(\"load\",\nc);d=e;break;case \"video\":case \"audio\":for(d=0;d<dc.length;d++)G(dc[d],c);d=e;break;case \"source\":G(\"error\",c);d=e;break;case \"img\":case \"image\":case \"link\":G(\"error\",c);G(\"load\",c);d=e;break;case \"form\":G(\"reset\",c);G(\"submit\",c);d=e;break;case \"details\":G(\"toggle\",c);d=e;break;case \"input\":Bb(c,e);d=Ab(c,e);G(\"invalid\",c);Sd(g,\"onChange\");break;case \"option\":d=Ib(c,e);break;case \"select\":c._wrapperState={wasMultiple:!!e.multiple};d=n({},e,{value:void 0});G(\"invalid\",c);Sd(g,\"onChange\");break;case \"textarea\":Lb(c,\ne);d=Kb(c,e);G(\"invalid\",c);Sd(g,\"onChange\");break;default:d=e}Qd(f,d);h=void 0;k=f;l=c;var A=d;for(h in A)if(A.hasOwnProperty(h)){var w=A[h];\"style\"===h?Od(l,w):\"dangerouslySetInnerHTML\"===h?(w=w?w.__html:void 0,null!=w&&Sb(l,w)):\"children\"===h?\"string\"===typeof w?(\"textarea\"!==k||\"\"!==w)&&Tb(l,w):\"number\"===typeof w&&Tb(l,\"\"+w):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(ia.hasOwnProperty(h)?null!=w&&Sd(g,h):null!=w&&ub(l,h,w,m))}switch(f){case \"input\":yb(c);\nGb(c,e,!1);break;case \"textarea\":yb(c);Nb(c,e);break;case \"option\":null!=e.value&&c.setAttribute(\"value\",\"\"+tb(e.value));break;case \"select\":d=c;c=e;d.multiple=!!c.multiple;h=c.value;null!=h?Jb(d,!!c.multiple,h,!1):null!=c.defaultValue&&Jb(d,!!c.multiple,c.defaultValue,!0);break;default:\"function\"===typeof d.onClick&&(c.onclick=Td)}fe(f,e)&&mi(b)}null!==b.ref&&(b.effectTag|=128)}else if(null===b.stateNode)throw t(Error(166));break;case 6:if(c&&null!=b.stateNode)qi(c,b,c.memoizedProps,e);else{if(\"string\"!==\ntypeof e&&null===b.stateNode)throw t(Error(166));f=bh(ah.current);bh(Zg.current);Wh(b)?(d=b.stateNode,e=b.memoizedProps,d[me]=b,d.nodeValue!==e&&mi(b)):(d=b,e=(9===f.nodeType?f:f.ownerDocument).createTextNode(e),e[me]=b,d.stateNode=e)}break;case 11:break;case 13:H(O,b);e=b.memoizedState;if((b.effectTag&64)!==D){b.expirationTime=d;break a}d=null!==e;e=!1;null===c?Wh(b):(f=c.memoizedState,e=null!==f,d||null===f||(f=c.child.sibling,null!==f&&(h=b.firstEffect,null!==h?(b.firstEffect=f,f.nextEffect=h):\n(b.firstEffect=b.lastEffect=f,f.nextEffect=null),f.effectTag=8)));if(d&&!e&&0!==(b.mode&2))if(null===c&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(O.current&1))X===aj&&(X=dj);else{if(X===aj||X===dj)X=ej;0!==lj&&null!==U&&(yj(U,W),zj(U,lj))}if(d||e)b.effectTag|=4;break;case 7:break;case 8:break;case 12:break;case 4:dh(b);oi(b);break;case 10:jg(b);break;case 9:break;case 14:break;case 17:N(b.type)&&wf(b);break;case 19:H(O,b);e=b.memoizedState;if(null===e)break;f=(b.effectTag&64)!==D;h=e.rendering;\nif(null===h)if(f)ri(e,!1);else{if(X!==aj||null!==c&&(c.effectTag&64)!==D)for(c=b.child;null!==c;){h=gh(c);if(null!==h){b.effectTag|=64;ri(e,!1);e=h.updateQueue;null!==e&&(b.updateQueue=e,b.effectTag|=4);b.firstEffect=b.lastEffect=null;for(e=b.child;null!==e;)f=e,c=d,f.effectTag&=E,f.nextEffect=null,f.firstEffect=null,f.lastEffect=null,h=f.alternate,null===h?(f.childExpirationTime=0,f.expirationTime=c,f.child=null,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null):(f.childExpirationTime=\nh.childExpirationTime,f.expirationTime=h.expirationTime,f.child=h.child,f.memoizedProps=h.memoizedProps,f.memoizedState=h.memoizedState,f.updateQueue=h.updateQueue,c=h.dependencies,f.dependencies=null===c?null:{expirationTime:c.expirationTime,firstContext:c.firstContext,responders:c.responders}),e=e.sibling;I(O,O.current&1|2,b);b=b.child;break a}c=c.sibling}}else{if(!f)if(c=gh(h),null!==c){if(b.effectTag|=64,f=!0,ri(e,!0),null===e.tail&&\"hidden\"===e.tailMode){d=c.updateQueue;null!==d&&(b.updateQueue=\nd,b.effectTag|=4);b=b.lastEffect=e.lastEffect;null!==b&&(b.nextEffect=null);break}}else Vf()>e.tailExpiration&&1<d&&(b.effectTag|=64,f=!0,ri(e,!1),b.expirationTime=b.childExpirationTime=d-1);e.isBackwards?(h.sibling=b.child,b.child=h):(d=e.last,null!==d?d.sibling=h:b.child=h,e.last=h)}if(null!==e.tail){0===e.tailExpiration&&(e.tailExpiration=Vf()+500);d=e.tail;e.rendering=d;e.tail=d.sibling;e.lastEffect=b.lastEffect;d.sibling=null;e=O.current;e=f?e&1|2:e&1;I(O,e,b);b=d;break a}break;case 20:break;\ncase 21:break;default:throw t(Error(156),b.tag);}b=null}d=V;if(1===W||1!==d.childExpirationTime){e=0;for(f=d.child;null!==f;)c=f.expirationTime,h=f.childExpirationTime,c>e&&(e=c),h>e&&(e=h),f=f.sibling;d.childExpirationTime=e}if(null!==b)return b;null!==a&&(a.effectTag&2048)===D&&(null===a.firstEffect&&(a.firstEffect=V.firstEffect),null!==V.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=V.firstEffect),a.lastEffect=V.lastEffect),1<V.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=\nV:a.firstEffect=V,a.lastEffect=V))}else{b=si(V,W);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=V.sibling;if(null!==b)return b;V=a}while(null!==V);X===aj&&(X=fj);return null}function Lj(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Kj(a){var b=Wf();Yf(99,Wj.bind(null,a,b));return null}\nfunction Wj(a,b){Ej();if((T&(Zi|$i))!==S)throw t(Error(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw t(Error(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Lj(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=d-1);d<=a.lastPingedTime&&\n(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===U&&(V=U=null,W=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=T;T|=$i;Xi.current=null;de=Dd;var g=Yd();if(Zd(g)){if(\"selectionStart\"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,m=k.focusNode;k=k.focusOffset;\ntry{h.nodeType,m.nodeType}catch(Fb){h=null;break a}var A=0,w=-1,L=-1,wb=0,M=0,q=g,y=null;b:for(;;){for(var z;;){q!==h||0!==l&&3!==q.nodeType||(w=A+l);q!==m||0!==k&&3!==q.nodeType||(L=A+k);3===q.nodeType&&(A+=q.nodeValue.length);if(null===(z=q.firstChild))break;y=q;q=z}for(;;){if(q===g)break b;y===h&&++wb===l&&(w=A);y===m&&++M===k&&(L=A);if(null!==(z=q.nextSibling))break;q=y;y=q.parentNode}q=z}h=-1===w||-1===L?null:{start:w,end:L}}else h=null}h=h||{start:0,end:0}}else h=null;ee={focusedElem:g,selectionRange:h};\nDd=!1;Y=e;do try{Xj()}catch(Fb){if(null===Y)throw t(Error(330));xi(Y,Fb);Y=Y.nextEffect}while(null!==Y);Y=e;do try{for(g=a,h=b;null!==Y;){var p=Y.effectTag;p&16&&Tb(Y.stateNode,\"\");if(p&128){var u=Y.alternate;if(null!==u){var v=u.ref;null!==v&&(\"function\"===typeof v?v(null):v.current=null)}}switch(p&(E|12|Ac)){case E:Ki(Y);Y.effectTag&=~E;break;case 6:Ki(Y);Y.effectTag&=~E;Li(Y.alternate,Y);break;case Ac:Y.effectTag&=~Ac;break;case 1028:Y.effectTag&=~Ac;Li(Y.alternate,Y);break;case 4:Li(Y.alternate,\nY);break;case 8:l=Y,Hi(g,l,h),Ii(l)}Y=Y.nextEffect}}catch(Fb){if(null===Y)throw t(Error(330));xi(Y,Fb);Y=Y.nextEffect}while(null!==Y);v=ee;u=Yd();p=v.focusedElem;h=v.selectionRange;if(u!==p&&p&&p.ownerDocument&&Xd(p.ownerDocument.documentElement,p)){null!==h&&Zd(p)&&(u=h.start,v=h.end,void 0===v&&(v=u),\"selectionStart\"in p?(p.selectionStart=u,p.selectionEnd=Math.min(v,p.value.length)):(v=(u=p.ownerDocument||document)&&u.defaultView||window,v.getSelection&&(v=v.getSelection(),l=p.textContent.length,\ng=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!v.extend&&g>h&&(l=h,h=g,g=l),l=Wd(p,g),m=Wd(p,h),l&&m&&(1!==v.rangeCount||v.anchorNode!==l.node||v.anchorOffset!==l.offset||v.focusNode!==m.node||v.focusOffset!==m.offset)&&(u=u.createRange(),u.setStart(l.node,l.offset),v.removeAllRanges(),g>h?(v.addRange(u),v.extend(m.node,m.offset)):(u.setEnd(m.node,m.offset),v.addRange(u))))));u=[];for(v=p;v=v.parentNode;)1===v.nodeType&&u.push({element:v,left:v.scrollLeft,top:v.scrollTop});\"function\"===\ntypeof p.focus&&p.focus();for(p=0;p<u.length;p++)v=u[p],v.element.scrollLeft=v.left,v.element.scrollTop=v.top}ee=null;Dd=!!de;de=null;a.current=c;Y=e;do try{for(p=d;null!==Y;){var Bh=Y.effectTag;if(Bh&36){var cc=Y.alternate;u=Y;v=p;switch(u.tag){case 0:case 11:case 15:Ei(16,32,u);break;case 1:var ed=u.stateNode;if(u.effectTag&4)if(null===cc)ed.componentDidMount();else{var Zj=u.elementType===u.type?cc.memoizedProps:cg(u.type,cc.memoizedProps);ed.componentDidUpdate(Zj,cc.memoizedState,ed.__reactInternalSnapshotBeforeUpdate)}var Ch=\nu.updateQueue;null!==Ch&&Ag(u,Ch,ed,v);break;case 3:var Dh=u.updateQueue;if(null!==Dh){g=null;if(null!==u.child)switch(u.child.tag){case 5:g=u.child.stateNode;break;case 1:g=u.child.stateNode}Ag(u,Dh,g,v)}break;case 5:var pk=u.stateNode;null===cc&&u.effectTag&4&&(v=pk,fe(u.type,u.memoizedProps)&&v.focus());break;case 6:break;case 4:break;case 12:break;case 13:if(null===u.memoizedState){var zi=u.alternate;if(null!==zi){var Ai=zi.memoizedState;if(null!==Ai){var Bi=Ai.dehydrated;null!==Bi&&zc(Bi)}}}break;\ncase 19:case 17:case 20:case 21:break;default:throw t(Error(163));}}if(Bh&128){u=Y;var yd=u.ref;if(null!==yd){var Ci=u.stateNode;switch(u.tag){case 5:var yf=Ci;break;default:yf=Ci}\"function\"===typeof yd?yd(yf):yd.current=yf}}Y=Y.nextEffect}}catch(Fb){if(null===Y)throw t(Error(330));xi(Y,Fb);Y=Y.nextEffect}while(null!==Y);Y=null;Qf();T=f}else a.current=c;if(oj)oj=!1,pj=a,qj=b;else for(Y=e;null!==Y;)b=Y.nextEffect,Y.nextEffect=null,Y=b;b=a.firstPendingTime;0===b&&(Ui=null);1073741823===b?a===tj?sj++:\n(sj=0,tj=a):sj=0;\"function\"===typeof Yj&&Yj(c.stateNode,d);Z(a);if(Ri)throw Ri=!1,a=Si,Si=null,a;if((T&Yi)!==S)return null;bg();return null}function Xj(){for(;null!==Y;){var a=Y.effectTag;(a&256)!==D&&Di(Y.alternate,Y);(a&512)===D||oj||(oj=!0,Zf(97,function(){Ej();return null}));Y=Y.nextEffect}}function Ej(){if(90!==qj){var a=97<qj?97:qj;qj=90;return Yf(a,ak)}}\nfunction ak(){if(null===pj)return!1;var a=pj;pj=null;if((T&(Zi|$i))!==S)throw t(Error(331));var b=T;T|=$i;for(a=a.current.firstEffect;null!==a;){try{var c=a;if((c.effectTag&512)!==D)switch(c.tag){case 0:case 11:case 15:Ei(128,0,c),Ei(0,64,c)}}catch(d){if(null===a)throw t(Error(330));xi(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}T=b;bg();return!0}function bk(a,b,c){b=ti(c,b);b=Qi(a,b,1073741823);tg(a,b);a=wj(a,1073741823);null!==a&&Z(a)}\nfunction xi(a,b){if(3===a.tag)bk(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){bk(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Ui||!Ui.has(d))){a=ti(b,a);a=Ti(c,a,1073741823);tg(c,a);c=wj(c,1073741823);null!==c&&Z(c);break}}c=c.return}}\nfunction Sj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);U===a&&W===c?X===ej||X===dj&&1073741823===ij&&Vf()-Mi<nj?Fj(a,W):mj=!0:Bj(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,a.finishedExpirationTime===c&&(a.finishedExpirationTime=0,a.finishedWork=null),Z(a)))}function Oi(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=1;1===b&&(b=Fg(),b=Gg(b,a,null));a=wj(a,b);null!==a&&Z(a)}var Vj;\nVj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||K.current)mg=!0;else{if(d<c){mg=!1;switch(b.tag){case 3:hi(b);Xh();break;case 5:eh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:N(b.type)&&Bf(b);break;case 4:ch(b,b.stateNode.containerInfo);break;case 10:ig(b,b.memoizedProps.value);break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;if(0!==d&&d>=c)return ji(a,b,c);I(O,O.current&\n1,b);b=$h(a,b,c);return null!==b?b.sibling:null}I(O,O.current&1,b);break;case 19:d=b.childExpirationTime>=c;if((a.effectTag&64)!==D){if(d)return li(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);I(O,O.current,b);if(!d)return null}return $h(a,b,c)}mg=!1}}else mg=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=E);a=b.pendingProps;e=vf(b,J.current);lg(b,c);e=wh(null,b,d,a,e,c);b.effectTag|=1;if(\"object\"===\ntypeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;Ah();if(N(d)){var f=!0;Bf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Eg(b,d,g,a);e.updater=Ig;b.stateNode=e;e._reactInternalFiber=b;Mg(b,d,a,c);b=gi(null,b,d,!0,f,c)}else b.tag=0,R(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=E);a=b.pendingProps;Ua(e);if(1!==e._status)throw e._result;\ne=e._result;b.type=e;f=b.tag=ck(e);a=cg(e,a);switch(f){case 0:b=di(null,b,e,a,c);break;case 1:b=fi(null,b,e,a,c);break;case 11:b=Zh(null,b,e,a,c);break;case 14:b=ai(null,b,e,cg(e.type,a),d,c);break;default:throw t(Error(306),e,\"\");}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:cg(d,e),di(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:cg(d,e),fi(a,b,d,e,c);case 3:hi(b);d=b.updateQueue;if(null===d)throw t(Error(282));e=b.memoizedState;e=null!==e?e.element:\nnull;xg(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)Xh(),b=$h(a,b,c);else{if(e=b.stateNode.hydrate)Ph=je(b.stateNode.containerInfo.firstChild),Oh=b,e=Qh=!0;if(e)for(c=Xg(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&~E|Ac,c=c.sibling;else R(a,b,d,c),Xh();b=b.child}return b;case 5:return eh(b),null===a&&Uh(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,ge(d,e)?g=null:null!==f&&ge(d,f)&&(b.effectTag|=16),ei(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=\nb.childExpirationTime=1,b=null):(R(a,b,g,c),b=b.child),b;case 6:return null===a&&Uh(b),null;case 13:return ji(a,b,c);case 4:return ch(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Wg(b,null,d,c):R(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:cg(d,e),Zh(a,b,d,e,c);case 7:return R(a,b,b.pendingProps,c),b.child;case 8:return R(a,b,b.pendingProps.children,c),b.child;case 12:return R(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;\ne=b.pendingProps;g=b.memoizedProps;f=e.value;ig(b,f);if(null!==g){var h=g.value;f=ff(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!K.current){b=$h(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==k){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=rg(c,null),l.tag=2,tg(h,l));h.expirationTime<c&&(h.expirationTime=\nc);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);kg(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=g}}R(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,lg(b,c),e=ng(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,R(a,b,d,c),b.child;\ncase 14:return e=b.type,f=cg(e,b.pendingProps),f=cg(e.type,f),ai(a,b,e,f,d,c);case 15:return ci(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:cg(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=E),b.tag=1,N(d)?(a=!0,Bf(b)):a=!1,lg(b,c),Kg(b,d,e,c),Mg(b,d,e,c),gi(null,b,d,!0,a,c);case 19:return li(a,b,c)}throw t(Error(156),b.tag);};var Yj=null,Gi=null;\nfunction dk(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Yj=function(a){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(e){}};Gi=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}\nfunction ek(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=D;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Sh(a,b,c,d){return new ek(a,b,c,d)}\nfunction bi(a){a=a.prototype;return!(!a||!a.isReactComponent)}function ck(a){if(\"function\"===typeof a)return bi(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Na)return 11;if(a===Qa)return 14}return 2}\nfunction Rg(a,b){var c=a.alternate;null===c?(c=Sh(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=D,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,\nfirstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Tg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)bi(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case Ha:return Vg(c.children,e,f,b);case Ma:g=8;e|=7;break;case Ia:g=8;e|=1;break;case Ja:return a=Sh(12,c,b,e|8),a.elementType=Ja,a.type=Ja,a.expirationTime=f,a;case Oa:return a=Sh(13,c,b,e),a.type=Oa,a.elementType=Oa,a.expirationTime=f,a;case Pa:return a=Sh(19,c,b,e),a.elementType=Pa,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ka:g=\n10;break a;case La:g=9;break a;case Na:g=11;break a;case Qa:g=14;break a;case Ra:g=16;d=null;break a}throw t(Error(130),null==a?a:typeof a,\"\");}b=Sh(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Vg(a,b,c,d){a=Sh(7,a,d,b);a.expirationTime=c;return a}function Sg(a,b,c){a=Sh(6,a,null,b);a.expirationTime=c;return a}\nfunction Ug(a,b,c){b=Sh(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction fk(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=this.firstBatch=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}\nfunction Bj(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function yj(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}\nfunction zj(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Dj(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}\nfunction gk(a,b,c,d,e,f){var g=b.current;a:if(c){c=c._reactInternalFiber;b:{if(Bc(c)!==c||1!==c.tag)throw t(Error(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(N(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw t(Error(171));}if(1===c.tag){var k=c.type;if(N(k)){c=Af(c,k,h);break a}}c=h}else c=tf;null===b.context?b.context=c:b.pendingContext=c;b=f;e=rg(d,e);e.payload={element:a};b=void 0===b?null:b;null!==b&&\n(e.callback=b);tg(g,e);Hg(g,d);return d}function hk(a,b,c,d){var e=b.current,f=Fg(),g=Cg.suspense;e=Gg(f,e,g);return gk(a,b,c,e,g,d)}function ik(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function jk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:Ga,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nYa=function(a,b,c){switch(b){case \"input\":Db(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=re(d);if(!e)throw t(Error(90));zb(d);Db(d,e)}}}break;case \"textarea\":Mb(a,c);break;case \"select\":b=c.value,null!=b&&Jb(a,!!c.multiple,b,!1)}};\nfunction kk(a){var b=1073741821-25*(((1073741821-Fg()+500)/25|0)+1);b<=vj&&--b;this._expirationTime=vj=b;this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0}kk.prototype.render=function(a){if(!this._defer)throw t(Error(250));this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new lk;gk(a,b,null,c,null,d._onCommit);return d};\nkk.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nkk.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;if(!this._defer||null===b)throw t(Error(251));if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;if(null===d)throw t(Error(251));d._next=e._next;this._next=b;a.firstBatch=this}this._defer=!1;b=c;if((T&(Zi|$i))!==S)throw t(Error(253));Dj(a,b);Z(a);bg();b=this._next;this._next=null;\nb=a.firstBatch=b;null!==b&&b._hasChildren&&b.render(b._children)}else this._next=null,this._defer=!1};kk.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++)(0,a[b])()}};function lk(){this._callbacks=null;this._didCommit=!1;this._onCommit=this._onCommit.bind(this)}lk.prototype.then=function(a){if(this._didCommit)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nlk.prototype._onCommit=function(){if(!this._didCommit){this._didCommit=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++){var c=a[b];if(\"function\"!==typeof c)throw t(Error(191),c);c()}}};function mk(a,b,c){c=null!=c&&!0===c.hydrate;var d=new fk(a,b,c),e=Sh(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;a[oe]=d.current;c&&0!==b&&nc(9===a.nodeType?a:a.ownerDocument);return d}function nk(a,b,c){this._internalRoot=mk(a,b,c)}function ok(a,b){this._internalRoot=mk(a,2,b)}\nok.prototype.render=nk.prototype.render=function(a,b){var c=this._internalRoot,d=new lk;b=void 0===b?null:b;null!==b&&d.then(b);hk(a,c,null,d._onCommit);return d};ok.prototype.unmount=nk.prototype.unmount=function(a){var b=this._internalRoot,c=new lk;a=void 0===a?null:a;null!==a&&c.then(a);hk(null,b,null,c._onCommit);return c};\nok.prototype.createBatch=function(){var a=new kk(this),b=a._expirationTime,c=this._internalRoot,d=c.firstBatch;if(null===d)c.firstBatch=a,a._next=null;else{for(c=null;null!==d&&d._expirationTime>=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a)}return a};function qk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}db=Pj;eb=Qj;fb=Nj;gb=function(a,b){var c=T;T|=2;try{return a(b)}finally{T=c,T===S&&bg()}};\nfunction rk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new nk(a,0,b?{hydrate:!0}:void 0)}\nfunction sk(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=ik(g);h.call(a)}}hk(b,g,a,e)}else{f=c._reactRootContainer=rk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=ik(g);k.call(a)}}Rj(function(){hk(b,g,a,e)})}return ik(g)}function tk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!qk(b))throw t(Error(200));return jk(a,b,null,c)}\nvar wk={createPortal:tk,findDOMNode:function(a){if(null==a)a=null;else if(1!==a.nodeType){var b=a._reactInternalFiber;if(void 0===b){if(\"function\"===typeof a.render)throw t(Error(188));throw t(Error(268),Object.keys(a));}a=Ec(b);a=null===a?null:a.stateNode}return a},hydrate:function(a,b,c){if(!qk(b))throw t(Error(200));return sk(null,a,b,!0,c)},render:function(a,b,c){if(!qk(b))throw t(Error(200));return sk(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){if(!qk(c))throw t(Error(200));\nif(null==a||void 0===a._reactInternalFiber)throw t(Error(38));return sk(a,b,c,!1,d)},unmountComponentAtNode:function(a){if(!qk(a))throw t(Error(40));return a._reactRootContainer?(Rj(function(){sk(null,null,a,!1,function(){a._reactRootContainer=null})}),!0):!1},unstable_createPortal:function(){return tk.apply(void 0,arguments)},unstable_batchedUpdates:Pj,unstable_interactiveUpdates:function(a,b,c,d){Nj();return Qj(a,b,c,d)},unstable_discreteUpdates:Qj,unstable_flushDiscreteUpdates:Nj,flushSync:function(a,\nb){if((T&(Zi|$i))!==S)throw t(Error(187));var c=T;T|=1;try{return Yf(99,a.bind(null,b))}finally{T=c,bg()}},unstable_createRoot:uk,unstable_createSyncRoot:vk,unstable_flushControlled:function(a){var b=T;T|=1;try{Yf(99,a)}finally{T=b,T===S&&bg()}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[pe,qe,re,Ba.injectEventPluginsByName,fa,Lc,function(a){xa(a,Kc)},bb,cb,Hd,Aa,Ej,{current:!1}]}};function uk(a,b){if(!qk(a))throw t(Error(299),\"unstable_createRoot\");return new ok(a,b)}\nfunction vk(a,b){if(!qk(a))throw t(Error(299),\"unstable_createRoot\");return new nk(a,1,b)}\n(function(a){var b=a.findFiberByHostInstance;return dk(n({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Da.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Ec(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Cd,bundleType:0,version:\"16.10.2\",\nrendererPackageName:\"react-dom\"});var xk={default:wk},yk=xk&&wk||xk;module.exports=yk.default||yk;\n\n},{\"react\":\"W4rj\",\"object-assign\":\"x5u5\",\"scheduler\":\"KTa4\"}],\"UiuB\":[function(require,module,exports) {\n'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function') {\n    return;\n  }\n\n  if (\"production\" !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (\"production\" === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n},{\"./cjs/react-dom.production.min.js\":\"t7dJ\"}],\"qyfj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SandDanceReact = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _util = require(\"./util\");\n\nvar _reactDom = require(\"react-dom\");\n\nvar _sanddance = require(\"@msrvida/sanddance\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction addNullable(insight, signalValues) {\n  const withNulls = Object.assign(Object.assign({\n    view: null,\n    filter: null\n  }, insight), {\n    signalValues\n  });\n  return withNulls;\n}\n\nclass SandDanceReact extends React.Component {\n  areLayoutPropsSame() {\n    const currentInsight = this.viewer.getInsight();\n    const a = addNullable(currentInsight, Object.assign(Object.assign({}, this.viewer.insight.signalValues), currentInsight.signalValues));\n    const b = addNullable(this.props.insight, Object.assign(Object.assign({}, a.signalValues), this.props.insight.signalValues));\n    const compare = (0, _util.deepCompare)(a, b);\n    return compare && this.props.data === this.lastData;\n  }\n\n  needsLayout() {\n    return this.props.insight && this.props.data && !this.areLayoutPropsSame();\n  }\n\n  layout() {\n    this.lastData = this.props.data;\n    this.viewer.render(this.props.insight, this.props.data, this.props.renderOptions).then(renderResult => {\n      //TODO: show errors if any\n      //console.log('viewer render');\n      this.props.onView && this.props.onView(renderResult);\n    }).catch(() => {//console.log('viewer error');\n    });\n  }\n\n  view() {\n    const needsLayout = this.needsLayout();\n\n    if (needsLayout) {\n      this.layout();\n    }\n  }\n\n  componentDidMount() {\n    const element = (0, _reactDom.findDOMNode)(this.viewerDiv);\n    this.viewer = new _sanddance.Viewer(element, this.props.viewerOptions);\n\n    if (this.props.onMount) {\n      if (this.props.onMount(this.viewer.presenter.getElement(_sanddance.VegaDeckGl.PresenterElement.gl))) {\n        this.view();\n      }\n    } else {\n      this.view();\n    }\n  }\n\n  componentDidUpdate() {\n    this.viewer.options = _sanddance.VegaDeckGl.util.deepMerge(this.viewer.options, this.props.viewerOptions);\n    this.view();\n  }\n\n  componentWillUnmount() {\n    this.viewer.finalize();\n  }\n\n  render() {\n    return React.createElement(\"div\", {\n      className: \"sanddance-ReactViewer\",\n      ref: div => this.viewerDiv = div\n    });\n  }\n\n}\n\nexports.SandDanceReact = SandDanceReact;\n},{\"react\":\"W4rj\",\"./util\":\"HI4Z\",\"react-dom\":\"UiuB\",\"@msrvida/sanddance\":\"rZaE\"}],\"TN0H\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.version = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst version = '1.1.7';\nexports.version = version;\n},{}],\"MjKu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"SandDanceReact\", {\n  enumerable: true,\n  get: function () {\n    return _viewer.SandDanceReact;\n  }\n});\nObject.defineProperty(exports, \"version\", {\n  enumerable: true,\n  get: function () {\n    return _version.version;\n  }\n});\nexports.util = exports.SandDance = void 0;\n\nvar SandDance = _interopRequireWildcard(require(\"@msrvida/sanddance\"));\n\nexports.SandDance = SandDance;\n\nvar util = _interopRequireWildcard(require(\"./util\"));\n\nexports.util = util;\n\nvar _viewer = require(\"./viewer\");\n\nvar _version = require(\"./version\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"@msrvida/sanddance\":\"rZaE\",\"./util\":\"HI4Z\",\"./viewer\":\"qyfj\",\"./version\":\"TN0H\"}],\"Vlbn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.use = use;\nexports.base = void 0;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar base = {\n  fabric: null\n};\n/**\n * Specify the dependency libraries to use for rendering.\n * @param fabric Office UI Fabric React library.\n */\n\nexports.base = base;\n\nfunction use(fabric, vega, deck, layers, luma) {\n  _sanddanceReact.SandDance.VegaDeckGl.use(vega, deck, layers, luma);\n\n  base.fabric = fabric;\n}\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"Dryx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getCanvas = getCanvas;\nexports.removeTabIndex = removeTabIndex;\nexports.capabilities = void 0;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar PresenterElement = _sanddanceReact.SandDance.VegaDeckGl.PresenterElement;\n\nfunction getCanvas(viewer) {\n  var tags = viewer.presenter.getElement(PresenterElement.gl).getElementsByTagName('canvas');\n\n  if (tags) {\n    return tags[0];\n  }\n}\n\nfunction removeTabIndex(viewer) {\n  var canvas = getCanvas(viewer);\n\n  if (canvas) {\n    canvas.tabIndex = -1;\n  }\n}\n\nvar capabilities = {\n  webgl: !!document.createElement('canvas').getContext('webgl'),\n  webgl2: !!document.createElement('canvas').getContext('webgl2')\n};\nexports.capabilities = capabilities;\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"CgE3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getColorSettingsFromThemePalette = getColorSettingsFromThemePalette;\nexports.themePalettes = void 0;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar themePalettes = {};\nexports.themePalettes = themePalettes;\nthemePalettes[''] = {\n  themePrimary: '#0078d4',\n  themeLighterAlt: '#eff6fc',\n  themeLighter: '#deecf9',\n  themeLight: '#c7e0f4',\n  themeTertiary: '#71afe5',\n  themeSecondary: '#2b88d8',\n  themeDarkAlt: '#106ebe',\n  themeDark: '#005a9e',\n  themeDarker: '#004578',\n  neutralLighterAlt: '#f8f8f8',\n  neutralLighter: '#f4f4f4',\n  neutralLight: '#eaeaea',\n  neutralQuaternaryAlt: '#dadada',\n  neutralQuaternary: '#d0d0d0',\n  neutralTertiaryAlt: '#c8c8c8',\n  neutralTertiary: '#c2c2c2',\n  neutralSecondary: '#858585',\n  neutralPrimaryAlt: '#4b4b4b',\n  neutralPrimary: '#333333',\n  neutralDark: '#272727',\n  black: '#1d1d1d',\n  white: '#ffffff'\n};\nthemePalettes['dark-theme'] = {\n  themePrimary: '#00b4f0',\n  themeLighterAlt: '#00070a',\n  themeLighter: '#001d26',\n  themeLight: '#003648',\n  themeTertiary: '#006c90',\n  themeSecondary: '#009ed3',\n  themeDarkAlt: '#18bbf1',\n  themeDark: '#3ac5f3',\n  themeDarker: '#6cd4f6',\n  neutralLighterAlt: '#0b0b0b',\n  neutralLighter: '#151515',\n  neutralLight: '#252525',\n  neutralQuaternaryAlt: '#2f2f2f',\n  neutralQuaternary: '#373737',\n  neutralTertiaryAlt: '#595959',\n  neutralTertiary: '#929292',\n  neutralSecondary: '#a7a7a7',\n  neutralPrimaryAlt: '#b4b4b4',\n  neutralPrimary: '#cccccc',\n  neutralDark: '#d8d8d8',\n  black: '#f5f5f5',\n  white: '#000000'\n};\n\nfunction getColorSettingsFromThemePalette(themePalette) {\n  var colorFromString = _sanddanceReact.SandDance.VegaDeckGl.util.colorFromString;\n  return {\n    axisLine: colorFromString(themePalette.black),\n    axisText: colorFromString(themePalette.black),\n    hoveredCube: colorFromString(themePalette.black),\n    clickableText: colorFromString(themePalette.themeDark),\n    clickableTextHighlight: colorFromString(themePalette.themeSecondary)\n  };\n}\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"Xy56\":[function(require,module,exports) {\n/** @license React v16.10.2\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';\n\nvar h = require(\"object-assign\"),\n    n = \"function\" === typeof Symbol && Symbol.for,\n    p = n ? Symbol.for(\"react.element\") : 60103,\n    q = n ? Symbol.for(\"react.portal\") : 60106,\n    r = n ? Symbol.for(\"react.fragment\") : 60107,\n    t = n ? Symbol.for(\"react.strict_mode\") : 60108,\n    u = n ? Symbol.for(\"react.profiler\") : 60114,\n    v = n ? Symbol.for(\"react.provider\") : 60109,\n    w = n ? Symbol.for(\"react.context\") : 60110,\n    x = n ? Symbol.for(\"react.forward_ref\") : 60112,\n    y = n ? Symbol.for(\"react.suspense\") : 60113,\n    aa = n ? Symbol.for(\"react.suspense_list\") : 60120,\n    ba = n ? Symbol.for(\"react.memo\") : 60115,\n    ca = n ? Symbol.for(\"react.lazy\") : 60116;\n\nn && Symbol.for(\"react.fundamental\");\nn && Symbol.for(\"react.responder\");\nn && Symbol.for(\"react.scope\");\nvar z = \"function\" === typeof Symbol && Symbol.iterator;\n\nfunction A(a) {\n  for (var b = a.message, c = \"https://reactjs.org/docs/error-decoder.html?invariant=\" + b, d = 1; d < arguments.length; d++) c += \"&args[]=\" + encodeURIComponent(arguments[d]);\n\n  a.message = \"Minified React error #\" + b + \"; visit \" + c + \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \";\n  return a;\n}\n\nvar B = {\n  isMounted: function () {\n    return !1;\n  },\n  enqueueForceUpdate: function () {},\n  enqueueReplaceState: function () {},\n  enqueueSetState: function () {}\n},\n    C = {};\n\nfunction D(a, b, c) {\n  this.props = a;\n  this.context = b;\n  this.refs = C;\n  this.updater = c || B;\n}\n\nD.prototype.isReactComponent = {};\n\nD.prototype.setState = function (a, b) {\n  if (\"object\" !== typeof a && \"function\" !== typeof a && null != a) throw A(Error(85));\n  this.updater.enqueueSetState(this, a, b, \"setState\");\n};\n\nD.prototype.forceUpdate = function (a) {\n  this.updater.enqueueForceUpdate(this, a, \"forceUpdate\");\n};\n\nfunction E() {}\n\nE.prototype = D.prototype;\n\nfunction F(a, b, c) {\n  this.props = a;\n  this.context = b;\n  this.refs = C;\n  this.updater = c || B;\n}\n\nvar G = F.prototype = new E();\nG.constructor = F;\nh(G, D.prototype);\nG.isPureReactComponent = !0;\nvar H = {\n  current: null\n},\n    I = {\n  suspense: null\n},\n    J = {\n  current: null\n},\n    K = Object.prototype.hasOwnProperty,\n    L = {\n  key: !0,\n  ref: !0,\n  __self: !0,\n  __source: !0\n};\n\nfunction M(a, b, c) {\n  var d,\n      e = {},\n      g = null,\n      l = null;\n  if (null != b) for (d in void 0 !== b.ref && (l = b.ref), void 0 !== b.key && (g = \"\" + b.key), b) K.call(b, d) && !L.hasOwnProperty(d) && (e[d] = b[d]);\n  var f = arguments.length - 2;\n  if (1 === f) e.children = c;else if (1 < f) {\n    for (var k = Array(f), m = 0; m < f; m++) k[m] = arguments[m + 2];\n\n    e.children = k;\n  }\n  if (a && a.defaultProps) for (d in f = a.defaultProps, f) void 0 === e[d] && (e[d] = f[d]);\n  return {\n    $$typeof: p,\n    type: a,\n    key: g,\n    ref: l,\n    props: e,\n    _owner: J.current\n  };\n}\n\nfunction da(a, b) {\n  return {\n    $$typeof: p,\n    type: a.type,\n    key: b,\n    ref: a.ref,\n    props: a.props,\n    _owner: a._owner\n  };\n}\n\nfunction N(a) {\n  return \"object\" === typeof a && null !== a && a.$$typeof === p;\n}\n\nfunction escape(a) {\n  var b = {\n    \"=\": \"=0\",\n    \":\": \"=2\"\n  };\n  return \"$\" + (\"\" + a).replace(/[=:]/g, function (a) {\n    return b[a];\n  });\n}\n\nvar O = /\\/+/g,\n    P = [];\n\nfunction Q(a, b, c, d) {\n  if (P.length) {\n    var e = P.pop();\n    e.result = a;\n    e.keyPrefix = b;\n    e.func = c;\n    e.context = d;\n    e.count = 0;\n    return e;\n  }\n\n  return {\n    result: a,\n    keyPrefix: b,\n    func: c,\n    context: d,\n    count: 0\n  };\n}\n\nfunction R(a) {\n  a.result = null;\n  a.keyPrefix = null;\n  a.func = null;\n  a.context = null;\n  a.count = 0;\n  10 > P.length && P.push(a);\n}\n\nfunction S(a, b, c, d) {\n  var e = typeof a;\n  if (\"undefined\" === e || \"boolean\" === e) a = null;\n  var g = !1;\n  if (null === a) g = !0;else switch (e) {\n    case \"string\":\n    case \"number\":\n      g = !0;\n      break;\n\n    case \"object\":\n      switch (a.$$typeof) {\n        case p:\n        case q:\n          g = !0;\n      }\n\n  }\n  if (g) return c(d, a, \"\" === b ? \".\" + T(a, 0) : b), 1;\n  g = 0;\n  b = \"\" === b ? \".\" : b + \":\";\n  if (Array.isArray(a)) for (var l = 0; l < a.length; l++) {\n    e = a[l];\n    var f = b + T(e, l);\n    g += S(e, f, c, d);\n  } else if (null === a || \"object\" !== typeof a ? f = null : (f = z && a[z] || a[\"@@iterator\"], f = \"function\" === typeof f ? f : null), \"function\" === typeof f) for (a = f.call(a), l = 0; !(e = a.next()).done;) e = e.value, f = b + T(e, l++), g += S(e, f, c, d);else if (\"object\" === e) throw c = \"\" + a, A(Error(31), \"[object Object]\" === c ? \"object with keys {\" + Object.keys(a).join(\", \") + \"}\" : c, \"\");\n  return g;\n}\n\nfunction U(a, b, c) {\n  return null == a ? 0 : S(a, \"\", b, c);\n}\n\nfunction T(a, b) {\n  return \"object\" === typeof a && null !== a && null != a.key ? escape(a.key) : b.toString(36);\n}\n\nfunction ea(a, b) {\n  a.func.call(a.context, b, a.count++);\n}\n\nfunction fa(a, b, c) {\n  var d = a.result,\n      e = a.keyPrefix;\n  a = a.func.call(a.context, b, a.count++);\n  Array.isArray(a) ? V(a, d, c, function (a) {\n    return a;\n  }) : null != a && (N(a) && (a = da(a, e + (!a.key || b && b.key === a.key ? \"\" : (\"\" + a.key).replace(O, \"$&/\") + \"/\") + c)), d.push(a));\n}\n\nfunction V(a, b, c, d, e) {\n  var g = \"\";\n  null != c && (g = (\"\" + c).replace(O, \"$&/\") + \"/\");\n  b = Q(b, g, d, e);\n  U(a, fa, b);\n  R(b);\n}\n\nfunction W() {\n  var a = H.current;\n  if (null === a) throw A(Error(321));\n  return a;\n}\n\nvar X = {\n  Children: {\n    map: function (a, b, c) {\n      if (null == a) return a;\n      var d = [];\n      V(a, d, null, b, c);\n      return d;\n    },\n    forEach: function (a, b, c) {\n      if (null == a) return a;\n      b = Q(null, null, b, c);\n      U(a, ea, b);\n      R(b);\n    },\n    count: function (a) {\n      return U(a, function () {\n        return null;\n      }, null);\n    },\n    toArray: function (a) {\n      var b = [];\n      V(a, b, null, function (a) {\n        return a;\n      });\n      return b;\n    },\n    only: function (a) {\n      if (!N(a)) throw A(Error(143));\n      return a;\n    }\n  },\n  createRef: function () {\n    return {\n      current: null\n    };\n  },\n  Component: D,\n  PureComponent: F,\n  createContext: function (a, b) {\n    void 0 === b && (b = null);\n    a = {\n      $$typeof: w,\n      _calculateChangedBits: b,\n      _currentValue: a,\n      _currentValue2: a,\n      _threadCount: 0,\n      Provider: null,\n      Consumer: null\n    };\n    a.Provider = {\n      $$typeof: v,\n      _context: a\n    };\n    return a.Consumer = a;\n  },\n  forwardRef: function (a) {\n    return {\n      $$typeof: x,\n      render: a\n    };\n  },\n  lazy: function (a) {\n    return {\n      $$typeof: ca,\n      _ctor: a,\n      _status: -1,\n      _result: null\n    };\n  },\n  memo: function (a, b) {\n    return {\n      $$typeof: ba,\n      type: a,\n      compare: void 0 === b ? null : b\n    };\n  },\n  useCallback: function (a, b) {\n    return W().useCallback(a, b);\n  },\n  useContext: function (a, b) {\n    return W().useContext(a, b);\n  },\n  useEffect: function (a, b) {\n    return W().useEffect(a, b);\n  },\n  useImperativeHandle: function (a, b, c) {\n    return W().useImperativeHandle(a, b, c);\n  },\n  useDebugValue: function () {},\n  useLayoutEffect: function (a, b) {\n    return W().useLayoutEffect(a, b);\n  },\n  useMemo: function (a, b) {\n    return W().useMemo(a, b);\n  },\n  useReducer: function (a, b, c) {\n    return W().useReducer(a, b, c);\n  },\n  useRef: function (a) {\n    return W().useRef(a);\n  },\n  useState: function (a) {\n    return W().useState(a);\n  },\n  Fragment: r,\n  Profiler: u,\n  StrictMode: t,\n  Suspense: y,\n  unstable_SuspenseList: aa,\n  createElement: M,\n  cloneElement: function (a, b, c) {\n    if (null === a || void 0 === a) throw A(Error(267), a);\n    var d = h({}, a.props),\n        e = a.key,\n        g = a.ref,\n        l = a._owner;\n\n    if (null != b) {\n      void 0 !== b.ref && (g = b.ref, l = J.current);\n      void 0 !== b.key && (e = \"\" + b.key);\n      if (a.type && a.type.defaultProps) var f = a.type.defaultProps;\n\n      for (k in b) K.call(b, k) && !L.hasOwnProperty(k) && (d[k] = void 0 === b[k] && void 0 !== f ? f[k] : b[k]);\n    }\n\n    var k = arguments.length - 2;\n    if (1 === k) d.children = c;else if (1 < k) {\n      f = Array(k);\n\n      for (var m = 0; m < k; m++) f[m] = arguments[m + 2];\n\n      d.children = f;\n    }\n    return {\n      $$typeof: p,\n      type: a.type,\n      key: e,\n      ref: g,\n      props: d,\n      _owner: l\n    };\n  },\n  createFactory: function (a) {\n    var b = M.bind(null, a);\n    b.type = a;\n    return b;\n  },\n  isValidElement: N,\n  version: \"16.10.2\",\n  unstable_withSuspenseConfig: function (a, b) {\n    var c = I.suspense;\n    I.suspense = void 0 === b ? null : b;\n\n    try {\n      a();\n    } finally {\n      I.suspense = c;\n    }\n  },\n  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n    ReactCurrentDispatcher: H,\n    ReactCurrentBatchConfig: I,\n    ReactCurrentOwner: J,\n    IsSomeRendererActing: {\n      current: !1\n    },\n    assign: h\n  }\n},\n    Y = {\n  default: X\n},\n    Z = Y && X || Y;\nmodule.exports = Z.default || Z;\n},{\"object-assign\":\"x5u5\"}],\"ccIB\":[function(require,module,exports) {\n'use strict';\n\nif (\"production\" === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n},{\"./cjs/react.production.min.js\":\"Xy56\"}],\"dH6z\":[function(require,module,exports) {\n'use strict';\n\nif (\"production\" === 'production') {\n  module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n},{\"./cjs/scheduler.production.min.js\":\"W2Ku\"}],\"MtQn\":[function(require,module,exports) {\n/** @license React v16.10.2\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),r=require(\"scheduler\");function t(a){for(var b=a.message,c=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+b,d=1;d<arguments.length;d++)c+=\"&args[]=\"+encodeURIComponent(arguments[d]);a.message=\"Minified React error #\"+b+\"; visit \"+c+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \";return a}if(!aa)throw t(Error(227));var ba=null,ca={};\nfunction da(){if(ba)for(var a in ca){var b=ca[a],c=ba.indexOf(a);if(!(-1<c))throw t(Error(96),a);if(!ea[c]){if(!b.extractEvents)throw t(Error(97),a);ea[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(fa.hasOwnProperty(h))throw t(Error(99),h);fa[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ha(k[e],g,h);e=!0}else f.registrationName?(ha(f.registrationName,g,h),e=!0):e=!1;if(!e)throw t(Error(98),d,a);}}}}\nfunction ha(a,b,c){if(ia[a])throw t(Error(100),a);ia[a]=b;ja[a]=b.eventTypes[c].dependencies}var ea=[],fa={},ia={},ja={};function ka(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var la=!1,ma=null,na=!1,oa=null,pa={onError:function(a){la=!0;ma=a}};function qa(a,b,c,d,e,f,g,h,k){la=!1;ma=null;ka.apply(pa,arguments)}\nfunction ra(a,b,c,d,e,f,g,h,k){qa.apply(this,arguments);if(la){if(la){var l=ma;la=!1;ma=null}else throw t(Error(198));na||(na=!0,oa=l)}}var sa=null,ta=null,ua=null;function va(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=ua(c);ra(d,b,void 0,a);a.currentTarget=null}function wa(a,b){if(null==b)throw t(Error(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}\nfunction xa(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var ya=null;function za(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)va(a,b[d],c[d]);else b&&va(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function Aa(a){null!==a&&(ya=wa(ya,a));a=ya;ya=null;if(a){xa(a,za);if(ya)throw t(Error(95));if(na)throw a=oa,na=!1,oa=null,a;}}\nvar Ba={injectEventPluginOrder:function(a){if(ba)throw t(Error(101));ba=Array.prototype.slice.call(a);da()},injectEventPluginsByName:function(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!ca.hasOwnProperty(c)||ca[c]!==d){if(ca[c])throw t(Error(102),c);ca[c]=d;b=!0}}b&&da()}};\nfunction Ca(a,b){var c=a.stateNode;if(!c)return null;var d=sa(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==typeof c)throw t(Error(231),b,typeof c);\nreturn c}var Da=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Da.hasOwnProperty(\"ReactCurrentDispatcher\")||(Da.ReactCurrentDispatcher={current:null});Da.hasOwnProperty(\"ReactCurrentBatchConfig\")||(Da.ReactCurrentBatchConfig={suspense:null});\nvar Ea=/^(.*)[\\\\\\/]/,x=\"function\"===typeof Symbol&&Symbol.for,Fa=x?Symbol.for(\"react.element\"):60103,Ga=x?Symbol.for(\"react.portal\"):60106,Ha=x?Symbol.for(\"react.fragment\"):60107,Ia=x?Symbol.for(\"react.strict_mode\"):60108,Ja=x?Symbol.for(\"react.profiler\"):60114,Ka=x?Symbol.for(\"react.provider\"):60109,La=x?Symbol.for(\"react.context\"):60110,Ma=x?Symbol.for(\"react.concurrent_mode\"):60111,Na=x?Symbol.for(\"react.forward_ref\"):60112,Oa=x?Symbol.for(\"react.suspense\"):60113,Pa=x?Symbol.for(\"react.suspense_list\"):\n60120,Qa=x?Symbol.for(\"react.memo\"):60115,Ra=x?Symbol.for(\"react.lazy\"):60116;x&&Symbol.for(\"react.fundamental\");x&&Symbol.for(\"react.responder\");x&&Symbol.for(\"react.scope\");var Sa=\"function\"===typeof Symbol&&Symbol.iterator;function Ta(a){if(null===a||\"object\"!==typeof a)return null;a=Sa&&a[Sa]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nfunction Ua(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}\nfunction Va(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case Ha:return\"Fragment\";case Ga:return\"Portal\";case Ja:return\"Profiler\";case Ia:return\"StrictMode\";case Oa:return\"Suspense\";case Pa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case La:return\"Context.Consumer\";case Ka:return\"Context.Provider\";case Na:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\n\"ForwardRef\");case Qa:return Va(a.type);case Ra:if(a=1===a._status?a._result:null)return Va(a)}return null}function Wa(a){var b=\"\";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c=\"\";break a;default:var d=a._debugOwner,e=a._debugSource,f=Va(a.type);c=null;d&&(c=Va(d.type));d=f;f=\"\";e?f=\" (at \"+e.fileName.replace(Ea,\"\")+\":\"+e.lineNumber+\")\":c&&(f=\" (created by \"+c+\")\");c=\"\\n    in \"+(d||\"Unknown\")+f}b+=c;a=a.return}while(a);return b}\nvar Xa=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),Ya=null,Za=null,$a=null;function ab(a){if(a=ta(a)){if(\"function\"!==typeof Ya)throw t(Error(280));var b=sa(a.stateNode);Ya(a.stateNode,a.type,b)}}function bb(a){Za?$a?$a.push(a):$a=[a]:Za=a}function cb(){if(Za){var a=Za,b=$a;$a=Za=null;ab(a);if(b)for(a=0;a<b.length;a++)ab(b[a])}}function db(a,b){return a(b)}function eb(a,b,c,d){return a(b,c,d)}function fb(){}\nvar gb=db,hb=!1,ib=!1;function jb(){if(null!==Za||null!==$a)fb(),cb()}new Map;new Map;new Map;var kb=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,lb=Object.prototype.hasOwnProperty,mb={},nb={};\nfunction ob(a){if(lb.call(nb,a))return!0;if(lb.call(mb,a))return!1;if(kb.test(a))return nb[a]=!0;mb[a]=!0;return!1}function pb(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction qb(a,b,c,d){if(null===b||\"undefined\"===typeof b||pb(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function B(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}var C={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){C[a]=new B(a,0,!1,a,null,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];C[b]=new B(b,1,!1,a[1],null,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){C[a]=new B(a,2,!1,a.toLowerCase(),null,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){C[a]=new B(a,2,!1,a,null,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){C[a]=new B(a,3,!1,a.toLowerCase(),null,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){C[a]=new B(a,3,!0,a,null,!1)});[\"capture\",\"download\"].forEach(function(a){C[a]=new B(a,4,!1,a,null,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){C[a]=new B(a,6,!1,a,null,!1)});[\"rowSpan\",\"start\"].forEach(function(a){C[a]=new B(a,5,!1,a.toLowerCase(),null,!1)});var rb=/[\\-:]([a-z])/g;function sb(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(rb,\nsb);C[b]=new B(b,1,!1,a,null,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(rb,sb);C[b]=new B(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(rb,sb);C[b]=new B(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){C[a]=new B(a,1,!1,a.toLowerCase(),null,!1)});\nC.xlinkHref=new B(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){C[a]=new B(a,1,!1,a.toLowerCase(),null,!0)});function tb(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}\nfunction ub(a,b,c,d){var e=C.hasOwnProperty(b)?C[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(qb(b,c,e,d)&&(c=null),d||null===e?ob(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nfunction vb(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction xb(a){var b=vb(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function yb(a){a._valueTracker||(a._valueTracker=xb(a))}function zb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=vb(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Ab(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\nfunction Bb(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=tb(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Cb(a,b){b=b.checked;null!=b&&ub(a,\"checked\",b,!1)}\nfunction Db(a,b){Cb(a,b);var c=tb(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?Eb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&Eb(a,b.type,tb(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction Gb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction Eb(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function Hb(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Ib(a,b){a=n({children:void 0},b);if(b=Hb(b.children))a.children=b;return a}\nfunction Jb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+tb(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction Kb(a,b){if(null!=b.dangerouslySetInnerHTML)throw t(Error(91));return n({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Lb(a,b){var c=b.value;if(null==c){c=b.defaultValue;b=b.children;if(null!=b){if(null!=c)throw t(Error(92));if(Array.isArray(b)){if(!(1>=b.length))throw t(Error(93));b=b[0]}c=b}null==c&&(c=\"\")}a._wrapperState={initialValue:tb(c)}}\nfunction Mb(a,b){var c=tb(b.value),d=tb(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function Nb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var Ob={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction Pb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Qb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Pb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar Rb,Sb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Ob.svg||\"innerHTML\"in a)a.innerHTML=b;else{Rb=Rb||document.createElement(\"div\");Rb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=Rb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Tb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}function Ub(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Vb={animationend:Ub(\"Animation\",\"AnimationEnd\"),animationiteration:Ub(\"Animation\",\"AnimationIteration\"),animationstart:Ub(\"Animation\",\"AnimationStart\"),transitionend:Ub(\"Transition\",\"TransitionEnd\")},Wb={},Xb={};\nXa&&(Xb=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Vb.animationend.animation,delete Vb.animationiteration.animation,delete Vb.animationstart.animation),\"TransitionEvent\"in window||delete Vb.transitionend.transition);function Yb(a){if(Wb[a])return Wb[a];if(!Vb[a])return a;var b=Vb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Xb)return Wb[a]=b[c];return a}\nvar Zb=Yb(\"animationend\"),$b=Yb(\"animationiteration\"),ac=Yb(\"animationstart\"),bc=Yb(\"transitionend\"),dc=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),ec=!1,fc=[],gc=null,hc=null,ic=null,jc=new Map,kc=new Map,lc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit\".split(\" \"),\nmc=\"focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture\".split(\" \");function nc(a){var b=oc(a);lc.forEach(function(c){pc(c,a,b)});mc.forEach(function(c){pc(c,a,b)})}function qc(a,b,c,d){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:d}}\nfunction rc(a,b){switch(a){case \"focus\":case \"blur\":gc=null;break;case \"dragenter\":case \"dragleave\":hc=null;break;case \"mouseover\":case \"mouseout\":ic=null;break;case \"pointerover\":case \"pointerout\":jc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":kc.delete(b.pointerId)}}function sc(a,b,c,d,e){if(null===a||a.nativeEvent!==e)return qc(b,c,d,e);a.eventSystemFlags|=d;return a}\nfunction tc(a,b,c,d){switch(b){case \"focus\":return gc=sc(gc,a,b,c,d),!0;case \"dragenter\":return hc=sc(hc,a,b,c,d),!0;case \"mouseover\":return ic=sc(ic,a,b,c,d),!0;case \"pointerover\":var e=d.pointerId;jc.set(e,sc(jc.get(e)||null,a,b,c,d));return!0;case \"gotpointercapture\":return e=d.pointerId,kc.set(e,sc(kc.get(e)||null,a,b,c,d)),!0}return!1}function uc(a){if(null!==a.blockedOn)return!1;var b=vc(a.topLevelType,a.eventSystemFlags,a.nativeEvent);return null!==b?(a.blockedOn=b,!1):!0}\nfunction wc(a,b,c){uc(a)&&c.delete(b)}function xc(){for(ec=!1;0<fc.length;){var a=fc[0];if(null!==a.blockedOn)break;var b=vc(a.topLevelType,a.eventSystemFlags,a.nativeEvent);null!==b?a.blockedOn=b:fc.shift()}null!==gc&&uc(gc)&&(gc=null);null!==hc&&uc(hc)&&(hc=null);null!==ic&&uc(ic)&&(ic=null);jc.forEach(wc);kc.forEach(wc)}function yc(a,b){a.blockedOn===b&&(a.blockedOn=null,ec||(ec=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,xc)))}\nfunction zc(a){function b(b){return yc(b,a)}if(0<fc.length){yc(fc[0],a);for(var c=1;c<fc.length;c++){var d=fc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==gc&&yc(gc,a);null!==hc&&yc(hc,a);null!==ic&&yc(ic,a);jc.forEach(b);kc.forEach(b)}var D=0,E=2,Ac=1024;function Bc(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,(b.effectTag&(E|Ac))!==D&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Cc(a){if(Bc(a)!==a)throw t(Error(188));}\nfunction Dc(a){var b=a.alternate;if(!b){b=Bc(a);if(null===b)throw t(Error(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Cc(e),a;if(f===d)return Cc(e),b;f=f.sibling}throw t(Error(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw t(Error(189));}}if(c.alternate!==d)throw t(Error(190));}if(3!==c.tag)throw t(Error(188));return c.stateNode.current===c?a:b}function Ec(a){a=Dc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nfunction Fc(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function Gc(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function Hc(a,b,c){if(b=Ca(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=wa(c._dispatchListeners,b),c._dispatchInstances=wa(c._dispatchInstances,a)}\nfunction Ic(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Gc(b);for(b=c.length;0<b--;)Hc(c[b],\"captured\",a);for(b=0;b<c.length;b++)Hc(c[b],\"bubbled\",a)}}function Jc(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Ca(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=wa(c._dispatchListeners,b),c._dispatchInstances=wa(c._dispatchInstances,a))}function Kc(a){a&&a.dispatchConfig.registrationName&&Jc(a._targetInst,null,a)}\nfunction Lc(a){xa(a,Ic)}function Mc(){return!0}function Nc(){return!1}function F(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?Mc:Nc;this.isPropagationStopped=Nc;return this}\nn(F.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=Mc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=Mc)},persist:function(){this.isPersistent=Mc},isPersistent:Nc,destructor:function(){var a=this.constructor.Interface,\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=Nc;this._dispatchInstances=this._dispatchListeners=null}});F.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nF.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;Oc(c);return c};Oc(F);function Pc(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}\nfunction Qc(a){if(!(a instanceof this))throw t(Error(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function Oc(a){a.eventPool=[];a.getPooled=Pc;a.release=Qc}var Rc=F.extend({animationName:null,elapsedTime:null,pseudoElement:null}),Sc=F.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Tc=F.extend({view:null,detail:null}),Uc=Tc.extend({relatedTarget:null});\nfunction Vc(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar Wc={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Xc={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Yc={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Zc(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Yc[a])?!!b[a]:!1}function $c(){return Zc}\nvar ad=Tc.extend({key:function(a){if(a.key){var b=Wc[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=Vc(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Xc[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:$c,charCode:function(a){return\"keypress\"===a.type?Vc(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?Vc(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),bd=0,cd=0,dd=!1,fd=!1,gd=Tc.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:$c,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if(\"movementX\"in a)return a.movementX;var b=bd;bd=a.screenX;return dd?\"mousemove\"===a.type?a.screenX-\nb:0:(dd=!0,0)},movementY:function(a){if(\"movementY\"in a)return a.movementY;var b=cd;cd=a.screenY;return fd?\"mousemove\"===a.type?a.screenY-b:0:(fd=!0,0)}}),hd=gd.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),id=gd.extend({dataTransfer:null}),jd=Tc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:$c}),kd=F.extend({propertyName:null,\nelapsedTime:null,pseudoElement:null}),ld=gd.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),md=[[\"blur\",\"blur\",0],[\"cancel\",\"cancel\",0],[\"click\",\"click\",0],[\"close\",\"close\",0],[\"contextmenu\",\"contextMenu\",0],[\"copy\",\"copy\",0],[\"cut\",\"cut\",0],[\"auxclick\",\"auxClick\",0],[\"dblclick\",\"doubleClick\",0],[\"dragend\",\"dragEnd\",\n0],[\"dragstart\",\"dragStart\",0],[\"drop\",\"drop\",0],[\"focus\",\"focus\",0],[\"input\",\"input\",0],[\"invalid\",\"invalid\",0],[\"keydown\",\"keyDown\",0],[\"keypress\",\"keyPress\",0],[\"keyup\",\"keyUp\",0],[\"mousedown\",\"mouseDown\",0],[\"mouseup\",\"mouseUp\",0],[\"paste\",\"paste\",0],[\"pause\",\"pause\",0],[\"play\",\"play\",0],[\"pointercancel\",\"pointerCancel\",0],[\"pointerdown\",\"pointerDown\",0],[\"pointerup\",\"pointerUp\",0],[\"ratechange\",\"rateChange\",0],[\"reset\",\"reset\",0],[\"seeked\",\"seeked\",0],[\"submit\",\"submit\",0],[\"touchcancel\",\"touchCancel\",\n0],[\"touchend\",\"touchEnd\",0],[\"touchstart\",\"touchStart\",0],[\"volumechange\",\"volumeChange\",0],[\"drag\",\"drag\",1],[\"dragenter\",\"dragEnter\",1],[\"dragexit\",\"dragExit\",1],[\"dragleave\",\"dragLeave\",1],[\"dragover\",\"dragOver\",1],[\"mousemove\",\"mouseMove\",1],[\"mouseout\",\"mouseOut\",1],[\"mouseover\",\"mouseOver\",1],[\"pointermove\",\"pointerMove\",1],[\"pointerout\",\"pointerOut\",1],[\"pointerover\",\"pointerOver\",1],[\"scroll\",\"scroll\",1],[\"toggle\",\"toggle\",1],[\"touchmove\",\"touchMove\",1],[\"wheel\",\"wheel\",1],[\"abort\",\"abort\",\n2],[Zb,\"animationEnd\",2],[$b,\"animationIteration\",2],[ac,\"animationStart\",2],[\"canplay\",\"canPlay\",2],[\"canplaythrough\",\"canPlayThrough\",2],[\"durationchange\",\"durationChange\",2],[\"emptied\",\"emptied\",2],[\"encrypted\",\"encrypted\",2],[\"ended\",\"ended\",2],[\"error\",\"error\",2],[\"gotpointercapture\",\"gotPointerCapture\",2],[\"load\",\"load\",2],[\"loadeddata\",\"loadedData\",2],[\"loadedmetadata\",\"loadedMetadata\",2],[\"loadstart\",\"loadStart\",2],[\"lostpointercapture\",\"lostPointerCapture\",2],[\"playing\",\"playing\",2],[\"progress\",\n\"progress\",2],[\"seeking\",\"seeking\",2],[\"stalled\",\"stalled\",2],[\"suspend\",\"suspend\",2],[\"timeupdate\",\"timeUpdate\",2],[bc,\"transitionEnd\",2],[\"waiting\",\"waiting\",2]],nd={},od={},pd=0;for(;pd<md.length;pd++){var qd=md[pd],rd=qd[0],sd=qd[1],td=qd[2],ud=\"on\"+(sd[0].toUpperCase()+sd.slice(1)),vd={phasedRegistrationNames:{bubbled:ud,captured:ud+\"Capture\"},dependencies:[rd],eventPriority:td};nd[sd]=vd;od[rd]=vd}\nvar wd={eventTypes:nd,getEventPriority:function(a){a=od[a];return void 0!==a?a.eventPriority:2},extractEvents:function(a,b,c,d){var e=od[a];if(!e)return null;switch(a){case \"keypress\":if(0===Vc(c))return null;case \"keydown\":case \"keyup\":a=ad;break;case \"blur\":case \"focus\":a=Uc;break;case \"click\":if(2===c.button)return null;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":a=gd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":a=\nid;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":a=jd;break;case Zb:case $b:case ac:a=Rc;break;case bc:a=kd;break;case \"scroll\":a=Tc;break;case \"wheel\":a=ld;break;case \"copy\":case \"cut\":case \"paste\":a=Sc;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":a=hd;break;default:a=F}b=a.getPooled(e,b,c,d);Lc(b);return b}},xd=wd.getEventPriority,zd=10,Ad=[];\nfunction Bd(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Cd(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Fc(a.nativeEvent);d=a.topLevelType;for(var f=a.nativeEvent,g=a.eventSystemFlags,h=null,k=0;k<ea.length;k++){var l=ea[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=wa(h,l))}Aa(h)}}\nvar Dd=!0;function G(a,b){Ed(b,a,!1)}function Ed(a,b,c){switch(xd(b)){case 0:var d=Fd.bind(null,b,1);break;case 1:d=Gd.bind(null,b,1);break;default:d=Hd.bind(null,b,1)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function Fd(a,b,c){hb||fb();var d=Hd,e=hb;hb=!0;try{eb(d,a,b,c)}finally{(hb=e)||jb()}}function Gd(a,b,c){Hd(a,b,c)}\nfunction Id(a,b,c,d){if(Ad.length){var e=Ad.pop();e.topLevelType=a;e.eventSystemFlags=b;e.nativeEvent=c;e.targetInst=d;a=e}else a={topLevelType:a,eventSystemFlags:b,nativeEvent:c,targetInst:d,ancestors:[]};try{if(b=Bd,c=a,ib)b(c,void 0);else{ib=!0;try{gb(b,c,void 0)}finally{ib=!1,jb()}}}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,Ad.length<zd&&Ad.push(a)}}\nfunction Hd(a,b,c){if(Dd)if(0<fc.length&&-1<lc.indexOf(a))a=qc(null,a,b,c),fc.push(a);else{var d=vc(a,b,c);null===d?rc(a,c):-1<lc.indexOf(a)?(a=qc(d,a,b,c),fc.push(a)):tc(d,a,b,c)||(rc(a,c),Id(a,b,c,null))}}\nfunction vc(a,b,c){var d=Fc(c),e=Cd(d);if(null!==e)if(d=Bc(e),null===d)e=null;else{var f=d.tag;if(13===f){a:{if(13===d.tag&&(e=d.memoizedState,null===e&&(d=d.alternate,null!==d&&(e=d.memoizedState)),null!==e)){d=e.dehydrated;break a}d=null}if(null!==d)return d;e=null}else if(3===f){if(d.stateNode.hydrate)return 3===d.tag?d.stateNode.containerInfo:null;e=null}else d!==e&&(e=null)}Id(a,b,c,e);return null}\nfunction Jd(a){if(!Xa)return!1;a=\"on\"+a;var b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}var Kd=new (\"function\"===typeof WeakMap?WeakMap:Map);function oc(a){var b=Kd.get(a);void 0===b&&(b=new Set,Kd.set(a,b));return b}\nfunction pc(a,b,c){if(!c.has(a)){switch(a){case \"scroll\":Ed(b,\"scroll\",!0);break;case \"focus\":case \"blur\":Ed(b,\"focus\",!0);Ed(b,\"blur\",!0);c.add(\"blur\");c.add(\"focus\");break;case \"cancel\":case \"close\":Jd(a)&&Ed(b,a,!0);break;case \"invalid\":case \"submit\":case \"reset\":break;default:-1===dc.indexOf(a)&&G(a,b)}c.add(a)}}\nvar Ld={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Md=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Ld).forEach(function(a){Md.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Ld[b]=Ld[a]})});function Nd(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||Ld.hasOwnProperty(a)&&Ld[a]?(\"\"+b).trim():b+\"px\"}\nfunction Od(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=Nd(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var Pd=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction Qd(a,b){if(b){if(Pd[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw t(Error(137),a,\"\");if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw t(Error(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw t(Error(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw t(Error(62),\"\");}}\nfunction Rd(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}function Sd(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=oc(a);b=ja[b];for(var d=0;d<b.length;d++)pc(b[d],a,c)}function Td(){}\nfunction Ud(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function Vd(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function Wd(a,b){var c=Vd(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Vd(c)}}\nfunction Xd(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Xd(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function Yd(){for(var a=window,b=Ud();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Ud(a.document)}return b}\nfunction Zd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}var $d=\"$\",ae=\"/$\",be=\"$?\",ce=\"$!\",de=null,ee=null;function fe(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nfunction ge(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var he=\"function\"===typeof setTimeout?setTimeout:void 0,ie=\"function\"===typeof clearTimeout?clearTimeout:void 0;function je(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}\nfunction ke(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===$d||c===ce||c===be){if(0===b)return a;b--}else c===ae&&b++}a=a.previousSibling}return null}var le=Math.random().toString(36).slice(2),me=\"__reactInternalInstance$\"+le,ne=\"__reactEventHandlers$\"+le,oe=\"__reactContainere$\"+le;\nfunction Cd(a){var b=a[me];if(b)return b;for(var c=a.parentNode;c;){if(b=c[oe]||c[me]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=ke(a);null!==a;){if(c=a[me])return c;a=ke(a)}return b}a=c;c=a.parentNode}return null}function pe(a){a=a[me]||a[oe];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function qe(a){if(5===a.tag||6===a.tag)return a.stateNode;throw t(Error(33));}function re(a){return a[ne]||null}var se=null,te=null,ue=null;\nfunction ve(){if(ue)return ue;var a,b=te,c=b.length,d,e=\"value\"in se?se.value:se.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return ue=e.slice(a,1<d?1-d:void 0)}var we=F.extend({data:null}),xe=F.extend({data:null}),ye=[9,13,27,32],ze=Xa&&\"CompositionEvent\"in window,Ae=null;Xa&&\"documentMode\"in document&&(Ae=document.documentMode);\nvar Be=Xa&&\"TextEvent\"in window&&!Ae,Ce=Xa&&(!ze||Ae&&8<Ae&&11>=Ae),De=String.fromCharCode(32),Ee={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},Fe=!1;\nfunction Ge(a,b){switch(a){case \"keyup\":return-1!==ye.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function He(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var Ie=!1;function Je(a,b){switch(a){case \"compositionend\":return He(b);case \"keypress\":if(32!==b.which)return null;Fe=!0;return De;case \"textInput\":return a=b.data,a===De&&Fe?null:a;default:return null}}\nfunction Ke(a,b){if(Ie)return\"compositionend\"===a||!ze&&Ge(a,b)?(a=ve(),ue=te=se=null,Ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return Ce&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar Le={eventTypes:Ee,extractEvents:function(a,b,c,d){var e;if(ze)b:{switch(a){case \"compositionstart\":var f=Ee.compositionStart;break b;case \"compositionend\":f=Ee.compositionEnd;break b;case \"compositionupdate\":f=Ee.compositionUpdate;break b}f=void 0}else Ie?Ge(a,c)&&(f=Ee.compositionEnd):\"keydown\"===a&&229===c.keyCode&&(f=Ee.compositionStart);f?(Ce&&\"ko\"!==c.locale&&(Ie||f!==Ee.compositionStart?f===Ee.compositionEnd&&Ie&&(e=ve()):(se=d,te=\"value\"in se?se.value:se.textContent,Ie=!0)),f=we.getPooled(f,\nb,c,d),e?f.data=e:(e=He(c),null!==e&&(f.data=e)),Lc(f),e=f):e=null;(a=Be?Je(a,c):Ke(a,c))?(b=xe.getPooled(Ee.beforeInput,b,c,d),b.data=a,Lc(b)):b=null;return null===e?b:null===b?e:[e,b]}},Me={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!Me[a.type]:\"textarea\"===b?!0:!1}\nvar Oe={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"blur change click focus input keydown keyup selectionchange\".split(\" \")}};function Pe(a,b,c){a=F.getPooled(Oe.change,a,b,c);a.type=\"change\";bb(c);Lc(a);return a}var Qe=null,Re=null;function Se(a){Aa(a)}function Te(a){var b=qe(a);if(zb(b))return a}function Ue(a,b){if(\"change\"===a)return b}var Ve=!1;Xa&&(Ve=Jd(\"input\")&&(!document.documentMode||9<document.documentMode));\nfunction We(){Qe&&(Qe.detachEvent(\"onpropertychange\",Xe),Re=Qe=null)}function Xe(a){if(\"value\"===a.propertyName&&Te(Re))if(a=Pe(Re,a,Fc(a)),hb)Aa(a);else{hb=!0;try{db(Se,a)}finally{hb=!1,jb()}}}function Ye(a,b,c){\"focus\"===a?(We(),Qe=b,Re=c,Qe.attachEvent(\"onpropertychange\",Xe)):\"blur\"===a&&We()}function Ze(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return Te(Re)}function $e(a,b){if(\"click\"===a)return Te(b)}function af(a,b){if(\"input\"===a||\"change\"===a)return Te(b)}\nvar bf={eventTypes:Oe,_isInputEventSupported:Ve,extractEvents:function(a,b,c,d){var e=b?qe(b):window,f=e.nodeName&&e.nodeName.toLowerCase();if(\"select\"===f||\"input\"===f&&\"file\"===e.type)var g=Ue;else if(Ne(e))if(Ve)g=af;else{g=Ze;var h=Ye}else(f=e.nodeName)&&\"input\"===f.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(g=$e);if(g&&(g=g(a,b)))return Pe(g,c,d);h&&h(a,e,b);\"blur\"===a&&(a=e._wrapperState)&&a.controlled&&\"number\"===e.type&&Eb(e,\"number\",e.value)}},cf={mouseEnter:{registrationName:\"onMouseEnter\",\ndependencies:[\"mouseout\",\"mouseover\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"mouseout\",\"mouseover\"]},pointerEnter:{registrationName:\"onPointerEnter\",dependencies:[\"pointerout\",\"pointerover\"]},pointerLeave:{registrationName:\"onPointerLeave\",dependencies:[\"pointerout\",\"pointerover\"]}},df={eventTypes:cf,extractEvents:function(a,b,c,d,e){var f=\"mouseover\"===a||\"pointerover\"===a,g=\"mouseout\"===a||\"pointerout\"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;\ne=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Cd(b):null,null!==b&&(f=Bc(b),b!==f||5!==b.tag&&6!==b.tag))b=null}else g=null;if(g===b)return null;if(\"mouseout\"===a||\"mouseover\"===a){var h=gd;var k=cf.mouseLeave;var l=cf.mouseEnter;var m=\"mouse\"}else if(\"pointerout\"===a||\"pointerover\"===a)h=hd,k=cf.pointerLeave,l=cf.pointerEnter,m=\"pointer\";a=null==g?e:qe(g);e=null==b?e:qe(b);k=h.getPooled(k,g,c,d);k.type=m+\"leave\";k.target=\na;k.relatedTarget=e;c=h.getPooled(l,b,c,d);c.type=m+\"enter\";c.target=e;c.relatedTarget=a;d=g;m=b;if(d&&m)a:{h=d;l=m;a=0;for(g=h;g;g=Gc(g))a++;g=0;for(b=l;b;b=Gc(b))g++;for(;0<a-g;)h=Gc(h),a--;for(;0<g-a;)l=Gc(l),g--;for(;a--;){if(h===l||h===l.alternate)break a;h=Gc(h);l=Gc(l)}h=null}else h=null;l=h;for(h=[];d&&d!==l;){a=d.alternate;if(null!==a&&a===l)break;h.push(d);d=Gc(d)}for(d=[];m&&m!==l;){a=m.alternate;if(null!==a&&a===l)break;d.push(m);m=Gc(m)}for(m=0;m<h.length;m++)Jc(h[m],\"bubbled\",k);for(m=\nd.length;0<m--;)Jc(d[m],\"captured\",c);return[k,c]}};function ef(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var ff=\"function\"===typeof Object.is?Object.is:ef,gf=Object.prototype.hasOwnProperty;function hf(a,b){if(ff(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!gf.call(b,c[d])||!ff(a[c[d]],b[c[d]]))return!1;return!0}\nvar jf=Xa&&\"documentMode\"in document&&11>=document.documentMode,kf={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},lf=null,mf=null,nf=null,of=!1;\nfunction pf(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(of||null==lf||lf!==Ud(c))return null;c=lf;\"selectionStart\"in c&&Zd(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return nf&&hf(nf,c)?null:(nf=c,a=F.getPooled(kf.select,mf,a,b),a.type=\"select\",a.target=lf,Lc(a),a)}\nvar qf={eventTypes:kf,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=oc(e);f=ja.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?qe(b):window;switch(a){case \"focus\":if(Ne(e)||\"true\"===e.contentEditable)lf=e,mf=b,nf=null;break;case \"blur\":nf=mf=lf=null;break;case \"mousedown\":of=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":return of=!1,pf(c,d);case \"selectionchange\":if(jf)break;\ncase \"keydown\":case \"keyup\":return pf(c,d)}return null}};Ba.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));sa=re;ta=pe;ua=qe;Ba.injectEventPluginsByName({SimpleEventPlugin:wd,EnterLeaveEventPlugin:df,ChangeEventPlugin:bf,SelectEventPlugin:qf,BeforeInputEventPlugin:Le});new Set;var rf=[],sf=-1;function H(a){0>sf||(a.current=rf[sf],rf[sf]=null,sf--)}\nfunction I(a,b){sf++;rf[sf]=a.current;a.current=b}var tf={},J={current:tf},K={current:!1},uf=tf;function vf(a,b){var c=a.type.contextTypes;if(!c)return tf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function N(a){a=a.childContextTypes;return null!==a&&void 0!==a}\nfunction wf(a){H(K,a);H(J,a)}function xf(a){H(K,a);H(J,a)}function zf(a,b,c){if(J.current!==tf)throw t(Error(168));I(J,b,a);I(K,c,a)}function Af(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw t(Error(108),Va(b)||\"Unknown\",e);return n({},c,{},d)}function Bf(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||tf;uf=J.current;I(J,b,a);I(K,K.current,a);return!0}\nfunction Cf(a,b,c){var d=a.stateNode;if(!d)throw t(Error(169));c?(b=Af(a,b,uf),d.__reactInternalMemoizedMergedChildContext=b,H(K,a),H(J,a),I(J,b,a)):H(K,a);I(K,c,a)}\nvar Df=r.unstable_runWithPriority,Ef=r.unstable_scheduleCallback,Ff=r.unstable_cancelCallback,Gf=r.unstable_shouldYield,Hf=r.unstable_requestPaint,If=r.unstable_now,Jf=r.unstable_getCurrentPriorityLevel,Kf=r.unstable_ImmediatePriority,Lf=r.unstable_UserBlockingPriority,Mf=r.unstable_NormalPriority,Nf=r.unstable_LowPriority,Of=r.unstable_IdlePriority,Pf={},Qf=void 0!==Hf?Hf:function(){},Rf=null,Sf=null,Tf=!1,Uf=If(),Vf=1E4>Uf?If:function(){return If()-Uf};\nfunction Wf(){switch(Jf()){case Kf:return 99;case Lf:return 98;case Mf:return 97;case Nf:return 96;case Of:return 95;default:throw t(Error(332));}}function Xf(a){switch(a){case 99:return Kf;case 98:return Lf;case 97:return Mf;case 96:return Nf;case 95:return Of;default:throw t(Error(332));}}function Yf(a,b){a=Xf(a);return Df(a,b)}function Zf(a,b,c){a=Xf(a);return Ef(a,b,c)}function $f(a){null===Rf?(Rf=[a],Sf=Ef(Kf,ag)):Rf.push(a);return Pf}function bg(){if(null!==Sf){var a=Sf;Sf=null;Ff(a)}ag()}\nfunction ag(){if(!Tf&&null!==Rf){Tf=!0;var a=0;try{var b=Rf;Yf(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});Rf=null}catch(c){throw null!==Rf&&(Rf=Rf.slice(a+1)),Ef(Kf,bg),c;}finally{Tf=!1}}}function cg(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}var dg={current:null},eg=null,fg=null,gg=null;function hg(){gg=fg=eg=null}function ig(a,b){var c=a.type._context;I(dg,c._currentValue,a);c._currentValue=b}\nfunction jg(a){var b=dg.current;H(dg,a);a.type._context._currentValue=b}function kg(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function lg(a,b){eg=a;gg=fg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(mg=!0),a.firstContext=null)}\nfunction ng(a,b){if(gg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)gg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===fg){if(null===eg)throw t(Error(308));fg=b;eg.dependencies={expirationTime:0,firstContext:b,responders:null}}else fg=fg.next=b}return a._currentValue}var og=!1;\nfunction pg(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function qg(a){return{baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}\nfunction rg(a,b){return{expirationTime:a,suspenseConfig:b,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function sg(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}\nfunction tg(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=pg(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=pg(a.memoizedState),e=c.updateQueue=pg(c.memoizedState)):d=a.updateQueue=qg(e):null===e&&(e=c.updateQueue=qg(d));null===e||d===e?sg(d,b):null===d.lastUpdate||null===e.lastUpdate?(sg(d,b),sg(e,b)):(sg(d,b),e.lastUpdate=b)}\nfunction ug(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=pg(a.memoizedState):vg(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b)}function vg(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=qg(b));return b}\nfunction wg(a,b,c,d,e,f){switch(c.tag){case 1:return a=c.payload,\"function\"===typeof a?a.call(f,d,e):a;case 3:a.effectTag=a.effectTag&-4097|64;case 0:a=c.payload;e=\"function\"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return n({},d,e);case 2:og=!0}return d}\nfunction xg(a,b,c,d,e){og=!1;b=vg(a,b);for(var f=b.baseState,g=null,h=0,k=b.firstUpdate,l=f;null!==k;){var m=k.expirationTime;m<e?(null===g&&(g=k,f=l),h<m&&(h=m)):(yg(m,k.suspenseConfig),l=wg(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastEffect?b.firstEffect=b.lastEffect=k:(b.lastEffect.nextEffect=k,b.lastEffect=k)));k=k.next}m=null;for(k=b.firstCapturedUpdate;null!==k;){var A=k.expirationTime;A<e?(null===m&&(m=k,null===g&&(f=l)),h<A&&(h=A)):(l=wg(a,b,k,l,c,d),null!==\nk.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastCapturedEffect?b.firstCapturedEffect=b.lastCapturedEffect=k:(b.lastCapturedEffect.nextEffect=k,b.lastCapturedEffect=k)));k=k.next}null===g&&(b.lastUpdate=null);null===m?b.lastCapturedUpdate=null:a.effectTag|=32;null===g&&null===m&&(f=l);b.baseState=f;b.firstUpdate=g;b.firstCapturedUpdate=m;zg(h);a.expirationTime=h;a.memoizedState=l}\nfunction Ag(a,b,c){null!==b.firstCapturedUpdate&&(null!==b.lastUpdate&&(b.lastUpdate.next=b.firstCapturedUpdate,b.lastUpdate=b.lastCapturedUpdate),b.firstCapturedUpdate=b.lastCapturedUpdate=null);Bg(b.firstEffect,c);b.firstEffect=b.lastEffect=null;Bg(b.firstCapturedEffect,c);b.firstCapturedEffect=b.lastCapturedEffect=null}function Bg(a,b){for(;null!==a;){var c=a.callback;if(null!==c){a.callback=null;var d=b;if(\"function\"!==typeof c)throw t(Error(191),c);c.call(d)}a=a.nextEffect}}\nvar Cg=Da.ReactCurrentBatchConfig,Dg=(new aa.Component).refs;function Eg(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}\nvar Ig={isMounted:function(a){return(a=a._reactInternalFiber)?Bc(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Fg(),e=Cg.suspense;d=Gg(d,a,e);e=rg(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);tg(a,e);Hg(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Fg(),e=Cg.suspense;d=Gg(d,a,e);e=rg(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);tg(a,e);Hg(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Fg(),d=Cg.suspense;\nc=Gg(c,a,d);d=rg(c,d);d.tag=2;void 0!==b&&null!==b&&(d.callback=b);tg(a,d);Hg(a,c)}};function Jg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!hf(c,d)||!hf(e,f):!0}\nfunction Kg(a,b,c){var d=!1,e=tf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=ng(f):(e=N(b)?uf:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?vf(a,e):tf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Ig;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Lg(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Ig.enqueueReplaceState(b,b.state,null)}\nfunction Mg(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Dg;var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=ng(f):(f=N(b)?uf:J.current,e.context=vf(a,f));f=a.updateQueue;null!==f&&(xg(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Eg(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==\ntypeof e.componentWillMount||(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Ig.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(xg(a,f,c,e,d),e.state=a.memoizedState));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var Ng=Array.isArray;\nfunction Og(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw t(Error(309));var d=c.stateNode}if(!d)throw t(Error(147),a);var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Dg&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw t(Error(284));if(!c._owner)throw t(Error(290),a);}return a}\nfunction Pg(a,b){if(\"textarea\"!==a.type)throw t(Error(31),\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\");}\nfunction Qg(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Rg(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\nE,c):d;b.effectTag=E;return c}function g(b){a&&null===b.alternate&&(b.effectTag=E);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Sg(c,a.mode,d),b.return=a,b;b=e(b,c,d);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props,d),d.ref=Og(a,b,c),d.return=a,d;d=Tg(c.type,c.key,c.props,null,a.mode,d);d.ref=Og(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==\nc.implementation)return b=Ug(c,a.mode,d),b.return=a,b;b=e(b,c.children||[],d);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Vg(c,a.mode,d,f),b.return=a,b;b=e(b,c,d);b.return=a;return b}function A(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Sg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case Fa:return c=Tg(b.type,b.key,b.props,null,a.mode,c),c.ref=Og(a,null,b),c.return=a,c;case Ga:return b=Ug(b,a.mode,c),b.return=a,b}if(Ng(b)||\nTa(b))return b=Vg(b,a.mode,c,null),b.return=a,b;Pg(a,b)}return null}function w(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case Fa:return c.key===e?c.type===Ha?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case Ga:return c.key===e?l(a,b,c,d):null}if(Ng(c)||Ta(c))return null!==e?null:m(a,b,c,d,null);Pg(a,c)}return null}function L(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=\na.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case Fa:return a=a.get(null===d.key?c:d.key)||null,d.type===Ha?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case Ga:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Ng(d)||Ta(d))return a=a.get(c)||null,m(b,a,d,e,null);Pg(b,d)}return null}function wb(e,g,h,k){for(var l=null,m=null,q=g,y=g=0,z=null;null!==q&&y<h.length;y++){q.index>y?(z=q,q=null):z=q.sibling;var p=w(e,q,h[y],k);if(null===p){null===q&&(q=z);break}a&&\nq&&null===p.alternate&&b(e,q);g=f(p,g,y);null===m?l=p:m.sibling=p;m=p;q=z}if(y===h.length)return c(e,q),l;if(null===q){for(;y<h.length;y++)q=A(e,h[y],k),null!==q&&(g=f(q,g,y),null===m?l=q:m.sibling=q,m=q);return l}for(q=d(e,q);y<h.length;y++)z=L(q,e,y,h[y],k),null!==z&&(a&&null!==z.alternate&&q.delete(null===z.key?y:z.key),g=f(z,g,y),null===m?l=z:m.sibling=z,m=z);a&&q.forEach(function(a){return b(e,a)});return l}function M(e,g,h,k){var l=Ta(h);if(\"function\"!==typeof l)throw t(Error(150));h=l.call(h);\nif(null==h)throw t(Error(151));for(var m=l=null,q=g,y=g=0,z=null,p=h.next();null!==q&&!p.done;y++,p=h.next()){q.index>y?(z=q,q=null):z=q.sibling;var M=w(e,q,p.value,k);if(null===M){null===q&&(q=z);break}a&&q&&null===M.alternate&&b(e,q);g=f(M,g,y);null===m?l=M:m.sibling=M;m=M;q=z}if(p.done)return c(e,q),l;if(null===q){for(;!p.done;y++,p=h.next())p=A(e,p.value,k),null!==p&&(g=f(p,g,y),null===m?l=p:m.sibling=p,m=p);return l}for(q=d(e,q);!p.done;y++,p=h.next())p=L(q,e,y,p.value,k),null!==p&&(a&&null!==\np.alternate&&q.delete(null===p.key?y:p.key),g=f(p,g,y),null===m?l=p:m.sibling=p,m=p);a&&q.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===Ha&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Fa:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){if(7===k.tag?f.type===Ha:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===Ha?f.props.children:f.props,h);d.ref=Og(a,k,f);d.return=a;a=d;break a}c(a,\nk);break}else b(a,k);k=k.sibling}f.type===Ha?(d=Vg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Tg(f.type,f.key,f.props,null,a.mode,h),h.ref=Og(a,d,f),h.return=a,a=h)}return g(a);case Ga:a:{for(k=f.key;null!==d;){if(d.key===k){if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}c(a,d);break}else b(a,d);d=d.sibling}d=Ug(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\n\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=a,a=d):(c(a,d),d=Sg(f,a.mode,h),d.return=a,a=d),g(a);if(Ng(f))return wb(a,d,f,h);if(Ta(f))return M(a,d,f,h);l&&Pg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,t(Error(152),a.displayName||a.name||\"Component\");}return c(a,d)}}var Wg=Qg(!0),Xg=Qg(!1),Yg={},Zg={current:Yg},$g={current:Yg},ah={current:Yg};function bh(a){if(a===Yg)throw t(Error(174));return a}\nfunction ch(a,b){I(ah,b,a);I($g,a,a);I(Zg,Yg,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Qb(null,\"\");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=Qb(b,c)}H(Zg,a);I(Zg,b,a)}function dh(a){H(Zg,a);H($g,a);H(ah,a)}function eh(a){bh(ah.current);var b=bh(Zg.current);var c=Qb(b,a.type);b!==c&&(I($g,a,a),I(Zg,c,a))}function fh(a){$g.current===a&&(H(Zg,a),H($g,a))}var O={current:0};\nfunction gh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===be||c.data===ce))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if((b.effectTag&64)!==D)return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function hh(a,b){return{responder:a,props:b}}\nvar ih=Da.ReactCurrentDispatcher,jh=0,kh=null,P=null,lh=null,mh=null,Q=null,nh=null,oh=0,ph=null,qh=0,rh=!1,sh=null,th=0;function uh(){throw t(Error(321));}function vh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!ff(a[c],b[c]))return!1;return!0}\nfunction wh(a,b,c,d,e,f){jh=f;kh=b;lh=null!==a?a.memoizedState:null;ih.current=null===lh?xh:yh;b=c(d,e);if(rh){do rh=!1,th+=1,lh=null!==a?a.memoizedState:null,nh=mh,ph=Q=P=null,ih.current=yh,b=c(d,e);while(rh);sh=null;th=0}ih.current=zh;a=kh;a.memoizedState=mh;a.expirationTime=oh;a.updateQueue=ph;a.effectTag|=qh;a=null!==P&&null!==P.next;jh=0;nh=Q=mh=lh=P=kh=null;oh=0;ph=null;qh=0;if(a)throw t(Error(300));return b}\nfunction Ah(){ih.current=zh;jh=0;nh=Q=mh=lh=P=kh=null;oh=0;ph=null;qh=0;rh=!1;sh=null;th=0}function Eh(){var a={memoizedState:null,baseState:null,queue:null,baseUpdate:null,next:null};null===Q?mh=Q=a:Q=Q.next=a;return Q}function Fh(){if(null!==nh)Q=nh,nh=Q.next,P=lh,lh=null!==P?P.next:null;else{if(null===lh)throw t(Error(310));P=lh;var a={memoizedState:P.memoizedState,baseState:P.baseState,queue:P.queue,baseUpdate:P.baseUpdate,next:null};Q=null===Q?mh=a:Q.next=a;lh=P.next}return Q}\nfunction Gh(a,b){return\"function\"===typeof b?b(a):b}\nfunction Hh(a){var b=Fh(),c=b.queue;if(null===c)throw t(Error(311));c.lastRenderedReducer=a;if(0<th){var d=c.dispatch;if(null!==sh){var e=sh.get(c);if(void 0!==e){sh.delete(c);var f=b.memoizedState;do f=a(f,e.action),e=e.next;while(null!==e);ff(f,b.memoizedState)||(mg=!0);b.memoizedState=f;b.baseUpdate===c.last&&(b.baseState=f);c.lastRenderedState=f;return[f,d]}}return[b.memoizedState,d]}d=c.last;var g=b.baseUpdate;f=b.baseState;null!==g?(null!==d&&(d.next=null),d=g.next):d=null!==d?d.next:null;if(null!==\nd){var h=e=null,k=d,l=!1;do{var m=k.expirationTime;m<jh?(l||(l=!0,h=g,e=f),m>oh&&(oh=m,zg(oh))):(yg(m,k.suspenseConfig),f=k.eagerReducer===a?k.eagerState:a(f,k.action));g=k;k=k.next}while(null!==k&&k!==d);l||(h=g,e=f);ff(f,b.memoizedState)||(mg=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.lastRenderedState=f}return[b.memoizedState,c.dispatch]}\nfunction Ih(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===ph?(ph={lastEffect:null},ph.lastEffect=a.next=a):(b=ph.lastEffect,null===b?ph.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,ph.lastEffect=a));return a}function Jh(a,b,c,d){var e=Eh();qh|=a;e.memoizedState=Ih(b,c,void 0,void 0===d?null:d)}\nfunction Kh(a,b,c,d){var e=Fh();d=void 0===d?null:d;var f=void 0;if(null!==P){var g=P.memoizedState;f=g.destroy;if(null!==d&&vh(d,g.deps)){Ih(0,c,f,d);return}}qh|=a;e.memoizedState=Ih(b,c,f,d)}function Lh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function Mh(){}\nfunction Nh(a,b,c){if(!(25>th))throw t(Error(301));var d=a.alternate;if(a===kh||null!==d&&d===kh)if(rh=!0,a={expirationTime:jh,suspenseConfig:null,action:c,eagerReducer:null,eagerState:null,next:null},null===sh&&(sh=new Map),c=sh.get(b),void 0===c)sh.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a}else{var e=Fg(),f=Cg.suspense;e=Gg(e,a,f);f={expirationTime:e,suspenseConfig:f,action:c,eagerReducer:null,eagerState:null,next:null};var g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&\n(f.next=h);g.next=f}b.last=f;if(0===a.expirationTime&&(null===d||0===d.expirationTime)&&(d=b.lastRenderedReducer,null!==d))try{var k=b.lastRenderedState,l=d(k,c);f.eagerReducer=d;f.eagerState=l;if(ff(l,k))return}catch(m){}finally{}Hg(a,e)}}\nvar zh={readContext:ng,useCallback:uh,useContext:uh,useEffect:uh,useImperativeHandle:uh,useLayoutEffect:uh,useMemo:uh,useReducer:uh,useRef:uh,useState:uh,useDebugValue:uh,useResponder:uh},xh={readContext:ng,useCallback:function(a,b){Eh().memoizedState=[a,void 0===b?null:b];return a},useContext:ng,useEffect:function(a,b){return Jh(516,192,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Jh(4,36,Lh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Jh(4,\n36,a,b)},useMemo:function(a,b){var c=Eh();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Eh();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=Nh.bind(null,kh,a);return[d.memoizedState,a]},useRef:function(a){var b=Eh();a={current:a};return b.memoizedState=a},useState:function(a){var b=Eh();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,\ndispatch:null,lastRenderedReducer:Gh,lastRenderedState:a};a=a.dispatch=Nh.bind(null,kh,a);return[b.memoizedState,a]},useDebugValue:Mh,useResponder:hh},yh={readContext:ng,useCallback:function(a,b){var c=Fh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&vh(b,d[1]))return d[0];c.memoizedState=[a,b];return a},useContext:ng,useEffect:function(a,b){return Kh(516,192,a,b)},useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Kh(4,36,Lh.bind(null,b,a),c)},\nuseLayoutEffect:function(a,b){return Kh(4,36,a,b)},useMemo:function(a,b){var c=Fh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&vh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:Hh,useRef:function(){return Fh().memoizedState},useState:function(a){return Hh(Gh,a)},useDebugValue:Mh,useResponder:hh},Oh=null,Ph=null,Qh=!1;\nfunction Rh(a,b){var c=Sh(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function Th(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction Uh(a){if(Qh){var b=Ph;if(b){var c=b;if(!Th(a,b)){b=je(c.nextSibling);if(!b||!Th(a,b)){a.effectTag=a.effectTag&~Ac|E;Qh=!1;Oh=a;return}Rh(Oh,c)}Oh=a;Ph=je(b.firstChild)}else a.effectTag=a.effectTag&~Ac|E,Qh=!1,Oh=a}}function Vh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;Oh=a}\nfunction Wh(a){if(a!==Oh)return!1;if(!Qh)return Vh(a),Qh=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!ge(b,a.memoizedProps))for(b=Ph;b;)Rh(a,b),b=je(b.nextSibling);Vh(a);if(13===a.tag)if(a=a.memoizedState,a=null!==a?a.dehydrated:null,null===a)a=Ph;else a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===ae){if(0===b){a=je(a.nextSibling);break a}b--}else c!==$d&&c!==ce&&c!==be||b++}a=a.nextSibling}a=null}else a=Oh?je(a.stateNode.nextSibling):null;Ph=a;return!0}\nfunction Xh(){Ph=Oh=null;Qh=!1}var Yh=Da.ReactCurrentOwner,mg=!1;function R(a,b,c,d){b.child=null===a?Xg(b,null,c,d):Wg(b,a.child,c,d)}function Zh(a,b,c,d,e){c=c.render;var f=b.ref;lg(b,e);d=wh(a,b,c,d,f,e);if(null!==a&&!mg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,d,e);return b.child}\nfunction ai(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!bi(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ci(a,b,g,d,e,f);a=Tg(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:hf,c(e,d)&&a.ref===b.ref))return $h(a,b,f);b.effectTag|=1;a=Rg(g,d,f);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ci(a,b,c,d,e,f){return null!==a&&hf(a.memoizedProps,d)&&a.ref===b.ref&&(mg=!1,e<f)?$h(a,b,f):di(a,b,c,d,f)}function ei(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function di(a,b,c,d,e){var f=N(c)?uf:J.current;f=vf(b,f);lg(b,e);c=wh(a,b,c,d,f,e);if(null!==a&&!mg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,c,e);return b.child}\nfunction fi(a,b,c,d,e){if(N(c)){var f=!0;Bf(b)}else f=!1;lg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=E),Kg(b,c,d,e),Mg(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=ng(l):(l=N(c)?uf:J.current,l=vf(b,l));var m=c.getDerivedStateFromProps,A=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;A||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Lg(b,g,d,l);og=!1;var w=b.memoizedState;k=g.state=w;var L=b.updateQueue;null!==L&&(xg(b,L,d,g,e),k=b.memoizedState);h!==d||w!==k||K.current||og?(\"function\"===typeof m&&(Eg(b,c,m,d),k=b.memoizedState),(h=og||Jg(b,c,h,d,w,k,l))?(A||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&\ng.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.effectTag|=4)):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,h=b.memoizedProps,g.props=b.type===b.elementType?h:cg(b.type,h),k=g.context,l=c.contextType,\"object\"===typeof l&&null!==l?l=ng(l):(l=N(c)?uf:J.current,l=vf(b,l)),m=c.getDerivedStateFromProps,(A=\n\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Lg(b,g,d,l),og=!1,k=b.memoizedState,w=g.state=k,L=b.updateQueue,null!==L&&(xg(b,L,d,g,e),w=b.memoizedState),h!==d||k!==w||K.current||og?(\"function\"===typeof m&&(Eg(b,c,m,d),w=b.memoizedState),(m=og||Jg(b,c,h,d,k,w,l))?(A||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||\n(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,w,l),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,w,l)),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=\nd,b.memoizedState=w),g.props=d,g.state=w,g.context=l,d=m):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return gi(a,b,c,d,f,e)}\nfunction gi(a,b,c,d,e,f){ei(a,b);var g=(b.effectTag&64)!==D;if(!d&&!g)return e&&Cf(b,c,!1),$h(a,b,f);d=b.stateNode;Yh.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=Wg(b,a.child,null,f),b.child=Wg(b,null,h,f)):R(a,b,h,f);b.memoizedState=d.state;e&&Cf(b,c,!0);return b.child}function hi(a){var b=a.stateNode;b.pendingContext?zf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&zf(a,b.context,!1);ch(a,b.containerInfo)}\nvar ii={dehydrated:null,retryTime:1};\nfunction ji(a,b,c){var d=b.mode,e=b.pendingProps,f=O.current,g=!1,h;(h=(b.effectTag&64)!==D)||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);I(O,f&1,b);if(null===a){if(g){g=e.fallback;e=Vg(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Vg(g,d,c,null);c.return=b;e.sibling=c;b.memoizedState=\nii;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Xg(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=Rg(a,a.pendingProps,0);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Rg(d,e,d.expirationTime);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=ii;b.child=c;return d}c=Wg(b,a.child,e.children,c);b.memoizedState=null;return b.child=c}a=a.child;\nif(g){g=e.fallback;e=Vg(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Vg(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=E;e.childExpirationTime=0;b.memoizedState=ii;b.child=e;return c}b.memoizedState=null;return b.child=Wg(b,a,e.children,c)}\nfunction ki(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,last:d,tail:c,tailExpiration:0,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.last=d,f.tail=c,f.tailExpiration=0,f.tailMode=e)}\nfunction li(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;R(a,b,d.children,c);d=O.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&(a.effectTag&64)!==D)a:for(a=b.child;null!==a;){if(13===a.tag){if(null!==a.memoizedState){a.expirationTime<c&&(a.expirationTime=c);var g=a.alternate;null!==g&&g.expirationTime<c&&(g.expirationTime=c);kg(a.return,c)}}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;\na=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(O,d,b);if(0===(b.mode&2))b.memoizedState=null;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)d=c.alternate,null!==d&&null===gh(d)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);ki(b,!1,e,c,f);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){d=e.alternate;if(null!==d&&null===gh(d)){b.child=e;break}d=e.sibling;e.sibling=c;c=e;e=d}ki(b,!0,c,null,f);break;case \"together\":ki(b,\n!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}function $h(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&zg(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw t(Error(153));if(null!==b.child){a=b.child;c=Rg(a,a.pendingProps,a.expirationTime);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Rg(a,a.pendingProps,a.expirationTime),c.return=b;c.sibling=null}return b.child}\nfunction mi(a){a.effectTag|=4}var ni,oi,pi,qi;ni=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};oi=function(){};\npi=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;bh(Zg.current);a=null;switch(c){case \"input\":f=Ab(g,f);d=Ab(g,d);a=[];break;case \"option\":f=Ib(g,f);d=Ib(g,d);a=[];break;case \"select\":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case \"textarea\":f=Kb(g,f);d=Kb(g,d);a=[];break;default:\"function\"!==typeof f.onClick&&\"function\"===typeof d.onClick&&(g.onclick=Td)}Qd(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if(\"style\"===\nh)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]=\"\");else\"dangerouslySetInnerHTML\"!==h&&\"children\"!==h&&\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(ia.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if(\"style\"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]=\"\");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),\nc[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else\"dangerouslySetInnerHTML\"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,\"\"+l)):\"children\"===h?g===l||\"string\"!==typeof l&&\"number\"!==typeof l||(a=a||[]).push(h,\"\"+l):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&(ia.hasOwnProperty(h)?(null!=l&&Sd(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push(\"style\",c);e=a;(b.updateQueue=e)&&mi(b)}};qi=function(a,b,c,d){c!==d&&mi(b)};\nfunction ri(a,b){switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction si(a){switch(a.tag){case 1:N(a.type)&&wf(a);var b=a.effectTag;return b&4096?(a.effectTag=b&-4097|64,a):null;case 3:dh(a);xf(a);b=a.effectTag;if((b&64)!==D)throw t(Error(285));a.effectTag=b&-4097|64;return a;case 5:return fh(a),null;case 13:return H(O,a),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return H(O,a),null;case 4:return dh(a),null;case 10:return jg(a),null;default:return null}}function ti(a,b){return{value:a,source:b,stack:Wa(b)}}\nvar ui=\"function\"===typeof WeakSet?WeakSet:Set;function vi(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Wa(c));null!==c&&Va(c.type);b=b.value;null!==a&&1===a.tag&&Va(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function wi(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){xi(a,c)}}function yi(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){xi(a,c)}else b.current=null}\nfunction Di(a,b){switch(b.tag){case 0:case 11:case 15:Ei(2,0,b);break;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:cg(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}break;case 3:case 5:case 6:case 4:case 17:break;default:throw t(Error(163));}}\nfunction Ei(a,b,c){c=c.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do{if(0!==(d.tag&a)){var e=d.destroy;d.destroy=void 0;void 0!==e&&e()}0!==(d.tag&b)&&(e=d.create,d.destroy=e());d=d.next}while(d!==c)}}\nfunction Fi(a,b,c){\"function\"===typeof Gi&&Gi(b);switch(b.tag){case 0:case 11:case 14:case 15:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;Yf(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){xi(g,h)}}a=a.next}while(a!==d)})}break;case 1:yi(b);c=b.stateNode;\"function\"===typeof c.componentWillUnmount&&wi(b,c);break;case 5:yi(b);break;case 4:Hi(a,b,c)}}\nfunction Ii(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;null!==b&&Ii(b)}function Ji(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Ki(a){a:{for(var b=a.return;null!==b;){if(Ji(b)){var c=b;break a}b=b.return}throw t(Error(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw t(Error(161));}c.effectTag&16&&(Tb(b,\"\"),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Ji(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&E)continue b;\nif(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&E)){c=c.stateNode;break a}}for(var e=a;;){var f=5===e.tag||6===e.tag;if(f){var g=f?e.stateNode:e.stateNode.instance;if(c)if(d){f=b;var h=g;g=c;8===f.nodeType?f.parentNode.insertBefore(h,g):f.insertBefore(h,g)}else b.insertBefore(g,c);else d?(h=b,8===h.nodeType?(f=h.parentNode,f.insertBefore(g,h)):(f=h,f.appendChild(g)),h=h._reactRootContainer,null!==h&&void 0!==h||null!==f.onclick||(f.onclick=Td)):b.appendChild(g)}else if(4!==\ne.tag&&null!==e.child){e.child.return=e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===e.return||e.return===a)return;e=e.return}e.sibling.return=e.return;e=e.sibling}}\nfunction Hi(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw t(Error(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Fi(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Fi(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}\nfunction Li(a,b){switch(b.tag){case 0:case 11:case 14:case 15:Ei(4,8,b);break;case 1:break;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[ne]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Cb(c,d);Rd(a,e);b=Rd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];\"style\"===g?Od(c,h):\"dangerouslySetInnerHTML\"===g?Sb(c,h):\"children\"===g?Tb(c,h):ub(c,g,h,b)}switch(a){case \"input\":Db(c,d);break;case \"textarea\":Mb(c,\nd);break;case \"select\":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?Jb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?Jb(c,!!d.multiple,d.defaultValue,!0):Jb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}break;case 6:if(null===b.stateNode)throw t(Error(162));b.stateNode.nodeValue=b.memoizedProps;break;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,zc(b.containerInfo));break;case 12:break;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,Mi=Vf());\nif(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null,f.style.display=Nd(\"display\",e));else if(6===a.tag)a.stateNode.nodeValue=d?\"\":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=\na;a=a.child;continue}if(a===c)break a;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Ni(b);break;case 19:Ni(b);break;case 17:break;case 20:break;case 21:break;default:throw t(Error(163));}}function Ni(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new ui);b.forEach(function(b){var d=Oi.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}var Pi=\"function\"===typeof WeakMap?WeakMap:Map;\nfunction Qi(a,b,c){c=rg(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Ri||(Ri=!0,Si=d);vi(a,b)};return c}\nfunction Ti(a,b,c){c=rg(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){vi(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===Ui?Ui=new Set([this]):Ui.add(this),vi(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nvar Vi=Math.ceil,Wi=Da.ReactCurrentDispatcher,Xi=Da.ReactCurrentOwner,S=0,Yi=8,Zi=16,$i=32,aj=0,bj=1,cj=2,dj=3,ej=4,fj=5,gj=6,T=S,U=null,V=null,W=0,X=aj,hj=null,ij=1073741823,jj=1073741823,kj=null,lj=0,mj=!1,Mi=0,nj=500,Y=null,Ri=!1,Si=null,Ui=null,oj=!1,pj=null,qj=90,rj=null,sj=0,tj=null,uj=0;function Fg(){return(T&(Zi|$i))!==S?1073741821-(Vf()/10|0):0!==uj?uj:uj=1073741821-(Vf()/10|0)}\nfunction Gg(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=Wf();if(0===(b&4))return 99===d?1073741823:1073741822;if((T&Zi)!==S)return W;if(null!==c)a=1073741821-25*(((1073741821-a+(c.timeoutMs|0||5E3)/10)/25|0)+1);else switch(d){case 99:a=1073741823;break;case 98:a=1073741821-10*(((1073741821-a+15)/10|0)+1);break;case 97:case 96:a=1073741821-25*(((1073741821-a+500)/25|0)+1);break;case 95:a=2;break;default:throw t(Error(326));}null!==U&&a===W&&--a;return a}var vj=0;\nfunction Hg(a,b){if(50<sj)throw sj=0,tj=null,t(Error(185));a=wj(a,b);if(null!==a){var c=Wf();1073741823===b?(T&Yi)!==S&&(T&(Zi|$i))===S?xj(a):(Z(a),T===S&&bg()):Z(a);(T&4)===S||98!==c&&99!==c||(null===rj?rj=new Map([[a,b]]):(c=rj.get(a),(void 0===c||c>b)&&rj.set(a,b)))}}\nfunction wj(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(U===e&&(zg(b),X===ej&&yj(e,W)),zj(e,b));return e}\nfunction Aj(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Bj(a,b))return b;b=a.lastPingedTime;a=a.nextKnownPendingLevel;return b>a?b:a}\nfunction Z(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=$f(xj.bind(null,a));else{var b=Aj(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=Fg();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Pf&&Ff(c)}a.callbackExpirationTime=\nb;a.callbackPriority=d;b=1073741823===b?$f(xj.bind(null,a)):Zf(d,Cj.bind(null,a),{timeout:10*(1073741821-b)-Vf()});a.callbackNode=b}}}\nfunction Cj(a,b){uj=0;if(b)return b=Fg(),Dj(a,b),Z(a),null;var c=Aj(a);if(0!==c){b=a.callbackNode;if((T&(Zi|$i))!==S)throw t(Error(327));Ej();a===U&&c===W||Fj(a,c);if(null!==V){var d=T;T|=Zi;var e=Gj(a);do try{Hj();break}catch(h){Ij(a,h)}while(1);hg();T=d;Wi.current=e;if(X===bj)throw b=hj,Fj(a,c),yj(a,c),Z(a),b;if(null===V)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,Jj(a,c),d=X,U=null,d){case aj:case bj:throw t(Error(345));case cj:if(2!==c){Dj(a,2);break}Kj(a);break;case dj:yj(a,\nc);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Lj(e));if(1073741823===ij&&(e=Mi+nj-Vf(),10<e)){if(mj){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Fj(a,c);break}}f=Aj(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=he(Kj.bind(null,a),e);break}Kj(a);break;case ej:yj(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Lj(e));if(mj&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Fj(a,c);break}e=Aj(a);if(0!==e&&e!==c)break;if(0!==\nd&&d!==c){a.lastPingedTime=d;break}1073741823!==jj?d=10*(1073741821-jj)-Vf():1073741823===ij?d=0:(d=10*(1073741821-ij)-5E3,e=Vf(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*Vi(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=he(Kj.bind(null,a),d);break}Kj(a);break;case fj:if(1073741823!==ij&&null!==kj){f=ij;var g=kj;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=Vf()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);\nif(10<d){yj(a,c);a.timeoutHandle=he(Kj.bind(null,a),d);break}}Kj(a);break;case gj:yj(a,c);break;default:throw t(Error(329));}Z(a);if(a.callbackNode===b)return Cj.bind(null,a)}}return null}\nfunction xj(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if(a.finishedExpirationTime===b)Kj(a);else{if((T&(Zi|$i))!==S)throw t(Error(327));Ej();a===U&&b===W||Fj(a,b);if(null!==V){var c=T;T|=Zi;var d=Gj(a);do try{Mj();break}catch(e){Ij(a,e)}while(1);hg();T=c;Wi.current=d;if(X===bj)throw c=hj,Fj(a,b),yj(a,b),Z(a),c;if(null!==V)throw t(Error(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;Jj(a,b);X===gj?yj(a,b):(U=null,Kj(a));Z(a)}}return null}\nfunction Nj(){(T&(1|Zi|$i))===S&&(Oj(),Ej())}function Jj(a,b){var c=a.firstBatch;null!==c&&c._defer&&c._expirationTime>=b&&(Zf(97,function(){c._onComplete();return null}),X=gj)}function Oj(){if(null!==rj){var a=rj;rj=null;a.forEach(function(a,c){Dj(c,a);Z(c)});bg()}}function Pj(a,b){var c=T;T|=1;try{return a(b)}finally{T=c,T===S&&bg()}}function Qj(a,b,c,d){var e=T;T|=4;try{return Yf(98,a.bind(null,b,c,d))}finally{T=e,T===S&&bg()}}\nfunction Rj(a,b){var c=T;T&=-2;T|=Yi;try{return a(b)}finally{T=c,T===S&&bg()}}\nfunction Fj(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,ie(c));if(null!==V)for(c=V.return;null!==c;){var d=c;switch(d.tag){case 1:var e=d.type.childContextTypes;null!==e&&void 0!==e&&wf(d);break;case 3:dh(d);xf(d);break;case 5:fh(d);break;case 4:dh(d);break;case 13:H(O,d);break;case 19:H(O,d);break;case 10:jg(d)}c=c.return}U=a;V=Rg(a.current,null,b);W=b;X=aj;hj=null;jj=ij=1073741823;kj=null;lj=0;mj=!1}\nfunction Ij(a,b){do{try{hg();Ah();if(null===V||null===V.return)return X=bj,hj=b,null;a:{var c=a,d=V.return,e=V,f=b;b=W;e.effectTag|=2048;e.firstEffect=e.lastEffect=null;if(null!==f&&\"object\"===typeof f&&\"function\"===typeof f.then){var g=f,h=0!==(O.current&1),k=d;do{var l;if(l=13===k.tag){var m=k.memoizedState;if(null!==m)l=null!==m.dehydrated?!0:!1;else{var A=k.memoizedProps;l=void 0===A.fallback?!1:!0!==A.unstable_avoidThisFallback?!0:h?!1:!0}}if(l){var w=k.updateQueue;if(null===w){var L=new Set;\nL.add(g);k.updateQueue=L}else w.add(g);if(0===(k.mode&2)){k.effectTag|=64;e.effectTag&=-2981;if(1===e.tag)if(null===e.alternate)e.tag=17;else{var wb=rg(1073741823,null);wb.tag=2;tg(e,wb)}e.expirationTime=1073741823;break a}f=void 0;e=b;var M=c.pingCache;null===M?(M=c.pingCache=new Pi,f=new Set,M.set(g,f)):(f=M.get(g),void 0===f&&(f=new Set,M.set(g,f)));if(!f.has(e)){f.add(e);var q=Sj.bind(null,c,g,e);g.then(q,q)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);f=Error((Va(e.type)||\n\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\"+Wa(e))}X!==fj&&(X=cj);f=ti(f,e);k=d;do{switch(k.tag){case 3:g=f;k.effectTag|=4096;k.expirationTime=b;var y=Qi(k,g,b);ug(k,y);break a;case 1:g=f;var z=k.type,p=k.stateNode;if((k.effectTag&64)===D&&(\"function\"===typeof z.getDerivedStateFromError||null!==p&&\"function\"===typeof p.componentDidCatch&&\n(null===Ui||!Ui.has(p)))){k.effectTag|=4096;k.expirationTime=b;var u=Ti(k,g,b);ug(k,u);break a}}k=k.return}while(null!==k)}V=Tj(V)}catch(v){b=v;continue}break}while(1)}function Gj(){var a=Wi.current;Wi.current=zh;return null===a?zh:a}function yg(a,b){a<ij&&2<a&&(ij=a);null!==b&&a<jj&&2<a&&(jj=a,kj=b)}function zg(a){a>lj&&(lj=a)}function Mj(){for(;null!==V;)V=Uj(V)}function Hj(){for(;null!==V&&!Gf();)V=Uj(V)}\nfunction Uj(a){var b=Vj(a.alternate,a,W);a.memoizedProps=a.pendingProps;null===b&&(b=Tj(a));Xi.current=null;return b}\nfunction Tj(a){V=a;do{var b=V.alternate;a=V.return;if((V.effectTag&2048)===D){a:{var c=b;b=V;var d=W,e=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:N(b.type)&&wf(b);break;case 3:dh(b);xf(b);d=b.stateNode;d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);(null===c||null===c.child)&&Wh(b)&&mi(b);oi(b);break;case 5:fh(b);d=bh(ah.current);var f=b.type;if(null!==c&&null!=b.stateNode)pi(c,b,f,e,d),c.ref!==b.ref&&(b.effectTag|=128);else if(e){var g=\nbh(Zg.current);if(Wh(b)){e=b;f=void 0;c=e.stateNode;var h=e.type,k=e.memoizedProps;c[me]=e;c[ne]=k;switch(h){case \"iframe\":case \"object\":case \"embed\":G(\"load\",c);break;case \"video\":case \"audio\":for(var l=0;l<dc.length;l++)G(dc[l],c);break;case \"source\":G(\"error\",c);break;case \"img\":case \"image\":case \"link\":G(\"error\",c);G(\"load\",c);break;case \"form\":G(\"reset\",c);G(\"submit\",c);break;case \"details\":G(\"toggle\",c);break;case \"input\":Bb(c,k);G(\"invalid\",c);Sd(d,\"onChange\");break;case \"select\":c._wrapperState=\n{wasMultiple:!!k.multiple};G(\"invalid\",c);Sd(d,\"onChange\");break;case \"textarea\":Lb(c,k),G(\"invalid\",c),Sd(d,\"onChange\")}Qd(h,k);l=null;for(f in k)k.hasOwnProperty(f)&&(g=k[f],\"children\"===f?\"string\"===typeof g?c.textContent!==g&&(l=[\"children\",g]):\"number\"===typeof g&&c.textContent!==\"\"+g&&(l=[\"children\",\"\"+g]):ia.hasOwnProperty(f)&&null!=g&&Sd(d,f));switch(h){case \"input\":yb(c);Gb(c,k,!0);break;case \"textarea\":yb(c);Nb(c,k);break;case \"select\":case \"option\":break;default:\"function\"===typeof k.onClick&&\n(c.onclick=Td)}d=l;e.updateQueue=d;null!==d&&mi(b)}else{k=f;c=e;h=b;l=9===d.nodeType?d:d.ownerDocument;g===Ob.html&&(g=Pb(k));g===Ob.html?\"script\"===k?(k=l.createElement(\"div\"),k.innerHTML=\"<script>\\x3c/script>\",l=k.removeChild(k.firstChild)):\"string\"===typeof c.is?l=l.createElement(k,{is:c.is}):(l=l.createElement(k),\"select\"===k&&(k=l,c.multiple?k.multiple=!0:c.size&&(k.size=c.size))):l=l.createElementNS(g,k);k=l;k[me]=h;k[ne]=c;c=k;ni(c,b,!1,!1);b.stateNode=c;g=d;var m=Rd(f,e);switch(f){case \"iframe\":case \"object\":case \"embed\":G(\"load\",\nc);d=e;break;case \"video\":case \"audio\":for(d=0;d<dc.length;d++)G(dc[d],c);d=e;break;case \"source\":G(\"error\",c);d=e;break;case \"img\":case \"image\":case \"link\":G(\"error\",c);G(\"load\",c);d=e;break;case \"form\":G(\"reset\",c);G(\"submit\",c);d=e;break;case \"details\":G(\"toggle\",c);d=e;break;case \"input\":Bb(c,e);d=Ab(c,e);G(\"invalid\",c);Sd(g,\"onChange\");break;case \"option\":d=Ib(c,e);break;case \"select\":c._wrapperState={wasMultiple:!!e.multiple};d=n({},e,{value:void 0});G(\"invalid\",c);Sd(g,\"onChange\");break;case \"textarea\":Lb(c,\ne);d=Kb(c,e);G(\"invalid\",c);Sd(g,\"onChange\");break;default:d=e}Qd(f,d);h=void 0;k=f;l=c;var A=d;for(h in A)if(A.hasOwnProperty(h)){var w=A[h];\"style\"===h?Od(l,w):\"dangerouslySetInnerHTML\"===h?(w=w?w.__html:void 0,null!=w&&Sb(l,w)):\"children\"===h?\"string\"===typeof w?(\"textarea\"!==k||\"\"!==w)&&Tb(l,w):\"number\"===typeof w&&Tb(l,\"\"+w):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(ia.hasOwnProperty(h)?null!=w&&Sd(g,h):null!=w&&ub(l,h,w,m))}switch(f){case \"input\":yb(c);\nGb(c,e,!1);break;case \"textarea\":yb(c);Nb(c,e);break;case \"option\":null!=e.value&&c.setAttribute(\"value\",\"\"+tb(e.value));break;case \"select\":d=c;c=e;d.multiple=!!c.multiple;h=c.value;null!=h?Jb(d,!!c.multiple,h,!1):null!=c.defaultValue&&Jb(d,!!c.multiple,c.defaultValue,!0);break;default:\"function\"===typeof d.onClick&&(c.onclick=Td)}fe(f,e)&&mi(b)}null!==b.ref&&(b.effectTag|=128)}else if(null===b.stateNode)throw t(Error(166));break;case 6:if(c&&null!=b.stateNode)qi(c,b,c.memoizedProps,e);else{if(\"string\"!==\ntypeof e&&null===b.stateNode)throw t(Error(166));f=bh(ah.current);bh(Zg.current);Wh(b)?(d=b.stateNode,e=b.memoizedProps,d[me]=b,d.nodeValue!==e&&mi(b)):(d=b,e=(9===f.nodeType?f:f.ownerDocument).createTextNode(e),e[me]=b,d.stateNode=e)}break;case 11:break;case 13:H(O,b);e=b.memoizedState;if((b.effectTag&64)!==D){b.expirationTime=d;break a}d=null!==e;e=!1;null===c?Wh(b):(f=c.memoizedState,e=null!==f,d||null===f||(f=c.child.sibling,null!==f&&(h=b.firstEffect,null!==h?(b.firstEffect=f,f.nextEffect=h):\n(b.firstEffect=b.lastEffect=f,f.nextEffect=null),f.effectTag=8)));if(d&&!e&&0!==(b.mode&2))if(null===c&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(O.current&1))X===aj&&(X=dj);else{if(X===aj||X===dj)X=ej;0!==lj&&null!==U&&(yj(U,W),zj(U,lj))}if(d||e)b.effectTag|=4;break;case 7:break;case 8:break;case 12:break;case 4:dh(b);oi(b);break;case 10:jg(b);break;case 9:break;case 14:break;case 17:N(b.type)&&wf(b);break;case 19:H(O,b);e=b.memoizedState;if(null===e)break;f=(b.effectTag&64)!==D;h=e.rendering;\nif(null===h)if(f)ri(e,!1);else{if(X!==aj||null!==c&&(c.effectTag&64)!==D)for(c=b.child;null!==c;){h=gh(c);if(null!==h){b.effectTag|=64;ri(e,!1);e=h.updateQueue;null!==e&&(b.updateQueue=e,b.effectTag|=4);b.firstEffect=b.lastEffect=null;for(e=b.child;null!==e;)f=e,c=d,f.effectTag&=E,f.nextEffect=null,f.firstEffect=null,f.lastEffect=null,h=f.alternate,null===h?(f.childExpirationTime=0,f.expirationTime=c,f.child=null,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null):(f.childExpirationTime=\nh.childExpirationTime,f.expirationTime=h.expirationTime,f.child=h.child,f.memoizedProps=h.memoizedProps,f.memoizedState=h.memoizedState,f.updateQueue=h.updateQueue,c=h.dependencies,f.dependencies=null===c?null:{expirationTime:c.expirationTime,firstContext:c.firstContext,responders:c.responders}),e=e.sibling;I(O,O.current&1|2,b);b=b.child;break a}c=c.sibling}}else{if(!f)if(c=gh(h),null!==c){if(b.effectTag|=64,f=!0,ri(e,!0),null===e.tail&&\"hidden\"===e.tailMode){d=c.updateQueue;null!==d&&(b.updateQueue=\nd,b.effectTag|=4);b=b.lastEffect=e.lastEffect;null!==b&&(b.nextEffect=null);break}}else Vf()>e.tailExpiration&&1<d&&(b.effectTag|=64,f=!0,ri(e,!1),b.expirationTime=b.childExpirationTime=d-1);e.isBackwards?(h.sibling=b.child,b.child=h):(d=e.last,null!==d?d.sibling=h:b.child=h,e.last=h)}if(null!==e.tail){0===e.tailExpiration&&(e.tailExpiration=Vf()+500);d=e.tail;e.rendering=d;e.tail=d.sibling;e.lastEffect=b.lastEffect;d.sibling=null;e=O.current;e=f?e&1|2:e&1;I(O,e,b);b=d;break a}break;case 20:break;\ncase 21:break;default:throw t(Error(156),b.tag);}b=null}d=V;if(1===W||1!==d.childExpirationTime){e=0;for(f=d.child;null!==f;)c=f.expirationTime,h=f.childExpirationTime,c>e&&(e=c),h>e&&(e=h),f=f.sibling;d.childExpirationTime=e}if(null!==b)return b;null!==a&&(a.effectTag&2048)===D&&(null===a.firstEffect&&(a.firstEffect=V.firstEffect),null!==V.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=V.firstEffect),a.lastEffect=V.lastEffect),1<V.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=\nV:a.firstEffect=V,a.lastEffect=V))}else{b=si(V,W);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=V.sibling;if(null!==b)return b;V=a}while(null!==V);X===aj&&(X=fj);return null}function Lj(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Kj(a){var b=Wf();Yf(99,Wj.bind(null,a,b));return null}\nfunction Wj(a,b){Ej();if((T&(Zi|$i))!==S)throw t(Error(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw t(Error(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Lj(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=d-1);d<=a.lastPingedTime&&\n(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===U&&(V=U=null,W=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=T;T|=$i;Xi.current=null;de=Dd;var g=Yd();if(Zd(g)){if(\"selectionStart\"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,m=k.focusNode;k=k.focusOffset;\ntry{h.nodeType,m.nodeType}catch(Fb){h=null;break a}var A=0,w=-1,L=-1,wb=0,M=0,q=g,y=null;b:for(;;){for(var z;;){q!==h||0!==l&&3!==q.nodeType||(w=A+l);q!==m||0!==k&&3!==q.nodeType||(L=A+k);3===q.nodeType&&(A+=q.nodeValue.length);if(null===(z=q.firstChild))break;y=q;q=z}for(;;){if(q===g)break b;y===h&&++wb===l&&(w=A);y===m&&++M===k&&(L=A);if(null!==(z=q.nextSibling))break;q=y;y=q.parentNode}q=z}h=-1===w||-1===L?null:{start:w,end:L}}else h=null}h=h||{start:0,end:0}}else h=null;ee={focusedElem:g,selectionRange:h};\nDd=!1;Y=e;do try{Xj()}catch(Fb){if(null===Y)throw t(Error(330));xi(Y,Fb);Y=Y.nextEffect}while(null!==Y);Y=e;do try{for(g=a,h=b;null!==Y;){var p=Y.effectTag;p&16&&Tb(Y.stateNode,\"\");if(p&128){var u=Y.alternate;if(null!==u){var v=u.ref;null!==v&&(\"function\"===typeof v?v(null):v.current=null)}}switch(p&(E|12|Ac)){case E:Ki(Y);Y.effectTag&=~E;break;case 6:Ki(Y);Y.effectTag&=~E;Li(Y.alternate,Y);break;case Ac:Y.effectTag&=~Ac;break;case 1028:Y.effectTag&=~Ac;Li(Y.alternate,Y);break;case 4:Li(Y.alternate,\nY);break;case 8:l=Y,Hi(g,l,h),Ii(l)}Y=Y.nextEffect}}catch(Fb){if(null===Y)throw t(Error(330));xi(Y,Fb);Y=Y.nextEffect}while(null!==Y);v=ee;u=Yd();p=v.focusedElem;h=v.selectionRange;if(u!==p&&p&&p.ownerDocument&&Xd(p.ownerDocument.documentElement,p)){null!==h&&Zd(p)&&(u=h.start,v=h.end,void 0===v&&(v=u),\"selectionStart\"in p?(p.selectionStart=u,p.selectionEnd=Math.min(v,p.value.length)):(v=(u=p.ownerDocument||document)&&u.defaultView||window,v.getSelection&&(v=v.getSelection(),l=p.textContent.length,\ng=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!v.extend&&g>h&&(l=h,h=g,g=l),l=Wd(p,g),m=Wd(p,h),l&&m&&(1!==v.rangeCount||v.anchorNode!==l.node||v.anchorOffset!==l.offset||v.focusNode!==m.node||v.focusOffset!==m.offset)&&(u=u.createRange(),u.setStart(l.node,l.offset),v.removeAllRanges(),g>h?(v.addRange(u),v.extend(m.node,m.offset)):(u.setEnd(m.node,m.offset),v.addRange(u))))));u=[];for(v=p;v=v.parentNode;)1===v.nodeType&&u.push({element:v,left:v.scrollLeft,top:v.scrollTop});\"function\"===\ntypeof p.focus&&p.focus();for(p=0;p<u.length;p++)v=u[p],v.element.scrollLeft=v.left,v.element.scrollTop=v.top}ee=null;Dd=!!de;de=null;a.current=c;Y=e;do try{for(p=d;null!==Y;){var Bh=Y.effectTag;if(Bh&36){var cc=Y.alternate;u=Y;v=p;switch(u.tag){case 0:case 11:case 15:Ei(16,32,u);break;case 1:var ed=u.stateNode;if(u.effectTag&4)if(null===cc)ed.componentDidMount();else{var Zj=u.elementType===u.type?cc.memoizedProps:cg(u.type,cc.memoizedProps);ed.componentDidUpdate(Zj,cc.memoizedState,ed.__reactInternalSnapshotBeforeUpdate)}var Ch=\nu.updateQueue;null!==Ch&&Ag(u,Ch,ed,v);break;case 3:var Dh=u.updateQueue;if(null!==Dh){g=null;if(null!==u.child)switch(u.child.tag){case 5:g=u.child.stateNode;break;case 1:g=u.child.stateNode}Ag(u,Dh,g,v)}break;case 5:var pk=u.stateNode;null===cc&&u.effectTag&4&&(v=pk,fe(u.type,u.memoizedProps)&&v.focus());break;case 6:break;case 4:break;case 12:break;case 13:if(null===u.memoizedState){var zi=u.alternate;if(null!==zi){var Ai=zi.memoizedState;if(null!==Ai){var Bi=Ai.dehydrated;null!==Bi&&zc(Bi)}}}break;\ncase 19:case 17:case 20:case 21:break;default:throw t(Error(163));}}if(Bh&128){u=Y;var yd=u.ref;if(null!==yd){var Ci=u.stateNode;switch(u.tag){case 5:var yf=Ci;break;default:yf=Ci}\"function\"===typeof yd?yd(yf):yd.current=yf}}Y=Y.nextEffect}}catch(Fb){if(null===Y)throw t(Error(330));xi(Y,Fb);Y=Y.nextEffect}while(null!==Y);Y=null;Qf();T=f}else a.current=c;if(oj)oj=!1,pj=a,qj=b;else for(Y=e;null!==Y;)b=Y.nextEffect,Y.nextEffect=null,Y=b;b=a.firstPendingTime;0===b&&(Ui=null);1073741823===b?a===tj?sj++:\n(sj=0,tj=a):sj=0;\"function\"===typeof Yj&&Yj(c.stateNode,d);Z(a);if(Ri)throw Ri=!1,a=Si,Si=null,a;if((T&Yi)!==S)return null;bg();return null}function Xj(){for(;null!==Y;){var a=Y.effectTag;(a&256)!==D&&Di(Y.alternate,Y);(a&512)===D||oj||(oj=!0,Zf(97,function(){Ej();return null}));Y=Y.nextEffect}}function Ej(){if(90!==qj){var a=97<qj?97:qj;qj=90;return Yf(a,ak)}}\nfunction ak(){if(null===pj)return!1;var a=pj;pj=null;if((T&(Zi|$i))!==S)throw t(Error(331));var b=T;T|=$i;for(a=a.current.firstEffect;null!==a;){try{var c=a;if((c.effectTag&512)!==D)switch(c.tag){case 0:case 11:case 15:Ei(128,0,c),Ei(0,64,c)}}catch(d){if(null===a)throw t(Error(330));xi(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}T=b;bg();return!0}function bk(a,b,c){b=ti(c,b);b=Qi(a,b,1073741823);tg(a,b);a=wj(a,1073741823);null!==a&&Z(a)}\nfunction xi(a,b){if(3===a.tag)bk(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){bk(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Ui||!Ui.has(d))){a=ti(b,a);a=Ti(c,a,1073741823);tg(c,a);c=wj(c,1073741823);null!==c&&Z(c);break}}c=c.return}}\nfunction Sj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);U===a&&W===c?X===ej||X===dj&&1073741823===ij&&Vf()-Mi<nj?Fj(a,W):mj=!0:Bj(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,a.finishedExpirationTime===c&&(a.finishedExpirationTime=0,a.finishedWork=null),Z(a)))}function Oi(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=1;1===b&&(b=Fg(),b=Gg(b,a,null));a=wj(a,b);null!==a&&Z(a)}var Vj;\nVj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||K.current)mg=!0;else{if(d<c){mg=!1;switch(b.tag){case 3:hi(b);Xh();break;case 5:eh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:N(b.type)&&Bf(b);break;case 4:ch(b,b.stateNode.containerInfo);break;case 10:ig(b,b.memoizedProps.value);break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;if(0!==d&&d>=c)return ji(a,b,c);I(O,O.current&\n1,b);b=$h(a,b,c);return null!==b?b.sibling:null}I(O,O.current&1,b);break;case 19:d=b.childExpirationTime>=c;if((a.effectTag&64)!==D){if(d)return li(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);I(O,O.current,b);if(!d)return null}return $h(a,b,c)}mg=!1}}else mg=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=E);a=b.pendingProps;e=vf(b,J.current);lg(b,c);e=wh(null,b,d,a,e,c);b.effectTag|=1;if(\"object\"===\ntypeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;Ah();if(N(d)){var f=!0;Bf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Eg(b,d,g,a);e.updater=Ig;b.stateNode=e;e._reactInternalFiber=b;Mg(b,d,a,c);b=gi(null,b,d,!0,f,c)}else b.tag=0,R(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=E);a=b.pendingProps;Ua(e);if(1!==e._status)throw e._result;\ne=e._result;b.type=e;f=b.tag=ck(e);a=cg(e,a);switch(f){case 0:b=di(null,b,e,a,c);break;case 1:b=fi(null,b,e,a,c);break;case 11:b=Zh(null,b,e,a,c);break;case 14:b=ai(null,b,e,cg(e.type,a),d,c);break;default:throw t(Error(306),e,\"\");}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:cg(d,e),di(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:cg(d,e),fi(a,b,d,e,c);case 3:hi(b);d=b.updateQueue;if(null===d)throw t(Error(282));e=b.memoizedState;e=null!==e?e.element:\nnull;xg(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)Xh(),b=$h(a,b,c);else{if(e=b.stateNode.hydrate)Ph=je(b.stateNode.containerInfo.firstChild),Oh=b,e=Qh=!0;if(e)for(c=Xg(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&~E|Ac,c=c.sibling;else R(a,b,d,c),Xh();b=b.child}return b;case 5:return eh(b),null===a&&Uh(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,ge(d,e)?g=null:null!==f&&ge(d,f)&&(b.effectTag|=16),ei(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=\nb.childExpirationTime=1,b=null):(R(a,b,g,c),b=b.child),b;case 6:return null===a&&Uh(b),null;case 13:return ji(a,b,c);case 4:return ch(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Wg(b,null,d,c):R(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:cg(d,e),Zh(a,b,d,e,c);case 7:return R(a,b,b.pendingProps,c),b.child;case 8:return R(a,b,b.pendingProps.children,c),b.child;case 12:return R(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;\ne=b.pendingProps;g=b.memoizedProps;f=e.value;ig(b,f);if(null!==g){var h=g.value;f=ff(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!K.current){b=$h(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==k){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=rg(c,null),l.tag=2,tg(h,l));h.expirationTime<c&&(h.expirationTime=\nc);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);kg(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=g}}R(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,lg(b,c),e=ng(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,R(a,b,d,c),b.child;\ncase 14:return e=b.type,f=cg(e,b.pendingProps),f=cg(e.type,f),ai(a,b,e,f,d,c);case 15:return ci(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:cg(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=E),b.tag=1,N(d)?(a=!0,Bf(b)):a=!1,lg(b,c),Kg(b,d,e,c),Mg(b,d,e,c),gi(null,b,d,!0,a,c);case 19:return li(a,b,c)}throw t(Error(156),b.tag);};var Yj=null,Gi=null;\nfunction dk(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Yj=function(a){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(e){}};Gi=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}\nfunction ek(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=D;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Sh(a,b,c,d){return new ek(a,b,c,d)}\nfunction bi(a){a=a.prototype;return!(!a||!a.isReactComponent)}function ck(a){if(\"function\"===typeof a)return bi(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Na)return 11;if(a===Qa)return 14}return 2}\nfunction Rg(a,b){var c=a.alternate;null===c?(c=Sh(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=D,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,\nfirstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Tg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)bi(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case Ha:return Vg(c.children,e,f,b);case Ma:g=8;e|=7;break;case Ia:g=8;e|=1;break;case Ja:return a=Sh(12,c,b,e|8),a.elementType=Ja,a.type=Ja,a.expirationTime=f,a;case Oa:return a=Sh(13,c,b,e),a.type=Oa,a.elementType=Oa,a.expirationTime=f,a;case Pa:return a=Sh(19,c,b,e),a.elementType=Pa,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ka:g=\n10;break a;case La:g=9;break a;case Na:g=11;break a;case Qa:g=14;break a;case Ra:g=16;d=null;break a}throw t(Error(130),null==a?a:typeof a,\"\");}b=Sh(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Vg(a,b,c,d){a=Sh(7,a,d,b);a.expirationTime=c;return a}function Sg(a,b,c){a=Sh(6,a,null,b);a.expirationTime=c;return a}\nfunction Ug(a,b,c){b=Sh(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction fk(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=this.firstBatch=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}\nfunction Bj(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function yj(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}\nfunction zj(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Dj(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}\nfunction gk(a,b,c,d,e,f){var g=b.current;a:if(c){c=c._reactInternalFiber;b:{if(Bc(c)!==c||1!==c.tag)throw t(Error(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(N(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw t(Error(171));}if(1===c.tag){var k=c.type;if(N(k)){c=Af(c,k,h);break a}}c=h}else c=tf;null===b.context?b.context=c:b.pendingContext=c;b=f;e=rg(d,e);e.payload={element:a};b=void 0===b?null:b;null!==b&&\n(e.callback=b);tg(g,e);Hg(g,d);return d}function hk(a,b,c,d){var e=b.current,f=Fg(),g=Cg.suspense;e=Gg(f,e,g);return gk(a,b,c,e,g,d)}function ik(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function jk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:Ga,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nYa=function(a,b,c){switch(b){case \"input\":Db(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=re(d);if(!e)throw t(Error(90));zb(d);Db(d,e)}}}break;case \"textarea\":Mb(a,c);break;case \"select\":b=c.value,null!=b&&Jb(a,!!c.multiple,b,!1)}};\nfunction kk(a){var b=1073741821-25*(((1073741821-Fg()+500)/25|0)+1);b<=vj&&--b;this._expirationTime=vj=b;this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0}kk.prototype.render=function(a){if(!this._defer)throw t(Error(250));this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new lk;gk(a,b,null,c,null,d._onCommit);return d};\nkk.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nkk.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;if(!this._defer||null===b)throw t(Error(251));if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;if(null===d)throw t(Error(251));d._next=e._next;this._next=b;a.firstBatch=this}this._defer=!1;b=c;if((T&(Zi|$i))!==S)throw t(Error(253));Dj(a,b);Z(a);bg();b=this._next;this._next=null;\nb=a.firstBatch=b;null!==b&&b._hasChildren&&b.render(b._children)}else this._next=null,this._defer=!1};kk.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++)(0,a[b])()}};function lk(){this._callbacks=null;this._didCommit=!1;this._onCommit=this._onCommit.bind(this)}lk.prototype.then=function(a){if(this._didCommit)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nlk.prototype._onCommit=function(){if(!this._didCommit){this._didCommit=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++){var c=a[b];if(\"function\"!==typeof c)throw t(Error(191),c);c()}}};function mk(a,b,c){c=null!=c&&!0===c.hydrate;var d=new fk(a,b,c),e=Sh(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;a[oe]=d.current;c&&0!==b&&nc(9===a.nodeType?a:a.ownerDocument);return d}function nk(a,b,c){this._internalRoot=mk(a,b,c)}function ok(a,b){this._internalRoot=mk(a,2,b)}\nok.prototype.render=nk.prototype.render=function(a,b){var c=this._internalRoot,d=new lk;b=void 0===b?null:b;null!==b&&d.then(b);hk(a,c,null,d._onCommit);return d};ok.prototype.unmount=nk.prototype.unmount=function(a){var b=this._internalRoot,c=new lk;a=void 0===a?null:a;null!==a&&c.then(a);hk(null,b,null,c._onCommit);return c};\nok.prototype.createBatch=function(){var a=new kk(this),b=a._expirationTime,c=this._internalRoot,d=c.firstBatch;if(null===d)c.firstBatch=a,a._next=null;else{for(c=null;null!==d&&d._expirationTime>=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a)}return a};function qk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}db=Pj;eb=Qj;fb=Nj;gb=function(a,b){var c=T;T|=2;try{return a(b)}finally{T=c,T===S&&bg()}};\nfunction rk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new nk(a,0,b?{hydrate:!0}:void 0)}\nfunction sk(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=ik(g);h.call(a)}}hk(b,g,a,e)}else{f=c._reactRootContainer=rk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=ik(g);k.call(a)}}Rj(function(){hk(b,g,a,e)})}return ik(g)}function tk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!qk(b))throw t(Error(200));return jk(a,b,null,c)}\nvar wk={createPortal:tk,findDOMNode:function(a){if(null==a)a=null;else if(1!==a.nodeType){var b=a._reactInternalFiber;if(void 0===b){if(\"function\"===typeof a.render)throw t(Error(188));throw t(Error(268),Object.keys(a));}a=Ec(b);a=null===a?null:a.stateNode}return a},hydrate:function(a,b,c){if(!qk(b))throw t(Error(200));return sk(null,a,b,!0,c)},render:function(a,b,c){if(!qk(b))throw t(Error(200));return sk(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){if(!qk(c))throw t(Error(200));\nif(null==a||void 0===a._reactInternalFiber)throw t(Error(38));return sk(a,b,c,!1,d)},unmountComponentAtNode:function(a){if(!qk(a))throw t(Error(40));return a._reactRootContainer?(Rj(function(){sk(null,null,a,!1,function(){a._reactRootContainer=null})}),!0):!1},unstable_createPortal:function(){return tk.apply(void 0,arguments)},unstable_batchedUpdates:Pj,unstable_interactiveUpdates:function(a,b,c,d){Nj();return Qj(a,b,c,d)},unstable_discreteUpdates:Qj,unstable_flushDiscreteUpdates:Nj,flushSync:function(a,\nb){if((T&(Zi|$i))!==S)throw t(Error(187));var c=T;T|=1;try{return Yf(99,a.bind(null,b))}finally{T=c,bg()}},unstable_createRoot:uk,unstable_createSyncRoot:vk,unstable_flushControlled:function(a){var b=T;T|=1;try{Yf(99,a)}finally{T=b,T===S&&bg()}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[pe,qe,re,Ba.injectEventPluginsByName,fa,Lc,function(a){xa(a,Kc)},bb,cb,Hd,Aa,Ej,{current:!1}]}};function uk(a,b){if(!qk(a))throw t(Error(299),\"unstable_createRoot\");return new ok(a,b)}\nfunction vk(a,b){if(!qk(a))throw t(Error(299),\"unstable_createRoot\");return new nk(a,1,b)}\n(function(a){var b=a.findFiberByHostInstance;return dk(n({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Da.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Ec(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Cd,bundleType:0,version:\"16.10.2\",\nrendererPackageName:\"react-dom\"});var xk={default:wk},yk=xk&&wk||xk;module.exports=yk.default||yk;\n\n},{\"react\":\"ccIB\",\"object-assign\":\"x5u5\",\"scheduler\":\"dH6z\"}],\"x9tB\":[function(require,module,exports) {\n'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function') {\n    return;\n  }\n\n  if (\"production\" !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (\"production\" === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n},{\"./cjs/react-dom.production.min.js\":\"MtQn\"}],\"dQNc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.IconButton = IconButton;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction IconButton(props) {\n  return React.createElement(_base.base.fabric.IconButton, Object.assign({}, props, {\n    styles: {\n      rootHovered: {\n        color: props.themePalette.themePrimary\n      },\n      menuIcon: {\n        display: 'none'\n      }\n    },\n    iconProps: {\n      iconName: props.iconName\n    },\n    menuProps: props.menuProps\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"hk5u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.strings = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar strings = {\n  appName: 'SandDance',\n  bingsearch: 'Bing',\n  buttonClose: 'Close',\n  buttonSelect: 'Search & Select',\n  buttonColorSchemeMap: 'Map color scheme to filtered data',\n  buttonColorSchemeRemap: 'Remap color to filtered data',\n  buttonColorSchemeKeep: 'Keep same color scheme',\n  buttonCopyToClipboard: 'Copy to clipboard',\n  buttonExclude: 'Exclude',\n  buttonExport: 'Export',\n  buttonExportCount: function buttonExportCount(total) {\n    return total == 1 ? 'Export 1 row...' : \"Export \".concat(total, \" rows...\");\n  },\n  buttonIsolate: 'Isolate',\n  buttonReset: 'Stop filtering',\n  buttonDeselect: 'Clear selection',\n  buttonToolbarFloat: 'Float toolbar',\n  buttonToolbarDock: 'Dock toolbar',\n  buttonToolbarHide: 'Hide toolbar',\n  buttonToolbarShow: 'Show toolbar',\n  buttonNextDataItem: 'Next data item',\n  buttonPrevDataItem: 'Previous data item',\n  buttonCreateSnapshot: 'Create snapshot',\n  buttonAddExpression: 'add expression',\n  buttonAddExpressionGroup: 'add group',\n  buttonDeleteExpression: 'delete',\n  buttonDeleteExpressionGroup: 'delete group',\n  buttonDeleteSnapshot: 'delete snapshot',\n  buttonShowVegaSpec: 'Show Vega spec',\n  buttonLaunchVegaEditor: 'Open Vega Editor',\n  buttonCameraHome: 'Center chart in window',\n  buttonTooltipMapping: 'Tooltip columns...',\n  chartTypeBarChartH: 'Bar',\n  chartTypeBarChartV: 'Column',\n  chartTypeDensity: 'Density',\n  chartTypeGrid: 'Grid',\n  chartTypeScatterPlot: 'Scatter',\n  chartTypeStacks: 'Stacks',\n  chartTypeTreeMap: 'Treemap',\n  defaultFileName: 'sanddance-data',\n  errorExportFilenameEmpty: 'Filename cannot be blank',\n  errorExportFilenameCharacters: function errorExportFilenameCharacters(characters) {\n    return \"A filename cannot contain any of the following characters: \".concat(characters);\n  },\n  errorColumnMustBeNumeric: 'Numeric column required for this chart type.',\n  labelBlank: 'blank',\n  labelNull: 'null',\n  labelTrue: 'true',\n  labelFalse: 'false',\n  labelSystemInfo: 'System info',\n  labelChartSettings: 'Chart settings',\n  labelDataBrowser: 'Data browser',\n  labelDataScope: 'Scope',\n  labelExport: 'Export Data',\n  labelExportFormat: 'File format',\n  labelExportCSV: '.CSV - Comma separated values',\n  labelExportHTML: '.HTML - A SandDance html page embedding this data',\n  labelExportJSON: '.JSON - JavaScript object notation',\n  labelExportTSV: '.TSV - Tab separated values',\n  labelTools: 'Tools',\n  labelVegaSpec: 'Vega specification',\n  labelColor: 'Chart color',\n  labelError: 'Error',\n  labelExportFileName: 'File name',\n  labelSnapshots: 'Snapshots',\n  labelSearch: 'Select by search',\n  labelChart: 'Chart',\n  labelChartCanvas: 'Chart canvas',\n  labelColumnMapping: 'Column Mapping',\n  labelChartTypeOptions: 'Chart options',\n  labelColorBin: 'Color binning',\n  labelColorOptions: 'Color options',\n  labelColorBinExplanation: 'For numeric columns',\n  labelColorFieldInfo: function labelColorFieldInfo(colorColumnName, colorColumnType, categoricalNumeric, distinctValueCount) {\n    return \"Field <span className=\\\"fieldname\\\">\".concat(colorColumnName, \"</span> is of type <span className=\\\"fieldtype\\\">\").concat(colorColumnType, \"</span>\").concat(categoricalNumeric ? \" and has \".concat(distinctValueCount, \" distinct values\") : '', \".\");\n  },\n  labelColorFieldIsColorData: function labelColorFieldIsColorData(colorColumnName) {\n    return \"Field <span className=\\\"fieldname\\\">\".concat(colorColumnName, \"</span> contains direct color data.\");\n  },\n  labelColorBinNone: 'None (continuous)',\n  labelColorBinQuantize: 'Quantize',\n  labelColorBinQuantile: 'Quantile',\n  labelColorFilter: 'Note: Colors will be re-mapped to the filter when viewing this snapshot.',\n  labelColorScheme: 'Scheme',\n  labelColumnColor: 'Color by',\n  labelColumnFacet: 'Facet by',\n  labelColumnSort: 'Sort by',\n  labelColumnX: 'X Axis',\n  labelColumnY: 'Y Axis',\n  labelColumnZ: 'Z Axis',\n  labelColumnSize: 'Size by',\n  labelColumnGroup: 'Group by',\n  labelAliasColor: 'Color',\n  labelAliasFacet: 'Facet',\n  labelAliasSort: 'Sort',\n  labelAliasX: 'X Axis',\n  labelAliasY: 'Y Axis',\n  labelAliasZ: 'Z Axis',\n  labelAliasSize: 'Size',\n  labelAliasGroup: 'Group',\n  labelDataItemIsFiltered: 'Item is filtered from view',\n  labelShowLegend: 'Show legend',\n  labelShowAxes: 'Show axes',\n  labelSnapshotDescription: 'Description',\n  labelTooltipMapping: 'Tooltip columns',\n  labelTransitionDurations: 'Transition durations',\n  labelTransitionCamera: '2D / 3D view',\n  labelTransitionColor: 'Color',\n  labelTransitionPosition: 'Position',\n  labelTransitionSize: 'Size',\n  labelVegaSpecData: 'Data reference',\n  labelVegaSpecNotes: 'Note: You may need to change the color scheme to make this visible in Vega.',\n  labelYes: 'Yes',\n  labelNo: 'No',\n  loading: 'Loading...',\n  schemeCategorical: 'Categorical',\n  schemeDiverging: 'Diverging',\n  schemeDual: 'Dual',\n  schemeSequentialMultiHue: 'Sequential Multi Hue',\n  schemeSequentialSingleHue: 'Sequential Single Hue',\n  selectDataSpanAll: 'All rows',\n  selectDataSpanFilter: 'Filtered',\n  selectDataSpanSelection: 'Selected',\n  selectVegaSpecDataNone: 'None',\n  selectVegaSpecDataInline: 'Inline - WARNING this may use substantial browser/clipboard memory for large data sets.',\n  selectVegaSpecDataUrl: 'URL',\n  record: function record(current, total) {\n    return \"\".concat(current, \" of \").concat(total);\n  },\n  searchEQ: '=',\n  searchNEQ: '<>',\n  searchGT: '>',\n  searchGTE: '>=',\n  searchLT: '<',\n  searchLTE: '<=',\n  searchNULL: 'is null or empty',\n  searchIN: 'contains',\n  searchSW: 'starts with',\n  searchWHERE: 'Where',\n  searchAND: 'and',\n  searchOR: 'or',\n  selectAny: '-- any --',\n  selectNone: '-- none --',\n  selectNumeric: 'Numeric',\n  selectNonNumeric: 'Categorical',\n  selectDirectColor: 'Direct color',\n  selectReference: 'Column mappings',\n  tooltipSearch: function tooltipSearch(column, value) {\n    return \"Click to search in '\".concat(column, \"' for \\\"\").concat(value, \"\\\"\");\n  },\n  labelRequired: 'required',\n  labelSystem: 'System',\n  lavelViewType2d: 'View in 2D',\n  labelViewType3d: 'View in 3D',\n  labelDataColors: 'Enabled if this data column contains any CSS color values.',\n  labelDataNullAll: 'Loading data...',\n  labelDataNullFiltered: 'You can filter by first making a selection, then choosing <b>Isolate</b> or <b>Exclude</b> in the top bar.',\n  labelDataNullSelection: 'You can select by: <ul><li>clicking the chart axes</li><li>clicking in the legend</li><li>searching</li</ul>',\n  labelZeroAll: 'Dataset contains zero rows.',\n  labelZeroSearchResults: 'No rows matched your search.',\n  signalGroups: [{\n    prefix: 'Chart',\n    label: 'Chart options'\n  }, {\n    prefix: 'Mark',\n    label: 'Mark options'\n  }, {\n    prefix: 'RoleColor',\n    label: 'Color options'\n  }, {\n    prefix: 'RoleFacet',\n    label: 'Facet options'\n  }, {\n    prefix: 'RoleSort',\n    label: 'Sort options'\n  }, {\n    prefix: 'RoleX',\n    label: 'X axis options'\n  }, {\n    prefix: 'RoleY',\n    label: 'Y axis options'\n  }, {\n    prefix: 'RoleZ',\n    label: 'Z axis options'\n  }, {\n    prefix: 'Text',\n    label: 'Text options'\n  }, {\n    prefix: '*',\n    label: 'Options'\n  }]\n};\nexports.strings = strings;\n},{}],\"E67y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.applyColorButtons = applyColorButtons;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar ReactDOM = _interopRequireWildcard(require(\"react-dom\"));\n\nvar _iconButton = require(\"./controls/iconButton\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"./language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar className = 'sanddance-panel-tools';\n\nfunction ensureToolbar(panel) {\n  var existing = panel.getElementsByClassName(className);\n\n  if (existing.length > 0) {\n    return existing[0];\n  } else {\n    var div = _sanddanceReact.SandDance.VegaDeckGl.util.addDiv(panel, className);\n\n    panel.insertAdjacentElement('afterbegin', div);\n    return div;\n  }\n}\n\nfunction applyColorButtons(presenter, showLegend, props) {\n  var panel = presenter.getElement(_sanddanceReact.SandDance.VegaDeckGl.PresenterElement.panel);\n  var div = ensureToolbar(panel);\n  ReactDOM.render(ColorMap(props), div);\n  panel.style.display = showLegend ? '' : 'none';\n}\n\nfunction ColorMap(props) {\n  var menuProps = {\n    items: [{\n      key: 'new',\n      text: _language.strings.buttonColorSchemeRemap,\n      disabled: !props.canRemap || props.isRemap,\n      onClick: function onClick() {\n        return props.colorMapHandler(true);\n      }\n    }, {\n      key: 'old',\n      text: _language.strings.buttonColorSchemeKeep,\n      disabled: !props.canRemap || !props.isRemap,\n      onClick: function onClick() {\n        return props.colorMapHandler(false);\n      }\n    }]\n  };\n  return React.createElement(\"div\", null, React.createElement(_iconButton.IconButton, {\n    themePalette: props.themePalette,\n    title: _language.strings.buttonColorSchemeMap,\n    onClick: null,\n    iconName: props.canRemap ? 'FiltersSolid' : 'Filters',\n    menuProps: menuProps\n  }));\n}\n},{\"react\":\"ccIB\",\"react-dom\":\"x9tB\",\"./controls/iconButton\":\"dQNc\",\"@msrvida/sanddance-react\":\"MjKu\",\"./language\":\"hk5u\"}],\"L8O2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.bestColorScheme = bestColorScheme;\n\nfunction bestColorScheme(newColumn, oldColumn, oldScheme) {\n  if (oldColumn && oldColumn.quantitative === newColumn.quantitative && defaultColorScheme(oldColumn) === defaultColorScheme(newColumn)) {\n    return oldScheme;\n  }\n\n  return defaultColorScheme(newColumn);\n}\n\nfunction defaultColorScheme(c) {\n  if (c.quantitative) {\n    return 'redyellowgreen';\n  } else if (c.stats.distinctValueCount === 2) {\n    return 'dual_redgreen';\n  } else if (c.stats.distinctValueCount <= 10) {\n    return 'category10';\n  }\n\n  return 'category20';\n}\n},{}],\"Uyrp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Dropdown = Dropdown;\nexports.dropdownWidth = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar dropdownWidth = 200;\nexports.dropdownWidth = dropdownWidth;\n\nfunction Dropdown(props) {\n  var selectedKey = null;\n\n  if (props.options && props.options.length > 1) {\n    var selectedOptions = props.options.filter(function (option) {\n      return option.selected;\n    });\n\n    if (selectedOptions && selectedOptions.length > 0) {\n      selectedKey = selectedOptions[0].key;\n    }\n  }\n\n  return React.createElement(_base.base.fabric.Dropdown, Object.assign({\n    dropdownWidth: dropdownWidth\n  }, props, {\n    label: props.collapseLabel ? null : props.label,\n    selectedKey: selectedKey,\n    onRenderTitle: props.collapseLabel && function (a, b) {\n      return React.createElement(\"span\", null, props.label, \": \", a[0].text);\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"OWDI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Signal = Signal;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Signal(props) {\n  if (!props.explorer.viewer || !props.signal) {\n    return null;\n  }\n\n  if (props.signal.bind) {\n    var input = props.signal.bind.input;\n\n    if (input) {\n      var fn = map[input];\n\n      if (fn) {\n        var prefix = props.prefix ? \"\".concat(props.prefix, \" \") : '';\n        var initialValue;\n\n        try {\n          initialValue = props.explorer.viewer.vegaViewGl.signal(props.signal.name);\n        } catch (error) {// continue regardless of error\n        }\n\n        var control = fn(prefix, props.signal.bind, initialValue, function (value) {\n          props.onChange && props.onChange(value);\n          props.explorer.signal(props.signal.name, value);\n        }, props.disabled);\n        return React.createElement(\"div\", {\n          className: \"sanddance-signal\"\n        }, control);\n      }\n    }\n  }\n\n  return null;\n}\n\nvar map = {};\n\nmap['range'] = function (prefix, bind, initialValue, onChange, disabled) {\n  return React.createElement(_base.base.fabric.Slider, {\n    label: prefix + bind.name,\n    max: bind.max,\n    min: bind.min,\n    step: bind.step,\n    value: initialValue,\n    onChange: onChange,\n    disabled: disabled\n  });\n};\n\nmap['select'] = function (prefix, bind, initialValue, _onChange, disabled) {\n  var options = bind.options.map(function (o, i) {\n    var option = {\n      key: o,\n      text: o\n    };\n    return option;\n  });\n  return React.createElement(_base.base.fabric.Dropdown, {\n    defaultSelectedKey: initialValue,\n    label: prefix + bind.name,\n    options: options,\n    onChange: function onChange(e, o) {\n      return _onChange(o.text);\n    },\n    disabled: disabled\n  });\n};\n\nmap['checkbox'] = function (prefix, bind, initialValue, _onChange2, disabled) {\n  return React.createElement(_base.base.fabric.Toggle, {\n    defaultChecked: initialValue,\n    label: prefix + bind.name,\n    onChange: function onChange(e, checked) {\n      return _onChange2(checked);\n    },\n    disabled: disabled\n  });\n}; //TODO other signal types\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"DSho\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ColumnMap = ColumnMap;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dropdown = require(\"./dropdown\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _signal = require(\"./signal\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar maxFacets = 50;\nvar roleLabels = {\n  color: _language.strings.labelColumnColor,\n  facet: _language.strings.labelColumnFacet,\n  group: _language.strings.labelColumnGroup,\n  size: _language.strings.labelColumnSize,\n  sort: _language.strings.labelColumnSort,\n  uid: null,\n  x: _language.strings.labelColumnX,\n  y: _language.strings.labelColumnY,\n  z: _language.strings.labelColumnZ\n};\nvar aliasLabels = {\n  color: _language.strings.labelAliasColor,\n  facet: _language.strings.labelAliasFacet,\n  group: _language.strings.labelAliasGroup,\n  size: _language.strings.labelAliasSize,\n  sort: _language.strings.labelAliasSort,\n  uid: null,\n  x: _language.strings.labelAliasX,\n  y: _language.strings.labelAliasY,\n  z: _language.strings.labelAliasZ\n};\n\nfunction filterColumnList(context, columns) {\n  switch (context) {\n    case 'facet':\n      return columns.filter(function (column) {\n        return column.quantitative || column.stats.distinctValueCount && column.stats.distinctValueCount < maxFacets;\n      });\n\n    default:\n      return columns.slice();\n  }\n}\n\nfunction optionsForSpecColumn(sectionName, columns, role, selectedColumnName) {\n  var filtered = filterColumnList(role, columns);\n  var options = filtered.map(function (column) {\n    var option = {\n      key: \"column:\".concat(column.name),\n      text: column.name,\n      data: column,\n      selected: selectedColumnName === column.name\n    };\n    return option;\n  });\n\n  if (options.length) {\n    var option = {\n      key: sectionName,\n      text: sectionName,\n      itemType: _base.base.fabric.DropdownMenuItemType.Header\n    };\n    options.unshift(option);\n  }\n\n  return options;\n}\n\nfunction optionsForReference(sectionName, specRoles) {\n  var options = specRoles.map(function (specRole) {\n    var option = {\n      key: \"role:\".concat(specRole.role),\n      text: aliasLabels[specRole.role],\n      data: specRole.role\n    };\n    return option;\n  }).sort(function (a, b) {\n    return a.text.localeCompare(b.text);\n  });\n\n  if (options.length) {\n    var option = {\n      key: sectionName,\n      text: sectionName,\n      itemType: _base.base.fabric.DropdownMenuItemType.Header\n    };\n    options.unshift(option);\n  }\n\n  return options;\n}\n\nfunction selectFirst(options) {\n  for (var i = 0; i < options.length; i++) {\n    if (options[i].itemType === _base.base.fabric.DropdownMenuItemType.Header) continue;\n    options[i].selected = true;\n    return;\n  }\n}\n\nfunction ColumnMap(props) {\n  if (!props.specRole) return null;\n  var categoricalColumns;\n  var directColorColumns;\n  var directColorGroup;\n  var referenceGroup = [];\n\n  if (props.specRole.role === 'color') {\n    categoricalColumns = props.categoricalColumns.filter(function (c) {\n      return !c.isColorData;\n    });\n    directColorColumns = props.categoricalColumns.filter(function (c) {\n      return c.isColorData;\n    });\n    directColorGroup = optionsForSpecColumn(_language.strings.selectDirectColor, directColorColumns, 'color', props.selectedColumnName);\n  } else {\n    categoricalColumns = props.categoricalColumns;\n  }\n\n  if (props.specRole.role === 'sort') {\n    var others = props.specCapabilities.roles.filter(function (specRole) {\n      return specRole.role !== props.specRole.role;\n    });\n    referenceGroup = optionsForReference(_language.strings.selectReference, others);\n  }\n\n  var quantitativeGroup = optionsForSpecColumn(_language.strings.selectNumeric, props.quantitativeColumns, props.specRole.role, props.selectedColumnName);\n  var categoricGroup = props.specRole.excludeCategoric ? null : optionsForSpecColumn(_language.strings.selectNonNumeric, categoricalColumns, props.specRole.role, props.selectedColumnName);\n  var options = referenceGroup.concat(quantitativeGroup).concat(categoricGroup).concat(directColorGroup).filter(Boolean);\n\n  if (props.specRole.allowNone) {\n    options.unshift({\n      key: -1,\n      text: _language.strings.selectNone\n    });\n  }\n\n  var hasSelection = options.reduce(function (p, c) {\n    return p || c.selected;\n  }, false);\n\n  if (!hasSelection) {\n    selectFirst(options);\n  }\n\n  var signals;\n\n  if (props.explorer.viewer && props.explorer.viewer.vegaSpec) {\n    if (props.specRole.signals) {\n      signals = props.explorer.viewer.vegaSpec.signals.filter(function (s) {\n        return props.specRole.signals.indexOf(s.name) >= 0;\n      });\n    }\n  }\n\n  var label = roleLabels[props.specRole.role];\n  return React.createElement(\"div\", {\n    className: \"sanddance-columnMap\"\n  }, React.createElement(_dropdown.Dropdown, {\n    componentRef: props.componentRef,\n    collapseLabel: true,\n    disabled: props.disabled,\n    label: label,\n    options: options,\n    onChange: function onChange(e, o) {\n      return props.changeColumnMapping(props.specRole.role, typeof o.data === 'string' ? o.data : _sanddanceReact.SandDance.VegaDeckGl.util.clone(o.data));\n    },\n    onDismiss: props.onDismiss\n  }), !props.hideSignals && signals && signals.map(function (signal, i) {\n    return React.createElement(_signal.Signal, {\n      key: i,\n      explorer: props.explorer,\n      signal: signal,\n      onChange: function onChange(value) {\n        return props.onChangeSignal && props.onChangeSignal(signal.name, value);\n      }\n    });\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./dropdown\":\"Uyrp\",\"@msrvida/sanddance-react\":\"MjKu\",\"./signal\":\"OWDI\",\"../language\":\"hk5u\"}],\"cFWm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Dialog = Dialog;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Dialog(props) {\n  return React.createElement(_base.base.fabric.Dialog, Object.assign({\n    className: \"sanddance-dialog\"\n  }, props, {\n    dialogContentProps: {\n      type: _base.base.fabric.DialogType.normal,\n      title: props.title\n    }\n  }), props.children, React.createElement(_base.base.fabric.DialogFooter, null, props.buttons, React.createElement(_base.base.fabric.DefaultButton, {\n    onClick: props.onDismiss,\n    text: _language.strings.buttonClose\n  })));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../language\":\"hk5u\"}],\"Q3hf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Group = Group;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Group(props) {\n  return React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-group', props.className)\n  }, React.createElement(\"div\", {\n    className: \"group-head\"\n  }, React.createElement(\"label\", null, props.label), props.labelCount && React.createElement(\"span\", {\n    className: \"count\"\n  }, \"(\", props.labelCount, \")\")), props.children && React.createElement(\"div\", {\n    className: \"group-body\"\n  }, props.children));\n}\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"ZOmP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ToggleColumns = ToggleColumns;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction ToggleColumns(props) {\n  return React.createElement(\"div\", null, props.allColumns.map(function (c, i) {\n    return React.createElement(\"div\", {\n      key: c.name\n    }, React.createElement(\"label\", null, React.createElement(_base.base.fabric.Toggle, {\n      checked: props.exclusions.indexOf(c.name) < 0,\n      inlineLabel: true,\n      label: c.name,\n      onChange: function onChange() {\n        return props.toggleExclusion(c.name);\n      }\n    })));\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"NGSt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Chart = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _columnMap = require(\"../controls/columnMap\");\n\nvar _dialog = require(\"../controls/dialog\");\n\nvar _group = require(\"../controls/group\");\n\nvar _signal = require(\"../controls/signal\");\n\nvar _language = require(\"../language\");\n\nvar _toggleColumns = require(\"../controls/toggleColumns\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Chart =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Chart, _React$Component);\n\n  function Chart(props) {\n    var _this;\n\n    _classCallCheck(this, Chart);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Chart).call(this, props));\n    _this.state = {\n      showTooltipDialog: false\n    };\n    return _this;\n  }\n\n  _createClass(Chart, [{\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var props = this.props;\n      var signals = props.explorer.viewer && props.explorer.viewer.vegaSpec && props.specCapabilities && props.specCapabilities.signals && props.explorer.viewer.vegaSpec.signals.filter(function (s) {\n        return props.specCapabilities.signals.indexOf(s.name) >= 0;\n      });\n      return React.createElement(\"div\", null, React.createElement(_group.Group, {\n        label: _language.strings.labelChart\n      }, React.createElement(\"div\", {\n        className: \"calculator\"\n      }, React.createElement(_base.base.fabric.ChoiceGroup, {\n        className: \"sanddance-chart-type\",\n        options: [{\n          key: 'grid',\n          text: _language.strings.chartTypeGrid\n        }, {\n          key: 'scatterplot',\n          text: _language.strings.chartTypeScatterPlot\n        }, {\n          key: 'density',\n          text: _language.strings.chartTypeDensity\n        }, {\n          key: 'barchartV',\n          text: _language.strings.chartTypeBarChartV\n        }, {\n          key: 'barchartH',\n          text: _language.strings.chartTypeBarChartH\n        }, {\n          key: 'treemap',\n          text: _language.strings.chartTypeTreeMap\n        }, {\n          key: 'stacks',\n          text: _language.strings.chartTypeStacks\n        }].map(function (o) {\n          return Object.assign(Object.assign({}, o), {\n            checked: props.chart === o.key,\n            disabled: props.disabled\n          });\n        }),\n        onChange: function onChange(e, o) {\n          return props.onChangeChartType(o.key);\n        }\n      }))), signals && React.createElement(_group.Group, {\n        label: _language.strings.labelChartTypeOptions\n      }, signals.map(function (signal, i) {\n        return React.createElement(_signal.Signal, {\n          key: i,\n          signal: signal,\n          explorer: props.explorer,\n          disabled: props.disabled\n        });\n      })), React.createElement(_group.Group, {\n        label: _language.strings.labelColumnMapping\n      }, React.createElement(\"div\", null, props.specCapabilities && props.specCapabilities.roles.map(function (specRole, i) {\n        var specColumnInRole = props.insightColumns[specRole.role];\n        var selectedColumnName = specColumnInRole;\n        var disabled = props.disabled || props.view === '2d' && specRole.role === 'z';\n        return React.createElement(_columnMap.ColumnMap, Object.assign({}, props, {\n          disabled: disabled,\n          selectedColumnName: selectedColumnName,\n          specRole: specRole,\n          key: i,\n          onChangeSignal: function onChangeSignal(name, value) {\n            return props.onChangeSignal(specRole.role, selectedColumnName, name, value);\n          }\n        }));\n      }), React.createElement(\"div\", {\n        className: \"sanddance-tooltipMap\"\n      }, React.createElement(_base.base.fabric.DefaultButton, {\n        text: _language.strings.buttonTooltipMapping,\n        onClick: function onClick() {\n          return _this2.setState({\n            showTooltipDialog: true\n          });\n        }\n      })))), React.createElement(_dialog.Dialog, {\n        hidden: !this.state.showTooltipDialog,\n        onDismiss: function onDismiss() {\n          return _this2.setState({\n            showTooltipDialog: false\n          });\n        },\n        title: _language.strings.labelTooltipMapping\n      }, React.createElement(_toggleColumns.ToggleColumns, {\n        allColumns: props.allColumns,\n        exclusions: props.tooltipExclusions,\n        toggleExclusion: props.toggleTooltipExclusion\n      })));\n    }\n  }]);\n\n  return Chart;\n}(React.Component);\n\nexports.Chart = Chart;\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../controls/columnMap\":\"DSho\",\"../controls/dialog\":\"cFWm\",\"../controls/group\":\"Q3hf\",\"../controls/signal\":\"OWDI\",\"../language\":\"hk5u\",\"../controls/toggleColumns\":\"ZOmP\"}],\"BSWy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.schemeOption = schemeOption;\nexports.schemesJSX = void 0;\n\nfunction schemeOption(selected, scheme) {\n  return {\n    key: scheme,\n    text: scheme,\n    selected: selected === scheme,\n    scheme: scheme,\n    children: schemesJSX[scheme]\n  };\n}\n\nvar schemesJSX = {};\nexports.schemesJSX = schemesJSX;\n},{}],\"JrIT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.categorical = categorical;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar p8 = \"\".concat(100 / 8, \"%\");\nvar p9 = \"\".concat(100 / 9, \"%\");\nvar p10 = \"\".concat(100 / 10, \"%\");\nvar p12 = \"\".concat(100 / 12, \"%\");\nvar p20 = \"\".concat(100 / 20, \"%\");\n_scheme.schemesJSX['accent'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#7fc97f\",\n  style: {\n    width: p8,\n    background: 'rgb(127, 201, 127)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#beaed4\",\n  style: {\n    width: p8,\n    background: 'rgb(190, 174, 212)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdc086\",\n  style: {\n    width: p8,\n    background: 'rgb(253, 192, 134)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffff99\",\n  style: {\n    width: p8,\n    background: 'rgb(255, 255, 153)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#386cb0\",\n  style: {\n    width: p8,\n    background: 'rgb(56, 108, 176)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f0027f\",\n  style: {\n    width: p8,\n    background: 'rgb(240, 2, 127)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bf5b17\",\n  style: {\n    width: p8,\n    background: 'rgb(191, 91, 23)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#666666\",\n  style: {\n    width: p8,\n    background: 'rgb(102, 102, 102)'\n  }\n}));\n_scheme.schemesJSX['category10'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#1f77b4\",\n  style: {\n    width: p10,\n    background: 'rgb(31, 119, 180)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff7f0e\",\n  style: {\n    width: p10,\n    background: 'rgb(255, 127, 14)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#2ca02c\",\n  style: {\n    width: p10,\n    background: 'rgb(44, 160, 44)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d62728\",\n  style: {\n    width: p10,\n    background: 'rgb(214, 39, 40)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9467bd\",\n  style: {\n    width: p10,\n    background: 'rgb(148, 103, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8c564b\",\n  style: {\n    width: p10,\n    background: 'rgb(140, 86, 75)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e377c2\",\n  style: {\n    width: p10,\n    background: 'rgb(227, 119, 194)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#7f7f7f\",\n  style: {\n    width: p10,\n    background: 'rgb(127, 127, 127)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bcbd22\",\n  style: {\n    width: p10,\n    background: 'rgb(188, 189, 34)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#17becf\",\n  style: {\n    width: p10,\n    background: 'rgb(23, 190, 207)'\n  }\n}));\n_scheme.schemesJSX['category20'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#1f77b4\",\n  style: {\n    width: p20,\n    background: 'rgb(31, 119, 180)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#aec7e8\",\n  style: {\n    width: p20,\n    background: 'rgb(174, 199, 232)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff7f0e\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 127, 14)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffbb78\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 187, 120)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#2ca02c\",\n  style: {\n    width: p20,\n    background: 'rgb(44, 160, 44)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#98df8a\",\n  style: {\n    width: p20,\n    background: 'rgb(152, 223, 138)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d62728\",\n  style: {\n    width: p20,\n    background: 'rgb(214, 39, 40)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff9896\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 152, 150)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9467bd\",\n  style: {\n    width: p20,\n    background: 'rgb(148, 103, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c5b0d5\",\n  style: {\n    width: p20,\n    background: 'rgb(197, 176, 213)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8c564b\",\n  style: {\n    width: p20,\n    background: 'rgb(140, 86, 75)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c49c94\",\n  style: {\n    width: p20,\n    background: 'rgb(196, 156, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e377c2\",\n  style: {\n    width: p20,\n    background: 'rgb(227, 119, 194)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f7b6d2\",\n  style: {\n    width: p20,\n    background: 'rgb(247, 182, 210)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#7f7f7f\",\n  style: {\n    width: p20,\n    background: 'rgb(127, 127, 127)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c7c7c7\",\n  style: {\n    width: p20,\n    background: 'rgb(199, 199, 199)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bcbd22\",\n  style: {\n    width: p20,\n    background: 'rgb(188, 189, 34)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#dbdb8d\",\n  style: {\n    width: p20,\n    background: 'rgb(219, 219, 141)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#17becf\",\n  style: {\n    width: p20,\n    background: 'rgb(23, 190, 207)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9edae5\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 218, 229)'\n  }\n}));\n_scheme.schemesJSX['category20b'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#393b79\",\n  style: {\n    width: p20,\n    background: 'rgb(57, 59, 121)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#5254a3\",\n  style: {\n    width: p20,\n    background: 'rgb(82, 84, 163)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#6b6ecf\",\n  style: {\n    width: p20,\n    background: 'rgb(107, 110, 207)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9c9ede\",\n  style: {\n    width: p20,\n    background: 'rgb(156, 158, 222)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#637939\",\n  style: {\n    width: p20,\n    background: 'rgb(99, 121, 57)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8ca252\",\n  style: {\n    width: p20,\n    background: 'rgb(140, 162, 82)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b5cf6b\",\n  style: {\n    width: p20,\n    background: 'rgb(181, 207, 107)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#cedb9c\",\n  style: {\n    width: p20,\n    background: 'rgb(206, 219, 156)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8c6d31\",\n  style: {\n    width: p20,\n    background: 'rgb(140, 109, 49)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bd9e39\",\n  style: {\n    width: p20,\n    background: 'rgb(189, 158, 57)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e7ba52\",\n  style: {\n    width: p20,\n    background: 'rgb(231, 186, 82)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e7cb94\",\n  style: {\n    width: p20,\n    background: 'rgb(231, 203, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#843c39\",\n  style: {\n    width: p20,\n    background: 'rgb(132, 60, 57)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ad494a\",\n  style: {\n    width: p20,\n    background: 'rgb(173, 73, 74)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d6616b\",\n  style: {\n    width: p20,\n    background: 'rgb(214, 97, 107)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e7969c\",\n  style: {\n    width: p20,\n    background: 'rgb(231, 150, 156)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#7b4173\",\n  style: {\n    width: p20,\n    background: 'rgb(123, 65, 115)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a55194\",\n  style: {\n    width: p20,\n    background: 'rgb(165, 81, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ce6dbd\",\n  style: {\n    width: p20,\n    background: 'rgb(206, 109, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#de9ed6\",\n  style: {\n    width: p20,\n    background: 'rgb(222, 158, 214)'\n  }\n}));\n_scheme.schemesJSX['category20c'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#3182bd\",\n  style: {\n    width: p20,\n    background: 'rgb(49, 130, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#6baed6\",\n  style: {\n    width: p20,\n    background: 'rgb(107, 174, 214)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9ecae1\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 202, 225)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c6dbef\",\n  style: {\n    width: p20,\n    background: 'rgb(198, 219, 239)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e6550d\",\n  style: {\n    width: p20,\n    background: 'rgb(230, 85, 13)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fd8d3c\",\n  style: {\n    width: p20,\n    background: 'rgb(253, 141, 60)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdae6b\",\n  style: {\n    width: p20,\n    background: 'rgb(253, 174, 107)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdd0a2\",\n  style: {\n    width: p20,\n    background: 'rgb(253, 208, 162)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#31a354\",\n  style: {\n    width: p20,\n    background: 'rgb(49, 163, 84)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#74c476\",\n  style: {\n    width: p20,\n    background: 'rgb(116, 196, 118)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a1d99b\",\n  style: {\n    width: p20,\n    background: 'rgb(161, 217, 155)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c7e9c0\",\n  style: {\n    width: p20,\n    background: 'rgb(199, 233, 192)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#756bb1\",\n  style: {\n    width: p20,\n    background: 'rgb(117, 107, 177)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9e9ac8\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 154, 200)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bcbddc\",\n  style: {\n    width: p20,\n    background: 'rgb(188, 189, 220)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#dadaeb\",\n  style: {\n    width: p20,\n    background: 'rgb(218, 218, 235)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#636363\",\n  style: {\n    width: p20,\n    background: 'rgb(99, 99, 99)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#969696\",\n  style: {\n    width: p20,\n    background: 'rgb(150, 150, 150)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bdbdbd\",\n  style: {\n    width: p20,\n    background: 'rgb(189, 189, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d9d9d9\",\n  style: {\n    width: p20,\n    background: 'rgb(217, 217, 217)'\n  }\n}));\n_scheme.schemesJSX['dark2'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#1b9e77\",\n  style: {\n    width: p8,\n    background: 'rgb(27, 158, 119)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d95f02\",\n  style: {\n    width: p8,\n    background: 'rgb(217, 95, 2)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#7570b3\",\n  style: {\n    width: p8,\n    background: 'rgb(117, 112, 179)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e7298a\",\n  style: {\n    width: p8,\n    background: 'rgb(231, 41, 138)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#66a61e\",\n  style: {\n    width: p8,\n    background: 'rgb(102, 166, 30)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e6ab02\",\n  style: {\n    width: p8,\n    background: 'rgb(230, 171, 2)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a6761d\",\n  style: {\n    width: p8,\n    background: 'rgb(166, 118, 29)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#666666\",\n  style: {\n    width: p8,\n    background: 'rgb(102, 102, 102)'\n  }\n}));\n_scheme.schemesJSX['paired'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#a6cee3\",\n  style: {\n    width: p12,\n    background: 'rgb(166, 206, 227)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#1f78b4\",\n  style: {\n    width: p12,\n    background: 'rgb(31, 120, 180)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b2df8a\",\n  style: {\n    width: p12,\n    background: 'rgb(178, 223, 138)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#33a02c\",\n  style: {\n    width: p12,\n    background: 'rgb(51, 160, 44)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fb9a99\",\n  style: {\n    width: p12,\n    background: 'rgb(251, 154, 153)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e31a1c\",\n  style: {\n    width: p12,\n    background: 'rgb(227, 26, 28)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdbf6f\",\n  style: {\n    width: p12,\n    background: 'rgb(253, 191, 111)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff7f00\",\n  style: {\n    width: p12,\n    background: 'rgb(255, 127, 0)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#cab2d6\",\n  style: {\n    width: p12,\n    background: 'rgb(202, 178, 214)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#6a3d9a\",\n  style: {\n    width: p12,\n    background: 'rgb(106, 61, 154)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffff99\",\n  style: {\n    width: p12,\n    background: 'rgb(255, 255, 153)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b15928\",\n  style: {\n    width: p12,\n    background: 'rgb(177, 89, 40)'\n  }\n}));\n_scheme.schemesJSX['pastel1'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#fbb4ae\",\n  style: {\n    width: p9,\n    background: 'rgb(251, 180, 174)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b3cde3\",\n  style: {\n    width: p9,\n    background: 'rgb(179, 205, 227)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ccebc5\",\n  style: {\n    width: p9,\n    background: 'rgb(204, 235, 197)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#decbe4\",\n  style: {\n    width: p9,\n    background: 'rgb(222, 203, 228)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fed9a6\",\n  style: {\n    width: p9,\n    background: 'rgb(254, 217, 166)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffffcc\",\n  style: {\n    width: p9,\n    background: 'rgb(255, 255, 204)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e5d8bd\",\n  style: {\n    width: p9,\n    background: 'rgb(229, 216, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fddaec\",\n  style: {\n    width: p9,\n    background: 'rgb(253, 218, 236)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f2f2f2\",\n  style: {\n    width: p9,\n    background: 'rgb(242, 242, 242)'\n  }\n}));\n_scheme.schemesJSX['pastel2'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#b3e2cd\",\n  style: {\n    width: p8,\n    background: 'rgb(179, 226, 205)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdcdac\",\n  style: {\n    width: p8,\n    background: 'rgb(253, 205, 172)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#cbd5e8\",\n  style: {\n    width: p8,\n    background: 'rgb(203, 213, 232)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f4cae4\",\n  style: {\n    width: p8,\n    background: 'rgb(244, 202, 228)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e6f5c9\",\n  style: {\n    width: p8,\n    background: 'rgb(230, 245, 201)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fff2ae\",\n  style: {\n    width: p8,\n    background: 'rgb(255, 242, 174)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f1e2cc\",\n  style: {\n    width: p8,\n    background: 'rgb(241, 226, 204)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#cccccc\",\n  style: {\n    width: p8,\n    background: 'rgb(204, 204, 204)'\n  }\n}));\n_scheme.schemesJSX['set1'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#e41a1c\",\n  style: {\n    width: p9,\n    background: 'rgb(228, 26, 28)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#377eb8\",\n  style: {\n    width: p9,\n    background: 'rgb(55, 126, 184)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#4daf4a\",\n  style: {\n    width: p9,\n    background: 'rgb(77, 175, 74)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#984ea3\",\n  style: {\n    width: p9,\n    background: 'rgb(152, 78, 163)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff7f00\",\n  style: {\n    width: p9,\n    background: 'rgb(255, 127, 0)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffff33\",\n  style: {\n    width: p9,\n    background: 'rgb(255, 255, 51)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a65628\",\n  style: {\n    width: p9,\n    background: 'rgb(166, 86, 40)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f781bf\",\n  style: {\n    width: p9,\n    background: 'rgb(247, 129, 191)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#999999\",\n  style: {\n    width: p9,\n    background: 'rgb(153, 153, 153)'\n  }\n}));\n_scheme.schemesJSX['set2'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#66c2a5\",\n  style: {\n    width: p8,\n    background: 'rgb(102, 194, 165)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fc8d62\",\n  style: {\n    width: p8,\n    background: 'rgb(252, 141, 98)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8da0cb\",\n  style: {\n    width: p8,\n    background: 'rgb(141, 160, 203)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e78ac3\",\n  style: {\n    width: p8,\n    background: 'rgb(231, 138, 195)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a6d854\",\n  style: {\n    width: p8,\n    background: 'rgb(166, 216, 84)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffd92f\",\n  style: {\n    width: p8,\n    background: 'rgb(255, 217, 47)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e5c494\",\n  style: {\n    width: p8,\n    background: 'rgb(229, 196, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b3b3b3\",\n  style: {\n    width: p8,\n    background: 'rgb(179, 179, 179)'\n  }\n}));\n_scheme.schemesJSX['set3'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#8dd3c7\",\n  style: {\n    width: p12,\n    background: 'rgb(141, 211, 199)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffffb3\",\n  style: {\n    width: p12,\n    background: 'rgb(255, 255, 179)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bebada\",\n  style: {\n    width: p12,\n    background: 'rgb(190, 186, 218)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fb8072\",\n  style: {\n    width: p12,\n    background: 'rgb(251, 128, 114)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#80b1d3\",\n  style: {\n    width: p12,\n    background: 'rgb(128, 177, 211)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdb462\",\n  style: {\n    width: p12,\n    background: 'rgb(253, 180, 98)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b3de69\",\n  style: {\n    width: p12,\n    background: 'rgb(179, 222, 105)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fccde5\",\n  style: {\n    width: p12,\n    background: 'rgb(252, 205, 229)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d9d9d9\",\n  style: {\n    width: p12,\n    background: 'rgb(217, 217, 217)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bc80bd\",\n  style: {\n    width: p12,\n    background: 'rgb(188, 128, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ccebc5\",\n  style: {\n    width: p12,\n    background: 'rgb(204, 235, 197)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffed6f\",\n  style: {\n    width: p12,\n    background: 'rgb(255, 237, 111)'\n  }\n}));\n_scheme.schemesJSX['tableau10'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#4c78a8\",\n  style: {\n    width: p10,\n    background: 'rgb(76, 120, 168)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f58518\",\n  style: {\n    width: p10,\n    background: 'rgb(245, 133, 24)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e45756\",\n  style: {\n    width: p10,\n    background: 'rgb(228, 87, 86)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#72b7b2\",\n  style: {\n    width: p10,\n    background: 'rgb(114, 183, 178)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#54a24b\",\n  style: {\n    width: p10,\n    background: 'rgb(84, 162, 75)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#eeca3b\",\n  style: {\n    width: p10,\n    background: 'rgb(238, 202, 59)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b279a2\",\n  style: {\n    width: p10,\n    background: 'rgb(178, 121, 162)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff9da6\",\n  style: {\n    width: p10,\n    background: 'rgb(255, 157, 166)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9d755d\",\n  style: {\n    width: p10,\n    background: 'rgb(157, 117, 93)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bab0ac\",\n  style: {\n    width: p10,\n    background: 'rgb(186, 176, 172)'\n  }\n}));\n_scheme.schemesJSX['tableau20'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#4c78a8\",\n  style: {\n    width: p20,\n    background: 'rgb(76, 120, 168)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9ecae9\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 202, 233)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f58518\",\n  style: {\n    width: p20,\n    background: 'rgb(245, 133, 24)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffbf79\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 191, 121)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#54a24b\",\n  style: {\n    width: p20,\n    background: 'rgb(84, 162, 75)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#88d27a\",\n  style: {\n    width: p20,\n    background: 'rgb(136, 210, 122)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b79a20\",\n  style: {\n    width: p20,\n    background: 'rgb(183, 154, 32)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f2cf5b\",\n  style: {\n    width: p20,\n    background: 'rgb(242, 207, 91)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#439894\",\n  style: {\n    width: p20,\n    background: 'rgb(67, 152, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#83bcb6\",\n  style: {\n    width: p20,\n    background: 'rgb(131, 188, 182)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e45756\",\n  style: {\n    width: p20,\n    background: 'rgb(228, 87, 86)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff9d98\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 157, 152)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#79706e\",\n  style: {\n    width: p20,\n    background: 'rgb(121, 112, 110)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bab0ac\",\n  style: {\n    width: p20,\n    background: 'rgb(186, 176, 172)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d67195\",\n  style: {\n    width: p20,\n    background: 'rgb(214, 113, 149)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fcbfd2\",\n  style: {\n    width: p20,\n    background: 'rgb(252, 191, 210)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b279a2\",\n  style: {\n    width: p20,\n    background: 'rgb(178, 121, 162)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d6a5c9\",\n  style: {\n    width: p20,\n    background: 'rgb(214, 165, 201)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9e765f\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 118, 95)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d8b5a5\",\n  style: {\n    width: p20,\n    background: 'rgb(216, 181, 165)'\n  }\n}));\n\nfunction categorical(selected) {\n  return [(0, _scheme.schemeOption)(selected, 'accent'), (0, _scheme.schemeOption)(selected, 'category10'), (0, _scheme.schemeOption)(selected, 'category20'), (0, _scheme.schemeOption)(selected, 'category20b'), (0, _scheme.schemeOption)(selected, 'category20c'), (0, _scheme.schemeOption)(selected, 'dark2'), (0, _scheme.schemeOption)(selected, 'paired'), (0, _scheme.schemeOption)(selected, 'pastel1'), (0, _scheme.schemeOption)(selected, 'pastel2'), (0, _scheme.schemeOption)(selected, 'set1'), (0, _scheme.schemeOption)(selected, 'set2'), (0, _scheme.schemeOption)(selected, 'set3'), (0, _scheme.schemeOption)(selected, 'tableau10'), (0, _scheme.schemeOption)(selected, 'tableau20')];\n}\n},{\"react\":\"ccIB\",\"./scheme\":\"BSWy\"}],\"wtjh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.diverging = diverging;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n_scheme.schemesJSX['blueorange'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-blueorange\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(5, 48, 97)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(34, 101, 163)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(75, 148, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(143, 194, 221)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(205, 227, 238)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(242, 240, 235)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(253, 221, 179)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(248, 182, 100)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(221, 132, 31)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(178, 90, 9)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(127, 59, 8)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-blueorange)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['brownbluegreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-brownbluegreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(84, 48, 5)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(139, 84, 15)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(188, 132, 53)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(222, 190, 123)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(242, 228, 192)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(238, 241, 234)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(195, 231, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(127, 201, 191)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(57, 152, 143)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(10, 103, 95)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 60, 48)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-brownbluegreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purplegreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purplegreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(64, 0, 75)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(115, 47, 128)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(154, 109, 170)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(193, 164, 205)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(228, 210, 230)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(239, 240, 239)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(214, 238, 209)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(162, 215, 158)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(92, 173, 101)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(33, 120, 57)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 68, 27)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purplegreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['pinkyellowgreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-pinkyellowgreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(142, 1, 82)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(192, 38, 126)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(221, 114, 173)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(240, 179, 214)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(250, 221, 237)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(245, 243, 239)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(225, 242, 202)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(182, 222, 135)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(128, 187, 71)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(79, 145, 37)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(39, 100, 25)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-pinkyellowgreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purpleorange'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purpleorange\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(45, 0, 75)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(85, 45, 132)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(129, 112, 172)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(176, 170, 208)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(215, 215, 233)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(243, 238, 234)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(253, 221, 179)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(248, 182, 100)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(221, 132, 31)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(178, 90, 9)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(127, 59, 8)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purpleorange)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(103, 0, 31)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(172, 32, 47)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(213, 96, 80)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(241, 163, 133)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(251, 215, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(242, 239, 238)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(205, 227, 238)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(143, 194, 221)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(75, 148, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(34, 101, 163)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(5, 48, 97)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redgrey'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redgrey\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(103, 0, 31)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(172, 32, 47)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(213, 96, 80)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(241, 163, 133)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(252, 216, 197)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(250, 244, 241)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(223, 223, 223)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(184, 184, 184)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(134, 134, 134)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(78, 78, 78)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(26, 26, 26)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redgrey)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redyellowblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redyellowblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(165, 0, 38)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(212, 50, 44)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(241, 110, 67)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(252, 172, 100)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 221, 144)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(250, 248, 193)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(220, 241, 236)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(171, 214, 232)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(117, 171, 208)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(74, 116, 180)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(49, 54, 149)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redyellowblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redyellowgreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redyellowgreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(165, 0, 38)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(212, 50, 44)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(241, 110, 67)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(252, 172, 99)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 221, 141)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(249, 247, 174)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(215, 238, 142)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(164, 216, 110)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(100, 188, 97)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(34, 150, 79)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 104, 55)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redyellowgreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['spectral'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-spectral\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(158, 1, 66)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(209, 60, 75)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(240, 112, 74)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(252, 172, 99)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 221, 141)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(251, 248, 176)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(224, 243, 161)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(169, 221, 162)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(105, 189, 169)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(66, 136, 181)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(94, 79, 162)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-spectral)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n\nfunction diverging(selected) {\n  return [(0, _scheme.schemeOption)(selected, 'blueorange'), (0, _scheme.schemeOption)(selected, 'brownbluegreen'), (0, _scheme.schemeOption)(selected, 'purplegreen'), (0, _scheme.schemeOption)(selected, 'pinkyellowgreen'), (0, _scheme.schemeOption)(selected, 'purpleorange'), (0, _scheme.schemeOption)(selected, 'redblue'), (0, _scheme.schemeOption)(selected, 'redgrey'), (0, _scheme.schemeOption)(selected, 'redyellowblue'), (0, _scheme.schemeOption)(selected, 'redyellowgreen'), (0, _scheme.schemeOption)(selected, 'spectral')];\n}\n},{\"react\":\"ccIB\",\"./scheme\":\"BSWy\"}],\"uM5k\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.dual = dual;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n_sanddanceReact.SandDance.colorSchemes.filter(function (cs) {\n  return cs.colors.length === 2;\n}).map(function (binaryScheme, i) {\n  _scheme.schemesJSX[binaryScheme.scheme] = React.createElement(\"div\", {\n    className: \"swatch\"\n  }, binaryScheme.colors.map(function (color, j) {\n    return React.createElement(\"div\", {\n      key: j,\n      title: color,\n      style: {\n        width: '50%',\n        backgroundColor: color\n      }\n    });\n  }));\n});\n\nfunction dual(selected) {\n  return _sanddanceReact.SandDance.colorSchemes.filter(function (cs) {\n    return cs.colors.length === 2;\n  }).map(function (binaryScheme, i) {\n    return (0, _scheme.schemeOption)(selected, binaryScheme.scheme);\n  });\n}\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\",\"./scheme\":\"BSWy\"}],\"rVQa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sequentialMultiHue = sequentialMultiHue;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n_scheme.schemesJSX['viridis'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-viridis\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"#440154\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"#482475\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"#414487\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"#355f8d\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"#2a788e\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"#21918c\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"#22a884\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"#44bf70\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"#7ad151\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"#bddf26\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"#fde725\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-viridis)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['inferno'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-inferno\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"#000004\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"#160b39\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"#420a68\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"#6a176e\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"#932667\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"#bc3754\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"#dd513a\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"#f37819\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"#fca50a\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"#f6d746\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"#fcffa4\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-inferno)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['magma'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-magma\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"#000004\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"#140e36\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"#3b0f70\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"#641a80\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"#8c2981\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"#b73779\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"#de4968\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"#f7705c\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"#fe9f6d\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"#fecf92\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"#fcfdbf\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-magma)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['plasma'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-plasma\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"#0d0887\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"#41049d\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"#6a00a8\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"#8f0da4\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"#b12a90\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"#cc4778\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"#e16462\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"#f2844b\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"#fca636\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"#fcce25\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"#f0f921\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-plasma)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['bluegreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-bluegreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 252, 253)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(232, 246, 249)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(213, 239, 237)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(183, 228, 218)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(143, 211, 193)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(104, 194, 163)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(73, 177, 127)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(47, 153, 89)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(21, 127, 60)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(3, 100, 41)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 68, 27)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-bluegreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['bluepurple'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-bluepurple\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 252, 253)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(228, 238, 245)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(204, 221, 236)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(178, 202, 225)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(156, 179, 213)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(143, 149, 198)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(140, 116, 181)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(137, 82, 165)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(133, 45, 143)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(115, 15, 113)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(77, 0, 75)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-bluepurple)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['greenblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-greenblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 252, 240)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(229, 245, 223)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(211, 238, 206)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(189, 229, 191)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(158, 217, 187)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(123, 203, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(88, 183, 205)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(57, 156, 198)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(29, 126, 183)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(11, 96, 161)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(8, 64, 129)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-greenblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['orangered'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-orangered\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 247, 236)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(254, 235, 207)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(253, 220, 175)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(253, 202, 148)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(253, 176, 122)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(250, 142, 93)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(241, 108, 73)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(224, 69, 48)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(200, 29, 19)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(167, 4, 3)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(127, 0, 0)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-orangered)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purplebluegreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purplebluegreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 247, 251)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(239, 231, 242)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(219, 216, 234)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(190, 201, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(152, 185, 217)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(105, 168, 207)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(64, 150, 192)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(25, 135, 159)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(3, 120, 119)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(1, 99, 83)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(1, 70, 54)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purplebluegreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purpleblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purpleblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 247, 251)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(239, 234, 244)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(219, 218, 235)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(191, 201, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(155, 185, 217)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(114, 168, 207)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(67, 148, 195)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(26, 125, 182)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(6, 103, 161)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(4, 82, 129)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(2, 56, 88)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purpleblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purplered'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purplered\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 244, 249)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(234, 227, 240)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(220, 201, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(208, 170, 210)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(208, 138, 194)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(221, 99, 174)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(227, 56, 144)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(215, 28, 108)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(183, 11, 79)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(143, 2, 58)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(103, 0, 31)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purplered)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redpurple'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redpurple\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 247, 243)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(253, 228, 225)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(252, 207, 204)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(251, 181, 188)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(249, 147, 176)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(243, 105, 163)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(224, 62, 152)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(192, 23, 136)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(153, 3, 124)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(112, 1, 116)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(73, 0, 106)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redpurple)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['yellowgreenblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-yellowgreenblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 217)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(239, 249, 189)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(213, 238, 179)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(169, 221, 183)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(115, 201, 189)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(69, 180, 194)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(40, 151, 191)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(32, 115, 178)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(35, 78, 160)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(28, 49, 133)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(8, 29, 88)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-yellowgreenblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['yellowgreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-yellowgreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 229)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(247, 252, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(228, 244, 172)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(199, 232, 155)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(162, 216, 138)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(120, 197, 120)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(78, 175, 99)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(47, 148, 78)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(21, 121, 63)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(3, 96, 52)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 69, 41)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-yellowgreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['yelloworangebrown'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-yelloworangebrown\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 229)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(255, 248, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(254, 234, 161)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(254, 214, 118)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 186, 74)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(251, 153, 44)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(238, 121, 24)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(216, 91, 10)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(183, 67, 4)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(143, 50, 4)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(102, 37, 6)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-yelloworangebrown)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['yelloworangered'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-yelloworangered\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 204)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(255, 240, 169)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(254, 224, 135)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(254, 201, 101)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 171, 75)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(253, 137, 60)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(250, 92, 46)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(236, 48, 35)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(211, 17, 33)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(175, 2, 37)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(128, 0, 38)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-yelloworangered)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n\nfunction sequentialMultiHue(selected) {\n  return [(0, _scheme.schemeOption)(selected, 'viridis'), (0, _scheme.schemeOption)(selected, 'inferno'), (0, _scheme.schemeOption)(selected, 'magma'), (0, _scheme.schemeOption)(selected, 'plasma'), (0, _scheme.schemeOption)(selected, 'bluegreen'), (0, _scheme.schemeOption)(selected, 'bluepurple'), (0, _scheme.schemeOption)(selected, 'greenblue'), (0, _scheme.schemeOption)(selected, 'orangered'), (0, _scheme.schemeOption)(selected, 'purplebluegreen'), (0, _scheme.schemeOption)(selected, 'purpleblue'), (0, _scheme.schemeOption)(selected, 'purplered'), (0, _scheme.schemeOption)(selected, 'redpurple'), (0, _scheme.schemeOption)(selected, 'yellowgreenblue'), (0, _scheme.schemeOption)(selected, 'yellowgreen'), (0, _scheme.schemeOption)(selected, 'yelloworangebrown'), (0, _scheme.schemeOption)(selected, 'yelloworangered')];\n}\n},{\"react\":\"ccIB\",\"./scheme\":\"BSWy\"}],\"Prvn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sequentialSingleHue = sequentialSingleHue;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n_scheme.schemesJSX['blues'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-blues\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 251, 255)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(227, 238, 249)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(207, 225, 242)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(181, 212, 233)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(147, 195, 223)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(109, 174, 213)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(75, 151, 201)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(47, 126, 188)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(24, 100, 170)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(10, 74, 144)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(8, 48, 107)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-blues)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['greens'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-greens\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 252, 245)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(232, 246, 227)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(211, 238, 205)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(183, 226, 177)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(151, 212, 148)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(115, 195, 120)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(77, 175, 98)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(47, 152, 79)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(21, 127, 59)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(3, 100, 41)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 68, 27)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-greens)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['greys'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-greys\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 255)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(242, 242, 242)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(226, 226, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(206, 206, 206)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(180, 180, 180)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(151, 151, 151)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(122, 122, 122)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(95, 95, 95)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(64, 64, 64)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(30, 30, 30)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 0, 0)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-greys)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purples'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purples\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(252, 251, 253)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(241, 239, 246)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(226, 225, 239)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(206, 206, 229)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(182, 181, 216)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(158, 155, 201)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(135, 130, 188)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(115, 99, 172)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(97, 64, 155)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(80, 31, 140)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(63, 0, 125)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purples)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['reds'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-reds\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 245, 240)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(254, 227, 214)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(253, 201, 180)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(252, 170, 142)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(252, 138, 107)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(249, 105, 76)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(239, 69, 51)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(217, 39, 35)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(187, 21, 26)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(151, 11, 19)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(103, 0, 13)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-reds)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['oranges'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-oranges\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 245, 235)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(254, 232, 211)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(253, 216, 179)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(253, 194, 140)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(253, 167, 98)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(251, 141, 61)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(242, 112, 29)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(226, 86, 9)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(196, 65, 3)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(159, 51, 3)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(127, 39, 4)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-oranges)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n\nfunction sequentialSingleHue(selected) {\n  return [(0, _scheme.schemeOption)(selected, 'blues'), (0, _scheme.schemeOption)(selected, 'greens'), (0, _scheme.schemeOption)(selected, 'greys'), (0, _scheme.schemeOption)(selected, 'purples'), (0, _scheme.schemeOption)(selected, 'reds'), (0, _scheme.schemeOption)(selected, 'oranges')];\n}\n},{\"react\":\"ccIB\",\"./scheme\":\"BSWy\"}],\"otJp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Palette = Palette;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _categorical = require(\"./categorical\");\n\nvar _diverging = require(\"./diverging\");\n\nvar _dropdown = require(\"../controls/dropdown\");\n\nvar _dual = require(\"./dual\");\n\nvar _scheme = require(\"./scheme\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _sequentialMultiHue = require(\"./sequentialMultiHue\");\n\nvar _sequentialSingleHue = require(\"./sequentialSingleHue\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar maxDistinctColors = 20;\n\nfunction Palette(props) {\n  var distinctValueCount = props.colorColumn.stats.distinctValueCount;\n  var isDual = distinctValueCount === 2;\n  var categoricalNumeric = distinctValueCount > 0 && distinctValueCount < maxDistinctColors;\n  var isQualitative = false;\n  var isQuantitative = false;\n\n  switch (props.colorColumn.type) {\n    case 'boolean':\n    case 'string':\n      isQualitative = true;\n      break;\n\n    case 'number':\n      isQuantitative = true;\n      break;\n\n    case 'date':\n    case 'integer':\n      isQuantitative = true;\n      isQualitative = categoricalNumeric;\n  }\n\n  var selected = props.scheme;\n  var options = [];\n\n  function menu(name, opts) {\n    options.push({\n      key: name,\n      text: name,\n      itemType: _base.base.fabric.DropdownMenuItemType.Header\n    });\n    options.push.apply(options, opts);\n  }\n\n  isQualitative && menu(_language.strings.schemeCategorical, (0, _categorical.categorical)(selected));\n  isQuantitative && menu(_language.strings.schemeSequentialSingleHue, (0, _sequentialSingleHue.sequentialSingleHue)(selected));\n  isQuantitative && menu(_language.strings.schemeSequentialMultiHue, (0, _sequentialMultiHue.sequentialMultiHue)(selected));\n  isQuantitative && menu(_language.strings.schemeDiverging, (0, _diverging.diverging)(selected));\n  isDual && menu(_language.strings.schemeDual, (0, _dual.dual)(selected));\n  return React.createElement(\"div\", {\n    className: \"sanddance-palette\"\n  }, React.createElement(\"div\", {\n    className: \"sanddance-explanation\",\n    dangerouslySetInnerHTML: {\n      __html: _language.strings.labelColorFieldInfo(props.colorColumn.name, props.colorColumn.type, categoricalNumeric, distinctValueCount)\n    }\n  }), React.createElement(_dropdown.Dropdown, {\n    collapseLabel: true,\n    disabled: props.disabled,\n    dropdownWidth: 400,\n    label: _language.strings.labelColorScheme,\n    onRenderOption: function onRenderOption(option) {\n      if (option.itemType === _base.base.fabric.DropdownMenuItemType.Header) {\n        return React.createElement(\"span\", null, option.text);\n      } else {\n        return React.createElement(\"div\", {\n          className: \"sanddance-scheme option\"\n        }, React.createElement(\"span\", {\n          className: \"name\"\n        }, option.scheme), option.children);\n      }\n    },\n    options: options,\n    onChange: function onChange(e, o) {\n      props.changeColorScheme(o.scheme);\n    }\n  }), React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-scheme', props.disabled && 'disabled')\n  }, props.scheme && _scheme.schemesJSX[props.scheme]));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./categorical\":\"JrIT\",\"./diverging\":\"wtjh\",\"../controls/dropdown\":\"Uyrp\",\"./dual\":\"uM5k\",\"./scheme\":\"BSWy\",\"@msrvida/sanddance-react\":\"MjKu\",\"./sequentialMultiHue\":\"rVQa\",\"./sequentialSingleHue\":\"Prvn\",\"../language\":\"hk5u\"}],\"N8IJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Color = Color;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _columnMap = require(\"../controls/columnMap\");\n\nvar _palettes = require(\"../palettes\");\n\nvar _signal = require(\"../controls/signal\");\n\nvar _language = require(\"../language\");\n\nvar _group = require(\"../controls/group\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Color(props) {\n  var colorColumn = props.dataContent.columns.filter(function (c) {\n    return c.name === props.colorColumn;\n  })[0];\n  var disabledColorBin = !colorColumn || !colorColumn.quantitative || props.directColor;\n  var colorBin = props.colorBin || 'quantize';\n  return React.createElement(\"div\", {\n    className: \"sanddance-color-dialog\"\n  }, React.createElement(_group.Group, {\n    label: _language.strings.labelColor\n  }, React.createElement(_columnMap.ColumnMap, Object.assign({}, props, {\n    selectedColumnName: props.colorColumn,\n    specRole: props.specCapabilities && props.specCapabilities.roles.filter(function (r) {\n      return r.role === 'color';\n    })[0],\n    key: 0\n  })), colorColumn && colorColumn.isColorData && React.createElement(\"div\", {\n    className: \"sanddance-explanation\",\n    dangerouslySetInnerHTML: {\n      __html: _language.strings.labelColorFieldIsColorData(colorColumn.name)\n    }\n  }), colorColumn && !colorColumn.isColorData && React.createElement(_palettes.Palette, {\n    scheme: props.scheme,\n    colorColumn: colorColumn,\n    changeColorScheme: function changeColorScheme(scheme) {\n      props.onColorSchemeChange(scheme);\n    },\n    disabled: props.disabled || props.directColor || colorColumn && colorColumn.isColorData\n  }), colorColumn && !colorColumn.isColorData && React.createElement(_signal.Signal, {\n    disabled: props.disabled || !colorColumn || props.directColor || colorColumn && colorColumn.isColorData,\n    signal: props.colorReverseSignal,\n    explorer: props.explorer,\n    onChange: props.onColorReverseChange\n  })), colorColumn && !colorColumn.isColorData && React.createElement(_group.Group, {\n    label: _language.strings.labelColorBin\n  }, React.createElement(\"div\", {\n    className: \"sanddance-explanation\"\n  }, _language.strings.labelColorBinExplanation), React.createElement(_base.base.fabric.ChoiceGroup, {\n    options: [{\n      key: 'continuous',\n      text: _language.strings.labelColorBinNone,\n      checked: colorBin === 'continuous',\n      disabled: disabledColorBin\n    }, {\n      key: 'quantize',\n      text: _language.strings.labelColorBinQuantize,\n      checked: colorBin === 'quantize',\n      disabled: disabledColorBin\n    }, {\n      key: 'quantile',\n      text: _language.strings.labelColorBinQuantile,\n      checked: colorBin === 'quantile',\n      disabled: disabledColorBin\n    }],\n    onChange: function onChange(e, o) {\n      props.onColorBinChange(o.key);\n    }\n  }), React.createElement(_signal.Signal, {\n    disabled: props.disabled || disabledColorBin || props.colorBin === 'continuous',\n    signal: props.colorBinSignal,\n    explorer: props.explorer,\n    onChange: props.onColorBinCountChange\n  })), colorColumn && !colorColumn.isColorData && React.createElement(_group.Group, {\n    label: _language.strings.labelColorOptions\n  }, React.createElement(_base.base.fabric.Toggle, {\n    label: _language.strings.selectDirectColor,\n    disabled: !colorColumn.stats.hasColorData,\n    checked: !!(colorColumn.stats.hasColorData && props.directColor),\n    onChange: function onChange(e, checked) {\n      return props.onDirectColorChange(checked);\n    }\n  }), React.createElement(\"div\", {\n    className: \"sanddance-explanation\",\n    dangerouslySetInnerHTML: {\n      __html: _language.strings.labelDataColors\n    }\n  })));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../controls/columnMap\":\"DSho\",\"../palettes\":\"otJp\",\"../controls/signal\":\"OWDI\",\"../language\":\"hk5u\",\"../controls/group\":\"Q3hf\"}],\"tb7d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initPrefs = initPrefs;\nexports.saveSignalValuePref = saveSignalValuePref;\nexports.copyPrefToNewState = copyPrefToNewState;\nexports.savePref = savePref;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction initPrefs(prefs, partialInsight) {\n  if (partialInsight) {\n    var specTypePrefs = prefs[partialInsight.chart] || {};\n    prefs[partialInsight.chart] = specTypePrefs;\n\n    for (var _role in partialInsight.columns) {\n      var role = _role;\n\n      if (role === 'color' || role === 'x') {\n        (function () {\n          var rolePrefs = specTypePrefs[role] || {};\n          specTypePrefs[role] = rolePrefs;\n          var column = partialInsight.columns[role];\n\n          var copySignalValue = function copySignalValue(signalName) {\n            if (partialInsight.signalValues && partialInsight.signalValues[signalName] && rolePrefs[column]) {\n              var signalValues = rolePrefs[column].signalValues || {};\n              signalValues[signalName] = partialInsight.signalValues[signalName];\n              rolePrefs[column].signalValues = signalValues;\n            }\n          };\n\n          switch (role) {\n            case 'color':\n              rolePrefs[column] = {\n                scheme: partialInsight.scheme,\n                colorBin: partialInsight.colorBin\n              };\n              copySignalValue(_sanddanceReact.SandDance.constants.SignalNames.ColorBinCount);\n              break;\n\n            case 'x':\n              copySignalValue(_sanddanceReact.SandDance.constants.SignalNames.XBins);\n              break;\n          }\n        })();\n      }\n    }\n  }\n}\n\nfunction saveSignalValuePref(prefs, chart, role, column, signalName, signalValue) {\n  var partialInsight = savePref(prefs, chart, role, column, {\n    signalValues: {}\n  });\n  partialInsight.signalValues[signalName] = signalValue;\n}\n\nfunction copyPrefToNewState(prefs, chart, role, columnName) {\n  var specTypePrefs = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge({}, prefs['*'], prefs[chart]);\n\n  var rolePrefs = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge({}, specTypePrefs['*'], specTypePrefs[role]);\n\n  var partialInsight = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge({}, rolePrefs['*'], rolePrefs[columnName]);\n\n  return partialInsight;\n}\n\nfunction savePref(prefs, chart, role, column, partialInsight) {\n  var SpecTypePrefs = prefs[chart] || {};\n  prefs[chart] = SpecTypePrefs;\n  var rolePrefs = SpecTypePrefs[role] || {};\n  SpecTypePrefs[role] = rolePrefs;\n  rolePrefs[column] = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge({}, rolePrefs[column], partialInsight);\n  return rolePrefs[column];\n}\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"pP3Y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.convertToDelimited = convertToDelimited;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction convertToDelimited(data, delimiter) {\n  var fields = Object.keys(data[0]);\n  var file = data.map(function (row) {\n    return fields.map(function (fieldName) {\n      var value = row[fieldName];\n\n      if (typeof value === 'number') {\n        return value;\n      }\n\n      if (typeof value === 'string') {\n        if (value.indexOf(delimiter) >= 0) {\n          return \"\\\"\".concat(value.replace(/\"/g, '\"\"'), \"\\\"\");\n        } else {\n          return value;\n        }\n      }\n\n      return '';\n    }).join(delimiter);\n  });\n  file.unshift(fields.join(delimiter));\n  return file.join('\\n');\n}\n},{}],\"fOIZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.embedHtml = void 0;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar embedHtml = function embedHtml(title, embed) {\n  return \"<!DOCTYPE html>\\n<html lang=\\\"en\\\">\\n\\n<head>\\n    <meta charset=\\\"UTF-8\\\">\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\">\\n    <title>\".concat(title, \"</title>\\n    <link rel=\\\"stylesheet\\\" type=\\\"text/css\\\"\\n        href=\\\"https://unpkg.com/@msrvida/sanddance-embed@1/dist/css/sanddance-embed.css\\\" />\\n    <link rel=\\\"stylesheet\\\" type=\\\"text/css\\\"\\n        href=\\\"https://unpkg.com/@msrvida/sanddance-explorer@1/dist/css/sanddance-explorer.css\\\" />\\n</head>\\n\\n<body>\\n    <script src=\\\"https://unpkg.com/react@16/umd/react.production.min.js\\\" crossorigin></script>\\n    <script src=\\\"https://unpkg.com/react-dom@16/umd/react-dom.production.min.js\\\" crossorigin></script>\\n    <script src=\\\"https://unpkg.com/deck.gl@6/deckgl.min.js\\\"></script>\\n    <script src=\\\"https://unpkg.com/vega@4/build/vega.min.js\\\"></script>\\n    <script src=\\\"https://unpkg.com/office-ui-fabric-react@6.204.4/dist/office-ui-fabric-react.js\\\"></script>\\n    <script src=\\\"https://unpkg.com/@msrvida/sanddance-explorer@1/dist/umd/sanddance-explorer.js\\\"></script>\\n    <script src=\\\"https://unpkg.com/@msrvida/sanddance-embed@1/dist/umd/sanddance-embed.js\\\"></script>\\n\\n    <div id=\\\"app\\\"></div>\\n\\n    \").concat(embed, \"\\n\\n</body>\\n\\n</html>\");\n};\n\nexports.embedHtml = embedHtml;\n},{}],\"l7po\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.removeExtensions = removeExtensions;\nexports.DataExportPicker = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _exportDelimited = require(\"../exportDelimited\");\n\nvar _dataExporterHtml = require(\"./dataExporterHtml\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar exportTypes = [['json', _language.strings.labelExportJSON], ['csv', _language.strings.labelExportCSV], ['tsv', _language.strings.labelExportTSV], ['html', _language.strings.labelExportHTML]];\n\nvar DataExportPicker =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(DataExportPicker, _React$Component);\n\n  function DataExportPicker(props) {\n    var _this;\n\n    _classCallCheck(this, DataExportPicker);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(DataExportPicker).call(this, props));\n    _this.state = _this.getInitialState(_this.props);\n    return _this;\n  }\n\n  _createClass(DataExportPicker, [{\n    key: \"getInitialState\",\n    value: function getInitialState(props) {\n      var initialState = {\n        initializer: props.initializer,\n        dialogHidden: true,\n        exportType: exportTypes[0][0],\n        fileName: props.initializer.fileName,\n        fileNameError: '',\n        working: false\n      };\n      return initialState;\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      if (!_sanddanceReact.util.deepCompare(this.props.initializer, this.state.initializer)) {\n        this.setState(this.getInitialState(this.props));\n      }\n    } // Converts to dataExport type and calls dataExportHandler to deal with data\n\n  }, {\n    key: \"createExport\",\n    value: function createExport(exportType, displayName) {\n      var _this2 = this;\n\n      var final = function final(data) {\n        _this2.props.dataExportHandler(data, exportType, displayName);\n\n        _this2.close();\n      };\n\n      var json = JSON.stringify(this.props.data, columnReplacer);\n\n      switch (exportType) {\n        case 'json':\n          {\n            final(json);\n            break;\n          }\n\n        case 'csv':\n          {\n            final((0, _exportDelimited.convertToDelimited)(JSON.parse(json), ','));\n            break;\n          }\n\n        case 'tsv':\n          {\n            final((0, _exportDelimited.convertToDelimited)(JSON.parse(json), '\\t'));\n            break;\n          }\n\n        case 'html':\n          {\n            final((0, _dataExporterHtml.embedHtml)(\"\".concat(_language.strings.appName, \" - \").concat(escape(displayName)), embedScript((0, _exportDelimited.convertToDelimited)(JSON.parse(json), ','), displayName)));\n          }\n      }\n    }\n  }, {\n    key: \"close\",\n    value: function close() {\n      this.setState({\n        dialogHidden: true,\n        working: false\n      });\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this3 = this;\n\n      var closeDialog = function closeDialog() {\n        return _this3.close();\n      };\n\n      if (this.state.delayAction) {\n        requestAnimationFrame(function () {\n          //allow render to complete\n          if (_this3.state.delayAction) {\n            _this3.state.delayAction();\n\n            _this3.setState({\n              delayAction: null\n            });\n          }\n        });\n      }\n\n      var disabled = this.state.working || this.state.dialogHidden;\n      return React.createElement(\"div\", {\n        className: \"sanddance-dataExporter\"\n      }, React.createElement(_base.base.fabric.DefaultButton, {\n        className: \"search-action search-bottom-action\",\n        text: _language.strings.buttonExportCount(this.props.data.length),\n        onClick: function onClick() {\n          return _this3.setState({\n            dialogHidden: false\n          });\n        },\n        disabled: this.props.disabled\n      }), React.createElement(_base.base.fabric.Dialog, {\n        hidden: this.state.dialogHidden,\n        onDismiss: closeDialog,\n        dialogContentProps: {\n          className: 'sanddance-dialog',\n          type: _base.base.fabric.DialogType.normal,\n          title: _language.strings.labelExport\n        }\n      }, React.createElement(_base.base.fabric.TextField, {\n        label: _language.strings.labelExportFileName,\n        onChange: function onChange(e, displayName) {\n          var displayNameError = getFileNameError(displayName);\n\n          _this3.setState({\n            fileName: displayName,\n            fileNameError: displayNameError\n          });\n        },\n        errorMessage: this.state.fileNameError,\n        value: this.state.fileName\n      }), React.createElement(_base.base.fabric.ChoiceGroup, {\n        className: \"sanddance-form-separate\",\n        disabled: disabled,\n        options: exportTypes.map(function (_ref) {\n          var _ref2 = _slicedToArray(_ref, 2),\n              exportType = _ref2[0],\n              text = _ref2[1];\n\n          return {\n            key: exportType,\n            text: text,\n            disabled: false,\n            checked: exportType === _this3.state.exportType\n          };\n        }),\n        onChange: function onChange(ev, option) {\n          return _this3.setState({\n            exportType: option.key\n          });\n        },\n        label: _language.strings.labelExportFormat\n      }), React.createElement(_base.base.fabric.DialogFooter, null, React.createElement(_base.base.fabric.PrimaryButton, {\n        disabled: disabled || !!this.state.fileNameError,\n        onClick: function onClick(e) {\n          return _this3.setState({\n            delayAction: function delayAction() {\n              return _this3.createExport(_this3.state.exportType, _this3.state.fileName);\n            },\n            working: true\n          });\n        },\n        text: _language.strings.buttonExport\n      }), React.createElement(_base.base.fabric.DefaultButton, {\n        onClick: closeDialog,\n        text: _language.strings.buttonClose\n      }))));\n    }\n  }]);\n\n  return DataExportPicker;\n}(React.Component);\n\nexports.DataExportPicker = DataExportPicker;\nvar illegalChars = '\\\\/:*?\"<>|';\n\nfunction getFileNameError(displayName) {\n  if (!displayName) {\n    return _language.strings.errorExportFilenameEmpty;\n  }\n\n  for (var i = 0; i < illegalChars.length; i++) {\n    if (displayName.indexOf(illegalChars[i]) >= 0) {\n      return _language.strings.errorExportFilenameCharacters(illegalChars);\n    }\n  }\n}\n\nfunction removeExtensions(fileName) {\n  exportTypes.forEach(function (_ref3) {\n    var _ref4 = _slicedToArray(_ref3, 1),\n        exportType = _ref4[0];\n\n    var re = new RegExp(\"\\\\.\".concat(exportType), 'ig');\n    fileName = fileName.replace(re, '');\n  });\n  return fileName;\n}\n\nfunction columnReplacer(name, value) {\n  if (_sanddanceReact.SandDance.util.isInternalFieldName(name, true)) {\n    return undefined;\n  }\n\n  return value === null ? '' : value;\n}\n\nfunction embedScript(csv, displayName) {\n  var dataFile = {\n    type: 'csv',\n    displayName: displayName\n  };\n  return \"<pre id='csv-data' style='display:none'>\".concat(csv, \"</pre>    \\n    <script>SandDanceEmbed.load(Object.assign({rawText: document.getElementById('csv-data').innerText}, \").concat(JSON.stringify(dataFile), \"))</script>\");\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../exportDelimited\":\"pP3Y\",\"./dataExporterHtml\":\"fOIZ\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"Gai8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataItem = DataItem;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction isNumber(value) {\n  if (typeof value === 'number') return true;\n  if (!isNaN(value)) return true;\n  return false;\n}\n\nfunction isBoolean(value) {\n  if (typeof value === 'boolean') return true;\n\n  if (typeof value === 'string') {\n    switch (value.toLowerCase()) {\n      case true + '':\n      case false + '':\n        return true;\n    }\n  }\n\n  return false;\n}\n\nfunction bingSearchLink(column, value) {\n  if (isNumber(value)) return null;\n  if (isBoolean(value)) return null;\n  if (column && column.stats.distinctValueCount === 2) return null;\n  return React.createElement(\"div\", {\n    className: \"bing-search\"\n  }, React.createElement(\"a\", {\n    href: \"https://www.bing.com/search?q=\".concat(encodeURIComponent(value)),\n    target: \"_blank\"\n  }, _language.strings.bingsearch));\n}\n\nfunction displayValue(value) {\n  switch (value) {\n    case '':\n      return React.createElement(\"i\", null, _language.strings.labelBlank);\n\n    case null:\n      return React.createElement(\"i\", null, _language.strings.labelNull);\n\n    case true:\n      return React.createElement(\"i\", null, _language.strings.labelTrue);\n\n    case false:\n      return React.createElement(\"i\", null, _language.strings.labelFalse);\n\n    default:\n      return value;\n  }\n}\n\nfunction DataItem(props) {\n  if (!props.item) {\n    return null;\n  }\n\n  var nameValuePairs = [];\n\n  var _loop = function _loop(columnName) {\n    if (columnName === _sanddanceReact.SandDance.VegaDeckGl.constants.GL_ORDINAL && !props.showSystemFields) {\n      return \"continue\";\n    }\n\n    if (_sanddanceReact.SandDance.util.isInternalFieldName(columnName)) {\n      return \"continue\";\n    }\n\n    var nameValuePair = {\n      columnName: columnName,\n      value: props.item[columnName]\n    };\n\n    if (!props.bingSearchDisabled) {\n      nameValuePair.bingSearch = bingSearchLink(props.columns.filter(function (c) {\n        return c.name === columnName;\n      })[0], props.item[columnName]);\n    }\n\n    nameValuePairs.push(nameValuePair);\n  };\n\n  for (var columnName in props.item) {\n    var _ret = _loop(columnName);\n\n    if (_ret === \"continue\") continue;\n  }\n\n  return React.createElement(\"div\", {\n    className: \"sanddance-dataItem\"\n  }, nameValuePairs.map(function (nameValuePair, i) {\n    var ex = {\n      key: 0,\n      name: nameValuePair.columnName,\n      operator: '==',\n      value: nameValuePair.value\n    };\n\n    var searchClick = function searchClick(e) {\n      var search = {\n        key: 0,\n        expressions: [ex]\n      };\n      props.onSearch(e, [search]);\n    };\n\n    var title = _language.strings.tooltipSearch(nameValuePair.columnName, nameValuePair.value);\n\n    return React.createElement(\"div\", {\n      key: i,\n      onClick: !props.disabled ? searchClick : null,\n      title: title,\n      className: \"name-value\"\n    }, React.createElement(\"div\", {\n      className: \"column-name\"\n    }, nameValuePair.columnName), React.createElement(\"div\", {\n      className: \"column-value\"\n    }, displayValue(nameValuePair.value)), nameValuePair.bingSearch);\n  }));\n}\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"eqtW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Button = Button;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Button(props) {\n  return React.createElement(_base.base.fabric.DefaultButton, Object.assign({}, props, {\n    styles: {\n      root: {\n        backgroundColor: 'transparent',\n        height: '30px',\n        width: props.width,\n        padding: 0\n      },\n      rootDisabled: {\n        backgroundColor: 'transparent'\n      },\n      icon: {\n        color: props.themePalette.themePrimary\n      },\n      label: {\n        fontWeight: '400',\n        textAlign: props.textAlign || 'left'\n      }\n    },\n    iconProps: {\n      iconName: props.iconName\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"fiGR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nfunction _default(x, p) {\n  if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n\n  var i,\n      coefficient = x.slice(0, i); // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n  // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n\n  return [coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, +x.slice(i + 1)];\n}\n},{}],\"G46r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(x) {\n  return x = (0, _formatDecimal.default)(Math.abs(x)), x ? x[1] : NaN;\n}\n},{\"./formatDecimal.js\":\"fiGR\"}],\"CupU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(grouping, thousands) {\n  return function (value, width) {\n    var i = value.length,\n        t = [],\n        j = 0,\n        g = grouping[0],\n        length = 0;\n\n    while (i > 0 && g > 0) {\n      if (length + g + 1 > width) g = Math.max(1, width - length);\n      t.push(value.substring(i -= g, i + g));\n      if ((length += g + 1) > width) break;\n      g = grouping[j = (j + 1) % grouping.length];\n    }\n\n    return t.reverse().join(thousands);\n  };\n}\n},{}],\"mUgz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(numerals) {\n  return function (value) {\n    return value.replace(/[0-9]/g, function (i) {\n      return numerals[+i];\n    });\n  };\n}\n},{}],\"Nf4q\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = formatSpecifier;\nexports.FormatSpecifier = FormatSpecifier;\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nfunction formatSpecifier(specifier) {\n  if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n  var match;\n  return new FormatSpecifier({\n    fill: match[1],\n    align: match[2],\n    sign: match[3],\n    symbol: match[4],\n    zero: match[5],\n    width: match[6],\n    comma: match[7],\n    precision: match[8] && match[8].slice(1),\n    trim: match[9],\n    type: match[10]\n  });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n  this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n  this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n  this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n  this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n  this.zero = !!specifier.zero;\n  this.width = specifier.width === undefined ? undefined : +specifier.width;\n  this.comma = !!specifier.comma;\n  this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n  this.trim = !!specifier.trim;\n  this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function () {\n  return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n},{}],\"sIkL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nfunction _default(s) {\n  out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n    switch (s[i]) {\n      case \".\":\n        i0 = i1 = i;\n        break;\n\n      case \"0\":\n        if (i0 === 0) i0 = i;\n        i1 = i;\n        break;\n\n      default:\n        if (i0 > 0) {\n          if (!+s[i]) break out;\n          i0 = 0;\n        }\n\n        break;\n    }\n  }\n\n  return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n},{}],\"WMxc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.prefixExponent = void 0;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar prefixExponent;\nexports.prefixExponent = prefixExponent;\n\nfunction _default(x, p) {\n  var d = (0, _formatDecimal.default)(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1],\n      i = exponent - (exports.prefixExponent = prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n      n = coefficient.length;\n  return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, _formatDecimal.default)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n},{\"./formatDecimal.js\":\"fiGR\"}],\"gMFS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(x, p) {\n  var d = (0, _formatDecimal.default)(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1];\n  return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n},{\"./formatDecimal.js\":\"fiGR\"}],\"w40g\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _formatPrefixAuto = _interopRequireDefault(require(\"./formatPrefixAuto.js\"));\n\nvar _formatRounded = _interopRequireDefault(require(\"./formatRounded.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n  \"%\": function (x, p) {\n    return (x * 100).toFixed(p);\n  },\n  \"b\": function (x) {\n    return Math.round(x).toString(2);\n  },\n  \"c\": function (x) {\n    return x + \"\";\n  },\n  \"d\": function (x) {\n    return Math.round(x).toString(10);\n  },\n  \"e\": function (x, p) {\n    return x.toExponential(p);\n  },\n  \"f\": function (x, p) {\n    return x.toFixed(p);\n  },\n  \"g\": function (x, p) {\n    return x.toPrecision(p);\n  },\n  \"o\": function (x) {\n    return Math.round(x).toString(8);\n  },\n  \"p\": function (x, p) {\n    return (0, _formatRounded.default)(x * 100, p);\n  },\n  \"r\": _formatRounded.default,\n  \"s\": _formatPrefixAuto.default,\n  \"X\": function (x) {\n    return Math.round(x).toString(16).toUpperCase();\n  },\n  \"x\": function (x) {\n    return Math.round(x).toString(16);\n  }\n};\nexports.default = _default;\n},{\"./formatPrefixAuto.js\":\"WMxc\",\"./formatRounded.js\":\"gMFS\"}],\"Ecm4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x) {\n  return x;\n}\n},{}],\"Iakc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nvar _formatGroup = _interopRequireDefault(require(\"./formatGroup.js\"));\n\nvar _formatNumerals = _interopRequireDefault(require(\"./formatNumerals.js\"));\n\nvar _formatSpecifier = _interopRequireDefault(require(\"./formatSpecifier.js\"));\n\nvar _formatTrim = _interopRequireDefault(require(\"./formatTrim.js\"));\n\nvar _formatTypes = _interopRequireDefault(require(\"./formatTypes.js\"));\n\nvar _formatPrefixAuto = require(\"./formatPrefixAuto.js\");\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar map = Array.prototype.map,\n    prefixes = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n\nfunction _default(locale) {\n  var group = locale.grouping === undefined || locale.thousands === undefined ? _identity.default : (0, _formatGroup.default)(map.call(locale.grouping, Number), locale.thousands + \"\"),\n      currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n      currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n      decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n      numerals = locale.numerals === undefined ? _identity.default : (0, _formatNumerals.default)(map.call(locale.numerals, String)),\n      percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n      minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\n      nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n  function newFormat(specifier) {\n    specifier = (0, _formatSpecifier.default)(specifier);\n    var fill = specifier.fill,\n        align = specifier.align,\n        sign = specifier.sign,\n        symbol = specifier.symbol,\n        zero = specifier.zero,\n        width = specifier.width,\n        comma = specifier.comma,\n        precision = specifier.precision,\n        trim = specifier.trim,\n        type = specifier.type; // The \"n\" type is an alias for \",g\".\n\n    if (type === \"n\") comma = true, type = \"g\"; // The \"\" type, and any invalid type, is an alias for \".12~g\".\n    else if (!_formatTypes.default[type]) precision === undefined && (precision = 12), trim = true, type = \"g\"; // If zero fill is specified, padding goes after sign and before digits.\n\n    if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\"; // Compute the prefix and suffix.\n    // For SI-prefix, the suffix is lazily computed.\n\n    var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n        suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\"; // What format function should we use?\n    // Is this an integer type?\n    // Can this type generate exponential notation?\n\n    var formatType = _formatTypes.default[type],\n        maybeSuffix = /[defgprs%]/.test(type); // Set the default precision if not specified,\n    // or clamp the specified precision to the supported range.\n    // For significant precision, it must be in [1, 21].\n    // For fixed precision, it must be in [0, 20].\n\n    precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n\n    function format(value) {\n      var valuePrefix = prefix,\n          valueSuffix = suffix,\n          i,\n          n,\n          c;\n\n      if (type === \"c\") {\n        valueSuffix = formatType(value) + valueSuffix;\n        value = \"\";\n      } else {\n        value = +value; // Perform the initial formatting.\n\n        var valueNegative = value < 0;\n        value = isNaN(value) ? nan : formatType(Math.abs(value), precision); // Trim insignificant zeros.\n\n        if (trim) value = (0, _formatTrim.default)(value); // If a negative value rounds to zero during formatting, treat as positive.\n\n        if (valueNegative && +value === 0) valueNegative = false; // Compute the prefix and suffix.\n\n        valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n        valueSuffix = (type === \"s\" ? prefixes[8 + _formatPrefixAuto.prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\"); // Break the formatted value into the integer “value” part that can be\n        // grouped, and fractional or exponential “suffix” part that is not.\n\n        if (maybeSuffix) {\n          i = -1, n = value.length;\n\n          while (++i < n) {\n            if (c = value.charCodeAt(i), 48 > c || c > 57) {\n              valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n              value = value.slice(0, i);\n              break;\n            }\n          }\n        }\n      } // If the fill character is not \"0\", grouping is applied before padding.\n\n\n      if (comma && !zero) value = group(value, Infinity); // Compute the padding.\n\n      var length = valuePrefix.length + value.length + valueSuffix.length,\n          padding = length < width ? new Array(width - length + 1).join(fill) : \"\"; // If the fill character is \"0\", grouping is applied after padding.\n\n      if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\"; // Reconstruct the final output based on the desired alignment.\n\n      switch (align) {\n        case \"<\":\n          value = valuePrefix + value + valueSuffix + padding;\n          break;\n\n        case \"=\":\n          value = valuePrefix + padding + value + valueSuffix;\n          break;\n\n        case \"^\":\n          value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n          break;\n\n        default:\n          value = padding + valuePrefix + value + valueSuffix;\n          break;\n      }\n\n      return numerals(value);\n    }\n\n    format.toString = function () {\n      return specifier + \"\";\n    };\n\n    return format;\n  }\n\n  function formatPrefix(specifier, value) {\n    var f = newFormat((specifier = (0, _formatSpecifier.default)(specifier), specifier.type = \"f\", specifier)),\n        e = Math.max(-8, Math.min(8, Math.floor((0, _exponent.default)(value) / 3))) * 3,\n        k = Math.pow(10, -e),\n        prefix = prefixes[8 + e / 3];\n    return function (value) {\n      return f(k * value) + prefix;\n    };\n  }\n\n  return {\n    format: newFormat,\n    formatPrefix: formatPrefix\n  };\n}\n},{\"./exponent.js\":\"G46r\",\"./formatGroup.js\":\"CupU\",\"./formatNumerals.js\":\"mUgz\",\"./formatSpecifier.js\":\"Nf4q\",\"./formatTrim.js\":\"sIkL\",\"./formatTypes.js\":\"w40g\",\"./formatPrefixAuto.js\":\"WMxc\",\"./identity.js\":\"Ecm4\"}],\"VIed\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = defaultLocale;\nexports.formatPrefix = exports.format = void 0;\n\nvar _locale = _interopRequireDefault(require(\"./locale.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar locale;\nvar format;\nexports.format = format;\nvar formatPrefix;\nexports.formatPrefix = formatPrefix;\ndefaultLocale({\n  decimal: \".\",\n  thousands: \",\",\n  grouping: [3],\n  currency: [\"$\", \"\"],\n  minus: \"-\"\n});\n\nfunction defaultLocale(definition) {\n  locale = (0, _locale.default)(definition);\n  exports.format = format = locale.format;\n  exports.formatPrefix = formatPrefix = locale.formatPrefix;\n  return locale;\n}\n},{\"./locale.js\":\"Iakc\"}],\"cTEw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step) {\n  return Math.max(0, -(0, _exponent.default)(Math.abs(step)));\n}\n},{\"./exponent.js\":\"G46r\"}],\"aFxy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step, value) {\n  return Math.max(0, Math.max(-8, Math.min(8, Math.floor((0, _exponent.default)(value) / 3))) * 3 - (0, _exponent.default)(Math.abs(step)));\n}\n},{\"./exponent.js\":\"G46r\"}],\"we8G\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step, max) {\n  step = Math.abs(step), max = Math.abs(max) - step;\n  return Math.max(0, (0, _exponent.default)(max) - (0, _exponent.default)(step)) + 1;\n}\n},{\"./exponent.js\":\"G46r\"}],\"SA6z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"formatDefaultLocale\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.default;\n  }\n});\nObject.defineProperty(exports, \"format\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.format;\n  }\n});\nObject.defineProperty(exports, \"formatPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.formatPrefix;\n  }\n});\nObject.defineProperty(exports, \"formatLocale\", {\n  enumerable: true,\n  get: function () {\n    return _locale.default;\n  }\n});\nObject.defineProperty(exports, \"formatSpecifier\", {\n  enumerable: true,\n  get: function () {\n    return _formatSpecifier.default;\n  }\n});\nObject.defineProperty(exports, \"FormatSpecifier\", {\n  enumerable: true,\n  get: function () {\n    return _formatSpecifier.FormatSpecifier;\n  }\n});\nObject.defineProperty(exports, \"precisionFixed\", {\n  enumerable: true,\n  get: function () {\n    return _precisionFixed.default;\n  }\n});\nObject.defineProperty(exports, \"precisionPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _precisionPrefix.default;\n  }\n});\nObject.defineProperty(exports, \"precisionRound\", {\n  enumerable: true,\n  get: function () {\n    return _precisionRound.default;\n  }\n});\n\nvar _defaultLocale = _interopRequireWildcard(require(\"./defaultLocale.js\"));\n\nvar _locale = _interopRequireDefault(require(\"./locale.js\"));\n\nvar _formatSpecifier = _interopRequireWildcard(require(\"./formatSpecifier.js\"));\n\nvar _precisionFixed = _interopRequireDefault(require(\"./precisionFixed.js\"));\n\nvar _precisionPrefix = _interopRequireDefault(require(\"./precisionPrefix.js\"));\n\nvar _precisionRound = _interopRequireDefault(require(\"./precisionRound.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./defaultLocale.js\":\"VIed\",\"./locale.js\":\"Iakc\",\"./formatSpecifier.js\":\"Nf4q\",\"./precisionFixed.js\":\"cTEw\",\"./precisionPrefix.js\":\"aFxy\",\"./precisionRound.js\":\"we8G\"}],\"OsNT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataScope = DataScope;\nexports.DataScopeId = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _button = require(\"./button\");\n\nvar _d3Format = require(\"d3-format\");\n\nvar _language = require(\"../language\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar DataScopeId;\nexports.DataScopeId = DataScopeId;\n\n(function (DataScopeId) {\n  DataScopeId[DataScopeId[\"AllData\"] = 0] = \"AllData\";\n  DataScopeId[DataScopeId[\"SelectedData\"] = 1] = \"SelectedData\";\n  DataScopeId[DataScopeId[\"FilteredData\"] = 2] = \"FilteredData\";\n})(DataScopeId || (exports.DataScopeId = DataScopeId = {}));\n\nvar shortFormat = (0, _d3Format.format)('.2~s');\n\nfunction short(n) {\n  return n === -1 ? '--' : n ? n < 1000 ? n.toString() : shortFormat(n) : '0';\n}\n\nfunction DataScope(props) {\n  var dataCount = Object.assign({\n    all: -1,\n    filtered: -1,\n    selected: -1\n  }, props.dataCount);\n  return props.compact ? React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-datascope', 'compact'),\n    onClick: props.onCompactClick\n  }, React.createElement(Compact, Object.assign({}, props, {\n    dataScopeId: DataScopeId.AllData,\n    text: _language.strings.selectDataSpanAll,\n    count: dataCount.all\n  })), React.createElement(Compact, Object.assign({}, props, {\n    dataScopeId: DataScopeId.FilteredData,\n    text: _language.strings.selectDataSpanFilter,\n    count: dataCount.filtered\n  })), React.createElement(Compact, Object.assign({}, props, {\n    dataScopeId: DataScopeId.SelectedData,\n    text: _language.strings.selectDataSpanSelection,\n    count: dataCount.selected\n  }))) : React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-datascope', 'extended', props.active && 'active')\n  }, React.createElement(\"div\", null, React.createElement(\"div\", null, props.dataSet), React.createElement(\"div\", {\n    className: \"datascope-buttons\"\n  }, React.createElement(DataScopeButton, Object.assign({}, props, {\n    dataScopeId: DataScopeId.AllData,\n    text: _language.strings.selectDataSpanAll,\n    count: dataCount.all\n  })), React.createElement(DataScopeButton, Object.assign({}, props, {\n    dataScopeId: DataScopeId.FilteredData,\n    text: _language.strings.selectDataSpanFilter,\n    count: dataCount.filtered\n  })), React.createElement(DataScopeButton, Object.assign({}, props, {\n    dataScopeId: DataScopeId.SelectedData,\n    text: _language.strings.selectDataSpanSelection,\n    count: dataCount.selected\n  })))));\n}\n\nfunction Compact(props) {\n  return React.createElement(\"div\", {\n    title: props.text,\n    onClick: function onClick() {\n      props.onDataScopeClick(props.dataScopeId);\n    }\n  }, short(props.count));\n}\n\nfunction DataScopeButton(props) {\n  return React.createElement(_button.Button, {\n    themePalette: props.themePalette,\n    className: _sanddanceReact.util.classList('datascope-button', props.selectedDataScope === props.dataScopeId && 'selected'),\n    disabled: props.disabled,\n    text: props.text,\n    onClick: function onClick() {\n      props.onDataScopeClick(props.dataScopeId);\n    },\n    onRenderText: function onRenderText() {\n      return React.createElement(\"div\", {\n        title: props.count > 0 ? props.count.toString() : ''\n      }, React.createElement(\"label\", null, props.text), React.createElement(\"div\", null, short(props.count)));\n    },\n    onRenderIcon: function onRenderIcon() {\n      return null;\n    }\n  });\n}\n},{\"react\":\"ccIB\",\"./button\":\"eqtW\",\"d3-format\":\"SA6z\",\"../language\":\"hk5u\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"pJLc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataBrowser = DataBrowser;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _dataExporter = require(\"../controls/dataExporter\");\n\nvar _dataItem = require(\"../controls/dataItem\");\n\nvar _dataScope = require(\"../controls/dataScope\");\n\nvar _dropdown = require(\"../controls/dropdown\");\n\nvar _group = require(\"../controls/group\");\n\nvar _iconButton = require(\"../controls/iconButton\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction DataBrowser(props) {\n  function activateRecord(newIndex) {\n    props.onActivate(props.data[newIndex], newIndex);\n  }\n\n  var index = props.index;\n  var length = props.data && props.data.length || 0;\n  return React.createElement(_group.Group, {\n    label: _language.strings.labelDataBrowser,\n    className: \"sanddance-dataIndex\"\n  }, React.createElement(_dropdown.Dropdown, {\n    label: _language.strings.labelDataScope,\n    collapseLabel: true,\n    options: [{\n      key: _dataScope.DataScopeId.AllData,\n      text: _language.strings.selectDataSpanAll,\n      isSelected: props.selectedDataScope === _dataScope.DataScopeId.AllData\n    }, {\n      key: _dataScope.DataScopeId.FilteredData,\n      text: _language.strings.selectDataSpanFilter,\n      isSelected: props.selectedDataScope === _dataScope.DataScopeId.FilteredData\n    }, {\n      key: _dataScope.DataScopeId.SelectedData,\n      text: _language.strings.selectDataSpanSelection,\n      isSelected: props.selectedDataScope === _dataScope.DataScopeId.SelectedData\n    }],\n    onChange: function onChange(e, o) {\n      props.onDataScopeClick(o.key);\n    }\n  }), !props.data && React.createElement(\"div\", {\n    dangerouslySetInnerHTML: {\n      __html: props.nullMessage\n    }\n  }), props.data && !props.data.length && React.createElement(\"div\", null, props.zeroMessage), !!length && React.createElement(\"div\", null, React.createElement(\"div\", {\n    className: \"index\"\n  }, React.createElement(_iconButton.IconButton, {\n    themePalette: props.themePalette,\n    iconName: \"ChevronLeftMed\",\n    onClick: function onClick(e) {\n      return activateRecord(index <= 0 ? length - 1 : index - 1);\n    },\n    disabled: props.disabled || length === 1,\n    title: _language.strings.buttonPrevDataItem\n  }), React.createElement(\"span\", null, _language.strings.record(index + 1, length)), React.createElement(_iconButton.IconButton, {\n    themePalette: props.themePalette,\n    iconName: \"ChevronRightMed\",\n    onClick: function onClick(e) {\n      return activateRecord(index >= length - 1 ? 0 : index + 1);\n    },\n    disabled: props.disabled || length === 1,\n    title: _language.strings.buttonNextDataItem\n  })), !props.itemVisible && React.createElement(\"div\", {\n    className: \"item-filtered\"\n  }, _language.strings.labelDataItemIsFiltered), React.createElement(_dataItem.DataItem, {\n    columns: props.columns,\n    item: props.data[index],\n    disabled: props.disabled,\n    onSearch: props.onSearch,\n    bingSearchDisabled: props.bingSearchDisabled\n  })), props.dataExportHandler && props.data && React.createElement(_dataExporter.DataExportPicker, {\n    initializer: {\n      fileName: \"\".concat((0, _dataExporter.removeExtensions)(props.displayName), \" (\").concat(props.data.length, \")\")\n    },\n    data: props.data,\n    dataExportHandler: props.dataExportHandler,\n    disabled: props.disabled\n  }));\n}\n},{\"react\":\"ccIB\",\"../controls/dataExporter\":\"l7po\",\"../controls/dataItem\":\"Gai8\",\"../controls/dataScope\":\"OsNT\",\"../controls/dropdown\":\"Uyrp\",\"../controls/group\":\"Q3hf\",\"../controls/iconButton\":\"dQNc\",\"../language\":\"hk5u\"}],\"Tl9z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.defaultViewerOptions = exports.fontFamily = void 0;\n\nvar _themes = require(\"./themes\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar fontFamily = 'Segoe UI, sans-serif';\nexports.fontFamily = fontFamily;\nvar defaultViewerOptions = {\n  colors: (0, _themes.getColorSettingsFromThemePalette)(_themes.themePalettes['']),\n  fontFamily: fontFamily\n};\nexports.defaultViewerOptions = defaultViewerOptions;\n},{\"./themes\":\"CgE3\"}],\"ENdt\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.maxCategoricalColors = 20;\nvar Recommender = /** @class */ (function () {\n    function Recommender(columns, data) {\n    }\n    return Recommender;\n}());\nexports.Recommender = Recommender;\nfunction defaultColorScheme(c) {\n    if (c.quantitative) {\n        return 'redyellowgreen';\n    }\n    else if (c.stats.distinctValueCount === 2) {\n        return 'dual_redgreen';\n    }\n    else if (c.stats.distinctValueCount <= 10) {\n        return 'category10';\n    }\n    return 'category20';\n}\nexports.defaultColorScheme = defaultColorScheme;\n\n},{}],\"oxgd\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar recommender_1 = require(\"./recommender\");\nvar maxDistinctVal = 20;\nvar minDistinctVal = 2;\nvar BarChartRecommenderSummary = /** @class */ (function () {\n    function BarChartRecommenderSummary(columns, data) {\n        var score = -1;\n        for (var i = 0; i < columns.length; i++) {\n            var recommendation = new BarChartRecommender(columns[i], data).recommend();\n            if (recommendation.score > score) {\n                this.best = recommendation;\n                score = recommendation.score;\n            }\n            if (score === 1)\n                break;\n        }\n        for (var k = 0; k < columns.length; k++) {\n            var column = columns[k];\n            if (column.name === this.best.columns.x || column.stats.isSequential)\n                continue;\n            if (column.quantitative || (column.stats.distinctValueCount < recommender_1.maxCategoricalColors && column.stats.distinctValueCount > 1)) {\n                this.best.columns.color = this.best.columns.sort = column.name;\n                this.best.scheme = recommender_1.defaultColorScheme(column);\n                if (column.quantitative) {\n                    this.best.colorBin = 'quantile';\n                }\n                break;\n            }\n        }\n    }\n    BarChartRecommenderSummary.prototype.recommend = function () {\n        return this.best;\n    };\n    return BarChartRecommenderSummary;\n}());\nexports.BarChartRecommenderSummary = BarChartRecommenderSummary;\nvar BarChartRecommender = /** @class */ (function () {\n    function BarChartRecommender(column, data) {\n        this.score = 0;\n        this.column = column;\n        //the total score for bar chart is 1\n        this.rules = [\n            function (column) {\n                if (column.stats.isSequential)\n                    return false;\n                else if (column.quantitative) {\n                    return true;\n                }\n                else if (!column.quantitative && column.stats.distinctValueCount <= maxDistinctVal && column.stats.distinctValueCount >= minDistinctVal) {\n                    return true;\n                }\n                else {\n                    return false;\n                }\n            }\n        ];\n        for (var i = 0; i < this.rules.length; i++) {\n            if (this.rules[i](column))\n                this.score++;\n        }\n    }\n    BarChartRecommender.prototype.recommend = function () {\n        var rec = {\n            chart: 'barchart',\n            columns: {\n                x: this.column.name\n            },\n            score: this.score,\n            scheme: undefined,\n            view: '2d'\n        };\n        return rec;\n    };\n    return BarChartRecommender;\n}());\nexports.BarChartRecommender = BarChartRecommender;\n\n},{\"./recommender\":\"ENdt\"}],\"O4ew\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//TODO: languages other than english\nvar longitudeNames = ['lon', 'long', 'longitude'];\nvar latitudeNames = ['lat', 'latitude'];\nfunction isSpec(names, limits, column, data) {\n    var is = false;\n    var cname = column.name.toLowerCase();\n    for (var i = 0; i < names.length; i++) {\n        if (names[i] === cname) {\n            is = true;\n            break;\n        }\n    }\n    if (data) {\n        //TODO: spin through data to see if it is within limits\n    }\n    return is;\n}\nfunction isLongitude(column, data) {\n    return isSpec(longitudeNames, [-180, 180], column, data);\n}\nexports.isLongitude = isLongitude;\nfunction isLatitude(column, data) {\n    return isSpec(latitudeNames, [-90, 90], column, data);\n}\nexports.isLatitude = isLatitude;\nfunction isGeo(column, data) {\n    return isLatitude(column, data) || isLongitude(column, data);\n}\nexports.isGeo = isGeo;\n\n},{}],\"iBe2\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar recommender_1 = require(\"./recommender\");\nvar geo_1 = require(\"./geo\");\nvar ScatterPlotRecommenderSummary = /** @class */ (function () {\n    function ScatterPlotRecommenderSummary(columns, data) {\n        var longi = false;\n        var lati = false;\n        var rec = {\n            chart: 'scatterplot',\n            score: undefined,\n            columns: {},\n            scheme: undefined,\n            view: '2d'\n        };\n        columns.forEach(function (column) {\n            if (longi === false && geo_1.isLongitude(column)) {\n                longi = true;\n                rec.columns.x = column.name;\n            }\n            else if (lati === false && geo_1.isLatitude(column)) {\n                lati = true;\n                rec.columns.y = column.name;\n            }\n            else if (!rec.columns.color && !column.stats.isSequential) {\n                if (column.quantitative || column.stats.distinctValueCount < recommender_1.maxCategoricalColors) {\n                    rec.columns.color = rec.columns.sort = column.name;\n                    rec.scheme = recommender_1.defaultColorScheme(column);\n                    if (column.quantitative) {\n                        rec.colorBin = 'quantile';\n                    }\n                }\n            }\n        });\n        if (longi && lati) {\n            this.best = rec;\n        }\n    }\n    ScatterPlotRecommenderSummary.prototype.recommend = function () {\n        return this.best;\n    };\n    return ScatterPlotRecommenderSummary;\n}());\nexports.ScatterPlotRecommenderSummary = ScatterPlotRecommenderSummary;\n\n},{\"./recommender\":\"ENdt\",\"./geo\":\"O4ew\"}],\"At4q\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar geo_1 = require(\"./geo\");\nfunction preferredColumnForTreemapSize(columns, strict) {\n    for (var i = 0; i < columns.length; i++) {\n        var c = columns[i];\n        if (c.quantitative) {\n            if (strict && c.stats.hasNegative)\n                continue;\n            if (strict && c.stats.isSequential)\n                continue;\n            if (strict && geo_1.isGeo(c))\n                continue;\n            return c.name;\n        }\n    }\n}\nexports.preferredColumnForTreemapSize = preferredColumnForTreemapSize;\n\n},{\"./geo\":\"O4ew\"}],\"fB3P\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar barChart_1 = require(\"./barChart\");\nvar scatterPlot_1 = require(\"./scatterPlot\");\nvar RecommenderSummary = /** @class */ (function () {\n    function RecommenderSummary(columns, data) {\n        var quickRec = new scatterPlot_1.ScatterPlotRecommenderSummary(columns, data).recommend();\n        if (quickRec) {\n            this.rec = quickRec;\n        }\n        else {\n            var barChartrec = new barChart_1.BarChartRecommenderSummary(columns, data).recommend();\n            if (barChartrec && barChartrec.score >= 1) {\n                this.rec = barChartrec;\n            }\n            else {\n                this.rec = {\n                    chart: 'grid',\n                    columns: {},\n                    score: 1\n                };\n            }\n        }\n    }\n    RecommenderSummary.prototype.recommend = function () {\n        return this.rec;\n    };\n    return RecommenderSummary;\n}());\nexports.RecommenderSummary = RecommenderSummary;\n\n},{\"./barChart\":\"oxgd\",\"./scatterPlot\":\"iBe2\"}],\"i6UQ\":[function(require,module,exports) {\n\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n__export(require(\"./barChart\"));\n__export(require(\"./geo\"));\n__export(require(\"./scatterPlot\"));\n__export(require(\"./treemap\"));\n__export(require(\"./recommenderSummary\"));\n\n},{\"./barChart\":\"oxgd\",\"./geo\":\"O4ew\",\"./scatterPlot\":\"iBe2\",\"./treemap\":\"At4q\",\"./recommenderSummary\":\"fB3P\"}],\"f8v0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ensureColumnsExist = ensureColumnsExist;\nexports.ensureColumnsPopulated = ensureColumnsPopulated;\n\nvar _chartRecommender = require(\"@msrvida/chart-recommender\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"./language\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction ensureColumnsExist(insightColumns, actualColumns) {\n  var _loop = function _loop(role) {\n    var columnName = insightColumns[role];\n    var column = actualColumns.filter(function (c) {\n      return c.name === columnName;\n    })[0];\n\n    if (!column) {\n      delete insightColumns[role];\n    }\n  };\n\n  //ensure columns exist\n  for (var role in insightColumns) {\n    _loop(role);\n  }\n}\n\nfunction ensureColumnsPopulated(chart, insightColumns, actualColumns) {\n  //ensure columns are populated\n  var firstColumn = actualColumns.filter(function (c) {\n    return !_sanddanceReact.SandDance.util.isInternalFieldName(c.name);\n  })[0];\n  var firstColumnName = firstColumn && firstColumn.name;\n\n  var ensureColumn = function ensureColumn(role) {\n    if (!insightColumns[role]) {\n      insightColumns[role] = firstColumnName;\n    }\n  };\n\n  switch (chart) {\n    case 'barchart':\n    case 'barchartV':\n      ensureColumn('x');\n      break;\n\n    case 'barchartH':\n      ensureColumn('y');\n      break;\n\n    case 'density':\n    case 'scatterplot':\n    case 'stacks':\n      ensureColumn('x');\n      ensureColumn('y');\n      break;\n\n    case 'treemap':\n      if (!insightColumns.size) {\n        insightColumns.size = (0, _chartRecommender.preferredColumnForTreemapSize)(actualColumns, true);\n\n        if (!insightColumns.size) {\n          insightColumns.size = (0, _chartRecommender.preferredColumnForTreemapSize)(actualColumns, false);\n        }\n      }\n\n      if (!insightColumns.size) {\n        //error - no numeric column\n        return [_language.strings.errorColumnMustBeNumeric];\n      }\n\n      break;\n  }\n}\n},{\"@msrvida/chart-recommender\":\"i6UQ\",\"@msrvida/sanddance-react\":\"MjKu\",\"./language\":\"hk5u\"}],\"yvMl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPosition = getPosition;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction hasClientXY(e) {\n  if (e && e.clientX !== undefined && e.clientX !== undefined) {\n    return {\n      top: e.clientY,\n      left: e.clientX\n    };\n  }\n}\n\nfunction getPosition(e) {\n  var xy = hasClientXY(e);\n\n  if (xy) {\n    return xy;\n  }\n\n  var te = e;\n\n  if (te) {\n    for (var i = 0; i < te.touches.length; i++) {\n      var _xy = hasClientXY(te.touches[i]);\n\n      if (_xy) {\n        return _xy;\n      }\n    }\n  }\n}\n},{}],\"xBH3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getValidOperators = getValidOperators;\nexports.getText = getText;\nexports.SearchTerm = SearchTerm;\nexports.maxAutocomplete = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dropdown = require(\"./dropdown\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nvar maxAutocomplete = 100;\nexports.maxAutocomplete = maxAutocomplete;\n\nfunction getValidOperators(column) {\n  var type = column && column.type;\n\n  switch (type) {\n    case 'boolean':\n      return [['==', _language.strings.searchEQ], ['!=', _language.strings.searchNEQ], ['isnullorEmpty', _language.strings.searchNULL]];\n\n    case 'date':\n    case 'integer':\n    case 'number':\n      return [['==', _language.strings.searchEQ], ['!=', _language.strings.searchNEQ], ['>', _language.strings.searchGT], ['>=', _language.strings.searchGTE], ['<', _language.strings.searchLT], ['<=', _language.strings.searchLTE], ['isnullorEmpty', _language.strings.searchNULL]];\n\n    case 'string':\n    default:\n      return [['==', _language.strings.searchEQ], ['!=', _language.strings.searchNEQ], ['>', _language.strings.searchGT], ['>=', _language.strings.searchGTE], ['<', _language.strings.searchLT], ['<=', _language.strings.searchLTE], ['contains', _language.strings.searchIN], ['starts', _language.strings.searchSW], ['isnullorEmpty', _language.strings.searchNULL]];\n  }\n}\n\nfunction getExpressionClauses(currClause, index) {\n  var keys = [['&&', _language.strings.searchAND], ['||', _language.strings.searchOR]];\n  return keys.map(function (key, i) {\n    var _key = _slicedToArray(key, 2),\n        clause = _key[0],\n        text = _key[1];\n\n    var selected = currClause == clause; //deliberate double equal \n\n    var option = {\n      key: i,\n      text: text,\n      data: clause,\n      selected: selected\n    };\n    return option;\n  });\n}\n\nfunction getOperators(ex, column) {\n  var anySelected = false;\n  var validOperators = getValidOperators(column);\n  var options = validOperators.map(function (validoperator) {\n    var _validoperator = _slicedToArray(validoperator, 2),\n        op = _validoperator[0],\n        text = _validoperator[1];\n\n    var selected = ex.operator === op;\n    anySelected = anySelected || selected;\n    var option = {\n      key: op,\n      text: text,\n      data: op,\n      selected: selected\n    };\n    return option;\n  });\n\n  if (!anySelected) {\n    options[0].selected = true;\n  }\n\n  return options;\n}\n\nfunction getDistinctValues(data, columnName) {\n  var distinctMap = {};\n\n  for (var i = 0; i < data.length; i++) {\n    var row = data[i];\n    var value = row[columnName];\n    distinctMap[value] = true;\n  }\n\n  return Object.keys(distinctMap).sort();\n}\n\nfunction getValues(ex, column, data, autoCompleteDistinctValues) {\n  var stats = column && column.stats;\n\n  if (stats && stats.distinctValueCount < maxAutocomplete) {\n    if (!autoCompleteDistinctValues[column.name]) {\n      autoCompleteDistinctValues[column.name] = getDistinctValues(data, column.name);\n    }\n\n    return autoCompleteDistinctValues[column.name].map(function (v, i) {\n      return {\n        key: i,\n        text: v\n      };\n    });\n  }\n\n  return [];\n}\n\nfunction getText(ex) {\n  if (ex.operator === 'isnullorEmpty') return '';\n  return typeof ex.value === 'string' ? ex.value : ex.value == null ? '' : ex.value.toString();\n}\n\nfunction SearchTerm(props) {\n  var ex = props.searchExpression;\n  var possibleValues = getValues(ex, props.column, props.data, props.autoCompleteDistinctValues); //TODO better date handling with calendar picker\n\n  return React.createElement(\"div\", null, props.index > 0 && React.createElement(_dropdown.Dropdown, {\n    className: \"search-field\",\n    //label={strings.labelSearchClause}\n    dropdownWidth: 120,\n    disabled: !ex.unlocked,\n    options: getExpressionClauses(ex.clause, props.index),\n    onChange: function onChange(e, o) {\n      return props.onUpdateExpression({\n        clause: o.data\n      }, props.index);\n    }\n  }), React.createElement(_dropdown.Dropdown, {\n    className: \"search-field\",\n    //label={strings.labelSearchColumn}\n    options: [{\n      key: '',\n      text: _language.strings.selectAny,\n      data: null,\n      selected: ex.name === null\n    }].concat(props.columns.map(function (c, i) {\n      return {\n        key: c.name,\n        text: c.name,\n        data: c,\n        selected: c.name === ex.name\n      };\n    })),\n    onChange: function onChange(e, o) {\n      return props.onUpdateExpression({\n        name: o.data && o.data.name || null\n      }, props.index);\n    }\n  }), React.createElement(_dropdown.Dropdown, {\n    className: \"search-field\",\n    //label={strings.labelSearchOperator}\n    dropdownWidth: 120,\n    options: getOperators(ex, props.column),\n    onChange: function onChange(e, o) {\n      return props.onUpdateExpression({\n        operator: o.data\n      }, props.index);\n    }\n  }), possibleValues.length > 0 && React.createElement(_base.base.fabric.ComboBox, {\n    className: \"search-field\",\n    //label={strings.labelSearchValue}\n    disabled: ex.operator === 'isnullorEmpty',\n    dropdownWidth: _dropdown.dropdownWidth,\n    allowFreeform: true,\n    autoComplete: \"on\",\n    errorMessage: ex.errorMessage,\n    text: getText(ex),\n    options: getValues(ex, props.column, props.data, props.autoCompleteDistinctValues),\n    onChange: function onChange(e, o, i, value) {\n      if (o) {\n        value = o.text;\n      }\n\n      props.onUpdateExpression({\n        value: value\n      }, props.index);\n    }\n  }), possibleValues.length === 0 && React.createElement(_base.base.fabric.TextField, {\n    className: \"search-field\",\n    //label={strings.labelSearchValue}\n    disabled: ex.operator === 'isnullorEmpty',\n    errorMessage: ex.errorMessage,\n    value: getText(ex),\n    onChange: function onChange(e, v) {\n      return props.onUpdateExpression({\n        value: v\n      }, props.index);\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./dropdown\":\"Uyrp\",\"../language\":\"hk5u\"}],\"ozxe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Search = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _searchTerm = require(\"../controls/searchTerm\");\n\nvar _base = require(\"../base\");\n\nvar _button = require(\"../controls/button\");\n\nvar _dropdown = require(\"../controls/dropdown\");\n\nvar _group = require(\"../controls/group\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nvar maxClauses = 5;\n\nfunction getColumnWithName(columnName, columns) {\n  for (var i = 0; i < columns.length; i++) {\n    if (columns[i].name === columnName) return columns[i];\n  }\n}\n\nfunction validateExpression(ex) {\n  if (ex.operator === 'isnullorEmpty') {\n    ex.errorMessage = null;\n    return;\n  }\n\n  var s = (0, _searchTerm.getText)(ex);\n\n  if (s.length === 0) {\n    ex.errorMessage = _language.strings.labelRequired;\n  } else {\n    ex.errorMessage = null;\n  }\n}\n\nfunction clearExpressionValidation(ex) {\n  if (ex.operator === 'isnullorEmpty') {\n    ex.errorMessage = null;\n    return;\n  }\n\n  var s = (0, _searchTerm.getText)(ex);\n\n  if (s.length !== 0) {\n    ex.errorMessage = null;\n  }\n}\n\nfunction getGroupClauses(currClause, index) {\n  var keys;\n\n  if (index === 0) {\n    keys = [[null, _language.strings.searchWHERE]];\n  } else {\n    keys = [['&&', _language.strings.searchAND], ['||', _language.strings.searchOR]];\n  }\n\n  return keys.map(function (key, i) {\n    var _key = _slicedToArray(key, 2),\n        clause = _key[0],\n        text = _key[1];\n\n    var selected = currClause == clause; //deliberate double equal \n\n    var option = {\n      key: i,\n      text: text,\n      data: clause,\n      selected: selected\n    };\n    return option;\n  });\n}\n\nvar Search =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Search, _React$Component);\n\n  function Search(props) {\n    var _this;\n\n    _classCallCheck(this, Search);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Search).call(this, props));\n    _this.state = _this.getInitialState(_this.props);\n    return _this;\n  }\n\n  _createClass(Search, [{\n    key: \"getInitialState\",\n    value: function getInitialState(props) {\n      var initialState = {\n        groups: props.initializer.search || [this.newGroup(0, null)],\n        sortedColumns: _toConsumableArray(props.initializer.columns).sort(function (a, b) {\n          return a.name.localeCompare(b.name);\n        }),\n        initializer: props.initializer\n      };\n      initialState.groups.forEach(function (group) {\n        group.expressions.forEach(function (ex) {\n          return ex.unlocked = group.expressions.length <= 2;\n        });\n      });\n      return initialState;\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      if (!_sanddanceReact.util.deepCompare(this.props.initializer, this.state.initializer)) {\n        this.setState(this.getInitialState(this.props));\n      }\n    }\n  }, {\n    key: \"validateAndSearch\",\n    value: function validateAndSearch() {\n      var _this2 = this;\n\n      var groups = _toConsumableArray(this.state.groups);\n\n      groups.forEach(function (group) {\n        group.expressions.forEach(validateExpression);\n        var errors = group.expressions.reduce(function (p, c) {\n          return p || c.errorMessage;\n        }, '');\n\n        if (errors) {\n          _this2.setState({\n            groups: groups\n          });\n        } else {\n          _this2.props.onSelect(_this2.state.groups);\n        }\n      });\n    }\n  }, {\n    key: \"newGroup\",\n    value: function newGroup(key, clause) {\n      var group = {\n        key: key,\n        clause: clause,\n        expressions: [this.newExpression(0, null)]\n      };\n      return group;\n    }\n  }, {\n    key: \"updateGroup\",\n    value: function updateGroup(partialGroup, groupIndex) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var group = Object.assign(Object.assign({}, groups[groupIndex]), partialGroup);\n      groups[groupIndex] = group;\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"addGroup\",\n    value: function addGroup() {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var maxKey = groups.reduce(function (max, p) {\n        return p.key > max ? p.key : max;\n      }, groups[0].key);\n      var newGroup = this.newGroup(maxKey + 1, '&&');\n      groups.push(newGroup);\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"deleteGroup\",\n    value: function deleteGroup(groupIndex) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      groups.splice(groupIndex, 1);\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"newExpression\",\n    value: function newExpression(key, clause) {\n      var ex = {\n        key: key,\n        clause: clause,\n        name: null,\n        operator: 'contains',\n        value: ''\n      };\n      return ex;\n    }\n  }, {\n    key: \"addExpression\",\n    value: function addExpression(groupIndex) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var group = groups[groupIndex];\n      var maxKey = group.expressions.reduce(function (max, p) {\n        return p.key > max ? p.key : max;\n      }, group.expressions[0].key);\n      var newEx = this.newExpression(maxKey + 1, '&&');\n      group.expressions.push(newEx);\n\n      if (group.expressions.length === 2) {\n        newEx.unlocked = true;\n      } else {\n        group.expressions.forEach(function (ex) {\n          return ex.unlocked = false;\n        });\n        newEx.clause = group.expressions[1].clause;\n      }\n\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"updateExpression\",\n    value: function updateExpression(partialEx, groupIndex, index) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var group = groups[groupIndex];\n\n      var ex = _sanddanceReact.SandDance.VegaDeckGl.util.clone(group.expressions[index]);\n\n      if (ex.name !== partialEx.name) {\n        //choose an appropriate operator when switching data type\n        var oldColumn = getColumnWithName(ex.name, this.state.sortedColumns);\n        var newColumn = getColumnWithName(partialEx.name, this.state.sortedColumns);\n        var oldType = oldColumn && oldColumn.type;\n        var newType = newColumn && newColumn.type;\n\n        if (oldType !== newType) {\n          var newOperators = (0, _searchTerm.getValidOperators)(newColumn).map(function (validOperator) {\n            return validOperator[0];\n          }); //see if old operator is compatible\n\n          if (newOperators.indexOf(ex.operator) < 0) {\n            //not compatible, so choose \"equal\"\n            partialEx.operator = '==';\n          }\n        }\n      }\n\n      Object.assign(ex, partialEx);\n      clearExpressionValidation(ex);\n      group.expressions[index] = ex;\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"deleteExpression\",\n    value: function deleteExpression(groupIndex, index) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var group = groups[groupIndex];\n\n      var expressions = _toConsumableArray(group.expressions);\n\n      expressions.splice(index, 1);\n\n      if (expressions.length === 2) {\n        expressions[1].unlocked = true;\n      }\n\n      group.expressions = expressions;\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this3 = this;\n\n      return React.createElement(_group.Group, {\n        className: \"sanddance-search\",\n        label: _language.strings.labelSearch\n      }, React.createElement(\"div\", null, this.state.groups.map(function (group, groupIndex) {\n        return React.createElement(\"div\", {\n          className: \"sanddance-search-group\",\n          key: group.key\n        }, React.createElement(_dropdown.Dropdown, {\n          className: \"search-group-clause\",\n          //label={strings.labelSearchClause}\n          disabled: groupIndex === 0,\n          dropdownWidth: 120,\n          options: getGroupClauses(group.clause, groupIndex),\n          onChange: function onChange(e, o) {\n            return _this3.updateGroup({\n              clause: o.data\n            }, groupIndex);\n          }\n        }), React.createElement(\"div\", null, group.expressions.map(function (ex, i) {\n          return React.createElement(\"div\", {\n            className: \"sanddance-search-expression\",\n            key: ex.key\n          }, React.createElement(_searchTerm.SearchTerm, {\n            onUpdateExpression: function onUpdateExpression(ex, i) {\n              return _this3.updateExpression(ex, groupIndex, i);\n            },\n            autoCompleteDistinctValues: _this3.props.autoCompleteDistinctValues,\n            index: i,\n            columns: _this3.state.sortedColumns,\n            data: _this3.props.data,\n            searchExpression: ex,\n            column: getColumnWithName(ex.name, _this3.state.sortedColumns)\n          }), group.expressions.length > 1 && React.createElement(_button.Button, {\n            themePalette: _this3.props.themePalette,\n            className: \"search-action\",\n            iconName: \"Cancel\",\n            onClick: function onClick() {\n              return _this3.deleteExpression(groupIndex, i);\n            },\n            text: _language.strings.buttonDeleteExpression\n          }));\n        })), group.expressions.length < maxClauses && React.createElement(\"div\", null, React.createElement(_button.Button, {\n          themePalette: _this3.props.themePalette,\n          className: \"search-action\",\n          iconName: \"Add\",\n          onClick: function onClick() {\n            return _this3.addExpression(groupIndex);\n          },\n          text: _language.strings.buttonAddExpression\n        })), _this3.state.groups.length > 1 && React.createElement(_button.Button, {\n          themePalette: _this3.props.themePalette,\n          className: \"search-action\",\n          iconName: \"Cancel\",\n          onClick: function onClick() {\n            return _this3.deleteGroup(groupIndex);\n          },\n          text: _language.strings.buttonDeleteExpressionGroup\n        }));\n      }), this.state.groups.length < maxClauses && React.createElement(\"div\", null, React.createElement(_button.Button, {\n        themePalette: this.props.themePalette,\n        className: \"search-action search-bottom-action\",\n        iconName: \"Add\",\n        onClick: function onClick() {\n          return _this3.addGroup();\n        },\n        text: _language.strings.buttonAddExpressionGroup\n      }))), React.createElement(_base.base.fabric.PrimaryButton, {\n        className: \"search-action search-bottom-action\",\n        text: _language.strings.buttonSelect,\n        onClick: function onClick() {\n          return _this3.validateAndSearch();\n        }\n      }));\n    }\n  }]);\n\n  return Search;\n}(React.Component);\n\nexports.Search = Search;\n},{\"react\":\"ccIB\",\"../controls/searchTerm\":\"xBH3\",\"../base\":\"Vlbn\",\"../controls/button\":\"eqtW\",\"../controls/dropdown\":\"Uyrp\",\"../controls/group\":\"Q3hf\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"f19h\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.loadDataArray = exports.loadDataFile = void 0;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar loadDataFile = function loadDataFile(dataFile) {\n  return new Promise(function (resolve, reject) {\n    var vega = _sanddanceReact.SandDance.VegaDeckGl.base.vega;\n    var loader = vega.loader();\n\n    function handleRawText(text) {\n      var data = vega.read(text, {\n        type: dataFile.type,\n        parse: 'auto'\n      });\n      loadDataArray(data).then(resolve).catch(reject);\n    }\n\n    if (dataFile.dataUrl) {\n      loader.load(dataFile.dataUrl).then(handleRawText).catch(reject);\n    } else if (dataFile.rawText) {\n      handleRawText(dataFile.rawText);\n    } else {\n      reject('dataFile object must have either dataUrl or rawText property set.');\n    }\n  });\n};\n\nexports.loadDataFile = loadDataFile;\n\nvar loadDataArray = function loadDataArray(data) {\n  return new Promise(function (resolve, reject) {\n    var columns = _sanddanceReact.SandDance.util.getColumnsFromData(data).sort(function (a, b) {\n      return a.name.localeCompare(b.name);\n    });\n\n    resolve({\n      data: data,\n      columns: columns\n    });\n  });\n};\n\nexports.loadDataArray = loadDataArray;\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"UUG7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.onBeforeCreateLayers = onBeforeCreateLayers;\nexports.PositionedColumnMap = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _columnMap = require(\"./controls/columnMap\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction onBeforeCreateLayers(stage, specCapabilities) {\n  var _loop = function _loop(axisName) {\n    specCapabilities.roles.forEach(function (specRole) {\n      if (specRole.role === axisName) {\n        var axes = stage.axes[axisName];\n        axes.forEach(function (axis) {\n          if (axis.title) {\n            var textItem = axis.title;\n            textItem.specRole = specRole;\n          }\n        });\n      }\n    });\n  };\n\n  for (var axisName in stage.axes) {\n    _loop(axisName);\n  }\n}\n\nfunction px(n) {\n  return n + 'px';\n}\n\nvar PositionedColumnMap =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(PositionedColumnMap, _React$Component);\n\n  function PositionedColumnMap(props) {\n    var _this;\n\n    _classCallCheck(this, PositionedColumnMap);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(PositionedColumnMap).call(this, props));\n    var left = props.left,\n        top = props.top;\n    _this.state = {\n      left: left,\n      top: top\n    };\n    _this.dropdownRef = React.createRef();\n    return _this;\n  }\n\n  _createClass(PositionedColumnMap, [{\n    key: \"focus\",\n    value: function focus() {\n      if (!this.focused) {\n        this.focused = true;\n        this.dropdownRef.current.focus(true);\n      }\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      var size = _sanddanceReact.SandDance.VegaDeckGl.util.outerSize(this.div);\n\n      var over = {\n        left: Math.max(0, this.state.left + size.width - this.props.container.offsetWidth),\n        top: Math.max(0, this.state.top + size.height - this.props.container.offsetHeight)\n      };\n\n      if (over.left || over.top) {\n        var _this$state = this.state,\n            left = _this$state.left,\n            top = _this$state.top;\n        left -= over.left;\n        top -= over.top;\n        this.setState({\n          left: left,\n          top: top\n        });\n      } else {\n        this.focus();\n      }\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      this.focus();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      return React.createElement(\"div\", {\n        ref: function ref(div) {\n          if (div) _this2.div = div;\n        },\n        className: \"sanddance-columnMap-absolute\",\n        style: {\n          position: 'absolute',\n          left: px(this.state.left),\n          top: px(this.state.top)\n        }\n      }, React.createElement(_columnMap.ColumnMap, Object.assign({}, this.props, {\n        componentRef: this.dropdownRef,\n        hideSignals: true\n      })));\n    }\n  }]);\n\n  return PositionedColumnMap;\n}(React.Component);\n\nexports.PositionedColumnMap = PositionedColumnMap;\n},{\"react\":\"ccIB\",\"./controls/columnMap\":\"DSho\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"RvaL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.version = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar version = '1.7.1';\nexports.version = version;\n},{}],\"zKGJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Settings = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar SandDanceReact = _interopRequireWildcard(require(\"@msrvida/sanddance-react\"));\n\nvar _base = require(\"../base\");\n\nvar _canvas = require(\"../canvas\");\n\nvar _dialog = require(\"../controls/dialog\");\n\nvar _dropdown = require(\"../controls/dropdown\");\n\nvar _group = require(\"../controls/group\");\n\nvar _signal = require(\"../controls/signal\");\n\nvar _language = require(\"../language\");\n\nvar _version = require(\"../version\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar SandDance = SandDanceReact.SandDance;\nvar DataRefType;\n\n(function (DataRefType) {\n  DataRefType[DataRefType[\"none\"] = 0] = \"none\";\n  DataRefType[DataRefType[\"inline\"] = 1] = \"inline\";\n  DataRefType[DataRefType[\"url\"] = 2] = \"url\";\n})(DataRefType || (DataRefType = {}));\n\nfunction filterSignals(signal) {\n  switch (signal.name) {\n    case SandDance.constants.SignalNames.XBins:\n    case SandDance.constants.SignalNames.YBins:\n    case SandDance.constants.SignalNames.ColorBinCount:\n    case SandDance.constants.SignalNames.ColorReverse:\n    case SandDance.constants.SignalNames.PointSize:\n    case SandDance.constants.SignalNames.TreeMapMethod:\n      return false;\n\n    default:\n      return !!signal.bind;\n  }\n}\n\nfunction cloneData(vegaSpec) {\n  var data0 = vegaSpec.data[0];\n  var valuesData = data0;\n  var values = valuesData.values;\n  delete valuesData.values;\n  var data = SandDance.VegaDeckGl.util.clone(vegaSpec.data);\n  valuesData.values = values;\n  return data;\n}\n\nfunction cloneScales(vegaSpec) {\n  return SandDance.VegaDeckGl.util.clone(vegaSpec.scales);\n}\n\nfunction serializeSpec(vegaSpec, datafile, dataRefType, scheme) {\n  var scales = cloneScales(vegaSpec);\n  var colorScale = scales.filter(function (scale) {\n    return scale.name === SandDance.constants.ScaleNames.Color;\n  })[0];\n\n  if (scheme.indexOf('dual_') >= 0) {\n    colorScale.range = SandDance.colorSchemes.filter(function (cs) {\n      return cs.scheme === scheme;\n    })[0].colors;\n  }\n\n  if (dataRefType === DataRefType.inline) {\n    return Object.assign(Object.assign({}, vegaSpec), {\n      scales: scales\n    });\n  }\n\n  var data = cloneData(vegaSpec);\n  var data0 = data[0];\n\n  if (dataRefType === DataRefType.none) {\n    var valuesData = data0;\n    valuesData.values = [];\n  } else if (dataRefType === DataRefType.url) {\n    var urlData = data0;\n    urlData.url = datafile.dataUrl;\n    urlData.format = {\n      parse: 'auto',\n      type: datafile.type\n    };\n  }\n\n  return Object.assign(Object.assign({}, vegaSpec), {\n    data: data,\n    scales: scales\n  });\n}\n\nfunction defaultDataRefType(datafile) {\n  if (datafile.dataUrl) {\n    return DataRefType.url;\n  }\n\n  return DataRefType.none;\n}\n\nfunction initState(props) {\n  return {\n    showSystemDialog: false,\n    showVegaDialog: false,\n    dataRefType: defaultDataRefType(props.dataFile),\n    spec: null\n  };\n}\n\nfunction signalGroupKey(key) {\n  for (var i = 0; i < _language.strings.signalGroups.length; i++) {\n    if (_language.strings.signalGroups[i].prefix === key) {\n      return key;\n    }\n  }\n\n  return '*';\n}\n\nfunction vegaSignalGroups(vegaSignals) {\n  var signalGroupMap = {};\n  vegaSignals.forEach(function (vs) {\n    var split = vs.name.split('_');\n    var key = signalGroupKey(split[0]);\n    signalGroupMap[key] = signalGroupMap[key] || [];\n    signalGroupMap[key].push(vs);\n  });\n  return signalGroupMap;\n}\n\nvar Settings =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Settings, _React$Component);\n\n  function Settings(props) {\n    var _this;\n\n    _classCallCheck(this, Settings);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Settings).call(this, props));\n    _this.state = initState(props);\n    return _this;\n  }\n\n  _createClass(Settings, [{\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var props = this.props,\n          state = this.state;\n      if (!props.explorer.viewer || !props.explorer.viewer.vegaSpec) return null;\n      var options = [{\n        key: DataRefType.none,\n        text: _language.strings.selectVegaSpecDataNone,\n        selected: this.state.dataRefType === DataRefType.none,\n        data: DataRefType.none\n      }, !props.dataFile.rawText && {\n        key: DataRefType.url,\n        text: _language.strings.selectVegaSpecDataUrl,\n        selected: this.state.dataRefType === DataRefType.url,\n        data: DataRefType.url\n      }, {\n        key: DataRefType.inline,\n        text: _language.strings.selectVegaSpecDataInline,\n        selected: this.state.dataRefType === DataRefType.inline,\n        data: DataRefType.inline\n      }].filter(Boolean);\n      var signalGroupMap = vegaSignalGroups(props.explorer.viewer.vegaSpec.signals);\n      return React.createElement(\"div\", null, _language.strings.signalGroups.map(function (sg) {\n        var vegaSignals = signalGroupMap[sg.prefix];\n\n        if (vegaSignals) {\n          var filteredVegaSignals = vegaSignals.filter(filterSignals);\n\n          if (filteredVegaSignals.length > 0) {\n            return React.createElement(_group.Group, {\n              key: sg.prefix,\n              label: sg.label\n            }, filteredVegaSignals.map(function (signal, i) {\n              return React.createElement(_signal.Signal, {\n                key: i,\n                signal: signal,\n                explorer: props.explorer\n              });\n            }));\n          }\n        }\n      }), React.createElement(_group.Group, {\n        label: _language.strings.labelChartCanvas\n      }, React.createElement(_base.base.fabric.Toggle, {\n        label: _language.strings.labelShowAxes,\n        defaultChecked: !props.hideAxes,\n        onChange: function onChange(e, checked) {\n          return props.onToggleAxes(!checked);\n        }\n      }), React.createElement(_base.base.fabric.Toggle, {\n        label: _language.strings.labelShowLegend,\n        defaultChecked: !props.hideLegend,\n        onChange: function onChange(e, checked) {\n          return props.onToggleLegend(!checked);\n        }\n      })), React.createElement(_group.Group, {\n        label: _language.strings.labelTools\n      }, React.createElement(_base.base.fabric.DefaultButton, {\n        text: _language.strings.buttonShowVegaSpec,\n        onClick: function onClick() {\n          return _this2.setState({\n            showVegaDialog: true,\n            spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, _this2.state.dataRefType, _this2.props.scheme)\n          });\n        }\n      })), React.createElement(_group.Group, {\n        label: _language.strings.labelTransitionDurations\n      }, React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelTransitionColor,\n        onChange: function onChange(value) {\n          _this2.props.explorer.viewerOptions.transitionDurations.color = value;\n        },\n        min: 0,\n        max: 10000,\n        defaultValue: this.props.explorer.viewerOptions.transitionDurations.color\n      }), React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelTransitionPosition,\n        onChange: function onChange(value) {\n          _this2.props.explorer.viewerOptions.transitionDurations.position = value;\n        },\n        min: 0,\n        max: 10000,\n        defaultValue: this.props.explorer.viewerOptions.transitionDurations.position\n      }), React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelTransitionSize,\n        onChange: function onChange(value) {\n          _this2.props.explorer.viewerOptions.transitionDurations.size = value;\n        },\n        min: 0,\n        max: 10000,\n        defaultValue: this.props.explorer.viewerOptions.transitionDurations.size\n      }), React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelTransitionCamera,\n        onChange: function onChange(value) {\n          _this2.props.explorer.viewerOptions.transitionDurations.view = value;\n        },\n        min: 0,\n        max: 10000,\n        defaultValue: this.props.explorer.viewerOptions.transitionDurations.view\n      })), React.createElement(_group.Group, {\n        label: _language.strings.labelSystem\n      }, React.createElement(_base.base.fabric.DefaultButton, {\n        text: _language.strings.labelSystemInfo,\n        onClick: function onClick() {\n          return _this2.setState({\n            showSystemDialog: true\n          });\n        }\n      })), React.createElement(_dialog.Dialog, {\n        hidden: !state.showVegaDialog,\n        onDismiss: function onDismiss() {\n          return _this2.setState(initState(_this2.props));\n        },\n        minWidth: \"80%\",\n        title: _language.strings.labelVegaSpec,\n        buttons: [React.createElement(_base.base.fabric.PrimaryButton, {\n          key: \"copy\",\n          iconProps: {\n            iconName: 'Copy'\n          },\n          text: _language.strings.buttonCopyToClipboard,\n          onClick: function onClick() {\n            var pre = document.getElementById('sanddance-vega-spec');\n            var range = document.createRange();\n            range.selectNode(pre);\n            var selection = window.getSelection();\n            selection.removeAllRanges();\n            selection.addRange(range);\n            document.execCommand('copy');\n          }\n        }), React.createElement(_base.base.fabric.DefaultButton, {\n          key: \"edit\",\n          iconProps: {\n            iconName: 'OpenInNewWindow'\n          },\n          text: _language.strings.buttonLaunchVegaEditor,\n          onClick: function onClick() {\n            window.open('https://vega.github.io/editor/', '_blank');\n          }\n        })]\n      }, React.createElement(_dropdown.Dropdown, {\n        label: _language.strings.labelVegaSpecData,\n        options: options,\n        onChange: function onChange(e, o) {\n          return _this2.setState({\n            dataRefType: o.data,\n            spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, o.data, _this2.props.scheme)\n          });\n        }\n      }), React.createElement(\"pre\", {\n        id: \"sanddance-vega-spec\"\n      }, JSON.stringify(this.state.spec, null, 2)), React.createElement(\"div\", null, _language.strings.labelVegaSpecNotes)), React.createElement(_dialog.Dialog, {\n        hidden: !state.showSystemDialog,\n        onDismiss: function onDismiss() {\n          return _this2.setState(initState(_this2.props));\n        },\n        title: _language.strings.labelSystemInfo\n      }, React.createElement(\"ul\", null, this.props.children, React.createElement(\"li\", null, \"SandDanceExplorer version: \", _version.version), React.createElement(\"li\", null, \"SandDanceReact version: \", SandDanceReact.version), React.createElement(\"li\", null, \"SandDance version: \", SandDance.version), React.createElement(\"li\", null, \"WebGL enabled: \", _canvas.capabilities.webgl ? _language.strings.labelYes : _language.strings.labelNo), React.createElement(\"li\", null, \"WebGL2 enabled: \", _canvas.capabilities.webgl2 ? _language.strings.labelYes : _language.strings.labelNo))));\n    }\n  }]);\n\n  return Settings;\n}(React.Component);\n\nexports.Settings = Settings;\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\",\"../base\":\"Vlbn\",\"../canvas\":\"Dryx\",\"../controls/dialog\":\"cFWm\",\"../controls/dropdown\":\"Uyrp\",\"../controls/group\":\"Q3hf\",\"../controls/signal\":\"OWDI\",\"../language\":\"hk5u\",\"../version\":\"RvaL\"}],\"GuKX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Scrollable = Scrollable;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Scrollable(props) {\n  return React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('scrollable-container', props.className)\n  }, React.createElement(\"div\", {\n    className: \"scrollable\"\n  }, props.children));\n}\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"f8Jx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Sidebar = Sidebar;\nexports.Sidebutton = Sidebutton;\nexports.SideTabId = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dataScope = require(\"./dataScope\");\n\nvar _iconButton = require(\"./iconButton\");\n\nvar _scrollable = require(\"./scrollable\");\n\nvar _language = require(\"../language\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar SideTabId;\nexports.SideTabId = SideTabId;\n\n(function (SideTabId) {\n  SideTabId[SideTabId[\"ChartType\"] = 0] = \"ChartType\";\n  SideTabId[SideTabId[\"Data\"] = 1] = \"Data\";\n  SideTabId[SideTabId[\"Search\"] = 2] = \"Search\";\n  SideTabId[SideTabId[\"Color\"] = 3] = \"Color\";\n  SideTabId[SideTabId[\"Snapshots\"] = 4] = \"Snapshots\";\n  SideTabId[SideTabId[\"Settings\"] = 5] = \"Settings\";\n  SideTabId[SideTabId[\"Pin\"] = 6] = \"Pin\";\n  SideTabId[SideTabId[\"Collapse\"] = 7] = \"Collapse\";\n})(SideTabId || (exports.SideTabId = SideTabId = {}));\n\nfunction Sidebar(props) {\n  var sidebuttons = [{\n    sideTabId: SideTabId.ChartType,\n    iconName: 'BIDashboard',\n    title: _language.strings.labelChart\n  }, {\n    sideTabId: SideTabId.Color,\n    iconName: 'Color',\n    title: _language.strings.labelColor\n  }, {\n    sideTabId: SideTabId.Data,\n    iconName: 'Table',\n    title: _language.strings.labelDataBrowser\n  }, {\n    sideTabId: SideTabId.Search,\n    iconName: 'Search',\n    title: _language.strings.labelSearch\n  }, {\n    sideTabId: SideTabId.Snapshots,\n    iconName: 'Camera',\n    title: _language.strings.labelSnapshots\n  }, {\n    sideTabId: SideTabId.Settings,\n    iconName: 'Settings',\n    title: _language.strings.labelChartSettings\n  }];\n  return React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-sidebar', 'calculator', props.pinned && 'pinned', props.closed && 'closed')\n  }, React.createElement(\"div\", {\n    className: \"sidebar-content\"\n  }, React.createElement(_dataScope.DataScope, Object.assign({}, props.dataScopeProps)), React.createElement(\"div\", {\n    className: \"vbuttons\"\n  }, React.createElement(\"div\", {\n    className: \"sidebar-dialogs\"\n  }, sidebuttons.map(function (sidebutton, i) {\n    return React.createElement(Sidebutton, Object.assign({\n      key: i\n    }, props, sidebutton, {\n      themePalette: props.themePalette\n    }));\n  })), !props.hideSidebarControls && React.createElement(\"div\", {\n    className: \"sidebar-controls\"\n  }, React.createElement(Sidebutton, Object.assign({}, props, {\n    sideTabId: SideTabId.Pin,\n    iconName: props.pinned ? 'Pinned' : 'Pin',\n    title: props.pinned ? _language.strings.buttonToolbarFloat : _language.strings.buttonToolbarDock\n  })), React.createElement(Sidebutton, Object.assign({}, props, {\n    sideTabId: SideTabId.Collapse,\n    iconName: props.closed ? 'DoubleChevronRight12' : 'DoubleChevronLeft12',\n    title: props.closed ? _language.strings.buttonToolbarShow : _language.strings.buttonToolbarHide\n  })))), React.createElement(_scrollable.Scrollable, null, React.createElement(\"div\", {\n    className: \"sidetab\"\n  }, props.children)), props.calculating && React.createElement(\"div\", {\n    className: \"calculating\"\n  }, React.createElement(_base.base.fabric.Spinner, {\n    size: _base.base.fabric.SpinnerSize.large\n  }))));\n}\n\nfunction Sidebutton(props) {\n  return React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('vbutton', !props.closed && props.selectedSideTab === props.sideTabId && 'selected')\n  }, props.badgeText && React.createElement(\"div\", {\n    className: \"count\"\n  }, props.badgeText), React.createElement(_iconButton.IconButton, {\n    themePalette: props.themePalette,\n    className: \"vbutton\",\n    iconName: props.iconName,\n    title: props.title,\n    onClick: function onClick() {\n      props.onSideTabClick(props.sideTabId);\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./dataScope\":\"OsNT\",\"./iconButton\":\"dQNc\",\"./scrollable\":\"GuKX\",\"../language\":\"hk5u\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"oc9r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Snapshots = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dialog = require(\"../controls/dialog\");\n\nvar _canvas = require(\"../canvas\");\n\nvar _group = require(\"../controls/group\");\n\nvar _iconButton = require(\"../controls/iconButton\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar thumbWidth = 300;\n\nvar Snapshots =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Snapshots, _React$Component);\n\n  function Snapshots(props) {\n    var _this;\n\n    _classCallCheck(this, Snapshots);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Snapshots).call(this, props));\n    _this.state = {\n      formHidden: true,\n      description: '',\n      image: null,\n      bgColor: null,\n      insight: null\n    };\n    return _this;\n  }\n\n  _createClass(Snapshots, [{\n    key: \"saveSnapshot\",\n    value: function saveSnapshot() {\n      var snapshot = {\n        description: this.state.description,\n        insight: this.state.insight,\n        image: this.state.image,\n        bgColor: this.state.bgColor\n      };\n      this.props.modifySnapShot && this.props.modifySnapShot(snapshot);\n      this.props.onCreateSnapshot(snapshot);\n      this.setState({\n        formHidden: true,\n        description: ''\n      });\n    }\n  }, {\n    key: \"resize\",\n    value: function resize(src) {\n      var _this2 = this;\n\n      if (!src) return;\n      var img = new Image();\n\n      img.onload = function () {\n        var canvas = document.createElement('canvas'),\n            ctx = canvas.getContext('2d');\n        var ratio = img.width / thumbWidth;\n        canvas.height = img.height / ratio;\n        canvas.width = thumbWidth;\n        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n        var image = canvas.toDataURL();\n\n        _this2.setState({\n          image: image\n        });\n      };\n\n      img.src = src;\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this3 = this;\n\n      return React.createElement(_group.Group, {\n        className: \"sanddance-snapshots\",\n        label: _language.strings.labelSnapshots\n      }, React.createElement(_base.base.fabric.PrimaryButton, {\n        text: _language.strings.buttonCreateSnapshot,\n        onClick: function onClick(e) {\n          var canvas = (0, _canvas.getCanvas)(_this3.props.explorer.viewer);\n\n          _this3.resize(canvas && canvas.toDataURL('image/png'));\n\n          var bgColor = canvas && window.getComputedStyle(canvas).backgroundColor;\n\n          var insight = _this3.props.explorer.viewer.getInsight();\n\n          var description = _this3.props.getDescription && _this3.props.getDescription(insight) || '';\n\n          _this3.setState({\n            formHidden: false,\n            bgColor: bgColor,\n            description: description,\n            insight: insight\n          });\n        }\n      }), React.createElement(_dialog.Dialog, {\n        minWidth: \"\".concat(thumbWidth + 64, \"px\"),\n        hidden: this.state.formHidden,\n        onDismiss: function onDismiss() {\n          return _this3.setState({\n            formHidden: true\n          });\n        },\n        title: _language.strings.buttonCreateSnapshot,\n        buttons: [React.createElement(_base.base.fabric.PrimaryButton, {\n          key: 0,\n          onClick: function onClick(e) {\n            return _this3.saveSnapshot();\n          },\n          text: _language.strings.buttonCreateSnapshot\n        })]\n      }, React.createElement(_base.base.fabric.TextField, {\n        label: _language.strings.labelSnapshotDescription,\n        onKeyUp: function onKeyUp(e) {\n          return e.keyCode === 13 && _this3.saveSnapshot();\n        },\n        onChange: function onChange(e, description) {\n          return _this3.setState({\n            description: description\n          });\n        },\n        value: this.state.description\n      }), React.createElement(\"img\", {\n        src: this.state.image,\n        style: {\n          backgroundColor: this.state.bgColor,\n          width: \"\".concat(thumbWidth, \"px\")\n        }\n      }), this.props.explorer.viewer.colorContexts.length > 1 && React.createElement(\"div\", null, _language.strings.labelColorFilter)), React.createElement(\"div\", null, this.props.snapshots.map(function (snapshot, i) {\n        var actions = _this3.props.getActions && _this3.props.getActions(snapshot, i) || [];\n        actions.push({\n          iconButtonProps: {\n            themePalette: _this3.props.themePalette,\n            title: _language.strings.buttonDeleteSnapshot,\n            onClick: function onClick(e) {\n              return _this3.props.onRemoveSnapshot(i);\n            },\n            iconName: 'Delete'\n          }\n        });\n        return React.createElement(\"div\", {\n          key: i,\n          className: \"snapshot\"\n        }, React.createElement(\"div\", {\n          onClick: function onClick(e) {\n            return _this3.props.onSnapshotClick(snapshot);\n          }\n        }, React.createElement(\"div\", {\n          className: \"title\"\n        }, snapshot.description), React.createElement(\"img\", {\n          src: snapshot.image,\n          style: {\n            backgroundColor: snapshot.bgColor\n          }\n        })), React.createElement(Actions, {\n          actions: actions,\n          snapshot: snapshot\n        }));\n      })));\n    }\n  }]);\n\n  return Snapshots;\n}(React.Component);\n\nexports.Snapshots = Snapshots;\n\nfunction Actions(props) {\n  return React.createElement(\"div\", {\n    className: \"actions\"\n  }, props.actions.map(function (action, i) {\n    if (action.iconButtonProps) {\n      return React.createElement(_iconButton.IconButton, Object.assign({\n        key: i\n      }, action.iconButtonProps));\n    }\n\n    if (action.element) {\n      return action.element;\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../controls/dialog\":\"cFWm\",\"../canvas\":\"Dryx\",\"../controls/group\":\"Q3hf\",\"../controls/iconButton\":\"dQNc\",\"../language\":\"hk5u\"}],\"yzxM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.toggleSearch = toggleSearch;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction comparableGroup(group) {\n  return Object.assign(Object.assign({}, group), {\n    clause: null\n  });\n}\n\nfunction compareGroup(a, b) {\n  return _sanddanceReact.SandDance.searchExpression.compareGroup(comparableGroup(a), comparableGroup(b));\n}\n\nfunction toggleSearch(haystack, needle) {\n  var groups = [];\n  var found = false; //look for item in all\n\n  haystack.forEach(function (group) {\n    if (compareGroup(group, needle)) {\n      //if it exists, don't add it\n      found = true;\n    } else {\n      groups.push(group);\n    }\n  });\n  return {\n    groups: groups,\n    found: found\n  };\n}\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"hH4t\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CommandBarButtonStyles = void 0;\n\nvar _base = require(\"../base\");\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar CommandBarButtonStyles = function CommandBarButtonStyles(props) {\n  var theme = props.theme;\n\n  if (!theme) {\n    throw new Error('Theme is undefined or null.');\n  }\n\n  var palette = theme.palette,\n      semanticColors = theme.semanticColors;\n  var BUTTON_ICON_CLASSNAME = '.ms-Button-icon';\n  return {\n    root: [Object.assign({}, _base.base.fabric.getFocusStyle(theme, {\n      inset: 2\n    })), {\n      backgroundColor: palette.white\n    }],\n    rootHovered: {\n      backgroundColor: palette.neutralLighter,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: palette.themeDarkAlt\n      })\n    },\n    rootPressed: {\n      backgroundColor: palette.neutralLight,\n      color: palette.neutralDark,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: palette.themeDark\n      })\n    },\n    rootChecked: {\n      backgroundColor: palette.neutralLight,\n      color: palette.neutralDark,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: palette.themeDark\n      })\n    },\n    rootCheckedHovered: {\n      backgroundColor: palette.neutralQuaternaryAlt,\n      color: palette.neutralDark\n    },\n    rootExpanded: {\n      color: palette.neutralDark,\n      backgroundColor: palette.neutralLight,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: palette.themeDark\n      })\n    },\n    rootExpandedHovered: {\n      background: palette.neutralQuaternaryAlt\n    },\n    rootDisabled: {\n      backgroundColor: palette.white,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: semanticColors.disabledBodySubtext\n      })\n    },\n    splitButtonMenuButton: {\n      backgroundColor: palette.white,\n      color: palette.neutralSecondary,\n      selectors: {\n        ':hover': {\n          backgroundColor: palette.neutralLighter,\n          selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n            color: palette.neutralPrimary\n          })\n        },\n        ':active': {\n          backgroundColor: palette.neutralLight,\n          selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n            color: palette.neutralPrimary\n          })\n        }\n      }\n    },\n    splitButtonMenuButtonDisabled: {\n      backgroundColor: palette.white\n    },\n    icon: {\n      color: palette.themePrimary\n    }\n  };\n};\n\nexports.CommandBarButtonStyles = CommandBarButtonStyles;\n},{\"../base\":\"Vlbn\"}],\"GBuN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Logo = Logo;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar s = \"\\n ......\\n.......\\n...\\n......\\n ......\\n    ...\\n.......\\n......\\n\";\nvar d = s.split('\\n').map(function (row, irow) {\n  return row.length ? row.split('').map(function (char, icol) {\n    return char.trim() ? \"M\".concat(2 * icol + 1, \" \").concat(2 * (irow - 1) + 1, \" v1 h1 v-1 Z\") : '';\n  }).join(' ') : '';\n}).join('\\n');\n\nfunction Logo() {\n  return React.createElement(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 16 16\"\n  }, React.createElement(\"path\", {\n    d: d\n  }));\n}\n},{\"react\":\"ccIB\"}],\"Afi9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Topbar = Topbar;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _CommandBarButton = require(\"./CommandBarButton.styles\");\n\nvar _logo = require(\"./logo\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Topbar(props) {\n  var zeroResults = props.selectionState.selectedData && props.selectionState.selectedData.length === 0;\n  var disabled = !props.loaded;\n  var items = [{\n    key: 'deselect',\n    name: _language.strings.buttonDeselect,\n    iconProps: {\n      iconName: 'Cancel'\n    },\n    disabled: disabled || !props.selectionSearch,\n    onClick: props.doDeselect\n  }, {\n    key: 'isolate',\n    name: _language.strings.buttonIsolate,\n    iconProps: {\n      iconName: 'Filter'\n    },\n    disabled: disabled || !props.selectionSearch || zeroResults,\n    onClick: function onClick() {\n      return props.doFilter(props.selectionSearch);\n    }\n  }, {\n    key: 'exclude',\n    name: _language.strings.buttonExclude,\n    iconProps: {\n      iconName: 'ClearFilter'\n    },\n    disabled: disabled || !props.selectionSearch || zeroResults,\n    onClick: function onClick() {\n      return props.doFilter(_sanddanceReact.SandDance.searchExpression.invert(props.selectionSearch));\n    }\n  }, {\n    key: 'reset',\n    name: _language.strings.buttonReset,\n    iconProps: {\n      iconName: 'RemoveFilter'\n    },\n    disabled: disabled || !props.filter,\n    onClick: props.doUnfilter\n  }];\n\n  if (props.buttons) {\n    items.push.apply(items, props.buttons);\n  }\n\n  var farItems = [{\n    key: 'view',\n    iconProps: {\n      iconName: props.view === '2d' ? 'Product' : 'Page'\n    },\n    title: props.view === '2d' ? _language.strings.labelViewType3d : _language.strings.lavelViewType2d,\n    onClick: props.onViewClick\n  }, {\n    key: 'home',\n    iconProps: {\n      iconName: 'PicturePosition'\n    },\n    title: _language.strings.buttonCameraHome,\n    onClick: props.onHomeClick\n  }];\n  return React.createElement(\"div\", {\n    className: \"sanddance-explorer-topbar\"\n  }, React.createElement(\"div\", {\n    className: \"logo\"\n  }, React.createElement(_logo.Logo, null), React.createElement(\"a\", {\n    href: props.logoClickUrl || '/',\n    target: props.logoClickTarget || '_blank'\n  }, _language.strings.appName)), React.createElement(\"div\", {\n    className: \"sanddance-explorer-commandbar\"\n  }, React.createElement(_base.base.fabric.Customizer, {\n    scopedSettings: {\n      CommandBarButton: {\n        styles: function styles(buttonProps) {\n          buttonProps.theme.palette = props.themePalette;\n          return (0, _CommandBarButton.CommandBarButtonStyles)(buttonProps);\n        }\n      }\n    }\n  }, React.createElement(_base.base.fabric.CommandBar, {\n    items: items,\n    farItems: farItems,\n    styles: {\n      root: {\n        backgroundColor: 'transparent',\n        height: 'unset',\n        paddingLeft: 0,\n        paddingRight: 0\n      }\n    }\n  }))));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./CommandBarButton.styles\":\"hH4t\",\"./logo\":\"GBuN\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"KeW6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Explorer = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _colorMap = require(\"./colorMap\");\n\nvar _base = require(\"./base\");\n\nvar _colorScheme = require(\"./colorScheme\");\n\nvar _chart = require(\"./dialogs/chart\");\n\nvar _color = require(\"./dialogs/color\");\n\nvar _partialInsight = require(\"./partialInsight\");\n\nvar _dataBrowser = require(\"./dialogs/dataBrowser\");\n\nvar _dataScope = require(\"./controls/dataScope\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _dialog = require(\"./controls/dialog\");\n\nvar _columns = require(\"./columns\");\n\nvar _mouseEvent = require(\"./mouseEvent\");\n\nvar _search = require(\"./dialogs/search\");\n\nvar _dataLoader = require(\"./dataLoader\");\n\nvar _clickableTextLayer = require(\"./clickableTextLayer\");\n\nvar _chartRecommender = require(\"@msrvida/chart-recommender\");\n\nvar _canvas = require(\"./canvas\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _settings = require(\"./dialogs/settings\");\n\nvar _sidebar = require(\"./controls/sidebar\");\n\nvar _snapshots = require(\"./dialogs/snapshots\");\n\nvar _language = require(\"./language\");\n\nvar _themes = require(\"./themes\");\n\nvar _toggleSearch = require(\"./toggleSearch\");\n\nvar _topbar = require(\"./controls/topbar\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar dataBrowserTitles = {};\ndataBrowserTitles[_dataScope.DataScopeId.AllData] = _language.strings.selectDataSpanAll;\ndataBrowserTitles[_dataScope.DataScopeId.FilteredData] = _language.strings.selectDataSpanFilter;\ndataBrowserTitles[_dataScope.DataScopeId.SelectedData] = _language.strings.selectDataSpanSelection;\nvar dataBrowserZeroMessages = {};\ndataBrowserZeroMessages[_dataScope.DataScopeId.AllData] = _language.strings.labelZeroAll;\ndataBrowserZeroMessages[_dataScope.DataScopeId.FilteredData] = null; //empty array is not used\n\ndataBrowserZeroMessages[_dataScope.DataScopeId.SelectedData] = _language.strings.labelZeroSearchResults;\nvar dataBrowserNullMessages = {};\ndataBrowserNullMessages[_dataScope.DataScopeId.AllData] = _language.strings.labelDataNullAll;\ndataBrowserNullMessages[_dataScope.DataScopeId.FilteredData] = _language.strings.labelDataNullFiltered;\ndataBrowserNullMessages[_dataScope.DataScopeId.SelectedData] = _language.strings.labelDataNullSelection;\n\nfunction createInputSearch(search) {\n  var groups = _sanddanceReact.SandDance.util.ensureSearchExpressionGroupArray(search);\n\n  var dialogSearch = groups.map(function (group, groupIndex) {\n    return Object.assign(Object.assign({\n      key: groupIndex\n    }, group), {\n      expressions: group.expressions.map(function (ex, i) {\n        var ex2 = Object.assign({\n          key: i\n        }, ex);\n        return ex2;\n      })\n    });\n  });\n  return dialogSearch;\n}\n\nvar Explorer =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Explorer, _React$Component);\n\n  function Explorer(props) {\n    var _this;\n\n    _classCallCheck(this, Explorer);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Explorer).call(this, props));\n    _this.state = {\n      calculating: null,\n      errors: null,\n      autoCompleteDistinctValues: {},\n      colorBin: null,\n      dataContent: null,\n      dataFile: null,\n      search: null,\n      facets: null,\n      filter: null,\n      filteredData: null,\n      specCapabilities: null,\n      size: {\n        height: null,\n        width: null\n      },\n      scheme: null,\n      columns: null,\n      chart: 'grid',\n      signalValues: null,\n      hideAxes: false,\n      hideLegend: false,\n      sideTabId: _sidebar.SideTabId.ChartType,\n      dataScopeId: _dataScope.DataScopeId.AllData,\n      selectedItemIndex: {},\n      sidebarClosed: false,\n      sidebarPinned: true,\n      view: props.initialView || '2d',\n      snapshots: [],\n      tooltipExclusions: [],\n      positionedColumnMapProps: null\n    };\n    _this.state.selectedItemIndex[_dataScope.DataScopeId.AllData] = 0;\n    _this.state.selectedItemIndex[_dataScope.DataScopeId.FilteredData] = 0;\n    _this.state.selectedItemIndex[_dataScope.DataScopeId.SelectedData] = 0;\n    _this.discardColorContextUpdates = true;\n\n    _this.updateViewerOptions(Object.assign(Object.assign({}, _sanddanceReact.SandDance.VegaDeckGl.util.clone(_sanddanceReact.SandDance.Viewer.defaultViewerOptions)), props.viewerOptions));\n\n    return _this;\n  }\n\n  _createClass(Explorer, [{\n    key: \"finalize\",\n    value: function finalize() {\n      if (this.viewer) this.viewer.finalize();\n    }\n  }, {\n    key: \"updateViewerOptions\",\n    value: function updateViewerOptions(viewerOptions) {\n      var _this2 = this;\n\n      this.viewerOptions = Object.assign(Object.assign({}, _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge(_defaults.defaultViewerOptions, this.viewerOptions, viewerOptions)), {\n        tooltipOptions: {\n          exclude: function exclude(columnName) {\n            return _this2.state.tooltipExclusions.indexOf(columnName) >= 0;\n          }\n        },\n        onColorContextChange: function onColorContextChange() {\n          return _this2.manageColorToolbar();\n        },\n        onDataFilter: function onDataFilter(dataFilter, filteredData) {\n          var selectedItemIndex = Object.assign({}, _this2.state.selectedItemIndex);\n          selectedItemIndex[_dataScope.DataScopeId.FilteredData] = 0;\n\n          _this2.changeInsight({\n            filter: dataFilter,\n            filteredData: filteredData,\n            selectedItemIndex: selectedItemIndex\n          });\n\n          if (_this2.state.sideTabId === _sidebar.SideTabId.Data && _this2.state.dataScopeId === _dataScope.DataScopeId.FilteredData) {\n            //make sure item is active\n            requestAnimationFrame(function () {\n              return _this2.silentActivation(filteredData[0]);\n            });\n          }\n\n          viewerOptions && viewerOptions.onDataFilter && viewerOptions.onDataFilter(dataFilter, filteredData);\n        },\n        onSelectionChanged: function onSelectionChanged(newSearch, index, selectedData) {\n          if (_this2.ignoreSelectionChange) return;\n          var selectedItemIndex = Object.assign({}, _this2.state.selectedItemIndex);\n          selectedItemIndex[_dataScope.DataScopeId.SelectedData] = index || 0;\n          var _this2$state = _this2.state,\n              search = _this2$state.search,\n              sideTabId = _this2$state.sideTabId;\n\n          if (newSearch) {\n            search = createInputSearch(newSearch); //} else {\n            //sideTabId = SideTabId.ChartType;\n          }\n\n          _this2.setState({\n            search: search,\n            selectedItemIndex: selectedItemIndex,\n            sideTabId: sideTabId\n          });\n\n          viewerOptions && viewerOptions.onSelectionChanged && viewerOptions.onSelectionChanged(newSearch, index, selectedData);\n        },\n        onAxisClick: function onAxisClick(e, search) {\n          _this2.toggleableSearch(e, search);\n\n          viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onAxisClick(e, search);\n        },\n        onLegendHeaderClick: function onLegendHeaderClick(e) {\n          var pos = (0, _mouseEvent.getPosition)(e);\n\n          var specRole = _this2.state.specCapabilities && _this2.state.specCapabilities.roles.filter(function (r) {\n            return r.role === 'color';\n          })[0];\n\n          var positionedColumnMapProps = Object.assign(Object.assign({}, _this2.getColumnMapBaseProps()), {\n            container: _this2.div,\n            selectedColumnName: _this2.state.columns['color'],\n            onDismiss: function onDismiss() {\n              _this2.setState({\n                positionedColumnMapProps: null\n              });\n            },\n            specRole: specRole,\n            left: pos.left - _this2.div.clientLeft,\n            top: pos.top - _this2.div.clientTop\n          });\n\n          _this2.setState({\n            positionedColumnMapProps: positionedColumnMapProps\n          });\n        },\n        onLegendRowClick: function onLegendRowClick(e, legendRow) {\n          _this2.toggleableSearch(e, legendRow.search);\n\n          viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onLegendRowClick(e, legendRow);\n        },\n        onError: function onError(errors) {\n          _this2.setState({\n            errors: errors\n          });\n\n          viewerOptions && viewerOptions.onError && viewerOptions.onError(errors);\n        },\n        onBeforeCreateLayers: _clickableTextLayer.onBeforeCreateLayers,\n        getTextColor: function getTextColor(o) {\n          var t = o;\n\n          if (t.specRole) {\n            return _this2.viewerOptions.colors.clickableText;\n          } else {\n            return o.color;\n          }\n        },\n        getTextHighlightColor: function getTextHighlightColor(o) {\n          var t = o;\n\n          if (t.specRole) {\n            return _this2.viewerOptions.colors.clickableTextHighlight;\n          } else {\n            return o.color;\n          }\n        },\n        onTextClick: function onTextClick(e, text) {\n          if (e && text) {\n            var pos = (0, _mouseEvent.getPosition)(e);\n            var specRole = text.specRole;\n\n            if (pos && specRole) {\n              var positionedColumnMapProps = Object.assign(Object.assign({}, _this2.getColumnMapBaseProps()), {\n                container: _this2.div,\n                selectedColumnName: _this2.state.columns[specRole.role],\n                onDismiss: function onDismiss() {\n                  _this2.setState({\n                    positionedColumnMapProps: null\n                  });\n                },\n                specRole: specRole,\n                left: pos.left - _this2.div.clientLeft,\n                top: pos.top - _this2.div.clientTop\n              });\n\n              _this2.setState({\n                positionedColumnMapProps: positionedColumnMapProps\n              });\n            } else {\n              _this2.setState({\n                positionedColumnMapProps: null\n              });\n            }\n          }\n        }\n      });\n\n      if (this.viewer && this.viewer.presenter) {\n        var newPresenterStyle = _sanddanceReact.SandDance.util.getPresenterStyle(this.viewerOptions);\n\n        var mergePrenterStyle = Object.assign(Object.assign({}, this.viewer.presenter.style), newPresenterStyle);\n        this.viewer.presenter.style = mergePrenterStyle;\n        this.viewer.options = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge(this.viewer.options, this.props.viewerOptions, this.viewerOptions);\n      }\n    }\n  }, {\n    key: \"signal\",\n    value: function signal(signalName, signalValue) {\n      switch (signalName) {\n        case _sanddanceReact.SandDance.constants.SignalNames.ColorBinCount:\n        case _sanddanceReact.SandDance.constants.SignalNames.ColorReverse:\n        case _sanddanceReact.SandDance.constants.SignalNames.MarkOpacity:\n          this.discardColorContextUpdates = false;\n          break;\n      }\n\n      this.viewer.vegaViewGl.signal(signalName, signalValue);\n      this.viewer.vegaViewGl.run();\n      this.discardColorContextUpdates = true;\n      this.props.onSignalChanged && this.props.onSignalChanged();\n    }\n  }, {\n    key: \"manageColorToolbar\",\n    value: function manageColorToolbar() {\n      var _this3 = this;\n\n      var canRemap = this.viewer.colorContexts && this.viewer.colorContexts.length > 1;\n      (0, _colorMap.applyColorButtons)(this.viewer.presenter, !!this.state.columns.color, {\n        themePalette: _themes.themePalettes[this.props.theme || ''],\n        canRemap: canRemap,\n        isRemap: canRemap && this.viewer.currentColorContext > 0,\n        colorMapHandler: function colorMapHandler(remap) {\n          _this3.viewer.currentColorContext = ~~remap;\n\n          _this3.viewer.renderSameLayout();\n\n          _this3.manageColorToolbar();\n        }\n      });\n    }\n  }, {\n    key: \"setInsight\",\n    value: function setInsight(partialInsight) {\n      var selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n      selectedItemIndex[_dataScope.DataScopeId.AllData] = 0;\n      selectedItemIndex[_dataScope.DataScopeId.FilteredData] = 0;\n      selectedItemIndex[_dataScope.DataScopeId.SelectedData] = 0;\n      var newState = Object.assign({\n        chart: null,\n        scheme: null,\n        columns: null,\n        filter: null,\n        filteredData: null,\n        selectedItemIndex: selectedItemIndex\n      }, partialInsight);\n      this.getColorContext = null;\n      this.changeInsight(newState);\n    }\n  }, {\n    key: \"load\",\n    value: function load(data, getPartialInsight, optionsOrPrefs) {\n      var _this4 = this;\n\n      this.changeInsight({\n        columns: null\n      });\n      return new Promise(function (resolve, reject) {\n        var loadFinal = function loadFinal(dataContent) {\n          var partialInsight;\n          _this4.prefs = optionsOrPrefs && optionsOrPrefs.chartPrefs || optionsOrPrefs || {};\n\n          if (getPartialInsight) {\n            partialInsight = getPartialInsight(dataContent.columns);\n            (0, _partialInsight.initPrefs)(_this4.prefs, partialInsight);\n          }\n\n          if (!partialInsight) {\n            //load recommendation\n            var r = new _chartRecommender.RecommenderSummary(dataContent.columns, dataContent.data);\n            partialInsight = r.recommend();\n          }\n\n          var selectedItemIndex = Object.assign({}, _this4.state.selectedItemIndex);\n          var sideTabId = _sidebar.SideTabId.ChartType;\n          selectedItemIndex[_dataScope.DataScopeId.AllData] = 0;\n          selectedItemIndex[_dataScope.DataScopeId.FilteredData] = 0;\n          selectedItemIndex[_dataScope.DataScopeId.SelectedData] = 0;\n          var newState = Object.assign({\n            dataFile: dataFile,\n            dataContent: dataContent,\n            autoCompleteDistinctValues: {},\n            filter: null,\n            filteredData: null,\n            tooltipExclusions: optionsOrPrefs && optionsOrPrefs.tooltipExclusions || [],\n            selectedItemIndex: selectedItemIndex,\n            sideTabId: sideTabId\n          }, partialInsight);\n          _this4.getColorContext = null;\n          (0, _columns.ensureColumnsExist)(newState.columns, dataContent.columns);\n          var errors = (0, _columns.ensureColumnsPopulated)(partialInsight ? partialInsight.chart : null, newState.columns, dataContent.columns);\n          newState.errors = errors; //change insight\n\n          _this4.changeInsight(newState); //make sure item is active\n\n\n          _this4.activateDataBrowserItem(sideTabId, _this4.state.dataScopeId);\n\n          resolve();\n        };\n\n        var dataFile;\n\n        if (Array.isArray(data)) {\n          return (0, _dataLoader.loadDataArray)(data).then(function (result) {\n            dataFile = {\n              type: 'json'\n            };\n            loadFinal(result);\n          }).catch(reject);\n        } else {\n          dataFile = data;\n          return (0, _dataLoader.loadDataFile)(dataFile).then(loadFinal).catch(reject);\n        }\n      });\n    }\n  }, {\n    key: \"changeChartType\",\n    value: function changeChartType(chart) {\n      var _this5 = this;\n\n      var partialInsight = (0, _partialInsight.copyPrefToNewState)(this.prefs, chart, '*', '*');\n      var newState = Object.assign({\n        chart: chart\n      }, partialInsight);\n      var columns = this.state.columns || {};\n      newState.columns = Object.assign({}, columns); //special case mappings when switching chart type\n\n      if (this.state.chart === 'scatterplot' && (chart === 'barchart' || chart === 'barchartV')) {\n        newState.columns = Object.assign(Object.assign({}, columns), {\n          sort: columns.y\n        });\n      } else if (this.state.chart === 'scatterplot' && chart === 'barchartH') {\n        newState.columns = Object.assign(Object.assign({}, columns), {\n          sort: columns.x\n        });\n      } else if (chart === 'treemap') {\n        newState.view = '2d';\n\n        if (!columns.size) {\n          //make sure size exists and is numeric\n          var sizeColumnName = (0, _chartRecommender.preferredColumnForTreemapSize)(this.state.dataContent.columns, true);\n\n          if (!sizeColumnName) {\n            sizeColumnName = (0, _chartRecommender.preferredColumnForTreemapSize)(this.state.dataContent.columns, false);\n          }\n\n          if (!sizeColumnName) {//TODO error - no numeric columns\n          } else {\n            newState.columns = Object.assign(Object.assign({}, columns), {\n              size: sizeColumnName\n            });\n          }\n        }\n      } else if (chart === 'stacks') {\n        newState.view = '3d';\n      }\n\n      (0, _columns.ensureColumnsExist)(newState.columns, this.state.dataContent.columns);\n      var errors = (0, _columns.ensureColumnsPopulated)(chart, newState.columns, this.state.dataContent.columns);\n\n      if (errors) {\n        newState.errors = errors;\n      }\n\n      this.calculate(function () {\n        return _this5.changeInsight(newState);\n      });\n    }\n  }, {\n    key: \"calculate\",\n    value: function calculate(calculating) {\n      this.setState({\n        calculating: calculating\n      });\n    }\n  }, {\n    key: \"changeView\",\n    value: function changeView(view) {\n      this.changeInsight({\n        view: view\n      });\n    } //state members which change the insight\n\n  }, {\n    key: \"changeInsight\",\n    value: function changeInsight(newState) {\n      if (!newState.signalValues) {\n        newState.signalValues = null;\n      }\n\n      if (newState.chart === 'barchart') {\n        newState.chart = 'barchartV';\n      }\n\n      this.setState(newState);\n    }\n  }, {\n    key: \"changespecCapabilities\",\n    value: function changespecCapabilities(specCapabilities) {\n      this.setState({\n        specCapabilities: specCapabilities\n      });\n    }\n  }, {\n    key: \"changeColumnMapping\",\n    value: function changeColumnMapping(role, column, options) {\n      var _this6 = this;\n\n      var columns = Object.assign({}, this.state.columns);\n\n      var final = function final() {\n        columns[role] = column && column.name;\n\n        _this6.changeInsight({\n          columns: columns\n        });\n      };\n\n      if (column) {\n        switch (role) {\n          case 'facet':\n            {\n              (function () {\n                var facetColumn = column;\n                var facets;\n\n                if (facetColumn.quantitative) {\n                  facets = {\n                    columns: 3,\n                    rows: 3\n                  };\n                } else {\n                  switch (facetColumn.stats.distinctValueCount) {\n                    case 2:\n                      {\n                        facets = {\n                          columns: 2,\n                          rows: 1\n                        };\n                        break;\n                      }\n\n                    default:\n                      {\n                        facets = {\n                          columns: null,\n                          rows: null\n                        };\n                        var square = 1;\n\n                        while (square * square < facetColumn.stats.distinctValueCount) {\n                          square++;\n                        }\n\n                        facets.columns = facets.rows = square;\n                      }\n                  }\n                }\n\n                columns['facet'] = column.name;\n\n                _this6.changeInsight({\n                  facets: facets,\n                  columns: columns\n                });\n              })();\n\n              break;\n            }\n\n          case 'color':\n            {\n              (function () {\n                var newState = {\n                  scheme: options && options.scheme,\n                  columns: columns,\n                  colorBin: _this6.state.colorBin\n                };\n\n                if (!newState.scheme) {\n                  var partialInsight = (0, _partialInsight.copyPrefToNewState)(_this6.prefs, _this6.state.chart, 'color', column.name);\n                  newState = Object.assign(Object.assign({}, newState), partialInsight);\n                }\n\n                if (!newState.scheme) {\n                  newState.scheme = (0, _colorScheme.bestColorScheme)(column, null, _this6.state.scheme);\n                }\n\n                if (!column.stats.hasColorData) {\n                  newState.directColor = false;\n\n                  if (_this6.state.directColor !== newState.directColor) {\n                    newState.calculating = function () {\n                      return _this6._resize();\n                    };\n                  }\n                }\n\n                if (_this6.state.columns && _this6.state.columns.color && _this6.state.columns.color !== column.name) {\n                  var currColorColumn = _this6.state.dataContent.columns.filter(function (c) {\n                    return c.name === _this6.state.columns.color;\n                  })[0];\n\n                  if (column.isColorData != currColorColumn.isColorData) {\n                    newState.calculating = function () {\n                      return _this6._resize();\n                    };\n                  }\n                }\n\n                _this6.ignoreSelectionChange = true;\n\n                _this6.viewer.deselect().then(function () {\n                  _this6.ignoreSelectionChange = false; //allow deselection to render\n\n                  requestAnimationFrame(function () {\n                    columns['color'] = column.name;\n                    _this6.getColorContext = null;\n\n                    _this6.changeInsight(newState);\n                  });\n                });\n              })();\n\n              break;\n            }\n\n          case 'x':\n            {\n              (function () {\n                var partialInsight = (0, _partialInsight.copyPrefToNewState)(_this6.prefs, _this6.state.chart, 'x', column.name);\n                var newState = Object.assign({\n                  columns: columns\n                }, partialInsight);\n                columns['x'] = column.name;\n\n                _this6.changeInsight(newState);\n              })();\n\n              break;\n            }\n\n          default:\n            {\n              final();\n              break;\n            }\n        }\n      } else {\n        final();\n      }\n    }\n  }, {\n    key: \"setSideTabId\",\n    value: function setSideTabId(sideTabId, dataScopeId) {\n      if (sideTabId === _sidebar.SideTabId.Data && dataScopeId == null) {\n        //choose most relevant DataScopeId\n        dataScopeId = this.getBestDataScopeId();\n      }\n\n      if (dataScopeId == null) {\n        dataScopeId = this.state.dataScopeId;\n      }\n\n      this.setState({\n        sideTabId: sideTabId,\n        dataScopeId: dataScopeId,\n        sidebarClosed: false\n      });\n      this.activateDataBrowserItem(sideTabId, dataScopeId);\n    }\n  }, {\n    key: \"getBestDataScopeId\",\n    value: function getBestDataScopeId() {\n      var dataScopeId;\n      var selectionState = this.viewer && this.viewer.getSelection();\n\n      if (selectionState && selectionState.selectedData && selectionState.selectedData.length) {\n        dataScopeId = _dataScope.DataScopeId.SelectedData;\n      } else if (this.state.filteredData) {\n        dataScopeId = _dataScope.DataScopeId.FilteredData;\n      } else {\n        dataScopeId = _dataScope.DataScopeId.AllData;\n      }\n\n      return dataScopeId;\n    }\n  }, {\n    key: \"activateDataBrowserItem\",\n    value: function activateDataBrowserItem(sideTabId, dataScopeId) {\n      if (!this.viewer) return;\n      var itemToActivate;\n\n      if (sideTabId === _sidebar.SideTabId.Data) {\n        switch (dataScopeId) {\n          case _dataScope.DataScopeId.AllData:\n            {\n              itemToActivate = this.state.dataContent && this.state.dataContent.data[this.state.selectedItemIndex[_dataScope.DataScopeId.AllData]];\n              break;\n            }\n\n          case _dataScope.DataScopeId.FilteredData:\n            {\n              itemToActivate = this.state.filteredData && this.state.filteredData[this.state.selectedItemIndex[_dataScope.DataScopeId.FilteredData]];\n              break;\n            }\n\n          case _dataScope.DataScopeId.SelectedData:\n            {\n              var selection = this.viewer.getSelection() || {};\n              itemToActivate = selection.selectedData && selection.selectedData[this.state.selectedItemIndex[_dataScope.DataScopeId.SelectedData]];\n              break;\n            }\n        }\n      }\n\n      this.silentActivation(itemToActivate);\n    }\n  }, {\n    key: \"silentActivation\",\n    value: function silentActivation(itemToActivate) {\n      var _this7 = this;\n\n      this.ignoreSelectionChange = true;\n\n      var done = function done() {\n        _this7.ignoreSelectionChange = false;\n      };\n\n      if (itemToActivate) {\n        return this.viewer.activate(itemToActivate).then(done);\n      } else {\n        return this.viewer.deActivate().then(done);\n      }\n    }\n  }, {\n    key: \"sidebar\",\n    value: function sidebar(sidebarClosed, sidebarPinned) {\n      this.setState({\n        sidebarClosed: sidebarClosed,\n        sidebarPinned: sidebarPinned\n      });\n    }\n  }, {\n    key: \"resize\",\n    value: function resize() {\n      var _this8 = this;\n\n      this.setState({\n        calculating: function calculating() {\n          return _this8._resize();\n        }\n      });\n    }\n  }, {\n    key: \"_resize\",\n    value: function _resize() {\n      this.changeInsight({\n        size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed)\n      });\n    }\n  }, {\n    key: \"viewerMounted\",\n    value: function viewerMounted(glDiv) {\n      this.setState({\n        size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed),\n        signalValues: this.state.signalValues //keep initialized signalValues\n\n      });\n    }\n  }, {\n    key: \"getLayoutDivSize\",\n    value: function getLayoutDivSize(pinned, closed) {\n      var div = pinned && !closed ? this.layoutDivPinned : this.layoutDivUnpinned;\n      return {\n        height: div.offsetHeight,\n        width: div.offsetWidth\n      };\n    }\n  }, {\n    key: \"toggleableSearch\",\n    value: function toggleableSearch(e, search) {\n      if (e.ctrlKey) {\n        this.setState({\n          search: createInputSearch(search)\n        });\n        this.setSideTabId(_sidebar.SideTabId.Search);\n      } else {\n        var oldSelection = this.viewer.getSelection();\n\n        if (oldSelection.search) {\n          //look for matching groups and toggle them\n          var result = (0, _toggleSearch.toggleSearch)(_sanddanceReact.SandDance.util.ensureSearchExpressionGroupArray(oldSelection.search), search);\n\n          if (result.found) {\n            //removing a group\n            if (result.groups.length === 0) {\n              this.doDeselect();\n            } else {\n              //select with new search removed\n              this.doSelect(result.groups);\n            }\n          } else {\n            //adding a new group\n            if (e.altKey || e.shiftKey) {\n              if (e.shiftKey) {\n                search.clause = '||';\n              } else if (e.altKey) {\n                search.clause = '&&';\n              }\n\n              result.groups.push(search);\n              this.doSelect(result.groups);\n            } else {\n              //replace\n              this.doSelect(search);\n            }\n          }\n        } else {\n          this.doSelect(search);\n        }\n      }\n    }\n  }, {\n    key: \"doFilter\",\n    value: function doFilter(search) {\n      this.viewer.filter(search);\n    }\n  }, {\n    key: \"doUnfilter\",\n    value: function doUnfilter() {\n      this.viewer.reset();\n    }\n  }, {\n    key: \"doSelect\",\n    value: function doSelect(search) {\n      this.viewer.select(search);\n    }\n  }, {\n    key: \"doDeselect\",\n    value: function doDeselect() {\n      return this.viewer.deselect();\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      if (this.props.mounted) {\n        this.props.mounted(this);\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this9 = this;\n\n      var _this$state = this.state,\n          colorBin = _this$state.colorBin,\n          columns = _this$state.columns,\n          directColor = _this$state.directColor,\n          facets = _this$state.facets,\n          filter = _this$state.filter,\n          hideAxes = _this$state.hideAxes,\n          hideLegend = _this$state.hideLegend,\n          scheme = _this$state.scheme,\n          signalValues = _this$state.signalValues,\n          size = _this$state.size,\n          chart = _this$state.chart,\n          view = _this$state.view;\n      var insight = {\n        colorBin: colorBin,\n        columns: columns,\n        directColor: directColor,\n        facets: facets,\n        filter: filter,\n        hideAxes: hideAxes,\n        hideLegend: hideLegend,\n        scheme: scheme,\n        signalValues: signalValues,\n        size: size,\n        chart: chart,\n        view: view\n      };\n      var loaded = !!(this.state.columns && this.state.dataContent);\n      var selectionState = this.viewer && this.viewer.getSelection() || {};\n      var selectionSearch = selectionState && selectionState.search;\n      var columnMapProps = this.getColumnMapBaseProps();\n      var datas = {};\n      datas[_dataScope.DataScopeId.AllData] = this.state.dataContent && this.state.dataContent.data;\n      datas[_dataScope.DataScopeId.FilteredData] = this.state.filteredData;\n      datas[_dataScope.DataScopeId.SelectedData] = selectionState && selectionState.selectedData;\n\n      if (this.state.calculating) {\n        requestAnimationFrame(function () {\n          //allow render to complete\n          if (_this9.state.calculating) {\n            _this9.state.calculating();\n\n            _this9.setState({\n              calculating: null\n            });\n          }\n        });\n      }\n\n      var theme = this.props.theme || '';\n      var themePalette = _themes.themePalettes[theme];\n      return React.createElement(\"div\", {\n        ref: function ref(div) {\n          if (div) _this9.div = div;\n        },\n        className: _sanddanceReact.util.classList('sanddance-explorer', this.props.theme)\n      }, React.createElement(_topbar.Topbar, {\n        logoClickUrl: this.props.logoClickUrl,\n        logoClickTarget: this.props.logoClickTarget,\n        themePalette: themePalette,\n        loaded: loaded,\n        doDeselect: this.doDeselect.bind(this),\n        doFilter: this.doFilter.bind(this),\n        doUnfilter: this.doUnfilter.bind(this),\n        filter: this.state.filter,\n        selectionSearch: selectionSearch,\n        selectionState: selectionState,\n        buttons: this.props.topBarButtonProps,\n        view: this.state.view,\n        onViewClick: function onViewClick() {\n          var view = _this9.state.view === '2d' ? '3d' : '2d';\n\n          _this9.changeInsight({\n            view: view\n          });\n        },\n        onHomeClick: function onHomeClick() {\n          return _this9.viewer.presenter.homeCamera();\n        }\n      }), React.createElement(\"div\", {\n        className: _sanddanceReact.util.classList('sanddance-main', this.state.sidebarPinned && 'pinned', this.state.sidebarClosed && 'closed', (insight.hideLegend || insight.directColor || !(insight.columns && insight.columns.color && !this.state.dataContent.columns.filter(function (c) {\n          return c.name === insight.columns.color;\n        })[0].isColorData)) && 'hide-legend')\n      }, React.createElement(\"div\", {\n        ref: function ref(div) {\n          if (div && !_this9.layoutDivUnpinned) _this9.layoutDivUnpinned = div;\n        },\n        className: \"sanddance-layout-unpinned\"\n      }), React.createElement(\"div\", {\n        ref: function ref(div) {\n          if (div && !_this9.layoutDivPinned) _this9.layoutDivPinned = div;\n        },\n        className: \"sanddance-layout-pinned\"\n      }), !loaded && React.createElement(\"div\", {\n        className: \"loading\"\n      }, React.createElement(_base.base.fabric.Spinner, {\n        size: _base.base.fabric.SpinnerSize.large,\n        label: _language.strings.loading\n      })), React.createElement(_sidebar.Sidebar, {\n        themePalette: themePalette,\n        calculating: !!this.state.calculating,\n        closed: this.state.sidebarClosed,\n        hideSidebarControls: this.props.hideSidebarControls,\n        pinned: this.state.sidebarPinned,\n        disabled: !loaded,\n        dataScopeProps: {\n          themePalette: themePalette,\n          compact: this.state.sidebarClosed,\n          onCompactClick: function onCompactClick() {\n            _this9.changeInsight({\n              sidebarClosed: false,\n              size: _this9.getLayoutDivSize(_this9.state.sidebarPinned, false)\n            });\n          },\n          dataSet: this.props.datasetElement,\n          dataCount: loaded && {\n            all: this.state.dataContent && this.state.dataContent.data.length,\n            filtered: this.state.filteredData && this.state.filteredData.length,\n            selected: selectionState && selectionState.selectedData && selectionState.selectedData.length\n          },\n          active: this.state.sideTabId === _sidebar.SideTabId.Data,\n          onDataScopeClick: function onDataScopeClick(dataScopeId) {\n            return _this9.setSideTabId(_sidebar.SideTabId.Data, dataScopeId);\n          },\n          selectedDataScope: this.state.dataScopeId,\n          disabled: !loaded\n        },\n        onSideTabClick: function onSideTabClick(sideTabId) {\n          //collapse or toggle\n          if (sideTabId === _sidebar.SideTabId.Collapse || _this9.state.sideTabId === sideTabId) {\n            var _this9$state = _this9.state,\n                dataScopeId = _this9$state.dataScopeId,\n                sidebarClosed = _this9$state.sidebarClosed;\n\n            if (sidebarClosed && sideTabId === _sidebar.SideTabId.Data) {\n              dataScopeId = _this9.getBestDataScopeId();\n            }\n\n            sidebarClosed = !_this9.state.sidebarClosed;\n\n            _this9.changeInsight({\n              dataScopeId: dataScopeId,\n              sidebarClosed: sidebarClosed,\n              size: _this9.getLayoutDivSize(_this9.state.sidebarPinned, sidebarClosed)\n            });\n          } else if (sideTabId === _sidebar.SideTabId.Pin) {\n            _this9.changeInsight({\n              sidebarPinned: !_this9.state.sidebarPinned,\n              size: _this9.getLayoutDivSize(!_this9.state.sidebarPinned, _this9.state.sidebarClosed)\n            });\n          } else {\n            _this9.setSideTabId(sideTabId);\n          }\n        },\n        selectedSideTab: this.state.sideTabId\n      }, loaded && function () {\n        switch (_this9.state.sideTabId) {\n          case _sidebar.SideTabId.ChartType:\n            {\n              return React.createElement(_chart.Chart, Object.assign({\n                tooltipExclusions: _this9.state.tooltipExclusions,\n                toggleTooltipExclusion: function toggleTooltipExclusion(columnName) {\n                  var tooltipExclusions = _toConsumableArray(_this9.state.tooltipExclusions);\n\n                  var i = tooltipExclusions.indexOf(columnName);\n\n                  if (i < 0) {\n                    tooltipExclusions.push(columnName);\n                  } else {\n                    tooltipExclusions.splice(i, 1);\n                  }\n\n                  _this9.setState({\n                    tooltipExclusions: tooltipExclusions\n                  });\n\n                  _this9.props.onTooltipExclusionsChanged && _this9.props.onTooltipExclusionsChanged(tooltipExclusions);\n                },\n                disabled: !loaded || _this9.state.sidebarClosed\n              }, columnMapProps, {\n                chart: _this9.state.chart,\n                view: _this9.state.view,\n                onChangeChartType: function onChangeChartType(chart) {\n                  return _this9.changeChartType(chart);\n                },\n                insightColumns: _this9.state.columns,\n                onChangeSignal: function onChangeSignal(role, column, name, value) {\n                  (0, _partialInsight.saveSignalValuePref)(_this9.prefs, _this9.state.chart, role, column, name, value);\n                }\n              }));\n            }\n\n          case _sidebar.SideTabId.Color:\n            {\n              return React.createElement(_color.Color, Object.assign({\n                specCapabilities: _this9.state.specCapabilities,\n                disabled: !loaded || _this9.state.sidebarClosed\n              }, columnMapProps, {\n                dataContent: _this9.state.dataContent,\n                scheme: _this9.state.scheme,\n                colorBin: _this9.state.colorBin,\n                colorBinSignal: _this9.viewer && _this9.viewer.vegaSpec && _this9.viewer.vegaSpec.signals.filter(function (s) {\n                  return s.name === _sanddanceReact.SandDance.constants.SignalNames.ColorBinCount;\n                })[0],\n                colorReverseSignal: _this9.viewer && _this9.viewer.vegaSpec && _this9.viewer.vegaSpec.signals.filter(function (s) {\n                  return s.name === _sanddanceReact.SandDance.constants.SignalNames.ColorReverse;\n                })[0],\n                colorColumn: _this9.state.columns.color,\n                onColorBinChange: function onColorBinChange(colorBin) {\n                  _this9.ignoreSelectionChange = true;\n\n                  _this9.viewer.deselect().then(function () {\n                    _this9.ignoreSelectionChange = false; //allow deselection to render\n\n                    requestAnimationFrame(function () {\n                      _this9.getColorContext = null;\n\n                      _this9.changeInsight({\n                        colorBin: colorBin\n                      });\n\n                      (0, _partialInsight.savePref)(_this9.prefs, _this9.state.chart, 'color', _this9.state.columns.color, {\n                        colorBin: colorBin\n                      });\n                    });\n                  });\n                },\n                onColorSchemeChange: function onColorSchemeChange(scheme) {\n                  _this9.changeColumnMapping('color', _this9.state.dataContent.columns.filter(function (c) {\n                    return c.name === _this9.state.columns.color;\n                  })[0], {\n                    scheme: scheme\n                  });\n\n                  (0, _partialInsight.savePref)(_this9.prefs, _this9.state.chart, 'color', _this9.state.columns.color, {\n                    scheme: scheme\n                  });\n                },\n                onColorBinCountChange: function onColorBinCountChange(value) {\n                  var signalValues = {};\n                  signalValues[_sanddanceReact.SandDance.constants.SignalNames.ColorBinCount] = value;\n                  (0, _partialInsight.savePref)(_this9.prefs, _this9.state.chart, 'color', _this9.state.columns.color, {\n                    signalValues: signalValues\n                  });\n                },\n                onColorReverseChange: function onColorReverseChange(value) {\n                  _this9.getColorContext = null;\n                  var signalValues = {};\n                  signalValues[_sanddanceReact.SandDance.constants.SignalNames.ColorReverse] = value;\n                },\n                directColor: _this9.state.directColor,\n                onDirectColorChange: function onDirectColorChange(directColor) {\n                  _this9.changeInsight({\n                    directColor: directColor,\n                    calculating: function calculating() {\n                      return _this9._resize();\n                    }\n                  });\n                }\n              }));\n            }\n\n          case _sidebar.SideTabId.Data:\n            {\n              var data = datas[_this9.state.dataScopeId];\n              var itemVisible = true;\n\n              switch (_this9.state.dataScopeId) {\n                case _dataScope.DataScopeId.AllData:\n                  {\n                    var item = _this9.state.selectedItemIndex[_this9.state.dataScopeId];\n                    itemVisible = _this9.state.dataContent && !_this9.state.filteredData || _this9.state.filteredData.indexOf(data[item]) >= 0;\n                  }\n              }\n\n              return React.createElement(_dataBrowser.DataBrowser, {\n                themePalette: themePalette,\n                disabled: !loaded || _this9.state.sidebarClosed,\n                columns: _this9.state.dataContent && _this9.state.dataContent.columns,\n                data: data,\n                displayName: _this9.state.dataFile && _this9.state.dataFile.displayName || _language.strings.defaultFileName,\n                title: dataBrowserTitles[_this9.state.dataScopeId],\n                nullMessage: dataBrowserNullMessages[_this9.state.dataScopeId],\n                zeroMessage: dataBrowserZeroMessages[_this9.state.dataScopeId],\n                index: _this9.state.selectedItemIndex[_this9.state.dataScopeId],\n                itemVisible: itemVisible,\n                dataExportHandler: _this9.props.dataExportHandler,\n                selectedDataScope: _this9.state.dataScopeId,\n                onDataScopeClick: function onDataScopeClick(dataScopeId) {\n                  return _this9.setSideTabId(_sidebar.SideTabId.Data, dataScopeId);\n                },\n                onActivate: function onActivate(row, index) {\n                  var selectedItemIndex = Object.assign({}, _this9.state.selectedItemIndex);\n                  selectedItemIndex[_this9.state.dataScopeId] = index;\n\n                  _this9.setState({\n                    selectedItemIndex: selectedItemIndex\n                  });\n\n                  _this9.silentActivation(row);\n                },\n                onSearch: function onSearch(e, search) {\n                  if (e.ctrlKey) {\n                    _this9.setState({\n                      sideTabId: _sidebar.SideTabId.Search,\n                      search: search\n                    });\n                  } else {\n                    _this9.doSelect(search);\n                  }\n                },\n                bingSearchDisabled: _this9.props.bingSearchDisabled\n              });\n            }\n\n          case _sidebar.SideTabId.Search:\n            {\n              return React.createElement(_search.Search, {\n                themePalette: themePalette,\n                disabled: !loaded || _this9.state.sidebarClosed,\n                initializer: {\n                  columns: columnMapProps.allColumns,\n                  search: _this9.state.search\n                },\n                autoCompleteDistinctValues: _this9.state.autoCompleteDistinctValues,\n                onSelect: function onSelect(expr) {\n                  _this9.doSelect(expr);\n                },\n                data: _this9.state.dataContent.data\n              });\n            }\n\n          case _sidebar.SideTabId.Snapshots:\n            {\n              return React.createElement(_snapshots.Snapshots, Object.assign({}, _this9.props.snapshotProps, {\n                themePalette: themePalette,\n                explorer: _this9,\n                snapshots: _this9.state.snapshots,\n                onCreateSnapshot: function onCreateSnapshot(snapshot) {\n                  _this9.setState({\n                    snapshots: _this9.state.snapshots.concat(snapshot)\n                  });\n                },\n                onRemoveSnapshot: function onRemoveSnapshot(i) {\n                  var snapshots = _toConsumableArray(_this9.state.snapshots);\n\n                  snapshots.splice(i, 1);\n\n                  _this9.setState({\n                    snapshots: snapshots\n                  });\n                },\n                onSnapshotClick: function onSnapshotClick(snapshot) {\n                  _this9.calculate(function () {\n                    if (_this9.props.onSnapshotClick) {\n                      _this9.props.onSnapshotClick(snapshot);\n                    } else {\n                      _this9.setInsight(snapshot.insight);\n                    }\n                  });\n                }\n              }));\n            }\n\n          case _sidebar.SideTabId.Settings:\n            {\n              return React.createElement(_settings.Settings, {\n                explorer: _this9,\n                dataFile: _this9.state.dataFile,\n                scheme: _this9.state.scheme,\n                hideLegend: _this9.state.hideLegend,\n                onToggleLegend: function onToggleLegend(hideLegend) {\n                  return _this9.setState({\n                    hideLegend: hideLegend,\n                    calculating: function calculating() {\n                      return _this9._resize();\n                    }\n                  });\n                },\n                hideAxes: _this9.state.hideAxes,\n                onToggleAxes: function onToggleAxes(hideAxes) {\n                  return _this9.setState({\n                    calculating: function calculating() {\n                      return _this9.setState({\n                        hideAxes: hideAxes\n                      });\n                    }\n                  });\n                }\n              }, _this9.props.systemInfoChildren);\n            }\n        }\n      }()), loaded && React.createElement(\"div\", {\n        className: \"sanddance-view\"\n      }, React.createElement(_sanddanceReact.SandDanceReact, {\n        renderOptions: {\n          initialColorContext: this.getColorContext && this.getColorContext(this.viewer.insight, insight),\n          discardColorContextUpdates: function discardColorContextUpdates() {\n            return _this9.discardColorContextUpdates;\n          }\n        },\n        viewerOptions: this.viewerOptions,\n        ref: function ref(reactViewer) {\n          if (reactViewer) {\n            _this9.viewer = reactViewer.viewer;\n          }\n        },\n        onView: function onView(renderResult) {\n          _this9.changespecCapabilities(renderResult.specResult.errors ? renderResult.specResult.specCapabilities : _this9.viewer.specCapabilities);\n\n          _this9.getColorContext = function (oldInsight, newInsight) {\n            if (!oldInsight && !newInsight) {\n              return null;\n            }\n\n            if (!oldInsight || !newInsight) {\n              return null;\n            }\n\n            if (oldInsight.scheme !== newInsight.scheme) {\n              return null;\n            }\n\n            if (oldInsight.columns.color !== newInsight.columns.color) {\n              return null;\n            }\n\n            if (oldInsight.directColor != newInsight.directColor) {\n              return null;\n            }\n\n            return _this9.viewer.colorContexts && _this9.viewer.colorContexts[_this9.viewer.currentColorContext];\n          }; //don't allow tabbing to the canvas\n\n\n          (0, _canvas.removeTabIndex)(_this9.viewer);\n          _this9.props.onView && _this9.props.onView();\n        },\n        data: this.state.dataContent.data,\n        insight: insight,\n        onMount: function onMount(el) {\n          return _this9.viewerMounted(el);\n        }\n      })), React.createElement(_dialog.Dialog, {\n        title: _language.strings.labelError,\n        hidden: !this.state.errors,\n        onDismiss: function onDismiss() {\n          _this9.setState({\n            errors: null\n          });\n        }\n      }, this.state.errors && this.state.errors.map(function (error, i) {\n        return React.createElement(\"div\", {\n          key: i\n        }, error);\n      }))), this.state.positionedColumnMapProps && React.createElement(_clickableTextLayer.PositionedColumnMap, Object.assign({}, this.state.positionedColumnMapProps)));\n    }\n  }, {\n    key: \"getColumnMapBaseProps\",\n    value: function getColumnMapBaseProps() {\n      var _this10 = this;\n\n      var allColumns = this.state.dataContent && this.state.dataContent.columns.filter(function (c) {\n        return !_sanddanceReact.SandDance.util.isInternalFieldName(c.name, true);\n      });\n      var quantitativeColumns = allColumns && allColumns.filter(function (c) {\n        return c.quantitative;\n      });\n      var categoricalColumns = allColumns && allColumns.filter(function (c) {\n        return !c.quantitative;\n      });\n      var props = {\n        changeColumnMapping: function changeColumnMapping(role, columnOrRole) {\n          var column;\n\n          if (typeof columnOrRole === 'string') {\n            //look up current insight\n            var columnName = _this10.state.columns[columnOrRole];\n            column = allColumns.filter(function (c) {\n              return c.name === columnName;\n            })[0];\n          } else {\n            column = columnOrRole;\n          }\n\n          _this10.changeColumnMapping(role, column);\n        },\n        allColumns: allColumns,\n        quantitativeColumns: quantitativeColumns,\n        categoricalColumns: categoricalColumns,\n        specCapabilities: this.state.specCapabilities,\n        explorer: this\n      };\n      return props;\n    }\n  }]);\n\n  return Explorer;\n}(React.Component);\n\nexports.Explorer = Explorer;\n},{\"react\":\"ccIB\",\"./colorMap\":\"E67y\",\"./base\":\"Vlbn\",\"./colorScheme\":\"L8O2\",\"./dialogs/chart\":\"NGSt\",\"./dialogs/color\":\"N8IJ\",\"./partialInsight\":\"tb7d\",\"./dialogs/dataBrowser\":\"pJLc\",\"./controls/dataScope\":\"OsNT\",\"./defaults\":\"Tl9z\",\"./controls/dialog\":\"cFWm\",\"./columns\":\"f8v0\",\"./mouseEvent\":\"yvMl\",\"./dialogs/search\":\"ozxe\",\"./dataLoader\":\"f19h\",\"./clickableTextLayer\":\"UUG7\",\"@msrvida/chart-recommender\":\"i6UQ\",\"./canvas\":\"Dryx\",\"@msrvida/sanddance-react\":\"MjKu\",\"./dialogs/settings\":\"zKGJ\",\"./controls/sidebar\":\"f8Jx\",\"./dialogs/snapshots\":\"oc9r\",\"./language\":\"hk5u\",\"./themes\":\"CgE3\",\"./toggleSearch\":\"yzxM\",\"./controls/topbar\":\"Afi9\"}],\"Focm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar _exportNames = {\n  use: true,\n  capabilities: true,\n  getColorSettingsFromThemePalette: true,\n  themePalettes: true,\n  SandDance: true,\n  util: true,\n  version: true\n};\nObject.defineProperty(exports, \"use\", {\n  enumerable: true,\n  get: function () {\n    return _base.use;\n  }\n});\nObject.defineProperty(exports, \"capabilities\", {\n  enumerable: true,\n  get: function () {\n    return _canvas.capabilities;\n  }\n});\nObject.defineProperty(exports, \"getColorSettingsFromThemePalette\", {\n  enumerable: true,\n  get: function () {\n    return _themes.getColorSettingsFromThemePalette;\n  }\n});\nObject.defineProperty(exports, \"themePalettes\", {\n  enumerable: true,\n  get: function () {\n    return _themes.themePalettes;\n  }\n});\nObject.defineProperty(exports, \"SandDance\", {\n  enumerable: true,\n  get: function () {\n    return _sanddanceReact.SandDance;\n  }\n});\nObject.defineProperty(exports, \"util\", {\n  enumerable: true,\n  get: function () {\n    return _sanddanceReact.util;\n  }\n});\nObject.defineProperty(exports, \"version\", {\n  enumerable: true,\n  get: function () {\n    return _version.version;\n  }\n});\n\nvar _base = require(\"./base\");\n\nvar _canvas = require(\"./canvas\");\n\nvar _themes = require(\"./themes\");\n\nvar _explorer = require(\"./explorer\");\n\nObject.keys(_explorer).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _explorer[key];\n    }\n  });\n});\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _version = require(\"./version\");\n},{\"./base\":\"Vlbn\",\"./canvas\":\"Dryx\",\"./themes\":\"CgE3\",\"./explorer\":\"KeW6\",\"@msrvida/sanddance-react\":\"MjKu\",\"./version\":\"RvaL\"}]},{},[\"Focm\"], \"SandDanceExplorer\")"
  },
  {
    "path": "docs/dist/sanddance-explorer/v2/sanddance-explorer.css",
    "content": ".sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%; }\n\n.sanddance-gl {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0; }\n\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%); }\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em; }\n\n.sanddance-legend table {\n  border-collapse: collapse; }\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em; }\n\n.sanddance-legend .legend-row {\n  cursor: pointer; }\n\n.sanddance-legend .legend-row td {\n  padding: 2px; }\n\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef; }\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px; }\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden; }\n\n.sanddance-details {\n  font-size: smaller; }\n\n.sanddance-details-scroll {\n  padding-bottom: 1em; }\n\n.sanddance-tooltip {\n  z-index: 1; }\n\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute; }\n\n.sanddance-tooltip td {\n  text-align: left;\n  vertical-align: top;\n  width: 75%; }\n\n.sanddance-tooltip td:first-child {\n  width: 25%; }\n\n.sanddance-scheme.disabled {\n  filter: grayscale(95%); }\n\n.sanddance-scheme.option {\n  display: grid;\n  grid-template-columns: 10em auto;\n  width: 100%; }\n\n.sanddance-scheme.title {\n  justify-content: flex-start; }\n\n.sanddance-scheme span {\n  align-self: center; }\n\n.sanddance-scheme svg, .sanddance-scheme .swatch {\n  align-self: center;\n  border: thin solid #777;\n  height: 24px; }\n\n.sanddance-scheme svg {\n  width: 100%; }\n\n.sanddance-scheme .swatch div {\n  display: inline-block;\n  width: 10px;\n  height: 24px; }\n\n.sanddance-explorer-topbar {\n  background-color: #fff;\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: 300px auto;\n  height: 36px; }\n  .sanddance-explorer-topbar .logo {\n    color: #0078d4;\n    display: grid;\n    grid-template-columns: 50px auto;\n    padding: 6px 0; }\n    .sanddance-explorer-topbar .logo svg {\n      fill: #0078d4;\n      height: 24px;\n      margin: 0 auto;\n      width: 24px; }\n    .sanddance-explorer-topbar .logo a {\n      color: inherit;\n      font-size: 14px;\n      font-weight: bold;\n      line-height: 24px;\n      text-decoration: none; }\n\n.sanddance-explorer-commandbar {\n  position: relative; }\n  .sanddance-explorer-commandbar > div {\n    left: 0;\n    position: absolute;\n    right: 0; }\n  .sanddance-explorer-commandbar .ms-CommandBar {\n    height: 36px; }\n\n.dark-theme .sanddance-explorer-topbar {\n  background-color: #000; }\n  .dark-theme .sanddance-explorer-topbar .logo {\n    color: #00b4f0; }\n\n.sanddance-group {\n  border-top: 1px solid #ccc;\n  padding-bottom: 1.5em;\n  position: relative; }\n  .sanddance-group .group-head {\n    display: grid;\n    grid-template-columns: auto auto;\n    line-height: 16px;\n    margin: 1em 0; }\n    .sanddance-group .group-head label {\n      font-size: 11px;\n      font-weight: 600;\n      letter-spacing: 3px;\n      opacity: 0.8;\n      text-transform: uppercase; }\n    .sanddance-group .group-head .count {\n      color: #333;\n      font-size: 12px;\n      text-align: right; }\n  .sanddance-group .group-icon {\n    position: absolute;\n    top: -1px;\n    right: 0; }\n  .sanddance-group:first-child {\n    border-top: none; }\n    .sanddance-group:first-child .group-head {\n      margin-top: 0; }\n  .sanddance-group:last-child {\n    padding-bottom: 0; }\n\n.sanddance-sidebar {\n  background-color: #f9f9f9;\n  display: grid;\n  overflow: hidden;\n  position: relative;\n  transition: width 350ms cubic-bezier(0.4, 0, 0.2, 1);\n  width: 300px; }\n  .sanddance-sidebar:not(.pinned) {\n    bottom: 0;\n    position: absolute;\n    top: 0; }\n  .sanddance-sidebar .sidebar-content {\n    background-color: inherit;\n    display: grid;\n    grid-template-areas: \"stats stats\"\r \"tabs bar\";\n    grid-template-columns: 50px auto;\n    grid-template-rows: 0fr auto;\n    height: 100%;\n    overflow: hidden;\n    position: absolute;\n    z-index: 1; }\n  .sanddance-sidebar .vbuttons {\n    background-color: rgba(0, 0, 0, 0.1);\n    display: grid;\n    grid-area: tabs;\n    grid-template-rows: auto 0fr;\n    position: relative; }\n  .sanddance-sidebar .vbutton {\n    align-self: center;\n    display: grid;\n    height: 60px; }\n    .sanddance-sidebar .vbutton.selected {\n      background-color: #f9f9f9; }\n    .sanddance-sidebar .vbutton button {\n      height: 100%;\n      width: 100%; }\n      .sanddance-sidebar .vbutton button .ms-Button-icon {\n        font-size: 24px; }\n  .sanddance-sidebar .sidebar-dialogs .vbutton {\n    height: 16%;\n    max-height: 60px;\n    min-height: 32px; }\n  .sanddance-sidebar .scrollable-container {\n    width: 250px; }\n  .sanddance-sidebar .sidetab {\n    grid-area: bar;\n    padding: 12px; }\n  .sanddance-sidebar.closed {\n    width: 50px; }\n  .sanddance-sidebar.calculator .calculating {\n    background: rgba(249, 249, 249, 0.5);\n    height: 100%;\n    position: absolute;\n    top: 0;\n    width: 100%; }\n  .sanddance-sidebar.calculator .ms-Spinner {\n    margin-top: -16px;\n    position: relative;\n    top: 50%; }\n\n.dark-theme .sanddance-sidebar {\n  background-color: #272727;\n  color: #fff; }\n  .dark-theme .sanddance-sidebar .vbuttons {\n    background-color: rgba(0, 0, 0, 0.4); }\n  .dark-theme .sanddance-sidebar .vbutton.selected {\n    background-color: #272727; }\n  .dark-theme .sanddance-sidebar.calculator .calculating {\n    background: rgba(39, 39, 39, 0.5); }\n\n.sanddance-chart-type .ms-ChoiceFieldGroup-flexContainer {\n  display: grid;\n  grid-template-columns: repeat(2, 50%);\n  grid-auto-flow: column;\n  grid-template-rows: repeat(4, auto); }\n\n.sanddance-datascope {\n  grid-area: stats;\n  background-color: rgba(0, 0, 0, 0.05);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n  min-height: 5em; }\n  .sanddance-datascope.extended > div {\n    margin: 12px;\n    width: 276px; }\n  .sanddance-datascope label {\n    display: block;\n    font-size: 10px;\n    text-transform: uppercase; }\n  .sanddance-datascope.compact {\n    align-self: center;\n    cursor: pointer;\n    display: grid;\n    text-align: center;\n    width: 50px; }\n    .sanddance-datascope.compact > div {\n      align-self: center; }\n  .sanddance-datascope .datascope-button {\n    background-color: #fff;\n    border: 1px solid rgba(0, 0, 0, 0.2);\n    box-sizing: border-box;\n    height: 36px;\n    min-width: unset;\n    width: 33.333%; }\n    .sanddance-datascope .datascope-button:hover {\n      background-color: #0078d4;\n      color: #fff; }\n    .sanddance-datascope .datascope-button label {\n      cursor: inherit; }\n  .sanddance-datascope.active .datascope-button.selected {\n    border-color: #0078d4; }\n\n.dark-theme .sanddance-datascope {\n  background-color: rgba(0, 0, 0, 0.3);\n  border-bottom-color: rgba(255, 255, 255, 0.1); }\n  .dark-theme .sanddance-datascope .datascope-button {\n    background-color: #000;\n    border-color: rgba(255, 255, 255, 0.2);\n    color: #fff; }\n    .dark-theme .sanddance-datascope .datascope-button:hover {\n      background-color: #0078d4;\n      color: #fff; }\n\n.sanddance-dataItem {\n  background-color: #fff;\n  border: 1px solid #ddd; }\n  .sanddance-dataItem .name-value {\n    border-top: 1px solid #ddd;\n    cursor: pointer;\n    padding: 4px;\n    position: relative;\n    word-break: break-all; }\n    .sanddance-dataItem .name-value:hover {\n      background-color: #0078d4;\n      color: #fff; }\n    .sanddance-dataItem .name-value:first-child {\n      border-top: none; }\n  .sanddance-dataItem .column-name {\n    font-weight: 500; }\n  .sanddance-dataItem .bing-search {\n    text-align: right; }\n\n.dark-theme .sanddance-dataItem {\n  background-color: #000;\n  border-color: #222; }\n  .dark-theme .sanddance-dataItem .name-value {\n    border-top-color: #222; }\n  .dark-theme .sanddance-dataItem a {\n    color: #00b4f0; }\n\n.sanddance-dataIndex .index {\n  display: grid;\n  grid-template-columns: 32px auto 32px;\n  line-height: 32px;\n  margin: 0px -8px 6px -8px;\n  text-align: center; }\n\n.sanddance-dataIndex .item-filtered {\n  background-color: rgba(0, 0, 0, 0.1);\n  font-size: 10px;\n  padding: 2px 4px;\n  text-transform: uppercase; }\n\n.sanddance-dataIndex .ms-Dropdown-container {\n  margin-bottom: 0.5em; }\n\n.scrollable-container {\n  display: grid;\n  min-height: 200px;\n  position: relative; }\n\n.scrollable {\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  right: 0;\n  overflow-y: auto;\n  top: 0; }\n\n.sanddance-search .sanddance-search-group {\n  border: 1px solid rgba(0, 0, 0, 0.2); }\n\n.sanddance-search .sanddance-search-group {\n  background: #fff;\n  margin-top: 1em;\n  padding: 4px; }\n  .sanddance-search .sanddance-search-group:first-child {\n    margin-top: 0; }\n\n.sanddance-search .sanddance-search-expression {\n  background-color: rgba(0, 0, 0, 0.1);\n  margin: 12px 4px;\n  padding: 4px 8px 8px 8px; }\n\n.sanddance-search .search-action {\n  width: 100%; }\n\n.sanddance-search .search-bottom-action {\n  margin-top: 1em; }\n\n.sanddance-search .search-field {\n  margin-top: 4px; }\n\n.dark-theme .sanddance-search .sanddance-search-group {\n  border-color: rgba(255, 255, 255, 0.2);\n  background: #000; }\n\n.dark-theme .sanddance-search .sanddance-search-expression {\n  background-color: rgba(255, 255, 255, 0.2); }\n\n.sanddance-snapshots .ms-Button {\n  margin-bottom: 0.5em; }\n\n.sanddance-snapshots .snapshot {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  cursor: pointer;\n  margin-bottom: 0.5em;\n  padding: 5px; }\n  .sanddance-snapshots .snapshot.selected {\n    border-color: rgba(0, 0, 0, 0.6);\n    border-width: 2px;\n    padding: 4px; }\n  .sanddance-snapshots .snapshot:hover {\n    background-color: rgba(0, 0, 0, 0.1); }\n  .sanddance-snapshots .snapshot:first-child {\n    margin-top: 0.5em; }\n\n.sanddance-snapshots .title {\n  font-weight: 500;\n  word-break: break-word; }\n\n.sanddance-snapshots .description {\n  font-weight: 100;\n  word-break: break-word; }\n\n.sanddance-snapshots .thumbnail {\n  display: grid;\n  height: 160px;\n  margin-top: 0.5em; }\n\n.sanddance-snapshots img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%; }\n\n.sanddance-snapshots .actions {\n  display: grid;\n  grid-auto-flow: column; }\n  .sanddance-snapshots .actions a, .sanddance-snapshots .actions span {\n    align-self: center;\n    text-align: center; }\n  .sanddance-snapshots .actions button {\n    width: 100%; }\n\n.sanddance-snapshot-dialog .thumbnail {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  display: grid;\n  height: 300px;\n  margin-top: 1em; }\n\n.sanddance-snapshot-dialog img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%; }\n\n.dark-theme .sanddance-snapshots .snapshot {\n  background-color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(255, 255, 255, 0.2); }\n  .dark-theme .sanddance-snapshots .snapshot.selected {\n    border-color: rgba(255, 255, 255, 0.6); }\n  .dark-theme .sanddance-snapshots .snapshot:hover {\n    background-color: black; }\n\n.dark-theme .sanddance-snapshots .actions a {\n  color: #fff; }\n\n.dark-theme.sanddance-snapshot-dialog .thumbnail {\n  border-color: rgba(255, 255, 255, 0.2); }\n\n.sanddance-note {\n  background-color: #fffacd;\n  border: 1px solid #333;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  color: #333;\n  margin: 1em;\n  padding: 20px;\n  position: absolute;\n  width: 15em;\n  word-break: break-word; }\n  .sanddance-note .cancel {\n    position: absolute;\n    right: -1px;\n    top: -1px; }\n\n.sanddance-columnMap {\n  position: relative; }\n  .sanddance-columnMap .ms-Dropdown-container {\n    margin-top: 10px; }\n  .sanddance-columnMap .column-options {\n    bottom: 3px;\n    position: absolute;\n    right: 0; }\n\n.sanddance-columnMap-absolute {\n  margin-bottom: 1em;\n  margin-left: -4em;\n  margin-right: 1em;\n  margin-top: -1em; }\n  .sanddance-columnMap-absolute .ms-Dropdown-container {\n    margin-top: 0; }\n\n.sanddance-tooltip {\n  z-index: 2; }\n\n.sanddance-tooltipMap {\n  margin-top: 10px; }\n\n.sanddance-dialog ul {\n  margin: 0; }\n\n.sanddance-dialog section {\n  margin-top: 1em; }\n  .sanddance-dialog section:first-child {\n    margin-top: 0; }\n\n.sanddance-dialog .tip {\n  font-style: italic; }\n\n.sanddance-explorer {\n  display: grid;\n  font-family: 'Segoe UI', sans-serif;\n  font-size: 13px;\n  grid-template-rows: 0fr auto; }\n  .sanddance-explorer.dark-theme {\n    background-color: black; }\n    .sanddance-explorer.dark-theme canvas {\n      background-color: black; }\n\n.sanddance-main {\n  display: grid;\n  position: relative;\n  transition: grid-template-columns 350ms cubic-bezier(0.4, 0, 0.2, 1); }\n  .sanddance-main .loading {\n    grid-row-end: span 2;\n    position: relative; }\n    .sanddance-main .loading .ms-Spinner {\n      position: absolute;\n      top: 50%;\n      width: 100%; }\n  .sanddance-main .sanddance-view {\n    display: grid;\n    position: relative;\n    margin-left: 50px; }\n  .sanddance-main .sanddance-layout-unpinned, .sanddance-main .sanddance-layout-pinned {\n    position: absolute;\n    top: 0;\n    left: 50px;\n    right: 150px;\n    bottom: 0; }\n  .sanddance-main.hide-legend .sanddance-layout-unpinned, .sanddance-main.hide-legend .sanddance-layout-pinned {\n    right: 0; }\n  .sanddance-main .sanddance-layout-pinned {\n    left: 300px; }\n  .sanddance-main .sanddance-ReactViewer {\n    position: absolute;\n    top: 0;\n    left: -100px;\n    bottom: 0;\n    right: 0; }\n  .sanddance-main.hide-legend .sanddance-ReactViewer {\n    left: 0; }\n  .sanddance-main.show-center .sanddance-layout-unpinned, .sanddance-main.show-center .sanddance-layout-pinned {\n    background: linear-gradient(to right, transparent 49%, rgba(255, 0, 255, 0.2), transparent 51%);\n    background-color: rgba(0, 255, 255, 0.1); }\n  .sanddance-main.pinned {\n    grid-template-columns: 300px auto;\n    grid-template-areas: \"side main\"; }\n    .sanddance-main.pinned .sanddance-view {\n      grid-area: main;\n      margin-left: 0; }\n    .sanddance-main.pinned .loading {\n      grid-area: main;\n      grid-row-end: unset; }\n    .sanddance-main.pinned .sanddance-slidePanel {\n      grid-area: side; }\n    .sanddance-main.pinned.closed {\n      grid-template-columns: 0 auto; }\n      .sanddance-main.pinned.closed .sanddance-view {\n        margin-left: 50px; }\n  .sanddance-main span.ms-layer {\n    display: none; }\n\n#sanddance-vega-spec {\n  border: 1px inset;\n  max-height: 20em;\n  overflow: scroll; }\n\n.sanddance-panel {\n  top: 5em;\n  bottom: unset;\n  overflow-y: unset;\n  padding-right: 1em;\n  padding-top: 32px; }\n  .sanddance-panel h4,\n  .sanddance-panel .sanddance-vegaControls,\n  .sanddance-panel .sanddance-unitControls {\n    display: none; }\n\n.sanddance-main.hide-legend .sanddance-panel {\n  display: none; }\n\n.sanddance-panel-tools {\n  position: absolute;\n  top: 0;\n  right: 0; }\n\n.sanddance-legend {\n  min-width: 54px; }\n\n.sanddance-explanation {\n  font-size: smaller;\n  font-style: italic;\n  margin-bottom: 1em; }\n  .sanddance-explanation .fieldname,\n  .sanddance-explanation .fieldtype {\n    font-style: italic; }\n\n.sanddance-signal {\n  margin-top: 1em; }\n\n.sanddance-legend th {\n  color: #005a9e;\n  cursor: pointer; }\n  .sanddance-legend th:hover {\n    color: #2b88d8; }\n\n.sanddance-legend .legend-row:hover {\n  background-color: #0078d4;\n  color: #fff; }\n\n.sanddance-dataExporter {\n  margin-top: 1em; }\n\n.sanddance-form-separate {\n  margin-top: 1em; }\n\n.dark-theme .sanddance-dialog a {\n  color: #00b4f0; }\n\n.dark-theme .sanddance-panel {\n  background-color: #000;\n  color: #fff; }\n\n.dark-theme .sanddance-legend th {\n  color: #3ac5f3; }\n  .dark-theme .sanddance-legend th:hover {\n    color: #009ed3; }\n"
  },
  {
    "path": "docs/dist/sanddance-explorer/v2/sanddance-explorer.js",
    "content": "// modules are defined as an array\n// [ module function, map of requires ]\n//\n// map of requires is short require name -> numeric require\n//\n// anything defined in a previous bundle is accessed via the\n// orig method which is the require for previous bundles\nparcelRequire = (function (modules, cache, entry, globalName) {\n  // Save the require from previous bundle to this closure if any\n  var previousRequire = typeof parcelRequire === 'function' && parcelRequire;\n  var nodeRequire = typeof require === 'function' && require;\n\n  function newRequire(name, jumped) {\n    if (!cache[name]) {\n      if (!modules[name]) {\n        // if we cannot find the module within our internal map or\n        // cache jump to the current global require ie. the last bundle\n        // that was added to the page.\n        var currentRequire = typeof parcelRequire === 'function' && parcelRequire;\n        if (!jumped && currentRequire) {\n          return currentRequire(name, true);\n        }\n\n        // If there are other bundles on this page the require from the\n        // previous one is saved to 'previousRequire'. Repeat this as\n        // many times as there are bundles until the module is found or\n        // we exhaust the require chain.\n        if (previousRequire) {\n          return previousRequire(name, true);\n        }\n\n        // Try the node require function if it exists.\n        if (nodeRequire && typeof name === 'string') {\n          return nodeRequire(name);\n        }\n\n        var err = new Error('Cannot find module \\'' + name + '\\'');\n        err.code = 'MODULE_NOT_FOUND';\n        throw err;\n      }\n\n      localRequire.resolve = resolve;\n      localRequire.cache = {};\n\n      var module = cache[name] = new newRequire.Module(name);\n\n      modules[name][0].call(module.exports, localRequire, module, module.exports, this);\n    }\n\n    return cache[name].exports;\n\n    function localRequire(x){\n      return newRequire(localRequire.resolve(x));\n    }\n\n    function resolve(x){\n      return modules[name][1][x] || x;\n    }\n  }\n\n  function Module(moduleName) {\n    this.id = moduleName;\n    this.bundle = newRequire;\n    this.exports = {};\n  }\n\n  newRequire.isParcelRequire = true;\n  newRequire.Module = Module;\n  newRequire.modules = modules;\n  newRequire.cache = cache;\n  newRequire.parent = previousRequire;\n  newRequire.register = function (id, exports) {\n    modules[id] = [function (require, module) {\n      module.exports = exports;\n    }, {}];\n  };\n\n  var error;\n  for (var i = 0; i < entry.length; i++) {\n    try {\n      newRequire(entry[i]);\n    } catch (e) {\n      // Save first error but execute all entries\n      if (!error) {\n        error = e;\n      }\n    }\n  }\n\n  if (entry.length) {\n    // Expose entry point to Node, AMD or browser globals\n    // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js\n    var mainExports = newRequire(entry[entry.length - 1]);\n\n    // CommonJS\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\n      module.exports = mainExports;\n\n    // RequireJS\n    } else if (typeof define === \"function\" && define.amd) {\n     define(function () {\n       return mainExports;\n     });\n\n    // <script>\n    } else if (globalName) {\n      this[globalName] = mainExports;\n    }\n  }\n\n  // Override the current require with this new one\n  parcelRequire = newRequire;\n\n  if (error) {\n    // throw error from earlier, _after updating parcelRequire_\n    throw error;\n  }\n\n  return newRequire;\n})({\"W2ED\":[function(require,module,exports) {\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n'use strict';\n/* eslint-disable no-unused-vars */\n\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n  if (val === null || val === undefined) {\n    throw new TypeError('Object.assign cannot be called with null or undefined');\n  }\n\n  return Object(val);\n}\n\nfunction shouldUseNative() {\n  try {\n    if (!Object.assign) {\n      return false;\n    } // Detect buggy property enumeration order in older V8 versions.\n    // https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\n\n    var test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\n    test1[5] = 'de';\n\n    if (Object.getOwnPropertyNames(test1)[0] === '5') {\n      return false;\n    } // https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\n\n    var test2 = {};\n\n    for (var i = 0; i < 10; i++) {\n      test2['_' + String.fromCharCode(i)] = i;\n    }\n\n    var order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n      return test2[n];\n    });\n\n    if (order2.join('') !== '0123456789') {\n      return false;\n    } // https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\n\n    var test3 = {};\n    'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n      test3[letter] = letter;\n    });\n\n    if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') {\n      return false;\n    }\n\n    return true;\n  } catch (err) {\n    // We don't expect any of the above to throw, but better to be safe.\n    return false;\n  }\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n  var from;\n  var to = toObject(target);\n  var symbols;\n\n  for (var s = 1; s < arguments.length; s++) {\n    from = Object(arguments[s]);\n\n    for (var key in from) {\n      if (hasOwnProperty.call(from, key)) {\n        to[key] = from[key];\n      }\n    }\n\n    if (getOwnPropertySymbols) {\n      symbols = getOwnPropertySymbols(from);\n\n      for (var i = 0; i < symbols.length; i++) {\n        if (propIsEnumerable.call(from, symbols[i])) {\n          to[symbols[i]] = from[symbols[i]];\n        }\n      }\n    }\n  }\n\n  return to;\n};\n},{}],\"Xy56\":[function(require,module,exports) {\n/** @license React v16.12.0\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';\n\nvar h = require(\"object-assign\"),\n    n = \"function\" === typeof Symbol && Symbol.for,\n    p = n ? Symbol.for(\"react.element\") : 60103,\n    q = n ? Symbol.for(\"react.portal\") : 60106,\n    r = n ? Symbol.for(\"react.fragment\") : 60107,\n    t = n ? Symbol.for(\"react.strict_mode\") : 60108,\n    u = n ? Symbol.for(\"react.profiler\") : 60114,\n    v = n ? Symbol.for(\"react.provider\") : 60109,\n    w = n ? Symbol.for(\"react.context\") : 60110,\n    x = n ? Symbol.for(\"react.forward_ref\") : 60112,\n    y = n ? Symbol.for(\"react.suspense\") : 60113;\n\nn && Symbol.for(\"react.suspense_list\");\nvar z = n ? Symbol.for(\"react.memo\") : 60115,\n    aa = n ? Symbol.for(\"react.lazy\") : 60116;\nn && Symbol.for(\"react.fundamental\");\nn && Symbol.for(\"react.responder\");\nn && Symbol.for(\"react.scope\");\nvar A = \"function\" === typeof Symbol && Symbol.iterator;\n\nfunction B(a) {\n  for (var b = \"https://reactjs.org/docs/error-decoder.html?invariant=\" + a, c = 1; c < arguments.length; c++) b += \"&args[]=\" + encodeURIComponent(arguments[c]);\n\n  return \"Minified React error #\" + a + \"; visit \" + b + \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";\n}\n\nvar C = {\n  isMounted: function () {\n    return !1;\n  },\n  enqueueForceUpdate: function () {},\n  enqueueReplaceState: function () {},\n  enqueueSetState: function () {}\n},\n    D = {};\n\nfunction E(a, b, c) {\n  this.props = a;\n  this.context = b;\n  this.refs = D;\n  this.updater = c || C;\n}\n\nE.prototype.isReactComponent = {};\n\nE.prototype.setState = function (a, b) {\n  if (\"object\" !== typeof a && \"function\" !== typeof a && null != a) throw Error(B(85));\n  this.updater.enqueueSetState(this, a, b, \"setState\");\n};\n\nE.prototype.forceUpdate = function (a) {\n  this.updater.enqueueForceUpdate(this, a, \"forceUpdate\");\n};\n\nfunction F() {}\n\nF.prototype = E.prototype;\n\nfunction G(a, b, c) {\n  this.props = a;\n  this.context = b;\n  this.refs = D;\n  this.updater = c || C;\n}\n\nvar H = G.prototype = new F();\nH.constructor = G;\nh(H, E.prototype);\nH.isPureReactComponent = !0;\nvar I = {\n  current: null\n},\n    J = {\n  current: null\n},\n    K = Object.prototype.hasOwnProperty,\n    L = {\n  key: !0,\n  ref: !0,\n  __self: !0,\n  __source: !0\n};\n\nfunction M(a, b, c) {\n  var e,\n      d = {},\n      g = null,\n      l = null;\n  if (null != b) for (e in void 0 !== b.ref && (l = b.ref), void 0 !== b.key && (g = \"\" + b.key), b) K.call(b, e) && !L.hasOwnProperty(e) && (d[e] = b[e]);\n  var f = arguments.length - 2;\n  if (1 === f) d.children = c;else if (1 < f) {\n    for (var k = Array(f), m = 0; m < f; m++) k[m] = arguments[m + 2];\n\n    d.children = k;\n  }\n  if (a && a.defaultProps) for (e in f = a.defaultProps, f) void 0 === d[e] && (d[e] = f[e]);\n  return {\n    $$typeof: p,\n    type: a,\n    key: g,\n    ref: l,\n    props: d,\n    _owner: J.current\n  };\n}\n\nfunction ba(a, b) {\n  return {\n    $$typeof: p,\n    type: a.type,\n    key: b,\n    ref: a.ref,\n    props: a.props,\n    _owner: a._owner\n  };\n}\n\nfunction N(a) {\n  return \"object\" === typeof a && null !== a && a.$$typeof === p;\n}\n\nfunction escape(a) {\n  var b = {\n    \"=\": \"=0\",\n    \":\": \"=2\"\n  };\n  return \"$\" + (\"\" + a).replace(/[=:]/g, function (a) {\n    return b[a];\n  });\n}\n\nvar O = /\\/+/g,\n    P = [];\n\nfunction Q(a, b, c, e) {\n  if (P.length) {\n    var d = P.pop();\n    d.result = a;\n    d.keyPrefix = b;\n    d.func = c;\n    d.context = e;\n    d.count = 0;\n    return d;\n  }\n\n  return {\n    result: a,\n    keyPrefix: b,\n    func: c,\n    context: e,\n    count: 0\n  };\n}\n\nfunction R(a) {\n  a.result = null;\n  a.keyPrefix = null;\n  a.func = null;\n  a.context = null;\n  a.count = 0;\n  10 > P.length && P.push(a);\n}\n\nfunction S(a, b, c, e) {\n  var d = typeof a;\n  if (\"undefined\" === d || \"boolean\" === d) a = null;\n  var g = !1;\n  if (null === a) g = !0;else switch (d) {\n    case \"string\":\n    case \"number\":\n      g = !0;\n      break;\n\n    case \"object\":\n      switch (a.$$typeof) {\n        case p:\n        case q:\n          g = !0;\n      }\n\n  }\n  if (g) return c(e, a, \"\" === b ? \".\" + T(a, 0) : b), 1;\n  g = 0;\n  b = \"\" === b ? \".\" : b + \":\";\n  if (Array.isArray(a)) for (var l = 0; l < a.length; l++) {\n    d = a[l];\n    var f = b + T(d, l);\n    g += S(d, f, c, e);\n  } else if (null === a || \"object\" !== typeof a ? f = null : (f = A && a[A] || a[\"@@iterator\"], f = \"function\" === typeof f ? f : null), \"function\" === typeof f) for (a = f.call(a), l = 0; !(d = a.next()).done;) d = d.value, f = b + T(d, l++), g += S(d, f, c, e);else if (\"object\" === d) throw c = \"\" + a, Error(B(31, \"[object Object]\" === c ? \"object with keys {\" + Object.keys(a).join(\", \") + \"}\" : c, \"\"));\n  return g;\n}\n\nfunction U(a, b, c) {\n  return null == a ? 0 : S(a, \"\", b, c);\n}\n\nfunction T(a, b) {\n  return \"object\" === typeof a && null !== a && null != a.key ? escape(a.key) : b.toString(36);\n}\n\nfunction ca(a, b) {\n  a.func.call(a.context, b, a.count++);\n}\n\nfunction da(a, b, c) {\n  var e = a.result,\n      d = a.keyPrefix;\n  a = a.func.call(a.context, b, a.count++);\n  Array.isArray(a) ? V(a, e, c, function (a) {\n    return a;\n  }) : null != a && (N(a) && (a = ba(a, d + (!a.key || b && b.key === a.key ? \"\" : (\"\" + a.key).replace(O, \"$&/\") + \"/\") + c)), e.push(a));\n}\n\nfunction V(a, b, c, e, d) {\n  var g = \"\";\n  null != c && (g = (\"\" + c).replace(O, \"$&/\") + \"/\");\n  b = Q(b, g, e, d);\n  U(a, da, b);\n  R(b);\n}\n\nfunction W() {\n  var a = I.current;\n  if (null === a) throw Error(B(321));\n  return a;\n}\n\nvar X = {\n  Children: {\n    map: function (a, b, c) {\n      if (null == a) return a;\n      var e = [];\n      V(a, e, null, b, c);\n      return e;\n    },\n    forEach: function (a, b, c) {\n      if (null == a) return a;\n      b = Q(null, null, b, c);\n      U(a, ca, b);\n      R(b);\n    },\n    count: function (a) {\n      return U(a, function () {\n        return null;\n      }, null);\n    },\n    toArray: function (a) {\n      var b = [];\n      V(a, b, null, function (a) {\n        return a;\n      });\n      return b;\n    },\n    only: function (a) {\n      if (!N(a)) throw Error(B(143));\n      return a;\n    }\n  },\n  createRef: function () {\n    return {\n      current: null\n    };\n  },\n  Component: E,\n  PureComponent: G,\n  createContext: function (a, b) {\n    void 0 === b && (b = null);\n    a = {\n      $$typeof: w,\n      _calculateChangedBits: b,\n      _currentValue: a,\n      _currentValue2: a,\n      _threadCount: 0,\n      Provider: null,\n      Consumer: null\n    };\n    a.Provider = {\n      $$typeof: v,\n      _context: a\n    };\n    return a.Consumer = a;\n  },\n  forwardRef: function (a) {\n    return {\n      $$typeof: x,\n      render: a\n    };\n  },\n  lazy: function (a) {\n    return {\n      $$typeof: aa,\n      _ctor: a,\n      _status: -1,\n      _result: null\n    };\n  },\n  memo: function (a, b) {\n    return {\n      $$typeof: z,\n      type: a,\n      compare: void 0 === b ? null : b\n    };\n  },\n  useCallback: function (a, b) {\n    return W().useCallback(a, b);\n  },\n  useContext: function (a, b) {\n    return W().useContext(a, b);\n  },\n  useEffect: function (a, b) {\n    return W().useEffect(a, b);\n  },\n  useImperativeHandle: function (a, b, c) {\n    return W().useImperativeHandle(a, b, c);\n  },\n  useDebugValue: function () {},\n  useLayoutEffect: function (a, b) {\n    return W().useLayoutEffect(a, b);\n  },\n  useMemo: function (a, b) {\n    return W().useMemo(a, b);\n  },\n  useReducer: function (a, b, c) {\n    return W().useReducer(a, b, c);\n  },\n  useRef: function (a) {\n    return W().useRef(a);\n  },\n  useState: function (a) {\n    return W().useState(a);\n  },\n  Fragment: r,\n  Profiler: u,\n  StrictMode: t,\n  Suspense: y,\n  createElement: M,\n  cloneElement: function (a, b, c) {\n    if (null === a || void 0 === a) throw Error(B(267, a));\n    var e = h({}, a.props),\n        d = a.key,\n        g = a.ref,\n        l = a._owner;\n\n    if (null != b) {\n      void 0 !== b.ref && (g = b.ref, l = J.current);\n      void 0 !== b.key && (d = \"\" + b.key);\n      if (a.type && a.type.defaultProps) var f = a.type.defaultProps;\n\n      for (k in b) K.call(b, k) && !L.hasOwnProperty(k) && (e[k] = void 0 === b[k] && void 0 !== f ? f[k] : b[k]);\n    }\n\n    var k = arguments.length - 2;\n    if (1 === k) e.children = c;else if (1 < k) {\n      f = Array(k);\n\n      for (var m = 0; m < k; m++) f[m] = arguments[m + 2];\n\n      e.children = f;\n    }\n    return {\n      $$typeof: p,\n      type: a.type,\n      key: d,\n      ref: g,\n      props: e,\n      _owner: l\n    };\n  },\n  createFactory: function (a) {\n    var b = M.bind(null, a);\n    b.type = a;\n    return b;\n  },\n  isValidElement: N,\n  version: \"16.12.0\",\n  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n    ReactCurrentDispatcher: I,\n    ReactCurrentBatchConfig: {\n      suspense: null\n    },\n    ReactCurrentOwner: J,\n    IsSomeRendererActing: {\n      current: !1\n    },\n    assign: h\n  }\n},\n    Y = {\n  default: X\n},\n    Z = Y && X || Y;\nmodule.exports = Z.default || Z;\n},{\"object-assign\":\"W2ED\"}],\"ccIB\":[function(require,module,exports) {\n'use strict';\n\nif (\"production\" === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n},{\"./cjs/react.production.min.js\":\"Xy56\"}],\"b0rV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ColorScaleNone = exports.Other = exports.BarChartSignalNames = exports.BarChartScaleNames = exports.SignalNames = exports.ScaleNames = exports.DataNames = exports.FieldNames = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst FieldNames = {\n  Active: '__SandDance__Active',\n  Collapsed: '__SandDance__Collapsed',\n  Selected: '__SandDance__Selected',\n  Top: '__SandDance__Top',\n  TopIndex: '__SandDance__TopIndex',\n  Index: '__SandDance__Index',\n  PowerBISelectionId: '__SandDance__PowerBISelectionId',\n  BarChartBin0: '__SandDance__BarChartBin0',\n  BarChartBin1: '__SandDance__BarChartBin1',\n  BarChartStack0: '__SandDance__BarChartStack0',\n  BarChartStack1: '__SandDance__BarChartStack1',\n  DensityCount: '__SandDance__DensityCount',\n  DensityRow: '__SandDance__DensityRow',\n  DensityXBin0: '__SandDance__DensityXBin0',\n  DensityXBin1: '__SandDance__DensityXBin1',\n  DensityYBin0: '__SandDance__DensityYBin0',\n  DensityYBin1: '__SandDance__DensityYBin1',\n  FacetBin0: '__SandDance__FacetBin0',\n  FacetBin1: '__SandDance__FacetBin1',\n  GridIndex: '__SandDance__GridIndex',\n  StacksLatBin0: '__SandDance__StacksLatBin0',\n  StacksLatBin1: '__SandDance__StacksLatBin1',\n  StacksLongBin0: '__SandDance__StacksLongBin0',\n  StacksLongBin1: '__SandDance__StacksLongBin1',\n  StacksStart: '__SandDance__StacksStart',\n  StacksEnd: '__SandDance__StacksEnd',\n  TreemapStackChildren: '__SandDance__TreemapStackChildren',\n  TreemapStackDepth: '__SandDance__TreemapStackDepth',\n  TreemapStackX0: '__SandDance__TreemapStackX0',\n  TreemapStackX1: '__SandDance__TreemapStackX1',\n  TreemapStackY0: '__SandDance__TreemapStackY0',\n  TreemapStackY1: '__SandDance__TreemapStackY1'\n};\nexports.FieldNames = FieldNames;\nconst DataNames = {\n  Pre: 'PreData',\n  Main: 'MainData',\n  EmptyBin: 'EmptyBinsData',\n  TopLookup: 'TopData',\n  Legend: 'LegendData',\n  FacetGroupCell: 'FacetGroupCellData',\n  FacetCellTitles: 'FacetCellTitlesData',\n  QuantitativeData: 'QuantitativeData'\n};\nexports.DataNames = DataNames;\nconst ScaleNames = {\n  Color: 'ColorScale',\n  X: 'MainXScale',\n  Y: 'MainYScale',\n  Z: 'MainZScale'\n}; //Signal names\n\nexports.ScaleNames = ScaleNames;\nconst SignalNames = {\n  ColorBinCount: 'RoleColor_BinCountSignal',\n  ColorReverse: 'RoleColor_ReverseSignal',\n  FacetColumns: 'RoleFacet_ColumnsSignal',\n  FacetRows: 'RoleFacet_RowsSignal',\n  InnerPadding: 'Chart_InnerPadding',\n  OuterPadding: 'Chart_OuterPadding',\n  MarkOpacity: 'Mark_OpacitySignal',\n  PointSize: 'Chart_PointSizeSignal',\n  TextAngleX: 'Text_AngleXSignal',\n  TextAngleY: 'Text_AngleYSignal',\n  TextScale: 'Text_ScaleSignal',\n  TextSize: 'Text_SizeSignal',\n  TextTitleSize: 'Text_TitleSizeSignal',\n  TreeMapMethod: 'Chart_TreeMapMethodSignal',\n  XDomain: 'RoleX_DomainSignal',\n  XBins: 'RoleX_BinsSignal',\n  XGridSize: 'Chart_XGridSize',\n  YBins: 'RoleY_BinsSignal',\n  YDomain: 'RoleY_DomainSignal',\n  YGridSize: 'Chart_YGridSize',\n  ZHeight: 'RoleZ_HeightSignal',\n  ZProportion: 'RoleZ_ProportionSignal'\n};\nexports.SignalNames = SignalNames;\nconst BarChartScaleNames = {\n  bucketScale: 'bucketScale',\n  levelScale: 'levelScale',\n  compartmentScale: 'compartmentScale'\n};\nexports.BarChartScaleNames = BarChartScaleNames;\nconst BarChartSignalNames = {\n  aspectRatioSignal: 'aspectRatioSignal',\n  compartmentsPerLevelSignal: 'compartmentsPerLevelSignal',\n  compartmentHeightSignal: 'compartmentHeightSignal',\n  compartmentWidthSignal: 'compartmentWidthSignal',\n  levelExtentSignal: 'levelExtentSignal',\n  quantitativeBinSignal: 'quantitativeBinSignal'\n}; //These are special formulaic data values\n\nexports.BarChartSignalNames = BarChartSignalNames;\nconst Other = '__Other'; //name of the \"no-color\" palette\n\nexports.Other = Other;\nconst ColorScaleNone = 'none';\nexports.ColorScaleNone = ColorScaleNone;\n},{}],\"Syc7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"ColorScaleNone\", {\n  enumerable: true,\n  get: function () {\n    return _constants.ColorScaleNone;\n  }\n});\nObject.defineProperty(exports, \"FieldNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.FieldNames;\n  }\n});\nObject.defineProperty(exports, \"ScaleNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.ScaleNames;\n  }\n});\nObject.defineProperty(exports, \"SignalNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.SignalNames;\n  }\n});\n\nvar _constants = require(\"./specs/constants\");\n},{\"./specs/constants\":\"b0rV\"}],\"yy6X\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isSearchExpressionGroup = isSearchExpressionGroup;\nexports.createGroupFromExpression = createGroupFromExpression;\nexports.ensureSearchExpressionGroupArray = ensureSearchExpressionGroupArray;\n\nfunction isSearchExpressionGroup(search) {\n  if (!search) {\n    return false;\n  }\n\n  return !!search.expressions;\n}\n\nfunction createGroupFromExpression(input) {\n  const output = {\n    expressions: [input]\n  };\n  return output;\n}\n\nfunction ensureSearchExpressionGroupArray(search) {\n  if (Array.isArray(search)) {\n    return [...search];\n  } else if (isSearchExpressionGroup(search)) {\n    return [search];\n  } else {\n    return [createGroupFromExpression(search)];\n  }\n}\n},{}],\"r4by\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.compareExpression = compareExpression;\nexports.compareGroup = compareGroup;\nexports.compare = compare;\nexports.startsWith = startsWith;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst expressionKeys = Object.keys({\n  clause: null,\n  name: null,\n  operator: null,\n  value: null\n});\n\nfunction compareExpression(a, b) {\n  if (a && b) {\n    for (let k = 0; k < expressionKeys.length; k++) {\n      let key = expressionKeys[k];\n      if (a[key] != b[key]) return false;\n    }\n  } else {\n    return !a && !b;\n  }\n\n  return true;\n}\n\nconst groupKeys = Object.keys({\n  clause: null\n});\n\nfunction compareGroup(a, b) {\n  for (let k = 0; k < groupKeys.length; k++) {\n    let key = groupKeys[k];\n    if (a[key] != b[key]) return false;\n  }\n\n  if (a.expressions.length != b.expressions.length) return false;\n\n  for (let i = 0; i < a.expressions.length; i++) {\n    if (!compareExpression(a.expressions[i], b.expressions[i])) return false;\n  }\n\n  return true;\n}\n\nfunction compare(a, b) {\n  if (a == b) return true;\n  if (!a || !b) return false;\n  let arrs = [a, b].map(_group.ensureSearchExpressionGroupArray);\n  let [arrA, arrB] = arrs;\n  if (arrA.length != arrB.length) return false;\n\n  for (let i = 0; i < arrA.length; i++) {\n    if (!compareGroup(arrA[i], arrB[i])) return false;\n  }\n\n  return true;\n}\n\nfunction startsWith(whole, part) {\n  if (!part) return true;\n  let arrs = [whole, part].map(_group.ensureSearchExpressionGroupArray);\n  let [wholeArray, partArray] = arrs;\n  if (partArray.length > wholeArray.length) return false;\n\n  for (let i = 0; i < partArray.length; i++) {\n    if (!compareGroup(wholeArray[i], partArray[i])) return false;\n  }\n\n  return true;\n}\n},{\"./group\":\"yy6X\"}],\"wNjT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.invert = invert;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction invertSearchExpressionGroup(input) {\n  //this only works if all expressions in this group have the same clause\n  const output = {\n    expressions: input.expressions.map(invertSearchExpression)\n  };\n\n  if (input.clause) {\n    output.clause = invertedClauses[input.clause];\n  }\n\n  return output;\n}\n\nconst invertedOperators = {\n  '!=': '==',\n  '==': '!=',\n  '<': '>=',\n  '>=': '<',\n  '<=': '>',\n  '>': '<=',\n  '!contains': 'contains',\n  'contains': '!contains',\n  '!isnullorEmpty': 'isnullorEmpty',\n  'isnullorEmpty': '!isnullorEmpty',\n  '!starts': 'starts',\n  'starts': '!starts'\n};\nconst invertedClauses = {\n  '&&': '||',\n  '||': '&&'\n};\n\nfunction invertSearchExpression(input) {\n  const operator = invertedOperators[input.operator];\n  const output = Object.assign(Object.assign({}, input), {\n    operator\n  });\n\n  if (input.clause) {\n    output.clause = invertedClauses[input.clause];\n  }\n\n  return output;\n}\n\nfunction invert(search) {\n  if (Array.isArray(search)) {\n    return search.map(invertSearchExpressionGroup);\n  } else if ((0, _group.isSearchExpressionGroup)(search)) {\n    return invertSearchExpressionGroup(search);\n  } else {\n    return invertSearchExpression(search);\n  }\n}\n},{\"./group\":\"yy6X\"}],\"hTOx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.narrow = narrow;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction narrow(a, b) {\n  if (!a) {\n    return b;\n  }\n\n  let arrs = [a, b].map(_group.ensureSearchExpressionGroupArray);\n  let [arrA, arrB] = arrs;\n  arrB[0].clause = '&&';\n  return arrA.concat(arrB);\n}\n},{\"./group\":\"yy6X\"}],\"mJgy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _compare = require(\"./compare\");\n\nObject.keys(_compare).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _compare[key];\n    }\n  });\n});\n\nvar _invert = require(\"./invert\");\n\nObject.keys(_invert).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _invert[key];\n    }\n  });\n});\n\nvar _narrow = require(\"./narrow\");\n\nObject.keys(_narrow).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _narrow[key];\n    }\n  });\n});\n},{\"./compare\":\"r4by\",\"./invert\":\"wNjT\",\"./narrow\":\"hTOx\"}],\"JCLk\":[function(require,module,exports) {\n\n},{}],\"Fy6F\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.layerNames = exports.GL_ORDINAL = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst GL_ORDINAL = 'GL_ORDINAL';\nexports.GL_ORDINAL = GL_ORDINAL;\nconst layerNames = {\n  cubes: 'LAYER_CUBES',\n  lines: 'LAYER_LINES',\n  text: 'LAYER_TEXT'\n};\nexports.layerNames = layerNames;\n},{}],\"o9ca\":[function(require,module,exports) {\nvar global = arguments[3];\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n/*!\n * XRegExp 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2007-2017 MIT License\n */\n\n/**\n * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and\n * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to\n * make your client-side grepping simpler and more powerful, while freeing you from related\n * cross-browser inconsistencies.\n */\n\n// ==--------------------------==\n// Private stuff\n// ==--------------------------==\n\n// Property name used for extended regex instance data\nvar REGEX_DATA = 'xregexp';\n// Optional features that can be installed and uninstalled\nvar features = {\n    astral: false\n};\n// Native methods to use and restore ('native' is an ES3 reserved keyword)\nvar nativ = {\n    exec: RegExp.prototype.exec,\n    test: RegExp.prototype.test,\n    match: String.prototype.match,\n    replace: String.prototype.replace,\n    split: String.prototype.split\n};\n// Storage for fixed/extended native methods\nvar fixed = {};\n// Storage for regexes cached by `XRegExp.cache`\nvar regexCache = {};\n// Storage for pattern details cached by the `XRegExp` constructor\nvar patternCache = {};\n// Storage for regex syntax tokens added internally or by `XRegExp.addToken`\nvar tokens = [];\n// Token scopes\nvar defaultScope = 'default';\nvar classScope = 'class';\n// Regexes that match native regex syntax, including octals\nvar nativeTokens = {\n    // Any native multicharacter token in default scope, or any single character\n    'default': /\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|\\(\\?(?:[:=!]|<[=!])|[?*+]\\?|{\\d+(?:,\\d*)?}\\??|[\\s\\S]/,\n    // Any native multicharacter token in character class scope, or any single character\n    'class': /\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|[\\s\\S]/\n};\n// Any backreference or dollar-prefixed character in replacement strings\nvar replacementToken = /\\$(?:{([\\w$]+)}|<([\\w$]+)>|(\\d\\d?|[\\s\\S]))/g;\n// Check for correct `exec` handling of nonparticipating capturing groups\nvar correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined;\n// Check for ES6 `flags` prop support\nvar hasFlagsProp = /x/.flags !== undefined;\n// Shortcut to `Object.prototype.toString`\nvar toString = {}.toString;\n\nfunction hasNativeFlag(flag) {\n    // Can't check based on the presence of properties/getters since browsers might support such\n    // properties even when they don't support the corresponding flag in regex construction (tested\n    // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`\n    // throws an error)\n    var isSupported = true;\n    try {\n        // Can't use regex literals for testing even in a `try` because regex literals with\n        // unsupported flags cause a compilation error in IE\n        new RegExp('', flag);\n    } catch (exception) {\n        isSupported = false;\n    }\n    return isSupported;\n}\n// Check for ES6 `u` flag support\nvar hasNativeU = hasNativeFlag('u');\n// Check for ES6 `y` flag support\nvar hasNativeY = hasNativeFlag('y');\n// Tracker for known flags, including addon flags\nvar registeredFlags = {\n    g: true,\n    i: true,\n    m: true,\n    u: hasNativeU,\n    y: hasNativeY\n};\n\n/**\n * Attaches extended data and `XRegExp.prototype` properties to a regex object.\n *\n * @private\n * @param {RegExp} regex Regex to augment.\n * @param {Array} captureNames Array with capture names, or `null`.\n * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.\n * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.\n * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal\n *   operations, and never exposed to users. For internal-only regexes, we can improve perf by\n *   skipping some operations like attaching `XRegExp.prototype` properties.\n * @returns {RegExp} Augmented regex.\n */\nfunction augment(regex, captureNames, xSource, xFlags, isInternalOnly) {\n    var p = void 0;\n\n    regex[REGEX_DATA] = {\n        captureNames: captureNames\n    };\n\n    if (isInternalOnly) {\n        return regex;\n    }\n\n    // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value\n    if (regex.__proto__) {\n        regex.__proto__ = XRegExp.prototype;\n    } else {\n        for (p in XRegExp.prototype) {\n            // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this\n            // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`\n            // extensions exist on `regex.prototype` anyway\n            regex[p] = XRegExp.prototype[p];\n        }\n    }\n\n    regex[REGEX_DATA].source = xSource;\n    // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order\n    regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;\n\n    return regex;\n}\n\n/**\n * Removes any duplicate characters from the provided string.\n *\n * @private\n * @param {String} str String to remove duplicate characters from.\n * @returns {String} String with any duplicate characters removed.\n */\nfunction clipDuplicates(str) {\n    return nativ.replace.call(str, /([\\s\\S])(?=[\\s\\S]*\\1)/g, '');\n}\n\n/**\n * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`\n * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing\n * flags g and y while copying the regex.\n *\n * @private\n * @param {RegExp} regex Regex to copy.\n * @param {Object} [options] Options object with optional properties:\n *   - `addG` {Boolean} Add flag g while copying the regex.\n *   - `addY` {Boolean} Add flag y while copying the regex.\n *   - `removeG` {Boolean} Remove flag g while copying the regex.\n *   - `removeY` {Boolean} Remove flag y while copying the regex.\n *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal\n *     operations, and never exposed to users. For internal-only regexes, we can improve perf by\n *     skipping some operations like attaching `XRegExp.prototype` properties.\n *   - `source` {String} Overrides `<regex>.source`, for special cases.\n * @returns {RegExp} Copy of the provided regex, possibly with modified flags.\n */\nfunction copyRegex(regex, options) {\n    if (!XRegExp.isRegExp(regex)) {\n        throw new TypeError('Type RegExp expected');\n    }\n\n    var xData = regex[REGEX_DATA] || {};\n    var flags = getNativeFlags(regex);\n    var flagsToAdd = '';\n    var flagsToRemove = '';\n    var xregexpSource = null;\n    var xregexpFlags = null;\n\n    options = options || {};\n\n    if (options.removeG) {\n        flagsToRemove += 'g';\n    }\n    if (options.removeY) {\n        flagsToRemove += 'y';\n    }\n    if (flagsToRemove) {\n        flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), '');\n    }\n\n    if (options.addG) {\n        flagsToAdd += 'g';\n    }\n    if (options.addY) {\n        flagsToAdd += 'y';\n    }\n    if (flagsToAdd) {\n        flags = clipDuplicates(flags + flagsToAdd);\n    }\n\n    if (!options.isInternalOnly) {\n        if (xData.source !== undefined) {\n            xregexpSource = xData.source;\n        }\n        // null or undefined; don't want to add to `flags` if the previous value was null, since\n        // that indicates we're not tracking original precompilation flags\n        if (xData.flags != null) {\n            // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never\n            // removed for non-internal regexes, so don't need to handle it\n            xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;\n        }\n    }\n\n    // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid\n    // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and\n    // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the\n    // translation to native regex syntax\n    regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);\n\n    return regex;\n}\n\n/**\n * Converts hexadecimal to decimal.\n *\n * @private\n * @param {String} hex\n * @returns {Number}\n */\nfunction dec(hex) {\n    return parseInt(hex, 16);\n}\n\n/**\n * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an\n * inline comment or whitespace with flag x. This is used directly as a token handler function\n * passed to `XRegExp.addToken`.\n *\n * @private\n * @param {String} match Match arg of `XRegExp.addToken` handler\n * @param {String} scope Scope arg of `XRegExp.addToken` handler\n * @param {String} flags Flags arg of `XRegExp.addToken` handler\n * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.\n */\nfunction getContextualTokenSeparator(match, scope, flags) {\n    if (\n    // No need to separate tokens if at the beginning or end of a group\n    match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' ||\n    // Avoid separating tokens when the following token is a quantifier\n    isQuantifierNext(match.input, match.index + match[0].length, flags)) {\n        return '';\n    }\n    // Keep tokens separated. This avoids e.g. inadvertedly changing `\\1 1` or `\\1(?#)1` to `\\11`.\n    // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax\n    // error `(? :` into `(?:`.\n    return '(?:)';\n}\n\n/**\n * Returns native `RegExp` flags used by a regex object.\n *\n * @private\n * @param {RegExp} regex Regex to check.\n * @returns {String} Native flags in use.\n */\nfunction getNativeFlags(regex) {\n    return hasFlagsProp ? regex.flags :\n    // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation\n    // with an empty string) allows this to continue working predictably when\n    // `XRegExp.proptotype.toString` is overridden\n    nativ.exec.call(/\\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];\n}\n\n/**\n * Determines whether a regex has extended instance data used to track capture names.\n *\n * @private\n * @param {RegExp} regex Regex to check.\n * @returns {Boolean} Whether the regex uses named capture.\n */\nfunction hasNamedCapture(regex) {\n    return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);\n}\n\n/**\n * Converts decimal to hexadecimal.\n *\n * @private\n * @param {Number|String} dec\n * @returns {String}\n */\nfunction hex(dec) {\n    return parseInt(dec, 10).toString(16);\n}\n\n/**\n * Checks whether the next nonignorable token after the specified position is a quantifier.\n *\n * @private\n * @param {String} pattern Pattern to search within.\n * @param {Number} pos Index in `pattern` to search at.\n * @param {String} flags Flags used by the pattern.\n * @returns {Boolean} Whether the next nonignorable token is a quantifier.\n */\nfunction isQuantifierNext(pattern, pos, flags) {\n    var inlineCommentPattern = '\\\\(\\\\?#[^)]*\\\\)';\n    var lineCommentPattern = '#[^#\\\\n]*';\n    var quantifierPattern = '[?*+]|{\\\\d+(?:,\\\\d*)?}';\n    return nativ.test.call(flags.indexOf('x') !== -1 ?\n    // Ignore any leading whitespace, line comments, and inline comments\n    /^(?:\\s|#[^#\\n]*|\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/ :\n    // Ignore any leading inline comments\n    /^(?:\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/, pattern.slice(pos));\n}\n\n/**\n * Determines whether a value is of the specified type, by resolving its internal [[Class]].\n *\n * @private\n * @param {*} value Object to check.\n * @param {String} type Type to check for, in TitleCase.\n * @returns {Boolean} Whether the object matches the type.\n */\nfunction isType(value, type) {\n    return toString.call(value) === '[object ' + type + ']';\n}\n\n/**\n * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.\n *\n * @private\n * @param {String} str\n * @returns {String}\n */\nfunction pad4(str) {\n    while (str.length < 4) {\n        str = '0' + str;\n    }\n    return str;\n}\n\n/**\n * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads\n * the flag preparation logic from the `XRegExp` constructor.\n *\n * @private\n * @param {String} pattern Regex pattern, possibly with a leading mode modifier.\n * @param {String} flags Any combination of flags.\n * @returns {Object} Object with properties `pattern` and `flags`.\n */\nfunction prepareFlags(pattern, flags) {\n    var i = void 0;\n\n    // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags\n    if (clipDuplicates(flags) !== flags) {\n        throw new SyntaxError('Invalid duplicate regex flag ' + flags);\n    }\n\n    // Strip and apply a leading mode modifier with any combination of flags except g or y\n    pattern = nativ.replace.call(pattern, /^\\(\\?([\\w$]+)\\)/, function ($0, $1) {\n        if (nativ.test.call(/[gy]/, $1)) {\n            throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0);\n        }\n        // Allow duplicate flags within the mode modifier\n        flags = clipDuplicates(flags + $1);\n        return '';\n    });\n\n    // Throw on unknown native or nonnative flags\n    for (i = 0; i < flags.length; ++i) {\n        if (!registeredFlags[flags[i]]) {\n            throw new SyntaxError('Unknown regex flag ' + flags[i]);\n        }\n    }\n\n    return {\n        pattern: pattern,\n        flags: flags\n    };\n}\n\n/**\n * Prepares an options object from the given value.\n *\n * @private\n * @param {String|Object} value Value to convert to an options object.\n * @returns {Object} Options object.\n */\nfunction prepareOptions(value) {\n    var options = {};\n\n    if (isType(value, 'String')) {\n        XRegExp.forEach(value, /[^\\s,]+/, function (match) {\n            options[match] = true;\n        });\n\n        return options;\n    }\n\n    return value;\n}\n\n/**\n * Registers a flag so it doesn't throw an 'unknown flag' error.\n *\n * @private\n * @param {String} flag Single-character flag to register.\n */\nfunction registerFlag(flag) {\n    if (!/^[\\w$]$/.test(flag)) {\n        throw new Error('Flag must be a single character A-Za-z0-9_$');\n    }\n\n    registeredFlags[flag] = true;\n}\n\n/**\n * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified\n * position, until a match is found.\n *\n * @private\n * @param {String} pattern Original pattern from which an XRegExp object is being built.\n * @param {String} flags Flags being used to construct the regex.\n * @param {Number} pos Position to search for tokens within `pattern`.\n * @param {Number} scope Regex scope to apply: 'default' or 'class'.\n * @param {Object} context Context object to use for token handler functions.\n * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.\n */\nfunction runTokens(pattern, flags, pos, scope, context) {\n    var i = tokens.length;\n    var leadChar = pattern[pos];\n    var result = null;\n    var match = void 0;\n    var t = void 0;\n\n    // Run in reverse insertion order\n    while (i--) {\n        t = tokens[i];\n        if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(flags.indexOf(t.flag) !== -1)) {\n            continue;\n        }\n\n        match = XRegExp.exec(pattern, t.regex, pos, 'sticky');\n        if (match) {\n            result = {\n                matchLength: match[0].length,\n                output: t.handler.call(context, match, scope, flags),\n                reparse: t.reparse\n            };\n            // Finished with token tests\n            break;\n        }\n    }\n\n    return result;\n}\n\n/**\n * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to\n * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if\n * the Unicode Base addon is not available, since flag A is registered by that addon.\n *\n * @private\n * @param {Boolean} on `true` to enable; `false` to disable.\n */\nfunction setAstral(on) {\n    features.astral = on;\n}\n\n/**\n * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow\n * the ES5 abstract operation `ToObject`.\n *\n * @private\n * @param {*} value Object to check and return.\n * @returns {*} The provided object.\n */\nfunction toObject(value) {\n    // null or undefined\n    if (value == null) {\n        throw new TypeError('Cannot convert null or undefined to object');\n    }\n\n    return value;\n}\n\n// ==--------------------------==\n// Constructor\n// ==--------------------------==\n\n/**\n * Creates an extended regular expression object for matching text with a pattern. Differs from a\n * native regular expression in that additional syntax and flags are supported. The returned object\n * is in fact a native `RegExp` and works with all native methods.\n *\n * @class XRegExp\n * @constructor\n * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.\n * @param {String} [flags] Any combination of flags.\n *   Native flags:\n *     - `g` - global\n *     - `i` - ignore case\n *     - `m` - multiline anchors\n *     - `u` - unicode (ES6)\n *     - `y` - sticky (Firefox 3+, ES6)\n *   Additional XRegExp flags:\n *     - `n` - explicit capture\n *     - `s` - dot matches all (aka singleline)\n *     - `x` - free-spacing and line comments (aka extended)\n *     - `A` - astral (requires the Unicode Base addon)\n *   Flags cannot be provided when constructing one `RegExp` from another.\n * @returns {RegExp} Extended regular expression object.\n * @example\n *\n * // With named capture and flag x\n * XRegExp(`(?<year>  [0-9]{4} ) -?  # year\n *          (?<month> [0-9]{2} ) -?  # month\n *          (?<day>   [0-9]{2} )     # day`, 'x');\n *\n * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)\n * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and\n * // have fresh `lastIndex` properties (set to zero).\n * XRegExp(/regex/);\n */\nfunction XRegExp(pattern, flags) {\n    if (XRegExp.isRegExp(pattern)) {\n        if (flags !== undefined) {\n            throw new TypeError('Cannot supply flags when copying a RegExp');\n        }\n        return copyRegex(pattern);\n    }\n\n    // Copy the argument behavior of `RegExp`\n    pattern = pattern === undefined ? '' : String(pattern);\n    flags = flags === undefined ? '' : String(flags);\n\n    if (XRegExp.isInstalled('astral') && !(flags.indexOf('A') !== -1)) {\n        // This causes an error to be thrown if the Unicode Base addon is not available\n        flags += 'A';\n    }\n\n    if (!patternCache[pattern]) {\n        patternCache[pattern] = {};\n    }\n\n    if (!patternCache[pattern][flags]) {\n        var context = {\n            hasNamedCapture: false,\n            captureNames: []\n        };\n        var scope = defaultScope;\n        var output = '';\n        var pos = 0;\n        var result = void 0;\n\n        // Check for flag-related errors, and strip/apply flags in a leading mode modifier\n        var applied = prepareFlags(pattern, flags);\n        var appliedPattern = applied.pattern;\n        var appliedFlags = applied.flags;\n\n        // Use XRegExp's tokens to translate the pattern to a native regex pattern.\n        // `appliedPattern.length` may change on each iteration if tokens use `reparse`\n        while (pos < appliedPattern.length) {\n            do {\n                // Check for custom tokens at the current position\n                result = runTokens(appliedPattern, appliedFlags, pos, scope, context);\n                // If the matched token used the `reparse` option, splice its output into the\n                // pattern before running tokens again at the same position\n                if (result && result.reparse) {\n                    appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength);\n                }\n            } while (result && result.reparse);\n\n            if (result) {\n                output += result.output;\n                pos += result.matchLength || 1;\n            } else {\n                // Get the native token at the current position\n                var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0];\n                output += token;\n                pos += token.length;\n                if (token === '[' && scope === defaultScope) {\n                    scope = classScope;\n                } else if (token === ']' && scope === classScope) {\n                    scope = defaultScope;\n                }\n            }\n        }\n\n        patternCache[pattern][flags] = {\n            // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty\n            // groups are sometimes inserted during regex transpilation in order to keep tokens\n            // separated. However, more than one empty group in a row is never needed.\n            pattern: nativ.replace.call(output, /(?:\\(\\?:\\))+/g, '(?:)'),\n            // Strip all but native flags\n            flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),\n            // `context.captureNames` has an item for each capturing group, even if unnamed\n            captures: context.hasNamedCapture ? context.captureNames : null\n        };\n    }\n\n    var generated = patternCache[pattern][flags];\n    return augment(new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags);\n}\n\n// Add `RegExp.prototype` to the prototype chain\nXRegExp.prototype = /(?:)/;\n\n// ==--------------------------==\n// Public properties\n// ==--------------------------==\n\n/**\n * The XRegExp version number as a string containing three dot-separated parts. For example,\n * '2.0.0-beta-3'.\n *\n * @static\n * @memberOf XRegExp\n * @type String\n */\nXRegExp.version = '4.0.0';\n\n// ==--------------------------==\n// Public methods\n// ==--------------------------==\n\n// Intentionally undocumented; used in tests and addons\nXRegExp._clipDuplicates = clipDuplicates;\nXRegExp._hasNativeFlag = hasNativeFlag;\nXRegExp._dec = dec;\nXRegExp._hex = hex;\nXRegExp._pad4 = pad4;\n\n/**\n * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to\n * create XRegExp addons. If more than one token can match the same string, the last added wins.\n *\n * @memberOf XRegExp\n * @param {RegExp} regex Regex object that matches the new token.\n * @param {Function} handler Function that returns a new pattern string (using native regex syntax)\n *   to replace the matched token within all future XRegExp regexes. Has access to persistent\n *   properties of the regex being built, through `this`. Invoked with three arguments:\n *   - The match array, with named backreference properties.\n *   - The regex scope where the match was found: 'default' or 'class'.\n *   - The flags used by the regex, including any flags in a leading mode modifier.\n *   The handler function becomes part of the XRegExp construction process, so be careful not to\n *   construct XRegExps within the function or you will trigger infinite recursion.\n * @param {Object} [options] Options object with optional properties:\n *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.\n *   - `flag` {String} Single-character flag that triggers the token. This also registers the\n *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.\n *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are\n *     not required to trigger the token. This registers the flags, to prevent XRegExp from\n *     throwing an 'unknown flag' error when any of the flags are used.\n *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as\n *     final, and instead be reparseable by other tokens (including the current token). Allows\n *     token chaining or deferring.\n *   - `leadChar` {String} Single character that occurs at the beginning of any successful match\n *     of the token (not always applicable). This doesn't change the behavior of the token unless\n *     you provide an erroneous value. However, providing it can increase the token's performance\n *     since the token can be skipped at any positions where this character doesn't appear.\n * @example\n *\n * // Basic usage: Add \\a for the ALERT control code\n * XRegExp.addToken(\n *   /\\\\a/,\n *   () => '\\\\x07',\n *   {scope: 'all'}\n * );\n * XRegExp('\\\\a[\\\\a-\\\\n]+').test('\\x07\\n\\x07'); // -> true\n *\n * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.\n * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of\n * // character classes only)\n * XRegExp.addToken(\n *   /([?*+]|{\\d+(?:,\\d*)?})(\\??)/,\n *   (match) => `${match[1]}${match[2] ? '' : '?'}`,\n *   {flag: 'U'}\n * );\n * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'\n * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'\n */\nXRegExp.addToken = function (regex, handler, options) {\n    options = options || {};\n    var optionalFlags = options.optionalFlags;\n    var i = void 0;\n\n    if (options.flag) {\n        registerFlag(options.flag);\n    }\n\n    if (optionalFlags) {\n        optionalFlags = nativ.split.call(optionalFlags, '');\n        for (i = 0; i < optionalFlags.length; ++i) {\n            registerFlag(optionalFlags[i]);\n        }\n    }\n\n    // Add to the private list of syntax tokens\n    tokens.push({\n        regex: copyRegex(regex, {\n            addG: true,\n            addY: hasNativeY,\n            isInternalOnly: true\n        }),\n        handler: handler,\n        scope: options.scope || defaultScope,\n        flag: options.flag,\n        reparse: options.reparse,\n        leadChar: options.leadChar\n    });\n\n    // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags\n    // might now produce different results\n    XRegExp.cache.flush('patterns');\n};\n\n/**\n * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with\n * the same pattern and flag combination, the cached copy of the regex is returned.\n *\n * @memberOf XRegExp\n * @param {String} pattern Regex pattern string.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @returns {RegExp} Cached XRegExp object.\n * @example\n *\n * while (match = XRegExp.cache('.', 'gs').exec(str)) {\n *   // The regex is compiled once only\n * }\n */\nXRegExp.cache = function (pattern, flags) {\n    if (!regexCache[pattern]) {\n        regexCache[pattern] = {};\n    }\n    return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));\n};\n\n// Intentionally undocumented; used in tests\nXRegExp.cache.flush = function (cacheName) {\n    if (cacheName === 'patterns') {\n        // Flush the pattern cache used by the `XRegExp` constructor\n        patternCache = {};\n    } else {\n        // Flush the regex cache populated by `XRegExp.cache`\n        regexCache = {};\n    }\n};\n\n/**\n * Escapes any regular expression metacharacters, for use when matching literal strings. The result\n * can safely be used at any point within a regex that uses any flags.\n *\n * @memberOf XRegExp\n * @param {String} str String to escape.\n * @returns {String} String with regex metacharacters escaped.\n * @example\n *\n * XRegExp.escape('Escaped? <.>');\n * // -> 'Escaped\\?\\ <\\.>'\n */\nXRegExp.escape = function (str) {\n    return nativ.replace.call(toObject(str), /[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n};\n\n/**\n * Executes a regex search in a specified string. Returns a match array or `null`. If the provided\n * regex uses named capture, named backreference properties are included on the match array.\n * Optional `pos` and `sticky` arguments specify the search start position, and whether the match\n * must start at the specified position only. The `lastIndex` property of the provided regex is not\n * used, but is updated for compatibility. Also fixes browser bugs compared to the native\n * `RegExp.prototype.exec` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Number} [pos=0] Zero-based index at which to start the search.\n * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n *   only. The string `'sticky'` is accepted as an alternative to `true`.\n * @returns {Array} Match array with named backreference properties, or `null`.\n * @example\n *\n * // Basic use, with named backreference\n * let match = XRegExp.exec('U+2620', XRegExp('U\\\\+(?<hex>[0-9A-F]{4})'));\n * match.hex; // -> '2620'\n *\n * // With pos and sticky, in a loop\n * let pos = 2, result = [], match;\n * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\\d)>/, pos, 'sticky')) {\n *   result.push(match[1]);\n *   pos = match.index + match[0].length;\n * }\n * // result -> ['2', '3', '4']\n */\nXRegExp.exec = function (str, regex, pos, sticky) {\n    var cacheKey = 'g';\n    var addY = false;\n    var fakeY = false;\n    var match = void 0;\n\n    addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);\n    if (addY) {\n        cacheKey += 'y';\n    } else if (sticky) {\n        // Simulate sticky matching by appending an empty capture to the original regex. The\n        // resulting regex will succeed no matter what at the current index (set with `lastIndex`),\n        // and will not search the rest of the subject string. We'll know that the original regex\n        // has failed if that last capture is `''` rather than `undefined` (i.e., if that last\n        // capture participated in the match).\n        fakeY = true;\n        cacheKey += 'FakeY';\n    }\n\n    regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n    // Shares cached copies with `XRegExp.match`/`replace`\n    var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n        addG: true,\n        addY: addY,\n        source: fakeY ? regex.source + '|()' : undefined,\n        removeY: sticky === false,\n        isInternalOnly: true\n    }));\n\n    pos = pos || 0;\n    r2.lastIndex = pos;\n\n    // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.\n    match = fixed.exec.call(r2, str);\n\n    // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means\n    // the original regexp failed (see above).\n    if (fakeY && match && match.pop() === '') {\n        match = null;\n    }\n\n    if (regex.global) {\n        regex.lastIndex = match ? r2.lastIndex : 0;\n    }\n\n    return match;\n};\n\n/**\n * Executes a provided function once per regex match. Searches always start at the beginning of the\n * string and continue until the end, regardless of the state of the regex's `global` property and\n * initial `lastIndex`.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Function} callback Function to execute for each match. Invoked with four arguments:\n *   - The match array, with named backreference properties.\n *   - The zero-based match index.\n *   - The string being traversed.\n *   - The regex object being used to traverse the string.\n * @example\n *\n * // Extracts every other digit from a string\n * const evens = [];\n * XRegExp.forEach('1a2345', /\\d/, (match, i) => {\n *   if (i % 2) evens.push(+match[0]);\n * });\n * // evens -> [2, 4]\n */\nXRegExp.forEach = function (str, regex, callback) {\n    var pos = 0;\n    var i = -1;\n    var match = void 0;\n\n    while (match = XRegExp.exec(str, regex, pos)) {\n        // Because `regex` is provided to `callback`, the function could use the deprecated/\n        // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`\n        // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,\n        // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of\n        // regexes, mutating the regex will not have any effect on the iteration or matched strings,\n        // which is a nice side effect that brings extra safety.\n        callback(match, ++i, str, regex);\n\n        pos = match.index + (match[0].length || 1);\n    }\n};\n\n/**\n * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with\n * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native\n * regexes are not recompiled using XRegExp syntax.\n *\n * @memberOf XRegExp\n * @param {RegExp} regex Regex to globalize.\n * @returns {RegExp} Copy of the provided regex with flag `g` added.\n * @example\n *\n * const globalCopy = XRegExp.globalize(/regex/);\n * globalCopy.global; // -> true\n */\nXRegExp.globalize = function (regex) {\n    return copyRegex(regex, { addG: true });\n};\n\n/**\n * Installs optional features according to the specified options. Can be undone using\n * `XRegExp.uninstall`.\n *\n * @memberOf XRegExp\n * @param {Object|String} options Options object or string.\n * @example\n *\n * // With an options object\n * XRegExp.install({\n *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)\n *   astral: true\n * });\n *\n * // With an options string\n * XRegExp.install('astral');\n */\nXRegExp.install = function (options) {\n    options = prepareOptions(options);\n\n    if (!features.astral && options.astral) {\n        setAstral(true);\n    }\n};\n\n/**\n * Checks whether an individual optional feature is installed.\n *\n * @memberOf XRegExp\n * @param {String} feature Name of the feature to check. One of:\n *   - `astral`\n * @returns {Boolean} Whether the feature is installed.\n * @example\n *\n * XRegExp.isInstalled('astral');\n */\nXRegExp.isInstalled = function (feature) {\n    return !!features[feature];\n};\n\n/**\n * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes\n * created in another frame, when `instanceof` and `constructor` checks would fail.\n *\n * @memberOf XRegExp\n * @param {*} value Object to check.\n * @returns {Boolean} Whether the object is a `RegExp` object.\n * @example\n *\n * XRegExp.isRegExp('string'); // -> false\n * XRegExp.isRegExp(/regex/i); // -> true\n * XRegExp.isRegExp(RegExp('^', 'm')); // -> true\n * XRegExp.isRegExp(XRegExp('(?s).')); // -> true\n */\nXRegExp.isRegExp = function (value) {\n    return toString.call(value) === '[object RegExp]';\n}; // isType(value, 'RegExp');\n\n/**\n * Returns the first matched string, or in global mode, an array containing all matched strings.\n * This is essentially a more convenient re-implementation of `String.prototype.match` that gives\n * the result types you actually want (string instead of `exec`-style array in match-first mode,\n * and an empty array instead of `null` when no matches are found in match-all mode). It also lets\n * you override flag g and ignore `lastIndex`, and fixes browser bugs.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to\n *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,\n *   `scope` is 'all'.\n * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all\n *   mode: Array of all matched strings, or an empty array.\n * @example\n *\n * // Match first\n * XRegExp.match('abc', /\\w/); // -> 'a'\n * XRegExp.match('abc', /\\w/g, 'one'); // -> 'a'\n * XRegExp.match('abc', /x/g, 'one'); // -> null\n *\n * // Match all\n * XRegExp.match('abc', /\\w/g); // -> ['a', 'b', 'c']\n * XRegExp.match('abc', /\\w/, 'all'); // -> ['a', 'b', 'c']\n * XRegExp.match('abc', /x/, 'all'); // -> []\n */\nXRegExp.match = function (str, regex, scope) {\n    var global = regex.global && scope !== 'one' || scope === 'all';\n    var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';\n\n    regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n    // Shares cached copies with `XRegExp.exec`/`replace`\n    var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n        addG: !!global,\n        removeG: scope === 'one',\n        isInternalOnly: true\n    }));\n\n    var result = nativ.match.call(toObject(str), r2);\n\n    if (regex.global) {\n        regex.lastIndex = scope === 'one' && result ?\n        // Can't use `r2.lastIndex` since `r2` is nonglobal in this case\n        result.index + result[0].length : 0;\n    }\n\n    return global ? result || [] : result && result[0];\n};\n\n/**\n * Retrieves the matches from searching a string using a chain of regexes that successively search\n * within previous matches. The provided `chain` array can contain regexes and or objects with\n * `regex` and `backref` properties. When a backreference is specified, the named or numbered\n * backreference is passed forward to the next regex or returned.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {Array} chain Regexes that each search for matches within preceding results.\n * @returns {Array} Matches by the last regex in the chain, or an empty array.\n * @example\n *\n * // Basic usage; matches numbers within <b> tags\n * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [\n *   XRegExp('(?is)<b>.*?</b>'),\n *   /\\d+/\n * ]);\n * // -> ['2', '4', '56']\n *\n * // Passing forward and returning specific backreferences\n * html = '<a href=\"http://xregexp.com/api/\">XRegExp</a>\\\n *         <a href=\"http://www.google.com/\">Google</a>';\n * XRegExp.matchChain(html, [\n *   {regex: /<a href=\"([^\"]+)\">/i, backref: 1},\n *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}\n * ]);\n * // -> ['xregexp.com', 'www.google.com']\n */\nXRegExp.matchChain = function (str, chain) {\n    return function recurseChain(values, level) {\n        var item = chain[level].regex ? chain[level] : { regex: chain[level] };\n        var matches = [];\n\n        function addMatch(match) {\n            if (item.backref) {\n                // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the\n                // `undefined`s for backreferences to nonparticipating capturing groups. In such\n                // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw\n                // the exception, so also check if the backreference is a number that is within the\n                // bounds of the array.\n                if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) {\n                    throw new ReferenceError('Backreference to undefined group: ' + item.backref);\n                }\n\n                matches.push(match[item.backref] || '');\n            } else {\n                matches.push(match[0]);\n            }\n        }\n\n        for (var i = 0; i < values.length; ++i) {\n            XRegExp.forEach(values[i], item.regex, addMatch);\n        }\n\n        return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);\n    }([str], 0);\n};\n\n/**\n * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string\n * or regex, and the replacement can be a string or a function to be called for each match. To\n * perform a global search and replace, use the optional `scope` argument or include flag g if using\n * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.\n * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser\n * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp|String} search Search pattern to be replaced.\n * @param {String|Function} replacement Replacement string or a function invoked to create it.\n *   Replacement strings can include special replacement syntax:\n *     - $$ - Inserts a literal $ character.\n *     - $&, $0 - Inserts the matched substring.\n *     - $` - Inserts the string that precedes the matched substring (left context).\n *     - $' - Inserts the string that follows the matched substring (right context).\n *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts\n *       backreference n/nn.\n *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing\n *       group, inserts backreference n.\n *   Replacement functions are invoked with three or more arguments:\n *     - The matched substring (corresponds to $& above). Named backreferences are accessible as\n *       properties of this first argument.\n *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).\n *     - The zero-based index of the match within the total search string.\n *     - The total string being searched.\n * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not\n *   explicitly specified and using a regex with flag g, `scope` is 'all'.\n * @returns {String} New string with one or all matches replaced.\n * @example\n *\n * // Regex search, using named backreferences in replacement string\n * const name = XRegExp('(?<first>\\\\w+) (?<last>\\\\w+)');\n * XRegExp.replace('John Smith', name, '$<last>, $<first>');\n * // -> 'Smith, John'\n *\n * // Regex search, using named backreferences in replacement function\n * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);\n * // -> 'Smith, John'\n *\n * // String search, with replace-all\n * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');\n * // -> 'XRegExp builds XRegExps'\n */\nXRegExp.replace = function (str, search, replacement, scope) {\n    var isRegex = XRegExp.isRegExp(search);\n    var global = search.global && scope !== 'one' || scope === 'all';\n    var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';\n    var s2 = search;\n\n    if (isRegex) {\n        search[REGEX_DATA] = search[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s\n        // `lastIndex` isn't updated *during* replacement iterations\n        s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {\n            addG: !!global,\n            removeG: scope === 'one',\n            isInternalOnly: true\n        }));\n    } else if (global) {\n        s2 = new RegExp(XRegExp.escape(String(search)), 'g');\n    }\n\n    // Fixed `replace` required for named backreferences, etc.\n    var result = fixed.replace.call(toObject(str), s2, replacement);\n\n    if (isRegex && search.global) {\n        // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n        search.lastIndex = 0;\n    }\n\n    return result;\n};\n\n/**\n * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an\n * array of replacement details. Later replacements operate on the output of earlier replacements.\n * Replacement details are accepted as an array with a regex or string to search for, the\n * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp\n * replacement text syntax, which supports named backreference properties via `${name}` or\n * `$<name>`.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {Array} replacements Array of replacement detail arrays.\n * @returns {String} New string with all replacements.\n * @example\n *\n * str = XRegExp.replaceEach(str, [\n *   [XRegExp('(?<name>a)'), 'z${name}'],\n *   [/b/gi, 'y'],\n *   [/c/g, 'x', 'one'], // scope 'one' overrides /g\n *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g\n *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings\n *   [/f/g, ($0) => $0.toUpperCase()]\n * ]);\n */\nXRegExp.replaceEach = function (str, replacements) {\n    var i = void 0;\n    var r = void 0;\n\n    for (i = 0; i < replacements.length; ++i) {\n        r = replacements[i];\n        str = XRegExp.replace(str, r[0], r[1], r[2]);\n    }\n\n    return str;\n};\n\n/**\n * Splits a string into an array of strings using a regex or string separator. Matches of the\n * separator are not included in the result array. However, if `separator` is a regex that contains\n * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n * cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to split.\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {Array} Array of substrings.\n * @example\n *\n * // Basic use\n * XRegExp.split('a b c', ' ');\n * // -> ['a', 'b', 'c']\n *\n * // With limit\n * XRegExp.split('a b c', ' ', 2);\n * // -> ['a', 'b']\n *\n * // Backreferences in result array\n * XRegExp.split('..word1..', /([a-z]+)(\\d+)/i);\n * // -> ['..', 'word', '1', '..']\n */\nXRegExp.split = function (str, separator, limit) {\n    return fixed.split.call(toObject(str), separator, limit);\n};\n\n/**\n * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and\n * `sticky` arguments specify the search start position, and whether the match must start at the\n * specified position only. The `lastIndex` property of the provided regex is not used, but is\n * updated for compatibility. Also fixes browser bugs compared to the native\n * `RegExp.prototype.test` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Number} [pos=0] Zero-based index at which to start the search.\n * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n *   only. The string `'sticky'` is accepted as an alternative to `true`.\n * @returns {Boolean} Whether the regex matched the provided value.\n * @example\n *\n * // Basic use\n * XRegExp.test('abc', /c/); // -> true\n *\n * // With pos and sticky\n * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false\n * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true\n */\n// Do this the easy way :-)\nXRegExp.test = function (str, regex, pos, sticky) {\n    return !!XRegExp.exec(str, regex, pos, sticky);\n};\n\n/**\n * Uninstalls optional features according to the specified options. All optional features start out\n * uninstalled, so this is used to undo the actions of `XRegExp.install`.\n *\n * @memberOf XRegExp\n * @param {Object|String} options Options object or string.\n * @example\n *\n * // With an options object\n * XRegExp.uninstall({\n *   // Disables support for astral code points in Unicode addons\n *   astral: true\n * });\n *\n * // With an options string\n * XRegExp.uninstall('astral');\n */\nXRegExp.uninstall = function (options) {\n    options = prepareOptions(options);\n\n    if (features.astral && options.astral) {\n        setAstral(false);\n    }\n};\n\n/**\n * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as\n * regex objects or strings. Metacharacters are escaped in patterns provided as strings.\n * Backreferences in provided regex objects are automatically renumbered to work correctly within\n * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the\n * `flags` argument.\n *\n * @memberOf XRegExp\n * @param {Array} patterns Regexes and strings to combine.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @param {Object} [options] Options object with optional properties:\n *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.\n * @returns {RegExp} Union of the provided regexes and strings.\n * @example\n *\n * XRegExp.union(['a+b*c', /(dogs)\\1/, /(cats)\\1/], 'i');\n * // -> /a\\+b\\*c|(dogs)\\1|(cats)\\2/i\n *\n * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});\n * // -> /manbearpig/i\n */\nXRegExp.union = function (patterns, flags, options) {\n    options = options || {};\n    var conjunction = options.conjunction || 'or';\n    var numCaptures = 0;\n    var numPriorCaptures = void 0;\n    var captureNames = void 0;\n\n    function rewrite(match, paren, backref) {\n        var name = captureNames[numCaptures - numPriorCaptures];\n\n        // Capturing group\n        if (paren) {\n            ++numCaptures;\n            // If the current capture has a name, preserve the name\n            if (name) {\n                return '(?<' + name + '>';\n            }\n            // Backreference\n        } else if (backref) {\n            // Rewrite the backreference\n            return '\\\\' + (+backref + numPriorCaptures);\n        }\n\n        return match;\n    }\n\n    if (!(isType(patterns, 'Array') && patterns.length)) {\n        throw new TypeError('Must provide a nonempty array of patterns to merge');\n    }\n\n    var parts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n    var output = [];\n    var pattern = void 0;\n    for (var i = 0; i < patterns.length; ++i) {\n        pattern = patterns[i];\n\n        if (XRegExp.isRegExp(pattern)) {\n            numPriorCaptures = numCaptures;\n            captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || [];\n\n            // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are\n            // independently valid; helps keep this simple. Named captures are put back\n            output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));\n        } else {\n            output.push(XRegExp.escape(pattern));\n        }\n    }\n\n    var separator = conjunction === 'none' ? '' : '|';\n    return XRegExp(output.join(separator), flags);\n};\n\n// ==--------------------------==\n// Fixed/extended native methods\n// ==--------------------------==\n\n/**\n * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.\n *\n * @memberOf RegExp\n * @param {String} str String to search.\n * @returns {Array} Match array with named backreference properties, or `null`.\n */\nfixed.exec = function (str) {\n    var origLastIndex = this.lastIndex;\n    var match = nativ.exec.apply(this, arguments);\n\n    if (match) {\n        // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing\n        // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9\n        // in standards mode follows the spec.\n        if (!correctExecNpcg && match.length > 1 && match.indexOf('') !== -1) {\n            var r2 = copyRegex(this, {\n                removeG: true,\n                isInternalOnly: true\n            });\n            // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n            // matching due to characters outside the match\n            nativ.replace.call(String(str).slice(match.index), r2, function () {\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                    args[_key] = arguments[_key];\n                }\n\n                var len = args.length;\n                // Skip index 0 and the last 2\n                for (var i = 1; i < len - 2; ++i) {\n                    if (args[i] === undefined) {\n                        match[i] = undefined;\n                    }\n                }\n            });\n        }\n\n        // Attach named capture properties\n        if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {\n            // Skip index 0\n            for (var i = 1; i < match.length; ++i) {\n                var name = this[REGEX_DATA].captureNames[i - 1];\n                if (name) {\n                    match[name] = match[i];\n                }\n            }\n        }\n\n        // Fix browsers that increment `lastIndex` after zero-length matches\n        if (this.global && !match[0].length && this.lastIndex > match.index) {\n            this.lastIndex = match.index;\n        }\n    }\n\n    if (!this.global) {\n        // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n        this.lastIndex = origLastIndex;\n    }\n\n    return match;\n};\n\n/**\n * Fixes browser bugs in the native `RegExp.prototype.test`.\n *\n * @memberOf RegExp\n * @param {String} str String to search.\n * @returns {Boolean} Whether the regex matched the provided value.\n */\nfixed.test = function (str) {\n    // Do this the easy way :-)\n    return !!fixed.exec.call(this, str);\n};\n\n/**\n * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n * bugs in the native `String.prototype.match`.\n *\n * @memberOf String\n * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.\n * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,\n *   the result of calling `regex.exec(this)`.\n */\nfixed.match = function (regex) {\n    if (!XRegExp.isRegExp(regex)) {\n        // Use the native `RegExp` rather than `XRegExp`\n        regex = new RegExp(regex);\n    } else if (regex.global) {\n        var result = nativ.match.apply(this, arguments);\n        // Fixes IE bug\n        regex.lastIndex = 0;\n\n        return result;\n    }\n\n    return fixed.exec.call(regex, toObject(this));\n};\n\n/**\n * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement\n * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also\n * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex\n * search value, and the value of a replacement regex's `lastIndex` property during replacement\n * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third\n * (`flags`) argument. Use via `XRegExp.replace`.\n *\n * @memberOf String\n * @param {RegExp|String} search Search pattern to be replaced.\n * @param {String|Function} replacement Replacement string or a function invoked to create it.\n * @returns {String} New string with one or all matches replaced.\n */\nfixed.replace = function (search, replacement) {\n    var isRegex = XRegExp.isRegExp(search);\n    var origLastIndex = void 0;\n    var captureNames = void 0;\n    var result = void 0;\n\n    if (isRegex) {\n        if (search[REGEX_DATA]) {\n            captureNames = search[REGEX_DATA].captureNames;\n        }\n        // Only needed if `search` is nonglobal\n        origLastIndex = search.lastIndex;\n    } else {\n        search += ''; // Type-convert\n    }\n\n    // Don't use `typeof`; some older browsers return 'function' for regex objects\n    if (isType(replacement, 'Function')) {\n        // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement\n        // functions isn't type-converted to a string\n        result = nativ.replace.call(String(this), search, function () {\n            for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                args[_key2] = arguments[_key2];\n            }\n\n            if (captureNames) {\n                // Change the `args[0]` string primitive to a `String` object that can store\n                // properties. This really does need to use `String` as a constructor\n                args[0] = new String(args[0]);\n                // Store named backreferences on the first argument\n                for (var i = 0; i < captureNames.length; ++i) {\n                    if (captureNames[i]) {\n                        args[0][captureNames[i]] = args[i + 1];\n                    }\n                }\n            }\n            // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari\n            // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)\n            if (isRegex && search.global) {\n                search.lastIndex = args[args.length - 2] + args[0].length;\n            }\n            // ES6 specs the context for replacement functions as `undefined`\n            return replacement.apply(undefined, args);\n        });\n    } else {\n        // Ensure that the last value of `args` will be a string when given nonstring `this`,\n        // while still throwing on null or undefined context\n        result = nativ.replace.call(this == null ? this : String(this), search, function () {\n            for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n                args[_key3] = arguments[_key3];\n            }\n\n            return nativ.replace.call(String(replacement), replacementToken, replacer);\n\n            function replacer($0, bracketed, angled, dollarToken) {\n                bracketed = bracketed || angled;\n                // Named or numbered backreference with curly or angled braces\n                if (bracketed) {\n                    // XRegExp behavior for `${n}` or `$<n>`:\n                    // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the\n                    //    entire match. Any number of leading zeros may be used.\n                    // 2. Backreference to named capture `n`, if it exists and is not an integer\n                    //    overridden by numbered capture. In practice, this does not overlap with\n                    //    numbered capture since XRegExp does not allow named capture to use a bare\n                    //    integer as the name.\n                    // 3. If the name or number does not refer to an existing capturing group, it's\n                    //    an error.\n                    var n = +bracketed; // Type-convert; drop leading zeros\n                    if (n <= args.length - 3) {\n                        return args[n] || '';\n                    }\n                    // Groups with the same name is an error, else would need `lastIndexOf`\n                    n = captureNames ? captureNames.indexOf(bracketed) : -1;\n                    if (n < 0) {\n                        throw new SyntaxError('Backreference to undefined group ' + $0);\n                    }\n                    return args[n + 1] || '';\n                }\n                // Else, special variable or numbered backreference without curly braces\n                if (dollarToken === '$') {\n                    // $$\n                    return '$';\n                }\n                if (dollarToken === '&' || +dollarToken === 0) {\n                    // $&, $0 (not followed by 1-9), $00\n                    return args[0];\n                }\n                if (dollarToken === '`') {\n                    // $` (left context)\n                    return args[args.length - 1].slice(0, args[args.length - 2]);\n                }\n                if (dollarToken === \"'\") {\n                    // $' (right context)\n                    return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                }\n                // Else, numbered backreference without braces\n                dollarToken = +dollarToken; // Type-convert; drop leading zero\n                // XRegExp behavior for `$n` and `$nn`:\n                // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.\n                // - `$1` is an error if no capturing groups.\n                // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`\n                //   instead.\n                // - `$01` is `$1` if at least one capturing group, else it's an error.\n                // - `$0` (not followed by 1-9) and `$00` are the entire match.\n                // Native behavior, for comparison:\n                // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.\n                // - `$1` is a literal `$1` if no capturing groups.\n                // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.\n                // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.\n                // - `$0` is a literal `$0`.\n                if (!isNaN(dollarToken)) {\n                    if (dollarToken > args.length - 3) {\n                        throw new SyntaxError('Backreference to undefined group ' + $0);\n                    }\n                    return args[dollarToken] || '';\n                }\n                // `$` followed by an unsupported char is an error, unlike native JS\n                throw new SyntaxError('Invalid token ' + $0);\n            }\n        });\n    }\n\n    if (isRegex) {\n        if (search.global) {\n            // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n            search.lastIndex = 0;\n        } else {\n            // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n            search.lastIndex = origLastIndex;\n        }\n    }\n\n    return result;\n};\n\n/**\n * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.\n *\n * @memberOf String\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {Array} Array of substrings.\n */\nfixed.split = function (separator, limit) {\n    if (!XRegExp.isRegExp(separator)) {\n        // Browsers handle nonregex split correctly, so use the faster native method\n        return nativ.split.apply(this, arguments);\n    }\n\n    var str = String(this);\n    var output = [];\n    var origLastIndex = separator.lastIndex;\n    var lastLastIndex = 0;\n    var lastLength = void 0;\n\n    // Values for `limit`, per the spec:\n    // If undefined: pow(2,32) - 1\n    // If 0, Infinity, or NaN: 0\n    // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);\n    // If negative number: pow(2,32) - floor(abs(limit))\n    // If other: Type-convert, then use the above rules\n    // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless\n    // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+\n    limit = (limit === undefined ? -1 : limit) >>> 0;\n\n    XRegExp.forEach(str, separator, function (match) {\n        // This condition is not the same as `if (match[0].length)`\n        if (match.index + match[0].length > lastLastIndex) {\n            output.push(str.slice(lastLastIndex, match.index));\n            if (match.length > 1 && match.index < str.length) {\n                Array.prototype.push.apply(output, match.slice(1));\n            }\n            lastLength = match[0].length;\n            lastLastIndex = match.index + lastLength;\n        }\n    });\n\n    if (lastLastIndex === str.length) {\n        if (!nativ.test.call(separator, '') || lastLength) {\n            output.push('');\n        }\n    } else {\n        output.push(str.slice(lastLastIndex));\n    }\n\n    separator.lastIndex = origLastIndex;\n    return output.length > limit ? output.slice(0, limit) : output;\n};\n\n// ==--------------------------==\n// Built-in syntax/flag tokens\n// ==--------------------------==\n\n/*\n * Letter escapes that natively match literal characters: `\\a`, `\\A`, etc. These should be\n * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser\n * consistency and to reserve their syntax, but lets them be superseded by addons.\n */\nXRegExp.addToken(/\\\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|x(?![\\dA-Fa-f]{2}))/, function (match, scope) {\n    // \\B is allowed in default scope only\n    if (match[1] === 'B' && scope === defaultScope) {\n        return match[0];\n    }\n    throw new SyntaxError('Invalid escape ' + match[0]);\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Unicode code point escape with curly braces: `\\u{N..}`. `N..` is any one or more digit\n * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag\n * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to\n * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior\n * if you follow a `\\u{N..}` token that references a code point above U+FFFF with a quantifier, or\n * if you use the same in a character class.\n */\nXRegExp.addToken(/\\\\u{([\\dA-Fa-f]+)}/, function (match, scope, flags) {\n    var code = dec(match[1]);\n    if (code > 0x10FFFF) {\n        throw new SyntaxError('Invalid Unicode code point ' + match[0]);\n    }\n    if (code <= 0xFFFF) {\n        // Converting to \\uNNNN avoids needing to escape the literal character and keep it\n        // separate from preceding tokens\n        return '\\\\u' + pad4(hex(code));\n    }\n    // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling\n    if (hasNativeU && flags.indexOf('u') !== -1) {\n        return match[0];\n    }\n    throw new SyntaxError('Cannot use Unicode code point above \\\\u{FFFF} without flag u');\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.\n * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because\n * character class endings can't be determined.\n */\nXRegExp.addToken(/\\[(\\^?)\\]/,\n// For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n// (?!) should work like \\b\\B, but is unreliable in some versions of Firefox\n/* eslint-disable no-confusing-arrow */\nfunction (match) {\n    return match[1] ? '[\\\\s\\\\S]' : '\\\\b\\\\B';\n},\n/* eslint-enable no-confusing-arrow */\n{ leadChar: '[' });\n\n/*\n * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in\n * free-spacing mode (flag x).\n */\nXRegExp.addToken(/\\(\\?#[^)]*\\)/, getContextualTokenSeparator, { leadChar: '(' });\n\n/*\n * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.\n */\nXRegExp.addToken(/\\s+|#[^\\n]*\\n?/, getContextualTokenSeparator, { flag: 'x' });\n\n/*\n * Dot, in dotall mode (aka singleline mode, flag s) only.\n */\nXRegExp.addToken(/\\./, function () {\n    return '[\\\\s\\\\S]';\n}, {\n    flag: 's',\n    leadChar: '.'\n});\n\n/*\n * Named backreference: `\\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,\n * and $ only. Also allows numbered backreferences as `\\k<n>`.\n */\nXRegExp.addToken(/\\\\k<([\\w$]+)>/, function (match) {\n    // Groups with the same name is an error, else would need `lastIndexOf`\n    var index = isNaN(match[1]) ? this.captureNames.indexOf(match[1]) + 1 : +match[1];\n    var endIndex = match.index + match[0].length;\n    if (!index || index > this.captureNames.length) {\n        throw new SyntaxError('Backreference to undefined group ' + match[0]);\n    }\n    // Keep backreferences separate from subsequent literal numbers. This avoids e.g.\n    // inadvertedly changing `(?<n>)\\k<n>1` to `()\\11`.\n    return '\\\\' + index + (endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');\n}, { leadChar: '\\\\' });\n\n/*\n * Numbered backreference or octal, plus any following digits: `\\0`, `\\11`, etc. Octals except `\\0`\n * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches\n * are returned unaltered. IE < 9 doesn't support backreferences above `\\99` in regex syntax.\n */\nXRegExp.addToken(/\\\\(\\d+)/, function (match, scope) {\n    if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {\n        throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]);\n    }\n    return match[0];\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the\n * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style\n * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively\n * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to\n * Python-style named capture as octals.\n */\nXRegExp.addToken(/\\(\\?P?<([\\w$]+)>/, function (match) {\n    // Disallow bare integers as names because named backreferences are added to match arrays\n    // and therefore numeric properties may lead to incorrect lookups\n    if (!isNaN(match[1])) {\n        throw new SyntaxError('Cannot use integer as capture name ' + match[0]);\n    }\n    if (match[1] === 'length' || match[1] === '__proto__') {\n        throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]);\n    }\n    if (this.captureNames.indexOf(match[1]) !== -1) {\n        throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]);\n    }\n    this.captureNames.push(match[1]);\n    this.hasNamedCapture = true;\n    return '(';\n}, { leadChar: '(' });\n\n/*\n * Capturing group; match the opening parenthesis only. Required for support of named capturing\n * groups. Also adds explicit capture mode (flag n).\n */\nXRegExp.addToken(/\\((?!\\?)/, function (match, scope, flags) {\n    if (flags.indexOf('n') !== -1) {\n        return '(?:';\n    }\n    this.captureNames.push(null);\n    return '(';\n}, {\n    optionalFlags: 'n',\n    leadChar: '('\n});\n\nexports.default = XRegExp;\nmodule.exports = exports['default'];\n},{}],\"TuVf\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp.build 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2012-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n    var REGEX_DATA = 'xregexp';\n    var subParts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n    var parts = XRegExp.union([/\\({{([\\w$]+)}}\\)|{{([\\w$]+)}}/, subParts], 'g', {\n        conjunction: 'or'\n    });\n\n    /**\n     * Strips a leading `^` and trailing unescaped `$`, if both are present.\n     *\n     * @private\n     * @param {String} pattern Pattern to process.\n     * @returns {String} Pattern with edge anchors removed.\n     */\n    function deanchor(pattern) {\n        // Allow any number of empty noncapturing groups before/after anchors, because regexes\n        // built/generated by XRegExp sometimes include them\n        var leadingAnchor = /^(?:\\(\\?:\\))*\\^/;\n        var trailingAnchor = /\\$(?:\\(\\?:\\))*$/;\n\n        if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) &&\n        // Ensure that the trailing `$` isn't escaped\n        trailingAnchor.test(pattern.replace(/\\\\[\\s\\S]/g, ''))) {\n            return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');\n        }\n\n        return pattern;\n    }\n\n    /**\n     * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.\n     *\n     * @private\n     * @param {String|RegExp} value Value to convert.\n     * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not\n     *   already a regex generated by XRegExp\n     * @returns {RegExp} XRegExp object with XRegExp syntax applied.\n     */\n    function asXRegExp(value, addFlagX) {\n        var flags = addFlagX ? 'x' : '';\n        return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ?\n        // Don't recompile, to preserve capture names\n        value :\n        // Recompile as XRegExp\n        XRegExp(value.source, flags) :\n        // Compile string as XRegExp\n        XRegExp(value, flags);\n    }\n\n    function interpolate(substitution) {\n        return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);\n    }\n\n    function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {\n        subpatterns['subpattern' + subpatternIndex] = interpolated;\n        return subpatterns;\n    }\n\n    function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {\n        var hasSubpattern = subpatternIndex < rawLiterals.length - 1;\n        return raw + (hasSubpattern ? '{{subpattern' + subpatternIndex + '}}' : '');\n    }\n\n    /**\n     * Provides tagged template literals that create regexes with XRegExp syntax and flags. The\n     * provided pattern is handled as a raw string, so backslashes don't need to be escaped.\n     *\n     * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated\n     * patterns are treated as atomic units when quantified, interpolated strings have their special\n     * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated\n     * regexes if both are present, and any backreferences within an interpolated regex are\n     * rewritten to work within the overall pattern.\n     *\n     * @memberOf XRegExp\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.\n     * @example\n     *\n     * const h12 = /1[0-2]|0?[1-9]/;\n     * const h24 = /2[0-3]|[01][0-9]/;\n     * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;\n     * const minutes = /^[0-5][0-9]$/;\n     * // Note that explicitly naming the 'minutes' group is required for named backreferences\n     * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;\n     * time.test('10:59'); // -> true\n     * XRegExp.exec('10:59', time).minutes; // -> '59'\n     */\n    XRegExp.tag = function (flags) {\n        return function (literals) {\n            for (var _len = arguments.length, substitutions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                substitutions[_key - 1] = arguments[_key];\n            }\n\n            var subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});\n            var pattern = literals.raw.map(embedSubpatternAfter).join('');\n            return XRegExp.build(pattern, subpatterns, flags);\n        };\n    };\n\n    /**\n     * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in\n     * the outer pattern and provided subpatterns are automatically renumbered to work correctly.\n     * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.\n     *\n     * @memberOf XRegExp\n     * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows\n     *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within\n     *   character classes.\n     * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A\n     *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {RegExp} Regex with interpolated subpatterns.\n     * @example\n     *\n     * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {\n     *   hours: XRegExp.build('{{h12}} : | {{h24}}', {\n     *     h12: /1[0-2]|0?[1-9]/,\n     *     h24: /2[0-3]|[01][0-9]/\n     *   }, 'x'),\n     *   minutes: /^[0-5][0-9]$/\n     * });\n     * time.test('10:59'); // -> true\n     * XRegExp.exec('10:59', time).minutes; // -> '59'\n     */\n    XRegExp.build = function (pattern, subs, flags) {\n        flags = flags || '';\n        // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how\n        // some browsers convert `RegExp('\\n')` to a regex that contains the literal characters `\\`\n        // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.\n        var addFlagX = flags.indexOf('x') !== -1;\n        var inlineFlags = /^\\(\\?([\\w$]+)\\)/.exec(pattern);\n        // Add flags within a leading mode modifier to the overall pattern's flags\n        if (inlineFlags) {\n            flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);\n        }\n\n        var data = {};\n        for (var p in subs) {\n            if (subs.hasOwnProperty(p)) {\n                // Passing to XRegExp enables extended syntax and ensures independent validity,\n                // lest an unescaped `(`, `)`, `[`, or trailing `\\` breaks the `(?:)` wrapper. For\n                // subpatterns provided as native regexes, it dies on octals and adds the property\n                // used to hold extended regex instance data, for simplicity.\n                var sub = asXRegExp(subs[p], addFlagX);\n                data[p] = {\n                    // Deanchoring allows embedding independently useful anchored regexes. If you\n                    // really need to keep your anchors, double them (i.e., `^^...$$`).\n                    pattern: deanchor(sub.source),\n                    names: sub[REGEX_DATA].captureNames || []\n                };\n            }\n        }\n\n        // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;\n        // helps keep this simple. Named captures will be put back.\n        var patternAsRegex = asXRegExp(pattern, addFlagX);\n\n        // 'Caps' is short for 'captures'\n        var numCaps = 0;\n        var numPriorCaps = void 0;\n        var numOuterCaps = 0;\n        var outerCapsMap = [0];\n        var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];\n        var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {\n            var subName = $1 || $2;\n            var capName = void 0;\n            var intro = void 0;\n            var localCapIndex = void 0;\n            // Named subpattern\n            if (subName) {\n                if (!data.hasOwnProperty(subName)) {\n                    throw new ReferenceError('Undefined property ' + $0);\n                }\n                // Named subpattern was wrapped in a capturing group\n                if ($1) {\n                    capName = outerCapNames[numOuterCaps];\n                    outerCapsMap[++numOuterCaps] = ++numCaps;\n                    // If it's a named group, preserve the name. Otherwise, use the subpattern name\n                    // as the capture name\n                    intro = '(?<' + (capName || subName) + '>';\n                } else {\n                    intro = '(?:';\n                }\n                numPriorCaps = numCaps;\n                var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {\n                    // Capturing group\n                    if (paren) {\n                        capName = data[subName].names[numCaps - numPriorCaps];\n                        ++numCaps;\n                        // If the current capture has a name, preserve the name\n                        if (capName) {\n                            return '(?<' + capName + '>';\n                        }\n                        // Backreference\n                    } else if (backref) {\n                        localCapIndex = +backref - 1;\n                        // Rewrite the backreference\n                        return data[subName].names[localCapIndex] ?\n                        // Need to preserve the backreference name in case using flag `n`\n                        '\\\\k<' + data[subName].names[localCapIndex] + '>' : '\\\\' + (+backref + numPriorCaps);\n                    }\n                    return match;\n                });\n                return '' + intro + rewrittenSubpattern + ')';\n            }\n            // Capturing group\n            if ($3) {\n                capName = outerCapNames[numOuterCaps];\n                outerCapsMap[++numOuterCaps] = ++numCaps;\n                // If the current capture has a name, preserve the name\n                if (capName) {\n                    return '(?<' + capName + '>';\n                }\n                // Backreference\n            } else if ($4) {\n                localCapIndex = +$4 - 1;\n                // Rewrite the backreference\n                return outerCapNames[localCapIndex] ?\n                // Need to preserve the backreference name in case using flag `n`\n                '\\\\k<' + outerCapNames[localCapIndex] + '>' : '\\\\' + outerCapsMap[+$4];\n            }\n            return $0;\n        });\n\n        return XRegExp(output, flags);\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"rFFh\":[function(require,module,exports) {\nvar global = arguments[3];\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp.matchRecursive 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2009-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Returns a match detail object composed of the provided values.\n     *\n     * @private\n     */\n    function row(name, value, start, end) {\n        return {\n            name: name,\n            value: value,\n            start: start,\n            end: end\n        };\n    }\n\n    /**\n     * Returns an array of match strings between outermost left and right delimiters, or an array of\n     * objects with detailed match parts and position data. An error is thrown if delimiters are\n     * unbalanced within the data.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {String} left Left delimiter as an XRegExp pattern.\n     * @param {String} right Right delimiter as an XRegExp pattern.\n     * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.\n     * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.\n     * @returns {Array} Array of matches, or an empty array.\n     * @example\n     *\n     * // Basic usage\n     * let str = '(t((e))s)t()(ing)';\n     * XRegExp.matchRecursive(str, '\\\\(', '\\\\)', 'g');\n     * // -> ['t((e))s', '', 'ing']\n     *\n     * // Extended information mode with valueNames\n     * str = 'Here is <div> <div>an</div></div> example';\n     * XRegExp.matchRecursive(str, '<div\\\\s*>', '</div>', 'gi', {\n     *   valueNames: ['between', 'left', 'match', 'right']\n     * });\n     * // -> [\n     * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},\n     * // {name: 'left',    value: '<div>',          start: 8,  end: 13},\n     * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},\n     * // {name: 'right',   value: '</div>',         start: 27, end: 33},\n     * // {name: 'between', value: ' example',       start: 33, end: 41}\n     * // ]\n     *\n     * // Omitting unneeded parts with null valueNames, and using escapeChar\n     * str = '...{1}.\\\\{{function(x,y){return {y:x}}}';\n     * XRegExp.matchRecursive(str, '{', '}', 'g', {\n     *   valueNames: ['literal', null, 'value', null],\n     *   escapeChar: '\\\\'\n     * });\n     * // -> [\n     * // {name: 'literal', value: '...',  start: 0, end: 3},\n     * // {name: 'value',   value: '1',    start: 4, end: 5},\n     * // {name: 'literal', value: '.\\\\{', start: 6, end: 9},\n     * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}\n     * // ]\n     *\n     * // Sticky mode via flag y\n     * str = '<1><<<2>>><3>4<5>';\n     * XRegExp.matchRecursive(str, '<', '>', 'gy');\n     * // -> ['1', '<<2>>', '3']\n     */\n    XRegExp.matchRecursive = function (str, left, right, flags, options) {\n        flags = flags || '';\n        options = options || {};\n        var global = flags.indexOf('g') !== -1;\n        var sticky = flags.indexOf('y') !== -1;\n        // Flag `y` is controlled internally\n        var basicFlags = flags.replace(/y/g, '');\n        var escapeChar = options.escapeChar;\n        var vN = options.valueNames;\n        var output = [];\n        var openTokens = 0;\n        var delimStart = 0;\n        var delimEnd = 0;\n        var lastOuterEnd = 0;\n        var outerStart = void 0;\n        var innerStart = void 0;\n        var leftMatch = void 0;\n        var rightMatch = void 0;\n        var esc = void 0;\n        left = XRegExp(left, basicFlags);\n        right = XRegExp(right, basicFlags);\n\n        if (escapeChar) {\n            if (escapeChar.length > 1) {\n                throw new Error('Cannot use more than one escape character');\n            }\n            escapeChar = XRegExp.escape(escapeChar);\n            // Example of concatenated `esc` regex:\n            // `escapeChar`: '%'\n            // `left`: '<'\n            // `right`: '>'\n            // Regex is: /(?:%[\\S\\s]|(?:(?!<|>)[^%])+)+/\n            esc = new RegExp('(?:' + escapeChar + '[\\\\S\\\\s]|(?:(?!' +\n            // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.\n            // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax\n            // transformation resulting from those flags was already applied to `left` and\n            // `right` when they were passed through the XRegExp constructor above.\n            XRegExp.union([left, right], '', { conjunction: 'or' }).source + ')[^' + escapeChar + '])+)+',\n            // Flags `gy` not needed here\n            flags.replace(/[^imu]+/g, ''));\n        }\n\n        while (true) {\n            // If using an escape character, advance to the delimiter's next starting position,\n            // skipping any escaped characters in between\n            if (escapeChar) {\n                delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;\n            }\n            leftMatch = XRegExp.exec(str, left, delimEnd);\n            rightMatch = XRegExp.exec(str, right, delimEnd);\n            // Keep the leftmost match only\n            if (leftMatch && rightMatch) {\n                if (leftMatch.index <= rightMatch.index) {\n                    rightMatch = null;\n                } else {\n                    leftMatch = null;\n                }\n            }\n            // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):\n            // LM | RM | OT | Result\n            // 1  | 0  | 1  | loop\n            // 1  | 0  | 0  | loop\n            // 0  | 1  | 1  | loop\n            // 0  | 1  | 0  | throw\n            // 0  | 0  | 1  | throw\n            // 0  | 0  | 0  | break\n            // The paths above don't include the sticky mode special case. The loop ends after the\n            // first completed match if not `global`.\n            if (leftMatch || rightMatch) {\n                delimStart = (leftMatch || rightMatch).index;\n                delimEnd = delimStart + (leftMatch || rightMatch)[0].length;\n            } else if (!openTokens) {\n                break;\n            }\n            if (sticky && !openTokens && delimStart > lastOuterEnd) {\n                break;\n            }\n            if (leftMatch) {\n                if (!openTokens) {\n                    outerStart = delimStart;\n                    innerStart = delimEnd;\n                }\n                ++openTokens;\n            } else if (rightMatch && openTokens) {\n                if (! --openTokens) {\n                    if (vN) {\n                        if (vN[0] && outerStart > lastOuterEnd) {\n                            output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));\n                        }\n                        if (vN[1]) {\n                            output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));\n                        }\n                        if (vN[2]) {\n                            output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));\n                        }\n                        if (vN[3]) {\n                            output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));\n                        }\n                    } else {\n                        output.push(str.slice(innerStart, delimStart));\n                    }\n                    lastOuterEnd = delimEnd;\n                    if (!global) {\n                        break;\n                    }\n                }\n            } else {\n                throw new Error('Unbalanced delimiter found in string');\n            }\n            // If the delimiter matched an empty string, avoid an infinite loop\n            if (delimStart === delimEnd) {\n                ++delimEnd;\n            }\n        }\n\n        if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {\n            output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));\n        }\n\n        return output;\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"GjMy\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Base 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2008-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds base support for Unicode matching:\n     * - Adds syntax `\\p{..}` for matching Unicode tokens. Tokens can be inverted using `\\P{..}` or\n     *   `\\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the\n     *   braces for token names that are a single letter (e.g. `\\pL` or `PL`).\n     * - Adds flag A (astral), which enables 21-bit Unicode support.\n     * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.\n     *\n     * Unicode Base relies on externally provided Unicode character data. Official addons are\n     * available to provide data for Unicode categories, scripts, blocks, and properties.\n     *\n     * @requires XRegExp\n     */\n\n    // ==--------------------------==\n    // Private stuff\n    // ==--------------------------==\n\n    // Storage for Unicode data\n    var unicode = {};\n\n    // Reuse utils\n    var dec = XRegExp._dec;\n    var hex = XRegExp._hex;\n    var pad4 = XRegExp._pad4;\n\n    // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed\n    function normalize(name) {\n        return name.replace(/[- _]+/g, '').toLowerCase();\n    }\n\n    // Gets the decimal code of a literal code unit, \\xHH, \\uHHHH, or a backslash-escaped literal\n    function charCode(chr) {\n        var esc = /^\\\\[xu](.+)/.exec(chr);\n        return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\\\' ? 1 : 0);\n    }\n\n    // Inverts a list of ordered BMP characters and ranges\n    function invertBmp(range) {\n        var output = '';\n        var lastEnd = -1;\n\n        XRegExp.forEach(range, /(\\\\x..|\\\\u....|\\\\?[\\s\\S])(?:-(\\\\x..|\\\\u....|\\\\?[\\s\\S]))?/, function (m) {\n            var start = charCode(m[1]);\n            if (start > lastEnd + 1) {\n                output += '\\\\u' + pad4(hex(lastEnd + 1));\n                if (start > lastEnd + 2) {\n                    output += '-\\\\u' + pad4(hex(start - 1));\n                }\n            }\n            lastEnd = charCode(m[2] || m[1]);\n        });\n\n        if (lastEnd < 0xFFFF) {\n            output += '\\\\u' + pad4(hex(lastEnd + 1));\n            if (lastEnd < 0xFFFE) {\n                output += '-\\\\uFFFF';\n            }\n        }\n\n        return output;\n    }\n\n    // Generates an inverted BMP range on first use\n    function cacheInvertedBmp(slug) {\n        var prop = 'b!';\n        return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));\n    }\n\n    // Combines and optionally negates BMP and astral data\n    function buildAstral(slug, isNegated) {\n        var item = unicode[slug];\n        var combined = '';\n\n        if (item.bmp && !item.isBmpLast) {\n            combined = '[' + item.bmp + ']' + (item.astral ? '|' : '');\n        }\n        if (item.astral) {\n            combined += item.astral;\n        }\n        if (item.isBmpLast && item.bmp) {\n            combined += (item.astral ? '|' : '') + '[' + item.bmp + ']';\n        }\n\n        // Astral Unicode tokens always match a code point, never a code unit\n        return isNegated ? '(?:(?!' + combined + ')(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\0-\\uFFFF]))' : '(?:' + combined + ')';\n    }\n\n    // Builds a complete astral pattern on first use\n    function cacheAstral(slug, isNegated) {\n        var prop = isNegated ? 'a!' : 'a=';\n        return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));\n    }\n\n    // ==--------------------------==\n    // Core functionality\n    // ==--------------------------==\n\n    /*\n     * Add astral mode (flag A) and Unicode token syntax: `\\p{..}`, `\\P{..}`, `\\p{^..}`, `\\pC`.\n     */\n    XRegExp.addToken(\n    // Use `*` instead of `+` to avoid capturing `^` as the token name in `\\p{^}`\n    /\\\\([pP])(?:{(\\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {\n        var ERR_DOUBLE_NEG = 'Invalid double negation ';\n        var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';\n        var ERR_UNKNOWN_REF = 'Unicode token missing data ';\n        var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';\n        var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';\n        // Negated via \\P{..} or \\p{^..}\n        var isNegated = match[1] === 'P' || !!match[2];\n        // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A\n        var isAstralMode = flags.indexOf('A') !== -1;\n        // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\\p{}`\n        var slug = normalize(match[4] || match[3]);\n        // Token data object\n        var item = unicode[slug];\n\n        if (match[1] === 'P' && match[2]) {\n            throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);\n        }\n        if (!unicode.hasOwnProperty(slug)) {\n            throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);\n        }\n\n        // Switch to the negated form of the referenced Unicode token\n        if (item.inverseOf) {\n            slug = normalize(item.inverseOf);\n            if (!unicode.hasOwnProperty(slug)) {\n                throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf);\n            }\n            item = unicode[slug];\n            isNegated = !isNegated;\n        }\n\n        if (!(item.bmp || isAstralMode)) {\n            throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);\n        }\n        if (isAstralMode) {\n            if (scope === 'class') {\n                throw new SyntaxError(ERR_ASTRAL_IN_CLASS);\n            }\n\n            return cacheAstral(slug, isNegated);\n        }\n\n        return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : (isNegated ? '[^' : '[') + item.bmp + ']';\n    }, {\n        scope: 'all',\n        optionalFlags: 'A',\n        leadChar: '\\\\'\n    });\n\n    /**\n     * Adds to the list of Unicode tokens that XRegExp regexes can match via `\\p` or `\\P`.\n     *\n     * @memberOf XRegExp\n     * @param {Array} data Objects with named character ranges. Each object may have properties\n     *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are\n     *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If\n     *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,\n     *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are\n     *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and\n     *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan\n     *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and\n     *   `astral` data should be a combination of literal characters and `\\xHH` or `\\uHHHH` escape\n     *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be\n     *   escaped, apart from range-creating hyphens. The `astral` data can additionally use\n     *   character classes and alternation, and should use surrogate pairs to represent astral code\n     *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is\n     *   defined as the exact inverse of another token.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.addUnicodeData([{\n     *   name: 'XDigit',\n     *   alias: 'Hexadecimal',\n     *   bmp: '0-9A-Fa-f'\n     * }]);\n     * XRegExp('\\\\p{XDigit}:\\\\p{Hexadecimal}+').test('0:3D'); // -> true\n     */\n    XRegExp.addUnicodeData = function (data) {\n        var ERR_NO_NAME = 'Unicode token requires name';\n        var ERR_NO_DATA = 'Unicode token has no character data ';\n        var item = void 0;\n\n        for (var i = 0; i < data.length; ++i) {\n            item = data[i];\n            if (!item.name) {\n                throw new Error(ERR_NO_NAME);\n            }\n            if (!(item.inverseOf || item.bmp || item.astral)) {\n                throw new Error(ERR_NO_DATA + item.name);\n            }\n            unicode[normalize(item.name)] = item;\n            if (item.alias) {\n                unicode[normalize(item.alias)] = item;\n            }\n        }\n\n        // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and\n        // flags might now produce different results\n        XRegExp.cache.flush('patterns');\n    };\n\n    /**\n     * @ignore\n     *\n     * Return a reference to the internal Unicode definition structure for the given Unicode\n     * Property if the given name is a legal Unicode Property for use in XRegExp `\\p` or `\\P` regex\n     * constructs.\n     *\n     * @memberOf XRegExp\n     * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),\n     *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode\n     *   Properties and Property Aliases.\n     * @returns {Object} Reference to definition structure when the name matches a Unicode Property.\n     *\n     * @note\n     * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.\n     *\n     * @note\n     * This method is *not* part of the officially documented API and may change or be removed in\n     * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode\n     * structures set up by XRegExp.\n     */\n    XRegExp._getUnicodeProperty = function (name) {\n        var slug = normalize(name);\n        return unicode[slug];\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"yn8j\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Blocks 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,\n     * `\\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and\n     * underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'InAdlam',\n        astral: '\\uD83A[\\uDD00-\\uDD5F]'\n    }, {\n        name: 'InAegean_Numbers',\n        astral: '\\uD800[\\uDD00-\\uDD3F]'\n    }, {\n        name: 'InAhom',\n        astral: '\\uD805[\\uDF00-\\uDF3F]'\n    }, {\n        name: 'InAlchemical_Symbols',\n        astral: '\\uD83D[\\uDF00-\\uDF7F]'\n    }, {\n        name: 'InAlphabetic_Presentation_Forms',\n        bmp: '\\uFB00-\\uFB4F'\n    }, {\n        name: 'InAnatolian_Hieroglyphs',\n        astral: '\\uD811[\\uDC00-\\uDE7F]'\n    }, {\n        name: 'InAncient_Greek_Musical_Notation',\n        astral: '\\uD834[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InAncient_Greek_Numbers',\n        astral: '\\uD800[\\uDD40-\\uDD8F]'\n    }, {\n        name: 'InAncient_Symbols',\n        astral: '\\uD800[\\uDD90-\\uDDCF]'\n    }, {\n        name: 'InArabic',\n        bmp: '\\u0600-\\u06FF'\n    }, {\n        name: 'InArabic_Extended_A',\n        bmp: '\\u08A0-\\u08FF'\n    }, {\n        name: 'InArabic_Mathematical_Alphabetic_Symbols',\n        astral: '\\uD83B[\\uDE00-\\uDEFF]'\n    }, {\n        name: 'InArabic_Presentation_Forms_A',\n        bmp: '\\uFB50-\\uFDFF'\n    }, {\n        name: 'InArabic_Presentation_Forms_B',\n        bmp: '\\uFE70-\\uFEFF'\n    }, {\n        name: 'InArabic_Supplement',\n        bmp: '\\u0750-\\u077F'\n    }, {\n        name: 'InArmenian',\n        bmp: '\\u0530-\\u058F'\n    }, {\n        name: 'InArrows',\n        bmp: '\\u2190-\\u21FF'\n    }, {\n        name: 'InAvestan',\n        astral: '\\uD802[\\uDF00-\\uDF3F]'\n    }, {\n        name: 'InBalinese',\n        bmp: '\\u1B00-\\u1B7F'\n    }, {\n        name: 'InBamum',\n        bmp: '\\uA6A0-\\uA6FF'\n    }, {\n        name: 'InBamum_Supplement',\n        astral: '\\uD81A[\\uDC00-\\uDE3F]'\n    }, {\n        name: 'InBasic_Latin',\n        bmp: '\\0-\\x7F'\n    }, {\n        name: 'InBassa_Vah',\n        astral: '\\uD81A[\\uDED0-\\uDEFF]'\n    }, {\n        name: 'InBatak',\n        bmp: '\\u1BC0-\\u1BFF'\n    }, {\n        name: 'InBengali',\n        bmp: '\\u0980-\\u09FF'\n    }, {\n        name: 'InBhaiksuki',\n        astral: '\\uD807[\\uDC00-\\uDC6F]'\n    }, {\n        name: 'InBlock_Elements',\n        bmp: '\\u2580-\\u259F'\n    }, {\n        name: 'InBopomofo',\n        bmp: '\\u3100-\\u312F'\n    }, {\n        name: 'InBopomofo_Extended',\n        bmp: '\\u31A0-\\u31BF'\n    }, {\n        name: 'InBox_Drawing',\n        bmp: '\\u2500-\\u257F'\n    }, {\n        name: 'InBrahmi',\n        astral: '\\uD804[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InBraille_Patterns',\n        bmp: '\\u2800-\\u28FF'\n    }, {\n        name: 'InBuginese',\n        bmp: '\\u1A00-\\u1A1F'\n    }, {\n        name: 'InBuhid',\n        bmp: '\\u1740-\\u175F'\n    }, {\n        name: 'InByzantine_Musical_Symbols',\n        astral: '\\uD834[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InCJK_Compatibility',\n        bmp: '\\u3300-\\u33FF'\n    }, {\n        name: 'InCJK_Compatibility_Forms',\n        bmp: '\\uFE30-\\uFE4F'\n    }, {\n        name: 'InCJK_Compatibility_Ideographs',\n        bmp: '\\uF900-\\uFAFF'\n    }, {\n        name: 'InCJK_Compatibility_Ideographs_Supplement',\n        astral: '\\uD87E[\\uDC00-\\uDE1F]'\n    }, {\n        name: 'InCJK_Radicals_Supplement',\n        bmp: '\\u2E80-\\u2EFF'\n    }, {\n        name: 'InCJK_Strokes',\n        bmp: '\\u31C0-\\u31EF'\n    }, {\n        name: 'InCJK_Symbols_and_Punctuation',\n        bmp: '\\u3000-\\u303F'\n    }, {\n        name: 'InCJK_Unified_Ideographs',\n        bmp: '\\u4E00-\\u9FFF'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_A',\n        bmp: '\\u3400-\\u4DBF'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_B',\n        astral: '[\\uD840-\\uD868][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDEDF]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_C',\n        astral: '\\uD869[\\uDF00-\\uDFFF]|[\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF3F]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_D',\n        astral: '\\uD86D[\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1F]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_E',\n        astral: '\\uD86E[\\uDC20-\\uDFFF]|[\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD873[\\uDC00-\\uDEAF]'\n    }, {\n        name: 'InCarian',\n        astral: '\\uD800[\\uDEA0-\\uDEDF]'\n    }, {\n        name: 'InCaucasian_Albanian',\n        astral: '\\uD801[\\uDD30-\\uDD6F]'\n    }, {\n        name: 'InChakma',\n        astral: '\\uD804[\\uDD00-\\uDD4F]'\n    }, {\n        name: 'InCham',\n        bmp: '\\uAA00-\\uAA5F'\n    }, {\n        name: 'InCherokee',\n        bmp: '\\u13A0-\\u13FF'\n    }, {\n        name: 'InCherokee_Supplement',\n        bmp: '\\uAB70-\\uABBF'\n    }, {\n        name: 'InCombining_Diacritical_Marks',\n        bmp: '\\u0300-\\u036F'\n    }, {\n        name: 'InCombining_Diacritical_Marks_Extended',\n        bmp: '\\u1AB0-\\u1AFF'\n    }, {\n        name: 'InCombining_Diacritical_Marks_Supplement',\n        bmp: '\\u1DC0-\\u1DFF'\n    }, {\n        name: 'InCombining_Diacritical_Marks_for_Symbols',\n        bmp: '\\u20D0-\\u20FF'\n    }, {\n        name: 'InCombining_Half_Marks',\n        bmp: '\\uFE20-\\uFE2F'\n    }, {\n        name: 'InCommon_Indic_Number_Forms',\n        bmp: '\\uA830-\\uA83F'\n    }, {\n        name: 'InControl_Pictures',\n        bmp: '\\u2400-\\u243F'\n    }, {\n        name: 'InCoptic',\n        bmp: '\\u2C80-\\u2CFF'\n    }, {\n        name: 'InCoptic_Epact_Numbers',\n        astral: '\\uD800[\\uDEE0-\\uDEFF]'\n    }, {\n        name: 'InCounting_Rod_Numerals',\n        astral: '\\uD834[\\uDF60-\\uDF7F]'\n    }, {\n        name: 'InCuneiform',\n        astral: '\\uD808[\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InCuneiform_Numbers_and_Punctuation',\n        astral: '\\uD809[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InCurrency_Symbols',\n        bmp: '\\u20A0-\\u20CF'\n    }, {\n        name: 'InCypriot_Syllabary',\n        astral: '\\uD802[\\uDC00-\\uDC3F]'\n    }, {\n        name: 'InCyrillic',\n        bmp: '\\u0400-\\u04FF'\n    }, {\n        name: 'InCyrillic_Extended_A',\n        bmp: '\\u2DE0-\\u2DFF'\n    }, {\n        name: 'InCyrillic_Extended_B',\n        bmp: '\\uA640-\\uA69F'\n    }, {\n        name: 'InCyrillic_Extended_C',\n        bmp: '\\u1C80-\\u1C8F'\n    }, {\n        name: 'InCyrillic_Supplement',\n        bmp: '\\u0500-\\u052F'\n    }, {\n        name: 'InDeseret',\n        astral: '\\uD801[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'InDevanagari',\n        bmp: '\\u0900-\\u097F'\n    }, {\n        name: 'InDevanagari_Extended',\n        bmp: '\\uA8E0-\\uA8FF'\n    }, {\n        name: 'InDingbats',\n        bmp: '\\u2700-\\u27BF'\n    }, {\n        name: 'InDomino_Tiles',\n        astral: '\\uD83C[\\uDC30-\\uDC9F]'\n    }, {\n        name: 'InDuployan',\n        astral: '\\uD82F[\\uDC00-\\uDC9F]'\n    }, {\n        name: 'InEarly_Dynastic_Cuneiform',\n        astral: '\\uD809[\\uDC80-\\uDD4F]'\n    }, {\n        name: 'InEgyptian_Hieroglyphs',\n        astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InElbasan',\n        astral: '\\uD801[\\uDD00-\\uDD2F]'\n    }, {\n        name: 'InEmoticons',\n        astral: '\\uD83D[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InEnclosed_Alphanumeric_Supplement',\n        astral: '\\uD83C[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InEnclosed_Alphanumerics',\n        bmp: '\\u2460-\\u24FF'\n    }, {\n        name: 'InEnclosed_CJK_Letters_and_Months',\n        bmp: '\\u3200-\\u32FF'\n    }, {\n        name: 'InEnclosed_Ideographic_Supplement',\n        astral: '\\uD83C[\\uDE00-\\uDEFF]'\n    }, {\n        name: 'InEthiopic',\n        bmp: '\\u1200-\\u137F'\n    }, {\n        name: 'InEthiopic_Extended',\n        bmp: '\\u2D80-\\u2DDF'\n    }, {\n        name: 'InEthiopic_Extended_A',\n        bmp: '\\uAB00-\\uAB2F'\n    }, {\n        name: 'InEthiopic_Supplement',\n        bmp: '\\u1380-\\u139F'\n    }, {\n        name: 'InGeneral_Punctuation',\n        bmp: '\\u2000-\\u206F'\n    }, {\n        name: 'InGeometric_Shapes',\n        bmp: '\\u25A0-\\u25FF'\n    }, {\n        name: 'InGeometric_Shapes_Extended',\n        astral: '\\uD83D[\\uDF80-\\uDFFF]'\n    }, {\n        name: 'InGeorgian',\n        bmp: '\\u10A0-\\u10FF'\n    }, {\n        name: 'InGeorgian_Supplement',\n        bmp: '\\u2D00-\\u2D2F'\n    }, {\n        name: 'InGlagolitic',\n        bmp: '\\u2C00-\\u2C5F'\n    }, {\n        name: 'InGlagolitic_Supplement',\n        astral: '\\uD838[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InGothic',\n        astral: '\\uD800[\\uDF30-\\uDF4F]'\n    }, {\n        name: 'InGrantha',\n        astral: '\\uD804[\\uDF00-\\uDF7F]'\n    }, {\n        name: 'InGreek_Extended',\n        bmp: '\\u1F00-\\u1FFF'\n    }, {\n        name: 'InGreek_and_Coptic',\n        bmp: '\\u0370-\\u03FF'\n    }, {\n        name: 'InGujarati',\n        bmp: '\\u0A80-\\u0AFF'\n    }, {\n        name: 'InGurmukhi',\n        bmp: '\\u0A00-\\u0A7F'\n    }, {\n        name: 'InHalfwidth_and_Fullwidth_Forms',\n        bmp: '\\uFF00-\\uFFEF'\n    }, {\n        name: 'InHangul_Compatibility_Jamo',\n        bmp: '\\u3130-\\u318F'\n    }, {\n        name: 'InHangul_Jamo',\n        bmp: '\\u1100-\\u11FF'\n    }, {\n        name: 'InHangul_Jamo_Extended_A',\n        bmp: '\\uA960-\\uA97F'\n    }, {\n        name: 'InHangul_Jamo_Extended_B',\n        bmp: '\\uD7B0-\\uD7FF'\n    }, {\n        name: 'InHangul_Syllables',\n        bmp: '\\uAC00-\\uD7AF'\n    }, {\n        name: 'InHanunoo',\n        bmp: '\\u1720-\\u173F'\n    }, {\n        name: 'InHatran',\n        astral: '\\uD802[\\uDCE0-\\uDCFF]'\n    }, {\n        name: 'InHebrew',\n        bmp: '\\u0590-\\u05FF'\n    }, {\n        name: 'InHigh_Private_Use_Surrogates',\n        bmp: '\\uDB80-\\uDBFF'\n    }, {\n        name: 'InHigh_Surrogates',\n        bmp: '\\uD800-\\uDB7F'\n    }, {\n        name: 'InHiragana',\n        bmp: '\\u3040-\\u309F'\n    }, {\n        name: 'InIPA_Extensions',\n        bmp: '\\u0250-\\u02AF'\n    }, {\n        name: 'InIdeographic_Description_Characters',\n        bmp: '\\u2FF0-\\u2FFF'\n    }, {\n        name: 'InIdeographic_Symbols_and_Punctuation',\n        astral: '\\uD81B[\\uDFE0-\\uDFFF]'\n    }, {\n        name: 'InImperial_Aramaic',\n        astral: '\\uD802[\\uDC40-\\uDC5F]'\n    }, {\n        name: 'InInscriptional_Pahlavi',\n        astral: '\\uD802[\\uDF60-\\uDF7F]'\n    }, {\n        name: 'InInscriptional_Parthian',\n        astral: '\\uD802[\\uDF40-\\uDF5F]'\n    }, {\n        name: 'InJavanese',\n        bmp: '\\uA980-\\uA9DF'\n    }, {\n        name: 'InKaithi',\n        astral: '\\uD804[\\uDC80-\\uDCCF]'\n    }, {\n        name: 'InKana_Supplement',\n        astral: '\\uD82C[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InKanbun',\n        bmp: '\\u3190-\\u319F'\n    }, {\n        name: 'InKangxi_Radicals',\n        bmp: '\\u2F00-\\u2FDF'\n    }, {\n        name: 'InKannada',\n        bmp: '\\u0C80-\\u0CFF'\n    }, {\n        name: 'InKatakana',\n        bmp: '\\u30A0-\\u30FF'\n    }, {\n        name: 'InKatakana_Phonetic_Extensions',\n        bmp: '\\u31F0-\\u31FF'\n    }, {\n        name: 'InKayah_Li',\n        bmp: '\\uA900-\\uA92F'\n    }, {\n        name: 'InKharoshthi',\n        astral: '\\uD802[\\uDE00-\\uDE5F]'\n    }, {\n        name: 'InKhmer',\n        bmp: '\\u1780-\\u17FF'\n    }, {\n        name: 'InKhmer_Symbols',\n        bmp: '\\u19E0-\\u19FF'\n    }, {\n        name: 'InKhojki',\n        astral: '\\uD804[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InKhudawadi',\n        astral: '\\uD804[\\uDEB0-\\uDEFF]'\n    }, {\n        name: 'InLao',\n        bmp: '\\u0E80-\\u0EFF'\n    }, {\n        name: 'InLatin_Extended_Additional',\n        bmp: '\\u1E00-\\u1EFF'\n    }, {\n        name: 'InLatin_Extended_A',\n        bmp: '\\u0100-\\u017F'\n    }, {\n        name: 'InLatin_Extended_B',\n        bmp: '\\u0180-\\u024F'\n    }, {\n        name: 'InLatin_Extended_C',\n        bmp: '\\u2C60-\\u2C7F'\n    }, {\n        name: 'InLatin_Extended_D',\n        bmp: '\\uA720-\\uA7FF'\n    }, {\n        name: 'InLatin_Extended_E',\n        bmp: '\\uAB30-\\uAB6F'\n    }, {\n        name: 'InLatin_1_Supplement',\n        bmp: '\\x80-\\xFF'\n    }, {\n        name: 'InLepcha',\n        bmp: '\\u1C00-\\u1C4F'\n    }, {\n        name: 'InLetterlike_Symbols',\n        bmp: '\\u2100-\\u214F'\n    }, {\n        name: 'InLimbu',\n        bmp: '\\u1900-\\u194F'\n    }, {\n        name: 'InLinear_A',\n        astral: '\\uD801[\\uDE00-\\uDF7F]'\n    }, {\n        name: 'InLinear_B_Ideograms',\n        astral: '\\uD800[\\uDC80-\\uDCFF]'\n    }, {\n        name: 'InLinear_B_Syllabary',\n        astral: '\\uD800[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InLisu',\n        bmp: '\\uA4D0-\\uA4FF'\n    }, {\n        name: 'InLow_Surrogates',\n        bmp: '\\uDC00-\\uDFFF'\n    }, {\n        name: 'InLycian',\n        astral: '\\uD800[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'InLydian',\n        astral: '\\uD802[\\uDD20-\\uDD3F]'\n    }, {\n        name: 'InMahajani',\n        astral: '\\uD804[\\uDD50-\\uDD7F]'\n    }, {\n        name: 'InMahjong_Tiles',\n        astral: '\\uD83C[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InMalayalam',\n        bmp: '\\u0D00-\\u0D7F'\n    }, {\n        name: 'InMandaic',\n        bmp: '\\u0840-\\u085F'\n    }, {\n        name: 'InManichaean',\n        astral: '\\uD802[\\uDEC0-\\uDEFF]'\n    }, {\n        name: 'InMarchen',\n        astral: '\\uD807[\\uDC70-\\uDCBF]'\n    }, {\n        name: 'InMathematical_Alphanumeric_Symbols',\n        astral: '\\uD835[\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InMathematical_Operators',\n        bmp: '\\u2200-\\u22FF'\n    }, {\n        name: 'InMeetei_Mayek',\n        bmp: '\\uABC0-\\uABFF'\n    }, {\n        name: 'InMeetei_Mayek_Extensions',\n        bmp: '\\uAAE0-\\uAAFF'\n    }, {\n        name: 'InMende_Kikakui',\n        astral: '\\uD83A[\\uDC00-\\uDCDF]'\n    }, {\n        name: 'InMeroitic_Cursive',\n        astral: '\\uD802[\\uDDA0-\\uDDFF]'\n    }, {\n        name: 'InMeroitic_Hieroglyphs',\n        astral: '\\uD802[\\uDD80-\\uDD9F]'\n    }, {\n        name: 'InMiao',\n        astral: '\\uD81B[\\uDF00-\\uDF9F]'\n    }, {\n        name: 'InMiscellaneous_Mathematical_Symbols_A',\n        bmp: '\\u27C0-\\u27EF'\n    }, {\n        name: 'InMiscellaneous_Mathematical_Symbols_B',\n        bmp: '\\u2980-\\u29FF'\n    }, {\n        name: 'InMiscellaneous_Symbols',\n        bmp: '\\u2600-\\u26FF'\n    }, {\n        name: 'InMiscellaneous_Symbols_and_Arrows',\n        bmp: '\\u2B00-\\u2BFF'\n    }, {\n        name: 'InMiscellaneous_Symbols_and_Pictographs',\n        astral: '\\uD83C[\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDDFF]'\n    }, {\n        name: 'InMiscellaneous_Technical',\n        bmp: '\\u2300-\\u23FF'\n    }, {\n        name: 'InModi',\n        astral: '\\uD805[\\uDE00-\\uDE5F]'\n    }, {\n        name: 'InModifier_Tone_Letters',\n        bmp: '\\uA700-\\uA71F'\n    }, {\n        name: 'InMongolian',\n        bmp: '\\u1800-\\u18AF'\n    }, {\n        name: 'InMongolian_Supplement',\n        astral: '\\uD805[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InMro',\n        astral: '\\uD81A[\\uDE40-\\uDE6F]'\n    }, {\n        name: 'InMultani',\n        astral: '\\uD804[\\uDE80-\\uDEAF]'\n    }, {\n        name: 'InMusical_Symbols',\n        astral: '\\uD834[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InMyanmar',\n        bmp: '\\u1000-\\u109F'\n    }, {\n        name: 'InMyanmar_Extended_A',\n        bmp: '\\uAA60-\\uAA7F'\n    }, {\n        name: 'InMyanmar_Extended_B',\n        bmp: '\\uA9E0-\\uA9FF'\n    }, {\n        name: 'InNKo',\n        bmp: '\\u07C0-\\u07FF'\n    }, {\n        name: 'InNabataean',\n        astral: '\\uD802[\\uDC80-\\uDCAF]'\n    }, {\n        name: 'InNew_Tai_Lue',\n        bmp: '\\u1980-\\u19DF'\n    }, {\n        name: 'InNewa',\n        astral: '\\uD805[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InNumber_Forms',\n        bmp: '\\u2150-\\u218F'\n    }, {\n        name: 'InOgham',\n        bmp: '\\u1680-\\u169F'\n    }, {\n        name: 'InOl_Chiki',\n        bmp: '\\u1C50-\\u1C7F'\n    }, {\n        name: 'InOld_Hungarian',\n        astral: '\\uD803[\\uDC80-\\uDCFF]'\n    }, {\n        name: 'InOld_Italic',\n        astral: '\\uD800[\\uDF00-\\uDF2F]'\n    }, {\n        name: 'InOld_North_Arabian',\n        astral: '\\uD802[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'InOld_Permic',\n        astral: '\\uD800[\\uDF50-\\uDF7F]'\n    }, {\n        name: 'InOld_Persian',\n        astral: '\\uD800[\\uDFA0-\\uDFDF]'\n    }, {\n        name: 'InOld_South_Arabian',\n        astral: '\\uD802[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InOld_Turkic',\n        astral: '\\uD803[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'InOptical_Character_Recognition',\n        bmp: '\\u2440-\\u245F'\n    }, {\n        name: 'InOriya',\n        bmp: '\\u0B00-\\u0B7F'\n    }, {\n        name: 'InOrnamental_Dingbats',\n        astral: '\\uD83D[\\uDE50-\\uDE7F]'\n    }, {\n        name: 'InOsage',\n        astral: '\\uD801[\\uDCB0-\\uDCFF]'\n    }, {\n        name: 'InOsmanya',\n        astral: '\\uD801[\\uDC80-\\uDCAF]'\n    }, {\n        name: 'InPahawh_Hmong',\n        astral: '\\uD81A[\\uDF00-\\uDF8F]'\n    }, {\n        name: 'InPalmyrene',\n        astral: '\\uD802[\\uDC60-\\uDC7F]'\n    }, {\n        name: 'InPau_Cin_Hau',\n        astral: '\\uD806[\\uDEC0-\\uDEFF]'\n    }, {\n        name: 'InPhags_pa',\n        bmp: '\\uA840-\\uA87F'\n    }, {\n        name: 'InPhaistos_Disc',\n        astral: '\\uD800[\\uDDD0-\\uDDFF]'\n    }, {\n        name: 'InPhoenician',\n        astral: '\\uD802[\\uDD00-\\uDD1F]'\n    }, {\n        name: 'InPhonetic_Extensions',\n        bmp: '\\u1D00-\\u1D7F'\n    }, {\n        name: 'InPhonetic_Extensions_Supplement',\n        bmp: '\\u1D80-\\u1DBF'\n    }, {\n        name: 'InPlaying_Cards',\n        astral: '\\uD83C[\\uDCA0-\\uDCFF]'\n    }, {\n        name: 'InPrivate_Use_Area',\n        bmp: '\\uE000-\\uF8FF'\n    }, {\n        name: 'InPsalter_Pahlavi',\n        astral: '\\uD802[\\uDF80-\\uDFAF]'\n    }, {\n        name: 'InRejang',\n        bmp: '\\uA930-\\uA95F'\n    }, {\n        name: 'InRumi_Numeral_Symbols',\n        astral: '\\uD803[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InRunic',\n        bmp: '\\u16A0-\\u16FF'\n    }, {\n        name: 'InSamaritan',\n        bmp: '\\u0800-\\u083F'\n    }, {\n        name: 'InSaurashtra',\n        bmp: '\\uA880-\\uA8DF'\n    }, {\n        name: 'InSharada',\n        astral: '\\uD804[\\uDD80-\\uDDDF]'\n    }, {\n        name: 'InShavian',\n        astral: '\\uD801[\\uDC50-\\uDC7F]'\n    }, {\n        name: 'InShorthand_Format_Controls',\n        astral: '\\uD82F[\\uDCA0-\\uDCAF]'\n    }, {\n        name: 'InSiddham',\n        astral: '\\uD805[\\uDD80-\\uDDFF]'\n    }, {\n        name: 'InSinhala',\n        bmp: '\\u0D80-\\u0DFF'\n    }, {\n        name: 'InSinhala_Archaic_Numbers',\n        astral: '\\uD804[\\uDDE0-\\uDDFF]'\n    }, {\n        name: 'InSmall_Form_Variants',\n        bmp: '\\uFE50-\\uFE6F'\n    }, {\n        name: 'InSora_Sompeng',\n        astral: '\\uD804[\\uDCD0-\\uDCFF]'\n    }, {\n        name: 'InSpacing_Modifier_Letters',\n        bmp: '\\u02B0-\\u02FF'\n    }, {\n        name: 'InSpecials',\n        bmp: '\\uFFF0-\\uFFFF'\n    }, {\n        name: 'InSundanese',\n        bmp: '\\u1B80-\\u1BBF'\n    }, {\n        name: 'InSundanese_Supplement',\n        bmp: '\\u1CC0-\\u1CCF'\n    }, {\n        name: 'InSuperscripts_and_Subscripts',\n        bmp: '\\u2070-\\u209F'\n    }, {\n        name: 'InSupplemental_Arrows_A',\n        bmp: '\\u27F0-\\u27FF'\n    }, {\n        name: 'InSupplemental_Arrows_B',\n        bmp: '\\u2900-\\u297F'\n    }, {\n        name: 'InSupplemental_Arrows_C',\n        astral: '\\uD83E[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InSupplemental_Mathematical_Operators',\n        bmp: '\\u2A00-\\u2AFF'\n    }, {\n        name: 'InSupplemental_Punctuation',\n        bmp: '\\u2E00-\\u2E7F'\n    }, {\n        name: 'InSupplemental_Symbols_and_Pictographs',\n        astral: '\\uD83E[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InSupplementary_Private_Use_Area_A',\n        astral: '[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InSupplementary_Private_Use_Area_B',\n        astral: '[\\uDBC0-\\uDBFF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InSutton_SignWriting',\n        astral: '\\uD836[\\uDC00-\\uDEAF]'\n    }, {\n        name: 'InSyloti_Nagri',\n        bmp: '\\uA800-\\uA82F'\n    }, {\n        name: 'InSyriac',\n        bmp: '\\u0700-\\u074F'\n    }, {\n        name: 'InTagalog',\n        bmp: '\\u1700-\\u171F'\n    }, {\n        name: 'InTagbanwa',\n        bmp: '\\u1760-\\u177F'\n    }, {\n        name: 'InTags',\n        astral: '\\uDB40[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InTai_Le',\n        bmp: '\\u1950-\\u197F'\n    }, {\n        name: 'InTai_Tham',\n        bmp: '\\u1A20-\\u1AAF'\n    }, {\n        name: 'InTai_Viet',\n        bmp: '\\uAA80-\\uAADF'\n    }, {\n        name: 'InTai_Xuan_Jing_Symbols',\n        astral: '\\uD834[\\uDF00-\\uDF5F]'\n    }, {\n        name: 'InTakri',\n        astral: '\\uD805[\\uDE80-\\uDECF]'\n    }, {\n        name: 'InTamil',\n        bmp: '\\u0B80-\\u0BFF'\n    }, {\n        name: 'InTangut',\n        astral: '[\\uD81C-\\uD821][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InTangut_Components',\n        astral: '\\uD822[\\uDC00-\\uDEFF]'\n    }, {\n        name: 'InTelugu',\n        bmp: '\\u0C00-\\u0C7F'\n    }, {\n        name: 'InThaana',\n        bmp: '\\u0780-\\u07BF'\n    }, {\n        name: 'InThai',\n        bmp: '\\u0E00-\\u0E7F'\n    }, {\n        name: 'InTibetan',\n        bmp: '\\u0F00-\\u0FFF'\n    }, {\n        name: 'InTifinagh',\n        bmp: '\\u2D30-\\u2D7F'\n    }, {\n        name: 'InTirhuta',\n        astral: '\\uD805[\\uDC80-\\uDCDF]'\n    }, {\n        name: 'InTransport_and_Map_Symbols',\n        astral: '\\uD83D[\\uDE80-\\uDEFF]'\n    }, {\n        name: 'InUgaritic',\n        astral: '\\uD800[\\uDF80-\\uDF9F]'\n    }, {\n        name: 'InUnified_Canadian_Aboriginal_Syllabics',\n        bmp: '\\u1400-\\u167F'\n    }, {\n        name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended',\n        bmp: '\\u18B0-\\u18FF'\n    }, {\n        name: 'InVai',\n        bmp: '\\uA500-\\uA63F'\n    }, {\n        name: 'InVariation_Selectors',\n        bmp: '\\uFE00-\\uFE0F'\n    }, {\n        name: 'InVariation_Selectors_Supplement',\n        astral: '\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'InVedic_Extensions',\n        bmp: '\\u1CD0-\\u1CFF'\n    }, {\n        name: 'InVertical_Forms',\n        bmp: '\\uFE10-\\uFE1F'\n    }, {\n        name: 'InWarang_Citi',\n        astral: '\\uD806[\\uDCA0-\\uDCFF]'\n    }, {\n        name: 'InYi_Radicals',\n        bmp: '\\uA490-\\uA4CF'\n    }, {\n        name: 'InYi_Syllables',\n        bmp: '\\uA000-\\uA48F'\n    }, {\n        name: 'InYijing_Hexagram_Symbols',\n        bmp: '\\u4DC0-\\u4DFF'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"WZpi\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Categories 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for Unicode's general categories. E.g., `\\p{Lu}` or `\\p{Uppercase Letter}`. See\n     * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token\n     * names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'C',\n        alias: 'Other',\n        isBmpLast: true,\n        bmp: '\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u08E2\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180E\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',\n        astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCBD\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA0-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDD73-\\uDD7A\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]'\n    }, {\n        name: 'Cc',\n        alias: 'Control',\n        bmp: '\\0-\\x1F\\x7F-\\x9F'\n    }, {\n        name: 'Cf',\n        alias: 'Format',\n        bmp: '\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB',\n        astral: '\\uD804\\uDCBD|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n    }, {\n        name: 'Cn',\n        alias: 'Unassigned',\n        bmp: '\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u05FF\\u061D\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF',\n        astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n    }, {\n        name: 'Co',\n        alias: 'Private_Use',\n        bmp: '\\uE000-\\uF8FF',\n        astral: '[\\uDB80-\\uDBBE\\uDBC0-\\uDBFE][\\uDC00-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDC00-\\uDFFD]'\n    }, {\n        name: 'Cs',\n        alias: 'Surrogate',\n        bmp: '\\uD800-\\uDFFF'\n    }, {\n        name: 'L',\n        alias: 'Letter',\n        bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Ll',\n        alias: 'Lowercase_Letter',\n        bmp: 'a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n        astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n    }, {\n        name: 'Lm',\n        alias: 'Modifier_Letter',\n        bmp: '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E\\uFF9F',\n        astral: '\\uD81A[\\uDF40-\\uDF43]|\\uD81B[\\uDF93-\\uDF9F\\uDFE0]'\n    }, {\n        name: 'Lo',\n        alias: 'Other_Letter',\n        bmp: '\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC50-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Lt',\n        alias: 'Titlecase_Letter',\n        bmp: '\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC'\n    }, {\n        name: 'Lu',\n        alias: 'Uppercase_Letter',\n        bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n        astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]'\n    }, {\n        name: 'M',\n        alias: 'Mark',\n        bmp: '\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n        astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDDCA-\\uDDCC\\uDE2C-\\uDE37\\uDE3E\\uDEDF-\\uDEEA\\uDF00-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC35-\\uDC46\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDDDC\\uDDDD\\uDE30-\\uDE40\\uDEAB-\\uDEB7\\uDF1D-\\uDF2B]|\\uD807[\\uDC2F-\\uDC36\\uDC38-\\uDC3F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'Mc',\n        alias: 'Spacing_Mark',\n        bmp: '\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\u1CF3\\u302E\\u302F\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC',\n        astral: '\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3E\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB0-\\uDCB2\\uDCB9\\uDCBB-\\uDCBE\\uDCC1\\uDDAF-\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF20\\uDF21\\uDF26]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4]|\\uD81B[\\uDF51-\\uDF7E]|\\uD834[\\uDD65\\uDD66\\uDD6D-\\uDD72]'\n    }, {\n        name: 'Me',\n        alias: 'Enclosing_Mark',\n        bmp: '\\u0488\\u0489\\u1ABE\\u20DD-\\u20E0\\u20E2-\\u20E4\\uA670-\\uA672'\n    }, {\n        name: 'Mn',\n        alias: 'Nonspacing_Mark',\n        bmp: '\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D01\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n        astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDCA-\\uDDCC\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3C\\uDF40\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDCB3-\\uDCB8\\uDCBA\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'N',\n        alias: 'Number',\n        bmp: '0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n        astral: '\\uD800[\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD801[\\uDCA0-\\uDCA9]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDDE1-\\uDDF4\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF3B]|\\uD806[\\uDCE0-\\uDCF2]|\\uD807[\\uDC50-\\uDC6C]|\\uD809[\\uDC00-\\uDC6E]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDCC7-\\uDCCF\\uDD50-\\uDD59]|\\uD83C[\\uDD00-\\uDD0C]'\n    }, {\n        name: 'Nd',\n        alias: 'Decimal_Number',\n        bmp: '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n        astral: '\\uD801[\\uDCA0-\\uDCA9]|\\uD804[\\uDC66-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF39]|\\uD806[\\uDCE0-\\uDCE9]|\\uD807[\\uDC50-\\uDC59]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDD50-\\uDD59]'\n    }, {\n        name: 'Nl',\n        alias: 'Letter_Number',\n        bmp: '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',\n        astral: '\\uD800[\\uDD40-\\uDD74\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD809[\\uDC00-\\uDC6E]'\n    }, {\n        name: 'No',\n        alias: 'Other_Number',\n        bmp: '\\xB2\\xB3\\xB9\\xBC-\\xBE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',\n        astral: '\\uD800[\\uDD07-\\uDD33\\uDD75-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC65\\uDDE1-\\uDDF4]|\\uD805[\\uDF3A\\uDF3B]|\\uD806[\\uDCEA-\\uDCF2]|\\uD807[\\uDC5A-\\uDC6C]|\\uD81A[\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD83A[\\uDCC7-\\uDCCF]|\\uD83C[\\uDD00-\\uDD0C]'\n    }, {\n        name: 'P',\n        alias: 'Punctuation',\n        bmp: '\\x21-\\x23\\x25-\\\\x2A\\x2C-\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5B-\\\\x5D\\x5F\\\\x7B\\x7D\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E44\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Pc',\n        alias: 'Connector_Punctuation',\n        bmp: '\\x5F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F'\n    }, {\n        name: 'Pd',\n        alias: 'Dash_Punctuation',\n        bmp: '\\\\x2D\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D'\n    }, {\n        name: 'Pe',\n        alias: 'Close_Punctuation',\n        bmp: '\\\\x29\\\\x5D\\x7D\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63'\n    }, {\n        name: 'Pf',\n        alias: 'Final_Punctuation',\n        bmp: '\\xBB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21'\n    }, {\n        name: 'Pi',\n        alias: 'Initial_Punctuation',\n        bmp: '\\xAB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20'\n    }, {\n        name: 'Po',\n        alias: 'Other_Punctuation',\n        bmp: '\\x21-\\x23\\x25-\\x27\\\\x2A\\x2C\\\\x2E\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5C\\xA1\\xA7\\xB6\\xB7\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166D\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43\\u2E44\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Ps',\n        alias: 'Open_Punctuation',\n        bmp: '\\\\x28\\\\x5B\\\\x7B\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62'\n    }, {\n        name: 'S',\n        alias: 'Symbol',\n        bmp: '\\\\x24\\\\x2B\\x3C-\\x3E\\\\x5E\\x60\\\\x7C\\x7E\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20BE\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uFB29\\uFBB2-\\uFBC1\\uFDFC\\uFDFD\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',\n        astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83B[\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n    }, {\n        name: 'Sc',\n        alias: 'Currency_Symbol',\n        bmp: '\\\\x24\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BE\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6'\n    }, {\n        name: 'Sk',\n        alias: 'Modifier_Symbol',\n        bmp: '\\\\x5E\\x60\\xA8\\xAF\\xB4\\xB8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uFBB2-\\uFBC1\\uFF3E\\uFF40\\uFFE3',\n        astral: '\\uD83C[\\uDFFB-\\uDFFF]'\n    }, {\n        name: 'Sm',\n        alias: 'Math_Symbol',\n        bmp: '\\\\x2B\\x3C-\\x3E\\\\x7C\\x7E\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',\n        astral: '\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD83B[\\uDEF0\\uDEF1]'\n    }, {\n        name: 'So',\n        alias: 'Other_Symbol',\n        bmp: '\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',\n        astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFA]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n    }, {\n        name: 'Z',\n        alias: 'Separator',\n        bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n    }, {\n        name: 'Zl',\n        alias: 'Line_Separator',\n        bmp: '\\u2028'\n    }, {\n        name: 'Zp',\n        alias: 'Paragraph_Separator',\n        bmp: '\\u2029'\n    }, {\n        name: 'Zs',\n        alias: 'Space_Separator',\n        bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"VzkP\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Properties 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2012-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See\n     * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from\n     * UAX #44 <http://unicode.org/reports/tr44/>:\n     *\n     * - Alphabetic\n     *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +\n     *   Lo + Nl + Other_Alphabetic.\n     *\n     * - Default_Ignorable_Code_Point\n     *   For programmatic determination of default ignorable code points. New characters that should\n     *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,\n     *   permitting programs to correctly handle the default rendering of such characters when not\n     *   otherwise supported.\n     *\n     * - Lowercase\n     *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.\n     *\n     * - Noncharacter_Code_Point\n     *   Code points permanently reserved for internal use.\n     *\n     * - Uppercase\n     *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.\n     *\n     * - White_Space\n     *   Spaces, separator characters and other control characters which should be treated by\n     *   programming languages as \"white space\" for the purpose of parsing elements.\n     *\n     * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS\n     * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are\n     * included in XRegExp's Unicode Categories and Unicode Scripts addons.\n     *\n     * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');\n    }\n\n    var unicodeData = [{\n        name: 'ASCII',\n        bmp: '\\0-\\x7F'\n    }, {\n        name: 'Alphabetic',\n        bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0345\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05B0-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0657\\u0659-\\u065F\\u066E-\\u06D3\\u06D5-\\u06DC\\u06E1-\\u06E8\\u06ED-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710-\\u073F\\u074D-\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0817\\u081A-\\u082C\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08DF\\u08E3-\\u08E9\\u08F0-\\u093B\\u093D-\\u094C\\u094E-\\u0950\\u0955-\\u0963\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD-\\u09C4\\u09C7\\u09C8\\u09CB\\u09CC\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09F0\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A70-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB\\u0ACC\\u0AD0\\u0AE0-\\u0AE3\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D-\\u0B44\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD0\\u0BD7\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4C\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCC\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E46\\u0E4D\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ECD\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F81\\u0F88-\\u0F97\\u0F99-\\u0FBC\\u1000-\\u1036\\u1038\\u103B-\\u103F\\u1050-\\u1062\\u1065-\\u1068\\u106E-\\u1086\\u108E\\u109C\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1713\\u1720-\\u1733\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17B3\\u17B6-\\u17C8\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u1938\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A61-\\u1A74\\u1AA7\\u1B00-\\u1B33\\u1B35-\\u1B43\\u1B45-\\u1B4B\\u1B80-\\u1BA9\\u1BAC-\\u1BAF\\u1BBA-\\u1BE5\\u1BE7-\\u1BF1\\u1C00-\\u1C35\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1DE7-\\u1DF4\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u24B6-\\u24E9\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA674-\\uA67B\\uA67F-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA827\\uA840-\\uA873\\uA880-\\uA8C3\\uA8C5\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA92A\\uA930-\\uA952\\uA960-\\uA97C\\uA980-\\uA9B2\\uA9B4-\\uA9BF\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAABE\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF5\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC45\\uDC82-\\uDCB8\\uDCD0-\\uDCE8\\uDD00-\\uDD32\\uDD50-\\uDD72\\uDD76\\uDD80-\\uDDBF\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE34\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEE8\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D-\\uDF44\\uDF47\\uDF48\\uDF4B\\uDF4C\\uDF50\\uDF57\\uDF5D-\\uDF63]|\\uD805[\\uDC00-\\uDC41\\uDC43-\\uDC45\\uDC47-\\uDC4A\\uDC80-\\uDCC1\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDB5\\uDDB8-\\uDDBE\\uDDD8-\\uDDDD\\uDE00-\\uDE3E\\uDE40\\uDE44\\uDE80-\\uDEB5\\uDF00-\\uDF19\\uDF1D-\\uDF2A]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC3E\\uDC40\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9E]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD47]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Any',\n        isBmpLast: true,\n        bmp: '\\0-\\uFFFF',\n        astral: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'Default_Ignorable_Code_Point',\n        bmp: '\\xAD\\u034F\\u061C\\u115F\\u1160\\u17B4\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8',\n        astral: '\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|[\\uDB40-\\uDB43][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'Lowercase',\n        bmp: 'a-z\\xAA\\xB5\\xBA\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02B8\\u02C0\\u02C1\\u02E0-\\u02E4\\u0345\\u0371\\u0373\\u0377\\u037A-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1DBF\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u2090-\\u209C\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2170-\\u217F\\u2184\\u24D0-\\u24E9\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7D\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B-\\uA69D\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7F8-\\uA7FA\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n        astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n    }, {\n        name: 'Noncharacter_Code_Point',\n        bmp: '\\uFDD0-\\uFDEF\\uFFFE\\uFFFF',\n        astral: '[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n    }, {\n        name: 'Uppercase',\n        bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n        astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]'\n    }, {\n        name: 'White_Space',\n        bmp: '\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n    }];\n\n    // Add non-generated data\n    unicodeData.push({\n        name: 'Assigned',\n        // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode\n        // Categories addon is required to use this property\n        inverseOf: 'Cn'\n    });\n\n    XRegExp.addUnicodeData(unicodeData);\n};\n\nmodule.exports = exports['default'];\n},{}],\"Fwp9\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Scripts 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for all Unicode scripts. E.g., `\\p{Latin}`. Token names are case insensitive,\n     * and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'Adlam',\n        astral: '\\uD83A[\\uDD00-\\uDD4A\\uDD50-\\uDD59\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Ahom',\n        astral: '\\uD805[\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF3F]'\n    }, {\n        name: 'Anatolian_Hieroglyphs',\n        astral: '\\uD811[\\uDC00-\\uDE46]'\n    }, {\n        name: 'Arabic',\n        bmp: '\\u0600-\\u0604\\u0606-\\u060B\\u060D-\\u061A\\u061E\\u0620-\\u063F\\u0641-\\u064A\\u0656-\\u066F\\u0671-\\u06DC\\u06DE-\\u06FF\\u0750-\\u077F\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u08FF\\uFB50-\\uFBC1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFD\\uFE70-\\uFE74\\uFE76-\\uFEFC',\n        astral: '\\uD803[\\uDE60-\\uDE7E]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB\\uDEF0\\uDEF1]'\n    }, {\n        name: 'Armenian',\n        bmp: '\\u0531-\\u0556\\u0559-\\u055F\\u0561-\\u0587\\u058A\\u058D-\\u058F\\uFB13-\\uFB17'\n    }, {\n        name: 'Avestan',\n        astral: '\\uD802[\\uDF00-\\uDF35\\uDF39-\\uDF3F]'\n    }, {\n        name: 'Balinese',\n        bmp: '\\u1B00-\\u1B4B\\u1B50-\\u1B7C'\n    }, {\n        name: 'Bamum',\n        bmp: '\\uA6A0-\\uA6F7',\n        astral: '\\uD81A[\\uDC00-\\uDE38]'\n    }, {\n        name: 'Bassa_Vah',\n        astral: '\\uD81A[\\uDED0-\\uDEED\\uDEF0-\\uDEF5]'\n    }, {\n        name: 'Batak',\n        bmp: '\\u1BC0-\\u1BF3\\u1BFC-\\u1BFF'\n    }, {\n        name: 'Bengali',\n        bmp: '\\u0980-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FB'\n    }, {\n        name: 'Bhaiksuki',\n        astral: '\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC45\\uDC50-\\uDC6C]'\n    }, {\n        name: 'Bopomofo',\n        bmp: '\\u02EA\\u02EB\\u3105-\\u312D\\u31A0-\\u31BA'\n    }, {\n        name: 'Brahmi',\n        astral: '\\uD804[\\uDC00-\\uDC4D\\uDC52-\\uDC6F\\uDC7F]'\n    }, {\n        name: 'Braille',\n        bmp: '\\u2800-\\u28FF'\n    }, {\n        name: 'Buginese',\n        bmp: '\\u1A00-\\u1A1B\\u1A1E\\u1A1F'\n    }, {\n        name: 'Buhid',\n        bmp: '\\u1740-\\u1753'\n    }, {\n        name: 'Canadian_Aboriginal',\n        bmp: '\\u1400-\\u167F\\u18B0-\\u18F5'\n    }, {\n        name: 'Carian',\n        astral: '\\uD800[\\uDEA0-\\uDED0]'\n    }, {\n        name: 'Caucasian_Albanian',\n        astral: '\\uD801[\\uDD30-\\uDD63\\uDD6F]'\n    }, {\n        name: 'Chakma',\n        astral: '\\uD804[\\uDD00-\\uDD34\\uDD36-\\uDD43]'\n    }, {\n        name: 'Cham',\n        bmp: '\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA5C-\\uAA5F'\n    }, {\n        name: 'Cherokee',\n        bmp: '\\u13A0-\\u13F5\\u13F8-\\u13FD\\uAB70-\\uABBF'\n    }, {\n        name: 'Common',\n        bmp: '\\0-\\x40\\\\x5B-\\x60\\\\x7B-\\xA9\\xAB-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02B9-\\u02DF\\u02E5-\\u02E9\\u02EC-\\u02FF\\u0374\\u037E\\u0385\\u0387\\u0589\\u0605\\u060C\\u061B\\u061C\\u061F\\u0640\\u06DD\\u08E2\\u0964\\u0965\\u0E3F\\u0FD5-\\u0FD8\\u10FB\\u16EB-\\u16ED\\u1735\\u1736\\u1802\\u1803\\u1805\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u2000-\\u200B\\u200E-\\u2064\\u2066-\\u2070\\u2074-\\u207E\\u2080-\\u208E\\u20A0-\\u20BE\\u2100-\\u2125\\u2127-\\u2129\\u212C-\\u2131\\u2133-\\u214D\\u214F-\\u215F\\u2189-\\u218B\\u2190-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u2460-\\u27FF\\u2900-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2E00-\\u2E44\\u2FF0-\\u2FFB\\u3000-\\u3004\\u3006\\u3008-\\u3020\\u3030-\\u3037\\u303C-\\u303F\\u309B\\u309C\\u30A0\\u30FB\\u30FC\\u3190-\\u319F\\u31C0-\\u31E3\\u3220-\\u325F\\u327F-\\u32CF\\u3358-\\u33FF\\u4DC0-\\u4DFF\\uA700-\\uA721\\uA788-\\uA78A\\uA830-\\uA839\\uA92E\\uA9CF\\uAB5B\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFEFF\\uFF01-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFF70\\uFF9E\\uFF9F\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFF9-\\uFFFD',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDD07-\\uDD33\\uDD37-\\uDD3F\\uDD90-\\uDD9B\\uDDD0-\\uDDFC\\uDEE1-\\uDEFB]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD66\\uDD6A-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDF00-\\uDF56\\uDF60-\\uDF71]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD00-\\uDD0C\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n    }, {\n        name: 'Coptic',\n        bmp: '\\u03E2-\\u03EF\\u2C80-\\u2CF3\\u2CF9-\\u2CFF'\n    }, {\n        name: 'Cuneiform',\n        astral: '\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC70-\\uDC74\\uDC80-\\uDD43]'\n    }, {\n        name: 'Cypriot',\n        astral: '\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F]'\n    }, {\n        name: 'Cyrillic',\n        bmp: '\\u0400-\\u0484\\u0487-\\u052F\\u1C80-\\u1C88\\u1D2B\\u1D78\\u2DE0-\\u2DFF\\uA640-\\uA69F\\uFE2E\\uFE2F'\n    }, {\n        name: 'Deseret',\n        astral: '\\uD801[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'Devanagari',\n        bmp: '\\u0900-\\u0950\\u0953-\\u0963\\u0966-\\u097F\\uA8E0-\\uA8FD'\n    }, {\n        name: 'Duployan',\n        astral: '\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9C-\\uDC9F]'\n    }, {\n        name: 'Egyptian_Hieroglyphs',\n        astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]'\n    }, {\n        name: 'Elbasan',\n        astral: '\\uD801[\\uDD00-\\uDD27]'\n    }, {\n        name: 'Ethiopic',\n        bmp: '\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u137C\\u1380-\\u1399\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E'\n    }, {\n        name: 'Georgian',\n        bmp: '\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u10FF\\u2D00-\\u2D25\\u2D27\\u2D2D'\n    }, {\n        name: 'Glagolitic',\n        bmp: '\\u2C00-\\u2C2E\\u2C30-\\u2C5E',\n        astral: '\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]'\n    }, {\n        name: 'Gothic',\n        astral: '\\uD800[\\uDF30-\\uDF4A]'\n    }, {\n        name: 'Grantha',\n        astral: '\\uD804[\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]'\n    }, {\n        name: 'Greek',\n        bmp: '\\u0370-\\u0373\\u0375-\\u0377\\u037A-\\u037D\\u037F\\u0384\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03E1\\u03F0-\\u03FF\\u1D26-\\u1D2A\\u1D5D-\\u1D61\\u1D66-\\u1D6A\\u1DBF\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FC4\\u1FC6-\\u1FD3\\u1FD6-\\u1FDB\\u1FDD-\\u1FEF\\u1FF2-\\u1FF4\\u1FF6-\\u1FFE\\u2126\\uAB65',\n        astral: '\\uD800[\\uDD40-\\uDD8E\\uDDA0]|\\uD834[\\uDE00-\\uDE45]'\n    }, {\n        name: 'Gujarati',\n        bmp: '\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AF1\\u0AF9'\n    }, {\n        name: 'Gurmukhi',\n        bmp: '\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75'\n    }, {\n        name: 'Han',\n        bmp: '\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uF900-\\uFA6D\\uFA70-\\uFAD9',\n        astral: '[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Hangul',\n        bmp: '\\u1100-\\u11FF\\u302E\\u302F\\u3131-\\u318E\\u3200-\\u321E\\u3260-\\u327E\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n    }, {\n        name: 'Hanunoo',\n        bmp: '\\u1720-\\u1734'\n    }, {\n        name: 'Hatran',\n        astral: '\\uD802[\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDCFF]'\n    }, {\n        name: 'Hebrew',\n        bmp: '\\u0591-\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F4\\uFB1D-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFB4F'\n    }, {\n        name: 'Hiragana',\n        bmp: '\\u3041-\\u3096\\u309D-\\u309F',\n        astral: '\\uD82C\\uDC01|\\uD83C\\uDE00'\n    }, {\n        name: 'Imperial_Aramaic',\n        astral: '\\uD802[\\uDC40-\\uDC55\\uDC57-\\uDC5F]'\n    }, {\n        name: 'Inherited',\n        bmp: '\\u0300-\\u036F\\u0485\\u0486\\u064B-\\u0655\\u0670\\u0951\\u0952\\u1AB0-\\u1ABE\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u200C\\u200D\\u20D0-\\u20F0\\u302A-\\u302D\\u3099\\u309A\\uFE00-\\uFE0F\\uFE20-\\uFE2D',\n        astral: '\\uD800[\\uDDFD\\uDEE0]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'Inscriptional_Pahlavi',\n        astral: '\\uD802[\\uDF60-\\uDF72\\uDF78-\\uDF7F]'\n    }, {\n        name: 'Inscriptional_Parthian',\n        astral: '\\uD802[\\uDF40-\\uDF55\\uDF58-\\uDF5F]'\n    }, {\n        name: 'Javanese',\n        bmp: '\\uA980-\\uA9CD\\uA9D0-\\uA9D9\\uA9DE\\uA9DF'\n    }, {\n        name: 'Kaithi',\n        astral: '\\uD804[\\uDC80-\\uDCC1]'\n    }, {\n        name: 'Kannada',\n        bmp: '\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2'\n    }, {\n        name: 'Katakana',\n        bmp: '\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D',\n        astral: '\\uD82C\\uDC00'\n    }, {\n        name: 'Kayah_Li',\n        bmp: '\\uA900-\\uA92D\\uA92F'\n    }, {\n        name: 'Kharoshthi',\n        astral: '\\uD802[\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F-\\uDE47\\uDE50-\\uDE58]'\n    }, {\n        name: 'Khmer',\n        bmp: '\\u1780-\\u17DD\\u17E0-\\u17E9\\u17F0-\\u17F9\\u19E0-\\u19FF'\n    }, {\n        name: 'Khojki',\n        astral: '\\uD804[\\uDE00-\\uDE11\\uDE13-\\uDE3E]'\n    }, {\n        name: 'Khudawadi',\n        astral: '\\uD804[\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9]'\n    }, {\n        name: 'Lao',\n        bmp: '\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF'\n    }, {\n        name: 'Latin',\n        bmp: 'A-Za-z\\xAA\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02B8\\u02E0-\\u02E4\\u1D00-\\u1D25\\u1D2C-\\u1D5C\\u1D62-\\u1D65\\u1D6B-\\u1D77\\u1D79-\\u1DBE\\u1E00-\\u1EFF\\u2071\\u207F\\u2090-\\u209C\\u212A\\u212B\\u2132\\u214E\\u2160-\\u2188\\u2C60-\\u2C7F\\uA722-\\uA787\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA7FF\\uAB30-\\uAB5A\\uAB5C-\\uAB64\\uFB00-\\uFB06\\uFF21-\\uFF3A\\uFF41-\\uFF5A'\n    }, {\n        name: 'Lepcha',\n        bmp: '\\u1C00-\\u1C37\\u1C3B-\\u1C49\\u1C4D-\\u1C4F'\n    }, {\n        name: 'Limbu',\n        bmp: '\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1940\\u1944-\\u194F'\n    }, {\n        name: 'Linear_A',\n        astral: '\\uD801[\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]'\n    }, {\n        name: 'Linear_B',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA]'\n    }, {\n        name: 'Lisu',\n        bmp: '\\uA4D0-\\uA4FF'\n    }, {\n        name: 'Lycian',\n        astral: '\\uD800[\\uDE80-\\uDE9C]'\n    }, {\n        name: 'Lydian',\n        astral: '\\uD802[\\uDD20-\\uDD39\\uDD3F]'\n    }, {\n        name: 'Mahajani',\n        astral: '\\uD804[\\uDD50-\\uDD76]'\n    }, {\n        name: 'Malayalam',\n        bmp: '\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4F\\u0D54-\\u0D63\\u0D66-\\u0D7F'\n    }, {\n        name: 'Mandaic',\n        bmp: '\\u0840-\\u085B\\u085E'\n    }, {\n        name: 'Manichaean',\n        astral: '\\uD802[\\uDEC0-\\uDEE6\\uDEEB-\\uDEF6]'\n    }, {\n        name: 'Marchen',\n        astral: '\\uD807[\\uDC70-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]'\n    }, {\n        name: 'Meetei_Mayek',\n        bmp: '\\uAAE0-\\uAAF6\\uABC0-\\uABED\\uABF0-\\uABF9'\n    }, {\n        name: 'Mende_Kikakui',\n        astral: '\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCD6]'\n    }, {\n        name: 'Meroitic_Cursive',\n        astral: '\\uD802[\\uDDA0-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDDFF]'\n    }, {\n        name: 'Meroitic_Hieroglyphs',\n        astral: '\\uD802[\\uDD80-\\uDD9F]'\n    }, {\n        name: 'Miao',\n        astral: '\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]'\n    }, {\n        name: 'Modi',\n        astral: '\\uD805[\\uDE00-\\uDE44\\uDE50-\\uDE59]'\n    }, {\n        name: 'Mongolian',\n        bmp: '\\u1800\\u1801\\u1804\\u1806-\\u180E\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA',\n        astral: '\\uD805[\\uDE60-\\uDE6C]'\n    }, {\n        name: 'Mro',\n        astral: '\\uD81A[\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE6E\\uDE6F]'\n    }, {\n        name: 'Multani',\n        astral: '\\uD804[\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA9]'\n    }, {\n        name: 'Myanmar',\n        bmp: '\\u1000-\\u109F\\uA9E0-\\uA9FE\\uAA60-\\uAA7F'\n    }, {\n        name: 'Nabataean',\n        astral: '\\uD802[\\uDC80-\\uDC9E\\uDCA7-\\uDCAF]'\n    }, {\n        name: 'New_Tai_Lue',\n        bmp: '\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u19DE\\u19DF'\n    }, {\n        name: 'Newa',\n        astral: '\\uD805[\\uDC00-\\uDC59\\uDC5B\\uDC5D]'\n    }, {\n        name: 'Nko',\n        bmp: '\\u07C0-\\u07FA'\n    }, {\n        name: 'Ogham',\n        bmp: '\\u1680-\\u169C'\n    }, {\n        name: 'Ol_Chiki',\n        bmp: '\\u1C50-\\u1C7F'\n    }, {\n        name: 'Old_Hungarian',\n        astral: '\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDCFF]'\n    }, {\n        name: 'Old_Italic',\n        astral: '\\uD800[\\uDF00-\\uDF23]'\n    }, {\n        name: 'Old_North_Arabian',\n        astral: '\\uD802[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'Old_Permic',\n        astral: '\\uD800[\\uDF50-\\uDF7A]'\n    }, {\n        name: 'Old_Persian',\n        astral: '\\uD800[\\uDFA0-\\uDFC3\\uDFC8-\\uDFD5]'\n    }, {\n        name: 'Old_South_Arabian',\n        astral: '\\uD802[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'Old_Turkic',\n        astral: '\\uD803[\\uDC00-\\uDC48]'\n    }, {\n        name: 'Oriya',\n        bmp: '\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B77'\n    }, {\n        name: 'Osage',\n        astral: '\\uD801[\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB]'\n    }, {\n        name: 'Osmanya',\n        astral: '\\uD801[\\uDC80-\\uDC9D\\uDCA0-\\uDCA9]'\n    }, {\n        name: 'Pahawh_Hmong',\n        astral: '\\uD81A[\\uDF00-\\uDF45\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]'\n    }, {\n        name: 'Palmyrene',\n        astral: '\\uD802[\\uDC60-\\uDC7F]'\n    }, {\n        name: 'Pau_Cin_Hau',\n        astral: '\\uD806[\\uDEC0-\\uDEF8]'\n    }, {\n        name: 'Phags_Pa',\n        bmp: '\\uA840-\\uA877'\n    }, {\n        name: 'Phoenician',\n        astral: '\\uD802[\\uDD00-\\uDD1B\\uDD1F]'\n    }, {\n        name: 'Psalter_Pahlavi',\n        astral: '\\uD802[\\uDF80-\\uDF91\\uDF99-\\uDF9C\\uDFA9-\\uDFAF]'\n    }, {\n        name: 'Rejang',\n        bmp: '\\uA930-\\uA953\\uA95F'\n    }, {\n        name: 'Runic',\n        bmp: '\\u16A0-\\u16EA\\u16EE-\\u16F8'\n    }, {\n        name: 'Samaritan',\n        bmp: '\\u0800-\\u082D\\u0830-\\u083E'\n    }, {\n        name: 'Saurashtra',\n        bmp: '\\uA880-\\uA8C5\\uA8CE-\\uA8D9'\n    }, {\n        name: 'Sharada',\n        astral: '\\uD804[\\uDD80-\\uDDCD\\uDDD0-\\uDDDF]'\n    }, {\n        name: 'Shavian',\n        astral: '\\uD801[\\uDC50-\\uDC7F]'\n    }, {\n        name: 'Siddham',\n        astral: '\\uD805[\\uDD80-\\uDDB5\\uDDB8-\\uDDDD]'\n    }, {\n        name: 'SignWriting',\n        astral: '\\uD836[\\uDC00-\\uDE8B\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]'\n    }, {\n        name: 'Sinhala',\n        bmp: '\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2-\\u0DF4',\n        astral: '\\uD804[\\uDDE1-\\uDDF4]'\n    }, {\n        name: 'Sora_Sompeng',\n        astral: '\\uD804[\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9]'\n    }, {\n        name: 'Sundanese',\n        bmp: '\\u1B80-\\u1BBF\\u1CC0-\\u1CC7'\n    }, {\n        name: 'Syloti_Nagri',\n        bmp: '\\uA800-\\uA82B'\n    }, {\n        name: 'Syriac',\n        bmp: '\\u0700-\\u070D\\u070F-\\u074A\\u074D-\\u074F'\n    }, {\n        name: 'Tagalog',\n        bmp: '\\u1700-\\u170C\\u170E-\\u1714'\n    }, {\n        name: 'Tagbanwa',\n        bmp: '\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773'\n    }, {\n        name: 'Tai_Le',\n        bmp: '\\u1950-\\u196D\\u1970-\\u1974'\n    }, {\n        name: 'Tai_Tham',\n        bmp: '\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA0-\\u1AAD'\n    }, {\n        name: 'Tai_Viet',\n        bmp: '\\uAA80-\\uAAC2\\uAADB-\\uAADF'\n    }, {\n        name: 'Takri',\n        astral: '\\uD805[\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]'\n    }, {\n        name: 'Tamil',\n        bmp: '\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BFA'\n    }, {\n        name: 'Tangut',\n        astral: '\\uD81B\\uDFE0|[\\uD81C-\\uD820][\\uDC00-\\uDFFF]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]'\n    }, {\n        name: 'Telugu',\n        bmp: '\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C78-\\u0C7F'\n    }, {\n        name: 'Thaana',\n        bmp: '\\u0780-\\u07B1'\n    }, {\n        name: 'Thai',\n        bmp: '\\u0E01-\\u0E3A\\u0E40-\\u0E5B'\n    }, {\n        name: 'Tibetan',\n        bmp: '\\u0F00-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F97\\u0F99-\\u0FBC\\u0FBE-\\u0FCC\\u0FCE-\\u0FD4\\u0FD9\\u0FDA'\n    }, {\n        name: 'Tifinagh',\n        bmp: '\\u2D30-\\u2D67\\u2D6F\\u2D70\\u2D7F'\n    }, {\n        name: 'Tirhuta',\n        astral: '\\uD805[\\uDC80-\\uDCC7\\uDCD0-\\uDCD9]'\n    }, {\n        name: 'Ugaritic',\n        astral: '\\uD800[\\uDF80-\\uDF9D\\uDF9F]'\n    }, {\n        name: 'Vai',\n        bmp: '\\uA500-\\uA62B'\n    }, {\n        name: 'Warang_Citi',\n        astral: '\\uD806[\\uDCA0-\\uDCF2\\uDCFF]'\n    }, {\n        name: 'Yi',\n        bmp: '\\uA000-\\uA48C\\uA490-\\uA4C6'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"cbvm\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _xregexp = require('./xregexp');\n\nvar _xregexp2 = _interopRequireDefault(_xregexp);\n\nvar _build = require('./addons/build');\n\nvar _build2 = _interopRequireDefault(_build);\n\nvar _matchrecursive = require('./addons/matchrecursive');\n\nvar _matchrecursive2 = _interopRequireDefault(_matchrecursive);\n\nvar _unicodeBase = require('./addons/unicode-base');\n\nvar _unicodeBase2 = _interopRequireDefault(_unicodeBase);\n\nvar _unicodeBlocks = require('./addons/unicode-blocks');\n\nvar _unicodeBlocks2 = _interopRequireDefault(_unicodeBlocks);\n\nvar _unicodeCategories = require('./addons/unicode-categories');\n\nvar _unicodeCategories2 = _interopRequireDefault(_unicodeCategories);\n\nvar _unicodeProperties = require('./addons/unicode-properties');\n\nvar _unicodeProperties2 = _interopRequireDefault(_unicodeProperties);\n\nvar _unicodeScripts = require('./addons/unicode-scripts');\n\nvar _unicodeScripts2 = _interopRequireDefault(_unicodeScripts);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _build2.default)(_xregexp2.default);\n(0, _matchrecursive2.default)(_xregexp2.default);\n(0, _unicodeBase2.default)(_xregexp2.default);\n(0, _unicodeBlocks2.default)(_xregexp2.default);\n(0, _unicodeCategories2.default)(_xregexp2.default);\n(0, _unicodeProperties2.default)(_xregexp2.default);\n(0, _unicodeScripts2.default)(_xregexp2.default);\n\nexports.default = _xregexp2.default;\nmodule.exports = exports['default'];\n},{\"./xregexp\":\"o9ca\",\"./addons/build\":\"TuVf\",\"./addons/matchrecursive\":\"rFFh\",\"./addons/unicode-base\":\"GjMy\",\"./addons/unicode-blocks\":\"yn8j\",\"./addons/unicode-categories\":\"WZpi\",\"./addons/unicode-properties\":\"VzkP\",\"./addons/unicode-scripts\":\"Fwp9\"}],\"lX2y\":[function(require,module,exports) {\n'use strict';\n\nconst xRegExp = require('xregexp');\n\nmodule.exports = (text, separator) => {\n  if (typeof text !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n\n  separator = typeof separator === 'undefined' ? '_' : separator;\n  const regex1 = xRegExp('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n  const regex2 = xRegExp('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n  return text // TODO: Use this instead of `xregexp` when targeting Node.js 10:\n  // .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n  // .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n  .replace(regex1, \"$1\".concat(separator, \"$2\")).replace(regex2, \"$1\".concat(separator, \"$2\")).toLowerCase();\n};\n},{\"xregexp\":\"cbvm\"}],\"YitK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createElement = createElement;\nexports.mount = mount;\n\nvar _decamelize = _interopRequireWildcard(require(\"decamelize\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n//handle es6 / bundling\nconst decamelize = _decamelize['default'] || _decamelize;\n\nfunction createElement(tag, attrs, ...children) {\n  if (typeof tag === 'function') {\n    const fn = tag;\n    const props = attrs;\n    props.children = children;\n    return fn(props);\n  } else {\n    const el = document.createElement(tag);\n    const map = attrs;\n\n    for (let name in map) {\n      if (name && map.hasOwnProperty(name)) {\n        let value = map[name];\n\n        if (name === 'className' && value !== void 0) {\n          el.setAttribute('class', value.toString());\n        } else if (value === false || value === null || value === undefined) {\n          continue;\n        } else if (value === true) {\n          el.setAttribute(name, name);\n        } else if (typeof value === 'function') {\n          el[name.toLowerCase()] = value;\n        } else if (typeof value === 'object') {\n          el.setAttribute(name, flatten(value));\n        } else {\n          el.setAttribute(name, value.toString());\n        }\n      }\n    }\n\n    if (children && children.length > 0) {\n      appendChildren(el, children);\n    }\n\n    return el;\n  }\n}\n\nfunction flatten(o) {\n  const arr = [];\n\n  for (let prop in o) arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n\n  return arr.join(';');\n}\n\nfunction addChild(parentElement, child) {\n  if (child === null || child === undefined || typeof child === \"boolean\") {\n    return;\n  } else if (Array.isArray(child)) {\n    appendChildren(parentElement, child);\n  } else if (isElement(child)) {\n    parentElement.appendChild(child);\n  } else {\n    parentElement.appendChild(document.createTextNode(child.toString()));\n  }\n}\n\nfunction appendChildren(parentElement, children) {\n  children.forEach(child => addChild(parentElement, child));\n}\n\nfunction isElement(el) {\n  //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n  return !!el.nodeType;\n}\n\nfunction mount(element, container) {\n  const activeChildPositions = getActiveChildPositions(container);\n  container.innerHTML = '';\n\n  if (element) {\n    addChild(container, element);\n    if (activeChildPositions) focusChildAtPosition(container, activeChildPositions);\n  }\n}\n\nfunction focusChildAtPosition(element, childPositions) {\n  while (element && childPositions.length) element = element.children.item(childPositions.shift());\n\n  if (element) element.focus();\n}\n\nfunction getActiveChildPositions(containerElement) {\n  var active = document.activeElement;\n  var childPositions = [];\n\n  while (active !== document.body && active !== containerElement) {\n    childPositions.unshift(childPosition(active));\n    active = active.parentElement;\n  }\n\n  if (active === containerElement && childPositions.length) return childPositions;\n}\n\nfunction childPosition(element) {\n  let i = 0;\n\n  while (element = element.previousElementSibling) i++;\n\n  return i;\n}\n},{\"decamelize\":\"lX2y\"}],\"KmGS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Table = void 0;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst KeyCodes = {\n  ENTER: 13\n};\n\nconst Table = props => {\n  return (0, _tsxCreateElement.createElement)(\"table\", {\n    className: props.className\n  }, props.children, props.rows.map((row, i) => (0, _tsxCreateElement.createElement)(\"tr\", {\n    className: props.rowClassName || '',\n    onClick: e => props.onRowClick && props.onRowClick(e, i),\n    tabIndex: props.onRowClick ? 0 : -1,\n    onKeyUp: e => {\n      if (e.keyCode === KeyCodes.ENTER && props.onRowClick) {\n        props.onRowClick(e, i);\n      }\n    }\n  }, row.cells.map((cell, i) => (0, _tsxCreateElement.createElement)(\"td\", {\n    className: cell.className || '',\n    title: cell.title || ''\n  }, cell.content)))));\n};\n\nexports.Table = Table;\n},{\"tsx-create-element\":\"YitK\"}],\"kUTU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Table\", {\n  enumerable: true,\n  get: function () {\n    return _controls.Table;\n  }\n});\n\nvar _controls = require(\"../controls\");\n},{\"../controls\":\"KmGS\"}],\"dNRs\":[function(require,module,exports) {\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n},{}],\"i6BN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.addEl = addEl;\nexports.addDiv = addDiv;\nexports.outerSize = outerSize;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Create a new element as a child of another element.\n * @param tagName Tag name of the new tag to create.\n * @param parentElement Reference of the element to append to.\n * @returns new HTMLElement.\n */\nfunction addEl(tagName, parentElement) {\n  const el = document.createElement(tagName);\n  parentElement.appendChild(el);\n  return el;\n}\n/**\n * Create a new div HTMLElement as a child of another element.\n * @param parentElement Reference of the element to append to.\n * @param className Optional css class name to apply to the div.\n */\n\n\nfunction addDiv(parentElement, className) {\n  const div = addEl('div', parentElement);\n\n  if (className) {\n    div.className = className;\n  }\n\n  return div;\n}\n/**\n * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n * @param el HTML Element to measure.\n */\n\n\nfunction outerSize(el) {\n  const cs = getComputedStyle(el);\n  const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n  const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n  return {\n    height,\n    width\n  };\n}\n},{}],\"hgzN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar isMergeableObject = function isMergeableObject(value) {\n  return isNonNullObject(value) && !isSpecial(value);\n};\n\nfunction isNonNullObject(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isSpecial(value) {\n  var stringValue = Object.prototype.toString.call(value);\n  return stringValue === '[object RegExp]' || stringValue === '[object Date]' || isReactElement(value);\n} // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n\n\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n  return value.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nfunction emptyTarget(val) {\n  return Array.isArray(val) ? [] : {};\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n  return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value;\n}\n\nfunction defaultArrayMerge(target, source, options) {\n  return target.concat(source).map(function (element) {\n    return cloneUnlessOtherwiseSpecified(element, options);\n  });\n}\n\nfunction mergeObject(target, source, options) {\n  var destination = {};\n\n  if (options.isMergeableObject(target)) {\n    Object.keys(target).forEach(function (key) {\n      destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    });\n  }\n\n  Object.keys(source).forEach(function (key) {\n    if (!options.isMergeableObject(source[key]) || !target[key]) {\n      destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    } else {\n      destination[key] = deepmerge(target[key], source[key], options);\n    }\n  });\n  return destination;\n}\n\nfunction deepmerge(target, source, options) {\n  options = options || {};\n  options.arrayMerge = options.arrayMerge || defaultArrayMerge;\n  options.isMergeableObject = options.isMergeableObject || isMergeableObject;\n  var sourceIsArray = Array.isArray(source);\n  var targetIsArray = Array.isArray(target);\n  var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n  if (!sourceAndTargetTypesMatch) {\n    return cloneUnlessOtherwiseSpecified(source, options);\n  } else if (sourceIsArray) {\n    return options.arrayMerge(target, source, options);\n  } else {\n    return mergeObject(target, source, options);\n  }\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n  if (!Array.isArray(array)) {\n    throw new Error('first argument should be an array');\n  }\n\n  return array.reduce(function (prev, next) {\n    return deepmerge(prev, next, options);\n  }, {});\n};\n\nvar deepmerge_1 = deepmerge;\nvar _default = deepmerge_1;\nexports.default = _default;\n},{}],\"Jcn2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.clone = clone;\nexports.deepMerge = deepMerge;\n\nvar _deepmerge = _interopRequireWildcard(require(\"deepmerge\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst deepmerge = _deepmerge.default || _deepmerge;\n\nfunction clone(objectToClone) {\n  if (!objectToClone) return objectToClone;\n  return deepmerge.all([objectToClone]);\n}\n\nconst dontMerge = (destination, source) => source;\n\nfunction deepMerge(...objectsToMerge) {\n  const objects = objectsToMerge.filter(Boolean);\n  return deepmerge.all(objects, {\n    arrayMerge: dontMerge\n  });\n}\n},{\"deepmerge\":\"hgzN\"}],\"b3Bm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.extend = extend;\n\nfunction _default(constructor, factory, prototype) {\n  constructor.prototype = factory.prototype = prototype;\n  prototype.constructor = constructor;\n}\n\nfunction extend(parent, definition) {\n  var prototype = Object.create(parent.prototype);\n\n  for (var key in definition) prototype[key] = definition[key];\n\n  return prototype;\n}\n},{}],\"NpVm\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Color = Color;\nexports.default = color;\nexports.rgbConvert = rgbConvert;\nexports.rgb = rgb;\nexports.Rgb = Rgb;\nexports.hslConvert = hslConvert;\nexports.hsl = hsl;\nexports.brighter = exports.darker = void 0;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction Color() {}\n\nvar darker = 0.7;\nexports.darker = darker;\nvar brighter = 1 / darker;\nexports.brighter = brighter;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n    reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n    reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n    reHex = /^#([0-9a-f]{3,8})$/,\n    reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n    reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n    reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n    reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n    reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n    reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\nvar named = {\n  aliceblue: 0xf0f8ff,\n  antiquewhite: 0xfaebd7,\n  aqua: 0x00ffff,\n  aquamarine: 0x7fffd4,\n  azure: 0xf0ffff,\n  beige: 0xf5f5dc,\n  bisque: 0xffe4c4,\n  black: 0x000000,\n  blanchedalmond: 0xffebcd,\n  blue: 0x0000ff,\n  blueviolet: 0x8a2be2,\n  brown: 0xa52a2a,\n  burlywood: 0xdeb887,\n  cadetblue: 0x5f9ea0,\n  chartreuse: 0x7fff00,\n  chocolate: 0xd2691e,\n  coral: 0xff7f50,\n  cornflowerblue: 0x6495ed,\n  cornsilk: 0xfff8dc,\n  crimson: 0xdc143c,\n  cyan: 0x00ffff,\n  darkblue: 0x00008b,\n  darkcyan: 0x008b8b,\n  darkgoldenrod: 0xb8860b,\n  darkgray: 0xa9a9a9,\n  darkgreen: 0x006400,\n  darkgrey: 0xa9a9a9,\n  darkkhaki: 0xbdb76b,\n  darkmagenta: 0x8b008b,\n  darkolivegreen: 0x556b2f,\n  darkorange: 0xff8c00,\n  darkorchid: 0x9932cc,\n  darkred: 0x8b0000,\n  darksalmon: 0xe9967a,\n  darkseagreen: 0x8fbc8f,\n  darkslateblue: 0x483d8b,\n  darkslategray: 0x2f4f4f,\n  darkslategrey: 0x2f4f4f,\n  darkturquoise: 0x00ced1,\n  darkviolet: 0x9400d3,\n  deeppink: 0xff1493,\n  deepskyblue: 0x00bfff,\n  dimgray: 0x696969,\n  dimgrey: 0x696969,\n  dodgerblue: 0x1e90ff,\n  firebrick: 0xb22222,\n  floralwhite: 0xfffaf0,\n  forestgreen: 0x228b22,\n  fuchsia: 0xff00ff,\n  gainsboro: 0xdcdcdc,\n  ghostwhite: 0xf8f8ff,\n  gold: 0xffd700,\n  goldenrod: 0xdaa520,\n  gray: 0x808080,\n  green: 0x008000,\n  greenyellow: 0xadff2f,\n  grey: 0x808080,\n  honeydew: 0xf0fff0,\n  hotpink: 0xff69b4,\n  indianred: 0xcd5c5c,\n  indigo: 0x4b0082,\n  ivory: 0xfffff0,\n  khaki: 0xf0e68c,\n  lavender: 0xe6e6fa,\n  lavenderblush: 0xfff0f5,\n  lawngreen: 0x7cfc00,\n  lemonchiffon: 0xfffacd,\n  lightblue: 0xadd8e6,\n  lightcoral: 0xf08080,\n  lightcyan: 0xe0ffff,\n  lightgoldenrodyellow: 0xfafad2,\n  lightgray: 0xd3d3d3,\n  lightgreen: 0x90ee90,\n  lightgrey: 0xd3d3d3,\n  lightpink: 0xffb6c1,\n  lightsalmon: 0xffa07a,\n  lightseagreen: 0x20b2aa,\n  lightskyblue: 0x87cefa,\n  lightslategray: 0x778899,\n  lightslategrey: 0x778899,\n  lightsteelblue: 0xb0c4de,\n  lightyellow: 0xffffe0,\n  lime: 0x00ff00,\n  limegreen: 0x32cd32,\n  linen: 0xfaf0e6,\n  magenta: 0xff00ff,\n  maroon: 0x800000,\n  mediumaquamarine: 0x66cdaa,\n  mediumblue: 0x0000cd,\n  mediumorchid: 0xba55d3,\n  mediumpurple: 0x9370db,\n  mediumseagreen: 0x3cb371,\n  mediumslateblue: 0x7b68ee,\n  mediumspringgreen: 0x00fa9a,\n  mediumturquoise: 0x48d1cc,\n  mediumvioletred: 0xc71585,\n  midnightblue: 0x191970,\n  mintcream: 0xf5fffa,\n  mistyrose: 0xffe4e1,\n  moccasin: 0xffe4b5,\n  navajowhite: 0xffdead,\n  navy: 0x000080,\n  oldlace: 0xfdf5e6,\n  olive: 0x808000,\n  olivedrab: 0x6b8e23,\n  orange: 0xffa500,\n  orangered: 0xff4500,\n  orchid: 0xda70d6,\n  palegoldenrod: 0xeee8aa,\n  palegreen: 0x98fb98,\n  paleturquoise: 0xafeeee,\n  palevioletred: 0xdb7093,\n  papayawhip: 0xffefd5,\n  peachpuff: 0xffdab9,\n  peru: 0xcd853f,\n  pink: 0xffc0cb,\n  plum: 0xdda0dd,\n  powderblue: 0xb0e0e6,\n  purple: 0x800080,\n  rebeccapurple: 0x663399,\n  red: 0xff0000,\n  rosybrown: 0xbc8f8f,\n  royalblue: 0x4169e1,\n  saddlebrown: 0x8b4513,\n  salmon: 0xfa8072,\n  sandybrown: 0xf4a460,\n  seagreen: 0x2e8b57,\n  seashell: 0xfff5ee,\n  sienna: 0xa0522d,\n  silver: 0xc0c0c0,\n  skyblue: 0x87ceeb,\n  slateblue: 0x6a5acd,\n  slategray: 0x708090,\n  slategrey: 0x708090,\n  snow: 0xfffafa,\n  springgreen: 0x00ff7f,\n  steelblue: 0x4682b4,\n  tan: 0xd2b48c,\n  teal: 0x008080,\n  thistle: 0xd8bfd8,\n  tomato: 0xff6347,\n  turquoise: 0x40e0d0,\n  violet: 0xee82ee,\n  wheat: 0xf5deb3,\n  white: 0xffffff,\n  whitesmoke: 0xf5f5f5,\n  yellow: 0xffff00,\n  yellowgreen: 0x9acd32\n};\n(0, _define.default)(Color, color, {\n  copy: function (channels) {\n    return Object.assign(new this.constructor(), this, channels);\n  },\n  displayable: function () {\n    return this.rgb().displayable();\n  },\n  hex: color_formatHex,\n  // Deprecated! Use color.formatHex.\n  formatHex: color_formatHex,\n  formatHsl: color_formatHsl,\n  formatRgb: color_formatRgb,\n  toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n  return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n  return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n  return this.rgb().formatRgb();\n}\n\nfunction color(format) {\n  var m, l;\n  format = (format + \"\").trim().toLowerCase();\n  return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n  : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n  : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n  : l === 4 ? new Rgb(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n  : null // invalid hex\n  ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n  : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n  : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n  : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n  : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n  : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n  : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n  : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\n\nfunction rgbn(n) {\n  return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n  if (a <= 0) r = g = b = NaN;\n  return new Rgb(r, g, b, a);\n}\n\nfunction rgbConvert(o) {\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Rgb();\n  o = o.rgb();\n  return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nfunction rgb(r, g, b, opacity) {\n  return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nfunction Rgb(r, g, b, opacity) {\n  this.r = +r;\n  this.g = +g;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Rgb, rgb, (0, _define.extend)(Color, {\n  brighter: function (k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  rgb: function () {\n    return this;\n  },\n  displayable: function () {\n    return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n  },\n  hex: rgb_formatHex,\n  // Deprecated! Use color.formatHex.\n  formatHex: rgb_formatHex,\n  formatRgb: rgb_formatRgb,\n  toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n  return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n  var a = this.opacity;\n  a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n  return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n  value = Math.max(0, Math.min(255, Math.round(value) || 0));\n  return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n  if (a <= 0) h = s = l = NaN;else if (l <= 0 || l >= 1) h = s = NaN;else if (s <= 0) h = NaN;\n  return new Hsl(h, s, l, a);\n}\n\nfunction hslConvert(o) {\n  if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Hsl();\n  if (o instanceof Hsl) return o;\n  o = o.rgb();\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      h = NaN,\n      s = max - min,\n      l = (max + min) / 2;\n\n  if (s) {\n    if (r === max) h = (g - b) / s + (g < b) * 6;else if (g === max) h = (b - r) / s + 2;else h = (r - g) / s + 4;\n    s /= l < 0.5 ? max + min : 2 - max - min;\n    h *= 60;\n  } else {\n    s = l > 0 && l < 1 ? 0 : h;\n  }\n\n  return new Hsl(h, s, l, o.opacity);\n}\n\nfunction hsl(h, s, l, opacity) {\n  return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Hsl, hsl, (0, _define.extend)(Color, {\n  brighter: function (k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function () {\n    var h = this.h % 360 + (this.h < 0) * 360,\n        s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n        l = this.l,\n        m2 = l + (l < 0.5 ? l : 1 - l) * s,\n        m1 = 2 * l - m2;\n    return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n  },\n  displayable: function () {\n    return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n  },\n  formatHsl: function () {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n  }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */\n\nfunction hsl2rgb(h, m1, m2) {\n  return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n},{\"./define.js\":\"b3Bm\"}],\"ilvo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.rad2deg = exports.deg2rad = void 0;\nvar deg2rad = Math.PI / 180;\nexports.deg2rad = deg2rad;\nvar rad2deg = 180 / Math.PI;\nexports.rad2deg = rad2deg;\n},{}],\"cyp8\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.gray = gray;\nexports.default = lab;\nexports.Lab = Lab;\nexports.lch = lch;\nexports.hcl = hcl;\nexports.Hcl = Hcl;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nvar _color = require(\"./color.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n    Xn = 0.96422,\n    Yn = 1,\n    Zn = 0.82521,\n    t0 = 4 / 29,\n    t1 = 6 / 29,\n    t2 = 3 * t1 * t1,\n    t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n  if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n  if (o instanceof Hcl) return hcl2lab(o);\n  if (!(o instanceof _color.Rgb)) o = (0, _color.rgbConvert)(o);\n  var r = rgb2lrgb(o.r),\n      g = rgb2lrgb(o.g),\n      b = rgb2lrgb(o.b),\n      y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn),\n      x,\n      z;\n  if (r === g && g === b) x = z = y;else {\n    x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n    z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n  }\n  return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nfunction gray(l, opacity) {\n  return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nfunction lab(l, a, b, opacity) {\n  return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nfunction Lab(l, a, b, opacity) {\n  this.l = +l;\n  this.a = +a;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Lab, lab, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n  },\n  darker: function (k) {\n    return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n  },\n  rgb: function () {\n    var y = (this.l + 16) / 116,\n        x = isNaN(this.a) ? y : y + this.a / 500,\n        z = isNaN(this.b) ? y : y - this.b / 200;\n    x = Xn * lab2xyz(x);\n    y = Yn * lab2xyz(y);\n    z = Zn * lab2xyz(z);\n    return new _color.Rgb(lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity);\n  }\n}));\n\nfunction xyz2lab(t) {\n  return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n  return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n  return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n  return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n  if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n  if (!(o instanceof Lab)) o = labConvert(o);\n  if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n\n  var h = Math.atan2(o.b, o.a) * _math.rad2deg;\n\n  return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nfunction lch(l, c, h, opacity) {\n  return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction hcl(h, c, l, opacity) {\n  return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hcl(h, c, l, opacity) {\n  this.h = +h;\n  this.c = +c;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n  if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n  var h = o.h * _math.deg2rad;\n  return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\n(0, _define.default)(Hcl, hcl, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n  },\n  darker: function (k) {\n    return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n  },\n  rgb: function () {\n    return hcl2lab(this).rgb();\n  }\n}));\n},{\"./define.js\":\"b3Bm\",\"./color.js\":\"NpVm\",\"./math.js\":\"ilvo\"}],\"cAuQ\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cubehelix;\nexports.Cubehelix = Cubehelix;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nvar _color = require(\"./color.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar A = -0.14861,\n    B = +1.78277,\n    C = -0.29227,\n    D = -0.90649,\n    E = +1.97294,\n    ED = E * D,\n    EB = E * B,\n    BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n  if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof _color.Rgb)) o = (0, _color.rgbConvert)(o);\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n      bl = b - l,\n      k = (E * (g - l) - C * bl) / D,\n      s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)),\n      // NaN if l=0 or l=1\n  h = s ? Math.atan2(k, bl) * _math.rad2deg - 120 : NaN;\n  return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nfunction cubehelix(h, s, l, opacity) {\n  return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Cubehelix(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Cubehelix, cubehelix, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    k = k == null ? _color.brighter : Math.pow(_color.brighter, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? _color.darker : Math.pow(_color.darker, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function () {\n    var h = isNaN(this.h) ? 0 : (this.h + 120) * _math.deg2rad,\n        l = +this.l,\n        a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n        cosh = Math.cos(h),\n        sinh = Math.sin(h);\n    return new _color.Rgb(255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity);\n  }\n}));\n},{\"./define.js\":\"b3Bm\",\"./color.js\":\"NpVm\",\"./math.js\":\"ilvo\"}],\"Mwak\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"color\", {\n  enumerable: true,\n  get: function () {\n    return _color.default;\n  }\n});\nObject.defineProperty(exports, \"rgb\", {\n  enumerable: true,\n  get: function () {\n    return _color.rgb;\n  }\n});\nObject.defineProperty(exports, \"hsl\", {\n  enumerable: true,\n  get: function () {\n    return _color.hsl;\n  }\n});\nObject.defineProperty(exports, \"lab\", {\n  enumerable: true,\n  get: function () {\n    return _lab.default;\n  }\n});\nObject.defineProperty(exports, \"hcl\", {\n  enumerable: true,\n  get: function () {\n    return _lab.hcl;\n  }\n});\nObject.defineProperty(exports, \"lch\", {\n  enumerable: true,\n  get: function () {\n    return _lab.lch;\n  }\n});\nObject.defineProperty(exports, \"gray\", {\n  enumerable: true,\n  get: function () {\n    return _lab.gray;\n  }\n});\nObject.defineProperty(exports, \"cubehelix\", {\n  enumerable: true,\n  get: function () {\n    return _cubehelix.default;\n  }\n});\n\nvar _color = _interopRequireWildcard(require(\"./color.js\"));\n\nvar _lab = _interopRequireWildcard(require(\"./lab.js\"));\n\nvar _cubehelix = _interopRequireDefault(require(\"./cubehelix.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./color.js\":\"NpVm\",\"./lab.js\":\"cyp8\",\"./cubehelix.js\":\"cAuQ\"}],\"j7Ij\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.colorIsEqual = colorIsEqual;\nexports.colorFromString = colorFromString;\nexports.colorToString = colorToString;\nexports.desaturate = desaturate;\nexports.isColor = isColor;\n\nvar _d3Color = require(\"d3-color\");\n\nfunction rgbToDeckglColor(c) {\n  return [c.r, c.g, c.b, c.opacity * 255];\n}\n/**\n * Compares 2 colors to see if they are equal.\n * @param a Color to compare\n * @param b Color to compare\n * @returns True if colors are equal.\n */\n\n\nfunction colorIsEqual(a, b) {\n  if (a.length !== b.length) return false;\n\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return false;\n  }\n\n  return true;\n}\n/**\n * Convert a CSS color string to a Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n */\n\n\nfunction colorFromString(cssColorSpecifier) {\n  if (cssColorSpecifier) {\n    const dc = (0, _d3Color.color)(cssColorSpecifier);\n\n    if (dc) {\n      const c = dc.rgb();\n      return rgbToDeckglColor(c);\n    }\n  }\n}\n/**\n * Convert a Deck.gl color to a CSS rgba() string.\n * @param color A Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n */\n\n\nfunction colorToString(color) {\n  const c = [...color];\n\n  if (c.length > 3) {\n    c[3] /= 255;\n  }\n\n  return `rgba(${c.join(',')})`;\n}\n\nfunction desaturate(color, value) {\n  const rgb = (0, _d3Color.rgb)(color[0], color[1], color[2], color[3] / 255);\n  const hslColor = (0, _d3Color.hsl)(rgb);\n  hslColor.s = value;\n  const c = hslColor.rgb();\n  return rgbToDeckglColor(c);\n}\n\nfunction isColor(cssColorSpecifier) {\n  return !!(0, _d3Color.color)(cssColorSpecifier);\n}\n},{\"d3-color\":\"Mwak\"}],\"To8D\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.use = use;\nexports.base = void 0;\nlet vega = {\n  CanvasHandler: null,\n  inferType: null,\n  inferTypes: null,\n  loader: null,\n  parse: null,\n  read: null,\n  renderModule: null,\n  Renderer: null,\n  sceneVisit: null,\n  scheme: null,\n  View: null\n};\nlet deck = {\n  CompositeLayer: null,\n  COORDINATE_SYSTEM: null,\n  Deck: null,\n  Layer: null,\n  LinearInterpolator: null,\n  OrbitView: null,\n  _OrbitController: null\n};\nlet layers = {\n  IconLayer: null,\n  LineLayer: null,\n  PolygonLayer: null,\n  TextLayer: null\n};\nlet luma = {\n  CubeGeometry: null,\n  fp64: null,\n  Model: null,\n  Texture2D: null\n};\n/**\n * References to dependency libraries.\n */\n\nconst base = {\n  deck,\n  layers,\n  luma,\n  vega\n};\n/**\n * Specify the dependency libraries to use for rendering.\n * @param vega Vega library.\n * @param deck deck/core library.\n * @param layers deck/layers library.\n * @param luma luma.gl library.\n */\n\nexports.base = base;\n\nfunction use(vega, deck, layers, luma) {\n  base.deck = deck;\n  base.layers = layers;\n  base.luma = luma;\n  base.vega = vega;\n}\n},{}],\"jBdf\":[function(require,module,exports) {\n'use strict';\n\nmodule.exports = TinySDF;\nmodule.exports.default = TinySDF;\n\nvar INF = 1e20;\n\nfunction TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) {\n    this.fontSize = fontSize || 24;\n    this.buffer = buffer === undefined ? 3 : buffer;\n    this.cutoff = cutoff || 0.25;\n    this.fontFamily = fontFamily || 'sans-serif';\n    this.fontWeight = fontWeight || 'normal';\n    this.radius = radius || 8;\n    var size = this.size = this.fontSize + this.buffer * 2;\n\n    this.canvas = document.createElement('canvas');\n    this.canvas.width = this.canvas.height = size;\n\n    this.ctx = this.canvas.getContext('2d');\n    this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily;\n    this.ctx.textBaseline = 'middle';\n    this.ctx.fillStyle = 'black';\n\n    // temporary arrays for the distance transform\n    this.gridOuter = new Float64Array(size * size);\n    this.gridInner = new Float64Array(size * size);\n    this.f = new Float64Array(size);\n    this.d = new Float64Array(size);\n    this.z = new Float64Array(size + 1);\n    this.v = new Int16Array(size);\n\n    // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852\n    this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1));\n}\n\nTinySDF.prototype.draw = function (char) {\n    this.ctx.clearRect(0, 0, this.size, this.size);\n    this.ctx.fillText(char, this.buffer, this.middle);\n\n    var imgData = this.ctx.getImageData(0, 0, this.size, this.size);\n    var alphaChannel = new Uint8ClampedArray(this.size * this.size);\n\n    for (var i = 0; i < this.size * this.size; i++) {\n        var a = imgData.data[i * 4 + 3] / 255; // alpha value\n        this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2);\n        this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2);\n    }\n\n    edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z);\n    edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z);\n\n    for (i = 0; i < this.size * this.size; i++) {\n        var d = this.gridOuter[i] - this.gridInner[i];\n        alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff))));\n    }\n\n    return alphaChannel;\n};\n\n// 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\nfunction edt(data, width, height, f, d, v, z) {\n    for (var x = 0; x < width; x++) {\n        for (var y = 0; y < height; y++) {\n            f[y] = data[y * width + x];\n        }\n        edt1d(f, d, v, z, height);\n        for (y = 0; y < height; y++) {\n            data[y * width + x] = d[y];\n        }\n    }\n    for (y = 0; y < height; y++) {\n        for (x = 0; x < width; x++) {\n            f[x] = data[y * width + x];\n        }\n        edt1d(f, d, v, z, width);\n        for (x = 0; x < width; x++) {\n            data[y * width + x] = Math.sqrt(d[x]);\n        }\n    }\n}\n\n// 1D squared distance transform\nfunction edt1d(f, d, v, z, n) {\n    v[0] = 0;\n    z[0] = -INF;\n    z[1] = +INF;\n\n    for (var q = 1, k = 0; q < n; q++) {\n        var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n        while (s <= z[k]) {\n            k--;\n            s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n        }\n        k++;\n        v[k] = q;\n        z[k] = s;\n        z[k + 1] = +INF;\n    }\n\n    for (q = 0, k = 0; q < n; q++) {\n        while (z[k + 1] < q) k++;\n        d[q] = (q - v[k]) * (q - v[k]) + f[v[k]];\n    }\n}\n\n},{}],\"HKAP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.makeFontAtlas = makeFontAtlas;\nexports.DEFAULT_FONT_SETTINGS = exports.DEFAULT_FONT_WEIGHT = exports.DEFAULT_FONT_FAMILY = exports.DEFAULT_CHAR_SET = void 0;\n\nvar _tinySdf = _interopRequireDefault(require(\"@mapbox/tiny-sdf\"));\n\nvar _base = require(\"../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/font-atlas.js\n\n/* global document */\nconst GL_TEXTURE_WRAP_S = 0x2802;\nconst GL_TEXTURE_WRAP_T = 0x2803;\nconst GL_CLAMP_TO_EDGE = 0x812f;\nconst MAX_CANVAS_WIDTH = 1024;\nconst BASELINE_SCALE = 0.9;\nconst HEIGHT_SCALE = 1.2;\n\nfunction getDefaultCharacterSet() {\n  const charSet = [];\n\n  for (let i = 32; i < 128; i++) {\n    charSet.push(String.fromCharCode(i));\n  }\n\n  return charSet;\n}\n\nconst DEFAULT_CHAR_SET = getDefaultCharacterSet();\nexports.DEFAULT_CHAR_SET = DEFAULT_CHAR_SET;\nconst DEFAULT_FONT_FAMILY = 'Monaco, monospace';\nexports.DEFAULT_FONT_FAMILY = DEFAULT_FONT_FAMILY;\nconst DEFAULT_FONT_WEIGHT = 'normal';\nexports.DEFAULT_FONT_WEIGHT = DEFAULT_FONT_WEIGHT;\nconst DEFAULT_FONT_SETTINGS = {\n  fontSize: 64,\n  buffer: 2,\n  sdf: false,\n  cutoff: 0.25,\n  radius: 3\n};\nexports.DEFAULT_FONT_SETTINGS = DEFAULT_FONT_SETTINGS;\n\nfunction populateAlphaChannel(alphaChannel, imageData) {\n  // populate distance value from tinySDF to image alpha channel\t\n  for (let i = 0; i < alphaChannel.length; i++) {\n    imageData.data[4 * i + 3] = alphaChannel[i];\n  }\n}\n\nfunction setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n  ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n  ctx.fillStyle = '#000';\n  ctx.textBaseline = 'alphabetic';\n  ctx.textAlign = 'left';\n}\n\nfunction buildMapping({\n  ctx,\n  fontHeight,\n  buffer,\n  characterSet,\n  maxCanvasWidth\n}) {\n  const mapping = {};\n  let row = 0;\n  let x = 0;\n  Array.from(characterSet).forEach(char => {\n    // measure texts\n    // TODO - use Advanced text metrics when they are adopted:\n    // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n    const {\n      width\n    } = ctx.measureText(char);\n\n    if (x + width + buffer * 2 > maxCanvasWidth) {\n      x = 0;\n      row++;\n    }\n\n    mapping[char] = {\n      x: x + buffer,\n      y: row * (fontHeight + buffer * 2) + buffer,\n      width,\n      height: fontHeight,\n      mask: true\n    };\n    x += width + buffer * 2;\n  });\n  const canvasHeight = (row + 1) * (fontHeight + buffer * 2);\n  return {\n    mapping,\n    canvasHeight\n  };\n}\n\nfunction makeFontAtlas(gl, fontSettings) {\n  const mergedFontSettings = Object.assign({\n    fontFamily: DEFAULT_FONT_FAMILY,\n    fontWeight: DEFAULT_FONT_WEIGHT,\n    characterSet: DEFAULT_CHAR_SET\n  }, DEFAULT_FONT_SETTINGS, fontSettings);\n  const {\n    fontFamily,\n    fontWeight,\n    characterSet,\n    fontSize,\n    buffer,\n    sdf,\n    radius,\n    cutoff\n  } = mergedFontSettings;\n  const canvas = document.createElement('canvas');\n  const ctx = canvas.getContext('2d'); // build mapping\n\n  setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n  const fontHeight = fontSize * HEIGHT_SCALE;\n  const {\n    canvasHeight,\n    mapping\n  } = buildMapping({\n    ctx,\n    fontHeight,\n    buffer,\n    characterSet,\n    maxCanvasWidth: MAX_CANVAS_WIDTH\n  });\n  canvas.width = MAX_CANVAS_WIDTH;\n  canvas.height = canvasHeight;\n  setTextStyle(ctx, fontFamily, fontSize, fontWeight); // layout characters\n\n  if (sdf) {\n    const tinySDF = new _tinySdf.default(fontSize, buffer, radius, cutoff, fontFamily, fontWeight); // used to store distance values from tinySDF\t\n\n    const imageData = ctx.createImageData(tinySDF.size, tinySDF.size);\n\n    for (const char of characterSet) {\n      populateAlphaChannel(tinySDF.draw(char), imageData);\n      ctx.putImageData(imageData, mapping[char].x - buffer, mapping[char].y - buffer);\n    }\n  } else {\n    for (const char of characterSet) {\n      ctx.fillText(char, mapping[char].x, mapping[char].y + fontSize * BASELINE_SCALE);\n    }\n  }\n\n  return {\n    scale: HEIGHT_SCALE,\n    mapping,\n    texture: new _base.base.luma.Texture2D(gl, {\n      pixels: canvas,\n      // padding is added only between the characters but not for borders\n      // enforce CLAMP_TO_EDGE to avoid any artifacts.\n      parameters: {\n        [GL_TEXTURE_WRAP_S]: GL_CLAMP_TO_EDGE,\n        [GL_TEXTURE_WRAP_T]: GL_CLAMP_TO_EDGE\n      }\n    })\n  };\n}\n},{\"@mapbox/tiny-sdf\":\"jBdf\",\"../base\":\"To8D\"}],\"w4G4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-fragment.glsl.js\nvar _default = `\\\n#define SHADER_NAME multi-icon-layer-fragment-shader\n\nprecision highp float;\n\nuniform sampler2D iconsTexture;\nuniform float buffer;\nuniform bool sdf;\n\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nconst float MIN_ALPHA = 0.05;\n\nvoid main(void) {\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\n  \n  float alpha = texColor.a;\n\n  // if enable sdf (signed distance fields)\t\n  if (sdf) {\t\n    float distance = texture2D(iconsTexture, vTextureCoords).a;\t\n    alpha = smoothstep(buffer - vGamma, buffer + vGamma, distance);\t\n  }\n\n  // Take the global opacity and the alpha from vColor into account for the alpha component\n  float a = alpha * vColor.a;\n\n  if (picking_uActive) {\n\n    // use picking color for entire rectangle\n    gl_FragColor = vec4(picking_vRGBcolor_Aselected.rgb, 1.0);\n  \n  } else {\n\n    if (a < MIN_ALPHA) {\n      discard;\n    } else {\n\n      gl_FragColor = vec4(vColor.rgb, a);\n\n      // use highlight color if this fragment belongs to the selected object.\n      bool selected = bool(picking_vRGBcolor_Aselected.a);\n      if (selected) {\n        gl_FragColor = vec4(vHighlightColor.rgb, a);\n      }\n    }\n  }\n}\n`;\nexports.default = _default;\n},{}],\"t88C\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-vertex.glsl.js\nvar _default = `\\\n#define SHADER_NAME multi-icon-layer-vertex-shader\n\nattribute vec2 positions;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute float instanceSizes;\nattribute float instanceAngles;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\nattribute vec4 instanceIconFrames;\nattribute float instanceColorModes;\nattribute vec2 instanceOffsets;\n\n// the following three attributes are for the multi-icon layer\nattribute vec2 instancePixelOffset;\nattribute vec4 instanceHighlightColors;\n\nuniform float sizeScale;\nuniform vec2 iconsTextureDim;\nuniform float gamma;\nuniform float opacity;\n\nvarying float vColorMode;\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nvec2 rotate_by_angle(vec2 vertex, float angle) {\n  float angle_radian = angle * PI / 180.0;\n  float cos_angle = cos(angle_radian);\n  float sin_angle = sin(angle_radian);\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\n  return rotationMatrix * vertex;\n}\n\nvoid main(void) {\n  vec2 iconSize = instanceIconFrames.zw;\n  // scale icon height to match instanceSize\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : instanceSizes / iconSize.y;\n\n  // scale and rotate vertex in \"pixel\" value and convert back to fraction in clipspace\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\n\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * sizeScale * instanceScale;\n  pixelOffset += instancePixelOffset;\n  pixelOffset.y *= -1.0;\n\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.0));\n  gl_Position += project_pixel_to_clipspace(pixelOffset);\n\n  vTextureCoords = mix(\n    instanceIconFrames.xy,\n    instanceIconFrames.xy + iconSize,\n    (positions.xy + 1.0) / 2.0\n  ) / iconsTextureDim;\n\n  vTextureCoords.y = 1.0 - vTextureCoords.y;\n\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\n  vHighlightColor = vec4(instanceHighlightColors.rgb, instanceHighlightColors.a * opacity) / 255.;\n\n  picking_setPickingColor(instancePickingColors);\n\n  vGamma = gamma / (sizeScale * iconSize.y);\n}\n`;\nexports.default = _default;\n},{}],\"Pvx6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MultiIconLayer = void 0;\n\nvar _chromaticMultiIconLayerFragment = _interopRequireDefault(require(\"./chromatic-multi-icon-layer-fragment.glsl\"));\n\nvar _chromaticMultiIconLayerVertex = _interopRequireDefault(require(\"./chromatic-multi-icon-layer-vertex.glsl\"));\n\nvar _base = require(\"../../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer.js\n// TODO expose as layer properties\nconst DEFAULT_GAMMA = 0.2;\nconst DEFAULT_BUFFER = 192.0 / 256;\nconst defaultProps = {\n  getShiftInQueue: {\n    type: 'accessor',\n    value: x => x.shift || 0\n  },\n  getLengthOfQueue: {\n    type: 'accessor',\n    value: x => x.len || 1\n  },\n  // 1: left, 0: middle, -1: right\n  getAnchorX: {\n    type: 'accessor',\n    value: x => x.anchorX || 0\n  },\n  // 1: top, 0: center, -1: bottom\n  getAnchorY: {\n    type: 'accessor',\n    value: x => x.anchorY || 0\n  },\n  getPixelOffset: {\n    type: 'accessor',\n    value: [0, 0]\n  },\n  // object with the same pickingIndex will be picked when any one of them is being picked\n  getPickingIndex: {\n    type: 'accessor',\n    value: x => x.objectIndex\n  }\n}; //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n\nconst UNSIGNED_BYTE = 0x1401;\n\nfunction _MultiIconLayer(...props) {\n  class __MultiIconLayer extends _base.base.layers.IconLayer {\n    constructor(...props) {\n      super(...arguments);\n    }\n\n    getShaders() {\n      return Object.assign({}, super.getShaders(), {\n        vs: _chromaticMultiIconLayerVertex.default,\n        fs: _chromaticMultiIconLayerFragment.default\n      });\n    }\n\n    initializeState() {\n      super.initializeState();\n      const attributeManager = this.getAttributeManager();\n      attributeManager.addInstanced({\n        instancePixelOffset: {\n          size: 2,\n          transition: true,\n          accessor: 'getPixelOffset'\n        },\n        instanceHighlightColors: {\n          size: 4,\n          type: UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getHighlightColor',\n          defaultValue: [0, 255, 0, 255]\n        }\n      });\n    }\n\n    updateState(updateParams) {\n      super.updateState(updateParams);\n      const {\n        changeFlags\n      } = updateParams;\n\n      if (changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.getAnchorX || changeFlags.updateTriggersChanged.getAnchorY)) {\n        this.getAttributeManager().invalidate('instanceOffsets');\n      }\n    }\n\n    draw({\n      uniforms\n    }) {\n      const {\n        sdf\n      } = this.props;\n      super.draw({\n        uniforms: Object.assign({}, uniforms, {\n          // Refer the following doc about gamma and buffer\n          // https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817\n          buffer: DEFAULT_BUFFER,\n          gamma: DEFAULT_GAMMA,\n          sdf: Boolean(sdf)\n        })\n      });\n    }\n\n    calculateInstanceOffsets(attribute) {\n      const {\n        data,\n        iconMapping,\n        getIcon,\n        getAnchorX,\n        getAnchorY,\n        getLengthOfQueue,\n        getShiftInQueue\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n\n      for (const object of data) {\n        const icon = getIcon(object);\n        const rect = iconMapping[icon] || {};\n        const len = getLengthOfQueue(object);\n        const shiftX = getShiftInQueue(object);\n        value[i++] = (getAnchorX(object) - 1) * len / 2 + rect.width / 2 + shiftX || 0;\n        value[i++] = rect.height / 2 * getAnchorY(object) || 0;\n      }\n    }\n\n    calculateInstancePickingColors(attribute) {\n      const {\n        data,\n        getPickingIndex\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n      const pickingColor = [];\n\n      for (const point of data) {\n        const index = getPickingIndex(point);\n        this.encodePickingColor(index, pickingColor);\n        value[i++] = pickingColor[0];\n        value[i++] = pickingColor[1];\n        value[i++] = pickingColor[2];\n      }\n    }\n\n  }\n\n  __MultiIconLayer.layerName = 'MultiIconLayer';\n  __MultiIconLayer.defaultProps = defaultProps;\n  const instance = new __MultiIconLayer(...arguments);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * CubeLayer - a Deck.gl layer to render cuboids.\n * This is instantiatable by calling `new MultiIconLayer()`.\n */\n\n\nconst MultiIconLayer = _MultiIconLayer;\nexports.MultiIconLayer = MultiIconLayer;\n},{\"./chromatic-multi-icon-layer-fragment.glsl\":\"w4G4\",\"./chromatic-multi-icon-layer-vertex.glsl\":\"t88C\",\"../../base\":\"To8D\"}],\"VizX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ChromaticTextLayer = void 0;\n\nvar _base = require(\"../base\");\n\nvar _fontAtlas = require(\"./font-atlas\");\n\nvar _chromaticMultiIconLayer = require(\"./chromatic-multi-icon-layer/chromatic-multi-icon-layer\");\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/text-layer.js\nconst TEXT_ANCHOR = {\n  start: 1,\n  middle: 0,\n  end: -1\n};\nconst ALIGNMENT_BASELINE = {\n  top: 1,\n  center: 0,\n  bottom: -1\n};\nconst DEFAULT_COLOR = [0, 0, 0, 255];\nconst MISSING_CHAR_WIDTH = 32;\nconst FONT_SETTINGS_PROPS = ['fontSize', 'buffer', 'sdf', 'radius', 'cutoff'];\nconst defaultProps = {\n  fp64: false,\n  sizeScale: 1,\n  characterSet: _fontAtlas.DEFAULT_CHAR_SET,\n  fontFamily: _fontAtlas.DEFAULT_FONT_FAMILY,\n  fontWeight: _fontAtlas.DEFAULT_FONT_WEIGHT,\n  fontSettings: {},\n  getText: {\n    type: 'accessor',\n    value: x => x.text\n  },\n  getPosition: {\n    type: 'accessor',\n    value: x => x.position\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getSize: {\n    type: 'accessor',\n    value: 32\n  },\n  getAngle: {\n    type: 'accessor',\n    value: 0\n  },\n  getHighlightColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getTextAnchor: {\n    type: 'accessor',\n    value: 'middle'\n  },\n  getAlignmentBaseline: {\n    type: 'accessor',\n    value: 'center'\n  },\n  getPixelOffset: {\n    type: 'accessor',\n    value: [0, 0]\n  }\n};\n\nfunction _ChromaticTextLayer(props) {\n  class __ChromaticTextLayer extends _base.base.deck.CompositeLayer {\n    updateState({\n      props,\n      oldProps,\n      changeFlags\n    }) {\n      const fontChanged = this.fontChanged(oldProps, props);\n\n      if (fontChanged) {\n        this.updateFontAtlas();\n      }\n\n      if (changeFlags.dataChanged || fontChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText)) {\n        this.transformStringToLetters();\n      }\n    }\n\n    updateFontAtlas() {\n      const {\n        gl\n      } = this.context;\n      const {\n        fontSettings,\n        fontFamily,\n        fontWeight,\n        characterSet\n      } = this.props;\n      const mergedFontSettings = Object.assign({}, _fontAtlas.DEFAULT_FONT_SETTINGS, fontSettings, {\n        fontFamily,\n        fontWeight,\n        characterSet\n      });\n      const {\n        scale,\n        mapping,\n        texture\n      } = (0, _fontAtlas.makeFontAtlas)(gl, mergedFontSettings);\n      this.setState({\n        scale,\n        iconAtlas: texture,\n        iconMapping: mapping\n      });\n    }\n\n    fontChanged(oldProps, props) {\n      if (oldProps.fontFamily !== props.fontFamily || oldProps.characterSet !== props.characterSet || oldProps.fontWeight !== props.fontWeight) {\n        return true;\n      }\n\n      if (oldProps.fontSettings === props.fontSettings) {\n        return false;\n      }\n\n      const oldFontSettings = oldProps.fontSettings || {};\n      const fontSettings = props.fontSettings || {};\n      return FONT_SETTINGS_PROPS.some(prop => oldFontSettings[prop] !== fontSettings[prop]);\n    }\n\n    getPickingInfo({\n      info\n    }) {\n      // because `TextLayer` assign the same pickingInfoIndex for one text label,\n      // here info.index refers the index of text label in props.data\n      return Object.assign(info, {\n        // override object with original data\n        object: info.index >= 0 ? this.props.data[info.index] : null\n      });\n    }\n    /* eslint-disable no-loop-func */\n\n\n    transformStringToLetters() {\n      const {\n        data,\n        getText\n      } = this.props;\n      const {\n        iconMapping\n      } = this.state;\n      const transformedData = [];\n      let objectIndex = 0;\n\n      for (const val of data) {\n        const text = getText(val);\n\n        if (text) {\n          const letters = Array.from(text);\n          const offsets = [0];\n          let offsetLeft = 0;\n          letters.forEach((letter, i) => {\n            const datum = {\n              text: letter,\n              index: i,\n              offsets,\n              len: text.length,\n              // reference of original object and object index\n              object: val,\n              objectIndex\n            };\n            const frame = iconMapping[letter];\n\n            if (frame) {\n              offsetLeft += frame.width;\n            } else {\n              //log.warn(`Missing character: ${letter}`)();\n              offsetLeft += MISSING_CHAR_WIDTH;\n            }\n\n            offsets.push(offsetLeft);\n            transformedData.push(datum);\n          });\n        }\n\n        objectIndex++;\n      }\n\n      this.setState({\n        data: transformedData\n      });\n    }\n    /* eslint-enable no-loop-func */\n\n\n    getLetterOffset(datum) {\n      return datum.offsets[datum.index];\n    }\n\n    getTextLength(datum) {\n      return datum.offsets[datum.offsets.length - 1];\n    }\n\n    _getAccessor(accessor) {\n      if (typeof accessor === 'function') {\n        return x => accessor(x.object);\n      }\n\n      return accessor;\n    }\n\n    getAnchorXFromTextAnchor(getTextAnchor) {\n      return x => {\n        const textAnchor = typeof getTextAnchor === 'function' ? getTextAnchor(x.object) : getTextAnchor;\n\n        if (!TEXT_ANCHOR.hasOwnProperty(textAnchor)) {\n          throw new Error(`Invalid text anchor parameter: ${textAnchor}`);\n        }\n\n        return TEXT_ANCHOR[textAnchor];\n      };\n    }\n\n    getAnchorYFromAlignmentBaseline(getAlignmentBaseline) {\n      return x => {\n        const alignmentBaseline = typeof getAlignmentBaseline === 'function' ? getAlignmentBaseline(x.object) : getAlignmentBaseline;\n\n        if (!ALIGNMENT_BASELINE.hasOwnProperty(alignmentBaseline)) {\n          throw new Error(`Invalid alignment baseline parameter: ${alignmentBaseline}`);\n        }\n\n        return ALIGNMENT_BASELINE[alignmentBaseline];\n      };\n    }\n\n    renderLayers() {\n      const {\n        data,\n        scale,\n        iconAtlas,\n        iconMapping\n      } = this.state;\n      const {\n        getPosition,\n        getColor,\n        getSize,\n        getAngle,\n        getHighlightColor,\n        getTextAnchor,\n        getAlignmentBaseline,\n        getPixelOffset,\n        fp64,\n        sdf,\n        sizeScale,\n        transitions,\n        updateTriggers\n      } = this.props;\n      const SubLayerClass = this.getSubLayerClass('characters', _chromaticMultiIconLayer.MultiIconLayer);\n      return new SubLayerClass({\n        sdf,\n        iconAtlas,\n        iconMapping,\n        getPosition: d => getPosition(d.object),\n        getColor: this._getAccessor(getColor),\n        getSize: this._getAccessor(getSize),\n        getAngle: this._getAccessor(getAngle),\n        getHighlightColor: this._getAccessor(getHighlightColor),\n        getAnchorX: this.getAnchorXFromTextAnchor(getTextAnchor),\n        getAnchorY: this.getAnchorYFromAlignmentBaseline(getAlignmentBaseline),\n        getPixelOffset: this._getAccessor(getPixelOffset),\n        fp64,\n        sizeScale: sizeScale * scale,\n        transitions: transitions && {\n          getPosition: transitions.getPosition,\n          getAngle: transitions.getAngle,\n          getHighlightColor: transitions.getHighlightColor,\n          getColor: transitions.getColor,\n          getSize: transitions.getSize,\n          getPixelOffset: updateTriggers.getPixelOffset\n        }\n      }, this.getSubLayerProps({\n        id: 'characters',\n        updateTriggers: {\n          getPosition: updateTriggers.getPosition,\n          getAngle: updateTriggers.getAngle,\n          getHighlightColor: updateTriggers.getHighlightColor,\n          getColor: updateTriggers.getColor,\n          getSize: updateTriggers.getSize,\n          getPixelOffset: updateTriggers.getPixelOffset,\n          getAnchorX: updateTriggers.getTextAnchor,\n          getAnchorY: updateTriggers.getAlignmentBaseline\n        }\n      }), {\n        data,\n        getIcon: d => d.text,\n        getShiftInQueue: d => this.getLetterOffset(d),\n        getLengthOfQueue: d => this.getTextLength(d)\n      });\n    }\n\n  }\n\n  __ChromaticTextLayer.layerName = 'TextLayer';\n  __ChromaticTextLayer.defaultProps = defaultProps;\n  const instance = new __ChromaticTextLayer(props);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * TextLayer - a modification of deck.gl's TextLayer.\n * This is instantiatable by calling `new TextLayer()`.\n */\n\n\nconst ChromaticTextLayer = _ChromaticTextLayer;\nexports.ChromaticTextLayer = ChromaticTextLayer;\n},{\"../base\":\"To8D\",\"./font-atlas\":\"HKAP\",\"./chromatic-multi-icon-layer/chromatic-multi-icon-layer\":\"Pvx6\"}],\"Oim5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.concat = concat;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction concat(...args) {\n  return args.reduce((p, c) => c ? p.concat(c) : p, []);\n}\n},{}],\"mHNm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\nexports.default = _default;\n},{}],\"jQIe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createStage = createStage;\nexports.minPixelSize = exports.min3dDepth = exports.defaultView = exports.lineZ = exports.groupStrokeWidth = exports.defaultPresenterConfig = exports.defaultPresenterStyle = exports.minWidth = exports.minHeight = void 0;\nconst minHeight = '100px';\nexports.minHeight = minHeight;\nconst minWidth = '100px';\nexports.minWidth = minWidth;\nconst lightSettings = {\n  '2d': {},\n  '3d': {\n    lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n    ambientRatio: 0.3,\n    diffuseRatio: 0.6,\n    specularRatio: 0.4,\n    lightsStrength: [0.3, 0.0, 0.8, 0.0],\n    numberOfLights: 2\n  }\n};\nconst defaultPresenterStyle = {\n  cssPrefix: 'vega-deckgl-',\n  defaultCubeColor: [128, 128, 128, 255],\n  highlightColor: [0, 0, 0, 255],\n  lightSettings\n};\nexports.defaultPresenterStyle = defaultPresenterStyle;\nconst defaultPresenterConfig = {\n  onCubeClick: (e, cube) => {},\n  onCubeHover: (e, cube) => {},\n  transitionDurations: {\n    color: 100,\n    position: 600,\n    size: 600,\n    view: 600\n  }\n};\nexports.defaultPresenterConfig = defaultPresenterConfig;\n\nfunction createStage(view) {\n  const stage = {\n    view,\n    cubeData: [],\n    axes: {\n      x: [],\n      y: []\n    },\n    gridLines: [],\n    textData: [],\n    legend: {\n      rows: {}\n    },\n    facets: []\n  };\n  return stage;\n}\n\nconst groupStrokeWidth = 1;\nexports.groupStrokeWidth = groupStrokeWidth;\nconst lineZ = -1;\nexports.lineZ = lineZ;\nconst defaultView = '2d';\nexports.defaultView = defaultView;\nconst min3dDepth = 0.05;\nexports.min3dDepth = min3dDepth;\nconst minPixelSize = 0.5;\nexports.minPixelSize = minPixelSize;\n},{}],\"zIwf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${_defaults.minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${_defaults.minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_scale(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_scale(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_scale(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, offset, position_worldspace);\n\n  float lightWeight = 1.0;\n  \n  //allow for a small amount of error around the min3dDepth \n  if (instanceSizes.z >= ${_defaults.min3dDepth.toFixed(4)} - 0.0001) {\n    lightWeight = lighting_getLightWeight(\n      position_worldspace.xyz, // the w component is always 1.0\n      normals\n    );\n  }\n\n  vec3 lightWeightedColor = lightWeight * instanceColors.rgb;\n  vec3 mixedLight = mix(instanceColors.rgb, lightWeightedColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\nexports.default = _default;\n},{\"../defaults\":\"jQIe\"}],\"gZmI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CubeLayer = void 0;\n\nvar _cubeLayerFragment = _interopRequireDefault(require(\"./cube-layer-fragment.glsl\"));\n\nvar _cubeLayerVertex = _interopRequireDefault(require(\"./cube-layer-vertex.glsl\"));\n\nvar _base = require(\"../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/layers/src/grid-cell-layer/grid-cell-layer.js\n//https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\nconst UNSIGNED_BYTE = 0x1401;\nconst DEFAULT_COLOR = [255, 0, 255, 255];\nconst defaultProps = {\n  lightingMix: 0.5,\n  fp64: false,\n  getSize: x => x.size,\n  getPosition: x => x.position,\n  getColor: x => x.color\n};\n\nfunction _CubeLayer(props) {\n  //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n  class __CubeLayer extends _base.base.deck.Layer {\n    getShaders() {\n      const projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _cubeLayerVertex.default,\n        fs: _cubeLayerFragment.default,\n        modules: [projectModule, 'lighting', 'picking']\n      };\n    }\n\n    initializeState() {\n      const attributeManager = this.getAttributeManager();\n      attributeManager.addInstanced({\n        instancePositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getPosition'\n        },\n        instancePositions64xyLow: {\n          size: 3,\n          accessor: 'getPosition',\n          update: this.calculateInstancePositions64xyLow\n        },\n        instanceSizes: {\n          size: 3,\n          transition: true,\n          accessor: 'getSize'\n        },\n        instanceColors: {\n          size: 4,\n          type: UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getColor',\n          defaultValue: DEFAULT_COLOR\n        }\n      });\n    }\n\n    updateState({\n      props,\n      oldProps,\n      changeFlags\n    }) {\n      super.updateState({\n        props,\n        oldProps,\n        changeFlags\n      }); //TODO add parameter type to deck.gl-typings\n      // Re-generate model if geometry changed\n\n      if (props.fp64 !== oldProps.fp64) {\n        const {\n          gl\n        } = this.context;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n    }\n\n    _getModel(gl) {\n      return new _base.base.luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _base.base.luma.CubeGeometry(),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n\n    draw({\n      uniforms\n    }) {\n      let {\n        lightingMix\n      } = this.props;\n\n      if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n        lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n      }\n\n      this.state.model.render(Object.assign({}, uniforms, {\n        lightingMix\n      }));\n    }\n\n    calculateInstancePositions64xyLow(attribute) {\n      const isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      const {\n        data,\n        getPosition\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n\n      for (const point of data) {\n        const position = getPosition(point);\n        value[i++] = _base.base.luma.fp64.fp64LowPart(position[0]);\n        value[i++] = _base.base.luma.fp64.fp64LowPart(position[1]);\n      }\n    }\n\n  }\n\n  __CubeLayer.layerName = 'CubeLayer';\n  __CubeLayer.defaultProps = defaultProps;\n  const instance = new __CubeLayer(props);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * CubeLayer - a Deck.gl layer to render cuboids.\n * This is instantiatable by calling `new CubeLayer()`.\n */\n\n\nconst CubeLayer = _CubeLayer;\nexports.CubeLayer = CubeLayer;\n},{\"./cube-layer-fragment.glsl\":\"mHNm\",\"./cube-layer-vertex.glsl\":\"zIwf\",\"../base\":\"To8D\"}],\"INt0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linear = linear;\n\nfunction linear(t) {\n  return +t;\n}\n},{}],\"YHiQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.quadIn = quadIn;\nexports.quadOut = quadOut;\nexports.quadInOut = quadInOut;\n\nfunction quadIn(t) {\n  return t * t;\n}\n\nfunction quadOut(t) {\n  return t * (2 - t);\n}\n\nfunction quadInOut(t) {\n  return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n},{}],\"qmX2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cubicIn = cubicIn;\nexports.cubicOut = cubicOut;\nexports.cubicInOut = cubicInOut;\n\nfunction cubicIn(t) {\n  return t * t * t;\n}\n\nfunction cubicOut(t) {\n  return --t * t * t + 1;\n}\n\nfunction cubicInOut(t) {\n  return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n},{}],\"dJ3h\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.polyInOut = exports.polyOut = exports.polyIn = void 0;\nvar exponent = 3;\n\nvar polyIn = function custom(e) {\n  e = +e;\n\n  function polyIn(t) {\n    return Math.pow(t, e);\n  }\n\n  polyIn.exponent = custom;\n  return polyIn;\n}(exponent);\n\nexports.polyIn = polyIn;\n\nvar polyOut = function custom(e) {\n  e = +e;\n\n  function polyOut(t) {\n    return 1 - Math.pow(1 - t, e);\n  }\n\n  polyOut.exponent = custom;\n  return polyOut;\n}(exponent);\n\nexports.polyOut = polyOut;\n\nvar polyInOut = function custom(e) {\n  e = +e;\n\n  function polyInOut(t) {\n    return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n  }\n\n  polyInOut.exponent = custom;\n  return polyInOut;\n}(exponent);\n\nexports.polyInOut = polyInOut;\n},{}],\"uHbA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sinIn = sinIn;\nexports.sinOut = sinOut;\nexports.sinInOut = sinInOut;\nvar pi = Math.PI,\n    halfPi = pi / 2;\n\nfunction sinIn(t) {\n  return 1 - Math.cos(t * halfPi);\n}\n\nfunction sinOut(t) {\n  return Math.sin(t * halfPi);\n}\n\nfunction sinInOut(t) {\n  return (1 - Math.cos(pi * t)) / 2;\n}\n},{}],\"VbvH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.expIn = expIn;\nexports.expOut = expOut;\nexports.expInOut = expInOut;\n\nfunction expIn(t) {\n  return Math.pow(2, 10 * t - 10);\n}\n\nfunction expOut(t) {\n  return 1 - Math.pow(2, -10 * t);\n}\n\nfunction expInOut(t) {\n  return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n}\n},{}],\"Nnyc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.circleIn = circleIn;\nexports.circleOut = circleOut;\nexports.circleInOut = circleInOut;\n\nfunction circleIn(t) {\n  return 1 - Math.sqrt(1 - t * t);\n}\n\nfunction circleOut(t) {\n  return Math.sqrt(1 - --t * t);\n}\n\nfunction circleInOut(t) {\n  return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n},{}],\"WDS3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.bounceIn = bounceIn;\nexports.bounceOut = bounceOut;\nexports.bounceInOut = bounceInOut;\nvar b1 = 4 / 11,\n    b2 = 6 / 11,\n    b3 = 8 / 11,\n    b4 = 3 / 4,\n    b5 = 9 / 11,\n    b6 = 10 / 11,\n    b7 = 15 / 16,\n    b8 = 21 / 22,\n    b9 = 63 / 64,\n    b0 = 1 / b1 / b1;\n\nfunction bounceIn(t) {\n  return 1 - bounceOut(1 - t);\n}\n\nfunction bounceOut(t) {\n  return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nfunction bounceInOut(t) {\n  return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n},{}],\"LEz6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.backInOut = exports.backOut = exports.backIn = void 0;\nvar overshoot = 1.70158;\n\nvar backIn = function custom(s) {\n  s = +s;\n\n  function backIn(t) {\n    return t * t * ((s + 1) * t - s);\n  }\n\n  backIn.overshoot = custom;\n  return backIn;\n}(overshoot);\n\nexports.backIn = backIn;\n\nvar backOut = function custom(s) {\n  s = +s;\n\n  function backOut(t) {\n    return --t * t * ((s + 1) * t + s) + 1;\n  }\n\n  backOut.overshoot = custom;\n  return backOut;\n}(overshoot);\n\nexports.backOut = backOut;\n\nvar backInOut = function custom(s) {\n  s = +s;\n\n  function backInOut(t) {\n    return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n  }\n\n  backInOut.overshoot = custom;\n  return backInOut;\n}(overshoot);\n\nexports.backInOut = backInOut;\n},{}],\"kSts\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.elasticInOut = exports.elasticOut = exports.elasticIn = void 0;\nvar tau = 2 * Math.PI,\n    amplitude = 1,\n    period = 0.3;\n\nvar elasticIn = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticIn(t) {\n    return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n  }\n\n  elasticIn.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticIn.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticIn;\n}(amplitude, period);\n\nexports.elasticIn = elasticIn;\n\nvar elasticOut = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticOut(t) {\n    return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n  }\n\n  elasticOut.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticOut.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticOut;\n}(amplitude, period);\n\nexports.elasticOut = elasticOut;\n\nvar elasticInOut = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticInOut(t) {\n    return ((t = t * 2 - 1) < 0 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n  }\n\n  elasticInOut.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticInOut.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticInOut;\n}(amplitude, period);\n\nexports.elasticInOut = elasticInOut;\n},{}],\"id0f\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"easeLinear\", {\n  enumerable: true,\n  get: function () {\n    return _linear.linear;\n  }\n});\nObject.defineProperty(exports, \"easeQuad\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadInOut;\n  }\n});\nObject.defineProperty(exports, \"easeQuadIn\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadIn;\n  }\n});\nObject.defineProperty(exports, \"easeQuadOut\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadOut;\n  }\n});\nObject.defineProperty(exports, \"easeQuadInOut\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubic\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubicIn\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicIn;\n  }\n});\nObject.defineProperty(exports, \"easeCubicOut\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubicInOut\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicInOut;\n  }\n});\nObject.defineProperty(exports, \"easePoly\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyInOut;\n  }\n});\nObject.defineProperty(exports, \"easePolyIn\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyIn;\n  }\n});\nObject.defineProperty(exports, \"easePolyOut\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyOut;\n  }\n});\nObject.defineProperty(exports, \"easePolyInOut\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyInOut;\n  }\n});\nObject.defineProperty(exports, \"easeSin\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinInOut;\n  }\n});\nObject.defineProperty(exports, \"easeSinIn\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinIn;\n  }\n});\nObject.defineProperty(exports, \"easeSinOut\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinOut;\n  }\n});\nObject.defineProperty(exports, \"easeSinInOut\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinInOut;\n  }\n});\nObject.defineProperty(exports, \"easeExp\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expInOut;\n  }\n});\nObject.defineProperty(exports, \"easeExpIn\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expIn;\n  }\n});\nObject.defineProperty(exports, \"easeExpOut\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expOut;\n  }\n});\nObject.defineProperty(exports, \"easeExpInOut\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircle\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircleIn\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleIn;\n  }\n});\nObject.defineProperty(exports, \"easeCircleOut\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircleInOut\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounce\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounceIn\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceIn;\n  }\n});\nObject.defineProperty(exports, \"easeBounceOut\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounceInOut\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBack\", {\n  enumerable: true,\n  get: function () {\n    return _back.backInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBackIn\", {\n  enumerable: true,\n  get: function () {\n    return _back.backIn;\n  }\n});\nObject.defineProperty(exports, \"easeBackOut\", {\n  enumerable: true,\n  get: function () {\n    return _back.backOut;\n  }\n});\nObject.defineProperty(exports, \"easeBackInOut\", {\n  enumerable: true,\n  get: function () {\n    return _back.backInOut;\n  }\n});\nObject.defineProperty(exports, \"easeElastic\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticOut;\n  }\n});\nObject.defineProperty(exports, \"easeElasticIn\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticIn;\n  }\n});\nObject.defineProperty(exports, \"easeElasticOut\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticOut;\n  }\n});\nObject.defineProperty(exports, \"easeElasticInOut\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticInOut;\n  }\n});\n\nvar _linear = require(\"./linear.js\");\n\nvar _quad = require(\"./quad.js\");\n\nvar _cubic = require(\"./cubic.js\");\n\nvar _poly = require(\"./poly.js\");\n\nvar _sin = require(\"./sin.js\");\n\nvar _exp = require(\"./exp.js\");\n\nvar _circle = require(\"./circle.js\");\n\nvar _bounce = require(\"./bounce.js\");\n\nvar _back = require(\"./back.js\");\n\nvar _elastic = require(\"./elastic.js\");\n},{\"./linear.js\":\"INt0\",\"./quad.js\":\"YHiQ\",\"./cubic.js\":\"qmX2\",\"./poly.js\":\"dJ3h\",\"./sin.js\":\"uHbA\",\"./exp.js\":\"VbvH\",\"./circle.js\":\"Nnyc\",\"./bounce.js\":\"WDS3\",\"./back.js\":\"LEz6\",\"./elastic.js\":\"kSts\"}],\"U4xU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLayers = getLayers;\nexports.getCubeLayer = getCubeLayer;\nexports.getCubes = getCubes;\n\nvar _base = require(\"./base\");\n\nvar _chromaticTextLayer = require(\"./chromatic-text-layer/chromatic-text-layer\");\n\nvar _array = require(\"./array\");\n\nvar _cubeLayer = require(\"./cube-layer/cube-layer\");\n\nvar _d3Ease = require(\"d3-ease\");\n\nvar _constants = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction getLayers(presenter, config, stage, lightSettings, lightingMix, interpolator, guideLines) {\n  const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n  const {\n    x,\n    y\n  } = stage.axes;\n  const lines = (0, _array.concat)(stage.gridLines, guideLines);\n  const texts = [...stage.textData];\n  [x, y].forEach(axes => {\n    axes.forEach(axis => {\n      if (axis.domain) lines.push(axis.domain);\n      if (axis.ticks) lines.push.apply(lines, axis.ticks);\n      if (axis.tickText) texts.push.apply(texts, axis.tickText);\n      if (axis.title) texts.push(axis.title);\n    });\n  });\n\n  if (stage.facets) {\n    stage.facets.forEach(f => {\n      if (f.lines) lines.push.apply(lines, f.lines);\n      if (f.facetTitle) texts.push(f.facetTitle);\n    });\n  }\n\n  const lineLayer = newLineLayer(_constants.layerNames.lines, lines);\n  const textLayer = newTextLayer(presenter, _constants.layerNames.text, texts, config, presenter.style.fontFamily);\n  return [textLayer, cubeLayer, lineLayer];\n}\n\nfunction newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings, lightingMix, interpolator) {\n  const getPosition = getTiming(config.transitionDurations.position, _d3Ease.easeExpInOut);\n  const getSize = getTiming(config.transitionDurations.size, _d3Ease.easeExpInOut);\n  const getColor = getTiming(config.transitionDurations.color);\n  const cubeLayerProps = {\n    interpolator,\n    lightingMix,\n    id: _constants.layerNames.cubes,\n    data: cubeData,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    pickable: true,\n    autoHighlight: true,\n    highlightColor,\n    onClick: (o, e) => {\n      config.onCubeClick(e && e.srcEvent, o.object);\n    },\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onCube = false;\n        config.onCubeHover(e && e.srcEvent, null);\n      } else {\n        presenter.deckgl.interactiveState.onCube = true;\n        config.onCubeHover(e && e.srcEvent, o.object);\n      }\n    },\n    lightSettings,\n    transitions: {\n      getPosition,\n      getColor,\n      getSize\n    }\n  };\n  return new _cubeLayer.CubeLayer(cubeLayerProps);\n}\n\nfunction newLineLayer(id, data) {\n  return new _base.base.layers.LineLayer({\n    id,\n    data,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    getColor: o => o.color,\n    getStrokeWidth: o => o.strokeWidth\n  });\n}\n\nfunction newTextLayer(presenter, id, data, config, fontFamily) {\n  const props = {\n    id,\n    data,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    autoHighlight: true,\n    pickable: true,\n    getHighlightColor: config.getTextHighlightColor || (o => o.color),\n    onClick: (o, e) => {\n      let pe = e && e.srcEvent; //handle iOS event\n\n      if (e.center) {\n        pe = {\n          clientX: e.center.x,\n          clientY: e.center.y\n        };\n      }\n\n      config.onTextClick && config.onTextClick(pe, o.object);\n    },\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onText = false;\n      } else {\n        presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n      }\n    },\n    getColor: config.getTextColor || (o => o.color),\n    getTextAnchor: o => o.textAnchor,\n    getSize: o => o.size,\n    getAngle: o => o.angle,\n    fontSettings: {\n      sdf: true,\n      fontSize: 128,\n      buffer: 3\n    }\n  };\n\n  if (fontFamily) {\n    props.fontFamily = fontFamily;\n  }\n\n  return new _chromaticTextLayer.ChromaticTextLayer(props);\n}\n\nfunction getTiming(duration, easing) {\n  let timing;\n\n  if (duration) {\n    timing = {\n      duration\n    };\n\n    if (easing) {\n      timing.easing = easing;\n    }\n  }\n\n  return timing;\n}\n\nfunction getCubeLayer(deckProps) {\n  return deckProps.layers.filter(layer => layer.id === _constants.layerNames.cubes)[0];\n}\n\nfunction getCubes(deckProps) {\n  const cubeLayer = getCubeLayer(deckProps);\n  if (!cubeLayer) return;\n  const cubeLayerProps = cubeLayer.props;\n  return cubeLayerProps.data;\n}\n},{\"./base\":\"To8D\",\"./chromatic-text-layer/chromatic-text-layer\":\"VizX\",\"./array\":\"Oim5\",\"./cube-layer/cube-layer\":\"gZmI\",\"d3-ease\":\"id0f\",\"./constants\":\"Fy6F\"}],\"WeBf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"addDiv\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.addDiv;\n  }\n});\nObject.defineProperty(exports, \"addEl\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.addEl;\n  }\n});\nObject.defineProperty(exports, \"outerSize\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.outerSize;\n  }\n});\nObject.defineProperty(exports, \"clone\", {\n  enumerable: true,\n  get: function () {\n    return _clone.clone;\n  }\n});\nObject.defineProperty(exports, \"deepMerge\", {\n  enumerable: true,\n  get: function () {\n    return _clone.deepMerge;\n  }\n});\nObject.defineProperty(exports, \"colorFromString\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorFromString;\n  }\n});\nObject.defineProperty(exports, \"colorIsEqual\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorIsEqual;\n  }\n});\nObject.defineProperty(exports, \"colorToString\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorToString;\n  }\n});\nObject.defineProperty(exports, \"desaturate\", {\n  enumerable: true,\n  get: function () {\n    return _color.desaturate;\n  }\n});\nObject.defineProperty(exports, \"isColor\", {\n  enumerable: true,\n  get: function () {\n    return _color.isColor;\n  }\n});\nObject.defineProperty(exports, \"getCubeLayer\", {\n  enumerable: true,\n  get: function () {\n    return _layers.getCubeLayer;\n  }\n});\nObject.defineProperty(exports, \"getCubes\", {\n  enumerable: true,\n  get: function () {\n    return _layers.getCubes;\n  }\n});\n\nvar _htmlHelpers = require(\"../htmlHelpers\");\n\nvar _clone = require(\"../clone\");\n\nvar _color = require(\"../color\");\n\nvar _layers = require(\"../layers\");\n},{\"../htmlHelpers\":\"i6BN\",\"../clone\":\"Jcn2\",\"../color\":\"j7Ij\",\"../layers\":\"U4xU\"}],\"YfRA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.box = box;\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (item) {\n    var x1, y1, x2, y2;\n    x1 = item.x || 0;\n    y1 = item.y || 0;\n    x2 = item.x2 != null ? item.x2 : x1;\n    y2 = item.y2 != null ? item.y2 : y1;\n    const lineItem = styledLine(x1 + x - options.offsetX, y1 + y - options.offsetY, x2 + x - options.offsetX, y2 + y - options.offsetY, item.stroke, item.strokeWidth);\n\n    if (item.mark.role === 'axis-tick') {\n      options.currAxis.ticks.push(lineItem);\n    } else if (item.mark.role === 'axis-domain') {\n      options.currAxis.domain = lineItem;\n    } else {\n      stage.gridLines.push(lineItem);\n    }\n  });\n};\n\nfunction styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n  const line = {\n    sourcePosition: [x1, -y1, _defaults.lineZ],\n    targetPosition: [x2, -y2, _defaults.lineZ],\n    color: (0, _color.colorFromString)(stroke),\n    strokeWidth: strokeWidth * 10 //translate width to deck.gl\n\n  };\n  return line;\n}\n\nfunction box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n  const lines = [styledLine(gx, gy, gx + width, gy, stroke, strokeWidth), styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth), styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth), styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)];\n\n  if (diagonals) {\n    lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n    lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n  }\n\n  return lines;\n}\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"To8D\",\"../color\":\"j7Ij\",\"../defaults\":\"jQIe\"}],\"qyL6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PresenterElement = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * HTML elements outputted by the presenter.\n */\nvar PresenterElement;\nexports.PresenterElement = PresenterElement;\n\n(function (PresenterElement) {\n  PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n  PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n  PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n  PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n  PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n})(PresenterElement || (exports.PresenterElement = PresenterElement = {}));\n},{}],\"qkJA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initializePanel = initializePanel;\nexports.className = className;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _enums = require(\"./enums\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction initializePanel(presenter) {\n  const rootDiv = (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.root, presenter)\n  }, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.gl, presenter),\n    style: {\n      minHeight: _defaults.minHeight,\n      minWidth: _defaults.minWidth\n    }\n  }), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.panel, presenter)\n  }, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.vegaControls, presenter)\n  }), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.legend, presenter)\n  })));\n  (0, _tsxCreateElement.mount)(rootDiv, presenter.el);\n}\n\nfunction className(type, presenter) {\n  return `${presenter.style.cssPrefix}${_enums.PresenterElement[type]}`;\n}\n},{\"tsx-create-element\":\"YitK\",\"./defaults\":\"jQIe\",\"./enums\":\"qyL6\"}],\"gyzW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createOrbitControllerClass = createOrbitControllerClass;\n\nvar _base = require(\"../base\");\n\nfunction createOrbitControllerClass(factoryOptions) {\n  function wrapper(props) {\n    class OrbitControllerInternal extends _base.base.deck._OrbitController {\n      constructor(props) {\n        super(props);\n        this.invertPan = true;\n      }\n\n      _onDoubleTap(event) {\n        if (factoryOptions && factoryOptions.doubleClickHandler) {\n          factoryOptions.doubleClickHandler(event, this);\n        } else {\n          super._onDoubleTap(event);\n        }\n      }\n\n      _onPanRotate(event) {\n        if (!this.dragRotate) {\n          return false;\n        }\n\n        return this._onPanRotateStandard(event);\n      }\n\n    }\n\n    const instance = new OrbitControllerInternal(props);\n    return instance;\n  }\n\n  return wrapper;\n}\n},{\"../base\":\"To8D\"}],\"NGGy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createDeckGLClassesForPresenter = createDeckGLClassesForPresenter;\n\nvar _base = require(\"../base\");\n\nvar _orbitController = require(\"./orbitController\");\n\n//adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\nconst CANVAS_STYLE = {\n  position: 'absolute',\n  left: 0,\n  top: 0,\n  width: '100%',\n  height: '100%'\n}; // Create canvas elements for map and deck\n\nfunction createCanvas(props) {\n  let {\n    container = document.body\n  } = props;\n\n  if (typeof container === 'string') {\n    container = document.getElementById(container);\n  }\n\n  if (!container) {\n    throw Error('Deck: container not found');\n  } // Add DOM elements\n\n\n  const containerStyle = window.getComputedStyle(container);\n\n  if (containerStyle.position === 'static') {\n    container.style.position = 'relative';\n  }\n\n  const deckCanvas = document.createElement('canvas');\n  container.appendChild(deckCanvas);\n  Object.assign(deckCanvas.style, CANVAS_STYLE);\n  return {\n    container,\n    deckCanvas\n  };\n}\n/**\n * Creates Deck.gl classes for rendering WebGL.\n * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n */\n\n\nfunction createDeckGLClassesForPresenter(factoryOptions) {\n  const OrbitControllerClass = (0, _orbitController.createOrbitControllerClass)(factoryOptions); //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n  //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n\n  function wrapper(props) {\n    /**\n     * @params container (Element) - DOM element to add deck.gl canvas to\n     * @params controller (Object) - Controller class. Leave empty for auto detection\n     */\n    class DeckGLInternal extends _base.base.deck.Deck {\n      constructor(props = {}) {\n        if (typeof document === 'undefined') {\n          // Not browser\n          throw Error('Deck can only be used in the browser');\n        }\n\n        const {\n          deckCanvas\n        } = createCanvas(props);\n        const viewState = props.initialViewState || props.viewState || {};\n        super(Object.assign({}, props, {\n          width: '100%',\n          height: '100%',\n          canvas: deckCanvas,\n          controller: OrbitControllerClass,\n          initialViewState: viewState\n        })); // Callback for the controller\n\n        this._updateViewState = params => {\n          if (this.onViewStateChange) {\n            this.onViewStateChange(params);\n          }\n        };\n      }\n\n      setProps(props) {\n        // this._updateViewState must be bound to `this`\n        // but we don't have access to the current instance before calling super().\n        if ('onViewStateChange' in props && this._updateViewState) {\n          // This is called at least once at _onRendererInitialized\n          this.onViewStateChange = props.onViewStateChange;\n          props.onViewStateChange = this._updateViewState;\n        }\n\n        super.setProps(props);\n      }\n\n    }\n\n    const instance = new DeckGLInternal(props);\n    return instance;\n  }\n\n  return {\n    OrbitControllerClass,\n    DeckGL_Class: wrapper\n  };\n}\n},{\"../base\":\"To8D\",\"./orbitController\":\"gyzW\"}],\"zxV0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LegendView = void 0;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _controls = require(\"./controls\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst LegendView = props => {\n  const rows = [];\n\n  const addRow = (row, i) => {\n    const fn = symbolMap[row.symbol.shape];\n    let jsx;\n\n    if (fn) {\n      jsx = fn(row.symbol);\n    } else {\n      jsx = (0, _tsxCreateElement.createElement)(\"span\", null, \"x\"); //console.log(`need to render ${row.symbol.shape} symbol shape`);\n    }\n\n    rows.push({\n      cells: [{\n        className: 'symbol',\n        content: jsx\n      }, {\n        className: 'label',\n        content: row.label,\n        title: row.label\n      }]\n    });\n  };\n\n  var sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n  sorted.forEach(i => addRow(props.legend.rows[i], +i));\n\n  if (sorted.length) {\n    return (0, _tsxCreateElement.createElement)(_controls.Table, {\n      rows: rows,\n      rowClassName: \"legend-row\",\n      onRowClick: (e, i) => props.onClick(e, props.legend, i)\n    }, props.legend.title !== void 0 && (0, _tsxCreateElement.createElement)(\"tr\", {\n      onClick: e => props.onClick(e, props.legend, null)\n    }, (0, _tsxCreateElement.createElement)(\"th\", {\n      colSpan: 2\n    }, props.legend.title)));\n  }\n};\n\nexports.LegendView = LegendView;\nconst symbolMap = {\n  square: function (symbol) {\n    return (0, _tsxCreateElement.createElement)(\"div\", {\n      style: {\n        height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n        width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n        backgroundColor: symbol.fill,\n        borderColor: symbol.fill\n      }\n    });\n  }\n};\n},{\"tsx-create-element\":\"YitK\",\"./controls\":\"KmGS\"}],\"BfWC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LinearInterpolator = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction wrapper(props) {\n  class LinearInterpolatorInternal extends _base.base.deck.LinearInterpolator {\n    constructor(transitionProps) {\n      super(transitionProps);\n    }\n\n    interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n      if (this.layerStartProps && this.layerEndProps) {\n        this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n      }\n\n      return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n    }\n\n  }\n\n  const instance = new LinearInterpolatorInternal(props);\n  return instance;\n}\n\nconst LinearInterpolator = wrapper;\nexports.LinearInterpolator = LinearInterpolator;\n},{\"../base\":\"To8D\"}],\"sE6a\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.patchCubeArray = patchCubeArray;\n\nfunction patchCubeArray(allocatedSize, empty, cubes) {\n  const patched = new Array(allocatedSize);\n  patched.fill(empty);\n  cubes.forEach(cube => patched[cube.ordinal] = cube);\n  return patched;\n}\n},{}],\"KS5e\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst legendMap = {\n  'legend-title': function (legend, textItem) {\n    legend.title = textItem.text;\n  },\n  'legend-symbol': function (legend, symbol) {\n    const {\n      bounds,\n      fill,\n      shape\n    } = symbol; //this object is safe for serialization\n\n    const legendRowSymbol = {\n      bounds,\n      fill,\n      shape\n    };\n    const i = symbol.datum.index;\n    legend.rows[i] = legend.rows[i] || {};\n    legend.rows[i].symbol = legendRowSymbol;\n  },\n  'legend-label': function (legend, label) {\n    const i = label.datum.index;\n    legend.rows[i] = legend.rows[i] || {};\n    const row = legend.rows[i];\n    row.label = label.text;\n    row.value = label.datum.value;\n  }\n};\n\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (item) {\n    const fn = legendMap[item.mark.role];\n\n    if (fn) {\n      fn(stage.legend, item);\n    } else {//console.log(`need to render legend ${item.mark.role}`);\n    }\n  });\n};\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"To8D\"}],\"Bi9w\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  let i = 0;\n\n  _base.base.vega.sceneVisit(scene, function (item) {\n    //for orthographic (2d) - always use 0 or else Deck will not show them\n    const z = stage.view === '2d' ? 0 : item.z || 0;\n    const depth = (stage.view === '2d' ? 0 : item.depth || 0) + _defaults.min3dDepth; //change direction of y from SVG to GL\n\n    const ty = -1;\n    let ordinal = i;\n\n    if (item.datum.GL_ORDINAL !== void 0) {\n      options.ordinalsSpecified = true;\n      ordinal = item.datum.GL_ORDINAL;\n\n      if (ordinal > options.maxOrdinal) {\n        options.maxOrdinal = ordinal;\n      }\n    }\n\n    const cube = {\n      ordinal,\n      size: [item.width, item.height, depth],\n      position: [x + (item.x || 0) - options.offsetX, ty * (y + (item.y || 0) - options.offsetY) - item.height, z],\n      color: (0, _color.colorFromString)(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n    };\n    cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n    stage.cubeData.push(cube);\n    i++;\n  });\n};\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"To8D\",\"../color\":\"j7Ij\",\"../defaults\":\"jQIe\"}],\"ZnIC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  //scale Deck.Gl text to Vega size\n  const fontScale = 6; //Deck.gl centers text on Y. TODO: is this correct on x axis?\n\n  const offsetYCenter = 16; //change direction of y from SVG to GL\n\n  const ty = -1;\n\n  _base.base.vega.sceneVisit(scene, function (item) {\n    if (!item.text) return;\n    const size = item.fontSize * fontScale;\n    const textItem = {\n      color: (0, _color.colorFromString)(item.fill),\n      text: item.text.toString(),\n      position: [x + item.x - options.offsetX, ty * (y + item.y + offsetYCenter - options.offsetY), 0],\n      size,\n      angle: convertAngle(item.angle),\n      textAnchor: convertAlignment(item.align),\n      alignmentBaseline: convertBaseline(item.baseline)\n    };\n\n    if (item.mark.role === 'axis-label') {\n      const tickText = textItem;\n      tickText.value = item.datum.value;\n      options.currAxis.tickText.push(tickText);\n    } else if (item.mark.role === 'axis-title') {\n      options.currAxis.title = textItem;\n    } else if (options.currFacetRect && !options.currFacetRect.facetTitle) {\n      options.currFacetRect.facetTitle = textItem;\n      textItem.position = [x - options.offsetX, ty * (y + offsetYCenter - options.offsetY), 0];\n    } else {\n      stage.textData.push(textItem);\n    }\n  });\n};\n\nfunction convertAngle(vegaTextAngle) {\n  if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n    return 360 - vegaTextAngle;\n  }\n\n  return 0;\n}\n\nfunction convertAlignment(textAlign) {\n  switch (textAlign) {\n    case 'center':\n      return 'middle';\n\n    case 'left':\n      return 'start';\n\n    case 'right':\n      return 'end';\n  }\n\n  return 'start';\n}\n\nfunction convertBaseline(baseline) {\n  switch (baseline) {\n    case 'middle':\n      return 'center';\n  }\n\n  return baseline || 'bottom';\n}\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"To8D\",\"../color\":\"j7Ij\"}],\"ESmf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.GroupType = void 0;\nvar GroupType;\nexports.GroupType = GroupType;\n\n(function (GroupType) {\n  GroupType[GroupType[\"none\"] = 0] = \"none\";\n  GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n  GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n  GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n})(GroupType || (exports.GroupType = GroupType = {}));\n},{}],\"yA2f\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sceneToStage = sceneToStage;\n\nvar _legend = _interopRequireDefault(require(\"./marks/legend\"));\n\nvar _rect = _interopRequireDefault(require(\"./marks/rect\"));\n\nvar _rule = _interopRequireWildcard(require(\"./marks/rule\"));\n\nvar _text = _interopRequireDefault(require(\"./marks/text\"));\n\nvar _base = require(\"./base\");\n\nvar _color = require(\"./color\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _interfaces = require(\"./marks/interfaces\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction convertGroupRole(group) {\n  if (group.mark.role === 'legend') return _interfaces.GroupType.legend;\n\n  if (group.mark.role === 'axis') {\n    var vegaAxisDatum = group.datum;\n\n    if (vegaAxisDatum) {\n      switch (vegaAxisDatum.orient) {\n        case 'bottom':\n        case 'top':\n          return _interfaces.GroupType.xAxis;\n\n        case 'left':\n        case 'right':\n          return _interfaces.GroupType.yAxis;\n      }\n    }\n  }\n}\n\nconst group = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (g) {\n    if (g.bounds.x1 < options.offsetX) {\n      options.offsetX = g.bounds.x1;\n    }\n\n    if (g.bounds.y1 < options.offsetY) {\n      options.offsetY = g.bounds.y1;\n    }\n\n    const gx = g.x || 0,\n          gy = g.y || 0;\n\n    if (g.context && g.context.background && !stage.backgroundColor) {\n      stage.backgroundColor = (0, _color.colorFromString)(g.context.background);\n    }\n\n    if (g.stroke) {\n      const facetRect = {\n        lines: (0, _rule.box)(gx + x - options.offsetX, gy + y - options.offsetY, g.height, g.width, g.stroke, _defaults.groupStrokeWidth)\n      };\n      stage.facets.push(facetRect);\n      options.currFacetRect = facetRect;\n    }\n\n    groupType = convertGroupRole(g) || groupType;\n    setCurrentAxis(options, stage, groupType); // draw group contents\n\n    _base.base.vega.sceneVisit(g, function (item) {\n      mainStager(options, stage, item, gx + x, gy + y, groupType);\n    });\n  });\n};\n\nfunction setCurrentAxis(options, stage, groupType) {\n  let axes;\n\n  switch (groupType) {\n    case _interfaces.GroupType.xAxis:\n      axes = stage.axes.x;\n      break;\n\n    case _interfaces.GroupType.yAxis:\n      axes = stage.axes.y;\n      break;\n\n    default:\n      return;\n  }\n\n  options.currAxis = {\n    domain: null,\n    tickText: [],\n    ticks: []\n  };\n  axes.push(options.currAxis);\n}\n\nconst markStagers = {\n  group,\n  legend: _legend.default,\n  rect: _rect.default,\n  rule: _rule.default,\n  text: _text.default\n};\n\nvar mainStager = (options, stage, scene, x, y, groupType) => {\n  if (scene.marktype !== 'group' && groupType === _interfaces.GroupType.legend) {\n    (0, _legend.default)(options, stage, scene, x, y, groupType);\n  } else {\n    var markStager = markStagers[scene.marktype];\n\n    if (markStager) {\n      markStager(options, stage, scene, x, y, groupType);\n    } else {//console.log(`need to render ${scene.marktype}`);\n    }\n  }\n};\n\nfunction sceneToStage(options, stage, scene) {\n  mainStager(options, stage, scene, 0, 0, null);\n  sortAxis(stage.axes.x, 0);\n  sortAxis(stage.axes.y, 1);\n}\n\nfunction sortAxis(axes, dim) {\n  axes.forEach(axis => {\n    if (axis.domain) orderDomain(axis.domain, dim);\n    axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n    axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n  });\n}\n\nfunction orderDomain(domain, dim) {\n  if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n    const temp = domain.targetPosition;\n    domain.targetPosition = domain.sourcePosition;\n    domain.sourcePosition = temp;\n  }\n}\n},{\"./marks/legend\":\"KS5e\",\"./marks/rect\":\"Bi9w\",\"./marks/rule\":\"YfRA\",\"./marks/text\":\"ZnIC\",\"./base\":\"To8D\",\"./color\":\"j7Ij\",\"./defaults\":\"jQIe\",\"./marks/interfaces\":\"ESmf\"}],\"sOaQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.targetViewState = targetViewState;\nexports.viewStateProps = void 0;\nconst viewStateProps = ['distance', 'fov', 'lookAt', 'rotationOrbit', 'rotationX', 'zoom'];\nexports.viewStateProps = viewStateProps;\n\nfunction targetViewState(height, width, view) {\n  const distance = 10;\n  const fov = 60;\n  const lookAt = [width / 2, -height / 2, 0]; //add a 4th dimension to make transitions work\n\n  lookAt.push(1);\n\n  if (view === '2d') {\n    return {\n      distance,\n      fov,\n      lookAt,\n      rotationOrbit: 0,\n      rotationX: 0,\n      zoom: 10 / height\n    };\n  } else {\n    return {\n      distance,\n      fov,\n      lookAt,\n      rotationOrbit: -25,\n      rotationX: 60,\n      zoom: 9 / height\n    };\n  }\n}\n},{}],\"VMtV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Presenter = void 0;\n\nvar _base = require(\"./base\");\n\nvar _rule = require(\"./marks/rule\");\n\nvar _panel = require(\"./panel\");\n\nvar _color = require(\"./color\");\n\nvar _deckgl = require(\"./deck.gl-classes/deckgl\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _clone = require(\"./clone\");\n\nvar _d3Ease = require(\"d3-ease\");\n\nvar _layers = require(\"./layers\");\n\nvar _legend = require(\"./legend\");\n\nvar _linearInterpolator = require(\"./deck.gl-classes/linearInterpolator\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _patchedCubeArray = require(\"./patchedCubeArray\");\n\nvar _enums = require(\"./enums\");\n\nvar _stagers = require(\"./stagers\");\n\nvar _viewState = require(\"./viewState\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Class which presents a Stage of chart data using Deck.gl to render.\n */\nclass Presenter {\n  /**\n   * Instantiate a new Presenter.\n   * @param el Parent HTMLElement to present within.\n   * @param style Optional PresenterStyle styling options.\n   */\n  constructor(el, style) {\n    this.el = el;\n    this.style = (0, _clone.deepMerge)(_defaults.defaultPresenterStyle, style);\n    (0, _panel.initializePanel)(this);\n    this._last = {\n      view: null,\n      height: null,\n      width: null,\n      cubeCount: null,\n      stage: null\n    };\n  }\n  /**\n   * Get the previously rendered Stage object.\n   */\n\n\n  get stage() {\n    return this._last.stage;\n  }\n  /**\n   * Get the current View camera type.\n   */\n\n\n  get view() {\n    return this._last.view;\n  }\n  /**\n   * Cancels any pending animation, calling animationCanceled() on original queue.\n   */\n\n\n  animationCancel() {\n    if (this.animationTimer) {\n      clearTimeout(this.animationTimer);\n      this.animationTimer = null;\n\n      if (this.logger) {\n        this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || 'handler'}`);\n      }\n\n      if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n        this.queuedAnimationOptions.animationCanceled.call(null);\n      }\n    }\n  }\n  /**\n   * Stops the current animation and queues a new animation.\n   * @param handler Function to invoke when timeout is complete.\n   * @param timeout Length of time to wait before invoking the handler.\n   * @param options Optional QueuedAnimationOptions object.\n   */\n\n\n  animationQueue(handler, timeout, options) {\n    if (this.logger) {\n      this.logger(`queueing animation ${options && options.waitingLabel || 'waiting'}...`);\n    }\n\n    this.animationCancel();\n    this.animationTimer = setTimeout(() => {\n      if (this.logger) {\n        this.logger(`queueing animation ${options && options.handlerLabel || 'handler'}...`);\n      }\n\n      handler();\n    }, timeout);\n  }\n  /**\n   * Retrieve a sub-element of the rendered output.\n   * @param type PresenterElement type of the HTMLElement to retrieve.\n   */\n\n\n  getElement(type) {\n    const elements = this.el.getElementsByClassName((0, _panel.className)(type, this));\n\n    if (elements && elements.length) {\n      return elements[0];\n    }\n  }\n  /**\n   * Present the Vega Scene, or Stage object using Deck.gl.\n   * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n   * @param height Height of the rendering area.\n   * @param width Width of the rendering area.\n   * @param config Optional presentation configuration object.\n   */\n\n\n  present(sceneOrStage, height, width, config) {\n    this.animationCancel();\n    let scene = sceneOrStage;\n    let stage;\n    let options = {\n      offsetX: 0,\n      offsetY: 0,\n      maxOrdinal: -1,\n      ordinalsSpecified: false,\n      currAxis: null,\n      currFacetRect: null,\n      defaultCubeColor: this.style.defaultCubeColor\n    }; //determine if this is a vega scene\n\n    if (scene.marktype) {\n      stage = (0, _defaults.createStage)(scene.view);\n      (0, _stagers.sceneToStage)(options, stage, scene);\n    } else {\n      stage = sceneOrStage;\n    }\n\n    if (!this.deckgl) {\n      const classes = (0, _deckgl.createDeckGLClassesForPresenter)({\n        doubleClickHandler: () => {\n          this.homeCamera();\n        }\n      });\n      this.OrbitControllerClass = classes.OrbitControllerClass;\n      const deckProps = {\n        onLayerClick: config && config.onLayerClick,\n        views: [new _base.base.deck.OrbitView({\n          controller: this.OrbitControllerClass\n        })],\n        container: this.getElement(_enums.PresenterElement.gl),\n        getCursor: interactiveState => {\n          if (interactiveState.onText || interactiveState.onAxisSelection) {\n            return 'pointer';\n          } else if (interactiveState.onCube) {\n            return 'default';\n          } else {\n            return 'grab';\n          }\n        }\n      };\n\n      if (stage.backgroundColor) {\n        deckProps.style = {\n          'background-color': (0, _color.colorToString)(stage.backgroundColor)\n        };\n      }\n\n      this.deckgl = new classes.DeckGL_Class(deckProps);\n    }\n\n    let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n\n    if (options.ordinalsSpecified) {\n      cubeCount = Math.max(cubeCount, options.maxOrdinal + 1);\n      const empty = {\n        isEmpty: true,\n        color: [0, 0, 0, 0] // possibly a bug in Deck.gl? set color to invisible.\n\n      };\n      stage.cubeData = (0, _patchedCubeArray.patchCubeArray)(cubeCount, empty, stage.cubeData);\n    }\n\n    this.setDeckProps(stage, height, width, cubeCount, config);\n    (0, _tsxCreateElement.mount)((0, _legend.LegendView)({\n      legend: stage.legend,\n      onClick: config && config.onLegendClick\n    }), this.getElement(_enums.PresenterElement.legend));\n\n    if (config && config.onPresent) {\n      config.onPresent();\n    }\n  }\n  /**\n   * Present the same recently rendered Stage with only slight modifications such as a color change,\n   * using the previous Stage values as a basis.\n   * @param stage Partially populated Stage object containing changes.\n   * @param modifyConfig Optional presentation configuration object.\n   */\n\n\n  rePresent(stage, modifyConfig) {\n    const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n    this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n  }\n\n  isNewBounds(view, height, width, cubeCount) {\n    const lastBounds = this.lastBounds();\n\n    for (let prop in lastBounds) {\n      if (lastBounds[prop] === null) return true;\n    }\n\n    const newBounds = {\n      cubeCount,\n      height,\n      view,\n      width\n    };\n\n    for (let prop in lastBounds) {\n      if (lastBounds[prop] !== newBounds[prop]) return true;\n    }\n  }\n\n  lastBounds() {\n    const {\n      cubeCount,\n      height,\n      view,\n      width\n    } = this._last;\n    return {\n      cubeCount,\n      height,\n      view,\n      width\n    };\n  }\n\n  setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n    const config = (0, _clone.deepMerge)(_defaults.defaultPresenterConfig, modifyConfig);\n    const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n    let lightSettings = this.style.lightSettings[stage.view];\n    let lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n    let linearInterpolator; //choose the current OrbitView viewstate if possible\n\n    let viewState = this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView || //otherwise use the initial viewstate if any\n    this.deckgl.props.viewState;\n\n    if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n      viewState = (0, _viewState.targetViewState)(height, width, stage.view);\n      const oldCubeLayer = (0, _layers.getCubeLayer)(this.deckgl.props);\n\n      if (oldCubeLayer) {\n        linearInterpolator = new _linearInterpolator.LinearInterpolator(_viewState.viewStateProps);\n        linearInterpolator.layerStartProps = {\n          lightingMix: oldCubeLayer.props.lightingMix\n        };\n        linearInterpolator.layerEndProps = {\n          lightingMix\n        };\n        viewState.transitionDuration = config.transitionDurations.view;\n        viewState.transitionEasing = _d3Ease.easeExpInOut;\n        viewState.transitionInterpolator = linearInterpolator;\n      }\n\n      if (stage.view === '2d') {\n        lightSettings = this.style.lightSettings['3d'];\n      }\n    }\n\n    const guideLines = this._showGuides && (0, _rule.box)(0, 0, height, width, '#0f0', 1, true);\n    config.preLayer && config.preLayer(stage);\n    const layers = (0, _layers.getLayers)(this, config, stage, lightSettings, lightingMix, linearInterpolator, guideLines);\n    const deckProps = {\n      views: [new _base.base.deck.OrbitView({\n        controller: this.OrbitControllerClass\n      })],\n      viewState,\n      layers\n    };\n\n    if (config && config.preStage) {\n      config.preStage(stage, deckProps);\n    }\n\n    this.deckgl.setProps(deckProps);\n    delete stage.cubeData;\n    this._last = {\n      cubeCount,\n      height,\n      width,\n      stage: stage,\n      view: stage.view\n    };\n  }\n  /**\n   * Home the camera to the last initial position.\n   */\n\n\n  homeCamera() {\n    const viewState = (0, _viewState.targetViewState)(this._last.height, this._last.width, this._last.view);\n    viewState.transitionDuration = _defaults.defaultPresenterConfig.transitionDurations.view;\n    viewState.transitionEasing = _d3Ease.easeExpInOut;\n    viewState.transitionInterpolator = new _linearInterpolator.LinearInterpolator(_viewState.viewStateProps);\n    const deckProps = {\n      views: this.deckgl.props.views,\n      viewState,\n      layers: this.deckgl.props.layers\n    };\n    this.deckgl.setProps(deckProps);\n  }\n  /**\n   * Get cube data array from the cubes layer.\n   */\n\n\n  getCubeData() {\n    return (0, _layers.getCubes)(this.deckgl.props);\n  }\n  /**\n   * Show guidelines of rendering height/width and center of OrbitView.\n   */\n\n\n  showGuides() {\n    this._showGuides = true;\n    this.getElement(_enums.PresenterElement.gl).classList.add('show-center');\n    this.rePresent(Object.assign(Object.assign({}, this._last.stage), {\n      cubeData: this.getCubeData()\n    }));\n  }\n\n  finalize() {\n    this.animationCancel();\n    if (this.deckgl) this.deckgl.finalize();\n    if (this.el) this.el.innerHTML = '';\n    this._last = null;\n    this.deckgl = null;\n    this.el = null;\n    this.logger = null;\n    this.queuedAnimationOptions = null;\n  }\n\n}\n\nexports.Presenter = Presenter;\n},{\"./base\":\"To8D\",\"./marks/rule\":\"YfRA\",\"./panel\":\"qkJA\",\"./color\":\"j7Ij\",\"./deck.gl-classes/deckgl\":\"NGGy\",\"./defaults\":\"jQIe\",\"./clone\":\"Jcn2\",\"d3-ease\":\"id0f\",\"./layers\":\"U4xU\",\"./legend\":\"zxV0\",\"./deck.gl-classes/linearInterpolator\":\"BfWC\",\"tsx-create-element\":\"YitK\",\"./patchedCubeArray\":\"sE6a\",\"./enums\":\"qyL6\",\"./stagers\":\"yA2f\",\"./viewState\":\"sOaQ\"}],\"wGit\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.RendererGl = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n//pass in the SuperClass, which should be a vega.View\nfunction _RendererGl(loader) {\n  //dynamic superclass, since we don't know have vega.View in the declaration phase\n  class RendererGlInternal extends _base.base.vega.Renderer {\n    initialize(el, width, height, origin) {\n      this.height = height;\n      this.width = width; // this method will invoke resize to size the canvas appropriately\n\n      return super.initialize(el, width, height, origin);\n    }\n\n    resize(width, height, origin) {\n      super.resize(width, height, origin);\n      this.origin = origin;\n      this.height = height;\n      this.width = width; //rteturn this for vega\n\n      return this;\n    }\n\n    _render(scene, items) {\n      const scene3d = scene;\n      scene3d.view = this.getView();\n      this.presenter.present(scene3d, this.height, this.width, this.presenterConfig); //return this for vega\n\n      return this;\n    }\n\n  }\n\n  const instance = new RendererGlInternal(loader);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n * This is instantiated by ViewGl.\n */\n\n\nconst RendererGl = _RendererGl;\nexports.RendererGl = RendererGl;\n},{\"../base\":\"To8D\"}],\"FyHd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ViewGl = void 0;\n\nvar _base = require(\"../base\");\n\nvar _defaults = require(\"../defaults\");\n\nvar _presenter = require(\"../presenter\");\n\nvar _enums = require(\"../enums\");\n\nvar _rendererGl = require(\"./rendererGl\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nlet registered = false; //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n//pass in the SuperClass, which should be a vega.View\n\nfunction _ViewGl(runtime, config) {\n  //dynamic superclass, since we don't know have vega.View in the declaration phase\n  class ViewGlInternal extends _base.base.vega.View {\n    constructor(runtime, config = {}) {\n      super(runtime, config);\n      this.config = config;\n      this.presenter = config.presenter;\n      config.presenterConfig = config.presenterConfig || {};\n\n      config.presenterConfig.redraw = () => {\n        this._redraw = true; //use Vega View private member _redraw\n\n        this.run();\n      };\n    }\n\n    renderer(renderer) {\n      if (renderer === 'deck.gl' && !registered) {\n        _base.base.vega.renderModule('deck.gl', {\n          handler: _base.base.vega.CanvasHandler,\n          renderer: _rendererGl.RendererGl\n        });\n\n        registered = true;\n      }\n\n      return super.renderer(renderer);\n    }\n\n    initialize(el) {\n      if (!this.presenter) {\n        this.presenter = new _presenter.Presenter(el);\n      }\n\n      super.initialize(this.presenter.getElement(_enums.PresenterElement.vegaControls));\n      const renderer = this._renderer;\n      renderer.presenterConfig = this.config.presenterConfig;\n      renderer.presenter = this.presenter;\n\n      renderer.getView = this.config && this.config.getView || (() => this.presenter.view || _defaults.defaultView);\n\n      return this;\n    }\n\n    error(e) {\n      if (this.presenter.logger) {\n        this.presenter.logger(e);\n      }\n    }\n\n  }\n\n  const instance = new ViewGlInternal(runtime, config);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.View, with added properties for accessing a Presenter.\n * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n */\n\n\nconst ViewGl = _ViewGl;\nexports.ViewGl = ViewGl;\n},{\"../base\":\"To8D\",\"../defaults\":\"jQIe\",\"../presenter\":\"VMtV\",\"../enums\":\"qyL6\",\"./rendererGl\":\"wGit\"}],\"eFEk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar _exportNames = {\n  constants: true,\n  controls: true,\n  types: true,\n  util: true,\n  defaults: true,\n  base: true,\n  use: true,\n  Presenter: true,\n  ViewGl: true\n};\nObject.defineProperty(exports, \"base\", {\n  enumerable: true,\n  get: function () {\n    return _base.base;\n  }\n});\nObject.defineProperty(exports, \"use\", {\n  enumerable: true,\n  get: function () {\n    return _base.use;\n  }\n});\nObject.defineProperty(exports, \"Presenter\", {\n  enumerable: true,\n  get: function () {\n    return _presenter.Presenter;\n  }\n});\nObject.defineProperty(exports, \"ViewGl\", {\n  enumerable: true,\n  get: function () {\n    return _viewGl.ViewGl;\n  }\n});\nexports.defaults = exports.util = exports.types = exports.controls = exports.constants = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar controls = _interopRequireWildcard(require(\"./exports/controls\"));\n\nexports.controls = controls;\n\nvar types = _interopRequireWildcard(require(\"./exports/types\"));\n\nexports.types = types;\n\nvar util = _interopRequireWildcard(require(\"./exports/util\"));\n\nexports.util = util;\n\nvar defaults = _interopRequireWildcard(require(\"./defaults\"));\n\nexports.defaults = defaults;\n\nvar _base = require(\"./base\");\n\nvar _presenter = require(\"./presenter\");\n\nvar _viewGl = require(\"./vega-classes/viewGl\");\n\nvar _enums = require(\"./enums\");\n\nObject.keys(_enums).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _enums[key];\n    }\n  });\n});\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./constants\":\"Fy6F\",\"./exports/controls\":\"kUTU\",\"./exports/types\":\"dNRs\",\"./exports/util\":\"WeBf\",\"./defaults\":\"jQIe\",\"./base\":\"To8D\",\"./presenter\":\"VMtV\",\"./vega-classes/viewGl\":\"FyHd\",\"./enums\":\"qyL6\"}],\"SLia\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getColumnsFromData = getColumnsFromData;\nexports.inferAll = inferAll;\nexports.getStats = getStats;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction isQuantitative(column) {\n  return column.type === 'number' || column.type === 'integer';\n}\n/**\n * Derive column metadata from the data array.\n * @param data Array of data objects.\n */\n\n\nfunction getColumnsFromData(data, columnTypes) {\n  const sample = data[0];\n  const fields = sample ? Object.keys(sample) : [];\n  const inferences = Object.assign(Object.assign({}, VegaDeckGl.base.vega.inferTypes(data, fields)), columnTypes);\n  const columns = fields.map(name => {\n    const column = {\n      name,\n      type: inferences[name]\n    };\n    return column;\n  });\n  inferAll(columns, data);\n  return columns;\n}\n/**\n * Populate columns with type inferences and stats.\n * @param columns Array of columns.\n * @param data Array of data objects.\n */\n\n\nfunction inferAll(columns, data) {\n  columns.forEach(column => {\n    if (column) {\n      if (typeof column.quantitative !== 'boolean') {\n        column.quantitative = isQuantitative(column);\n      }\n\n      if (column.type === 'string') {\n        checkIsColorData(data, column);\n      }\n\n      if (!column.stats) {\n        column.stats = getStats(data, column);\n      }\n    }\n  });\n}\n\nfunction checkIsColorData(data, column) {\n  for (let i = 0; i < data.length; i++) {\n    if (!VegaDeckGl.util.isColor(data[i][column.name])) {\n      return;\n    }\n  }\n\n  column.isColorData = true;\n}\n\nfunction getStats(data, column) {\n  const distinctMap = {};\n  const stats = {\n    distinctValueCount: null,\n    max: null,\n    mean: null,\n    min: null\n  };\n  let sum = 0;\n\n  for (let i = 0; i < data.length; i++) {\n    let row = data[i];\n    let value = row[column.name];\n    distinctMap[value] = true;\n\n    if (stats.max === null || value > stats.max) {\n      stats.max = value;\n    }\n\n    if (stats.min === null || value < stats.min) {\n      stats.min = value;\n    }\n\n    let num = +value;\n\n    if (!isNaN(num)) {\n      sum += num;\n    }\n\n    if (column.type === 'string' && !stats.hasColorData && VegaDeckGl.util.isColor(value)) {\n      stats.hasColorData = true;\n    }\n  }\n\n  if (column.quantitative) {\n    stats.mean = data.length > 0 && sum / data.length;\n    stats.hasNegative = detectNegative(column, data);\n\n    if (column.type === 'integer') {\n      stats.isSequential = detectSequentialColumn(column, data);\n    }\n  }\n\n  stats.distinctValueCount = Object.keys(distinctMap).length;\n  return stats;\n}\n\nfunction detectNegative(column, data) {\n  for (let i = 1; i < data.length; i++) {\n    if (data[i][column.name] < 0) return true;\n  }\n\n  return false;\n}\n\nfunction detectSequentialColumn(column, data) {\n  if (data.length < 2) return false;\n  let colname = column.name;\n\n  for (let i = 1; i < data.length; i++) {\n    if (data[i][colname] !== data[i - 1][colname] + 1) return false;\n  }\n\n  return true;\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\"}],\"G0Md\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPresenterStyle = getPresenterStyle;\nexports.dualColorSchemeColors = exports.cssPrefix = exports.defaultViewerOptions = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst {\n  defaultPresenterConfig,\n  defaultPresenterStyle\n} = VegaDeckGl.defaults;\nconst {\n  desaturate\n} = VegaDeckGl.util;\nconst defaultViewerOptions = {\n  colors: {\n    activeCube: [128, 0, 128, 255],\n    defaultCube: defaultPresenterStyle.defaultCubeColor,\n    hoveredCube: defaultPresenterStyle.highlightColor,\n    selectedCube: [255, 255, 0, 255],\n    axisSelectHighlight: [128, 128, 128, 128],\n    axisLine: [0, 0, 0, 255],\n    axisText: [0, 0, 0, 255],\n    cellFillerLine: [128, 128, 128, 255],\n    unselectedColorMethod: color => {\n      const c = desaturate(color, 0.05);\n      c[3] = 171;\n      return c;\n    }\n  },\n  language: {\n    headers: {\n      chart: 'Chart',\n      details: 'Details',\n      legend: 'Legend',\n      selection: 'Select & Filter'\n    },\n    bing: 'bing',\n    newColorMap: 'remap color to filtered items',\n    oldColorMap: 'keep same colors',\n    deselect: 'deselect',\n    exclude: 'exclude',\n    isolate: 'isolate',\n    legendOther: 'other',\n    nextDetail: '>',\n    previousDetail: '<',\n    reset: 'reset',\n    colorBinCount: 'Color bin count',\n    colorReverse: 'Color reverse',\n    count: 'Count',\n    scatterPointSize: 'Point size',\n    XBinSize: 'X axis bin size',\n    YBinSize: 'Y axis bin size',\n    XGridSize: 'X grid size',\n    YGridSize: 'Y grid size',\n    InnerPaddingSize: 'Inner padding size',\n    OuterPaddingSize: 'Outer padding size',\n    treeMapMethod: 'Method',\n    facetColumns: 'Facet columns',\n    facetRows: 'Facet rows',\n    markOpacitySignal: 'Mark opacity',\n    textScaleSignal: 'Text scale',\n    xAxisTextAngleSignal: 'X axis text angle',\n    yAxisTextAngleSignal: 'Y axis text angle',\n    zScaleProportion: 'Z scale proportion to Y',\n    selectionCount: count => `${count} items selected`\n  },\n  maxLegends: 19,\n  onError: errors => {//console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n  },\n  transitionDurations: Object.assign(Object.assign({}, defaultPresenterConfig.transitionDurations), {\n    scope: 600\n  }),\n  selectionPolygonZ: -1,\n  tickSize: 10,\n  facetMargins: {\n    column: 40,\n    row: 40,\n    title: 40\n  }\n};\nexports.defaultViewerOptions = defaultViewerOptions;\n\nfunction getPresenterStyle(options) {\n  var style = {\n    cssPrefix,\n    fontFamily: options.fontFamily,\n    defaultCubeColor: options.colors.defaultCube\n  };\n\n  if (options.colors.hoveredCube) {\n    style.highlightColor = options.colors.hoveredCube;\n  }\n\n  if (options.lightSettings) {\n    style.lightSettings = options.lightSettings;\n  }\n\n  return style;\n}\n\nconst cssPrefix = 'sanddance-';\nexports.cssPrefix = cssPrefix;\nconst dualColorSchemeColors = {\n  black: '#212121',\n  gray: '#D2D2D2',\n  blue: '#0060F0',\n  green: '#00C000',\n  orange: '#FF9900',\n  red: '#E00000'\n};\nexports.dualColorSchemeColors = dualColorSchemeColors;\n},{\"@msrvida/vega-deck.gl\":\"eFEk\"}],\"BTLl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isInternalFieldName = isInternalFieldName;\nObject.defineProperty(exports, \"getColumnsFromData\", {\n  enumerable: true,\n  get: function () {\n    return _inference.getColumnsFromData;\n  }\n});\nObject.defineProperty(exports, \"getStats\", {\n  enumerable: true,\n  get: function () {\n    return _inference.getStats;\n  }\n});\nObject.defineProperty(exports, \"inferAll\", {\n  enumerable: true,\n  get: function () {\n    return _inference.inferAll;\n  }\n});\nObject.defineProperty(exports, \"ensureSearchExpressionGroupArray\", {\n  enumerable: true,\n  get: function () {\n    return _group.ensureSearchExpressionGroupArray;\n  }\n});\nObject.defineProperty(exports, \"getPresenterStyle\", {\n  enumerable: true,\n  get: function () {\n    return _defaults.getPresenterStyle;\n  }\n});\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"./constants\");\n\nvar _inference = require(\"./specs/inference\");\n\nvar _group = require(\"./searchExpression/group\");\n\nvar _defaults = require(\"./defaults\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst {\n  GL_ORDINAL\n} = VegaDeckGl.constants;\n\nfunction isInternalFieldName(columnName, includeVegaDeckGLFields = false) {\n  if (includeVegaDeckGLFields) {\n    if (columnName === GL_ORDINAL) return true;\n  }\n\n  for (let f in _constants.FieldNames) {\n    if (columnName === _constants.FieldNames[f]) return true;\n  }\n\n  return false;\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"./constants\":\"Syc7\",\"./specs/inference\":\"SLia\",\"./searchExpression/group\":\"yy6X\",\"./defaults\":\"G0Md\"}],\"kNpg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.registerColorSchemes = registerColorSchemes;\nexports.colorSchemes = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nvar _defaults = require(\"./defaults\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst dualPairs = [[_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.gray], [_defaults.dualColorSchemeColors.red, _defaults.dualColorSchemeColors.green], [_defaults.dualColorSchemeColors.red, _defaults.dualColorSchemeColors.blue], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.red], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.orange], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.green]];\n/**\n * Array of color schemes.\n */\n\nconst colorSchemes = [{\n  scheme: _constants.ColorScaleNone,\n  colors: [VegaDeckGl.util.colorToString(_defaults.defaultViewerOptions.colors.defaultCube)]\n}];\nexports.colorSchemes = colorSchemes;\ncreateDualColorSchemes();\n\nfunction registerColorSchemes(vega) {\n  colorSchemes.forEach(cs => {\n    if (cs.colors.length === 1) {\n      vega.scheme(cs.scheme, x => cs.colors[0]);\n    } else {\n      vega.scheme(cs.scheme, cs.colors);\n    }\n  });\n}\n\nfunction createPair(names, colors) {\n  const scheme = `dual_${names[0]}${names[1]}`;\n  colorSchemes.push({\n    scheme,\n    colors\n  });\n}\n\nfunction createDualColorSchemes() {\n  dualPairs.forEach(colors => {\n    const names = colors.map(color => {\n      for (let key in _defaults.dualColorSchemeColors) if (color === _defaults.dualColorSchemeColors[key]) return key;\n    });\n    createPair(names, colors);\n    createPair([...names].reverse(), [...colors].reverse());\n  });\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"./specs/constants\":\"b0rV\",\"./defaults\":\"G0Md\"}],\"U1OZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Animator = exports.DataLayoutChange = void 0;\nvar DataLayoutChange;\nexports.DataLayoutChange = DataLayoutChange;\n\n(function (DataLayoutChange) {\n  DataLayoutChange[DataLayoutChange[\"same\"] = 0] = \"same\";\n  DataLayoutChange[DataLayoutChange[\"reset\"] = 1] = \"reset\";\n  DataLayoutChange[DataLayoutChange[\"refine\"] = 2] = \"refine\";\n})(DataLayoutChange || (exports.DataLayoutChange = DataLayoutChange = {}));\n\nclass Animator {\n  constructor(dataScope, props) {\n    this.dataScope = dataScope;\n    this.props = props;\n  }\n\n  select(search) {\n    return new Promise((resolve, reject) => {\n      this.dataScope.select(search);\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  deselect() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deselect();\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  filter(search, keepData, collapseData) {\n    this.dataScope.collapse(true, collapseData);\n    return new Promise((resolve, reject) => {\n      this.props.onAnimateDataChange(DataLayoutChange.refine, 'before refine', 'refine').then(() => {\n        this.dataScope.deselect();\n        this.dataScope.setFilteredData(keepData);\n        this.props.onDataChanged(DataLayoutChange.refine, search);\n        resolve();\n      }).catch(reject);\n    });\n  }\n\n  reset() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deselect();\n      this.dataScope.setFilteredData(null);\n      this.props.onAnimateDataChange(DataLayoutChange.reset, 'before reset', 'reset').then(() => {\n        this.dataScope.collapse(false);\n        this.props.onDataChanged(DataLayoutChange.reset);\n        resolve();\n      }).catch(reject);\n    });\n  }\n\n  activate(datum) {\n    return new Promise((resolve, reject) => {\n      this.dataScope.activate(datum);\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  deactivate() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deactivate();\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n}\n\nexports.Animator = Animator;\n},{}],\"PfBA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getSelectedColorMap = getSelectedColorMap;\nexports.colorMapFromCubes = colorMapFromCubes;\nexports.populateColorContext = populateColorContext;\nexports.applyColorMapToCubes = applyColorMapToCubes;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction getSelectedColorMap(currentData, showSelectedData, showActive, viewerOptions) {\n  function getSelectionColorItem(datum) {\n    let item;\n\n    if (showSelectedData) {\n      item = datum[_constants.FieldNames.Selected] ? {\n        color: viewerOptions.colors.selectedCube\n      } : {\n        unSelected: true\n      };\n    }\n\n    if (showActive && datum[_constants.FieldNames.Active]) {\n      item = {\n        color: viewerOptions.colors.activeCube\n      };\n    }\n\n    return item;\n  }\n\n  const colorMap = {};\n  currentData.forEach(datum => {\n    const selectionColor = getSelectionColorItem(datum);\n\n    if (selectionColor) {\n      const ordinal = datum[VegaDeckGl.constants.GL_ORDINAL];\n      colorMap[ordinal] = selectionColor;\n    }\n  });\n  return colorMap;\n}\n\nfunction colorMapFromCubes(cubes) {\n  const map = {};\n  cubes.forEach(cube => {\n    map[cube.ordinal] = {\n      color: cube.color\n    };\n  });\n  return map;\n}\n\nfunction populateColorContext(colorContext, presenter) {\n  if (!colorContext.colorMap) {\n    const cubes = presenter.getCubeData();\n    colorContext.colorMap = colorMapFromCubes(cubes);\n  }\n\n  colorContext.legend = VegaDeckGl.util.clone(presenter.stage.legend);\n  colorContext.legendElement = presenter.getElement(VegaDeckGl.PresenterElement.legend).children[0];\n}\n\nfunction applyColorMapToCubes(maps, cubes, unselectedColorMethod) {\n  Object.keys(maps[0]).forEach(ordinal => {\n    const cube = cubes[+ordinal];\n\n    if (cube && !cube.isEmpty) {\n      const actualColorMappedItem = maps[0][ordinal];\n\n      if (maps.length > 1) {\n        const selectedColorMappedItem = maps[1][ordinal];\n\n        if (selectedColorMappedItem) {\n          if (selectedColorMappedItem.unSelected && unselectedColorMethod) {\n            cube.color = unselectedColorMethod(actualColorMappedItem.color);\n          } else {\n            cube.color = selectedColorMappedItem.color;\n          }\n\n          return;\n        }\n      }\n\n      cube.color = actualColorMappedItem.color;\n    }\n  });\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"./specs/constants\":\"b0rV\"}],\"jmI2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.applySignalValues = applySignalValues;\nexports.extractSignalValuesFromView = extractSignalValuesFromView;\n\nfunction applySignalValues(sv, b) {\n  if (!sv || !b || !b.signals || !b.signals.length) return;\n\n  for (let key in sv) {\n    let value = sv[key];\n    let signalB = b.signals.filter(signal => signal.name === key)[0];\n\n    if (signalB && signalB.bind) {\n      signalB.value = value;\n    }\n  }\n}\n\nfunction extractSignalValuesFromView(view, spec) {\n  if (!view || !spec || !spec.signals || !spec.signals.length) return;\n  const result = {};\n  spec.signals.forEach(signalA => {\n    //bound to a UI control\n    if (signalA.bind) {\n      try {\n        result[signalA.name] = view.signal(signalA.name);\n      } catch (e) {// continue regardless of error\n      }\n    }\n  });\n  return result;\n}\n},{}],\"dxn8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.assignOrdinals = assignOrdinals;\nexports.getSpecColumns = getSpecColumns;\nexports.getDataIndexOfCube = getDataIndexOfCube;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction assignOrdinals(columns, data, ordinalMap) {\n  const uCol = columns.uid && columns.uid.name;\n\n  if (ordinalMap) {\n    data.forEach((d, i) => {\n      const key = uCol ? d[uCol] : i;\n      d[VegaDeckGl.constants.GL_ORDINAL] = ordinalMap[key];\n    });\n  } else {\n    ordinalMap = {};\n    data.forEach((d, i) => {\n      d[VegaDeckGl.constants.GL_ORDINAL] = i;\n      const uColValue = uCol ? d[uCol] : i;\n      ordinalMap[uColValue] = i;\n    });\n  }\n\n  return ordinalMap;\n}\n\nfunction getSpecColumns(insight, columns) {\n  function getColumnByName(name) {\n    return columns.filter(c => c.name === name)[0];\n  }\n\n  return {\n    color: getColumnByName(insight.columns && insight.columns.color),\n    facet: getColumnByName(insight.columns && insight.columns.facet),\n    group: getColumnByName(insight.columns && insight.columns.group),\n    size: getColumnByName(insight.columns && insight.columns.size),\n    sort: getColumnByName(insight.columns && insight.columns.sort),\n    uid: getColumnByName(insight.columns && insight.columns.uid),\n    x: getColumnByName(insight.columns && insight.columns.x),\n    y: getColumnByName(insight.columns && insight.columns.y),\n    z: getColumnByName(insight.columns && insight.columns.z)\n  };\n}\n\nfunction getDataIndexOfCube(cube, data) {\n  const len = data.length;\n\n  for (let i = 0; i < len; i++) {\n    if (data[i][VegaDeckGl.constants.GL_ORDINAL] === cube.ordinal) {\n      return i;\n    }\n  }\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\"}],\"Ifgo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.facetSignals = facetSignals;\nexports.checkForFacetErrors = checkForFacetErrors;\nexports.facetSize = facetSize;\nexports.layout = layout;\nexports.facetBinStep = facetBinStep;\nexports.facetSourceData = facetSourceData;\nexports.facetGroupData = facetGroupData;\nexports.facetTransforms = facetTransforms;\nexports.facetMarks = facetMarks;\nexports.facetTitleSeparator = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nconst FacetColumnsSequence = 'FacetColumnsSequence';\nconst FacetRowsSequence = 'FacetRowsSequence';\nconst SequenceNumber = 'SequenceNumber';\nconst CellTitle = 'CellTitle';\nconst CellFiller = 'CellFiller';\nconst facetTitleSeparator = ' - ';\nexports.facetTitleSeparator = facetTitleSeparator;\n\nfunction facetSignals(context) {\n  const {\n    insight\n  } = context;\n  const {\n    facets\n  } = insight;\n  const signals = [{\n    name: _constants.SignalNames.FacetColumns,\n    value: facets.columns\n  }, {\n    name: _constants.SignalNames.FacetRows,\n    value: facets.rows\n  }];\n  return signals;\n}\n\nfunction checkForFacetErrors(facets, errors) {\n  if (facets) {\n    const gridCapacity = facets.columns * facets.rows;\n\n    if (!gridCapacity) {\n      errors.push('Must set facets columns & rows to non-zero.');\n    }\n\n    if (gridCapacity < 2) {\n      errors.push('Not enough facets to facet.');\n    }\n\n    if (!facets.columns || facets.columns < 1) {\n      errors.push('Facet column columns must be greater than 1.');\n    }\n\n    if (!facets.rows || facets.rows < 1) {\n      errors.push('Facet column rows must be greater than 1.');\n    }\n  }\n}\n\nfunction facetSize(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const {\n    facets,\n    size\n  } = insight;\n  return {\n    height: (size.height - (facets.rows + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.column)) / facets.columns,\n    width: (size.width - (facets.columns + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.row)) / facets.rows\n  };\n}\n\nfunction layout(context) {\n  const {\n    specViewOptions\n  } = context;\n  const layout = {\n    columns: {\n      signal: _constants.SignalNames.FacetColumns\n    },\n    bounds: 'full',\n    padding: {\n      column: specViewOptions.facetMargins.column,\n      row: specViewOptions.facetMargins.row\n    }\n  };\n  return layout;\n}\n\nfunction facetBinStep(facetColumn, facetCount) {\n  const range = facetColumn.stats.max - facetColumn.stats.min;\n  return range / facetCount;\n}\n\nfunction emptyBinsDataSource(name, facetColumn, facets) {\n  const gridCapacity = facets.columns * facets.rows;\n  const step = facetBinStep(facetColumn, gridCapacity);\n  const steps = [];\n\n  for (let i = 0; i < gridCapacity; i++) {\n    steps[i] = facetColumn.stats.min + i * step + step / 2;\n  }\n\n  const values = steps.map(s => {\n    const obj = {};\n    obj[_constants.FieldNames.Collapsed] = true;\n    obj[facetColumn.name] = s;\n    return obj;\n  });\n  const data = {\n    name,\n    values\n  };\n  return data;\n}\n\nfunction facetSourceData(facetColumn, facets, name) {\n  let data;\n\n  if (facetColumn && facetColumn.quantitative) {\n    data = [{\n      name: _constants.DataNames.Pre\n    }, emptyBinsDataSource(_constants.DataNames.EmptyBin, facetColumn, facets), {\n      name,\n      source: [_constants.DataNames.Pre, _constants.DataNames.EmptyBin]\n    }];\n  } else {\n    data = [{\n      name\n    }];\n  }\n\n  return data;\n}\n\nfunction facetGroupData(source) {\n  const data = [{\n    name: _constants.DataNames.FacetCellTitles,\n    source,\n    transform: [{\n      type: 'aggregate',\n      groupby: [CellTitle]\n    }]\n  }, {\n    name: CellFiller,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      step: 1,\n      stop: {\n        signal: `${_constants.SignalNames.FacetColumns} * ${_constants.SignalNames.FacetRows} - length(data('${_constants.DataNames.FacetCellTitles}'))`\n      }\n    }]\n  }, {\n    name: FacetColumnsSequence,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      stop: {\n        signal: _constants.SignalNames.FacetColumns\n      },\n      as: SequenceNumber\n    }]\n  }, {\n    name: FacetRowsSequence,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      stop: {\n        signal: _constants.SignalNames.FacetRows\n      },\n      as: SequenceNumber\n    }]\n  }];\n  return data;\n}\n\nfunction facetTransforms(facetColumn, facets) {\n  let transforms;\n\n  if (facetColumn.quantitative) {\n    const gridCapacity = facets.columns * facets.rows;\n    const step = facetBinStep(facetColumn, gridCapacity);\n    transforms = [{\n      type: 'bin',\n      field: facetColumn.name,\n      step,\n      nice: false,\n      extent: [facetColumn.stats.min, facetColumn.stats.max],\n      as: [_constants.FieldNames.FacetBin0, _constants.FieldNames.FacetBin1]\n    }, {\n      type: 'collect',\n      sort: {\n        field: _constants.FieldNames.FacetBin0\n      }\n    }, {\n      type: 'formula',\n      expr: `format(datum.${_constants.FieldNames.FacetBin0}, '~r') + '${facetTitleSeparator}' + format(datum.${_constants.FieldNames.FacetBin1}, '~r')`,\n      as: CellTitle\n    }];\n  } else {\n    transforms = [{\n      type: 'formula',\n      expr: `datum[${JSON.stringify(facetColumn.name)}]`,\n      as: CellTitle\n    }];\n  }\n\n  return transforms;\n}\n\nfunction facetMarks(specViewOptions, sourceDataName, childMarks, childAxes, childData) {\n  //TODO: create a style\n  const cellFillerLineColor = _vegaDeck.util.colorToString(specViewOptions.colors.cellFillerLine);\n\n  const style = 'cell';\n  const mark = {\n    style,\n    type: 'group',\n    from: {\n      facet: {\n        name: _constants.DataNames.FacetGroupCell,\n        data: sourceDataName,\n        groupby: [CellTitle]\n      }\n    },\n    title: {\n      frame: 'group',\n      offset: specViewOptions.facetMargins.title,\n      text: {\n        signal: `parent['${CellTitle}']`\n      },\n      limit: {\n        signal: 'width'\n      },\n      color: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n      fontSize: {\n        signal: _constants.SignalNames.TextSize\n      }\n    },\n    encode: {\n      update: {\n        width: {\n          signal: 'width'\n        },\n        height: {\n          signal: 'height'\n        }\n      }\n    },\n    data: childData,\n    marks: childMarks.map(mark => {\n      if (mark.from && mark.from.data && mark.from.data === sourceDataName) {\n        mark.from.data = _constants.DataNames.FacetGroupCell;\n      }\n\n      return mark;\n    })\n  };\n\n  if (childAxes) {\n    mark.axes = childAxes.map(axis => {\n      const clone = _vegaDeck.util.clone(axis); //remove all labels and titles\n\n\n      clone.labels = false;\n      delete clone.title;\n      delete clone.titleAlign;\n      delete clone.titleAngle;\n      delete clone.titleFontSize;\n      return clone;\n    });\n  }\n\n  const filler = {\n    style: 'cell',\n    type: 'group',\n    from: {\n      data: CellFiller\n    },\n    title: {\n      frame: 'group',\n      offset: specViewOptions.facetMargins.title,\n      text: '',\n      fontSize: {\n        signal: _constants.SignalNames.TextSize\n      }\n    },\n    encode: {\n      update: {\n        width: {\n          signal: 'width'\n        },\n        height: {\n          signal: 'height'\n        }\n      }\n    }\n  };\n\n  if (childAxes) {\n    filler.axes = childAxes.map(axis => {\n      const clone = _vegaDeck.util.clone(axis); //remove all labels and titles\n\n\n      clone.labels = false;\n      delete clone.title;\n      delete clone.titleAlign;\n      delete clone.titleAngle;\n      delete clone.titleFontSize; //change tick & domain color\n\n      clone.tickColor = cellFillerLineColor;\n      clone.domainColor = cellFillerLineColor;\n      return clone;\n    });\n  }\n\n  const rowHeader = {\n    type: 'group',\n    role: 'row-header',\n    from: {\n      facet: {\n        name: 'row-headers',\n        data: FacetRowsSequence,\n        groupby: [SequenceNumber]\n      }\n    }\n  };\n\n  if (childAxes) {\n    rowHeader.axes = [cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'left')[0], specViewOptions.facetMargins.column)];\n  }\n\n  const columnFooter = {\n    type: 'group',\n    role: 'column-footer',\n    from: {\n      facet: {\n        name: 'column-footers',\n        data: FacetColumnsSequence,\n        groupby: [SequenceNumber]\n      }\n    }\n  };\n\n  if (childAxes) {\n    columnFooter.axes = [cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'bottom')[0], specViewOptions.facetMargins.row)];\n  }\n\n  const marks = [mark, filler, rowHeader, columnFooter];\n  return marks;\n}\n\nfunction cloneAndOffsetAxis(axis, margin) {\n  if (axis) {\n    const clone = _vegaDeck.util.clone(axis);\n\n    clone.offset = margin;\n    return clone;\n  }\n}\n},{\"./constants\":\"b0rV\",\"@msrvida/vega-deck.gl\":\"eFEk\"}],\"JTcr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.notNice = notNice;\nexports.selectNullOrEmpty = selectNullOrEmpty;\nexports.selectExact = selectExact;\nexports.selectNone = selectNone;\nexports.selectExactAxis = selectExactAxis;\nexports.selectBetween = selectBetween;\nexports.selectBetweenAxis = selectBetweenAxis;\nexports.selectBetweenFacet = selectBetweenFacet;\n\nvar _facet = require(\"./specs/facet\");\n\nfunction notNice(niceValue) {\n  //convert \"nice\" numbers to numeric value\n  return (niceValue + '').replace(/,/g, '');\n}\n\nfunction tickValue(axis, i) {\n  const tick = axis.tickText[i];\n  let value;\n\n  if (tick) {\n    value = axis.tickText[i].value;\n  }\n\n  return {\n    tick,\n    value\n  };\n}\n\nfunction selectNullOrEmpty(column) {\n  const searchExpression = {\n    name: column.name,\n    operator: 'isnullorEmpty'\n  };\n  return searchExpression;\n}\n\nfunction selectExact(column, value) {\n  if (value == null) {\n    return selectNullOrEmpty(column);\n  }\n\n  const searchExpression = {\n    name: column.name,\n    operator: '==',\n    value\n  };\n  return searchExpression;\n}\n\nfunction selectNone(column, values) {\n  const expressions = values.map((value, i) => {\n    const searchExpression = {\n      name: column.name,\n      operator: '!=',\n      value\n    };\n\n    if (i) {\n      searchExpression.clause = '&&';\n    }\n\n    return searchExpression;\n  });\n  const searchExpressionGroup = {\n    expressions\n  };\n  return searchExpressionGroup;\n}\n\nfunction selectExactAxis(axis, column, i) {\n  const result = tickValue(axis, i);\n\n  if (result.tick) {\n    return selectExact(column, result.value);\n  }\n}\n\nfunction selectBetween(column, lowValue, highValue, lowOperator = '>=', highOperator = '<') {\n  const expressions = [];\n\n  if (lowValue !== undefined) {\n    expressions.push({\n      name: column.name,\n      operator: lowOperator,\n      value: lowValue\n    });\n  }\n\n  if (highValue !== undefined) {\n    expressions.push({\n      name: column.name,\n      operator: highOperator,\n      value: highValue\n    });\n  }\n\n  if (expressions.length > 1) {\n    expressions[1].clause = '&&';\n  }\n\n  const searchExpressionGroup = {\n    expressions\n  };\n  return searchExpressionGroup;\n}\n\nfunction selectBetweenAxis(axis, column, i) {\n  const low = tickValue(axis, i);\n  const high = tickValue(axis, i + 1);\n  return selectBetween(column, low.value, high.value);\n}\n\nfunction selectBetweenFacet(column, title, isFirst, isLast) {\n  const values = title.split(_facet.facetTitleSeparator);\n  return selectBetween(column, isFirst ? undefined : values[0], isLast ? undefined : values[1]);\n}\n},{\"./specs/facet\":\"Ifgo\"}],\"oIzg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.axisSelectionLayer = axisSelectionLayer;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _expression = require(\"./expression\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction axisSelectionLayer(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n  const polygons = [];\n  const xRole = specCapabilities.roles.filter(r => r.role === 'x')[0];\n\n  if (xRole && xRole.axisSelection) {\n    stage.axes.x.filter(axis => axis.tickText.length).forEach(axis => {\n      polygons.push.apply(polygons, axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n    });\n  }\n\n  const yRole = specCapabilities.roles.filter(r => r.role === 'y')[0];\n\n  if (yRole && yRole.axisSelection) {\n    stage.axes.y.filter(axis => axis.tickText.length).forEach(axis => {\n      polygons.push.apply(polygons, axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n    });\n  }\n\n  if (stage.facets) {\n    polygons.push.apply(polygons, facetSelectionPolygons(stage.facets, columns.facet));\n  } //move polygons to Z\n\n\n  polygons.forEach(datum => {\n    datum.polygon.forEach(p => {\n      p[2] = polygonZ;\n    });\n  });\n\n  const onClick = (o, e) => clickHandler(e.srcEvent, o.object.search);\n\n  const polygonLayer = new VegaDeckGl.base.layers.PolygonLayer({\n    autoHighlight: true,\n    coordinateSystem: VegaDeckGl.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    data: polygons,\n    extruded: false,\n    highlightColor,\n    id: 'selections',\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onAxisSelection = false;\n      } else {\n        presenter.deckgl.interactiveState.onAxisSelection = true;\n      }\n    },\n    onClick,\n    getElevation: () => 0,\n    getFillColor: () => [0, 0, 0, 0],\n    pickable: true,\n    stroked: false\n  });\n  return polygonLayer;\n}\n\nfunction axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n  const polygons = [];\n  const size = 50;\n  const getSearch = axisSelectionType === 'exact' ? (a, c, i) => ({\n    expressions: [(0, _expression.selectExactAxis)(a, c, i)]\n  }) : _expression.selectBetweenAxis;\n  const {\n    domain,\n    ticks\n  } = axis;\n\n  if (ticks.length > 0 && domain) {\n    const dim = vertical ? 1 : 0;\n    const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n    let divisions;\n\n    if (between) {\n      divisions = [];\n\n      for (let i = 1; i < ticks.length; i++) {\n        divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n      }\n    } else {\n      divisions = ticks.slice(1, -1).map(tick => tick.sourcePosition[dim]);\n    }\n\n    const add = (p2, i) => {\n      var coords = [[p1, q1], [p2, q1], [p2, q2], [p1, q2]];\n      polygons.push({\n        search: getSearch(axis, column, i),\n        polygon: vertical ? coords.map(xy => xy.reverse()) : coords\n      });\n      p1 = p2;\n    };\n\n    let p1 = domain.sourcePosition[dim];\n    const q1 = domain.sourcePosition[vertical ? 0 : 1];\n    const q2 = q1 - size;\n    divisions.forEach(add);\n    add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n  }\n\n  return polygons;\n}\n\nfunction facetSelectionPolygons(facetRects, facetColumn) {\n  const polygons = [];\n  facetRects.forEach((facetRect, i) => {\n    //take any 2 lines to get a box dimension\n    const [x, y] = minMaxPoints(facetRect.lines.slice(2));\n    const search = facetRect.facetTitle ? facetColumn.quantitative ? (0, _expression.selectBetweenFacet)(facetColumn, facetRect.facetTitle.text, i === 0, i === facetRects.length - 1) : {\n      expressions: [(0, _expression.selectExact)(facetColumn, facetRect.facetTitle.text)]\n    } : {\n      expressions: [(0, _expression.selectNullOrEmpty)(facetColumn)]\n    };\n    polygons.push({\n      search,\n      polygon: [[x.min, y.min], [x.max, y.min], [x.max, y.max], [x.min, y.max]]\n    });\n  });\n  return polygons;\n}\n\nfunction minMaxPoints(lines) {\n  const points = [];\n  lines.forEach(line => {\n    [line.sourcePosition, line.targetPosition].forEach(point => {\n      points.push(point);\n    });\n  });\n  return [0, 1].map(dim => {\n    let minMax = {\n      min: null,\n      max: null\n    };\n    points.forEach(point => {\n      if (minMax.max == null) {\n        minMax.max = point[dim];\n      } else {\n        minMax.max = Math.max(minMax.max, point[dim]);\n      }\n\n      if (minMax.min == null) {\n        minMax.min = point[dim];\n      } else {\n        minMax.min = Math.min(minMax.min, point[dim]);\n      }\n    });\n    return minMax;\n  });\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"./expression\":\"JTcr\"}],\"m4Pj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.columnToAxisType = columnToAxisType;\nexports.partialAxes = partialAxes;\nexports.AxisType = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nvar AxisType;\nexports.AxisType = AxisType;\n\n(function (AxisType) {\n  AxisType[AxisType[\"quantitative\"] = 0] = \"quantitative\";\n  AxisType[AxisType[\"categoric\"] = 1] = \"categoric\";\n  AxisType[AxisType[\"date\"] = 2] = \"date\";\n})(AxisType || (exports.AxisType = AxisType = {}));\n\nfunction columnToAxisType(c) {\n  if (c.quantitative) {\n    return AxisType.quantitative;\n  }\n\n  return AxisType.categoric;\n}\n\nfunction partialAxes(specViewOptions, bottomType, leftType) {\n  const lineColor = _vegaDeck.util.colorToString(specViewOptions.colors.axisLine);\n\n  const axisColor = {\n    domainColor: lineColor,\n    tickColor: lineColor,\n    labelColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText)\n  };\n  const bottom = Object.assign({\n    orient: 'bottom',\n    labelAlign: 'left',\n    labelAngle: {\n      signal: _constants.SignalNames.TextAngleX\n    },\n    labelFontSize: {\n      signal: _constants.SignalNames.TextSize\n    },\n    titleAngle: {\n      signal: _constants.SignalNames.TextAngleX\n    },\n    titleAlign: 'left',\n    titleFontSize: {\n      signal: _constants.SignalNames.TextTitleSize\n    },\n    titleColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n    tickSize: specViewOptions.tickSize\n  }, axisColor);\n\n  if (bottomType === AxisType.quantitative) {\n    bottom.format = '~r';\n  }\n\n  const left = Object.assign({\n    orient: 'left',\n    labelAlign: 'right',\n    labelAngle: {\n      signal: _constants.SignalNames.TextAngleY\n    },\n    labelFontSize: {\n      signal: _constants.SignalNames.TextSize\n    },\n    titleAngle: {\n      signal: _constants.SignalNames.TextAngleY\n    },\n    titleAlign: 'right',\n    titleFontSize: {\n      signal: _constants.SignalNames.TextTitleSize\n    },\n    titleColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n    tickSize: specViewOptions.tickSize\n  }, axisColor);\n\n  if (leftType === AxisType.quantitative) {\n    left.format = '~r';\n  }\n\n  return {\n    left,\n    bottom\n  };\n}\n},{\"./constants\":\"b0rV\",\"@msrvida/vega-deck.gl\":\"eFEk\"}],\"clqN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nvar _constants = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, _axes.AxisType.quantitative, (0, _axes.columnToAxisType)(specColumns.y));\n  const axes = [Object.assign({\n    scale: _constants.ScaleNames.Y,\n    title: specColumns.y.name\n  }, pa.left), Object.assign({\n    scale: _constants.BarChartScaleNames.levelScale,\n    title: specViewOptions.language.count,\n    encode: {\n      labels: {\n        update: {\n          text: {\n            signal: `${_constants.BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n          }\n        }\n      }\n    }\n  }, pa.bottom)];\n  return axes;\n}\n},{\"../axes\":\"m4Pj\",\"../constants\":\"b0rV\"}],\"uuEv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const stackTransform = {\n    type: 'stack',\n    groupby: [{\n      field: specColumns.y.name\n    }],\n    as: [_constants.FieldNames.BarChartStack0, _constants.FieldNames.BarChartStack1]\n  };\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"../constants\":\"b0rV\"}],\"Re96\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, groupBy) {\n  const {\n    specColumns\n  } = context;\n  const bucket_extent = 'bucket_extent';\n  const stackTransform = {\n    type: 'stack',\n    groupby: [_constants.FieldNames.BarChartBin0],\n    as: [_constants.FieldNames.BarChartStack0, _constants.FieldNames.BarChartStack1]\n  };\n\n  if (groupBy) {\n    stackTransform.groupby.push(groupBy.name);\n  }\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [{\n    type: 'extent',\n    field: specColumns.y.name,\n    signal: bucket_extent\n  }, {\n    type: 'bin',\n    field: specColumns.y.name,\n    extent: {\n      signal: bucket_extent\n    },\n    maxbins: {\n      signal: _constants.SignalNames.YBins\n    },\n    as: [_constants.FieldNames.BarChartBin0, _constants.FieldNames.BarChartBin1],\n    signal: _constants.BarChartSignalNames.quantitativeBinSignal\n  }, stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"../constants\":\"b0rV\"}],\"bPo5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.allTruthy = allTruthy;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Returns array with items which are truthy.\n * @param args array or arrays to concat into a single array.\n */\nfunction allTruthy(...args) {\n  return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n}\n},{}],\"XoZh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.topLookup = topLookup;\n\nvar _constants = require(\"./constants\");\n\nfunction topLookup(column, count) {\n  const data = [{\n    name: _constants.DataNames.TopLookup,\n    source: _constants.DataNames.Main,\n    transform: [{\n      type: 'aggregate',\n      groupby: [column.name]\n    }, {\n      type: 'window',\n      ops: ['count'],\n      as: [_constants.FieldNames.TopIndex]\n    }, {\n      type: 'filter',\n      expr: `datum.${_constants.FieldNames.TopIndex} <= ${count}`\n    }]\n  }, {\n    name: _constants.DataNames.Legend,\n    source: _constants.DataNames.Main,\n    transform: [{\n      type: 'lookup',\n      from: _constants.DataNames.TopLookup,\n      key: column.name,\n      fields: [column.name],\n      values: [column.name],\n      as: [_constants.FieldNames.Top]\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.Top} == null ? '${_constants.Other}' : datum.${_constants.FieldNames.Top}`,\n      as: _constants.FieldNames.Top\n    }]\n  }];\n  return data;\n}\n},{\"./constants\":\"b0rV\"}],\"N8o5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.bucketed = bucketed;\nexports.stacked = stacked;\n\nvar _transform = _interopRequireDefault(require(\"./transform.qualitative\"));\n\nvar _transform2 = _interopRequireDefault(require(\"./transform.quantitative\"));\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? _constants.DataNames.Pre : _constants.DataNames.Main;\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, _constants.DataNames.Main), categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [bucketed(context, namespace, categoricalColor ? _constants.DataNames.Legend : nestedDataName), stacked(namespace, namespace.bucket, specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))], specColumns.y.quantitative && [{\n    name: _constants.DataNames.QuantitativeData,\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.start`\n      },\n      stop: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.stop`\n      },\n      step: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.step`\n      }\n    }]\n  }], specColumns.facet && (0, _facet.facetGroupData)(namespace.stacked));\n  return data;\n}\n\nfunction bucketed(context, namespace, source) {\n  const {\n    specColumns: columns\n  } = context;\n  const data = {\n    name: namespace.bucket,\n    source,\n    transform: columns.y.quantitative ? (0, _transform2.default)(context, columns.facet) : (0, _transform.default)(context)\n  };\n  return data;\n}\n\nfunction stacked(namespace, source, transforms) {\n  const data = {\n    name: namespace.stacked,\n    source,\n    transform: (0, _array.allTruthy)(transforms, xy(namespace))\n  };\n  return data;\n}\n\nfunction xy(namespace) {\n  const transforms = [{\n    type: 'formula',\n    expr: `floor(datum.${_constants.FieldNames.BarChartStack0} / ${_constants.BarChartSignalNames.compartmentsPerLevelSignal})`,\n    as: namespace.__level\n  }, {\n    type: 'formula',\n    expr: `datum.${_constants.FieldNames.BarChartStack0} % ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}`,\n    as: namespace.__compartment\n  }];\n  return transforms;\n}\n},{\"./transform.qualitative\":\"uuEv\",\"./transform.quantitative\":\"Re96\",\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\",\"../top\":\"XoZh\"}],\"S7Dm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fill = fill;\nexports.opacity = opacity;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nfunction fill(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const colorColumn = specColumns.color;\n  return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n    field: colorColumn.name\n  } : {\n    scale: _constants.ScaleNames.Color,\n    field: colorColumn.quantitative ? colorColumn.name : _constants.FieldNames.Top\n  } : {\n    value: _vegaDeck.util.colorToString(specViewOptions.colors.defaultCube)\n  };\n}\n\nfunction opacity(context) {\n  const result = {\n    signal: _constants.SignalNames.MarkOpacity\n  };\n  return result;\n}\n},{\"./constants\":\"b0rV\",\"@msrvida/vega-deck.gl\":\"eFEk\"}],\"Dq8R\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.testForCollapseSelection = testForCollapseSelection;\n\nvar _constants = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction testForCollapseSelection() {\n  return `datum.${_constants.FieldNames.Collapsed}`;\n}\n},{\"./constants\":\"b0rV\"}],\"BuYz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: namespace.stacked\n    },\n    encode: {\n      update: {\n        y: {\n          scale: _constants.ScaleNames.Y,\n          field: specColumns.y.quantitative ? _constants.FieldNames.BarChartBin0 : specColumns.y.name,\n          offset: {\n            scale: _constants.BarChartScaleNames.compartmentScale,\n            field: namespace.__compartment\n          }\n        },\n        height: [{\n          test: `bandwidth('${_constants.BarChartScaleNames.compartmentScale}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.BarChartScaleNames.compartmentScale,\n          band: 1\n        }],\n        x: [{\n          scale: _constants.ScaleNames.X,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants.SignalNames.XDomain}[0]`\n        }, {\n          scale: _constants.ScaleNames.X,\n          field: namespace.__level,\n          band: 1,\n          offset: {\n            signal: `-bandwidth('${_constants.ScaleNames.X}')-1`\n          }\n        }],\n        width: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          test: `bandwidth('${_constants.ScaleNames.X}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.ScaleNames.X,\n          band: 1\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"Po0S\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.bucketScale,\n    type: 'band',\n    range: 'height',\n    domain: {\n      data: namespace.bucket,\n      field: specColumns.y.name,\n      sort: true\n    }\n  }, {\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    range: [0, {\n      signal: 'height'\n    }],\n    padding: 0.01,\n    domain: {\n      data: namespace.stacked,\n      field: specColumns.y.name,\n      sort: true\n    },\n    reverse: true\n  }];\n  return scales;\n}\n},{\"../constants\":\"b0rV\"}],\"w9lC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default() {\n  const scales = [{\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    range: [0, {\n      signal: 'height'\n    }],\n    padding: 0.01,\n    domain: {\n      data: _constants.DataNames.QuantitativeData,\n      field: 'data',\n      sort: true\n    },\n    reverse: true\n  }];\n  return scales;\n}\n},{\"../constants\":\"b0rV\"}],\"vYBt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linearScale = linearScale;\nexports.pointScale = pointScale;\nexports.binnableColorScale = binnableColorScale;\n\nvar _constants = require(\"./constants\");\n\nfunction linearScale(name, data, field, range, reverse, zero) {\n  const scale = {\n    name,\n    type: 'linear',\n    range,\n    round: true,\n    reverse,\n    domain: {\n      data,\n      field\n    },\n    zero,\n    nice: true\n  };\n  return scale;\n}\n\nfunction pointScale(name, data, range, field, reverse) {\n  const scale = {\n    name,\n    type: 'point',\n    range,\n    domain: {\n      data,\n      field,\n      sort: true\n    },\n    padding: 0.5\n  };\n\n  if (reverse !== undefined) {\n    scale.reverse = reverse;\n  }\n\n  return scale;\n}\n\nfunction binnableColorScale(colorBin, data, field, scheme) {\n  scheme = scheme || _constants.ColorScaleNone;\n  const name = _constants.ScaleNames.Color;\n  const domain = {\n    data,\n    field\n  };\n  const range = {\n    scheme\n  };\n  const reverse = {\n    signal: _constants.SignalNames.ColorReverse\n  };\n\n  if (colorBin !== 'continuous') {\n    range.count = {\n      signal: _constants.SignalNames.ColorBinCount\n    };\n  }\n\n  switch (colorBin) {\n    case 'continuous':\n      {\n        const sequentialScale = {\n          name,\n          type: 'linear',\n          domain,\n          range,\n          reverse\n        };\n        return sequentialScale;\n      }\n\n    case 'quantile':\n      {\n        const quantileScale = {\n          name,\n          type: 'quantile',\n          domain,\n          range,\n          reverse\n        };\n        return quantileScale;\n      }\n\n    default:\n      {\n        const quantizeScale = {\n          name,\n          type: 'quantize',\n          domain,\n          range,\n          reverse\n        };\n        return quantizeScale;\n      }\n  }\n}\n},{\"./constants\":\"b0rV\"}],\"oliH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = _interopRequireDefault(require(\"./scales.qualitative\"));\n\nvar _scales2 = _interopRequireDefault(require(\"./scales.quantitative\"));\n\nvar _constants = require(\"../constants\");\n\nvar _scales3 = require(\"../scales\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.compartmentScale,\n    type: 'band',\n    range: [0, {\n      signal: _constants.BarChartSignalNames.compartmentHeightSignal\n    }],\n    padding: 0.1,\n    domain: {\n      signal: `sequence(0, ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n    }\n  }, {\n    name: _constants.BarChartScaleNames.levelScale,\n    range: [{\n      signal: '0'\n    }, {\n      signal: 'width'\n    }],\n    round: true,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    },\n    zero: true,\n    nice: true\n  }, {\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    range: [{\n      signal: '0'\n    }, {\n      signal: 'width'\n    }],\n    padding: 0.1,\n    round: false,\n    reverse: false,\n    align: 1,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales3.binnableColorScale)(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: namespace.bucket,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales3.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales3.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales.concat(specColumns.y.quantitative ? (0, _scales2.default)() : (0, _scales.default)(context, namespace));\n}\n},{\"./scales.qualitative\":\"Po0S\",\"./scales.quantitative\":\"w9lC\",\"../constants\":\"b0rV\",\"../scales\":\"vYBt\"}],\"N3c7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.textSignals = textSignals;\nexports.colorBinCountSignal = colorBinCountSignal;\nexports.colorReverseSignal = colorReverseSignal;\nexports.defaultZProportion = void 0;\n\nvar _constants = require(\"./constants\");\n\nconst defaultZProportion = 0.6;\nexports.defaultZProportion = defaultZProportion;\n\nfunction textSignals(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signals = [{\n    name: _constants.SignalNames.ZProportion,\n    value: defaultZProportion,\n    bind: {\n      name: specViewOptions.language.zScaleProportion,\n      debounce: 50,\n      input: 'range',\n      min: 0.2,\n      max: 2,\n      step: 0.1\n    }\n  }, {\n    name: _constants.SignalNames.ZHeight,\n    update: `height * ${_constants.SignalNames.ZProportion}`\n  }, {\n    name: _constants.SignalNames.TextScale,\n    value: 2,\n    bind: {\n      name: specViewOptions.language.textScaleSignal,\n      debounce: 50,\n      input: 'range',\n      min: 1,\n      max: 5,\n      step: 0.5\n    }\n  }, {\n    name: _constants.SignalNames.TextSize,\n    update: `${_constants.SignalNames.TextScale} * 10`\n  }, {\n    name: _constants.SignalNames.TextTitleSize,\n    update: `${_constants.SignalNames.TextScale} * 15`\n  }, {\n    name: _constants.SignalNames.TextAngleX,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.xAxisTextAngleSignal,\n      debounce: 50,\n      input: 'range',\n      min: 0,\n      max: 90,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.TextAngleY,\n    value: 0,\n    bind: {\n      name: specViewOptions.language.yAxisTextAngleSignal,\n      debounce: 50,\n      input: 'range',\n      min: -90,\n      max: 0,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.MarkOpacity,\n    value: 1,\n    bind: {\n      name: specViewOptions.language.markOpacitySignal,\n      debounce: 50,\n      input: 'range',\n      min: 0.1,\n      max: 1,\n      step: 0.05\n    }\n  }];\n  return signals;\n}\n\nfunction colorBinCountSignal(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signal = {\n    name: _constants.SignalNames.ColorBinCount,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.colorBinCount,\n      input: 'range',\n      min: 1,\n      max: specViewOptions.maxLegends + 1,\n      step: 1\n    }\n  };\n  return signal;\n}\n\nfunction colorReverseSignal(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signal = {\n    name: _constants.SignalNames.ColorReverse,\n    value: false,\n    bind: {\n      name: specViewOptions.language.colorReverse,\n      input: 'checkbox'\n    }\n  };\n  return signal;\n}\n},{\"./constants\":\"b0rV\"}],\"MejL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants.SignalNames.XDomain,\n    update: `domain('${_constants.ScaleNames.X}')`\n  }, specColumns.y.quantitative && {\n    name: _constants.SignalNames.YBins,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.BarChartSignalNames.compartmentHeightSignal,\n    update: `bandwidth('${specColumns.y.quantitative ? _constants.ScaleNames.Y : _constants.BarChartScaleNames.bucketScale}')`\n  }, {\n    name: _constants.BarChartSignalNames.aspectRatioSignal,\n    update: `${_constants.BarChartSignalNames.compartmentHeightSignal}/width`\n  }, {\n    name: _constants.BarChartSignalNames.compartmentsPerLevelSignal,\n    update: `ceil(sqrt(${_constants.BarChartSignalNames.aspectRatioSignal}*${_constants.BarChartSignalNames.levelExtentSignal}[1]))`\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], specColumns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\"}],\"oTLg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLegends = getLegends;\n\nvar _constants = require(\"./constants\");\n\nfunction legend(column) {\n  const legend = {\n    orient: 'none',\n    title: column.name,\n    fill: _constants.ScaleNames.Color,\n    encode: {\n      symbols: {\n        update: {\n          shape: {\n            value: 'square'\n          }\n        }\n      }\n    }\n  };\n\n  if (column.quantitative) {\n    legend.type = 'symbol';\n    legend.format = '~r';\n  }\n\n  return legend;\n}\n\nfunction getLegends(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n\n  if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n    return [legend(specColumns.color)];\n  }\n}\n},{\"./constants\":\"b0rV\"}],\"b3ma\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.BarChartNameSpace = void 0;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nclass BarChartNameSpace {\n  constructor(nameSpace = '') {\n    ['bucket', 'stacked', '__compartment', '__level'].forEach(name => {\n      this[name] = `${name}${nameSpace}`;\n    });\n  }\n\n}\n\nexports.BarChartNameSpace = BarChartNameSpace;\n},{}],\"CIUm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.barchartH = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nvar _namespace = require(\"../namespace\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst barchartH = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const rootNamespace = new _namespace.BarChartNameSpace();\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks;\n\n  if (specColumns.facet) {\n    const cellNamespace = new _namespace.BarChartNameSpace('Cell');\n    const cellMarks = (0, _marks.default)(context, cellNamespace);\n    const cd = specColumns.y.quantitative ? [(0, _data.stacked)(cellNamespace, _constants.DataNames.FacetGroupCell)] : [(0, _data.bucketed)(context, cellNamespace, _constants.DataNames.FacetGroupCell), (0, _data.stacked)(cellNamespace, cellNamespace.bucket)];\n    marks = (0, _facet.facetMarks)(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n    axes = [];\n  } else {\n    marks = (0, _marks.default)(context, rootNamespace);\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context, rootNamespace),\n    data: (0, _data.default)(context, rootNamespace),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.barchartH = barchartH;\n},{\"./axes\":\"clqN\",\"./data\":\"N8o5\",\"./marks\":\"BuYz\",\"./scales\":\"oliH\",\"./signals\":\"MejL\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\",\"../legends\":\"oTLg\",\"../namespace\":\"b3ma\"}],\"qaUm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nvar _constants = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, (0, _axes.columnToAxisType)(specColumns.x), _axes.AxisType.quantitative);\n  const axes = [Object.assign({\n    scale: _constants.ScaleNames.X,\n    title: specColumns.x.name\n  }, pa.bottom), Object.assign({\n    scale: _constants.BarChartScaleNames.levelScale,\n    title: specViewOptions.language.count,\n    encode: {\n      labels: {\n        update: {\n          text: {\n            signal: `${_constants.BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n          }\n        }\n      }\n    }\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"m4Pj\",\"../constants\":\"b0rV\"}],\"sGLW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const stackTransform = {\n    type: 'stack',\n    groupby: [{\n      field: specColumns.x.name\n    }],\n    as: [_constants.FieldNames.BarChartStack0, _constants.FieldNames.BarChartStack1]\n  };\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"../constants\":\"b0rV\"}],\"D8M6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, groupBy) {\n  const {\n    specColumns\n  } = context;\n  const bucket_extent = 'bucket_extent';\n  const stackTransform = {\n    type: 'stack',\n    groupby: [_constants.FieldNames.BarChartBin0],\n    as: [_constants.FieldNames.BarChartStack0, _constants.FieldNames.BarChartStack1]\n  };\n\n  if (groupBy) {\n    stackTransform.groupby.push(groupBy.name);\n  }\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [{\n    type: 'extent',\n    field: specColumns.x.name,\n    signal: bucket_extent\n  }, {\n    type: 'bin',\n    field: specColumns.x.name,\n    extent: {\n      signal: bucket_extent\n    },\n    maxbins: {\n      signal: _constants.SignalNames.XBins\n    },\n    as: [_constants.FieldNames.BarChartBin0, _constants.FieldNames.BarChartBin1],\n    signal: _constants.BarChartSignalNames.quantitativeBinSignal\n  }, stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"../constants\":\"b0rV\"}],\"MPMp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.bucketed = bucketed;\nexports.stacked = stacked;\n\nvar _transform = _interopRequireDefault(require(\"./transform.qualitative\"));\n\nvar _transform2 = _interopRequireDefault(require(\"./transform.quantitative\"));\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? _constants.DataNames.Pre : _constants.DataNames.Main;\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, _constants.DataNames.Main), categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [bucketed(context, namespace, categoricalColor ? _constants.DataNames.Legend : nestedDataName), stacked(namespace, namespace.bucket, specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))], specColumns.x.quantitative && [{\n    name: _constants.DataNames.QuantitativeData,\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.start`\n      },\n      stop: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.stop`\n      },\n      step: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.step`\n      }\n    }]\n  }], specColumns.facet && (0, _facet.facetGroupData)(namespace.stacked));\n  return data;\n}\n\nfunction bucketed(context, namespace, source) {\n  const {\n    specColumns: columns\n  } = context;\n  const data = {\n    name: namespace.bucket,\n    source,\n    transform: columns.x.quantitative ? (0, _transform2.default)(context, columns.facet) : (0, _transform.default)(context)\n  };\n  return data;\n}\n\nfunction stacked(namespace, source, transforms) {\n  const data = {\n    name: namespace.stacked,\n    source,\n    transform: (0, _array.allTruthy)(transforms, xy(namespace))\n  };\n  return data;\n}\n\nfunction xy(namespace) {\n  const transforms = [{\n    type: 'formula',\n    expr: `floor(datum.${_constants.FieldNames.BarChartStack0} / ${_constants.BarChartSignalNames.compartmentsPerLevelSignal})`,\n    as: namespace.__level\n  }, {\n    type: 'formula',\n    expr: `datum.${_constants.FieldNames.BarChartStack0} % ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}`,\n    as: namespace.__compartment\n  }];\n  return transforms;\n}\n},{\"./transform.qualitative\":\"sGLW\",\"./transform.quantitative\":\"D8M6\",\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\",\"../top\":\"XoZh\"}],\"bUVh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: namespace.stacked\n    },\n    encode: {\n      update: {\n        x: {\n          scale: _constants.ScaleNames.X,\n          field: specColumns.x.quantitative ? _constants.FieldNames.BarChartBin0 : specColumns.x.name,\n          offset: {\n            scale: _constants.BarChartScaleNames.compartmentScale,\n            field: namespace.__compartment\n          }\n        },\n        width: [{\n          test: `bandwidth('${_constants.BarChartScaleNames.compartmentScale}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.BarChartScaleNames.compartmentScale,\n          band: 1\n        }],\n        y: [{\n          scale: _constants.ScaleNames.Y,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants.SignalNames.YDomain}[0]`\n        }, {\n          scale: _constants.ScaleNames.Y,\n          field: namespace.__level,\n          band: 1,\n          offset: {\n            signal: `-bandwidth('${_constants.ScaleNames.Y}')-1`\n          }\n        }],\n        height: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          test: `bandwidth('${_constants.ScaleNames.Y}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.ScaleNames.Y,\n          band: 1\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"Od9T\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.bucketScale,\n    type: 'band',\n    range: 'width',\n    domain: {\n      data: namespace.bucket,\n      field: specColumns.x.name,\n      sort: true\n    }\n  }, {\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: 0.01,\n    domain: {\n      data: namespace.stacked,\n      field: specColumns.x.name,\n      sort: true\n    }\n  }];\n  return scales;\n}\n},{\"../constants\":\"b0rV\"}],\"tWqL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default() {\n  const scales = [{\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: 0.01,\n    domain: {\n      data: _constants.DataNames.QuantitativeData,\n      field: 'data',\n      sort: true\n    }\n  }];\n  return scales;\n}\n},{\"../constants\":\"b0rV\"}],\"qKXg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = _interopRequireDefault(require(\"./scales.qualitative\"));\n\nvar _scales2 = _interopRequireDefault(require(\"./scales.quantitative\"));\n\nvar _constants = require(\"../constants\");\n\nvar _scales3 = require(\"../scales\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.compartmentScale,\n    type: 'band',\n    range: [0, {\n      signal: _constants.BarChartSignalNames.compartmentWidthSignal\n    }],\n    padding: 0.1,\n    domain: {\n      signal: `sequence(0, ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n    }\n  }, {\n    name: _constants.BarChartScaleNames.levelScale,\n    range: [{\n      signal: 'height'\n    }, {\n      signal: '0'\n    }],\n    round: true,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    },\n    zero: true,\n    nice: true\n  }, {\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    range: [{\n      signal: 'height'\n    }, {\n      signal: '0'\n    }],\n    padding: 0.1,\n    round: false,\n    reverse: false,\n    align: 1,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales3.binnableColorScale)(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: namespace.bucket,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales3.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales3.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales.concat(specColumns.x.quantitative ? (0, _scales2.default)() : (0, _scales.default)(context, namespace));\n}\n},{\"./scales.qualitative\":\"Od9T\",\"./scales.quantitative\":\"tWqL\",\"../constants\":\"b0rV\",\"../scales\":\"vYBt\"}],\"wEg1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants.SignalNames.YDomain,\n    update: `domain('${_constants.ScaleNames.Y}')`\n  }, specColumns.x.quantitative && {\n    name: _constants.SignalNames.XBins,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.BarChartSignalNames.compartmentWidthSignal,\n    update: `bandwidth('${specColumns.x.quantitative ? _constants.ScaleNames.X : _constants.BarChartScaleNames.bucketScale}')`\n  }, {\n    name: _constants.BarChartSignalNames.aspectRatioSignal,\n    update: `${_constants.BarChartSignalNames.compartmentWidthSignal}/height`\n  }, {\n    name: _constants.BarChartSignalNames.compartmentsPerLevelSignal,\n    update: `ceil(sqrt(${_constants.BarChartSignalNames.aspectRatioSignal}*${_constants.BarChartSignalNames.levelExtentSignal}[1]))`\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], specColumns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\"}],\"J9sm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.barchartV = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nvar _namespace = require(\"../namespace\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst barchartV = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const rootNamespace = new _namespace.BarChartNameSpace();\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks;\n\n  if (specColumns.facet) {\n    const cellNamespace = new _namespace.BarChartNameSpace('Cell');\n    const cellMarks = (0, _marks.default)(context, cellNamespace);\n    const cd = specColumns.x.quantitative ? [(0, _data.stacked)(cellNamespace, _constants.DataNames.FacetGroupCell)] : [(0, _data.bucketed)(context, cellNamespace, _constants.DataNames.FacetGroupCell), (0, _data.stacked)(cellNamespace, cellNamespace.bucket)];\n    marks = (0, _facet.facetMarks)(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n    axes = [];\n  } else {\n    marks = (0, _marks.default)(context, rootNamespace);\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context, rootNamespace),\n    data: (0, _data.default)(context, rootNamespace),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.barchartV = barchartV;\n},{\"./axes\":\"qaUm\",\"./data\":\"MPMp\",\"./marks\":\"bUVh\",\"./scales\":\"qKXg\",\"./signals\":\"wEg1\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\",\"../legends\":\"oTLg\",\"../namespace\":\"b3ma\"}],\"BUbq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, (0, _axes.columnToAxisType)(specColumns.x), (0, _axes.columnToAxisType)(specColumns.y));\n  const axes = [Object.assign({\n    scale: 'xscale',\n    title: specColumns.x.name,\n    bandPosition: 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.bottom), Object.assign({\n    scale: 'yscale',\n    title: specColumns.y.name,\n    bandPosition: specColumns.y.quantitative ? 0 : 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"m4Pj\"}],\"Y16r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)(specColumns.x.quantitative && [{\n      type: 'extent',\n      field: specColumns.x.name,\n      signal: 'var_Xextent'\n    }, {\n      type: 'bin',\n      field: specColumns.x.name,\n      extent: {\n        signal: 'var_Xextent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.XBins\n      },\n      as: [_constants.FieldNames.DensityXBin0, _constants.FieldNames.DensityXBin1],\n      signal: 'binXSignal'\n    }], specColumns.y.quantitative && [{\n      type: 'extent',\n      field: specColumns.y.name,\n      signal: 'var_Yextent'\n    }, {\n      type: 'bin',\n      field: specColumns.y.name,\n      extent: {\n        signal: 'var_Yextent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.YBins\n      },\n      as: [_constants.FieldNames.DensityYBin0, _constants.FieldNames.DensityYBin1],\n      signal: 'binYSignal'\n    }])\n  }], specColumns.x.quantitative && [{\n    name: 'xaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binXSignal.start'\n      },\n      stop: {\n        signal: 'binXSignal.stop'\n      },\n      step: {\n        signal: 'binXSignal.step'\n      }\n    }]\n  }], specColumns.y.quantitative && [{\n    name: 'yaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binYSignal.start'\n      },\n      stop: {\n        signal: 'binYSignal.stop'\n      },\n      step: {\n        signal: 'binYSignal.step'\n      }\n    }]\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [{\n    name: 'aggregated',\n    source: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main,\n    transform: [{\n      type: 'joinaggregate',\n      groupby: [specColumns.x.quantitative ? _constants.FieldNames.DensityXBin0 : specColumns.x.name, specColumns.y.quantitative ? _constants.FieldNames.DensityYBin0 : specColumns.y.name],\n      ops: ['count'],\n      as: [_constants.FieldNames.DensityCount]\n    }, windowTransform(specColumns), {\n      type: 'extent',\n      field: _constants.FieldNames.DensityRow,\n      signal: 'cextent'\n    }]\n  }]);\n  return data;\n}\n\nfunction windowTransform(columns) {\n  const t = {\n    type: 'window',\n    groupby: [columns.x.quantitative ? _constants.FieldNames.DensityXBin0 : columns.x.name, columns.y.quantitative ? _constants.FieldNames.DensityYBin0 : columns.y.name],\n    ops: ['row_number'],\n    as: [_constants.FieldNames.DensityRow]\n  };\n\n  if (columns.sort) {\n    t.sort = {\n      field: [columns.sort.name],\n      order: ['descending']\n    };\n  }\n\n  return t;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../top\":\"XoZh\"}],\"gFUs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: 'aggregated'\n    },\n    sort: {\n      field: [specColumns.x.name, specColumns.y.name],\n      order: ['ascending', 'ascending']\n    },\n    encode: {\n      update: {\n        xc: {\n          scale: 'xscale',\n          field: specColumns.x.quantitative ? _constants.FieldNames.DensityXBin0 : specColumns.x.name,\n          offset: {\n            signal: `scale('sizescale', ((datum.${_constants.FieldNames.DensityRow}-1) % floor(sqrt(datum.${_constants.FieldNames.DensityCount}))))-scale('sizescale', sqrt(datum.${_constants.FieldNames.DensityCount})-2)/2`\n          }\n        },\n        yc: {\n          scale: 'yscale',\n          field: specColumns.y.quantitative ? _constants.FieldNames.DensityYBin0 : specColumns.y.name,\n          offset: {\n            signal: `scale('sizescale',height/width*floor(((datum.${_constants.FieldNames.DensityRow}-1) / floor(sqrt(datum.${_constants.FieldNames.DensityCount}))))) - scale('sizescale', height/width*sqrt(datum.${_constants.FieldNames.DensityCount})+2)/2`\n          }\n        },\n        width: {\n          signal: 'unitsize'\n        },\n        height: {\n          signal: 'height/width*unitsize'\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"PKQh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: 'xscale',\n    type: 'point',\n    domain: specColumns.x.quantitative ? {\n      data: 'xaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.x.name,\n      sort: true\n    },\n    range: 'width',\n    padding: 0.5\n  }, {\n    name: 'yscale',\n    type: 'point',\n    domain: specColumns.y.quantitative ? {\n      data: 'yaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.y.name,\n      sort: true\n    },\n    range: 'height',\n    reverse: true,\n    padding: 0.5\n  }, {\n    name: 'sizescale',\n    type: 'linear',\n    domain: [0, {\n      signal: 'sqrt(cextent[1])'\n    }],\n    range: [0, {\n      signal: 'width/max(xsize,ysize)'\n    }]\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"oltd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context), {\n    name: 'unitpad',\n    value: 0.1,\n    bind: {\n      name: _constants.SignalNames.InnerPadding,\n      input: 'range',\n      min: 0.1,\n      max: 1.0,\n      step: 0.1\n    }\n  }, {\n    name: 'xsize',\n    update: 'domain(\\'xscale\\').length'\n  }, {\n    name: 'ysize',\n    update: 'domain(\\'yscale\\').length'\n  }, {\n    name: 'cellwidth',\n    update: 'width/max(xsize,ysize)'\n  }, {\n    name: 'maxnumbers',\n    update: 'sqrt(cextent[1])'\n  }, {\n    name: 'unitsize',\n    update: 'cellwidth/((1 + unitpad)*maxnumbers)'\n  }, specColumns.x.quantitative && {\n    name: _constants.SignalNames.XBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, specColumns.y.quantitative && {\n    name: _constants.SignalNames.YBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"yaW2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.density = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst density = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks: (0, _marks.default)(context)\n  };\n\n  if (!insight.hideAxes) {\n    vegaSpec.axes = (0, _axes.default)(context);\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.density = density;\n},{\"./axes\":\"BUbq\",\"./data\":\"Y16r\",\"./marks\":\"gFUs\",\"./scales\":\"PKQh\",\"./signals\":\"oltd\",\"../facet\":\"Ifgo\",\"../legends\":\"oTLg\",\"../constants\":\"b0rV\"}],\"iQ8b\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)([specColumns.sort && {\n      type: 'collect',\n      sort: {\n        field: specColumns.sort.name\n      }\n    }, {\n      type: 'window',\n      ops: ['count'],\n      as: [_constants.FieldNames.GridIndex]\n    }])\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends));\n  return data;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../top\":\"XoZh\"}],\"gPej\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Total = exports.RowCount = exports.ColumnCount = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst ColumnCount = 'columncount';\nexports.ColumnCount = ColumnCount;\nconst RowCount = 'rowcount';\nexports.RowCount = RowCount;\nconst Total = 'total';\nexports.Total = Total;\n},{}],\"qxOY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, data) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data\n    },\n    encode: {\n      update: {\n        x: {\n          signal: `(datum.${_constants2.FieldNames.GridIndex}-1)%${_constants.ColumnCount}`,\n          scale: _constants2.ScaleNames.X\n        },\n        width: {\n          scale: _constants2.ScaleNames.X,\n          band: true\n        },\n        y: {\n          signal: `floor((datum.${_constants2.FieldNames.GridIndex}-1)/${_constants.ColumnCount})`,\n          scale: _constants2.ScaleNames.Y\n        },\n        height: {\n          scale: _constants2.ScaleNames.Y,\n          band: true\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants2.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return marks;\n}\n},{\"./constants\":\"gPej\",\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"q7IG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\nvar _constants2 = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    domain: {\n      signal: `sequence(0, ${_constants2.ColumnCount}, 1)`\n    },\n    range: 'width',\n    paddingInner: 0.1,\n    paddingOuter: 0\n  }, {\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    domain: {\n      signal: `sequence(0, ${_constants2.RowCount}, 1)`\n    },\n    range: 'height',\n    paddingInner: 0.1,\n    paddingOuter: 0\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\",\"./constants\":\"gPej\"}],\"QhdK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), {\n    name: _constants.Total,\n    update: `data('${_constants2.DataNames.Main}').length`\n  }, {\n    name: _constants.ColumnCount,\n    update: `ceil(sqrt((width/height)*${_constants.Total}))`\n  }, {\n    name: _constants.RowCount,\n    update: `${_constants.Total}/${_constants.ColumnCount}`\n  }, (0, _signals.colorReverseSignal)(context)], insight.columns && insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"./constants\":\"gPej\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\"}],\"m34o\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.grid = void 0;\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst grid = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  const specCapabilities = {\n    roles: [{\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const dataName = categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main;\n  const size = insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context),\n    data: (0, _data.default)(context),\n    marks: (0, _marks.default)(context, dataName)\n  };\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  } //use autosize only when not faceting\n\n\n  vegaSpec.autosize = 'fit';\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.grid = grid;\n},{\"./data\":\"iQ8b\",\"./marks\":\"qxOY\",\"./scales\":\"q7IG\",\"./signals\":\"QhdK\",\"../constants\":\"b0rV\",\"../legends\":\"oTLg\"}],\"DRuS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nvar _constants = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, (0, _axes.columnToAxisType)(specColumns.x), (0, _axes.columnToAxisType)(specColumns.y));\n  const axes = [Object.assign({\n    scale: _constants.ScaleNames.X,\n    title: specColumns.x.name\n  }, pa.bottom), Object.assign({\n    scale: _constants.ScaleNames.Y,\n    title: specColumns.y.name\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"m4Pj\",\"../constants\":\"b0rV\"}],\"cCou\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const ScatterDataName = 'SandDanceScatterPlotData';\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, ScatterDataName), [{\n    name: _constants.DataNames.Main,\n    source: ScatterDataName,\n    transform: (0, _array.allTruthy)(filterInvalidWhenNumeric(specColumns.x), filterInvalidWhenNumeric(specColumns.y), filterInvalidWhenNumeric(specColumns.z), specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), specColumns.facet && (0, _facet.facetGroupData)(_constants.DataNames.Main));\n  return data;\n}\n\nfunction filterInvalidWhenNumeric(column) {\n  if (column && column.quantitative) {\n    const transforms = [{\n      type: 'filter',\n      expr: `datum[${JSON.stringify(column.name)}] != null`\n    }];\n    return transforms;\n  }\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\",\"../top\":\"XoZh\"}],\"Vq7N\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main\n    },\n    encode: {\n      update: {\n        x: {\n          scale: _constants.ScaleNames.X,\n          field: specColumns.x.name,\n          offset: 1\n        },\n        width: {\n          signal: _constants.SignalNames.PointSize\n        },\n        y: [{\n          scale: _constants.ScaleNames.Y,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants.SignalNames.YDomain}[0]`\n        }, {\n          scale: _constants.ScaleNames.Y,\n          field: specColumns.y.name,\n          offset: {\n            signal: `-${_constants.SignalNames.PointSize}`\n          }\n        }],\n        height: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          signal: _constants.SignalNames.PointSize\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n    update.depth = {\n      signal: _constants.SignalNames.PointSize\n    };\n  }\n\n  return marks;\n}\n},{\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"vZre\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [specColumns.x.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.X, _constants.DataNames.Main, specColumns.x.name, 'width', false, false) : (0, _scales.pointScale)(_constants.ScaleNames.X, _constants.DataNames.Main, 'width', specColumns.x.name), specColumns.y.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Y, _constants.DataNames.Main, specColumns.y.name, 'height', false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Y, _constants.DataNames.Main, 'height', specColumns.y.name, true)];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"jiD2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants.SignalNames.YDomain,\n    update: `domain('${_constants.ScaleNames.Y}')`\n  }, {\n    name: _constants.SignalNames.PointSize,\n    value: 5,\n    bind: {\n      name: specViewOptions.language.scatterPointSize,\n      debounce: 50,\n      input: 'range',\n      min: 1,\n      max: 25,\n      step: 1\n    }\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"Rl9U\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.scatterplot = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst scatterplot = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact'\n    }, {\n      role: 'y',\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact'\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }],\n    signals: [_constants.SignalNames.PointSize]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks = (0, _marks.default)(context);\n\n  if (specColumns.facet) {\n    marks = (0, _facet.facetMarks)(specViewOptions, marks[0].from.data, marks, axes);\n    axes = [];\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.scatterplot = scatterplot;\n},{\"./axes\":\"DRuS\",\"./data\":\"cCou\",\"./marks\":\"Vq7N\",\"./scales\":\"vZre\",\"./signals\":\"jiD2\",\"../facet\":\"Ifgo\",\"../legends\":\"oTLg\",\"../constants\":\"b0rV\"}],\"uVNM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, (0, _axes.columnToAxisType)(specColumns.x), (0, _axes.columnToAxisType)(specColumns.y));\n  const axes = [Object.assign({\n    scale: 'xband',\n    title: specColumns.x.name,\n    bandPosition: 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.bottom), Object.assign({\n    scale: 'yband',\n    title: specColumns.y.name,\n    bandPosition: specColumns.y.quantitative ? 0 : 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"m4Pj\"}],\"wBrd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)([{\n      type: 'extent',\n      field: specColumns.x.name,\n      signal: 'long_extent'\n    }, {\n      type: 'extent',\n      field: specColumns.y.name,\n      signal: 'lat_extent'\n    }, specColumns.x.quantitative && {\n      type: 'bin',\n      field: specColumns.x.name,\n      extent: {\n        signal: 'long_extent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.XBins\n      },\n      nice: false,\n      as: [_constants.FieldNames.StacksLongBin0, _constants.FieldNames.StacksLongBin1],\n      signal: 'binXSignal'\n    }, specColumns.y.quantitative && {\n      type: 'bin',\n      field: specColumns.y.name,\n      extent: {\n        signal: 'lat_extent'\n      },\n      nice: false,\n      maxbins: {\n        signal: _constants.SignalNames.YBins\n      },\n      as: [_constants.FieldNames.StacksLatBin0, _constants.FieldNames.StacksLatBin1],\n      signal: 'binYSignal'\n    }])\n  }], specColumns.x.quantitative && [{\n    name: 'xaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binXSignal.start'\n      },\n      stop: {\n        signal: 'binXSignal.stop'\n      },\n      step: {\n        signal: 'binXSignal.step'\n      }\n    }]\n  }], specColumns.y.quantitative && [{\n    name: 'yaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binYSignal.start'\n      },\n      stop: {\n        signal: 'binYSignal.stop'\n      },\n      step: {\n        signal: 'binYSignal.step'\n      }\n    }]\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [{\n    name: 'stackedgroup',\n    source: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main,\n    transform: [stackTransform(specColumns.sort, specColumns.x, specColumns.y), {\n      type: 'extent',\n      signal: 'xtent',\n      field: _constants.FieldNames.StacksStart\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.StacksEnd} % columns`,\n      as: '_columns'\n    }, {\n      type: 'formula',\n      expr: `floor(datum.${_constants.FieldNames.StacksStart} / columns)`,\n      as: 'row'\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.StacksStart} % ${_constants.SignalNames.XGridSize}`,\n      as: 'column'\n    }, {\n      type: 'formula',\n      expr: `floor((datum.${_constants.FieldNames.StacksStart} % columns)/ ${_constants.SignalNames.XGridSize})`,\n      as: 'depth'\n    }, {\n      type: 'extent',\n      signal: 'rowxtent',\n      field: 'row'\n    }]\n  }]);\n  return data;\n}\n\nfunction stackTransform(sortColumn, xColumn, yColumn) {\n  const st = {\n    type: 'stack',\n    groupby: [yColumn.quantitative ? _constants.FieldNames.StacksLatBin0 : yColumn.name, xColumn.quantitative ? _constants.FieldNames.StacksLongBin0 : xColumn.name],\n    as: [_constants.FieldNames.StacksStart, _constants.FieldNames.StacksEnd]\n  };\n\n  if (sortColumn) {\n    st.sort = {\n      field: sortColumn.name\n    };\n  }\n\n  return st;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../top\":\"XoZh\"}],\"x3xn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    name: 'marks2',\n    type: 'rect',\n    from: {\n      data: 'stackedgroup'\n    },\n    encode: {\n      update: {\n        x: {\n          scale: 'xband',\n          field: specColumns.x.quantitative ? _constants.FieldNames.StacksLongBin0 : specColumns.x.name,\n          offset: {\n            scale: 'xinternalscale',\n            field: 'column'\n          }\n        },\n        y: {\n          scale: 'yband',\n          field: specColumns.y.quantitative ? _constants.FieldNames.StacksLatBin0 : specColumns.y.name,\n          offset: {\n            scale: 'yinternalscale',\n            field: 'depth'\n          }\n        },\n        z: {\n          scale: 'zband',\n          field: 'row'\n        },\n        depth: {\n          scale: 'zband',\n          band: true\n        },\n        width: {\n          signal: 'actsize'\n        },\n        height: {\n          signal: 'actsize'\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n  return marks;\n}\n},{\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\"}],\"evLm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: 'xband',\n    type: 'band',\n    domain: specColumns.x.quantitative ? {\n      data: 'xaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.x.quantitative ? _constants.FieldNames.StacksLongBin0 : specColumns.x.name,\n      sort: true\n    },\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: {\n      signal: _constants.SignalNames.OuterPadding\n    },\n    round: true\n  }, {\n    name: 'yband',\n    type: 'band',\n    reverse: true,\n    domain: specColumns.y.quantitative ? {\n      data: 'yaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.y.quantitative ? _constants.FieldNames.StacksLatBin0 : specColumns.y.name,\n      sort: true\n    },\n    range: 'height',\n    padding: {\n      signal: _constants.SignalNames.OuterPadding\n    },\n    round: true\n  }, {\n    name: 'zband',\n    type: 'band',\n    reverse: false,\n    domain: {\n      data: 'stackedgroup',\n      field: 'row',\n      sort: true\n    },\n    align: 0.0,\n    range: [0, {\n      signal: 'countheight'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    round: false\n  }, {\n    name: 'xinternalscale',\n    type: 'band',\n    range: [0, {\n      signal: 'xbandw'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    domain: {\n      data: 'stackedgroup',\n      field: 'column',\n      sort: true\n    }\n  }, {\n    name: 'yinternalscale',\n    type: 'band',\n    range: [0, {\n      signal: 'ybandw'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    domain: {\n      data: 'stackedgroup',\n      field: 'depth',\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"uY1G\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context), {\n    name: _constants.SignalNames.XGridSize,\n    value: 3,\n    bind: {\n      name: specViewOptions.language.XGridSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.YGridSize,\n    value: 3,\n    bind: {\n      name: specViewOptions.language.YGridSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, specColumns.x.quantitative && {\n    name: _constants.SignalNames.XBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, specColumns.y.quantitative && {\n    name: _constants.SignalNames.YBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.InnerPadding,\n    value: 0.1,\n    bind: {\n      name: specViewOptions.language.InnerPaddingSize,\n      input: 'range',\n      min: 0.1,\n      max: 0.6,\n      step: 0.1\n    }\n  }, {\n    name: _constants.SignalNames.OuterPadding,\n    value: 0.2,\n    bind: {\n      name: specViewOptions.language.OuterPaddingSize,\n      input: 'range',\n      min: 0.1,\n      max: 0.6,\n      step: 0.1\n    }\n  }, {\n    name: 'columns',\n    update: `${_constants.SignalNames.XGridSize}*${_constants.SignalNames.YGridSize}`\n  }, {\n    name: 'xbandw',\n    update: 'bandwidth(\\'xband\\')'\n  }, {\n    name: 'xbandsize',\n    update: `(xbandw / (${_constants.SignalNames.XGridSize} + ${_constants.SignalNames.InnerPadding}))*(1-${_constants.SignalNames.InnerPadding})`\n  }, {\n    name: 'ybandw',\n    update: `height/((${specColumns.y.quantitative ? _constants.SignalNames.YBins : specColumns.y.stats.distinctValueCount}) * (1 + ${_constants.SignalNames.OuterPadding}))`\n  }, {\n    name: 'ybandsize',\n    update: `(ybandw / (${_constants.SignalNames.YGridSize} + ${_constants.SignalNames.InnerPadding}))*(1-${_constants.SignalNames.InnerPadding})`\n  }, {\n    name: 'actsize',\n    update: 'min(xbandsize,ybandsize)'\n  }, {\n    name: 'countheight',\n    update: `rowxtent[1]*actsize*${_constants.SignalNames.ZProportion}/${_signals.defaultZProportion}`\n  }], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"oOWF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.stacks = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst stacks = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks: (0, _marks.default)(context)\n  };\n\n  if (!insight.hideAxes) {\n    vegaSpec.axes = (0, _axes.default)(context);\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.stacks = stacks;\n},{\"./axes\":\"uVNM\",\"./data\":\"wBrd\",\"./marks\":\"x3xn\",\"./scales\":\"evLm\",\"./signals\":\"uY1G\",\"../facet\":\"Ifgo\",\"../legends\":\"oTLg\",\"../constants\":\"b0rV\"}],\"IV9v\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.treemapTransforms = treemapTransforms;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const TreeMapDataName = 'SandDanceTreeMapData';\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, TreeMapDataName), [{\n    name: _constants.DataNames.Main,\n    source: TreeMapDataName,\n    transform: (0, _array.allTruthy)(specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets), !specColumns.facet && treemapTransforms(insight))\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), specColumns.facet && (0, _facet.facetGroupData)(_constants.DataNames.Main));\n  return data;\n}\n\nfunction treemapTransforms(insight) {\n  const transforms = [{\n    type: 'nest',\n    keys: [insight.columns.group || '__NONE__']\n  }, {\n    type: 'treemap',\n    field: insight.columns.size,\n    sort: {\n      field: 'value',\n      order: 'descending'\n    },\n    round: true,\n    method: {\n      signal: _constants.SignalNames.TreeMapMethod\n    },\n    padding: 1,\n    size: [{\n      signal: 'width'\n    }, {\n      signal: 'height'\n    }],\n    as: [_constants.FieldNames.TreemapStackX0, _constants.FieldNames.TreemapStackY0, _constants.FieldNames.TreemapStackX1, _constants.FieldNames.TreemapStackY1, _constants.FieldNames.TreemapStackDepth, _constants.FieldNames.TreemapStackChildren]\n  }];\n  return transforms;\n}\n},{\"../../array\":\"bPo5\",\"../constants\":\"b0rV\",\"../facet\":\"Ifgo\",\"../top\":\"XoZh\"}],\"vhMR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, data) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data\n    },\n    encode: {\n      update: {\n        x: {\n          field: _constants.FieldNames.TreemapStackX0\n        },\n        y: {\n          field: _constants.FieldNames.TreemapStackY0\n        },\n        x2: {\n          field: _constants.FieldNames.TreemapStackX1\n        },\n        y2: {\n          field: _constants.FieldNames.TreemapStackY1\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return marks;\n}\n},{\"../constants\":\"b0rV\",\"../fill\":\"S7Dm\",\"../selection\":\"Dq8R\"}],\"dh30\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"vYBt\",\"../constants\":\"b0rV\"}],\"Qrog\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), {\n    name: _constants.SignalNames.TreeMapMethod,\n    value: 'squarify',\n    bind: {\n      name: specViewOptions.language.treeMapMethod,\n      input: 'select',\n      options: ['squarify', 'binary']\n    }\n  }, (0, _signals.colorReverseSignal)(context)], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"bPo5\",\"../signals\":\"N3c7\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\"}],\"MNHb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.treemap = void 0;\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst treemap = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.size) errors.push('Must set a field for size');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'size',\n      excludeCategoric: true\n    }, {\n      role: 'group',\n      allowNone: true\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }],\n    signals: [_constants.SignalNames.TreeMapMethod]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const dataName = categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main;\n  const TreeMapName = 'SandDanceTreeMapFaceted';\n  const data = (0, _data.default)(context);\n  let marks = (0, _marks.default)(context, specColumns.facet ? TreeMapName : dataName);\n\n  if (specColumns.facet) {\n    const childData = {\n      name: TreeMapName,\n      source: _constants.DataNames.FacetGroupCell,\n      transform: (0, _data.treemapTransforms)(insight)\n    };\n    marks = (0, _facet.facetMarks)(specViewOptions, dataName, marks, null, [childData]);\n    marks[0].marks;\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data,\n    scales: (0, _scales.default)(context),\n    marks\n  };\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.treemap = treemap;\n},{\"./data\":\"IV9v\",\"./marks\":\"vhMR\",\"./scales\":\"dh30\",\"./signals\":\"Qrog\",\"../facet\":\"Ifgo\",\"../constants\":\"b0rV\",\"../legends\":\"oTLg\"}],\"zwMy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.constants = exports.creators = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar _barchartH = require(\"./barchartH\");\n\nvar _barchartV = require(\"./barchartV\");\n\nvar _density = require(\"./density\");\n\nvar _grid = require(\"./grid\");\n\nvar _scatterPlot = require(\"./scatterPlot\");\n\nvar _stacks = require(\"./stacks\");\n\nvar _treeMap = require(\"./treeMap\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst creators = {\n  barchart: _barchartV.barchartV,\n  barchartH: _barchartH.barchartH,\n  barchartV: _barchartV.barchartV,\n  density: _density.density,\n  grid: _grid.grid,\n  scatterplot: _scatterPlot.scatterplot,\n  stacks: _stacks.stacks,\n  treemap: _treeMap.treemap\n};\nexports.creators = creators;\n\nfunction create(context) {\n  const {\n    insight\n  } = context;\n  const creator = creators[insight.chart];\n\n  if (creator) {\n    const specResult = creator(context); //TODO: find why Vega is doing this. fixup for facets\n\n    if (specResult.vegaSpec && insight.columns && insight.columns.facet && insight.facets.columns === 2 && insight.facets.rows === 1) {\n      specResult.vegaSpec.width = insight.size.width / 3;\n    }\n\n    return specResult;\n  }\n}\n},{\"./constants\":\"b0rV\",\"./barchartH\":\"CIUm\",\"./barchartV\":\"J9sm\",\"./density\":\"yaW2\",\"./grid\":\"m34o\",\"./scatterPlot\":\"Rl9U\",\"./stacks\":\"oOWF\",\"./treeMap\":\"MNHb\"}],\"DO07\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cloneVegaSpecWithData = cloneVegaSpecWithData;\n\nvar _ = require(\".\");\n\nvar _inference = require(\"./inference\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction cloneVegaSpecWithData(context, currData) {\n  const {\n    specColumns\n  } = context;\n  const columns = [specColumns.color, specColumns.facet, specColumns.group, specColumns.size, specColumns.sort, specColumns.x, specColumns.y, specColumns.z];\n  (0, _inference.inferAll)(columns, currData);\n  const specResult = (0, _.create)(context);\n\n  if (!specResult.errors) {\n    const data0 = specResult.vegaSpec.data[0];\n    data0.values = currData;\n  }\n\n  return specResult;\n}\n},{\".\":\"zwMy\",\"./inference\":\"SLia\"}],\"TNG8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Exec = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _group = require(\"./group\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction valueToBoolean(value) {\n  if (typeof value === 'string') {\n    switch (value.toLowerCase()) {\n      case 'true':\n        return true;\n\n      case 'false':\n        return false;\n    }\n  }\n\n  return !!value;\n}\n\nfunction valueToString(value) {\n  if (value == null) {\n    return '';\n  }\n\n  switch (typeof value) {\n    case 'string':\n      return value;\n\n    case 'boolean':\n    case 'number':\n      return value.toString();\n  }\n\n  return '';\n}\n\nfunction isStringOperation(ex) {\n  switch (ex.operator) {\n    case 'contains':\n    case '!contains':\n    case 'starts':\n    case '!starts':\n      return true;\n  }\n\n  return false;\n}\n\nfunction isnullorEmpty(value) {\n  if (value == null) return true; //double equal sign to also catch undefined\n\n  if (typeof value === 'string' && value.length === 0) return true;\n  return false;\n}\n\nclass Exec {\n  constructor(search, columns) {\n    this.columns = columns;\n    this.groups = VegaDeckGl.util.clone((0, _group.ensureSearchExpressionGroupArray)(search));\n    this.groups.forEach(group => {\n      group.expressions.forEach(ex => {\n        ex.column = this.getColumn(ex.name);\n        ex.valueBool = valueToBoolean(ex.value);\n        ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n        ex.stringOperation = isStringOperation(ex);\n      });\n    });\n  }\n\n  getColumn(name) {\n    for (let i = 0; i < this.columns.length; i++) {\n      if (this.columns[i].name == name) {\n        return this.columns[i];\n      }\n    }\n  }\n\n  runExpressionOnColumn(datum, ex) {\n    const actualDataValue = datum[ex.name];\n\n    if (ex.operator === 'isnullorEmpty') {\n      return isnullorEmpty(actualDataValue);\n    } else if (ex.operator === '!isnullorEmpty') {\n      return !isnullorEmpty(actualDataValue);\n    }\n\n    let dataValue = actualDataValue;\n    let expressionValue = ex.value;\n\n    if (ex.column) {\n      if (ex.column.type === 'string' || ex.stringOperation) {\n        dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n        expressionValue = ex.valueLow;\n      } else if (ex.column.type === 'boolean') {\n        dataValue = valueToBoolean(actualDataValue);\n        expressionValue = ex.valueBool;\n      } else if (ex.column.quantitative) {\n        dataValue = +actualDataValue;\n        expressionValue = +ex.value;\n      }\n    }\n\n    switch (ex.operator) {\n      case '!=':\n        return dataValue != expressionValue;\n\n      case '<':\n        return dataValue < expressionValue;\n\n      case '<=':\n        return dataValue <= expressionValue;\n\n      case '==':\n        return dataValue == expressionValue;\n\n      case '>':\n        return dataValue > expressionValue;\n\n      case '>=':\n        return dataValue >= expressionValue;\n\n      case 'contains':\n        return dataValue.indexOf(expressionValue) >= 0;\n\n      case '!contains':\n        return dataValue.indexOf(expressionValue) < 0;\n\n      case 'starts':\n        return dataValue.indexOf(expressionValue) == 0;\n\n      case '!starts':\n        return dataValue.indexOf(expressionValue) !== 0;\n    }\n  }\n\n  runExpression(datum, ex) {\n    if (ex.name == null) {\n      //run on all columns\n      const group = {\n        expressions: this.columns.map((column, i) => {\n          const ex2 = Object.assign(Object.assign({}, ex), {\n            column,\n            name: column.name\n          });\n\n          if (i) {\n            ex2.clause = '||';\n          }\n\n          return ex2;\n        })\n      };\n      return this.runGroup(datum, group);\n    } else {\n      return this.runExpressionOnColumn(datum, ex);\n    }\n  }\n\n  runGroup(datum, group) {\n    let accumulator = this.runExpression(datum, group.expressions[0]);\n\n    for (let i = 1; i < group.expressions.length; i++) {\n      let ex = group.expressions[i];\n\n      switch (ex.clause) {\n        case '&&':\n          accumulator = accumulator && this.runExpression(datum, ex);\n          break;\n\n        case '||':\n          accumulator = accumulator || this.runExpression(datum, ex);\n          break;\n      }\n    }\n\n    return accumulator;\n  }\n\n  run(datum) {\n    let accumulator = this.runGroup(datum, this.groups[0]);\n\n    for (let i = 1; i < this.groups.length; i++) {\n      let group = this.groups[i];\n\n      switch (group.clause) {\n        case '&&':\n          accumulator = accumulator && this.runGroup(datum, group);\n          break;\n\n        case '||':\n          accumulator = accumulator || this.runGroup(datum, group);\n          break;\n      }\n    }\n\n    return accumulator;\n  }\n\n}\n\nexports.Exec = Exec;\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"./group\":\"yy6X\"}],\"MJ1d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataScope = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nvar _exec = require(\"./searchExpression/exec\");\n\nvar _inference = require(\"./specs/inference\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nclass DataScope {\n  constructor() {\n    this.filteredColumnsStats = {};\n  }\n\n  setData(data, columns) {\n    const differentData = this.data !== data;\n\n    if (differentData) {\n      if (this.data) {\n        //clean up things we added to old data\n        this.deselect();\n      }\n\n      this.data = data;\n      this.columns = columns;\n      this.filteredData = null;\n      this.filteredColumnsStats = {};\n    }\n\n    return differentData;\n  }\n\n  setFilteredData(filteredData) {\n    this.filteredData = filteredData;\n    this.filteredColumnsStats = {};\n  }\n\n  getColumns(columnTypes) {\n    if (!this.columns) {\n      this.columns = (0, _inference.getColumnsFromData)(this.data, columnTypes);\n    }\n\n    return this.columns;\n  }\n\n  getFilteredColumnStats(columnName) {\n    if (!this.filteredColumnsStats[columnName]) {\n      this.filteredColumnsStats[columnName] = (0, _inference.getStats)(this.filteredData, this.columns.filter(c => c.name === columnName)[0]);\n    }\n\n    return this.filteredColumnsStats[columnName];\n  }\n\n  currentData() {\n    return this.filteredData || this.data;\n  }\n\n  select(search) {\n    this.deselect();\n\n    if (search) {\n      this.selection = this.createUserSelection(search, true);\n\n      if (this.selection.included.length) {\n        this.activate(this.selection.included[0]);\n      }\n    }\n  }\n\n  createUserSelection(search, assign) {\n    const exec = new _exec.Exec(search, this.getColumns());\n    const s = {\n      search,\n      included: [],\n      excluded: []\n    };\n    this.currentData().forEach(datum => {\n      if (exec.run(datum)) {\n        if (assign) {\n          datum[_constants.FieldNames.Selected] = true;\n        }\n\n        s.included.push(datum);\n      } else {\n        s.excluded.push(datum);\n      }\n    });\n    return s;\n  }\n\n  deselect() {\n    this.deactivate();\n    this.data.forEach(datum => {\n      delete datum[_constants.FieldNames.Selected];\n    });\n    this.selection = null;\n  }\n\n  hasFilteredData() {\n    return !!this.filteredData;\n  }\n\n  hasSelectedData() {\n    return !!this.selection;\n  }\n\n  collapse(collapsed, data = this.data) {\n    data.forEach(datum => {\n      datum[_constants.FieldNames.Collapsed] = collapsed;\n    });\n    this.isCollapsed = collapsed;\n  }\n\n  activate(datum) {\n    this.deactivate();\n    datum[_constants.FieldNames.Active] = true;\n    this.active = datum;\n  }\n\n  deactivate() {\n    if (this.active) {\n      delete this.active[_constants.FieldNames.Active];\n    }\n\n    this.active = null;\n  }\n\n  ordinalIndexWithinSelection(ordinal) {\n    if (this.selection) {\n      for (let i = 0; i < this.selection.included.length; i++) {\n        let datum = this.selection.included[i];\n\n        if (datum[VegaDeckGl.constants.GL_ORDINAL] === ordinal) {\n          return {\n            datum,\n            index: i\n          };\n        }\n      }\n    }\n\n    return {\n      datum: null,\n      index: -1\n    };\n  }\n\n  finalize() {\n    this.data = null;\n    this.filteredData = null;\n    this.filteredColumnsStats = null;\n\n    if (this.selection) {\n      this.selection.excluded = null;\n      this.selection.included = null;\n      this.selection = null;\n    }\n  }\n\n}\n\nexports.DataScope = DataScope;\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"./specs/constants\":\"b0rV\",\"./searchExpression/exec\":\"TNG8\",\"./specs/inference\":\"SLia\"}],\"iuSj\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _xregexp = require('./xregexp');\n\nvar _xregexp2 = _interopRequireDefault(_xregexp);\n\nvar _build = require('./addons/build');\n\nvar _build2 = _interopRequireDefault(_build);\n\nvar _matchrecursive = require('./addons/matchrecursive');\n\nvar _matchrecursive2 = _interopRequireDefault(_matchrecursive);\n\nvar _unicodeBase = require('./addons/unicode-base');\n\nvar _unicodeBase2 = _interopRequireDefault(_unicodeBase);\n\nvar _unicodeBlocks = require('./addons/unicode-blocks');\n\nvar _unicodeBlocks2 = _interopRequireDefault(_unicodeBlocks);\n\nvar _unicodeCategories = require('./addons/unicode-categories');\n\nvar _unicodeCategories2 = _interopRequireDefault(_unicodeCategories);\n\nvar _unicodeProperties = require('./addons/unicode-properties');\n\nvar _unicodeProperties2 = _interopRequireDefault(_unicodeProperties);\n\nvar _unicodeScripts = require('./addons/unicode-scripts');\n\nvar _unicodeScripts2 = _interopRequireDefault(_unicodeScripts);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _build2.default)(_xregexp2.default);\n(0, _matchrecursive2.default)(_xregexp2.default);\n(0, _unicodeBase2.default)(_xregexp2.default);\n(0, _unicodeBlocks2.default)(_xregexp2.default);\n(0, _unicodeCategories2.default)(_xregexp2.default);\n(0, _unicodeProperties2.default)(_xregexp2.default);\n(0, _unicodeScripts2.default)(_xregexp2.default);\n\nexports.default = _xregexp2.default;\nmodule.exports = exports['default'];\n},{\"./xregexp\":\"o9ca\",\"./addons/build\":\"TuVf\",\"./addons/matchrecursive\":\"rFFh\",\"./addons/unicode-base\":\"GjMy\",\"./addons/unicode-blocks\":\"yn8j\",\"./addons/unicode-categories\":\"WZpi\",\"./addons/unicode-properties\":\"VzkP\",\"./addons/unicode-scripts\":\"Fwp9\"}],\"U3j9\":[function(require,module,exports) {\n'use strict';\n\nconst xRegExp = require('xregexp');\n\nmodule.exports = (text, separator) => {\n  if (typeof text !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n\n  separator = typeof separator === 'undefined' ? '_' : separator;\n  const regex1 = xRegExp('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n  const regex2 = xRegExp('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n  return text // TODO: Use this instead of `xregexp` when targeting Node.js 10:\n  // .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n  // .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n  .replace(regex1, \"$1\".concat(separator, \"$2\")).replace(regex2, \"$1\".concat(separator, \"$2\")).toLowerCase();\n};\n},{\"xregexp\":\"iuSj\"}],\"QGtg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createElement = createElement;\nexports.mount = mount;\n\nvar _decamelize = _interopRequireWildcard(require(\"decamelize\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n//handle es6 / bundling\nconst decamelize = _decamelize['default'] || _decamelize;\n\nfunction createElement(tag, attrs, ...children) {\n  if (typeof tag === 'function') {\n    const fn = tag;\n    const props = attrs;\n    props.children = children;\n    return fn(props);\n  } else {\n    const el = document.createElement(tag);\n    const map = attrs;\n\n    for (let name in map) {\n      if (name && map.hasOwnProperty(name)) {\n        let value = map[name];\n\n        if (name === 'className' && value !== void 0) {\n          el.setAttribute('class', value.toString());\n        } else if (value === false || value === null || value === undefined) {\n          continue;\n        } else if (value === true) {\n          el.setAttribute(name, name);\n        } else if (typeof value === 'function') {\n          el[name.toLowerCase()] = value;\n        } else if (typeof value === 'object') {\n          el.setAttribute(name, flatten(value));\n        } else {\n          el.setAttribute(name, value.toString());\n        }\n      }\n    }\n\n    if (children && children.length > 0) {\n      appendChildren(el, children);\n    }\n\n    return el;\n  }\n}\n\nfunction flatten(o) {\n  const arr = [];\n\n  for (let prop in o) arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n\n  return arr.join(';');\n}\n\nfunction addChild(parentElement, child) {\n  if (child === null || child === undefined || typeof child === \"boolean\") {\n    return;\n  } else if (Array.isArray(child)) {\n    appendChildren(parentElement, child);\n  } else if (isElement(child)) {\n    parentElement.appendChild(child);\n  } else {\n    parentElement.appendChild(document.createTextNode(child.toString()));\n  }\n}\n\nfunction appendChildren(parentElement, children) {\n  children.forEach(child => addChild(parentElement, child));\n}\n\nfunction isElement(el) {\n  //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n  return !!el.nodeType;\n}\n\nfunction mount(element, container) {\n  const activeChildPositions = getActiveChildPositions(container);\n  container.innerHTML = '';\n\n  if (element) {\n    addChild(container, element);\n    if (activeChildPositions) focusChildAtPosition(container, activeChildPositions);\n  }\n}\n\nfunction focusChildAtPosition(element, childPositions) {\n  while (element && childPositions.length) element = element.children.item(childPositions.shift());\n\n  if (element) element.focus();\n}\n\nfunction getActiveChildPositions(containerElement) {\n  var active = document.activeElement;\n  var childPositions = [];\n\n  while (active !== document.body && active !== containerElement) {\n    childPositions.unshift(childPosition(active));\n    active = active.parentElement;\n  }\n\n  if (active === containerElement && childPositions.length) return childPositions;\n}\n\nfunction childPosition(element) {\n  let i = 0;\n\n  while (element = element.previousElementSibling) i++;\n\n  return i;\n}\n},{\"decamelize\":\"U3j9\"}],\"KCB5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Details = void 0;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _util = require(\"./util\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar Action;\n\n(function (Action) {\n  Action[Action[\"deselect\"] = 0] = \"deselect\";\n  Action[Action[\"isolate\"] = 1] = \"isolate\";\n  Action[Action[\"exclude\"] = 2] = \"exclude\";\n  Action[Action[\"reset\"] = 3] = \"reset\";\n  Action[Action[\"next\"] = 4] = \"next\";\n  Action[Action[\"previous\"] = 5] = \"previous\";\n})(Action || (Action = {}));\n\nclass Details {\n  constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n    this.language = language;\n    this.animator = animator;\n    this.dataScope = dataScope;\n    this.colorMapHandler = colorMapHandler;\n    this.hasColorMaps = hasColorMaps;\n    this.element = _vegaDeck.util.addDiv(parentElement, `${_defaults.cssPrefix}unitControls`);\n    this.clear();\n  }\n\n  finalize() {\n    if (this.element) this.element.innerHTML = '';\n    this.dataScope = null;\n    this.element = null;\n  }\n\n  clear() {\n    this.state = {\n      userSelection: null,\n      index: -1,\n      remapColor: false\n    };\n    this.render();\n  }\n\n  clearSelection() {\n    this.state.userSelection = null;\n    this.state.index = -1;\n    this.render();\n  }\n\n  populate(userSelection, index = 0) {\n    this.state.userSelection = userSelection;\n    this.state.index = index;\n    this.render();\n  }\n\n  selectByNameValue(columnName, value) {\n    const search = {\n      name: columnName,\n      operator: '==',\n      value\n    };\n    this.clearSelection();\n    this.animator.select(search);\n    this.populate(this.dataScope.selection);\n  }\n\n  remapChanged(remap) {\n    this.state.remapColor = remap;\n    this.colorMapHandler(remap);\n    this.render();\n  }\n\n  handleAction(action) {\n    let p;\n    const u = this.state.userSelection;\n\n    switch (action) {\n      case Action.deselect:\n        {\n          this.clearSelection();\n          p = this.animator.deselect();\n          break;\n        }\n\n      case Action.exclude:\n        {\n          this.clearSelection();\n          p = this.animator.filter(searchExpression.invert(u.search), u.excluded, u.included);\n          this.state.remapColor = false;\n          break;\n        }\n\n      case Action.isolate:\n        {\n          this.clearSelection();\n          p = this.animator.filter(u.search, u.included, u.excluded);\n          this.state.remapColor = false;\n          break;\n        }\n\n      case Action.reset:\n        {\n          this.clear();\n          p = this.animator.reset();\n          break;\n        }\n\n      default:\n        {\n          switch (action) {\n            case Action.previous:\n              {\n                this.state.index--;\n\n                if (this.state.index < 0) {\n                  this.state.index = this.state.userSelection.included.length - 1;\n                }\n\n                break;\n              }\n\n            case Action.next:\n              {\n                this.state.index++;\n\n                if (this.state.index >= this.state.userSelection.included.length) {\n                  this.state.index = 0;\n                }\n\n                break;\n              }\n          }\n\n          this.render();\n          p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n    }\n\n    p.then(() => this.render());\n  }\n\n  render() {\n    const hasRefinedData = this.dataScope.hasFilteredData();\n    const renderProps = {\n      language: this.language,\n      actionHandler: action => this.handleAction(action),\n      selectionHandler: (columnName, value) => this.selectByNameValue(columnName, value),\n      count: this.state.userSelection && this.state.userSelection.included.length,\n      hasRefinedData,\n      item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n      remapColorHandler: remap => this.remapChanged(remap),\n      hasColorMaps: this.hasColorMaps() && hasRefinedData,\n      remapColor: this.state.remapColor\n    };\n    (0, _tsxCreateElement.mount)(renderDetails(renderProps), this.element);\n  }\n\n}\n\nexports.Details = Details;\n\nconst renderDetails = props => {\n  const controlButtons = [(0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.deselect)\n  }, props.language.deselect), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.isolate)\n  }, props.language.isolate), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.exclude)\n  }, props.language.exclude)];\n  const colorMapping = (0, _tsxCreateElement.createElement)(\"div\", null, (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: props.remapColor,\n    onClick: e => props.remapColorHandler(true)\n  }, props.language.newColorMap), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.remapColor,\n    onClick: e => props.remapColorHandler(false)\n  }, props.language.oldColorMap));\n  const singleItem = props.count === 1;\n  const scrollButtons = [(0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: singleItem,\n    onClick: e => props.actionHandler(Action.previous)\n  }, props.language.previousDetail), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: singleItem,\n    onClick: e => props.actionHandler(Action.next)\n  }, props.language.nextDetail), (0, _tsxCreateElement.createElement)(\"span\", null, \" \", props.language.selectionCount(props.count))];\n  const rows = [];\n\n  for (let prop in props.item) {\n    if (prop === _vegaDeck.constants.GL_ORDINAL) {\n      continue;\n    }\n\n    if ((0, _util.isInternalFieldName)(prop)) {\n      continue;\n    }\n\n    rows.push({\n      cells: [{\n        content: prop\n      }, {\n        content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler)\n      }]\n    });\n  }\n\n  return (0, _tsxCreateElement.createElement)(\"div\", null, props.hasColorMaps && colorMapping, (0, _tsxCreateElement.createElement)(\"h4\", null, props.language.headers.selection), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}selection`\n  }, controlButtons, (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.hasRefinedData,\n    onClick: e => props.actionHandler(Action.reset)\n  }, \"reset\")), props.item && (0, _tsxCreateElement.createElement)(\"h4\", null, props.language.headers.details), (0, _tsxCreateElement.createElement)(\"div\", null, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}details-scroll`\n  }, props.item && scrollButtons), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}details`\n  }, props.item && (0, _tsxCreateElement.createElement)(_vegaDeck.controls.Table, {\n    rows: rows\n  }))));\n};\n\nfunction linkSelect(language, columnName, value, selectionHandler) {\n  return (0, _tsxCreateElement.createElement)(\"span\", null, (0, _tsxCreateElement.createElement)(\"a\", {\n    href: \"#\",\n    onClick: e => selectionHandler(columnName, value)\n  }, value), isNaN(value) ? [' ', (0, _tsxCreateElement.createElement)(\"a\", {\n    className: \"bing-search\",\n    href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n    target: \"_blank\"\n  }, language.bing)] : '');\n}\n},{\"./searchExpression\":\"mJgy\",\"@msrvida/vega-deck.gl\":\"eFEk\",\"tsx-create-element\":\"QGtg\",\"./defaults\":\"G0Md\",\"./util\":\"BTLl\"}],\"nQLz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ensureHeaders = ensureHeaders;\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nfunction ensureHeaders(presenter, headers) {\n  const vegaControls = presenter.getElement(_vegaDeck.PresenterElement.vegaControls);\n  conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n  const legend = presenter.getElement(_vegaDeck.PresenterElement.legend);\n  conditionalHeader(!!legend.children.length, legend, headers.legend);\n}\n\nfunction conditionalHeader(condition, element, header) {\n  var existing = existingHeader(element, header);\n\n  if (condition && !existing) {\n    addHeader(element, header);\n  }\n\n  if (!condition && existing) {\n    existing.remove();\n  }\n}\n\nfunction addHeader(element, header) {\n  const h = document.createElement('h4');\n  h.innerHTML = header;\n  element.insertAdjacentElement('beforebegin', h);\n}\n\nfunction existingHeader(element, header) {\n  const {\n    previousElementSibling\n  } = element;\n\n  if (previousElementSibling && previousElementSibling.innerHTML === header) {\n    return previousElementSibling;\n  }\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\"}],\"rI67\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.finalizeLegend = finalizeLegend;\n\nvar _expression = require(\"./expression\");\n\nvar _constants = require(\"./specs/constants\");\n\nfunction legendRange(colorBinType, column, legend, clickedIndex) {\n  if (column.quantitative) {\n    return selectQuantitative(colorBinType, column, legend, clickedIndex);\n  } else {\n    return selectCategorical(column, legend, clickedIndex);\n  }\n}\n\nfunction selectCategorical(column, legend, clickedIndex) {\n  const value = legend.rows[clickedIndex].value;\n\n  if (value === _constants.Other) {\n    const values = [];\n\n    for (let i in legend.rows) {\n      if (+i !== clickedIndex) {\n        values.push(legend.rows[i].value);\n      }\n    }\n\n    return (0, _expression.selectNone)(column, values);\n  } else {\n    //select equal\n    return {\n      expressions: [(0, _expression.selectExact)(column, legend.rows[clickedIndex].value)]\n    };\n  }\n}\n\nfunction selectQuantitative(colorBinType, column, legend, clickedIndex) {\n  const keys = Object.keys(legend.rows).map(key => +key).sort((a, b) => +a - +b);\n  let lowValue;\n  let lowOperator;\n  let highValue;\n  let highOperator;\n  const rowText = legend.rows[clickedIndex].label;\n\n  switch (colorBinType) {\n    case 'continuous':\n      {\n        lowValue = rowText;\n\n        if (clickedIndex < keys.length - 1) {\n          highValue = legend.rows[clickedIndex + 1].value;\n        }\n\n        break;\n      }\n\n    default:\n      {\n        if (rowText.indexOf('null') > 0) {\n          const ex = {\n            expressions: [(0, _expression.selectNullOrEmpty)(column)]\n          };\n          return ex;\n        }\n\n        const dash = rowText.indexOf('–'); //this is not the common dash character!\n\n        if (dash > 0) {\n          //bug in Vega for quantize?\n          //lowOperator = '>';\n          //highOperator = '<=';\n          lowValue = rowText.substr(0, dash);\n          highValue = rowText.substr(dash + 1);\n        } else {\n          if (rowText.indexOf('<') >= 0) {\n            highValue = rowText.substring(2);\n          } else {\n            if (rowText.indexOf('≥') >= 0) {\n              lowValue = rowText.substring(2);\n            }\n          }\n        }\n      }\n  }\n\n  if (lowValue) lowValue = (0, _expression.notNice)(lowValue);\n  if (highValue) highValue = (0, _expression.notNice)(highValue);\n  return (0, _expression.selectBetween)(column, lowValue, highValue, lowOperator, highOperator);\n}\n\nfunction finalizeLegend(colorBinType, colorColumn, legend, language) {\n  const rowTexts = [];\n\n  for (let i in legend.rows) {\n    let row = legend.rows[i];\n    row.search = legendRange(colorBinType, colorColumn, legend, +i);\n\n    if (row.value === _constants.Other) {\n      row.label = language.legendOther;\n    } else if (rowTexts.indexOf(row.value) >= 0) {\n      delete legend.rows[i];\n    } else {\n      rowTexts.push(row.value);\n    }\n  }\n}\n},{\"./expression\":\"JTcr\",\"./specs/constants\":\"b0rV\"}],\"A7xy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.recolorAxes = recolorAxes;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction cloneAxis(axes, axisColor, axisTextColor) {\n  return axes.map(axis => {\n    const newAxis = VegaDeckGl.util.deepMerge(axis);\n    newAxis.domain.color = axisColor;\n    newAxis.title.color = axisTextColor;\n    newAxis.ticks.forEach(t => {\n      t.color = axisColor;\n    });\n    newAxis.tickText.forEach(t => {\n      t.color = axisTextColor;\n    });\n    return newAxis;\n  });\n}\n\nfunction cloneTextData(textData, color) {\n  return textData.map(t => {\n    return Object.assign(Object.assign({}, t), {\n      color\n    });\n  });\n}\n\nfunction colorEquals(a, b) {\n  if (a.length !== b.length) return false;\n\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return false;\n  }\n\n  return true;\n}\n\nfunction recolorAxes(stage, oldColors, newColors) {\n  const hasNewLineColor = newColors.axisLine && !colorEquals(newColors.axisLine, oldColors.axisLine);\n  const hasNewTextColor = newColors.axisText && !colorEquals(newColors.axisText, oldColors.axisText);\n  let axes;\n  let textData;\n\n  if (hasNewLineColor || hasNewTextColor) {\n    const lineColor = newColors.axisLine || oldColors.axisLine;\n    const textColor = newColors.axisText || oldColors.axisText;\n    axes = {\n      x: cloneAxis(stage.axes.x, lineColor, textColor),\n      y: cloneAxis(stage.axes.y, lineColor, textColor)\n    };\n  }\n\n  if (hasNewTextColor) {\n    textData = cloneTextData(stage.textData, newColors.axisText);\n  }\n\n  return {\n    axes,\n    textData\n  };\n}\n},{\"@msrvida/vega-deck.gl\":\"eFEk\"}],\"bkgF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Tooltip = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _util = require(\"./util\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst {\n  GL_ORDINAL\n} = VegaDeckGl.constants;\nconst {\n  outerSize\n} = VegaDeckGl.util;\nconst {\n  Table\n} = VegaDeckGl.controls;\n\nclass Tooltip {\n  constructor(props) {\n    const renderProps = {\n      cssPrefix: props.cssPrefix,\n      rows: getRows(props.item, props.options)\n    };\n    this.element = renderTooltip(renderProps);\n\n    if (this.element) {\n      this.element.style.position = 'absolute';\n      this.child = this.element.firstChild;\n      document.body.appendChild(this.element); //measure and move as necessary\n\n      let m = outerSize(this.child);\n\n      while (m.height > document.documentElement.clientHeight) {\n        let tr = this.child.querySelector('tr:last-child');\n\n        if (tr) {\n          tr.parentElement.removeChild(tr);\n        } else {\n          break;\n        }\n\n        m = outerSize(this.child);\n      }\n\n      if (props.position.clientX + m.width >= document.documentElement.clientWidth) {\n        this.child.style.right = '0';\n      }\n\n      let moveTop = true;\n\n      if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n        if (props.position.clientY - m.height > 0) {\n          this.child.style.bottom = '0';\n        } else {\n          moveTop = false;\n        }\n      }\n\n      if (moveTop) {\n        this.element.style.top = `${props.position.clientY}px`;\n      }\n\n      this.element.style.left = `${props.position.clientX}px`;\n    }\n  }\n\n  finalize() {\n    if (this.element) {\n      document.body.removeChild(this.element);\n    }\n\n    this.element = null;\n  }\n\n}\n\nexports.Tooltip = Tooltip;\n\nfunction getRows(item, options) {\n  const rows = [];\n\n  for (let columnName in item) {\n    if (columnName === GL_ORDINAL) {\n      continue;\n    }\n\n    if ((0, _util.isInternalFieldName)(columnName)) {\n      continue;\n    }\n\n    if (options && options.exclude) {\n      if (options.exclude(columnName)) {\n        continue;\n      }\n    }\n\n    let value = item[columnName];\n    let content;\n\n    if (options && options.displayValue) {\n      content = options.displayValue(value);\n    } else {\n      switch (value) {\n        case null:\n          content = (0, _tsxCreateElement.createElement)(\"i\", null, \"null\");\n          break;\n\n        case undefined:\n          content = (0, _tsxCreateElement.createElement)(\"i\", null, \"undefined\");\n          break;\n\n        default:\n          content = value.toString();\n      }\n    }\n\n    rows.push({\n      cells: [{\n        content: columnName + ':'\n      }, {\n        content\n      }]\n    });\n  }\n\n  return rows;\n}\n\nconst renderTooltip = props => {\n  return props.rows.length === 0 ? null : (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${props.cssPrefix}tooltip`\n  }, Table({\n    rows: props.rows\n  }));\n};\n},{\"@msrvida/vega-deck.gl\":\"eFEk\",\"tsx-create-element\":\"QGtg\",\"./util\":\"BTLl\"}],\"CdFf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Viewer = void 0;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _animator = require(\"./animator\");\n\nvar _colorCubes = require(\"./colorCubes\");\n\nvar _signals = require(\"./signals\");\n\nvar _ordinal = require(\"./ordinal\");\n\nvar _axisSelection = require(\"./axisSelection\");\n\nvar _clone = require(\"./specs/clone\");\n\nvar _dataScope = require(\"./dataScope\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _details = require(\"./details\");\n\nvar _headers = require(\"./headers\");\n\nvar _legend = require(\"./legend\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _axes = require(\"./axes\");\n\nvar _colorSchemes = require(\"./colorSchemes\");\n\nvar _tooltip = require(\"./tooltip\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {\n  function adopt(value) {\n    return value instanceof P ? value : new P(function (resolve) {\n      resolve(value);\n    });\n  }\n\n  return new (P || (P = Promise))(function (resolve, reject) {\n    function fulfilled(value) {\n      try {\n        step(generator.next(value));\n      } catch (e) {\n        reject(e);\n      }\n    }\n\n    function rejected(value) {\n      try {\n        step(generator[\"throw\"](value));\n      } catch (e) {\n        reject(e);\n      }\n    }\n\n    function step(result) {\n      result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n    }\n\n    step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}; // Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n\nconst {\n  defaultView\n} = VegaDeckGl.defaults;\nlet didRegisterColorSchemes = false;\n/**\n * Component to view a SandDance data visualization.\n */\n\nclass Viewer {\n  /**\n   * Instantiate a new Viewer.\n   * @param element Parent HTMLElement to present within.\n   * @param options Optional viewer options object.\n   */\n  constructor(element, options) {\n    this.element = element;\n    this.options = VegaDeckGl.util.deepMerge(_defaults.defaultViewerOptions, options);\n    this.presenter = new VegaDeckGl.Presenter(element, (0, _defaults.getPresenterStyle)(this.options));\n    this._dataScope = new _dataScope.DataScope();\n    this._animator = new _animator.Animator(this._dataScope, {\n      onDataChanged: this.onDataChanged.bind(this),\n      onAnimateDataChange: this.onAnimateDataChange.bind(this)\n    });\n    this._details = new _details.Details(this.presenter.getElement(VegaDeckGl.PresenterElement.panel), this.options.language, this._animator, this._dataScope, remap => {\n      this.currentColorContext = ~~remap;\n      this.renderSameLayout();\n    }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n    this.insight = {};\n    this._signalValues = {};\n  }\n\n  changeColorContexts(colorContexts) {\n    this.colorContexts = colorContexts;\n    this.currentColorContext = 0;\n    this.options.onColorContextChange && this.options.onColorContextChange();\n  }\n\n  applyLegendColorContext(colorContext) {\n    (0, _tsxCreateElement.mount)(colorContext.legendElement, this.presenter.getElement(VegaDeckGl.PresenterElement.legend));\n    this.presenter.stage.legend = colorContext.legend;\n  }\n\n  onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n    return new Promise((resolve, reject) => {\n      let innerPromise;\n\n      if (dataChange === _animator.DataLayoutChange.refine) {\n        const oldColorContext = this.colorContexts[this.currentColorContext];\n        innerPromise = new Promise(innerResolve => {\n          this.renderNewLayout({\n            preStage: (stage, deckProps) => {\n              (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n              this.overrideAxisLabels(stage);\n              (0, _colorCubes.applyColorMapToCubes)([oldColorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n\n              if (this.options.onStage) {\n                this.options.onStage(stage, deckProps);\n              }\n            }\n          }).then(() => {\n            //apply old legend\n            this.applyLegendColorContext(oldColorContext);\n            innerResolve();\n          });\n        });\n      } else {\n        innerPromise = this.renderNewLayout({\n          preStage: (stage, deckProps) => {\n            (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            this.overrideAxisLabels(stage);\n\n            if (this.options.onStage) {\n              this.options.onStage(stage, deckProps);\n            }\n          }\n        });\n      }\n\n      innerPromise.then(() => {\n        this.presenter.animationQueue(resolve, this.options.transitionDurations.position, {\n          waitingLabel,\n          handlerLabel,\n          animationCanceled: reject\n        });\n      });\n    });\n  }\n\n  onDataChanged(dataLayout, filter) {\n    return __awaiter(this, void 0, void 0, function* () {\n      switch (dataLayout) {\n        case _animator.DataLayoutChange.same:\n          {\n            this.renderSameLayout();\n            break;\n          }\n\n        case _animator.DataLayoutChange.refine:\n          {\n            //save cube colors\n            const oldColorContext = this.colorContexts[this.currentColorContext];\n            let colorMap;\n            yield this.renderNewLayout({\n              preStage: (stage, deckProps) => {\n                //save off the spec colors\n                colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n                (0, _colorCubes.applyColorMapToCubes)([oldColorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n                this.preStage(stage, deckProps);\n              },\n              onPresent: () => {\n                //save new legend\n                const newColorContext = {\n                  colorMap,\n                  legend: VegaDeckGl.util.clone(this.presenter.stage.legend),\n                  legendElement: this.presenter.getElement(VegaDeckGl.PresenterElement.legend).children[0]\n                }; //apply old legend\n\n                this.applyLegendColorContext(oldColorContext);\n                this.changeColorContexts([oldColorContext, newColorContext]);\n              }\n            }); //narrow the filter only if it is different\n\n            if (!searchExpression.compare(this.insight.filter, filter)) {\n              this.insight.filter = searchExpression.narrow(this.insight.filter, filter);\n            }\n\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n            }\n\n            break;\n          }\n\n        case _animator.DataLayoutChange.reset:\n          {\n            const colorContext = {\n              colorMap: null,\n              legend: null,\n              legendElement: null\n            };\n            this.changeColorContexts([colorContext]);\n            yield this.renderNewLayout({\n              onPresent: () => {\n                (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n              }\n            });\n            delete this.insight.filter;\n\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(null, null);\n            }\n\n            break;\n          }\n      }\n\n      if (this.options.onSelectionChanged) {\n        const sel = this.getSelection();\n        this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n      }\n    });\n  }\n\n  getSpecColumnsWithFilteredStats() {\n    if (!this._dataScope.hasFilteredData()) {\n      return this._specColumns;\n    }\n\n    const roles = ['color', 'facet', 'group', 'size', 'sort', 'x', 'y', 'z'];\n    const specColumns = Object.assign({}, this._specColumns);\n    roles.forEach(r => {\n      if (specColumns[r]) {\n        const column = Object.assign({}, specColumns[r]);\n        column.stats = this.getColumnStats(column);\n        specColumns[r] = column;\n      }\n    });\n    return specColumns;\n  }\n\n  renderNewLayout(c, view) {\n    return __awaiter(this, void 0, void 0, function* () {\n      const currData = this._dataScope.currentData();\n\n      const context = {\n        specColumns: this.getSpecColumnsWithFilteredStats(),\n        insight: this.insight,\n        specViewOptions: this.options\n      };\n      const specResult = (0, _clone.cloneVegaSpecWithData)(context, currData);\n\n      if (!specResult.errors) {\n        const uiValues = (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n        this._signalValues = Object.assign(Object.assign(Object.assign({}, this._signalValues), uiValues), this.insight.signalValues);\n        (0, _signals.applySignalValues)(this._signalValues, specResult.vegaSpec);\n        this.vegaSpec = specResult.vegaSpec;\n        this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n        this.specCapabilities = specResult.specCapabilities;\n        const config = this.createConfig(c);\n\n        if (view) {\n          config.getView = () => view;\n        }\n\n        if (!didRegisterColorSchemes) {\n          (0, _colorSchemes.registerColorSchemes)(VegaDeckGl.base.vega);\n          didRegisterColorSchemes = true;\n        }\n\n        try {\n          const runtime = VegaDeckGl.base.vega.parse(this.vegaSpec);\n          this.vegaViewGl = new VegaDeckGl.ViewGl(runtime, config).renderer('deck.gl').initialize(this.element);\n          yield this.vegaViewGl.runAsync(); //capture new color color contexts via signals\n\n          this.configForSignalCapture(config.presenterConfig);\n        } catch (e) {\n          specResult.errors = [e.message];\n        }\n\n        if (!specResult.errors) {\n          (0, _headers.ensureHeaders)(this.presenter, this.options.language.headers);\n        }\n      }\n\n      if (specResult.errors) {\n        if (this.options.onError) {\n          this.options.onError(specResult.errors);\n        } else if (this.presenter.logger) {\n          this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n        }\n      }\n\n      return specResult;\n    });\n  }\n  /**\n   * Render the same layout with new options.\n   * @param newViewerOptions New options object.\n   */\n\n\n  renderSameLayout(newViewerOptions) {\n    const colorContext = this.colorContexts[this.currentColorContext];\n    const clonedCubes = this.presenter.getCubeData().map(cube => {\n      return Object.assign({}, cube);\n    });\n    this.applyLegendColorContext(colorContext);\n    let {\n      axes,\n      textData\n    } = this.presenter.stage;\n    let recoloredAxes;\n\n    if (newViewerOptions) {\n      if (newViewerOptions.colors) {\n        recoloredAxes = (0, _axes.recolorAxes)(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n        axes = recoloredAxes.axes || axes;\n        textData = recoloredAxes.textData || textData;\n      }\n\n      this.options = VegaDeckGl.util.deepMerge(this.options, newViewerOptions);\n    }\n\n    let colorMaps = [colorContext.colorMap];\n    let colorMethod;\n\n    const hasSelectedData = this._dataScope.hasSelectedData();\n\n    const hasActive = !!this._dataScope.active;\n\n    if (hasSelectedData || hasActive) {\n      const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n      colorMaps.push(selectedColorMap);\n      colorMethod = this.options.colors.unselectedColorMethod;\n    }\n\n    (0, _colorCubes.applyColorMapToCubes)(colorMaps, clonedCubes, colorMethod);\n    const stage = {\n      cubeData: clonedCubes,\n      axes,\n      textData\n    };\n    this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n  }\n\n  getView(view) {\n    if (view === undefined) {\n      if (this.presenter.view === null) {\n        return defaultView;\n      } else {\n        return this.presenter.view;\n      }\n    } else {\n      return view;\n    }\n  }\n\n  transformData(values, transform) {\n    try {\n      const runtime = VegaDeckGl.base.vega.parse({\n        $schema: 'https://vega.github.io/schema/vega/v4.json',\n        data: [{\n          name: 'source',\n          values,\n          transform\n        }]\n      });\n      new VegaDeckGl.ViewGl(runtime).run();\n    } catch (e) {// continue regardless of error\n    }\n\n    return values;\n  }\n  /**\n   * Render data into a visualization.\n   * @param insight Object to create a visualization specification.\n   * @param data Array of data objects.\n   * @param view Optional View to specify camera type.\n   * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n   */\n\n\n  render(insight, data, options = {}) {\n    return __awaiter(this, void 0, void 0, function* () {\n      let result; //see if refine expression has changed\n\n      if (!searchExpression.compare(insight.filter, this.insight.filter)) {\n        const allowAsyncRenderTime = 100;\n\n        if (insight.filter) {\n          //refining\n          result = yield this._render(insight, data, options);\n          this.presenter.animationQueue(() => {\n            this.filter(insight.filter);\n          }, allowAsyncRenderTime, {\n            waitingLabel: 'layout before refine',\n            handlerLabel: 'refine after layout'\n          });\n        } else {\n          //not refining\n          this._dataScope.setFilteredData(null);\n\n          result = yield this._render(insight, data, options);\n          this.presenter.animationQueue(() => {\n            this.reset();\n          }, allowAsyncRenderTime, {\n            waitingLabel: 'layout before reset',\n            handlerLabel: 'reset after layout'\n          });\n        }\n      } else {\n        result = yield this._render(insight, data, options);\n      }\n\n      return result;\n    });\n  }\n\n  shouldViewstateTransition(newInsight, oldInsight) {\n    if (!oldInsight.columns) return false;\n    if (oldInsight.chart !== newInsight.chart) return true;\n    if (oldInsight.size.height !== newInsight.size.height) return true;\n    if (oldInsight.size.width !== newInsight.size.width) return true;\n    if (oldInsight.columns.facet !== newInsight.columns.facet) return true;\n    return false;\n  }\n\n  configForSignalCapture(presenterConfig) {\n    const colorContext = {\n      colorMap: null,\n      legend: null,\n      legendElement: null\n    }; //now be ready to capture color changing signals \n\n    presenterConfig.preStage = (stage, deckProps) => {\n      if (this._shouldSaveColorContext()) {\n        //save off the colors from Vega layout\n        colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n      }\n\n      this.preStage(stage, deckProps);\n    };\n\n    presenterConfig.onPresent = () => {\n      if (this._shouldSaveColorContext()) {\n        (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n        this.changeColorContexts([colorContext]);\n\n        this._dataScope.deselect();\n      }\n    };\n  }\n\n  _render(insight, data, options) {\n    return __awaiter(this, void 0, void 0, function* () {\n      if (this._tooltip) {\n        this._tooltip.finalize();\n\n        this._tooltip = null;\n      }\n\n      if (this._dataScope.setData(data, options.columns)) {\n        //data is different, reset the signal value cache\n        this._signalValues = {}; //apply transform to the data\n\n        this.transformData(data, insight.transform);\n      }\n\n      this._specColumns = (0, _ordinal.getSpecColumns)(insight, this._dataScope.getColumns(options.columnTypes));\n      const ordinalMap = (0, _ordinal.assignOrdinals)(this._specColumns, data, options.ordinalMap);\n      this.insight = VegaDeckGl.util.clone(insight);\n      this._lastColorOptions = VegaDeckGl.util.clone(this.options.colors);\n\n      this._shouldSaveColorContext = () => !options.initialColorContext;\n\n      const colorContext = options.initialColorContext || {\n        colorMap: null,\n        legend: null,\n        legendElement: null\n      };\n      const specResult = yield this.renderNewLayout({\n        preStage: (stage, deckProps) => {\n          if (this._shouldSaveColorContext()) {\n            //save off the colors from Vega layout\n            colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n          } else {\n            //apply passed colorContext\n            (0, _colorCubes.applyColorMapToCubes)([colorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n          } //if items are selected, repaint\n\n\n          const hasSelectedData = !!this._dataScope.hasSelectedData();\n          const hasActive = !!this._dataScope.active;\n\n          if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n            const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n            (0, _colorCubes.applyColorMapToCubes)([colorContext.colorMap, selectedColorMap], stage.cubeData, this.options.colors.unselectedColorMethod);\n          }\n\n          this.preStage(stage, deckProps);\n        },\n        onPresent: () => {\n          if (this._shouldSaveColorContext()) {\n            (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n            this.changeColorContexts([colorContext]);\n          } else {\n            //apply passed colorContext\n            this.applyLegendColorContext(colorContext);\n          }\n        },\n        shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight)\n      }, this.getView(insight.view)); //future signal changes should save the color context\n\n      this._shouldSaveColorContext = () => !options.discardColorContextUpdates || !options.discardColorContextUpdates();\n\n      this._details.render();\n\n      const result = {\n        ordinalMap,\n        specResult\n      };\n      return result;\n    });\n  }\n\n  overrideAxisLabels(stage) {// if (this._specColumns.x && this._specColumns.x.type === 'date') {\n    //     stage.axes.x.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.x)\n    //     ));\n    // }\n    // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n    //     stage.axes.y.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.y)\n    //     ));\n    // }\n  }\n\n  preStage(stage, deckProps) {\n    const onClick = (e, search) => {\n      if (this.options.onAxisClick) {\n        this.options.onAxisClick(e, search);\n      } else {\n        this.select(search);\n      }\n    };\n\n    this.overrideAxisLabels(stage);\n    const polygonLayer = (0, _axisSelection.axisSelectionLayer)(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n    const order = 1; //after textlayer but before others\n\n    deckProps.layers.splice(order, 0, polygonLayer);\n    (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n\n    if (this.options.onStage) {\n      this.options.onStage(stage, deckProps);\n    }\n  }\n\n  onCubeClick(e, cube) {\n    const hasSelectedData = this._dataScope.hasSelectedData();\n\n    if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n      //if active is within selection, keep the selection and activate the one.\n      const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n\n      if (indexWithinSelection.index >= 0) {\n        this.activate(indexWithinSelection.datum);\n\n        this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n\n        if (this.options.onSelectionChanged) {\n          const sel = this.getSelection();\n          this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n        }\n\n        return;\n      }\n    }\n\n    if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][VegaDeckGl.constants.GL_ORDINAL] === cube.ordinal) {\n      this.deselect();\n      return;\n    }\n\n    const search = {\n      name: VegaDeckGl.constants.GL_ORDINAL,\n      operator: '==',\n      value: cube.ordinal\n    };\n    this.select(search);\n  }\n\n  onCubeHover(e, cube) {\n    if (this._tooltip) {\n      this._tooltip.finalize();\n\n      this._tooltip = null;\n    }\n\n    if (!cube) {\n      return;\n    }\n\n    const currentData = this._dataScope.currentData();\n\n    const index = (0, _ordinal.getDataIndexOfCube)(cube, currentData);\n\n    if (index >= 0) {\n      this._tooltip = new _tooltip.Tooltip({\n        options: this.options.tooltipOptions,\n        item: currentData[index],\n        position: e,\n        cssPrefix: this.presenter.style.cssPrefix\n      });\n    }\n  }\n\n  onTextHover(e, t) {\n    //return true if highlight color is different\n    if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor) return false;\n    return !VegaDeckGl.util.colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n  }\n\n  createConfig(c) {\n    const {\n      getTextColor,\n      getTextHighlightColor,\n      onTextClick\n    } = this.options;\n    const defaultPresenterConfig = {\n      getTextColor,\n      getTextHighlightColor,\n      onTextClick,\n      onCubeClick: this.onCubeClick.bind(this),\n      onCubeHover: this.onCubeHover.bind(this),\n      onTextHover: this.onTextHover.bind(this),\n      preStage: this.preStage.bind(this),\n      onPresent: this.options.onPresent,\n      onLayerClick: (info, pickedInfos, e) => {\n        if (!info) {\n          this.deselect();\n        }\n      },\n      onLegendClick: (e, legend, clickedIndex) => {\n        const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n\n        if (legendRow) {\n          if (this.options.onLegendRowClick) {\n            this.options.onLegendRowClick(e, legendRow);\n          } else {\n            this.select(legendRow.search);\n          }\n        } else if (this.options.onLegendHeaderClick) {\n          //header clicked\n          this.options.onLegendHeaderClick(e);\n        }\n      }\n    };\n\n    if (this.options.onBeforeCreateLayers) {\n      defaultPresenterConfig.preLayer = stage => this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n    }\n\n    const config = {\n      presenter: this.presenter,\n      presenterConfig: Object.assign(defaultPresenterConfig, c)\n    };\n\n    if (this.options.transitionDurations) {\n      config.presenterConfig.transitionDurations = this.options.transitionDurations;\n    }\n\n    return config;\n  }\n  /**\n   * Filter the data and animate.\n   * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n   */\n\n\n  filter(search) {\n    const u = this._dataScope.createUserSelection(search, false);\n\n    return new Promise((resolve, reject) => {\n      this._animator.filter(search, u.included, u.excluded).then(() => {\n        this._details.clear();\n\n        this._details.clearSelection();\n\n        this._details.populate(this._dataScope.selection);\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Remove any filtration and animate.\n   */\n\n\n  reset() {\n    return new Promise((resolve, reject) => {\n      this._animator.reset().then(() => {\n        this._details.clear();\n\n        this._details.clearSelection();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Select cubes by a filter expression.\n   * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n   */\n\n\n  select(search) {\n    return new Promise((resolve, reject) => {\n      this._animator.select(search).then(() => {\n        this._details.populate(this._dataScope.selection);\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Removes any selection.\n   */\n\n\n  deselect() {\n    return new Promise((resolve, reject) => {\n      this._animator.deselect().then(() => {\n        this._details.clearSelection();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Gets the current selection.\n   */\n\n\n  getSelection() {\n    if (!this._dataScope) return null;\n    const selectionState = {\n      search: this._dataScope.selection && this._dataScope.selection.search || null,\n      selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n      active: this._dataScope.active\n    };\n    return selectionState;\n  }\n  /**\n   * Set one data row to the active state.\n   */\n\n\n  activate(datum) {\n    return new Promise((resolve, reject) => {\n      this._animator.activate(datum).then(() => {\n        this._details.render();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Deactivate item.\n   */\n\n\n  deActivate() {\n    return new Promise((resolve, reject) => {\n      if (this._dataScope && this._dataScope.active) {\n        this._animator.deactivate().then(() => {\n          this._details.render();\n\n          resolve();\n        });\n      } else {\n        resolve();\n      }\n    });\n  }\n  /**\n   * Gets the current insight with signal values.\n   */\n\n\n  getInsight() {\n    const insight = Object.assign({}, this.insight);\n    insight.signalValues = this.getSignalValues();\n    return insight;\n  }\n  /**\n   * Gets column stats from current data (filtered or all).\n   * @param column Column to get stats for.\n   */\n\n\n  getColumnStats(column) {\n    return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n  }\n  /**\n   * Gets current signal values.\n   */\n\n\n  getSignalValues() {\n    return (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n  }\n\n  finalize() {\n    if (this._dataScope) this._dataScope.finalize();\n    if (this._details) this._details.finalize();\n    if (this._tooltip) this._tooltip.finalize();\n    if (this.vegaViewGl) this.vegaViewGl.finalize();\n    if (this.presenter) this.presenter.finalize();\n    if (this.element) this.element.innerHTML = '';\n    this.colorContexts = null;\n    this.element = null;\n    this.options = null;\n    this.presenter = null;\n    this.vegaSpec = null;\n    this.vegaViewGl = null;\n    this._animator = null;\n    this._dataScope = null;\n    this._details = null;\n    this._tooltip = null;\n  }\n\n}\n/**\n * Default Viewer options.\n */\n\n\nexports.Viewer = Viewer;\nViewer.defaultViewerOptions = _defaults.defaultViewerOptions;\n},{\"./searchExpression\":\"mJgy\",\"@msrvida/vega-deck.gl\":\"eFEk\",\"./animator\":\"U1OZ\",\"./colorCubes\":\"PfBA\",\"./signals\":\"jmI2\",\"./ordinal\":\"dxn8\",\"./axisSelection\":\"oIzg\",\"./specs/clone\":\"DO07\",\"./dataScope\":\"MJ1d\",\"./defaults\":\"G0Md\",\"./details\":\"KCB5\",\"./headers\":\"nQLz\",\"./legend\":\"rI67\",\"tsx-create-element\":\"QGtg\",\"./axes\":\"A7xy\",\"./colorSchemes\":\"kNpg\",\"./tooltip\":\"bkgF\"}],\"DZif\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.version = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst version = '2.1.0';\nexports.version = version;\n},{}],\"rZaE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"colorSchemes\", {\n  enumerable: true,\n  get: function () {\n    return _colorSchemes.colorSchemes;\n  }\n});\nObject.defineProperty(exports, \"Viewer\", {\n  enumerable: true,\n  get: function () {\n    return _viewer.Viewer;\n  }\n});\nObject.defineProperty(exports, \"version\", {\n  enumerable: true,\n  get: function () {\n    return _version.version;\n  }\n});\nexports.VegaDeckGl = exports.util = exports.types = exports.searchExpression = exports.constants = exports.use = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nexports.searchExpression = searchExpression;\n\nvar types = _interopRequireWildcard(require(\"./types\"));\n\nexports.types = types;\n\nvar util = _interopRequireWildcard(require(\"./util\"));\n\nexports.util = util;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nexports.VegaDeckGl = VegaDeckGl;\n\nvar _colorSchemes = require(\"./colorSchemes\");\n\nvar _viewer = require(\"./viewer\");\n\nvar _version = require(\"./version\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst use = VegaDeckGl.use;\nexports.use = use;\n},{\"./constants\":\"Syc7\",\"./searchExpression\":\"mJgy\",\"./types\":\"JCLk\",\"./util\":\"BTLl\",\"@msrvida/vega-deck.gl\":\"eFEk\",\"./colorSchemes\":\"kNpg\",\"./viewer\":\"CdFf\",\"./version\":\"DZif\"}],\"wkaK\":[function(require,module,exports) {\nmodule.exports = compare;\n\n/*\n  primitives: value1 === value2\n  functions: value1.toString == value2.toString\n  arrays: if length, sequence and values of properties are identical\n  objects: if length, names and values of properties are identical\n  compare([[1, [2, 3]], [[1, [2, 3]]); // true\n  compare([[1, [2, 3], 4], [[1, [2, 3]]); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3}); // true\n  compare({a: 2, b: 3}, {b: 3, a: 2}); // true\n  compare({a: 2, b: 3, c: 4}, {a: 2, b: 3}); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3, c: 4}); // false\n  compare([[1, [2, {a: 4}], 4], [[1, [2, {a: 4}]]); // true\n*/\n\nfunction compare(value1, value2) {\n  if (value1 === value2) {\n    return true;\n  }\n  /* eslint-disable no-self-compare */\n  // if both values are NaNs return true\n  if ((value1 !== value1) && (value2 !== value2)) {\n    return true;\n  }\n  if ({}.toString.call(value1) != {}.toString.call(value2)) {\n    return false;\n  }\n  if (value1 !== Object(value1)) {\n    // non equal primitives\n    return false;\n  }\n  if (!value1) {\n    return false;\n  }\n  if (Array.isArray(value1)) {\n    return compareArrays(value1, value2);\n  }\n  if ({}.toString.call(value1) == '[object Object]') {\n    return compareObjects(value1, value2);\n  } else {\n    return compareNativeSubtypes(value1, value2);\n  }\n}\n\nfunction compareNativeSubtypes(value1, value2) {\n  // e.g. Function, RegExp, Date\n  return value1.toString() === value2.toString();\n}\n\nfunction compareArrays(value1, value2) {\n  var len = value1.length;\n  if (len != value2.length) {\n    return false;\n  }\n  var alike = true;\n  for (var i = 0; i < len; i++) {\n    if (!compare(value1[i], value2[i])) {\n      alike = false;\n      break;\n    }\n  }\n  return alike;\n}\n\nfunction compareObjects(value1, value2) {\n  var keys1 = Object.keys(value1).sort();\n  var keys2 = Object.keys(value2).sort();\n  var len = keys1.length;\n  if (len != keys2.length) {\n    return false;\n  }\n  for (var i = 0; i < len; i++) {\n    var key1 = keys1[i];\n    var key2 = keys2[i];\n    if (!(key1 == key2 && compare(value1[key1], value2[key2]))) {\n      return false;\n    }\n  }\n  return true;\n}\n\n},{}],\"HI4Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.deepCompare = exports.classList = void 0;\n\nvar compare = _interopRequireWildcard(require(\"just-compare\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst classList = (...args) => {\n  return args.filter(Boolean).join(' ');\n};\n\nexports.classList = classList;\nconst deepCompare = compare.default || compare;\nexports.deepCompare = deepCompare;\n},{\"just-compare\":\"wkaK\"}],\"N4VU\":[function(require,module,exports) {\n/** @license React v16.12.0\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';\n\nvar h = require(\"object-assign\"),\n    n = \"function\" === typeof Symbol && Symbol.for,\n    p = n ? Symbol.for(\"react.element\") : 60103,\n    q = n ? Symbol.for(\"react.portal\") : 60106,\n    r = n ? Symbol.for(\"react.fragment\") : 60107,\n    t = n ? Symbol.for(\"react.strict_mode\") : 60108,\n    u = n ? Symbol.for(\"react.profiler\") : 60114,\n    v = n ? Symbol.for(\"react.provider\") : 60109,\n    w = n ? Symbol.for(\"react.context\") : 60110,\n    x = n ? Symbol.for(\"react.forward_ref\") : 60112,\n    y = n ? Symbol.for(\"react.suspense\") : 60113;\n\nn && Symbol.for(\"react.suspense_list\");\nvar z = n ? Symbol.for(\"react.memo\") : 60115,\n    aa = n ? Symbol.for(\"react.lazy\") : 60116;\nn && Symbol.for(\"react.fundamental\");\nn && Symbol.for(\"react.responder\");\nn && Symbol.for(\"react.scope\");\nvar A = \"function\" === typeof Symbol && Symbol.iterator;\n\nfunction B(a) {\n  for (var b = \"https://reactjs.org/docs/error-decoder.html?invariant=\" + a, c = 1; c < arguments.length; c++) b += \"&args[]=\" + encodeURIComponent(arguments[c]);\n\n  return \"Minified React error #\" + a + \"; visit \" + b + \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\";\n}\n\nvar C = {\n  isMounted: function () {\n    return !1;\n  },\n  enqueueForceUpdate: function () {},\n  enqueueReplaceState: function () {},\n  enqueueSetState: function () {}\n},\n    D = {};\n\nfunction E(a, b, c) {\n  this.props = a;\n  this.context = b;\n  this.refs = D;\n  this.updater = c || C;\n}\n\nE.prototype.isReactComponent = {};\n\nE.prototype.setState = function (a, b) {\n  if (\"object\" !== typeof a && \"function\" !== typeof a && null != a) throw Error(B(85));\n  this.updater.enqueueSetState(this, a, b, \"setState\");\n};\n\nE.prototype.forceUpdate = function (a) {\n  this.updater.enqueueForceUpdate(this, a, \"forceUpdate\");\n};\n\nfunction F() {}\n\nF.prototype = E.prototype;\n\nfunction G(a, b, c) {\n  this.props = a;\n  this.context = b;\n  this.refs = D;\n  this.updater = c || C;\n}\n\nvar H = G.prototype = new F();\nH.constructor = G;\nh(H, E.prototype);\nH.isPureReactComponent = !0;\nvar I = {\n  current: null\n},\n    J = {\n  current: null\n},\n    K = Object.prototype.hasOwnProperty,\n    L = {\n  key: !0,\n  ref: !0,\n  __self: !0,\n  __source: !0\n};\n\nfunction M(a, b, c) {\n  var e,\n      d = {},\n      g = null,\n      l = null;\n  if (null != b) for (e in void 0 !== b.ref && (l = b.ref), void 0 !== b.key && (g = \"\" + b.key), b) K.call(b, e) && !L.hasOwnProperty(e) && (d[e] = b[e]);\n  var f = arguments.length - 2;\n  if (1 === f) d.children = c;else if (1 < f) {\n    for (var k = Array(f), m = 0; m < f; m++) k[m] = arguments[m + 2];\n\n    d.children = k;\n  }\n  if (a && a.defaultProps) for (e in f = a.defaultProps, f) void 0 === d[e] && (d[e] = f[e]);\n  return {\n    $$typeof: p,\n    type: a,\n    key: g,\n    ref: l,\n    props: d,\n    _owner: J.current\n  };\n}\n\nfunction ba(a, b) {\n  return {\n    $$typeof: p,\n    type: a.type,\n    key: b,\n    ref: a.ref,\n    props: a.props,\n    _owner: a._owner\n  };\n}\n\nfunction N(a) {\n  return \"object\" === typeof a && null !== a && a.$$typeof === p;\n}\n\nfunction escape(a) {\n  var b = {\n    \"=\": \"=0\",\n    \":\": \"=2\"\n  };\n  return \"$\" + (\"\" + a).replace(/[=:]/g, function (a) {\n    return b[a];\n  });\n}\n\nvar O = /\\/+/g,\n    P = [];\n\nfunction Q(a, b, c, e) {\n  if (P.length) {\n    var d = P.pop();\n    d.result = a;\n    d.keyPrefix = b;\n    d.func = c;\n    d.context = e;\n    d.count = 0;\n    return d;\n  }\n\n  return {\n    result: a,\n    keyPrefix: b,\n    func: c,\n    context: e,\n    count: 0\n  };\n}\n\nfunction R(a) {\n  a.result = null;\n  a.keyPrefix = null;\n  a.func = null;\n  a.context = null;\n  a.count = 0;\n  10 > P.length && P.push(a);\n}\n\nfunction S(a, b, c, e) {\n  var d = typeof a;\n  if (\"undefined\" === d || \"boolean\" === d) a = null;\n  var g = !1;\n  if (null === a) g = !0;else switch (d) {\n    case \"string\":\n    case \"number\":\n      g = !0;\n      break;\n\n    case \"object\":\n      switch (a.$$typeof) {\n        case p:\n        case q:\n          g = !0;\n      }\n\n  }\n  if (g) return c(e, a, \"\" === b ? \".\" + T(a, 0) : b), 1;\n  g = 0;\n  b = \"\" === b ? \".\" : b + \":\";\n  if (Array.isArray(a)) for (var l = 0; l < a.length; l++) {\n    d = a[l];\n    var f = b + T(d, l);\n    g += S(d, f, c, e);\n  } else if (null === a || \"object\" !== typeof a ? f = null : (f = A && a[A] || a[\"@@iterator\"], f = \"function\" === typeof f ? f : null), \"function\" === typeof f) for (a = f.call(a), l = 0; !(d = a.next()).done;) d = d.value, f = b + T(d, l++), g += S(d, f, c, e);else if (\"object\" === d) throw c = \"\" + a, Error(B(31, \"[object Object]\" === c ? \"object with keys {\" + Object.keys(a).join(\", \") + \"}\" : c, \"\"));\n  return g;\n}\n\nfunction U(a, b, c) {\n  return null == a ? 0 : S(a, \"\", b, c);\n}\n\nfunction T(a, b) {\n  return \"object\" === typeof a && null !== a && null != a.key ? escape(a.key) : b.toString(36);\n}\n\nfunction ca(a, b) {\n  a.func.call(a.context, b, a.count++);\n}\n\nfunction da(a, b, c) {\n  var e = a.result,\n      d = a.keyPrefix;\n  a = a.func.call(a.context, b, a.count++);\n  Array.isArray(a) ? V(a, e, c, function (a) {\n    return a;\n  }) : null != a && (N(a) && (a = ba(a, d + (!a.key || b && b.key === a.key ? \"\" : (\"\" + a.key).replace(O, \"$&/\") + \"/\") + c)), e.push(a));\n}\n\nfunction V(a, b, c, e, d) {\n  var g = \"\";\n  null != c && (g = (\"\" + c).replace(O, \"$&/\") + \"/\");\n  b = Q(b, g, e, d);\n  U(a, da, b);\n  R(b);\n}\n\nfunction W() {\n  var a = I.current;\n  if (null === a) throw Error(B(321));\n  return a;\n}\n\nvar X = {\n  Children: {\n    map: function (a, b, c) {\n      if (null == a) return a;\n      var e = [];\n      V(a, e, null, b, c);\n      return e;\n    },\n    forEach: function (a, b, c) {\n      if (null == a) return a;\n      b = Q(null, null, b, c);\n      U(a, ca, b);\n      R(b);\n    },\n    count: function (a) {\n      return U(a, function () {\n        return null;\n      }, null);\n    },\n    toArray: function (a) {\n      var b = [];\n      V(a, b, null, function (a) {\n        return a;\n      });\n      return b;\n    },\n    only: function (a) {\n      if (!N(a)) throw Error(B(143));\n      return a;\n    }\n  },\n  createRef: function () {\n    return {\n      current: null\n    };\n  },\n  Component: E,\n  PureComponent: G,\n  createContext: function (a, b) {\n    void 0 === b && (b = null);\n    a = {\n      $$typeof: w,\n      _calculateChangedBits: b,\n      _currentValue: a,\n      _currentValue2: a,\n      _threadCount: 0,\n      Provider: null,\n      Consumer: null\n    };\n    a.Provider = {\n      $$typeof: v,\n      _context: a\n    };\n    return a.Consumer = a;\n  },\n  forwardRef: function (a) {\n    return {\n      $$typeof: x,\n      render: a\n    };\n  },\n  lazy: function (a) {\n    return {\n      $$typeof: aa,\n      _ctor: a,\n      _status: -1,\n      _result: null\n    };\n  },\n  memo: function (a, b) {\n    return {\n      $$typeof: z,\n      type: a,\n      compare: void 0 === b ? null : b\n    };\n  },\n  useCallback: function (a, b) {\n    return W().useCallback(a, b);\n  },\n  useContext: function (a, b) {\n    return W().useContext(a, b);\n  },\n  useEffect: function (a, b) {\n    return W().useEffect(a, b);\n  },\n  useImperativeHandle: function (a, b, c) {\n    return W().useImperativeHandle(a, b, c);\n  },\n  useDebugValue: function () {},\n  useLayoutEffect: function (a, b) {\n    return W().useLayoutEffect(a, b);\n  },\n  useMemo: function (a, b) {\n    return W().useMemo(a, b);\n  },\n  useReducer: function (a, b, c) {\n    return W().useReducer(a, b, c);\n  },\n  useRef: function (a) {\n    return W().useRef(a);\n  },\n  useState: function (a) {\n    return W().useState(a);\n  },\n  Fragment: r,\n  Profiler: u,\n  StrictMode: t,\n  Suspense: y,\n  createElement: M,\n  cloneElement: function (a, b, c) {\n    if (null === a || void 0 === a) throw Error(B(267, a));\n    var e = h({}, a.props),\n        d = a.key,\n        g = a.ref,\n        l = a._owner;\n\n    if (null != b) {\n      void 0 !== b.ref && (g = b.ref, l = J.current);\n      void 0 !== b.key && (d = \"\" + b.key);\n      if (a.type && a.type.defaultProps) var f = a.type.defaultProps;\n\n      for (k in b) K.call(b, k) && !L.hasOwnProperty(k) && (e[k] = void 0 === b[k] && void 0 !== f ? f[k] : b[k]);\n    }\n\n    var k = arguments.length - 2;\n    if (1 === k) e.children = c;else if (1 < k) {\n      f = Array(k);\n\n      for (var m = 0; m < k; m++) f[m] = arguments[m + 2];\n\n      e.children = f;\n    }\n    return {\n      $$typeof: p,\n      type: a.type,\n      key: d,\n      ref: g,\n      props: e,\n      _owner: l\n    };\n  },\n  createFactory: function (a) {\n    var b = M.bind(null, a);\n    b.type = a;\n    return b;\n  },\n  isValidElement: N,\n  version: \"16.12.0\",\n  __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n    ReactCurrentDispatcher: I,\n    ReactCurrentBatchConfig: {\n      suspense: null\n    },\n    ReactCurrentOwner: J,\n    IsSomeRendererActing: {\n      current: !1\n    },\n    assign: h\n  }\n},\n    Y = {\n  default: X\n},\n    Z = Y && X || Y;\nmodule.exports = Z.default || Z;\n},{\"object-assign\":\"W2ED\"}],\"W4rj\":[function(require,module,exports) {\n'use strict';\n\nif (\"production\" === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n},{\"./cjs/react.production.min.js\":\"N4VU\"}],\"W2Ku\":[function(require,module,exports) {\n/** @license React v0.18.0\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';Object.defineProperty(exports,\"__esModule\",{value:!0});var f,g,h,k,l;\nif(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var p=null,q=null,t=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(t,0),b;}},u=Date.now();exports.unstable_now=function(){return Date.now()-u};f=function(a){null!==p?setTimeout(f,0,a):(p=a,setTimeout(t,0))};g=function(a,b){q=setTimeout(a,b)};h=function(){clearTimeout(q)};k=function(){return!1};l=exports.unstable_forceFrameRate=function(){}}else{var w=window.performance,x=window.Date,\ny=window.setTimeout,z=window.clearTimeout;if(\"undefined\"!==typeof console){var A=window.cancelAnimationFrame;\"function\"!==typeof window.requestAnimationFrame&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\");\"function\"!==typeof A&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\")}if(\"object\"===\ntypeof w&&\"function\"===typeof w.now)exports.unstable_now=function(){return w.now()};else{var B=x.now();exports.unstable_now=function(){return x.now()-B}}var C=!1,D=null,E=-1,F=5,G=0;k=function(){return exports.unstable_now()>=G};l=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported\"):F=0<a?Math.floor(1E3/a):5};var H=new MessageChannel,I=H.port2;H.port1.onmessage=\nfunction(){if(null!==D){var a=exports.unstable_now();G=a+F;try{D(!0,a)?I.postMessage(null):(C=!1,D=null)}catch(b){throw I.postMessage(null),b;}}else C=!1};f=function(a){D=a;C||(C=!0,I.postMessage(null))};g=function(a,b){E=y(function(){a(exports.unstable_now())},b)};h=function(){z(E);E=-1}}function J(a,b){var c=a.length;a.push(b);a:for(;;){var d=Math.floor((c-1)/2),e=a[d];if(void 0!==e&&0<K(e,b))a[d]=b,a[c]=e,c=d;else break a}}function L(a){a=a[0];return void 0===a?null:a}\nfunction M(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>K(n,c))void 0!==r&&0>K(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>K(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function K(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var N=[],O=[],P=1,Q=null,R=3,S=!1,T=!1,U=!1;\nfunction V(a){for(var b=L(O);null!==b;){if(null===b.callback)M(O);else if(b.startTime<=a)M(O),b.sortIndex=b.expirationTime,J(N,b);else break;b=L(O)}}function W(a){U=!1;V(a);if(!T)if(null!==L(N))T=!0,f(X);else{var b=L(O);null!==b&&g(W,b.startTime-a)}}\nfunction X(a,b){T=!1;U&&(U=!1,h());S=!0;var c=R;try{V(b);for(Q=L(N);null!==Q&&(!(Q.expirationTime>b)||a&&!k());){var d=Q.callback;if(null!==d){Q.callback=null;R=Q.priorityLevel;var e=d(Q.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?Q.callback=e:Q===L(N)&&M(N);V(b)}else M(N);Q=L(N)}if(null!==Q)var m=!0;else{var n=L(O);null!==n&&g(W,n.startTime-b);m=!1}return m}finally{Q=null,R=c,S=!1}}\nfunction Y(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var Z=l;exports.unstable_ImmediatePriority=1;exports.unstable_UserBlockingPriority=2;exports.unstable_NormalPriority=3;exports.unstable_IdlePriority=5;exports.unstable_LowPriority=4;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=R;R=a;try{return b()}finally{R=c}};\nexports.unstable_next=function(a){switch(R){case 1:case 2:case 3:var b=3;break;default:b=R}var c=R;R=b;try{return a()}finally{R=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();if(\"object\"===typeof c&&null!==c){var e=c.delay;e=\"number\"===typeof e&&0<e?d+e:d;c=\"number\"===typeof c.timeout?c.timeout:Y(a)}else c=Y(a),e=d;c=e+c;a={id:P++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,J(O,a),null===L(N)&&a===L(O)&&(U?h():U=!0,g(W,e-d))):(a.sortIndex=c,J(N,a),T||S||(T=!0,f(X)));return a};exports.unstable_cancelCallback=function(a){a.callback=null};\nexports.unstable_wrapCallback=function(a){var b=R;return function(){var c=R;R=b;try{return a.apply(this,arguments)}finally{R=c}}};exports.unstable_getCurrentPriorityLevel=function(){return R};exports.unstable_shouldYield=function(){var a=exports.unstable_now();V(a);var b=L(N);return b!==Q&&null!==Q&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<Q.expirationTime||k()};exports.unstable_requestPaint=Z;exports.unstable_continueExecution=function(){T||S||(T=!0,f(X))};\nexports.unstable_pauseExecution=function(){};exports.unstable_getFirstCallbackNode=function(){return L(N)};exports.unstable_Profiling=null;\n\n},{}],\"KTa4\":[function(require,module,exports) {\n'use strict';\n\nif (\"production\" === 'production') {\n  module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n},{\"./cjs/scheduler.production.min.js\":\"W2Ku\"}],\"t7dJ\":[function(require,module,exports) {\n/** @license React v16.12.0\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),q=require(\"scheduler\");function u(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}if(!aa)throw Error(u(227));var ba=null,ca={};\nfunction da(){if(ba)for(var a in ca){var b=ca[a],c=ba.indexOf(a);if(!(-1<c))throw Error(u(96,a));if(!ea[c]){if(!b.extractEvents)throw Error(u(97,a));ea[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(fa.hasOwnProperty(h))throw Error(u(99,h));fa[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ha(k[e],g,h);e=!0}else f.registrationName?(ha(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(u(98,d,a));}}}}\nfunction ha(a,b,c){if(ia[a])throw Error(u(100,a));ia[a]=b;ja[a]=b.eventTypes[c].dependencies}var ea=[],fa={},ia={},ja={};function ka(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var la=!1,ma=null,na=!1,oa=null,pa={onError:function(a){la=!0;ma=a}};function qa(a,b,c,d,e,f,g,h,k){la=!1;ma=null;ka.apply(pa,arguments)}\nfunction ra(a,b,c,d,e,f,g,h,k){qa.apply(this,arguments);if(la){if(la){var l=ma;la=!1;ma=null}else throw Error(u(198));na||(na=!0,oa=l)}}var sa=null,ua=null,va=null;function wa(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=va(c);ra(d,b,void 0,a);a.currentTarget=null}function xa(a,b){if(null==b)throw Error(u(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}\nfunction ya(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var za=null;function Aa(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)wa(a,b[d],c[d]);else b&&wa(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function Ba(a){null!==a&&(za=xa(za,a));a=za;za=null;if(a){ya(a,Aa);if(za)throw Error(u(95));if(na)throw a=oa,na=!1,oa=null,a;}}\nvar Ca={injectEventPluginOrder:function(a){if(ba)throw Error(u(101));ba=Array.prototype.slice.call(a);da()},injectEventPluginsByName:function(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!ca.hasOwnProperty(c)||ca[c]!==d){if(ca[c])throw Error(u(102,c));ca[c]=d;b=!0}}b&&da()}};\nfunction Da(a,b){var c=a.stateNode;if(!c)return null;var d=sa(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==typeof c)throw Error(u(231,b,typeof c));\nreturn c}var Ea=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Ea.hasOwnProperty(\"ReactCurrentDispatcher\")||(Ea.ReactCurrentDispatcher={current:null});Ea.hasOwnProperty(\"ReactCurrentBatchConfig\")||(Ea.ReactCurrentBatchConfig={suspense:null});\nvar Fa=/^(.*)[\\\\\\/]/,w=\"function\"===typeof Symbol&&Symbol.for,Ga=w?Symbol.for(\"react.element\"):60103,Ha=w?Symbol.for(\"react.portal\"):60106,Ia=w?Symbol.for(\"react.fragment\"):60107,Ja=w?Symbol.for(\"react.strict_mode\"):60108,Ka=w?Symbol.for(\"react.profiler\"):60114,La=w?Symbol.for(\"react.provider\"):60109,Ma=w?Symbol.for(\"react.context\"):60110,Na=w?Symbol.for(\"react.concurrent_mode\"):60111,Oa=w?Symbol.for(\"react.forward_ref\"):60112,Pa=w?Symbol.for(\"react.suspense\"):60113,Qa=w?Symbol.for(\"react.suspense_list\"):\n60120,Ra=w?Symbol.for(\"react.memo\"):60115,Sa=w?Symbol.for(\"react.lazy\"):60116;w&&Symbol.for(\"react.fundamental\");w&&Symbol.for(\"react.responder\");w&&Symbol.for(\"react.scope\");var Ta=\"function\"===typeof Symbol&&Symbol.iterator;function Ua(a){if(null===a||\"object\"!==typeof a)return null;a=Ta&&a[Ta]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nfunction Va(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}\nfunction Wa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case Ia:return\"Fragment\";case Ha:return\"Portal\";case Ka:return\"Profiler\";case Ja:return\"StrictMode\";case Pa:return\"Suspense\";case Qa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ma:return\"Context.Consumer\";case La:return\"Context.Provider\";case Oa:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\n\"ForwardRef\");case Ra:return Wa(a.type);case Sa:if(a=1===a._status?a._result:null)return Wa(a)}return null}function Xa(a){var b=\"\";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c=\"\";break a;default:var d=a._debugOwner,e=a._debugSource,f=Wa(a.type);c=null;d&&(c=Wa(d.type));d=f;f=\"\";e?f=\" (at \"+e.fileName.replace(Fa,\"\")+\":\"+e.lineNumber+\")\":c&&(f=\" (created by \"+c+\")\");c=\"\\n    in \"+(d||\"Unknown\")+f}b+=c;a=a.return}while(a);return b}\nvar Ya=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),Za=null,$a=null,ab=null;function bb(a){if(a=ua(a)){if(\"function\"!==typeof Za)throw Error(u(280));var b=sa(a.stateNode);Za(a.stateNode,a.type,b)}}function cb(a){$a?ab?ab.push(a):ab=[a]:$a=a}function db(){if($a){var a=$a,b=ab;ab=$a=null;bb(a);if(b)for(a=0;a<b.length;a++)bb(b[a])}}function eb(a,b){return a(b)}function fb(a,b,c,d){return a(b,c,d)}function gb(){}\nvar hb=eb,ib=!1,jb=!1;function kb(){if(null!==$a||null!==ab)gb(),db()}new Map;var lb=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,mb=Object.prototype.hasOwnProperty,nb={},ob={};\nfunction pb(a){if(mb.call(ob,a))return!0;if(mb.call(nb,a))return!1;if(lb.test(a))return ob[a]=!0;nb[a]=!0;return!1}function qb(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction rb(a,b,c,d){if(null===b||\"undefined\"===typeof b||qb(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function B(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}var D={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){D[a]=new B(a,0,!1,a,null,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];D[b]=new B(b,1,!1,a[1],null,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){D[a]=new B(a,2,!1,a.toLowerCase(),null,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){D[a]=new B(a,2,!1,a,null,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){D[a]=new B(a,3,!1,a.toLowerCase(),null,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){D[a]=new B(a,3,!0,a,null,!1)});[\"capture\",\"download\"].forEach(function(a){D[a]=new B(a,4,!1,a,null,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){D[a]=new B(a,6,!1,a,null,!1)});[\"rowSpan\",\"start\"].forEach(function(a){D[a]=new B(a,5,!1,a.toLowerCase(),null,!1)});var sb=/[\\-:]([a-z])/g;function tb(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(sb,\ntb);D[b]=new B(b,1,!1,a,null,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(sb,tb);D[b]=new B(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(sb,tb);D[b]=new B(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!1)});\nD.xlinkHref=new B(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!0)});function ub(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}\nfunction vb(a,b,c,d){var e=D.hasOwnProperty(b)?D[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(rb(b,c,e,d)&&(c=null),d||null===e?pb(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nfunction wb(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction xb(a){var b=wb(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function yb(a){a._valueTracker||(a._valueTracker=xb(a))}function zb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=wb(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Ab(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\nfunction Bb(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=ub(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Cb(a,b){b=b.checked;null!=b&&vb(a,\"checked\",b,!1)}\nfunction Eb(a,b){Cb(a,b);var c=ub(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?Fb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&Fb(a,b.type,ub(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction Gb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction Fb(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function Hb(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Ib(a,b){a=n({children:void 0},b);if(b=Hb(b.children))a.children=b;return a}\nfunction Jb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+ub(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction Kb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(u(91));return n({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Lb(a,b){var c=b.value;if(null==c){c=b.defaultValue;b=b.children;if(null!=b){if(null!=c)throw Error(u(92));if(Array.isArray(b)){if(!(1>=b.length))throw Error(u(93));b=b[0]}c=b}null==c&&(c=\"\")}a._wrapperState={initialValue:ub(c)}}\nfunction Mb(a,b){var c=ub(b.value),d=ub(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function Nb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var Ob={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction Pb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Qb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Pb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar Rb,Sb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Ob.svg||\"innerHTML\"in a)a.innerHTML=b;else{Rb=Rb||document.createElement(\"div\");Rb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=Rb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Tb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}function Ub(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Vb={animationend:Ub(\"Animation\",\"AnimationEnd\"),animationiteration:Ub(\"Animation\",\"AnimationIteration\"),animationstart:Ub(\"Animation\",\"AnimationStart\"),transitionend:Ub(\"Transition\",\"TransitionEnd\")},Wb={},Xb={};\nYa&&(Xb=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Vb.animationend.animation,delete Vb.animationiteration.animation,delete Vb.animationstart.animation),\"TransitionEvent\"in window||delete Vb.transitionend.transition);function Yb(a){if(Wb[a])return Wb[a];if(!Vb[a])return a;var b=Vb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Xb)return Wb[a]=b[c];return a}var Zb=Yb(\"animationend\"),$b=Yb(\"animationiteration\"),ac=Yb(\"animationstart\"),bc=Yb(\"transitionend\"),cc=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \");\nfunction ec(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function fc(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function gc(a){if(ec(a)!==a)throw Error(u(188));}\nfunction hc(a){var b=a.alternate;if(!b){b=ec(a);if(null===b)throw Error(u(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return gc(e),a;if(f===d)return gc(e),b;f=f.sibling}throw Error(u(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(u(189));}}if(c.alternate!==d)throw Error(u(190));}if(3!==c.tag)throw Error(u(188));return c.stateNode.current===c?a:b}function ic(a){a=hc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nvar jc,kc,lc,mc=!1,nc=[],oc=null,pc=null,qc=null,rc=new Map,sc=new Map,tc=[],uc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit\".split(\" \"),vc=\"focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture\".split(\" \");\nfunction wc(a){var b=xc(a);uc.forEach(function(c){yc(c,a,b)});vc.forEach(function(c){yc(c,a,b)})}function zc(a,b,c,d){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:d}}function Ac(a,b){switch(a){case \"focus\":case \"blur\":oc=null;break;case \"dragenter\":case \"dragleave\":pc=null;break;case \"mouseover\":case \"mouseout\":qc=null;break;case \"pointerover\":case \"pointerout\":rc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":sc.delete(b.pointerId)}}\nfunction Bc(a,b,c,d,e){if(null===a||a.nativeEvent!==e)return a=zc(b,c,d,e),null!==b&&(b=Cc(b),null!==b&&kc(b)),a;a.eventSystemFlags|=d;return a}function Dc(a,b,c,d){switch(b){case \"focus\":return oc=Bc(oc,a,b,c,d),!0;case \"dragenter\":return pc=Bc(pc,a,b,c,d),!0;case \"mouseover\":return qc=Bc(qc,a,b,c,d),!0;case \"pointerover\":var e=d.pointerId;rc.set(e,Bc(rc.get(e)||null,a,b,c,d));return!0;case \"gotpointercapture\":return e=d.pointerId,sc.set(e,Bc(sc.get(e)||null,a,b,c,d)),!0}return!1}\nfunction Ec(a){var b=Fc(a.target);if(null!==b){var c=ec(b);if(null!==c)if(b=c.tag,13===b){if(b=fc(c),null!==b){a.blockedOn=b;q.unstable_runWithPriority(a.priority,function(){lc(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Gc(a){if(null!==a.blockedOn)return!1;var b=Hc(a.topLevelType,a.eventSystemFlags,a.nativeEvent);if(null!==b){var c=Cc(b);null!==c&&kc(c);a.blockedOn=b;return!1}return!0}\nfunction Ic(a,b,c){Gc(a)&&c.delete(b)}function Jc(){for(mc=!1;0<nc.length;){var a=nc[0];if(null!==a.blockedOn){a=Cc(a.blockedOn);null!==a&&jc(a);break}var b=Hc(a.topLevelType,a.eventSystemFlags,a.nativeEvent);null!==b?a.blockedOn=b:nc.shift()}null!==oc&&Gc(oc)&&(oc=null);null!==pc&&Gc(pc)&&(pc=null);null!==qc&&Gc(qc)&&(qc=null);rc.forEach(Ic);sc.forEach(Ic)}function Kc(a,b){a.blockedOn===b&&(a.blockedOn=null,mc||(mc=!0,q.unstable_scheduleCallback(q.unstable_NormalPriority,Jc)))}\nfunction Lc(a){function b(b){return Kc(b,a)}if(0<nc.length){Kc(nc[0],a);for(var c=1;c<nc.length;c++){var d=nc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==oc&&Kc(oc,a);null!==pc&&Kc(pc,a);null!==qc&&Kc(qc,a);rc.forEach(b);sc.forEach(b);for(c=0;c<tc.length;c++)d=tc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<tc.length&&(c=tc[0],null===c.blockedOn);)Ec(c),null===c.blockedOn&&tc.shift()}\nfunction Mc(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function Nc(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function Oc(a,b,c){if(b=Da(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a)}\nfunction Pc(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Nc(b);for(b=c.length;0<b--;)Oc(c[b],\"captured\",a);for(b=0;b<c.length;b++)Oc(c[b],\"bubbled\",a)}}function Qc(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Da(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a))}function Rc(a){a&&a.dispatchConfig.registrationName&&Qc(a._targetInst,null,a)}\nfunction Sc(a){ya(a,Pc)}function Tc(){return!0}function Uc(){return!1}function E(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?Tc:Uc;this.isPropagationStopped=Uc;return this}\nn(E.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=Tc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=Tc)},persist:function(){this.isPersistent=Tc},isPersistent:Uc,destructor:function(){var a=this.constructor.Interface,\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=Uc;this._dispatchInstances=this._dispatchListeners=null}});E.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nE.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;Vc(c);return c};Vc(E);function Wc(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}\nfunction Xc(a){if(!(a instanceof this))throw Error(u(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function Vc(a){a.eventPool=[];a.getPooled=Wc;a.release=Xc}var Yc=E.extend({animationName:null,elapsedTime:null,pseudoElement:null}),Zc=E.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),$c=E.extend({view:null,detail:null}),ad=$c.extend({relatedTarget:null});\nfunction bd(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar cd={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},dd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},ed={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function gd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=ed[a])?!!b[a]:!1}function hd(){return gd}\nvar id=$c.extend({key:function(a){if(a.key){var b=cd[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=bd(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?dd[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:hd,charCode:function(a){return\"keypress\"===a.type?bd(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?bd(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),jd=0,kd=0,ld=!1,md=!1,nd=$c.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:hd,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if(\"movementX\"in a)return a.movementX;var b=jd;jd=a.screenX;return ld?\"mousemove\"===a.type?a.screenX-\nb:0:(ld=!0,0)},movementY:function(a){if(\"movementY\"in a)return a.movementY;var b=kd;kd=a.screenY;return md?\"mousemove\"===a.type?a.screenY-b:0:(md=!0,0)}}),od=nd.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),pd=nd.extend({dataTransfer:null}),qd=$c.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:hd}),rd=E.extend({propertyName:null,\nelapsedTime:null,pseudoElement:null}),sd=nd.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),td=[[\"blur\",\"blur\",0],[\"cancel\",\"cancel\",0],[\"click\",\"click\",0],[\"close\",\"close\",0],[\"contextmenu\",\"contextMenu\",0],[\"copy\",\"copy\",0],[\"cut\",\"cut\",0],[\"auxclick\",\"auxClick\",0],[\"dblclick\",\"doubleClick\",0],[\"dragend\",\"dragEnd\",\n0],[\"dragstart\",\"dragStart\",0],[\"drop\",\"drop\",0],[\"focus\",\"focus\",0],[\"input\",\"input\",0],[\"invalid\",\"invalid\",0],[\"keydown\",\"keyDown\",0],[\"keypress\",\"keyPress\",0],[\"keyup\",\"keyUp\",0],[\"mousedown\",\"mouseDown\",0],[\"mouseup\",\"mouseUp\",0],[\"paste\",\"paste\",0],[\"pause\",\"pause\",0],[\"play\",\"play\",0],[\"pointercancel\",\"pointerCancel\",0],[\"pointerdown\",\"pointerDown\",0],[\"pointerup\",\"pointerUp\",0],[\"ratechange\",\"rateChange\",0],[\"reset\",\"reset\",0],[\"seeked\",\"seeked\",0],[\"submit\",\"submit\",0],[\"touchcancel\",\"touchCancel\",\n0],[\"touchend\",\"touchEnd\",0],[\"touchstart\",\"touchStart\",0],[\"volumechange\",\"volumeChange\",0],[\"drag\",\"drag\",1],[\"dragenter\",\"dragEnter\",1],[\"dragexit\",\"dragExit\",1],[\"dragleave\",\"dragLeave\",1],[\"dragover\",\"dragOver\",1],[\"mousemove\",\"mouseMove\",1],[\"mouseout\",\"mouseOut\",1],[\"mouseover\",\"mouseOver\",1],[\"pointermove\",\"pointerMove\",1],[\"pointerout\",\"pointerOut\",1],[\"pointerover\",\"pointerOver\",1],[\"scroll\",\"scroll\",1],[\"toggle\",\"toggle\",1],[\"touchmove\",\"touchMove\",1],[\"wheel\",\"wheel\",1],[\"abort\",\"abort\",\n2],[Zb,\"animationEnd\",2],[$b,\"animationIteration\",2],[ac,\"animationStart\",2],[\"canplay\",\"canPlay\",2],[\"canplaythrough\",\"canPlayThrough\",2],[\"durationchange\",\"durationChange\",2],[\"emptied\",\"emptied\",2],[\"encrypted\",\"encrypted\",2],[\"ended\",\"ended\",2],[\"error\",\"error\",2],[\"gotpointercapture\",\"gotPointerCapture\",2],[\"load\",\"load\",2],[\"loadeddata\",\"loadedData\",2],[\"loadedmetadata\",\"loadedMetadata\",2],[\"loadstart\",\"loadStart\",2],[\"lostpointercapture\",\"lostPointerCapture\",2],[\"playing\",\"playing\",2],[\"progress\",\n\"progress\",2],[\"seeking\",\"seeking\",2],[\"stalled\",\"stalled\",2],[\"suspend\",\"suspend\",2],[\"timeupdate\",\"timeUpdate\",2],[bc,\"transitionEnd\",2],[\"waiting\",\"waiting\",2]],ud={},vd={},wd=0;for(;wd<td.length;wd++){var yd=td[wd],zd=yd[0],Ad=yd[1],Bd=yd[2],Cd=\"on\"+(Ad[0].toUpperCase()+Ad.slice(1)),Dd={phasedRegistrationNames:{bubbled:Cd,captured:Cd+\"Capture\"},dependencies:[zd],eventPriority:Bd};ud[Ad]=Dd;vd[zd]=Dd}\nvar Ed={eventTypes:ud,getEventPriority:function(a){a=vd[a];return void 0!==a?a.eventPriority:2},extractEvents:function(a,b,c,d){var e=vd[a];if(!e)return null;switch(a){case \"keypress\":if(0===bd(c))return null;case \"keydown\":case \"keyup\":a=id;break;case \"blur\":case \"focus\":a=ad;break;case \"click\":if(2===c.button)return null;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":a=nd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":a=\npd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":a=qd;break;case Zb:case $b:case ac:a=Yc;break;case bc:a=rd;break;case \"scroll\":a=$c;break;case \"wheel\":a=sd;break;case \"copy\":case \"cut\":case \"paste\":a=Zc;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":a=od;break;default:a=E}b=a.getPooled(e,b,c,d);Sc(b);return b}},Fd=q.unstable_UserBlockingPriority,\nGd=q.unstable_runWithPriority,Hd=Ed.getEventPriority,Id=10,Jd=[];\nfunction Kd(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Fc(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Mc(a.nativeEvent);d=a.topLevelType;for(var f=a.nativeEvent,g=a.eventSystemFlags,h=null,k=0;k<ea.length;k++){var l=ea[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=xa(h,l))}Ba(h)}}\nvar Ld=!0;function F(a,b){Md(b,a,!1)}function Md(a,b,c){switch(Hd(b)){case 0:var d=Nd.bind(null,b,1);break;case 1:d=Od.bind(null,b,1);break;default:d=Pd.bind(null,b,1)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function Nd(a,b,c){ib||gb();var d=Pd,e=ib;ib=!0;try{fb(d,a,b,c)}finally{(ib=e)||kb()}}function Od(a,b,c){Gd(Fd,Pd.bind(null,a,b,c))}\nfunction Qd(a,b,c,d){if(Jd.length){var e=Jd.pop();e.topLevelType=a;e.eventSystemFlags=b;e.nativeEvent=c;e.targetInst=d;a=e}else a={topLevelType:a,eventSystemFlags:b,nativeEvent:c,targetInst:d,ancestors:[]};try{if(b=Kd,c=a,jb)b(c,void 0);else{jb=!0;try{hb(b,c,void 0)}finally{jb=!1,kb()}}}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,Jd.length<Id&&Jd.push(a)}}\nfunction Pd(a,b,c){if(Ld)if(0<nc.length&&-1<uc.indexOf(a))a=zc(null,a,b,c),nc.push(a);else{var d=Hc(a,b,c);null===d?Ac(a,c):-1<uc.indexOf(a)?(a=zc(d,a,b,c),nc.push(a)):Dc(d,a,b,c)||(Ac(a,c),Qd(a,b,c,null))}}function Hc(a,b,c){var d=Mc(c);d=Fc(d);if(null!==d){var e=ec(d);if(null===e)d=null;else{var f=e.tag;if(13===f){d=fc(e);if(null!==d)return d;d=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;d=null}else e!==d&&(d=null)}}Qd(a,b,c,d);return null}\nfunction Rd(a){if(!Ya)return!1;a=\"on\"+a;var b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}var Sd=new (\"function\"===typeof WeakMap?WeakMap:Map);function xc(a){var b=Sd.get(a);void 0===b&&(b=new Set,Sd.set(a,b));return b}\nfunction yc(a,b,c){if(!c.has(a)){switch(a){case \"scroll\":Md(b,\"scroll\",!0);break;case \"focus\":case \"blur\":Md(b,\"focus\",!0);Md(b,\"blur\",!0);c.add(\"blur\");c.add(\"focus\");break;case \"cancel\":case \"close\":Rd(a)&&Md(b,a,!0);break;case \"invalid\":case \"submit\":case \"reset\":break;default:-1===cc.indexOf(a)&&F(a,b)}c.add(a)}}\nvar Td={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ud=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Td).forEach(function(a){Ud.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Td[b]=Td[a]})});function Vd(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||Td.hasOwnProperty(a)&&Td[a]?(\"\"+b).trim():b+\"px\"}\nfunction Wd(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=Vd(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var Xd=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction Yd(a,b){if(b){if(Xd[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(u(137,a,\"\"));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(u(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw Error(u(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(u(62,\"\"));}}\nfunction Zd(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}function $d(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=xc(a);b=ja[b];for(var d=0;d<b.length;d++)yc(b[d],a,c)}function ae(){}\nfunction be(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function ce(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function de(a,b){var c=ce(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=ce(c)}}\nfunction ee(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?ee(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function fe(){for(var a=window,b=be();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=be(a.document)}return b}\nfunction ge(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}var he=\"$\",ie=\"/$\",je=\"$?\",ke=\"$!\",le=null,me=null;function ne(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nfunction oe(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var pe=\"function\"===typeof setTimeout?setTimeout:void 0,qe=\"function\"===typeof clearTimeout?clearTimeout:void 0;function re(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}\nfunction se(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===he||c===ke||c===je){if(0===b)return a;b--}else c===ie&&b++}a=a.previousSibling}return null}var te=Math.random().toString(36).slice(2),ue=\"__reactInternalInstance$\"+te,ve=\"__reactEventHandlers$\"+te,we=\"__reactContainere$\"+te;\nfunction Fc(a){var b=a[ue];if(b)return b;for(var c=a.parentNode;c;){if(b=c[we]||c[ue]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=se(a);null!==a;){if(c=a[ue])return c;a=se(a)}return b}a=c;c=a.parentNode}return null}function Cc(a){a=a[ue]||a[we];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function xe(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(u(33));}function ye(a){return a[ve]||null}var ze=null,Ae=null,Be=null;\nfunction Ce(){if(Be)return Be;var a,b=Ae,c=b.length,d,e=\"value\"in ze?ze.value:ze.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return Be=e.slice(a,1<d?1-d:void 0)}var De=E.extend({data:null}),Ee=E.extend({data:null}),Fe=[9,13,27,32],Ge=Ya&&\"CompositionEvent\"in window,He=null;Ya&&\"documentMode\"in document&&(He=document.documentMode);\nvar Ie=Ya&&\"TextEvent\"in window&&!He,Je=Ya&&(!Ge||He&&8<He&&11>=He),Ke=String.fromCharCode(32),Le={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},Me=!1;\nfunction Ne(a,b){switch(a){case \"keyup\":return-1!==Fe.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function Oe(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var Pe=!1;function Qe(a,b){switch(a){case \"compositionend\":return Oe(b);case \"keypress\":if(32!==b.which)return null;Me=!0;return Ke;case \"textInput\":return a=b.data,a===Ke&&Me?null:a;default:return null}}\nfunction Re(a,b){if(Pe)return\"compositionend\"===a||!Ge&&Ne(a,b)?(a=Ce(),Be=Ae=ze=null,Pe=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return Je&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar Se={eventTypes:Le,extractEvents:function(a,b,c,d){var e;if(Ge)b:{switch(a){case \"compositionstart\":var f=Le.compositionStart;break b;case \"compositionend\":f=Le.compositionEnd;break b;case \"compositionupdate\":f=Le.compositionUpdate;break b}f=void 0}else Pe?Ne(a,c)&&(f=Le.compositionEnd):\"keydown\"===a&&229===c.keyCode&&(f=Le.compositionStart);f?(Je&&\"ko\"!==c.locale&&(Pe||f!==Le.compositionStart?f===Le.compositionEnd&&Pe&&(e=Ce()):(ze=d,Ae=\"value\"in ze?ze.value:ze.textContent,Pe=!0)),f=De.getPooled(f,\nb,c,d),e?f.data=e:(e=Oe(c),null!==e&&(f.data=e)),Sc(f),e=f):e=null;(a=Ie?Qe(a,c):Re(a,c))?(b=Ee.getPooled(Le.beforeInput,b,c,d),b.data=a,Sc(b)):b=null;return null===e?b:null===b?e:[e,b]}},Te={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Ue(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!Te[a.type]:\"textarea\"===b?!0:!1}\nvar Ve={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"blur change click focus input keydown keyup selectionchange\".split(\" \")}};function We(a,b,c){a=E.getPooled(Ve.change,a,b,c);a.type=\"change\";cb(c);Sc(a);return a}var Xe=null,Ye=null;function Ze(a){Ba(a)}function $e(a){var b=xe(a);if(zb(b))return a}function af(a,b){if(\"change\"===a)return b}var bf=!1;Ya&&(bf=Rd(\"input\")&&(!document.documentMode||9<document.documentMode));\nfunction cf(){Xe&&(Xe.detachEvent(\"onpropertychange\",df),Ye=Xe=null)}function df(a){if(\"value\"===a.propertyName&&$e(Ye))if(a=We(Ye,a,Mc(a)),ib)Ba(a);else{ib=!0;try{eb(Ze,a)}finally{ib=!1,kb()}}}function ef(a,b,c){\"focus\"===a?(cf(),Xe=b,Ye=c,Xe.attachEvent(\"onpropertychange\",df)):\"blur\"===a&&cf()}function ff(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return $e(Ye)}function gf(a,b){if(\"click\"===a)return $e(b)}function hf(a,b){if(\"input\"===a||\"change\"===a)return $e(b)}\nvar jf={eventTypes:Ve,_isInputEventSupported:bf,extractEvents:function(a,b,c,d){var e=b?xe(b):window,f=e.nodeName&&e.nodeName.toLowerCase();if(\"select\"===f||\"input\"===f&&\"file\"===e.type)var g=af;else if(Ue(e))if(bf)g=hf;else{g=ff;var h=ef}else(f=e.nodeName)&&\"input\"===f.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(g=gf);if(g&&(g=g(a,b)))return We(g,c,d);h&&h(a,e,b);\"blur\"===a&&(a=e._wrapperState)&&a.controlled&&\"number\"===e.type&&Fb(e,\"number\",e.value)}},kf={mouseEnter:{registrationName:\"onMouseEnter\",\ndependencies:[\"mouseout\",\"mouseover\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"mouseout\",\"mouseover\"]},pointerEnter:{registrationName:\"onPointerEnter\",dependencies:[\"pointerout\",\"pointerover\"]},pointerLeave:{registrationName:\"onPointerLeave\",dependencies:[\"pointerout\",\"pointerover\"]}},lf,mf={eventTypes:kf,extractEvents:function(a,b,c,d,e){var f=\"mouseover\"===a||\"pointerover\"===a,g=\"mouseout\"===a||\"pointerout\"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;\ne=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Fc(b):null,null!==b&&(f=ec(b),b!==f||5!==b.tag&&6!==b.tag))b=null}else g=null;if(g===b)return null;if(\"mouseout\"===a||\"mouseover\"===a){var h=nd;var k=kf.mouseLeave;var l=kf.mouseEnter;var m=\"mouse\"}else if(\"pointerout\"===a||\"pointerover\"===a)h=od,k=kf.pointerLeave,l=kf.pointerEnter,m=\"pointer\";a=null==g?e:xe(g);e=null==b?e:xe(b);k=h.getPooled(k,g,c,d);k.type=m+\"leave\";k.target=\na;k.relatedTarget=e;d=h.getPooled(l,b,c,d);d.type=m+\"enter\";d.target=e;d.relatedTarget=a;h=g;m=b;if(h&&m)a:{l=h;a=m;g=0;for(b=l;b;b=Nc(b))g++;b=0;for(e=a;e;e=Nc(e))b++;for(;0<g-b;)l=Nc(l),g--;for(;0<b-g;)a=Nc(a),b--;for(;g--;){if(l===a||l===a.alternate)break a;l=Nc(l);a=Nc(a)}l=null}else l=null;a=l;for(l=[];h&&h!==a;){g=h.alternate;if(null!==g&&g===a)break;l.push(h);h=Nc(h)}for(h=[];m&&m!==a;){g=m.alternate;if(null!==g&&g===a)break;h.push(m);m=Nc(m)}for(m=0;m<l.length;m++)Qc(l[m],\"bubbled\",k);for(m=\nh.length;0<m--;)Qc(h[m],\"captured\",d);if(c===lf)return lf=null,[k];lf=c;return[k,d]}};function nf(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var of=\"function\"===typeof Object.is?Object.is:nf,pf=Object.prototype.hasOwnProperty;function qf(a,b){if(of(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!pf.call(b,c[d])||!of(a[c[d]],b[c[d]]))return!1;return!0}\nvar rf=Ya&&\"documentMode\"in document&&11>=document.documentMode,sf={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},tf=null,uf=null,vf=null,wf=!1;\nfunction xf(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(wf||null==tf||tf!==be(c))return null;c=tf;\"selectionStart\"in c&&ge(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return vf&&qf(vf,c)?null:(vf=c,a=E.getPooled(sf.select,uf,a,b),a.type=\"select\",a.target=tf,Sc(a),a)}\nvar yf={eventTypes:sf,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=xc(e);f=ja.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?xe(b):window;switch(a){case \"focus\":if(Ue(e)||\"true\"===e.contentEditable)tf=e,uf=b,vf=null;break;case \"blur\":vf=uf=tf=null;break;case \"mousedown\":wf=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":return wf=!1,xf(c,d);case \"selectionchange\":if(rf)break;\ncase \"keydown\":case \"keyup\":return xf(c,d)}return null}};Ca.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));var zf=Cc;sa=ye;ua=zf;va=xe;Ca.injectEventPluginsByName({SimpleEventPlugin:Ed,EnterLeaveEventPlugin:mf,ChangeEventPlugin:jf,SelectEventPlugin:yf,BeforeInputEventPlugin:Se});new Set;var Af=[],Bf=-1;function G(a){0>Bf||(a.current=Af[Bf],Af[Bf]=null,Bf--)}\nfunction I(a,b){Bf++;Af[Bf]=a.current;a.current=b}var Cf={},J={current:Cf},K={current:!1},Df=Cf;function Ef(a,b){var c=a.type.contextTypes;if(!c)return Cf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function L(a){a=a.childContextTypes;return null!==a&&void 0!==a}\nfunction Ff(a){G(K,a);G(J,a)}function Gf(a){G(K,a);G(J,a)}function Hf(a,b,c){if(J.current!==Cf)throw Error(u(168));I(J,b,a);I(K,c,a)}function If(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(u(108,Wa(b)||\"Unknown\",e));return n({},c,{},d)}function Jf(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||Cf;Df=J.current;I(J,b,a);I(K,K.current,a);return!0}\nfunction Kf(a,b,c){var d=a.stateNode;if(!d)throw Error(u(169));c?(b=If(a,b,Df),d.__reactInternalMemoizedMergedChildContext=b,G(K,a),G(J,a),I(J,b,a)):G(K,a);I(K,c,a)}\nvar Lf=q.unstable_runWithPriority,Mf=q.unstable_scheduleCallback,Nf=q.unstable_cancelCallback,Of=q.unstable_shouldYield,Pf=q.unstable_requestPaint,Qf=q.unstable_now,Rf=q.unstable_getCurrentPriorityLevel,Sf=q.unstable_ImmediatePriority,Tf=q.unstable_UserBlockingPriority,Uf=q.unstable_NormalPriority,Vf=q.unstable_LowPriority,Wf=q.unstable_IdlePriority,Xf={},Yf=void 0!==Pf?Pf:function(){},Zf=null,$f=null,ag=!1,bg=Qf(),cg=1E4>bg?Qf:function(){return Qf()-bg};\nfunction dg(){switch(Rf()){case Sf:return 99;case Tf:return 98;case Uf:return 97;case Vf:return 96;case Wf:return 95;default:throw Error(u(332));}}function eg(a){switch(a){case 99:return Sf;case 98:return Tf;case 97:return Uf;case 96:return Vf;case 95:return Wf;default:throw Error(u(332));}}function fg(a,b){a=eg(a);return Lf(a,b)}function gg(a,b,c){a=eg(a);return Mf(a,b,c)}function hg(a){null===Zf?(Zf=[a],$f=Mf(Sf,ig)):Zf.push(a);return Xf}function jg(){if(null!==$f){var a=$f;$f=null;Nf(a)}ig()}\nfunction ig(){if(!ag&&null!==Zf){ag=!0;var a=0;try{var b=Zf;fg(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});Zf=null}catch(c){throw null!==Zf&&(Zf=Zf.slice(a+1)),Mf(Sf,jg),c;}finally{ag=!1}}}var kg=3;function lg(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function mg(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}var ng={current:null},og=null,pg=null,qg=null;function rg(){qg=pg=og=null}\nfunction sg(a,b){var c=a.type._context;I(ng,c._currentValue,a);c._currentValue=b}function tg(a){var b=ng.current;G(ng,a);a.type._context._currentValue=b}function ug(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}\nfunction vg(a,b){og=a;qg=pg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(wg=!0),a.firstContext=null)}function xg(a,b){if(qg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)qg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===pg){if(null===og)throw Error(u(308));pg=b;og.dependencies={expirationTime:0,firstContext:b,responders:null}}else pg=pg.next=b}return a._currentValue}var yg=!1;\nfunction zg(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Ag(a){return{baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}\nfunction Bg(a,b){return{expirationTime:a,suspenseConfig:b,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function Cg(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}\nfunction Dg(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=zg(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=zg(a.memoizedState),e=c.updateQueue=zg(c.memoizedState)):d=a.updateQueue=Ag(e):null===e&&(e=c.updateQueue=Ag(d));null===e||d===e?Cg(d,b):null===d.lastUpdate||null===e.lastUpdate?(Cg(d,b),Cg(e,b)):(Cg(d,b),e.lastUpdate=b)}\nfunction Eg(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=zg(a.memoizedState):Fg(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b)}function Fg(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=Ag(b));return b}\nfunction Gg(a,b,c,d,e,f){switch(c.tag){case 1:return a=c.payload,\"function\"===typeof a?a.call(f,d,e):a;case 3:a.effectTag=a.effectTag&-4097|64;case 0:a=c.payload;e=\"function\"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return n({},d,e);case 2:yg=!0}return d}\nfunction Hg(a,b,c,d,e){yg=!1;b=Fg(a,b);for(var f=b.baseState,g=null,h=0,k=b.firstUpdate,l=f;null!==k;){var m=k.expirationTime;m<e?(null===g&&(g=k,f=l),h<m&&(h=m)):(Ig(m,k.suspenseConfig),l=Gg(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastEffect?b.firstEffect=b.lastEffect=k:(b.lastEffect.nextEffect=k,b.lastEffect=k)));k=k.next}m=null;for(k=b.firstCapturedUpdate;null!==k;){var C=k.expirationTime;C<e?(null===m&&(m=k,null===g&&(f=l)),h<C&&(h=C)):(l=Gg(a,b,k,l,c,d),null!==\nk.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastCapturedEffect?b.firstCapturedEffect=b.lastCapturedEffect=k:(b.lastCapturedEffect.nextEffect=k,b.lastCapturedEffect=k)));k=k.next}null===g&&(b.lastUpdate=null);null===m?b.lastCapturedUpdate=null:a.effectTag|=32;null===g&&null===m&&(f=l);b.baseState=f;b.firstUpdate=g;b.firstCapturedUpdate=m;Jg(h);a.expirationTime=h;a.memoizedState=l}\nfunction Kg(a,b,c){null!==b.firstCapturedUpdate&&(null!==b.lastUpdate&&(b.lastUpdate.next=b.firstCapturedUpdate,b.lastUpdate=b.lastCapturedUpdate),b.firstCapturedUpdate=b.lastCapturedUpdate=null);Lg(b.firstEffect,c);b.firstEffect=b.lastEffect=null;Lg(b.firstCapturedEffect,c);b.firstCapturedEffect=b.lastCapturedEffect=null}function Lg(a,b){for(;null!==a;){var c=a.callback;if(null!==c){a.callback=null;var d=b;if(\"function\"!==typeof c)throw Error(u(191,c));c.call(d)}a=a.nextEffect}}\nvar Mg=Ea.ReactCurrentBatchConfig,Ng=(new aa.Component).refs;function Og(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}\nvar Sg={isMounted:function(a){return(a=a._reactInternalFiber)?ec(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Pg(),e=Mg.suspense;d=Qg(d,a,e);e=Bg(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Dg(a,e);Rg(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Pg(),e=Mg.suspense;d=Qg(d,a,e);e=Bg(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Dg(a,e);Rg(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Pg(),d=Mg.suspense;\nc=Qg(c,a,d);d=Bg(c,d);d.tag=2;void 0!==b&&null!==b&&(d.callback=b);Dg(a,d);Rg(a,c)}};function Tg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!qf(c,d)||!qf(e,f):!0}\nfunction Ug(a,b,c){var d=!1,e=Cf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=xg(f):(e=L(b)?Df:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Ef(a,e):Cf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Sg;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Vg(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Sg.enqueueReplaceState(b,b.state,null)}\nfunction Wg(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Ng;var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=xg(f):(f=L(b)?Df:J.current,e.context=Ef(a,f));f=a.updateQueue;null!==f&&(Hg(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Og(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==\ntypeof e.componentWillMount||(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Sg.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(Hg(a,f,c,e,d),e.state=a.memoizedState));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var Xg=Array.isArray;\nfunction Yg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(u(309));var d=c.stateNode}if(!d)throw Error(u(147,a));var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Ng&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw Error(u(284));if(!c._owner)throw Error(u(290,a));}return a}\nfunction Zg(a,b){if(\"textarea\"!==a.type)throw Error(u(31,\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\"));}\nfunction $g(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=ah(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\n2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=bh(c,a.mode,d),b.return=a,b;b=e(b,c,d);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props,d),d.ref=Yg(a,b,c),d.return=a,d;d=ch(c.type,c.key,c.props,null,a.mode,d);d.ref=Yg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==\nc.implementation)return b=dh(c,a.mode,d),b.return=a,b;b=e(b,c.children||[],d);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=eh(c,a.mode,d,f),b.return=a,b;b=e(b,c,d);b.return=a;return b}function C(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=bh(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case Ga:return c=ch(b.type,b.key,b.props,null,a.mode,c),c.ref=Yg(a,null,b),c.return=a,c;case Ha:return b=dh(b,a.mode,c),b.return=a,b}if(Xg(b)||\nUa(b))return b=eh(b,a.mode,c,null),b.return=a,b;Zg(a,b)}return null}function y(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case Ga:return c.key===e?c.type===Ia?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case Ha:return c.key===e?l(a,b,c,d):null}if(Xg(c)||Ua(c))return null!==e?null:m(a,b,c,d,null);Zg(a,c)}return null}function H(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=\na.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case Ga:return a=a.get(null===d.key?c:d.key)||null,d.type===Ia?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case Ha:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Xg(d)||Ua(d))return a=a.get(c)||null,m(b,a,d,e,null);Zg(b,d)}return null}function z(e,g,h,k){for(var l=null,m=null,r=g,x=g=0,A=null;null!==r&&x<h.length;x++){r.index>x?(A=r,r=null):A=r.sibling;var p=y(e,r,h[x],k);if(null===p){null===r&&(r=A);break}a&&\nr&&null===p.alternate&&b(e,r);g=f(p,g,x);null===m?l=p:m.sibling=p;m=p;r=A}if(x===h.length)return c(e,r),l;if(null===r){for(;x<h.length;x++)r=C(e,h[x],k),null!==r&&(g=f(r,g,x),null===m?l=r:m.sibling=r,m=r);return l}for(r=d(e,r);x<h.length;x++)A=H(r,e,x,h[x],k),null!==A&&(a&&null!==A.alternate&&r.delete(null===A.key?x:A.key),g=f(A,g,x),null===m?l=A:m.sibling=A,m=A);a&&r.forEach(function(a){return b(e,a)});return l}function ta(e,g,h,k){var l=Ua(h);if(\"function\"!==typeof l)throw Error(u(150));h=l.call(h);\nif(null==h)throw Error(u(151));for(var m=l=null,r=g,x=g=0,A=null,p=h.next();null!==r&&!p.done;x++,p=h.next()){r.index>x?(A=r,r=null):A=r.sibling;var z=y(e,r,p.value,k);if(null===z){null===r&&(r=A);break}a&&r&&null===z.alternate&&b(e,r);g=f(z,g,x);null===m?l=z:m.sibling=z;m=z;r=A}if(p.done)return c(e,r),l;if(null===r){for(;!p.done;x++,p=h.next())p=C(e,p.value,k),null!==p&&(g=f(p,g,x),null===m?l=p:m.sibling=p,m=p);return l}for(r=d(e,r);!p.done;x++,p=h.next())p=H(r,e,x,p.value,k),null!==p&&(a&&null!==\np.alternate&&r.delete(null===p.key?x:p.key),g=f(p,g,x),null===m?l=p:m.sibling=p,m=p);a&&r.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===Ia&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Ga:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(7===k.tag?f.type===Ia:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===Ia?f.props.children:f.props,h);d.ref=Yg(a,k,f);d.return=a;a=d;break a}else{c(a,\nk);break}else b(a,k);k=k.sibling}f.type===Ia?(d=eh(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=ch(f.type,f.key,f.props,null,a.mode,h),h.ref=Yg(a,d,f),h.return=a,a=h)}return g(a);case Ha:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=dh(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===\ntypeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=a,a=d):(c(a,d),d=bh(f,a.mode,h),d.return=a,a=d),g(a);if(Xg(f))return z(a,d,f,h);if(Ua(f))return ta(a,d,f,h);l&&Zg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,Error(u(152,a.displayName||a.name||\"Component\"));}return c(a,d)}}var fh=$g(!0),gh=$g(!1),hh={},ih={current:hh},jh={current:hh},kh={current:hh};function lh(a){if(a===hh)throw Error(u(174));return a}\nfunction mh(a,b){I(kh,b,a);I(jh,a,a);I(ih,hh,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Qb(null,\"\");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=Qb(b,c)}G(ih,a);I(ih,b,a)}function nh(a){G(ih,a);G(jh,a);G(kh,a)}function oh(a){lh(kh.current);var b=lh(ih.current);var c=Qb(b,a.type);b!==c&&(I(jh,a,a),I(ih,c,a))}function ph(a){jh.current===a&&(G(ih,a),G(jh,a))}var M={current:0};\nfunction qh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===je||c.data===ke))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function rh(a,b){return{responder:a,props:b}}\nvar sh=Ea.ReactCurrentDispatcher,N=Ea.ReactCurrentBatchConfig,th=0,uh=null,O=null,vh=null,wh=null,P=null,xh=null,yh=0,zh=null,Ah=0,Bh=!1,Ch=null,Gh=0;function Q(){throw Error(u(321));}function Hh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!of(a[c],b[c]))return!1;return!0}\nfunction Ih(a,b,c,d,e,f){th=f;uh=b;vh=null!==a?a.memoizedState:null;sh.current=null===vh?Jh:Kh;b=c(d,e);if(Bh){do Bh=!1,Gh+=1,vh=null!==a?a.memoizedState:null,xh=wh,zh=P=O=null,sh.current=Kh,b=c(d,e);while(Bh);Ch=null;Gh=0}sh.current=Lh;a=uh;a.memoizedState=wh;a.expirationTime=yh;a.updateQueue=zh;a.effectTag|=Ah;a=null!==O&&null!==O.next;th=0;xh=P=wh=vh=O=uh=null;yh=0;zh=null;Ah=0;if(a)throw Error(u(300));return b}\nfunction Mh(){sh.current=Lh;th=0;xh=P=wh=vh=O=uh=null;yh=0;zh=null;Ah=0;Bh=!1;Ch=null;Gh=0}function Nh(){var a={memoizedState:null,baseState:null,queue:null,baseUpdate:null,next:null};null===P?wh=P=a:P=P.next=a;return P}function Oh(){if(null!==xh)P=xh,xh=P.next,O=vh,vh=null!==O?O.next:null;else{if(null===vh)throw Error(u(310));O=vh;var a={memoizedState:O.memoizedState,baseState:O.baseState,queue:O.queue,baseUpdate:O.baseUpdate,next:null};P=null===P?wh=a:P.next=a;vh=O.next}return P}\nfunction Ph(a,b){return\"function\"===typeof b?b(a):b}\nfunction Qh(a){var b=Oh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;if(0<Gh){var d=c.dispatch;if(null!==Ch){var e=Ch.get(c);if(void 0!==e){Ch.delete(c);var f=b.memoizedState;do f=a(f,e.action),e=e.next;while(null!==e);of(f,b.memoizedState)||(wg=!0);b.memoizedState=f;b.baseUpdate===c.last&&(b.baseState=f);c.lastRenderedState=f;return[f,d]}}return[b.memoizedState,d]}d=c.last;var g=b.baseUpdate;f=b.baseState;null!==g?(null!==d&&(d.next=null),d=g.next):d=null!==d?d.next:null;if(null!==\nd){var h=e=null,k=d,l=!1;do{var m=k.expirationTime;m<th?(l||(l=!0,h=g,e=f),m>yh&&(yh=m,Jg(yh))):(Ig(m,k.suspenseConfig),f=k.eagerReducer===a?k.eagerState:a(f,k.action));g=k;k=k.next}while(null!==k&&k!==d);l||(h=g,e=f);of(f,b.memoizedState)||(wg=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.lastRenderedState=f}return[b.memoizedState,c.dispatch]}\nfunction Rh(a){var b=Nh();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,dispatch:null,lastRenderedReducer:Ph,lastRenderedState:a};a=a.dispatch=Sh.bind(null,uh,a);return[b.memoizedState,a]}function Th(a){return Qh(Ph,a)}function Uh(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===zh?(zh={lastEffect:null},zh.lastEffect=a.next=a):(b=zh.lastEffect,null===b?zh.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,zh.lastEffect=a));return a}\nfunction Vh(a,b,c,d){var e=Nh();Ah|=a;e.memoizedState=Uh(b,c,void 0,void 0===d?null:d)}function Wh(a,b,c,d){var e=Oh();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&Hh(d,g.deps)){Uh(0,c,f,d);return}}Ah|=a;e.memoizedState=Uh(b,c,f,d)}function Xh(a,b){return Vh(516,192,a,b)}function Yh(a,b){return Wh(516,192,a,b)}\nfunction Zh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function $h(){}function ai(a,b){Nh().memoizedState=[a,void 0===b?null:b];return a}function bi(a,b){var c=Oh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Hh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction Sh(a,b,c){if(!(25>Gh))throw Error(u(301));var d=a.alternate;if(a===uh||null!==d&&d===uh)if(Bh=!0,a={expirationTime:th,suspenseConfig:null,action:c,eagerReducer:null,eagerState:null,next:null},null===Ch&&(Ch=new Map),c=Ch.get(b),void 0===c)Ch.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a}else{var e=Pg(),f=Mg.suspense;e=Qg(e,a,f);f={expirationTime:e,suspenseConfig:f,action:c,eagerReducer:null,eagerState:null,next:null};var g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&\n(f.next=h);g.next=f}b.last=f;if(0===a.expirationTime&&(null===d||0===d.expirationTime)&&(d=b.lastRenderedReducer,null!==d))try{var k=b.lastRenderedState,l=d(k,c);f.eagerReducer=d;f.eagerState=l;if(of(l,k))return}catch(m){}finally{}Rg(a,e)}}\nvar Lh={readContext:xg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useResponder:Q,useDeferredValue:Q,useTransition:Q},Jh={readContext:xg,useCallback:ai,useContext:xg,useEffect:Xh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Vh(4,36,Zh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Vh(4,36,a,b)},useMemo:function(a,b){var c=Nh();b=void 0===b?null:b;a=a();c.memoizedState=\n[a,b];return a},useReducer:function(a,b,c){var d=Nh();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=Sh.bind(null,uh,a);return[d.memoizedState,a]},useRef:function(a){var b=Nh();a={current:a};return b.memoizedState=a},useState:Rh,useDebugValue:$h,useResponder:rh,useDeferredValue:function(a,b){var c=Rh(a),d=c[0],e=c[1];Xh(function(){q.unstable_next(function(){var c=N.suspense;N.suspense=void 0===b?null:b;try{e(a)}finally{N.suspense=\nc}})},[a,b]);return d},useTransition:function(a){var b=Rh(!1),c=b[0],d=b[1];return[ai(function(b){d(!0);q.unstable_next(function(){var c=N.suspense;N.suspense=void 0===a?null:a;try{d(!1),b()}finally{N.suspense=c}})},[a,c]),c]}},Kh={readContext:xg,useCallback:bi,useContext:xg,useEffect:Yh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Wh(4,36,Zh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Wh(4,36,a,b)},useMemo:function(a,b){var c=Oh();b=void 0===b?\nnull:b;var d=c.memoizedState;if(null!==d&&null!==b&&Hh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:Qh,useRef:function(){return Oh().memoizedState},useState:Th,useDebugValue:$h,useResponder:rh,useDeferredValue:function(a,b){var c=Th(a),d=c[0],e=c[1];Yh(function(){q.unstable_next(function(){var c=N.suspense;N.suspense=void 0===b?null:b;try{e(a)}finally{N.suspense=c}})},[a,b]);return d},useTransition:function(a){var b=Th(!1),c=b[0],d=b[1];return[bi(function(b){d(!0);q.unstable_next(function(){var c=\nN.suspense;N.suspense=void 0===a?null:a;try{d(!1),b()}finally{N.suspense=c}})},[a,c]),c]}},ci=null,di=null,ei=!1;function fi(a,b){var c=gi(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}\nfunction hi(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction ii(a){if(ei){var b=di;if(b){var c=b;if(!hi(a,b)){b=re(c.nextSibling);if(!b||!hi(a,b)){a.effectTag=a.effectTag&-1025|2;ei=!1;ci=a;return}fi(ci,c)}ci=a;di=re(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,ei=!1,ci=a}}function ji(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;ci=a}\nfunction ki(a){if(a!==ci)return!1;if(!ei)return ji(a),ei=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!oe(b,a.memoizedProps))for(b=di;b;)fi(a,b),b=re(b.nextSibling);ji(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(u(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===ie){if(0===b){di=re(a.nextSibling);break a}b--}else c!==he&&c!==ke&&c!==je||b++}a=a.nextSibling}di=null}}else di=ci?re(a.stateNode.nextSibling):null;return!0}\nfunction li(){di=ci=null;ei=!1}var mi=Ea.ReactCurrentOwner,wg=!1;function R(a,b,c,d){b.child=null===a?gh(b,null,c,d):fh(b,a.child,c,d)}function ni(a,b,c,d,e){c=c.render;var f=b.ref;vg(b,e);d=Ih(a,b,c,d,f,e);if(null!==a&&!wg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),oi(a,b,e);b.effectTag|=1;R(a,b,d,e);return b.child}\nfunction pi(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!qi(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ri(a,b,g,d,e,f);a=ch(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:qf,c(e,d)&&a.ref===b.ref))return oi(a,b,f);b.effectTag|=1;a=ah(g,d,f);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ri(a,b,c,d,e,f){return null!==a&&qf(a.memoizedProps,d)&&a.ref===b.ref&&(wg=!1,e<f)?oi(a,b,f):si(a,b,c,d,f)}function ti(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function si(a,b,c,d,e){var f=L(c)?Df:J.current;f=Ef(b,f);vg(b,e);c=Ih(a,b,c,d,f,e);if(null!==a&&!wg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),oi(a,b,e);b.effectTag|=1;R(a,b,c,e);return b.child}\nfunction ui(a,b,c,d,e){if(L(c)){var f=!0;Jf(b)}else f=!1;vg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Ug(b,c,d,e),Wg(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=xg(l):(l=L(c)?Df:J.current,l=Ef(b,l));var m=c.getDerivedStateFromProps,C=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;C||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Vg(b,g,d,l);yg=!1;var y=b.memoizedState;k=g.state=y;var H=b.updateQueue;null!==H&&(Hg(b,H,d,g,e),k=b.memoizedState);h!==d||y!==k||K.current||yg?(\"function\"===typeof m&&(Og(b,c,m,d),k=b.memoizedState),(h=yg||Tg(b,c,h,d,y,k,l))?(C||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&\ng.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.effectTag|=4)):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,h=b.memoizedProps,g.props=b.type===b.elementType?h:mg(b.type,h),k=g.context,l=c.contextType,\"object\"===typeof l&&null!==l?l=xg(l):(l=L(c)?Df:J.current,l=Ef(b,l)),m=c.getDerivedStateFromProps,(C=\n\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Vg(b,g,d,l),yg=!1,k=b.memoizedState,y=g.state=k,H=b.updateQueue,null!==H&&(Hg(b,H,d,g,e),y=b.memoizedState),h!==d||k!==y||K.current||yg?(\"function\"===typeof m&&(Og(b,c,m,d),y=b.memoizedState),(m=yg||Tg(b,c,h,d,k,y,l))?(C||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||\n(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,y,l),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,y,l)),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=\nd,b.memoizedState=y),g.props=d,g.state=y,g.context=l,d=m):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return vi(a,b,c,d,f,e)}\nfunction vi(a,b,c,d,e,f){ti(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Kf(b,c,!1),oi(a,b,f);d=b.stateNode;mi.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=fh(b,a.child,null,f),b.child=fh(b,null,h,f)):R(a,b,h,f);b.memoizedState=d.state;e&&Kf(b,c,!0);return b.child}function wi(a){var b=a.stateNode;b.pendingContext?Hf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Hf(a,b.context,!1);mh(a,b.containerInfo)}\nvar xi={dehydrated:null,retryTime:0};\nfunction yi(a,b,c){var d=b.mode,e=b.pendingProps,f=M.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);I(M,f&1,b);if(null===a){void 0!==e.fallback&&ii(b);if(g){g=e.fallback;e=eh(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=eh(g,d,c,null);c.return=\nb;e.sibling=c;b.memoizedState=xi;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=gh(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=ah(a,a.pendingProps,0);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=ah(d,e,d.expirationTime);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=xi;b.child=c;return d}c=fh(b,a.child,e.children,c);b.memoizedState=\nnull;return b.child=c}a=a.child;if(g){g=e.fallback;e=eh(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=eh(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=xi;b.child=e;return c}b.memoizedState=null;return b.child=fh(b,a,e.children,c)}\nfunction zi(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);ug(a.return,b)}function Ai(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,last:d,tail:c,tailExpiration:0,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}\nfunction Bi(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;R(a,b,d.children,c);d=M.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&zi(a,c);else if(19===a.tag)zi(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(M,d,b);if(0===(b.mode&2))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===qh(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Ai(b,!1,e,c,f,b.lastEffect);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===qh(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Ai(b,!0,c,null,f,b.lastEffect);break;case \"together\":Ai(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}\nfunction oi(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Jg(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(u(153));if(null!==b.child){a=b.child;c=ah(a,a.pendingProps,a.expirationTime);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=ah(a,a.pendingProps,a.expirationTime),c.return=b;c.sibling=null}return b.child}function Ci(a){a.effectTag|=4}var Hi,Ii,Ji,Ki;\nHi=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Ii=function(){};\nJi=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;lh(ih.current);a=null;switch(c){case \"input\":f=Ab(g,f);d=Ab(g,d);a=[];break;case \"option\":f=Ib(g,f);d=Ib(g,d);a=[];break;case \"select\":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case \"textarea\":f=Kb(g,f);d=Kb(g,d);a=[];break;default:\"function\"!==typeof f.onClick&&\"function\"===typeof d.onClick&&(g.onclick=ae)}Yd(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if(\"style\"===\nh)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]=\"\");else\"dangerouslySetInnerHTML\"!==h&&\"children\"!==h&&\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(ia.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if(\"style\"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]=\"\");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),\nc[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else\"dangerouslySetInnerHTML\"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,\"\"+l)):\"children\"===h?g===l||\"string\"!==typeof l&&\"number\"!==typeof l||(a=a||[]).push(h,\"\"+l):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&(ia.hasOwnProperty(h)?(null!=l&&$d(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push(\"style\",c);e=a;(b.updateQueue=e)&&Ci(b)}};Ki=function(a,b,c,d){c!==d&&Ci(b)};\nfunction Li(a,b){switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction Mi(a){switch(a.tag){case 1:L(a.type)&&Ff(a);var b=a.effectTag;return b&4096?(a.effectTag=b&-4097|64,a):null;case 3:nh(a);Gf(a);b=a.effectTag;if(0!==(b&64))throw Error(u(285));a.effectTag=b&-4097|64;return a;case 5:return ph(a),null;case 13:return G(M,a),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return G(M,a),null;case 4:return nh(a),null;case 10:return tg(a),null;default:return null}}function Ni(a,b){return{value:a,source:b,stack:Xa(b)}}\nvar Oi=\"function\"===typeof WeakSet?WeakSet:Set;function Pi(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Xa(c));null!==c&&Wa(c.type);b=b.value;null!==a&&1===a.tag&&Wa(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function Qi(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Ri(a,c)}}function Si(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){Ri(a,c)}else b.current=null}\nfunction Ti(a,b){switch(b.tag){case 0:case 11:case 15:Ui(2,0,b);break;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:mg(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}break;case 3:case 5:case 6:case 4:case 17:break;default:throw Error(u(163));}}\nfunction Ui(a,b,c){c=c.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do{if(0!==(d.tag&a)){var e=d.destroy;d.destroy=void 0;void 0!==e&&e()}0!==(d.tag&b)&&(e=d.create,d.destroy=e());d=d.next}while(d!==c)}}\nfunction Vi(a,b,c){\"function\"===typeof Wi&&Wi(b);switch(b.tag){case 0:case 11:case 14:case 15:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;fg(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Ri(g,h)}}a=a.next}while(a!==d)})}break;case 1:Si(b);c=b.stateNode;\"function\"===typeof c.componentWillUnmount&&Qi(b,c);break;case 5:Si(b);break;case 4:Xi(a,b,c)}}\nfunction Yi(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;null!==b&&Yi(b)}function Zi(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction $i(a){a:{for(var b=a.return;null!==b;){if(Zi(b)){var c=b;break a}b=b.return}throw Error(u(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(u(161));}c.effectTag&16&&(Tb(b,\"\"),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Zi(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;\nif(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}for(var e=a;;){var f=5===e.tag||6===e.tag;if(f){var g=f?e.stateNode:e.stateNode.instance;if(c)if(d){f=b;var h=g;g=c;8===f.nodeType?f.parentNode.insertBefore(h,g):f.insertBefore(h,g)}else b.insertBefore(g,c);else d?(h=b,8===h.nodeType?(f=h.parentNode,f.insertBefore(g,h)):(f=h,f.appendChild(g)),h=h._reactRootContainer,null!==h&&void 0!==h||null!==f.onclick||(f.onclick=ae)):b.appendChild(g)}else if(4!==\ne.tag&&null!==e.child){e.child.return=e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===e.return||e.return===a)return;e=e.return}e.sibling.return=e.return;e=e.sibling}}\nfunction Xi(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(u(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Vi(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Vi(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}\nfunction aj(a,b){switch(b.tag){case 0:case 11:case 14:case 15:Ui(4,8,b);break;case 1:break;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[ve]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Cb(c,d);Zd(a,e);b=Zd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];\"style\"===g?Wd(c,h):\"dangerouslySetInnerHTML\"===g?Sb(c,h):\"children\"===g?Tb(c,h):vb(c,g,h,b)}switch(a){case \"input\":Eb(c,d);break;case \"textarea\":Mb(c,\nd);break;case \"select\":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?Jb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?Jb(c,!!d.multiple,d.defaultValue,!0):Jb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}break;case 6:if(null===b.stateNode)throw Error(u(162));b.stateNode.nodeValue=b.memoizedProps;break;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,Lc(b.containerInfo));break;case 12:break;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,bj=cg());\nif(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null,f.style.display=Vd(\"display\",e));else if(6===a.tag)a.stateNode.nodeValue=d?\"\":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=\na;a=a.child;continue}if(a===c)break a;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}cj(b);break;case 19:cj(b);break;case 17:break;case 20:break;case 21:break;default:throw Error(u(163));}}function cj(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Oi);b.forEach(function(b){var d=dj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}var ej=\"function\"===typeof WeakMap?WeakMap:Map;\nfunction fj(a,b,c){c=Bg(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){gj||(gj=!0,hj=d);Pi(a,b)};return c}\nfunction ij(a,b,c){c=Bg(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){Pi(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===jj?jj=new Set([this]):jj.add(this),Pi(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nvar kj=Math.ceil,lj=Ea.ReactCurrentDispatcher,mj=Ea.ReactCurrentOwner,S=0,nj=8,oj=16,pj=32,qj=0,rj=1,sj=2,tj=3,uj=4,vj=5,T=S,U=null,V=null,W=0,X=qj,wj=null,xj=1073741823,yj=1073741823,zj=null,Aj=0,Bj=!1,bj=0,Cj=500,Y=null,gj=!1,hj=null,jj=null,Dj=!1,Ej=null,Fj=90,Gj=null,Hj=0,Ij=null,Jj=0;function Pg(){return(T&(oj|pj))!==S?1073741821-(cg()/10|0):0!==Jj?Jj:Jj=1073741821-(cg()/10|0)}\nfunction Qg(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=dg();if(0===(b&4))return 99===d?1073741823:1073741822;if((T&oj)!==S)return W;if(null!==c)a=lg(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=lg(a,150,100);break;case 97:case 96:a=lg(a,5E3,250);break;case 95:a=2;break;default:throw Error(u(326));}null!==U&&a===W&&--a;return a}\nfunction Rg(a,b){if(50<Hj)throw Hj=0,Ij=null,Error(u(185));a=Kj(a,b);if(null!==a){var c=dg();1073741823===b?(T&nj)!==S&&(T&(oj|pj))===S?Lj(a):(Z(a),T===S&&jg()):Z(a);(T&4)===S||98!==c&&99!==c||(null===Gj?Gj=new Map([[a,b]]):(c=Gj.get(a),(void 0===c||c>b)&&Gj.set(a,b)))}}\nfunction Kj(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(U===e&&(Jg(b),X===uj&&Mj(e,W)),Nj(e,b));return e}\nfunction Oj(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Pj(a,b))return b;b=a.lastPingedTime;a=a.nextKnownPendingLevel;return b>a?b:a}\nfunction Z(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=hg(Lj.bind(null,a));else{var b=Oj(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=Pg();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Xf&&Nf(c)}a.callbackExpirationTime=\nb;a.callbackPriority=d;b=1073741823===b?hg(Lj.bind(null,a)):gg(d,Qj.bind(null,a),{timeout:10*(1073741821-b)-cg()});a.callbackNode=b}}}\nfunction Qj(a,b){Jj=0;if(b)return b=Pg(),Rj(a,b),Z(a),null;var c=Oj(a);if(0!==c){b=a.callbackNode;if((T&(oj|pj))!==S)throw Error(u(327));Sj();a===U&&c===W||Tj(a,c);if(null!==V){var d=T;T|=oj;var e=Uj(a);do try{Vj();break}catch(h){Wj(a,h)}while(1);rg();T=d;lj.current=e;if(X===rj)throw b=wj,Tj(a,c),Mj(a,c),Z(a),b;if(null===V)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=X,U=null,d){case qj:case rj:throw Error(u(345));case sj:Rj(a,2<c?2:c);break;case tj:Mj(a,c);d=a.lastSuspendedTime;\nc===d&&(a.nextKnownPendingLevel=Xj(e));if(1073741823===xj&&(e=bj+Cj-cg(),10<e)){if(Bj){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Tj(a,c);break}}f=Oj(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=pe(Yj.bind(null,a),e);break}Yj(a);break;case uj:Mj(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Xj(e));if(Bj&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Tj(a,c);break}e=Oj(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=\nd;break}1073741823!==yj?d=10*(1073741821-yj)-cg():1073741823===xj?d=0:(d=10*(1073741821-xj)-5E3,e=cg(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*kj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=pe(Yj.bind(null,a),d);break}Yj(a);break;case vj:if(1073741823!==xj&&null!==zj){f=xj;var g=zj;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=cg()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){Mj(a,c);a.timeoutHandle=\npe(Yj.bind(null,a),d);break}}Yj(a);break;default:throw Error(u(329));}Z(a);if(a.callbackNode===b)return Qj.bind(null,a)}}return null}\nfunction Lj(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if(a.finishedExpirationTime===b)Yj(a);else{if((T&(oj|pj))!==S)throw Error(u(327));Sj();a===U&&b===W||Tj(a,b);if(null!==V){var c=T;T|=oj;var d=Uj(a);do try{Zj();break}catch(e){Wj(a,e)}while(1);rg();T=c;lj.current=d;if(X===rj)throw c=wj,Tj(a,b),Mj(a,b),Z(a),c;if(null!==V)throw Error(u(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;U=null;Yj(a);Z(a)}}return null}\nfunction ak(){if(null!==Gj){var a=Gj;Gj=null;a.forEach(function(a,c){Rj(c,a);Z(c)});jg()}}function bk(a,b){var c=T;T|=1;try{return a(b)}finally{T=c,T===S&&jg()}}function ck(a,b){var c=T;T&=-2;T|=nj;try{return a(b)}finally{T=c,T===S&&jg()}}\nfunction Tj(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,qe(c));if(null!==V)for(c=V.return;null!==c;){var d=c;switch(d.tag){case 1:var e=d.type.childContextTypes;null!==e&&void 0!==e&&Ff(d);break;case 3:nh(d);Gf(d);break;case 5:ph(d);break;case 4:nh(d);break;case 13:G(M,d);break;case 19:G(M,d);break;case 10:tg(d)}c=c.return}U=a;V=ah(a.current,null,b);W=b;X=qj;wj=null;yj=xj=1073741823;zj=null;Aj=0;Bj=!1}\nfunction Wj(a,b){do{try{rg();Mh();if(null===V||null===V.return)return X=rj,wj=b,null;a:{var c=a,d=V.return,e=V,f=b;b=W;e.effectTag|=2048;e.firstEffect=e.lastEffect=null;if(null!==f&&\"object\"===typeof f&&\"function\"===typeof f.then){var g=f,h=0!==(M.current&1),k=d;do{var l;if(l=13===k.tag){var m=k.memoizedState;if(null!==m)l=null!==m.dehydrated?!0:!1;else{var C=k.memoizedProps;l=void 0===C.fallback?!1:!0!==C.unstable_avoidThisFallback?!0:h?!1:!0}}if(l){var y=k.updateQueue;if(null===y){var H=new Set;\nH.add(g);k.updateQueue=H}else y.add(g);if(0===(k.mode&2)){k.effectTag|=64;e.effectTag&=-2981;if(1===e.tag)if(null===e.alternate)e.tag=17;else{var z=Bg(1073741823,null);z.tag=2;Dg(e,z)}e.expirationTime=1073741823;break a}f=void 0;e=b;var ta=c.pingCache;null===ta?(ta=c.pingCache=new ej,f=new Set,ta.set(g,f)):(f=ta.get(g),void 0===f&&(f=new Set,ta.set(g,f)));if(!f.has(e)){f.add(e);var r=dk.bind(null,c,g,e);g.then(r,r)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);f=Error((Wa(e.type)||\n\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\"+Xa(e))}X!==vj&&(X=sj);f=Ni(f,e);k=d;do{switch(k.tag){case 3:g=f;k.effectTag|=4096;k.expirationTime=b;var x=fj(k,g,b);Eg(k,x);break a;case 1:g=f;var A=k.type,p=k.stateNode;if(0===(k.effectTag&64)&&(\"function\"===typeof A.getDerivedStateFromError||null!==p&&\"function\"===typeof p.componentDidCatch&&\n(null===jj||!jj.has(p)))){k.effectTag|=4096;k.expirationTime=b;var t=ij(k,g,b);Eg(k,t);break a}}k=k.return}while(null!==k)}V=ek(V)}catch(v){b=v;continue}break}while(1)}function Uj(){var a=lj.current;lj.current=Lh;return null===a?Lh:a}function Ig(a,b){a<xj&&2<a&&(xj=a);null!==b&&a<yj&&2<a&&(yj=a,zj=b)}function Jg(a){a>Aj&&(Aj=a)}function Zj(){for(;null!==V;)V=fk(V)}function Vj(){for(;null!==V&&!Of();)V=fk(V)}\nfunction fk(a){var b=gk(a.alternate,a,W);a.memoizedProps=a.pendingProps;null===b&&(b=ek(a));mj.current=null;return b}\nfunction ek(a){V=a;do{var b=V.alternate;a=V.return;if(0===(V.effectTag&2048)){a:{var c=b;b=V;var d=W;var e=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:L(b.type)&&Ff(b);break;case 3:nh(b);Gf(b);e=b.stateNode;e.pendingContext&&(e.context=e.pendingContext,e.pendingContext=null);(null===c||null===c.child)&&ki(b)&&Ci(b);Ii(b);break;case 5:ph(b);d=lh(kh.current);var f=b.type;if(null!==c&&null!=b.stateNode)Ji(c,b,f,e,d),c.ref!==b.ref&&(b.effectTag|=128);else if(e){var g=\nlh(ih.current);if(ki(b)){e=b;var h=e.stateNode;c=e.type;var k=e.memoizedProps,l=d;h[ue]=e;h[ve]=k;f=void 0;d=h;switch(c){case \"iframe\":case \"object\":case \"embed\":F(\"load\",d);break;case \"video\":case \"audio\":for(h=0;h<cc.length;h++)F(cc[h],d);break;case \"source\":F(\"error\",d);break;case \"img\":case \"image\":case \"link\":F(\"error\",d);F(\"load\",d);break;case \"form\":F(\"reset\",d);F(\"submit\",d);break;case \"details\":F(\"toggle\",d);break;case \"input\":Bb(d,k);F(\"invalid\",d);$d(l,\"onChange\");break;case \"select\":d._wrapperState=\n{wasMultiple:!!k.multiple};F(\"invalid\",d);$d(l,\"onChange\");break;case \"textarea\":Lb(d,k),F(\"invalid\",d),$d(l,\"onChange\")}Yd(c,k);h=null;for(f in k)k.hasOwnProperty(f)&&(g=k[f],\"children\"===f?\"string\"===typeof g?d.textContent!==g&&(h=[\"children\",g]):\"number\"===typeof g&&d.textContent!==\"\"+g&&(h=[\"children\",\"\"+g]):ia.hasOwnProperty(f)&&null!=g&&$d(l,f));switch(c){case \"input\":yb(d);Gb(d,k,!0);break;case \"textarea\":yb(d);Nb(d,k);break;case \"select\":case \"option\":break;default:\"function\"===typeof k.onClick&&\n(d.onclick=ae)}f=h;e.updateQueue=f;e=null!==f?!0:!1;e&&Ci(b)}else{c=b;l=f;k=e;h=9===d.nodeType?d:d.ownerDocument;g===Ob.html&&(g=Pb(l));g===Ob.html?\"script\"===l?(k=h.createElement(\"div\"),k.innerHTML=\"<script>\\x3c/script>\",h=k.removeChild(k.firstChild)):\"string\"===typeof k.is?h=h.createElement(l,{is:k.is}):(h=h.createElement(l),\"select\"===l&&(l=h,k.multiple?l.multiple=!0:k.size&&(l.size=k.size))):h=h.createElementNS(g,l);k=h;k[ue]=c;k[ve]=e;Hi(k,b,!1,!1);b.stateNode=k;l=f;c=e;var m=d,C=Zd(l,c);switch(l){case \"iframe\":case \"object\":case \"embed\":F(\"load\",\nk);d=c;break;case \"video\":case \"audio\":for(d=0;d<cc.length;d++)F(cc[d],k);d=c;break;case \"source\":F(\"error\",k);d=c;break;case \"img\":case \"image\":case \"link\":F(\"error\",k);F(\"load\",k);d=c;break;case \"form\":F(\"reset\",k);F(\"submit\",k);d=c;break;case \"details\":F(\"toggle\",k);d=c;break;case \"input\":Bb(k,c);d=Ab(k,c);F(\"invalid\",k);$d(m,\"onChange\");break;case \"option\":d=Ib(k,c);break;case \"select\":k._wrapperState={wasMultiple:!!c.multiple};d=n({},c,{value:void 0});F(\"invalid\",k);$d(m,\"onChange\");break;case \"textarea\":Lb(k,\nc);d=Kb(k,c);F(\"invalid\",k);$d(m,\"onChange\");break;default:d=c}Yd(l,d);h=void 0;g=l;var y=k,H=d;for(h in H)if(H.hasOwnProperty(h)){var z=H[h];\"style\"===h?Wd(y,z):\"dangerouslySetInnerHTML\"===h?(z=z?z.__html:void 0,null!=z&&Sb(y,z)):\"children\"===h?\"string\"===typeof z?(\"textarea\"!==g||\"\"!==z)&&Tb(y,z):\"number\"===typeof z&&Tb(y,\"\"+z):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(ia.hasOwnProperty(h)?null!=z&&$d(m,h):null!=z&&vb(y,h,z,C))}switch(l){case \"input\":yb(k);\nGb(k,c,!1);break;case \"textarea\":yb(k);Nb(k,c);break;case \"option\":null!=c.value&&k.setAttribute(\"value\",\"\"+ub(c.value));break;case \"select\":d=k;d.multiple=!!c.multiple;k=c.value;null!=k?Jb(d,!!c.multiple,k,!1):null!=c.defaultValue&&Jb(d,!!c.multiple,c.defaultValue,!0);break;default:\"function\"===typeof d.onClick&&(k.onclick=ae)}(e=ne(f,e))&&Ci(b)}null!==b.ref&&(b.effectTag|=128)}else if(null===b.stateNode)throw Error(u(166));break;case 6:if(c&&null!=b.stateNode)Ki(c,b,c.memoizedProps,e);else{if(\"string\"!==\ntypeof e&&null===b.stateNode)throw Error(u(166));d=lh(kh.current);lh(ih.current);ki(b)?(e=b,f=e.stateNode,d=e.memoizedProps,f[ue]=e,(e=f.nodeValue!==d)&&Ci(b)):(f=b,e=(9===d.nodeType?d:d.ownerDocument).createTextNode(e),e[ue]=f,b.stateNode=e)}break;case 11:break;case 13:G(M,b);e=b.memoizedState;if(0!==(b.effectTag&64)){b.expirationTime=d;break a}e=null!==e;f=!1;null===c?void 0!==b.memoizedProps.fallback&&ki(b):(d=c.memoizedState,f=null!==d,e||null===d||(d=c.child.sibling,null!==d&&(k=b.firstEffect,\nnull!==k?(b.firstEffect=d,d.nextEffect=k):(b.firstEffect=b.lastEffect=d,d.nextEffect=null),d.effectTag=8)));if(e&&!f&&0!==(b.mode&2))if(null===c&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(M.current&1))X===qj&&(X=tj);else{if(X===qj||X===tj)X=uj;0!==Aj&&null!==U&&(Mj(U,W),Nj(U,Aj))}if(e||f)b.effectTag|=4;break;case 7:break;case 8:break;case 12:break;case 4:nh(b);Ii(b);break;case 10:tg(b);break;case 9:break;case 14:break;case 17:L(b.type)&&Ff(b);break;case 19:G(M,b);e=b.memoizedState;if(null===\ne)break;f=0!==(b.effectTag&64);k=e.rendering;if(null===k)if(f)Li(e,!1);else{if(X!==qj||null!==c&&0!==(c.effectTag&64))for(c=b.child;null!==c;){k=qh(c);if(null!==k){b.effectTag|=64;Li(e,!1);f=k.updateQueue;null!==f&&(b.updateQueue=f,b.effectTag|=4);null===e.lastEffect&&(b.firstEffect=null);b.lastEffect=e.lastEffect;e=d;for(f=b.child;null!==f;)d=f,c=e,d.effectTag&=2,d.nextEffect=null,d.firstEffect=null,d.lastEffect=null,k=d.alternate,null===k?(d.childExpirationTime=0,d.expirationTime=c,d.child=null,\nd.memoizedProps=null,d.memoizedState=null,d.updateQueue=null,d.dependencies=null):(d.childExpirationTime=k.childExpirationTime,d.expirationTime=k.expirationTime,d.child=k.child,d.memoizedProps=k.memoizedProps,d.memoizedState=k.memoizedState,d.updateQueue=k.updateQueue,c=k.dependencies,d.dependencies=null===c?null:{expirationTime:c.expirationTime,firstContext:c.firstContext,responders:c.responders}),f=f.sibling;I(M,M.current&1|2,b);b=b.child;break a}c=c.sibling}}else{if(!f)if(c=qh(k),null!==c){if(b.effectTag|=\n64,f=!0,d=c.updateQueue,null!==d&&(b.updateQueue=d,b.effectTag|=4),Li(e,!0),null===e.tail&&\"hidden\"===e.tailMode&&!k.alternate){b=b.lastEffect=e.lastEffect;null!==b&&(b.nextEffect=null);break}}else cg()>e.tailExpiration&&1<d&&(b.effectTag|=64,f=!0,Li(e,!1),b.expirationTime=b.childExpirationTime=d-1);e.isBackwards?(k.sibling=b.child,b.child=k):(d=e.last,null!==d?d.sibling=k:b.child=k,e.last=k)}if(null!==e.tail){0===e.tailExpiration&&(e.tailExpiration=cg()+500);d=e.tail;e.rendering=d;e.tail=d.sibling;\ne.lastEffect=b.lastEffect;d.sibling=null;e=M.current;e=f?e&1|2:e&1;I(M,e,b);b=d;break a}break;case 20:break;case 21:break;default:throw Error(u(156,b.tag));}b=null}e=V;if(1===W||1!==e.childExpirationTime){f=0;for(d=e.child;null!==d;)c=d.expirationTime,k=d.childExpirationTime,c>f&&(f=c),k>f&&(f=k),d=d.sibling;e.childExpirationTime=f}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=V.firstEffect),null!==V.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=\nV.firstEffect),a.lastEffect=V.lastEffect),1<V.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=V:a.firstEffect=V,a.lastEffect=V))}else{b=Mi(V,W);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=V.sibling;if(null!==b)return b;V=a}while(null!==V);X===qj&&(X=vj);return null}function Xj(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Yj(a){var b=dg();fg(99,ik.bind(null,a,b));return null}\nfunction ik(a,b){do Sj();while(null!==Ej);if((T&(oj|pj))!==S)throw Error(u(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(u(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Xj(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=\nd-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===U&&(V=U=null,W=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=T;T|=pj;mj.current=null;le=Ld;var g=fe();if(ge(g)){if(\"selectionStart\"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,\nm=k.focusNode;k=k.focusOffset;try{h.nodeType,m.nodeType}catch(Db){h=null;break a}var C=0,y=-1,H=-1,z=0,ta=0,r=g,x=null;b:for(;;){for(var A;;){r!==h||0!==l&&3!==r.nodeType||(y=C+l);r!==m||0!==k&&3!==r.nodeType||(H=C+k);3===r.nodeType&&(C+=r.nodeValue.length);if(null===(A=r.firstChild))break;x=r;r=A}for(;;){if(r===g)break b;x===h&&++z===l&&(y=C);x===m&&++ta===k&&(H=C);if(null!==(A=r.nextSibling))break;r=x;x=r.parentNode}r=A}h=-1===y||-1===H?null:{start:y,end:H}}else h=null}h=h||{start:0,end:0}}else h=\nnull;me={focusedElem:g,selectionRange:h};Ld=!1;Y=e;do try{jk()}catch(Db){if(null===Y)throw Error(u(330));Ri(Y,Db);Y=Y.nextEffect}while(null!==Y);Y=e;do try{for(g=a,h=b;null!==Y;){var p=Y.effectTag;p&16&&Tb(Y.stateNode,\"\");if(p&128){var t=Y.alternate;if(null!==t){var v=t.ref;null!==v&&(\"function\"===typeof v?v(null):v.current=null)}}switch(p&1038){case 2:$i(Y);Y.effectTag&=-3;break;case 6:$i(Y);Y.effectTag&=-3;aj(Y.alternate,Y);break;case 1024:Y.effectTag&=-1025;break;case 1028:Y.effectTag&=-1025;aj(Y.alternate,\nY);break;case 4:aj(Y.alternate,Y);break;case 8:l=Y,Xi(g,l,h),Yi(l)}Y=Y.nextEffect}}catch(Db){if(null===Y)throw Error(u(330));Ri(Y,Db);Y=Y.nextEffect}while(null!==Y);v=me;t=fe();p=v.focusedElem;h=v.selectionRange;if(t!==p&&p&&p.ownerDocument&&ee(p.ownerDocument.documentElement,p)){null!==h&&ge(p)&&(t=h.start,v=h.end,void 0===v&&(v=t),\"selectionStart\"in p?(p.selectionStart=t,p.selectionEnd=Math.min(v,p.value.length)):(v=(t=p.ownerDocument||document)&&t.defaultView||window,v.getSelection&&(v=v.getSelection(),\nl=p.textContent.length,g=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!v.extend&&g>h&&(l=h,h=g,g=l),l=de(p,g),m=de(p,h),l&&m&&(1!==v.rangeCount||v.anchorNode!==l.node||v.anchorOffset!==l.offset||v.focusNode!==m.node||v.focusOffset!==m.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),v.removeAllRanges(),g>h?(v.addRange(t),v.extend(m.node,m.offset)):(t.setEnd(m.node,m.offset),v.addRange(t))))));t=[];for(v=p;v=v.parentNode;)1===v.nodeType&&t.push({element:v,left:v.scrollLeft,top:v.scrollTop});\n\"function\"===typeof p.focus&&p.focus();for(p=0;p<t.length;p++)v=t[p],v.element.scrollLeft=v.left,v.element.scrollTop=v.top}me=null;Ld=!!le;le=null;a.current=c;Y=e;do try{for(p=d;null!==Y;){var Dh=Y.effectTag;if(Dh&36){var dc=Y.alternate;t=Y;v=p;switch(t.tag){case 0:case 11:case 15:Ui(16,32,t);break;case 1:var fd=t.stateNode;if(t.effectTag&4)if(null===dc)fd.componentDidMount();else{var hk=t.elementType===t.type?dc.memoizedProps:mg(t.type,dc.memoizedProps);fd.componentDidUpdate(hk,dc.memoizedState,\nfd.__reactInternalSnapshotBeforeUpdate)}var Eh=t.updateQueue;null!==Eh&&Kg(t,Eh,fd,v);break;case 3:var Fh=t.updateQueue;if(null!==Fh){g=null;if(null!==t.child)switch(t.child.tag){case 5:g=t.child.stateNode;break;case 1:g=t.child.stateNode}Kg(t,Fh,g,v)}break;case 5:var xk=t.stateNode;null===dc&&t.effectTag&4&&ne(t.type,t.memoizedProps)&&xk.focus();break;case 6:break;case 4:break;case 12:break;case 13:if(null===t.memoizedState){var Di=t.alternate;if(null!==Di){var Ei=Di.memoizedState;if(null!==Ei){var Fi=\nEi.dehydrated;null!==Fi&&Lc(Fi)}}}break;case 19:case 17:case 20:case 21:break;default:throw Error(u(163));}}if(Dh&128){t=void 0;var xd=Y.ref;if(null!==xd){var Gi=Y.stateNode;switch(Y.tag){case 5:t=Gi;break;default:t=Gi}\"function\"===typeof xd?xd(t):xd.current=t}}Y=Y.nextEffect}}catch(Db){if(null===Y)throw Error(u(330));Ri(Y,Db);Y=Y.nextEffect}while(null!==Y);Y=null;Yf();T=f}else a.current=c;if(Dj)Dj=!1,Ej=a,Fj=b;else for(Y=e;null!==Y;)b=Y.nextEffect,Y.nextEffect=null,Y=b;b=a.firstPendingTime;0===b&&\n(jj=null);1073741823===b?a===Ij?Hj++:(Hj=0,Ij=a):Hj=0;\"function\"===typeof kk&&kk(c.stateNode,d);Z(a);if(gj)throw gj=!1,a=hj,hj=null,a;if((T&nj)!==S)return null;jg();return null}function jk(){for(;null!==Y;){var a=Y.effectTag;0!==(a&256)&&Ti(Y.alternate,Y);0===(a&512)||Dj||(Dj=!0,gg(97,function(){Sj();return null}));Y=Y.nextEffect}}function Sj(){if(90!==Fj){var a=97<Fj?97:Fj;Fj=90;return fg(a,lk)}}\nfunction lk(){if(null===Ej)return!1;var a=Ej;Ej=null;if((T&(oj|pj))!==S)throw Error(u(331));var b=T;T|=pj;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:Ui(128,0,c),Ui(0,64,c)}}catch(d){if(null===a)throw Error(u(330));Ri(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}T=b;jg();return!0}function mk(a,b,c){b=Ni(c,b);b=fj(a,b,1073741823);Dg(a,b);a=Kj(a,1073741823);null!==a&&Z(a)}\nfunction Ri(a,b){if(3===a.tag)mk(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){mk(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===jj||!jj.has(d))){a=Ni(b,a);a=ij(c,a,1073741823);Dg(c,a);c=Kj(c,1073741823);null!==c&&Z(c);break}}c=c.return}}\nfunction dk(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);U===a&&W===c?X===uj||X===tj&&1073741823===xj&&cg()-bj<Cj?Tj(a,W):Bj=!0:Pj(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,a.finishedExpirationTime===c&&(a.finishedExpirationTime=0,a.finishedWork=null),Z(a)))}function dj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=Pg(),b=Qg(b,a,null));a=Kj(a,b);null!==a&&Z(a)}var gk;\ngk=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||K.current)wg=!0;else{if(d<c){wg=!1;switch(b.tag){case 3:wi(b);li();break;case 5:oh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:L(b.type)&&Jf(b);break;case 4:mh(b,b.stateNode.containerInfo);break;case 10:sg(b,b.memoizedProps.value);break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;if(0!==d&&d>=c)return yi(a,b,c);I(M,M.current&\n1,b);b=oi(a,b,c);return null!==b?b.sibling:null}I(M,M.current&1,b);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return Bi(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);I(M,M.current,b);if(!d)return null}return oi(a,b,c)}wg=!1}}else wg=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=Ef(b,J.current);vg(b,c);e=Ih(null,b,d,a,e,c);b.effectTag|=1;if(\"object\"===\ntypeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;Mh();if(L(d)){var f=!0;Jf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Og(b,d,g,a);e.updater=Sg;b.stateNode=e;e._reactInternalFiber=b;Wg(b,d,a,c);b=vi(null,b,d,!0,f,c)}else b.tag=0,R(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;Va(e);if(1!==e._status)throw e._result;\ne=e._result;b.type=e;f=b.tag=nk(e);a=mg(e,a);switch(f){case 0:b=si(null,b,e,a,c);break;case 1:b=ui(null,b,e,a,c);break;case 11:b=ni(null,b,e,a,c);break;case 14:b=pi(null,b,e,mg(e.type,a),d,c);break;default:throw Error(u(306,e,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:mg(d,e),si(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:mg(d,e),ui(a,b,d,e,c);case 3:wi(b);d=b.updateQueue;if(null===d)throw Error(u(282));e=b.memoizedState;e=null!==e?e.element:\nnull;Hg(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)li(),b=oi(a,b,c);else{if(e=b.stateNode.hydrate)di=re(b.stateNode.containerInfo.firstChild),ci=b,e=ei=!0;if(e)for(c=gh(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else R(a,b,d,c),li();b=b.child}return b;case 5:return oh(b),null===a&&ii(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,oe(d,e)?g=null:null!==f&&oe(d,f)&&(b.effectTag|=16),ti(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=\nb.childExpirationTime=1,b=null):(R(a,b,g,c),b=b.child),b;case 6:return null===a&&ii(b),null;case 13:return yi(a,b,c);case 4:return mh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=fh(b,null,d,c):R(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:mg(d,e),ni(a,b,d,e,c);case 7:return R(a,b,b.pendingProps,c),b.child;case 8:return R(a,b,b.pendingProps.children,c),b.child;case 12:return R(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;\ne=b.pendingProps;g=b.memoizedProps;f=e.value;sg(b,f);if(null!==g){var h=g.value;f=of(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!K.current){b=oi(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==k){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=Bg(c,null),l.tag=2,Dg(h,l));h.expirationTime<c&&(h.expirationTime=\nc);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);ug(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=g}}R(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,vg(b,c),e=xg(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,R(a,b,d,c),b.child;\ncase 14:return e=b.type,f=mg(e,b.pendingProps),f=mg(e.type,f),pi(a,b,e,f,d,c);case 15:return ri(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:mg(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,L(d)?(a=!0,Jf(b)):a=!1,vg(b,c),Ug(b,d,e,c),Wg(b,d,e,c),vi(null,b,d,!0,a,c);case 19:return Bi(a,b,c)}throw Error(u(156,b.tag));};var kk=null,Wi=null;\nfunction ok(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);kk=function(a){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(e){}};Wi=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}\nfunction pk(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function gi(a,b,c,d){return new pk(a,b,c,d)}\nfunction qi(a){a=a.prototype;return!(!a||!a.isReactComponent)}function nk(a){if(\"function\"===typeof a)return qi(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Oa)return 11;if(a===Ra)return 14}return 2}\nfunction ah(a,b){var c=a.alternate;null===c?(c=gi(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,\nfirstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction ch(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)qi(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case Ia:return eh(c.children,e,f,b);case Na:g=8;e|=7;break;case Ja:g=8;e|=1;break;case Ka:return a=gi(12,c,b,e|8),a.elementType=Ka,a.type=Ka,a.expirationTime=f,a;case Pa:return a=gi(13,c,b,e),a.type=Pa,a.elementType=Pa,a.expirationTime=f,a;case Qa:return a=gi(19,c,b,e),a.elementType=Qa,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case La:g=\n10;break a;case Ma:g=9;break a;case Oa:g=11;break a;case Ra:g=14;break a;case Sa:g=16;d=null;break a}throw Error(u(130,null==a?a:typeof a,\"\"));}b=gi(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function eh(a,b,c,d){a=gi(7,a,d,b);a.expirationTime=c;return a}function bh(a,b,c){a=gi(6,a,null,b);a.expirationTime=c;return a}\nfunction dh(a,b,c){b=gi(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction qk(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}\nfunction Pj(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function Mj(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}\nfunction Nj(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Rj(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}\nfunction rk(a,b,c,d){var e=b.current,f=Pg(),g=Mg.suspense;f=Qg(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(ec(c)!==c||1!==c.tag)throw Error(u(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(L(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(u(171));}if(1===c.tag){var k=c.type;if(L(k)){c=If(c,k,h);break a}}c=h}else c=Cf;null===b.context?b.context=c:b.pendingContext=c;b=Bg(f,g);b.payload={element:a};d=void 0===\nd?null:d;null!==d&&(b.callback=d);Dg(e,b);Rg(e,f);return f}function sk(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function tk(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function uk(a,b){tk(a,b);(a=a.alternate)&&tk(a,b)}\nfunction vk(a,b,c){c=null!=c&&!0===c.hydrate;var d=new qk(a,b,c),e=gi(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;a[we]=d.current;c&&0!==b&&wc(9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}vk.prototype.render=function(a,b){rk(a,this._internalRoot,null,void 0===b?null:b)};vk.prototype.unmount=function(a){var b=this._internalRoot,c=void 0===a?null:a,d=b.containerInfo;rk(null,b,null,function(){d[we]=null;null!==c&&c()})};\nfunction wk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function yk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new vk(a,0,b?{hydrate:!0}:void 0)}\nfunction zk(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=sk(g);h.call(a)}}rk(b,g,a,e)}else{f=c._reactRootContainer=yk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=sk(g);k.call(a)}}ck(function(){rk(b,g,a,e)})}return sk(g)}function Ak(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:Ha,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\njc=function(a){if(13===a.tag){var b=lg(Pg(),150,100);Rg(a,b);uk(a,b)}};kc=function(a){if(13===a.tag){Pg();var b=kg++;Rg(a,b);uk(a,b)}};lc=function(a){if(13===a.tag){var b=Pg();b=Qg(b,a,null);Rg(a,b);uk(a,b)}};\nZa=function(a,b,c){switch(b){case \"input\":Eb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=ye(d);if(!e)throw Error(u(90));zb(d);Eb(d,e)}}}break;case \"textarea\":Mb(a,c);break;case \"select\":b=c.value,null!=b&&Jb(a,!!c.multiple,b,!1)}};eb=bk;\nfb=function(a,b,c,d){var e=T;T|=4;try{return fg(98,a.bind(null,b,c,d))}finally{T=e,T===S&&jg()}};gb=function(){(T&(1|oj|pj))===S&&(ak(),Sj())};hb=function(a,b){var c=T;T|=2;try{return a(b)}finally{T=c,T===S&&jg()}};function Bk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!wk(b))throw Error(u(200));return Ak(a,b,null,c)}\nvar Ck={createPortal:Bk,findDOMNode:function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===b){if(\"function\"===typeof a.render)throw Error(u(188));throw Error(u(268,Object.keys(a)));}a=ic(b);a=null===a?null:a.stateNode;return a},hydrate:function(a,b,c){if(!wk(b))throw Error(u(200));return zk(null,a,b,!0,c)},render:function(a,b,c){if(!wk(b))throw Error(u(200));return zk(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){if(!wk(c))throw Error(u(200));\nif(null==a||void 0===a._reactInternalFiber)throw Error(u(38));return zk(a,b,c,!1,d)},unmountComponentAtNode:function(a){if(!wk(a))throw Error(u(40));return a._reactRootContainer?(ck(function(){zk(null,null,a,!1,function(){a._reactRootContainer=null;a[we]=null})}),!0):!1},unstable_createPortal:function(){return Bk.apply(void 0,arguments)},unstable_batchedUpdates:bk,flushSync:function(a,b){if((T&(oj|pj))!==S)throw Error(u(187));var c=T;T|=1;try{return fg(99,a.bind(null,b))}finally{T=c,jg()}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[Cc,\nxe,ye,Ca.injectEventPluginsByName,fa,Sc,function(a){ya(a,Rc)},cb,db,Pd,Ba,Sj,{current:!1}]}};\n(function(a){var b=a.findFiberByHostInstance;return ok(n({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Ea.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=ic(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Fc,bundleType:0,version:\"16.12.0\",\nrendererPackageName:\"react-dom\"});var Dk={default:Ck},Ek=Dk&&Ck||Dk;module.exports=Ek.default||Ek;\n\n},{\"react\":\"W4rj\",\"object-assign\":\"W2ED\",\"scheduler\":\"KTa4\"}],\"UiuB\":[function(require,module,exports) {\n'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function') {\n    return;\n  }\n\n  if (\"production\" !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (\"production\" === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n},{\"./cjs/react-dom.production.min.js\":\"t7dJ\"}],\"qyfj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SandDanceReact = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _util = require(\"./util\");\n\nvar _reactDom = require(\"react-dom\");\n\nvar _sanddance = require(\"@msrvida/sanddance\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction addNullable(insight, signalValues) {\n  const withNulls = Object.assign(Object.assign({\n    view: null,\n    filter: null\n  }, insight), {\n    signalValues\n  });\n  return withNulls;\n}\n\nclass SandDanceReact extends React.Component {\n  areLayoutPropsSame() {\n    const currentInsight = this.viewer.getInsight();\n    const a = addNullable(currentInsight, Object.assign(Object.assign({}, this.viewer.insight.signalValues), currentInsight.signalValues));\n    const b = addNullable(this.props.insight, Object.assign(Object.assign({}, a.signalValues), this.props.insight.signalValues));\n    const compare = (0, _util.deepCompare)(a, b);\n    return compare && this.props.data === this.lastData;\n  }\n\n  needsLayout() {\n    return this.props.insight && this.props.data && !this.areLayoutPropsSame();\n  }\n\n  layout() {\n    this.lastData = this.props.data;\n    this.viewer.render(this.props.insight, this.props.data, this.props.renderOptions).then(renderResult => {\n      //TODO: show errors if any\n      //console.log('viewer render');\n      this.props.onView && this.props.onView(renderResult);\n    }).catch(e => {\n      //console.log('viewer error');\n      this.props.onError && this.props.onError(e);\n    });\n  }\n\n  view() {\n    const needsLayout = this.needsLayout();\n\n    if (needsLayout) {\n      this.layout();\n    }\n  }\n\n  componentDidMount() {\n    const element = (0, _reactDom.findDOMNode)(this.viewerDiv);\n    this.viewer = new _sanddance.Viewer(element, this.props.viewerOptions);\n\n    if (this.props.onMount) {\n      if (this.props.onMount(this.viewer.presenter.getElement(_sanddance.VegaDeckGl.PresenterElement.gl))) {\n        this.view();\n      }\n    } else {\n      this.view();\n    }\n  }\n\n  componentDidUpdate() {\n    this.viewer.options = _sanddance.VegaDeckGl.util.deepMerge(this.viewer.options, this.props.viewerOptions);\n    this.view();\n  }\n\n  componentWillUnmount() {\n    this.viewer.finalize();\n  }\n\n  render() {\n    return React.createElement(\"div\", {\n      className: \"sanddance-ReactViewer\",\n      ref: div => this.viewerDiv = div\n    });\n  }\n\n}\n\nexports.SandDanceReact = SandDanceReact;\n},{\"react\":\"W4rj\",\"./util\":\"HI4Z\",\"react-dom\":\"UiuB\",\"@msrvida/sanddance\":\"rZaE\"}],\"TN0H\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.version = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst version = '2.0.0';\nexports.version = version;\n},{}],\"MjKu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"SandDanceReact\", {\n  enumerable: true,\n  get: function () {\n    return _viewer.SandDanceReact;\n  }\n});\nObject.defineProperty(exports, \"version\", {\n  enumerable: true,\n  get: function () {\n    return _version.version;\n  }\n});\nexports.util = exports.SandDance = void 0;\n\nvar SandDance = _interopRequireWildcard(require(\"@msrvida/sanddance\"));\n\nexports.SandDance = SandDance;\n\nvar util = _interopRequireWildcard(require(\"./util\"));\n\nexports.util = util;\n\nvar _viewer = require(\"./viewer\");\n\nvar _version = require(\"./version\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"@msrvida/sanddance\":\"rZaE\",\"./util\":\"HI4Z\",\"./viewer\":\"qyfj\",\"./version\":\"TN0H\"}],\"Vlbn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.use = use;\nexports.base = void 0;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar base = {\n  fabric: null\n};\n/**\n * Specify the dependency libraries to use for rendering.\n * @param fabric Office UI Fabric React library.\n */\n\nexports.base = base;\n\nfunction use(fabric, vega, deck, layers, luma) {\n  _sanddanceReact.SandDance.VegaDeckGl.use(vega, deck, layers, luma);\n\n  base.fabric = fabric;\n}\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"pP3Y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.convertToDelimited = convertToDelimited;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction convertToDelimited(data, delimiter) {\n  var fields = Object.keys(data[0]);\n  var file = data.map(function (row) {\n    return fields.map(function (fieldName) {\n      var value = row[fieldName];\n\n      if (typeof value === 'number') {\n        return value;\n      }\n\n      if (typeof value === 'string') {\n        if (value.indexOf(delimiter) >= 0) {\n          return \"\\\"\".concat(value.replace(/\"/g, '\"\"'), \"\\\"\");\n        } else {\n          return value;\n        }\n      }\n\n      return '';\n    }).join(delimiter);\n  });\n  file.unshift(fields.join(delimiter));\n  return file.join('\\n');\n}\n},{}],\"fOIZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.embedHtml = void 0;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar embedHtml = function embedHtml(title, embed) {\n  return \"<!DOCTYPE html>\\n<html lang=\\\"en\\\">\\n\\n<head>\\n    <meta charset=\\\"UTF-8\\\">\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\">\\n    <title>\".concat(title, \"</title>\\n    <link rel=\\\"stylesheet\\\" type=\\\"text/css\\\"\\n        href=\\\"https://unpkg.com/@msrvida/sanddance-embed@2/dist/css/sanddance-embed.css\\\" />\\n    <link rel=\\\"stylesheet\\\" type=\\\"text/css\\\"\\n        href=\\\"https://unpkg.com/@msrvida/sanddance-explorer@2.2/dist/css/sanddance-explorer.css\\\" />\\n</head>\\n\\n<body>\\n    <script src=\\\"https://unpkg.com/react@16/umd/react.production.min.js\\\" crossorigin></script>\\n    <script src=\\\"https://unpkg.com/react-dom@16/umd/react-dom.production.min.js\\\" crossorigin></script>\\n    <script src=\\\"https://unpkg.com/deck.gl@6/deckgl.min.js\\\"></script>\\n    <script src=\\\"https://unpkg.com/vega@5.8/build/vega.min.js\\\"></script>\\n    <script src=\\\"https://unpkg.com/office-ui-fabric-react@6.204.4/dist/office-ui-fabric-react.js\\\"></script>\\n    <script src=\\\"https://unpkg.com/@msrvida/sanddance-explorer@2.2/dist/umd/sanddance-explorer.js\\\"></script>\\n    <script src=\\\"https://unpkg.com/@msrvida/sanddance-embed@2/dist/umd/sanddance-embed.js\\\"></script>\\n\\n    <div id=\\\"app\\\"></div>\\n\\n    \").concat(embed, \"\\n\\n</body>\\n\\n</html>\");\n};\n\nexports.embedHtml = embedHtml;\n},{}],\"hk5u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.strings = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar strings = {\n  appName: 'SandDance',\n  bingsearch: 'Bing',\n  bingsearchDescription: function bingsearchDescription(term) {\n    return \"Search Bing for \\\"\".concat(term, \"\\\"\");\n  },\n  buttonClose: 'Close',\n  buttonSelect: 'Search & Select',\n  buttonColorSchemeMap: 'Map color scheme to filtered data',\n  buttonColorSchemeRemap: 'Remap color to filtered data',\n  buttonColorSchemeKeep: 'Keep same color scheme',\n  buttonCopyToClipboard: 'Copy to clipboard',\n  buttonExclude: 'Exclude',\n  buttonExport: 'Export',\n  buttonExportCount: function buttonExportCount(total) {\n    return total == 1 ? 'Export 1 row...' : \"Export \".concat(total, \" rows...\");\n  },\n  buttonIsolate: 'Isolate',\n  buttonReset: 'Stop filtering',\n  buttonDeselect: 'Clear selection',\n  buttonToolbarFloat: 'Float toolbar',\n  buttonToolbarDock: 'Dock toolbar',\n  buttonToolbarHide: 'Hide toolbar',\n  buttonToolbarShow: 'Show toolbar',\n  buttonNextDataItem: 'Next data item',\n  buttonPrevDataItem: 'Previous data item',\n  buttonCreateSnapshot: 'Create snapshot',\n  buttonNextSnapshot: 'Next snapshot',\n  buttonPrevSnapshot: 'Previous snapshot',\n  buttonUpdateSnapshot: 'Update snapshot',\n  buttonAddExpression: 'Add expression',\n  buttonAddExpressionGroup: 'Add group',\n  buttonDeleteExpression: 'Delete',\n  buttonDeleteExpressionGroup: 'Delete group',\n  buttonClearSnapshots: 'Clear snapshots',\n  buttonDeleteSnapshot: 'Delete snapshot',\n  buttonEditSnapshot: 'Edit snapshot',\n  buttonMoveUp: 'Move up',\n  buttonMoveDown: 'Move down',\n  buttonShowVegaSpec: 'Show Vega spec',\n  buttonLaunchVegaEditor: 'Open Vega Editor',\n  buttonCameraHome: 'Center chart in window',\n  buttonTooltipMapping: 'Tooltip columns...',\n  chartTypeBarChartH: 'Bar',\n  chartTypeBarChartV: 'Column',\n  chartTypeDensity: 'Density',\n  chartTypeGrid: 'Grid',\n  chartTypeScatterPlot: 'Scatter',\n  chartTypeStacks: 'Stacks',\n  chartTypeTreeMap: 'Treemap',\n  defaultFileName: 'sanddance-data',\n  errorExportFilenameEmpty: 'Filename cannot be blank',\n  errorExportFilenameCharacters: function errorExportFilenameCharacters(characters) {\n    return \"A filename cannot contain any of the following characters: \".concat(characters);\n  },\n  errorColumnMustBeNumeric: 'Numeric column required for this chart type.',\n  labelBlank: 'blank',\n  labelNull: 'null',\n  labelTrue: 'true',\n  labelFalse: 'false',\n  labelSystemInfo: 'System info',\n  labelChartSettings: 'Chart settings',\n  labelDataBrowser: 'Data browser',\n  labelDataScope: 'Scope',\n  labelExport: 'Export Data',\n  labelExportFormat: 'File format',\n  labelExportCSV: '.CSV - Comma separated values',\n  labelExportHTML: '.HTML - A SandDance html page embedding this data',\n  labelExportJSON: '.JSON - JavaScript object notation',\n  labelExportTSV: '.TSV - Tab separated values',\n  labelTools: 'Tools',\n  labelVegaSpec: 'Vega specification',\n  labelColor: 'Chart color',\n  labelError: 'Error',\n  labelExportFileName: 'File name',\n  labelSnapshots: 'Snapshots',\n  labelSnapshotSettingThumbnailWidth: 'Thumbnail image width',\n  labelSearch: 'Select by search',\n  labelSearchClause: 'Clause',\n  labelSearchColumn: 'Field',\n  labelSearchOperator: 'Operator',\n  labelSearchValue: 'Value',\n  labelSearchValuePlaceholder: 'Value to search for',\n  labelChart: 'Chart',\n  labelChartCanvas: 'Chart canvas',\n  labelColumnMapping: 'Column Mapping',\n  labelChartTypeOptions: 'Chart options',\n  labelColorBin: 'Color binning',\n  labelColorOptions: 'Color options',\n  labelColorBinExplanation: 'For numeric columns',\n  labelColorFieldInfo: function labelColorFieldInfo(colorColumnName, colorColumnType, categoricalNumeric, distinctValueCount) {\n    return \"Field <span className=\\\"fieldname\\\">\".concat(colorColumnName, \"</span> is of type <span className=\\\"fieldtype\\\">\").concat(colorColumnType, \"</span>\").concat(categoricalNumeric ? \" and has \".concat(distinctValueCount, \" distinct values\") : '', \".\");\n  },\n  labelColorFieldIsColorData: function labelColorFieldIsColorData(colorColumnName) {\n    return \"Field <span className=\\\"fieldname\\\">\".concat(colorColumnName, \"</span> contains direct color data.\");\n  },\n  labelColorBinNone: 'None (continuous)',\n  labelColorBinQuantize: 'Quantize',\n  labelColorBinQuantile: 'Quantile',\n  labelColorFilter: 'Note: Colors will be re-mapped to the filter when viewing this snapshot.',\n  labelColorScheme: 'Scheme',\n  labelColumnColor: 'Color by',\n  labelColumnFacet: 'Facet by',\n  labelColumnSort: 'Sort by',\n  labelColumnX: 'X Axis',\n  labelColumnY: 'Y Axis',\n  labelColumnZ: 'Z Axis',\n  labelColumnSize: 'Size by',\n  labelColumnGroup: 'Group by',\n  labelAliasColor: 'Color',\n  labelAliasFacet: 'Facet',\n  labelAliasSort: 'Sort',\n  labelAliasX: 'X Axis',\n  labelAliasY: 'Y Axis',\n  labelAliasZ: 'Z Axis',\n  labelAliasSize: 'Size',\n  labelAliasGroup: 'Group',\n  labelDataItemIsFiltered: 'Item is filtered from view',\n  labelShowLegend: 'Show legend',\n  labelShowAxes: 'Show axes',\n  labelSnapshotTitle: 'Title',\n  labelSnapshotDescription: 'Note (optional)',\n  labelTooltipMapping: 'Tooltip columns',\n  labelTransitionDurations: 'Transition durations',\n  labelTransitionCamera: '2D / 3D view',\n  labelTransitionColor: 'Color',\n  labelTransitionPosition: 'Position',\n  labelTransitionSize: 'Size',\n  labelVegaSpecData: 'Data reference',\n  labelVegaSpecNotes: 'Note: You may need to change the color scheme to make this visible in Vega.',\n  labelYes: 'Yes',\n  labelNo: 'No',\n  labelConfirmation: 'Are you sure?',\n  loading: 'Loading...',\n  schemeCategorical: 'Categorical',\n  schemeDiverging: 'Diverging',\n  schemeDual: 'Dual',\n  schemeSequentialMultiHue: 'Sequential Multi Hue',\n  schemeSequentialSingleHue: 'Sequential Single Hue',\n  selectDataSpanAll: 'All rows',\n  selectDataSpanFilter: 'Filtered',\n  selectDataSpanSelection: 'Selected',\n  selectVegaSpecDataNone: 'None',\n  selectVegaSpecDataInline: 'Inline - WARNING this may use substantial browser/clipboard memory for large data sets.',\n  selectVegaSpecDataUrl: 'URL',\n  record: function record(current, total) {\n    return \"\".concat(current, \" of \").concat(total);\n  },\n  searchEQ: '=',\n  searchNEQ: '<>',\n  searchGT: '>',\n  searchGTE: '>=',\n  searchLT: '<',\n  searchLTE: '<=',\n  searchNULL: 'is null or empty',\n  searchIN: 'contains',\n  searchSW: 'starts with',\n  searchWHERE: 'Where',\n  searchAND: 'and',\n  searchOR: 'or',\n  selectAny: '-- any --',\n  selectNone: '-- none --',\n  selectNumeric: 'Numeric',\n  selectNonNumeric: 'Categorical',\n  selectDirectColor: 'Direct color',\n  selectReference: 'Column mappings',\n  tooltipSearch: function tooltipSearch(column, value) {\n    return \"Click to search in '\".concat(column, \"' for \\\"\").concat(value, \"\\\"\");\n  },\n  labelRequired: 'required',\n  labelSystem: 'System',\n  lavelViewType2d: 'View in 2D',\n  labelViewType3d: 'View in 3D',\n  labelDataColors: 'Enabled if this data column contains any CSS color values.',\n  labelDataNullAll: 'Loading data...',\n  labelDataNullFiltered: 'You can filter by first making a selection, then choosing <b>Isolate</b> or <b>Exclude</b> in the top bar.',\n  labelDataNullSelection: 'You can select by: <ul><li>clicking the chart axes</li><li>clicking in the legend</li><li>searching</li</ul>',\n  labelZeroAll: 'Dataset contains zero rows.',\n  labelZeroSearchResults: 'No rows matched your search.',\n  signalGroups: [{\n    prefix: 'Chart',\n    label: 'Chart options'\n  }, {\n    prefix: 'Mark',\n    label: 'Mark options'\n  }, {\n    prefix: 'RoleColor',\n    label: 'Color options'\n  }, {\n    prefix: 'RoleFacet',\n    label: 'Facet options'\n  }, {\n    prefix: 'RoleSort',\n    label: 'Sort options'\n  }, {\n    prefix: 'RoleX',\n    label: 'X axis options'\n  }, {\n    prefix: 'RoleY',\n    label: 'Y axis options'\n  }, {\n    prefix: 'RoleZ',\n    label: 'Z axis options'\n  }, {\n    prefix: 'Text',\n    label: 'Text options'\n  }, {\n    prefix: '*',\n    label: 'Options'\n  }]\n};\nexports.strings = strings;\n},{}],\"l7po\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.removeExtensions = removeExtensions;\nexports.getEmbedHTML = getEmbedHTML;\nexports.DataExportPicker = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _exportDelimited = require(\"../exportDelimited\");\n\nvar _dataExporterHtml = require(\"./dataExporterHtml\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar exportTypes = [['json', _language.strings.labelExportJSON], ['csv', _language.strings.labelExportCSV], ['tsv', _language.strings.labelExportTSV], ['html', _language.strings.labelExportHTML]];\n\nvar DataExportPicker =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(DataExportPicker, _React$Component);\n\n  function DataExportPicker(props) {\n    var _this;\n\n    _classCallCheck(this, DataExportPicker);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(DataExportPicker).call(this, props));\n    _this.state = _this.getInitialState(_this.props);\n    return _this;\n  }\n\n  _createClass(DataExportPicker, [{\n    key: \"getInitialState\",\n    value: function getInitialState(props) {\n      var initialState = {\n        initializer: props.initializer,\n        dialogHidden: true,\n        exportType: exportTypes[0][0],\n        fileName: props.initializer.fileName,\n        fileNameError: '',\n        working: false\n      };\n      return initialState;\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      if (!_sanddanceReact.util.deepCompare(this.props.initializer, this.state.initializer)) {\n        this.setState(this.getInitialState(this.props));\n      }\n    } // Converts to dataExport type and calls dataExportHandler to deal with data\n\n  }, {\n    key: \"createExport\",\n    value: function createExport(exportType, displayName) {\n      var _this2 = this;\n\n      var final = function final(data) {\n        _this2.props.dataExportHandler(data, exportType, displayName);\n\n        _this2.close();\n      };\n\n      var json = JSON.stringify(this.props.data, columnReplacer);\n\n      switch (exportType) {\n        case 'json':\n          {\n            final(json);\n            break;\n          }\n\n        case 'csv':\n          {\n            final((0, _exportDelimited.convertToDelimited)(JSON.parse(json), ','));\n            break;\n          }\n\n        case 'tsv':\n          {\n            final((0, _exportDelimited.convertToDelimited)(JSON.parse(json), '\\t'));\n            break;\n          }\n\n        case 'html':\n          {\n            var csv = (0, _exportDelimited.convertToDelimited)(JSON.parse(json), ',');\n            var html = (0, _dataExporterHtml.embedHtml)(\"\".concat(_language.strings.appName, \" - \").concat(escape(displayName)), embedScript(csv, displayName));\n            final(html);\n          }\n      }\n    }\n  }, {\n    key: \"close\",\n    value: function close() {\n      this.setState({\n        dialogHidden: true,\n        working: false\n      });\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this3 = this;\n\n      var closeDialog = function closeDialog() {\n        return _this3.close();\n      };\n\n      if (this.state.delayAction) {\n        requestAnimationFrame(function () {\n          //allow render to complete\n          if (_this3.state.delayAction) {\n            _this3.state.delayAction();\n\n            _this3.setState({\n              delayAction: null\n            });\n          }\n        });\n      }\n\n      var disabled = this.state.working || this.state.dialogHidden;\n      return React.createElement(\"div\", {\n        className: \"sanddance-dataExporter\"\n      }, React.createElement(_base.base.fabric.DefaultButton, {\n        className: \"search-action search-bottom-action\",\n        text: _language.strings.buttonExportCount(this.props.data.length),\n        onClick: function onClick() {\n          return _this3.setState({\n            dialogHidden: false\n          });\n        },\n        disabled: this.props.disabled\n      }), React.createElement(_base.base.fabric.Dialog, {\n        hidden: this.state.dialogHidden,\n        onDismiss: closeDialog,\n        dialogContentProps: {\n          className: \"sanddance-dialog \".concat(this.props.theme),\n          type: _base.base.fabric.DialogType.normal,\n          title: _language.strings.labelExport\n        }\n      }, React.createElement(_base.base.fabric.TextField, {\n        label: _language.strings.labelExportFileName,\n        onChange: function onChange(e, displayName) {\n          var displayNameError = getFileNameError(displayName);\n\n          _this3.setState({\n            fileName: displayName,\n            fileNameError: displayNameError\n          });\n        },\n        errorMessage: this.state.fileNameError,\n        value: this.state.fileName\n      }), React.createElement(_base.base.fabric.ChoiceGroup, {\n        className: \"sanddance-form-separate\",\n        disabled: disabled,\n        options: exportTypes.map(function (_ref) {\n          var _ref2 = _slicedToArray(_ref, 2),\n              exportType = _ref2[0],\n              text = _ref2[1];\n\n          return {\n            key: exportType,\n            text: text,\n            disabled: false,\n            checked: exportType === _this3.state.exportType\n          };\n        }),\n        onChange: function onChange(ev, option) {\n          return _this3.setState({\n            exportType: option.key\n          });\n        },\n        label: _language.strings.labelExportFormat\n      }), React.createElement(_base.base.fabric.DialogFooter, null, React.createElement(_base.base.fabric.PrimaryButton, {\n        disabled: disabled || !!this.state.fileNameError,\n        onClick: function onClick(e) {\n          return _this3.setState({\n            delayAction: function delayAction() {\n              return _this3.createExport(_this3.state.exportType, _this3.state.fileName);\n            },\n            working: true\n          });\n        },\n        text: _language.strings.buttonExport\n      }), React.createElement(_base.base.fabric.DefaultButton, {\n        onClick: closeDialog,\n        text: _language.strings.buttonClose\n      }))));\n    }\n  }]);\n\n  return DataExportPicker;\n}(React.Component);\n\nexports.DataExportPicker = DataExportPicker;\nvar illegalChars = '\\\\/:*?\"<>|';\n\nfunction getFileNameError(displayName) {\n  if (!displayName) {\n    return _language.strings.errorExportFilenameEmpty;\n  }\n\n  for (var i = 0; i < illegalChars.length; i++) {\n    if (displayName.indexOf(illegalChars[i]) >= 0) {\n      return _language.strings.errorExportFilenameCharacters(illegalChars);\n    }\n  }\n}\n\nfunction removeExtensions(fileName) {\n  exportTypes.forEach(function (_ref3) {\n    var _ref4 = _slicedToArray(_ref3, 1),\n        exportType = _ref4[0];\n\n    var re = new RegExp(\"\\\\.\".concat(exportType), 'ig');\n    fileName = fileName.replace(re, '');\n  });\n  return fileName;\n}\n\nfunction columnReplacer(name, value) {\n  if (_sanddanceReact.SandDance.util.isInternalFieldName(name, true)) {\n    return undefined;\n  }\n\n  return value === null ? '' : value;\n}\n\nfunction embedScript(csv, displayName, snapshots) {\n  var dataFile = {\n    type: 'csv',\n    displayName: displayName,\n    snapshots: snapshots\n  };\n  return \"<pre id='csv-data' style='display:none'>\".concat(csv, \"</pre>\\n    <script>SandDanceEmbed.load(Object.assign({rawText: document.getElementById('csv-data').innerText}, \").concat(JSON.stringify(dataFile), \"))</script>\");\n}\n\nfunction getEmbedHTML(data, displayName, snapshots) {\n  var json = JSON.stringify(data, columnReplacer);\n  var csv = (0, _exportDelimited.convertToDelimited)(JSON.parse(json), ',');\n  var html = (0, _dataExporterHtml.embedHtml)(\"\".concat(_language.strings.appName, \" - \").concat(escape(displayName)), embedScript(csv, displayName, snapshots));\n  return html;\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../exportDelimited\":\"pP3Y\",\"./dataExporterHtml\":\"fOIZ\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"h2T5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SideTabId = void 0;\nvar SideTabId;\nexports.SideTabId = SideTabId;\n\n(function (SideTabId) {\n  SideTabId[SideTabId[\"ChartType\"] = 0] = \"ChartType\";\n  SideTabId[SideTabId[\"Data\"] = 1] = \"Data\";\n  SideTabId[SideTabId[\"Search\"] = 2] = \"Search\";\n  SideTabId[SideTabId[\"Color\"] = 3] = \"Color\";\n  SideTabId[SideTabId[\"Snapshots\"] = 4] = \"Snapshots\";\n  SideTabId[SideTabId[\"Settings\"] = 5] = \"Settings\";\n  SideTabId[SideTabId[\"Pin\"] = 6] = \"Pin\";\n  SideTabId[SideTabId[\"Collapse\"] = 7] = \"Collapse\";\n})(SideTabId || (exports.SideTabId = SideTabId = {}));\n},{}],\"Dryx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getCanvas = getCanvas;\nexports.removeTabIndex = removeTabIndex;\nexports.capabilities = void 0;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar PresenterElement = _sanddanceReact.SandDance.VegaDeckGl.PresenterElement;\n\nfunction getCanvas(viewer) {\n  var tags = viewer.presenter.getElement(PresenterElement.gl).getElementsByTagName('canvas');\n\n  if (tags) {\n    return tags[0];\n  }\n}\n\nfunction removeTabIndex(viewer) {\n  var canvas = getCanvas(viewer);\n\n  if (canvas) {\n    canvas.tabIndex = -1;\n  }\n}\n\nvar capabilities = {\n  webgl: !!document.createElement('canvas').getContext('webgl'),\n  webgl2: !!document.createElement('canvas').getContext('webgl2')\n};\nexports.capabilities = capabilities;\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"CgE3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getColorSettingsFromThemePalette = getColorSettingsFromThemePalette;\nexports.themePalettes = void 0;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar themePalettes = {};\nexports.themePalettes = themePalettes;\nthemePalettes[''] = {\n  themePrimary: '#0078d4',\n  themeLighterAlt: '#eff6fc',\n  themeLighter: '#deecf9',\n  themeLight: '#c7e0f4',\n  themeTertiary: '#71afe5',\n  themeSecondary: '#2b88d8',\n  themeDarkAlt: '#106ebe',\n  themeDark: '#005a9e',\n  themeDarker: '#004578',\n  neutralLighterAlt: '#f8f8f8',\n  neutralLighter: '#f4f4f4',\n  neutralLight: '#eaeaea',\n  neutralQuaternaryAlt: '#dadada',\n  neutralQuaternary: '#d0d0d0',\n  neutralTertiaryAlt: '#c8c8c8',\n  neutralTertiary: '#c2c2c2',\n  neutralSecondary: '#858585',\n  neutralPrimaryAlt: '#4b4b4b',\n  neutralPrimary: '#333333',\n  neutralDark: '#272727',\n  black: '#1d1d1d',\n  white: '#ffffff'\n};\nthemePalettes['dark-theme'] = {\n  themePrimary: '#00b4f0',\n  themeLighterAlt: '#00070a',\n  themeLighter: '#001d26',\n  themeLight: '#003648',\n  themeTertiary: '#006c90',\n  themeSecondary: '#009ed3',\n  themeDarkAlt: '#18bbf1',\n  themeDark: '#3ac5f3',\n  themeDarker: '#6cd4f6',\n  neutralLighterAlt: '#0b0b0b',\n  neutralLighter: '#151515',\n  neutralLight: '#252525',\n  neutralQuaternaryAlt: '#2f2f2f',\n  neutralQuaternary: '#373737',\n  neutralTertiaryAlt: '#595959',\n  neutralTertiary: '#929292',\n  neutralSecondary: '#a7a7a7',\n  neutralPrimaryAlt: '#b4b4b4',\n  neutralPrimary: '#cccccc',\n  neutralDark: '#d8d8d8',\n  black: '#f5f5f5',\n  white: '#000000'\n};\n\nfunction getColorSettingsFromThemePalette(themePalette) {\n  var colorFromString = _sanddanceReact.SandDance.VegaDeckGl.util.colorFromString;\n  return {\n    axisLine: colorFromString(themePalette.black),\n    axisText: colorFromString(themePalette.black),\n    hoveredCube: colorFromString(themePalette.black),\n    clickableText: colorFromString(themePalette.themeDark),\n    clickableTextHighlight: colorFromString(themePalette.themeSecondary)\n  };\n}\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"dH6z\":[function(require,module,exports) {\n'use strict';\n\nif (\"production\" === 'production') {\n  module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n},{\"./cjs/scheduler.production.min.js\":\"W2Ku\"}],\"MtQn\":[function(require,module,exports) {\n/** @license React v16.12.0\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),q=require(\"scheduler\");function u(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}if(!aa)throw Error(u(227));var ba=null,ca={};\nfunction da(){if(ba)for(var a in ca){var b=ca[a],c=ba.indexOf(a);if(!(-1<c))throw Error(u(96,a));if(!ea[c]){if(!b.extractEvents)throw Error(u(97,a));ea[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(fa.hasOwnProperty(h))throw Error(u(99,h));fa[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ha(k[e],g,h);e=!0}else f.registrationName?(ha(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(u(98,d,a));}}}}\nfunction ha(a,b,c){if(ia[a])throw Error(u(100,a));ia[a]=b;ja[a]=b.eventTypes[c].dependencies}var ea=[],fa={},ia={},ja={};function ka(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var la=!1,ma=null,na=!1,oa=null,pa={onError:function(a){la=!0;ma=a}};function qa(a,b,c,d,e,f,g,h,k){la=!1;ma=null;ka.apply(pa,arguments)}\nfunction ra(a,b,c,d,e,f,g,h,k){qa.apply(this,arguments);if(la){if(la){var l=ma;la=!1;ma=null}else throw Error(u(198));na||(na=!0,oa=l)}}var sa=null,ua=null,va=null;function wa(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=va(c);ra(d,b,void 0,a);a.currentTarget=null}function xa(a,b){if(null==b)throw Error(u(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}\nfunction ya(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var za=null;function Aa(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)wa(a,b[d],c[d]);else b&&wa(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function Ba(a){null!==a&&(za=xa(za,a));a=za;za=null;if(a){ya(a,Aa);if(za)throw Error(u(95));if(na)throw a=oa,na=!1,oa=null,a;}}\nvar Ca={injectEventPluginOrder:function(a){if(ba)throw Error(u(101));ba=Array.prototype.slice.call(a);da()},injectEventPluginsByName:function(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!ca.hasOwnProperty(c)||ca[c]!==d){if(ca[c])throw Error(u(102,c));ca[c]=d;b=!0}}b&&da()}};\nfunction Da(a,b){var c=a.stateNode;if(!c)return null;var d=sa(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==typeof c)throw Error(u(231,b,typeof c));\nreturn c}var Ea=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Ea.hasOwnProperty(\"ReactCurrentDispatcher\")||(Ea.ReactCurrentDispatcher={current:null});Ea.hasOwnProperty(\"ReactCurrentBatchConfig\")||(Ea.ReactCurrentBatchConfig={suspense:null});\nvar Fa=/^(.*)[\\\\\\/]/,w=\"function\"===typeof Symbol&&Symbol.for,Ga=w?Symbol.for(\"react.element\"):60103,Ha=w?Symbol.for(\"react.portal\"):60106,Ia=w?Symbol.for(\"react.fragment\"):60107,Ja=w?Symbol.for(\"react.strict_mode\"):60108,Ka=w?Symbol.for(\"react.profiler\"):60114,La=w?Symbol.for(\"react.provider\"):60109,Ma=w?Symbol.for(\"react.context\"):60110,Na=w?Symbol.for(\"react.concurrent_mode\"):60111,Oa=w?Symbol.for(\"react.forward_ref\"):60112,Pa=w?Symbol.for(\"react.suspense\"):60113,Qa=w?Symbol.for(\"react.suspense_list\"):\n60120,Ra=w?Symbol.for(\"react.memo\"):60115,Sa=w?Symbol.for(\"react.lazy\"):60116;w&&Symbol.for(\"react.fundamental\");w&&Symbol.for(\"react.responder\");w&&Symbol.for(\"react.scope\");var Ta=\"function\"===typeof Symbol&&Symbol.iterator;function Ua(a){if(null===a||\"object\"!==typeof a)return null;a=Ta&&a[Ta]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nfunction Va(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}\nfunction Wa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case Ia:return\"Fragment\";case Ha:return\"Portal\";case Ka:return\"Profiler\";case Ja:return\"StrictMode\";case Pa:return\"Suspense\";case Qa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ma:return\"Context.Consumer\";case La:return\"Context.Provider\";case Oa:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\n\"ForwardRef\");case Ra:return Wa(a.type);case Sa:if(a=1===a._status?a._result:null)return Wa(a)}return null}function Xa(a){var b=\"\";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c=\"\";break a;default:var d=a._debugOwner,e=a._debugSource,f=Wa(a.type);c=null;d&&(c=Wa(d.type));d=f;f=\"\";e?f=\" (at \"+e.fileName.replace(Fa,\"\")+\":\"+e.lineNumber+\")\":c&&(f=\" (created by \"+c+\")\");c=\"\\n    in \"+(d||\"Unknown\")+f}b+=c;a=a.return}while(a);return b}\nvar Ya=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),Za=null,$a=null,ab=null;function bb(a){if(a=ua(a)){if(\"function\"!==typeof Za)throw Error(u(280));var b=sa(a.stateNode);Za(a.stateNode,a.type,b)}}function cb(a){$a?ab?ab.push(a):ab=[a]:$a=a}function db(){if($a){var a=$a,b=ab;ab=$a=null;bb(a);if(b)for(a=0;a<b.length;a++)bb(b[a])}}function eb(a,b){return a(b)}function fb(a,b,c,d){return a(b,c,d)}function gb(){}\nvar hb=eb,ib=!1,jb=!1;function kb(){if(null!==$a||null!==ab)gb(),db()}new Map;var lb=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,mb=Object.prototype.hasOwnProperty,nb={},ob={};\nfunction pb(a){if(mb.call(ob,a))return!0;if(mb.call(nb,a))return!1;if(lb.test(a))return ob[a]=!0;nb[a]=!0;return!1}function qb(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction rb(a,b,c,d){if(null===b||\"undefined\"===typeof b||qb(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function B(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}var D={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){D[a]=new B(a,0,!1,a,null,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];D[b]=new B(b,1,!1,a[1],null,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){D[a]=new B(a,2,!1,a.toLowerCase(),null,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){D[a]=new B(a,2,!1,a,null,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){D[a]=new B(a,3,!1,a.toLowerCase(),null,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){D[a]=new B(a,3,!0,a,null,!1)});[\"capture\",\"download\"].forEach(function(a){D[a]=new B(a,4,!1,a,null,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){D[a]=new B(a,6,!1,a,null,!1)});[\"rowSpan\",\"start\"].forEach(function(a){D[a]=new B(a,5,!1,a.toLowerCase(),null,!1)});var sb=/[\\-:]([a-z])/g;function tb(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(sb,\ntb);D[b]=new B(b,1,!1,a,null,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(sb,tb);D[b]=new B(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(sb,tb);D[b]=new B(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!1)});\nD.xlinkHref=new B(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){D[a]=new B(a,1,!1,a.toLowerCase(),null,!0)});function ub(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}\nfunction vb(a,b,c,d){var e=D.hasOwnProperty(b)?D[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(rb(b,c,e,d)&&(c=null),d||null===e?pb(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nfunction wb(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction xb(a){var b=wb(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function yb(a){a._valueTracker||(a._valueTracker=xb(a))}function zb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=wb(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Ab(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\nfunction Bb(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=ub(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Cb(a,b){b=b.checked;null!=b&&vb(a,\"checked\",b,!1)}\nfunction Eb(a,b){Cb(a,b);var c=ub(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?Fb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&Fb(a,b.type,ub(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction Gb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction Fb(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function Hb(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Ib(a,b){a=n({children:void 0},b);if(b=Hb(b.children))a.children=b;return a}\nfunction Jb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+ub(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction Kb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(u(91));return n({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Lb(a,b){var c=b.value;if(null==c){c=b.defaultValue;b=b.children;if(null!=b){if(null!=c)throw Error(u(92));if(Array.isArray(b)){if(!(1>=b.length))throw Error(u(93));b=b[0]}c=b}null==c&&(c=\"\")}a._wrapperState={initialValue:ub(c)}}\nfunction Mb(a,b){var c=ub(b.value),d=ub(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function Nb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var Ob={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction Pb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Qb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Pb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar Rb,Sb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Ob.svg||\"innerHTML\"in a)a.innerHTML=b;else{Rb=Rb||document.createElement(\"div\");Rb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=Rb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Tb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}function Ub(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Vb={animationend:Ub(\"Animation\",\"AnimationEnd\"),animationiteration:Ub(\"Animation\",\"AnimationIteration\"),animationstart:Ub(\"Animation\",\"AnimationStart\"),transitionend:Ub(\"Transition\",\"TransitionEnd\")},Wb={},Xb={};\nYa&&(Xb=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Vb.animationend.animation,delete Vb.animationiteration.animation,delete Vb.animationstart.animation),\"TransitionEvent\"in window||delete Vb.transitionend.transition);function Yb(a){if(Wb[a])return Wb[a];if(!Vb[a])return a;var b=Vb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Xb)return Wb[a]=b[c];return a}var Zb=Yb(\"animationend\"),$b=Yb(\"animationiteration\"),ac=Yb(\"animationstart\"),bc=Yb(\"transitionend\"),cc=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \");\nfunction ec(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function fc(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function gc(a){if(ec(a)!==a)throw Error(u(188));}\nfunction hc(a){var b=a.alternate;if(!b){b=ec(a);if(null===b)throw Error(u(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return gc(e),a;if(f===d)return gc(e),b;f=f.sibling}throw Error(u(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(u(189));}}if(c.alternate!==d)throw Error(u(190));}if(3!==c.tag)throw Error(u(188));return c.stateNode.current===c?a:b}function ic(a){a=hc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nvar jc,kc,lc,mc=!1,nc=[],oc=null,pc=null,qc=null,rc=new Map,sc=new Map,tc=[],uc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit\".split(\" \"),vc=\"focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture\".split(\" \");\nfunction wc(a){var b=xc(a);uc.forEach(function(c){yc(c,a,b)});vc.forEach(function(c){yc(c,a,b)})}function zc(a,b,c,d){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:d}}function Ac(a,b){switch(a){case \"focus\":case \"blur\":oc=null;break;case \"dragenter\":case \"dragleave\":pc=null;break;case \"mouseover\":case \"mouseout\":qc=null;break;case \"pointerover\":case \"pointerout\":rc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":sc.delete(b.pointerId)}}\nfunction Bc(a,b,c,d,e){if(null===a||a.nativeEvent!==e)return a=zc(b,c,d,e),null!==b&&(b=Cc(b),null!==b&&kc(b)),a;a.eventSystemFlags|=d;return a}function Dc(a,b,c,d){switch(b){case \"focus\":return oc=Bc(oc,a,b,c,d),!0;case \"dragenter\":return pc=Bc(pc,a,b,c,d),!0;case \"mouseover\":return qc=Bc(qc,a,b,c,d),!0;case \"pointerover\":var e=d.pointerId;rc.set(e,Bc(rc.get(e)||null,a,b,c,d));return!0;case \"gotpointercapture\":return e=d.pointerId,sc.set(e,Bc(sc.get(e)||null,a,b,c,d)),!0}return!1}\nfunction Ec(a){var b=Fc(a.target);if(null!==b){var c=ec(b);if(null!==c)if(b=c.tag,13===b){if(b=fc(c),null!==b){a.blockedOn=b;q.unstable_runWithPriority(a.priority,function(){lc(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Gc(a){if(null!==a.blockedOn)return!1;var b=Hc(a.topLevelType,a.eventSystemFlags,a.nativeEvent);if(null!==b){var c=Cc(b);null!==c&&kc(c);a.blockedOn=b;return!1}return!0}\nfunction Ic(a,b,c){Gc(a)&&c.delete(b)}function Jc(){for(mc=!1;0<nc.length;){var a=nc[0];if(null!==a.blockedOn){a=Cc(a.blockedOn);null!==a&&jc(a);break}var b=Hc(a.topLevelType,a.eventSystemFlags,a.nativeEvent);null!==b?a.blockedOn=b:nc.shift()}null!==oc&&Gc(oc)&&(oc=null);null!==pc&&Gc(pc)&&(pc=null);null!==qc&&Gc(qc)&&(qc=null);rc.forEach(Ic);sc.forEach(Ic)}function Kc(a,b){a.blockedOn===b&&(a.blockedOn=null,mc||(mc=!0,q.unstable_scheduleCallback(q.unstable_NormalPriority,Jc)))}\nfunction Lc(a){function b(b){return Kc(b,a)}if(0<nc.length){Kc(nc[0],a);for(var c=1;c<nc.length;c++){var d=nc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==oc&&Kc(oc,a);null!==pc&&Kc(pc,a);null!==qc&&Kc(qc,a);rc.forEach(b);sc.forEach(b);for(c=0;c<tc.length;c++)d=tc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<tc.length&&(c=tc[0],null===c.blockedOn);)Ec(c),null===c.blockedOn&&tc.shift()}\nfunction Mc(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function Nc(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}function Oc(a,b,c){if(b=Da(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a)}\nfunction Pc(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Nc(b);for(b=c.length;0<b--;)Oc(c[b],\"captured\",a);for(b=0;b<c.length;b++)Oc(c[b],\"bubbled\",a)}}function Qc(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Da(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a))}function Rc(a){a&&a.dispatchConfig.registrationName&&Qc(a._targetInst,null,a)}\nfunction Sc(a){ya(a,Pc)}function Tc(){return!0}function Uc(){return!1}function E(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?Tc:Uc;this.isPropagationStopped=Uc;return this}\nn(E.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=Tc)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=Tc)},persist:function(){this.isPersistent=Tc},isPersistent:Uc,destructor:function(){var a=this.constructor.Interface,\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=Uc;this._dispatchInstances=this._dispatchListeners=null}});E.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nE.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;Vc(c);return c};Vc(E);function Wc(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}\nfunction Xc(a){if(!(a instanceof this))throw Error(u(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function Vc(a){a.eventPool=[];a.getPooled=Wc;a.release=Xc}var Yc=E.extend({animationName:null,elapsedTime:null,pseudoElement:null}),Zc=E.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),$c=E.extend({view:null,detail:null}),ad=$c.extend({relatedTarget:null});\nfunction bd(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar cd={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},dd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},ed={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function gd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=ed[a])?!!b[a]:!1}function hd(){return gd}\nvar id=$c.extend({key:function(a){if(a.key){var b=cd[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=bd(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?dd[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:hd,charCode:function(a){return\"keypress\"===a.type?bd(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?bd(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),jd=0,kd=0,ld=!1,md=!1,nd=$c.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:hd,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if(\"movementX\"in a)return a.movementX;var b=jd;jd=a.screenX;return ld?\"mousemove\"===a.type?a.screenX-\nb:0:(ld=!0,0)},movementY:function(a){if(\"movementY\"in a)return a.movementY;var b=kd;kd=a.screenY;return md?\"mousemove\"===a.type?a.screenY-b:0:(md=!0,0)}}),od=nd.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),pd=nd.extend({dataTransfer:null}),qd=$c.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:hd}),rd=E.extend({propertyName:null,\nelapsedTime:null,pseudoElement:null}),sd=nd.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),td=[[\"blur\",\"blur\",0],[\"cancel\",\"cancel\",0],[\"click\",\"click\",0],[\"close\",\"close\",0],[\"contextmenu\",\"contextMenu\",0],[\"copy\",\"copy\",0],[\"cut\",\"cut\",0],[\"auxclick\",\"auxClick\",0],[\"dblclick\",\"doubleClick\",0],[\"dragend\",\"dragEnd\",\n0],[\"dragstart\",\"dragStart\",0],[\"drop\",\"drop\",0],[\"focus\",\"focus\",0],[\"input\",\"input\",0],[\"invalid\",\"invalid\",0],[\"keydown\",\"keyDown\",0],[\"keypress\",\"keyPress\",0],[\"keyup\",\"keyUp\",0],[\"mousedown\",\"mouseDown\",0],[\"mouseup\",\"mouseUp\",0],[\"paste\",\"paste\",0],[\"pause\",\"pause\",0],[\"play\",\"play\",0],[\"pointercancel\",\"pointerCancel\",0],[\"pointerdown\",\"pointerDown\",0],[\"pointerup\",\"pointerUp\",0],[\"ratechange\",\"rateChange\",0],[\"reset\",\"reset\",0],[\"seeked\",\"seeked\",0],[\"submit\",\"submit\",0],[\"touchcancel\",\"touchCancel\",\n0],[\"touchend\",\"touchEnd\",0],[\"touchstart\",\"touchStart\",0],[\"volumechange\",\"volumeChange\",0],[\"drag\",\"drag\",1],[\"dragenter\",\"dragEnter\",1],[\"dragexit\",\"dragExit\",1],[\"dragleave\",\"dragLeave\",1],[\"dragover\",\"dragOver\",1],[\"mousemove\",\"mouseMove\",1],[\"mouseout\",\"mouseOut\",1],[\"mouseover\",\"mouseOver\",1],[\"pointermove\",\"pointerMove\",1],[\"pointerout\",\"pointerOut\",1],[\"pointerover\",\"pointerOver\",1],[\"scroll\",\"scroll\",1],[\"toggle\",\"toggle\",1],[\"touchmove\",\"touchMove\",1],[\"wheel\",\"wheel\",1],[\"abort\",\"abort\",\n2],[Zb,\"animationEnd\",2],[$b,\"animationIteration\",2],[ac,\"animationStart\",2],[\"canplay\",\"canPlay\",2],[\"canplaythrough\",\"canPlayThrough\",2],[\"durationchange\",\"durationChange\",2],[\"emptied\",\"emptied\",2],[\"encrypted\",\"encrypted\",2],[\"ended\",\"ended\",2],[\"error\",\"error\",2],[\"gotpointercapture\",\"gotPointerCapture\",2],[\"load\",\"load\",2],[\"loadeddata\",\"loadedData\",2],[\"loadedmetadata\",\"loadedMetadata\",2],[\"loadstart\",\"loadStart\",2],[\"lostpointercapture\",\"lostPointerCapture\",2],[\"playing\",\"playing\",2],[\"progress\",\n\"progress\",2],[\"seeking\",\"seeking\",2],[\"stalled\",\"stalled\",2],[\"suspend\",\"suspend\",2],[\"timeupdate\",\"timeUpdate\",2],[bc,\"transitionEnd\",2],[\"waiting\",\"waiting\",2]],ud={},vd={},wd=0;for(;wd<td.length;wd++){var yd=td[wd],zd=yd[0],Ad=yd[1],Bd=yd[2],Cd=\"on\"+(Ad[0].toUpperCase()+Ad.slice(1)),Dd={phasedRegistrationNames:{bubbled:Cd,captured:Cd+\"Capture\"},dependencies:[zd],eventPriority:Bd};ud[Ad]=Dd;vd[zd]=Dd}\nvar Ed={eventTypes:ud,getEventPriority:function(a){a=vd[a];return void 0!==a?a.eventPriority:2},extractEvents:function(a,b,c,d){var e=vd[a];if(!e)return null;switch(a){case \"keypress\":if(0===bd(c))return null;case \"keydown\":case \"keyup\":a=id;break;case \"blur\":case \"focus\":a=ad;break;case \"click\":if(2===c.button)return null;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":a=nd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":a=\npd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":a=qd;break;case Zb:case $b:case ac:a=Yc;break;case bc:a=rd;break;case \"scroll\":a=$c;break;case \"wheel\":a=sd;break;case \"copy\":case \"cut\":case \"paste\":a=Zc;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":a=od;break;default:a=E}b=a.getPooled(e,b,c,d);Sc(b);return b}},Fd=q.unstable_UserBlockingPriority,\nGd=q.unstable_runWithPriority,Hd=Ed.getEventPriority,Id=10,Jd=[];\nfunction Kd(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=Fc(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Mc(a.nativeEvent);d=a.topLevelType;for(var f=a.nativeEvent,g=a.eventSystemFlags,h=null,k=0;k<ea.length;k++){var l=ea[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=xa(h,l))}Ba(h)}}\nvar Ld=!0;function F(a,b){Md(b,a,!1)}function Md(a,b,c){switch(Hd(b)){case 0:var d=Nd.bind(null,b,1);break;case 1:d=Od.bind(null,b,1);break;default:d=Pd.bind(null,b,1)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function Nd(a,b,c){ib||gb();var d=Pd,e=ib;ib=!0;try{fb(d,a,b,c)}finally{(ib=e)||kb()}}function Od(a,b,c){Gd(Fd,Pd.bind(null,a,b,c))}\nfunction Qd(a,b,c,d){if(Jd.length){var e=Jd.pop();e.topLevelType=a;e.eventSystemFlags=b;e.nativeEvent=c;e.targetInst=d;a=e}else a={topLevelType:a,eventSystemFlags:b,nativeEvent:c,targetInst:d,ancestors:[]};try{if(b=Kd,c=a,jb)b(c,void 0);else{jb=!0;try{hb(b,c,void 0)}finally{jb=!1,kb()}}}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,Jd.length<Id&&Jd.push(a)}}\nfunction Pd(a,b,c){if(Ld)if(0<nc.length&&-1<uc.indexOf(a))a=zc(null,a,b,c),nc.push(a);else{var d=Hc(a,b,c);null===d?Ac(a,c):-1<uc.indexOf(a)?(a=zc(d,a,b,c),nc.push(a)):Dc(d,a,b,c)||(Ac(a,c),Qd(a,b,c,null))}}function Hc(a,b,c){var d=Mc(c);d=Fc(d);if(null!==d){var e=ec(d);if(null===e)d=null;else{var f=e.tag;if(13===f){d=fc(e);if(null!==d)return d;d=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;d=null}else e!==d&&(d=null)}}Qd(a,b,c,d);return null}\nfunction Rd(a){if(!Ya)return!1;a=\"on\"+a;var b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}var Sd=new (\"function\"===typeof WeakMap?WeakMap:Map);function xc(a){var b=Sd.get(a);void 0===b&&(b=new Set,Sd.set(a,b));return b}\nfunction yc(a,b,c){if(!c.has(a)){switch(a){case \"scroll\":Md(b,\"scroll\",!0);break;case \"focus\":case \"blur\":Md(b,\"focus\",!0);Md(b,\"blur\",!0);c.add(\"blur\");c.add(\"focus\");break;case \"cancel\":case \"close\":Rd(a)&&Md(b,a,!0);break;case \"invalid\":case \"submit\":case \"reset\":break;default:-1===cc.indexOf(a)&&F(a,b)}c.add(a)}}\nvar Td={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ud=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Td).forEach(function(a){Ud.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);Td[b]=Td[a]})});function Vd(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||Td.hasOwnProperty(a)&&Td[a]?(\"\"+b).trim():b+\"px\"}\nfunction Wd(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=Vd(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var Xd=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction Yd(a,b){if(b){if(Xd[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(u(137,a,\"\"));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(u(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw Error(u(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(u(62,\"\"));}}\nfunction Zd(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}function $d(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=xc(a);b=ja[b];for(var d=0;d<b.length;d++)yc(b[d],a,c)}function ae(){}\nfunction be(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function ce(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function de(a,b){var c=ce(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=ce(c)}}\nfunction ee(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?ee(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function fe(){for(var a=window,b=be();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=be(a.document)}return b}\nfunction ge(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}var he=\"$\",ie=\"/$\",je=\"$?\",ke=\"$!\",le=null,me=null;function ne(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nfunction oe(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var pe=\"function\"===typeof setTimeout?setTimeout:void 0,qe=\"function\"===typeof clearTimeout?clearTimeout:void 0;function re(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}\nfunction se(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===he||c===ke||c===je){if(0===b)return a;b--}else c===ie&&b++}a=a.previousSibling}return null}var te=Math.random().toString(36).slice(2),ue=\"__reactInternalInstance$\"+te,ve=\"__reactEventHandlers$\"+te,we=\"__reactContainere$\"+te;\nfunction Fc(a){var b=a[ue];if(b)return b;for(var c=a.parentNode;c;){if(b=c[we]||c[ue]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=se(a);null!==a;){if(c=a[ue])return c;a=se(a)}return b}a=c;c=a.parentNode}return null}function Cc(a){a=a[ue]||a[we];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function xe(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(u(33));}function ye(a){return a[ve]||null}var ze=null,Ae=null,Be=null;\nfunction Ce(){if(Be)return Be;var a,b=Ae,c=b.length,d,e=\"value\"in ze?ze.value:ze.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return Be=e.slice(a,1<d?1-d:void 0)}var De=E.extend({data:null}),Ee=E.extend({data:null}),Fe=[9,13,27,32],Ge=Ya&&\"CompositionEvent\"in window,He=null;Ya&&\"documentMode\"in document&&(He=document.documentMode);\nvar Ie=Ya&&\"TextEvent\"in window&&!He,Je=Ya&&(!Ge||He&&8<He&&11>=He),Ke=String.fromCharCode(32),Le={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},Me=!1;\nfunction Ne(a,b){switch(a){case \"keyup\":return-1!==Fe.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function Oe(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var Pe=!1;function Qe(a,b){switch(a){case \"compositionend\":return Oe(b);case \"keypress\":if(32!==b.which)return null;Me=!0;return Ke;case \"textInput\":return a=b.data,a===Ke&&Me?null:a;default:return null}}\nfunction Re(a,b){if(Pe)return\"compositionend\"===a||!Ge&&Ne(a,b)?(a=Ce(),Be=Ae=ze=null,Pe=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return Je&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar Se={eventTypes:Le,extractEvents:function(a,b,c,d){var e;if(Ge)b:{switch(a){case \"compositionstart\":var f=Le.compositionStart;break b;case \"compositionend\":f=Le.compositionEnd;break b;case \"compositionupdate\":f=Le.compositionUpdate;break b}f=void 0}else Pe?Ne(a,c)&&(f=Le.compositionEnd):\"keydown\"===a&&229===c.keyCode&&(f=Le.compositionStart);f?(Je&&\"ko\"!==c.locale&&(Pe||f!==Le.compositionStart?f===Le.compositionEnd&&Pe&&(e=Ce()):(ze=d,Ae=\"value\"in ze?ze.value:ze.textContent,Pe=!0)),f=De.getPooled(f,\nb,c,d),e?f.data=e:(e=Oe(c),null!==e&&(f.data=e)),Sc(f),e=f):e=null;(a=Ie?Qe(a,c):Re(a,c))?(b=Ee.getPooled(Le.beforeInput,b,c,d),b.data=a,Sc(b)):b=null;return null===e?b:null===b?e:[e,b]}},Te={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Ue(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!Te[a.type]:\"textarea\"===b?!0:!1}\nvar Ve={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"blur change click focus input keydown keyup selectionchange\".split(\" \")}};function We(a,b,c){a=E.getPooled(Ve.change,a,b,c);a.type=\"change\";cb(c);Sc(a);return a}var Xe=null,Ye=null;function Ze(a){Ba(a)}function $e(a){var b=xe(a);if(zb(b))return a}function af(a,b){if(\"change\"===a)return b}var bf=!1;Ya&&(bf=Rd(\"input\")&&(!document.documentMode||9<document.documentMode));\nfunction cf(){Xe&&(Xe.detachEvent(\"onpropertychange\",df),Ye=Xe=null)}function df(a){if(\"value\"===a.propertyName&&$e(Ye))if(a=We(Ye,a,Mc(a)),ib)Ba(a);else{ib=!0;try{eb(Ze,a)}finally{ib=!1,kb()}}}function ef(a,b,c){\"focus\"===a?(cf(),Xe=b,Ye=c,Xe.attachEvent(\"onpropertychange\",df)):\"blur\"===a&&cf()}function ff(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return $e(Ye)}function gf(a,b){if(\"click\"===a)return $e(b)}function hf(a,b){if(\"input\"===a||\"change\"===a)return $e(b)}\nvar jf={eventTypes:Ve,_isInputEventSupported:bf,extractEvents:function(a,b,c,d){var e=b?xe(b):window,f=e.nodeName&&e.nodeName.toLowerCase();if(\"select\"===f||\"input\"===f&&\"file\"===e.type)var g=af;else if(Ue(e))if(bf)g=hf;else{g=ff;var h=ef}else(f=e.nodeName)&&\"input\"===f.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(g=gf);if(g&&(g=g(a,b)))return We(g,c,d);h&&h(a,e,b);\"blur\"===a&&(a=e._wrapperState)&&a.controlled&&\"number\"===e.type&&Fb(e,\"number\",e.value)}},kf={mouseEnter:{registrationName:\"onMouseEnter\",\ndependencies:[\"mouseout\",\"mouseover\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"mouseout\",\"mouseover\"]},pointerEnter:{registrationName:\"onPointerEnter\",dependencies:[\"pointerout\",\"pointerover\"]},pointerLeave:{registrationName:\"onPointerLeave\",dependencies:[\"pointerout\",\"pointerover\"]}},lf,mf={eventTypes:kf,extractEvents:function(a,b,c,d,e){var f=\"mouseover\"===a||\"pointerover\"===a,g=\"mouseout\"===a||\"pointerout\"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;\ne=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?Fc(b):null,null!==b&&(f=ec(b),b!==f||5!==b.tag&&6!==b.tag))b=null}else g=null;if(g===b)return null;if(\"mouseout\"===a||\"mouseover\"===a){var h=nd;var k=kf.mouseLeave;var l=kf.mouseEnter;var m=\"mouse\"}else if(\"pointerout\"===a||\"pointerover\"===a)h=od,k=kf.pointerLeave,l=kf.pointerEnter,m=\"pointer\";a=null==g?e:xe(g);e=null==b?e:xe(b);k=h.getPooled(k,g,c,d);k.type=m+\"leave\";k.target=\na;k.relatedTarget=e;d=h.getPooled(l,b,c,d);d.type=m+\"enter\";d.target=e;d.relatedTarget=a;h=g;m=b;if(h&&m)a:{l=h;a=m;g=0;for(b=l;b;b=Nc(b))g++;b=0;for(e=a;e;e=Nc(e))b++;for(;0<g-b;)l=Nc(l),g--;for(;0<b-g;)a=Nc(a),b--;for(;g--;){if(l===a||l===a.alternate)break a;l=Nc(l);a=Nc(a)}l=null}else l=null;a=l;for(l=[];h&&h!==a;){g=h.alternate;if(null!==g&&g===a)break;l.push(h);h=Nc(h)}for(h=[];m&&m!==a;){g=m.alternate;if(null!==g&&g===a)break;h.push(m);m=Nc(m)}for(m=0;m<l.length;m++)Qc(l[m],\"bubbled\",k);for(m=\nh.length;0<m--;)Qc(h[m],\"captured\",d);if(c===lf)return lf=null,[k];lf=c;return[k,d]}};function nf(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var of=\"function\"===typeof Object.is?Object.is:nf,pf=Object.prototype.hasOwnProperty;function qf(a,b){if(of(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!pf.call(b,c[d])||!of(a[c[d]],b[c[d]]))return!1;return!0}\nvar rf=Ya&&\"documentMode\"in document&&11>=document.documentMode,sf={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},tf=null,uf=null,vf=null,wf=!1;\nfunction xf(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(wf||null==tf||tf!==be(c))return null;c=tf;\"selectionStart\"in c&&ge(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return vf&&qf(vf,c)?null:(vf=c,a=E.getPooled(sf.select,uf,a,b),a.type=\"select\",a.target=tf,Sc(a),a)}\nvar yf={eventTypes:sf,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=xc(e);f=ja.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?xe(b):window;switch(a){case \"focus\":if(Ue(e)||\"true\"===e.contentEditable)tf=e,uf=b,vf=null;break;case \"blur\":vf=uf=tf=null;break;case \"mousedown\":wf=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":return wf=!1,xf(c,d);case \"selectionchange\":if(rf)break;\ncase \"keydown\":case \"keyup\":return xf(c,d)}return null}};Ca.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));var zf=Cc;sa=ye;ua=zf;va=xe;Ca.injectEventPluginsByName({SimpleEventPlugin:Ed,EnterLeaveEventPlugin:mf,ChangeEventPlugin:jf,SelectEventPlugin:yf,BeforeInputEventPlugin:Se});new Set;var Af=[],Bf=-1;function G(a){0>Bf||(a.current=Af[Bf],Af[Bf]=null,Bf--)}\nfunction I(a,b){Bf++;Af[Bf]=a.current;a.current=b}var Cf={},J={current:Cf},K={current:!1},Df=Cf;function Ef(a,b){var c=a.type.contextTypes;if(!c)return Cf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function L(a){a=a.childContextTypes;return null!==a&&void 0!==a}\nfunction Ff(a){G(K,a);G(J,a)}function Gf(a){G(K,a);G(J,a)}function Hf(a,b,c){if(J.current!==Cf)throw Error(u(168));I(J,b,a);I(K,c,a)}function If(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(u(108,Wa(b)||\"Unknown\",e));return n({},c,{},d)}function Jf(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||Cf;Df=J.current;I(J,b,a);I(K,K.current,a);return!0}\nfunction Kf(a,b,c){var d=a.stateNode;if(!d)throw Error(u(169));c?(b=If(a,b,Df),d.__reactInternalMemoizedMergedChildContext=b,G(K,a),G(J,a),I(J,b,a)):G(K,a);I(K,c,a)}\nvar Lf=q.unstable_runWithPriority,Mf=q.unstable_scheduleCallback,Nf=q.unstable_cancelCallback,Of=q.unstable_shouldYield,Pf=q.unstable_requestPaint,Qf=q.unstable_now,Rf=q.unstable_getCurrentPriorityLevel,Sf=q.unstable_ImmediatePriority,Tf=q.unstable_UserBlockingPriority,Uf=q.unstable_NormalPriority,Vf=q.unstable_LowPriority,Wf=q.unstable_IdlePriority,Xf={},Yf=void 0!==Pf?Pf:function(){},Zf=null,$f=null,ag=!1,bg=Qf(),cg=1E4>bg?Qf:function(){return Qf()-bg};\nfunction dg(){switch(Rf()){case Sf:return 99;case Tf:return 98;case Uf:return 97;case Vf:return 96;case Wf:return 95;default:throw Error(u(332));}}function eg(a){switch(a){case 99:return Sf;case 98:return Tf;case 97:return Uf;case 96:return Vf;case 95:return Wf;default:throw Error(u(332));}}function fg(a,b){a=eg(a);return Lf(a,b)}function gg(a,b,c){a=eg(a);return Mf(a,b,c)}function hg(a){null===Zf?(Zf=[a],$f=Mf(Sf,ig)):Zf.push(a);return Xf}function jg(){if(null!==$f){var a=$f;$f=null;Nf(a)}ig()}\nfunction ig(){if(!ag&&null!==Zf){ag=!0;var a=0;try{var b=Zf;fg(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});Zf=null}catch(c){throw null!==Zf&&(Zf=Zf.slice(a+1)),Mf(Sf,jg),c;}finally{ag=!1}}}var kg=3;function lg(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function mg(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}var ng={current:null},og=null,pg=null,qg=null;function rg(){qg=pg=og=null}\nfunction sg(a,b){var c=a.type._context;I(ng,c._currentValue,a);c._currentValue=b}function tg(a){var b=ng.current;G(ng,a);a.type._context._currentValue=b}function ug(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}\nfunction vg(a,b){og=a;qg=pg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(wg=!0),a.firstContext=null)}function xg(a,b){if(qg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)qg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===pg){if(null===og)throw Error(u(308));pg=b;og.dependencies={expirationTime:0,firstContext:b,responders:null}}else pg=pg.next=b}return a._currentValue}var yg=!1;\nfunction zg(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Ag(a){return{baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}\nfunction Bg(a,b){return{expirationTime:a,suspenseConfig:b,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function Cg(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}\nfunction Dg(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=zg(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=zg(a.memoizedState),e=c.updateQueue=zg(c.memoizedState)):d=a.updateQueue=Ag(e):null===e&&(e=c.updateQueue=Ag(d));null===e||d===e?Cg(d,b):null===d.lastUpdate||null===e.lastUpdate?(Cg(d,b),Cg(e,b)):(Cg(d,b),e.lastUpdate=b)}\nfunction Eg(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=zg(a.memoizedState):Fg(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b)}function Fg(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=Ag(b));return b}\nfunction Gg(a,b,c,d,e,f){switch(c.tag){case 1:return a=c.payload,\"function\"===typeof a?a.call(f,d,e):a;case 3:a.effectTag=a.effectTag&-4097|64;case 0:a=c.payload;e=\"function\"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return n({},d,e);case 2:yg=!0}return d}\nfunction Hg(a,b,c,d,e){yg=!1;b=Fg(a,b);for(var f=b.baseState,g=null,h=0,k=b.firstUpdate,l=f;null!==k;){var m=k.expirationTime;m<e?(null===g&&(g=k,f=l),h<m&&(h=m)):(Ig(m,k.suspenseConfig),l=Gg(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastEffect?b.firstEffect=b.lastEffect=k:(b.lastEffect.nextEffect=k,b.lastEffect=k)));k=k.next}m=null;for(k=b.firstCapturedUpdate;null!==k;){var C=k.expirationTime;C<e?(null===m&&(m=k,null===g&&(f=l)),h<C&&(h=C)):(l=Gg(a,b,k,l,c,d),null!==\nk.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastCapturedEffect?b.firstCapturedEffect=b.lastCapturedEffect=k:(b.lastCapturedEffect.nextEffect=k,b.lastCapturedEffect=k)));k=k.next}null===g&&(b.lastUpdate=null);null===m?b.lastCapturedUpdate=null:a.effectTag|=32;null===g&&null===m&&(f=l);b.baseState=f;b.firstUpdate=g;b.firstCapturedUpdate=m;Jg(h);a.expirationTime=h;a.memoizedState=l}\nfunction Kg(a,b,c){null!==b.firstCapturedUpdate&&(null!==b.lastUpdate&&(b.lastUpdate.next=b.firstCapturedUpdate,b.lastUpdate=b.lastCapturedUpdate),b.firstCapturedUpdate=b.lastCapturedUpdate=null);Lg(b.firstEffect,c);b.firstEffect=b.lastEffect=null;Lg(b.firstCapturedEffect,c);b.firstCapturedEffect=b.lastCapturedEffect=null}function Lg(a,b){for(;null!==a;){var c=a.callback;if(null!==c){a.callback=null;var d=b;if(\"function\"!==typeof c)throw Error(u(191,c));c.call(d)}a=a.nextEffect}}\nvar Mg=Ea.ReactCurrentBatchConfig,Ng=(new aa.Component).refs;function Og(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}\nvar Sg={isMounted:function(a){return(a=a._reactInternalFiber)?ec(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Pg(),e=Mg.suspense;d=Qg(d,a,e);e=Bg(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Dg(a,e);Rg(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Pg(),e=Mg.suspense;d=Qg(d,a,e);e=Bg(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);Dg(a,e);Rg(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Pg(),d=Mg.suspense;\nc=Qg(c,a,d);d=Bg(c,d);d.tag=2;void 0!==b&&null!==b&&(d.callback=b);Dg(a,d);Rg(a,c)}};function Tg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!qf(c,d)||!qf(e,f):!0}\nfunction Ug(a,b,c){var d=!1,e=Cf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=xg(f):(e=L(b)?Df:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Ef(a,e):Cf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Sg;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Vg(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Sg.enqueueReplaceState(b,b.state,null)}\nfunction Wg(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Ng;var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=xg(f):(f=L(b)?Df:J.current,e.context=Ef(a,f));f=a.updateQueue;null!==f&&(Hg(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Og(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==\ntypeof e.componentWillMount||(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Sg.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(Hg(a,f,c,e,d),e.state=a.memoizedState));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var Xg=Array.isArray;\nfunction Yg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(u(309));var d=c.stateNode}if(!d)throw Error(u(147,a));var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Ng&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw Error(u(284));if(!c._owner)throw Error(u(290,a));}return a}\nfunction Zg(a,b){if(\"textarea\"!==a.type)throw Error(u(31,\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\"));}\nfunction $g(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=ah(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\n2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=bh(c,a.mode,d),b.return=a,b;b=e(b,c,d);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props,d),d.ref=Yg(a,b,c),d.return=a,d;d=ch(c.type,c.key,c.props,null,a.mode,d);d.ref=Yg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==\nc.implementation)return b=dh(c,a.mode,d),b.return=a,b;b=e(b,c.children||[],d);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=eh(c,a.mode,d,f),b.return=a,b;b=e(b,c,d);b.return=a;return b}function C(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=bh(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case Ga:return c=ch(b.type,b.key,b.props,null,a.mode,c),c.ref=Yg(a,null,b),c.return=a,c;case Ha:return b=dh(b,a.mode,c),b.return=a,b}if(Xg(b)||\nUa(b))return b=eh(b,a.mode,c,null),b.return=a,b;Zg(a,b)}return null}function y(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case Ga:return c.key===e?c.type===Ia?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case Ha:return c.key===e?l(a,b,c,d):null}if(Xg(c)||Ua(c))return null!==e?null:m(a,b,c,d,null);Zg(a,c)}return null}function H(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=\na.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case Ga:return a=a.get(null===d.key?c:d.key)||null,d.type===Ia?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case Ha:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Xg(d)||Ua(d))return a=a.get(c)||null,m(b,a,d,e,null);Zg(b,d)}return null}function z(e,g,h,k){for(var l=null,m=null,r=g,x=g=0,A=null;null!==r&&x<h.length;x++){r.index>x?(A=r,r=null):A=r.sibling;var p=y(e,r,h[x],k);if(null===p){null===r&&(r=A);break}a&&\nr&&null===p.alternate&&b(e,r);g=f(p,g,x);null===m?l=p:m.sibling=p;m=p;r=A}if(x===h.length)return c(e,r),l;if(null===r){for(;x<h.length;x++)r=C(e,h[x],k),null!==r&&(g=f(r,g,x),null===m?l=r:m.sibling=r,m=r);return l}for(r=d(e,r);x<h.length;x++)A=H(r,e,x,h[x],k),null!==A&&(a&&null!==A.alternate&&r.delete(null===A.key?x:A.key),g=f(A,g,x),null===m?l=A:m.sibling=A,m=A);a&&r.forEach(function(a){return b(e,a)});return l}function ta(e,g,h,k){var l=Ua(h);if(\"function\"!==typeof l)throw Error(u(150));h=l.call(h);\nif(null==h)throw Error(u(151));for(var m=l=null,r=g,x=g=0,A=null,p=h.next();null!==r&&!p.done;x++,p=h.next()){r.index>x?(A=r,r=null):A=r.sibling;var z=y(e,r,p.value,k);if(null===z){null===r&&(r=A);break}a&&r&&null===z.alternate&&b(e,r);g=f(z,g,x);null===m?l=z:m.sibling=z;m=z;r=A}if(p.done)return c(e,r),l;if(null===r){for(;!p.done;x++,p=h.next())p=C(e,p.value,k),null!==p&&(g=f(p,g,x),null===m?l=p:m.sibling=p,m=p);return l}for(r=d(e,r);!p.done;x++,p=h.next())p=H(r,e,x,p.value,k),null!==p&&(a&&null!==\np.alternate&&r.delete(null===p.key?x:p.key),g=f(p,g,x),null===m?l=p:m.sibling=p,m=p);a&&r.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===Ia&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Ga:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(7===k.tag?f.type===Ia:k.elementType===f.type){c(a,k.sibling);d=e(k,f.type===Ia?f.props.children:f.props,h);d.ref=Yg(a,k,f);d.return=a;a=d;break a}else{c(a,\nk);break}else b(a,k);k=k.sibling}f.type===Ia?(d=eh(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=ch(f.type,f.key,f.props,null,a.mode,h),h.ref=Yg(a,d,f),h.return=a,a=h)}return g(a);case Ha:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=dh(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===\ntypeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=a,a=d):(c(a,d),d=bh(f,a.mode,h),d.return=a,a=d),g(a);if(Xg(f))return z(a,d,f,h);if(Ua(f))return ta(a,d,f,h);l&&Zg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,Error(u(152,a.displayName||a.name||\"Component\"));}return c(a,d)}}var fh=$g(!0),gh=$g(!1),hh={},ih={current:hh},jh={current:hh},kh={current:hh};function lh(a){if(a===hh)throw Error(u(174));return a}\nfunction mh(a,b){I(kh,b,a);I(jh,a,a);I(ih,hh,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Qb(null,\"\");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=Qb(b,c)}G(ih,a);I(ih,b,a)}function nh(a){G(ih,a);G(jh,a);G(kh,a)}function oh(a){lh(kh.current);var b=lh(ih.current);var c=Qb(b,a.type);b!==c&&(I(jh,a,a),I(ih,c,a))}function ph(a){jh.current===a&&(G(ih,a),G(jh,a))}var M={current:0};\nfunction qh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===je||c.data===ke))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function rh(a,b){return{responder:a,props:b}}\nvar sh=Ea.ReactCurrentDispatcher,N=Ea.ReactCurrentBatchConfig,th=0,uh=null,O=null,vh=null,wh=null,P=null,xh=null,yh=0,zh=null,Ah=0,Bh=!1,Ch=null,Gh=0;function Q(){throw Error(u(321));}function Hh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!of(a[c],b[c]))return!1;return!0}\nfunction Ih(a,b,c,d,e,f){th=f;uh=b;vh=null!==a?a.memoizedState:null;sh.current=null===vh?Jh:Kh;b=c(d,e);if(Bh){do Bh=!1,Gh+=1,vh=null!==a?a.memoizedState:null,xh=wh,zh=P=O=null,sh.current=Kh,b=c(d,e);while(Bh);Ch=null;Gh=0}sh.current=Lh;a=uh;a.memoizedState=wh;a.expirationTime=yh;a.updateQueue=zh;a.effectTag|=Ah;a=null!==O&&null!==O.next;th=0;xh=P=wh=vh=O=uh=null;yh=0;zh=null;Ah=0;if(a)throw Error(u(300));return b}\nfunction Mh(){sh.current=Lh;th=0;xh=P=wh=vh=O=uh=null;yh=0;zh=null;Ah=0;Bh=!1;Ch=null;Gh=0}function Nh(){var a={memoizedState:null,baseState:null,queue:null,baseUpdate:null,next:null};null===P?wh=P=a:P=P.next=a;return P}function Oh(){if(null!==xh)P=xh,xh=P.next,O=vh,vh=null!==O?O.next:null;else{if(null===vh)throw Error(u(310));O=vh;var a={memoizedState:O.memoizedState,baseState:O.baseState,queue:O.queue,baseUpdate:O.baseUpdate,next:null};P=null===P?wh=a:P.next=a;vh=O.next}return P}\nfunction Ph(a,b){return\"function\"===typeof b?b(a):b}\nfunction Qh(a){var b=Oh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;if(0<Gh){var d=c.dispatch;if(null!==Ch){var e=Ch.get(c);if(void 0!==e){Ch.delete(c);var f=b.memoizedState;do f=a(f,e.action),e=e.next;while(null!==e);of(f,b.memoizedState)||(wg=!0);b.memoizedState=f;b.baseUpdate===c.last&&(b.baseState=f);c.lastRenderedState=f;return[f,d]}}return[b.memoizedState,d]}d=c.last;var g=b.baseUpdate;f=b.baseState;null!==g?(null!==d&&(d.next=null),d=g.next):d=null!==d?d.next:null;if(null!==\nd){var h=e=null,k=d,l=!1;do{var m=k.expirationTime;m<th?(l||(l=!0,h=g,e=f),m>yh&&(yh=m,Jg(yh))):(Ig(m,k.suspenseConfig),f=k.eagerReducer===a?k.eagerState:a(f,k.action));g=k;k=k.next}while(null!==k&&k!==d);l||(h=g,e=f);of(f,b.memoizedState)||(wg=!0);b.memoizedState=f;b.baseUpdate=h;b.baseState=e;c.lastRenderedState=f}return[b.memoizedState,c.dispatch]}\nfunction Rh(a){var b=Nh();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={last:null,dispatch:null,lastRenderedReducer:Ph,lastRenderedState:a};a=a.dispatch=Sh.bind(null,uh,a);return[b.memoizedState,a]}function Th(a){return Qh(Ph,a)}function Uh(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};null===zh?(zh={lastEffect:null},zh.lastEffect=a.next=a):(b=zh.lastEffect,null===b?zh.lastEffect=a.next=a:(c=b.next,b.next=a,a.next=c,zh.lastEffect=a));return a}\nfunction Vh(a,b,c,d){var e=Nh();Ah|=a;e.memoizedState=Uh(b,c,void 0,void 0===d?null:d)}function Wh(a,b,c,d){var e=Oh();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&Hh(d,g.deps)){Uh(0,c,f,d);return}}Ah|=a;e.memoizedState=Uh(b,c,f,d)}function Xh(a,b){return Vh(516,192,a,b)}function Yh(a,b){return Wh(516,192,a,b)}\nfunction Zh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function $h(){}function ai(a,b){Nh().memoizedState=[a,void 0===b?null:b];return a}function bi(a,b){var c=Oh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Hh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction Sh(a,b,c){if(!(25>Gh))throw Error(u(301));var d=a.alternate;if(a===uh||null!==d&&d===uh)if(Bh=!0,a={expirationTime:th,suspenseConfig:null,action:c,eagerReducer:null,eagerState:null,next:null},null===Ch&&(Ch=new Map),c=Ch.get(b),void 0===c)Ch.set(b,a);else{for(b=c;null!==b.next;)b=b.next;b.next=a}else{var e=Pg(),f=Mg.suspense;e=Qg(e,a,f);f={expirationTime:e,suspenseConfig:f,action:c,eagerReducer:null,eagerState:null,next:null};var g=b.last;if(null===g)f.next=f;else{var h=g.next;null!==h&&\n(f.next=h);g.next=f}b.last=f;if(0===a.expirationTime&&(null===d||0===d.expirationTime)&&(d=b.lastRenderedReducer,null!==d))try{var k=b.lastRenderedState,l=d(k,c);f.eagerReducer=d;f.eagerState=l;if(of(l,k))return}catch(m){}finally{}Rg(a,e)}}\nvar Lh={readContext:xg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useResponder:Q,useDeferredValue:Q,useTransition:Q},Jh={readContext:xg,useCallback:ai,useContext:xg,useEffect:Xh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Vh(4,36,Zh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Vh(4,36,a,b)},useMemo:function(a,b){var c=Nh();b=void 0===b?null:b;a=a();c.memoizedState=\n[a,b];return a},useReducer:function(a,b,c){var d=Nh();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={last:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=Sh.bind(null,uh,a);return[d.memoizedState,a]},useRef:function(a){var b=Nh();a={current:a};return b.memoizedState=a},useState:Rh,useDebugValue:$h,useResponder:rh,useDeferredValue:function(a,b){var c=Rh(a),d=c[0],e=c[1];Xh(function(){q.unstable_next(function(){var c=N.suspense;N.suspense=void 0===b?null:b;try{e(a)}finally{N.suspense=\nc}})},[a,b]);return d},useTransition:function(a){var b=Rh(!1),c=b[0],d=b[1];return[ai(function(b){d(!0);q.unstable_next(function(){var c=N.suspense;N.suspense=void 0===a?null:a;try{d(!1),b()}finally{N.suspense=c}})},[a,c]),c]}},Kh={readContext:xg,useCallback:bi,useContext:xg,useEffect:Yh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Wh(4,36,Zh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Wh(4,36,a,b)},useMemo:function(a,b){var c=Oh();b=void 0===b?\nnull:b;var d=c.memoizedState;if(null!==d&&null!==b&&Hh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a},useReducer:Qh,useRef:function(){return Oh().memoizedState},useState:Th,useDebugValue:$h,useResponder:rh,useDeferredValue:function(a,b){var c=Th(a),d=c[0],e=c[1];Yh(function(){q.unstable_next(function(){var c=N.suspense;N.suspense=void 0===b?null:b;try{e(a)}finally{N.suspense=c}})},[a,b]);return d},useTransition:function(a){var b=Th(!1),c=b[0],d=b[1];return[bi(function(b){d(!0);q.unstable_next(function(){var c=\nN.suspense;N.suspense=void 0===a?null:a;try{d(!1),b()}finally{N.suspense=c}})},[a,c]),c]}},ci=null,di=null,ei=!1;function fi(a,b){var c=gi(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}\nfunction hi(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction ii(a){if(ei){var b=di;if(b){var c=b;if(!hi(a,b)){b=re(c.nextSibling);if(!b||!hi(a,b)){a.effectTag=a.effectTag&-1025|2;ei=!1;ci=a;return}fi(ci,c)}ci=a;di=re(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,ei=!1,ci=a}}function ji(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;ci=a}\nfunction ki(a){if(a!==ci)return!1;if(!ei)return ji(a),ei=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!oe(b,a.memoizedProps))for(b=di;b;)fi(a,b),b=re(b.nextSibling);ji(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(u(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===ie){if(0===b){di=re(a.nextSibling);break a}b--}else c!==he&&c!==ke&&c!==je||b++}a=a.nextSibling}di=null}}else di=ci?re(a.stateNode.nextSibling):null;return!0}\nfunction li(){di=ci=null;ei=!1}var mi=Ea.ReactCurrentOwner,wg=!1;function R(a,b,c,d){b.child=null===a?gh(b,null,c,d):fh(b,a.child,c,d)}function ni(a,b,c,d,e){c=c.render;var f=b.ref;vg(b,e);d=Ih(a,b,c,d,f,e);if(null!==a&&!wg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),oi(a,b,e);b.effectTag|=1;R(a,b,d,e);return b.child}\nfunction pi(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!qi(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ri(a,b,g,d,e,f);a=ch(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:qf,c(e,d)&&a.ref===b.ref))return oi(a,b,f);b.effectTag|=1;a=ah(g,d,f);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ri(a,b,c,d,e,f){return null!==a&&qf(a.memoizedProps,d)&&a.ref===b.ref&&(wg=!1,e<f)?oi(a,b,f):si(a,b,c,d,f)}function ti(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function si(a,b,c,d,e){var f=L(c)?Df:J.current;f=Ef(b,f);vg(b,e);c=Ih(a,b,c,d,f,e);if(null!==a&&!wg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),oi(a,b,e);b.effectTag|=1;R(a,b,c,e);return b.child}\nfunction ui(a,b,c,d,e){if(L(c)){var f=!0;Jf(b)}else f=!1;vg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Ug(b,c,d,e),Wg(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=xg(l):(l=L(c)?Df:J.current,l=Ef(b,l));var m=c.getDerivedStateFromProps,C=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;C||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Vg(b,g,d,l);yg=!1;var y=b.memoizedState;k=g.state=y;var H=b.updateQueue;null!==H&&(Hg(b,H,d,g,e),k=b.memoizedState);h!==d||y!==k||K.current||yg?(\"function\"===typeof m&&(Og(b,c,m,d),k=b.memoizedState),(h=yg||Tg(b,c,h,d,y,k,l))?(C||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&\ng.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.effectTag|=4)):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,h=b.memoizedProps,g.props=b.type===b.elementType?h:mg(b.type,h),k=g.context,l=c.contextType,\"object\"===typeof l&&null!==l?l=xg(l):(l=L(c)?Df:J.current,l=Ef(b,l)),m=c.getDerivedStateFromProps,(C=\n\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Vg(b,g,d,l),yg=!1,k=b.memoizedState,y=g.state=k,H=b.updateQueue,null!==H&&(Hg(b,H,d,g,e),y=b.memoizedState),h!==d||k!==y||K.current||yg?(\"function\"===typeof m&&(Og(b,c,m,d),y=b.memoizedState),(m=yg||Tg(b,c,h,d,k,y,l))?(C||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||\n(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,y,l),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,y,l)),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=\nd,b.memoizedState=y),g.props=d,g.state=y,g.context=l,d=m):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return vi(a,b,c,d,f,e)}\nfunction vi(a,b,c,d,e,f){ti(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Kf(b,c,!1),oi(a,b,f);d=b.stateNode;mi.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=fh(b,a.child,null,f),b.child=fh(b,null,h,f)):R(a,b,h,f);b.memoizedState=d.state;e&&Kf(b,c,!0);return b.child}function wi(a){var b=a.stateNode;b.pendingContext?Hf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Hf(a,b.context,!1);mh(a,b.containerInfo)}\nvar xi={dehydrated:null,retryTime:0};\nfunction yi(a,b,c){var d=b.mode,e=b.pendingProps,f=M.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);I(M,f&1,b);if(null===a){void 0!==e.fallback&&ii(b);if(g){g=e.fallback;e=eh(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=eh(g,d,c,null);c.return=\nb;e.sibling=c;b.memoizedState=xi;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=gh(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=ah(a,a.pendingProps,0);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=ah(d,e,d.expirationTime);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=xi;b.child=c;return d}c=fh(b,a.child,e.children,c);b.memoizedState=\nnull;return b.child=c}a=a.child;if(g){g=e.fallback;e=eh(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=eh(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=xi;b.child=e;return c}b.memoizedState=null;return b.child=fh(b,a,e.children,c)}\nfunction zi(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);ug(a.return,b)}function Ai(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,last:d,tail:c,tailExpiration:0,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}\nfunction Bi(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;R(a,b,d.children,c);d=M.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&zi(a,c);else if(19===a.tag)zi(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(M,d,b);if(0===(b.mode&2))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===qh(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Ai(b,!1,e,c,f,b.lastEffect);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===qh(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Ai(b,!0,c,null,f,b.lastEffect);break;case \"together\":Ai(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}\nfunction oi(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Jg(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(u(153));if(null!==b.child){a=b.child;c=ah(a,a.pendingProps,a.expirationTime);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=ah(a,a.pendingProps,a.expirationTime),c.return=b;c.sibling=null}return b.child}function Ci(a){a.effectTag|=4}var Hi,Ii,Ji,Ki;\nHi=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Ii=function(){};\nJi=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;lh(ih.current);a=null;switch(c){case \"input\":f=Ab(g,f);d=Ab(g,d);a=[];break;case \"option\":f=Ib(g,f);d=Ib(g,d);a=[];break;case \"select\":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case \"textarea\":f=Kb(g,f);d=Kb(g,d);a=[];break;default:\"function\"!==typeof f.onClick&&\"function\"===typeof d.onClick&&(g.onclick=ae)}Yd(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if(\"style\"===\nh)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]=\"\");else\"dangerouslySetInnerHTML\"!==h&&\"children\"!==h&&\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(ia.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if(\"style\"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]=\"\");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),\nc[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else\"dangerouslySetInnerHTML\"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,\"\"+l)):\"children\"===h?g===l||\"string\"!==typeof l&&\"number\"!==typeof l||(a=a||[]).push(h,\"\"+l):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&(ia.hasOwnProperty(h)?(null!=l&&$d(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push(\"style\",c);e=a;(b.updateQueue=e)&&Ci(b)}};Ki=function(a,b,c,d){c!==d&&Ci(b)};\nfunction Li(a,b){switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction Mi(a){switch(a.tag){case 1:L(a.type)&&Ff(a);var b=a.effectTag;return b&4096?(a.effectTag=b&-4097|64,a):null;case 3:nh(a);Gf(a);b=a.effectTag;if(0!==(b&64))throw Error(u(285));a.effectTag=b&-4097|64;return a;case 5:return ph(a),null;case 13:return G(M,a),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return G(M,a),null;case 4:return nh(a),null;case 10:return tg(a),null;default:return null}}function Ni(a,b){return{value:a,source:b,stack:Xa(b)}}\nvar Oi=\"function\"===typeof WeakSet?WeakSet:Set;function Pi(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=Xa(c));null!==c&&Wa(c.type);b=b.value;null!==a&&1===a.tag&&Wa(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function Qi(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Ri(a,c)}}function Si(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){Ri(a,c)}else b.current=null}\nfunction Ti(a,b){switch(b.tag){case 0:case 11:case 15:Ui(2,0,b);break;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:mg(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}break;case 3:case 5:case 6:case 4:case 17:break;default:throw Error(u(163));}}\nfunction Ui(a,b,c){c=c.updateQueue;c=null!==c?c.lastEffect:null;if(null!==c){var d=c=c.next;do{if(0!==(d.tag&a)){var e=d.destroy;d.destroy=void 0;void 0!==e&&e()}0!==(d.tag&b)&&(e=d.create,d.destroy=e());d=d.next}while(d!==c)}}\nfunction Vi(a,b,c){\"function\"===typeof Wi&&Wi(b);switch(b.tag){case 0:case 11:case 14:case 15:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;fg(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Ri(g,h)}}a=a.next}while(a!==d)})}break;case 1:Si(b);c=b.stateNode;\"function\"===typeof c.componentWillUnmount&&Qi(b,c);break;case 5:Si(b);break;case 4:Xi(a,b,c)}}\nfunction Yi(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;null!==b&&Yi(b)}function Zi(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction $i(a){a:{for(var b=a.return;null!==b;){if(Zi(b)){var c=b;break a}b=b.return}throw Error(u(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(u(161));}c.effectTag&16&&(Tb(b,\"\"),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Zi(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;\nif(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}for(var e=a;;){var f=5===e.tag||6===e.tag;if(f){var g=f?e.stateNode:e.stateNode.instance;if(c)if(d){f=b;var h=g;g=c;8===f.nodeType?f.parentNode.insertBefore(h,g):f.insertBefore(h,g)}else b.insertBefore(g,c);else d?(h=b,8===h.nodeType?(f=h.parentNode,f.insertBefore(g,h)):(f=h,f.appendChild(g)),h=h._reactRootContainer,null!==h&&void 0!==h||null!==f.onclick||(f.onclick=ae)):b.appendChild(g)}else if(4!==\ne.tag&&null!==e.child){e.child.return=e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===e.return||e.return===a)return;e=e.return}e.sibling.return=e.return;e=e.sibling}}\nfunction Xi(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(u(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Vi(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Vi(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}\nfunction aj(a,b){switch(b.tag){case 0:case 11:case 14:case 15:Ui(4,8,b);break;case 1:break;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[ve]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Cb(c,d);Zd(a,e);b=Zd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];\"style\"===g?Wd(c,h):\"dangerouslySetInnerHTML\"===g?Sb(c,h):\"children\"===g?Tb(c,h):vb(c,g,h,b)}switch(a){case \"input\":Eb(c,d);break;case \"textarea\":Mb(c,\nd);break;case \"select\":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?Jb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?Jb(c,!!d.multiple,d.defaultValue,!0):Jb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}break;case 6:if(null===b.stateNode)throw Error(u(162));b.stateNode.nodeValue=b.memoizedProps;break;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,Lc(b.containerInfo));break;case 12:break;case 13:c=b;null===b.memoizedState?d=!1:(d=!0,c=b.child,bj=cg());\nif(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null,f.style.display=Vd(\"display\",e));else if(6===a.tag)a.stateNode.nodeValue=d?\"\":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=f;continue}else if(null!==a.child){a.child.return=\na;a=a.child;continue}if(a===c)break a;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}cj(b);break;case 19:cj(b);break;case 17:break;case 20:break;case 21:break;default:throw Error(u(163));}}function cj(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Oi);b.forEach(function(b){var d=dj.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}var ej=\"function\"===typeof WeakMap?WeakMap:Map;\nfunction fj(a,b,c){c=Bg(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){gj||(gj=!0,hj=d);Pi(a,b)};return c}\nfunction ij(a,b,c){c=Bg(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){Pi(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===jj?jj=new Set([this]):jj.add(this),Pi(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nvar kj=Math.ceil,lj=Ea.ReactCurrentDispatcher,mj=Ea.ReactCurrentOwner,S=0,nj=8,oj=16,pj=32,qj=0,rj=1,sj=2,tj=3,uj=4,vj=5,T=S,U=null,V=null,W=0,X=qj,wj=null,xj=1073741823,yj=1073741823,zj=null,Aj=0,Bj=!1,bj=0,Cj=500,Y=null,gj=!1,hj=null,jj=null,Dj=!1,Ej=null,Fj=90,Gj=null,Hj=0,Ij=null,Jj=0;function Pg(){return(T&(oj|pj))!==S?1073741821-(cg()/10|0):0!==Jj?Jj:Jj=1073741821-(cg()/10|0)}\nfunction Qg(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=dg();if(0===(b&4))return 99===d?1073741823:1073741822;if((T&oj)!==S)return W;if(null!==c)a=lg(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=lg(a,150,100);break;case 97:case 96:a=lg(a,5E3,250);break;case 95:a=2;break;default:throw Error(u(326));}null!==U&&a===W&&--a;return a}\nfunction Rg(a,b){if(50<Hj)throw Hj=0,Ij=null,Error(u(185));a=Kj(a,b);if(null!==a){var c=dg();1073741823===b?(T&nj)!==S&&(T&(oj|pj))===S?Lj(a):(Z(a),T===S&&jg()):Z(a);(T&4)===S||98!==c&&99!==c||(null===Gj?Gj=new Map([[a,b]]):(c=Gj.get(a),(void 0===c||c>b)&&Gj.set(a,b)))}}\nfunction Kj(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(U===e&&(Jg(b),X===uj&&Mj(e,W)),Nj(e,b));return e}\nfunction Oj(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Pj(a,b))return b;b=a.lastPingedTime;a=a.nextKnownPendingLevel;return b>a?b:a}\nfunction Z(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=hg(Lj.bind(null,a));else{var b=Oj(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=Pg();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Xf&&Nf(c)}a.callbackExpirationTime=\nb;a.callbackPriority=d;b=1073741823===b?hg(Lj.bind(null,a)):gg(d,Qj.bind(null,a),{timeout:10*(1073741821-b)-cg()});a.callbackNode=b}}}\nfunction Qj(a,b){Jj=0;if(b)return b=Pg(),Rj(a,b),Z(a),null;var c=Oj(a);if(0!==c){b=a.callbackNode;if((T&(oj|pj))!==S)throw Error(u(327));Sj();a===U&&c===W||Tj(a,c);if(null!==V){var d=T;T|=oj;var e=Uj(a);do try{Vj();break}catch(h){Wj(a,h)}while(1);rg();T=d;lj.current=e;if(X===rj)throw b=wj,Tj(a,c),Mj(a,c),Z(a),b;if(null===V)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=X,U=null,d){case qj:case rj:throw Error(u(345));case sj:Rj(a,2<c?2:c);break;case tj:Mj(a,c);d=a.lastSuspendedTime;\nc===d&&(a.nextKnownPendingLevel=Xj(e));if(1073741823===xj&&(e=bj+Cj-cg(),10<e)){if(Bj){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Tj(a,c);break}}f=Oj(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=pe(Yj.bind(null,a),e);break}Yj(a);break;case uj:Mj(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Xj(e));if(Bj&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Tj(a,c);break}e=Oj(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=\nd;break}1073741823!==yj?d=10*(1073741821-yj)-cg():1073741823===xj?d=0:(d=10*(1073741821-xj)-5E3,e=cg(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*kj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=pe(Yj.bind(null,a),d);break}Yj(a);break;case vj:if(1073741823!==xj&&null!==zj){f=xj;var g=zj;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=cg()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){Mj(a,c);a.timeoutHandle=\npe(Yj.bind(null,a),d);break}}Yj(a);break;default:throw Error(u(329));}Z(a);if(a.callbackNode===b)return Qj.bind(null,a)}}return null}\nfunction Lj(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if(a.finishedExpirationTime===b)Yj(a);else{if((T&(oj|pj))!==S)throw Error(u(327));Sj();a===U&&b===W||Tj(a,b);if(null!==V){var c=T;T|=oj;var d=Uj(a);do try{Zj();break}catch(e){Wj(a,e)}while(1);rg();T=c;lj.current=d;if(X===rj)throw c=wj,Tj(a,b),Mj(a,b),Z(a),c;if(null!==V)throw Error(u(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;U=null;Yj(a);Z(a)}}return null}\nfunction ak(){if(null!==Gj){var a=Gj;Gj=null;a.forEach(function(a,c){Rj(c,a);Z(c)});jg()}}function bk(a,b){var c=T;T|=1;try{return a(b)}finally{T=c,T===S&&jg()}}function ck(a,b){var c=T;T&=-2;T|=nj;try{return a(b)}finally{T=c,T===S&&jg()}}\nfunction Tj(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,qe(c));if(null!==V)for(c=V.return;null!==c;){var d=c;switch(d.tag){case 1:var e=d.type.childContextTypes;null!==e&&void 0!==e&&Ff(d);break;case 3:nh(d);Gf(d);break;case 5:ph(d);break;case 4:nh(d);break;case 13:G(M,d);break;case 19:G(M,d);break;case 10:tg(d)}c=c.return}U=a;V=ah(a.current,null,b);W=b;X=qj;wj=null;yj=xj=1073741823;zj=null;Aj=0;Bj=!1}\nfunction Wj(a,b){do{try{rg();Mh();if(null===V||null===V.return)return X=rj,wj=b,null;a:{var c=a,d=V.return,e=V,f=b;b=W;e.effectTag|=2048;e.firstEffect=e.lastEffect=null;if(null!==f&&\"object\"===typeof f&&\"function\"===typeof f.then){var g=f,h=0!==(M.current&1),k=d;do{var l;if(l=13===k.tag){var m=k.memoizedState;if(null!==m)l=null!==m.dehydrated?!0:!1;else{var C=k.memoizedProps;l=void 0===C.fallback?!1:!0!==C.unstable_avoidThisFallback?!0:h?!1:!0}}if(l){var y=k.updateQueue;if(null===y){var H=new Set;\nH.add(g);k.updateQueue=H}else y.add(g);if(0===(k.mode&2)){k.effectTag|=64;e.effectTag&=-2981;if(1===e.tag)if(null===e.alternate)e.tag=17;else{var z=Bg(1073741823,null);z.tag=2;Dg(e,z)}e.expirationTime=1073741823;break a}f=void 0;e=b;var ta=c.pingCache;null===ta?(ta=c.pingCache=new ej,f=new Set,ta.set(g,f)):(f=ta.get(g),void 0===f&&(f=new Set,ta.set(g,f)));if(!f.has(e)){f.add(e);var r=dk.bind(null,c,g,e);g.then(r,r)}k.effectTag|=4096;k.expirationTime=b;break a}k=k.return}while(null!==k);f=Error((Wa(e.type)||\n\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\"+Xa(e))}X!==vj&&(X=sj);f=Ni(f,e);k=d;do{switch(k.tag){case 3:g=f;k.effectTag|=4096;k.expirationTime=b;var x=fj(k,g,b);Eg(k,x);break a;case 1:g=f;var A=k.type,p=k.stateNode;if(0===(k.effectTag&64)&&(\"function\"===typeof A.getDerivedStateFromError||null!==p&&\"function\"===typeof p.componentDidCatch&&\n(null===jj||!jj.has(p)))){k.effectTag|=4096;k.expirationTime=b;var t=ij(k,g,b);Eg(k,t);break a}}k=k.return}while(null!==k)}V=ek(V)}catch(v){b=v;continue}break}while(1)}function Uj(){var a=lj.current;lj.current=Lh;return null===a?Lh:a}function Ig(a,b){a<xj&&2<a&&(xj=a);null!==b&&a<yj&&2<a&&(yj=a,zj=b)}function Jg(a){a>Aj&&(Aj=a)}function Zj(){for(;null!==V;)V=fk(V)}function Vj(){for(;null!==V&&!Of();)V=fk(V)}\nfunction fk(a){var b=gk(a.alternate,a,W);a.memoizedProps=a.pendingProps;null===b&&(b=ek(a));mj.current=null;return b}\nfunction ek(a){V=a;do{var b=V.alternate;a=V.return;if(0===(V.effectTag&2048)){a:{var c=b;b=V;var d=W;var e=b.pendingProps;switch(b.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:L(b.type)&&Ff(b);break;case 3:nh(b);Gf(b);e=b.stateNode;e.pendingContext&&(e.context=e.pendingContext,e.pendingContext=null);(null===c||null===c.child)&&ki(b)&&Ci(b);Ii(b);break;case 5:ph(b);d=lh(kh.current);var f=b.type;if(null!==c&&null!=b.stateNode)Ji(c,b,f,e,d),c.ref!==b.ref&&(b.effectTag|=128);else if(e){var g=\nlh(ih.current);if(ki(b)){e=b;var h=e.stateNode;c=e.type;var k=e.memoizedProps,l=d;h[ue]=e;h[ve]=k;f=void 0;d=h;switch(c){case \"iframe\":case \"object\":case \"embed\":F(\"load\",d);break;case \"video\":case \"audio\":for(h=0;h<cc.length;h++)F(cc[h],d);break;case \"source\":F(\"error\",d);break;case \"img\":case \"image\":case \"link\":F(\"error\",d);F(\"load\",d);break;case \"form\":F(\"reset\",d);F(\"submit\",d);break;case \"details\":F(\"toggle\",d);break;case \"input\":Bb(d,k);F(\"invalid\",d);$d(l,\"onChange\");break;case \"select\":d._wrapperState=\n{wasMultiple:!!k.multiple};F(\"invalid\",d);$d(l,\"onChange\");break;case \"textarea\":Lb(d,k),F(\"invalid\",d),$d(l,\"onChange\")}Yd(c,k);h=null;for(f in k)k.hasOwnProperty(f)&&(g=k[f],\"children\"===f?\"string\"===typeof g?d.textContent!==g&&(h=[\"children\",g]):\"number\"===typeof g&&d.textContent!==\"\"+g&&(h=[\"children\",\"\"+g]):ia.hasOwnProperty(f)&&null!=g&&$d(l,f));switch(c){case \"input\":yb(d);Gb(d,k,!0);break;case \"textarea\":yb(d);Nb(d,k);break;case \"select\":case \"option\":break;default:\"function\"===typeof k.onClick&&\n(d.onclick=ae)}f=h;e.updateQueue=f;e=null!==f?!0:!1;e&&Ci(b)}else{c=b;l=f;k=e;h=9===d.nodeType?d:d.ownerDocument;g===Ob.html&&(g=Pb(l));g===Ob.html?\"script\"===l?(k=h.createElement(\"div\"),k.innerHTML=\"<script>\\x3c/script>\",h=k.removeChild(k.firstChild)):\"string\"===typeof k.is?h=h.createElement(l,{is:k.is}):(h=h.createElement(l),\"select\"===l&&(l=h,k.multiple?l.multiple=!0:k.size&&(l.size=k.size))):h=h.createElementNS(g,l);k=h;k[ue]=c;k[ve]=e;Hi(k,b,!1,!1);b.stateNode=k;l=f;c=e;var m=d,C=Zd(l,c);switch(l){case \"iframe\":case \"object\":case \"embed\":F(\"load\",\nk);d=c;break;case \"video\":case \"audio\":for(d=0;d<cc.length;d++)F(cc[d],k);d=c;break;case \"source\":F(\"error\",k);d=c;break;case \"img\":case \"image\":case \"link\":F(\"error\",k);F(\"load\",k);d=c;break;case \"form\":F(\"reset\",k);F(\"submit\",k);d=c;break;case \"details\":F(\"toggle\",k);d=c;break;case \"input\":Bb(k,c);d=Ab(k,c);F(\"invalid\",k);$d(m,\"onChange\");break;case \"option\":d=Ib(k,c);break;case \"select\":k._wrapperState={wasMultiple:!!c.multiple};d=n({},c,{value:void 0});F(\"invalid\",k);$d(m,\"onChange\");break;case \"textarea\":Lb(k,\nc);d=Kb(k,c);F(\"invalid\",k);$d(m,\"onChange\");break;default:d=c}Yd(l,d);h=void 0;g=l;var y=k,H=d;for(h in H)if(H.hasOwnProperty(h)){var z=H[h];\"style\"===h?Wd(y,z):\"dangerouslySetInnerHTML\"===h?(z=z?z.__html:void 0,null!=z&&Sb(y,z)):\"children\"===h?\"string\"===typeof z?(\"textarea\"!==g||\"\"!==z)&&Tb(y,z):\"number\"===typeof z&&Tb(y,\"\"+z):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(ia.hasOwnProperty(h)?null!=z&&$d(m,h):null!=z&&vb(y,h,z,C))}switch(l){case \"input\":yb(k);\nGb(k,c,!1);break;case \"textarea\":yb(k);Nb(k,c);break;case \"option\":null!=c.value&&k.setAttribute(\"value\",\"\"+ub(c.value));break;case \"select\":d=k;d.multiple=!!c.multiple;k=c.value;null!=k?Jb(d,!!c.multiple,k,!1):null!=c.defaultValue&&Jb(d,!!c.multiple,c.defaultValue,!0);break;default:\"function\"===typeof d.onClick&&(k.onclick=ae)}(e=ne(f,e))&&Ci(b)}null!==b.ref&&(b.effectTag|=128)}else if(null===b.stateNode)throw Error(u(166));break;case 6:if(c&&null!=b.stateNode)Ki(c,b,c.memoizedProps,e);else{if(\"string\"!==\ntypeof e&&null===b.stateNode)throw Error(u(166));d=lh(kh.current);lh(ih.current);ki(b)?(e=b,f=e.stateNode,d=e.memoizedProps,f[ue]=e,(e=f.nodeValue!==d)&&Ci(b)):(f=b,e=(9===d.nodeType?d:d.ownerDocument).createTextNode(e),e[ue]=f,b.stateNode=e)}break;case 11:break;case 13:G(M,b);e=b.memoizedState;if(0!==(b.effectTag&64)){b.expirationTime=d;break a}e=null!==e;f=!1;null===c?void 0!==b.memoizedProps.fallback&&ki(b):(d=c.memoizedState,f=null!==d,e||null===d||(d=c.child.sibling,null!==d&&(k=b.firstEffect,\nnull!==k?(b.firstEffect=d,d.nextEffect=k):(b.firstEffect=b.lastEffect=d,d.nextEffect=null),d.effectTag=8)));if(e&&!f&&0!==(b.mode&2))if(null===c&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(M.current&1))X===qj&&(X=tj);else{if(X===qj||X===tj)X=uj;0!==Aj&&null!==U&&(Mj(U,W),Nj(U,Aj))}if(e||f)b.effectTag|=4;break;case 7:break;case 8:break;case 12:break;case 4:nh(b);Ii(b);break;case 10:tg(b);break;case 9:break;case 14:break;case 17:L(b.type)&&Ff(b);break;case 19:G(M,b);e=b.memoizedState;if(null===\ne)break;f=0!==(b.effectTag&64);k=e.rendering;if(null===k)if(f)Li(e,!1);else{if(X!==qj||null!==c&&0!==(c.effectTag&64))for(c=b.child;null!==c;){k=qh(c);if(null!==k){b.effectTag|=64;Li(e,!1);f=k.updateQueue;null!==f&&(b.updateQueue=f,b.effectTag|=4);null===e.lastEffect&&(b.firstEffect=null);b.lastEffect=e.lastEffect;e=d;for(f=b.child;null!==f;)d=f,c=e,d.effectTag&=2,d.nextEffect=null,d.firstEffect=null,d.lastEffect=null,k=d.alternate,null===k?(d.childExpirationTime=0,d.expirationTime=c,d.child=null,\nd.memoizedProps=null,d.memoizedState=null,d.updateQueue=null,d.dependencies=null):(d.childExpirationTime=k.childExpirationTime,d.expirationTime=k.expirationTime,d.child=k.child,d.memoizedProps=k.memoizedProps,d.memoizedState=k.memoizedState,d.updateQueue=k.updateQueue,c=k.dependencies,d.dependencies=null===c?null:{expirationTime:c.expirationTime,firstContext:c.firstContext,responders:c.responders}),f=f.sibling;I(M,M.current&1|2,b);b=b.child;break a}c=c.sibling}}else{if(!f)if(c=qh(k),null!==c){if(b.effectTag|=\n64,f=!0,d=c.updateQueue,null!==d&&(b.updateQueue=d,b.effectTag|=4),Li(e,!0),null===e.tail&&\"hidden\"===e.tailMode&&!k.alternate){b=b.lastEffect=e.lastEffect;null!==b&&(b.nextEffect=null);break}}else cg()>e.tailExpiration&&1<d&&(b.effectTag|=64,f=!0,Li(e,!1),b.expirationTime=b.childExpirationTime=d-1);e.isBackwards?(k.sibling=b.child,b.child=k):(d=e.last,null!==d?d.sibling=k:b.child=k,e.last=k)}if(null!==e.tail){0===e.tailExpiration&&(e.tailExpiration=cg()+500);d=e.tail;e.rendering=d;e.tail=d.sibling;\ne.lastEffect=b.lastEffect;d.sibling=null;e=M.current;e=f?e&1|2:e&1;I(M,e,b);b=d;break a}break;case 20:break;case 21:break;default:throw Error(u(156,b.tag));}b=null}e=V;if(1===W||1!==e.childExpirationTime){f=0;for(d=e.child;null!==d;)c=d.expirationTime,k=d.childExpirationTime,c>f&&(f=c),k>f&&(f=k),d=d.sibling;e.childExpirationTime=f}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=V.firstEffect),null!==V.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=\nV.firstEffect),a.lastEffect=V.lastEffect),1<V.effectTag&&(null!==a.lastEffect?a.lastEffect.nextEffect=V:a.firstEffect=V,a.lastEffect=V))}else{b=Mi(V,W);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=V.sibling;if(null!==b)return b;V=a}while(null!==V);X===qj&&(X=vj);return null}function Xj(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Yj(a){var b=dg();fg(99,ik.bind(null,a,b));return null}\nfunction ik(a,b){do Sj();while(null!==Ej);if((T&(oj|pj))!==S)throw Error(u(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(u(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Xj(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=\nd-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===U&&(V=U=null,W=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=T;T|=pj;mj.current=null;le=Ld;var g=fe();if(ge(g)){if(\"selectionStart\"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,\nm=k.focusNode;k=k.focusOffset;try{h.nodeType,m.nodeType}catch(Db){h=null;break a}var C=0,y=-1,H=-1,z=0,ta=0,r=g,x=null;b:for(;;){for(var A;;){r!==h||0!==l&&3!==r.nodeType||(y=C+l);r!==m||0!==k&&3!==r.nodeType||(H=C+k);3===r.nodeType&&(C+=r.nodeValue.length);if(null===(A=r.firstChild))break;x=r;r=A}for(;;){if(r===g)break b;x===h&&++z===l&&(y=C);x===m&&++ta===k&&(H=C);if(null!==(A=r.nextSibling))break;r=x;x=r.parentNode}r=A}h=-1===y||-1===H?null:{start:y,end:H}}else h=null}h=h||{start:0,end:0}}else h=\nnull;me={focusedElem:g,selectionRange:h};Ld=!1;Y=e;do try{jk()}catch(Db){if(null===Y)throw Error(u(330));Ri(Y,Db);Y=Y.nextEffect}while(null!==Y);Y=e;do try{for(g=a,h=b;null!==Y;){var p=Y.effectTag;p&16&&Tb(Y.stateNode,\"\");if(p&128){var t=Y.alternate;if(null!==t){var v=t.ref;null!==v&&(\"function\"===typeof v?v(null):v.current=null)}}switch(p&1038){case 2:$i(Y);Y.effectTag&=-3;break;case 6:$i(Y);Y.effectTag&=-3;aj(Y.alternate,Y);break;case 1024:Y.effectTag&=-1025;break;case 1028:Y.effectTag&=-1025;aj(Y.alternate,\nY);break;case 4:aj(Y.alternate,Y);break;case 8:l=Y,Xi(g,l,h),Yi(l)}Y=Y.nextEffect}}catch(Db){if(null===Y)throw Error(u(330));Ri(Y,Db);Y=Y.nextEffect}while(null!==Y);v=me;t=fe();p=v.focusedElem;h=v.selectionRange;if(t!==p&&p&&p.ownerDocument&&ee(p.ownerDocument.documentElement,p)){null!==h&&ge(p)&&(t=h.start,v=h.end,void 0===v&&(v=t),\"selectionStart\"in p?(p.selectionStart=t,p.selectionEnd=Math.min(v,p.value.length)):(v=(t=p.ownerDocument||document)&&t.defaultView||window,v.getSelection&&(v=v.getSelection(),\nl=p.textContent.length,g=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!v.extend&&g>h&&(l=h,h=g,g=l),l=de(p,g),m=de(p,h),l&&m&&(1!==v.rangeCount||v.anchorNode!==l.node||v.anchorOffset!==l.offset||v.focusNode!==m.node||v.focusOffset!==m.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),v.removeAllRanges(),g>h?(v.addRange(t),v.extend(m.node,m.offset)):(t.setEnd(m.node,m.offset),v.addRange(t))))));t=[];for(v=p;v=v.parentNode;)1===v.nodeType&&t.push({element:v,left:v.scrollLeft,top:v.scrollTop});\n\"function\"===typeof p.focus&&p.focus();for(p=0;p<t.length;p++)v=t[p],v.element.scrollLeft=v.left,v.element.scrollTop=v.top}me=null;Ld=!!le;le=null;a.current=c;Y=e;do try{for(p=d;null!==Y;){var Dh=Y.effectTag;if(Dh&36){var dc=Y.alternate;t=Y;v=p;switch(t.tag){case 0:case 11:case 15:Ui(16,32,t);break;case 1:var fd=t.stateNode;if(t.effectTag&4)if(null===dc)fd.componentDidMount();else{var hk=t.elementType===t.type?dc.memoizedProps:mg(t.type,dc.memoizedProps);fd.componentDidUpdate(hk,dc.memoizedState,\nfd.__reactInternalSnapshotBeforeUpdate)}var Eh=t.updateQueue;null!==Eh&&Kg(t,Eh,fd,v);break;case 3:var Fh=t.updateQueue;if(null!==Fh){g=null;if(null!==t.child)switch(t.child.tag){case 5:g=t.child.stateNode;break;case 1:g=t.child.stateNode}Kg(t,Fh,g,v)}break;case 5:var xk=t.stateNode;null===dc&&t.effectTag&4&&ne(t.type,t.memoizedProps)&&xk.focus();break;case 6:break;case 4:break;case 12:break;case 13:if(null===t.memoizedState){var Di=t.alternate;if(null!==Di){var Ei=Di.memoizedState;if(null!==Ei){var Fi=\nEi.dehydrated;null!==Fi&&Lc(Fi)}}}break;case 19:case 17:case 20:case 21:break;default:throw Error(u(163));}}if(Dh&128){t=void 0;var xd=Y.ref;if(null!==xd){var Gi=Y.stateNode;switch(Y.tag){case 5:t=Gi;break;default:t=Gi}\"function\"===typeof xd?xd(t):xd.current=t}}Y=Y.nextEffect}}catch(Db){if(null===Y)throw Error(u(330));Ri(Y,Db);Y=Y.nextEffect}while(null!==Y);Y=null;Yf();T=f}else a.current=c;if(Dj)Dj=!1,Ej=a,Fj=b;else for(Y=e;null!==Y;)b=Y.nextEffect,Y.nextEffect=null,Y=b;b=a.firstPendingTime;0===b&&\n(jj=null);1073741823===b?a===Ij?Hj++:(Hj=0,Ij=a):Hj=0;\"function\"===typeof kk&&kk(c.stateNode,d);Z(a);if(gj)throw gj=!1,a=hj,hj=null,a;if((T&nj)!==S)return null;jg();return null}function jk(){for(;null!==Y;){var a=Y.effectTag;0!==(a&256)&&Ti(Y.alternate,Y);0===(a&512)||Dj||(Dj=!0,gg(97,function(){Sj();return null}));Y=Y.nextEffect}}function Sj(){if(90!==Fj){var a=97<Fj?97:Fj;Fj=90;return fg(a,lk)}}\nfunction lk(){if(null===Ej)return!1;var a=Ej;Ej=null;if((T&(oj|pj))!==S)throw Error(u(331));var b=T;T|=pj;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:Ui(128,0,c),Ui(0,64,c)}}catch(d){if(null===a)throw Error(u(330));Ri(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}T=b;jg();return!0}function mk(a,b,c){b=Ni(c,b);b=fj(a,b,1073741823);Dg(a,b);a=Kj(a,1073741823);null!==a&&Z(a)}\nfunction Ri(a,b){if(3===a.tag)mk(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){mk(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===jj||!jj.has(d))){a=Ni(b,a);a=ij(c,a,1073741823);Dg(c,a);c=Kj(c,1073741823);null!==c&&Z(c);break}}c=c.return}}\nfunction dk(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);U===a&&W===c?X===uj||X===tj&&1073741823===xj&&cg()-bj<Cj?Tj(a,W):Bj=!0:Pj(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,a.finishedExpirationTime===c&&(a.finishedExpirationTime=0,a.finishedWork=null),Z(a)))}function dj(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=Pg(),b=Qg(b,a,null));a=Kj(a,b);null!==a&&Z(a)}var gk;\ngk=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||K.current)wg=!0;else{if(d<c){wg=!1;switch(b.tag){case 3:wi(b);li();break;case 5:oh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:L(b.type)&&Jf(b);break;case 4:mh(b,b.stateNode.containerInfo);break;case 10:sg(b,b.memoizedProps.value);break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;if(0!==d&&d>=c)return yi(a,b,c);I(M,M.current&\n1,b);b=oi(a,b,c);return null!==b?b.sibling:null}I(M,M.current&1,b);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return Bi(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);I(M,M.current,b);if(!d)return null}return oi(a,b,c)}wg=!1}}else wg=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=Ef(b,J.current);vg(b,c);e=Ih(null,b,d,a,e,c);b.effectTag|=1;if(\"object\"===\ntypeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;Mh();if(L(d)){var f=!0;Jf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Og(b,d,g,a);e.updater=Sg;b.stateNode=e;e._reactInternalFiber=b;Wg(b,d,a,c);b=vi(null,b,d,!0,f,c)}else b.tag=0,R(null,b,e,c),b=b.child;return b;case 16:e=b.elementType;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;Va(e);if(1!==e._status)throw e._result;\ne=e._result;b.type=e;f=b.tag=nk(e);a=mg(e,a);switch(f){case 0:b=si(null,b,e,a,c);break;case 1:b=ui(null,b,e,a,c);break;case 11:b=ni(null,b,e,a,c);break;case 14:b=pi(null,b,e,mg(e.type,a),d,c);break;default:throw Error(u(306,e,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:mg(d,e),si(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:mg(d,e),ui(a,b,d,e,c);case 3:wi(b);d=b.updateQueue;if(null===d)throw Error(u(282));e=b.memoizedState;e=null!==e?e.element:\nnull;Hg(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)li(),b=oi(a,b,c);else{if(e=b.stateNode.hydrate)di=re(b.stateNode.containerInfo.firstChild),ci=b,e=ei=!0;if(e)for(c=gh(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else R(a,b,d,c),li();b=b.child}return b;case 5:return oh(b),null===a&&ii(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,oe(d,e)?g=null:null!==f&&oe(d,f)&&(b.effectTag|=16),ti(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=\nb.childExpirationTime=1,b=null):(R(a,b,g,c),b=b.child),b;case 6:return null===a&&ii(b),null;case 13:return yi(a,b,c);case 4:return mh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=fh(b,null,d,c):R(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:mg(d,e),ni(a,b,d,e,c);case 7:return R(a,b,b.pendingProps,c),b.child;case 8:return R(a,b,b.pendingProps.children,c),b.child;case 12:return R(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;\ne=b.pendingProps;g=b.memoizedProps;f=e.value;sg(b,f);if(null!==g){var h=g.value;f=of(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!K.current){b=oi(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==k){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=Bg(c,null),l.tag=2,Dg(h,l));h.expirationTime<c&&(h.expirationTime=\nc);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);ug(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=g}}R(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,vg(b,c),e=xg(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,R(a,b,d,c),b.child;\ncase 14:return e=b.type,f=mg(e,b.pendingProps),f=mg(e.type,f),pi(a,b,e,f,d,c);case 15:return ri(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:mg(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,L(d)?(a=!0,Jf(b)):a=!1,vg(b,c),Ug(b,d,e,c),Wg(b,d,e,c),vi(null,b,d,!0,a,c);case 19:return Bi(a,b,c)}throw Error(u(156,b.tag));};var kk=null,Wi=null;\nfunction ok(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);kk=function(a){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(e){}};Wi=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}\nfunction pk(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function gi(a,b,c,d){return new pk(a,b,c,d)}\nfunction qi(a){a=a.prototype;return!(!a||!a.isReactComponent)}function nk(a){if(\"function\"===typeof a)return qi(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Oa)return 11;if(a===Ra)return 14}return 2}\nfunction ah(a,b){var c=a.alternate;null===c?(c=gi(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,\nfirstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction ch(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)qi(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case Ia:return eh(c.children,e,f,b);case Na:g=8;e|=7;break;case Ja:g=8;e|=1;break;case Ka:return a=gi(12,c,b,e|8),a.elementType=Ka,a.type=Ka,a.expirationTime=f,a;case Pa:return a=gi(13,c,b,e),a.type=Pa,a.elementType=Pa,a.expirationTime=f,a;case Qa:return a=gi(19,c,b,e),a.elementType=Qa,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case La:g=\n10;break a;case Ma:g=9;break a;case Oa:g=11;break a;case Ra:g=14;break a;case Sa:g=16;d=null;break a}throw Error(u(130,null==a?a:typeof a,\"\"));}b=gi(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function eh(a,b,c,d){a=gi(7,a,d,b);a.expirationTime=c;return a}function bh(a,b,c){a=gi(6,a,null,b);a.expirationTime=c;return a}\nfunction dh(a,b,c){b=gi(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction qk(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}\nfunction Pj(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function Mj(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}\nfunction Nj(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Rj(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}\nfunction rk(a,b,c,d){var e=b.current,f=Pg(),g=Mg.suspense;f=Qg(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(ec(c)!==c||1!==c.tag)throw Error(u(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(L(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(u(171));}if(1===c.tag){var k=c.type;if(L(k)){c=If(c,k,h);break a}}c=h}else c=Cf;null===b.context?b.context=c:b.pendingContext=c;b=Bg(f,g);b.payload={element:a};d=void 0===\nd?null:d;null!==d&&(b.callback=d);Dg(e,b);Rg(e,f);return f}function sk(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function tk(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function uk(a,b){tk(a,b);(a=a.alternate)&&tk(a,b)}\nfunction vk(a,b,c){c=null!=c&&!0===c.hydrate;var d=new qk(a,b,c),e=gi(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;a[we]=d.current;c&&0!==b&&wc(9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}vk.prototype.render=function(a,b){rk(a,this._internalRoot,null,void 0===b?null:b)};vk.prototype.unmount=function(a){var b=this._internalRoot,c=void 0===a?null:a,d=b.containerInfo;rk(null,b,null,function(){d[we]=null;null!==c&&c()})};\nfunction wk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function yk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new vk(a,0,b?{hydrate:!0}:void 0)}\nfunction zk(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=sk(g);h.call(a)}}rk(b,g,a,e)}else{f=c._reactRootContainer=yk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=sk(g);k.call(a)}}ck(function(){rk(b,g,a,e)})}return sk(g)}function Ak(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:Ha,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\njc=function(a){if(13===a.tag){var b=lg(Pg(),150,100);Rg(a,b);uk(a,b)}};kc=function(a){if(13===a.tag){Pg();var b=kg++;Rg(a,b);uk(a,b)}};lc=function(a){if(13===a.tag){var b=Pg();b=Qg(b,a,null);Rg(a,b);uk(a,b)}};\nZa=function(a,b,c){switch(b){case \"input\":Eb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=ye(d);if(!e)throw Error(u(90));zb(d);Eb(d,e)}}}break;case \"textarea\":Mb(a,c);break;case \"select\":b=c.value,null!=b&&Jb(a,!!c.multiple,b,!1)}};eb=bk;\nfb=function(a,b,c,d){var e=T;T|=4;try{return fg(98,a.bind(null,b,c,d))}finally{T=e,T===S&&jg()}};gb=function(){(T&(1|oj|pj))===S&&(ak(),Sj())};hb=function(a,b){var c=T;T|=2;try{return a(b)}finally{T=c,T===S&&jg()}};function Bk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!wk(b))throw Error(u(200));return Ak(a,b,null,c)}\nvar Ck={createPortal:Bk,findDOMNode:function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===b){if(\"function\"===typeof a.render)throw Error(u(188));throw Error(u(268,Object.keys(a)));}a=ic(b);a=null===a?null:a.stateNode;return a},hydrate:function(a,b,c){if(!wk(b))throw Error(u(200));return zk(null,a,b,!0,c)},render:function(a,b,c){if(!wk(b))throw Error(u(200));return zk(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){if(!wk(c))throw Error(u(200));\nif(null==a||void 0===a._reactInternalFiber)throw Error(u(38));return zk(a,b,c,!1,d)},unmountComponentAtNode:function(a){if(!wk(a))throw Error(u(40));return a._reactRootContainer?(ck(function(){zk(null,null,a,!1,function(){a._reactRootContainer=null;a[we]=null})}),!0):!1},unstable_createPortal:function(){return Bk.apply(void 0,arguments)},unstable_batchedUpdates:bk,flushSync:function(a,b){if((T&(oj|pj))!==S)throw Error(u(187));var c=T;T|=1;try{return fg(99,a.bind(null,b))}finally{T=c,jg()}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[Cc,\nxe,ye,Ca.injectEventPluginsByName,fa,Sc,function(a){ya(a,Rc)},cb,db,Pd,Ba,Sj,{current:!1}]}};\n(function(a){var b=a.findFiberByHostInstance;return ok(n({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Ea.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=ic(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:Fc,bundleType:0,version:\"16.12.0\",\nrendererPackageName:\"react-dom\"});var Dk={default:Ck},Ek=Dk&&Ck||Dk;module.exports=Ek.default||Ek;\n\n},{\"react\":\"ccIB\",\"object-assign\":\"W2ED\",\"scheduler\":\"dH6z\"}],\"x9tB\":[function(require,module,exports) {\n'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' || typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function') {\n    return;\n  }\n\n  if (\"production\" !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (\"production\" === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n},{\"./cjs/react-dom.production.min.js\":\"MtQn\"}],\"dQNc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.IconButton = IconButton;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction IconButton(props) {\n  return React.createElement(_base.base.fabric.IconButton, Object.assign({}, props, {\n    styles: {\n      rootHovered: {\n        color: props.themePalette.themePrimary\n      },\n      menuIcon: {\n        display: 'none'\n      }\n    },\n    iconProps: {\n      iconName: props.iconName\n    },\n    menuProps: props.menuProps\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"E67y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.applyColorButtons = applyColorButtons;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar ReactDOM = _interopRequireWildcard(require(\"react-dom\"));\n\nvar _iconButton = require(\"./controls/iconButton\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"./language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar className = 'sanddance-panel-tools';\n\nfunction ensureToolbar(panel) {\n  var existing = panel.getElementsByClassName(className);\n\n  if (existing.length > 0) {\n    return existing[0];\n  } else {\n    var div = _sanddanceReact.SandDance.VegaDeckGl.util.addDiv(panel, className);\n\n    panel.insertAdjacentElement('afterbegin', div);\n    return div;\n  }\n}\n\nfunction applyColorButtons(presenter, showLegend, props) {\n  var panel = presenter.getElement(_sanddanceReact.SandDance.VegaDeckGl.PresenterElement.panel);\n  var div = ensureToolbar(panel);\n  ReactDOM.render(ColorMap(props), div);\n  panel.style.display = showLegend ? '' : 'none';\n}\n\nfunction ColorMap(props) {\n  var menuProps = {\n    items: [{\n      key: 'new',\n      text: _language.strings.buttonColorSchemeRemap,\n      disabled: !props.canRemap || props.isRemap,\n      onClick: function onClick() {\n        return props.colorMapHandler(true);\n      }\n    }, {\n      key: 'old',\n      text: _language.strings.buttonColorSchemeKeep,\n      disabled: !props.canRemap || !props.isRemap,\n      onClick: function onClick() {\n        return props.colorMapHandler(false);\n      }\n    }]\n  };\n  return React.createElement(\"div\", null, React.createElement(_iconButton.IconButton, {\n    themePalette: props.themePalette,\n    title: _language.strings.buttonColorSchemeMap,\n    onClick: null,\n    iconName: props.canRemap ? 'FiltersSolid' : 'Filters',\n    menuProps: menuProps\n  }));\n}\n},{\"react\":\"ccIB\",\"react-dom\":\"x9tB\",\"./controls/iconButton\":\"dQNc\",\"@msrvida/sanddance-react\":\"MjKu\",\"./language\":\"hk5u\"}],\"L8O2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.bestColorScheme = bestColorScheme;\n\nfunction bestColorScheme(newColumn, oldColumn, oldScheme) {\n  if (oldColumn && oldColumn.quantitative === newColumn.quantitative && defaultColorScheme(oldColumn) === defaultColorScheme(newColumn)) {\n    return oldScheme;\n  }\n\n  return defaultColorScheme(newColumn);\n}\n\nfunction defaultColorScheme(c) {\n  if (c.quantitative) {\n    return 'redyellowgreen';\n  } else if (c.stats.distinctValueCount === 2) {\n    return 'dual_redgreen';\n  } else if (c.stats.distinctValueCount <= 10) {\n    return 'category10';\n  }\n\n  return 'category20';\n}\n},{}],\"Uyrp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Dropdown = Dropdown;\nexports.dropdownWidth = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar dropdownWidth = 200;\nexports.dropdownWidth = dropdownWidth;\n\nfunction Dropdown(props) {\n  var newProps = Object.assign({}, props);\n  var selectedKey = null;\n\n  if (newProps.options && newProps.options.length > 1) {\n    var selectedOptions = newProps.options.filter(function (option) {\n      return option.selected;\n    });\n\n    if (selectedOptions && selectedOptions.length > 0) {\n      selectedKey = selectedOptions[0].key;\n    }\n  }\n\n  if (newProps.collapseLabel) {\n    newProps.onRenderTitle = function (a, b) {\n      return React.createElement(\"span\", null, newProps.label, \": \", a[0].text);\n    };\n  }\n\n  return React.createElement(_base.base.fabric.Dropdown, Object.assign({\n    dropdownWidth: dropdownWidth\n  }, newProps, {\n    label: newProps.collapseLabel ? null : newProps.label,\n    selectedKey: selectedKey\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"OWDI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Signal = Signal;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Signal(props) {\n  if (!props.explorer.viewer || !props.signal) {\n    return null;\n  }\n\n  if (props.signal.bind) {\n    var input = props.signal.bind.input;\n\n    if (input) {\n      var fn = map[input];\n\n      if (fn) {\n        var prefix = props.prefix ? \"\".concat(props.prefix, \" \") : '';\n        var initialValue;\n\n        try {\n          initialValue = props.explorer.viewer.vegaViewGl.signal(props.signal.name);\n        } catch (error) {// continue regardless of error\n        }\n\n        var control = fn(prefix, props.signal.bind, initialValue, function (value) {\n          props.onChange && props.onChange(value);\n          props.explorer.signal(props.signal.name, value);\n        }, props.disabled);\n        return React.createElement(\"div\", {\n          className: \"sanddance-signal\"\n        }, control);\n      }\n    }\n  }\n\n  return null;\n}\n\nvar map = {};\n\nmap['range'] = function (prefix, bind, initialValue, onChange, disabled) {\n  return React.createElement(_base.base.fabric.Slider, {\n    label: prefix + bind.name,\n    max: bind.max,\n    min: bind.min,\n    step: bind.step,\n    value: initialValue,\n    onChange: onChange,\n    disabled: disabled\n  });\n};\n\nmap['select'] = function (prefix, bind, initialValue, _onChange, disabled) {\n  var options = bind.options.map(function (o, i) {\n    var option = {\n      key: o,\n      text: o\n    };\n    return option;\n  });\n  return React.createElement(_base.base.fabric.Dropdown, {\n    defaultSelectedKey: initialValue,\n    label: prefix + bind.name,\n    options: options,\n    onChange: function onChange(e, o) {\n      return _onChange(o.text);\n    },\n    disabled: disabled\n  });\n};\n\nmap['checkbox'] = function (prefix, bind, initialValue, _onChange2, disabled) {\n  return React.createElement(_base.base.fabric.Toggle, {\n    defaultChecked: initialValue,\n    label: prefix + bind.name,\n    onChange: function onChange(e, checked) {\n      return _onChange2(checked);\n    },\n    disabled: disabled\n  });\n}; //TODO other signal types\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"DSho\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ColumnMap = ColumnMap;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dropdown = require(\"./dropdown\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _signal = require(\"./signal\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar maxFacets = 50;\nvar roleLabels = {\n  color: _language.strings.labelColumnColor,\n  facet: _language.strings.labelColumnFacet,\n  group: _language.strings.labelColumnGroup,\n  size: _language.strings.labelColumnSize,\n  sort: _language.strings.labelColumnSort,\n  uid: null,\n  x: _language.strings.labelColumnX,\n  y: _language.strings.labelColumnY,\n  z: _language.strings.labelColumnZ\n};\nvar aliasLabels = {\n  color: _language.strings.labelAliasColor,\n  facet: _language.strings.labelAliasFacet,\n  group: _language.strings.labelAliasGroup,\n  size: _language.strings.labelAliasSize,\n  sort: _language.strings.labelAliasSort,\n  uid: null,\n  x: _language.strings.labelAliasX,\n  y: _language.strings.labelAliasY,\n  z: _language.strings.labelAliasZ\n};\n\nfunction filterColumnList(context, columns) {\n  switch (context) {\n    case 'facet':\n      return columns.filter(function (column) {\n        return column.quantitative || column.stats.distinctValueCount && column.stats.distinctValueCount < maxFacets;\n      });\n\n    default:\n      return columns.slice();\n  }\n}\n\nfunction optionsForSpecColumn(sectionName, columns, role, selectedColumnName) {\n  var filtered = filterColumnList(role, columns);\n  var options = filtered.map(function (column) {\n    var option = {\n      key: \"column:\".concat(column.name),\n      text: column.name,\n      data: column,\n      selected: selectedColumnName === column.name\n    };\n    return option;\n  });\n\n  if (options.length) {\n    var option = {\n      key: sectionName,\n      text: sectionName,\n      itemType: _base.base.fabric.DropdownMenuItemType.Header\n    };\n    options.unshift(option);\n  }\n\n  return options;\n}\n\nfunction optionsForReference(sectionName, specRoles) {\n  var options = specRoles.map(function (specRole) {\n    var option = {\n      key: \"role:\".concat(specRole.role),\n      text: aliasLabels[specRole.role],\n      data: specRole.role\n    };\n    return option;\n  }).sort(function (a, b) {\n    return a.text.localeCompare(b.text);\n  });\n\n  if (options.length) {\n    var option = {\n      key: sectionName,\n      text: sectionName,\n      itemType: _base.base.fabric.DropdownMenuItemType.Header\n    };\n    options.unshift(option);\n  }\n\n  return options;\n}\n\nfunction selectFirst(options) {\n  for (var i = 0; i < options.length; i++) {\n    if (options[i].itemType === _base.base.fabric.DropdownMenuItemType.Header) continue;\n    options[i].selected = true;\n    return;\n  }\n}\n\nfunction ColumnMap(props) {\n  if (!props.specRole) return null;\n  var categoricalColumns;\n  var directColorColumns;\n  var directColorGroup;\n  var referenceGroup = [];\n\n  if (props.specRole.role === 'color') {\n    categoricalColumns = props.categoricalColumns.filter(function (c) {\n      return !c.isColorData;\n    });\n    directColorColumns = props.categoricalColumns.filter(function (c) {\n      return c.isColorData;\n    });\n    directColorGroup = optionsForSpecColumn(_language.strings.selectDirectColor, directColorColumns, 'color', props.selectedColumnName);\n  } else {\n    categoricalColumns = props.categoricalColumns;\n  }\n\n  if (props.specRole.role === 'sort') {\n    var others = props.specCapabilities.roles.filter(function (specRole) {\n      return specRole.role !== props.specRole.role;\n    });\n    referenceGroup = optionsForReference(_language.strings.selectReference, others);\n  }\n\n  var quantitativeGroup = optionsForSpecColumn(_language.strings.selectNumeric, props.quantitativeColumns, props.specRole.role, props.selectedColumnName);\n  var categoricGroup = props.specRole.excludeCategoric ? null : optionsForSpecColumn(_language.strings.selectNonNumeric, categoricalColumns, props.specRole.role, props.selectedColumnName);\n  var options = referenceGroup.concat(quantitativeGroup).concat(categoricGroup).concat(directColorGroup).filter(Boolean);\n\n  if (props.specRole.allowNone) {\n    options.unshift({\n      key: -1,\n      text: _language.strings.selectNone\n    });\n  }\n\n  var hasSelection = options.reduce(function (p, c) {\n    return p || c.selected;\n  }, false);\n\n  if (!hasSelection) {\n    selectFirst(options);\n  }\n\n  var signals;\n\n  if (props.explorer.viewer && props.explorer.viewer.vegaSpec) {\n    if (props.specRole.signals) {\n      signals = props.explorer.viewer.vegaSpec.signals.filter(function (s) {\n        return props.specRole.signals.indexOf(s.name) >= 0;\n      });\n    }\n  }\n\n  var label = roleLabels[props.specRole.role];\n  return React.createElement(\"div\", {\n    className: \"sanddance-columnMap\"\n  }, React.createElement(_dropdown.Dropdown, {\n    componentRef: props.componentRef,\n    collapseLabel: props.collapseLabel,\n    disabled: props.disabled,\n    label: label,\n    options: options,\n    onChange: function onChange(e, o) {\n      return props.changeColumnMapping(props.specRole.role, typeof o.data === 'string' ? o.data : _sanddanceReact.SandDance.VegaDeckGl.util.clone(o.data));\n    },\n    onDismiss: props.onDismiss\n  }), !props.hideSignals && signals && signals.map(function (signal, i) {\n    return React.createElement(_signal.Signal, {\n      key: i,\n      explorer: props.explorer,\n      signal: signal,\n      onChange: function onChange(value) {\n        return props.onChangeSignal && props.onChangeSignal(signal.name, value);\n      }\n    });\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./dropdown\":\"Uyrp\",\"@msrvida/sanddance-react\":\"MjKu\",\"./signal\":\"OWDI\",\"../language\":\"hk5u\"}],\"cFWm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Dialog = Dialog;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Dialog(props) {\n  return React.createElement(_base.base.fabric.Dialog, Object.assign({}, props, {\n    dialogContentProps: {\n      type: _base.base.fabric.DialogType.normal,\n      title: props.title\n    }\n  }), props.children, React.createElement(_base.base.fabric.DialogFooter, null, props.buttons, React.createElement(_base.base.fabric.DefaultButton, {\n    onClick: props.onDismiss,\n    text: _language.strings.buttonClose\n  })));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../language\":\"hk5u\"}],\"Q3hf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Group = Group;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Group(props) {\n  return React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-group', props.className)\n  }, React.createElement(\"div\", {\n    className: \"group-head\"\n  }, React.createElement(\"label\", null, props.label), props.labelCount && React.createElement(\"span\", {\n    className: \"count\"\n  }, \"(\", props.labelCount, \")\")), props.children && React.createElement(\"div\", {\n    className: \"group-body\"\n  }, props.children));\n}\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"ZOmP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ToggleColumns = ToggleColumns;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction ToggleColumns(props) {\n  return React.createElement(\"div\", null, props.allColumns.map(function (c, i) {\n    return React.createElement(\"div\", {\n      key: c.name\n    }, React.createElement(\"label\", null, React.createElement(_base.base.fabric.Toggle, {\n      checked: props.exclusions.indexOf(c.name) < 0,\n      inlineLabel: true,\n      label: c.name,\n      onChange: function onChange() {\n        return props.toggleExclusion(c.name);\n      }\n    })));\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"NGSt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Chart = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _columnMap = require(\"../controls/columnMap\");\n\nvar _dialog = require(\"../controls/dialog\");\n\nvar _group = require(\"../controls/group\");\n\nvar _signal = require(\"../controls/signal\");\n\nvar _language = require(\"../language\");\n\nvar _toggleColumns = require(\"../controls/toggleColumns\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Chart =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Chart, _React$Component);\n\n  function Chart(props) {\n    var _this;\n\n    _classCallCheck(this, Chart);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Chart).call(this, props));\n    _this.state = {\n      showTooltipDialog: false\n    };\n    return _this;\n  }\n\n  _createClass(Chart, [{\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var props = this.props;\n      var signals = props.explorer.viewer && props.explorer.viewer.vegaSpec && props.specCapabilities && props.specCapabilities.signals && props.explorer.viewer.vegaSpec.signals.filter(function (s) {\n        return props.specCapabilities.signals.indexOf(s.name) >= 0;\n      });\n      return React.createElement(\"div\", null, React.createElement(_group.Group, {\n        label: _language.strings.labelChart\n      }, React.createElement(\"div\", {\n        className: \"calculator\"\n      }, React.createElement(_base.base.fabric.ChoiceGroup, {\n        className: \"sanddance-chart-type\",\n        options: [{\n          key: 'grid',\n          text: _language.strings.chartTypeGrid\n        }, {\n          key: 'scatterplot',\n          text: _language.strings.chartTypeScatterPlot\n        }, {\n          key: 'density',\n          text: _language.strings.chartTypeDensity\n        }, {\n          key: 'barchartV',\n          text: _language.strings.chartTypeBarChartV\n        }, {\n          key: 'barchartH',\n          text: _language.strings.chartTypeBarChartH\n        }, {\n          key: 'treemap',\n          text: _language.strings.chartTypeTreeMap\n        }, {\n          key: 'stacks',\n          text: _language.strings.chartTypeStacks\n        }].map(function (o) {\n          return Object.assign(Object.assign({}, o), {\n            checked: props.chart === o.key,\n            disabled: props.disabled\n          });\n        }),\n        onChange: function onChange(e, o) {\n          return props.onChangeChartType(o.key);\n        }\n      }))), signals && React.createElement(_group.Group, {\n        label: _language.strings.labelChartTypeOptions\n      }, signals.map(function (signal, i) {\n        return React.createElement(_signal.Signal, {\n          key: i,\n          signal: signal,\n          explorer: props.explorer,\n          disabled: props.disabled\n        });\n      })), React.createElement(_group.Group, {\n        label: _language.strings.labelColumnMapping\n      }, React.createElement(\"div\", null, props.specCapabilities && props.specCapabilities.roles.map(function (specRole, i) {\n        var specColumnInRole = props.insightColumns[specRole.role];\n        var selectedColumnName = specColumnInRole;\n        var disabled = props.disabled || props.view === '2d' && specRole.role === 'z';\n        return React.createElement(_columnMap.ColumnMap, Object.assign({}, props, {\n          collapseLabel: props.collapseLabels,\n          disabled: disabled,\n          selectedColumnName: selectedColumnName,\n          specRole: specRole,\n          key: i,\n          onChangeSignal: function onChangeSignal(name, value) {\n            return props.onChangeSignal(specRole.role, selectedColumnName, name, value);\n          }\n        }));\n      }), React.createElement(\"div\", {\n        className: \"sanddance-tooltipMap\"\n      }, React.createElement(_base.base.fabric.DefaultButton, {\n        text: _language.strings.buttonTooltipMapping,\n        onClick: function onClick() {\n          return _this2.setState({\n            showTooltipDialog: true\n          });\n        }\n      })))), React.createElement(_dialog.Dialog, {\n        hidden: !this.state.showTooltipDialog,\n        onDismiss: function onDismiss() {\n          return _this2.setState({\n            showTooltipDialog: false\n          });\n        },\n        title: _language.strings.labelTooltipMapping\n      }, React.createElement(_toggleColumns.ToggleColumns, {\n        allColumns: props.allColumns,\n        exclusions: props.tooltipExclusions,\n        toggleExclusion: props.toggleTooltipExclusion\n      })));\n    }\n  }]);\n\n  return Chart;\n}(React.Component);\n\nexports.Chart = Chart;\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../controls/columnMap\":\"DSho\",\"../controls/dialog\":\"cFWm\",\"../controls/group\":\"Q3hf\",\"../controls/signal\":\"OWDI\",\"../language\":\"hk5u\",\"../controls/toggleColumns\":\"ZOmP\"}],\"BSWy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.schemeOption = schemeOption;\nexports.schemesJSX = void 0;\n\nfunction schemeOption(selected, scheme) {\n  return {\n    key: scheme,\n    text: scheme,\n    selected: selected === scheme,\n    scheme: scheme,\n    children: schemesJSX[scheme]\n  };\n}\n\nvar schemesJSX = {};\nexports.schemesJSX = schemesJSX;\n},{}],\"JrIT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.categorical = categorical;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar p8 = \"\".concat(100 / 8, \"%\");\nvar p9 = \"\".concat(100 / 9, \"%\");\nvar p10 = \"\".concat(100 / 10, \"%\");\nvar p12 = \"\".concat(100 / 12, \"%\");\nvar p20 = \"\".concat(100 / 20, \"%\");\n_scheme.schemesJSX['accent'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#7fc97f\",\n  style: {\n    width: p8,\n    background: 'rgb(127, 201, 127)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#beaed4\",\n  style: {\n    width: p8,\n    background: 'rgb(190, 174, 212)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdc086\",\n  style: {\n    width: p8,\n    background: 'rgb(253, 192, 134)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffff99\",\n  style: {\n    width: p8,\n    background: 'rgb(255, 255, 153)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#386cb0\",\n  style: {\n    width: p8,\n    background: 'rgb(56, 108, 176)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f0027f\",\n  style: {\n    width: p8,\n    background: 'rgb(240, 2, 127)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bf5b17\",\n  style: {\n    width: p8,\n    background: 'rgb(191, 91, 23)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#666666\",\n  style: {\n    width: p8,\n    background: 'rgb(102, 102, 102)'\n  }\n}));\n_scheme.schemesJSX['category10'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#1f77b4\",\n  style: {\n    width: p10,\n    background: 'rgb(31, 119, 180)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff7f0e\",\n  style: {\n    width: p10,\n    background: 'rgb(255, 127, 14)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#2ca02c\",\n  style: {\n    width: p10,\n    background: 'rgb(44, 160, 44)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d62728\",\n  style: {\n    width: p10,\n    background: 'rgb(214, 39, 40)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9467bd\",\n  style: {\n    width: p10,\n    background: 'rgb(148, 103, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8c564b\",\n  style: {\n    width: p10,\n    background: 'rgb(140, 86, 75)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e377c2\",\n  style: {\n    width: p10,\n    background: 'rgb(227, 119, 194)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#7f7f7f\",\n  style: {\n    width: p10,\n    background: 'rgb(127, 127, 127)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bcbd22\",\n  style: {\n    width: p10,\n    background: 'rgb(188, 189, 34)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#17becf\",\n  style: {\n    width: p10,\n    background: 'rgb(23, 190, 207)'\n  }\n}));\n_scheme.schemesJSX['category20'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#1f77b4\",\n  style: {\n    width: p20,\n    background: 'rgb(31, 119, 180)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#aec7e8\",\n  style: {\n    width: p20,\n    background: 'rgb(174, 199, 232)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff7f0e\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 127, 14)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffbb78\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 187, 120)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#2ca02c\",\n  style: {\n    width: p20,\n    background: 'rgb(44, 160, 44)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#98df8a\",\n  style: {\n    width: p20,\n    background: 'rgb(152, 223, 138)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d62728\",\n  style: {\n    width: p20,\n    background: 'rgb(214, 39, 40)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff9896\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 152, 150)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9467bd\",\n  style: {\n    width: p20,\n    background: 'rgb(148, 103, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c5b0d5\",\n  style: {\n    width: p20,\n    background: 'rgb(197, 176, 213)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8c564b\",\n  style: {\n    width: p20,\n    background: 'rgb(140, 86, 75)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c49c94\",\n  style: {\n    width: p20,\n    background: 'rgb(196, 156, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e377c2\",\n  style: {\n    width: p20,\n    background: 'rgb(227, 119, 194)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f7b6d2\",\n  style: {\n    width: p20,\n    background: 'rgb(247, 182, 210)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#7f7f7f\",\n  style: {\n    width: p20,\n    background: 'rgb(127, 127, 127)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c7c7c7\",\n  style: {\n    width: p20,\n    background: 'rgb(199, 199, 199)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bcbd22\",\n  style: {\n    width: p20,\n    background: 'rgb(188, 189, 34)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#dbdb8d\",\n  style: {\n    width: p20,\n    background: 'rgb(219, 219, 141)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#17becf\",\n  style: {\n    width: p20,\n    background: 'rgb(23, 190, 207)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9edae5\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 218, 229)'\n  }\n}));\n_scheme.schemesJSX['category20b'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#393b79\",\n  style: {\n    width: p20,\n    background: 'rgb(57, 59, 121)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#5254a3\",\n  style: {\n    width: p20,\n    background: 'rgb(82, 84, 163)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#6b6ecf\",\n  style: {\n    width: p20,\n    background: 'rgb(107, 110, 207)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9c9ede\",\n  style: {\n    width: p20,\n    background: 'rgb(156, 158, 222)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#637939\",\n  style: {\n    width: p20,\n    background: 'rgb(99, 121, 57)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8ca252\",\n  style: {\n    width: p20,\n    background: 'rgb(140, 162, 82)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b5cf6b\",\n  style: {\n    width: p20,\n    background: 'rgb(181, 207, 107)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#cedb9c\",\n  style: {\n    width: p20,\n    background: 'rgb(206, 219, 156)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8c6d31\",\n  style: {\n    width: p20,\n    background: 'rgb(140, 109, 49)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bd9e39\",\n  style: {\n    width: p20,\n    background: 'rgb(189, 158, 57)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e7ba52\",\n  style: {\n    width: p20,\n    background: 'rgb(231, 186, 82)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e7cb94\",\n  style: {\n    width: p20,\n    background: 'rgb(231, 203, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#843c39\",\n  style: {\n    width: p20,\n    background: 'rgb(132, 60, 57)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ad494a\",\n  style: {\n    width: p20,\n    background: 'rgb(173, 73, 74)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d6616b\",\n  style: {\n    width: p20,\n    background: 'rgb(214, 97, 107)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e7969c\",\n  style: {\n    width: p20,\n    background: 'rgb(231, 150, 156)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#7b4173\",\n  style: {\n    width: p20,\n    background: 'rgb(123, 65, 115)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a55194\",\n  style: {\n    width: p20,\n    background: 'rgb(165, 81, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ce6dbd\",\n  style: {\n    width: p20,\n    background: 'rgb(206, 109, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#de9ed6\",\n  style: {\n    width: p20,\n    background: 'rgb(222, 158, 214)'\n  }\n}));\n_scheme.schemesJSX['category20c'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#3182bd\",\n  style: {\n    width: p20,\n    background: 'rgb(49, 130, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#6baed6\",\n  style: {\n    width: p20,\n    background: 'rgb(107, 174, 214)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9ecae1\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 202, 225)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c6dbef\",\n  style: {\n    width: p20,\n    background: 'rgb(198, 219, 239)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e6550d\",\n  style: {\n    width: p20,\n    background: 'rgb(230, 85, 13)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fd8d3c\",\n  style: {\n    width: p20,\n    background: 'rgb(253, 141, 60)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdae6b\",\n  style: {\n    width: p20,\n    background: 'rgb(253, 174, 107)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdd0a2\",\n  style: {\n    width: p20,\n    background: 'rgb(253, 208, 162)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#31a354\",\n  style: {\n    width: p20,\n    background: 'rgb(49, 163, 84)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#74c476\",\n  style: {\n    width: p20,\n    background: 'rgb(116, 196, 118)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a1d99b\",\n  style: {\n    width: p20,\n    background: 'rgb(161, 217, 155)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#c7e9c0\",\n  style: {\n    width: p20,\n    background: 'rgb(199, 233, 192)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#756bb1\",\n  style: {\n    width: p20,\n    background: 'rgb(117, 107, 177)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9e9ac8\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 154, 200)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bcbddc\",\n  style: {\n    width: p20,\n    background: 'rgb(188, 189, 220)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#dadaeb\",\n  style: {\n    width: p20,\n    background: 'rgb(218, 218, 235)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#636363\",\n  style: {\n    width: p20,\n    background: 'rgb(99, 99, 99)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#969696\",\n  style: {\n    width: p20,\n    background: 'rgb(150, 150, 150)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bdbdbd\",\n  style: {\n    width: p20,\n    background: 'rgb(189, 189, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d9d9d9\",\n  style: {\n    width: p20,\n    background: 'rgb(217, 217, 217)'\n  }\n}));\n_scheme.schemesJSX['dark2'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#1b9e77\",\n  style: {\n    width: p8,\n    background: 'rgb(27, 158, 119)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d95f02\",\n  style: {\n    width: p8,\n    background: 'rgb(217, 95, 2)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#7570b3\",\n  style: {\n    width: p8,\n    background: 'rgb(117, 112, 179)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e7298a\",\n  style: {\n    width: p8,\n    background: 'rgb(231, 41, 138)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#66a61e\",\n  style: {\n    width: p8,\n    background: 'rgb(102, 166, 30)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e6ab02\",\n  style: {\n    width: p8,\n    background: 'rgb(230, 171, 2)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a6761d\",\n  style: {\n    width: p8,\n    background: 'rgb(166, 118, 29)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#666666\",\n  style: {\n    width: p8,\n    background: 'rgb(102, 102, 102)'\n  }\n}));\n_scheme.schemesJSX['paired'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#a6cee3\",\n  style: {\n    width: p12,\n    background: 'rgb(166, 206, 227)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#1f78b4\",\n  style: {\n    width: p12,\n    background: 'rgb(31, 120, 180)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b2df8a\",\n  style: {\n    width: p12,\n    background: 'rgb(178, 223, 138)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#33a02c\",\n  style: {\n    width: p12,\n    background: 'rgb(51, 160, 44)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fb9a99\",\n  style: {\n    width: p12,\n    background: 'rgb(251, 154, 153)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e31a1c\",\n  style: {\n    width: p12,\n    background: 'rgb(227, 26, 28)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdbf6f\",\n  style: {\n    width: p12,\n    background: 'rgb(253, 191, 111)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff7f00\",\n  style: {\n    width: p12,\n    background: 'rgb(255, 127, 0)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#cab2d6\",\n  style: {\n    width: p12,\n    background: 'rgb(202, 178, 214)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#6a3d9a\",\n  style: {\n    width: p12,\n    background: 'rgb(106, 61, 154)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffff99\",\n  style: {\n    width: p12,\n    background: 'rgb(255, 255, 153)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b15928\",\n  style: {\n    width: p12,\n    background: 'rgb(177, 89, 40)'\n  }\n}));\n_scheme.schemesJSX['pastel1'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#fbb4ae\",\n  style: {\n    width: p9,\n    background: 'rgb(251, 180, 174)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b3cde3\",\n  style: {\n    width: p9,\n    background: 'rgb(179, 205, 227)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ccebc5\",\n  style: {\n    width: p9,\n    background: 'rgb(204, 235, 197)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#decbe4\",\n  style: {\n    width: p9,\n    background: 'rgb(222, 203, 228)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fed9a6\",\n  style: {\n    width: p9,\n    background: 'rgb(254, 217, 166)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffffcc\",\n  style: {\n    width: p9,\n    background: 'rgb(255, 255, 204)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e5d8bd\",\n  style: {\n    width: p9,\n    background: 'rgb(229, 216, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fddaec\",\n  style: {\n    width: p9,\n    background: 'rgb(253, 218, 236)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f2f2f2\",\n  style: {\n    width: p9,\n    background: 'rgb(242, 242, 242)'\n  }\n}));\n_scheme.schemesJSX['pastel2'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#b3e2cd\",\n  style: {\n    width: p8,\n    background: 'rgb(179, 226, 205)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdcdac\",\n  style: {\n    width: p8,\n    background: 'rgb(253, 205, 172)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#cbd5e8\",\n  style: {\n    width: p8,\n    background: 'rgb(203, 213, 232)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f4cae4\",\n  style: {\n    width: p8,\n    background: 'rgb(244, 202, 228)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e6f5c9\",\n  style: {\n    width: p8,\n    background: 'rgb(230, 245, 201)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fff2ae\",\n  style: {\n    width: p8,\n    background: 'rgb(255, 242, 174)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f1e2cc\",\n  style: {\n    width: p8,\n    background: 'rgb(241, 226, 204)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#cccccc\",\n  style: {\n    width: p8,\n    background: 'rgb(204, 204, 204)'\n  }\n}));\n_scheme.schemesJSX['set1'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#e41a1c\",\n  style: {\n    width: p9,\n    background: 'rgb(228, 26, 28)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#377eb8\",\n  style: {\n    width: p9,\n    background: 'rgb(55, 126, 184)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#4daf4a\",\n  style: {\n    width: p9,\n    background: 'rgb(77, 175, 74)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#984ea3\",\n  style: {\n    width: p9,\n    background: 'rgb(152, 78, 163)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff7f00\",\n  style: {\n    width: p9,\n    background: 'rgb(255, 127, 0)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffff33\",\n  style: {\n    width: p9,\n    background: 'rgb(255, 255, 51)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a65628\",\n  style: {\n    width: p9,\n    background: 'rgb(166, 86, 40)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f781bf\",\n  style: {\n    width: p9,\n    background: 'rgb(247, 129, 191)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#999999\",\n  style: {\n    width: p9,\n    background: 'rgb(153, 153, 153)'\n  }\n}));\n_scheme.schemesJSX['set2'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#66c2a5\",\n  style: {\n    width: p8,\n    background: 'rgb(102, 194, 165)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fc8d62\",\n  style: {\n    width: p8,\n    background: 'rgb(252, 141, 98)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#8da0cb\",\n  style: {\n    width: p8,\n    background: 'rgb(141, 160, 203)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e78ac3\",\n  style: {\n    width: p8,\n    background: 'rgb(231, 138, 195)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#a6d854\",\n  style: {\n    width: p8,\n    background: 'rgb(166, 216, 84)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffd92f\",\n  style: {\n    width: p8,\n    background: 'rgb(255, 217, 47)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e5c494\",\n  style: {\n    width: p8,\n    background: 'rgb(229, 196, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b3b3b3\",\n  style: {\n    width: p8,\n    background: 'rgb(179, 179, 179)'\n  }\n}));\n_scheme.schemesJSX['set3'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#8dd3c7\",\n  style: {\n    width: p12,\n    background: 'rgb(141, 211, 199)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffffb3\",\n  style: {\n    width: p12,\n    background: 'rgb(255, 255, 179)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bebada\",\n  style: {\n    width: p12,\n    background: 'rgb(190, 186, 218)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fb8072\",\n  style: {\n    width: p12,\n    background: 'rgb(251, 128, 114)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#80b1d3\",\n  style: {\n    width: p12,\n    background: 'rgb(128, 177, 211)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fdb462\",\n  style: {\n    width: p12,\n    background: 'rgb(253, 180, 98)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b3de69\",\n  style: {\n    width: p12,\n    background: 'rgb(179, 222, 105)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fccde5\",\n  style: {\n    width: p12,\n    background: 'rgb(252, 205, 229)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d9d9d9\",\n  style: {\n    width: p12,\n    background: 'rgb(217, 217, 217)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bc80bd\",\n  style: {\n    width: p12,\n    background: 'rgb(188, 128, 189)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ccebc5\",\n  style: {\n    width: p12,\n    background: 'rgb(204, 235, 197)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffed6f\",\n  style: {\n    width: p12,\n    background: 'rgb(255, 237, 111)'\n  }\n}));\n_scheme.schemesJSX['tableau10'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#4c78a8\",\n  style: {\n    width: p10,\n    background: 'rgb(76, 120, 168)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f58518\",\n  style: {\n    width: p10,\n    background: 'rgb(245, 133, 24)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e45756\",\n  style: {\n    width: p10,\n    background: 'rgb(228, 87, 86)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#72b7b2\",\n  style: {\n    width: p10,\n    background: 'rgb(114, 183, 178)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#54a24b\",\n  style: {\n    width: p10,\n    background: 'rgb(84, 162, 75)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#eeca3b\",\n  style: {\n    width: p10,\n    background: 'rgb(238, 202, 59)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b279a2\",\n  style: {\n    width: p10,\n    background: 'rgb(178, 121, 162)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff9da6\",\n  style: {\n    width: p10,\n    background: 'rgb(255, 157, 166)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9d755d\",\n  style: {\n    width: p10,\n    background: 'rgb(157, 117, 93)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bab0ac\",\n  style: {\n    width: p10,\n    background: 'rgb(186, 176, 172)'\n  }\n}));\n_scheme.schemesJSX['tableau20'] = React.createElement(\"div\", {\n  className: \"swatch\"\n}, React.createElement(\"div\", {\n  title: \"#4c78a8\",\n  style: {\n    width: p20,\n    background: 'rgb(76, 120, 168)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9ecae9\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 202, 233)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f58518\",\n  style: {\n    width: p20,\n    background: 'rgb(245, 133, 24)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ffbf79\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 191, 121)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#54a24b\",\n  style: {\n    width: p20,\n    background: 'rgb(84, 162, 75)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#88d27a\",\n  style: {\n    width: p20,\n    background: 'rgb(136, 210, 122)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b79a20\",\n  style: {\n    width: p20,\n    background: 'rgb(183, 154, 32)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#f2cf5b\",\n  style: {\n    width: p20,\n    background: 'rgb(242, 207, 91)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#439894\",\n  style: {\n    width: p20,\n    background: 'rgb(67, 152, 148)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#83bcb6\",\n  style: {\n    width: p20,\n    background: 'rgb(131, 188, 182)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#e45756\",\n  style: {\n    width: p20,\n    background: 'rgb(228, 87, 86)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#ff9d98\",\n  style: {\n    width: p20,\n    background: 'rgb(255, 157, 152)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#79706e\",\n  style: {\n    width: p20,\n    background: 'rgb(121, 112, 110)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#bab0ac\",\n  style: {\n    width: p20,\n    background: 'rgb(186, 176, 172)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d67195\",\n  style: {\n    width: p20,\n    background: 'rgb(214, 113, 149)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#fcbfd2\",\n  style: {\n    width: p20,\n    background: 'rgb(252, 191, 210)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#b279a2\",\n  style: {\n    width: p20,\n    background: 'rgb(178, 121, 162)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d6a5c9\",\n  style: {\n    width: p20,\n    background: 'rgb(214, 165, 201)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#9e765f\",\n  style: {\n    width: p20,\n    background: 'rgb(158, 118, 95)'\n  }\n}), React.createElement(\"div\", {\n  title: \"#d8b5a5\",\n  style: {\n    width: p20,\n    background: 'rgb(216, 181, 165)'\n  }\n}));\n\nfunction categorical(selected) {\n  return [(0, _scheme.schemeOption)(selected, 'accent'), (0, _scheme.schemeOption)(selected, 'category10'), (0, _scheme.schemeOption)(selected, 'category20'), (0, _scheme.schemeOption)(selected, 'category20b'), (0, _scheme.schemeOption)(selected, 'category20c'), (0, _scheme.schemeOption)(selected, 'dark2'), (0, _scheme.schemeOption)(selected, 'paired'), (0, _scheme.schemeOption)(selected, 'pastel1'), (0, _scheme.schemeOption)(selected, 'pastel2'), (0, _scheme.schemeOption)(selected, 'set1'), (0, _scheme.schemeOption)(selected, 'set2'), (0, _scheme.schemeOption)(selected, 'set3'), (0, _scheme.schemeOption)(selected, 'tableau10'), (0, _scheme.schemeOption)(selected, 'tableau20')];\n}\n},{\"react\":\"ccIB\",\"./scheme\":\"BSWy\"}],\"wtjh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.diverging = diverging;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n_scheme.schemesJSX['blueorange'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-blueorange\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(5, 48, 97)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(34, 101, 163)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(75, 148, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(143, 194, 221)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(205, 227, 238)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(242, 240, 235)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(253, 221, 179)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(248, 182, 100)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(221, 132, 31)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(178, 90, 9)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(127, 59, 8)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-blueorange)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['brownbluegreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-brownbluegreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(84, 48, 5)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(139, 84, 15)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(188, 132, 53)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(222, 190, 123)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(242, 228, 192)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(238, 241, 234)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(195, 231, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(127, 201, 191)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(57, 152, 143)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(10, 103, 95)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 60, 48)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-brownbluegreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purplegreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purplegreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(64, 0, 75)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(115, 47, 128)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(154, 109, 170)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(193, 164, 205)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(228, 210, 230)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(239, 240, 239)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(214, 238, 209)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(162, 215, 158)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(92, 173, 101)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(33, 120, 57)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 68, 27)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purplegreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['pinkyellowgreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-pinkyellowgreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(142, 1, 82)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(192, 38, 126)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(221, 114, 173)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(240, 179, 214)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(250, 221, 237)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(245, 243, 239)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(225, 242, 202)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(182, 222, 135)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(128, 187, 71)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(79, 145, 37)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(39, 100, 25)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-pinkyellowgreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purpleorange'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purpleorange\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(45, 0, 75)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(85, 45, 132)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(129, 112, 172)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(176, 170, 208)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(215, 215, 233)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(243, 238, 234)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(253, 221, 179)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(248, 182, 100)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(221, 132, 31)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(178, 90, 9)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(127, 59, 8)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purpleorange)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(103, 0, 31)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(172, 32, 47)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(213, 96, 80)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(241, 163, 133)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(251, 215, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(242, 239, 238)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(205, 227, 238)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(143, 194, 221)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(75, 148, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(34, 101, 163)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(5, 48, 97)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redgrey'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redgrey\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(103, 0, 31)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(172, 32, 47)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(213, 96, 80)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(241, 163, 133)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(252, 216, 197)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(250, 244, 241)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(223, 223, 223)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(184, 184, 184)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(134, 134, 134)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(78, 78, 78)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(26, 26, 26)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redgrey)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redyellowblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redyellowblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(165, 0, 38)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(212, 50, 44)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(241, 110, 67)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(252, 172, 100)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 221, 144)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(250, 248, 193)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(220, 241, 236)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(171, 214, 232)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(117, 171, 208)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(74, 116, 180)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(49, 54, 149)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redyellowblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redyellowgreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redyellowgreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(165, 0, 38)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(212, 50, 44)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(241, 110, 67)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(252, 172, 99)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 221, 141)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(249, 247, 174)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(215, 238, 142)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(164, 216, 110)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(100, 188, 97)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(34, 150, 79)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 104, 55)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redyellowgreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['spectral'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-spectral\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(158, 1, 66)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(209, 60, 75)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(240, 112, 74)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(252, 172, 99)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 221, 141)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(251, 248, 176)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(224, 243, 161)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(169, 221, 162)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(105, 189, 169)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(66, 136, 181)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(94, 79, 162)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-spectral)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n\nfunction diverging(selected) {\n  return [(0, _scheme.schemeOption)(selected, 'blueorange'), (0, _scheme.schemeOption)(selected, 'brownbluegreen'), (0, _scheme.schemeOption)(selected, 'purplegreen'), (0, _scheme.schemeOption)(selected, 'pinkyellowgreen'), (0, _scheme.schemeOption)(selected, 'purpleorange'), (0, _scheme.schemeOption)(selected, 'redblue'), (0, _scheme.schemeOption)(selected, 'redgrey'), (0, _scheme.schemeOption)(selected, 'redyellowblue'), (0, _scheme.schemeOption)(selected, 'redyellowgreen'), (0, _scheme.schemeOption)(selected, 'spectral')];\n}\n},{\"react\":\"ccIB\",\"./scheme\":\"BSWy\"}],\"uM5k\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.dual = dual;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n_sanddanceReact.SandDance.colorSchemes.filter(function (cs) {\n  return cs.colors.length === 2;\n}).map(function (binaryScheme, i) {\n  _scheme.schemesJSX[binaryScheme.scheme] = React.createElement(\"div\", {\n    className: \"swatch\"\n  }, binaryScheme.colors.map(function (color, j) {\n    return React.createElement(\"div\", {\n      key: j,\n      title: color,\n      style: {\n        width: '50%',\n        backgroundColor: color\n      }\n    });\n  }));\n});\n\nfunction dual(selected) {\n  return _sanddanceReact.SandDance.colorSchemes.filter(function (cs) {\n    return cs.colors.length === 2;\n  }).map(function (binaryScheme, i) {\n    return (0, _scheme.schemeOption)(selected, binaryScheme.scheme);\n  });\n}\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\",\"./scheme\":\"BSWy\"}],\"rVQa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sequentialMultiHue = sequentialMultiHue;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n_scheme.schemesJSX['viridis'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-viridis\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"#440154\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"#482475\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"#414487\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"#355f8d\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"#2a788e\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"#21918c\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"#22a884\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"#44bf70\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"#7ad151\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"#bddf26\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"#fde725\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-viridis)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['inferno'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-inferno\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"#000004\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"#160b39\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"#420a68\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"#6a176e\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"#932667\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"#bc3754\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"#dd513a\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"#f37819\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"#fca50a\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"#f6d746\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"#fcffa4\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-inferno)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['magma'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-magma\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"#000004\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"#140e36\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"#3b0f70\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"#641a80\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"#8c2981\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"#b73779\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"#de4968\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"#f7705c\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"#fe9f6d\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"#fecf92\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"#fcfdbf\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-magma)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['plasma'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-plasma\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"#0d0887\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"#41049d\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"#6a00a8\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"#8f0da4\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"#b12a90\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"#cc4778\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"#e16462\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"#f2844b\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"#fca636\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"#fcce25\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"#f0f921\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-plasma)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['bluegreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-bluegreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 252, 253)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(232, 246, 249)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(213, 239, 237)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(183, 228, 218)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(143, 211, 193)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(104, 194, 163)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(73, 177, 127)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(47, 153, 89)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(21, 127, 60)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(3, 100, 41)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 68, 27)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-bluegreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['bluepurple'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-bluepurple\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 252, 253)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(228, 238, 245)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(204, 221, 236)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(178, 202, 225)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(156, 179, 213)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(143, 149, 198)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(140, 116, 181)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(137, 82, 165)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(133, 45, 143)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(115, 15, 113)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(77, 0, 75)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-bluepurple)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['greenblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-greenblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 252, 240)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(229, 245, 223)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(211, 238, 206)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(189, 229, 191)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(158, 217, 187)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(123, 203, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(88, 183, 205)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(57, 156, 198)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(29, 126, 183)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(11, 96, 161)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(8, 64, 129)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-greenblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['orangered'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-orangered\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 247, 236)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(254, 235, 207)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(253, 220, 175)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(253, 202, 148)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(253, 176, 122)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(250, 142, 93)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(241, 108, 73)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(224, 69, 48)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(200, 29, 19)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(167, 4, 3)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(127, 0, 0)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-orangered)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purplebluegreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purplebluegreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 247, 251)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(239, 231, 242)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(219, 216, 234)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(190, 201, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(152, 185, 217)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(105, 168, 207)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(64, 150, 192)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(25, 135, 159)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(3, 120, 119)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(1, 99, 83)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(1, 70, 54)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purplebluegreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purpleblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purpleblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 247, 251)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(239, 234, 244)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(219, 218, 235)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(191, 201, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(155, 185, 217)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(114, 168, 207)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(67, 148, 195)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(26, 125, 182)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(6, 103, 161)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(4, 82, 129)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(2, 56, 88)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purpleblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purplered'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purplered\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 244, 249)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(234, 227, 240)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(220, 201, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(208, 170, 210)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(208, 138, 194)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(221, 99, 174)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(227, 56, 144)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(215, 28, 108)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(183, 11, 79)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(143, 2, 58)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(103, 0, 31)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purplered)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['redpurple'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-redpurple\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 247, 243)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(253, 228, 225)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(252, 207, 204)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(251, 181, 188)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(249, 147, 176)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(243, 105, 163)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(224, 62, 152)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(192, 23, 136)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(153, 3, 124)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(112, 1, 116)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(73, 0, 106)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-redpurple)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['yellowgreenblue'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-yellowgreenblue\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 217)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(239, 249, 189)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(213, 238, 179)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(169, 221, 183)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(115, 201, 189)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(69, 180, 194)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(40, 151, 191)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(32, 115, 178)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(35, 78, 160)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(28, 49, 133)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(8, 29, 88)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-yellowgreenblue)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['yellowgreen'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-yellowgreen\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 229)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(247, 252, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(228, 244, 172)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(199, 232, 155)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(162, 216, 138)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(120, 197, 120)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(78, 175, 99)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(47, 148, 78)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(21, 121, 63)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(3, 96, 52)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 69, 41)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-yellowgreen)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['yelloworangebrown'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-yelloworangebrown\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 229)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(255, 248, 196)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(254, 234, 161)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(254, 214, 118)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 186, 74)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(251, 153, 44)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(238, 121, 24)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(216, 91, 10)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(183, 67, 4)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(143, 50, 4)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(102, 37, 6)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-yelloworangebrown)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['yelloworangered'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-yelloworangered\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 204)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(255, 240, 169)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(254, 224, 135)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(254, 201, 101)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(254, 171, 75)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(253, 137, 60)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(250, 92, 46)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(236, 48, 35)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(211, 17, 33)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(175, 2, 37)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(128, 0, 38)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-yelloworangered)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n\nfunction sequentialMultiHue(selected) {\n  return [(0, _scheme.schemeOption)(selected, 'viridis'), (0, _scheme.schemeOption)(selected, 'inferno'), (0, _scheme.schemeOption)(selected, 'magma'), (0, _scheme.schemeOption)(selected, 'plasma'), (0, _scheme.schemeOption)(selected, 'bluegreen'), (0, _scheme.schemeOption)(selected, 'bluepurple'), (0, _scheme.schemeOption)(selected, 'greenblue'), (0, _scheme.schemeOption)(selected, 'orangered'), (0, _scheme.schemeOption)(selected, 'purplebluegreen'), (0, _scheme.schemeOption)(selected, 'purpleblue'), (0, _scheme.schemeOption)(selected, 'purplered'), (0, _scheme.schemeOption)(selected, 'redpurple'), (0, _scheme.schemeOption)(selected, 'yellowgreenblue'), (0, _scheme.schemeOption)(selected, 'yellowgreen'), (0, _scheme.schemeOption)(selected, 'yelloworangebrown'), (0, _scheme.schemeOption)(selected, 'yelloworangered')];\n}\n},{\"react\":\"ccIB\",\"./scheme\":\"BSWy\"}],\"Prvn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sequentialSingleHue = sequentialSingleHue;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _scheme = require(\"./scheme\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n_scheme.schemesJSX['blues'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-blues\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 251, 255)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(227, 238, 249)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(207, 225, 242)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(181, 212, 233)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(147, 195, 223)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(109, 174, 213)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(75, 151, 201)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(47, 126, 188)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(24, 100, 170)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(10, 74, 144)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(8, 48, 107)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-blues)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['greens'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-greens\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(247, 252, 245)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(232, 246, 227)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(211, 238, 205)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(183, 226, 177)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(151, 212, 148)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(115, 195, 120)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(77, 175, 98)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(47, 152, 79)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(21, 127, 59)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(3, 100, 41)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 68, 27)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-greens)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['greys'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-greys\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 255, 255)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(242, 242, 242)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(226, 226, 226)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(206, 206, 206)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(180, 180, 180)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(151, 151, 151)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(122, 122, 122)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(95, 95, 95)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(64, 64, 64)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(30, 30, 30)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(0, 0, 0)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-greys)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['purples'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-purples\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(252, 251, 253)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(241, 239, 246)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(226, 225, 239)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(206, 206, 229)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(182, 181, 216)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(158, 155, 201)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(135, 130, 188)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(115, 99, 172)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(97, 64, 155)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(80, 31, 140)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(63, 0, 125)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-purples)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['reds'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-reds\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 245, 240)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(254, 227, 214)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(253, 201, 180)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(252, 170, 142)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(252, 138, 107)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(249, 105, 76)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(239, 69, 51)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(217, 39, 35)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(187, 21, 26)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(151, 11, 19)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(103, 0, 13)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-reds)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n_scheme.schemesJSX['oranges'] = React.createElement(\"svg\", {\n  viewBox: \"0,0,1,1\",\n  preserveAspectRatio: \"none\"\n}, React.createElement(\"defs\", null, React.createElement(\"linearGradient\", {\n  id: \"gradient-oranges\"\n}, React.createElement(\"stop\", {\n  offset: \"0%\",\n  stopColor: \"rgb(255, 245, 235)\"\n}), React.createElement(\"stop\", {\n  offset: \"10%\",\n  stopColor: \"rgb(254, 232, 211)\"\n}), React.createElement(\"stop\", {\n  offset: \"20%\",\n  stopColor: \"rgb(253, 216, 179)\"\n}), React.createElement(\"stop\", {\n  offset: \"30%\",\n  stopColor: \"rgb(253, 194, 140)\"\n}), React.createElement(\"stop\", {\n  offset: \"40%\",\n  stopColor: \"rgb(253, 167, 98)\"\n}), React.createElement(\"stop\", {\n  offset: \"50%\",\n  stopColor: \"rgb(251, 141, 61)\"\n}), React.createElement(\"stop\", {\n  offset: \"60%\",\n  stopColor: \"rgb(242, 112, 29)\"\n}), React.createElement(\"stop\", {\n  offset: \"70%\",\n  stopColor: \"rgb(226, 86, 9)\"\n}), React.createElement(\"stop\", {\n  offset: \"80%\",\n  stopColor: \"rgb(196, 65, 3)\"\n}), React.createElement(\"stop\", {\n  offset: \"90%\",\n  stopColor: \"rgb(159, 51, 3)\"\n}), React.createElement(\"stop\", {\n  offset: \"100%\",\n  stopColor: \"rgb(127, 39, 4)\"\n}))), React.createElement(\"rect\", {\n  fill: \"url(#gradient-oranges)\",\n  x: \"0\",\n  y: \"0\",\n  width: \"1\",\n  height: \"1\"\n}));\n\nfunction sequentialSingleHue(selected) {\n  return [(0, _scheme.schemeOption)(selected, 'blues'), (0, _scheme.schemeOption)(selected, 'greens'), (0, _scheme.schemeOption)(selected, 'greys'), (0, _scheme.schemeOption)(selected, 'purples'), (0, _scheme.schemeOption)(selected, 'reds'), (0, _scheme.schemeOption)(selected, 'oranges')];\n}\n},{\"react\":\"ccIB\",\"./scheme\":\"BSWy\"}],\"otJp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Palette = Palette;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _categorical = require(\"./categorical\");\n\nvar _diverging = require(\"./diverging\");\n\nvar _dropdown = require(\"../controls/dropdown\");\n\nvar _dual = require(\"./dual\");\n\nvar _scheme = require(\"./scheme\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _sequentialMultiHue = require(\"./sequentialMultiHue\");\n\nvar _sequentialSingleHue = require(\"./sequentialSingleHue\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar maxDistinctColors = 20;\n\nfunction Palette(props) {\n  var distinctValueCount = props.colorColumn.stats.distinctValueCount;\n  var isDual = distinctValueCount === 2;\n  var categoricalNumeric = distinctValueCount > 0 && distinctValueCount < maxDistinctColors;\n  var isQualitative = false;\n  var isQuantitative = false;\n\n  switch (props.colorColumn.type) {\n    case 'boolean':\n    case 'string':\n      isQualitative = true;\n      break;\n\n    case 'number':\n      isQuantitative = true;\n      break;\n\n    case 'date':\n    case 'integer':\n      isQuantitative = true;\n      isQualitative = categoricalNumeric;\n  }\n\n  var selected = props.scheme;\n  var options = [];\n\n  function menu(name, opts) {\n    options.push({\n      key: name,\n      text: name,\n      itemType: _base.base.fabric.DropdownMenuItemType.Header\n    });\n    options.push.apply(options, opts);\n  }\n\n  isQualitative && menu(_language.strings.schemeCategorical, (0, _categorical.categorical)(selected));\n  isQuantitative && menu(_language.strings.schemeSequentialSingleHue, (0, _sequentialSingleHue.sequentialSingleHue)(selected));\n  isQuantitative && menu(_language.strings.schemeSequentialMultiHue, (0, _sequentialMultiHue.sequentialMultiHue)(selected));\n  isQuantitative && menu(_language.strings.schemeDiverging, (0, _diverging.diverging)(selected));\n  isDual && menu(_language.strings.schemeDual, (0, _dual.dual)(selected));\n  return React.createElement(\"div\", {\n    className: \"sanddance-palette\"\n  }, React.createElement(\"div\", {\n    className: \"sanddance-explanation\",\n    dangerouslySetInnerHTML: {\n      __html: _language.strings.labelColorFieldInfo(props.colorColumn.name, props.colorColumn.type, categoricalNumeric, distinctValueCount)\n    }\n  }), React.createElement(_dropdown.Dropdown, {\n    collapseLabel: props.collapseLabel,\n    disabled: props.disabled,\n    dropdownWidth: 400,\n    label: _language.strings.labelColorScheme,\n    onRenderOption: function onRenderOption(option) {\n      if (option.itemType === _base.base.fabric.DropdownMenuItemType.Header) {\n        return React.createElement(\"span\", null, option.text);\n      } else {\n        return React.createElement(\"div\", {\n          className: \"sanddance-scheme option\"\n        }, React.createElement(\"span\", {\n          className: \"name\"\n        }, option.scheme), option.children);\n      }\n    },\n    options: options,\n    onChange: function onChange(e, o) {\n      props.changeColorScheme(o.scheme);\n    }\n  }), React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-scheme', props.disabled && 'disabled')\n  }, props.scheme && _scheme.schemesJSX[props.scheme]));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./categorical\":\"JrIT\",\"./diverging\":\"wtjh\",\"../controls/dropdown\":\"Uyrp\",\"./dual\":\"uM5k\",\"./scheme\":\"BSWy\",\"@msrvida/sanddance-react\":\"MjKu\",\"./sequentialMultiHue\":\"rVQa\",\"./sequentialSingleHue\":\"Prvn\",\"../language\":\"hk5u\"}],\"N8IJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Color = Color;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _columnMap = require(\"../controls/columnMap\");\n\nvar _palettes = require(\"../palettes\");\n\nvar _signal = require(\"../controls/signal\");\n\nvar _language = require(\"../language\");\n\nvar _group = require(\"../controls/group\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Color(props) {\n  var colorColumn = props.dataContent.columns.filter(function (c) {\n    return c.name === props.colorColumn;\n  })[0];\n  var disabledColorBin = !colorColumn || !colorColumn.quantitative || props.directColor;\n  var colorBin = props.colorBin || 'quantize';\n  return React.createElement(\"div\", {\n    className: \"sanddance-color-dialog\"\n  }, React.createElement(_group.Group, {\n    label: _language.strings.labelColor\n  }, React.createElement(_columnMap.ColumnMap, Object.assign({}, props, {\n    collapseLabel: props.compactUI,\n    selectedColumnName: props.colorColumn,\n    specRole: props.specCapabilities && props.specCapabilities.roles.filter(function (r) {\n      return r.role === 'color';\n    })[0],\n    key: 0\n  })), colorColumn && colorColumn.isColorData && React.createElement(\"div\", {\n    className: \"sanddance-explanation\",\n    dangerouslySetInnerHTML: {\n      __html: _language.strings.labelColorFieldIsColorData(colorColumn.name)\n    }\n  }), colorColumn && !colorColumn.isColorData && React.createElement(_palettes.Palette, {\n    collapseLabel: props.compactUI,\n    scheme: props.scheme,\n    colorColumn: colorColumn,\n    changeColorScheme: function changeColorScheme(scheme) {\n      props.onColorSchemeChange(scheme);\n    },\n    disabled: props.disabled || props.directColor || colorColumn && colorColumn.isColorData\n  }), colorColumn && !colorColumn.isColorData && React.createElement(_signal.Signal, {\n    disabled: props.disabled || !colorColumn || props.directColor || colorColumn && colorColumn.isColorData,\n    signal: props.colorReverseSignal,\n    explorer: props.explorer,\n    onChange: props.onColorReverseChange\n  })), colorColumn && !colorColumn.isColorData && React.createElement(_group.Group, {\n    label: _language.strings.labelColorBin\n  }, React.createElement(\"div\", {\n    className: \"sanddance-explanation\"\n  }, _language.strings.labelColorBinExplanation), React.createElement(_base.base.fabric.ChoiceGroup, {\n    options: [{\n      key: 'continuous',\n      text: _language.strings.labelColorBinNone,\n      checked: colorBin === 'continuous',\n      disabled: disabledColorBin\n    }, {\n      key: 'quantize',\n      text: _language.strings.labelColorBinQuantize,\n      checked: colorBin === 'quantize',\n      disabled: disabledColorBin\n    }, {\n      key: 'quantile',\n      text: _language.strings.labelColorBinQuantile,\n      checked: colorBin === 'quantile',\n      disabled: disabledColorBin\n    }],\n    onChange: function onChange(e, o) {\n      props.onColorBinChange(o.key);\n    }\n  }), React.createElement(_signal.Signal, {\n    disabled: props.disabled || disabledColorBin || props.colorBin === 'continuous',\n    signal: props.colorBinSignal,\n    explorer: props.explorer,\n    onChange: props.onColorBinCountChange\n  })), colorColumn && !colorColumn.isColorData && React.createElement(_group.Group, {\n    label: _language.strings.labelColorOptions\n  }, React.createElement(_base.base.fabric.Toggle, {\n    label: _language.strings.selectDirectColor,\n    disabled: !colorColumn.stats.hasColorData,\n    checked: !!(colorColumn.stats.hasColorData && props.directColor),\n    onChange: function onChange(e, checked) {\n      return props.onDirectColorChange(checked);\n    }\n  }), React.createElement(\"div\", {\n    className: \"sanddance-explanation\",\n    dangerouslySetInnerHTML: {\n      __html: _language.strings.labelDataColors\n    }\n  })));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../controls/columnMap\":\"DSho\",\"../palettes\":\"otJp\",\"../controls/signal\":\"OWDI\",\"../language\":\"hk5u\",\"../controls/group\":\"Q3hf\"}],\"tb7d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initPrefs = initPrefs;\nexports.saveSignalValuePref = saveSignalValuePref;\nexports.copyPrefToNewState = copyPrefToNewState;\nexports.savePref = savePref;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction initPrefs(prefs, partialInsight) {\n  if (partialInsight) {\n    var specTypePrefs = prefs[partialInsight.chart] || {};\n    prefs[partialInsight.chart] = specTypePrefs;\n\n    for (var _role in partialInsight.columns) {\n      var role = _role;\n\n      if (role === 'color' || role === 'x') {\n        (function () {\n          var rolePrefs = specTypePrefs[role] || {};\n          specTypePrefs[role] = rolePrefs;\n          var column = partialInsight.columns[role];\n\n          var copySignalValue = function copySignalValue(signalName) {\n            if (partialInsight.signalValues && partialInsight.signalValues[signalName] && rolePrefs[column]) {\n              var signalValues = rolePrefs[column].signalValues || {};\n              signalValues[signalName] = partialInsight.signalValues[signalName];\n              rolePrefs[column].signalValues = signalValues;\n            }\n          };\n\n          switch (role) {\n            case 'color':\n              rolePrefs[column] = {\n                scheme: partialInsight.scheme,\n                colorBin: partialInsight.colorBin\n              };\n              copySignalValue(_sanddanceReact.SandDance.constants.SignalNames.ColorBinCount);\n              break;\n\n            case 'x':\n              copySignalValue(_sanddanceReact.SandDance.constants.SignalNames.XBins);\n              break;\n          }\n        })();\n      }\n    }\n  }\n}\n\nfunction saveSignalValuePref(prefs, chart, role, column, signalName, signalValue) {\n  var partialInsight = savePref(prefs, chart, role, column, {\n    signalValues: {}\n  });\n  partialInsight.signalValues[signalName] = signalValue;\n}\n\nfunction copyPrefToNewState(prefs, chart, role, columnName) {\n  var specTypePrefs = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge({}, prefs['*'], prefs[chart]);\n\n  var rolePrefs = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge({}, specTypePrefs['*'], specTypePrefs[role]);\n\n  var partialInsight = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge({}, rolePrefs['*'], rolePrefs[columnName]);\n\n  return partialInsight;\n}\n\nfunction savePref(prefs, chart, role, column, partialInsight) {\n  var SpecTypePrefs = prefs[chart] || {};\n  prefs[chart] = SpecTypePrefs;\n  var rolePrefs = SpecTypePrefs[role] || {};\n  SpecTypePrefs[role] = rolePrefs;\n  rolePrefs[column] = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge({}, rolePrefs[column], partialInsight);\n  return rolePrefs[column];\n}\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"Gai8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataItem = DataItem;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction isNumber(value) {\n  if (typeof value === 'number') return true;\n  if (!isNaN(value)) return true;\n  return false;\n}\n\nfunction isBoolean(value) {\n  if (typeof value === 'boolean') return true;\n\n  if (typeof value === 'string') {\n    switch (value.toLowerCase()) {\n      case true + '':\n      case false + '':\n        return true;\n    }\n  }\n\n  return false;\n}\n\nfunction bingSearchLink(column, value) {\n  if (isNumber(value)) return null;\n  if (isBoolean(value)) return null;\n  if (column && column.stats.distinctValueCount === 2) return null;\n  return React.createElement(\"div\", {\n    className: 'bing-search'\n  }, React.createElement(\"a\", {\n    href: \"https://www.bing.com/search?q=\".concat(encodeURIComponent(value)),\n    target: '_blank',\n    title: _language.strings.bingsearchDescription(value),\n    \"aria-label\": _language.strings.bingsearchDescription(value)\n  }, _language.strings.bingsearch));\n}\n\nfunction displayValue(value) {\n  switch (value) {\n    case '':\n      {\n        return {\n          special: true,\n          display: _language.strings.labelBlank\n        };\n      }\n\n    case null:\n      {\n        return {\n          special: true,\n          display: _language.strings.labelNull\n        };\n      }\n\n    case true:\n      {\n        return {\n          special: true,\n          display: _language.strings.labelTrue\n        };\n      }\n\n    case false:\n      {\n        return {\n          special: true,\n          display: _language.strings.labelFalse\n        };\n      }\n\n    default:\n      {\n        if (_typeof(value) === 'object') {\n          if (value instanceof Date) {\n            var d = value;\n            return displayValue(d.input);\n          }\n\n          return {\n            special: false,\n            display: value.toLocaleString()\n          };\n        }\n\n        return {\n          special: false,\n          display: value\n        };\n      }\n  }\n}\n\nfunction displayValueElement(nvp) {\n  var d = displayValue(nvp.value);\n\n  if (d.special) {\n    return React.createElement(\"i\", null, d.display);\n  }\n\n  return d.display;\n}\n\nvar KeyCodes = {\n  ENTER: 13\n};\n\nfunction DataItem(props) {\n  if (!props.item) {\n    return null;\n  }\n\n  var nameValuePairs = [];\n\n  var _loop = function _loop(columnName) {\n    if (columnName === _sanddanceReact.SandDance.VegaDeckGl.constants.GL_ORDINAL && !props.showSystemFields) {\n      return \"continue\";\n    }\n\n    if (_sanddanceReact.SandDance.util.isInternalFieldName(columnName)) {\n      return \"continue\";\n    }\n\n    var nameValuePair = {\n      columnName: columnName,\n      value: props.item[columnName]\n    };\n\n    if (!props.bingSearchDisabled) {\n      nameValuePair.bingSearch = bingSearchLink(props.columns.filter(function (c) {\n        return c.name === columnName;\n      })[0], props.item[columnName]);\n    }\n\n    nameValuePairs.push(nameValuePair);\n  };\n\n  for (var columnName in props.item) {\n    var _ret = _loop(columnName);\n\n    if (_ret === \"continue\") continue;\n  }\n\n  return React.createElement(\"div\", {\n    className: \"sanddance-dataItem\"\n  }, nameValuePairs.map(function (nameValuePair, i) {\n    var ex = {\n      key: 0,\n      name: nameValuePair.columnName,\n      operator: '==',\n      value: nameValuePair.value\n    };\n\n    if (nameValuePair.value === null || nameValuePair.value === '') {\n      ex.operator = 'isnullorEmpty';\n      delete ex.value;\n    }\n\n    var searchClick = function searchClick(e) {\n      var search = {\n        key: 0,\n        expressions: [ex]\n      };\n      props.onSearch(e, [search]);\n    };\n\n    var title = _language.strings.tooltipSearch(nameValuePair.columnName, displayValue(nameValuePair.value).display);\n\n    return React.createElement(\"div\", {\n      key: i,\n      onClick: !props.disabled ? searchClick : null,\n      title: title,\n      onKeyUp: function onKeyUp(e) {\n        if (e.keyCode === KeyCodes.ENTER) {\n          searchClick(e);\n        }\n      },\n      tabIndex: 0,\n      className: \"name-value\"\n    }, React.createElement(\"div\", {\n      className: \"column-name\"\n    }, nameValuePair.columnName), React.createElement(\"div\", {\n      className: \"column-value\"\n    }, displayValueElement(nameValuePair)), nameValuePair.bingSearch);\n  }));\n}\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"eqtW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Button = Button;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Button(props) {\n  return React.createElement(_base.base.fabric.DefaultButton, Object.assign({}, props, {\n    styles: {\n      root: {\n        backgroundColor: 'transparent',\n        height: '30px',\n        width: props.width,\n        padding: 0\n      },\n      rootDisabled: {\n        backgroundColor: 'transparent'\n      },\n      icon: {\n        color: props.themePalette.themePrimary\n      },\n      label: {\n        fontWeight: '400',\n        textAlign: props.textAlign || 'left'\n      }\n    },\n    iconProps: {\n      iconName: props.iconName\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\"}],\"fiGR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nfunction _default(x, p) {\n  if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n\n  var i,\n      coefficient = x.slice(0, i); // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n  // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n\n  return [coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, +x.slice(i + 1)];\n}\n},{}],\"G46r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(x) {\n  return x = (0, _formatDecimal.default)(Math.abs(x)), x ? x[1] : NaN;\n}\n},{\"./formatDecimal.js\":\"fiGR\"}],\"CupU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(grouping, thousands) {\n  return function (value, width) {\n    var i = value.length,\n        t = [],\n        j = 0,\n        g = grouping[0],\n        length = 0;\n\n    while (i > 0 && g > 0) {\n      if (length + g + 1 > width) g = Math.max(1, width - length);\n      t.push(value.substring(i -= g, i + g));\n      if ((length += g + 1) > width) break;\n      g = grouping[j = (j + 1) % grouping.length];\n    }\n\n    return t.reverse().join(thousands);\n  };\n}\n},{}],\"mUgz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(numerals) {\n  return function (value) {\n    return value.replace(/[0-9]/g, function (i) {\n      return numerals[+i];\n    });\n  };\n}\n},{}],\"Nf4q\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = formatSpecifier;\nexports.FormatSpecifier = FormatSpecifier;\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nfunction formatSpecifier(specifier) {\n  if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n  var match;\n  return new FormatSpecifier({\n    fill: match[1],\n    align: match[2],\n    sign: match[3],\n    symbol: match[4],\n    zero: match[5],\n    width: match[6],\n    comma: match[7],\n    precision: match[8] && match[8].slice(1),\n    trim: match[9],\n    type: match[10]\n  });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n  this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n  this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n  this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n  this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n  this.zero = !!specifier.zero;\n  this.width = specifier.width === undefined ? undefined : +specifier.width;\n  this.comma = !!specifier.comma;\n  this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n  this.trim = !!specifier.trim;\n  this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function () {\n  return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n},{}],\"sIkL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nfunction _default(s) {\n  out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n    switch (s[i]) {\n      case \".\":\n        i0 = i1 = i;\n        break;\n\n      case \"0\":\n        if (i0 === 0) i0 = i;\n        i1 = i;\n        break;\n\n      default:\n        if (i0 > 0) {\n          if (!+s[i]) break out;\n          i0 = 0;\n        }\n\n        break;\n    }\n  }\n\n  return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n},{}],\"WMxc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.prefixExponent = void 0;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar prefixExponent;\nexports.prefixExponent = prefixExponent;\n\nfunction _default(x, p) {\n  var d = (0, _formatDecimal.default)(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1],\n      i = exponent - (exports.prefixExponent = prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n      n = coefficient.length;\n  return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, _formatDecimal.default)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n},{\"./formatDecimal.js\":\"fiGR\"}],\"gMFS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(x, p) {\n  var d = (0, _formatDecimal.default)(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1];\n  return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n},{\"./formatDecimal.js\":\"fiGR\"}],\"w40g\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _formatPrefixAuto = _interopRequireDefault(require(\"./formatPrefixAuto.js\"));\n\nvar _formatRounded = _interopRequireDefault(require(\"./formatRounded.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n  \"%\": function (x, p) {\n    return (x * 100).toFixed(p);\n  },\n  \"b\": function (x) {\n    return Math.round(x).toString(2);\n  },\n  \"c\": function (x) {\n    return x + \"\";\n  },\n  \"d\": function (x) {\n    return Math.round(x).toString(10);\n  },\n  \"e\": function (x, p) {\n    return x.toExponential(p);\n  },\n  \"f\": function (x, p) {\n    return x.toFixed(p);\n  },\n  \"g\": function (x, p) {\n    return x.toPrecision(p);\n  },\n  \"o\": function (x) {\n    return Math.round(x).toString(8);\n  },\n  \"p\": function (x, p) {\n    return (0, _formatRounded.default)(x * 100, p);\n  },\n  \"r\": _formatRounded.default,\n  \"s\": _formatPrefixAuto.default,\n  \"X\": function (x) {\n    return Math.round(x).toString(16).toUpperCase();\n  },\n  \"x\": function (x) {\n    return Math.round(x).toString(16);\n  }\n};\nexports.default = _default;\n},{\"./formatPrefixAuto.js\":\"WMxc\",\"./formatRounded.js\":\"gMFS\"}],\"Ecm4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x) {\n  return x;\n}\n},{}],\"Iakc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nvar _formatGroup = _interopRequireDefault(require(\"./formatGroup.js\"));\n\nvar _formatNumerals = _interopRequireDefault(require(\"./formatNumerals.js\"));\n\nvar _formatSpecifier = _interopRequireDefault(require(\"./formatSpecifier.js\"));\n\nvar _formatTrim = _interopRequireDefault(require(\"./formatTrim.js\"));\n\nvar _formatTypes = _interopRequireDefault(require(\"./formatTypes.js\"));\n\nvar _formatPrefixAuto = require(\"./formatPrefixAuto.js\");\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar map = Array.prototype.map,\n    prefixes = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n\nfunction _default(locale) {\n  var group = locale.grouping === undefined || locale.thousands === undefined ? _identity.default : (0, _formatGroup.default)(map.call(locale.grouping, Number), locale.thousands + \"\"),\n      currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n      currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n      decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n      numerals = locale.numerals === undefined ? _identity.default : (0, _formatNumerals.default)(map.call(locale.numerals, String)),\n      percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n      minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\n      nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n  function newFormat(specifier) {\n    specifier = (0, _formatSpecifier.default)(specifier);\n    var fill = specifier.fill,\n        align = specifier.align,\n        sign = specifier.sign,\n        symbol = specifier.symbol,\n        zero = specifier.zero,\n        width = specifier.width,\n        comma = specifier.comma,\n        precision = specifier.precision,\n        trim = specifier.trim,\n        type = specifier.type; // The \"n\" type is an alias for \",g\".\n\n    if (type === \"n\") comma = true, type = \"g\"; // The \"\" type, and any invalid type, is an alias for \".12~g\".\n    else if (!_formatTypes.default[type]) precision === undefined && (precision = 12), trim = true, type = \"g\"; // If zero fill is specified, padding goes after sign and before digits.\n\n    if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\"; // Compute the prefix and suffix.\n    // For SI-prefix, the suffix is lazily computed.\n\n    var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n        suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\"; // What format function should we use?\n    // Is this an integer type?\n    // Can this type generate exponential notation?\n\n    var formatType = _formatTypes.default[type],\n        maybeSuffix = /[defgprs%]/.test(type); // Set the default precision if not specified,\n    // or clamp the specified precision to the supported range.\n    // For significant precision, it must be in [1, 21].\n    // For fixed precision, it must be in [0, 20].\n\n    precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n\n    function format(value) {\n      var valuePrefix = prefix,\n          valueSuffix = suffix,\n          i,\n          n,\n          c;\n\n      if (type === \"c\") {\n        valueSuffix = formatType(value) + valueSuffix;\n        value = \"\";\n      } else {\n        value = +value; // Perform the initial formatting.\n\n        var valueNegative = value < 0;\n        value = isNaN(value) ? nan : formatType(Math.abs(value), precision); // Trim insignificant zeros.\n\n        if (trim) value = (0, _formatTrim.default)(value); // If a negative value rounds to zero during formatting, treat as positive.\n\n        if (valueNegative && +value === 0) valueNegative = false; // Compute the prefix and suffix.\n\n        valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n        valueSuffix = (type === \"s\" ? prefixes[8 + _formatPrefixAuto.prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\"); // Break the formatted value into the integer “value” part that can be\n        // grouped, and fractional or exponential “suffix” part that is not.\n\n        if (maybeSuffix) {\n          i = -1, n = value.length;\n\n          while (++i < n) {\n            if (c = value.charCodeAt(i), 48 > c || c > 57) {\n              valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n              value = value.slice(0, i);\n              break;\n            }\n          }\n        }\n      } // If the fill character is not \"0\", grouping is applied before padding.\n\n\n      if (comma && !zero) value = group(value, Infinity); // Compute the padding.\n\n      var length = valuePrefix.length + value.length + valueSuffix.length,\n          padding = length < width ? new Array(width - length + 1).join(fill) : \"\"; // If the fill character is \"0\", grouping is applied after padding.\n\n      if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\"; // Reconstruct the final output based on the desired alignment.\n\n      switch (align) {\n        case \"<\":\n          value = valuePrefix + value + valueSuffix + padding;\n          break;\n\n        case \"=\":\n          value = valuePrefix + padding + value + valueSuffix;\n          break;\n\n        case \"^\":\n          value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n          break;\n\n        default:\n          value = padding + valuePrefix + value + valueSuffix;\n          break;\n      }\n\n      return numerals(value);\n    }\n\n    format.toString = function () {\n      return specifier + \"\";\n    };\n\n    return format;\n  }\n\n  function formatPrefix(specifier, value) {\n    var f = newFormat((specifier = (0, _formatSpecifier.default)(specifier), specifier.type = \"f\", specifier)),\n        e = Math.max(-8, Math.min(8, Math.floor((0, _exponent.default)(value) / 3))) * 3,\n        k = Math.pow(10, -e),\n        prefix = prefixes[8 + e / 3];\n    return function (value) {\n      return f(k * value) + prefix;\n    };\n  }\n\n  return {\n    format: newFormat,\n    formatPrefix: formatPrefix\n  };\n}\n},{\"./exponent.js\":\"G46r\",\"./formatGroup.js\":\"CupU\",\"./formatNumerals.js\":\"mUgz\",\"./formatSpecifier.js\":\"Nf4q\",\"./formatTrim.js\":\"sIkL\",\"./formatTypes.js\":\"w40g\",\"./formatPrefixAuto.js\":\"WMxc\",\"./identity.js\":\"Ecm4\"}],\"VIed\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = defaultLocale;\nexports.formatPrefix = exports.format = void 0;\n\nvar _locale = _interopRequireDefault(require(\"./locale.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar locale;\nvar format;\nexports.format = format;\nvar formatPrefix;\nexports.formatPrefix = formatPrefix;\ndefaultLocale({\n  decimal: \".\",\n  thousands: \",\",\n  grouping: [3],\n  currency: [\"$\", \"\"],\n  minus: \"-\"\n});\n\nfunction defaultLocale(definition) {\n  locale = (0, _locale.default)(definition);\n  exports.format = format = locale.format;\n  exports.formatPrefix = formatPrefix = locale.formatPrefix;\n  return locale;\n}\n},{\"./locale.js\":\"Iakc\"}],\"cTEw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step) {\n  return Math.max(0, -(0, _exponent.default)(Math.abs(step)));\n}\n},{\"./exponent.js\":\"G46r\"}],\"aFxy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step, value) {\n  return Math.max(0, Math.max(-8, Math.min(8, Math.floor((0, _exponent.default)(value) / 3))) * 3 - (0, _exponent.default)(Math.abs(step)));\n}\n},{\"./exponent.js\":\"G46r\"}],\"we8G\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step, max) {\n  step = Math.abs(step), max = Math.abs(max) - step;\n  return Math.max(0, (0, _exponent.default)(max) - (0, _exponent.default)(step)) + 1;\n}\n},{\"./exponent.js\":\"G46r\"}],\"SA6z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"formatDefaultLocale\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.default;\n  }\n});\nObject.defineProperty(exports, \"format\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.format;\n  }\n});\nObject.defineProperty(exports, \"formatPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.formatPrefix;\n  }\n});\nObject.defineProperty(exports, \"formatLocale\", {\n  enumerable: true,\n  get: function () {\n    return _locale.default;\n  }\n});\nObject.defineProperty(exports, \"formatSpecifier\", {\n  enumerable: true,\n  get: function () {\n    return _formatSpecifier.default;\n  }\n});\nObject.defineProperty(exports, \"FormatSpecifier\", {\n  enumerable: true,\n  get: function () {\n    return _formatSpecifier.FormatSpecifier;\n  }\n});\nObject.defineProperty(exports, \"precisionFixed\", {\n  enumerable: true,\n  get: function () {\n    return _precisionFixed.default;\n  }\n});\nObject.defineProperty(exports, \"precisionPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _precisionPrefix.default;\n  }\n});\nObject.defineProperty(exports, \"precisionRound\", {\n  enumerable: true,\n  get: function () {\n    return _precisionRound.default;\n  }\n});\n\nvar _defaultLocale = _interopRequireWildcard(require(\"./defaultLocale.js\"));\n\nvar _locale = _interopRequireDefault(require(\"./locale.js\"));\n\nvar _formatSpecifier = _interopRequireWildcard(require(\"./formatSpecifier.js\"));\n\nvar _precisionFixed = _interopRequireDefault(require(\"./precisionFixed.js\"));\n\nvar _precisionPrefix = _interopRequireDefault(require(\"./precisionPrefix.js\"));\n\nvar _precisionRound = _interopRequireDefault(require(\"./precisionRound.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./defaultLocale.js\":\"VIed\",\"./locale.js\":\"Iakc\",\"./formatSpecifier.js\":\"Nf4q\",\"./precisionFixed.js\":\"cTEw\",\"./precisionPrefix.js\":\"aFxy\",\"./precisionRound.js\":\"we8G\"}],\"OsNT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataScope = DataScope;\nexports.DataScopeId = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _button = require(\"./button\");\n\nvar _d3Format = require(\"d3-format\");\n\nvar _language = require(\"../language\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar DataScopeId;\nexports.DataScopeId = DataScopeId;\n\n(function (DataScopeId) {\n  DataScopeId[DataScopeId[\"AllData\"] = 0] = \"AllData\";\n  DataScopeId[DataScopeId[\"SelectedData\"] = 1] = \"SelectedData\";\n  DataScopeId[DataScopeId[\"FilteredData\"] = 2] = \"FilteredData\";\n})(DataScopeId || (exports.DataScopeId = DataScopeId = {}));\n\nvar shortFormat = (0, _d3Format.format)('.2~s');\n\nfunction short(n) {\n  return n === -1 ? '--' : n ? n < 1000 ? n.toString() : shortFormat(n) : '0';\n}\n\nfunction DataScope(props) {\n  var dataCount = Object.assign({\n    all: -1,\n    filtered: -1,\n    selected: -1\n  }, props.dataCount);\n  return props.compact ? React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-datascope', 'compact'),\n    onClick: props.onCompactClick\n  }, React.createElement(Compact, Object.assign({}, props, {\n    dataScopeId: DataScopeId.AllData,\n    text: _language.strings.selectDataSpanAll,\n    count: dataCount.all\n  })), React.createElement(Compact, Object.assign({}, props, {\n    dataScopeId: DataScopeId.FilteredData,\n    text: _language.strings.selectDataSpanFilter,\n    count: dataCount.filtered\n  })), React.createElement(Compact, Object.assign({}, props, {\n    dataScopeId: DataScopeId.SelectedData,\n    text: _language.strings.selectDataSpanSelection,\n    count: dataCount.selected\n  }))) : React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-datascope', 'extended', props.active && 'active')\n  }, React.createElement(\"div\", null, React.createElement(\"div\", null, props.dataSet), React.createElement(\"div\", {\n    className: \"datascope-buttons\"\n  }, React.createElement(DataScopeButton, Object.assign({}, props, {\n    dataScopeId: DataScopeId.AllData,\n    text: _language.strings.selectDataSpanAll,\n    count: dataCount.all\n  })), React.createElement(DataScopeButton, Object.assign({}, props, {\n    dataScopeId: DataScopeId.FilteredData,\n    text: _language.strings.selectDataSpanFilter,\n    count: dataCount.filtered\n  })), React.createElement(DataScopeButton, Object.assign({}, props, {\n    dataScopeId: DataScopeId.SelectedData,\n    text: _language.strings.selectDataSpanSelection,\n    count: dataCount.selected\n  })))));\n}\n\nfunction Compact(props) {\n  return React.createElement(\"div\", {\n    title: props.text,\n    onClick: function onClick() {\n      props.onDataScopeClick(props.dataScopeId);\n    }\n  }, short(props.count));\n}\n\nfunction DataScopeButton(props) {\n  return React.createElement(_button.Button, {\n    themePalette: props.themePalette,\n    className: _sanddanceReact.util.classList('datascope-button', props.selectedDataScope === props.dataScopeId && 'selected'),\n    disabled: props.disabled,\n    text: props.text,\n    onClick: function onClick() {\n      props.onDataScopeClick(props.dataScopeId);\n    },\n    onRenderText: function onRenderText() {\n      return React.createElement(\"div\", {\n        title: props.count > 0 ? props.count.toString() : ''\n      }, React.createElement(\"label\", null, props.text), React.createElement(\"div\", null, short(props.count)));\n    },\n    onRenderIcon: function onRenderIcon() {\n      return null;\n    }\n  });\n}\n},{\"react\":\"ccIB\",\"./button\":\"eqtW\",\"d3-format\":\"SA6z\",\"../language\":\"hk5u\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"pJLc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataBrowser = DataBrowser;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _dataExporter = require(\"../controls/dataExporter\");\n\nvar _dataItem = require(\"../controls/dataItem\");\n\nvar _dataScope = require(\"../controls/dataScope\");\n\nvar _dropdown = require(\"../controls/dropdown\");\n\nvar _group = require(\"../controls/group\");\n\nvar _iconButton = require(\"../controls/iconButton\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction DataBrowser(props) {\n  function activateRecord(newIndex) {\n    props.onActivate(props.data[newIndex], newIndex);\n  }\n\n  var index = props.index;\n  var length = props.data && props.data.length || 0;\n  return React.createElement(_group.Group, {\n    label: _language.strings.labelDataBrowser,\n    className: \"sanddance-dataIndex\"\n  }, React.createElement(_dropdown.Dropdown, {\n    label: _language.strings.labelDataScope,\n    collapseLabel: true,\n    options: [{\n      key: _dataScope.DataScopeId.AllData,\n      text: _language.strings.selectDataSpanAll,\n      isSelected: props.selectedDataScope === _dataScope.DataScopeId.AllData\n    }, {\n      key: _dataScope.DataScopeId.FilteredData,\n      text: _language.strings.selectDataSpanFilter,\n      isSelected: props.selectedDataScope === _dataScope.DataScopeId.FilteredData\n    }, {\n      key: _dataScope.DataScopeId.SelectedData,\n      text: _language.strings.selectDataSpanSelection,\n      isSelected: props.selectedDataScope === _dataScope.DataScopeId.SelectedData\n    }],\n    onChange: function onChange(e, o) {\n      props.onDataScopeClick(o.key);\n    }\n  }), !props.data && React.createElement(\"div\", {\n    dangerouslySetInnerHTML: {\n      __html: props.nullMessage\n    }\n  }), props.data && !props.data.length && React.createElement(\"div\", null, props.zeroMessage), !!length && React.createElement(\"div\", null, React.createElement(\"div\", {\n    className: \"index\"\n  }, React.createElement(_iconButton.IconButton, {\n    themePalette: props.themePalette,\n    iconName: \"ChevronLeftMed\",\n    onClick: function onClick(e) {\n      return activateRecord(index <= 0 ? length - 1 : index - 1);\n    },\n    disabled: props.disabled || length === 1,\n    title: _language.strings.buttonPrevDataItem\n  }), React.createElement(\"span\", null, _language.strings.record(index + 1, length)), React.createElement(_iconButton.IconButton, {\n    themePalette: props.themePalette,\n    iconName: \"ChevronRightMed\",\n    onClick: function onClick(e) {\n      return activateRecord(index >= length - 1 ? 0 : index + 1);\n    },\n    disabled: props.disabled || length === 1,\n    title: _language.strings.buttonNextDataItem\n  })), !props.itemVisible && React.createElement(\"div\", {\n    className: \"item-filtered\"\n  }, _language.strings.labelDataItemIsFiltered), React.createElement(_dataItem.DataItem, {\n    columns: props.columns,\n    item: props.data[index],\n    disabled: props.disabled,\n    onSearch: props.onSearch,\n    bingSearchDisabled: props.bingSearchDisabled\n  })), props.dataExportHandler && props.data && React.createElement(_dataExporter.DataExportPicker, {\n    theme: props.theme,\n    initializer: {\n      fileName: \"\".concat((0, _dataExporter.removeExtensions)(props.displayName), \" (\").concat(props.data.length, \")\")\n    },\n    data: props.data,\n    dataExportHandler: props.dataExportHandler,\n    disabled: props.disabled\n  }));\n}\n},{\"react\":\"ccIB\",\"../controls/dataExporter\":\"l7po\",\"../controls/dataItem\":\"Gai8\",\"../controls/dataScope\":\"OsNT\",\"../controls/dropdown\":\"Uyrp\",\"../controls/group\":\"Q3hf\",\"../controls/iconButton\":\"dQNc\",\"../language\":\"hk5u\"}],\"Tl9z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.snapshotThumbWidth = exports.defaultViewerOptions = exports.fontFamily = void 0;\n\nvar _themes = require(\"./themes\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar fontFamily = 'Segoe UI, sans-serif';\nexports.fontFamily = fontFamily;\nvar defaultViewerOptions = {\n  colors: (0, _themes.getColorSettingsFromThemePalette)(_themes.themePalettes['']),\n  fontFamily: fontFamily\n};\nexports.defaultViewerOptions = defaultViewerOptions;\nvar snapshotThumbWidth = 300;\nexports.snapshotThumbWidth = snapshotThumbWidth;\n},{\"./themes\":\"CgE3\"}],\"ENdt\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.maxCategoricalColors = 20;\nvar Recommender = /** @class */ (function () {\n    function Recommender(columns, data) {\n    }\n    return Recommender;\n}());\nexports.Recommender = Recommender;\nfunction defaultColorScheme(c) {\n    if (c.quantitative) {\n        return 'redyellowgreen';\n    }\n    else if (c.stats.distinctValueCount === 2) {\n        return 'dual_redgreen';\n    }\n    else if (c.stats.distinctValueCount <= 10) {\n        return 'category10';\n    }\n    return 'category20';\n}\nexports.defaultColorScheme = defaultColorScheme;\n\n},{}],\"oxgd\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar recommender_1 = require(\"./recommender\");\nvar maxDistinctVal = 20;\nvar minDistinctVal = 2;\nvar BarChartRecommenderSummary = /** @class */ (function () {\n    function BarChartRecommenderSummary(columns, data) {\n        var score = -1;\n        for (var i = 0; i < columns.length; i++) {\n            var recommendation = new BarChartRecommender(columns[i], data).recommend();\n            if (recommendation.score > score) {\n                this.best = recommendation;\n                score = recommendation.score;\n            }\n            if (score === 1)\n                break;\n        }\n        for (var k = 0; k < columns.length; k++) {\n            var column = columns[k];\n            if (column.name === this.best.columns.x || column.stats.isSequential)\n                continue;\n            if (column.quantitative || (column.stats.distinctValueCount < recommender_1.maxCategoricalColors && column.stats.distinctValueCount > 1)) {\n                this.best.columns.color = this.best.columns.sort = column.name;\n                this.best.scheme = recommender_1.defaultColorScheme(column);\n                if (column.quantitative) {\n                    this.best.colorBin = 'quantile';\n                }\n                break;\n            }\n        }\n    }\n    BarChartRecommenderSummary.prototype.recommend = function () {\n        return this.best;\n    };\n    return BarChartRecommenderSummary;\n}());\nexports.BarChartRecommenderSummary = BarChartRecommenderSummary;\nvar BarChartRecommender = /** @class */ (function () {\n    function BarChartRecommender(column, data) {\n        this.score = 0;\n        this.column = column;\n        //the total score for bar chart is 1\n        this.rules = [\n            function (column) {\n                if (column.stats.isSequential)\n                    return false;\n                else if (column.quantitative) {\n                    return true;\n                }\n                else if (!column.quantitative && column.stats.distinctValueCount <= maxDistinctVal && column.stats.distinctValueCount >= minDistinctVal) {\n                    return true;\n                }\n                else {\n                    return false;\n                }\n            }\n        ];\n        for (var i = 0; i < this.rules.length; i++) {\n            if (this.rules[i](column))\n                this.score++;\n        }\n    }\n    BarChartRecommender.prototype.recommend = function () {\n        var rec = {\n            chart: 'barchart',\n            columns: {\n                x: this.column.name\n            },\n            score: this.score,\n            scheme: undefined,\n            view: '2d'\n        };\n        return rec;\n    };\n    return BarChartRecommender;\n}());\nexports.BarChartRecommender = BarChartRecommender;\n\n},{\"./recommender\":\"ENdt\"}],\"O4ew\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//TODO: languages other than english\nvar longitudeNames = ['lon', 'long', 'longitude'];\nvar latitudeNames = ['lat', 'latitude'];\nfunction isSpec(names, limits, column, data) {\n    var is = false;\n    var cname = column.name.toLowerCase();\n    for (var i = 0; i < names.length; i++) {\n        if (names[i] === cname) {\n            is = true;\n            break;\n        }\n    }\n    if (data) {\n        //TODO: spin through data to see if it is within limits\n    }\n    return is;\n}\nfunction isLongitude(column, data) {\n    return isSpec(longitudeNames, [-180, 180], column, data);\n}\nexports.isLongitude = isLongitude;\nfunction isLatitude(column, data) {\n    return isSpec(latitudeNames, [-90, 90], column, data);\n}\nexports.isLatitude = isLatitude;\nfunction isGeo(column, data) {\n    return isLatitude(column, data) || isLongitude(column, data);\n}\nexports.isGeo = isGeo;\n\n},{}],\"iBe2\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar recommender_1 = require(\"./recommender\");\nvar geo_1 = require(\"./geo\");\nvar ScatterPlotRecommenderSummary = /** @class */ (function () {\n    function ScatterPlotRecommenderSummary(columns, data) {\n        var rec = {\n            chart: 'scatterplot',\n            score: undefined,\n            columns: {},\n            scheme: undefined,\n            view: '2d'\n        };\n        columns.forEach(function (column) {\n            if (!rec.columns.x) {\n                if (column.name.toLowerCase() === 'x') {\n                    return rec.columns.x = column.name;\n                }\n                else if (geo_1.isLongitude(column)) {\n                    return rec.columns.x = column.name;\n                }\n            }\n            if (!rec.columns.y) {\n                if (column.name.toLowerCase() === 'y') {\n                    return rec.columns.y = column.name;\n                }\n                else if (geo_1.isLatitude(column)) {\n                    return rec.columns.y = column.name;\n                }\n            }\n            if (!rec.columns.color && !column.stats.isSequential) {\n                if (column.quantitative || column.stats.distinctValueCount < recommender_1.maxCategoricalColors) {\n                    rec.columns.color = rec.columns.sort = column.name;\n                    rec.scheme = recommender_1.defaultColorScheme(column);\n                    if (column.quantitative) {\n                        rec.colorBin = 'quantile';\n                    }\n                    return;\n                }\n            }\n        });\n        if (rec.columns.x && rec.columns.y) {\n            this.best = rec;\n        }\n    }\n    ScatterPlotRecommenderSummary.prototype.recommend = function () {\n        return this.best;\n    };\n    return ScatterPlotRecommenderSummary;\n}());\nexports.ScatterPlotRecommenderSummary = ScatterPlotRecommenderSummary;\n\n},{\"./recommender\":\"ENdt\",\"./geo\":\"O4ew\"}],\"At4q\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar geo_1 = require(\"./geo\");\nfunction preferredColumnForTreemapSize(columns, strict) {\n    for (var i = 0; i < columns.length; i++) {\n        var c = columns[i];\n        if (c.quantitative) {\n            if (strict && c.stats.hasNegative)\n                continue;\n            if (strict && c.stats.isSequential)\n                continue;\n            if (strict && geo_1.isGeo(c))\n                continue;\n            return c.name;\n        }\n    }\n}\nexports.preferredColumnForTreemapSize = preferredColumnForTreemapSize;\n\n},{\"./geo\":\"O4ew\"}],\"fB3P\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar barChart_1 = require(\"./barChart\");\nvar scatterPlot_1 = require(\"./scatterPlot\");\nvar RecommenderSummary = /** @class */ (function () {\n    function RecommenderSummary(columns, data) {\n        var quickRec = new scatterPlot_1.ScatterPlotRecommenderSummary(columns, data).recommend();\n        if (quickRec) {\n            this.rec = quickRec;\n        }\n        else {\n            var barChartrec = new barChart_1.BarChartRecommenderSummary(columns, data).recommend();\n            if (barChartrec && barChartrec.score >= 1) {\n                this.rec = barChartrec;\n            }\n            else {\n                this.rec = {\n                    chart: 'grid',\n                    columns: {},\n                    score: 1\n                };\n            }\n        }\n    }\n    RecommenderSummary.prototype.recommend = function () {\n        return this.rec;\n    };\n    return RecommenderSummary;\n}());\nexports.RecommenderSummary = RecommenderSummary;\n\n},{\"./barChart\":\"oxgd\",\"./scatterPlot\":\"iBe2\"}],\"i6UQ\":[function(require,module,exports) {\n\"use strict\";\nfunction __export(m) {\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n__export(require(\"./barChart\"));\n__export(require(\"./geo\"));\n__export(require(\"./scatterPlot\"));\n__export(require(\"./treemap\"));\n__export(require(\"./recommenderSummary\"));\n\n},{\"./barChart\":\"oxgd\",\"./geo\":\"O4ew\",\"./scatterPlot\":\"iBe2\",\"./treemap\":\"At4q\",\"./recommenderSummary\":\"fB3P\"}],\"f8v0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ensureColumnsExist = ensureColumnsExist;\nexports.ensureColumnsPopulated = ensureColumnsPopulated;\n\nvar _chartRecommender = require(\"@msrvida/chart-recommender\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"./language\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction ensureColumnsExist(insightColumns, actualColumns, transform) {\n  var _loop = function _loop(role) {\n    var columnName = insightColumns[role];\n    var column = actualColumns.filter(function (c) {\n      return c.name === columnName;\n    })[0];\n    var transformColumn = transform ? transform.filter(function (t) {\n      switch (t.type) {\n        case 'formula':\n          {\n            return t.as === columnName;\n          }\n      }\n    })[0] : null;\n\n    if (!(column || transformColumn)) {\n      delete insightColumns[role];\n    }\n  };\n\n  //ensure columns exist\n  for (var role in insightColumns) {\n    _loop(role);\n  }\n}\n\nfunction ensureColumnsPopulated(chart, insightColumns, actualColumns) {\n  //ensure columns are populated\n  var firstColumn = actualColumns.filter(function (c) {\n    return !_sanddanceReact.SandDance.util.isInternalFieldName(c.name);\n  })[0];\n  var firstColumnName = firstColumn && firstColumn.name;\n\n  var ensureColumn = function ensureColumn(role) {\n    if (!insightColumns[role]) {\n      insightColumns[role] = firstColumnName;\n    }\n  };\n\n  switch (chart) {\n    case 'barchart':\n    case 'barchartV':\n      ensureColumn('x');\n      break;\n\n    case 'barchartH':\n      ensureColumn('y');\n      break;\n\n    case 'density':\n    case 'scatterplot':\n    case 'stacks':\n      ensureColumn('x');\n      ensureColumn('y');\n      break;\n\n    case 'treemap':\n      if (!insightColumns.size) {\n        insightColumns.size = (0, _chartRecommender.preferredColumnForTreemapSize)(actualColumns, true);\n\n        if (!insightColumns.size) {\n          insightColumns.size = (0, _chartRecommender.preferredColumnForTreemapSize)(actualColumns, false);\n        }\n      }\n\n      if (!insightColumns.size) {\n        //error - no numeric column\n        return [_language.strings.errorColumnMustBeNumeric];\n      }\n\n      break;\n  }\n}\n},{\"@msrvida/chart-recommender\":\"i6UQ\",\"@msrvida/sanddance-react\":\"MjKu\",\"./language\":\"hk5u\"}],\"yvMl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPosition = getPosition;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction hasClientXY(e) {\n  if (e && e.clientX !== undefined && e.clientX !== undefined) {\n    return {\n      top: e.clientY,\n      left: e.clientX\n    };\n  }\n}\n\nfunction getPosition(e) {\n  var xy = hasClientXY(e);\n\n  if (xy) {\n    return xy;\n  }\n\n  var te = e;\n\n  if (te) {\n    for (var i = 0; i < te.touches.length; i++) {\n      var _xy = hasClientXY(te.touches[i]);\n\n      if (_xy) {\n        return _xy;\n      }\n    }\n  }\n}\n},{}],\"xBH3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getValidOperators = getValidOperators;\nexports.getText = getText;\nexports.SearchTerm = SearchTerm;\nexports.maxAutocomplete = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dropdown = require(\"./dropdown\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nvar maxAutocomplete = 100;\nexports.maxAutocomplete = maxAutocomplete;\n\nfunction getValidOperators(column) {\n  var type = column && column.type;\n\n  switch (type) {\n    case 'boolean':\n      return [['==', _language.strings.searchEQ], ['!=', _language.strings.searchNEQ], ['isnullorEmpty', _language.strings.searchNULL]];\n\n    case 'date':\n    case 'integer':\n    case 'number':\n      return [['==', _language.strings.searchEQ], ['!=', _language.strings.searchNEQ], ['>', _language.strings.searchGT], ['>=', _language.strings.searchGTE], ['<', _language.strings.searchLT], ['<=', _language.strings.searchLTE], ['isnullorEmpty', _language.strings.searchNULL]];\n\n    case 'string':\n    default:\n      return [['==', _language.strings.searchEQ], ['!=', _language.strings.searchNEQ], ['>', _language.strings.searchGT], ['>=', _language.strings.searchGTE], ['<', _language.strings.searchLT], ['<=', _language.strings.searchLTE], ['contains', _language.strings.searchIN], ['starts', _language.strings.searchSW], ['isnullorEmpty', _language.strings.searchNULL]];\n  }\n}\n\nfunction getExpressionClauses(currClause, disableOR) {\n  var keys = [['&&', _language.strings.searchAND]];\n\n  if (!disableOR) {\n    keys.push(['||', _language.strings.searchOR]);\n  }\n\n  return keys.map(function (key, i) {\n    var _key = _slicedToArray(key, 2),\n        clause = _key[0],\n        text = _key[1];\n\n    var selected = currClause == clause; //deliberate double equal \n\n    var option = {\n      key: i,\n      text: text,\n      data: clause,\n      selected: selected\n    };\n    return option;\n  });\n}\n\nfunction getOperators(ex, column) {\n  var anySelected = false;\n  var validOperators = getValidOperators(column);\n  var options = validOperators.map(function (validoperator) {\n    var _validoperator = _slicedToArray(validoperator, 2),\n        op = _validoperator[0],\n        text = _validoperator[1];\n\n    var selected = ex.operator === op;\n    anySelected = anySelected || selected;\n    var option = {\n      key: op,\n      text: text,\n      data: op,\n      selected: selected\n    };\n    return option;\n  });\n\n  if (!anySelected) {\n    options[0].selected = true;\n  }\n\n  return options;\n}\n\nfunction getDistinctValues(data, columnName) {\n  var distinctMap = {};\n\n  for (var i = 0; i < data.length; i++) {\n    var row = data[i];\n    var value = row[columnName];\n    distinctMap[value] = true;\n  }\n\n  return Object.keys(distinctMap).sort();\n}\n\nfunction getValues(ex, column, data, autoCompleteDistinctValues) {\n  var stats = column && column.stats;\n\n  if (stats && stats.distinctValueCount < maxAutocomplete) {\n    if (!autoCompleteDistinctValues[column.name]) {\n      autoCompleteDistinctValues[column.name] = getDistinctValues(data, column.name);\n    }\n\n    return autoCompleteDistinctValues[column.name].map(function (v, i) {\n      return {\n        key: i,\n        text: v\n      };\n    });\n  }\n\n  return [];\n}\n\nfunction getText(ex) {\n  if (ex.operator === 'isnullorEmpty') return '';\n  return typeof ex.value === 'string' ? ex.value : ex.value == null ? '' : ex.value.toString();\n}\n\nfunction SearchTerm(props) {\n  var ex = props.searchExpression;\n  var possibleValues = getValues(ex, props.column, props.data, props.autoCompleteDistinctValues); //TODO better date handling with calendar picker\n\n  return React.createElement(\"div\", null, props.index > 0 && React.createElement(_dropdown.Dropdown, {\n    collapseLabel: props.collapseLabels,\n    className: \"search-field\",\n    label: _language.strings.labelSearchClause,\n    dropdownWidth: 120,\n    disabled: !ex.unlocked || props.disableOR,\n    options: getExpressionClauses(ex.clause, props.disableOR),\n    onChange: function onChange(e, o) {\n      return props.onUpdateExpression({\n        clause: o.data\n      }, props.index);\n    }\n  }), React.createElement(_dropdown.Dropdown, {\n    collapseLabel: props.collapseLabels,\n    className: \"search-field\",\n    label: _language.strings.labelSearchColumn,\n    options: [{\n      key: '',\n      text: _language.strings.selectAny,\n      data: null,\n      selected: ex.name === null\n    }].concat(props.columns.map(function (c, i) {\n      return {\n        key: c.name,\n        text: c.name,\n        data: c,\n        selected: c.name === ex.name\n      };\n    })),\n    onChange: function onChange(e, o) {\n      return props.onUpdateExpression({\n        name: o.data && o.data.name || null\n      }, props.index);\n    }\n  }), React.createElement(_dropdown.Dropdown, {\n    collapseLabel: props.collapseLabels,\n    className: \"search-field\",\n    label: _language.strings.labelSearchOperator,\n    dropdownWidth: 120,\n    options: getOperators(ex, props.column),\n    onChange: function onChange(e, o) {\n      return props.onUpdateExpression({\n        operator: o.data\n      }, props.index);\n    }\n  }), possibleValues.length > 0 && React.createElement(_base.base.fabric.ComboBox, {\n    className: \"search-field\",\n    label: props.collapseLabels ? null : _language.strings.labelSearchValue,\n    placeholder: _language.strings.labelSearchValuePlaceholder,\n    disabled: ex.operator === 'isnullorEmpty',\n    dropdownWidth: _dropdown.dropdownWidth,\n    allowFreeform: true,\n    autoComplete: \"on\",\n    errorMessage: ex.errorMessage,\n    text: getText(ex),\n    options: getValues(ex, props.column, props.data, props.autoCompleteDistinctValues),\n    onChange: function onChange(e, o, i, value) {\n      if (o) {\n        value = o.text;\n      }\n\n      props.onUpdateExpression({\n        value: value\n      }, props.index);\n    }\n  }), possibleValues.length === 0 && React.createElement(_base.base.fabric.TextField, {\n    className: \"search-field\",\n    label: props.collapseLabels ? null : _language.strings.labelSearchValue,\n    placeholder: _language.strings.labelSearchValuePlaceholder,\n    disabled: ex.operator === 'isnullorEmpty',\n    errorMessage: ex.errorMessage,\n    value: getText(ex),\n    onChange: function onChange(e, v) {\n      return props.onUpdateExpression({\n        value: v\n      }, props.index);\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./dropdown\":\"Uyrp\",\"../language\":\"hk5u\"}],\"ozxe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Search = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _searchTerm = require(\"../controls/searchTerm\");\n\nvar _base = require(\"../base\");\n\nvar _button = require(\"../controls/button\");\n\nvar _dropdown = require(\"../controls/dropdown\");\n\nvar _group = require(\"../controls/group\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nvar maxClauses = 5;\n\nfunction getColumnWithName(columnName, columns) {\n  for (var i = 0; i < columns.length; i++) {\n    if (columns[i].name === columnName) return columns[i];\n  }\n}\n\nfunction validateExpression(ex) {\n  if (ex.operator === 'isnullorEmpty') {\n    ex.errorMessage = null;\n    return;\n  }\n\n  var s = (0, _searchTerm.getText)(ex);\n\n  if (s.length === 0) {\n    ex.errorMessage = _language.strings.labelRequired;\n  } else {\n    ex.errorMessage = null;\n  }\n}\n\nfunction clearExpressionValidation(ex) {\n  if (ex.operator === 'isnullorEmpty') {\n    ex.errorMessage = null;\n    return;\n  }\n\n  var s = (0, _searchTerm.getText)(ex);\n\n  if (s.length !== 0) {\n    ex.errorMessage = null;\n  }\n}\n\nfunction getGroupClauses(currClause, index, disableGroupOR) {\n  var keys;\n\n  if (index === 0) {\n    keys = [[null, _language.strings.searchWHERE]];\n  } else {\n    keys = [['&&', _language.strings.searchAND]];\n\n    if (!disableGroupOR) {\n      keys.push(['||', _language.strings.searchOR]);\n    }\n  }\n\n  return keys.map(function (key, i) {\n    var _key = _slicedToArray(key, 2),\n        clause = _key[0],\n        text = _key[1];\n\n    var selected = currClause == clause; //deliberate double equal \n\n    var option = {\n      key: i,\n      text: text,\n      data: clause,\n      selected: selected\n    };\n    return option;\n  });\n}\n\nvar Search =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Search, _React$Component);\n\n  function Search(props) {\n    var _this;\n\n    _classCallCheck(this, Search);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Search).call(this, props));\n    _this.state = _this.getInitialState(_this.props);\n    return _this;\n  }\n\n  _createClass(Search, [{\n    key: \"getInitialState\",\n    value: function getInitialState(props) {\n      var initialState = {\n        groups: props.initializer.search || [this.newGroup(0, null)],\n        sortedColumns: _toConsumableArray(props.initializer.columns).sort(function (a, b) {\n          return a.name.localeCompare(b.name);\n        }),\n        initializer: props.initializer\n      };\n      initialState.groups.forEach(function (group) {\n        group.expressions.forEach(function (ex) {\n          return ex.unlocked = group.expressions.length <= 2;\n        });\n      });\n      return initialState;\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      if (!_sanddanceReact.util.deepCompare(this.props.initializer, this.state.initializer)) {\n        this.setState(this.getInitialState(this.props));\n      }\n    }\n  }, {\n    key: \"validateAndSearch\",\n    value: function validateAndSearch() {\n      var _this2 = this;\n\n      var groups = _toConsumableArray(this.state.groups);\n\n      groups.forEach(function (group) {\n        group.expressions.forEach(validateExpression);\n        var errors = group.expressions.reduce(function (p, c) {\n          return p || c.errorMessage;\n        }, '');\n\n        if (errors) {\n          _this2.setState({\n            groups: groups\n          });\n        } else {\n          _this2.props.onSelect(_this2.state.groups);\n        }\n      });\n    }\n  }, {\n    key: \"newGroup\",\n    value: function newGroup(key, clause) {\n      var group = {\n        key: key,\n        clause: clause,\n        expressions: [this.newExpression(0, null)]\n      };\n      return group;\n    }\n  }, {\n    key: \"updateGroup\",\n    value: function updateGroup(partialGroup, groupIndex) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var group = Object.assign(Object.assign({}, groups[groupIndex]), partialGroup);\n      groups[groupIndex] = group;\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"addGroup\",\n    value: function addGroup() {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var maxKey = groups.reduce(function (max, p) {\n        return p.key > max ? p.key : max;\n      }, groups[0].key);\n      var newGroup = this.newGroup(maxKey + 1, '&&');\n      groups.push(newGroup);\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"deleteGroup\",\n    value: function deleteGroup(groupIndex) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      groups.splice(groupIndex, 1);\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"newExpression\",\n    value: function newExpression(key, clause) {\n      var ex = {\n        key: key,\n        clause: clause,\n        name: null,\n        operator: 'contains',\n        value: ''\n      };\n      return ex;\n    }\n  }, {\n    key: \"addExpression\",\n    value: function addExpression(groupIndex) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var group = groups[groupIndex];\n      var maxKey = group.expressions.reduce(function (max, p) {\n        return p.key > max ? p.key : max;\n      }, group.expressions[0].key);\n      var newEx = this.newExpression(maxKey + 1, '&&');\n      group.expressions.push(newEx);\n\n      if (group.expressions.length === 2) {\n        newEx.unlocked = true;\n      } else {\n        group.expressions.forEach(function (ex) {\n          return ex.unlocked = false;\n        });\n        newEx.clause = group.expressions[1].clause;\n      }\n\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"updateExpression\",\n    value: function updateExpression(partialEx, groupIndex, index) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var group = groups[groupIndex];\n\n      var ex = _sanddanceReact.SandDance.VegaDeckGl.util.clone(group.expressions[index]);\n\n      if (ex.name !== partialEx.name) {\n        //choose an appropriate operator when switching data type\n        var oldColumn = getColumnWithName(ex.name, this.state.sortedColumns);\n        var newColumn = getColumnWithName(partialEx.name, this.state.sortedColumns);\n        var oldType = oldColumn && oldColumn.type;\n        var newType = newColumn && newColumn.type;\n\n        if (oldType !== newType) {\n          var newOperators = (0, _searchTerm.getValidOperators)(newColumn).map(function (validOperator) {\n            return validOperator[0];\n          }); //see if old operator is compatible\n\n          if (newOperators.indexOf(ex.operator) < 0) {\n            //not compatible, so choose \"equal\"\n            partialEx.operator = '==';\n          }\n        }\n      }\n\n      Object.assign(ex, partialEx);\n      clearExpressionValidation(ex);\n      group.expressions[index] = ex;\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"deleteExpression\",\n    value: function deleteExpression(groupIndex, index) {\n      var groups = _toConsumableArray(this.state.groups);\n\n      var group = groups[groupIndex];\n\n      var expressions = _toConsumableArray(group.expressions);\n\n      expressions.splice(index, 1);\n\n      if (expressions.length === 2) {\n        expressions[1].unlocked = true;\n      }\n\n      group.expressions = expressions;\n      this.setState({\n        groups: groups\n      });\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this3 = this;\n\n      return React.createElement(_group.Group, {\n        className: \"sanddance-search\",\n        label: _language.strings.labelSearch\n      }, React.createElement(\"div\", null, this.state.groups.map(function (group, groupIndex) {\n        return React.createElement(\"div\", {\n          className: \"sanddance-search-group\",\n          key: group.key\n        }, React.createElement(_dropdown.Dropdown, {\n          collapseLabel: _this3.props.collapseLabels,\n          className: \"search-group-clause\",\n          label: _language.strings.labelSearchClause,\n          disabled: groupIndex === 0 || _this3.props.disableGroupOR,\n          dropdownWidth: 120,\n          options: getGroupClauses(group.clause, groupIndex, _this3.props.disableGroupOR),\n          onChange: function onChange(e, o) {\n            return _this3.updateGroup({\n              clause: o.data\n            }, groupIndex);\n          }\n        }), React.createElement(\"div\", null, group.expressions.map(function (ex, i) {\n          return React.createElement(\"div\", {\n            className: \"sanddance-search-expression\",\n            key: ex.key\n          }, React.createElement(_searchTerm.SearchTerm, {\n            collapseLabels: _this3.props.collapseLabels,\n            onUpdateExpression: function onUpdateExpression(ex, i) {\n              return _this3.updateExpression(ex, groupIndex, i);\n            },\n            autoCompleteDistinctValues: _this3.props.autoCompleteDistinctValues,\n            index: i,\n            columns: _this3.state.sortedColumns,\n            data: _this3.props.data,\n            searchExpression: ex,\n            disableOR: _this3.props.disableExpressionOR,\n            column: getColumnWithName(ex.name, _this3.state.sortedColumns)\n          }), group.expressions.length > 1 && React.createElement(_button.Button, {\n            themePalette: _this3.props.themePalette,\n            className: \"search-action\",\n            iconName: \"Cancel\",\n            onClick: function onClick() {\n              return _this3.deleteExpression(groupIndex, i);\n            },\n            text: _language.strings.buttonDeleteExpression\n          }));\n        })), group.expressions.length < maxClauses && React.createElement(\"div\", null, React.createElement(_button.Button, {\n          themePalette: _this3.props.themePalette,\n          className: \"search-action\",\n          iconName: \"Add\",\n          onClick: function onClick() {\n            return _this3.addExpression(groupIndex);\n          },\n          text: _language.strings.buttonAddExpression\n        })), _this3.state.groups.length > 1 && React.createElement(_button.Button, {\n          themePalette: _this3.props.themePalette,\n          className: \"search-action\",\n          iconName: \"Cancel\",\n          onClick: function onClick() {\n            return _this3.deleteGroup(groupIndex);\n          },\n          text: _language.strings.buttonDeleteExpressionGroup\n        }));\n      }), this.state.groups.length < maxClauses && React.createElement(\"div\", null, React.createElement(_button.Button, {\n        themePalette: this.props.themePalette,\n        className: \"search-action search-bottom-action\",\n        iconName: \"Add\",\n        onClick: function onClick() {\n          return _this3.addGroup();\n        },\n        text: _language.strings.buttonAddExpressionGroup\n      }))), React.createElement(_base.base.fabric.PrimaryButton, {\n        className: \"search-action search-bottom-action\",\n        text: _language.strings.buttonSelect,\n        onClick: function onClick() {\n          return _this3.validateAndSearch();\n        }\n      }));\n    }\n  }]);\n\n  return Search;\n}(React.Component);\n\nexports.Search = Search;\n},{\"react\":\"ccIB\",\"../controls/searchTerm\":\"xBH3\",\"../base\":\"Vlbn\",\"../controls/button\":\"eqtW\",\"../controls/dropdown\":\"Uyrp\",\"../controls/group\":\"Q3hf\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"f19h\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.loadDataArray = exports.loadDataFile = void 0;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar loadDataFile = function loadDataFile(dataFile) {\n  return new Promise(function (resolve, reject) {\n    var vega = _sanddanceReact.SandDance.VegaDeckGl.base.vega;\n    var loader = vega.loader();\n\n    function handleRawText(text) {\n      var data;\n\n      try {\n        data = vega.read(text, {\n          type: dataFile.type,\n          parse: {}\n        });\n      } catch (e) {\n        reject(e);\n      }\n\n      if (data) {\n        loadDataArray(data, dataFile.type).then(function (dc) {\n          if (dataFile.snapshotsUrl) {\n            fetch(dataFile.snapshotsUrl).then(function (response) {\n              return response.json();\n            }).then(function (snapshots) {\n              dc.snapshots = snapshots;\n              resolve(dc);\n            }).catch(reject);\n          } else if (dataFile.snapshots) {\n            dc.snapshots = dataFile.snapshots;\n            resolve(dc);\n          } else {\n            resolve(dc);\n          }\n        }).catch(reject);\n      }\n    }\n\n    if (dataFile.dataUrl) {\n      loader.load(dataFile.dataUrl).then(handleRawText).catch(reject);\n    } else if (dataFile.rawText) {\n      handleRawText(dataFile.rawText);\n    } else {\n      reject('dataFile object must have either dataUrl or rawText property set.');\n    }\n  });\n};\n\nexports.loadDataFile = loadDataFile;\n\nvar loadDataArray = function loadDataArray(data, type) {\n  return new Promise(function (resolve, reject) {\n    var parse = type === 'csv' || type === 'tsv';\n\n    if (parse) {\n      //convert empty strings to null so that vega.inferType will get dates\n      data.forEach(function (row) {\n        for (var column in row) {\n          if (row[column] === '') {\n            row[column] = null;\n          }\n        }\n      });\n    }\n\n    var columns = _sanddanceReact.SandDance.util.getColumnsFromData(data).sort(function (a, b) {\n      return a.name.localeCompare(b.name);\n    });\n\n    if (parse) {\n      var booleanColumns = columns.filter(function (c) {\n        return c.type === 'boolean';\n      });\n      var dateColumns = columns.filter(function (c) {\n        return c.type === 'date';\n      });\n      var numericColumns = columns.filter(function (c) {\n        return c.type === 'integer' || c.type === 'number';\n      });\n      data.forEach(function (obj) {\n        booleanColumns.forEach(function (c) {\n          obj[c.name] = ('' + obj[c.name]).toLowerCase() === 'true';\n        });\n        dateColumns.forEach(function (c) {\n          var input = obj[c.name];\n\n          if (input !== null) {\n            var d = new Date(input);\n            d.input = input;\n            obj[c.name] = d;\n          }\n        });\n        numericColumns.forEach(function (c) {\n          var n = parseFloat(obj[c.name]);\n          obj[c.name] = isNaN(n) ? null : n;\n        });\n      });\n    }\n\n    resolve({\n      data: data,\n      columns: columns\n    });\n  });\n};\n\nexports.loadDataArray = loadDataArray;\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"UUG7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.onBeforeCreateLayers = onBeforeCreateLayers;\nexports.PositionedColumnMap = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _columnMap = require(\"./controls/columnMap\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction onBeforeCreateLayers(stage, specCapabilities) {\n  var _loop = function _loop(axisName) {\n    specCapabilities.roles.forEach(function (specRole) {\n      if (specRole.role === axisName) {\n        var axes = stage.axes[axisName];\n        axes.forEach(function (axis) {\n          if (axis.title) {\n            var textItem = axis.title;\n            textItem.specRole = specRole;\n          }\n        });\n      }\n    });\n  };\n\n  for (var axisName in stage.axes) {\n    _loop(axisName);\n  }\n}\n\nfunction px(n) {\n  return n + 'px';\n}\n\nvar PositionedColumnMap =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(PositionedColumnMap, _React$Component);\n\n  function PositionedColumnMap(props) {\n    var _this;\n\n    _classCallCheck(this, PositionedColumnMap);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(PositionedColumnMap).call(this, props));\n    var left = props.left,\n        top = props.top;\n    _this.state = {\n      left: left,\n      top: top\n    };\n    _this.dropdownRef = React.createRef();\n    return _this;\n  }\n\n  _createClass(PositionedColumnMap, [{\n    key: \"focus\",\n    value: function focus() {\n      if (!this.focused) {\n        this.focused = true;\n        this.dropdownRef.current.focus(true);\n      }\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      var size = _sanddanceReact.SandDance.VegaDeckGl.util.outerSize(this.div);\n\n      var over = {\n        left: Math.max(0, this.state.left + size.width - this.props.container.offsetWidth),\n        top: Math.max(0, this.state.top + size.height - this.props.container.offsetHeight)\n      };\n\n      if (over.left || over.top) {\n        var _this$state = this.state,\n            left = _this$state.left,\n            top = _this$state.top;\n        left -= over.left;\n        top -= over.top;\n        this.setState({\n          left: left,\n          top: top\n        });\n      } else {\n        this.focus();\n      }\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      this.focus();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      return React.createElement(\"div\", {\n        ref: function ref(div) {\n          if (div) _this2.div = div;\n        },\n        className: \"sanddance-columnMap-absolute\",\n        style: {\n          position: 'absolute',\n          left: px(this.state.left),\n          top: px(this.state.top)\n        }\n      }, React.createElement(_columnMap.ColumnMap, Object.assign({}, this.props, {\n        componentRef: this.dropdownRef,\n        hideSignals: true\n      })));\n    }\n  }]);\n\n  return PositionedColumnMap;\n}(React.Component);\n\nexports.PositionedColumnMap = PositionedColumnMap;\n},{\"react\":\"ccIB\",\"./controls/columnMap\":\"DSho\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"RvaL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.version = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar version = '2.2.2';\nexports.version = version;\n},{}],\"zKGJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Settings = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar SandDanceReact = _interopRequireWildcard(require(\"@msrvida/sanddance-react\"));\n\nvar _base = require(\"../base\");\n\nvar _canvas = require(\"../canvas\");\n\nvar _dialog = require(\"../controls/dialog\");\n\nvar _dropdown = require(\"../controls/dropdown\");\n\nvar _group = require(\"../controls/group\");\n\nvar _signal = require(\"../controls/signal\");\n\nvar _language = require(\"../language\");\n\nvar _version = require(\"../version\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar SandDance = SandDanceReact.SandDance;\nvar DataRefType;\n\n(function (DataRefType) {\n  DataRefType[DataRefType[\"none\"] = 0] = \"none\";\n  DataRefType[DataRefType[\"inline\"] = 1] = \"inline\";\n  DataRefType[DataRefType[\"url\"] = 2] = \"url\";\n})(DataRefType || (DataRefType = {}));\n\nfunction filterSignals(signal) {\n  switch (signal.name) {\n    case SandDance.constants.SignalNames.XBins:\n    case SandDance.constants.SignalNames.YBins:\n    case SandDance.constants.SignalNames.ColorBinCount:\n    case SandDance.constants.SignalNames.ColorReverse:\n    case SandDance.constants.SignalNames.PointSize:\n    case SandDance.constants.SignalNames.TreeMapMethod:\n      return false;\n\n    default:\n      return !!signal.bind;\n  }\n}\n\nfunction cloneData(vegaSpec) {\n  var data0 = vegaSpec.data[0];\n  var valuesData = data0;\n  var values = valuesData.values;\n  delete valuesData.values;\n  var data = SandDance.VegaDeckGl.util.clone(vegaSpec.data);\n  valuesData.values = values;\n  return {\n    data: data,\n    values: values\n  };\n}\n\nfunction cloneScales(vegaSpec) {\n  return SandDance.VegaDeckGl.util.clone(vegaSpec.scales);\n}\n\nfunction serializeSpec(vegaSpec, datafile, dataRefType, transform, scheme) {\n  var scales = cloneScales(vegaSpec);\n  var colorScale = scales.filter(function (scale) {\n    return scale.name === SandDance.constants.ScaleNames.Color;\n  })[0];\n\n  if (scheme.indexOf('dual_') >= 0) {\n    colorScale.range = SandDance.colorSchemes.filter(function (cs) {\n      return cs.scheme === scheme;\n    })[0].colors;\n  }\n\n  var clone = cloneData(vegaSpec);\n  var data0 = clone.data[0];\n\n  if (dataRefType === DataRefType.inline) {\n    var valuesData = data0;\n    valuesData.format = {\n      parse: 'auto',\n      type: 'json'\n    };\n    valuesData.values = clone.values;\n  } else if (dataRefType === DataRefType.none) {\n    var _valuesData = data0;\n    _valuesData.values = [];\n\n    if (transform) {\n      if (_valuesData.transform) {\n        _valuesData.transform.push.apply(_valuesData.transform, transform);\n      } else {\n        _valuesData.transform = transform;\n      }\n    }\n  } else if (dataRefType === DataRefType.url) {\n    var urlData = data0;\n    urlData.url = datafile.dataUrl;\n    urlData.format = {\n      parse: 'auto',\n      type: datafile.type\n    };\n\n    if (transform) {\n      if (urlData.transform) {\n        urlData.transform.push.apply(urlData.transform, transform);\n      } else {\n        urlData.transform = transform;\n      }\n    }\n  }\n\n  return Object.assign(Object.assign({}, vegaSpec), {\n    data: clone.data,\n    scales: scales\n  });\n}\n\nfunction defaultDataRefType(datafile) {\n  if (datafile.dataUrl) {\n    return DataRefType.url;\n  }\n\n  return DataRefType.none;\n}\n\nfunction initState(props) {\n  return {\n    showSystemDialog: false,\n    showVegaDialog: false,\n    dataRefType: defaultDataRefType(props.dataFile),\n    spec: null\n  };\n}\n\nfunction signalGroupKey(key) {\n  for (var i = 0; i < _language.strings.signalGroups.length; i++) {\n    if (_language.strings.signalGroups[i].prefix === key) {\n      return key;\n    }\n  }\n\n  return '*';\n}\n\nfunction vegaSignalGroups(vegaSignals) {\n  var signalGroupMap = {};\n  vegaSignals.forEach(function (vs) {\n    var split = vs.name.split('_');\n    var key = signalGroupKey(split[0]);\n    signalGroupMap[key] = signalGroupMap[key] || [];\n    signalGroupMap[key].push(vs);\n  });\n  return signalGroupMap;\n}\n\nvar Settings =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Settings, _React$Component);\n\n  function Settings(props) {\n    var _this;\n\n    _classCallCheck(this, Settings);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Settings).call(this, props));\n    _this.state = initState(props);\n    return _this;\n  }\n\n  _createClass(Settings, [{\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var props = this.props,\n          state = this.state;\n      if (!props.explorer.viewer || !props.explorer.viewer.vegaSpec) return null;\n      var options = [{\n        key: DataRefType.none,\n        text: _language.strings.selectVegaSpecDataNone,\n        selected: this.state.dataRefType === DataRefType.none,\n        data: DataRefType.none\n      }, !props.dataFile.rawText && {\n        key: DataRefType.url,\n        text: _language.strings.selectVegaSpecDataUrl,\n        selected: this.state.dataRefType === DataRefType.url,\n        data: DataRefType.url\n      }, {\n        key: DataRefType.inline,\n        text: _language.strings.selectVegaSpecDataInline,\n        selected: this.state.dataRefType === DataRefType.inline,\n        data: DataRefType.inline\n      }].filter(Boolean);\n      var signalGroupMap = vegaSignalGroups(props.explorer.viewer.vegaSpec.signals);\n      return React.createElement(\"div\", null, _language.strings.signalGroups.map(function (sg) {\n        var vegaSignals = signalGroupMap[sg.prefix];\n\n        if (vegaSignals) {\n          var filteredVegaSignals = vegaSignals.filter(filterSignals);\n\n          if (filteredVegaSignals.length > 0) {\n            return React.createElement(_group.Group, {\n              key: sg.prefix,\n              label: sg.label\n            }, filteredVegaSignals.map(function (signal, i) {\n              return React.createElement(_signal.Signal, {\n                key: i,\n                signal: signal,\n                explorer: props.explorer\n              });\n            }));\n          }\n        }\n      }), React.createElement(_group.Group, {\n        label: _language.strings.labelChartCanvas\n      }, React.createElement(_base.base.fabric.Toggle, {\n        label: _language.strings.labelShowAxes,\n        defaultChecked: !props.hideAxes,\n        onChange: function onChange(e, checked) {\n          return props.onToggleAxes(!checked);\n        }\n      }), React.createElement(_base.base.fabric.Toggle, {\n        label: _language.strings.labelShowLegend,\n        defaultChecked: !props.hideLegend,\n        onChange: function onChange(e, checked) {\n          return props.onToggleLegend(!checked);\n        }\n      })), React.createElement(_group.Group, {\n        label: _language.strings.labelTools\n      }, React.createElement(_base.base.fabric.DefaultButton, {\n        text: _language.strings.buttonShowVegaSpec,\n        onClick: function onClick() {\n          return _this2.setState({\n            showVegaDialog: true,\n            spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, _this2.state.dataRefType, props.explorer.viewer.getInsight().transform, _this2.props.scheme)\n          });\n        }\n      })), React.createElement(_group.Group, {\n        label: _language.strings.labelSnapshots\n      }, React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelSnapshotSettingThumbnailWidth,\n        onChange: function onChange(value) {\n          _this2.props.explorer.snapshotThumbWidth = value;\n        },\n        min: 100,\n        max: 800,\n        defaultValue: this.props.explorer.snapshotThumbWidth\n      })), React.createElement(_group.Group, {\n        label: _language.strings.labelTransitionDurations\n      }, React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelTransitionColor,\n        onChange: function onChange(value) {\n          _this2.props.explorer.viewerOptions.transitionDurations.color = value;\n        },\n        min: 0,\n        max: 10000,\n        defaultValue: this.props.explorer.viewerOptions.transitionDurations.color\n      }), React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelTransitionPosition,\n        onChange: function onChange(value) {\n          _this2.props.explorer.viewerOptions.transitionDurations.position = value;\n        },\n        min: 0,\n        max: 10000,\n        defaultValue: this.props.explorer.viewerOptions.transitionDurations.position\n      }), React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelTransitionSize,\n        onChange: function onChange(value) {\n          _this2.props.explorer.viewerOptions.transitionDurations.size = value;\n        },\n        min: 0,\n        max: 10000,\n        defaultValue: this.props.explorer.viewerOptions.transitionDurations.size\n      }), React.createElement(_base.base.fabric.Slider, {\n        label: _language.strings.labelTransitionCamera,\n        onChange: function onChange(value) {\n          _this2.props.explorer.viewerOptions.transitionDurations.view = value;\n        },\n        min: 0,\n        max: 10000,\n        defaultValue: this.props.explorer.viewerOptions.transitionDurations.view\n      })), props.additionalSettings && props.additionalSettings.map(function (g, i) {\n        return React.createElement(_group.Group, {\n          key: i,\n          label: g.groupLabel\n        }, g.children);\n      }), React.createElement(_group.Group, {\n        label: _language.strings.labelSystem\n      }, React.createElement(_base.base.fabric.DefaultButton, {\n        text: _language.strings.labelSystemInfo,\n        onClick: function onClick() {\n          return _this2.setState({\n            showSystemDialog: true\n          });\n        }\n      })), React.createElement(_dialog.Dialog, {\n        hidden: !state.showVegaDialog,\n        onDismiss: function onDismiss() {\n          return _this2.setState(initState(_this2.props));\n        },\n        minWidth: \"80%\",\n        title: _language.strings.labelVegaSpec,\n        buttons: [React.createElement(_base.base.fabric.PrimaryButton, {\n          key: \"copy\",\n          iconProps: {\n            iconName: 'Copy'\n          },\n          text: _language.strings.buttonCopyToClipboard,\n          onClick: function onClick() {\n            var pre = document.getElementById('sanddance-vega-spec');\n            var range = document.createRange();\n            range.selectNode(pre);\n            var selection = window.getSelection();\n            selection.removeAllRanges();\n            selection.addRange(range);\n            document.execCommand('copy');\n          }\n        }), React.createElement(_base.base.fabric.DefaultButton, {\n          key: \"edit\",\n          iconProps: {\n            iconName: 'OpenInNewWindow'\n          },\n          text: _language.strings.buttonLaunchVegaEditor,\n          onClick: function onClick() {\n            window.open('https://vega.github.io/editor/', '_blank');\n          }\n        })]\n      }, React.createElement(_dropdown.Dropdown, {\n        label: _language.strings.labelVegaSpecData,\n        options: options,\n        onChange: function onChange(e, o) {\n          return _this2.setState({\n            dataRefType: o.data,\n            spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, o.data, props.explorer.viewer.getInsight().transform, _this2.props.scheme)\n          });\n        }\n      }), React.createElement(\"pre\", {\n        id: \"sanddance-vega-spec\"\n      }, JSON.stringify(this.state.spec, null, 2)), React.createElement(\"div\", null, _language.strings.labelVegaSpecNotes)), React.createElement(_dialog.Dialog, {\n        hidden: !state.showSystemDialog,\n        onDismiss: function onDismiss() {\n          return _this2.setState(initState(_this2.props));\n        },\n        title: _language.strings.labelSystemInfo\n      }, React.createElement(\"ul\", null, this.props.children, React.createElement(\"li\", null, \"SandDanceExplorer version: \", _version.version), React.createElement(\"li\", null, \"SandDanceReact version: \", SandDanceReact.version), React.createElement(\"li\", null, \"SandDance version: \", SandDance.version), React.createElement(\"li\", null, \"WebGL enabled: \", _canvas.capabilities.webgl ? _language.strings.labelYes : _language.strings.labelNo), React.createElement(\"li\", null, \"WebGL2 enabled: \", _canvas.capabilities.webgl2 ? _language.strings.labelYes : _language.strings.labelNo))));\n    }\n  }]);\n\n  return Settings;\n}(React.Component);\n\nexports.Settings = Settings;\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\",\"../base\":\"Vlbn\",\"../canvas\":\"Dryx\",\"../controls/dialog\":\"cFWm\",\"../controls/dropdown\":\"Uyrp\",\"../controls/group\":\"Q3hf\",\"../controls/signal\":\"OWDI\",\"../language\":\"hk5u\",\"../version\":\"RvaL\"}],\"GuKX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Scrollable = Scrollable;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Scrollable(props) {\n  return React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('scrollable-container', props.className),\n    role: props.role\n  }, React.createElement(\"div\", {\n    className: \"scrollable\"\n  }, props.children));\n}\n},{\"react\":\"ccIB\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"f8Jx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Sidebar = Sidebar;\nexports.Sidebutton = Sidebutton;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dataScope = require(\"./dataScope\");\n\nvar _iconButton = require(\"./iconButton\");\n\nvar _scrollable = require(\"./scrollable\");\n\nvar _interfaces = require(\"../interfaces\");\n\nvar _language = require(\"../language\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Sidebar(props) {\n  var sidebuttons = [{\n    sideTabId: _interfaces.SideTabId.ChartType,\n    iconName: 'BIDashboard',\n    title: _language.strings.labelChart\n  }, {\n    sideTabId: _interfaces.SideTabId.Color,\n    iconName: 'Color',\n    title: _language.strings.labelColor\n  }, {\n    sideTabId: _interfaces.SideTabId.Data,\n    iconName: 'Table',\n    title: _language.strings.labelDataBrowser\n  }, {\n    sideTabId: _interfaces.SideTabId.Search,\n    iconName: 'Search',\n    title: _language.strings.labelSearch\n  }, {\n    sideTabId: _interfaces.SideTabId.Snapshots,\n    iconName: 'Camera',\n    title: _language.strings.labelSnapshots\n  }, {\n    sideTabId: _interfaces.SideTabId.Settings,\n    iconName: 'Settings',\n    title: _language.strings.labelChartSettings\n  }];\n  return React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('sanddance-sidebar', 'calculator', props.pinned && 'pinned', props.closed && 'closed')\n  }, React.createElement(\"div\", {\n    className: \"sidebar-content\"\n  }, React.createElement(_dataScope.DataScope, Object.assign({}, props.dataScopeProps)), React.createElement(\"div\", {\n    className: \"vbuttons\",\n    role: 'tablist'\n  }, React.createElement(\"div\", {\n    className: \"sidebar-dialogs\"\n  }, sidebuttons.map(function (sidebutton, i) {\n    return React.createElement(Sidebutton, Object.assign({\n      key: i\n    }, props, sidebutton, {\n      themePalette: props.themePalette\n    }));\n  })), !props.hideSidebarControls && React.createElement(\"div\", {\n    className: \"sidebar-controls\"\n  }, React.createElement(Sidebutton, Object.assign({}, props, {\n    sideTabId: _interfaces.SideTabId.Pin,\n    iconName: props.pinned ? 'Pinned' : 'Pin',\n    title: props.pinned ? _language.strings.buttonToolbarFloat : _language.strings.buttonToolbarDock\n  })), React.createElement(Sidebutton, Object.assign({}, props, {\n    sideTabId: _interfaces.SideTabId.Collapse,\n    iconName: props.closed ? 'DoubleChevronRight12' : 'DoubleChevronLeft12',\n    title: props.closed ? _language.strings.buttonToolbarShow : _language.strings.buttonToolbarHide\n  })))), React.createElement(_scrollable.Scrollable, {\n    role: 'tabpanel'\n  }, React.createElement(\"div\", {\n    className: \"sidetab\"\n  }, props.children)), props.calculating && React.createElement(\"div\", {\n    className: \"calculating\"\n  }, React.createElement(_base.base.fabric.Spinner, {\n    size: _base.base.fabric.SpinnerSize.large\n  }))));\n}\n\nfunction Sidebutton(props) {\n  var selected = !props.closed && props.selectedSideTab === props.sideTabId;\n  return React.createElement(\"div\", {\n    className: _sanddanceReact.util.classList('vbutton', selected && 'selected'),\n    role: 'tab',\n    \"aria-selected\": selected\n  }, props.badgeText && React.createElement(\"div\", {\n    className: \"count\"\n  }, props.badgeText), React.createElement(_iconButton.IconButton, {\n    themePalette: props.themePalette,\n    className: \"vbutton\",\n    iconName: props.iconName,\n    title: props.title,\n    onClick: function onClick() {\n      props.onSideTabClick(props.sideTabId);\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./dataScope\":\"OsNT\",\"./iconButton\":\"dQNc\",\"./scrollable\":\"GuKX\",\"../interfaces\":\"h2T5\",\"../language\":\"hk5u\",\"@msrvida/sanddance-react\":\"MjKu\"}],\"dSzJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SnapshotEditor = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dialog = require(\"../controls/dialog\");\n\nvar _canvas = require(\"../canvas\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar SnapshotEditor =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(SnapshotEditor, _React$Component);\n\n  function SnapshotEditor(props) {\n    var _this;\n\n    _classCallCheck(this, SnapshotEditor);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(SnapshotEditor).call(this, props));\n    _this.state = {\n      showEditFormDialog: false,\n      title: '',\n      description: '',\n      image: null,\n      bgColor: null,\n      insight: null,\n      editIndex: -1\n    };\n    return _this;\n  }\n\n  _createClass(SnapshotEditor, [{\n    key: \"resize\",\n    value: function resize(src, thumbWidth) {\n      var _this2 = this;\n\n      if (!src) return;\n      var img = new Image();\n\n      img.onload = function () {\n        var canvas = document.createElement('canvas'),\n            ctx = canvas.getContext('2d');\n        var ratio = img.width / thumbWidth;\n        canvas.height = img.height / ratio;\n        canvas.width = thumbWidth;\n        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n        var image = canvas.toDataURL();\n\n        _this2.setState({\n          image: image\n        });\n      };\n\n      img.src = src;\n    }\n  }, {\n    key: \"editSnapshot\",\n    value: function editSnapshot(snapshot) {\n      var _this3 = this;\n\n      var editIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n\n      if (snapshot) {\n        this.setState(Object.assign(Object.assign({\n          showEditFormDialog: true\n        }, snapshot), {\n          editIndex: editIndex\n        }));\n      } else {\n        this.props.explorer.viewer.deselect().then(function () {\n          var canvas = (0, _canvas.getCanvas)(_this3.props.explorer.viewer);\n          var bgColor = canvas && window.getComputedStyle(canvas).backgroundColor;\n\n          var insight = _sanddanceReact.SandDance.VegaDeckGl.util.clone(_this3.props.explorer.viewer.getInsight());\n\n          delete insight.size;\n          var title = _this3.props.getTitle && _this3.props.getTitle(insight) || '';\n          var description = _this3.props.getDescription && _this3.props.getDescription(insight) || '';\n\n          _this3.setState({\n            showEditFormDialog: true,\n            bgColor: bgColor,\n            title: title,\n            description: description,\n            insight: insight,\n            image: null,\n            editIndex: editIndex\n          }); //allow deselection to render\n\n\n          setTimeout(function () {\n            _this3.resize(canvas && canvas.toDataURL('image/png'), _this3.props.explorer.snapshotThumbWidth);\n          }, 500);\n        });\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this4 = this;\n\n      return React.createElement(_dialog.Dialog, {\n        modalProps: {\n          className: _sanddanceReact.util.classList('sanddance-snapshot-dialog', this.props.explorer.props.theme)\n        },\n        minWidth: \"\".concat(this.props.explorer.snapshotThumbWidth + 64, \"px\"),\n        hidden: !this.state.showEditFormDialog,\n        onDismiss: function onDismiss() {\n          return _this4.setState({\n            showEditFormDialog: false\n          });\n        },\n        title: this.state.editIndex >= 0 ? _language.strings.buttonEditSnapshot : _language.strings.buttonCreateSnapshot,\n        buttons: React.createElement(_base.base.fabric.PrimaryButton, {\n          disabled: !this.state.image || !this.state.title,\n          key: 0,\n          onClick: function onClick(e) {\n            var snapshot = {\n              title: _this4.state.title,\n              description: _this4.state.description,\n              insight: _this4.state.insight,\n              image: _this4.state.image,\n              bgColor: _this4.state.bgColor\n            };\n            _this4.props.modifySnapShot && _this4.props.modifySnapShot(snapshot);\n\n            _this4.props.onWriteSnapshot(snapshot, _this4.state.editIndex);\n\n            _this4.setState({\n              showEditFormDialog: false,\n              title: '',\n              description: '',\n              image: null\n            });\n          },\n          text: this.state.editIndex >= 0 ? _language.strings.buttonUpdateSnapshot : _language.strings.buttonCreateSnapshot\n        })\n      }, React.createElement(_base.base.fabric.TextField, {\n        label: _language.strings.labelSnapshotTitle,\n        onChange: function onChange(e, title) {\n          return _this4.setState({\n            title: title\n          });\n        },\n        value: this.state.title\n      }), React.createElement(_base.base.fabric.TextField, {\n        label: _language.strings.labelSnapshotDescription,\n        onChange: function onChange(e, description) {\n          return _this4.setState({\n            description: description\n          });\n        },\n        value: this.state.description,\n        multiline: true\n      }), React.createElement(\"div\", {\n        className: 'thumbnail'\n      }, !this.state.image && React.createElement(_base.base.fabric.Spinner, null), this.state.image && React.createElement(\"img\", {\n        src: this.state.image,\n        style: {\n          backgroundColor: this.state.bgColor\n        }\n      })), this.props.explorer.viewer && this.props.explorer.viewer.colorContexts && this.props.explorer.viewer.colorContexts.length > 1 && React.createElement(\"div\", null, _language.strings.labelColorFilter));\n    }\n  }]);\n\n  return SnapshotEditor;\n}(React.Component);\n\nexports.SnapshotEditor = SnapshotEditor;\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../controls/dialog\":\"cFWm\",\"../canvas\":\"Dryx\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"oc9r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Snapshots = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _dialog = require(\"../controls/dialog\");\n\nvar _group = require(\"../controls/group\");\n\nvar _iconButton = require(\"../controls/iconButton\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar Snapshots =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Snapshots, _React$Component);\n\n  function Snapshots(props) {\n    var _this;\n\n    _classCallCheck(this, Snapshots);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Snapshots).call(this, props));\n    _this.state = {\n      confirmation: null,\n      title: '',\n      description: '',\n      image: null,\n      bgColor: null,\n      insight: null\n    };\n    return _this;\n  }\n\n  _createClass(Snapshots, [{\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var items = [{\n        key: 'clear',\n        text: _language.strings.buttonClearSnapshots,\n        onClick: function onClick() {\n          return _this2.setState({\n            confirmation: {\n              buttonText: _language.strings.buttonClearSnapshots,\n              handler: function handler() {\n                return _this2.props.onClearSnapshots();\n              }\n            }\n          });\n        },\n        disabled: this.props.snapshots.length === 0\n      }];\n\n      if (this.props.getTopActions) {\n        items.push.apply(items, this.props.getTopActions(this.props.snapshots));\n      }\n\n      return React.createElement(_group.Group, {\n        className: \"sanddance-snapshots\",\n        label: _language.strings.labelSnapshots\n      }, React.createElement(\"div\", null, React.createElement(_base.base.fabric.PrimaryButton, {\n        text: _language.strings.buttonCreateSnapshot,\n        onClick: function onClick(e) {\n          return _this2.props.editor.editSnapshot();\n        },\n        split: true,\n        menuProps: {\n          items: items\n        }\n      }), this.props.getChildren && this.props.getChildren(this.props.snapshots), this.state.confirmation && React.createElement(_dialog.Dialog, {\n        hidden: false,\n        buttons: React.createElement(_base.base.fabric.PrimaryButton, {\n          key: 0,\n          onClick: function onClick(e) {\n            _this2.setState({\n              confirmation: null\n            });\n\n            _this2.state.confirmation.handler();\n          },\n          text: this.state.confirmation.buttonText\n        }),\n        onDismiss: function onDismiss() {\n          return _this2.setState({\n            confirmation: null\n          });\n        }\n      }, _language.strings.labelConfirmation), React.createElement(\"div\", null, this.props.snapshots.map(function (snapshot, i) {\n        var actions = _this2.props.getActions && _this2.props.getActions(snapshot, i) || [];\n        actions.push({\n          iconButtonProps: {\n            themePalette: _this2.props.themePalette,\n            title: _language.strings.buttonEditSnapshot,\n            onClick: function onClick(e) {\n              return _this2.props.editor.editSnapshot(snapshot, i);\n            },\n            iconName: 'Edit'\n          }\n        });\n\n        if (_this2.props.snapshots.length > 1) {\n          actions.push({\n            iconButtonProps: {\n              disabled: i === 0,\n              themePalette: _this2.props.themePalette,\n              title: _language.strings.buttonMoveUp,\n              onClick: function onClick(e) {\n                return _this2.props.onMoveUp(i);\n              },\n              iconName: 'SortUp'\n            }\n          }, {\n            iconButtonProps: {\n              disabled: i > _this2.props.snapshots.length - 2,\n              themePalette: _this2.props.themePalette,\n              title: _language.strings.buttonMoveDown,\n              onClick: function onClick(e) {\n                return _this2.props.onMoveDown(i);\n              },\n              iconName: 'SortDown'\n            }\n          });\n        }\n\n        actions.push({\n          iconButtonProps: {\n            themePalette: _this2.props.themePalette,\n            title: _language.strings.buttonDeleteSnapshot,\n            onClick: function onClick() {\n              return _this2.setState({\n                confirmation: {\n                  buttonText: _language.strings.buttonDeleteSnapshot,\n                  handler: function handler() {\n                    return _this2.props.onRemoveSnapshot(i);\n                  }\n                }\n              });\n            },\n            iconName: 'Delete'\n          }\n        });\n        return React.createElement(\"div\", {\n          key: i,\n          className: _sanddanceReact.util.classList('snapshot', i === _this2.props.selectedSnapshotIndex && 'selected')\n        }, React.createElement(\"div\", {\n          onClick: function onClick(e) {\n            return _this2.props.onSnapshotClick(snapshot, i);\n          }\n        }, React.createElement(\"div\", {\n          className: 'title'\n        }, snapshot.title), React.createElement(\"div\", {\n          className: 'thumbnail'\n        }, React.createElement(\"img\", {\n          title: snapshot.description,\n          src: snapshot.image,\n          style: {\n            backgroundColor: snapshot.bgColor\n          }\n        }))), React.createElement(Actions, {\n          actions: actions,\n          snapshot: snapshot\n        }));\n      }))));\n    }\n  }]);\n\n  return Snapshots;\n}(React.Component);\n\nexports.Snapshots = Snapshots;\n\nfunction Actions(props) {\n  return React.createElement(\"div\", {\n    className: \"actions\"\n  }, props.actions.map(function (action, i) {\n    if (action.iconButtonProps) {\n      return React.createElement(_iconButton.IconButton, Object.assign({\n        key: i\n      }, action.iconButtonProps));\n    }\n\n    if (action.element) {\n      return action.element;\n    }\n  }));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"../controls/dialog\":\"cFWm\",\"../controls/group\":\"Q3hf\",\"../controls/iconButton\":\"dQNc\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"yzxM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.toggleSearch = toggleSearch;\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction comparableGroup(group) {\n  return Object.assign(Object.assign({}, group), {\n    clause: null\n  });\n}\n\nfunction compareGroup(a, b) {\n  return _sanddanceReact.SandDance.searchExpression.compareGroup(comparableGroup(a), comparableGroup(b));\n}\n\nfunction toggleSearch(haystack, needle) {\n  var groups = [];\n  var found = false; //look for item in all\n\n  haystack.forEach(function (group) {\n    if (compareGroup(group, needle)) {\n      //if it exists, don't add it\n      found = true;\n    } else {\n      groups.push(group);\n    }\n  });\n  return {\n    groups: groups,\n    found: found\n  };\n}\n},{\"@msrvida/sanddance-react\":\"MjKu\"}],\"hH4t\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CommandBarButtonStyles = void 0;\n\nvar _base = require(\"../base\");\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar CommandBarButtonStyles = function CommandBarButtonStyles(props) {\n  var theme = props.theme;\n\n  if (!theme) {\n    throw new Error('Theme is undefined or null.');\n  }\n\n  var palette = theme.palette,\n      semanticColors = theme.semanticColors;\n  var BUTTON_ICON_CLASSNAME = '.ms-Button-icon';\n  return {\n    root: [Object.assign({}, _base.base.fabric.getFocusStyle(theme, {\n      inset: 2\n    })), {\n      backgroundColor: palette.white\n    }],\n    rootHovered: {\n      backgroundColor: palette.neutralLighter,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: palette.themeDarkAlt\n      })\n    },\n    rootPressed: {\n      backgroundColor: palette.neutralLight,\n      color: palette.neutralDark,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: palette.themeDark\n      })\n    },\n    rootChecked: {\n      backgroundColor: palette.neutralLight,\n      color: palette.neutralDark,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: palette.themeDark\n      })\n    },\n    rootCheckedHovered: {\n      backgroundColor: palette.neutralQuaternaryAlt,\n      color: palette.neutralDark\n    },\n    rootExpanded: {\n      color: palette.neutralDark,\n      backgroundColor: palette.neutralLight,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: palette.themeDark\n      })\n    },\n    rootExpandedHovered: {\n      background: palette.neutralQuaternaryAlt\n    },\n    rootDisabled: {\n      backgroundColor: palette.white,\n      selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n        color: semanticColors.disabledBodySubtext\n      })\n    },\n    splitButtonMenuButton: {\n      backgroundColor: palette.white,\n      color: palette.neutralSecondary,\n      selectors: {\n        ':hover': {\n          backgroundColor: palette.neutralLighter,\n          selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n            color: palette.neutralPrimary\n          })\n        },\n        ':active': {\n          backgroundColor: palette.neutralLight,\n          selectors: _defineProperty({}, BUTTON_ICON_CLASSNAME, {\n            color: palette.neutralPrimary\n          })\n        }\n      }\n    },\n    splitButtonMenuButtonDisabled: {\n      backgroundColor: palette.white\n    },\n    icon: {\n      color: palette.themePrimary\n    }\n  };\n};\n\nexports.CommandBarButtonStyles = CommandBarButtonStyles;\n},{\"../base\":\"Vlbn\"}],\"GBuN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Logo = Logo;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar s = \"\\n ......\\n.......\\n...\\n......\\n ......\\n    ...\\n.......\\n......\\n\";\nvar d = s.split('\\n').map(function (row, irow) {\n  return row.length ? row.split('').map(function (char, icol) {\n    return char.trim() ? \"M\".concat(2 * icol + 1, \" \").concat(2 * (irow - 1) + 1, \" v1 h1 v-1 Z\") : '';\n  }).join(' ') : '';\n}).join('\\n');\n\nfunction Logo() {\n  return React.createElement(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 16 16\"\n  }, React.createElement(\"path\", {\n    d: d\n  }));\n}\n},{\"react\":\"ccIB\"}],\"Afi9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Topbar = Topbar;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _base = require(\"../base\");\n\nvar _CommandBarButton = require(\"./CommandBarButton.styles\");\n\nvar _logo = require(\"./logo\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _language = require(\"../language\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction Topbar(props) {\n  var zeroResults = props.selectionState.selectedData && props.selectionState.selectedData.length === 0;\n  var disabled = !props.loaded;\n  var items = [{\n    key: 'deselect',\n    name: _language.strings.buttonDeselect,\n    iconProps: {\n      iconName: 'Cancel'\n    },\n    disabled: disabled || !props.selectionSearch,\n    onClick: props.doDeselect\n  }, {\n    key: 'isolate',\n    name: _language.strings.buttonIsolate,\n    iconProps: {\n      iconName: 'Filter'\n    },\n    disabled: disabled || !props.selectionSearch || zeroResults,\n    onClick: function onClick() {\n      return props.doFilter(props.selectionSearch);\n    }\n  }, {\n    key: 'exclude',\n    name: _language.strings.buttonExclude,\n    iconProps: {\n      iconName: 'ClearFilter'\n    },\n    disabled: disabled || !props.selectionSearch || zeroResults,\n    onClick: function onClick() {\n      return props.doFilter(_sanddanceReact.SandDance.searchExpression.invert(props.selectionSearch));\n    }\n  }, {\n    key: 'reset',\n    name: _language.strings.buttonReset,\n    iconProps: {\n      iconName: 'RemoveFilter'\n    },\n    disabled: disabled || !props.filter,\n    onClick: props.doUnfilter\n  }];\n\n  if (props.buttons) {\n    items.push.apply(items, props.buttons);\n  }\n\n  var farItems = [{\n    key: 'previous-snapshot',\n    iconProps: {\n      iconName: 'Previous'\n    },\n    title: _language.strings.buttonPrevSnapshot,\n    onClick: props.onSnapshotPreviousClick,\n    disabled: props.snapshots.length < 2\n  }, {\n    key: 'snapshot',\n    iconProps: {\n      iconName: 'Camera'\n    },\n    title: _language.strings.buttonCreateSnapshot,\n    onClick: props.onSnapshotClick,\n    disabled: !props.loaded\n  }, {\n    key: 'next-snapshot',\n    iconProps: {\n      iconName: 'Next'\n    },\n    title: _language.strings.buttonNextSnapshot,\n    onClick: props.onSnapshotNextClick,\n    disabled: props.snapshots.length < 2\n  }, {\n    key: 'view',\n    iconProps: {\n      iconName: props.view === '2d' ? 'Product' : 'Page'\n    },\n    title: props.view === '2d' ? _language.strings.labelViewType3d : _language.strings.lavelViewType2d,\n    onClick: props.onViewClick,\n    disabled: !props.loaded\n  }, {\n    key: 'home',\n    iconProps: {\n      iconName: 'PicturePosition'\n    },\n    title: _language.strings.buttonCameraHome,\n    onClick: props.onHomeClick,\n    disabled: !props.loaded\n  }];\n  return React.createElement(\"div\", {\n    className: \"sanddance-explorer-topbar\"\n  }, React.createElement(\"div\", {\n    className: \"logo\"\n  }, React.createElement(_logo.Logo, null), React.createElement(\"a\", {\n    href: props.logoClickUrl || '/',\n    target: props.logoClickTarget || '_blank'\n  }, _language.strings.appName)), React.createElement(\"div\", {\n    className: \"sanddance-explorer-commandbar\"\n  }, React.createElement(_base.base.fabric.Customizer, {\n    scopedSettings: {\n      CommandBarButton: {\n        styles: function styles(buttonProps) {\n          buttonProps.theme.palette = props.themePalette;\n          return (0, _CommandBarButton.CommandBarButtonStyles)(buttonProps);\n        }\n      }\n    }\n  }, React.createElement(_base.base.fabric.CommandBar, {\n    items: items,\n    farItems: farItems,\n    styles: {\n      root: {\n        backgroundColor: 'transparent',\n        height: 'unset',\n        paddingLeft: 0,\n        paddingRight: 0\n      }\n    }\n  }))));\n}\n},{\"react\":\"ccIB\",\"../base\":\"Vlbn\",\"./CommandBarButton.styles\":\"hH4t\",\"./logo\":\"GBuN\",\"@msrvida/sanddance-react\":\"MjKu\",\"../language\":\"hk5u\"}],\"KeW6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Explorer = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _colorMap = require(\"./colorMap\");\n\nvar _base = require(\"./base\");\n\nvar _colorScheme = require(\"./colorScheme\");\n\nvar _chart = require(\"./dialogs/chart\");\n\nvar _color = require(\"./dialogs/color\");\n\nvar _interfaces = require(\"./interfaces\");\n\nvar _partialInsight = require(\"./partialInsight\");\n\nvar _dataBrowser = require(\"./dialogs/dataBrowser\");\n\nvar _dataScope = require(\"./controls/dataScope\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _dialog = require(\"./controls/dialog\");\n\nvar _columns = require(\"./columns\");\n\nvar _mouseEvent = require(\"./mouseEvent\");\n\nvar _iconButton = require(\"./controls/iconButton\");\n\nvar _search = require(\"./dialogs/search\");\n\nvar _dataLoader = require(\"./dataLoader\");\n\nvar _clickableTextLayer = require(\"./clickableTextLayer\");\n\nvar _chartRecommender = require(\"@msrvida/chart-recommender\");\n\nvar _canvas = require(\"./canvas\");\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _settings = require(\"./dialogs/settings\");\n\nvar _sidebar = require(\"./controls/sidebar\");\n\nvar _snapshotEditor = require(\"./dialogs/snapshotEditor\");\n\nvar _snapshots = require(\"./dialogs/snapshots\");\n\nvar _language = require(\"./language\");\n\nvar _themes = require(\"./themes\");\n\nvar _toggleSearch = require(\"./toggleSearch\");\n\nvar _topbar = require(\"./controls/topbar\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar dataBrowserTitles = {};\ndataBrowserTitles[_dataScope.DataScopeId.AllData] = _language.strings.selectDataSpanAll;\ndataBrowserTitles[_dataScope.DataScopeId.FilteredData] = _language.strings.selectDataSpanFilter;\ndataBrowserTitles[_dataScope.DataScopeId.SelectedData] = _language.strings.selectDataSpanSelection;\nvar dataBrowserZeroMessages = {};\ndataBrowserZeroMessages[_dataScope.DataScopeId.AllData] = _language.strings.labelZeroAll;\ndataBrowserZeroMessages[_dataScope.DataScopeId.FilteredData] = null; //empty array is not used\n\ndataBrowserZeroMessages[_dataScope.DataScopeId.SelectedData] = _language.strings.labelZeroSearchResults;\nvar dataBrowserNullMessages = {};\ndataBrowserNullMessages[_dataScope.DataScopeId.AllData] = _language.strings.labelDataNullAll;\ndataBrowserNullMessages[_dataScope.DataScopeId.FilteredData] = _language.strings.labelDataNullFiltered;\ndataBrowserNullMessages[_dataScope.DataScopeId.SelectedData] = _language.strings.labelDataNullSelection;\n\nfunction createInputSearch(search) {\n  var groups = _sanddanceReact.SandDance.util.ensureSearchExpressionGroupArray(search);\n\n  var dialogSearch = groups.map(function (group, groupIndex) {\n    return Object.assign(Object.assign({\n      key: groupIndex\n    }, group), {\n      expressions: group.expressions.map(function (ex, i) {\n        var ex2 = Object.assign({\n          key: i\n        }, ex);\n        return ex2;\n      })\n    });\n  });\n  return dialogSearch;\n}\n\nvar Explorer =\n/*#__PURE__*/\nfunction (_React$Component) {\n  _inherits(Explorer, _React$Component);\n\n  function Explorer(props) {\n    var _this;\n\n    _classCallCheck(this, Explorer);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(Explorer).call(this, props));\n    _this.state = {\n      calculating: null,\n      errors: null,\n      autoCompleteDistinctValues: {},\n      colorBin: null,\n      dataContent: null,\n      dataFile: null,\n      search: null,\n      facets: null,\n      filter: null,\n      filteredData: null,\n      specCapabilities: null,\n      size: {\n        height: null,\n        width: null\n      },\n      scheme: null,\n      transform: null,\n      columns: null,\n      chart: 'grid',\n      signalValues: null,\n      hideAxes: false,\n      hideLegend: false,\n      sideTabId: _interfaces.SideTabId.ChartType,\n      dataScopeId: _dataScope.DataScopeId.AllData,\n      selectedItemIndex: {},\n      sidebarClosed: false,\n      sidebarPinned: true,\n      view: props.initialView || '2d',\n      snapshots: [],\n      selectedSnapshotIndex: -1,\n      tooltipExclusions: [],\n      positionedColumnMapProps: null,\n      note: null\n    };\n    _this.state.selectedItemIndex[_dataScope.DataScopeId.AllData] = 0;\n    _this.state.selectedItemIndex[_dataScope.DataScopeId.FilteredData] = 0;\n    _this.state.selectedItemIndex[_dataScope.DataScopeId.SelectedData] = 0;\n    _this.snapshotThumbWidth = _defaults.snapshotThumbWidth;\n    _this.discardColorContextUpdates = true;\n\n    _this.updateViewerOptions(Object.assign(Object.assign({}, _sanddanceReact.SandDance.VegaDeckGl.util.clone(_sanddanceReact.SandDance.Viewer.defaultViewerOptions)), props.viewerOptions));\n\n    return _this;\n  }\n\n  _createClass(Explorer, [{\n    key: \"finalize\",\n    value: function finalize() {\n      if (this.viewer) this.viewer.finalize();\n    }\n  }, {\n    key: \"updateViewerOptions\",\n    value: function updateViewerOptions(viewerOptions) {\n      var _this2 = this;\n\n      this.viewerOptions = Object.assign(Object.assign({}, _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge(_defaults.defaultViewerOptions, this.viewerOptions, viewerOptions)), {\n        tooltipOptions: {\n          exclude: function exclude(columnName) {\n            return _this2.state.tooltipExclusions.indexOf(columnName) >= 0;\n          }\n        },\n        onColorContextChange: function onColorContextChange() {\n          return _this2.manageColorToolbar();\n        },\n        onDataFilter: function onDataFilter(dataFilter, filteredData) {\n          var selectedItemIndex = Object.assign({}, _this2.state.selectedItemIndex);\n          selectedItemIndex[_dataScope.DataScopeId.FilteredData] = 0;\n\n          _this2.changeInsight({\n            filter: dataFilter,\n            filteredData: filteredData,\n            selectedItemIndex: selectedItemIndex\n          });\n\n          if (_this2.state.sideTabId === _interfaces.SideTabId.Data && _this2.state.dataScopeId === _dataScope.DataScopeId.FilteredData) {\n            //make sure item is active\n            requestAnimationFrame(function () {\n              return filteredData && _this2.silentActivation(filteredData[0]);\n            });\n          }\n\n          viewerOptions && viewerOptions.onDataFilter && viewerOptions.onDataFilter(dataFilter, filteredData);\n        },\n        onSelectionChanged: function onSelectionChanged(newSearch, index, selectedData) {\n          if (_this2.ignoreSelectionChange) return;\n          var selectedItemIndex = Object.assign({}, _this2.state.selectedItemIndex);\n          selectedItemIndex[_dataScope.DataScopeId.SelectedData] = index || 0;\n          var _this2$state = _this2.state,\n              search = _this2$state.search,\n              sideTabId = _this2$state.sideTabId;\n\n          if (newSearch) {\n            search = createInputSearch(newSearch); //} else {\n            //sideTabId = SideTabId.ChartType;\n          }\n\n          _this2.setState({\n            search: search,\n            selectedItemIndex: selectedItemIndex,\n            sideTabId: sideTabId\n          });\n\n          viewerOptions && viewerOptions.onSelectionChanged && viewerOptions.onSelectionChanged(newSearch, index, selectedData);\n        },\n        onAxisClick: function onAxisClick(e, search) {\n          _this2.toggleableSearch(e, search);\n\n          viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onAxisClick(e, search);\n        },\n        onLegendHeaderClick: function onLegendHeaderClick(e) {\n          var pos = (0, _mouseEvent.getPosition)(e);\n\n          var specRole = _this2.state.specCapabilities && _this2.state.specCapabilities.roles.filter(function (r) {\n            return r.role === 'color';\n          })[0];\n\n          var positionedColumnMapProps = Object.assign(Object.assign({}, _this2.getColumnMapBaseProps()), {\n            collapseLabel: true,\n            container: _this2.div,\n            selectedColumnName: _this2.state.columns['color'],\n            onDismiss: function onDismiss() {\n              _this2.setState({\n                positionedColumnMapProps: null\n              });\n            },\n            specRole: specRole,\n            left: pos.left - _this2.div.clientLeft,\n            top: pos.top - _this2.div.clientTop\n          });\n\n          _this2.setState({\n            positionedColumnMapProps: positionedColumnMapProps\n          });\n        },\n        onLegendRowClick: function onLegendRowClick(e, legendRow) {\n          _this2.toggleableSearch(e, legendRow.search);\n\n          viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onLegendRowClick(e, legendRow);\n        },\n        onError: function onError(errors) {\n          _this2.setState({\n            errors: errors\n          });\n\n          viewerOptions && viewerOptions.onError && viewerOptions.onError(errors);\n        },\n        onBeforeCreateLayers: _clickableTextLayer.onBeforeCreateLayers,\n        getTextColor: function getTextColor(o) {\n          var t = o;\n\n          if (t.specRole) {\n            return _this2.viewerOptions.colors.clickableText;\n          } else {\n            return o.color;\n          }\n        },\n        getTextHighlightColor: function getTextHighlightColor(o) {\n          var t = o;\n\n          if (t.specRole) {\n            return _this2.viewerOptions.colors.clickableTextHighlight;\n          } else {\n            return o.color;\n          }\n        },\n        onTextClick: function onTextClick(e, text) {\n          if (e && text) {\n            var pos = (0, _mouseEvent.getPosition)(e);\n            var specRole = text.specRole;\n\n            if (pos && specRole) {\n              var positionedColumnMapProps = Object.assign(Object.assign({}, _this2.getColumnMapBaseProps()), {\n                collapseLabel: true,\n                container: _this2.div,\n                selectedColumnName: _this2.state.columns[specRole.role],\n                onDismiss: function onDismiss() {\n                  _this2.setState({\n                    positionedColumnMapProps: null\n                  });\n                },\n                specRole: specRole,\n                left: pos.left - _this2.div.clientLeft,\n                top: pos.top - _this2.div.clientTop\n              });\n\n              _this2.setState({\n                positionedColumnMapProps: positionedColumnMapProps\n              });\n            } else {\n              _this2.setState({\n                positionedColumnMapProps: null\n              });\n            }\n          }\n        }\n      });\n\n      if (this.viewer && this.viewer.presenter) {\n        var newPresenterStyle = _sanddanceReact.SandDance.util.getPresenterStyle(this.viewerOptions);\n\n        var mergePrenterStyle = Object.assign(Object.assign({}, this.viewer.presenter.style), newPresenterStyle);\n        this.viewer.presenter.style = mergePrenterStyle;\n        this.viewer.options = _sanddanceReact.SandDance.VegaDeckGl.util.deepMerge(this.viewer.options, this.props.viewerOptions, this.viewerOptions);\n      }\n    }\n  }, {\n    key: \"signal\",\n    value: function signal(signalName, signalValue) {\n      switch (signalName) {\n        case _sanddanceReact.SandDance.constants.SignalNames.ColorBinCount:\n        case _sanddanceReact.SandDance.constants.SignalNames.ColorReverse:\n        case _sanddanceReact.SandDance.constants.SignalNames.MarkOpacity:\n          this.discardColorContextUpdates = false;\n          break;\n      }\n\n      this.viewer.vegaViewGl.signal(signalName, signalValue);\n      this.viewer.vegaViewGl.run();\n      this.discardColorContextUpdates = true;\n      this.props.onSignalChanged && this.props.onSignalChanged();\n    }\n  }, {\n    key: \"manageColorToolbar\",\n    value: function manageColorToolbar() {\n      var _this3 = this;\n\n      var canRemap = this.viewer.colorContexts && this.viewer.colorContexts.length > 1;\n      (0, _colorMap.applyColorButtons)(this.viewer.presenter, !!this.state.columns.color, {\n        themePalette: _themes.themePalettes[this.props.theme || ''],\n        canRemap: canRemap,\n        isRemap: canRemap && this.viewer.currentColorContext > 0,\n        colorMapHandler: function colorMapHandler(remap) {\n          _this3.viewer.currentColorContext = ~~remap;\n\n          _this3.viewer.renderSameLayout();\n\n          _this3.manageColorToolbar();\n        }\n      });\n    }\n  }, {\n    key: \"getInsight\",\n    value: function getInsight() {\n      return this.viewer.getInsight();\n    }\n  }, {\n    key: \"setInsight\",\n    value: function setInsight() {\n      var _this4 = this;\n\n      var partialInsight = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.viewer.getInsight();\n      var rebaseFilter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n      selectedItemIndex[_dataScope.DataScopeId.AllData] = 0;\n      selectedItemIndex[_dataScope.DataScopeId.FilteredData] = 0;\n      selectedItemIndex[_dataScope.DataScopeId.SelectedData] = 0;\n      var newState = Object.assign({\n        chart: null,\n        scheme: null,\n        columns: null,\n        filter: null,\n        filteredData: null,\n        selectedItemIndex: selectedItemIndex\n      }, partialInsight);\n      newState.search = createInputSearch(newState.filter);\n\n      var changeInsight = function changeInsight() {\n        _this4.getColorContext = null;\n\n        _this4.changeInsight(newState);\n      };\n\n      var currentFilter = this.viewer.getInsight().filter;\n\n      if (rebaseFilter && currentFilter && newState.filter) {\n        if (_sanddanceReact.SandDance.searchExpression.startsWith(newState.filter, currentFilter)) {\n          changeInsight();\n        } else {\n          this.viewer.reset().then(function () {\n            return new Promise(function (resolve, reject) {\n              setTimeout(resolve, _this4.viewer.options.transitionDurations.scope);\n            });\n          }).then(changeInsight);\n        }\n      } else {\n        changeInsight();\n      }\n    }\n  }, {\n    key: \"handleReviveSnapshot\",\n    value: function handleReviveSnapshot(snapshot, selectedSnapshotIndex) {\n      var handled = false;\n\n      if (this.props.onSnapshotClick) {\n        this.setState({\n          selectedSnapshotIndex: selectedSnapshotIndex\n        });\n        handled = this.props.onSnapshotClick(snapshot, selectedSnapshotIndex);\n      }\n\n      if (!handled) {\n        this.reviveSnapshot(selectedSnapshotIndex);\n      }\n    }\n  }, {\n    key: \"reviveSnapshot\",\n    value: function reviveSnapshot(snapshotOrIndex) {\n      if (typeof snapshotOrIndex === 'number') {\n        var selectedSnapshotIndex = snapshotOrIndex;\n        var snapshot = this.state.snapshots[selectedSnapshotIndex];\n        var newState = Object.assign(Object.assign({}, snapshot.insight), {\n          note: snapshot.description,\n          selectedSnapshotIndex: selectedSnapshotIndex\n        });\n\n        if (!this.state.sidebarClosed) {\n          newState.sideTabId = _interfaces.SideTabId.Snapshots;\n          this.scrollSnapshotIntoView(selectedSnapshotIndex);\n        }\n\n        this.setInsight(newState, true);\n      } else {\n        var _snapshot = snapshotOrIndex;\n\n        if (_snapshot.insight) {\n          this.setInsight(Object.assign(Object.assign({}, _snapshot.insight), {\n            note: _snapshot.description,\n            selectedSnapshotIndex: -1\n          }), true); //don't navigate to sideTab\n        } else {\n          this.setState({\n            note: _snapshot.description,\n            selectedSnapshotIndex: -1\n          });\n        }\n      }\n    }\n  }, {\n    key: \"load\",\n    value: function load(data, getPartialInsight, optionsOrPrefs) {\n      var _this5 = this;\n\n      this.changeInsight({\n        columns: null,\n        note: null\n      });\n      return new Promise(function (resolve, reject) {\n        var loadFinal = function loadFinal(dataContent) {\n          var partialInsight;\n          _this5.prefs = optionsOrPrefs && optionsOrPrefs.chartPrefs || optionsOrPrefs || {};\n\n          if (getPartialInsight) {\n            partialInsight = getPartialInsight(dataContent.columns);\n            (0, _partialInsight.initPrefs)(_this5.prefs, partialInsight);\n          }\n\n          if (!partialInsight) {\n            //load recommendation\n            var r = new _chartRecommender.RecommenderSummary(dataContent.columns, dataContent.data);\n            partialInsight = r.recommend();\n          }\n\n          var selectedItemIndex = Object.assign({}, _this5.state.selectedItemIndex);\n          var sideTabId = _interfaces.SideTabId.ChartType;\n          selectedItemIndex[_dataScope.DataScopeId.AllData] = 0;\n          selectedItemIndex[_dataScope.DataScopeId.FilteredData] = 0;\n          selectedItemIndex[_dataScope.DataScopeId.SelectedData] = 0;\n          var newState = Object.assign({\n            dataFile: dataFile,\n            dataContent: dataContent,\n            snapshots: dataContent.snapshots || _this5.state.snapshots,\n            autoCompleteDistinctValues: {},\n            filter: null,\n            filteredData: null,\n            transform: null,\n            tooltipExclusions: optionsOrPrefs && optionsOrPrefs.tooltipExclusions || [],\n            selectedItemIndex: selectedItemIndex,\n            sideTabId: sideTabId\n          }, partialInsight);\n          _this5.getColorContext = null;\n          (0, _columns.ensureColumnsExist)(newState.columns, dataContent.columns, newState.transform);\n          var errors = (0, _columns.ensureColumnsPopulated)(partialInsight ? partialInsight.chart : null, newState.columns, dataContent.columns);\n          newState.errors = errors; //change insight\n\n          _this5.changeInsight(newState); //make sure item is active\n\n\n          _this5.activateDataBrowserItem(sideTabId, _this5.state.dataScopeId);\n\n          resolve();\n        };\n\n        var dataFile;\n\n        if (Array.isArray(data)) {\n          return (0, _dataLoader.loadDataArray)(data, 'json').then(function (result) {\n            dataFile = {\n              type: 'json'\n            };\n            loadFinal(result);\n          }).catch(reject);\n        } else {\n          dataFile = data;\n          return (0, _dataLoader.loadDataFile)(dataFile).then(loadFinal).catch(reject);\n        }\n      });\n    }\n  }, {\n    key: \"changeChartType\",\n    value: function changeChartType(chart) {\n      var _this6 = this;\n\n      var partialInsight = (0, _partialInsight.copyPrefToNewState)(this.prefs, chart, '*', '*');\n      var newState = Object.assign({\n        chart: chart\n      }, partialInsight);\n      var columns = this.state.columns || {};\n      newState.columns = Object.assign({}, columns); //special case mappings when switching chart type\n\n      if (this.state.chart === 'scatterplot' && (chart === 'barchart' || chart === 'barchartV')) {\n        newState.columns = Object.assign(Object.assign({}, columns), {\n          sort: columns.y\n        });\n      } else if (this.state.chart === 'scatterplot' && chart === 'barchartH') {\n        newState.columns = Object.assign(Object.assign({}, columns), {\n          sort: columns.x\n        });\n      } else if (chart === 'treemap') {\n        newState.view = '2d';\n\n        if (!columns.size) {\n          //make sure size exists and is numeric\n          var sizeColumnName = (0, _chartRecommender.preferredColumnForTreemapSize)(this.state.dataContent.columns, true);\n\n          if (!sizeColumnName) {\n            sizeColumnName = (0, _chartRecommender.preferredColumnForTreemapSize)(this.state.dataContent.columns, false);\n          }\n\n          if (!sizeColumnName) {//TODO error - no numeric columns\n          } else {\n            newState.columns = Object.assign(Object.assign({}, columns), {\n              size: sizeColumnName\n            });\n          }\n        }\n      } else if (chart === 'stacks') {\n        newState.view = '3d';\n      }\n\n      (0, _columns.ensureColumnsExist)(newState.columns, this.state.dataContent.columns, this.state.transform);\n      var errors = (0, _columns.ensureColumnsPopulated)(chart, newState.columns, this.state.dataContent.columns);\n\n      if (errors) {\n        newState.errors = errors;\n      }\n\n      this.calculate(function () {\n        return _this6.changeInsight(newState);\n      });\n    }\n  }, {\n    key: \"calculate\",\n    value: function calculate(calculating) {\n      this.setState({\n        calculating: calculating\n      });\n    }\n  }, {\n    key: \"changeView\",\n    value: function changeView(view) {\n      this.changeInsight({\n        view: view\n      });\n    } //state members which change the insight\n\n  }, {\n    key: \"changeInsight\",\n    value: function changeInsight(newState) {\n      if (!newState.signalValues) {\n        newState.signalValues = null;\n      }\n\n      if (newState.chart === 'barchart') {\n        newState.chart = 'barchartV';\n      }\n\n      this.setState(newState);\n    }\n  }, {\n    key: \"changespecCapabilities\",\n    value: function changespecCapabilities(specCapabilities) {\n      this.setState({\n        specCapabilities: specCapabilities\n      });\n    }\n  }, {\n    key: \"changeColumnMapping\",\n    value: function changeColumnMapping(role, column, options) {\n      var _this7 = this;\n\n      var columns = Object.assign({}, this.state.columns);\n\n      var final = function final() {\n        columns[role] = column && column.name;\n\n        _this7.changeInsight({\n          columns: columns\n        });\n      };\n\n      if (column) {\n        switch (role) {\n          case 'facet':\n            {\n              (function () {\n                var facetColumn = column;\n                var facets;\n\n                if (facetColumn.quantitative) {\n                  facets = {\n                    columns: 3,\n                    rows: 3\n                  };\n                } else {\n                  switch (facetColumn.stats.distinctValueCount) {\n                    case 2:\n                      {\n                        facets = {\n                          columns: 2,\n                          rows: 1\n                        };\n                        break;\n                      }\n\n                    default:\n                      {\n                        facets = {\n                          columns: null,\n                          rows: null\n                        };\n                        var square = 1;\n\n                        while (square * square < facetColumn.stats.distinctValueCount) {\n                          square++;\n                        }\n\n                        facets.columns = facets.rows = square;\n                      }\n                  }\n                }\n\n                columns['facet'] = column.name;\n\n                _this7.changeInsight({\n                  facets: facets,\n                  columns: columns\n                });\n              })();\n\n              break;\n            }\n\n          case 'color':\n            {\n              (function () {\n                var newState = {\n                  scheme: options && options.scheme,\n                  columns: columns,\n                  colorBin: _this7.state.colorBin\n                };\n\n                if (!newState.scheme) {\n                  var partialInsight = (0, _partialInsight.copyPrefToNewState)(_this7.prefs, _this7.state.chart, 'color', column.name);\n                  newState = Object.assign(Object.assign({}, newState), partialInsight);\n                }\n\n                if (!newState.scheme) {\n                  newState.scheme = (0, _colorScheme.bestColorScheme)(column, null, _this7.state.scheme);\n                }\n\n                if (!column.stats.hasColorData) {\n                  newState.directColor = false;\n\n                  if (_this7.state.directColor !== newState.directColor) {\n                    newState.calculating = function () {\n                      return _this7._resize();\n                    };\n                  }\n                }\n\n                if (_this7.state.columns && _this7.state.columns.color && _this7.state.columns.color !== column.name) {\n                  var currColorColumn = _this7.state.dataContent.columns.filter(function (c) {\n                    return c.name === _this7.state.columns.color;\n                  })[0];\n\n                  if (column.isColorData != currColorColumn.isColorData) {\n                    newState.calculating = function () {\n                      return _this7._resize();\n                    };\n                  }\n                }\n\n                _this7.ignoreSelectionChange = true;\n\n                _this7.viewer.deselect().then(function () {\n                  _this7.ignoreSelectionChange = false; //allow deselection to render\n\n                  requestAnimationFrame(function () {\n                    columns['color'] = column.name;\n                    _this7.getColorContext = null;\n\n                    _this7.changeInsight(newState);\n                  });\n                });\n              })();\n\n              break;\n            }\n\n          case 'x':\n            {\n              (function () {\n                var partialInsight = (0, _partialInsight.copyPrefToNewState)(_this7.prefs, _this7.state.chart, 'x', column.name);\n                var newState = Object.assign({\n                  columns: columns\n                }, partialInsight);\n                columns['x'] = column.name;\n\n                _this7.changeInsight(newState);\n              })();\n\n              break;\n            }\n\n          default:\n            {\n              final();\n              break;\n            }\n        }\n      } else {\n        final();\n      }\n    }\n  }, {\n    key: \"setSideTabId\",\n    value: function setSideTabId(sideTabId, dataScopeId) {\n      if (sideTabId === _interfaces.SideTabId.Data && dataScopeId == null) {\n        //choose most relevant DataScopeId\n        dataScopeId = this.getBestDataScopeId();\n      }\n\n      if (dataScopeId == null) {\n        dataScopeId = this.state.dataScopeId;\n      }\n\n      this.setState({\n        sideTabId: sideTabId,\n        dataScopeId: dataScopeId,\n        sidebarClosed: false\n      });\n      this.activateDataBrowserItem(sideTabId, dataScopeId);\n    }\n  }, {\n    key: \"getBestDataScopeId\",\n    value: function getBestDataScopeId() {\n      var dataScopeId;\n      var selectionState = this.viewer && this.viewer.getSelection();\n\n      if (selectionState && selectionState.selectedData && selectionState.selectedData.length) {\n        dataScopeId = _dataScope.DataScopeId.SelectedData;\n      } else if (this.state.filteredData) {\n        dataScopeId = _dataScope.DataScopeId.FilteredData;\n      } else {\n        dataScopeId = _dataScope.DataScopeId.AllData;\n      }\n\n      return dataScopeId;\n    }\n  }, {\n    key: \"activateDataBrowserItem\",\n    value: function activateDataBrowserItem(sideTabId, dataScopeId) {\n      if (!this.viewer) return;\n      var itemToActivate;\n\n      if (sideTabId === _interfaces.SideTabId.Data) {\n        switch (dataScopeId) {\n          case _dataScope.DataScopeId.AllData:\n            {\n              itemToActivate = this.state.dataContent && this.state.dataContent.data[this.state.selectedItemIndex[_dataScope.DataScopeId.AllData]];\n              break;\n            }\n\n          case _dataScope.DataScopeId.FilteredData:\n            {\n              itemToActivate = this.state.filteredData && this.state.filteredData[this.state.selectedItemIndex[_dataScope.DataScopeId.FilteredData]];\n              break;\n            }\n\n          case _dataScope.DataScopeId.SelectedData:\n            {\n              var selection = this.viewer.getSelection() || {};\n              itemToActivate = selection.selectedData && selection.selectedData[this.state.selectedItemIndex[_dataScope.DataScopeId.SelectedData]];\n              break;\n            }\n        }\n      }\n\n      this.silentActivation(itemToActivate);\n    }\n  }, {\n    key: \"silentActivation\",\n    value: function silentActivation(itemToActivate) {\n      var _this8 = this;\n\n      this.ignoreSelectionChange = true;\n\n      var done = function done() {\n        _this8.ignoreSelectionChange = false;\n      };\n\n      if (itemToActivate) {\n        return this.viewer.activate(itemToActivate).then(done);\n      } else {\n        return this.viewer.deActivate().then(done);\n      }\n    }\n  }, {\n    key: \"sidebar\",\n    value: function sidebar(sidebarClosed, sidebarPinned) {\n      this.setState({\n        sidebarClosed: sidebarClosed,\n        sidebarPinned: sidebarPinned\n      });\n    }\n  }, {\n    key: \"resize\",\n    value: function resize() {\n      var _this9 = this;\n\n      this.setState({\n        calculating: function calculating() {\n          return _this9._resize();\n        }\n      });\n    }\n  }, {\n    key: \"_resize\",\n    value: function _resize() {\n      this.changeInsight({\n        size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed)\n      });\n    }\n  }, {\n    key: \"viewerMounted\",\n    value: function viewerMounted(glDiv) {\n      this.setState({\n        size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed),\n        signalValues: this.state.signalValues //keep initialized signalValues\n\n      });\n    }\n  }, {\n    key: \"getLayoutDivSize\",\n    value: function getLayoutDivSize(pinned, closed) {\n      var div = pinned && !closed ? this.layoutDivPinned : this.layoutDivUnpinned;\n      return {\n        height: div.offsetHeight,\n        width: div.offsetWidth\n      };\n    }\n  }, {\n    key: \"toggleableSearch\",\n    value: function toggleableSearch(e, search) {\n      if (e.ctrlKey) {\n        this.setState({\n          search: createInputSearch(search)\n        });\n        this.setSideTabId(_interfaces.SideTabId.Search);\n      } else {\n        var oldSelection = this.viewer.getSelection();\n\n        if (oldSelection.search) {\n          //look for matching groups and toggle them\n          var result = (0, _toggleSearch.toggleSearch)(_sanddanceReact.SandDance.util.ensureSearchExpressionGroupArray(oldSelection.search), search);\n\n          if (result.found) {\n            //removing a group\n            if (result.groups.length === 0) {\n              this.doDeselect();\n            } else {\n              //select with new search removed\n              this.doSelect(result.groups);\n            }\n          } else {\n            //adding a new group\n            if (e.altKey || e.shiftKey) {\n              var group = true;\n\n              if (e.altKey) {\n                search.clause = '&&';\n              } else if (e.shiftKey) {\n                if (this.props.searchORDisabled) {\n                  group = false;\n                } else {\n                  search.clause = '||';\n                }\n              }\n\n              if (group) {\n                result.groups.push(search);\n                this.doSelect(result.groups);\n              } else {\n                this.doSelect(search);\n              }\n            } else {\n              //replace\n              this.doSelect(search);\n            }\n          }\n        } else {\n          this.doSelect(search);\n        }\n      }\n    }\n  }, {\n    key: \"doFilter\",\n    value: function doFilter(search) {\n      this.viewer.filter(search);\n    }\n  }, {\n    key: \"doUnfilter\",\n    value: function doUnfilter() {\n      this.viewer.reset();\n    }\n  }, {\n    key: \"doSelect\",\n    value: function doSelect(search) {\n      this.viewer.select(search);\n    }\n  }, {\n    key: \"doDeselect\",\n    value: function doDeselect() {\n      return this.viewer.deselect();\n    }\n  }, {\n    key: \"writeSnapshot\",\n    value: function writeSnapshot(snapshot, editIndex) {\n      var selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n      var snapshots;\n\n      if (editIndex >= 0) {\n        snapshots = _toConsumableArray(this.state.snapshots);\n        snapshots[editIndex] = snapshot;\n        this.setState({\n          snapshots: snapshots,\n          selectedSnapshotIndex: selectedSnapshotIndex\n        });\n      } else {\n        var note = snapshot.description;\n        snapshots = this.state.snapshots.concat(snapshot);\n        selectedSnapshotIndex = snapshots.length - 1;\n\n        if (!this.state.sidebarClosed) {\n          this.scrollSnapshotIntoView(selectedSnapshotIndex);\n        }\n\n        this.setState({\n          sideTabId: _interfaces.SideTabId.Snapshots,\n          snapshots: snapshots,\n          selectedSnapshotIndex: selectedSnapshotIndex,\n          note: note\n        });\n      }\n    }\n  }, {\n    key: \"scrollSnapshotIntoView\",\n    value: function scrollSnapshotIntoView(selectedSnapshotIndex) {\n      var _this10 = this;\n\n      clearTimeout(this.scrollSnapshotTimer);\n      this.scrollSnapshotTimer = setTimeout(function () {\n        var selectedSnapshotElement = _this10.div.querySelector(\".snapshot:nth-child(\".concat(selectedSnapshotIndex + 1, \")\"));\n\n        if (selectedSnapshotElement) {\n          selectedSnapshotElement.scrollIntoView({\n            behavior: 'smooth',\n            block: 'nearest'\n          });\n        }\n      }, 500);\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      if (this.props.mounted) {\n        this.props.mounted(this);\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this11 = this;\n\n      var _this$state = this.state,\n          colorBin = _this$state.colorBin,\n          columns = _this$state.columns,\n          directColor = _this$state.directColor,\n          facets = _this$state.facets,\n          filter = _this$state.filter,\n          hideAxes = _this$state.hideAxes,\n          hideLegend = _this$state.hideLegend,\n          scheme = _this$state.scheme,\n          signalValues = _this$state.signalValues,\n          size = _this$state.size,\n          transform = _this$state.transform,\n          chart = _this$state.chart,\n          view = _this$state.view;\n      var insight = {\n        colorBin: colorBin,\n        columns: columns,\n        directColor: directColor,\n        facets: facets,\n        filter: filter,\n        hideAxes: hideAxes,\n        hideLegend: hideLegend,\n        scheme: scheme,\n        signalValues: signalValues,\n        size: size,\n        transform: transform,\n        chart: chart,\n        view: view\n      };\n      var loaded = !!(this.state.columns && this.state.dataContent);\n      var selectionState = this.viewer && this.viewer.getSelection() || {};\n      var selectionSearch = selectionState && selectionState.search;\n      var columnMapProps = this.getColumnMapBaseProps();\n      var datas = {};\n      datas[_dataScope.DataScopeId.AllData] = this.state.dataContent && this.state.dataContent.data;\n      datas[_dataScope.DataScopeId.FilteredData] = this.state.filteredData;\n      datas[_dataScope.DataScopeId.SelectedData] = selectionState && selectionState.selectedData;\n\n      if (this.state.calculating) {\n        requestAnimationFrame(function () {\n          //allow render to complete\n          if (_this11.state.calculating) {\n            _this11.state.calculating();\n\n            _this11.setState({\n              calculating: null\n            });\n          }\n        });\n      }\n\n      var theme = this.props.theme || '';\n      var themePalette = _themes.themePalettes[theme];\n      return React.createElement(\"div\", {\n        ref: function ref(div) {\n          if (div) _this11.div = div;\n        },\n        className: _sanddanceReact.util.classList('sanddance-explorer', this.props.theme)\n      }, React.createElement(_topbar.Topbar, {\n        logoClickUrl: this.props.logoClickUrl,\n        logoClickTarget: this.props.logoClickTarget,\n        themePalette: themePalette,\n        loaded: loaded,\n        doDeselect: this.doDeselect.bind(this),\n        doFilter: this.doFilter.bind(this),\n        doUnfilter: this.doUnfilter.bind(this),\n        filter: this.state.filter,\n        selectionSearch: selectionSearch,\n        selectionState: selectionState,\n        buttons: this.props.topBarButtonProps,\n        view: this.state.view,\n        snapshots: this.state.snapshots,\n        onSnapshotPreviousClick: function onSnapshotPreviousClick() {\n          var selectedSnapshotIndex;\n\n          if (_this11.state.selectedSnapshotIndex === -1) {\n            selectedSnapshotIndex = _this11.state.snapshots.length - 1;\n          } else {\n            selectedSnapshotIndex = _this11.state.selectedSnapshotIndex;\n            selectedSnapshotIndex--;\n\n            if (selectedSnapshotIndex < 0) {\n              selectedSnapshotIndex = _this11.state.snapshots.length - 1;\n            }\n          }\n\n          _this11.handleReviveSnapshot(_this11.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n        },\n        onSnapshotClick: function onSnapshotClick() {\n          return _this11.snapshotEditor.editSnapshot();\n        },\n        onSnapshotNextClick: function onSnapshotNextClick() {\n          var selectedSnapshotIndex;\n\n          if (_this11.state.selectedSnapshotIndex === -1) {\n            selectedSnapshotIndex = 0;\n          } else {\n            selectedSnapshotIndex = _this11.state.selectedSnapshotIndex;\n            selectedSnapshotIndex++;\n\n            if (selectedSnapshotIndex > _this11.state.snapshots.length - 1) {\n              selectedSnapshotIndex = 0;\n            }\n          }\n\n          _this11.handleReviveSnapshot(_this11.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n        },\n        onViewClick: function onViewClick() {\n          var view = _this11.state.view === '2d' ? '3d' : '2d';\n\n          _this11.changeInsight({\n            view: view\n          });\n        },\n        onHomeClick: function onHomeClick() {\n          return _this11.viewer.presenter.homeCamera();\n        }\n      }), React.createElement(\"div\", {\n        className: _sanddanceReact.util.classList('sanddance-main', this.state.sidebarPinned && 'pinned', this.state.sidebarClosed && 'closed', (insight.hideLegend || insight.directColor || !colorMapping(insight, this.state.dataContent && this.state.dataContent.columns)) && 'hide-legend')\n      }, React.createElement(\"div\", {\n        ref: function ref(div) {\n          if (div && !_this11.layoutDivUnpinned) _this11.layoutDivUnpinned = div;\n        },\n        className: \"sanddance-layout-unpinned\"\n      }), React.createElement(\"div\", {\n        ref: function ref(div) {\n          if (div && !_this11.layoutDivPinned) _this11.layoutDivPinned = div;\n        },\n        className: \"sanddance-layout-pinned\"\n      }), !loaded && React.createElement(\"div\", {\n        className: \"loading\"\n      }, React.createElement(_base.base.fabric.Spinner, {\n        size: _base.base.fabric.SpinnerSize.large,\n        label: _language.strings.loading\n      })), React.createElement(_sidebar.Sidebar, {\n        themePalette: themePalette,\n        calculating: !!this.state.calculating,\n        closed: this.state.sidebarClosed,\n        hideSidebarControls: this.props.hideSidebarControls,\n        pinned: this.state.sidebarPinned,\n        disabled: !loaded,\n        dataScopeProps: {\n          themePalette: themePalette,\n          compact: this.state.sidebarClosed,\n          onCompactClick: function onCompactClick() {\n            _this11.changeInsight({\n              sidebarClosed: false,\n              size: _this11.getLayoutDivSize(_this11.state.sidebarPinned, false)\n            });\n          },\n          dataSet: this.props.datasetElement,\n          dataCount: loaded && {\n            all: this.state.dataContent && this.state.dataContent.data.length,\n            filtered: this.state.filteredData && this.state.filteredData.length,\n            selected: selectionState && selectionState.selectedData && selectionState.selectedData.length\n          },\n          active: this.state.sideTabId === _interfaces.SideTabId.Data,\n          onDataScopeClick: function onDataScopeClick(dataScopeId) {\n            return _this11.setSideTabId(_interfaces.SideTabId.Data, dataScopeId);\n          },\n          selectedDataScope: this.state.dataScopeId,\n          disabled: !loaded\n        },\n        onSideTabClick: function onSideTabClick(sideTabId) {\n          //collapse or toggle\n          if (sideTabId === _interfaces.SideTabId.Collapse || _this11.state.sideTabId === sideTabId) {\n            var _this11$state = _this11.state,\n                dataScopeId = _this11$state.dataScopeId,\n                sidebarClosed = _this11$state.sidebarClosed;\n\n            if (sidebarClosed && sideTabId === _interfaces.SideTabId.Data) {\n              dataScopeId = _this11.getBestDataScopeId();\n            }\n\n            sidebarClosed = !_this11.state.sidebarClosed;\n\n            _this11.changeInsight({\n              dataScopeId: dataScopeId,\n              sidebarClosed: sidebarClosed,\n              size: _this11.getLayoutDivSize(_this11.state.sidebarPinned, sidebarClosed)\n            });\n          } else if (sideTabId === _interfaces.SideTabId.Pin) {\n            _this11.changeInsight({\n              sidebarPinned: !_this11.state.sidebarPinned,\n              size: _this11.getLayoutDivSize(!_this11.state.sidebarPinned, _this11.state.sidebarClosed)\n            });\n          } else {\n            _this11.setSideTabId(sideTabId);\n          }\n        },\n        selectedSideTab: this.state.sideTabId\n      }, loaded && function () {\n        switch (_this11.state.sideTabId) {\n          case _interfaces.SideTabId.ChartType:\n            {\n              return React.createElement(_chart.Chart, Object.assign({\n                collapseLabels: _this11.props.compactUI,\n                tooltipExclusions: _this11.state.tooltipExclusions,\n                toggleTooltipExclusion: function toggleTooltipExclusion(columnName) {\n                  var tooltipExclusions = _toConsumableArray(_this11.state.tooltipExclusions);\n\n                  var i = tooltipExclusions.indexOf(columnName);\n\n                  if (i < 0) {\n                    tooltipExclusions.push(columnName);\n                  } else {\n                    tooltipExclusions.splice(i, 1);\n                  }\n\n                  _this11.setState({\n                    tooltipExclusions: tooltipExclusions\n                  });\n\n                  _this11.props.onTooltipExclusionsChanged && _this11.props.onTooltipExclusionsChanged(tooltipExclusions);\n                },\n                disabled: !loaded || _this11.state.sidebarClosed\n              }, columnMapProps, {\n                chart: _this11.state.chart,\n                view: _this11.state.view,\n                onChangeChartType: function onChangeChartType(chart) {\n                  return _this11.changeChartType(chart);\n                },\n                insightColumns: _this11.state.columns,\n                onChangeSignal: function onChangeSignal(role, column, name, value) {\n                  return (0, _partialInsight.saveSignalValuePref)(_this11.prefs, _this11.state.chart, role, column, name, value);\n                }\n              }));\n            }\n\n          case _interfaces.SideTabId.Color:\n            {\n              return React.createElement(_color.Color, Object.assign({\n                compactUI: _this11.props.compactUI,\n                specCapabilities: _this11.state.specCapabilities,\n                disabled: !loaded || _this11.state.sidebarClosed\n              }, columnMapProps, {\n                dataContent: _this11.state.dataContent,\n                scheme: _this11.state.scheme,\n                colorBin: _this11.state.colorBin,\n                colorBinSignal: _this11.viewer && _this11.viewer.vegaSpec && _this11.viewer.vegaSpec.signals.filter(function (s) {\n                  return s.name === _sanddanceReact.SandDance.constants.SignalNames.ColorBinCount;\n                })[0],\n                colorReverseSignal: _this11.viewer && _this11.viewer.vegaSpec && _this11.viewer.vegaSpec.signals.filter(function (s) {\n                  return s.name === _sanddanceReact.SandDance.constants.SignalNames.ColorReverse;\n                })[0],\n                colorColumn: _this11.state.columns.color,\n                onColorBinChange: function onColorBinChange(colorBin) {\n                  _this11.ignoreSelectionChange = true;\n\n                  _this11.viewer.deselect().then(function () {\n                    _this11.ignoreSelectionChange = false; //allow deselection to render\n\n                    requestAnimationFrame(function () {\n                      _this11.getColorContext = null;\n\n                      _this11.changeInsight({\n                        colorBin: colorBin\n                      });\n\n                      (0, _partialInsight.savePref)(_this11.prefs, _this11.state.chart, 'color', _this11.state.columns.color, {\n                        colorBin: colorBin\n                      });\n                    });\n                  });\n                },\n                onColorSchemeChange: function onColorSchemeChange(scheme) {\n                  _this11.changeColumnMapping('color', _this11.state.dataContent.columns.filter(function (c) {\n                    return c.name === _this11.state.columns.color;\n                  })[0], {\n                    scheme: scheme\n                  });\n\n                  (0, _partialInsight.savePref)(_this11.prefs, _this11.state.chart, 'color', _this11.state.columns.color, {\n                    scheme: scheme\n                  });\n                },\n                onColorBinCountChange: function onColorBinCountChange(value) {\n                  var signalValues = {};\n                  signalValues[_sanddanceReact.SandDance.constants.SignalNames.ColorBinCount] = value;\n                  (0, _partialInsight.savePref)(_this11.prefs, _this11.state.chart, 'color', _this11.state.columns.color, {\n                    signalValues: signalValues\n                  });\n                },\n                onColorReverseChange: function onColorReverseChange(value) {\n                  _this11.getColorContext = null;\n                  var signalValues = {};\n                  signalValues[_sanddanceReact.SandDance.constants.SignalNames.ColorReverse] = value;\n                },\n                directColor: _this11.state.directColor,\n                onDirectColorChange: function onDirectColorChange(directColor) {\n                  _this11.changeInsight({\n                    directColor: directColor,\n                    calculating: function calculating() {\n                      return _this11._resize();\n                    }\n                  });\n                }\n              }));\n            }\n\n          case _interfaces.SideTabId.Data:\n            {\n              var data = datas[_this11.state.dataScopeId];\n              var itemVisible = true;\n\n              switch (_this11.state.dataScopeId) {\n                case _dataScope.DataScopeId.AllData:\n                  {\n                    var item = _this11.state.selectedItemIndex[_this11.state.dataScopeId];\n                    itemVisible = _this11.state.dataContent && !_this11.state.filteredData || _this11.state.filteredData.indexOf(data[item]) >= 0;\n                  }\n              }\n\n              return React.createElement(_dataBrowser.DataBrowser, {\n                theme: _this11.props.theme,\n                themePalette: themePalette,\n                disabled: !loaded || _this11.state.sidebarClosed,\n                columns: _this11.state.dataContent && _this11.state.dataContent.columns,\n                data: data,\n                displayName: _this11.state.dataFile && _this11.state.dataFile.displayName || _language.strings.defaultFileName,\n                title: dataBrowserTitles[_this11.state.dataScopeId],\n                nullMessage: dataBrowserNullMessages[_this11.state.dataScopeId],\n                zeroMessage: dataBrowserZeroMessages[_this11.state.dataScopeId],\n                index: _this11.state.selectedItemIndex[_this11.state.dataScopeId],\n                itemVisible: itemVisible,\n                dataExportHandler: _this11.props.dataExportHandler,\n                selectedDataScope: _this11.state.dataScopeId,\n                onDataScopeClick: function onDataScopeClick(dataScopeId) {\n                  return _this11.setSideTabId(_interfaces.SideTabId.Data, dataScopeId);\n                },\n                onActivate: function onActivate(row, index) {\n                  var selectedItemIndex = Object.assign({}, _this11.state.selectedItemIndex);\n                  selectedItemIndex[_this11.state.dataScopeId] = index;\n\n                  _this11.setState({\n                    selectedItemIndex: selectedItemIndex\n                  });\n\n                  _this11.silentActivation(row);\n                },\n                onSearch: function onSearch(e, search) {\n                  if (e.ctrlKey) {\n                    _this11.setState({\n                      sideTabId: _interfaces.SideTabId.Search,\n                      search: search\n                    });\n                  } else {\n                    _this11.doSelect(search);\n                  }\n                },\n                bingSearchDisabled: _this11.props.bingSearchDisabled\n              });\n            }\n\n          case _interfaces.SideTabId.Search:\n            {\n              return React.createElement(_search.Search, {\n                collapseLabels: _this11.props.compactUI,\n                themePalette: themePalette,\n                disabled: !loaded || _this11.state.sidebarClosed,\n                disableGroupOR: _this11.props.searchORDisabled,\n                disableExpressionOR: _this11.props.searchORDisabled,\n                initializer: {\n                  columns: columnMapProps.allColumns,\n                  search: _this11.state.search\n                },\n                autoCompleteDistinctValues: _this11.state.autoCompleteDistinctValues,\n                onSelect: function onSelect(expr) {\n                  return _this11.doSelect(expr);\n                },\n                data: _this11.state.dataContent.data\n              });\n            }\n\n          case _interfaces.SideTabId.Snapshots:\n            {\n              return React.createElement(_snapshots.Snapshots, Object.assign({}, _this11.props.snapshotProps, {\n                editor: _this11.snapshotEditor,\n                themePalette: themePalette,\n                explorer: _this11,\n                snapshots: _this11.state.snapshots,\n                selectedSnapshotIndex: _this11.state.selectedSnapshotIndex,\n                onClearSnapshots: function onClearSnapshots() {\n                  return _this11.setState({\n                    snapshots: [],\n                    selectedSnapshotIndex: -1\n                  });\n                },\n                onWriteSnapshot: function onWriteSnapshot(s, i) {\n                  return _this11.writeSnapshot(s, i);\n                },\n                onRemoveSnapshot: function onRemoveSnapshot(i) {\n                  var snapshots = _toConsumableArray(_this11.state.snapshots);\n\n                  snapshots.splice(i, 1);\n                  var selectedSnapshotIndex = _this11.state.selectedSnapshotIndex;\n\n                  if (i === selectedSnapshotIndex) {\n                    selectedSnapshotIndex = -1;\n                  } else if (selectedSnapshotIndex > i) {\n                    selectedSnapshotIndex--;\n                  }\n\n                  _this11.setState({\n                    snapshots: snapshots,\n                    selectedSnapshotIndex: selectedSnapshotIndex\n                  });\n                },\n                onSnapshotClick: function onSnapshotClick(snapshot, selectedSnapshotIndex) {\n                  _this11.setState({\n                    selectedSnapshotIndex: selectedSnapshotIndex\n                  });\n\n                  _this11.calculate(function () {\n                    _this11.handleReviveSnapshot(snapshot, selectedSnapshotIndex);\n                  });\n                },\n                onMoveUp: function onMoveUp(i) {\n                  if (i > 0) {\n                    var snapshots = _toConsumableArray(_this11.state.snapshots);\n\n                    var temp = snapshots[i - 1];\n                    snapshots[i - 1] = snapshots[i];\n                    snapshots[i] = temp;\n                    var selectedSnapshotIndex = _this11.state.selectedSnapshotIndex;\n\n                    if (i === selectedSnapshotIndex) {\n                      selectedSnapshotIndex = i - 1;\n                    } else if (i - 1 === selectedSnapshotIndex) {\n                      selectedSnapshotIndex = i;\n                    }\n\n                    _this11.setState({\n                      snapshots: snapshots,\n                      selectedSnapshotIndex: selectedSnapshotIndex\n                    });\n                  }\n                },\n                onMoveDown: function onMoveDown(i) {\n                  if (i < _this11.state.snapshots.length - 1) {\n                    var snapshots = _toConsumableArray(_this11.state.snapshots);\n\n                    var temp = snapshots[i + 1];\n                    snapshots[i + 1] = snapshots[i];\n                    snapshots[i] = temp;\n                    var selectedSnapshotIndex = _this11.state.selectedSnapshotIndex;\n\n                    if (i === selectedSnapshotIndex) {\n                      selectedSnapshotIndex = i + 1;\n                    } else if (i + 1 === selectedSnapshotIndex) {\n                      selectedSnapshotIndex = i;\n                    }\n\n                    _this11.setState({\n                      snapshots: snapshots,\n                      selectedSnapshotIndex: selectedSnapshotIndex\n                    });\n                  }\n                }\n              }));\n            }\n\n          case _interfaces.SideTabId.Settings:\n            {\n              return React.createElement(_settings.Settings, {\n                explorer: _this11,\n                dataFile: _this11.state.dataFile,\n                scheme: _this11.state.scheme,\n                hideLegend: _this11.state.hideLegend,\n                onToggleLegend: function onToggleLegend(hideLegend) {\n                  return _this11.setState({\n                    hideLegend: hideLegend,\n                    calculating: function calculating() {\n                      return _this11._resize();\n                    }\n                  });\n                },\n                hideAxes: _this11.state.hideAxes,\n                onToggleAxes: function onToggleAxes(hideAxes) {\n                  return _this11.setState({\n                    calculating: function calculating() {\n                      return _this11.setState({\n                        hideAxes: hideAxes\n                      });\n                    }\n                  });\n                },\n                additionalSettings: _this11.props.additionalSettings\n              }, _this11.props.systemInfoChildren);\n            }\n        }\n      }()), loaded && React.createElement(\"div\", {\n        className: \"sanddance-view\"\n      }, React.createElement(_sanddanceReact.SandDanceReact, {\n        renderOptions: {\n          initialColorContext: this.getColorContext && this.getColorContext(this.viewer.insight, insight),\n          discardColorContextUpdates: function discardColorContextUpdates() {\n            return _this11.discardColorContextUpdates;\n          }\n        },\n        viewerOptions: this.viewerOptions,\n        ref: function ref(reactViewer) {\n          if (reactViewer) {\n            _this11.viewer = reactViewer.viewer;\n          }\n        },\n        onView: function onView(renderResult) {\n          _this11.changespecCapabilities(renderResult.specResult.errors ? renderResult.specResult.specCapabilities : _this11.viewer.specCapabilities);\n\n          _this11.getColorContext = function (oldInsight, newInsight) {\n            if (!oldInsight && !newInsight) {\n              return null;\n            }\n\n            if (!oldInsight || !newInsight) {\n              return null;\n            }\n\n            if (oldInsight.scheme !== newInsight.scheme) {\n              return null;\n            }\n\n            if (oldInsight.columns.color !== newInsight.columns.color) {\n              return null;\n            }\n\n            if (oldInsight.directColor != newInsight.directColor) {\n              return null;\n            }\n\n            return _this11.viewer.colorContexts && _this11.viewer.colorContexts[_this11.viewer.currentColorContext];\n          }; //don't allow tabbing to the canvas\n\n\n          (0, _canvas.removeTabIndex)(_this11.viewer);\n          _this11.props.onView && _this11.props.onView();\n        },\n        onError: function onError(e) {\n          _this11.props.onError && _this11.props.onError(e);\n        },\n        data: this.state.dataContent.data,\n        insight: insight,\n        onMount: function onMount(el) {\n          return _this11.viewerMounted(el);\n        }\n      }), this.state.note && React.createElement(\"div\", {\n        className: 'sanddance-note'\n      }, React.createElement(_iconButton.IconButton, {\n        className: 'cancel',\n        themePalette: themePalette,\n        title: _language.strings.buttonClose,\n        iconName: 'Cancel',\n        onClick: function onClick() {\n          return _this11.setState({\n            note: null\n          });\n        }\n      }), this.state.note)), React.createElement(_dialog.Dialog, {\n        title: _language.strings.labelError,\n        hidden: !this.state.errors,\n        onDismiss: function onDismiss() {\n          _this11.setState({\n            errors: null\n          });\n        }\n      }, this.state.errors && this.state.errors.map(function (error, i) {\n        return React.createElement(\"div\", {\n          key: i\n        }, error);\n      })), React.createElement(_snapshotEditor.SnapshotEditor, Object.assign({\n        ref: function ref(se) {\n          return _this11.snapshotEditor = se;\n        }\n      }, this.props.snapshotProps, {\n        explorer: this,\n        onWriteSnapshot: function onWriteSnapshot(s, i) {\n          return _this11.writeSnapshot(s, i);\n        },\n        themePalette: themePalette\n      }))), this.state.positionedColumnMapProps && React.createElement(_clickableTextLayer.PositionedColumnMap, Object.assign({}, this.state.positionedColumnMapProps)));\n    }\n  }, {\n    key: \"getColumnMapBaseProps\",\n    value: function getColumnMapBaseProps() {\n      var _this12 = this;\n\n      var allColumns = this.state.dataContent && this.state.dataContent.columns.filter(function (c) {\n        return !_sanddanceReact.SandDance.util.isInternalFieldName(c.name, true);\n      });\n      var quantitativeColumns = allColumns && allColumns.filter(function (c) {\n        return c.quantitative;\n      });\n      var categoricalColumns = allColumns && allColumns.filter(function (c) {\n        return !c.quantitative;\n      });\n      var props = {\n        changeColumnMapping: function changeColumnMapping(role, columnOrRole) {\n          var column;\n\n          if (typeof columnOrRole === 'string') {\n            //look up current insight\n            var columnName = _this12.state.columns[columnOrRole];\n            column = allColumns.filter(function (c) {\n              return c.name === columnName;\n            })[0];\n          } else {\n            column = columnOrRole;\n          }\n\n          _this12.changeColumnMapping(role, column);\n        },\n        allColumns: allColumns,\n        quantitativeColumns: quantitativeColumns,\n        categoricalColumns: categoricalColumns,\n        specCapabilities: this.state.specCapabilities,\n        explorer: this\n      };\n      return props;\n    }\n  }]);\n\n  return Explorer;\n}(React.Component);\n\nexports.Explorer = Explorer;\n\nfunction colorMapping(insight, columns) {\n  if (columns && insight.columns && insight.columns.color) {\n    return columns.filter(function (c) {\n      return c.name === insight.columns.color;\n    })[0];\n  }\n}\n},{\"react\":\"ccIB\",\"./colorMap\":\"E67y\",\"./base\":\"Vlbn\",\"./colorScheme\":\"L8O2\",\"./dialogs/chart\":\"NGSt\",\"./dialogs/color\":\"N8IJ\",\"./interfaces\":\"h2T5\",\"./partialInsight\":\"tb7d\",\"./dialogs/dataBrowser\":\"pJLc\",\"./controls/dataScope\":\"OsNT\",\"./defaults\":\"Tl9z\",\"./controls/dialog\":\"cFWm\",\"./columns\":\"f8v0\",\"./mouseEvent\":\"yvMl\",\"./controls/iconButton\":\"dQNc\",\"./dialogs/search\":\"ozxe\",\"./dataLoader\":\"f19h\",\"./clickableTextLayer\":\"UUG7\",\"@msrvida/chart-recommender\":\"i6UQ\",\"./canvas\":\"Dryx\",\"@msrvida/sanddance-react\":\"MjKu\",\"./dialogs/settings\":\"zKGJ\",\"./controls/sidebar\":\"f8Jx\",\"./dialogs/snapshotEditor\":\"dSzJ\",\"./dialogs/snapshots\":\"oc9r\",\"./language\":\"hk5u\",\"./themes\":\"CgE3\",\"./toggleSearch\":\"yzxM\",\"./controls/topbar\":\"Afi9\"}],\"Focm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar _exportNames = {\n  getEmbedHTML: true,\n  SideTabId: true,\n  use: true,\n  capabilities: true,\n  getColorSettingsFromThemePalette: true,\n  themePalettes: true,\n  SandDance: true,\n  util: true,\n  version: true\n};\nObject.defineProperty(exports, \"getEmbedHTML\", {\n  enumerable: true,\n  get: function () {\n    return _dataExporter.getEmbedHTML;\n  }\n});\nObject.defineProperty(exports, \"SideTabId\", {\n  enumerable: true,\n  get: function () {\n    return _interfaces.SideTabId;\n  }\n});\nObject.defineProperty(exports, \"use\", {\n  enumerable: true,\n  get: function () {\n    return _base.use;\n  }\n});\nObject.defineProperty(exports, \"capabilities\", {\n  enumerable: true,\n  get: function () {\n    return _canvas.capabilities;\n  }\n});\nObject.defineProperty(exports, \"getColorSettingsFromThemePalette\", {\n  enumerable: true,\n  get: function () {\n    return _themes.getColorSettingsFromThemePalette;\n  }\n});\nObject.defineProperty(exports, \"themePalettes\", {\n  enumerable: true,\n  get: function () {\n    return _themes.themePalettes;\n  }\n});\nObject.defineProperty(exports, \"SandDance\", {\n  enumerable: true,\n  get: function () {\n    return _sanddanceReact.SandDance;\n  }\n});\nObject.defineProperty(exports, \"util\", {\n  enumerable: true,\n  get: function () {\n    return _sanddanceReact.util;\n  }\n});\nObject.defineProperty(exports, \"version\", {\n  enumerable: true,\n  get: function () {\n    return _version.version;\n  }\n});\n\nvar _dataExporter = require(\"./controls/dataExporter\");\n\nvar _interfaces = require(\"./interfaces\");\n\nvar _base = require(\"./base\");\n\nvar _canvas = require(\"./canvas\");\n\nvar _themes = require(\"./themes\");\n\nvar _explorer = require(\"./explorer\");\n\nObject.keys(_explorer).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _explorer[key];\n    }\n  });\n});\n\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\n\nvar _version = require(\"./version\");\n},{\"./controls/dataExporter\":\"l7po\",\"./interfaces\":\"h2T5\",\"./base\":\"Vlbn\",\"./canvas\":\"Dryx\",\"./themes\":\"CgE3\",\"./explorer\":\"KeW6\",\"@msrvida/sanddance-react\":\"MjKu\",\"./version\":\"RvaL\"}]},{},[\"Focm\"], \"SandDanceExplorer\")"
  },
  {
    "path": "docs/dist/sanddance-explorer/v3/sanddance-explorer.css",
    "content": ".sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%;\n}\n\n.sanddance-gl {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%);\n}\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em;\n}\n\n.sanddance-legend table {\n  border-collapse: collapse;\n}\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em;\n}\n\n.sanddance-legend .legend-row {\n  cursor: pointer;\n}\n\n.sanddance-legend .legend-row td {\n  padding: 2px;\n}\n\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef;\n}\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px;\n}\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n.sanddance-details {\n  font-size: smaller;\n}\n\n.sanddance-details-scroll {\n  padding-bottom: 1em;\n}\n\n.sanddance-tooltip {\n  z-index: 1;\n}\n\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute;\n}\n\n.sanddance-tooltip td {\n  max-width: 16em;\n  overflow: hidden;\n  text-align: left;\n  text-overflow: ellipsis;\n  vertical-align: top;\n  width: 75%;\n}\n\n.sanddance-tooltip td:first-child {\n  width: 25%;\n}\n\n/*# sourceMappingURL=sanddance.css.map */\n/*# sourceMappingURL=sanddance-react.css.map */\n.sanddance-scheme.disabled {\n  filter: grayscale(95%);\n}\n.sanddance-scheme.option {\n  display: grid;\n  grid-template-columns: 10em auto;\n  width: 100%;\n}\n.sanddance-scheme.title {\n  justify-content: flex-start;\n}\n.sanddance-scheme span {\n  align-self: center;\n}\n.sanddance-scheme svg, .sanddance-scheme .swatch {\n  align-self: center;\n  border: thin solid #777;\n  height: 24px;\n}\n.sanddance-scheme svg {\n  width: 100%;\n}\n.sanddance-scheme .swatch div {\n  display: inline-block;\n  width: 10px;\n  height: 24px;\n}\n\n.sanddance-explorer-topbar {\n  background-color: #fff;\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: 300px auto;\n  height: 36px;\n}\n.sanddance-explorer-topbar .logo {\n  color: #0078d4;\n  display: grid;\n  grid-template-columns: 50px auto;\n  padding: 6px 0;\n}\n.sanddance-explorer-topbar .logo svg {\n  fill: #0078d4;\n  height: 24px;\n  margin: 0 auto;\n  width: 24px;\n}\n.sanddance-explorer-topbar .logo a {\n  color: inherit;\n  font-size: 14px;\n  font-weight: bold;\n  line-height: 24px;\n  text-decoration: none;\n}\n\n.sanddance-explorer-commandbar {\n  position: relative;\n}\n.sanddance-explorer-commandbar > div {\n  left: 0;\n  position: absolute;\n  right: 0;\n}\n.sanddance-explorer-commandbar .ms-CommandBar {\n  height: 36px;\n}\n\n.dark-theme .sanddance-explorer-topbar {\n  background-color: #000;\n}\n.dark-theme .sanddance-explorer-topbar .logo {\n  color: #00b4f0;\n}\n\n.sanddance-group {\n  border-top: 1px solid #ccc;\n  padding-bottom: 1.5em;\n  position: relative;\n}\n.sanddance-group .group-head {\n  display: grid;\n  grid-template-columns: auto auto;\n  line-height: 16px;\n  margin: 1em 0;\n}\n.sanddance-group .group-head label {\n  font-size: 11px;\n  font-weight: 600;\n  letter-spacing: 3px;\n  opacity: 0.8;\n  text-transform: uppercase;\n}\n.sanddance-group .group-head .count {\n  color: #333;\n  font-size: 12px;\n  text-align: right;\n}\n.sanddance-group .group-icon {\n  position: absolute;\n  top: -1px;\n  right: 0;\n}\n.sanddance-group:first-child {\n  border-top: none;\n}\n.sanddance-group:first-child .group-head {\n  margin-top: 0;\n}\n.sanddance-group:last-child {\n  padding-bottom: 0;\n}\n\n.sanddance-sidebar {\n  background-color: #f9f9f9;\n  display: grid;\n  overflow: hidden;\n  position: relative;\n  transition: width 350ms cubic-bezier(0.4, 0, 0.2, 1);\n  width: 300px;\n}\n.sanddance-sidebar:not(.pinned) {\n  bottom: 0;\n  position: absolute;\n  top: 0;\n}\n.sanddance-sidebar .sidebar-content {\n  background-color: inherit;\n  display: grid;\n  grid-template-areas: \"stats stats\" \"tabs bar\";\n  grid-template-columns: 50px auto;\n  grid-template-rows: 0fr auto;\n  height: 100%;\n  overflow: hidden;\n  position: absolute;\n  z-index: 1;\n}\n.sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.1);\n  display: grid;\n  grid-area: tabs;\n  grid-template-rows: auto 0fr;\n  position: relative;\n}\n.sanddance-sidebar .vbutton {\n  align-self: center;\n  display: grid;\n  height: 60px;\n}\n.sanddance-sidebar .vbutton.selected {\n  background-color: #f9f9f9;\n}\n.sanddance-sidebar .vbutton button {\n  height: 100%;\n  width: 100%;\n}\n.sanddance-sidebar .vbutton button .ms-Button-icon {\n  font-size: 24px;\n}\n.sanddance-sidebar .sidebar-dialogs .vbutton {\n  height: 16%;\n  max-height: 60px;\n  min-height: 32px;\n}\n.sanddance-sidebar .scrollable-container {\n  width: 250px;\n}\n.sanddance-sidebar .sidetab {\n  grid-area: bar;\n  padding: 12px;\n}\n.sanddance-sidebar.closed {\n  width: 50px;\n}\n.sanddance-sidebar.calculator .calculating {\n  background: rgba(249, 249, 249, 0.5);\n  height: 100%;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.sanddance-sidebar.calculator .ms-Spinner {\n  margin-top: -16px;\n  position: relative;\n  top: 50%;\n}\n\n.dark-theme .sanddance-sidebar {\n  background-color: #272727;\n  color: #fff;\n}\n.dark-theme .sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n.dark-theme .sanddance-sidebar .vbutton.selected {\n  background-color: #272727;\n}\n.dark-theme .sanddance-sidebar.calculator .calculating {\n  background: rgba(39, 39, 39, 0.5);\n}\n\n.sanddance-chart-type .ms-ChoiceFieldGroup-flexContainer {\n  display: grid;\n  grid-template-columns: repeat(2, 50%);\n  grid-auto-flow: column;\n  grid-template-rows: repeat(4, auto);\n}\n\n.sanddance-datascope {\n  grid-area: stats;\n  background-color: rgba(0, 0, 0, 0.05);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n  min-height: 5em;\n}\n.sanddance-datascope.extended > div {\n  margin: 12px;\n  width: 276px;\n}\n.sanddance-datascope label {\n  display: block;\n  font-size: 10px;\n  text-transform: uppercase;\n}\n.sanddance-datascope.compact {\n  align-self: center;\n  cursor: pointer;\n  display: grid;\n  text-align: center;\n  width: 50px;\n}\n.sanddance-datascope.compact > div {\n  align-self: center;\n}\n.sanddance-datascope .datascope-button {\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  box-sizing: border-box;\n  height: 36px;\n  min-width: unset;\n  width: 33.333%;\n}\n.sanddance-datascope .datascope-button:hover {\n  background-color: #0078d4;\n  color: #fff;\n}\n.sanddance-datascope .datascope-button label {\n  cursor: inherit;\n}\n.sanddance-datascope.active .datascope-button.selected {\n  border-color: #0078d4;\n}\n\n.dark-theme .sanddance-datascope {\n  background-color: rgba(0, 0, 0, 0.3);\n  border-bottom-color: rgba(255, 255, 255, 0.1);\n}\n.dark-theme .sanddance-datascope .datascope-button {\n  background-color: #000;\n  border-color: rgba(255, 255, 255, 0.2);\n  color: #fff;\n}\n.dark-theme .sanddance-datascope .datascope-button:hover {\n  background-color: #0078d4;\n  color: #fff;\n}\n\n.sanddance-dataItem {\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.sanddance-dataItem .name-value {\n  border-top: 1px solid #ddd;\n  cursor: pointer;\n  padding: 4px;\n  position: relative;\n  word-break: break-all;\n}\n.sanddance-dataItem .name-value:hover {\n  background-color: #0078d4;\n  color: #fff;\n}\n.sanddance-dataItem .name-value:first-child {\n  border-top: none;\n}\n.sanddance-dataItem .column-name {\n  font-weight: 500;\n}\n.sanddance-dataItem .column-value {\n  max-height: 20em;\n  overflow: auto;\n}\n.sanddance-dataItem .bing-search {\n  text-align: right;\n}\n\n.dark-theme .sanddance-dataItem {\n  background-color: #000;\n  border-color: #222;\n}\n.dark-theme .sanddance-dataItem .name-value {\n  border-top-color: #222;\n}\n.dark-theme .sanddance-dataItem a {\n  color: #00b4f0;\n}\n\n.sanddance-dataIndex .index {\n  display: grid;\n  grid-template-columns: 32px auto 32px;\n  line-height: 32px;\n  margin: 0px -8px 6px -8px;\n  text-align: center;\n}\n.sanddance-dataIndex .item-filtered {\n  background-color: rgba(0, 0, 0, 0.1);\n  font-size: 10px;\n  padding: 2px 4px;\n  text-transform: uppercase;\n}\n.sanddance-dataIndex .ms-Dropdown-container {\n  margin-bottom: 0.5em;\n}\n\n.scrollable-container {\n  display: grid;\n  min-height: 200px;\n  position: relative;\n}\n\n.scrollable {\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  right: 0;\n  overflow-y: auto;\n  top: 0;\n}\n\n.sanddance-search .sanddance-search-group {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n}\n.sanddance-search .sanddance-search-group {\n  background: #fff;\n  margin-top: 1em;\n  padding: 4px;\n}\n.sanddance-search .sanddance-search-group:first-child {\n  margin-top: 0;\n}\n.sanddance-search .sanddance-search-expression {\n  background-color: rgba(0, 0, 0, 0.1);\n  margin: 12px 4px;\n  padding: 4px 8px 8px 8px;\n}\n.sanddance-search .search-action {\n  width: 100%;\n}\n.sanddance-search .search-bottom-action {\n  margin-top: 1em;\n}\n.sanddance-search .search-field {\n  margin-top: 4px;\n}\n\n.dark-theme .sanddance-search .sanddance-search-group {\n  border-color: rgba(255, 255, 255, 0.2);\n  background: #000;\n}\n.dark-theme .sanddance-search .sanddance-search-expression {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-snapshots .ms-Button {\n  margin-bottom: 0.5em;\n}\n.sanddance-snapshots .snapshot {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  cursor: pointer;\n  margin-bottom: 0.5em;\n  padding: 5px;\n}\n.sanddance-snapshots .snapshot.selected {\n  border-color: rgba(0, 0, 0, 0.6);\n  border-width: 2px;\n  padding: 4px;\n}\n.sanddance-snapshots .snapshot:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.sanddance-snapshots .snapshot:first-child {\n  margin-top: 0.5em;\n}\n.sanddance-snapshots .title {\n  font-weight: 500;\n  word-break: break-word;\n}\n.sanddance-snapshots .description {\n  font-weight: 100;\n  word-break: break-word;\n}\n.sanddance-snapshots .thumbnail {\n  display: grid;\n  height: 160px;\n  margin-top: 0.5em;\n}\n.sanddance-snapshots img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n.sanddance-snapshots .actions {\n  display: grid;\n  grid-auto-flow: column;\n}\n.sanddance-snapshots .actions a, .sanddance-snapshots .actions span {\n  align-self: center;\n  text-align: center;\n}\n.sanddance-snapshots .actions button {\n  width: 100%;\n}\n\n.sanddance-snapshot-dialog .thumbnail {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  display: grid;\n  height: 300px;\n  margin-top: 1em;\n}\n.sanddance-snapshot-dialog img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n\n.dark-theme .sanddance-snapshots .snapshot {\n  background-color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.dark-theme .sanddance-snapshots .snapshot.selected {\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.dark-theme .sanddance-snapshots .snapshot:hover {\n  background-color: black;\n}\n.dark-theme .sanddance-snapshots .actions a {\n  color: #fff;\n}\n.dark-theme.sanddance-snapshot-dialog .thumbnail {\n  border-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-history ol {\n  padding-left: 20px;\n}\n.sanddance-history li {\n  border: 1px solid transparent;\n  cursor: pointer;\n}\n.sanddance-history li.selected {\n  font-weight: bold;\n}\n\n.sanddance-history-button {\n  background: none;\n  border: 0;\n  font-size: inherit;\n  font-style: inherit;\n  font-weight: inherit;\n  height: unset;\n  padding: 3px 4px;\n  text-align: left;\n  width: 100%;\n}\n.sanddance-history-button .ms-Button-label {\n  display: inline;\n  font-weight: inherit;\n  margin: 0;\n}\n\n.sanddance-note {\n  background-color: #fffacd;\n  border: 1px solid #333;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  color: #333;\n  margin: 1em;\n  padding: 20px;\n  position: absolute;\n  width: 15em;\n  word-break: break-word;\n}\n.sanddance-note .cancel {\n  position: absolute;\n  right: -1px;\n  top: -1px;\n}\n.sanddance-note .cancel i {\n  color: #333;\n}\n\n.sanddance-columnMap {\n  position: relative;\n}\n.sanddance-columnMap .ms-Dropdown-container {\n  margin-top: 10px;\n}\n.sanddance-columnMap .column-options {\n  bottom: 3px;\n  position: absolute;\n  right: 0;\n}\n\n.sanddance-columnMap-absolute {\n  margin-bottom: 1em;\n  margin-left: -4em;\n  margin-right: 1em;\n  margin-top: -1em;\n}\n.sanddance-columnMap-absolute .ms-Dropdown-container {\n  margin-top: 0;\n}\n\n.sanddance-tooltip {\n  z-index: 2;\n}\n\n.sanddance-tooltipMap {\n  margin-top: 10px;\n}\n\n.sanddance-dialog ul {\n  margin: 0;\n}\n.sanddance-dialog section {\n  margin-top: 1em;\n}\n.sanddance-dialog section:first-child {\n  margin-top: 0;\n}\n.sanddance-dialog .tip {\n  font-style: italic;\n}\n\n.sanddance-explorer {\n  display: grid;\n  font-family: \"Segoe UI\", sans-serif;\n  font-size: 13px;\n  grid-template-rows: 0fr auto;\n}\n.sanddance-explorer.dark-theme {\n  background-color: black;\n}\n.sanddance-explorer.dark-theme canvas {\n  background-color: black;\n}\n\n.sanddance-main {\n  display: grid;\n  position: relative;\n  transition: grid-template-columns 350ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.sanddance-main .loading {\n  grid-row-end: span 2;\n  position: relative;\n}\n.sanddance-main .loading .ms-Spinner {\n  position: absolute;\n  top: 50%;\n  width: 100%;\n}\n.sanddance-main .sanddance-view {\n  display: grid;\n  position: relative;\n  margin-left: 50px;\n}\n.sanddance-main .sanddance-layout-unpinned, .sanddance-main .sanddance-layout-pinned {\n  position: absolute;\n  top: 0;\n  left: 50px;\n  right: 150px;\n  bottom: 0;\n}\n.sanddance-main.hide-legend .sanddance-layout-unpinned, .sanddance-main.hide-legend .sanddance-layout-pinned {\n  right: 0;\n}\n.sanddance-main .sanddance-layout-pinned {\n  left: 300px;\n}\n.sanddance-main .sanddance-ReactViewer {\n  position: absolute;\n  top: 0;\n  left: -100px;\n  bottom: 0;\n  right: 0;\n}\n.sanddance-main.hide-legend .sanddance-ReactViewer {\n  left: 0;\n}\n.sanddance-main.show-center .sanddance-layout-unpinned, .sanddance-main.show-center .sanddance-layout-pinned {\n  background: linear-gradient(to right, transparent 49%, rgba(255, 0, 255, 0.2), transparent 51%);\n  background-color: rgba(0, 255, 255, 0.1);\n}\n.sanddance-main.pinned {\n  grid-template-columns: 300px auto;\n  grid-template-areas: \"side main\";\n}\n.sanddance-main.pinned .sanddance-view {\n  grid-area: main;\n  margin-left: 0;\n}\n.sanddance-main.pinned .loading {\n  grid-area: main;\n  grid-row-end: unset;\n}\n.sanddance-main.pinned .sanddance-slidePanel {\n  grid-area: side;\n}\n.sanddance-main.pinned.closed {\n  grid-template-columns: 0 auto;\n}\n.sanddance-main.pinned.closed .sanddance-view {\n  margin-left: 50px;\n}\n.sanddance-main span.ms-layer {\n  display: none;\n}\n\n#sanddance-vega-spec {\n  border: 1px inset;\n  max-height: 20em;\n  overflow: scroll;\n}\n\n.sanddance-panel {\n  top: 5em;\n  bottom: unset;\n  overflow-y: unset;\n  padding-right: 1em;\n  padding-top: 32px;\n}\n.sanddance-panel h4,\n.sanddance-panel .sanddance-vegaControls,\n.sanddance-panel .sanddance-unitControls {\n  display: none;\n}\n\n.sanddance-main.hide-legend .sanddance-panel {\n  display: none;\n}\n\n.sanddance-panel-tools {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n\n.sanddance-legend {\n  min-width: 54px;\n}\n\n.sanddance-explanation {\n  font-size: smaller;\n  font-style: italic;\n  margin-bottom: 1em;\n}\n.sanddance-explanation .fieldname,\n.sanddance-explanation .fieldtype {\n  font-style: italic;\n}\n\n.sanddance-signal {\n  margin-top: 1em;\n}\n\n.sanddance-legend th {\n  color: #005a9e;\n  cursor: pointer;\n}\n.sanddance-legend th:hover {\n  background-color: rgba(43, 136, 216, 0.3333333333);\n}\n.sanddance-legend .legend-row:hover {\n  background-color: #0078d4;\n  color: #fff;\n}\n\n.sanddance-dataExporter {\n  margin-top: 1em;\n}\n\n.sanddance-form-separate {\n  margin-top: 1em;\n}\n\n.dark-theme .sanddance-dialog a {\n  color: #00b4f0;\n}\n.dark-theme .sanddance-panel {\n  background-color: #000;\n  color: #fff;\n}\n.dark-theme .sanddance-legend th {\n  color: #3ac5f3;\n}\n.dark-theme .sanddance-legend th:hover {\n  color: #009ed3;\n}\n\n/*# sourceMappingURL=sanddance-explorer.css.map */\n"
  },
  {
    "path": "docs/dist/sanddance-explorer/v3/sanddance-explorer.js",
    "content": "(() => {\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\nfunction $parcel$exportWildcard(dest, source) {\n  Object.keys(source).forEach(function(key) {\n    if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\n      return;\n    }\n\n    Object.defineProperty(dest, key, {\n      enumerable: true,\n      get: function get() {\n        return source[key];\n      }\n    });\n  });\n\n  return dest;\n}\nfunction $parcel$defineInteropFlag(a) {\n  Object.defineProperty(a, '__esModule', {value: true, configurable: true});\n}\nvar $parcel$global =\ntypeof globalThis !== 'undefined'\n  ? globalThis\n  : typeof self !== 'undefined'\n  ? self\n  : typeof window !== 'undefined'\n  ? window\n  : typeof global !== 'undefined'\n  ? global\n  : {};\nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequiredb83\"];\nif (parcelRequire == null) {\n  parcelRequire = function(id) {\n    if (id in $parcel$modules) {\n      return $parcel$modules[id].exports;\n    }\n    if (id in $parcel$inits) {\n      var init = $parcel$inits[id];\n      delete $parcel$inits[id];\n      var module = {id: id, exports: {}};\n      $parcel$modules[id] = module;\n      init.call(module.exports, module, module.exports);\n      return module.exports;\n    }\n    var err = new Error(\"Cannot find module '\" + id + \"'\");\n    err.code = 'MODULE_NOT_FOUND';\n    throw err;\n  };\n\n  parcelRequire.register = function register(id, init) {\n    $parcel$inits[id] = init;\n  };\n\n  $parcel$global[\"parcelRequiredb83\"] = parcelRequire;\n}\nparcelRequire.register(\"jN9Lg\", function(module, exports) {\nmodule.exports = JSON.parse('[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rb\",\"rp\",\"rt\",\"rtc\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]');\n\n});\n\nparcelRequire.register(\"7UTS5\", function(module, exports) {\nmodule.exports = JSON.parse('[\"a\",\"altGlyph\",\"altGlyphDef\",\"altGlyphItem\",\"animate\",\"animateColor\",\"animateMotion\",\"animateTransform\",\"circle\",\"clipPath\",\"color-profile\",\"cursor\",\"defs\",\"desc\",\"ellipse\",\"feBlend\",\"feColorMatrix\",\"feComponentTransfer\",\"feComposite\",\"feConvolveMatrix\",\"feDiffuseLighting\",\"feDisplacementMap\",\"feDistantLight\",\"feFlood\",\"feFuncA\",\"feFuncB\",\"feFuncG\",\"feFuncR\",\"feGaussianBlur\",\"feImage\",\"feMerge\",\"feMergeNode\",\"feMorphology\",\"feOffset\",\"fePointLight\",\"feSpecularLighting\",\"feSpotLight\",\"feTile\",\"feTurbulence\",\"filter\",\"font\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignObject\",\"g\",\"glyph\",\"glyphRef\",\"hkern\",\"image\",\"line\",\"linearGradient\",\"marker\",\"mask\",\"metadata\",\"missing-glyph\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialGradient\",\"rect\",\"script\",\"set\",\"stop\",\"style\",\"svg\",\"switch\",\"symbol\",\"text\",\"textPath\",\"title\",\"tref\",\"tspan\",\"use\",\"view\",\"vkern\"]');\n\n});\n\nparcelRequire.register(\"b7nfv\", function(module, exports) {\n\"use strict\";\nObject.defineProperty(module.exports, \"__esModule\", {\n    value: true\n});\nmodule.exports.BarChartRecommender = module.exports.BarChartRecommenderSummary = void 0;\n\nvar $mKnoG = parcelRequire(\"mKnoG\");\nvar $818261f0bc10eb56$var$maxDistinctVal = 20;\nvar $818261f0bc10eb56$var$minDistinctVal = 2;\nvar $818261f0bc10eb56$var$BarChartRecommenderSummary = /** @class */ function() {\n    function BarChartRecommenderSummary1(columns, data) {\n        var score = -1;\n        for(var i = 0; i < columns.length; i++){\n            var recommendation = new $818261f0bc10eb56$var$BarChartRecommender(columns[i], data).recommend();\n            if (recommendation.score > score) {\n                this.best = recommendation;\n                score = recommendation.score;\n            }\n            if (score === 1) break;\n        }\n        for(var k = 0; k < columns.length; k++){\n            var column = columns[k];\n            if (column.name === this.best.columns.x || column.stats.isSequential) continue;\n            if (column.quantitative || column.stats.distinctValueCount < $mKnoG.maxCategoricalColors && column.stats.distinctValueCount > 1) {\n                this.best.columns.color = this.best.columns.sort = column.name;\n                this.best.scheme = $mKnoG.defaultColorScheme(column);\n                if (column.quantitative) this.best.colorBin = \"quantile\";\n                break;\n            }\n        }\n    }\n    BarChartRecommenderSummary1.prototype.recommend = function() {\n        return this.best;\n    };\n    return BarChartRecommenderSummary1;\n}();\nmodule.exports.BarChartRecommenderSummary = $818261f0bc10eb56$var$BarChartRecommenderSummary;\nvar $818261f0bc10eb56$var$BarChartRecommender = /** @class */ function() {\n    function BarChartRecommender1(column1, data) {\n        this.score = 0;\n        this.column = column1;\n        //the total score for bar chart is 1\n        this.rules = [\n            function(column) {\n                if (column.stats.isSequential) return false;\n                else if (column.quantitative) return true;\n                else if (!column.quantitative && column.stats.distinctValueCount <= $818261f0bc10eb56$var$maxDistinctVal && column.stats.distinctValueCount >= $818261f0bc10eb56$var$minDistinctVal) return true;\n                else return false;\n            }\n        ];\n        for(var i = 0; i < this.rules.length; i++)if (this.rules[i](column1)) this.score++;\n    }\n    BarChartRecommender1.prototype.recommend = function() {\n        var rec = {\n            chart: \"barchart\",\n            columns: {\n                x: this.column.name\n            },\n            score: this.score,\n            scheme: undefined,\n            view: \"2d\"\n        };\n        return rec;\n    };\n    return BarChartRecommender1;\n}();\nmodule.exports.BarChartRecommender = $818261f0bc10eb56$var$BarChartRecommender;\n\n});\nparcelRequire.register(\"mKnoG\", function(module, exports) {\n\"use strict\";\nObject.defineProperty(module.exports, \"__esModule\", {\n    value: true\n});\nmodule.exports.defaultColorScheme = module.exports.Recommender = module.exports.maxCategoricalColors = void 0;\nmodule.exports.maxCategoricalColors = 20;\nvar $04460791e43e84ac$var$Recommender = /** @class */ function() {\n    function Recommender1(columns, data) {}\n    return Recommender1;\n}();\nmodule.exports.Recommender = $04460791e43e84ac$var$Recommender;\nfunction $04460791e43e84ac$var$defaultColorScheme(c) {\n    if (c.quantitative) return \"redyellowgreen\";\n    else if (c.stats.distinctValueCount === 2) return \"dual_redgreen\";\n    else if (c.stats.distinctValueCount <= 10) return \"category10\";\n    return \"category20\";\n}\nmodule.exports.defaultColorScheme = $04460791e43e84ac$var$defaultColorScheme;\n\n});\n\n\nparcelRequire.register(\"a7afS\", function(module, exports) {\n\"use strict\";\nObject.defineProperty(module.exports, \"__esModule\", {\n    value: true\n});\nmodule.exports.isGeo = module.exports.isLatitude = module.exports.isLongitude = void 0;\n//TODO: languages other than english\nvar $75d28341ba4a9e0e$var$longitudeNames = [\n    \"lon\",\n    \"long\",\n    \"longitude\"\n];\nvar $75d28341ba4a9e0e$var$latitudeNames = [\n    \"lat\",\n    \"latitude\"\n];\nfunction $75d28341ba4a9e0e$var$isSpec(names, limits, column, data) {\n    var is = false;\n    var cname = column.name.toLowerCase();\n    for(var i = 0; i < names.length; i++)if (names[i] === cname) {\n        is = true;\n        break;\n    }\n    data;\n    return is;\n}\nfunction $75d28341ba4a9e0e$var$isLongitude(column, data) {\n    return $75d28341ba4a9e0e$var$isSpec($75d28341ba4a9e0e$var$longitudeNames, [\n        -180,\n        180\n    ], column, data);\n}\nmodule.exports.isLongitude = $75d28341ba4a9e0e$var$isLongitude;\nfunction $75d28341ba4a9e0e$var$isLatitude(column, data) {\n    return $75d28341ba4a9e0e$var$isSpec($75d28341ba4a9e0e$var$latitudeNames, [\n        -90,\n        90\n    ], column, data);\n}\nmodule.exports.isLatitude = $75d28341ba4a9e0e$var$isLatitude;\nfunction $75d28341ba4a9e0e$var$isGeo(column, data) {\n    return $75d28341ba4a9e0e$var$isLatitude(column, data) || $75d28341ba4a9e0e$var$isLongitude(column, data);\n}\nmodule.exports.isGeo = $75d28341ba4a9e0e$var$isGeo;\n\n});\n\nparcelRequire.register(\"6bWv0\", function(module, exports) {\n\"use strict\";\nObject.defineProperty(module.exports, \"__esModule\", {\n    value: true\n});\nmodule.exports.ScatterPlotRecommenderSummary = void 0;\n\nvar $mKnoG = parcelRequire(\"mKnoG\");\n\nvar $a7afS = parcelRequire(\"a7afS\");\nvar $482125d789b1323b$var$ScatterPlotRecommenderSummary = /** @class */ function() {\n    function ScatterPlotRecommenderSummary1(columns, data) {\n        var rec = {\n            chart: \"scatterplot\",\n            score: undefined,\n            columns: {},\n            scheme: undefined,\n            view: \"2d\"\n        };\n        columns.forEach(function(column) {\n            if (!rec.columns.x) {\n                if (column.name.toLowerCase() === \"x\") return rec.columns.x = column.name;\n                else if ($a7afS.isLongitude(column)) return rec.columns.x = column.name;\n            }\n            if (!rec.columns.y) {\n                if (column.name.toLowerCase() === \"y\") return rec.columns.y = column.name;\n                else if ($a7afS.isLatitude(column)) return rec.columns.y = column.name;\n            }\n            if (!rec.columns.color && !column.stats.isSequential) {\n                if (column.quantitative || column.stats.distinctValueCount < $mKnoG.maxCategoricalColors) {\n                    rec.columns.color = rec.columns.sort = column.name;\n                    rec.scheme = $mKnoG.defaultColorScheme(column);\n                    if (column.quantitative) rec.colorBin = \"quantile\";\n                    return;\n                }\n            }\n        });\n        if (rec.columns.x && rec.columns.y) this.best = rec;\n    }\n    ScatterPlotRecommenderSummary1.prototype.recommend = function() {\n        return this.best;\n    };\n    return ScatterPlotRecommenderSummary1;\n}();\nmodule.exports.ScatterPlotRecommenderSummary = $482125d789b1323b$var$ScatterPlotRecommenderSummary;\n\n});\n\nparcelRequire.register(\"217nY\", function(module, exports) {\n\"use strict\";\nObject.defineProperty(module.exports, \"__esModule\", {\n    value: true\n});\nmodule.exports.preferredColumnForTreemapSize = void 0;\n\nvar $a7afS = parcelRequire(\"a7afS\");\nfunction $178167658ad4c5ea$var$preferredColumnForTreemapSize(columns, strict) {\n    for(var i = 0; i < columns.length; i++){\n        var c = columns[i];\n        if (c.quantitative) {\n            if (strict && c.stats.hasNegative) continue;\n            if (strict && c.stats.isSequential) continue;\n            if (strict && $a7afS.isGeo(c)) continue;\n            return c;\n        }\n    }\n}\nmodule.exports.preferredColumnForTreemapSize = $178167658ad4c5ea$var$preferredColumnForTreemapSize;\n\n});\n\nparcelRequire.register(\"9kLwX\", function(module, exports) {\n\"use strict\";\nObject.defineProperty(module.exports, \"__esModule\", {\n    value: true\n});\nmodule.exports.RecommenderSummary = void 0;\n\nvar $b7nfv = parcelRequire(\"b7nfv\");\n\nvar $6bWv0 = parcelRequire(\"6bWv0\");\nvar $6cbad9e37f0db778$var$RecommenderSummary = /** @class */ function() {\n    function RecommenderSummary1(columns, data) {\n        var quickRec = new $6bWv0.ScatterPlotRecommenderSummary(columns, data).recommend();\n        if (quickRec) this.rec = quickRec;\n        else {\n            var barChartrec = new $b7nfv.BarChartRecommenderSummary(columns, data).recommend();\n            if (barChartrec && barChartrec.score >= 1) this.rec = barChartrec;\n            else this.rec = {\n                chart: \"grid\",\n                columns: {},\n                score: 1\n            };\n        }\n    }\n    RecommenderSummary1.prototype.recommend = function() {\n        return this.rec;\n    };\n    return RecommenderSummary1;\n}();\nmodule.exports.RecommenderSummary = $6cbad9e37f0db778$var$RecommenderSummary;\n\n});\n\nvar $87e8ab1064b645b0$exports = {};\n\n$parcel$export($87e8ab1064b645b0$exports, \"controls\", () => $b3059ab4f8ea4207$exports);\n$parcel$export($87e8ab1064b645b0$exports, \"getEmbedHTML\", () => $e98d3084b701f145$export$9f4b684ea6be1a90);\n$parcel$export($87e8ab1064b645b0$exports, \"SideTabId\", () => $a4811b1c86ed19fa$export$f3b7566ffe363e3b);\n$parcel$export($87e8ab1064b645b0$exports, \"use\", () => $8535c575077b9670$export$1f96ae73734a86cc);\n$parcel$export($87e8ab1064b645b0$exports, \"capabilities\", () => $29728562a99c68a2$export$8e76ac9f37578d1b);\n$parcel$export($87e8ab1064b645b0$exports, \"getColorSettingsFromThemePalette\", () => $b61671d8f61aadb4$export$93a255849c3bdb97);\n$parcel$export($87e8ab1064b645b0$exports, \"themePalettes\", () => $b61671d8f61aadb4$export$3465a0e7b289ab72);\n$parcel$export($87e8ab1064b645b0$exports, \"SandDance\", () => $3b509b9541e52a8f$exports);\n$parcel$export($87e8ab1064b645b0$exports, \"util\", () => $a1d9524814b1e23a$exports);\n$parcel$export($87e8ab1064b645b0$exports, \"version\", () => $f56a95f33c4cc847$export$83d89fbfd8236492);\nvar $b3059ab4f8ea4207$exports = {};\nvar $5453c8de1a3cb6b6$exports = {};\n\n$parcel$export($5453c8de1a3cb6b6$exports, \"Dialog\", () => $5453c8de1a3cb6b6$export$3ddf2d174ce01153);\n\n\n\nconst $01c4eef7f720da5f$export$8263e1ed1ef30f07 = 200;\nfunction $01c4eef7f720da5f$export$931cbfb6bfb85fc(props) {\n    const newProps = Object.assign({}, props);\n    let selectedKey = null;\n    if (newProps.options && newProps.options.length > 1) {\n        const selectedOptions = newProps.options.filter((option)=>option.selected);\n        if (selectedOptions && selectedOptions.length > 0) selectedKey = selectedOptions[0].key;\n    }\n    if (newProps.collapseLabel) newProps.onRenderTitle = (a, b)=>{\n        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"span\", null, newProps.label, \": \", a[0].text);\n    };\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Dropdown, Object.assign({\n        dropdownWidth: $01c4eef7f720da5f$export$8263e1ed1ef30f07\n    }, newProps, {\n        label: newProps.collapseLabel ? null : newProps.label,\n        selectedKey: selectedKey\n    }));\n}\n\n\nvar $3b509b9541e52a8f$exports = {};\n\n$parcel$export($3b509b9541e52a8f$exports, \"use\", () => $3b509b9541e52a8f$export$1f96ae73734a86cc);\n$parcel$export($3b509b9541e52a8f$exports, \"colorSchemes\", () => $c9f2c41a3f8ee485$export$2ad73d393c16f81c);\n$parcel$export($3b509b9541e52a8f$exports, \"constants\", () => $4d0539c68a8de77f$exports);\n$parcel$export($3b509b9541e52a8f$exports, \"searchExpression\", () => $c2919c2894b0628c$exports);\n$parcel$export($3b509b9541e52a8f$exports, \"specs\", () => $64958c10656c4cf5$exports);\n$parcel$export($3b509b9541e52a8f$exports, \"types\", () => $60e01fcba935f9e9$exports);\n$parcel$export($3b509b9541e52a8f$exports, \"util\", () => $944bef2715b44399$exports);\n$parcel$export($3b509b9541e52a8f$exports, \"VegaDeckGl\", () => $f80f7eb4951011b9$exports);\n$parcel$export($3b509b9541e52a8f$exports, \"Viewer\", () => $0000a41cc7b5918f$exports.Viewer);\n$parcel$export($3b509b9541e52a8f$exports, \"version\", () => $15874c145702a1a4$export$83d89fbfd8236492);\nvar $4d0539c68a8de77f$exports = {};\n\n$parcel$export($4d0539c68a8de77f$exports, \"GL_ORDINAL\", () => $4d0539c68a8de77f$export$5672246984822a29);\n$parcel$export($4d0539c68a8de77f$exports, \"ColorScaleNone\", () => $ec270fbe8d9983b4$export$c991c3dd58d9959c);\n$parcel$export($4d0539c68a8de77f$exports, \"FieldNames\", () => $ec270fbe8d9983b4$export$10df5429b7082be2);\n$parcel$export($4d0539c68a8de77f$exports, \"ScaleNames\", () => $ec270fbe8d9983b4$export$c9f17d36dfc40d76);\n$parcel$export($4d0539c68a8de77f$exports, \"SignalNames\", () => $ec270fbe8d9983b4$export$809e371dee643808);\nvar $64958c10656c4cf5$exports = {};\nvar $7e9d31f0ccd4826a$exports = {};\n\n$parcel$export($7e9d31f0ccd4826a$exports, \"build\", () => $7e9d31f0ccd4826a$export$3f8fe6489e95757d);\nvar $ec270fbe8d9983b4$exports = {};\n\n$parcel$export($ec270fbe8d9983b4$exports, \"FieldNames\", () => $ec270fbe8d9983b4$export$10df5429b7082be2);\n$parcel$export($ec270fbe8d9983b4$exports, \"ScaleNames\", () => $ec270fbe8d9983b4$export$c9f17d36dfc40d76);\n$parcel$export($ec270fbe8d9983b4$exports, \"SignalNames\", () => $ec270fbe8d9983b4$export$809e371dee643808);\n$parcel$export($ec270fbe8d9983b4$exports, \"Other\", () => $ec270fbe8d9983b4$export$8653a30c44b6e879);\n$parcel$export($ec270fbe8d9983b4$exports, \"ColorScaleNone\", () => $ec270fbe8d9983b4$export$c991c3dd58d9959c);\nconst $ec270fbe8d9983b4$export$10df5429b7082be2 = {\n    Active: \"__SandDance__Active\",\n    Collapsed: \"__SandDance__Collapsed\",\n    Contains: \"__SandDance__Contains\",\n    Count: \"__SandDance__Count\",\n    Sum: \"__SandDance__Sum\",\n    SumOfCount: \"__SandDance__CountSum\",\n    SumOfSum: \"__SandDance__SumSum\",\n    Selected: \"__SandDance__Selected\",\n    First: \"__SandDance__First\",\n    Last: \"__SandDance__Last\",\n    Top: \"__SandDance__Top\",\n    TopColor: \"__SandDance__TopColor\",\n    TopIndex: \"__SandDance__TopIndex\",\n    PowerBISelectionId: \"__SandDance__PowerBISelectionId\",\n    FacetSearch: \"__SandDance__FacetSearch\",\n    FacetTitle: \"__SandDance__FacetTitle\",\n    Ordinal: \"__SandDance__Ordinal\",\n    WrapCol: \"__SandDance__WrapCol\",\n    WrapRow: \"__SandDance__WrapRow\",\n    Value: \"__SandDance__Value\",\n    OffsetX: \"__SandDance__X\",\n    OffsetY: \"__SandDance__Y\",\n    OffsetHeight: \"__SandDance__H\",\n    OffsetWidth: \"__SandDance__W\"\n};\nconst $ec270fbe8d9983b4$export$c9f17d36dfc40d76 = {\n    Color: \"scale_color\",\n    X: \"scale_x\",\n    Y: \"scale_y\",\n    Z: \"scale_z\"\n};\nconst $ec270fbe8d9983b4$export$809e371dee643808 = {\n    ViewportWidth: \"ViewportWidth\",\n    ViewportHeight: \"ViewportHeight\",\n    MinCellWidth: \"MinCellWidth\",\n    MinCellHeight: \"MinCellHeight\",\n    PlotOffsetLeft: \"PlotOffsetLeft\",\n    PlotOffsetTop: \"PlotOffsetTop\",\n    PlotOffsetBottom: \"PlotOffsetBottom\",\n    PlotOffsetRight: \"PlotOffsetRight\",\n    PlotHeightIn: \"PlotHeightIn\",\n    PlotWidthIn: \"PlotWidthIn\",\n    PlotHeightOut: \"PlotHeightOut\",\n    PlotWidthOut: \"PlotWidthOut\",\n    ColorBinCount: \"RoleColor_BinCountSignal\",\n    ColorReverse: \"RoleColor_ReverseSignal\",\n    FacetBins: \"RoleFacet_BinsSignal\",\n    FacetVBins: \"RoleFacetV_BinsSignal\",\n    FacetPaddingTop: \"FacetPaddingTop\",\n    FacetPaddingBottom: \"FacetPaddingBottom\",\n    FacetPaddingLeft: \"FacetPaddingLeft\",\n    MarkOpacity: \"Mark_OpacitySignal\",\n    PointScale: \"Chart_PointScaleSignal\",\n    TextAngleX: \"Text_AngleXSignal\",\n    TextAngleY: \"Text_AngleYSignal\",\n    TextScale: \"Text_ScaleSignal\",\n    TextSize: \"Text_SizeSignal\",\n    TextTitleSize: \"Text_TitleSizeSignal\",\n    TreeMapMethod: \"Chart_TreeMapMethodSignal\",\n    XBins: \"RoleX_BinsSignal\",\n    YBins: \"RoleY_BinsSignal\",\n    ZHeight: \"RoleZ_HeightSignal\",\n    ZGrounded: \"RoleZ_Grounded\",\n    ZProportion: \"RoleZ_ProportionSignal\"\n};\nconst $ec270fbe8d9983b4$export$8653a30c44b6e879 = \"__Other\";\nconst $ec270fbe8d9983b4$export$c991c3dd58d9959c = \"none\";\n\n\nconst $17564e8cec2b9f75$export$4a9b1843df49fbce = 10;\nconst $17564e8cec2b9f75$export$15c9d32f115776f9 = 100;\nconst $17564e8cec2b9f75$export$929dfe98c4c4722c = 15;\nconst $17564e8cec2b9f75$export$7794a0aff56142de = 140;\nconst $17564e8cec2b9f75$export$7c432db1d0b63312 = 180;\nconst $17564e8cec2b9f75$export$6bd206e55cb747ae = 40;\nconst $17564e8cec2b9f75$export$c2b9f0002271e8ba = 40;\nconst $17564e8cec2b9f75$export$bdb7a7da14f9ff2b = 40;\nconst $17564e8cec2b9f75$export$c11851bee1b89f04 = 40;\nconst $17564e8cec2b9f75$export$2aa02e522549e01e = 100;\nconst $17564e8cec2b9f75$export$d3da25ad66816957 = 100;\nconst $17564e8cec2b9f75$export$2e7279af2df830e3 = 30;\nconst $17564e8cec2b9f75$export$f0388d9263db6e5f = 60;\nconst $17564e8cec2b9f75$export$fd4a597070549ada = 69;\nconst $17564e8cec2b9f75$export$a26a082bf9fa4ca0 = 92;\nconst $17564e8cec2b9f75$export$3f5b554d51e74365 = 120;\nconst $17564e8cec2b9f75$export$c33f11801bb18430 = 120;\nconst $17564e8cec2b9f75$export$e1f76e63dbed4a9a = 10;\nconst $17564e8cec2b9f75$export$c223d3ee3c0620d9 = 20;\n\n\nfunction $7fe4016d5da6d504$export$d3be63162ba033ae(specContext) {\n    switch(specContext.insight.totalStyle){\n        case \"sum-strip\":\n        case \"sum-strip-percent\":\n        case \"sum-treemap\":\n            return false;\n        default:\n            //if totalStyle is blank, count is assumed\n            return true;\n    }\n}\n\n\nfunction $9d0255b0e2eb5a6d$export$2e2bcd8739ae039(specContext) {\n    const { insight: insight , specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n    const { language: language  } = specViewOptions;\n    const bandProps = {\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: $17564e8cec2b9f75$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: $17564e8cec2b9f75$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $17564e8cec2b9f75$export$929dfe98c4c4722c),\n        showAxes: true\n    };\n    const x = {\n        title: null\n    };\n    const axisScales = {\n        x: x,\n        y: {\n            title: specColumns.y && specColumns.y.name\n        },\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: bandProps\n        }\n    ];\n    if (insight.totalStyle === \"sum-strip-percent\") {\n        x.aggregate = \"percent\";\n        x.title = language.percent;\n        const stripProps = {\n            addPercentageScale: true,\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z\n        };\n        layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n        });\n    } else {\n        const aggProps = {\n            niceScale: true,\n            dock: \"left\",\n            globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n            globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n            sumBy: specColumns.size,\n            showAxes: true\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props: aggProps\n        });\n        switch(insight.totalStyle){\n            case \"sum-treemap\":\n                {\n                    x.aggregate = \"sum\";\n                    x.title = language.sum;\n                    const treemapProps = {\n                        corner: \"top-left\",\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Treemap\",\n                        props: treemapProps\n                    });\n                    break;\n                }\n            case \"sum-strip\":\n                {\n                    x.aggregate = \"sum\";\n                    x.title = language.sum;\n                    const stripProps = {\n                        sortOrder: \"ascending\",\n                        orientation: \"horizontal\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            case \"count-strip\":\n                {\n                    x.aggregate = \"count\";\n                    x.title = language.count;\n                    const stripProps = {\n                        sortOrder: \"ascending\",\n                        orientation: \"horizontal\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            default:\n                {\n                    x.aggregate = \"count\";\n                    x.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: \"down-right\",\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal\n                    };\n                    layouts.push({\n                        layoutType: \"Square\",\n                        props: squareProps\n                    });\n                    break;\n                }\n        }\n    }\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).YBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, $7fe4016d5da6d504$export$d3be63162ba033ae),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n\n\n\nfunction $89432af83262137a$export$2e2bcd8739ae039(specContext) {\n    const { insight: insight , specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n    const { language: language  } = specViewOptions;\n    const bandProps = {\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: $17564e8cec2b9f75$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: $17564e8cec2b9f75$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $17564e8cec2b9f75$export$929dfe98c4c4722c),\n        showAxes: true\n    };\n    const y = {\n        title: null\n    };\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y: y,\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: bandProps\n        }\n    ];\n    if (insight.totalStyle === \"sum-strip-percent\") {\n        y.aggregate = \"percent\";\n        y.title = language.percent;\n        const stripProps = {\n            addPercentageScale: true,\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z\n        };\n        layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n        });\n    } else {\n        const aggProps = {\n            niceScale: true,\n            dock: \"bottom\",\n            globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n            globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n            sumBy: specColumns.size,\n            showAxes: true\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props: aggProps\n        });\n        switch(insight.totalStyle){\n            case \"sum-treemap\":\n                {\n                    y.aggregate = \"sum\";\n                    y.title = language.sum;\n                    const treemapProps = {\n                        corner: \"bottom-left\",\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Treemap\",\n                        props: treemapProps\n                    });\n                    break;\n                }\n            case \"sum-strip\":\n                {\n                    y.aggregate = \"sum\";\n                    y.title = language.sum;\n                    const stripProps = {\n                        sortOrder: \"descending\",\n                        orientation: \"vertical\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            case \"count-strip\":\n                {\n                    y.aggregate = \"count\";\n                    y.title = language.count;\n                    const stripProps = {\n                        sortOrder: \"descending\",\n                        orientation: \"vertical\",\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            default:\n                {\n                    y.aggregate = \"count\";\n                    y.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: \"right-up\",\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal\n                    };\n                    layouts.push({\n                        layoutType: \"Square\",\n                        props: squareProps\n                    });\n                    break;\n                }\n        }\n    }\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).XBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, $7fe4016d5da6d504$export$d3be63162ba033ae),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n\n\n\nfunction $e99549e32deab63c$export$2e2bcd8739ae039(specContext) {\n    const { insight: insight , specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y: {\n            title: specColumns.y && specColumns.y.name\n        },\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const hBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: $17564e8cec2b9f75$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: $17564e8cec2b9f75$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $17564e8cec2b9f75$export$929dfe98c4c4722c),\n        showAxes: true\n    };\n    const vBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: $17564e8cec2b9f75$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: $17564e8cec2b9f75$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $17564e8cec2b9f75$export$929dfe98c4c4722c),\n        showAxes: true\n    };\n    const aggProps = {\n        onBuild: null,\n        aggregation: null,\n        sumBy: specColumns.size\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: vBandProps\n        },\n        {\n            layoutType: \"Band\",\n            props: hBandProps\n        },\n        {\n            layoutType: \"AggregateSquare\",\n            props: aggProps\n        }\n    ];\n    switch(insight.totalStyle){\n        case \"sum-treemap\":\n            {\n                aggProps.aggregation = \"sum\";\n                const treemapProps = {\n                    corner: \"bottom-left\",\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: \"Treemap\",\n                    props: treemapProps\n                });\n                break;\n            }\n        case \"sum-strip\":\n            {\n                aggProps.aggregation = \"sum\";\n                const stripProps = {\n                    sortOrder: \"ascending\",\n                    orientation: \"vertical\",\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: \"Strip\",\n                    props: stripProps\n                });\n                break;\n            }\n        case \"count-strip\":\n            {\n                aggProps.aggregation = \"count\";\n                const stripProps = {\n                    sortOrder: \"ascending\",\n                    orientation: \"vertical\",\n                    sort: specColumns.sort,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: \"Strip\",\n                    props: stripProps\n                });\n                break;\n            }\n        default:\n            {\n                aggProps.aggregation = \"count\";\n                const squareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: \"right-down\",\n                    z: specColumns.z,\n                    maxGroupedUnits: null,\n                    maxGroupedFillSize: null\n                };\n                aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled)=>{\n                    squareProps.maxGroupedUnits = aggMaxExtent;\n                    squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n                };\n                layouts.push({\n                    layoutType: \"Square\",\n                    props: squareProps\n                });\n                break;\n            }\n    }\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).XBins\n                    ]\n                },\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).YBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, $7fe4016d5da6d504$export$d3be63162ba033ae),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n\nfunction $0e5537dc1b4c969f$export$2e2bcd8739ae039(specContext) {\n    const { specColumns: specColumns  } = specContext;\n    const squareProps = {\n        sortBy: specColumns.sort,\n        fillDirection: \"right-down\",\n        z: specColumns.z,\n        collapseYHeight: true\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    return {\n        axisScales: axisScales,\n        layouts: [\n            {\n                layoutType: \"Square\",\n                props: squareProps\n            }\n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n\nfunction $cabbea1bb44c3af8$export$2e2bcd8739ae039(specContext) {\n    const { specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n    const scatterProps = {\n        x: specColumns.x,\n        y: specColumns.y,\n        z: specColumns.z,\n        size: specColumns.size,\n        scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n        zGrounded: specViewOptions.language.zGrounded\n    };\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y: {\n            title: specColumns.y && specColumns.y.name\n        },\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    return {\n        axisScales: axisScales,\n        layouts: [\n            {\n                layoutType: \"Scatter\",\n                props: scatterProps\n            }\n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"x\",\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? \"range\" : \"exact\"\n                },\n                {\n                    role: \"y\",\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? \"range\" : \"exact\"\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    excludeCategoric: true,\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ],\n            signals: [\n                (0, $ec270fbe8d9983b4$export$809e371dee643808).PointScale,\n                (0, $ec270fbe8d9983b4$export$809e371dee643808).ZGrounded\n            ]\n        }\n    };\n}\n\n\n\n\nfunction $ad60c0d5f2be70b9$export$2e2bcd8739ae039(specContext) {\n    const { specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y: {\n            title: specColumns.y && specColumns.y.name\n        },\n        z: {\n            title: specViewOptions.language.count\n        }\n    };\n    const hBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: $17564e8cec2b9f75$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: $17564e8cec2b9f75$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $17564e8cec2b9f75$export$929dfe98c4c4722c),\n        showAxes: true\n    };\n    const vBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: $17564e8cec2b9f75$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: $17564e8cec2b9f75$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $17564e8cec2b9f75$export$929dfe98c4c4722c),\n        showAxes: true\n    };\n    const stackProps = {\n        sort: specColumns.sort\n    };\n    return {\n        axisScales: axisScales,\n        customZScale: true,\n        layouts: [\n            {\n                layoutType: \"Band\",\n                props: vBandProps\n            },\n            {\n                layoutType: \"Band\",\n                props: hBandProps\n            },\n            {\n                layoutType: \"Stack\",\n                props: stackProps\n            }\n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).XBins\n                    ]\n                },\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).YBins\n                    ]\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n\nfunction $484a23b50e74118e$export$2e2bcd8739ae039(specContext) {\n    const { specColumns: specColumns  } = specContext;\n    const stripProps = {\n        sortOrder: \"ascending\",\n        orientation: \"vertical\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: specColumns.size ? \"sum\" : \"count\"\n        };\n        const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n        const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n        const props = {\n            dock: \"top\",\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal: globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal: globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props: props\n        });\n    }\n    layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n    });\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"size\",\n                    allowNone: true,\n                    excludeCategoric: true\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n\nfunction $248901cc968463fe$export$2e2bcd8739ae039(specContext) {\n    const { specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n    const treemapProps = {\n        corner: \"top-left\",\n        group: specColumns.group,\n        size: specColumns.size,\n        treeMapMethod: specViewOptions.language.treeMapMethod,\n        z: specColumns.z\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: \"sum\"\n        };\n        const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n        const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n        const props = {\n            dock: \"top\",\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal: globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal: globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props: props\n        });\n    }\n    layouts.push({\n        layoutType: \"Treemap\",\n        props: treemapProps\n    });\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"size\",\n                    excludeCategoric: true\n                },\n                {\n                    role: \"group\",\n                    allowNone: true\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ],\n            signals: [\n                (0, $ec270fbe8d9983b4$export$809e371dee643808).TreeMapMethod\n            ]\n        }\n    };\n}\n\n\n\nfunction $dd293f8894d4c075$export$fb43a8c8f10fdc99(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n    let layoutPair;\n    const groupby = facetColumn;\n    const plotPadding = {\n        x: 0,\n        y: 0\n    };\n    let facetPadding;\n    switch(facetStyle){\n        case \"cross\":\n            {\n                const props = {\n                    axisTextColor: axisTextColor,\n                    colRowTitles: true,\n                    groupbyX: groupby,\n                    groupbyY: facetVColumn\n                };\n                layoutPair = {\n                    layoutType: \"Cross\",\n                    props: props\n                };\n                facetPadding = {\n                    bottom: (0, $17564e8cec2b9f75$export$bdb7a7da14f9ff2b),\n                    left: (0, $17564e8cec2b9f75$export$6bd206e55cb747ae),\n                    top: 0\n                };\n                plotPadding.y = (0, $17564e8cec2b9f75$export$c2b9f0002271e8ba);\n                plotPadding.x = (0, $17564e8cec2b9f75$export$c11851bee1b89f04);\n                break;\n            }\n        case \"wrap\":\n        default:\n            {\n                const props = {\n                    axisTextColor: axisTextColor,\n                    cellTitles: true,\n                    groupby: groupby\n                };\n                layoutPair = {\n                    layoutType: \"Wrap\",\n                    props: props\n                };\n                facetPadding = {\n                    bottom: (0, $17564e8cec2b9f75$export$bdb7a7da14f9ff2b),\n                    left: (0, $17564e8cec2b9f75$export$6bd206e55cb747ae),\n                    top: (0, $17564e8cec2b9f75$export$c2b9f0002271e8ba)\n                };\n                break;\n            }\n    }\n    const facetLayout = {\n        facetPadding: facetPadding,\n        plotPadding: plotPadding\n    };\n    return {\n        layoutPair: layoutPair,\n        facetLayout: facetLayout\n    };\n}\n\n\n\n\nconst $81fdb423dd3f4d9b$var$map = {\n    barchart: (0, $89432af83262137a$export$2e2bcd8739ae039),\n    barchartH: $9d0255b0e2eb5a6d$export$2e2bcd8739ae039,\n    barchartV: $89432af83262137a$export$2e2bcd8739ae039,\n    density: $e99549e32deab63c$export$2e2bcd8739ae039,\n    grid: $0e5537dc1b4c969f$export$2e2bcd8739ae039,\n    scatterplot: $cabbea1bb44c3af8$export$2e2bcd8739ae039,\n    stacks: $ad60c0d5f2be70b9$export$2e2bcd8739ae039,\n    strips: $484a23b50e74118e$export$2e2bcd8739ae039,\n    treemap: $248901cc968463fe$export$2e2bcd8739ae039\n};\nfunction $81fdb423dd3f4d9b$export$104083a36c1647a7(specContext) {\n    const { insight: insight , specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n    const fn = $81fdb423dd3f4d9b$var$map[insight.chart];\n    if (fn) {\n        const props = fn(specContext);\n        if (insight.columns.facet) {\n            const discreteFacetColumn = {\n                column: specColumns.facet,\n                defaultBins: $17564e8cec2b9f75$export$4a9b1843df49fbce,\n                maxbins: $17564e8cec2b9f75$export$15c9d32f115776f9,\n                maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                maxbinsSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetBins\n            };\n            const discreteFacetVColumn = {\n                column: specColumns.facetV,\n                defaultBins: $17564e8cec2b9f75$export$4a9b1843df49fbce,\n                maxbins: $17564e8cec2b9f75$export$15c9d32f115776f9,\n                maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                maxbinsSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetVBins\n            };\n            const { facetLayout: facetLayout , layoutPair: layoutPair  } = (0, $dd293f8894d4c075$export$fb43a8c8f10fdc99)(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n            props.layouts.unshift(layoutPair);\n            props.facetLayout = facetLayout;\n        }\n        return props;\n    }\n}\n\n\nvar $ae86bb470afa6626$exports = {};\n\n$parcel$export($ae86bb470afa6626$exports, \"getColumnsFromData\", () => $ae86bb470afa6626$export$3f19ad07848df794);\n$parcel$export($ae86bb470afa6626$exports, \"inferAll\", () => $ae86bb470afa6626$export$e04a97cc71178399);\n$parcel$export($ae86bb470afa6626$exports, \"getSpecColumns\", () => $ae86bb470afa6626$export$9e6128b2231f5173);\n$parcel$export($ae86bb470afa6626$exports, \"getStats\", () => $ae86bb470afa6626$export$432f698644f45d1);\nfunction $67aa9bbf7ac601ea$export$2e2bcd8739ae039(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n}\nfunction $67aa9bbf7ac601ea$export$8b58be045bf06082(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n\nfunction $fe67bfce8e40eaac$export$892596cec99bc70e() {}\nvar $fe67bfce8e40eaac$export$4adafc6ed0600c10 = 0.7;\nvar $fe67bfce8e40eaac$export$9eace2cc0d12c98d = 1 / $fe67bfce8e40eaac$export$4adafc6ed0600c10;\nvar $fe67bfce8e40eaac$var$reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", $fe67bfce8e40eaac$var$reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", $fe67bfce8e40eaac$var$reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", $fe67bfce8e40eaac$var$reHex = /^#([0-9a-f]{3,8})$/, $fe67bfce8e40eaac$var$reRgbInteger = new RegExp(\"^rgb\\\\(\" + [\n    $fe67bfce8e40eaac$var$reI,\n    $fe67bfce8e40eaac$var$reI,\n    $fe67bfce8e40eaac$var$reI\n] + \"\\\\)$\"), $fe67bfce8e40eaac$var$reRgbPercent = new RegExp(\"^rgb\\\\(\" + [\n    $fe67bfce8e40eaac$var$reP,\n    $fe67bfce8e40eaac$var$reP,\n    $fe67bfce8e40eaac$var$reP\n] + \"\\\\)$\"), $fe67bfce8e40eaac$var$reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [\n    $fe67bfce8e40eaac$var$reI,\n    $fe67bfce8e40eaac$var$reI,\n    $fe67bfce8e40eaac$var$reI,\n    $fe67bfce8e40eaac$var$reN\n] + \"\\\\)$\"), $fe67bfce8e40eaac$var$reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [\n    $fe67bfce8e40eaac$var$reP,\n    $fe67bfce8e40eaac$var$reP,\n    $fe67bfce8e40eaac$var$reP,\n    $fe67bfce8e40eaac$var$reN\n] + \"\\\\)$\"), $fe67bfce8e40eaac$var$reHslPercent = new RegExp(\"^hsl\\\\(\" + [\n    $fe67bfce8e40eaac$var$reN,\n    $fe67bfce8e40eaac$var$reP,\n    $fe67bfce8e40eaac$var$reP\n] + \"\\\\)$\"), $fe67bfce8e40eaac$var$reHslaPercent = new RegExp(\"^hsla\\\\(\" + [\n    $fe67bfce8e40eaac$var$reN,\n    $fe67bfce8e40eaac$var$reP,\n    $fe67bfce8e40eaac$var$reP,\n    $fe67bfce8e40eaac$var$reN\n] + \"\\\\)$\");\nvar $fe67bfce8e40eaac$var$named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, $67aa9bbf7ac601ea$export$2e2bcd8739ae039)($fe67bfce8e40eaac$export$892596cec99bc70e, $fe67bfce8e40eaac$export$2e2bcd8739ae039, {\n    copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable: function() {\n        return this.rgb().displayable();\n    },\n    hex: $fe67bfce8e40eaac$var$color_formatHex,\n    formatHex: $fe67bfce8e40eaac$var$color_formatHex,\n    formatHsl: $fe67bfce8e40eaac$var$color_formatHsl,\n    formatRgb: $fe67bfce8e40eaac$var$color_formatRgb,\n    toString: $fe67bfce8e40eaac$var$color_formatRgb\n});\nfunction $fe67bfce8e40eaac$var$color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction $fe67bfce8e40eaac$var$color_formatHsl() {\n    return $fe67bfce8e40eaac$export$8133dc3fa904d6d1(this).formatHsl();\n}\nfunction $fe67bfce8e40eaac$var$color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction $fe67bfce8e40eaac$export$2e2bcd8739ae039(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = $fe67bfce8e40eaac$var$reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? $fe67bfce8e40eaac$var$rgbn(m) // #ff0000\n     : l === 3 ? new $fe67bfce8e40eaac$export$5e05a94393ac29e3(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? $fe67bfce8e40eaac$var$rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? $fe67bfce8e40eaac$var$rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = $fe67bfce8e40eaac$var$reRgbInteger.exec(format)) ? new $fe67bfce8e40eaac$export$5e05a94393ac29e3(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = $fe67bfce8e40eaac$var$reRgbPercent.exec(format)) ? new $fe67bfce8e40eaac$export$5e05a94393ac29e3(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = $fe67bfce8e40eaac$var$reRgbaInteger.exec(format)) ? $fe67bfce8e40eaac$var$rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = $fe67bfce8e40eaac$var$reRgbaPercent.exec(format)) ? $fe67bfce8e40eaac$var$rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = $fe67bfce8e40eaac$var$reHslPercent.exec(format)) ? $fe67bfce8e40eaac$var$hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = $fe67bfce8e40eaac$var$reHslaPercent.exec(format)) ? $fe67bfce8e40eaac$var$hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : $fe67bfce8e40eaac$var$named.hasOwnProperty(format) ? $fe67bfce8e40eaac$var$rgbn($fe67bfce8e40eaac$var$named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new $fe67bfce8e40eaac$export$5e05a94393ac29e3(NaN, NaN, NaN, 0) : null;\n}\nfunction $fe67bfce8e40eaac$var$rgbn(n) {\n    return new $fe67bfce8e40eaac$export$5e05a94393ac29e3(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction $fe67bfce8e40eaac$var$rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new $fe67bfce8e40eaac$export$5e05a94393ac29e3(r, g, b, a);\n}\nfunction $fe67bfce8e40eaac$export$42da0a331c2802f5(o) {\n    if (!(o instanceof $fe67bfce8e40eaac$export$892596cec99bc70e)) o = $fe67bfce8e40eaac$export$2e2bcd8739ae039(o);\n    if (!o) return new $fe67bfce8e40eaac$export$5e05a94393ac29e3;\n    o = o.rgb();\n    return new $fe67bfce8e40eaac$export$5e05a94393ac29e3(o.r, o.g, o.b, o.opacity);\n}\nfunction $fe67bfce8e40eaac$export$8972dc0e6ad9238f(r, g, b, opacity) {\n    return arguments.length === 1 ? $fe67bfce8e40eaac$export$42da0a331c2802f5(r) : new $fe67bfce8e40eaac$export$5e05a94393ac29e3(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction $fe67bfce8e40eaac$export$5e05a94393ac29e3(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, $67aa9bbf7ac601ea$export$2e2bcd8739ae039)($fe67bfce8e40eaac$export$5e05a94393ac29e3, $fe67bfce8e40eaac$export$8972dc0e6ad9238f, (0, $67aa9bbf7ac601ea$export$8b58be045bf06082)($fe67bfce8e40eaac$export$892596cec99bc70e, {\n    brighter: function(k) {\n        k = k == null ? $fe67bfce8e40eaac$export$9eace2cc0d12c98d : Math.pow($fe67bfce8e40eaac$export$9eace2cc0d12c98d, k);\n        return new $fe67bfce8e40eaac$export$5e05a94393ac29e3(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? $fe67bfce8e40eaac$export$4adafc6ed0600c10 : Math.pow($fe67bfce8e40eaac$export$4adafc6ed0600c10, k);\n        return new $fe67bfce8e40eaac$export$5e05a94393ac29e3(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb: function() {\n        return this;\n    },\n    displayable: function() {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: $fe67bfce8e40eaac$var$rgb_formatHex,\n    formatHex: $fe67bfce8e40eaac$var$rgb_formatHex,\n    formatRgb: $fe67bfce8e40eaac$var$rgb_formatRgb,\n    toString: $fe67bfce8e40eaac$var$rgb_formatRgb\n}));\nfunction $fe67bfce8e40eaac$var$rgb_formatHex() {\n    return \"#\" + $fe67bfce8e40eaac$var$hex(this.r) + $fe67bfce8e40eaac$var$hex(this.g) + $fe67bfce8e40eaac$var$hex(this.b);\n}\nfunction $fe67bfce8e40eaac$var$rgb_formatRgb() {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction $fe67bfce8e40eaac$var$hex(value) {\n    value = Math.max(0, Math.min(255, Math.round(value) || 0));\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction $fe67bfce8e40eaac$var$hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new $fe67bfce8e40eaac$var$Hsl(h, s, l, a);\n}\nfunction $fe67bfce8e40eaac$export$8133dc3fa904d6d1(o) {\n    if (o instanceof $fe67bfce8e40eaac$var$Hsl) return new $fe67bfce8e40eaac$var$Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof $fe67bfce8e40eaac$export$892596cec99bc70e)) o = $fe67bfce8e40eaac$export$2e2bcd8739ae039(o);\n    if (!o) return new $fe67bfce8e40eaac$var$Hsl;\n    if (o instanceof $fe67bfce8e40eaac$var$Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new $fe67bfce8e40eaac$var$Hsl(h, s, l, o.opacity);\n}\nfunction $fe67bfce8e40eaac$export$8f4a7c0bb78e6ea8(h, s, l, opacity) {\n    return arguments.length === 1 ? $fe67bfce8e40eaac$export$8133dc3fa904d6d1(h) : new $fe67bfce8e40eaac$var$Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction $fe67bfce8e40eaac$var$Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, $67aa9bbf7ac601ea$export$2e2bcd8739ae039)($fe67bfce8e40eaac$var$Hsl, $fe67bfce8e40eaac$export$8f4a7c0bb78e6ea8, (0, $67aa9bbf7ac601ea$export$8b58be045bf06082)($fe67bfce8e40eaac$export$892596cec99bc70e, {\n    brighter: function(k) {\n        k = k == null ? $fe67bfce8e40eaac$export$9eace2cc0d12c98d : Math.pow($fe67bfce8e40eaac$export$9eace2cc0d12c98d, k);\n        return new $fe67bfce8e40eaac$var$Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? $fe67bfce8e40eaac$export$4adafc6ed0600c10 : Math.pow($fe67bfce8e40eaac$export$4adafc6ed0600c10, k);\n        return new $fe67bfce8e40eaac$var$Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new $fe67bfce8e40eaac$export$5e05a94393ac29e3($fe67bfce8e40eaac$var$hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), $fe67bfce8e40eaac$var$hsl2rgb(h, m1, m2), $fe67bfce8e40eaac$var$hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl: function() {\n        var a = this.opacity;\n        a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */ function $fe67bfce8e40eaac$var$hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n\n\nfunction $ae86bb470afa6626$var$isColor(cssColorSpecifier) {\n    return !!(0, $fe67bfce8e40eaac$export$2e2bcd8739ae039)(cssColorSpecifier);\n}\nfunction $ae86bb470afa6626$var$isQuantitative(column) {\n    return column.type === \"number\" || column.type === \"integer\";\n}\nfunction $ae86bb470afa6626$export$3f19ad07848df794(inferTypesFn, data, columnTypes) {\n    const sample = data[0];\n    const fields = sample ? Object.keys(sample) : [];\n    const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n    const columns = fields.map((name)=>{\n        const column = {\n            name: name,\n            type: inferences[name]\n        };\n        return column;\n    });\n    $ae86bb470afa6626$export$e04a97cc71178399(columns, data);\n    return columns;\n}\nfunction $ae86bb470afa6626$export$9e6128b2231f5173(insight, columns) {\n    function getColumnByName(name) {\n        return columns.filter((c)=>c.name === name)[0];\n    }\n    return {\n        color: getColumnByName(insight.columns && insight.columns.color),\n        facet: getColumnByName(insight.columns && insight.columns.facet),\n        facetV: getColumnByName(insight.columns && insight.columns.facetV),\n        group: getColumnByName(insight.columns && insight.columns.group),\n        size: getColumnByName(insight.columns && insight.columns.size),\n        sort: getColumnByName(insight.columns && insight.columns.sort),\n        uid: getColumnByName(insight.columns && insight.columns.uid),\n        x: getColumnByName(insight.columns && insight.columns.x),\n        y: getColumnByName(insight.columns && insight.columns.y),\n        z: getColumnByName(insight.columns && insight.columns.z)\n    };\n}\nfunction $ae86bb470afa6626$export$e04a97cc71178399(columns, data) {\n    columns.forEach((column)=>{\n        if (column) {\n            if (typeof column.quantitative !== \"boolean\") column.quantitative = $ae86bb470afa6626$var$isQuantitative(column);\n            if (!column.stats) column.stats = $ae86bb470afa6626$export$432f698644f45d1(data, column);\n            if (column.type === \"string\" && typeof column.isColorData !== \"boolean\") $ae86bb470afa6626$var$checkIsColorData(data, column);\n        }\n    });\n}\nfunction $ae86bb470afa6626$var$checkIsColorData(data, column) {\n    if (!column.stats.hasColorData) {\n        column.isColorData = false;\n        return;\n    }\n    for(let i = 0; i < data.length; i++)if (!$ae86bb470afa6626$var$isColor(data[i][column.name])) {\n        column.isColorData = false;\n        return;\n    }\n    column.isColorData = true;\n}\nfunction $ae86bb470afa6626$export$432f698644f45d1(data, column) {\n    const distinctMap = {};\n    const stats = {\n        distinctValueCount: null,\n        max: null,\n        mean: null,\n        min: null\n    };\n    let sum = 0;\n    for(let i = 0; i < data.length; i++){\n        let row = data[i];\n        let value = row[column.name];\n        distinctMap[value] = true;\n        if (stats.max === null || value > stats.max) stats.max = value;\n        if (stats.min === null || value < stats.min) stats.min = value;\n        let num = +value;\n        if (!isNaN(num)) sum += num;\n        if (column.type === \"string\" && !stats.hasColorData && $ae86bb470afa6626$var$isColor(value)) stats.hasColorData = true;\n    }\n    if (column.quantitative) {\n        stats.mean = data.length > 0 && sum / data.length;\n        stats.hasNegative = $ae86bb470afa6626$var$detectNegative(column, data);\n        if (column.type === \"integer\") stats.isSequential = $ae86bb470afa6626$var$detectSequentialColumn(column, data);\n    }\n    stats.distinctValueCount = Object.keys(distinctMap).length;\n    return stats;\n}\nfunction $ae86bb470afa6626$var$detectNegative(column, data) {\n    for(let i = 1; i < data.length; i++){\n        if (data[i][column.name] < 0) return true;\n    }\n    return false;\n}\nfunction $ae86bb470afa6626$var$detectSequentialColumn(column, data) {\n    if (data.length < 2) return false;\n    let colname = column.name;\n    for(let i = 1; i < data.length; i++){\n        if (data[i][colname] !== data[i - 1][colname] + 1) return false;\n    }\n    return true;\n}\n\n\n\n\nfunction $b15ad8fb3905384f$export$b18909608a999daa(scope, ...axis) {\n    if (!scope.axes) scope.axes = [];\n    scope.axes.push(...axis);\n}\nfunction $b15ad8fb3905384f$export$6853292f627997e4(scope, ...data) {\n    if (!scope.data) scope.data = [];\n    scope.data.push(...data);\n}\nfunction $b15ad8fb3905384f$export$3df320e901c23a48(scope, ...marks) {\n    if (!scope.marks) scope.marks = [];\n    scope.marks.push(...marks);\n}\nfunction $b15ad8fb3905384f$export$290268902279a991(scope, ...scale) {\n    if (!scope.scales) scope.scales = [];\n    scope.scales.push(...scale.filter(Boolean));\n}\nfunction $b15ad8fb3905384f$export$5346a0d8a9111b3f(scope, ...signal) {\n    if (!scope.signals) scope.signals = [];\n    scope.signals.push(...signal);\n}\nfunction $b15ad8fb3905384f$export$eea5d31e98930019(data, ...transforms) {\n    if (!data.transform) data.transform = [];\n    data.transform.push(...transforms);\n}\nfunction $b15ad8fb3905384f$export$ef4373c7e62b2278(data, dataName) {\n    for(let i = 0; i < data.length; i++){\n        if (data[i].name === dataName) return {\n            data: data[i],\n            index: i\n        };\n    }\n}\nfunction $b15ad8fb3905384f$export$53a21aeef48e14a8(groupings) {\n    const groupby = groupings.map((g)=>g.groupby);\n    return groupby.reduce((acc, val)=>acc.concat(val), []);\n}\nfunction $b15ad8fb3905384f$export$e6b6683aec0fe907(...offsets) {\n    return offsets.filter(Boolean).join(\" + \");\n}\n\n\nfunction $4414e2f92de0ee30$export$3678bfcfeaea7c36(props1) {\n    const { axesOffsets: axesOffsets , axisScales: axisScales , axesScopes: axesScopes , axesTitlePadding: axesTitlePadding , allGlobalScales: allGlobalScales , globalScope: globalScope , labelBaseline: labelBaseline , plotOffsetSignals: plotOffsetSignals , specColumns: specColumns , specViewOptions: specViewOptions  } = props1;\n    const { scope: scope  } = globalScope;\n    allGlobalScales.forEach((globalScales)=>{\n        const { scales: scales  } = globalScales;\n        for(let xyz in scales){\n            let _scales = scales[xyz];\n            if (_scales) {\n                (0, $b15ad8fb3905384f$export$290268902279a991)(scope, ..._scales);\n                let { showAxes: showAxes  } = globalScales;\n                let zindex = undefined;\n                if (xyz === \"z\") {\n                    showAxes = false;\n                    if (props1.view === \"3d\" && specViewOptions.zAxisOptions && !props1.faceted) {\n                        if (specViewOptions.zAxisOptions.showZAxis) {\n                            showAxes = true;\n                            zindex = specViewOptions.zAxisOptions.zIndex;\n                        }\n                    }\n                }\n                if (showAxes && axisScales) {\n                    let axisScale = axisScales[xyz];\n                    if (axisScale) {\n                        const lineColor = specViewOptions.colors.axisLine;\n                        const horizontal = xyz === \"x\";\n                        const column = specColumns[xyz] || {\n                            quantitative: true\n                        };\n                        const title = axisScale.title;\n                        const props = {\n                            title: title,\n                            horizontal: horizontal,\n                            column: column,\n                            specViewOptions: specViewOptions,\n                            lineColor: lineColor,\n                            titlePadding: axesTitlePadding[xyz],\n                            labelBaseline: labelBaseline[xyz],\n                            zindex: zindex\n                        };\n                        axesScopes[\"main\"].forEach((a)=>(0, $b15ad8fb3905384f$export$b18909608a999daa)(a.scope, $4414e2f92de0ee30$var$createAxis(Object.assign(Object.assign({}, props), {\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines\n                            }))));\n                        if (axesScopes[xyz]) axesScopes[xyz].forEach((a)=>(0, $b15ad8fb3905384f$export$b18909608a999daa)(a.scope, $4414e2f92de0ee30$var$createAxis(Object.assign(Object.assign({}, props), {\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines\n                            }))));\n                        if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                            const plotOffsetSignal = plotOffsetSignals[xyz];\n                            plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                        }\n                    }\n                }\n            }\n        }\n    });\n}\nfunction $4414e2f92de0ee30$var$createAxis(props) {\n    const { column: column , horizontal: horizontal , labelBaseline: labelBaseline , lineColor: lineColor , scale: scale , showLabels: showLabels , showTitle: showTitle , showLines: showLines , specViewOptions: specViewOptions , title: title , titlePadding: titlePadding , zindex: zindex  } = props;\n    const axis = Object.assign(Object.assign(Object.assign(Object.assign({\n        zindex: zindex,\n        scale: scale.name,\n        orient: horizontal ? \"bottom\" : \"left\",\n        domain: showLines,\n        ticks: showLines\n    }, showLines && {\n        domainColor: lineColor,\n        tickColor: lineColor,\n        tickSize: specViewOptions.tickSize\n    }), showTitle && {\n        title: title,\n        titleAlign: horizontal ? \"left\" : \"right\",\n        titleAngle: {\n            signal: horizontal ? (0, $ec270fbe8d9983b4$export$809e371dee643808).TextAngleX : (0, $ec270fbe8d9983b4$export$809e371dee643808).TextAngleY\n        },\n        titleColor: specViewOptions.colors.axisText,\n        titleFontSize: {\n            signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextTitleSize\n        },\n        titleLimit: (0, $17564e8cec2b9f75$export$d3da25ad66816957),\n        titlePadding: titlePadding\n    }), {\n        labels: showLabels\n    }), showLabels && {\n        labelAlign: horizontal ? \"left\" : \"right\",\n        labelBaseline: labelBaseline,\n        labelAngle: {\n            signal: horizontal ? (0, $ec270fbe8d9983b4$export$809e371dee643808).TextAngleX : (0, $ec270fbe8d9983b4$export$809e371dee643808).TextAngleY\n        },\n        labelColor: specViewOptions.colors.axisText,\n        labelFontSize: {\n            signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextSize\n        },\n        labelLimit: (0, $17564e8cec2b9f75$export$2aa02e522549e01e)\n    });\n    if (column.quantitative) axis.format = \"~r\";\n    return axis;\n}\n\n\n\n\nfunction $ac5b955a06ced550$export$fb70365b00e8cb7b(field) {\n    return field.replace(\".\", \"\\\\.\").replace(\"[\", \"\\\\[\").replace(\"]\", \"\\\\]\");\n}\nfunction $ac5b955a06ced550$export$74df930fa4adaae4(field) {\n    //remove whitespace, period, accessors and logical modifiers\n    return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, \"\");\n}\n\n\nfunction $c0bec0cf2b65a746$export$fefe9507ec0904ed(scaleName, data, field, range, reverse, zero) {\n    const scale = {\n        name: scaleName,\n        type: \"linear\",\n        range: range,\n        round: true,\n        reverse: reverse,\n        domain: {\n            data: data,\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(field)\n        },\n        zero: zero,\n        nice: true\n    };\n    return scale;\n}\nfunction $c0bec0cf2b65a746$export$b67158f831e00d0d(scaleName, data, range, field, reverse) {\n    const scale = {\n        name: scaleName,\n        type: \"point\",\n        range: range,\n        domain: {\n            data: data,\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(field),\n            sort: true\n        },\n        padding: 0.5\n    };\n    if (reverse !== undefined) scale.reverse = reverse;\n    return scale;\n}\nfunction $c0bec0cf2b65a746$export$530110e7506d659d(scaleName, colorBin, data, field, scheme) {\n    scheme = scheme || (0, $ec270fbe8d9983b4$export$c991c3dd58d9959c);\n    const domain = {\n        data: data,\n        field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(field)\n    };\n    const range = {\n        scheme: scheme\n    };\n    const reverse = {\n        signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).ColorReverse\n    };\n    if (colorBin !== \"continuous\") range.count = {\n        signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).ColorBinCount\n    };\n    switch(colorBin){\n        case \"continuous\":\n            {\n                const sequentialScale = {\n                    name: scaleName,\n                    type: \"linear\",\n                    domain: domain,\n                    range: range,\n                    reverse: reverse\n                };\n                return sequentialScale;\n            }\n        case \"quantile\":\n            {\n                const quantileScale = {\n                    name: scaleName,\n                    type: \"quantile\",\n                    domain: domain,\n                    range: range,\n                    reverse: reverse\n                };\n                return quantileScale;\n            }\n        default:\n            {\n                const quantizeScale = {\n                    name: scaleName,\n                    type: \"quantize\",\n                    domain: domain,\n                    range: range,\n                    reverse: reverse\n                };\n                return quantizeScale;\n            }\n    }\n}\n\n\n\nconst $7b42c6682d6a3c62$export$7bc9b23ce3036e78 = 0.6;\nfunction $7b42c6682d6a3c62$export$d9407ec206a3236c(context, heightSignal) {\n    const { specViewOptions: specViewOptions  } = context;\n    const signals = [\n        {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).ZProportion,\n            value: $7b42c6682d6a3c62$export$7bc9b23ce3036e78,\n            bind: {\n                name: specViewOptions.language.zScaleProportion,\n                debounce: 50,\n                input: \"range\",\n                min: 0.2,\n                max: 2,\n                step: 0.1\n            }\n        },\n        {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).ZHeight,\n            update: `${heightSignal} * ${(0, $ec270fbe8d9983b4$export$809e371dee643808).ZProportion}`\n        },\n        {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextScale,\n            value: 1.2,\n            bind: {\n                name: specViewOptions.language.textScaleSignal,\n                debounce: 50,\n                input: \"range\",\n                min: 0.5,\n                max: 2,\n                step: 0.1\n            }\n        },\n        {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextSize,\n            update: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).TextScale} * 10`\n        },\n        {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextTitleSize,\n            update: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).TextScale} * 15`\n        },\n        {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextAngleX,\n            value: 30,\n            bind: {\n                name: specViewOptions.language.xAxisTextAngleSignal,\n                debounce: 50,\n                input: \"range\",\n                min: 0,\n                max: 90,\n                step: 1\n            }\n        },\n        {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextAngleY,\n            value: 0,\n            bind: {\n                name: specViewOptions.language.yAxisTextAngleSignal,\n                debounce: 50,\n                input: \"range\",\n                min: -90,\n                max: 0,\n                step: 1\n            }\n        },\n        {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).MarkOpacity,\n            value: 1,\n            bind: {\n                name: specViewOptions.language.markOpacitySignal,\n                debounce: 50,\n                input: \"range\",\n                min: 0.1,\n                max: 1,\n                step: 0.05\n            }\n        }\n    ];\n    return signals;\n}\nfunction $7b42c6682d6a3c62$export$641fa4f0ca86c2ad(context) {\n    const { specViewOptions: specViewOptions  } = context;\n    const signal = {\n        name: (0, $ec270fbe8d9983b4$export$809e371dee643808).ColorBinCount,\n        value: 7,\n        bind: {\n            name: specViewOptions.language.colorBinCount,\n            input: \"range\",\n            min: 1,\n            max: specViewOptions.maxLegends + 1,\n            step: 1\n        }\n    };\n    return signal;\n}\nfunction $7b42c6682d6a3c62$export$526461dda4c87775(context) {\n    const { specViewOptions: specViewOptions  } = context;\n    const signal = {\n        name: (0, $ec270fbe8d9983b4$export$809e371dee643808).ColorReverse,\n        value: false,\n        bind: {\n            name: specViewOptions.language.colorReverse,\n            input: \"checkbox\"\n        }\n    };\n    return signal;\n}\nfunction $7b42c6682d6a3c62$export$cdc9366ba30317bd(s, fn, update) {\n    s.update = `${fn}((${s.update}), (${update}))`;\n}\n\n\n\nfunction $5cda356d1efb9fa8$var$legend(column, fill) {\n    const legend1 = {\n        orient: \"none\",\n        title: column.name,\n        fill: fill,\n        encode: {\n            symbols: {\n                update: {\n                    shape: {\n                        value: \"square\"\n                    }\n                }\n            }\n        }\n    };\n    if (column.quantitative) {\n        legend1.type = \"symbol\";\n        legend1.format = \"~r\";\n    }\n    return legend1;\n}\nfunction $5cda356d1efb9fa8$export$765837a81fadca85(context, fill) {\n    const { specColumns: specColumns , insight: insight  } = context;\n    if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) return [\n        $5cda356d1efb9fa8$var$legend(specColumns.color, fill)\n    ];\n}\n\n\n\n\nfunction $e92379a4118b5981$export$a4725aa19e8564dd(column, count, source, legend, lookupName, fieldName, indexName) {\n    const data = [\n        {\n            name: lookupName,\n            source: source,\n            transform: [\n                {\n                    type: \"aggregate\",\n                    groupby: [\n                        (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(column.name)\n                    ]\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"count\"\n                    ],\n                    as: [\n                        indexName\n                    ]\n                },\n                {\n                    type: \"filter\",\n                    expr: `datum[${JSON.stringify(indexName)}] <= ${count}`\n                }\n            ]\n        },\n        {\n            name: legend,\n            source: source,\n            transform: [\n                {\n                    type: \"lookup\",\n                    from: lookupName,\n                    key: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(column.name),\n                    fields: [\n                        column.name\n                    ].map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n                    values: [\n                        column.name\n                    ].map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n                    as: [\n                        fieldName\n                    ]\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum[${JSON.stringify(fieldName)}] == null ? '${(0, $ec270fbe8d9983b4$export$8653a30c44b6e879)}' : datum[${JSON.stringify(fieldName)}]`,\n                    as: fieldName\n                }\n            ]\n        }\n    ];\n    return data;\n}\n\n\nfunction $af92c5b6b1f801f6$export$4c4d9288a45f1fb3(props) {\n    const { colorReverseSignalName: colorReverseSignalName , dataName: dataName , scope: scope , legendDataName: legendDataName , scaleName: scaleName , specContext: specContext , topLookupName: topLookupName  } = props;\n    let colorDataName = dataName;\n    const { insight: insight , specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n    const legends = (0, $5cda356d1efb9fa8$export$765837a81fadca85)(specContext, scaleName);\n    if (legends) scope.legends = legends;\n    const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n    if (categoricalColor) {\n        (0, $b15ad8fb3905384f$export$6853292f627997e4)(scope, ...(0, $e92379a4118b5981$export$a4725aa19e8564dd)(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, (0, $ec270fbe8d9983b4$export$10df5429b7082be2).TopColor, (0, $ec270fbe8d9983b4$export$10df5429b7082be2).TopIndex));\n        colorDataName = legendDataName;\n    }\n    if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n        if (specColumns.color.quantitative) (0, $b15ad8fb3905384f$export$290268902279a991)(scope, (0, $c0bec0cf2b65a746$export$530110e7506d659d)(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n        else (0, $b15ad8fb3905384f$export$290268902279a991)(scope, {\n            name: scaleName,\n            type: \"ordinal\",\n            domain: {\n                data: colorDataName,\n                field: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).TopColor,\n                sort: true\n            },\n            range: {\n                scheme: insight.scheme || (0, $ec270fbe8d9983b4$export$c991c3dd58d9959c)\n            },\n            reverse: {\n                signal: colorReverseSignalName\n            }\n        });\n    }\n    (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(scope, (0, $7b42c6682d6a3c62$export$641fa4f0ca86c2ad)(specContext), (0, $7b42c6682d6a3c62$export$526461dda4c87775)(specContext));\n    return {\n        topColorField: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).TopColor,\n        colorDataName: colorDataName\n    };\n}\n\n\n\n\n\n\n\nfunction $af332f9d870ab775$export$4fec84497b9e6e3f(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n    const titleSignal = `parent[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetTitle)}]`;\n    const index = `datum[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).Ordinal)}] - 1`;\n    const col = $af332f9d870ab775$export$4f57a5f5fbf1456e(colTitleSource.dataName, sizeSignals, index);\n    const row = $af332f9d870ab775$export$d0cc3dc227001793(rowTitleSource.dataName, sizeSignals, index);\n    (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope, col.header, row.footer);\n    (0, $b15ad8fb3905384f$export$3df320e901c23a48)(col.header, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"center\"\n                },\n                baseline: {\n                    value: \"middle\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch)}]}`\n                },\n                x: {\n                    signal: `${sizeSignals.layoutWidth} / 2`\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth\n                },\n                fontSize: {\n                    signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextSize\n                },\n                text: {\n                    signal: titleSignal\n                }\n            }\n        }\n    });\n    (0, $b15ad8fb3905384f$export$3df320e901c23a48)(row.footer, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"left\"\n                },\n                baseline: {\n                    value: \"middle\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch)}]}`\n                },\n                y: {\n                    signal: `${sizeSignals.layoutHeight} / 2`\n                },\n                limit: {\n                    signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetRight\n                },\n                fontSize: {\n                    signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextSize\n                },\n                text: {\n                    signal: titleSignal\n                }\n            }\n        }\n    });\n}\nfunction $af332f9d870ab775$export$3735b1dd76112836(scope, sizeSignals, axisTextColor) {\n    (0, $b15ad8fb3905384f$export$3df320e901c23a48)(scope, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"center\"\n                },\n                baseline: {\n                    value: \"bottom\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch)}]}`\n                },\n                x: {\n                    signal: `(${sizeSignals.layoutWidth}) / 2`\n                },\n                text: {\n                    signal: `parent[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetTitle)}]`\n                },\n                fontSize: {\n                    signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).TextSize\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth\n                },\n                y: {\n                    signal: `-${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop} / 2`\n                }\n            }\n        }\n    });\n}\nfunction $af332f9d870ab775$export$9f0b19d6fd936707(props) {\n    const { colSeqName: colSeqName , colTitleScale: colTitleScale , globalScope: globalScope , facetScope: facetScope , plotScope: plotScope , rowSeqName: rowSeqName , rowTitleScale: rowTitleScale  } = props;\n    const { sizeSignals: sizeSignals  } = facetScope;\n    const colSequence = $af332f9d870ab775$var$createSequence(colSeqName, sizeSignals.colCount);\n    const rowSequence = $af332f9d870ab775$var$createSequence(rowSeqName, sizeSignals.rowCount);\n    const index = \"datum.data\";\n    const col = $af332f9d870ab775$export$4f57a5f5fbf1456e(colSeqName, sizeSignals, index);\n    const row = $af332f9d870ab775$export$d0cc3dc227001793(rowSeqName, sizeSignals, index);\n    (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope, colSequence, rowSequence);\n    (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope, col.footer, row.header);\n    (0, $b15ad8fb3905384f$export$290268902279a991)(globalScope, colTitleScale, rowTitleScale);\n    const map = {\n        main: [\n            {\n                scope: facetScope.facetScope,\n                lines: true,\n                labels: false,\n                title: false\n            }\n        ],\n        x: [\n            {\n                scope: col.footer,\n                lines: true,\n                labels: true,\n                title: false\n            },\n            {\n                scope: plotScope,\n                scale: colTitleScale,\n                lines: false,\n                labels: false,\n                title: true\n            }\n        ],\n        y: [\n            {\n                scope: row.header,\n                lines: true,\n                labels: true,\n                title: false\n            },\n            {\n                scope: plotScope,\n                scale: rowTitleScale,\n                lines: false,\n                labels: false,\n                title: true\n            }\n        ]\n    };\n    return map;\n}\nfunction $af332f9d870ab775$export$d0cc3dc227001793(data, sizeSignals, index) {\n    const rowFn = (xSignal)=>{\n        return {\n            type: \"group\",\n            from: {\n                data: data\n            },\n            encode: {\n                update: {\n                    x: {\n                        signal: xSignal\n                    },\n                    y: {\n                        signal: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetTop} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingBottom})`\n                    },\n                    height: {\n                        signal: sizeSignals.layoutHeight\n                    }\n                }\n            }\n        };\n    };\n    const header = rowFn((0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetLeft);\n    const footer = rowFn(`${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetLeft} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotWidthOut} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetRight} / 2`);\n    return {\n        header: header,\n        footer: footer\n    };\n}\nfunction $af332f9d870ab775$export$4f57a5f5fbf1456e(data, sizeSignals, index) {\n    const colFn = (ySignal)=>{\n        return {\n            type: \"group\",\n            from: {\n                data: data\n            },\n            encode: {\n                update: {\n                    x: {\n                        signal: `(${index}) * (${sizeSignals.layoutWidth} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingLeft}) + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingLeft} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetLeft}`\n                    },\n                    y: {\n                        signal: ySignal\n                    },\n                    width: {\n                        signal: sizeSignals.layoutWidth\n                    }\n                }\n            }\n        };\n    };\n    //create group marks based on data sequences\n    const header = colFn(`${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetTop} / 2`);\n    const footer = colFn(`${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetTop} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightOut}`);\n    return {\n        header: header,\n        footer: footer\n    };\n}\nfunction $af332f9d870ab775$var$createSequence(dataName, countSignal) {\n    return {\n        name: dataName,\n        transform: [\n            {\n                type: \"sequence\",\n                start: 0,\n                stop: {\n                    signal: countSignal\n                }\n            }\n        ]\n    };\n}\n\n\n\n\nfunction $e4dd5cb1520ca850$export$9563e054e6f787fb(context, colorFieldName, scale) {\n    const { specColumns: specColumns , insight: insight , specViewOptions: specViewOptions  } = context;\n    const colorColumn = specColumns.color;\n    return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n        field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(colorColumn.name)\n    } : {\n        scale: scale,\n        field: colorColumn.quantitative ? (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(colorColumn.name) : colorFieldName\n    } : {\n        value: specViewOptions.colors.defaultCube\n    };\n}\nfunction $e4dd5cb1520ca850$export$c17a3be1057836e(context) {\n    const result = {\n        signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).MarkOpacity\n    };\n    return result;\n}\n\n\n\n\nclass $f57e47af7971582e$export$5fdf684e73bb2de5 {\n    constructor(props){\n        const { dataName: dataName , markGroup: markGroup , scope: scope , signals: signals  } = props;\n        this.scope = scope;\n        this._markGroup = markGroup;\n        this.signals = signals;\n        this.data = (0, $b15ad8fb3905384f$export$ef4373c7e62b2278)(scope.data, dataName).data;\n        this._markDataName = dataName;\n        this.offsets = {\n            x: \"0\",\n            y: \"0\",\n            h: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightIn,\n            w: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotWidthIn\n        };\n        this.sizeSignals = {\n            layoutHeight: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightIn,\n            layoutWidth: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotWidthIn\n        };\n        this.zSize = (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightIn;\n    }\n    get markDataName() {\n        return this._markDataName;\n    }\n    setMarkDataName(markDataName) {\n        this._markDataName = markDataName;\n    }\n    get markGroup() {\n        return this._markGroup;\n    }\n    setMarkGroup(markGroup) {\n        this._markGroup = markGroup;\n    }\n}\n\n\n\n\nclass $9d478b599f3cbcb3$export$c84671f46d6a1ca {\n    constructor(props){\n        this.props = props;\n        this.id = props.id;\n    }\n    getGrouping() {\n        return null;\n    }\n    getAggregateSumOp() {\n        return null;\n    }\n    build() {\n        throw \"Not implemented\";\n    }\n}\n\n\n\n\n\n\nfunction $17aa946a16979010$export$71c45f78b1166d35() {\n    return `datum.${(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Collapsed}`;\n}\n\n\nclass $9ed4e979e13f36e6$export$fd744dfcd98e5f49 extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const a = this.aggregation = this.getAggregation();\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            scale: `scale_${p}`,\n            extentData: `data_${p}_extent`,\n            offsets: `data_${p}_offsets`\n        };\n    }\n    getAggregateSumOp() {\n        if (this.aggregation === \"sum\") {\n            const fieldOp = {\n                field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(this.props.sumBy.name),\n                op: \"sum\",\n                as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Sum\n            };\n            return fieldOp;\n        }\n    }\n    build() {\n        const { aggregation: aggregation , names: names , props: props  } = this;\n        const { dock: dock , globalScope: globalScope , groupings: groupings , niceScale: niceScale , parentScope: parentScope , showAxes: showAxes  } = props;\n        (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, (0, $b15ad8fb3905384f$export$53a21aeef48e14a8)(groupings))), {\n            as: [\n                names.aggregateField\n            ]\n        }), {\n            type: \"extent\",\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(names.aggregateField),\n            signal: names.globalAggregateExtentSignal\n        });\n        (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: props.globalAggregateMaxExtentSignal,\n            update: `${names.globalAggregateExtentSignal}[1]`\n        });\n        const horizontal = dock === \"left\";\n        const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n        const offsets = {\n            x: parentScope.offsets.x,\n            y: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, dock === \"bottom\" ? groupScaled : \"\"),\n            h: horizontal ? parentScope.offsets.h : dock === \"top\" ? groupScaled : `${parentScope.offsets.h} - ${groupScaled}`,\n            w: horizontal ? groupScaled : parentScope.offsets.w\n        };\n        const scale = {\n            type: \"linear\",\n            name: names.scale,\n            domain: [\n                0,\n                {\n                    signal: props.globalAggregateMaxExtentSignal\n                }\n            ],\n            range: horizontal ? [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutWidth\n                }\n            ] : [\n                {\n                    signal: parentScope.sizeSignals.layoutHeight\n                },\n                0\n            ],\n            nice: niceScale,\n            zero: true,\n            reverse: dock === \"top\"\n        };\n        const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n        (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: props.globalAggregateMaxExtentScaledSignal,\n            update: dock === \"bottom\" ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}` : globalAggregateMaxExtentScaledValue\n        });\n        return {\n            offsets: offsets,\n            sizeSignals: horizontal ? {\n                layoutHeight: parentScope.sizeSignals.layoutHeight,\n                layoutWidth: null\n            } : {\n                layoutHeight: null,\n                layoutWidth: parentScope.sizeSignals.layoutWidth\n            },\n            globalScales: {\n                showAxes: showAxes,\n                scales: {\n                    x: horizontal ? [\n                        scale\n                    ] : undefined,\n                    y: horizontal ? undefined : [\n                        scale\n                    ]\n                }\n            },\n            encodingRuleMap: horizontal ? {\n                x: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        signal: parentScope.offsets.x\n                    }\n                ],\n                width: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ]\n            } : {\n                y: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        signal: dock === \"top\" ? parentScope.offsets.y : (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, parentScope.offsets.h)\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n    getTransforms(aggregation, groupby) {\n        const trans = {\n            type: \"joinaggregate\",\n            groupby: groupby.map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n            ops: [\n                aggregation\n            ]\n        };\n        if (aggregation === \"sum\") trans.fields = [\n            this.props.sumBy.name\n        ].map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b));\n        return trans;\n    }\n    getAggregation() {\n        const { props: props  } = this;\n        let s;\n        if (props.dock === \"left\") s = props.axesScales.x;\n        else s = props.axesScales.y;\n        switch(s.aggregate){\n            case \"sum\":\n                return \"sum\";\n            default:\n                return \"count\";\n        }\n    }\n}\n\n\n\n\n\n\nclass $0c7796f44595fe7a$export$7eda37970b01b2c extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const a = this.props.aggregation;\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            extentData: `data_${p}_extent`\n        };\n    }\n    build() {\n        const { names: names , props: props  } = this;\n        const { aggregation: aggregation , globalScope: globalScope , groupings: groupings , onBuild: onBuild , parentScope: parentScope  } = props;\n        const { sizeSignals: sizeSignals  } = parentScope;\n        (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, (0, $b15ad8fb3905384f$export$53a21aeef48e14a8)(groupings))), {\n            as: [\n                names.aggregateField\n            ]\n        }), {\n            type: \"extent\",\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(names.aggregateField),\n            signal: names.globalAggregateExtentSignal\n        });\n        const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n        const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n        const squareMaxArea = `(${[\n            squareMaxSide,\n            squareMaxSide\n        ].join(\" * \")})`;\n        const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n        const squareArea = `(${[\n            squareMaxArea,\n            shrinkRatio\n        ].join(\" * \")})`;\n        const squareSide = `sqrt(${squareArea})`;\n        const localAggregateMaxExtentScaled = squareSide;\n        onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n        const offsets = {\n            x: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n            y: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n            h: squareSide,\n            w: squareSide\n        };\n        return {\n            offsets: offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        signal: offsets.y\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n    getTransforms(aggregation, groupby) {\n        const trans = {\n            type: \"joinaggregate\",\n            groupby: groupby.map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n            ops: [\n                aggregation\n            ]\n        };\n        if (aggregation === \"sum\") trans.fields = [\n            this.props.sumBy.name\n        ].map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b));\n        return trans;\n    }\n}\n\n\n\n\n\nfunction $02bd8e9b090c20c5$export$6868fd1605c79d3d(prefix, domainDataName, discreteColumn) {\n    const { column: column , defaultBins: defaultBins , maxbins: maxbins , maxbinsSignalDisplayName: maxbinsSignalDisplayName , maxbinsSignalName: maxbinsSignalName  } = discreteColumn;\n    if (column.quantitative) {\n        const field = `${prefix}_bin_${(0, $ac5b955a06ced550$export$74df930fa4adaae4)(column.name)}`;\n        const fieldEnd = `${field}_end`;\n        const binSignal = `${field}_bins`;\n        const extentSignal = `${field}_bin_extent`;\n        domainDataName = `${field}_sequence`; //override the data name\n        const extentTransform = {\n            type: \"extent\",\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(column.name),\n            signal: extentSignal\n        };\n        const maxbinsSignal = {\n            name: maxbinsSignalName,\n            value: defaultBins,\n            bind: {\n                name: maxbinsSignalDisplayName,\n                debounce: 50,\n                input: \"range\",\n                min: 1,\n                max: maxbins,\n                step: 1\n            }\n        };\n        const binTransform = {\n            type: \"bin\",\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(column.name),\n            as: [\n                field,\n                fieldEnd, \n            ],\n            signal: binSignal,\n            extent: {\n                signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`\n            },\n            maxbins: {\n                signal: maxbinsSignalName\n            }\n        };\n        const dataSequence = {\n            name: domainDataName,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: {\n                        signal: `${binSignal}.start`\n                    },\n                    stop: {\n                        signal: `${binSignal}.stop`\n                    },\n                    step: {\n                        signal: `${binSignal}.step`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.data\",\n                    as: field\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data + ${binSignal}.step`,\n                    as: fieldEnd\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"row_number\"\n                    ],\n                    as: [\n                        (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Ordinal\n                    ]\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data === ${binSignal}.start`,\n                    as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).First\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                    as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Last\n                }\n            ]\n        };\n        const augmentBinnable = {\n            discreteColumn: discreteColumn,\n            native: false,\n            transforms: [\n                extentTransform,\n                binTransform\n            ],\n            fields: [\n                field,\n                fieldEnd\n            ],\n            binSignal: binSignal,\n            dataSequence: dataSequence,\n            domainDataName: domainDataName,\n            signals: [\n                maxbinsSignal\n            ],\n            fullScaleDataname: dataSequence.name\n        };\n        return augmentBinnable;\n    } else {\n        const nativeBinnable = {\n            discreteColumn: discreteColumn,\n            native: true,\n            fields: [\n                column.name\n            ],\n            domainDataName: domainDataName,\n            fullScaleDataname: domainDataName\n        };\n        return nativeBinnable;\n    }\n}\n\n\n\n\n\n\nclass $95d7ab00f3235589$export$5b22a87d7feca398 extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `band_${this.id}`;\n        this.names = {\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            bandWidth: `${p}_bandwidth`,\n            accumulative: `${p}_accumulative`\n        };\n        this.bin = (0, $02bd8e9b090c20c5$export$6868fd1605c79d3d)(this.prefix, props.globalScope.data.name, props.groupby);\n    }\n    getGrouping() {\n        return this.bin.fields;\n    }\n    build() {\n        const { bin: bin , names: names , props: props  } = this;\n        const { globalScope: globalScope , minBandWidth: minBandWidth , orientation: orientation , parentScope: parentScope , showAxes: showAxes  } = props;\n        const binField = bin.fields[0];\n        if (bin.native === false) {\n            (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, ...bin.signals);\n            (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, ...bin.transforms);\n            (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, bin.dataSequence);\n        }\n        //TODO don't add this, use existing dataset\n        (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, {\n            name: names.accumulative,\n            source: bin.fullScaleDataname,\n            transform: [\n                {\n                    type: \"aggregate\",\n                    groupby: this.getGrouping().map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n                    ops: [\n                        \"count\"\n                    ]\n                }\n            ]\n        });\n        const horizontal = orientation === \"horizontal\";\n        const minCellSignal = horizontal ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n        (0, $7b42c6682d6a3c62$export$cdc9366ba30317bd)(minCellSignal, \"max\", `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n        (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: names.bandWidth,\n            update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`\n        });\n        const scales = this.getScales(bin, horizontal);\n        let encodingRuleMap;\n        if (!props.excludeEncodingRuleMap) encodingRuleMap = horizontal ? {\n            x: [\n                {\n                    test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                    signal: parentScope.offsets.x\n                }\n            ],\n            width: [\n                {\n                    test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                    value: 0\n                }\n            ]\n        } : {\n            y: [\n                {\n                    test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                    signal: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, parentScope.offsets.h)\n                }\n            ],\n            height: [\n                {\n                    test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                    value: 0\n                }\n            ]\n        };\n        return {\n            offsets: this.getOffset(horizontal, binField),\n            sizeSignals: horizontal ? {\n                layoutHeight: names.bandWidth,\n                layoutWidth: parentScope.sizeSignals.layoutWidth\n            } : {\n                layoutHeight: parentScope.sizeSignals.layoutHeight,\n                layoutWidth: names.bandWidth\n            },\n            globalScales: {\n                showAxes: showAxes,\n                scales: {\n                    x: horizontal ? undefined : scales,\n                    y: horizontal ? scales : undefined\n                }\n            },\n            encodingRuleMap: encodingRuleMap\n        };\n    }\n    getOffset(horizontal, binField) {\n        const { names: names , props: props  } = this;\n        const { parentScope: parentScope  } = props;\n        return {\n            x: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.x, horizontal ? \"\" : `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n            y: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, horizontal ? `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])` : \"\"),\n            h: horizontal ? names.bandWidth : parentScope.offsets.h,\n            w: horizontal ? parentScope.offsets.w : names.bandWidth\n        };\n    }\n    getScales(bin, horizontal) {\n        const { names: names  } = this;\n        const { parentScope: parentScope  } = this.props;\n        const binField = (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(bin.fields[0]);\n        const scales = [];\n        let bandScale;\n        if (horizontal) bandScale = {\n            type: \"band\",\n            name: names.yScale,\n            range: [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutHeight\n                }\n            ],\n            padding: 0.1,\n            domain: {\n                data: bin.domainDataName,\n                field: binField,\n                sort: true\n            },\n            reverse: true\n        };\n        else bandScale = {\n            type: \"band\",\n            name: names.xScale,\n            range: [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutWidth\n                }\n            ],\n            padding: 0.1,\n            domain: {\n                data: bin.domainDataName,\n                field: binField,\n                sort: true\n            }\n        };\n        scales.push(bandScale);\n        return scales;\n    }\n}\n\n\n\n\n\nfunction $0d0febe286e673b1$export$f241323700beca17(bin) {\n    const val = (index)=>`datum[${JSON.stringify(bin.fields[index])}]`;\n    return bin.discreteColumn.column.quantitative ? `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')` : val(0);\n}\nfunction $0d0febe286e673b1$var$obj(nameValues, clause) {\n    if (clause) nameValues = [\n        clause,\n        ...nameValues\n    ];\n    return `{${nameValues.join()}}`;\n}\nfunction $0d0febe286e673b1$export$b292ca0d4c2e4690(bin, firstFieldName, lastFieldName, clause) {\n    if (bin.discreteColumn.column.quantitative) {\n        const low = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'>='\",\n            `value:datum[${JSON.stringify(bin.fields[0])}]`\n        ];\n        const high = [\n            \"clause:'&&'\",\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'<'\",\n            `value:datum[${JSON.stringify(bin.fields[1])}]`\n        ];\n        return $0d0febe286e673b1$var$obj([\n            `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${$0d0febe286e673b1$var$obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${$0d0febe286e673b1$var$obj(high)}]`\n        ], clause);\n    } else {\n        const exact = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'=='\",\n            `value:datum[${JSON.stringify(bin.fields[0])}]`\n        ];\n        return $0d0febe286e673b1$var$obj([\n            `expressions:[${$0d0febe286e673b1$var$obj(exact)}]`\n        ], clause);\n    }\n}\n\n\n\n\n\nfunction $f2ebf870c7736f2c$export$71d2e96f63f1ac97(source, prefix, binFields, sortOrder) {\n    const _binFields = binFields.map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b));\n    const dataName = `${prefix}_bin_order`;\n    const data = {\n        name: dataName,\n        source: source,\n        transform: [\n            {\n                type: \"aggregate\",\n                groupby: _binFields\n            },\n            {\n                type: \"collect\",\n                sort: {\n                    field: _binFields,\n                    order: _binFields.map((f)=>sortOrder)\n                }\n            },\n            {\n                type: \"window\",\n                ops: [\n                    \"row_number\"\n                ],\n                as: [\n                    (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Ordinal\n                ]\n            }\n        ]\n    };\n    return {\n        data: data,\n        scale: $f2ebf870c7736f2c$export$f85d5aad90241781(dataName, `scale_${prefix}_order`, binFields)\n    };\n}\nfunction $f2ebf870c7736f2c$export$f85d5aad90241781(dataName, scaleName, binFields) {\n    return {\n        type: \"ordinal\",\n        name: scaleName,\n        domain: {\n            data: dataName,\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(binFields[0])\n        },\n        range: {\n            data: dataName,\n            field: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Ordinal\n        }\n    };\n}\n\n\n\n\nclass $2454fff13f848bf5$export$3c877bb842c36952 extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `cross_${this.id}`;\n        this.binX = (0, $02bd8e9b090c20c5$export$6868fd1605c79d3d)(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n        this.binY = (0, $02bd8e9b090c20c5$export$6868fd1605c79d3d)(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n        this.names = {\n            facetDataName: `data_${p}_facet`,\n            searchUnion: `data_${p}_search`,\n            dimScale: `scale_${p}`,\n            dimCount: `${p}_count`,\n            dimCategorical: `data_${p}_cat`,\n            dimCellSize: `${p}_cell_size`,\n            dimCellSizeCalc: `${p}_cell_calc`\n        };\n    }\n    getGrouping() {\n        return this.binX.fields.concat(this.binY.fields);\n    }\n    build() {\n        const { binX: binX , binY: binY , names: names , prefix: prefix , props: props  } = this;\n        const { axisTextColor: axisTextColor , colRowTitles: colRowTitles , globalScope: globalScope , parentScope: parentScope  } = props;\n        const titles = {\n            x: {\n                dataName: null,\n                quantitative: null\n            },\n            y: {\n                dataName: null,\n                quantitative: null\n            }\n        };\n        const dx = {\n            dim: \"x\",\n            bin: binX,\n            sortOrder: \"ascending\",\n            size: parentScope.sizeSignals.layoutWidth,\n            layout: parentScope.sizeSignals.layoutWidth,\n            min: globalScope.signals.minCellWidth.name,\n            out: globalScope.signals.plotWidthOut,\n            offset: (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingLeft,\n            padding: (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingLeft,\n            dataOut: null,\n            scaleName: null,\n            position: null\n        };\n        const dy = {\n            dim: \"y\",\n            bin: binY,\n            sortOrder: \"ascending\",\n            size: parentScope.sizeSignals.layoutHeight,\n            layout: parentScope.sizeSignals.layoutHeight,\n            min: globalScope.signals.minCellHeight.name,\n            out: globalScope.signals.plotHeightOut,\n            offset: (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop,\n            padding: `(${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingBottom})`,\n            dataOut: null,\n            scaleName: null,\n            position: null\n        };\n        const dimensions = [\n            dx,\n            dy\n        ];\n        dimensions.forEach((d)=>{\n            const { bin: bin , dim: dim , padding: padding , sortOrder: sortOrder  } = d;\n            let data;\n            let dataName;\n            let countSignal;\n            let scale;\n            const titleSource = titles[dim];\n            if (bin.native === false) {\n                (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, ...bin.signals);\n                (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, ...bin.transforms);\n                (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, bin.dataSequence);\n                (0, $b15ad8fb3905384f$export$eea5d31e98930019)(bin.dataSequence, {\n                    type: \"formula\",\n                    expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                    as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Contains\n                });\n                data = bin.dataSequence;\n                dataName = bin.dataSequence.name;\n                countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                scale = (0, $f2ebf870c7736f2c$export$f85d5aad90241781)(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                titleSource.dataName = bin.dataSequence.name;\n            } else {\n                dataName = globalScope.markDataName;\n                const ord = (0, $f2ebf870c7736f2c$export$71d2e96f63f1ac97)(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                data = ord.data;\n                (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, ord.data);\n                countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                scale = ord.scale;\n                titleSource.dataName = ord.data.name;\n            }\n            titleSource.quantitative = bin.discreteColumn.column.quantitative;\n            d.dataOut = data;\n            d.scaleName = scale.name;\n            (0, $b15ad8fb3905384f$export$eea5d31e98930019)(data, {\n                type: \"formula\",\n                expr: (0, $0d0febe286e673b1$export$b292ca0d4c2e4690)(bin, (0, $ec270fbe8d9983b4$export$10df5429b7082be2).First, (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Last),\n                as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch\n            }, {\n                type: \"formula\",\n                expr: (0, $0d0febe286e673b1$export$f241323700beca17)(bin),\n                as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetTitle\n            });\n            (0, $b15ad8fb3905384f$export$290268902279a991)(globalScope.scope, scale);\n            const count = `${names.dimCount}_${dim}`;\n            const calc = `${names.dimCellSizeCalc}_${dim}`;\n            const size = `${names.dimCellSize}_${dim}`;\n            (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n                name: count,\n                update: countSignal\n            });\n            (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n                name: calc,\n                update: `${d.layout} / ${count}`\n            }, {\n                name: size,\n                update: `max(${d.min}, (${calc} - ${padding}))`\n            });\n            (0, $7b42c6682d6a3c62$export$cdc9366ba30317bd)(d.out, \"max\", `((${size} + ${padding}) * ${count})`);\n            d.position = this.dimensionOffset(d);\n        });\n        const groupRow = {\n            type: \"group\",\n            encode: {\n                update: {\n                    y: {\n                        signal: dy.position\n                    }\n                }\n            },\n            from: {\n                data: dy.dataOut.name\n            },\n            data: [\n                {\n                    name: names.searchUnion,\n                    source: dx.dataOut.name,\n                    transform: [\n                        {\n                            type: \"formula\",\n                            expr: `[datum[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch)}], merge(parent[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch)}], { clause: '&&'})]`,\n                            as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch\n                        }\n                    ]\n                }\n            ]\n        };\n        const groupCol = {\n            style: \"cell\",\n            name: prefix,\n            type: \"group\",\n            encode: {\n                update: {\n                    height: {\n                        signal: `${names.dimCellSize}_y`\n                    },\n                    width: {\n                        signal: `${names.dimCellSize}_x`\n                    },\n                    x: {\n                        signal: dx.position\n                    }\n                }\n            },\n            from: {\n                data: names.searchUnion\n            }\n        };\n        (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope.markGroup, groupRow);\n        (0, $b15ad8fb3905384f$export$3df320e901c23a48)(groupRow, groupCol);\n        const offsets = {\n            x: this.dimensionOffset(dx),\n            y: this.dimensionOffset(dy),\n            h: `${names.dimCellSize}_y`,\n            w: `${names.dimCellSize}_x`\n        };\n        const sizeSignals = {\n            layoutHeight: `${names.dimCellSize}_y`,\n            layoutWidth: `${names.dimCellSize}_x`,\n            colCount: `${names.dimCount}_x`,\n            rowCount: `${names.dimCount}_y`\n        };\n        if (colRowTitles) (0, $af332f9d870ab775$export$4fec84497b9e6e3f)(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n        return {\n            facetScope: groupCol,\n            offsets: offsets,\n            sizeSignals: sizeSignals,\n            titles: titles\n        };\n    }\n    dimensionOffset(d) {\n        const { names: names  } = this;\n        return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n    }\n}\n\n\n\n\n\n\n\n\n\nclass $154b2c962cf38cfb$export$1c460fb4285edadc extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `scatter_${this.id}`;\n        this.names = {\n            aggregateData: `data_${p}_aggregate`,\n            markData: `data_${p}_mark`,\n            sizeExtent: `${p}_sizeExtent`,\n            sizeRange: `${p}_sizeRange`,\n            sizeScale: `${p}_sizeScale`,\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names: names , prefix: prefix , props: props  } = this;\n        const { globalScope: globalScope , parentScope: parentScope , scatterPointScaleDisplay: scatterPointScaleDisplay , size: size , x: x , y: y , z: z , zGrounded: zGrounded  } = props;\n        const qsize = size && size.quantitative && size;\n        (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PointScale,\n            value: 5,\n            bind: {\n                name: scatterPointScaleDisplay,\n                debounce: 50,\n                input: \"range\",\n                min: 1,\n                max: 10,\n                step: 1\n            }\n        }, {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).ZGrounded,\n            value: false,\n            bind: {\n                name: zGrounded,\n                input: \"checkbox\"\n            }\n        });\n        if (qsize) {\n            (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, {\n                type: \"extent\",\n                field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(qsize.name),\n                signal: names.sizeExtent\n            });\n            (0, $b15ad8fb3905384f$export$290268902279a991)(globalScope.scope, {\n                name: names.sizeScale,\n                type: \"linear\",\n                domain: [\n                    0,\n                    {\n                        signal: `${names.sizeExtent}[1]`\n                    }\n                ],\n                range: [\n                    0,\n                    {\n                        signal: names.sizeRange\n                    }\n                ]\n            });\n            (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n                name: names.sizeRange,\n                update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${(0, $17564e8cec2b9f75$export$c223d3ee3c0620d9)}`\n            });\n        }\n        (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, {\n            name: names.markData,\n            source: globalScope.markDataName,\n            transform: [\n                x,\n                y,\n                z\n            ].map((c)=>{\n                if (!c || !c.quantitative) return;\n                const t = {\n                    type: \"filter\",\n                    expr: `isValid(datum[${JSON.stringify(c.name)}])`\n                };\n                return t;\n            }).filter(Boolean)\n        });\n        globalScope.setMarkDataName(names.markData);\n        const globalScales = {\n            showAxes: true,\n            scales: {}\n        };\n        const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n        const sizeValueSignal = qsize ? `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PointScale}` : (0, $ec270fbe8d9983b4$export$809e371dee643808).PointScale;\n        const update = Object.assign({\n            height: [\n                {\n                    test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                    value: 0\n                },\n                {\n                    signal: sizeValueSignal\n                }\n            ],\n            width: {\n                signal: sizeValueSignal\n            }\n        }, z && {\n            z: [\n                {\n                    test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                    value: 0\n                },\n                {\n                    signal: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).ZGrounded} ? 0 : ${zValue}`\n                }\n            ],\n            depth: [\n                {\n                    test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                    value: 0\n                },\n                {\n                    signal: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).ZGrounded} ? ${zValue} : ${sizeValueSignal}`\n                }\n            ]\n        });\n        const columnSignals = [\n            {\n                column: x,\n                xyz: \"x\",\n                scaleName: names.xScale,\n                reverse: false,\n                signal: parentScope.sizeSignals.layoutWidth\n            },\n            {\n                column: y,\n                xyz: \"y\",\n                scaleName: names.yScale,\n                reverse: true,\n                signal: parentScope.sizeSignals.layoutHeight\n            },\n            {\n                column: z,\n                xyz: \"z\",\n                scaleName: names.zScale,\n                reverse: false,\n                signal: `(${globalScope.zSize}) * ${(0, $ec270fbe8d9983b4$export$809e371dee643808).ZProportion}`\n            }\n        ];\n        columnSignals.forEach((cs)=>{\n            const { column: column , reverse: reverse , scaleName: scaleName , signal: signal , xyz: xyz  } = cs;\n            if (!column) return;\n            let scale;\n            if (column.quantitative) scale = (0, $c0bec0cf2b65a746$export$fefe9507ec0904ed)(scaleName, globalScope.data.name, column.name, [\n                0,\n                {\n                    signal: signal\n                }\n            ], reverse, false);\n            else scale = (0, $c0bec0cf2b65a746$export$b67158f831e00d0d)(scaleName, globalScope.data.name, [\n                0,\n                {\n                    signal: signal\n                }\n            ], column.name, reverse);\n            globalScales.scales[xyz] = [\n                scale\n            ];\n        });\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: update\n            }\n        };\n        (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope.markGroup, mark);\n        return {\n            offsets: {\n                x: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                y: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                h: sizeValueSignal,\n                w: sizeValueSignal\n            },\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            globalScales: globalScales,\n            mark: mark,\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        signal: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight)\n                    }\n                ]\n            }\n        };\n    }\n}\n\n\n\n\n\n\n\n\n\nfunction $b127773b4223519c$export$9e1d5954d0bb865c(z, zSize, dataName, zScaleName) {\n    if (z) {\n        const zRange = [\n            0,\n            {\n                signal: `(${zSize}) * ${(0, $ec270fbe8d9983b4$export$809e371dee643808).ZProportion}`\n            }\n        ];\n        const scale = z.quantitative ? (0, $c0bec0cf2b65a746$export$fefe9507ec0904ed)(zScaleName, dataName, z.name, zRange, false, true) : (0, $c0bec0cf2b65a746$export$b67158f831e00d0d)(zScaleName, dataName, zRange, z.name, false);\n        return scale;\n    }\n}\n\n\nclass $c51cdb6381ccbb7b$export$b09fb900337259de extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `square_${this.id}`;\n        this.names = {\n            bandWidth: this.getBandWidth(),\n            maxGroupField: `${p}_max_group`,\n            maxGroupSignal: `${p}_max_grouping`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names: names , prefix: prefix , props: props  } = this;\n        const { fillDirection: fillDirection , globalScope: globalScope , groupings: groupings , parentScope: parentScope , collapseYHeight: collapseYHeight , sortBy: sortBy , z: z  } = props;\n        const zScale = (0, $b127773b4223519c$export$9e1d5954d0bb865c)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, Object.assign({\n            type: \"stack\",\n            groupby: (0, $b15ad8fb3905384f$export$53a21aeef48e14a8)(groupings).map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n            as: [\n                names.stack0,\n                names.stack1\n            ]\n        }, sortBy && {\n            sort: {\n                field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(sortBy.name),\n                order: \"ascending\"\n            }\n        }));\n        const { gap: gap , levelSize: levelSize , size: size , squaresPerBand: squaresPerBand  } = this.addSignals();\n        const heightSignal = {\n            signal: fillDirection === \"down-right\" ? size : levelSize\n        };\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    height: collapseYHeight ? [\n                        {\n                            test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                            value: 0\n                        },\n                        heightSignal\n                    ] : heightSignal,\n                    width: {\n                        signal: fillDirection === \"down-right\" ? levelSize : size\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(z.name)\n                        }\n                    ]\n                })\n            }\n        };\n        (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope.markGroup, mark);\n        const { tx: tx , ty: ty  } = this.transformXY(gap, levelSize, squaresPerBand);\n        return Object.assign(Object.assign(Object.assign({}, z && {\n            globalScales: {\n                showAxes: true,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            }\n        }), {\n            offsets: {\n                x: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.x, tx.expr),\n                y: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, ty.expr),\n                h: size,\n                w: size\n            },\n            mark: mark,\n            sizeSignals: {\n                layoutHeight: size,\n                layoutWidth: size\n            }\n        }), collapseYHeight && {\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        signal: parentScope.offsets.y\n                    }\n                ]\n            }\n        });\n    }\n    getBandWidth() {\n        const { offsets: offsets  } = this.props.parentScope;\n        switch(this.props.fillDirection){\n            case \"down-right\":\n                return offsets.h;\n            default:\n                return offsets.w;\n        }\n    }\n    addSignals() {\n        const { names: names , props: props  } = this;\n        const { fillDirection: fillDirection , globalScope: globalScope , groupings: groupings , parentScope: parentScope  } = props;\n        let { maxGroupedFillSize: maxGroupedFillSize , maxGroupedUnits: maxGroupedUnits  } = props;\n        if (!maxGroupedUnits) {\n            if (groupings) {\n                (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, {\n                    type: \"joinaggregate\",\n                    groupby: (0, $b15ad8fb3905384f$export$53a21aeef48e14a8)(groupings).map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n                    ops: [\n                        \"count\"\n                    ],\n                    as: [\n                        names.maxGroupField\n                    ]\n                }, {\n                    type: \"extent\",\n                    field: names.maxGroupField,\n                    signal: names.maxGroupSignal\n                });\n                maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n            } else maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n        }\n        if (!maxGroupedFillSize) maxGroupedFillSize = fillDirection === \"down-right\" ? parentScope.offsets.w : parentScope.offsets.h;\n        const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n        const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n        const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n        const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n        const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n        const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n        return {\n            gap: gap,\n            levelSize: levelSize,\n            size: size,\n            squaresPerBand: squaresPerBand\n        };\n    }\n    transformXY(gap, levelSize, squaresPerBand) {\n        const { names: names , prefix: prefix  } = this;\n        const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n        const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n        const { fillDirection: fillDirection , parentScope: parentScope  } = this.props;\n        const tx = {\n            type: \"formula\",\n            expr: null,\n            as: `${prefix}_${(0, $ec270fbe8d9983b4$export$10df5429b7082be2).OffsetX}`\n        };\n        const ty = {\n            type: \"formula\",\n            expr: null,\n            as: `${prefix}_${(0, $ec270fbe8d9983b4$export$10df5429b7082be2).OffsetY}`\n        };\n        switch(fillDirection){\n            case \"down-right\":\n                tx.expr = `${level} * (${levelSize} + ${gap})`;\n                ty.expr = compartment;\n                break;\n            case \"right-up\":\n                tx.expr = compartment;\n                ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                break;\n            case \"right-down\":\n            default:\n                tx.expr = compartment;\n                ty.expr = `${level} * (${levelSize} + ${gap})`;\n                break;\n        }\n        return {\n            tx: tx,\n            ty: ty\n        };\n    }\n}\n\n\n\n\n\n\nclass $596680402951a0aa$export$694e0d28c7ffc90c extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `stack_${this.id}`;\n        this.names = {\n            cube: `${p}_cube`,\n            globalDataName: `data_${p}_count`,\n            globalExtent: `${p}_global_extent`,\n            levelDataName: `data_${p}_level`,\n            count: `${p}_count`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            sequence: `data_${p}_sequence`,\n            sides: `${p}_sides`,\n            size: `${p}_size`,\n            squared: `${p}_squared`,\n            maxCount: `${p}_maxCount`,\n            maxLevels: `${p}_maxLevels`,\n            zScale: `${p}_zScale`\n        };\n    }\n    build() {\n        const { names: names , props: props  } = this;\n        const { globalScope: globalScope , groupings: groupings , parentScope: parentScope , sort: sort  } = props;\n        const { sizeSignals: sizeSignals  } = parentScope;\n        (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, {\n            type: \"joinaggregate\",\n            groupby: (0, $b15ad8fb3905384f$export$53a21aeef48e14a8)(groupings).map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n            ops: [\n                \"count\"\n            ],\n            as: [\n                names.count\n            ]\n        }, {\n            type: \"extent\",\n            field: names.count,\n            signal: names.globalExtent\n        }, Object.assign({\n            type: \"stack\",\n            groupby: (0, $b15ad8fb3905384f$export$53a21aeef48e14a8)(groupings).map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n            as: [\n                names.stack0,\n                names.stack1\n            ]\n        }, sort && {\n            sort: {\n                field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(sort.name),\n                order: \"ascending\"\n            }\n        }));\n        (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, {\n            name: names.sequence,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: 1,\n                    stop: {\n                        signal: `max(sqrt(${names.globalExtent}[1]),2)`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.data * datum.data\",\n                    as: \"squared\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                    as: \"maxlevels\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                    as: \"side\"\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.side * datum.maxlevels + datum.maxlevels - 1\",\n                    as: \"sidecubeheight\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                    as: \"heightmatch\"\n                },\n                {\n                    type: \"collect\",\n                    sort: {\n                        field: \"heightmatch\",\n                        order: \"ascending\"\n                    }\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"row_number\"\n                    ]\n                },\n                {\n                    type: \"filter\",\n                    expr: \"datum.row_number === 1\"\n                }\n            ]\n        });\n        (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: names.size,\n            update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`\n        }, {\n            name: names.squared,\n            update: `data('${names.sequence}')[0].squared`\n        }, {\n            name: names.sides,\n            update: `sqrt(${names.squared})`\n        }, {\n            name: names.cube,\n            update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`\n        }, {\n            name: names.maxLevels,\n            update: `data('${names.sequence}')[0].maxlevels`\n        }, {\n            name: names.maxCount,\n            update: `${names.maxLevels} * ${names.squared}`\n        });\n        const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n        const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n        const cubeX = `(${layerOrdinal} % ${names.sides})`;\n        const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n        const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n        const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n        const offsets = {\n            x: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n            y: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n            h: names.size,\n            w: names.size\n        };\n        const mark = {\n            type: \"rect\",\n            from: {\n                data: this.names.levelDataName\n            },\n            encode: {\n                update: {\n                    z: {\n                        signal: `${zLevel} * (${names.cube} + 1)`\n                    },\n                    height: {\n                        signal: names.cube\n                    },\n                    width: {\n                        signal: names.cube\n                    },\n                    depth: {\n                        signal: names.cube\n                    }\n                }\n            }\n        };\n        (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope.markGroup, mark);\n        const zScale = {\n            type: \"linear\",\n            name: names.zScale,\n            domain: [\n                0,\n                {\n                    signal: names.maxCount\n                }\n            ],\n            range: [\n                0,\n                {\n                    signal: `${names.maxLevels} * (${names.cube} + 1) - 1`\n                }\n            ],\n            nice: false\n        };\n        return {\n            offsets: offsets,\n            mark: mark,\n            sizeSignals: {\n                layoutHeight: names.size,\n                layoutWidth: names.size\n            },\n            globalScales: {\n                showAxes: true,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            },\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        signal: parentScope.offsets.y\n                    }\n                ],\n                z: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ],\n                depth: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n}\n\n\n\n\n\n\n\n\nclass $c0dcd6f3c3c87d5a$export$c4df0d8c6c8f50e4 extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `strip_${this.id}`;\n        this.names = {\n            firstField: `${p}${(0, $ec270fbe8d9983b4$export$10df5429b7082be2).First}`,\n            lastField: `${p}${(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Last}`,\n            valueField: `${p}${(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Value}`,\n            scale: `scale_${p}`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names: names , prefix: prefix , props: props  } = this;\n        const { addPercentageScale: addPercentageScale , globalScope: globalScope , groupings: groupings , orientation: orientation , size: size , sort: sort , sortOrder: sortOrder , parentScope: parentScope , z: z  } = props;\n        const zScale = (0, $b127773b4223519c$export$9e1d5954d0bb865c)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        const horizontal = orientation === \"horizontal\";\n        const transform = [];\n        if (sort) transform.push({\n            type: \"collect\",\n            sort: {\n                field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(sort.name),\n                order: sortOrder\n            }\n        });\n        let stackField;\n        if (size) {\n            stackField = size.name;\n            transform.push({\n                type: \"filter\",\n                expr: `datum[${JSON.stringify(size.name)}] > 0`\n            });\n        } else {\n            stackField = names.valueField;\n            transform.push({\n                type: \"formula\",\n                expr: \"1\",\n                as: stackField\n            });\n        }\n        const stackTransform = {\n            type: \"stack\",\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(stackField),\n            offset: \"normalize\",\n            as: [\n                names.firstField,\n                names.lastField\n            ]\n        };\n        if (groupings.length) stackTransform.groupby = (0, $b15ad8fb3905384f$export$53a21aeef48e14a8)(groupings).map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b));\n        transform.push(stackTransform);\n        (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, ...transform);\n        const span = [\n            names.lastField,\n            names.firstField\n        ].map((f)=>`datum[${JSON.stringify(f)}]`).join(\" - \");\n        const offsets = {\n            x: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.x, horizontal ? `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})` : \"\"),\n            y: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, horizontal ? \"\" : `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n            h: horizontal ? parentScope.offsets.h : `(${span}) * (${parentScope.offsets.h})`,\n            w: horizontal ? `(${span}) * (${parentScope.offsets.w})` : parentScope.offsets.w\n        };\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    height: {\n                        signal: offsets.h\n                    },\n                    width: {\n                        signal: offsets.w\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(z.name)\n                        }\n                    ]\n                })\n            }\n        };\n        (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope.markGroup, mark);\n        let percentageScale;\n        if (addPercentageScale) percentageScale = [\n            {\n                type: \"linear\",\n                name: names.scale,\n                domain: [\n                    0,\n                    100\n                ],\n                range: horizontal ? [\n                    0,\n                    {\n                        signal: parentScope.sizeSignals.layoutWidth\n                    }\n                ] : [\n                    {\n                        signal: parentScope.sizeSignals.layoutHeight\n                    },\n                    0\n                ]\n            }\n        ];\n        return {\n            globalScales: {\n                showAxes: true,\n                scales: {\n                    x: horizontal ? percentageScale : undefined,\n                    y: horizontal ? undefined : percentageScale,\n                    z: zScale && [\n                        zScale\n                    ]\n                }\n            },\n            offsets: offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            mark: mark\n        };\n    }\n}\n\n\n\n\n\n\n\n\nclass $e834c7064afd736d$export$d685cd2b84b49ee extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `treemap_${this.id}`;\n        this.names = {\n            dataName: `data_${p}`,\n            dataHeightWidth: `data_${p}_hw`,\n            dataExtents: `data_${p}_extents`,\n            dataFacet: `data_${p}_facet`,\n            dataFacetMark: `data_${p}_facetMark`,\n            fieldChildren: `${p}_children`,\n            fieldDepth: `${p}_depth`,\n            fieldX0: `${p}_x0`,\n            fieldX1: `${p}_x1`,\n            fieldY0: `${p}_y0`,\n            fieldY1: `${p}_y1`,\n            fieldHeight: `${p}_h`,\n            fieldWidth: `${p}_w`,\n            heightExtent: `${p}_heightExtent`,\n            widthExtent: `${p}_widthExtent`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names: names , props: props  } = this;\n        const { globalScope: globalScope , parentScope: parentScope , treeMapMethod: treeMapMethod , z: z  } = props;\n        const zScale = (0, $b127773b4223519c$export$9e1d5954d0bb865c)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        const offsets = {\n            x: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.x, $e834c7064afd736d$var$fn(names.fieldX0)),\n            y: (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, $e834c7064afd736d$var$fn(names.fieldY0)),\n            h: $e834c7064afd736d$var$subtract(names.fieldY1, names.fieldY0),\n            w: $e834c7064afd736d$var$subtract(names.fieldX1, names.fieldX0)\n        };\n        const mark = this.transformedMark(offsets);\n        (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: (0, $ec270fbe8d9983b4$export$809e371dee643808).TreeMapMethod,\n            value: \"squarify\",\n            bind: {\n                name: treeMapMethod,\n                input: \"select\",\n                options: [\n                    \"squarify\",\n                    \"binary\"\n                ]\n            }\n        });\n        return Object.assign(Object.assign({}, z && {\n            globalScales: {\n                showAxes: true,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            }\n        }), {\n            mark: mark,\n            offsets: offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            }\n        });\n    }\n    transformedMark(offsets) {\n        const { names: names , props: props  } = this;\n        const { globalScope: globalScope , groupings: groupings , parentScope: parentScope  } = props;\n        if (groupings.length) {\n            //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n            (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, {\n                name: names.dataHeightWidth,\n                source: globalScope.markDataName,\n                transform: [\n                    {\n                        type: \"formula\",\n                        expr: parentScope.offsets.h,\n                        as: names.fieldHeight\n                    },\n                    {\n                        type: \"formula\",\n                        expr: parentScope.offsets.w,\n                        as: names.fieldWidth\n                    }\n                ]\n            });\n            const treemapData = {\n                name: names.dataFacetMark,\n                source: names.dataFacet\n            };\n            const facets = {\n                type: \"group\",\n                from: {\n                    facet: {\n                        name: names.dataFacet,\n                        data: names.dataHeightWidth,\n                        groupby: (0, $b15ad8fb3905384f$export$53a21aeef48e14a8)(groupings).map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b))\n                    }\n                },\n                data: [\n                    {\n                        name: names.dataExtents,\n                        source: names.dataFacet,\n                        transform: [\n                            {\n                                type: \"extent\",\n                                field: names.fieldHeight,\n                                signal: names.heightExtent\n                            },\n                            {\n                                type: \"extent\",\n                                field: names.fieldWidth,\n                                signal: names.widthExtent\n                            }\n                        ]\n                    },\n                    treemapData\n                ]\n            };\n            globalScope.setMarkDataName(names.dataFacetMark);\n            (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope.markGroup, facets);\n            //assign new markgroup after adding mark to original group\n            globalScope.setMarkGroup(facets);\n            this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n            return this.addMark(offsets, facets, globalScope.markDataName);\n        } else {\n            this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n            return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n        }\n    }\n    addMark(offsets, markParent, markDataName) {\n        const { names: names , prefix: prefix , props: props  } = this;\n        const { z: z  } = props;\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    width: {\n                        signal: offsets.w\n                    },\n                    height: {\n                        signal: offsets.h\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, $17aa946a16979010$export$71c45f78b1166d35)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(z.name)\n                        }\n                    ]\n                })\n            }\n        };\n        (0, $b15ad8fb3905384f$export$3df320e901c23a48)(markParent, mark);\n        return mark;\n    }\n    treemapTransform(treemapData, widthSignal, heightSignal) {\n        const { names: names , props: props  } = this;\n        const { group: group , size: size  } = props;\n        (0, $b15ad8fb3905384f$export$eea5d31e98930019)(treemapData, {\n            type: \"filter\",\n            expr: `datum[${JSON.stringify(size.name)}] > 0`\n        }, {\n            type: \"nest\",\n            keys: [\n                group && group.name || \"__NONE__\"\n            ]\n        }, {\n            type: \"treemap\",\n            field: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(size.name),\n            sort: {\n                field: \"value\",\n                order: \"descending\"\n            },\n            round: true,\n            method: {\n                signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).TreeMapMethod\n            },\n            paddingInner: 1,\n            paddingOuter: 0,\n            size: [\n                {\n                    signal: widthSignal\n                },\n                {\n                    signal: heightSignal\n                }\n            ],\n            as: [\n                names.fieldX0,\n                names.fieldY0,\n                names.fieldX1,\n                names.fieldY1,\n                names.fieldDepth,\n                names.fieldChildren\n            ]\n        });\n    }\n}\nfunction $e834c7064afd736d$var$fn(n) {\n    return `datum[${JSON.stringify(n)}]`;\n}\nfunction $e834c7064afd736d$var$subtract(...fields) {\n    return fields.map((n)=>$e834c7064afd736d$var$fn(n)).join(\" - \");\n}\n\n\n\n\n\n\n\n\n\n\n\nclass $1f11bfc7bd0f55af$export$f6b1e3902165e5e1 extends (0, $9d478b599f3cbcb3$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `wrap_${this.id}`;\n        this.bin = (0, $02bd8e9b090c20c5$export$6868fd1605c79d3d)(this.prefix, props.globalScope.data.name, props.groupby);\n        this.names = {\n            outputData: `data_${p}_out`,\n            rowColumnDataName: `data_${p}_row_col`,\n            cellHeight: `${p}_cellHeight`,\n            cellWidth: `${p}_cellWidth`,\n            fits: `${p}_fits`,\n            target: `${p}_target`,\n            minArea: `${p}_minArea`,\n            aspect: `${p}_aspect`,\n            minAspect: `${p}_minAspect`,\n            idealAspect: `${p}_idealAspect`,\n            dataLength: `${p}_dataLength`,\n            rxc0: `${p}_rxc0`,\n            rxc1: `${p}_rxc1`,\n            rxc2: `${p}_rxc2`,\n            rxc: `${p}_rxc`,\n            growColCount: `${p}_growColCount`,\n            growCellWidth: `${p}_growCellWidth`,\n            fitsArea: `${p}_fitsArea`,\n            colCount: `${p}_colCount`\n        };\n    }\n    getGrouping() {\n        return this.bin.fields;\n    }\n    build() {\n        const { bin: bin , names: names , prefix: prefix , props: props  } = this;\n        const { axisTextColor: axisTextColor , cellTitles: cellTitles , globalScope: globalScope , parentScope: parentScope  } = props;\n        let ordinalBinData;\n        if (bin.native === false) {\n            (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, ...bin.signals);\n            (0, $b15ad8fb3905384f$export$eea5d31e98930019)(globalScope.data, ...bin.transforms);\n            (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, bin.dataSequence);\n            (0, $b15ad8fb3905384f$export$eea5d31e98930019)(bin.dataSequence, {\n                type: \"formula\",\n                expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Contains\n            });\n            ordinalBinData = bin.dataSequence.name;\n        } else {\n            const ord = (0, $f2ebf870c7736f2c$export$71d2e96f63f1ac97)(globalScope.data.name, prefix, bin.fields, \"ascending\");\n            (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, ord.data);\n            ordinalBinData = ord.data.name;\n        }\n        (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, {\n            name: names.rxc0,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: 1,\n                    stop: {\n                        signal: `ceil(sqrt(${names.dataLength})) + 1`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.dataLength} / datum.data)`,\n                    as: \"complement\"\n                }\n            ]\n        }, {\n            name: names.rxc1,\n            source: names.rxc0,\n            transform: [\n                {\n                    type: \"project\",\n                    fields: [\n                        \"data\"\n                    ],\n                    as: [\n                        \"cols\"\n                    ]\n                }\n            ]\n        }, {\n            name: names.rxc2,\n            source: names.rxc0,\n            transform: [\n                {\n                    type: \"project\",\n                    fields: [\n                        \"complement\"\n                    ],\n                    as: [\n                        \"cols\"\n                    ]\n                }\n            ]\n        }, {\n            name: names.rxc,\n            source: [\n                names.rxc1,\n                names.rxc2\n            ],\n            transform: [\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.dataLength} / datum.cols)`,\n                    as: \"rows\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                    as: \"cellw\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.cols === 1 ? max(datum.cellw, ${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellWidth}) : datum.cellw`,\n                    as: \"cellw\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                    as: \"cellh\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.rows === 1 ? max(datum.cellh, ${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellHeight}) : datum.cellh`,\n                    as: \"cellh\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `(datum.cellw >= ${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellWidth} && datum.cellh >= ${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellHeight})`,\n                    as: \"meetsmin\"\n                },\n                {\n                    type: \"filter\",\n                    expr: \"datum.meetsmin\"\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.cellw / datum.cellh\",\n                    as: names.aspect\n                },\n                {\n                    type: \"formula\",\n                    expr: `abs(datum.${names.aspect} - ${names.target})`,\n                    as: names.idealAspect\n                },\n                {\n                    type: \"formula\",\n                    expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                    as: \"coverage\"\n                },\n                {\n                    type: \"collect\",\n                    sort: {\n                        field: [\n                            names.idealAspect,\n                            \"coverage\"\n                        ],\n                        order: [\n                            \"ascending\",\n                            \"descending\"\n                        ]\n                    }\n                }\n            ]\n        }, {\n            name: names.rowColumnDataName,\n            source: ordinalBinData,\n            transform: [\n                {\n                    type: \"formula\",\n                    expr: `floor((datum[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).Ordinal)}] - 1) / ${names.colCount})`,\n                    as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).WrapRow\n                },\n                {\n                    type: \"formula\",\n                    expr: `(datum[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).Ordinal)}] - 1) % ${names.colCount}`,\n                    as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).WrapCol\n                },\n                {\n                    type: \"formula\",\n                    expr: (0, $0d0febe286e673b1$export$b292ca0d4c2e4690)(bin, (0, $ec270fbe8d9983b4$export$10df5429b7082be2).First, (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Last),\n                    as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch\n                },\n                {\n                    type: \"formula\",\n                    expr: (0, $0d0febe286e673b1$export$f241323700beca17)(bin),\n                    as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetTitle\n                }\n            ]\n        });\n        const dataOut = {\n            name: names.outputData,\n            source: globalScope.data.name,\n            transform: [\n                {\n                    type: \"lookup\",\n                    from: names.rowColumnDataName,\n                    key: (0, $ac5b955a06ced550$export$fb70365b00e8cb7b)(bin.fields[0]),\n                    fields: [\n                        bin.fields[0]\n                    ].map((0, $ac5b955a06ced550$export$fb70365b00e8cb7b)),\n                    values: [\n                        (0, $ec270fbe8d9983b4$export$10df5429b7082be2).WrapRow,\n                        (0, $ec270fbe8d9983b4$export$10df5429b7082be2).WrapCol\n                    ]\n                }\n            ]\n        };\n        (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.scope, dataOut);\n        globalScope.setMarkDataName(names.outputData);\n        (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: names.minAspect,\n            update: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellWidth} / ${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellHeight}`\n        }, {\n            name: names.target,\n            update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`\n        }, {\n            name: names.minArea,\n            update: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellWidth}*${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellHeight}`\n        }, {\n            name: names.aspect,\n            update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`\n        }, {\n            name: names.dataLength,\n            update: `data(${JSON.stringify(ordinalBinData)}).length`\n        }, {\n            name: names.growColCount,\n            update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellWidth}), 1)`\n        }, {\n            name: names.growCellWidth,\n            update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`\n        }, {\n            name: names.fitsArea,\n            update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`\n        }, {\n            name: names.fits,\n            update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`\n        }, {\n            name: names.colCount,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`\n        }, {\n            name: names.cellWidth,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`\n        }, {\n            name: names.cellHeight,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellHeight}`\n        });\n        (0, $7b42c6682d6a3c62$export$cdc9366ba30317bd)(globalScope.signals.plotHeightOut, \"max\", `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n        (0, $7b42c6682d6a3c62$export$cdc9366ba30317bd)(globalScope.signals.plotWidthOut, \"max\", `(${names.cellWidth} * ${names.colCount})`);\n        const signalH = [\n            names.cellHeight,\n            (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop,\n            (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingBottom\n        ].join(\" - \");\n        const signalW = [\n            names.cellWidth,\n            (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingLeft\n        ].join(\" - \");\n        const signalX = (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.x, `datum[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).WrapCol)}] * ${names.cellWidth}`, (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingLeft);\n        const signalY = (0, $b15ad8fb3905384f$export$e6b6683aec0fe907)(parentScope.offsets.y, `datum[${JSON.stringify((0, $ec270fbe8d9983b4$export$10df5429b7082be2).WrapRow)}] * ${names.cellHeight}`, (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop);\n        const update = {\n            height: {\n                signal: signalH\n            },\n            width: {\n                signal: signalW\n            },\n            x: {\n                signal: signalX\n            },\n            y: {\n                signal: signalY\n            }\n        };\n        const offsets = {\n            x: signalX,\n            y: signalY,\n            h: signalH,\n            w: signalW\n        };\n        const group = {\n            style: \"cell\",\n            name: prefix,\n            type: \"group\",\n            from: {\n                data: names.rowColumnDataName\n            },\n            encode: {\n                update: update\n            }\n        };\n        (0, $b15ad8fb3905384f$export$3df320e901c23a48)(globalScope.markGroup, group);\n        const sizeSignals = {\n            layoutHeight: `(${names.cellHeight} - ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop} - ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingBottom})`,\n            layoutWidth: `(${names.cellWidth} - ${(0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingLeft})`,\n            colCount: names.colCount,\n            rowCount: `ceil(${names.dataLength} / ${names.colCount})`\n        };\n        if (cellTitles) (0, $af332f9d870ab775$export$3735b1dd76112836)(group, sizeSignals, axisTextColor);\n        return {\n            facetScope: group,\n            sizeSignals: sizeSignals,\n            offsets: offsets\n        };\n    }\n}\n\n\nconst $cc6302de00719d9e$export$8b2ec0ba67742226 = {\n    AggregateContainer: $9ed4e979e13f36e6$export$fd744dfcd98e5f49,\n    AggregateSquare: $0c7796f44595fe7a$export$7eda37970b01b2c,\n    Band: $95d7ab00f3235589$export$5b22a87d7feca398,\n    Cross: $2454fff13f848bf5$export$3c877bb842c36952,\n    Scatter: $154b2c962cf38cfb$export$1c460fb4285edadc,\n    Square: $c51cdb6381ccbb7b$export$b09fb900337259de,\n    Stack: $596680402951a0aa$export$694e0d28c7ffc90c,\n    Strip: $c0dcd6f3c3c87d5a$export$c4df0d8c6c8f50e4,\n    Treemap: $e834c7064afd736d$export$d685cd2b84b49ee,\n    Wrap: $1f11bfc7bd0f55af$export$f6b1e3902165e5e1\n};\n\n\nclass $afbd306f40f38f7e$export$e2e6dd2b1097c25b {\n    constructor(props, specContext){\n        this.props = props;\n        this.specContext = specContext;\n        this.globalSignals = {\n            minCellWidth: {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellWidth,\n                update: `${0, $17564e8cec2b9f75$export$7794a0aff56142de}`\n            },\n            minCellHeight: {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellHeight,\n                update: `${0, $17564e8cec2b9f75$export$7c432db1d0b63312}`\n            },\n            plotOffsetLeft: {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetLeft,\n                update: \"0\"\n            },\n            plotOffsetTop: {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetTop,\n                update: \"0\"\n            },\n            plotOffsetBottom: {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetBottom,\n                update: \"0\"\n            },\n            plotOffsetRight: {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetRight,\n                update: \"0\"\n            },\n            plotHeightOut: {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightOut,\n                update: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightIn\n            },\n            plotWidthOut: {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotWidthOut,\n                update: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotWidthIn\n            }\n        };\n    }\n    validate() {\n        const { specContext: specContext  } = this;\n        const { specCapabilities: specCapabilities  } = this.props;\n        const { roles: roles  } = specCapabilities;\n        const required = roles.filter((r)=>{\n            switch(typeof r.allowNone){\n                case \"boolean\":\n                    return !r.allowNone;\n                case \"undefined\":\n                    return true;\n                case \"function\":\n                    return !r.allowNone(specContext);\n            }\n        });\n        const numeric = roles.filter((r)=>r.excludeCategoric);\n        const errors = required.map((r)=>{\n            if (specContext.specColumns[r.role]) return null;\n            else return `Field ${r.role} is required.`;\n        }).concat(numeric.map((r)=>{\n            if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) return `Field ${r.role} must be quantitative.`;\n            else return null;\n        })).filter(Boolean);\n        return errors;\n    }\n    build() {\n        const { specContext: specContext  } = this;\n        const { facetLayout: facetLayout , specCapabilities: specCapabilities  } = this.props;\n        const { insight: insight , specColumns: specColumns , specViewOptions: specViewOptions  } = specContext;\n        const dataName = \"data_source\";\n        const { vegaSpec: vegaSpec , groupMark: groupMark  } = this.initSpec(dataName);\n        const { topColorField: topColorField , colorDataName: colorDataName  } = (0, $af92c5b6b1f801f6$export$4c4d9288a45f1fb3)({\n            scope: vegaSpec,\n            dataName: dataName,\n            specContext: specContext,\n            scaleName: (0, $ec270fbe8d9983b4$export$c9f17d36dfc40d76).Color,\n            legendDataName: \"data_legend\",\n            topLookupName: \"data_topcolorlookup\",\n            colorReverseSignalName: (0, $ec270fbe8d9983b4$export$809e371dee643808).ColorReverse\n        });\n        const globalScope = new (0, $f57e47af7971582e$export$5fdf684e73bb2de5)({\n            dataName: colorDataName,\n            markGroup: groupMark,\n            scope: vegaSpec,\n            signals: this.globalSignals\n        });\n        if (facetLayout) {\n            (0, $b15ad8fb3905384f$export$5346a0d8a9111b3f)(vegaSpec, {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingBottom,\n                update: `${facetLayout.facetPadding.bottom}`\n            }, {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingLeft,\n                update: `${facetLayout.facetPadding.left}`\n            }, {\n                name: (0, $ec270fbe8d9983b4$export$809e371dee643808).FacetPaddingTop,\n                update: `${facetLayout.facetPadding.top}`\n            });\n            this.globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n            this.globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n        }\n        const { firstScope: firstScope , finalScope: finalScope , specResult: specResult , allGlobalScales: allGlobalScales , allEncodingRules: allEncodingRules  } = this.iterateLayouts(globalScope, (i, innerScope)=>{\n            if (facetLayout && i === 0) globalScope.zSize = innerScope.offsets.h;\n        });\n        if (specResult) return specResult;\n        if (allGlobalScales.length > 0) {\n            const plotHeightOut = this.globalSignals.plotHeightOut.name;\n            const plotWidthOut = this.globalSignals.plotWidthOut.name;\n            const colTitleScale = {\n                type: \"linear\",\n                name: \"scale_facet_col_title\",\n                domain: [\n                    0,\n                    1\n                ],\n                range: [\n                    0,\n                    {\n                        signal: plotWidthOut\n                    }\n                ]\n            };\n            const rowTitleScale = {\n                type: \"linear\",\n                name: \"scale_facet_row_title\",\n                domain: [\n                    0,\n                    1\n                ],\n                range: [\n                    {\n                        signal: plotHeightOut\n                    },\n                    0\n                ]\n            };\n            let axesScopes = facetLayout ? (0, $af332f9d870ab775$export$9f0b19d6fd936707)({\n                globalScope: globalScope.scope,\n                plotScope: groupMark,\n                facetScope: firstScope,\n                colTitleScale: colTitleScale,\n                rowTitleScale: rowTitleScale,\n                colSeqName: \"data_FacetCellColTitles\",\n                rowSeqName: \"data_FacetCellRowTitles\"\n            }) : {\n                main: [\n                    {\n                        scope: groupMark,\n                        lines: true,\n                        labels: true,\n                        title: true\n                    }\n                ]\n            };\n            (0, $4414e2f92de0ee30$export$3678bfcfeaea7c36)({\n                globalScope: globalScope,\n                allGlobalScales: allGlobalScales,\n                axisScales: this.props.axisScales,\n                plotOffsetSignals: {\n                    x: this.globalSignals.plotOffsetLeft,\n                    y: this.globalSignals.plotOffsetBottom\n                },\n                axesOffsets: {\n                    x: (0, $17564e8cec2b9f75$export$3f5b554d51e74365),\n                    y: (0, $17564e8cec2b9f75$export$c33f11801bb18430)\n                },\n                axesTitlePadding: facetLayout ? {\n                    x: (0, $17564e8cec2b9f75$export$fd4a597070549ada),\n                    y: (0, $17564e8cec2b9f75$export$a26a082bf9fa4ca0)\n                } : {\n                    x: (0, $17564e8cec2b9f75$export$2e7279af2df830e3),\n                    y: (0, $17564e8cec2b9f75$export$f0388d9263db6e5f)\n                },\n                labelBaseline: {\n                    x: \"top\",\n                    y: \"middle\"\n                },\n                specColumns: specColumns,\n                specViewOptions: specViewOptions,\n                axesScopes: axesScopes,\n                faceted: !!facetLayout,\n                view: insight.view\n            });\n        }\n        //add mark to the final scope\n        if (finalScope.mark) {\n            const { update: update  } = finalScope.mark.encode;\n            const outputDataName = \"output\";\n            finalScope.mark.from.data = outputDataName;\n            (0, $b15ad8fb3905384f$export$6853292f627997e4)(globalScope.markGroup, {\n                name: outputDataName,\n                source: globalScope.markDataName,\n                transform: [\n                    {\n                        type: \"formula\",\n                        expr: finalScope.offsets.x,\n                        as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).OffsetX\n                    },\n                    {\n                        type: \"formula\",\n                        expr: finalScope.offsets.y,\n                        as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).OffsetY\n                    }\n                ]\n            });\n            update.x = {\n                field: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).OffsetX\n            };\n            update.y = {\n                field: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).OffsetY\n            };\n            allEncodingRules.forEach((map)=>{\n                for(let key in map)if (update[key]) {\n                    let arrIn = map[key];\n                    if (!Array.isArray(update[key])) {\n                        let value = update[key];\n                        let arrOut = [];\n                        update[key] = arrOut;\n                        arrIn.forEach((rule)=>arrOut.push(rule));\n                        arrOut.push(value);\n                    } else {\n                        let arrOut = update[key];\n                        arrIn.forEach((rule)=>arrOut.unshift(rule));\n                    }\n                }\n            });\n            update.fill = (0, $e4dd5cb1520ca850$export$9563e054e6f787fb)(specContext, topColorField, (0, $ec270fbe8d9983b4$export$c9f17d36dfc40d76).Color);\n            update.opacity = (0, $e4dd5cb1520ca850$export$c17a3be1057836e)(specContext);\n        }\n        return {\n            specCapabilities: specCapabilities,\n            vegaSpec: vegaSpec\n        };\n    }\n    initSpec(dataName) {\n        const { globalSignals: globalSignals  } = this;\n        const { minCellWidth: minCellWidth , minCellHeight: minCellHeight , plotOffsetLeft: plotOffsetLeft , plotOffsetBottom: plotOffsetBottom , plotOffsetTop: plotOffsetTop , plotOffsetRight: plotOffsetRight , plotHeightOut: plotHeightOut , plotWidthOut: plotWidthOut  } = globalSignals;\n        const { specContext: specContext  } = this;\n        const { insight: insight  } = specContext;\n        const groupMark = {\n            type: \"group\",\n            //style: 'cell',\n            encode: {\n                update: {\n                    x: {\n                        signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetLeft\n                    },\n                    y: {\n                        signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetTop\n                    },\n                    height: {\n                        signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightOut\n                    },\n                    width: {\n                        signal: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotWidthOut\n                    }\n                }\n            }\n        };\n        const inputDataname = \"input\";\n        const vegaSpec = {\n            $schema: \"https://vega.github.io/schema/vega/v5.json\",\n            //style: 'cell',\n            data: [\n                {\n                    name: inputDataname\n                },\n                {\n                    name: dataName,\n                    source: inputDataname,\n                    transform: []\n                }\n            ],\n            marks: [\n                groupMark\n            ],\n            signals: (0, $7b42c6682d6a3c62$export$d9407ec206a3236c)(specContext, (0, $ec270fbe8d9983b4$export$809e371dee643808).ViewportHeight).concat([\n                minCellWidth,\n                minCellHeight,\n                {\n                    name: (0, $ec270fbe8d9983b4$export$809e371dee643808).ViewportHeight,\n                    update: `max(${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellHeight}, ${insight.size.height})`\n                },\n                {\n                    name: (0, $ec270fbe8d9983b4$export$809e371dee643808).ViewportWidth,\n                    update: `max(${(0, $ec270fbe8d9983b4$export$809e371dee643808).MinCellWidth}, ${insight.size.width})`\n                },\n                plotOffsetLeft,\n                plotOffsetTop,\n                plotOffsetBottom,\n                plotOffsetRight,\n                {\n                    name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightIn,\n                    update: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).ViewportHeight} - ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetBottom}`\n                },\n                {\n                    name: (0, $ec270fbe8d9983b4$export$809e371dee643808).PlotWidthIn,\n                    update: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).ViewportWidth} - ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetLeft} - ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetRight}`\n                },\n                plotHeightOut,\n                plotWidthOut,\n                {\n                    name: \"height\",\n                    update: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetTop} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotHeightOut} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetBottom}`\n                },\n                {\n                    name: \"width\",\n                    update: `${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotWidthOut} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetLeft} + ${(0, $ec270fbe8d9983b4$export$809e371dee643808).PlotOffsetRight}`\n                }\n            ])\n        };\n        return {\n            vegaSpec: vegaSpec,\n            groupMark: groupMark\n        };\n    }\n    iterateLayouts(globalScope, onLayoutBuild) {\n        let specResult;\n        let parentScope = {\n            sizeSignals: globalScope.sizeSignals,\n            offsets: globalScope.offsets\n        };\n        let firstScope;\n        let childScope;\n        const groupings = [];\n        let { layouts: layouts , specCapabilities: specCapabilities  } = this.props;\n        const allGlobalScales = [];\n        const allEncodingRules = [];\n        for(let i = 0; i < layouts.length; i++){\n            if (!parentScope) continue;\n            let buildProps = {\n                globalScope: globalScope,\n                parentScope: parentScope,\n                axesScales: this.props.axisScales,\n                groupings: groupings,\n                id: i\n            };\n            let layout = this.createLayout(layouts[i], buildProps);\n            try {\n                childScope = layout.build();\n                childScope.id = i;\n                let groupby = layout.getGrouping();\n                if (groupby) groupings.push({\n                    id: i,\n                    groupby: groupby,\n                    fieldOps: [\n                        {\n                            field: null,\n                            op: \"count\",\n                            as: (0, $ec270fbe8d9983b4$export$10df5429b7082be2).Count\n                        }\n                    ]\n                });\n                let sumOp = layout.getAggregateSumOp();\n                if (sumOp) groupings[groupings.length - 1].fieldOps.push(sumOp);\n                onLayoutBuild(i, childScope);\n            } catch (e) {\n                specResult = {\n                    errors: [\n                        e.stack\n                    ],\n                    specCapabilities: specCapabilities,\n                    vegaSpec: null\n                };\n                break;\n            }\n            if (childScope && childScope.globalScales) allGlobalScales.push(childScope.globalScales);\n            if (childScope.encodingRuleMap) allEncodingRules.push(childScope.encodingRuleMap);\n            if (i === 0) firstScope = childScope;\n            parentScope = childScope;\n        }\n        return {\n            firstScope: firstScope,\n            finalScope: parentScope,\n            specResult: specResult,\n            allGlobalScales: allGlobalScales,\n            allEncodingRules: allEncodingRules\n        };\n    }\n    createLayout(layoutPair, buildProps) {\n        const { layoutType: layoutType , props: props  } = layoutPair;\n        const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n        const layoutClass = (0, $cc6302de00719d9e$export$8b2ec0ba67742226)[layoutType];\n        const layout = new layoutClass(layoutBuildProps);\n        layout.id = buildProps.id;\n        return layout;\n    }\n}\n\n\nfunction $7e9d31f0ccd4826a$export$3f8fe6489e95757d(specContext, currData) {\n    const { specColumns: specColumns  } = specContext;\n    const columns = [\n        specColumns.color,\n        specColumns.facet,\n        specColumns.facetV,\n        specColumns.group,\n        specColumns.size,\n        specColumns.sort,\n        specColumns.x,\n        specColumns.y,\n        specColumns.z\n    ];\n    (0, $ae86bb470afa6626$export$e04a97cc71178399)(columns, currData);\n    const specBuilderProps = (0, $81fdb423dd3f4d9b$export$104083a36c1647a7)(specContext);\n    const specBuilder = new (0, $afbd306f40f38f7e$export$e2e6dd2b1097c25b)(specBuilderProps, specContext);\n    let specResult;\n    if (specBuilder) {\n        try {\n            const errors = specBuilder.validate();\n            if (errors.length) specResult = {\n                errors: errors,\n                specCapabilities: specBuilderProps.specCapabilities,\n                vegaSpec: null\n            };\n            else specResult = specBuilder.build();\n        } catch (e) {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [\n                    e.stack\n                ]\n            };\n        }\n        if (!specResult.errors) {\n            const data0 = specResult.vegaSpec.data[0];\n            data0.values = currData;\n        }\n    } else specResult = {\n        specCapabilities: null,\n        vegaSpec: null,\n        errors: [\n            `could not build spec for ${specContext.insight.chart}`\n        ]\n    };\n    return specResult;\n}\n\n\n\n\nvar $e4267d04195b1ffa$exports = {};\n\n\nvar $b221d01211ecfc7e$exports = {};\n\n\n$parcel$exportWildcard($64958c10656c4cf5$exports, $7e9d31f0ccd4826a$exports);\n$parcel$exportWildcard($64958c10656c4cf5$exports, $ec270fbe8d9983b4$exports);\n$parcel$exportWildcard($64958c10656c4cf5$exports, $ae86bb470afa6626$exports);\n$parcel$exportWildcard($64958c10656c4cf5$exports, $e4267d04195b1ffa$exports);\n$parcel$exportWildcard($64958c10656c4cf5$exports, $b221d01211ecfc7e$exports);\n\n\nconst $4d0539c68a8de77f$export$5672246984822a29 = \"GL_ORDINAL\";\n\n\nvar $c2919c2894b0628c$exports = {};\nvar $93e9fd90e1c55c05$exports = {};\n\n$parcel$export($93e9fd90e1c55c05$exports, \"compareExpression\", () => $93e9fd90e1c55c05$export$4787a3c825f2af47);\n$parcel$export($93e9fd90e1c55c05$exports, \"compareGroup\", () => $93e9fd90e1c55c05$export$bc9dff9b0aa0e5b);\n$parcel$export($93e9fd90e1c55c05$exports, \"compare\", () => $93e9fd90e1c55c05$export$398604a469f7de9a);\n$parcel$export($93e9fd90e1c55c05$exports, \"startsWith\", () => $93e9fd90e1c55c05$export$68326237475e9a7d);\nvar $3d2ef5a685d44d00$exports = {};\n\n$parcel$export($3d2ef5a685d44d00$exports, \"isSearchExpressionGroup\", () => $3d2ef5a685d44d00$export$ab134d298d957272);\n$parcel$export($3d2ef5a685d44d00$exports, \"createGroupFromExpression\", () => $3d2ef5a685d44d00$export$cf32a499fcfecacd);\n$parcel$export($3d2ef5a685d44d00$exports, \"ensureSearchExpressionGroupArray\", () => $3d2ef5a685d44d00$export$b5d04ce3dd7ae29e);\nfunction $3d2ef5a685d44d00$export$ab134d298d957272(search) {\n    if (!search) return false;\n    return !!search.expressions;\n}\nfunction $3d2ef5a685d44d00$export$cf32a499fcfecacd(input) {\n    const output = {\n        expressions: [\n            input\n        ]\n    };\n    return output;\n}\nfunction $3d2ef5a685d44d00$export$b5d04ce3dd7ae29e(search) {\n    if (Array.isArray(search)) return [\n        ...search\n    ];\n    else if ($3d2ef5a685d44d00$export$ab134d298d957272(search)) return [\n        search\n    ];\n    else return [\n        $3d2ef5a685d44d00$export$cf32a499fcfecacd(search)\n    ];\n}\n\n\nconst $93e9fd90e1c55c05$var$expressionKeys = Object.keys({\n    clause: null,\n    name: null,\n    operator: null,\n    value: null\n});\nfunction $93e9fd90e1c55c05$export$4787a3c825f2af47(a, b) {\n    if (a && b) for(let k = 0; k < $93e9fd90e1c55c05$var$expressionKeys.length; k++){\n        let key = $93e9fd90e1c55c05$var$expressionKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    else return !a && !b;\n    return true;\n}\nconst $93e9fd90e1c55c05$var$groupKeys = Object.keys({\n    clause: null\n});\nfunction $93e9fd90e1c55c05$export$bc9dff9b0aa0e5b(a, b) {\n    for(let k = 0; k < $93e9fd90e1c55c05$var$groupKeys.length; k++){\n        let key = $93e9fd90e1c55c05$var$groupKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    if (!a.expressions && !b.expressions) return true;\n    if (!a.expressions || !b.expressions) return false;\n    if (a.expressions.length != b.expressions.length) return false;\n    for(let i = 0; i < a.expressions.length; i++){\n        if (!$93e9fd90e1c55c05$export$4787a3c825f2af47(a.expressions[i], b.expressions[i])) return false;\n    }\n    return true;\n}\nfunction $93e9fd90e1c55c05$export$398604a469f7de9a(a, b) {\n    if (a == b) return true;\n    if (!a || !b) return false;\n    let arrs = [\n        a,\n        b\n    ].map((0, $3d2ef5a685d44d00$export$b5d04ce3dd7ae29e));\n    let [arrA, arrB] = arrs;\n    if (arrA.length != arrB.length) return false;\n    for(let i = 0; i < arrA.length; i++){\n        if (!$93e9fd90e1c55c05$export$bc9dff9b0aa0e5b(arrA[i], arrB[i])) return false;\n    }\n    return true;\n}\nfunction $93e9fd90e1c55c05$export$68326237475e9a7d(whole, part) {\n    if (!part) return true;\n    let arrs = [\n        whole,\n        part\n    ].map((0, $3d2ef5a685d44d00$export$b5d04ce3dd7ae29e));\n    let [wholeArray, partArray] = arrs;\n    if (partArray.length > wholeArray.length) return false;\n    for(let i = 0; i < partArray.length; i++){\n        if (!$93e9fd90e1c55c05$export$bc9dff9b0aa0e5b(wholeArray[i], partArray[i])) return false;\n    }\n    return true;\n}\n\n\nvar $43c2526e199cbbfb$exports = {};\n\n$parcel$export($43c2526e199cbbfb$exports, \"Exec\", () => $43c2526e199cbbfb$export$bbfd672d43392844);\n\nfunction $43c2526e199cbbfb$var$valueToBoolean(value) {\n    if (typeof value === \"string\") switch(value.toLowerCase()){\n        case \"true\":\n            return true;\n        case \"false\":\n            return false;\n    }\n    return !!value;\n}\nfunction $43c2526e199cbbfb$var$valueToString(value) {\n    if (value == null) return \"\";\n    switch(typeof value){\n        case \"string\":\n            return value;\n        case \"boolean\":\n        case \"number\":\n            return value.toString();\n    }\n    return \"\";\n}\nfunction $43c2526e199cbbfb$var$isStringOperation(ex) {\n    switch(ex.operator){\n        case \"contains\":\n        case \"!contains\":\n        case \"starts\":\n        case \"!starts\":\n            return true;\n    }\n    return false;\n}\nfunction $43c2526e199cbbfb$var$isnullorEmpty(value) {\n    if (value == null) return true; //double equal sign to also catch undefined\n    if (typeof value === \"string\" && value.length === 0) return true;\n    return false;\n}\nclass $43c2526e199cbbfb$export$bbfd672d43392844 {\n    constructor(search, columns){\n        this.columns = columns;\n        this.groups = (0, $3d2ef5a685d44d00$export$b5d04ce3dd7ae29e)(search).map((g)=>{\n            const expressions = g.expressions.filter(Boolean);\n            expressions.forEach((ex)=>{\n                ex.column = this.getColumn(ex.name);\n                ex.valueBool = $43c2526e199cbbfb$var$valueToBoolean(ex.value);\n                ex.valueLow = $43c2526e199cbbfb$var$valueToString(ex.value).toLocaleLowerCase();\n                ex.stringOperation = $43c2526e199cbbfb$var$isStringOperation(ex);\n            });\n            const group = Object.assign(Object.assign({}, g), {\n                expressions: expressions\n            });\n            return group;\n        });\n    }\n    getColumn(name) {\n        for(let i = 0; i < this.columns.length; i++){\n            if (this.columns[i].name == name) return this.columns[i];\n        }\n    }\n    runExpressionOnColumn(datum, ex) {\n        const actualDataValue = datum[ex.name];\n        if (ex.operator === \"isnullorEmpty\") return $43c2526e199cbbfb$var$isnullorEmpty(actualDataValue);\n        else if (ex.operator === \"!isnullorEmpty\") return !$43c2526e199cbbfb$var$isnullorEmpty(actualDataValue);\n        let dataValue = actualDataValue;\n        let expressionValue = ex.value;\n        if (ex.column) {\n            if (ex.column.type === \"string\" || ex.stringOperation) {\n                dataValue = $43c2526e199cbbfb$var$valueToString(actualDataValue).toLocaleLowerCase();\n                expressionValue = ex.valueLow;\n            } else if (ex.column.type === \"boolean\") {\n                dataValue = $43c2526e199cbbfb$var$valueToBoolean(actualDataValue);\n                expressionValue = ex.valueBool;\n            } else if (ex.column.quantitative) {\n                dataValue = +actualDataValue;\n                expressionValue = +ex.value;\n            }\n        }\n        switch(ex.operator){\n            case \"!=\":\n                return dataValue != expressionValue;\n            case \"<\":\n                return dataValue < expressionValue;\n            case \"<=\":\n                return dataValue <= expressionValue;\n            case \"==\":\n                return dataValue == expressionValue;\n            case \">\":\n                return dataValue > expressionValue;\n            case \">=\":\n                return dataValue >= expressionValue;\n            case \"contains\":\n                return dataValue.indexOf(expressionValue) >= 0;\n            case \"!contains\":\n                return dataValue.indexOf(expressionValue) < 0;\n            case \"starts\":\n                return dataValue.indexOf(expressionValue) == 0;\n            case \"!starts\":\n                return dataValue.indexOf(expressionValue) !== 0;\n        }\n    }\n    runExpression(datum, ex) {\n        if (ex.name == null) {\n            //run on all columns\n            const group = {\n                expressions: this.columns.map((column, i)=>{\n                    const ex2 = Object.assign(Object.assign({}, ex), {\n                        column: column,\n                        name: column.name\n                    });\n                    if (i) ex2.clause = \"||\";\n                    return ex2;\n                })\n            };\n            return this.runGroup(datum, group);\n        } else return this.runExpressionOnColumn(datum, ex);\n    }\n    runGroup(datum, group) {\n        let accumulator = this.runExpression(datum, group.expressions[0]);\n        for(let i = 1; i < group.expressions.length; i++){\n            let ex = group.expressions[i];\n            switch(ex.clause){\n                case \"&&\":\n                    accumulator = accumulator && this.runExpression(datum, ex);\n                    break;\n                case \"||\":\n                    accumulator = accumulator || this.runExpression(datum, ex);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n    run(datum) {\n        let accumulator = this.runGroup(datum, this.groups[0]);\n        for(let i = 1; i < this.groups.length; i++){\n            let group = this.groups[i];\n            switch(group.clause){\n                case \"&&\":\n                    accumulator = accumulator && this.runGroup(datum, group);\n                    break;\n                case \"||\":\n                    accumulator = accumulator || this.runGroup(datum, group);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n}\n\n\n\nvar $29d69ef6542a87a4$exports = {};\n\n$parcel$export($29d69ef6542a87a4$exports, \"invert\", () => $29d69ef6542a87a4$export$6897c284b6f9f4dc);\n\nfunction $29d69ef6542a87a4$var$invertSearchExpressionGroup(input) {\n    //this only works if all expressions in this group have the same clause\n    const output = {\n        expressions: input.expressions.map($29d69ef6542a87a4$var$invertSearchExpression)\n    };\n    if (input.clause) output.clause = $29d69ef6542a87a4$var$invertedClauses[input.clause];\n    return output;\n}\nconst $29d69ef6542a87a4$var$invertedOperators = {\n    \"!=\": \"==\",\n    \"==\": \"!=\",\n    \"<\": \">=\",\n    \">=\": \"<\",\n    \"<=\": \">\",\n    \">\": \"<=\",\n    \"!contains\": \"contains\",\n    \"contains\": \"!contains\",\n    \"!isnullorEmpty\": \"isnullorEmpty\",\n    \"isnullorEmpty\": \"!isnullorEmpty\",\n    \"!starts\": \"starts\",\n    \"starts\": \"!starts\"\n};\nconst $29d69ef6542a87a4$var$invertedClauses = {\n    \"&&\": \"||\",\n    \"||\": \"&&\"\n};\nfunction $29d69ef6542a87a4$var$invertSearchExpression(input) {\n    const operator = $29d69ef6542a87a4$var$invertedOperators[input.operator];\n    const output = Object.assign(Object.assign({}, input), {\n        operator: operator\n    });\n    if (input.clause) output.clause = $29d69ef6542a87a4$var$invertedClauses[input.clause];\n    return output;\n}\nfunction $29d69ef6542a87a4$export$6897c284b6f9f4dc(search) {\n    if (Array.isArray(search)) return search.map($29d69ef6542a87a4$var$invertSearchExpressionGroup);\n    else if ((0, $3d2ef5a685d44d00$export$ab134d298d957272)(search)) return $29d69ef6542a87a4$var$invertSearchExpressionGroup(search);\n    else return $29d69ef6542a87a4$var$invertSearchExpression(search);\n}\n\n\nvar $8cda325438b8cb6f$exports = {};\n\n$parcel$export($8cda325438b8cb6f$exports, \"narrow\", () => $8cda325438b8cb6f$export$ec67f55c222e1546);\n\nfunction $8cda325438b8cb6f$export$ec67f55c222e1546(a, b) {\n    if (!a) return b;\n    let arrs = [\n        a,\n        b\n    ].map((0, $3d2ef5a685d44d00$export$b5d04ce3dd7ae29e));\n    let [arrA, arrB] = arrs;\n    arrB[0].clause = \"&&\";\n    return arrA.concat(arrB);\n}\n\n\nvar $f3440c53f21713dc$exports = {};\n\n\n$parcel$exportWildcard($c2919c2894b0628c$exports, $93e9fd90e1c55c05$exports);\n$parcel$exportWildcard($c2919c2894b0628c$exports, $43c2526e199cbbfb$exports);\n$parcel$exportWildcard($c2919c2894b0628c$exports, $3d2ef5a685d44d00$exports);\n$parcel$exportWildcard($c2919c2894b0628c$exports, $29d69ef6542a87a4$exports);\n$parcel$exportWildcard($c2919c2894b0628c$exports, $8cda325438b8cb6f$exports);\n$parcel$exportWildcard($c2919c2894b0628c$exports, $f3440c53f21713dc$exports);\n\n\n\nvar $60e01fcba935f9e9$exports = {};\n\n\nvar $944bef2715b44399$exports = {};\n\n$parcel$export($944bef2715b44399$exports, \"isInternalFieldName\", () => $944bef2715b44399$export$81adea670bebefbe);\n$parcel$export($944bef2715b44399$exports, \"getColumnsFromData\", () => $ae86bb470afa6626$export$3f19ad07848df794);\n$parcel$export($944bef2715b44399$exports, \"getStats\", () => $ae86bb470afa6626$export$432f698644f45d1);\n$parcel$export($944bef2715b44399$exports, \"inferAll\", () => $ae86bb470afa6626$export$e04a97cc71178399);\n$parcel$export($944bef2715b44399$exports, \"getPresenterStyle\", () => $74c2763994d75bb8$export$c4db461e5e345a8);\n\n\nvar $f80f7eb4951011b9$exports = {};\n\n$parcel$export($f80f7eb4951011b9$exports, \"base\", () => $975e8617bd73ab77$export$e2253033e6e1df16);\n$parcel$export($f80f7eb4951011b9$exports, \"use\", () => $975e8617bd73ab77$export$1f96ae73734a86cc);\n$parcel$export($f80f7eb4951011b9$exports, \"Presenter\", () => $61fffe029a7d3e23$export$893c88c42e3630f9);\n$parcel$export($f80f7eb4951011b9$exports, \"ViewGl\", () => $ba8a128a941ed656$export$6d8f9057dcd7f9e6);\n$parcel$export($f80f7eb4951011b9$exports, \"constants\", () => $f3d4039a9d780933$exports);\n$parcel$export($f80f7eb4951011b9$exports, \"controls\", () => $4abdd534baaa0892$exports);\n$parcel$export($f80f7eb4951011b9$exports, \"defaults\", () => $cb224439f6a2e69c$exports);\n$parcel$export($f80f7eb4951011b9$exports, \"types\", () => $eeab165cadcca29f$exports);\n$parcel$export($f80f7eb4951011b9$exports, \"util\", () => $fc1d5f246c786135$exports);\nvar $f3d4039a9d780933$exports = {};\n\n$parcel$export($f3d4039a9d780933$exports, \"layerNames\", () => $f3d4039a9d780933$export$5792b81513a80aca);\nconst $f3d4039a9d780933$export$5792b81513a80aca = {\n    cubes: \"LAYER_CUBES\",\n    lines: \"LAYER_LINES\",\n    text: \"LAYER_TEXT\",\n    paths: \"LAYER_PATHS\",\n    polygons: \"LAYER_POLYGONS\"\n};\n\n\nvar $4abdd534baaa0892$exports = {};\n\n$parcel$export($4abdd534baaa0892$exports, \"Table\", () => $30be071d2984c290$export$54ec01a60f47d33d);\nvar $bf3f59d98a415f34$exports = {};\n\"use strict\";\n\n$bf3f59d98a415f34$exports = (parcelRequire(\"jN9Lg\"));\n\n\nvar $52d0f26b0cd45e4e$exports = {};\n\n$52d0f26b0cd45e4e$exports = (parcelRequire(\"7UTS5\"));\n\n\nconst $5feb58fe75c7f837$var$htmlTagArray = $bf3f59d98a415f34$exports.default || $bf3f59d98a415f34$exports;\nconst $5feb58fe75c7f837$var$svgTagArray = $52d0f26b0cd45e4e$exports.default || $52d0f26b0cd45e4e$exports;\n/**\n * Decamelizes a string with/without a custom separator (hyphen by default).\n * from: https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript\n *\n * @param str String in camelcase\n * @param separator Separator for the new decamelized string.\n */ function $5feb58fe75c7f837$var$decamelize(str, separator = \"-\") {\n    return str.replace(/([a-z\\d])([A-Z])/g, \"$1\" + separator + \"$2\").replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, \"$1\" + separator + \"$2\").toLowerCase();\n}\nfunction $5feb58fe75c7f837$export$c8a8987d4410bf2d(tag, attrs, ...children) {\n    if (typeof tag === \"function\") {\n        const fn = tag;\n        const props = attrs;\n        props.children = children;\n        return fn(props);\n    } else {\n        const ns = $5feb58fe75c7f837$var$tagNamespace(tag);\n        const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n        const map = attrs;\n        let ref;\n        for(let name in map)if (name && map.hasOwnProperty(name)) {\n            let value = map[name];\n            if (name === \"className\" && value !== void 0) $5feb58fe75c7f837$var$setAttribute(el, ns, \"class\", value.toString());\n            else if (name === \"disabled\" && !value) ;\n            else if (value === null || value === undefined) continue;\n            else if (value === true) $5feb58fe75c7f837$var$setAttribute(el, ns, name, name);\n            else if (typeof value === \"function\") {\n                if (name === \"ref\") ref = value;\n                else el[name.toLowerCase()] = value;\n            } else if (typeof value === \"object\") $5feb58fe75c7f837$var$setAttribute(el, ns, name, $5feb58fe75c7f837$var$flatten(value));\n            else $5feb58fe75c7f837$var$setAttribute(el, ns, name, value.toString());\n        }\n        if (children && children.length > 0) $5feb58fe75c7f837$var$appendChildren(el, children);\n        if (ref) ref(el);\n        return el;\n    }\n}\nfunction $5feb58fe75c7f837$var$setAttribute(el, ns, name, value) {\n    if (ns) el.setAttributeNS(null, name, value);\n    else el.setAttribute(name, value);\n}\nfunction $5feb58fe75c7f837$var$flatten(o) {\n    const arr = [];\n    for(let prop in o)arr.push(`${$5feb58fe75c7f837$var$decamelize(prop, \"-\")}:${o[prop]}`);\n    return arr.join(\";\");\n}\nfunction $5feb58fe75c7f837$export$59da04d16460addd(parentElement, child) {\n    if (child === null || child === undefined || typeof child === \"boolean\") return;\n    else if (Array.isArray(child)) $5feb58fe75c7f837$var$appendChildren(parentElement, child);\n    else if ($5feb58fe75c7f837$var$isElement(child)) parentElement.appendChild(child);\n    else parentElement.appendChild(document.createTextNode(child.toString()));\n}\nfunction $5feb58fe75c7f837$var$appendChildren(parentElement, children) {\n    children.forEach((child)=>$5feb58fe75c7f837$export$59da04d16460addd(parentElement, child));\n}\nfunction $5feb58fe75c7f837$var$isElement(el) {\n    //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n    return !!el.nodeType;\n}\nfunction $5feb58fe75c7f837$export$186d02efde07ef98(element, container) {\n    container.innerHTML = \"\";\n    if (element) $5feb58fe75c7f837$export$59da04d16460addd(container, element);\n}\nfunction $5feb58fe75c7f837$export$d0bfd83e3f838e5e(childPositions, container) {\n    let element = container || document.body;\n    let childPosition;\n    while(element && childPositions.length){\n        childPosition = childPositions.shift();\n        element = element.children.item(childPosition);\n    }\n    if (element) return element;\n}\nfunction $5feb58fe75c7f837$export$8a664f09713ad850(element, activeElementInfo) {\n    element.focus();\n    element.scrollTop = activeElementInfo.scrollTop;\n    const input = element;\n    if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n}\nfunction $5feb58fe75c7f837$export$7d007ff58288f238(activeElementInfo, container) {\n    if (activeElementInfo) {\n        const element = $5feb58fe75c7f837$export$d0bfd83e3f838e5e(activeElementInfo.childPositions, container);\n        if (element) $5feb58fe75c7f837$export$8a664f09713ad850(element, activeElementInfo);\n    }\n}\nfunction $5feb58fe75c7f837$export$5ec2c407fb44f02(container) {\n    let element = document.activeElement;\n    const { scrollTop: scrollTop , selectionDirection: selectionDirection , selectionEnd: selectionEnd , selectionStart: selectionStart  } = element;\n    const activeElementInfo = {\n        childPositions: [],\n        scrollTop: scrollTop,\n        selectionDirection: selectionDirection,\n        selectionEnd: selectionEnd,\n        selectionStart: selectionStart\n    };\n    while(element && element !== document.body && element !== container){\n        activeElementInfo.childPositions.unshift($5feb58fe75c7f837$var$getChildPosition(element));\n        element = element.parentElement;\n    }\n    if ((element === document.body || element === container) && activeElementInfo.childPositions.length) return activeElementInfo;\n}\nfunction $5feb58fe75c7f837$var$getChildPosition(element) {\n    let childPosition = 0;\n    while(element = element.previousElementSibling)childPosition++;\n    return childPosition;\n}\nfunction $5feb58fe75c7f837$var$tagNamespace(tag) {\n    //issue: this won't disambiguate certain tags which exist in both svg and html: <a>, <title> ...\n    if (tag === \"svg\" || $5feb58fe75c7f837$var$svgTagArray.indexOf(tag) >= 0 && !($5feb58fe75c7f837$var$htmlTagArray.indexOf(tag) >= 0)) return \"http://www.w3.org/2000/svg\";\n}\n\n\nconst $30be071d2984c290$export$ec835b702d42f3f0 = {\n    ENTER: \"Enter\"\n};\nconst $30be071d2984c290$export$54ec01a60f47d33d = (props)=>{\n    return (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"table\", {\n        className: props.className\n    }, props.children, props.rows.map((row, i)=>(0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"tr\", {\n            className: props.rowClassName || \"\",\n            onClick: (e)=>props.onRowClick && props.onRowClick(e, i),\n            tabIndex: props.onRowClick ? 0 : -1,\n            onKeyUp: (e)=>{\n                if (e.key === $30be071d2984c290$export$ec835b702d42f3f0.ENTER && props.onRowClick) props.onRowClick(e, i);\n            }\n        }, row.cells.map((cell, i)=>(0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"td\", {\n                className: cell.className || \"\",\n                title: cell.title || \"\"\n            }, cell.content)))));\n};\n\n\n\n\nvar $eeab165cadcca29f$exports = {};\n\n\nvar $fc1d5f246c786135$exports = {};\n\n$parcel$export($fc1d5f246c786135$exports, \"addDiv\", () => $64c4757e43ed27a4$export$6758c6c7563dc60e);\n$parcel$export($fc1d5f246c786135$exports, \"addEl\", () => $64c4757e43ed27a4$export$3ca29736d56b698a);\n$parcel$export($fc1d5f246c786135$exports, \"allTruthy\", () => $0c3b0860ccac235e$export$84af6d08e329f176);\n$parcel$export($fc1d5f246c786135$exports, \"clone\", () => $bde658c1f00fc2a5$export$9cd59f9826255e47);\n$parcel$export($fc1d5f246c786135$exports, \"colorFromString\", () => $88689deb35cd627d$export$78ed65bc9abd64b1);\n$parcel$export($fc1d5f246c786135$exports, \"colorIsEqual\", () => $88689deb35cd627d$export$7da6ac10e55d4f2a);\n$parcel$export($fc1d5f246c786135$exports, \"colorToString\", () => $88689deb35cd627d$export$f86d83653e5a505e);\n$parcel$export($fc1d5f246c786135$exports, \"concat\", () => $0c3b0860ccac235e$export$ee1b3e54f0441b22);\n$parcel$export($fc1d5f246c786135$exports, \"createElement\", () => $5feb58fe75c7f837$export$c8a8987d4410bf2d);\n$parcel$export($fc1d5f246c786135$exports, \"deepMerge\", () => $bde658c1f00fc2a5$export$6969335ea1e4e77c);\n$parcel$export($fc1d5f246c786135$exports, \"desaturate\", () => $88689deb35cd627d$export$fb75607d98509d9);\n$parcel$export($fc1d5f246c786135$exports, \"getActiveElementInfo\", () => $5feb58fe75c7f837$export$5ec2c407fb44f02);\n$parcel$export($fc1d5f246c786135$exports, \"getCubeLayer\", () => $2ce9d49664bfe8f3$export$ccecd364047ec381);\n$parcel$export($fc1d5f246c786135$exports, \"getCubes\", () => $2ce9d49664bfe8f3$export$fa1ee03f26227b34);\n$parcel$export($fc1d5f246c786135$exports, \"mount\", () => $5feb58fe75c7f837$export$186d02efde07ef98);\n$parcel$export($fc1d5f246c786135$exports, \"outerSize\", () => $64c4757e43ed27a4$export$7642631117982e98);\n$parcel$export($fc1d5f246c786135$exports, \"push\", () => $0c3b0860ccac235e$export$4cbf152802aa238);\n$parcel$export($fc1d5f246c786135$exports, \"setActiveElement\", () => $5feb58fe75c7f837$export$7d007ff58288f238);\nfunction $0c3b0860ccac235e$export$ee1b3e54f0441b22(...args) {\n    return args.reduce((p, c)=>c ? p.concat(c) : p, []);\n}\nfunction $0c3b0860ccac235e$export$84af6d08e329f176(...args) {\n    return args.reduce((p, c)=>c ? p.concat(c) : p, []).filter(Boolean);\n}\nfunction $0c3b0860ccac235e$export$4cbf152802aa238(arr, items) {\n    arr.push.apply(arr, items);\n}\n\n\nfunction $64c4757e43ed27a4$export$3ca29736d56b698a(tagName, parentElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n}\nfunction $64c4757e43ed27a4$export$6758c6c7563dc60e(parentElement, className) {\n    const div = $64c4757e43ed27a4$export$3ca29736d56b698a(\"div\", parentElement);\n    if (className) div.className = className;\n    return div;\n}\nfunction $64c4757e43ed27a4$export$7642631117982e98(el) {\n    const cs = getComputedStyle(el);\n    const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return {\n        height: height,\n        width: width\n    };\n}\n\n\nvar $06c489908d03dca5$exports = {};\n\n$parcel$defineInteropFlag($06c489908d03dca5$exports);\n\n$parcel$export($06c489908d03dca5$exports, \"default\", () => $06c489908d03dca5$export$2e2bcd8739ae039);\nvar $06c489908d03dca5$var$isMergeableObject = function isMergeableObject(value) {\n    return $06c489908d03dca5$var$isNonNullObject(value) && !$06c489908d03dca5$var$isSpecial(value);\n};\nfunction $06c489908d03dca5$var$isNonNullObject(value) {\n    return !!value && typeof value === \"object\";\n}\nfunction $06c489908d03dca5$var$isSpecial(value) {\n    var stringValue = Object.prototype.toString.call(value);\n    return stringValue === \"[object RegExp]\" || stringValue === \"[object Date]\" || $06c489908d03dca5$var$isReactElement(value);\n}\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar $06c489908d03dca5$var$canUseSymbol = typeof Symbol === \"function\" && Symbol.for;\nvar $06c489908d03dca5$var$REACT_ELEMENT_TYPE = $06c489908d03dca5$var$canUseSymbol ? Symbol.for(\"react.element\") : 0xeac7;\nfunction $06c489908d03dca5$var$isReactElement(value) {\n    return value.$$typeof === $06c489908d03dca5$var$REACT_ELEMENT_TYPE;\n}\nfunction $06c489908d03dca5$var$emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n}\nfunction $06c489908d03dca5$var$cloneUnlessOtherwiseSpecified(value, options) {\n    return options.clone !== false && options.isMergeableObject(value) ? $06c489908d03dca5$var$deepmerge($06c489908d03dca5$var$emptyTarget(value), value, options) : value;\n}\nfunction $06c489908d03dca5$var$defaultArrayMerge(target, source, options) {\n    return target.concat(source).map(function(element) {\n        return $06c489908d03dca5$var$cloneUnlessOtherwiseSpecified(element, options);\n    });\n}\nfunction $06c489908d03dca5$var$mergeObject(target, source, options) {\n    var destination = {};\n    if (options.isMergeableObject(target)) Object.keys(target).forEach(function(key) {\n        destination[key] = $06c489908d03dca5$var$cloneUnlessOtherwiseSpecified(target[key], options);\n    });\n    Object.keys(source).forEach(function(key) {\n        if (!options.isMergeableObject(source[key]) || !target[key]) destination[key] = $06c489908d03dca5$var$cloneUnlessOtherwiseSpecified(source[key], options);\n        else destination[key] = $06c489908d03dca5$var$deepmerge(target[key], source[key], options);\n    });\n    return destination;\n}\nfunction $06c489908d03dca5$var$deepmerge(target, source, options) {\n    options = options || {};\n    options.arrayMerge = options.arrayMerge || $06c489908d03dca5$var$defaultArrayMerge;\n    options.isMergeableObject = options.isMergeableObject || $06c489908d03dca5$var$isMergeableObject;\n    var sourceIsArray = Array.isArray(source);\n    var targetIsArray = Array.isArray(target);\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n    if (!sourceAndTargetTypesMatch) return $06c489908d03dca5$var$cloneUnlessOtherwiseSpecified(source, options);\n    else if (sourceIsArray) return options.arrayMerge(target, source, options);\n    else return $06c489908d03dca5$var$mergeObject(target, source, options);\n}\n$06c489908d03dca5$var$deepmerge.all = function deepmergeAll(array, options) {\n    if (!Array.isArray(array)) throw new Error(\"first argument should be an array\");\n    return array.reduce(function(prev, next) {\n        return $06c489908d03dca5$var$deepmerge(prev, next, options);\n    }, {});\n};\nvar $06c489908d03dca5$var$deepmerge_1 = $06c489908d03dca5$var$deepmerge;\nvar $06c489908d03dca5$export$2e2bcd8739ae039 = $06c489908d03dca5$var$deepmerge_1;\n\n\nconst $bde658c1f00fc2a5$var$deepmerge = $06c489908d03dca5$exports.default || $06c489908d03dca5$exports;\nfunction $bde658c1f00fc2a5$export$9cd59f9826255e47(objectToClone) {\n    if (!objectToClone) return objectToClone;\n    return $bde658c1f00fc2a5$var$deepmerge.all([\n        objectToClone\n    ]);\n}\nconst $bde658c1f00fc2a5$var$dontMerge = (destination, source)=>source;\nfunction $bde658c1f00fc2a5$export$6969335ea1e4e77c(...objectsToMerge) {\n    const objects = objectsToMerge.filter(Boolean);\n    return $bde658c1f00fc2a5$var$deepmerge.all(objects, {\n        arrayMerge: $bde658c1f00fc2a5$var$dontMerge\n    });\n}\n\n\nfunction $74b9dd4e6ea088ae$export$2e2bcd8739ae039(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n}\nfunction $74b9dd4e6ea088ae$export$8b58be045bf06082(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n\nfunction $c0343f20bfecc638$export$892596cec99bc70e() {}\nvar $c0343f20bfecc638$export$4adafc6ed0600c10 = 0.7;\nvar $c0343f20bfecc638$export$9eace2cc0d12c98d = 1 / $c0343f20bfecc638$export$4adafc6ed0600c10;\nvar $c0343f20bfecc638$var$reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", $c0343f20bfecc638$var$reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", $c0343f20bfecc638$var$reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", $c0343f20bfecc638$var$reHex = /^#([0-9a-f]{3,8})$/, $c0343f20bfecc638$var$reRgbInteger = new RegExp(\"^rgb\\\\(\" + [\n    $c0343f20bfecc638$var$reI,\n    $c0343f20bfecc638$var$reI,\n    $c0343f20bfecc638$var$reI\n] + \"\\\\)$\"), $c0343f20bfecc638$var$reRgbPercent = new RegExp(\"^rgb\\\\(\" + [\n    $c0343f20bfecc638$var$reP,\n    $c0343f20bfecc638$var$reP,\n    $c0343f20bfecc638$var$reP\n] + \"\\\\)$\"), $c0343f20bfecc638$var$reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [\n    $c0343f20bfecc638$var$reI,\n    $c0343f20bfecc638$var$reI,\n    $c0343f20bfecc638$var$reI,\n    $c0343f20bfecc638$var$reN\n] + \"\\\\)$\"), $c0343f20bfecc638$var$reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [\n    $c0343f20bfecc638$var$reP,\n    $c0343f20bfecc638$var$reP,\n    $c0343f20bfecc638$var$reP,\n    $c0343f20bfecc638$var$reN\n] + \"\\\\)$\"), $c0343f20bfecc638$var$reHslPercent = new RegExp(\"^hsl\\\\(\" + [\n    $c0343f20bfecc638$var$reN,\n    $c0343f20bfecc638$var$reP,\n    $c0343f20bfecc638$var$reP\n] + \"\\\\)$\"), $c0343f20bfecc638$var$reHslaPercent = new RegExp(\"^hsla\\\\(\" + [\n    $c0343f20bfecc638$var$reN,\n    $c0343f20bfecc638$var$reP,\n    $c0343f20bfecc638$var$reP,\n    $c0343f20bfecc638$var$reN\n] + \"\\\\)$\");\nvar $c0343f20bfecc638$var$named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, $74b9dd4e6ea088ae$export$2e2bcd8739ae039)($c0343f20bfecc638$export$892596cec99bc70e, $c0343f20bfecc638$export$2e2bcd8739ae039, {\n    copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable: function() {\n        return this.rgb().displayable();\n    },\n    hex: $c0343f20bfecc638$var$color_formatHex,\n    formatHex: $c0343f20bfecc638$var$color_formatHex,\n    formatHsl: $c0343f20bfecc638$var$color_formatHsl,\n    formatRgb: $c0343f20bfecc638$var$color_formatRgb,\n    toString: $c0343f20bfecc638$var$color_formatRgb\n});\nfunction $c0343f20bfecc638$var$color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction $c0343f20bfecc638$var$color_formatHsl() {\n    return $c0343f20bfecc638$export$8133dc3fa904d6d1(this).formatHsl();\n}\nfunction $c0343f20bfecc638$var$color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction $c0343f20bfecc638$export$2e2bcd8739ae039(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = $c0343f20bfecc638$var$reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? $c0343f20bfecc638$var$rgbn(m) // #ff0000\n     : l === 3 ? new $c0343f20bfecc638$export$5e05a94393ac29e3(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? $c0343f20bfecc638$var$rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? $c0343f20bfecc638$var$rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = $c0343f20bfecc638$var$reRgbInteger.exec(format)) ? new $c0343f20bfecc638$export$5e05a94393ac29e3(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = $c0343f20bfecc638$var$reRgbPercent.exec(format)) ? new $c0343f20bfecc638$export$5e05a94393ac29e3(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = $c0343f20bfecc638$var$reRgbaInteger.exec(format)) ? $c0343f20bfecc638$var$rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = $c0343f20bfecc638$var$reRgbaPercent.exec(format)) ? $c0343f20bfecc638$var$rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = $c0343f20bfecc638$var$reHslPercent.exec(format)) ? $c0343f20bfecc638$var$hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = $c0343f20bfecc638$var$reHslaPercent.exec(format)) ? $c0343f20bfecc638$var$hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : $c0343f20bfecc638$var$named.hasOwnProperty(format) ? $c0343f20bfecc638$var$rgbn($c0343f20bfecc638$var$named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new $c0343f20bfecc638$export$5e05a94393ac29e3(NaN, NaN, NaN, 0) : null;\n}\nfunction $c0343f20bfecc638$var$rgbn(n) {\n    return new $c0343f20bfecc638$export$5e05a94393ac29e3(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction $c0343f20bfecc638$var$rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new $c0343f20bfecc638$export$5e05a94393ac29e3(r, g, b, a);\n}\nfunction $c0343f20bfecc638$export$42da0a331c2802f5(o) {\n    if (!(o instanceof $c0343f20bfecc638$export$892596cec99bc70e)) o = $c0343f20bfecc638$export$2e2bcd8739ae039(o);\n    if (!o) return new $c0343f20bfecc638$export$5e05a94393ac29e3;\n    o = o.rgb();\n    return new $c0343f20bfecc638$export$5e05a94393ac29e3(o.r, o.g, o.b, o.opacity);\n}\nfunction $c0343f20bfecc638$export$8972dc0e6ad9238f(r, g, b, opacity) {\n    return arguments.length === 1 ? $c0343f20bfecc638$export$42da0a331c2802f5(r) : new $c0343f20bfecc638$export$5e05a94393ac29e3(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction $c0343f20bfecc638$export$5e05a94393ac29e3(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, $74b9dd4e6ea088ae$export$2e2bcd8739ae039)($c0343f20bfecc638$export$5e05a94393ac29e3, $c0343f20bfecc638$export$8972dc0e6ad9238f, (0, $74b9dd4e6ea088ae$export$8b58be045bf06082)($c0343f20bfecc638$export$892596cec99bc70e, {\n    brighter: function(k) {\n        k = k == null ? $c0343f20bfecc638$export$9eace2cc0d12c98d : Math.pow($c0343f20bfecc638$export$9eace2cc0d12c98d, k);\n        return new $c0343f20bfecc638$export$5e05a94393ac29e3(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? $c0343f20bfecc638$export$4adafc6ed0600c10 : Math.pow($c0343f20bfecc638$export$4adafc6ed0600c10, k);\n        return new $c0343f20bfecc638$export$5e05a94393ac29e3(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb: function() {\n        return this;\n    },\n    displayable: function() {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: $c0343f20bfecc638$var$rgb_formatHex,\n    formatHex: $c0343f20bfecc638$var$rgb_formatHex,\n    formatRgb: $c0343f20bfecc638$var$rgb_formatRgb,\n    toString: $c0343f20bfecc638$var$rgb_formatRgb\n}));\nfunction $c0343f20bfecc638$var$rgb_formatHex() {\n    return \"#\" + $c0343f20bfecc638$var$hex(this.r) + $c0343f20bfecc638$var$hex(this.g) + $c0343f20bfecc638$var$hex(this.b);\n}\nfunction $c0343f20bfecc638$var$rgb_formatRgb() {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction $c0343f20bfecc638$var$hex(value) {\n    value = Math.max(0, Math.min(255, Math.round(value) || 0));\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction $c0343f20bfecc638$var$hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new $c0343f20bfecc638$var$Hsl(h, s, l, a);\n}\nfunction $c0343f20bfecc638$export$8133dc3fa904d6d1(o) {\n    if (o instanceof $c0343f20bfecc638$var$Hsl) return new $c0343f20bfecc638$var$Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof $c0343f20bfecc638$export$892596cec99bc70e)) o = $c0343f20bfecc638$export$2e2bcd8739ae039(o);\n    if (!o) return new $c0343f20bfecc638$var$Hsl;\n    if (o instanceof $c0343f20bfecc638$var$Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new $c0343f20bfecc638$var$Hsl(h, s, l, o.opacity);\n}\nfunction $c0343f20bfecc638$export$8f4a7c0bb78e6ea8(h, s, l, opacity) {\n    return arguments.length === 1 ? $c0343f20bfecc638$export$8133dc3fa904d6d1(h) : new $c0343f20bfecc638$var$Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction $c0343f20bfecc638$var$Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, $74b9dd4e6ea088ae$export$2e2bcd8739ae039)($c0343f20bfecc638$var$Hsl, $c0343f20bfecc638$export$8f4a7c0bb78e6ea8, (0, $74b9dd4e6ea088ae$export$8b58be045bf06082)($c0343f20bfecc638$export$892596cec99bc70e, {\n    brighter: function(k) {\n        k = k == null ? $c0343f20bfecc638$export$9eace2cc0d12c98d : Math.pow($c0343f20bfecc638$export$9eace2cc0d12c98d, k);\n        return new $c0343f20bfecc638$var$Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? $c0343f20bfecc638$export$4adafc6ed0600c10 : Math.pow($c0343f20bfecc638$export$4adafc6ed0600c10, k);\n        return new $c0343f20bfecc638$var$Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new $c0343f20bfecc638$export$5e05a94393ac29e3($c0343f20bfecc638$var$hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), $c0343f20bfecc638$var$hsl2rgb(h, m1, m2), $c0343f20bfecc638$var$hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl: function() {\n        var a = this.opacity;\n        a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */ function $c0343f20bfecc638$var$hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n\n\nfunction $88689deb35cd627d$var$rgbToDeckglColor(c) {\n    return [\n        c.r,\n        c.g,\n        c.b,\n        c.opacity * 255\n    ];\n}\nfunction $88689deb35cd627d$export$7da6ac10e55d4f2a(a, b) {\n    if (a.length !== b.length) return false;\n    for(let i = 0; i < a.length; i++){\n        if (a[i] !== b[i]) return false;\n    }\n    return true;\n}\nfunction $88689deb35cd627d$export$78ed65bc9abd64b1(cssColorSpecifier) {\n    if (cssColorSpecifier) {\n        const dc = (0, $c0343f20bfecc638$export$2e2bcd8739ae039)(cssColorSpecifier);\n        if (dc) {\n            const c = dc.rgb();\n            return $88689deb35cd627d$var$rgbToDeckglColor(c);\n        }\n    }\n}\nfunction $88689deb35cd627d$export$f86d83653e5a505e(color) {\n    const c = [\n        ...color\n    ];\n    if (c.length > 3) c[3] /= 255;\n    return `rgba(${c.join(\",\")})`;\n}\nfunction $88689deb35cd627d$export$fb75607d98509d9(color, value) {\n    const rgb = (0, $c0343f20bfecc638$export$8972dc0e6ad9238f)(color[0], color[1], color[2], color[3] / 255);\n    const hslColor = (0, $c0343f20bfecc638$export$8f4a7c0bb78e6ea8)(rgb);\n    hslColor.s = value;\n    const c = hslColor.rgb();\n    return $88689deb35cd627d$var$rgbToDeckglColor(c);\n}\n\n\n\n\nlet $975e8617bd73ab77$var$vega = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null\n};\nlet $975e8617bd73ab77$var$deck = {\n    _CameraLight: null,\n    AmbientLight: null,\n    CompositeLayer: null,\n    COORDINATE_SYSTEM: null,\n    Deck: null,\n    DirectionalLight: null,\n    Layer: null,\n    LightingEffect: null,\n    LinearInterpolator: null,\n    OrbitView: null,\n    OrbitController: null,\n    gouraudLighting: null,\n    picking: null,\n    project32: null\n};\nlet $975e8617bd73ab77$var$layers = {\n    IconLayer: null,\n    LineLayer: null,\n    PathLayer: null,\n    PolygonLayer: null,\n    TextLayer: null\n};\nlet $975e8617bd73ab77$var$luma = {\n    CubeGeometry: null,\n    Model: null,\n    Texture2D: null\n};\nconst $975e8617bd73ab77$export$e2253033e6e1df16 = {\n    deck: $975e8617bd73ab77$var$deck,\n    layers: $975e8617bd73ab77$var$layers,\n    luma: $975e8617bd73ab77$var$luma,\n    vega: $975e8617bd73ab77$var$vega\n};\nfunction $975e8617bd73ab77$export$1f96ae73734a86cc(vega1, deck1, layers1, luma1) {\n    $975e8617bd73ab77$export$e2253033e6e1df16.deck = deck1;\n    $975e8617bd73ab77$export$e2253033e6e1df16.layers = layers1;\n    $975e8617bd73ab77$export$e2253033e6e1df16.luma = luma1;\n    $975e8617bd73ab77$export$e2253033e6e1df16.vega = vega1;\n}\n\n\n\nvar // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n$30b7fe48e229d157$export$2e2bcd8739ae039 = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n\n\nvar $cb224439f6a2e69c$exports = {};\n\n$parcel$export($cb224439f6a2e69c$exports, \"minHeight\", () => $cb224439f6a2e69c$export$a43cf604e12f3b17);\n$parcel$export($cb224439f6a2e69c$exports, \"minWidth\", () => $cb224439f6a2e69c$export$ee148fbbe8357dd2);\n$parcel$export($cb224439f6a2e69c$exports, \"defaultPresenterStyle\", () => $cb224439f6a2e69c$export$83ac8f5ae8122afc);\n$parcel$export($cb224439f6a2e69c$exports, \"defaultPresenterConfig\", () => $cb224439f6a2e69c$export$200f593236aebbdc);\n$parcel$export($cb224439f6a2e69c$exports, \"createStage\", () => $cb224439f6a2e69c$export$afa8810fbe5c2601);\n$parcel$export($cb224439f6a2e69c$exports, \"groupStrokeWidth\", () => $cb224439f6a2e69c$export$62471df653c738cc);\n$parcel$export($cb224439f6a2e69c$exports, \"lineZ\", () => $cb224439f6a2e69c$export$c25c42a6ee2ec894);\n$parcel$export($cb224439f6a2e69c$exports, \"defaultView\", () => $cb224439f6a2e69c$export$93acc5219d6538bb);\n$parcel$export($cb224439f6a2e69c$exports, \"min3dDepth\", () => $cb224439f6a2e69c$export$d90a7322036a432e);\n$parcel$export($cb224439f6a2e69c$exports, \"minPixelSize\", () => $cb224439f6a2e69c$export$c9c7d435df6c4ed7);\nconst $cb224439f6a2e69c$export$a43cf604e12f3b17 = \"100px\";\nconst $cb224439f6a2e69c$export$ee148fbbe8357dd2 = \"100px\";\nconst $cb224439f6a2e69c$export$83ac8f5ae8122afc = {\n    cssPrefix: \"vega-deckgl-\",\n    defaultCubeColor: [\n        128,\n        128,\n        128,\n        255\n    ],\n    highlightColor: [\n        0,\n        0,\n        0,\n        255\n    ]\n};\nconst $cb224439f6a2e69c$export$200f593236aebbdc = {\n    onCubeClick: (e, cube)=>{},\n    onCubeHover: (e, cube)=>{},\n    transitionDurations: {\n        color: 100,\n        position: 600,\n        size: 600,\n        view: 600\n    }\n};\nfunction $cb224439f6a2e69c$export$afa8810fbe5c2601(view) {\n    const stage = {\n        view: view,\n        cubeData: [],\n        pathData: [],\n        polygonData: [],\n        axes: {\n            x: [],\n            y: [],\n            z: []\n        },\n        gridLines: [],\n        textData: [],\n        legend: {\n            rows: {}\n        },\n        facets: []\n    };\n    return stage;\n}\nconst $cb224439f6a2e69c$export$62471df653c738cc = 1;\nconst $cb224439f6a2e69c$export$c25c42a6ee2ec894 = -1;\nconst $cb224439f6a2e69c$export$93acc5219d6538bb = \"2d\";\nconst $cb224439f6a2e69c$export$d90a7322036a432e = 0.05;\nconst $cb224439f6a2e69c$export$c9c7d435df6c4ed7 = 0.5;\n\n\nvar $0d8759e743ef282e$export$2e2bcd8739ae039 = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec3 instancePositions64Low;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${(0, $cb224439f6a2e69c$export$c9c7d435df6c4ed7).toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${(0, $cb224439f6a2e69c$export$c9c7d435df6c4ed7).toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_size(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_size(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_size(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset, position_worldspace);\n  \n  vec3 lightColor = lighting_getLightColor(instanceColors.rgb, project_uCameraPosition, position_worldspace.xyz, project_normal(normals));\n  vec3 mixedLight = mix(instanceColors.rgb, lightColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n\n\n\n//https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\nconst $42922bf70b926cf7$var$UNSIGNED_BYTE = 0x1401;\nconst $42922bf70b926cf7$var$DOUBLE = 0x140a;\nconst $42922bf70b926cf7$var$DEFAULT_COLOR = [\n    255,\n    0,\n    255,\n    255\n];\nconst $42922bf70b926cf7$var$defaultProps = {\n    lightingMix: 0.5,\n    getSize: (x)=>x.size,\n    getPosition: (x)=>x.position,\n    getColor: (x)=>x.color,\n    material: {\n        ambient: 0.5,\n        diffuse: 1\n    }\n};\nfunction $42922bf70b926cf7$var$_CubeLayer(props1) {\n    //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n    class __CubeLayer extends (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.Layer {\n        getShaders() {\n            return {\n                vs: $0d8759e743ef282e$export$2e2bcd8739ae039,\n                fs: $30b7fe48e229d157$export$2e2bcd8739ae039,\n                modules: [\n                    (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.project32,\n                    (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.gouraudLighting,\n                    (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.picking\n                ]\n            };\n        }\n        initializeState() {\n            const attributeManager = this.getAttributeManager();\n            attributeManager.addInstanced({\n                instancePositions: {\n                    size: 3,\n                    type: $42922bf70b926cf7$var$DOUBLE,\n                    transition: true,\n                    accessor: \"getPosition\"\n                },\n                instanceSizes: {\n                    size: 3,\n                    transition: true,\n                    accessor: \"getSize\"\n                },\n                instanceColors: {\n                    size: 4,\n                    type: $42922bf70b926cf7$var$UNSIGNED_BYTE,\n                    transition: true,\n                    accessor: \"getColor\",\n                    defaultValue: $42922bf70b926cf7$var$DEFAULT_COLOR\n                }\n            });\n        }\n        updateState({ props: props , oldProps: oldProps , changeFlags: changeFlags  }) {\n            super.updateState({\n                props: props,\n                oldProps: oldProps,\n                changeFlags: changeFlags\n            }); //TODO add parameter type to deck.gl-typings\n            // Re-generate model if geometry changed\n            //if (props.fp64 !== oldProps.fp64) {\n            const { gl: gl  } = this.context;\n            if (this.state.model) this.state.model.delete();\n            this.setState({\n                model: this._getModel(gl)\n            });\n            this.getAttributeManager().invalidateAll();\n        //}\n        }\n        _getModel(gl) {\n            return new (0, $975e8617bd73ab77$export$e2253033e6e1df16).luma.Model(gl, Object.assign({}, this.getShaders(), {\n                id: this.props.id,\n                geometry: new (0, $975e8617bd73ab77$export$e2253033e6e1df16).luma.CubeGeometry(),\n                isInstanced: true\n            }));\n        }\n        draw({ uniforms: uniforms  }) {\n            let { lightingMix: lightingMix  } = this.props;\n            if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n            this.state.model.setUniforms(Object.assign({}, uniforms, {\n                lightingMix: lightingMix\n            })).draw();\n        }\n    }\n    __CubeLayer.layerName = \"CubeLayer\";\n    __CubeLayer.defaultProps = $42922bf70b926cf7$var$defaultProps;\n    const instance = new __CubeLayer(props1);\n    return instance;\n}\nconst $42922bf70b926cf7$export$49d6aa54bfdcaef = $42922bf70b926cf7$var$_CubeLayer;\n\n\nfunction $6a58ff249c135fca$export$be3f0f7224794b88(x) {\n    return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n}\n\n\nfunction $0eedd3fa704eca21$export$fc3e95f15e1ef38e(t) {\n    return (0, $6a58ff249c135fca$export$be3f0f7224794b88)(1 - +t);\n}\nfunction $0eedd3fa704eca21$export$f3c9b2f85fbcf0ab(t) {\n    return 1 - (0, $6a58ff249c135fca$export$be3f0f7224794b88)(t);\n}\nfunction $0eedd3fa704eca21$export$ae4d4e77fab188ff(t) {\n    return ((t *= 2) <= 1 ? (0, $6a58ff249c135fca$export$be3f0f7224794b88)(1 - t) : 2 - (0, $6a58ff249c135fca$export$be3f0f7224794b88)(t - 1)) / 2;\n}\n\n\n\nfunction $bb1bb47ebb99b990$export$24c5ac7c37452e7d(t) {\n    if (t === 0 || t === 1) return t;\n    return (0, $0eedd3fa704eca21$export$ae4d4e77fab188ff)(t);\n}\n\n\nfunction $2ce9d49664bfe8f3$export$61f6a9c831786408(presenter, config, stage, lightSettings /*LightSettings*/ , lightingMix, interpolator, guideLines) {\n    const cubeLayer = $2ce9d49664bfe8f3$var$newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n    const { x: x , y: y , z: z  } = stage.axes;\n    const lines = (0, $0c3b0860ccac235e$export$ee1b3e54f0441b22)(stage.gridLines, guideLines);\n    const texts = [\n        ...stage.textData\n    ];\n    [\n        x,\n        y,\n        z\n    ].forEach((axes)=>{\n        axes.forEach((axis)=>{\n            if (axis.domain) lines.push(axis.domain);\n            if (axis.ticks) lines.push.apply(lines, axis.ticks);\n            if (axis.tickText) texts.push.apply(texts, axis.tickText);\n            if (axis.title) texts.push(axis.title);\n        });\n    });\n    let characterSet;\n    if (config.getCharacterSet) characterSet = config.getCharacterSet(stage);\n    else //Basic symbols, numbers, and uppercase / lowercase alphabet\n    characterSet = new Array(95).fill(1).map((_, i)=>String.fromCharCode(32 + i));\n    if (stage.facets) stage.facets.forEach((f)=>{\n        if (f.lines) lines.push.apply(lines, f.lines);\n    });\n    const lineLayer = $2ce9d49664bfe8f3$var$newLineLayer((0, $f3d4039a9d780933$export$5792b81513a80aca).lines, lines);\n    const textLayer = $2ce9d49664bfe8f3$var$newTextLayer(presenter, (0, $f3d4039a9d780933$export$5792b81513a80aca).text, texts, config, presenter.style.fontFamily, characterSet);\n    const pathLayer = $2ce9d49664bfe8f3$var$newPathLayer((0, $f3d4039a9d780933$export$5792b81513a80aca).paths, stage.pathData);\n    const polygonLayer = $2ce9d49664bfe8f3$var$newPolygonLayer((0, $f3d4039a9d780933$export$5792b81513a80aca).polygons, stage.polygonData);\n    return [\n        textLayer,\n        cubeLayer,\n        lineLayer,\n        pathLayer,\n        polygonLayer\n    ];\n}\nfunction $2ce9d49664bfe8f3$var$newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings /*LightSettings*/ , lightingMix, interpolator) {\n    const getPosition = $2ce9d49664bfe8f3$var$getTiming(config.transitionDurations.position, (0, $bb1bb47ebb99b990$export$24c5ac7c37452e7d));\n    const getSize = $2ce9d49664bfe8f3$var$getTiming(config.transitionDurations.size, (0, $bb1bb47ebb99b990$export$24c5ac7c37452e7d));\n    const getColor = $2ce9d49664bfe8f3$var$getTiming(config.transitionDurations.color);\n    const cubeLayerProps = {\n        interpolator: interpolator,\n        lightingMix: lightingMix,\n        id: (0, $f3d4039a9d780933$export$5792b81513a80aca).cubes,\n        data: cubeData,\n        coordinateSystem: (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.COORDINATE_SYSTEM.CARTESIAN,\n        pickable: true,\n        autoHighlight: true,\n        highlightColor: highlightColor,\n        onClick: (o, e)=>{\n            config.onCubeClick(e && e.srcEvent, o.object);\n        },\n        onHover: (o, e)=>{\n            if (o.index === -1) {\n                presenter.deckgl.interactiveState.onCube = false;\n                config.onCubeHover(e && e.srcEvent, null);\n            } else {\n                presenter.deckgl.interactiveState.onCube = true;\n                config.onCubeHover(e && e.srcEvent, o.object);\n            }\n        },\n        //lightSettings,\n        transitions: {\n            getPosition: getPosition,\n            getColor: getColor,\n            getSize: getSize\n        }\n    };\n    return new (0, $42922bf70b926cf7$export$49d6aa54bfdcaef)(cubeLayerProps);\n}\nfunction $2ce9d49664bfe8f3$var$newLineLayer(id, data) {\n    return new (0, $975e8617bd73ab77$export$e2253033e6e1df16).layers.LineLayer({\n        id: id,\n        data: data,\n        widthUnits: \"pixels\",\n        coordinateSystem: (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getColor: (o)=>o.color,\n        getWidth: (o)=>o.strokeWidth\n    });\n}\nfunction $2ce9d49664bfe8f3$var$newPathLayer(id, data) {\n    if (!data) return null;\n    return new (0, $975e8617bd73ab77$export$e2253033e6e1df16).layers.PathLayer({\n        id: id,\n        data: data,\n        billboard: true,\n        widthScale: 1,\n        widthMinPixels: 2,\n        widthUnits: \"pixels\",\n        coordinateSystem: (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getPath: (o)=>o.positions,\n        getColor: (o)=>o.strokeColor,\n        getWidth: (o)=>o.strokeWidth\n    });\n}\nfunction $2ce9d49664bfe8f3$var$newPolygonLayer(id, data) {\n    if (!data) return null;\n    let newlayer = new (0, $975e8617bd73ab77$export$e2253033e6e1df16).layers.PolygonLayer({\n        id: id,\n        data: data,\n        coordinateSystem: (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getPolygon: (o)=>o.positions,\n        getFillColor: (o)=>o.fillColor,\n        getLineColor: (o)=>o.strokeColor,\n        wireframe: false,\n        filled: true,\n        stroked: true,\n        pickable: true,\n        extruded: true,\n        getElevation: (o)=>o.depth,\n        getLineWidth: (o)=>o.strokeWidth\n    });\n    return newlayer;\n}\nfunction $2ce9d49664bfe8f3$var$newTextLayer(presenter, id, data, config, fontFamily, characterSet) {\n    let alphaCutoff = config.getTextHighlightAlphaCutoff && config.getTextHighlightAlphaCutoff();\n    if (alphaCutoff === undefined) alphaCutoff = 0.1;\n    const props = {\n        id: id,\n        data: data,\n        characterSet: characterSet,\n        coordinateSystem: (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.COORDINATE_SYSTEM.CARTESIAN,\n        sizeUnits: \"pixels\",\n        autoHighlight: true,\n        pickable: true,\n        highlightColor: (p)=>{\n            if (config.getTextHighlightColor) return config.getTextHighlightColor(p.object);\n            else return [\n                0,\n                0,\n                0,\n                0\n            ];\n        },\n        onClick: (o, e)=>{\n            let pe = e && e.srcEvent;\n            config.onTextClick && config.onTextClick(pe, o.object);\n        },\n        onHover: (o, e)=>{\n            if (o.index === -1) presenter.deckgl.interactiveState.onText = false;\n            else presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n        },\n        getColor: config.getTextColor || ((o)=>o.color),\n        getTextAnchor: (o)=>o.textAnchor,\n        getSize: (o)=>o.size,\n        getAngle: (o)=>o.angle,\n        fontSettings: {\n            sdf: false,\n            fontSize: 128,\n            buffer: 3\n        },\n        _subLayerProps: {\n            characters: {\n                alphaCutoff: alphaCutoff\n            }\n        }\n    };\n    if (fontFamily) props.fontFamily = fontFamily;\n    return new (0, $975e8617bd73ab77$export$e2253033e6e1df16).layers.TextLayer(props);\n}\nfunction $2ce9d49664bfe8f3$var$getTiming(duration, easing1) {\n    let timing;\n    if (duration) {\n        timing = {\n            duration: duration,\n            type: \"interpolation\"\n        };\n        if (easing1) timing.easing = easing1;\n    }\n    return timing;\n}\nfunction $2ce9d49664bfe8f3$export$ccecd364047ec381(deckProps) {\n    return deckProps.layers.filter((layer)=>layer && layer.id === (0, $f3d4039a9d780933$export$5792b81513a80aca).cubes)[0];\n}\nfunction $2ce9d49664bfe8f3$export$fa1ee03f26227b34(deckProps) {\n    const cubeLayer = $2ce9d49664bfe8f3$export$ccecd364047ec381(deckProps);\n    if (!cubeLayer) return;\n    const cubeLayerProps = cubeLayer.props;\n    return cubeLayerProps.data;\n}\n\n\n\n\n\n\n\n\n\n\n\nfunction $0a74f207e382a4fc$export$cf6caf239925fb63(factoryOptions) {\n    function wrapper(props1) {\n        class OrbitControllerInternal extends (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.OrbitController {\n            constructor(props){\n                super(props);\n                this.invertPan = true;\n            }\n            handleEvent(event) {\n                if (event.type === \"doubletap\") {\n                    if (factoryOptions && factoryOptions.doubleClickHandler) return factoryOptions.doubleClickHandler(event, this);\n                }\n                return super.handleEvent(event);\n            }\n        }\n        const instance = new OrbitControllerInternal(props1);\n        return instance;\n    }\n    return wrapper;\n}\n\n\n//adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\nconst $f48cbb1d723098a5$var$CANVAS_STYLE = {\n    position: \"absolute\",\n    left: 0,\n    top: 0,\n    width: \"100%\",\n    height: \"100%\"\n};\n// Create canvas elements for map and deck\nfunction $f48cbb1d723098a5$var$createCanvas(props) {\n    let { container: container = document.body  } = props;\n    if (typeof container === \"string\") container = document.getElementById(container);\n    if (!container) throw Error(\"Deck: container not found\");\n    // Add DOM elements\n    const containerStyle = window.getComputedStyle(container);\n    if (containerStyle.position === \"static\") container.style.position = \"relative\";\n    const deckCanvas = document.createElement(\"canvas\");\n    container.appendChild(deckCanvas);\n    Object.assign(deckCanvas.style, $f48cbb1d723098a5$var$CANVAS_STYLE);\n    return {\n        container: container,\n        deckCanvas: deckCanvas\n    };\n}\nfunction $f48cbb1d723098a5$export$cc8b65d27ce6adb1(factoryOptions) {\n    const OrbitControllerClass = (0, $0a74f207e382a4fc$export$cf6caf239925fb63)(factoryOptions);\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n    function wrapper(props1) {\n        /**\n         * @params container (Element) - DOM element to add deck.gl canvas to\n         * @params controller (Object) - Controller class. Leave empty for auto detection\n         */ class DeckGLInternal extends (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.Deck {\n            constructor(props){\n                if (typeof document === \"undefined\") // Not browser\n                throw Error(\"Deck can only be used in the browser\");\n                const { deckCanvas: deckCanvas  } = $f48cbb1d723098a5$var$createCanvas(props);\n                const viewState = props.initialViewState || props.viewState || {};\n                super(Object.assign({}, props, {\n                    width: \"100%\",\n                    height: \"100%\",\n                    canvas: deckCanvas,\n                    controller: OrbitControllerClass,\n                    initialViewState: viewState\n                }));\n                // Callback for the controller\n                this._updateViewState = (params)=>{\n                    if (this.onViewStateChange) this.onViewStateChange(params);\n                };\n            }\n            setProps(props) {\n                // this._updateViewState must be bound to `this`\n                // but we don't have access to the current instance before calling super().\n                if (\"onViewStateChange\" in props && this._updateViewState) {\n                    // This is called at least once at _onRendererInitialized\n                    this.onViewStateChange = props.onViewStateChange;\n                    props.onViewStateChange = this._updateViewState;\n                }\n                super.setProps(props);\n            }\n        }\n        const instance = new DeckGLInternal(props1);\n        return instance;\n    }\n    return {\n        OrbitControllerClass: OrbitControllerClass,\n        DeckGL_Class: wrapper\n    };\n}\n\n\n\nfunction $2923565ec0b3fb84$var$wrapper(props) {\n    class LinearInterpolatorInternal extends (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.LinearInterpolator {\n        constructor(transitionProps){\n            super(transitionProps);\n        }\n        interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n            if (this.layerStartProps && this.layerEndProps) this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n            return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n        }\n    }\n    const instance = new LinearInterpolatorInternal(props);\n    return instance;\n}\nconst $2923565ec0b3fb84$export$19db461e577de3cc = $2923565ec0b3fb84$var$wrapper;\n\n\n\n\n\nfunction $04b116f6958d3235$export$ecab656a5b486b67() {\n    const ambientLight = new (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.AmbientLight({\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 0.3\n    });\n    const cameraLight = new (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck._CameraLight({\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 1\n    });\n    // const directionalLight = new base.deck.DirectionalLight({\n    //     color: [255, 255, 255],\n    //     direction: [0, 0, -1],\n    //     intensity: 0.2\n    //   });\n    return [\n        new (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.LightingEffect({\n            ambientLight: ambientLight,\n            cameraLight: cameraLight\n        })\n    ];\n}\n\n\nvar $483619dbeb86ab73$exports = {};\n\n$parcel$export($483619dbeb86ab73$exports, \"PresenterElement\", () => $483619dbeb86ab73$export$79420be32f83a5b0);\nvar $483619dbeb86ab73$export$79420be32f83a5b0;\n(function(PresenterElement1) {\n    PresenterElement1[PresenterElement1[\"root\"] = 0] = \"root\";\n    PresenterElement1[PresenterElement1[\"gl\"] = 1] = \"gl\";\n    PresenterElement1[PresenterElement1[\"panel\"] = 2] = \"panel\";\n    PresenterElement1[PresenterElement1[\"legend\"] = 3] = \"legend\";\n    PresenterElement1[PresenterElement1[\"vegaControls\"] = 4] = \"vegaControls\";\n})($483619dbeb86ab73$export$79420be32f83a5b0 || ($483619dbeb86ab73$export$79420be32f83a5b0 = {}));\n\n\n\n\n\nconst $b89e73cbcb837965$export$b0b33bcc0f604685 = (props)=>{\n    const rows = [];\n    const addRow = (row, i)=>{\n        const fn = $b89e73cbcb837965$var$symbolMap[row.symbol.shape];\n        let jsx;\n        if (fn) jsx = fn(row.symbol);\n        else jsx = (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"span\", null, \"x\");\n        rows.push({\n            cells: [\n                {\n                    className: \"symbol\",\n                    content: jsx\n                },\n                {\n                    className: \"label\",\n                    content: row.label,\n                    title: row.label\n                }\n            ]\n        });\n    };\n    var sorted = Object.keys(props.legend.rows).sort((a, b)=>+a - +b);\n    sorted.forEach((i)=>addRow(props.legend.rows[i], +i));\n    if (sorted.length) return (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)((0, $30be071d2984c290$export$54ec01a60f47d33d), {\n        rows: rows,\n        rowClassName: \"legend-row\",\n        onRowClick: (e, i)=>props.onClick(e, props.legend, i)\n    }, props.legend.title !== undefined && (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"tr\", {\n        tabIndex: props.onClick ? 0 : -1,\n        onClick: (e)=>props.onClick(e, props.legend, null),\n        onKeyUp: (e)=>{\n            if (e.key === (0, $30be071d2984c290$export$ec835b702d42f3f0).ENTER && props.onClick) props.onClick(e, props.legend, null);\n        }\n    }, (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"th\", {\n        colSpan: 2\n    }, props.legend.title)));\n};\nconst $b89e73cbcb837965$var$symbolMap = {\n    square: function(symbol) {\n        return (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"div\", {\n            style: {\n                height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                backgroundColor: symbol.fill,\n                borderColor: symbol.fill\n            }\n        });\n    }\n};\n\n\n\n\n\n\nfunction $1239d19cae4bcec7$export$5accd073ebd18e1(v3) {\n    let temp = -v3[1]; //negeative y to positive z\n    if (v3[0] === (0, $cb224439f6a2e69c$export$c25c42a6ee2ec894)) v3[0] = 0;\n    v3[1] = v3[2];\n    v3[2] = temp;\n}\n\n\nconst $5d56ff003a42dc40$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        const x1 = item.x || 0;\n        const y1 = item.y || 0;\n        const x2 = item.x2 != null ? item.x2 : x1;\n        const y2 = item.y2 != null ? item.y2 : y1;\n        const lineItem = $5d56ff003a42dc40$var$styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n        if (item.mark.role === \"axis-tick\") {\n            if (options.currAxis.role === \"z\") {\n                (0, $1239d19cae4bcec7$export$5accd073ebd18e1)(lineItem.sourcePosition);\n                (0, $1239d19cae4bcec7$export$5accd073ebd18e1)(lineItem.targetPosition);\n            }\n            options.currAxis.ticks.push(lineItem);\n        } else if (item.mark.role === \"axis-domain\") {\n            if (options.currAxis.role === \"z\") {\n                (0, $1239d19cae4bcec7$export$5accd073ebd18e1)(lineItem.sourcePosition);\n                (0, $1239d19cae4bcec7$export$5accd073ebd18e1)(lineItem.targetPosition);\n            }\n            options.currAxis.domain = lineItem;\n        } else stage.gridLines.push(lineItem);\n    });\n};\nfunction $5d56ff003a42dc40$var$styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n    const line = {\n        sourcePosition: [\n            x1,\n            -y1,\n            (0, $cb224439f6a2e69c$export$c25c42a6ee2ec894)\n        ],\n        targetPosition: [\n            x2,\n            -y2,\n            (0, $cb224439f6a2e69c$export$c25c42a6ee2ec894)\n        ],\n        color: (0, $88689deb35cd627d$export$78ed65bc9abd64b1)(stroke),\n        strokeWidth: strokeWidth\n    };\n    return line;\n}\nfunction $5d56ff003a42dc40$export$827f4ee28efc37(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n    const lines = [\n        $5d56ff003a42dc40$var$styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n        $5d56ff003a42dc40$var$styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n        $5d56ff003a42dc40$var$styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n        $5d56ff003a42dc40$var$styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)\n    ];\n    if (diagonals) {\n        lines.push($5d56ff003a42dc40$var$styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n        lines.push($5d56ff003a42dc40$var$styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n    }\n    return lines;\n}\nvar $5d56ff003a42dc40$export$2e2bcd8739ae039 = $5d56ff003a42dc40$var$markStager;\n\n\n\n\n\nfunction $dfe8065030a6ee84$export$ba5a93ad8642dce4(presenter) {\n    const rootDiv = (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"div\", {\n        className: $dfe8065030a6ee84$export$2913c0c0b5623090((0, $483619dbeb86ab73$export$79420be32f83a5b0).root, presenter)\n    }, (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"div\", {\n        className: $dfe8065030a6ee84$export$2913c0c0b5623090((0, $483619dbeb86ab73$export$79420be32f83a5b0).gl, presenter),\n        style: {\n            minHeight: $cb224439f6a2e69c$export$a43cf604e12f3b17,\n            minWidth: $cb224439f6a2e69c$export$ee148fbbe8357dd2\n        }\n    }), (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"div\", {\n        className: $dfe8065030a6ee84$export$2913c0c0b5623090((0, $483619dbeb86ab73$export$79420be32f83a5b0).panel, presenter)\n    }, (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"div\", {\n        className: $dfe8065030a6ee84$export$2913c0c0b5623090((0, $483619dbeb86ab73$export$79420be32f83a5b0).vegaControls, presenter)\n    }), (0, $5feb58fe75c7f837$export$c8a8987d4410bf2d)(\"div\", {\n        className: $dfe8065030a6ee84$export$2913c0c0b5623090((0, $483619dbeb86ab73$export$79420be32f83a5b0).legend, presenter)\n    })));\n    (0, $5feb58fe75c7f837$export$186d02efde07ef98)(rootDiv, presenter.el);\n}\nfunction $dfe8065030a6ee84$export$2913c0c0b5623090(type, presenter) {\n    return `${presenter.style.cssPrefix}${(0, $483619dbeb86ab73$export$79420be32f83a5b0)[type]}`;\n}\n\n\nfunction $753504a3f96134c4$export$9a79ca9001afcc6d(allocatedSize, empty, cubes) {\n    const patched = new Array(allocatedSize);\n    patched.fill(empty);\n    cubes.forEach((cube)=>patched[cube.ordinal] = cube);\n    return patched;\n}\n\n\n\nconst $89e7e208bf4a6623$var$legendMap = {\n    \"legend-title\": function(legend, textItem) {\n        legend.title = textItem.text;\n    },\n    \"legend-symbol\": function(legend, symbol) {\n        const { bounds: bounds , fill: fill , shape: shape  } = symbol;\n        //this object is safe for serialization\n        const legendRowSymbol = {\n            bounds: bounds,\n            fill: fill,\n            shape: shape\n        };\n        const i = symbol.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        legend.rows[i].symbol = legendRowSymbol;\n    },\n    \"legend-label\": function(legend, label) {\n        const i = label.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        const row = legend.rows[i];\n        row.label = label.text;\n        row.value = label.datum.value;\n    }\n};\nconst $89e7e208bf4a6623$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        const fn = $89e7e208bf4a6623$var$legendMap[item.mark.role];\n        if (fn) fn(stage.legend, item);\n    });\n};\nvar $89e7e208bf4a6623$export$2e2bcd8739ae039 = $89e7e208bf4a6623$var$markStager;\n\n\n\n\n\nconst $79b4fb4184b5fc75$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        //for orthographic (2d) - always use 0 or else Deck will not show them\n        const z = stage.view === \"2d\" ? 0 : item.z || 0;\n        const depth = (stage.view === \"2d\" ? 0 : item.depth || 0) + (0, $cb224439f6a2e69c$export$d90a7322036a432e);\n        //change direction of y from SVG to GL\n        const ty = -1;\n        let ordinal = options.assignCubeOrdinal(item.datum);\n        if (ordinal > options.maxOrdinal) options.maxOrdinal = ordinal;\n        if (ordinal === undefined) ;\n        else {\n            const cube = {\n                ordinal: ordinal,\n                size: [\n                    item.width,\n                    item.height,\n                    depth\n                ],\n                position: [\n                    x + (item.x || 0),\n                    ty * (y + (item.y || 0)) - item.height,\n                    z\n                ],\n                color: (0, $88689deb35cd627d$export$78ed65bc9abd64b1)(item.fill) || options.defaultCubeColor || [\n                    128,\n                    128,\n                    128,\n                    128\n                ]\n            };\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n            stage.cubeData.push(cube);\n        }\n    });\n};\nvar $79b4fb4184b5fc75$export$2e2bcd8739ae039 = $79b4fb4184b5fc75$var$markStager;\n\n\n\n\n//change direction of y from SVG to GL\nconst $ab075339e2ce3efd$var$ty = -1;\nconst $ab075339e2ce3efd$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    const g = Object.assign({\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 1\n    }, scene.items[0]);\n    const path = {\n        strokeWidth: g.strokeWidth,\n        strokeColor: (0, $88689deb35cd627d$export$78ed65bc9abd64b1)(g.stroke),\n        positions: scene.items.map((it)=>[\n                it.x,\n                $ab075339e2ce3efd$var$ty * it.y,\n                it.z || 0\n            ])\n    };\n    path.strokeColor[3] *= g.strokeOpacity;\n    path.strokeColor[3] *= g.opacity;\n    stage.pathData.push(path);\n};\nvar $ab075339e2ce3efd$export$2e2bcd8739ae039 = $ab075339e2ce3efd$var$markStager;\n\n\n\n\n\nconst $97a792063f683a9d$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    //scale Deck.Gl text to Vega size\n    const fontScale = 1;\n    //change direction of y from SVG to GL\n    const ty = -1;\n    (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        if (!item.text) return;\n        const size = item.fontSize * fontScale;\n        const alignmentBaseline = $97a792063f683a9d$var$convertBaseline(item.baseline);\n        const yOffset = alignmentBaseline === \"top\" ? item.fontSize / 2 : 0; //fixup to get tick text correct\n        const textItem = {\n            color: (0, $88689deb35cd627d$export$78ed65bc9abd64b1)(item.fill),\n            text: item.limit === undefined ? item.text : (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.truncate(item.text, item.limit, \"right\", item.ellipsis || \"...\"),\n            position: [\n                x + (item.x || 0),\n                ty * (y + (item.y || 0) + yOffset),\n                0\n            ],\n            size: size,\n            angle: $97a792063f683a9d$var$convertAngle(item.angle),\n            textAnchor: $97a792063f683a9d$var$convertAlignment(item.align),\n            alignmentBaseline: alignmentBaseline,\n            metaData: item.metaData\n        };\n        if (item.mark.role === \"axis-label\") {\n            const tickText = textItem;\n            tickText.value = item.datum.value;\n            if (options.currAxis.role === \"z\") (0, $1239d19cae4bcec7$export$5accd073ebd18e1)(tickText.position);\n            options.currAxis.tickText.push(tickText);\n        } else if (item.mark.role === \"axis-title\") {\n            if (options.currAxis.role === \"z\") (0, $1239d19cae4bcec7$export$5accd073ebd18e1)(textItem.position);\n            options.currAxis.title = textItem;\n        } else stage.textData.push(textItem);\n    });\n};\nfunction $97a792063f683a9d$var$convertAngle(vegaTextAngle) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) return 360 - vegaTextAngle;\n    return 0;\n}\nfunction $97a792063f683a9d$var$convertAlignment(textAlign) {\n    switch(textAlign){\n        case \"center\":\n            return \"middle\";\n        case \"left\":\n            return \"start\";\n        case \"right\":\n            return \"end\";\n    }\n    return \"start\";\n}\nfunction $97a792063f683a9d$var$convertBaseline(baseline) {\n    switch(baseline){\n        case \"middle\":\n            return \"center\";\n    }\n    return baseline || \"bottom\";\n}\nvar $97a792063f683a9d$export$2e2bcd8739ae039 = $97a792063f683a9d$var$markStager;\n\n\n\n//change direction of y from SVG to GL\nconst $e715d15345e41e69$var$ty = -1;\nconst $e715d15345e41e69$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    const g = Object.assign({\n        fillOpacity: 1,\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 0,\n        depth: 0\n    }, scene.items[0]);\n    const points = scene.items.map((item)=>{\n        item = Object.assign({\n            z: 0\n        }, item);\n        item = Object.assign({\n            x2: item.x,\n            y2: item.y,\n            z2: item.z\n        }, item);\n        return [\n            item.x,\n            $e715d15345e41e69$var$ty * item.y,\n            item.z,\n            item.x2,\n            $e715d15345e41e69$var$ty * item.y2,\n            item.z2\n        ];\n    });\n    let positions = [];\n    let startpoint = [\n        points[0][0],\n        points[0][1],\n        points[0][2]\n    ];\n    points.forEach((p)=>{\n        positions.push([\n            p[0],\n            p[1],\n            p[2]\n        ]);\n    });\n    points.reverse().forEach((p)=>{\n        positions.push([\n            p[3],\n            p[4],\n            p[5]\n        ]);\n    });\n    positions.push(startpoint);\n    const polygon = {\n        fillColor: (0, $88689deb35cd627d$export$78ed65bc9abd64b1)(g.fill) || [\n            0,\n            0,\n            0,\n            0\n        ],\n        positions: positions,\n        strokeColor: (0, $88689deb35cd627d$export$78ed65bc9abd64b1)(g.stroke) || [\n            0,\n            0,\n            0,\n            0\n        ],\n        strokeWidth: g.strokeWidth,\n        depth: g.depth\n    };\n    polygon.fillColor[3] *= g.fillOpacity;\n    polygon.fillColor[3] *= g.opacity;\n    polygon.strokeColor[3] *= g.strokeOpacity;\n    polygon.strokeColor[3] *= g.opacity;\n    stage.polygonData.push(polygon);\n};\nvar $e715d15345e41e69$export$2e2bcd8739ae039 = $e715d15345e41e69$var$markStager;\n\n\n\n\n\nvar $cb71d75340c71fa4$export$d460f747b73abb10;\n(function(GroupType1) {\n    GroupType1[GroupType1[\"none\"] = 0] = \"none\";\n    GroupType1[GroupType1[\"legend\"] = 1] = \"legend\";\n    GroupType1[GroupType1[\"xAxis\"] = 2] = \"xAxis\";\n    GroupType1[GroupType1[\"yAxis\"] = 3] = \"yAxis\";\n    GroupType1[GroupType1[\"zAxis\"] = 4] = \"zAxis\";\n})($cb71d75340c71fa4$export$d460f747b73abb10 || ($cb71d75340c71fa4$export$d460f747b73abb10 = {}));\n\n\nfunction $3f4cbf010dab927f$var$getOrientItem(group1) {\n    if (group1.orient) return group1;\n    return group1.datum;\n}\nfunction $3f4cbf010dab927f$var$convertGroupRole(group2, options) {\n    if (group2.mark.role === \"legend\") return (0, $cb71d75340c71fa4$export$d460f747b73abb10).legend;\n    if (group2.mark.role === \"axis\") {\n        if (group2.mark.zindex === options.zAxisZindex && options.zAxisZindex !== undefined) return (0, $cb71d75340c71fa4$export$d460f747b73abb10).zAxis;\n        const orientItem = $3f4cbf010dab927f$var$getOrientItem(group2);\n        if (orientItem) switch(orientItem.orient){\n            case \"bottom\":\n            case \"top\":\n                return (0, $cb71d75340c71fa4$export$d460f747b73abb10).xAxis;\n            case \"left\":\n            case \"right\":\n                return (0, $cb71d75340c71fa4$export$d460f747b73abb10).yAxis;\n        }\n    }\n}\nconst $3f4cbf010dab927f$var$group = (options, stage, scene, x, y, groupType)=>{\n    (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.sceneVisit(scene, function(g) {\n        const gx = g.x || 0, gy = g.y || 0;\n        if (g.context && g.context.background && !stage.backgroundColor) stage.backgroundColor = (0, $88689deb35cd627d$export$78ed65bc9abd64b1)(g.context.background);\n        if (g.stroke) {\n            const facetRect = {\n                datum: g.datum,\n                lines: (0, $5d56ff003a42dc40$export$827f4ee28efc37)(gx + x, gy + y, g.height, g.width, g.stroke, (0, $cb224439f6a2e69c$export$62471df653c738cc))\n            };\n            stage.facets.push(facetRect);\n        }\n        groupType = $3f4cbf010dab927f$var$convertGroupRole(g, options) || groupType;\n        $3f4cbf010dab927f$var$setCurrentAxis(options, stage, groupType);\n        // draw group contents\n        (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.sceneVisit(g, function(item) {\n            $3f4cbf010dab927f$var$mainStager(options, stage, item, gx + x, gy + y, groupType);\n        });\n    });\n};\nfunction $3f4cbf010dab927f$var$setCurrentAxis(options, stage, groupType) {\n    let axes;\n    let role;\n    switch(groupType){\n        case (0, $cb71d75340c71fa4$export$d460f747b73abb10).xAxis:\n            axes = stage.axes.x;\n            role = \"x\";\n            break;\n        case (0, $cb71d75340c71fa4$export$d460f747b73abb10).yAxis:\n            axes = stage.axes.y;\n            role = \"y\";\n            break;\n        case (0, $cb71d75340c71fa4$export$d460f747b73abb10).zAxis:\n            axes = stage.axes.z;\n            role = \"z\";\n            break;\n        default:\n            return;\n    }\n    options.currAxis = {\n        domain: null,\n        tickText: [],\n        ticks: [],\n        role: role\n    };\n    axes.push(options.currAxis);\n}\nconst $3f4cbf010dab927f$var$markStagers = {\n    group: $3f4cbf010dab927f$var$group,\n    legend: $89e7e208bf4a6623$export$2e2bcd8739ae039,\n    rect: $79b4fb4184b5fc75$export$2e2bcd8739ae039,\n    rule: $5d56ff003a42dc40$export$2e2bcd8739ae039,\n    line: $ab075339e2ce3efd$export$2e2bcd8739ae039,\n    area: $e715d15345e41e69$export$2e2bcd8739ae039,\n    text: $97a792063f683a9d$export$2e2bcd8739ae039\n};\nconst $3f4cbf010dab927f$var$mainStager = (options, stage, scene, x, y, groupType)=>{\n    if (scene.marktype !== \"group\" && groupType === (0, $cb71d75340c71fa4$export$d460f747b73abb10).legend) (0, $89e7e208bf4a6623$export$2e2bcd8739ae039)(options, stage, scene, x, y, groupType);\n    else {\n        const markStager = $3f4cbf010dab927f$var$markStagers[scene.marktype];\n        if (markStager) markStager(options, stage, scene, x, y, groupType);\n    }\n};\nfunction $3f4cbf010dab927f$export$d78988dba6734aaa(options, stage, scene) {\n    $3f4cbf010dab927f$var$mainStager(options, stage, scene, 0, 0, null);\n    $3f4cbf010dab927f$var$sortAxis(stage.axes.x, 0);\n    $3f4cbf010dab927f$var$sortAxis(stage.axes.y, 1);\n}\nfunction $3f4cbf010dab927f$var$sortAxis(axes, dim) {\n    axes.forEach((axis)=>{\n        if (axis.domain) $3f4cbf010dab927f$var$orderDomain(axis.domain, dim);\n        axis.ticks.sort((a, b)=>a.sourcePosition[dim] - b.sourcePosition[dim]);\n        axis.tickText.sort((a, b)=>a.position[dim] - b.position[dim]);\n    });\n}\nfunction $3f4cbf010dab927f$var$orderDomain(domain, dim) {\n    if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n        const temp = domain.targetPosition;\n        domain.targetPosition = domain.sourcePosition;\n        domain.sourcePosition = temp;\n    }\n}\n\n\nconst $81e82a55490093f4$export$19551db75f175e3 = [\n    \"target\",\n    \"rotationOrbit\",\n    \"rotationX\",\n    \"zoom\"\n];\nfunction $81e82a55490093f4$export$cf597f89e136a2d7(height, width, view) {\n    const target = [\n        width / 2,\n        -height / 2,\n        0\n    ];\n    if (view === \"2d\") return {\n        target: target,\n        rotationOrbit: 0,\n        rotationX: 90,\n        zoom: -0.2\n    };\n    else return {\n        target: target,\n        rotationOrbit: 25,\n        rotationX: 30,\n        zoom: -0.4\n    };\n}\n\n\n\nclass $61fffe029a7d3e23$export$893c88c42e3630f9 {\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */ constructor(el, style){\n        this.el = el;\n        this.style = (0, $bde658c1f00fc2a5$export$6969335ea1e4e77c)((0, $cb224439f6a2e69c$export$83ac8f5ae8122afc), style);\n        (0, $dfe8065030a6ee84$export$ba5a93ad8642dce4)(this);\n        this._last = {\n            view: null,\n            height: null,\n            width: null,\n            cubeCount: null,\n            stage: null\n        };\n    }\n    /**\n     * Get the previously rendered Stage object.\n     */ get stage() {\n        return this._last.stage;\n    }\n    /**\n     * Get the current View camera type.\n     */ get view() {\n        return this._last.view;\n    }\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */ animationCancel() {\n        if (this.animationTimer) {\n            clearTimeout(this.animationTimer);\n            this.animationTimer = null;\n            if (this.logger) this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || \"handler\"}`);\n            if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) this.queuedAnimationOptions.animationCanceled.call(null);\n        }\n    }\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */ animationQueue(handler, timeout, options) {\n        if (this.logger) this.logger(`queueing animation ${options && options.waitingLabel || \"waiting\"}...`);\n        this.animationCancel();\n        this.animationTimer = setTimeout(()=>{\n            if (this.logger) this.logger(`queueing animation ${options && options.handlerLabel || \"handler\"}...`);\n            handler();\n        }, timeout);\n    }\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */ getElement(type) {\n        const elements = this.el.getElementsByClassName((0, $dfe8065030a6ee84$export$2913c0c0b5623090)(type, this));\n        if (elements && elements.length) return elements[0];\n    }\n    /**\n     * Present the Vega Scene, or Stage object using Deck.gl.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area.\n     * @param config Optional presentation configuration object.\n     */ present(sceneOrStage, height, width, config) {\n        this.animationCancel();\n        let scene = sceneOrStage;\n        let stage;\n        let options = {\n            maxOrdinal: 0,\n            currAxis: null,\n            defaultCubeColor: this.style.defaultCubeColor,\n            assignCubeOrdinal: (config === null || config === void 0 ? void 0 : config.onSceneRectAssignCubeOrdinal) || (()=>options.maxOrdinal++),\n            zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n        };\n        //determine if this is a vega scene\n        if (scene.marktype) {\n            stage = (0, $cb224439f6a2e69c$export$afa8810fbe5c2601)(scene.view);\n            (0, $3f4cbf010dab927f$export$d78988dba6734aaa)(options, stage, scene);\n        } else stage = sceneOrStage;\n        if (!this.deckgl) {\n            const classes = (0, $f48cbb1d723098a5$export$cc8b65d27ce6adb1)({\n                doubleClickHandler: ()=>{\n                    this.homeCamera();\n                }\n            });\n            this.OrbitControllerClass = classes.OrbitControllerClass;\n            const initialViewState = (0, $81e82a55490093f4$export$cf597f89e136a2d7)(height, width, stage.view);\n            let glOptions;\n            if (config && config.preserveDrawingBuffer) glOptions = {\n                preserveDrawingBuffer: true\n            };\n            const deckProps = {\n                glOptions: glOptions,\n                height: null,\n                width: null,\n                effects: (0, $04b116f6958d3235$export$ecab656a5b486b67)(),\n                layers: [],\n                onClick: config && config.onLayerClick,\n                views: [\n                    new (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.OrbitView({\n                        controller: (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.OrbitController\n                    })\n                ],\n                initialViewState: initialViewState,\n                container: this.getElement((0, $483619dbeb86ab73$export$79420be32f83a5b0).gl),\n                getCursor: (interactiveState)=>{\n                    if (interactiveState.onText || interactiveState.onAxisSelection) return \"pointer\";\n                    else if (interactiveState.onCube) return \"default\";\n                    else return \"grab\";\n                }\n            };\n            if (stage.backgroundColor) deckProps.style = {\n                \"background-color\": (0, $88689deb35cd627d$export$f86d83653e5a505e)(stage.backgroundColor)\n            };\n            this.deckgl = new classes.DeckGL_Class(deckProps);\n        }\n        let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n        if (options.maxOrdinal) {\n            cubeCount = Math.max(cubeCount, options.maxOrdinal);\n            const empty = {\n                isEmpty: true,\n                color: [\n                    0,\n                    0,\n                    0,\n                    0\n                ] // possibly a bug in Deck.gl? set color to invisible.\n            };\n            stage.cubeData = (0, $753504a3f96134c4$export$9a79ca9001afcc6d)(cubeCount, empty, stage.cubeData);\n        }\n        this.setDeckProps(stage, height, width, cubeCount, config);\n        const a = (0, $5feb58fe75c7f837$export$5ec2c407fb44f02)();\n        (0, $5feb58fe75c7f837$export$186d02efde07ef98)((0, $b89e73cbcb837965$export$b0b33bcc0f604685)({\n            legend: stage.legend,\n            onClick: config && config.onLegendClick\n        }), this.getElement((0, $483619dbeb86ab73$export$79420be32f83a5b0).legend));\n        (0, $5feb58fe75c7f837$export$7d007ff58288f238)(a);\n        if (config && config.onPresent) config.onPresent();\n    }\n    /**\n     * Present the same recently rendered Stage with only slight modifications such as a color change,\n     * using the previous Stage values as a basis.\n     * @param stage Partially populated Stage object containing changes.\n     * @param modifyConfig Optional presentation configuration object.\n     */ rePresent(stage, modifyConfig) {\n        const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n        this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n    }\n    isNewBounds(view, height, width, cubeCount) {\n        const lastBounds = this.lastBounds();\n        for(let prop in lastBounds){\n            if (lastBounds[prop] === null) return true;\n        }\n        const newBounds = {\n            cubeCount: cubeCount,\n            height: height,\n            view: view,\n            width: width\n        };\n        for(let prop1 in lastBounds){\n            if (lastBounds[prop1] !== newBounds[prop1]) return true;\n        }\n    }\n    lastBounds() {\n        const { cubeCount: cubeCount , height: height , view: view , width: width  } = this._last;\n        return {\n            cubeCount: cubeCount,\n            height: height,\n            view: view,\n            width: width\n        };\n    }\n    setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n        const config = (0, $bde658c1f00fc2a5$export$6969335ea1e4e77c)((0, $cb224439f6a2e69c$export$200f593236aebbdc), modifyConfig);\n        const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n        //let lightSettings = this.style.lightSettings[stage.view];\n        let lightingMix = stage.view === \"3d\" ? 1.0 : 0.0;\n        let linearInterpolator;\n        //choose the current OrbitView viewstate if possible\n        let viewState = this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView || this.deckgl.props.viewState;\n        if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n            let newViewStateTarget = true;\n            if (config && config.onTargetViewState) {\n                const result = config.onTargetViewState(height, width);\n                height = result.height;\n                width = result.width;\n                if (result.newViewStateTarget !== undefined) newViewStateTarget = result.newViewStateTarget;\n            }\n            if (!viewState || newViewStateTarget) viewState = (0, $81e82a55490093f4$export$cf597f89e136a2d7)(height, width, stage.view);\n            const oldCubeLayer = (0, $2ce9d49664bfe8f3$export$ccecd364047ec381)(this.deckgl.props);\n            if (oldCubeLayer) {\n                linearInterpolator = new (0, $2923565ec0b3fb84$export$19db461e577de3cc)((0, $81e82a55490093f4$export$19551db75f175e3));\n                linearInterpolator.layerStartProps = {\n                    lightingMix: oldCubeLayer.props.lightingMix\n                };\n                linearInterpolator.layerEndProps = {\n                    lightingMix: lightingMix\n                };\n                viewState.transitionDuration = config.transitionDurations.view;\n                viewState.transitionEasing = (0, $bb1bb47ebb99b990$export$24c5ac7c37452e7d);\n                viewState.transitionInterpolator = linearInterpolator;\n            }\n            stage.view;\n        }\n        const guideLines = this._showGuides && (0, $5d56ff003a42dc40$export$827f4ee28efc37)(0, 0, height, width, \"#0f0\", 1, true);\n        config.preLayer && config.preLayer(stage);\n        const layers = (0, $2ce9d49664bfe8f3$export$61f6a9c831786408)(this, config, stage, /*lightSettings*/ null, lightingMix, linearInterpolator, guideLines);\n        const deckProps = {\n            effects: (0, $04b116f6958d3235$export$ecab656a5b486b67)(),\n            views: [\n                new (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.OrbitView({\n                    controller: (0, $975e8617bd73ab77$export$e2253033e6e1df16).deck.OrbitController\n                })\n            ],\n            initialViewState: viewState,\n            layers: layers\n        };\n        if (config && config.preStage) config.preStage(stage, deckProps);\n        requestAnimationFrame(()=>this.deckgl.setProps(Object.assign(Object.assign({}, deckProps), {\n                onAfterRender: ()=>{\n                    if (this._afterRenderHandler) this._afterRenderHandler();\n                }\n            })));\n        delete stage.cubeData;\n        this._last = {\n            cubeCount: cubeCount,\n            height: height,\n            width: width,\n            stage: stage,\n            view: stage.view\n        };\n    }\n    canvasToDataURL() {\n        return new Promise((resolve, reject)=>{\n            this._afterRenderHandler = ()=>{\n                this._afterRenderHandler = null;\n                const png = this.deckgl.canvas.toDataURL(\"image/png\");\n                resolve(png);\n            };\n        });\n    }\n    /**\n     * Home the camera to the last initial position.\n     */ homeCamera() {\n        const viewState = (0, $81e82a55490093f4$export$cf597f89e136a2d7)(this._last.height, this._last.width, this._last.view);\n        viewState.transitionDuration = (0, $cb224439f6a2e69c$export$200f593236aebbdc).transitionDurations.view;\n        viewState.transitionEasing = (0, $bb1bb47ebb99b990$export$24c5ac7c37452e7d);\n        viewState.transitionInterpolator = new (0, $2923565ec0b3fb84$export$19db461e577de3cc)((0, $81e82a55490093f4$export$19551db75f175e3));\n        const deckProps = {\n            effects: (0, $04b116f6958d3235$export$ecab656a5b486b67)(),\n            views: this.deckgl.props.views,\n            initialViewState: viewState,\n            layers: this.deckgl.props.layers\n        };\n        this.deckgl.setProps(deckProps);\n    }\n    /**\n     * Get cube data array from the cubes layer.\n     */ getCubeData() {\n        return (0, $2ce9d49664bfe8f3$export$fa1ee03f26227b34)(this.deckgl.props);\n    }\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */ showGuides() {\n        this._showGuides = true;\n        this.getElement((0, $483619dbeb86ab73$export$79420be32f83a5b0).gl).classList.add(\"show-center\");\n        this.rePresent(Object.assign(Object.assign({}, this._last.stage), {\n            cubeData: this.getCubeData()\n        }));\n    }\n    finalize() {\n        this.animationCancel();\n        if (this.deckgl) this.deckgl.finalize();\n        if (this.el) this.el.innerHTML = \"\";\n        this._last = null;\n        this.deckgl = null;\n        this.el = null;\n        this.logger = null;\n        this.queuedAnimationOptions = null;\n    }\n}\n\n\n\n\n\n\n\n//pass in the SuperClass, which should be a vega.View\nfunction $533abf23d125fe4b$var$_RendererGl(loader) {\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class RendererGlInternal extends (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.Renderer {\n        initialize(el, width, height, origin) {\n            this.height = height;\n            this.width = width;\n            // this method will invoke resize to size the canvas appropriately\n            return super.initialize(el, width, height, origin);\n        }\n        resize(width, height, origin) {\n            super.resize(width, height, origin);\n            this.origin = origin;\n            this.height = height;\n            this.width = width;\n            //rteturn this for vega\n            return this;\n        }\n        _render(scene, items) {\n            const scene3d = scene;\n            scene3d.view = this.getView();\n            this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n            //return this for vega\n            return this;\n        }\n    }\n    const instance = new RendererGlInternal(loader);\n    return instance;\n}\nconst $533abf23d125fe4b$export$ca9a02b0553384e7 = $533abf23d125fe4b$var$_RendererGl;\n\n\nlet $ba8a128a941ed656$var$registered = false;\n//dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n//pass in the SuperClass, which should be a vega.View\nfunction $ba8a128a941ed656$var$_ViewGl(runtime1, config1) {\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class ViewGlInternal extends (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.View {\n        constructor(runtime, config = {}){\n            super(runtime, config);\n            this.config = config;\n            this.presenter = config.presenter;\n            config.presenterConfig = config.presenterConfig || {};\n            config.presenterConfig.redraw = ()=>{\n                this._redraw = true; //use Vega View private member _redraw\n                this.run();\n            };\n        }\n        renderer(...args) {\n            if (args && args.length) {\n                const renderer = args[0];\n                if (renderer === \"deck.gl\" && !$ba8a128a941ed656$var$registered) {\n                    (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.renderModule(\"deck.gl\", {\n                        handler: (0, $975e8617bd73ab77$export$e2253033e6e1df16).vega.CanvasHandler,\n                        renderer: (0, $533abf23d125fe4b$export$ca9a02b0553384e7)\n                    });\n                    $ba8a128a941ed656$var$registered = true;\n                }\n                return super.renderer(renderer);\n            } else return super.renderer();\n        }\n        initialize(el) {\n            if (!this.presenter) this.presenter = new (0, $61fffe029a7d3e23$export$893c88c42e3630f9)(el);\n            super.initialize(this.presenter.getElement((0, $483619dbeb86ab73$export$79420be32f83a5b0).vegaControls));\n            const renderer = this._renderer;\n            renderer.presenterConfig = this.config.presenterConfig;\n            renderer.presenter = this.presenter;\n            renderer.getView = this.config && this.config.getView || (()=>this.presenter.view || (0, $cb224439f6a2e69c$export$93acc5219d6538bb));\n            return this;\n        }\n        error(e) {\n            if (this.presenter.logger) this.presenter.logger(e);\n        }\n    }\n    const instance = new ViewGlInternal(runtime1, config1);\n    return instance;\n}\nconst $ba8a128a941ed656$export$6d8f9057dcd7f9e6 = $ba8a128a941ed656$var$_ViewGl;\n\n\n\n$parcel$exportWildcard($f80f7eb4951011b9$exports, $483619dbeb86ab73$exports);\n\n\nconst { defaultPresenterConfig: $74c2763994d75bb8$var$defaultPresenterConfig , defaultPresenterStyle: $74c2763994d75bb8$var$defaultPresenterStyle  } = $cb224439f6a2e69c$exports;\nconst { desaturate: $74c2763994d75bb8$var$desaturate  } = $fc1d5f246c786135$exports;\nconst $74c2763994d75bb8$export$fb736e4909afb3d7 = {\n    colors: {\n        activeCube: \"purple\",\n        defaultCube: $fc1d5f246c786135$exports.colorToString($74c2763994d75bb8$var$defaultPresenterStyle.defaultCubeColor),\n        hoveredCube: $fc1d5f246c786135$exports.colorToString($74c2763994d75bb8$var$defaultPresenterStyle.highlightColor),\n        selectedCube: \"yellow\",\n        axisSelectHighlight: $fc1d5f246c786135$exports.colorToString([\n            128,\n            128,\n            128,\n            128\n        ]),\n        axisLine: \"#000\",\n        axisText: \"#000\",\n        unselectedColorMethod: (color)=>{\n            const c = $74c2763994d75bb8$var$desaturate(color, 0.05);\n            c[3] = 171;\n            return c;\n        }\n    },\n    language: {\n        headers: {\n            chart: \"Chart\",\n            details: \"Details\",\n            legend: \"Legend\",\n            selection: \"Select & Filter\"\n        },\n        bing: \"bing\",\n        newColorMap: \"remap color to filtered items\",\n        oldColorMap: \"keep same colors\",\n        deselect: \"deselect\",\n        exclude: \"exclude\",\n        isolate: \"isolate\",\n        legendOther: \"other\",\n        nextDetail: \">\",\n        previousDetail: \"<\",\n        reset: \"reset\",\n        colorBinCount: \"Color bin count\",\n        colorReverse: \"Color reverse\",\n        count: \"Count\",\n        percent: \"Percent\",\n        sum: \"Sum\",\n        scatterPointScale: \"Point scale\",\n        FacetMaxBins: \"Facet max bins\",\n        FacetVMaxBins: \"Cross facet max bins\",\n        XMaxBins: \"X axis max bins\",\n        YMaxBins: \"Y axis max bins\",\n        XGridSize: \"X grid size\",\n        YGridSize: \"Y grid size\",\n        InnerPaddingSize: \"Inner padding size\",\n        OuterPaddingSize: \"Outer padding size\",\n        treeMapMethod: \"Treemap layout\",\n        facetColumns: \"Facet columns\",\n        facetRows: \"Facet rows\",\n        markOpacitySignal: \"Mark opacity\",\n        textScaleSignal: \"Text scale\",\n        xAxisTextAngleSignal: \"X axis text angle\",\n        yAxisTextAngleSignal: \"Y axis text angle\",\n        zGrounded: \"Z grounded\",\n        zScaleProportion: \"Z scale proportion to Y\",\n        selectionCount: (count)=>`${count} items selected`\n    },\n    maxLegends: 19,\n    onError: (errors)=>{\n    //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n    },\n    transitionDurations: Object.assign(Object.assign({}, $74c2763994d75bb8$var$defaultPresenterConfig.transitionDurations), {\n        scope: 600\n    }),\n    selectionPolygonZ: -1,\n    tickSize: 10\n};\nfunction $74c2763994d75bb8$export$c4db461e5e345a8(options) {\n    var style = {\n        cssPrefix: $74c2763994d75bb8$export$f0d47e1c119d5bf2,\n        fontFamily: options.fontFamily,\n        defaultCubeColor: $fc1d5f246c786135$exports.colorFromString(options.colors.defaultCube)\n    };\n    if (options.colors.hoveredCube) style.highlightColor = $fc1d5f246c786135$exports.colorFromString(options.colors.hoveredCube);\n    //if (options.lightSettings) {\n    // style.lightSettings = options.lightSettings;\n    //}\n    return style;\n}\nconst $74c2763994d75bb8$export$f0d47e1c119d5bf2 = \"sanddance-\";\nconst $74c2763994d75bb8$export$1641cdccd8d44edd = {\n    black: \"#212121\",\n    gray: \"#D2D2D2\",\n    blue: \"#0060F0\",\n    green: \"#00C000\",\n    orange: \"#FF9900\",\n    red: \"#E00000\"\n};\n\n\nfunction $944bef2715b44399$export$81adea670bebefbe(columnName, includeVegaDeckGLFields = false) {\n    if (includeVegaDeckGLFields) {\n        if (columnName === (0, $4d0539c68a8de77f$export$5672246984822a29)) return true;\n    }\n    for(let f in 0, $ec270fbe8d9983b4$export$10df5429b7082be2){\n        if (columnName === (0, $ec270fbe8d9983b4$export$10df5429b7082be2)[f]) return true;\n    }\n    return false;\n}\n\n\n\n\n\nconst $c9f2c41a3f8ee485$var$dualPairs = [\n    [\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).black,\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).gray\n    ],\n    [\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).red,\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).green\n    ],\n    [\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).red,\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).blue\n    ],\n    [\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).black,\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).red\n    ],\n    [\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).black,\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).orange\n    ],\n    [\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).black,\n        (0, $74c2763994d75bb8$export$1641cdccd8d44edd).green\n    ]\n];\nconst $c9f2c41a3f8ee485$export$2ad73d393c16f81c = [\n    {\n        scheme: (0, $ec270fbe8d9983b4$export$c991c3dd58d9959c),\n        colors: [\n            (0, $74c2763994d75bb8$export$fb736e4909afb3d7).colors.defaultCube\n        ]\n    }\n];\n$c9f2c41a3f8ee485$var$createDualColorSchemes();\nfunction $c9f2c41a3f8ee485$export$3030070885af9365(vega) {\n    $c9f2c41a3f8ee485$export$2ad73d393c16f81c.forEach((cs)=>{\n        if (cs.colors.length === 1) vega.scheme(cs.scheme, (x)=>cs.colors[0]);\n        else vega.scheme(cs.scheme, cs.colors);\n    });\n}\nfunction $c9f2c41a3f8ee485$var$createPair(names, colors) {\n    const scheme = `dual_${names[0]}${names[1]}`;\n    $c9f2c41a3f8ee485$export$2ad73d393c16f81c.push({\n        scheme: scheme,\n        colors: colors\n    });\n}\nfunction $c9f2c41a3f8ee485$var$createDualColorSchemes() {\n    $c9f2c41a3f8ee485$var$dualPairs.forEach((colors)=>{\n        const names = colors.map((color)=>{\n            for(let key in 0, $74c2763994d75bb8$export$1641cdccd8d44edd)if (color === (0, $74c2763994d75bb8$export$1641cdccd8d44edd)[key]) return key;\n        });\n        $c9f2c41a3f8ee485$var$createPair(names, colors);\n        $c9f2c41a3f8ee485$var$createPair([\n            ...names\n        ].reverse(), [\n            ...colors\n        ].reverse());\n    });\n}\n\n\n\nvar $0000a41cc7b5918f$exports = {};\n\n$parcel$export($0000a41cc7b5918f$exports, \"Viewer\", () => $0000a41cc7b5918f$export$2ec4afd9b3c16a85, (v) => $0000a41cc7b5918f$export$2ec4afd9b3c16a85 = v);\nvar $57be1fa2f8a8b996$export$d9e571576e98a7ab;\n(function(DataLayoutChange1) {\n    DataLayoutChange1[DataLayoutChange1[\"same\"] = 0] = \"same\";\n    DataLayoutChange1[DataLayoutChange1[\"reset\"] = 1] = \"reset\";\n    DataLayoutChange1[DataLayoutChange1[\"refine\"] = 2] = \"refine\";\n})($57be1fa2f8a8b996$export$d9e571576e98a7ab || ($57be1fa2f8a8b996$export$d9e571576e98a7ab = {}));\nclass $57be1fa2f8a8b996$export$c774d8c9d4e9e234 {\n    constructor(dataScope, props){\n        this.dataScope = dataScope;\n        this.props = props;\n    }\n    select(search) {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.select(search);\n            this.props.onDataChanged($57be1fa2f8a8b996$export$d9e571576e98a7ab.same);\n            resolve();\n        });\n    }\n    deselect() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deselect();\n            this.props.onDataChanged($57be1fa2f8a8b996$export$d9e571576e98a7ab.same);\n            resolve();\n        });\n    }\n    filter(search, keepData, collapseData, rebase) {\n        if (rebase) this.dataScope.collapse(false, keepData);\n        this.dataScope.collapse(true, collapseData);\n        return new Promise((resolve, reject)=>{\n            this.props.onAnimateDataChange($57be1fa2f8a8b996$export$d9e571576e98a7ab.refine, \"before refine\", \"refine\").then(()=>{\n                this.dataScope.deselect();\n                this.dataScope.setFilteredData(keepData);\n                this.props.onDataChanged($57be1fa2f8a8b996$export$d9e571576e98a7ab.refine, search);\n                resolve();\n            }).catch(reject);\n        });\n    }\n    reset() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deselect();\n            this.dataScope.setFilteredData(null);\n            this.props.onAnimateDataChange($57be1fa2f8a8b996$export$d9e571576e98a7ab.reset, \"before reset\", \"reset\").then(()=>{\n                this.dataScope.collapse(false);\n                this.props.onDataChanged($57be1fa2f8a8b996$export$d9e571576e98a7ab.reset);\n                resolve();\n            }).catch(reject);\n        });\n    }\n    activate(datum) {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.activate(datum);\n            this.props.onDataChanged($57be1fa2f8a8b996$export$d9e571576e98a7ab.same);\n            resolve();\n        });\n    }\n    deactivate() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deactivate();\n            this.props.onDataChanged($57be1fa2f8a8b996$export$d9e571576e98a7ab.same);\n            resolve();\n        });\n    }\n}\n\n\n\nfunction $0c9263d924197a37$var$cloneAxis(axes, axisColor, axisTextColor) {\n    return axes.map((axis)=>{\n        const newAxis = $fc1d5f246c786135$exports.deepMerge(axis);\n        if (newAxis.domain) newAxis.domain.color = axisColor;\n        if (newAxis.title) newAxis.title.color = axisTextColor;\n        newAxis.ticks.forEach((t)=>{\n            t.color = axisColor;\n        });\n        newAxis.tickText.forEach((t)=>{\n            t.color = axisTextColor;\n        });\n        return newAxis;\n    });\n}\nfunction $0c9263d924197a37$var$cloneTextData(textData, color) {\n    return textData.map((t)=>{\n        return Object.assign(Object.assign({}, t), {\n            color: color\n        });\n    });\n}\nfunction $0c9263d924197a37$export$bb42b694d535c95a(stage, oldColors, newColors) {\n    const hasNewLineColor = newColors.axisLine && newColors.axisLine !== oldColors.axisLine;\n    const hasNewTextColor = newColors.axisText && newColors.axisText !== oldColors.axisText;\n    let axes;\n    let textData;\n    if (hasNewLineColor || hasNewTextColor) {\n        const lineColor = $fc1d5f246c786135$exports.colorFromString(newColors.axisLine || oldColors.axisLine);\n        const textColor = $fc1d5f246c786135$exports.colorFromString(newColors.axisText || oldColors.axisText);\n        axes = {\n            x: $0c9263d924197a37$var$cloneAxis(stage.axes.x, lineColor, textColor),\n            y: $0c9263d924197a37$var$cloneAxis(stage.axes.y, lineColor, textColor),\n            z: $0c9263d924197a37$var$cloneAxis(stage.axes.z, lineColor, textColor)\n        };\n    }\n    if (hasNewTextColor) textData = $0c9263d924197a37$var$cloneTextData(stage.textData, $fc1d5f246c786135$exports.colorFromString(newColors.axisText));\n    return {\n        axes: axes,\n        textData: textData\n    };\n}\n\n\nfunction $674c26d108d883bb$export$cb7265fd11709ea(niceValue) {\n    //convert \"nice\" numbers to numeric value\n    return (niceValue + \"\").replace(/[\\s,]/g, \"\");\n}\nfunction $674c26d108d883bb$var$tickValue(axis, i) {\n    const tick = axis.tickText[i];\n    let value;\n    if (tick) value = axis.tickText[i].value;\n    return {\n        tick: tick,\n        value: value\n    };\n}\nfunction $674c26d108d883bb$export$1be0843eea5393e4(column) {\n    const searchExpression = {\n        name: column.name,\n        operator: \"isnullorEmpty\"\n    };\n    return searchExpression;\n}\nfunction $674c26d108d883bb$export$8543b98d22318eca(column, value) {\n    if (value == null) return $674c26d108d883bb$export$1be0843eea5393e4(column);\n    const searchExpression = {\n        name: column.name,\n        operator: \"==\",\n        value: value\n    };\n    return searchExpression;\n}\nfunction $674c26d108d883bb$export$e531b549585c011c(column, values) {\n    const expressions = values.map((value, i)=>{\n        const searchExpression = {\n            name: column.name,\n            operator: \"!=\",\n            value: value\n        };\n        if (i) searchExpression.clause = \"&&\";\n        return searchExpression;\n    });\n    const searchExpressionGroup = {\n        expressions: expressions\n    };\n    return searchExpressionGroup;\n}\nfunction $674c26d108d883bb$export$64b81e116b959f8a(axis, column, i) {\n    const result = $674c26d108d883bb$var$tickValue(axis, i);\n    if (result.tick) return $674c26d108d883bb$export$8543b98d22318eca(column, result.value);\n}\nfunction $674c26d108d883bb$export$8bb38a473c12645e(column, lowValue, highValue, lowOperator = \">=\", highOperator = \"<\") {\n    const expressions = [];\n    if (lowValue !== undefined) expressions.push({\n        name: column.name,\n        operator: lowOperator,\n        value: lowValue\n    });\n    if (highValue !== undefined) expressions.push({\n        name: column.name,\n        operator: highOperator,\n        value: highValue\n    });\n    if (expressions.length > 1) expressions[1].clause = \"&&\";\n    const searchExpressionGroup = {\n        expressions: expressions\n    };\n    return searchExpressionGroup;\n}\nfunction $674c26d108d883bb$export$80908cccce4a97cb(axis, column, i) {\n    const low = $674c26d108d883bb$var$tickValue(axis, i);\n    const high = $674c26d108d883bb$var$tickValue(axis, i + 1);\n    return $674c26d108d883bb$export$8bb38a473c12645e(column, low.value, high.value);\n}\n\n\n\n\nconst { allTruthy: $6c7749fd93c51064$export$84af6d08e329f176 , concat: $6c7749fd93c51064$export$ee1b3e54f0441b22 , push: $6c7749fd93c51064$export$4cbf152802aa238  } = (0, $fc1d5f246c786135$exports);\n\n\nfunction $2041f36649939dda$export$cb06c97de370398d(search) {\n    let group;\n    const vegaSearch = search;\n    if (Array.isArray(vegaSearch)) {\n        //flatten into one group\n        group = {\n            expressions: []\n        };\n        vegaSearch.forEach((g)=>{\n            const clonedExpressions = $fc1d5f246c786135$exports.clone(g.expressions).filter(Boolean);\n            clonedExpressions[0].clause = \"&&\";\n            (0, $6c7749fd93c51064$export$4cbf152802aa238)(group.expressions, clonedExpressions);\n        });\n    } else group = vegaSearch ? {\n        expressions: vegaSearch.expressions.filter(Boolean)\n    } : null;\n    return group;\n}\n\n\n\n\nfunction $04c641c9701e126c$export$7aba45edad9b8473(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n    const polygons = [];\n    const xRole = specCapabilities.roles.filter((r)=>r.role === \"x\")[0];\n    if (xRole && xRole.axisSelection) stage.axes.x.filter((axis)=>axis.tickText.length).forEach((axis)=>{\n        polygons.push.apply(polygons, $04c641c9701e126c$var$axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n    });\n    const yRole = specCapabilities.roles.filter((r)=>r.role === \"y\")[0];\n    if (yRole && yRole.axisSelection) stage.axes.y.filter((axis)=>axis.tickText.length).forEach((axis)=>{\n        polygons.push.apply(polygons, $04c641c9701e126c$var$axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n    });\n    if (stage.facets && columns.facet) polygons.push.apply(polygons, $04c641c9701e126c$var$facetSelectionPolygons(stage.facets));\n    //move polygons to Z\n    polygons.forEach((datum)=>{\n        datum.polygon.forEach((p)=>{\n            p[2] = polygonZ;\n        });\n    });\n    const onClick = (o, e)=>clickHandler(e.srcEvent, o.object.search);\n    const polygonLayer = new $975e8617bd73ab77$export$e2253033e6e1df16.layers.PolygonLayer({\n        autoHighlight: true,\n        coordinateSystem: $975e8617bd73ab77$export$e2253033e6e1df16.deck.COORDINATE_SYSTEM.CARTESIAN,\n        data: polygons,\n        extruded: false,\n        highlightColor: $fc1d5f246c786135$exports.colorFromString(highlightColor),\n        id: \"selections\",\n        onHover: (o, e)=>{\n            if (o.index === -1) presenter.deckgl.interactiveState.onAxisSelection = false;\n            else presenter.deckgl.interactiveState.onAxisSelection = true;\n        },\n        onClick: onClick,\n        getElevation: ()=>0,\n        getFillColor: ()=>[\n                0,\n                0,\n                0,\n                0\n            ],\n        pickable: true,\n        stroked: false\n    });\n    return polygonLayer;\n}\nfunction $04c641c9701e126c$var$axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n    const polygons = [];\n    const size = 50;\n    const getSearch = axisSelectionType === \"exact\" ? (a, c, i)=>({\n            expressions: [\n                (0, $674c26d108d883bb$export$64b81e116b959f8a)(a, c, i)\n            ]\n        }) : (0, $674c26d108d883bb$export$80908cccce4a97cb);\n    const { domain: domain , ticks: ticks  } = axis;\n    if (ticks.length > 0 && domain) {\n        const dim = vertical ? 1 : 0;\n        const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n        let divisions;\n        if (between) {\n            divisions = [];\n            for(let i = 1; i < ticks.length; i++)divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n        } else divisions = ticks.slice(1, -1).map((tick)=>tick.sourcePosition[dim]);\n        const add = (p2, i)=>{\n            const coords = [\n                [\n                    p1,\n                    q1\n                ],\n                [\n                    p2,\n                    q1\n                ],\n                [\n                    p2,\n                    q2\n                ],\n                [\n                    p1,\n                    q2\n                ]\n            ];\n            polygons.push({\n                search: getSearch(axis, column, i),\n                polygon: vertical ? coords.map((xy)=>xy.reverse()) : coords\n            });\n            p1 = p2;\n        };\n        let p1 = domain.sourcePosition[dim];\n        const q1 = domain.sourcePosition[vertical ? 0 : 1];\n        const q2 = q1 - size;\n        divisions.forEach(add);\n        add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n    }\n    return polygons;\n}\nfunction $04c641c9701e126c$var$facetSelectionPolygons(facetRects) {\n    const polygons = [];\n    const linesAndSearches = facetRects.map(({ datum: datum , lines: lines  }, i)=>{\n        let group = (0, $2041f36649939dda$export$cb06c97de370398d)(datum[(0, $ec270fbe8d9983b4$export$10df5429b7082be2).FacetSearch]);\n        return {\n            lines: lines,\n            search: group\n        };\n    });\n    linesAndSearches.forEach(({ lines: lines , search: search  }, i)=>{\n        //take any 2 lines to get a box dimension\n        const [x, y] = $04c641c9701e126c$var$minMaxPoints(lines.slice(2));\n        polygons.push({\n            search: search,\n            polygon: [\n                [\n                    x.min,\n                    y.min\n                ],\n                [\n                    x.max,\n                    y.min\n                ],\n                [\n                    x.max,\n                    y.max\n                ],\n                [\n                    x.min,\n                    y.max\n                ]\n            ]\n        });\n    });\n    return polygons;\n}\nfunction $04c641c9701e126c$var$minMaxPoints(lines) {\n    const points = [];\n    lines.forEach((line)=>{\n        [\n            line.sourcePosition,\n            line.targetPosition\n        ].forEach((point)=>{\n            points.push(point);\n        });\n    });\n    return [\n        0,\n        1\n    ].map((dim)=>{\n        let minMax = {\n            min: null,\n            max: null\n        };\n        points.forEach((point)=>{\n            if (minMax.max == null) minMax.max = point[dim];\n            else minMax.max = Math.max(minMax.max, point[dim]);\n            if (minMax.min == null) minMax.min = point[dim];\n            else minMax.min = Math.min(minMax.min, point[dim]);\n        });\n        return minMax;\n    });\n}\n\n\n\n\n\nfunction $0fd54a544f9d2363$export$9cf45ec8b4cc2b65(currentData, showSelectedData, showActive, viewerOptions) {\n    function getSelectionColorItem(datum) {\n        let item;\n        if (showSelectedData) item = datum[(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Selected] ? {\n            color: $fc1d5f246c786135$exports.colorFromString(viewerOptions.colors.selectedCube)\n        } : {\n            unSelected: true\n        };\n        if (showActive && datum[(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Active]) item = {\n            color: $fc1d5f246c786135$exports.colorFromString(viewerOptions.colors.activeCube)\n        };\n        return item;\n    }\n    const colorMap = {};\n    currentData.forEach((datum)=>{\n        const selectionColor = getSelectionColorItem(datum);\n        if (selectionColor) {\n            const ordinal = datum[0, $4d0539c68a8de77f$export$5672246984822a29];\n            colorMap[ordinal] = selectionColor;\n        }\n    });\n    return colorMap;\n}\nfunction $0fd54a544f9d2363$export$3b9379ac3646e0f0(cubes) {\n    const map = {};\n    cubes.forEach((cube)=>{\n        map[cube.ordinal] = {\n            color: cube.color\n        };\n    });\n    return map;\n}\nfunction $0fd54a544f9d2363$export$44addeff9a96c1e7(colorContext, presenter) {\n    if (!colorContext.colorMap) {\n        const cubes = presenter.getCubeData();\n        colorContext.colorMap = $0fd54a544f9d2363$export$3b9379ac3646e0f0(cubes);\n    }\n    colorContext.legend = $fc1d5f246c786135$exports.clone(presenter.stage.legend);\n    colorContext.legendElement = presenter.getElement($483619dbeb86ab73$export$79420be32f83a5b0.legend).children[0];\n}\nfunction $0fd54a544f9d2363$export$fa70acaad0e00464(maps, cubes, unselectedColorMethod) {\n    Object.keys(maps[0]).forEach((ordinal)=>{\n        const cube = cubes[+ordinal];\n        if (cube && !cube.isEmpty) {\n            const actualColorMappedItem = maps[0][ordinal];\n            if (maps.length > 1) {\n                const selectedColorMappedItem = maps[1][ordinal];\n                if (selectedColorMappedItem) {\n                    if (selectedColorMappedItem.unSelected && unselectedColorMethod) cube.color = unselectedColorMethod(actualColorMappedItem.color);\n                    else cube.color = selectedColorMappedItem.color;\n                    return;\n                }\n            }\n            cube.color = actualColorMappedItem.color;\n        }\n    });\n}\n\n\n\n\n\n\n\n\nclass $bb7ed1a84d2d22a1$export$3fb74a6ae4f1171d {\n    constructor(){\n        this.filteredColumnsStats = {};\n    }\n    setData(data, columns) {\n        const differentData = this.data !== data;\n        if (differentData) {\n            if (this.data) //clean up things we added to old data\n            this.deselect();\n            this.data = data;\n            this.columns = columns;\n            this.filteredData = null;\n            this.filteredColumnsStats = {};\n        }\n        return differentData;\n    }\n    setFilteredData(filteredData) {\n        this.filteredData = filteredData;\n        this.filteredColumnsStats = {};\n    }\n    getColumns(columnTypes) {\n        if (!this.columns) this.columns = (0, $ae86bb470afa6626$export$3f19ad07848df794)($975e8617bd73ab77$export$e2253033e6e1df16.vega.inferTypes, this.data, columnTypes);\n        return this.columns;\n    }\n    getFilteredColumnStats(columnName) {\n        if (!this.filteredColumnsStats[columnName]) this.filteredColumnsStats[columnName] = (0, $ae86bb470afa6626$export$432f698644f45d1)(this.filteredData, this.columns.filter((c)=>c.name === columnName)[0]);\n        return this.filteredColumnsStats[columnName];\n    }\n    currentData() {\n        return this.filteredData || this.data;\n    }\n    select(search) {\n        this.deselect();\n        if (search) {\n            this.selection = this.createUserSelection(search, true, false);\n            if (this.selection.included.length) this.activate(this.selection.included[0]);\n        }\n    }\n    createUserSelection(search, assign, rebase) {\n        const exec = new (0, $43c2526e199cbbfb$export$bbfd672d43392844)(search, this.getColumns());\n        const s = {\n            search: search,\n            included: [],\n            excluded: []\n        };\n        const data = rebase ? this.data : this.currentData();\n        data.forEach((datum)=>{\n            if (exec.run(datum)) {\n                if (assign) datum[(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Selected] = true;\n                s.included.push(datum);\n            } else s.excluded.push(datum);\n        });\n        return s;\n    }\n    deselect() {\n        this.deactivate();\n        this.data.forEach((datum)=>{\n            delete datum[(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Selected];\n        });\n        this.selection = null;\n    }\n    hasFilteredData() {\n        return !!this.filteredData;\n    }\n    hasSelectedData() {\n        return !!this.selection;\n    }\n    collapse(collapsed, data = this.data) {\n        data.forEach((datum)=>{\n            datum[(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Collapsed] = collapsed;\n        });\n        this.isCollapsed = collapsed;\n    }\n    activate(datum) {\n        this.deactivate();\n        datum[(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Active] = true;\n        this.active = datum;\n    }\n    deactivate() {\n        if (this.active) delete this.active[(0, $ec270fbe8d9983b4$export$10df5429b7082be2).Active];\n        this.active = null;\n    }\n    ordinalIndexWithinSelection(ordinal) {\n        if (this.selection) for(let i = 0; i < this.selection.included.length; i++){\n            let datum = this.selection.included[i];\n            if (datum[0, $4d0539c68a8de77f$export$5672246984822a29] === ordinal) return {\n                datum: datum,\n                index: i\n            };\n        }\n        return {\n            datum: null,\n            index: -1\n        };\n    }\n    finalize() {\n        this.data = null;\n        this.filteredData = null;\n        this.filteredColumnsStats = null;\n        if (this.selection) {\n            this.selection.excluded = null;\n            this.selection.included = null;\n            this.selection = null;\n        }\n    }\n}\n\n\n\n\n\n\n\n\n\nvar $1e584946c82e7f09$var$Action;\n(function(Action1) {\n    Action1[Action1[\"deselect\"] = 0] = \"deselect\";\n    Action1[Action1[\"isolate\"] = 1] = \"isolate\";\n    Action1[Action1[\"exclude\"] = 2] = \"exclude\";\n    Action1[Action1[\"reset\"] = 3] = \"reset\";\n    Action1[Action1[\"next\"] = 4] = \"next\";\n    Action1[Action1[\"previous\"] = 5] = \"previous\";\n})($1e584946c82e7f09$var$Action || ($1e584946c82e7f09$var$Action = {}));\nclass $1e584946c82e7f09$export$3e8048d3cf2ba3fd {\n    constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps){\n        this.language = language;\n        this.animator = animator;\n        this.dataScope = dataScope;\n        this.colorMapHandler = colorMapHandler;\n        this.hasColorMaps = hasColorMaps;\n        this.element = (0, $fc1d5f246c786135$exports).addDiv(parentElement, `${(0, $74c2763994d75bb8$export$f0d47e1c119d5bf2)}unitControls`);\n        this.clear();\n    }\n    finalize() {\n        if (this.element) this.element.innerHTML = \"\";\n        this.dataScope = null;\n        this.element = null;\n    }\n    clear() {\n        this.state = {\n            userSelection: null,\n            index: -1,\n            remapColor: false\n        };\n        this.render();\n    }\n    clearSelection() {\n        this.state.userSelection = null;\n        this.state.index = -1;\n        this.render();\n    }\n    populate(userSelection, index = 0) {\n        this.state.userSelection = userSelection;\n        this.state.index = index;\n        this.render();\n    }\n    selectByNameValue(columnName, value) {\n        const search = {\n            name: columnName,\n            operator: \"==\",\n            value: value\n        };\n        this.clearSelection();\n        this.animator.select(search);\n        this.populate(this.dataScope.selection);\n    }\n    remapChanged(remap) {\n        this.state.remapColor = remap;\n        this.colorMapHandler(remap);\n        this.render();\n    }\n    handleAction(action) {\n        let p;\n        const u = this.state.userSelection;\n        switch(action){\n            case $1e584946c82e7f09$var$Action.deselect:\n                this.clearSelection();\n                p = this.animator.deselect();\n                break;\n            case $1e584946c82e7f09$var$Action.exclude:\n                this.clearSelection();\n                p = this.animator.filter((0, $29d69ef6542a87a4$export$6897c284b6f9f4dc)(u.search), u.excluded, u.included, false);\n                this.state.remapColor = false;\n                break;\n            case $1e584946c82e7f09$var$Action.isolate:\n                this.clearSelection();\n                p = this.animator.filter(u.search, u.included, u.excluded, false);\n                this.state.remapColor = false;\n                break;\n            case $1e584946c82e7f09$var$Action.reset:\n                this.clear();\n                p = this.animator.reset();\n                break;\n            default:\n                switch(action){\n                    case $1e584946c82e7f09$var$Action.previous:\n                        this.state.index--;\n                        if (this.state.index < 0) this.state.index = this.state.userSelection.included.length - 1;\n                        break;\n                    case $1e584946c82e7f09$var$Action.next:\n                        this.state.index++;\n                        if (this.state.index >= this.state.userSelection.included.length) this.state.index = 0;\n                        break;\n                }\n                this.render();\n                p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n        p.then(()=>this.render());\n    }\n    render() {\n        const hasRefinedData = this.dataScope.hasFilteredData();\n        const renderProps = {\n            language: this.language,\n            actionHandler: (action)=>this.handleAction(action),\n            selectionHandler: (columnName, value)=>this.selectByNameValue(columnName, value),\n            count: this.state.userSelection && this.state.userSelection.included.length,\n            hasRefinedData: hasRefinedData,\n            item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n            remapColorHandler: (remap)=>this.remapChanged(remap),\n            hasColorMaps: this.hasColorMaps() && hasRefinedData,\n            remapColor: this.state.remapColor\n        };\n        const a = $fc1d5f246c786135$exports.getActiveElementInfo();\n        $fc1d5f246c786135$exports.mount($1e584946c82e7f09$var$renderDetails(renderProps), this.element);\n        $fc1d5f246c786135$exports.setActiveElement(a);\n    }\n}\nconst $1e584946c82e7f09$var$renderDetails = (props)=>{\n    const controlButtons = [\n        $fc1d5f246c786135$exports.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler($1e584946c82e7f09$var$Action.deselect)\n        }, props.language.deselect),\n        $fc1d5f246c786135$exports.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler($1e584946c82e7f09$var$Action.isolate)\n        }, props.language.isolate),\n        $fc1d5f246c786135$exports.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler($1e584946c82e7f09$var$Action.exclude)\n        }, props.language.exclude)\n    ];\n    const colorMapping = $fc1d5f246c786135$exports.createElement(\"div\", null, $fc1d5f246c786135$exports.createElement(\"button\", {\n        disabled: props.remapColor,\n        onClick: (e)=>props.remapColorHandler(true)\n    }, props.language.newColorMap), $fc1d5f246c786135$exports.createElement(\"button\", {\n        disabled: !props.remapColor,\n        onClick: (e)=>props.remapColorHandler(false)\n    }, props.language.oldColorMap));\n    const singleItem = props.count === 1;\n    const scrollButtons = [\n        $fc1d5f246c786135$exports.createElement(\"button\", {\n            disabled: singleItem,\n            onClick: (e)=>props.actionHandler($1e584946c82e7f09$var$Action.previous)\n        }, props.language.previousDetail),\n        $fc1d5f246c786135$exports.createElement(\"button\", {\n            disabled: singleItem,\n            onClick: (e)=>props.actionHandler($1e584946c82e7f09$var$Action.next)\n        }, props.language.nextDetail),\n        $fc1d5f246c786135$exports.createElement(\"span\", null, \" \", props.language.selectionCount(props.count))\n    ];\n    const rows = [];\n    for(let prop in props.item){\n        if (prop === (0, $4d0539c68a8de77f$export$5672246984822a29)) continue;\n        if ((0, $944bef2715b44399$export$81adea670bebefbe)(prop)) continue;\n        rows.push({\n            cells: [\n                {\n                    content: prop\n                },\n                {\n                    content: $1e584946c82e7f09$var$linkSelect(props.language, prop, props.item[prop], props.selectionHandler)\n                }\n            ]\n        });\n    }\n    return $fc1d5f246c786135$exports.createElement(\"div\", null, props.hasColorMaps && colorMapping, $fc1d5f246c786135$exports.createElement(\"h4\", null, props.language.headers.selection), $fc1d5f246c786135$exports.createElement(\"div\", {\n        className: `${(0, $74c2763994d75bb8$export$f0d47e1c119d5bf2)}selection`\n    }, controlButtons, $fc1d5f246c786135$exports.createElement(\"button\", {\n        disabled: !props.hasRefinedData,\n        onClick: (e)=>props.actionHandler($1e584946c82e7f09$var$Action.reset)\n    }, \"reset\")), props.item && $fc1d5f246c786135$exports.createElement(\"h4\", null, props.language.headers.details), $fc1d5f246c786135$exports.createElement(\"div\", null, $fc1d5f246c786135$exports.createElement(\"div\", {\n        className: `${(0, $74c2763994d75bb8$export$f0d47e1c119d5bf2)}details-scroll`\n    }, props.item && scrollButtons), $fc1d5f246c786135$exports.createElement(\"div\", {\n        className: `${(0, $74c2763994d75bb8$export$f0d47e1c119d5bf2)}details`\n    }, props.item && $fc1d5f246c786135$exports.createElement((0, $4abdd534baaa0892$exports).Table, {\n        rows: rows\n    }))));\n};\nfunction $1e584946c82e7f09$var$linkSelect(language, columnName, value, selectionHandler) {\n    return $fc1d5f246c786135$exports.createElement(\"span\", null, $fc1d5f246c786135$exports.createElement(\"a\", {\n        href: \"#\",\n        onClick: (e)=>selectionHandler(columnName, value)\n    }, value), isNaN(value) ? [\n        \" \",\n        $fc1d5f246c786135$exports.createElement(\"a\", {\n            className: \"bing-search\",\n            href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n            target: \"_blank\"\n        }, language.bing)\n    ] : \"\");\n}\n\n\n\nfunction $a6c27e3c8d5dfd72$export$1d674716cc6da32f(presenter, headers) {\n    const vegaControls = presenter.getElement((0, $483619dbeb86ab73$export$79420be32f83a5b0).vegaControls);\n    $a6c27e3c8d5dfd72$var$conditionalHeader(!!vegaControls.querySelectorAll(\".vega-bindings > *\").length, vegaControls, headers.chart);\n    const legend = presenter.getElement((0, $483619dbeb86ab73$export$79420be32f83a5b0).legend);\n    $a6c27e3c8d5dfd72$var$conditionalHeader(!!legend.children.length, legend, headers.legend);\n}\nfunction $a6c27e3c8d5dfd72$var$conditionalHeader(condition, element, header) {\n    var existing = $a6c27e3c8d5dfd72$var$existingHeader(element, header);\n    if (condition && !existing) $a6c27e3c8d5dfd72$var$addHeader(element, header);\n    if (!condition && existing) existing.remove();\n}\nfunction $a6c27e3c8d5dfd72$var$addHeader(element, header) {\n    const h = document.createElement(\"h4\");\n    h.innerHTML = header;\n    element.insertAdjacentElement(\"beforebegin\", h);\n}\nfunction $a6c27e3c8d5dfd72$var$existingHeader(element, header) {\n    const { previousElementSibling: previousElementSibling  } = element;\n    if (previousElementSibling && previousElementSibling.innerHTML === header) return previousElementSibling;\n}\n\n\n\n\nfunction $d50aa7ce26a6d6ed$var$legendRange(colorBinType, column, legend, clickedIndex) {\n    if (column.quantitative) return $d50aa7ce26a6d6ed$var$selectQuantitative(colorBinType, column, legend, clickedIndex);\n    else return $d50aa7ce26a6d6ed$var$selectCategorical(column, legend, clickedIndex);\n}\nfunction $d50aa7ce26a6d6ed$var$selectCategorical(column, legend, clickedIndex) {\n    const value = legend.rows[clickedIndex].value;\n    if (value === (0, $ec270fbe8d9983b4$export$8653a30c44b6e879)) {\n        const values = [];\n        for(let i in legend.rows)if (+i !== clickedIndex) values.push(legend.rows[i].value);\n        return (0, $674c26d108d883bb$export$e531b549585c011c)(column, values);\n    } else //select equal\n    return {\n        expressions: [\n            (0, $674c26d108d883bb$export$8543b98d22318eca)(column, legend.rows[clickedIndex].value)\n        ]\n    };\n}\nfunction $d50aa7ce26a6d6ed$var$selectQuantitative(colorBinType, column, legend, clickedIndex) {\n    const keys = Object.keys(legend.rows).map((key)=>+key).sort((a, b)=>+a - +b);\n    let lowValue;\n    let lowOperator;\n    let highValue;\n    let highOperator;\n    const rowText = legend.rows[clickedIndex].label;\n    switch(colorBinType){\n        case \"continuous\":\n            lowValue = rowText;\n            if (clickedIndex < keys.length - 1) highValue = legend.rows[clickedIndex + 1].value;\n            break;\n        default:\n            {\n                if (rowText.indexOf(\"null\") > 0) {\n                    const ex = {\n                        expressions: [\n                            (0, $674c26d108d883bb$export$1be0843eea5393e4)(column)\n                        ]\n                    };\n                    return ex;\n                }\n                const dash = rowText.indexOf(\"\\u2013\"); //this is not the common dash character!\n                if (dash > 0) {\n                    //bug in Vega for quantize?\n                    //lowOperator = '>';\n                    //highOperator = '<=';\n                    lowValue = rowText.substr(0, dash);\n                    highValue = rowText.substr(dash + 1);\n                } else {\n                    if (rowText.indexOf(\"<\") >= 0) highValue = rowText.substring(2);\n                    else if (rowText.indexOf(\"\\u2265\") >= 0) lowValue = rowText.substring(2);\n                }\n            }\n    }\n    if (lowValue) lowValue = (0, $674c26d108d883bb$export$cb7265fd11709ea)(lowValue);\n    if (highValue) highValue = (0, $674c26d108d883bb$export$cb7265fd11709ea)(highValue);\n    if (lowValue === highValue) return {\n        expressions: [\n            (0, $674c26d108d883bb$export$8543b98d22318eca)(column, lowValue)\n        ]\n    };\n    else return (0, $674c26d108d883bb$export$8bb38a473c12645e)(column, lowValue, highValue, lowOperator, highOperator);\n}\nfunction $d50aa7ce26a6d6ed$export$71ab65a966760ac3(colorBinType, colorColumn, legend, language) {\n    const rowTexts = [];\n    for(let i in legend.rows){\n        let row = legend.rows[i];\n        row.search = $d50aa7ce26a6d6ed$var$legendRange(colorBinType, colorColumn, legend, +i);\n        if (row.value === (0, $ec270fbe8d9983b4$export$8653a30c44b6e879)) row.label = language.legendOther;\n        else rowTexts.push(row.value);\n    }\n}\n\n\n\nfunction $2de8589006f21d6f$export$f03cc77b21b3a2b2(columns, data, ordinalMap) {\n    const uCol = columns.uid && columns.uid.name;\n    if (ordinalMap) data.forEach((d, i)=>{\n        const key = uCol ? d[uCol] : i;\n        d[0, $4d0539c68a8de77f$export$5672246984822a29] = ordinalMap[key];\n    });\n    else {\n        ordinalMap = {};\n        data.forEach((d, i)=>{\n            d[0, $4d0539c68a8de77f$export$5672246984822a29] = i;\n            const uColValue = uCol ? d[uCol] : i;\n            ordinalMap[uColValue] = i;\n        });\n    }\n    return ordinalMap;\n}\nfunction $2de8589006f21d6f$export$5844459bbee68321(cube, data) {\n    const len = data.length;\n    for(let i = 0; i < len; i++){\n        if (data[i][0, $4d0539c68a8de77f$export$5672246984822a29] === cube.ordinal) return i;\n    }\n}\n\n\n\nfunction $7f509bc53ab5b2b2$export$385a06e733eab4de(sv, b) {\n    if (!sv || !b || !b.signals || !b.signals.length) return;\n    for(let key in sv){\n        let value = sv[key];\n        let signalB = b.signals.filter((signal)=>signal.name === key)[0];\n        if (signalB && signalB.bind) signalB.value = value;\n    }\n}\nfunction $7f509bc53ab5b2b2$export$764590c093441ac7(view, spec) {\n    if (!view || !spec || !spec.signals || !spec.signals.length) return;\n    const result = {};\n    spec.signals.forEach((signalA)=>{\n        //bound to a UI control\n        if (signalA.bind) try {\n            result[signalA.name] = view.signal(signalA.name);\n        } catch (e) {\n        // continue regardless of error\n        }\n    });\n    return result;\n}\n\n\n\n\n\nconst { outerSize: $a5823b006e1d2fb5$var$outerSize  } = $fc1d5f246c786135$exports;\nconst { Table: $a5823b006e1d2fb5$var$Table  } = $4abdd534baaa0892$exports;\nclass $a5823b006e1d2fb5$export$28c660c63b792dea {\n    constructor(props){\n        const renderProps = {\n            cssPrefix: props.cssPrefix,\n            rows: $a5823b006e1d2fb5$var$getRows(props.item, props.options)\n        };\n        this.element = $a5823b006e1d2fb5$var$renderTooltip(renderProps);\n        if (this.element) {\n            this.element.style.position = \"absolute\";\n            this.child = this.element.firstChild;\n            document.body.appendChild(this.element);\n            //measure and move as necessary\n            let m = $a5823b006e1d2fb5$var$outerSize(this.child);\n            while(m.height > document.documentElement.clientHeight){\n                let tr = this.child.querySelector(\"tr:last-child\");\n                if (tr) tr.parentElement.removeChild(tr);\n                else break;\n                m = $a5823b006e1d2fb5$var$outerSize(this.child);\n            }\n            if (props.position.clientX + m.width >= document.documentElement.clientWidth) this.child.style.right = \"0\";\n            let moveTop = true;\n            if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n                if (props.position.clientY - m.height > 0) this.child.style.bottom = \"0\";\n                else moveTop = false;\n            }\n            if (moveTop) this.element.style.top = `${props.position.clientY}px`;\n            this.element.style.left = `${props.position.clientX}px`;\n        }\n    }\n    finalize() {\n        if (this.element) document.body.removeChild(this.element);\n        this.element = null;\n    }\n}\nfunction $a5823b006e1d2fb5$var$getRows(item, options) {\n    const rows = [];\n    for(let columnName in item){\n        if (columnName === (0, $4d0539c68a8de77f$export$5672246984822a29)) continue;\n        if ((0, $944bef2715b44399$export$81adea670bebefbe)(columnName)) continue;\n        if (options && options.exclude) {\n            if (options.exclude(columnName)) continue;\n        }\n        let value = item[columnName];\n        let content;\n        if (options && options.displayValue) content = options.displayValue(value);\n        else switch(value){\n            case null:\n                content = $fc1d5f246c786135$exports.createElement(\"i\", null, \"null\");\n                break;\n            case undefined:\n                content = $fc1d5f246c786135$exports.createElement(\"i\", null, \"undefined\");\n                break;\n            default:\n                content = value.toString();\n        }\n        rows.push({\n            cells: [\n                {\n                    content: columnName + \":\"\n                },\n                {\n                    content: content\n                }\n            ]\n        });\n    }\n    return rows;\n}\nconst $a5823b006e1d2fb5$var$renderTooltip = (props)=>{\n    return props.rows.length === 0 ? null : $fc1d5f246c786135$exports.createElement(\"div\", {\n        className: `${props.cssPrefix}tooltip`\n    }, $a5823b006e1d2fb5$var$Table({\n        rows: props.rows\n    }));\n};\n\n\n\n\n\nclass $a69b4de50b0b6b13$export$fba22c9d3f66adb {\n    resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n        if (forceNewCharacterSet || $a69b4de50b0b6b13$var$needsNewCharacterSet(oldInsight, newInsight)) this.chars = undefined;\n    }\n    getCharacterSet(stage) {\n        if (!this.chars) {\n            const map = {};\n            const addText = (text)=>{\n                Array.from(text).forEach((char)=>{\n                    map[char] = true;\n                });\n            };\n            stage.textData.forEach((t)=>addText(t.text));\n            const { x: x , y: y , z: z  } = stage.axes;\n            [\n                x,\n                y,\n                z\n            ].forEach((axes)=>{\n                axes.forEach((axis)=>{\n                    if (axis.tickText) axis.tickText.forEach((t)=>addText(t.text));\n                    if (axis.title) addText(axis.title.text);\n                });\n            });\n            this.chars = Object.keys(map);\n        }\n        return this.chars;\n    }\n}\nfunction $a69b4de50b0b6b13$var$needsNewCharacterSet(oldInsight, newInsight) {\n    if (!oldInsight) return true;\n    if (!newInsight) return true;\n    if (oldInsight.chart !== newInsight.chart) return true;\n    if (oldInsight.facetStyle !== newInsight.facetStyle) return true;\n    if (oldInsight.totalStyle !== newInsight.totalStyle) return true;\n    if (oldInsight.hideAxes !== newInsight.hideAxes) return true;\n    if (oldInsight.view !== newInsight.view) return true;\n    if ($a69b4de50b0b6b13$var$differentObjectValues(oldInsight.signalValues, newInsight.signalValues)) return true;\n    if ($a69b4de50b0b6b13$var$differentObjectValues(oldInsight.size, newInsight.size)) return true;\n    const oldColumns = oldInsight.columns;\n    const newColumns = newInsight.columns;\n    if (oldColumns.facet !== newColumns.facet) return true;\n    if (oldColumns.facetV !== newColumns.facetV) return true;\n    if (oldColumns.x !== newColumns.x) return true;\n    if (oldColumns.y !== newColumns.y) return true;\n    if (oldColumns.z !== newColumns.z) return true;\n    return false;\n}\nfunction $a69b4de50b0b6b13$var$differentObjectValues(a, b) {\n    if (!a && !b) return false;\n    if (!a || !b) return true;\n    const keys = Object.keys(b);\n    for(let i = 0; i < keys.length; i++){\n        let key = keys[i];\n        let ta = typeof a;\n        let tb = typeof b;\n        if (ta !== tb) return true;\n        if (ta === \"object\") return $a69b4de50b0b6b13$var$differentObjectValues(a[key], b[key]);\n        else {\n            if (a[key] !== b[key]) return true;\n        }\n    }\n    return false;\n}\n\n\nvar $0000a41cc7b5918f$var$__awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nconst { defaultView: $0000a41cc7b5918f$var$defaultView  } = $cb224439f6a2e69c$exports;\nconst $0000a41cc7b5918f$var$zAxisZindex = 1010;\nlet $0000a41cc7b5918f$var$didRegisterColorSchemes = false;\nclass $0000a41cc7b5918f$export$2ec4afd9b3c16a85 {\n    /**\n     * Instantiate a new Viewer.\n     * @param element Parent HTMLElement to present within.\n     * @param options Optional viewer options object.\n     */ constructor(element, options){\n        this.element = element;\n        this.options = $fc1d5f246c786135$exports.deepMerge((0, $74c2763994d75bb8$export$fb736e4909afb3d7), options);\n        this.presenter = new $61fffe029a7d3e23$export$893c88c42e3630f9(element, (0, $74c2763994d75bb8$export$c4db461e5e345a8)(this.options));\n        this._characterSet = new (0, $a69b4de50b0b6b13$export$fba22c9d3f66adb)();\n        this._dataScope = new (0, $bb7ed1a84d2d22a1$export$3fb74a6ae4f1171d)();\n        this._animator = new (0, $57be1fa2f8a8b996$export$c774d8c9d4e9e234)(this._dataScope, {\n            onDataChanged: this.onDataChanged.bind(this),\n            onAnimateDataChange: this.onAnimateDataChange.bind(this)\n        });\n        this._details = new (0, $1e584946c82e7f09$export$3e8048d3cf2ba3fd)(this.presenter.getElement($483619dbeb86ab73$export$79420be32f83a5b0.panel), this.options.language, this._animator, this._dataScope, (remap)=>{\n            this.currentColorContext = ~~remap;\n            this.renderSameLayout();\n        }, ()=>this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n        this.insight = {};\n    }\n    changeColorContexts(colorContexts) {\n        this.colorContexts = colorContexts;\n        this.currentColorContext = 0;\n        this.options.onColorContextChange && this.options.onColorContextChange();\n    }\n    applyLegendColorContext(colorContext) {\n        const a = $fc1d5f246c786135$exports.getActiveElementInfo();\n        $fc1d5f246c786135$exports.mount(colorContext.legendElement, this.presenter.getElement($483619dbeb86ab73$export$79420be32f83a5b0.legend));\n        $fc1d5f246c786135$exports.setActiveElement(a);\n        this.presenter.stage.legend = colorContext.legend;\n    }\n    onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n        return new Promise((resolve, reject)=>{\n            let innerPromise;\n            if (dataChange === (0, $57be1fa2f8a8b996$export$d9e571576e98a7ab).refine) {\n                const oldColorContext = this.colorContexts[this.currentColorContext];\n                innerPromise = new Promise((innerResolve)=>{\n                    this.renderNewLayout({}, {\n                        preStage: (stage, deckProps)=>{\n                            (0, $d50aa7ce26a6d6ed$export$71ab65a966760ac3)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                            this.overrideAxisLabels(stage);\n                            (0, $0fd54a544f9d2363$export$fa70acaad0e00464)([\n                                oldColorContext.colorMap\n                            ], $fc1d5f246c786135$exports.getCubes(deckProps));\n                            if (this.options.onStage) this.options.onStage(stage, deckProps);\n                        }\n                    }).then(()=>{\n                        //apply old legend\n                        this.applyLegendColorContext(oldColorContext);\n                        innerResolve();\n                    });\n                });\n            } else innerPromise = this.renderNewLayout({}, {\n                preStage: (stage, deckProps)=>{\n                    (0, $d50aa7ce26a6d6ed$export$71ab65a966760ac3)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                    this.overrideAxisLabels(stage);\n                    if (this.options.onStage) this.options.onStage(stage, deckProps);\n                }\n            });\n            innerPromise.then(()=>{\n                this.presenter.animationQueue(resolve, this.options.transitionDurations.position, {\n                    waitingLabel: waitingLabel,\n                    handlerLabel: handlerLabel,\n                    animationCanceled: reject\n                });\n            });\n        });\n    }\n    onDataChanged(dataLayout, filter) {\n        return $0000a41cc7b5918f$var$__awaiter(this, void 0, void 0, function*() {\n            switch(dataLayout){\n                case (0, $57be1fa2f8a8b996$export$d9e571576e98a7ab).same:\n                    this.renderSameLayout();\n                    break;\n                case (0, $57be1fa2f8a8b996$export$d9e571576e98a7ab).refine:\n                    {\n                        //save cube colors\n                        const oldColorContext = this.colorContexts[this.currentColorContext];\n                        let colorMap;\n                        yield this.renderNewLayout({}, {\n                            preStage: (stage, deckProps)=>{\n                                //save off the spec colors\n                                colorMap = (0, $0fd54a544f9d2363$export$3b9379ac3646e0f0)(stage.cubeData);\n                                (0, $0fd54a544f9d2363$export$fa70acaad0e00464)([\n                                    oldColorContext.colorMap\n                                ], $fc1d5f246c786135$exports.getCubes(deckProps));\n                                this.preStage(stage, deckProps);\n                            },\n                            onPresent: ()=>{\n                                //save new legend\n                                const newColorContext = {\n                                    colorMap: colorMap,\n                                    legend: $fc1d5f246c786135$exports.clone(this.presenter.stage.legend),\n                                    legendElement: this.presenter.getElement($483619dbeb86ab73$export$79420be32f83a5b0.legend).children[0]\n                                };\n                                //apply old legend\n                                this.applyLegendColorContext(oldColorContext);\n                                this.changeColorContexts([\n                                    oldColorContext,\n                                    newColorContext\n                                ]);\n                            }\n                        });\n                        //narrow the filter only if it is different\n                        if (!$93e9fd90e1c55c05$export$398604a469f7de9a(this.insight.filter, filter)) this.insight.filter = $8cda325438b8cb6f$export$ec67f55c222e1546(this.insight.filter, filter);\n                        if (this.options.onDataFilter) this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                        break;\n                    }\n                case (0, $57be1fa2f8a8b996$export$d9e571576e98a7ab).reset:\n                    {\n                        const colorContext = {\n                            colorMap: null,\n                            legend: null,\n                            legendElement: null\n                        };\n                        this.changeColorContexts([\n                            colorContext\n                        ]);\n                        yield this.renderNewLayout({}, {\n                            onPresent: ()=>{\n                                (0, $0fd54a544f9d2363$export$44addeff9a96c1e7)(colorContext, this.presenter);\n                            }\n                        });\n                        delete this.insight.filter;\n                        if (this.options.onDataFilter) this.options.onDataFilter(null, null);\n                        break;\n                    }\n            }\n            if (this.options.onSelectionChanged) {\n                const sel = this.getSelection();\n                this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n            }\n        });\n    }\n    getSpecColumnsWithFilteredStats() {\n        if (!this._dataScope.hasFilteredData()) return this._specColumns;\n        const roles = [\n            \"color\",\n            \"facet\",\n            \"group\",\n            \"size\",\n            \"sort\",\n            \"sum\",\n            \"x\",\n            \"y\",\n            \"z\"\n        ];\n        const specColumns = Object.assign({}, this._specColumns);\n        roles.forEach((r)=>{\n            if (specColumns[r]) {\n                const column = Object.assign({}, specColumns[r]);\n                column.stats = this.getColumnStats(column);\n                specColumns[r] = column;\n            }\n        });\n        return specColumns;\n    }\n    renderNewLayout(signalValues, presenterConfig, view) {\n        return $0000a41cc7b5918f$var$__awaiter(this, void 0, void 0, function*() {\n            const currData = this._dataScope.currentData();\n            const context = {\n                specColumns: this.getSpecColumnsWithFilteredStats(),\n                insight: this.insight,\n                specViewOptions: Object.assign(Object.assign({}, this.options), {\n                    zAxisOptions: {\n                        showZAxis: true,\n                        zIndex: $0000a41cc7b5918f$var$zAxisZindex\n                    }\n                })\n            };\n            const specResult = (0, $7e9d31f0ccd4826a$export$3f8fe6489e95757d)(context, currData);\n            if (!specResult.errors) {\n                const uiValues = (0, $7f509bc53ab5b2b2$export$764590c093441ac7)(this.vegaViewGl, this.vegaSpec);\n                (0, $7f509bc53ab5b2b2$export$385a06e733eab4de)(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n                this.vegaSpec = specResult.vegaSpec;\n                this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n                this.specCapabilities = specResult.specCapabilities;\n                const config = this.createConfig(presenterConfig);\n                if (view) config.getView = ()=>view;\n                if (!$0000a41cc7b5918f$var$didRegisterColorSchemes) {\n                    (0, $c9f2c41a3f8ee485$export$3030070885af9365)($975e8617bd73ab77$export$e2253033e6e1df16.vega);\n                    $0000a41cc7b5918f$var$didRegisterColorSchemes = true;\n                }\n                try {\n                    if (this.vegaViewGl) this.vegaViewGl.finalize();\n                    const runtime = $975e8617bd73ab77$export$e2253033e6e1df16.vega.parse(this.vegaSpec);\n                    this.vegaViewGl = new $ba8a128a941ed656$export$6d8f9057dcd7f9e6(runtime, config).renderer(\"deck.gl\").initialize(this.element);\n                    yield this.vegaViewGl.runAsync();\n                    const handler = (n, v)=>{\n                        this._characterSet.resetCharacterSet(true);\n                    };\n                    this.vegaSpec.signals.forEach((s)=>{\n                        this.vegaViewGl.addSignalListener(s.name, handler);\n                    });\n                    //capture new color color contexts via signals\n                    this.configForSignalCapture(config.presenterConfig);\n                } catch (e) {\n                    specResult.errors = [\n                        e.message\n                    ];\n                }\n                if (!specResult.errors) (0, $a6c27e3c8d5dfd72$export$1d674716cc6da32f)(this.presenter, this.options.language.headers);\n            }\n            if (specResult.errors) {\n                if (this.options.onError) this.options.onError(specResult.errors);\n                else if (this.presenter.logger) this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join(\"\\n\")}`);\n            }\n            return specResult;\n        });\n    }\n    /**\n     * Render the same layout with new options.\n     * @param newViewerOptions New options object.\n     */ renderSameLayout(newViewerOptions) {\n        const colorContext = this.colorContexts[this.currentColorContext];\n        const clonedCubes = this.presenter.getCubeData().map((cube)=>{\n            return Object.assign({}, cube);\n        });\n        this.applyLegendColorContext(colorContext);\n        let { axes: axes , textData: textData  } = this.presenter.stage;\n        let recoloredAxes;\n        if (newViewerOptions) {\n            if (newViewerOptions.colors) {\n                recoloredAxes = (0, $0c9263d924197a37$export$bb42b694d535c95a)(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n                this._lastColorOptions = $fc1d5f246c786135$exports.clone(newViewerOptions.colors);\n                axes = recoloredAxes.axes || axes;\n                textData = recoloredAxes.textData || textData;\n            }\n            this.options = $fc1d5f246c786135$exports.deepMerge(this.options, newViewerOptions);\n        }\n        let colorMaps = [\n            colorContext.colorMap\n        ];\n        let colorMethod;\n        const hasSelectedData = this._dataScope.hasSelectedData();\n        const hasActive = !!this._dataScope.active;\n        if (hasSelectedData || hasActive) {\n            const selectedColorMap = (0, $0fd54a544f9d2363$export$9cf45ec8b4cc2b65)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n            colorMaps.push(selectedColorMap);\n            colorMethod = this.options.colors.unselectedColorMethod;\n        }\n        (0, $0fd54a544f9d2363$export$fa70acaad0e00464)(colorMaps, clonedCubes, colorMethod);\n        const stage = {\n            cubeData: clonedCubes,\n            axes: axes,\n            textData: textData\n        };\n        this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n    }\n    getView(view) {\n        if (view === undefined) {\n            if (this.presenter.view === null) return $0000a41cc7b5918f$var$defaultView;\n            else return this.presenter.view;\n        } else return view;\n    }\n    transformData(values, transform) {\n        try {\n            const runtime = $975e8617bd73ab77$export$e2253033e6e1df16.vega.parse({\n                $schema: \"https://vega.github.io/schema/vega/v4.json\",\n                data: [\n                    {\n                        name: \"source\",\n                        values: values,\n                        transform: transform\n                    }\n                ]\n            });\n            new $ba8a128a941ed656$export$6d8f9057dcd7f9e6(runtime).run();\n        } catch (e) {\n        // continue regardless of error\n        }\n        return values;\n    }\n    /**\n     * Render data into a visualization.\n     * @param insight Object to create a visualization specification.\n     * @param data Array of data objects.\n     * @param view Optional View to specify camera type.\n     * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n     */ render(insight, data, options = {}) {\n        return $0000a41cc7b5918f$var$__awaiter(this, void 0, void 0, function*() {\n            let result;\n            //see if refine expression has changed\n            if (!$93e9fd90e1c55c05$export$398604a469f7de9a(insight.filter, this.insight.filter)) {\n                const allowAsyncRenderTime = 100;\n                if (insight.filter) {\n                    //refining\n                    result = yield this._render(insight, data, options, true);\n                    this.presenter.animationQueue(()=>{\n                        this.filter(insight.filter, options.rebaseFilter && options.rebaseFilter());\n                    }, allowAsyncRenderTime, {\n                        waitingLabel: \"layout before refine\",\n                        handlerLabel: \"refine after layout\"\n                    });\n                } else {\n                    //not refining\n                    this._dataScope.setFilteredData(null);\n                    result = yield this._render(insight, data, options, true);\n                    this.presenter.animationQueue(()=>{\n                        this.reset();\n                    }, allowAsyncRenderTime, {\n                        waitingLabel: \"layout before reset\",\n                        handlerLabel: \"reset after layout\"\n                    });\n                }\n            } else result = yield this._render(insight, data, options, false);\n            return result;\n        });\n    }\n    shouldViewstateTransition(newInsight, oldInsight) {\n        if (!oldInsight.columns) return false;\n        if (oldInsight.chart !== newInsight.chart) return true;\n        if (oldInsight.size.height !== newInsight.size.height) return true;\n        if (oldInsight.size.width !== newInsight.size.width) return true;\n        if (oldInsight.columns.facet !== newInsight.columns.facet) return true;\n        return false;\n    }\n    configForSignalCapture(presenterConfig) {\n        const colorContext = {\n            colorMap: null,\n            legend: null,\n            legendElement: null\n        };\n        //now be ready to capture color changing signals \n        presenterConfig.preStage = (stage, deckProps)=>{\n            if (this._shouldSaveColorContext()) //save off the colors from Vega layout\n            colorContext.colorMap = (0, $0fd54a544f9d2363$export$3b9379ac3646e0f0)(stage.cubeData);\n            this.preStage(stage, deckProps);\n        };\n        presenterConfig.onPresent = ()=>{\n            if (this._shouldSaveColorContext()) {\n                (0, $0fd54a544f9d2363$export$44addeff9a96c1e7)(colorContext, this.presenter);\n                this.changeColorContexts([\n                    colorContext\n                ]);\n                this._dataScope.deselect();\n            }\n        };\n    }\n    _render(insight, data, options, forceNewCharacterSet) {\n        return $0000a41cc7b5918f$var$__awaiter(this, void 0, void 0, function*() {\n            if (this._tooltip) {\n                this._tooltip.finalize();\n                this._tooltip = null;\n            }\n            if (this._dataScope.setData(data, options.columns)) //apply transform to the data\n            this.transformData(data, insight.transform);\n            this._specColumns = (0, $ae86bb470afa6626$export$9e6128b2231f5173)(insight, this._dataScope.getColumns(options.columnTypes));\n            const ordinalMap = (0, $2de8589006f21d6f$export$f03cc77b21b3a2b2)(this._specColumns, data, options.ordinalMap);\n            this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n            this.insight = $fc1d5f246c786135$exports.clone(insight);\n            this._lastColorOptions = $fc1d5f246c786135$exports.clone(this.options.colors);\n            this._shouldSaveColorContext = ()=>!options.initialColorContext;\n            const colorContext = options.initialColorContext || {\n                colorMap: null,\n                legend: null,\n                legendElement: null\n            };\n            const specResult = yield this.renderNewLayout(insight.signalValues, {\n                preStage: (stage, deckProps)=>{\n                    if (this._shouldSaveColorContext()) //save off the colors from Vega layout\n                    colorContext.colorMap = (0, $0fd54a544f9d2363$export$3b9379ac3646e0f0)(stage.cubeData);\n                    else //apply passed colorContext\n                    (0, $0fd54a544f9d2363$export$fa70acaad0e00464)([\n                        colorContext.colorMap\n                    ], $fc1d5f246c786135$exports.getCubes(deckProps));\n                    //if items are selected, repaint\n                    const hasSelectedData = !!this._dataScope.hasSelectedData();\n                    const hasActive = !!this._dataScope.active;\n                    if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n                        const selectedColorMap = (0, $0fd54a544f9d2363$export$9cf45ec8b4cc2b65)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                        (0, $0fd54a544f9d2363$export$fa70acaad0e00464)([\n                            colorContext.colorMap,\n                            selectedColorMap\n                        ], stage.cubeData, this.options.colors.unselectedColorMethod);\n                    }\n                    this.preStage(stage, deckProps);\n                },\n                onPresent: ()=>{\n                    if (this._shouldSaveColorContext()) {\n                        (0, $0fd54a544f9d2363$export$44addeff9a96c1e7)(colorContext, this.presenter);\n                        this.changeColorContexts([\n                            colorContext\n                        ]);\n                    } else //apply passed colorContext\n                    this.applyLegendColorContext(colorContext);\n                },\n                shouldViewstateTransition: ()=>this.shouldViewstateTransition(insight, this.insight)\n            }, this.getView(insight.view));\n            //future signal changes should save the color context\n            this._shouldSaveColorContext = ()=>!options.discardColorContextUpdates || !options.discardColorContextUpdates();\n            this._details.render();\n            const result = {\n                ordinalMap: ordinalMap,\n                specResult: specResult\n            };\n            return result;\n        });\n    }\n    overrideAxisLabels(stage) {\n    // if (this._specColumns.x && this._specColumns.x.type === 'date') {\n    //     stage.axes.x.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.x)\n    //     ));\n    // }\n    // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n    //     stage.axes.y.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.y)\n    //     ));\n    // }\n    }\n    preStage(stage, deckProps) {\n        const onClick = (e, search)=>{\n            if (this.options.onAxisClick) this.options.onAxisClick(e, search);\n            else this.select(search);\n        };\n        this.overrideAxisLabels(stage);\n        const polygonLayer = (0, $04c641c9701e126c$export$7aba45edad9b8473)(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n        const order = 1; //after textlayer but before others\n        deckProps.layers.splice(order, 0, polygonLayer);\n        (0, $d50aa7ce26a6d6ed$export$71ab65a966760ac3)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n        if (this.options.onStage) this.options.onStage(stage, deckProps);\n    }\n    onCubeClick(e, cube) {\n        this.options.onCubeClick && this.options.onCubeClick(e, cube);\n        const hasSelectedData = this._dataScope.hasSelectedData();\n        if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n            //if active is within selection, keep the selection and activate the one.\n            const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n            if (indexWithinSelection.index >= 0) {\n                this.activate(indexWithinSelection.datum);\n                this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                if (this.options.onSelectionChanged) {\n                    const sel = this.getSelection();\n                    this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                }\n                return;\n            }\n        }\n        if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][0, $4d0539c68a8de77f$export$5672246984822a29] === cube.ordinal) {\n            this.deselect();\n            return;\n        }\n        const search = {\n            name: (0, $4d0539c68a8de77f$export$5672246984822a29),\n            operator: \"==\",\n            value: cube.ordinal\n        };\n        this.select(search);\n    }\n    onCubeHover(e, cube) {\n        if (this._tooltip) {\n            this._tooltip.finalize();\n            this._tooltip = null;\n        }\n        if (!cube) return;\n        const currentData = this._dataScope.currentData();\n        const index = (0, $2de8589006f21d6f$export$5844459bbee68321)(cube, currentData);\n        if (index >= 0) this._tooltip = new (0, $a5823b006e1d2fb5$export$28c660c63b792dea)({\n            options: this.options.tooltipOptions,\n            item: currentData[index],\n            position: e,\n            cssPrefix: this.presenter.style.cssPrefix\n        });\n    }\n    onTextHover(e, t) {\n        //return true if highlight color is different\n        if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor) return false;\n        return !$fc1d5f246c786135$exports.colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n    }\n    createConfig(c) {\n        const { getTextColor: getTextColor , getTextHighlightColor: getTextHighlightColor , getTextHighlightAlphaCutoff: getTextHighlightAlphaCutoff , onTextClick: onTextClick  } = this.options;\n        const defaultPresenterConfig = {\n            zAxisZindex: $0000a41cc7b5918f$var$zAxisZindex,\n            getCharacterSet: (stage)=>this._characterSet.getCharacterSet(stage),\n            getTextColor: getTextColor,\n            getTextHighlightColor: getTextHighlightColor,\n            getTextHighlightAlphaCutoff: getTextHighlightAlphaCutoff,\n            onTextClick: (e, t)=>{\n                if (t.metaData && t.metaData.search) {\n                    const search = (0, $2041f36649939dda$export$cb06c97de370398d)(t.metaData.search);\n                    if (this.options.onAxisClick) this.options.onAxisClick(e, search);\n                    else this.select(search);\n                }\n                if (onTextClick) onTextClick(e, t);\n            },\n            onCubeClick: this.onCubeClick.bind(this),\n            onCubeHover: this.onCubeHover.bind(this),\n            onTextHover: this.onTextHover.bind(this),\n            preStage: this.preStage.bind(this),\n            onPresent: this.options.onPresent,\n            onLayerClick: (info, e)=>{\n                if (!info || !info.object) this.deselect();\n            },\n            onLegendClick: (e, legend, clickedIndex)=>{\n                const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n                if (legendRow) {\n                    if (this.options.onLegendRowClick) this.options.onLegendRowClick(e, legendRow);\n                    else this.select(legendRow.search);\n                } else if (this.options.onLegendHeaderClick) //header clicked\n                this.options.onLegendHeaderClick(e);\n            },\n            onSceneRectAssignCubeOrdinal: (datum)=>{\n                //TODO see if datum is a facet selection rect\n                return datum[0, $4d0539c68a8de77f$export$5672246984822a29];\n            },\n            onTargetViewState: (h, w)=>{\n                const { height: height , width: width  } = this.insight.size;\n                let newViewStateTarget;\n                if (this.options.onNewViewStateTarget) newViewStateTarget = this.options.onNewViewStateTarget();\n                return {\n                    height: height,\n                    width: width,\n                    newViewStateTarget: newViewStateTarget\n                };\n            },\n            preserveDrawingBuffer: this.options.preserveDrawingBuffer\n        };\n        if (this.options.onBeforeCreateLayers) defaultPresenterConfig.preLayer = (stage)=>{\n            this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n        };\n        const config = {\n            presenter: this.presenter,\n            presenterConfig: Object.assign(defaultPresenterConfig, c)\n        };\n        if (this.options.transitionDurations) config.presenterConfig.transitionDurations = this.options.transitionDurations;\n        return config;\n    }\n    /**\n     * Filter the data and animate.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n     */ filter(search, rebase = false) {\n        const u = this._dataScope.createUserSelection(search, false, rebase);\n        return new Promise((resolve, reject)=>{\n            this._animator.filter(search, u.included, u.excluded, rebase).then(()=>{\n                this._details.clear();\n                this._details.clearSelection();\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n    /**\n     * Remove any filtration and animate.\n     */ reset() {\n        return new Promise((resolve, reject)=>{\n            this._animator.reset().then(()=>{\n                this._details.clear();\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Select cubes by a filter expression.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     */ select(search) {\n        return new Promise((resolve, reject)=>{\n            this._animator.select(search).then(()=>{\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n    /**\n     * Removes any selection.\n     */ deselect() {\n        return new Promise((resolve, reject)=>{\n            this._animator.deselect().then(()=>{\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Gets the current selection.\n     */ getSelection() {\n        if (!this._dataScope) return null;\n        const selectionState = {\n            search: this._dataScope.selection && this._dataScope.selection.search || null,\n            selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n            active: this._dataScope.active\n        };\n        return selectionState;\n    }\n    /**\n     * Set one data row to the active state.\n     */ activate(datum) {\n        return new Promise((resolve, reject)=>{\n            this._animator.activate(datum).then(()=>{\n                this._details.render();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Deactivate item.\n     */ deActivate() {\n        return new Promise((resolve, reject)=>{\n            if (this._dataScope && this._dataScope.active) this._animator.deactivate().then(()=>{\n                this._details.render();\n                resolve();\n            });\n            else resolve();\n        });\n    }\n    /**\n     * Gets the current insight with signal values.\n     */ getInsight() {\n        const insight = Object.assign({}, this.insight);\n        insight.signalValues = this.getSignalValues();\n        return insight;\n    }\n    /**\n     * Gets column stats from current data (filtered or all).\n     * @param column Column to get stats for.\n     */ getColumnStats(column) {\n        return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n    }\n    /**\n     * Gets current signal values.\n     */ getSignalValues() {\n        return (0, $7f509bc53ab5b2b2$export$764590c093441ac7)(this.vegaViewGl, this.vegaSpec);\n    }\n    finalize() {\n        if (this._dataScope) this._dataScope.finalize();\n        if (this._details) this._details.finalize();\n        if (this._tooltip) this._tooltip.finalize();\n        if (this.vegaViewGl) this.vegaViewGl.finalize();\n        if (this.presenter) this.presenter.finalize();\n        if (this.element) this.element.innerHTML = \"\";\n        this.colorContexts = null;\n        this.element = null;\n        this.options = null;\n        this.presenter = null;\n        this.vegaSpec = null;\n        this.vegaViewGl = null;\n        this._animator = null;\n        this._dataScope = null;\n        this._details = null;\n        this._tooltip = null;\n    }\n}\n/**\n * Default Viewer options.\n */ $0000a41cc7b5918f$export$2ec4afd9b3c16a85.defaultViewerOptions = (0, $74c2763994d75bb8$export$fb736e4909afb3d7);\n\n\nconst $15874c145702a1a4$export$83d89fbfd8236492 = \"3.2.1\";\n\n\nconst $3b509b9541e52a8f$export$1f96ae73734a86cc = (0, $975e8617bd73ab77$export$1f96ae73734a86cc);\n\n\nvar $a1d9524814b1e23a$exports = {};\n\n$parcel$export($a1d9524814b1e23a$exports, \"classList\", () => $a1d9524814b1e23a$export$11c615ce16f87241);\n$parcel$export($a1d9524814b1e23a$exports, \"deepCompare\", () => $a1d9524814b1e23a$export$e12301e595e16ad8);\nvar $77f4394dad3f0c80$exports = {};\n\n$parcel$defineInteropFlag($77f4394dad3f0c80$exports);\n\n$parcel$export($77f4394dad3f0c80$exports, \"default\", () => $77f4394dad3f0c80$export$2e2bcd8739ae039);\nvar $77f4394dad3f0c80$export$2e2bcd8739ae039 = $77f4394dad3f0c80$var$compare;\n/*\n  primitives: value1 === value2\n  functions: value1.toString == value2.toString\n  arrays: if length, sequence and values of properties are identical\n  objects: if length, names and values of properties are identical\n  compare([[1, [2, 3]], [[1, [2, 3]]); // true\n  compare([[1, [2, 3], 4], [[1, [2, 3]]); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3}); // true\n  compare({a: 2, b: 3}, {b: 3, a: 2}); // true\n  compare({a: 2, b: 3, c: 4}, {a: 2, b: 3}); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3, c: 4}); // false\n  compare([[1, [2, {a: 4}], 4], [[1, [2, {a: 4}]]); // true\n*/ function $77f4394dad3f0c80$var$compare(value1, value2) {\n    if (value1 === value2) return true;\n    /* eslint-disable no-self-compare */ // if both values are NaNs return true\n    if (value1 !== value1 && value2 !== value2) return true;\n    if (({}).toString.call(value1) != ({}).toString.call(value2)) return false;\n    if (value1 !== Object(value1)) // non equal primitives\n    return false;\n    if (!value1) return false;\n    if (Array.isArray(value1)) return $77f4394dad3f0c80$var$compareArrays(value1, value2);\n    if (({}).toString.call(value1) == \"[object Set]\") return $77f4394dad3f0c80$var$compareArrays(Array.from(value1), Array.from(value2));\n    if (({}).toString.call(value1) == \"[object Object]\") return $77f4394dad3f0c80$var$compareObjects(value1, value2);\n    else return $77f4394dad3f0c80$var$compareNativeSubtypes(value1, value2);\n}\nfunction $77f4394dad3f0c80$var$compareNativeSubtypes(value1, value2) {\n    // e.g. Function, RegExp, Date\n    return value1.toString() === value2.toString();\n}\nfunction $77f4394dad3f0c80$var$compareArrays(value1, value2) {\n    var len = value1.length;\n    if (len != value2.length) return false;\n    var alike = true;\n    for(var i = 0; i < len; i++)if (!$77f4394dad3f0c80$var$compare(value1[i], value2[i])) {\n        alike = false;\n        break;\n    }\n    return alike;\n}\nfunction $77f4394dad3f0c80$var$compareObjects(value1, value2) {\n    var keys1 = Object.keys(value1).sort();\n    var keys2 = Object.keys(value2).sort();\n    var len = keys1.length;\n    if (len != keys2.length) return false;\n    for(var i = 0; i < len; i++){\n        var key1 = keys1[i];\n        var key2 = keys2[i];\n        if (!(key1 == key2 && $77f4394dad3f0c80$var$compare(value1[key1], value2[key2]))) return false;\n    }\n    return true;\n}\n\n\nconst $a1d9524814b1e23a$export$11c615ce16f87241 = (...args)=>{\n    return args.filter(Boolean).join(\" \");\n};\nconst $a1d9524814b1e23a$export$e12301e595e16ad8 = $77f4394dad3f0c80$exports.default || $77f4394dad3f0c80$exports;\n\n\n\n\nconst $de8134d48126c751$export$e2253033e6e1df16 = {\n    react: null,\n    reactDOM: null\n};\nfunction $de8134d48126c751$export$1f96ae73734a86cc(react, reactDOM, vega, deck, layers, luma) {\n    $f80f7eb4951011b9$exports.use(vega, deck, layers, luma);\n    $de8134d48126c751$export$e2253033e6e1df16.react = react;\n    $de8134d48126c751$export$e2253033e6e1df16.reactDOM = reactDOM;\n    //inform React that we are using a dynamic base class\n    (0, $81745c046077d503$export$441ac54c4cda559d).prototype = react.Component.prototype;\n}\n\n\n\n\nfunction $81745c046077d503$var$addNullable(insight, signalValues) {\n    const withNulls = Object.assign(Object.assign({\n        view: null,\n        filter: null\n    }, insight), {\n        signalValues: signalValues\n    });\n    return withNulls;\n}\nfunction $81745c046077d503$export$1557ccb739c4ea87(viewer, insight) {\n    const currentInsight = viewer.getInsight();\n    const a = $81745c046077d503$var$addNullable(currentInsight, Object.assign(Object.assign({}, viewer.insight.signalValues), currentInsight.signalValues));\n    const b = $81745c046077d503$var$addNullable(insight, Object.assign(Object.assign({}, a.signalValues), insight.signalValues));\n    const compare = (0, $a1d9524814b1e23a$export$e12301e595e16ad8)(a, b);\n    return {\n        a: a,\n        b: b,\n        compare: compare\n    };\n}\nfunction $81745c046077d503$var$_SandDanceReact(props) {\n    class __SandDanceReact extends (0, $de8134d48126c751$export$e2253033e6e1df16).react.Component {\n        layout() {\n            this.lastData = this.props.data;\n            this.viewer.render(this.props.insight, this.props.data, this.props.renderOptions).then((renderResult)=>{\n                //TODO: show errors if any\n                //console.log('viewer render');\n                this.props.onView && this.props.onView(renderResult);\n            }).catch((e)=>{\n                //console.log('viewer error');\n                this.props.onError && this.props.onError(e);\n            });\n        }\n        view() {\n            if (this.props.insight && this.props.data) {\n                const c = $81745c046077d503$export$1557ccb739c4ea87(this.viewer, this.props.insight);\n                const sameDataRef = this.props.data === this.lastData;\n                if (!c.compare || !sameDataRef) this.layout();\n            }\n        }\n        componentDidMount() {\n            const element = (0, $de8134d48126c751$export$e2253033e6e1df16).reactDOM.findDOMNode(this.viewerDiv);\n            this.viewer = new (0, $0000a41cc7b5918f$exports.Viewer)(element, this.props.viewerOptions);\n            if (this.props.onMount) {\n                if (this.props.onMount(this.viewer.presenter.getElement((0, $f80f7eb4951011b9$exports).PresenterElement.gl))) this.view();\n            } else this.view();\n        }\n        componentDidUpdate() {\n            this.viewer.options = (0, $f80f7eb4951011b9$exports).util.deepMerge(this.viewer.options, this.props.viewerOptions);\n            this.view();\n        }\n        componentWillUnmount() {\n            this.viewer.finalize();\n        }\n        render() {\n            return (0, $de8134d48126c751$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-ReactViewer\",\n                ref: (div)=>this.viewerDiv = div\n            });\n        }\n    }\n    return new __SandDanceReact(props);\n}\nconst $81745c046077d503$export$441ac54c4cda559d = $81745c046077d503$var$_SandDanceReact;\n\n\n\nconst $b7e03869cd46da1e$export$83d89fbfd8236492 = \"3.0.1\";\n\n\n\n\n\nfunction $9c14fe62b8e7ad84$export$8210dfe1863c478(props) {\n    if (!props.explorer.viewer || !props.signal) return null;\n    if (props.signal.bind) {\n        const input = props.signal.bind.input;\n        if (input) {\n            const fn = $9c14fe62b8e7ad84$var$map[input];\n            if (fn) {\n                const prefix = props.prefix ? `${props.prefix} ` : \"\";\n                let initialValue;\n                try {\n                    initialValue = props.explorer.viewer.vegaViewGl.signal(props.signal.name);\n                } catch (error) {\n                // continue regardless of error\n                }\n                const control = fn(prefix, props.signal.bind, initialValue, (value)=>{\n                    props.onChange && props.onChange(value);\n                    props.explorer.signal(props.signal.name, value, props.newViewStateTarget);\n                }, props.disabled, props.collapseLabel, props.componentRef);\n                return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: \"sanddance-signal\"\n                }, control);\n            }\n        }\n    }\n    return null;\n}\nconst $9c14fe62b8e7ad84$var$map = {};\n$9c14fe62b8e7ad84$var$map[\"range\"] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Slider, {\n        componentRef: ref,\n        label: prefix + bind.name,\n        max: bind.max,\n        min: bind.min,\n        step: bind.step,\n        defaultValue: initialValue,\n        onChange: onChange,\n        disabled: disabled\n    });\n};\n$9c14fe62b8e7ad84$var$map[\"select\"] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    const options = bind.options.map((o, i)=>{\n        const option = {\n            key: o,\n            text: o\n        };\n        return option;\n    });\n    const label = prefix + bind.name;\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Dropdown, {\n        componentRef: ref,\n        onRenderTitle: collapseLabel ? (a, b)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"span\", null, label, \": \", a[0].text) : undefined,\n        defaultSelectedKey: initialValue,\n        label: collapseLabel ? undefined : label,\n        options: options,\n        onChange: (e, o)=>onChange(o.text),\n        disabled: disabled\n    });\n};\n$9c14fe62b8e7ad84$var$map[\"checkbox\"] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Toggle, {\n        componentRef: ref,\n        defaultChecked: initialValue,\n        label: prefix + bind.name,\n        onChange: (e, checked)=>onChange(checked),\n        disabled: disabled\n    });\n}; //TODO other signal types\n\n\nconst $0db66385c00a3f15$export$21c51bc433c16634 = {\n    appName: \"SandDance\",\n    bingsearch: \"Bing\",\n    bingsearchDescription: (term)=>`Search Bing for \"${term}\"`,\n    buttonClose: \"Close\",\n    buttonSelect: \"Search & Select\",\n    buttonColorSchemeMap: \"Map color scheme to filtered data\",\n    buttonColorSchemeRemap: \"Remap color to filtered data\",\n    buttonColorSchemeKeep: \"Keep same color scheme\",\n    buttonCopyToClipboard: \"Copy to clipboard\",\n    buttonExclude: \"Exclude\",\n    buttonExport: \"Export\",\n    buttonExportCount: (total)=>total == 1 ? \"Export 1 row...\" : `Export ${total} rows...`,\n    buttonIsolate: \"Isolate\",\n    buttonReset: \"Stop filtering\",\n    buttonDeselect: \"Clear selection\",\n    buttonToolbarFloat: \"Float toolbar\",\n    buttonToolbarDock: \"Dock toolbar\",\n    buttonToolbarHide: \"Hide toolbar\",\n    buttonToolbarShow: \"Show toolbar\",\n    buttonNextDataItem: \"Next data item\",\n    buttonPrevDataItem: \"Previous data item\",\n    buttonCreateSnapshot: \"Create snapshot\",\n    buttonNextSnapshot: \"Next snapshot\",\n    buttonPrevSnapshot: \"Previous snapshot\",\n    buttonUpdateSnapshot: \"Update snapshot\",\n    buttonAddExpression: \"Add expression\",\n    buttonAddExpressionGroup: \"Add group\",\n    buttonDeleteExpression: \"Delete\",\n    buttonDeleteExpressionGroup: \"Delete group\",\n    buttonClearSnapshots: \"Clear snapshots\",\n    buttonDeleteSnapshot: \"Delete snapshot\",\n    buttonEditSnapshot: \"Edit snapshot\",\n    buttonMoveUp: \"Move up\",\n    buttonMoveDown: \"Move down\",\n    buttonShowVegaSpec: \"Show Vega spec\",\n    buttonLaunchVegaEditor: \"Open Vega Editor\",\n    buttonCameraHome: \"Center chart in window\",\n    buttonTooltipMapping: \"Tooltip columns...\",\n    buttonUndo: \"Undo\",\n    buttonRedo: \"Redo\",\n    chartTypeBarChartH: \"Bar\",\n    chartTypeBarChartV: \"Column\",\n    chartTypeDensity: \"Density\",\n    chartTypeGrid: \"Grid\",\n    chartTypeScatterPlot: \"Scatter\",\n    chartTypeStacks: \"Stacks\",\n    chartTypeStrips: \"Strips\",\n    chartTypeTreeMap: \"Treemap\",\n    defaultFileName: \"sanddance-data\",\n    errorExportFilenameEmpty: \"Filename cannot be blank\",\n    errorExportFilenameCharacters: (characters)=>`A filename cannot contain any of the following characters: ${characters}`,\n    errorColumnMustBeNumeric: \"Numeric column required for this chart type.\",\n    labelBlank: \"blank\",\n    labelNull: \"null\",\n    labelTrue: \"true\",\n    labelFalse: \"false\",\n    labelSystemInfo: \"System info\",\n    labelChartSettings: \"Chart settings\",\n    labelDataBrowser: \"Data browser\",\n    labelDataScope: \"Scope\",\n    labelExport: \"Export Data\",\n    labelExportFormat: \"File format\",\n    labelExportCSV: \".CSV - Comma separated values\",\n    labelExportHTML: \".HTML - A SandDance html page embedding this data\",\n    labelExportJSON: \".JSON - JavaScript object notation\",\n    labelExportTSV: \".TSV - Tab separated values\",\n    labelHistory: \"History\",\n    labelTools: \"Tools\",\n    labelVegaSpec: \"Vega specification\",\n    labelColor: \"Chart color\",\n    labelError: \"Error\",\n    labelExportFileName: \"File name\",\n    labelSnapshots: \"Snapshots\",\n    labelSnapshotSettingThumbnailWidth: \"Thumbnail image width\",\n    labelSearch: \"Select by search\",\n    labelSearchClause: \"Clause\",\n    labelSearchColumn: \"Field\",\n    labelSearchOperator: \"Operator\",\n    labelSearchValue: \"Value\",\n    labelSearchValuePlaceholder: \"Value to search for\",\n    labelChart: \"Chart\",\n    labelChartCanvas: \"Chart canvas\",\n    labelColumnMapping: \"Column Mapping\",\n    labelChartTypeOptions: \"Chart options\",\n    labelColorBin: \"Color binning\",\n    labelColorOptions: \"Color options\",\n    labelColorBinExplanation: \"For numeric columns\",\n    labelColorFieldInfo: (colorColumnName, colorColumnType, categoricalNumeric, distinctValueCount)=>`Field <span className=\"fieldname\">${colorColumnName}</span> is of type <span className=\"fieldtype\">${colorColumnType}</span>${categoricalNumeric ? ` and has ${distinctValueCount} distinct values` : \"\"}.`,\n    labelColorFieldIsColorData: (colorColumnName)=>`Field <span className=\"fieldname\">${colorColumnName}</span> contains direct color data.`,\n    labelColorBinNone: \"None (continuous)\",\n    labelColorBinQuantize: \"Quantize\",\n    labelColorBinQuantile: \"Quantile\",\n    labelColorFilter: \"Note: Colors will be re-mapped to the filter when viewing this snapshot.\",\n    labelColorScheme: \"Scheme\",\n    labelTotal: \"Total by\",\n    labelTotalByCountSquare: \"Count (Grid layout)\",\n    labelTotalByCountStrip: \"Count (Strip layout)\",\n    labelTotalBySumStrip: \"Sum (Strip layout)\",\n    labelTotalBySumTreemap: \"Sum (Treemap layout)\",\n    labelTotalBySumStripPercent: \"Sum as percentage (Strip layout)\",\n    labelColumnColor: \"Color by\",\n    labelColumnFacet: \"Facet by\",\n    labelFacetLayout: \"Facet layout\",\n    labelFacetLayoutWrap: \"Wrap\",\n    // labelFacetLayoutHorizontal: 'Horizontal',\n    // labelFacetLayoutVertical: 'Vertical',\n    labelFacetLayoutCross: \"\\u229E\",\n    labelColumnFacetV: \"Cross facet by\",\n    labelColumnSort: \"Sort by\",\n    labelColumnX: \"X Axis\",\n    labelColumnY: \"Y Axis\",\n    labelColumnZ: \"Z Axis\",\n    labelColumnSize: \"Size by\",\n    labelColumnGroup: \"Group by\",\n    labelAliasColor: \"Color\",\n    labelAliasFacet: \"Facet\",\n    labelAliasFacetV: \"Vertical facet\",\n    labelAliasSort: \"Sort\",\n    labelAliasX: \"X Axis\",\n    labelAliasY: \"Y Axis\",\n    labelAliasZ: \"Z Axis\",\n    labelAliasSize: \"Size\",\n    labelAliasGroup: \"Group\",\n    labelDataItemIsFiltered: \"Item is filtered from view\",\n    labelHistoryInit: \"Initial view\",\n    labelHistoryFilterClear: \"Clear filter\",\n    labelHistoryFilterIExclude: \"Exclude filter\",\n    labelHistoryFilterIsolate: \"Isolate filter\",\n    labelHistoryChangeChartType: (chart)=>`Change chart type to ${chart}`,\n    labelHistoryMapColumn: (column)=>`Map ${column} role`,\n    labelHistoryUnMapColumn: (column)=>`Unmap ${column} role`,\n    labelHistoryReviveSnapshot: \"Revive snapshot\",\n    labelHistoryColorBin: \"Change color binning\",\n    labelHistoryDirectColor: \"Change direct color\",\n    labelShowLegend: \"Show legend\",\n    labelShowAxes: \"Show axes\",\n    labelSnapshotTitle: \"Title\",\n    labelSnapshotDescription: \"Note (optional)\",\n    labelTooltipMapping: \"Tooltip columns\",\n    labelTransitionDurations: \"Transition durations\",\n    labelTransitionCamera: \"2D / 3D view\",\n    labelTransitionColor: \"Color\",\n    labelTransitionPosition: \"Position\",\n    labelTransitionSize: \"Size\",\n    labelVegaSpecData: \"Data reference\",\n    labelVegaSpecNotes: \"Note: You may need to change the color scheme to make this visible in Vega.\",\n    labelYes: \"Yes\",\n    labelNo: \"No\",\n    labelConfirmation: \"Are you sure?\",\n    loading: \"Loading...\",\n    schemeCategorical: \"Categorical\",\n    schemeDiverging: \"Diverging\",\n    schemeDual: \"Dual\",\n    schemeSequentialMultiHue: \"Sequential Multi Hue\",\n    schemeSequentialSingleHue: \"Sequential Single Hue\",\n    selectDataSpanAll: \"All rows\",\n    selectDataSpanFilter: \"Filtered\",\n    selectDataSpanSelection: \"Selected\",\n    selectVegaSpecDataNone: \"None\",\n    selectVegaSpecDataInline: \"Inline - WARNING this may use substantial browser/clipboard memory for large data sets.\",\n    selectVegaSpecDataUrl: \"URL\",\n    record: (current, total)=>`${current} of ${total}`,\n    searchEQ: \"=\",\n    searchNEQ: \"<>\",\n    searchGT: \">\",\n    searchGTE: \">=\",\n    searchLT: \"<\",\n    searchLTE: \"<=\",\n    searchNULL: \"is null or empty\",\n    searchIN: \"contains\",\n    searchSW: \"starts with\",\n    searchWHERE: \"Where\",\n    searchAND: \"and\",\n    searchOR: \"or\",\n    selectAny: \"-- any --\",\n    selectNone: \"-- none --\",\n    selectNumeric: \"Numeric\",\n    selectNonNumeric: \"Categorical\",\n    selectDirectColor: \"Direct color\",\n    selectReference: \"Column mappings\",\n    tooltipSearch: (column, value)=>`Click to search in '${column}' for \"${value}\"`,\n    labelRequired: \"required\",\n    labelSystem: \"System\",\n    labelViewType2d: \"View in 2D\",\n    labelViewType3d: \"View in 3D\",\n    labelDataColors: \"Enabled if this data column contains any CSS color values.\",\n    labelDataNullAll: \"Loading data...\",\n    labelDataNullFiltered: \"You can filter by first making a selection, then choosing <b>Isolate</b> or <b>Exclude</b> in the top bar.\",\n    labelDataNullSelection: \"You can select by: <ul><li>clicking the chart axes</li><li>clicking in the legend</li><li>searching</li</ul>\",\n    labelZeroAll: \"Dataset contains zero rows.\",\n    labelZeroSearchResults: \"No rows matched your search.\",\n    signalGroups: [\n        {\n            prefix: \"Chart\",\n            label: \"Chart options\"\n        },\n        {\n            prefix: \"Mark\",\n            label: \"Mark options\"\n        },\n        {\n            prefix: \"RoleColor\",\n            label: \"Color options\"\n        },\n        {\n            prefix: \"RoleFacet\",\n            label: \"Facet options\"\n        },\n        {\n            prefix: \"RoleSort\",\n            label: \"Sort options\"\n        },\n        {\n            prefix: \"RoleX\",\n            label: \"X axis options\"\n        },\n        {\n            prefix: \"RoleY\",\n            label: \"Y axis options\"\n        },\n        {\n            prefix: \"RoleZ\",\n            label: \"Z axis options\"\n        },\n        {\n            prefix: \"Text\",\n            label: \"Text options\"\n        },\n        {\n            prefix: \"*\",\n            label: \"Options\"\n        }\n    ]\n};\n\n\nconst $f3c9564b99b49be4$var$maxFacets = 50;\nconst $f3c9564b99b49be4$var$roleLabels = {\n    color: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnColor,\n    facet: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnFacet,\n    facetV: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnFacetV,\n    group: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnGroup,\n    size: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnSize,\n    sort: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnSort,\n    uid: null,\n    x: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnX,\n    y: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnY,\n    z: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnZ\n};\nconst $f3c9564b99b49be4$var$aliasLabels = {\n    color: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasColor,\n    facet: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasFacet,\n    facetV: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasFacetV,\n    group: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasGroup,\n    size: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasSize,\n    sort: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasSort,\n    uid: null,\n    x: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasX,\n    y: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasY,\n    z: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelAliasZ\n};\nfunction $f3c9564b99b49be4$var$filterColumnList(context, columns) {\n    switch(context){\n        case \"facet\":\n        case \"facetV\":\n            return columns.filter((column)=>column.quantitative || column.stats.distinctValueCount && column.stats.distinctValueCount < $f3c9564b99b49be4$var$maxFacets);\n        default:\n            return columns.slice();\n    }\n}\nfunction $f3c9564b99b49be4$var$optionsForSpecColumn(sectionName, columns, role, disabledColumnName, selectedColumnName) {\n    const filtered = $f3c9564b99b49be4$var$filterColumnList(role, columns);\n    const options = filtered.map((column)=>{\n        const option = {\n            key: `column:${column.name}`,\n            text: column.name,\n            data: column,\n            selected: selectedColumnName === column.name,\n            disabled: disabledColumnName === column.name\n        };\n        return option;\n    });\n    if (options.length) {\n        const option = {\n            key: sectionName,\n            text: sectionName,\n            itemType: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n        };\n        options.unshift(option);\n    }\n    return options;\n}\nfunction $f3c9564b99b49be4$var$optionsForReference(sectionName, specRoles) {\n    const options = specRoles.map((specRole)=>{\n        const option = {\n            key: `role:${specRole.role}`,\n            text: $f3c9564b99b49be4$var$aliasLabels[specRole.role],\n            data: specRole.role\n        };\n        return option;\n    }).sort((a, b)=>a.text.localeCompare(b.text));\n    if (options.length) {\n        const option = {\n            key: sectionName,\n            text: sectionName,\n            itemType: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n        };\n        options.unshift(option);\n    }\n    return options;\n}\nfunction $f3c9564b99b49be4$var$selectFirst(options) {\n    for(let i = 0; i < options.length; i++){\n        if (options[i].itemType === (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header) continue;\n        options[i].selected = true;\n        return;\n    }\n}\nfunction $f3c9564b99b49be4$export$c171b40a34e110b5(props) {\n    if (!props.specRole) return null;\n    let categoricalColumns;\n    let directColorColumns;\n    let directColorGroup;\n    let referenceGroup = [];\n    if (props.specRole.role === \"color\") {\n        categoricalColumns = props.categoricalColumns.filter((c)=>!c.isColorData);\n        directColorColumns = props.categoricalColumns.filter((c)=>c.isColorData);\n        directColorGroup = $f3c9564b99b49be4$var$optionsForSpecColumn((0, $0db66385c00a3f15$export$21c51bc433c16634).selectDirectColor, directColorColumns, \"color\", props.disabledColumnName, props.selectedColumnName);\n    } else categoricalColumns = props.categoricalColumns;\n    if (props.specRole.role === \"sort\") {\n        const others = props.specCapabilities.roles.filter((specRole)=>specRole.role !== props.specRole.role);\n        referenceGroup = $f3c9564b99b49be4$var$optionsForReference((0, $0db66385c00a3f15$export$21c51bc433c16634).selectReference, others);\n    }\n    const quantitativeGroup = $f3c9564b99b49be4$var$optionsForSpecColumn((0, $0db66385c00a3f15$export$21c51bc433c16634).selectNumeric, props.quantitativeColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const categoricGroup = props.specRole.excludeCategoric ? null : $f3c9564b99b49be4$var$optionsForSpecColumn((0, $0db66385c00a3f15$export$21c51bc433c16634).selectNonNumeric, categoricalColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const options = referenceGroup.concat(quantitativeGroup).concat(categoricGroup).concat(directColorGroup).filter(Boolean);\n    return options;\n}\nfunction $f3c9564b99b49be4$export$83b9e0badda50eeb(props) {\n    const options = $f3c9564b99b49be4$export$c171b40a34e110b5(props);\n    if (props.specRole.allowNone) options.unshift({\n        key: -1,\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectNone\n    });\n    const hasSelection = options.reduce((p, c)=>{\n        return p || c.selected;\n    }, false);\n    if (!hasSelection) $f3c9564b99b49be4$var$selectFirst(options);\n    let signals;\n    if (props.explorer.viewer && props.explorer.viewer.vegaSpec) {\n        if (props.specRole.signals) signals = props.explorer.viewer.vegaSpec.signals.filter((s)=>props.specRole.signals.indexOf(s.name) >= 0);\n    }\n    const label = $f3c9564b99b49be4$var$roleLabels[props.specRole.role];\n    const signalElements = !props.hideSignals && signals && signals.map((signal, i)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $9c14fe62b8e7ad84$export$8210dfe1863c478), {\n            key: i,\n            explorer: props.explorer,\n            signal: signal,\n            onChange: (value)=>props.onChangeSignal && props.onChangeSignal(signal.name, value),\n            collapseLabel: props.collapseLabel\n        }));\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-columnMap\"\n    }, props.prefix, !props.hideDropdown && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n        componentRef: props.componentRef,\n        collapseLabel: props.collapseLabel,\n        disabled: props.disabled,\n        label: label,\n        options: options,\n        onChange: (e, o)=>props.changeColumnMapping(props.specRole.role, typeof o.data === \"string\" ? o.data : (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.clone(o.data)),\n        onDismiss: props.onDismiss\n    }), signalElements, props.suffix);\n}\n\n\n\nfunction $1f0c6e0f0abb4f2d$export$dd264fd5c92b73c6(stage, specCapabilities) {\n    for(let axisName in stage.axes)specCapabilities.roles.forEach((specRole)=>{\n        if (specRole.role === axisName) {\n            let axes = stage.axes[axisName];\n            axes.forEach((axis)=>{\n                if (axis.title) {\n                    const textItem = axis.title;\n                    textItem.specRole = specRole;\n                }\n            });\n        }\n    });\n}\nfunction $1f0c6e0f0abb4f2d$var$px(n) {\n    return n + \"px\";\n}\nfunction $1f0c6e0f0abb4f2d$var$_PositionedColumnMap(props1) {\n    class __PositionedColumnMap extends (0, $8535c575077b9670$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            const { left: left , top: top  } = props;\n            this.state = {\n                left: left,\n                top: top\n            };\n            this.dropdownRef = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createRef();\n        }\n        focus() {\n            if (!this.focused) {\n                this.focused = true;\n                this.dropdownRef.current.focus(true);\n            }\n        }\n        componentDidMount() {\n            const size = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.outerSize(this.div);\n            const over = {\n                left: Math.max(0, this.state.left + size.width - this.props.container.offsetWidth),\n                top: Math.max(0, this.state.top + size.height - this.props.container.offsetHeight)\n            };\n            if (over.left || over.top) {\n                let { left: left , top: top  } = this.state;\n                left -= over.left;\n                top -= over.top;\n                this.setState({\n                    left: left,\n                    top: top\n                });\n            } else this.focus();\n        }\n        componentDidUpdate() {\n            this.focus();\n        }\n        render() {\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div) this.div = div;\n                },\n                className: \"sanddance-columnMap-absolute\",\n                style: {\n                    position: \"absolute\",\n                    left: $1f0c6e0f0abb4f2d$var$px(this.state.left),\n                    top: $1f0c6e0f0abb4f2d$var$px(this.state.top)\n                }\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $f3c9564b99b49be4$export$83b9e0badda50eeb), Object.assign({}, this.props, {\n                componentRef: this.dropdownRef,\n                hideSignals: true\n            })));\n        }\n    }\n    return new __PositionedColumnMap(props1);\n}\nconst $1f0c6e0f0abb4f2d$export$3e341bd56774d659 = $1f0c6e0f0abb4f2d$var$_PositionedColumnMap;\n\n\nconst $8f1b85a9470d3af5$export$c4b7cd609ccf4a5a = (title, embed)=>`<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>${title}</title>\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-embed@3/dist/css/sanddance-embed.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-explorer@3/dist/css/sanddance-explorer.css\" />\n</head>\n\n<body>\n    <script src=\"https://unpkg.com/react@16.13/umd/react.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@16.13/umd/react-dom.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/deck.gl@8.3.7/dist.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@5.17/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/@fluentui/react@7.150/dist/fluentui-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@3/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@3/dist/umd/sanddance-embed.js\"></script>\n\n    <div id=\"app\"></div>\n\n    ${embed}\n\n</body>\n\n</html>`;\n\n\n\n\nfunction $3cd220df8c1129e3$export$65aea4b3b539487b(data, delimiter) {\n    var fields = Object.keys(data[0]);\n    var file = data.map((row)=>{\n        return fields.map((fieldName)=>{\n            const value = row[fieldName];\n            if (typeof value === \"number\") return value;\n            if (typeof value === \"string\") {\n                if (value.indexOf(delimiter) >= 0) return `\"${value.replace(/\"/g, '\"\"')}\"`;\n                else return value;\n            }\n            return \"\";\n        }).join(delimiter);\n    });\n    file.unshift(fields.join(delimiter));\n    return file.join(\"\\n\");\n}\n\n\n\n\nconst $e98d3084b701f145$var$exportTypes = [\n    [\n        \"json\",\n        (0, $0db66385c00a3f15$export$21c51bc433c16634).labelExportJSON\n    ],\n    [\n        \"csv\",\n        (0, $0db66385c00a3f15$export$21c51bc433c16634).labelExportCSV\n    ],\n    [\n        \"tsv\",\n        (0, $0db66385c00a3f15$export$21c51bc433c16634).labelExportTSV\n    ],\n    [\n        \"html\",\n        (0, $0db66385c00a3f15$export$21c51bc433c16634).labelExportHTML\n    ]\n];\nfunction $e98d3084b701f145$var$_DataExportPicker(props1) {\n    class __DataExportPicker extends (0, $8535c575077b9670$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = this.getInitialState(this.props);\n        }\n        getInitialState(props) {\n            const initialState = {\n                initializer: props.initializer,\n                dialogHidden: true,\n                exportType: $e98d3084b701f145$var$exportTypes[0][0],\n                fileName: props.initializer.fileName,\n                fileNameError: \"\",\n                working: false\n            };\n            return initialState;\n        }\n        componentDidUpdate() {\n            if (!(0, $a1d9524814b1e23a$exports).deepCompare(this.props.initializer, this.state.initializer)) this.setState(this.getInitialState(this.props));\n        }\n        // Converts to dataExport type and calls dataExportHandler to deal with data\n        createExport(exportType, displayName) {\n            const final = (data)=>{\n                this.props.dataExportHandler(data, exportType, displayName);\n                this.close();\n            };\n            const json = JSON.stringify(this.props.data, $e98d3084b701f145$var$columnReplacer);\n            switch(exportType){\n                case \"json\":\n                    final(json);\n                    break;\n                case \"csv\":\n                    final((0, $3cd220df8c1129e3$export$65aea4b3b539487b)(JSON.parse(json), \",\"));\n                    break;\n                case \"tsv\":\n                    final((0, $3cd220df8c1129e3$export$65aea4b3b539487b)(JSON.parse(json), \"\t\"));\n                    break;\n                case \"html\":\n                    {\n                        const csv = (0, $3cd220df8c1129e3$export$65aea4b3b539487b)(JSON.parse(json), \",\");\n                        const html = (0, $8f1b85a9470d3af5$export$c4b7cd609ccf4a5a)(`${(0, $0db66385c00a3f15$export$21c51bc433c16634).appName} - ${escape(displayName)}`, $e98d3084b701f145$var$embedScript(csv, displayName));\n                        final(html);\n                    }\n            }\n        }\n        close() {\n            this.setState({\n                dialogHidden: true,\n                working: false\n            });\n        }\n        render() {\n            const closeDialog = ()=>this.close();\n            if (this.state.delayAction) requestAnimationFrame(()=>{\n                //allow render to complete\n                if (this.state.delayAction) {\n                    this.state.delayAction();\n                    this.setState({\n                        delayAction: null\n                    });\n                }\n            });\n            const disabled = this.state.working || this.state.dialogHidden;\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-dataExporter\"\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                className: \"search-action search-bottom-action\",\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonExportCount(this.props.data.length),\n                onClick: ()=>this.setState({\n                        dialogHidden: false\n                    }),\n                disabled: this.props.disabled\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $5453c8de1a3cb6b6$export$3ddf2d174ce01153), {\n                hidden: this.state.dialogHidden,\n                onDismiss: closeDialog,\n                dialogContentProps: {\n                    className: `sanddance-dialog ${this.props.theme}`,\n                    type: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DialogType.normal,\n                    title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelExport\n                },\n                buttons: [\n                    (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                        key: 0,\n                        disabled: disabled || !!this.state.fileNameError,\n                        onClick: (e)=>this.setState({\n                                delayAction: ()=>this.createExport(this.state.exportType, this.state.fileName),\n                                working: true\n                            }),\n                        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonExport,\n                        iconProps: {\n                            iconName: \"Download\"\n                        }\n                    })\n                ]\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.TextField, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelExportFileName,\n                onChange: (e, displayName)=>{\n                    const displayNameError = $e98d3084b701f145$var$getFileNameError(displayName);\n                    this.setState({\n                        fileName: displayName,\n                        fileNameError: displayNameError\n                    });\n                },\n                errorMessage: this.state.fileNameError,\n                value: this.state.fileName\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.ChoiceGroup, {\n                className: \"sanddance-form-separate\",\n                disabled: disabled,\n                options: $e98d3084b701f145$var$exportTypes.map(([exportType, text])=>{\n                    return {\n                        key: exportType,\n                        text: text,\n                        disabled: false,\n                        checked: exportType === this.state.exportType\n                    };\n                }),\n                onChange: (ev, option)=>this.setState({\n                        exportType: option.key\n                    }),\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelExportFormat\n            })));\n        }\n    }\n    return new __DataExportPicker(props1);\n}\nconst $e98d3084b701f145$export$b1b568728c48eba1 = $e98d3084b701f145$var$_DataExportPicker;\nconst $e98d3084b701f145$var$illegalChars = '\\\\/:*?\"<>|';\nfunction $e98d3084b701f145$var$getFileNameError(displayName) {\n    if (!displayName) return (0, $0db66385c00a3f15$export$21c51bc433c16634).errorExportFilenameEmpty;\n    for(let i = 0; i < $e98d3084b701f145$var$illegalChars.length; i++){\n        if (displayName.indexOf($e98d3084b701f145$var$illegalChars[i]) >= 0) return (0, $0db66385c00a3f15$export$21c51bc433c16634).errorExportFilenameCharacters($e98d3084b701f145$var$illegalChars);\n    }\n}\nfunction $e98d3084b701f145$export$748f956e607b675b(fileName) {\n    $e98d3084b701f145$var$exportTypes.forEach(([exportType])=>{\n        const re = new RegExp(`\\\\.${exportType}`, \"ig\");\n        fileName = fileName.replace(re, \"\");\n    });\n    return fileName;\n}\nfunction $e98d3084b701f145$var$columnReplacer(name, value) {\n    if ((0, $3b509b9541e52a8f$exports).util.isInternalFieldName(name, true)) return undefined;\n    return value === null ? \"\" : value;\n}\nfunction $e98d3084b701f145$var$embedScript(csv, displayName, snapshots) {\n    const dataFile = {\n        type: \"csv\",\n        displayName: displayName,\n        snapshots: snapshots\n    };\n    return `<pre id='csv-data' style='display:none'>${csv}</pre>\n    <script>SandDanceEmbed.load(Object.assign({rawText: document.getElementById('csv-data').innerText}, ${JSON.stringify(dataFile)}))</script>`;\n}\nfunction $e98d3084b701f145$export$9f4b684ea6be1a90(data, displayName, snapshots) {\n    const json = JSON.stringify(data, $e98d3084b701f145$var$columnReplacer);\n    const csv = (0, $3cd220df8c1129e3$export$65aea4b3b539487b)(JSON.parse(json), \",\");\n    const html = (0, $8f1b85a9470d3af5$export$c4b7cd609ccf4a5a)(`${(0, $0db66385c00a3f15$export$21c51bc433c16634).appName} - ${escape(displayName)}`, $e98d3084b701f145$var$embedScript(csv, displayName, snapshots));\n    return html;\n}\n\n\n\n\n\n\n\n\nfunction $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $a1d9524814b1e23a$exports).classList(\"sanddance-group\", props.className)\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"group-head\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"label\", null, props.label), props.labelCount && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"span\", {\n        className: \"count\"\n    }, \"(\", props.labelCount, \")\")), props.children && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"group-body\"\n    }, props.children));\n}\n\n\n\n\n\n\nfunction $4a8bbc4be9711d93$export$ce08aabc421980f4(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, props.allColumns.map((c, i)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n            key: c.name\n        }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"label\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Toggle, {\n            checked: props.exclusions.indexOf(c.name) < 0,\n            inlineLabel: true,\n            label: c.name,\n            onChange: ()=>props.toggleExclusion(c.name)\n        })))));\n}\n\n\nvar $72367f17ca00272b$exports = {};\n\"use strict\";\nvar $72367f17ca00272b$var$__createBinding = $72367f17ca00272b$exports && $72367f17ca00272b$exports.__createBinding || (Object.create ? function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, {\n        enumerable: true,\n        get: function() {\n            return m[k];\n        }\n    });\n} : function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n});\nvar $72367f17ca00272b$var$__exportStar = $72367f17ca00272b$exports && $72367f17ca00272b$exports.__exportStar || function(m, exports) {\n    for(var p in m)if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) $72367f17ca00272b$var$__createBinding(exports, m, p);\n};\nObject.defineProperty($72367f17ca00272b$exports, \"__esModule\", {\n    value: true\n});\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n$72367f17ca00272b$var$__exportStar((parcelRequire(\"b7nfv\")), $72367f17ca00272b$exports);\n\n$72367f17ca00272b$var$__exportStar((parcelRequire(\"a7afS\")), $72367f17ca00272b$exports);\n\n$72367f17ca00272b$var$__exportStar((parcelRequire(\"6bWv0\")), $72367f17ca00272b$exports);\n\n$72367f17ca00272b$var$__exportStar((parcelRequire(\"217nY\")), $72367f17ca00272b$exports);\n\n$72367f17ca00272b$var$__exportStar((parcelRequire(\"9kLwX\")), $72367f17ca00272b$exports);\n\n\n\n\nfunction $a17a024e67e91c9f$export$1e096674a95fd43b(insightColumns, actualColumns, transform) {\n    //ensure columns exist\n    for(let role in insightColumns){\n        let columnName = insightColumns[role];\n        let column = actualColumns.filter((c)=>c.name === columnName)[0];\n        let transformColumn = transform ? transform.filter((t)=>{\n            switch(t.type){\n                case \"formula\":\n                    return t.as === columnName;\n            }\n        })[0] : null;\n        if (!(column || transformColumn)) delete insightColumns[role];\n    }\n}\nfunction $a17a024e67e91c9f$export$c2563952d877899(chart, totalStyle, insightColumns, actualColumns) {\n    //ensure columns are populated\n    const nonInternal = actualColumns.filter((c)=>!(0, $3b509b9541e52a8f$exports).util.isInternalFieldName(c.name));\n    const firstColumn = nonInternal[0];\n    const firstColumnName = firstColumn && firstColumn.name;\n    const firstQuantitative = nonInternal.filter((c)=>c.quantitative)[0];\n    const firstQuantitativeColumnName = firstQuantitative && firstQuantitative.name;\n    const ensureColumn = (role, quantitative, treemap)=>{\n        if (!insightColumns[role]) {\n            if (treemap) insightColumns[role] = $a17a024e67e91c9f$export$7e0d3b5c6570ae8b(actualColumns).name;\n            else insightColumns[role] = quantitative ? firstQuantitativeColumnName : firstColumnName;\n        }\n    };\n    function checkRequiresSize() {\n        switch(totalStyle){\n            case \"sum-strip\":\n            case \"sum-strip-percent\":\n                ensureColumn(\"size\", true);\n                break;\n            case \"sum-treemap\":\n                ensureColumn(\"size\", true, true);\n                break;\n        }\n    }\n    switch(chart){\n        case \"barchart\":\n        case \"barchartV\":\n            ensureColumn(\"x\");\n            checkRequiresSize();\n            break;\n        case \"barchartH\":\n            ensureColumn(\"y\");\n            checkRequiresSize();\n            break;\n        case \"density\":\n            ensureColumn(\"x\");\n            ensureColumn(\"y\");\n            checkRequiresSize();\n            break;\n        case \"scatterplot\":\n        case \"stacks\":\n            ensureColumn(\"x\");\n            ensureColumn(\"y\");\n            break;\n        case \"treemap\":\n            if (!insightColumns.size) insightColumns.size = $a17a024e67e91c9f$export$7e0d3b5c6570ae8b(actualColumns).name;\n            if (!insightColumns.size) //error - no numeric column\n            return [\n                (0, $0db66385c00a3f15$export$21c51bc433c16634).errorColumnMustBeNumeric\n            ];\n            break;\n    }\n}\nfunction $a17a024e67e91c9f$export$7e0d3b5c6570ae8b(columns) {\n    let column = (0, $72367f17ca00272b$exports.preferredColumnForTreemapSize)(columns, true);\n    if (!column) column = (0, $72367f17ca00272b$exports.preferredColumnForTreemapSize)(columns, false);\n    return column;\n}\n\n\nconst $247884a4197e9da6$var$singleFacetLayouts = [\n    {\n        facetStyle: \"wrap\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelFacetLayoutWrap\n    }\n];\nconst $247884a4197e9da6$export$3fab399b77d7be2a = [\n    {\n        key: \"grid\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).chartTypeGrid\n    },\n    {\n        key: \"scatterplot\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).chartTypeScatterPlot\n    },\n    {\n        key: \"density\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).chartTypeDensity\n    },\n    {\n        key: \"barchartV\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).chartTypeBarChartV\n    },\n    {\n        key: \"barchartH\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).chartTypeBarChartH\n    },\n    {\n        key: \"treemap\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).chartTypeTreeMap\n    },\n    {\n        key: \"strips\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).chartTypeStrips\n    },\n    {\n        key: \"stacks\",\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).chartTypeStacks\n    }\n];\nfunction $247884a4197e9da6$export$7d1536ca08644643(key) {\n    for(let i = 0; i < $247884a4197e9da6$export$3fab399b77d7be2a.length; i++){\n        if (key === $247884a4197e9da6$export$3fab399b77d7be2a[i].key) return $247884a4197e9da6$export$3fab399b77d7be2a[i].text;\n    }\n}\nfunction $247884a4197e9da6$var$_Chart(_props) {\n    class __Chart extends (0, $8535c575077b9670$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                showTooltipDialog: false\n            };\n            this.choiceRef = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                return (_a = this.choiceRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n            };\n        }\n        render() {\n            const { props: props  } = this;\n            const { explorer: explorer , specCapabilities: specCapabilities  } = props;\n            const signals = explorer.viewer && explorer.viewer.vegaSpec && specCapabilities && specCapabilities.signals && explorer.viewer.vegaSpec.signals.filter((s)=>specCapabilities.signals.indexOf(s.name) >= 0);\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelChart\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"calculator\"\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.ChoiceGroup, {\n                componentRef: this.choiceRef,\n                className: \"sanddance-chart-type\",\n                options: $247884a4197e9da6$export$3fab399b77d7be2a.map((o)=>{\n                    return Object.assign(Object.assign({}, o), {\n                        checked: props.chart === o.key,\n                        disabled: props.disabled || o.key === \"treemap\" && props.quantitativeColumns.length === 0\n                    });\n                }),\n                onChange: (e, o)=>props.onChangeChartType(o.key)\n            }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnMapping\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, specCapabilities && specCapabilities.roles.map((specRole, i)=>{\n                const specColumnInRole = props.insightColumns[specRole.role];\n                const selectedColumnName = specColumnInRole;\n                let disabledColumnName;\n                let prefix;\n                let suffix;\n                let hideDropdown = false;\n                let { totalStyle: totalStyle1  } = props;\n                if (!totalStyle1) totalStyle1 = \"count-square\";\n                let { facetStyle: facetStyle  } = props;\n                if (!facetStyle) facetStyle = \"wrap\";\n                switch(specRole.role){\n                    case \"facet\":\n                        suffix = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n                            disabled: !props.insightColumns.facet,\n                            collapseLabel: props.collapseLabels,\n                            label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelFacetLayout,\n                            calloutProps: {\n                                style: {\n                                    minWidth: \"18em\"\n                                }\n                            },\n                            options: [\n                                {\n                                    key: \"header1\",\n                                    text: `${(0, $0db66385c00a3f15$export$21c51bc433c16634).labelFacetLayout}:`,\n                                    itemType: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n                                },\n                                ...$247884a4197e9da6$var$singleFacetLayouts.map((f)=>{\n                                    const o = {\n                                        key: f.facetStyle,\n                                        text: f.text,\n                                        data: f,\n                                        selected: facetStyle === f.facetStyle\n                                    };\n                                    return o;\n                                }),\n                                {\n                                    key: \"divider\",\n                                    text: \"-\",\n                                    itemType: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Divider\n                                },\n                                {\n                                    key: \"header2\",\n                                    text: `${(0, $0db66385c00a3f15$export$21c51bc433c16634).labelColumnFacetV}:`,\n                                    itemType: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n                                },\n                                ...(0, $f3c9564b99b49be4$export$c171b40a34e110b5)(Object.assign(Object.assign({}, props), {\n                                    specRole: specRole,\n                                    selectedColumnName: props.insightColumns.facetV\n                                })).map((o)=>{\n                                    if (o.itemType !== (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header) {\n                                        const facetData = {\n                                            facetStyle: \"cross\",\n                                            column: o.data\n                                        };\n                                        o.data = facetData;\n                                        o.text = `${(0, $0db66385c00a3f15$export$21c51bc433c16634).labelFacetLayoutCross} ${o.text}`;\n                                    }\n                                    return o;\n                                })\n                            ],\n                            onChange: (e, o)=>{\n                                const facetData = o.data;\n                                props.changeColumnMapping(\"facet\", \"facet\", null, {\n                                    facetStyle: facetData.facetStyle\n                                });\n                                if (facetData.facetStyle === \"cross\") props.changeColumnMapping(\"facetV\", (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.clone(facetData.column));\n                            }\n                        });\n                        break;\n                    case \"facetV\":\n                        hideDropdown = true;\n                        break;\n                    case \"size\":\n                        {\n                            const options = [\n                                {\n                                    key: \"count-square\",\n                                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTotalByCountSquare,\n                                    data: \"count-square\",\n                                    selected: !totalStyle1 || totalStyle1 === \"count-square\"\n                                },\n                                {\n                                    key: \"count-strip\",\n                                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTotalByCountStrip,\n                                    data: \"count-strip\",\n                                    selected: totalStyle1 === \"count-strip\"\n                                },\n                                {\n                                    key: \"sum-strip\",\n                                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTotalBySumStrip,\n                                    data: \"sum-strip\",\n                                    selected: totalStyle1 === \"sum-strip\"\n                                },\n                                {\n                                    key: \"sum-treemap\",\n                                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTotalBySumTreemap,\n                                    data: \"sum-treemap\",\n                                    selected: totalStyle1 === \"sum-treemap\",\n                                    disabled: props.quantitativeColumns.length === 0\n                                }\n                            ];\n                            if (specCapabilities.percentage) options.push({\n                                key: \"sum-strip-percent\",\n                                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTotalBySumStripPercent,\n                                data: \"sum-strip-percent\",\n                                selected: totalStyle1 === \"sum-strip-percent\",\n                                disabled: props.quantitativeColumns.length === 0\n                            });\n                            prefix = !specCapabilities.countsAndSums ? null : (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n                                collapseLabel: props.collapseLabels,\n                                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTotal,\n                                calloutProps: {\n                                    style: {\n                                        minWidth: \"18em\"\n                                    }\n                                },\n                                options: options,\n                                onChange: (e, o)=>{\n                                    const totalStyle = o.data;\n                                    let defaultColumn;\n                                    if (totalStyle.indexOf(\"sum-\") === 0) {\n                                        if (totalStyle === \"sum-treemap\") defaultColumn = (0, $a17a024e67e91c9f$export$7e0d3b5c6570ae8b)(props.allColumns);\n                                        defaultColumn = defaultColumn || props.quantitativeColumns[0];\n                                    }\n                                    props.changeColumnMapping(\"size\", \"size\", defaultColumn, {\n                                        totalStyle: totalStyle\n                                    });\n                                }\n                            });\n                            break;\n                        }\n                }\n                let disabled = props.disabled || props.view === \"2d\" && specRole.role === \"z\" || specRole.role === \"size\" && !(!specCapabilities.countsAndSums || totalStyle1.indexOf(\"sum-\") === 0) || specRole.role === \"sort\" && specCapabilities.countsAndSums && totalStyle1 === \"sum-treemap\";\n                return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $f3c9564b99b49be4$export$83b9e0badda50eeb), Object.assign({}, props, {\n                    prefix: prefix,\n                    suffix: suffix,\n                    collapseLabel: props.collapseLabels,\n                    disabled: disabled,\n                    disabledColumnName: disabledColumnName,\n                    selectedColumnName: selectedColumnName,\n                    specRole: specRole,\n                    key: i,\n                    onChangeSignal: (name, value)=>props.onChangeSignal(specRole.role, selectedColumnName, name, value),\n                    hideDropdown: hideDropdown\n                }));\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-tooltipMap\"\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonTooltipMapping,\n                onClick: ()=>this.setState({\n                        showTooltipDialog: true\n                    })\n            })))), signals && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelChartTypeOptions\n            }, signals.map((signal, i)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $9c14fe62b8e7ad84$export$8210dfe1863c478), {\n                    key: i,\n                    signal: signal,\n                    explorer: explorer,\n                    disabled: props.disabled || this.disableSignal(signal),\n                    collapseLabel: props.collapseLabels,\n                    newViewStateTarget: false\n                }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $5453c8de1a3cb6b6$export$3ddf2d174ce01153), {\n                hidden: !this.state.showTooltipDialog,\n                onDismiss: ()=>this.setState({\n                        showTooltipDialog: false\n                    }),\n                title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTooltipMapping\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $4a8bbc4be9711d93$export$ce08aabc421980f4), {\n                allColumns: props.allColumns,\n                exclusions: props.tooltipExclusions,\n                toggleExclusion: props.toggleTooltipExclusion\n            })));\n        }\n        disableSignal(signal) {\n            if (this.props.view === \"2d\" && signal.name === (0, $3b509b9541e52a8f$exports).constants.SignalNames.ZGrounded) return true;\n            return false;\n        }\n    }\n    return new __Chart(_props);\n}\nconst $247884a4197e9da6$export$acaa6426d77a227e = $247884a4197e9da6$var$_Chart;\n\n\n\n\nfunction $0e7e0db23c06e103$export$2c73285ae9390cec(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.TextField, Object.assign({\n        onKeyUp: (e)=>{\n            e.nativeEvent.stopImmediatePropagation();\n        }\n    }, props));\n}\n\n\n\n\nconst $f979d5a7baf59678$export$210195f4ae250f0a = 100;\nfunction $f979d5a7baf59678$export$c2b32f315f251228(column) {\n    const type = column && column.type;\n    switch(type){\n        case \"boolean\":\n            return [\n                [\n                    \"==\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchEQ\n                ],\n                [\n                    \"!=\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchNEQ\n                ],\n                [\n                    \"isnullorEmpty\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchNULL\n                ]\n            ];\n        case \"date\":\n        case \"integer\":\n        case \"number\":\n            return [\n                [\n                    \"==\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchEQ\n                ],\n                [\n                    \"!=\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchNEQ\n                ],\n                [\n                    \">\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchGT\n                ],\n                [\n                    \">=\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchGTE\n                ],\n                [\n                    \"<\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchLT\n                ],\n                [\n                    \"<=\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchLTE\n                ],\n                [\n                    \"isnullorEmpty\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchNULL\n                ]\n            ];\n        case \"string\":\n        default:\n            return [\n                [\n                    \"==\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchEQ\n                ],\n                [\n                    \"!=\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchNEQ\n                ],\n                [\n                    \">\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchGT\n                ],\n                [\n                    \">=\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchGTE\n                ],\n                [\n                    \"<\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchLT\n                ],\n                [\n                    \"<=\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchLTE\n                ],\n                [\n                    \"contains\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchIN\n                ],\n                [\n                    \"starts\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchSW\n                ],\n                [\n                    \"isnullorEmpty\",\n                    (0, $0db66385c00a3f15$export$21c51bc433c16634).searchNULL\n                ]\n            ];\n    }\n}\nfunction $f979d5a7baf59678$var$getExpressionClauses(currClause, disableOR) {\n    const keys = [\n        [\n            \"&&\",\n            (0, $0db66385c00a3f15$export$21c51bc433c16634).searchAND\n        ]\n    ];\n    if (!disableOR) keys.push([\n        \"||\",\n        (0, $0db66385c00a3f15$export$21c51bc433c16634).searchOR\n    ]);\n    return keys.map((key, i)=>{\n        const [clause, text] = key;\n        const selected = currClause == clause; //deliberate double equal \n        const option = {\n            key: i,\n            text: text,\n            data: clause,\n            selected: selected\n        };\n        return option;\n    });\n}\nfunction $f979d5a7baf59678$var$getOperators(ex, column) {\n    let anySelected = false;\n    const validOperators = $f979d5a7baf59678$export$c2b32f315f251228(column);\n    const options = validOperators.map((validoperator)=>{\n        const [op, text] = validoperator;\n        const selected = ex.operator === op;\n        anySelected = anySelected || selected;\n        const option = {\n            key: op,\n            text: text,\n            data: op,\n            selected: selected\n        };\n        return option;\n    });\n    if (!anySelected) options[0].selected = true;\n    return options;\n}\nfunction $f979d5a7baf59678$var$getDistinctValues(data, columnName) {\n    const distinctMap = {};\n    for(let i = 0; i < data.length; i++){\n        let row = data[i];\n        let value = row[columnName];\n        distinctMap[value] = true;\n    }\n    return Object.keys(distinctMap).sort();\n}\nfunction $f979d5a7baf59678$var$getValues(ex, column, data, autoCompleteDistinctValues) {\n    const stats = column && column.stats;\n    if (stats && stats.distinctValueCount < $f979d5a7baf59678$export$210195f4ae250f0a) {\n        if (!autoCompleteDistinctValues[column.name]) autoCompleteDistinctValues[column.name] = $f979d5a7baf59678$var$getDistinctValues(data, column.name);\n        return autoCompleteDistinctValues[column.name].map((v, i)=>({\n                key: i,\n                text: v\n            }));\n    }\n    return [];\n}\nfunction $f979d5a7baf59678$export$c72d34660a162238(ex) {\n    if (ex.operator === \"isnullorEmpty\") return \"\";\n    return typeof ex.value === \"string\" ? ex.value : ex.value == null ? \"\" : ex.value.toString();\n}\nfunction $f979d5a7baf59678$export$793106cac50ab579(props) {\n    const ex = props.searchExpression;\n    const possibleValues = $f979d5a7baf59678$var$getValues(ex, props.column, props.data, props.autoCompleteDistinctValues);\n    //TODO better date handling with calendar picker\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, props.index > 0 && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearchClause,\n        dropdownWidth: 120,\n        disabled: !ex.unlocked || props.disableOR,\n        options: $f979d5a7baf59678$var$getExpressionClauses(ex.clause, props.disableOR),\n        onChange: (e, o)=>props.onUpdateExpression({\n                clause: o.data\n            }, props.index)\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n        componentRef: props.dropdownRef,\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearchColumn,\n        options: [\n            {\n                key: \"\",\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectAny,\n                data: null,\n                selected: ex.name === null\n            }\n        ].concat(props.columns.map((c, i)=>({\n                key: c.name,\n                text: c.name,\n                data: c,\n                selected: c.name === ex.name\n            }))),\n        onChange: (e, o)=>props.onUpdateExpression({\n                name: o.data && o.data.name || null\n            }, props.index)\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearchOperator,\n        dropdownWidth: 120,\n        options: $f979d5a7baf59678$var$getOperators(ex, props.column),\n        onChange: (e, o)=>props.onUpdateExpression({\n                operator: o.data\n            }, props.index)\n    }), possibleValues.length > 0 && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.ComboBox, {\n        className: \"search-field\",\n        label: props.collapseLabels ? null : (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearchValue,\n        placeholder: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearchValuePlaceholder,\n        disabled: ex.operator === \"isnullorEmpty\",\n        dropdownWidth: (0, $01c4eef7f720da5f$export$8263e1ed1ef30f07),\n        allowFreeform: true,\n        autoComplete: \"on\",\n        errorMessage: ex.errorMessage,\n        text: $f979d5a7baf59678$export$c72d34660a162238(ex),\n        options: $f979d5a7baf59678$var$getValues(ex, props.column, props.data, props.autoCompleteDistinctValues),\n        onChange: (e, o, i, value)=>{\n            if (o) value = o.text;\n            props.onUpdateExpression({\n                value: value\n            }, props.index);\n        }\n    }), possibleValues.length === 0 && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $0e7e0db23c06e103$export$2c73285ae9390cec), {\n        className: \"search-field\",\n        label: props.collapseLabels ? null : (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearchValue,\n        placeholder: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearchValuePlaceholder,\n        disabled: ex.operator === \"isnullorEmpty\",\n        errorMessage: ex.errorMessage,\n        value: $f979d5a7baf59678$export$c72d34660a162238(ex),\n        onChange: (e, v)=>props.onUpdateExpression({\n                value: v\n            }, props.index)\n    }));\n}\n\n\n\n\nfunction $2a5fa1321d305a42$export$353f5b6fc5456de1(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DefaultButton, Object.assign({}, props, {\n        styles: {\n            root: {\n                backgroundColor: \"transparent\",\n                height: \"30px\",\n                width: props.width,\n                padding: 0\n            },\n            rootDisabled: {\n                backgroundColor: \"transparent\"\n            },\n            icon: {\n                color: props.themePalette.themePrimary\n            },\n            label: {\n                fontWeight: \"400\",\n                textAlign: props.textAlign || \"left\"\n            }\n        },\n        iconProps: {\n            iconName: props.iconName\n        }\n    }));\n}\n\n\n\n\n\n\nconst $fd0d652c33ef4e65$var$maxClauses = 5;\nfunction $fd0d652c33ef4e65$var$getColumnWithName(columnName, columns) {\n    for(var i = 0; i < columns.length; i++){\n        if (columns[i].name === columnName) return columns[i];\n    }\n}\nfunction $fd0d652c33ef4e65$var$validateExpression(ex) {\n    if (ex.operator === \"isnullorEmpty\") {\n        ex.errorMessage = null;\n        return;\n    }\n    const s = (0, $f979d5a7baf59678$export$c72d34660a162238)(ex);\n    if (s.length === 0) ex.errorMessage = (0, $0db66385c00a3f15$export$21c51bc433c16634).labelRequired;\n    else ex.errorMessage = null;\n}\nfunction $fd0d652c33ef4e65$var$clearExpressionValidation(ex) {\n    if (ex.operator === \"isnullorEmpty\") {\n        ex.errorMessage = null;\n        return;\n    }\n    const s = (0, $f979d5a7baf59678$export$c72d34660a162238)(ex);\n    if (s.length !== 0) ex.errorMessage = null;\n}\nfunction $fd0d652c33ef4e65$var$getGroupClauses(currClause, index, disableGroupOR) {\n    let keys;\n    if (index === 0) keys = [\n        [\n            null,\n            (0, $0db66385c00a3f15$export$21c51bc433c16634).searchWHERE\n        ]\n    ];\n    else {\n        keys = [\n            [\n                \"&&\",\n                (0, $0db66385c00a3f15$export$21c51bc433c16634).searchAND\n            ]\n        ];\n        if (!disableGroupOR) keys.push([\n            \"||\",\n            (0, $0db66385c00a3f15$export$21c51bc433c16634).searchOR\n        ]);\n    }\n    return keys.map((key, i)=>{\n        const [clause, text] = key;\n        const selected = currClause == clause; //deliberate double equal \n        const option = {\n            key: i,\n            text: text,\n            data: clause,\n            selected: selected\n        };\n        return option;\n    });\n}\nfunction $fd0d652c33ef4e65$var$_Search(_props) {\n    class __Search extends (0, $8535c575077b9670$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = this.getInitialState(this.props);\n            this.dropdownRef = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                return (_a = this.dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n            };\n        }\n        getInitialState(props) {\n            const initialState = {\n                groups: props.initializer.search || [\n                    this.newGroup(0, null)\n                ],\n                sortedColumns: [\n                    ...props.initializer.columns\n                ].sort((a, b)=>a.name.localeCompare(b.name)),\n                initializer: props.initializer\n            };\n            initialState.groups.forEach((group)=>{\n                group.expressions.forEach((ex)=>ex.unlocked = group.expressions.length <= 2);\n            });\n            return initialState;\n        }\n        componentDidUpdate() {\n            if (!(0, $a1d9524814b1e23a$exports).deepCompare(this.props.initializer, this.state.initializer)) this.setState(this.getInitialState(this.props));\n        }\n        validateAndSearch() {\n            const groups = [\n                ...this.state.groups\n            ];\n            groups.forEach((group)=>{\n                group.expressions.forEach($fd0d652c33ef4e65$var$validateExpression);\n                const errors = group.expressions.reduce((p, c)=>p || c.errorMessage, \"\");\n                if (errors) this.setState({\n                    groups: groups\n                });\n                else this.props.onSelect(this.state.groups);\n            });\n        }\n        newGroup(key, clause) {\n            const group = {\n                key: key,\n                clause: clause,\n                expressions: [\n                    this.newExpression(0, null)\n                ]\n            };\n            return group;\n        }\n        updateGroup(partialGroup, groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = Object.assign(Object.assign({}, groups[groupIndex]), partialGroup);\n            groups[groupIndex] = group;\n            this.setState({\n                groups: groups\n            });\n        }\n        addGroup() {\n            const groups = [\n                ...this.state.groups\n            ];\n            const maxKey = groups.reduce((max, p)=>p.key > max ? p.key : max, groups[0].key);\n            const newGroup = this.newGroup(maxKey + 1, \"&&\");\n            groups.push(newGroup);\n            this.setState({\n                groups: groups\n            });\n        }\n        deleteGroup(groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            groups.splice(groupIndex, 1);\n            this.setState({\n                groups: groups\n            });\n        }\n        newExpression(key, clause) {\n            const ex = {\n                key: key,\n                clause: clause,\n                name: null,\n                operator: \"contains\",\n                value: \"\"\n            };\n            return ex;\n        }\n        addExpression(groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = groups[groupIndex];\n            const maxKey = group.expressions.reduce((max, p)=>p.key > max ? p.key : max, group.expressions[0].key);\n            const newEx = this.newExpression(maxKey + 1, \"&&\");\n            group.expressions.push(newEx);\n            if (group.expressions.length === 2) newEx.unlocked = true;\n            else {\n                group.expressions.forEach((ex)=>ex.unlocked = false);\n                newEx.clause = group.expressions[1].clause;\n            }\n            this.setState({\n                groups: groups\n            });\n        }\n        updateExpression(partialEx, groupIndex, index) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = groups[groupIndex];\n            const ex = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.clone(group.expressions[index]);\n            if (ex.name !== partialEx.name) {\n                //choose an appropriate operator when switching data type\n                const oldColumn = $fd0d652c33ef4e65$var$getColumnWithName(ex.name, this.state.sortedColumns);\n                const newColumn = $fd0d652c33ef4e65$var$getColumnWithName(partialEx.name, this.state.sortedColumns);\n                const oldType = oldColumn && oldColumn.type;\n                const newType = newColumn && newColumn.type;\n                if (oldType !== newType) {\n                    const newOperators = (0, $f979d5a7baf59678$export$c2b32f315f251228)(newColumn).map((validOperator)=>validOperator[0]);\n                    //see if old operator is compatible\n                    if (newOperators.indexOf(ex.operator) < 0) //not compatible, so choose \"equal\"\n                    partialEx.operator = \"==\";\n                }\n            }\n            Object.assign(ex, partialEx);\n            $fd0d652c33ef4e65$var$clearExpressionValidation(ex);\n            group.expressions[index] = ex;\n            this.setState({\n                groups: groups\n            });\n        }\n        deleteExpression(groupIndex, index) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = groups[groupIndex];\n            const expressions = [\n                ...group.expressions\n            ];\n            expressions.splice(index, 1);\n            if (expressions.length === 2) expressions[1].unlocked = true;\n            group.expressions = expressions;\n            this.setState({\n                groups: groups\n            });\n        }\n        render() {\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                className: \"sanddance-search\",\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearch\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, this.state.groups.map((group, groupIndex)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: \"sanddance-search-group\",\n                    key: group.key\n                }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n                    collapseLabel: this.props.collapseLabels,\n                    className: \"search-group-clause\",\n                    label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearchClause,\n                    disabled: groupIndex === 0 || this.props.disableGroupOR,\n                    dropdownWidth: 120,\n                    options: $fd0d652c33ef4e65$var$getGroupClauses(group.clause, groupIndex, this.props.disableGroupOR),\n                    onChange: (e, o)=>this.updateGroup({\n                            clause: o.data\n                        }, groupIndex)\n                }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, group.expressions.map((ex1, i1)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                        className: \"sanddance-search-expression\",\n                        key: ex1.key\n                    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $f979d5a7baf59678$export$793106cac50ab579), {\n                        dropdownRef: groupIndex === 0 && i1 === 0 ? this.dropdownRef : undefined,\n                        collapseLabels: this.props.collapseLabels,\n                        onUpdateExpression: (ex, i)=>this.updateExpression(ex, groupIndex, i),\n                        autoCompleteDistinctValues: this.props.autoCompleteDistinctValues,\n                        index: i1,\n                        columns: this.state.sortedColumns,\n                        data: this.props.data,\n                        searchExpression: ex1,\n                        disableOR: this.props.disableExpressionOR,\n                        column: $fd0d652c33ef4e65$var$getColumnWithName(ex1.name, this.state.sortedColumns)\n                    }), group.expressions.length > 1 && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $2a5fa1321d305a42$export$353f5b6fc5456de1), {\n                        themePalette: this.props.themePalette,\n                        className: \"search-action\",\n                        iconName: \"Cancel\",\n                        onClick: ()=>this.deleteExpression(groupIndex, i1),\n                        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonDeleteExpression\n                    })))), group.expressions.length < $fd0d652c33ef4e65$var$maxClauses && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $2a5fa1321d305a42$export$353f5b6fc5456de1), {\n                    themePalette: this.props.themePalette,\n                    className: \"search-action\",\n                    iconName: \"Add\",\n                    onClick: ()=>this.addExpression(groupIndex),\n                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonAddExpression\n                })), this.state.groups.length > 1 && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $2a5fa1321d305a42$export$353f5b6fc5456de1), {\n                    themePalette: this.props.themePalette,\n                    className: \"search-action\",\n                    iconName: \"Cancel\",\n                    onClick: ()=>this.deleteGroup(groupIndex),\n                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonDeleteExpressionGroup\n                }))), this.state.groups.length < $fd0d652c33ef4e65$var$maxClauses && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $2a5fa1321d305a42$export$353f5b6fc5456de1), {\n                themePalette: this.props.themePalette,\n                className: \"search-action search-bottom-action\",\n                iconName: \"Add\",\n                onClick: ()=>this.addGroup(),\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonAddExpressionGroup\n            }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                className: \"search-action search-bottom-action\",\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonSelect,\n                onClick: ()=>this.validateAndSearch()\n            }));\n        }\n    }\n    return new __Search(_props);\n}\nconst $fd0d652c33ef4e65$export$4b85d3515bd863a5 = $fd0d652c33ef4e65$var$_Search;\n\n\n\n\n\nvar $29728562a99c68a2$var$PresenterElement = (0, $3b509b9541e52a8f$exports).VegaDeckGl.PresenterElement;\nfunction $29728562a99c68a2$export$f80a6900d44a74ee(viewer) {\n    var tags = viewer.presenter.getElement($29728562a99c68a2$var$PresenterElement.gl).getElementsByTagName(\"canvas\");\n    if (tags) return tags[0];\n}\nfunction $29728562a99c68a2$export$95ea862e038e2d34(viewer) {\n    var canvas = $29728562a99c68a2$export$f80a6900d44a74ee(viewer);\n    if (canvas) canvas.tabIndex = -1;\n}\nconst $29728562a99c68a2$export$8e76ac9f37578d1b = {\n    webgl: !!document.createElement(\"canvas\").getContext(\"webgl\"),\n    webgl2: !!document.createElement(\"canvas\").getContext(\"webgl2\")\n};\n\n\n\n\n\n\n\nconst $f56a95f33c4cc847$export$83d89fbfd8236492 = \"3.2.0\";\n\n\nvar $4805700d8b417596$var$SandDance = $3b509b9541e52a8f$exports;\nvar $4805700d8b417596$var$DataRefType;\n(function(DataRefType1) {\n    DataRefType1[DataRefType1[\"none\"] = 0] = \"none\";\n    DataRefType1[DataRefType1[\"inline\"] = 1] = \"inline\";\n    DataRefType1[DataRefType1[\"url\"] = 2] = \"url\";\n})($4805700d8b417596$var$DataRefType || ($4805700d8b417596$var$DataRefType = {}));\nfunction $4805700d8b417596$var$filterSignals(signal) {\n    switch(signal.name){\n        case $4805700d8b417596$var$SandDance.constants.SignalNames.XBins:\n        case $4805700d8b417596$var$SandDance.constants.SignalNames.YBins:\n        case $4805700d8b417596$var$SandDance.constants.SignalNames.FacetBins:\n        case $4805700d8b417596$var$SandDance.constants.SignalNames.FacetVBins:\n        case $4805700d8b417596$var$SandDance.constants.SignalNames.ColorBinCount:\n        case $4805700d8b417596$var$SandDance.constants.SignalNames.ColorReverse:\n        case $4805700d8b417596$var$SandDance.constants.SignalNames.PointScale:\n        case $4805700d8b417596$var$SandDance.constants.SignalNames.TreeMapMethod:\n            return false;\n        default:\n            return !!signal.bind;\n    }\n}\nfunction $4805700d8b417596$var$cloneData(vegaSpec) {\n    const data0 = vegaSpec.data[0];\n    const valuesData = data0;\n    const values = valuesData.values;\n    delete valuesData.values;\n    const data = $4805700d8b417596$var$SandDance.VegaDeckGl.util.clone(vegaSpec.data);\n    valuesData.values = values;\n    return {\n        data: data,\n        values: values\n    };\n}\nfunction $4805700d8b417596$var$cloneScales(vegaSpec) {\n    return $4805700d8b417596$var$SandDance.VegaDeckGl.util.clone(vegaSpec.scales);\n}\nfunction $4805700d8b417596$var$serializeSpec(vegaSpec, datafile, dataRefType, transform, scheme) {\n    const scales = $4805700d8b417596$var$cloneScales(vegaSpec);\n    const colorScale = scales.filter((scale)=>scale.name === $4805700d8b417596$var$SandDance.constants.ScaleNames.Color)[0];\n    if (scheme.indexOf(\"dual_\") >= 0) colorScale.range = $4805700d8b417596$var$SandDance.colorSchemes.filter((cs)=>cs.scheme === scheme)[0].colors;\n    const clone = $4805700d8b417596$var$cloneData(vegaSpec);\n    const data0 = clone.data[0];\n    if (dataRefType === $4805700d8b417596$var$DataRefType.inline) {\n        const valuesData = data0;\n        valuesData.format = {\n            parse: \"auto\",\n            type: \"json\"\n        };\n        valuesData.values = clone.values;\n    } else if (dataRefType === $4805700d8b417596$var$DataRefType.none) {\n        const valuesData = data0;\n        valuesData.values = [];\n        if (transform) {\n            if (valuesData.transform) valuesData.transform.push.apply(valuesData.transform, transform);\n            else valuesData.transform = transform;\n        }\n    } else if (dataRefType === $4805700d8b417596$var$DataRefType.url) {\n        const urlData = data0;\n        urlData.url = datafile.dataUrl;\n        urlData.format = {\n            parse: \"auto\",\n            type: datafile.type\n        };\n        if (transform) {\n            if (urlData.transform) urlData.transform.push.apply(urlData.transform, transform);\n            else urlData.transform = transform;\n        }\n    }\n    return Object.assign(Object.assign({}, vegaSpec), {\n        data: clone.data,\n        scales: scales\n    });\n}\nfunction $4805700d8b417596$var$defaultDataRefType(datafile) {\n    if (datafile.dataUrl) return $4805700d8b417596$var$DataRefType.url;\n    return $4805700d8b417596$var$DataRefType.none;\n}\nfunction $4805700d8b417596$var$initState(props) {\n    return {\n        showSystemDialog: false,\n        showVegaDialog: false,\n        dataRefType: $4805700d8b417596$var$defaultDataRefType(props.dataFile),\n        spec: null\n    };\n}\nfunction $4805700d8b417596$var$signalGroupKey(key) {\n    for(let i = 0; i < (0, $0db66385c00a3f15$export$21c51bc433c16634).signalGroups.length; i++){\n        if ((0, $0db66385c00a3f15$export$21c51bc433c16634).signalGroups[i].prefix === key) return key;\n    }\n    return \"*\";\n}\nfunction $4805700d8b417596$var$vegaSignalGroups(vegaSignals) {\n    const signalGroupMap = {};\n    vegaSignals.forEach((vs)=>{\n        const split = vs.name.split(\"_\");\n        const key = $4805700d8b417596$var$signalGroupKey(split[0]);\n        signalGroupMap[key] = signalGroupMap[key] || [];\n        signalGroupMap[key].push(vs);\n    });\n    return signalGroupMap;\n}\nfunction $4805700d8b417596$var$_Settings(_props) {\n    class __Settings extends (0, $8535c575077b9670$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = $4805700d8b417596$var$initState(props);\n        }\n        render() {\n            const { props: props , state: state  } = this;\n            if (!props.explorer.viewer || !props.explorer.viewer.vegaSpec) return null;\n            const options = [\n                {\n                    key: $4805700d8b417596$var$DataRefType.none,\n                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectVegaSpecDataNone,\n                    selected: this.state.dataRefType === $4805700d8b417596$var$DataRefType.none,\n                    data: $4805700d8b417596$var$DataRefType.none\n                },\n                !props.dataFile.rawText && {\n                    key: $4805700d8b417596$var$DataRefType.url,\n                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectVegaSpecDataUrl,\n                    selected: this.state.dataRefType === $4805700d8b417596$var$DataRefType.url,\n                    data: $4805700d8b417596$var$DataRefType.url\n                },\n                {\n                    key: $4805700d8b417596$var$DataRefType.inline,\n                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectVegaSpecDataInline,\n                    selected: this.state.dataRefType === $4805700d8b417596$var$DataRefType.inline,\n                    data: $4805700d8b417596$var$DataRefType.inline\n                }\n            ].filter(Boolean);\n            const signalGroupMap = $4805700d8b417596$var$vegaSignalGroups(props.explorer.viewer.vegaSpec.signals);\n            let first = true;\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $0db66385c00a3f15$export$21c51bc433c16634).signalGroups.map((sg, gi)=>{\n                const vegaSignals = signalGroupMap[sg.prefix];\n                if (vegaSignals) {\n                    const filteredVegaSignals = vegaSignals.filter($4805700d8b417596$var$filterSignals);\n                    if (filteredVegaSignals.length > 0) return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                        key: sg.prefix,\n                        label: sg.label\n                    }, filteredVegaSignals.map((signal, i)=>{\n                        const ref = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createRef();\n                        if (first) {\n                            first = false;\n                            props.explorer.dialogFocusHandler.focus = ()=>{\n                                const f = ref.current;\n                                if (f.focus) f.focus();\n                            };\n                        }\n                        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $9c14fe62b8e7ad84$export$8210dfe1863c478), {\n                            componentRef: ref,\n                            key: i,\n                            signal: signal,\n                            explorer: props.explorer,\n                            newViewStateTarget: false\n                        });\n                    }));\n                }\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelChartCanvas\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Toggle, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelShowAxes,\n                defaultChecked: !props.hideAxes,\n                onChange: (e, checked)=>props.onToggleAxes(!checked)\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Toggle, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelShowLegend,\n                defaultChecked: !props.hideLegend,\n                onChange: (e, checked)=>props.onToggleLegend(!checked)\n            })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTools\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonShowVegaSpec,\n                onClick: ()=>this.setState({\n                        showVegaDialog: true,\n                        spec: $4805700d8b417596$var$serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, this.state.dataRefType, props.explorer.viewer.getInsight().transform, this.props.scheme)\n                    })\n            })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSnapshots\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSnapshotSettingThumbnailWidth,\n                onChange: (value)=>{\n                    this.props.explorer.snapshotThumbWidth = value;\n                },\n                min: 100,\n                max: 800,\n                defaultValue: this.props.explorer.snapshotThumbWidth\n            })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTransitionDurations\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTransitionColor,\n                onChange: (value)=>{\n                    this.props.explorer.viewerOptions.transitionDurations.color = value;\n                },\n                min: 0,\n                max: 10000,\n                defaultValue: this.props.explorer.viewerOptions.transitionDurations.color\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTransitionPosition,\n                onChange: (value)=>{\n                    this.props.explorer.viewerOptions.transitionDurations.position = value;\n                },\n                min: 0,\n                max: 10000,\n                defaultValue: this.props.explorer.viewerOptions.transitionDurations.position\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTransitionSize,\n                onChange: (value)=>{\n                    this.props.explorer.viewerOptions.transitionDurations.size = value;\n                },\n                min: 0,\n                max: 10000,\n                defaultValue: this.props.explorer.viewerOptions.transitionDurations.size\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTransitionCamera,\n                onChange: (value)=>{\n                    this.props.explorer.viewerOptions.transitionDurations.view = value;\n                },\n                min: 0,\n                max: 10000,\n                defaultValue: this.props.explorer.viewerOptions.transitionDurations.view\n            })), props.additionalSettings && props.additionalSettings.map((g, i)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                    key: i,\n                    label: g.groupLabel\n                }, g.children)), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSystem\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSystemInfo,\n                onClick: ()=>this.setState({\n                        showSystemDialog: true\n                    })\n            })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $5453c8de1a3cb6b6$export$3ddf2d174ce01153), {\n                hidden: !state.showVegaDialog,\n                onDismiss: ()=>this.setState($4805700d8b417596$var$initState(this.props)),\n                minWidth: \"80%\",\n                title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelVegaSpec,\n                buttons: [\n                    (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                        key: \"copy\",\n                        iconProps: {\n                            iconName: \"Copy\"\n                        },\n                        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonCopyToClipboard,\n                        onClick: ()=>{\n                            var pre = document.getElementById(\"sanddance-vega-spec\");\n                            var range = document.createRange();\n                            range.selectNode(pre);\n                            const selection = window.getSelection();\n                            selection.removeAllRanges();\n                            selection.addRange(range);\n                            document.execCommand(\"copy\");\n                        }\n                    }),\n                    (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                        key: \"edit\",\n                        iconProps: {\n                            iconName: \"OpenInNewWindow\"\n                        },\n                        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonLaunchVegaEditor,\n                        onClick: ()=>{\n                            window.open(\"https://vega.github.io/editor/\", \"_blank\");\n                        }\n                    })\n                ]\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelVegaSpecData,\n                options: options,\n                onChange: (e, o)=>this.setState({\n                        dataRefType: o.data,\n                        spec: $4805700d8b417596$var$serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, o.data, props.explorer.viewer.getInsight().transform, this.props.scheme)\n                    })\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"pre\", {\n                id: \"sanddance-vega-spec\"\n            }, JSON.stringify(this.state.spec, null, 2)), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $0db66385c00a3f15$export$21c51bc433c16634).labelVegaSpecNotes)), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $5453c8de1a3cb6b6$export$3ddf2d174ce01153), {\n                hidden: !state.showSystemDialog,\n                onDismiss: ()=>this.setState($4805700d8b417596$var$initState(this.props)),\n                title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSystemInfo\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"ul\", null, this.props.children, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"li\", null, \"SandDanceExplorer version: \", (0, $f56a95f33c4cc847$export$83d89fbfd8236492)), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"li\", null, \"SandDanceReact version: \", $b7e03869cd46da1e$export$83d89fbfd8236492), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"li\", null, \"SandDance version: \", $4805700d8b417596$var$SandDance.version), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"li\", null, \"WebGL enabled: \", (0, $29728562a99c68a2$export$8e76ac9f37578d1b).webgl ? (0, $0db66385c00a3f15$export$21c51bc433c16634).labelYes : (0, $0db66385c00a3f15$export$21c51bc433c16634).labelNo), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"li\", null, \"WebGL2 enabled: \", (0, $29728562a99c68a2$export$8e76ac9f37578d1b).webgl2 ? (0, $0db66385c00a3f15$export$21c51bc433c16634).labelYes : (0, $0db66385c00a3f15$export$21c51bc433c16634).labelNo))));\n        }\n    }\n    return new __Settings(_props);\n}\nconst $4805700d8b417596$export$c72f6eaae7b9adff = $4805700d8b417596$var$_Settings;\n\n\n\n\n\n\n\nfunction $555bb845cf8689db$var$_SnapshotEditor(props1) {\n    class __SnapshotEditor extends (0, $8535c575077b9670$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                showEditFormDialog: false,\n                title: \"\",\n                description: \"\",\n                image: null,\n                bgColor: null,\n                insight: null,\n                editIndex: -1\n            };\n        }\n        resize(src, thumbWidth) {\n            if (!src) return;\n            var img = new Image();\n            img.onload = ()=>{\n                var canvas = document.createElement(\"canvas\"), ctx = canvas.getContext(\"2d\");\n                const ratio = img.width / thumbWidth;\n                canvas.height = img.height / ratio;\n                canvas.width = thumbWidth;\n                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n                const image = canvas.toDataURL();\n                this.setState({\n                    image: image\n                });\n            };\n            img.src = src;\n        }\n        editSnapshot(snapshot, editIndex = -1) {\n            if (snapshot) this.setState(Object.assign(Object.assign({\n                showEditFormDialog: true\n            }, snapshot), {\n                editIndex: editIndex\n            }));\n            else {\n                const signalValues = this.props.explorer.viewer.getSignalValues();\n                this.props.explorer.viewer.deselect().then(()=>{\n                    const canvas = (0, $29728562a99c68a2$export$f80a6900d44a74ee)(this.props.explorer.viewer);\n                    const bgColor = canvas && window.getComputedStyle(canvas).backgroundColor;\n                    const insight = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.clone(this.props.explorer.viewer.getInsight());\n                    delete insight.size;\n                    insight.signalValues = signalValues;\n                    const title = this.props.getTitle && this.props.getTitle(insight) || \"\";\n                    const description = this.props.getDescription && this.props.getDescription(insight) || \"\";\n                    this.setState({\n                        showEditFormDialog: true,\n                        bgColor: bgColor,\n                        title: title,\n                        description: description,\n                        insight: insight,\n                        image: null,\n                        editIndex: editIndex\n                    });\n                    //allow deselection to render\n                    setTimeout(()=>{\n                        this.props.explorer.viewer.presenter.canvasToDataURL().then((dataUrl)=>{\n                            this.resize(dataUrl, this.props.explorer.snapshotThumbWidth);\n                        });\n                    }, 500);\n                });\n            }\n        }\n        render() {\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $5453c8de1a3cb6b6$export$3ddf2d174ce01153), {\n                modalProps: {\n                    className: (0, $a1d9524814b1e23a$exports).classList(\"sanddance-snapshot-dialog\", this.props.theme)\n                },\n                minWidth: `${this.props.explorer.snapshotThumbWidth + 64}px`,\n                hidden: !this.state.showEditFormDialog,\n                onDismiss: ()=>this.setState({\n                        showEditFormDialog: false\n                    }),\n                title: this.state.editIndex >= 0 ? (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonEditSnapshot : (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonCreateSnapshot,\n                buttons: (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                    disabled: !this.state.image || !this.state.title,\n                    key: 0,\n                    onClick: (e)=>{\n                        const snapshot = {\n                            title: this.state.title,\n                            description: this.state.description,\n                            insight: this.state.insight,\n                            image: this.state.image,\n                            bgColor: this.state.bgColor\n                        };\n                        this.props.modifySnapShot && this.props.modifySnapShot(snapshot);\n                        this.props.onWriteSnapshot(snapshot, this.state.editIndex);\n                        this.setState({\n                            showEditFormDialog: false,\n                            title: \"\",\n                            description: \"\",\n                            image: null\n                        });\n                    },\n                    iconProps: {\n                        iconName: \"Camera\"\n                    },\n                    text: this.state.editIndex >= 0 ? (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonUpdateSnapshot : (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonCreateSnapshot\n                })\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.TextField, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSnapshotTitle,\n                onChange: (e, title)=>this.setState({\n                        title: title\n                    }),\n                value: this.state.title\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.TextField, {\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSnapshotDescription,\n                onChange: (e, description)=>this.setState({\n                        description: description\n                    }),\n                value: this.state.description,\n                multiline: true\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"thumbnail\"\n            }, !this.state.image && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Spinner, null), this.state.image && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"img\", {\n                src: this.state.image,\n                style: {\n                    backgroundColor: this.state.bgColor\n                }\n            })), this.props.explorer.viewer && this.props.explorer.viewer.colorContexts && this.props.explorer.viewer.colorContexts.length > 1 && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorFilter));\n        }\n    }\n    return new __SnapshotEditor(props1);\n}\nconst $555bb845cf8689db$export$15b376344cc89d12 = $555bb845cf8689db$var$_SnapshotEditor;\n\n\n\n\n\n\nfunction $adfb025456b8f57f$export$c25acd513dcc8062(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.IconButton, Object.assign({}, props, {\n        styles: {\n            root: {\n                color: props.themePalette.black\n            },\n            rootHovered: {\n                background: \"transparent\",\n                color: props.themePalette.themePrimary\n            },\n            rootPressed: {\n                background: \"transparent\"\n            },\n            menuIcon: {\n                display: \"none\"\n            }\n        },\n        iconProps: {\n            iconName: props.iconName\n        },\n        menuProps: props.menuProps\n    }));\n}\n\n\n\n\nfunction $3465068850534ed3$var$_Snapshots(_props) {\n    class __Snapshots extends (0, $8535c575077b9670$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                confirmation: null,\n                title: \"\",\n                description: \"\",\n                image: null,\n                bgColor: null,\n                insight: null\n            };\n        }\n        render() {\n            const items = [\n                {\n                    key: \"clear\",\n                    text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonClearSnapshots,\n                    onClick: ()=>this.setState({\n                            confirmation: {\n                                buttonText: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonClearSnapshots,\n                                handler: ()=>this.props.onClearSnapshots()\n                            }\n                        }),\n                    disabled: this.props.snapshots.length === 0\n                }\n            ];\n            if (this.props.getTopActions) items.push.apply(items, this.props.getTopActions(this.props.snapshots));\n            const ref = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createRef();\n            this.props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                (_a = ref.current) === null || _a === void 0 || _a.focus();\n            };\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n                className: \"sanddance-snapshots\",\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSnapshots\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                componentRef: ref,\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonCreateSnapshot,\n                onClick: (e)=>this.props.editor.editSnapshot(),\n                split: true,\n                menuProps: {\n                    items: items\n                }\n            }), this.props.getChildren && this.props.getChildren(this.props.snapshots), this.state.confirmation && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $5453c8de1a3cb6b6$export$3ddf2d174ce01153), {\n                hidden: false,\n                buttons: (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                    key: 0,\n                    onClick: (e)=>{\n                        this.setState({\n                            confirmation: null\n                        });\n                        this.state.confirmation.handler();\n                    },\n                    iconProps: {\n                        iconName: \"Delete\"\n                    },\n                    text: this.state.confirmation.buttonText\n                }),\n                onDismiss: ()=>this.setState({\n                        confirmation: null\n                    })\n            }, (0, $0db66385c00a3f15$export$21c51bc433c16634).labelConfirmation), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, this.props.snapshots.map((snapshot, i)=>{\n                const actions = this.props.getActions && this.props.getActions(snapshot, i) || [];\n                actions.push({\n                    iconButtonProps: {\n                        themePalette: this.props.themePalette,\n                        title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonEditSnapshot,\n                        onClick: (e)=>this.props.editor.editSnapshot(snapshot, i),\n                        iconName: \"Edit\"\n                    }\n                });\n                if (this.props.snapshots.length > 1) actions.push({\n                    iconButtonProps: {\n                        disabled: i === 0,\n                        themePalette: this.props.themePalette,\n                        title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonMoveUp,\n                        onClick: (e)=>this.props.onMoveUp(i),\n                        iconName: \"SortUp\"\n                    }\n                }, {\n                    iconButtonProps: {\n                        disabled: i > this.props.snapshots.length - 2,\n                        themePalette: this.props.themePalette,\n                        title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonMoveDown,\n                        onClick: (e)=>this.props.onMoveDown(i),\n                        iconName: \"SortDown\"\n                    }\n                });\n                actions.push({\n                    iconButtonProps: {\n                        themePalette: this.props.themePalette,\n                        title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonDeleteSnapshot,\n                        onClick: ()=>this.setState({\n                                confirmation: {\n                                    buttonText: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonDeleteSnapshot,\n                                    handler: ()=>this.props.onRemoveSnapshot(i)\n                                }\n                            }),\n                        iconName: \"Delete\"\n                    }\n                });\n                return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    key: i,\n                    className: (0, $a1d9524814b1e23a$exports).classList(\"snapshot\", i === this.props.selectedSnapshotIndex && \"selected\")\n                }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    onClick: (e)=>this.props.onSnapshotClick(snapshot, i)\n                }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: \"title\"\n                }, snapshot.title), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: \"thumbnail\"\n                }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"img\", {\n                    title: snapshot.description,\n                    src: snapshot.image,\n                    style: {\n                        backgroundColor: snapshot.bgColor\n                    }\n                }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($3465068850534ed3$var$Actions, {\n                    actions: actions,\n                    snapshot: snapshot\n                }));\n            }))));\n        }\n    }\n    return new __Snapshots(_props);\n}\nconst $3465068850534ed3$export$3e09886744a57615 = $3465068850534ed3$var$_Snapshots;\nfunction $3465068850534ed3$var$Actions(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"actions\"\n    }, props.actions.map((action, i)=>{\n        if (action.iconButtonProps) return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $adfb025456b8f57f$export$c25acd513dcc8062), Object.assign({\n            key: i\n        }, action.iconButtonProps));\n        if (action.element) return action.element;\n    }));\n}\n\n\nvar $b935bf5e2863e486$exports = {};\n\n$parcel$export($b935bf5e2863e486$exports, \"Explorer\", () => $b935bf5e2863e486$export$43584986cb77a794);\n\n\n\n\n\n\n\nconst $1ea281e0bf69aeed$var$className = \"sanddance-panel-tools\";\nfunction $1ea281e0bf69aeed$var$ensureToolbar(panel) {\n    const existing = panel.getElementsByClassName($1ea281e0bf69aeed$var$className);\n    if (existing.length > 0) return existing[0];\n    else {\n        const div = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.addDiv(panel, $1ea281e0bf69aeed$var$className);\n        panel.insertAdjacentElement(\"afterbegin\", div);\n        return div;\n    }\n}\nfunction $1ea281e0bf69aeed$export$225a002951c27da7(presenter, showLegend, props) {\n    const panel = presenter.getElement((0, $3b509b9541e52a8f$exports).VegaDeckGl.PresenterElement.panel);\n    const div = $1ea281e0bf69aeed$var$ensureToolbar(panel);\n    (0, $8535c575077b9670$export$e2253033e6e1df16).reactDOM.render($1ea281e0bf69aeed$var$ColorMap(props), div);\n    panel.style.display = showLegend ? \"\" : \"none\";\n}\nfunction $1ea281e0bf69aeed$var$ColorMap(props) {\n    const menuProps = {\n        items: [\n            {\n                key: \"new\",\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonColorSchemeRemap,\n                disabled: !props.canRemap || props.isRemap,\n                onClick: ()=>props.colorMapHandler(true)\n            },\n            {\n                key: \"old\",\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonColorSchemeKeep,\n                disabled: !props.canRemap || !props.isRemap,\n                onClick: ()=>props.colorMapHandler(false)\n            }\n        ]\n    };\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $adfb025456b8f57f$export$c25acd513dcc8062), {\n        themePalette: props.themePalette,\n        title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonColorSchemeMap,\n        onClick: null,\n        iconName: props.canRemap ? \"FiltersSolid\" : \"Filters\",\n        menuProps: menuProps\n    }));\n}\n\n\nfunction $02ad5d745dd4974f$export$ba25af89e7ea3c1a(newColumn, oldColumn, oldScheme) {\n    if (oldColumn && oldColumn.quantitative === newColumn.quantitative && $02ad5d745dd4974f$var$defaultColorScheme(oldColumn) === $02ad5d745dd4974f$var$defaultColorScheme(newColumn)) return oldScheme;\n    return $02ad5d745dd4974f$var$defaultColorScheme(newColumn);\n}\nfunction $02ad5d745dd4974f$var$defaultColorScheme(c) {\n    if (c.quantitative) return \"redyellowgreen\";\n    else if (c.stats.distinctValueCount === 2) return \"dual_redgreen\";\n    else if (c.stats.distinctValueCount <= 10) return \"category10\";\n    return \"category20\";\n}\n\n\n\n\n\n\n\nfunction $336606e4467c7c06$export$2e2bcd8739ae039(x) {\n    return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString(\"en\").replace(/,/g, \"\") : x.toString(10);\n}\nfunction $336606e4467c7c06$export$8f8e23dd27dc19f5(x, p) {\n    if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n    var i, coefficient = x.slice(0, i);\n    // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n    // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n    return [\n        coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n        +x.slice(i + 1)\n    ];\n}\n\n\nfunction $66ddd43ef132fe4c$export$2e2bcd8739ae039(x) {\n    return x = (0, $336606e4467c7c06$export$8f8e23dd27dc19f5)(Math.abs(x)), x ? x[1] : NaN;\n}\n\n\nfunction $4886ae7df3b00c8d$export$2e2bcd8739ae039(grouping, thousands) {\n    return function(value, width) {\n        var i = value.length, t = [], j = 0, g = grouping[0], length = 0;\n        while(i > 0 && g > 0){\n            if (length + g + 1 > width) g = Math.max(1, width - length);\n            t.push(value.substring(i -= g, i + g));\n            if ((length += g + 1) > width) break;\n            g = grouping[j = (j + 1) % grouping.length];\n        }\n        return t.reverse().join(thousands);\n    };\n}\n\n\nfunction $08e49d150cf0e40b$export$2e2bcd8739ae039(numerals) {\n    return function(value) {\n        return value.replace(/[0-9]/g, function(i) {\n            return numerals[+i];\n        });\n    };\n}\n\n\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar $4e7c2ad27f8b8986$var$re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nfunction $4e7c2ad27f8b8986$export$2e2bcd8739ae039(specifier) {\n    if (!(match = $4e7c2ad27f8b8986$var$re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match;\n    return new $4e7c2ad27f8b8986$export$963aac351db36ed4({\n        fill: match[1],\n        align: match[2],\n        sign: match[3],\n        symbol: match[4],\n        zero: match[5],\n        width: match[6],\n        comma: match[7],\n        precision: match[8] && match[8].slice(1),\n        trim: match[9],\n        type: match[10]\n    });\n}\n$4e7c2ad27f8b8986$export$2e2bcd8739ae039.prototype = $4e7c2ad27f8b8986$export$963aac351db36ed4.prototype; // instanceof\nfunction $4e7c2ad27f8b8986$export$963aac351db36ed4(specifier) {\n    this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === undefined ? undefined : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n$4e7c2ad27f8b8986$export$963aac351db36ed4.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n\n\nfunction $df30648ee9197e79$export$2e2bcd8739ae039(s) {\n    out: for(var n = s.length, i = 1, i0 = -1, i1; i < n; ++i)switch(s[i]){\n        case \".\":\n            i0 = i1 = i;\n            break;\n        case \"0\":\n            if (i0 === 0) i0 = i;\n            i1 = i;\n            break;\n        default:\n            if (!+s[i]) break out;\n            if (i0 > 0) i0 = 0;\n            break;\n    }\n    return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n\n\n\n\nvar $54258f7cd36fe54f$export$6863724d9a42263;\nfunction $54258f7cd36fe54f$export$2e2bcd8739ae039(x, p) {\n    var d = (0, $336606e4467c7c06$export$8f8e23dd27dc19f5)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1], i = exponent - ($54258f7cd36fe54f$export$6863724d9a42263 = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, $336606e4467c7c06$export$8f8e23dd27dc19f5)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n\n\n\nfunction $679e3c4c7287d755$export$2e2bcd8739ae039(x, p) {\n    var d = (0, $336606e4467c7c06$export$8f8e23dd27dc19f5)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1];\n    return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n\n\nvar $80f7b023ca9d43c7$export$2e2bcd8739ae039 = {\n    \"%\": function(x, p) {\n        return (x * 100).toFixed(p);\n    },\n    \"b\": function(x) {\n        return Math.round(x).toString(2);\n    },\n    \"c\": function(x) {\n        return x + \"\";\n    },\n    \"d\": (0, $336606e4467c7c06$export$2e2bcd8739ae039),\n    \"e\": function(x, p) {\n        return x.toExponential(p);\n    },\n    \"f\": function(x, p) {\n        return x.toFixed(p);\n    },\n    \"g\": function(x, p) {\n        return x.toPrecision(p);\n    },\n    \"o\": function(x) {\n        return Math.round(x).toString(8);\n    },\n    \"p\": function(x, p) {\n        return (0, $679e3c4c7287d755$export$2e2bcd8739ae039)(x * 100, p);\n    },\n    \"r\": (0, $679e3c4c7287d755$export$2e2bcd8739ae039),\n    \"s\": (0, $54258f7cd36fe54f$export$2e2bcd8739ae039),\n    \"X\": function(x) {\n        return Math.round(x).toString(16).toUpperCase();\n    },\n    \"x\": function(x) {\n        return Math.round(x).toString(16);\n    }\n};\n\n\n\nfunction $40245bd1e15a08bc$export$2e2bcd8739ae039(x) {\n    return x;\n}\n\n\nvar $c953dd2438486cb9$var$map = Array.prototype.map, $c953dd2438486cb9$var$prefixes = [\n    \"y\",\n    \"z\",\n    \"a\",\n    \"f\",\n    \"p\",\n    \"n\",\n    \"\\xb5\",\n    \"m\",\n    \"\",\n    \"k\",\n    \"M\",\n    \"G\",\n    \"T\",\n    \"P\",\n    \"E\",\n    \"Z\",\n    \"Y\"\n];\nfunction $c953dd2438486cb9$export$2e2bcd8739ae039(locale) {\n    var group = locale.grouping === undefined || locale.thousands === undefined ? (0, $40245bd1e15a08bc$export$2e2bcd8739ae039) : (0, $4886ae7df3b00c8d$export$2e2bcd8739ae039)($c953dd2438486cb9$var$map.call(locale.grouping, Number), locale.thousands + \"\"), currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\", currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\", decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\", numerals = locale.numerals === undefined ? (0, $40245bd1e15a08bc$export$2e2bcd8739ae039) : (0, $08e49d150cf0e40b$export$2e2bcd8739ae039)($c953dd2438486cb9$var$map.call(locale.numerals, String)), percent = locale.percent === undefined ? \"%\" : locale.percent + \"\", minus = locale.minus === undefined ? \"-\" : locale.minus + \"\", nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n    function newFormat(specifier) {\n        specifier = (0, $4e7c2ad27f8b8986$export$2e2bcd8739ae039)(specifier);\n        var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;\n        // The \"n\" type is an alias for \",g\".\n        if (type === \"n\") comma = true, type = \"g\";\n        else if (!(0, $80f7b023ca9d43c7$export$2e2bcd8739ae039)[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n        // If zero fill is specified, padding goes after sign and before digits.\n        if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\";\n        // Compute the prefix and suffix.\n        // For SI-prefix, the suffix is lazily computed.\n        var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\", suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n        // What format function should we use?\n        // Is this an integer type?\n        // Can this type generate exponential notation?\n        var formatType = (0, $80f7b023ca9d43c7$export$2e2bcd8739ae039)[type], maybeSuffix = /[defgprs%]/.test(type);\n        // Set the default precision if not specified,\n        // or clamp the specified precision to the supported range.\n        // For significant precision, it must be in [1, 21].\n        // For fixed precision, it must be in [0, 20].\n        precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n        function format(value) {\n            var valuePrefix = prefix, valueSuffix = suffix, i, n, c;\n            if (type === \"c\") {\n                valueSuffix = formatType(value) + valueSuffix;\n                value = \"\";\n            } else {\n                value = +value;\n                // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n                var valueNegative = value < 0 || 1 / value < 0;\n                // Perform the initial formatting.\n                value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n                // Trim insignificant zeros.\n                if (trim) value = (0, $df30648ee9197e79$export$2e2bcd8739ae039)(value);\n                // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n                if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n                // Compute the prefix and suffix.\n                valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n                valueSuffix = (type === \"s\" ? $c953dd2438486cb9$var$prefixes[8 + (0, $54258f7cd36fe54f$export$6863724d9a42263) / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n                // Break the formatted value into the integer “value” part that can be\n                // grouped, and fractional or exponential “suffix” part that is not.\n                if (maybeSuffix) {\n                    i = -1, n = value.length;\n                    while(++i < n)if (c = value.charCodeAt(i), 48 > c || c > 57) {\n                        valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n                        value = value.slice(0, i);\n                        break;\n                    }\n                }\n            }\n            // If the fill character is not \"0\", grouping is applied before padding.\n            if (comma && !zero) value = group(value, Infinity);\n            // Compute the padding.\n            var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n            // If the fill character is \"0\", grouping is applied after padding.\n            if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n            // Reconstruct the final output based on the desired alignment.\n            switch(align){\n                case \"<\":\n                    value = valuePrefix + value + valueSuffix + padding;\n                    break;\n                case \"=\":\n                    value = valuePrefix + padding + value + valueSuffix;\n                    break;\n                case \"^\":\n                    value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n                    break;\n                default:\n                    value = padding + valuePrefix + value + valueSuffix;\n                    break;\n            }\n            return numerals(value);\n        }\n        format.toString = function() {\n            return specifier + \"\";\n        };\n        return format;\n    }\n    function formatPrefix(specifier, value1) {\n        var f = newFormat((specifier = (0, $4e7c2ad27f8b8986$export$2e2bcd8739ae039)(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor((0, $66ddd43ef132fe4c$export$2e2bcd8739ae039)(value1) / 3))) * 3, k = Math.pow(10, -e), prefix = $c953dd2438486cb9$var$prefixes[8 + e / 3];\n        return function(value) {\n            return f(k * value) + prefix;\n        };\n    }\n    return {\n        format: newFormat,\n        formatPrefix: formatPrefix\n    };\n}\n\n\nvar $2ab610105ad986f3$var$locale;\nvar $2ab610105ad986f3$export$d9468344d3651243;\nvar $2ab610105ad986f3$export$8d85692a469dde6f;\n$2ab610105ad986f3$export$2e2bcd8739ae039({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [\n        3\n    ],\n    currency: [\n        \"$\",\n        \"\"\n    ],\n    minus: \"-\"\n});\nfunction $2ab610105ad986f3$export$2e2bcd8739ae039(definition) {\n    $2ab610105ad986f3$var$locale = (0, $c953dd2438486cb9$export$2e2bcd8739ae039)(definition);\n    $2ab610105ad986f3$export$d9468344d3651243 = $2ab610105ad986f3$var$locale.format;\n    $2ab610105ad986f3$export$8d85692a469dde6f = $2ab610105ad986f3$var$locale.formatPrefix;\n    return $2ab610105ad986f3$var$locale;\n}\n\n\n\nvar $99df88aa84de796a$export$f0297ce57faf7d71;\n(function(DataScopeId1) {\n    DataScopeId1[DataScopeId1[\"AllData\"] = 0] = \"AllData\";\n    DataScopeId1[DataScopeId1[\"SelectedData\"] = 1] = \"SelectedData\";\n    DataScopeId1[DataScopeId1[\"FilteredData\"] = 2] = \"FilteredData\";\n})($99df88aa84de796a$export$f0297ce57faf7d71 || ($99df88aa84de796a$export$f0297ce57faf7d71 = {}));\nconst $99df88aa84de796a$var$shortFormat = (0, $2ab610105ad986f3$export$d9468344d3651243)(\".2~s\");\nfunction $99df88aa84de796a$var$short(n) {\n    return n === -1 ? \"--\" : n ? n < 1000 ? n.toString() : $99df88aa84de796a$var$shortFormat(n) : \"0\";\n}\nfunction $99df88aa84de796a$export$3fb74a6ae4f1171d(props) {\n    const dataCount = Object.assign({\n        all: -1,\n        filtered: -1,\n        selected: -1\n    }, props.dataCount);\n    return props.compact ? (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $a1d9524814b1e23a$exports).classList(\"sanddance-datascope\", \"compact\"),\n        onClick: props.onCompactClick\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($99df88aa84de796a$var$Compact, Object.assign({}, props, {\n        dataScopeId: $99df88aa84de796a$export$f0297ce57faf7d71.AllData,\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanAll,\n        count: dataCount.all\n    })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($99df88aa84de796a$var$Compact, Object.assign({}, props, {\n        dataScopeId: $99df88aa84de796a$export$f0297ce57faf7d71.FilteredData,\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanFilter,\n        count: dataCount.filtered\n    })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($99df88aa84de796a$var$Compact, Object.assign({}, props, {\n        dataScopeId: $99df88aa84de796a$export$f0297ce57faf7d71.SelectedData,\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanSelection,\n        count: dataCount.selected\n    }))) : (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $a1d9524814b1e23a$exports).classList(\"sanddance-datascope\", \"extended\", props.active && \"active\")\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, props.dataSet), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"datascope-buttons\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($99df88aa84de796a$var$DataScopeButton, Object.assign({}, props, {\n        dataScopeId: $99df88aa84de796a$export$f0297ce57faf7d71.AllData,\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanAll,\n        count: dataCount.all\n    })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($99df88aa84de796a$var$DataScopeButton, Object.assign({}, props, {\n        dataScopeId: $99df88aa84de796a$export$f0297ce57faf7d71.FilteredData,\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanFilter,\n        count: dataCount.filtered\n    })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($99df88aa84de796a$var$DataScopeButton, Object.assign({}, props, {\n        dataScopeId: $99df88aa84de796a$export$f0297ce57faf7d71.SelectedData,\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanSelection,\n        count: dataCount.selected\n    })))));\n}\nfunction $99df88aa84de796a$var$Compact(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: props.text,\n        onClick: ()=>{\n            props.onDataScopeClick(props.dataScopeId);\n        }\n    }, $99df88aa84de796a$var$short(props.count));\n}\nfunction $99df88aa84de796a$var$DataScopeButton(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $2a5fa1321d305a42$export$353f5b6fc5456de1), {\n        themePalette: props.themePalette,\n        className: (0, $a1d9524814b1e23a$exports).classList(\"datascope-button\", props.selectedDataScope === props.dataScopeId && \"selected\"),\n        disabled: props.disabled,\n        text: props.text,\n        onClick: ()=>{\n            props.onDataScopeClick(props.dataScopeId);\n        },\n        onRenderText: ()=>{\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                title: props.count > 0 ? props.count.toString() : \"\"\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"label\", null, props.text), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, $99df88aa84de796a$var$short(props.count)));\n        },\n        onRenderIcon: ()=>null\n    });\n}\n\n\n\n\n\n\n\n\n\nfunction $4833a31f56c4b60e$export$fcc7818a78919c8c(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $a1d9524814b1e23a$exports).classList(\"scrollable-container\", props.className),\n        role: props.role\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"scrollable\"\n    }, props.children));\n}\n\n\nvar $a4811b1c86ed19fa$export$f3b7566ffe363e3b;\n(function(SideTabId1) {\n    SideTabId1[SideTabId1[\"ChartType\"] = 0] = \"ChartType\";\n    SideTabId1[SideTabId1[\"Data\"] = 1] = \"Data\";\n    SideTabId1[SideTabId1[\"Search\"] = 2] = \"Search\";\n    SideTabId1[SideTabId1[\"Color\"] = 3] = \"Color\";\n    SideTabId1[SideTabId1[\"Snapshots\"] = 4] = \"Snapshots\";\n    SideTabId1[SideTabId1[\"History\"] = 5] = \"History\";\n    SideTabId1[SideTabId1[\"Settings\"] = 6] = \"Settings\";\n    SideTabId1[SideTabId1[\"Pin\"] = 7] = \"Pin\";\n    SideTabId1[SideTabId1[\"Collapse\"] = 8] = \"Collapse\";\n})($a4811b1c86ed19fa$export$f3b7566ffe363e3b || ($a4811b1c86ed19fa$export$f3b7566ffe363e3b = {}));\n\n\n\n\nfunction $31fcbd44e38b82f5$export$1ba59dacbcbf90fe(props) {\n    const sidebuttons = [\n        {\n            sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).ChartType,\n            iconName: \"BIDashboard\",\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelChart\n        },\n        {\n            sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Color,\n            iconName: \"Color\",\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColor\n        },\n        {\n            sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data,\n            iconName: \"Table\",\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelDataBrowser\n        },\n        {\n            sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Search,\n            iconName: \"Search\",\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSearch\n        },\n        {\n            sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Snapshots,\n            iconName: \"Camera\",\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelSnapshots\n        },\n        {\n            sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).History,\n            iconName: \"History\",\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistory\n        },\n        {\n            sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Settings,\n            iconName: \"Settings\",\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelChartSettings\n        }\n    ];\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $a1d9524814b1e23a$exports).classList(\"sanddance-sidebar\", \"calculator\", props.pinned && \"pinned\", props.closed && \"closed\")\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sidebar-content\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $99df88aa84de796a$export$3fb74a6ae4f1171d), Object.assign({}, props.dataScopeProps)), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"vbuttons\",\n        role: \"tablist\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sidebar-dialogs\"\n    }, sidebuttons.map((sidebutton, i)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($31fcbd44e38b82f5$export$a8fc19311f33df91, Object.assign({\n            key: i\n        }, props, sidebutton, {\n            themePalette: props.themePalette\n        })))), !props.hideSidebarControls && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sidebar-controls\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($31fcbd44e38b82f5$export$a8fc19311f33df91, Object.assign({}, props, {\n        role: \"button\",\n        sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Pin,\n        iconName: props.pinned ? \"Pinned\" : \"Pin\",\n        title: props.pinned ? (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonToolbarFloat : (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonToolbarDock\n    })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement($31fcbd44e38b82f5$export$a8fc19311f33df91, Object.assign({}, props, {\n        role: \"button\",\n        sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Collapse,\n        iconName: props.closed ? \"DoubleChevronRight12\" : \"DoubleChevronLeft12\",\n        title: props.closed ? (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonToolbarShow : (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonToolbarHide\n    })))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $4833a31f56c4b60e$export$fcc7818a78919c8c), {\n        role: \"tabpanel\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sidetab\"\n    }, props.children)), props.calculating && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"calculating\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Spinner, {\n        size: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.SpinnerSize.large\n    }))));\n}\nfunction $31fcbd44e38b82f5$export$a8fc19311f33df91(props) {\n    const selected = !props.closed && props.selectedSideTab === props.sideTabId;\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $a1d9524814b1e23a$exports).classList(\"vbutton\", selected && \"selected\")\n    }, props.badgeText && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"count\"\n    }, props.badgeText), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $adfb025456b8f57f$export$c25acd513dcc8062), {\n        role: props.role || \"tab\",\n        \"aria-selected\": selected,\n        themePalette: props.themePalette,\n        className: \"vbutton\",\n        iconName: props.iconName,\n        title: props.title,\n        onClick: ()=>{\n            props.onSideTabClick(props.sideTabId);\n        }\n    }));\n}\n\n\n\nconst $8008cea877f23d13$export$26e7026630023d76 = (props)=>{\n    const { theme: theme  } = props;\n    if (!theme) throw new Error(\"Theme is undefined or null.\");\n    const { palette: palette , semanticColors: semanticColors  } = theme;\n    const BUTTON_ICON_CLASSNAME = \".ms-Button-icon\";\n    return {\n        root: [\n            Object.assign({}, (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.getFocusStyle(theme, {\n                inset: 2\n            })),\n            {\n                backgroundColor: palette.white\n            }\n        ],\n        rootHovered: {\n            backgroundColor: palette.neutralLighter,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDarkAlt\n                }\n            }\n        },\n        rootPressed: {\n            backgroundColor: palette.neutralLight,\n            color: palette.neutralDark,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootChecked: {\n            backgroundColor: palette.neutralLight,\n            color: palette.neutralDark,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootCheckedHovered: {\n            backgroundColor: palette.neutralQuaternaryAlt,\n            color: palette.neutralDark\n        },\n        rootExpanded: {\n            color: palette.neutralDark,\n            backgroundColor: palette.neutralLight,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootExpandedHovered: {\n            background: palette.neutralQuaternaryAlt\n        },\n        rootDisabled: {\n            backgroundColor: palette.white,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: semanticColors.disabledBodySubtext\n                }\n            }\n        },\n        splitButtonMenuButton: {\n            backgroundColor: palette.white,\n            color: palette.neutralSecondary,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: palette.neutralLighter,\n                    selectors: {\n                        [BUTTON_ICON_CLASSNAME]: {\n                            color: palette.neutralPrimary\n                        }\n                    }\n                },\n                \":active\": {\n                    backgroundColor: palette.neutralLight,\n                    selectors: {\n                        [BUTTON_ICON_CLASSNAME]: {\n                            color: palette.neutralPrimary\n                        }\n                    }\n                }\n            }\n        },\n        splitButtonMenuButtonDisabled: {\n            backgroundColor: palette.white\n        },\n        icon: {\n            color: palette.themePrimary\n        }\n    };\n};\n\n\n\nconst $1b1934775c689ff2$var$s = `\n ......\n.......\n...\n......\n ......\n    ...\n.......\n......\n`;\nconst $1b1934775c689ff2$var$d = $1b1934775c689ff2$var$s.split(\"\\n\").map((row, irow)=>row.length ? row.split(\"\").map((char, icol)=>char.trim() ? `M${2 * icol + 1} ${2 * (irow - 1) + 1} v1 h1 v-1 Z` : \"\").join(\" \") : \"\").join(\"\\n\");\nfunction $1b1934775c689ff2$export$e6ff31bff12b7ff4() {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 16 16\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"path\", {\n        d: $1b1934775c689ff2$var$d\n    }));\n}\n\n\n\n\n\nfunction $f336667543fc9dad$export$1ca1e38143dcc152(props) {\n    const zeroResults = props.selectionState.selectedData && props.selectionState.selectedData.length === 0;\n    const disabled = !props.loaded;\n    const items = [\n        {\n            key: \"undo\",\n            name: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonUndo,\n            iconProps: {\n                iconName: \"Undo\"\n            },\n            disabled: disabled || props.historyItems.length === 0 || props.historyIndex === 0,\n            onClick: props.undo\n        },\n        {\n            key: \"redo\",\n            name: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonRedo,\n            iconProps: {\n                iconName: \"Redo\"\n            },\n            disabled: disabled || props.historyItems.length <= 1 || props.historyIndex >= props.historyItems.length - 1,\n            onClick: props.redo\n        },\n        {\n            key: \"deselect\",\n            name: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonDeselect,\n            iconProps: {\n                iconName: \"Cancel\"\n            },\n            disabled: disabled || !props.selectionSearch,\n            onClick: props.doDeselect\n        },\n        {\n            key: \"isolate\",\n            name: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonIsolate,\n            iconProps: {\n                iconName: \"Filter\"\n            },\n            disabled: disabled || !props.selectionSearch || zeroResults,\n            onClick: ()=>props.doFilter(props.selectionSearch, (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryFilterIsolate)\n        },\n        {\n            key: \"exclude\",\n            name: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonExclude,\n            iconProps: {\n                iconName: \"ClearFilter\"\n            },\n            disabled: disabled || !props.selectionSearch || zeroResults,\n            onClick: ()=>props.doFilter((0, $3b509b9541e52a8f$exports).searchExpression.invert(props.selectionSearch), (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryFilterIExclude)\n        },\n        {\n            key: \"reset\",\n            name: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonReset,\n            iconProps: {\n                iconName: \"RemoveFilter\"\n            },\n            disabled: disabled || !props.filter,\n            onClick: ()=>props.doUnfilter((0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryFilterClear)\n        }\n    ];\n    if (props.buttons) items.push.apply(items, props.buttons);\n    if (props.collapseLabels) items.forEach((item)=>item.iconOnly = true);\n    const farItems = [\n        {\n            key: \"previous-snapshot\",\n            iconProps: {\n                iconName: \"Previous\"\n            },\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonPrevSnapshot,\n            onClick: props.onSnapshotPreviousClick,\n            disabled: props.snapshots.length < 2\n        },\n        {\n            key: \"snapshot\",\n            iconProps: {\n                iconName: \"Camera\"\n            },\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonCreateSnapshot,\n            onClick: props.onSnapshotClick,\n            disabled: !props.loaded\n        },\n        {\n            key: \"next-snapshot\",\n            iconProps: {\n                iconName: \"Next\"\n            },\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonNextSnapshot,\n            onClick: props.onSnapshotNextClick,\n            disabled: props.snapshots.length < 2\n        },\n        {\n            key: \"view\",\n            iconProps: {\n                iconName: props.view === \"2d\" ? \"CubeShape\" : \"Page\"\n            },\n            title: props.view === \"2d\" ? (0, $0db66385c00a3f15$export$21c51bc433c16634).labelViewType3d : (0, $0db66385c00a3f15$export$21c51bc433c16634).labelViewType2d,\n            onClick: props.onViewClick,\n            disabled: !props.loaded\n        },\n        {\n            key: \"home\",\n            iconProps: {\n                iconName: \"PicturePosition\"\n            },\n            title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonCameraHome,\n            onClick: props.onHomeClick,\n            disabled: !props.loaded\n        }\n    ];\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explorer-topbar\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"logo\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $1b1934775c689ff2$export$e6ff31bff12b7ff4), null), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"a\", {\n        href: props.logoClickUrl || \"/\",\n        target: props.logoClickTarget || \"_blank\"\n    }, (0, $0db66385c00a3f15$export$21c51bc433c16634).appName)), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explorer-commandbar\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Customizer, {\n        scopedSettings: {\n            CommandBarButton: {\n                styles: (buttonProps)=>{\n                    buttonProps.theme.palette = props.themePalette;\n                    return (0, $8008cea877f23d13$export$26e7026630023d76)(buttonProps);\n                }\n            }\n        }\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.CommandBar, {\n        items: items,\n        farItems: farItems,\n        styles: {\n            root: {\n                backgroundColor: \"transparent\",\n                height: \"unset\",\n                paddingLeft: 0,\n                paddingRight: 0\n            }\n        }\n    }))));\n}\n\n\n\nconst $3d862e0e83f42a97$export$9d26f8f2be82424f = (dataFile)=>new Promise((resolve, reject)=>{\n        const vega = (0, $3b509b9541e52a8f$exports).VegaDeckGl.base.vega;\n        const loader = vega.loader();\n        function handleRawText(text) {\n            let data;\n            try {\n                data = vega.read(text, {\n                    type: dataFile.type,\n                    parse: {}\n                });\n            } catch (e) {\n                reject(e);\n            }\n            if (data) $3d862e0e83f42a97$export$c084150d12efae43(data, dataFile.type).then((dc)=>{\n                if (dataFile.snapshotsUrl) fetch(dataFile.snapshotsUrl).then((response)=>response.json()).then((snapshots)=>{\n                    dc.snapshots = snapshots;\n                    resolve(dc);\n                }).catch(reject);\n                else if (dataFile.snapshots) {\n                    dc.snapshots = dataFile.snapshots;\n                    resolve(dc);\n                } else resolve(dc);\n            }).catch(reject);\n        }\n        if (dataFile.dataUrl) loader.load(dataFile.dataUrl).then(handleRawText).catch(reject);\n        else if (dataFile.rawText) handleRawText(dataFile.rawText);\n        else reject(\"dataFile object must have either dataUrl or rawText property set.\");\n    });\nconst $3d862e0e83f42a97$export$c084150d12efae43 = (data, type)=>new Promise((resolve, reject)=>{\n        const parse = type === \"csv\" || type === \"tsv\";\n        if (parse) //convert empty strings to null so that vega.inferType will get dates\n        data.forEach((row)=>{\n            for(let column in row)if (row[column] === \"\") row[column] = null;\n        });\n        const columns = (0, $3b509b9541e52a8f$exports).util.getColumnsFromData((0, $3b509b9541e52a8f$exports).VegaDeckGl.base.vega.inferTypes, data).filter((c)=>c.name && c.name.trim()).sort((a, b)=>a.name.localeCompare(b.name));\n        if (parse) {\n            const booleanColumns = columns.filter((c)=>c.type === \"boolean\");\n            const dateColumns = columns.filter((c)=>c.type === \"date\");\n            const numericColumns = columns.filter((c)=>c.type === \"integer\" || c.type === \"number\");\n            data.forEach((obj)=>{\n                booleanColumns.forEach((c)=>{\n                    obj[c.name] = (\"\" + obj[c.name]).toLowerCase() === \"true\";\n                });\n                dateColumns.forEach((c)=>{\n                    const input = obj[c.name];\n                    if (input !== null) {\n                        const d = new Date(input);\n                        d.input = input;\n                        obj[c.name] = d;\n                    }\n                });\n                numericColumns.forEach((c)=>{\n                    const n = parseFloat(obj[c.name]);\n                    obj[c.name] = isNaN(n) ? null : n;\n                });\n            });\n        }\n        resolve({\n            data: data,\n            columns: columns\n        });\n    });\n\n\n\nvar $b61671d8f61aadb4$var$util = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util;\nconst $b61671d8f61aadb4$export$3465a0e7b289ab72 = {};\n$b61671d8f61aadb4$export$3465a0e7b289ab72[\"\"] = {\n    themePrimary: \"#0078d4\",\n    themeLighterAlt: \"#eff6fc\",\n    themeLighter: \"#deecf9\",\n    themeLight: \"#c7e0f4\",\n    themeTertiary: \"#71afe5\",\n    themeSecondary: \"#2b88d8\",\n    themeDarkAlt: \"#106ebe\",\n    themeDark: \"#005a9e\",\n    themeDarker: \"#004578\",\n    neutralLighterAlt: \"#f8f8f8\",\n    neutralLighter: \"#f4f4f4\",\n    neutralLight: \"#eaeaea\",\n    neutralQuaternaryAlt: \"#dadada\",\n    neutralQuaternary: \"#d0d0d0\",\n    neutralTertiaryAlt: \"#c8c8c8\",\n    neutralTertiary: \"#c2c2c2\",\n    neutralSecondary: \"#858585\",\n    neutralPrimaryAlt: \"#4b4b4b\",\n    neutralPrimary: \"#333333\",\n    neutralDark: \"#272727\",\n    black: \"#1d1d1d\",\n    white: \"#ffffff\"\n};\n$b61671d8f61aadb4$export$3465a0e7b289ab72[\"dark-theme\"] = {\n    themePrimary: \"#00b4f0\",\n    themeLighterAlt: \"#00070a\",\n    themeLighter: \"#001d26\",\n    themeLight: \"#003648\",\n    themeTertiary: \"#006c90\",\n    themeSecondary: \"#009ed3\",\n    themeDarkAlt: \"#18bbf1\",\n    themeDark: \"#3ac5f3\",\n    themeDarker: \"#6cd4f6\",\n    neutralLighterAlt: \"#0b0b0b\",\n    neutralLighter: \"#151515\",\n    neutralLight: \"#252525\",\n    neutralQuaternaryAlt: \"#2f2f2f\",\n    neutralQuaternary: \"#373737\",\n    neutralTertiaryAlt: \"#595959\",\n    neutralTertiary: \"#929292\",\n    neutralSecondary: \"#a7a7a7\",\n    neutralPrimaryAlt: \"#b4b4b4\",\n    neutralPrimary: \"#cccccc\",\n    neutralDark: \"#d8d8d8\",\n    black: \"#f5f5f5\",\n    white: \"#000000\"\n};\nfunction $b61671d8f61aadb4$export$93a255849c3bdb97(themePalette) {\n    const c = $b61671d8f61aadb4$var$util.colorFromString(themePalette.themeSecondary);\n    c[3] = 256 / 3; // one-third opacity background\n    return {\n        axisLine: themePalette.black,\n        axisText: themePalette.black,\n        hoveredCube: themePalette.black,\n        clickableText: themePalette.themeDark,\n        clickableTextHighlight: $b61671d8f61aadb4$var$util.colorToString(c),\n        clickableTextHighlightAlphaCutoff: 0,\n        searchText: themePalette.neutralPrimary,\n        searchTextHighlight: themePalette.neutralPrimaryAlt\n    };\n}\n\n\nconst $8bfbb5c28cff0e2c$export$a5975749f0374264 = \"Segoe UI, sans-serif\";\nconst $8bfbb5c28cff0e2c$export$fb736e4909afb3d7 = {\n    colors: (0, $b61671d8f61aadb4$export$93a255849c3bdb97)((0, $b61671d8f61aadb4$export$3465a0e7b289ab72)[\"\"]),\n    fontFamily: $8bfbb5c28cff0e2c$export$a5975749f0374264\n};\nconst $8bfbb5c28cff0e2c$export$7e33de69431bbb06 = 300;\n\n\n\n\n\n\n\nfunction $7cf7713fac799e39$export$535452b9416b5e17(selected, scheme) {\n    return {\n        key: scheme,\n        text: scheme,\n        selected: selected === scheme,\n        scheme: scheme,\n        children: $7cf7713fac799e39$export$dc7e195cef98649[scheme]\n    };\n}\nconst $7cf7713fac799e39$export$dc7e195cef98649 = {};\n\n\nconst $4d291de0a4a37fc7$var$p8 = `${12.5}%`;\nconst $4d291de0a4a37fc7$var$p9 = `${100 / 9}%`;\nconst $4d291de0a4a37fc7$var$p10 = `${10}%`;\nconst $4d291de0a4a37fc7$var$p12 = `${100 / 12}%`;\nconst $4d291de0a4a37fc7$var$p20 = `${5}%`;\nlet $4d291de0a4a37fc7$var$loaded = false;\nfunction $4d291de0a4a37fc7$var$load() {\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"accent\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7fc97f\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(127, 201, 127)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#beaed4\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(190, 174, 212)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdc086\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(253, 192, 134)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffff99\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(255, 255, 153)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#386cb0\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(56, 108, 176)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f0027f\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(240, 2, 127)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bf5b17\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(191, 91, 23)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#666666\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(102, 102, 102)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"category10\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#1f77b4\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(31, 119, 180)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff7f0e\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(255, 127, 14)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#2ca02c\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(44, 160, 44)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d62728\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(214, 39, 40)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9467bd\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(148, 103, 189)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8c564b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(140, 86, 75)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e377c2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(227, 119, 194)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7f7f7f\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(127, 127, 127)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bcbd22\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(188, 189, 34)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#17becf\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(23, 190, 207)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"category20\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#1f77b4\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(31, 119, 180)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#aec7e8\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(174, 199, 232)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff7f0e\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(255, 127, 14)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffbb78\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(255, 187, 120)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#2ca02c\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(44, 160, 44)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#98df8a\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(152, 223, 138)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d62728\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(214, 39, 40)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff9896\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(255, 152, 150)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9467bd\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(148, 103, 189)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c5b0d5\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(197, 176, 213)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8c564b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(140, 86, 75)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c49c94\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(196, 156, 148)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e377c2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(227, 119, 194)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f7b6d2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(247, 182, 210)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7f7f7f\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(127, 127, 127)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c7c7c7\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(199, 199, 199)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bcbd22\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(188, 189, 34)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#dbdb8d\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(219, 219, 141)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#17becf\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(23, 190, 207)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9edae5\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(158, 218, 229)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"category20b\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#393b79\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(57, 59, 121)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#5254a3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(82, 84, 163)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#6b6ecf\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(107, 110, 207)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9c9ede\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(156, 158, 222)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#637939\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(99, 121, 57)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8ca252\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(140, 162, 82)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b5cf6b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(181, 207, 107)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#cedb9c\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(206, 219, 156)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8c6d31\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(140, 109, 49)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bd9e39\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(189, 158, 57)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e7ba52\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(231, 186, 82)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e7cb94\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(231, 203, 148)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#843c39\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(132, 60, 57)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ad494a\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(173, 73, 74)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d6616b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(214, 97, 107)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e7969c\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(231, 150, 156)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7b4173\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(123, 65, 115)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a55194\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(165, 81, 148)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ce6dbd\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(206, 109, 189)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#de9ed6\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(222, 158, 214)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"category20c\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#3182bd\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(49, 130, 189)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#6baed6\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(107, 174, 214)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9ecae1\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(158, 202, 225)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c6dbef\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(198, 219, 239)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e6550d\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(230, 85, 13)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fd8d3c\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(253, 141, 60)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdae6b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(253, 174, 107)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdd0a2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(253, 208, 162)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#31a354\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(49, 163, 84)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#74c476\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(116, 196, 118)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a1d99b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(161, 217, 155)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c7e9c0\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(199, 233, 192)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#756bb1\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(117, 107, 177)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9e9ac8\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(158, 154, 200)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bcbddc\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(188, 189, 220)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#dadaeb\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(218, 218, 235)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#636363\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(99, 99, 99)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#969696\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(150, 150, 150)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bdbdbd\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(189, 189, 189)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d9d9d9\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(217, 217, 217)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"dark2\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#1b9e77\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(27, 158, 119)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d95f02\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(217, 95, 2)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7570b3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(117, 112, 179)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e7298a\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(231, 41, 138)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#66a61e\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(102, 166, 30)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e6ab02\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(230, 171, 2)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a6761d\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(166, 118, 29)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#666666\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(102, 102, 102)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"paired\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a6cee3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(166, 206, 227)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#1f78b4\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(31, 120, 180)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b2df8a\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(178, 223, 138)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#33a02c\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(51, 160, 44)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fb9a99\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(251, 154, 153)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e31a1c\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(227, 26, 28)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdbf6f\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(253, 191, 111)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff7f00\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(255, 127, 0)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#cab2d6\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(202, 178, 214)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#6a3d9a\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(106, 61, 154)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffff99\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(255, 255, 153)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b15928\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(177, 89, 40)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"pastel1\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fbb4ae\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(251, 180, 174)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b3cde3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(179, 205, 227)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ccebc5\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(204, 235, 197)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#decbe4\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(222, 203, 228)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fed9a6\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(254, 217, 166)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffffcc\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(255, 255, 204)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e5d8bd\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(229, 216, 189)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fddaec\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(253, 218, 236)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f2f2f2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(242, 242, 242)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"pastel2\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b3e2cd\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(179, 226, 205)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdcdac\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(253, 205, 172)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#cbd5e8\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(203, 213, 232)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f4cae4\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(244, 202, 228)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e6f5c9\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(230, 245, 201)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fff2ae\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(255, 242, 174)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f1e2cc\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(241, 226, 204)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#cccccc\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(204, 204, 204)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"set1\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e41a1c\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(228, 26, 28)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#377eb8\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(55, 126, 184)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#4daf4a\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(77, 175, 74)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#984ea3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(152, 78, 163)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff7f00\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(255, 127, 0)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffff33\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(255, 255, 51)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a65628\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(166, 86, 40)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f781bf\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(247, 129, 191)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#999999\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p9,\n            background: \"rgb(153, 153, 153)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"set2\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#66c2a5\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(102, 194, 165)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fc8d62\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(252, 141, 98)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8da0cb\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(141, 160, 203)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e78ac3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(231, 138, 195)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a6d854\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(166, 216, 84)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffd92f\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(255, 217, 47)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e5c494\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(229, 196, 148)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b3b3b3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p8,\n            background: \"rgb(179, 179, 179)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"set3\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8dd3c7\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(141, 211, 199)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffffb3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(255, 255, 179)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bebada\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(190, 186, 218)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fb8072\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(251, 128, 114)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#80b1d3\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(128, 177, 211)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdb462\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(253, 180, 98)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b3de69\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(179, 222, 105)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fccde5\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(252, 205, 229)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d9d9d9\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(217, 217, 217)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bc80bd\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(188, 128, 189)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ccebc5\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(204, 235, 197)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffed6f\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p12,\n            background: \"rgb(255, 237, 111)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"tableau10\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#4c78a8\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(76, 120, 168)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f58518\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(245, 133, 24)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e45756\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(228, 87, 86)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#72b7b2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(114, 183, 178)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#54a24b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(84, 162, 75)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#eeca3b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(238, 202, 59)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b279a2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(178, 121, 162)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff9da6\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(255, 157, 166)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9d755d\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(157, 117, 93)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bab0ac\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p10,\n            background: \"rgb(186, 176, 172)\"\n        }\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"tableau20\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#4c78a8\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(76, 120, 168)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9ecae9\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(158, 202, 233)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f58518\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(245, 133, 24)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffbf79\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(255, 191, 121)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#54a24b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(84, 162, 75)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#88d27a\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(136, 210, 122)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b79a20\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(183, 154, 32)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f2cf5b\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(242, 207, 91)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#439894\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(67, 152, 148)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#83bcb6\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(131, 188, 182)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e45756\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(228, 87, 86)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff9d98\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(255, 157, 152)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#79706e\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(121, 112, 110)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bab0ac\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(186, 176, 172)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d67195\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(214, 113, 149)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fcbfd2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(252, 191, 210)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b279a2\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(178, 121, 162)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d6a5c9\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(214, 165, 201)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9e765f\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(158, 118, 95)\"\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d8b5a5\",\n        style: {\n            width: $4d291de0a4a37fc7$var$p20,\n            background: \"rgb(216, 181, 165)\"\n        }\n    }));\n    $4d291de0a4a37fc7$var$loaded = true;\n}\nfunction $4d291de0a4a37fc7$export$f3a499247c9822d1(selected) {\n    if (!$4d291de0a4a37fc7$var$loaded) $4d291de0a4a37fc7$var$load();\n    return [\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"accent\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"category10\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"category20\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"category20b\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"category20c\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"dark2\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"paired\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"pastel1\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"pastel2\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"set1\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"set2\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"set3\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"tableau10\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"tableau20\")\n    ];\n}\n\n\n\n\nlet $fb44b4ac1e5f02bf$var$loaded = false;\nfunction $fb44b4ac1e5f02bf$var$load() {\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"blueorange\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-blueorange\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(5, 48, 97)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(34, 101, 163)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(75, 148, 196)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(143, 194, 221)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(205, 227, 238)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(242, 240, 235)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(253, 221, 179)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(248, 182, 100)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(221, 132, 31)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(178, 90, 9)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 59, 8)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-blueorange)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"brownbluegreen\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-brownbluegreen\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(84, 48, 5)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(139, 84, 15)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(188, 132, 53)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(222, 190, 123)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(242, 228, 192)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(238, 241, 234)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(195, 231, 226)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(127, 201, 191)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(57, 152, 143)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(10, 103, 95)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 60, 48)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-brownbluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"purplegreen\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplegreen\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(64, 0, 75)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(115, 47, 128)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(154, 109, 170)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(193, 164, 205)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(228, 210, 230)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(239, 240, 239)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(214, 238, 209)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(162, 215, 158)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(92, 173, 101)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(33, 120, 57)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"pinkyellowgreen\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-pinkyellowgreen\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(142, 1, 82)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(192, 38, 126)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(221, 114, 173)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(240, 179, 214)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(250, 221, 237)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(245, 243, 239)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(225, 242, 202)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(182, 222, 135)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(128, 187, 71)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(79, 145, 37)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(39, 100, 25)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-pinkyellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"purpleorange\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purpleorange\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(45, 0, 75)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(85, 45, 132)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(129, 112, 172)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(176, 170, 208)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(215, 215, 233)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(243, 238, 234)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(253, 221, 179)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(248, 182, 100)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(221, 132, 31)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(178, 90, 9)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 59, 8)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purpleorange)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"redblue\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redblue\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(172, 32, 47)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 96, 80)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(241, 163, 133)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(251, 215, 196)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(242, 239, 238)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(205, 227, 238)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(143, 194, 221)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(75, 148, 196)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(34, 101, 163)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(5, 48, 97)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"redgrey\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redgrey\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(172, 32, 47)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 96, 80)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(241, 163, 133)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(252, 216, 197)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 244, 241)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(223, 223, 223)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(184, 184, 184)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(134, 134, 134)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(78, 78, 78)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(26, 26, 26)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redgrey)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"redyellowblue\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redyellowblue\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(165, 0, 38)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(212, 50, 44)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(241, 110, 67)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 100)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 144)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 248, 193)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(220, 241, 236)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(171, 214, 232)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(117, 171, 208)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(74, 116, 180)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(49, 54, 149)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redyellowblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"redyellowgreen\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redyellowgreen\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(165, 0, 38)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(212, 50, 44)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(241, 110, 67)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 99)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 141)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(249, 247, 174)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(215, 238, 142)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(164, 216, 110)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(100, 188, 97)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(34, 150, 79)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 104, 55)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redyellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"spectral\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-spectral\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(158, 1, 66)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(209, 60, 75)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(240, 112, 74)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 99)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 141)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 248, 176)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(224, 243, 161)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(169, 221, 162)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(105, 189, 169)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(66, 136, 181)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(94, 79, 162)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-spectral)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    $fb44b4ac1e5f02bf$var$loaded = true;\n}\nfunction $fb44b4ac1e5f02bf$export$ab7b13a7cc99f3af(selected) {\n    if (!$fb44b4ac1e5f02bf$var$loaded) $fb44b4ac1e5f02bf$var$load();\n    return [\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"blueorange\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"brownbluegreen\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"purplegreen\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"pinkyellowgreen\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"purpleorange\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"redblue\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"redgrey\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"redyellowblue\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"redyellowgreen\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"spectral\")\n    ];\n}\n\n\n\n\n\n\nlet $2f535d00511be096$var$loaded = false;\nfunction $2f535d00511be096$var$load() {\n    (0, $3b509b9541e52a8f$exports).colorSchemes.filter((cs)=>cs.colors.length === 2).map((binaryScheme, i)=>{\n        (0, $7cf7713fac799e39$export$dc7e195cef98649)[binaryScheme.scheme] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n            className: \"swatch\"\n        }, binaryScheme.colors.map((color, j)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                key: j,\n                title: color,\n                style: {\n                    width: \"50%\",\n                    backgroundColor: color\n                }\n            })));\n    });\n    $2f535d00511be096$var$loaded = true;\n}\nfunction $2f535d00511be096$export$d1699a1bbdf17835(selected) {\n    if (!$2f535d00511be096$var$loaded) $2f535d00511be096$var$load();\n    return (0, $3b509b9541e52a8f$exports).colorSchemes.filter((cs)=>cs.colors.length === 2).map((binaryScheme, i)=>(0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, binaryScheme.scheme));\n}\n\n\n\n\n\n\nlet $0876d32c36a80de2$var$loaded = false;\nfunction $0876d32c36a80de2$var$load() {\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"viridis\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-viridis\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#440154\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#482475\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#414487\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#355f8d\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#2a788e\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#21918c\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#22a884\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#44bf70\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#7ad151\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#bddf26\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fde725\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-viridis)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"inferno\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-inferno\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#000004\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#160b39\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#420a68\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#6a176e\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#932667\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#bc3754\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#dd513a\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f37819\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fca50a\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#f6d746\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fcffa4\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-inferno)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"magma\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-magma\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#000004\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#140e36\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#3b0f70\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#641a80\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#8c2981\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#b73779\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#de4968\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f7705c\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fe9f6d\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#fecf92\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fcfdbf\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-magma)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"plasma\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-plasma\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#0d0887\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#41049d\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#6a00a8\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#8f0da4\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#b12a90\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#cc4778\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#e16462\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f2844b\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fca636\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#fcce25\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#f0f921\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-plasma)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"bluegreen\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-bluegreen\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 253)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(232, 246, 249)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 239, 237)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(183, 228, 218)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(143, 211, 193)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(104, 194, 163)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(73, 177, 127)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 153, 89)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 127, 60)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 100, 41)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-bluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"bluepurple\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-bluepurple\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 253)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(228, 238, 245)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(204, 221, 236)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(178, 202, 225)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(156, 179, 213)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(143, 149, 198)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(140, 116, 181)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(137, 82, 165)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(133, 45, 143)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(115, 15, 113)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(77, 0, 75)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-bluepurple)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"greenblue\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-greenblue\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 240)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(229, 245, 223)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(211, 238, 206)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(189, 229, 191)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(158, 217, 187)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(123, 203, 196)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(88, 183, 205)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(57, 156, 198)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(29, 126, 183)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(11, 96, 161)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 64, 129)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greenblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"orangered\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-orangered\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 236)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 235, 207)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 220, 175)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(253, 202, 148)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(253, 176, 122)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 142, 93)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(241, 108, 73)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(224, 69, 48)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(200, 29, 19)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(167, 4, 3)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 0, 0)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-orangered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"purplebluegreen\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplebluegreen\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 251)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 231, 242)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(219, 216, 234)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(190, 201, 226)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(152, 185, 217)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(105, 168, 207)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(64, 150, 192)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(25, 135, 159)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(3, 120, 119)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(1, 99, 83)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(1, 70, 54)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplebluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"purpleblue\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purpleblue\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 251)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 234, 244)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(219, 218, 235)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(191, 201, 226)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(155, 185, 217)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(114, 168, 207)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(67, 148, 195)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(26, 125, 182)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(6, 103, 161)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(4, 82, 129)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(2, 56, 88)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purpleblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"purplered\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplered\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 244, 249)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(234, 227, 240)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(220, 201, 226)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(208, 170, 210)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(208, 138, 194)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(221, 99, 174)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(227, 56, 144)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(215, 28, 108)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(183, 11, 79)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(143, 2, 58)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"redpurple\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redpurple\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 243)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(253, 228, 225)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(252, 207, 204)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(251, 181, 188)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(249, 147, 176)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(243, 105, 163)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(224, 62, 152)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(192, 23, 136)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(153, 3, 124)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(112, 1, 116)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(73, 0, 106)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redpurple)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"yellowgreenblue\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-yellowgreenblue\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 217)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 249, 189)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 238, 179)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(169, 221, 183)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(115, 201, 189)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(69, 180, 194)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(40, 151, 191)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(32, 115, 178)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(35, 78, 160)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(28, 49, 133)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 29, 88)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yellowgreenblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"yellowgreen\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-yellowgreen\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 229)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(247, 252, 196)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(228, 244, 172)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(199, 232, 155)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(162, 216, 138)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(120, 197, 120)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(78, 175, 99)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 148, 78)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 121, 63)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 96, 52)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 69, 41)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"yelloworangebrown\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-yelloworangebrown\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 229)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(255, 248, 196)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(254, 234, 161)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(254, 214, 118)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 186, 74)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 153, 44)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(238, 121, 24)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(216, 91, 10)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(183, 67, 4)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(143, 50, 4)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(102, 37, 6)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yelloworangebrown)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"yelloworangered\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-yelloworangered\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 204)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(255, 240, 169)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(254, 224, 135)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(254, 201, 101)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 171, 75)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(253, 137, 60)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(250, 92, 46)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(236, 48, 35)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(211, 17, 33)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(175, 2, 37)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(128, 0, 38)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yelloworangered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    $0876d32c36a80de2$var$loaded = true;\n}\nfunction $0876d32c36a80de2$export$a4fd36c4882aa76e(selected) {\n    if (!$0876d32c36a80de2$var$loaded) $0876d32c36a80de2$var$load();\n    return [\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"viridis\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"inferno\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"magma\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"plasma\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"bluegreen\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"bluepurple\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"greenblue\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"orangered\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"purplebluegreen\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"purpleblue\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"purplered\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"redpurple\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"yellowgreenblue\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"yellowgreen\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"yelloworangebrown\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"yelloworangered\")\n    ];\n}\n\n\n\n\nlet $39078f876ce15481$var$loaded = false;\nfunction $39078f876ce15481$var$load() {\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"blues\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-blues\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 251, 255)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(227, 238, 249)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(207, 225, 242)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(181, 212, 233)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(147, 195, 223)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(109, 174, 213)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(75, 151, 201)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 126, 188)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(24, 100, 170)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(10, 74, 144)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 48, 107)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-blues)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"greens\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-greens\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 245)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(232, 246, 227)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(211, 238, 205)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(183, 226, 177)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(151, 212, 148)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(115, 195, 120)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(77, 175, 98)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 152, 79)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 127, 59)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 100, 41)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greens)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"greys\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-greys\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 255)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(242, 242, 242)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(226, 226, 226)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(206, 206, 206)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(180, 180, 180)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(151, 151, 151)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(122, 122, 122)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(95, 95, 95)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(64, 64, 64)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(30, 30, 30)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 0, 0)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greys)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"purples\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purples\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(252, 251, 253)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(241, 239, 246)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(226, 225, 239)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(206, 206, 229)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(182, 181, 216)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(158, 155, 201)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(135, 130, 188)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(115, 99, 172)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(97, 64, 155)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(80, 31, 140)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(63, 0, 125)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purples)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"reds\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-reds\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 245, 240)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 227, 214)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 201, 180)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 170, 142)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(252, 138, 107)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(249, 105, 76)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(239, 69, 51)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(217, 39, 35)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(187, 21, 26)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(151, 11, 19)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(103, 0, 13)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-reds)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $7cf7713fac799e39$export$dc7e195cef98649)[\"oranges\"] = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-oranges\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 245, 235)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 232, 211)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 216, 179)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(253, 194, 140)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(253, 167, 98)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 141, 61)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(242, 112, 29)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(226, 86, 9)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(196, 65, 3)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(159, 51, 3)\"\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 39, 4)\"\n    }))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-oranges)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    $39078f876ce15481$var$loaded = true;\n}\nfunction $39078f876ce15481$export$9b3c8b6a286fd957(selected) {\n    if (!$39078f876ce15481$var$loaded) $39078f876ce15481$var$load();\n    return [\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"blues\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"greens\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"greys\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"purples\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"reds\"),\n        (0, $7cf7713fac799e39$export$535452b9416b5e17)(selected, \"oranges\")\n    ];\n}\n\n\n\nconst $37d271b3645ead65$var$maxDistinctColors = 20;\nfunction $37d271b3645ead65$export$e2fbaa661ec19dbf(props) {\n    const { distinctValueCount: distinctValueCount  } = props.colorColumn.stats;\n    let isDual = distinctValueCount === 2;\n    const categoricalNumeric = distinctValueCount > 0 && distinctValueCount < $37d271b3645ead65$var$maxDistinctColors;\n    let isQualitative = false;\n    let isQuantitative = false;\n    switch(props.colorColumn.type){\n        case \"boolean\":\n        case \"string\":\n            isQualitative = true;\n            break;\n        case \"number\":\n            isQuantitative = true;\n            break;\n        case \"date\":\n        case \"integer\":\n            isQuantitative = true;\n            isQualitative = categoricalNumeric;\n    }\n    const selected = props.scheme;\n    const options = [];\n    function menu(name, opts) {\n        options.push({\n            key: name,\n            text: name,\n            itemType: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n        });\n        options.push.apply(options, opts);\n    }\n    isQualitative && menu((0, $0db66385c00a3f15$export$21c51bc433c16634).schemeCategorical, (0, $4d291de0a4a37fc7$export$f3a499247c9822d1)(selected));\n    isQuantitative && menu((0, $0db66385c00a3f15$export$21c51bc433c16634).schemeSequentialSingleHue, (0, $39078f876ce15481$export$9b3c8b6a286fd957)(selected));\n    isQuantitative && menu((0, $0db66385c00a3f15$export$21c51bc433c16634).schemeSequentialMultiHue, (0, $0876d32c36a80de2$export$a4fd36c4882aa76e)(selected));\n    isQuantitative && menu((0, $0db66385c00a3f15$export$21c51bc433c16634).schemeDiverging, (0, $fb44b4ac1e5f02bf$export$ab7b13a7cc99f3af)(selected));\n    isDual && menu((0, $0db66385c00a3f15$export$21c51bc433c16634).schemeDual, (0, $2f535d00511be096$export$d1699a1bbdf17835)(selected));\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-palette\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorFieldInfo(props.colorColumn.name, props.colorColumn.type, categoricalNumeric, distinctValueCount)\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n        collapseLabel: props.collapseLabel,\n        disabled: props.disabled,\n        dropdownWidth: 400,\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorScheme,\n        onRenderOption: (option)=>{\n            if (option.itemType === (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header) return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"span\", null, option.text);\n            else return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-scheme option\"\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"span\", {\n                className: \"name\"\n            }, option.scheme), option.children);\n        },\n        options: options,\n        onChange: (e, o)=>{\n            props.changeColorScheme(o.scheme);\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $a1d9524814b1e23a$exports).classList(\"sanddance-scheme\", props.disabled && \"disabled\")\n    }, props.scheme && (0, $7cf7713fac799e39$export$dc7e195cef98649)[props.scheme]));\n}\n\n\n\n\n\nfunction $0db948ac6e4b75cc$export$892596cec99bc70e(props) {\n    const colorColumn = props.dataContent.columns.filter((c)=>c.name === props.colorColumn)[0];\n    const disabledColorBin = !colorColumn || !colorColumn.quantitative || props.directColor;\n    const colorBin = props.colorBin || \"quantize\";\n    const dropdownRef = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createRef();\n    props.explorer.dialogFocusHandler.focus = ()=>{\n        var _a;\n        return (_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n    };\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-color-dialog\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColor\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $f3c9564b99b49be4$export$83b9e0badda50eeb), Object.assign({}, props, {\n        componentRef: dropdownRef,\n        collapseLabel: props.compactUI,\n        selectedColumnName: props.colorColumn,\n        specRole: props.specCapabilities && props.specCapabilities.roles.filter((r)=>r.role === \"color\")[0],\n        key: 0\n    })), colorColumn && colorColumn.isColorData && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorFieldIsColorData(colorColumn.name)\n        }\n    }), colorColumn && !colorColumn.isColorData && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $37d271b3645ead65$export$e2fbaa661ec19dbf), {\n        collapseLabel: props.compactUI,\n        scheme: props.scheme,\n        colorColumn: colorColumn,\n        changeColorScheme: (scheme)=>{\n            props.onColorSchemeChange(scheme);\n        },\n        disabled: props.disabled || props.directColor || colorColumn && colorColumn.isColorData\n    }), colorColumn && !colorColumn.isColorData && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $9c14fe62b8e7ad84$export$8210dfe1863c478), {\n        disabled: props.disabled || !colorColumn || props.directColor || colorColumn && colorColumn.isColorData,\n        signal: props.colorReverseSignal,\n        explorer: props.explorer,\n        onChange: props.onColorReverseChange,\n        collapseLabel: props.compactUI\n    })), colorColumn && !colorColumn.isColorData && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorBin\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explanation\"\n    }, (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorBinExplanation), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.ChoiceGroup, {\n        options: [\n            {\n                key: \"continuous\",\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorBinNone,\n                checked: colorBin === \"continuous\",\n                disabled: disabledColorBin\n            },\n            {\n                key: \"quantize\",\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorBinQuantize,\n                checked: colorBin === \"quantize\",\n                disabled: disabledColorBin\n            },\n            {\n                key: \"quantile\",\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorBinQuantile,\n                checked: colorBin === \"quantile\",\n                disabled: disabledColorBin\n            }\n        ],\n        onChange: (e, o)=>{\n            props.onColorBinChange(o.key);\n        }\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $9c14fe62b8e7ad84$export$8210dfe1863c478), {\n        disabled: props.disabled || disabledColorBin || props.colorBin === \"continuous\",\n        signal: props.colorBinSignal,\n        explorer: props.explorer,\n        onChange: props.onColorBinCountChange,\n        collapseLabel: props.compactUI\n    })), colorColumn && !colorColumn.isColorData && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelColorOptions\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Toggle, {\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDirectColor,\n        disabled: !colorColumn.stats.hasColorData,\n        checked: !!(colorColumn.stats.hasColorData && props.directColor),\n        onChange: (e, checked)=>props.onDirectColorChange(checked)\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelDataColors\n        }\n    })));\n}\n\n\n\n\n\nconst $dbe34e1e2a9121ef$export$ec835b702d42f3f0 = {\n    ENTER: 13\n};\n\n\n\n\nfunction $e4a6dc900077dd85$var$isNumber(value) {\n    if (typeof value === \"number\") return true;\n    if (!isNaN(value)) return true;\n    return false;\n}\nfunction $e4a6dc900077dd85$var$isBoolean(value) {\n    if (typeof value === \"boolean\") return true;\n    if (typeof value === \"string\") switch(value.toLowerCase()){\n        case \"true\":\n        case \"false\":\n            return true;\n    }\n    return false;\n}\nfunction $e4a6dc900077dd85$var$bingSearchLink(column, value) {\n    if ($e4a6dc900077dd85$var$isNumber(value)) return null;\n    if ($e4a6dc900077dd85$var$isBoolean(value)) return null;\n    if (column && column.stats.distinctValueCount === 2) return null;\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"bing-search\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"a\", {\n        href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n        target: \"_blank\",\n        title: (0, $0db66385c00a3f15$export$21c51bc433c16634).bingsearchDescription(value),\n        \"aria-label\": (0, $0db66385c00a3f15$export$21c51bc433c16634).bingsearchDescription(value)\n    }, (0, $0db66385c00a3f15$export$21c51bc433c16634).bingsearch));\n}\nfunction $e4a6dc900077dd85$var$displayValue(value) {\n    switch(value){\n        case \"\":\n            return {\n                special: true,\n                display: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelBlank\n            };\n        case null:\n            return {\n                special: true,\n                display: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelNull\n            };\n        case true:\n            return {\n                special: true,\n                display: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelTrue\n            };\n        case false:\n            return {\n                special: true,\n                display: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelFalse\n            };\n        default:\n            if (typeof value === \"object\") {\n                if (value instanceof Date) {\n                    const d = value;\n                    return $e4a6dc900077dd85$var$displayValue(d.input);\n                }\n                return {\n                    special: false,\n                    display: value.toLocaleString()\n                };\n            }\n            return {\n                special: false,\n                display: value\n            };\n    }\n}\nfunction $e4a6dc900077dd85$var$displayValueElement(nvp) {\n    const d = $e4a6dc900077dd85$var$displayValue(nvp.value);\n    if (d.special) return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"i\", null, d.display);\n    return d.display;\n}\nfunction $e4a6dc900077dd85$export$e9ab04247990d50b(props) {\n    if (!props.item) return null;\n    const nameValuePairs = [];\n    for(let columnName in props.item){\n        if (columnName === (0, $3b509b9541e52a8f$exports).constants.GL_ORDINAL && !props.showSystemFields) continue;\n        if ((0, $3b509b9541e52a8f$exports).util.isInternalFieldName(columnName)) continue;\n        let nameValuePair = {\n            columnName: columnName,\n            value: props.item[columnName]\n        };\n        if (!props.bingSearchDisabled) nameValuePair.bingSearch = $e4a6dc900077dd85$var$bingSearchLink(props.columns.filter((c)=>c.name === columnName)[0], props.item[columnName]);\n        nameValuePairs.push(nameValuePair);\n    }\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-dataItem\"\n    }, nameValuePairs.map((nameValuePair, i)=>{\n        const ex = {\n            key: 0,\n            name: nameValuePair.columnName,\n            operator: \"==\",\n            value: nameValuePair.value\n        };\n        if (nameValuePair.value === null || nameValuePair.value === \"\") {\n            ex.operator = \"isnullorEmpty\";\n            delete ex.value;\n        }\n        const searchClick = (e)=>{\n            const search = {\n                key: 0,\n                expressions: [\n                    ex\n                ]\n            };\n            props.onSearch(e, [\n                search\n            ]);\n        };\n        const title = (0, $0db66385c00a3f15$export$21c51bc433c16634).tooltipSearch(nameValuePair.columnName, $e4a6dc900077dd85$var$displayValue(nameValuePair.value).display);\n        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n            key: i,\n            onClick: !props.disabled ? searchClick : null,\n            title: title,\n            onKeyUp: (e)=>{\n                if (e.keyCode === (0, $dbe34e1e2a9121ef$export$ec835b702d42f3f0).ENTER) searchClick(e);\n            },\n            tabIndex: 0,\n            className: \"name-value\"\n        }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n            className: \"column-name\"\n        }, nameValuePair.columnName), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n            className: \"column-value\"\n        }, $e4a6dc900077dd85$var$displayValueElement(nameValuePair)), nameValuePair.bingSearch);\n    }));\n}\n\n\n\n\n\n\n\nfunction $0829079b3c747bdc$export$1ce2294f62fa7154(props) {\n    function activateRecord(newIndex) {\n        props.onActivate(props.data[newIndex], newIndex);\n    }\n    const { index: index  } = props;\n    const length = props.data && props.data.length || 0;\n    const dropdownRef = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createRef();\n    props.explorer.dialogFocusHandler.focus = ()=>{\n        var _a;\n        return (_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n    };\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelDataBrowser,\n        className: \"sanddance-dataIndex\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $01c4eef7f720da5f$export$931cbfb6bfb85fc), {\n        componentRef: dropdownRef,\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelDataScope,\n        collapseLabel: true,\n        options: [\n            {\n                key: (0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData,\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanAll,\n                isSelected: props.selectedDataScope === (0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData\n            },\n            {\n                key: (0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData,\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanFilter,\n                isSelected: props.selectedDataScope === (0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData\n            },\n            {\n                key: (0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData,\n                text: (0, $0db66385c00a3f15$export$21c51bc433c16634).selectDataSpanSelection,\n                isSelected: props.selectedDataScope === (0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData\n            }\n        ],\n        onChange: (e, o)=>{\n            props.onDataScopeClick(o.key);\n        }\n    }), !props.data && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        dangerouslySetInnerHTML: {\n            __html: props.nullMessage\n        }\n    }), props.data && !props.data.length && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, props.zeroMessage), !!length && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"index\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $adfb025456b8f57f$export$c25acd513dcc8062), {\n        themePalette: props.themePalette,\n        iconName: \"ChevronLeftMed\",\n        onClick: (e)=>activateRecord(index <= 0 ? length - 1 : index - 1),\n        disabled: props.disabled || length === 1,\n        title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonPrevDataItem\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"span\", null, (0, $0db66385c00a3f15$export$21c51bc433c16634).record(index + 1, length)), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $adfb025456b8f57f$export$c25acd513dcc8062), {\n        themePalette: props.themePalette,\n        iconName: \"ChevronRightMed\",\n        onClick: (e)=>activateRecord(index >= length - 1 ? 0 : index + 1),\n        disabled: props.disabled || length === 1,\n        title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonNextDataItem\n    })), !props.itemVisible && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"item-filtered\"\n    }, (0, $0db66385c00a3f15$export$21c51bc433c16634).labelDataItemIsFiltered), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $e4a6dc900077dd85$export$e9ab04247990d50b), {\n        columns: props.columns,\n        item: props.data[index],\n        disabled: props.disabled,\n        onSearch: props.onSearch,\n        bingSearchDisabled: props.bingSearchDisabled\n    })), props.dataExportHandler && props.data && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $e98d3084b701f145$export$b1b568728c48eba1), {\n        theme: props.theme,\n        initializer: {\n            fileName: `${(0, $e98d3084b701f145$export$748f956e607b675b)(props.displayName)} (${props.data.length})`\n        },\n        data: props.data,\n        dataExportHandler: props.dataExportHandler,\n        disabled: props.disabled\n    }));\n}\n\n\n\n\n\n\n\nfunction $0820350effaa56a9$export$84202caead5689ba(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8d43140d74b3b13d$export$eb2fcfdbd7ba97d4), {\n        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistory,\n        className: \"sanddance-history\"\n    }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"ol\", null, props.historyItems.map((hi, i)=>{\n        let ref;\n        if (i === props.historyIndex) {\n            ref = (0, $8535c575077b9670$export$e2253033e6e1df16).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                (_a = ref.current) === null || _a === void 0 || _a.focus();\n            };\n        }\n        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"li\", {\n            key: i,\n            className: (0, $a1d9524814b1e23a$exports).classList(i === props.historyIndex && \"selected\"),\n            onKeyUp: (e)=>{\n                if (e.keyCode === (0, $dbe34e1e2a9121ef$export$ec835b702d42f3f0).ENTER) props.redo(i);\n            }\n        }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n            className: \"sanddance-history-button\",\n            componentRef: ref,\n            text: hi.label,\n            onClick: ()=>props.redo(i)\n        }));\n    })));\n}\n\n\n\n\n\n\n\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction $68fd7b14b397ce6c$var$hasClientXY(e) {\n    if (e && e.clientX !== undefined && e.clientX !== undefined) return {\n        top: e.clientY,\n        left: e.clientX\n    };\n}\nfunction $68fd7b14b397ce6c$export$1690e12b840569b9(e) {\n    let xy = $68fd7b14b397ce6c$var$hasClientXY(e);\n    if (xy) return xy;\n    const te = e;\n    if (te === null || te === void 0 ? void 0 : te.touches) for(let i = 0; i < te.touches.length; i++){\n        let xy = $68fd7b14b397ce6c$var$hasClientXY(te.touches[i]);\n        if (xy) return xy;\n    }\n    const el = e.target;\n    if (el && el.getClientRects) return el.getClientRects()[0];\n}\n\n\n\nfunction $b16b30fb0ba8a026$export$1915de5807f54194(prefs, partialInsight) {\n    if (partialInsight) {\n        const specTypePrefs = prefs[partialInsight.chart] || {};\n        prefs[partialInsight.chart] = specTypePrefs;\n        for(let _role in partialInsight.columns){\n            let role = _role;\n            if (role === \"color\" || role === \"x\") {\n                let rolePrefs = specTypePrefs[role] || {};\n                specTypePrefs[role] = rolePrefs;\n                let column = partialInsight.columns[role];\n                let copySignalValue = (signalName)=>{\n                    if (partialInsight.signalValues && partialInsight.signalValues[signalName] && rolePrefs[column]) {\n                        const signalValues = rolePrefs[column].signalValues || {};\n                        signalValues[signalName] = partialInsight.signalValues[signalName];\n                        rolePrefs[column].signalValues = signalValues;\n                    }\n                };\n                switch(role){\n                    case \"color\":\n                        rolePrefs[column] = {\n                            scheme: partialInsight.scheme,\n                            colorBin: partialInsight.colorBin\n                        };\n                        copySignalValue((0, $3b509b9541e52a8f$exports).constants.SignalNames.ColorBinCount);\n                        break;\n                    case \"x\":\n                        copySignalValue((0, $3b509b9541e52a8f$exports).constants.SignalNames.XBins);\n                        break;\n                }\n            }\n        }\n    }\n}\nfunction $b16b30fb0ba8a026$export$c2992dc6411becf6(prefs, chart, role, column, signalName, signalValue) {\n    const partialInsight = $b16b30fb0ba8a026$export$a14483004c11686f(prefs, chart, role, column, {\n        signalValues: {}\n    });\n    partialInsight.signalValues[signalName] = signalValue;\n}\nfunction $b16b30fb0ba8a026$export$318d2f27a5d54aff(prefs, chart, role, columnName) {\n    const specTypePrefs = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.deepMerge({}, prefs[\"*\"], prefs[chart]);\n    const rolePrefs = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.deepMerge({}, specTypePrefs[\"*\"], specTypePrefs[role]);\n    const partialInsight = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.deepMerge({}, rolePrefs[\"*\"], rolePrefs[columnName]);\n    return partialInsight;\n}\nfunction $b16b30fb0ba8a026$export$a14483004c11686f(prefs, chart, role, column, partialInsight) {\n    const SpecTypePrefs = prefs[chart] || {};\n    prefs[chart] = SpecTypePrefs;\n    const rolePrefs = SpecTypePrefs[role] || {};\n    SpecTypePrefs[role] = rolePrefs;\n    rolePrefs[column] = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.deepMerge({}, rolePrefs[column], partialInsight);\n    return rolePrefs[column];\n}\n\n\n\n\nfunction $e0216832bbbcfdeb$var$comparableGroup(group) {\n    return Object.assign(Object.assign({}, group), {\n        clause: null\n    });\n}\nfunction $e0216832bbbcfdeb$var$compareGroup(a, b) {\n    return (0, $3b509b9541e52a8f$exports).searchExpression.compareGroup($e0216832bbbcfdeb$var$comparableGroup(a), $e0216832bbbcfdeb$var$comparableGroup(b));\n}\nfunction $e0216832bbbcfdeb$export$2e59f49d97a9dbde(haystack, needle) {\n    const groups = [];\n    let found = false;\n    //look for item in all\n    haystack.forEach((group)=>{\n        if ($e0216832bbbcfdeb$var$compareGroup(group, needle)) //if it exists, don't add it\n        found = true;\n        else groups.push(group);\n    });\n    return {\n        groups: groups,\n        found: found\n    };\n}\n\n\n\n\nconst $b935bf5e2863e486$var$dataBrowserZeroMessages = {};\n$b935bf5e2863e486$var$dataBrowserZeroMessages[(0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData] = (0, $0db66385c00a3f15$export$21c51bc433c16634).labelZeroAll;\n$b935bf5e2863e486$var$dataBrowserZeroMessages[(0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData] = null; //empty array is not used\n$b935bf5e2863e486$var$dataBrowserZeroMessages[(0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData] = (0, $0db66385c00a3f15$export$21c51bc433c16634).labelZeroSearchResults;\nconst $b935bf5e2863e486$var$dataBrowserNullMessages = {};\n$b935bf5e2863e486$var$dataBrowserNullMessages[(0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData] = (0, $0db66385c00a3f15$export$21c51bc433c16634).labelDataNullAll;\n$b935bf5e2863e486$var$dataBrowserNullMessages[(0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData] = (0, $0db66385c00a3f15$export$21c51bc433c16634).labelDataNullFiltered;\n$b935bf5e2863e486$var$dataBrowserNullMessages[(0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData] = (0, $0db66385c00a3f15$export$21c51bc433c16634).labelDataNullSelection;\nfunction $b935bf5e2863e486$var$createInputSearch(search) {\n    const groups = (0, $3b509b9541e52a8f$exports).searchExpression.ensureSearchExpressionGroupArray(search);\n    const dialogSearch = groups.map((group, groupIndex)=>{\n        return Object.assign(Object.assign({\n            key: groupIndex\n        }, group), {\n            expressions: group.expressions.map((ex, i)=>{\n                const ex2 = Object.assign({\n                    key: i\n                }, ex);\n                return ex2;\n            })\n        });\n    });\n    return dialogSearch;\n}\nfunction $b935bf5e2863e486$var$_Explorer(props1) {\n    class __Explorer extends (0, $8535c575077b9670$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.dialogFocusHandler = {};\n            this.state = {\n                calculating: null,\n                errors: null,\n                autoCompleteDistinctValues: {},\n                colorBin: null,\n                dataContent: null,\n                dataFile: null,\n                search: null,\n                totalStyle: null,\n                facetStyle: \"wrap\",\n                filter: null,\n                filteredData: null,\n                specCapabilities: null,\n                size: {\n                    height: null,\n                    width: null\n                },\n                scheme: null,\n                transform: null,\n                columns: null,\n                chart: \"grid\",\n                signalValues: null,\n                hideAxes: false,\n                hideLegend: false,\n                sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).ChartType,\n                dataScopeId: (0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData,\n                selectedItemIndex: {},\n                sidebarClosed: false,\n                sidebarPinned: true,\n                view: props.initialView || \"2d\",\n                snapshots: [],\n                selectedSnapshotIndex: -1,\n                tooltipExclusions: [],\n                positionedColumnMapProps: null,\n                note: null,\n                historyIndex: -1,\n                historyItems: []\n            };\n            this.state.selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData] = 0;\n            this.state.selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData] = 0;\n            this.state.selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData] = 0;\n            this.snapshotThumbWidth = (0, $8bfbb5c28cff0e2c$export$7e33de69431bbb06);\n            this.discardColorContextUpdates = true;\n            this.updateViewerOptions(Object.assign(Object.assign({}, (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.clone((0, $3b509b9541e52a8f$exports).Viewer.defaultViewerOptions)), props.viewerOptions));\n        }\n        finalize() {\n            if (this.viewer) this.viewer.finalize();\n        }\n        updateViewerOptions(viewerOptions) {\n            this.viewerOptions = Object.assign(Object.assign({}, (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.deepMerge((0, $8bfbb5c28cff0e2c$export$fb736e4909afb3d7), this.viewerOptions, viewerOptions)), {\n                tooltipOptions: {\n                    exclude: (columnName)=>this.state.tooltipExclusions.indexOf(columnName) >= 0\n                },\n                onColorContextChange: ()=>this.manageColorToolbar(),\n                onDataFilter: (filter, filteredData)=>{\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData] = 0;\n                    this.changeInsight({\n                        filter: filter\n                    }, {\n                        label: this.historicFilterChange,\n                        omit: !this.historicFilterChange\n                    });\n                    this.historicFilterChange = null;\n                    this.setState({\n                        filteredData: filteredData,\n                        selectedItemIndex: selectedItemIndex\n                    });\n                    if (this.state.sideTabId === (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data && this.state.dataScopeId === (0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData) //make sure item is active\n                    requestAnimationFrame(()=>filteredData && this.silentActivation(filteredData[0]));\n                    viewerOptions && viewerOptions.onDataFilter && viewerOptions.onDataFilter(filter, filteredData);\n                },\n                onSelectionChanged: (newSearch, index, selectedData)=>{\n                    if (this.ignoreSelectionChange) return;\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData] = index || 0;\n                    let { search: search  } = this.state;\n                    const { sideTabId: sideTabId  } = this.state;\n                    if (newSearch) search = $b935bf5e2863e486$var$createInputSearch(newSearch);\n                    this.setState({\n                        search: search,\n                        selectedItemIndex: selectedItemIndex,\n                        sideTabId: sideTabId\n                    });\n                    viewerOptions && viewerOptions.onSelectionChanged && viewerOptions.onSelectionChanged(newSearch, index, selectedData);\n                },\n                onAxisClick: (e, search)=>{\n                    this.toggleableSearch(e, search);\n                    viewerOptions && viewerOptions.onAxisClick && viewerOptions.onAxisClick(e, search);\n                },\n                onLegendHeaderClick: (e)=>{\n                    const pos = (0, $68fd7b14b397ce6c$export$1690e12b840569b9)(e);\n                    const specRole = this.state.specCapabilities && this.state.specCapabilities.roles.filter((r)=>r.role === \"color\")[0];\n                    const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), {\n                        collapseLabel: true,\n                        container: this.div,\n                        selectedColumnName: this.state.columns[\"color\"],\n                        onDismiss: ()=>{\n                            this.setState({\n                                positionedColumnMapProps: null\n                            });\n                        },\n                        specRole: specRole,\n                        left: pos.left - this.div.clientLeft,\n                        top: pos.top - this.div.clientTop\n                    });\n                    this.setState({\n                        positionedColumnMapProps: positionedColumnMapProps\n                    });\n                },\n                onLegendRowClick: (e, legendRow)=>{\n                    this.toggleableSearch(e, legendRow.search);\n                    viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onLegendRowClick(e, legendRow);\n                },\n                onError: (errors)=>{\n                    this.setState({\n                        errors: errors\n                    });\n                    viewerOptions && viewerOptions.onError && viewerOptions.onError(errors);\n                },\n                onBeforeCreateLayers: $1f0c6e0f0abb4f2d$export$dd264fd5c92b73c6,\n                getTextColor: (o)=>{\n                    if (o.specRole) return (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.colorFromString(this.viewerOptions.colors.clickableText);\n                    else if (o.metaData && o.metaData.search) return (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.colorFromString(this.viewerOptions.colors.searchText);\n                    else return o.color;\n                },\n                getTextHighlightAlphaCutoff: ()=>this.viewerOptions.colors.clickableTextHighlightAlphaCutoff,\n                getTextHighlightColor: (o)=>{\n                    if (o.specRole) return (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.colorFromString(this.viewerOptions.colors.clickableTextHighlight);\n                    else if (o.metaData && o.metaData.search) return (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.colorFromString(this.viewerOptions.colors.searchTextHighlight);\n                    else return [\n                        0,\n                        0,\n                        0,\n                        0\n                    ];\n                },\n                onTextClick: (e, text)=>{\n                    if (e && text) {\n                        const pos = (0, $68fd7b14b397ce6c$export$1690e12b840569b9)(e);\n                        const { specRole: specRole  } = text;\n                        if (pos && specRole) {\n                            const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), {\n                                collapseLabel: true,\n                                container: this.div,\n                                selectedColumnName: this.state.columns[specRole.role],\n                                onDismiss: ()=>{\n                                    this.setState({\n                                        positionedColumnMapProps: null\n                                    });\n                                },\n                                specRole: specRole,\n                                left: pos.left - this.div.clientLeft,\n                                top: pos.top - this.div.clientTop\n                            });\n                            this.setState({\n                                positionedColumnMapProps: positionedColumnMapProps\n                            });\n                        } else this.setState({\n                            positionedColumnMapProps: null\n                        });\n                    }\n                },\n                onNewViewStateTarget: ()=>this.newViewStateTarget\n            });\n            if (this.viewer && this.viewer.presenter) {\n                const newPresenterStyle = (0, $3b509b9541e52a8f$exports).util.getPresenterStyle(this.viewerOptions);\n                const mergePrenterStyle = Object.assign(Object.assign({}, this.viewer.presenter.style), newPresenterStyle);\n                this.viewer.presenter.style = mergePrenterStyle;\n                this.viewer.options = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.deepMerge(this.viewer.options, this.props.viewerOptions, this.viewerOptions);\n            }\n        }\n        signal(signalName, signalValue, newViewStateTarget) {\n            switch(signalName){\n                case (0, $3b509b9541e52a8f$exports).constants.SignalNames.ColorBinCount:\n                case (0, $3b509b9541e52a8f$exports).constants.SignalNames.ColorReverse:\n                case (0, $3b509b9541e52a8f$exports).constants.SignalNames.MarkOpacity:\n                    this.discardColorContextUpdates = false;\n                    break;\n            }\n            this.newViewStateTarget = newViewStateTarget;\n            this.viewer.vegaViewGl.signal(signalName, signalValue);\n            this.viewer.vegaViewGl.runAsync().then(()=>{\n                //deeply set the state without a state change. This prevents a redraw if re-rendered\n                if (this.state.signalValues) this.state.signalValues[signalName] = signalValue;\n                this.discardColorContextUpdates = true;\n                this.newViewStateTarget = undefined;\n                this.props.onSignalChanged && this.props.onSignalChanged(signalName, signalValue);\n            });\n        }\n        manageColorToolbar() {\n            const canRemap = this.viewer.colorContexts && this.viewer.colorContexts.length > 1;\n            (0, $1ea281e0bf69aeed$export$225a002951c27da7)(this.viewer.presenter, !!this.state.columns.color, {\n                themePalette: (0, $b61671d8f61aadb4$export$3465a0e7b289ab72)[this.props.theme || \"\"],\n                canRemap: canRemap,\n                isRemap: canRemap && this.viewer.currentColorContext > 0,\n                colorMapHandler: (remap)=>{\n                    this.viewer.currentColorContext = ~~remap;\n                    this.viewer.renderSameLayout();\n                    this.manageColorToolbar();\n                }\n            });\n        }\n        getInsight() {\n            return this.viewer.getInsight();\n        }\n        setInsight(historyAction, newState = {}, partialInsight = this.viewer.getInsight(), rebaseFilter = false) {\n            const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n            selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData] = 0;\n            selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData] = 0;\n            selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData] = 0;\n            const historicInsight = Object.assign({\n                chart: null,\n                scheme: null,\n                columns: null,\n                filter: null,\n                rebaseFilter: rebaseFilter\n            }, partialInsight);\n            const state = Object.assign({\n                filteredData: null,\n                selectedItemIndex: selectedItemIndex,\n                search: $b935bf5e2863e486$var$createInputSearch(historicInsight.filter)\n            }, newState);\n            const changeInsight = ()=>{\n                this.getColorContext = null;\n                this.changeInsight(historicInsight, historyAction, state);\n            };\n            const currentFilter = this.viewer.getInsight().filter;\n            if (rebaseFilter && currentFilter && historicInsight.filter) {\n                if ((0, $3b509b9541e52a8f$exports).searchExpression.startsWith(historicInsight.filter, currentFilter)) changeInsight();\n                else this.viewer.reset().then(()=>new Promise((resolve, reject)=>{\n                        setTimeout(resolve, this.viewer.options.transitionDurations.scope);\n                    })).then(changeInsight);\n            } else changeInsight();\n        }\n        handleReviveSnapshot(snapshot, selectedSnapshotIndex) {\n            let handled = false;\n            if (this.props.onSnapshotClick) {\n                this.setState({\n                    selectedSnapshotIndex: selectedSnapshotIndex\n                });\n                handled = this.props.onSnapshotClick(snapshot, selectedSnapshotIndex);\n            }\n            if (!handled) this.reviveSnapshot(selectedSnapshotIndex);\n        }\n        reviveSnapshot(snapshotOrIndex) {\n            if (typeof snapshotOrIndex === \"number\") {\n                const selectedSnapshotIndex = snapshotOrIndex;\n                const snapshot = this.state.snapshots[selectedSnapshotIndex];\n                const newState = {\n                    note: snapshot.description,\n                    selectedSnapshotIndex: selectedSnapshotIndex\n                };\n                if (!this.state.sidebarClosed) {\n                    newState.sideTabId = (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Snapshots;\n                    this.scrollSnapshotIntoView(selectedSnapshotIndex);\n                }\n                this.setInsight({\n                    label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryReviveSnapshot\n                }, newState, snapshot.insight, true);\n            } else {\n                const snapshot = snapshotOrIndex;\n                if (snapshot.insight) this.setInsight({\n                    label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryReviveSnapshot\n                }, {\n                    note: snapshot.description,\n                    selectedSnapshotIndex: -1\n                }, snapshot.insight, true); //don't navigate to sideTab\n                else this.setState({\n                    note: snapshot.description,\n                    selectedSnapshotIndex: -1\n                });\n            }\n        }\n        load(data, getPartialInsight, optionsOrPrefs) {\n            this.setState({\n                historyIndex: -1,\n                historyItems: []\n            });\n            this.changeInsight({\n                columns: null\n            }, {\n                label: null,\n                omit: true\n            }, {\n                note: null\n            });\n            return new Promise((resolve, reject)=>{\n                const loadFinal = (dataContent)=>{\n                    let partialInsight;\n                    this.prefs = optionsOrPrefs && optionsOrPrefs.chartPrefs || optionsOrPrefs || {};\n                    if (getPartialInsight) {\n                        partialInsight = getPartialInsight(dataContent.columns);\n                        (0, $b16b30fb0ba8a026$export$1915de5807f54194)(this.prefs, partialInsight);\n                    }\n                    if (!partialInsight) {\n                        //load recommendation\n                        let r = new (0, $72367f17ca00272b$exports.RecommenderSummary)(dataContent.columns, dataContent.data);\n                        partialInsight = r.recommend();\n                    }\n                    partialInsight = Object.assign({\n                        facetStyle: \"wrap\",\n                        filter: null,\n                        totalStyle: null,\n                        transform: null\n                    }, partialInsight);\n                    if (partialInsight.chart === \"barchart\") partialInsight.chart = \"barchartV\";\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    const sideTabId = (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).ChartType;\n                    selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData] = 0;\n                    selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData] = 0;\n                    selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData] = 0;\n                    let newState = Object.assign({\n                        dataFile: dataFile,\n                        dataContent: dataContent,\n                        snapshots: dataContent.snapshots || this.state.snapshots,\n                        autoCompleteDistinctValues: {},\n                        filteredData: null,\n                        tooltipExclusions: optionsOrPrefs && optionsOrPrefs.tooltipExclusions || [],\n                        selectedItemIndex: selectedItemIndex,\n                        sideTabId: sideTabId\n                    }, partialInsight);\n                    this.getColorContext = null;\n                    (0, $a17a024e67e91c9f$export$1e096674a95fd43b)(newState.columns, dataContent.columns, newState.transform);\n                    const errors = (0, $a17a024e67e91c9f$export$c2563952d877899)(partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.chart, partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.totalStyle, newState.columns, dataContent.columns);\n                    newState.errors = errors;\n                    //change insight\n                    this.changeInsight(partialInsight, {\n                        label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryInit,\n                        insert: true\n                    }, newState);\n                    //make sure item is active\n                    this.activateDataBrowserItem(sideTabId, this.state.dataScopeId);\n                    resolve();\n                };\n                let dataFile;\n                if (Array.isArray(data)) return (0, $3d862e0e83f42a97$export$c084150d12efae43)(data, \"json\").then((result)=>{\n                    dataFile = {\n                        type: \"json\"\n                    };\n                    loadFinal(result);\n                }).catch(reject);\n                else {\n                    dataFile = data;\n                    return (0, $3d862e0e83f42a97$export$9d26f8f2be82424f)(dataFile).then(loadFinal).catch(reject);\n                }\n            });\n        }\n        changeChartType(chart) {\n            const partialInsight = (0, $b16b30fb0ba8a026$export$318d2f27a5d54aff)(this.prefs, chart, \"*\", \"*\");\n            const insight = Object.assign({\n                chart: chart\n            }, partialInsight);\n            const columns = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.deepMerge({}, partialInsight.columns, this.state.columns);\n            const { signalValues: signalValues  } = this.viewer.getInsight();\n            insight.signalValues = Object.assign(Object.assign({}, this.state.signalValues), signalValues);\n            insight.columns = Object.assign({}, columns);\n            insight.totalStyle = this.state.totalStyle;\n            let errors;\n            //special case mappings when switching chart type\n            if (this.state.chart === \"scatterplot\" && (chart === \"barchart\" || chart === \"barchartV\")) insight.columns = Object.assign(Object.assign({}, columns), {\n                sort: columns.y\n            });\n            else if (this.state.chart === \"scatterplot\" && chart === \"barchartH\") insight.columns = Object.assign(Object.assign({}, columns), {\n                sort: columns.x\n            });\n            else if (chart === \"treemap\") {\n                insight.view = \"2d\";\n                if (!columns.size) {\n                    //make sure size exists and is numeric\n                    let sizeColumn;\n                    //first check prefs\n                    if (partialInsight && partialInsight.columns && partialInsight.columns.size) {\n                        const prefSizeColumn = this.state.dataContent.columns.filter((c)=>c.name === partialInsight.columns.size)[0];\n                        if (prefSizeColumn && prefSizeColumn.quantitative) sizeColumn = prefSizeColumn;\n                    }\n                    if (!sizeColumn) sizeColumn = (0, $a17a024e67e91c9f$export$7e0d3b5c6570ae8b)(this.state.dataContent.columns);\n                    if (!sizeColumn) //error - no numeric columns\n                    errors = [\n                        (0, $0db66385c00a3f15$export$21c51bc433c16634).errorColumnMustBeNumeric\n                    ];\n                    else insight.columns = Object.assign(Object.assign({}, columns), {\n                        size: sizeColumn.name\n                    });\n                }\n            } else if (chart === \"stacks\") insight.view = \"3d\";\n            (0, $a17a024e67e91c9f$export$1e096674a95fd43b)(insight.columns, this.state.dataContent.columns, this.state.transform);\n            errors = (0, $a17a024e67e91c9f$export$c2563952d877899)(chart, insight.totalStyle, insight.columns, this.state.dataContent.columns);\n            this.calculate(()=>{\n                this.changeInsight(insight, {\n                    label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryChangeChartType((0, $247884a4197e9da6$export$7d1536ca08644643)(chart))\n                }, errors ? {\n                    errors: errors\n                } : null);\n            });\n        }\n        calculate(calculating) {\n            this.setState({\n                calculating: calculating\n            });\n        }\n        changeView(view) {\n            this.changeInsight({\n                view: view\n            }, {\n                label: view === \"2d\" ? (0, $0db66385c00a3f15$export$21c51bc433c16634).labelViewType2d : (0, $0db66385c00a3f15$export$21c51bc433c16634).labelViewType3d\n            });\n        }\n        //state members which change the insight\n        changeInsight(partialInsight, historyAction, additionalUIState) {\n            if (partialInsight.chart === \"barchart\") partialInsight.chart = \"barchartV\";\n            this.addHistory(partialInsight, historyAction, additionalUIState);\n        }\n        addHistory(historicInsight, historyAction, additionalUIState) {\n            const setCleanState = (newState)=>{\n                const cleanState = Object.assign(Object.assign({}, newState), additionalUIState);\n                if (!cleanState.note) cleanState.note = null;\n                delete cleanState.rebaseFilter;\n                if (this.viewer) {\n                    const { signalValues: signalValues  } = this.viewer.getInsight();\n                    cleanState.signalValues = Object.assign(Object.assign(Object.assign({}, this.state.signalValues), signalValues), cleanState.signalValues);\n                }\n                this.setState(cleanState);\n            };\n            if (historyAction.omit) {\n                setCleanState(historicInsight);\n                return;\n            }\n            const historyItems = this.state.historyItems.slice(0, this.state.historyIndex + 1);\n            const historyIndex = historyItems.length;\n            historyItems.push({\n                label: historyAction.label,\n                historicInsight: historicInsight\n            });\n            if (historyAction.insert) setCleanState({\n                historyIndex: historyIndex,\n                historyItems: historyItems\n            });\n            else setCleanState(Object.assign(Object.assign({}, historicInsight), {\n                historyIndex: historyIndex,\n                historyItems: historyItems\n            }));\n        }\n        replay(index) {\n            let filter = null;\n            let historicInsight = {};\n            for(let i = 0; i < index + 1; i++){\n                const historyItem = this.state.historyItems[i];\n                if (historyItem) {\n                    if (historyItem.historicInsight.filter === null) filter = null;\n                    else if (historyItem.historicInsight.rebaseFilter) filter = historyItem.historicInsight.filter;\n                    else if (historyItem.historicInsight.filter) filter = (0, $3b509b9541e52a8f$exports).searchExpression.narrow(filter, historyItem.historicInsight.filter);\n                    historicInsight = Object.assign(Object.assign({}, historicInsight), historyItem.historicInsight);\n                }\n            }\n            return Object.assign(Object.assign({}, historicInsight), {\n                filter: filter\n            });\n        }\n        undo() {\n            const historyIndex = this.state.historyIndex - 1;\n            if (historyIndex < 0) return;\n            const newState = this.replay(historyIndex);\n            this.rebaseFilter = true;\n            this.setState(Object.assign(Object.assign({}, newState), {\n                historyIndex: historyIndex\n            }));\n        }\n        redo(historyIndex = this.state.historyIndex + 1) {\n            if (historyIndex >= this.state.historyItems.length) return;\n            const newState = this.replay(historyIndex);\n            this.rebaseFilter = true;\n            this.setState(Object.assign(Object.assign({}, newState), {\n                historyIndex: historyIndex\n            }));\n        }\n        changespecCapabilities(specCapabilities) {\n            this.setState({\n                specCapabilities: specCapabilities\n            });\n        }\n        changeColumnMapping(role, column, options) {\n            const columns = Object.assign({}, this.state.columns);\n            const label = column ? (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryMapColumn(role) : (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryUnMapColumn(role);\n            const final = ()=>{\n                const partialInsight = {\n                    columns: columns,\n                    totalStyle: options ? options.totalStyle : this.state.totalStyle\n                };\n                const errors = (0, $a17a024e67e91c9f$export$c2563952d877899)(this.state.chart, partialInsight.totalStyle, partialInsight.columns, this.state.dataContent.columns);\n                columns[role] = column && column.name;\n                this.changeInsight(partialInsight, {\n                    label: label\n                }, errors ? {\n                    errors: errors\n                } : null);\n            };\n            const _changeInsight = (newInsight, columnUpdate, historyAction)=>{\n                newInsight.columns = (0, $3b509b9541e52a8f$exports).VegaDeckGl.util.deepMerge({}, columns, columnUpdate);\n                (0, $b16b30fb0ba8a026$export$a14483004c11686f)(this.prefs, this.state.chart, \"*\", \"*\", {\n                    columns: columnUpdate\n                });\n                this.changeInsight(newInsight, historyAction);\n            };\n            if (column) {\n                let columnUpdate;\n                switch(role){\n                    case \"facet\":\n                        {\n                            (0, $b16b30fb0ba8a026$export$318d2f27a5d54aff)(this.prefs, this.state.chart, \"facet\", column.name);\n                            const historicInsight = {\n                                columns: columns,\n                                facetStyle: options ? options.facetStyle : this.state.facetStyle\n                            };\n                            columnUpdate = {\n                                facet: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label: label\n                            });\n                            break;\n                        }\n                    case \"color\":\n                        {\n                            let calculating = null;\n                            let historicInsight = {\n                                scheme: options && options.scheme,\n                                columns: columns,\n                                colorBin: this.state.colorBin\n                            };\n                            if (!historicInsight.scheme) (0, $b16b30fb0ba8a026$export$318d2f27a5d54aff)(this.prefs, this.state.chart, \"color\", column.name);\n                            if (!historicInsight.scheme) historicInsight.scheme = (0, $02ad5d745dd4974f$export$ba25af89e7ea3c1a)(column, null, this.state.scheme);\n                            if (!column.stats.hasColorData) {\n                                historicInsight.directColor = false;\n                                if (this.state.directColor !== historicInsight.directColor) calculating = ()=>this._resize();\n                            }\n                            if (this.state.columns && this.state.columns.color && this.state.columns.color !== column.name) {\n                                const currColorColumn = this.state.dataContent.columns.filter((c)=>c.name === this.state.columns.color)[0];\n                                if (column.isColorData != currColorColumn.isColorData) calculating = ()=>this._resize();\n                            }\n                            this.ignoreSelectionChange = true;\n                            this.viewer.deselect().then(()=>{\n                                this.ignoreSelectionChange = false;\n                                //allow deselection to render\n                                requestAnimationFrame(()=>{\n                                    columnUpdate = {\n                                        color: column.name\n                                    };\n                                    this.getColorContext = null;\n                                    this.setState({\n                                        calculating: calculating\n                                    });\n                                    _changeInsight(historicInsight, columnUpdate, {\n                                        label: label\n                                    });\n                                });\n                            });\n                            break;\n                        }\n                    case \"x\":\n                        {\n                            (0, $b16b30fb0ba8a026$export$318d2f27a5d54aff)(this.prefs, this.state.chart, \"x\", column.name);\n                            const historicInsight = {\n                                columns: columns\n                            };\n                            columnUpdate = {\n                                x: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label: label\n                            });\n                            break;\n                        }\n                    case \"size\":\n                        {\n                            (0, $b16b30fb0ba8a026$export$318d2f27a5d54aff)(this.prefs, this.state.chart, \"size\", column.name);\n                            const historicInsight = {\n                                totalStyle: options ? options.totalStyle : this.state.totalStyle\n                            };\n                            columnUpdate = {\n                                size: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label: label\n                            });\n                            break;\n                        }\n                    default:\n                        final();\n                        break;\n                }\n            } else switch(role){\n                case \"facet\":\n                    columns.facet = null;\n                    columns.facetV = null;\n                    this.changeInsight({\n                        columns: columns,\n                        facetStyle: \"wrap\"\n                    }, {\n                        label: label\n                    });\n                    break;\n                default:\n                    final();\n                    break;\n            }\n        }\n        setSideTabId(sideTabId, dataScopeId) {\n            if (sideTabId === (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data && dataScopeId == null) //choose most relevant DataScopeId\n            dataScopeId = this.getBestDataScopeId();\n            if (dataScopeId == null) dataScopeId = this.state.dataScopeId;\n            const calculating = ()=>{\n                this.dialogFocusHandler.focus && this.dialogFocusHandler.focus();\n            };\n            this.setState({\n                sideTabId: sideTabId,\n                dataScopeId: dataScopeId,\n                sidebarClosed: false,\n                calculating: calculating\n            });\n            this.activateDataBrowserItem(sideTabId, dataScopeId);\n        }\n        getBestDataScopeId() {\n            let dataScopeId;\n            const selectionState = this.viewer && this.viewer.getSelection();\n            if (selectionState && selectionState.selectedData && selectionState.selectedData.length) dataScopeId = (0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData;\n            else if (this.state.filteredData) dataScopeId = (0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData;\n            else dataScopeId = (0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData;\n            return dataScopeId;\n        }\n        activateDataBrowserItem(sideTabId, dataScopeId) {\n            if (!this.viewer) return;\n            let itemToActivate;\n            if (sideTabId === (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data) switch(dataScopeId){\n                case (0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData:\n                    itemToActivate = this.state.dataContent && this.state.dataContent.data[this.state.selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData]];\n                    break;\n                case (0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData:\n                    itemToActivate = this.state.filteredData && this.state.filteredData[this.state.selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData]];\n                    break;\n                case (0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData:\n                    {\n                        const selection = this.viewer.getSelection() || {};\n                        itemToActivate = selection.selectedData && selection.selectedData[this.state.selectedItemIndex[(0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData]];\n                        break;\n                    }\n            }\n            this.silentActivation(itemToActivate);\n        }\n        silentActivation(itemToActivate) {\n            this.ignoreSelectionChange = true;\n            const done = ()=>{\n                this.ignoreSelectionChange = false;\n            };\n            if (itemToActivate) return this.viewer.activate(itemToActivate).then(done);\n            else return this.viewer.deActivate().then(done);\n        }\n        sidebar(sidebarClosed, sidebarPinned) {\n            this.setState({\n                sidebarClosed: sidebarClosed,\n                sidebarPinned: sidebarPinned\n            });\n        }\n        resize() {\n            this.setState({\n                calculating: ()=>this._resize()\n            });\n        }\n        _resize() {\n            this.changeInsight({\n                size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed)\n            }, {\n                label: \"resize\",\n                omit: true\n            });\n        }\n        viewerMounted(glDiv) {\n            this.setState({\n                size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed),\n                signalValues: this.state.signalValues //keep initialized signalValues\n            });\n        }\n        getLayoutDivSize(pinned, closed) {\n            const div = pinned && !closed ? this.layoutDivPinned : this.layoutDivUnpinned;\n            return {\n                height: div.offsetHeight,\n                width: div.offsetWidth\n            };\n        }\n        toggleableSearch(e, search) {\n            if (e.ctrlKey) {\n                this.setState({\n                    search: $b935bf5e2863e486$var$createInputSearch(search)\n                });\n                this.setSideTabId((0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Search);\n            } else {\n                var oldSelection = this.viewer.getSelection();\n                if (oldSelection.search) {\n                    //look for matching groups and toggle them\n                    const result = (0, $e0216832bbbcfdeb$export$2e59f49d97a9dbde)((0, $3b509b9541e52a8f$exports).searchExpression.ensureSearchExpressionGroupArray(oldSelection.search), search);\n                    if (result.found) {\n                        //removing a group\n                        if (result.groups.length === 0) this.doDeselect();\n                        else //select with new search removed\n                        this.doSelect(result.groups);\n                    } else //adding a new group\n                    if (e.altKey || e.shiftKey) {\n                        let group = true;\n                        if (e.altKey) search.clause = \"&&\";\n                        else if (e.shiftKey) {\n                            if (this.props.searchORDisabled) group = false;\n                            else search.clause = \"||\";\n                        }\n                        if (group) {\n                            result.groups.push(search);\n                            this.doSelect(result.groups);\n                        } else this.doSelect(search);\n                    } else //replace\n                    this.doSelect(search);\n                } else this.doSelect(search);\n            }\n        }\n        doFilter(search, historicFilterChange) {\n            this.historicFilterChange = historicFilterChange;\n            this.viewer.filter(search);\n        }\n        doUnfilter(historicFilterChange) {\n            this.historicFilterChange = historicFilterChange;\n            this.viewer.reset();\n        }\n        doSelect(search) {\n            this.viewer.select(search);\n        }\n        doDeselect() {\n            return this.viewer.deselect();\n        }\n        writeSnapshot(snapshot, editIndex) {\n            let { selectedSnapshotIndex: selectedSnapshotIndex  } = this.state;\n            let snapshots;\n            if (editIndex >= 0) {\n                snapshots = [\n                    ...this.state.snapshots\n                ];\n                snapshots[editIndex] = snapshot;\n                this.setState({\n                    snapshots: snapshots,\n                    selectedSnapshotIndex: selectedSnapshotIndex\n                });\n            } else {\n                const note = snapshot.description;\n                snapshots = this.state.snapshots.concat(snapshot);\n                selectedSnapshotIndex = snapshots.length - 1;\n                this.scrollSnapshotIntoView(selectedSnapshotIndex);\n                this.setState({\n                    sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Snapshots,\n                    snapshots: snapshots,\n                    selectedSnapshotIndex: selectedSnapshotIndex,\n                    note: note\n                });\n            }\n            this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n        }\n        scrollSnapshotIntoView(selectedSnapshotIndex) {\n            clearTimeout(this.scrollSnapshotTimer);\n            if (this.state.sidebarClosed) return;\n            this.scrollSnapshotTimer = setTimeout(()=>{\n                const selectedSnapshotElement = this.div.querySelector(`.snapshot:nth-child(${selectedSnapshotIndex + 1})`);\n                if (selectedSnapshotElement) selectedSnapshotElement.scrollIntoView({\n                    behavior: \"smooth\",\n                    block: \"nearest\"\n                });\n            }, 500);\n        }\n        componentDidMount() {\n            if (this.props.mounted) this.props.mounted(this);\n        }\n        render() {\n            const { colorBin: colorBin1 , columns: columns , directColor: directColor1 , facetStyle: facetStyle , filter: filter , hideAxes: hideAxes1 , hideLegend: hideLegend1 , scheme: scheme1 , signalValues: signalValues1 , size: size , totalStyle: totalStyle , transform: transform , chart: chart1 , view: view1  } = this.state;\n            const insight = {\n                colorBin: colorBin1,\n                columns: columns,\n                directColor: directColor1,\n                facetStyle: facetStyle,\n                filter: filter,\n                hideAxes: hideAxes1,\n                hideLegend: hideLegend1,\n                scheme: scheme1,\n                signalValues: signalValues1,\n                size: size,\n                totalStyle: totalStyle,\n                transform: transform,\n                chart: chart1,\n                view: view1\n            };\n            const loaded = !!(this.state.columns && this.state.dataContent);\n            const selectionState = this.viewer && this.viewer.getSelection() || {};\n            const selectionSearch = selectionState && selectionState.search;\n            const columnMapProps = this.getColumnMapBaseProps();\n            const datas = {};\n            datas[(0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData] = this.state.dataContent && this.state.dataContent.data;\n            datas[(0, $99df88aa84de796a$export$f0297ce57faf7d71).FilteredData] = this.state.filteredData;\n            datas[(0, $99df88aa84de796a$export$f0297ce57faf7d71).SelectedData] = selectionState && selectionState.selectedData;\n            if (this.state.calculating) requestAnimationFrame(()=>{\n                //allow render to complete\n                if (this.state.calculating) {\n                    this.state.calculating();\n                    this.setState({\n                        calculating: null\n                    });\n                }\n            });\n            const theme = this.props.theme || \"\";\n            const themePalette = (0, $b61671d8f61aadb4$export$3465a0e7b289ab72)[theme];\n            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div) this.div = div;\n                },\n                className: (0, $a1d9524814b1e23a$exports).classList(\"sanddance-explorer\", this.props.theme)\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $f336667543fc9dad$export$1ca1e38143dcc152), {\n                collapseLabels: this.props.compactUI,\n                historyIndex: this.state.historyIndex,\n                historyItems: this.state.historyItems,\n                undo: ()=>this.undo(),\n                redo: ()=>this.redo(),\n                logoClickUrl: this.props.logoClickUrl,\n                logoClickTarget: this.props.logoClickTarget,\n                themePalette: themePalette,\n                loaded: loaded,\n                doDeselect: this.doDeselect.bind(this),\n                doFilter: this.doFilter.bind(this),\n                doUnfilter: this.doUnfilter.bind(this),\n                filter: this.state.filter,\n                selectionSearch: selectionSearch,\n                selectionState: selectionState,\n                buttons: this.props.topBarButtonProps,\n                view: this.state.view,\n                snapshots: this.state.snapshots,\n                onSnapshotPreviousClick: ()=>{\n                    let selectedSnapshotIndex;\n                    if (this.state.selectedSnapshotIndex === -1) selectedSnapshotIndex = this.state.snapshots.length - 1;\n                    else {\n                        selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n                        selectedSnapshotIndex--;\n                        if (selectedSnapshotIndex < 0) selectedSnapshotIndex = this.state.snapshots.length - 1;\n                    }\n                    this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n                },\n                onSnapshotClick: ()=>this.snapshotEditor.editSnapshot(),\n                onSnapshotNextClick: ()=>{\n                    let selectedSnapshotIndex;\n                    if (this.state.selectedSnapshotIndex === -1) selectedSnapshotIndex = 0;\n                    else {\n                        selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n                        selectedSnapshotIndex++;\n                        if (selectedSnapshotIndex > this.state.snapshots.length - 1) selectedSnapshotIndex = 0;\n                    }\n                    this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n                },\n                onViewClick: ()=>{\n                    const view = this.state.view === \"2d\" ? \"3d\" : \"2d\";\n                    this.changeInsight({\n                        view: view\n                    }, {\n                        label: view === \"2d\" ? (0, $0db66385c00a3f15$export$21c51bc433c16634).labelViewType2d : (0, $0db66385c00a3f15$export$21c51bc433c16634).labelViewType3d\n                    });\n                },\n                onHomeClick: ()=>this.viewer.presenter.homeCamera()\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: (0, $a1d9524814b1e23a$exports).classList(\"sanddance-main\", this.state.sidebarPinned && \"pinned\", this.state.sidebarClosed && \"closed\", (insight.hideLegend || insight.directColor || !$b935bf5e2863e486$var$colorMapping(insight, this.state.dataContent && this.state.dataContent.columns)) && \"hide-legend\")\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div && !this.layoutDivUnpinned) this.layoutDivUnpinned = div;\n                },\n                className: \"sanddance-layout-unpinned\"\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div && !this.layoutDivPinned) this.layoutDivPinned = div;\n                },\n                className: \"sanddance-layout-pinned\"\n            }), !loaded && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"loading\"\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Spinner, {\n                size: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.SpinnerSize.large,\n                label: (0, $0db66385c00a3f15$export$21c51bc433c16634).loading\n            })), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $31fcbd44e38b82f5$export$1ba59dacbcbf90fe), {\n                themePalette: themePalette,\n                calculating: !!this.state.calculating,\n                closed: this.state.sidebarClosed,\n                hideSidebarControls: this.props.hideSidebarControls,\n                pinned: this.state.sidebarPinned,\n                disabled: !loaded,\n                dataScopeProps: {\n                    themePalette: themePalette,\n                    compact: this.state.sidebarClosed,\n                    onCompactClick: ()=>{\n                        this.changeInsight({\n                            size: this.getLayoutDivSize(this.state.sidebarPinned, false)\n                        }, {\n                            label: null,\n                            omit: true\n                        }, {\n                            sidebarClosed: false\n                        });\n                    },\n                    dataSet: this.props.datasetElement,\n                    dataCount: loaded && {\n                        all: this.state.dataContent && this.state.dataContent.data.length,\n                        filtered: this.state.filteredData && this.state.filteredData.length,\n                        selected: selectionState && selectionState.selectedData && selectionState.selectedData.length\n                    },\n                    active: this.state.sideTabId === (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data,\n                    onDataScopeClick: (dataScopeId)=>this.setSideTabId((0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data, dataScopeId),\n                    selectedDataScope: this.state.dataScopeId,\n                    disabled: !loaded\n                },\n                onSideTabClick: (sideTabId)=>{\n                    //collapse or toggle\n                    if (sideTabId === (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Collapse || this.state.sideTabId === sideTabId) {\n                        let { dataScopeId: dataScopeId , sidebarClosed: sidebarClosed  } = this.state;\n                        if (sidebarClosed && sideTabId === (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data) dataScopeId = this.getBestDataScopeId();\n                        sidebarClosed = !this.state.sidebarClosed;\n                        this.changeInsight({\n                            size: this.getLayoutDivSize(this.state.sidebarPinned, sidebarClosed)\n                        }, {\n                            label: null,\n                            omit: true\n                        }, {\n                            dataScopeId: dataScopeId,\n                            sidebarClosed: sidebarClosed\n                        });\n                    } else if (sideTabId === (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Pin) this.changeInsight({\n                        size: this.getLayoutDivSize(!this.state.sidebarPinned, this.state.sidebarClosed)\n                    }, {\n                        label: null,\n                        omit: true\n                    }, {\n                        sidebarPinned: !this.state.sidebarPinned\n                    });\n                    else this.setSideTabId(sideTabId);\n                },\n                selectedSideTab: this.state.sideTabId\n            }, loaded && (()=>{\n                switch(this.state.sideTabId){\n                    case (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).ChartType:\n                        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $247884a4197e9da6$export$acaa6426d77a227e), Object.assign({\n                            collapseLabels: this.props.compactUI,\n                            tooltipExclusions: this.state.tooltipExclusions,\n                            toggleTooltipExclusion: (columnName)=>{\n                                const tooltipExclusions = [\n                                    ...this.state.tooltipExclusions\n                                ];\n                                const i = tooltipExclusions.indexOf(columnName);\n                                if (i < 0) tooltipExclusions.push(columnName);\n                                else tooltipExclusions.splice(i, 1);\n                                this.setState({\n                                    tooltipExclusions: tooltipExclusions\n                                });\n                                this.props.onTooltipExclusionsChanged && this.props.onTooltipExclusionsChanged(tooltipExclusions);\n                            },\n                            disabled: !loaded || this.state.sidebarClosed\n                        }, columnMapProps, {\n                            chart: this.state.chart,\n                            view: this.state.view,\n                            onChangeChartType: (chart)=>this.changeChartType(chart),\n                            insightColumns: this.state.columns,\n                            onChangeSignal: (role, column, name, value)=>(0, $b16b30fb0ba8a026$export$c2992dc6411becf6)(this.prefs, this.state.chart, role, column, name, value)\n                        }));\n                    case (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Color:\n                        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $0db948ac6e4b75cc$export$892596cec99bc70e), Object.assign({\n                            compactUI: this.props.compactUI,\n                            specCapabilities: this.state.specCapabilities,\n                            disabled: !loaded || this.state.sidebarClosed\n                        }, columnMapProps, {\n                            dataContent: this.state.dataContent,\n                            scheme: this.state.scheme,\n                            colorBin: this.state.colorBin,\n                            colorBinSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s)=>s.name === (0, $3b509b9541e52a8f$exports).constants.SignalNames.ColorBinCount)[0],\n                            colorReverseSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s)=>s.name === (0, $3b509b9541e52a8f$exports).constants.SignalNames.ColorReverse)[0],\n                            colorColumn: this.state.columns.color,\n                            onColorBinChange: (colorBin)=>{\n                                this.ignoreSelectionChange = true;\n                                this.viewer.deselect().then(()=>{\n                                    this.ignoreSelectionChange = false;\n                                    //allow deselection to render\n                                    requestAnimationFrame(()=>{\n                                        this.getColorContext = null;\n                                        this.changeInsight({\n                                            colorBin: colorBin\n                                        }, {\n                                            label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryColorBin\n                                        });\n                                        (0, $b16b30fb0ba8a026$export$a14483004c11686f)(this.prefs, this.state.chart, \"color\", this.state.columns.color, {\n                                            colorBin: colorBin\n                                        });\n                                    });\n                                });\n                            },\n                            onColorSchemeChange: (scheme)=>{\n                                this.changeColumnMapping(\"color\", this.state.dataContent.columns.filter((c)=>c.name === this.state.columns.color)[0], {\n                                    scheme: scheme\n                                });\n                                (0, $b16b30fb0ba8a026$export$a14483004c11686f)(this.prefs, this.state.chart, \"color\", this.state.columns.color, {\n                                    scheme: scheme\n                                });\n                            },\n                            onColorBinCountChange: (value)=>{\n                                const signalValues = {};\n                                signalValues[(0, $3b509b9541e52a8f$exports).constants.SignalNames.ColorBinCount] = value;\n                                (0, $b16b30fb0ba8a026$export$a14483004c11686f)(this.prefs, this.state.chart, \"color\", this.state.columns.color, {\n                                    signalValues: signalValues\n                                });\n                            },\n                            onColorReverseChange: (value)=>{\n                                this.getColorContext = null;\n                            },\n                            directColor: this.state.directColor,\n                            onDirectColorChange: (directColor)=>{\n                                this.changeInsight({\n                                    directColor: directColor\n                                }, {\n                                    label: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelHistoryDirectColor\n                                }, {\n                                    calculating: ()=>this._resize()\n                                });\n                            }\n                        }));\n                    case (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data:\n                        {\n                            const data = datas[this.state.dataScopeId];\n                            let itemVisible = true;\n                            switch(this.state.dataScopeId){\n                                case (0, $99df88aa84de796a$export$f0297ce57faf7d71).AllData:\n                                    {\n                                        const item = this.state.selectedItemIndex[this.state.dataScopeId];\n                                        itemVisible = this.state.dataContent && !this.state.filteredData || this.state.filteredData.indexOf(data[item]) >= 0;\n                                    }\n                            }\n                            return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $0829079b3c747bdc$export$1ce2294f62fa7154), {\n                                explorer: this,\n                                theme: this.props.theme,\n                                themePalette: themePalette,\n                                disabled: !loaded || this.state.sidebarClosed,\n                                columns: this.state.dataContent && this.state.dataContent.columns,\n                                data: data,\n                                displayName: this.state.dataFile && this.state.dataFile.displayName || (0, $0db66385c00a3f15$export$21c51bc433c16634).defaultFileName,\n                                nullMessage: $b935bf5e2863e486$var$dataBrowserNullMessages[this.state.dataScopeId],\n                                zeroMessage: $b935bf5e2863e486$var$dataBrowserZeroMessages[this.state.dataScopeId],\n                                index: this.state.selectedItemIndex[this.state.dataScopeId],\n                                itemVisible: itemVisible,\n                                dataExportHandler: this.props.dataExportHandler,\n                                selectedDataScope: this.state.dataScopeId,\n                                onDataScopeClick: (dataScopeId)=>this.setSideTabId((0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Data, dataScopeId),\n                                onActivate: (row, index)=>{\n                                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                                    selectedItemIndex[this.state.dataScopeId] = index;\n                                    this.setState({\n                                        selectedItemIndex: selectedItemIndex\n                                    });\n                                    this.silentActivation(row);\n                                },\n                                onSearch: (e, search)=>{\n                                    if (e.ctrlKey) this.setState({\n                                        sideTabId: (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Search,\n                                        search: search\n                                    });\n                                    else this.doSelect(search);\n                                },\n                                bingSearchDisabled: this.props.bingSearchDisabled\n                            });\n                        }\n                    case (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Search:\n                        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $fd0d652c33ef4e65$export$4b85d3515bd863a5), {\n                            explorer: this,\n                            collapseLabels: this.props.compactUI,\n                            themePalette: themePalette,\n                            disabled: !loaded || this.state.sidebarClosed,\n                            disableGroupOR: this.props.searchORDisabled,\n                            disableExpressionOR: this.props.searchORDisabled,\n                            initializer: {\n                                columns: columnMapProps.allColumns,\n                                search: this.state.search\n                            },\n                            autoCompleteDistinctValues: this.state.autoCompleteDistinctValues,\n                            onSelect: (expr)=>this.doSelect(expr),\n                            data: this.state.dataContent.data\n                        });\n                    case (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Snapshots:\n                        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $3465068850534ed3$export$3e09886744a57615), Object.assign({}, this.props.snapshotProps, {\n                            editor: this.snapshotEditor,\n                            themePalette: themePalette,\n                            explorer: this,\n                            snapshots: this.state.snapshots,\n                            selectedSnapshotIndex: this.state.selectedSnapshotIndex,\n                            onClearSnapshots: ()=>{\n                                const snapshots = [];\n                                this.setState({\n                                    snapshots: snapshots,\n                                    selectedSnapshotIndex: -1\n                                });\n                                this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                            },\n                            onWriteSnapshot: (s, i)=>this.writeSnapshot(s, i),\n                            onRemoveSnapshot: (i)=>{\n                                const snapshots = [\n                                    ...this.state.snapshots\n                                ];\n                                snapshots.splice(i, 1);\n                                let { selectedSnapshotIndex: selectedSnapshotIndex  } = this.state;\n                                if (i === selectedSnapshotIndex) selectedSnapshotIndex = -1;\n                                else if (selectedSnapshotIndex > i) selectedSnapshotIndex--;\n                                this.setState({\n                                    snapshots: snapshots,\n                                    selectedSnapshotIndex: selectedSnapshotIndex\n                                });\n                                this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                            },\n                            onSnapshotClick: (snapshot, selectedSnapshotIndex)=>{\n                                this.setState({\n                                    selectedSnapshotIndex: selectedSnapshotIndex\n                                });\n                                this.calculate(()=>{\n                                    this.handleReviveSnapshot(snapshot, selectedSnapshotIndex);\n                                });\n                            },\n                            onMoveUp: (i)=>{\n                                if (i > 0) {\n                                    const snapshots = [\n                                        ...this.state.snapshots\n                                    ];\n                                    const temp = snapshots[i - 1];\n                                    snapshots[i - 1] = snapshots[i];\n                                    snapshots[i] = temp;\n                                    let { selectedSnapshotIndex: selectedSnapshotIndex  } = this.state;\n                                    if (i === selectedSnapshotIndex) selectedSnapshotIndex = i - 1;\n                                    else if (i - 1 === selectedSnapshotIndex) selectedSnapshotIndex = i;\n                                    this.setState({\n                                        snapshots: snapshots,\n                                        selectedSnapshotIndex: selectedSnapshotIndex\n                                    });\n                                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                }\n                            },\n                            onMoveDown: (i)=>{\n                                if (i < this.state.snapshots.length - 1) {\n                                    const snapshots = [\n                                        ...this.state.snapshots\n                                    ];\n                                    const temp = snapshots[i + 1];\n                                    snapshots[i + 1] = snapshots[i];\n                                    snapshots[i] = temp;\n                                    let { selectedSnapshotIndex: selectedSnapshotIndex  } = this.state;\n                                    if (i === selectedSnapshotIndex) selectedSnapshotIndex = i + 1;\n                                    else if (i + 1 === selectedSnapshotIndex) selectedSnapshotIndex = i;\n                                    this.setState({\n                                        snapshots: snapshots,\n                                        selectedSnapshotIndex: selectedSnapshotIndex\n                                    });\n                                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                }\n                            }\n                        }));\n                    case (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).History:\n                        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $0820350effaa56a9$export$84202caead5689ba), {\n                            explorer: this,\n                            theme: theme,\n                            themePalette: themePalette,\n                            historyIndex: this.state.historyIndex,\n                            historyItems: this.state.historyItems,\n                            redo: (i)=>this.redo(i)\n                        });\n                    case (0, $a4811b1c86ed19fa$export$f3b7566ffe363e3b).Settings:\n                        return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $4805700d8b417596$export$c72f6eaae7b9adff), {\n                            explorer: this,\n                            dataFile: this.state.dataFile,\n                            scheme: this.state.scheme,\n                            hideLegend: this.state.hideLegend,\n                            onToggleLegend: (hideLegend)=>this.setState({\n                                    hideLegend: hideLegend,\n                                    calculating: ()=>this._resize()\n                                }),\n                            hideAxes: this.state.hideAxes,\n                            onToggleAxes: (hideAxes)=>this.setState({\n                                    calculating: ()=>this.setState({\n                                            hideAxes: hideAxes\n                                        })\n                                }),\n                            additionalSettings: this.props.additionalSettings\n                        }, this.props.systemInfoChildren);\n                }\n            })()), loaded && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-view\"\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $81745c046077d503$export$441ac54c4cda559d), {\n                renderOptions: {\n                    rebaseFilter: ()=>{\n                        const { rebaseFilter: rebaseFilter  } = this;\n                        if (rebaseFilter) this.rebaseFilter = false;\n                        return rebaseFilter;\n                    },\n                    initialColorContext: this.getColorContext && this.getColorContext(this.viewer.insight, insight),\n                    discardColorContextUpdates: ()=>this.discardColorContextUpdates\n                },\n                viewerOptions: this.viewerOptions,\n                ref: (reactViewer)=>{\n                    if (reactViewer) this.viewer = reactViewer.viewer;\n                },\n                onView: (renderResult)=>{\n                    this.changespecCapabilities(renderResult.specResult.errors ? renderResult.specResult.specCapabilities : this.viewer.specCapabilities);\n                    this.getColorContext = (oldInsight, newInsight)=>{\n                        if (!oldInsight && !newInsight) return null;\n                        if (!oldInsight || !newInsight) return null;\n                        if (oldInsight.scheme !== newInsight.scheme) return null;\n                        if (oldInsight.columns.color !== newInsight.columns.color) return null;\n                        if (oldInsight.directColor != newInsight.directColor) return null;\n                        return this.viewer.colorContexts && this.viewer.colorContexts[this.viewer.currentColorContext];\n                    };\n                    //don't allow tabbing to the canvas\n                    (0, $29728562a99c68a2$export$95ea862e038e2d34)(this.viewer);\n                    this.props.onView && this.props.onView();\n                },\n                onError: (e)=>{\n                    this.props.onError && this.props.onError(e);\n                },\n                data: this.state.dataContent.data,\n                insight: insight,\n                onMount: (el)=>this.viewerMounted(el)\n            }), this.state.note && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-note\"\n            }, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $adfb025456b8f57f$export$c25acd513dcc8062), {\n                className: \"cancel\",\n                themePalette: themePalette,\n                title: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonClose,\n                iconName: \"Cancel\",\n                onClick: ()=>this.setState({\n                        note: null\n                    })\n            }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", null, this.state.note))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $5453c8de1a3cb6b6$export$3ddf2d174ce01153), {\n                title: (0, $0db66385c00a3f15$export$21c51bc433c16634).labelError,\n                hidden: !this.state.errors,\n                onDismiss: ()=>{\n                    this.setState({\n                        errors: null\n                    });\n                }\n            }, this.state.errors && this.state.errors.map((error, i)=>(0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    key: i\n                }, error))), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $555bb845cf8689db$export$15b376344cc89d12), Object.assign({\n                ref: (se)=>this.snapshotEditor = se\n            }, this.props.snapshotProps, {\n                explorer: this,\n                onWriteSnapshot: (s, i)=>this.writeSnapshot(s, i),\n                theme: this.props.theme,\n                themePalette: themePalette\n            }))), this.state.positionedColumnMapProps && (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $1f0c6e0f0abb4f2d$export$3e341bd56774d659), Object.assign({}, this.state.positionedColumnMapProps)));\n        }\n        getColumnMapBaseProps() {\n            const allColumns = this.state.dataContent && this.state.dataContent.columns.filter((c)=>!(0, $3b509b9541e52a8f$exports).util.isInternalFieldName(c.name, true));\n            const quantitativeColumns = allColumns && allColumns.filter((c)=>c.quantitative);\n            const categoricalColumns = allColumns && allColumns.filter((c)=>!c.quantitative);\n            const props = {\n                changeColumnMapping: (role, columnOrRole, defaultColumn, options)=>{\n                    let column;\n                    if (typeof columnOrRole === \"string\") {\n                        //look up current insight\n                        const columnName = this.state.columns[columnOrRole];\n                        column = allColumns.filter((c)=>c.name === columnName)[0] || defaultColumn;\n                    } else column = columnOrRole;\n                    this.changeColumnMapping(role, column, options);\n                },\n                facetStyle: this.state.facetStyle,\n                totalStyle: this.state.totalStyle,\n                allColumns: allColumns,\n                quantitativeColumns: quantitativeColumns,\n                categoricalColumns: categoricalColumns,\n                specCapabilities: this.state.specCapabilities,\n                explorer: this\n            };\n            return props;\n        }\n    }\n    return new __Explorer(props1);\n}\nconst $b935bf5e2863e486$export$43584986cb77a794 = $b935bf5e2863e486$var$_Explorer;\nfunction $b935bf5e2863e486$var$colorMapping(insight, columns) {\n    if (columns && insight.columns && insight.columns.color) return columns.filter((c)=>c.name === insight.columns.color)[0];\n}\n\n\n\nconst $8535c575077b9670$export$e2253033e6e1df16 = {\n    fluentUI: null,\n    react: null,\n    reactDOM: null\n};\nfunction $8535c575077b9670$export$1f96ae73734a86cc(fluentUI, react, reactDOM, vega, deck, layers, luma) {\n    (0, $de8134d48126c751$export$1f96ae73734a86cc)(react, reactDOM, vega, deck, layers, luma);\n    $8535c575077b9670$export$e2253033e6e1df16.fluentUI = fluentUI;\n    $8535c575077b9670$export$e2253033e6e1df16.react = react;\n    $8535c575077b9670$export$e2253033e6e1df16.reactDOM = reactDOM;\n    //inform React that we are using a dynamic base class\n    (0, $247884a4197e9da6$export$acaa6426d77a227e).prototype = react.Component.prototype;\n    (0, $e98d3084b701f145$export$b1b568728c48eba1).prototype = react.Component.prototype;\n    (0, $b935bf5e2863e486$export$43584986cb77a794).prototype = react.Component.prototype;\n    (0, $1f0c6e0f0abb4f2d$export$3e341bd56774d659).prototype = react.Component.prototype;\n    (0, $fd0d652c33ef4e65$export$4b85d3515bd863a5).prototype = react.Component.prototype;\n    (0, $555bb845cf8689db$export$15b376344cc89d12).prototype = react.Component.prototype;\n    (0, $3465068850534ed3$export$3e09886744a57615).prototype = react.Component.prototype;\n    (0, $4805700d8b417596$export$c72f6eaae7b9adff).prototype = react.Component.prototype;\n}\n\n\n\nfunction $5453c8de1a3cb6b6$export$3ddf2d174ce01153(props) {\n    return (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.Dialog, Object.assign({}, props, {\n        dialogContentProps: Object.assign({\n            type: (0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DialogType.normal,\n            title: props.title\n        }, props.dialogContentProps)\n    }), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement(\"div\", {\n        onKeyUp: (e)=>{\n            e.nativeEvent.stopImmediatePropagation();\n        }\n    }, props.children), (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DialogFooter, null, props.buttons, (0, $8535c575077b9670$export$e2253033e6e1df16).react.createElement((0, $8535c575077b9670$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n        iconProps: {\n            iconName: \"Cancel\"\n        },\n        onClick: props.onDismiss,\n        text: (0, $0db66385c00a3f15$export$21c51bc433c16634).buttonClose\n    })));\n}\n\n\n$parcel$exportWildcard($b3059ab4f8ea4207$exports, $5453c8de1a3cb6b6$exports);\n\n\n\n\n\n\n\n\n\n\n$parcel$exportWildcard($87e8ab1064b645b0$exports, $b935bf5e2863e486$exports);\n\n\nwindow.SandDanceExplorer = $87e8ab1064b645b0$exports;\n\n})();\n"
  },
  {
    "path": "docs/dist/sanddance-explorer/v4/sanddance-explorer.css",
    "content": ".sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%;\n}\n\n.sanddance-gl {\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%);\n}\n\n.sanddance-gl canvas {\n  outline: none;\n}\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em;\n}\n\n.sanddance-legend table {\n  border-collapse: collapse;\n}\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em;\n}\n\n.sanddance-legend .legend-row {\n  cursor: pointer;\n}\n\n.sanddance-legend .legend-row td {\n  padding: 2px;\n}\n\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef;\n}\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px;\n}\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n.sanddance-details {\n  font-size: smaller;\n}\n\n.sanddance-details-scroll {\n  padding-bottom: 1em;\n}\n\n.sanddance-tooltip {\n  z-index: 1;\n}\n\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute;\n}\n\n.sanddance-tooltip td {\n  max-width: 16em;\n  overflow: hidden;\n  text-align: left;\n  text-overflow: ellipsis;\n  vertical-align: top;\n  width: 75%;\n}\n\n.sanddance-tooltip td:first-child {\n  width: 25%;\n}\n\n\n.sanddance-scheme.disabled {\n  filter: grayscale(95%);\n}\n.sanddance-scheme.option {\n  display: grid;\n  grid-template-columns: 10em auto;\n  width: 100%;\n}\n.sanddance-scheme.title {\n  justify-content: flex-start;\n}\n.sanddance-scheme span {\n  align-self: center;\n}\n.sanddance-scheme svg, .sanddance-scheme .swatch {\n  align-self: center;\n  border: thin solid #777;\n  height: 24px;\n}\n.sanddance-scheme svg {\n  width: 100%;\n}\n.sanddance-scheme .swatch div {\n  display: inline-block;\n  width: 10px;\n  height: 24px;\n}\n\n.sanddance-explorer-topbar {\n  background-color: #fff;\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: 300px auto;\n  height: 36px;\n}\n.sanddance-explorer-topbar .logo {\n  color: rgb(0, 120, 212);\n  display: grid;\n  grid-template-columns: 50px auto;\n  padding: 6px 0;\n}\n.sanddance-explorer-topbar .logo svg {\n  fill: rgb(0, 120, 212);\n  height: 24px;\n  margin: 0 auto;\n  width: 24px;\n}\n.sanddance-explorer-topbar .logo a {\n  color: inherit;\n  font-size: 14px;\n  font-weight: bold;\n  line-height: 24px;\n  text-decoration: none;\n}\n\n.sanddance-explorer-commandbar {\n  position: relative;\n}\n.sanddance-explorer-commandbar > div {\n  left: 0;\n  position: absolute;\n  right: 0;\n}\n.sanddance-explorer-commandbar .ms-CommandBar {\n  height: 36px;\n}\n\n.dark-theme .sanddance-explorer-topbar {\n  background-color: #000;\n}\n.dark-theme .sanddance-explorer-topbar .logo {\n  color: #00b4f0;\n}\n\n.sanddance-group {\n  border-top: 1px solid #ccc;\n  padding-bottom: 1.5em;\n  position: relative;\n}\n.sanddance-group .group-head {\n  display: grid;\n  grid-template-columns: auto auto;\n  line-height: 16px;\n  margin: 1em 0;\n}\n.sanddance-group .group-head label {\n  font-size: 11px;\n  font-weight: 600;\n  letter-spacing: 3px;\n  opacity: 0.8;\n  text-transform: uppercase;\n}\n.sanddance-group .group-head .count {\n  color: #333;\n  font-size: 12px;\n  text-align: right;\n}\n.sanddance-group .group-icon {\n  position: absolute;\n  top: -1px;\n  right: 0;\n}\n.sanddance-group:first-child {\n  border-top: none;\n}\n.sanddance-group:first-child .group-head {\n  margin-top: 0;\n}\n.sanddance-group:last-child {\n  padding-bottom: 0;\n}\n\n.sanddance-sidebar {\n  background-color: #f9f9f9;\n  display: grid;\n  overflow: hidden;\n  position: relative;\n  transition: width 350ms cubic-bezier(0.4, 0, 0.2, 1);\n  width: 300px;\n}\n.sanddance-sidebar:not(.pinned) {\n  bottom: 0;\n  position: absolute;\n  top: 0;\n}\n.sanddance-sidebar .sidebar-content {\n  background-color: inherit;\n  display: grid;\n  grid-template-areas: \"stats stats\" \"tabs bar\";\n  grid-template-columns: 50px auto;\n  grid-template-rows: 0fr auto;\n  height: 100%;\n  overflow: hidden;\n  position: absolute;\n  z-index: 1;\n}\n.sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.1);\n  display: grid;\n  grid-area: tabs;\n  grid-template-rows: auto 0fr;\n  position: relative;\n}\n.sanddance-sidebar .vbutton {\n  align-self: center;\n  display: grid;\n  height: 60px;\n}\n.sanddance-sidebar .vbutton.selected {\n  background-color: #f9f9f9;\n}\n.sanddance-sidebar .vbutton button {\n  height: 100%;\n  width: 100%;\n}\n.sanddance-sidebar .vbutton button .ms-Button-icon {\n  font-size: 20px;\n}\n.sanddance-sidebar .sidebar-dialogs .vbutton {\n  height: 16.6666666667%;\n  max-height: 60px;\n  min-height: 32px;\n}\n.sanddance-sidebar .scrollable-container {\n  width: 250px;\n}\n.sanddance-sidebar .sidetab {\n  grid-area: bar;\n  padding: 12px;\n}\n.sanddance-sidebar.closed {\n  width: 50px;\n}\n.sanddance-sidebar.calculator .calculating {\n  background: rgba(249, 249, 249, 0.5);\n  height: 100%;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.sanddance-sidebar.calculator .ms-Spinner {\n  margin-top: -16px;\n  position: relative;\n  top: 50%;\n}\n\n.dark-theme .sanddance-sidebar {\n  background-color: #272727;\n  color: #fff;\n}\n.dark-theme .sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n.dark-theme .sanddance-sidebar .vbutton.selected {\n  background-color: #272727;\n}\n.dark-theme .sanddance-sidebar.calculator .calculating {\n  background: rgba(39, 39, 39, 0.5);\n}\n\n.sanddance-chart-type .ms-ChoiceFieldGroup-flexContainer {\n  display: grid;\n  grid-template-columns: repeat(2, 50%);\n  grid-auto-flow: column;\n  grid-template-rows: repeat(4, auto);\n}\n\n.sanddance-datascope {\n  grid-area: stats;\n  background-color: rgba(0, 0, 0, 0.05);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n  min-height: 5em;\n}\n.sanddance-datascope.extended > div {\n  margin: 12px;\n  width: 276px;\n}\n.sanddance-datascope label {\n  display: block;\n  font-size: 10px;\n  text-transform: uppercase;\n}\n.sanddance-datascope.compact {\n  align-self: center;\n  cursor: pointer;\n  display: grid;\n  text-align: center;\n  width: 50px;\n}\n.sanddance-datascope.compact > div {\n  align-self: center;\n}\n.sanddance-datascope .datascope-button {\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  box-sizing: border-box;\n  height: 36px;\n  min-width: unset;\n  width: 33.333%;\n}\n.sanddance-datascope .datascope-button:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n.sanddance-datascope .datascope-button label {\n  cursor: inherit;\n}\n.sanddance-datascope.active .datascope-button.selected {\n  border-color: rgb(0, 120, 212);\n}\n\n.dark-theme .sanddance-datascope {\n  background-color: rgba(0, 0, 0, 0.3);\n  border-bottom-color: rgba(255, 255, 255, 0.1);\n}\n.dark-theme .sanddance-datascope .datascope-button {\n  background-color: #000;\n  border-color: rgba(255, 255, 255, 0.2);\n  color: #fff;\n}\n.dark-theme .sanddance-datascope .datascope-button:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-dataItem {\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.sanddance-dataItem .name-value {\n  border-top: 1px solid #ddd;\n  cursor: pointer;\n  padding: 4px;\n  position: relative;\n  word-break: break-all;\n}\n.sanddance-dataItem .name-value:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n.sanddance-dataItem .name-value:first-child {\n  border-top: none;\n}\n.sanddance-dataItem .column-name {\n  font-weight: 500;\n}\n.sanddance-dataItem .column-value {\n  max-height: 20em;\n  overflow: auto;\n}\n.sanddance-dataItem .bing-search {\n  text-align: right;\n}\n\n.dark-theme .sanddance-dataItem {\n  background-color: #000;\n  border-color: #222;\n}\n.dark-theme .sanddance-dataItem .name-value {\n  border-top-color: #222;\n}\n.dark-theme .sanddance-dataItem a {\n  color: #00b4f0;\n}\n\n.sanddance-dataIndex .index {\n  display: grid;\n  grid-template-columns: 32px auto 32px;\n  line-height: 32px;\n  margin: 0px -8px 6px -8px;\n  text-align: center;\n}\n.sanddance-dataIndex .item-filtered {\n  background-color: rgba(0, 0, 0, 0.1);\n  font-size: 10px;\n  padding: 2px 4px;\n  text-transform: uppercase;\n}\n.sanddance-dataIndex .ms-Dropdown-container {\n  margin-bottom: 0.5em;\n}\n.sanddance-dataIndex button {\n  margin-top: 1em;\n}\n\n.scrollable-container {\n  display: grid;\n  min-height: 200px;\n  position: relative;\n}\n\n.scrollable {\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  right: 0;\n  overflow-y: auto;\n  top: 0;\n}\n\n.sanddance-search .sanddance-search-group {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n}\n.sanddance-search .sanddance-search-group {\n  background: #fff;\n  margin-top: 1em;\n  padding: 4px;\n}\n.sanddance-search .sanddance-search-group:first-child {\n  margin-top: 0;\n}\n.sanddance-search .sanddance-search-expression {\n  background-color: rgba(0, 0, 0, 0.1);\n  margin: 12px 4px;\n  padding: 4px 8px 8px 8px;\n}\n.sanddance-search .search-action {\n  width: 100%;\n}\n.sanddance-search .search-bottom-action {\n  margin-top: 1em;\n}\n.sanddance-search .search-field {\n  margin-top: 4px;\n}\n\n.dark-theme .sanddance-search .sanddance-search-group {\n  border-color: rgba(255, 255, 255, 0.2);\n  background: #000;\n}\n.dark-theme .sanddance-search .sanddance-search-expression {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-snapshots .ms-Button {\n  margin-bottom: 0.5em;\n}\n.sanddance-snapshots .snapshot {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  cursor: pointer;\n  margin-bottom: 0.5em;\n  padding: 5px;\n}\n.sanddance-snapshots .snapshot.selected {\n  border-color: rgba(0, 0, 0, 0.6);\n  border-width: 2px;\n  padding: 4px;\n}\n.sanddance-snapshots .snapshot:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n.sanddance-snapshots .snapshot:first-child {\n  margin-top: 0.5em;\n}\n.sanddance-snapshots .title {\n  font-weight: 500;\n  word-break: break-word;\n}\n.sanddance-snapshots .description {\n  font-weight: 100;\n  word-break: break-word;\n}\n.sanddance-snapshots .thumbnail {\n  display: grid;\n  height: 160px;\n  margin-top: 0.5em;\n}\n.sanddance-snapshots img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n.sanddance-snapshots .actions {\n  display: grid;\n  grid-auto-flow: column;\n}\n.sanddance-snapshots .actions a, .sanddance-snapshots .actions span {\n  align-self: center;\n  text-align: center;\n}\n.sanddance-snapshots .actions button {\n  width: 100%;\n}\n\n.sanddance-snapshot-dialog .thumbnail {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  display: grid;\n  height: 300px;\n  margin-top: 1em;\n}\n.sanddance-snapshot-dialog img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n\n.dark-theme .sanddance-snapshots .snapshot {\n  background-color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n.dark-theme .sanddance-snapshots .snapshot.selected {\n  border-color: rgba(255, 255, 255, 0.6);\n}\n.dark-theme .sanddance-snapshots .snapshot:hover {\n  background-color: rgb(0, 0, 0);\n}\n.dark-theme .sanddance-snapshots .actions a {\n  color: #fff;\n}\n.dark-theme.sanddance-snapshot-dialog .thumbnail {\n  border-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-history ol {\n  padding-left: 20px;\n}\n.sanddance-history li {\n  border: 1px solid transparent;\n  cursor: pointer;\n}\n.sanddance-history li.selected {\n  font-weight: bold;\n}\n\n.sanddance-history-button {\n  background: none;\n  border: 0;\n  font-size: inherit;\n  font-style: inherit;\n  font-weight: inherit;\n  height: unset;\n  padding: 3px 4px;\n  text-align: left;\n  width: 100%;\n}\n.sanddance-history-button .ms-Button-label {\n  display: inline;\n  font-weight: inherit;\n  margin: 0;\n}\n\n.sanddance-note {\n  background-color: #fffacd;\n  border: 1px solid #333;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  color: #333;\n  margin: 1em;\n  padding: 20px;\n  position: absolute;\n  width: 15em;\n  word-break: break-word;\n}\n.sanddance-note .cancel {\n  position: absolute;\n  right: -1px;\n  top: -1px;\n}\n.sanddance-note .cancel i {\n  color: #333;\n}\n\n.sanddance-columnMap {\n  position: relative;\n}\n.sanddance-columnMap .ms-Dropdown-container {\n  margin-top: 10px;\n}\n.sanddance-columnMap .column-options {\n  bottom: 3px;\n  position: absolute;\n  right: 0;\n}\n\n.sanddance-columnMap-absolute {\n  margin-bottom: 1em;\n  margin-left: -4em;\n  margin-right: 1em;\n  margin-top: -1em;\n}\n.sanddance-columnMap-absolute .ms-Dropdown-container {\n  margin-top: 0;\n}\n\n.sanddance-tooltip {\n  z-index: 2;\n}\n\n.sanddance-chart-button {\n  display: block;\n  margin-top: 10px;\n}\n\n.sanddance-columnTypes {\n  max-height: 20em;\n  overflow: scroll;\n}\n.sanddance-columnTypes th, .sanddance-columnTypes td {\n  padding: 0 5px;\n}\n.sanddance-columnTypes td, .sanddance-columnTypes button {\n  height: 18px;\n}\n.sanddance-columnTypes tr.changed {\n  text-decoration: line-through;\n}\n\n.sanddance-dialog ul {\n  margin: 0;\n}\n.sanddance-dialog section {\n  margin-top: 1em;\n}\n.sanddance-dialog section:first-child {\n  margin-top: 0;\n}\n.sanddance-dialog .tip {\n  font-style: italic;\n}\n\n.sanddance-explorer {\n  display: grid;\n  font-family: \"Segoe UI\", sans-serif;\n  font-size: 13px;\n  grid-template-rows: 0fr auto;\n}\n.sanddance-explorer.dark-theme {\n  background-color: black;\n}\n.sanddance-explorer.dark-theme canvas {\n  background-color: black;\n}\n\n.sanddance-main {\n  display: grid;\n  position: relative;\n  transition: grid-template-columns 350ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.sanddance-main .loading {\n  grid-row-end: span 2;\n  position: relative;\n}\n.sanddance-main .loading .ms-Spinner {\n  position: absolute;\n  top: 50%;\n  width: 100%;\n}\n.sanddance-main .sanddance-view {\n  display: grid;\n  position: relative;\n  margin-left: 50px;\n}\n.sanddance-main .sanddance-layout-unpinned, .sanddance-main .sanddance-layout-pinned {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n.sanddance-main.hide-legend .sanddance-layout-unpinned, .sanddance-main.hide-legend .sanddance-layout-pinned {\n  right: 0;\n}\n.sanddance-main .sanddance-layout-pinned {\n  left: 300px;\n}\n.sanddance-main .sanddance-ReactViewer {\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n}\n.sanddance-main.hide-legend .sanddance-ReactViewer {\n  left: 0;\n}\n.sanddance-main.show-center .sanddance-layout-unpinned, .sanddance-main.show-center .sanddance-layout-pinned {\n  background: linear-gradient(to right, transparent 49%, rgba(255, 0, 255, 0.2), transparent 51%);\n  background-color: rgba(0, 255, 255, 0.1);\n}\n.sanddance-main.pinned {\n  grid-template-columns: 300px auto;\n  grid-template-areas: \"side main\";\n}\n.sanddance-main.pinned .sanddance-view {\n  grid-area: main;\n  margin-left: 0;\n}\n.sanddance-main.pinned .loading {\n  grid-area: main;\n  grid-row-end: unset;\n}\n.sanddance-main.pinned .sanddance-slidePanel {\n  grid-area: side;\n}\n.sanddance-main.pinned.closed {\n  grid-template-columns: 0 auto;\n}\n.sanddance-main.pinned.closed .sanddance-view {\n  margin-left: 50px;\n}\n.sanddance-main span.ms-layer {\n  display: none;\n}\n\n.sanddance-advanced-renderer {\n  height: 36px;\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 40px;\n}\n\n.sanddance-renderer-dialog ul {\n  list-style-type: none;\n  padding-left: 2em;\n}\n\n.sanddance-background-image-dialog {\n  min-width: 32em;\n}\n.sanddance-background-image-dialog .thumbnail {\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: auto auto;\n  padding-bottom: 1em;\n}\n.sanddance-background-image-dialog .thumbnail > * {\n  align-self: center;\n}\n.sanddance-background-image-dialog .thumbnail img {\n  margin-right: 1em;\n  max-height: 160px;\n  max-width: 16em;\n  object-fit: contain;\n}\n.sanddance-background-image-dialog .axis-bounds {\n  border-bottom: 1px solid #ccc;\n  padding-bottom: 1em;\n}\n.sanddance-background-image-dialog .axis-bound-fields {\n  display: grid;\n  column-gap: 1em;\n  grid-template-columns: auto auto;\n  margin-bottom: 1em;\n}\n\n#sanddance-vega-spec {\n  border: 1px inset;\n  max-height: 20em;\n  overflow: scroll;\n}\n\n.sanddance-panel {\n  top: 5em;\n  bottom: unset;\n  overflow-y: unset;\n  padding-right: 1em;\n  padding-top: 32px;\n}\n.sanddance-panel h4,\n.sanddance-panel .sanddance-vegaControls,\n.sanddance-panel .sanddance-unitControls {\n  display: none;\n}\n\n.sanddance-main.hide-legend .sanddance-panel {\n  display: none;\n}\n\n.sanddance-panel-tools {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n\n.sanddance-legend {\n  min-width: 54px;\n}\n\n.sanddance-explanation {\n  font-size: smaller;\n  font-style: italic;\n  margin-bottom: 1em;\n}\n.sanddance-explanation .fieldname,\n.sanddance-explanation .fieldtype {\n  font-style: italic;\n}\n\n.sanddance-signal {\n  margin-top: 1em;\n}\n\n.sanddance-legend th {\n  color: #005a9e;\n  cursor: pointer;\n}\n.sanddance-legend th:hover {\n  background-color: rgba(43, 136, 216, 0.3333333333);\n}\n.sanddance-legend .legend-row:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-form-separate {\n  margin-top: 1em;\n}\n\n.dark-theme .sanddance-dialog a {\n  color: #00b4f0;\n}\n.dark-theme .sanddance-panel {\n  background-color: #000;\n  color: #fff;\n}\n.dark-theme .sanddance-legend th {\n  color: #3ac5f3;\n}\n.dark-theme .sanddance-legend th:hover {\n  color: #009ed3;\n}\n\n/*# sourceMappingURL=sanddance-explorer.css.map */\n"
  },
  {
    "path": "docs/dist/sanddance-explorer/v4/sanddance-explorer.js",
    "content": "(() => {\n\nfunction $parcel$export(e, n, v, s) {\n  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\nfunction $parcel$exportWildcard(dest, source) {\n  Object.keys(source).forEach(function(key) {\n    if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) {\n      return;\n    }\n\n    Object.defineProperty(dest, key, {\n      enumerable: true,\n      get: function get() {\n        return source[key];\n      }\n    });\n  });\n\n  return dest;\n}\n\nfunction $parcel$defineInteropFlag(a) {\n  Object.defineProperty(a, '__esModule', {value: true, configurable: true});\n}\n\n      var $parcel$global = globalThis;\n    \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequirec6f8\"];\n\nif (parcelRequire == null) {\n  parcelRequire = function(id) {\n    if (id in $parcel$modules) {\n      return $parcel$modules[id].exports;\n    }\n    if (id in $parcel$inits) {\n      var init = $parcel$inits[id];\n      delete $parcel$inits[id];\n      var module = {id: id, exports: {}};\n      $parcel$modules[id] = module;\n      init.call(module.exports, module, module.exports);\n      return module.exports;\n    }\n    var err = new Error(\"Cannot find module '\" + id + \"'\");\n    err.code = 'MODULE_NOT_FOUND';\n    throw err;\n  };\n\n  parcelRequire.register = function register(id, init) {\n    $parcel$inits[id] = init;\n  };\n\n  $parcel$global[\"parcelRequirec6f8\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\nparcelRegister(\"hNlxu\", function(module, exports) {\n\n$parcel$export(module.exports, \"Color\", () => Color);\n$parcel$export(module.exports, \"darker\", () => darker);\n$parcel$export(module.exports, \"brighter\", () => brighter);\n$parcel$export(module.exports, \"default\", () => color);\n$parcel$export(module.exports, \"hslConvert\", () => hslConvert);\n$parcel$export(module.exports, \"Rgb\", () => Rgb);\n$parcel$export(module.exports, \"rgbConvert\", () => rgbConvert);\n$parcel$export(module.exports, \"rgb\", () => rgb);\n$parcel$export(module.exports, \"hsl\", () => hsl);\n\nvar $9fd1U = parcelRequire(\"9fd1U\");\nfunction Color() {}\nvar darker = 0.7;\nvar brighter = 1 / darker;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`), reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`), reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`), reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`), reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`), reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\nvar named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, $9fd1U.default)(Color, color, {\n    copy (channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable () {\n        return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    formatHex: color_formatHex,\n    formatHex8: color_formatHex8,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n});\nfunction color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction color_formatHex8() {\n    return this.rgb().formatHex8();\n}\nfunction color_formatHsl() {\n    return hslConvert(this).formatHsl();\n}\nfunction color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n     : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\nfunction rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n}\nfunction rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n}\nfunction rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, $9fd1U.default)(Rgb, rgb, (0, $9fd1U.extend)(Color, {\n    brighter (k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker (k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb () {\n        return this;\n    },\n    clamp () {\n        return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n    },\n    displayable () {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: rgb_formatHex,\n    formatHex: rgb_formatHex,\n    formatHex8: rgb_formatHex8,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n}));\nfunction rgb_formatHex() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\nfunction rgb_formatHex8() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\nfunction rgb_formatRgb() {\n    const a = clampa(this.opacity);\n    return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\nfunction clampa(opacity) {\n    return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\nfunction clampi(value) {\n    return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\nfunction hex(value) {\n    value = clampi(value);\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n}\nfunction hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new Hsl(h, s, l, o.opacity);\n}\nfunction hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, $9fd1U.default)(Hsl, hsl, (0, $9fd1U.extend)(Color, {\n    brighter (k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker (k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb () {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    clamp () {\n        return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n    },\n    displayable () {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl () {\n        const a = clampa(this.opacity);\n        return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n    }\n}));\nfunction clamph(value) {\n    value = (value || 0) % 360;\n    return value < 0 ? value + 360 : value;\n}\nfunction clampt(value) {\n    return Math.max(0, Math.min(1, value || 0));\n}\n/* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n});\nparcelRegister(\"9fd1U\", function(module, exports) {\n\n$parcel$export(module.exports, \"default\", () => $6baf9f3c20fde4a8$export$2e2bcd8739ae039);\n$parcel$export(module.exports, \"extend\", () => $6baf9f3c20fde4a8$export$8b58be045bf06082);\nfunction $6baf9f3c20fde4a8$export$2e2bcd8739ae039(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n}\nfunction $6baf9f3c20fde4a8$export$8b58be045bf06082(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n});\n\n\nvar $fa693121602b4446$exports = {};\n\n$parcel$export($fa693121602b4446$exports, \"controls\", () => $5d1e60eb15fea085$exports);\n$parcel$export($fa693121602b4446$exports, \"getEmbedHTML\", () => $cff73bb5fafa0795$export$9f4b684ea6be1a90);\n$parcel$export($fa693121602b4446$exports, \"SideTabId\", () => $2752fa503c160704$export$f3b7566ffe363e3b);\n$parcel$export($fa693121602b4446$exports, \"use\", () => $a601a4135959dcb0$export$1f96ae73734a86cc);\n$parcel$export($fa693121602b4446$exports, \"capabilities\", () => $4293b5c02e7b8c3d$export$8e76ac9f37578d1b);\n$parcel$export($fa693121602b4446$exports, \"getColorSettingsFromThemePalette\", () => $a7be03ae5c68c2c3$export$93a255849c3bdb97);\n$parcel$export($fa693121602b4446$exports, \"themePalettes\", () => $a7be03ae5c68c2c3$export$3465a0e7b289ab72);\n$parcel$export($fa693121602b4446$exports, \"SandDance\", () => $1342cf7df79546f0$exports);\n$parcel$export($fa693121602b4446$exports, \"util\", () => $e295d8097c1ad61a$exports);\n$parcel$export($fa693121602b4446$exports, \"SandDanceReact\", () => $b86644fa1aa9b6cb$exports);\n$parcel$export($fa693121602b4446$exports, \"version\", () => $ce16cf456563b677$export$83d89fbfd8236492);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $5d1e60eb15fea085$exports = {};\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $f4b615ab5c14d90e$exports = {};\n\n$parcel$export($f4b615ab5c14d90e$exports, \"Dialog\", () => $f4b615ab5c14d90e$export$3ddf2d174ce01153);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nvar $b86644fa1aa9b6cb$exports = {};\n\n$parcel$export($b86644fa1aa9b6cb$exports, \"SandDance\", () => $1342cf7df79546f0$exports);\n$parcel$export($b86644fa1aa9b6cb$exports, \"util\", () => $e295d8097c1ad61a$exports);\n$parcel$export($b86644fa1aa9b6cb$exports, \"Viewer\", () => $7a3dcfea67f8da12$export$2ec4afd9b3c16a85);\n$parcel$export($b86644fa1aa9b6cb$exports, \"use\", () => $a94804e25c3acfaf$export$1f96ae73734a86cc);\n$parcel$export($b86644fa1aa9b6cb$exports, \"version\", () => $d76008c8107bb02f$export$83d89fbfd8236492);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $1342cf7df79546f0$exports = {};\n\n$parcel$export($1342cf7df79546f0$exports, \"use\", () => $1342cf7df79546f0$export$1f96ae73734a86cc);\n$parcel$export($1342cf7df79546f0$exports, \"colorSchemes\", () => $1f9940ddae6f4302$export$2ad73d393c16f81c);\n$parcel$export($1342cf7df79546f0$exports, \"constants\", () => $44b8bb162b63b5b5$exports);\n$parcel$export($1342cf7df79546f0$exports, \"searchExpression\", () => $0d976ebdc81921a3$exports);\n$parcel$export($1342cf7df79546f0$exports, \"specs\", () => $502a84774beeb901$exports);\n$parcel$export($1342cf7df79546f0$exports, \"types\", () => $1a35cc0c54ffaa6e$exports);\n$parcel$export($1342cf7df79546f0$exports, \"util\", () => $048ba25c9a3f4065$exports);\n$parcel$export($1342cf7df79546f0$exports, \"VegaMorphCharts\", () => $e296aaf527fc4d25$exports);\n$parcel$export($1342cf7df79546f0$exports, \"Viewer\", () => $6662f126c1d9f58b$export$2ec4afd9b3c16a85);\n$parcel$export($1342cf7df79546f0$exports, \"version\", () => $59c3ac7cbbe40380$export$83d89fbfd8236492);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $44b8bb162b63b5b5$exports = {};\n\n$parcel$export($44b8bb162b63b5b5$exports, \"GL_ORDINAL\", () => $44b8bb162b63b5b5$export$5672246984822a29);\n$parcel$export($44b8bb162b63b5b5$exports, \"ColorScaleNone\", () => $8d0624e259fe9d79$export$c991c3dd58d9959c);\n$parcel$export($44b8bb162b63b5b5$exports, \"FieldNames\", () => $8d0624e259fe9d79$export$10df5429b7082be2);\n$parcel$export($44b8bb162b63b5b5$exports, \"ScaleNames\", () => $8d0624e259fe9d79$export$c9f17d36dfc40d76);\n$parcel$export($44b8bb162b63b5b5$exports, \"SignalNames\", () => $8d0624e259fe9d79$export$809e371dee643808);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $502a84774beeb901$exports = {};\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $1c081eb26c39473d$exports = {};\n\n$parcel$export($1c081eb26c39473d$exports, \"build\", () => $1c081eb26c39473d$export$3f8fe6489e95757d);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $8d0624e259fe9d79$exports = {};\n\n$parcel$export($8d0624e259fe9d79$exports, \"FieldNames\", () => $8d0624e259fe9d79$export$10df5429b7082be2);\n$parcel$export($8d0624e259fe9d79$exports, \"ScaleNames\", () => $8d0624e259fe9d79$export$c9f17d36dfc40d76);\n$parcel$export($8d0624e259fe9d79$exports, \"SignalNames\", () => $8d0624e259fe9d79$export$809e371dee643808);\n$parcel$export($8d0624e259fe9d79$exports, \"Other\", () => $8d0624e259fe9d79$export$8653a30c44b6e879);\n$parcel$export($8d0624e259fe9d79$exports, \"ColorScaleNone\", () => $8d0624e259fe9d79$export$c991c3dd58d9959c);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $8d0624e259fe9d79$export$10df5429b7082be2 = {\n    Active: '__SandDance__Active',\n    Collapsed: '__SandDance__Collapsed',\n    Contains: '__SandDance__Contains',\n    Count: '__SandDance__Count',\n    Sum: '__SandDance__Sum',\n    SumOfCount: '__SandDance__CountSum',\n    SumOfSum: '__SandDance__SumSum',\n    Selected: '__SandDance__Selected',\n    First: '__SandDance__First',\n    Last: '__SandDance__Last',\n    Top: '__SandDance__Top',\n    TopColor: '__SandDance__TopColor',\n    TopIndex: '__SandDance__TopIndex',\n    PowerBISelectionId: '__SandDance__PowerBISelectionId',\n    FacetSearch: '__SandDance__FacetSearch',\n    FacetTitle: '__SandDance__FacetTitle',\n    Ordinal: '__SandDance__Ordinal',\n    WrapCol: '__SandDance__WrapCol',\n    WrapRow: '__SandDance__WrapRow',\n    Value: '__SandDance__Value',\n    OffsetX: '__SandDance__X',\n    OffsetY: '__SandDance__Y',\n    OffsetHeight: '__SandDance__H',\n    OffsetWidth: '__SandDance__W'\n};\nconst $8d0624e259fe9d79$export$c9f17d36dfc40d76 = {\n    Color: 'scale_color',\n    X: 'scale_x',\n    Y: 'scale_y',\n    Z: 'scale_z'\n};\nconst $8d0624e259fe9d79$export$809e371dee643808 = {\n    ViewportWidth: 'ViewportWidth',\n    ViewportHeight: 'ViewportHeight',\n    MinCellWidth: 'MinCellWidth',\n    MinCellHeight: 'MinCellHeight',\n    PlotOffsetLeft: 'PlotOffsetLeft',\n    PlotOffsetTop: 'PlotOffsetTop',\n    PlotOffsetBottom: 'PlotOffsetBottom',\n    PlotOffsetRight: 'PlotOffsetRight',\n    PlotHeightIn: 'PlotHeightIn',\n    PlotWidthIn: 'PlotWidthIn',\n    PlotHeightOut: 'PlotHeightOut',\n    PlotWidthOut: 'PlotWidthOut',\n    ColorBinCount: 'RoleColor_BinCountSignal',\n    ColorReverse: 'RoleColor_ReverseSignal',\n    FacetAxesAdjustX: 'RoleFacet_AxesAdjustSignalX',\n    FacetAxesAdjustY: 'RoleFacet_AxesAdjustSignalY',\n    FacetBins: 'RoleFacet_BinsSignal',\n    FacetVBins: 'RoleFacetV_BinsSignal',\n    FacetPaddingTop: 'FacetPaddingTop',\n    FacetPaddingBottom: 'FacetPaddingBottom',\n    FacetPaddingLeft: 'FacetPaddingLeft',\n    MarkOpacity: 'Mark_OpacitySignal',\n    PointScale: 'Chart_PointScaleSignal',\n    TextAngleX: 'Text_AngleXSignal',\n    TextAngleY: 'Text_AngleYSignal',\n    TextScale: 'Text_ScaleSignal',\n    TextSize: 'Text_SizeSignal',\n    TextTitleSize: 'Text_TitleSizeSignal',\n    TreeMapMethod: 'Chart_TreeMapMethodSignal',\n    XBins: 'RoleX_BinsSignal',\n    YBins: 'RoleY_BinsSignal',\n    ZHeight: 'RoleZ_HeightSignal',\n    ZGrounded: 'RoleZ_Grounded',\n    ZProportion: 'RoleZ_ProportionSignal'\n};\nconst $8d0624e259fe9d79$export$8653a30c44b6e879 = '__Other';\nconst $8d0624e259fe9d79$export$c991c3dd58d9959c = 'none';\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ //TODO move these to options\nconst $72552551eb533aa6$export$4a9b1843df49fbce = 10;\nconst $72552551eb533aa6$export$15c9d32f115776f9 = 100;\nconst $72552551eb533aa6$export$929dfe98c4c4722c = 15;\nconst $72552551eb533aa6$export$7794a0aff56142de = 140;\nconst $72552551eb533aa6$export$7c432db1d0b63312 = 180;\nconst $72552551eb533aa6$export$6bd206e55cb747ae = 40;\nconst $72552551eb533aa6$export$c2b9f0002271e8ba = 40;\nconst $72552551eb533aa6$export$bdb7a7da14f9ff2b = 40;\nconst $72552551eb533aa6$export$c11851bee1b89f04 = 40;\nconst $72552551eb533aa6$export$2aa02e522549e01e = 100;\nconst $72552551eb533aa6$export$d3da25ad66816957 = 100;\nconst $72552551eb533aa6$export$2e7279af2df830e3 = 30;\nconst $72552551eb533aa6$export$f0388d9263db6e5f = 60;\nconst $72552551eb533aa6$export$fd4a597070549ada = 69;\nconst $72552551eb533aa6$export$a26a082bf9fa4ca0 = 92;\nconst $72552551eb533aa6$export$3f5b554d51e74365 = 120;\nconst $72552551eb533aa6$export$c33f11801bb18430 = 120;\nconst $72552551eb533aa6$export$e1f76e63dbed4a9a = 10;\nconst $72552551eb533aa6$export$c223d3ee3c0620d9 = 20;\nconst $72552551eb533aa6$export$61fc7d43ac8f84b0 = 250;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $1e4d12c1d1e2ee69$export$d3be63162ba033ae(specContext) {\n    switch(specContext.insight.totalStyle){\n        case 'sum-strip':\n        case 'sum-strip-percent':\n        case 'sum-treemap':\n            return false;\n        default:\n            //if totalStyle is blank, count is assumed\n            return true;\n    }\n}\n\n\nfunction $75d42c46c533a9fa$export$2e2bcd8739ae039(specContext) {\n    var _a, _b, _c, _d;\n    const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n    const { language: language } = specViewOptions;\n    const showAxes = !insight.hideAxes;\n    const bandProps = {\n        orientation: 'horizontal',\n        groupby: {\n            column: specColumns.y,\n            defaultBins: $72552551eb533aa6$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: $72552551eb533aa6$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $72552551eb533aa6$export$929dfe98c4c4722c),\n        showAxes: showAxes\n    };\n    const x = {\n        title: null\n    };\n    const axisScales = {\n        x: x,\n        y: {\n            title: (_a = specColumns.y) === null || _a === void 0 ? void 0 : _a.name\n        },\n        z: {\n            title: (_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.name\n        }\n    };\n    const layouts = [\n        {\n            layoutType: 'Band',\n            props: bandProps\n        }\n    ];\n    const { totalStyle: totalStyle, view: view } = insight;\n    if (totalStyle === 'sum-strip-percent') {\n        x.aggregate = 'percent';\n        x.title = language.percent;\n        const stripProps = {\n            addPercentageScale: true,\n            sortOrder: 'ascending',\n            orientation: 'horizontal',\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes: showAxes,\n            view: view\n        };\n        layouts.push({\n            layoutType: 'Strip',\n            props: stripProps\n        });\n    } else {\n        const aggProps = {\n            niceScale: true,\n            dock: 'left',\n            globalAggregateMaxExtentSignal: 'aggMaxExtent',\n            globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n            sumBy: specColumns.size,\n            showAxes: showAxes\n        };\n        layouts.push({\n            layoutType: 'AggregateContainer',\n            props: aggProps\n        });\n        switch(totalStyle){\n            case 'sum-treemap':\n                {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const treemapProps = {\n                        corner: 'top-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes: showAxes,\n                        view: view\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps\n                    });\n                    break;\n                }\n            case 'sum-strip':\n                {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes: showAxes,\n                        view: view\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps\n                    });\n                    break;\n                }\n            case 'count-strip':\n                {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes: showAxes,\n                        view: view\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps\n                    });\n                    break;\n                }\n            default:\n                {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'down-right',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes: showAxes,\n                        view: view\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps\n                    });\n                    break;\n                }\n        }\n    }\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: ((_c = specColumns.y) === null || _c === void 0 ? void 0 : _c.quantitative) ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).YBins\n                    ]\n                },\n                {\n                    role: 'z',\n                    axisSelection: ((_d = specColumns.z) === null || _d === void 0 ? void 0 : _d.quantitative) ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d'\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'size',\n                    allowNone: (0, $1e4d12c1d1e2ee69$export$d3be63162ba033ae),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).TreeMapMethod\n                    ]\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nfunction $63c963d9a5e0cafb$export$2e2bcd8739ae039(specContext) {\n    var _a, _b;\n    const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n    const { language: language } = specViewOptions;\n    const showAxes = !insight.hideAxes;\n    const bandProps = {\n        orientation: 'vertical',\n        groupby: {\n            column: specColumns.x,\n            defaultBins: $72552551eb533aa6$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: $72552551eb533aa6$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $72552551eb533aa6$export$929dfe98c4c4722c),\n        showAxes: showAxes\n    };\n    const y = {\n        title: null\n    };\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y: y,\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [\n        {\n            layoutType: 'Band',\n            props: bandProps\n        }\n    ];\n    const { totalStyle: totalStyle, view: view } = insight;\n    if (totalStyle === 'sum-strip-percent') {\n        y.aggregate = 'percent';\n        y.title = language.percent;\n        const stripProps = {\n            addPercentageScale: true,\n            sortOrder: 'descending',\n            orientation: 'vertical',\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes: showAxes,\n            view: view\n        };\n        layouts.push({\n            layoutType: 'Strip',\n            props: stripProps\n        });\n    } else {\n        const aggProps = {\n            niceScale: true,\n            dock: 'bottom',\n            globalAggregateMaxExtentSignal: 'aggMaxExtent',\n            globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n            sumBy: specColumns.size,\n            showAxes: showAxes\n        };\n        layouts.push({\n            layoutType: 'AggregateContainer',\n            props: aggProps\n        });\n        switch(totalStyle){\n            case 'sum-treemap':\n                {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const treemapProps = {\n                        corner: 'bottom-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes: showAxes,\n                        view: view\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps\n                    });\n                    break;\n                }\n            case 'sum-strip':\n                {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes: showAxes,\n                        view: view\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps\n                    });\n                    break;\n                }\n            case 'count-strip':\n                {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes: showAxes,\n                        view: view\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps\n                    });\n                    break;\n                }\n            default:\n                {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'right-up',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes: showAxes,\n                        view: view\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps\n                    });\n                    break;\n                }\n        }\n    }\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).XBins\n                    ]\n                },\n                {\n                    role: 'z',\n                    axisSelection: ((_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.quantitative) ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d'\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'size',\n                    allowNone: (0, $1e4d12c1d1e2ee69$export$d3be63162ba033ae),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).TreeMapMethod\n                    ]\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nfunction $6043a028cfa184bc$export$2e2bcd8739ae039(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n    const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n    const axisScales = {\n        x: {\n            title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name\n        },\n        y: {\n            title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name\n        },\n        z: {\n            title: (_c = specColumns.z) === null || _c === void 0 ? void 0 : _c.name\n        }\n    };\n    const backgroundImage = ((_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.quantitative) && ((_f = insight.backgroundImage) === null || _f === void 0 ? void 0 : _f.extents) && insight.backgroundImage;\n    const showAxes = !(backgroundImage || insight.hideAxes);\n    const hBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: 'horizontal',\n        groupby: {\n            column: specColumns.y,\n            defaultBins: $72552551eb533aa6$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: $72552551eb533aa6$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $72552551eb533aa6$export$929dfe98c4c4722c),\n        showAxes: showAxes,\n        outerSignalExtents: backgroundImage && {\n            max: backgroundImage.extents.top,\n            min: backgroundImage.extents.bottom\n        }\n    };\n    const vBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: 'vertical',\n        groupby: {\n            column: specColumns.x,\n            defaultBins: $72552551eb533aa6$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: $72552551eb533aa6$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $72552551eb533aa6$export$929dfe98c4c4722c),\n        showAxes: showAxes,\n        outerSignalExtents: backgroundImage && {\n            max: backgroundImage.extents.right,\n            min: backgroundImage.extents.left\n        }\n    };\n    const aggProps = {\n        onBuild: null,\n        aggregation: null,\n        sumBy: specColumns.size\n    };\n    const layouts = [\n        {\n            layoutType: 'Band',\n            props: vBandProps\n        },\n        {\n            layoutType: 'Band',\n            props: hBandProps\n        },\n        {\n            layoutType: 'AggregateSquare',\n            props: aggProps\n        }\n    ];\n    const { totalStyle: totalStyle, view: view } = insight;\n    switch(totalStyle){\n        case 'sum-treemap':\n            {\n                aggProps.aggregation = 'sum';\n                const treemapProps = {\n                    corner: 'bottom-left',\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z,\n                    showAxes: showAxes,\n                    view: view\n                };\n                layouts.push({\n                    layoutType: 'Treemap',\n                    props: treemapProps\n                });\n                break;\n            }\n        case 'sum-strip':\n            {\n                aggProps.aggregation = 'sum';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes: showAxes,\n                    view: view\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps\n                });\n                break;\n            }\n        case 'count-strip':\n            {\n                aggProps.aggregation = 'count';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes: showAxes,\n                    view: view\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps\n                });\n                break;\n            }\n        default:\n            {\n                aggProps.aggregation = 'count';\n                const squareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: 'right-down',\n                    z: specColumns.z,\n                    maxGroupedUnits: null,\n                    maxGroupedFillSize: null,\n                    showAxes: showAxes,\n                    view: view\n                };\n                aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled)=>{\n                    squareProps.maxGroupedUnits = aggMaxExtent;\n                    squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n                };\n                layouts.push({\n                    layoutType: 'Square',\n                    props: squareProps\n                });\n                break;\n            }\n    }\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: true,\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).XBins\n                    ]\n                },\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).YBins\n                    ]\n                },\n                {\n                    role: 'z',\n                    axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d'\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'size',\n                    allowNone: (0, $1e4d12c1d1e2ee69$export$d3be63162ba033ae),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).TreeMapMethod\n                    ]\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $2bb7eef721096be6$export$2e2bcd8739ae039(specContext) {\n    var _a;\n    const { insight: insight, specColumns: specColumns } = specContext;\n    const { view: view } = insight;\n    const squareProps = {\n        sortBy: specColumns.sort,\n        fillDirection: 'right-down',\n        z: specColumns.z,\n        collapseYHeight: true,\n        showAxes: !insight.hideAxes,\n        view: view\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    return {\n        axisScales: axisScales,\n        layouts: [\n            {\n                layoutType: 'Square',\n                props: squareProps\n            }\n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'z',\n                    axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d'\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $4cd411333c3b4045$export$2e2bcd8739ae039(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n    const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n    const backgroundImageExtents = ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative) && ((_c = insight.backgroundImage) === null || _c === void 0 ? void 0 : _c.extents);\n    const scatterProps = {\n        x: specColumns.x,\n        y: specColumns.y,\n        z: specColumns.z,\n        size: specColumns.size,\n        scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n        zGrounded: specViewOptions.language.zGrounded,\n        backgroundImageExtents: backgroundImageExtents,\n        showAxes: !(backgroundImageExtents || insight.hideAxes),\n        view: insight.view\n    };\n    const axisScales = {\n        x: {\n            title: (_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.name\n        },\n        y: {\n            title: (_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.name\n        },\n        z: {\n            title: (_f = specColumns.z) === null || _f === void 0 ? void 0 : _f.name\n        }\n    };\n    return {\n        axisScales: axisScales,\n        layouts: [\n            {\n                layoutType: 'Scatter',\n                props: scatterProps\n            }\n        ],\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'x',\n                    axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact'\n                },\n                {\n                    role: 'y',\n                    axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? 'range' : 'exact'\n                },\n                {\n                    role: 'z',\n                    axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: false\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'size',\n                    excludeCategoric: true,\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ],\n            signals: [\n                (0, $8d0624e259fe9d79$export$809e371dee643808).PointScale,\n                (0, $8d0624e259fe9d79$export$809e371dee643808).ZGrounded\n            ]\n        }\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $bb2c02d9777544fd$export$2e2bcd8739ae039(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g;\n    const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n    const axisScales = {\n        x: {\n            title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name\n        },\n        y: {\n            title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name\n        },\n        z: {\n            title: specViewOptions.language.count\n        }\n    };\n    const backgroundImage = ((_c = specColumns.x) === null || _c === void 0 ? void 0 : _c.quantitative) && ((_d = specColumns.y) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = insight.backgroundImage) === null || _e === void 0 ? void 0 : _e.extents) && insight.backgroundImage;\n    const showAxes = !(backgroundImage || insight.hideAxes);\n    const hBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: 'horizontal',\n        groupby: {\n            column: specColumns.y,\n            defaultBins: $72552551eb533aa6$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: $72552551eb533aa6$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $72552551eb533aa6$export$929dfe98c4c4722c),\n        showAxes: showAxes,\n        outerSignalExtents: backgroundImage && {\n            max: backgroundImage.extents.top,\n            min: backgroundImage.extents.bottom\n        }\n    };\n    const vBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: 'vertical',\n        groupby: {\n            column: specColumns.x,\n            defaultBins: $72552551eb533aa6$export$4a9b1843df49fbce,\n            maxbinsSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: $72552551eb533aa6$export$15c9d32f115776f9\n        },\n        minBandWidth: (0, $72552551eb533aa6$export$929dfe98c4c4722c),\n        showAxes: showAxes,\n        outerSignalExtents: backgroundImage && {\n            max: backgroundImage.extents.right,\n            min: backgroundImage.extents.left\n        }\n    };\n    const stackProps = {\n        sort: specColumns.sort,\n        showAxes: showAxes\n    };\n    return {\n        axisScales: axisScales,\n        customZScale: true,\n        layouts: [\n            {\n                layoutType: 'Band',\n                props: vBandProps\n            },\n            {\n                layoutType: 'Band',\n                props: hBandProps\n            },\n            {\n                layoutType: 'Stack',\n                props: stackProps\n            }\n        ],\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: ((_f = specColumns.x) === null || _f === void 0 ? void 0 : _f.quantitative) ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).XBins\n                    ]\n                },\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: ((_g = specColumns.y) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).YBins\n                    ]\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $e53dcb83981aa415$export$2e2bcd8739ae039(specContext) {\n    var _a;\n    const { insight: insight, specColumns: specColumns } = specContext;\n    const { view: view } = insight;\n    const stripProps = {\n        sortOrder: 'ascending',\n        orientation: 'vertical',\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes: !insight.hideAxes,\n        view: view\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: specColumns.size ? 'sum' : 'count'\n        };\n        const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n        const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n        const props = {\n            dock: 'top',\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal: globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal: globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false\n        };\n        layouts.push({\n            layoutType: 'AggregateContainer',\n            props: props\n        });\n    }\n    layouts.push({\n        layoutType: 'Strip',\n        props: stripProps\n    });\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'size',\n                    allowNone: true,\n                    excludeCategoric: true\n                },\n                {\n                    role: 'z',\n                    axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d'\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'sort',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $eae080bb50a20c63$export$2e2bcd8739ae039(specContext) {\n    var _a;\n    const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n    const { view: view } = insight;\n    const treemapProps = {\n        corner: 'top-left',\n        group: specColumns.group,\n        size: specColumns.size,\n        treeMapMethod: specViewOptions.language.treeMapMethod,\n        z: specColumns.z,\n        showAxes: !insight.hideAxes,\n        view: view\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: 'sum'\n        };\n        const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n        const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n        const props = {\n            dock: 'top',\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal: globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal: globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false\n        };\n        layouts.push({\n            layoutType: 'AggregateContainer',\n            props: props\n        });\n    }\n    layouts.push({\n        layoutType: 'Treemap',\n        props: treemapProps\n    });\n    return {\n        axisScales: axisScales,\n        layouts: layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'size',\n                    excludeCategoric: true\n                },\n                {\n                    role: 'group',\n                    allowNone: true\n                },\n                {\n                    role: 'z',\n                    axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d'\n                },\n                {\n                    role: 'color',\n                    allowNone: true\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n                    ]\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [\n                        (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n                    ]\n                }\n            ],\n            signals: [\n                (0, $8d0624e259fe9d79$export$809e371dee643808).TreeMapMethod\n            ]\n        }\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $8f9ca880b84285e9$export$fb43a8c8f10fdc99(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n    let layoutPair;\n    const groupby = facetColumn;\n    const plotPadding = {\n        x: 0,\n        y: 0\n    };\n    let facetPadding;\n    switch(facetStyle){\n        case 'cross':\n            {\n                const props = {\n                    axisTextColor: axisTextColor,\n                    colRowTitles: true,\n                    groupbyX: groupby,\n                    groupbyY: facetVColumn\n                };\n                layoutPair = {\n                    layoutType: 'Cross',\n                    props: props\n                };\n                facetPadding = {\n                    bottom: (0, $72552551eb533aa6$export$bdb7a7da14f9ff2b),\n                    left: (0, $72552551eb533aa6$export$6bd206e55cb747ae),\n                    top: 0\n                };\n                plotPadding.y = (0, $72552551eb533aa6$export$c2b9f0002271e8ba);\n                plotPadding.x = (0, $72552551eb533aa6$export$c11851bee1b89f04);\n                break;\n            }\n        case 'wrap':\n        default:\n            {\n                const props = {\n                    axisTextColor: axisTextColor,\n                    cellTitles: true,\n                    groupby: groupby\n                };\n                layoutPair = {\n                    layoutType: 'Wrap',\n                    props: props\n                };\n                facetPadding = {\n                    bottom: (0, $72552551eb533aa6$export$bdb7a7da14f9ff2b),\n                    left: (0, $72552551eb533aa6$export$6bd206e55cb747ae),\n                    top: (0, $72552551eb533aa6$export$c2b9f0002271e8ba)\n                };\n                break;\n            }\n    }\n    const facetLayout = {\n        facetPadding: facetPadding,\n        plotPadding: plotPadding\n    };\n    return {\n        layoutPair: layoutPair,\n        facetLayout: facetLayout\n    };\n}\n\n\n\n\nconst $8e72bac502e5efb8$var$map = {\n    barchart: (0, $63c963d9a5e0cafb$export$2e2bcd8739ae039),\n    barchartH: $75d42c46c533a9fa$export$2e2bcd8739ae039,\n    barchartV: $63c963d9a5e0cafb$export$2e2bcd8739ae039,\n    density: $6043a028cfa184bc$export$2e2bcd8739ae039,\n    grid: $2bb7eef721096be6$export$2e2bcd8739ae039,\n    scatterplot: $4cd411333c3b4045$export$2e2bcd8739ae039,\n    stacks: $bb2c02d9777544fd$export$2e2bcd8739ae039,\n    strips: $e53dcb83981aa415$export$2e2bcd8739ae039,\n    treemap: $eae080bb50a20c63$export$2e2bcd8739ae039\n};\nfunction $8e72bac502e5efb8$export$104083a36c1647a7(specContext) {\n    const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n    const fn = $8e72bac502e5efb8$var$map[insight.chart];\n    if (fn) {\n        const props = fn(specContext);\n        if (insight.columns.facet) {\n            const discreteFacetColumn = {\n                column: specColumns.facet,\n                defaultBins: $72552551eb533aa6$export$4a9b1843df49fbce,\n                maxbins: $72552551eb533aa6$export$15c9d32f115776f9,\n                maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                maxbinsSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetBins\n            };\n            const discreteFacetVColumn = {\n                column: specColumns.facetV,\n                defaultBins: $72552551eb533aa6$export$4a9b1843df49fbce,\n                maxbins: $72552551eb533aa6$export$15c9d32f115776f9,\n                maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                maxbinsSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetVBins\n            };\n            const { facetLayout: facetLayout, layoutPair: layoutPair } = (0, $8f9ca880b84285e9$export$fb43a8c8f10fdc99)(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n            props.layouts.unshift(layoutPair);\n            props.facetLayout = facetLayout;\n            props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n        }\n        return props;\n    }\n}\n\n\nvar $2b29a67d615af3f6$exports = {};\n\n$parcel$export($2b29a67d615af3f6$exports, \"getSpecColumns\", () => $2b29a67d615af3f6$export$9e6128b2231f5173);\n$parcel$export($2b29a67d615af3f6$exports, \"getColumnsFromData\", () => $15b363a2e3ff0bb7$export$3f19ad07848df794);\n$parcel$export($2b29a67d615af3f6$exports, \"getStats\", () => $8e54999951217c95$export$432f698644f45d1);\n$parcel$export($2b29a67d615af3f6$exports, \"inferAll\", () => $15b363a2e3ff0bb7$export$e04a97cc71178399);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nvar $hNlxu = parcelRequire(\"hNlxu\");\nfunction $4794d505cff819ff$export$e82f763eaa28f6fe(cssColorSpecifier) {\n    return !!(0, $hNlxu.default)(cssColorSpecifier);\n}\nfunction $4794d505cff819ff$export$e439be417b7eac79(data, column) {\n    if (!column.stats.hasColorData) {\n        column.isColorData = false;\n        return;\n    }\n    for(let i = 0; i < data.length; i++)if (!$4794d505cff819ff$export$e82f763eaa28f6fe(data[i][column.name])) {\n        column.isColorData = false;\n        return;\n    }\n    column.isColorData = true;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $bdb7710f44ff8c35$export$133e1c446a214d9e(column) {\n    return column.type === 'number' || column.type === 'integer';\n}\nfunction $bdb7710f44ff8c35$export$dba791c9012d0533(columnName, data) {\n    for(let i = 1; i < data.length; i++){\n        const value = columnName == null ? data[i] : data[i][columnName];\n        if (value < 0) return true;\n    }\n    return false;\n}\nfunction $bdb7710f44ff8c35$export$db772497a07dd838(columnName, data) {\n    if (data.length < 2) return false;\n    for(let i = 1; i < data.length; i++){\n        const curr = columnName == null ? data[i] : data[i][columnName];\n        const prev = columnName == null ? data[i - 1] : data[i - 1][columnName];\n        if (curr !== prev + 1) return false;\n    }\n    return true;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $8e54999951217c95$export$432f698644f45d1(data, ...args) {\n    let columnName;\n    let columnType;\n    let columnQuantitative;\n    let distinctValuesCallback;\n    if (args.length <= 2) {\n        const column = args[0];\n        columnName = column.name;\n        columnType = column.type;\n        columnQuantitative = column.quantitative;\n        distinctValuesCallback = args[1];\n    } else {\n        columnName = args[0];\n        columnType = args[1];\n        columnQuantitative = args[2];\n        distinctValuesCallback = args[3];\n    }\n    const distinctMap = {};\n    const stats = {\n        nonNull: 0,\n        distinctValueCount: null,\n        max: null,\n        mean: null,\n        min: null\n    };\n    const columnIsString = columnType === 'string';\n    let sum = 0;\n    for(let i = 0; i < data.length; i++){\n        const row = data[i];\n        const value = columnName == null ? row : row[columnName];\n        if (columnIsString) {\n            if (value !== '') stats.nonNull++;\n        } else if (value != null) stats.nonNull++;\n        const num = +value;\n        distinctMap[value] = true;\n        if (!isNaN(num)) {\n            if (stats.max === null || num > stats.max) stats.max = num;\n            if (stats.min === null || num < stats.min) stats.min = num;\n            sum += num;\n        }\n        // hex codes, ex. #003300, are parsed as dates\n        if ((columnType === 'date' || columnIsString) && !stats.hasColorData && (0, $4794d505cff819ff$export$e82f763eaa28f6fe)(value)) stats.hasColorData = true;\n    }\n    if (columnQuantitative) {\n        stats.mean = data.length > 0 && sum / data.length;\n        stats.hasNegative = (0, $bdb7710f44ff8c35$export$dba791c9012d0533)(columnName, data);\n        if (columnType === 'integer') stats.isSequential = (0, $bdb7710f44ff8c35$export$db772497a07dd838)(columnName, data);\n    }\n    const distinctValues = Object.keys(distinctMap);\n    if (distinctValuesCallback) {\n        distinctValues.sort();\n        distinctValuesCallback(distinctValues);\n    }\n    stats.distinctValueCount = distinctValues.length;\n    return stats;\n}\n\n\nfunction $15b363a2e3ff0bb7$export$3f19ad07848df794(inferTypesFn, data, columnTypes) {\n    const sample = data[0];\n    const fields = sample ? Object.keys(sample) : [];\n    const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n    const columns = fields.map((name)=>{\n        const column = {\n            name: name,\n            type: inferences[name]\n        };\n        return column;\n    });\n    $15b363a2e3ff0bb7$export$e04a97cc71178399(columns, data);\n    return columns;\n}\nfunction $15b363a2e3ff0bb7$export$e04a97cc71178399(columns, data) {\n    columns.forEach((column)=>{\n        if (column) {\n            if (typeof column.quantitative !== 'boolean') column.quantitative = (0, $bdb7710f44ff8c35$export$133e1c446a214d9e)(column);\n            if (!column.stats) column.stats = (0, $8e54999951217c95$export$432f698644f45d1)(data, column);\n            // hex codes, ex. #003300, are parsed as dates\n            if ((column.type === 'date' || column.type === 'string') && typeof column.isColorData !== 'boolean') (0, $4794d505cff819ff$export$e439be417b7eac79)(data, column);\n        }\n    });\n}\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ class $01dcf7f195fcc839$var$Table {\n    constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = 'right'){\n        this.columns = columns;\n        this.rows = rows;\n        this.maxWidth = maxWidth;\n        this.underlineHeaders = underlineHeaders;\n        this.align = align;\n        // Calculate maximum width for each column\n        this.columnWidths = this.columns.map((col, idx)=>Math.max(col.length, ...this.rows.map((row)=>{\n                var _a;\n                return ((_a = row[idx]) === null || _a === void 0 ? void 0 : _a.length) || 0;\n            })));\n    }\n    createSpaces(num) {\n        return ' '.repeat(num);\n    }\n    groupColumns() {\n        let cumulativeWidth = 0;\n        const columnGroups = [];\n        let currentGroup = [];\n        this.columns.forEach((col, idx)=>{\n            const columnSpace = this.columnWidths[idx] + 1; // account for one space between columns\n            if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n                columnGroups.push(currentGroup);\n                cumulativeWidth = columnSpace;\n                currentGroup = [\n                    col\n                ];\n            } else {\n                cumulativeWidth += columnSpace;\n                currentGroup.push(col);\n            }\n        });\n        if (currentGroup.length > 0) columnGroups.push(currentGroup);\n        return columnGroups;\n    }\n    formatRow(row, group) {\n        return group.map((col)=>{\n            const idx = this.columns.indexOf(col);\n            const cellValue = row[idx] == null ? '' : row[idx].toString();\n            return this.align === 'right' ? cellValue.padStart(this.columnWidths[idx], ' ') : cellValue.padEnd(this.columnWidths[idx], ' ');\n        }).join(this.createSpaces(1));\n    }\n    formatHeader(group) {\n        return group.map((col)=>{\n            const idx = this.columns.indexOf(col);\n            return this.align === 'right' ? col.padStart(this.columnWidths[idx], ' ') : col.padEnd(this.columnWidths[idx], ' ');\n        }).join(this.createSpaces(1));\n    }\n    underlineHeader(group) {\n        return group.map((col)=>'-'.repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n    }\n    render() {\n        const output = [];\n        const columnGroups = this.groupColumns();\n        columnGroups.forEach((group, groupIndex)=>{\n            const headerRow = this.formatHeader(group);\n            let section = headerRow + (groupIndex < columnGroups.length - 1 ? ' \\\\' : '') + '\\n';\n            if (this.underlineHeaders) section += this.underlineHeader(group) + '\\n';\n            this.rows.forEach((row)=>{\n                section += this.formatRow(row, group) + '\\n';\n            });\n            output.push(section);\n            if (groupIndex < columnGroups.length - 1) output.push('\\n');\n        });\n        return output.join('');\n    }\n}\nvar $01dcf7f195fcc839$export$ee3af38fff078f10;\n(function(pandasSimulation) {\n    // Mapping TypeScript types to Python-like dtypes\n    const typeMapping = {\n        boolean: 'bool',\n        number: 'float64',\n        date: 'datetime64[ns]',\n        string: 'object',\n        integer: 'int64'\n    };\n    function head(columns, data, maxWidth = 80) {\n        const numRows = 5; // Number of rows as in `head(5)` from pandas\n        const top = data.slice(0, numRows); // Get the top `numRows` rows\n        // Create a \"fake\" row number column\n        const rowNumbers = Array.from({\n            length: numRows\n        }, (_, i)=>(i + 1).toString());\n        // Extract column names and rows for the table\n        const columnNames = [\n            ''\n        ].concat(columns.map((col)=>col.name));\n        const rows = top.map((row, i)=>[\n                rowNumbers[i]\n            ].concat(columns.map((col)=>{\n                var _a;\n                return ((_a = row[col.name]) === null || _a === void 0 ? void 0 : _a.toString()) || '';\n            })));\n        // Create and render the table with right alignment\n        const table = new $01dcf7f195fcc839$var$Table(columnNames, rows, maxWidth, false, 'right'); // Right alignment\n        return table.render();\n    }\n    pandasSimulation.head = head;\n    function info(columns, data, maxWidth = 80) {\n        const numRows = data.length;\n        const output = [];\n        // Summary header\n        output.push('<class \\'pandas.core.frame.DataFrame\\'>');\n        output.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n        output.push(`Data columns (total ${columns.length} columns):\\n`);\n        // Column headers and details\n        const columnHeaders = [\n            '#',\n            'Column',\n            'Non-Null Count',\n            'Dtype'\n        ];\n        const rows = columns.map((col, idx)=>{\n            const nonNullCount = col.stats.nonNull.toString();\n            const dtype = typeMapping[col.type] || 'unknown';\n            return [\n                idx.toString(),\n                col.name,\n                `${nonNullCount} non-null`,\n                dtype\n            ];\n        });\n        // Create and render the table with left alignment and header underline\n        const table = new $01dcf7f195fcc839$var$Table(columnHeaders, rows, maxWidth, true, 'left'); // Left alignment\n        output.push(table.render());\n        // Memory usage estimation\n        const memoryUsage = columns.reduce((total, col)=>{\n            var _a;\n            const exampleValue = (_a = data.find((row)=>row[col.name] != null)) === null || _a === void 0 ? void 0 : _a[col.name];\n            if (exampleValue == null) return total;\n            const size = new Blob([\n                exampleValue.toString()\n            ]).size;\n            return total + size * numRows;\n        }, 0);\n        output.push(`\\ndtypes: ${columns.filter((col)=>col.type === 'number').length} float64, ` + `${columns.filter((col)=>col.type === 'integer').length} int64, ` + `${columns.filter((col)=>col.type === 'string').length} object`);\n        output.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n        return output.join('\\n');\n    }\n    pandasSimulation.info = info;\n})($01dcf7f195fcc839$export$ee3af38fff078f10 || ($01dcf7f195fcc839$export$ee3af38fff078f10 = {}));\n\n\n\n\nfunction $2b29a67d615af3f6$export$9e6128b2231f5173(insight, columns) {\n    function getColumnByName(name) {\n        return columns.filter((c)=>c.name === name)[0];\n    }\n    return {\n        color: getColumnByName(insight.columns && insight.columns.color),\n        facet: getColumnByName(insight.columns && insight.columns.facet),\n        facetV: getColumnByName(insight.columns && insight.columns.facetV),\n        group: getColumnByName(insight.columns && insight.columns.group),\n        size: getColumnByName(insight.columns && insight.columns.size),\n        sort: getColumnByName(insight.columns && insight.columns.sort),\n        uid: getColumnByName(insight.columns && insight.columns.uid),\n        x: getColumnByName(insight.columns && insight.columns.x),\n        y: getColumnByName(insight.columns && insight.columns.y),\n        z: getColumnByName(insight.columns && insight.columns.z)\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $29c6c9793f692470$export$b18909608a999daa(scope, ...axes) {\n    if (!axes || !axes.length) return;\n    if (!scope.axes) scope.axes = [];\n    scope.axes.push(...axes.filter(Boolean));\n}\nfunction $29c6c9793f692470$export$6853292f627997e4(scope, ...datas) {\n    if (!datas || !datas.length) return;\n    if (!scope.data) scope.data = [];\n    scope.data.push(...datas.filter(Boolean));\n}\nfunction $29c6c9793f692470$export$3df320e901c23a48(scope, ...marks) {\n    if (!marks || !marks.length) return;\n    if (!scope.marks) scope.marks = [];\n    scope.marks.push(...marks.filter(Boolean));\n}\nfunction $29c6c9793f692470$export$290268902279a991(scope, ...scales) {\n    if (!scales || !scales.length) return;\n    if (!scope.scales) scope.scales = [];\n    scope.scales.push(...scales.filter(Boolean));\n}\nfunction $29c6c9793f692470$export$5346a0d8a9111b3f(scope, ...signals) {\n    if (!signals || !signals.length) return;\n    if (!scope.signals) scope.signals = [];\n    scope.signals.push(...signals.filter(Boolean));\n}\nfunction $29c6c9793f692470$export$eea5d31e98930019(data, ...transforms) {\n    if (!transforms || !transforms.length) return;\n    if (!data.transform) data.transform = [];\n    data.transform.push(...transforms.filter(Boolean));\n}\nfunction $29c6c9793f692470$export$ef4373c7e62b2278(data, dataName) {\n    for(let i = 0; i < data.length; i++){\n        if (data[i].name === dataName) return {\n            data: data[i],\n            index: i\n        };\n    }\n}\nfunction $29c6c9793f692470$export$53a21aeef48e14a8(groupings) {\n    const groupby = groupings.map((g)=>g.groupby);\n    return groupby.reduce((acc, val)=>acc.concat(val), []);\n}\nfunction $29c6c9793f692470$export$e6b6683aec0fe907(...offsets) {\n    return offsets.filter(Boolean).join(' + ');\n}\n\n\nfunction $fabd8225a03f89c4$export$3678bfcfeaea7c36(props) {\n    const { axesOffsets: axesOffsets, axisScales: axisScales, axesScopes: axesScopes, axesTitlePadding: axesTitlePadding, allGlobalScales: allGlobalScales, globalScope: globalScope, labelBaseline: labelBaseline, plotOffsetSignals: plotOffsetSignals, specColumns: specColumns, specViewOptions: specViewOptions } = props;\n    const { scope: scope } = globalScope;\n    allGlobalScales.forEach((globalScales)=>{\n        const { scales: scales } = globalScales;\n        for(const xyz in scales){\n            const _scales = scales[xyz];\n            if (_scales) {\n                (0, $29c6c9793f692470$export$290268902279a991)(scope, ..._scales);\n                let { showAxes: showAxes } = globalScales;\n                let zindex = undefined;\n                if (xyz === 'z') {\n                    showAxes = false;\n                    if (props.view === '3d' && specViewOptions.zAxisOptions && !props.hideZAxis) {\n                        if (specViewOptions.zAxisOptions.showZAxis) {\n                            showAxes = true;\n                            zindex = specViewOptions.zAxisOptions.zIndex;\n                        }\n                    }\n                }\n                if (showAxes && axisScales) {\n                    const axisScale = axisScales[xyz];\n                    if (axisScale) {\n                        const lineColor = specViewOptions.colors.axisLine;\n                        const horizontal = xyz === 'x';\n                        const column = specColumns[xyz] || {\n                            quantitative: true\n                        };\n                        const title = axisScale.title;\n                        const props = {\n                            title: title,\n                            horizontal: horizontal,\n                            column: column,\n                            specViewOptions: specViewOptions,\n                            lineColor: lineColor,\n                            titlePadding: axesTitlePadding[xyz],\n                            labelBaseline: labelBaseline[xyz],\n                            zindex: zindex\n                        };\n                        axesScopes['main'].forEach((a)=>(0, $29c6c9793f692470$export$b18909608a999daa)(a.scope, $fabd8225a03f89c4$var$createAxis(Object.assign(Object.assign({}, props), {\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines\n                            }))));\n                        if (axesScopes[xyz]) axesScopes[xyz].forEach((a)=>(0, $29c6c9793f692470$export$b18909608a999daa)(a.scope, $fabd8225a03f89c4$var$createAxis(Object.assign(Object.assign({}, props), {\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines\n                            }))));\n                        if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                            const plotOffsetSignal = plotOffsetSignals[xyz];\n                            plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                        }\n                    }\n                }\n            }\n        }\n    });\n}\nfunction $fabd8225a03f89c4$var$createAxis(props) {\n    const { column: column, horizontal: horizontal, labelBaseline: labelBaseline, lineColor: lineColor, scale: scale, showLabels: showLabels, showTitle: showTitle, showLines: showLines, specViewOptions: specViewOptions, title: title, titlePadding: titlePadding, zindex: zindex } = props;\n    const axis = Object.assign(Object.assign(Object.assign(Object.assign({\n        zindex: zindex,\n        scale: scale.name,\n        orient: horizontal ? 'bottom' : 'left',\n        domain: showLines,\n        ticks: showLines\n    }, showLines && {\n        domainColor: lineColor,\n        tickColor: lineColor,\n        tickSize: specViewOptions.tickSize\n    }), showTitle && {\n        title: title,\n        titleAlign: horizontal ? 'left' : 'right',\n        titleAngle: {\n            signal: horizontal ? (0, $8d0624e259fe9d79$export$809e371dee643808).TextAngleX : (0, $8d0624e259fe9d79$export$809e371dee643808).TextAngleY\n        },\n        titleColor: specViewOptions.colors.axisText,\n        titleFontSize: {\n            signal: (0, $8d0624e259fe9d79$export$809e371dee643808).TextTitleSize\n        },\n        titleLimit: (0, $72552551eb533aa6$export$d3da25ad66816957),\n        titlePadding: titlePadding\n    }), {\n        labels: showLabels\n    }), showLabels && {\n        labelAlign: horizontal ? 'left' : 'right',\n        labelBaseline: labelBaseline,\n        labelAngle: {\n            signal: horizontal ? (0, $8d0624e259fe9d79$export$809e371dee643808).TextAngleX : (0, $8d0624e259fe9d79$export$809e371dee643808).TextAngleY\n        },\n        labelColor: specViewOptions.colors.axisText,\n        labelFontSize: {\n            signal: (0, $8d0624e259fe9d79$export$809e371dee643808).TextSize\n        },\n        labelLimit: (0, $72552551eb533aa6$export$2aa02e522549e01e)\n    });\n    if (column.quantitative) axis.format = '~r';\n    return axis;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * Make sure that the field name is accessible via Vega's Field type\n * https://vega.github.io/vega/docs/types/#Field\n * examples: \"source.x\", \"target['x']\", \"[my.field]\"\n */ function $03b4e9c3be7efafd$export$fb70365b00e8cb7b(field) {\n    return field.replace(/\\\\/g, '\\\\\\\\') //escape backslashes\n    .replace(/'/g, '\\\\\\'') //escape single quotes\n    .replace(/\"/g, '\\\\\"') //escape double quotes\n    .replace(/\\./g, '\\\\.') //escape periods\n    .replace(/\\[/g, '\\\\[') //escape left square brackets\n    .replace(/\\]/g, '\\\\]') //escape right square brackets\n    ;\n}\nfunction $03b4e9c3be7efafd$export$74df930fa4adaae4(field) {\n    //remove whitespace, period, accessors and logical modifiers\n    return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, '');\n}\n\n\nfunction $7fac7254f262c640$export$fefe9507ec0904ed(scaleName, domain, range, reverse, zero, nice = true) {\n    const scale = {\n        name: scaleName,\n        type: 'linear',\n        range: range,\n        round: true,\n        reverse: reverse,\n        domain: domain,\n        zero: zero,\n        nice: nice\n    };\n    return scale;\n}\nfunction $7fac7254f262c640$export$b67158f831e00d0d(scaleName, data, range, field, reverse) {\n    const scale = {\n        name: scaleName,\n        type: 'point',\n        range: range,\n        domain: {\n            data: data,\n            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(field),\n            sort: true\n        },\n        padding: 0.5\n    };\n    if (reverse !== undefined) scale.reverse = reverse;\n    return scale;\n}\nfunction $7fac7254f262c640$export$530110e7506d659d(scaleName, colorBin, data, field, scheme) {\n    scheme = scheme || (0, $8d0624e259fe9d79$export$c991c3dd58d9959c);\n    const domain = {\n        data: data,\n        field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(field)\n    };\n    const range = {\n        scheme: scheme\n    };\n    const reverse = {\n        signal: (0, $8d0624e259fe9d79$export$809e371dee643808).ColorReverse\n    };\n    if (colorBin !== 'continuous') range.count = {\n        signal: (0, $8d0624e259fe9d79$export$809e371dee643808).ColorBinCount\n    };\n    switch(colorBin){\n        case 'continuous':\n            {\n                const sequentialScale = {\n                    name: scaleName,\n                    type: 'linear',\n                    domain: domain,\n                    range: range,\n                    reverse: reverse\n                };\n                return sequentialScale;\n            }\n        case 'quantile':\n            {\n                const quantileScale = {\n                    name: scaleName,\n                    type: 'quantile',\n                    domain: domain,\n                    range: range,\n                    reverse: reverse\n                };\n                return quantileScale;\n            }\n        default:\n            {\n                const quantizeScale = {\n                    name: scaleName,\n                    type: 'quantize',\n                    domain: domain,\n                    range: range,\n                    reverse: reverse\n                };\n                return quantizeScale;\n            }\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nconst $8243f48596a5f195$export$7bc9b23ce3036e78 = 0.6;\nfunction $8243f48596a5f195$export$d9407ec206a3236c(context, heightSignal) {\n    const { specViewOptions: specViewOptions } = context;\n    const signals = [\n        {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).ZProportion,\n            value: $8243f48596a5f195$export$7bc9b23ce3036e78,\n            bind: {\n                name: specViewOptions.language.zScaleProportion,\n                debounce: $72552551eb533aa6$export$61fc7d43ac8f84b0,\n                input: 'range',\n                min: 0.1,\n                max: 2,\n                step: 0.1\n            }\n        },\n        {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).ZHeight,\n            update: `${heightSignal} * ${(0, $8d0624e259fe9d79$export$809e371dee643808).ZProportion}`\n        },\n        {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).TextScale,\n            value: 1.2,\n            bind: {\n                name: specViewOptions.language.textScaleSignal,\n                debounce: $72552551eb533aa6$export$61fc7d43ac8f84b0,\n                input: 'range',\n                min: 0.5,\n                max: 2,\n                step: 0.1\n            }\n        },\n        {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).TextSize,\n            update: `${(0, $8d0624e259fe9d79$export$809e371dee643808).TextScale} * 10`\n        },\n        {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).TextTitleSize,\n            update: `${(0, $8d0624e259fe9d79$export$809e371dee643808).TextScale} * 15`\n        },\n        {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).TextAngleX,\n            value: 30,\n            bind: {\n                name: specViewOptions.language.xAxisTextAngleSignal,\n                debounce: $72552551eb533aa6$export$61fc7d43ac8f84b0,\n                input: 'range',\n                min: 0,\n                max: 90,\n                step: 1\n            }\n        },\n        {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).TextAngleY,\n            value: 0,\n            bind: {\n                name: specViewOptions.language.yAxisTextAngleSignal,\n                debounce: $72552551eb533aa6$export$61fc7d43ac8f84b0,\n                input: 'range',\n                min: -90,\n                max: 0,\n                step: 1\n            }\n        },\n        {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).MarkOpacity,\n            value: 1,\n            bind: {\n                name: specViewOptions.language.markOpacitySignal,\n                debounce: $72552551eb533aa6$export$61fc7d43ac8f84b0,\n                input: 'range',\n                min: 0.1,\n                max: 1,\n                step: 0.05\n            }\n        }\n    ];\n    return signals;\n}\nfunction $8243f48596a5f195$export$641fa4f0ca86c2ad(context) {\n    const { specViewOptions: specViewOptions } = context;\n    const signal = {\n        name: (0, $8d0624e259fe9d79$export$809e371dee643808).ColorBinCount,\n        value: 7,\n        bind: {\n            name: specViewOptions.language.colorBinCount,\n            debounce: $72552551eb533aa6$export$61fc7d43ac8f84b0,\n            input: 'range',\n            min: 1,\n            max: specViewOptions.maxLegends + 1,\n            step: 1\n        }\n    };\n    return signal;\n}\nfunction $8243f48596a5f195$export$526461dda4c87775(context) {\n    const { specViewOptions: specViewOptions } = context;\n    const signal = {\n        name: (0, $8d0624e259fe9d79$export$809e371dee643808).ColorReverse,\n        value: false,\n        bind: {\n            name: specViewOptions.language.colorReverse,\n            input: 'checkbox'\n        }\n    };\n    return signal;\n}\nfunction $8243f48596a5f195$export$cdc9366ba30317bd(s, fn, update) {\n    s.update = `${fn}((${s.update}), (${update}))`;\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $a522ba8db6676a17$var$legend(column, fill) {\n    const legend = {\n        orient: 'none',\n        title: column.name,\n        fill: fill,\n        encode: {\n            symbols: {\n                update: {\n                    shape: {\n                        value: 'square'\n                    }\n                }\n            }\n        }\n    };\n    if (column.quantitative) {\n        legend.type = 'symbol';\n        legend.format = '~r';\n    }\n    return legend;\n}\nfunction $a522ba8db6676a17$export$765837a81fadca85(context, fill) {\n    const { specColumns: specColumns, insight: insight } = context;\n    if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) return [\n        $a522ba8db6676a17$var$legend(specColumns.color, fill)\n    ];\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $38d298d07938d131$export$a4725aa19e8564dd(column, count, source, legend, lookupName, fieldName, indexName) {\n    const data = [\n        {\n            name: lookupName,\n            source: source,\n            transform: [\n                {\n                    type: 'aggregate',\n                    groupby: [\n                        (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(column.name)\n                    ]\n                },\n                {\n                    type: 'window',\n                    ops: [\n                        'count'\n                    ],\n                    as: [\n                        indexName\n                    ]\n                },\n                {\n                    type: 'filter',\n                    expr: `datum[${JSON.stringify(indexName)}] <= ${count}`\n                }\n            ]\n        },\n        {\n            name: legend,\n            source: source,\n            transform: [\n                {\n                    type: 'lookup',\n                    from: lookupName,\n                    key: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(column.name),\n                    fields: [\n                        column.name\n                    ].map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n                    values: [\n                        column.name\n                    ].map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n                    as: [\n                        fieldName\n                    ]\n                },\n                {\n                    type: 'formula',\n                    expr: `datum[${JSON.stringify(fieldName)}] == null ? '${(0, $8d0624e259fe9d79$export$8653a30c44b6e879)}' : datum[${JSON.stringify(fieldName)}]`,\n                    as: fieldName\n                }\n            ]\n        }\n    ];\n    return data;\n}\n\n\nfunction $925be6cd5bedf086$export$4c4d9288a45f1fb3(props) {\n    const { colorReverseSignalName: colorReverseSignalName, dataName: dataName, scope: scope, legendDataName: legendDataName, scaleName: scaleName, specContext: specContext, topLookupName: topLookupName } = props;\n    let colorDataName = dataName;\n    const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n    const legends = (0, $a522ba8db6676a17$export$765837a81fadca85)(specContext, scaleName);\n    if (legends) scope.legends = legends;\n    const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n    if (categoricalColor) {\n        (0, $29c6c9793f692470$export$6853292f627997e4)(scope, ...(0, $38d298d07938d131$export$a4725aa19e8564dd)(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, (0, $8d0624e259fe9d79$export$10df5429b7082be2).TopColor, (0, $8d0624e259fe9d79$export$10df5429b7082be2).TopIndex));\n        colorDataName = legendDataName;\n    }\n    if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n        if (specColumns.color.quantitative) (0, $29c6c9793f692470$export$290268902279a991)(scope, (0, $7fac7254f262c640$export$530110e7506d659d)(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n        else (0, $29c6c9793f692470$export$290268902279a991)(scope, {\n            name: scaleName,\n            type: 'ordinal',\n            domain: {\n                data: colorDataName,\n                field: (0, $8d0624e259fe9d79$export$10df5429b7082be2).TopColor,\n                sort: true\n            },\n            range: {\n                scheme: insight.scheme || (0, $8d0624e259fe9d79$export$c991c3dd58d9959c)\n            },\n            reverse: {\n                signal: colorReverseSignalName\n            }\n        });\n    }\n    (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(scope, (0, $8243f48596a5f195$export$641fa4f0ca86c2ad)(specContext), (0, $8243f48596a5f195$export$526461dda4c87775)(specContext));\n    return {\n        topColorField: (0, $8d0624e259fe9d79$export$10df5429b7082be2).TopColor,\n        colorDataName: colorDataName\n    };\n}\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $e298df2c870b2b1c$export$4fec84497b9e6e3f(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n    const titleSignal = `parent[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetTitle)}]`;\n    const index = `datum[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).Ordinal)}] - 1`;\n    const col = $e298df2c870b2b1c$export$4f57a5f5fbf1456e(colTitleSource.dataName, sizeSignals, index);\n    const row = $e298df2c870b2b1c$export$d0cc3dc227001793(rowTitleSource.dataName, sizeSignals, index);\n    (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope, col.header, row.footer);\n    (0, $29c6c9793f692470$export$3df320e901c23a48)(col.header, {\n        type: 'text',\n        encode: {\n            enter: {\n                align: {\n                    value: 'center'\n                },\n                baseline: {\n                    value: 'middle'\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetSearch)}]}`\n                },\n                x: {\n                    signal: `${sizeSignals.layoutWidth} / 2`\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth\n                },\n                fontSize: {\n                    signal: (0, $8d0624e259fe9d79$export$809e371dee643808).TextSize\n                },\n                text: {\n                    signal: titleSignal\n                }\n            }\n        }\n    });\n    (0, $29c6c9793f692470$export$3df320e901c23a48)(row.footer, {\n        type: 'text',\n        encode: {\n            enter: {\n                align: {\n                    value: 'left'\n                },\n                baseline: {\n                    value: 'middle'\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetSearch)}]}`\n                },\n                y: {\n                    signal: `${sizeSignals.layoutHeight} / 2`\n                },\n                limit: {\n                    signal: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetRight\n                },\n                fontSize: {\n                    signal: (0, $8d0624e259fe9d79$export$809e371dee643808).TextSize\n                },\n                text: {\n                    signal: titleSignal\n                }\n            }\n        }\n    });\n}\nfunction $e298df2c870b2b1c$export$3735b1dd76112836(scope, sizeSignals, axisTextColor) {\n    (0, $29c6c9793f692470$export$3df320e901c23a48)(scope, {\n        type: 'text',\n        encode: {\n            enter: {\n                align: {\n                    value: 'center'\n                },\n                baseline: {\n                    value: 'bottom'\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetSearch)}]}`\n                },\n                x: {\n                    signal: `(${sizeSignals.layoutWidth}) / 2`\n                },\n                text: {\n                    signal: `parent[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetTitle)}]`\n                },\n                fontSize: {\n                    signal: (0, $8d0624e259fe9d79$export$809e371dee643808).TextSize\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth\n                },\n                y: {\n                    signal: `-${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop} / 2`\n                }\n            }\n        }\n    });\n}\nfunction $e298df2c870b2b1c$export$9f0b19d6fd936707(props) {\n    const { colSeqName: colSeqName, colTitleScale: colTitleScale, globalScope: globalScope, facetScope: facetScope, plotScope: plotScope, rowSeqName: rowSeqName, rowTitleScale: rowTitleScale } = props;\n    const { sizeSignals: sizeSignals } = facetScope;\n    const colSequence = $e298df2c870b2b1c$var$createSequence(colSeqName, sizeSignals.colCount);\n    const rowSequence = $e298df2c870b2b1c$var$createSequence(rowSeqName, sizeSignals.rowCount);\n    const index = 'datum.data';\n    const col = $e298df2c870b2b1c$export$4f57a5f5fbf1456e(colSeqName, sizeSignals, index);\n    const row = $e298df2c870b2b1c$export$d0cc3dc227001793(rowSeqName, sizeSignals, index);\n    (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope, colSequence, rowSequence);\n    (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope, col.footer, row.header);\n    (0, $29c6c9793f692470$export$290268902279a991)(globalScope, colTitleScale, rowTitleScale);\n    const map = {\n        main: [\n            {\n                scope: facetScope.facetScope,\n                lines: true,\n                labels: false,\n                title: false\n            }\n        ],\n        x: [\n            {\n                scope: col.footer,\n                lines: true,\n                labels: true,\n                title: false\n            },\n            {\n                scope: plotScope,\n                scale: colTitleScale,\n                lines: false,\n                labels: false,\n                title: true\n            }\n        ],\n        y: [\n            {\n                scope: row.header,\n                lines: true,\n                labels: true,\n                title: false\n            },\n            {\n                scope: plotScope,\n                scale: rowTitleScale,\n                lines: false,\n                labels: false,\n                title: true\n            }\n        ]\n    };\n    return map;\n}\nfunction $e298df2c870b2b1c$export$d0cc3dc227001793(data, sizeSignals, index) {\n    const rowFn = (xSignal)=>{\n        return {\n            type: 'group',\n            from: {\n                data: data\n            },\n            encode: {\n                update: {\n                    x: {\n                        signal: xSignal\n                    },\n                    y: {\n                        signal: `${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetTop} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingBottom})`\n                    },\n                    height: {\n                        signal: sizeSignals.layoutHeight\n                    }\n                }\n            }\n        };\n    };\n    const header = rowFn((0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetLeft);\n    const footer = rowFn(`${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetLeft} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotWidthOut} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetRight} / 2`);\n    return {\n        header: header,\n        footer: footer\n    };\n}\nfunction $e298df2c870b2b1c$export$4f57a5f5fbf1456e(data, sizeSignals, index) {\n    const colFn = (ySignal)=>{\n        return {\n            type: 'group',\n            from: {\n                data: data\n            },\n            encode: {\n                update: {\n                    x: {\n                        signal: `(${index}) * (${sizeSignals.layoutWidth} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingLeft}) + ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingLeft} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetLeft} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustX}`\n                    },\n                    y: {\n                        signal: `${ySignal} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustY}`\n                    },\n                    width: {\n                        signal: sizeSignals.layoutWidth\n                    }\n                }\n            }\n        };\n    };\n    //create group marks based on data sequences\n    const header = colFn(`${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetTop} / 2`);\n    const footer = colFn(`${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetTop} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightOut}`);\n    return {\n        header: header,\n        footer: footer\n    };\n}\nfunction $e298df2c870b2b1c$var$createSequence(dataName, countSignal) {\n    return {\n        name: dataName,\n        transform: [\n            {\n                type: 'sequence',\n                start: 0,\n                stop: {\n                    signal: countSignal\n                }\n            }\n        ]\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $895ef9e095ded5c9$export$9563e054e6f787fb(context, colorFieldName, scale) {\n    const { specColumns: specColumns, insight: insight, specViewOptions: specViewOptions } = context;\n    const colorColumn = specColumns.color;\n    return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n        field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(colorColumn.name)\n    } : {\n        scale: scale,\n        field: colorColumn.quantitative ? (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(colorColumn.name) : colorFieldName\n    } : {\n        value: specViewOptions.colors.defaultCube\n    };\n}\nfunction $895ef9e095ded5c9$export$c17a3be1057836e(context) {\n    const result = {\n        signal: (0, $8d0624e259fe9d79$export$809e371dee643808).MarkOpacity\n    };\n    return result;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nclass $cc404f7847ffd5bf$export$5fdf684e73bb2de5 {\n    constructor(props){\n        const { dataName: dataName, markGroup: markGroup, scope: scope, signals: signals } = props;\n        this.scope = scope;\n        this._markGroup = markGroup;\n        this.signals = signals;\n        this.data = (0, $29c6c9793f692470$export$ef4373c7e62b2278)(scope.data, dataName).data;\n        this._markDataName = dataName;\n        this.offsets = {\n            x: '0',\n            y: '0',\n            h: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightIn,\n            w: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotWidthIn\n        };\n        this.sizeSignals = {\n            layoutHeight: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightIn,\n            layoutWidth: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotWidthIn\n        };\n        this.zSize = (0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightIn;\n    }\n    get markDataName() {\n        return this._markDataName;\n    }\n    setMarkDataName(markDataName) {\n        this._markDataName = markDataName;\n    }\n    get markGroup() {\n        return this._markGroup;\n    }\n    setMarkGroup(markGroup) {\n        this._markGroup = markGroup;\n    }\n}\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ class $748726ce52deaf5d$export$c84671f46d6a1ca {\n    constructor(props){\n        this.props = props;\n        this.id = props.id;\n    }\n    getGrouping() {\n        return null;\n    }\n    getAggregateSumOp() {\n        return null;\n    }\n    build() {\n        throw 'Not implemented';\n    }\n}\n\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $0299c0d9f55fe75f$export$71c45f78b1166d35() {\n    return `datum.${(0, $8d0624e259fe9d79$export$10df5429b7082be2).Collapsed}`;\n}\n\n\nclass $eff5a80a5e96c249$export$fd744dfcd98e5f49 extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const a = this.aggregation = this.getAggregation();\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            scale: `scale_${p}`,\n            extentData: `data_${p}_extent`,\n            offsets: `data_${p}_offsets`\n        };\n    }\n    getAggregateSumOp() {\n        if (this.aggregation === 'sum') {\n            const fieldOp = {\n                field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(this.props.sumBy.name),\n                op: 'sum',\n                as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).Sum\n            };\n            return fieldOp;\n        }\n    }\n    build() {\n        const { aggregation: aggregation, names: names, props: props } = this;\n        const { dock: dock, globalScope: globalScope, groupings: groupings, niceScale: niceScale, parentScope: parentScope, showAxes: showAxes } = props;\n        (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, (0, $29c6c9793f692470$export$53a21aeef48e14a8)(groupings))), {\n            as: [\n                names.aggregateField\n            ]\n        }), {\n            type: 'extent',\n            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(names.aggregateField),\n            signal: names.globalAggregateExtentSignal\n        });\n        (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: props.globalAggregateMaxExtentSignal,\n            update: `${names.globalAggregateExtentSignal}[1]`\n        });\n        const horizontal = dock === 'left';\n        const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n        const offsets = {\n            x: parentScope.offsets.x,\n            y: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, dock === 'bottom' ? groupScaled : ''),\n            h: horizontal ? parentScope.offsets.h : dock === 'top' ? groupScaled : `${parentScope.offsets.h} - ${groupScaled}`,\n            w: horizontal ? groupScaled : parentScope.offsets.w\n        };\n        const scale = {\n            type: 'linear',\n            name: names.scale,\n            domain: [\n                0,\n                {\n                    signal: props.globalAggregateMaxExtentSignal\n                }\n            ],\n            range: horizontal ? [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutWidth\n                }\n            ] : [\n                {\n                    signal: parentScope.sizeSignals.layoutHeight\n                },\n                0\n            ],\n            nice: niceScale,\n            zero: true,\n            reverse: dock === 'top'\n        };\n        const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n        (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: props.globalAggregateMaxExtentScaledSignal,\n            update: dock === 'bottom' ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}` : globalAggregateMaxExtentScaledValue\n        });\n        return {\n            offsets: offsets,\n            sizeSignals: horizontal ? {\n                layoutHeight: parentScope.sizeSignals.layoutHeight,\n                layoutWidth: null\n            } : {\n                layoutHeight: null,\n                layoutWidth: parentScope.sizeSignals.layoutWidth\n            },\n            globalScales: {\n                showAxes: showAxes,\n                scales: {\n                    x: horizontal ? [\n                        scale\n                    ] : undefined,\n                    y: horizontal ? undefined : [\n                        scale\n                    ]\n                }\n            },\n            encodingRuleMap: horizontal ? {\n                x: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        signal: parentScope.offsets.x\n                    }\n                ],\n                width: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ]\n            } : {\n                y: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        signal: dock === 'top' ? parentScope.offsets.y : (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, parentScope.offsets.h)\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n    getTransforms(aggregation, groupby) {\n        const trans = {\n            type: 'joinaggregate',\n            groupby: groupby.map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n            ops: [\n                aggregation\n            ]\n        };\n        if (aggregation === 'sum') trans.fields = [\n            this.props.sumBy.name\n        ].map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b));\n        return trans;\n    }\n    getAggregation() {\n        const { props: props } = this;\n        let s;\n        if (props.dock === 'left') s = props.axesScales.x;\n        else s = props.axesScales.y;\n        switch(s.aggregate){\n            case 'sum':\n                return 'sum';\n            default:\n                return 'count';\n        }\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\nclass $efc98e91e3f0ced6$export$7eda37970b01b2c extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const a = this.props.aggregation;\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            extentData: `data_${p}_extent`\n        };\n    }\n    build() {\n        const { names: names, props: props } = this;\n        const { aggregation: aggregation, globalScope: globalScope, groupings: groupings, onBuild: onBuild, parentScope: parentScope } = props;\n        const { sizeSignals: sizeSignals } = parentScope;\n        (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, (0, $29c6c9793f692470$export$53a21aeef48e14a8)(groupings))), {\n            as: [\n                names.aggregateField\n            ]\n        }), {\n            type: 'extent',\n            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(names.aggregateField),\n            signal: names.globalAggregateExtentSignal\n        });\n        const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n        const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n        const squareMaxArea = `(${[\n            squareMaxSide,\n            squareMaxSide\n        ].join(' * ')})`;\n        const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n        const squareArea = `(${[\n            squareMaxArea,\n            shrinkRatio\n        ].join(' * ')})`;\n        const squareSide = `sqrt(${squareArea})`;\n        const localAggregateMaxExtentScaled = squareSide;\n        onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n        const offsets = {\n            x: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n            y: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n            h: squareSide,\n            w: squareSide\n        };\n        return {\n            offsets: offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        signal: offsets.y\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n    getTransforms(aggregation, groupby) {\n        const trans = {\n            type: 'joinaggregate',\n            groupby: groupby.map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n            ops: [\n                aggregation\n            ]\n        };\n        if (aggregation === 'sum') trans.fields = [\n            this.props.sumBy.name\n        ].map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b));\n        return trans;\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $df1b04e32170cfe5$export$e1e8339c59091971(column, signal) {\n    return {\n        type: 'extent',\n        field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(column.name),\n        signal: signal\n    };\n}\n\n\nfunction $d832bf01a4278a5e$export$6868fd1605c79d3d(prefix, domainDataName, discreteColumn, outerSignalExtents) {\n    const { column: column, defaultBins: defaultBins, maxbins: maxbins, maxbinsSignalDisplayName: maxbinsSignalDisplayName, maxbinsSignalName: maxbinsSignalName } = discreteColumn;\n    if (column.quantitative) {\n        const field = `${prefix}_bin_${(0, $03b4e9c3be7efafd$export$74df930fa4adaae4)(column.name)}`;\n        const fieldEnd = `${field}_end`;\n        const binSignal = `${field}_bins`;\n        const dataExtentSignal = `${field}_bin_extent`;\n        const dataExtentSpanSignal = `${field}_bin_extent_span`;\n        const outerSignal = `${field}_outer_extent`;\n        domainDataName = `${field}_sequence`; //override the data name\n        const extentTransform = (0, $df1b04e32170cfe5$export$e1e8339c59091971)(column, dataExtentSignal);\n        let imageSignal;\n        if (outerSignalExtents) imageSignal = $d832bf01a4278a5e$export$3794e0ea8ab2e895(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n        const maxbinsSignal = {\n            name: maxbinsSignalName,\n            value: defaultBins,\n            bind: {\n                name: maxbinsSignalDisplayName,\n                debounce: $72552551eb533aa6$export$61fc7d43ac8f84b0,\n                input: 'range',\n                min: 1,\n                max: maxbins,\n                step: 1\n            }\n        };\n        const extentSignal = (imageSignal === null || imageSignal === void 0 ? void 0 : imageSignal.name) || dataExtentSignal;\n        const binTransform = {\n            type: 'bin',\n            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(column.name),\n            as: [\n                field,\n                fieldEnd\n            ],\n            signal: binSignal,\n            extent: {\n                signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`\n            },\n            minstep: $d832bf01a4278a5e$export$a1300c781a434acb(column) ? 1 : 0,\n            maxbins: {\n                signal: maxbinsSignalName\n            }\n        };\n        const dataSequence = {\n            name: domainDataName,\n            transform: [\n                {\n                    type: 'sequence',\n                    start: {\n                        signal: `${binSignal}.start`\n                    },\n                    stop: {\n                        signal: `${binSignal}.stop`\n                    },\n                    step: {\n                        signal: `${binSignal}.step`\n                    }\n                },\n                {\n                    type: 'formula',\n                    expr: 'datum.data',\n                    as: field\n                },\n                {\n                    type: 'formula',\n                    expr: `datum.data + ${binSignal}.step`,\n                    as: fieldEnd\n                },\n                {\n                    type: 'window',\n                    ops: [\n                        'row_number'\n                    ],\n                    as: [\n                        (0, $8d0624e259fe9d79$export$10df5429b7082be2).Ordinal\n                    ]\n                },\n                {\n                    type: 'formula',\n                    expr: `datum.data === ${binSignal}.start`,\n                    as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).First\n                },\n                {\n                    type: 'formula',\n                    expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                    as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).Last\n                },\n                {\n                    // when there is only one bin, use only first sequence element\n                    type: 'filter',\n                    expr: `${dataExtentSpanSignal} === 0 ? datum[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).First)}] : true`\n                }\n            ]\n        };\n        const signals = [\n            maxbinsSignal,\n            {\n                name: dataExtentSpanSignal,\n                update: `${extentSignal}[1] - ${extentSignal}[0]`\n            }\n        ];\n        if (imageSignal) signals.push(imageSignal);\n        const augmentBinnable = {\n            discreteColumn: discreteColumn,\n            native: false,\n            transforms: [\n                extentTransform,\n                binTransform\n            ],\n            fields: [\n                field,\n                fieldEnd\n            ],\n            binSignal: binSignal,\n            extentSignal: extentSignal,\n            dataSequence: dataSequence,\n            domainDataName: domainDataName,\n            signals: signals,\n            fullScaleDataname: dataSequence.name\n        };\n        return augmentBinnable;\n    } else {\n        const nativeBinnable = {\n            discreteColumn: discreteColumn,\n            native: true,\n            fields: [\n                column.name\n            ],\n            domainDataName: domainDataName,\n            fullScaleDataname: domainDataName\n        };\n        return nativeBinnable;\n    }\n}\nfunction $d832bf01a4278a5e$export$3794e0ea8ab2e895(name, min, max, dataExtent) {\n    return {\n        name: name,\n        update: `[min(${min}, ${dataExtent}[0]), max(${max}, ${dataExtent}[1])]`\n    };\n}\nfunction $d832bf01a4278a5e$export$a1300c781a434acb(column) {\n    //prevent Vega from showing \".5\" steps between integer scale values\n    return column.quantitative && column.type === 'integer' && column.stats.max - column.stats.min <= 7;\n}\n\n\n\n\n\n\n\nconst $cef2083591a92ad5$export$d437166a1bdbfdf0 = '_linear';\nclass $cef2083591a92ad5$export$5b22a87d7feca398 extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `band_${this.id}`;\n        this.names = {\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            bandWidth: `${p}_bandwidth`,\n            accumulative: `${p}_accumulative`\n        };\n        this.bin = (0, $d832bf01a4278a5e$export$6868fd1605c79d3d)(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n    }\n    getGrouping() {\n        return this.bin.fields;\n    }\n    build() {\n        const { bin: bin, names: names, props: props } = this;\n        const { globalScope: globalScope, minBandWidth: minBandWidth, orientation: orientation, parentScope: parentScope, showAxes: showAxes } = props;\n        const binField = bin.fields[0];\n        if (bin.native === false) {\n            (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, ...bin.signals);\n            (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, ...bin.transforms);\n            (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, bin.dataSequence);\n        }\n        //TODO don't add this, use existing dataset\n        (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, {\n            name: names.accumulative,\n            source: bin.fullScaleDataname,\n            transform: [\n                {\n                    type: 'aggregate',\n                    groupby: this.getGrouping().map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n                    ops: [\n                        'count'\n                    ]\n                }\n            ]\n        });\n        const horizontal = orientation === 'horizontal';\n        const minCellSignal = horizontal ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n        (0, $8243f48596a5f195$export$cdc9366ba30317bd)(minCellSignal, 'max', `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n        (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: names.bandWidth,\n            update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`\n        });\n        const scale = this.getScale(bin, horizontal);\n        if (props.outerSignalExtents && bin.native === false) //add a linear scale for use by background image\n        (0, $29c6c9793f692470$export$290268902279a991)(globalScope.scope, (0, $7fac7254f262c640$export$fefe9507ec0904ed)(scale.name + $cef2083591a92ad5$export$d437166a1bdbfdf0, {\n            signal: bin.extentSignal\n        }, scale.range, scale.reverse, false, false));\n        let encodingRuleMap;\n        if (!props.excludeEncodingRuleMap) encodingRuleMap = horizontal ? {\n            x: [\n                {\n                    test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                    signal: parentScope.offsets.x\n                }\n            ],\n            width: [\n                {\n                    test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                    value: 0\n                }\n            ]\n        } : {\n            y: [\n                {\n                    test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                    signal: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, parentScope.offsets.h)\n                }\n            ],\n            height: [\n                {\n                    test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                    value: 0\n                }\n            ]\n        };\n        return {\n            offsets: this.getOffset(horizontal, binField),\n            sizeSignals: horizontal ? {\n                layoutHeight: names.bandWidth,\n                layoutWidth: parentScope.sizeSignals.layoutWidth\n            } : {\n                layoutHeight: parentScope.sizeSignals.layoutHeight,\n                layoutWidth: names.bandWidth\n            },\n            globalScales: {\n                showAxes: showAxes,\n                scales: {\n                    x: horizontal ? undefined : [\n                        scale\n                    ],\n                    y: horizontal ? [\n                        scale\n                    ] : undefined\n                }\n            },\n            encodingRuleMap: encodingRuleMap\n        };\n    }\n    getOffset(horizontal, binField) {\n        const { names: names, props: props } = this;\n        const { parentScope: parentScope } = props;\n        return {\n            x: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.x, horizontal ? '' : `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n            y: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, horizontal ? `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])` : ''),\n            h: horizontal ? names.bandWidth : parentScope.offsets.h,\n            w: horizontal ? parentScope.offsets.w : names.bandWidth\n        };\n    }\n    getScale(bin, horizontal) {\n        const { names: names } = this;\n        const { parentScope: parentScope } = this.props;\n        const binField = (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(bin.fields[0]);\n        let bandScale;\n        if (horizontal) bandScale = {\n            type: 'band',\n            name: names.yScale,\n            range: [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutHeight\n                }\n            ],\n            padding: 0.1,\n            domain: {\n                data: bin.domainDataName,\n                field: binField,\n                sort: true\n            },\n            reverse: true\n        };\n        else bandScale = {\n            type: 'band',\n            name: names.xScale,\n            range: [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutWidth\n                }\n            ],\n            padding: 0.1,\n            domain: {\n                data: bin.domainDataName,\n                field: binField,\n                sort: true\n            }\n        };\n        return bandScale;\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $b12a1eed38ffb3f0$export$f241323700beca17(bin) {\n    const val = (index)=>`datum[${JSON.stringify(bin.fields[index])}]`;\n    return bin.discreteColumn.column.quantitative ? `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')` : val(0);\n}\nfunction $b12a1eed38ffb3f0$var$obj(nameValues, clause) {\n    if (clause) nameValues = [\n        clause,\n        ...nameValues\n    ];\n    return `{${nameValues.join()}}`;\n}\nfunction $b12a1eed38ffb3f0$export$b292ca0d4c2e4690(bin, firstFieldName, lastFieldName, clause) {\n    if (bin.discreteColumn.column.quantitative) {\n        const low = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            'operator:\\'>=\\'',\n            `value:datum[${JSON.stringify(bin.fields[0])}]`\n        ];\n        const high = [\n            'clause:\\'&&\\'',\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            'operator:\\'<\\'',\n            `value:datum[${JSON.stringify(bin.fields[1])}]`\n        ];\n        return $b12a1eed38ffb3f0$var$obj([\n            `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${$b12a1eed38ffb3f0$var$obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${$b12a1eed38ffb3f0$var$obj(high)}]`\n        ], clause);\n    } else {\n        const exact = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            'operator:\\'==\\'',\n            `value:datum[${JSON.stringify(bin.fields[0])}]`\n        ];\n        return $b12a1eed38ffb3f0$var$obj([\n            `expressions:[${$b12a1eed38ffb3f0$var$obj(exact)}]`\n        ], clause);\n    }\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $3aee2b63ed318776$export$71d2e96f63f1ac97(source, prefix, binFields, sortOrder) {\n    const _binFields = binFields.map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b));\n    const dataName = `${prefix}_bin_order`;\n    const data = {\n        name: dataName,\n        source: source,\n        transform: [\n            {\n                type: 'aggregate',\n                groupby: _binFields\n            },\n            {\n                type: 'collect',\n                sort: {\n                    field: _binFields,\n                    order: _binFields.map((f)=>sortOrder)\n                }\n            },\n            {\n                type: 'window',\n                ops: [\n                    'row_number'\n                ],\n                as: [\n                    (0, $8d0624e259fe9d79$export$10df5429b7082be2).Ordinal\n                ]\n            }\n        ]\n    };\n    return {\n        data: data,\n        scale: $3aee2b63ed318776$export$f85d5aad90241781(dataName, `scale_${prefix}_order`, binFields)\n    };\n}\nfunction $3aee2b63ed318776$export$f85d5aad90241781(dataName, scaleName, binFields) {\n    return {\n        type: 'ordinal',\n        name: scaleName,\n        domain: {\n            data: dataName,\n            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(binFields[0])\n        },\n        range: {\n            data: dataName,\n            field: (0, $8d0624e259fe9d79$export$10df5429b7082be2).Ordinal\n        }\n    };\n}\n\n\n\n\nclass $ad34ec84cd0de2bf$export$3c877bb842c36952 extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `cross_${this.id}`;\n        this.binX = (0, $d832bf01a4278a5e$export$6868fd1605c79d3d)(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n        this.binY = (0, $d832bf01a4278a5e$export$6868fd1605c79d3d)(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n        this.names = {\n            facetDataName: `data_${p}_facet`,\n            searchUnion: `data_${p}_search`,\n            dimScale: `scale_${p}`,\n            dimCount: `${p}_count`,\n            dimCategorical: `data_${p}_cat`,\n            dimCellSize: `${p}_cell_size`,\n            dimCellSizeCalc: `${p}_cell_calc`\n        };\n    }\n    getGrouping() {\n        return this.binX.fields.concat(this.binY.fields);\n    }\n    build() {\n        const { binX: binX, binY: binY, names: names, prefix: prefix, props: props } = this;\n        const { axisTextColor: axisTextColor, colRowTitles: colRowTitles, globalScope: globalScope, parentScope: parentScope } = props;\n        const titles = {\n            x: {\n                dataName: null,\n                quantitative: null\n            },\n            y: {\n                dataName: null,\n                quantitative: null\n            }\n        };\n        const dx = {\n            dim: 'x',\n            bin: binX,\n            sortOrder: 'ascending',\n            size: parentScope.sizeSignals.layoutWidth,\n            layout: parentScope.sizeSignals.layoutWidth,\n            min: globalScope.signals.minCellWidth.name,\n            out: globalScope.signals.plotWidthOut,\n            offset: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingLeft,\n            padding: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingLeft,\n            dataOut: null,\n            scaleName: null,\n            position: null\n        };\n        const dy = {\n            dim: 'y',\n            bin: binY,\n            sortOrder: 'ascending',\n            size: parentScope.sizeSignals.layoutHeight,\n            layout: parentScope.sizeSignals.layoutHeight,\n            min: globalScope.signals.minCellHeight.name,\n            out: globalScope.signals.plotHeightOut,\n            offset: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop,\n            padding: `(${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingBottom})`,\n            dataOut: null,\n            scaleName: null,\n            position: null\n        };\n        const dimensions = [\n            dx,\n            dy\n        ];\n        dimensions.forEach((d)=>{\n            const { bin: bin, dim: dim, padding: padding, sortOrder: sortOrder } = d;\n            let data;\n            let dataName;\n            let countSignal;\n            let scale;\n            const titleSource = titles[dim];\n            if (bin.native === false) {\n                (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, ...bin.signals);\n                (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, ...bin.transforms);\n                (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, bin.dataSequence);\n                (0, $29c6c9793f692470$export$eea5d31e98930019)(bin.dataSequence, {\n                    type: 'formula',\n                    expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                    as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).Contains\n                });\n                data = bin.dataSequence;\n                dataName = bin.dataSequence.name;\n                countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                scale = (0, $3aee2b63ed318776$export$f85d5aad90241781)(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                titleSource.dataName = bin.dataSequence.name;\n            } else {\n                dataName = globalScope.markDataName;\n                const ord = (0, $3aee2b63ed318776$export$71d2e96f63f1ac97)(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                data = ord.data;\n                (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, ord.data);\n                countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                scale = ord.scale;\n                titleSource.dataName = ord.data.name;\n            }\n            titleSource.quantitative = bin.discreteColumn.column.quantitative;\n            d.dataOut = data;\n            d.scaleName = scale.name;\n            (0, $29c6c9793f692470$export$eea5d31e98930019)(data, {\n                type: 'formula',\n                expr: (0, $b12a1eed38ffb3f0$export$b292ca0d4c2e4690)(bin, (0, $8d0624e259fe9d79$export$10df5429b7082be2).First, (0, $8d0624e259fe9d79$export$10df5429b7082be2).Last),\n                as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetSearch\n            }, {\n                type: 'formula',\n                expr: (0, $b12a1eed38ffb3f0$export$f241323700beca17)(bin),\n                as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetTitle\n            });\n            (0, $29c6c9793f692470$export$290268902279a991)(globalScope.scope, scale);\n            const count = `${names.dimCount}_${dim}`;\n            const calc = `${names.dimCellSizeCalc}_${dim}`;\n            const size = `${names.dimCellSize}_${dim}`;\n            (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n                name: count,\n                update: countSignal\n            });\n            (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n                name: calc,\n                update: `${d.layout} / ${count}`\n            }, {\n                name: size,\n                update: `max(${d.min}, (${calc} - ${padding}))`\n            });\n            (0, $8243f48596a5f195$export$cdc9366ba30317bd)(d.out, 'max', `((${size} + ${padding}) * ${count})`);\n            d.position = this.dimensionOffset(d);\n        });\n        const groupRow = {\n            type: 'group',\n            encode: {\n                update: {\n                    y: {\n                        signal: dy.position\n                    }\n                }\n            },\n            from: {\n                data: dy.dataOut.name\n            },\n            data: [\n                {\n                    name: names.searchUnion,\n                    source: dx.dataOut.name,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: `[datum[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetSearch)}], merge(parent[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetSearch)}], { clause: '&&'})]`,\n                            as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetSearch\n                        }\n                    ]\n                }\n            ]\n        };\n        const groupCol = {\n            style: 'cell',\n            name: prefix,\n            type: 'group',\n            encode: {\n                update: {\n                    height: {\n                        signal: `${names.dimCellSize}_y`\n                    },\n                    width: {\n                        signal: `${names.dimCellSize}_x`\n                    },\n                    x: {\n                        signal: dx.position\n                    }\n                }\n            },\n            from: {\n                data: names.searchUnion\n            }\n        };\n        (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope.markGroup, groupRow);\n        (0, $29c6c9793f692470$export$3df320e901c23a48)(groupRow, groupCol);\n        const offsets = {\n            x: this.dimensionOffset(dx),\n            y: this.dimensionOffset(dy),\n            h: `${names.dimCellSize}_y`,\n            w: `${names.dimCellSize}_x`\n        };\n        const sizeSignals = {\n            layoutHeight: `${names.dimCellSize}_y`,\n            layoutWidth: `${names.dimCellSize}_x`,\n            colCount: `${names.dimCount}_x`,\n            rowCount: `${names.dimCount}_y`\n        };\n        if (colRowTitles) (0, $e298df2c870b2b1c$export$4fec84497b9e6e3f)(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n        return {\n            facetScope: groupCol,\n            offsets: offsets,\n            sizeSignals: sizeSignals,\n            titles: titles\n        };\n    }\n    dimensionOffset(d) {\n        const { names: names } = this;\n        return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\n\n\n\n\nclass $400f8948076e2f06$export$1c460fb4285edadc extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `scatter_${this.id}`;\n        this.names = {\n            aggregateData: `data_${p}_aggregate`,\n            markData: `data_${p}_mark`,\n            xDataExtent: `${p}_xDataExtent`,\n            yDataExtent: `${p}_yDataExtent`,\n            xExtent: `${p}_xExtent`,\n            yExtent: `${p}_yExtent`,\n            sizeExtent: `${p}_sizeExtent`,\n            sizeRange: `${p}_sizeRange`,\n            sizeScale: `${p}_sizeScale`,\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names: names, prefix: prefix, props: props } = this;\n        const { backgroundImageExtents: backgroundImageExtents, globalScope: globalScope, parentScope: parentScope, scatterPointScaleDisplay: scatterPointScaleDisplay, showAxes: showAxes, size: size, view: view, x: x, y: y, z: z, zGrounded: zGrounded } = props;\n        const qsize = size && size.quantitative && size;\n        (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).PointScale,\n            value: 5,\n            bind: {\n                name: scatterPointScaleDisplay,\n                debounce: $72552551eb533aa6$export$61fc7d43ac8f84b0,\n                input: 'range',\n                min: 1,\n                max: 10,\n                step: 0.1\n            }\n        }, {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).ZGrounded,\n            value: false,\n            bind: {\n                name: zGrounded,\n                input: 'checkbox'\n            }\n        });\n        if (backgroundImageExtents) {\n            (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, (0, $df1b04e32170cfe5$export$e1e8339c59091971)(x, names.xDataExtent), (0, $df1b04e32170cfe5$export$e1e8339c59091971)(y, names.yDataExtent));\n            const xSignal = (0, $d832bf01a4278a5e$export$3794e0ea8ab2e895)(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n            const ySignal = (0, $d832bf01a4278a5e$export$3794e0ea8ab2e895)(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n            (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, xSignal, ySignal);\n        }\n        if (qsize) {\n            (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, {\n                type: 'extent',\n                field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(qsize.name),\n                signal: names.sizeExtent\n            });\n            (0, $29c6c9793f692470$export$290268902279a991)(globalScope.scope, {\n                name: names.sizeScale,\n                type: 'pow',\n                exponent: 0.5,\n                domain: [\n                    0,\n                    {\n                        signal: `${names.sizeExtent}[1]`\n                    }\n                ],\n                range: [\n                    0,\n                    {\n                        signal: names.sizeRange\n                    }\n                ]\n            });\n            (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n                name: names.sizeRange,\n                update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${(0, $72552551eb533aa6$export$c223d3ee3c0620d9)}`\n            });\n        }\n        (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, {\n            name: names.markData,\n            source: globalScope.markDataName,\n            transform: [\n                x,\n                y,\n                z\n            ].map((c)=>{\n                if (!c || !c.quantitative) return;\n                const t = {\n                    type: 'filter',\n                    expr: `isValid(datum[${JSON.stringify(c.name)}])`\n                };\n                return t;\n            }).filter(Boolean)\n        });\n        globalScope.setMarkDataName(names.markData);\n        const globalScales = {\n            showAxes: showAxes,\n            scales: {}\n        };\n        const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n        const sizeValueSignal = qsize ? `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${(0, $8d0624e259fe9d79$export$809e371dee643808).PointScale}` : (0, $8d0624e259fe9d79$export$809e371dee643808).PointScale;\n        const update = Object.assign({\n            height: [\n                {\n                    test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                    value: 0\n                },\n                {\n                    signal: sizeValueSignal\n                }\n            ],\n            width: {\n                signal: sizeValueSignal\n            }\n        }, z && {\n            z: [\n                {\n                    test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                    value: 0\n                },\n                {\n                    signal: `${(0, $8d0624e259fe9d79$export$809e371dee643808).ZGrounded} ? 0 : ${zValue}`\n                }\n            ],\n            zindex: [\n                {\n                    signal: `${(0, $8d0624e259fe9d79$export$809e371dee643808).ZGrounded} ? 0 : ${zValue}`\n                }\n            ],\n            depth: [\n                {\n                    test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                    value: 0\n                },\n                {\n                    signal: view === '3d' ? `${(0, $8d0624e259fe9d79$export$809e371dee643808).ZGrounded} ? ${zValue} : ${sizeValueSignal}` : '0'\n                }\n            ]\n        });\n        const columnSignals = [\n            {\n                column: x,\n                xyz: 'x',\n                scaleName: names.xScale,\n                domain: backgroundImageExtents ? {\n                    signal: names.xExtent\n                } : {\n                    data: globalScope.data.name,\n                    field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(x.name)\n                },\n                reverse: false,\n                signal: parentScope.sizeSignals.layoutWidth\n            },\n            {\n                column: y,\n                xyz: 'y',\n                scaleName: names.yScale,\n                domain: backgroundImageExtents ? {\n                    signal: names.yExtent\n                } : {\n                    data: globalScope.data.name,\n                    field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(y.name)\n                },\n                reverse: true,\n                signal: parentScope.sizeSignals.layoutHeight\n            },\n            {\n                column: z,\n                xyz: 'z',\n                scaleName: names.zScale,\n                domain: {\n                    data: globalScope.data.name,\n                    field: z ? (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(z.name) : null\n                },\n                reverse: false,\n                signal: view === '3d' ? `(${globalScope.zSize}) * ${(0, $8d0624e259fe9d79$export$809e371dee643808).ZProportion}` : `10 * ${(0, $8d0624e259fe9d79$export$809e371dee643808).ZProportion}`\n            }\n        ];\n        columnSignals.forEach((cs)=>{\n            const { column: column, domain: domain, reverse: reverse, scaleName: scaleName, signal: signal, xyz: xyz } = cs;\n            if (!column) return;\n            let scale;\n            if (column.quantitative) {\n                scale = (0, $7fac7254f262c640$export$fefe9507ec0904ed)(scaleName, domain, [\n                    0,\n                    {\n                        signal: signal\n                    }\n                ], reverse, false, showAxes);\n                if ((0, $d832bf01a4278a5e$export$a1300c781a434acb)(column)) scale.bins = {\n                    step: 1\n                };\n            } else scale = (0, $7fac7254f262c640$export$b67158f831e00d0d)(scaleName, globalScope.data.name, [\n                0,\n                {\n                    signal: signal\n                }\n            ], column.name, reverse);\n            globalScales.scales[xyz] = [\n                scale\n            ];\n        });\n        const mark = {\n            name: prefix,\n            type: 'rect',\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: update\n            }\n        };\n        (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope.markGroup, mark);\n        return {\n            offsets: {\n                x: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                y: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                h: sizeValueSignal,\n                w: sizeValueSignal\n            },\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            globalScales: globalScales,\n            mark: mark,\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        signal: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight)\n                    }\n                ]\n            }\n        };\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nfunction $a2cc661c2a61585d$export$9e1d5954d0bb865c(z, zSize, dataName, zScaleName) {\n    if (z) {\n        const zRange = [\n            0,\n            {\n                signal: `(${zSize}) * ${(0, $8d0624e259fe9d79$export$809e371dee643808).ZProportion}`\n            }\n        ];\n        const scale = z.quantitative ? (0, $7fac7254f262c640$export$fefe9507ec0904ed)(zScaleName, {\n            data: dataName,\n            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(z.name)\n        }, zRange, false, true) : (0, $7fac7254f262c640$export$b67158f831e00d0d)(zScaleName, dataName, zRange, z.name, false);\n        return scale;\n    }\n}\n\n\nclass $0921378644518b2d$export$b09fb900337259de extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `square_${this.id}`;\n        this.names = {\n            bandWidth: this.getBandWidth(),\n            maxGroupField: `${p}_max_group`,\n            maxGroupSignal: `${p}_max_grouping`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names: names, prefix: prefix, props: props } = this;\n        const { fillDirection: fillDirection, globalScope: globalScope, groupings: groupings, parentScope: parentScope, collapseYHeight: collapseYHeight, showAxes: showAxes, sortBy: sortBy, view: view, z: z } = props;\n        const zScale = (0, $a2cc661c2a61585d$export$9e1d5954d0bb865c)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, Object.assign({\n            type: 'stack',\n            groupby: (0, $29c6c9793f692470$export$53a21aeef48e14a8)(groupings).map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n            as: [\n                names.stack0,\n                names.stack1\n            ]\n        }, sortBy && {\n            sort: {\n                field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(sortBy.name),\n                order: 'ascending'\n            }\n        }));\n        const { gap: gap, levelSize: levelSize, size: size, squaresPerBand: squaresPerBand } = this.addSignals();\n        const heightSignal = {\n            signal: fillDirection === 'down-right' ? size : levelSize\n        };\n        const mark = {\n            name: prefix,\n            type: 'rect',\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    height: collapseYHeight ? [\n                        {\n                            test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                            value: 0\n                        },\n                        heightSignal\n                    ] : heightSignal,\n                    width: {\n                        signal: fillDirection === 'down-right' ? levelSize : size\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                            value: 0\n                        },\n                        view === '3d' ? {\n                            scale: names.zScale,\n                            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(z.name)\n                        } : {\n                            value: 0\n                        }\n                    ]\n                })\n            }\n        };\n        (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope.markGroup, mark);\n        const { tx: tx, ty: ty } = this.transformXY(gap, levelSize, squaresPerBand);\n        return Object.assign(Object.assign(Object.assign({}, z && {\n            globalScales: {\n                showAxes: showAxes,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            }\n        }), {\n            offsets: {\n                x: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.x, tx.expr),\n                y: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, ty.expr),\n                h: size,\n                w: size\n            },\n            mark: mark,\n            sizeSignals: {\n                layoutHeight: size,\n                layoutWidth: size\n            }\n        }), collapseYHeight && {\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        signal: parentScope.offsets.y\n                    }\n                ]\n            }\n        });\n    }\n    getBandWidth() {\n        const { offsets: offsets } = this.props.parentScope;\n        switch(this.props.fillDirection){\n            case 'down-right':\n                return offsets.h;\n            default:\n                return offsets.w;\n        }\n    }\n    addSignals() {\n        const { names: names, props: props } = this;\n        const { fillDirection: fillDirection, globalScope: globalScope, groupings: groupings, parentScope: parentScope } = props;\n        let { maxGroupedFillSize: maxGroupedFillSize, maxGroupedUnits: maxGroupedUnits } = props;\n        if (!maxGroupedUnits) {\n            if (groupings) {\n                (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, {\n                    type: 'joinaggregate',\n                    groupby: (0, $29c6c9793f692470$export$53a21aeef48e14a8)(groupings).map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n                    ops: [\n                        'count'\n                    ],\n                    as: [\n                        names.maxGroupField\n                    ]\n                }, {\n                    type: 'extent',\n                    field: names.maxGroupField,\n                    signal: names.maxGroupSignal\n                });\n                maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n            } else maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n        }\n        if (!maxGroupedFillSize) maxGroupedFillSize = fillDirection === 'down-right' ? parentScope.offsets.w : parentScope.offsets.h;\n        const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n        const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n        const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n        const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n        const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n        const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n        return {\n            gap: gap,\n            levelSize: levelSize,\n            size: size,\n            squaresPerBand: squaresPerBand\n        };\n    }\n    transformXY(gap, levelSize, squaresPerBand) {\n        const { names: names, prefix: prefix } = this;\n        const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n        const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n        const { fillDirection: fillDirection, parentScope: parentScope } = this.props;\n        const tx = {\n            type: 'formula',\n            expr: null,\n            as: `${prefix}_${(0, $8d0624e259fe9d79$export$10df5429b7082be2).OffsetX}`\n        };\n        const ty = {\n            type: 'formula',\n            expr: null,\n            as: `${prefix}_${(0, $8d0624e259fe9d79$export$10df5429b7082be2).OffsetY}`\n        };\n        switch(fillDirection){\n            case 'down-right':\n                tx.expr = `${level} * (${levelSize} + ${gap})`;\n                ty.expr = compartment;\n                break;\n            case 'right-up':\n                tx.expr = compartment;\n                ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                break;\n            case 'right-down':\n            default:\n                tx.expr = compartment;\n                ty.expr = `${level} * (${levelSize} + ${gap})`;\n                break;\n        }\n        return {\n            tx: tx,\n            ty: ty\n        };\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\nclass $ea238a52b780f861$export$694e0d28c7ffc90c extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `stack_${this.id}`;\n        this.names = {\n            cube: `${p}_cube`,\n            globalDataName: `data_${p}_count`,\n            globalExtent: `${p}_global_extent`,\n            levelDataName: `data_${p}_level`,\n            count: `${p}_count`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            sequence: `data_${p}_sequence`,\n            sides: `${p}_sides`,\n            size: `${p}_size`,\n            squared: `${p}_squared`,\n            maxCount: `${p}_maxCount`,\n            maxLevels: `${p}_maxLevels`,\n            zScale: `${p}_zScale`\n        };\n    }\n    build() {\n        const { names: names, props: props } = this;\n        const { globalScope: globalScope, groupings: groupings, parentScope: parentScope, showAxes: showAxes, sort: sort } = props;\n        const { sizeSignals: sizeSignals } = parentScope;\n        (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, {\n            type: 'joinaggregate',\n            groupby: (0, $29c6c9793f692470$export$53a21aeef48e14a8)(groupings).map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n            ops: [\n                'count'\n            ],\n            as: [\n                names.count\n            ]\n        }, {\n            type: 'extent',\n            field: names.count,\n            signal: names.globalExtent\n        }, Object.assign({\n            type: 'stack',\n            groupby: (0, $29c6c9793f692470$export$53a21aeef48e14a8)(groupings).map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n            as: [\n                names.stack0,\n                names.stack1\n            ]\n        }, sort && {\n            sort: {\n                field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(sort.name),\n                order: 'ascending'\n            }\n        }));\n        (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, {\n            name: names.sequence,\n            transform: [\n                {\n                    type: 'sequence',\n                    start: 1,\n                    stop: {\n                        signal: `sqrt(${names.globalExtent}[1])`\n                    }\n                },\n                {\n                    type: 'formula',\n                    expr: 'datum.data * datum.data',\n                    as: 'squared'\n                },\n                {\n                    type: 'formula',\n                    expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                    as: 'maxlevels'\n                },\n                {\n                    type: 'formula',\n                    expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                    as: 'side'\n                },\n                {\n                    type: 'formula',\n                    expr: 'datum.side * datum.maxlevels + datum.maxlevels - 1',\n                    as: 'sidecubeheight'\n                },\n                {\n                    type: 'formula',\n                    expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                    as: 'heightmatch'\n                },\n                {\n                    type: 'collect',\n                    sort: {\n                        field: 'heightmatch',\n                        order: 'ascending'\n                    }\n                },\n                {\n                    type: 'window',\n                    ops: [\n                        'row_number'\n                    ]\n                },\n                {\n                    type: 'filter',\n                    expr: 'datum.row_number === 1'\n                }\n            ]\n        });\n        (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: names.size,\n            update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`\n        }, {\n            name: names.squared,\n            update: `data('${names.sequence}')[0].squared`\n        }, {\n            name: names.sides,\n            update: `sqrt(${names.squared})`\n        }, {\n            name: names.cube,\n            update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`\n        }, {\n            name: names.maxLevels,\n            update: `data('${names.sequence}')[0].maxlevels`\n        }, {\n            name: names.maxCount,\n            update: `${names.maxLevels} * ${names.squared}`\n        });\n        const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n        const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n        const cubeX = `(${layerOrdinal} % ${names.sides})`;\n        const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n        const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n        const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n        const offsets = {\n            x: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n            y: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n            h: names.size,\n            w: names.size\n        };\n        const mark = {\n            type: 'rect',\n            from: {\n                data: this.names.levelDataName\n            },\n            encode: {\n                update: {\n                    z: {\n                        signal: `${zLevel} * (${names.cube} + 1)`\n                    },\n                    height: {\n                        signal: names.cube\n                    },\n                    width: {\n                        signal: names.cube\n                    },\n                    depth: {\n                        signal: names.cube\n                    }\n                }\n            }\n        };\n        (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope.markGroup, mark);\n        const zScale = {\n            type: 'linear',\n            name: names.zScale,\n            domain: [\n                0,\n                {\n                    signal: names.maxCount\n                }\n            ],\n            range: [\n                0,\n                {\n                    signal: `${names.maxLevels} * (${names.cube} + 1) - 1`\n                }\n            ],\n            nice: false\n        };\n        return {\n            offsets: offsets,\n            mark: mark,\n            sizeSignals: {\n                layoutHeight: names.size,\n                layoutWidth: names.size\n            },\n            globalScales: {\n                showAxes: showAxes,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            },\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        signal: parentScope.offsets.y\n                    }\n                ],\n                z: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ],\n                depth: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\n\nclass $e51cd95b5dfb2b00$export$c4df0d8c6c8f50e4 extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `strip_${this.id}`;\n        this.names = {\n            firstField: `${p}${(0, $8d0624e259fe9d79$export$10df5429b7082be2).First}`,\n            lastField: `${p}${(0, $8d0624e259fe9d79$export$10df5429b7082be2).Last}`,\n            valueField: `${p}${(0, $8d0624e259fe9d79$export$10df5429b7082be2).Value}`,\n            scale: `scale_${p}`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names: names, prefix: prefix, props: props } = this;\n        const { addPercentageScale: addPercentageScale, globalScope: globalScope, groupings: groupings, orientation: orientation, showAxes: showAxes, size: size, sort: sort, sortOrder: sortOrder, parentScope: parentScope, view: view, z: z } = props;\n        const zScale = (0, $a2cc661c2a61585d$export$9e1d5954d0bb865c)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        const horizontal = orientation === 'horizontal';\n        const transform = [];\n        if (sort) transform.push({\n            type: 'collect',\n            sort: {\n                field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(sort.name),\n                order: sortOrder\n            }\n        });\n        let stackField;\n        if (size) {\n            stackField = size.name;\n            transform.push({\n                type: 'filter',\n                expr: `datum[${JSON.stringify(size.name)}] > 0`\n            });\n        } else {\n            stackField = names.valueField;\n            transform.push({\n                type: 'formula',\n                expr: '1',\n                as: stackField\n            });\n        }\n        const stackTransform = {\n            type: 'stack',\n            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(stackField),\n            offset: 'normalize',\n            as: [\n                names.firstField,\n                names.lastField\n            ]\n        };\n        if (groupings.length) stackTransform.groupby = (0, $29c6c9793f692470$export$53a21aeef48e14a8)(groupings).map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b));\n        transform.push(stackTransform);\n        (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, ...transform);\n        const span = [\n            names.lastField,\n            names.firstField\n        ].map((f)=>`datum[${JSON.stringify(f)}]`).join(' - ');\n        const offsets = {\n            x: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.x, horizontal ? `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})` : ''),\n            y: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, horizontal ? '' : `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n            h: horizontal ? parentScope.offsets.h : `(${span}) * (${parentScope.offsets.h})`,\n            w: horizontal ? `(${span}) * (${parentScope.offsets.w})` : parentScope.offsets.w\n        };\n        const mark = {\n            name: prefix,\n            type: 'rect',\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    height: {\n                        signal: offsets.h\n                    },\n                    width: {\n                        signal: offsets.w\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                            value: 0\n                        },\n                        view === '3d' ? {\n                            scale: names.zScale,\n                            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(z.name)\n                        } : {\n                            value: 0\n                        }\n                    ]\n                })\n            }\n        };\n        (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope.markGroup, mark);\n        let percentageScale;\n        if (addPercentageScale) percentageScale = [\n            {\n                type: 'linear',\n                name: names.scale,\n                domain: [\n                    0,\n                    100\n                ],\n                range: horizontal ? [\n                    0,\n                    {\n                        signal: parentScope.sizeSignals.layoutWidth\n                    }\n                ] : [\n                    {\n                        signal: parentScope.sizeSignals.layoutHeight\n                    },\n                    0\n                ]\n            }\n        ];\n        return {\n            globalScales: {\n                showAxes: showAxes,\n                scales: {\n                    x: horizontal ? percentageScale : undefined,\n                    y: horizontal ? undefined : percentageScale,\n                    z: zScale && [\n                        zScale\n                    ]\n                }\n            },\n            offsets: offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            mark: mark\n        };\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\n\nclass $9a589015cb5fa9f5$export$d685cd2b84b49ee extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `treemap_${this.id}`;\n        this.names = {\n            dataName: `data_${p}`,\n            dataHeightWidth: `data_${p}_hw`,\n            dataExtents: `data_${p}_extents`,\n            dataFacet: `data_${p}_facet`,\n            dataFacetMark: `data_${p}_facetMark`,\n            fieldChildren: `${p}_children`,\n            fieldDepth: `${p}_depth`,\n            fieldX0: `${p}_x0`,\n            fieldX1: `${p}_x1`,\n            fieldY0: `${p}_y0`,\n            fieldY1: `${p}_y1`,\n            fieldHeight: `${p}_h`,\n            fieldWidth: `${p}_w`,\n            heightExtent: `${p}_heightExtent`,\n            widthExtent: `${p}_widthExtent`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names: names, props: props } = this;\n        const { globalScope: globalScope, parentScope: parentScope, showAxes: showAxes, treeMapMethod: treeMapMethod, z: z } = props;\n        const zScale = (0, $a2cc661c2a61585d$export$9e1d5954d0bb865c)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        const offsets = {\n            x: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.x, $9a589015cb5fa9f5$var$fn(names.fieldX0)),\n            y: (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, $9a589015cb5fa9f5$var$fn(names.fieldY0)),\n            h: $9a589015cb5fa9f5$var$subtract(names.fieldY1, names.fieldY0),\n            w: $9a589015cb5fa9f5$var$subtract(names.fieldX1, names.fieldX0)\n        };\n        const mark = this.transformedMark(offsets);\n        (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: (0, $8d0624e259fe9d79$export$809e371dee643808).TreeMapMethod,\n            value: 'squarify',\n            bind: {\n                name: treeMapMethod,\n                input: 'select',\n                options: [\n                    'squarify',\n                    'binary'\n                ]\n            }\n        });\n        return Object.assign(Object.assign({}, z && {\n            globalScales: {\n                showAxes: showAxes,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            }\n        }), {\n            mark: mark,\n            offsets: offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            }\n        });\n    }\n    transformedMark(offsets) {\n        const { names: names, props: props } = this;\n        const { globalScope: globalScope, groupings: groupings, parentScope: parentScope } = props;\n        if (groupings.length) {\n            //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n            (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, {\n                name: names.dataHeightWidth,\n                source: globalScope.markDataName,\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: parentScope.offsets.h,\n                        as: names.fieldHeight\n                    },\n                    {\n                        type: 'formula',\n                        expr: parentScope.offsets.w,\n                        as: names.fieldWidth\n                    }\n                ]\n            });\n            const treemapData = {\n                name: names.dataFacetMark,\n                source: names.dataFacet\n            };\n            const facets = {\n                type: 'group',\n                from: {\n                    facet: {\n                        name: names.dataFacet,\n                        data: names.dataHeightWidth,\n                        groupby: (0, $29c6c9793f692470$export$53a21aeef48e14a8)(groupings).map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b))\n                    }\n                },\n                data: [\n                    {\n                        name: names.dataExtents,\n                        source: names.dataFacet,\n                        transform: [\n                            {\n                                type: 'extent',\n                                field: names.fieldHeight,\n                                signal: names.heightExtent\n                            },\n                            {\n                                type: 'extent',\n                                field: names.fieldWidth,\n                                signal: names.widthExtent\n                            }\n                        ]\n                    },\n                    treemapData\n                ]\n            };\n            globalScope.setMarkDataName(names.dataFacetMark);\n            (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope.markGroup, facets);\n            //assign new markgroup after adding mark to original group\n            globalScope.setMarkGroup(facets);\n            this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n            return this.addMark(offsets, facets, globalScope.markDataName);\n        } else {\n            this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n            return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n        }\n    }\n    addMark(offsets, markParent, markDataName) {\n        const { names: names, prefix: prefix, props: props } = this;\n        const { view: view, z: z } = props;\n        const mark = {\n            name: prefix,\n            type: 'rect',\n            from: {\n                data: markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    width: {\n                        signal: offsets.w\n                    },\n                    height: {\n                        signal: offsets.h\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, $0299c0d9f55fe75f$export$71c45f78b1166d35)(),\n                            value: 0\n                        },\n                        view === '3d' ? {\n                            scale: names.zScale,\n                            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(z.name)\n                        } : {\n                            value: 0\n                        }\n                    ]\n                })\n            }\n        };\n        (0, $29c6c9793f692470$export$3df320e901c23a48)(markParent, mark);\n        return mark;\n    }\n    treemapTransform(treemapData, widthSignal, heightSignal) {\n        const { names: names, props: props } = this;\n        const { group: group, size: size } = props;\n        (0, $29c6c9793f692470$export$eea5d31e98930019)(treemapData, {\n            type: 'filter',\n            expr: `datum[${JSON.stringify(size.name)}] > 0`\n        }, {\n            type: 'nest',\n            keys: [\n                group && group.name || '__NONE__'\n            ]\n        }, {\n            type: 'treemap',\n            field: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(size.name),\n            sort: {\n                field: 'value',\n                order: 'descending'\n            },\n            round: true,\n            method: {\n                signal: (0, $8d0624e259fe9d79$export$809e371dee643808).TreeMapMethod\n            },\n            paddingInner: 1,\n            paddingOuter: 0,\n            size: [\n                {\n                    signal: widthSignal\n                },\n                {\n                    signal: heightSignal\n                }\n            ],\n            as: [\n                names.fieldX0,\n                names.fieldY0,\n                names.fieldX1,\n                names.fieldY1,\n                names.fieldDepth,\n                names.fieldChildren\n            ]\n        });\n    }\n}\nfunction $9a589015cb5fa9f5$var$fn(n) {\n    return `datum[${JSON.stringify(n)}]`;\n}\nfunction $9a589015cb5fa9f5$var$subtract(...fields) {\n    return fields.map((n)=>$9a589015cb5fa9f5$var$fn(n)).join(' - ');\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\n\n\n\n\nclass $a19e9bd8fb28b427$export$f6b1e3902165e5e1 extends (0, $748726ce52deaf5d$export$c84671f46d6a1ca) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `wrap_${this.id}`;\n        this.bin = (0, $d832bf01a4278a5e$export$6868fd1605c79d3d)(this.prefix, props.globalScope.data.name, props.groupby);\n        this.names = {\n            outputData: `data_${p}_out`,\n            rowColumnDataName: `data_${p}_row_col`,\n            cellHeight: `${p}_cellHeight`,\n            cellWidth: `${p}_cellWidth`,\n            fits: `${p}_fits`,\n            target: `${p}_target`,\n            minArea: `${p}_minArea`,\n            aspect: `${p}_aspect`,\n            minAspect: `${p}_minAspect`,\n            idealAspect: `${p}_idealAspect`,\n            dataLength: `${p}_dataLength`,\n            rxc0: `${p}_rxc0`,\n            rxc1: `${p}_rxc1`,\n            rxc2: `${p}_rxc2`,\n            rxc: `${p}_rxc`,\n            growColCount: `${p}_growColCount`,\n            growCellWidth: `${p}_growCellWidth`,\n            fitsArea: `${p}_fitsArea`,\n            colCount: `${p}_colCount`\n        };\n    }\n    getGrouping() {\n        return this.bin.fields;\n    }\n    build() {\n        const { bin: bin, names: names, prefix: prefix, props: props } = this;\n        const { axisTextColor: axisTextColor, cellTitles: cellTitles, globalScope: globalScope, parentScope: parentScope } = props;\n        let ordinalBinData;\n        if (bin.native === false) {\n            (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, ...bin.signals);\n            (0, $29c6c9793f692470$export$eea5d31e98930019)(globalScope.data, ...bin.transforms);\n            (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, bin.dataSequence);\n            (0, $29c6c9793f692470$export$eea5d31e98930019)(bin.dataSequence, {\n                type: 'formula',\n                expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).Contains\n            });\n            ordinalBinData = bin.dataSequence.name;\n        } else {\n            const ord = (0, $3aee2b63ed318776$export$71d2e96f63f1ac97)(globalScope.data.name, prefix, bin.fields, 'ascending');\n            (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, ord.data);\n            ordinalBinData = ord.data.name;\n        }\n        (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, {\n            name: names.rxc0,\n            transform: [\n                {\n                    type: 'sequence',\n                    start: 1,\n                    stop: {\n                        signal: `ceil(sqrt(${names.dataLength})) + 1`\n                    }\n                },\n                {\n                    type: 'formula',\n                    expr: `ceil(${names.dataLength} / datum.data)`,\n                    as: 'complement'\n                }\n            ]\n        }, {\n            name: names.rxc1,\n            source: names.rxc0,\n            transform: [\n                {\n                    type: 'project',\n                    fields: [\n                        'data'\n                    ],\n                    as: [\n                        'cols'\n                    ]\n                }\n            ]\n        }, {\n            name: names.rxc2,\n            source: names.rxc0,\n            transform: [\n                {\n                    type: 'project',\n                    fields: [\n                        'complement'\n                    ],\n                    as: [\n                        'cols'\n                    ]\n                }\n            ]\n        }, {\n            name: names.rxc,\n            source: [\n                names.rxc1,\n                names.rxc2\n            ],\n            transform: [\n                {\n                    type: 'formula',\n                    expr: `ceil(${names.dataLength} / datum.cols)`,\n                    as: 'rows'\n                },\n                {\n                    type: 'formula',\n                    expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                    as: 'cellw'\n                },\n                {\n                    type: 'formula',\n                    expr: `datum.cols === 1 ? max(datum.cellw, ${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellWidth}) : datum.cellw`,\n                    as: 'cellw'\n                },\n                {\n                    type: 'formula',\n                    expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                    as: 'cellh'\n                },\n                {\n                    type: 'formula',\n                    expr: `datum.rows === 1 ? max(datum.cellh, ${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellHeight}) : datum.cellh`,\n                    as: 'cellh'\n                },\n                {\n                    type: 'formula',\n                    expr: `(datum.cellw >= ${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellWidth} && datum.cellh >= ${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellHeight})`,\n                    as: 'meetsmin'\n                },\n                {\n                    type: 'filter',\n                    expr: 'datum.meetsmin'\n                },\n                {\n                    type: 'formula',\n                    expr: 'datum.cellw / datum.cellh',\n                    as: names.aspect\n                },\n                {\n                    type: 'formula',\n                    expr: `abs(datum.${names.aspect} - ${names.target})`,\n                    as: names.idealAspect\n                },\n                {\n                    type: 'formula',\n                    expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                    as: 'coverage'\n                },\n                {\n                    type: 'collect',\n                    sort: {\n                        field: [\n                            names.idealAspect,\n                            'coverage'\n                        ],\n                        order: [\n                            'ascending',\n                            'descending'\n                        ]\n                    }\n                }\n            ]\n        }, {\n            name: names.rowColumnDataName,\n            source: ordinalBinData,\n            transform: [\n                {\n                    type: 'formula',\n                    expr: `floor((datum[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).Ordinal)}] - 1) / ${names.colCount})`,\n                    as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).WrapRow\n                },\n                {\n                    type: 'formula',\n                    expr: `(datum[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).Ordinal)}] - 1) % ${names.colCount}`,\n                    as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).WrapCol\n                },\n                {\n                    type: 'formula',\n                    expr: (0, $b12a1eed38ffb3f0$export$b292ca0d4c2e4690)(bin, (0, $8d0624e259fe9d79$export$10df5429b7082be2).First, (0, $8d0624e259fe9d79$export$10df5429b7082be2).Last),\n                    as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetSearch\n                },\n                {\n                    type: 'formula',\n                    expr: (0, $b12a1eed38ffb3f0$export$f241323700beca17)(bin),\n                    as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).FacetTitle\n                }\n            ]\n        });\n        const dataOut = {\n            name: names.outputData,\n            source: globalScope.data.name,\n            transform: [\n                {\n                    type: 'lookup',\n                    from: names.rowColumnDataName,\n                    key: (0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)(bin.fields[0]),\n                    fields: [\n                        bin.fields[0]\n                    ].map((0, $03b4e9c3be7efafd$export$fb70365b00e8cb7b)),\n                    values: [\n                        (0, $8d0624e259fe9d79$export$10df5429b7082be2).WrapRow,\n                        (0, $8d0624e259fe9d79$export$10df5429b7082be2).WrapCol\n                    ]\n                }\n            ]\n        };\n        (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.scope, dataOut);\n        globalScope.setMarkDataName(names.outputData);\n        (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(globalScope.scope, {\n            name: names.minAspect,\n            update: `${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellWidth} / ${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellHeight}`\n        }, {\n            name: names.target,\n            update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`\n        }, {\n            name: names.minArea,\n            update: `${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellWidth}*${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellHeight}`\n        }, {\n            name: names.aspect,\n            update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`\n        }, {\n            name: names.dataLength,\n            update: `data(${JSON.stringify(ordinalBinData)}).length`\n        }, {\n            name: names.growColCount,\n            update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellWidth}), 1)`\n        }, {\n            name: names.growCellWidth,\n            update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`\n        }, {\n            name: names.fitsArea,\n            update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`\n        }, {\n            name: names.fits,\n            update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`\n        }, {\n            name: names.colCount,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`\n        }, {\n            name: names.cellWidth,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`\n        }, {\n            name: names.cellHeight,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellHeight}`\n        });\n        (0, $8243f48596a5f195$export$cdc9366ba30317bd)(globalScope.signals.plotHeightOut, 'max', `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n        (0, $8243f48596a5f195$export$cdc9366ba30317bd)(globalScope.signals.plotWidthOut, 'max', `(${names.cellWidth} * ${names.colCount})`);\n        const signalH = [\n            names.cellHeight,\n            (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop,\n            (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingBottom\n        ].join(' - ');\n        const signalW = [\n            names.cellWidth,\n            (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingLeft\n        ].join(' - ');\n        const signalX = (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.x, `datum[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).WrapCol)}] * ${names.cellWidth}`, (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingLeft);\n        const signalY = (0, $29c6c9793f692470$export$e6b6683aec0fe907)(parentScope.offsets.y, `datum[${JSON.stringify((0, $8d0624e259fe9d79$export$10df5429b7082be2).WrapRow)}] * ${names.cellHeight}`, (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop);\n        const update = {\n            height: {\n                signal: signalH\n            },\n            width: {\n                signal: signalW\n            },\n            x: {\n                signal: signalX\n            },\n            y: {\n                signal: signalY\n            }\n        };\n        const offsets = {\n            x: signalX,\n            y: signalY,\n            h: signalH,\n            w: signalW\n        };\n        const group = {\n            style: 'cell',\n            name: prefix,\n            type: 'group',\n            from: {\n                data: names.rowColumnDataName\n            },\n            encode: {\n                update: update\n            }\n        };\n        (0, $29c6c9793f692470$export$3df320e901c23a48)(globalScope.markGroup, group);\n        const sizeSignals = {\n            layoutHeight: `(${names.cellHeight} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingBottom})`,\n            layoutWidth: `(${names.cellWidth} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingLeft})`,\n            colCount: names.colCount,\n            rowCount: `ceil(${names.dataLength} / ${names.colCount})`\n        };\n        if (cellTitles) (0, $e298df2c870b2b1c$export$3735b1dd76112836)(group, sizeSignals, axisTextColor);\n        return {\n            facetScope: group,\n            sizeSignals: sizeSignals,\n            offsets: offsets\n        };\n    }\n}\n\n\nconst $d2f9d48e526138d2$export$8b2ec0ba67742226 = {\n    AggregateContainer: $eff5a80a5e96c249$export$fd744dfcd98e5f49,\n    AggregateSquare: $efc98e91e3f0ced6$export$7eda37970b01b2c,\n    Band: $cef2083591a92ad5$export$5b22a87d7feca398,\n    Cross: $ad34ec84cd0de2bf$export$3c877bb842c36952,\n    Scatter: $400f8948076e2f06$export$1c460fb4285edadc,\n    Square: $0921378644518b2d$export$b09fb900337259de,\n    Stack: $ea238a52b780f861$export$694e0d28c7ffc90c,\n    Strip: $e51cd95b5dfb2b00$export$c4df0d8c6c8f50e4,\n    Treemap: $9a589015cb5fa9f5$export$d685cd2b84b49ee,\n    Wrap: $a19e9bd8fb28b427$export$f6b1e3902165e5e1\n};\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $3793daba4819864c$export$f4cf47d56985b7f(backgroundImage, allGlobalScales) {\n    const xScale = allGlobalScales.filter((s)=>s.scales.x)[0].scales.x[0];\n    const yScale = allGlobalScales.filter((s)=>s.scales.y)[0].scales.y[0];\n    const [xScaleName, yScaleName] = [\n        xScale,\n        yScale\n    ].map((s)=>s.name + (xScale.type === 'band' ? (0, $cef2083591a92ad5$export$d437166a1bdbfdf0) : ''));\n    return {\n        type: 'image',\n        encode: {\n            update: {\n                url: {\n                    value: backgroundImage.url\n                },\n                aspect: {\n                    value: false\n                },\n                baseline: {\n                    value: 'bottom'\n                },\n                height: {\n                    signal: $3793daba4819864c$var$getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top)\n                },\n                y: {\n                    signal: $3793daba4819864c$var$getScaledValue(yScaleName, backgroundImage.extents.bottom)\n                },\n                width: {\n                    signal: $3793daba4819864c$var$getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left)\n                },\n                x: {\n                    signal: $3793daba4819864c$var$getScaledValue(xScaleName, backgroundImage.extents.left)\n                }\n            }\n        }\n    };\n}\nfunction $3793daba4819864c$var$getScaledSpan(scaleName, low, high) {\n    return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n}\nfunction $3793daba4819864c$var$getScaledValue(scaleName, value) {\n    return `scale('${scaleName}', ${value})`;\n}\n\n\nclass $6425b6452dfc228b$export$e2e6dd2b1097c25b {\n    constructor(props, specContext){\n        this.props = props;\n        this.specContext = specContext;\n        this.globalSignals = {\n            facetAxesAdjustX: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustX,\n                update: props.facetLayout && props.collapseFacetAxes ? (0, $72552551eb533aa6$export$6bd206e55cb747ae).toString() : '0'\n            },\n            facetAxesAdjustY: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustY,\n                update: props.facetLayout && props.collapseFacetAxes ? (0, $72552551eb533aa6$export$bdb7a7da14f9ff2b).toString() : '0'\n            },\n            minCellWidth: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).MinCellWidth,\n                update: `${0, $72552551eb533aa6$export$7794a0aff56142de}`\n            },\n            minCellHeight: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).MinCellHeight,\n                update: `${0, $72552551eb533aa6$export$7c432db1d0b63312}`\n            },\n            plotOffsetLeft: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetLeft,\n                update: '0'\n            },\n            plotOffsetTop: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetTop,\n                update: '0'\n            },\n            plotOffsetBottom: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetBottom,\n                update: '0'\n            },\n            plotOffsetRight: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetRight,\n                update: '0'\n            },\n            plotHeightOut: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightOut,\n                update: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightIn\n            },\n            plotWidthOut: {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotWidthOut,\n                update: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotWidthIn\n            }\n        };\n    }\n    validate() {\n        const { specContext: specContext } = this;\n        const { specCapabilities: specCapabilities } = this.props;\n        const { roles: roles } = specCapabilities;\n        const required = roles.filter((r)=>{\n            switch(typeof r.allowNone){\n                case 'boolean':\n                    return !r.allowNone;\n                case 'undefined':\n                    return true;\n                case 'function':\n                    return !r.allowNone(specContext);\n            }\n        });\n        const numeric = roles.filter((r)=>r.excludeCategoric);\n        const errors = required.map((r)=>{\n            if (specContext.specColumns[r.role]) return null;\n            else return `Field ${r.role} is required.`;\n        }).concat(numeric.map((r)=>{\n            if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) return `Field ${r.role} must be quantitative.`;\n            else return null;\n        })).filter(Boolean);\n        const { backgroundImage: backgroundImage } = specContext.insight;\n        if (backgroundImage && !backgroundImage.extents) errors.push('BackgroundImage must have extents.');\n        return errors;\n    }\n    build() {\n        var _a, _b;\n        const { globalSignals: globalSignals, specContext: specContext } = this;\n        const { facetLayout: facetLayout, specCapabilities: specCapabilities } = this.props;\n        const { insight: insight, specColumns: specColumns, specViewOptions: specViewOptions } = specContext;\n        const dataName = 'data_source';\n        const { vegaSpec: vegaSpec, groupMark: groupMark } = this.initSpec(dataName);\n        const { topColorField: topColorField, colorDataName: colorDataName } = (0, $925be6cd5bedf086$export$4c4d9288a45f1fb3)({\n            scope: vegaSpec,\n            dataName: dataName,\n            specContext: specContext,\n            scaleName: (0, $8d0624e259fe9d79$export$c9f17d36dfc40d76).Color,\n            legendDataName: 'data_legend',\n            topLookupName: 'data_topcolorlookup',\n            colorReverseSignalName: (0, $8d0624e259fe9d79$export$809e371dee643808).ColorReverse\n        });\n        const globalScope = new (0, $cc404f7847ffd5bf$export$5fdf684e73bb2de5)({\n            dataName: colorDataName,\n            markGroup: groupMark,\n            scope: vegaSpec,\n            signals: globalSignals\n        });\n        if (facetLayout) {\n            (0, $29c6c9793f692470$export$5346a0d8a9111b3f)(vegaSpec, {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingBottom,\n                update: `${facetLayout.facetPadding.bottom}`\n            }, {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingLeft,\n                update: `${facetLayout.facetPadding.left}`\n            }, {\n                name: (0, $8d0624e259fe9d79$export$809e371dee643808).FacetPaddingTop,\n                update: `${facetLayout.facetPadding.top}`\n            });\n            globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n            globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n        }\n        const { firstScope: firstScope, finalScope: finalScope, specResult: specResult, allGlobalScales: allGlobalScales, allEncodingRules: allEncodingRules } = this.iterateLayouts(globalScope, (i, innerScope)=>{\n            if (facetLayout && i === 0) globalScope.zSize = innerScope.offsets.h;\n        });\n        if (specResult) return specResult;\n        if (allGlobalScales.length > 0) {\n            const plotHeightOut = globalSignals.plotHeightOut.name;\n            const plotWidthOut = globalSignals.plotWidthOut.name;\n            const colTitleScale = {\n                type: 'linear',\n                name: 'scale_facet_col_title',\n                domain: [\n                    0,\n                    1\n                ],\n                range: [\n                    0,\n                    {\n                        signal: plotWidthOut\n                    }\n                ]\n            };\n            const rowTitleScale = {\n                type: 'linear',\n                name: 'scale_facet_row_title',\n                domain: [\n                    0,\n                    1\n                ],\n                range: [\n                    {\n                        signal: plotHeightOut\n                    },\n                    0\n                ]\n            };\n            const facetScope = facetLayout ? firstScope : null;\n            const backgroundGroup = facetLayout ? facetScope.facetScope : groupMark;\n            //TODO if capability and numeric x,y\n            if (insight.backgroundImage && specCapabilities.backgroundImage && ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative)) {\n                //backgroundGroup.encode.update.fill = { value: 'pink' }\n                if (!backgroundGroup.marks) backgroundGroup.marks = [];\n                const imageMark = (0, $3793daba4819864c$export$f4cf47d56985b7f)(insight.backgroundImage, allGlobalScales);\n                backgroundGroup.marks.unshift(imageMark);\n            }\n            const axesScopes = facetLayout ? (0, $e298df2c870b2b1c$export$9f0b19d6fd936707)({\n                globalScope: globalScope.scope,\n                plotScope: groupMark,\n                facetScope: facetScope,\n                colTitleScale: colTitleScale,\n                rowTitleScale: rowTitleScale,\n                colSeqName: 'data_FacetCellColTitles',\n                rowSeqName: 'data_FacetCellRowTitles'\n            }) : {\n                main: [\n                    {\n                        scope: groupMark,\n                        lines: true,\n                        labels: true,\n                        title: true\n                    }\n                ]\n            };\n            (0, $fabd8225a03f89c4$export$3678bfcfeaea7c36)({\n                globalScope: globalScope,\n                allGlobalScales: allGlobalScales,\n                axisScales: this.props.axisScales,\n                plotOffsetSignals: {\n                    x: globalSignals.plotOffsetLeft,\n                    y: globalSignals.plotOffsetBottom\n                },\n                axesOffsets: {\n                    x: (0, $72552551eb533aa6$export$3f5b554d51e74365),\n                    y: (0, $72552551eb533aa6$export$c33f11801bb18430)\n                },\n                axesTitlePadding: facetLayout ? {\n                    x: (0, $72552551eb533aa6$export$fd4a597070549ada),\n                    y: (0, $72552551eb533aa6$export$a26a082bf9fa4ca0)\n                } : {\n                    x: (0, $72552551eb533aa6$export$2e7279af2df830e3),\n                    y: (0, $72552551eb533aa6$export$f0388d9263db6e5f)\n                },\n                labelBaseline: {\n                    x: 'top',\n                    y: 'middle'\n                },\n                specColumns: specColumns,\n                specViewOptions: specViewOptions,\n                axesScopes: axesScopes,\n                hideZAxis: !!facetLayout,\n                view: insight.view\n            });\n        }\n        //add mark to the final scope\n        if (finalScope.mark) {\n            const { update: update } = finalScope.mark.encode;\n            const outputDataName = 'output';\n            finalScope.mark.from.data = outputDataName;\n            (0, $29c6c9793f692470$export$6853292f627997e4)(globalScope.markGroup, {\n                name: outputDataName,\n                source: globalScope.markDataName,\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: finalScope.offsets.x,\n                        as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).OffsetX\n                    },\n                    {\n                        type: 'formula',\n                        expr: finalScope.offsets.y,\n                        as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).OffsetY\n                    }\n                ]\n            });\n            update.x = {\n                field: (0, $8d0624e259fe9d79$export$10df5429b7082be2).OffsetX\n            };\n            update.y = {\n                field: (0, $8d0624e259fe9d79$export$10df5429b7082be2).OffsetY\n            };\n            allEncodingRules.forEach((map)=>{\n                for(const key in map)if (update[key]) {\n                    const arrIn = map[key];\n                    if (!Array.isArray(update[key])) {\n                        const value = update[key];\n                        const arrOut = [];\n                        update[key] = arrOut;\n                        arrIn.forEach((rule)=>arrOut.push(rule));\n                        arrOut.push(value);\n                    } else {\n                        const arrOut = update[key];\n                        arrIn.forEach((rule)=>arrOut.unshift(rule));\n                    }\n                }\n            });\n            update.fill = (0, $895ef9e095ded5c9$export$9563e054e6f787fb)(specContext, topColorField, (0, $8d0624e259fe9d79$export$c9f17d36dfc40d76).Color);\n            update.opacity = (0, $895ef9e095ded5c9$export$c17a3be1057836e)(specContext);\n        }\n        return {\n            specCapabilities: specCapabilities,\n            vegaSpec: vegaSpec\n        };\n    }\n    initSpec(dataName) {\n        const { globalSignals: globalSignals } = this;\n        const { facetAxesAdjustX: facetAxesAdjustX, facetAxesAdjustY: facetAxesAdjustY, minCellWidth: minCellWidth, minCellHeight: minCellHeight, plotOffsetLeft: plotOffsetLeft, plotOffsetBottom: plotOffsetBottom, plotOffsetTop: plotOffsetTop, plotOffsetRight: plotOffsetRight, plotHeightOut: plotHeightOut, plotWidthOut: plotWidthOut } = globalSignals;\n        const { specContext: specContext } = this;\n        const { insight: insight } = specContext;\n        const groupMark = {\n            type: 'group',\n            //style: 'cell',\n            encode: {\n                update: {\n                    x: {\n                        signal: `${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetLeft} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustX}`\n                    },\n                    y: {\n                        signal: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetTop\n                    },\n                    height: {\n                        signal: `${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightOut} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustY}`\n                    },\n                    width: {\n                        signal: `${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotWidthOut} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustX}`\n                    }\n                }\n            }\n        };\n        const inputDataname = 'input';\n        const vegaSpec = {\n            $schema: 'https://vega.github.io/schema/vega/v5.json',\n            //style: 'cell',\n            data: [\n                {\n                    name: inputDataname\n                },\n                {\n                    name: dataName,\n                    source: inputDataname,\n                    transform: []\n                }\n            ],\n            marks: [\n                groupMark\n            ],\n            signals: (0, $8243f48596a5f195$export$d9407ec206a3236c)(specContext, (0, $8d0624e259fe9d79$export$809e371dee643808).ViewportHeight).concat([\n                minCellWidth,\n                minCellHeight,\n                {\n                    name: (0, $8d0624e259fe9d79$export$809e371dee643808).ViewportHeight,\n                    update: `max(${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellHeight}, ${insight.size.height})`\n                },\n                {\n                    name: (0, $8d0624e259fe9d79$export$809e371dee643808).ViewportWidth,\n                    update: `max(${(0, $8d0624e259fe9d79$export$809e371dee643808).MinCellWidth}, ${insight.size.width})`\n                },\n                plotOffsetLeft,\n                plotOffsetTop,\n                plotOffsetBottom,\n                plotOffsetRight,\n                facetAxesAdjustX,\n                facetAxesAdjustY,\n                {\n                    name: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightIn,\n                    update: `${(0, $8d0624e259fe9d79$export$809e371dee643808).ViewportHeight} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetBottom} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustY}`\n                },\n                {\n                    name: (0, $8d0624e259fe9d79$export$809e371dee643808).PlotWidthIn,\n                    update: `${(0, $8d0624e259fe9d79$export$809e371dee643808).ViewportWidth} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetLeft} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetRight}`\n                },\n                plotHeightOut,\n                plotWidthOut,\n                {\n                    name: 'height',\n                    update: `${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetTop} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotHeightOut} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetBottom} - ${(0, $8d0624e259fe9d79$export$809e371dee643808).FacetAxesAdjustY}`\n                },\n                {\n                    name: 'width',\n                    update: `${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotWidthOut} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetLeft} + ${(0, $8d0624e259fe9d79$export$809e371dee643808).PlotOffsetRight}`\n                }\n            ])\n        };\n        return {\n            vegaSpec: vegaSpec,\n            groupMark: groupMark\n        };\n    }\n    iterateLayouts(globalScope, onLayoutBuild) {\n        let specResult;\n        let parentScope = {\n            sizeSignals: globalScope.sizeSignals,\n            offsets: globalScope.offsets\n        };\n        let firstScope;\n        let childScope;\n        const groupings = [];\n        const { layouts: layouts, specCapabilities: specCapabilities } = this.props;\n        const allGlobalScales = [];\n        const allEncodingRules = [];\n        for(let i = 0; i < layouts.length; i++){\n            if (!parentScope) continue;\n            const buildProps = {\n                globalScope: globalScope,\n                parentScope: parentScope,\n                axesScales: this.props.axisScales,\n                groupings: groupings,\n                id: i\n            };\n            const layout = this.createLayout(layouts[i], buildProps);\n            try {\n                childScope = layout.build();\n                childScope.id = i;\n                const groupby = layout.getGrouping();\n                if (groupby) groupings.push({\n                    id: i,\n                    groupby: groupby,\n                    fieldOps: [\n                        {\n                            field: null,\n                            op: 'count',\n                            as: (0, $8d0624e259fe9d79$export$10df5429b7082be2).Count\n                        }\n                    ]\n                });\n                const sumOp = layout.getAggregateSumOp();\n                if (sumOp) groupings[groupings.length - 1].fieldOps.push(sumOp);\n                onLayoutBuild(i, childScope);\n            } catch (e) {\n                specResult = {\n                    errors: [\n                        e.stack\n                    ],\n                    specCapabilities: specCapabilities,\n                    vegaSpec: null\n                };\n                break;\n            }\n            if (childScope && childScope.globalScales) allGlobalScales.push(childScope.globalScales);\n            if (childScope.encodingRuleMap) allEncodingRules.push(childScope.encodingRuleMap);\n            if (i === 0) firstScope = childScope;\n            parentScope = childScope;\n        }\n        return {\n            firstScope: firstScope,\n            finalScope: parentScope,\n            specResult: specResult,\n            allGlobalScales: allGlobalScales,\n            allEncodingRules: allEncodingRules\n        };\n    }\n    createLayout(layoutPair, buildProps) {\n        const { layoutType: layoutType, props: props } = layoutPair;\n        const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n        const layoutClass = (0, $d2f9d48e526138d2$export$8b2ec0ba67742226)[layoutType];\n        const layout = new layoutClass(layoutBuildProps);\n        layout.id = buildProps.id;\n        return layout;\n    }\n}\n\n\nfunction $1c081eb26c39473d$export$3f8fe6489e95757d(specContext, currData) {\n    const { specColumns: specColumns } = specContext;\n    const columns = [\n        specColumns.color,\n        specColumns.facet,\n        specColumns.facetV,\n        specColumns.group,\n        specColumns.size,\n        specColumns.sort,\n        specColumns.x,\n        specColumns.y,\n        specColumns.z\n    ];\n    (0, $15b363a2e3ff0bb7$export$e04a97cc71178399)(columns, currData);\n    const specBuilderProps = (0, $8e72bac502e5efb8$export$104083a36c1647a7)(specContext);\n    const specBuilder = new (0, $6425b6452dfc228b$export$e2e6dd2b1097c25b)(specBuilderProps, specContext);\n    let specResult;\n    if (specBuilder) {\n        try {\n            const errors = specBuilder.validate();\n            if (errors.length) specResult = {\n                errors: errors,\n                specCapabilities: specBuilderProps.specCapabilities,\n                vegaSpec: null\n            };\n            else specResult = specBuilder.build();\n        } catch (e) {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [\n                    e.stack\n                ]\n            };\n        }\n        if (!specResult.errors) {\n            const data0 = specResult.vegaSpec.data[0];\n            data0.values = currData;\n        }\n    } else specResult = {\n        specCapabilities: null,\n        vegaSpec: null,\n        errors: [\n            `could not build spec for ${specContext.insight.chart}`\n        ]\n    };\n    return specResult;\n}\n\n\n\n\nvar $7c75b80e0404a7a0$exports = {};\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nvar $ca675dc6df12c0ef$exports = {};\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nvar $46296c7ebdd844d1$exports = {};\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n$parcel$exportWildcard($502a84774beeb901$exports, $1c081eb26c39473d$exports);\n$parcel$exportWildcard($502a84774beeb901$exports, $8d0624e259fe9d79$exports);\n$parcel$exportWildcard($502a84774beeb901$exports, $2b29a67d615af3f6$exports);\n$parcel$exportWildcard($502a84774beeb901$exports, $7c75b80e0404a7a0$exports);\n$parcel$exportWildcard($502a84774beeb901$exports, $ca675dc6df12c0ef$exports);\n$parcel$exportWildcard($502a84774beeb901$exports, $46296c7ebdd844d1$exports);\n\n\nconst $44b8bb162b63b5b5$export$5672246984822a29 = 'GL_ORDINAL';\n\n\nvar $0d976ebdc81921a3$exports = {};\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $4c4e2fc4d7da02f0$exports = {};\n\n$parcel$export($4c4e2fc4d7da02f0$exports, \"compareExpression\", () => $4c4e2fc4d7da02f0$export$4787a3c825f2af47);\n$parcel$export($4c4e2fc4d7da02f0$exports, \"compareGroup\", () => $4c4e2fc4d7da02f0$export$bc9dff9b0aa0e5b);\n$parcel$export($4c4e2fc4d7da02f0$exports, \"compare\", () => $4c4e2fc4d7da02f0$export$398604a469f7de9a);\n$parcel$export($4c4e2fc4d7da02f0$exports, \"startsWith\", () => $4c4e2fc4d7da02f0$export$68326237475e9a7d);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $ba55906944328f12$exports = {};\n\n$parcel$export($ba55906944328f12$exports, \"isSearchExpressionGroup\", () => $ba55906944328f12$export$ab134d298d957272);\n$parcel$export($ba55906944328f12$exports, \"createGroupFromExpression\", () => $ba55906944328f12$export$cf32a499fcfecacd);\n$parcel$export($ba55906944328f12$exports, \"ensureSearchExpressionGroupArray\", () => $ba55906944328f12$export$b5d04ce3dd7ae29e);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $ba55906944328f12$export$ab134d298d957272(search) {\n    if (!search) return false;\n    return !!search.expressions;\n}\nfunction $ba55906944328f12$export$cf32a499fcfecacd(input) {\n    const output = {\n        expressions: [\n            input\n        ]\n    };\n    return output;\n}\nfunction $ba55906944328f12$export$b5d04ce3dd7ae29e(search) {\n    if (Array.isArray(search)) return [\n        ...search\n    ];\n    else if ($ba55906944328f12$export$ab134d298d957272(search)) return [\n        search\n    ];\n    else return [\n        $ba55906944328f12$export$cf32a499fcfecacd(search)\n    ];\n}\n\n\nconst $4c4e2fc4d7da02f0$var$expressionKeys = Object.keys({\n    clause: null,\n    name: null,\n    operator: null,\n    value: null\n});\nfunction $4c4e2fc4d7da02f0$export$4787a3c825f2af47(a, b) {\n    if (a && b) for(let k = 0; k < $4c4e2fc4d7da02f0$var$expressionKeys.length; k++){\n        const key = $4c4e2fc4d7da02f0$var$expressionKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    else return !a && !b;\n    return true;\n}\nconst $4c4e2fc4d7da02f0$var$groupKeys = Object.keys({\n    clause: null\n});\nfunction $4c4e2fc4d7da02f0$export$bc9dff9b0aa0e5b(a, b) {\n    for(let k = 0; k < $4c4e2fc4d7da02f0$var$groupKeys.length; k++){\n        const key = $4c4e2fc4d7da02f0$var$groupKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    if (!a.expressions && !b.expressions) return true;\n    if (!a.expressions || !b.expressions) return false;\n    if (a.expressions.length != b.expressions.length) return false;\n    for(let i = 0; i < a.expressions.length; i++){\n        if (!$4c4e2fc4d7da02f0$export$4787a3c825f2af47(a.expressions[i], b.expressions[i])) return false;\n    }\n    return true;\n}\nfunction $4c4e2fc4d7da02f0$export$398604a469f7de9a(a, b) {\n    if (a == b) return true;\n    if (!a || !b) return false;\n    const arrs = [\n        a,\n        b\n    ].map((0, $ba55906944328f12$export$b5d04ce3dd7ae29e));\n    const [arrA, arrB] = arrs;\n    if (arrA.length != arrB.length) return false;\n    for(let i = 0; i < arrA.length; i++){\n        if (!$4c4e2fc4d7da02f0$export$bc9dff9b0aa0e5b(arrA[i], arrB[i])) return false;\n    }\n    return true;\n}\nfunction $4c4e2fc4d7da02f0$export$68326237475e9a7d(whole, part) {\n    if (!part) return true;\n    const arrs = [\n        whole,\n        part\n    ].map((0, $ba55906944328f12$export$b5d04ce3dd7ae29e));\n    const [wholeArray, partArray] = arrs;\n    if (partArray.length > wholeArray.length) return false;\n    for(let i = 0; i < partArray.length; i++){\n        if (!$4c4e2fc4d7da02f0$export$bc9dff9b0aa0e5b(wholeArray[i], partArray[i])) return false;\n    }\n    return true;\n}\n\n\nvar $60ec9c9c9a132a89$exports = {};\n\n$parcel$export($60ec9c9c9a132a89$exports, \"Exec\", () => $60ec9c9c9a132a89$export$bbfd672d43392844);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $60ec9c9c9a132a89$var$valueToBoolean(value) {\n    if (typeof value === 'string') switch(value.toLowerCase()){\n        case 'true':\n            return true;\n        case 'false':\n            return false;\n    }\n    return !!value;\n}\nfunction $60ec9c9c9a132a89$var$valueToString(value) {\n    if (value == null) return '';\n    switch(typeof value){\n        case 'string':\n            return value;\n        case 'boolean':\n        case 'number':\n            return value.toString();\n    }\n    return '';\n}\nfunction $60ec9c9c9a132a89$var$isStringOperation(ex) {\n    switch(ex.operator){\n        case 'contains':\n        case '!contains':\n        case 'starts':\n        case '!starts':\n            return true;\n    }\n    return false;\n}\nfunction $60ec9c9c9a132a89$var$isnullorEmpty(value) {\n    if (value == null) return true; //double equal sign to also catch undefined\n    if (typeof value === 'string' && value.length === 0) return true;\n    return false;\n}\nclass $60ec9c9c9a132a89$export$bbfd672d43392844 {\n    constructor(search, columns){\n        this.columns = columns;\n        this.groups = (0, $ba55906944328f12$export$b5d04ce3dd7ae29e)(search).map((g)=>{\n            const expressions = g.expressions.filter(Boolean);\n            expressions.forEach((ex)=>{\n                ex.column = this.getColumn(ex.name);\n                ex.valueBool = $60ec9c9c9a132a89$var$valueToBoolean(ex.value);\n                ex.valueLow = $60ec9c9c9a132a89$var$valueToString(ex.value).toLocaleLowerCase();\n                ex.stringOperation = $60ec9c9c9a132a89$var$isStringOperation(ex);\n            });\n            const group = Object.assign(Object.assign({}, g), {\n                expressions: expressions\n            });\n            return group;\n        });\n    }\n    getColumn(name) {\n        for(let i = 0; i < this.columns.length; i++){\n            if (this.columns[i].name == name) return this.columns[i];\n        }\n    }\n    runExpressionOnColumn(datum, ex) {\n        const actualDataValue = datum[ex.name];\n        if (ex.operator === 'isnullorEmpty') return $60ec9c9c9a132a89$var$isnullorEmpty(actualDataValue);\n        else if (ex.operator === '!isnullorEmpty') return !$60ec9c9c9a132a89$var$isnullorEmpty(actualDataValue);\n        let dataValue = actualDataValue;\n        let expressionValue = ex.value;\n        if (ex.column) {\n            if (ex.column.type === 'string' || ex.stringOperation) {\n                dataValue = $60ec9c9c9a132a89$var$valueToString(actualDataValue).toLocaleLowerCase();\n                expressionValue = ex.valueLow;\n            } else if (ex.column.type === 'boolean') {\n                dataValue = $60ec9c9c9a132a89$var$valueToBoolean(actualDataValue);\n                expressionValue = ex.valueBool;\n            } else if (ex.column.quantitative) {\n                dataValue = +actualDataValue;\n                expressionValue = +ex.value;\n            }\n        }\n        switch(ex.operator){\n            case '!=':\n                return dataValue != expressionValue;\n            case '<':\n                return dataValue < expressionValue;\n            case '<=':\n                return dataValue <= expressionValue;\n            case '==':\n                return dataValue == expressionValue;\n            case '>':\n                return dataValue > expressionValue;\n            case '>=':\n                return dataValue >= expressionValue;\n            case 'contains':\n                return dataValue.indexOf(expressionValue) >= 0;\n            case '!contains':\n                return dataValue.indexOf(expressionValue) < 0;\n            case 'starts':\n                return dataValue.indexOf(expressionValue) == 0;\n            case '!starts':\n                return dataValue.indexOf(expressionValue) !== 0;\n        }\n    }\n    runExpression(datum, ex) {\n        if (ex.name == null) {\n            //run on all columns\n            const group = {\n                expressions: this.columns.map((column, i)=>{\n                    const ex2 = Object.assign(Object.assign({}, ex), {\n                        column: column,\n                        name: column.name\n                    });\n                    if (i) ex2.clause = '||';\n                    return ex2;\n                })\n            };\n            return this.runGroup(datum, group);\n        } else return this.runExpressionOnColumn(datum, ex);\n    }\n    runGroup(datum, group) {\n        let accumulator = this.runExpression(datum, group.expressions[0]);\n        for(let i = 1; i < group.expressions.length; i++){\n            const ex = group.expressions[i];\n            switch(ex.clause){\n                case '&&':\n                    accumulator = accumulator && this.runExpression(datum, ex);\n                    break;\n                case '||':\n                    accumulator = accumulator || this.runExpression(datum, ex);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n    run(datum) {\n        let accumulator = this.runGroup(datum, this.groups[0]);\n        for(let i = 1; i < this.groups.length; i++){\n            const group = this.groups[i];\n            switch(group.clause){\n                case '&&':\n                    accumulator = accumulator && this.runGroup(datum, group);\n                    break;\n                case '||':\n                    accumulator = accumulator || this.runGroup(datum, group);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n}\n\n\n\nvar $b144ef381004fc94$exports = {};\n\n$parcel$export($b144ef381004fc94$exports, \"invert\", () => $b144ef381004fc94$export$6897c284b6f9f4dc);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $b144ef381004fc94$var$invertSearchExpressionGroup(input) {\n    //this only works if all expressions in this group have the same clause\n    const output = {\n        expressions: input.expressions.map($b144ef381004fc94$var$invertSearchExpression)\n    };\n    if (input.clause) output.clause = $b144ef381004fc94$var$invertedClauses[input.clause];\n    return output;\n}\nconst $b144ef381004fc94$var$invertedOperators = {\n    '!=': '==',\n    '==': '!=',\n    '<': '>=',\n    '>=': '<',\n    '<=': '>',\n    '>': '<=',\n    '!contains': 'contains',\n    'contains': '!contains',\n    '!isnullorEmpty': 'isnullorEmpty',\n    'isnullorEmpty': '!isnullorEmpty',\n    '!starts': 'starts',\n    'starts': '!starts'\n};\nconst $b144ef381004fc94$var$invertedClauses = {\n    '&&': '||',\n    '||': '&&'\n};\nfunction $b144ef381004fc94$var$invertSearchExpression(input) {\n    const operator = $b144ef381004fc94$var$invertedOperators[input.operator];\n    const output = Object.assign(Object.assign({}, input), {\n        operator: operator\n    });\n    if (input.clause) output.clause = $b144ef381004fc94$var$invertedClauses[input.clause];\n    return output;\n}\nfunction $b144ef381004fc94$export$6897c284b6f9f4dc(search) {\n    if (Array.isArray(search)) return search.map($b144ef381004fc94$var$invertSearchExpressionGroup);\n    else if ((0, $ba55906944328f12$export$ab134d298d957272)(search)) return $b144ef381004fc94$var$invertSearchExpressionGroup(search);\n    else return $b144ef381004fc94$var$invertSearchExpression(search);\n}\n\n\nvar $ed08d33b174a5471$exports = {};\n\n$parcel$export($ed08d33b174a5471$exports, \"narrow\", () => $ed08d33b174a5471$export$ec67f55c222e1546);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $ed08d33b174a5471$export$ec67f55c222e1546(a, b) {\n    if (!a) return b;\n    const arrs = [\n        a,\n        b\n    ].map((0, $ba55906944328f12$export$b5d04ce3dd7ae29e));\n    const [arrA, arrB] = arrs;\n    arrB[0].clause = '&&';\n    return arrA.concat(arrB);\n}\n\n\nvar $3d52d518cda5876a$exports = {};\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n$parcel$exportWildcard($0d976ebdc81921a3$exports, $4c4e2fc4d7da02f0$exports);\n$parcel$exportWildcard($0d976ebdc81921a3$exports, $60ec9c9c9a132a89$exports);\n$parcel$exportWildcard($0d976ebdc81921a3$exports, $ba55906944328f12$exports);\n$parcel$exportWildcard($0d976ebdc81921a3$exports, $b144ef381004fc94$exports);\n$parcel$exportWildcard($0d976ebdc81921a3$exports, $ed08d33b174a5471$exports);\n$parcel$exportWildcard($0d976ebdc81921a3$exports, $3d52d518cda5876a$exports);\n\n\n\nvar $1a35cc0c54ffaa6e$exports = {};\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nvar $048ba25c9a3f4065$exports = {};\n\n$parcel$export($048ba25c9a3f4065$exports, \"isInternalFieldName\", () => $048ba25c9a3f4065$export$81adea670bebefbe);\n$parcel$export($048ba25c9a3f4065$exports, \"getColumnsFromData\", () => $15b363a2e3ff0bb7$export$3f19ad07848df794);\n$parcel$export($048ba25c9a3f4065$exports, \"getStats\", () => $8e54999951217c95$export$432f698644f45d1);\n$parcel$export($048ba25c9a3f4065$exports, \"inferAll\", () => $15b363a2e3ff0bb7$export$e04a97cc71178399);\n$parcel$export($048ba25c9a3f4065$exports, \"getPresenterStyle\", () => $16f9e3e56a5dcd59$export$c4db461e5e345a8);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $e296aaf527fc4d25$exports = {};\n\n$parcel$export($e296aaf527fc4d25$exports, \"base\", () => $94b078fc391e7135$export$e2253033e6e1df16);\n$parcel$export($e296aaf527fc4d25$exports, \"use\", () => $94b078fc391e7135$export$1f96ae73734a86cc);\n$parcel$export($e296aaf527fc4d25$exports, \"Presenter\", () => $6dfc103fcb41a0e6$export$893c88c42e3630f9);\n$parcel$export($e296aaf527fc4d25$exports, \"ViewGl\", () => $51fbad27d38c01a6$export$6d8f9057dcd7f9e6);\n$parcel$export($e296aaf527fc4d25$exports, \"controls\", () => $230d9e8a9013f7fd$exports);\n$parcel$export($e296aaf527fc4d25$exports, \"defaults\", () => $a2698ea08ecf5377$exports);\n$parcel$export($e296aaf527fc4d25$exports, \"types\", () => $4ef7f72d8d2a203c$exports);\n$parcel$export($e296aaf527fc4d25$exports, \"util\", () => $c5578f8838abba3d$exports);\n$parcel$export($e296aaf527fc4d25$exports, \"version\", () => $f6508cfd53d266a5$export$83d89fbfd8236492);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $230d9e8a9013f7fd$exports = {};\n\n$parcel$export($230d9e8a9013f7fd$exports, \"Table\", () => $837e7efbc300fecc$export$54ec01a60f47d33d);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * This file is for external facing export only, do not use this for internal references,\n * as it may cause circular dependencies in Rollup.\n */ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $fe86f88c0c9aea93$var$SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n/**\n * Decamelizes a string with/without a custom separator (hyphen by default).\n * from: https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript\n *\n * @param str String in camelcase\n * @param separator Separator for the new decamelized string.\n */ function $fe86f88c0c9aea93$var$decamelize(str, separator = '-') {\n    return str.replace(/([a-z\\d])([A-Z])/g, '$1' + separator + '$2').replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, '$1' + separator + '$2').toLowerCase();\n}\nfunction $fe86f88c0c9aea93$export$c8a8987d4410bf2d(tag, attrs, ...children) {\n    if (typeof tag === 'function') {\n        const fn = tag;\n        let props = attrs;\n        // Handle case where props is null but children are provided\n        if (props === null || props === undefined) props = {\n            children: children\n        };\n        else props.children = children;\n        return fn(props);\n    } else {\n        const ns = tag === 'svg' ? $fe86f88c0c9aea93$var$SVG_NAMESPACE : null;\n        const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n        const map = attrs;\n        let ref;\n        for(let name in map)if (name && map.hasOwnProperty(name)) {\n            let value = map[name];\n            if (name === 'className' && value !== void 0) $fe86f88c0c9aea93$var$setAttribute(el, ns, 'class', value.toString());\n            else if (name === 'disabled' && !value) ;\n            else if (value === null || value === undefined) continue;\n            else if (value === true) $fe86f88c0c9aea93$var$setAttribute(el, ns, name, name);\n            else if (typeof value === 'function') {\n                if (name === 'ref') ref = value;\n                else el[name.toLowerCase()] = value;\n            } else if (typeof value === 'object') $fe86f88c0c9aea93$var$setAttribute(el, ns, name, $fe86f88c0c9aea93$var$flatten(value));\n            else $fe86f88c0c9aea93$var$setAttribute(el, ns, name, value.toString());\n        }\n        if (children && children.length > 0) $fe86f88c0c9aea93$var$appendChildren(el, children);\n        if (ref) ref(el);\n        return el;\n    }\n}\nfunction $fe86f88c0c9aea93$var$setAttribute(el, ns, name, value) {\n    if (ns) el.setAttributeNS(null, name, value);\n    else el.setAttribute(name, value);\n}\nfunction $fe86f88c0c9aea93$var$flatten(o) {\n    const arr = [];\n    for(let prop in o)arr.push(`${$fe86f88c0c9aea93$var$decamelize(prop, '-')}:${o[prop]}`);\n    return arr.join(';');\n}\nfunction $fe86f88c0c9aea93$var$isInsideForeignObject(element) {\n    let current = element;\n    while(current){\n        if (current.tagName.toLowerCase() === 'foreignobject') return true;\n        current = current.parentElement;\n    }\n    return false;\n}\nfunction $fe86f88c0c9aea93$var$recreateWithSvgNamespace(element) {\n    const svgElement = document.createElementNS($fe86f88c0c9aea93$var$SVG_NAMESPACE, element.tagName.toLowerCase());\n    // Copy attributes\n    for(let i = 0; i < element.attributes.length; i++){\n        const attr = element.attributes[i];\n        svgElement.setAttributeNS(null, attr.name, attr.value);\n    }\n    // Copy event handlers and other properties\n    // Common event handlers that need to be copied\n    const eventProperties = [\n        'onclick',\n        'onmousedown',\n        'onmouseup',\n        'onmouseover',\n        'onmouseout',\n        'onmousemove',\n        'onkeydown',\n        'onkeyup',\n        'onkeypress',\n        'onfocus',\n        'onblur'\n    ];\n    for (const prop of eventProperties)if (element[prop]) svgElement[prop] = element[prop];\n    // Copy children recursively\n    for(let i = 0; i < element.childNodes.length; i++){\n        const child = element.childNodes[i];\n        if (child.nodeType === Node.ELEMENT_NODE) svgElement.appendChild($fe86f88c0c9aea93$var$recreateWithSvgNamespace(child));\n        else svgElement.appendChild(child.cloneNode(true));\n    }\n    return svgElement;\n}\nfunction $fe86f88c0c9aea93$export$59da04d16460addd(parentElement, child) {\n    if (child === null || child === undefined || typeof child === \"boolean\") return;\n    else if (Array.isArray(child)) $fe86f88c0c9aea93$var$appendChildren(parentElement, child);\n    else if ($fe86f88c0c9aea93$var$isElement(child)) {\n        const childEl = child;\n        // If parent is SVG and child was created with wrong namespace, recreate it\n        // Exception: don't recreate elements inside foreignObject as they should remain HTML\n        if (parentElement.namespaceURI === $fe86f88c0c9aea93$var$SVG_NAMESPACE && childEl.namespaceURI !== $fe86f88c0c9aea93$var$SVG_NAMESPACE && childEl.tagName.toLowerCase() !== 'foreignobject' && !$fe86f88c0c9aea93$var$isInsideForeignObject(parentElement)) {\n            const recreated = $fe86f88c0c9aea93$var$recreateWithSvgNamespace(childEl);\n            parentElement.appendChild(recreated);\n        } else parentElement.appendChild(childEl);\n    } else parentElement.appendChild(document.createTextNode(child.toString()));\n}\nfunction $fe86f88c0c9aea93$var$appendChildren(parentElement, children) {\n    children.forEach((child)=>$fe86f88c0c9aea93$export$59da04d16460addd(parentElement, child));\n}\nfunction $fe86f88c0c9aea93$var$isElement(el) {\n    //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n    return !!el.nodeType;\n}\nfunction $fe86f88c0c9aea93$export$186d02efde07ef98(element, container) {\n    container.innerHTML = '';\n    if (element) $fe86f88c0c9aea93$export$59da04d16460addd(container, element);\n}\nfunction $fe86f88c0c9aea93$export$d0bfd83e3f838e5e(childPositions, container) {\n    let element = container || document.body;\n    let childPosition;\n    while(element && childPositions.length){\n        childPosition = childPositions.shift();\n        element = element.children.item(childPosition);\n    }\n    if (element) return element;\n}\nfunction $fe86f88c0c9aea93$export$8a664f09713ad850(element, activeElementInfo) {\n    element.focus();\n    element.scrollTop = activeElementInfo.scrollTop;\n    const input = element;\n    if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n}\nfunction $fe86f88c0c9aea93$export$7d007ff58288f238(activeElementInfo, container) {\n    if (activeElementInfo) {\n        const element = $fe86f88c0c9aea93$export$d0bfd83e3f838e5e(activeElementInfo.childPositions, container);\n        if (element) $fe86f88c0c9aea93$export$8a664f09713ad850(element, activeElementInfo);\n    }\n}\nfunction $fe86f88c0c9aea93$export$5ec2c407fb44f02(container) {\n    let element = document.activeElement;\n    const { scrollTop: scrollTop, selectionDirection: selectionDirection, selectionEnd: selectionEnd, selectionStart: selectionStart } = element;\n    const activeElementInfo = {\n        childPositions: [],\n        scrollTop: scrollTop,\n        selectionDirection: selectionDirection,\n        selectionEnd: selectionEnd,\n        selectionStart: selectionStart\n    };\n    while(element && element !== document.body && element !== container){\n        activeElementInfo.childPositions.unshift($fe86f88c0c9aea93$var$getChildPosition(element));\n        element = element.parentElement;\n    }\n    if ((element === document.body || element === container) && activeElementInfo.childPositions.length) return activeElementInfo;\n}\nfunction $fe86f88c0c9aea93$var$getChildPosition(element) {\n    let childPosition = 0;\n    while(element = element.previousElementSibling)childPosition++;\n    return childPosition;\n}\n\n\nconst $837e7efbc300fecc$var$KeyCodes = {\n    ENTER: 'Enter'\n};\nconst $837e7efbc300fecc$export$54ec01a60f47d33d = (props)=>{\n    return (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"table\", {\n        className: props.className\n    }, props.children, props.rows.map((row, i)=>(0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"tr\", {\n            className: props.rowClassName || '',\n            onClick: (e)=>props.onRowClick && props.onRowClick(e, i),\n            tabIndex: props.onRowClick ? 0 : -1,\n            onKeyUp: (e)=>{\n                if (e.key === $837e7efbc300fecc$var$KeyCodes.ENTER && props.onRowClick) props.onRowClick(e, i);\n            }\n        }, row.cells.map((cell, i)=>(0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"td\", {\n                className: cell.className || '',\n                title: cell.title || ''\n            }, cell.content)))));\n};\n\n\n\n\nvar $4ef7f72d8d2a203c$exports = {};\n\n$parcel$export($4ef7f72d8d2a203c$exports, \"MorphChartsCore\", () => $4a6417d29706362f$export$4143ab5b91744744);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * This file is for external facing export only, do not use this for internal references,\n * as it may cause circular dependencies in Rollup.\n */ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ var $14f38b7dd89457d7$exports = {};\n\n$parcel$export($14f38b7dd89457d7$exports, \"EPSILON\", () => $14f38b7dd89457d7$export$fd293b15f47e270);\n$parcel$export($14f38b7dd89457d7$exports, \"ARRAY_TYPE\", () => $14f38b7dd89457d7$export$b67359430d3b1b2);\n$parcel$export($14f38b7dd89457d7$exports, \"RANDOM\", () => $14f38b7dd89457d7$export$5ada478c8a628231);\n$parcel$export($14f38b7dd89457d7$exports, \"ANGLE_ORDER\", () => $14f38b7dd89457d7$export$217057687ee20298);\n$parcel$export($14f38b7dd89457d7$exports, \"round\", () => $14f38b7dd89457d7$export$2077e0241d6afd3c);\n$parcel$export($14f38b7dd89457d7$exports, \"setMatrixArrayType\", () => $14f38b7dd89457d7$export$cb2c0eb57f5e532c);\n$parcel$export($14f38b7dd89457d7$exports, \"toRadian\", () => $14f38b7dd89457d7$export$408b8ee5959eefd5);\n$parcel$export($14f38b7dd89457d7$exports, \"toDegree\", () => $14f38b7dd89457d7$export$c796d9d3e501591f);\n$parcel$export($14f38b7dd89457d7$exports, \"equals\", () => $14f38b7dd89457d7$export$e9bab7fafb253603);\n/**\n * Common utilities\n * @module glMatrix\n */ // Configuration Constants\nvar $14f38b7dd89457d7$export$fd293b15f47e270 = 0.000001;\nvar $14f38b7dd89457d7$export$b67359430d3b1b2 = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nvar $14f38b7dd89457d7$export$5ada478c8a628231 = Math.random;\nvar $14f38b7dd89457d7$export$217057687ee20298 = \"zyx\";\nfunction $14f38b7dd89457d7$export$2077e0241d6afd3c(a) {\n    if (a >= 0) return Math.round(a);\n    return a % 0.5 === 0 ? Math.floor(a) : Math.round(a);\n}\nfunction $14f38b7dd89457d7$export$cb2c0eb57f5e532c(type) {\n    $14f38b7dd89457d7$export$b67359430d3b1b2 = type;\n}\nvar $14f38b7dd89457d7$var$degree = Math.PI / 180;\nvar $14f38b7dd89457d7$var$radian = 180 / Math.PI;\nfunction $14f38b7dd89457d7$export$408b8ee5959eefd5(a) {\n    return a * $14f38b7dd89457d7$var$degree;\n}\nfunction $14f38b7dd89457d7$export$c796d9d3e501591f(a) {\n    return a * $14f38b7dd89457d7$var$radian;\n}\nfunction $14f38b7dd89457d7$export$e9bab7fafb253603(a, b) {\n    var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : $14f38b7dd89457d7$export$fd293b15f47e270;\n    return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b));\n}\n\nvar $1ac1b59392edf35b$exports = {};\n\n$parcel$export($1ac1b59392edf35b$exports, \"create\", () => $1ac1b59392edf35b$export$185802fd694ee1f5);\n$parcel$export($1ac1b59392edf35b$exports, \"clone\", () => $1ac1b59392edf35b$export$9cd59f9826255e47);\n$parcel$export($1ac1b59392edf35b$exports, \"copy\", () => $1ac1b59392edf35b$export$784d13d8ee351f07);\n$parcel$export($1ac1b59392edf35b$exports, \"fromValues\", () => $1ac1b59392edf35b$export$a82be99ed2a44a7d);\n$parcel$export($1ac1b59392edf35b$exports, \"set\", () => $1ac1b59392edf35b$export$adaa4cf7ef1b65be);\n$parcel$export($1ac1b59392edf35b$exports, \"identity\", () => $1ac1b59392edf35b$export$f0954fd7d5368655);\n$parcel$export($1ac1b59392edf35b$exports, \"transpose\", () => $1ac1b59392edf35b$export$9cb09a71b7d66923);\n$parcel$export($1ac1b59392edf35b$exports, \"invert\", () => $1ac1b59392edf35b$export$6897c284b6f9f4dc);\n$parcel$export($1ac1b59392edf35b$exports, \"adjoint\", () => $1ac1b59392edf35b$export$33f3c024b4ae00a1);\n$parcel$export($1ac1b59392edf35b$exports, \"determinant\", () => $1ac1b59392edf35b$export$a04698f914c55ed9);\n$parcel$export($1ac1b59392edf35b$exports, \"multiply\", () => $1ac1b59392edf35b$export$2060d2db72cce88f);\n$parcel$export($1ac1b59392edf35b$exports, \"translate\", () => $1ac1b59392edf35b$export$d73ee8ef04f5226a);\n$parcel$export($1ac1b59392edf35b$exports, \"scale\", () => $1ac1b59392edf35b$export$dcdf75081b88279d);\n$parcel$export($1ac1b59392edf35b$exports, \"rotate\", () => $1ac1b59392edf35b$export$bb628a54ab399bc9);\n$parcel$export($1ac1b59392edf35b$exports, \"rotateX\", () => $1ac1b59392edf35b$export$a59c8716592e09af);\n$parcel$export($1ac1b59392edf35b$exports, \"rotateY\", () => $1ac1b59392edf35b$export$cf71e4d4ca4d1cfd);\n$parcel$export($1ac1b59392edf35b$exports, \"rotateZ\", () => $1ac1b59392edf35b$export$ea6eae3365de5b9c);\n$parcel$export($1ac1b59392edf35b$exports, \"fromTranslation\", () => $1ac1b59392edf35b$export$bc9e79e74e9fddf6);\n$parcel$export($1ac1b59392edf35b$exports, \"fromScaling\", () => $1ac1b59392edf35b$export$832ca188ffb1955d);\n$parcel$export($1ac1b59392edf35b$exports, \"fromRotation\", () => $1ac1b59392edf35b$export$926fc125ff3c666c);\n$parcel$export($1ac1b59392edf35b$exports, \"fromXRotation\", () => $1ac1b59392edf35b$export$dd47cc2f828c32ef);\n$parcel$export($1ac1b59392edf35b$exports, \"fromYRotation\", () => $1ac1b59392edf35b$export$7dc997d67d2b7f33);\n$parcel$export($1ac1b59392edf35b$exports, \"fromZRotation\", () => $1ac1b59392edf35b$export$ad5ddaedc8f405df);\n$parcel$export($1ac1b59392edf35b$exports, \"fromRotationTranslation\", () => $1ac1b59392edf35b$export$9545ac307f2a256b);\n$parcel$export($1ac1b59392edf35b$exports, \"fromQuat2\", () => $1ac1b59392edf35b$export$ff497f2be31cc6a);\n$parcel$export($1ac1b59392edf35b$exports, \"getTranslation\", () => $1ac1b59392edf35b$export$202e99f82f7f0395);\n$parcel$export($1ac1b59392edf35b$exports, \"getScaling\", () => $1ac1b59392edf35b$export$71dc54d92bd04b57);\n$parcel$export($1ac1b59392edf35b$exports, \"getRotation\", () => $1ac1b59392edf35b$export$df3937d3b537df0a);\n$parcel$export($1ac1b59392edf35b$exports, \"decompose\", () => $1ac1b59392edf35b$export$4e06b4a690896b27);\n$parcel$export($1ac1b59392edf35b$exports, \"fromRotationTranslationScale\", () => $1ac1b59392edf35b$export$ddf9c55c9f2be172);\n$parcel$export($1ac1b59392edf35b$exports, \"fromRotationTranslationScaleOrigin\", () => $1ac1b59392edf35b$export$1def1f860edc4b1f);\n$parcel$export($1ac1b59392edf35b$exports, \"fromQuat\", () => $1ac1b59392edf35b$export$2ff2bbe382249af7);\n$parcel$export($1ac1b59392edf35b$exports, \"frustum\", () => $1ac1b59392edf35b$export$89b5708c387cac6c);\n$parcel$export($1ac1b59392edf35b$exports, \"perspectiveNO\", () => $1ac1b59392edf35b$export$4cf19729ec9a96b8);\n$parcel$export($1ac1b59392edf35b$exports, \"perspective\", () => $1ac1b59392edf35b$export$541149539f3a4684);\n$parcel$export($1ac1b59392edf35b$exports, \"perspectiveZO\", () => $1ac1b59392edf35b$export$294bba99a6af0c0c);\n$parcel$export($1ac1b59392edf35b$exports, \"perspectiveFromFieldOfView\", () => $1ac1b59392edf35b$export$58ae211c788e338f);\n$parcel$export($1ac1b59392edf35b$exports, \"orthoNO\", () => $1ac1b59392edf35b$export$c5f65ef3eb668f27);\n$parcel$export($1ac1b59392edf35b$exports, \"ortho\", () => $1ac1b59392edf35b$export$4f2167e613cfc87b);\n$parcel$export($1ac1b59392edf35b$exports, \"orthoZO\", () => $1ac1b59392edf35b$export$b1d31ea7b4d854e);\n$parcel$export($1ac1b59392edf35b$exports, \"lookAt\", () => $1ac1b59392edf35b$export$d924e14fd6d9aa66);\n$parcel$export($1ac1b59392edf35b$exports, \"targetTo\", () => $1ac1b59392edf35b$export$aa67782f4dc9e52c);\n$parcel$export($1ac1b59392edf35b$exports, \"str\", () => $1ac1b59392edf35b$export$42d51816ce590c93);\n$parcel$export($1ac1b59392edf35b$exports, \"frob\", () => $1ac1b59392edf35b$export$326827e8268e9cdb);\n$parcel$export($1ac1b59392edf35b$exports, \"add\", () => $1ac1b59392edf35b$export$e16d8520af44a096);\n$parcel$export($1ac1b59392edf35b$exports, \"subtract\", () => $1ac1b59392edf35b$export$4e2d2ead65e5f7e3);\n$parcel$export($1ac1b59392edf35b$exports, \"multiplyScalar\", () => $1ac1b59392edf35b$export$c697bed75648cdb7);\n$parcel$export($1ac1b59392edf35b$exports, \"multiplyScalarAndAdd\", () => $1ac1b59392edf35b$export$553579f63bdd7137);\n$parcel$export($1ac1b59392edf35b$exports, \"exactEquals\", () => $1ac1b59392edf35b$export$f2599a5cf1109d8);\n$parcel$export($1ac1b59392edf35b$exports, \"equals\", () => $1ac1b59392edf35b$export$e9bab7fafb253603);\n$parcel$export($1ac1b59392edf35b$exports, \"mul\", () => $1ac1b59392edf35b$export$6e3a27864ab166fe);\n$parcel$export($1ac1b59392edf35b$exports, \"sub\", () => $1ac1b59392edf35b$export$f93b5905241a7cca);\n\nfunction $1ac1b59392edf35b$export$185802fd694ee1f5() {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(16);\n    if ($14f38b7dd89457d7$export$b67359430d3b1b2 != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[4] = 0;\n        out[6] = 0;\n        out[7] = 0;\n        out[8] = 0;\n        out[9] = 0;\n        out[11] = 0;\n        out[12] = 0;\n        out[13] = 0;\n        out[14] = 0;\n    }\n    out[0] = 1;\n    out[5] = 1;\n    out[10] = 1;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$9cd59f9826255e47(a) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(16);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction $1ac1b59392edf35b$export$784d13d8ee351f07(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction $1ac1b59392edf35b$export$a82be99ed2a44a7d(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$adaa4cf7ef1b65be(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$f0954fd7d5368655(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$9cb09a71b7d66923(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a03 = a[3];\n        var a12 = a[6], a13 = a[7];\n        var a23 = a[11];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a01;\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a02;\n        out[9] = a12;\n        out[11] = a[14];\n        out[12] = a03;\n        out[13] = a13;\n        out[14] = a23;\n    } else {\n        out[0] = a[0];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a[1];\n        out[5] = a[5];\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a[2];\n        out[9] = a[6];\n        out[10] = a[10];\n        out[11] = a[14];\n        out[12] = a[3];\n        out[13] = a[7];\n        out[14] = a[11];\n        out[15] = a[15];\n    }\n    return out;\n}\nfunction $1ac1b59392edf35b$export$6897c284b6f9f4dc(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32;\n    // Calculate the determinant\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$33f3c024b4ae00a1(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32;\n    out[0] = a11 * b11 - a12 * b10 + a13 * b09;\n    out[1] = a02 * b10 - a01 * b11 - a03 * b09;\n    out[2] = a31 * b05 - a32 * b04 + a33 * b03;\n    out[3] = a22 * b04 - a21 * b05 - a23 * b03;\n    out[4] = a12 * b08 - a10 * b11 - a13 * b07;\n    out[5] = a00 * b11 - a02 * b08 + a03 * b07;\n    out[6] = a32 * b02 - a30 * b05 - a33 * b01;\n    out[7] = a20 * b05 - a22 * b02 + a23 * b01;\n    out[8] = a10 * b10 - a11 * b08 + a13 * b06;\n    out[9] = a01 * b08 - a00 * b10 - a03 * b06;\n    out[10] = a30 * b04 - a31 * b02 + a33 * b00;\n    out[11] = a21 * b02 - a20 * b04 - a23 * b00;\n    out[12] = a11 * b07 - a10 * b09 - a12 * b06;\n    out[13] = a00 * b09 - a01 * b07 + a02 * b06;\n    out[14] = a31 * b01 - a30 * b03 - a32 * b00;\n    out[15] = a20 * b03 - a21 * b01 + a22 * b00;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$a04698f914c55ed9(a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b0 = a00 * a11 - a01 * a10;\n    var b1 = a00 * a12 - a02 * a10;\n    var b2 = a01 * a12 - a02 * a11;\n    var b3 = a20 * a31 - a21 * a30;\n    var b4 = a20 * a32 - a22 * a30;\n    var b5 = a21 * a32 - a22 * a31;\n    var b6 = a00 * b5 - a01 * b4 + a02 * b3;\n    var b7 = a10 * b5 - a11 * b4 + a12 * b3;\n    var b8 = a20 * b2 - a21 * b1 + a22 * b0;\n    var b9 = a30 * b2 - a31 * b1 + a32 * b0;\n    // Calculate the determinant\n    return a13 * b6 - a03 * b7 + a33 * b8 - a23 * b9;\n}\nfunction $1ac1b59392edf35b$export$2060d2db72cce88f(out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    // Cache only the current line of the second matrix\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[4];\n    b1 = b[5];\n    b2 = b[6];\n    b3 = b[7];\n    out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[8];\n    b1 = b[9];\n    b2 = b[10];\n    b3 = b[11];\n    out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[12];\n    b1 = b[13];\n    b2 = b[14];\n    b3 = b[15];\n    out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$d73ee8ef04f5226a(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n        a00 = a[0];\n        a01 = a[1];\n        a02 = a[2];\n        a03 = a[3];\n        a10 = a[4];\n        a11 = a[5];\n        a12 = a[6];\n        a13 = a[7];\n        a20 = a[8];\n        a21 = a[9];\n        a22 = a[10];\n        a23 = a[11];\n        out[0] = a00;\n        out[1] = a01;\n        out[2] = a02;\n        out[3] = a03;\n        out[4] = a10;\n        out[5] = a11;\n        out[6] = a12;\n        out[7] = a13;\n        out[8] = a20;\n        out[9] = a21;\n        out[10] = a22;\n        out[11] = a23;\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n    return out;\n}\nfunction $1ac1b59392edf35b$export$dcdf75081b88279d(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n    out[0] = a[0] * x;\n    out[1] = a[1] * x;\n    out[2] = a[2] * x;\n    out[3] = a[3] * x;\n    out[4] = a[4] * y;\n    out[5] = a[5] * y;\n    out[6] = a[6] * y;\n    out[7] = a[7] * y;\n    out[8] = a[8] * z;\n    out[9] = a[9] * z;\n    out[10] = a[10] * z;\n    out[11] = a[11] * z;\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction $1ac1b59392edf35b$export$bb628a54ab399bc9(out, a, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2];\n    var len = Math.sqrt(x * x + y * y + z * z);\n    var s, c, t;\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    var b00, b01, b02;\n    var b10, b11, b12;\n    var b20, b21, b22;\n    if (len < $14f38b7dd89457d7$export$fd293b15f47e270) return null;\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n    a00 = a[0];\n    a01 = a[1];\n    a02 = a[2];\n    a03 = a[3];\n    a10 = a[4];\n    a11 = a[5];\n    a12 = a[6];\n    a13 = a[7];\n    a20 = a[8];\n    a21 = a[9];\n    a22 = a[10];\n    a23 = a[11];\n    // Construct the elements of the rotation matrix\n    b00 = x * x * t + c;\n    b01 = y * x * t + z * s;\n    b02 = z * x * t - y * s;\n    b10 = x * y * t - z * s;\n    b11 = y * y * t + c;\n    b12 = z * y * t + x * s;\n    b20 = x * z * t + y * s;\n    b21 = y * z * t - x * s;\n    b22 = z * z * t + c;\n    // Perform rotation-specific matrix multiplication\n    out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n    out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n    out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n    out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n    out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n    out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n    out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n    out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n    out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n    out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n    out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n    out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged last row\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    return out;\n}\nfunction $1ac1b59392edf35b$export$a59c8716592e09af(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a10 = a[4];\n    var a11 = a[5];\n    var a12 = a[6];\n    var a13 = a[7];\n    var a20 = a[8];\n    var a21 = a[9];\n    var a22 = a[10];\n    var a23 = a[11];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged rows\n        out[0] = a[0];\n        out[1] = a[1];\n        out[2] = a[2];\n        out[3] = a[3];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    // Perform axis-specific matrix multiplication\n    out[4] = a10 * c + a20 * s;\n    out[5] = a11 * c + a21 * s;\n    out[6] = a12 * c + a22 * s;\n    out[7] = a13 * c + a23 * s;\n    out[8] = a20 * c - a10 * s;\n    out[9] = a21 * c - a11 * s;\n    out[10] = a22 * c - a12 * s;\n    out[11] = a23 * c - a13 * s;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$cf71e4d4ca4d1cfd(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a00 = a[0];\n    var a01 = a[1];\n    var a02 = a[2];\n    var a03 = a[3];\n    var a20 = a[8];\n    var a21 = a[9];\n    var a22 = a[10];\n    var a23 = a[11];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged rows\n        out[4] = a[4];\n        out[5] = a[5];\n        out[6] = a[6];\n        out[7] = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    // Perform axis-specific matrix multiplication\n    out[0] = a00 * c - a20 * s;\n    out[1] = a01 * c - a21 * s;\n    out[2] = a02 * c - a22 * s;\n    out[3] = a03 * c - a23 * s;\n    out[8] = a00 * s + a20 * c;\n    out[9] = a01 * s + a21 * c;\n    out[10] = a02 * s + a22 * c;\n    out[11] = a03 * s + a23 * c;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$ea6eae3365de5b9c(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a00 = a[0];\n    var a01 = a[1];\n    var a02 = a[2];\n    var a03 = a[3];\n    var a10 = a[4];\n    var a11 = a[5];\n    var a12 = a[6];\n    var a13 = a[7];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged last row\n        out[8] = a[8];\n        out[9] = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    // Perform axis-specific matrix multiplication\n    out[0] = a00 * c + a10 * s;\n    out[1] = a01 * c + a11 * s;\n    out[2] = a02 * c + a12 * s;\n    out[3] = a03 * c + a13 * s;\n    out[4] = a10 * c - a00 * s;\n    out[5] = a11 * c - a01 * s;\n    out[6] = a12 * c - a02 * s;\n    out[7] = a13 * c - a03 * s;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$bc9e79e74e9fddf6(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$832ca188ffb1955d(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$926fc125ff3c666c(out, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2];\n    var len = Math.sqrt(x * x + y * y + z * z);\n    var s, c, t;\n    if (len < $14f38b7dd89457d7$export$fd293b15f47e270) return null;\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n    // Perform rotation-specific matrix multiplication\n    out[0] = x * x * t + c;\n    out[1] = y * x * t + z * s;\n    out[2] = z * x * t - y * s;\n    out[3] = 0;\n    out[4] = x * y * t - z * s;\n    out[5] = y * y * t + c;\n    out[6] = z * y * t + x * s;\n    out[7] = 0;\n    out[8] = x * z * t + y * s;\n    out[9] = y * z * t - x * s;\n    out[10] = z * z * t + c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$dd47cc2f828c32ef(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    // Perform axis-specific matrix multiplication\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = c;\n    out[6] = s;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = -s;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$7dc997d67d2b7f33(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    // Perform axis-specific matrix multiplication\n    out[0] = c;\n    out[1] = 0;\n    out[2] = -s;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = s;\n    out[9] = 0;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$ad5ddaedc8f405df(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    // Perform axis-specific matrix multiplication\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = -s;\n    out[5] = c;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$9545ac307f2a256b(out, q, v) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - (yy + zz);\n    out[1] = xy + wz;\n    out[2] = xz - wy;\n    out[3] = 0;\n    out[4] = xy - wz;\n    out[5] = 1 - (xx + zz);\n    out[6] = yz + wx;\n    out[7] = 0;\n    out[8] = xz + wy;\n    out[9] = yz - wx;\n    out[10] = 1 - (xx + yy);\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$ff497f2be31cc6a(out, a) {\n    var translation = new $14f38b7dd89457d7$export$b67359430d3b1b2(3);\n    var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7];\n    var magnitude = bx * bx + by * by + bz * bz + bw * bw;\n    //Only scale if it makes sense\n    if (magnitude > 0) {\n        translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n        translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n        translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n    } else {\n        translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n        translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n        translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n    }\n    $1ac1b59392edf35b$export$9545ac307f2a256b(out, a, translation);\n    return out;\n}\nfunction $1ac1b59392edf35b$export$202e99f82f7f0395(out, mat) {\n    out[0] = mat[12];\n    out[1] = mat[13];\n    out[2] = mat[14];\n    return out;\n}\nfunction $1ac1b59392edf35b$export$71dc54d92bd04b57(out, mat) {\n    var m11 = mat[0];\n    var m12 = mat[1];\n    var m13 = mat[2];\n    var m21 = mat[4];\n    var m22 = mat[5];\n    var m23 = mat[6];\n    var m31 = mat[8];\n    var m32 = mat[9];\n    var m33 = mat[10];\n    out[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13);\n    out[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23);\n    out[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33);\n    return out;\n}\nfunction $1ac1b59392edf35b$export$df3937d3b537df0a(out, mat) {\n    var scaling = new $14f38b7dd89457d7$export$b67359430d3b1b2(3);\n    $1ac1b59392edf35b$export$71dc54d92bd04b57(scaling, mat);\n    var is1 = 1 / scaling[0];\n    var is2 = 1 / scaling[1];\n    var is3 = 1 / scaling[2];\n    var sm11 = mat[0] * is1;\n    var sm12 = mat[1] * is2;\n    var sm13 = mat[2] * is3;\n    var sm21 = mat[4] * is1;\n    var sm22 = mat[5] * is2;\n    var sm23 = mat[6] * is3;\n    var sm31 = mat[8] * is1;\n    var sm32 = mat[9] * is2;\n    var sm33 = mat[10] * is3;\n    var trace = sm11 + sm22 + sm33;\n    var S = 0;\n    if (trace > 0) {\n        S = Math.sqrt(trace + 1.0) * 2;\n        out[3] = 0.25 * S;\n        out[0] = (sm23 - sm32) / S;\n        out[1] = (sm31 - sm13) / S;\n        out[2] = (sm12 - sm21) / S;\n    } else if (sm11 > sm22 && sm11 > sm33) {\n        S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n        out[3] = (sm23 - sm32) / S;\n        out[0] = 0.25 * S;\n        out[1] = (sm12 + sm21) / S;\n        out[2] = (sm31 + sm13) / S;\n    } else if (sm22 > sm33) {\n        S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n        out[3] = (sm31 - sm13) / S;\n        out[0] = (sm12 + sm21) / S;\n        out[1] = 0.25 * S;\n        out[2] = (sm23 + sm32) / S;\n    } else {\n        S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n        out[3] = (sm12 - sm21) / S;\n        out[0] = (sm31 + sm13) / S;\n        out[1] = (sm23 + sm32) / S;\n        out[2] = 0.25 * S;\n    }\n    return out;\n}\nfunction $1ac1b59392edf35b$export$4e06b4a690896b27(out_r, out_t, out_s, mat) {\n    out_t[0] = mat[12];\n    out_t[1] = mat[13];\n    out_t[2] = mat[14];\n    var m11 = mat[0];\n    var m12 = mat[1];\n    var m13 = mat[2];\n    var m21 = mat[4];\n    var m22 = mat[5];\n    var m23 = mat[6];\n    var m31 = mat[8];\n    var m32 = mat[9];\n    var m33 = mat[10];\n    out_s[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13);\n    out_s[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23);\n    out_s[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33);\n    var is1 = 1 / out_s[0];\n    var is2 = 1 / out_s[1];\n    var is3 = 1 / out_s[2];\n    var sm11 = m11 * is1;\n    var sm12 = m12 * is2;\n    var sm13 = m13 * is3;\n    var sm21 = m21 * is1;\n    var sm22 = m22 * is2;\n    var sm23 = m23 * is3;\n    var sm31 = m31 * is1;\n    var sm32 = m32 * is2;\n    var sm33 = m33 * is3;\n    var trace = sm11 + sm22 + sm33;\n    var S = 0;\n    if (trace > 0) {\n        S = Math.sqrt(trace + 1.0) * 2;\n        out_r[3] = 0.25 * S;\n        out_r[0] = (sm23 - sm32) / S;\n        out_r[1] = (sm31 - sm13) / S;\n        out_r[2] = (sm12 - sm21) / S;\n    } else if (sm11 > sm22 && sm11 > sm33) {\n        S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n        out_r[3] = (sm23 - sm32) / S;\n        out_r[0] = 0.25 * S;\n        out_r[1] = (sm12 + sm21) / S;\n        out_r[2] = (sm31 + sm13) / S;\n    } else if (sm22 > sm33) {\n        S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n        out_r[3] = (sm31 - sm13) / S;\n        out_r[0] = (sm12 + sm21) / S;\n        out_r[1] = 0.25 * S;\n        out_r[2] = (sm23 + sm32) / S;\n    } else {\n        S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n        out_r[3] = (sm12 - sm21) / S;\n        out_r[0] = (sm31 + sm13) / S;\n        out_r[1] = (sm23 + sm32) / S;\n        out_r[2] = 0.25 * S;\n    }\n    return out_r;\n}\nfunction $1ac1b59392edf35b$export$ddf9c55c9f2be172(out, q, v, s) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz = s[2];\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz;\n    out[9] = (yz - wx) * sz;\n    out[10] = (1 - (xx + yy)) * sz;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$1def1f860edc4b1f(out, q, v, s, o) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz = s[2];\n    var ox = o[0];\n    var oy = o[1];\n    var oz = o[2];\n    var out0 = (1 - (yy + zz)) * sx;\n    var out1 = (xy + wz) * sx;\n    var out2 = (xz - wy) * sx;\n    var out4 = (xy - wz) * sy;\n    var out5 = (1 - (xx + zz)) * sy;\n    var out6 = (yz + wx) * sy;\n    var out8 = (xz + wy) * sz;\n    var out9 = (yz - wx) * sz;\n    var out10 = (1 - (xx + yy)) * sz;\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = 0;\n    out[4] = out4;\n    out[5] = out5;\n    out[6] = out6;\n    out[7] = 0;\n    out[8] = out8;\n    out[9] = out9;\n    out[10] = out10;\n    out[11] = 0;\n    out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n    out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n    out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$2ff2bbe382249af7(out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var yx = y * x2;\n    var yy = y * y2;\n    var zx = z * x2;\n    var zy = z * y2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$89b5708c387cac6c(out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left);\n    var tb = 1 / (top - bottom);\n    var nf = 1 / (near - far);\n    out[0] = near * 2 * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = near * 2 * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = far * near * 2 * nf;\n    out[15] = 0;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$4cf19729ec9a96b8(out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n        var nf = 1 / (near - far);\n        out[10] = (far + near) * nf;\n        out[14] = 2 * far * near * nf;\n    } else {\n        out[10] = -1;\n        out[14] = -2 * near;\n    }\n    return out;\n}\nvar $1ac1b59392edf35b$export$541149539f3a4684 = $1ac1b59392edf35b$export$4cf19729ec9a96b8;\nfunction $1ac1b59392edf35b$export$294bba99a6af0c0c(out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n        var nf = 1 / (near - far);\n        out[10] = far * nf;\n        out[14] = far * near * nf;\n    } else {\n        out[10] = -1;\n        out[14] = -near;\n    }\n    return out;\n}\nfunction $1ac1b59392edf35b$export$58ae211c788e338f(out, fov, near, far) {\n    var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n    var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n    var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n    var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n    var xScale = 2.0 / (leftTan + rightTan);\n    var yScale = 2.0 / (upTan + downTan);\n    out[0] = xScale;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    out[4] = 0.0;\n    out[5] = yScale;\n    out[6] = 0.0;\n    out[7] = 0.0;\n    out[8] = -((leftTan - rightTan) * xScale * 0.5);\n    out[9] = (upTan - downTan) * yScale * 0.5;\n    out[10] = far / (near - far);\n    out[11] = -1;\n    out[12] = 0.0;\n    out[13] = 0.0;\n    out[14] = far * near / (near - far);\n    out[15] = 0.0;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$c5f65ef3eb668f27(out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right);\n    var bt = 1 / (bottom - top);\n    var nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 2 * nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = (far + near) * nf;\n    out[15] = 1;\n    return out;\n}\nvar $1ac1b59392edf35b$export$4f2167e613cfc87b = $1ac1b59392edf35b$export$c5f65ef3eb668f27;\nfunction $1ac1b59392edf35b$export$b1d31ea7b4d854e(out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right);\n    var bt = 1 / (bottom - top);\n    var nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = near * nf;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$d924e14fd6d9aa66(out, eye, center, up) {\n    var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n    var eyex = eye[0];\n    var eyey = eye[1];\n    var eyez = eye[2];\n    var upx = up[0];\n    var upy = up[1];\n    var upz = up[2];\n    var centerx = center[0];\n    var centery = center[1];\n    var centerz = center[2];\n    if (Math.abs(eyex - centerx) < $14f38b7dd89457d7$export$fd293b15f47e270 && Math.abs(eyey - centery) < $14f38b7dd89457d7$export$fd293b15f47e270 && Math.abs(eyez - centerz) < $14f38b7dd89457d7$export$fd293b15f47e270) return $1ac1b59392edf35b$export$f0954fd7d5368655(out);\n    z0 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n    len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n    x0 = upy * z2 - upz * z1;\n    x1 = upz * z0 - upx * z2;\n    x2 = upx * z1 - upy * z0;\n    len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n    if (!len) {\n        x0 = 0;\n        x1 = 0;\n        x2 = 0;\n    } else {\n        len = 1 / len;\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n    y0 = z1 * x2 - z2 * x1;\n    y1 = z2 * x0 - z0 * x2;\n    y2 = z0 * x1 - z1 * x0;\n    len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n    if (!len) {\n        y0 = 0;\n        y1 = 0;\n        y2 = 0;\n    } else {\n        len = 1 / len;\n        y0 *= len;\n        y1 *= len;\n        y2 *= len;\n    }\n    out[0] = x0;\n    out[1] = y0;\n    out[2] = z0;\n    out[3] = 0;\n    out[4] = x1;\n    out[5] = y1;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n    out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n    out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$aa67782f4dc9e52c(out, eye, target, up) {\n    var eyex = eye[0], eyey = eye[1], eyez = eye[2], upx = up[0], upy = up[1], upz = up[2];\n    var z0 = eyex - target[0], z1 = eyey - target[1], z2 = eyez - target[2];\n    var len = z0 * z0 + z1 * z1 + z2 * z2;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        z0 *= len;\n        z1 *= len;\n        z2 *= len;\n    }\n    var x0 = upy * z2 - upz * z1, x1 = upz * z0 - upx * z2, x2 = upx * z1 - upy * z0;\n    len = x0 * x0 + x1 * x1 + x2 * x2;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n    out[0] = x0;\n    out[1] = x1;\n    out[2] = x2;\n    out[3] = 0;\n    out[4] = z1 * x2 - z2 * x1;\n    out[5] = z2 * x0 - z0 * x2;\n    out[6] = z0 * x1 - z1 * x0;\n    out[7] = 0;\n    out[8] = z0;\n    out[9] = z1;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = eyex;\n    out[13] = eyey;\n    out[14] = eyez;\n    out[15] = 1;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$42d51816ce590c93(a) {\n    return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\nfunction $1ac1b59392edf35b$export$326827e8268e9cdb(a) {\n    return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3] + a[4] * a[4] + a[5] * a[5] + a[6] * a[6] + a[7] * a[7] + a[8] * a[8] + a[9] * a[9] + a[10] * a[10] + a[11] * a[11] + a[12] * a[12] + a[13] * a[13] + a[14] * a[14] + a[15] * a[15]);\n}\nfunction $1ac1b59392edf35b$export$e16d8520af44a096(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    out[9] = a[9] + b[9];\n    out[10] = a[10] + b[10];\n    out[11] = a[11] + b[11];\n    out[12] = a[12] + b[12];\n    out[13] = a[13] + b[13];\n    out[14] = a[14] + b[14];\n    out[15] = a[15] + b[15];\n    return out;\n}\nfunction $1ac1b59392edf35b$export$4e2d2ead65e5f7e3(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    out[9] = a[9] - b[9];\n    out[10] = a[10] - b[10];\n    out[11] = a[11] - b[11];\n    out[12] = a[12] - b[12];\n    out[13] = a[13] - b[13];\n    out[14] = a[14] - b[14];\n    out[15] = a[15] - b[15];\n    return out;\n}\nfunction $1ac1b59392edf35b$export$c697bed75648cdb7(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    out[9] = a[9] * b;\n    out[10] = a[10] * b;\n    out[11] = a[11] * b;\n    out[12] = a[12] * b;\n    out[13] = a[13] * b;\n    out[14] = a[14] * b;\n    out[15] = a[15] * b;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$553579f63bdd7137(out, a, b, scale) {\n    out[0] = a[0] + b[0] * scale;\n    out[1] = a[1] + b[1] * scale;\n    out[2] = a[2] + b[2] * scale;\n    out[3] = a[3] + b[3] * scale;\n    out[4] = a[4] + b[4] * scale;\n    out[5] = a[5] + b[5] * scale;\n    out[6] = a[6] + b[6] * scale;\n    out[7] = a[7] + b[7] * scale;\n    out[8] = a[8] + b[8] * scale;\n    out[9] = a[9] + b[9] * scale;\n    out[10] = a[10] + b[10] * scale;\n    out[11] = a[11] + b[11] * scale;\n    out[12] = a[12] + b[12] * scale;\n    out[13] = a[13] + b[13] * scale;\n    out[14] = a[14] + b[14] * scale;\n    out[15] = a[15] + b[15] * scale;\n    return out;\n}\nfunction $1ac1b59392edf35b$export$f2599a5cf1109d8(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\nfunction $1ac1b59392edf35b$export$e9bab7fafb253603(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7];\n    var a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11];\n    var a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    var b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7];\n    var b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11];\n    var b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];\n    return Math.abs(a0 - b0) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\nvar $1ac1b59392edf35b$export$6e3a27864ab166fe = $1ac1b59392edf35b$export$2060d2db72cce88f;\nvar $1ac1b59392edf35b$export$f93b5905241a7cca = $1ac1b59392edf35b$export$4e2d2ead65e5f7e3;\n\nvar $39ece26d1239bb77$exports = {};\n\n$parcel$export($39ece26d1239bb77$exports, \"create\", () => $39ece26d1239bb77$export$185802fd694ee1f5);\n$parcel$export($39ece26d1239bb77$exports, \"identity\", () => $39ece26d1239bb77$export$f0954fd7d5368655);\n$parcel$export($39ece26d1239bb77$exports, \"setAxisAngle\", () => $39ece26d1239bb77$export$4286ddefc8f49512);\n$parcel$export($39ece26d1239bb77$exports, \"getAxisAngle\", () => $39ece26d1239bb77$export$3f70be5e7d7dc51);\n$parcel$export($39ece26d1239bb77$exports, \"getAngle\", () => $39ece26d1239bb77$export$b363da9ded343252);\n$parcel$export($39ece26d1239bb77$exports, \"dot\", () => $39ece26d1239bb77$export$94132a0e348806d4);\n$parcel$export($39ece26d1239bb77$exports, \"multiply\", () => $39ece26d1239bb77$export$2060d2db72cce88f);\n$parcel$export($39ece26d1239bb77$exports, \"rotateX\", () => $39ece26d1239bb77$export$a59c8716592e09af);\n$parcel$export($39ece26d1239bb77$exports, \"rotateY\", () => $39ece26d1239bb77$export$cf71e4d4ca4d1cfd);\n$parcel$export($39ece26d1239bb77$exports, \"rotateZ\", () => $39ece26d1239bb77$export$ea6eae3365de5b9c);\n$parcel$export($39ece26d1239bb77$exports, \"calculateW\", () => $39ece26d1239bb77$export$fb72b72e8d764d4e);\n$parcel$export($39ece26d1239bb77$exports, \"exp\", () => $39ece26d1239bb77$export$b310ec824aaee37f);\n$parcel$export($39ece26d1239bb77$exports, \"ln\", () => $39ece26d1239bb77$export$876cb1b29620556f);\n$parcel$export($39ece26d1239bb77$exports, \"pow\", () => $39ece26d1239bb77$export$9c297f60e22e3389);\n$parcel$export($39ece26d1239bb77$exports, \"scale\", () => $39ece26d1239bb77$export$dcdf75081b88279d);\n$parcel$export($39ece26d1239bb77$exports, \"slerp\", () => $39ece26d1239bb77$export$1544d9bc2995de08);\n$parcel$export($39ece26d1239bb77$exports, \"random\", () => $39ece26d1239bb77$export$4385e60b38654f68);\n$parcel$export($39ece26d1239bb77$exports, \"invert\", () => $39ece26d1239bb77$export$6897c284b6f9f4dc);\n$parcel$export($39ece26d1239bb77$exports, \"conjugate\", () => $39ece26d1239bb77$export$7679f47e72c62560);\n$parcel$export($39ece26d1239bb77$exports, \"fromMat3\", () => $39ece26d1239bb77$export$272a1eb8e5a4b55b);\n$parcel$export($39ece26d1239bb77$exports, \"fromEuler\", () => $39ece26d1239bb77$export$7a404a587ea85af);\n$parcel$export($39ece26d1239bb77$exports, \"str\", () => $39ece26d1239bb77$export$42d51816ce590c93);\n$parcel$export($39ece26d1239bb77$exports, \"clone\", () => $39ece26d1239bb77$export$9cd59f9826255e47);\n$parcel$export($39ece26d1239bb77$exports, \"fromValues\", () => $39ece26d1239bb77$export$a82be99ed2a44a7d);\n$parcel$export($39ece26d1239bb77$exports, \"copy\", () => $39ece26d1239bb77$export$784d13d8ee351f07);\n$parcel$export($39ece26d1239bb77$exports, \"set\", () => $39ece26d1239bb77$export$adaa4cf7ef1b65be);\n$parcel$export($39ece26d1239bb77$exports, \"add\", () => $39ece26d1239bb77$export$e16d8520af44a096);\n$parcel$export($39ece26d1239bb77$exports, \"mul\", () => $39ece26d1239bb77$export$6e3a27864ab166fe);\n$parcel$export($39ece26d1239bb77$exports, \"lerp\", () => $39ece26d1239bb77$export$3a89f8d6f6bf6c9f);\n$parcel$export($39ece26d1239bb77$exports, \"length\", () => $39ece26d1239bb77$export$f24224f1c91d8156);\n$parcel$export($39ece26d1239bb77$exports, \"len\", () => $39ece26d1239bb77$export$fc1400facf92c78);\n$parcel$export($39ece26d1239bb77$exports, \"squaredLength\", () => $39ece26d1239bb77$export$ab44e1323ffc8376);\n$parcel$export($39ece26d1239bb77$exports, \"sqrLen\", () => $39ece26d1239bb77$export$99d8dd3f32a3435);\n$parcel$export($39ece26d1239bb77$exports, \"normalize\", () => $39ece26d1239bb77$export$a3295358bff77e);\n$parcel$export($39ece26d1239bb77$exports, \"exactEquals\", () => $39ece26d1239bb77$export$f2599a5cf1109d8);\n$parcel$export($39ece26d1239bb77$exports, \"equals\", () => $39ece26d1239bb77$export$e9bab7fafb253603);\n$parcel$export($39ece26d1239bb77$exports, \"rotationTo\", () => $39ece26d1239bb77$export$72d66f5842c00904);\n$parcel$export($39ece26d1239bb77$exports, \"sqlerp\", () => $39ece26d1239bb77$export$699b0866ca50f6cb);\n$parcel$export($39ece26d1239bb77$exports, \"setAxes\", () => $39ece26d1239bb77$export$937ca0a544b2d712);\n\nvar $ba3ca37806a2b6fa$exports = {};\n\n$parcel$export($ba3ca37806a2b6fa$exports, \"create\", () => $ba3ca37806a2b6fa$export$185802fd694ee1f5);\n$parcel$export($ba3ca37806a2b6fa$exports, \"fromMat4\", () => $ba3ca37806a2b6fa$export$b4ad467060d346fe);\n$parcel$export($ba3ca37806a2b6fa$exports, \"clone\", () => $ba3ca37806a2b6fa$export$9cd59f9826255e47);\n$parcel$export($ba3ca37806a2b6fa$exports, \"copy\", () => $ba3ca37806a2b6fa$export$784d13d8ee351f07);\n$parcel$export($ba3ca37806a2b6fa$exports, \"fromValues\", () => $ba3ca37806a2b6fa$export$a82be99ed2a44a7d);\n$parcel$export($ba3ca37806a2b6fa$exports, \"set\", () => $ba3ca37806a2b6fa$export$adaa4cf7ef1b65be);\n$parcel$export($ba3ca37806a2b6fa$exports, \"identity\", () => $ba3ca37806a2b6fa$export$f0954fd7d5368655);\n$parcel$export($ba3ca37806a2b6fa$exports, \"transpose\", () => $ba3ca37806a2b6fa$export$9cb09a71b7d66923);\n$parcel$export($ba3ca37806a2b6fa$exports, \"invert\", () => $ba3ca37806a2b6fa$export$6897c284b6f9f4dc);\n$parcel$export($ba3ca37806a2b6fa$exports, \"adjoint\", () => $ba3ca37806a2b6fa$export$33f3c024b4ae00a1);\n$parcel$export($ba3ca37806a2b6fa$exports, \"determinant\", () => $ba3ca37806a2b6fa$export$a04698f914c55ed9);\n$parcel$export($ba3ca37806a2b6fa$exports, \"multiply\", () => $ba3ca37806a2b6fa$export$2060d2db72cce88f);\n$parcel$export($ba3ca37806a2b6fa$exports, \"translate\", () => $ba3ca37806a2b6fa$export$d73ee8ef04f5226a);\n$parcel$export($ba3ca37806a2b6fa$exports, \"rotate\", () => $ba3ca37806a2b6fa$export$bb628a54ab399bc9);\n$parcel$export($ba3ca37806a2b6fa$exports, \"scale\", () => $ba3ca37806a2b6fa$export$dcdf75081b88279d);\n$parcel$export($ba3ca37806a2b6fa$exports, \"fromTranslation\", () => $ba3ca37806a2b6fa$export$bc9e79e74e9fddf6);\n$parcel$export($ba3ca37806a2b6fa$exports, \"fromRotation\", () => $ba3ca37806a2b6fa$export$926fc125ff3c666c);\n$parcel$export($ba3ca37806a2b6fa$exports, \"fromScaling\", () => $ba3ca37806a2b6fa$export$832ca188ffb1955d);\n$parcel$export($ba3ca37806a2b6fa$exports, \"fromMat2d\", () => $ba3ca37806a2b6fa$export$68f5977575fae9bf);\n$parcel$export($ba3ca37806a2b6fa$exports, \"fromQuat\", () => $ba3ca37806a2b6fa$export$2ff2bbe382249af7);\n$parcel$export($ba3ca37806a2b6fa$exports, \"normalFromMat4\", () => $ba3ca37806a2b6fa$export$966b25ab6dc1b1f9);\n$parcel$export($ba3ca37806a2b6fa$exports, \"projection\", () => $ba3ca37806a2b6fa$export$b74061472fe7c07);\n$parcel$export($ba3ca37806a2b6fa$exports, \"str\", () => $ba3ca37806a2b6fa$export$42d51816ce590c93);\n$parcel$export($ba3ca37806a2b6fa$exports, \"frob\", () => $ba3ca37806a2b6fa$export$326827e8268e9cdb);\n$parcel$export($ba3ca37806a2b6fa$exports, \"add\", () => $ba3ca37806a2b6fa$export$e16d8520af44a096);\n$parcel$export($ba3ca37806a2b6fa$exports, \"subtract\", () => $ba3ca37806a2b6fa$export$4e2d2ead65e5f7e3);\n$parcel$export($ba3ca37806a2b6fa$exports, \"multiplyScalar\", () => $ba3ca37806a2b6fa$export$c697bed75648cdb7);\n$parcel$export($ba3ca37806a2b6fa$exports, \"multiplyScalarAndAdd\", () => $ba3ca37806a2b6fa$export$553579f63bdd7137);\n$parcel$export($ba3ca37806a2b6fa$exports, \"exactEquals\", () => $ba3ca37806a2b6fa$export$f2599a5cf1109d8);\n$parcel$export($ba3ca37806a2b6fa$exports, \"equals\", () => $ba3ca37806a2b6fa$export$e9bab7fafb253603);\n$parcel$export($ba3ca37806a2b6fa$exports, \"mul\", () => $ba3ca37806a2b6fa$export$6e3a27864ab166fe);\n$parcel$export($ba3ca37806a2b6fa$exports, \"sub\", () => $ba3ca37806a2b6fa$export$f93b5905241a7cca);\n\nfunction $ba3ca37806a2b6fa$export$185802fd694ee1f5() {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(9);\n    if ($14f38b7dd89457d7$export$b67359430d3b1b2 != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[5] = 0;\n        out[6] = 0;\n        out[7] = 0;\n    }\n    out[0] = 1;\n    out[4] = 1;\n    out[8] = 1;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$b4ad467060d346fe(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[4];\n    out[4] = a[5];\n    out[5] = a[6];\n    out[6] = a[8];\n    out[7] = a[9];\n    out[8] = a[10];\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$9cd59f9826255e47(a) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(9);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$784d13d8ee351f07(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$a82be99ed2a44a7d(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$adaa4cf7ef1b65be(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$f0954fd7d5368655(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$9cb09a71b7d66923(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a12 = a[5];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a01;\n        out[5] = a[7];\n        out[6] = a02;\n        out[7] = a12;\n    } else {\n        out[0] = a[0];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a[1];\n        out[4] = a[4];\n        out[5] = a[7];\n        out[6] = a[2];\n        out[7] = a[5];\n        out[8] = a[8];\n    }\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$6897c284b6f9f4dc(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    var b01 = a22 * a11 - a12 * a21;\n    var b11 = -a22 * a10 + a12 * a20;\n    var b21 = a21 * a10 - a11 * a20;\n    // Calculate the determinant\n    var det = a00 * b01 + a01 * b11 + a02 * b21;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = b01 * det;\n    out[1] = (-a22 * a01 + a02 * a21) * det;\n    out[2] = (a12 * a01 - a02 * a11) * det;\n    out[3] = b11 * det;\n    out[4] = (a22 * a00 - a02 * a20) * det;\n    out[5] = (-a12 * a00 + a02 * a10) * det;\n    out[6] = b21 * det;\n    out[7] = (-a21 * a00 + a01 * a20) * det;\n    out[8] = (a11 * a00 - a01 * a10) * det;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$33f3c024b4ae00a1(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    out[0] = a11 * a22 - a12 * a21;\n    out[1] = a02 * a21 - a01 * a22;\n    out[2] = a01 * a12 - a02 * a11;\n    out[3] = a12 * a20 - a10 * a22;\n    out[4] = a00 * a22 - a02 * a20;\n    out[5] = a02 * a10 - a00 * a12;\n    out[6] = a10 * a21 - a11 * a20;\n    out[7] = a01 * a20 - a00 * a21;\n    out[8] = a00 * a11 - a01 * a10;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$a04698f914c55ed9(a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\nfunction $ba3ca37806a2b6fa$export$2060d2db72cce88f(out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    var b00 = b[0], b01 = b[1], b02 = b[2];\n    var b10 = b[3], b11 = b[4], b12 = b[5];\n    var b20 = b[6], b21 = b[7], b22 = b[8];\n    out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n    out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n    out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n    out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n    out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n    out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n    out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n    out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n    out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$d73ee8ef04f5226a(out, a, v) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], x = v[0], y = v[1];\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n    out[3] = a10;\n    out[4] = a11;\n    out[5] = a12;\n    out[6] = x * a00 + y * a10 + a20;\n    out[7] = x * a01 + y * a11 + a21;\n    out[8] = x * a02 + y * a12 + a22;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$bb628a54ab399bc9(out, a, rad) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c * a00 + s * a10;\n    out[1] = c * a01 + s * a11;\n    out[2] = c * a02 + s * a12;\n    out[3] = c * a10 - s * a00;\n    out[4] = c * a11 - s * a01;\n    out[5] = c * a12 - s * a02;\n    out[6] = a20;\n    out[7] = a21;\n    out[8] = a22;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$dcdf75081b88279d(out, a, v) {\n    var x = v[0], y = v[1];\n    out[0] = x * a[0];\n    out[1] = x * a[1];\n    out[2] = x * a[2];\n    out[3] = y * a[3];\n    out[4] = y * a[4];\n    out[5] = y * a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$bc9e79e74e9fddf6(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = v[0];\n    out[7] = v[1];\n    out[8] = 1;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$926fc125ff3c666c(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n    out[3] = -s;\n    out[4] = c;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$832ca188ffb1955d(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = v[1];\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$68f5977575fae9bf(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = 0;\n    out[3] = a[2];\n    out[4] = a[3];\n    out[5] = 0;\n    out[6] = a[4];\n    out[7] = a[5];\n    out[8] = 1;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$2ff2bbe382249af7(out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var yx = y * x2;\n    var yy = y * y2;\n    var zx = z * x2;\n    var zy = z * y2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$966b25ab6dc1b1f9(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32;\n    // Calculate the determinant\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$b74061472fe7c07(out, width, height) {\n    out[0] = 2 / width;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = -2 / height;\n    out[5] = 0;\n    out[6] = -1;\n    out[7] = 1;\n    out[8] = 1;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$42d51816ce590c93(a) {\n    return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\nfunction $ba3ca37806a2b6fa$export$326827e8268e9cdb(a) {\n    return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3] + a[4] * a[4] + a[5] * a[5] + a[6] * a[6] + a[7] * a[7] + a[8] * a[8]);\n}\nfunction $ba3ca37806a2b6fa$export$e16d8520af44a096(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$4e2d2ead65e5f7e3(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$c697bed75648cdb7(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$553579f63bdd7137(out, a, b, scale) {\n    out[0] = a[0] + b[0] * scale;\n    out[1] = a[1] + b[1] * scale;\n    out[2] = a[2] + b[2] * scale;\n    out[3] = a[3] + b[3] * scale;\n    out[4] = a[4] + b[4] * scale;\n    out[5] = a[5] + b[5] * scale;\n    out[6] = a[6] + b[6] * scale;\n    out[7] = a[7] + b[7] * scale;\n    out[8] = a[8] + b[8] * scale;\n    return out;\n}\nfunction $ba3ca37806a2b6fa$export$f2599a5cf1109d8(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\nfunction $ba3ca37806a2b6fa$export$e9bab7fafb253603(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8];\n    return Math.abs(a0 - b0) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\nvar $ba3ca37806a2b6fa$export$6e3a27864ab166fe = $ba3ca37806a2b6fa$export$2060d2db72cce88f;\nvar $ba3ca37806a2b6fa$export$f93b5905241a7cca = $ba3ca37806a2b6fa$export$4e2d2ead65e5f7e3;\n\n\nvar $31054a6c69637582$exports = {};\n\n$parcel$export($31054a6c69637582$exports, \"create\", () => $31054a6c69637582$export$185802fd694ee1f5);\n$parcel$export($31054a6c69637582$exports, \"clone\", () => $31054a6c69637582$export$9cd59f9826255e47);\n$parcel$export($31054a6c69637582$exports, \"length\", () => $31054a6c69637582$export$f24224f1c91d8156);\n$parcel$export($31054a6c69637582$exports, \"fromValues\", () => $31054a6c69637582$export$a82be99ed2a44a7d);\n$parcel$export($31054a6c69637582$exports, \"copy\", () => $31054a6c69637582$export$784d13d8ee351f07);\n$parcel$export($31054a6c69637582$exports, \"set\", () => $31054a6c69637582$export$adaa4cf7ef1b65be);\n$parcel$export($31054a6c69637582$exports, \"add\", () => $31054a6c69637582$export$e16d8520af44a096);\n$parcel$export($31054a6c69637582$exports, \"subtract\", () => $31054a6c69637582$export$4e2d2ead65e5f7e3);\n$parcel$export($31054a6c69637582$exports, \"multiply\", () => $31054a6c69637582$export$2060d2db72cce88f);\n$parcel$export($31054a6c69637582$exports, \"divide\", () => $31054a6c69637582$export$cd007d971a5a2143);\n$parcel$export($31054a6c69637582$exports, \"ceil\", () => $31054a6c69637582$export$803ce6b71a0a94b2);\n$parcel$export($31054a6c69637582$exports, \"floor\", () => $31054a6c69637582$export$a3fe094919f356fd);\n$parcel$export($31054a6c69637582$exports, \"min\", () => $31054a6c69637582$export$96ec731ed4dcb222);\n$parcel$export($31054a6c69637582$exports, \"max\", () => $31054a6c69637582$export$8960430cfd85939f);\n$parcel$export($31054a6c69637582$exports, \"round\", () => $31054a6c69637582$export$2077e0241d6afd3c);\n$parcel$export($31054a6c69637582$exports, \"scale\", () => $31054a6c69637582$export$dcdf75081b88279d);\n$parcel$export($31054a6c69637582$exports, \"scaleAndAdd\", () => $31054a6c69637582$export$19cedf1da84ba854);\n$parcel$export($31054a6c69637582$exports, \"distance\", () => $31054a6c69637582$export$9f17032d917177de);\n$parcel$export($31054a6c69637582$exports, \"squaredDistance\", () => $31054a6c69637582$export$88e6ebb4fe54f538);\n$parcel$export($31054a6c69637582$exports, \"squaredLength\", () => $31054a6c69637582$export$ab44e1323ffc8376);\n$parcel$export($31054a6c69637582$exports, \"negate\", () => $31054a6c69637582$export$aef51622e549b8b0);\n$parcel$export($31054a6c69637582$exports, \"inverse\", () => $31054a6c69637582$export$70ae2c07e401031b);\n$parcel$export($31054a6c69637582$exports, \"normalize\", () => $31054a6c69637582$export$a3295358bff77e);\n$parcel$export($31054a6c69637582$exports, \"dot\", () => $31054a6c69637582$export$94132a0e348806d4);\n$parcel$export($31054a6c69637582$exports, \"cross\", () => $31054a6c69637582$export$bb646b20bb93d339);\n$parcel$export($31054a6c69637582$exports, \"lerp\", () => $31054a6c69637582$export$3a89f8d6f6bf6c9f);\n$parcel$export($31054a6c69637582$exports, \"slerp\", () => $31054a6c69637582$export$1544d9bc2995de08);\n$parcel$export($31054a6c69637582$exports, \"hermite\", () => $31054a6c69637582$export$ae8865616f30561c);\n$parcel$export($31054a6c69637582$exports, \"bezier\", () => $31054a6c69637582$export$b9c5f84610baddaf);\n$parcel$export($31054a6c69637582$exports, \"random\", () => $31054a6c69637582$export$4385e60b38654f68);\n$parcel$export($31054a6c69637582$exports, \"transformMat4\", () => $31054a6c69637582$export$5ffbd13800309d59);\n$parcel$export($31054a6c69637582$exports, \"transformMat3\", () => $31054a6c69637582$export$f0bfa0a0024626ee);\n$parcel$export($31054a6c69637582$exports, \"transformQuat\", () => $31054a6c69637582$export$c32adef9e939ce85);\n$parcel$export($31054a6c69637582$exports, \"rotateX\", () => $31054a6c69637582$export$a59c8716592e09af);\n$parcel$export($31054a6c69637582$exports, \"rotateY\", () => $31054a6c69637582$export$cf71e4d4ca4d1cfd);\n$parcel$export($31054a6c69637582$exports, \"rotateZ\", () => $31054a6c69637582$export$ea6eae3365de5b9c);\n$parcel$export($31054a6c69637582$exports, \"angle\", () => $31054a6c69637582$export$944b09d2ad10b378);\n$parcel$export($31054a6c69637582$exports, \"zero\", () => $31054a6c69637582$export$7f9972325ebfd559);\n$parcel$export($31054a6c69637582$exports, \"str\", () => $31054a6c69637582$export$42d51816ce590c93);\n$parcel$export($31054a6c69637582$exports, \"exactEquals\", () => $31054a6c69637582$export$f2599a5cf1109d8);\n$parcel$export($31054a6c69637582$exports, \"equals\", () => $31054a6c69637582$export$e9bab7fafb253603);\n$parcel$export($31054a6c69637582$exports, \"sub\", () => $31054a6c69637582$export$f93b5905241a7cca);\n$parcel$export($31054a6c69637582$exports, \"mul\", () => $31054a6c69637582$export$6e3a27864ab166fe);\n$parcel$export($31054a6c69637582$exports, \"div\", () => $31054a6c69637582$export$159d9494db57879b);\n$parcel$export($31054a6c69637582$exports, \"dist\", () => $31054a6c69637582$export$6c4a311cc157c764);\n$parcel$export($31054a6c69637582$exports, \"sqrDist\", () => $31054a6c69637582$export$2422cd6c492a8b3a);\n$parcel$export($31054a6c69637582$exports, \"len\", () => $31054a6c69637582$export$fc1400facf92c78);\n$parcel$export($31054a6c69637582$exports, \"sqrLen\", () => $31054a6c69637582$export$99d8dd3f32a3435);\n$parcel$export($31054a6c69637582$exports, \"forEach\", () => $31054a6c69637582$export$4b80e395e36b5a56);\n\nfunction $31054a6c69637582$export$185802fd694ee1f5() {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(3);\n    if ($14f38b7dd89457d7$export$b67359430d3b1b2 != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n    }\n    return out;\n}\nfunction $31054a6c69637582$export$9cd59f9826255e47(a) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(3);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n}\nfunction $31054a6c69637582$export$f24224f1c91d8156(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    return Math.sqrt(x * x + y * y + z * z);\n}\nfunction $31054a6c69637582$export$a82be99ed2a44a7d(x, y, z) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(3);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n}\nfunction $31054a6c69637582$export$784d13d8ee351f07(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n}\nfunction $31054a6c69637582$export$adaa4cf7ef1b65be(out, x, y, z) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n}\nfunction $31054a6c69637582$export$e16d8520af44a096(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    return out;\n}\nfunction $31054a6c69637582$export$4e2d2ead65e5f7e3(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    return out;\n}\nfunction $31054a6c69637582$export$2060d2db72cce88f(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    return out;\n}\nfunction $31054a6c69637582$export$cd007d971a5a2143(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    return out;\n}\nfunction $31054a6c69637582$export$803ce6b71a0a94b2(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    return out;\n}\nfunction $31054a6c69637582$export$a3fe094919f356fd(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    return out;\n}\nfunction $31054a6c69637582$export$96ec731ed4dcb222(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    return out;\n}\nfunction $31054a6c69637582$export$8960430cfd85939f(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    return out;\n}\nfunction $31054a6c69637582$export$2077e0241d6afd3c(out, a) {\n    out[0] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[0]);\n    out[1] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[1]);\n    out[2] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[2]);\n    return out;\n}\nfunction $31054a6c69637582$export$dcdf75081b88279d(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    return out;\n}\nfunction $31054a6c69637582$export$19cedf1da84ba854(out, a, b, scale) {\n    out[0] = a[0] + b[0] * scale;\n    out[1] = a[1] + b[1] * scale;\n    out[2] = a[2] + b[2] * scale;\n    return out;\n}\nfunction $31054a6c69637582$export$9f17032d917177de(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    return Math.sqrt(x * x + y * y + z * z);\n}\nfunction $31054a6c69637582$export$88e6ebb4fe54f538(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    return x * x + y * y + z * z;\n}\nfunction $31054a6c69637582$export$ab44e1323ffc8376(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    return x * x + y * y + z * z;\n}\nfunction $31054a6c69637582$export$aef51622e549b8b0(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    return out;\n}\nfunction $31054a6c69637582$export$70ae2c07e401031b(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    out[2] = 1.0 / a[2];\n    return out;\n}\nfunction $31054a6c69637582$export$a3295358bff77e(out, a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var len = x * x + y * y + z * z;\n    if (len > 0) //TODO: evaluate use of glm_invsqrt here?\n    len = 1 / Math.sqrt(len);\n    out[0] = a[0] * len;\n    out[1] = a[1] * len;\n    out[2] = a[2] * len;\n    return out;\n}\nfunction $31054a6c69637582$export$94132a0e348806d4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\nfunction $31054a6c69637582$export$bb646b20bb93d339(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2];\n    var bx = b[0], by = b[1], bz = b[2];\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n}\nfunction $31054a6c69637582$export$3a89f8d6f6bf6c9f(out, a, b, t) {\n    var ax = a[0];\n    var ay = a[1];\n    var az = a[2];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    return out;\n}\nfunction $31054a6c69637582$export$1544d9bc2995de08(out, a, b, t) {\n    var angle = Math.acos(Math.min(Math.max($31054a6c69637582$export$94132a0e348806d4(a, b), -1), 1));\n    var sinTotal = Math.sin(angle);\n    var ratioA = Math.sin((1 - t) * angle) / sinTotal;\n    var ratioB = Math.sin(t * angle) / sinTotal;\n    out[0] = ratioA * a[0] + ratioB * b[0];\n    out[1] = ratioA * a[1] + ratioB * b[1];\n    out[2] = ratioA * a[2] + ratioB * b[2];\n    return out;\n}\nfunction $31054a6c69637582$export$ae8865616f30561c(out, a, b, c, d, t) {\n    var factorTimes2 = t * t;\n    var factor1 = factorTimes2 * (2 * t - 3) + 1;\n    var factor2 = factorTimes2 * (t - 2) + t;\n    var factor3 = factorTimes2 * (t - 1);\n    var factor4 = factorTimes2 * (3 - 2 * t);\n    out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n    out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n    out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n    return out;\n}\nfunction $31054a6c69637582$export$b9c5f84610baddaf(out, a, b, c, d, t) {\n    var inverseFactor = 1 - t;\n    var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n    var factorTimes2 = t * t;\n    var factor1 = inverseFactorTimesTwo * inverseFactor;\n    var factor2 = 3 * t * inverseFactorTimesTwo;\n    var factor3 = 3 * factorTimes2 * inverseFactor;\n    var factor4 = factorTimes2 * t;\n    out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n    out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n    out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n    return out;\n}\nfunction $31054a6c69637582$export$4385e60b38654f68(out, scale) {\n    scale = scale === undefined ? 1.0 : scale;\n    var r = $14f38b7dd89457d7$export$5ada478c8a628231() * 2.0 * Math.PI;\n    var z = $14f38b7dd89457d7$export$5ada478c8a628231() * 2.0 - 1.0;\n    var zScale = Math.sqrt(1.0 - z * z) * scale;\n    out[0] = Math.cos(r) * zScale;\n    out[1] = Math.sin(r) * zScale;\n    out[2] = z * scale;\n    return out;\n}\nfunction $31054a6c69637582$export$5ffbd13800309d59(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n    return out;\n}\nfunction $31054a6c69637582$export$f0bfa0a0024626ee(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x * m[0] + y * m[3] + z * m[6];\n    out[1] = x * m[1] + y * m[4] + z * m[7];\n    out[2] = x * m[2] + y * m[5] + z * m[8];\n    return out;\n}\nfunction $31054a6c69637582$export$c32adef9e939ce85(out, a, q) {\n    // Fast Vector Rotation using Quaternions by Robert Eisele\n    // https://raw.org/proof/vector-rotation-using-quaternions/\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3];\n    var vx = a[0], vy = a[1], vz = a[2];\n    // t = q x v\n    var tx = qy * vz - qz * vy;\n    var ty = qz * vx - qx * vz;\n    var tz = qx * vy - qy * vx;\n    // t = 2t\n    tx = tx + tx;\n    ty = ty + ty;\n    tz = tz + tz;\n    // v + w t + q x t\n    out[0] = vx + qw * tx + qy * tz - qz * ty;\n    out[1] = vy + qw * ty + qz * tx - qx * tz;\n    out[2] = vz + qw * tz + qx * ty - qy * tx;\n    return out;\n}\nfunction $31054a6c69637582$export$a59c8716592e09af(out, a, b, rad) {\n    var p = [], r = [];\n    //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2];\n    //perform rotation\n    r[0] = p[0];\n    r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n    r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);\n    //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction $31054a6c69637582$export$cf71e4d4ca4d1cfd(out, a, b, rad) {\n    var p = [], r = [];\n    //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2];\n    //perform rotation\n    r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n    r[1] = p[1];\n    r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);\n    //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction $31054a6c69637582$export$ea6eae3365de5b9c(out, a, b, rad) {\n    var p = [], r = [];\n    //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2];\n    //perform rotation\n    r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n    r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n    r[2] = p[2];\n    //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction $31054a6c69637582$export$944b09d2ad10b378(a, b) {\n    var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2], mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)), cosine = mag && $31054a6c69637582$export$94132a0e348806d4(a, b) / mag;\n    return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\nfunction $31054a6c69637582$export$7f9972325ebfd559(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    return out;\n}\nfunction $31054a6c69637582$export$42d51816ce590c93(a) {\n    return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\nfunction $31054a6c69637582$export$f2599a5cf1109d8(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\nfunction $31054a6c69637582$export$e9bab7fafb253603(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2];\n    var b0 = b[0], b1 = b[1], b2 = b[2];\n    return Math.abs(a0 - b0) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\nvar $31054a6c69637582$export$f93b5905241a7cca = $31054a6c69637582$export$4e2d2ead65e5f7e3;\nvar $31054a6c69637582$export$6e3a27864ab166fe = $31054a6c69637582$export$2060d2db72cce88f;\nvar $31054a6c69637582$export$159d9494db57879b = $31054a6c69637582$export$cd007d971a5a2143;\nvar $31054a6c69637582$export$6c4a311cc157c764 = $31054a6c69637582$export$9f17032d917177de;\nvar $31054a6c69637582$export$2422cd6c492a8b3a = $31054a6c69637582$export$88e6ebb4fe54f538;\nvar $31054a6c69637582$export$fc1400facf92c78 = $31054a6c69637582$export$f24224f1c91d8156;\nvar $31054a6c69637582$export$99d8dd3f32a3435 = $31054a6c69637582$export$ab44e1323ffc8376;\nvar $31054a6c69637582$export$4b80e395e36b5a56 = function() {\n    var vec = $31054a6c69637582$export$185802fd694ee1f5();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 3;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            vec[2] = a[i + 2];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n            a[i + 2] = vec[2];\n        }\n        return a;\n    };\n}();\n\n\nvar $4c4ac78b213a9c07$exports = {};\n\n$parcel$export($4c4ac78b213a9c07$exports, \"create\", () => $4c4ac78b213a9c07$export$185802fd694ee1f5);\n$parcel$export($4c4ac78b213a9c07$exports, \"clone\", () => $4c4ac78b213a9c07$export$9cd59f9826255e47);\n$parcel$export($4c4ac78b213a9c07$exports, \"fromValues\", () => $4c4ac78b213a9c07$export$a82be99ed2a44a7d);\n$parcel$export($4c4ac78b213a9c07$exports, \"copy\", () => $4c4ac78b213a9c07$export$784d13d8ee351f07);\n$parcel$export($4c4ac78b213a9c07$exports, \"set\", () => $4c4ac78b213a9c07$export$adaa4cf7ef1b65be);\n$parcel$export($4c4ac78b213a9c07$exports, \"add\", () => $4c4ac78b213a9c07$export$e16d8520af44a096);\n$parcel$export($4c4ac78b213a9c07$exports, \"subtract\", () => $4c4ac78b213a9c07$export$4e2d2ead65e5f7e3);\n$parcel$export($4c4ac78b213a9c07$exports, \"multiply\", () => $4c4ac78b213a9c07$export$2060d2db72cce88f);\n$parcel$export($4c4ac78b213a9c07$exports, \"divide\", () => $4c4ac78b213a9c07$export$cd007d971a5a2143);\n$parcel$export($4c4ac78b213a9c07$exports, \"ceil\", () => $4c4ac78b213a9c07$export$803ce6b71a0a94b2);\n$parcel$export($4c4ac78b213a9c07$exports, \"floor\", () => $4c4ac78b213a9c07$export$a3fe094919f356fd);\n$parcel$export($4c4ac78b213a9c07$exports, \"min\", () => $4c4ac78b213a9c07$export$96ec731ed4dcb222);\n$parcel$export($4c4ac78b213a9c07$exports, \"max\", () => $4c4ac78b213a9c07$export$8960430cfd85939f);\n$parcel$export($4c4ac78b213a9c07$exports, \"round\", () => $4c4ac78b213a9c07$export$2077e0241d6afd3c);\n$parcel$export($4c4ac78b213a9c07$exports, \"scale\", () => $4c4ac78b213a9c07$export$dcdf75081b88279d);\n$parcel$export($4c4ac78b213a9c07$exports, \"scaleAndAdd\", () => $4c4ac78b213a9c07$export$19cedf1da84ba854);\n$parcel$export($4c4ac78b213a9c07$exports, \"distance\", () => $4c4ac78b213a9c07$export$9f17032d917177de);\n$parcel$export($4c4ac78b213a9c07$exports, \"squaredDistance\", () => $4c4ac78b213a9c07$export$88e6ebb4fe54f538);\n$parcel$export($4c4ac78b213a9c07$exports, \"length\", () => $4c4ac78b213a9c07$export$f24224f1c91d8156);\n$parcel$export($4c4ac78b213a9c07$exports, \"squaredLength\", () => $4c4ac78b213a9c07$export$ab44e1323ffc8376);\n$parcel$export($4c4ac78b213a9c07$exports, \"negate\", () => $4c4ac78b213a9c07$export$aef51622e549b8b0);\n$parcel$export($4c4ac78b213a9c07$exports, \"inverse\", () => $4c4ac78b213a9c07$export$70ae2c07e401031b);\n$parcel$export($4c4ac78b213a9c07$exports, \"normalize\", () => $4c4ac78b213a9c07$export$a3295358bff77e);\n$parcel$export($4c4ac78b213a9c07$exports, \"dot\", () => $4c4ac78b213a9c07$export$94132a0e348806d4);\n$parcel$export($4c4ac78b213a9c07$exports, \"cross\", () => $4c4ac78b213a9c07$export$bb646b20bb93d339);\n$parcel$export($4c4ac78b213a9c07$exports, \"lerp\", () => $4c4ac78b213a9c07$export$3a89f8d6f6bf6c9f);\n$parcel$export($4c4ac78b213a9c07$exports, \"random\", () => $4c4ac78b213a9c07$export$4385e60b38654f68);\n$parcel$export($4c4ac78b213a9c07$exports, \"transformMat4\", () => $4c4ac78b213a9c07$export$5ffbd13800309d59);\n$parcel$export($4c4ac78b213a9c07$exports, \"transformQuat\", () => $4c4ac78b213a9c07$export$c32adef9e939ce85);\n$parcel$export($4c4ac78b213a9c07$exports, \"zero\", () => $4c4ac78b213a9c07$export$7f9972325ebfd559);\n$parcel$export($4c4ac78b213a9c07$exports, \"str\", () => $4c4ac78b213a9c07$export$42d51816ce590c93);\n$parcel$export($4c4ac78b213a9c07$exports, \"exactEquals\", () => $4c4ac78b213a9c07$export$f2599a5cf1109d8);\n$parcel$export($4c4ac78b213a9c07$exports, \"equals\", () => $4c4ac78b213a9c07$export$e9bab7fafb253603);\n$parcel$export($4c4ac78b213a9c07$exports, \"sub\", () => $4c4ac78b213a9c07$export$f93b5905241a7cca);\n$parcel$export($4c4ac78b213a9c07$exports, \"mul\", () => $4c4ac78b213a9c07$export$6e3a27864ab166fe);\n$parcel$export($4c4ac78b213a9c07$exports, \"div\", () => $4c4ac78b213a9c07$export$159d9494db57879b);\n$parcel$export($4c4ac78b213a9c07$exports, \"dist\", () => $4c4ac78b213a9c07$export$6c4a311cc157c764);\n$parcel$export($4c4ac78b213a9c07$exports, \"sqrDist\", () => $4c4ac78b213a9c07$export$2422cd6c492a8b3a);\n$parcel$export($4c4ac78b213a9c07$exports, \"len\", () => $4c4ac78b213a9c07$export$fc1400facf92c78);\n$parcel$export($4c4ac78b213a9c07$exports, \"sqrLen\", () => $4c4ac78b213a9c07$export$99d8dd3f32a3435);\n$parcel$export($4c4ac78b213a9c07$exports, \"forEach\", () => $4c4ac78b213a9c07$export$4b80e395e36b5a56);\n\nfunction $4c4ac78b213a9c07$export$185802fd694ee1f5() {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(4);\n    if ($14f38b7dd89457d7$export$b67359430d3b1b2 != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n    }\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$9cd59f9826255e47(a) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$a82be99ed2a44a7d(x, y, z, w) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(4);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$784d13d8ee351f07(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$adaa4cf7ef1b65be(out, x, y, z, w) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$e16d8520af44a096(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$4e2d2ead65e5f7e3(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$2060d2db72cce88f(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    out[3] = a[3] * b[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$cd007d971a5a2143(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    out[3] = a[3] / b[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$803ce6b71a0a94b2(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    out[3] = Math.ceil(a[3]);\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$a3fe094919f356fd(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    out[3] = Math.floor(a[3]);\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$96ec731ed4dcb222(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    out[3] = Math.min(a[3], b[3]);\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$8960430cfd85939f(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    out[3] = Math.max(a[3], b[3]);\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$2077e0241d6afd3c(out, a) {\n    out[0] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[0]);\n    out[1] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[1]);\n    out[2] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[2]);\n    out[3] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[3]);\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$dcdf75081b88279d(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$19cedf1da84ba854(out, a, b, scale) {\n    out[0] = a[0] + b[0] * scale;\n    out[1] = a[1] + b[1] * scale;\n    out[2] = a[2] + b[2] * scale;\n    out[3] = a[3] + b[3] * scale;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$9f17032d917177de(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    var w = b[3] - a[3];\n    return Math.sqrt(x * x + y * y + z * z + w * w);\n}\nfunction $4c4ac78b213a9c07$export$88e6ebb4fe54f538(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    var w = b[3] - a[3];\n    return x * x + y * y + z * z + w * w;\n}\nfunction $4c4ac78b213a9c07$export$f24224f1c91d8156(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    return Math.sqrt(x * x + y * y + z * z + w * w);\n}\nfunction $4c4ac78b213a9c07$export$ab44e1323ffc8376(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    return x * x + y * y + z * z + w * w;\n}\nfunction $4c4ac78b213a9c07$export$aef51622e549b8b0(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = -a[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$70ae2c07e401031b(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    out[2] = 1.0 / a[2];\n    out[3] = 1.0 / a[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$a3295358bff77e(out, a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    var len = x * x + y * y + z * z + w * w;\n    if (len > 0) len = 1 / Math.sqrt(len);\n    out[0] = x * len;\n    out[1] = y * len;\n    out[2] = z * len;\n    out[3] = w * len;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$94132a0e348806d4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\nfunction $4c4ac78b213a9c07$export$bb646b20bb93d339(out, u, v, w) {\n    var A = v[0] * w[1] - v[1] * w[0], B = v[0] * w[2] - v[2] * w[0], C = v[0] * w[3] - v[3] * w[0], D = v[1] * w[2] - v[2] * w[1], E = v[1] * w[3] - v[3] * w[1], F = v[2] * w[3] - v[3] * w[2];\n    var G = u[0];\n    var H = u[1];\n    var I = u[2];\n    var J = u[3];\n    out[0] = H * F - I * E + J * D;\n    out[1] = -(G * F) + I * C - J * B;\n    out[2] = G * E - H * C + J * A;\n    out[3] = -(G * D) + H * B - I * A;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$3a89f8d6f6bf6c9f(out, a, b, t) {\n    var ax = a[0];\n    var ay = a[1];\n    var az = a[2];\n    var aw = a[3];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    out[3] = aw + t * (b[3] - aw);\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$4385e60b38654f68(out, scale) {\n    scale = scale === undefined ? 1.0 : scale;\n    // Marsaglia, George. Choosing a Point from the Surface of a\n    // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n    // http://projecteuclid.org/euclid.aoms/1177692644;\n    var v1, v2, v3, v4;\n    var s1, s2;\n    var rand;\n    rand = $14f38b7dd89457d7$export$5ada478c8a628231();\n    v1 = rand * 2 - 1;\n    v2 = (4 * $14f38b7dd89457d7$export$5ada478c8a628231() - 2) * Math.sqrt(rand * -rand + rand);\n    s1 = v1 * v1 + v2 * v2;\n    rand = $14f38b7dd89457d7$export$5ada478c8a628231();\n    v3 = rand * 2 - 1;\n    v4 = (4 * $14f38b7dd89457d7$export$5ada478c8a628231() - 2) * Math.sqrt(rand * -rand + rand);\n    s2 = v3 * v3 + v4 * v4;\n    var d = Math.sqrt((1 - s1) / s2);\n    out[0] = scale * v1;\n    out[1] = scale * v2;\n    out[2] = scale * v3 * d;\n    out[3] = scale * v4 * d;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$5ffbd13800309d59(out, a, m) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n    out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n    out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n    out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$c32adef9e939ce85(out, a, q) {\n    // Fast Vector Rotation using Quaternions by Robert Eisele\n    // https://raw.org/proof/vector-rotation-using-quaternions/\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3];\n    var vx = a[0], vy = a[1], vz = a[2];\n    // t = q x v\n    var tx = qy * vz - qz * vy;\n    var ty = qz * vx - qx * vz;\n    var tz = qx * vy - qy * vx;\n    // t = 2t\n    tx = tx + tx;\n    ty = ty + ty;\n    tz = tz + tz;\n    // v + w t + q x t\n    out[0] = vx + qw * tx + qy * tz - qz * ty;\n    out[1] = vy + qw * ty + qz * tx - qx * tz;\n    out[2] = vz + qw * tz + qx * ty - qy * tx;\n    out[3] = a[3];\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$7f9972325ebfd559(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    return out;\n}\nfunction $4c4ac78b213a9c07$export$42d51816ce590c93(a) {\n    return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\nfunction $4c4ac78b213a9c07$export$f2599a5cf1109d8(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\nfunction $4c4ac78b213a9c07$export$e9bab7fafb253603(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return Math.abs(a0 - b0) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\nvar $4c4ac78b213a9c07$export$f93b5905241a7cca = $4c4ac78b213a9c07$export$4e2d2ead65e5f7e3;\nvar $4c4ac78b213a9c07$export$6e3a27864ab166fe = $4c4ac78b213a9c07$export$2060d2db72cce88f;\nvar $4c4ac78b213a9c07$export$159d9494db57879b = $4c4ac78b213a9c07$export$cd007d971a5a2143;\nvar $4c4ac78b213a9c07$export$6c4a311cc157c764 = $4c4ac78b213a9c07$export$9f17032d917177de;\nvar $4c4ac78b213a9c07$export$2422cd6c492a8b3a = $4c4ac78b213a9c07$export$88e6ebb4fe54f538;\nvar $4c4ac78b213a9c07$export$fc1400facf92c78 = $4c4ac78b213a9c07$export$f24224f1c91d8156;\nvar $4c4ac78b213a9c07$export$99d8dd3f32a3435 = $4c4ac78b213a9c07$export$ab44e1323ffc8376;\nvar $4c4ac78b213a9c07$export$4b80e395e36b5a56 = function() {\n    var vec = $4c4ac78b213a9c07$export$185802fd694ee1f5();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 4;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            vec[2] = a[i + 2];\n            vec[3] = a[i + 3];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n            a[i + 2] = vec[2];\n            a[i + 3] = vec[3];\n        }\n        return a;\n    };\n}();\n\n\nfunction $39ece26d1239bb77$export$185802fd694ee1f5() {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(4);\n    if ($14f38b7dd89457d7$export$b67359430d3b1b2 != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n    }\n    out[3] = 1;\n    return out;\n}\nfunction $39ece26d1239bb77$export$f0954fd7d5368655(out) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n}\nfunction $39ece26d1239bb77$export$4286ddefc8f49512(out, axis, rad) {\n    rad = rad * 0.5;\n    var s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n}\nfunction $39ece26d1239bb77$export$3f70be5e7d7dc51(out_axis, q) {\n    var rad = Math.acos(q[3]) * 2.0;\n    var s = Math.sin(rad / 2.0);\n    if (s > $14f38b7dd89457d7$export$fd293b15f47e270) {\n        out_axis[0] = q[0] / s;\n        out_axis[1] = q[1] / s;\n        out_axis[2] = q[2] / s;\n    } else {\n        // If s is zero, return any axis (no rotation - axis does not matter)\n        out_axis[0] = 1;\n        out_axis[1] = 0;\n        out_axis[2] = 0;\n    }\n    return rad;\n}\nfunction $39ece26d1239bb77$export$b363da9ded343252(a, b) {\n    var dotproduct = $39ece26d1239bb77$export$94132a0e348806d4(a, b);\n    return Math.acos(2 * dotproduct * dotproduct - 1);\n}\nfunction $39ece26d1239bb77$export$2060d2db72cce88f(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = b[0], by = b[1], bz = b[2], bw = b[3];\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n}\nfunction $39ece26d1239bb77$export$a59c8716592e09af(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n}\nfunction $39ece26d1239bb77$export$cf71e4d4ca4d1cfd(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var by = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n}\nfunction $39ece26d1239bb77$export$ea6eae3365de5b9c(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bz = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + ay * bz;\n    out[1] = ay * bw - ax * bz;\n    out[2] = az * bw + aw * bz;\n    out[3] = aw * bw - az * bz;\n    return out;\n}\nfunction $39ece26d1239bb77$export$fb72b72e8d764d4e(out, a) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n    return out;\n}\nfunction $39ece26d1239bb77$export$b310ec824aaee37f(out, a) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    var r = Math.sqrt(x * x + y * y + z * z);\n    var et = Math.exp(w);\n    var s = r > 0 ? et * Math.sin(r) / r : 0;\n    out[0] = x * s;\n    out[1] = y * s;\n    out[2] = z * s;\n    out[3] = et * Math.cos(r);\n    return out;\n}\nfunction $39ece26d1239bb77$export$876cb1b29620556f(out, a) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    var r = Math.sqrt(x * x + y * y + z * z);\n    var t = r > 0 ? Math.atan2(r, w) / r : 0;\n    out[0] = x * t;\n    out[1] = y * t;\n    out[2] = z * t;\n    out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n    return out;\n}\nfunction $39ece26d1239bb77$export$9c297f60e22e3389(out, a, b) {\n    $39ece26d1239bb77$export$876cb1b29620556f(out, a);\n    $39ece26d1239bb77$export$dcdf75081b88279d(out, out, b);\n    $39ece26d1239bb77$export$b310ec824aaee37f(out, out);\n    return out;\n}\nfunction $39ece26d1239bb77$export$1544d9bc2995de08(out, a, b, t) {\n    // benchmarks:\n    //    http://jsperf.com/quaternion-slerp-implementations\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = b[0], by = b[1], bz = b[2], bw = b[3];\n    var omega, cosom, sinom, scale0, scale1;\n    // calc cosine\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    // adjust signs (if necessary)\n    if (cosom < 0.0) {\n        cosom = -cosom;\n        bx = -bx;\n        by = -by;\n        bz = -bz;\n        bw = -bw;\n    }\n    // calculate coefficients\n    if (1.0 - cosom > $14f38b7dd89457d7$export$fd293b15f47e270) {\n        // standard case (slerp)\n        omega = Math.acos(cosom);\n        sinom = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n    } else {\n        // \"from\" and \"to\" quaternions are very close\n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n    }\n    // calculate final values\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    return out;\n}\nfunction $39ece26d1239bb77$export$4385e60b38654f68(out) {\n    // Implementation of http://planning.cs.uiuc.edu/node198.html\n    // TODO: Calling random 3 times is probably not the fastest solution\n    var u1 = $14f38b7dd89457d7$export$5ada478c8a628231();\n    var u2 = $14f38b7dd89457d7$export$5ada478c8a628231();\n    var u3 = $14f38b7dd89457d7$export$5ada478c8a628231();\n    var sqrt1MinusU1 = Math.sqrt(1 - u1);\n    var sqrtU1 = Math.sqrt(u1);\n    out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n    out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n    out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n    out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n    return out;\n}\nfunction $39ece26d1239bb77$export$6897c284b6f9f4dc(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n    var invDot = dot ? 1.0 / dot : 0;\n    // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n    out[0] = -a0 * invDot;\n    out[1] = -a1 * invDot;\n    out[2] = -a2 * invDot;\n    out[3] = a3 * invDot;\n    return out;\n}\nfunction $39ece26d1239bb77$export$7679f47e72c62560(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction $39ece26d1239bb77$export$272a1eb8e5a4b55b(out, m) {\n    // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n    // article \"Quaternion Calculus and Fast Animation\".\n    var fTrace = m[0] + m[4] + m[8];\n    var fRoot;\n    if (fTrace > 0.0) {\n        // |w| > 1/2, may as well choose w > 1/2\n        fRoot = Math.sqrt(fTrace + 1.0); // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot; // 1/(4w)\n        out[0] = (m[5] - m[7]) * fRoot;\n        out[1] = (m[6] - m[2]) * fRoot;\n        out[2] = (m[1] - m[3]) * fRoot;\n    } else {\n        // |w| <= 1/2\n        var i = 0;\n        if (m[4] > m[0]) i = 1;\n        if (m[8] > m[i * 3 + i]) i = 2;\n        var j = (i + 1) % 3;\n        var k = (i + 2) % 3;\n        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n    }\n    return out;\n}\nfunction $39ece26d1239bb77$export$7a404a587ea85af(out, x, y, z) {\n    var order = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : $14f38b7dd89457d7$export$217057687ee20298;\n    var halfToRad = Math.PI / 360;\n    x *= halfToRad;\n    z *= halfToRad;\n    y *= halfToRad;\n    var sx = Math.sin(x);\n    var cx = Math.cos(x);\n    var sy = Math.sin(y);\n    var cy = Math.cos(y);\n    var sz = Math.sin(z);\n    var cz = Math.cos(z);\n    switch(order){\n        case \"xyz\":\n            out[0] = sx * cy * cz + cx * sy * sz;\n            out[1] = cx * sy * cz - sx * cy * sz;\n            out[2] = cx * cy * sz + sx * sy * cz;\n            out[3] = cx * cy * cz - sx * sy * sz;\n            break;\n        case \"xzy\":\n            out[0] = sx * cy * cz - cx * sy * sz;\n            out[1] = cx * sy * cz - sx * cy * sz;\n            out[2] = cx * cy * sz + sx * sy * cz;\n            out[3] = cx * cy * cz + sx * sy * sz;\n            break;\n        case \"yxz\":\n            out[0] = sx * cy * cz + cx * sy * sz;\n            out[1] = cx * sy * cz - sx * cy * sz;\n            out[2] = cx * cy * sz - sx * sy * cz;\n            out[3] = cx * cy * cz + sx * sy * sz;\n            break;\n        case \"yzx\":\n            out[0] = sx * cy * cz + cx * sy * sz;\n            out[1] = cx * sy * cz + sx * cy * sz;\n            out[2] = cx * cy * sz - sx * sy * cz;\n            out[3] = cx * cy * cz - sx * sy * sz;\n            break;\n        case \"zxy\":\n            out[0] = sx * cy * cz - cx * sy * sz;\n            out[1] = cx * sy * cz + sx * cy * sz;\n            out[2] = cx * cy * sz + sx * sy * cz;\n            out[3] = cx * cy * cz - sx * sy * sz;\n            break;\n        case \"zyx\":\n            out[0] = sx * cy * cz - cx * sy * sz;\n            out[1] = cx * sy * cz + sx * cy * sz;\n            out[2] = cx * cy * sz - sx * sy * cz;\n            out[3] = cx * cy * cz + sx * sy * sz;\n            break;\n        default:\n            throw new Error('Unknown angle order ' + order);\n    }\n    return out;\n}\nfunction $39ece26d1239bb77$export$42d51816ce590c93(a) {\n    return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\nvar $39ece26d1239bb77$export$9cd59f9826255e47 = $4c4ac78b213a9c07$export$9cd59f9826255e47;\nvar $39ece26d1239bb77$export$a82be99ed2a44a7d = $4c4ac78b213a9c07$export$a82be99ed2a44a7d;\nvar $39ece26d1239bb77$export$784d13d8ee351f07 = $4c4ac78b213a9c07$export$784d13d8ee351f07;\nvar $39ece26d1239bb77$export$adaa4cf7ef1b65be = $4c4ac78b213a9c07$export$adaa4cf7ef1b65be;\nvar $39ece26d1239bb77$export$e16d8520af44a096 = $4c4ac78b213a9c07$export$e16d8520af44a096;\nvar $39ece26d1239bb77$export$6e3a27864ab166fe = $39ece26d1239bb77$export$2060d2db72cce88f;\nvar $39ece26d1239bb77$export$dcdf75081b88279d = $4c4ac78b213a9c07$export$dcdf75081b88279d;\nvar $39ece26d1239bb77$export$94132a0e348806d4 = $4c4ac78b213a9c07$export$94132a0e348806d4;\nvar $39ece26d1239bb77$export$3a89f8d6f6bf6c9f = $4c4ac78b213a9c07$export$3a89f8d6f6bf6c9f;\nvar $39ece26d1239bb77$export$f24224f1c91d8156 = $4c4ac78b213a9c07$export$f24224f1c91d8156;\nvar $39ece26d1239bb77$export$fc1400facf92c78 = $39ece26d1239bb77$export$f24224f1c91d8156;\nvar $39ece26d1239bb77$export$ab44e1323ffc8376 = $4c4ac78b213a9c07$export$ab44e1323ffc8376;\nvar $39ece26d1239bb77$export$99d8dd3f32a3435 = $39ece26d1239bb77$export$ab44e1323ffc8376;\nvar $39ece26d1239bb77$export$a3295358bff77e = $4c4ac78b213a9c07$export$a3295358bff77e;\nvar $39ece26d1239bb77$export$f2599a5cf1109d8 = $4c4ac78b213a9c07$export$f2599a5cf1109d8;\nfunction $39ece26d1239bb77$export$e9bab7fafb253603(a, b) {\n    return Math.abs($4c4ac78b213a9c07$export$94132a0e348806d4(a, b)) >= 1 - $14f38b7dd89457d7$export$fd293b15f47e270;\n}\nvar $39ece26d1239bb77$export$72d66f5842c00904 = function() {\n    var tmpvec3 = $31054a6c69637582$export$185802fd694ee1f5();\n    var xUnitVec3 = $31054a6c69637582$export$a82be99ed2a44a7d(1, 0, 0);\n    var yUnitVec3 = $31054a6c69637582$export$a82be99ed2a44a7d(0, 1, 0);\n    return function(out, a, b) {\n        var dot = $31054a6c69637582$export$94132a0e348806d4(a, b);\n        if (dot < -0.999999) {\n            $31054a6c69637582$export$bb646b20bb93d339(tmpvec3, xUnitVec3, a);\n            if ($31054a6c69637582$export$fc1400facf92c78(tmpvec3) < 0.000001) $31054a6c69637582$export$bb646b20bb93d339(tmpvec3, yUnitVec3, a);\n            $31054a6c69637582$export$a3295358bff77e(tmpvec3, tmpvec3);\n            $39ece26d1239bb77$export$4286ddefc8f49512(out, tmpvec3, Math.PI);\n            return out;\n        } else if (dot > 0.999999) {\n            out[0] = 0;\n            out[1] = 0;\n            out[2] = 0;\n            out[3] = 1;\n            return out;\n        } else {\n            $31054a6c69637582$export$bb646b20bb93d339(tmpvec3, a, b);\n            out[0] = tmpvec3[0];\n            out[1] = tmpvec3[1];\n            out[2] = tmpvec3[2];\n            out[3] = 1 + dot;\n            return $39ece26d1239bb77$export$a3295358bff77e(out, out);\n        }\n    };\n}();\nvar $39ece26d1239bb77$export$699b0866ca50f6cb = function() {\n    var temp1 = $39ece26d1239bb77$export$185802fd694ee1f5();\n    var temp2 = $39ece26d1239bb77$export$185802fd694ee1f5();\n    return function(out, a, b, c, d, t) {\n        $39ece26d1239bb77$export$1544d9bc2995de08(temp1, a, d, t);\n        $39ece26d1239bb77$export$1544d9bc2995de08(temp2, b, c, t);\n        $39ece26d1239bb77$export$1544d9bc2995de08(out, temp1, temp2, 2 * t * (1 - t));\n        return out;\n    };\n}();\nvar $39ece26d1239bb77$export$937ca0a544b2d712 = function() {\n    var matr = $ba3ca37806a2b6fa$export$185802fd694ee1f5();\n    return function(out, view, right, up) {\n        matr[0] = right[0];\n        matr[3] = right[1];\n        matr[6] = right[2];\n        matr[1] = up[0];\n        matr[4] = up[1];\n        matr[7] = up[2];\n        matr[2] = -view[0];\n        matr[5] = -view[1];\n        matr[8] = -view[2];\n        return $39ece26d1239bb77$export$a3295358bff77e(out, $39ece26d1239bb77$export$272a1eb8e5a4b55b(out, matr));\n    };\n}();\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ var $91b0cc4981465964$exports = {};\n\n$parcel$export($91b0cc4981465964$exports, \"create\", () => $91b0cc4981465964$export$185802fd694ee1f5);\n$parcel$export($91b0cc4981465964$exports, \"clone\", () => $91b0cc4981465964$export$9cd59f9826255e47);\n$parcel$export($91b0cc4981465964$exports, \"fromValues\", () => $91b0cc4981465964$export$a82be99ed2a44a7d);\n$parcel$export($91b0cc4981465964$exports, \"copy\", () => $91b0cc4981465964$export$784d13d8ee351f07);\n$parcel$export($91b0cc4981465964$exports, \"set\", () => $91b0cc4981465964$export$adaa4cf7ef1b65be);\n$parcel$export($91b0cc4981465964$exports, \"add\", () => $91b0cc4981465964$export$e16d8520af44a096);\n$parcel$export($91b0cc4981465964$exports, \"subtract\", () => $91b0cc4981465964$export$4e2d2ead65e5f7e3);\n$parcel$export($91b0cc4981465964$exports, \"multiply\", () => $91b0cc4981465964$export$2060d2db72cce88f);\n$parcel$export($91b0cc4981465964$exports, \"divide\", () => $91b0cc4981465964$export$cd007d971a5a2143);\n$parcel$export($91b0cc4981465964$exports, \"ceil\", () => $91b0cc4981465964$export$803ce6b71a0a94b2);\n$parcel$export($91b0cc4981465964$exports, \"floor\", () => $91b0cc4981465964$export$a3fe094919f356fd);\n$parcel$export($91b0cc4981465964$exports, \"min\", () => $91b0cc4981465964$export$96ec731ed4dcb222);\n$parcel$export($91b0cc4981465964$exports, \"max\", () => $91b0cc4981465964$export$8960430cfd85939f);\n$parcel$export($91b0cc4981465964$exports, \"round\", () => $91b0cc4981465964$export$2077e0241d6afd3c);\n$parcel$export($91b0cc4981465964$exports, \"scale\", () => $91b0cc4981465964$export$dcdf75081b88279d);\n$parcel$export($91b0cc4981465964$exports, \"scaleAndAdd\", () => $91b0cc4981465964$export$19cedf1da84ba854);\n$parcel$export($91b0cc4981465964$exports, \"distance\", () => $91b0cc4981465964$export$9f17032d917177de);\n$parcel$export($91b0cc4981465964$exports, \"squaredDistance\", () => $91b0cc4981465964$export$88e6ebb4fe54f538);\n$parcel$export($91b0cc4981465964$exports, \"length\", () => $91b0cc4981465964$export$f24224f1c91d8156);\n$parcel$export($91b0cc4981465964$exports, \"squaredLength\", () => $91b0cc4981465964$export$ab44e1323ffc8376);\n$parcel$export($91b0cc4981465964$exports, \"negate\", () => $91b0cc4981465964$export$aef51622e549b8b0);\n$parcel$export($91b0cc4981465964$exports, \"inverse\", () => $91b0cc4981465964$export$70ae2c07e401031b);\n$parcel$export($91b0cc4981465964$exports, \"normalize\", () => $91b0cc4981465964$export$a3295358bff77e);\n$parcel$export($91b0cc4981465964$exports, \"dot\", () => $91b0cc4981465964$export$94132a0e348806d4);\n$parcel$export($91b0cc4981465964$exports, \"cross\", () => $91b0cc4981465964$export$bb646b20bb93d339);\n$parcel$export($91b0cc4981465964$exports, \"lerp\", () => $91b0cc4981465964$export$3a89f8d6f6bf6c9f);\n$parcel$export($91b0cc4981465964$exports, \"random\", () => $91b0cc4981465964$export$4385e60b38654f68);\n$parcel$export($91b0cc4981465964$exports, \"transformMat2\", () => $91b0cc4981465964$export$b732428d73874bfc);\n$parcel$export($91b0cc4981465964$exports, \"transformMat2d\", () => $91b0cc4981465964$export$3e55bc4b3707dfd3);\n$parcel$export($91b0cc4981465964$exports, \"transformMat3\", () => $91b0cc4981465964$export$f0bfa0a0024626ee);\n$parcel$export($91b0cc4981465964$exports, \"transformMat4\", () => $91b0cc4981465964$export$5ffbd13800309d59);\n$parcel$export($91b0cc4981465964$exports, \"rotate\", () => $91b0cc4981465964$export$bb628a54ab399bc9);\n$parcel$export($91b0cc4981465964$exports, \"angle\", () => $91b0cc4981465964$export$944b09d2ad10b378);\n$parcel$export($91b0cc4981465964$exports, \"signedAngle\", () => $91b0cc4981465964$export$2c039ab0034c6824);\n$parcel$export($91b0cc4981465964$exports, \"zero\", () => $91b0cc4981465964$export$7f9972325ebfd559);\n$parcel$export($91b0cc4981465964$exports, \"str\", () => $91b0cc4981465964$export$42d51816ce590c93);\n$parcel$export($91b0cc4981465964$exports, \"exactEquals\", () => $91b0cc4981465964$export$f2599a5cf1109d8);\n$parcel$export($91b0cc4981465964$exports, \"equals\", () => $91b0cc4981465964$export$e9bab7fafb253603);\n$parcel$export($91b0cc4981465964$exports, \"len\", () => $91b0cc4981465964$export$fc1400facf92c78);\n$parcel$export($91b0cc4981465964$exports, \"sub\", () => $91b0cc4981465964$export$f93b5905241a7cca);\n$parcel$export($91b0cc4981465964$exports, \"mul\", () => $91b0cc4981465964$export$6e3a27864ab166fe);\n$parcel$export($91b0cc4981465964$exports, \"div\", () => $91b0cc4981465964$export$159d9494db57879b);\n$parcel$export($91b0cc4981465964$exports, \"dist\", () => $91b0cc4981465964$export$6c4a311cc157c764);\n$parcel$export($91b0cc4981465964$exports, \"sqrDist\", () => $91b0cc4981465964$export$2422cd6c492a8b3a);\n$parcel$export($91b0cc4981465964$exports, \"sqrLen\", () => $91b0cc4981465964$export$99d8dd3f32a3435);\n$parcel$export($91b0cc4981465964$exports, \"forEach\", () => $91b0cc4981465964$export$4b80e395e36b5a56);\n\nfunction $91b0cc4981465964$export$185802fd694ee1f5() {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(2);\n    if ($14f38b7dd89457d7$export$b67359430d3b1b2 != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n    }\n    return out;\n}\nfunction $91b0cc4981465964$export$9cd59f9826255e47(a) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(2);\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$a82be99ed2a44a7d(x, y) {\n    var out = new $14f38b7dd89457d7$export$b67359430d3b1b2(2);\n    out[0] = x;\n    out[1] = y;\n    return out;\n}\nfunction $91b0cc4981465964$export$784d13d8ee351f07(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$adaa4cf7ef1b65be(out, x, y) {\n    out[0] = x;\n    out[1] = y;\n    return out;\n}\nfunction $91b0cc4981465964$export$e16d8520af44a096(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$4e2d2ead65e5f7e3(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$2060d2db72cce88f(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$cd007d971a5a2143(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$803ce6b71a0a94b2(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    return out;\n}\nfunction $91b0cc4981465964$export$a3fe094919f356fd(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    return out;\n}\nfunction $91b0cc4981465964$export$96ec731ed4dcb222(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    return out;\n}\nfunction $91b0cc4981465964$export$8960430cfd85939f(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    return out;\n}\nfunction $91b0cc4981465964$export$2077e0241d6afd3c(out, a) {\n    out[0] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[0]);\n    out[1] = $14f38b7dd89457d7$export$2077e0241d6afd3c(a[1]);\n    return out;\n}\nfunction $91b0cc4981465964$export$dcdf75081b88279d(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    return out;\n}\nfunction $91b0cc4981465964$export$19cedf1da84ba854(out, a, b, scale) {\n    out[0] = a[0] + b[0] * scale;\n    out[1] = a[1] + b[1] * scale;\n    return out;\n}\nfunction $91b0cc4981465964$export$9f17032d917177de(a, b) {\n    var x = b[0] - a[0], y = b[1] - a[1];\n    return Math.sqrt(x * x + y * y);\n}\nfunction $91b0cc4981465964$export$88e6ebb4fe54f538(a, b) {\n    var x = b[0] - a[0], y = b[1] - a[1];\n    return x * x + y * y;\n}\nfunction $91b0cc4981465964$export$f24224f1c91d8156(a) {\n    var x = a[0], y = a[1];\n    return Math.sqrt(x * x + y * y);\n}\nfunction $91b0cc4981465964$export$ab44e1323ffc8376(a) {\n    var x = a[0], y = a[1];\n    return x * x + y * y;\n}\nfunction $91b0cc4981465964$export$aef51622e549b8b0(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$70ae2c07e401031b(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$a3295358bff77e(out, a) {\n    var x = a[0], y = a[1];\n    var len = x * x + y * y;\n    if (len > 0) //TODO: evaluate use of glm_invsqrt here?\n    len = 1 / Math.sqrt(len);\n    out[0] = a[0] * len;\n    out[1] = a[1] * len;\n    return out;\n}\nfunction $91b0cc4981465964$export$94132a0e348806d4(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n}\nfunction $91b0cc4981465964$export$bb646b20bb93d339(out, a, b) {\n    var z = a[0] * b[1] - a[1] * b[0];\n    out[0] = out[1] = 0;\n    out[2] = z;\n    return out;\n}\nfunction $91b0cc4981465964$export$3a89f8d6f6bf6c9f(out, a, b, t) {\n    var ax = a[0], ay = a[1];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    return out;\n}\nfunction $91b0cc4981465964$export$4385e60b38654f68(out, scale) {\n    scale = scale === undefined ? 1.0 : scale;\n    var r = $14f38b7dd89457d7$export$5ada478c8a628231() * 2.0 * Math.PI;\n    out[0] = Math.cos(r) * scale;\n    out[1] = Math.sin(r) * scale;\n    return out;\n}\nfunction $91b0cc4981465964$export$b732428d73874bfc(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    return out;\n}\nfunction $91b0cc4981465964$export$3e55bc4b3707dfd3(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[2] * y + m[4];\n    out[1] = m[1] * x + m[3] * y + m[5];\n    return out;\n}\nfunction $91b0cc4981465964$export$f0bfa0a0024626ee(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[3] * y + m[6];\n    out[1] = m[1] * x + m[4] * y + m[7];\n    return out;\n}\nfunction $91b0cc4981465964$export$5ffbd13800309d59(out, a, m) {\n    var x = a[0];\n    var y = a[1];\n    out[0] = m[0] * x + m[4] * y + m[12];\n    out[1] = m[1] * x + m[5] * y + m[13];\n    return out;\n}\nfunction $91b0cc4981465964$export$bb628a54ab399bc9(out, a, b, rad) {\n    //Translate point to the origin\n    var p0 = a[0] - b[0], p1 = a[1] - b[1], sinC = Math.sin(rad), cosC = Math.cos(rad);\n    //perform rotation and translate to correct position\n    out[0] = p0 * cosC - p1 * sinC + b[0];\n    out[1] = p0 * sinC + p1 * cosC + b[1];\n    return out;\n}\nfunction $91b0cc4981465964$export$944b09d2ad10b378(a, b) {\n    var ax = a[0], ay = a[1], bx = b[0], by = b[1];\n    return Math.abs(Math.atan2(ay * bx - ax * by, ax * bx + ay * by));\n}\nfunction $91b0cc4981465964$export$2c039ab0034c6824(a, b) {\n    var ax = a[0], ay = a[1], bx = b[0], by = b[1];\n    return Math.atan2(ax * by - ay * bx, ax * bx + ay * by);\n}\nfunction $91b0cc4981465964$export$7f9972325ebfd559(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    return out;\n}\nfunction $91b0cc4981465964$export$42d51816ce590c93(a) {\n    return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\nfunction $91b0cc4981465964$export$f2599a5cf1109d8(a, b) {\n    return a[0] === b[0] && a[1] === b[1];\n}\nfunction $91b0cc4981465964$export$e9bab7fafb253603(a, b) {\n    var a0 = a[0], a1 = a[1];\n    var b0 = b[0], b1 = b[1];\n    return Math.abs(a0 - b0) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= $14f38b7dd89457d7$export$fd293b15f47e270 * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\nvar $91b0cc4981465964$export$fc1400facf92c78 = $91b0cc4981465964$export$f24224f1c91d8156;\nvar $91b0cc4981465964$export$f93b5905241a7cca = $91b0cc4981465964$export$4e2d2ead65e5f7e3;\nvar $91b0cc4981465964$export$6e3a27864ab166fe = $91b0cc4981465964$export$2060d2db72cce88f;\nvar $91b0cc4981465964$export$159d9494db57879b = $91b0cc4981465964$export$cd007d971a5a2143;\nvar $91b0cc4981465964$export$6c4a311cc157c764 = $91b0cc4981465964$export$9f17032d917177de;\nvar $91b0cc4981465964$export$2422cd6c492a8b3a = $91b0cc4981465964$export$88e6ebb4fe54f538;\nvar $91b0cc4981465964$export$99d8dd3f32a3435 = $91b0cc4981465964$export$ab44e1323ffc8376;\nvar $91b0cc4981465964$export$4b80e395e36b5a56 = function() {\n    var vec = $91b0cc4981465964$export$185802fd694ee1f5();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 2;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n        }\n        return a;\n    };\n}();\n\n\nclass $d4d7bd6cc65a5081$export$a002182e51710d39 {\n}\n$d4d7bd6cc65a5081$export$a002182e51710d39.TWO_PI = 6.283185307179586;\n$d4d7bd6cc65a5081$export$a002182e51710d39.PI = 3.141592653589793;\n$d4d7bd6cc65a5081$export$a002182e51710d39.PI_OVER_TWO = 1.5707963267948966;\n$d4d7bd6cc65a5081$export$a002182e51710d39.PI_OVER_THREE = 1.0471975511965976;\n$d4d7bd6cc65a5081$export$a002182e51710d39.PI_OVER_FOUR = 0.7853981633974483;\n$d4d7bd6cc65a5081$export$a002182e51710d39.PI_OVER_SIX = 0.5235987755982988;\n$d4d7bd6cc65a5081$export$a002182e51710d39.LOG_2 = 0.6931471805599453;\n$d4d7bd6cc65a5081$export$a002182e51710d39.RADIANS_PER_DEGREE = 0.017453292519943295;\n$d4d7bd6cc65a5081$export$a002182e51710d39.DEGREES_PER_RADIAN = 57.29577951308232;\n$d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO = 1.4142135623730951;\n$d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO = 0.7071067811865476;\n$d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_THREE = 1.7320508075688772;\n$d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_THREE_OVER_TWO = 0.8660254037844386;\n$d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_THREE_OVER_THREE = 0.5773502691896257;\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR2_ZERO = (0, $91b0cc4981465964$exports).fromValues(0, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR2_ONE = (0, $91b0cc4981465964$exports).fromValues(1, 1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR2_UNITX = (0, $91b0cc4981465964$exports).fromValues(1, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR2_UNITY = (0, $91b0cc4981465964$exports).fromValues(0, 1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR3_ZERO = (0, $31054a6c69637582$exports).fromValues(0, 0, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR3_ONE = (0, $31054a6c69637582$exports).fromValues(1, 1, 1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR3_UNITX = (0, $31054a6c69637582$exports).fromValues(1, 0, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR3_UNITY = (0, $31054a6c69637582$exports).fromValues(0, 1, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR3_UNITZ = (0, $31054a6c69637582$exports).fromValues(0, 0, 1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR3_REFLECTX = (0, $31054a6c69637582$exports).fromValues(1, -1, -1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR3_REFLECTY = (0, $31054a6c69637582$exports).fromValues(-1, 1, -1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR3_REFLECTZ = (0, $31054a6c69637582$exports).fromValues(-1, -1, 1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR4_ZERO = (0, $4c4ac78b213a9c07$exports).fromValues(0, 0, 0, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR4_ONE = (0, $4c4ac78b213a9c07$exports).fromValues(1, 1, 1, 1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR4_UNITX = (0, $4c4ac78b213a9c07$exports).fromValues(1, 0, 0, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR4_UNITY = (0, $4c4ac78b213a9c07$exports).fromValues(0, 1, 0, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR4_UNITZ = (0, $4c4ac78b213a9c07$exports).fromValues(0, 0, 1, 0);\n$d4d7bd6cc65a5081$export$a002182e51710d39.VECTOR4_UNITW = (0, $4c4ac78b213a9c07$exports).fromValues(0, 0, 0, 1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.MAT3_IDENTITY = (0, $ba3ca37806a2b6fa$exports).create();\n$d4d7bd6cc65a5081$export$a002182e51710d39.MAT4_IDENTITY = (0, $1ac1b59392edf35b$exports).create();\n$d4d7bd6cc65a5081$export$a002182e51710d39.MAT4_ROTATION_MINUS_90 = (0, $1ac1b59392edf35b$exports).fromValues(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n$d4d7bd6cc65a5081$export$a002182e51710d39.QUAT_IDENTITY = (0, $39ece26d1239bb77$exports).create();\n$d4d7bd6cc65a5081$export$a002182e51710d39.QUAT_ROTATEX_PLUS_90 = (0, $39ece26d1239bb77$exports).fromValues($d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO, 0, 0, $d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO);\n$d4d7bd6cc65a5081$export$a002182e51710d39.QUAT_ROTATEX_MINUS_90 = (0, $39ece26d1239bb77$exports).fromValues(-$d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO, 0, 0, $d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO);\n$d4d7bd6cc65a5081$export$a002182e51710d39.QUAT_ROTATEY_PLUS_90 = (0, $39ece26d1239bb77$exports).fromValues(0, $d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO, 0, $d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO);\n$d4d7bd6cc65a5081$export$a002182e51710d39.QUAT_ROTATEY_MINUS_90 = (0, $39ece26d1239bb77$exports).fromValues(0, -$d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO, 0, $d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO);\n$d4d7bd6cc65a5081$export$a002182e51710d39.QUAT_ROTATEZ_PLUS_90 = (0, $39ece26d1239bb77$exports).fromValues(0, 0, $d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO, $d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO);\n$d4d7bd6cc65a5081$export$a002182e51710d39.QUAT_ROTATEZ_MINUS_90 = (0, $39ece26d1239bb77$exports).fromValues(0, 0, -$d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO, $d4d7bd6cc65a5081$export$a002182e51710d39.ROOT_TWO_OVER_TWO);\n$d4d7bd6cc65a5081$export$a002182e51710d39.MILLISECONDS_PER_DAY = 86400000;\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $2d4d1eb6f32f02f2$export$80a8c44b8858d625 {\n    static simpleLinearRegression(points) {\n        const n = points.length;\n        let sumX = 0;\n        let sumY = 0;\n        let sumXY = 0;\n        let sumXX = 0;\n        for(let i = 0; i < n; i++){\n            sumX += points[i].x;\n            sumY += points[i].y;\n            sumXY += points[i].x * points[i].y;\n            sumXX += points[i].x * points[i].x;\n        }\n        const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n        const yIntercept = (sumY - slope * sumX) / n;\n        return {\n            slope: slope,\n            yIntercept: yIntercept\n        };\n    }\n    static clamp(value, min, max) {\n        return Math.max(Math.min(value, max), min);\n    }\n    static lerp(value1, value2, amount) {\n        return value1 + (value2 - value1) * amount;\n    }\n    static normalize(value, min, max, from = 0, to = 1) {\n        return max - min == 0 ? 0 : Math.max(Math.min((to - from) * (value - min) / (max - min) + from, to), from);\n    }\n    static splitExponent(value, result) {\n        let exponent = Math.round(Math.log10(Math.abs(value)));\n        let coefficient = value / Math.pow(10, exponent);\n        if (coefficient < 1) {\n            coefficient *= 10;\n            exponent--;\n        }\n        result[0] = coefficient;\n        result[1] = exponent;\n    }\n    static combineExponent(mantissa, exponent) {\n        return mantissa * Math.pow(10, exponent);\n    }\n    static isPowerOf2(value) {\n        return (value & value - 1) == 0;\n    }\n}\nclass $2d4d1eb6f32f02f2$export$b8e288c3467acb0e {\n    constructor(seed){\n        this._seed = seed % 2147483647;\n        if (this._seed <= 0) this._seed += 2147483646;\n    }\n    next() {\n        return this._seed = this._seed * 16807 % 2147483647;\n    }\n    nextFloat() {\n        return (this.next() - 1) / 2147483646;\n    }\n    nextInteger(min, max) {\n        return Math.floor(this.nextFloat() * (max - min + 1) + min);\n    }\n}\n\n\n\nclass $a49c65c28e06311e$export$210d3b2db589eb5c {\n    static degreesToRadians(degrees) {\n        return degrees * (0, $d4d7bd6cc65a5081$export$a002182e51710d39).RADIANS_PER_DEGREE;\n    }\n    static radiansToDegrees(radians) {\n        return radians * (0, $d4d7bd6cc65a5081$export$a002182e51710d39).DEGREES_PER_RADIAN;\n    }\n    static wrapAngle(angle) {\n        if (angle > (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI) angle = angle - (0, $d4d7bd6cc65a5081$export$a002182e51710d39).TWO_PI;\n        else if (angle < -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI) angle += (0, $d4d7bd6cc65a5081$export$a002182e51710d39).TWO_PI;\n        return angle;\n    }\n    static sphericalToCartesian(altitude, longitude, latitude, result) {\n        latitude = $a49c65c28e06311e$export$210d3b2db589eb5c.degreesToRadians(latitude);\n        longitude = $a49c65c28e06311e$export$210d3b2db589eb5c.degreesToRadians(longitude);\n        const scale = Math.cos(latitude);\n        result[0] = altitude * scale * Math.sin(longitude);\n        result[1] = altitude * Math.sin(latitude);\n        result[2] = altitude * scale * Math.cos(longitude);\n    }\n    static cartesianToSpherical(x, y, z, result) {\n        result[0] = Math.atan2(x, z);\n        result[1] = Math.asin(y);\n    }\n    static angleBetweenVectors(from, to) {\n        if ((0, $31054a6c69637582$exports).exactEquals(from, to)) return 0;\n        else {\n            const dot = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp((0, $31054a6c69637582$exports).dot(from, to), -1, 1);\n            return Math.acos(dot);\n        }\n    }\n    static signedAngleBetweenVectors(from, to, up) {\n        if ((0, $31054a6c69637582$exports).exactEquals(from, to)) return 0;\n        else {\n            const dot = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp((0, $31054a6c69637582$exports).dot(from, to), -1, 1);\n            let angle = Math.acos(dot);\n            (0, $31054a6c69637582$exports).cross($a49c65c28e06311e$export$210d3b2db589eb5c._vec3, from, to);\n            if ((0, $31054a6c69637582$exports).dot($a49c65c28e06311e$export$210d3b2db589eb5c._vec3, up) < 0) angle = -angle;\n            return angle;\n        }\n    }\n}\n$a49c65c28e06311e$export$210d3b2db589eb5c._vec3 = (0, $31054a6c69637582$exports).create();\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $ec7cf7ba687c1511$export$ea4bacb7eec73803 {\n    constructor(core){\n        this.position = (0, $31054a6c69637582$exports).create();\n    }\n}\nclass $ec7cf7ba687c1511$export$c755714d282122f0 {\n    getView(view) {\n        this.getPosition(view.position);\n    }\n    setView(view, isSmooth) {\n        this.setPosition(view.position, isSmooth);\n    }\n    lerpView(from, to, time) {\n        (0, $31054a6c69637582$exports).lerp(this._vec3, from.position, to.position, time);\n        this.setPosition(this._vec3, false);\n    }\n    get vMatrices() {\n        return this._vMatrices;\n    }\n    get inverseVMatrices() {\n        return this._inverseVMatrices;\n    }\n    get mvMatrices() {\n        return this._mvMatrices;\n    }\n    get pMatrices() {\n        return this._pMatrices;\n    }\n    get inversePMatrices() {\n        return this._inversePMatrices;\n    }\n    get pickVMatrix() {\n        return this._pickVMatrix;\n    }\n    get rMatrix() {\n        return this._mat3;\n    }\n    getOrbit(value) {\n        (0, $39ece26d1239bb77$exports).copy(value, this._orbitRotation);\n    }\n    setOrbit(value, isSmooth) {\n        (0, $39ece26d1239bb77$exports).copy(this._orbitRotation, value);\n        if (!isSmooth) (0, $39ece26d1239bb77$exports).copy(this._smoothedOrbitRotation, value);\n    }\n    getPosition(value) {\n        (0, $31054a6c69637582$exports).copy(value, this._cameraPosition);\n    }\n    setPosition(value, isSmooth) {\n        (0, $31054a6c69637582$exports).copy(this._cameraPosition, value);\n        if (!isSmooth) (0, $31054a6c69637582$exports).copy(this._smoothedCameraPosition, value);\n    }\n    constructor(core){\n        this._core = core;\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._quat = (0, $39ece26d1239bb77$exports).create();\n        this._mat3 = (0, $ba3ca37806a2b6fa$exports).create();\n        this._right = (0, $31054a6c69637582$exports).create();\n        this._up = (0, $31054a6c69637582$exports).create();\n        this._forward = (0, $31054a6c69637582$exports).create();\n        this._modelManipulationOrigin = (0, $31054a6c69637582$exports).create();\n        this.modelPosition = (0, $31054a6c69637582$exports).create();\n        this.modelScale = (0, $31054a6c69637582$exports).create();\n        this.modelRotation = (0, $39ece26d1239bb77$exports).create();\n        this._orbitRotation = (0, $39ece26d1239bb77$exports).create();\n        this._orbitDirection = (0, $39ece26d1239bb77$exports).create();\n        this._smoothedOrbitRotation = (0, $39ece26d1239bb77$exports).create();\n        this._smoothedCameraPosition = (0, $31054a6c69637582$exports).create();\n        this._smoothedCameraRotation = (0, $39ece26d1239bb77$exports).create();\n        this._cameraPosition = (0, $31054a6c69637582$exports).create();\n        this._cameraRotation = (0, $39ece26d1239bb77$exports).create();\n        this._combinedPosition = (0, $31054a6c69637582$exports).create();\n        this._combinedRotation = (0, $39ece26d1239bb77$exports).create();\n        this._leftToRightEye = (0, $31054a6c69637582$exports).create();\n        this._pickVMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._eyePositions = [\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create()\n        ];\n        this._vMatrices = [\n            (0, $1ac1b59392edf35b$exports).create(),\n            (0, $1ac1b59392edf35b$exports).create()\n        ];\n        this._mvMatrices = [\n            (0, $1ac1b59392edf35b$exports).create(),\n            (0, $1ac1b59392edf35b$exports).create()\n        ];\n        this._pMatrices = [\n            (0, $1ac1b59392edf35b$exports).create(),\n            (0, $1ac1b59392edf35b$exports).create()\n        ];\n        this._inverseVMatrices = [\n            (0, $1ac1b59392edf35b$exports).create(),\n            (0, $1ac1b59392edf35b$exports).create()\n        ];\n        this._inversePMatrices = [\n            (0, $1ac1b59392edf35b$exports).create(),\n            (0, $1ac1b59392edf35b$exports).create()\n        ];\n    }\n    reset(isSmooth) {\n        (0, $31054a6c69637582$exports).copy(this._cameraPosition, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_ZERO);\n        (0, $39ece26d1239bb77$exports).copy(this._cameraRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY);\n        (0, $39ece26d1239bb77$exports).copy(this._orbitRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY);\n        if (!isSmooth) this.syncSmooth();\n    }\n    update(elapsedTime) {\n        let amount = Math.min(elapsedTime * this._core.config.positionSmoothing, 1);\n        (0, $31054a6c69637582$exports).lerp(this._smoothedCameraPosition, this._smoothedCameraPosition, this._cameraPosition, amount);\n        amount = Math.min(elapsedTime * this._core.config.rotationSmoothing, 1);\n        (0, $39ece26d1239bb77$exports).slerp(this._smoothedCameraRotation, this._smoothedCameraRotation, this._cameraRotation, amount);\n        (0, $39ece26d1239bb77$exports).slerp(this._smoothedOrbitRotation, this._smoothedOrbitRotation, this._orbitRotation, amount);\n        const epsilon = 0.000001;\n        let x;\n        let y;\n        let z;\n        let w;\n        x = this._smoothedCameraPosition[0] - this._cameraPosition[0];\n        y = this._smoothedCameraPosition[1] - this._cameraPosition[1];\n        z = this._smoothedCameraPosition[2] - this._cameraPosition[2];\n        if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon) (0, $31054a6c69637582$exports).copy(this._smoothedCameraPosition, this._cameraPosition);\n        x = this._smoothedCameraRotation[0] - this._cameraRotation[0];\n        y = this._smoothedCameraRotation[1] - this._cameraRotation[1];\n        z = this._smoothedCameraRotation[2] - this._cameraRotation[2];\n        w = this._smoothedCameraRotation[3] - this._cameraRotation[3];\n        if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon && Math.abs(w) < epsilon) (0, $39ece26d1239bb77$exports).copy(this._smoothedCameraRotation, this._cameraRotation);\n        x = this._smoothedOrbitRotation[0] - this._orbitRotation[0];\n        y = this._smoothedOrbitRotation[1] - this._orbitRotation[1];\n        z = this._smoothedOrbitRotation[2] - this._orbitRotation[2];\n        w = this._smoothedOrbitRotation[3] - this._orbitRotation[3];\n        if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon && Math.abs(w) < epsilon) (0, $39ece26d1239bb77$exports).copy(this._smoothedOrbitRotation, this._orbitRotation);\n        (0, $39ece26d1239bb77$exports).normalize(this._smoothedCameraRotation, this._smoothedCameraRotation);\n        (0, $39ece26d1239bb77$exports).normalize(this._smoothedOrbitRotation, this._smoothedOrbitRotation);\n        (0, $39ece26d1239bb77$exports).conjugate(this._orbitDirection, this._smoothedOrbitRotation);\n        (0, $31054a6c69637582$exports).transformMat4(this._modelManipulationOrigin, this.modelManipulationOrigin, this.modelMMatrix);\n        (0, $31054a6c69637582$exports).subtract(this._vec3, this._smoothedCameraPosition, this._modelManipulationOrigin);\n        (0, $31054a6c69637582$exports).transformQuat(this._combinedPosition, this._vec3, this._orbitDirection);\n        (0, $31054a6c69637582$exports).add(this._combinedPosition, this._combinedPosition, this._modelManipulationOrigin);\n        (0, $39ece26d1239bb77$exports).multiply(this._combinedRotation, this._orbitDirection, this._smoothedCameraRotation);\n        (0, $ba3ca37806a2b6fa$exports).fromQuat(this._mat3, this._combinedRotation);\n        this._right[0] = this._mat3[0];\n        this._right[1] = this._mat3[1];\n        this._right[2] = this._mat3[2];\n        this._up[0] = this._mat3[3];\n        this._up[1] = this._mat3[4];\n        this._up[2] = this._mat3[5];\n        this._forward[0] = this._mat3[6];\n        this._forward[1] = this._mat3[7];\n        this._forward[2] = this._mat3[8];\n        const view = this._vMatrices[0];\n        view[0] = this._right[0];\n        view[1] = this._up[0];\n        view[2] = this._forward[0];\n        view[4] = this._right[1];\n        view[5] = this._up[1];\n        view[6] = this._forward[1];\n        view[8] = this._right[2];\n        view[9] = this._up[2];\n        view[10] = this._forward[2];\n        view[12] = -(0, $31054a6c69637582$exports).dot(this._right, this._combinedPosition);\n        view[13] = -(0, $31054a6c69637582$exports).dot(this._up, this._combinedPosition);\n        view[14] = -(0, $31054a6c69637582$exports).dot(this._forward, this._combinedPosition);\n        const aspectRatio = this.width / this.height;\n        if (this._core.config.stereoMode == (0, $4a6417d29706362f$export$ec20dfa68810b176).none) {\n            if (this._core.config.tilesX != 1 || this._core.config.tilesY != 1) {\n                const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n                const bottom = -top;\n                const left = -aspectRatio * top;\n                const right = aspectRatio * top;\n                const width = right - left;\n                const height = top - bottom;\n                const tileWidth = width / this._core.config.tilesX;\n                const tileHeight = height / this._core.config.tilesY;\n                (0, $1ac1b59392edf35b$exports).frustum(this._pMatrices[0], left + this._core.config.tileOffsetX * tileWidth, left + (this._core.config.tileOffsetX + 1) * tileWidth, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY - 1) * tileHeight, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY) * tileHeight, this._core.config.nearPlane, this._core.config.farPlane);\n            } else (0, $1ac1b59392edf35b$exports).perspective(this.pMatrices[0], this._core.config.fov, aspectRatio, this._core.config.nearPlane, this._core.config.farPlane);\n            (0, $1ac1b59392edf35b$exports).multiply(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n            (0, $1ac1b59392edf35b$exports).invert(this._inverseVMatrices[0], this.vMatrices[0]);\n            (0, $1ac1b59392edf35b$exports).invert(this._inversePMatrices[0], this.pMatrices[0]);\n        } else {\n            (0, $31054a6c69637582$exports).cross(this._leftToRightEye, this._forward, this._up);\n            (0, $31054a6c69637582$exports).normalize(this._leftToRightEye, this._leftToRightEye);\n            (0, $31054a6c69637582$exports).scaleAndAdd(this._eyePositions[0], this._combinedPosition, this._leftToRightEye, -this._core.config.ipd);\n            (0, $31054a6c69637582$exports).scaleAndAdd(this._eyePositions[1], this._combinedPosition, this._leftToRightEye, this._core.config.ipd);\n            this._vMatrices[0][12] += this._core.config.ipd * 0.5;\n            (0, $1ac1b59392edf35b$exports).copy(this._vMatrices[1], this._vMatrices[0]);\n            this._vMatrices[1][12] -= this._core.config.ipd;\n            const frustumShift = this._core.config.ipd * 0.5 * this._core.config.nearPlane / this._core.config.screenDistance;\n            const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n            const bottom = -top;\n            let left = -aspectRatio * top + frustumShift;\n            let right = aspectRatio * top + frustumShift;\n            (0, $1ac1b59392edf35b$exports).frustum(this._pMatrices[0], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n            left = -aspectRatio * top - frustumShift;\n            right = aspectRatio * top - frustumShift;\n            (0, $1ac1b59392edf35b$exports).frustum(this._pMatrices[1], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n            (0, $1ac1b59392edf35b$exports).multiply(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n            (0, $1ac1b59392edf35b$exports).multiply(this._mvMatrices[1], this._vMatrices[1], this.modelMMatrix);\n            (0, $1ac1b59392edf35b$exports).invert(this._inverseVMatrices[0], this._vMatrices[0]);\n            (0, $1ac1b59392edf35b$exports).invert(this._inversePMatrices[0], this._pMatrices[0]);\n            (0, $1ac1b59392edf35b$exports).copy(this._inverseVMatrices[1], this._inverseVMatrices[0]);\n            this._inverseVMatrices[1][12] += this._core.config.ipd;\n            (0, $1ac1b59392edf35b$exports).invert(this._inversePMatrices[1], this._pMatrices[1]);\n        }\n        if (this._core.config.isDebugVisible) {\n            this._core.debugText.addLine(`cam off ${this._cameraPosition[0] < 0 ? \"\" : \" \"}${this._cameraPosition[0].toFixed(3)},${this._cameraPosition[1] < 0 ? \"\" : \" \"}${this._cameraPosition[1].toFixed(3)},${this._cameraPosition[2] < 0 ? \"\" : \" \"}${this._cameraPosition[2].toFixed(3)}`);\n            this._core.debugText.addLine(`cam pos ${this._combinedPosition[0] < 0 ? \"\" : \" \"}${this._combinedPosition[0].toFixed(3)},${this._combinedPosition[1] < 0 ? \"\" : \" \"}${this._combinedPosition[1].toFixed(3)},${this._combinedPosition[2] < 0 ? \"\" : \" \"}${this._combinedPosition[2].toFixed(3)}`);\n            this._core.debugText.addLine(`cam rot ${this._combinedRotation[0] < 0 ? \"\" : \" \"}${this._combinedRotation[0].toFixed(3)},${this._combinedRotation[1] < 0 ? \"\" : \" \"}${this._combinedRotation[1].toFixed(3)},${this._combinedRotation[2] < 0 ? \"\" : \" \"}${this._combinedRotation[2].toFixed(3)},${this._combinedRotation[3] < 0 ? \"\" : \" \"}${this._combinedRotation[3].toFixed(3)}`);\n        }\n    }\n    _zoom(direction, distance) {\n        (0, $31054a6c69637582$exports).scaleAndAdd(this._cameraPosition, this._cameraPosition, direction, distance);\n    }\n    rotate(translationDelta) {}\n    zoom(zoomDelta, x, y) {\n        this.unproject(this._vec3, x, y, 1);\n        (0, $31054a6c69637582$exports).normalize(this._vec3, this._vec3);\n        const distance = zoomDelta * (0, $31054a6c69637582$exports).distance(this._combinedPosition, this.modelPosition);\n        (0, $31054a6c69637582$exports).transformQuat(this._vec3, this._vec3, this._orbitRotation);\n        this._zoom(this._vec3, distance);\n    }\n    _twist(axis, angle) {}\n    twist(angle, x, y) {}\n    updatePickVMatrix(x, y) {\n        this.unproject(this._vec3, x, y, 1);\n        (0, $1ac1b59392edf35b$exports).lookAt(this._pickVMatrix, this._combinedPosition, this._vec3, this._up);\n    }\n    syncSmooth() {\n        (0, $31054a6c69637582$exports).copy(this._smoothedCameraPosition, this._cameraPosition);\n        (0, $39ece26d1239bb77$exports).copy(this._smoothedCameraRotation, this._cameraRotation);\n        (0, $39ece26d1239bb77$exports).copy(this._smoothedOrbitRotation, this._orbitRotation);\n    }\n    updateModelManipulationOrigin(from, to) {\n        const a = (0, $31054a6c69637582$exports).create();\n        const b = (0, $31054a6c69637582$exports).create();\n        const c = (0, $31054a6c69637582$exports).create();\n        const d = (0, $31054a6c69637582$exports).create();\n        (0, $31054a6c69637582$exports).transformMat4(a, from, this.modelMMatrix);\n        (0, $31054a6c69637582$exports).transformMat4(b, to, this.modelMMatrix);\n        (0, $31054a6c69637582$exports).subtract(a, this._cameraPosition, a);\n        (0, $31054a6c69637582$exports).subtract(b, this._cameraPosition, b);\n        (0, $31054a6c69637582$exports).transformQuat(c, a, this._orbitDirection);\n        (0, $31054a6c69637582$exports).transformQuat(d, b, this._orbitDirection);\n        (0, $31054a6c69637582$exports).subtract(c, c, a);\n        (0, $31054a6c69637582$exports).subtract(d, d, b);\n        (0, $31054a6c69637582$exports).subtract(this._vec3, c, d);\n        (0, $31054a6c69637582$exports).transformQuat(this._vec3, this._vec3, this._orbitRotation);\n        (0, $31054a6c69637582$exports).add(this._cameraPosition, this._cameraPosition, this._vec3);\n        (0, $31054a6c69637582$exports).add(this._smoothedCameraPosition, this._smoothedCameraPosition, this._vec3);\n    }\n    unproject(position, x, y, z) {\n        (0, $31054a6c69637582$exports).set(position, 2 * x / this.width - 1, 1 - 2 * y / this.height, z);\n        (0, $31054a6c69637582$exports).transformMat4(position, position, this._inversePMatrices[0]);\n        (0, $31054a6c69637582$exports).transformMat4(position, position, this._inverseVMatrices[0]);\n    }\n    translate(translationDelta) {\n        const distance = (0, $31054a6c69637582$exports).distance(this.modelPosition, this._combinedPosition);\n        const height = 2 * Math.tan(this._core.config.fov / 2) * distance / this.height;\n        (0, $31054a6c69637582$exports).set(this._vec3, height * translationDelta[0], -height * translationDelta[1], 0);\n        (0, $31054a6c69637582$exports).transformQuat(this._vec3, this._vec3, this._combinedRotation);\n        (0, $31054a6c69637582$exports).transformQuat(this._vec3, this._vec3, this._orbitRotation);\n        (0, $31054a6c69637582$exports).subtract(this._cameraPosition, this._cameraPosition, this._vec3);\n    }\n}\n\n\nclass $242ad176fe12a941$export$d6a870718daa1f38 extends (0, $ec7cf7ba687c1511$export$ea4bacb7eec73803) {\n    constructor(core){\n        super(core);\n        this.fov = core.config.fov;\n        this.altitude = 0;\n        this.azimuth = 0;\n    }\n}\nclass $242ad176fe12a941$export$cf22ae31f9260ad2 extends (0, $ec7cf7ba687c1511$export$c755714d282122f0) {\n    getView(view) {\n        super.getView(view);\n        view.altitude = this.altitude;\n        view.azimuth = this.azimuth;\n        view.fov = this._core.config.fov;\n    }\n    setView(view, isSmooth) {\n        super.setView(view, isSmooth);\n        this.setAltAzimuth(view.altitude, view.azimuth, isSmooth);\n        this._core.config.fov = view.fov;\n    }\n    lerpView(from, to, time) {\n        super.lerpView(from, to, time);\n        this.setAltAzimuth((0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from.altitude, to.altitude, time), (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from.azimuth, to.azimuth, time), false);\n        this._core.config.fov = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from.fov, to.fov, time);\n    }\n    update(elapsedTime) {\n        super.update(elapsedTime);\n        if (this._core.config.isDebugVisible) {\n            const altitude = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).radiansToDegrees(this.altitude);\n            const azimuth = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).radiansToDegrees(this.azimuth);\n            this._core.debugText.addLine(`cam alt ${altitude < 0 ? \"\" : \" \"}${altitude.toFixed(1)}`);\n            this._core.debugText.addLine(`cam azi ${azimuth < 0 ? \"\" : \" \"}${azimuth.toFixed(1)}`);\n        }\n    }\n    get altitude() {\n        (0, $31054a6c69637582$exports).transformQuat(this._up, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._combinedRotation);\n        (0, $31054a6c69637582$exports).transformQuat(this._right, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, this._combinedRotation);\n        return -(0, $a49c65c28e06311e$export$210d3b2db589eb5c).signedAngleBetweenVectors((0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._up, this._right);\n    }\n    get azimuth() {\n        (0, $31054a6c69637582$exports).transformQuat(this._up, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._combinedRotation);\n        (0, $31054a6c69637582$exports).transformQuat(this._right, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, this._combinedRotation);\n        return -(0, $a49c65c28e06311e$export$210d3b2db589eb5c).signedAngleBetweenVectors((0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, this._right, this._up);\n    }\n    setAltAzimuth(altitude, azimuth, isSmooth) {\n        (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, altitude);\n        (0, $39ece26d1239bb77$exports).multiply(this._orbitRotation, this._quat, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY);\n        (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, azimuth);\n        (0, $39ece26d1239bb77$exports).multiply(this._orbitRotation, this._orbitRotation, this._quat);\n        if (!isSmooth) this.syncSmooth();\n    }\n    rotate(translationDelta) {\n        const length = Math.min(this.width, this.height);\n        let angle = translationDelta[1] * (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI / length;\n        (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, angle);\n        (0, $39ece26d1239bb77$exports).multiply(this._orbitRotation, this._quat, this._orbitRotation);\n        angle = translationDelta[0] * (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI / length;\n        (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, angle);\n        (0, $39ece26d1239bb77$exports).multiply(this._orbitRotation, this._orbitRotation, this._quat);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $3c8e74dd6c09e751$export$29cd7b75162a9425 {\n    constructor(core){\n        this.reset();\n    }\n    reset() {\n        this.isDebugVisible = false;\n        this.logLevel = (0, $4a6417d29706362f$export$243e62d78d3b544d).warn;\n        this.shaderPath = \"shaders\";\n        this.fontPath = \"fonts\";\n        this.modelDistance = 0.5;\n        this.modelSize = 0.25;\n        this.stereoMode = (0, $4a6417d29706362f$export$ec20dfa68810b176).none;\n        this.ipd = 0.06;\n        this.screenDistance = 0.5;\n        this.fov = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(30);\n        this.nearPlane = 0.01;\n        this.farPlane = 100;\n        this.pickWidth = 512;\n        this.pickHeight = 512;\n        this.pickHoldDelay = 1000;\n        this.pickSelectDelay = 100;\n        this.resizeMinimumDelay = 250;\n        this.rotationSmoothing = 0.02;\n        this.positionSmoothing = 0.02;\n        this.focusSmoothing = 0.01;\n        this.scaleSmoothing = 0.02;\n        this.mouseWheelZoomScale = -0.002;\n        this.mouseWheelRotationScale = -0.002;\n        this.dragToleranceSquared = 100;\n        this.manipulatorMinRelativeDistanceSquared = 100;\n        this.isMultiTouchEnabled = true;\n        this.isMultiTouchZoomEnabled = true;\n        this.isMultiTouchTwistEnabled = true;\n        this.isMultiTouchRotateEnabled = true;\n        this.isMultiTouchTranslateEnabled = true;\n        this.multiTouchZoomScale = 1;\n        this.cameraMinDistance = 0.1;\n        this.cameraMaxDistance = 10;\n        this.xrControllerRayColor = (0, $31054a6c69637582$exports).fromValues(0.5, 0.5, 0.5);\n        this.xrControllerProfile = \"windows-mixed-reality\";\n        this.xrControllerHandedness = \"right\";\n        this.paletteColor = new Uint8Array([\n            0x80,\n            0x80,\n            0x80,\n            0\n        ]);\n        this.textColor = (0, $31054a6c69637582$exports).create();\n        this.textHoverColor = (0, $31054a6c69637582$exports).create();\n        this.textBorderColor = (0, $31054a6c69637582$exports).create();\n        this.textBorderWidth = 0x18 / 0xff;\n        this.identityRotation = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY;\n        this.axesTextLabelMaxGlyphs = 32;\n        this.axesTextColor = (0, $31054a6c69637582$exports).create();\n        this.axesTextBorderColor = (0, $31054a6c69637582$exports).create();\n        this.axesTextHoverColor = (0, $31054a6c69637582$exports).create();\n        this.axesTextLabelMajorSize = 0.03;\n        this.axesTextLabelMinorSize = 0.02;\n        this.axesTextTitleMaxGlyphs = 127;\n        this.axesTextTitleSize = 0.05;\n        this.axesTextHeadingMaxGlyphs = 128;\n        this.axesTextHeadingSize = 0.075;\n        this.axesTextTitleLineHeight = 1.5;\n        this.axesTextHeadingLineHeight = 1.5;\n        this.axesTextLabelLineHeight = 1.5;\n        this.axesGridMajorThickness = 0.0002;\n        this.axesGridMinorThickness = 0.0001;\n        this.axesGridZeroThickness = 0.002;\n        this.axesGridPickDivisionHeight = 0.025;\n        this.axesGridBackgroundColor = (0, $31054a6c69637582$exports).create();\n        this.axesGridHighlightColor = (0, $31054a6c69637582$exports).create();\n        this.axesGridMinorColor = (0, $31054a6c69637582$exports).create();\n        this.axesGridMajorColor = (0, $31054a6c69637582$exports).create();\n        this.axesGridZeroColor = (0, $31054a6c69637582$exports).create();\n        this.axesGridDefaultDivisions = 10;\n        this.keyTitleMaxGlyphs = 64;\n        this.keyLabelMaxGlyphs = 64;\n        this.selectionColor = (0, $31054a6c69637582$exports).create();\n        this.hoverColor = (0, $31054a6c69637582$exports).create();\n        this.activeColor = (0, $31054a6c69637582$exports).create();\n        this.highlightMode = (0, $4a6417d29706362f$export$6b731eb2fd512fe0).color;\n        this.lassoThickness = 4;\n        this.lassoDashWidth = 2;\n        this.lassoColor = (0, $31054a6c69637582$exports).create();\n        this.minCubifiedTreeMapSlice = 0.01;\n        this.sdfBuffer = 0xc0;\n        this.sdfBorder = 0x0;\n        this.forceDirectIsEnabled = false;\n        this.forceDirectAttraction = 1;\n        this.forceDirectRepulsion = 1;\n        this.forceDirectGravity = 1;\n        this.forceDirectInterval = 0.1;\n        this.forceDirectMaxDistance = 0.1;\n        this.forceDirectTheta = 1;\n        this.forceDirectIterationsPerLayout = 1;\n        this.forceDirectEdgeWeightPower = 1;\n        this.forceDirectLockX = false;\n        this.forceDirectLockY = false;\n        this.forceDirectLockZ = false;\n        this.transitionDuration = 400;\n        this.transitionStaggering = 100;\n        this.transitionView = true;\n        this.isTransitionPickingEnabled = false;\n        this.backgroundColor = (0, $4c4ac78b213a9c07$exports).create();\n        this.theme = (0, $4a6417d29706362f$export$14faa19a0f3bbeb2).light;\n        this.ambientColor = (0, $31054a6c69637582$exports).create();\n        this.renderMode = (0, $4a6417d29706362f$export$2386c8c1d9db2d57).color;\n        this.tilesX = 1;\n        this.tilesY = 1;\n        this.tileOffsetX = 0;\n        this.tileOffsetY = 0;\n    }\n    get theme() {\n        return this._theme;\n    }\n    set theme(value) {\n        if (this._theme != value) {\n            this._theme = value;\n            switch(value){\n                case (0, $4a6417d29706362f$export$14faa19a0f3bbeb2).dark:\n                    (0, $4c4ac78b213a9c07$exports).set(this.backgroundColor, 0, 0, 0, 1);\n                    (0, $31054a6c69637582$exports).set(this.textColor, 0.9, 0.9, 0.9);\n                    (0, $31054a6c69637582$exports).set(this.textHoverColor, 1, 1, 1);\n                    (0, $31054a6c69637582$exports).set(this.textBorderColor, 0, 0, 0);\n                    (0, $31054a6c69637582$exports).set(this.axesTextColor, 0.9, 0.9, 0.9);\n                    (0, $31054a6c69637582$exports).set(this.axesTextBorderColor, 0, 0, 0);\n                    (0, $31054a6c69637582$exports).set(this.axesTextHoverColor, 1, 1, 1);\n                    (0, $31054a6c69637582$exports).set(this.axesGridBackgroundColor, 0.02, 0.02, 0.02);\n                    (0, $31054a6c69637582$exports).set(this.axesGridHighlightColor, 0.04, 0.04, 0.04);\n                    (0, $31054a6c69637582$exports).set(this.axesGridMinorColor, 0.05, 0.05, 0.05);\n                    (0, $31054a6c69637582$exports).set(this.axesGridMajorColor, 0.1, 0.1, 0.1);\n                    (0, $31054a6c69637582$exports).set(this.axesGridZeroColor, 0.05, 0.1, 0.1);\n                    (0, $31054a6c69637582$exports).set(this.selectionColor, 1, 1, 0);\n                    (0, $31054a6c69637582$exports).set(this.hoverColor, 1, 0, 1);\n                    (0, $31054a6c69637582$exports).set(this.activeColor, 0, 1, 1);\n                    (0, $31054a6c69637582$exports).set(this.lassoColor, 0.9, 0.9, 0.9);\n                    break;\n                case (0, $4a6417d29706362f$export$14faa19a0f3bbeb2).light:\n                    (0, $4c4ac78b213a9c07$exports).set(this.backgroundColor, 1, 1, 1, 1);\n                    (0, $31054a6c69637582$exports).set(this.textColor, 0, 0, 0);\n                    (0, $31054a6c69637582$exports).set(this.textHoverColor, 0.1, 0.1, 0.1);\n                    (0, $31054a6c69637582$exports).set(this.textBorderColor, 1, 1, 1);\n                    (0, $31054a6c69637582$exports).set(this.axesTextColor, 0, 0, 0);\n                    (0, $31054a6c69637582$exports).set(this.axesTextBorderColor, 1, 1, 1);\n                    (0, $31054a6c69637582$exports).set(this.axesTextHoverColor, 0.1, 0.1, 0.1);\n                    (0, $31054a6c69637582$exports).set(this.axesGridBackgroundColor, 1, 1, 1);\n                    (0, $31054a6c69637582$exports).set(this.axesGridHighlightColor, 0.925, 0.925, 0.925);\n                    (0, $31054a6c69637582$exports).set(this.axesGridMinorColor, 0.9, 0.9, 0.9);\n                    (0, $31054a6c69637582$exports).set(this.axesGridMajorColor, 0.8, 0.8, 0.8);\n                    (0, $31054a6c69637582$exports).set(this.axesGridZeroColor, 0.7, 0.9, 0.9);\n                    (0, $31054a6c69637582$exports).set(this.selectionColor, 1, 1, 0);\n                    (0, $31054a6c69637582$exports).set(this.hoverColor, 1, 0, 1);\n                    (0, $31054a6c69637582$exports).set(this.activeColor, 0, 1, 1);\n                    (0, $31054a6c69637582$exports).set(this.lassoColor, 0.1, 0.1, 0.1);\n                    break;\n            }\n            if (this.themeChangedCallback) this.themeChangedCallback(this._theme);\n        }\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $eea2540484261ac0$export$3d1f12550a40f54d {\n    get text() {\n        return this._text;\n    }\n    constructor(){\n        this.clear();\n    }\n    clear() {\n        this._text = \"\";\n    }\n    addLine(value) {\n        this._text += value + \"\\n\";\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $f25ed8c17e63c6a4$export$6e55b0a28cfdaa88 {\n    get frameCounter() {\n        return this._frameCounter;\n    }\n    get totalFrames() {\n        return this._totalFrames;\n    }\n    constructor(core){\n        this._core = core;\n        this._totalFrames = 0;\n        this.reset();\n    }\n    update(elapsedTime) {\n        this._elapsedTime += elapsedTime;\n        if (this._elapsedTime > 1000) {\n            this._elapsedTime -= 1000;\n            this._fps = this._frameCounter;\n            this._frameCounter = 0;\n        }\n        if (this._core.config.isDebugVisible) this._core.debugText.addLine(`fps      ${this._fps}`);\n    }\n    render() {\n        this._frameCounter++;\n        this._totalFrames++;\n    }\n    reset() {\n        this._fps = 0;\n        this._frameCounter = 0;\n        this._elapsedTime = 0;\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ const $548ced3eab978a8c$export$8f5ef0b663dcd813 = {\n    sequentialsinglehue: \"sequentialsinglehue\",\n    sequentialmultihue: \"sequentialmultihue\",\n    diverging: \"diverging\",\n    qualitative: \"qualitative\"\n};\nconst $548ced3eab978a8c$export$de37189af674e8e1 = {\n    blues: \"blues\",\n    greens: \"greens\",\n    greys: \"greys\",\n    oranges: \"oranges\",\n    purples: \"purples\",\n    reds: \"reds\",\n    viridis: \"viridis\",\n    inferno: \"inferno\",\n    magma: \"magma\",\n    plasma: \"plasma\",\n    bluegreen: \"bluegreen\",\n    bluepurple: \"bluepurple\",\n    greenblue: \"greenblue\",\n    orangered: \"orangered\",\n    purpleblue: \"purpleblue\",\n    purplebluegreen: \"purplebluegreen\",\n    purplered: \"purplered\",\n    redpurple: \"redpurple\",\n    yellowgreen: \"yellowgreen\",\n    yellowgreenblue: \"yellowgreenblue\",\n    yelloworangebrown: \"yelloworangebrown\",\n    yelloworangered: \"yelloworangered\",\n    brownbluegreen: \"brownbluegreen\",\n    pinkyellowgreen: \"pinkyellowgreen\",\n    purplegreen: \"purplegreen\",\n    purpleorange: \"purpleorange\",\n    redblue: \"redblue\",\n    redgrey: \"redgrey\",\n    redyellowblue: \"redyellowblue\",\n    redyellowgreen: \"redyellowgreen\",\n    spectral: \"spectral\",\n    accent: \"accent\",\n    category10: \"category10\",\n    category20: \"category20\",\n    dark2: \"dark2\",\n    paired: \"paired\",\n    pastel1: \"pastel1\",\n    pastel2: \"pastel2\",\n    set1: \"set1\",\n    set2: \"set2\",\n    set3: \"set3\"\n};\nclass $548ced3eab978a8c$export$35624e624bb61356 {\n    constructor(){\n        this.palettes = {\n            \"blues\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialsinglehue,\n                colors: new Uint8Array([\n                    247,\n                    251,\n                    255,\n                    222,\n                    235,\n                    247,\n                    198,\n                    219,\n                    239,\n                    158,\n                    202,\n                    225,\n                    107,\n                    174,\n                    214,\n                    66,\n                    146,\n                    198,\n                    33,\n                    113,\n                    181,\n                    8,\n                    81,\n                    156,\n                    8,\n                    48,\n                    107\n                ])\n            },\n            \"greens\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialsinglehue,\n                colors: new Uint8Array([\n                    247,\n                    252,\n                    245,\n                    229,\n                    245,\n                    224,\n                    199,\n                    233,\n                    192,\n                    161,\n                    217,\n                    155,\n                    116,\n                    196,\n                    118,\n                    65,\n                    171,\n                    93,\n                    35,\n                    139,\n                    69,\n                    0,\n                    109,\n                    44,\n                    0,\n                    68,\n                    27\n                ])\n            },\n            \"greys\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialsinglehue,\n                colors: new Uint8Array([\n                    255,\n                    255,\n                    255,\n                    240,\n                    240,\n                    240,\n                    217,\n                    217,\n                    217,\n                    189,\n                    189,\n                    189,\n                    150,\n                    150,\n                    150,\n                    115,\n                    115,\n                    115,\n                    82,\n                    82,\n                    82,\n                    37,\n                    37,\n                    37,\n                    0,\n                    0,\n                    0\n                ])\n            },\n            \"oranges\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialsinglehue,\n                colors: new Uint8Array([\n                    255,\n                    245,\n                    235,\n                    254,\n                    230,\n                    206,\n                    253,\n                    208,\n                    162,\n                    253,\n                    174,\n                    107,\n                    253,\n                    141,\n                    60,\n                    241,\n                    105,\n                    19,\n                    217,\n                    72,\n                    1,\n                    166,\n                    54,\n                    3,\n                    127,\n                    39,\n                    4\n                ])\n            },\n            \"purples\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialsinglehue,\n                colors: new Uint8Array([\n                    252,\n                    251,\n                    253,\n                    239,\n                    237,\n                    245,\n                    218,\n                    218,\n                    235,\n                    188,\n                    189,\n                    220,\n                    158,\n                    154,\n                    200,\n                    128,\n                    125,\n                    186,\n                    106,\n                    81,\n                    163,\n                    84,\n                    39,\n                    143,\n                    63,\n                    0,\n                    125\n                ])\n            },\n            \"reds\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialsinglehue,\n                colors: new Uint8Array([\n                    255,\n                    245,\n                    240,\n                    254,\n                    224,\n                    210,\n                    252,\n                    187,\n                    161,\n                    252,\n                    146,\n                    114,\n                    251,\n                    106,\n                    74,\n                    239,\n                    59,\n                    44,\n                    203,\n                    24,\n                    29,\n                    165,\n                    15,\n                    21,\n                    103,\n                    0,\n                    13\n                ])\n            },\n            \"viridis\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    0x48,\n                    0x25,\n                    0x75,\n                    0x41,\n                    0x44,\n                    0x87,\n                    0x35,\n                    0x60,\n                    0x8d,\n                    0x2a,\n                    0x78,\n                    0x8e,\n                    0x21,\n                    0x91,\n                    0x8d,\n                    0x22,\n                    0xa8,\n                    0x84,\n                    0x43,\n                    0xbf,\n                    0x71,\n                    0x7a,\n                    0xd1,\n                    0x51,\n                    0xbc,\n                    0xdf,\n                    0x27\n                ])\n            },\n            \"inferno\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    0x17,\n                    0x0c,\n                    0x3b,\n                    0x42,\n                    0x0a,\n                    0x68,\n                    0x6b,\n                    0x17,\n                    0x6e,\n                    0x93,\n                    0x26,\n                    0x67,\n                    0xbb,\n                    0x37,\n                    0x55,\n                    0xdd,\n                    0x51,\n                    0x3a,\n                    0xf3,\n                    0x77,\n                    0x1a,\n                    0xfc,\n                    0xa5,\n                    0x0a,\n                    0xf6,\n                    0xd6,\n                    0x45\n                ])\n            },\n            \"magma\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    0x15,\n                    0x0e,\n                    0x37,\n                    0x3b,\n                    0x0f,\n                    0x70,\n                    0x65,\n                    0x1a,\n                    0x80,\n                    0x8c,\n                    0x29,\n                    0x81,\n                    0xb6,\n                    0x37,\n                    0x7a,\n                    0xde,\n                    0x49,\n                    0x68,\n                    0xf7,\n                    0x6f,\n                    0x5c,\n                    0xfe,\n                    0x9f,\n                    0x6d,\n                    0xfe,\n                    0xce,\n                    0x91\n                ])\n            },\n            \"plasma\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    0x42,\n                    0x03,\n                    0x9d,\n                    0x6a,\n                    0x00,\n                    0xa8,\n                    0x90,\n                    0x0d,\n                    0xa4,\n                    0xb1,\n                    0x2a,\n                    0x90,\n                    0xcb,\n                    0x47,\n                    0x79,\n                    0xe1,\n                    0x64,\n                    0x62,\n                    0xf2,\n                    0x83,\n                    0x4c,\n                    0xfc,\n                    0xa6,\n                    0x36,\n                    0xfc,\n                    0xce,\n                    0x25\n                ])\n            },\n            \"bluegreen\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    247,\n                    252,\n                    253,\n                    229,\n                    245,\n                    249,\n                    204,\n                    236,\n                    230,\n                    153,\n                    216,\n                    201,\n                    102,\n                    194,\n                    164,\n                    65,\n                    174,\n                    118,\n                    35,\n                    139,\n                    69,\n                    0,\n                    109,\n                    44,\n                    0,\n                    68,\n                    27\n                ])\n            },\n            \"bluepurple\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    247,\n                    252,\n                    253,\n                    224,\n                    236,\n                    244,\n                    191,\n                    211,\n                    230,\n                    158,\n                    188,\n                    218,\n                    140,\n                    150,\n                    198,\n                    140,\n                    107,\n                    177,\n                    136,\n                    65,\n                    157,\n                    129,\n                    15,\n                    124,\n                    77,\n                    0,\n                    75\n                ])\n            },\n            \"greenblue\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    247,\n                    252,\n                    240,\n                    224,\n                    243,\n                    219,\n                    204,\n                    235,\n                    197,\n                    168,\n                    221,\n                    181,\n                    123,\n                    204,\n                    196,\n                    78,\n                    179,\n                    211,\n                    43,\n                    140,\n                    190,\n                    8,\n                    104,\n                    172,\n                    8,\n                    64,\n                    129\n                ])\n            },\n            \"orangered\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    255,\n                    247,\n                    236,\n                    254,\n                    232,\n                    200,\n                    253,\n                    212,\n                    158,\n                    253,\n                    187,\n                    132,\n                    252,\n                    141,\n                    89,\n                    239,\n                    101,\n                    72,\n                    215,\n                    48,\n                    31,\n                    179,\n                    0,\n                    0,\n                    127,\n                    0,\n                    0\n                ])\n            },\n            \"purpleblue\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    255,\n                    247,\n                    251,\n                    236,\n                    231,\n                    242,\n                    208,\n                    209,\n                    230,\n                    166,\n                    189,\n                    219,\n                    116,\n                    169,\n                    207,\n                    54,\n                    144,\n                    192,\n                    5,\n                    112,\n                    176,\n                    4,\n                    90,\n                    141,\n                    2,\n                    56,\n                    88\n                ])\n            },\n            \"purplebluegreen\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    255,\n                    247,\n                    251,\n                    236,\n                    226,\n                    240,\n                    208,\n                    209,\n                    230,\n                    166,\n                    189,\n                    219,\n                    103,\n                    169,\n                    207,\n                    54,\n                    144,\n                    192,\n                    2,\n                    129,\n                    138,\n                    1,\n                    108,\n                    89,\n                    1,\n                    70,\n                    54\n                ])\n            },\n            \"purplered\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    247,\n                    244,\n                    249,\n                    231,\n                    225,\n                    239,\n                    212,\n                    185,\n                    218,\n                    201,\n                    148,\n                    199,\n                    223,\n                    101,\n                    176,\n                    231,\n                    41,\n                    138,\n                    206,\n                    18,\n                    86,\n                    152,\n                    0,\n                    67,\n                    103,\n                    0,\n                    31\n                ])\n            },\n            \"redpurple\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    255,\n                    247,\n                    243,\n                    253,\n                    224,\n                    221,\n                    252,\n                    197,\n                    192,\n                    250,\n                    159,\n                    181,\n                    247,\n                    104,\n                    161,\n                    221,\n                    52,\n                    151,\n                    174,\n                    1,\n                    126,\n                    122,\n                    1,\n                    119,\n                    73,\n                    0,\n                    106\n                ])\n            },\n            \"yellowgreen\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    255,\n                    255,\n                    229,\n                    247,\n                    252,\n                    185,\n                    217,\n                    240,\n                    163,\n                    173,\n                    221,\n                    142,\n                    120,\n                    198,\n                    121,\n                    65,\n                    171,\n                    93,\n                    35,\n                    132,\n                    67,\n                    0,\n                    104,\n                    55,\n                    0,\n                    69,\n                    41\n                ])\n            },\n            \"yellowgreenblue\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    255,\n                    255,\n                    217,\n                    237,\n                    248,\n                    177,\n                    199,\n                    233,\n                    180,\n                    127,\n                    205,\n                    187,\n                    65,\n                    182,\n                    196,\n                    29,\n                    145,\n                    192,\n                    34,\n                    94,\n                    168,\n                    37,\n                    52,\n                    148,\n                    8,\n                    29,\n                    88\n                ])\n            },\n            \"yelloworangebrown\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    255,\n                    255,\n                    229,\n                    255,\n                    247,\n                    188,\n                    254,\n                    227,\n                    145,\n                    254,\n                    196,\n                    79,\n                    254,\n                    153,\n                    41,\n                    236,\n                    112,\n                    20,\n                    204,\n                    76,\n                    2,\n                    153,\n                    52,\n                    4,\n                    102,\n                    37,\n                    6\n                ])\n            },\n            \"yelloworangered\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.sequentialmultihue,\n                colors: new Uint8Array([\n                    255,\n                    255,\n                    204,\n                    255,\n                    237,\n                    160,\n                    254,\n                    217,\n                    118,\n                    254,\n                    178,\n                    76,\n                    253,\n                    141,\n                    60,\n                    252,\n                    78,\n                    42,\n                    227,\n                    26,\n                    28,\n                    189,\n                    0,\n                    38,\n                    128,\n                    0,\n                    38\n                ])\n            },\n            \"brownbluegreen\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    84,\n                    48,\n                    5,\n                    140,\n                    81,\n                    10,\n                    191,\n                    129,\n                    45,\n                    223,\n                    194,\n                    125,\n                    246,\n                    232,\n                    195,\n                    245,\n                    245,\n                    245,\n                    199,\n                    234,\n                    229,\n                    128,\n                    205,\n                    193,\n                    53,\n                    151,\n                    143,\n                    1,\n                    102,\n                    94,\n                    0,\n                    60,\n                    48\n                ])\n            },\n            \"pinkyellowgreen\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    142,\n                    1,\n                    82,\n                    197,\n                    27,\n                    125,\n                    222,\n                    119,\n                    174,\n                    241,\n                    182,\n                    218,\n                    253,\n                    224,\n                    239,\n                    247,\n                    247,\n                    247,\n                    230,\n                    245,\n                    208,\n                    184,\n                    225,\n                    134,\n                    127,\n                    188,\n                    65,\n                    77,\n                    146,\n                    33,\n                    39,\n                    100,\n                    25\n                ])\n            },\n            \"purplegreen\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    64,\n                    0,\n                    75,\n                    118,\n                    42,\n                    131,\n                    153,\n                    112,\n                    171,\n                    194,\n                    165,\n                    207,\n                    231,\n                    212,\n                    232,\n                    247,\n                    247,\n                    247,\n                    217,\n                    240,\n                    211,\n                    166,\n                    219,\n                    160,\n                    90,\n                    174,\n                    97,\n                    27,\n                    120,\n                    55,\n                    0,\n                    68,\n                    27\n                ])\n            },\n            \"purpleorange\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    127,\n                    59,\n                    8,\n                    179,\n                    88,\n                    6,\n                    224,\n                    130,\n                    20,\n                    253,\n                    184,\n                    99,\n                    254,\n                    224,\n                    182,\n                    247,\n                    247,\n                    247,\n                    216,\n                    218,\n                    235,\n                    178,\n                    171,\n                    210,\n                    128,\n                    115,\n                    172,\n                    84,\n                    39,\n                    136,\n                    45,\n                    0,\n                    75\n                ])\n            },\n            \"redblue\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    103,\n                    0,\n                    31,\n                    178,\n                    24,\n                    43,\n                    214,\n                    96,\n                    77,\n                    244,\n                    165,\n                    130,\n                    253,\n                    219,\n                    199,\n                    247,\n                    247,\n                    247,\n                    209,\n                    229,\n                    240,\n                    146,\n                    197,\n                    222,\n                    67,\n                    147,\n                    195,\n                    33,\n                    102,\n                    172,\n                    5,\n                    48,\n                    97\n                ])\n            },\n            \"redgrey\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    103,\n                    0,\n                    31,\n                    178,\n                    24,\n                    43,\n                    214,\n                    96,\n                    77,\n                    244,\n                    165,\n                    130,\n                    253,\n                    219,\n                    199,\n                    255,\n                    255,\n                    255,\n                    224,\n                    224,\n                    224,\n                    186,\n                    186,\n                    186,\n                    135,\n                    135,\n                    135,\n                    77,\n                    77,\n                    77,\n                    26,\n                    26,\n                    26\n                ])\n            },\n            \"redyellowblue\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    165,\n                    0,\n                    38,\n                    215,\n                    48,\n                    39,\n                    244,\n                    109,\n                    67,\n                    253,\n                    174,\n                    97,\n                    254,\n                    224,\n                    144,\n                    255,\n                    255,\n                    191,\n                    224,\n                    243,\n                    248,\n                    171,\n                    217,\n                    233,\n                    116,\n                    173,\n                    209,\n                    69,\n                    117,\n                    180,\n                    49,\n                    54,\n                    149\n                ])\n            },\n            \"redyellowgreen\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    165,\n                    0,\n                    38,\n                    215,\n                    48,\n                    39,\n                    244,\n                    109,\n                    67,\n                    253,\n                    174,\n                    97,\n                    254,\n                    224,\n                    139,\n                    255,\n                    255,\n                    191,\n                    217,\n                    239,\n                    139,\n                    166,\n                    217,\n                    106,\n                    102,\n                    189,\n                    99,\n                    26,\n                    152,\n                    80,\n                    0,\n                    104,\n                    55\n                ])\n            },\n            \"spectral\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.diverging,\n                colors: new Uint8Array([\n                    158,\n                    1,\n                    66,\n                    213,\n                    62,\n                    79,\n                    244,\n                    109,\n                    67,\n                    253,\n                    174,\n                    97,\n                    254,\n                    224,\n                    139,\n                    255,\n                    255,\n                    191,\n                    230,\n                    245,\n                    152,\n                    171,\n                    221,\n                    164,\n                    102,\n                    194,\n                    165,\n                    50,\n                    136,\n                    189,\n                    94,\n                    79,\n                    162\n                ])\n            },\n            \"accent\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    127,\n                    201,\n                    127,\n                    190,\n                    174,\n                    212,\n                    253,\n                    192,\n                    134,\n                    255,\n                    255,\n                    153,\n                    56,\n                    108,\n                    176,\n                    240,\n                    2,\n                    127,\n                    191,\n                    91,\n                    23,\n                    102,\n                    102,\n                    102\n                ])\n            },\n            \"category10\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    31,\n                    119,\n                    180,\n                    255,\n                    127,\n                    14,\n                    44,\n                    160,\n                    44,\n                    214,\n                    39,\n                    40,\n                    148,\n                    103,\n                    189,\n                    140,\n                    86,\n                    75,\n                    227,\n                    119,\n                    194,\n                    127,\n                    127,\n                    127,\n                    188,\n                    189,\n                    34,\n                    23,\n                    190,\n                    207\n                ])\n            },\n            \"category20\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    31,\n                    119,\n                    180,\n                    174,\n                    199,\n                    232,\n                    255,\n                    127,\n                    14,\n                    255,\n                    187,\n                    120,\n                    44,\n                    160,\n                    44,\n                    152,\n                    223,\n                    138,\n                    214,\n                    39,\n                    40,\n                    255,\n                    152,\n                    150,\n                    148,\n                    103,\n                    189,\n                    197,\n                    176,\n                    213,\n                    140,\n                    86,\n                    75,\n                    196,\n                    156,\n                    148,\n                    227,\n                    119,\n                    194,\n                    247,\n                    182,\n                    210,\n                    127,\n                    127,\n                    127,\n                    199,\n                    199,\n                    199,\n                    188,\n                    189,\n                    34,\n                    219,\n                    219,\n                    141,\n                    23,\n                    190,\n                    207,\n                    158,\n                    218,\n                    229\n                ])\n            },\n            \"dark2\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    27,\n                    158,\n                    119,\n                    217,\n                    95,\n                    2,\n                    117,\n                    112,\n                    179,\n                    231,\n                    41,\n                    138,\n                    102,\n                    166,\n                    30,\n                    230,\n                    171,\n                    2,\n                    166,\n                    118,\n                    29,\n                    102,\n                    102,\n                    102\n                ])\n            },\n            \"paired\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    166,\n                    206,\n                    227,\n                    31,\n                    120,\n                    180,\n                    178,\n                    223,\n                    138,\n                    51,\n                    160,\n                    44,\n                    251,\n                    154,\n                    153,\n                    227,\n                    26,\n                    28,\n                    253,\n                    191,\n                    111,\n                    255,\n                    127,\n                    0,\n                    202,\n                    178,\n                    214,\n                    106,\n                    61,\n                    154,\n                    255,\n                    255,\n                    153,\n                    177,\n                    89,\n                    40\n                ])\n            },\n            \"pastel1\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    251,\n                    180,\n                    174,\n                    179,\n                    205,\n                    227,\n                    204,\n                    235,\n                    197,\n                    222,\n                    203,\n                    228,\n                    254,\n                    217,\n                    166,\n                    255,\n                    255,\n                    204,\n                    229,\n                    216,\n                    189,\n                    253,\n                    218,\n                    236,\n                    242,\n                    242,\n                    242\n                ])\n            },\n            \"pastel2\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    179,\n                    226,\n                    205,\n                    253,\n                    205,\n                    172,\n                    203,\n                    213,\n                    232,\n                    244,\n                    202,\n                    228,\n                    230,\n                    245,\n                    201,\n                    255,\n                    242,\n                    174,\n                    241,\n                    226,\n                    204,\n                    204,\n                    204,\n                    204\n                ])\n            },\n            \"set1\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    228,\n                    26,\n                    28,\n                    55,\n                    126,\n                    184,\n                    77,\n                    175,\n                    74,\n                    152,\n                    78,\n                    163,\n                    255,\n                    127,\n                    0,\n                    255,\n                    255,\n                    51,\n                    166,\n                    86,\n                    40,\n                    247,\n                    129,\n                    191,\n                    153,\n                    153,\n                    153\n                ])\n            },\n            \"set2\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    102,\n                    194,\n                    165,\n                    252,\n                    141,\n                    98,\n                    141,\n                    160,\n                    203,\n                    231,\n                    138,\n                    195,\n                    166,\n                    216,\n                    84,\n                    255,\n                    217,\n                    47,\n                    229,\n                    196,\n                    148,\n                    179,\n                    179,\n                    179\n                ])\n            },\n            \"set3\": {\n                type: $548ced3eab978a8c$export$8f5ef0b663dcd813.qualitative,\n                colors: new Uint8Array([\n                    141,\n                    211,\n                    199,\n                    255,\n                    255,\n                    179,\n                    190,\n                    186,\n                    218,\n                    251,\n                    128,\n                    114,\n                    128,\n                    177,\n                    211,\n                    253,\n                    180,\n                    98,\n                    179,\n                    222,\n                    105,\n                    252,\n                    205,\n                    229,\n                    217,\n                    217,\n                    217,\n                    188,\n                    128,\n                    189,\n                    204,\n                    235,\n                    197,\n                    255,\n                    237,\n                    111\n                ])\n            }\n        };\n    }\n}\nclass $548ced3eab978a8c$export$f05ab453e1597580 {\n    get colors() {\n        return this._colors;\n    }\n    set colors(value) {\n        if (this._colors != value) {\n            this._colors = value;\n            this._changed = true;\n        }\n    }\n    constructor(){\n        this._colors = null;\n    }\n    copyFrom(palette) {\n        if (palette.colors) this.colors = new Uint8Array(palette.colors);\n        else this.colors = null;\n    }\n    update() {}\n}\nclass $548ced3eab978a8c$export$e2fbaa661ec19dbf extends $548ced3eab978a8c$export$f05ab453e1597580 {\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $0a0587bd8b0d58e8$export$5b33f080c7f6c861 {\n    static getPosition(buffer, index, value) {\n        const offset = index * $0a0587bd8b0d58e8$export$5b33f080c7f6c861.SIZE;\n        (0, $31054a6c69637582$exports).set(value, buffer[offset], buffer[offset + 1], buffer[offset + 2]);\n    }\n    static setPosition(buffer, index, value) {\n        const offset = index * $0a0587bd8b0d58e8$export$5b33f080c7f6c861.SIZE;\n        buffer[offset] = value[0];\n        buffer[offset + 1] = value[1];\n        buffer[offset + 2] = value[2];\n    }\n}\n$0a0587bd8b0d58e8$export$5b33f080c7f6c861.SIZE = 3;\n$0a0587bd8b0d58e8$export$5b33f080c7f6c861.SIZE_BYTES = 12;\nclass $0a0587bd8b0d58e8$export$6597d9a580deb707 {\n    static getPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static getColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF);\n    }\n    static setColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n        bufferView.setUint8(offset, value[0] * 0xFF);\n        bufferView.setUint8(offset + 1, value[1] * 0xFF);\n        bufferView.setUint8(offset + 2, value[2] * 0xFF);\n    }\n}\n$0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES = 16;\n$0a0587bd8b0d58e8$export$6597d9a580deb707.POSITION_OFFSET_BYTES = 0;\n$0a0587bd8b0d58e8$export$6597d9a580deb707.COLOR_OFFSET_BYTES = 12;\nclass $0a0587bd8b0d58e8$export$538532535e0e8594 {\n    static getPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static getTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n        (0, $91b0cc4981465964$exports).set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n    }\n    static setTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$6597d9a580deb707.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n        bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n        bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n    }\n}\n$0a0587bd8b0d58e8$export$538532535e0e8594.SIZE_BYTES = 16;\n$0a0587bd8b0d58e8$export$538532535e0e8594.POSITION_OFFSET_BYTES = 0;\n$0a0587bd8b0d58e8$export$538532535e0e8594.TEX_COORD_OFFSET_BYTES = 12;\nclass $0a0587bd8b0d58e8$export$74c3c25430a16442 {\n    static getPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$74c3c25430a16442.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$74c3c25430a16442.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static getTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$74c3c25430a16442.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n        (0, $91b0cc4981465964$exports).set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n    }\n    static setTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$74c3c25430a16442.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n        bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n        bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n    }\n    static getIdColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$74c3c25430a16442.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n        (0, $4c4ac78b213a9c07$exports).set(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n    }\n    static setIdColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$74c3c25430a16442.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n        bufferView.setUint8(offset, value[0] * 0xFF);\n        bufferView.setUint8(offset + 1, value[1] * 0xFF);\n        bufferView.setUint8(offset + 2, value[2] * 0xFF);\n        bufferView.setUint8(offset + 3, value[3] * 0xFF);\n    }\n}\n$0a0587bd8b0d58e8$export$74c3c25430a16442.SIZE_BYTES = 20;\n$0a0587bd8b0d58e8$export$74c3c25430a16442.ID_COLOR_OFFSET_BYTES = 0;\n$0a0587bd8b0d58e8$export$74c3c25430a16442.POSITION_OFFSET_BYTES = 4;\n$0a0587bd8b0d58e8$export$74c3c25430a16442.TEX_COORD_OFFSET_BYTES = 16;\nclass $0a0587bd8b0d58e8$export$7060026f20f731a4 {\n    static getPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$7060026f20f731a4.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$7060026f20f731a4.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static getNormal(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$7060026f20f731a4.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getInt8(offset) / 0x7F, bufferView.getInt8(offset + 1) / 0x7F, bufferView.getInt8(offset + 2) / 0x7F);\n    }\n    static setNormal(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$7060026f20f731a4.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n        bufferView.setInt8(offset, value[0] * 0x7F);\n        bufferView.setInt8(offset + 1, value[1] * 0x7F);\n        bufferView.setInt8(offset + 2, value[2] * 0x7F);\n    }\n}\n$0a0587bd8b0d58e8$export$7060026f20f731a4.SIZE_BYTES = 16;\n$0a0587bd8b0d58e8$export$7060026f20f731a4.POSITION_OFFSET_BYTES = 0;\n$0a0587bd8b0d58e8$export$7060026f20f731a4.NORMAL_OFFSET_BYTES = 12;\nclass $0a0587bd8b0d58e8$export$15bf2991269f4a0e {\n    static getPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$15bf2991269f4a0e.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$15bf2991269f4a0e.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static getNormal(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$15bf2991269f4a0e.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getInt8(offset) / 0x7F, bufferView.getInt8(offset + 1) / 0x7F, bufferView.getInt8(offset + 2) / 0x7F);\n    }\n    static setNormal(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$15bf2991269f4a0e.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n        bufferView.setInt8(offset, value[0] * 0x7F);\n        bufferView.setInt8(offset + 1, value[1] * 0x7F);\n        bufferView.setInt8(offset + 2, value[2] * 0x7F);\n    }\n    static getColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$15bf2991269f4a0e.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF);\n    }\n    static setColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$15bf2991269f4a0e.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n        bufferView.setUint8(offset, value[0] * 0xFF);\n        bufferView.setUint8(offset + 1, value[1] * 0xFF);\n        bufferView.setUint8(offset + 2, value[2] * 0xFF);\n    }\n}\n$0a0587bd8b0d58e8$export$15bf2991269f4a0e.SIZE_BYTES = 20;\n$0a0587bd8b0d58e8$export$15bf2991269f4a0e.POSITION_OFFSET_BYTES = 0;\n$0a0587bd8b0d58e8$export$15bf2991269f4a0e.NORMAL_OFFSET_BYTES = 12;\n$0a0587bd8b0d58e8$export$15bf2991269f4a0e.COLOR_OFFSET_BYTES = 16;\nclass $0a0587bd8b0d58e8$export$e40add16394b9bff {\n    static getPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$e40add16394b9bff.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setPosition(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$e40add16394b9bff.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static getNormal(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$e40add16394b9bff.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getInt8(offset) / 0x7F, bufferView.getInt8(offset + 1) / 0x7F, bufferView.getInt8(offset + 2) / 0x7F);\n    }\n    static setNormal(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$e40add16394b9bff.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n        bufferView.setInt8(offset, value[0] * 0x7F);\n        bufferView.setInt8(offset + 1, value[1] * 0x7F);\n        bufferView.setInt8(offset + 2, value[2] * 0x7F);\n    }\n    static getTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$e40add16394b9bff.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n        (0, $91b0cc4981465964$exports).set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n    }\n    static setTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$e40add16394b9bff.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n        bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n        bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n    }\n}\n$0a0587bd8b0d58e8$export$e40add16394b9bff.SIZE_BYTES = 20;\n$0a0587bd8b0d58e8$export$e40add16394b9bff.POSITION_OFFSET_BYTES = 0;\n$0a0587bd8b0d58e8$export$e40add16394b9bff.NORMAL_OFFSET_BYTES = 12;\n$0a0587bd8b0d58e8$export$e40add16394b9bff.TEX_COORD_OFFSET_BYTES = 16;\nclass $0a0587bd8b0d58e8$export$df352805a955aca5 {\n    static getTranslation(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setTranslation(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static getNormal(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getInt8(offset) / 0x7F, bufferView.getInt8(offset + 1) / 0x7F, bufferView.getInt8(offset + 2) / 0x7F);\n    }\n    static setNormal(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n        bufferView.setInt8(offset, value[0] * 0x7F);\n        bufferView.setInt8(offset + 1, value[1] * 0x7F);\n        bufferView.setInt8(offset + 2, value[2] * 0x7F);\n    }\n    static getIdColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n        (0, $4c4ac78b213a9c07$exports).set(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n    }\n    static setIdColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n        bufferView.setUint8(offset, value[0] * 0xFF);\n        bufferView.setUint8(offset + 1, value[1] * 0xFF);\n        bufferView.setUint8(offset + 2, value[2] * 0xFF);\n        bufferView.setUint8(offset + 3, value[3] * 0xFF);\n    }\n    static getTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n        (0, $91b0cc4981465964$exports).set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n    }\n    static setTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n        bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n        bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n    }\n    static getBounds(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.BOUNDS_OFFSET_BYTES;\n        (0, $4c4ac78b213a9c07$exports).set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF, bufferView.getUint16(offset + 4, true) / 0xFFFF, bufferView.getUint16(offset + 6, true) / 0xFFFF);\n    }\n    static setBounds(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES * index + this.BOUNDS_OFFSET_BYTES;\n        bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n        bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        bufferView.setUint16(offset + 4, value[2] * 0xFFFF, true);\n        bufferView.setUint16(offset + 6, value[3] * 0xFFFF, true);\n    }\n}\n$0a0587bd8b0d58e8$export$df352805a955aca5.SIZE_BYTES = 32;\n$0a0587bd8b0d58e8$export$df352805a955aca5.TRANSLATION_OFFSET_BYTES = 0;\n$0a0587bd8b0d58e8$export$df352805a955aca5.NORMAL_OFFSET_BYTES = 12;\n$0a0587bd8b0d58e8$export$df352805a955aca5.ID_COLOR_OFFSET_BYTES = 16;\n$0a0587bd8b0d58e8$export$df352805a955aca5.TEX_COORD_OFFSET_BYTES = 20;\n$0a0587bd8b0d58e8$export$df352805a955aca5.BOUNDS_OFFSET_BYTES = 24;\nclass $0a0587bd8b0d58e8$export$849e31d725692576 {\n    static getIdHover(bufferView, index) {\n        return bufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ID_HOVER_OFFSET_BYTES, true);\n    }\n    static setIdHover(bufferView, index, value) {\n        bufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ID_HOVER_OFFSET_BYTES, value, true);\n    }\n    static copyIdHover(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.ID_HOVER_OFFSET_BYTES, fromBufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.ID_HOVER_OFFSET_BYTES, true), true);\n    }\n    static getTranslation(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setTranslation(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static copyTranslation(fromBufferView, fromIndex, toBufferView, toIndex) {\n        const fromOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.TRANSLATION_OFFSET_BYTES;\n        const toOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.TRANSLATION_OFFSET_BYTES;\n        toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n        toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n        toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n        (0, $91b0cc4981465964$exports).set(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF);\n    }\n    static setColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n        bufferView.setUint8(offset, value[0] * 0xFF);\n        bufferView.setUint8(offset + 1, value[1] * 0xFF);\n    }\n    static copyColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n        const fromOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.COLOR_OFFSET_BYTES;\n        const toOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.COLOR_OFFSET_BYTES;\n        toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n        toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n    }\n    static getOrder(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ORDER_OFFSET_BYTES;\n        (0, $91b0cc4981465964$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true));\n    }\n    static setOrder(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ORDER_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n    }\n    static copyOrder(fromBufferView, fromIndex, toBufferView, toIndex) {\n        const fromOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.ORDER_OFFSET_BYTES;\n        const toOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.ORDER_OFFSET_BYTES;\n        toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n        toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n    }\n    static getScale(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SCALE_OFFSET_BYTES;\n        (0, $31054a6c69637582$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n    }\n    static setScale(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SCALE_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n    }\n    static copyScale(fromBufferView, fromIndex, toBufferView, toIndex) {\n        const fromOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.SCALE_OFFSET_BYTES;\n        const toOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.SCALE_OFFSET_BYTES;\n        toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n        toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n        toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getRotation(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ROTATION_OFFSET_BYTES;\n        (0, $39ece26d1239bb77$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true), bufferView.getFloat32(offset + 12, true));\n    }\n    static setRotation(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ROTATION_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n        bufferView.setFloat32(offset + 12, value[3], true);\n    }\n    static copyRotation(fromBufferView, fromIndex, toBufferView, toIndex) {\n        const fromOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.ROTATION_OFFSET_BYTES;\n        const toOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.ROTATION_OFFSET_BYTES;\n        toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n        toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n        toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n        toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.TEXCOORD_OFFSET_BYTES;\n        (0, $39ece26d1239bb77$exports).set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true), bufferView.getFloat32(offset + 12, true));\n    }\n    static setTexCoord(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.TEXCOORD_OFFSET_BYTES;\n        bufferView.setFloat32(offset, value[0], true);\n        bufferView.setFloat32(offset + 4, value[1], true);\n        bufferView.setFloat32(offset + 8, value[2], true);\n        bufferView.setFloat32(offset + 12, value[3], true);\n    }\n    static copyTexCoord(fromBufferView, fromIndex, toBufferView, toIndex) {\n        const fromOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.TEXCOORD_OFFSET_BYTES;\n        const toOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.TEXCOORD_OFFSET_BYTES;\n        toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n        toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n        toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n        toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getIdColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n        (0, $4c4ac78b213a9c07$exports).set(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n    }\n    static setIdColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n        bufferView.setUint8(offset, value[0] * 0xFF);\n        bufferView.setUint8(offset + 1, value[1] * 0xFF);\n        bufferView.setUint8(offset + 2, value[2] * 0xFF);\n        bufferView.setUint8(offset + 3, value[3] * 0xFF);\n    }\n    static getSelected(bufferView, index) {\n        return bufferView.getInt8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SELECTED_OFFSET_BYTES) / 0x7F;\n    }\n    static setSelected(bufferView, index, value) {\n        bufferView.setInt8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SELECTED_OFFSET_BYTES, value * 0x7F);\n    }\n    static copySelected(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setInt8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.SELECTED_OFFSET_BYTES, fromBufferView.getInt8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.SELECTED_OFFSET_BYTES));\n    }\n    static getRounding(bufferView, index) {\n        return bufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ROUNDING_OFFSET_BYTES, true);\n    }\n    static setRounding(bufferView, index, value) {\n        bufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.ROUNDING_OFFSET_BYTES, value, true);\n    }\n    static copyRounding(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.ROUNDING_OFFSET_BYTES, fromBufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.ROUNDING_OFFSET_BYTES, true), true);\n    }\n    static getParameter1(bufferView, index) {\n        return bufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.PARAMETER_1_OFFSET_BYTES, true);\n    }\n    static setParameter1(bufferView, index, value) {\n        bufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.PARAMETER_1_OFFSET_BYTES, value, true);\n    }\n    static copyParameter1(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.PARAMETER_1_OFFSET_BYTES, fromBufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.PARAMETER_1_OFFSET_BYTES, true), true);\n    }\n    static getParameter2(bufferView, index) {\n        return bufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.PARAMETER_2_OFFSET_BYTES, true);\n    }\n    static setParameter2(bufferView, index, value) {\n        bufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.PARAMETER_2_OFFSET_BYTES, value, true);\n    }\n    static copyParameter2(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.PARAMETER_2_OFFSET_BYTES, fromBufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.PARAMETER_2_OFFSET_BYTES, true), true);\n    }\n    static getMaterial(bufferView, index) {\n        return bufferView.getUint16($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MATERIAL_OFFSET_BYTES);\n    }\n    static setMaterial(bufferView, index, value) {\n        bufferView.setUint16($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MATERIAL_OFFSET_BYTES, value);\n    }\n    static copyMaterial(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setUint16($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.MATERIAL_OFFSET_BYTES, fromBufferView.getUint16($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.MATERIAL_OFFSET_BYTES, true), true);\n    }\n    static getTexture(bufferView, index) {\n        return bufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.TEXTURE_OFFSET_BYTES);\n    }\n    static setTexture(bufferView, index, value) {\n        bufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.TEXTURE_OFFSET_BYTES, value);\n    }\n    static copyTexture(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.TEXTURE_OFFSET_BYTES, fromBufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.TEXTURE_OFFSET_BYTES));\n    }\n    static getSdfBuffer(bufferView, index) {\n        return bufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SDF_BUFFER_OFFSET_BYTES);\n    }\n    static setSdfBuffer(bufferView, index, value) {\n        bufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SDF_BUFFER_OFFSET_BYTES, value);\n    }\n    static copySdfBuffer(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.SDF_BUFFER_OFFSET_BYTES, fromBufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.SDF_BUFFER_OFFSET_BYTES));\n    }\n    static getSdfBorder(bufferView, index) {\n        return bufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SDF_BORDER_OFFSET_BYTES);\n    }\n    static setSdfBorder(bufferView, index, value) {\n        bufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SDF_BORDER_OFFSET_BYTES, value);\n    }\n    static copySdfBorder(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.SDF_BORDER_OFFSET_BYTES, fromBufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.SDF_BORDER_OFFSET_BYTES));\n    }\n    static getMatId(bufferView, index) {\n        return bufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_TYPE_OFFSET_BYTES);\n    }\n    static setMatId(bufferView, index, value) {\n        bufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_TYPE_OFFSET_BYTES, value);\n    }\n    static copyMatId(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.MAT_TYPE_OFFSET_BYTES, fromBufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.MAT_TYPE_OFFSET_BYTES));\n    }\n    static getMatColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_COLOR_OFFSET_BYTES;\n        value[0] = bufferView.getUint16(offset) / 0xFF;\n        value[1] = bufferView.getUint16(offset + 2) / 0xFF;\n        value[2] = bufferView.getUint16(offset + 4) / 0xFF;\n    }\n    static setMatColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_COLOR_OFFSET_BYTES;\n        bufferView.setUint16(offset, value[0] * 0xFF);\n        bufferView.setUint16(offset + 2, value[1] * 0xFF);\n        bufferView.setUint16(offset + 4, value[2] * 0xFF);\n    }\n    static copyMatColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n        const fromOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.MAT_COLOR_OFFSET_BYTES;\n        const toOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.MAT_COLOR_OFFSET_BYTES;\n        toBufferView.setUint16(toOffset, fromBufferView.getUint16(fromOffset));\n        toBufferView.setUint16(toOffset + 2, fromBufferView.getUint16(fromOffset + 2));\n        toBufferView.setUint16(toOffset + 4, fromBufferView.getUint16(fromOffset + 4));\n    }\n    static getMatFuzz(bufferView, index) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_FUZZ_OFFSET_BYTES;\n        return bufferView.getUint8(offset) / 0xFF;\n    }\n    static setMatFuzz(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_FUZZ_OFFSET_BYTES;\n        bufferView.setUint8(offset, value * 0xFF);\n    }\n    static copyMatFuzz(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.MAT_FUZZ_OFFSET_BYTES, fromBufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.MAT_FUZZ_OFFSET_BYTES));\n    }\n    static getMatGloss(bufferView, index) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_GLOSS_OFFSET_BYTES;\n        return bufferView.getUint8(offset) / 0xFF;\n    }\n    static setMatGloss(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_GLOSS_OFFSET_BYTES;\n        bufferView.setUint8(offset, value * 0xFF);\n    }\n    static copyMatGloss(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.MAT_GLOSS_OFFSET_BYTES, fromBufferView.getUint8($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.MAT_GLOSS_OFFSET_BYTES));\n    }\n    static getMatDensity(bufferView, index) {\n        return bufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_DENSITY_OFFSET_BYTES, true);\n    }\n    static setMatDensity(bufferView, index, value) {\n        bufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_DENSITY_OFFSET_BYTES, value, true);\n    }\n    static copyMatDensity(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.MAT_DENSITY_OFFSET_BYTES, fromBufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.MAT_DENSITY_OFFSET_BYTES, true), true);\n    }\n    static getMatRefractiveIndex(bufferView, index) {\n        return bufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true);\n    }\n    static setMatRefractiveIndex(bufferView, index, value) {\n        bufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, value, true);\n    }\n    static copyMatRefractiveIndex(fromBufferView, fromIndex, toBufferView, toIndex) {\n        toBufferView.setFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, fromBufferView.getFloat32($0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true), true);\n    }\n    static getSegColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SEG_COLOR_OFFSET_BYTES;\n        value[0] = bufferView.getUint8(offset) / 0xFF;\n        value[1] = bufferView.getUint8(offset + 1) / 0xFF;\n        value[2] = bufferView.getUint8(offset + 2) / 0xFF;\n        value[3] = bufferView.getUint8(offset + 3) / 0xFF;\n    }\n    static setSegColor(bufferView, index, value) {\n        const offset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * index + this.SEG_COLOR_OFFSET_BYTES;\n        bufferView.setUint8(offset, value[0] * 0xFF);\n        bufferView.setUint8(offset + 1, value[1] * 0xFF);\n        bufferView.setUint8(offset + 2, value[2] * 0xFF);\n        bufferView.setUint8(offset + 3, value[3] * 0xFF);\n    }\n    static copySegColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n        const fromOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * fromIndex + this.SEG_COLOR_OFFSET_BYTES;\n        const toOffset = $0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES * toIndex + this.SEG_COLOR_OFFSET_BYTES;\n        toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n        toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n        toBufferView.setUint8(toOffset + 2, fromBufferView.getUint8(fromOffset + 2));\n        toBufferView.setUint8(toOffset + 3, fromBufferView.getUint8(fromOffset + 3));\n    }\n}\n$0a0587bd8b0d58e8$export$849e31d725692576.SIZE_BYTES = 120;\n$0a0587bd8b0d58e8$export$849e31d725692576.ID_HOVER_OFFSET_BYTES = 0;\n$0a0587bd8b0d58e8$export$849e31d725692576.ID_COLOR_OFFSET_BYTES = 4;\n$0a0587bd8b0d58e8$export$849e31d725692576.ORDER_OFFSET_BYTES = 8;\n$0a0587bd8b0d58e8$export$849e31d725692576.STAGGER_ORDER_OFFSET_BYTES = 12;\n$0a0587bd8b0d58e8$export$849e31d725692576.SELECTED_OFFSET_BYTES = 80;\n$0a0587bd8b0d58e8$export$849e31d725692576.TRANSLATION_OFFSET_BYTES = 16;\n$0a0587bd8b0d58e8$export$849e31d725692576.COLOR_OFFSET_BYTES = 28;\n$0a0587bd8b0d58e8$export$849e31d725692576.MATERIAL_OFFSET_BYTES = 30;\n$0a0587bd8b0d58e8$export$849e31d725692576.SCALE_OFFSET_BYTES = 32;\n$0a0587bd8b0d58e8$export$849e31d725692576.ROUNDING_OFFSET_BYTES = 44;\n$0a0587bd8b0d58e8$export$849e31d725692576.ROTATION_OFFSET_BYTES = 48;\n$0a0587bd8b0d58e8$export$849e31d725692576.TEXCOORD_OFFSET_BYTES = 64;\n$0a0587bd8b0d58e8$export$849e31d725692576.TEXTURE_OFFSET_BYTES = 81;\n$0a0587bd8b0d58e8$export$849e31d725692576.SDF_BUFFER_OFFSET_BYTES = 82;\n$0a0587bd8b0d58e8$export$849e31d725692576.SDF_BORDER_OFFSET_BYTES = 83;\n$0a0587bd8b0d58e8$export$849e31d725692576.PARAMETER_1_OFFSET_BYTES = 84;\n$0a0587bd8b0d58e8$export$849e31d725692576.PARAMETER_2_OFFSET_BYTES = 88;\n$0a0587bd8b0d58e8$export$849e31d725692576.MAT_TYPE_OFFSET_BYTES = 92;\n$0a0587bd8b0d58e8$export$849e31d725692576.MAT_COLOR_OFFSET_BYTES = 112;\n$0a0587bd8b0d58e8$export$849e31d725692576.MAT_FUZZ_OFFSET_BYTES = 96;\n$0a0587bd8b0d58e8$export$849e31d725692576.MAT_GLOSS_OFFSET_BYTES = 97;\n$0a0587bd8b0d58e8$export$849e31d725692576.MAT_DENSITY_OFFSET_BYTES = 100;\n$0a0587bd8b0d58e8$export$849e31d725692576.MAT_REFRACTIVE_INDEX_OFFSET_BYTES = 104;\n$0a0587bd8b0d58e8$export$849e31d725692576.SEG_COLOR_OFFSET_BYTES = 108;\n\n\nclass $636d0ad960a10a23$export$fac54d16266765a9 {\n}\nclass $636d0ad960a10a23$export$bfc5db82fb7164f0 {\n    constructor(core){\n        this._core = core;\n    }\n    read(data) {\n        const start = window.performance.now();\n        const indices = [];\n        const positions = [];\n        const normals = [];\n        const texCoords = [];\n        const meshes = [];\n        const indexOffsets = [];\n        const indexCounts = [];\n        const faceLookup = {};\n        const lines = data.split(\"\\n\");\n        let faceCount = 0;\n        for(let i = 0; i < lines.length; i++){\n            const parts = lines[i].trim().split(\" \");\n            if (parts.length > 0) switch(parts[0]){\n                case \"o\":\n                    meshes.push(parts[1]);\n                    indexOffsets.push(indices.length);\n                    break;\n                case \"v\":\n                    positions.push(parseFloat(parts[1]));\n                    positions.push(parseFloat(parts[2]));\n                    positions.push(parseFloat(parts[3]));\n                    break;\n                case \"vt\":\n                    texCoords.push(parseFloat(parts[1]));\n                    texCoords.push(parseFloat(parts[2]));\n                    break;\n                case \"vn\":\n                    normals.push(parseFloat(parts[1]));\n                    normals.push(parseFloat(parts[2]));\n                    normals.push(parseFloat(parts[3]));\n                    break;\n                case \"f\":\n                    for(let i = 0; i < parts.length - 1; i++){\n                        const part = parts[i + 1];\n                        if (faceLookup[part] == undefined) faceLookup[part] = faceCount++;\n                        indices.push(faceLookup[part]);\n                    }\n                    break;\n                case \"usemtl\":\n                case \"mtllib\":\n                default:\n                    break;\n            }\n        }\n        for(let i = 0; i < meshes.length - 1; i++)indexCounts.push(indexOffsets[i + 1] - indexOffsets[i]);\n        indexCounts.push(indices.length - indexOffsets[meshes.length - 1]);\n        const vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES * Object.keys(faceLookup).length);\n        const dataView = new DataView(vertices);\n        let minX = Number.MAX_VALUE;\n        let minY = Number.MAX_VALUE;\n        let minZ = Number.MAX_VALUE;\n        let maxX = -Number.MAX_VALUE;\n        let maxY = -Number.MAX_VALUE;\n        let maxZ = -Number.MAX_VALUE;\n        const faces = Object.keys(faceLookup);\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        let hasTexCoords, hasNormals;\n        if (faces.length > 0) {\n            const faceParts = faces[0].split(\"/\");\n            hasTexCoords = faceParts.length > 1 && !isNaN(parseInt(faceParts[1]));\n            hasNormals = faceParts.length > 2 && !isNaN(parseInt(faceParts[2]));\n        }\n        for(let i = 0; i < faces.length; i++){\n            const faceParts = faces[i].split(\"/\");\n            let index = (parseInt(faceParts[0]) - 1) * 3;\n            const x = positions[index];\n            const y = positions[index + 1];\n            const z = positions[index + 2];\n            (0, $31054a6c69637582$exports).set(_vec3, x, y, z);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setPosition(dataView, i, _vec3);\n            minX = Math.min(x, minX);\n            minY = Math.min(y, minY);\n            minZ = Math.min(z, minZ);\n            maxX = Math.max(x, maxX);\n            maxY = Math.max(y, maxY);\n            maxZ = Math.max(z, maxZ);\n            if (hasNormals) {\n                index = (parseInt(faceParts[2]) - 1) * 3;\n                (0, $31054a6c69637582$exports).set(_vec3, normals[index], normals[index + 1], normals[index + 2]);\n                (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setNormal(dataView, i, _vec3);\n            }\n            if (hasTexCoords) {\n                index = (parseInt(faceParts[1]) - 1) * 2;\n                (0, $91b0cc4981465964$exports).set(_vec2, texCoords[index], texCoords[index + 1]);\n                (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setTexCoord(dataView, i, _vec2);\n            }\n        }\n        const originX = (minX + maxX) / 2;\n        const originY = (minY + maxY) / 2;\n        const originZ = (minZ + maxZ) / 2;\n        const objMesh = new $636d0ad960a10a23$export$fac54d16266765a9();\n        objMesh.vertices = vertices;\n        objMesh.indices = new Uint16Array(indices);\n        objMesh.meshes = meshes;\n        objMesh.indexOffsets = indexOffsets;\n        objMesh.indexCounts = indexCounts;\n        objMesh.indexCount = indices.length;\n        objMesh.minX = minX;\n        objMesh.minY = minY;\n        objMesh.minZ = minZ;\n        objMesh.maxX = maxX;\n        objMesh.maxY = maxY;\n        objMesh.maxZ = maxZ;\n        objMesh.originX = originX;\n        objMesh.originY = originY;\n        objMesh.originZ = originZ;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `obj loaded ${Math.round(window.performance.now() - start)}ms`);\n        return objMesh;\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $c2c30e4dcf8004c5$export$a15f0a83a652dd40 {\n}\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5\n]);\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.INDICES = new Uint16Array([\n    5,\n    4,\n    1,\n    0,\n    3,\n    4,\n    7,\n    5,\n    6,\n    1,\n    2,\n    3,\n    6,\n    7\n]);\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.CUBE_MAP_INDICES = new Uint16Array([\n    2,\n    3,\n    1,\n    0,\n    4,\n    3,\n    7,\n    2,\n    6,\n    1,\n    5,\n    4,\n    6,\n    7\n]);\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.FACE_NORMALS = [\n    (0, $31054a6c69637582$exports).fromValues(0, 1, 0),\n    (0, $31054a6c69637582$exports).fromValues(1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -1, 0),\n    (0, $31054a6c69637582$exports).fromValues(-1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, 1),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, -1)\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.FACE_POSITIONS = [\n    (0, $31054a6c69637582$exports).fromValues(0.0, 0.5, 0.0),\n    (0, $31054a6c69637582$exports).fromValues(0.5, 0.0, 0.0),\n    (0, $31054a6c69637582$exports).fromValues(0.0, -0.5, 0.0),\n    (0, $31054a6c69637582$exports).fromValues(-0.5, 0.0, 0.0),\n    (0, $31054a6c69637582$exports).fromValues(0.0, 0.0, 0.5),\n    (0, $31054a6c69637582$exports).fromValues(0.0, 0.0, -0.5)\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.FACE_ROTATIONS = [\n    (0, $ba3ca37806a2b6fa$exports).fromValues(1, 0, 0, 0, 0, -1, 0, 1, 0),\n    (0, $ba3ca37806a2b6fa$exports).fromValues(0, 0, -1, 0, 1, 0, 1, 0, 0),\n    (0, $ba3ca37806a2b6fa$exports).fromValues(1, 0, 0, 0, 0, 1, 0, -1, 0),\n    (0, $ba3ca37806a2b6fa$exports).fromValues(0, 0, 1, 0, 1, 0, -1, 0, 0),\n    (0, $ba3ca37806a2b6fa$exports).fromValues(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    (0, $ba3ca37806a2b6fa$exports).fromValues(1, 0, 0, 0, -1, 0, 0, 0, -1)\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.EDGE_POSITIONS = [\n    (0, $31054a6c69637582$exports).fromValues(0, 0.5, 0.5),\n    (0, $31054a6c69637582$exports).fromValues(0.5, 0.5, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 0.5, -0.5),\n    (0, $31054a6c69637582$exports).fromValues(-0.5, 0.5, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -0.5, 0.5),\n    (0, $31054a6c69637582$exports).fromValues(0.5, -0.5, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -0.5, -0.5),\n    (0, $31054a6c69637582$exports).fromValues(-0.5, -0.5, 0),\n    (0, $31054a6c69637582$exports).fromValues(0.5, 0, 0.5),\n    (0, $31054a6c69637582$exports).fromValues(0.5, 0, -0.5),\n    (0, $31054a6c69637582$exports).fromValues(-0.5, 0, -0.5),\n    (0, $31054a6c69637582$exports).fromValues(-0.5, 0, 0.5)\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.EDGE_NORMALS = [\n    (0, $31054a6c69637582$exports).fromValues(0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues(-(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues(-(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0),\n    (0, $31054a6c69637582$exports).fromValues((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues(-(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues(-(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO)\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.EDGE_CORNERS = [\n    [\n        0,\n        1\n    ],\n    [\n        1,\n        5\n    ],\n    [\n        4,\n        5\n    ],\n    [\n        0,\n        4\n    ],\n    [\n        2,\n        3\n    ],\n    [\n        2,\n        6\n    ],\n    [\n        6,\n        7\n    ],\n    [\n        3,\n        7\n    ],\n    [\n        1,\n        2\n    ],\n    [\n        5,\n        6\n    ],\n    [\n        4,\n        7\n    ],\n    [\n        0,\n        3\n    ]\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.EDGE_FACES = [\n    [\n        0,\n        4\n    ],\n    [\n        0,\n        1\n    ],\n    [\n        0,\n        5\n    ],\n    [\n        0,\n        3\n    ],\n    [\n        2,\n        4\n    ],\n    [\n        2,\n        1\n    ],\n    [\n        2,\n        5\n    ],\n    [\n        2,\n        3\n    ],\n    [\n        1,\n        4\n    ],\n    [\n        1,\n        5\n    ],\n    [\n        3,\n        5\n    ],\n    [\n        3,\n        4\n    ]\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.EDGE_AXIS = [\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    1,\n    1,\n    1,\n    1\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.AXIS_EDGES = [\n    [\n        0,\n        2,\n        4,\n        6\n    ],\n    [\n        8,\n        9,\n        10,\n        11\n    ],\n    [\n        1,\n        3,\n        5,\n        7\n    ]\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.AXIS_FACES = [\n    [\n        1,\n        3\n    ],\n    [\n        0,\n        2\n    ],\n    [\n        4,\n        5\n    ]\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.OPPOSITE_FACES = [\n    2,\n    3,\n    0,\n    1,\n    5,\n    4\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.EDGE_POSITIVES = [\n    (0, $31054a6c69637582$exports).fromValues(1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, 1),\n    (0, $31054a6c69637582$exports).fromValues(1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, 1),\n    (0, $31054a6c69637582$exports).fromValues(1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, 1),\n    (0, $31054a6c69637582$exports).fromValues(1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, 1),\n    (0, $31054a6c69637582$exports).fromValues(0, 1, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 1, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 1, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 1, 0)\n];\n$c2c30e4dcf8004c5$export$a15f0a83a652dd40.EDGE_FORWARDS = [\n    (0, $31054a6c69637582$exports).fromValues(0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues(-(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues(-(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0),\n    (0, $31054a6c69637582$exports).fromValues(-(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO),\n    (0, $31054a6c69637582$exports).fromValues(-(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO, 0, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_TWO_OVER_TWO)\n];\n\n\n\nclass $6c3dd367ac3ca617$export$c6e88a9dc8138322 {\n    render(elapsedTime, xrFrame) {}\n    update(elapsedTime) {}\n    constructor(controller){\n        this.controller = controller;\n    }\n}\nclass $6c3dd367ac3ca617$export$bd0bf19f25da8474 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get mMatrix() {\n        return this._mMatrix;\n    }\n    get indexCount() {\n        return this._indexCount;\n    }\n    get vertices() {\n        return this._vertices;\n    }\n    get indices() {\n        return this._indices;\n    }\n    get texture() {\n        return this._texture;\n    }\n    get rayMMatrix() {\n        return this._rayMMatrix;\n    }\n    get rayIndexCount() {\n        return this._rayIndexCount;\n    }\n    get rayVertices() {\n        return this._rayVertices;\n    }\n    get rayIndices() {\n        return this._rayIndices;\n    }\n    constructor(core, options){\n        this._cubeObj = `o Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 -1.000000\nv 1.000000 1.000000 -0.999999\nv 0.999999 1.000000 1.000001\nv -1.000000 1.000000 1.000000\nv -1.000000 1.000000 -1.000000\nvt 1.000000 0.333333\nvt 1.000000 0.666667\nvt 0.666667 0.666667\nvt 0.666667 0.333333\nvt 0.666667 0.000000\nvt 0.000000 0.333333\nvt 0.000000 0.000000\nvt 0.333333 0.000000\nvt 0.333333 1.000000\nvt 0.000000 1.000000\nvt 0.000000 0.666667\nvt 0.333333 0.333333\nvt 0.333333 0.666667\nvt 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.000000 0.000000 1.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\ns off\nf 2/1/1 3/2/1 4/3/1\nf 8/1/2 7/4/2 6/5/2\nf 5/6/3 6/7/3 2/8/3\nf 6/8/4 7/5/4 3/4/4\nf 3/9/5 7/10/5 8/11/5\nf 1/12/6 4/13/6 8/11/6\nf 1/4/1 2/1/1 4/3/1\nf 5/14/2 8/1/2 6/5/2\nf 1/12/3 5/6/3 2/8/3\nf 2/12/4 6/8/4 3/4/4\nf 4/13/5 3/9/5 8/11/5\nf 5/6/6 1/12/6 8/11/6`;\n        this._core = core;\n        this._obj = options.obj;\n        this._texture = options.texture || new ImageData(new Uint8ClampedArray([\n            0,\n            0,\n            0,\n            255\n        ]), 1, 1);\n    }\n    initialize() {\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        this._mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        const objMesh = new (0, $636d0ad960a10a23$export$bfc5db82fb7164f0)(this._core).read(this._obj || this._cubeObj);\n        if (!this._obj) {\n            this.useRayPose = true;\n            const modelThickness = 0.02;\n            const modelLength = 0.1;\n            (0, $31054a6c69637582$exports).set(_vec3, modelThickness, modelThickness, modelLength);\n            (0, $1ac1b59392edf35b$exports).fromScaling(this._mMatrix, _vec3);\n            (0, $31054a6c69637582$exports).set(_vec3, 0, 0, 1);\n            (0, $1ac1b59392edf35b$exports).translate(this._mMatrix, this._mMatrix, _vec3);\n        }\n        this._vertices = objMesh.vertices;\n        this._indices = objMesh.indices;\n        this._indexCount = objMesh.indexCount;\n        this._rayMMatrix = (0, $1ac1b59392edf35b$exports).create();\n        const rayVertices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).POSITIONS;\n        this._rayVertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$6597d9a580deb707).SIZE_BYTES * rayVertices.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE);\n        const rayVerticesView = new DataView(this._rayVertices);\n        const rayIndices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).INDICES;\n        this._rayIndices = new Uint16Array(rayIndices);\n        const rayVertexCount = rayVertices.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE;\n        this._rayIndexCount = rayIndices.length;\n        for(let i = 0; i < rayVertexCount; i++){\n            (0, $31054a6c69637582$exports).set(_vec3, rayVertices[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE], rayVertices[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 1], rayVertices[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 2]);\n            (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).setPosition(rayVerticesView, i, _vec3);\n            (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).setColor(rayVerticesView, i, this._core.config.xrControllerRayColor);\n        }\n        const rayThickness = 0.0025;\n        const rayLength = 10;\n        (0, $31054a6c69637582$exports).set(_vec3, rayThickness, rayThickness, rayLength);\n        (0, $1ac1b59392edf35b$exports).fromScaling(this._rayMMatrix, _vec3);\n        (0, $31054a6c69637582$exports).set(_vec3, 0, 0, -0.5);\n        (0, $1ac1b59392edf35b$exports).translate(this._rayMMatrix, this._rayMMatrix, _vec3);\n        this._isInitialized = true;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, \"controller initialized\");\n    }\n    update(elapsedTime) {}\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $b920b5b69884770f$export$34bcf93e378e8ddd {\n    static fieldOfViewFromProjectionMatrix(p) {\n        return 2 * Math.atan(1 / p[5]);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $2e2b6f93796e9c8a$export$e784925068633981 {\n    render(elapsedTime, xrFrame) {}\n    update(elapsedTime) {}\n    constructor(axes){\n        this.axes = axes;\n    }\n}\nclass $2e2b6f93796e9c8a$export$a0569bcde4468e7f {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    set vMatrix(value) {\n        this._vMatrix = value;\n    }\n    pickGrid(id) {\n        const offset = id * 3;\n        return {\n            divisionX: this._pickGrid[offset] - 1,\n            divisionY: this._pickGrid[offset + 1] - 1,\n            divisionZ: this._pickGrid[offset + 2] - 1\n        };\n    }\n    pickTitle(id) {\n        return {\n            axis: this._pickTitle[id]\n        };\n    }\n    pickLabel(id) {\n        const offset = id * 2;\n        return {\n            axis: this._pickLabel[offset],\n            label: this._pickLabel[offset + 1]\n        };\n    }\n    pickHeading(id) {\n        return {\n            axis: this._pickHeading[id]\n        };\n    }\n    getFromValues(index) {\n        return this._fromValues[index];\n    }\n    setFromValues(index, value) {\n        if (this._fromValues[index] != value) {\n            this._fromValues[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    getToValues(index) {\n        return this._toValues[index];\n    }\n    setToValues(index, value) {\n        if (this._toValues[index] != value) {\n            this._toValues[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    get font() {\n        return this._font;\n    }\n    set font(value) {\n        if (this._font != value) {\n            this._font = value;\n            this._hasChanged = true;\n        }\n    }\n    get gridPickDivisionHeight() {\n        return this._gridPickDivisionHeight;\n    }\n    set gridPickDivisionHeight(value) {\n        if (this._gridPickDivisionHeight != value) {\n            this._gridPickDivisionHeight = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core){\n        this._core = core;\n        this._mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._mvMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._textMetric = {\n            maxTop: 0,\n            width: 0,\n            maxHeight: 0\n        };\n        this._gridPickDivisionHeight = core.config.axesGridPickDivisionHeight;\n        this.textBorderWidth = core.config.textBorderWidth;\n        this.gamma = 0;\n        this.gridMajorThickness = core.config.axesGridMajorThickness;\n        this.gridMinorThickness = core.config.axesGridMinorThickness;\n        this.gridZeroThickness = core.config.axesGridZeroThickness;\n        this._font = core.font;\n        this.isGridPickingEnabled = false;\n    }\n    update(elapsedTime) {}\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $3ce6ee188e300946$export$7005c9eb6671414d {\n    static positions(transform) {\n        const positions = new Float32Array(12);\n        const position = (0, $31054a6c69637582$exports).create();\n        for(let i = 0; i < 4; i++){\n            (0, $31054a6c69637582$exports).set(position, this.POSITIONS[i * 3], this.POSITIONS[i * 3 + 1], this.POSITIONS[i * 3 + 2]);\n            (0, $31054a6c69637582$exports).transformMat4(position, position, transform);\n            positions[i * 3] = position[0];\n            positions[i * 3 + 1] = position[1];\n            positions[i * 3 + 2] = position[2];\n        }\n        return positions;\n    }\n    static textured(transform, texTransform = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY) {\n        const positions = this.positions(transform);\n        const texCoords = this.TEX_COORDS;\n        const vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$538532535e0e8594).SIZE_BYTES * positions.length / 3);\n        const verticesView = new DataView(vertices);\n        const position = (0, $31054a6c69637582$exports).create();\n        const texCoord = (0, $91b0cc4981465964$exports).create();\n        for(let i = 0; i < positions.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE; i++){\n            (0, $31054a6c69637582$exports).set(position, positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 1], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 2]);\n            (0, $91b0cc4981465964$exports).set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n            (0, $91b0cc4981465964$exports).transformMat4(texCoord, texCoord, texTransform);\n            (0, $0a0587bd8b0d58e8$export$538532535e0e8594).setPosition(verticesView, i, position);\n            (0, $0a0587bd8b0d58e8$export$538532535e0e8594).setTexCoord(verticesView, i, texCoord);\n        }\n        return verticesView;\n    }\n    static normalTextured(transform, texTransform = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY) {\n        const positions = this.positions(transform);\n        const texCoords = this.TEX_COORDS;\n        const vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES * positions.length / 3);\n        const verticesView = new DataView(vertices);\n        const position = (0, $31054a6c69637582$exports).create();\n        const texCoord = (0, $91b0cc4981465964$exports).create();\n        const normal3 = (0, $31054a6c69637582$exports).create();\n        const normal4 = (0, $4c4ac78b213a9c07$exports).create();\n        for(let i = 0; i < positions.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE; i++){\n            (0, $31054a6c69637582$exports).set(position, positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 1], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 2]);\n            (0, $91b0cc4981465964$exports).set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n            (0, $91b0cc4981465964$exports).transformMat4(texCoord, texCoord, texTransform);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setPosition(verticesView, i, position);\n            (0, $4c4ac78b213a9c07$exports).set(normal4, 0.0, 0.0, 1.0, 0.0);\n            (0, $4c4ac78b213a9c07$exports).transformMat4(normal4, normal4, transform);\n            (0, $31054a6c69637582$exports).set(normal3, normal4[0], normal4[1], normal4[2]);\n            (0, $31054a6c69637582$exports).normalize(normal3, normal3);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setNormal(verticesView, i, normal3);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setTexCoord(verticesView, i, texCoord);\n        }\n        return verticesView;\n    }\n}\n$3ce6ee188e300946$export$7005c9eb6671414d.FACE_NORMALS = [\n    (0, $31054a6c69637582$exports).fromValues(0, 0, 1),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, -1)\n];\n$3ce6ee188e300946$export$7005c9eb6671414d.FACE_ROTATIONS = [\n    (0, $ba3ca37806a2b6fa$exports).fromValues(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    (0, $ba3ca37806a2b6fa$exports).fromValues(1, 0, 0, 0, -1, 0, 0, 0, -1)\n];\n$3ce6ee188e300946$export$7005c9eb6671414d.EDGE_POSITIONS = [\n    (0, $31054a6c69637582$exports).fromValues(0, 0.5, 0),\n    (0, $31054a6c69637582$exports).fromValues(0.5, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -0.5, 0),\n    (0, $31054a6c69637582$exports).fromValues(-0.5, 0, 0)\n];\n$3ce6ee188e300946$export$7005c9eb6671414d.EDGE_NORMALS = [\n    (0, $31054a6c69637582$exports).fromValues(0, 1, 0),\n    (0, $31054a6c69637582$exports).fromValues(1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, -1, 0),\n    (0, $31054a6c69637582$exports).fromValues(-1, 0, 0)\n];\n$3ce6ee188e300946$export$7005c9eb6671414d.EDGE_POSITIVES = [\n    (0, $31054a6c69637582$exports).fromValues(1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 1, 0),\n    (0, $31054a6c69637582$exports).fromValues(1, 0, 0),\n    (0, $31054a6c69637582$exports).fromValues(0, 1, 0)\n];\n$3ce6ee188e300946$export$7005c9eb6671414d.EDGE_FORWARDS = [\n    (0, $31054a6c69637582$exports).fromValues(0, 0, -1),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, 1),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, 1),\n    (0, $31054a6c69637582$exports).fromValues(0, 0, -1)\n];\n$3ce6ee188e300946$export$7005c9eb6671414d.AXIS_EDGES = [\n    [\n        0,\n        2\n    ],\n    [\n        1,\n        3\n    ]\n];\n$3ce6ee188e300946$export$7005c9eb6671414d.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0,\n    0.5,\n    0.5,\n    0,\n    -0.5,\n    -0.5,\n    0,\n    0.5,\n    -0.5,\n    0\n]);\n$3ce6ee188e300946$export$7005c9eb6671414d.INDICES = new Uint16Array([\n    0,\n    2,\n    1,\n    1,\n    2,\n    3\n]);\n$3ce6ee188e300946$export$7005c9eb6671414d.TEX_COORDS = new Float32Array([\n    0,\n    1,\n    1,\n    1,\n    0,\n    0,\n    1,\n    0\n]);\nclass $3ce6ee188e300946$export$ef2184bd89960b14 {\n    static positions(cols, rows, transform) {\n        const vertices = new Float32Array((cols + 1) * (rows + 1) * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE);\n        const position = (0, $31054a6c69637582$exports).create();\n        let index = 0;\n        for(let row = 0; row <= rows; row++)for(let col = 0; col <= cols; col++){\n            (0, $31054a6c69637582$exports).set(position, col / cols - 0.5, 0.5 - row / rows, 0);\n            (0, $31054a6c69637582$exports).transformMat4(position, position, transform);\n            (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).setPosition(vertices, index++, position);\n        }\n        return vertices;\n    }\n    static indices(cols, rows) {\n        const indices = new Uint16Array(cols * rows * 6);\n        let index = 0;\n        for(let row = 0; row < rows; row++)for(let col = 0; col < cols; col++){\n            indices[index++] = col + row * (cols + 1);\n            indices[index++] = col + (row + 1) * (cols + 1);\n            indices[index++] = col + row * (cols + 1) + 1;\n            indices[index++] = col + row * (cols + 1) + 1;\n            indices[index++] = col + (row + 1) * (cols + 1);\n            indices[index++] = col + (row + 1) * (cols + 1) + 1;\n        }\n        return indices;\n    }\n    static textured(cols, rows, transform, texTransform = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY) {\n        const positions = this.positions(cols, rows, transform);\n        const texCoords = this._texCoords(cols, rows, texTransform);\n        const vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$538532535e0e8594).SIZE_BYTES * positions.length / 3);\n        const verticesView = new DataView(vertices);\n        const position = (0, $31054a6c69637582$exports).create();\n        const texCoord = (0, $91b0cc4981465964$exports).create();\n        let index = 0;\n        for(let i = 0; i < positions.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE; i++){\n            (0, $31054a6c69637582$exports).set(position, positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 1], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 2]);\n            (0, $91b0cc4981465964$exports).set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n            (0, $0a0587bd8b0d58e8$export$538532535e0e8594).setPosition(verticesView, index, position);\n            (0, $0a0587bd8b0d58e8$export$538532535e0e8594).setTexCoord(verticesView, index++, texCoord);\n        }\n        return verticesView;\n    }\n    static normalTextured(cols, rows, transform, texTransform = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY) {\n        const positions = this.positions(cols, rows, transform);\n        const texCoords = this._texCoords(cols, rows, texTransform);\n        const vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES * positions.length / 3);\n        const verticesView = new DataView(vertices);\n        const position = (0, $31054a6c69637582$exports).create();\n        const texCoord = (0, $91b0cc4981465964$exports).create();\n        let index = 0;\n        for(let i = 0; i < positions.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE; i++){\n            (0, $31054a6c69637582$exports).set(position, positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 1], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 2]);\n            (0, $91b0cc4981465964$exports).set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setPosition(verticesView, index, position);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setNormal(verticesView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setTexCoord(verticesView, index++, texCoord);\n        }\n        return verticesView;\n    }\n    static _texCoords(cols, rows, transform) {\n        const texCoords = new Float32Array((cols + 1) * (rows + 1) * 2);\n        const texCoord = (0, $91b0cc4981465964$exports).create();\n        let index = 0;\n        for(let row = 0; row <= rows; row++)for(let col = 0; col <= cols; col++){\n            (0, $91b0cc4981465964$exports).set(texCoord, col / cols, 1 - row / rows);\n            (0, $91b0cc4981465964$exports).transformMat4(texCoord, texCoord, transform);\n            texCoords[index++] = texCoord[0];\n            texCoords[index++] = texCoord[1];\n        }\n        return texCoords;\n    }\n}\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $92acb7820f38feec$export$46c1eaab6b8d1e23 {\n    static continuous(options) {\n        const labels = [];\n        const positions = [];\n        const fromValues = [];\n        const toValues = [];\n        const label = options.label || ((value)=>{\n            return value.toString();\n        });\n        for(let i = 0; i <= options.divisions; i++){\n            positions.push(options.divisions == 0 ? 0.5 : i / options.divisions);\n            const value = options.divisions == 0 ? (options.min + options.max) / 2 : options.min + i * (options.max - options.min) / options.divisions;\n            labels.push(label(value));\n            if (i == 0) fromValues.push(options.min);\n            else if (i < options.divisions) {\n                toValues.push(value);\n                fromValues.push(value);\n            }\n        }\n        toValues.push(options.max);\n        return {\n            labels: labels,\n            positions: positions,\n            fromValues: fromValues,\n            toValues: toValues\n        };\n    }\n    static discrete(options) {\n        const divisions = options.maxDivisions !== undefined ? Math.min(options.divisions, options.maxDivisions) : options.divisions;\n        const divisionStep = 1 / options.divisions;\n        const labelStep = 1 / divisions;\n        const valueStep = (options.max - options.min + 1) / options.divisions;\n        let nextDivision, toValue, nextPosition;\n        const labels = [];\n        const labelPositions = [];\n        const tickPositions = [];\n        const fromValues = [];\n        const toValues = [];\n        const label = options.label || ((value)=>{\n            return value.toString();\n        });\n        const fromToLabel = options.fromToLabel || ((fromValue, toValue)=>{\n            return `${label(fromValue)}-${label(toValue)}`;\n        });\n        for(let i = 0; i < divisions; i++){\n            const division = Math.round(i * labelStep / divisionStep);\n            const tickPosition = division / options.divisions;\n            const fromValue = options.min + Math.ceil(division * valueStep);\n            if (i == divisions - 1) {\n                nextDivision = divisions;\n                nextPosition = 1;\n                toValue = options.max;\n            } else {\n                nextDivision = Math.round((i + 1) * labelStep / divisionStep);\n                nextPosition = nextDivision / options.divisions;\n                toValue = options.min + Math.ceil(nextDivision * valueStep) - 1;\n            }\n            labelPositions.push((tickPosition + nextPosition) / 2);\n            labels.push(fromValue == toValue ? label(fromValue) : fromToLabel(fromValue, toValue));\n            fromValues.push(fromValue);\n            toValues.push(toValue);\n            tickPositions.push(tickPosition);\n        }\n        tickPositions.push(1);\n        return {\n            labels: labels,\n            labelPositions: labelPositions,\n            tickPositions: tickPositions,\n            fromValues: fromValues,\n            toValues: toValues\n        };\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $ee14aeb68f9f83d5$export$f080f423ca93034f {\n    static truncate(text, length) {\n        return text.length > length ? `${text.substr(0, length - 1)}\\u{2026}` : text;\n    }\n    static measure(font, text, size) {\n        size.width = 0;\n        let maxDescent = 0;\n        for (const char of text){\n            let glyph = font.glyphs[char];\n            if (!glyph) {\n                font.addGlyph(char);\n                glyph = font.glyphs[char];\n            }\n            size.width += glyph.advance;\n            size.maxTop = Math.max(glyph.top, size.maxTop);\n            maxDescent = Math.max(glyph.height - glyph.top, maxDescent);\n        }\n        size.maxHeight = size.maxTop + maxDescent;\n    }\n    static wrap(font, text, maxWidth) {\n        const lines = [];\n        let width = 0;\n        let start = 0;\n        let lastBreakingChar = -1;\n        let widthAfterLastBreakingChar = 0;\n        for(let i = 0; i < text.length; i++){\n            let char = text.charAt(i);\n            let glyph = font.glyphs[char];\n            if (!glyph) {\n                font.addGlyph(char);\n                glyph = font.glyphs[char];\n            }\n            width += glyph.advance;\n            if (char == \" \" || char == \"-\") {\n                widthAfterLastBreakingChar = width;\n                lastBreakingChar = i;\n            }\n            if (width > maxWidth) {\n                if (lastBreakingChar == -1) {\n                    lines.push(text.substring(start, i));\n                    start = i;\n                    width += glyph.advance;\n                } else {\n                    lines.push(text.substring(start, lastBreakingChar));\n                    start = lastBreakingChar + 1;\n                    width -= widthAfterLastBreakingChar;\n                    widthAfterLastBreakingChar = 0;\n                    lastBreakingChar = -1;\n                }\n            }\n        }\n        lines.push(text.substring(start, text.length));\n        return lines;\n    }\n    static addString(font, text, vertices, indices, index, position, scale, offset, rotation, idColor) {\n        for (const char of text)this.addGlyph(font, char, vertices, indices, index++, position, scale, offset, rotation, idColor);\n    }\n    static addGlyph(font, char, vertices, indices, index, position, scale, offset, rotation, idColor) {\n        let glyph = font.glyphs[char];\n        if (!glyph) {\n            font.addGlyph(char);\n            glyph = font.glyphs[char];\n        }\n        const vertexOffset = index * 4;\n        const width = glyph.width * scale;\n        const height = glyph.height * scale;\n        const top = glyph.top * scale;\n        const border = font.border * scale;\n        const x0 = offset[0] - border;\n        const x1 = offset[0] + width + border;\n        const y0 = offset[1] + top + border;\n        const y1 = offset[1] + top - height - border;\n        const z0 = offset[2];\n        (0, $31054a6c69637582$exports).set(this._topLeft, x0, y0, z0);\n        (0, $31054a6c69637582$exports).set(this._topRight, x1, y0, z0);\n        (0, $31054a6c69637582$exports).set(this._bottomLeft, x0, y1, z0);\n        (0, $31054a6c69637582$exports).set(this._bottomRight, x1, y1, z0);\n        if (rotation) {\n            (0, $31054a6c69637582$exports).transformQuat(this._topLeft, this._topLeft, rotation);\n            (0, $31054a6c69637582$exports).transformQuat(this._topRight, this._topRight, rotation);\n            (0, $31054a6c69637582$exports).transformQuat(this._bottomLeft, this._bottomLeft, rotation);\n            (0, $31054a6c69637582$exports).transformQuat(this._bottomRight, this._bottomRight, rotation);\n        }\n        (0, $31054a6c69637582$exports).add(this._vec3, this._topLeft, position);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setPosition(vertices, vertexOffset, this._vec3);\n        (0, $31054a6c69637582$exports).add(this._vec3, this._topRight, position);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setPosition(vertices, vertexOffset + 1, this._vec3);\n        (0, $31054a6c69637582$exports).add(this._vec3, this._bottomLeft, position);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setPosition(vertices, vertexOffset + 2, this._vec3);\n        (0, $31054a6c69637582$exports).add(this._vec3, this._bottomRight, position);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setPosition(vertices, vertexOffset + 3, this._vec3);\n        (0, $91b0cc4981465964$exports).set(this._vec2, glyph.u0, glyph.v0);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setTexCoord(vertices, vertexOffset, this._vec2);\n        (0, $91b0cc4981465964$exports).set(this._vec2, glyph.u1, glyph.v0);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setTexCoord(vertices, vertexOffset + 1, this._vec2);\n        (0, $91b0cc4981465964$exports).set(this._vec2, glyph.u0, glyph.v1);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setTexCoord(vertices, vertexOffset + 2, this._vec2);\n        (0, $91b0cc4981465964$exports).set(this._vec2, glyph.u1, glyph.v1);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setTexCoord(vertices, vertexOffset + 3, this._vec2);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setIdColor(vertices, vertexOffset, idColor);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setIdColor(vertices, vertexOffset + 1, idColor);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setIdColor(vertices, vertexOffset + 2, idColor);\n        (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).setIdColor(vertices, vertexOffset + 3, idColor);\n        offset[0] += glyph.advance * scale;\n        const indexTemplate = (0, $3ce6ee188e300946$export$7005c9eb6671414d).INDICES;\n        const indexOffset = index * 6;\n        for(let i = 0; i < 6; i++)indices[indexOffset + i] = indexTemplate[i] + vertexOffset;\n    }\n}\n$ee14aeb68f9f83d5$export$f080f423ca93034f._vec2 = (0, $91b0cc4981465964$exports).create();\n$ee14aeb68f9f83d5$export$f080f423ca93034f._vec3 = (0, $31054a6c69637582$exports).create();\n$ee14aeb68f9f83d5$export$f080f423ca93034f._topLeft = (0, $31054a6c69637582$exports).create();\n$ee14aeb68f9f83d5$export$f080f423ca93034f._topRight = (0, $31054a6c69637582$exports).create();\n$ee14aeb68f9f83d5$export$f080f423ca93034f._bottomLeft = (0, $31054a6c69637582$exports).create();\n$ee14aeb68f9f83d5$export$f080f423ca93034f._bottomRight = (0, $31054a6c69637582$exports).create();\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $a60d0d861ccf87e8$export$aadd933e49c67c12 {\n    static nextPickId() {\n        return this._pickId++;\n    }\n    static encodeNumber(number, type, color) {\n        const encoded = number | $a60d0d861ccf87e8$export$aadd933e49c67c12.encodeType(type);\n        $a60d0d861ccf87e8$export$aadd933e49c67c12.float32ToVec4(encoded, color);\n    }\n    static decodeNumber(color) {\n        return color[0] + (color[1] << 8) + (color[2] << 16);\n    }\n    static encodeVec3(vec3, type, color) {\n        const encoded = vec3[0] | vec3[1] << 8 | vec3[2] << 16 | $a60d0d861ccf87e8$export$aadd933e49c67c12.encodeType(type);\n        $a60d0d861ccf87e8$export$aadd933e49c67c12.float32ToVec4(encoded, color);\n    }\n    static decodeVec3(color, axes) {\n        axes[0] = color[0];\n        axes[1] = color[1];\n        axes[2] = color[2];\n    }\n    static encodeType(type) {\n        return type << 24;\n    }\n    static decodeType(color) {\n        return color[3];\n    }\n    static float32ToVec4(number, color) {\n        color[0] = ((number & 0xFF) >>> 0) / 0xFF;\n        color[1] = ((number & 0xFF00) >>> 8) / 0xFF;\n        color[2] = ((number & 0xFF0000) >>> 16) / 0xFF;\n        color[3] = ((number & 0xFF000000) >>> 24) / 0xFF;\n    }\n    static uint8ArrayToNumber(color) {\n        return color[0] + (color[1] << 8) + (color[2] << 16) + (color[3] << 24);\n    }\n}\n$a60d0d861ccf87e8$export$aadd933e49c67c12._pickId = 1;\n\n\nclass $4cd1e156df302e7a$export$a623f6a4669f174c {\n    static create(core, options) {\n        const cartesian3dAxes = new $4cd1e156df302e7a$export$b1b08d445768978(core);\n        const minBoundsX = options.minBoundsX === undefined ? 0 : options.minBoundsX;\n        const minBoundsY = options.minBoundsY === undefined ? 0 : options.minBoundsY;\n        const minBoundsZ = options.minBoundsZ === undefined ? 0 : options.minBoundsZ;\n        const maxBoundsX = options.maxBoundsX === undefined ? 1 : options.maxBoundsX;\n        const maxBoundsY = options.maxBoundsY === undefined ? 1 : options.maxBoundsY;\n        const maxBoundsZ = options.maxBoundsZ === undefined ? 1 : options.maxBoundsZ;\n        const minValueX = options.minValueX === undefined ? 0 : options.minValueX;\n        const minValueY = options.minValueY === undefined ? 0 : options.minValueY;\n        const minValueZ = options.minValueZ === undefined ? 0 : options.minValueZ;\n        const maxValueX = options.maxValueX === undefined ? 1 : options.maxValueX;\n        const maxValueY = options.maxValueY === undefined ? 1 : options.maxValueY;\n        const maxValueZ = options.maxValueZ === undefined ? 1 : options.maxValueZ;\n        const scaling = options.scaling === undefined ? 1 : options.scaling;\n        cartesian3dAxes.minBoundsX = minBoundsX;\n        cartesian3dAxes.minBoundsY = minBoundsY;\n        cartesian3dAxes.minBoundsZ = minBoundsZ;\n        cartesian3dAxes.maxBoundsX = maxBoundsX;\n        cartesian3dAxes.maxBoundsY = maxBoundsY;\n        cartesian3dAxes.maxBoundsZ = maxBoundsZ;\n        cartesian3dAxes.scalingX = scaling;\n        cartesian3dAxes.scalingY = scaling;\n        cartesian3dAxes.scalingZ = scaling;\n        const maxLength = Math.max(maxBoundsX - minBoundsX, Math.max(maxBoundsY - minBoundsY, maxBoundsZ - minBoundsZ));\n        const requestedDivisions = [\n            options.divisionsX == undefined ? Math.max(Math.floor(core.config.axesGridDefaultDivisions * (maxBoundsX - minBoundsX) / maxLength), 1) : options.divisionsX,\n            options.divisionsY == undefined ? Math.max(Math.floor(core.config.axesGridDefaultDivisions * (maxBoundsY - minBoundsY) / maxLength), 1) : options.divisionsY,\n            options.divisionsZ == undefined ? Math.max(Math.floor(core.config.axesGridDefaultDivisions * (maxBoundsZ - minBoundsZ) / maxLength), 1) : options.divisionsZ\n        ];\n        const minorGridlines = [\n            options.minorGridlinesX == undefined ? 2 : options.minorGridlinesX,\n            options.minorGridlinesY == undefined ? 2 : options.minorGridlinesY,\n            options.minorGridlinesZ == undefined ? 2 : options.minorGridlinesZ\n        ];\n        const labelMajorSizes = [\n            options.labelMajorSizeX === undefined ? core.config.axesTextLabelMajorSize : options.labelMajorSizeX,\n            options.labelMajorSizeY === undefined ? core.config.axesTextLabelMajorSize : options.labelMajorSizeY,\n            options.labelMajorSizeZ === undefined ? core.config.axesTextLabelMajorSize : options.labelMajorSizeZ\n        ];\n        const labelMinorSizes = [\n            options.labelMinorSizeX === undefined ? core.config.axesTextLabelMinorSize : options.labelMinorSizeX,\n            options.labelMinorSizeY === undefined ? core.config.axesTextLabelMinorSize : options.labelMinorSizeY,\n            options.labelMinorSizeZ === undefined ? core.config.axesTextLabelMinorSize : options.labelMinorSizeZ\n        ];\n        cartesian3dAxes.isDiscreteX = options.isDiscreteX;\n        cartesian3dAxes.isDiscreteY = options.isDiscreteY;\n        cartesian3dAxes.isDiscreteZ = options.isDiscreteZ;\n        cartesian3dAxes.isGridPickingEnabled = options.isGridPickingEnabled;\n        const isDivisionPickingEnabledArray = [\n            options.isDivisionPickingEnabledX,\n            options.isDivisionPickingEnabledY,\n            options.isDivisionPickingEnabledZ\n        ];\n        const isLabelPickingEnabledArray = [\n            options.isLabelPickingEnabledX,\n            options.isLabelPickingEnabledY,\n            options.isLabelPickingEnabledZ\n        ];\n        const isAxisReversed = [\n            options.reverseX,\n            options.reverseY,\n            options.reverseZ\n        ];\n        const labelsArray = [\n            options.labelsX,\n            options.labelsY,\n            options.labelsZ\n        ];\n        const labelOrientationsArray = [\n            options.labelOrientationX,\n            options.labelOrientationY,\n            options.labelOrientationZ\n        ];\n        const labelOrientationDefaultArray = [\n            (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel,\n            (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular,\n            (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel\n        ];\n        const areTicksVisibleArray = [\n            options.arePickDivisionsVisibleX,\n            options.arePickDivisionsVisibleY,\n            options.arePickDivisionsVisibleZ\n        ];\n        const minValueArray = [\n            minValueX,\n            minValueY,\n            minValueZ\n        ];\n        const maxValueArray = [\n            maxValueX,\n            maxValueY,\n            maxValueZ\n        ];\n        const isDiscreteArray = [\n            options.isDiscreteX,\n            options.isDiscreteY,\n            options.isDiscreteZ\n        ];\n        const titleArray = [\n            options.titleX,\n            options.titleY,\n            options.titleZ\n        ];\n        const titleSizeArray = [\n            options.titleSizeX,\n            options.titleSizeY,\n            options.titleSizeZ\n        ];\n        const headingArray = [\n            options.headingX,\n            options.headingY,\n            options.headingZ\n        ];\n        const headingSizeArray = [\n            options.headingSizeX,\n            options.headingSizeY,\n            options.headingSizeZ\n        ];\n        for(let axisId = 0; axisId < 3; axisId++){\n            const label = labelsArray[axisId];\n            const minValue = minValueArray[axisId];\n            const maxValue = maxValueArray[axisId];\n            const discrete = isDiscreteArray[axisId];\n            if (discrete) {\n                const divisions = maxValue - minValue + 1;\n                const maxDivisions = Math.min(requestedDivisions[axisId], divisions);\n                const discreteAxisOptions = {\n                    min: minValue,\n                    max: maxValue,\n                    divisions: divisions,\n                    maxDivisions: maxDivisions,\n                    label: label\n                };\n                const discreteAxis = (0, $92acb7820f38feec$export$46c1eaab6b8d1e23).discrete(discreteAxisOptions);\n                cartesian3dAxes.setTickPositions(axisId, discreteAxis.tickPositions);\n                cartesian3dAxes.setLabelPositions(axisId, discreteAxis.labelPositions);\n                cartesian3dAxes.setLabels(axisId, discreteAxis.labels);\n                cartesian3dAxes.setFromValues(axisId, discreteAxis.fromValues);\n                cartesian3dAxes.setToValues(axisId, discreteAxis.toValues);\n                cartesian3dAxes.setLabelSizes(axisId, Array(discreteAxis.labels.length).fill(labelMajorSizes[axisId]));\n                cartesian3dAxes.minorGridlines[axisId] = 1;\n            } else {\n                const divisions = requestedDivisions[axisId];\n                const continuousAxisOptions = {\n                    min: minValue,\n                    max: maxValue,\n                    divisions: divisions,\n                    label: label\n                };\n                const continuousAxis = (0, $92acb7820f38feec$export$46c1eaab6b8d1e23).continuous(continuousAxisOptions);\n                cartesian3dAxes.setTickPositions(axisId, continuousAxis.positions);\n                cartesian3dAxes.setLabelPositions(axisId, continuousAxis.positions);\n                cartesian3dAxes.setLabels(axisId, continuousAxis.labels);\n                cartesian3dAxes.setFromValues(axisId, continuousAxis.fromValues);\n                cartesian3dAxes.setToValues(axisId, continuousAxis.toValues);\n                const labelSizes = [];\n                for(let i = 0; i < continuousAxis.labels.length; i++)labelSizes.push(i == 0 || i == divisions ? labelMajorSizes[axisId] : labelMinorSizes[axisId]);\n                cartesian3dAxes.setLabelSizes(axisId, labelSizes);\n                cartesian3dAxes.minorGridlines[axisId] = minorGridlines[axisId];\n            }\n            cartesian3dAxes.setLabelOrientation(axisId, labelOrientationsArray[axisId] === undefined ? labelOrientationDefaultArray[axisId] : labelOrientationsArray[axisId]);\n            cartesian3dAxes.setTitle(axisId, titleArray[axisId]);\n            cartesian3dAxes.setTitleSize(axisId, titleSizeArray[axisId] === undefined ? core.config.axesTextTitleSize : titleSizeArray[axisId]);\n            cartesian3dAxes.setHeading(axisId, headingArray[axisId]);\n            cartesian3dAxes.setHeadingSize(axisId, headingSizeArray[axisId] === undefined ? core.config.axesTextHeadingSize : headingSizeArray[axisId]);\n            cartesian3dAxes.arePickDivisionsVisible[axisId] = areTicksVisibleArray[axisId] === undefined ? true : areTicksVisibleArray[axisId];\n            cartesian3dAxes.isDivisionPickingEnabled[axisId] = isDivisionPickingEnabledArray[axisId];\n            cartesian3dAxes.isLabelPickingEnabled[axisId] = isLabelPickingEnabledArray[axisId];\n            cartesian3dAxes.isAxisReversed[axisId] = isAxisReversed[axisId];\n            if (minValue <= 0 && maxValue >= 0 && minValue != maxValue) cartesian3dAxes.zero[axisId] = -minValue / (maxValue - minValue);\n            else cartesian3dAxes.zero[axisId] = -Number.MAX_VALUE;\n        }\n        return cartesian3dAxes;\n    }\n}\nclass $4cd1e156df302e7a$export$b1b08d445768978 extends (0, $2e2b6f93796e9c8a$export$a0569bcde4468e7f) {\n    get size() {\n        return this._size;\n    }\n    get isDiscreteX() {\n        return this._isDiscrete[0];\n    }\n    set isDiscreteX(value) {\n        if (value != this._isDiscrete[0]) {\n            this._isDiscrete[0] = value;\n            this._hasChanged = true;\n        }\n    }\n    get isDiscreteY() {\n        return this._isDiscrete[1];\n    }\n    set isDiscreteY(value) {\n        if (value != this._isDiscrete[1]) {\n            this._isDiscrete[1] = value;\n            this._hasChanged = true;\n        }\n    }\n    get isDiscreteZ() {\n        return this._isDiscrete[2];\n    }\n    set isDiscreteZ(value) {\n        if (value != this._isDiscrete[2]) {\n            this._isDiscrete[2] = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsX() {\n        return this._minBoundsX;\n    }\n    set minBoundsX(value) {\n        if (value != this._minBoundsX) {\n            this._minBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsX() {\n        return this._maxBoundsX;\n    }\n    set maxBoundsX(value) {\n        if (value != this._minBoundsX) {\n            this._maxBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsY() {\n        return this._minBoundsY;\n    }\n    set minBoundsY(value) {\n        if (value != this._minBoundsY) {\n            this._minBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsY() {\n        return this._maxBoundsY;\n    }\n    set maxBoundsY(value) {\n        if (value != this._minBoundsY) {\n            this._maxBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsZ() {\n        return this._minBoundsZ;\n    }\n    set minBoundsZ(value) {\n        if (value != this._minBoundsZ) {\n            this._minBoundsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsZ() {\n        return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value) {\n        if (value != this._minBoundsZ) {\n            this._maxBoundsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    getIsOutsideEdge(index) {\n        return this._isOutsideEdge[index];\n    }\n    getIsForwardFace(index) {\n        return this._isForwardFace[index];\n    }\n    get textVertices() {\n        return this._textVertices;\n    }\n    get textIndices() {\n        return this._textIndices;\n    }\n    getLabelMMatrix(index) {\n        return this._labelMMatrices[index];\n    }\n    setLabelPositions(index, value) {\n        if (this._labelPositions[index] != value) {\n            this._labelPositions[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    setLabels(index, value) {\n        if (this._labels[index] != value) {\n            this._labels[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    setLabelSizes(index, value) {\n        if (this._labelSizes[index] != value) {\n            this._labelSizes[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    getLabelOrientation(index) {\n        return this._orientations[index];\n    }\n    setLabelOrientation(index, orientation) {\n        if (this._orientations[index] != orientation) {\n            this._orientations[index] = orientation;\n            this._hasChanged = true;\n        }\n    }\n    getTitleIndexCount(index) {\n        return this._titleIndexCounts[index];\n    }\n    getTitleIndexOffset(index) {\n        return this._titleIndexOffsets[index];\n    }\n    getTitleMMatrix(index) {\n        return this._titleMMatrices[index];\n    }\n    setTitle(index, value) {\n        if (this._titles[index] != value) {\n            this._titles[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    setTitleSize(index, value) {\n        if (this._titleSizes[index] != value) {\n            this._titleSizes[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    getHeadingIndexCount(index) {\n        return this._headingIndexCounts[index];\n    }\n    getHeadingIndexOffset(index) {\n        return this._headingIndexOffsets[index];\n    }\n    getHeadingMMatrix(index) {\n        return this._headingMMatrices[index];\n    }\n    setHeading(index, value) {\n        if (this._headings[index] != value) {\n            this._headings[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    setHeadingSize(index, value) {\n        if (this._headingSizes[index] != value) {\n            this._headingSizes[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    getIsLeftToRightHorizontal(index) {\n        return this._isLeftToRightHorizontal[index];\n    }\n    getIsLeftToRightVertical(index) {\n        return this._isLeftToRightVertical[index];\n    }\n    getAxesLeftToRightIndexCount(index) {\n        return this._axesLeftToRightIndexCounts[index];\n    }\n    getAxesRightToLeftIndexCount(index) {\n        return this._axesRightToLeftIndexCounts[index];\n    }\n    getAxesLeftToRightIndexOffset(index) {\n        return this._axesLeftToRightIndexOffsets[index];\n    }\n    getAxesRightToLeftIndexOffset(index) {\n        return this._axesRightToLeftIndexOffsets[index];\n    }\n    get gridVertices() {\n        return this._gridVertices;\n    }\n    get gridIndices() {\n        return this._gridIndices;\n    }\n    getGridTicksIndexCount(index) {\n        return this._gridTicksIndexCounts[index];\n    }\n    getGridTicksIndexOffset(index) {\n        return this._gridTicksIndexOffsets[index];\n    }\n    getGridFaceIndexCount(index) {\n        return this._gridFaceIndexCounts[index];\n    }\n    getGridFaceIndexOffset(index) {\n        return this._gridFaceIndexOffsets[index];\n    }\n    getGridTicksMMatrix(index) {\n        return this._gridTicksMMatrices[index];\n    }\n    getGridFaceMMatrix(index) {\n        return this._gridFaceMMatrices[index];\n    }\n    getGridTicksScale(index) {\n        return this._gridTicksScales[index];\n    }\n    getGridFaceZero(index) {\n        return this._gridFaceZeros[index];\n    }\n    getGridTicksZero(index) {\n        return this._gridTicksZeros[index];\n    }\n    getGridFaceMinorGridlines(index) {\n        return this._gridFaceMinorGridlines[index];\n    }\n    getGridTicksMinorGridlines(index) {\n        return this._gridTicksMinorGridlines[index];\n    }\n    setTickPositions(index, value) {\n        if (this._gridTicksPositions[index] != value) {\n            this._gridTicksPositions[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    get scalingX() {\n        return this._scalingX;\n    }\n    set scalingX(value) {\n        if (value != this._scalingX) {\n            this._scalingX = value;\n            this._hasChanged = true;\n        }\n    }\n    get scalingY() {\n        return this._scalingY;\n    }\n    set scalingY(value) {\n        if (value != this._scalingY) {\n            this._scalingY = value;\n            this._hasChanged = true;\n        }\n    }\n    get scalingZ() {\n        return this._scalingZ;\n    }\n    set scalingZ(value) {\n        if (value != this._scalingZ) {\n            this._scalingZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetX() {\n        return this._offset[12];\n    }\n    set offsetX(value) {\n        if (value != this._offset[12]) this._offset[12] = value;\n    }\n    get offsetY() {\n        return this._offset[13];\n    }\n    set offsetY(value) {\n        if (value != this._offset[13]) this._offset[13] = value;\n    }\n    get offsetZ() {\n        return this._offset[14];\n    }\n    set offsetZ(value) {\n        if (value != this._offset[14]) this._offset[14] = value;\n    }\n    constructor(core){\n        super(core);\n        this._size = (0, $31054a6c69637582$exports).create();\n        this._translation = (0, $31054a6c69637582$exports).create();\n        this._normal = (0, $31054a6c69637582$exports).create();\n        this._forward = (0, $31054a6c69637582$exports).create();\n        this._right = (0, $31054a6c69637582$exports).create();\n        this._up = (0, $31054a6c69637582$exports).create();\n        this._texCoord = (0, $91b0cc4981465964$exports).create();\n        this._bounds = (0, $4c4ac78b213a9c07$exports).create();\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._vec4 = (0, $4c4ac78b213a9c07$exports).create();\n        this._mat3 = (0, $ba3ca37806a2b6fa$exports).create();\n        this._isDiscrete = [\n            false,\n            false,\n            false\n        ];\n        this._minBoundsX = 0;\n        this._minBoundsY = 0;\n        this._minBoundsZ = 0;\n        this._maxBoundsX = 0;\n        this._maxBoundsY = 0;\n        this._maxBoundsZ = 0;\n        this._isForwardFace = [];\n        this._isForwardEdge = [];\n        this._isOutsideEdge = [];\n        for(let i = 0; i < 6; i++)this._isForwardFace.push(false);\n        for(let i = 0; i < 12; i++){\n            this._isForwardEdge.push(false);\n            this._isOutsideEdge.push(false);\n        }\n        this._textOffset = (0, $31054a6c69637582$exports).create();\n        this._textPosition = (0, $31054a6c69637582$exports).create();\n        this._distances = [];\n        for(let i = 0; i < 12; i++)this._distances.push(0);\n        this._labelPositions = [];\n        this._labels = [];\n        this._labelSizes = [];\n        this._maxLabelSize = [];\n        this._axesLeftToRightIndexCounts = [];\n        this._axesRightToLeftIndexCounts = [];\n        this._axesLeftToRightIndexOffsets = [];\n        this._axesRightToLeftIndexOffsets = [];\n        this._labelMMatrices = [];\n        this._orientations = [];\n        for(let i = 0; i < 3; i++){\n            this._maxLabelSize.push((0, $91b0cc4981465964$exports).create());\n            this._orientations.push((0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel);\n            this._axesLeftToRightIndexCounts.push(0);\n            this._axesRightToLeftIndexCounts.push(0);\n            this._axesLeftToRightIndexOffsets.push(0);\n            this._axesRightToLeftIndexOffsets.push(0);\n        }\n        for(let i = 0; i < 12; i++)this._labelMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n        this._titles = [];\n        this._titleSizes = [];\n        this._titleIndexCounts = [];\n        this._titleIndexOffsets = [];\n        this._titleMMatrices = [];\n        for(let i = 0; i < 3; i++){\n            this._titles.push(null);\n            this._titleSizes.push(core.config.axesTextTitleSize);\n            this._titleIndexCounts.push(0);\n            this._titleIndexOffsets.push(0);\n        }\n        for(let i = 0; i < 12; i++)this._titleMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n        this._headings = [];\n        this._headingSizes = [];\n        this._headingIndexCounts = [];\n        this._headingIndexOffsets = [];\n        this._headingMMatrices = [];\n        this.isHeadingVisible = [];\n        for(let i = 0; i < 3; i++){\n            this._headings.push(null);\n            this._headingSizes.push(core.config.axesTextHeadingSize);\n            this._headingIndexCounts.push(0);\n            this._headingIndexOffsets.push(0);\n        }\n        for(let i = 0; i < 12; i++){\n            this._headingMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n            this.isHeadingVisible.push(true);\n        }\n        this.isEdgeVisible = [];\n        this._edgePosition = (0, $31054a6c69637582$exports).create();\n        this._edgePositive = (0, $31054a6c69637582$exports).create();\n        this._edgeNormal = (0, $31054a6c69637582$exports).create();\n        this._edgeNormalTemp = (0, $31054a6c69637582$exports).create();\n        this._edgePositiveTemp = (0, $31054a6c69637582$exports).create();\n        this._isLeftToRightHorizontal = [];\n        this._isLeftToRightVertical = [];\n        this._edgeHorizontalRight = [];\n        this._edgeHorizontalUp = [];\n        this._edgeHorizontalForward = [];\n        this._edgeVerticalRight = [];\n        this._edgeVerticalUp = [];\n        this._edgeVerticalForward = [];\n        for(let i = 0; i < 12; i++){\n            this.isEdgeVisible.push(true);\n            this._isLeftToRightHorizontal.push(false);\n            this._isLeftToRightVertical.push(false);\n            this._edgeHorizontalRight.push((0, $31054a6c69637582$exports).create());\n            this._edgeHorizontalUp.push((0, $31054a6c69637582$exports).create());\n            this._edgeHorizontalForward.push((0, $31054a6c69637582$exports).create());\n            this._edgeVerticalRight.push((0, $31054a6c69637582$exports).create());\n            this._edgeVerticalUp.push((0, $31054a6c69637582$exports).create());\n            this._edgeVerticalForward.push((0, $31054a6c69637582$exports).create());\n        }\n        this.isFaceVisible = [];\n        for(let i = 0; i < 6; i++)this.isFaceVisible.push(true);\n        this.arePickDivisionsVisible = [];\n        this.areFacesVisible = [];\n        this._indexTemplate = (0, $3ce6ee188e300946$export$7005c9eb6671414d).INDICES;\n        this.zero = (0, $31054a6c69637582$exports).create();\n        this._gridTicksZeros = [];\n        this._gridFaceZeros = [];\n        this.minorGridlines = (0, $31054a6c69637582$exports).fromValues(1, 1, 1);\n        this._gridTicksMinorGridlines = [];\n        this._gridFaceMinorGridlines = [];\n        this._gridTicksPositions = [];\n        this._gridTicksScales = [];\n        this._gridTicksIndexCounts = [];\n        this._gridTicksIndexOffsets = [];\n        this._gridFaceScale = (0, $31054a6c69637582$exports).create();\n        this._gridFaceIndexCounts = [];\n        this._gridFaceIndexOffsets = [];\n        this._gridFaceMMatrices = [];\n        this._gridTicksMMatrices = [];\n        this._gridTicksRotations = [];\n        for(let i = 0; i < 3; i++){\n            this.arePickDivisionsVisible.push(true);\n            this.areFacesVisible.push(true);\n            this._gridTicksZeros.push((0, $91b0cc4981465964$exports).create());\n            this._gridFaceZeros.push((0, $91b0cc4981465964$exports).create());\n            this._gridTicksMinorGridlines.push((0, $91b0cc4981465964$exports).create());\n            this._gridFaceMinorGridlines.push((0, $91b0cc4981465964$exports).create());\n            this._gridTicksScales.push((0, $31054a6c69637582$exports).create());\n            this._gridTicksIndexCounts.push(0);\n            this._gridTicksIndexOffsets.push(0);\n        }\n        for(let i = 0; i < 6; i++){\n            this._gridFaceIndexCounts.push(0);\n            this._gridFaceIndexOffsets.push(0);\n            this._gridFaceMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n        }\n        for(let i = 0; i < 12; i++){\n            this._gridTicksMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n            this._gridTicksRotations.push((0, $1ac1b59392edf35b$exports).create());\n            const _mat4 = this._gridTicksRotations[i];\n            _mat4[0] = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[i][0];\n            _mat4[1] = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[i][1];\n            _mat4[2] = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[i][2];\n            _mat4[4] = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[i][0];\n            _mat4[5] = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[i][1];\n            _mat4[6] = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[i][2];\n            (0, $31054a6c69637582$exports).cross(this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[i], (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[i]);\n            _mat4[8] = this._vec3[0];\n            _mat4[9] = this._vec3[1];\n            _mat4[10] = this._vec3[2];\n        }\n        this._fromValues = [\n            null,\n            null,\n            null\n        ];\n        this._toValues = [\n            null,\n            null,\n            null\n        ];\n        this.isDivisionPickingEnabled = [\n            false,\n            false,\n            false\n        ];\n        this.isLabelPickingEnabled = [\n            false,\n            false,\n            false\n        ];\n        this.isTitlePickingEnabled = [\n            false,\n            false,\n            false\n        ];\n        this.isHeadingPickingEnabled = [\n            false,\n            false,\n            false\n        ];\n        this.isAxisReversed = [\n            false,\n            false,\n            false\n        ];\n        this._scalingX = 1;\n        this._scalingY = 1;\n        this._scalingZ = 1;\n        this._offset = (0, $1ac1b59392edf35b$exports).create();\n    }\n    initialize() {\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this.isInitialized) {\n            if (this._hasChanged) {\n                const start = window.performance.now();\n                this._hasChanged = false;\n                (0, $31054a6c69637582$exports).set(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, this._maxBoundsZ - this._minBoundsZ);\n                const maxBounds = Math.max(this._size[0], Math.max(this._size[1], this._size[2]));\n                this._size[0] *= this._scalingX / maxBounds;\n                this._size[1] *= this._scalingY / maxBounds;\n                this._size[2] *= this._scalingZ / maxBounds;\n                this._updateGrids(this._size);\n                this._updateText(this._size);\n                if (this.hasChangedCallback) this.hasChangedCallback();\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d updated ${Math.round(window.performance.now() - start)}ms`);\n            }\n            (0, $1ac1b59392edf35b$exports).multiply(this._mMatrix, this.mMatrix, this._offset);\n            this._mvMatrix = (0, $1ac1b59392edf35b$exports).create();\n            (0, $1ac1b59392edf35b$exports).multiply(this._mvMatrix, this._vMatrix, this._mMatrix);\n            (0, $ba3ca37806a2b6fa$exports).fromMat4(this._mat3, this._mvMatrix);\n            for(let faceId = 0; faceId < 6; faceId++){\n                (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).FACE_POSITIONS[faceId], this._size);\n                (0, $31054a6c69637582$exports).transformMat4(this._forward, this._vec3, this._mvMatrix);\n                (0, $31054a6c69637582$exports).transformMat3(this._normal, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).FACE_NORMALS[faceId], this._mat3);\n                this._isForwardFace[faceId] = (0, $31054a6c69637582$exports).dot(this._normal, this._forward) > 0;\n            }\n            this._forward[0] = this._mat3[2];\n            this._forward[1] = this._mat3[5];\n            this._forward[2] = this._mat3[8];\n            for(let edgeId = 0; edgeId < 12; edgeId++){\n                const faceIds = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_FACES[edgeId];\n                const forward1 = this._isForwardFace[faceIds[0]];\n                const forward2 = this._isForwardFace[faceIds[1]];\n                const outsideEdge = forward1 != forward2;\n                this._isOutsideEdge[edgeId] = outsideEdge;\n                if (outsideEdge) this._isForwardEdge[edgeId] = (0, $31054a6c69637582$exports).dot((0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_FORWARDS[edgeId], this._forward) < 0;\n                this._distances[edgeId] = 0;\n            }\n            for(let axisId = 0; axisId < 3; axisId++)if (this.arePickDivisionsVisible[axisId]) {\n                (0, $91b0cc4981465964$exports).set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n                (0, $91b0cc4981465964$exports).set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n                const gridTicksScale = this._gridTicksScales[axisId];\n                for(let edge = 0; edge < 4; edge++){\n                    const edgeId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_EDGES[axisId][edge];\n                    if (this._isOutsideEdge[edgeId] && this.isEdgeVisible[edgeId]) {\n                        let distance = this._distances[edgeId];\n                        distance += this._gridPickDivisionHeight * 0.5;\n                        const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                        (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIONS[edgeId], this._size);\n                        (0, $31054a6c69637582$exports).scaleAndAdd(this._vec3, this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId], distance);\n                        (0, $1ac1b59392edf35b$exports).translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                        (0, $1ac1b59392edf35b$exports).multiply(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                        if (!this._isForwardEdge[edgeId]) (0, $1ac1b59392edf35b$exports).scale(gridTicksMMatrix, gridTicksMMatrix, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_REFLECTX);\n                        (0, $1ac1b59392edf35b$exports).scale(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                        distance += this._gridPickDivisionHeight * 0.5;\n                        this._distances[edgeId] = distance;\n                    }\n                }\n            }\n            for(let axisId = 0; axisId < 3; axisId++)if (this.areFacesVisible[axisId]) {\n                const axisId2 = axisId == 0 ? 1 : 0;\n                const axisId3 = axisId == 2 ? 1 : 2;\n                (0, $91b0cc4981465964$exports).set(this._gridFaceZeros[axisId], this.zero[axisId2], this.zero[axisId3]);\n                (0, $91b0cc4981465964$exports).set(this._gridFaceMinorGridlines[axisId], this.minorGridlines[axisId2], this.minorGridlines[axisId3]);\n                for(let face = 0; face < 2; face++){\n                    const faceId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_FACES[axisId][face];\n                    if (this._isForwardFace[faceId]) {\n                        const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                        (0, $1ac1b59392edf35b$exports).scale(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                        if (this._size[axisId] > 0) (0, $1ac1b59392edf35b$exports).translate(gridFaceMMatrix, gridFaceMMatrix, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).FACE_POSITIONS[faceId]);\n                    }\n                }\n            }\n            for(let axisId = 0; axisId < 3; axisId++)for(let edge = 0; edge < 4; edge++){\n                const edgeId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_EDGES[axisId][edge];\n                if (this._isOutsideEdge[edgeId]) {\n                    (0, $31054a6c69637582$exports).multiply(this._edgePosition, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIONS[edgeId], this._size);\n                    (0, $31054a6c69637582$exports).transformMat4(this._edgePosition, this._edgePosition, this._mvMatrix);\n                    (0, $31054a6c69637582$exports).normalize(this._forward, this._edgePosition);\n                    (0, $31054a6c69637582$exports).negate(this._forward, this._forward);\n                    (0, $31054a6c69637582$exports).cross(this._right, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._forward);\n                    (0, $31054a6c69637582$exports).normalize(this._right, this._right);\n                    (0, $31054a6c69637582$exports).cross(this._up, this._forward, this._right);\n                    (0, $31054a6c69637582$exports).transformMat3(this._edgeNormal, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId], this._mat3);\n                    (0, $31054a6c69637582$exports).transformMat3(this._edgePositive, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[edgeId], this._mat3);\n                    (0, $31054a6c69637582$exports).copy(this._edgeNormalTemp, this._edgeNormal);\n                    (0, $31054a6c69637582$exports).copy(this._edgePositiveTemp, this._edgePositive);\n                    const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n                    const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n                    const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n                    if ((0, $31054a6c69637582$exports).dot(this._edgeNormalTemp, this._up) > 0) (0, $31054a6c69637582$exports).copy(edgeHorizontalUp, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId]);\n                    else {\n                        (0, $31054a6c69637582$exports).negate(edgeHorizontalUp, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId]);\n                        (0, $31054a6c69637582$exports).negate(this._edgeNormalTemp, this._edgeNormalTemp);\n                    }\n                    if ((0, $31054a6c69637582$exports).dot(this._edgePositiveTemp, this._right) > 0) {\n                        this._isLeftToRightHorizontal[edgeId] = true;\n                        (0, $31054a6c69637582$exports).copy(edgeHorizontalRight, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[edgeId]);\n                    } else {\n                        this._isLeftToRightHorizontal[edgeId] = false;\n                        (0, $31054a6c69637582$exports).negate(edgeHorizontalRight, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[edgeId]);\n                        (0, $31054a6c69637582$exports).negate(this._edgePositiveTemp, this._edgePositiveTemp);\n                    }\n                    (0, $31054a6c69637582$exports).cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n                    if ((0, $31054a6c69637582$exports).dot(edgeHorizontalForward, this._forward) < 0) {\n                        this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                        (0, $31054a6c69637582$exports).negate(edgeHorizontalRight, edgeHorizontalRight);\n                    }\n                    (0, $31054a6c69637582$exports).cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n                    const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n                    const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n                    const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n                    if ((0, $31054a6c69637582$exports).dot(this._edgeNormal, this._right) < 0) (0, $31054a6c69637582$exports).copy(edgeVerticalUp, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId]);\n                    else {\n                        (0, $31054a6c69637582$exports).negate(edgeVerticalUp, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId]);\n                        (0, $31054a6c69637582$exports).negate(this._edgeNormal, this._edgeNormal);\n                    }\n                    if ((0, $31054a6c69637582$exports).dot(this._edgePositive, this._up) < 0) {\n                        this._isLeftToRightVertical[edgeId] = true;\n                        (0, $31054a6c69637582$exports).copy(edgeVerticalRight, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[edgeId]);\n                    } else {\n                        this._isLeftToRightVertical[edgeId] = false;\n                        (0, $31054a6c69637582$exports).negate(edgeVerticalRight, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIVES[edgeId]);\n                        (0, $31054a6c69637582$exports).negate(this._edgePositive, this._edgePositive);\n                    }\n                    (0, $31054a6c69637582$exports).cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n                    if ((0, $31054a6c69637582$exports).dot(edgeVerticalForward, this._forward) < 0) {\n                        this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                        (0, $31054a6c69637582$exports).negate(edgeVerticalRight, edgeVerticalRight);\n                    }\n                    (0, $31054a6c69637582$exports).cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n                    if (this.isEdgeVisible[edgeId]) {\n                        if (this._labels[axisId]) this._updateLabels(axisId, edgeId);\n                        if (this._titles[axisId]) this._updateTitle(axisId, edgeId);\n                    }\n                    if (this.isHeadingVisible[edgeId]) this._updateHeading(axisId, edgeId);\n                }\n            }\n        }\n    }\n    _updateLabels(axisId, edgeId) {\n        const orientation = this._orientations[axisId];\n        let distance = this._distances[edgeId];\n        let maxLabelSize = this._maxLabelSize[axisId][1];\n        if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel) maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n        distance += maxLabelSize * 0.5;\n        (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIONS[edgeId], this._size);\n        (0, $31054a6c69637582$exports).scaleAndAdd(this._vec3, this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId], distance);\n        const labelMMatrix = this._labelMMatrices[edgeId];\n        labelMMatrix[12] = this._vec3[0];\n        labelMMatrix[13] = this._vec3[1];\n        labelMMatrix[14] = this._vec3[2];\n        if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel) {\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            labelMMatrix[0] = right[0];\n            labelMMatrix[1] = right[1];\n            labelMMatrix[2] = right[2];\n            labelMMatrix[4] = up[0];\n            labelMMatrix[5] = up[1];\n            labelMMatrix[6] = up[2];\n            labelMMatrix[8] = forward[0];\n            labelMMatrix[9] = forward[1];\n            labelMMatrix[10] = forward[2];\n        } else {\n            const right = this._edgeVerticalRight[edgeId];\n            const up = this._edgeVerticalUp[edgeId];\n            const forward = this._edgeVerticalForward[edgeId];\n            labelMMatrix[0] = right[0];\n            labelMMatrix[1] = right[1];\n            labelMMatrix[2] = right[2];\n            labelMMatrix[4] = up[0];\n            labelMMatrix[5] = up[1];\n            labelMMatrix[6] = up[2];\n            labelMMatrix[8] = forward[0];\n            labelMMatrix[9] = forward[1];\n            labelMMatrix[10] = forward[2];\n        }\n        (0, $1ac1b59392edf35b$exports).multiply(labelMMatrix, this._mMatrix, labelMMatrix);\n        if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular) (0, $1ac1b59392edf35b$exports).multiply(labelMMatrix, labelMMatrix, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_ROTATION_MINUS_90);\n        distance += maxLabelSize * 0.5;\n        this._distances[edgeId] = distance;\n    }\n    _updateTitle(axisId, edgeId) {\n        let distance = this._distances[edgeId];\n        const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n        distance += titleTextSize * 0.5;\n        (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIONS[edgeId], this._size);\n        (0, $31054a6c69637582$exports).scaleAndAdd(this._vec3, this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId], distance);\n        const titleMMatrix = this._titleMMatrices[edgeId];\n        titleMMatrix[12] = this._vec3[0];\n        titleMMatrix[13] = this._vec3[1];\n        titleMMatrix[14] = this._vec3[2];\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        titleMMatrix[0] = right[0];\n        titleMMatrix[1] = right[1];\n        titleMMatrix[2] = right[2];\n        titleMMatrix[4] = up[0];\n        titleMMatrix[5] = up[1];\n        titleMMatrix[6] = up[2];\n        titleMMatrix[8] = forward[0];\n        titleMMatrix[9] = forward[1];\n        titleMMatrix[10] = forward[2];\n        (0, $1ac1b59392edf35b$exports).multiply(titleMMatrix, this._mMatrix, titleMMatrix);\n        distance += titleTextSize * 0.5;\n        this._distances[edgeId] = distance;\n    }\n    _updateHeading(axisId, edgeId) {\n        let distance = this._distances[edgeId];\n        const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n        distance += headingTextSize * 0.5;\n        (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_POSITIONS[edgeId], this._size);\n        (0, $31054a6c69637582$exports).scaleAndAdd(this._vec3, this._vec3, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).EDGE_NORMALS[edgeId], distance);\n        const headingMMatrix = this._headingMMatrices[edgeId];\n        headingMMatrix[12] = this._vec3[0];\n        headingMMatrix[13] = this._vec3[1];\n        headingMMatrix[14] = this._vec3[2];\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        headingMMatrix[0] = right[0];\n        headingMMatrix[1] = right[1];\n        headingMMatrix[2] = right[2];\n        headingMMatrix[4] = up[0];\n        headingMMatrix[5] = up[1];\n        headingMMatrix[6] = up[2];\n        headingMMatrix[8] = forward[0];\n        headingMMatrix[9] = forward[1];\n        headingMMatrix[10] = forward[2];\n        (0, $1ac1b59392edf35b$exports).multiply(headingMMatrix, this._mMatrix, headingMMatrix);\n        distance += headingTextSize * 0.5;\n        this._distances[edgeId] = distance;\n    }\n    _updateGrids(size) {\n        let offset = 0;\n        this.pickGridLookup = {};\n        this._pickGrid = [];\n        const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n        const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n        const zDivisions = this._gridTicksPositions[2] ? this._gridTicksPositions[2].length - 1 : 0;\n        const count = 2 * (xDivisions * yDivisions) + 2 * (xDivisions * zDivisions) + 2 * (yDivisions * zDivisions) + xDivisions + yDivisions + zDivisions;\n        const byteLength = (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES * count * 4;\n        if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n            this._gridVertices = new ArrayBuffer(byteLength);\n            this._gridVerticesView = new DataView(this._gridVertices);\n            this._gridIndices = new Uint16Array(count * 6);\n        }\n        for(let axisId = 0; axisId < 3; axisId++){\n            const width = size[axisId];\n            (0, $31054a6c69637582$exports).set(this._gridTicksScales[axisId], width, this._gridPickDivisionHeight, 1);\n            offset = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset);\n            for(let face = 0; face < 2; face++){\n                const faceId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_FACES[axisId][face];\n                offset = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset);\n            }\n            this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n        }\n    }\n    _updateText(size) {\n        let glyphOffset = 0;\n        let count = 0;\n        for(let axisId = 0; axisId < 3; axisId++){\n            const labels = this._labels[axisId];\n            if (labels) for(let i = 0; i < labels.length; i++)count += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n            const title = this._titles[axisId];\n            if (title) count += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n            const heading = this._headings[axisId];\n            if (heading) count += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n        const byteLength = (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES * count * 4;\n        if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n            this._textVertices = new ArrayBuffer(byteLength);\n            this._textVerticesView = new DataView(this._textVertices);\n            this._textIndices = new Uint16Array(count * 6);\n        }\n        this.pickLabelLookup = {};\n        this._pickLabel = [];\n        for(let axisId = 0; axisId < 3; axisId++)if (this._labels[axisId]) {\n            const width = size[axisId];\n            const maxLabelSize = this._maxLabelSize[axisId];\n            const orientation = this._orientations[axisId];\n            (0, $91b0cc4981465964$exports).set(maxLabelSize, 0, 0);\n            this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n            glyphOffset = this._updateLeftToRightAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n            this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n            this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n            glyphOffset = this._updateRightToLeftAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n            this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n            this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n            this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n            this._axesLeftToRightIndexCounts[axisId] = 0;\n            this._axesRightToLeftIndexCounts[axisId] = 0;\n            this._maxLabelSize[axisId][0] = 0;\n            this._maxLabelSize[axisId][1] = 0;\n        }\n        this.pickTitleLookup = {};\n        this._pickTitle = [];\n        for(let axisId = 0; axisId < 3; axisId++)if (this._titles[axisId]) {\n            (0, $31054a6c69637582$exports).set(this._textPosition, 0, 0, 0);\n            (0, $31054a6c69637582$exports).set(this._textOffset, 0, 0, 0);\n            this._titleIndexOffsets[axisId] = glyphOffset * 6;\n            const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n            const scale = this._titleSizes[axisId] / this._font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n            const width = this._textMetric.width * scale;\n            const maxGlyphTop = this._textMetric.maxTop * scale;\n            const lineHeight = this._font.size * scale;\n            this._textOffset[0] -= width / 2;\n            this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesTitle, this._vec4);\n            this.pickTitleLookup[pickId] = this._pickTitle.length;\n            this._pickTitle.push(axisId);\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n            glyphOffset += text.length;\n            this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n            this._titleIndexOffsets[axisId] = glyphOffset * 6;\n            this._titleIndexCounts[axisId] = 0;\n        }\n        this.pickHeadingLookup = {};\n        this._pickHeading = [];\n        for(let axisId = 0; axisId < 3; axisId++)if (this._headings[axisId]) {\n            (0, $31054a6c69637582$exports).set(this._textPosition, 0, 0, 0);\n            (0, $31054a6c69637582$exports).set(this._textOffset, 0, 0, 0);\n            this._headingIndexOffsets[axisId] = glyphOffset * 6;\n            const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n            const scale = this._headingSizes[axisId] / this._font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n            const width = this._textMetric.width * scale;\n            const maxGlyphTop = this._textMetric.maxTop * scale;\n            const lineHeight = this._font.size * scale;\n            this._textOffset[0] -= width / 2;\n            this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesHeading, this._vec4);\n            this.pickHeadingLookup[pickId] = this._pickHeading.length;\n            this._pickHeading.push(axisId);\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n            glyphOffset += text.length;\n            this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n            this._headingIndexOffsets[axisId] = glyphOffset * 6;\n            this._headingIndexCounts[axisId] = 0;\n        }\n    }\n    _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n        const isAxisReversed = this.isAxisReversed[axisId];\n        for(let label = 0; label < labels.length; label++){\n            const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n            const lineHeight = scales[label];\n            const scale = lineHeight / this._font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n            const width = this._textMetric.width * scale;\n            const maxGlyphTop = this._textMetric.maxTop * scale;\n            const position = isAxisReversed ? 1 - positions[label] : positions[label];\n            switch(orientation){\n                case (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel:\n                    (0, $31054a6c69637582$exports).set(this._textPosition, (position - 0.5) * size, 0, 0);\n                    if (this._isDiscrete[axisId]) this._textOffset[0] = -width / 2;\n                    else this._textOffset[0] = position == 0 ? 0 : position == 1 ? -width : -width / 2;\n                    this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                    maxSize[0] = Math.max(width, maxSize[0]);\n                    maxSize[1] = Math.max(lineHeight, maxSize[1]);\n                    break;\n                case (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular:\n                    (0, $31054a6c69637582$exports).set(this._textPosition, 0, (position - 0.5) * size, 0);\n                    this._textOffset[0] = -width / 2;\n                    if (this._isDiscrete[axisId]) this._textOffset[1] = -maxGlyphTop / 2;\n                    else this._textOffset[1] = position == 0 ? 0 : position == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n                    maxSize[0] = Math.max(lineHeight, maxSize[0]);\n                    maxSize[1] = Math.max(width, maxSize[1]);\n                    break;\n            }\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesLabel, this._vec4);\n            this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n            this._pickLabel.push(axisId);\n            this._pickLabel.push(label);\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n            glyphOffset += text.length;\n        }\n        return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n        const isAxisReversed = this.isAxisReversed[axisId];\n        for(let label = 0; label < labels.length; label++){\n            const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n            const lineHeight = scales[label];\n            const scale = lineHeight / this._font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n            const width = this._textMetric.width * scale;\n            const maxGlyphTop = this._textMetric.maxTop * scale;\n            const position = isAxisReversed ? 1 - positions[label] : positions[label];\n            switch(orientation){\n                case (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel:\n                    (0, $31054a6c69637582$exports).set(this._textPosition, (0.5 - position) * size, 0, 0);\n                    if (this._isDiscrete[axisId]) this._textOffset[0] = -width / 2;\n                    else this._textOffset[0] = label == 0 ? -width : label == labels.length - 1 ? 0 : -width / 2;\n                    this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                    break;\n                case (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular:\n                    (0, $31054a6c69637582$exports).set(this._textPosition, 0, (0.5 - position) * size, 0);\n                    this._textOffset[0] = -width / 2;\n                    if (this._isDiscrete[axisId]) this._textOffset[1] = -maxGlyphTop / 2;\n                    else this._textOffset[1] = label == 0 ? -maxGlyphTop : label == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n                    break;\n            }\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesLabel, this._vec4);\n            this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n            this._pickLabel.push(axisId);\n            this._pickLabel.push(label);\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n            glyphOffset += text.length;\n        }\n        return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset) {\n        this._gridTicksIndexOffsets[axisId] = offset * 6;\n        if (this._gridTicksPositions[axisId]) {\n            const axes = (0, $31054a6c69637582$exports).create();\n            const positions = this._gridTicksPositions[axisId];\n            const isAxisReversed = this.isAxisReversed[axisId];\n            let vertexOffset = offset * 4;\n            for(let position = 0; position < positions.length - 1; position++){\n                const left = isAxisReversed ? 1 - positions[position + 1] - 0.5 : positions[position] - 0.5;\n                const right = isAxisReversed ? 1 - positions[position] - 0.5 : positions[position + 1] - 0.5;\n                axes[axisId] = position + 1;\n                const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n                (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesDivision, this._vec4);\n                this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                this._pickGrid.push(axes[0]);\n                this._pickGrid.push(axes[1]);\n                this._pickGrid.push(axes[2]);\n                let indexOffset = offset * 6;\n                for(let j = 0; j < this._indexTemplate.length; j++)indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n                (0, $4c4ac78b213a9c07$exports).set(this._bounds, left + 0.5, 0, right + 0.5, 1);\n                this._translation[0] = left;\n                this._translation[1] = 0.5;\n                this._translation[2] = 0;\n                this._texCoord[0] = left + 0.5;\n                this._texCoord[1] = 1;\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                vertexOffset++;\n                this._translation[0] = right;\n                this._texCoord[0] = right + 0.5;\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                vertexOffset++;\n                this._translation[0] = left;\n                this._translation[1] = -0.5;\n                this._texCoord[0] = left + 0.5;\n                this._texCoord[1] = 0;\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                vertexOffset++;\n                this._translation[0] = right;\n                this._texCoord[0] = right + 0.5;\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                vertexOffset++;\n                offset++;\n            }\n        }\n        this._gridTicksIndexCounts[axisId] = offset * 6 - this._gridTicksIndexOffsets[axisId];\n        return offset;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset) {\n        (0, $31054a6c69637582$exports).set(this._translation, 0, 0, 0);\n        this._gridFaceIndexOffsets[faceId] = offset * 6;\n        const axisId2 = axisId == 0 ? 1 : 0;\n        const axisId3 = axisId == 2 ? 1 : 2;\n        if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n            const axes = (0, $31054a6c69637582$exports).create();\n            (0, $31054a6c69637582$exports).negate(this._normal, (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).FACE_NORMALS[faceId]);\n            const positions2 = this._gridTicksPositions[axisId2];\n            const positions3 = this._gridTicksPositions[axisId3];\n            const isAxisReversed2 = this.isAxisReversed[axisId2];\n            const isAxisReversed3 = this.isAxisReversed[axisId3];\n            for(let position2 = 0; position2 < positions2.length - 1; position2++){\n                const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n                const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n                axes[axisId2] = position2 + 1;\n                let vertexOffset = offset * 4;\n                for(let position3 = 0; position3 < positions3.length - 1; position3++){\n                    const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n                    const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n                    axes[axisId3] = position3 + 1;\n                    const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n                    (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesDivision, this._vec4);\n                    this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                    this._pickGrid.push(axes[0]);\n                    this._pickGrid.push(axes[1]);\n                    this._pickGrid.push(axes[2]);\n                    let indexOffset = offset * 6;\n                    for(let i = 0; i < this._indexTemplate.length; i++)indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n                    (0, $4c4ac78b213a9c07$exports).set(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n                    this._translation[axisId2] = min2;\n                    this._translation[axisId3] = max3;\n                    this._texCoord[0] = min2 + 0.5;\n                    this._texCoord[1] = max3 + 0.5;\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, this._normal);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[axisId2] = max2;\n                    this._texCoord[0] = max2 + 0.5;\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, this._normal);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[axisId2] = min2;\n                    this._translation[axisId3] = min3;\n                    this._texCoord[0] = min2 + 0.5;\n                    this._texCoord[1] = min3 + 0.5;\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, this._normal);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[axisId2] = max2;\n                    this._texCoord[0] = max2 + 0.5;\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, this._normal);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    offset++;\n                }\n            }\n        }\n        this._gridFaceIndexCounts[faceId] = offset * 6 - this._gridFaceIndexOffsets[faceId];\n        return offset;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\n\n\n\nclass $28691cf6913948f8$export$133913079d003c31 {\n    static create(core, options) {\n        const cartesian2dAxes = new $28691cf6913948f8$export$e3e79a454e5f8e5a(core);\n        const minBoundsX = options.minBoundsX === undefined ? 0 : options.minBoundsX;\n        const minBoundsY = options.minBoundsY === undefined ? 0 : options.minBoundsY;\n        const maxBoundsX = options.maxBoundsX === undefined ? 1 : options.maxBoundsX;\n        const maxBoundsY = options.maxBoundsY === undefined ? 1 : options.maxBoundsY;\n        const minValueX = options.minValueX === undefined ? 0 : options.minValueX;\n        const minValueY = options.minValueY === undefined ? 0 : options.minValueY;\n        const maxValueX = options.maxValueX === undefined ? 1 : options.maxValueX;\n        const maxValueY = options.maxValueY === undefined ? 1 : options.maxValueY;\n        const scaling = options.scaling === undefined ? 1 : options.scaling;\n        cartesian2dAxes.minBoundsX = minBoundsX;\n        cartesian2dAxes.minBoundsY = minBoundsY;\n        cartesian2dAxes.maxBoundsX = maxBoundsX;\n        cartesian2dAxes.maxBoundsY = maxBoundsY;\n        cartesian2dAxes.scalingX = scaling;\n        cartesian2dAxes.scalingY = scaling;\n        const maxLength = Math.max(maxBoundsX - minBoundsX, maxBoundsY - minBoundsY);\n        const requestedDivisions = [\n            options.divisionsX == undefined ? Math.max(Math.floor(core.config.axesGridDefaultDivisions * (maxBoundsX - minBoundsX) / maxLength), 1) : options.divisionsX,\n            options.divisionsY == undefined ? Math.max(Math.floor(core.config.axesGridDefaultDivisions * (maxBoundsY - minBoundsY) / maxLength), 1) : options.divisionsY\n        ];\n        const minorGridlines = [\n            options.minorGridlinesX == undefined ? 2 : options.minorGridlinesX,\n            options.minorGridlinesY == undefined ? 2 : options.minorGridlinesY\n        ];\n        const labelMajorSizes = [\n            options.labelMajorSizeX === undefined ? core.config.axesTextLabelMajorSize : options.labelMajorSizeX,\n            options.labelMajorSizeY === undefined ? core.config.axesTextLabelMajorSize : options.labelMajorSizeY\n        ];\n        const labelMinorSizes = [\n            options.labelMinorSizeX === undefined ? core.config.axesTextLabelMinorSize : options.labelMinorSizeX,\n            options.labelMinorSizeY === undefined ? core.config.axesTextLabelMinorSize : options.labelMinorSizeY\n        ];\n        cartesian2dAxes.isDiscreteX = options.isDiscreteX;\n        cartesian2dAxes.isDiscreteY = options.isDiscreteY;\n        cartesian2dAxes.isGridPickingEnabled = options.isGridPickingEnabled;\n        const isDivisionPickingEnabledArray = [\n            options.isDivisionPickingEnabledX,\n            options.isDivisionPickingEnabledY\n        ];\n        const isLabelPickingEnabled = [\n            options.isLabelPickingEnabledX,\n            options.isLabelPickingEnabledY\n        ];\n        const isAxisReversed = [\n            options.reverseX,\n            options.reverseY\n        ];\n        const labelsArray = [\n            options.labelsX,\n            options.labelsY\n        ];\n        const labelOrientationsArray = [\n            options.labelOrientationX,\n            options.labelOrientationY\n        ];\n        const labelOrientationDefaultArray = [\n            (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel,\n            (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular,\n            (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel\n        ];\n        const arePickDivisionsVisibleArray = [\n            options.arePickDivisionsVisibleX,\n            options.arePickDivisionsVisibleY\n        ];\n        const minValueArray = [\n            minValueX,\n            minValueY\n        ];\n        const maxValueArray = [\n            maxValueX,\n            maxValueY\n        ];\n        const isDiscreteArray = [\n            options.isDiscreteX,\n            options.isDiscreteY\n        ];\n        const titleArray = [\n            options.titleX,\n            options.titleY\n        ];\n        const titleSizeArray = [\n            options.titleSizeX,\n            options.titleSizeY\n        ];\n        const headingArray = [\n            options.headingX,\n            options.headingY\n        ];\n        const headingSizeArray = [\n            options.headingSizeX,\n            options.headingSizeY\n        ];\n        for(let axisId = 0; axisId < 2; axisId++){\n            const label = labelsArray[axisId];\n            const minValue = minValueArray[axisId];\n            const maxValue = maxValueArray[axisId];\n            const discrete = isDiscreteArray[axisId];\n            if (discrete) {\n                const divisions = maxValue - minValue + 1;\n                const maxDivisions = Math.min(requestedDivisions[axisId], divisions);\n                const discreteAxisOptions = {\n                    min: minValue,\n                    max: maxValue,\n                    divisions: divisions,\n                    maxDivisions: maxDivisions,\n                    label: label\n                };\n                const discreteAxis = (0, $92acb7820f38feec$export$46c1eaab6b8d1e23).discrete(discreteAxisOptions);\n                cartesian2dAxes.setTickPositions(axisId, discreteAxis.tickPositions);\n                cartesian2dAxes.setLabelPositions(axisId, discreteAxis.labelPositions);\n                cartesian2dAxes.setLabels(axisId, discreteAxis.labels);\n                cartesian2dAxes.setFromValues(axisId, discreteAxis.fromValues);\n                cartesian2dAxes.setToValues(axisId, discreteAxis.toValues);\n                cartesian2dAxes.setLabelSizes(axisId, Array(discreteAxis.labels.length).fill(labelMajorSizes[axisId]));\n                cartesian2dAxes.minorGridlines[axisId] = 1;\n            } else {\n                const divisions = requestedDivisions[axisId];\n                const continuousAxisOptions = {\n                    min: minValue,\n                    max: maxValue,\n                    divisions: divisions,\n                    label: label\n                };\n                const continuousAxis = (0, $92acb7820f38feec$export$46c1eaab6b8d1e23).continuous(continuousAxisOptions);\n                cartesian2dAxes.setTickPositions(axisId, continuousAxis.positions);\n                cartesian2dAxes.setLabelPositions(axisId, continuousAxis.positions);\n                cartesian2dAxes.setLabels(axisId, continuousAxis.labels);\n                cartesian2dAxes.setFromValues(axisId, continuousAxis.fromValues);\n                cartesian2dAxes.setToValues(axisId, continuousAxis.toValues);\n                const labelSizes = [];\n                for(let i = 0; i < continuousAxis.labels.length; i++)labelSizes.push(i == 0 || i == divisions ? labelMajorSizes[axisId] : labelMinorSizes[axisId]);\n                cartesian2dAxes.setLabelSizes(axisId, labelSizes);\n                cartesian2dAxes.minorGridlines[axisId] = minorGridlines[axisId];\n            }\n            cartesian2dAxes.setLabelOrientation(axisId, labelOrientationsArray[axisId] === undefined ? labelOrientationDefaultArray[axisId] : labelOrientationsArray[axisId]);\n            cartesian2dAxes.setTitle(axisId, titleArray[axisId]);\n            cartesian2dAxes.setTitleSize(axisId, titleSizeArray[axisId] === undefined ? core.config.axesTextTitleSize : titleSizeArray[axisId]);\n            cartesian2dAxes.setHeading(axisId, headingArray[axisId]);\n            cartesian2dAxes.setHeadingSize(axisId, headingSizeArray[axisId] === undefined ? core.config.axesTextHeadingSize : headingSizeArray[axisId]);\n            cartesian2dAxes.arePickDivisionsVisible[axisId] = arePickDivisionsVisibleArray[axisId] === undefined ? true : arePickDivisionsVisibleArray[axisId];\n            cartesian2dAxes.isDivisionPickingEnabled[axisId] = isDivisionPickingEnabledArray[axisId];\n            cartesian2dAxes.isLabelPickingEnabled[axisId] = isLabelPickingEnabled[axisId];\n            cartesian2dAxes.isAxisReversed[axisId] = isAxisReversed[axisId];\n            if (minValue <= 0 && maxValue >= 0 && minValue != maxValue) cartesian2dAxes.zero[axisId] = -minValue / (maxValue - minValue);\n            else cartesian2dAxes.zero[axisId] = -Number.MAX_VALUE;\n        }\n        return cartesian2dAxes;\n    }\n}\nclass $28691cf6913948f8$export$e3e79a454e5f8e5a extends (0, $2e2b6f93796e9c8a$export$a0569bcde4468e7f) {\n    get size() {\n        return this._size;\n    }\n    get isDiscreteX() {\n        return this._isDiscrete[0];\n    }\n    set isDiscreteX(value) {\n        if (value != this._isDiscrete[0]) {\n            this._isDiscrete[0] = value;\n            this._hasChanged = true;\n        }\n    }\n    get isDiscreteY() {\n        return this._isDiscrete[1];\n    }\n    set isDiscreteY(value) {\n        if (value != this._isDiscrete[1]) {\n            this._isDiscrete[1] = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsX() {\n        return this._minBoundsX;\n    }\n    set minBoundsX(value) {\n        if (value != this._minBoundsX) {\n            this._minBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsX() {\n        return this._maxBoundsX;\n    }\n    set maxBoundsX(value) {\n        if (value != this._minBoundsX) {\n            this._maxBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsY() {\n        return this._minBoundsY;\n    }\n    set minBoundsY(value) {\n        if (value != this._minBoundsY) {\n            this._minBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsY() {\n        return this._maxBoundsY;\n    }\n    set maxBoundsY(value) {\n        if (value != this._minBoundsY) {\n            this._maxBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    getIsOutsideEdge(index) {\n        return this._isOutsideEdge[index];\n    }\n    getIsForwardFace(index) {\n        return this._isForwardFace[index];\n    }\n    get textVertices() {\n        return this._textVertices;\n    }\n    get textIndices() {\n        return this._textIndices;\n    }\n    getLabelMMatrix(index) {\n        return this._labelMMatrices[index];\n    }\n    setLabelPositions(index, value) {\n        if (this._labelPositions[index] != value) {\n            this._labelPositions[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    setLabels(index, value) {\n        if (this._labels[index] != value) {\n            this._labels[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    setLabelSizes(index, value) {\n        if (this._labelSizes[index] != value) {\n            this._labelSizes[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    getLabelOrientation(index) {\n        return this._orientations[index];\n    }\n    setLabelOrientation(index, orientation) {\n        if (this._orientations[index] != orientation) {\n            this._orientations[index] = orientation;\n            this._hasChanged = true;\n        }\n    }\n    getTitleIndexCount(index) {\n        return this._titleIndexCounts[index];\n    }\n    getTitleIndexOffset(index) {\n        return this._titleIndexOffsets[index];\n    }\n    getTitleMMatrix(index) {\n        return this._titleMMatrices[index];\n    }\n    setTitle(index, value) {\n        if (this._titles[index] != value) {\n            this._titles[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    setTitleSize(index, value) {\n        if (this._titleSizes[index] != value) {\n            this._titleSizes[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    getHeadingIndexCount(index) {\n        return this._headingIndexCounts[index];\n    }\n    getHeadingIndexOffset(index) {\n        return this._headingIndexOffsets[index];\n    }\n    getHeadingMMatrix(index) {\n        return this._headingMMatrices[index];\n    }\n    setHeading(index, value) {\n        if (this._headings[index] != value) {\n            this._headings[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    setHeadingSize(index, value) {\n        if (this._headingSizes[index] != value) {\n            this._headingSizes[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    getIsLeftToRightHorizontal(index) {\n        return this._isLeftToRightHorizontal[index];\n    }\n    getIsLeftToRightVertical(index) {\n        return this._isLeftToRightVertical[index];\n    }\n    getAxesLeftToRightIndexCount(index) {\n        return this._axesLeftToRightIndexCounts[index];\n    }\n    getAxesRightToLeftIndexCount(index) {\n        return this._axesRightToLeftIndexCounts[index];\n    }\n    getAxesLeftToRightIndexOffset(index) {\n        return this._axesLeftToRightIndexOffsets[index];\n    }\n    getAxesRightToLeftIndexOffset(index) {\n        return this._axesRightToLeftIndexOffsets[index];\n    }\n    get gridVertices() {\n        return this._gridVertices;\n    }\n    get gridIndices() {\n        return this._gridIndices;\n    }\n    getGridTicksIndexCount(index) {\n        return this._gridTicksIndexCounts[index];\n    }\n    getGridTicksIndexOffset(index) {\n        return this._gridTicksIndexOffsets[index];\n    }\n    getGridFaceIndexCount(index) {\n        return this._gridFaceIndexCounts[index];\n    }\n    getGridFaceIndexOffset(index) {\n        return this._gridFaceIndexOffsets[index];\n    }\n    getGridTicksMMatrix(index) {\n        return this._gridTicksMMatrices[index];\n    }\n    getGridFaceMMatrix(index) {\n        return this._gridFaceMMatrices[index];\n    }\n    getGridTicksScale(index) {\n        return this._gridTicksScales[index];\n    }\n    getGridTicksZero(index) {\n        return this._gridTicksZeros[index];\n    }\n    get gridFaceZero() {\n        return this._gridFaceZeros;\n    }\n    get gridFaceMinorGridlines() {\n        return this._gridFaceMinorGridlines;\n    }\n    getGridTicksMinorGridlines(index) {\n        return this._gridTicksMinorGridlines[index];\n    }\n    setTickPositions(index, value) {\n        if (this._gridTicksPositions[index] != value) {\n            this._gridTicksPositions[index] = value;\n            this._hasChanged = true;\n        }\n    }\n    get scalingX() {\n        return this._scalingX;\n    }\n    set scalingX(value) {\n        if (value != this._scalingX) {\n            this._scalingX = value;\n            this._hasChanged = true;\n        }\n    }\n    get scalingY() {\n        return this._scalingY;\n    }\n    set scalingY(value) {\n        if (value != this._scalingY) {\n            this._scalingY = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetX() {\n        return this._offset[12];\n    }\n    set offsetX(value) {\n        if (value != this._offset[12]) this._offset[12] = value;\n    }\n    get offsetY() {\n        return this._offset[13];\n    }\n    set offsetY(value) {\n        if (value != this._offset[13]) this._offset[13] = value;\n    }\n    set rotation(value) {\n        if (this._rotation != value) {\n            this._rotation = value;\n            this._rMatrix = (0, $1ac1b59392edf35b$exports).create();\n            (0, $1ac1b59392edf35b$exports).fromQuat(this._rMatrix, value);\n        }\n    }\n    constructor(core){\n        super(core);\n        this._size = (0, $31054a6c69637582$exports).create();\n        this._translation = (0, $31054a6c69637582$exports).create();\n        this._normal = (0, $31054a6c69637582$exports).create();\n        this._forward = (0, $31054a6c69637582$exports).create();\n        this._right = (0, $31054a6c69637582$exports).create();\n        this._up = (0, $31054a6c69637582$exports).create();\n        this._texCoord = (0, $91b0cc4981465964$exports).create();\n        this._bounds = (0, $4c4ac78b213a9c07$exports).create();\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._vec4 = (0, $4c4ac78b213a9c07$exports).create();\n        this._mat3 = (0, $ba3ca37806a2b6fa$exports).create();\n        this._isDiscrete = [\n            false,\n            false\n        ];\n        this._minBoundsX = 0;\n        this._minBoundsY = 0;\n        this._maxBoundsX = 0;\n        this._maxBoundsY = 0;\n        this._isForwardFace = [];\n        this._isForwardEdge = [];\n        this._isOutsideEdge = [];\n        for(let i = 0; i < 2; i++)this._isForwardFace.push(false);\n        for(let i = 0; i < 4; i++){\n            this._isForwardEdge.push(false);\n            this._isOutsideEdge.push(false);\n        }\n        this._textOffset = (0, $31054a6c69637582$exports).create();\n        this._textPosition = (0, $31054a6c69637582$exports).create();\n        this._distances = [];\n        for(let i = 0; i < 4; i++)this._distances.push(0);\n        this._labelPositions = [];\n        this._labels = [];\n        this._labelSizes = [];\n        this._maxLabelSize = [];\n        this._axesLeftToRightIndexCounts = [];\n        this._axesRightToLeftIndexCounts = [];\n        this._axesLeftToRightIndexOffsets = [];\n        this._axesRightToLeftIndexOffsets = [];\n        this._labelMMatrices = [];\n        this._orientations = [];\n        for(let i = 0; i < 2; i++){\n            this._maxLabelSize.push((0, $91b0cc4981465964$exports).create());\n            this._orientations.push((0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel);\n            this._axesLeftToRightIndexCounts.push(0);\n            this._axesRightToLeftIndexCounts.push(0);\n            this._axesLeftToRightIndexOffsets.push(0);\n            this._axesRightToLeftIndexOffsets.push(0);\n        }\n        for(let i = 0; i < 4; i++)this._labelMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n        this._titles = [];\n        this._titleSizes = [];\n        this._titleIndexCounts = [];\n        this._titleIndexOffsets = [];\n        this._titleMMatrices = [];\n        for(let i = 0; i < 2; i++){\n            this._titles.push(null);\n            this._titleSizes.push(core.config.axesTextTitleSize);\n            this._titleIndexCounts.push(0);\n            this._titleIndexOffsets.push(0);\n        }\n        for(let i = 0; i < 4; i++)this._titleMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n        this._headings = [];\n        this._headingSizes = [];\n        this._headingIndexCounts = [];\n        this._headingIndexOffsets = [];\n        this._headingMMatrices = [];\n        this.isHeadingVisible = [];\n        for(let i = 0; i < 2; i++){\n            this._headings.push(null);\n            this._headingSizes.push(core.config.axesTextHeadingSize);\n            this._headingIndexCounts.push(0);\n            this._headingIndexOffsets.push(0);\n        }\n        for(let i = 0; i < 4; i++){\n            this._headingMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n            this.isHeadingVisible.push(true);\n        }\n        this.isEdgeVisible = [];\n        this._edgePosition = (0, $31054a6c69637582$exports).create();\n        this._edgePositive = (0, $31054a6c69637582$exports).create();\n        this._edgeNormal = (0, $31054a6c69637582$exports).create();\n        this._edgeNormalTemp = (0, $31054a6c69637582$exports).create();\n        this._edgePositiveTemp = (0, $31054a6c69637582$exports).create();\n        this._isLeftToRightHorizontal = [];\n        this._isLeftToRightVertical = [];\n        this._edgeHorizontalRight = [];\n        this._edgeHorizontalUp = [];\n        this._edgeHorizontalForward = [];\n        this._edgeVerticalRight = [];\n        this._edgeVerticalUp = [];\n        this._edgeVerticalForward = [];\n        for(let i = 0; i < 4; i++){\n            this.isEdgeVisible.push(true);\n            this._isLeftToRightHorizontal.push(false);\n            this._isLeftToRightVertical.push(false);\n            this._edgeHorizontalRight.push((0, $31054a6c69637582$exports).create());\n            this._edgeHorizontalUp.push((0, $31054a6c69637582$exports).create());\n            this._edgeHorizontalForward.push((0, $31054a6c69637582$exports).create());\n            this._edgeVerticalRight.push((0, $31054a6c69637582$exports).create());\n            this._edgeVerticalUp.push((0, $31054a6c69637582$exports).create());\n            this._edgeVerticalForward.push((0, $31054a6c69637582$exports).create());\n        }\n        this.isFaceVisible = [];\n        for(let i = 0; i < 2; i++)this.isFaceVisible.push(true);\n        this.arePickDivisionsVisible = [];\n        this.areFacesVisible = [];\n        this._indexTemplate = (0, $3ce6ee188e300946$export$7005c9eb6671414d).INDICES;\n        this.zero = (0, $31054a6c69637582$exports).create();\n        this._gridTicksZeros = [];\n        this._gridFaceZeros = (0, $91b0cc4981465964$exports).create();\n        this.minorGridlines = (0, $31054a6c69637582$exports).fromValues(1, 1, 1);\n        this._gridTicksMinorGridlines = [];\n        this._gridFaceMinorGridlines = (0, $91b0cc4981465964$exports).create();\n        this._gridTicksPositions = [];\n        this._gridTicksScales = [];\n        this._gridTicksIndexCounts = [];\n        this._gridTicksIndexOffsets = [];\n        this._gridFaceScale = (0, $31054a6c69637582$exports).create();\n        this._gridFaceIndexCounts = [];\n        this._gridFaceIndexOffsets = [];\n        this._gridFaceMMatrices = [];\n        this._gridTicksMMatrices = [];\n        this._gridTicksRotations = [];\n        for(let i = 0; i < 2; i++){\n            this.arePickDivisionsVisible.push(true);\n            this.areFacesVisible.push(true);\n            this._gridTicksZeros.push((0, $91b0cc4981465964$exports).create());\n            this._gridTicksMinorGridlines.push((0, $91b0cc4981465964$exports).create());\n            this._gridTicksScales.push((0, $31054a6c69637582$exports).create());\n            this._gridTicksIndexCounts.push(0);\n            this._gridTicksIndexOffsets.push(0);\n            this._gridFaceIndexCounts.push(0);\n            this._gridFaceIndexOffsets.push(0);\n            this._gridFaceMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n        }\n        for(let i = 0; i < 4; i++){\n            this._gridTicksMMatrices.push((0, $1ac1b59392edf35b$exports).create());\n            this._gridTicksRotations.push((0, $1ac1b59392edf35b$exports).create());\n            const _mat4 = this._gridTicksRotations[i];\n            _mat4[0] = (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[i][0];\n            _mat4[1] = (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[i][1];\n            _mat4[2] = (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[i][2];\n            _mat4[4] = (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[i][0];\n            _mat4[5] = (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[i][1];\n            _mat4[6] = (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[i][2];\n            (0, $31054a6c69637582$exports).cross(this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[i], (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[i]);\n            _mat4[8] = this._vec3[0];\n            _mat4[9] = this._vec3[1];\n            _mat4[10] = this._vec3[2];\n        }\n        this._fromValues = [\n            null,\n            null\n        ];\n        this._toValues = [\n            null,\n            null\n        ];\n        this.isDivisionPickingEnabled = [\n            false,\n            false\n        ];\n        this.isLabelPickingEnabled = [\n            false,\n            false\n        ];\n        this.isTitlePickingEnabled = [\n            false,\n            false\n        ];\n        this.isHeadingPickingEnabled = [\n            false,\n            false\n        ];\n        this.isAxisReversed = [\n            false,\n            false\n        ];\n        this._scalingX = 1;\n        this._scalingY = 1;\n        this._offset = (0, $1ac1b59392edf35b$exports).create();\n    }\n    initialize() {\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this.isInitialized) {\n            if (this._hasChanged) {\n                const start = window.performance.now();\n                this._hasChanged = false;\n                (0, $31054a6c69637582$exports).set(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, 0);\n                const maxBounds = Math.max(this._size[0], this._size[1]);\n                this._size[0] *= this._scalingX / maxBounds;\n                this._size[1] *= this._scalingY / maxBounds;\n                this._updateGrids(this._size);\n                this._updateText(this._size);\n                if (this.hasChangedCallback) this.hasChangedCallback();\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d updated ${Math.round(window.performance.now() - start)}ms`);\n            }\n            if (this._rMatrix) {\n                (0, $1ac1b59392edf35b$exports).mul(this._mMatrix, this.mMatrix, this._rMatrix);\n                (0, $1ac1b59392edf35b$exports).mul(this._mMatrix, this._mMatrix, this._offset);\n            } else (0, $1ac1b59392edf35b$exports).multiply(this._mMatrix, this.mMatrix, this._offset);\n            this._mvMatrix = (0, $1ac1b59392edf35b$exports).create();\n            (0, $1ac1b59392edf35b$exports).multiply(this._mvMatrix, this._vMatrix, this._mMatrix);\n            (0, $ba3ca37806a2b6fa$exports).fromMat4(this._mat3, this._mvMatrix);\n            for(let faceId = 0; faceId < 2; faceId++){\n                (0, $31054a6c69637582$exports).transformMat4(this._forward, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_ZERO, this._mvMatrix);\n                (0, $31054a6c69637582$exports).transformMat3(this._normal, (0, $3ce6ee188e300946$export$7005c9eb6671414d).FACE_NORMALS[faceId], this._mat3);\n                this._isForwardFace[faceId] = (0, $31054a6c69637582$exports).dot(this._normal, this._forward) > 0;\n            }\n            this._forward[0] = this._mat3[2];\n            this._forward[1] = this._mat3[5];\n            this._forward[2] = this._mat3[8];\n            for(let edgeId = 0; edgeId < 4; edgeId++){\n                this._isForwardEdge[edgeId] = (0, $31054a6c69637582$exports).dot((0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_FORWARDS[edgeId], this._forward) < 0;\n                this._distances[edgeId] = 0;\n            }\n            for(let axisId = 0; axisId < 2; axisId++)if (this.arePickDivisionsVisible[axisId]) {\n                (0, $91b0cc4981465964$exports).set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n                (0, $91b0cc4981465964$exports).set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n                const gridTicksScale = this._gridTicksScales[axisId];\n                for(let edge = 0; edge < 2; edge++){\n                    const edgeId = (0, $3ce6ee188e300946$export$7005c9eb6671414d).AXIS_EDGES[axisId][edge];\n                    if (this.isEdgeVisible[edgeId]) {\n                        let distance = this._distances[edgeId];\n                        distance += this._gridPickDivisionHeight * 0.5;\n                        const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                        (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIONS[edgeId], this._size);\n                        (0, $31054a6c69637582$exports).scaleAndAdd(this._vec3, this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId], distance);\n                        (0, $1ac1b59392edf35b$exports).translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                        (0, $1ac1b59392edf35b$exports).multiply(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                        if (!this._isForwardEdge[edgeId]) (0, $1ac1b59392edf35b$exports).scale(gridTicksMMatrix, gridTicksMMatrix, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_REFLECTX);\n                        (0, $1ac1b59392edf35b$exports).scale(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                        distance += this._gridPickDivisionHeight * 0.5;\n                        this._distances[edgeId] = distance;\n                    }\n                }\n            }\n            (0, $91b0cc4981465964$exports).set(this._gridFaceZeros, this.zero[0], this.zero[1]);\n            (0, $91b0cc4981465964$exports).set(this._gridFaceMinorGridlines, this.minorGridlines[0], this.minorGridlines[1]);\n            for(let faceId = 0; faceId < 2; faceId++)if (this._isForwardFace[faceId]) {\n                const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                (0, $1ac1b59392edf35b$exports).scale(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n            }\n            for(let axisId = 0; axisId < 2; axisId++)for(let edge = 0; edge < 2; edge++){\n                const edgeId = (0, $3ce6ee188e300946$export$7005c9eb6671414d).AXIS_EDGES[axisId][edge];\n                (0, $31054a6c69637582$exports).multiply(this._edgePosition, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIONS[edgeId], this._size);\n                (0, $31054a6c69637582$exports).transformMat4(this._edgePosition, this._edgePosition, this._mvMatrix);\n                (0, $31054a6c69637582$exports).normalize(this._forward, this._edgePosition);\n                (0, $31054a6c69637582$exports).negate(this._forward, this._forward);\n                (0, $31054a6c69637582$exports).cross(this._right, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._forward);\n                (0, $31054a6c69637582$exports).normalize(this._right, this._right);\n                (0, $31054a6c69637582$exports).cross(this._up, this._forward, this._right);\n                (0, $31054a6c69637582$exports).transformMat3(this._edgeNormal, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId], this._mat3);\n                (0, $31054a6c69637582$exports).transformMat3(this._edgePositive, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[edgeId], this._mat3);\n                (0, $31054a6c69637582$exports).copy(this._edgeNormalTemp, this._edgeNormal);\n                (0, $31054a6c69637582$exports).copy(this._edgePositiveTemp, this._edgePositive);\n                const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n                const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n                const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n                if ((0, $31054a6c69637582$exports).dot(this._edgeNormalTemp, this._up) > 0) (0, $31054a6c69637582$exports).copy(edgeHorizontalUp, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId]);\n                else {\n                    (0, $31054a6c69637582$exports).negate(edgeHorizontalUp, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId]);\n                    (0, $31054a6c69637582$exports).negate(this._edgeNormalTemp, this._edgeNormalTemp);\n                }\n                if ((0, $31054a6c69637582$exports).dot(this._edgePositiveTemp, this._right) > 0) {\n                    this._isLeftToRightHorizontal[edgeId] = true;\n                    (0, $31054a6c69637582$exports).copy(edgeHorizontalRight, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[edgeId]);\n                } else {\n                    this._isLeftToRightHorizontal[edgeId] = false;\n                    (0, $31054a6c69637582$exports).negate(edgeHorizontalRight, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[edgeId]);\n                    (0, $31054a6c69637582$exports).negate(this._edgePositiveTemp, this._edgePositiveTemp);\n                }\n                (0, $31054a6c69637582$exports).cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n                if ((0, $31054a6c69637582$exports).dot(edgeHorizontalForward, this._forward) < 0) {\n                    this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                    (0, $31054a6c69637582$exports).negate(edgeHorizontalRight, edgeHorizontalRight);\n                }\n                (0, $31054a6c69637582$exports).cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n                const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n                const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n                const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n                if ((0, $31054a6c69637582$exports).dot(this._edgeNormal, this._right) < 0) (0, $31054a6c69637582$exports).copy(edgeVerticalUp, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId]);\n                else {\n                    (0, $31054a6c69637582$exports).negate(edgeVerticalUp, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId]);\n                    (0, $31054a6c69637582$exports).negate(this._edgeNormal, this._edgeNormal);\n                }\n                if ((0, $31054a6c69637582$exports).dot(this._edgePositive, this._up) < 0) {\n                    this._isLeftToRightVertical[edgeId] = true;\n                    (0, $31054a6c69637582$exports).copy(edgeVerticalRight, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[edgeId]);\n                } else {\n                    this._isLeftToRightVertical[edgeId] = false;\n                    (0, $31054a6c69637582$exports).negate(edgeVerticalRight, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIVES[edgeId]);\n                    (0, $31054a6c69637582$exports).negate(this._edgePositive, this._edgePositive);\n                }\n                (0, $31054a6c69637582$exports).cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n                if ((0, $31054a6c69637582$exports).dot(edgeVerticalForward, this._forward) < 0) {\n                    this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                    (0, $31054a6c69637582$exports).negate(edgeVerticalRight, edgeVerticalRight);\n                }\n                (0, $31054a6c69637582$exports).cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n                if (this.isEdgeVisible[edgeId]) {\n                    if (this._labels[axisId]) this._updateLabels(axisId, edgeId);\n                    if (this._titles[axisId]) this._updateTitle(axisId, edgeId);\n                }\n                if (this.isHeadingVisible[edgeId]) this._updateHeading(axisId, edgeId);\n            }\n        }\n    }\n    _updateLabels(axisId, edgeId) {\n        const orientation = this._orientations[axisId];\n        let distance = this._distances[edgeId];\n        let maxLabelSize = this._maxLabelSize[axisId][1];\n        if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel) maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n        distance += maxLabelSize * 0.5;\n        (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIONS[edgeId], this._size);\n        (0, $31054a6c69637582$exports).scaleAndAdd(this._vec3, this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId], distance);\n        const labelMMatrix = this._labelMMatrices[edgeId];\n        labelMMatrix[12] = this._vec3[0];\n        labelMMatrix[13] = this._vec3[1];\n        labelMMatrix[14] = this._vec3[2];\n        if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel) {\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            labelMMatrix[0] = right[0];\n            labelMMatrix[1] = right[1];\n            labelMMatrix[2] = right[2];\n            labelMMatrix[4] = up[0];\n            labelMMatrix[5] = up[1];\n            labelMMatrix[6] = up[2];\n            labelMMatrix[8] = forward[0];\n            labelMMatrix[9] = forward[1];\n            labelMMatrix[10] = forward[2];\n        } else {\n            const right = this._edgeVerticalRight[edgeId];\n            const up = this._edgeVerticalUp[edgeId];\n            const forward = this._edgeVerticalForward[edgeId];\n            labelMMatrix[0] = right[0];\n            labelMMatrix[1] = right[1];\n            labelMMatrix[2] = right[2];\n            labelMMatrix[4] = up[0];\n            labelMMatrix[5] = up[1];\n            labelMMatrix[6] = up[2];\n            labelMMatrix[8] = forward[0];\n            labelMMatrix[9] = forward[1];\n            labelMMatrix[10] = forward[2];\n        }\n        (0, $1ac1b59392edf35b$exports).multiply(labelMMatrix, this._mMatrix, labelMMatrix);\n        if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular) (0, $1ac1b59392edf35b$exports).multiply(labelMMatrix, labelMMatrix, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_ROTATION_MINUS_90);\n        distance += maxLabelSize * 0.5;\n        this._distances[edgeId] = distance;\n    }\n    _updateTitle(axisId, edgeId) {\n        let distance = this._distances[edgeId];\n        const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n        distance += titleTextSize * 0.5;\n        (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIONS[edgeId], this._size);\n        (0, $31054a6c69637582$exports).scaleAndAdd(this._vec3, this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId], distance);\n        const titleMMatrix = this._titleMMatrices[edgeId];\n        titleMMatrix[12] = this._vec3[0];\n        titleMMatrix[13] = this._vec3[1];\n        titleMMatrix[14] = this._vec3[2];\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        titleMMatrix[0] = right[0];\n        titleMMatrix[1] = right[1];\n        titleMMatrix[2] = right[2];\n        titleMMatrix[4] = up[0];\n        titleMMatrix[5] = up[1];\n        titleMMatrix[6] = up[2];\n        titleMMatrix[8] = forward[0];\n        titleMMatrix[9] = forward[1];\n        titleMMatrix[10] = forward[2];\n        (0, $1ac1b59392edf35b$exports).multiply(titleMMatrix, this._mMatrix, titleMMatrix);\n        distance += titleTextSize * 0.5;\n        this._distances[edgeId] = distance;\n    }\n    _updateHeading(axisId, edgeId) {\n        let distance = this._distances[edgeId];\n        const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n        distance += headingTextSize * 0.5;\n        (0, $31054a6c69637582$exports).multiply(this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_POSITIONS[edgeId], this._size);\n        (0, $31054a6c69637582$exports).scaleAndAdd(this._vec3, this._vec3, (0, $3ce6ee188e300946$export$7005c9eb6671414d).EDGE_NORMALS[edgeId], distance);\n        const headingMMatrix = this._headingMMatrices[edgeId];\n        headingMMatrix[12] = this._vec3[0];\n        headingMMatrix[13] = this._vec3[1];\n        headingMMatrix[14] = this._vec3[2];\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        headingMMatrix[0] = right[0];\n        headingMMatrix[1] = right[1];\n        headingMMatrix[2] = right[2];\n        headingMMatrix[4] = up[0];\n        headingMMatrix[5] = up[1];\n        headingMMatrix[6] = up[2];\n        headingMMatrix[8] = forward[0];\n        headingMMatrix[9] = forward[1];\n        headingMMatrix[10] = forward[2];\n        (0, $1ac1b59392edf35b$exports).multiply(headingMMatrix, this._mMatrix, headingMMatrix);\n        distance += headingTextSize * 0.5;\n        this._distances[edgeId] = distance;\n    }\n    _updateGrids(size) {\n        let offset = 0;\n        this.pickGridLookup = {};\n        this._pickGrid = [];\n        const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n        const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n        const count = 2 * (xDivisions * yDivisions) + xDivisions + yDivisions;\n        const byteLength = (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES * count * 4;\n        if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n            this._gridVertices = new ArrayBuffer(byteLength);\n            this._gridVerticesView = new DataView(this._gridVertices);\n            this._gridIndices = new Uint16Array(count * 6);\n        }\n        for(let axisId = 0; axisId < 2; axisId++){\n            const width = size[axisId];\n            (0, $31054a6c69637582$exports).set(this._gridTicksScales[axisId], width, this._gridPickDivisionHeight, 1);\n            offset = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset);\n            this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n        }\n        const axisId = 2;\n        this._gridFaceScale[axisId] = 1;\n        for(let faceId = 0; faceId < 2; faceId++)offset = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset);\n    }\n    _updateText(size) {\n        let glyphOffset = 0;\n        let count = 0;\n        for(let axisId = 0; axisId < 2; axisId++){\n            const labels = this._labels[axisId];\n            if (labels) for(let i = 0; i < labels.length; i++)count += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n            const title = this._titles[axisId];\n            if (title) count += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n            const heading = this._headings[axisId];\n            if (heading) count += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n        const byteLength = (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES * count * 4;\n        if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n            this._textVertices = new ArrayBuffer(byteLength);\n            this._textVerticesView = new DataView(this._textVertices);\n            this._textIndices = new Uint16Array(count * 6);\n        }\n        this.pickLabelLookup = {};\n        this._pickLabel = [];\n        for(let axisId = 0; axisId < 2; axisId++)if (this._labels[axisId]) {\n            const width = size[axisId];\n            const maxLabelSize = this._maxLabelSize[axisId];\n            const orientation = this._orientations[axisId];\n            (0, $91b0cc4981465964$exports).set(maxLabelSize, 0, 0);\n            this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n            glyphOffset = this._updateLeftToRightAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n            this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n            this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n            glyphOffset = this._updateRightToLeftAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n            this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n            this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n            this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n            this._axesLeftToRightIndexCounts[axisId] = 0;\n            this._axesRightToLeftIndexCounts[axisId] = 0;\n            this._maxLabelSize[axisId][0] = 0;\n            this._maxLabelSize[axisId][1] = 0;\n        }\n        this.pickTitleLookup = {};\n        this._pickTitle = [];\n        for(let axisId = 0; axisId < 2; axisId++)if (this._titles[axisId]) {\n            (0, $31054a6c69637582$exports).set(this._textPosition, 0, 0, 0);\n            (0, $31054a6c69637582$exports).set(this._textOffset, 0, 0, 0);\n            this._titleIndexOffsets[axisId] = glyphOffset * 6;\n            const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n            const scale = this._titleSizes[axisId] / this._font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n            const width = this._textMetric.width * scale;\n            const maxGlyphTop = this._textMetric.maxTop * scale;\n            const lineHeight = this._font.size * scale;\n            this._textOffset[0] -= width / 2;\n            this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesTitle, this._vec4);\n            this.pickTitleLookup[pickId] = this._pickTitle.length;\n            this._pickTitle.push(axisId);\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n            glyphOffset += text.length;\n            this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n            this._titleIndexOffsets[axisId] = glyphOffset * 6;\n            this._titleIndexCounts[axisId] = 0;\n        }\n        this.pickHeadingLookup = {};\n        this._pickHeading = [];\n        for(let axisId = 0; axisId < 2; axisId++)if (this._headings[axisId]) {\n            (0, $31054a6c69637582$exports).set(this._textPosition, 0, 0, 0);\n            (0, $31054a6c69637582$exports).set(this._textOffset, 0, 0, 0);\n            this._headingIndexOffsets[axisId] = glyphOffset * 6;\n            const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n            const scale = this._headingSizes[axisId] / this._font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n            const width = this._textMetric.width * scale;\n            const maxGlyphTop = this._textMetric.maxTop * scale;\n            const lineHeight = this._font.size * scale;\n            this._textOffset[0] -= width / 2;\n            this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesHeading, this._vec4);\n            this.pickHeadingLookup[pickId] = this._pickHeading.length;\n            this._pickHeading.push(axisId);\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n            glyphOffset += text.length;\n            this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n            this._headingIndexOffsets[axisId] = glyphOffset * 6;\n            this._headingIndexCounts[axisId] = 0;\n        }\n    }\n    _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n        const isAxisReversed = this.isAxisReversed[axisId];\n        for(let label = 0; label < labels.length; label++){\n            const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n            const lineHeight = scales[label];\n            const scale = lineHeight / this._font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n            const width = this._textMetric.width * scale;\n            const maxGlyphTop = this._textMetric.maxTop * scale;\n            const position = isAxisReversed ? 1 - positions[label] : positions[label];\n            switch(orientation){\n                case (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel:\n                    (0, $31054a6c69637582$exports).set(this._textPosition, (position - 0.5) * size, 0, 0);\n                    if (this._isDiscrete[axisId]) this._textOffset[0] = -width / 2;\n                    else this._textOffset[0] = position == 0 ? 0 : position == 1 ? -width : -width / 2;\n                    this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                    maxSize[0] = Math.max(width, maxSize[0]);\n                    maxSize[1] = Math.max(lineHeight, maxSize[1]);\n                    break;\n                case (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular:\n                    (0, $31054a6c69637582$exports).set(this._textPosition, 0, (position - 0.5) * size, 0);\n                    this._textOffset[0] = -width / 2;\n                    if (this._isDiscrete[axisId]) this._textOffset[1] = -maxGlyphTop / 2;\n                    else this._textOffset[1] = position == 0 ? 0 : position == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n                    maxSize[0] = Math.max(lineHeight, maxSize[0]);\n                    maxSize[1] = Math.max(width, maxSize[1]);\n                    break;\n            }\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesLabel, this._vec4);\n            this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n            this._pickLabel.push(axisId);\n            this._pickLabel.push(label);\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n            glyphOffset += text.length;\n        }\n        return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n        const isAxisReversed = this.isAxisReversed[axisId];\n        for(let label = 0; label < labels.length; label++){\n            const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n            const lineHeight = scales[label];\n            const scale = lineHeight / this._font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n            const width = this._textMetric.width * scale;\n            const maxGlyphTop = this._textMetric.maxTop * scale;\n            const position = isAxisReversed ? 1 - positions[label] : positions[label];\n            switch(orientation){\n                case (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel:\n                    (0, $31054a6c69637582$exports).set(this._textPosition, (0.5 - position) * size, 0, 0);\n                    if (this._isDiscrete[axisId]) this._textOffset[0] = -width / 2;\n                    else this._textOffset[0] = label == 0 ? -width : label == labels.length - 1 ? 0 : -width / 2;\n                    this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                    break;\n                case (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular:\n                    (0, $31054a6c69637582$exports).set(this._textPosition, 0, (0.5 - position) * size, 0);\n                    this._textOffset[0] = -width / 2;\n                    if (this._isDiscrete[axisId]) this._textOffset[1] = -maxGlyphTop / 2;\n                    else this._textOffset[1] = label == 0 ? -maxGlyphTop : label == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n                    break;\n            }\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesLabel, this._vec4);\n            this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n            this._pickLabel.push(axisId);\n            this._pickLabel.push(label);\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n            glyphOffset += text.length;\n        }\n        return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset) {\n        this._gridTicksIndexOffsets[axisId] = offset * 6;\n        if (this._gridTicksPositions[axisId]) {\n            const axes = (0, $31054a6c69637582$exports).create();\n            const positions = this._gridTicksPositions[axisId];\n            const isAxisReversed = this.isAxisReversed[axisId];\n            let vertexOffset = offset * 4;\n            for(let position = 0; position < positions.length - 1; position++){\n                const left = isAxisReversed ? 1 - positions[position + 1] - 0.5 : positions[position] - 0.5;\n                const right = isAxisReversed ? 1 - positions[position] - 0.5 : positions[position + 1] - 0.5;\n                axes[axisId] = position + 1;\n                const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n                (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesDivision, this._vec4);\n                this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                this._pickGrid.push(axes[0]);\n                this._pickGrid.push(axes[1]);\n                this._pickGrid.push(axes[2]);\n                let indexOffset = offset * 6;\n                for(let j = 0; j < this._indexTemplate.length; j++)indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n                (0, $4c4ac78b213a9c07$exports).set(this._bounds, left + 0.5, 0, right + 0.5, 1);\n                this._translation[0] = left;\n                this._translation[1] = 0.5;\n                this._translation[2] = 0;\n                this._texCoord[0] = left + 0.5;\n                this._texCoord[1] = 1;\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                vertexOffset++;\n                this._translation[0] = right;\n                this._texCoord[0] = right + 0.5;\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                vertexOffset++;\n                this._translation[0] = left;\n                this._translation[1] = -0.5;\n                this._texCoord[0] = left + 0.5;\n                this._texCoord[1] = 0;\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                vertexOffset++;\n                this._translation[0] = right;\n                this._texCoord[0] = right + 0.5;\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                vertexOffset++;\n                offset++;\n            }\n        }\n        this._gridTicksIndexCounts[axisId] = offset * 6 - this._gridTicksIndexOffsets[axisId];\n        return offset;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset) {\n        (0, $31054a6c69637582$exports).set(this._translation, 0, 0, 0);\n        this._gridFaceIndexOffsets[faceId] = offset * 6;\n        const axisId2 = axisId == 0 ? 1 : 0;\n        const axisId3 = axisId == 2 ? 1 : 2;\n        if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n            const axes = (0, $31054a6c69637582$exports).create();\n            (0, $31054a6c69637582$exports).negate(this._normal, (0, $3ce6ee188e300946$export$7005c9eb6671414d).FACE_NORMALS[faceId]);\n            const positions2 = this._gridTicksPositions[axisId2];\n            const positions3 = this._gridTicksPositions[axisId3];\n            const isAxisReversed2 = this.isAxisReversed[axisId2];\n            const isAxisReversed3 = this.isAxisReversed[axisId3];\n            for(let position2 = 0; position2 < positions2.length - 1; position2++){\n                const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n                const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n                axes[axisId2] = position2 + 1;\n                let vertexOffset = offset * 4;\n                for(let position3 = 0; position3 < positions3.length - 1; position3++){\n                    const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n                    const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n                    axes[axisId3] = position3 + 1;\n                    const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n                    (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesDivision, this._vec4);\n                    this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                    this._pickGrid.push(axes[0]);\n                    this._pickGrid.push(axes[1]);\n                    this._pickGrid.push(axes[2]);\n                    let indexOffset = offset * 6;\n                    for(let i = 0; i < this._indexTemplate.length; i++)indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n                    (0, $4c4ac78b213a9c07$exports).set(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n                    this._translation[axisId2] = min2;\n                    this._translation[axisId3] = max3;\n                    this._texCoord[0] = min2 + 0.5;\n                    this._texCoord[1] = max3 + 0.5;\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, this._normal);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[axisId2] = max2;\n                    this._texCoord[0] = max2 + 0.5;\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, this._normal);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[axisId2] = min2;\n                    this._translation[axisId3] = min3;\n                    this._texCoord[0] = min2 + 0.5;\n                    this._texCoord[1] = min3 + 0.5;\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, this._normal);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[axisId2] = max2;\n                    this._texCoord[0] = max2 + 0.5;\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTranslation(dataView, vertexOffset, this._translation);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setNormal(dataView, vertexOffset, this._normal);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setIdColor(dataView, vertexOffset, this._vec4);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setTexCoord(dataView, vertexOffset, this._texCoord);\n                    (0, $0a0587bd8b0d58e8$export$df352805a955aca5).setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    offset++;\n                }\n            }\n        }\n        this._gridFaceIndexCounts[faceId] = offset * 6 - this._gridFaceIndexOffsets[faceId];\n        return offset;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $f690fa88528736e9$export$408bb2acbb28390c {\n    toJSON() {\n        return {\n            key: this.key,\n            char: this.char,\n            width: this.width,\n            height: this.height,\n            top: this.top,\n            left: this.left,\n            advance: this.advance,\n            u0: this.u0,\n            v0: this.v0,\n            u1: this.u1,\n            v1: this.v1\n        };\n    }\n}\nclass $f690fa88528736e9$export$e784a6eab4d2d700 {\n    update() {}\n    constructor(font){\n        this.font = font;\n    }\n}\nclass $f690fa88528736e9$export$89abf52a030e56ee {\n    get atlas() {\n        return this._rasterizer.fontAtlas;\n    }\n    get count() {\n        return this._chars.size;\n    }\n    constructor(core, rasterizer){\n        this._core = core;\n        this._rasterizer = rasterizer;\n        this._chars = new Set();\n        this._previousSize = 0;\n        this.glyphs = {};\n    }\n    addGlyph(char) {\n        if (!this._chars.has(char)) {\n            this._chars.add(char);\n            this._rasterizer.draw(char);\n            this._hasChanged = true;\n        }\n    }\n    update() {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.name} added ${this._chars.size - this._previousSize} new glyphs`);\n            this._previousSize = this._chars.size;\n            if (this.hasChangedCallback) this.hasChangedCallback();\n        }\n    }\n    toJSON() {\n        const glyphs = [];\n        for(let key in this.glyphs){\n            const glyph = this.glyphs[key];\n            glyphs.push(glyph.toJSON());\n        }\n        return {\n            name: this.name,\n            size: this.size,\n            border: this.border,\n            glyphs: glyphs,\n            edgeValue: this.edgeValue\n        };\n    }\n}\nclass $f690fa88528736e9$export$834e93b4abb19d0a {\n    constructor(width, height){\n        const canvas = document.createElement(\"canvas\");\n        canvas.width = width;\n        canvas.height = height;\n        const context = canvas.getContext(\"2d\");\n        context.clearRect(0, 0, width, height);\n        this.imageData = context.getImageData(0, 0, width, height);\n        this.x = 0;\n        this.top = new Uint16Array(width);\n    }\n}\nclass $f690fa88528736e9$export$9cdd7c9f8d056e99 {\n    get font() {\n        return this._font;\n    }\n    get fontAtlas() {\n        return this._fontAtlas;\n    }\n    constructor(core, options){\n        let start = performance.now();\n        this._core = core;\n        this._fontAtlas = options.fontAtlas;\n        this._fontSize = options.fontSize;\n        this._border = options.border;\n        this._fontFamily = options.fontFamily;\n        this._fontWeight = options.fontWeight;\n        this._fontStyle = options.fontStyle;\n        this._baseline = options.baseline;\n        this._maxDistance = options.maxDistance;\n        this._edgeValue = options.edgeValue;\n        this._font = new $f690fa88528736e9$export$89abf52a030e56ee(core, this);\n        this._font.name = `${this._fontFamily}${this._fontSize}${this._fontWeight == \"normal\" ? \"\" : this._fontWeight}${this._fontStyle == \"normal\" ? \"\" : this._fontStyle}`.replace(/[^a-z0-9,]/ig, \"\").toLowerCase();\n        this._font.size = this._fontSize;\n        this._font.border = this._border;\n        this._font.edgeValue = this._edgeValue;\n        const glyphRasterizerOptions = {\n            baseline: this._baseline,\n            border: this._border,\n            edgeValue: this._edgeValue,\n            fontFamily: this._fontFamily,\n            fontSize: this._fontSize,\n            fontStyle: this._fontStyle,\n            fontWeight: this._fontWeight,\n            maxDistance: this._maxDistance\n        };\n        this._glyphRasterizer = new $f690fa88528736e9$export$8109d828920592df(core, glyphRasterizerOptions);\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `font rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n        const glyph = this._glyphRasterizer.draw(char);\n        const texWidth = glyph.width + 2 * this._border;\n        const texHeight = glyph.height + 2 * this._border;\n        const width = this._fontAtlas.imageData.width;\n        const height = this._fontAtlas.imageData.height;\n        if (this._fontAtlas.x + texWidth > width) this._fontAtlas.x = 0;\n        let y = 0;\n        for(let x = this._fontAtlas.x; x < this._fontAtlas.x + texWidth; x++)y = Math.max(y, this._fontAtlas.top[x]);\n        if (y + texHeight > height) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, `${this._font.name} height overflow`);\n        for(let x = this._fontAtlas.x; x < this._fontAtlas.x + texWidth; x++)this._fontAtlas.top[x] = y + texHeight;\n        glyph.u0 = this._fontAtlas.x / width;\n        glyph.v0 = y / height;\n        glyph.u1 = (this._fontAtlas.x + texWidth) / width;\n        glyph.v1 = (y + texHeight) / height;\n        this._font.glyphs[char] = glyph;\n        for(let i = 0; i < glyph.distances.length; i++){\n            const distance = glyph.distances[i];\n            const dataX = i % texWidth;\n            const dataY = Math.floor(i / texWidth);\n            const offset = (this._fontAtlas.x + dataX + (y + dataY) * width) * 4;\n            this._fontAtlas.imageData.data[offset + 0] = distance;\n            this._fontAtlas.imageData.data[offset + 1] = distance;\n            this._fontAtlas.imageData.data[offset + 2] = distance;\n            this._fontAtlas.imageData.data[offset + 3] = 0xff;\n        }\n        this._fontAtlas.x += texWidth;\n    }\n}\nclass $f690fa88528736e9$export$8109d828920592df {\n    constructor(core, options){\n        let start = performance.now();\n        this._core = core;\n        this._fontSize = options.fontSize;\n        this._border = options.border;\n        this._fontFamily = options.fontFamily;\n        this._fontWeight = options.fontWeight;\n        this._fontStyle = options.fontStyle;\n        this._baseline = options.baseline;\n        this._maxDistance = options.maxDistance;\n        this._edgeValue = options.edgeValue;\n        this._size = this._fontSize + this._border * 2;\n        this._size += this._border * 2;\n        this._gridOuter = new Float64Array(this._size * this._size);\n        this._gridInner = new Float64Array(this._size * this._size);\n        this._f = new Float64Array(this._size);\n        this._z = new Float64Array(this._size + 1);\n        this._v = new Uint16Array(this._size);\n        const canvas = document.createElement(\"canvas\");\n        canvas.width = canvas.height = this._size;\n        this._context = canvas.getContext(\"2d\", {\n            willReadFrequently: true\n        });\n        this._context.font = `${this._fontStyle} ${this._fontWeight} ${this._fontSize}px ${this._fontFamily} `;\n        this._context.textBaseline = this._baseline;\n        this._context.textAlign = \"left\";\n        this._context.fillStyle = \"black\";\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `glyph rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n        const textMetrics = this._context.measureText(char);\n        const glyphLeft = 0;\n        const glyphTop = Math.floor(textMetrics.actualBoundingBoxAscent);\n        let glyphWidth = Math.ceil(textMetrics.actualBoundingBoxRight);\n        let glyphHeight = Math.ceil(textMetrics.actualBoundingBoxAscent) + Math.ceil(textMetrics.actualBoundingBoxDescent);\n        glyphWidth = Math.min(this._size - this._border, glyphWidth);\n        glyphHeight = Math.min(this._size - this._border, glyphHeight);\n        const width = glyphWidth + 2 * this._border;\n        const height = glyphHeight + 2 * this._border;\n        const length = width * height;\n        const distances = new Uint8ClampedArray(length);\n        const gradientsX = new Uint8ClampedArray(length);\n        const gradientsY = new Uint8ClampedArray(length);\n        const pixels = new Uint8ClampedArray(length);\n        const glyph = new $f690fa88528736e9$export$408bb2acbb28390c();\n        glyph.char = char;\n        glyph.key = char.codePointAt(0);\n        glyph.distances = distances;\n        glyph.gradientsX = gradientsX;\n        glyph.gradientsY = gradientsY;\n        glyph.pixels = pixels;\n        glyph.width = glyphWidth;\n        glyph.height = glyphHeight;\n        glyph.top = glyphTop;\n        glyph.left = glyphLeft;\n        glyph.advance = textMetrics.width;\n        if (glyphWidth == 0 || glyphHeight == 0) return glyph;\n        this._context.clearRect(this._border, this._border, glyphWidth, glyphHeight);\n        this._context.fillText(char, this._border, this._border + glyphTop);\n        const imgData = this._context.getImageData(this._border, this._border, glyphWidth, glyphHeight);\n        for(let i = 0; i < length; i++){\n            this._gridOuter[i] = Number.MAX_VALUE;\n            this._gridInner[i] = 0;\n        }\n        for(let y = 0; y < glyphHeight; y++)for(let x = 0; x < glyphWidth; x++){\n            const a = imgData.data[4 * (y * glyphWidth + x) + 3] / 0xff;\n            if (a > 0) {\n                const j = (y + this._border) * width + x + this._border;\n                if (a == 1) {\n                    this._gridOuter[j] = 0;\n                    this._gridInner[j] = Number.MAX_VALUE;\n                } else {\n                    const d = 0.5 - a;\n                    this._gridOuter[j] = d > 0 ? d * d : 0;\n                    this._gridInner[j] = d < 0 ? d * d : 0;\n                    pixels[j] = 0xff;\n                }\n            }\n        }\n        this._edt(this._gridOuter, 0, 0, width, height, width, this._f, this._v, this._z);\n        this._edt(this._gridInner, this._border, this._border, glyphWidth, glyphHeight, width, this._f, this._v, this._z);\n        const distances2 = new Float32Array(length);\n        for(let i = 0; i < length; i++){\n            const distance = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n            distances[i] = Math.round(this._edgeValue - distance * 0xff / this._maxDistance);\n            distances2[i] = distance;\n        }\n        for(let i = 0; i < length; i++){\n            const x = i % width;\n            const y = Math.floor(i / width);\n            const d = distances2[i];\n            const sign = d < 0 ? -1 : 1;\n            const x0 = x > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n            const x1 = x < width - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n            const y0 = y > 0 ? distances2[i - width] : Number.MAX_VALUE;\n            const y1 = y < height - 1 ? distances2[i + width] : Number.MAX_VALUE;\n            let gradientX = sign * x0 < sign * x1 ? d - x0 : x1 - d;\n            let gradientY = sign * y0 < sign * y1 ? y0 - d : d - y1;\n            gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 0xff);\n            gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 0xff);\n        }\n        return glyph;\n    }\n    _edt(data, x0, y0, width, height, gridSize, f, v, z) {\n        for(let x = x0; x < x0 + width; x++)this._edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);\n        for(let y = y0; y < y0 + height; y++)this._edt1d(data, y * gridSize + x0, 1, width, f, v, z);\n    }\n    _edt1d(grid, offset, stride, n, f, v, z) {\n        v[0] = 0;\n        z[0] = -Number.MAX_VALUE;\n        z[1] = Number.MAX_VALUE;\n        f[0] = grid[offset];\n        for(let q = 1, k = 0, s = 0; q < n; q++){\n            f[q] = grid[offset + q * stride];\n            const q2 = q * q;\n            do {\n                const r = v[k];\n                s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n            }while (s <= z[k] && --k > -1);\n            k++;\n            v[k] = q;\n            z[k] = s;\n            z[k + 1] = Number.MAX_VALUE;\n        }\n        for(let q = 0, k = 0; q < n; q++){\n            while(z[k + 1] < q)k++;\n            const r = v[k];\n            const qr = q - r;\n            grid[offset + q * stride] = f[r] + qr * qr;\n        }\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $fe2e3fed887771f8$export$a1bb24b21e5c8dba {\n    get manipulators() {\n        return this._manipulators;\n    }\n    get count() {\n        return this._count;\n    }\n    get isDragging() {\n        return this._isDragging;\n    }\n    constructor(core){\n        this._core = core;\n        this._count = 0;\n        this._centroid = (0, $31054a6c69637582$exports).create();\n        this._previousCentroid = (0, $31054a6c69637582$exports).create();\n        this._relativePositionToCentroid = (0, $31054a6c69637582$exports).create();\n        this._directionToCentroid = (0, $31054a6c69637582$exports).create();\n        this._previousDirectionToCentroid = (0, $31054a6c69637582$exports).create();\n        this._manipulators = {};\n        this._removedManipulators = [];\n        this.cumulativeTranslation = (0, $31054a6c69637582$exports).create();\n        this.translationDelta = (0, $31054a6c69637582$exports).create();\n        this.centroid = (0, $31054a6c69637582$exports).create();\n        this.maxScale = Number.MAX_VALUE;\n        this.twistAxis = (0, $31054a6c69637582$exports).fromValues(0, 0, 1);\n        this.initialize();\n    }\n    update(elapsedTime, manipulators) {\n        for(const key in this._manipulators){\n            const manipulator = this._manipulators[key];\n            if (!manipulators[manipulator.id]) {\n                if (this.removeManipulator) this.removeManipulator(manipulator);\n                this._removedManipulators.push(manipulator.id);\n            }\n        }\n        if (this._removedManipulators.length > 0) {\n            for(let i = 0; i < this._removedManipulators.length; i++){\n                delete this._manipulators[this._removedManipulators[i]];\n                this._count--;\n            }\n            this._removedManipulators = [];\n        }\n        for(const key in manipulators){\n            const manipulator = manipulators[key];\n            if (!this._manipulators[manipulator.id]) {\n                if (!this.addManipulator || this.addManipulator(manipulator)) {\n                    (0, $31054a6c69637582$exports).copy(manipulator.initialPosition, manipulator.position);\n                    this._manipulators[manipulator.id] = manipulator;\n                    this._count++;\n                }\n            }\n        }\n        (0, $31054a6c69637582$exports).set(this.translationDelta, 0, 0, 0);\n        this.scaleDelta = 0;\n        this.twistDelta = 0;\n        if (this._count > 0) {\n            if (this._previousCount > 0) {\n                if (this.prepareManipulation) this.prepareManipulation();\n                this._process();\n                if (this.processManipulation) this.processManipulation(elapsedTime);\n            } else {\n                this.initialize();\n                if (this.beginManipulation) this.beginManipulation();\n            }\n        } else {\n            if (this._previousCount > 0) {\n                if (this.endManipulation) this.endManipulation();\n            }\n        }\n        this._isDragging = this._count == 1 && (0, $31054a6c69637582$exports).squaredLength(this.cumulativeTranslation) > this._core.config.dragToleranceSquared || this._count > 1;\n        this._previousCount = this._count;\n    }\n    initialize() {\n        (0, $31054a6c69637582$exports).set(this.centroid, 0, 0, 0);\n        (0, $31054a6c69637582$exports).set(this.cumulativeTranslation, 0, 0, 0);\n        this.cumulativeScale = 1;\n        this.cumulativeTwist = 0;\n    }\n    _process() {\n        if (this._previousCount > 0) {\n            let persisted = 0;\n            for(const key in this._manipulators){\n                const manipulator = this._manipulators[key];\n                if (manipulator.isPersisted) persisted++;\n            }\n            const removed = this._previousCount - persisted;\n            if (persisted > 0) {\n                if (removed > 0) (0, $31054a6c69637582$exports).copy(this._centroid, this._previousCentroid);\n                else {\n                    (0, $31054a6c69637582$exports).set(this._centroid, 0, 0, 0);\n                    for(const key in this._manipulators){\n                        const manipulator = this._manipulators[key];\n                        if (manipulator.isPersisted) (0, $31054a6c69637582$exports).add(this._centroid, this._centroid, manipulator.position);\n                    }\n                    (0, $31054a6c69637582$exports).scale(this._centroid, this._centroid, 1 / persisted);\n                }\n                for(const key in this._manipulators){\n                    const manipulator = this._manipulators[key];\n                    if (manipulator.isPersisted) {\n                        manipulator.maxTranslationSquared = Math.max(manipulator.maxTranslationSquared, (0, $31054a6c69637582$exports).squaredDistance(manipulator.position, manipulator.initialPosition));\n                        (0, $31054a6c69637582$exports).add(this.translationDelta, this.translationDelta, manipulator.position);\n                        (0, $31054a6c69637582$exports).subtract(this.translationDelta, this.translationDelta, manipulator.previousPosition);\n                        (0, $31054a6c69637582$exports).subtract(this._relativePositionToCentroid, manipulator.position, this._centroid);\n                        const distanceToCentroidSquared = (0, $31054a6c69637582$exports).squaredLength(this._relativePositionToCentroid);\n                        if (distanceToCentroidSquared < this._core.config.manipulatorMinRelativeDistanceSquared) this.scaleDelta += 1;\n                        else {\n                            const distanceToCentroid = Math.sqrt(distanceToCentroidSquared);\n                            const previousDistanceToCentroidSquared = (0, $31054a6c69637582$exports).squaredLength(manipulator.previousPositionRelativeToCentroid);\n                            const previousDistanceToCentroid = Math.sqrt(previousDistanceToCentroidSquared);\n                            this.scaleDelta += distanceToCentroid / previousDistanceToCentroid;\n                            (0, $31054a6c69637582$exports).scale(this._directionToCentroid, this._relativePositionToCentroid, 1 / distanceToCentroid);\n                            (0, $31054a6c69637582$exports).scale(this._previousDirectionToCentroid, manipulator.previousPositionRelativeToCentroid, 1 / previousDistanceToCentroid);\n                            this.twistDelta += (0, $a49c65c28e06311e$export$210d3b2db589eb5c).signedAngleBetweenVectors(this._previousDirectionToCentroid, this._directionToCentroid, this.twistAxis);\n                        }\n                    }\n                }\n                (0, $31054a6c69637582$exports).scale(this.translationDelta, this.translationDelta, 1 / persisted);\n                (0, $31054a6c69637582$exports).add(this.cumulativeTranslation, this.cumulativeTranslation, this.translationDelta);\n                this.scaleDelta /= persisted;\n                this.cumulativeScale = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp(this.cumulativeScale * this.scaleDelta, this.minScale, this.maxScale);\n                this.scaleDelta -= 1;\n                this.twistDelta /= persisted;\n                this.cumulativeTwist += this.twistDelta;\n            }\n        }\n        (0, $31054a6c69637582$exports).set(this.centroid, 0, 0, 0);\n        for(const key in this._manipulators){\n            const manipulator = this._manipulators[key];\n            (0, $31054a6c69637582$exports).add(this.centroid, this.centroid, manipulator.position);\n        }\n        (0, $31054a6c69637582$exports).scale(this.centroid, this.centroid, 1 / this._count);\n        for(const key in this._manipulators){\n            const manipulator = this._manipulators[key];\n            (0, $31054a6c69637582$exports).subtract(manipulator.positionRelativeToCentroid, manipulator.position, this.centroid);\n        }\n        (0, $31054a6c69637582$exports).copy(this._previousCentroid, this.centroid);\n        for(const key in this._manipulators){\n            const manipulator = this._manipulators[key];\n            manipulator.isPersisted = true;\n            (0, $31054a6c69637582$exports).copy(manipulator.previousPosition, manipulator.position);\n            (0, $31054a6c69637582$exports).copy(manipulator.previousRotationAxis, manipulator.rotationAxis);\n            (0, $31054a6c69637582$exports).copy(manipulator.previousPositionRelativeToCentroid, manipulator.positionRelativeToCentroid);\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $70fcce5652cf6320$export$25eea374d13151b1 {\n    constructor(core){\n        this._core = core;\n        this._previousTotal = 0;\n        this.total = 0;\n    }\n    initialize(element) {\n        element.addEventListener(\"wheel\", (e)=>{\n            e.preventDefault();\n            const wheelEvent = e;\n            this.total += wheelEvent.deltaY;\n        }, {\n            passive: false\n        });\n    }\n    update(elapsedTime) {\n        const total = this.total;\n        this.delta = total - this._previousTotal;\n        this._previousTotal = total;\n        if (this._core.config.isDebugVisible) this._core.debugText.addLine(`mse whl ${this.total < 0 ? \"\" : \" \"}${Math.round(this.total)}`);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $c2c210fed9a5e919$export$7a218bb03b109350 {\n    constructor(){\n        this.pickedIndex = 0;\n        this.maxTranslationSquared = 0;\n        this.initialPosition = (0, $31054a6c69637582$exports).create();\n        this.position = (0, $31054a6c69637582$exports).create();\n        this.previousPosition = (0, $31054a6c69637582$exports).create();\n        this.holdOrigin = (0, $31054a6c69637582$exports).create();\n        this.positionRelativeToCentroid = (0, $31054a6c69637582$exports).create();\n        this.previousPositionRelativeToCentroid = (0, $31054a6c69637582$exports).create();\n        this.rotationAxis = (0, $31054a6c69637582$exports).create();\n        this.previousRotationAxis = (0, $31054a6c69637582$exports).create();\n    }\n}\n\n\nclass $0cfca151d38bf5a7$export$6412482d5070c3e5 {\n    get hoverX() {\n        return this._hoverX;\n    }\n    get hoverY() {\n        return this._hoverY;\n    }\n    get hoverId() {\n        return this._hoverId;\n    }\n    constructor(core, manipulators){\n        this._core = core;\n        this._manipulators = manipulators;\n    }\n    initialize(element) {\n        this._element = element;\n        element.addEventListener(\"pointerdown\", (e)=>this._handlePointerDown(e), {\n            passive: true\n        });\n        element.addEventListener(\"pointermove\", (e)=>this._handlePointerMove(e), {\n            passive: true\n        });\n        element.addEventListener(\"pointerup\", (e)=>this._handlePointerUp(e), {\n            passive: true\n        });\n        element.addEventListener(\"pointercancel\", (e)=>this._handlePointerCancel(e), {\n            passive: true\n        });\n        element.addEventListener(\"pointerleave\", (e)=>this._handlePointerLeave(e), {\n            passive: true\n        });\n        element.addEventListener(\"pointerout\", (e)=>this._handlePointerOut(e), {\n            passive: true\n        });\n    }\n    update(elapsedTime) {\n        if (this._core.config.isDebugVisible) {\n            this._core.debugText.addLine(`pen rot  ${(this._tiltX | 0).toFixed(3)},${(this._tiltY | 0).toFixed(3)},${(this._twist | 0).toFixed(3)}`);\n            this._core.debugText.addLine(`hov pos  ${this.hoverX ? `${this.hoverX.toFixed(3)},${this.hoverY.toFixed(3)}px` : \"\"}`);\n        }\n    }\n    _handlePointerDown(e) {\n        this._element.focus();\n        const devicePixelRatio = this._core.renderer.devicePixelRatio;\n        const manipulator = new (0, $c2c210fed9a5e919$export$7a218bb03b109350)();\n        const id = e.pointerId;\n        const x = e.offsetX * devicePixelRatio;\n        const y = e.offsetY * devicePixelRatio;\n        manipulator.id = id;\n        manipulator.position[0] = x;\n        manipulator.position[1] = y;\n        manipulator.type = e.pointerType;\n        manipulator.button = e.button;\n        manipulator.shiftKey = e.shiftKey;\n        manipulator.ctrlKey = e.ctrlKey;\n        manipulator.altKey = e.altKey;\n        manipulator.event = e;\n        this._manipulators[id] = manipulator;\n        this._hoverId = id;\n        this._hoverX = x;\n        this._hoverY = y;\n    }\n    _handlePointerMove(e) {\n        const devicePixelRatio = this._core.renderer.devicePixelRatio;\n        const x = e.offsetX * devicePixelRatio;\n        const y = e.offsetY * devicePixelRatio;\n        const id = e.pointerId;\n        const manipulator = this._manipulators[id];\n        if (manipulator) {\n            manipulator.position[0] = x;\n            manipulator.position[1] = y;\n            manipulator.event = e;\n        }\n        switch(e.pointerType){\n            case \"mouse\":\n                this._hoverId = id;\n                this._hoverX = x;\n                this._hoverY = y;\n                break;\n            case \"pen\":\n                this._hoverId = id;\n                this._hoverX = x;\n                this._hoverY = y;\n                this._tiltX = e.tiltX;\n                this._tiltY = e.tiltY;\n                this._twist = e.twist;\n                break;\n        }\n    }\n    _handlePointerUp(e) {\n        const manipulator = this._manipulators[e.pointerId];\n        if (manipulator) manipulator.event = e;\n        this._remove(e.pointerId);\n    }\n    _handlePointerCancel(e) {\n        this._remove(e.pointerId);\n    }\n    _handlePointerLeave(e) {\n        this._resetHover();\n        this._remove(e.pointerId);\n    }\n    _handlePointerOut(e) {\n        this._resetHover();\n        this._remove(e.pointerId);\n    }\n    _resetHover() {\n        this._hoverId = null;\n        this._hoverX = null;\n        this._hoverY = null;\n    }\n    _remove(pointerId) {\n        const manipulator = this._manipulators[pointerId];\n        if (manipulator) delete this._manipulators[pointerId];\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $cc0e5bcb75088eeb$export$f1c8488f7ae08606 {\n    static smoothStep(value) {\n        return value * value * (3 - 2 * value);\n    }\n    static damp(value, target, threshold, dampening) {\n        if (Math.abs(target) < threshold) return (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(value, 0, dampening);\n        else return (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(value, target, dampening);\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $1db11aa593bd11cd$export$16e4d70cc375e707 {\n    constructor(core){\n        this._core = core;\n        this._pressedKeys = new Set();\n        this._previousPressedKeys = new Set();\n    }\n    initialize(element) {\n        element.addEventListener(\"keydown\", (e)=>{\n            this._handleKeyDown(e);\n        }, false);\n        element.addEventListener(\"keyup\", (e)=>{\n            this._handleKeyUp(e);\n        }, false);\n    }\n    update(elapsedTime) {\n        if (this._core.config.isDebugVisible) this._core.debugText.addLine(`key tot  ${this._pressedKeys.size}`);\n    }\n    isKeyDown(key) {\n        return this._pressedKeys.has(key);\n    }\n    wasKeyReleased(key) {\n        if (this._pressedKeys.has(key)) {\n            if (!this._previousPressedKeys.has(key)) {\n                this._previousPressedKeys.add(key);\n                return true;\n            }\n        } else this._previousPressedKeys.delete(key);\n        return false;\n    }\n    _handleKeyDown(e) {\n        const keyboardEvent = e;\n        const key = keyboardEvent.key;\n        if (!this._pressedKeys.has(key)) this._pressedKeys.add(key);\n    }\n    _handleKeyUp(e) {\n        const keyboardEvent = e;\n        const key = keyboardEvent.key;\n        if (this._pressedKeys.has(key)) this._pressedKeys.delete(key);\n    }\n}\n\n\nclass $942e14c8121accda$export$d0d38e7dec7a1a61 {\n    constructor(core){\n        this._manipulators = {};\n        this._core = core;\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._manipulationProcessor = new (0, $fe2e3fed887771f8$export$a1bb24b21e5c8dba)(core);\n        this._manipulators = {};\n        this._pointers = new (0, $0cfca151d38bf5a7$export$6412482d5070c3e5)(core, this._manipulators);\n        this._pointers.initialize(core.container);\n        this._mouseWheel = new (0, $70fcce5652cf6320$export$25eea374d13151b1)(core);\n        this._mouseWheel.initialize(core.container);\n        this._keyboard = new (0, $1db11aa593bd11cd$export$16e4d70cc375e707)(core);\n        this._keyboard.initialize(core.container);\n        this.isPickingEnabled = true;\n        this.mouseWheelZoomScale = this._core.config.mouseWheelZoomScale;\n        this.mouseWheelRotationScale = this._core.config.mouseWheelRotationScale;\n        this.multiTouchZoomScale = this._core.config.multiTouchZoomScale;\n        this.pickHoldDelay = this._core.config.pickHoldDelay;\n        this.pickSelectDelay = this._core.config.pickSelectDelay;\n        const rightButton = 2;\n        this.singleTouchAction = (manipulator)=>{\n            if (manipulator.type == \"mouse\" && manipulator.button == rightButton || manipulator.shiftKey || manipulator.ctrlKey) return (0, $4a6417d29706362f$export$226dc1249c607930).translate;\n            else if (manipulator.altKey || manipulator.type == \"pen\" && manipulator.button == rightButton) return (0, $4a6417d29706362f$export$226dc1249c607930).lasso;\n            else return (0, $4a6417d29706362f$export$226dc1249c607930).rotate;\n        };\n        this.mouseWheelAction = (keyboard)=>{\n            if (this._keyboard.isKeyDown(\"Control\")) return (0, $4a6417d29706362f$export$335c7d069643eb6d).rotateY;\n            else return (0, $4a6417d29706362f$export$335c7d069643eb6d).zoom;\n        };\n        this.lassoPickType = (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).data;\n        this._thumbstickX = 0;\n        this._previousControllerButtonPressed = [\n            false,\n            false,\n            false,\n            false\n        ];\n        this._quat0 = (0, $39ece26d1239bb77$exports).create();\n        this._quat1 = (0, $39ece26d1239bb77$exports).create();\n    }\n    update(elapsedTime, xrFrame) {\n        if (xrFrame) {\n            const inputSources = this._core.webXRSession.inputSources;\n            if (inputSources.length > 0 && this._core.renderer.controllers.length > 0) {\n                const inputSource = inputSources[0];\n                const controllerVisual = this._core.renderer.controllers[0];\n                if (inputSource.gripSpace && inputSource.targetRayMode == \"tracked-pointer\") {\n                    const gripPose = xrFrame.getPose(inputSource.gripSpace, this._core.renderer.webXRReferenceSpace);\n                    if (gripPose) controllerVisual.mMatrix = gripPose.transform.matrix;\n                    const gamepad = inputSource.gamepad;\n                    this._core.renderer.isPickingEnabled = false;\n                    const rayPose = xrFrame.getPose(inputSource.targetRaySpace, this._core.renderer.webXRReferenceSpace);\n                    if (rayPose) {\n                        controllerVisual.rayMMatrix = rayPose.transform.matrix;\n                        if (gamepad.buttons[0].value > 0 && this.isPickingEnabled) {\n                            this._core.renderer.pickVMatrix = rayPose.transform.inverse.matrix;\n                            this._core.renderer.isPickingEnabled = true;\n                        }\n                    }\n                    const threshold = 0.2;\n                    const dampening = Math.min(0.015 * elapsedTime, 1);\n                    this._thumbstickX = (0, $cc0e5bcb75088eeb$export$f1c8488f7ae08606).damp(this._thumbstickX, gamepad.axes[2], threshold, dampening);\n                    if (this._thumbstickX != 0) {\n                        (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, 0.01 * this._thumbstickX * elapsedTime);\n                        this._core.getModelRotation(this._quat1);\n                        (0, $39ece26d1239bb77$exports).multiply(this._quat1, this._quat0, this._quat1);\n                        this._core.setModelRotation(this._quat1, true);\n                    }\n                    if (gamepad.buttons[2].pressed) {\n                        if (!this._previousControllerButtonPressed[2]) {\n                            this._previousControllerButtonPressed[2] = true;\n                            if (this.controllerButtonPressedCallback) this.controllerButtonPressedCallback(2);\n                        }\n                    } else this._previousControllerButtonPressed[2] = false;\n                }\n            }\n        } else {\n            const camera = this._core.camera;\n            this._manipulationProcessor.update(elapsedTime, this._manipulators);\n            this._pointers.update(elapsedTime);\n            this._mouseWheel.update(elapsedTime);\n            this._keyboard.update(elapsedTime);\n            if (this._mouseWheel.delta != 0) switch(this.mouseWheelAction(this._keyboard)){\n                case (0, $4a6417d29706362f$export$335c7d069643eb6d).zoom:\n                    if (this._pointers.hoverX, this._pointers.hoverY) camera.zoom(this._mouseWheel.delta * this.mouseWheelZoomScale, this._pointers.hoverX, this._pointers.hoverY);\n                    break;\n                case (0, $4a6417d29706362f$export$335c7d069643eb6d).rotateY:\n                    (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._mouseWheel.delta * this.mouseWheelRotationScale);\n                    camera.getOrbit(this._quat1);\n                    (0, $39ece26d1239bb77$exports).multiply(this._quat1, this._quat1, this._quat0);\n                    camera.setOrbit(this._quat1, true);\n                    break;\n            }\n            const count = this._manipulationProcessor.count;\n            if (count == 0) {\n                if (this._isLassoPicking) {\n                    this._isLassoPicking = false;\n                    this._core.renderer.isLassoPicking = false;\n                    const x0 = Math.min(this._lassoX0, this._lassoX1);\n                    const y0 = Math.min(this._lassoY0, this._lassoY1);\n                    const x1 = Math.max(this._lassoX0, this._lassoX1);\n                    const y1 = Math.max(this._lassoY0, this._lassoY1);\n                    if (x1 - x0 > 0 && y1 - y0 > 0) {\n                        const sets = this._core.pickLasso(x0, y0, x1, y1, this.lassoPickType);\n                        const result = {\n                            x0: x0,\n                            y0: y0,\n                            x1: x1,\n                            y1: y1,\n                            pickType: this.lassoPickType,\n                            ids: sets,\n                            manipulator: this._manipulator\n                        };\n                        this.pickLassoCallback(result);\n                    }\n                }\n            } else if (count == 1) {\n                const translationDelta = this._manipulationProcessor.translationDelta;\n                if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n                    const manipulators = this._manipulationProcessor.manipulators;\n                    for(const key in manipulators){\n                        const manipulator = manipulators[key];\n                        switch(this.singleTouchAction(manipulator)){\n                            case (0, $4a6417d29706362f$export$226dc1249c607930).rotate:\n                                camera.rotate(translationDelta);\n                                break;\n                            case (0, $4a6417d29706362f$export$226dc1249c607930).translate:\n                                camera.translate(translationDelta);\n                                break;\n                            case (0, $4a6417d29706362f$export$226dc1249c607930).lasso:\n                                if (this.pickLassoCallback) {\n                                    if (!this._isLassoPicking) {\n                                        this._isLassoPicking = true;\n                                        this._core.renderer.isLassoPicking = true;\n                                        this._lassoX0 = manipulator.position[0];\n                                        this._lassoY0 = manipulator.position[1];\n                                    }\n                                    this._lassoX1 = manipulator.position[0];\n                                    this._lassoY1 = manipulator.position[1];\n                                    this._core.renderer.lassoX0 = Math.min(this._lassoX0, this._lassoX1);\n                                    this._core.renderer.lassoY0 = Math.min(this._lassoY0, this._lassoY1);\n                                    this._core.renderer.lassoX1 = Math.max(this._lassoX0, this._lassoX1);\n                                    this._core.renderer.lassoY1 = Math.max(this._lassoY0, this._lassoY1);\n                                }\n                                break;\n                        }\n                        break;\n                    }\n                }\n            } else {\n                const translationDelta = this._manipulationProcessor.translationDelta;\n                const camera = this._core.camera;\n                if (translationDelta[0] != 0 || translationDelta[1] != 0) camera.translate(translationDelta);\n                if (this._manipulationProcessor.scaleDelta != 0) {\n                    const distance = this._manipulationProcessor.scaleDelta * this.multiTouchZoomScale;\n                    camera.zoom(distance, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n                }\n                if (this._manipulationProcessor.twistDelta != 0) camera.twist(this._manipulationProcessor.twistDelta, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n            }\n            if (this.isPickingEnabled && !this._manipulationProcessor.isDragging && !this._isLassoPicking) {\n                const camera = this._core.camera;\n                const renderer = this._core.renderer;\n                if (renderer.isCapturingPickImage) {\n                    camera.updatePickVMatrix(renderer.width / 2, renderer.height / 2);\n                    renderer.pickVMatrix = camera.pickVMatrix;\n                    renderer.isPickingEnabled = true;\n                    this._pickedTime = 0;\n                } else if (this._pointers.hoverId > -1) {\n                    const pickingX = this._pointers.hoverX;\n                    const pickingY = this._pointers.hoverY;\n                    camera.updatePickVMatrix(pickingX, pickingY);\n                    renderer.pickVMatrix = camera.pickVMatrix;\n                    renderer.isPickingEnabled = true;\n                    if (this._pickedId != renderer.pickedId) {\n                        this._pickedId = renderer.pickedId;\n                        this._pickedTime = 0;\n                    } else if (this._manipulationProcessor.count == 1) {\n                        this._pickedTime += elapsedTime;\n                        for(const key in this._manipulators){\n                            this._manipulator = this._manipulators[key];\n                            break;\n                        }\n                    }\n                    if (this._pickedTime > 0) switch(renderer.pickedType){\n                        case (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).data:\n                            if (this._pickedTime > this.pickHoldDelay) {\n                                renderer.getVertexPosition(this._vec3, this._pickedId);\n                                this._core.setModelManipulationOrigin(this._vec3);\n                                this._pickedTime = 0;\n                            } else if (this._manipulationProcessor.count == 0) {\n                                if (this._pickedTime > this.pickSelectDelay) for(let i = 0; i < renderer.transitionBuffers.length; i++){\n                                    const transitionBuffer = renderer.transitionBuffers[i];\n                                    const id = transitionBuffer.pickIdLookup[this._pickedId];\n                                    if (id > -1) {\n                                        const result = {\n                                            transitionBuffer: i,\n                                            id: id,\n                                            manipulator: this._manipulator\n                                        };\n                                        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `picked id ${result.id}, transition buffer ${i}`);\n                                        if (this.pickItemCallback) this.pickItemCallback(result);\n                                        break;\n                                    }\n                                }\n                                this._pickedTime = 0;\n                            }\n                            break;\n                        case (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).label:\n                            if (this._manipulationProcessor.count == 0) {\n                                if (this._pickedTime > this.pickSelectDelay) for(let i = 0; i < renderer.labelSets.length; i++){\n                                    const labelSet = renderer.labelSets[i].label;\n                                    const id = labelSet.pickIdLookup[this._pickedId];\n                                    if (id > -1) {\n                                        const result = {\n                                            label: id,\n                                            set: i,\n                                            manipulator: this._manipulator\n                                        };\n                                        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `picked label ${result.label}, set ${result.set}`);\n                                        if (this.pickLabelSetCallback) this.pickLabelSetCallback(result);\n                                        break;\n                                    }\n                                }\n                                this._pickedTime = 0;\n                            }\n                            break;\n                        case (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesDivision:\n                            if (this._manipulationProcessor.count == 0) {\n                                if (this._pickedTime > this.pickSelectDelay) for(let i = 0; i < renderer.currentAxes.length; i++){\n                                    const axes = renderer.currentAxes[i].axes;\n                                    const id = axes.pickGridLookup[this._pickedId];\n                                    if (id > -1) {\n                                        const result = axes.pickGrid(id);\n                                        result.axes = i;\n                                        result.manipulator = this._manipulator;\n                                        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `picked division (${result.divisionX}, ${result.divisionY}, ${result.divisionZ}), axes ${result.axes}`);\n                                        if (this.pickAxesGridCallback) this.pickAxesGridCallback(result);\n                                        break;\n                                    }\n                                }\n                                this._pickedTime = 0;\n                            }\n                            break;\n                        case (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesTitle:\n                            if (this._manipulationProcessor.count == 0) {\n                                if (this._pickedTime > this.pickSelectDelay) for(let i = 0; i < renderer.currentAxes.length; i++){\n                                    const axes = renderer.currentAxes[i].axes;\n                                    const id = axes.pickTitleLookup[this._pickedId];\n                                    if (id > -1) {\n                                        const result = axes.pickTitle(id);\n                                        result.axes = i;\n                                        result.manipulator = this._manipulator;\n                                        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `picked title ${result.axis}, axes ${result.axes}`);\n                                        if (this.pickAxesTitleCallback) this.pickAxesTitleCallback(result);\n                                        break;\n                                    }\n                                }\n                                this._pickedTime = 0;\n                            }\n                            break;\n                        case (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesLabel:\n                            if (this._manipulationProcessor.count == 0) {\n                                if (this._pickedTime > this.pickSelectDelay) for(let i = 0; i < renderer.currentAxes.length; i++){\n                                    const axes = renderer.currentAxes[i].axes;\n                                    const id = axes.pickLabelLookup[this._pickedId];\n                                    if (id > -1) {\n                                        const result = axes.pickLabel(id);\n                                        result.axes = i;\n                                        result.manipulator = this._manipulator;\n                                        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `picked label ${result.label}, axis ${result.axis}, axes ${result.axes}`);\n                                        if (this.pickAxesLabelCallback) this.pickAxesLabelCallback(result);\n                                        break;\n                                    }\n                                }\n                                this._pickedTime = 0;\n                            }\n                            break;\n                        case (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).axesHeading:\n                            if (this._manipulationProcessor.count == 0) {\n                                if (this._pickedTime > this.pickSelectDelay) for(let i = 0; i < renderer.currentAxes.length; i++){\n                                    const axes = renderer.currentAxes[i].axes;\n                                    const id = axes.pickHeadingLookup[this._pickedId];\n                                    if (id > -1) {\n                                        const result = axes.pickHeading(id);\n                                        result.axes = i;\n                                        result.manipulator = this._manipulator;\n                                        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `picked heading ${result.axis}, axes ${result.axes}`);\n                                        if (this.pickAxesHeadingCallback) this.pickAxesHeadingCallback(result);\n                                        break;\n                                    }\n                                }\n                                this._pickedTime = 0;\n                            }\n                            break;\n                    }\n                } else {\n                    renderer.isPickingEnabled = false;\n                    this._pickedTime = 0;\n                }\n            } else {\n                this._core.renderer.isPickingEnabled = false;\n                this._pickedTime = 0;\n            }\n        }\n        if (this._core.config.isDebugVisible) {\n            this._core.debugText.addLine(`man tot  ${this._manipulationProcessor.count}`);\n            this._core.debugText.addLine(`pck key  ${this._core.renderer.pickedId}`);\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $470791aaa8c4f15b$export$ce30dbb46644d06c {\n    constructor(core){\n        this._core = core;\n    }\n    write(level, value) {\n        if (level >= this._core.config.logLevel) switch(level){\n            case (0, $4a6417d29706362f$export$243e62d78d3b544d).trace:\n                console.trace(value);\n                break;\n            case (0, $4a6417d29706362f$export$243e62d78d3b544d).debug:\n                console.debug(value);\n                break;\n            case (0, $4a6417d29706362f$export$243e62d78d3b544d).info:\n                console.info(value);\n                break;\n            case (0, $4a6417d29706362f$export$243e62d78d3b544d).warn:\n                console.warn(value);\n                break;\n            case (0, $4a6417d29706362f$export$243e62d78d3b544d).error:\n                console.error(value);\n                break;\n        }\n    }\n}\n\n\n\nvar $4a6417d29706362f$var$__awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nclass $4a6417d29706362f$export$9ebbd251760e4895 {\n    constructor(core){\n        this.position = (0, $31054a6c69637582$exports).create();\n        this.manipulationOrigin = (0, $31054a6c69637582$exports).create();\n        this.rotation = (0, $39ece26d1239bb77$exports).create();\n        (0, $31054a6c69637582$exports).set(this.position, 0, 0, -core.config.modelDistance);\n        this.scale = core.config.modelSize;\n    }\n}\nclass $4a6417d29706362f$export$4143ab5b91744744 {\n    get container() {\n        return this._container;\n    }\n    get started() {\n        return this._started;\n    }\n    get debugText() {\n        return this._debugText;\n    }\n    get log() {\n        return this._log;\n    }\n    get totalFrames() {\n        return this._fps.totalFrames;\n    }\n    get camera() {\n        return this._camera;\n    }\n    set camera(value) {\n        this._camera = value;\n    }\n    getModelRotation(value) {\n        (0, $39ece26d1239bb77$exports).copy(value, this._modelRotation);\n    }\n    setModelRotation(value, isSmooth) {\n        (0, $39ece26d1239bb77$exports).copy(this._modelRotation, value);\n        if (!isSmooth) (0, $39ece26d1239bb77$exports).copy(this._smoothedModelRotation, this._modelRotation);\n    }\n    getModelScale() {\n        return this._modelScale[0];\n    }\n    setModelScale(value, isSmooth) {\n        (0, $31054a6c69637582$exports).set(this._modelScale, value, value, value);\n        if (!isSmooth) (0, $31054a6c69637582$exports).copy(this._smoothedModelScale, this._modelScale);\n    }\n    getModelManipulationOrigin(value) {\n        (0, $31054a6c69637582$exports).copy(value, this._modelManipulationOrigin);\n    }\n    setModelManipulationOrigin(value) {\n        this._updateManipulationOrigin(value);\n    }\n    getModelPosition(value) {\n        (0, $31054a6c69637582$exports).copy(value, this._modelPosition);\n    }\n    setModelPosition(value, isSmooth) {\n        (0, $31054a6c69637582$exports).copy(this._modelPosition, value);\n        if (!isSmooth) (0, $31054a6c69637582$exports).copy(this._smoothedModelPosition, this._modelPosition);\n    }\n    get webXRSession() {\n        return this._webXRSession;\n    }\n    get renderer() {\n        return this._renderer;\n    }\n    set renderer(renderer) {\n        if (this._renderer == renderer) return;\n        if (this._renderer) {\n            this.stop();\n            this._renderer.remove();\n        }\n        if (!renderer.isInitialized) renderer.initialize(this);\n        if (this._renderer) {\n            renderer.transitionTime = this._renderer.transitionTime;\n            for(let i = 0; i < this._renderer.transitionBuffers.length; i++){\n                const previousTransitionBuffer = this._renderer.transitionBuffers[i];\n                const transitionBuffer = renderer.createTransitionBuffer(previousTransitionBuffer.currentBuffer.ids);\n                transitionBuffer.copyFrom(previousTransitionBuffer);\n                renderer.transitionBuffers.push(transitionBuffer);\n            }\n            const currentAxes = this._renderer.currentAxes;\n            if (currentAxes) {\n                renderer.currentAxes = [];\n                for(let i = 0; i < currentAxes.length; i++){\n                    const axesVisual = currentAxes[i];\n                    const axes = axesVisual.axes;\n                    if (axes instanceof (0, $4cd1e156df302e7a$export$b1b08d445768978)) {\n                        const cartesian3dAxesVisual = renderer.createCartesian3dAxesVisual(axes);\n                        renderer.currentAxes.push(cartesian3dAxesVisual);\n                    } else if (axes instanceof (0, $28691cf6913948f8$export$e3e79a454e5f8e5a)) renderer.currentAxes.push(renderer.createCartesian2dAxesVisual(axes));\n                }\n            }\n            const labelSets = this._renderer.labelSets;\n            if (labelSets) {\n                renderer.labelSets = [];\n                for(let i = 0; i < labelSets.length; i++)renderer.labelSets.push(renderer.createLabelSetVisual(labelSets[i].label));\n            }\n            const images = this._renderer.images;\n            if (images) {\n                renderer.images = [];\n                for(let i = 0; i < images.length; i++)renderer.images.push(renderer.createImageVisual(images[i].image));\n            }\n            const fonts = this._renderer.fonts;\n            if (fonts) for(const key in fonts){\n                const font = fonts[key].font;\n                renderer.fonts[font.name] = renderer.createFontVisual(font);\n            }\n        } else renderer.fonts[this._font.name] = renderer.createFontVisual(this._font);\n        if (this._renderer) this._renderer.finalize();\n        this._renderer = renderer;\n        this._fps.reset();\n        this.start();\n    }\n    get font() {\n        return this._font;\n    }\n    get paletteResources() {\n        return this._paletteResources;\n    }\n    get config() {\n        return this._config;\n    }\n    get inputManager() {\n        return this._inputManager;\n    }\n    constructor(options){\n        (0, $14f38b7dd89457d7$exports).setMatrixArrayType(Array);\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._quat = (0, $39ece26d1239bb77$exports).create();\n        this._mat4 = (0, $1ac1b59392edf35b$exports).create();\n        this._container = options && options.container ? options.container : document.body;\n        this._config = new (0, $3c8e74dd6c09e751$export$29cd7b75162a9425)(this);\n        this._log = new (0, $470791aaa8c4f15b$export$ce30dbb46644d06c)(this);\n        this._debugText = new (0, $eea2540484261ac0$export$3d1f12550a40f54d)();\n        this._inputManager = options && options.useInputManager === false ? null : new (0, $942e14c8121accda$export$d0d38e7dec7a1a61)(this);\n        const fontRasterizerOptions = options && options.fontRasterizerOptions ? options.fontRasterizerOptions : {\n            fontAtlas: new (0, $f690fa88528736e9$export$834e93b4abb19d0a)(256, 512),\n            fontSize: 24,\n            border: 3,\n            fontFamily: \"\\\"segoe ui semibold\\\", sans-serif\",\n            fontWeight: \"normal\",\n            fontStyle: \"normal\",\n            baseline: \"alphabetic\",\n            maxDistance: 8,\n            edgeValue: 0xc0\n        };\n        const fontRasterizer = new (0, $f690fa88528736e9$export$9cdd7c9f8d056e99)(this, fontRasterizerOptions);\n        this._font = fontRasterizer.font;\n        this._paletteResources = new (0, $548ced3eab978a8c$export$35624e624bb61356)();\n        this._previousTime = 0;\n        this._fps = new (0, $f25ed8c17e63c6a4$export$6e55b0a28cfdaa88)(this);\n        this._modelMMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._modelPosition = (0, $31054a6c69637582$exports).create();\n        this._modelRotation = (0, $39ece26d1239bb77$exports).create();\n        this._modelScale = (0, $31054a6c69637582$exports).create();\n        this._smoothedModelPosition = (0, $31054a6c69637582$exports).create();\n        this._smoothedModelRotation = (0, $39ece26d1239bb77$exports).create();\n        this._smoothedModelScale = (0, $31054a6c69637582$exports).create();\n        this._modelManipulationOrigin = (0, $31054a6c69637582$exports).create();\n        this._camera = new (0, $242ad176fe12a941$export$cf22ae31f9260ad2)(this);\n        this.resetModel(false);\n    }\n    getView(view) {\n        this.getModelPosition(view.position);\n        this.getModelRotation(view.rotation);\n        view.scale = this.getModelScale();\n    }\n    setView(view, isSmooth) {\n        this.setModelPosition(view.position, isSmooth);\n        this.setModelRotation(view.rotation, isSmooth);\n        this.setModelScale(view.scale, isSmooth);\n    }\n    lerpView(from, to, time) {\n        (0, $31054a6c69637582$exports).lerp(this._vec3, from.position, to.position, time);\n        this.setModelPosition(this._vec3, false);\n        (0, $39ece26d1239bb77$exports).slerp(this._quat, from.rotation, to.rotation, time);\n        this.setModelRotation(this._quat, false);\n        this.setModelScale((0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from.scale, to.scale, time), false);\n    }\n    resetModel(isSmooth) {\n        (0, $31054a6c69637582$exports).set(this._modelPosition, 0, 0, -this._config.modelDistance);\n        (0, $31054a6c69637582$exports).set(this._modelScale, this._config.modelSize, this._config.modelSize, this._config.modelSize);\n        (0, $39ece26d1239bb77$exports).set(this._modelRotation, 0, 0, 0, 1);\n        if (!isSmooth) this._syncSmooth();\n    }\n    resetManipulationOrigin() {\n        if (!(0, $31054a6c69637582$exports).exactEquals(this._modelManipulationOrigin, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_ZERO)) this._updateManipulationOrigin((0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_ZERO);\n    }\n    reset(isSmooth) {\n        this.resetModel(isSmooth);\n        this.resetManipulationOrigin();\n        this._camera.reset(isSmooth);\n    }\n    start() {\n        if (!this._started && this._renderer) {\n            this._windowAnimationFrame = window.requestAnimationFrame((currentTime)=>this._tick(currentTime));\n            this._started = true;\n            this._log.write($4a6417d29706362f$export$243e62d78d3b544d.info, \"render loop started\");\n            if (this.startCallback) this.startCallback();\n        }\n    }\n    stop() {\n        if (this._started) {\n            this._started = false;\n            if (this._windowAnimationFrame != null) {\n                window.cancelAnimationFrame(this._windowAnimationFrame);\n                this._windowAnimationFrame = null;\n                this._log.write($4a6417d29706362f$export$243e62d78d3b544d.info, \"render loop stopped\");\n            }\n            if (this.stopCallback) this.stopCallback();\n        }\n    }\n    checkWebXRSupport() {\n        const xrSystem = navigator.xr;\n        if (xrSystem) xrSystem.isSessionSupported(\"immersive-vr\").then((supported)=>{\n            if (supported) {\n                this._log.write($4a6417d29706362f$export$243e62d78d3b544d.info, \"WebXR supported\");\n                if (this.webXRSupportedCallback) this.webXRSupportedCallback();\n            }\n        });\n    }\n    requestWebXRSession() {\n        if (this._webXRSession) this._webXRSession.end();\n        else navigator.xr.requestSession(\"immersive-vr\").then((session)=>this._webXRSessionStarted(session));\n    }\n    _webXRSessionStarted(session) {\n        if (this.webXRSessionStartedCallback) this.webXRSessionStartedCallback();\n        this._webXRSession = session;\n        session.onend = ()=>this._webXRSessionEnded();\n        this._renderer.initializeWebXR(session).then(()=>{\n            if (this._windowAnimationFrame) {\n                window.cancelAnimationFrame(this._windowAnimationFrame);\n                this._windowAnimationFrame = null;\n            }\n            session.requestAnimationFrame((currentTime, xrframe)=>this._tick(currentTime, xrframe));\n        });\n        session.oninputsourceschange = (event)=>this._webXRInputSourcesChanged(event);\n    }\n    _webXRSessionEnded() {\n        if (this.webXRSessionEndedCallback) this.webXRSessionEndedCallback();\n        this._webXRSession = null;\n        this._renderer.controllers.length = 0;\n        this.start();\n    }\n    _webXRInputSourcesChanged(event) {\n        if (event.added.length > 0) {\n            const added = event.added[0];\n            if (added.targetRayMode == \"tracked-pointer\") {\n                const profiles = added.profiles;\n                const handedness = added.handedness;\n                if (this.webXRInputSourceRequestCallback) this.webXRInputSourceRequestCallback(profiles, handedness, (response)=>{\n                    const options = {\n                        profiles: profiles,\n                        handedness: handedness,\n                        obj: response.obj,\n                        texture: response.texture\n                    };\n                    const controller = new (0, $6c3dd367ac3ca617$export$bd0bf19f25da8474)(this, options);\n                    this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n                }, (e)=>{\n                    this._log.write($4a6417d29706362f$export$243e62d78d3b544d.error, e);\n                });\n                else {\n                    const options = {};\n                    const controller = new (0, $6c3dd367ac3ca617$export$bd0bf19f25da8474)(this, options);\n                    this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n                }\n            }\n        }\n        if (event.removed.length > 0) this.renderer.controllers.length = 0;\n    }\n    _tick(currentTime, xrFrame) {\n        return $4a6417d29706362f$var$__awaiter(this, void 0, void 0, function*() {\n            let elapsedTime = currentTime - this._previousTime;\n            this._previousTime = currentTime;\n            if (elapsedTime > 0) {\n                this.update(elapsedTime, xrFrame);\n                yield this.render(elapsedTime, xrFrame);\n            }\n            if (xrFrame) xrFrame.session.requestAnimationFrame((currentTime, xrframe)=>this._tick(currentTime, xrframe));\n            else if (this._started) this._windowAnimationFrame = window.requestAnimationFrame((currentTime)=>this._tick(currentTime));\n        });\n    }\n    update(elapsedTime, xrFrame) {\n        this._renderer.setSize(elapsedTime);\n        if (this.updateCallback) this.updateCallback(elapsedTime, xrFrame);\n        if (this._config.isDebugVisible) this._debugText.clear();\n        this._fps.update(elapsedTime);\n        if (this._inputManager) {\n            this._inputManager.isPickingEnabled = this._config.isTransitionPickingEnabled || this._renderer.transitionTime == 1;\n            this._inputManager.update(elapsedTime, xrFrame);\n        }\n        let amount = Math.min(elapsedTime * this._config.positionSmoothing, 1);\n        (0, $31054a6c69637582$exports).lerp(this._smoothedModelPosition, this._smoothedModelPosition, this._modelPosition, amount);\n        amount = Math.min(elapsedTime * this._config.rotationSmoothing, 1);\n        (0, $39ece26d1239bb77$exports).slerp(this._smoothedModelRotation, this._smoothedModelRotation, this._modelRotation, amount);\n        amount = Math.min(elapsedTime * this._config.scaleSmoothing, 1);\n        (0, $31054a6c69637582$exports).lerp(this._smoothedModelScale, this._smoothedModelScale, this._modelScale, amount);\n        (0, $1ac1b59392edf35b$exports).fromRotationTranslationScaleOrigin(this._modelMMatrix, this._smoothedModelRotation, this._smoothedModelPosition, this._smoothedModelScale, this._modelManipulationOrigin);\n        this._renderer.mMatrix = this._modelMMatrix;\n        if (this._config.isDebugVisible) {\n            this._debugText.addLine(`mod pos ${this._smoothedModelPosition[0] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[0].toFixed(3)},${this._smoothedModelPosition[1] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[1].toFixed(3)},${this._smoothedModelPosition[2] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[2].toFixed(3)}`);\n            this._debugText.addLine(`mod rot ${this._smoothedModelRotation[0] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[0].toFixed(3)},${this._smoothedModelRotation[1] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[1].toFixed(3)},${this._smoothedModelRotation[2] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[2].toFixed(3)},${this._smoothedModelRotation[3] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[3].toFixed(3)}`);\n            this._debugText.addLine(`mod siz  ${this._smoothedModelScale[0].toFixed(3)}`);\n            this._debugText.addLine(`man ori ${this._modelManipulationOrigin[0] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[0].toFixed(3)},${this._modelManipulationOrigin[1] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[1].toFixed(3)},${this._modelManipulationOrigin[2] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[2].toFixed(3)}`);\n            this._debugText.addLine(`scr dst  ${this._config.screenDistance.toFixed(3)}`);\n            this._debugText.addLine(`cam fov  ${Math.round((0, $a49c65c28e06311e$export$210d3b2db589eb5c).radiansToDegrees(this._config.fov))}`);\n            this._debugText.addLine(`tbf tot  ${this._renderer.transitionBuffers.length}`);\n        }\n        if (!xrFrame) {\n            this._camera.width = this._renderer.width;\n            this._camera.height = this._renderer.height;\n            this._camera.modelMMatrix = this._modelMMatrix;\n            this._camera.modelPosition = this._smoothedModelPosition;\n            this._camera.modelRotation = this._smoothedModelRotation;\n            this._camera.modelScale = this._smoothedModelScale;\n            this._camera.modelManipulationOrigin = this._modelManipulationOrigin;\n            this._camera.update(elapsedTime);\n            this._renderer.vMatrices = this._camera.vMatrices;\n            this._renderer.mvMatrices = this._camera.mvMatrices;\n            this._renderer.pMatrices = this._camera.pMatrices;\n            this._renderer.inverseVMatrices = this._camera.inverseVMatrices;\n            this._renderer.inversePMatrices = this._camera.inversePMatrices;\n        }\n        this._renderer.prepare(xrFrame);\n        if (!xrFrame && this._config.stereoMode == $4a6417d29706362f$export$ec20dfa68810b176.none) this._renderer.pickPMatrix = this._camera.pMatrices[0];\n        else {\n            const fov = (0, $b920b5b69884770f$export$34bcf93e378e8ddd).fieldOfViewFromProjectionMatrix(this._renderer.pMatrices[0]);\n            (0, $1ac1b59392edf35b$exports).perspective(this._mat4, fov, this._renderer.width / this._renderer.height, this._config.nearPlane, this._config.farPlane);\n            this._renderer.pickPMatrix = this._mat4;\n        }\n        if (this._renderer.isInitialized) this._renderer.update(elapsedTime);\n    }\n    render(elapsedTime, xrFrame) {\n        return $4a6417d29706362f$var$__awaiter(this, void 0, void 0, function*() {\n            this._fps.render();\n            if (this._renderer.isInitialized) {\n                yield this._renderer.render(elapsedTime, xrFrame);\n                if (this.afterRenderCallback) this.afterRenderCallback();\n            }\n        });\n    }\n    _syncSmooth() {\n        (0, $31054a6c69637582$exports).copy(this._smoothedModelPosition, this._modelPosition);\n        (0, $31054a6c69637582$exports).copy(this._smoothedModelScale, this._modelScale);\n        (0, $39ece26d1239bb77$exports).copy(this._smoothedModelRotation, this._modelRotation);\n    }\n    _updateManipulationOrigin(position) {\n        this._log.write($4a6417d29706362f$export$243e62d78d3b544d.info, `manipulation origin ${position[0].toFixed(3)},${position[1].toFixed(3)},${position[2].toFixed(3)}`);\n        this._camera.updateModelManipulationOrigin(this._modelManipulationOrigin, position);\n        (0, $31054a6c69637582$exports).copy(this._modelManipulationOrigin, position);\n        (0, $31054a6c69637582$exports).transformMat4(this._vec3, this._modelManipulationOrigin, this._modelMMatrix);\n        (0, $31054a6c69637582$exports).subtract(this._modelPosition, this._vec3, this._modelManipulationOrigin);\n        (0, $31054a6c69637582$exports).copy(this._smoothedModelPosition, this._modelPosition);\n        if (this.manipulationOriginChangedCallback) {\n            const result = {\n                x: position[0],\n                y: position[1],\n                z: position[2]\n            };\n            this.manipulationOriginChangedCallback(result);\n        }\n    }\n    pickLasso(x0, y0, x1, y1, pickType) {\n        const inverseMMatrix = (0, $1ac1b59392edf35b$exports).create();\n        (0, $1ac1b59392edf35b$exports).invert(inverseMMatrix, this._modelMMatrix);\n        const sets = [];\n        const nearPositions = [\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create()\n        ];\n        const farPositions = [\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create()\n        ];\n        const directions = [\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create()\n        ];\n        this._camera.unproject(nearPositions[0], x0, y1, -1);\n        this._camera.unproject(farPositions[0], x0, y1, 1);\n        this._camera.unproject(nearPositions[1], x1, y1, -1);\n        this._camera.unproject(farPositions[1], x1, y1, 1);\n        this._camera.unproject(nearPositions[2], x1, y0, -1);\n        this._camera.unproject(farPositions[2], x1, y0, 1);\n        this._camera.unproject(nearPositions[3], x0, y0, -1);\n        this._camera.unproject(farPositions[3], x0, y0, 1);\n        for(let i = 0; i < 4; i++){\n            (0, $31054a6c69637582$exports).transformMat4(nearPositions[i], nearPositions[i], inverseMMatrix);\n            (0, $31054a6c69637582$exports).transformMat4(farPositions[i], farPositions[i], inverseMMatrix);\n            (0, $31054a6c69637582$exports).subtract(directions[i], farPositions[i], nearPositions[i]);\n            (0, $31054a6c69637582$exports).normalize(directions[i], directions[i]);\n        }\n        const normals = [\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create(),\n            (0, $31054a6c69637582$exports).create()\n        ];\n        const d = [];\n        for(let i = 0; i < 4; i++){\n            (0, $31054a6c69637582$exports).cross(normals[i], directions[(i + 1) % 4], directions[i]);\n            (0, $31054a6c69637582$exports).normalize(normals[i], normals[i]);\n            d.push(-(0, $31054a6c69637582$exports).dot(normals[i], nearPositions[i]));\n        }\n        if (pickType == $4a6417d29706362f$export$6fc3f4da94ff0be0.data) {\n            const translation = (0, $31054a6c69637582$exports).create();\n            for(let i = 0; i < this._renderer.transitionBuffers.length; i++){\n                const transitionBuffer = this._renderer.transitionBuffers[i];\n                const set = new Set();\n                if (transitionBuffer.isVisible) {\n                    const start = window.performance.now();\n                    const currentBuffer = transitionBuffer.currentBuffer;\n                    const lookup = currentBuffer.lookup;\n                    for(let j = 0; j < currentBuffer.length; j++){\n                        const id = currentBuffer.ids[j];\n                        const index = lookup[id];\n                        if (index != null) {\n                            (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTranslation(currentBuffer.dataView, index, translation);\n                            let isInside = true;\n                            for(let k = 0; k < 4; k++){\n                                let distance = (0, $31054a6c69637582$exports).dot(normals[k], translation);\n                                distance += d[k];\n                                if (distance < 0) {\n                                    isInside = false;\n                                    break;\n                                }\n                            }\n                            if (isInside) set.add(id);\n                        }\n                    }\n                    if (set.size > 0) this._log.write($4a6417d29706362f$export$243e62d78d3b544d.info, `lasso transition buffer ${i} picked ${set.size} ${Math.round(window.performance.now() - start)}ms`);\n                }\n                sets.push(set);\n            }\n        }\n        return sets;\n    }\n}\nconst $4a6417d29706362f$export$b9eeb0cadc4c12e4 = {\n    orbit: \"orbit\",\n    altAzimuth: \"altAzimuth\"\n};\nconst $4a6417d29706362f$export$ec20dfa68810b176 = {\n    none: \"none\",\n    split: \"split\",\n    anaglyph: \"anaglyph\",\n    left: \"left\",\n    right: \"right\"\n};\nconst $4a6417d29706362f$export$91484609d16ec765 = {\n    new: \"new\",\n    add: \"add\",\n    subtract: \"subtract\",\n    intersect: \"intersect\"\n};\nconst $4a6417d29706362f$export$ec1e12eead838acf = {\n    isolate: \"isolate\",\n    exclude: \"exclude\"\n};\nconst $4a6417d29706362f$export$d94dcb5bec64086e = {\n    left: \"left\",\n    center: \"center\",\n    right: \"right\"\n};\nconst $4a6417d29706362f$export$c12e835f91722ef8 = {\n    top: \"top\",\n    center: \"center\",\n    bottom: \"bottom\"\n};\nconst $4a6417d29706362f$export$84b2d1b68830363f = {\n    left: \"left\",\n    center: \"center\",\n    right: \"right\"\n};\nconst $4a6417d29706362f$export$df54d73aa0ec5e82 = {\n    horizontal: \"horizontal\",\n    vertical: \"vertical\"\n};\nconst $4a6417d29706362f$export$d2304d1f23cf3ace = {\n    parallel: \"parallel\",\n    perpendicular: \"perpendicular\"\n};\nconst $4a6417d29706362f$export$7dbc7c2b82487e42 = {\n    none: \"none\",\n    current: \"current\",\n    previous: \"previous\"\n};\nconst $4a6417d29706362f$export$6fc3f4da94ff0be0 = {\n    none: 0,\n    data: 1,\n    label: 2,\n    axesDivision: 3,\n    axesTitle: 4,\n    axesLabel: 5,\n    axesHeading: 6\n};\nconst $4a6417d29706362f$export$14faa19a0f3bbeb2 = {\n    dark: \"dark\",\n    light: \"light\"\n};\nconst $4a6417d29706362f$export$6b731eb2fd512fe0 = {\n    luminance: \"luminance\",\n    color: \"color\"\n};\nconst $4a6417d29706362f$export$80d48287646c9e3b = {\n    block: \"block\",\n    blockSdf: \"blockSdf\",\n    boxFrameSdf: \"boxFrameSdf\",\n    sphere: \"sphere\",\n    sphereSdf: \"sphereSdf\",\n    cylinder: \"cylinder\",\n    cylinderSdf: \"cylinderSdf\",\n    hexPrism: \"hexPrism\",\n    hexPrismSdf: \"hexPrismSdf\",\n    sdf: \"sdf\",\n    disk: \"disk\",\n    ringSdf: \"ringSdf\",\n    tubeSdf: \"tubeSdf\"\n};\nconst $4a6417d29706362f$export$226dc1249c607930 = {\n    none: \"none\",\n    translate: \"translate\",\n    rotate: \"rotate\",\n    lasso: \"lasso\"\n};\nconst $4a6417d29706362f$export$335c7d069643eb6d = {\n    none: \"none\",\n    zoom: \"zoom\",\n    rotateY: \"rotateY\"\n};\nconst $4a6417d29706362f$export$243e62d78d3b544d = {\n    trace: 0,\n    debug: 1,\n    info: 2,\n    warn: 3,\n    error: 4\n};\nconst $4a6417d29706362f$export$1c6bed1dcbac1312 = {\n    top: 0,\n    right: 1,\n    bottom: 2,\n    left: 3\n};\nconst $4a6417d29706362f$export$e5036cab5f304801 = {\n    front: 0,\n    back: 1\n};\nconst $4a6417d29706362f$export$99dacba06f5726bd = {\n    topFront: 0,\n    topRight: 1,\n    topBack: 2,\n    topLeft: 3,\n    bottomFront: 4,\n    bottomRight: 5,\n    bottomBack: 6,\n    bottomLeft: 7,\n    frontRight: 8,\n    backRight: 9,\n    backLeft: 10,\n    frontLeft: 11\n};\nconst $4a6417d29706362f$export$3f28760630ff8d3c = {\n    top: 0,\n    right: 1,\n    bottom: 2,\n    left: 3,\n    front: 4,\n    back: 5\n};\nconst $4a6417d29706362f$export$9ac0daa892cfa13e = {\n    pointyTop: \"pointyTop\",\n    flatTop: \"flatTop\"\n};\nconst $4a6417d29706362f$export$2386c8c1d9db2d57 = {\n    color: \"color\",\n    hdr: \"hdr\",\n    depth: \"depth\",\n    normal: \"normal\",\n    segment: \"segment\",\n    edge: \"edge\"\n};\n\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $42b018e85c350e4a$export$6e15e29aac2b1db8 {\n}\n$42b018e85c350e4a$export$6e15e29aac2b1db8.colors = {\n    \"mediumvioletred\": [\n        0xc7,\n        0x15,\n        0x85\n    ],\n    \"deeppink\": [\n        0xff,\n        0x14,\n        0x93\n    ],\n    \"palevioletred\": [\n        0xdb,\n        0x70,\n        0x93\n    ],\n    \"hotpink\": [\n        0xff,\n        0x69,\n        0xb4\n    ],\n    \"lightpink\": [\n        0xff,\n        0xb6,\n        0xc1\n    ],\n    \"pink\": [\n        0xff,\n        0xc0,\n        0xcb\n    ],\n    \"darkred\": [\n        0x8b,\n        0x00,\n        0x00\n    ],\n    \"red\": [\n        0xff,\n        0x00,\n        0x00\n    ],\n    \"firebrick\": [\n        0xb2,\n        0x22,\n        0x22\n    ],\n    \"crimson\": [\n        0xdc,\n        0x14,\n        0x3c\n    ],\n    \"indianred\": [\n        0xcd,\n        0x5c,\n        0x5c\n    ],\n    \"lightcoral\": [\n        0xf0,\n        0x80,\n        0x80\n    ],\n    \"salmon\": [\n        0xfa,\n        0x80,\n        0x72\n    ],\n    \"darksalmon\": [\n        0xe9,\n        0x96,\n        0x7a\n    ],\n    \"lightsalmon\": [\n        0xff,\n        0xa0,\n        0x7a\n    ],\n    \"orangered\": [\n        0xff,\n        0x45,\n        0x00\n    ],\n    \"tomato\": [\n        0xff,\n        0x63,\n        0x47\n    ],\n    \"darkorange\": [\n        0xff,\n        0x8c,\n        0x00\n    ],\n    \"coral\": [\n        0xff,\n        0x7f,\n        0x50\n    ],\n    \"orange\": [\n        0xff,\n        0xa5,\n        0x00\n    ],\n    \"darkkhaki\": [\n        0xbd,\n        0xb7,\n        0x6b\n    ],\n    \"gold\": [\n        0xff,\n        0xd7,\n        0x00\n    ],\n    \"khaki\": [\n        0xf0,\n        0xe6,\n        0x8c\n    ],\n    \"peachpuff\": [\n        0xff,\n        0xda,\n        0xb9\n    ],\n    \"yellow\": [\n        0xff,\n        0xff,\n        0x00\n    ],\n    \"palegoldenrod\": [\n        0xee,\n        0xe8,\n        0xaa\n    ],\n    \"moccasin\": [\n        0xff,\n        0xe4,\n        0xb5\n    ],\n    \"papayawhip\": [\n        0xff,\n        0xef,\n        0xd5\n    ],\n    \"lightgoldenrodyellow\": [\n        0xfa,\n        0xfa,\n        0xd2\n    ],\n    \"lemonchiffon\": [\n        0xff,\n        0xfa,\n        0xcd\n    ],\n    \"lightyellow\": [\n        0xff,\n        0xff,\n        0xe0\n    ],\n    \"maroon\": [\n        0x80,\n        0x00,\n        0x00\n    ],\n    \"brown\": [\n        0xa5,\n        0x2a,\n        0x2a\n    ],\n    \"saddlebrown\": [\n        0x8b,\n        0x45,\n        0x13\n    ],\n    \"sienna\": [\n        0xa0,\n        0x52,\n        0x2d\n    ],\n    \"chocolate\": [\n        0xd2,\n        0x69,\n        0x1e\n    ],\n    \"darkgoldenrod\": [\n        0xb8,\n        0x86,\n        0x0b\n    ],\n    \"peru\": [\n        0xcd,\n        0x85,\n        0x3f\n    ],\n    \"rosybrown\": [\n        0xbc,\n        0x8f,\n        0x8f\n    ],\n    \"goldenrod\": [\n        0xda,\n        0xa5,\n        0x20\n    ],\n    \"sandybrown\": [\n        0xf4,\n        0xa4,\n        0x60\n    ],\n    \"tan\": [\n        0xd2,\n        0xb4,\n        0x8c\n    ],\n    \"burlywood\": [\n        0xde,\n        0xb8,\n        0x87\n    ],\n    \"wheat\": [\n        0xf5,\n        0xde,\n        0xb3\n    ],\n    \"navajowhite\": [\n        0xff,\n        0xde,\n        0xad\n    ],\n    \"bisque\": [\n        0xff,\n        0xe4,\n        0xc4\n    ],\n    \"blanchedalmond\": [\n        0xff,\n        0xeb,\n        0xcd\n    ],\n    \"cornsilk\": [\n        0xff,\n        0xf8,\n        0xdc\n    ],\n    \"darkgreen\": [\n        0x00,\n        0x64,\n        0x00\n    ],\n    \"green\": [\n        0x00,\n        0x80,\n        0x00\n    ],\n    \"darkolivegreen\": [\n        0x55,\n        0x6b,\n        0x2f\n    ],\n    \"forestgreen\": [\n        0x22,\n        0x8b,\n        0x22\n    ],\n    \"seagreen\": [\n        0x2e,\n        0x8b,\n        0x57\n    ],\n    \"olive\": [\n        0x80,\n        0x80,\n        0x00\n    ],\n    \"olivedrab\": [\n        0x6b,\n        0x8e,\n        0x23\n    ],\n    \"mediumseagreen\": [\n        0x3c,\n        0xb3,\n        0x71\n    ],\n    \"limegreen\": [\n        0x32,\n        0xcd,\n        0x32\n    ],\n    \"lime\": [\n        0x00,\n        0xff,\n        0x00\n    ],\n    \"springgreen\": [\n        0x00,\n        0xff,\n        0x7f\n    ],\n    \"mediumspringgreen\": [\n        0x00,\n        0xfa,\n        0x9a\n    ],\n    \"darkseagreen\": [\n        0x8f,\n        0xbc,\n        0x8f\n    ],\n    \"mediumaquamarine\": [\n        0x66,\n        0xcd,\n        0xaa\n    ],\n    \"yellowgreen\": [\n        0x9a,\n        0xcd,\n        0x32\n    ],\n    \"lawngreen\": [\n        0x7c,\n        0xfc,\n        0x00\n    ],\n    \"chartreuse\": [\n        0x7f,\n        0xff,\n        0x00\n    ],\n    \"lightgreen\": [\n        0x90,\n        0xee,\n        0x90\n    ],\n    \"greenyellow\": [\n        0xad,\n        0xff,\n        0x2f\n    ],\n    \"palegreen\": [\n        0x98,\n        0xfb,\n        0x98\n    ],\n    \"teal\": [\n        0x00,\n        0x80,\n        0x80\n    ],\n    \"darkcyan\": [\n        0x00,\n        0x8b,\n        0x8b\n    ],\n    \"lightseagreen\": [\n        0x20,\n        0xb2,\n        0xaa\n    ],\n    \"cadetblue\": [\n        0x5f,\n        0x9e,\n        0xa0\n    ],\n    \"darkturquoise\": [\n        0x00,\n        0xce,\n        0xd1\n    ],\n    \"mediumturquoise\": [\n        0x48,\n        0xd1,\n        0xcc\n    ],\n    \"turquoise\": [\n        0x40,\n        0xe0,\n        0xd0\n    ],\n    \"aqua\": [\n        0x00,\n        0xff,\n        0xff\n    ],\n    \"cyan\": [\n        0x00,\n        0xff,\n        0xff\n    ],\n    \"aquamarine\": [\n        0x7f,\n        0xff,\n        0xd4\n    ],\n    \"paleturquoise\": [\n        0xaf,\n        0xee,\n        0xee\n    ],\n    \"lightcyan\": [\n        0xe0,\n        0xff,\n        0xff\n    ],\n    \"navy\": [\n        0x00,\n        0x00,\n        0x80\n    ],\n    \"darkblue\": [\n        0x00,\n        0x00,\n        0x8b\n    ],\n    \"mediumblue\": [\n        0x00,\n        0x00,\n        0xcd\n    ],\n    \"blue\": [\n        0x00,\n        0x00,\n        0xff\n    ],\n    \"midnightblue\": [\n        0x19,\n        0x19,\n        0x70\n    ],\n    \"royalblue\": [\n        0x41,\n        0x69,\n        0xe1\n    ],\n    \"steelblue\": [\n        0x46,\n        0x82,\n        0xb4\n    ],\n    \"dodgerblue\": [\n        0x1e,\n        0x90,\n        0xff\n    ],\n    \"deepskyblue\": [\n        0x00,\n        0xbf,\n        0xff\n    ],\n    \"cornflowerblue\": [\n        0x64,\n        0x95,\n        0xed\n    ],\n    \"skyblue\": [\n        0x87,\n        0xce,\n        0xeb\n    ],\n    \"lightskyblue\": [\n        0x87,\n        0xce,\n        0xfa\n    ],\n    \"lightsteelblue\": [\n        0xb0,\n        0xc4,\n        0xde\n    ],\n    \"lightblue\": [\n        0xad,\n        0xd8,\n        0xe6\n    ],\n    \"powderblue\": [\n        0xb0,\n        0xe0,\n        0xe6\n    ],\n    \"indigo\": [\n        0x4b,\n        0x00,\n        0x82\n    ],\n    \"purple\": [\n        0x80,\n        0x00,\n        0x80\n    ],\n    \"darkmagenta\": [\n        0x8b,\n        0x00,\n        0x8b\n    ],\n    \"darkviolet\": [\n        0x94,\n        0x00,\n        0xd3\n    ],\n    \"darkslateblue\": [\n        0x48,\n        0x3d,\n        0x8b\n    ],\n    \"blueviolet\": [\n        0x8a,\n        0x2b,\n        0xe2\n    ],\n    \"darkorchid\": [\n        0x99,\n        0x32,\n        0xcc\n    ],\n    \"fuchsia\": [\n        0xff,\n        0x00,\n        0xff\n    ],\n    \"magenta\": [\n        0xff,\n        0x00,\n        0xff\n    ],\n    \"slateblue\": [\n        0x6a,\n        0x5a,\n        0xcd\n    ],\n    \"mediumslateblue\": [\n        0x7b,\n        0x68,\n        0xee\n    ],\n    \"mediumorchid\": [\n        0xba,\n        0x55,\n        0xd3\n    ],\n    \"mediumpurple\": [\n        0x93,\n        0x70,\n        0xdb\n    ],\n    \"orchid\": [\n        0xda,\n        0x70,\n        0xd6\n    ],\n    \"violet\": [\n        0xee,\n        0x82,\n        0xee\n    ],\n    \"plum\": [\n        0xdd,\n        0xa0,\n        0xdd\n    ],\n    \"thistle\": [\n        0xd8,\n        0xbf,\n        0xd8\n    ],\n    \"lavender\": [\n        0xe6,\n        0xe6,\n        0xfa\n    ],\n    \"mistyrose\": [\n        0xff,\n        0xe4,\n        0xe1\n    ],\n    \"antiquewhite\": [\n        0xfa,\n        0xeb,\n        0xd7\n    ],\n    \"linen\": [\n        0xfa,\n        0xf0,\n        0xe6\n    ],\n    \"beige\": [\n        0xf5,\n        0xf5,\n        0xdc\n    ],\n    \"whitesmoke\": [\n        0xf5,\n        0xf5,\n        0xf5\n    ],\n    \"lavenderblush\": [\n        0xff,\n        0xf0,\n        0xf5\n    ],\n    \"oldlace\": [\n        0xfd,\n        0xf5,\n        0xe6\n    ],\n    \"aliceblue\": [\n        0xf0,\n        0xf8,\n        0xff\n    ],\n    \"seashell\": [\n        0xff,\n        0xf5,\n        0xee\n    ],\n    \"ghostwhite\": [\n        0xf8,\n        0xf8,\n        0xff\n    ],\n    \"honeydew\": [\n        0xf0,\n        0xff,\n        0xf0\n    ],\n    \"floralwhite\": [\n        0xff,\n        0xfa,\n        0xf0\n    ],\n    \"azure\": [\n        0xf0,\n        0xff,\n        0xff\n    ],\n    \"mintcream\": [\n        0xf5,\n        0xff,\n        0xfa\n    ],\n    \"snow\": [\n        0xff,\n        0xfa,\n        0xfa\n    ],\n    \"ivory\": [\n        0xff,\n        0xff,\n        0xf0\n    ],\n    \"white\": [\n        0xff,\n        0xff,\n        0xff\n    ],\n    \"black\": [\n        0x00,\n        0x00,\n        0x00\n    ],\n    \"darkslategray\": [\n        0x2f,\n        0x4f,\n        0x4f\n    ],\n    \"dimgray\": [\n        0x69,\n        0x69,\n        0x69\n    ],\n    \"slategray\": [\n        0x70,\n        0x80,\n        0x90\n    ],\n    \"gray\": [\n        0x80,\n        0x80,\n        0x80\n    ],\n    \"lightslategray\": [\n        0x77,\n        0x88,\n        0x99\n    ],\n    \"darkgray\": [\n        0xa9,\n        0xa9,\n        0xa9\n    ],\n    \"silver\": [\n        0xc0,\n        0xc0,\n        0xc0\n    ],\n    \"lightgray\": [\n        0xd3,\n        0xd3,\n        0xd3\n    ],\n    \"gainsboro\": [\n        0xdc,\n        0xdc,\n        0xdc\n    ],\n    \"copper\": [\n        0xb8,\n        0x73,\n        0x33\n    ],\n    \"bronze\": [\n        0xcd,\n        0x7f,\n        0x32\n    ],\n    \"steel\": [\n        0xce,\n        0xd2,\n        0xd7\n    ],\n    \"platinum\": [\n        0xe5,\n        0xe4,\n        0xe2\n    ],\n    \"gunmetal\": [\n        0x5c,\n        0x5d,\n        0x5b\n    ],\n    \"titanium\": [\n        0x87,\n        0x86,\n        0x81\n    ],\n    \"rosegold\": [\n        0xcb,\n        0xa3,\n        0xb2\n    ],\n    \"aquaglass\": [\n        0xd2,\n        0xe8,\n        0xdf\n    ],\n    \"blueglass\": [\n        0xc7,\n        0xe3,\n        0xe1\n    ]\n};\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $9567e168ff06f2c9$export$33e818f0c514945e {\n    constructor(){\n        this.minLatitude = -85.05112878;\n        this.maxLatitude = 85.05112878;\n        this.minLongitude = -180;\n        this.maxLongitude = 180;\n        this.minX = -1;\n        this.minY = -1;\n        this.maxX = 1;\n        this.maxY = 1;\n    }\n    project(longitude, latitude, xy) {\n        const x = longitude / 180;\n        latitude = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp(latitude, this.minLatitude, this.maxLatitude);\n        latitude = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(latitude);\n        const sinLatitude = Math.sin(latitude);\n        let y = Math.log((1 + sinLatitude) / (1 - sinLatitude)) / 2;\n        y = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp(y / Math.PI, this.minY, this.maxY);\n        xy[0] = x;\n        xy[1] = y;\n    }\n    unproject(x, y, lonLat) {\n        const longitude = x * 180;\n        y *= Math.PI;\n        let latitude = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO - 2 * Math.atan(Math.exp(-y));\n        latitude = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).radiansToDegrees(latitude);\n        lonLat[0] = longitude;\n        lonLat[1] = latitude;\n    }\n}\nclass $9567e168ff06f2c9$export$4c4ef7713ed8a00d {\n    constructor(){\n        this._phi1 = 29.5;\n        this._phi2 = 45.5;\n        this._lat0 = 37.5;\n        this._lon0 = -96;\n    }\n    get standardParallel1() {\n        return this._phi1;\n    }\n    set standardParallel1(value) {\n        this._phi1 = value;\n    }\n    get standardParallel2() {\n        return this._phi2;\n    }\n    set standardParallel2(value) {\n        this._phi2 = value;\n    }\n    get latitudeOfOrigin() {\n        return this._lat0;\n    }\n    set latitudeOfOrigin(value) {\n        this._lat0 = value;\n    }\n    get centralMeridian() {\n        return this._lon0;\n    }\n    set centralMeridian(value) {\n        this._lon0 = value;\n    }\n    project(lon, lat, xy) {\n        const phi1 = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(this._phi1);\n        const phi2 = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(this._phi2);\n        const lat0 = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(this._lat0);\n        const lon0 = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(this._lon0);\n        lat = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(lat);\n        lon = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(lon);\n        const n = 0.5 * (Math.sin(phi1) + Math.sin(phi2));\n        const c = Math.cos(phi1);\n        const C = c * c + 2 * n * Math.sin(phi1);\n        const p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n;\n        const theta = n * (lon - lon0);\n        const p = Math.sqrt(C - 2 * n * Math.sin(lat)) / n;\n        const x = p * Math.sin(theta);\n        const y = p0 - p * Math.cos(theta);\n        xy[0] = x;\n        xy[1] = y;\n    }\n    unproject(x, y, lonLat) {\n        const phi1 = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(this._phi1);\n        const phi2 = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(this._phi2);\n        const lat0 = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(this._lat0);\n        const lon0 = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(this._lon0);\n        const n = 0.5 * (Math.sin(phi1) + Math.sin(phi2));\n        const c = Math.cos(phi1);\n        const C = c * c + 2 * n * Math.sin(phi1);\n        const p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n;\n        let theta = Math.atan(x / Math.abs(p0 - y) * Math.sign(p0 - y));\n        if ((p0 - y) * n < 0) theta -= Math.PI * Math.sign(x) * Math.sign(p0 - y);\n        const p = Math.sqrt(x * x + Math.pow(p0 - y, 2));\n        const lon = lon0 + theta / n;\n        const lat = Math.asin((C - p * p * n * n) / (2 * n));\n        lonLat[0] = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).radiansToDegrees(lon);\n        lonLat[1] = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).radiansToDegrees(lat);\n    }\n}\nclass $9567e168ff06f2c9$export$618604db0cd69e78 {\n    constructor(){\n        this._lonLat = [\n            0,\n            0\n        ];\n    }\n    feature(geoJSON, property, key) {\n        for(let i = 0; i < geoJSON.features.length; i++){\n            let feature = geoJSON.features[i];\n            if (feature.properties[property] == key) return feature;\n        }\n        return null;\n    }\n    bounds(geometry, clip, projection) {\n        let minX = Number.MAX_VALUE;\n        let maxX = -Number.MAX_VALUE;\n        let minY = Number.MAX_VALUE;\n        let maxY = -Number.MAX_VALUE;\n        switch(geometry.type){\n            case \"Polygon\":\n                const polygon = geometry;\n                const outer = polygon.coordinates[0];\n                for(let k = 0; k < outer.length; k++){\n                    this._lonLat[0] = outer[k][0];\n                    this._lonLat[1] = outer[k][1];\n                    if (this._lonLat[0] < clip.minLon || this._lonLat[0] > clip.maxLon || this._lonLat[1] < clip.minLat || this._lonLat[1] > clip.maxLat) break;\n                    if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                    if (projection) projection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                    minX = Math.min(minX, this._lonLat[0]);\n                    maxX = Math.max(maxX, this._lonLat[0]);\n                    minY = Math.min(minY, this._lonLat[1]);\n                    maxY = Math.max(maxY, this._lonLat[1]);\n                }\n                break;\n            case \"MultiPolygon\":\n                const multiPolygon = geometry;\n                for(let j = 0; j < multiPolygon.coordinates.length; j++){\n                    const polygon = multiPolygon.coordinates[j];\n                    const outer = polygon[0];\n                    for(let k = 0; k < outer.length; k++){\n                        this._lonLat[0] = outer[k][0];\n                        this._lonLat[1] = outer[k][1];\n                        if (this._lonLat[0] < clip.minLon || this._lonLat[0] > clip.maxLon || this._lonLat[1] < clip.minLat || this._lonLat[1] > clip.maxLat) continue;\n                        if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                        if (projection) projection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                        minX = Math.min(minX, this._lonLat[0]);\n                        maxX = Math.max(maxX, this._lonLat[0]);\n                        minY = Math.min(minY, this._lonLat[1]);\n                        maxY = Math.max(maxY, this._lonLat[1]);\n                    }\n                }\n                break;\n        }\n        if (minX == Number.MAX_VALUE) {\n            minX = 0;\n            maxX = 0;\n            minY = 0;\n            maxY = 0;\n        }\n        return {\n            minX: minX,\n            maxX: maxX,\n            minY: minY,\n            maxY: maxY\n        };\n    }\n}\n\n\n\nclass $674034e16b0fa1d5$export$375c50c679feb27e {\n    toJSON() {\n        return {\n            key: this.key,\n            scale: this.scale,\n            minLat: this.minLat,\n            maxLat: this.maxLat,\n            minLon: this.minLon,\n            maxLon: this.maxLon,\n            u0: this.u0,\n            v0: this.v0,\n            u1: this.u1,\n            v1: this.v1\n        };\n    }\n}\nclass $674034e16b0fa1d5$export$e09d61cfc7544ffc {\n    update() {}\n    constructor(map){\n        this.map = map;\n    }\n}\nclass $674034e16b0fa1d5$export$a5c7b93649eaf8f8 {\n    get atlas() {\n        return this._rasterizer.atlas;\n    }\n    get count() {\n        return this._keys.size;\n    }\n    constructor(core, rasterizer){\n        this._core = core;\n        this._rasterizer = rasterizer;\n        this._keys = new Set();\n        this._previousSize = 0;\n        this.items = {};\n    }\n    add(key) {\n        if (!this._keys.has(key)) {\n            if (this._rasterizer.draw(key) !== null) {\n                this._keys.add(key);\n                this._hasChanged = true;\n            }\n        }\n    }\n    update() {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.key} added ${this._keys.size - this._previousSize} new items`);\n            this._previousSize = this._keys.size;\n            if (this.hasChangedCallback) this.hasChangedCallback();\n        }\n    }\n    toJSON() {\n        const items = [];\n        for(let key in this.items){\n            const item = this.items[key];\n            items.push(item.toJSON());\n        }\n        return {\n            key: this.key,\n            items: items\n        };\n    }\n}\nclass $674034e16b0fa1d5$export$2f33733435e4fbde {\n    constructor(width, height){\n        const canvas = document.createElement(\"canvas\");\n        canvas.width = width;\n        canvas.height = height;\n        const context = canvas.getContext(\"2d\");\n        context.clearRect(0, 0, width, height);\n        this.imageData = context.getImageData(0, 0, width, height);\n        this.x = 0;\n        this.top = new Uint16Array(width);\n    }\n}\nclass $674034e16b0fa1d5$export$8377de51ad4460c0 {\n    get map() {\n        return this._map;\n    }\n    get atlas() {\n        return this._atlas;\n    }\n    get scale() {\n        return this._scale;\n    }\n    set scale(value) {\n        this._scale = value;\n        this._geoJSONRasterizer.scale = value;\n    }\n    get geoJSON() {\n        return this._geoJSON;\n    }\n    set geoJSON(value) {\n        this._geoJSON = value;\n        this._geoJSONRasterizer.geoJSON = value;\n    }\n    get property() {\n        return this._property;\n    }\n    set property(value) {\n        this._property = value;\n        this._geoJSONRasterizer.property = value;\n    }\n    get mapProjection() {\n        return this._mapProjection;\n    }\n    set mapProjection(value) {\n        this._mapProjection = value;\n        this._geoJSONRasterizer.mapProjection = value;\n    }\n    get scaleFactor() {\n        return this._scaleFactor;\n    }\n    set scaleFactor(value) {\n        this._scaleFactor = value;\n        this._geoJSONRasterizer.scaleFactor = this._scaleFactor;\n    }\n    get minLongitude() {\n        return this._minLogitude;\n    }\n    set minLongitude(value) {\n        this._minLogitude = value;\n        this._geoJSONRasterizer.minLongitude = this._minLogitude;\n    }\n    get maxLongitude() {\n        return this._maxLongitude;\n    }\n    set maxLongitude(value) {\n        this._maxLongitude = value;\n        this._geoJSONRasterizer.maxLongitude = this._maxLongitude;\n    }\n    get minLatitude() {\n        return this._minLatitude;\n    }\n    set minLatitude(value) {\n        this._minLatitude = value;\n        this._geoJSONRasterizer.minLatitude = this._minLatitude;\n    }\n    get maxLatitude() {\n        return this._maxLatitude;\n    }\n    set maxLatitude(value) {\n        this._maxLatitude = value;\n        this._geoJSONRasterizer.maxLatitude = this._maxLatitude;\n    }\n    constructor(core, options){\n        let start = performance.now();\n        this._core = core;\n        this._atlas = options.atlas;\n        this._geoJSON = options.geoJSON;\n        this._scale = options.scale;\n        this._property = options.property;\n        this._border = options.border;\n        this._maxDistance = options.maxDistance;\n        this._edgeValue = options.edgeValue;\n        this._key = options.key;\n        this._mapProjection = options.mapProjection;\n        this._map = new $674034e16b0fa1d5$export$a5c7b93649eaf8f8(core, this);\n        this._map.key = this._key;\n        const geoJSONRasterizerOptions = {\n            border: this._border,\n            edgeValue: this._edgeValue,\n            maxDistance: this._maxDistance,\n            geoJSON: this._geoJSON,\n            scale: this._scale,\n            property: this._property,\n            mapProjection: this._mapProjection\n        };\n        this._geoJSONRasterizer = new $674034e16b0fa1d5$export$d7e26c56770d910(core, geoJSONRasterizerOptions);\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `map rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(key) {\n        const item = this._geoJSONRasterizer.draw(key);\n        if (item) {\n            const texWidth = item.width + 2 * this._border;\n            const texHeight = item.height + 2 * this._border;\n            const width = this._atlas.imageData.width;\n            const height = this.atlas.imageData.height;\n            if (this._atlas.x + texWidth > width - 1) this._atlas.x = 0;\n            let y = 0;\n            for(let x = this._atlas.x; x < this._atlas.x + texWidth; x++)y = Math.max(y, this._atlas.top[x]);\n            if (y + texHeight > height - 1) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, `${this._map.key} height overflow`);\n            for(let x = this._atlas.x; x < this._atlas.x + texWidth; x++)this._atlas.top[x] = y + texHeight;\n            const halfTexelOffsetX = 0.5 / width;\n            const halfTexelOffsetY = 0.5 / height;\n            item.u0 = this._atlas.x / width + halfTexelOffsetX;\n            item.v0 = y / height + halfTexelOffsetY;\n            item.u1 = (this._atlas.x + texWidth) / width - halfTexelOffsetX;\n            item.v1 = (y + texHeight) / height - halfTexelOffsetY;\n            this._map.items[key] = item;\n            for(let i = 0; i < item.distances.length; i++){\n                const distance = item.distances[i];\n                const dataX = i % texWidth;\n                const dataY = Math.floor(i / texWidth);\n                const offset = (this._atlas.x + dataX + (y + dataY) * width) * 4;\n                this._atlas.imageData.data[offset + 0] = distance;\n                this._atlas.imageData.data[offset + 1] = distance;\n                this._atlas.imageData.data[offset + 2] = distance;\n                this._atlas.imageData.data[offset + 3] = 0xff;\n            }\n            this._atlas.x += texWidth;\n        }\n        return item;\n    }\n}\nclass $674034e16b0fa1d5$export$d7e26c56770d910 {\n    get scale() {\n        return this._scale;\n    }\n    set scale(value) {\n        this._scale = value;\n    }\n    get geoJSON() {\n        return this._geoJSON;\n    }\n    set geoJSON(value) {\n        this._geoJSON = value;\n    }\n    get property() {\n        return this._property;\n    }\n    set property(value) {\n        this._property = value;\n    }\n    get mapProjection() {\n        return this._mapProjection;\n    }\n    set mapProjection(value) {\n        this._mapProjection = value;\n    }\n    get scaleFactor() {\n        return this._scaleFactor;\n    }\n    set scaleFactor(value) {\n        this._scaleFactor = value;\n    }\n    get minLongitude() {\n        return this._minLongitude;\n    }\n    set minLongitude(value) {\n        this._minLongitude = value;\n    }\n    get maxLongitude() {\n        return this._maxLongitude;\n    }\n    set maxLongitude(value) {\n        this._maxLongitude = value;\n    }\n    get minLatitude() {\n        return this._minLatitude;\n    }\n    set minLatitude(value) {\n        this._minLatitude = value;\n    }\n    get maxLatitude() {\n        return this._maxLatitude;\n    }\n    set maxLatitude(value) {\n        this._maxLatitude = value;\n    }\n    constructor(core, options){\n        let start = performance.now();\n        this._core = core;\n        this._geoJSON = options.geoJSON;\n        this._scale = options.scale;\n        this._property = options.property;\n        this._border = options.border;\n        this._maxDistance = options.maxDistance;\n        this._edgeValue = options.edgeValue;\n        this._mapProjection = options.mapProjection;\n        this._lonLat = [\n            0,\n            0\n        ];\n        this._geoJSONHelper = new (0, $9567e168ff06f2c9$export$618604db0cd69e78)();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `geoJSON rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(key) {\n        let feature = this._geoJSONHelper.feature(this._geoJSON, this._property, key);\n        if (feature) {\n            let geometry = feature.geometry;\n            const clip = {\n                minLon: this._minLongitude,\n                maxLon: this._maxLongitude,\n                minLat: this._minLatitude,\n                maxLat: this._maxLatitude\n            };\n            const bounds = this._geoJSONHelper.bounds(geometry, clip, this._mapProjection);\n            if (bounds) {\n                let minX = bounds.minX;\n                let maxX = bounds.maxX;\n                let minY = bounds.minY;\n                let maxY = bounds.maxY;\n                let sizeX = bounds.maxX - bounds.minX;\n                let sizeY = bounds.maxY - bounds.minY;\n                if (sizeX > 0 && sizeY > 0) {\n                    const scale = this._scale * this._scaleFactor;\n                    sizeX = Math.ceil(sizeX * scale);\n                    sizeY = Math.ceil(sizeY * scale);\n                    const canvas = document.createElement(\"canvas\");\n                    const width = sizeX + 2 * this._border;\n                    const height = sizeY + 2 * this._border;\n                    canvas.width = width;\n                    canvas.height = height;\n                    const ctx = canvas.getContext(\"2d\", {\n                        willReadFrequently: true\n                    });\n                    let length = width * height;\n                    this._gridOuter = new Float64Array(length);\n                    this._gridInner = new Float64Array(length);\n                    length = Math.max(width, height);\n                    this._f = new Float64Array(length);\n                    this._z = new Float64Array(length + 1);\n                    this._v = new Uint16Array(length);\n                    length = width * height;\n                    const distances = new Uint8ClampedArray(length);\n                    const gradientsX = new Uint8ClampedArray(length);\n                    const gradientsY = new Uint8ClampedArray(length);\n                    const pixels = new Uint8ClampedArray(length);\n                    const item = new $674034e16b0fa1d5$export$375c50c679feb27e();\n                    item.key = key;\n                    item.distances = distances;\n                    item.gradientsX = gradientsX;\n                    item.gradientsY = gradientsY;\n                    item.pixels = pixels;\n                    item.width = sizeX;\n                    item.height = sizeY;\n                    item.minLon = minX;\n                    item.maxLon = maxX;\n                    item.minLat = minY;\n                    item.maxLat = maxY;\n                    item.scale = this._scaleFactor;\n                    ctx.clearRect(this._border, this._border, sizeX, sizeY);\n                    switch(geometry.type){\n                        case \"Polygon\":\n                            const polygon = geometry;\n                            const outer = polygon.coordinates[0];\n                            ctx.fillStyle = \"black\";\n                            ctx.beginPath();\n                            this._lonLat[0] = outer[0][0];\n                            this._lonLat[1] = outer[0][1];\n                            if (this._lonLat[0] < clip.minLon || this._lonLat[0] > clip.maxLon || this._lonLat[1] < clip.minLat || this._lonLat[1] > clip.maxLat) break;\n                            if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                            if (this._mapProjection) this._mapProjection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                            const x = (this._lonLat[0] - minX) * scale - sizeX / 2 + width / 2;\n                            const y = height / 2 - (this._lonLat[1] - minY) * scale + sizeY / 2;\n                            ctx.moveTo(x, y);\n                            for(let k = 1; k < outer.length; k++){\n                                this._lonLat[0] = outer[k][0];\n                                this._lonLat[1] = outer[k][1];\n                                if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                                if (this._mapProjection) this._mapProjection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                                const x = (this._lonLat[0] - minX) * scale - sizeX / 2 + width / 2;\n                                const y = height / 2 - (this._lonLat[1] - minY) * scale + sizeY / 2;\n                                ctx.lineTo(x, y);\n                            }\n                            ctx.fill();\n                            for(let k = 1; k < polygon.coordinates.length; k++){\n                                const inner = polygon.coordinates[k];\n                                ctx.fillStyle = \"transparent\";\n                                ctx.beginPath();\n                                this._lonLat[0] = inner[0][0];\n                                this._lonLat[1] = inner[0][1];\n                                if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                                if (this._mapProjection) this._mapProjection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                                const x = (this._lonLat[0] - minX) * scale - sizeX / 2 + width / 2;\n                                const y = height / 2 - (this._lonLat[1] - minY) * scale + sizeY / 2;\n                                ctx.moveTo(x, y);\n                                for(let l = 1; l < inner.length; l++){\n                                    this._lonLat[0] = inner[l][0];\n                                    this._lonLat[1] = inner[l][1];\n                                    if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                                    if (this._mapProjection) this._mapProjection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                                    const x = (this._lonLat[0] - minX) * scale - sizeX / 2 + width / 2;\n                                    const y = height / 2 - (this._lonLat[1] - minY) * scale + sizeY / 2;\n                                    ctx.lineTo(x, y);\n                                }\n                                ctx.fill();\n                            }\n                            break;\n                        case \"MultiPolygon\":\n                            const multiPolygon = geometry;\n                            for(let j = 0; j < multiPolygon.coordinates.length; j++){\n                                const polygon = multiPolygon.coordinates[j];\n                                const outer = polygon[0];\n                                ctx.fillStyle = \"black\";\n                                ctx.beginPath();\n                                this._lonLat[0] = outer[0][0];\n                                this._lonLat[1] = outer[0][1];\n                                if (this._lonLat[0] < clip.minLon || this._lonLat[0] > clip.maxLon || this._lonLat[1] < clip.minLat || this._lonLat[1] > clip.maxLat) continue;\n                                if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                                if (this._mapProjection) this._mapProjection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                                const x = (this._lonLat[0] - minX) * scale - sizeX / 2 + width / 2;\n                                const y = height / 2 - (this._lonLat[1] - minY) * scale + sizeY / 2;\n                                ctx.moveTo(x, y);\n                                for(let k = 1; k < outer.length; k++){\n                                    this._lonLat[0] = outer[k][0];\n                                    this._lonLat[1] = outer[k][1];\n                                    if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                                    if (this._mapProjection) this._mapProjection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                                    const x = (this._lonLat[0] - minX) * scale - sizeX / 2 + width / 2;\n                                    const y = height / 2 - (this._lonLat[1] - minY) * scale + sizeY / 2;\n                                    ctx.lineTo(x, y);\n                                }\n                                ctx.fill();\n                                for(let k = 1; k < polygon.length; k++){\n                                    const inner = polygon[k];\n                                    ctx.fillStyle = \"transparent\";\n                                    ctx.beginPath();\n                                    this._lonLat[0] = inner[0][0];\n                                    this._lonLat[1] = inner[0][1];\n                                    if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                                    if (this._mapProjection) this._mapProjection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                                    const x = (this._lonLat[0] - minX) * scale - sizeX / 2 + width / 2;\n                                    const y = height / 2 - (this._lonLat[1] - minY) * scale + sizeY / 2;\n                                    ctx.moveTo(x, y);\n                                    for(let l = 1; l < inner.length; l++){\n                                        this._lonLat[0] = inner[l][0];\n                                        this._lonLat[1] = inner[l][1];\n                                        if (this._lonLat[0] > 0) this._lonLat[0] -= 360;\n                                        if (this._mapProjection) this._mapProjection.project(this._lonLat[0], this._lonLat[1], this._lonLat);\n                                        const x = (this._lonLat[0] - minX) * scale - sizeX / 2 + width / 2;\n                                        const y = height / 2 - (this._lonLat[1] - minY) * scale + sizeY / 2;\n                                        ctx.lineTo(x, y);\n                                    }\n                                    ctx.fill();\n                                }\n                            }\n                            break;\n                    }\n                    const imgData = ctx.getImageData(this._border, this._border, sizeX, sizeY);\n                    for(let i = 0; i < length; i++){\n                        this._gridOuter[i] = Number.MAX_VALUE;\n                        this._gridInner[i] = 0;\n                    }\n                    for(let y = 0; y < sizeY; y++)for(let x = 0; x < sizeX; x++){\n                        const a = imgData.data[4 * (y * sizeX + x) + 3] / 0xff;\n                        if (a > 0) {\n                            const j = (y + this._border) * width + x + this._border;\n                            if (a == 1) {\n                                this._gridOuter[j] = 0;\n                                this._gridInner[j] = Number.MAX_VALUE;\n                                pixels[j] = 0xff;\n                            } else {\n                                const d = 0.5 - a;\n                                this._gridOuter[j] = d > 0 ? d * d : 0;\n                                this._gridInner[j] = d < 0 ? d * d : 0;\n                            }\n                        }\n                    }\n                    this._edt(this._gridOuter, 0, 0, width, height, width, this._f, this._v, this._z);\n                    this._edt(this._gridInner, this._border, this._border, sizeX, sizeY, width, this._f, this._v, this._z);\n                    const distances2 = new Float32Array(length);\n                    for(let i = 0; i < length; i++){\n                        const distance = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n                        distances[i] = Math.round(this._edgeValue - distance * 0xff / this._maxDistance);\n                        distances2[i] = distance;\n                    }\n                    for(let i = 0; i < length; i++){\n                        const x = i % width;\n                        const y = Math.floor(i / width);\n                        const d = distances2[i];\n                        const sign = d < 0 ? -1 : 1;\n                        const x0 = x > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n                        const x1 = x < width - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n                        const y0 = y > 0 ? distances2[i - width] : Number.MAX_VALUE;\n                        const y1 = y < height - 1 ? distances2[i + width] : Number.MAX_VALUE;\n                        let gradientX = sign * x0 < sign * x1 ? d - x0 : x1 - d;\n                        let gradientY = sign * y0 < sign * y1 ? y0 - d : d - y1;\n                        gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 0xff);\n                        gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 0xff);\n                    }\n                    return item;\n                }\n            }\n        }\n        if (!feature) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, `geoJSON rasterizer ${key} not found`);\n        return null;\n    }\n    _edt(data, x0, y0, width, height, gridSize, f, v, z) {\n        for(let x = x0; x < x0 + width; x++)this._edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);\n        for(let y = y0; y < y0 + height; y++)this._edt1d(data, y * gridSize + x0, 1, width, f, v, z);\n    }\n    _edt1d(grid, offset, stride, n, f, v, z) {\n        v[0] = 0;\n        z[0] = -Number.MAX_VALUE;\n        z[1] = Number.MAX_VALUE;\n        f[0] = grid[offset];\n        for(let q = 1, k = 0, s = 0; q < n; q++){\n            f[q] = grid[offset + q * stride];\n            const q2 = q * q;\n            do {\n                const r = v[k];\n                s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n            }while (s <= z[k] && --k > -1);\n            k++;\n            v[k] = q;\n            z[k] = s;\n            z[k + 1] = Number.MAX_VALUE;\n        }\n        for(let q = 0, k = 0; q < n; q++){\n            while(z[k + 1] < q)k++;\n            const r = v[k];\n            const qr = q - r;\n            grid[offset + q * stride] = f[r] + qr * qr;\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $e74a570f4944e4e3$export$f04a61298a47a40f {\n    toJSON() {\n        return {\n            key: this.key,\n            u0: this.u0,\n            v0: this.v0,\n            u1: this.u1,\n            v1: this.v1\n        };\n    }\n}\nclass $e74a570f4944e4e3$export$88f28934f7b397a2 {\n    update() {}\n    constructor(icons){\n        this.icons = icons;\n    }\n}\nclass $e74a570f4944e4e3$export$4f13f83fd8bb1dac {\n    get atlas() {\n        return this._rasterizer.atlas;\n    }\n    get count() {\n        return this._keys.size;\n    }\n    constructor(core, rasterizer){\n        this._core = core;\n        this._rasterizer = rasterizer;\n        this._keys = new Set();\n        this._previousSize = 0;\n        this.items = {};\n    }\n    add(key, imgData) {\n        if (!this._keys.has(key)) {\n            this._keys.add(key);\n            this._rasterizer.draw(key, imgData);\n        }\n    }\n    update() {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.key} added ${this._keys.size - this._previousSize} new items`);\n            this._previousSize = this._keys.size;\n            if (this.hasChangedCallback) this.hasChangedCallback();\n        }\n    }\n    toJSON() {\n        const items = [];\n        for(let key in this.items){\n            const item = this.items[key];\n            items.push(item.toJSON());\n        }\n        return {\n            key: this.key,\n            items: items\n        };\n    }\n}\nclass $e74a570f4944e4e3$export$6497be8c854f7ac0 {\n    constructor(width, height){\n        const canvas = document.createElement(\"canvas\");\n        canvas.width = width;\n        canvas.height = height;\n        const context = canvas.getContext(\"2d\");\n        context.clearRect(0, 0, width, height);\n        this.imageData = context.getImageData(0, 0, width, height);\n        this.x = 0;\n        this.top = new Uint16Array(width);\n    }\n}\nclass $e74a570f4944e4e3$export$368093602d58cb0a {\n    get icons() {\n        return this._icons;\n    }\n    get atlas() {\n        return this._atlas;\n    }\n    constructor(core, options){\n        let start = performance.now();\n        this._core = core;\n        this._atlas = options.atlas;\n        this._border = options.border;\n        this._maxDistance = options.maxDistance;\n        this._edgeValue = options.edgeValue;\n        this._key = options.key;\n        this._icons = new $e74a570f4944e4e3$export$4f13f83fd8bb1dac(core, this);\n        this._icons.key = this._key;\n        const iconRasterizerOptions = {\n            border: this._border,\n            edgeValue: this._edgeValue,\n            maxDistance: this._maxDistance\n        };\n        this._iconRasterizer = new $e74a570f4944e4e3$export$9178c5490b70082f(core, iconRasterizerOptions);\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `icons rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(key, imgData) {\n        const item = this._iconRasterizer.draw(key, imgData);\n        if (item) {\n            const texWidth = item.width + 2 * this._border;\n            const texHeight = item.height + 2 * this._border;\n            const width = this._atlas.imageData.width;\n            const height = this.atlas.imageData.height;\n            if (this._atlas.x + texWidth > width - 1) this._atlas.x = 0;\n            let y = 0;\n            for(let x = this._atlas.x; x < this._atlas.x + texWidth; x++)y = Math.max(y, this._atlas.top[x]);\n            if (y + texHeight > height - 1) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, `${this._icons.key} height overflow`);\n            for(let x = this._atlas.x; x < this._atlas.x + texWidth; x++)this._atlas.top[x] = y + texHeight;\n            const halfTexelOffsetX = 0.5 / width;\n            const halfTexelOffsetY = 0.5 / height;\n            item.u0 = this._atlas.x / width + halfTexelOffsetX;\n            item.v0 = y / height + halfTexelOffsetY;\n            item.u1 = (this._atlas.x + texWidth) / width - halfTexelOffsetX;\n            item.v1 = (y + texHeight) / height - halfTexelOffsetY;\n            this._icons.items[key] = item;\n            for(let i = 0; i < item.distances.length; i++){\n                const distance = item.distances[i];\n                const dataX = i % texWidth;\n                const dataY = Math.floor(i / texWidth);\n                const offset = (this._atlas.x + dataX + (y + dataY) * width) * 4;\n                this._atlas.imageData.data[offset + 0] = distance;\n                this._atlas.imageData.data[offset + 1] = distance;\n                this._atlas.imageData.data[offset + 2] = distance;\n                this._atlas.imageData.data[offset + 3] = 0xff;\n            }\n            this._atlas.x += texWidth;\n        }\n    }\n}\nclass $e74a570f4944e4e3$export$9178c5490b70082f {\n    constructor(core, options){\n        let start = performance.now();\n        this._core = core;\n        this._border = options.border;\n        this._maxDistance = options.maxDistance;\n        this._edgeValue = options.edgeValue;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `icon rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(key, imgData0) {\n        const sizeX = imgData0.width;\n        const sizeY = imgData0.height;\n        const canvas = document.createElement(\"canvas\");\n        const width = sizeX + 2 * this._border;\n        const height = sizeY + 2 * this._border;\n        canvas.width = width;\n        canvas.height = height;\n        let length = width * height;\n        this._gridOuter = new Float64Array(length);\n        this._gridInner = new Float64Array(length);\n        length = Math.max(width, height);\n        this._f = new Float64Array(length);\n        this._z = new Float64Array(length + 1);\n        this._v = new Uint16Array(length);\n        length = width * height;\n        const distances = new Uint8ClampedArray(length);\n        const gradientsX = new Uint8ClampedArray(length);\n        const gradientsY = new Uint8ClampedArray(length);\n        const pixels = new Uint8ClampedArray(length);\n        const item = new $e74a570f4944e4e3$export$f04a61298a47a40f();\n        item.key = key;\n        item.distances = distances;\n        item.gradientsX = gradientsX;\n        item.gradientsY = gradientsY;\n        item.pixels = pixels;\n        item.width = sizeX;\n        item.height = sizeY;\n        const ctx = canvas.getContext(\"2d\", {\n            willReadFrequently: true\n        });\n        ctx.clearRect(this._border, this._border, sizeX, sizeY);\n        ctx.putImageData(imgData0, this._border, this._border);\n        const imgData1 = ctx.getImageData(this._border, this._border, sizeX, sizeY);\n        for(let i = 0; i < length; i++){\n            this._gridOuter[i] = Number.MAX_VALUE;\n            this._gridInner[i] = 0;\n        }\n        for(let y = 0; y < sizeY; y++)for(let x = 0; x < sizeX; x++){\n            const a = imgData1.data[4 * (y * sizeX + x) + 3] / 0xff;\n            if (a > 0) {\n                const j = (y + this._border) * width + x + this._border;\n                if (a == 1) {\n                    this._gridOuter[j] = 0;\n                    this._gridInner[j] = Number.MAX_VALUE;\n                    pixels[j] = 0xff;\n                } else {\n                    const d = 0.5 - a;\n                    this._gridOuter[j] = d > 0 ? d * d : 0;\n                    this._gridInner[j] = d < 0 ? d * d : 0;\n                }\n            }\n        }\n        this._edt(this._gridOuter, 0, 0, width, height, width, this._f, this._v, this._z);\n        this._edt(this._gridInner, this._border, this._border, sizeX, sizeY, width, this._f, this._v, this._z);\n        const distances2 = new Float32Array(length);\n        for(let i = 0; i < length; i++){\n            const distance = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n            distances[i] = Math.round(this._edgeValue - distance * 0xff / this._maxDistance);\n            distances2[i] = distance;\n        }\n        for(let i = 0; i < length; i++){\n            const x = i % width;\n            const y = Math.floor(i / width);\n            const d = distances2[i];\n            const sign = d < 0 ? -1 : 1;\n            const x0 = x > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n            const x1 = x < width - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n            const y0 = y > 0 ? distances2[i - width] : Number.MAX_VALUE;\n            const y1 = y < height - 1 ? distances2[i + width] : Number.MAX_VALUE;\n            let gradientX = sign * x0 < sign * x1 ? d - x0 : x1 - d;\n            let gradientY = sign * y0 < sign * y1 ? y0 - d : d - y1;\n            gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 0xff);\n            gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 0xff);\n        }\n        return item;\n    }\n    _edt(data, x0, y0, width, height, gridSize, f, v, z) {\n        for(let x = x0; x < x0 + width; x++)this._edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);\n        for(let y = y0; y < y0 + height; y++)this._edt1d(data, y * gridSize + x0, 1, width, f, v, z);\n    }\n    _edt1d(grid, offset, stride, n, f, v, z) {\n        v[0] = 0;\n        z[0] = -Number.MAX_VALUE;\n        z[1] = Number.MAX_VALUE;\n        f[0] = grid[offset];\n        for(let q = 1, k = 0, s = 0; q < n; q++){\n            f[q] = grid[offset + q * stride];\n            const q2 = q * q;\n            do {\n                const r = v[k];\n                s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n            }while (s <= z[k] && --k > -1);\n            k++;\n            v[k] = q;\n            z[k] = s;\n            z[k + 1] = Number.MAX_VALUE;\n        }\n        for(let q = 0, k = 0; q < n; q++){\n            while(z[k + 1] < q)k++;\n            const r = v[k];\n            const qr = q - r;\n            grid[offset + q * stride] = f[r] + qr * qr;\n        }\n    }\n}\n\n\nvar $8fe9a403f3311664$exports = {};\n\n$parcel$export($8fe9a403f3311664$exports, \"Controller\", () => $6c3dd367ac3ca617$export$bd0bf19f25da8474);\n$parcel$export($8fe9a403f3311664$exports, \"ControllerVisual\", () => $6c3dd367ac3ca617$export$c6e88a9dc8138322);\n$parcel$export($8fe9a403f3311664$exports, \"Label\", () => $715a174735ed4fbb$export$b04be29aa201d4f5);\n$parcel$export($8fe9a403f3311664$exports, \"LabelVisual\", () => $715a174735ed4fbb$export$71c7fa1581020e2c);\n$parcel$export($8fe9a403f3311664$exports, \"LabelSet\", () => $715a174735ed4fbb$export$f51a22c5863d0d80);\n$parcel$export($8fe9a403f3311664$exports, \"TransitionLabelSet\", () => $715a174735ed4fbb$export$8e28e4b5a55f0bba);\n$parcel$export($8fe9a403f3311664$exports, \"LabelSetVisual\", () => $715a174735ed4fbb$export$97e93e7019ef67b9);\n$parcel$export($8fe9a403f3311664$exports, \"ImageVisual\", () => $f7de7bdc7bccbb25$export$6f251cd327b2ff1);\n$parcel$export($8fe9a403f3311664$exports, \"ImageQuad\", () => $f7de7bdc7bccbb25$export$3f0bd71f9b37d8ee);\n$parcel$export($8fe9a403f3311664$exports, \"ImageSphere\", () => $f7de7bdc7bccbb25$export$f4ca272a8ace4457);\n$parcel$export($8fe9a403f3311664$exports, \"NominalKey\", () => $4cef0568024a2460$export$1f02ce5a460c3bdd);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\n\nclass $715a174735ed4fbb$export$71c7fa1581020e2c {\n    render(elapsedTime, xrFrame) {}\n    update(elapsedTime) {}\n    constructor(label){\n        this.label = label;\n    }\n}\nclass $715a174735ed4fbb$export$97e93e7019ef67b9 {\n    render(elapsedTime, xrFrame) {}\n    update(elapsedTime) {}\n    constructor(labelSet){\n        this.label = labelSet;\n    }\n}\nclass $715a174735ed4fbb$export$31008ffe97c96a49 {\n    get material() {\n        return this._material;\n    }\n    get vertices() {\n        return this._vertices;\n    }\n    get verticesView() {\n        return this._verticesView;\n    }\n    get indices() {\n        return this._indices;\n    }\n    get indexCount() {\n        return this._indexCount;\n    }\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get mMatrix() {\n        return this._mMatrix;\n    }\n    get materialType() {\n        return this._materialType;\n    }\n    get materialColor() {\n        return this._materialColor;\n    }\n    get materialFuzz() {\n        return this._materialFuzz;\n    }\n    get materialGloss() {\n        return this._materialGloss;\n    }\n    get segmentColor() {\n        return this._segmentColor;\n    }\n    get scale() {\n        return this._scale;\n    }\n    set scale(value) {\n        if (this._scale != value) {\n            this._scale = value;\n            this._hasChanged = true;\n        }\n    }\n    get font() {\n        return this._font;\n    }\n    set font(value) {\n        if (this._font != value) {\n            this._font = value;\n            this._hasChanged = true;\n        }\n    }\n    get rotation() {\n        return this._rotation;\n    }\n    set rotation(value) {\n        if (this._rotation != value) {\n            this._rotation = value;\n            this._hasChanged = true;\n        }\n    }\n    set reverseX(value) {\n        if (this._reverseX != value) {\n            this._reverseX = value;\n            this._hasChanged = true;\n        }\n    }\n    set reverseY(value) {\n        if (this._reverseY != value) {\n            this._reverseY = value;\n            this._hasChanged = true;\n        }\n    }\n    set reverseZ(value) {\n        if (this._reverseZ != value) {\n            this._reverseZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get horizontalAlignment() {\n        return this._horizontalAlignment;\n    }\n    set horizontalAlignment(value) {\n        if (this._horizontalAlignment != value) {\n            this._horizontalAlignment = value;\n            this._hasChanged = true;\n        }\n    }\n    get verticalAlignment() {\n        return this._verticalAlignment;\n    }\n    set verticalAlignment(value) {\n        if (this._verticalAlignment != value) {\n            this._verticalAlignment = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetX() {\n        return this._offsetX;\n    }\n    set offsetX(value) {\n        if (this._offsetX != value) {\n            this._offsetX = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetY() {\n        return this._offsetY;\n    }\n    set offsetY(value) {\n        if (this._offsetY != value) {\n            this._offsetY = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetZ() {\n        return this._offsetZ;\n    }\n    set offsetZ(value) {\n        if (this._offsetZ != value) {\n            this._offsetZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxGlyphTop() {\n        return this._maxGlyphTop;\n    }\n    set maxGlyphTop(value) {\n        if (this._maxGlyphTop != value) {\n            this._maxGlyphTop = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxGlyphHeight() {\n        return this._maxGlyphHeight;\n    }\n    set maxGlyphHeight(value) {\n        if (this._maxGlyphHeight != value) {\n            this._maxGlyphHeight = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core, options){\n        this._core = core;\n        this._offset = (0, $31054a6c69637582$exports).create();\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._vec4 = (0, $4c4ac78b213a9c07$exports).create();\n        this._mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._indexCount = 0;\n        this._maxGlyphs = options.maxGlyphs;\n        this._textMetric = {\n            width: 0,\n            maxHeight: 0,\n            maxTop: 0\n        };\n        this.scale = options.scale ? options.scale : 1;\n        this.offsetX = options.offsetX ? options.offsetX : 0;\n        this.offsetY = options.offsetY ? options.offsetY : 0;\n        this.offsetZ = options.offsetZ ? options.offsetZ : 0;\n        this.reverseX = options.reverseX;\n        this.reverseY = options.reverseY;\n        this.reverseZ = options.reverseZ;\n        this.rotation = options.rotation;\n        this.maxGlyphTop = options.maxGlyphTop;\n        this.horizontalAlignment = options.horizontalAlignment === undefined ? (0, $4a6417d29706362f$export$d94dcb5bec64086e).center : options.horizontalAlignment;\n        this.verticalAlignment = options.verticalAlignment === undefined ? (0, $4a6417d29706362f$export$c12e835f91722ef8).center : options.verticalAlignment;\n        this._material = options.material;\n        this.borderWidth = core.config.textBorderWidth;\n        this.gamma = 0;\n        this._materialType = options.materialType || 0;\n        this._materialColor = options.materialColor || core.config.textColor;\n        this._materialFuzz = options.materialFuzz || 0;\n        this._materialGloss = options.materialGloss || 0;\n        this._segmentColor = options.segmentColor;\n    }\n    initialize() {\n        this._vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES * this._maxGlyphs * 4);\n        this._verticesView = new DataView(this._vertices);\n        this._indices = new Uint32Array(this._maxGlyphs * 6);\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {}\n}\nclass $715a174735ed4fbb$export$b04be29aa201d4f5 extends $715a174735ed4fbb$export$31008ffe97c96a49 {\n    get textAlignment() {\n        return this._textAlignment;\n    }\n    set textAlignment(value) {\n        if (this._textAlignment != value) {\n            this._textAlignment = value;\n            this._hasChanged = true;\n        }\n    }\n    get text() {\n        return this._text;\n    }\n    set text(value) {\n        if (this._text != value) {\n            this._text = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core, options){\n        super(core, options);\n        this._font = options.font || core.font;\n        this._text = options.text;\n        this._textAlignment = options.textAlignment === undefined ? (0, $4a6417d29706362f$export$84b2d1b68830363f).left : options.textAlignment;\n    }\n    update(elapsedTime) {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            if (!this._text) {\n                this._indexCount = 0;\n                this.width = 0;\n                this.height = 0;\n            } else {\n                const widths = [];\n                const truncated = [];\n                let maxWidth = 0;\n                let maxGlyphHeight = 0;\n                let maxGlyphTop = 0;\n                let glyphs = 0;\n                for(let i = 0; i < this._text.length; i++){\n                    const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(this._text[i], this._maxGlyphs - glyphs);\n                    (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n                    widths.push(this._textMetric.width);\n                    maxWidth = Math.max(this._textMetric.width, maxWidth);\n                    maxGlyphHeight = Math.max(this._textMetric.maxHeight, maxGlyphHeight);\n                    maxGlyphTop = Math.max(this._textMetric.maxTop, maxGlyphTop);\n                    glyphs += text.length;\n                    truncated.push(text);\n                    if (glyphs >= this._maxGlyphs) break;\n                }\n                if (this._maxGlyphHeight) maxGlyphHeight = this._maxGlyphHeight;\n                if (this._maxGlyphTop) maxGlyphTop = this._maxGlyphTop;\n                const lineHeight = this._font.size;\n                const height = truncated.length * lineHeight;\n                switch(this._horizontalAlignment){\n                    case (0, $4a6417d29706362f$export$d94dcb5bec64086e).left:\n                        this._originX = this._offsetX + maxWidth / 2;\n                        break;\n                    case (0, $4a6417d29706362f$export$d94dcb5bec64086e).center:\n                        this._originX = this._offsetX;\n                        break;\n                    case (0, $4a6417d29706362f$export$d94dcb5bec64086e).right:\n                        this._originX = this._offsetX - maxWidth / 2;\n                        break;\n                }\n                switch(this._verticalAlignment){\n                    case (0, $4a6417d29706362f$export$c12e835f91722ef8).top:\n                        this._originY = this._offsetY - height / 2;\n                        break;\n                    case (0, $4a6417d29706362f$export$c12e835f91722ef8).center:\n                        this._originY = this._offsetY;\n                        break;\n                    case (0, $4a6417d29706362f$export$c12e835f91722ef8).bottom:\n                        this._originY = this._offsetY + height / 2;\n                        break;\n                }\n                glyphs = 0;\n                for(let i = 0; i < truncated.length; i++){\n                    switch(this._textAlignment){\n                        case (0, $4a6417d29706362f$export$84b2d1b68830363f).left:\n                            this._offset[0] = this._originX - maxWidth / 2;\n                            break;\n                        case (0, $4a6417d29706362f$export$84b2d1b68830363f).center:\n                            this._offset[0] = this._originX - widths[i] / 2;\n                            break;\n                        case (0, $4a6417d29706362f$export$84b2d1b68830363f).right:\n                            this._offset[0] = this._originX + maxWidth / 2 - widths[i];\n                            break;\n                    }\n                    this._offset[1] = this._originY + height / 2 - i * lineHeight - lineHeight / 2 - maxGlyphTop / 2;\n                    const pickingId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n                    (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickingId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).label, this._vec4);\n                    const text = truncated[i];\n                    if (text.length > 0) {\n                        (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._verticesView, this._indices, glyphs, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_ZERO, 1, this._offset, null, this._vec4);\n                        glyphs += text.length;\n                    }\n                }\n                const scaling = this._scale / this._font.size;\n                this.width = maxWidth * scaling;\n                this.height = height * scaling;\n                this._indexCount = glyphs * 6;\n                (0, $31054a6c69637582$exports).set(this._vec3, scaling, scaling, scaling);\n                (0, $1ac1b59392edf35b$exports).fromScaling(this._mMatrix, this._vec3);\n                if (this.hasChangedCallback) this.hasChangedCallback();\n            }\n        }\n    }\n}\nclass $715a174735ed4fbb$export$f51a22c5863d0d80 extends $715a174735ed4fbb$export$31008ffe97c96a49 {\n    get materials() {\n        return this._materials;\n    }\n    get materialTypes() {\n        return this._materialTypes;\n    }\n    get materialColors() {\n        return this._materialColors;\n    }\n    get materialFuzzes() {\n        return this._materialFuzzes;\n    }\n    get materialGlosses() {\n        return this._materialGlosses;\n    }\n    get segmentColors() {\n        return this._segmentColors;\n    }\n    get minBoundsX() {\n        return this._minBoundsX;\n    }\n    set minBoundsX(value) {\n        if (this._minBoundsX != value) {\n            this._minBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsY() {\n        return this._minBoundsY;\n    }\n    set minBoundsY(value) {\n        if (this._minBoundsY != value) {\n            this._minBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsZ() {\n        return this._minBoundsZ;\n    }\n    set minBoundsZ(value) {\n        if (this._minBoundsZ != value) {\n            this._minBoundsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsX() {\n        return this._maxBoundsX;\n    }\n    set maxBoundsX(value) {\n        if (this._maxBoundsX != value) {\n            this._maxBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsY() {\n        return this._maxBoundsY;\n    }\n    set maxBoundsY(value) {\n        if (this._maxBoundsY != value) {\n            this._maxBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsZ() {\n        return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value) {\n        if (this._maxBoundsZ != value) {\n            this._maxBoundsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get positionsX() {\n        return this._positionsX;\n    }\n    set positionsX(value) {\n        if (this._positionsX != value) {\n            this._positionsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get positionsY() {\n        return this._positionsY;\n    }\n    set positionsY(value) {\n        if (this._positionsY != value) {\n            this._positionsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get positionsZ() {\n        return this._positionsZ;\n    }\n    set positionsZ(value) {\n        if (this._positionsZ != value) {\n            this._positionsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get positionScalingX() {\n        return this._positionScalingX;\n    }\n    set positionScalingX(value) {\n        if (this._positionScalingX != value) {\n            this._positionScalingX = value;\n            this._hasChanged = true;\n        }\n    }\n    get positionScalingY() {\n        return this._positionScalingY;\n    }\n    set positionScalingY(value) {\n        if (this._positionScalingY != value) {\n            this._positionScalingY = value;\n            this._hasChanged = true;\n        }\n    }\n    get positionScalingZ() {\n        return this._positionScalingZ;\n    }\n    set positionScalingZ(value) {\n        if (this._positionScalingZ != value) {\n            this._positionScalingZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get rotations() {\n        return this._rotations;\n    }\n    set rotations(value) {\n        if (this._rotations != value) {\n            this._rotations = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetsX() {\n        return this._offsetsX;\n    }\n    set offsetsX(value) {\n        if (this._offsetsX != value) {\n            this._offsetsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetsY() {\n        return this._offsetsY;\n    }\n    set offsetsY(value) {\n        if (this._offsetsY != value) {\n            this._offsetsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetsZ() {\n        return this._offsetsZ;\n    }\n    set offsetsZ(value) {\n        if (this._offsetsZ != value) {\n            this._offsetsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetScalingX() {\n        return this._offsetScalingX;\n    }\n    set offsetScalingX(value) {\n        if (this._offsetScalingX != value) {\n            this._offsetScalingX = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetScalingY() {\n        return this._offsetScalingY;\n    }\n    set offsetScalingY(value) {\n        if (this._offsetScalingY != value) {\n            this._offsetScalingY = value;\n            this._hasChanged = true;\n        }\n    }\n    get offsetScalingZ() {\n        return this._offsetScalingZ;\n    }\n    set offsetScalingZ(value) {\n        if (this._offsetScalingZ != value) {\n            this._offsetScalingZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get text() {\n        return this._text;\n    }\n    set text(value) {\n        if (this._text != value) {\n            this._text = value;\n            this._hasChanged = true;\n        }\n    }\n    get horizontalAlignments() {\n        return this._horizontalAlignments;\n    }\n    set horizontalAlignments(value) {\n        if (this._horizontalAlignments != value) {\n            this._horizontalAlignments = value;\n            this._hasChanged = true;\n        }\n    }\n    get verticalAlignments() {\n        return this._verticalAlignments;\n    }\n    set verticalAlignments(value) {\n        if (this._verticalAlignments != value) {\n            this._verticalAlignments = value;\n            this._hasChanged = true;\n        }\n    }\n    get scales() {\n        return this._scales;\n    }\n    set scales(value) {\n        if (this._scales != value) {\n            this._scales = value;\n            this._hasChanged = true;\n        }\n    }\n    get scalesScaling() {\n        return this._scalesScaling;\n    }\n    set scalesScaling(value) {\n        if (this._scalesScaling != value) {\n            this._scalesScaling = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core, options){\n        super(core, options);\n        this._quat = (0, $39ece26d1239bb77$exports).create();\n        this._materials = options.materials;\n        this._materialType = options.materialType;\n        this._materialColor = options.materialColors ? null : options.materialColor || core.config.textColor;\n        this._materialColors = options.materialColors;\n        this.minBoundsX = options.minBoundsX ? options.minBoundsX : 0;\n        this.minBoundsY = options.minBoundsY ? options.minBoundsY : 0;\n        this.minBoundsZ = options.minBoundsZ ? options.minBoundsZ : 0;\n        this.maxBoundsX = options.maxBoundsX ? options.maxBoundsX : 1;\n        this.maxBoundsY = options.maxBoundsY ? options.maxBoundsY : 1;\n        this.maxBoundsZ = options.maxBoundsZ ? options.maxBoundsZ : 1;\n        this._font = options.font || core.font;\n        this.text = options.text;\n        this.positionsX = options.positionsX;\n        this.positionsY = options.positionsY;\n        this.positionsZ = options.positionsZ;\n        this.positionScalingX = options.positionScalingX ? options.positionScalingX : 1;\n        this.positionScalingY = options.positionScalingY ? options.positionScalingY : 1;\n        this.positionScalingZ = options.positionScalingZ ? options.positionScalingZ : 1;\n        this.rotations = options.rotations;\n        this.offsetsX = options.offsetsX;\n        this.offsetsY = options.offsetsY;\n        this.offsetsZ = options.offsetsZ;\n        this.offsetScalingX = options.offsetScalingX ? options.offsetScalingX : 1;\n        this.offsetScalingY = options.offsetScalingY ? options.offsetScalingY : 1;\n        this.offsetScalingZ = options.offsetScalingZ ? options.offsetScalingZ : 1;\n        if (options.horizontalAlignments) this.horizontalAlignments = options.horizontalAlignments;\n        if (options.verticalAlignments) this.verticalAlignments = options.verticalAlignments;\n        if (options.scales) this.scales = options.scales;\n        this.scalesScaling = options.scalesScaling ? options.scalesScaling : 1;\n    }\n    update(elapsedTime) {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            this.pickIdLookup = {};\n            if (!this._text) this._indexCount = 0;\n            else {\n                const start = window.performance.now();\n                const modelSizeX = this._maxBoundsX - this._minBoundsX;\n                const modelSizeY = this._maxBoundsY - this._minBoundsY;\n                const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n                const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n                const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n                const modelOriginX = (this._minBoundsX + this._maxBoundsX) / 2;\n                const modelOriginY = (this._minBoundsY + this._maxBoundsY) / 2;\n                const modelOriginZ = (this._minBoundsZ + this._maxBoundsZ) / 2;\n                if (this._rotation) (0, $39ece26d1239bb77$exports).set(this._quat, this._rotation[0], this._rotation[1], this._rotation[2], this._rotation[3]);\n                let glyphs = 0;\n                for(let i = 0; i < this._text.length; i++){\n                    const offsetX = (this._offsetsX ? this._offsetsX[i] / 2 : this._offsetX) * boundsScaling * this._offsetScalingX;\n                    const offsetY = (this._offsetsY ? this._offsetsY[i] / 2 : this._offsetY) * boundsScaling * this._offsetScalingY;\n                    const offsetZ = (this._offsetsZ ? this._offsetsZ[i] / 2 : this._offsetZ) * boundsScaling * this._offsetScalingZ;\n                    const text = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(this._text[i], this._maxGlyphs - glyphs);\n                    const scale = (this._scales ? this._scales[i] * this._scalesScaling : this._scale) * boundsScaling / this._font.size;\n                    (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const lineHeight = this._font.size * scale;\n                    const maxGlyphTop = (this._maxGlyphTop ? this._maxGlyphTop : this._textMetric.maxTop) * scale;\n                    const horizontalAlignment = this._horizontalAlignments ? this._horizontalAlignments[i] : this._horizontalAlignment;\n                    switch(horizontalAlignment){\n                        case (0, $4a6417d29706362f$export$d94dcb5bec64086e).left:\n                            this._offset[0] = offsetX;\n                            break;\n                        case (0, $4a6417d29706362f$export$d94dcb5bec64086e).center:\n                            this._offset[0] = offsetX - width / 2;\n                            break;\n                        case (0, $4a6417d29706362f$export$d94dcb5bec64086e).right:\n                            this._offset[0] = offsetX - width;\n                            break;\n                    }\n                    const verticalAlignment = this._verticalAlignments ? this._verticalAlignments[i] : this._verticalAlignment;\n                    switch(verticalAlignment){\n                        case (0, $4a6417d29706362f$export$c12e835f91722ef8).top:\n                            this._offset[1] = offsetY - lineHeight / 2;\n                            break;\n                        case (0, $4a6417d29706362f$export$c12e835f91722ef8).center:\n                            this._offset[1] = offsetY;\n                            break;\n                        case (0, $4a6417d29706362f$export$c12e835f91722ef8).bottom:\n                            this._offset[1] = offsetY + lineHeight / 2;\n                            break;\n                    }\n                    this._offset[1] -= maxGlyphTop / 2;\n                    this._offset[2] = offsetZ;\n                    let positionX = this.positionsX ? this.positionsX[i] * this.positionScalingX : 0;\n                    let positionY = this.positionsY ? this.positionsY[i] * this.positionScalingY : 0;\n                    let positionZ = this.positionsZ ? this.positionsZ[i] * this.positionScalingZ : 0;\n                    if (this._reverseX) positionX = this.minBoundsX + this.maxBoundsX - positionX;\n                    if (this._reverseY) positionY = this.minBoundsY + this.maxBoundsY - positionY;\n                    if (this._reverseZ) positionZ = this.minBoundsZ + this.maxBoundsZ - positionZ;\n                    (0, $31054a6c69637582$exports).set(this._vec3, (positionX - modelOriginX) * boundsScaling, (positionY - modelOriginY) * boundsScaling, (positionZ - modelOriginZ) * boundsScaling);\n                    if (this._rotations) (0, $39ece26d1239bb77$exports).set(this._quat, this._rotations[i * 4], this._rotations[i * 4 + 1], this._rotations[i * 4 + 2], this._rotations[i * 4 + 3]);\n                    const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n                    (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).label, this._vec4);\n                    this.pickIdLookup[pickId] = i;\n                    (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).addString(this._font, text, this._verticesView, this._indices, glyphs, this._vec3, scale, this._offset, this._rotation || this._rotations ? this._quat : null, this._vec4);\n                    glyphs += text.length;\n                    if (glyphs >= this._maxGlyphs) {\n                        glyphs = this._maxGlyphs;\n                        break;\n                    }\n                }\n                this._indexCount = glyphs * 6;\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `label set updated ${Math.round(window.performance.now() - start)}ms`);\n                if (this.hasChangedCallback) this.hasChangedCallback();\n            }\n        }\n    }\n}\nclass $715a174735ed4fbb$export$8e28e4b5a55f0bba {\n    constructor(core){\n        this._core = core;\n        this._vec2 = (0, $91b0cc4981465964$exports).create();\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._vec4 = (0, $4c4ac78b213a9c07$exports).create();\n        this._quat = (0, $39ece26d1239bb77$exports).create();\n        this._textMetric = {\n            width: 0,\n            maxHeight: 0,\n            maxTop: 0\n        };\n        this._topLeft = (0, $31054a6c69637582$exports).create();\n        this._topRight = (0, $31054a6c69637582$exports).create();\n        this._bottomLeft = (0, $31054a6c69637582$exports).create();\n        this._bottomRight = (0, $31054a6c69637582$exports).create();\n        this._offset = (0, $31054a6c69637582$exports).create();\n    }\n    update(buffer, labelIds, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? options.text.length : options.count;\n        const dataView = buffer.dataView;\n        const minBoundsX = options.minBoundsX ? options.minBoundsX : 0;\n        const minBoundsY = options.minBoundsY ? options.minBoundsY : 0;\n        const minBoundsZ = options.minBoundsZ ? options.minBoundsZ : 0;\n        const maxBoundsX = options.maxBoundsX ? options.maxBoundsX : 1;\n        const maxBoundsY = options.maxBoundsY ? options.maxBoundsY : 1;\n        const maxBoundsZ = options.maxBoundsZ ? options.maxBoundsZ : 1;\n        const positionScalingX = options.positionScalingX ? options.positionScalingX : 1;\n        const positionScalingY = options.positionScalingY ? options.positionScalingY : 1;\n        const positionScalingZ = options.positionScalingZ ? options.positionScalingZ : 1;\n        const offsetX = options.offsetX ? options.offsetX : 0;\n        const offsetY = options.offsetY ? options.offsetY : 0;\n        const offsetZ = options.offsetZ ? options.offsetZ : 0;\n        const offsetScalingX = options.offsetScalingX ? options.offsetScalingX : 1;\n        const offsetScalingY = options.offsetScalingY ? options.offsetScalingY : 1;\n        const offsetScalingZ = options.offsetScalingZ ? options.offsetScalingZ : 1;\n        const horizontalAlignment = options.horizontalAlignment === undefined ? (0, $4a6417d29706362f$export$d94dcb5bec64086e).center : options.horizontalAlignment;\n        const verticalAlignment = options.verticalAlignment === undefined ? (0, $4a6417d29706362f$export$c12e835f91722ef8).center : options.verticalAlignment;\n        const scale = options.scale ? options.scale : 1;\n        const scalesScaling = options.scalesScaling ? options.scalesScaling : 1;\n        const font = options.font || this._core.font;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const modelSizeX = maxBoundsX - minBoundsX;\n        const modelSizeY = maxBoundsY - minBoundsY;\n        const modelSizeZ = maxBoundsZ - minBoundsZ;\n        const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n        const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n        const modelOriginX = (minBoundsX + maxBoundsX) / 2;\n        const modelOriginY = (minBoundsY + maxBoundsY) / 2;\n        const modelOriginZ = (minBoundsZ + maxBoundsZ) / 2;\n        if (options.rotation) {\n            this._quat[0] = options.rotation[0];\n            this._quat[1] = options.rotation[1];\n            this._quat[2] = options.rotation[2];\n            this._quat[3] = options.rotation[3];\n        } else (0, $39ece26d1239bb77$exports).rotationTo(this._quat, this._core.config.identityRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY);\n        this.pickIdLookup = {};\n        for(let i = 0; i < count; i++){\n            const labelIndex = labelIds[i + offset];\n            const _offsetX = (options.offsetsX ? options.offsetsX[labelIndex] / 2 : offsetX) * boundsScaling * offsetScalingX;\n            const _offsetY = (options.offsetsY ? options.offsetsY[labelIndex] / 2 : offsetY) * boundsScaling * offsetScalingY;\n            const _offsetZ = (options.offsetsZ ? options.offsetsZ[labelIndex] / 2 : offsetZ) * boundsScaling * offsetScalingZ;\n            const label = options.text[labelIndex];\n            const _scale = (options.scales ? options.scales[labelIndex] * scalesScaling : scale) * boundsScaling / font.size;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(font, label, this._textMetric);\n            const width = this._textMetric.width * _scale;\n            const lineHeight = font.size * _scale;\n            const _maxGlyphTop = (options.maxGlyphTop ? options.maxGlyphTop : this._textMetric.maxTop) * _scale;\n            const _horizontalAlignment = options.horizontalAlignments ? options.horizontalAlignments[labelIndex] : horizontalAlignment;\n            switch(_horizontalAlignment){\n                case (0, $4a6417d29706362f$export$d94dcb5bec64086e).left:\n                    this._offset[0] = _offsetX;\n                    break;\n                case (0, $4a6417d29706362f$export$d94dcb5bec64086e).center:\n                    this._offset[0] = _offsetX - width / 2;\n                    break;\n                case (0, $4a6417d29706362f$export$d94dcb5bec64086e).right:\n                    this._offset[0] = _offsetX - width;\n                    break;\n            }\n            const _verticalAlignment = options.verticalAlignments ? options.verticalAlignments[labelIndex] : verticalAlignment;\n            switch(_verticalAlignment){\n                case (0, $4a6417d29706362f$export$c12e835f91722ef8).top:\n                    this._offset[1] = _offsetY - lineHeight / 2;\n                    break;\n                case (0, $4a6417d29706362f$export$c12e835f91722ef8).center:\n                    this._offset[1] = _offsetY;\n                    break;\n                case (0, $4a6417d29706362f$export$c12e835f91722ef8).bottom:\n                    this._offset[1] = _offsetY + lineHeight / 2;\n                    break;\n            }\n            this._offset[1] -= _maxGlyphTop / 2;\n            this._offset[2] = _offsetZ;\n            let positionX = options.positionsX ? options.positionsX[labelIndex] * positionScalingX : 0;\n            let positionY = options.positionsY ? options.positionsY[labelIndex] * positionScalingY : 0;\n            let positionZ = options.positionsZ ? options.positionsZ[labelIndex] * positionScalingZ : 0;\n            if (options.reverseX) positionX = minBoundsX + maxBoundsX - positionX;\n            if (options.reverseY) positionY = minBoundsY + maxBoundsY - positionY;\n            if (options.reverseZ) positionZ = minBoundsZ + maxBoundsZ - positionZ;\n            positionX = (positionX - modelOriginX) * boundsScaling;\n            positionY = (positionY - modelOriginY) * boundsScaling;\n            positionZ = (positionZ - modelOriginZ) * boundsScaling;\n            if (options.rotations) (0, $39ece26d1239bb77$exports).set(this._quat, options.rotations[labelIndex * 4], options.rotations[labelIndex * 4 + 1], options.rotations[labelIndex * 4 + 2], options.rotations[labelIndex * 4 + 3]);\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).label, this._vec4);\n            this.pickIdLookup[pickId] = labelIndex;\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[labelIndex], minOrder, maxOrder, 0, 1);\n                this._vec2[0] = orderReverse ? 1 - order : order;\n            } else this._vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) this._vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[labelIndex], minStaggerOrder, maxStaggerOrder, 0, 1);\n                this._vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else this._vec2[1] = count == 1 ? 0 : i / (count - 1);\n            let glyphIndex = options.glyphOffsets[labelIndex];\n            for (const char of label){\n                let glyph = font.glyphs[char];\n                if (!glyph) {\n                    font.addGlyph(char);\n                    glyph = font.glyphs[char];\n                }\n                const width = glyph.width * _scale;\n                const height = glyph.height * _scale;\n                const top = glyph.top * _scale;\n                const border = font.border * _scale;\n                const x0 = this._offset[0] - border;\n                const x1 = this._offset[0] + width + border;\n                const y0 = this._offset[1] + top + border;\n                const y1 = this._offset[1] + top - height - border;\n                const z0 = this._offset[2];\n                (0, $31054a6c69637582$exports).set(this._topLeft, x0, y0, z0);\n                (0, $31054a6c69637582$exports).set(this._topRight, x1, y0, z0);\n                (0, $31054a6c69637582$exports).set(this._bottomLeft, x0, y1, z0);\n                (0, $31054a6c69637582$exports).set(this._bottomRight, x1, y1, z0);\n                if (options.rotation || options.rotations) {\n                    (0, $31054a6c69637582$exports).transformQuat(this._topLeft, this._topLeft, this._quat);\n                    (0, $31054a6c69637582$exports).transformQuat(this._topRight, this._topRight, this._quat);\n                    (0, $31054a6c69637582$exports).transformQuat(this._bottomLeft, this._bottomLeft, this._quat);\n                    (0, $31054a6c69637582$exports).transformQuat(this._bottomRight, this._bottomRight, this._quat);\n                }\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, glyphIndex, this._quat);\n                this._vec3[0] = positionX + (this._topLeft[0] + this._bottomRight[0]) / 2;\n                this._vec3[1] = positionY + (this._topLeft[1] + this._bottomRight[1]) / 2;\n                this._vec3[2] = positionZ + (this._topLeft[2] + this._bottomRight[2]) / 2;\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, glyphIndex, this._vec3);\n                this._vec3[0] = Math.abs(x1 - x0);\n                this._vec3[1] = Math.abs(y1 - y0);\n                this._vec3[2] = 0.001;\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, glyphIndex, this._vec3);\n                this._vec4[0] = glyph.u0;\n                this._vec4[1] = glyph.v0;\n                this._vec4[2] = glyph.u1;\n                this._vec4[3] = glyph.v1;\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTexCoord(dataView, glyphIndex, this._vec4);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, glyphIndex, options.hover ? options.hover[labelIndex] : labelIndex);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, glyphIndex, this._vec2);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, glyphIndex, options.material ? options.material : options.materials ? options.materials[labelIndex] : 0);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTexture(dataView, glyphIndex, 1);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, glyphIndex, this._core.config.sdfBuffer);\n                this._offset[0] += glyph.advance * _scale;\n                glyphIndex++;\n            }\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $01ead9aa9a4bc88a$export$805e8b72413ccaba {\n    constructor(core){}\n    positions(slices, stacks, transform) {\n        const vertices = new Float32Array((slices + 1) * (stacks + 1) * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE);\n        const position = (0, $31054a6c69637582$exports).create();\n        let index = 0;\n        for(let stack = 0; stack <= stacks; stack++){\n            const latitude = 90 - 180 * stack / stacks;\n            for(let slice = 0; slice <= slices; slice++){\n                const longitude = 360 * slice / slices - 180;\n                (0, $a49c65c28e06311e$export$210d3b2db589eb5c).sphericalToCartesian(1, longitude, latitude, position);\n                (0, $31054a6c69637582$exports).transformMat4(position, position, transform);\n                (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).setPosition(vertices, index++, position);\n            }\n        }\n        return vertices;\n    }\n    indices(slices, stacks) {\n        const indices = new Uint16Array(slices * stacks * 6);\n        let index = 0;\n        for(let stack = 0; stack < stacks; stack++){\n            const top = stack * (slices + 1);\n            const bottom = (stack + 1) * (slices + 1);\n            for(let slice = 0; slice < slices; slice++){\n                if (stack != 0) {\n                    indices[index++] = top + slice;\n                    indices[index++] = bottom + slice;\n                    indices[index++] = top + slice + 1;\n                }\n                if (stack != stacks - 1) {\n                    indices[index++] = top + slice + 1;\n                    indices[index++] = bottom + slice;\n                    indices[index++] = bottom + slice + 1;\n                }\n            }\n        }\n        return indices;\n    }\n    textured(slices, stacks, transform, texTransform = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY) {\n        const positions = this.positions(slices, stacks, transform);\n        const texCoords = this._texCoords(slices, stacks, texTransform);\n        const vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$538532535e0e8594).SIZE_BYTES * positions.length / 3);\n        const verticesView = new DataView(vertices);\n        const position = (0, $31054a6c69637582$exports).create();\n        const texCoord = (0, $91b0cc4981465964$exports).create();\n        for(let i = 0; i < positions.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE; i++){\n            (0, $31054a6c69637582$exports).set(position, positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 1], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 2]);\n            (0, $91b0cc4981465964$exports).set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n            (0, $0a0587bd8b0d58e8$export$538532535e0e8594).setPosition(verticesView, i, position);\n            (0, $0a0587bd8b0d58e8$export$538532535e0e8594).setTexCoord(verticesView, i, texCoord);\n        }\n        return verticesView;\n    }\n    normalTextured(slices, stacks, transform, texTransform = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY) {\n        const positions = this.positions(slices, stacks, transform);\n        const texCoords = this._texCoords(slices, stacks, texTransform);\n        const vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES * positions.length / 3);\n        const verticesView = new DataView(vertices);\n        const position = (0, $31054a6c69637582$exports).create();\n        const texCoord = (0, $91b0cc4981465964$exports).create();\n        const normal = (0, $31054a6c69637582$exports).create();\n        for(let i = 0; i < positions.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE; i++){\n            (0, $31054a6c69637582$exports).set(position, positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 1], positions[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 2]);\n            (0, $91b0cc4981465964$exports).set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setPosition(verticesView, i, position);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setTexCoord(verticesView, i, texCoord);\n            (0, $31054a6c69637582$exports).set(normal, position[0] - transform[12], position[1] - transform[13], position[2] - transform[14]);\n            (0, $31054a6c69637582$exports).normalize(normal, normal);\n            (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).setNormal(verticesView, i, normal);\n        }\n        return verticesView;\n    }\n    _texCoords(slices, stacks, transform) {\n        const texCoords = new Float32Array((slices + 1) * (stacks + 1) * 2);\n        const texCoord = (0, $91b0cc4981465964$exports).create();\n        let index = 0;\n        for(let stack = 0; stack <= stacks; stack++)for(let slice = 0; slice <= slices; slice++){\n            (0, $91b0cc4981465964$exports).set(texCoord, slice / slices, stack / stacks);\n            (0, $91b0cc4981465964$exports).transformMat4(texCoord, texCoord, transform);\n            texCoords[index++] = texCoord[0];\n            texCoords[index++] = texCoord[1];\n        }\n        return texCoords;\n    }\n}\n\n\n\nclass $f7de7bdc7bccbb25$export$6f251cd327b2ff1 {\n    render(elapsedTime, xrFrame) {}\n    update(elapsedTime) {}\n    constructor(image){\n        this.image = image;\n    }\n}\nclass $f7de7bdc7bccbb25$export$a3758d3f9ac64232 {\n    get material() {\n        return this._material;\n    }\n    get vertices() {\n        return this._vertices;\n    }\n    get indices() {\n        return this._indices;\n    }\n    get indexCount() {\n        return this._indexCount;\n    }\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get mMatrix() {\n        return this._mMatrix;\n    }\n    get imageData() {\n        return this._imageData;\n    }\n    set imageData(value) {\n        if (this._imageData != value) {\n            this._imageData = value;\n            this._hasChanged = true;\n        }\n    }\n    get rotation() {\n        return this._rotation;\n    }\n    set rotation(value) {\n        if (!(0, $39ece26d1239bb77$exports).equals(this._rotation, value)) {\n            (0, $39ece26d1239bb77$exports).copy(this._rotation, value);\n            this._hasChanged = true;\n        }\n    }\n    get position() {\n        return this._position;\n    }\n    set position(value) {\n        if (!(0, $31054a6c69637582$exports).equals(this._position, value)) {\n            (0, $31054a6c69637582$exports).copy(this._position, value);\n            this._hasChanged = true;\n        }\n    }\n    get texCoord0() {\n        return this._texCoord0;\n    }\n    set texCoord0(value) {\n        if (!(0, $91b0cc4981465964$exports).equals(this._texCoord0, value)) {\n            (0, $91b0cc4981465964$exports).copy(this._texCoord0, value);\n            this._hasChanged = true;\n        }\n    }\n    get texCoord1() {\n        return this._texCoord1;\n    }\n    set texCoord1(value) {\n        if (!(0, $91b0cc4981465964$exports).equals(this._texCoord1, value)) {\n            (0, $91b0cc4981465964$exports).copy(this._texCoord1, value);\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsX() {\n        return this._minBoundsX;\n    }\n    set minBoundsX(value) {\n        if (this._minBoundsX != value) {\n            this._minBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsY() {\n        return this._minBoundsY;\n    }\n    set minBoundsY(value) {\n        if (this._minBoundsY != value) {\n            this._minBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsZ() {\n        return this._minBoundsZ;\n    }\n    set minBoundsZ(value) {\n        if (this._minBoundsZ != value) {\n            this._minBoundsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsX() {\n        return this._maxBoundsX;\n    }\n    set maxBoundsX(value) {\n        if (this._maxBoundsX != value) {\n            this._maxBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsY() {\n        return this._maxBoundsY;\n    }\n    set maxBoundsY(value) {\n        if (this._maxBoundsY != value) {\n            this._maxBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsZ() {\n        return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value) {\n        if (this._maxBoundsZ != value) {\n            this._maxBoundsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core, options){\n        this._core = core;\n        this._mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._origin = (0, $31054a6c69637582$exports).create();\n        this._translation = (0, $31054a6c69637582$exports).create();\n        this._scale = (0, $31054a6c69637582$exports).create();\n        this._transform = (0, $1ac1b59392edf35b$exports).create();\n        this._imageData = options.imageData;\n        this._minBoundsX = options.minBoundsX === undefined ? 0 : options.minBoundsX;\n        this._minBoundsY = options.minBoundsY === undefined ? 0 : options.minBoundsY;\n        this._minBoundsZ = options.minBoundsZ === undefined ? 0 : options.minBoundsZ;\n        this._maxBoundsX = options.maxBoundsX === undefined ? 1 : options.maxBoundsX;\n        this._maxBoundsY = options.maxBoundsY === undefined ? 1 : options.maxBoundsY;\n        this._maxBoundsZ = options.maxBoundsZ === undefined ? 1 : options.maxBoundsZ;\n        this._position = options.position ? (0, $31054a6c69637582$exports).clone(options.position) : (0, $31054a6c69637582$exports).create();\n        this._rotation = options.rotation ? (0, $39ece26d1239bb77$exports).clone(options.rotation) : (0, $39ece26d1239bb77$exports).create();\n        this._texCoord0 = options.texCoord0 ? (0, $91b0cc4981465964$exports).clone(options.texCoord0) : (0, $91b0cc4981465964$exports).fromValues(0, 0);\n        this._texCoord1 = options.texCoord1 ? (0, $91b0cc4981465964$exports).clone(options.texCoord1) : (0, $91b0cc4981465964$exports).fromValues(1, 1);\n        this._material = options.material === undefined ? -1 : options.material;\n        this._hasChanged = true;\n    }\n}\nclass $f7de7bdc7bccbb25$export$3f0bd71f9b37d8ee extends $f7de7bdc7bccbb25$export$a3758d3f9ac64232 {\n    get width() {\n        return this._width;\n    }\n    set width(value) {\n        if (this._width != value) {\n            this._width = value;\n            this._hasChanged = true;\n        }\n    }\n    get height() {\n        return this._height;\n    }\n    set height(value) {\n        if (this._height != value) {\n            this._height = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core, options){\n        super(core, options);\n        this._width = options.width === undefined ? 1 : options.width;\n        this._height = options.height === undefined ? 1 : options.height;\n        this._texTransform = (0, $1ac1b59392edf35b$exports).create();\n        (0, $1ac1b59392edf35b$exports).translate(this._texTransform, this._texTransform, (0, $31054a6c69637582$exports).fromValues(0, 1, 0));\n        (0, $1ac1b59392edf35b$exports).scale(this._texTransform, this._texTransform, (0, $31054a6c69637582$exports).fromValues(1, -1, 1));\n    }\n    initialize() {\n        this._vertices = new ArrayBuffer((0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES * 4);\n        this._indices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).INDICES;\n        this._indexCount = this._indices.length;\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            const modelSizeX = this._maxBoundsX - this._minBoundsX;\n            const modelSizeY = this._maxBoundsY - this._minBoundsY;\n            const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n            const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n            const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n            (0, $31054a6c69637582$exports).set(this._origin, (this._minBoundsX + this._maxBoundsX) / 2, (this._minBoundsY + this._maxBoundsY) / 2, (this._minBoundsZ + this._maxBoundsZ) / 2);\n            (0, $31054a6c69637582$exports).subtract(this._translation, this._position, this._origin);\n            (0, $31054a6c69637582$exports).scale(this._translation, this._translation, boundsScaling);\n            (0, $31054a6c69637582$exports).set(this._scale, this._width, this._height, 1);\n            (0, $31054a6c69637582$exports).scale(this._scale, this._scale, boundsScaling);\n            (0, $1ac1b59392edf35b$exports).fromRotationTranslationScale(this._transform, this._rotation, this._translation, this._scale);\n            this._verticesView = (0, $3ce6ee188e300946$export$7005c9eb6671414d).normalTextured(this._transform, this._texTransform);\n            this._vertices = this._verticesView.buffer;\n            if (this.hasChangedCallback) this.hasChangedCallback();\n        }\n    }\n}\nclass $f7de7bdc7bccbb25$export$f4ca272a8ace4457 extends $f7de7bdc7bccbb25$export$a3758d3f9ac64232 {\n    get radius() {\n        return this._radius;\n    }\n    set radius(value) {\n        if (this._radius != value) {\n            this._radius = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core, options){\n        super(core, options);\n        this._radius = options.radius === undefined ? 0.5 : options.radius;\n        this._slices = options.slices === undefined ? 72 : options.slices;\n        this._stacks = options.stacks === undefined ? 36 : options.stacks;\n    }\n    initialize() {\n        this._sphere = new (0, $01ead9aa9a4bc88a$export$805e8b72413ccaba)(this._core);\n        this._vertices = this._sphere.normalTextured(this._slices, this._stacks, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY).buffer;\n        this._indices = this._sphere.indices(this._slices, this._stacks);\n        this._indexCount = this._indices.length;\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            const modelSizeX = this._maxBoundsX - this._minBoundsX;\n            const modelSizeY = this._maxBoundsY - this._minBoundsY;\n            const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n            const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n            const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n            (0, $31054a6c69637582$exports).set(this._origin, (this._minBoundsX + this._maxBoundsX) / 2, (this._minBoundsY + this._maxBoundsY) / 2, (this._minBoundsZ + this._maxBoundsZ) / 2);\n            (0, $31054a6c69637582$exports).set(this._scale, this._radius, this._radius, this._radius);\n            (0, $31054a6c69637582$exports).scale(this._scale, this._scale, boundsScaling);\n            (0, $1ac1b59392edf35b$exports).fromRotationTranslationScaleOrigin(this._transform, this._rotation, this._position, this._scale, this._origin);\n            this._verticesView = this._sphere.normalTextured(this._slices, this._stacks, this._transform);\n            this._vertices = this._verticesView.buffer;\n            if (this.hasChangedCallback) this.hasChangedCallback();\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $9614560ff899e49d$export$93b17801046b2267 {\n    static rotateBounds(minBounds, maxBounds, rotation, rotatedMinBounds, rotatedMaxBounds, offset) {\n        const sizeX = maxBounds[0] - minBounds[0];\n        const sizeY = maxBounds[1] - minBounds[1];\n        const sizeZ = maxBounds[2] - minBounds[2];\n        const min = rotatedMinBounds;\n        const max = rotatedMaxBounds;\n        (0, $31054a6c69637582$exports).set(min, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n        (0, $31054a6c69637582$exports).set(max, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n        const vertices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).POSITIONS;\n        const position = (0, $31054a6c69637582$exports).create();\n        for(let i = 0; i < 8; i++){\n            (0, $31054a6c69637582$exports).set(position, vertices[i * 3] * sizeX, vertices[i * 3 + 1] * sizeY, vertices[i * 3 + 2] * sizeZ);\n            (0, $31054a6c69637582$exports).add(position, position, offset);\n            (0, $31054a6c69637582$exports).transformQuat(position, position, rotation);\n            (0, $31054a6c69637582$exports).subtract(position, position, offset);\n            (0, $31054a6c69637582$exports).min(min, min, position);\n            (0, $31054a6c69637582$exports).max(max, max, position);\n        }\n        (0, $31054a6c69637582$exports).add(position, minBounds, maxBounds);\n        (0, $31054a6c69637582$exports).scale(position, position, 0.5);\n        (0, $31054a6c69637582$exports).add(min, min, position);\n        (0, $31054a6c69637582$exports).add(max, max, position);\n    }\n    static cylinder(pa, pb, radius, minBounds, maxBounds) {\n        const a = (0, $31054a6c69637582$exports).create();\n        (0, $31054a6c69637582$exports).subtract(a, pb, pa);\n        const aa = (0, $31054a6c69637582$exports).dot(a, a);\n        const ex = radius * Math.sqrt(1 - a[0] * a[0] / aa);\n        const ey = radius * Math.sqrt(1 - a[1] * a[1] / aa);\n        const ez = radius * Math.sqrt(1 - a[2] * a[2] / aa);\n        minBounds[0] = Math.min(pa[0] - ex, pb[0] - ex);\n        minBounds[1] = Math.min(pa[1] - ey, pb[1] - ey);\n        minBounds[2] = Math.min(pa[2] - ez, pb[2] - ez);\n        maxBounds[0] = Math.max(pa[0] + ex, pb[0] + ex);\n        maxBounds[1] = Math.max(pa[1] + ey, pb[1] + ey);\n        maxBounds[2] = Math.max(pa[2] + ez, pb[2] + ez);\n    }\n}\n\n\n\n\nclass $9f62a2679ad52b29$export$f4f11265faddf354 {\n    get facetScaling() {\n        return this._facetScaling;\n    }\n    offsetX(facetCoordX) {\n        return ((facetCoordX + 0.5) / this._facetsX - 0.5) * (this.maxModelBoundsX - this.minModelBoundsX) / this._maxBounds;\n    }\n    offsetY(facetCoordY) {\n        return ((facetCoordY + 0.5) / this._facetsY - 0.5) * (this.maxModelBoundsY - this.minModelBoundsY) / this._maxBounds;\n    }\n    offsetZ(facetCoordZ) {\n        return ((facetCoordZ + 0.5) / this._facetsZ - 0.5) * (this.maxModelBoundsZ - this.minModelBoundsZ) / this._maxBounds;\n    }\n    constructor(core){\n        this._core = core;\n        this.modelOriginX = 0;\n        this.modelOriginY = 0;\n        this.modelOriginZ = 0;\n        this.minModelBoundsX = 0;\n        this.minModelBoundsY = 0;\n        this.minModelBoundsZ = 0;\n        this.maxModelBoundsX = 0;\n        this.maxModelBoundsY = 0;\n        this.maxModelBoundsZ = 0;\n        this.minLayoutBoundsX = 0;\n        this.minLayoutBoundsY = 0;\n        this.minLayoutBoundsZ = 0;\n        this.maxLayoutBoundsX = 0;\n        this.maxLayoutBoundsY = 0;\n        this.maxLayoutBoundsZ = 0;\n        this._facetSpacingX = 0;\n        this._facetSpacingY = 0;\n        this._facetSpacingZ = 0;\n        this._facetSizeX = 0;\n        this._facetSizeY = 0;\n        this._facetSizeZ = 0;\n        this._facetsX = 1;\n        this._facetsY = 1;\n        this._facetsZ = 1;\n    }\n    _updateModelBounds(options) {\n        this.minModelBoundsX = options.minBoundsX === undefined ? this.minLayoutBoundsX : options.minBoundsX;\n        this.minModelBoundsY = options.minBoundsY === undefined ? this.minLayoutBoundsY : options.minBoundsY;\n        this.minModelBoundsZ = options.minBoundsZ === undefined ? this.minLayoutBoundsZ : options.minBoundsZ;\n        this.maxModelBoundsX = options.maxBoundsX === undefined ? this.maxLayoutBoundsX : options.maxBoundsX;\n        this.maxModelBoundsY = options.maxBoundsY === undefined ? this.maxLayoutBoundsY : options.maxBoundsY;\n        this.maxModelBoundsZ = options.maxBoundsZ === undefined ? this.maxLayoutBoundsZ : options.maxBoundsZ;\n        this._isFacetted = options.facetsX !== undefined && options.facetsX > 1 && options.facetCoordsX != null || options.facetsY !== undefined && options.facetsY > 1 && options.facetCoordsY != null || options.facetsZ !== undefined && options.facetsZ > 1 && options.facetCoordsZ != null;\n        this._facetSpacingX = options.facetSpacingX === undefined ? 0 : options.facetSpacingX;\n        this._facetSpacingY = options.facetSpacingY === undefined ? 0 : options.facetSpacingY;\n        this._facetSpacingZ = options.facetSpacingZ === undefined ? 0 : options.facetSpacingZ;\n        let modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n        let modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n        let modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n        const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n        this._facetSizeX = modelSizeX;\n        this._facetSizeY = modelSizeY;\n        this._facetSizeZ = modelSizeZ;\n        this._facetsX = options.facetCoordsX ? options.facetsX : 1;\n        this._facetsY = options.facetCoordsY ? options.facetsY : 1;\n        this._facetsZ = options.facetCoordsZ ? options.facetsZ : 1;\n        this.minModelBoundsX -= this._facetSizeX * this._facetSpacingX / 2;\n        this.minModelBoundsY -= this._facetSizeY * this._facetSpacingY / 2;\n        this.minModelBoundsZ -= this._facetSizeZ * this._facetSpacingZ / 2;\n        this.maxModelBoundsX = this.minModelBoundsX + this._facetsX * this._facetSizeX * (1 + this._facetSpacingX);\n        this.maxModelBoundsY = this.minModelBoundsY + this._facetsY * this._facetSizeY * (1 + this._facetSpacingY);\n        this.maxModelBoundsZ = this.minModelBoundsZ + this._facetsZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        this.modelOriginX = (this.minModelBoundsX + this.maxModelBoundsX) / 2;\n        this.modelOriginY = (this.minModelBoundsY + this.maxModelBoundsY) / 2;\n        this.modelOriginZ = (this.minModelBoundsZ + this.maxModelBoundsZ) / 2;\n        modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n        modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n        modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n        this._maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n        this._boundsScaling = this._maxBounds == 0 ? 1 : 1 / this._maxBounds;\n        this._facetScaling = maxBounds / this._maxBounds;\n    }\n    resetCumulativeLayoutBounds() {\n        this.minCumulativeLayoutBoundsX = undefined;\n        this.minCumulativeLayoutBoundsY = undefined;\n        this.minCumulativeLayoutBoundsZ = undefined;\n        this.maxCumulativeLayoutBoundsX = undefined;\n        this.maxCumulativeLayoutBoundsY = undefined;\n        this.maxCumulativeLayoutBoundsZ = undefined;\n    }\n    _updateCumulativeLayoutBounds() {\n        this.minCumulativeLayoutBoundsX = this.minCumulativeLayoutBoundsX === undefined ? this.minLayoutBoundsX : Math.min(this.minCumulativeLayoutBoundsX, this.minLayoutBoundsX);\n        this.minCumulativeLayoutBoundsY = this.minCumulativeLayoutBoundsY === undefined ? this.minLayoutBoundsY : Math.min(this.minCumulativeLayoutBoundsY, this.minLayoutBoundsY);\n        this.minCumulativeLayoutBoundsZ = this.minCumulativeLayoutBoundsZ === undefined ? this.minLayoutBoundsZ : Math.min(this.minCumulativeLayoutBoundsZ, this.minLayoutBoundsZ);\n        this.maxCumulativeLayoutBoundsX = this.maxCumulativeLayoutBoundsX === undefined ? this.maxLayoutBoundsX : Math.max(this.maxCumulativeLayoutBoundsX, this.maxLayoutBoundsX);\n        this.maxCumulativeLayoutBoundsY = this.maxCumulativeLayoutBoundsY === undefined ? this.maxLayoutBoundsY : Math.max(this.maxCumulativeLayoutBoundsY, this.maxLayoutBoundsY);\n        this.maxCumulativeLayoutBoundsZ = this.maxCumulativeLayoutBoundsZ === undefined ? this.maxLayoutBoundsZ : Math.max(this.maxCumulativeLayoutBoundsZ, this.maxLayoutBoundsZ);\n    }\n    unitToModelSize(unitSize) {\n        return unitSize / this._boundsScaling;\n    }\n    unitToModelPositionX(unitPositionX) {\n        return this.unitToModelSize(unitPositionX) + this.modelOriginX;\n    }\n    unitToModelPositionY(unitPositionY) {\n        return this.unitToModelSize(unitPositionY) + this.modelOriginY;\n    }\n    unitToModelPositionZ(unitPositionZ) {\n        return this.unitToModelSize(unitPositionZ) + this.modelOriginZ;\n    }\n    unitToModelPosition(unitPosition, modelPosition) {\n        modelPosition[0] = this.unitToModelPositionX(unitPosition[0]);\n        modelPosition[1] = this.unitToModelPositionY(unitPosition[1]);\n        modelPosition[2] = this.unitToModelPositionZ(unitPosition[2]);\n    }\n    modelToUnitSize(modelSize) {\n        return modelSize * this._boundsScaling;\n    }\n    modelToUnitPositionX(modelPositionX) {\n        return (modelPositionX - this.modelOriginX) * this._boundsScaling;\n    }\n    modelToUnitPositionY(modelPositionY) {\n        return (modelPositionY - this.modelOriginY) * this._boundsScaling;\n    }\n    modelToUnitPositionZ(modelPositionZ) {\n        return (modelPositionZ - this.modelOriginZ) * this._boundsScaling;\n    }\n    modelToUnitPosition(modelPosition, unitPosition) {\n        unitPosition[0] = this.modelToUnitPositionX(modelPosition[0]);\n        unitPosition[1] = this.modelToUnitPositionY(modelPosition[1]);\n        unitPosition[2] = this.modelToUnitPositionZ(modelPosition[2]);\n    }\n    inclusiveUnitBounds(buffer, ids, unitType, offset, count, minBounds, maxBounds) {\n        (0, $31054a6c69637582$exports).set(minBounds, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n        (0, $31054a6c69637582$exports).set(maxBounds, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n        const unitScale = (0, $31054a6c69637582$exports).create();\n        const unitRotation = (0, $39ece26d1239bb77$exports).create();\n        const unitTranslation = (0, $31054a6c69637582$exports).create();\n        const lookup = buffer.lookup;\n        const dataView = buffer.dataView;\n        let minBounds0;\n        let maxBounds0;\n        let minBounds1;\n        let maxBounds1;\n        switch(unitType){\n            case (0, $4a6417d29706362f$export$80d48287646c9e3b).sphere:\n            case (0, $4a6417d29706362f$export$80d48287646c9e3b).sphereSdf:\n                for(let i = 0; i < count; i++){\n                    const id = ids[i + offset];\n                    const index = lookup[id];\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTranslation(dataView, index, unitTranslation);\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getScale(dataView, index, unitScale);\n                    const radius = unitScale[0] / 2;\n                    minBounds[0] = Math.min(minBounds[0], unitTranslation[0] - radius);\n                    minBounds[1] = Math.min(minBounds[1], unitTranslation[1] - radius);\n                    minBounds[2] = Math.min(minBounds[2], unitTranslation[2] - radius);\n                    maxBounds[0] = Math.max(maxBounds[0], unitTranslation[0] + radius);\n                    maxBounds[1] = Math.max(maxBounds[1], unitTranslation[1] + radius);\n                    maxBounds[2] = Math.max(maxBounds[2], unitTranslation[2] + radius);\n                }\n                break;\n            case (0, $4a6417d29706362f$export$80d48287646c9e3b).hexPrism:\n            case (0, $4a6417d29706362f$export$80d48287646c9e3b).hexPrismSdf:\n            case (0, $4a6417d29706362f$export$80d48287646c9e3b).block:\n            case (0, $4a6417d29706362f$export$80d48287646c9e3b).blockSdf:\n                minBounds0 = (0, $31054a6c69637582$exports).create();\n                maxBounds0 = (0, $31054a6c69637582$exports).create();\n                minBounds1 = (0, $31054a6c69637582$exports).create();\n                maxBounds1 = (0, $31054a6c69637582$exports).create();\n                for(let i = 0; i < count; i++){\n                    const id = ids[i + offset];\n                    const index = lookup[id];\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTranslation(dataView, index, unitTranslation);\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getRotation(dataView, index, unitRotation);\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getScale(dataView, index, unitScale);\n                    minBounds0[0] = unitTranslation[0] - unitScale[0] / 2;\n                    minBounds0[1] = unitTranslation[1] - unitScale[1] / 2;\n                    minBounds0[2] = unitTranslation[2] - unitScale[2] / 2;\n                    maxBounds0[0] = unitTranslation[0] + unitScale[0] / 2;\n                    maxBounds0[1] = unitTranslation[1] + unitScale[1] / 2;\n                    maxBounds0[2] = unitTranslation[2] + unitScale[2] / 2;\n                    (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(minBounds0, maxBounds0, unitRotation, minBounds1, maxBounds1, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_ZERO);\n                    (0, $31054a6c69637582$exports).min(minBounds, minBounds, minBounds1);\n                    (0, $31054a6c69637582$exports).max(maxBounds, maxBounds, maxBounds1);\n                }\n                break;\n            case (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinder:\n            case (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinderSdf:\n                minBounds0 = (0, $31054a6c69637582$exports).create();\n                maxBounds0 = (0, $31054a6c69637582$exports).create();\n                const pa = (0, $31054a6c69637582$exports).create();\n                const pb = (0, $31054a6c69637582$exports).create();\n                const identityRotation = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY;\n                let ca;\n                for(let i = 0; i < count; i++){\n                    const id = ids[i + offset];\n                    const index = lookup[id];\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTranslation(dataView, index, unitTranslation);\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getRotation(dataView, index, unitRotation);\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getScale(dataView, index, unitScale);\n                    const length = unitScale[1];\n                    const radius = Math.max(unitScale[0], unitScale[2]);\n                    if (length != 0 && radius != 0) {\n                        if ((0, $39ece26d1239bb77$exports).equals(unitRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY)) ca = identityRotation;\n                        else {\n                            ca = (0, $31054a6c69637582$exports).create();\n                            (0, $31054a6c69637582$exports).transformQuat(ca, identityRotation, unitRotation);\n                        }\n                        (0, $31054a6c69637582$exports).scaleAndAdd(pa, unitTranslation, ca, -length * 0.5);\n                        (0, $31054a6c69637582$exports).scaleAndAdd(pb, unitTranslation, ca, length * 0.5);\n                        (0, $9614560ff899e49d$export$93b17801046b2267).cylinder(pa, pb, radius, minBounds0, maxBounds0);\n                        (0, $31054a6c69637582$exports).min(minBounds, minBounds, minBounds0);\n                        (0, $31054a6c69637582$exports).max(maxBounds, maxBounds, maxBounds0);\n                    }\n                }\n                break;\n        }\n    }\n}\n\n\nclass $5c05d7e02492b136$export$1c460fb4285edadc extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const positionScalingX = options.positionScalingX === undefined ? 1 : options.positionScalingX;\n        const positionScalingY = options.positionScalingY === undefined ? 1 : options.positionScalingY;\n        const positionScalingZ = options.positionScalingZ === undefined ? 1 : options.positionScalingZ;\n        if (!this._positions || this._positions.length < buffer.length * 3) this._positions = new Float32Array(buffer.length * 3);\n        this.minLayoutBoundsX = Number.MAX_VALUE;\n        this.minLayoutBoundsY = Number.MAX_VALUE;\n        this.minLayoutBoundsZ = Number.MAX_VALUE;\n        this.maxLayoutBoundsX = -Number.MAX_VALUE;\n        this.maxLayoutBoundsY = -Number.MAX_VALUE;\n        this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n        const lookup = buffer.lookup;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            let positionX = options.positionsX ? options.positionsX[id] * positionScalingX : 0;\n            let positionY = options.positionsY ? options.positionsY[id] * positionScalingY : 0;\n            let positionZ = options.positionsZ ? options.positionsZ[id] * positionScalingZ : 0;\n            this._positions[index * 3] = positionX;\n            this._positions[index * 3 + 1] = positionY;\n            this._positions[index * 3 + 2] = positionZ;\n            this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, positionX);\n            this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, positionY);\n            this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, positionZ);\n            this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, positionX);\n            this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, positionY);\n            this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, positionZ);\n        }\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _vec4 = (0, $4c4ac78b213a9c07$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const sizeScalingX = options.sizeScaling === undefined ? options.sizeScalingX === undefined ? 1 : options.sizeScalingX : options.sizeScaling;\n        const sizeScalingY = options.sizeScaling === undefined ? options.sizeScalingY === undefined ? 1 : options.sizeScalingY : options.sizeScaling;\n        const sizeScalingZ = options.sizeScaling === undefined ? options.sizeScalingZ === undefined ? 1 : options.sizeScalingZ : options.sizeScaling;\n        const sizesX = options.sizes ? options.sizes : options.sizesX;\n        const sizesY = options.sizes ? options.sizes : options.sizesY;\n        const sizesZ = options.sizes ? options.sizes : options.sizesZ;\n        const minSize = options.minSize === undefined ? 0 : options.minSize;\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        if (options.rotation) {\n            _quat[0] = options.rotation[0];\n            _quat[1] = options.rotation[1];\n            _quat[2] = options.rotation[2];\n            _quat[3] = options.rotation[3];\n        } else (0, $39ece26d1239bb77$exports).rotationTo(_quat, this._core.config.identityRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY);\n        if (options.texCoord) {\n            _vec4[0] = options.texCoord[0];\n            _vec4[1] = options.texCoord[1];\n            _vec4[2] = options.texCoord[2];\n            _vec4[3] = options.texCoord[3];\n        }\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            let positionX = this._positions[index * 3];\n            let positionY = this._positions[index * 3 + 1];\n            let positionZ = this._positions[index * 3 + 2];\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            _vec3[0] = Math.max((sizesX ? Math.abs(sizesX[id]) : 1) * sizeScalingX, minSize) * this._boundsScaling;\n            _vec3[1] = Math.max((sizesY ? Math.abs(sizesY[id]) : 1) * sizeScalingY, minSize) * this._boundsScaling;\n            _vec3[2] = Math.max((sizesZ ? Math.abs(sizesZ[id]) : 1) * sizeScalingZ, minSize) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, _vec3);\n            if (options.rotations) {\n                _quat[0] = options.rotations[id * 4];\n                _quat[1] = options.rotations[id * 4 + 1];\n                _quat[2] = options.rotations[id * 4 + 2];\n                _quat[3] = options.rotations[id * 4 + 3];\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                if (options.colors1) {\n                    const color1 = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors1[id], minColor, maxColor, size / 2, 1 - size / 2);\n                    (0, $91b0cc4981465964$exports).set(_vec2, color, color1);\n                } else (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setParameter1(dataView, index, options.parameter1 ? options.parameter1 : options.parameters1 ? options.parameters1[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setParameter2(dataView, index, options.parameter2 ? options.parameter2 : options.parameters2 ? options.parameters2[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n            if (options.texCoords) {\n                _vec4[0] = options.texCoords[id * 4];\n                _vec4[1] = options.texCoords[id * 4 + 1];\n                _vec4[2] = options.texCoords[id * 4 + 2];\n                _vec4[3] = options.texCoords[id * 4 + 3];\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTexCoord(dataView, index, _vec4);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTexCoord(dataView, index, _vec4);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [\n                options.materialColors[id * 3],\n                options.materialColors[id * 3 + 1],\n                options.materialColors[id * 3 + 2]\n            ] : [\n                0,\n                0,\n                0\n            ]);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [\n                options.segmentColors[id * 4],\n                options.segmentColors[id * 4 + 1],\n                options.segmentColors[id * 4 + 2],\n                options.segmentColors[id * 4 + 3]\n            ] : [\n                buffer.idColors[id * 4],\n                buffer.idColors[id * 4 + 1],\n                buffer.idColors[id * 4 + 2],\n                buffer.idColors[id * 4 + 3]\n            ]);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\n\n\n\n\nclass $4cef0568024a2460$export$84b019c42ae137d9 {\n    render(elapsedTime, xrFrame) {}\n    update(elapsedTime) {}\n    constructor(key){\n        this.key = key;\n    }\n}\nclass $4cef0568024a2460$export$b8efc38afdd4a742 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get minBoundsX() {\n        return this._minBoundsX;\n    }\n    set minBoundsX(value) {\n        if (value != this.minBoundsX) {\n            this._minBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsX() {\n        return this._maxBoundsX;\n    }\n    set maxBoundsX(value) {\n        if (value != this.minBoundsX) {\n            this._maxBoundsX = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsY() {\n        return this._minBoundsY;\n    }\n    set minBoundsY(value) {\n        if (value != this.minBoundsY) {\n            this._minBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsY() {\n        return this._maxBoundsY;\n    }\n    set maxBoundsY(value) {\n        if (value != this.minBoundsY) {\n            this._maxBoundsY = value;\n            this._hasChanged = true;\n        }\n    }\n    get minBoundsZ() {\n        return this._minBoundsZ;\n    }\n    set minBoundsZ(value) {\n        if (value != this.minBoundsZ) {\n            this._minBoundsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get maxBoundsZ() {\n        return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value) {\n        if (value != this.minBoundsZ) {\n            this._maxBoundsZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get unitType() {\n        return this._unitType;\n    }\n    set unitType(value) {\n        if (this._unitType != value) {\n            this._unitType = value;\n            this._hasChanged = true;\n        }\n    }\n    get palette() {\n        return this._palette;\n    }\n    set palette(value) {\n        if (this._palette != value) {\n            this._palette = value;\n            this._hasChanged = true;\n        }\n    }\n    get materials() {\n        return this._materials;\n    }\n    set materials(value) {\n        if (this._materials != value) {\n            this._materials = value;\n            this._hasChanged = true;\n        }\n    }\n    get sizesX() {\n        return this._sizesX;\n    }\n    set sizesX(value) {\n        if (this._sizesX != value) {\n            this._sizesX = value;\n            this._hasChanged = true;\n        }\n    }\n    get sizesY() {\n        return this._sizesY;\n    }\n    set sizesY(value) {\n        if (this._sizesY != value) {\n            this._sizesY = value;\n            this._hasChanged = true;\n        }\n    }\n    get sizesZ() {\n        return this._sizesZ;\n    }\n    set sizesZ(value) {\n        if (this._sizesZ != value) {\n            this._sizesZ = value;\n            this._hasChanged = true;\n        }\n    }\n    get spacing() {\n        return this._spacing;\n    }\n    set spacing(value) {\n        if (this._spacing != value) {\n            this._spacing = value;\n            this._hasChanged = true;\n        }\n    }\n    get textVertices() {\n        return this._textVertices;\n    }\n    get textIndices() {\n        return this._textIndices;\n    }\n    get labelMMatrix() {\n        return this._labelMMatrix;\n    }\n    set labelPositions(value) {\n        if (this._labelPositions != value) {\n            this._labelPositions = value;\n            this._hasChanged = true;\n        }\n    }\n    set labels(value) {\n        if (this._labels != value) {\n            this._labels = value;\n            this._hasChanged = true;\n        }\n    }\n    set labelSize(value) {\n        if (this._labelSize != value) {\n            this._labelSize = value;\n            this._hasChanged = true;\n        }\n    }\n    get labelOrientation() {\n        return this._orientation;\n    }\n    set labelOrientation(value) {\n        if (this._orientation != value) {\n            this._orientation = value;\n            this._hasChanged = true;\n        }\n    }\n    get titleIndexCount() {\n        return this._titleIndexCount;\n    }\n    get titleIndexOffset() {\n        return this._titleIndexOffset;\n    }\n    get titleMMatrix() {\n        return this._titleMMatrix;\n    }\n    set title(value) {\n        if (this._title != value) {\n            this._title = value;\n            this._hasChanged = true;\n        }\n    }\n    set titleSize(value) {\n        if (this._titleSize != value) {\n            this._titleSize = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core, options){\n        this._core = core;\n        this._textMetric = {\n            width: 0,\n            maxHeight: 0,\n            maxTop: 0\n        };\n    }\n    initialize() {\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this.isInitialized) {\n            if (this._hasChanged) {\n                const start = window.performance.now();\n                this._hasChanged = false;\n                (0, $31054a6c69637582$exports).set(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, this._maxBoundsZ - this._minBoundsZ);\n                const maxBounds = Math.max(Math.max(this._size[0], this._size[1]), this._size[2]);\n                (0, $31054a6c69637582$exports).scale(this._size, this._size, 1 / maxBounds);\n                this._update(this._size);\n                if (this.hasChangedCallback) this.hasChangedCallback();\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `key updated ${Math.round(window.performance.now() - start)}ms`);\n            }\n        }\n    }\n    _update(size) {}\n}\nclass $4cef0568024a2460$export$1f02ce5a460c3bdd extends $4cef0568024a2460$export$b8efc38afdd4a742 {\n    constructor(core, options){\n        super(core, options);\n        const minBoundsX = options.minBoundsX === undefined ? 0 : options.minBoundsX;\n        const minBoundsY = options.minBoundsY === undefined ? 0 : options.minBoundsY;\n        const minBoundsZ = options.minBoundsZ === undefined ? 0 : options.minBoundsZ;\n        const maxBoundsX = options.maxBoundsX === undefined ? 0 : options.maxBoundsX;\n        const maxBoundsY = options.maxBoundsY === undefined ? 0 : options.maxBoundsY;\n        const maxBoundsZ = options.maxBoundsZ === undefined ? 0 : options.maxBoundsZ;\n        const positionX = options.positionX === undefined ? 0 : options.positionX;\n        const positionY = options.positionY === undefined ? 0 : options.positionY;\n        const positionZ = options.positionZ === undefined ? 0 : options.positionZ;\n        const sizeX = options.sizeX === undefined ? 1 : options.sizeX;\n        const sizeY = options.sizeY === undefined ? 1 : options.sizeY;\n        const sizeZ = options.sizeZ === undefined ? 1 : options.sizeZ;\n        const spacing = options.spacing === undefined ? 1 : options.spacing;\n        const labelScale = options.labelScale === undefined ? 1 : options.labelScale;\n        const labelMaxGlyphs = options.labelMaxGlyphs === undefined ? this._core.config.keyLabelMaxGlyphs : options.labelMaxGlyphs;\n        const titleScale = options.titleScale === undefined ? 1 : options.titleScale;\n        const titleMaxGlyphs = options.titleMaxGlyphs === undefined ? this._core.config.keyTitleMaxGlyphs : options.titleMaxGlyphs;\n        const font = options.font ? options.font : this._core.font;\n        const horizontalAlignment = options.horizontalAlignment === undefined ? (0, $4a6417d29706362f$export$d94dcb5bec64086e).center : options.horizontalAlignment;\n        const verticalAlignment = options.verticalAlignment === undefined ? (0, $4a6417d29706362f$export$c12e835f91722ef8).center : options.verticalAlignment;\n        const orientation = options.orientation === undefined ? (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal : options.orientation;\n        const labelPosition = options.labelPosition === undefined ? (0, $4a6417d29706362f$export$1c6bed1dcbac1312).right : options.labelPosition;\n        const labelOrientation = options.labelOrientation === undefined ? (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal : options.labelOrientation;\n        const rotation = (0, $39ece26d1239bb77$exports).create();\n        let count = options.values.length;\n        const ids = new Uint32Array(count);\n        let minValue = Number.MAX_VALUE;\n        let maxValue = -Number.MAX_VALUE;\n        for(let i = 0; i < count; i++){\n            ids[i] = i;\n            const value = options.values[i];\n            minValue = Math.min(minValue, value);\n            maxValue = Math.max(maxValue, value);\n        }\n        const materialIds = new Uint32Array(count);\n        for(let i = 0; i < count; i++)materialIds[i] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.values[i], minValue, maxValue, 0, options.palette.length / 4 - 1);\n        let glyphCount = 0;\n        let totalLabelWidth = 0;\n        let maxLabelWidth = 0;\n        for(let i = 0; i < count; i++){\n            const label = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(options.labels[i], labelMaxGlyphs);\n            glyphCount += label.length;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(font, label, this._textMetric);\n            const width = this._textMetric.width;\n            totalLabelWidth += width;\n            maxLabelWidth = Math.max(width, maxLabelWidth);\n        }\n        let titleWidth = 0;\n        let title;\n        if (options.title) {\n            title = (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).truncate(options.title, titleMaxGlyphs);\n            glyphCount += title.length;\n            (0, $ee14aeb68f9f83d5$export$f080f423ca93034f).measure(font, title, this._textMetric);\n            titleWidth = this._textMetric.width;\n        }\n        let width;\n        let height;\n        switch(orientation){\n            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                switch(labelPosition){\n                    case (0, $4a6417d29706362f$export$1c6bed1dcbac1312).bottom:\n                        switch(labelOrientation){\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                                break;\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                                break;\n                        }\n                        break;\n                    case (0, $4a6417d29706362f$export$1c6bed1dcbac1312).left:\n                        switch(labelOrientation){\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                                break;\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                                break;\n                        }\n                        break;\n                    case (0, $4a6417d29706362f$export$1c6bed1dcbac1312).right:\n                        switch(labelOrientation){\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                                break;\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                                break;\n                        }\n                        break;\n                    case (0, $4a6417d29706362f$export$1c6bed1dcbac1312).top:\n                        switch(labelOrientation){\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                                break;\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                                break;\n                        }\n                        break;\n                }\n                break;\n            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                switch(labelPosition){\n                    case (0, $4a6417d29706362f$export$1c6bed1dcbac1312).bottom:\n                        switch(labelOrientation){\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                                break;\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                                break;\n                        }\n                        break;\n                    case (0, $4a6417d29706362f$export$1c6bed1dcbac1312).left:\n                        switch(labelOrientation){\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                                break;\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                                break;\n                        }\n                        break;\n                    case (0, $4a6417d29706362f$export$1c6bed1dcbac1312).right:\n                        switch(labelOrientation){\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                                break;\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                                break;\n                        }\n                        break;\n                    case (0, $4a6417d29706362f$export$1c6bed1dcbac1312).top:\n                        switch(labelOrientation){\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                                break;\n                            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                                break;\n                        }\n                        break;\n                }\n                break;\n        }\n        switch(orientation){\n            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).horizontal:\n                width = Math.max(sizeX * count + spacing * (count - 1) + totalLabelWidth, titleWidth);\n                height = sizeY;\n                if (options.title) height += titleScale;\n                break;\n            case (0, $4a6417d29706362f$export$df54d73aa0ec5e82).vertical:\n                width = Math.max(sizeX + labelScale / 2 + maxLabelWidth, titleWidth);\n                height = sizeY * count + spacing * (count - 1);\n                if (options.title) height += titleScale;\n                break;\n        }\n        let originX = positionX;\n        let originY = positionY;\n        let originZ = positionZ;\n        switch(horizontalAlignment){\n            case (0, $4a6417d29706362f$export$d94dcb5bec64086e).center:\n                break;\n            case (0, $4a6417d29706362f$export$d94dcb5bec64086e).left:\n                originX += width / 2;\n                break;\n            case (0, $4a6417d29706362f$export$d94dcb5bec64086e).right:\n                originX -= width / 2;\n                break;\n        }\n        switch(verticalAlignment){\n            case (0, $4a6417d29706362f$export$c12e835f91722ef8).bottom:\n                originY += height / 2;\n                break;\n            case (0, $4a6417d29706362f$export$c12e835f91722ef8).center:\n                break;\n            case (0, $4a6417d29706362f$export$c12e835f91722ef8).top:\n                originY -= height / 2;\n                break;\n        }\n        const positionsX = new Float64Array(count);\n        const positionsY = new Float64Array(count);\n        const positionsZ = new Float64Array(count);\n        for(let i = 0; i < count; i++){\n            positionsX[i] = originX - width / 2 + sizeX / 2;\n            positionsY[i] = originY + height / 2 - i * (sizeY + spacing);\n            positionsZ[i] = originZ + sizeZ / 2;\n        }\n        const scatter = new (0, $5c05d7e02492b136$export$1c460fb4285edadc)(this._core);\n        const scatterLayoutOptions = {\n            positionsX: positionsX,\n            positionsY: positionsY,\n            positionsZ: positionsZ\n        };\n        scatter.layout(this._transitionBuffer.currentBuffer, ids, scatterLayoutOptions);\n        const scatterVertexOptions = {\n            minBoundsX: minBoundsX,\n            minBoundsY: minBoundsY,\n            minBoundsZ: minBoundsZ,\n            maxBoundsX: maxBoundsX,\n            maxBoundsY: maxBoundsY,\n            maxBoundsZ: maxBoundsZ,\n            colors: options.values,\n            minColor: minValue,\n            maxColor: maxValue,\n            sizeScalingX: sizeX,\n            sizeScalingY: sizeY,\n            sizeScalingZ: sizeZ,\n            materials: materialIds\n        };\n        scatter.update(this._transitionBuffer.currentBuffer, ids, scatterVertexOptions);\n        const labelSetOptions = {\n            text: options.labels,\n            maxGlyphs: glyphCount,\n            scale: labelScale,\n            font: font\n        };\n        const labelSet = new (0, $715a174735ed4fbb$export$f51a22c5863d0d80)(this._core, labelSetOptions);\n        if (options.title) count++;\n        const labelPositionsX = new Float64Array(count);\n        const labelPositionsY = new Float64Array(count);\n        const labelPositionsZ = new Float64Array(count);\n        for(let i = 0; i < (options.title ? count - 1 : count); i++){\n            labelPositionsX[i] = originX - width / 2 + sizeX + labelScale / 2;\n            labelPositionsY[i] = positionsY[i];\n            labelPositionsZ[i] = originZ;\n        }\n        options.title;\n        labelSet.minBoundsX = minBoundsX;\n        labelSet.minBoundsY = minBoundsY;\n        labelSet.minBoundsZ = minBoundsZ;\n        labelSet.maxBoundsX = maxBoundsX;\n        labelSet.maxBoundsY = maxBoundsY;\n        labelSet.maxBoundsZ = maxBoundsZ;\n        labelSet.positionsX = positionsX;\n        labelSet.positionsY = positionsY;\n        labelSet.positionsZ = positionsZ;\n        labelSet.rotation = new Float64Array([\n            rotation[0],\n            rotation[1],\n            rotation[2],\n            rotation[3]\n        ]);\n        labelSet.horizontalAlignment = (0, $4a6417d29706362f$export$d94dcb5bec64086e).left;\n    }\n}\n\n\n\n\nvar $4559f2a5f6bc9c8c$exports = {};\n\n$parcel$export($4559f2a5f6bc9c8c$exports, \"AxesBase\", () => $2e2b6f93796e9c8a$export$a0569bcde4468e7f);\n$parcel$export($4559f2a5f6bc9c8c$exports, \"Cartesian2dAxes\", () => $28691cf6913948f8$export$e3e79a454e5f8e5a);\n$parcel$export($4559f2a5f6bc9c8c$exports, \"Cartesian2dAxesHelper\", () => $28691cf6913948f8$export$133913079d003c31);\n$parcel$export($4559f2a5f6bc9c8c$exports, \"Cartesian3dAxes\", () => $4cd1e156df302e7a$export$b1b08d445768978);\n$parcel$export($4559f2a5f6bc9c8c$exports, \"Cartesian3dAxesHelper\", () => $4cd1e156df302e7a$export$a623f6a4669f174c);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\nvar $92f02b8a0655b486$exports = {};\n\n$parcel$export($92f02b8a0655b486$exports, \"AngleHelper\", () => $a49c65c28e06311e$export$210d3b2db589eb5c);\n$parcel$export($92f02b8a0655b486$exports, \"AnimationHelper\", () => $cc0e5bcb75088eeb$export$f1c8488f7ae08606);\n$parcel$export($92f02b8a0655b486$exports, \"ArrayHelper\", () => $ee0d365f44abacf8$export$94a9a87466f562a3);\n$parcel$export($92f02b8a0655b486$exports, \"AxisHelper\", () => $92acb7820f38feec$export$46c1eaab6b8d1e23);\n$parcel$export($92f02b8a0655b486$exports, \"Base64Helper\", () => $22e502955a85a3df$export$ea5aaa763e911d0e);\n$parcel$export($92f02b8a0655b486$exports, \"BinHelper\", () => $ce9642dece868acb$export$eecfe2b6190b0ed);\n$parcel$export($92f02b8a0655b486$exports, \"ColorHelper\", () => $c37f3938111fba7e$export$a33ddd5b3ba7b208);\n$parcel$export($92f02b8a0655b486$exports, \"CsvHelper\", () => $27dc24c82c71089a$export$a9e0444473dcb771);\n$parcel$export($92f02b8a0655b486$exports, \"FacetHelper\", () => $c2a459ae4d3b0cbc$export$4b34289fff3e9e9d);\n$parcel$export($92f02b8a0655b486$exports, \"ForceDirectHelper\", () => $1c75d3db8cc60612$export$6844396a695c449);\n$parcel$export($92f02b8a0655b486$exports, \"HexHelper\", () => $24349737166db450$export$db005bf9e0fbda31);\n$parcel$export($92f02b8a0655b486$exports, \"HexBinHelper\", () => $18a78f0c92aa12a4$export$917b5ee4d724090b);\n$parcel$export($92f02b8a0655b486$exports, \"LineHelper\", () => $f981d40aaab0cc8d$export$a94506fb574265ab);\n$parcel$export($92f02b8a0655b486$exports, \"MathHelper\", () => $2d4d1eb6f32f02f2$export$80a8c44b8858d625);\n$parcel$export($92f02b8a0655b486$exports, \"PseudoRandom\", () => $2d4d1eb6f32f02f2$export$b8e288c3467acb0e);\n$parcel$export($92f02b8a0655b486$exports, \"MatrixHelper\", () => $b920b5b69884770f$export$34bcf93e378e8ddd);\n$parcel$export($92f02b8a0655b486$exports, \"MercatorHelper\", () => $9567e168ff06f2c9$export$33e818f0c514945e);\n$parcel$export($92f02b8a0655b486$exports, \"AlbersHelper\", () => $9567e168ff06f2c9$export$4c4ef7713ed8a00d);\n$parcel$export($92f02b8a0655b486$exports, \"GeoJSONHelper\", () => $9567e168ff06f2c9$export$618604db0cd69e78);\n$parcel$export($92f02b8a0655b486$exports, \"OctTreeHelper\", () => $935506ebc69281c4$export$bf3a0f176b3bd0a8);\n$parcel$export($92f02b8a0655b486$exports, \"PaletteHelper\", () => $11b5f927bd29379c$export$2ee509afc4628e4);\n$parcel$export($92f02b8a0655b486$exports, \"PathHelper\", () => $a4596fc55355f0e1$export$433e0478e7f6ca93);\n$parcel$export($92f02b8a0655b486$exports, \"PickHelper\", () => $a60d0d861ccf87e8$export$aadd933e49c67c12);\n$parcel$export($92f02b8a0655b486$exports, \"TableHelper\", () => $38a1943f255fbbec$export$9ac52b025685a4d0);\n$parcel$export($92f02b8a0655b486$exports, \"TextHelper\", () => $ee14aeb68f9f83d5$export$f080f423ca93034f);\n$parcel$export($92f02b8a0655b486$exports, \"TextureHelper\", () => $a25f5529f6cda489$export$c41e4fcbf45db179);\n$parcel$export($92f02b8a0655b486$exports, \"TreeHelper\", () => $f90460e72834bcbf$export$7b64922b0b192bef);\n$parcel$export($92f02b8a0655b486$exports, \"TreeMapHelper\", () => $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75);\n$parcel$export($92f02b8a0655b486$exports, \"SetHelper\", () => $33e5ac524dde1fe2$export$a30f602ccece8e25);\n$parcel$export($92f02b8a0655b486$exports, \"SdfHelper\", () => $22ccc45c3c88d82f$export$98599ead9515fc06);\n$parcel$export($92f02b8a0655b486$exports, \"VectorHelper\", () => $8c233993336ed54a$export$1c9ca61bb2a30bed);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $ee0d365f44abacf8$export$94a9a87466f562a3 {\n    static minIndex(orderedValues, offset, length, value) {\n        let index = $ee0d365f44abacf8$export$94a9a87466f562a3.binarySearch(orderedValues, offset, length, value);\n        if (index < 0) {\n            index = ~index;\n            index = Math.max(0, index);\n        } else while(index > 0 && orderedValues[index - 1] == value)index--;\n        return index;\n    }\n    static maxIndex(orderedValues, offset, length, value) {\n        let index = $ee0d365f44abacf8$export$94a9a87466f562a3.binarySearch(orderedValues, offset, length, value);\n        if (index < 0) index = ~index - 1;\n        else {\n            while(index < length - 1 && orderedValues[index + 1] == value)index++;\n            index = Math.min(length, index);\n        }\n        return index;\n    }\n    static binarySearch(array, index, length, value) {\n        let low = index;\n        let high = index + length - 1;\n        while(low <= high){\n            const mid = low + (high - low >> 1);\n            if (array[mid] == value) return mid;\n            if (array[mid] <= value) low = mid + 1;\n            else high = mid - 1;\n        }\n        return ~low;\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $22e502955a85a3df$export$ea5aaa763e911d0e {\n    uint6ToB64(nUint6) {\n        return nUint6 < 26 ? nUint6 + 65 : nUint6 < 52 ? nUint6 + 71 : nUint6 < 62 ? nUint6 - 4 : nUint6 === 62 ? 43 : nUint6 === 63 ? 47 : 65;\n    }\n    base64EncArr(aBytes) {\n        let nMod3 = 2;\n        let sB64Enc = \"\";\n        let nLen = aBytes.byteLength;\n        let nUint24 = 0;\n        for(let nIdx = 0; nIdx < nLen; nIdx++){\n            nMod3 = nIdx % 3;\n            if (nIdx > 0 && nIdx * 4 / 3 % 76 === 0) sB64Enc += \"\\r\\n\";\n            nUint24 |= aBytes.getUint8(nIdx) << (16 >>> nMod3 & 24);\n            if (nMod3 === 2 || aBytes.byteLength - nIdx === 1) {\n                sB64Enc += String.fromCharCode(this.uint6ToB64(nUint24 >>> 18 & 63), this.uint6ToB64(nUint24 >>> 12 & 63), this.uint6ToB64(nUint24 >>> 6 & 63), this.uint6ToB64(nUint24 & 63));\n                nUint24 = 0;\n            }\n        }\n        return sB64Enc.substring(0, sB64Enc.length - 2 + nMod3) + (nMod3 === 2 ? \"\" : nMod3 === 1 ? \"=\" : \"==\");\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $ce9642dece868acb$export$eecfe2b6190b0ed {\n    static quantile(options) {\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? options.ids.length : options.count;\n        const itemsPerBin = count / options.bins;\n        let bin = 0;\n        if (options.froms && options.tos) {\n            const firstId = options.ids[offset];\n            options.froms[0] = options.values[firstId];\n        }\n        for(let i = 0; i < count; i++){\n            const id = options.ids[i + offset];\n            if (i > Math.floor(itemsPerBin * (bin + 1))) {\n                bin++;\n                if (options.froms && options.tos) {\n                    options.tos[bin - 1] = options.values[id];\n                    const nextId = options.ids[i + offset + 1];\n                    options.froms[bin] = options.values[nextId];\n                }\n            }\n            options.binIds[id] = bin;\n        }\n        if (options.froms && options.tos) {\n            const lastId = options.ids[count - 1 + offset];\n            options.tos[options.bins - 1] = options.values[lastId];\n        }\n        return Math.floor(itemsPerBin);\n    }\n    static bin(options) {\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? options.ids.length : options.count;\n        const counts = options.counts ? options.counts : new Float64Array(options.bins);\n        let minValue = options.minValue;\n        let maxValue = options.maxValue;\n        if (options.isDiscrete || maxValue == minValue) {\n            minValue -= 0.5;\n            maxValue += 0.5;\n        }\n        const binSize = (maxValue - minValue) / options.bins;\n        let maxCount = 0;\n        for(let i = 0; i < count; i++){\n            const id = options.ids[i + offset];\n            const value = options.values[id];\n            const binId = Math.max(Math.min(Math.floor((value - minValue) / binSize), options.bins - 1), 0);\n            options.binIds[id] = binId;\n            counts[binId]++;\n            maxCount = Math.max(counts[binId], maxCount);\n        }\n        if (options.froms && options.tos) {\n            for(let i = 0; i < options.bins; i++)if (options.isDiscrete || maxValue == minValue) {\n                options.froms[i] = Math.ceil(minValue + binSize * i);\n                options.tos[i] = Math.floor(minValue + binSize * (i + 1));\n            } else {\n                options.froms[i] = minValue + binSize * i;\n                options.tos[i] = minValue + binSize * (i + 1);\n            }\n        }\n        return maxCount;\n    }\n    static maxBins(minValue, maxValue, isDiscrete, maxBins) {\n        if (isDiscrete) return Math.min(maxValue - minValue + 1, maxBins);\n        else return maxBins;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $c37f3938111fba7e$export$a33ddd5b3ba7b208 {\n    static luminance(rgb) {\n        return rgb[0] * $c37f3938111fba7e$export$a33ddd5b3ba7b208.LUMINANCE[0] + rgb[1] * $c37f3938111fba7e$export$a33ddd5b3ba7b208.LUMINANCE[1] + rgb[2] * $c37f3938111fba7e$export$a33ddd5b3ba7b208.LUMINANCE[2];\n    }\n    static rgbToHex(r, g, b) {\n        const r2 = `0${Math.round(r * 255).toString(16)}`;\n        const g2 = `0${Math.round(g * 255).toString(16)}`;\n        const b2 = `0${Math.round(b * 255).toString(16)}`;\n        return `#${r2.substring(r2.length - 2)}${g2.substring(g2.length - 2)}${b2.substring(b2.length - 2)}`;\n    }\n    static rgbToHsv(r, g, b, hsv) {\n        let h, s, v, delta;\n        const min = Math.min(Math.min(r, g), b);\n        const max = Math.max(Math.max(r, g), b);\n        delta = max - min;\n        v = max;\n        if (delta == 0) {\n            h = -1;\n            if (max == 0) s = -1;\n            else s = 0;\n            hsv[0] = h;\n            hsv[1] = s;\n            hsv[2] = v;\n        }\n        s = delta / max;\n        if (r == max) h = (g - b) / delta;\n        else if (g == max) h = 2 + (b - r) / delta;\n        else h = 4 + (r - g) / delta;\n        h *= 60;\n        if (h < 0) h += 360;\n        hsv[0] = h;\n        hsv[1] = s;\n        hsv[2] = v;\n    }\n    static hsvToRgb(h, s, v, rgb) {\n        let sextant, r, g, b;\n        if (s == 0) {\n            r = g = b = v;\n            rgb[0] = r;\n            rgb[1] = g;\n            rgb[2] = b;\n        }\n        let frac, p, q, t;\n        h %= 360;\n        h /= 60;\n        sextant = Math.floor(h);\n        frac = h - sextant;\n        p = v * (1 - s);\n        q = v * (1 - s * frac);\n        t = v * (1 - s * (1 - frac));\n        switch(sextant){\n            case 0:\n                r = v;\n                g = t;\n                b = p;\n                break;\n            case 1:\n                r = q;\n                g = v;\n                b = p;\n                break;\n            case 2:\n                r = p;\n                g = v;\n                b = t;\n                break;\n            case 3:\n                r = p;\n                g = q;\n                b = v;\n                break;\n            case 4:\n                r = t;\n                g = p;\n                b = v;\n                break;\n            default:\n                r = v;\n                g = p;\n                b = q;\n                break;\n        }\n        rgb[0] = r;\n        rgb[1] = g;\n        rgb[2] = b;\n    }\n}\n$c37f3938111fba7e$export$a33ddd5b3ba7b208.LUMINANCE = (0, $31054a6c69637582$exports).fromValues(0.2126, 0.7152, 0.0722);\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $27dc24c82c71089a$export$a9e0444473dcb771 {\n    constructor(core){\n        this.QUOTE = '\"';\n        this.DELIMETER = ',';\n        this.LINE_BREAKS = [\n            '\\n',\n            '\\r'\n        ];\n        this._core = core;\n    }\n    readline(text, row) {\n        return this.read(text, row, 1)[0];\n    }\n    read(text, firstRow = 0, maxRows = Number.MAX_VALUE) {\n        const start = window.performance.now();\n        const rows = [];\n        let rowBuffer = [];\n        let row = 0;\n        let columnBuffer = \"\";\n        let quoted = false;\n        for(let i = 0; i < text.length; i++){\n            const char = text.charAt(i);\n            if (char == this.QUOTE) {\n                if (text.charAt(i + 1) == this.QUOTE) {\n                    i++;\n                    columnBuffer += this.QUOTE;\n                } else quoted = !quoted;\n            } else if (quoted) columnBuffer += char;\n            else {\n                if (char == this.DELIMETER) {\n                    rowBuffer.push(columnBuffer);\n                    columnBuffer = \"\";\n                } else if (this.LINE_BREAKS.indexOf(char) > -1) {\n                    rowBuffer.push(columnBuffer);\n                    columnBuffer = \"\";\n                    while(this.LINE_BREAKS.indexOf(text.charAt(i + 1)) > -1)i++;\n                    if (row++ >= firstRow) rows.push(rowBuffer);\n                    rowBuffer = [];\n                    if (rows.length == maxRows) break;\n                } else columnBuffer += char;\n            }\n        }\n        if (columnBuffer != \"\") rowBuffer.push(columnBuffer);\n        if (rowBuffer.length > 0) rows.push(rowBuffer);\n        if (maxRows > 1) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `csv ${rows.length} rows ${Math.round(window.performance.now() - start)}ms`);\n        return rows;\n    }\n    writeLine(data) {\n        let text = \"\";\n        for(let i = 0; i < data.length; i++){\n            let column = data[i];\n            if (column) {\n                const quotes = column.indexOf(this.DELIMETER) > -1 || column.indexOf(this.QUOTE) > -1;\n                column = column.replace(/\"/g, '\"\"');\n                if (quotes) column = `${this.QUOTE}${column}${this.QUOTE}`;\n            }\n            text += column;\n            if (i < data.length - 1) text += this.DELIMETER;\n        }\n        return text;\n    }\n    writeAsJavaScriptArray(headings, data) {\n        let text = \"[[\";\n        for (let column of headings)text += `\"${column}\",`;\n        text = text.slice(0, -1);\n        text += \"]\\n\";\n        let row;\n        for(let i = 0; i < data.length; i++){\n            const line = data[i];\n            row = \"[\";\n            for(let j = 0; j < line.length; j++){\n                const column = line[j];\n                row += `\"${column.replace(/\"/g, '\\\\\"')}\",`;\n            }\n            row = row.slice(0, -1);\n            row += \"],\\n\";\n            text += row;\n        }\n        text += \"];\";\n        return text;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $c2a459ae4d3b0cbc$export$4b34289fff3e9e9d {\n    constructor(core){\n        this._core = core;\n    }\n    split1d(ids, facetsX, valuesX, orderedIds, facetIds, offsets, counts) {\n        this.split3d(ids, facetsX, undefined, undefined, valuesX, null, null, orderedIds, facetIds, offsets, counts);\n    }\n    split2d(ids, facetsX, facetsY, valuesX, valuesY, orderedIds, facetIds, offsets, counts) {\n        this.split3d(ids, facetsX, facetsY, undefined, valuesX, valuesY, null, orderedIds, facetIds, offsets, counts);\n    }\n    split3d(ids, facetsX, facetsY, facetsZ, valuesX, valuesY, valuesZ, orderedIds, facetIds, offsets, counts) {\n        if (valuesX && facetIds.length != valuesX.length) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, \"facet helper split1d facetIds should be same length as facetValuesX\");\n        if (valuesY && facetIds.length != valuesY.length) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, \"facet helper split1d facetIds should be same length as facetValuesY\");\n        if (valuesZ && facetIds.length != valuesY.length) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, \"facet helper split1d facetIds should be same length as facetValuesY\");\n        const start = window.performance.now();\n        if (facetsX === undefined) facetsX = 1;\n        if (facetsY === undefined) facetsY = 1;\n        if (facetsZ === undefined) facetsZ = 1;\n        const maxFacetId = facetsX * facetsY * facetsZ - 1;\n        for(let i = 0; i < ids.length; i++){\n            const id = ids[i];\n            const valueX = valuesX ? valuesX[id] : 0;\n            const valueY = valuesY ? valuesY[id] : 0;\n            const valueZ = valuesZ ? valuesZ[id] : 0;\n            const facetId = valueX + valueY * facetsX + valueZ * facetsX * facetsZ;\n            facetIds[id] = facetId;\n            if (facetId > maxFacetId) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, \"facet overflow\");\n            counts[facetId]++;\n        }\n        let offset = 0;\n        for(let i = 0; i < offsets.length; i++){\n            const count = counts[i];\n            offsets[i] = offset;\n            offset += count;\n        }\n        const tempOffsets = new Uint32Array(offsets);\n        for(let i = 0; i < ids.length; i++){\n            const id = ids[i];\n            const facetId = facetIds[id];\n            offset = tempOffsets[facetId]++;\n            orderedIds[offset] = id;\n        }\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `facet split ${Math.round(window.performance.now() - start)}ms`);\n    }\n    wrap1d(ids, values, columns, coordsX, coordsY) {\n        const start = window.performance.now();\n        let rows = 0;\n        for(let i = 0; i < ids.length; i++){\n            const id = ids[i];\n            const value = values[id];\n            coordsX[id] = value % columns;\n            const row = Math.floor(value / columns);\n            coordsY[id] = row;\n            rows = Math.max(row, rows);\n        }\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `facet wrap ${Math.round(window.performance.now() - start)}ms`);\n        return rows + 1;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $935506ebc69281c4$export$75da59b8cfa595f3 {\n}\nclass $935506ebc69281c4$export$bf3a0f176b3bd0a8 {\n    constructor(options){\n        this._ids = options.ids;\n        this._positionsX = options.positionsX;\n        this._positionsY = options.positionsY;\n        this._positionsZ = options.positionsZ;\n        this._masses = options.masses;\n        this._maxLevel = options.maxLevel;\n        this.root = new $935506ebc69281c4$export$75da59b8cfa595f3();\n        this.root.minBoundsX = options.minBoundsX;\n        this.root.minBoundsY = options.minBoundsY;\n        this.root.minBoundsZ = options.minBoundsZ;\n        this.root.maxBoundsX = options.maxBoundsX;\n        this.root.maxBoundsY = options.maxBoundsY;\n        this.root.maxBoundsZ = options.maxBoundsZ;\n        this.root.level = 0;\n        this.root.octKey = \"\";\n        this._buildTree(this.root, this._ids);\n    }\n    _buildTree(parent, ids) {\n        const centerX = (parent.minBoundsX + parent.maxBoundsX) / 2;\n        const centerY = (parent.minBoundsY + parent.maxBoundsY) / 2;\n        const centerZ = (parent.minBoundsZ + parent.maxBoundsZ) / 2;\n        const minBoundsX = [];\n        const minBoundsY = [];\n        const minBoundsZ = [];\n        const maxBoundsX = [];\n        const maxBoundsY = [];\n        const maxBoundsZ = [];\n        minBoundsX.push(parent.minBoundsX);\n        minBoundsY.push(parent.minBoundsY);\n        minBoundsZ.push(parent.minBoundsZ);\n        maxBoundsX.push(centerX);\n        maxBoundsY.push(centerY);\n        maxBoundsZ.push(centerZ);\n        minBoundsX.push(centerX);\n        minBoundsY.push(parent.minBoundsY);\n        minBoundsZ.push(parent.minBoundsZ);\n        maxBoundsX.push(parent.maxBoundsX);\n        maxBoundsY.push(centerY);\n        maxBoundsZ.push(centerZ);\n        minBoundsX.push(centerX);\n        minBoundsY.push(parent.minBoundsY);\n        minBoundsZ.push(centerZ);\n        maxBoundsX.push(parent.maxBoundsX);\n        maxBoundsY.push(centerY);\n        maxBoundsZ.push(parent.maxBoundsZ);\n        minBoundsX.push(parent.minBoundsX);\n        minBoundsY.push(parent.minBoundsY);\n        minBoundsZ.push(centerZ);\n        maxBoundsX.push(centerX);\n        maxBoundsY.push(centerY);\n        maxBoundsZ.push(parent.maxBoundsZ);\n        minBoundsX.push(parent.minBoundsX);\n        minBoundsY.push(centerY);\n        minBoundsZ.push(parent.minBoundsZ);\n        maxBoundsX.push(centerX);\n        maxBoundsY.push(parent.maxBoundsY);\n        maxBoundsZ.push(centerZ);\n        minBoundsX.push(centerX);\n        minBoundsY.push(centerY);\n        minBoundsZ.push(parent.minBoundsZ);\n        maxBoundsX.push(parent.maxBoundsX);\n        maxBoundsY.push(parent.maxBoundsY);\n        maxBoundsZ.push(centerZ);\n        minBoundsX.push(centerX);\n        minBoundsY.push(centerY);\n        minBoundsZ.push(centerZ);\n        maxBoundsX.push(parent.maxBoundsX);\n        maxBoundsY.push(parent.maxBoundsY);\n        maxBoundsZ.push(parent.maxBoundsZ);\n        minBoundsX.push(parent.minBoundsX);\n        minBoundsY.push(centerY);\n        minBoundsZ.push(centerZ);\n        maxBoundsX.push(centerX);\n        maxBoundsY.push(parent.maxBoundsY);\n        maxBoundsZ.push(parent.maxBoundsZ);\n        const masses = new Float64Array(8);\n        const centerOfMassesX = new Float64Array(8);\n        const centerOfMassesY = new Float64Array(8);\n        const centerOfMassesZ = new Float64Array(8);\n        const buckets = [\n            [],\n            [],\n            [],\n            [],\n            [],\n            [],\n            [],\n            []\n        ];\n        for(let i = 0; i < ids.length; i++){\n            const index = ids[i];\n            const x = this._positionsX[index];\n            const y = this._positionsY[index];\n            const z = this._positionsZ[index];\n            const mass = this._masses[index];\n            for(let j = 0; j < 8; j++)if (minBoundsX[j] <= x && maxBoundsX[j] >= x && minBoundsY[j] <= y && maxBoundsY[j] >= y && minBoundsZ[j] <= z && maxBoundsZ[j] >= z) {\n                buckets[j].push(index);\n                masses[j] += mass;\n                centerOfMassesX[j] += x * mass;\n                centerOfMassesY[j] += y * mass;\n                centerOfMassesZ[j] += z * mass;\n                break;\n            }\n        }\n        parent.children = [];\n        for(let i = 0; i < 8; i++)if (buckets[i].length > 0) {\n            const child = new $935506ebc69281c4$export$75da59b8cfa595f3();\n            child.minBoundsX = minBoundsX[i];\n            child.minBoundsY = minBoundsY[i];\n            child.minBoundsZ = minBoundsZ[i];\n            child.maxBoundsX = maxBoundsX[i];\n            child.maxBoundsY = maxBoundsY[i];\n            child.maxBoundsZ = maxBoundsZ[i];\n            child.mass = masses[i];\n            child.centerOfMassX = centerOfMassesX[i] / masses[i];\n            child.centerOfMassY = centerOfMassesY[i] / masses[i];\n            child.centerOfMassZ = centerOfMassesZ[i] / masses[i];\n            child.level = parent.level + 1;\n            child.octKey += i.toString();\n            child.parent = parent;\n            child.ids = new Uint32Array(buckets[i]);\n            parent.children.push(child);\n            if (child.ids.length > 1 && child.level < this._maxLevel) this._buildTree(child, child.ids);\n        }\n    }\n}\n\n\nclass $1c75d3db8cc60612$export$6844396a695c449 {\n    set gravity(value) {\n        this._gravity = value;\n    }\n    get gravity() {\n        return this._gravity;\n    }\n    set attraction(value) {\n        this._attraction = value;\n    }\n    get attraction() {\n        return this._attraction;\n    }\n    set repulsion(value) {\n        this._repulsion = value;\n    }\n    get repulsion() {\n        return this._repulsion;\n    }\n    set interval(value) {\n        this._interval = value;\n    }\n    get interval() {\n        return this._interval;\n    }\n    set maxDistance(value) {\n        this._maxDistance = value;\n    }\n    get maxDistance() {\n        return this._maxDistance;\n    }\n    set iterationsPerLayout(value) {\n        this._iteractionsPerLayout = value;\n    }\n    get iterationsPerLayout() {\n        return this._iteractionsPerLayout;\n    }\n    set edgeWeightPower(value) {\n        this._edgeWeightPower = value;\n    }\n    get edgeWeightPower() {\n        return this._edgeWeightPower;\n    }\n    set theta(value) {\n        this._theta = value;\n    }\n    get theta() {\n        return this._theta;\n    }\n    get iterations() {\n        return this._totalIterations;\n    }\n    get totalRepulsion() {\n        return this._totalRepulsion;\n    }\n    get nodePositionsX() {\n        return this._nodePositionsX;\n    }\n    get nodePositionsY() {\n        return this._nodePositionsY;\n    }\n    get nodePositionsZ() {\n        return this._nodePositionsZ;\n    }\n    get lockX() {\n        return this._lockX;\n    }\n    set lockX(value) {\n        this._lockX = value;\n    }\n    get lockY() {\n        return this._lockY;\n    }\n    set lockY(value) {\n        this._lockY = value;\n    }\n    get lockZ() {\n        return this._lockZ;\n    }\n    set lockZ(value) {\n        this._lockZ = value;\n    }\n    constructor(options){\n        this._forcesX = new Float64Array(options.nodeIds.length);\n        this._forcesY = new Float64Array(options.nodeIds.length);\n        this._forcesZ = new Float64Array(options.nodeIds.length);\n        this._totalIterations = 0;\n        this._totalRepulsion = 0;\n        this._repulsion = options.repulsion || 1;\n        this._attraction = options.attraction || 1;\n        this._gravity = options.gravity || 1;\n        this._interval = options.interval || 1;\n        this._maxDistance = options.maxDistance || 1;\n        this._iteractionsPerLayout = options.iterationsPerLayout || 1;\n        this._theta = options.theta || 1;\n        this._nodeIds = options.nodeIds;\n        this._nodePositionsX = options.nodePositionsX;\n        this._nodePositionsY = options.nodePositionsY;\n        this._nodePositionsZ = options.nodePositionsZ;\n        this._nodeWeights = options.nodeWeights || new Float64Array(this._nodeIds.length).fill(1);\n        this._edgeIds = options.edgeIds;\n        this._edgeFromIds = options.edgeFromIds;\n        this._edgeToIds = options.edgeToIds;\n        this._edgeWeights = options.edgeWeights || new Float64Array(this._edgeIds.length).fill(1);\n        this._edgeWeightPower = options.edgeWeightPower || 1;\n    }\n    layout() {\n        this._minBoundsX = Number.MAX_VALUE;\n        this._minBoundsY = Number.MAX_VALUE;\n        this._minBoundsZ = Number.MAX_VALUE;\n        this._maxBoundsX = -Number.MAX_VALUE;\n        this._maxBoundsY = -Number.MAX_VALUE;\n        this._maxBoundsZ = -Number.MAX_VALUE;\n        for(let i = 0; i < this._nodeIds.length; i++){\n            this._minBoundsX = Math.min(this._minBoundsX, this._nodePositionsX[i]);\n            this._minBoundsY = Math.min(this._minBoundsY, this._nodePositionsY[i]);\n            this._minBoundsZ = Math.min(this._minBoundsZ, this._nodePositionsZ[i]);\n            this._maxBoundsX = Math.max(this._maxBoundsX, this._nodePositionsX[i]);\n            this._maxBoundsY = Math.max(this._maxBoundsY, this._nodePositionsY[i]);\n            this._maxBoundsZ = Math.max(this._maxBoundsZ, this._nodePositionsZ[i]);\n        }\n        for(let iteration = 0; iteration < this._iteractionsPerLayout; iteration++){\n            for(let i = 0; i < this._nodeIds.length; i++){\n                const id = this._nodeIds[i];\n                this._forcesX[id] = 0;\n                this._forcesY[id] = 0;\n                this._forcesZ[id] = 0;\n            }\n            for(let i = 0; i < this._nodeIds.length; i++){\n                const id = this._nodeIds[i];\n                let dx = this._nodePositionsX[id];\n                let dy = this._nodePositionsY[id];\n                let dz = this._nodePositionsZ[id];\n                const distanceSquared = dx * dx + dy * dy + dz * dz;\n                if (distanceSquared > 0) {\n                    const distance = Math.sqrt(distanceSquared);\n                    dx /= distance;\n                    dy /= distance;\n                    dz /= distance;\n                    const magnitude = -this._nodeWeights[id] * this._gravity;\n                    this._forcesX[id] += magnitude * dx;\n                    this._forcesY[id] += magnitude * dy;\n                    this._forcesZ[id] += magnitude * dz;\n                }\n            }\n            for(let i = 0; i < this._edgeIds.length; i++){\n                const id = this._edgeIds[i];\n                const fromId = this._edgeFromIds[id];\n                const toId = this._edgeToIds[id];\n                const x1 = this._nodePositionsX[fromId];\n                const y1 = this._nodePositionsY[fromId];\n                const z1 = this._nodePositionsZ[fromId];\n                const x2 = this._nodePositionsX[toId];\n                const y2 = this._nodePositionsY[toId];\n                const z2 = this._nodePositionsZ[toId];\n                let dx = x1 - x2;\n                let dy = y1 - y2;\n                let dz = z1 - z2;\n                const distanceSquared = dx * dx + dy * dy + dz * dz;\n                if (distanceSquared > 0) {\n                    let distance = Math.sqrt(distanceSquared);\n                    dx /= distance;\n                    dy /= distance;\n                    dz /= distance;\n                    const magnitude = -distance * this._attraction * Math.pow(this._edgeWeights[id], this._edgeWeightPower);\n                    this._forcesX[fromId] += magnitude * dx;\n                    this._forcesY[fromId] += magnitude * dy;\n                    this._forcesZ[fromId] += magnitude * dz;\n                    this._forcesX[toId] -= magnitude * dx;\n                    this._forcesY[toId] -= magnitude * dy;\n                    this._forcesZ[toId] -= magnitude * dz;\n                }\n            }\n            const minBounds = Math.min(Math.min(this._minBoundsX, this._minBoundsY), this._minBoundsZ);\n            const maxBounds = Math.max(Math.max(this._maxBoundsX, this._maxBoundsY), this._maxBoundsZ);\n            const size = maxBounds - minBounds;\n            const maxLevel = 10;\n            const minBoundsX = minBounds;\n            const minBoundsY = minBounds;\n            const minBoundsZ = minBounds;\n            const maxBoundsX = maxBounds;\n            const maxBoundsY = maxBounds;\n            const maxBoundsZ = maxBounds;\n            const octTreeOptions = {\n                minBoundsX: minBoundsX,\n                minBoundsY: minBoundsY,\n                minBoundsZ: minBoundsZ,\n                maxBoundsX: maxBoundsX,\n                maxBoundsY: maxBoundsY,\n                maxBoundsZ: maxBoundsZ,\n                maxLevel: maxLevel,\n                ids: this._nodeIds,\n                positionsX: this._nodePositionsX,\n                positionsY: this._nodePositionsY,\n                positionsZ: this._nodePositionsZ,\n                masses: this._nodeWeights\n            };\n            const octTree = new (0, $935506ebc69281c4$export$bf3a0f176b3bd0a8)(octTreeOptions);\n            this._totalRepulsion = 0;\n            for(let i = 0; i < this._nodeIds.length; i++){\n                const id = this._nodeIds[i];\n                this._forceX = 0;\n                this._forceY = 0;\n                this._forceZ = 0;\n                this.calculateRepulsion(octTree.root, id);\n                this._forcesX[id] += this._forceX;\n                this._forcesY[id] += this._forceY;\n                this._forcesZ[id] += this._forceZ;\n                this._totalRepulsion += Math.sqrt(this._forceX * this._forceX + this._forceY * this._forceY + this._forceZ * this._forceZ);\n            }\n            const timeSquared = this._interval * this._interval;\n            for(let i = 0; i < this._nodeIds.length; i++){\n                const id = this._nodeIds[i];\n                const mass = this._nodeWeights[id];\n                const ax = this._forcesX[id] / mass;\n                const ay = this._forcesY[id] / mass;\n                const az = this._forcesZ[id] / mass;\n                let dx = ax * timeSquared / 2;\n                let dy = ay * timeSquared / 2;\n                let dz = az * timeSquared / 2;\n                const distanceSquared = dx * dx + dy * dy + dz * dz;\n                const distance = Math.sqrt(distanceSquared);\n                if (distance > this._maxDistance * size) {\n                    dx *= this._maxDistance * size / distance;\n                    dy *= this._maxDistance * size / distance;\n                    dz *= this._maxDistance * size / distance;\n                }\n                if (!this._lockX) this._nodePositionsX[id] += dx;\n                if (!this._lockY) this._nodePositionsY[id] += dy;\n                if (!this._lockZ) this._nodePositionsZ[id] += dz;\n            }\n        }\n        if (this.layoutCallback) this.layoutCallback();\n    }\n    calculateRepulsion(parent, id1) {\n        const x1 = this._nodePositionsX[id1];\n        const y1 = this._nodePositionsY[id1];\n        const z1 = this._nodePositionsZ[id1];\n        for(let k = 0; k < parent.children.length; k++){\n            const child = parent.children[k];\n            if (!child.children) for(let i = 0; i < child.ids.length; i++){\n                const id2 = child.ids[i];\n                if (id1 != id2) {\n                    const x2 = this._nodePositionsX[id2];\n                    const y2 = this._nodePositionsY[id2];\n                    const z2 = this._nodePositionsZ[id2];\n                    let dx = x1 - x2;\n                    let dy = y1 - y2;\n                    let dz = z1 - z2;\n                    let distanceSquared = dx * dx + dy * dy + dz * dz;\n                    if (distanceSquared > 0) {\n                        let distance = Math.sqrt(distanceSquared);\n                        dx /= distance;\n                        dy /= distance;\n                        dz /= distance;\n                        const magnitude = this._repulsion * this._nodeWeights[id1] * this._nodeWeights[id2] / distanceSquared;\n                        this._forceX += dx * magnitude;\n                        this._forceY += dy * magnitude;\n                        this._forceZ += dz * magnitude;\n                    }\n                }\n            }\n            else {\n                let dx = x1 - child.centerOfMassX;\n                let dy = y1 - child.centerOfMassY;\n                let dz = z1 - child.centerOfMassZ;\n                const distanceSquared = dx * dx + dy * dy + dz * dz;\n                if (distanceSquared > 0) {\n                    const distance = Math.sqrt(distanceSquared);\n                    dx /= distance;\n                    dy /= distance;\n                    dz /= distance;\n                    const width = child.maxBoundsX - child.minBoundsX;\n                    if (width / distance < this._theta) {\n                        const magnitude = this._repulsion * this._nodeWeights[id1] * child.mass / distanceSquared;\n                        this._forceX += dx * magnitude;\n                        this._forceY += dy * magnitude;\n                        this._forceZ += dz * magnitude;\n                    } else this.calculateRepulsion(child, id1);\n                }\n            }\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $24349737166db450$export$db005bf9e0fbda31 {\n    static width(size, orientation) {\n        if (orientation == (0, $4a6417d29706362f$export$9ac0daa892cfa13e).pointyTop) return (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE * size;\n        else return 2 * size;\n    }\n    static height(size, orientation) {\n        if (orientation == (0, $4a6417d29706362f$export$9ac0daa892cfa13e).pointyTop) return 2 * size;\n        else return (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE * size;\n    }\n    static pointyHexCorner(center, size, i, position) {\n        const angle = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(60 * i - 30);\n        position[0] = center[0] + size * Math.cos(angle);\n        position[1] = center[1] + size * Math.sin(angle);\n    }\n    static cubeToAxial(cube, hex) {\n        hex[0] = cube[0];\n        hex[1] = cube[2];\n    }\n    static axialToCube(hex, cube) {\n        const x = hex[0];\n        const z = hex[1];\n        const y = -x - z;\n        cube[0] = x;\n        cube[1] = y;\n        cube[2] = z;\n    }\n    static cubeToOddr(cube, hex) {\n        const col = cube[0] + (cube[2] - (cube[2] & 1)) / 2;\n        const row = cube[2];\n        hex[0] = col;\n        hex[1] = row;\n    }\n    static oddrToCube(hex, cube) {\n        const x = hex[0] - (hex[1] - (hex[1] & 1)) / 2;\n        const z = hex[1];\n        const y = -x - z;\n        cube[0] = x;\n        cube[1] = y;\n        cube[2] = z;\n    }\n    static pointyHexToPixel(hex, size, point) {\n        point[0] = size * ((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE * hex[0] + (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE / 2 * hex[1]);\n        point[1] = size * (1.5 * hex[1]);\n    }\n    static pixelToPointyHex(point, size, hex) {\n        hex[0] = ((0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE / 3 * point[0] - 1 / 3 * point[1]) / size;\n        hex[1] = 2 / 3 * point[1] / size;\n        this.hexRound(hex, hex);\n    }\n    static hexRound(hex, hexRound) {\n        const cube = this._vec3;\n        this.axialToCube(hex, cube);\n        this.cubeRound(cube, cube);\n        this.cubeToAxial(cube, hexRound);\n    }\n    static cubeRound(cube, cubeRound) {\n        let rx = Math.round(cube[0]);\n        let ry = Math.round(cube[1]);\n        let rz = Math.round(cube[2]);\n        const x_diff = Math.abs(rx - cube[0]);\n        const y_diff = Math.abs(ry - cube[1]);\n        const z_diff = Math.abs(rz - cube[2]);\n        if (x_diff > y_diff && x_diff > z_diff) rx = -ry - rz;\n        else if (y_diff > z_diff) ry = -rx - rz;\n        else rz = -rx - ry;\n        cubeRound[0] = rx;\n        cubeRound[1] = ry;\n        cubeRound[2] = rz;\n    }\n}\n$24349737166db450$export$db005bf9e0fbda31._vec3 = (0, $31054a6c69637582$exports).create();\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $18a78f0c92aa12a4$export$917b5ee4d724090b {\n    static bin(options) {\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? options.ids.length : options.count;\n        const width = (options.maxValueX - options.minValueX) / options.binsX;\n        const minValueX = options.minValueX - width / 2;\n        const binsX = options.binsX + 1;\n        const size = width / (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE;\n        const height = 2 * size;\n        const heightBetweenCenters = 3 * height / 4;\n        const binsY = Math.ceil((options.maxValueY - options.minValueY) / heightBetweenCenters) + 1;\n        const minValueY = options.minValueY;\n        const minQ = -Math.floor(binsY / 2);\n        const maxBins = (binsX - minQ) * binsY;\n        const binCounts = new Float64Array(maxBins);\n        const binLookup = new Uint32Array(maxBins);\n        const binIds = new Uint32Array(options.valuesX.length);\n        const point = (0, $91b0cc4981465964$exports).create();\n        const hex = (0, $91b0cc4981465964$exports).create();\n        let nonEmptyBins = 0;\n        let minCount = Number.MAX_VALUE;\n        let maxCount = -Number.MAX_VALUE;\n        for(let i = 0; i < count; i++){\n            const id = options.ids[i + offset];\n            point[0] = options.valuesX[id] - minValueX;\n            point[1] = options.valuesY[id] - minValueY;\n            (0, $24349737166db450$export$db005bf9e0fbda31).pixelToPointyHex(point, size, hex);\n            const q = hex[0] - minQ;\n            const r = hex[1];\n            const binId = q + r * (binsX - minQ);\n            if (binCounts[binId] == 0) {\n                binLookup[binId] = nonEmptyBins;\n                nonEmptyBins++;\n            }\n            binCounts[binId]++;\n            binIds[id] = binId;\n            minCount = Math.min(minCount, binCounts[binId]);\n            maxCount = Math.max(maxCount, binCounts[binId]);\n        }\n        const positionsX = new Float64Array(nonEmptyBins);\n        const positionsY = new Float64Array(nonEmptyBins);\n        const counts = new Uint32Array(nonEmptyBins);\n        const lookup = {};\n        for(let i = 0; i < maxBins; i++){\n            const count = binCounts[i];\n            if (count > 0) {\n                const index = binLookup[i];\n                lookup[i] = index;\n                counts[index] = count;\n                const q = i % (binsX - minQ);\n                const r = Math.floor(i / (binsX - minQ));\n                hex[0] = q + minQ;\n                hex[1] = r;\n                (0, $24349737166db450$export$db005bf9e0fbda31).pointyHexToPixel(hex, size, point);\n                positionsX[index] = point[0] + minValueX;\n                positionsY[index] = point[1] + minValueY;\n            }\n        }\n        const result = {\n            binIds: binIds,\n            positionsX: positionsX,\n            positionsY: positionsY,\n            counts: counts,\n            minCount: minCount,\n            maxCount: maxCount,\n            orientation: (0, $4a6417d29706362f$export$9ac0daa892cfa13e).pointyTop,\n            size: size,\n            lookup: lookup,\n            binsY: binsY\n        };\n        return result;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $f981d40aaab0cc8d$export$a94506fb574265ab {\n    constructor(core){\n        this._core = core;\n    }\n    connect(orderedIds, series, toIds, offset = 0, count = orderedIds.length) {\n        const start = window.performance.now();\n        const lines = new Set();\n        const lookup = {};\n        for(let i = offset; i < count; i++){\n            const id = orderedIds[i + offset];\n            const value = series[id];\n            const fromId = lookup[value];\n            if (fromId != null) {\n                toIds[fromId] = id;\n                lines.add(value);\n            }\n            lookup[value] = id;\n            toIds[id] = id;\n        }\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${lines.size} lines connected ${Math.round(window.performance.now() - start)}ms`);\n        return lines.size;\n    }\n}\n\n\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $11b5f927bd29379c$export$2ee509afc4628e4 {\n    static resample(colorsIn, divisionsOut, reverse) {\n        const divisionsIn = colorsIn.length / 3;\n        const colorsOut = new Uint8Array(divisionsOut * 4);\n        for(let i = 0; i < divisionsOut; i++){\n            const positionOut = (i + 0.5) / divisionsOut;\n            const positionIn = positionOut * (divisionsIn - 1);\n            const stepIn = Math.floor(positionIn);\n            const fractIn = positionIn - stepIn;\n            const j = reverse ? divisionsOut - i - 1 : i;\n            colorsOut[j * 4] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(colorsIn[stepIn * 3], colorsIn[(stepIn + 1) * 3], fractIn);\n            colorsOut[j * 4 + 1] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(colorsIn[stepIn * 3 + 1], colorsIn[(stepIn + 1) * 3 + 1], fractIn);\n            colorsOut[j * 4 + 2] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(colorsIn[stepIn * 3 + 2], colorsIn[(stepIn + 1) * 3 + 2], fractIn);\n            colorsOut[j * 4 + 3] = 255;\n        }\n        return colorsOut;\n    }\n    static truncate(colorsIn, divisionsOut, reverse) {\n        const divisionsIn = colorsIn.length / 3;\n        const colorsOut = new Uint8Array(divisionsOut * 4);\n        for(let i = 0; i < Math.min(divisionsIn, divisionsOut); i++){\n            const j = reverse ? divisionsOut - i - 1 : i;\n            colorsOut[j * 4] = colorsIn[i * 3];\n            colorsOut[j * 4 + 1] = colorsIn[i * 3 + 1];\n            colorsOut[j * 4 + 2] = colorsIn[i * 3 + 2];\n            colorsOut[j * 4 + 3] = 255;\n        }\n        return colorsOut;\n    }\n    static resampleStops(stops, divisions, reverse) {\n        const colorsOut = new Uint8Array(divisions * 4);\n        let from = 0;\n        let to = 0;\n        for(let i = 0; i < divisions; i++){\n            const positionOut = (i + 0.5) / divisions;\n            while(stops[from].position < positionOut && from < stops.length - 1)from++;\n            from = Math.max(from - 1, 0);\n            to = Math.min(from + 1, stops.length - 1);\n            const fromStop = stops[from];\n            const toStop = stops[to];\n            const fract = from == to ? 0 : (positionOut - fromStop.position) / (toStop.position - fromStop.position);\n            const j = reverse ? divisions - i - 1 : i;\n            colorsOut[j * 4] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(fromStop.r, toStop.r, fract);\n            colorsOut[j * 4 + 1] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(fromStop.g, toStop.g, fract);\n            colorsOut[j * 4 + 2] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(fromStop.b, toStop.b, fract);\n            colorsOut[j * 4 + 3] = 255;\n        }\n        return colorsOut;\n    }\n    static lerpRgb(from, to, divisions) {\n        const colors = new Uint8Array(divisions * 4);\n        for(let i = 0; i < divisions; i++){\n            const amount = i / (divisions - 1);\n            colors[i * 4] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from[0], to[0], amount);\n            colors[i * 4 + 1] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from[1], to[1], amount);\n            colors[i * 4 + 2] = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from[2], to[2], amount);\n            colors[i * 4 + 3] = 0xff;\n        }\n        return colors;\n    }\n    static lerpHsv(from, to, divisions) {\n        const colors = new Uint8Array(divisions * 4);\n        for(let i = 0; i < divisions; i++){\n            const amount = i / (divisions - 1);\n            const h = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from[0], to[0], amount);\n            const s = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from[1], to[1], amount);\n            const v = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(from[2], to[2], amount);\n            (0, $c37f3938111fba7e$export$a33ddd5b3ba7b208).hsvToRgb(h, s, v, $11b5f927bd29379c$export$2ee509afc4628e4._rgb);\n            colors[i * 4] = $11b5f927bd29379c$export$2ee509afc4628e4._rgb[0] * 0xff;\n            colors[i * 4 + 1] = $11b5f927bd29379c$export$2ee509afc4628e4._rgb[1] * 0xff;\n            colors[i * 4 + 2] = $11b5f927bd29379c$export$2ee509afc4628e4._rgb[2] * 0xff;\n            colors[i * 4 + 3] = 0xff;\n        }\n        return colors;\n    }\n}\n$11b5f927bd29379c$export$2ee509afc4628e4._rgb = (0, $31054a6c69637582$exports).create();\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $a4596fc55355f0e1$export$433e0478e7f6ca93 {\n    static getFilenameWithoutExtension(path) {\n        const dot = path.lastIndexOf('.');\n        if (dot == -1) return path;\n        else {\n            const start = path.lastIndexOf('/') == -1 ? 0 : path.lastIndexOf('/') + 1;\n            return path.substring(start, dot);\n        }\n    }\n    static getExtension(path) {\n        const dot = path.lastIndexOf('.');\n        if (dot == -1 || dot == path.length - 1) return null;\n        else return path.substring(dot + 1, path.length);\n    }\n    static getFilename(path) {\n        if (path.lastIndexOf('/') == -1) return path;\n        else {\n            const start = path.lastIndexOf('/') + 1;\n            return path.substring(start, path.length);\n        }\n    }\n    static getPath(path) {\n        if (path.lastIndexOf('/') == -1) return \"\";\n        else return path.substring(0, path.lastIndexOf('/'));\n    }\n    static combine(first, second) {\n        const seperator = first.lastIndexOf('/') == first.length - 1;\n        if (second.indexOf('/') == 0) {\n            if (seperator) return first.substring(0, first.length - 1) + second;\n            else return first + second;\n        } else {\n            if (seperator) return first + second;\n            else return first + '/' + second;\n        }\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $b4dbeddbb8ed9d60$export$ec91da630f36d5ea {\n    get ids() {\n        return this._ids;\n    }\n    constructor(core, ids, data, headings, columnTypes, numericValues){\n        this._core = core;\n        this._ids = ids;\n        this._data = data;\n        this._columnTypes = columnTypes;\n        this._numericValues = numericValues;\n        this._stringValues = Array(columnTypes.length).fill(null);\n        this._hasMinMaxValues = Array(columnTypes.length).fill(false);\n        this._minValues = Array(columnTypes.length).fill(0);\n        this._maxValues = Array(columnTypes.length).fill(0);\n        this._distinctStrings = Array(columnTypes.length).fill(null);\n        this._orderedIds = Array(columnTypes.length).fill(null);\n        this._orderedValues = Array(columnTypes.length).fill(null);\n    }\n    columnValues(column) {\n        if (this._columnTypes[column] == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string) return this._createStringValues(column);\n        else return this._createNumericValues(column);\n    }\n    minValue(column) {\n        this._createMinMaxValues(column);\n        return this._minValues[column];\n    }\n    maxValue(column) {\n        this._createMinMaxValues(column);\n        return this._maxValues[column];\n    }\n    distinctStrings(column) {\n        if (this._columnTypes[column] == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string) {\n            this._createStringValues(column);\n            return this._distinctStrings[column];\n        } else return null;\n    }\n    toJSON(ids, columns) {\n        const rows = [];\n        for(let i = 0; i < ids.length; i++){\n            const rowIndex = ids[i];\n            const row = [];\n            for(let j = 0; j < columns.length; j++){\n                const columnIndex = columns[j];\n                switch(this._columnTypes[columnIndex]){\n                    case (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).date:\n                    case (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string:\n                        row.push(this._data[rowIndex][columnIndex]);\n                        break;\n                    case (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).integer:\n                    case (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).float:\n                        const numericValues = this._createNumericValues(columnIndex);\n                        row.push(numericValues[rowIndex]);\n                        break;\n                }\n            }\n            rows.push(row);\n        }\n        return JSON.stringify(rows);\n    }\n    orderedIds(column) {\n        if (!this._orderedIds[column]) {\n            const start = window.performance.now();\n            const orderedIds = new Uint32Array(this._ids);\n            const values = this._columnTypes[column] == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string ? this._createStringValues(column) : this._createNumericValues(column);\n            orderedIds.sort(function(a, b) {\n                return values[a] - values[b];\n            });\n            this._orderedIds[column] = orderedIds;\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `ordered ids ${column} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        return this._orderedIds[column];\n    }\n    orderedValues(column) {\n        if (!this._orderedValues[column]) {\n            const start = window.performance.now();\n            const values = this._columnTypes[column] == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string ? this._createStringValues(column) : this._createNumericValues(column);\n            const orderedIds = this.orderedIds(column);\n            const orderedValues = new Float64Array(this._ids.length);\n            for(let i = 0; i < this._ids.length; i++)orderedValues[i] = values[orderedIds[i]];\n            this._orderedValues[column] = orderedValues;\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `ordered values ${column} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        return this._orderedValues[column];\n    }\n    distinctStringsOrdered(ids, column, stringValues) {\n        if (this._columnTypes[column] == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string) {\n            const distinctStrings = [];\n            const distinctStringValues = {};\n            const set = new Set();\n            for(let i = 0; i < ids.length; i++){\n                const id = ids[i];\n                const string = this._data[id][column];\n                let value;\n                if (!set.has(string)) {\n                    distinctStrings.push(string);\n                    value = set.size;\n                    distinctStringValues[string] = value;\n                    set.add(string);\n                } else value = distinctStringValues[string];\n                stringValues[id] = value;\n            }\n            return distinctStrings;\n        } else return null;\n    }\n    _createMinMaxValues(column) {\n        if (!this._hasMinMaxValues[column]) {\n            const type = this._columnTypes[column];\n            let min, max;\n            if (type == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string) {\n                this._createStringValues(column);\n                min = 0;\n                max = this._distinctStrings[column].length - 1;\n            } else {\n                const numericValues = this._createNumericValues(column);\n                min = Number.MAX_VALUE;\n                max = -Number.MAX_VALUE;\n                for(let i = 0; i < this._ids.length; i++){\n                    const id = this._ids[i];\n                    const value = numericValues[id];\n                    min = Math.min(min, value);\n                    max = Math.max(max, value);\n                }\n            }\n            this._minValues[column] = min;\n            this._maxValues[column] = max;\n            this._hasMinMaxValues[column] = true;\n        }\n    }\n    _createNumericValues(column) {\n        if (!this._numericValues[column]) {\n            const numericValues = new Float64Array(this._data.length);\n            const type = this._columnTypes[column];\n            if (type == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).float) for(let i = 0; i < this._data.length; i++){\n                const value = parseFloat(this._data[i][column]);\n                numericValues[i] = value;\n            }\n            else if (type == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).integer) for(let i = 0; i < this._data.length; i++){\n                const value = parseInt(this._data[i][column]);\n                numericValues[i] = value;\n            }\n            else if (type == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).date) for(let i = 0; i < this._data.length; i++){\n                const value = Date.parse(this._data[i][column]);\n                numericValues[i] = value;\n            }\n            this._numericValues[column] = numericValues;\n        }\n        return this._numericValues[column];\n    }\n    _createStringValues(column) {\n        if (!this._stringValues[column]) {\n            this._stringValues[column] = new Float64Array(this._data.length);\n            this._distinctStrings[column] = this.distinctStringsOrdered(this._ids, column, this._stringValues[column]);\n            this._minValues[column] = 0;\n            this._maxValues[column] = this._distinctStrings[column].length - 1;\n            this._hasMinMaxValues[column] = true;\n        }\n        return this._stringValues[column];\n    }\n}\n\n\nclass $98a24d29667ae67f$export$54ec01a60f47d33d {\n    get data() {\n        return this._data;\n    }\n    get headings() {\n        return this._headings;\n    }\n    get all() {\n        return this._all;\n    }\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get filter() {\n        return this._filter;\n    }\n    set filter(value) {\n        if (this._filter !== value) {\n            this._filter = value;\n            if (this.filterChangedCallback) this.filterChangedCallback();\n        }\n    }\n    getColumnType(column) {\n        return this._columnTypes[column];\n    }\n    isColumnDiscrete(column) {\n        return (this._columnTypes[column] & $98a24d29667ae67f$export$7ce43d0a8f00d826.discrete) > 0;\n    }\n    isColumnNumeric(column) {\n        return (this._columnTypes[column] & $98a24d29667ae67f$export$7ce43d0a8f00d826.numeric) > 0;\n    }\n    isColumnContinuous(column) {\n        return (this._columnTypes[column] & $98a24d29667ae67f$export$7ce43d0a8f00d826.continuous) > 0;\n    }\n    constructor(core, headings, data, columnTypes){\n        this._core = core;\n        this._headings = headings;\n        this._data = data;\n        this._columnTypes = columnTypes;\n        this._numericValues = Array(columnTypes.length).fill(null);\n        const indices = new Uint32Array(data.length);\n        for(let i = 0; i < indices.length; i++)indices[i] = i;\n        this._all = new (0, $b4dbeddbb8ed9d60$export$ec91da630f36d5ea)(core, indices, data, headings, columnTypes, this._numericValues);\n        this._isInitialized = true;\n    }\n    createFilter(ids) {\n        return new (0, $b4dbeddbb8ed9d60$export$ec91da630f36d5ea)(this._core, ids, this._data, this._headings, this._columnTypes, this._numericValues);\n    }\n}\nconst $98a24d29667ae67f$export$7ce43d0a8f00d826 = {\n    none: 0,\n    float: 1,\n    integer: 2,\n    string: 4,\n    date: 8,\n    continuous: 9,\n    discrete: 6,\n    numeric: 11\n};\n\n\nclass $38a1943f255fbbec$export$9ac52b025685a4d0 {\n    constructor(core){\n        this._core = core;\n    }\n    compatibleTypes(data, firstRow = 0, maxRows = Number.MAX_VALUE) {\n        const start = window.performance.now();\n        const types = [];\n        const integers = [];\n        let values = data[firstRow];\n        let parsedFloat, parsedDate;\n        for(let i = 0; i < values.length; i++){\n            const value = values[i];\n            parsedFloat = Number(value);\n            parsedDate = Date.parse(value);\n            let integer = false;\n            let type;\n            if (!isNaN(parsedFloat)) {\n                type = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).float;\n                integer = Number.isSafeInteger(parsedFloat);\n            } else if (!isNaN(parsedDate)) type = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).date;\n            else type = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string;\n            types.push(type);\n            integers.push(integer);\n        }\n        for(let i = firstRow + 1; i < Math.min(data.length, firstRow + maxRows); i++){\n            values = data[i];\n            for(let j = 0; j < values.length; j++)if (types[j] != (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string) {\n                const value = values[j];\n                parsedFloat = Number(value);\n                if (types[j] == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).float) {\n                    if (isNaN(parsedFloat)) {\n                        types[j] = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string;\n                        integers[j] = false;\n                    } else if (integers[j]) integers[j] = Number.isSafeInteger(parsedFloat);\n                } else if (types[j] == (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).date) {\n                    parsedDate = Date.parse(value);\n                    if (isNaN(parsedDate)) types[j] = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string;\n                }\n            }\n        }\n        const compatibleTypes = [];\n        for(let i = 0; i < types.length; i++){\n            let compatible = types[i] | (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string;\n            if (integers[i]) compatible |= (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).integer;\n            compatibleTypes.push(compatible);\n        }\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `compatible types ${Math.round(window.performance.now() - start)}ms`);\n        return compatibleTypes;\n    }\n    inferTypes(data, firstRow = 0, maxRows = Number.MAX_VALUE) {\n        const columnTypes = [];\n        const compatibleTypes = this.compatibleTypes(data, firstRow, maxRows);\n        for(let i = 0; i < compatibleTypes.length; i++){\n            let columnType;\n            const compatibleType = compatibleTypes[i];\n            if (compatibleType & (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).integer) columnType = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).integer;\n            else if (compatibleType & (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).float) columnType = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).float;\n            else if (compatibleType & (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).date) columnType = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).date;\n            else columnType = (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string;\n            columnTypes.push(columnType);\n        }\n        return columnTypes;\n    }\n    convertToObject(table) {\n        const headings = table.headings;\n        const jsonObject = [];\n        for(let i = 0; i < table.all.ids.length; i++){\n            const row = {};\n            for(let j = 0; j < headings.length; j++){\n                const column = headings[j];\n                const value = table.all.columnValues(j)[i];\n                switch(table.getColumnType(j)){\n                    case (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).integer:\n                    case (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).float:\n                        row[column] = value;\n                        break;\n                    case (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).string:\n                    case (0, $98a24d29667ae67f$export$7ce43d0a8f00d826).date:\n                    default:\n                        row[column] = table.data[i][j];\n                        break;\n                }\n                jsonObject.push(row);\n            }\n        }\n        return jsonObject;\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $a25f5529f6cda489$export$c41e4fcbf45db179 {\n    static create(gl, width, height, format, type, filter, bytes, internalFormat = format) {\n        const texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, texture);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n        gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, bytes);\n        return texture;\n    }\n    static fromImage(gl, image, mipmaps, filter) {\n        const texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_2D, texture);\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n        if (mipmaps && (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).isPowerOf2(image.width) && (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).isPowerOf2(image.height)) gl.generateMipmap(gl.TEXTURE_2D);\n        else {\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n        }\n        gl.bindTexture(gl.TEXTURE_2D, null);\n        return texture;\n    }\n    static cubemapFromImages(gl, images) {\n        const texture = gl.createTexture();\n        gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n        const targets = [\n            gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n            gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n            gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n            gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n            gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n            gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n        ];\n        for(let i = 0; i < 6; i++){\n            gl.texImage2D(targets[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, images[i]);\n            gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        }\n        gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n        gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n        return texture;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $f90460e72834bcbf$export$7b64922b0b192bef {\n    static parentChildren(ids, parentIds, childIds) {\n        const rootIds = [];\n        const degrees = new Uint32Array(ids.length);\n        const indices = {};\n        const children = {};\n        for(let i = 0; i < ids.length; i++){\n            const index = ids[i];\n            const parentId = parentIds[index];\n            const childId = childIds[index];\n            indices[childId] = index;\n            if (children[parentId] === undefined) {\n                children[parentId] = [];\n                degrees[index] = 1;\n            }\n            if (parentId < 0 || parentId == childId) rootIds.push(parentId);\n            else {\n                children[parentId].push(childId);\n                degrees[index]++;\n            }\n        }\n        return {\n            rootIds: rootIds,\n            indices: indices,\n            children: children,\n            degrees: degrees\n        };\n    }\n    static tree(rootId, indices, children, positions, widths, descendents, depths) {\n        let nextId = 0;\n        const idsArray = [];\n        let maxDescendents = 0;\n        const buildTree = (parentId, depth)=>{\n            const index = indices[parentId];\n            idsArray.push(index);\n            const childIds = children[parentId];\n            if (childIds !== undefined) {\n                const start = nextId;\n                let total = 0;\n                for(let i = 0; i < childIds.length; i++){\n                    const id = childIds[i];\n                    buildTree(id, depth + 1);\n                    const index = indices[id];\n                    total += descendents[index] + 1;\n                    depths[index] = depth + 1;\n                }\n                const end = nextId - 1;\n                positions[index] = (start + end) / 2;\n                descendents[index] = total;\n                maxDescendents = Math.max(maxDescendents, total);\n                widths[index] = end - start + 1;\n            } else {\n                widths[index] = 1;\n                positions[index] = nextId++;\n                depths[index] = depth;\n            }\n        };\n        buildTree(rootId, 0);\n        const maxPosition = nextId - 1;\n        return {\n            ids: new Uint32Array(idsArray),\n            maxDescendents: maxDescendents,\n            maxPosition: maxPosition\n        };\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75 {\n    static squarifiedLayout(options) {\n        if (options.from > options.to) return;\n        if (options.to - options.from < 2) {\n            $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75._sliceLayout({\n                ids: options.ids,\n                sizes: options.sizes,\n                positionsX: options.positionsX,\n                positionsY: options.positionsY,\n                sizesX: options.sizesX,\n                sizesY: options.sizesY,\n                from: options.from,\n                to: options.to,\n                x: options.x,\n                y: options.y,\n                width: options.width,\n                height: options.height,\n                lookup: options.lookup\n            });\n            return;\n        }\n        const totalSize = options.sizes ? $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.totalSize(options.ids, options.sizes, options.from, options.to) : options.to - options.from + 1;\n        const a = options.sizes ? options.sizes[options.ids[options.to]] / totalSize : 1 / totalSize;\n        let b = a;\n        let mid = options.to;\n        if (options.width < options.height) {\n            while(mid > options.from){\n                const aspect = $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.aspect(options.height, options.width, a, b);\n                const q = options.sizes ? options.sizes[options.ids[mid - 1]] / totalSize : 1 / totalSize;\n                if ($ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.aspect(options.height, options.width, a, b + q) > aspect) break;\n                mid--;\n                b += q;\n            }\n            $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75._sliceLayout({\n                ids: options.ids,\n                sizes: options.sizes,\n                positionsX: options.positionsX,\n                positionsY: options.positionsY,\n                sizesX: options.sizesX,\n                sizesY: options.sizesY,\n                from: mid,\n                to: options.to,\n                x: options.x,\n                y: options.y,\n                width: options.width,\n                height: options.height * b,\n                lookup: options.lookup\n            });\n            $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.squarifiedLayout({\n                ids: options.ids,\n                sizes: options.sizes,\n                positionsX: options.positionsX,\n                positionsY: options.positionsY,\n                sizesX: options.sizesX,\n                sizesY: options.sizesY,\n                from: options.from,\n                to: mid - 1,\n                x: options.x,\n                y: options.y + options.height * b,\n                width: options.width,\n                height: options.height * (1 - b),\n                lookup: options.lookup\n            });\n        } else {\n            while(mid > options.from){\n                const aspect = $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.aspect(options.width, options.height, a, b);\n                const q = options.sizes ? options.sizes[options.ids[mid - 1]] / totalSize : 1 / totalSize;\n                if ($ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.aspect(options.width, options.height, a, b + q) > aspect) break;\n                mid--;\n                b += q;\n            }\n            $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75._sliceLayout({\n                ids: options.ids,\n                sizes: options.sizes,\n                positionsX: options.positionsX,\n                positionsY: options.positionsY,\n                sizesX: options.sizesX,\n                sizesY: options.sizesY,\n                from: mid,\n                to: options.to,\n                x: options.x,\n                y: options.y,\n                width: options.width * b,\n                height: options.height,\n                lookup: options.lookup\n            });\n            $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.squarifiedLayout({\n                ids: options.ids,\n                sizes: options.sizes,\n                positionsX: options.positionsX,\n                positionsY: options.positionsY,\n                sizesX: options.sizesX,\n                sizesY: options.sizesY,\n                from: options.from,\n                to: mid - 1,\n                x: options.x + options.width * b,\n                y: options.y,\n                width: options.width * (1 - b),\n                height: options.height,\n                lookup: options.lookup\n            });\n        }\n    }\n    static totalSize(ids, sizes, from, to) {\n        let size = 0;\n        for(let i = from; i <= to; i++)size += sizes[ids[i]];\n        return size;\n    }\n    static _sliceLayout(options) {\n        const totalSize = options.sizes ? $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.totalSize(options.ids, options.sizes, options.from, options.to) : options.to - options.from + 1;\n        let a = 0;\n        for(let i = options.to; i >= options.from; i--){\n            const id = options.ids[i];\n            const index = options.lookup[id];\n            const b = options.sizes ? options.sizes[id] / totalSize : 1 / totalSize;\n            if (options.width > options.height) {\n                options.sizesY[index] = options.height;\n                options.sizesX[index] = options.width * b;\n                options.positionsY[index] = options.y + options.height / 2;\n                options.positionsX[index] = options.x + options.width * a + options.width * b / 2;\n            } else {\n                options.sizesX[index] = options.width;\n                options.sizesY[index] = options.height * b;\n                options.positionsX[index] = options.x + options.width / 2;\n                options.positionsY[index] = options.y + options.height * a + options.height * b / 2;\n            }\n            a += b;\n        }\n    }\n    static aspect(big, small, a, b) {\n        const x = big * b / (small * a / b);\n        if (x < 1) return 1 / x;\n        return x;\n    }\n    static cubifiedLayout(options) {\n        if (options.from > options.to) return;\n        let sliceHeight = 0;\n        let sliceTotal = 0;\n        let previousAspect = 0;\n        let mid = options.to;\n        while(mid >= options.from){\n            const itemSize = options.sizes ? options.sizes[options.ids[mid]] : 1;\n            sliceTotal += itemSize;\n            sliceHeight = options.height * sliceTotal / options.total;\n            const remainingHeight = options.height - sliceHeight;\n            if (remainingHeight < options.minHeight) {\n                mid = options.from;\n                const totalSize = options.sizes ? this.totalSize(options.ids, options.sizes, mid, options.to) : options.to - options.from + 1;\n                sliceHeight = options.height * totalSize / options.total;\n                break;\n            }\n            const itemSide = Math.sqrt(itemSize / sliceTotal) * options.side;\n            const aspect = itemSide > sliceHeight ? sliceHeight / itemSide : itemSide / sliceHeight;\n            if (aspect < previousAspect || mid == options.from) break;\n            previousAspect = aspect;\n            mid--;\n        }\n        $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.squarifiedLayout({\n            ids: options.ids,\n            sizes: options.sizes,\n            positionsX: options.positionsX,\n            positionsY: options.positionsZ,\n            sizesX: options.sizesX,\n            sizesY: options.sizesZ,\n            from: mid,\n            to: options.to,\n            x: options.x,\n            y: options.z,\n            width: options.width,\n            height: options.depth,\n            lookup: options.lookup\n        });\n        for(let j = mid; j <= options.to; j++){\n            const id = options.ids[j];\n            const index = options.lookup[id];\n            options.sizesY[index] = Math.max(sliceHeight, 0.01);\n            options.positionsY[index] = options.isTopToBottom ? options.positionsY[index] = options.y + sliceHeight / 2 : options.y + options.height - sliceHeight / 2;\n        }\n        $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75.cubifiedLayout({\n            ids: options.ids,\n            sizes: options.sizes,\n            positionsX: options.positionsX,\n            positionsY: options.positionsY,\n            positionsZ: options.positionsZ,\n            sizesX: options.sizesX,\n            sizesY: options.sizesY,\n            sizesZ: options.sizesZ,\n            from: options.from,\n            to: mid - 1,\n            x: options.x,\n            y: options.isTopToBottom ? options.y + sliceHeight : options.y,\n            z: options.z,\n            width: options.width,\n            height: options.height - sliceHeight,\n            depth: options.depth,\n            side: options.side,\n            total: options.total - sliceTotal,\n            minHeight: options.minHeight,\n            isTopToBottom: options.isTopToBottom,\n            lookup: options.lookup\n        });\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $33e5ac524dde1fe2$export$a30f602ccece8e25 {\n    static new(a, b) {\n        a.clear();\n        for (let item of b)a.add(item);\n    }\n    static union(a, b) {\n        for (let item of b)a.add(item);\n    }\n    static intersection(a, b) {\n        const c = new Set(b);\n        for (let item of a)if (!c.has(item)) a.delete(item);\n        for (let item of b)if (!a.has(item)) a.delete(item);\n    }\n    static symmetricDifference(a, b) {\n        for (let item of b)if (a.has(item)) a.delete(item);\n        else a.add(item);\n    }\n    static difference(a, b) {\n        for (let item of b)a.delete(item);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $22ccc45c3c88d82f$export$98599ead9515fc06 {\n    static _circle(px, py, r) {\n        return Math.sqrt(px * px + py * py) - r;\n    }\n    static _box(px, py, bx, by) {\n        const dx0 = Math.abs(px) - bx;\n        const dy0 = Math.abs(py) - by;\n        const dx1 = Math.max(dx0, 0);\n        const dy1 = Math.max(dy0, 0);\n        return Math.sqrt(dx1 * dx1 + dy1 * dy1) + Math.min(Math.max(dx0, dy0), 0);\n    }\n    static _create(width, height, edge, sdf) {\n        const pixels = new Uint8ClampedArray(width * height * 4);\n        for(let y = 0; y < height; y++)for(let x = 0; x < width; x++){\n            const d = edge - sdf(x - width / 2, y - height / 2);\n            const offset = (x + y * height) * 4;\n            pixels[offset] = d;\n            pixels[offset + 1] = d;\n            pixels[offset + 2] = d;\n            pixels[offset + 3] = 0xff;\n        }\n        return new ImageData(pixels, width, height);\n    }\n    static circle(imageWidth, imageHeight, radius, edgeValue) {\n        const sdf = (x, y)=>this._circle(x, y, radius);\n        return this._create(imageWidth, imageHeight, edgeValue, sdf);\n    }\n    static box(imageWidth, imageHeight, boxWidth, boxHeight, edgeValue, rounding = 0) {\n        const sdf = (x, y)=>this._box(x, y, boxWidth - rounding, boxHeight - rounding) - rounding;\n        return this._create(imageWidth, imageHeight, edgeValue, sdf);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $8c233993336ed54a$export$1c9ca61bb2a30bed {\n    static orthonormalBasis(n, b1, b2) {\n        if (n[0] > 0.9) (0, $31054a6c69637582$exports).copy(b1, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY);\n        else (0, $31054a6c69637582$exports).copy(b1, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX);\n        (0, $31054a6c69637582$exports).scaleAndAdd(b1, b1, n, -(0, $31054a6c69637582$exports).dot(b1, n));\n        (0, $31054a6c69637582$exports).normalize(b1, b1);\n        (0, $31054a6c69637582$exports).cross(b2, n, b1);\n    }\n}\n\n\n\n\nvar $f35934b4176df23d$exports = {};\n\n$parcel$export($f35934b4176df23d$exports, \"Bar\", () => $04ac1aab8410c289$export$bbc6c6369b38e3d1);\n$parcel$export($f35934b4176df23d$exports, \"Cube\", () => $e6a9bd14c029e5f0$export$a15f0a83a652dd40);\n$parcel$export($f35934b4176df23d$exports, \"Line\", () => $ba0727adc7665af3$export$17d680238e50603e);\n$parcel$export($f35934b4176df23d$exports, \"Tree\", () => $82ef55b00856d713$export$7fbedc92909ed28e);\n$parcel$export($f35934b4176df23d$exports, \"PythagorasTree\", () => $82ef55b00856d713$export$b74c7d46bc92515c);\n$parcel$export($f35934b4176df23d$exports, \"Scatter\", () => $5c05d7e02492b136$export$1c460fb4285edadc);\n$parcel$export($f35934b4176df23d$exports, \"Sheet\", () => $8be06baf1546635b$export$a9bf29f8d87ebbee);\n$parcel$export($f35934b4176df23d$exports, \"SquarifiedTreeMap\", () => $05bc96b85bb3a34e$export$ce1cde616fb0ca7e);\n$parcel$export($f35934b4176df23d$exports, \"CubifiedTreeMap\", () => $05bc96b85bb3a34e$export$3ca73d0a8bf0e96e);\n$parcel$export($f35934b4176df23d$exports, \"Stack\", () => $385fd844fe700a1a$export$694e0d28c7ffc90c);\n$parcel$export($f35934b4176df23d$exports, \"StackTreeMap\", () => $385fd844fe700a1a$export$75310880a535fd3b);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\nclass $04ac1aab8410c289$export$bbc6c6369b38e3d1 extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const positionScalingX = options.positionScalingX === undefined ? 1 : options.positionScalingX;\n        const positionScalingZ = options.positionScalingZ === undefined ? 1 : options.positionScalingZ;\n        const heightScaling = options.heightScaling === undefined ? 1 : options.heightScaling;\n        const minHeight = options.minHeight === undefined ? 0 : options.minHeight;\n        const paddingX = options.paddingX == undefined ? 0 : options.paddingX * positionScalingX;\n        const paddingZ = options.paddingZ == undefined ? 0 : options.paddingZ * positionScalingZ;\n        if (!this._positions || this._positions.length < buffer.length * 3) {\n            this._positions = new Float32Array(buffer.length * 3);\n            this._sizes = new Float32Array(buffer.length * 3);\n        }\n        this.minLayoutBoundsX = Number.MAX_VALUE;\n        this.minLayoutBoundsY = Number.MAX_VALUE;\n        this.minLayoutBoundsZ = Number.MAX_VALUE;\n        this.maxLayoutBoundsX = -Number.MAX_VALUE;\n        this.maxLayoutBoundsY = -Number.MAX_VALUE;\n        this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n        let positionX, positionY, positionZ;\n        let sizeX, sizeY, sizeZ;\n        const lookup = buffer.lookup;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            const height = Math.max(options.heights ? options.heights[id] * heightScaling : heightScaling, minHeight);\n            positionX = options.positionsX ? options.positionsX[id] * positionScalingX : 0;\n            positionY = height / 2;\n            positionZ = options.positionsZ ? options.positionsZ[id] * positionScalingZ : 0;\n            this._positions[index * 3] = positionX;\n            this._positions[index * 3 + 1] = positionY;\n            this._positions[index * 3 + 2] = positionZ;\n            sizeX = (options.sizeX === undefined ? options.sizesX ? options.sizesX[id] : 1 : options.sizeX) * positionScalingX;\n            sizeY = Math.abs(height);\n            sizeZ = (options.sizeZ === undefined ? options.sizesZ ? options.sizesZ[id] : 1 : options.sizeZ) * positionScalingZ;\n            this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, positionX - sizeX / 2);\n            this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, positionY - sizeY / 2);\n            this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, positionZ - sizeZ / 2);\n            this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, positionX + sizeX / 2);\n            this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, positionY + sizeY / 2);\n            this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, positionZ + sizeZ / 2);\n            this._sizes[index * 3] = Math.max(sizeX - paddingX, 0);\n            this._sizes[index * 3 + 1] = sizeY;\n            this._sizes[index * 3 + 2] = Math.max(sizeZ - paddingZ, 0);\n        }\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        (0, $39ece26d1239bb77$exports).rotationTo(_quat, this._core.config.identityRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            let positionX = this._positions[index * 3];\n            let positionY = this._positions[index * 3 + 1];\n            let positionZ = this._positions[index * 3 + 2];\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            _vec3[0] = this._sizes[index * 3] * this._boundsScaling;\n            _vec3[1] = this._sizes[index * 3 + 1] * this._boundsScaling;\n            _vec3[2] = this._sizes[index * 3 + 2] * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, _vec3);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                if (options.colors1) {\n                    const color1 = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors1[id], minColor, maxColor, size / 2, 1 - size / 2);\n                    (0, $91b0cc4981465964$exports).set(_vec2, color, color1);\n                } else (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\nclass $e6a9bd14c029e5f0$export$a15f0a83a652dd40 extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    getPositionX(index) {\n        return this._positions[index * 3];\n    }\n    getPositionY(index) {\n        return this._positions[index * 3 + 1];\n    }\n    getPositionZ(index) {\n        return this._positions[index * 3 + 2];\n    }\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const side = options.side === undefined ? Math.ceil(Math.cbrt(count)) : options.side;\n        if (!this._positions || this._positions.length < buffer.length * 3) this._positions = new Float32Array(buffer.length * 3);\n        this.minLayoutBoundsX = 0;\n        this.minLayoutBoundsY = 0;\n        this.minLayoutBoundsZ = 0;\n        this.maxLayoutBoundsX = 0;\n        this.maxLayoutBoundsY = 0;\n        this.maxLayoutBoundsZ = 0;\n        const lookup = buffer.lookup;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            const y = Math.floor(i / (side * side));\n            const z = Math.floor((i - y * side * side) / side);\n            const x = i - y * side * side - z * side;\n            this._positions[index * 3] = x;\n            this._positions[index * 3 + 1] = y;\n            this._positions[index * 3 + 2] = z;\n            this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, x);\n            this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, y);\n            this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, z);\n        }\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const padding = options.padding === undefined ? 0 : options.padding;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        const scale = (0, $31054a6c69637582$exports).fromValues((1 - padding) * this._boundsScaling, (1 - padding) * this._boundsScaling, (1 - padding) * this._boundsScaling);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            let positionX = this._positions[index * 3];\n            let positionY = this._positions[index * 3 + 1];\n            let positionZ = this._positions[index * 3 + 2];\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, scale);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                _vec2[0] = color;\n                _vec2[1] = color;\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [\n                options.materialColors[id * 3],\n                options.materialColors[id * 3 + 1],\n                options.materialColors[id * 3 + 2]\n            ] : [\n                0,\n                0,\n                0\n            ]);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [\n                options.segmentColors[id * 4],\n                options.segmentColors[id * 4 + 1],\n                options.segmentColors[id * 4 + 2],\n                options.segmentColors[id * 4 + 3]\n            ] : [\n                buffer.idColors[id * 4],\n                buffer.idColors[id * 4 + 1],\n                buffer.idColors[id * 4 + 2],\n                buffer.idColors[id * 4 + 3]\n            ]);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)} ms`);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\nclass $ba0727adc7665af3$export$17d680238e50603e extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    layout(buffer, ids, fromIds, toIds, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const positionScalingX = options.positionScalingX === undefined ? 1 : options.positionScalingX;\n        const positionScalingY = options.positionScalingY === undefined ? 1 : options.positionScalingY;\n        const positionScalingZ = options.positionScalingZ === undefined ? 1 : options.positionScalingZ;\n        const sizeScalingX = options.sizeScaling === undefined ? options.sizeScalingX === undefined ? 1 : options.sizeScalingX : options.sizeScaling;\n        const sizeScalingY = options.sizeScaling === undefined ? options.sizeScalingY === undefined ? 1 : options.sizeScalingY : options.sizeScaling;\n        const sizeScalingZ = options.sizeScaling === undefined ? options.sizeScalingZ === undefined ? 1 : options.sizeScalingZ : options.sizeScaling;\n        const minSize = options.minSize === undefined ? 0 : options.minSize;\n        const offsetScaling = options.offsetScaling === undefined ? 1 : options.offsetScaling;\n        if (!this._positions || this._positions.length < buffer.length * 3) {\n            this._positions = new Float32Array(buffer.length * 3);\n            this._sizes = new Float32Array(buffer.length * 3);\n            this._rotations = new Float32Array(buffer.length * 4);\n        }\n        this.minLayoutBoundsX = Number.MAX_VALUE;\n        this.minLayoutBoundsY = Number.MAX_VALUE;\n        this.minLayoutBoundsZ = Number.MAX_VALUE;\n        this.maxLayoutBoundsX = -Number.MAX_VALUE;\n        this.maxLayoutBoundsY = -Number.MAX_VALUE;\n        this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const direction = (0, $31054a6c69637582$exports).create();\n        const lookup = buffer.lookup;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const fromId = fromIds[id];\n            const toId = toIds[id];\n            const index = lookup[id];\n            let toPositionX = options.positionsX ? options.positionsX[toId] * positionScalingX : 0;\n            let toPositionY = options.positionsY ? options.positionsY[toId] * positionScalingY : 0;\n            let toPositionZ = options.positionsZ ? options.positionsZ[toId] * positionScalingZ : 0;\n            let fromPositionX = options.positionsX ? options.positionsX[fromId] * positionScalingX : 0;\n            let fromPositionY = options.positionsY ? options.positionsY[fromId] * positionScalingY : 0;\n            let fromPositionZ = options.positionsZ ? options.positionsZ[fromId] * positionScalingZ : 0;\n            if (fromId == toId) {\n                this._sizes[index * 3] = 0;\n                this._sizes[index * 3 + 1] = 0;\n                this._sizes[index * 3 + 2] = 0;\n                this._rotations[index * 4] = 0;\n                this._rotations[index * 4 + 1] = 0;\n                this._rotations[index * 4 + 2] = 0;\n                this._rotations[index * 4 + 3] = 1;\n            } else {\n                direction[0] = toPositionX - fromPositionX;\n                direction[1] = toPositionY - fromPositionY;\n                direction[2] = toPositionZ - fromPositionZ;\n                let length = (0, $31054a6c69637582$exports).length(direction);\n                (0, $31054a6c69637582$exports).scale(direction, direction, 1 / length);\n                (0, $39ece26d1239bb77$exports).rotationTo(_quat, this._core.config.identityRotation, direction);\n                this._rotations[index * 4] = _quat[0];\n                this._rotations[index * 4 + 1] = _quat[1];\n                this._rotations[index * 4 + 2] = _quat[2];\n                this._rotations[index * 4 + 3] = _quat[3];\n                if (options.offsets) {\n                    const fromOffset = options.offsets[fromId] * offsetScaling / 2;\n                    const toOffset = options.offsets[toId] * offsetScaling / 2;\n                    toPositionX -= direction[0] * toOffset;\n                    toPositionY -= direction[1] * toOffset;\n                    toPositionZ -= direction[2] * toOffset;\n                    fromPositionX += direction[0] * fromOffset;\n                    fromPositionY += direction[1] * fromOffset;\n                    fromPositionZ += direction[2] * fromOffset;\n                    length = Math.max(length - toOffset - fromOffset, minSize);\n                }\n                this._sizes[index * 3 + 1] = Math.max(length * sizeScalingY, minSize);\n                if (options.lineSizes) {\n                    this._sizes[index * 3] = Math.max(options.lineSizes[id] * sizeScalingX, minSize);\n                    this._sizes[index * 3 + 2] = Math.max(options.lineSizes[id] * sizeScalingZ, minSize);\n                } else if (options.endSizes) {\n                    this._sizes[index * 3] = Math.max(options.endSizes[fromId] * sizeScalingX, minSize);\n                    this._sizes[index * 3 + 2] = Math.max(options.endSizes[toId] * sizeScalingZ, minSize);\n                } else {\n                    this._sizes[index * 3] = sizeScalingX;\n                    this._sizes[index * 3 + 2] = sizeScalingZ;\n                }\n            }\n            _vec3[0] = (fromPositionX + toPositionX) / 2;\n            _vec3[1] = (fromPositionY + toPositionY) / 2;\n            _vec3[2] = (fromPositionZ + toPositionZ) / 2;\n            this._positions[index * 3] = _vec3[0];\n            this._positions[index * 3 + 1] = _vec3[1];\n            this._positions[index * 3 + 2] = _vec3[2];\n            this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, fromPositionX);\n            this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, fromPositionY);\n            this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, fromPositionZ);\n            this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, toPositionX);\n            this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, toPositionY);\n            this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, toPositionZ);\n            this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, fromPositionX);\n            this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, fromPositionY);\n            this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, fromPositionZ);\n            this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, toPositionX);\n            this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, toPositionY);\n            this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, toPositionZ);\n        }\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, fromIds, toIds, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const endMinColor = options.endMinColor === undefined ? 0 : options.endMinColor;\n        const endMaxColor = options.endMaxColor === undefined ? 1 : options.endMaxColor;\n        const lineMinColor = options.lineMinColor === undefined ? 0 : options.lineMinColor;\n        const lineMaxColor = options.lineMaxColor === undefined ? 1 : options.lineMaxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const fromId = fromIds[id];\n            const toId = toIds[id];\n            const index = lookup[id];\n            let positionX = this._positions[index * 3];\n            let positionY = this._positions[index * 3 + 1];\n            let positionZ = this._positions[index * 3 + 2];\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            _vec3[0] = this._sizes[index * 3] * this._boundsScaling;\n            _vec3[1] = this._sizes[index * 3 + 1] * this._boundsScaling;\n            _vec3[2] = this._sizes[index * 3 + 2] * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, _vec3);\n            _quat[0] = this._rotations[index * 4];\n            _quat[1] = this._rotations[index * 4 + 1];\n            _quat[2] = this._rotations[index * 4 + 2];\n            _quat[3] = this._rotations[index * 4 + 3];\n            if (reverseX) {\n                _quat[1] = -_quat[1];\n                _quat[2] = -_quat[2];\n            }\n            if (reverseY) {\n                _quat[0] = -_quat[0];\n                _quat[2] = -_quat[2];\n            }\n            if (reverseZ) {\n                _quat[0] = -_quat[0];\n                _quat[1] = -_quat[1];\n            }\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            let size;\n            if (options.endColors) {\n                size = 1 / (endMaxColor - endMinColor + 1);\n                const fromColor = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.endColors[fromId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n                const toColor = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.endColors[toId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, fromColor, toColor);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else if (options.lineColors) {\n                size = 1 / (lineMaxColor - lineMinColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.lineColors[id], lineMinColor, lineMaxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [\n                options.materialColors[id * 3],\n                options.materialColors[id * 3 + 1],\n                options.materialColors[id * 3 + 2]\n            ] : [\n                0,\n                0,\n                0\n            ]);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [\n                options.segmentColors[id * 4],\n                options.segmentColors[id * 4 + 1],\n                options.segmentColors[id * 4 + 2],\n                options.segmentColors[id * 4 + 3]\n            ] : [\n                buffer.idColors[id * 4],\n                buffer.idColors[id * 4 + 1],\n                buffer.idColors[id * 4 + 2],\n                buffer.idColors[id * 4 + 3]\n            ]);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\n\nclass $82ef55b00856d713$export$b74c7d46bc92515c extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    get levels() {\n        return this._levels;\n    }\n    get maxLevel() {\n        return this._maxLevel;\n    }\n    get volumes() {\n        return this._volumes;\n    }\n    constructor(core){\n        super(core);\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._quat = (0, $39ece26d1239bb77$exports).create();\n        this._parentRight = (0, $31054a6c69637582$exports).create();\n        this._parentUp = (0, $31054a6c69637582$exports).create();\n        this._parentForward = (0, $31054a6c69637582$exports).create();\n        this._parentTranslation = (0, $31054a6c69637582$exports).create();\n        this._parentScale = (0, $31054a6c69637582$exports).create();\n        this._parentRotation = (0, $39ece26d1239bb77$exports).create();\n        this._parentTwist = (0, $39ece26d1239bb77$exports).create();\n        this._childRotation = (0, $39ece26d1239bb77$exports).create();\n    }\n    static calculateTotalVertices(level) {\n        return (2 << level) - 1;\n    }\n    static calculateMaxLevel(vertices) {\n        return Math.ceil(Math.log2(vertices + 1)) - 1;\n    }\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const scalingX = options.scalingX === undefined ? 1 : options.scalingX;\n        const scalingY = options.scalingY === undefined ? 1 : options.scalingY;\n        const scalingZ = options.scalingZ === undefined ? 1 : options.scalingZ;\n        this._angle = options.angle === undefined ? (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(45) : options.angle;\n        this._randomAngle = options.randomAngle === undefined ? 0 : options.randomAngle;\n        this._twist = options.twist === undefined ? 0 : options.twist;\n        this._randomTwist = options.randomTwist === undefined ? 0 : options.randomTwist;\n        if (!this._positions || this._positions.length < buffer.length * 3) {\n            this._positions = new Float64Array(buffer.length * 3);\n            this._sizes = new Float64Array(buffer.length * 3);\n            this._rotations = new Float64Array(buffer.length * 4);\n            this._levels = new Uint32Array(buffer.length);\n            this._volumes = new Float64Array(buffer.length);\n        }\n        this._maxLevel = $82ef55b00856d713$export$b74c7d46bc92515c.calculateMaxLevel(ids.length);\n        const lookup = buffer.lookup;\n        const id = ids[0];\n        const index = lookup[id];\n        this._levels[index] = 0;\n        this._positions[index * 3] = 0;\n        this._positions[index * 3 + 1] = 0;\n        this._positions[index * 3 + 2] = 0;\n        this.minLayoutBoundsX = 0;\n        this.minLayoutBoundsY = 0;\n        this.minLayoutBoundsZ = 0;\n        this.maxLayoutBoundsX = 0;\n        this.maxLayoutBoundsY = 0;\n        this.maxLayoutBoundsZ = 0;\n        this._rotations[index * 4] = 0;\n        this._rotations[index * 4 + 1] = 0;\n        this._rotations[index * 4 + 2] = 0;\n        this._rotations[index * 4 + 3] = 1;\n        this._sizes[index * 3] = scalingX;\n        this._sizes[index * 3 + 1] = scalingY;\n        this._sizes[index * 3 + 2] = scalingZ;\n        this._volumes[index] = scalingX * scalingY * scalingZ;\n        this._count = 1;\n        const pseudoRandom = new (0, $2d4d1eb6f32f02f2$export$b8e288c3467acb0e)(0);\n        this._branch(index, ids, lookup, pseudoRandom);\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${ids.length} vertices ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < ids.length; i++){\n            const id = ids[i];\n            const index = lookup[id];\n            let positionX = this._positions[index * 3];\n            let positionY = this._positions[index * 3 + 1];\n            let positionZ = this._positions[index * 3 + 2];\n            if (reverseX) positionX = this.modelOriginX + this.modelOriginX - positionX;\n            if (reverseY) positionY = this.modelOriginY + this.modelOriginY - positionY;\n            if (reverseZ) positionZ = this.modelOriginZ + this.modelOriginZ - positionZ;\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            _vec3[0] = this._sizes[index * 3] * this._boundsScaling;\n            _vec3[1] = this._sizes[index * 3 + 1] * this._boundsScaling;\n            _vec3[2] = this._sizes[index * 3 + 2] * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, _vec3);\n            _quat[0] = this._rotations[index * 4];\n            _quat[1] = this._rotations[index * 4 + 1];\n            _quat[2] = this._rotations[index * 4 + 2];\n            _quat[3] = this._rotations[index * 4 + 3];\n            if (reverseX) {\n                _quat[1] = -_quat[1];\n                _quat[2] = -_quat[2];\n            }\n            if (reverseY) {\n                _quat[0] = -_quat[0];\n                _quat[2] = -_quat[2];\n            }\n            if (reverseZ) {\n                _quat[0] = -_quat[0];\n                _quat[1] = -_quat[1];\n            }\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = i / (ids.length - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = i / (ids.length - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${ids.length} vertices ${Math.round(window.performance.now() - start)}ms`);\n    }\n    _branch(parentIndex, ids, lookup, pseudoRandom) {\n        const parentLevel = this._levels[parentIndex];\n        if (parentLevel < this._maxLevel && this._count < ids.length) {\n            let angle = this._angle + (pseudoRandom.nextFloat() * 2 - 1) * this._randomAngle;\n            let twist = this._twist + (pseudoRandom.nextFloat() * 2 - 1) * this._randomTwist;\n            angle = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp(angle, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO);\n            twist = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp(twist, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO);\n            this._parentTranslation[0] = this._positions[parentIndex * 3];\n            this._parentTranslation[1] = this._positions[parentIndex * 3 + 1];\n            this._parentTranslation[2] = this._positions[parentIndex * 3 + 2];\n            this._parentRotation[0] = this._rotations[parentIndex * 4];\n            this._parentRotation[1] = this._rotations[parentIndex * 4 + 1];\n            this._parentRotation[2] = this._rotations[parentIndex * 4 + 2];\n            this._parentRotation[3] = this._rotations[parentIndex * 4 + 3];\n            this._parentScale[0] = this._sizes[parentIndex * 3];\n            this._parentScale[1] = this._sizes[parentIndex * 3 + 1];\n            this._parentScale[2] = this._sizes[parentIndex * 3 + 2];\n            (0, $31054a6c69637582$exports).transformQuat(this._parentUp, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._parentRotation);\n            (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, this._parentUp, twist);\n            (0, $39ece26d1239bb77$exports).normalize(this._quat, this._quat);\n            (0, $39ece26d1239bb77$exports).multiply(this._parentTwist, this._quat, this._parentRotation);\n            (0, $31054a6c69637582$exports).transformQuat(this._parentRight, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, this._parentTwist);\n            (0, $31054a6c69637582$exports).transformQuat(this._parentForward, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ, this._parentTwist);\n            const childId1 = ids[this._count++];\n            const childIndex1 = lookup[childId1];\n            let cos = Math.cos(angle);\n            this._sizes[childIndex1 * 3] = this._parentScale[0] * cos;\n            this._sizes[childIndex1 * 3 + 1] = this._parentScale[1] * cos;\n            this._sizes[childIndex1 * 3 + 2] = this._parentScale[2] * cos;\n            (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, this._parentForward, angle);\n            (0, $39ece26d1239bb77$exports).normalize(this._quat, this._quat);\n            (0, $39ece26d1239bb77$exports).multiply(this._childRotation, this._quat, this._parentTwist);\n            this._rotations[childIndex1 * 4] = this._childRotation[0];\n            this._rotations[childIndex1 * 4 + 1] = this._childRotation[1];\n            this._rotations[childIndex1 * 4 + 2] = this._childRotation[2];\n            this._rotations[childIndex1 * 4 + 3] = this._childRotation[3];\n            const halfparentScaleX = this._parentScale[0] * 0.5;\n            const halfparentScaleY = this._parentScale[1] * 0.5;\n            this._vec3[0] = this._parentUp[0] * halfparentScaleY * cos + this._parentRight[0] * halfparentScaleX * cos;\n            this._vec3[1] = this._parentUp[1] * halfparentScaleY * cos + this._parentRight[1] * halfparentScaleX * cos;\n            this._vec3[2] = this._parentUp[2] * halfparentScaleY * cos + this._parentRight[2] * halfparentScaleX * cos;\n            (0, $31054a6c69637582$exports).transformQuat(this._vec3, this._vec3, this._quat);\n            const childTranslationX = this._parentTranslation[0] + this._vec3[0] + this._parentUp[0] * halfparentScaleY - this._parentRight[0] * halfparentScaleX;\n            const childTranslationY = this._parentTranslation[1] + this._vec3[1] + this._parentUp[1] * halfparentScaleY - this._parentRight[1] * halfparentScaleX;\n            const childTranslationZ = this._parentTranslation[2] + this._vec3[2] + this._parentUp[2] * halfparentScaleY - this._parentRight[2] * halfparentScaleX;\n            this._positions[childIndex1 * 3] = childTranslationX;\n            this._positions[childIndex1 * 3 + 1] = childTranslationY;\n            this._positions[childIndex1 * 3 + 2] = childTranslationZ;\n            this._levels[childIndex1] = parentLevel + 1;\n            this._volumes[childIndex1] = this._sizes[childIndex1 * 3] * this._sizes[childIndex1 * 3 + 1] * this._sizes[childIndex1 * 3 + 2];\n            this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, childTranslationX);\n            this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, childTranslationY);\n            this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, childTranslationZ);\n            this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, childTranslationX);\n            this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, childTranslationY);\n            this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, childTranslationZ);\n            if (this._count < ids.length) {\n                const childId2 = ids[this._count++];\n                const childIndex2 = lookup[childId2];\n                cos = Math.cos((0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO - angle);\n                this._sizes[childIndex2 * 3] = this._parentScale[0] * cos;\n                this._sizes[childIndex2 * 3 + 1] = this._parentScale[1] * cos;\n                this._sizes[childIndex2 * 3 + 2] = this._parentScale[2] * cos;\n                (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, this._parentForward, angle - (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO);\n                (0, $39ece26d1239bb77$exports).normalize(this._quat, this._quat);\n                (0, $39ece26d1239bb77$exports).multiply(this._childRotation, this._quat, this._parentTwist);\n                this._rotations[childIndex2 * 4] = this._childRotation[0];\n                this._rotations[childIndex2 * 4 + 1] = this._childRotation[1];\n                this._rotations[childIndex2 * 4 + 2] = this._childRotation[2];\n                this._rotations[childIndex2 * 4 + 3] = this._childRotation[3];\n                this._vec3[0] = this._parentUp[0] * halfparentScaleY * cos - this._parentRight[0] * halfparentScaleX * cos;\n                this._vec3[1] = this._parentUp[1] * halfparentScaleY * cos - this._parentRight[1] * halfparentScaleX * cos;\n                this._vec3[2] = this._parentUp[2] * halfparentScaleY * cos - this._parentRight[2] * halfparentScaleX * cos;\n                (0, $31054a6c69637582$exports).transformQuat(this._vec3, this._vec3, this._quat);\n                const childTranslationX = this._parentTranslation[0] + this._vec3[0] + this._parentUp[0] * halfparentScaleY + this._parentRight[0] * halfparentScaleX;\n                const childTranslationY = this._parentTranslation[1] + this._vec3[1] + this._parentUp[1] * halfparentScaleY + this._parentRight[1] * halfparentScaleX;\n                const childTranslationZ = this._parentTranslation[2] + this._vec3[2] + this._parentUp[2] * halfparentScaleY + this._parentRight[2] * halfparentScaleX;\n                this._positions[childIndex2 * 3] = childTranslationX;\n                this._positions[childIndex2 * 3 + 1] = childTranslationY;\n                this._positions[childIndex2 * 3 + 2] = childTranslationZ;\n                this._levels[childIndex2] = parentLevel + 1;\n                this._volumes[childIndex2] = this._sizes[childIndex2 * 3] * this._sizes[childIndex2 * 3 + 1] * this._sizes[childIndex2 * 3 + 2];\n                this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, childTranslationX);\n                this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, childTranslationY);\n                this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, childTranslationZ);\n                this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, childTranslationX);\n                this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, childTranslationY);\n                this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, childTranslationZ);\n                this._branch(childIndex1, ids, lookup, pseudoRandom);\n                this._branch(childIndex2, ids, lookup, pseudoRandom);\n            }\n        }\n    }\n}\nclass $82ef55b00856d713$export$7fbedc92909ed28e extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    getPositionX(index) {\n        return this._positions[index * 3];\n    }\n    getPositionY(index) {\n        return this._positions[index * 3 + 1];\n    }\n    getPositionZ(index) {\n        return this._positions[index * 3 + 2];\n    }\n    getSizeX(index) {\n        return this._sizes[index * 3];\n    }\n    getSizeY(index) {\n        return this._sizes[index * 3 + 1];\n    }\n    getSizeZ(index) {\n        return this._sizes[index * 3 + 2];\n    }\n    constructor(core){\n        super(core);\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._quat = (0, $39ece26d1239bb77$exports).create();\n        this._childRotation = (0, $39ece26d1239bb77$exports).create();\n        this._parentRight = (0, $31054a6c69637582$exports).create();\n        this._parentUp = (0, $31054a6c69637582$exports).create();\n        this._parentForward = (0, $31054a6c69637582$exports).create();\n        this._parentRotation = (0, $39ece26d1239bb77$exports).create();\n        this._parentTwist = (0, $39ece26d1239bb77$exports).create();\n    }\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const rootId = options.rootId;\n        this._sizeX = options.sizeX === undefined ? 1 : options.sizeX;\n        this._sizeY = options.sizeY === undefined ? 1 : options.sizeY;\n        this._sizeZ = options.sizeZ === undefined ? 1 : options.sizeZ;\n        this._angle = options.angle === undefined ? (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(45) : options.angle;\n        this._randomAngle = options.randomAngle === undefined ? 0 : options.randomAngle;\n        this._twist = options.twist === undefined ? 0 : options.twist;\n        this._lengthScaling = options.lengthScaling === undefined ? 1 : options.lengthScaling;\n        this._thicknessScaling = options.thicknessScaling === undefined ? 1 : options.thicknessScaling;\n        this._randomTwist = options.randomTwist === undefined ? 0 : options.randomTwist;\n        this._randomSplit = options.randomSplit === undefined ? 0 : options.randomSplit;\n        this._randomLengthScaling = options.randomLengthScaling === undefined ? 0 : options.randomLengthScaling;\n        this._randomThicknessScaling = options.randomThicknessScaling === undefined ? 0 : options.randomThicknessScaling;\n        this._minLength = options.minLength === undefined ? 0 : options.minLength;\n        this._minThickness = options.minThickness === undefined ? 0 : options.minThickness;\n        this._lengthScalings = options.lengthScalings;\n        this._thicknessScalings = options.thicknessScalings;\n        this._splitAngles = options.splitAngles;\n        this._angles = options.angles;\n        if (!this._positions || this._positions.length < buffer.length * 3) {\n            this._positions = new Float64Array(buffer.length * 3);\n            this._sizes = new Float64Array(buffer.length * 3);\n            this._rotations = new Float64Array(buffer.length * 4);\n            this._parentRights = new Float64Array(buffer.length * 3);\n            this._parentUps = new Float64Array(buffer.length * 3);\n            this._parentForwards = new Float64Array(buffer.length * 3);\n            this._parentTwists = new Float64Array(buffer.length * 4);\n        }\n        const lookup = buffer.lookup;\n        const indices = {};\n        const children = {};\n        for(let i = 0; i < ids.length; i++){\n            const id = ids[i];\n            const index = lookup[id];\n            const parentId = options.parentIds[index];\n            const childId = options.childIds[index];\n            indices[childId] = index;\n            if (childId === rootId) children[rootId] = [];\n            else {\n                if (children[parentId] === undefined) children[parentId] = [];\n                children[parentId].push(childId);\n            }\n        }\n        const index = indices[rootId];\n        this._positions[index * 3] = 0;\n        this._positions[index * 3 + 1] = 0;\n        this._positions[index * 3 + 2] = 0;\n        this.minLayoutBoundsX = 0;\n        this.minLayoutBoundsY = 0;\n        this.minLayoutBoundsZ = 0;\n        this.maxLayoutBoundsX = 0;\n        this.maxLayoutBoundsY = 0;\n        this.maxLayoutBoundsZ = 0;\n        this._rotations[index * 4] = 0;\n        this._rotations[index * 4 + 1] = 0;\n        this._rotations[index * 4 + 2] = 0;\n        this._rotations[index * 4 + 3] = 1;\n        this._sizes[index * 3 + 1] = this._sizeY;\n        this._sizes[index * 3] = this._sizeX;\n        this._sizes[index * 3 + 2] = this._sizeZ;\n        if (this._lengthScalings) {\n            this._lengthScaling = this._lengthScalings[index];\n            this._sizes[index * 3 + 1] *= this._lengthScaling;\n        }\n        if (this._thicknessScalings) {\n            this._thicknessScaling = this._thicknessScalings[index];\n            this._sizes[index * 3] *= this._thicknessScaling;\n            this._sizes[index * 3 + 2] *= this._thicknessScaling;\n        }\n        const pseudoRandom = new (0, $2d4d1eb6f32f02f2$export$b8e288c3467acb0e)(0);\n        this._branch(rootId, indices, children, pseudoRandom);\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${ids.length} vertices ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < ids.length; i++){\n            const id = ids[i];\n            const index = lookup[id];\n            let positionX = this._positions[index * 3];\n            let positionY = this._positions[index * 3 + 1];\n            let positionZ = this._positions[index * 3 + 2];\n            if (reverseX) positionX = this.modelOriginX + this.modelOriginX - positionX;\n            if (reverseY) positionY = this.modelOriginY + this.modelOriginY - positionY;\n            if (reverseZ) positionZ = this.modelOriginZ + this.modelOriginZ - positionZ;\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            _vec3[0] = this._sizes[index * 3] * this._boundsScaling;\n            _vec3[1] = this._sizes[index * 3 + 1] * this._boundsScaling;\n            _vec3[2] = this._sizes[index * 3 + 2] * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, _vec3);\n            _quat[0] = this._rotations[index * 4];\n            _quat[1] = this._rotations[index * 4 + 1];\n            _quat[2] = this._rotations[index * 4 + 2];\n            _quat[3] = this._rotations[index * 4 + 3];\n            if (reverseX) {\n                _quat[1] = -_quat[1];\n                _quat[2] = -_quat[2];\n            }\n            if (reverseY) {\n                _quat[0] = -_quat[0];\n                _quat[2] = -_quat[2];\n            }\n            if (reverseZ) {\n                _quat[0] = -_quat[0];\n                _quat[1] = -_quat[1];\n            }\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = i / (ids.length - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = i / (ids.length - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [\n                options.materialColors[id * 3],\n                options.materialColors[id * 3 + 1],\n                options.materialColors[id * 3 + 2]\n            ] : [\n                0,\n                0,\n                0\n            ]);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [\n                options.segmentColors[id * 4],\n                options.segmentColors[id * 4 + 1],\n                options.segmentColors[id * 4 + 2],\n                options.segmentColors[id * 4 + 3]\n            ] : [\n                buffer.idColors[id * 4],\n                buffer.idColors[id * 4 + 1],\n                buffer.idColors[id * 4 + 2],\n                buffer.idColors[id * 4 + 3]\n            ]);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${ids.length} vertices ${Math.round(window.performance.now() - start)}ms`);\n    }\n    _branch(parentId, indices, children, pseudoRandom) {\n        const childIds = children[parentId];\n        const parentIndex = indices[parentId];\n        this._parentRotation[0] = this._rotations[parentIndex * 4];\n        this._parentRotation[1] = this._rotations[parentIndex * 4 + 1];\n        this._parentRotation[2] = this._rotations[parentIndex * 4 + 2];\n        this._parentRotation[3] = this._rotations[parentIndex * 4 + 3];\n        (0, $31054a6c69637582$exports).transformQuat(this._parentUp, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._parentRotation);\n        this._parentUps[parentIndex * 3] = this._parentUp[0];\n        this._parentUps[parentIndex * 3 + 1] = this._parentUp[1];\n        this._parentUps[parentIndex * 3 + 2] = this._parentUp[2];\n        let twist = this._twist + (pseudoRandom.nextFloat() * 2 - 1) * this._randomTwist;\n        twist = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp(twist, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO);\n        (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, this._parentUp, twist);\n        (0, $39ece26d1239bb77$exports).normalize(this._quat, this._quat);\n        (0, $39ece26d1239bb77$exports).multiply(this._parentTwist, this._quat, this._parentRotation);\n        this._parentTwists[parentIndex * 4] = this._parentTwist[0];\n        this._parentTwists[parentIndex * 4 + 1] = this._parentTwist[1];\n        this._parentTwists[parentIndex * 4 + 2] = this._parentTwist[2];\n        this._parentTwists[parentIndex * 4 + 3] = this._parentTwist[3];\n        (0, $31054a6c69637582$exports).transformQuat(this._parentRight, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, this._parentTwist);\n        this._parentRights[parentIndex * 3] = this._parentRight[0];\n        this._parentRights[parentIndex * 3 + 1] = this._parentRight[1];\n        this._parentRights[parentIndex * 3 + 2] = this._parentRight[2];\n        (0, $31054a6c69637582$exports).transformQuat(this._parentForward, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ, this._parentTwist);\n        this._parentForwards[parentIndex * 3] = this._parentForward[0];\n        this._parentForwards[parentIndex * 3 + 1] = this._parentForward[1];\n        this._parentForwards[parentIndex * 3 + 2] = this._parentForward[2];\n        for(let i = 0; i < childIds.length; i++){\n            const childId = childIds[i];\n            const childIndex = indices[childId];\n            const parentScaleX = this._sizes[parentIndex * 3];\n            const parentScaleY = this._sizes[parentIndex * 3 + 1];\n            const parentScaleZ = this._sizes[parentIndex * 3 + 2];\n            this._parentUp[0] = this._parentUps[parentIndex * 3];\n            this._parentUp[1] = this._parentUps[parentIndex * 3 + 1];\n            this._parentUp[2] = this._parentUps[parentIndex * 3 + 2];\n            this._parentTwist[0] = this._parentTwists[parentIndex * 4];\n            this._parentTwist[1] = this._parentTwists[parentIndex * 4 + 1];\n            this._parentTwist[2] = this._parentTwists[parentIndex * 4 + 2];\n            this._parentTwist[3] = this._parentTwists[parentIndex * 4 + 3];\n            if (this._lengthScalings) {\n                const lengthScale = this._lengthScalings[childIndex] + (pseudoRandom.nextFloat() * 2 - 1) * this._randomLengthScaling;\n                this._sizes[childIndex * 3 + 1] = Math.max(this._sizeY * lengthScale, this._minLength);\n            } else {\n                const lengthScale = this._lengthScaling + (pseudoRandom.nextFloat() * 2 - 1) * this._randomLengthScaling;\n                this._sizes[childIndex * 3 + 1] = Math.max(parentScaleY * lengthScale, this._minLength);\n            }\n            if (this._thicknessScalings) {\n                const thicknessScale = this._thicknessScalings[childIndex] + (pseudoRandom.nextFloat() * 2 - 1) * this._randomThicknessScaling;\n                this._sizes[childIndex * 3] = Math.max(this._sizeX * thicknessScale, this._minThickness);\n                this._sizes[childIndex * 3 + 2] = Math.max(this._sizeZ * thicknessScale, this._minThickness);\n            } else {\n                const thicknessScale = this._thicknessScaling + (pseudoRandom.nextFloat() * 2 - 1) * this._randomThicknessScaling;\n                this._sizes[childIndex * 3] = Math.max(parentScaleX * thicknessScale, this._minThickness);\n                this._sizes[childIndex * 3 + 2] = Math.max(parentScaleZ * thicknessScale, this._minThickness);\n            }\n            let split;\n            if (this._splitAngles) split = this._splitAngles[childIndex];\n            else split = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).TWO_PI * i / childIds.length;\n            split += (pseudoRandom.nextFloat() * 2 - 1) * this._randomSplit;\n            (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, this._parentUp, split);\n            (0, $39ece26d1239bb77$exports).normalize(this._quat, this._quat);\n            (0, $39ece26d1239bb77$exports).multiply(this._childRotation, this._quat, this._parentTwist);\n            let angle;\n            if (this._angles) angle = this._angles[childIndex];\n            else angle = this._angle;\n            angle += (pseudoRandom.nextFloat() * 2 - 1) * this._randomAngle;\n            angle = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp(angle, -(0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO);\n            (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, angle);\n            (0, $39ece26d1239bb77$exports).normalize(this._quat, this._quat);\n            (0, $39ece26d1239bb77$exports).multiply(this._childRotation, this._childRotation, this._quat);\n            this._rotations[childIndex * 4] = this._childRotation[0];\n            this._rotations[childIndex * 4 + 1] = this._childRotation[1];\n            this._rotations[childIndex * 4 + 2] = this._childRotation[2];\n            this._rotations[childIndex * 4 + 3] = this._childRotation[3];\n            const halfParentScaleY = parentScaleY * 0.5;\n            const halfChildScaleY = this._sizes[childIndex * 3 + 1] * 0.5;\n            (0, $31054a6c69637582$exports).transformQuat(this._vec3, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._childRotation);\n            const childTranslationX = this._positions[parentIndex * 3] + this._parentUp[0] * halfParentScaleY + this._vec3[0] * halfChildScaleY;\n            const childTranslationY = this._positions[parentIndex * 3 + 1] + this._parentUp[1] * halfParentScaleY + this._vec3[1] * halfChildScaleY;\n            const childTranslationZ = this._positions[parentIndex * 3 + 2] + this._parentUp[2] * halfParentScaleY + this._vec3[2] * halfChildScaleY;\n            this._positions[childIndex * 3] = childTranslationX;\n            this._positions[childIndex * 3 + 1] = childTranslationY;\n            this._positions[childIndex * 3 + 2] = childTranslationZ;\n            this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, childTranslationX);\n            this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, childTranslationY);\n            this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, childTranslationZ);\n            this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, childTranslationX);\n            this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, childTranslationY);\n            this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, childTranslationZ);\n            if (children[childId]) this._branch(childId, indices, children, pseudoRandom);\n        }\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\nclass $8be06baf1546635b$export$a9bf29f8d87ebbee extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    getPositionX(index) {\n        return this._positions[index * 3];\n    }\n    getPositionY(index) {\n        return this._positions[index * 3 + 1];\n    }\n    getPositionZ(index) {\n        return this._positions[index * 3 + 2];\n    }\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const side = options.side === undefined ? Math.ceil(Math.sqrt(count)) : options.side;\n        if (!this._positions || this._positions.length < buffer.length * 3) this._positions = new Float32Array(buffer.length * 3);\n        this.minLayoutBoundsX = 0;\n        this.minLayoutBoundsY = 0;\n        this.minLayoutBoundsZ = 0;\n        this.maxLayoutBoundsX = 0;\n        this.maxLayoutBoundsY = 0;\n        this.maxLayoutBoundsZ = 0;\n        const lookup = buffer.lookup;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            const y = Math.floor(i / side);\n            const x = i - y * side;\n            this._positions[index * 3] = x;\n            this._positions[index * 3 + 1] = y;\n            this._positions[index * 3 + 2] = 0;\n            this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, x);\n            this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, y);\n        }\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const padding = options.padding === undefined ? 0 : options.padding;\n        const thickness = options.thickness === undefined ? 1 : options.thickness;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        const scale = (0, $31054a6c69637582$exports).fromValues((1 - padding) * this._boundsScaling, (1 - padding) * this._boundsScaling, thickness * this._boundsScaling);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            let positionX = this._positions[index * 3];\n            let positionY = this._positions[index * 3 + 1];\n            let positionZ = this._positions[index * 3 + 2];\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, scale);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)} ms`);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\n\nclass $05bc96b85bb3a34e$export$ce1cde616fb0ca7e extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    get positionsX() {\n        return this._positionsX;\n    }\n    get positionsY() {\n        return this._positionsY;\n    }\n    get sizesX() {\n        return this._sizesX;\n    }\n    get sizesY() {\n        return this._sizesY;\n    }\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const size = options.size == undefined ? 1 : options.size;\n        let offset = options.offset === undefined ? 0 : options.offset;\n        let count = options.count === undefined ? ids.length : options.count;\n        this.minLayoutBoundsX = options.minBoundsX;\n        this.minLayoutBoundsY = options.minBoundsY;\n        this.minLayoutBoundsZ = options.minBoundsZ;\n        this.maxLayoutBoundsX = options.maxBoundsX;\n        this.maxLayoutBoundsY = options.maxBoundsY;\n        this.maxLayoutBoundsZ = options.maxBoundsZ;\n        const sizeX = this.maxLayoutBoundsX - this.minLayoutBoundsX;\n        const sizeY = this.maxLayoutBoundsY - this.minLayoutBoundsY;\n        if (options.sizes) {\n            for(let i = 0; i < count; i++){\n                if (options.sizes[ids[offset]] > 0) break;\n                offset++;\n                count--;\n            }\n            if (count == 0) return;\n        } else if (size <= 0) return;\n        if (!this._positionsX || this._positionsX.length < buffer.length) {\n            this._positionsX = new Float32Array(buffer.length);\n            this._positionsY = new Float32Array(buffer.length);\n            this._sizesX = new Float32Array(buffer.length);\n            this._sizesY = new Float32Array(buffer.length);\n        }\n        (0, $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75).squarifiedLayout({\n            ids: ids,\n            sizes: options.sizes,\n            positionsX: this._positionsX,\n            positionsY: this._positionsY,\n            sizesX: this._sizesX,\n            sizesY: this._sizesY,\n            from: offset,\n            to: offset + count - 1,\n            x: this.minLayoutBoundsX,\n            y: this.minLayoutBoundsY,\n            width: sizeX,\n            height: sizeY,\n            lookup: buffer.lookup\n        });\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const heights = options.heights;\n        const minHeight = options.minHeight === undefined ? 0 : options.minHeight;\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const padding = options.padding === undefined ? 0 : options.padding;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        (0, $39ece26d1239bb77$exports).rotationTo(_quat, this._core.config.identityRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY);\n        let maxHeight;\n        if (heights) {\n            maxHeight = 0;\n            for(let i = 0; i < count; i++){\n                const id = ids[i + offset];\n                maxHeight = Math.max(heights[id], maxHeight);\n            }\n        } else maxHeight = 1;\n        const heightScaling = (this.maxLayoutBoundsZ - this.minLayoutBoundsZ) / maxHeight;\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            const height = Math.max(heights ? heights[id] * heightScaling : heightScaling, minHeight);\n            let positionX = this._positionsX[index];\n            let positionY = this._positionsY[index];\n            let positionZ = this.minLayoutBoundsZ + height / 2;\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            _vec3[0] = Math.max((this._sizesX[index] - padding) * this._boundsScaling, 0);\n            _vec3[1] = Math.max((this._sizesY[index] - padding) * this._boundsScaling, 0);\n            _vec3[2] = height * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, _vec3);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\nclass $05bc96b85bb3a34e$export$3ca73d0a8bf0e96e extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const isTopToBottom = options.isTopToBottom === undefined ? false : options.isTopToBottom;\n        let offset = options.offset === undefined ? 0 : options.offset;\n        let count = options.count === undefined ? ids.length : options.count;\n        this.minLayoutBoundsX = options.minBoundsX;\n        this.minLayoutBoundsY = options.minBoundsY;\n        this.minLayoutBoundsZ = options.minBoundsZ;\n        this.maxLayoutBoundsX = options.maxBoundsX;\n        this.maxLayoutBoundsY = options.maxBoundsY;\n        this.maxLayoutBoundsZ = options.maxBoundsZ;\n        if (options.sizes) {\n            for(let i = 0; i < count; i++){\n                if (options.sizes[ids[offset]] > 0) break;\n                offset++;\n                count--;\n            }\n            if (count == 0) return;\n        }\n        const sizeX = this.maxLayoutBoundsX - this.minLayoutBoundsX;\n        const sizeY = this.maxLayoutBoundsY - this.minLayoutBoundsY;\n        const sizeZ = this.maxLayoutBoundsZ - this.minLayoutBoundsZ;\n        const minHeight = this._core.config.minCubifiedTreeMapSlice / sizeY;\n        const side = Math.sqrt(sizeX * sizeZ);\n        const total = options.sizes ? (0, $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75).totalSize(ids, options.sizes, offset, offset + count - 1) : count;\n        if (!this._positionsX || this._positionsX.length < buffer.length) {\n            this._positionsX = new Float32Array(buffer.length);\n            this._positionsY = new Float32Array(buffer.length);\n            this._positionsZ = new Float32Array(buffer.length);\n            this._sizesX = new Float32Array(buffer.length);\n            this._sizesY = new Float32Array(buffer.length);\n            this._sizesZ = new Float32Array(buffer.length);\n        }\n        (0, $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75).cubifiedLayout({\n            ids: ids,\n            sizes: options.sizes,\n            positionsX: this._positionsX,\n            positionsY: this._positionsY,\n            positionsZ: this._positionsZ,\n            sizesX: this._sizesX,\n            sizesY: this._sizesY,\n            sizesZ: this._sizesZ,\n            from: offset,\n            to: offset + count - 1,\n            x: this.minLayoutBoundsX,\n            y: this.minLayoutBoundsY,\n            z: this.minLayoutBoundsZ,\n            width: sizeX,\n            height: sizeY,\n            depth: sizeZ,\n            side: side,\n            total: total,\n            minHeight: minHeight,\n            isTopToBottom: isTopToBottom,\n            lookup: buffer.lookup\n        });\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const padding = options.padding === undefined ? 0 : options.padding;\n        const paddingZ = options.thickness === undefined ? padding : 0;\n        const thickness = options.thickness === undefined ? 1 : options.thickness;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            let positionX = this._positionsX[index];\n            let positionY = this._positionsY[index];\n            let positionZ = this._positionsZ[index];\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            _vec3[0] = Math.max((this._sizesX[index] - padding) * this._boundsScaling, 0);\n            _vec3[1] = Math.max((this._sizesY[index] - padding) * this._boundsScaling, 0);\n            _vec3[2] = Math.max((this._sizesZ[index] - paddingZ) * this._boundsScaling, 0) * thickness;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, _vec3);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\n\nclass $385fd844fe700a1a$export$84974d344b4becf0 extends (0, $9f62a2679ad52b29$export$f4f11265faddf354) {\n    get maxCount() {\n        return this._maxCount;\n    }\n    get levels() {\n        return this._levels;\n    }\n    get binCounts() {\n        return this._binCounts;\n    }\n    getPositionX(index) {\n        return this._positionsX[index];\n    }\n    getPositionY(index) {\n        return this._positionsY[index];\n    }\n    getPositionZ(index) {\n        return this._positionsZ[index];\n    }\n}\nclass $385fd844fe700a1a$export$694e0d28c7ffc90c extends $385fd844fe700a1a$export$84974d344b4becf0 {\n    get maxLevel() {\n        return this._maxLevel;\n    }\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        this._maxLevel = 0;\n        const sizeX = options.sizeX == undefined ? 1 : options.sizeX;\n        const sizeZ = options.sizeZ == undefined ? 1 : options.sizeZ;\n        const spacingX = options.spacingX == undefined ? 0 : options.spacingX;\n        const spacingZ = options.spacingZ == undefined ? 0 : options.spacingZ;\n        const binsX = options.binsX == undefined ? 1 : options.binsX;\n        const binsZ = options.binsZ == undefined ? 1 : options.binsZ;\n        this._height = options.height == undefined ? 1 : options.height;\n        if (!this._positionsX || this._positionsX.length < buffer.length) {\n            this._positionsX = new Float32Array(buffer.length);\n            this._positionsY = new Float32Array(buffer.length);\n            this._positionsZ = new Float32Array(buffer.length);\n            this._levels = new Uint32Array(buffer.length);\n        }\n        this._binCounts = new Uint32Array(binsX * binsZ);\n        let maxBinCount = 0;\n        let maxBinLevel = 0;\n        let positionX, positionY, positionZ;\n        const lookup = buffer.lookup;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            const binIdX = options.binIdsX ? options.binIdsX[id] : 0;\n            const binIdZ = options.binIdsZ ? options.binIdsZ[id] : 0;\n            const binId = binIdX + binIdZ * binsX;\n            if (binId > this._binCounts.length - 1) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, \"bin overflow\");\n            const binCount = this._binCounts[binId];\n            const level = Math.floor(binCount / sizeX / sizeZ);\n            this._levels[index] = level;\n            const levelCount = binCount - level * sizeX * sizeZ;\n            const itemZ = Math.floor(levelCount / sizeX);\n            const itemX = levelCount - itemZ * sizeX;\n            positionX = spacingX / 2 + binIdX * (sizeX + spacingX) + itemX + 0.5;\n            positionY = this._height * (level + 0.5);\n            positionZ = spacingZ / 2 + binIdZ * (sizeZ + spacingZ) + itemZ + 0.5;\n            this._positionsX[index] = positionX;\n            this._positionsY[index] = positionY;\n            this._positionsZ[index] = positionZ;\n            this._binCounts[binId]++;\n            maxBinCount = Math.max(maxBinCount, this._binCounts[binId]);\n            maxBinLevel = Math.max(maxBinLevel, level);\n        }\n        this._maxLevel = maxBinLevel + 1;\n        this._maxCount = maxBinCount;\n        this.minLayoutBoundsX = 0;\n        this.minLayoutBoundsY = 0;\n        this.minLayoutBoundsZ = 0;\n        this.maxLayoutBoundsX = binsX * (sizeX + spacingX);\n        this.maxLayoutBoundsY = this._maxLevel * this._height;\n        this.maxLayoutBoundsZ = binsZ * (sizeZ + spacingZ);\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _vec4 = (0, $4c4ac78b213a9c07$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const padding = options.padding === undefined ? 0 : options.padding;\n        const thickness = options.thickness === undefined ? 1 - padding : options.thickness;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        (0, $39ece26d1239bb77$exports).rotationTo(_quat, this._core.config.identityRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY);\n        if (options.texCoord) {\n            _vec4[0] = options.texCoord[0];\n            _vec4[1] = options.texCoord[1];\n            _vec4[2] = options.texCoord[2];\n            _vec4[3] = options.texCoord[3];\n        }\n        const scale = (0, $31054a6c69637582$exports).fromValues((1 - padding) * this._boundsScaling, (this._height - padding) * this._boundsScaling, thickness * this._boundsScaling);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            let positionX = this._positionsX[index];\n            let positionY = this._positionsY[index];\n            let positionZ = this._positionsZ[index];\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, scale);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n            if (options.texCoords) {\n                _vec4[0] = options.texCoords[id * 4];\n                _vec4[1] = options.texCoords[id * 4 + 1];\n                _vec4[2] = options.texCoords[id * 4 + 2];\n                _vec4[3] = options.texCoords[id * 4 + 3];\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTexCoord(dataView, index, _vec4);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTexCoord(dataView, index, _vec4);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [\n                options.materialColors[id * 3],\n                options.materialColors[id * 3 + 1],\n                options.materialColors[id * 3 + 2]\n            ] : [\n                0,\n                0,\n                0\n            ]);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [\n                options.segmentColors[id * 4],\n                options.segmentColors[id * 4 + 1],\n                options.segmentColors[id * 4 + 2],\n                options.segmentColors[id * 4 + 3]\n            ] : [\n                buffer.idColors[id * 4],\n                buffer.idColors[id * 4 + 1],\n                buffer.idColors[id * 4 + 2],\n                buffer.idColors[id * 4 + 3]\n            ]);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\nclass $385fd844fe700a1a$export$75310880a535fd3b extends $385fd844fe700a1a$export$84974d344b4becf0 {\n    get maxTotal() {\n        return this._maxTotal;\n    }\n    get binGroupIds() {\n        return this._binGroupIds;\n    }\n    getSizeX(index) {\n        return this._sizesX[index];\n    }\n    getSizeY(index) {\n        return this._sizesY[index];\n    }\n    getSizeZ(index) {\n        return this._sizesZ[index];\n    }\n    layout(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const isNormalized = options.isNormalized === undefined ? false : options.isNormalized;\n        const minHeight = options.minHeight === undefined ? 0 : options.minHeight;\n        const maxHeight = options.maxHeight === undefined ? 0 : options.maxHeight;\n        const isTopToBottom = options.isTopToBottom === undefined ? false : options.isTopToBottom;\n        const sizeX = options.sizeX == undefined ? 1 : options.sizeX;\n        const sizeZ = options.sizeZ == undefined ? 1 : options.sizeZ;\n        const spacingX = options.spacingX == undefined ? 0 : options.spacingX;\n        const spacingZ = options.spacingZ == undefined ? 0 : options.spacingZ;\n        const binsX = options.binsX == undefined ? 1 : options.binsX;\n        const binsZ = options.binsZ == undefined ? 1 : options.binsZ;\n        if (!this._positionsX || this._positionsX.length < buffer.length) {\n            this._positionsX = new Float32Array(buffer.length);\n            this._positionsY = new Float32Array(buffer.length);\n            this._positionsZ = new Float32Array(buffer.length);\n            this._sizesX = new Float32Array(buffer.length);\n            this._sizesY = new Float32Array(buffer.length);\n            this._sizesZ = new Float32Array(buffer.length);\n            this._binIds = new Uint32Array(buffer.length);\n            this._binGroupIds = new Float64Array(buffer.length);\n        }\n        this._binCounts = new Uint32Array(binsX * binsZ);\n        this._binTotals = new Float64Array(binsX * binsZ);\n        let maxBinCount = 0;\n        let maxBinTotal = 0;\n        let height;\n        const lookup = buffer.lookup;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            const binIdX = options.binIdsX ? options.binIdsX[id] : 0;\n            const binIdZ = options.binIdsZ ? options.binIdsZ[id] : 0;\n            const binId = binIdX + binIdZ * binsX;\n            this._binIds[index] = binId;\n            if (binId > this._binCounts.length - 1) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, \"bin overflow\");\n            this._binCounts[binId]++;\n            maxBinCount = Math.max(maxBinCount, this._binCounts[binId]);\n            this._binTotals[binId] += options.sizes ? options.sizes[id] : 1;\n            maxBinTotal = Math.max(maxBinTotal, this._binTotals[binId]);\n        }\n        if (maxHeight - minHeight > 0) height = maxHeight - minHeight;\n        else height = Math.ceil(maxBinCount / sizeX / sizeZ);\n        if (!this._orderedIds || this._orderedIds.length < buffer.length) this._orderedIds = new Uint32Array(buffer.length);\n        let ids2;\n        if (options.groupIds || options.sizes) {\n            if (count == ids.length) this._ids = new Uint32Array(ids);\n            else {\n                this._ids = new Uint32Array(count);\n                for(let i = 0; i < count; i++)this._ids[i] = ids[offset + i];\n            }\n            if (options.groupIds && options.sizes) {\n                this._ids.sort(function(a, b) {\n                    return options.groupIds[a] == options.groupIds[b] ? options.sizes[a] - options.sizes[b] : options.groupIds[a] - options.groupIds[b];\n                });\n                ids2 = this._ids;\n            } else if (options.groupIds) {\n                this._ids.sort(function(a, b) {\n                    return options.groupIds[a] - options.groupIds[b];\n                });\n                ids2 = this._ids;\n            } else if (options.sizes) {\n                this._ids.sort(function(a, b) {\n                    return options.sizes[a] - options.sizes[b];\n                });\n                ids2 = this._ids;\n            }\n        } else ids2 = ids;\n        const binOffsets = new Uint32Array(this._binCounts.length);\n        let binOffset = 0;\n        for(let i = 0; i < this._binCounts.length; i++){\n            const binCount = this._binCounts[i];\n            binOffsets[i] = binOffset;\n            binOffset += binCount;\n        }\n        for(let i = 0; i < count; i++){\n            const id = ids2[i];\n            const index = lookup[id];\n            const binId = this._binIds[index];\n            binOffset = binOffsets[binId]++;\n            this._orderedIds[binOffset + offset] = id;\n        }\n        const minSliceHeight = this._core.config.minCubifiedTreeMapSlice * height;\n        const side = Math.sqrt(sizeX * sizeZ);\n        let from = offset;\n        let isLastInGroup = false;\n        let isLastInBin = false;\n        let groupCount = 0;\n        let groupTotal = 0;\n        let positionY = 0;\n        for(let i = 0; i < count; i++){\n            const id = this._orderedIds[i + offset];\n            const index = lookup[id];\n            groupCount++;\n            groupTotal += options.sizes ? options.sizes[id] : 1;\n            const binId = this._binIds[index];\n            const groupId = options.groupIds ? options.groupIds[id] : 0;\n            if (i == count - 1) {\n                isLastInBin = true;\n                isLastInGroup = true;\n            } else {\n                const nextId = this._orderedIds[i + 1 + offset];\n                const nextIndex = lookup[nextId];\n                const nextBinId = this._binIds[nextIndex];\n                const nextGroupId = options.groupIds ? options.groupIds[nextId] : 0;\n                isLastInBin = binId != nextBinId;\n                isLastInGroup = groupId != nextGroupId;\n            }\n            if (isLastInBin || isLastInGroup) {\n                const mid = i + offset;\n                const binIdX = options.binIdsX ? options.binIdsX[id] : 0;\n                const binIdZ = options.binIdsZ ? options.binIdsZ[id] : 0;\n                let groupValue, binValue;\n                if (options.sizes) {\n                    groupValue = groupTotal;\n                    binValue = isNormalized ? this._binTotals[binId] : maxBinTotal;\n                } else {\n                    groupValue = groupCount;\n                    binValue = isNormalized ? this._binCounts[binId] : maxBinCount;\n                }\n                const groupHeight = height * groupValue / binValue;\n                if (sizeZ == 1) {\n                    const positionX = spacingX / 2 + binIdX * (sizeX + spacingX);\n                    (0, $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75).squarifiedLayout({\n                        ids: this._orderedIds,\n                        sizes: options.sizes,\n                        positionsX: this._positionsX,\n                        positionsY: this._positionsY,\n                        sizesX: this._sizesX,\n                        sizesY: this._sizesY,\n                        from: from,\n                        to: mid,\n                        x: positionX,\n                        y: positionY,\n                        width: sizeX,\n                        height: groupHeight,\n                        lookup: lookup\n                    });\n                    const isRightToLeft = true;\n                    for(let i = from; i <= mid; i++){\n                        const id = this._orderedIds[i];\n                        const index = lookup[id];\n                        this._sizesZ[index] = sizeZ;\n                        this._positionsZ[index] = (binIdZ + 0.5) * (sizeZ + spacingZ);\n                        if (isRightToLeft) this._positionsX[index] = positionX + sizeX - this._positionsX[index] + positionX;\n                        if (!isTopToBottom) this._positionsY[index] = positionY + groupHeight - this._positionsY[index] + positionY;\n                    }\n                } else (0, $ce6a2b7bc7be40ee$export$ece3d818ad8f3b75).cubifiedLayout({\n                    ids: this._orderedIds,\n                    sizes: options.sizes,\n                    positionsX: this._positionsX,\n                    positionsY: this._positionsY,\n                    positionsZ: this._positionsZ,\n                    sizesX: this._sizesX,\n                    sizesY: this._sizesY,\n                    sizesZ: this._sizesZ,\n                    from: from,\n                    to: mid,\n                    x: spacingX / 2 + binIdX * (sizeX + spacingX),\n                    y: positionY,\n                    z: spacingZ / 2 + binIdZ * (sizeZ + spacingZ),\n                    width: sizeX,\n                    height: groupHeight,\n                    depth: sizeZ,\n                    side: side,\n                    total: groupValue,\n                    minHeight: minSliceHeight,\n                    isTopToBottom: isTopToBottom,\n                    lookup: lookup\n                });\n                if (isLastInGroup) {\n                    isLastInGroup = false;\n                    positionY += groupHeight;\n                }\n                if (isLastInBin) {\n                    isLastInBin = false;\n                    positionY = 0;\n                }\n                groupCount = 0;\n                groupTotal = 0;\n                from = mid + 1;\n            }\n        }\n        this._maxCount = maxBinCount;\n        this._maxTotal = maxBinTotal;\n        this.minLayoutBoundsX = 0;\n        this.minLayoutBoundsY = 0;\n        this.minLayoutBoundsZ = 0;\n        this.maxLayoutBoundsX = binsX * (sizeX + spacingX);\n        this.maxLayoutBoundsY = height;\n        this.maxLayoutBoundsZ = binsZ * (sizeZ + spacingZ);\n        this._updateCumulativeLayoutBounds();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n        const start = window.performance.now();\n        const offset = options.offset === undefined ? 0 : options.offset;\n        const count = options.count === undefined ? ids.length : options.count;\n        const dataView = buffer.dataView;\n        const _vec2 = (0, $91b0cc4981465964$exports).create();\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        const _quat = (0, $39ece26d1239bb77$exports).create();\n        const minColor = options.minColor === undefined ? 0 : options.minColor;\n        const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n        const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n        const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n        const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n        const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n        const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n        const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n        const padding = options.padding === undefined ? 0 : options.padding;\n        const paddingZ = options.thickness === undefined ? padding : 0;\n        const thickness = options.thickness === undefined ? 1 : options.thickness;\n        const reverseX = options.reverseX === undefined ? false : options.reverseX;\n        const reverseY = options.reverseY === undefined ? false : options.reverseY;\n        const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n        this._updateModelBounds(options);\n        (0, $39ece26d1239bb77$exports).rotationTo(_quat, this._core.config.identityRotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY);\n        const lookup = buffer.lookup;\n        const selection = options.selected && options.selected.size > 0;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = lookup[id];\n            let positionX = this._positionsX[index];\n            let positionY = this._positionsY[index];\n            let positionZ = this._positionsZ[index];\n            if (this._isFacetted) {\n                if (reverseX) positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            } else {\n                if (reverseX) positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                if (reverseY) positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                if (reverseZ) positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n            }\n            _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n            _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n            _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setTranslation(dataView, index, _vec3);\n            _vec3[0] = Math.max((this._sizesX[index] - padding) * this._boundsScaling, 0);\n            _vec3[1] = Math.max((this._sizesY[index] - padding) * this._boundsScaling, 0);\n            _vec3[2] = Math.max((this._sizesZ[index] - paddingZ) * this._boundsScaling, 0) * thickness;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setScale(dataView, index, _vec3);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(dataView, index, _quat);\n            if (options.colors) {\n                const size = 1 / (maxColor - minColor + 1);\n                const color = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                (0, $91b0cc4981465964$exports).set(_vec2, color, color);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, _vec2);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setColor(dataView, index, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ONE);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n            if (options.order !== undefined) {\n                const order = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                _vec2[0] = orderReverse ? 1 - order : order;\n            } else _vec2[0] = count == 1 ? 0 : i / (count - 1);\n            if (options.staggerOrder !== undefined) _vec2[1] = options.staggerOrder;\n            else if (options.staggerOrders) {\n                const stagger = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n            } else _vec2[1] = count == 1 ? 0 : i / (count - 1);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setOrder(dataView, index, _vec2);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n        }\n        buffer.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this.constructor.name.toLowerCase()} update ${ids.length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $f6a26e80c37065df$export$75b02b7d42a9cc20 {\n    constructor(core){}\n    loadText(file, completed, failed) {\n        const reader = new FileReader();\n        reader.onload = (event)=>{\n            const text = event.target.result;\n            completed(text);\n        };\n        reader.onerror = (event)=>{\n            const error = event.target.error;\n            failed(error.message);\n        };\n        reader.readAsText(file);\n    }\n    loadImage(file, completed, failed) {\n        const image = new Image();\n        image.onload = ()=>completed(image);\n        image.onerror = (event)=>{\n            const error = event.message;\n            failed(error);\n        };\n        const reader = new FileReader();\n        reader.onload = (event)=>{\n            const text = event.target.result;\n            image.src = text;\n        };\n        reader.onerror = (event)=>{\n            const error = event.target.error;\n            failed(error.message);\n        };\n        reader.readAsDataURL(file);\n    }\n    loadArrayBuffer(file, completed, failed) {\n        const reader = new FileReader();\n        reader.onload = (event)=>{\n            const arrayBuffer = event.target.result;\n            completed(arrayBuffer);\n        };\n        reader.onerror = (event)=>{\n            const error = event.target.error;\n            failed(error.message);\n        };\n        reader.readAsArrayBuffer(file);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $0c03094fe8bffa8b$export$f2a35cc03612aec1 {\n    constructor(core){}\n    loadText(url, completed, failed) {\n        const request = new XMLHttpRequest();\n        request.open(\"GET\", url);\n        request.onreadystatechange = ()=>{\n            if (request.readyState == XMLHttpRequest.DONE) switch(request.status){\n                case 200:\n                    completed(request.responseText);\n                    break;\n                default:\n                    failed(request.statusText);\n                    break;\n            }\n        };\n        request.send();\n    }\n    loadImage(url, completed, failed) {\n        const image = new Image();\n        image.onload = ()=>completed(image);\n        image.onerror = (event)=>{\n            const error = event.message;\n            failed(error);\n        };\n        image.src = url;\n    }\n    loadArrayBuffer(url, completed, failed) {\n        const request = new XMLHttpRequest();\n        request.open(\"GET\", url);\n        request.responseType = \"arraybuffer\";\n        request.onreadystatechange = ()=>{\n            if (request.readyState == XMLHttpRequest.DONE) switch(request.status){\n                case 200:\n                    completed(request.response);\n                    break;\n                default:\n                    failed(request.statusText);\n                    break;\n            }\n        };\n        request.send();\n    }\n}\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\nvar $2d9c5cad0d6d7650$exports = {};\n\n$parcel$export($2d9c5cad0d6d7650$exports, \"RendererBase\", () => $a123db7d2af0bebc$export$30686c90897c890d);\n$parcel$export($2d9c5cad0d6d7650$exports, \"Basic\", () => $124829f55b512dce$exports);\n$parcel$export($2d9c5cad0d6d7650$exports, \"Advanced\", () => $04aa67b4630f0de9$exports);\n$parcel$export($2d9c5cad0d6d7650$exports, \"BasicWebGPU\", () => $14a55defd301d57e$exports);\n$parcel$export($2d9c5cad0d6d7650$exports, \"RayTraceWebGPU\", () => $9824374ee38ba7ca$exports);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $0a2e9437355c0494$export$caf2f326fb2d2fb4 {\n    get imageData() {\n        return this._imageData;\n    }\n    set imageData(value) {\n        if (this._imageData != value) {\n            this._imageData = value;\n            this._changed = true;\n        }\n    }\n    constructor(){\n        this._imageData = null;\n    }\n    copyFrom(atlas) {\n        if (atlas.imageData) {\n            this._imageData = atlas.imageData;\n            this._changed = true;\n        } else this.imageData = null;\n    }\n    update() {}\n}\nclass $0a2e9437355c0494$export$e47fdbcb2ea069e5 extends $0a2e9437355c0494$export$caf2f326fb2d2fb4 {\n}\n\n\nclass $96371271bb28b98d$export$c1cecec923d96e5c {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get ids() {\n        return this._ids;\n    }\n    get dataView() {\n        return this._dataView;\n    }\n    get vertices() {\n        return this._vertices;\n    }\n    get lookup() {\n        return this._lookup;\n    }\n    get length() {\n        return this._length;\n    }\n    get selected() {\n        return this._selected;\n    }\n    constructor(core, ids){\n        this._core = core;\n        this._ids = ids;\n        this._length = ids.length;\n        this._vertices = new ArrayBuffer(this._length * (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES);\n        this._dataView = new DataView(this._vertices);\n        this._selected = new Set();\n        this.from = 0;\n        this.to = 1;\n        this.unitType = (0, $4a6417d29706362f$export$80d48287646c9e3b).block;\n        this._lookup = {};\n        for(let i = 0; i < this._length; i++){\n            const id = ids[i];\n            this._lookup[id] = i;\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(this._dataView, i, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY);\n        }\n    }\n    createShared() {\n        const buffer = Object.create(this);\n        buffer._vertices = new ArrayBuffer(buffer._vertices.byteLength);\n        buffer._dataView = new DataView(buffer._vertices);\n        return buffer;\n    }\n    copyFrom(buffer) {\n        const start = window.performance.now();\n        const fromDataView = buffer.dataView;\n        const toDataView = this._dataView;\n        const lookup = buffer.lookup;\n        for(let i = 0; i < this._length; i++){\n            const index = lookup[this._ids[i]];\n            if (index != null) {\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyIdHover(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyTranslation(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyScale(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyRotation(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyColor(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copySelected(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyMaterial(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyRounding(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyOrder(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyTexCoord(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyTexture(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copySdfBuffer(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copySdfBorder(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyParameter1(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyParameter2(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyMatId(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyMatColor(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyMatFuzz(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyMatRefractiveIndex(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyMatGloss(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copyMatDensity(fromDataView, index, toDataView, i);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).copySegColor(fromDataView, index, toDataView, i);\n            } else (0, $0a0587bd8b0d58e8$export$849e31d725692576).setRotation(toDataView, i, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY);\n        }\n        this.unitType = buffer.unitType;\n        this._selected = buffer.selected;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update() {}\n    updateSelection(options) {\n        const start = window.performance.now();\n        const ids = options && options.ids ? options.ids : this._ids;\n        const offset = options && options.offset !== undefined ? options.offset : 0;\n        const count = options && options.count !== undefined ? options.count : ids.length;\n        const selection = this._selected.size > 0;\n        const dataView = this._dataView;\n        for(let i = 0; i < count; i++){\n            const id = ids[i + offset];\n            const index = this._lookup[id];\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setSelected(dataView, index, selection ? this._selected.has(id) ? 1 : -1 : 0);\n        }\n        this.update();\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffer update selection ${count} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\nclass $96371271bb28b98d$export$e17d4fc1dafc1240 {\n    get pickIdLookup() {\n        return this._pickIdLookup;\n    }\n    get currentBuffer() {\n        return this._isBuffer1Current ? this._buffer1 : this._buffer2;\n    }\n    get previousBuffer() {\n        return this._isBuffer1Current ? this._buffer2 : this._buffer1;\n    }\n    get currentPalette() {\n        return this._isBuffer1Current ? this._palette1 : this._palette2;\n    }\n    get previousPalette() {\n        return this._isBuffer1Current ? this._palette2 : this._palette1;\n    }\n    get currentAtlas() {\n        return this._isBuffer1Current ? this._atlas1 : this._atlas2;\n    }\n    get previousAtlas() {\n        return this._isBuffer1Current ? this._atlas2 : this._atlas1;\n    }\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get length() {\n        return this._length;\n    }\n    constructor(core, ids, bufferType, paletteType, atlasType){\n        this.bufferType = bufferType;\n        this.paletteType = paletteType;\n        this.atlasType = atlasType;\n        this._core = core;\n        this._length = ids.length;\n        this.id = $96371271bb28b98d$export$e17d4fc1dafc1240._id++;\n        this.isVisible = true;\n        this.transitionTime = 1;\n        this.activeId = -1;\n        const start = window.performance.now();\n        this._buffer1 = new bufferType(core, ids);\n        this._buffer2 = this._buffer1.createShared();\n        this._palette1 = new paletteType();\n        this._palette2 = new paletteType();\n        this._atlas1 = new atlasType();\n        this._atlas2 = new atlasType();\n        this.isPickingEnabled = true;\n        this._pickIdLookup = {};\n        const dataView1 = this._buffer1.dataView;\n        const dataView2 = this._buffer2.dataView;\n        const _vec4 = (0, $4c4ac78b213a9c07$exports).create();\n        this.idColors = new Float32Array(this._length * 4);\n        this._buffer1.idColors = this.idColors;\n        this._buffer2.idColors = this.idColors;\n        for(let i = 0; i < this._length; i++){\n            const id = ids[i];\n            const pickId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).nextPickId();\n            this._pickIdLookup[pickId] = id;\n            (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).encodeNumber(pickId, (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).data, _vec4);\n            this.idColors[i * 4] = _vec4[0];\n            this.idColors[i * 4 + 1] = _vec4[1];\n            this.idColors[i * 4 + 2] = _vec4[2];\n            this.idColors[i * 4 + 3] = _vec4[3];\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdColor(dataView1, i, _vec4);\n            (0, $0a0587bd8b0d58e8$export$849e31d725692576).setIdColor(dataView2, i, _vec4);\n        }\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `transition buffer created ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    swap() {\n        this._isBuffer1Current = !this._isBuffer1Current;\n    }\n    copyFrom(transitionBuffer) {\n        const start = window.performance.now();\n        this.key = transitionBuffer.key;\n        this.isVisible = transitionBuffer.isVisible;\n        this.transitionTime = transitionBuffer.transitionTime;\n        this.isPickingEnabled = transitionBuffer.isPickingEnabled;\n        this.unitType = transitionBuffer.unitType;\n        this.activeId = transitionBuffer.activeId;\n        this.currentBuffer.copyFrom(transitionBuffer.currentBuffer);\n        this.previousBuffer.copyFrom(transitionBuffer.previousBuffer);\n        this.currentBuffer.update();\n        this.previousBuffer.update();\n        this.currentPalette.copyFrom(transitionBuffer.currentPalette);\n        this.previousPalette.copyFrom(transitionBuffer.previousPalette);\n        this.currentAtlas.copyFrom(transitionBuffer.currentAtlas);\n        this.previousAtlas.copyFrom(transitionBuffer.previousAtlas);\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `transition buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n}\n$96371271bb28b98d$export$e17d4fc1dafc1240._id = 1;\nclass $96371271bb28b98d$export$a143d493d941bafc extends $96371271bb28b98d$export$c1cecec923d96e5c {\n    constructor(core, ids){\n        super(core, ids);\n    }\n}\nclass $96371271bb28b98d$export$76de936b3c1c4170 extends $96371271bb28b98d$export$e17d4fc1dafc1240 {\n    constructor(core, ids){\n        super(core, ids, $96371271bb28b98d$export$a143d493d941bafc, (0, $548ced3eab978a8c$export$e2fbaa661ec19dbf), (0, $0a2e9437355c0494$export$e47fdbcb2ea069e5));\n    }\n}\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $7a3b6a33153aecaf$export$6a68d8f4c3236d92 {\n    get vertices() {\n        return this._vertices;\n    }\n    get indices() {\n        return this._indices;\n    }\n    get indexCount() {\n        return this._indexCount;\n    }\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    initialize() {\n        let vertexOffset = 0;\n        let indexOffset = 0;\n        const axisVertices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).POSITIONS;\n        const axisIndices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).INDICES;\n        this._vertices = new ArrayBuffer(3 * (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).SIZE_BYTES * axisVertices.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE);\n        const verticesView = new DataView(this._vertices);\n        this._indices = new Uint16Array(3 * axisIndices.length + 4);\n        const vertexCount = axisVertices.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE;\n        const indexCount = axisIndices.length;\n        const transform = (0, $1ac1b59392edf35b$exports).create();\n        const length = 1;\n        const width = 0.01;\n        transform[0] = length;\n        transform[5] = width;\n        transform[10] = width;\n        transform[12] = 0.5;\n        transform[13] = 0;\n        transform[14] = 0;\n        this._createAxis(axisVertices, axisIndices, verticesView, this._indices, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, transform, vertexOffset, indexOffset);\n        indexOffset += indexCount;\n        this._indices[indexOffset++] = axisIndices[indexCount - 1] + vertexOffset;\n        vertexOffset += vertexCount;\n        this._indices[indexOffset++] = axisIndices[0] + vertexOffset;\n        transform[0] = width;\n        transform[5] = length;\n        transform[10] = width;\n        transform[12] = 0;\n        transform[13] = 0.5;\n        transform[14] = 0;\n        this._createAxis(axisVertices, axisIndices, verticesView, this._indices, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, transform, vertexOffset, indexOffset);\n        indexOffset += indexCount;\n        this._indices[indexOffset++] = axisIndices[indexCount - 1] + vertexOffset;\n        vertexOffset += vertexCount;\n        this._indices[indexOffset++] = axisIndices[0] + vertexOffset;\n        transform[0] = width;\n        transform[5] = width;\n        transform[10] = length;\n        transform[12] = 0;\n        transform[13] = 0;\n        transform[14] = 0.5;\n        this._createAxis(axisVertices, axisIndices, verticesView, this._indices, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ, transform, vertexOffset, indexOffset);\n        this._indexCount = this._indices.length;\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {}\n    _createAxis(axisVertices, axisIndices, verticesView, indices, color, transform, vertexOffset, indexOffset) {\n        const position = (0, $31054a6c69637582$exports).create();\n        const vertexCount = axisVertices.length / (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE;\n        const indexCount = axisIndices.length;\n        for(let i = 0; i < vertexCount; i++){\n            (0, $31054a6c69637582$exports).set(position, axisVertices[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE], axisVertices[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 1], axisVertices[i * (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE + 2]);\n            (0, $31054a6c69637582$exports).transformMat4(position, position, transform);\n            (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).setPosition(verticesView, vertexOffset + i, position);\n            (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).setColor(verticesView, vertexOffset + i, color);\n        }\n        for(let i = 0; i < indexCount; i++)indices[indexOffset + i] = axisIndices[i] + vertexOffset;\n    }\n}\n\n\n\n\n\nvar $a123db7d2af0bebc$var$__awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nclass $a123db7d2af0bebc$export$ecd9923dfd29c8e1 {\n    reset() {}\n}\nclass $a123db7d2af0bebc$export$30686c90897c890d {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get config() {\n        return this._config;\n    }\n    get devicePixelRatio() {\n        return this._devicePixelRatio;\n    }\n    get width() {\n        return this._canvas.width;\n    }\n    set width(value) {\n        this._options.width = value;\n    }\n    get height() {\n        return this._canvas.height;\n    }\n    set height(value) {\n        this._options.height = value;\n    }\n    get webXRReferenceSpace() {\n        return this._webXRReferenceSpace;\n    }\n    get pickedType() {\n        return this._pickedType;\n    }\n    get pickedId() {\n        return this._pickedId;\n    }\n    get isCapturingPickImage() {\n        return this._isCapturingPickImage;\n    }\n    capturePickImage() {\n        this._isCapturingPickImage = true;\n    }\n    get backgroundColor() {\n        return this._backgroundColor;\n    }\n    set backgroundColor(value) {\n        if (!(0, $4c4ac78b213a9c07$exports).exactEquals(value, this._backgroundColor)) this._backgroundColor = value;\n    }\n    get ambientColor() {\n        return this._ambientColor;\n    }\n    set ambientColor(value) {\n        if (!(0, $31054a6c69637582$exports).exactEquals(value, this._ambientColor)) this._ambientColor = value;\n    }\n    get currentAxes() {\n        return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value) {\n        if (this._isAxes1Current) this._axes1 = value;\n        else this._axes2 = value;\n    }\n    get previousAxes() {\n        return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value) {\n        if (this._isAxes1Current) this._axes2 = value;\n        else this._axes1 = value;\n    }\n    swapAxes() {\n        this._isAxes1Current = !this._isAxes1Current;\n    }\n    createCartesian2dAxesVisual(axes) {\n        return new (0, $2e2b6f93796e9c8a$export$e784925068633981)(axes);\n    }\n    createCartesian3dAxesVisual(axes) {\n        return new (0, $2e2b6f93796e9c8a$export$e784925068633981)(axes);\n    }\n    _createDebugAxesVisual(debugAxes) {\n        return null;\n    }\n    createLabelSetVisual(labelSet) {\n        return new (0, $715a174735ed4fbb$export$97e93e7019ef67b9)(labelSet);\n    }\n    createControllerVisual(controller) {\n        return new (0, $6c3dd367ac3ca617$export$c6e88a9dc8138322)(controller);\n    }\n    createTransitionBuffer(ids) {\n        return new (0, $96371271bb28b98d$export$76de936b3c1c4170)(this._core, ids);\n    }\n    createImageVisual(image) {\n        return new (0, $f7de7bdc7bccbb25$export$6f251cd327b2ff1)(image);\n    }\n    createFontVisual(font) {\n        return new (0, $f690fa88528736e9$export$e784a6eab4d2d700)(font);\n    }\n    constructor(options){\n        this._options = options;\n        this.fonts = {};\n    }\n    get isWebXRSupported() {\n        return false;\n    }\n    initialize(core) {\n        this._core = core;\n        this._canvas = document.createElement(\"canvas\");\n        const contextmenu = this._options && this._options.contextmenu;\n        if (!contextmenu) this._canvas.addEventListener(\"contextmenu\", (e)=>{\n            e.preventDefault();\n        });\n        this._canvas.tabIndex = this._core.container.tabIndex;\n        this._canvas.style.display = \"block\";\n        this._canvas.style.touchAction = \"none\";\n        this._core.container.appendChild(this._canvas);\n        this._mvMatrices = [\n            (0, $1ac1b59392edf35b$exports).create(),\n            (0, $1ac1b59392edf35b$exports).create()\n        ];\n        this.pickPMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).current;\n        this._debugAxes = new (0, $7a3b6a33153aecaf$export$6a68d8f4c3236d92)();\n        this._debugAxesVisual = this._createDebugAxesVisual(this._debugAxes);\n        this.transitionTime = 1;\n        this.transitionBuffers = [];\n        this.areLabelsVisible = true;\n        this.labelSets = [];\n        this.controllers = [];\n        this.areImagesVisible = true;\n        this.images = [];\n        this._viewports = [\n            new DOMRect(),\n            new DOMRect()\n        ];\n        this.isPickingEnabled = false;\n        this._pickedType = (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).none;\n        this._pickedId = 0;\n        this._lassoMMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._lassoThickness = (0, $91b0cc4981465964$exports).create();\n        this._resizeMinimumDelay = -1;\n        this._previousResizeWidth = -1;\n        this._previousResizeHeight = -1;\n    }\n    remove() {\n        this._core.container.removeChild(this._canvas);\n    }\n    finalize() {\n        this._isInitialized = false;\n    }\n    setSize(elapsedTime) {\n        if (this._options && this._options.width && this._options.height) {\n            this._devicePixelRatio = 1;\n            this._resizeWidth = this._options.width;\n            this._resizeHeight = this._options.height;\n        } else {\n            this._devicePixelRatio = window.devicePixelRatio || 1;\n            this._resizeWidth = this._core.container.clientWidth * devicePixelRatio;\n            this._resizeHeight = this._core.container.clientHeight * devicePixelRatio;\n        }\n        if (this._resizeWidth != this._previousResizeWidth || this._resizeHeight != this._previousResizeHeight) {\n            this._previousResizeWidth = this._resizeWidth;\n            this._previousResizeHeight = this._resizeHeight;\n            this._isResizing = true;\n            this._resizeElapsedTime = elapsedTime;\n        }\n        if (this._isResizing) {\n            if (this._resizeElapsedTime > this._resizeMinimumDelay && this._isInitialized) {\n                this._isResizing = false;\n                this._resizeMinimumDelay = this._core.config.resizeMinimumDelay;\n                this._resize(this._resizeWidth, this._resizeHeight);\n            } else this._resizeElapsedTime += elapsedTime;\n        }\n    }\n    _resize(width, height) {\n        this._canvas.style.width = `${Math.floor(width / this._devicePixelRatio)}px`;\n        this._canvas.style.height = `${Math.floor(height / this._devicePixelRatio)}px`;\n        width = Math.floor(width);\n        height = Math.floor(height);\n        this._canvas.width = width;\n        this._canvas.height = height;\n    }\n    update(elapsedTime) {\n        for(let i = 0; i < this.transitionBuffers.length; i++){\n            const transitionBuffer = this.transitionBuffers[i];\n            if (transitionBuffer.isVisible) {\n                const previous = transitionBuffer.previousPalette;\n                const current = transitionBuffer.currentPalette;\n                if (previous) previous.update();\n                if (current) current.update();\n            }\n        }\n        for(let i = 0; i < this.transitionBuffers.length; i++){\n            const transitionBuffer = this.transitionBuffers[i];\n            if (transitionBuffer.isVisible) {\n                const previous = transitionBuffer.previousAtlas;\n                const current = transitionBuffer.currentAtlas;\n                if (previous) previous.update();\n                if (current) current.update();\n            }\n        }\n        if (this._core.config.isDebugVisible) {\n            if (this._debugAxesVisual) {\n                this._debugAxesVisual.mMatrix = this.mMatrix;\n                this._debugAxesVisual.vMatrices = this.vMatrices;\n                this._debugAxesVisual.pMatrices = this.pMatrices;\n                this._debugAxesVisual.viewports = this._viewports;\n                this._debugAxesVisual.viewportOffset = this._viewportOffset;\n                this._debugAxesVisual.viewportCount = this._viewportCount;\n            }\n        }\n        if (this.areLabelsVisible) for(let i = 0; i < this.labelSets.length; i++){\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n                this.labelSets[i].label.update(elapsedTime);\n                labelSetVisual.mMatrix = this.mMatrix;\n                labelSetVisual.vMatrices = this.vMatrices;\n                labelSetVisual.pMatrices = this.pMatrices;\n                labelSetVisual.isPickingEnabled = this.isPickingEnabled;\n                labelSetVisual.pickPMatrix = this.pickPMatrix;\n                labelSetVisual.pickVMatrix = this.pickVMatrix;\n                labelSetVisual.viewports = this._viewports;\n                labelSetVisual.viewportOffset = this._viewportOffset;\n                labelSetVisual.viewportCount = this._viewportCount;\n                labelSetVisual.update(elapsedTime);\n            }\n        }\n        if (this.areImagesVisible) for(let i = 0; i < this.images.length; i++){\n            const imageVisual = this.images[i];\n            if (imageVisual && imageVisual.isVisible) {\n                const image = this.images[i].image;\n                image.update(elapsedTime);\n                imageVisual.mMatrix = this.mMatrix;\n                imageVisual.vMatrices = this.vMatrices;\n                imageVisual.pMatrices = this.pMatrices;\n                imageVisual.isPickingEnabled = this.isPickingEnabled;\n                imageVisual.pickPMatrix = this.pickPMatrix;\n                imageVisual.pickVMatrix = this.pickVMatrix;\n                imageVisual.viewports = this._viewports;\n                imageVisual.viewportOffset = this._viewportOffset;\n                imageVisual.viewportCount = this._viewportCount;\n                imageVisual.update(elapsedTime);\n            }\n        }\n        for(let i = 0; i < this.controllers.length; i++){\n            const controllerVisual = this.controllers[i];\n            if (controllerVisual.isVisible) {\n                const controller = this.controllers[i].controller;\n                controller.update(elapsedTime);\n                controllerVisual.vMatrices = this.vMatrices;\n                controllerVisual.inverseVMatrices = this.vMatrices;\n                controllerVisual.pMatrices = this.pMatrices;\n                controllerVisual.viewports = this._viewports;\n                controllerVisual.viewportOffset = this._viewportOffset;\n                controllerVisual.viewportCount = this._viewportCount;\n                controllerVisual.update(elapsedTime);\n            }\n        }\n        const axesVisuals = this.axesVisibility == (0, $4a6417d29706362f$export$7dbc7c2b82487e42).current ? this.currentAxes : this.axesVisibility == (0, $4a6417d29706362f$export$7dbc7c2b82487e42).previous ? this.previousAxes : null;\n        if (axesVisuals) for(let i = 0; i < axesVisuals.length; i++){\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n                const axes = axesVisual.axes;\n                axes.mMatrix = this.mMatrix;\n                axes.vMatrix = this.vMatrices[0];\n                axes.update(elapsedTime);\n                axesVisual.vMatrices = this.vMatrices;\n                axesVisual.pMatrices = this.pMatrices;\n                axesVisual.isPickingEnabled = this.isPickingEnabled;\n                axesVisual.pickPMatrix = this.pickPMatrix;\n                axesVisual.pickVMatrix = this.pickVMatrix;\n                axesVisual.viewports = this._viewports;\n                axesVisual.viewportOffset = this._viewportOffset;\n                axesVisual.viewportCount = this._viewportCount;\n                axesVisual.update(elapsedTime);\n            }\n        }\n        for(const key in this.fonts){\n            const fontVisual = this.fonts[key];\n            const font = fontVisual.font;\n            font.update();\n            fontVisual.update();\n        }\n    }\n    getVertexPosition(position, pickedId) {\n        for(let i = 0; i < this.transitionBuffers.length; i++){\n            const transitionBuffer = this.transitionBuffers[i];\n            const id = transitionBuffer.pickIdLookup[pickedId];\n            if (id > -1) {\n                const index = transitionBuffer.currentBuffer.lookup[id];\n                const dataView = transitionBuffer.currentBuffer.dataView;\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTranslation(dataView, index, position);\n                break;\n            }\n        }\n    }\n    render(elapsedTime, xrFrame) {\n        return $a123db7d2af0bebc$var$__awaiter(this, void 0, void 0, function*() {});\n    }\n    prepare(xrFrame) {}\n    initializeWebXR(session) {\n        return null;\n    }\n}\n\n\nvar $124829f55b512dce$exports = {};\n\n$parcel$export($124829f55b512dce$exports, \"Main\", () => $2a4365468a86449a$export$861edd1ccea2f746);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $1216b11de4c14ee0$export$7005c9eb6671414d {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get vertexBuffer() {\n        return this._vertexBuffer;\n    }\n    get indexBuffer() {\n        return this._indexBuffer;\n    }\n    get indexCount() {\n        return this._indexCount;\n    }\n    initializeContext(gl) {\n        const _vec3 = (0, $31054a6c69637582$exports).fromValues(2, 2, 2);\n        const _mat4 = (0, $1ac1b59392edf35b$exports).create();\n        (0, $1ac1b59392edf35b$exports).fromScaling(_mat4, _vec3);\n        const vertices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).positions(_mat4);\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n        const indices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).INDICES;\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n        this._indexCount = indices.length;\n        this._isInitialized = true;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $0ec62dfde3a79455$export$e47fdbcb2ea069e5 extends (0, $0a2e9437355c0494$export$caf2f326fb2d2fb4) {\n    get texture() {\n        return this._texture;\n    }\n    get defaultTexture() {\n        return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n        this._gl = gl;\n        this._defaultTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([\n            0xff,\n            0xff,\n            0xff,\n            0xff\n        ]));\n        this._updateTexture();\n    }\n    update() {\n        super.update();\n        if (this._changed) {\n            this._changed = false;\n            this._updateTexture();\n        }\n    }\n    _updateTexture() {\n        if (this._imageData) this._texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n        else this._texture = null;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $3e5fc0fd110780c6$export$e2fbaa661ec19dbf extends (0, $548ced3eab978a8c$export$f05ab453e1597580) {\n    get texture() {\n        return this._texture;\n    }\n    get defaultTexture() {\n        return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n        this._gl = gl;\n        this._defaultTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n        this._updateTexture();\n    }\n    update() {\n        super.update();\n        if (this._changed) {\n            this._changed = false;\n            this._updateTexture();\n        }\n    }\n    _updateTexture() {\n        if (this._colors) {\n            const colors = new Uint8Array(this._colors);\n            for(let i = 0; i < colors.length; i++)colors[i] = Math.pow(colors[i] / 0xff, 2.2) * 0xff;\n            this._texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors);\n        } else this._texture = null;\n    }\n}\n\n\nclass $d5b49779b59f8b97$export$a143d493d941bafc extends (0, $96371271bb28b98d$export$c1cecec923d96e5c) {\n    get vertexBuffer() {\n        return this._vertexBuffer;\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n        this._isInitialized = true;\n    }\n    update() {\n        if (this._isInitialized) {\n            const start = window.performance.now();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n}\nclass $d5b49779b59f8b97$export$76de936b3c1c4170 extends (0, $96371271bb28b98d$export$e17d4fc1dafc1240) {\n    constructor(core, ids){\n        super(core, ids, $d5b49779b59f8b97$export$a143d493d941bafc, (0, $3e5fc0fd110780c6$export$e2fbaa661ec19dbf), (0, $0ec62dfde3a79455$export$e47fdbcb2ea069e5));\n    }\n    initializeContext(gl) {\n        this._buffer1.initializeContext(gl);\n        this._buffer2.initializeContext(gl);\n        this._palette1.initializeContext(this._core, gl);\n        this._palette2.initializeContext(this._core, gl);\n        this._atlas1.initializeContext(this._core, gl);\n        this._atlas2.initializeContext(this._core, gl);\n        this._isInitialized = true;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $3a96f4e19473eeaa$export$29cd7b75162a9425 extends (0, $a123db7d2af0bebc$export$ecd9923dfd29c8e1) {\n    constructor(){\n        super();\n        this.reset();\n    }\n    reset() {\n        this.specularIntensity = 0.15;\n        this.specularPower = 150;\n        this.lightPosition = (0, $31054a6c69637582$exports).fromValues(-0.5, 0.5, 0);\n        this.ambient = 0.01;\n        const _quat1 = (0, $39ece26d1239bb77$exports).create();\n        const _quat2 = (0, $39ece26d1239bb77$exports).create();\n        let angle = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(15);\n        (0, $39ece26d1239bb77$exports).setAxisAngle(_quat1, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, angle);\n        (0, $39ece26d1239bb77$exports).multiply(_quat2, _quat1, _quat2);\n        angle = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(-15);\n        (0, $39ece26d1239bb77$exports).setAxisAngle(_quat1, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, angle);\n        (0, $39ece26d1239bb77$exports).multiply(_quat2, _quat2, _quat1);\n        this.directionToLight = (0, $31054a6c69637582$exports).create();\n        (0, $31054a6c69637582$exports).transformQuat(this.directionToLight, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ, _quat2);\n        this.halfAngle = (0, $31054a6c69637582$exports).create();\n        (0, $31054a6c69637582$exports).add(this.halfAngle, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ, this.directionToLight);\n        (0, $31054a6c69637582$exports).normalize(this.halfAngle, this.halfAngle);\n        this.isFxaaEnabled = false;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $5ea895789fc20d6f$export$e9a269813a6315a4 {\n    bindFramebuffer(framebuffer) {\n        if (this.framebuffer != framebuffer) {\n            this.framebuffer = framebuffer;\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n        }\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n        this.framebuffer = this._gl.createFramebuffer();\n        this.ANGLE_instanced_arrays = gl.getExtension(\"ANGLE_instanced_arrays\");\n        this.OES_standard_derivatives = gl.getExtension(\"OES_standard_derivatives\");\n        this.EXT_frag_depth = gl.getExtension(\"EXT_frag_depth\");\n        this.OES_element_index_uint = gl.getExtension(\"OES_element_index_uint\");\n        this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n}\n$5ea895789fc20d6f$export$e9a269813a6315a4.glsl = {\n    \"anaglyph.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nconst vec3 LEFT_MASK = vec3(1.0, 0.0, 0.0);\\nconst vec3 RIGHT_MASK = vec3(0.0, 1.0, 1.0);\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 color = LEFT_MASK * dot(texture2D(uSampler1, texCoords).rgb, LUMINANCE);\\ncolor += RIGHT_MASK * dot(texture2D(uSampler2, texCoords).rgb, LUMINANCE);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n\",\n    \"color.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec3 vColor;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(vColor, GAMMA), 1.0);\\n}\\n\",\n    \"color.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec3 aColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying lowp vec3 vColor;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvColor = aColor;\\n}\\n\",\n    \"lasso.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\ngl_FragColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n\",\n    \"lasso.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"model.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform sampler2D uSampler;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(texture2D(uSampler, vTexCoord).xyz, GAMMA), 1.0);\\nvec3 color = texture2D(uSampler, vTexCoord).xyz;\\nfloat ambient = 0.01;\\nvec3 normal = normalize(vNormal);\\nfloat diffuse = 0.5 * max(dot(uDirectionToLight, normal), 0.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (ambient + diffuse);\\ncolor += specular;\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n\",\n    \"model.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nvTexCoord = aTexCoord;\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(aNormal, 0.0));\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\n}\\n\",\n    \"pickgrid.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#define Derivatives\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nuniform vec3 uDirectionToLight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick)\\n{\\ngl_FragColor = vColor;\\n}\\nelse\\n{\\nvec2 buffer;\\n#ifdef Derivatives\\nbuffer = fwidth(vTexCoord);\\n#else\\nbuffer = vec2(0.002);\\n#endif\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nfloat diffuse = 0.2 * max(dot(uDirectionToLight, vNormal), 0.0);\\nfloat ambient = 0.8;\\ncolor.xyz *= (ambient + diffuse);\\ncolor.xyz = pow(color.xyz, GAMMA);\\ngl_FragColor = color;\\n}\\n}\\n\",\n    \"pickgrid.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec4 aIdColor;\\nattribute mediump vec2 aTexCoord;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#define Derivatives\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse {\\nfloat distance = texture2D(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\ngl_FragColor = vec4(pow(mix(uBorderColor, mix(uColor, uHoverColor, vHover), value), GAMMA), 1.0);\\n}\\n}\\n\",\n    \"sdftext.vertex.fx\": \"#version 100\\nattribute lowp vec4 aIdColor;\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nif (uPick) {\\ngl_FragColor = vec4(0.0);\\n}\\nelse {\\ngl_FragColor = vec4(texture2D(uSampler, vTexCoord).xyz, 1.0);\\n}\\n}\\n\",\n    \"texture.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": \"#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void)\\n{\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n\",\n    \"unitblock.vertex.fx\": \"#version 100\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n    \"unitcylinder.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - sqrt(h1);\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - sqrt(h2);\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n    \"unitcylinder.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n    \"unithexprism.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform mat4 uVMatrix;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nvec4 iHexPrism( in vec3 ro, in vec3 rd, in float ra, in float he )\\n{\\nconst vec3 n1 = vec3( 1.0,0.0,0.0);\\nconst vec3 n2 = vec3( 0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n3 = vec3(-0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n4 = vec3( 0.0,1.0,0.0);\\nvec3 t1 = vec3((vec2(ra,-ra)-dot(ro,n1))/dot(rd,n1), 1.0);\\nvec3 t2 = vec3((vec2(ra,-ra)-dot(ro,n2))/dot(rd,n2), 1.0);\\nvec3 t3 = vec3((vec2(ra,-ra)-dot(ro,n3))/dot(rd,n3), 1.0);\\nvec3 t4 = vec3((vec2(he,-he)-dot(ro,n4))/dot(rd,n4), 1.0);\\nif( t1.y<t1.x ) t1=vec3(t1.yx,-1.0);\\nif( t2.y<t2.x ) t2=vec3(t2.yx,-1.0);\\nif( t3.y<t3.x ) t3=vec3(t3.yx,-1.0);\\nif( t4.y<t4.x ) t4=vec3(t4.yx,-1.0);\\nvec4 tN=vec4(t1.x,t1.z*n1);\\nif( t2.x>tN.x ) tN=vec4(t2.x,t2.z*n2);\\nif( t3.x>tN.x ) tN=vec4(t3.x,t3.z*n3);\\nif( t4.x>tN.x ) tN=vec4(t4.x,t4.z*n4);\\nfloat tF = min(min(t1.y,t2.y),min(t3.y,t4.y));\\nif( tN.x>tF || tF<0.0) return vec4(-1.0);\\nreturn tN;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = -vViewCenter;\\nmat3 rot = mat3(uVMatrix);\\nvec3 rdd = rd * rot;\\nvec3 roo = ro * rot;\\nvec4 tnor = iHexPrism(roo, rdd, vRadius * vScaling, vHeight * vScaling);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = rot * tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n    \"unithexprism.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvRadius = 0.0;\\nvHeight = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvRadius = scale.x * ROOT_THREE_OVER_TWO;\\nvHeight = scale.y;\\nvec3 position = aPosition;\\nposition.y *= scale.y;\\nposition.z *= scale.x;\\nposition.x *= scale.x * ROOT_THREE_OVER_TWO;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvScaling = length(uMMatrix[0].xyz) / 2.0;\\n}\\n}\\n\",\n    \"unitsdf.fragment.fx\": \"#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform vec3\t uBackgroundColor;\\nuniform float \t uBuffer;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nfloat distance = mix(texture2D(uPreviousSampler1, vPreviousTexCoord).r, texture2D(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer) {\\ndiscard;\\n}\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\nfloat uGamma = 0.0;\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer + gamma, uBuffer, distance);\\ngl_FragColor = vec4(mix(color, uBackgroundColor, value), 1.0);\\n}\\n}\\n\",\n    \"unitsdf.vertex.fx\": \"#version 100\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute mediump vec4 aTexCoord;\\nattribute mediump vec4 aPreviousTexCoord;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n\",\n    \"unitsphere.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat sphIntersect(in vec3 ro, in vec3 rd, in vec4 sph)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot(oc, rd);\\nfloat c = dot(oc, oc) - sph.w * sph.w;\\nfloat h = b * b - c;\\nif (h < 0.0) return -1.0;\\nreturn -b - sqrt(h);\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n    \"unitsphere.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute lowp float aColor;\\nattribute lowp float aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump float vRadius;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec4 translation = vec4(mix(aPreviousTranslation, aTranslation, animation), 1.0);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * translation).xyz;\\ntranslation.xyz += aPosition * scale;\\nvViewPosition = (mvMatrix * translation).xyz;\\ngl_Position = uPMatrix * vec4(vViewPosition, 1.0);\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n\",\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nmat3 transpose(in mat3 mat) {\\nvec3 i0 = mat[0];\\nvec3 i1 = mat[1];\\nvec3 i2 = mat[2];\\nreturn mat3\\n(\\nvec3(i0.x, i1.x, i2.x),\\nvec3(i0.y, i1.y, i2.y),\\nvec3(i0.z, i1.z, i2.z)\\n);\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n};\nclass $5ea895789fc20d6f$export$59a6ab026766925f {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get vertexBuffer() {\n        return this._vertexBuffer;\n    }\n    set vertexBuffer(value) {\n        if (this._vertexBuffer != value) {\n            this._vertexBuffer = value;\n            this._haveBuffersChanged = true;\n        }\n    }\n    get indexBuffer() {\n        return this._indexBuffer;\n    }\n    set indexBuffer(value) {\n        if (this._indexBuffer != value) {\n            this._indexBuffer = value;\n            this._haveBuffersChanged = true;\n        }\n    }\n    constructor(core, main){\n        this._core = core;\n        this._main = main;\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n        const program = this._gl.createProgram();\n        this._gl.attachShader(program, vs);\n        this._gl.attachShader(program, fs);\n        this._gl.linkProgram(program);\n        if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).error, this._gl.getProgramInfoLog(program));\n        return program;\n    }\n    _compileShader(source, type) {\n        const shader = this._gl.createShader(type);\n        this._gl.shaderSource(shader, source);\n        this._gl.compileShader(shader);\n        if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).error, this._gl.getShaderInfoLog(shader));\n        return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n        const remove = `#define ${directive}`;\n        const index = shaderSource.indexOf(remove);\n        shaderSource = index == -1 ? shaderSource : shaderSource.substring(0, index) + shaderSource.substring(index + remove.length);\n        return shaderSource;\n    }\n    prepare() {\n        if (this._program != this._main.shaderResources.currentProgram) {\n            if (this._main.shaderResources.currentShader) this._main.shaderResources.currentShader.disableProgram();\n            this.enableProgram(this._program);\n            this.updateBuffers();\n            this.updateTextures();\n        } else {\n            if (this._haveBuffersChanged) this.updateBuffers();\n            if (this._haveTexturesChanged) this.updateTextures();\n        }\n    }\n    apply() {}\n    applyModel() {}\n    applyView() {}\n    enableProgram(program) {\n        this._gl.useProgram(program);\n        this._main.shaderResources.currentProgram = program;\n        this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n        this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n        this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n        this._main.shaderResources.currentShader = null;\n        this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n        callback(this._includesFromFile($5ea895789fc20d6f$export$e9a269813a6315a4.glsl[vsName]), this._includesFromFile($5ea895789fc20d6f$export$e9a269813a6315a4.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n        this._sourceFromUrl(vsName, (vsSource)=>{\n            this._includesFromUrl(vsSource, 0, (vsIncSource)=>{\n                this._sourceFromUrl(fsName, (fsSource)=>{\n                    this._includesFromUrl(fsSource, 0, (fsIncSource)=>{\n                        callback(vsIncSource, fsIncSource);\n                    });\n                });\n            });\n        });\n    }\n    _sourceFromUrl(url, callback) {\n        const request = new XMLHttpRequest();\n        request.open(\"GET\", (0, $a4596fc55355f0e1$export$433e0478e7f6ca93).combine(this._core.config.shaderPath, url));\n        request.onreadystatechange = ()=>{\n            if (request.readyState == XMLHttpRequest.DONE && request.status == 200) callback(request.responseText);\n        };\n        request.send();\n    }\n    _includesFromFile(source) {\n        let index = 0;\n        do {\n            index = source.indexOf(\"#include\", index);\n            if (index != -1) {\n                const start = source.indexOf(\"\\\"\", index);\n                const end = source.indexOf(\"\\\"\", start + 1);\n                const name = source.substring(start + 1, end);\n                const inc = $5ea895789fc20d6f$export$e9a269813a6315a4.glsl[name];\n                source = source.substring(0, index) + inc + source.substring(end + 1);\n            }\n        }while (index != -1);\n        return source;\n    }\n    _includesFromUrl(source, index, callback) {\n        index = source.indexOf(\"#include\", index);\n        if (index != -1) {\n            const start = source.indexOf(\"\\\"\", index);\n            const end = source.indexOf(\"\\\"\", start + 1);\n            const name = source.substring(start + 1, end);\n            this._sourceFromUrl((0, $a4596fc55355f0e1$export$433e0478e7f6ca93).combine(\"inc\", name), (include)=>{\n                source = source.substring(0, index) + include + source.substring(end + 1);\n                this._includesFromUrl(source, index, callback);\n            });\n        } else callback(source);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $8c45895df6e4c752$export$892596cec99bc70e extends (0, $5ea895789fc20d6f$export$59a6ab026766925f) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"color.vertex.fx\", \"color.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).POSITION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._colorAttribute, 3, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$6597d9a580deb707).COLOR_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $0bc042355ce24bf2$export$5431306cf43de24a extends (0, $5ea895789fc20d6f$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n        this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).POSITION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).NORMAL_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._normalAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $79f5d05e1849f9e7$export$dc8af347244861ce extends (0, $5ea895789fc20d6f$export$59a6ab026766925f) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n        this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n        this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform3fv(this._colorUniform, this.color);\n        this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$538532535e0e8594).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$538532535e0e8594).POSITION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$538532535e0e8594).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$538532535e0e8594).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $f3a972bc0ef40bc6$export$a1edc412be3e1841 extends (0, $5ea895789fc20d6f$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"model.vertex.fx\", \"model.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n        this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n        this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n        this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform1i(this._samplerUniform, 0);\n        this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n        this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n    }\n    applyView() {\n        this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n        this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).POSITION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).NORMAL_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._normalAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $e9174d935ec6042d$export$a3be0de02f08c3be extends (0, $5ea895789fc20d6f$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource)=>{\n            if (this._main.shaderResources.OES_standard_derivatives == null) fsSource = this._removeDirective(fsSource, \"Derivatives\");\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n        this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n        this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n        this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n        this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n        this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n        this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n        this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1i(this._samplerUniform, 0);\n        this._gl.uniform3fv(this._colorUniform, this.color);\n        this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n        this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n        this._gl.uniform1f(this._gammaUniform, this.gamma);\n        this._gl.uniform1f(this._bufferUniform, this.buffer);\n        this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n        this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n        this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).ID_COLOR_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._idColorAttribute);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).POSITION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $b81993c7a1128963$export$3b812729b68dda3e extends (0, $5ea895789fc20d6f$export$59a6ab026766925f) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource)=>{\n            if (this._main.shaderResources.OES_standard_derivatives == null) fsSource = this._removeDirective(fsSource, \"Derivatives\");\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n        this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n        this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n        this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n        this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n        this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n        this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n        this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n        this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n        this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n        this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n        this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n        this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n        this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n        this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n        this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n        this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n        this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n        this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n        this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n        this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n        this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n        this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n        this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n        this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n        this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n        this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n        this._gl.uniform2fv(this._zeroUniform, this.zero);\n        this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).TRANSLATION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).NORMAL_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._normalAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).ID_COLOR_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._idColorAttribute);\n        this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).BOUNDS_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._boundsAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $46ea8e3175829f45$export$c4c8cc0016dff604 extends (0, $5ea895789fc20d6f$export$59a6ab026766925f) {\n    get paletteTexture() {\n        return this._paletteTexture;\n    }\n    set paletteTexture(value) {\n        if (this._paletteTexture != value) {\n            this._paletteTexture = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get previousPaletteTexture() {\n        return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value) {\n        if (this._previousPaletteTexture != value) {\n            this._previousPaletteTexture = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get sdfTexture() {\n        return this._sdfTexture;\n    }\n    set sdfTexture(value) {\n        if (this._sdfTexture != value) {\n            this._sdfTexture = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get previousSdfTexture() {\n        return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value) {\n        if (this._previousSdfTexture != value) {\n            this._previousSdfTexture = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    set instanceBuffer(value) {\n        if (this._instanceBuffer != value) {\n            this._instanceBuffer = value;\n            this._haveBuffersChanged = true;\n        }\n    }\n    set previousInstanceBuffer(value) {\n        if (this._previousInstanceBuffer != value) {\n            this._previousInstanceBuffer = value;\n            this._haveBuffersChanged = true;\n        }\n    }\n    initializeData() {\n        this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n        this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n        this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n        this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n        this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n        this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n        this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n        this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n        this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n        this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n        this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n        this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n        this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n        this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n        this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n        this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n        this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n        this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n        this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n        this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n        this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n        this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n        this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n        this._ambientUniform = gl.getUniformLocation(this._program, \"uAmbient\");\n        this._activeColorUniform = gl.getUniformLocation(this._program, \"uActiveColor\");\n        this._selectedColorUniform = gl.getUniformLocation(this._program, \"uSelectedColor\");\n        this._highlightModeUniform = gl.getUniformLocation(this._program, \"uHighlightMode\");\n        const vertices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).POSITIONS;\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n        const indices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).INDICES;\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n        this.indexCount = indices.length;\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._updateCurrentBuffer();\n        this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n        this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ID_HOVER_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 1);\n        this._gl.enableVertexAttribArray(this._idAttribute);\n        this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ID_COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._idColorAttribute);\n        this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).TRANSLATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._translationAttribute);\n        this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SCALE_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 1);\n        this._gl.enableVertexAttribArray(this._scaleAttribute);\n        this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SELECTED_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 1);\n        this._gl.enableVertexAttribArray(this._selectedAttribute);\n        this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ORDER_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 1);\n        this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        if (this._previousInstanceBuffer != this._instanceBuffer) this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n        this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).TRANSLATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n        this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SCALE_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n        this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SELECTED_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform1f(this._timeUniform, this.time);\n        this._gl.uniform1f(this._durationUniform, this.duration);\n        this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n        this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n        this._gl.uniform1i(this._previousSampler0Uniform, 0);\n        this._gl.uniform1i(this._sampler0Uniform, 1);\n        this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n        this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n        this._gl.uniform1f(this._ambientUniform, this.ambient);\n        this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n        this._gl.uniform3fv(this._activeColorUniform, this.activeColor);\n        this._gl.uniform3fv(this._selectedColorUniform, this.selectedColor);\n        this._gl.uniform1f(this._hoverUniform, this.hover);\n        this._gl.uniform1f(this._activeUniform, this.active);\n        this._gl.uniform1f(this._highlightModeUniform, this.highlightMode == (0, $4a6417d29706362f$export$6b731eb2fd512fe0).luminance ? 0.0 : 1.0);\n    }\n    applyView() {\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n        this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n        this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n    }\n    updateTextures() {\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n        this._gl.activeTexture(this._gl.TEXTURE1);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n        super.disableProgram();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 0);\n    }\n}\n\n\nclass $592f874dfaaf58b7$export$b72dd5e86522410a extends (0, $46ea8e3175829f45$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource)=>{\n            if (this._main.shaderResources.OES_standard_derivatives == null) {\n                vsSource = this._removeDirective(vsSource, \"Derivatives\");\n                fsSource = this._removeDirective(fsSource, \"Derivatives\");\n            }\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n        this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._rotationAttribute);\n        this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n        super.disableProgram();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $8cca1fe874486634$export$427a5e80ce652e7d extends (0, $46ea8e3175829f45$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource)=>{\n            if (this._main.shaderResources.EXT_frag_depth == null) fsSource = this._removeDirective(fsSource, \"FragDepth\");\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $1876c8aeb7dcd226$export$28e50bed796372f2 extends (0, $46ea8e3175829f45$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource)=>{\n            if (this._main.shaderResources.EXT_frag_depth == null) fsSource = this._removeDirective(fsSource, \"FragDepth\");\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n        this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._rotationAttribute);\n        this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n        super.disableProgram();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $aa73a9318009cb1a$export$d39efaf3a2b8a5a extends (0, $46ea8e3175829f45$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unithexprism.vertex.fx\", \"unithexprism.fragment.fx\", (vsSource, fsSource)=>{\n            if (this._main.shaderResources.EXT_frag_depth == null) fsSource = this._removeDirective(fsSource, \"FragDepth\");\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n        this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._rotationAttribute);\n        this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n        super.disableProgram();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $67534a528c920bae$export$b0bdf50006eaaa7a extends (0, $46ea8e3175829f45$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource)=>{\n            if (this._main.shaderResources.OES_standard_derivatives == null) {\n                vsSource = this._removeDirective(vsSource, \"Derivatives\");\n                fsSource = this._removeDirective(fsSource, \"Derivatives\");\n            }\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n        this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n        this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n        this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n        this._sdfBufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n        this._sdfBackgroundColorUniform = gl.getUniformLocation(this._program, \"uBackgroundColor\");\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._rotationAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).TEXCOORD_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 1);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n        this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).TEXCOORD_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n        super.apply();\n        this._gl.uniform1i(this._previousSampler1Uniform, 2);\n        this._gl.uniform1i(this._sampler1Uniform, 3);\n        this._gl.uniform1f(this._sdfBufferUniform, this.sdfBuffer);\n        this._gl.uniform3fv(this._sdfBackgroundColorUniform, this.sdfBackgroundColor);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE2);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n        this._gl.activeTexture(this._gl.TEXTURE3);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n        super.disableProgram();\n        const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 0);\n        ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 0);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $113219cc0f7990e8$export$6a2b78e9604d5b98 extends (0, $5ea895789fc20d6f$export$59a6ab026766925f) {\n    get texture2D1() {\n        return this._texture2D1;\n    }\n    set texture2D1(value) {\n        if (this._texture2D1 != value) {\n            this._texture2D1 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D2() {\n        return this._texture2D2;\n    }\n    set texture2D2(value) {\n        if (this._texture2D2 != value) {\n            this._texture2D2 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"anaglyph.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n        this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n        this._gl.uniform1i(this._samplerUniform1, 0);\n        this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n        this._gl.activeTexture(this._gl.TEXTURE1);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n        this._gl.activeTexture(this._gl.TEXTURE2);\n    }\n}\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $71eca2ce7fbde895$export$2d88a2ee0a1b34a {\n    get isInitialized() {\n        return this._isInitialized && this._main.colorShader.isInitialized;\n    }\n    constructor(core, main, debugAxes){\n        this._main = main;\n        this._debugAxes = debugAxes;\n        this.isVisible = true;\n    }\n    initializeContext(gl) {\n        if (!this._debugAxes.isInitialized) this._debugAxes.initialize();\n        this._gl = gl;\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._debugAxes.vertices, gl.STATIC_DRAW);\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._debugAxes.indices, gl.STATIC_DRAW);\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {}\n    render(elapsedTime, xrFrame) {\n        if (this.isInitialized) {\n            const colorShader = this._main.colorShader;\n            const shaderResources = this._main.shaderResources;\n            colorShader.vertexBuffer = this._vertexBuffer;\n            colorShader.indexBuffer = this._indexBuffer;\n            colorShader.prepare();\n            colorShader.mMatrix = this.mMatrix;\n            colorShader.apply();\n            for(let i = 0; i < this.viewportCount; i++){\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                colorShader.vMatrix = this.vMatrices[viewport];\n                colorShader.pMatrix = this.pMatrices[viewport];\n                colorShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._debugAxes.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $dc98a3a9e3221094$export$ab05abf6f96a5bb1 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get axes() {\n        return this._axes;\n    }\n    constructor(core){\n        this._core = core;\n        this.isVisible = true;\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n    }\n    update(elapsedTime) {}\n    render(elapsedTime, xrFrame) {\n        if (this.isInitialized) {\n            this._renderGrid();\n            this._renderText();\n        }\n    }\n    _renderGrid() {}\n    _renderText() {}\n}\n\n\n\n\n\nclass $aca0a8f90b5c931c$export$30e3ee7ba3e49080 extends (0, $dc98a3a9e3221094$export$ab05abf6f96a5bb1) {\n    get isInitialized() {\n        return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes){\n        super(core);\n        this._main = main;\n        this._axes = cartesian2dAxes;\n        this._axes.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        const axes = this._axes;\n        if (!axes.isInitialized) axes.initialize();\n        if (axes.gridVertices) this._createGridBuffers();\n        if (axes.textVertices) this._createTextBuffers();\n        this._isInitialized = true;\n    }\n    _createGridBuffers() {\n        const axes = this._axes;\n        this._gridVertexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n        this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n        this._gridIndexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n        this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n        this._gridBufferSize = axes.gridVertices.byteLength;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n        const axes = this._axes;\n        this._textVertexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n        this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n        this._textIndexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n        this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n        this._textBufferSize = axes.textVertices.byteLength;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            const axes = this._axes;\n            if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) this._createGridBuffers();\n            else {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d visual grid buffers updated`);\n            }\n            if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) this._createTextBuffers();\n            else {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d visual text buffers updated`);\n            }\n            this._main.shaderResources.currentProgram = null;\n        }\n    }\n    _renderText() {\n        const axes = this._axes;\n        const shader = this._main.sdfTextShader;\n        const shaderResources = this._main.shaderResources;\n        const fontVisual = this._main.fonts[axes.font.name];\n        shader.vertexBuffer = this._textVertexBuffer;\n        shader.indexBuffer = this._textIndexBuffer;\n        shader.texture2D = fontVisual.texture;\n        shader.prepare();\n        shader.buffer = fontVisual.font.edgeValue / 0xff;\n        shader.gamma = axes.gamma;\n        shader.borderWidth = axes.textBorderWidth;\n        shader.color = axes.textColor || this._core.config.axesTextColor;\n        shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n        shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n        shader.pickedIdColor = this.pickedIdColor;\n        shader.apply();\n        let indexCount, indexOffset;\n        for(let axisId = 0; axisId < 2; axisId++){\n            const orientation = axes.getLabelOrientation(axisId);\n            for(let edge = 0; edge < 2; edge++){\n                const edgeId = (0, $3ce6ee188e300946$export$7005c9eb6671414d).AXIS_EDGES[axisId][edge];\n                if (axes.isEdgeVisible[edgeId]) {\n                    if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                        indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                        indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                    } else {\n                        indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                        indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                    }\n                    if (indexCount > 0) {\n                        shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        for(let i = 0; i < this.viewportCount; i++){\n                            const viewport = i + this.viewportOffset;\n                            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                    indexCount = axes.getTitleIndexCount(axisId);\n                    if (indexCount > 0) {\n                        indexOffset = axes.getTitleIndexOffset(axisId);\n                        shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        for(let i = 0; i < this.viewportCount; i++){\n                            const viewport = i + this.viewportOffset;\n                            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                }\n                indexCount = axes.getHeadingIndexCount(axisId);\n                if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                    indexOffset = axes.getHeadingIndexOffset(axisId);\n                    shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                    shader.applyModel();\n                    shader.isPickShader = false;\n                    for(let i = 0; i < this.viewportCount; i++){\n                        const viewport = i + this.viewportOffset;\n                        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                        shader.vMatrix = this.vMatrices[viewport];\n                        shader.pMatrix = this.pMatrices[viewport];\n                        shader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                    }\n                    if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                        shader.isPickShader = true;\n                        shader.pMatrix = this.pickPMatrix;\n                        shader.vMatrix = this.pickVMatrix;\n                        shader.applyView();\n                        shaderResources.bindFramebuffer(this.pickFramebuffer);\n                        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                    }\n                }\n            }\n        }\n    }\n    _renderGrid() {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        gridShader.vertexBuffer = this._gridVertexBuffer;\n        gridShader.indexBuffer = this._gridIndexBuffer;\n        gridShader.prepare();\n        gridShader.majorThickness = axes.gridMajorThickness;\n        gridShader.minorThickness = axes.gridMinorThickness;\n        gridShader.zeroThickness = axes.gridZeroThickness;\n        gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n        gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n        gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n        gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n        gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n        gridShader.pickedIdColor = this.pickedIdColor;\n        gridShader.directionToLight = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ;\n        gridShader.apply();\n        for(let axisId = 0; axisId < 2; axisId++)if (axes.arePickDivisionsVisible[axisId]) {\n            const gridTicksScale = axes.getGridTicksScale(axisId);\n            const width = gridTicksScale[0];\n            const height = gridTicksScale[1];\n            gridShader.zero = axes.getGridTicksZero(axisId);\n            gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n            for(let edge = 0; edge < 2; edge++){\n                const edgeId = (0, $3ce6ee188e300946$export$7005c9eb6671414d).AXIS_EDGES[axisId][edge];\n                if (axes.isEdgeVisible[edgeId]) this._renderGridTicks(axisId, edgeId, width, height);\n            }\n        }\n        this._gl.disable(this._gl.CULL_FACE);\n        const size = axes.size;\n        const axisId2 = 0;\n        const axisId3 = 1;\n        const width = size[axisId2];\n        const height = size[axisId3];\n        gridShader.zero = axes.gridFaceZero;\n        gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n        for(let face = 0; face < 2; face++){\n            const faceId = face;\n            if (axes.getIsForwardFace(faceId)) this._renderGridFace(faceId, width, height);\n        }\n        this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width, height) {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        const shaderResources = this._main.shaderResources;\n        gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n        gridShader.faceWidth = width;\n        gridShader.faceHeight = height;\n        gridShader.ApplyFace();\n        gridShader.isPickShader = false;\n        for(let i = 0; i < this.viewportCount; i++){\n            const viewport = i + this.viewportOffset;\n            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            gridShader.vMatrix = this.vMatrices[viewport];\n            gridShader.pMatrix = this.pMatrices[viewport];\n            gridShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n        }\n        if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n            gridShader.isPickShader = true;\n            gridShader.vMatrix = this.pickVMatrix;\n            gridShader.pMatrix = this.pickPMatrix;\n            gridShader.applyView();\n            shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, this._axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, this._axes.getGridTicksIndexOffset(axisId) * 2);\n        }\n    }\n    _renderGridFace(faceId, width, height) {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        const shaderResources = this._main.shaderResources;\n        gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n        gridShader.faceWidth = width;\n        gridShader.faceHeight = height;\n        gridShader.ApplyFace();\n        gridShader.isPickShader = false;\n        for(let i = 0; i < this.viewportCount; i++){\n            const viewport = i + this.viewportOffset;\n            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            gridShader.vMatrix = this.vMatrices[viewport];\n            gridShader.pMatrix = this.pMatrices[viewport];\n            gridShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n        }\n        if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n            gridShader.isPickShader = true;\n            gridShader.vMatrix = this.pickVMatrix;\n            gridShader.pMatrix = this.pickPMatrix;\n            gridShader.applyView();\n            shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $a7eaec60ae84313c$export$3dc3b91df297f2ee extends (0, $dc98a3a9e3221094$export$ab05abf6f96a5bb1) {\n    get isInitialized() {\n        return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes){\n        super(core);\n        this._main = main;\n        this._axes = cartesian3dAxes;\n        this._axes.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        const axes = this._axes;\n        if (!axes.isInitialized) axes.initialize();\n        if (axes.gridVertices) this._createGridBuffers();\n        if (axes.textVertices) this._createTextBuffers();\n        this._isInitialized = true;\n    }\n    _createGridBuffers() {\n        const axes = this._axes;\n        this._gridVertexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n        this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n        this._gridIndexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n        this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n        this._gridBufferSize = axes.gridVertices.byteLength;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n        const axes = this._axes;\n        this._textVertexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n        this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n        this._textIndexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n        this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n        this._textBufferSize = axes.textVertices.byteLength;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            const axes = this._axes;\n            if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) this._createGridBuffers();\n            else {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d visual grid buffers updated`);\n            }\n            if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) this._createTextBuffers();\n            else {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d visual text buffers updated`);\n            }\n            this._main.shaderResources.currentProgram = null;\n        }\n    }\n    _renderText() {\n        const axes = this._axes;\n        const shader = this._main.sdfTextShader;\n        const shaderResources = this._main.shaderResources;\n        const fontVisual = this._main.fonts[axes.font.name];\n        shader.vertexBuffer = this._textVertexBuffer;\n        shader.indexBuffer = this._textIndexBuffer;\n        shader.texture2D = fontVisual.texture;\n        shader.prepare();\n        shader.buffer = fontVisual.font.edgeValue / 0xff;\n        shader.gamma = axes.gamma;\n        shader.borderWidth = axes.textBorderWidth;\n        shader.color = axes.textColor || this._core.config.axesTextColor;\n        shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n        shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n        shader.pickedIdColor = this.pickedIdColor;\n        shader.apply();\n        let indexCount, indexOffset;\n        for(let axisId = 0; axisId < 3; axisId++){\n            const orientation = axes.getLabelOrientation(axisId);\n            for(let edge = 0; edge < 4; edge++){\n                const edgeId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_EDGES[axisId][edge];\n                if (axes.getIsOutsideEdge(edgeId)) {\n                    if (axes.isEdgeVisible[edgeId]) {\n                        if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                            indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                            indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                        } else {\n                            indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                            indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                        }\n                        if (indexCount > 0) {\n                            shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            for(let i = 0; i < this.viewportCount; i++){\n                                const viewport = i + this.viewportOffset;\n                                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                        indexCount = axes.getTitleIndexCount(axisId);\n                        if (indexCount > 0) {\n                            indexOffset = axes.getTitleIndexOffset(axisId);\n                            shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            for(let i = 0; i < this.viewportCount; i++){\n                                const viewport = i + this.viewportOffset;\n                                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                    indexCount = axes.getHeadingIndexCount(axisId);\n                    if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                        indexOffset = axes.getHeadingIndexOffset(axisId);\n                        shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        for(let i = 0; i < this.viewportCount; i++){\n                            const viewport = i + this.viewportOffset;\n                            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                }\n            }\n        }\n    }\n    _renderGrid() {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        gridShader.vertexBuffer = this._gridVertexBuffer;\n        gridShader.indexBuffer = this._gridIndexBuffer;\n        gridShader.prepare();\n        gridShader.majorThickness = axes.gridMajorThickness;\n        gridShader.minorThickness = axes.gridMinorThickness;\n        gridShader.zeroThickness = axes.gridZeroThickness;\n        gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n        gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n        gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n        gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n        gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n        gridShader.pickedIdColor = this.pickedIdColor;\n        gridShader.directionToLight = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ;\n        gridShader.apply();\n        for(let axisId = 0; axisId < 3; axisId++)if (axes.arePickDivisionsVisible[axisId]) {\n            const gridTicksScale = axes.getGridTicksScale(axisId);\n            const width = gridTicksScale[0];\n            const height = gridTicksScale[1];\n            gridShader.zero = axes.getGridTicksZero(axisId);\n            gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n            for(let edge = 0; edge < 4; edge++){\n                const edgeId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_EDGES[axisId][edge];\n                if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) this._renderGridTicks(axisId, edgeId, width, height);\n            }\n        }\n        this._gl.disable(this._gl.CULL_FACE);\n        const size = axes.size;\n        for(let axisId = 0; axisId < 3; axisId++)if (axes.areFacesVisible[axisId]) {\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            const width = size[axisId2];\n            const height = size[axisId3];\n            gridShader.zero = axes.getGridFaceZero(axisId);\n            gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n            for(let face = 0; face < 2; face++){\n                const faceId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_FACES[axisId][face];\n                if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) this._renderGridFace(faceId, width, height);\n            }\n        }\n        this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width, height) {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        const shaderResources = this._main.shaderResources;\n        gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n        gridShader.faceWidth = width;\n        gridShader.faceHeight = height;\n        gridShader.ApplyFace();\n        gridShader.isPickShader = false;\n        for(let i = 0; i < this.viewportCount; i++){\n            const viewport = i + this.viewportOffset;\n            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            gridShader.vMatrix = this.vMatrices[viewport];\n            gridShader.pMatrix = this.pMatrices[viewport];\n            gridShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n        }\n        if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n            gridShader.isPickShader = true;\n            gridShader.vMatrix = this.pickVMatrix;\n            gridShader.pMatrix = this.pickPMatrix;\n            gridShader.applyView();\n            shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n        }\n    }\n    _renderGridFace(faceId, width, height) {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        const shaderResources = this._main.shaderResources;\n        gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n        gridShader.faceWidth = width;\n        gridShader.faceHeight = height;\n        gridShader.ApplyFace();\n        gridShader.isPickShader = false;\n        for(let i = 0; i < this.viewportCount; i++){\n            const viewport = i + this.viewportOffset;\n            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            gridShader.vMatrix = this.vMatrices[viewport];\n            gridShader.pMatrix = this.pMatrices[viewport];\n            gridShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n        }\n        if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n            gridShader.isPickShader = true;\n            gridShader.vMatrix = this.pickVMatrix;\n            gridShader.pMatrix = this.pickPMatrix;\n            gridShader.applyView();\n            shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $1a9dbf3e657aba80$export$c6e88a9dc8138322 {\n    get isInitialized() {\n        return this._isInitialized && this._modelShader.isInitialized && this._colorShader.isInitialized;\n    }\n    get controller() {\n        return this._controller;\n    }\n    constructor(core, main, controller){\n        this._core = core;\n        this._main = main;\n        this._mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._vec3 = (0, $31054a6c69637582$exports).create();\n        this._controller = controller;\n        this._modelShader = main.modelShader;\n        this._colorShader = main.colorShader;\n        this.mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.rayMMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.isVisible = true;\n    }\n    initializeContext(gl) {\n        if (!this._controller.isInitialized) this._controller.initialize();\n        this._initialize(gl);\n    }\n    _initialize(gl) {\n        this._gl = gl;\n        this.modelTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).fromImage(gl, this._controller.texture, false, gl.LINEAR);\n        this._modelVertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._modelVertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._controller.vertices, gl.STATIC_DRAW);\n        this._modelIndexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._modelIndexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.indices, gl.STATIC_DRAW);\n        this._rayVertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._rayVertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._controller.rayVertices, gl.STATIC_DRAW);\n        this._rayIndexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._rayIndexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.rayIndices, gl.STATIC_DRAW);\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {}\n    render(elapsedTime, xrFrame) {\n        if (this.isInitialized) {\n            this._modelShader.vertexBuffer = this._modelVertexBuffer;\n            this._modelShader.indexBuffer = this._modelIndexBuffer;\n            this._modelShader.texture2D = this.modelTexture;\n            this._modelShader.prepare();\n            (0, $1ac1b59392edf35b$exports).multiply(this._mMatrix, this._controller.useRayPose ? this.rayMMatrix : this.mMatrix, this._controller.mMatrix);\n            this._modelShader.mMatrix = this._mMatrix;\n            this._modelShader.specularPower = 10;\n            this._modelShader.specularIntensity = 0.01;\n            this._modelShader.apply();\n            this._modelShader.applyModel();\n            for(let i = 0; i < this.viewportCount; i++){\n                const viewport = i + this.viewportOffset;\n                this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                this._modelShader.directionToLight = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ;\n                this._modelShader.halfAngle = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ;\n                this._modelShader.vMatrix = this.vMatrices[viewport];\n                this._modelShader.pMatrix = this.pMatrices[viewport];\n                this._modelShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, this._controller.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n            if (this.isRayVisible) {\n                this._colorShader.vertexBuffer = this._rayVertexBuffer;\n                this._colorShader.indexBuffer = this._rayIndexBuffer;\n                this._colorShader.prepare();\n                (0, $1ac1b59392edf35b$exports).multiply(this._mMatrix, this.rayMMatrix, this._controller.rayMMatrix);\n                this._colorShader.mMatrix = this._mMatrix;\n                this._colorShader.apply();\n                this._colorShader.applyModel();\n                for(let i = 0; i < this.viewportCount; i++){\n                    const viewport = i + this.viewportOffset;\n                    this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    this._colorShader.vMatrix = this.vMatrices[viewport];\n                    this._colorShader.pMatrix = this.pMatrices[viewport];\n                    this._colorShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._controller.rayIndexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $0a92364922ad8eff$export$6f251cd327b2ff1 {\n    get isInitialized() {\n        return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n        return this._image;\n    }\n    constructor(core, main, image){\n        this._core = core;\n        this._main = main;\n        this._image = image;\n        this._image.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n        this.mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.isVisible = true;\n    }\n    initializeContext(gl) {\n        if (!this._image.isInitialized) this._image.initialize();\n        this._gl = gl;\n        if (this._image.imageData) this.texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).fromImage(gl, this._image.imageData, false, gl.LINEAR);\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n            this._main.shaderResources.currentProgram = null;\n        }\n    }\n    render(elapsedTime, xrFrame) {\n        if (this.isInitialized) {\n            const textureShader = this._main.textureShader;\n            const shaderResources = this._main.shaderResources;\n            textureShader.vertexBuffer = this._vertexBuffer;\n            textureShader.indexBuffer = this._indexBuffer;\n            textureShader.texture2D = this.texture;\n            textureShader.prepare();\n            textureShader.mMatrix = this.mMatrix;\n            textureShader.isPickShader = false;\n            textureShader.apply();\n            for(let i = 0; i < this.viewportCount; i++){\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                textureShader.vMatrix = this.vMatrices[viewport];\n                textureShader.pMatrix = this.pMatrices[viewport];\n                textureShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n            if (this.isPickingEnabled) {\n                textureShader.isPickShader = true;\n                textureShader.vMatrix = this.pickVMatrix;\n                textureShader.pMatrix = this.pickPMatrix;\n                textureShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n        }\n    }\n}\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $89e74fd9966daa2d$var$LabelVisualBase {\n    get isInitialized() {\n        return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label){\n        this._core = core;\n        this._main = main;\n        this._label = label;\n        this._label.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n        this._mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.isVisible = true;\n    }\n    initializeContext(gl) {\n        if (!this._label.isInitialized) this._label.initialize();\n        this._gl = gl;\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n            this._main.shaderResources.currentProgram = null;\n        }\n    }\n    render(elapsedTime, xrFrame) {\n        if (this.isInitialized) {\n            const indexCount = this._label.indexCount;\n            if (indexCount > 0) {\n                const shader = this._main.sdfTextShader;\n                const fontVisual = this._main.fonts[this._label.font.name];\n                shader.vertexBuffer = this._vertexBuffer;\n                shader.indexBuffer = this._indexBuffer;\n                shader.texture2D = fontVisual.texture;\n                shader.prepare();\n                shader.gamma = this._label.gamma;\n                shader.buffer = fontVisual.font.edgeValue / 0xff;\n                shader.borderWidth = this._label.borderWidth;\n                shader.color = this._label.color || this._core.config.textColor;\n                shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n                shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n                shader.pickedIdColor = this.pickedIdColor;\n                shader.apply();\n                (0, $1ac1b59392edf35b$exports).multiply(this._mMatrix, this.mMatrix, this._label.mMatrix);\n                shader.mMatrix = this._mMatrix;\n                shader.applyModel();\n                shader.isPickShader = false;\n                for(let i = 0; i < this.viewportCount; i++){\n                    const viewport = i + this.viewportOffset;\n                    this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    shader.vMatrix = this.vMatrices[viewport];\n                    shader.pMatrix = this.pMatrices[viewport];\n                    shader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n                }\n                if (this.isPickingEnabled) {\n                    shader.isPickShader = true;\n                    shader.pMatrix = this.pickPMatrix;\n                    shader.vMatrix = this.pickVMatrix;\n                    shader.applyView();\n                    this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n                }\n            }\n        }\n    }\n}\nclass $89e74fd9966daa2d$export$71c7fa1581020e2c extends $89e74fd9966daa2d$var$LabelVisualBase {\n    get label() {\n        return this._label;\n    }\n    set text(value) {\n        this._label.text = value;\n    }\n    get text() {\n        return this._label.text;\n    }\n    constructor(core, main, label){\n        super(core, main, label);\n    }\n}\nclass $89e74fd9966daa2d$export$97e93e7019ef67b9 extends $89e74fd9966daa2d$var$LabelVisualBase {\n    get label() {\n        return this._label;\n    }\n    constructor(core, main, label){\n        super(core, main, label);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $504631b62e7a70e2$export$e784a6eab4d2d700 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get font() {\n        return this._font;\n    }\n    constructor(core, font){\n        this._core = core;\n        this._font = font;\n        font.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n        this._isInitialized = true;\n        if (this._font.count > 0) this._hasChanged = true;\n    }\n    update() {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            this.texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this._font.name} texture updated`);\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $7e67d5ea424e364b$export$dc8af347244861ce {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get vertexBuffer() {\n        return this._vertexBuffer;\n    }\n    get indexBuffer() {\n        return this._indexBuffer;\n    }\n    get indexCount() {\n        return this._indexCount;\n    }\n    initializeContext(gl) {\n        const vertices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).textured((0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY);\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n        const indices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).INDICES;\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n        this._indexCount = indices.length;\n        this._isInitialized = true;\n    }\n}\n\n\nvar $2a4365468a86449a$var$__awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nclass $2a4365468a86449a$export$861edd1ccea2f746 extends (0, $a123db7d2af0bebc$export$30686c90897c890d) {\n    get shaderResources() {\n        return this._shaderResources;\n    }\n    get colorShader() {\n        return this._colorShader;\n    }\n    get textureShader() {\n        return this._textureShader;\n    }\n    get lassoShader() {\n        return this._lassoShader;\n    }\n    get modelShader() {\n        return this._modelShader;\n    }\n    get sdfTextShader() {\n        return this._sdfTextShader;\n    }\n    get gridShader() {\n        return this._gridShader;\n    }\n    get blockShader() {\n        return this._blockShader;\n    }\n    get sphereShader() {\n        return this._sphereShader;\n    }\n    get cyclinderShader() {\n        return this._cylinderShader;\n    }\n    get hexPrismShader() {\n        return this._hexPrismShader;\n    }\n    get sdfShader() {\n        return this._sdfShader;\n    }\n    get anaglyphShader() {\n        return this._anaglyphShader;\n    }\n    get currentAxes() {\n        return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value) {\n        if (this._isAxes1Current) this._axes1 = value;\n        else this._axes2 = value;\n    }\n    get previousAxes() {\n        return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value) {\n        if (this._isAxes1Current) this._axes2 = value;\n        else this._axes1 = value;\n    }\n    get config() {\n        return this._config;\n    }\n    constructor(options){\n        super(options);\n        this._config = new (0, $3a96f4e19473eeaa$export$29cd7b75162a9425)();\n        this._quad = new (0, $1216b11de4c14ee0$export$7005c9eb6671414d)();\n        this._lasso = new (0, $7e67d5ea424e364b$export$dc8af347244861ce)();\n        this._pickedPixels = new Uint8Array(4);\n        this._pickedIdColor = (0, $4c4ac78b213a9c07$exports).create();\n        this._mat3 = (0, $ba3ca37806a2b6fa$exports).create();\n        this._directionToCamera = (0, $31054a6c69637582$exports).create();\n        this._directionToLight = (0, $31054a6c69637582$exports).create();\n        this._halfAngle = (0, $31054a6c69637582$exports).create();\n        this._cameraPosition = (0, $31054a6c69637582$exports).create();\n        this._modelPosition = (0, $31054a6c69637582$exports).create();\n        this.depthEnabled = true;\n    }\n    get isSupported() {\n        return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    get isWebXRSupported() {\n        return true;\n    }\n    initialize(core) {\n        super.initialize(core);\n        this._shaderResources = new (0, $5ea895789fc20d6f$export$e9a269813a6315a4)();\n        this._colorShader = new (0, $8c45895df6e4c752$export$892596cec99bc70e)(this._core, this);\n        this._textureShader = new (0, $0bc042355ce24bf2$export$5431306cf43de24a)(this._core, this);\n        this._lassoShader = new (0, $79f5d05e1849f9e7$export$dc8af347244861ce)(this._core, this);\n        this._modelShader = new (0, $f3a972bc0ef40bc6$export$a1edc412be3e1841)(this._core, this);\n        this._sdfTextShader = new (0, $e9174d935ec6042d$export$a3be0de02f08c3be)(this._core, this);\n        this._gridShader = new (0, $b81993c7a1128963$export$3b812729b68dda3e)(this._core, this);\n        this._anaglyphShader = new (0, $113219cc0f7990e8$export$6a2b78e9604d5b98)(this._core, this);\n        this._blockShader = new (0, $592f874dfaaf58b7$export$b72dd5e86522410a)(this._core, this);\n        this._sphereShader = new (0, $8cca1fe874486634$export$427a5e80ce652e7d)(this._core, this);\n        this._cylinderShader = new (0, $1876c8aeb7dcd226$export$28e50bed796372f2)(this._core, this);\n        this._hexPrismShader = new (0, $aa73a9318009cb1a$export$d39efaf3a2b8a5a)(this._core, this);\n        this._sdfShader = new (0, $67534a528c920bae$export$b0bdf50006eaaa7a)(this._core, this);\n        this._initializeContext(this._createContext(this._canvas));\n        this._canvas.addEventListener(\"webglcontextlost\", (event)=>{\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, \"WebGL context lost\");\n            this._isInitialized = false;\n            event.preventDefault();\n        }, false);\n        this._canvas.addEventListener(\"webglcontextrestored\", ()=>{\n            this._initializeContext(this._createContext(this._canvas));\n            this._isInitialized = true;\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, \"WebGL context restored\");\n        }, false);\n        this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n        this._gl = gl;\n        for(const key in this.fonts){\n            const fontVisual = this.fonts[key];\n            fontVisual.initializeContext(gl);\n        }\n        this._shaderResources.initializeContext(this._gl);\n        this._colorShader.initializeContext(this._gl);\n        this._textureShader.initializeContext(this._gl);\n        this._lassoShader.initializeContext(this._gl);\n        this._modelShader.initializeContext(this._gl);\n        this._sdfTextShader.initializeContext(this._gl);\n        this._gridShader.initializeContext(this._gl);\n        this._anaglyphShader.initializeContext(this._gl);\n        this._blockShader.initializeContext(this._gl);\n        this._sphereShader.initializeContext(this._gl);\n        this._cylinderShader.initializeContext(this._gl);\n        this._hexPrismShader.initializeContext(this._gl);\n        this._sdfShader.initializeContext(this._gl);\n        this._quad.initializeContext(this._gl);\n        this._lasso.initializeContext(this._gl);\n        this._debugAxesVisual.initializeContext(this._gl);\n        this._framebuffers = [\n            null,\n            null\n        ];\n        const texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        const renderBuffer = this._gl.createRenderbuffer();\n        this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n        this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, this._core.config.pickWidth, this._core.config.pickHeight);\n        const framebuffer = this._gl.createFramebuffer();\n        this._shaderResources.bindFramebuffer(framebuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n        this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n        this._pickFrameBuffer = framebuffer;\n        this._anaglyphTextures = [\n            null,\n            null\n        ];\n        this.anaglyphFramebuffers = [\n            null,\n            null\n        ];\n        for(let i = 0; i < this.transitionBuffers.length; i++)this.transitionBuffers[i].initializeContext(this._gl);\n        if (this._axes1) for(let i = 0; i < this._axes1.length; i++)this._axes1[i].initializeContext(this._gl);\n        if (this._axes2) for(let i = 0; i < this._axes2.length; i++)this._axes2[i].initializeContext(this._gl);\n        for(let i = 0; i < this.labelSets.length; i++)this.labelSets[i].initializeContext(this._gl);\n        for(let i = 0; i < this.images.length; i++)this.images[i].initializeContext(this._gl);\n        for(let i = 0; i < this.controllers.length; i++)this.controllers[i].initializeContext(this._gl);\n    }\n    _resize(width, height) {\n        super._resize(width, height);\n        for(let i = 0; i < 2; i++){\n            const texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, width, height, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n            const renderBuffer = this._gl.createRenderbuffer();\n            this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, width, height);\n            const framebuffer = this._gl.createFramebuffer();\n            this._shaderResources.bindFramebuffer(framebuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n            this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n            this._anaglyphTextures[i] = texture;\n            this.anaglyphFramebuffers[i] = framebuffer;\n        }\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffers resized ${width},${height}`);\n    }\n    _createContext(canvas) {\n        const antialias = this._options ? this._options.antialias === undefined ? true : this._options.antialias : true;\n        const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === undefined ? false : this._options.preserveDrawingBuffer : false;\n        return canvas.getContext(\"webgl\", {\n            stencil: true,\n            alpha: true,\n            antialias: antialias,\n            preserveDrawingBuffer: preserveDrawingBuffer\n        });\n    }\n    initializeWebXR(session) {\n        const promise = new Promise((resolve, reject)=>{\n            this._gl.makeXRCompatible().then(()=>{\n                session.updateRenderState({\n                    baseLayer: new XRWebGLLayer(session, this._gl),\n                    depthNear: this._core.config.nearPlane,\n                    depthFar: this._core.config.farPlane\n                });\n                session.requestReferenceSpace('local').then((refSpace)=>{\n                    this._webXRReferenceSpace = refSpace;\n                    resolve();\n                });\n            });\n        });\n        return promise;\n    }\n    prepare(xrFrame) {\n        if (xrFrame) {\n            const pose = xrFrame.getViewerPose(this._webXRReferenceSpace);\n            if (pose) {\n                const glLayer = xrFrame.session.renderState.baseLayer;\n                for(let i = 0; i < pose.views.length; i++){\n                    const view = pose.views[i];\n                    this.vMatrices[i] = view.transform.inverse.matrix;\n                    this.inverseVMatrices[i] = view.transform.matrix;\n                    (0, $1ac1b59392edf35b$exports).multiply(this._mvMatrices[i], this.vMatrices[i], this.mMatrix);\n                    this.mvMatrices[i] = this._mvMatrices[i];\n                    this.pMatrices[i] = view.projectionMatrix;\n                    const viewport = glLayer.getViewport(view);\n                    this._viewports[i].x = viewport.x;\n                    this._viewports[i].y = viewport.y;\n                    this._viewports[i].width = viewport.width;\n                    this._viewports[i].height = viewport.height;\n                    this._framebuffers[i] = glLayer.framebuffer;\n                }\n            }\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n        } else {\n            let viewport;\n            switch(this._core.config.stereoMode){\n                case (0, $4a6417d29706362f$export$ec20dfa68810b176).none:\n                    viewport = this._viewports[0];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 0;\n                    this._viewportCount = 1;\n                    this._framebuffers[0] = null;\n                    break;\n                case (0, $4a6417d29706362f$export$ec20dfa68810b176).left:\n                    viewport = this._viewports[0];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 0;\n                    this._viewportCount = 1;\n                    this._framebuffers[0] = null;\n                    break;\n                case (0, $4a6417d29706362f$export$ec20dfa68810b176).right:\n                    viewport = this._viewports[1];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 1;\n                    this._viewportCount = 1;\n                    this._framebuffers[1] = null;\n                    break;\n                case (0, $4a6417d29706362f$export$ec20dfa68810b176).anaglyph:\n                    viewport = this._viewports[0];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    viewport = this._viewports[1];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 0;\n                    this._viewportCount = 2;\n                    this._framebuffers[0] = this.anaglyphFramebuffers[0];\n                    this._framebuffers[1] = this.anaglyphFramebuffers[1];\n                    break;\n                case (0, $4a6417d29706362f$export$ec20dfa68810b176).split:\n                    viewport = this._viewports[0];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width / 2;\n                    viewport.height = this._canvas.height;\n                    viewport = this._viewports[1];\n                    viewport.x = this._canvas.width / 2;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width / 2;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 0;\n                    this._viewportCount = 2;\n                    this._framebuffers[0] = null;\n                    this._framebuffers[1] = null;\n                    break;\n            }\n        }\n    }\n    createTransitionBuffer(ids) {\n        const buffer = new (0, $d5b49779b59f8b97$export$76de936b3c1c4170)(this._core, ids);\n        buffer.initializeContext(this._gl);\n        return buffer;\n    }\n    createControllerVisual(controller) {\n        const visual = new (0, $1a9dbf3e657aba80$export$c6e88a9dc8138322)(this._core, this, controller);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    createCartesian2dAxesVisual(axes) {\n        const visual = new (0, $aca0a8f90b5c931c$export$30e3ee7ba3e49080)(this._core, this, axes);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n        const visual = new (0, $a7eaec60ae84313c$export$3dc3b91df297f2ee)(this._core, this, axes);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    _createDebugAxesVisual(debugAxes) {\n        return new (0, $71eca2ce7fbde895$export$2d88a2ee0a1b34a)(this._core, this, debugAxes);\n    }\n    _createLabelVisual(label) {\n        return new (0, $89e74fd9966daa2d$export$71c7fa1581020e2c)(this._core, this, label);\n    }\n    createLabelSetVisual(labelSet) {\n        const visual = new (0, $89e74fd9966daa2d$export$97e93e7019ef67b9)(this._core, this, labelSet);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    createImageVisual(image) {\n        const visual = new (0, $0a92364922ad8eff$export$6f251cd327b2ff1)(this._core, this, image);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    createFontVisual(font) {\n        const visual = new (0, $504631b62e7a70e2$export$e784a6eab4d2d700)(this._core, font);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    getDataUrl(mimeType) {\n        return this._canvas.toDataURL(mimeType);\n    }\n    render(elapsedTime, xrFrame) {\n        return $2a4365468a86449a$var$__awaiter(this, void 0, void 0, function*() {\n            if (this.depthEnabled) this._gl.enable(this._gl.DEPTH_TEST);\n            else this._gl.disable(this._gl.DEPTH_TEST);\n            this._gl.enable(this._gl.CULL_FACE);\n            this._gl.disable(this._gl.BLEND);\n            if (this.isPickingEnabled) {\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.clearColor(0, 0, 0, 0);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n            }\n            const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n            this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], backgroundColor[3]);\n            if (xrFrame) {\n                const glLayer = xrFrame.session.renderState.baseLayer;\n                this._shaderResources.bindFramebuffer(glLayer.framebuffer);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n            } else if (this._core.config.stereoMode == (0, $4a6417d29706362f$export$ec20dfa68810b176).anaglyph) {\n                for(let i = 0; i < 2; i++){\n                    this._shaderResources.bindFramebuffer(this.anaglyphFramebuffers[i]);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                this._shaderResources.bindFramebuffer(null);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n            } else {\n                this._shaderResources.bindFramebuffer(null);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n            }\n            if (this._core.config.isDebugVisible) {\n                this._debugAxesVisual.framebuffers = this._framebuffers;\n                this._debugAxesVisual.render(elapsedTime, xrFrame);\n            }\n            const axesVisuals = this.axesVisibility == (0, $4a6417d29706362f$export$7dbc7c2b82487e42).current ? this.currentAxes : this.axesVisibility == (0, $4a6417d29706362f$export$7dbc7c2b82487e42).previous ? this.previousAxes : null;\n            if (axesVisuals) for(let i = 0; i < axesVisuals.length; i++){\n                const axesVisual = axesVisuals[i];\n                if (axesVisual.isVisible) {\n                    axesVisual.pickedIdColor = this._pickedIdColor;\n                    axesVisual.pickFramebuffer = this._pickFrameBuffer;\n                    axesVisual.framebuffers = this._framebuffers;\n                    axesVisual.render(elapsedTime, xrFrame);\n                }\n            }\n            for(let i = 0; i < this.transitionBuffers.length; i++){\n                const transitionBuffer = this.transitionBuffers[i];\n                if (transitionBuffer.isVisible) this._renderTransitionBuffer(xrFrame, transitionBuffer);\n            }\n            if (this.areLabelsVisible) for(let i = 0; i < this.labelSets.length; i++){\n                const labelSetVisual = this.labelSets[i];\n                if (labelSetVisual.isVisible) {\n                    labelSetVisual.pickedIdColor = this._pickedIdColor;\n                    labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n                    labelSetVisual.framebuffers = this._framebuffers;\n                    labelSetVisual.render(elapsedTime, xrFrame);\n                }\n            }\n            if (this.areImagesVisible) for(let i = 0; i < this.images.length; i++){\n                const imageVisual = this.images[i];\n                if (imageVisual.isVisible) {\n                    imageVisual.framebuffers = this._framebuffers;\n                    imageVisual.pickFramebuffer = this._pickFrameBuffer;\n                    imageVisual.isPickingEnabled = this.isPickingEnabled;\n                    imageVisual.render(elapsedTime, xrFrame);\n                }\n            }\n            for(let i = 0; i < this.controllers.length; i++){\n                const controllerVisual = this.controllers[i];\n                if (controllerVisual.isVisible) {\n                    controllerVisual.isRayVisible = this.isPickingEnabled;\n                    controllerVisual.framebuffers = this._framebuffers;\n                    controllerVisual.render(elapsedTime, xrFrame);\n                }\n            }\n            if (this.isPickingEnabled) {\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n                this._pickedType = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).decodeType(this._pickedPixels);\n                (0, $4c4ac78b213a9c07$exports).set(this._pickedIdColor, this._pickedPixels[0] / 0xff, this._pickedPixels[1] / 0xff, this._pickedPixels[2] / 0xff, this._pickedPixels[3] / 0xff);\n                this._pickedId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).decodeNumber(this._pickedPixels);\n                if (this._isCapturingPickImage && this.capturePickImageCallback) {\n                    this._isCapturingPickImage = false;\n                    const data = new Uint8ClampedArray(this._core.config.pickWidth * this._core.config.pickHeight * 4);\n                    this._gl.readPixels(0, 0, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, data);\n                    for(let i = 0; i < data.length / 4; i++)if (data[i * 4 + 3] == (0, $4a6417d29706362f$export$6fc3f4da94ff0be0).data) data[i * 4 + 3] = 255;\n                    else {\n                        data[i * 4] = 0;\n                        data[i * 4 + 1] = 0;\n                        data[i * 4 + 2] = 0;\n                        data[i * 4 + 3] = 0;\n                    }\n                    const length = this._core.config.pickWidth * this._core.config.pickHeight * 4;\n                    const row = this._core.config.pickWidth * 4;\n                    const end = (this._core.config.pickHeight - 1) * row;\n                    const flipped = new Uint8ClampedArray(length);\n                    for(let i = 0; i < length; i += row)flipped.set(data.subarray(i, i + row), end - i);\n                    this.capturePickImageCallback(flipped, this._core.config.pickWidth, this._core.config.pickHeight);\n                }\n            } else {\n                (0, $4c4ac78b213a9c07$exports).set(this._pickedIdColor, 0, 0, 0, 0);\n                this._pickedId = 0;\n            }\n            if (this.isLassoPicking && this._lassoShader.isInitialized) {\n                this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n                this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n                const lassoWidth = this.lassoX1 - this.lassoX0;\n                const lassoHeight = this.lassoY1 - this.lassoY0;\n                this._lassoShader.prepare();\n                this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n                this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n                this._lassoShader.apply();\n                const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n                for(let i = 0; i < this._viewportCount; i++){\n                    const viewportIndex = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n                    const viewport = this._viewports[viewportIndex];\n                    this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n                    this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n                    this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n                    this._lassoMMatrix[10] = 1;\n                    this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n                    this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n                    this._lassoShader.mMatrix = this._lassoMMatrix;\n                    (0, $91b0cc4981465964$exports).set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n                    this._lassoShader.thickness = this._lassoThickness;\n                    this._lassoShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n            if (this._core.config.stereoMode == (0, $4a6417d29706362f$export$ec20dfa68810b176).anaglyph && this._anaglyphShader.isInitialized && this._quad.isInitialized) {\n                this._shaderResources.bindFramebuffer(null);\n                this._gl.viewport(this._viewports[0].x, this._viewports[0].y, this._viewports[0].width, this._viewports[0].height);\n                this._anaglyphShader.vertexBuffer = this._quad.vertexBuffer;\n                this._anaglyphShader.indexBuffer = this._quad.indexBuffer;\n                this._anaglyphShader.texture2D1 = this._anaglyphTextures[0];\n                this._anaglyphShader.texture2D2 = this._anaglyphTextures[1];\n                this._anaglyphShader.prepare();\n                this._anaglyphShader.viewport = this._viewports[0];\n                this._anaglyphShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n        });\n    }\n    _renderTransitionBuffer(xrFrame, transitionBuffer) {\n        const currentBuffer = transitionBuffer.currentBuffer;\n        const previousBuffer = transitionBuffer.previousBuffer;\n        const currentPalette = transitionBuffer.currentPalette;\n        const previousPalette = transitionBuffer.previousPalette;\n        const currentAtlas = transitionBuffer.currentAtlas;\n        const previousAtlas = transitionBuffer.previousAtlas;\n        const unitType = transitionBuffer.unitType === undefined ? currentBuffer.unitType : transitionBuffer.unitType;\n        const id = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n        const hoverId = id > -1 ? (0, $0a0587bd8b0d58e8$export$849e31d725692576).getIdHover(currentBuffer.dataView, id) : -1;\n        const activeId = transitionBuffer.activeId;\n        if (this._blockShader.isInitialized && (unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).block || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).blockSdf || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).ringSdf)) {\n            this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._blockShader.prepare();\n            this._blockShader.mMatrix = this.mMatrix;\n            this._blockShader.time = this.transitionTime;\n            this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._blockShader.rangeMin = 0;\n            this._blockShader.rangeMax = transitionBuffer.length - 1;\n            this._blockShader.hover = hoverId;\n            this._blockShader.active = activeId;\n            this._blockShader.selectedColor = this._core.config.selectionColor;\n            this._blockShader.hoverColor = this._core.config.hoverColor;\n            this._blockShader.activeColor = this._core.config.activeColor;\n            this._blockShader.highlightMode = this._core.config.highlightMode;\n            this._blockShader.specularPower = this._config.specularPower;\n            this._blockShader.specularIntensity = this._config.specularIntensity;\n            this._blockShader.ambient = this._config.ambient;\n            this._blockShader.apply();\n            this._blockShader.isPickShader = false;\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                const vMatrix = this.vMatrices[viewport];\n                if (xrFrame) {\n                    (0, $31054a6c69637582$exports).set(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToLight, this._directionToLight);\n                    const inverseVMatrix = this.inverseVMatrices[viewport];\n                    (0, $31054a6c69637582$exports).set(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToCamera, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).normalize(this._halfAngle, this._halfAngle);\n                    (0, $ba3ca37806a2b6fa$exports).fromMat4(this._mat3, vMatrix);\n                    (0, $31054a6c69637582$exports).transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                    (0, $31054a6c69637582$exports).transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                    this._blockShader.directionToLight = this._directionToLight;\n                    this._blockShader.halfAngle = this._halfAngle;\n                } else {\n                    this._blockShader.directionToLight = this._config.directionToLight;\n                    this._blockShader.halfAngle = this._config.halfAngle;\n                }\n                this._blockShader.vMatrix = vMatrix;\n                this._blockShader.pMatrix = this.pMatrices[viewport];\n                this._blockShader.applyView();\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                this._blockShader.isPickShader = true;\n                this._blockShader.pMatrix = this.pickPMatrix;\n                this._blockShader.vMatrix = this.pickVMatrix;\n                this._blockShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        } else if (this._sphereShader.isInitialized && (unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).sphere || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).sphereSdf || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).disk)) {\n            this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._sphereShader.prepare();\n            this._sphereShader.mMatrix = this.mMatrix;\n            this._sphereShader.time = this.transitionTime;\n            this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._sphereShader.rangeMin = 0;\n            this._sphereShader.rangeMax = transitionBuffer.length - 1;\n            this._sphereShader.hover = hoverId;\n            this._sphereShader.active = activeId;\n            this._sphereShader.selectedColor = this._core.config.selectionColor;\n            this._sphereShader.hoverColor = this._core.config.hoverColor;\n            this._sphereShader.activeColor = this._core.config.activeColor;\n            this._sphereShader.highlightMode = this._core.config.highlightMode;\n            this._sphereShader.specularPower = this._config.specularPower;\n            this._sphereShader.specularIntensity = this._config.specularIntensity;\n            this._sphereShader.ambient = this._config.ambient;\n            this._sphereShader.apply();\n            this._sphereShader.isPickShader = false;\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                const vMatrix = this.vMatrices[viewport];\n                if (xrFrame) {\n                    (0, $31054a6c69637582$exports).set(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToLight, this._directionToLight);\n                    const inverseVMatrix = this.inverseVMatrices[viewport];\n                    (0, $31054a6c69637582$exports).set(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToCamera, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).normalize(this._halfAngle, this._halfAngle);\n                    (0, $ba3ca37806a2b6fa$exports).fromMat4(this._mat3, vMatrix);\n                    (0, $31054a6c69637582$exports).transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                    (0, $31054a6c69637582$exports).transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                    this._sphereShader.directionToLight = this._directionToLight;\n                    this._sphereShader.halfAngle = this._halfAngle;\n                } else {\n                    this._sphereShader.directionToLight = this._config.directionToLight;\n                    this._sphereShader.halfAngle = this._config.halfAngle;\n                }\n                this._sphereShader.vMatrix = vMatrix;\n                this._sphereShader.pMatrix = this.pMatrices[viewport];\n                this._sphereShader.applyView();\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                this._sphereShader.isPickShader = true;\n                this._sphereShader.pMatrix = this.pickPMatrix;\n                this._sphereShader.vMatrix = this.pickVMatrix;\n                this._sphereShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        } else if (this._cylinderShader.isInitialized && (unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinder || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinderSdf)) {\n            this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._cylinderShader.prepare();\n            this._cylinderShader.mMatrix = this.mMatrix;\n            this._cylinderShader.time = this.transitionTime;\n            this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._cylinderShader.rangeMin = 0;\n            this._cylinderShader.rangeMax = transitionBuffer.length - 1;\n            this._cylinderShader.hover = hoverId;\n            this._cylinderShader.active = activeId;\n            this._cylinderShader.selectedColor = this._core.config.selectionColor;\n            this._cylinderShader.hoverColor = this._core.config.hoverColor;\n            this._cylinderShader.activeColor = this._core.config.activeColor;\n            this._cylinderShader.highlightMode = this._core.config.highlightMode;\n            this._cylinderShader.specularPower = this._config.specularPower;\n            this._cylinderShader.specularIntensity = this._config.specularIntensity;\n            this._cylinderShader.ambient = this._config.ambient;\n            this._cylinderShader.apply();\n            this._cylinderShader.isPickShader = false;\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                const vMatrix = this.vMatrices[viewport];\n                if (xrFrame) {\n                    (0, $31054a6c69637582$exports).set(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToLight, this._directionToLight);\n                    const inverseVMatrix = this.inverseVMatrices[viewport];\n                    (0, $31054a6c69637582$exports).set(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToCamera, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).normalize(this._halfAngle, this._halfAngle);\n                    (0, $ba3ca37806a2b6fa$exports).fromMat4(this._mat3, vMatrix);\n                    (0, $31054a6c69637582$exports).transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                    (0, $31054a6c69637582$exports).transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                    this._cylinderShader.directionToLight = this._directionToLight;\n                    this._cylinderShader.halfAngle = this._halfAngle;\n                } else {\n                    this._cylinderShader.directionToLight = this._config.directionToLight;\n                    this._cylinderShader.halfAngle = this._config.halfAngle;\n                }\n                this._cylinderShader.vMatrix = vMatrix;\n                this._cylinderShader.pMatrix = this.pMatrices[viewport];\n                this._cylinderShader.applyView();\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                this._cylinderShader.isPickShader = true;\n                this._cylinderShader.pMatrix = this.pickPMatrix;\n                this._cylinderShader.vMatrix = this.pickVMatrix;\n                this._cylinderShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        } else if (this._hexPrismShader.isInitialized && (unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).hexPrism || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).hexPrismSdf)) {\n            this._hexPrismShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._hexPrismShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._hexPrismShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._hexPrismShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._hexPrismShader.prepare();\n            this._hexPrismShader.mMatrix = this.mMatrix;\n            this._hexPrismShader.time = this.transitionTime;\n            this._hexPrismShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._hexPrismShader.rangeMin = 0;\n            this._hexPrismShader.rangeMax = transitionBuffer.length - 1;\n            this._hexPrismShader.hover = hoverId;\n            this._hexPrismShader.active = activeId;\n            this._hexPrismShader.selectedColor = this._core.config.selectionColor;\n            this._hexPrismShader.hoverColor = this._core.config.hoverColor;\n            this._hexPrismShader.activeColor = this._core.config.activeColor;\n            this._hexPrismShader.highlightMode = this._core.config.highlightMode;\n            this._hexPrismShader.specularPower = this._config.specularPower;\n            this._hexPrismShader.specularIntensity = this._config.specularIntensity;\n            this._hexPrismShader.ambient = this._config.ambient;\n            this._hexPrismShader.apply();\n            this._hexPrismShader.isPickShader = false;\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                const vMatrix = this.vMatrices[viewport];\n                if (xrFrame) {\n                    (0, $31054a6c69637582$exports).set(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToLight, this._directionToLight);\n                    const inverseVMatrix = this.inverseVMatrices[viewport];\n                    (0, $31054a6c69637582$exports).set(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToCamera, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).normalize(this._halfAngle, this._halfAngle);\n                    (0, $ba3ca37806a2b6fa$exports).fromMat4(this._mat3, vMatrix);\n                    (0, $31054a6c69637582$exports).transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                    (0, $31054a6c69637582$exports).transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                    this._hexPrismShader.directionToLight = this._directionToLight;\n                    this._hexPrismShader.halfAngle = this._halfAngle;\n                } else {\n                    this._hexPrismShader.directionToLight = this._config.directionToLight;\n                    this._hexPrismShader.halfAngle = this._config.halfAngle;\n                }\n                this._hexPrismShader.vMatrix = vMatrix;\n                this._hexPrismShader.pMatrix = this.pMatrices[viewport];\n                this._hexPrismShader.applyView();\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                this._hexPrismShader.isPickShader = true;\n                this._hexPrismShader.pMatrix = this.pickPMatrix;\n                this._hexPrismShader.vMatrix = this.pickVMatrix;\n                this._hexPrismShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        } else if (this._sdfShader.isInitialized && unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).sdf) {\n            this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n            this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n            this._sdfShader.prepare();\n            this._sdfShader.mMatrix = this.mMatrix;\n            this._sdfShader.time = this.transitionTime;\n            this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._sdfShader.rangeMin = 0;\n            this._sdfShader.rangeMax = transitionBuffer.length - 1;\n            this._sdfShader.hover = hoverId;\n            this._sdfShader.active = activeId;\n            this._sdfShader.selectedColor = this._core.config.selectionColor;\n            this._sdfShader.hoverColor = this._core.config.hoverColor;\n            this._sdfShader.activeColor = this._core.config.activeColor;\n            this._sdfShader.highlightMode = this._core.config.highlightMode;\n            this._sdfShader.sdfBuffer = (this.sdfBuffer || this._core.config.sdfBuffer) / 0xff;\n            this._sdfShader.sdfBackgroundColor = this.sdfBackgroundColor || (0, $31054a6c69637582$exports).fromValues(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n            this._sdfShader.specularPower = this._config.specularPower;\n            this._sdfShader.specularIntensity = this._config.specularIntensity;\n            this._sdfShader.ambient = this._config.ambient;\n            this._sdfShader.apply();\n            this._sdfShader.isPickShader = false;\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                const vMatrix = this.vMatrices[viewport];\n                if (xrFrame) {\n                    (0, $31054a6c69637582$exports).set(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToLight, this._directionToLight);\n                    const inverseVMatrix = this.inverseVMatrices[viewport];\n                    (0, $31054a6c69637582$exports).set(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                    (0, $31054a6c69637582$exports).subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                    (0, $31054a6c69637582$exports).normalize(this._directionToCamera, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                    (0, $31054a6c69637582$exports).normalize(this._halfAngle, this._halfAngle);\n                    (0, $ba3ca37806a2b6fa$exports).fromMat4(this._mat3, vMatrix);\n                    (0, $31054a6c69637582$exports).transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                    (0, $31054a6c69637582$exports).transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                    this._sdfShader.directionToLight = this._directionToLight;\n                    this._sdfShader.halfAngle = this._halfAngle;\n                } else {\n                    this._sdfShader.directionToLight = this._config.directionToLight;\n                    this._sdfShader.halfAngle = this._config.halfAngle;\n                }\n                this._sdfShader.vMatrix = vMatrix;\n                this._sdfShader.pMatrix = this.pMatrices[viewport];\n                this._sdfShader.applyView();\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                this._sdfShader.isPickShader = true;\n                this._sdfShader.pMatrix = this.pickPMatrix;\n                this._sdfShader.vMatrix = this.pickVMatrix;\n                this._sdfShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        }\n    }\n}\n\n\n\n\nvar $04aa67b4630f0de9$exports = {};\n\n$parcel$export($04aa67b4630f0de9$exports, \"Main\", () => $8e6261810f478ee0$export$861edd1ccea2f746);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $046a802c77c0a655$export$7005c9eb6671414d {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get vertexBuffer() {\n        return this._vertexBuffer;\n    }\n    get indexBuffer() {\n        return this._indexBuffer;\n    }\n    get indexCount() {\n        return this._indexCount;\n    }\n    initializeContext(gl) {\n        const _vec3 = (0, $31054a6c69637582$exports).fromValues(2, 2, 2);\n        const _mat4 = (0, $1ac1b59392edf35b$exports).create();\n        (0, $1ac1b59392edf35b$exports).fromScaling(_mat4, _vec3);\n        const vertices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).positions(_mat4);\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n        const indices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).INDICES;\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n        this._indexCount = indices.length;\n        this._isInitialized = true;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $824a46b9fb84be21$export$e47fdbcb2ea069e5 extends (0, $0a2e9437355c0494$export$caf2f326fb2d2fb4) {\n    get texture() {\n        return this._texture;\n    }\n    get defaultTexture() {\n        return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n        this._gl = gl;\n        this._defaultTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([\n            0xff,\n            0xff,\n            0xff,\n            0xff\n        ]));\n        this._updateTexture();\n    }\n    update() {\n        super.update();\n        if (this._changed) {\n            this._changed = false;\n            this._updateTexture();\n        }\n    }\n    _updateTexture() {\n        if (this._imageData) this._texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n        else this._texture = null;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $8628ce147c13b19d$export$e2fbaa661ec19dbf extends (0, $548ced3eab978a8c$export$f05ab453e1597580) {\n    get texture() {\n        return this._texture;\n    }\n    get defaultTexture() {\n        return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n        this._gl = gl;\n        this._defaultTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n        this._updateTexture();\n    }\n    update() {\n        super.update();\n        if (this._changed) {\n            this._changed = false;\n            this._updateTexture();\n        }\n    }\n    _updateTexture() {\n        if (this._colors) {\n            const colors = new Uint8Array(this._colors);\n            for(let i = 0; i < colors.length; i++)colors[i] = Math.pow(colors[i] / 0xff, 2.2) * 0xff;\n            this._texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors);\n        } else this._texture = null;\n    }\n}\n\n\nclass $5c168c6596bfbd28$export$a143d493d941bafc extends (0, $96371271bb28b98d$export$c1cecec923d96e5c) {\n    get vertexBuffer() {\n        return this._vertexBuffer;\n    }\n    constructor(core, ids){\n        super(core, ids);\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n        this._isInitialized = true;\n    }\n    update() {\n        if (this._isInitialized) {\n            const start = window.performance.now();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n}\nclass $5c168c6596bfbd28$export$76de936b3c1c4170 extends (0, $96371271bb28b98d$export$e17d4fc1dafc1240) {\n    constructor(core, ids){\n        super(core, ids, $5c168c6596bfbd28$export$a143d493d941bafc, (0, $8628ce147c13b19d$export$e2fbaa661ec19dbf), (0, $824a46b9fb84be21$export$e47fdbcb2ea069e5));\n    }\n    initializeContext(gl) {\n        this._buffer1.initializeContext(gl);\n        this._buffer2.initializeContext(gl);\n        this._palette1.initializeContext(this._core, gl);\n        this._palette2.initializeContext(this._core, gl);\n        this._atlas1.initializeContext(this._core, gl);\n        this._atlas2.initializeContext(this._core, gl);\n        this._isInitialized = true;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\nclass $115d7df89ed6abb3$export$29cd7b75162a9425 extends (0, $a123db7d2af0bebc$export$ecd9923dfd29c8e1) {\n    get keyLightAltitude() {\n        return this._keyLightAltitude;\n    }\n    set keyLightAltitude(value) {\n        this._keyLightAltitude = value;\n        this._updateLights();\n    }\n    get keyLightAzimuth() {\n        return this._keyLightAzimuth;\n    }\n    set keyLightAzimuth(value) {\n        this._keyLightAzimuth = value;\n        this._updateLights();\n    }\n    get keyLightDistance() {\n        return this._keyLightDistance;\n    }\n    set keyLightDistance(value) {\n        this._keyLightDistance = value;\n        this._updateLights();\n    }\n    get fillLight1Altitude() {\n        return this._fillLight1Altitude;\n    }\n    set fillLight1Altitude(value) {\n        this._fillLight1Altitude = value;\n        this._updateLights();\n    }\n    get fillLight1Azimuth() {\n        return this._fillLight1Azimuth;\n    }\n    set fillLight1Azimuth(value) {\n        this._fillLight1Azimuth = value;\n        this._updateLights();\n    }\n    get fillLight2Altitude() {\n        return this._fillLight2Altitude;\n    }\n    set fillLight2Altitude(value) {\n        this._fillLight2Altitude = value;\n        this._updateLights();\n    }\n    get fillLight2Azimuth() {\n        return this._fillLight2Azimuth;\n    }\n    set fillLight2Azimuth(value) {\n        this._fillLight2Azimuth = value;\n        this._updateLights();\n    }\n    constructor(){\n        super();\n        this._rotation = (0, $39ece26d1239bb77$exports).create();\n        this.keyLightPosition = (0, $31054a6c69637582$exports).create();\n        this.fillLight1Position = (0, $31054a6c69637582$exports).create();\n        this.fillLight2Position = (0, $31054a6c69637582$exports).create();\n        this.reset();\n    }\n    _updateLights() {\n        this._updateLight(this._keyLightAltitude, this._keyLightAzimuth, this._keyLightDistance, this.keyLightPosition);\n        this._updateLight(this._fillLight1Altitude, this._fillLight1Azimuth, 1, this.fillLight1Position);\n        this._updateLight(this._fillLight2Altitude, this._fillLight2Azimuth, 1, this.fillLight2Position);\n    }\n    _updateLight(altitude, azimuth, distance, position) {\n        (0, $39ece26d1239bb77$exports).rotateY(this._rotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY, (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(azimuth));\n        (0, $39ece26d1239bb77$exports).rotateX(this._rotation, this._rotation, (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(-altitude));\n        (0, $31054a6c69637582$exports).transformQuat(position, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ, this._rotation);\n        (0, $31054a6c69637582$exports).scale(position, position, distance);\n    }\n    reset() {\n        this.isSsaoEnabled = true;\n        this.ssaoWidth = 1024;\n        this.ssaoHeight = 1024;\n        this.ssaoBlurEnabled = true;\n        this.ssaoKernelSize = 8;\n        this.ssaoNoiseSize = 4;\n        this.ssaoRadius = 0.02;\n        this.ssaoPower = 1;\n        this.isShadowEnabled = true;\n        this.shadowWidth = 1024;\n        this.shadowHeight = 1024;\n        this.isDofEnabled = false;\n        this.dofAutoFocus = true;\n        this.dofFocusDistance = 0.5;\n        this.dofFocusRange = 0.5;\n        this.dofMaxBackgroundBlur = 0.75;\n        this.isBloomEnabled = false;\n        this.bloomIntensity = 2;\n        this.specularIntensity = 0.15;\n        this.specularPower = 150;\n        this.ambientIntensity = 0.1;\n        this.materialIntensity = 0.5;\n        this.keyLightIntensity = 1.5;\n        this.fillLight1Intensity = 0.25;\n        this.fillLight2Intensity = 0.25;\n        this._keyLightAltitude = 30;\n        this._keyLightAzimuth = -45;\n        this._keyLightDistance = 1;\n        this._fillLight1Altitude = 30;\n        this._fillLight1Azimuth = 45;\n        this._fillLight2Altitude = 30;\n        this._fillLight2Azimuth = -135;\n        this._updateLights();\n        this.isFxaaEnabled = false;\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $a9df2cd8c496e87d$export$e9a269813a6315a4 {\n    bindFramebuffer(framebuffer) {\n        if (this.framebuffer != framebuffer) {\n            this.framebuffer = framebuffer;\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n        }\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n        this.framebuffer = this._gl.createFramebuffer();\n        this.OES_texture_float = gl.getExtension(\"OES_texture_float\");\n        this.OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n        this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n}\n$a9df2cd8c496e87d$export$e9a269813a6315a4.glsl = {\n    \"background.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\ngl_FragDepth = 0.99999;\\nmyPosition = vec4(0.0, 0.0, -FAR_PLANE, 0.0);\\nmyColor = vec4(uColor, 1.0);\\nmyNormal = vec4(0.0, 0.0, 1.0, 0.0);\\n}\\n\",\n    \"box.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nfloat result = 0.0;\\nfor (int x = -2; x < 2; x++)\\n{\\nfor (int y = -2; y < 2; y++)\\n{\\nvec2 offset = vec2(float(x) + 0.5, float(y) + 0.5) * texelSize;\\nresult += texture(uSampler, texCoords + offset).r;\\n}\\n}\\nresult /= 16.0;\\nmyOutputColor = vec4(vec3(result), 1.0);\\n}\\n\",\n    \"bright.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec4 color = texture(uSampler, texCoords);\\nmyOutputColor = vec4(color.rgb * color.a, 1.0);\\n}\\n\",\n    \"combine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform float uIntensity;\\nout vec4 myOutputColor;\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 bloom =\\ntexture(uSampler2, texCoords).rgb +\\ntexture(uSampler3, texCoords).rgb +\\ntexture(uSampler4, texCoords).rgb +\\ntexture(uSampler5, texCoords).rgb;\\nbloom *= uIntensity;\\nvec3 color = texture(uSampler1, texCoords).rgb;\\ncolor += bloom;\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"deferred.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform mat4 uInverseVMatrix;\\nuniform mat4 uShadowVMatrix;\\nuniform mat4 uShadowPMatrix;\\nuniform bool uShadow;\\nuniform bool uSsao;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform vec3 uKeyLightHalfAngle;\\nuniform vec3 uDirectionToKeyLight;\\nuniform vec3 uDirectionToFillLight1;\\nuniform vec3 uDirectionToFillLight2;\\nuniform vec2 uShadowMapSize;\\nuniform float uKeyLightIntensity;\\nuniform float uFillLight1Intensity;\\nuniform float uFillLight2Intensity;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbientIntensity;\\nuniform float uMaterialIntensity;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec4 position = texture(uSampler1, texCoords);\\nvec4 color = texture(uSampler2, texCoords);\\nvec4 normal = texture(uSampler3, texCoords);\\nfloat shadow;\\nif (uShadow)\\n{\\nvec4 positionWorld = uInverseVMatrix * vec4(position.xyz, 1.0);\\nvec4 positionShadowView = uShadowVMatrix * positionWorld;\\nvec4 positionShadowViewProjection = uShadowPMatrix * positionShadowView;\\nvec3 projCoords = positionShadowViewProjection.xyz / positionShadowViewProjection.w;\\nprojCoords = projCoords * 0.5 + 0.5;\\nfloat minProjCoords = min(projCoords.x, projCoords.y);\\nfloat maxProjCoords = max(projCoords.x, projCoords.y);\\nif (minProjCoords < 0.0 || maxProjCoords > 1.0)\\n{\\nshadow = 1.0;\\n}\\nelse\\n{\\nfloat currentDepth = projCoords.z;\\nfloat bias = 0.0;\\nvec2 texelSize = 1.0 / uShadowMapSize;\\nfor(int x = -1; x <= 1; ++x)\\n{\\nfor(int y = -1; y <= 1; ++y)\\n{\\nfloat pcfDepth = texture(uSampler5, projCoords.xy + vec2(x, y) * texelSize).r;\\nshadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;\\n}\\n}\\nshadow /= 9.0;\\nshadow = clamp(1.0 - shadow, 0.0, 1.0);\\n}\\n}\\nelse\\n{\\nshadow = 1.0;\\n}\\nfloat ssao = uSsao ? texture(uSampler4, texCoords).r : 1.0;\\nfloat diffuseIntensity = clamp(dot(normal.rgb, uDirectionToKeyLight), 0.0, 1.0) * uKeyLightIntensity * shadow;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight1), 0.0, 1.0) * uFillLight1Intensity * ssao;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight2), 0.0, 1.0) * uFillLight2Intensity * ssao;\\nvec3 diffuse = color.rgb * diffuseIntensity * uMaterialIntensity;\\nvec3 ambient = uAmbientIntensity * color.rgb * ssao;\\nvec3 emissive = color.w * color.rgb;\\nfloat specular = normal.w * clamp(pow(clamp(dot(normal.rgb, uKeyLightHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity * uKeyLightIntensity * shadow, 0.0, 1.0);\\nvec3 result = min(ambient + diffuse + specular + emissive, 1.0);\\nresult = pow(result, GAMMA);\\nmyOutputColor = vec4(result, position.w);\\n}\\n\",\n    \"dofblur.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uNearFocusDepth;\\nuniform float uFarFocusDepth;\\nuniform float uMaxBackgroundBlur;\\nout vec4 myOutputColor;\\nfloat circleOfConfusion(in float depth )\\n{\\nfloat f;\\nif (depth < uFocusDepth)\\n{\\nf = (depth - uFocusDepth) / (uFocusDepth - uNearFocusDepth);\\nf = clamp(f, -1.0, 0.0);\\n}\\nelse\\n{\\nf = (depth - uFocusDepth) / (uFarFocusDepth - uFocusDepth);\\nf = clamp(f, 0.0, uMaxBackgroundBlur);\\n}\\nreturn f * 0.5 + 0.5;\\n}\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nvec4 color = texture(uSampler1, texCoords);\\nfloat depth = -texture(uSampler2, texCoords).z;\\nfloat coc = circleOfConfusion(depth);\\nmyOutputColor = vec4(coc);\\n}\\n\",\n    \"dofcombine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uAperture;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nout vec4 myOutputColor;\\nconst float MAX_CIRCLE_OF_CONFUSION = 3.0;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec2 texelSizeLow = texelSize * 4.0;\\nconst int NUM_TAPS = 13;\\nvec2 samples[NUM_TAPS];\\nsamples[0] = vec2(-0.326212,-0.405810);\\nsamples[1] = vec2(-0.840144,-0.073580);\\nsamples[2] = vec2(-0.695914, 0.457137);\\nsamples[3] = vec2(-0.203345, 0.620716);\\nsamples[4] = vec2( 0.962340,-0.194983);\\nsamples[5] = vec2( 0.473434,-0.480026);\\nsamples[6] = vec2( 0.519456, 0.767022);\\nsamples[7] = vec2( 0.185461,-0.893124);\\nsamples[8] = vec2( 0.507431, 0.064425);\\nsamples[9] = vec2( 0.896420, 0.412458);\\nsamples[10] = vec2(-0.321940,-0.932615);\\nsamples[11] = vec2(-0.791559,-0.597710);\\nsamples[12] = vec2( 0.000000, 0.000000);\\nconst float maxCoC = 5.0;\\nconst float radiusScale = 0.5;\\nvec4 cOut = texture(uSampler1, texCoords);\\nfloat coc = texture(uSampler2, texCoords).r;\\nfloat centerDepth = coc;\\nfloat discRadius = abs(coc * 2.0 - 1.0) * maxCoC;\\nfloat discRadiusLow = discRadius * radiusScale;\\ncOut = vec4(0.0);\\nfloat acc = 0.0;\\nfor (int t = 0; t < NUM_TAPS; t++)\\n{\\nvec2 coordLow = texCoords + (texelSizeLow * samples[t] * discRadiusLow);\\nvec2 coordHigh = texCoords + (texelSize * samples[t] * discRadius);\\nvec4 tapLow = texture(uSampler1, coordLow);\\nvec4 tapHigh = texture(uSampler1, coordHigh);\\nfloat cocLow = texture(uSampler2, coordLow).r;\\nfloat cocHigh = texture(uSampler2, coordHigh).r;\\nfloat tapBlur = abs(cocHigh * 2.0 - 1.0);\\nvec4 tap = mix(tapHigh, tapLow, tapBlur);\\nfloat cocBlur = mix(cocHigh, cocLow, tapBlur);\\ncocBlur = (cocBlur >= centerDepth) ? 1.0 : abs(cocBlur * 2.0 - 1.0);\\ncOut += tap * cocBlur;\\nacc += cocBlur;\\n}\\nvec4 result = cOut / acc;\\nmyOutputColor = result;\\n}\\n\",\n    \"downsample.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nmyOutputColor = texture(uSampler, texCoords);\\n}\\n\",\n    \"fxaa.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nconst float FXAA_SPAN_MAX = 8.0;\\nconst float FXAA_REDUCE_MUL = 1.0 / 8.0;\\nconst float FXAA_REDUCE_MIN = 1.0 / 128.0;\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec3 color = texture(uSampler, texCoords).rgb;\\nvec3 colorNW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorNE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorSW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y + texelSize.y)).rgb;\\nvec3 colorSE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y + texelSize.y)).rgb;\\nfloat luminance = dot(color, LUMINANCE);\\nfloat luminanceNW = dot(colorNW, LUMINANCE);\\nfloat luminanceNE = dot(colorNE, LUMINANCE);\\nfloat luminanceSW = dot(colorSW, LUMINANCE);\\nfloat luminanceSE = dot(colorSE, LUMINANCE);\\nfloat luminanceMin = min(luminance, min(min(luminanceNW, luminanceNE), min(luminanceSW, luminanceSE)));\\nfloat luminanceMax = max(luminance, max(max(luminanceNW, luminanceNE), max(luminanceSW, luminanceSE)));\\nvec2 dir = vec2(luminanceSW + luminanceSE - luminanceNW - luminanceNE, luminanceNW + luminanceSW - luminanceNE - luminanceSE);\\nfloat dirReduce = max((luminanceNW + luminanceNE + luminanceSW + luminanceSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\\nfloat rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\\ndir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texelSize;\\nvec3 colorA = 0.5 * (\\ntexture(uSampler, texCoords.xy + dir * (1.0/3.0 - 0.5)).rgb +\\ntexture(uSampler, texCoords.xy + dir * (2.0/3.0 - 0.5)).rgb);\\nvec3 colorB = colorA * 0.5 + 0.25 * (\\ntexture(uSampler, texCoords.xy - dir * 0.5).rgb +\\ntexture(uSampler, texCoords.xy + dir * 0.5).rgb);\\nluminance = dot(colorB, LUMINANCE);\\nif (luminance < luminanceMin || luminance > luminanceMax)\\n{\\nmyOutputColor = vec4(colorA, 1.0);\\n}\\nelse\\n{\\nmyOutputColor = vec4(colorB, 1.0);\\n}\\n}\\n\",\n    \"gaussian.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nuniform bool uHorizontal;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec2 texelSize = vec2(1.0) / uResolution;\\nconst int NUM_WEIGHTS = 3;\\nfloat weights[NUM_WEIGHTS];\\nweights[0] = 0.2270270270;\\nweights[1] = 0.3162162162;\\nweights[2] = 0.0702702703;\\nfloat offsets[NUM_WEIGHTS];\\noffsets[0] = 0.0;\\noffsets[1] = 1.3846153846;\\noffsets[2] = 3.2307692308;\\nvec3 color = texture(uSampler, texCoords).rgb * weights[0];\\nif (uHorizontal)\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\n}\\n}\\nelse\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\n}\\n}\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"lasso.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nin mediump vec2 vTexCoord;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\nmyOutputColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n\",\n    \"lasso.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nout mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"pickgrid.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nin lowp vec4 vColor;\\nin mediump vec2 vTexCoord;\\nin mediump vec4 vBounds;\\nin mediump vec3 vNormal;\\nin vec3 vViewPosition;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void) {\\nif (uPick)\\n{\\nmyPosition = vColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec2 buffer = fwidth(vTexCoord);\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\nmyColor.xyz = color.xyz;\\n}\\n}\\n\",\n    \"pickgrid.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin lowp vec4 aIdColor;\\nin mediump vec2 aTexCoord;\\nin mediump vec3 aNormal;\\nin mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nout lowp vec4 vColor;\\nout mediump vec2 vTexCoord;\\nout mediump vec4 vBounds;\\nout mediump vec3 vNormal;\\nout vec3 vViewPosition;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nin lowp vec4 vIdColor;\\nin lowp float vHover;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick) {\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nfloat distance = texture(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth)\\n{\\ndiscard;\\n}\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, mix(uColor, uHoverColor, vHover), value);\\nmyPosition.xyz = vViewPosition;\\nmyNormal.xyz = vNormal;\\nmyColor.w = 1.0;\\nmyPosition.w = 0.0;\\nmyNormal.w = 0.0;\\n}\\n}\\n\",\n    \"sdftext.vertex.fx\": \"#version 300 es\\nin lowp vec4 aIdColor;\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nout vec3 vViewPosition;\\nout vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nout lowp vec4 vIdColor;\\nout lowp float vHover;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(0.0, 0.0, 1.0, 0.0));\\nvec4 viewPosition = mvMatrix* vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"ssao.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nconst int SSAO_KERNEL_SIZE = 8;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform mat4 uPMatrix;\\nuniform vec4 uViewport;\\nuniform float uSsaoNoiseSize;\\nuniform float uSsaoRadius;\\nuniform float uSsaoPower;\\nuniform vec3 uSsaoKernel[SSAO_KERNEL_SIZE];\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 position = texture(uSampler1, texCoords).rgb;\\nvec3 normal = texture(uSampler2, texCoords).rgb;\\nfloat occlusion = 0.0;\\nvec2 noiseScale = uViewport.zw / uSsaoNoiseSize;\\nvec3 randomVec = texture(uSampler3, texCoords * noiseScale).rgb;\\nvec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));\\nvec3 bitangent = cross(normal, tangent);\\nmat3 tbn = mat3(tangent, bitangent, normal);\\nfor(int i = 0; i < SSAO_KERNEL_SIZE; i++)\\n{\\nvec3 mySample = tbn * uSsaoKernel[i];\\nmySample = position + mySample * uSsaoRadius;\\nvec4 offset = vec4(mySample, 1.0);\\noffset = uPMatrix * offset;\\noffset.xy /= offset.w;\\noffset.xy = offset.xy * 0.5 + 0.5;\\nfloat sampleDepth = texture(uSampler1, offset.xy).z;\\nfloat rangeCheck = abs(position.z - sampleDepth) > uSsaoRadius ? 0.0 : 1.0;\\nocclusion += (sampleDepth < mySample.z ? 0.0 : 1.0) * rangeCheck;\\n}\\nocclusion /= float(SSAO_KERNEL_SIZE);\\nocclusion = pow(1.0 - occlusion, uSsaoPower);\\nmyOutputColor = vec4(occlusion, 0.0, 0.0, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform sampler2D uSampler;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nmyPosition.xyz = vViewPosition;\\nmyColor.xyz = pow(texture(uSampler, vTexCoord).xyz, INV_GAMMA);\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\n}\\n\",\n    \"texture.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec3 aNormal;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nout vec3 vViewPosition;\\nout mediump vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n    \"unitblock.vertex.fx\": \"#version 300 es\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n    \"unitcylinder.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec4 vCircle1;\\nin vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w, uShadow ? -1.0 : 1.0);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n    \"unitcylinder.vertex.fx\": \"#version 300 es\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout vec3 vViewPosition;\\nout vec4 vCircle1;\\nout vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n    \"unitsdf.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec2 vTexCoord;\\nin mediump vec2 vPreviousTexCoord;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nfloat uBorderWidth = 0.0 / 255.0;\\nfloat uBuffer = 192.0 / 255.0;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat distance = mix(texture(uPreviousSampler1, vPreviousTexCoord).r, texture(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat uGamma = 0.0;\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, color, value);\\n}\\n}\\n\",\n    \"unitsdf.vertex.fx\": \"#version 300 es\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin mediump vec4 aTexCoord;\\nin mediump vec4 aPreviousTexCoord;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout mediump vec2 vTexCoord;\\nout mediump vec2 vPreviousTexCoord;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n\",\n    \"unitsphere.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec3 vViewCenter;\\nin mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s, uShadow ? -1.0 : 1.0);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n    \"unitsphere.vertex.fx\": \"#version 300 es\\n#include \\\"common.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin lowp float aColor;\\nin lowp float aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump float vRadius;\\nout vec3 vViewPosition;\\nout vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\ntranslation.xyz += aPosition * scale;\\nvec4 viewPosition = mvMatrix * vec4(translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n\",\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\n\",\n    \"intersect.include.fx\": \"float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph, in float shadow)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot( oc, rd );\\nfloat c = dot( oc, oc ) - sph.w*sph.w;\\nfloat h = b*b - c;\\nif( h<0.0 ) return -1.0;\\nreturn -b - shadow * sqrt( h );\\n}\\nfloat roundedboxIntersect( in vec3 ro, in vec3 rd, in vec3 size, in float rad )\\n{\\nvec3 m = 1.0/rd;\\nvec3 n = m*ro;\\nvec3 k = abs(m)*(size+rad);\\nvec3 t1 = -n - k;\\nvec3 t2 = -n + k;\\nfloat tN = max( max( t1.x, t1.y ), t1.z );\\nfloat tF = min( min( t2.x, t2.y ), t2.z );\\nif( tN > tF || tF < 0.0) return -1.0;\\nfloat t = tN;\\nvec3 pos = ro+t*rd;\\nvec3 s = sign(pos);\\nro *= s;\\nrd *= s;\\npos *= s;\\npos -= size;\\npos = max( pos.xyz, pos.yzx );\\nif( min(min(pos.x,pos.y),pos.z)<0.0 ) return t;\\nvec3 oc = ro - size;\\nvec3 dd = rd*rd;\\nvec3 oo = oc*oc;\\nvec3 od = oc*rd;\\nfloat ra2 = rad*rad;\\nt = 1e20;\\n{\\nfloat b = od.x + od.y + od.z;\\nfloat c = oo.x + oo.y + oo.z - ra2;\\nfloat h = b*b - c;\\nif( h>0.0 ) t = -b-sqrt(h);\\n}\\n{\\nfloat a = dd.y + dd.z;\\nfloat b = od.y + od.z;\\nfloat c = oo.y + oo.z - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.x+rd.x*h)<size.x ) t = h;\\n}\\n}\\n{\\nfloat a = dd.z + dd.x;\\nfloat b = od.z + od.x;\\nfloat c = oo.z + oo.x - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.y+rd.y*h)<size.y ) t = h;\\n}\\n}\\n{\\nfloat a = dd.x + dd.y;\\nfloat b = od.x + od.y;\\nfloat c = oo.x + oo.y - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.z+rd.z*h)<size.z ) t = h;\\n}\\n}\\nif( t>1e19 ) t=-1.0;\\nreturn t;\\n}\\nvec3 roundedboxNormal( in vec3 pos, in vec3 siz, in float rad )\\n{\\nreturn sign(pos)*normalize(max(abs(pos)-siz,0.0));\\n}\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - shadow * sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-shadow * sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - shadow * sqrt( h1 );\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - shadow * sqrt( h2 );\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n};\nclass $a9df2cd8c496e87d$export$59a6ab026766925f {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get vertexBuffer() {\n        return this._vertexBuffer;\n    }\n    set vertexBuffer(value) {\n        if (this._vertexBuffer != value) {\n            this._vertexBuffer = value;\n            this._haveBuffersChanged = true;\n        }\n    }\n    get indexBuffer() {\n        return this._indexBuffer;\n    }\n    set indexBuffer(value) {\n        if (this._indexBuffer != value) {\n            this._indexBuffer = value;\n            this._haveBuffersChanged = true;\n        }\n    }\n    constructor(core, main){\n        this._core = core;\n        this._main = main;\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n        const program = this._gl.createProgram();\n        this._gl.attachShader(program, vs);\n        this._gl.attachShader(program, fs);\n        this._gl.linkProgram(program);\n        if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).error, this._gl.getProgramInfoLog(program));\n        return program;\n    }\n    _compileShader(source, type) {\n        const shader = this._gl.createShader(type);\n        this._gl.shaderSource(shader, source);\n        this._gl.compileShader(shader);\n        if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).error, this._gl.getShaderInfoLog(shader));\n        return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n        const remove = `#define ${directive}`;\n        const index = shaderSource.indexOf(remove);\n        shaderSource = index == -1 ? shaderSource : shaderSource.substring(0, index) + shaderSource.substring(index + remove.length);\n        return shaderSource;\n    }\n    prepare() {\n        if (this._program != this._main.shaderResources.currentProgram) {\n            if (this._main.shaderResources.currentShader) this._main.shaderResources.currentShader.disableProgram();\n            this.enableProgram(this._program);\n            this.updateBuffers();\n            this.updateTextures();\n        } else {\n            if (this._haveBuffersChanged) this.updateBuffers();\n            if (this._haveTexturesChanged) this.updateTextures();\n        }\n    }\n    apply() {}\n    applyModel() {}\n    applyView() {}\n    enableProgram(program) {\n        this._gl.useProgram(program);\n        this._main.shaderResources.currentProgram = program;\n        this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n        this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n        this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n        this._main.shaderResources.currentShader = null;\n        this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n        callback(this._includesFromFile($a9df2cd8c496e87d$export$e9a269813a6315a4.glsl[vsName]), this._includesFromFile($a9df2cd8c496e87d$export$e9a269813a6315a4.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n        this._sourceFromUrl(vsName, (vsSource)=>{\n            this._includesFromUrl(vsSource, 0, (vsIncSource)=>{\n                this._sourceFromUrl(fsName, (fsSource)=>{\n                    this._includesFromUrl(fsSource, 0, (fsIncSource)=>{\n                        callback(vsIncSource, fsIncSource);\n                    });\n                });\n            });\n        });\n    }\n    _sourceFromUrl(url, callback) {\n        const request = new XMLHttpRequest();\n        request.open(\"GET\", (0, $a4596fc55355f0e1$export$433e0478e7f6ca93).combine(this._core.config.shaderPath, url));\n        request.onreadystatechange = ()=>{\n            if (request.readyState == XMLHttpRequest.DONE && request.status == 200) callback(request.responseText);\n        };\n        request.send();\n    }\n    _includesFromFile(source) {\n        let index = 0;\n        do {\n            index = source.indexOf(\"#include\", index);\n            if (index != -1) {\n                const start = source.indexOf(\"\\\"\", index);\n                const end = source.indexOf(\"\\\"\", start + 1);\n                const name = source.substring(start + 1, end);\n                const inc = $a9df2cd8c496e87d$export$e9a269813a6315a4.glsl[name];\n                source = source.substring(0, index) + inc + source.substring(end + 1);\n            }\n        }while (index != -1);\n        return source;\n    }\n    _includesFromUrl(source, index, callback) {\n        index = source.indexOf(\"#include\", index);\n        if (index != -1) {\n            const start = source.indexOf(\"\\\"\", index);\n            const end = source.indexOf(\"\\\"\", start + 1);\n            const name = source.substring(start + 1, end);\n            this._sourceFromUrl((0, $a4596fc55355f0e1$export$433e0478e7f6ca93).combine(\"inc\", name), (include)=>{\n                source = source.substring(0, index) + include + source.substring(end + 1);\n                this._includesFromUrl(source, index, callback);\n            });\n        } else callback(source);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $f429c522f972f41c$export$5431306cf43de24a extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).POSITION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).NORMAL_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._normalAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$e40add16394b9bff).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $07302b7e66b98ad4$export$dc8af347244861ce extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n        this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n        this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform3fv(this._colorUniform, this.color);\n        this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$538532535e0e8594).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$538532535e0e8594).POSITION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$538532535e0e8594).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$538532535e0e8594).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $5096a2d574b69029$export$a3be0de02f08c3be extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n        this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n        this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n        this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n        this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n        this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n        this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n        this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1i(this._samplerUniform, 0);\n        this._gl.uniform3fv(this._colorUniform, this.color);\n        this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n        this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n        this._gl.uniform1f(this._gammaUniform, this.gamma);\n        this._gl.uniform1f(this._bufferUniform, this.buffer);\n        this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n        this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n        this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).ID_COLOR_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._idColorAttribute);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).POSITION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $0d68a84ac7ce9cae$export$3b812729b68dda3e extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n        this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n        this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n        this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n        this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n        this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n        this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n        this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n        this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n        this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n        this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n        this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n        this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n        this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n        this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n        this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n        this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n        this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n        this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n        this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n        this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n        this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n        this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n        this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n        this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n        this._gl.uniform2fv(this._zeroUniform, this.zero);\n        this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).TRANSLATION_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).NORMAL_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._normalAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).TEX_COORD_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).ID_COLOR_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._idColorAttribute);\n        this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$df352805a955aca5).BOUNDS_OFFSET_BYTES);\n        this._gl.enableVertexAttribArray(this._boundsAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $aaa12a8ba275f824$export$c4c8cc0016dff604 extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get paletteTexture() {\n        return this._paletteTexture;\n    }\n    set paletteTexture(value) {\n        if (this._paletteTexture != value) {\n            this._paletteTexture = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get previousPaletteTexture() {\n        return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value) {\n        if (this._previousPaletteTexture != value) {\n            this._previousPaletteTexture = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get sdfTexture() {\n        return this._sdfTexture;\n    }\n    set sdfTexture(value) {\n        if (this._sdfTexture != value) {\n            this._sdfTexture = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get previousSdfTexture() {\n        return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value) {\n        if (this._previousSdfTexture != value) {\n            this._previousSdfTexture = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    set instanceBuffer(value) {\n        if (this._instanceBuffer != value) {\n            this._instanceBuffer = value;\n            this._haveBuffersChanged = true;\n        }\n    }\n    set previousInstanceBuffer(value) {\n        if (this._previousInstanceBuffer != value) {\n            this._previousInstanceBuffer = value;\n            this._haveBuffersChanged = true;\n        }\n    }\n    initializeData() {\n        this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n        this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n        this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n        this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n        this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n        this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n        this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n        this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n        this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n        this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n        this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n        this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n        this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n        this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n        this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n        this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n        this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n        this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n        this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n        this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n        this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n        const vertices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).POSITIONS;\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n        const indices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).INDICES;\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n        this.indexCount = indices.length;\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._updateCurrentBuffer();\n        this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n        this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ID_HOVER_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._idAttribute, 1);\n        this._gl.enableVertexAttribArray(this._idAttribute);\n        this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ID_COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._idColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._idColorAttribute);\n        this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).TRANSLATION_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._translationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._translationAttribute);\n        this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SCALE_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._scaleAttribute, 1);\n        this._gl.enableVertexAttribArray(this._scaleAttribute);\n        this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SELECTED_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._selectedAttribute, 1);\n        this._gl.enableVertexAttribArray(this._selectedAttribute);\n        this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ORDER_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._orderAttribute, 1);\n        this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n        if (this._previousInstanceBuffer != this._instanceBuffer) this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n        this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).TRANSLATION_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n        this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SCALE_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousScaleAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n        this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SELECTED_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n        this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        this._gl.uniform1f(this._timeUniform, this.time);\n        this._gl.uniform1f(this._durationUniform, this.duration);\n        this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n        this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n        this._gl.uniform1i(this._previousSampler0Uniform, 0);\n        this._gl.uniform1i(this._sampler0Uniform, 1);\n        this._gl.uniform1f(this._hoverUniform, this.hover);\n        this._gl.uniform1f(this._activeUniform, this.active);\n    }\n    applyView() {\n        this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n        this._gl.uniform1i(this._shadowUniform, this.isShadowMap ? 1 : 0);\n    }\n    updateTextures() {\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n        this._gl.activeTexture(this._gl.TEXTURE1);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n        super.disableProgram();\n        this._gl.vertexAttribDivisor(this._translationAttribute, 0);\n        this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 0);\n        this._gl.vertexAttribDivisor(this._scaleAttribute, 0);\n        this._gl.vertexAttribDivisor(this._previousScaleAttribute, 0);\n        this._gl.vertexAttribDivisor(this._colorAttribute, 0);\n        this._gl.vertexAttribDivisor(this._previousColorAttribute, 0);\n        this._gl.vertexAttribDivisor(this._selectedAttribute, 0);\n        this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 0);\n        this._gl.vertexAttribDivisor(this._orderAttribute, 0);\n        this._gl.vertexAttribDivisor(this._idAttribute, 0);\n        this._gl.vertexAttribDivisor(this._idColorAttribute, 0);\n    }\n}\n\n\nclass $10a1c9b35469ca2f$export$b72dd5e86522410a extends (0, $aaa12a8ba275f824$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n        this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._rotationAttribute);\n        this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n        super.disableProgram();\n        this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n        this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $8e9c2eab8262cc5c$export$427a5e80ce652e7d extends (0, $aaa12a8ba275f824$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $b02a2d0d38a17398$export$28e50bed796372f2 extends (0, $aaa12a8ba275f824$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n        this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._rotationAttribute);\n        this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n        super.disableProgram();\n        this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n        this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $033aeb83f2353e26$export$b0bdf50006eaaa7a extends (0, $aaa12a8ba275f824$export$c4c8cc0016dff604) {\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        super._initializeShader(gl, vsSource, fsSource);\n        this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n        this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n        this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n        this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n        this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n        this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n        this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n        super._updateCurrentBuffer();\n        this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._rotationAttribute);\n        this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).TEXCOORD_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._texCoordAttribute, 1);\n        this._gl.enableVertexAttribArray(this._texCoordAttribute);\n        this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n        super._updatePreviousBuffer();\n        this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).ROTATION_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n        this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).TEXCOORD_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n        this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, (0, $0a0587bd8b0d58e8$export$849e31d725692576).SIZE_BYTES, (0, $0a0587bd8b0d58e8$export$849e31d725692576).COLOR_OFFSET_BYTES);\n        this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n        this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n        super.apply();\n        this._gl.uniform1i(this._previousSampler1Uniform, 2);\n        this._gl.uniform1i(this._sampler1Uniform, 3);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE2);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n        this._gl.activeTexture(this._gl.TEXTURE3);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n        super.disableProgram();\n        this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n        this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n        this._gl.vertexAttribDivisor(this._texCoordAttribute, 0);\n        this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 0);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $f3c682691ac3327e$export$668799e4797757a8 extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    constructor(core, main){\n        super(core, main);\n        this._quad = new (0, $046a802c77c0a655$export$7005c9eb6671414d)();\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        this._quad.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"background.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n        this._isInitialized = true;\n        this._vao = gl.createVertexArray();\n        gl.bindVertexArray(this._vao);\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._quad.vertexBuffer);\n        gl.vertexAttribPointer(this._positionAttribute, 3, gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        gl.enableVertexAttribArray(this._positionAttribute);\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._quad.indexBuffer);\n        gl.bindVertexArray(null);\n    }\n    apply() {\n        this._gl.uniform3fv(this._colorUniform, this.color);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindVertexArray(this._vao);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $00574d18b13d37d0$export$9aeffd51459d3d9 extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D1() {\n        return this._texture2D1;\n    }\n    set texture2D1(value) {\n        if (this._texture2D1 != value) {\n            this._texture2D1 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D2() {\n        return this._texture2D2;\n    }\n    set texture2D2(value) {\n        if (this._texture2D2 != value) {\n            this._texture2D2 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D3() {\n        return this._texture2D3;\n    }\n    set texture2D3(value) {\n        if (this._texture2D3 != value) {\n            this._texture2D3 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"ssao.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n        this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n        this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n        this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._ssaoNoiseSizeUniform = gl.getUniformLocation(this._program, \"uSsaoNoiseSize\");\n        this._ssaoRadiusUniform = gl.getUniformLocation(this._program, \"uSsaoRadius\");\n        this._ssaoPowerUniform = gl.getUniformLocation(this._program, \"uSsaoPower\");\n        this._ssaoKernelUniform = gl.getUniformLocation(this._program, \"uSsaoKernel\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1i(this._samplerUniform1, 0);\n        this._gl.uniform1i(this._samplerUniform2, 1);\n        this._gl.uniform1i(this._samplerUniform3, 2);\n        this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n        this._gl.uniform1f(this._ssaoNoiseSizeUniform, this.ssaoNoiseSize);\n        this._gl.uniform1f(this._ssaoRadiusUniform, this.ssaoRadius);\n        this._gl.uniform1f(this._ssaoPowerUniform, this.ssaoPower);\n        this._gl.uniform3fv(this._ssaoKernelUniform, this.ssaoKernel);\n    }\n    applyView() {\n        this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n        this._gl.activeTexture(this._gl.TEXTURE1);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n        this._gl.activeTexture(this._gl.TEXTURE2);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $1f3dda2230720917$export$e71c4d32a2263218 extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"box.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1i(this._samplerUniform, 0);\n        this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $190597e9b40588c3$export$85f6557964517f1a extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D1() {\n        return this._texture2D1;\n    }\n    set texture2D1(value) {\n        if (this._texture2D1 != value) {\n            this._texture2D1 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D2() {\n        return this._texture2D2;\n    }\n    set texture2D2(value) {\n        if (this._texture2D2 != value) {\n            this._texture2D2 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D3() {\n        return this._texture2D3;\n    }\n    set texture2D3(value) {\n        if (this._texture2D3 != value) {\n            this._texture2D3 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D4() {\n        return this._texture2D4;\n    }\n    set texture2D4(value) {\n        if (this._texture2D4 != value) {\n            this._texture2D4 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D5() {\n        return this._texture2D5;\n    }\n    set texture2D5(value) {\n        if (this._texture2D5 != value) {\n            this._texture2D5 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    constructor(core, main){\n        super(core, main);\n        this.directionToKeyLight = (0, $31054a6c69637582$exports).create();\n        this.directionToFillLight1 = (0, $31054a6c69637582$exports).create();\n        this.directionToFillLight2 = (0, $31054a6c69637582$exports).create();\n        this.keyLightHalfAngle = (0, $31054a6c69637582$exports).create();\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"deferred.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n        this._ssaoUniform = gl.getUniformLocation(this._program, \"uSsao\");\n        this._inverseVMatrixUniform = gl.getUniformLocation(this._program, \"uInverseVMatrix\");\n        this._shadowVMatrixUniform = gl.getUniformLocation(this._program, \"uShadowVMatrix\");\n        this._shadowPMatrixUniform = gl.getUniformLocation(this._program, \"uShadowPMatrix\");\n        this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n        this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n        this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n        this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n        this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._shadowMapSizeUniform = gl.getUniformLocation(this._program, \"uShadowMapSize\");\n        this._keyLightHalfAngleUniform = gl.getUniformLocation(this._program, \"uKeyLightHalfAngle\");\n        this._directionToKeyLightUniform = gl.getUniformLocation(this._program, \"uDirectionToKeyLight\");\n        this._directionToFillLight1Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight1\");\n        this._directionToFillLight2Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight2\");\n        this._keyLightIntensityUniform = gl.getUniformLocation(this._program, \"uKeyLightIntensity\");\n        this._fillLight1IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight1Intensity\");\n        this._fillLight2IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight2Intensity\");\n        this._ambientIntensityUniform = gl.getUniformLocation(this._program, \"uAmbientIntensity\");\n        this._materialIntensityUniform = gl.getUniformLocation(this._program, \"uMaterialIntensity\");\n        this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n        this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1i(this._shadowUniform, this.isShadowEnabled ? 1 : 0);\n        this._gl.uniform1i(this._ssaoUniform, this.isSsaoEnabled ? 1 : 0);\n        this._gl.uniformMatrix4fv(this._inverseVMatrixUniform, false, this.inverseVMatrix);\n        this._gl.uniformMatrix4fv(this._shadowVMatrixUniform, false, this.shadowVMatrix);\n        this._gl.uniformMatrix4fv(this._shadowPMatrixUniform, false, this.shadowPMatrix);\n        this._gl.uniform1i(this._samplerUniform1, 0);\n        this._gl.uniform1i(this._samplerUniform2, 1);\n        this._gl.uniform1i(this._samplerUniform3, 2);\n        this._gl.uniform1i(this._samplerUniform4, 3);\n        this._gl.uniform1i(this._samplerUniform5, 4);\n        this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n        this._gl.uniform2f(this._shadowMapSizeUniform, this.shadowMapWidth, this.shadowMapHeight);\n        this._gl.uniform1f(this._keyLightIntensityUniform, this.keyLightIntensity);\n        this._gl.uniform1f(this._fillLight1IntensityUniform, this.fillLight1Intensity);\n        this._gl.uniform1f(this._fillLight2IntensityUniform, this.fillLight2Intensity);\n        this._gl.uniform1f(this._ambientIntensityUniform, this.ambientIntensity);\n        this._gl.uniform1f(this._materialIntensityUniform, this.materialIntensity);\n        this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n        this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n        this._gl.uniform3fv(this._directionToKeyLightUniform, this.directionToKeyLight);\n        this._gl.uniform3fv(this._directionToFillLight1Uniform, this.directionToFillLight1);\n        this._gl.uniform3fv(this._directionToFillLight2Uniform, this.directionToFillLight2);\n        this._gl.uniform3fv(this._keyLightHalfAngleUniform, this.keyLightHalfAngle);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n        this._gl.activeTexture(this._gl.TEXTURE1);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n        this._gl.activeTexture(this._gl.TEXTURE2);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n        this._gl.activeTexture(this._gl.TEXTURE3);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n        this._gl.activeTexture(this._gl.TEXTURE4);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $5b394f278f6c99db$export$42b7cecdce1e9ecc extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D1() {\n        return this._texture2D1;\n    }\n    set texture2D1(value) {\n        if (this._texture2D1 != value) {\n            this._texture2D1 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D2() {\n        return this._texture2D2;\n    }\n    set texture2D2(value) {\n        if (this._texture2D2 != value) {\n            this._texture2D2 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D3() {\n        return this._texture2D3;\n    }\n    set texture2D3(value) {\n        if (this._texture2D3 != value) {\n            this._texture2D3 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D4() {\n        return this._texture2D4;\n    }\n    set texture2D4(value) {\n        if (this._texture2D4 != value) {\n            this._texture2D4 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D5() {\n        return this._texture2D5;\n    }\n    set texture2D5(value) {\n        if (this._texture2D5 != value) {\n            this._texture2D5 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"combine.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._intensityUniform = gl.getUniformLocation(this._program, \"uIntensity\");\n        this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n        this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n        this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n        this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n        this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n        this._gl.uniform1f(this._intensityUniform, this.intensity);\n        this._gl.uniform1i(this._samplerUniform1, 0);\n        this._gl.uniform1i(this._samplerUniform2, 1);\n        this._gl.uniform1i(this._samplerUniform3, 2);\n        this._gl.uniform1i(this._samplerUniform4, 3);\n        this._gl.uniform1i(this._samplerUniform5, 4);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n        this._gl.activeTexture(this._gl.TEXTURE1);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n        this._gl.activeTexture(this._gl.TEXTURE2);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n        this._gl.activeTexture(this._gl.TEXTURE3);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n        this._gl.activeTexture(this._gl.TEXTURE4);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $3c55280ad494aadd$export$3edb5030712765fa extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D1() {\n        return this._texture2D1;\n    }\n    set texture2D1(value) {\n        if (this._texture2D1 != value) {\n            this._texture2D1 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D2() {\n        return this._texture2D2;\n    }\n    set texture2D2(value) {\n        if (this._texture2D2 != value) {\n            this._texture2D2 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"dofblur.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n        this._nearFocusDepthUniform = gl.getUniformLocation(this._program, \"uNearFocusDepth\");\n        this._farFocusDepthUniform = gl.getUniformLocation(this._program, \"uFarFocusDepth\");\n        this._maxBackgroundBlurUniform = gl.getUniformLocation(this._program, \"uMaxBackgroundBlur\");\n        this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n        this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n        this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n        this._gl.uniform1f(this._nearFocusDepthUniform, this.nearFocusDepth);\n        this._gl.uniform1f(this._farFocusDepthUniform, this.farFocusDepth);\n        this._gl.uniform1f(this._maxBackgroundBlurUniform, this.maxBackgroundBlur);\n        this._gl.uniform1i(this._samplerUniform1, 0);\n        this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n        this._gl.activeTexture(this._gl.TEXTURE1);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $903b38bcb9c6df3c$export$fce67a054bb06d73 extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"downsample.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n        this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $1f52e628cc3ed829$export$2cae02e4a50f2cda extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"gaussian.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n        this._horizontalUniform = gl.getUniformLocation(this._program, \"uHorizontal\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1i(this._samplerUniform, 0);\n        this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n        this._gl.uniform1i(this._horizontalUniform, this.horizontal ? 1 : 0);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $096272391683d440$export$ff3d2a706a946a2 extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D1() {\n        return this._texture2D1;\n    }\n    set texture2D1(value) {\n        if (this._texture2D1 != value) {\n            this._texture2D1 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D2() {\n        return this._texture2D2;\n    }\n    set texture2D2(value) {\n        if (this._texture2D2 != value) {\n            this._texture2D2 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    get texture2D3() {\n        return this._texture2D3;\n    }\n    set texture2D3(value) {\n        if (this._texture2D3 != value) {\n            this._texture2D3 = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"dofcombine.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n        this._apertureUniform = gl.getUniformLocation(this._program, \"uAperture\");\n        this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n        this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n        this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n        this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n        this._gl.uniform1f(this._apertureUniform, this.aperture);\n        this._gl.uniform1i(this._samplerUniform1, 0);\n        this._gl.uniform1i(this._samplerUniform2, 1);\n        this._gl.uniform1i(this._samplerUniform3, 2);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n        this._gl.activeTexture(this._gl.TEXTURE1);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n        this._gl.activeTexture(this._gl.TEXTURE2);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $ca1e5eb7e900b291$export$9a81f906983b6bc8 extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"fxaa.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n        this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $4aa6b658ca80a4c6$export$2898c0abb0413fac extends (0, $a9df2cd8c496e87d$export$59a6ab026766925f) {\n    get texture2D() {\n        return this._texture2D;\n    }\n    set texture2D(value) {\n        if (this._texture2D != value) {\n            this._texture2D = value;\n            this._haveTexturesChanged = true;\n        }\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        if (this._isLoaded) this._initializeShader(gl, this._vsSource, this._fsSource);\n        else this._shaderFromFile(\"simple.vertex.fx\", \"bright.fragment.fx\", (vsSource, fsSource)=>{\n            this._vsSource = vsSource;\n            this._fsSource = fsSource;\n            this._isLoaded = true;\n            this._initializeShader(gl, vsSource, fsSource);\n        });\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n        const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n        const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n        this._program = this._createProgram(vs, fs);\n        this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n        this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n        this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n        this._isInitialized = true;\n    }\n    apply() {\n        this._gl.uniform1i(this._samplerUniform, 0);\n        this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n    }\n    updateBuffers() {\n        super.updateBuffers();\n        super.updateBuffers();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, (0, $0a0587bd8b0d58e8$export$5b33f080c7f6c861).SIZE_BYTES, 0);\n        this._gl.enableVertexAttribArray(this._positionAttribute);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n        super.updateTextures();\n        this._gl.activeTexture(this._gl.TEXTURE0);\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n}\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $cf1768f087a3e016$export$ab05abf6f96a5bb1 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get axes() {\n        return this._axes;\n    }\n    constructor(core){\n        this._core = core;\n        this.isVisible = true;\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n    }\n    update(elapsedTime) {}\n    render(elapsedTime, xrFrame) {\n        if (this.isInitialized) {\n            this._renderGrid();\n            this._renderText();\n        }\n    }\n    _renderGrid() {}\n    _renderText() {}\n}\n\n\n\n\nclass $e9fa83a8cf03e87c$export$30e3ee7ba3e49080 extends (0, $cf1768f087a3e016$export$ab05abf6f96a5bb1) {\n    get isInitialized() {\n        return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes){\n        super(core);\n        this._main = main;\n        this._axes = cartesian2dAxes;\n        this._axes.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        const axes = this._axes;\n        if (!axes.isInitialized) axes.initialize();\n        if (axes.gridVertices) this._createGridBuffers();\n        if (axes.textVertices) this._createTextBuffers();\n        this._isInitialized = true;\n    }\n    _createGridBuffers() {\n        const axes = this._axes;\n        this._gridVertexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n        this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n        this._gridIndexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n        this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n        this._gridBufferSize = axes.gridVertices.byteLength;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n        const axes = this._axes;\n        this._textVertexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n        this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n        this._textIndexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n        this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n        this._textBufferSize = axes.textVertices.byteLength;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            const axes = this._axes;\n            if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) this._createGridBuffers();\n            else {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d visual grid buffers updated`);\n            }\n            if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) this._createTextBuffers();\n            else {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian2d visual text buffers updated`);\n            }\n            this._main.shaderResources.currentProgram = null;\n        }\n    }\n    _renderText() {\n        const shader = this._main.sdfTextShader;\n        const shaderResources = this._main.shaderResources;\n        const axes = this._axes;\n        const fontVisual = this._main.fonts[axes.font.name];\n        shader.vertexBuffer = this._textVertexBuffer;\n        shader.indexBuffer = this._textIndexBuffer;\n        shader.texture2D = fontVisual.texture;\n        shader.prepare();\n        shader.buffer = fontVisual.font.edgeValue / 0xff;\n        shader.gamma = axes.gamma;\n        shader.borderWidth = axes.textBorderWidth;\n        shader.color = axes.textColor || this._core.config.axesTextColor;\n        shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n        shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n        shader.pickedIdColor = this.pickedIdColor;\n        shader.apply();\n        let indexCount, indexOffset;\n        for(let axisId = 0; axisId < 2; axisId++){\n            const orientation = axes.getLabelOrientation(axisId);\n            for(let edge = 0; edge < 2; edge++){\n                const edgeId = (0, $3ce6ee188e300946$export$7005c9eb6671414d).AXIS_EDGES[axisId][edge];\n                if (axes.isEdgeVisible[edgeId]) {\n                    if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                        indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                        indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                    } else {\n                        indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                        indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                    }\n                    if (indexCount > 0) {\n                        shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                        for(let i = 0; i < this.viewportCount; i++){\n                            const viewport = i + this.viewportOffset;\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                    indexCount = axes.getTitleIndexCount(axisId);\n                    if (indexCount > 0) {\n                        indexOffset = axes.getTitleIndexOffset(axisId);\n                        shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                        for(let i = 0; i < this.viewportCount; i++){\n                            const viewport = i + this.viewportOffset;\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                }\n                indexCount = axes.getHeadingIndexCount(axisId);\n                if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                    indexOffset = axes.getHeadingIndexOffset(axisId);\n                    shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                    shader.applyModel();\n                    shader.isPickShader = false;\n                    shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                    for(let i = 0; i < this.viewportCount; i++){\n                        const viewport = i + this.viewportOffset;\n                        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                        shader.vMatrix = this.vMatrices[viewport];\n                        shader.pMatrix = this.pMatrices[viewport];\n                        shader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                    }\n                    if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                        shader.isPickShader = true;\n                        shader.pMatrix = this.pickPMatrix;\n                        shader.vMatrix = this.pickVMatrix;\n                        shader.applyView();\n                        shaderResources.bindFramebuffer(this.pickFramebuffer);\n                        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                    }\n                }\n            }\n        }\n    }\n    _renderGrid() {\n        const gridShader = this._main.gridShader;\n        const axes = this._axes;\n        gridShader.vertexBuffer = this._gridVertexBuffer;\n        gridShader.indexBuffer = this._gridIndexBuffer;\n        gridShader.prepare();\n        gridShader.majorThickness = axes.gridMajorThickness;\n        gridShader.minorThickness = axes.gridMinorThickness;\n        gridShader.zeroThickness = axes.gridZeroThickness;\n        gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n        gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n        gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n        gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n        gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n        gridShader.pickedIdColor = this.pickedIdColor;\n        gridShader.apply();\n        for(let axisId = 0; axisId < 2; axisId++)if (axes.arePickDivisionsVisible[axisId]) {\n            const gridTicksScale = axes.getGridTicksScale(axisId);\n            const width = gridTicksScale[0];\n            const height = gridTicksScale[1];\n            gridShader.zero = axes.getGridTicksZero(axisId);\n            gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n            for(let edge = 0; edge < 2; edge++){\n                const edgeId = (0, $3ce6ee188e300946$export$7005c9eb6671414d).AXIS_EDGES[axisId][edge];\n                if (axes.isEdgeVisible[edgeId]) this._renderGridTicks(axisId, edgeId, width, height);\n            }\n        }\n        this._gl.disable(this._gl.CULL_FACE);\n        const size = axes.size;\n        const axisId2 = 0;\n        const axisId3 = 1;\n        const width = size[axisId2];\n        const height = size[axisId3];\n        gridShader.zero = axes.gridFaceZero;\n        gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n        for(let face = 0; face < 2; face++){\n            const faceId = face;\n            if (axes.getIsForwardFace(faceId)) this._renderGridFace(faceId, width, height);\n        }\n        this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width, height) {\n        const gridShader = this._main.gridShader;\n        const shaderResources = this._main.shaderResources;\n        const axes = this._axes;\n        gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n        gridShader.faceWidth = width;\n        gridShader.faceHeight = height;\n        gridShader.ApplyFace();\n        gridShader.isPickShader = false;\n        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n        for(let i = 0; i < this.viewportCount; i++){\n            const viewport = i + this.viewportOffset;\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            gridShader.vMatrix = this.vMatrices[viewport];\n            gridShader.pMatrix = this.pMatrices[viewport];\n            gridShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n        }\n        if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n            gridShader.isPickShader = true;\n            gridShader.vMatrix = this.pickVMatrix;\n            gridShader.pMatrix = this.pickPMatrix;\n            gridShader.applyView();\n            shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n        }\n    }\n    _renderGridFace(faceId, width, height) {\n        const gridShader = this._main.gridShader;\n        const shaderResources = this._main.shaderResources;\n        const axes = this._axes;\n        gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n        gridShader.faceWidth = width;\n        gridShader.faceHeight = height;\n        gridShader.ApplyFace();\n        gridShader.isPickShader = false;\n        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n        for(let i = 0; i < this.viewportCount; i++){\n            const viewport = i + this.viewportOffset;\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            gridShader.vMatrix = this.vMatrices[viewport];\n            gridShader.pMatrix = this.pMatrices[viewport];\n            gridShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n        }\n        if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n            gridShader.isPickShader = true;\n            gridShader.vMatrix = this.pickVMatrix;\n            gridShader.pMatrix = this.pickPMatrix;\n            gridShader.applyView();\n            shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $e3e392e891911753$export$3dc3b91df297f2ee extends (0, $cf1768f087a3e016$export$ab05abf6f96a5bb1) {\n    get isInitialized() {\n        return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes){\n        super(core);\n        this._main = main;\n        this._axes = cartesian3dAxes;\n        this._axes.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n    }\n    initializeContext(gl) {\n        super.initializeContext(gl);\n        const axes = this._axes;\n        if (!axes.isInitialized) axes.initialize();\n        if (axes.gridVertices) this._createGridBuffers();\n        if (axes.textVertices) this._createTextBuffers();\n        this._isInitialized = true;\n    }\n    _createGridBuffers() {\n        const axes = this._axes;\n        this._gridVertexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n        this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n        this._gridIndexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n        this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n        this._gridBufferSize = axes.gridVertices.byteLength;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n        const axes = this._axes;\n        this._textVertexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n        this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n        this._textIndexBuffer = this._gl.createBuffer();\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n        this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n        this._textBufferSize = axes.textVertices.byteLength;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            const axes = this._axes;\n            if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) this._createGridBuffers();\n            else {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d visual grid buffers updated`);\n            }\n            if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) this._createTextBuffers();\n            else {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `cartesian3d visual text buffers updated`);\n            }\n            this._main.shaderResources.currentProgram = null;\n        }\n    }\n    _renderText() {\n        const axes = this._axes;\n        const shader = this._main.sdfTextShader;\n        const shaderResources = this._main.shaderResources;\n        const fontVisual = this._main.fonts[axes.font.name];\n        shader.vertexBuffer = this._textVertexBuffer;\n        shader.indexBuffer = this._textIndexBuffer;\n        shader.texture2D = fontVisual.texture;\n        shader.prepare();\n        shader.buffer = fontVisual.font.edgeValue / 0xff;\n        shader.gamma = axes.gamma;\n        shader.borderWidth = axes.textBorderWidth;\n        shader.color = axes.textColor || this._core.config.axesTextColor;\n        shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n        shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n        shader.pickedIdColor = this.pickedIdColor;\n        shader.apply();\n        let indexCount, indexOffset;\n        for(let axisId = 0; axisId < 3; axisId++){\n            const orientation = axes.getLabelOrientation(axisId);\n            for(let edge = 0; edge < 4; edge++){\n                const edgeId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_EDGES[axisId][edge];\n                if (axes.getIsOutsideEdge(edgeId)) {\n                    if (axes.isEdgeVisible[edgeId]) {\n                        if (orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                            indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                            indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                        } else {\n                            indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                            indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                        }\n                        if (indexCount > 0) {\n                            shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                            for(let i = 0; i < this.viewportCount; i++){\n                                const viewport = i + this.viewportOffset;\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                        indexCount = axes.getTitleIndexCount(axisId);\n                        if (indexCount > 0) {\n                            indexOffset = axes.getTitleIndexOffset(axisId);\n                            shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                            for(let i = 0; i < this.viewportCount; i++){\n                                const viewport = i + this.viewportOffset;\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                    indexCount = axes.getHeadingIndexCount(axisId);\n                    if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                        indexOffset = axes.getHeadingIndexOffset(axisId);\n                        shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                        for(let i = 0; i < this.viewportCount; i++){\n                            const viewport = i + this.viewportOffset;\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                }\n            }\n        }\n    }\n    _renderGrid() {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        gridShader.vertexBuffer = this._gridVertexBuffer;\n        gridShader.indexBuffer = this._gridIndexBuffer;\n        gridShader.prepare();\n        gridShader.majorThickness = axes.gridMajorThickness;\n        gridShader.minorThickness = axes.gridMinorThickness;\n        gridShader.zeroThickness = axes.gridZeroThickness;\n        gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n        gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n        gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n        gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n        gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n        gridShader.pickedIdColor = this.pickedIdColor;\n        gridShader.apply();\n        for(let axisId = 0; axisId < 3; axisId++)if (axes.arePickDivisionsVisible[axisId]) {\n            const gridTicksScale = axes.getGridTicksScale(axisId);\n            const width = gridTicksScale[0];\n            const height = gridTicksScale[1];\n            gridShader.zero = axes.getGridTicksZero(axisId);\n            gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n            for(let edge = 0; edge < 4; edge++){\n                const edgeId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_EDGES[axisId][edge];\n                if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) this._renderGridTicks(axisId, edgeId, width, height);\n            }\n        }\n        this._gl.disable(this._gl.CULL_FACE);\n        const size = axes.size;\n        for(let axisId = 0; axisId < 3; axisId++)if (axes.areFacesVisible[axisId]) {\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            const width = size[axisId2];\n            const height = size[axisId3];\n            gridShader.zero = axes.getGridFaceZero(axisId);\n            gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n            for(let face = 0; face < 2; face++){\n                const faceId = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).AXIS_FACES[axisId][face];\n                if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) this._renderGridFace(faceId, width, height);\n            }\n        }\n        this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width, height) {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        const shaderResources = this._main.shaderResources;\n        gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n        gridShader.faceWidth = width;\n        gridShader.faceHeight = height;\n        gridShader.ApplyFace();\n        gridShader.isPickShader = false;\n        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n        for(let i = 0; i < this.viewportCount; i++){\n            const viewport = i + this.viewportOffset;\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            gridShader.vMatrix = this.vMatrices[viewport];\n            gridShader.pMatrix = this.pMatrices[viewport];\n            gridShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n        }\n        if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n            gridShader.isPickShader = true;\n            gridShader.vMatrix = this.pickVMatrix;\n            gridShader.pMatrix = this.pickPMatrix;\n            gridShader.applyView();\n            shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n        }\n    }\n    _renderGridFace(faceId, width, height) {\n        const axes = this._axes;\n        const gridShader = this._main.gridShader;\n        const shaderResources = this._main.shaderResources;\n        gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n        gridShader.faceWidth = width;\n        gridShader.faceHeight = height;\n        gridShader.ApplyFace();\n        gridShader.isPickShader = false;\n        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n        for(let i = 0; i < this.viewportCount; i++){\n            const viewport = i + this.viewportOffset;\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            gridShader.vMatrix = this.vMatrices[viewport];\n            gridShader.pMatrix = this.pMatrices[viewport];\n            gridShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n        }\n        if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n            gridShader.isPickShader = true;\n            gridShader.vMatrix = this.pickVMatrix;\n            gridShader.pMatrix = this.pickPMatrix;\n            gridShader.applyView();\n            shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $24cf6d98e6e0d82f$export$e784a6eab4d2d700 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get font() {\n        return this._font;\n    }\n    constructor(core, font){\n        this._core = core;\n        this._font = font;\n        font.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n    }\n    initializeContext(gl) {\n        this._gl = gl;\n        this._isInitialized = true;\n        if (this._font.count > 0) this._hasChanged = true;\n    }\n    update() {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            this.texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this._font.name} texture updated`);\n        }\n    }\n}\n\n\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $de477c17b1036dd4$var$LabelVisualBase {\n    get isInitialized() {\n        return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label){\n        this._core = core;\n        this._main = main;\n        this._label = label;\n        this._label.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n        this._mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.isVisible = true;\n    }\n    initializeContext(gl) {\n        if (!this._label.isInitialized) this._label.initialize();\n        this._gl = gl;\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n        }\n    }\n    render(elapsedTime, xrFrame) {\n        if (this.isInitialized) {\n            const indexCount = this._label.indexCount;\n            if (indexCount > 0) {\n                const shader = this._main.sdfTextShader;\n                const fontVisual = this._main.fonts[this._label.font.name];\n                shader.vertexBuffer = this._vertexBuffer;\n                shader.indexBuffer = this._indexBuffer;\n                shader.texture2D = fontVisual.texture;\n                shader.prepare();\n                shader.gamma = this._label.gamma;\n                shader.buffer = fontVisual.font.edgeValue / 0xff;\n                shader.borderWidth = this._label.borderWidth;\n                shader.color = this._label.color || this._core.config.textColor;\n                shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n                shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n                shader.pickedIdColor = this.pickedIdColor;\n                shader.apply();\n                (0, $1ac1b59392edf35b$exports).multiply(this._mMatrix, this.mMatrix, this._label.mMatrix);\n                shader.mMatrix = this._mMatrix;\n                shader.applyModel();\n                shader.isPickShader = false;\n                this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for(let i = 0; i < this.viewportCount; i++){\n                    const viewport = i + this.viewportOffset;\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    shader.vMatrix = this.vMatrices[viewport];\n                    shader.pMatrix = this.pMatrices[viewport];\n                    shader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this.isPickingEnabled) {\n                    shader.isPickShader = true;\n                    shader.pMatrix = this.pickPMatrix;\n                    shader.vMatrix = this.pickVMatrix;\n                    shader.applyView();\n                    this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        }\n    }\n}\nclass $de477c17b1036dd4$export$71c7fa1581020e2c extends $de477c17b1036dd4$var$LabelVisualBase {\n    get label() {\n        return this._label;\n    }\n    set text(value) {\n        this._label.text = value;\n    }\n    get text() {\n        return this._label.text;\n    }\n    constructor(core, main, label){\n        super(core, main, label);\n    }\n}\nclass $de477c17b1036dd4$export$97e93e7019ef67b9 extends $de477c17b1036dd4$var$LabelVisualBase {\n    get label() {\n        return this._label;\n    }\n    constructor(core, main, label){\n        super(core, main, label);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $8a9611d4c44522de$export$6f251cd327b2ff1 {\n    get isInitialized() {\n        return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n        return this._image;\n    }\n    constructor(core, main, image){\n        this._core = core;\n        this._main = main;\n        this._image = image;\n        this._image.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n        this.mMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this.isVisible = true;\n    }\n    initializeContext(gl) {\n        if (!this._image.isInitialized) this._image.initialize();\n        this._gl = gl;\n        if (this._image.imageData) this.texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).fromImage(gl, this._image.imageData, false, gl.LINEAR);\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n        this._isInitialized = true;\n    }\n    update(elapsedTime) {\n        if (this._hasChanged) {\n            this._hasChanged = false;\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n            this._main.shaderResources.currentProgram = null;\n        }\n    }\n    render(elapsedTime, xrFrame) {\n        if (this.isInitialized) {\n            const textureShader = this._main.textureShader;\n            textureShader.vertexBuffer = this._vertexBuffer;\n            textureShader.indexBuffer = this._indexBuffer;\n            textureShader.texture2D = this.texture;\n            textureShader.prepare();\n            textureShader.mMatrix = this.mMatrix;\n            textureShader.apply();\n            this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for(let i = 0; i < this.viewportCount; i++){\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                textureShader.vMatrix = this.vMatrices[viewport];\n                textureShader.pMatrix = this.pMatrices[viewport];\n                textureShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $16ac0b4583f1f008$export$dc8af347244861ce {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get vertexBuffer() {\n        return this._vertexBuffer;\n    }\n    get indexBuffer() {\n        return this._indexBuffer;\n    }\n    get indexCount() {\n        return this._indexCount;\n    }\n    initializeContext(gl) {\n        const vertices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).textured((0, $d4d7bd6cc65a5081$export$a002182e51710d39).MAT4_IDENTITY);\n        this._vertexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n        gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n        const indices = (0, $3ce6ee188e300946$export$7005c9eb6671414d).INDICES;\n        this._indexBuffer = gl.createBuffer();\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n        this._indexCount = indices.length;\n        this._isInitialized = true;\n    }\n}\n\n\nvar $8e6261810f478ee0$var$__awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nclass $8e6261810f478ee0$export$861edd1ccea2f746 extends (0, $a123db7d2af0bebc$export$30686c90897c890d) {\n    get shaderResources() {\n        return this._shaderResources;\n    }\n    get textureShader() {\n        return this._textureShader;\n    }\n    get lassoShader() {\n        return this._lassoShader;\n    }\n    get sdfTextShader() {\n        return this._sdfTextShader;\n    }\n    get gridShader() {\n        return this._gridShader;\n    }\n    get blockShader() {\n        return this._blockShader;\n    }\n    get sphereShader() {\n        return this._sphereShader;\n    }\n    get cyclinderShader() {\n        return this._cylinderShader;\n    }\n    get sdfShader() {\n        return this._sdfShader;\n    }\n    get currentAxes() {\n        return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value) {\n        if (this._isAxes1Current) this._axes1 = value;\n        else this._axes2 = value;\n    }\n    get previousAxes() {\n        return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value) {\n        if (this._isAxes1Current) this._axes2 = value;\n        else this._axes1 = value;\n    }\n    get config() {\n        return this._config;\n    }\n    constructor(options){\n        super(options);\n        this._config = new (0, $115d7df89ed6abb3$export$29cd7b75162a9425)();\n        this._quad = new (0, $046a802c77c0a655$export$7005c9eb6671414d)();\n        this._lasso = new (0, $16ac0b4583f1f008$export$dc8af347244861ce)();\n        this._pickedPixels = new Uint8Array(4);\n        this._pickedIdColor = (0, $4c4ac78b213a9c07$exports).create();\n        this._position = (0, $31054a6c69637582$exports).create();\n        this._direction = (0, $31054a6c69637582$exports).create();\n        this._cameraRotation = (0, $ba3ca37806a2b6fa$exports).create();\n        this._cameraPosition = (0, $31054a6c69637582$exports).create();\n        this._modelPosition = (0, $31054a6c69637582$exports).create();\n        this._modelManipulationOrigin = (0, $31054a6c69637582$exports).create();\n        this._shadowVMatrix = (0, $1ac1b59392edf35b$exports).create();\n        this._shadowPMatrix = (0, $1ac1b59392edf35b$exports).create();\n    }\n    get isSupported() {\n        return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    initialize(core) {\n        super.initialize(core);\n        this._shaderResources = new (0, $a9df2cd8c496e87d$export$e9a269813a6315a4)();\n        this._textureShader = new (0, $f429c522f972f41c$export$5431306cf43de24a)(core, this);\n        this._lassoShader = new (0, $07302b7e66b98ad4$export$dc8af347244861ce)(core, this);\n        this._sdfTextShader = new (0, $5096a2d574b69029$export$a3be0de02f08c3be)(core, this);\n        this._gridShader = new (0, $0d68a84ac7ce9cae$export$3b812729b68dda3e)(core, this);\n        this._blockShader = new (0, $10a1c9b35469ca2f$export$b72dd5e86522410a)(core, this);\n        this._sphereShader = new (0, $8e9c2eab8262cc5c$export$427a5e80ce652e7d)(core, this);\n        this._cylinderShader = new (0, $b02a2d0d38a17398$export$28e50bed796372f2)(core, this);\n        this._sdfShader = new (0, $033aeb83f2353e26$export$b0bdf50006eaaa7a)(core, this);\n        this._backgroundShader = new (0, $f3c682691ac3327e$export$668799e4797757a8)(core, this);\n        this._ssaoShader = new (0, $00574d18b13d37d0$export$9aeffd51459d3d9)(core, this);\n        this._boxShader = new (0, $1f3dda2230720917$export$e71c4d32a2263218)(core, this);\n        this._deferredShader = new (0, $190597e9b40588c3$export$85f6557964517f1a)(core, this);\n        this._combineShader = new (0, $5b394f278f6c99db$export$42b7cecdce1e9ecc)(core, this);\n        this._dofBlurShader = new (0, $3c55280ad494aadd$export$3edb5030712765fa)(core, this);\n        this._downsampleShader = new (0, $903b38bcb9c6df3c$export$fce67a054bb06d73)(core, this);\n        this._gaussianShader = new (0, $1f52e628cc3ed829$export$2cae02e4a50f2cda)(core, this);\n        this._dofCombineShader = new (0, $096272391683d440$export$ff3d2a706a946a2)(core, this);\n        this._fxaaShader = new (0, $ca1e5eb7e900b291$export$9a81f906983b6bc8)(core, this);\n        this._brightPassShader = new (0, $4aa6b658ca80a4c6$export$2898c0abb0413fac)(core, this);\n        this._initializeContext(this._createContext(this._canvas));\n        this._canvas.addEventListener(\"webglcontextlost\", (event)=>{\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).warn, \"WebGL context lost\");\n            event.preventDefault();\n        }, false);\n        this._canvas.addEventListener(\"webglcontextrestored\", ()=>{\n            this._initializeContext(this._createContext(this._canvas));\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, \"WebGL context restored\");\n        }, false);\n        this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n        this._gl = gl;\n        for(const key in this.fonts){\n            const fontVisual = this.fonts[key];\n            fontVisual.initializeContext(gl);\n        }\n        this._ssaoSampleKernel = new Float32Array(this._config.ssaoKernelSize * 3);\n        const random = new (0, $2d4d1eb6f32f02f2$export$b8e288c3467acb0e)(0);\n        const _vec3 = (0, $31054a6c69637582$exports).create();\n        for(let i = 0; i < this._config.ssaoKernelSize; i++){\n            _vec3[0] = random.nextFloat() * 2 - 1;\n            _vec3[1] = random.nextFloat() * 2 - 1;\n            _vec3[2] = random.nextFloat();\n            (0, $31054a6c69637582$exports).normalize(_vec3, _vec3);\n            (0, $31054a6c69637582$exports).scale(_vec3, _vec3, random.nextFloat());\n            let scale = i / this._config.ssaoKernelSize;\n            scale = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(0.1, 1, scale * scale);\n            (0, $31054a6c69637582$exports).scale(_vec3, _vec3, scale);\n            this._ssaoSampleKernel[i * 3] = _vec3[0];\n            this._ssaoSampleKernel[i * 3 + 1] = _vec3[1];\n            this._ssaoSampleKernel[i * 3 + 2] = _vec3[2];\n        }\n        const noise = new Float32Array(this._config.ssaoNoiseSize * this._config.ssaoNoiseSize * 4);\n        _vec3[2] = 0;\n        for(let i = 0; i < this._config.ssaoNoiseSize * this._config.ssaoNoiseSize; i++){\n            _vec3[0] = random.nextFloat() * 2 - 1;\n            _vec3[1] = random.nextFloat() * 2 - 1;\n            (0, $31054a6c69637582$exports).normalize(_vec3, _vec3);\n            noise[i * 4] = _vec3[0];\n            noise[i * 4 + 1] = _vec3[1];\n        }\n        this._ssaoNoiseTexture = this._gl.createTexture();\n        this._gl.bindTexture(this._gl.TEXTURE_2D, this._ssaoNoiseTexture);\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST);\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST);\n        this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA32F, this._config.ssaoNoiseSize, this._config.ssaoNoiseSize, 0, this._gl.RGBA, this._gl.FLOAT, noise);\n        this._ssaoWidth = -1;\n        this._ssaoHeight = -1;\n        this._shadowWidth = -1;\n        this._shadowHeight = -1;\n        this._shaderResources.initializeContext(this._gl);\n        this._textureShader.initializeContext(this._gl);\n        this._lassoShader.initializeContext(this._gl);\n        this._sdfTextShader.initializeContext(this._gl);\n        this._gridShader.initializeContext(this._gl);\n        this._blockShader.initializeContext(this._gl);\n        this._sphereShader.initializeContext(this._gl);\n        this._cylinderShader.initializeContext(this._gl);\n        this._sdfShader.initializeContext(this._gl);\n        this._backgroundShader.initializeContext(this._gl);\n        this._ssaoShader.initializeContext(this._gl);\n        this._boxShader.initializeContext(this._gl);\n        this._deferredShader.initializeContext(this._gl);\n        this._combineShader.initializeContext(this._gl);\n        this._dofBlurShader.initializeContext(this._gl);\n        this._downsampleShader.initializeContext(this._gl);\n        this._gaussianShader.initializeContext(this._gl);\n        this._dofCombineShader.initializeContext(this._gl);\n        this._fxaaShader.initializeContext(this._gl);\n        this._brightPassShader.initializeContext(this._gl);\n        this._quad.initializeContext(this._gl);\n        this._lasso.initializeContext(this._gl);\n        this._framebuffers = [\n            null,\n            null\n        ];\n        const texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        const renderBuffer = this._gl.createRenderbuffer();\n        this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n        this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, this._core.config.pickWidth, this._core.config.pickHeight);\n        const framebuffer = this._gl.createFramebuffer();\n        this._shaderResources.bindFramebuffer(framebuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n        this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n        this._pickFrameBuffer = framebuffer;\n        for(let i = 0; i < this.transitionBuffers.length; i++)this.transitionBuffers[i].initializeContext(this._gl);\n        if (this._axes1) for(let i = 0; i < this._axes1.length; i++)this._axes1[i].initializeContext(this._gl);\n        if (this._axes2) for(let i = 0; i < this._axes2.length; i++)this._axes2[i].initializeContext(this._gl);\n        for(let i = 0; i < this.labelSets.length; i++)this.labelSets[i].initializeContext(this._gl);\n        for(let i = 0; i < this.images.length; i++)this.images[i].initializeContext(this._gl);\n    }\n    _resize(width, height) {\n        super._resize(width, height);\n        this._positionTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.NEAREST, null, this._gl.RGBA32F);\n        this._colorTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._normalTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._geometryFrameBuffer = this._gl.createFramebuffer();\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._positionTexture, 0);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT1, this._gl.TEXTURE_2D, this._colorTexture, 0);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT2, this._gl.TEXTURE_2D, this._normalTexture, 0);\n        const renderBuffer = this._gl.createRenderbuffer();\n        this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n        this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, width, height);\n        this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n        this._gl.drawBuffers([\n            this._gl.COLOR_ATTACHMENT0,\n            this._gl.COLOR_ATTACHMENT1,\n            this._gl.COLOR_ATTACHMENT2\n        ]);\n        this._postProcessTexture1 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessDepthTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, width, height, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n        this._postProcessFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture1, 0);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._postProcessDepthTexture, 0);\n        this._postProcessTexture2 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture2, 0);\n        this._postProcessDofTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, width, height, this._gl.RED, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.R32F);\n        this._postProcessDofFrameBuffer = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessDofTexture, 0);\n        const widthHalf = Math.round(width / 2);\n        const heightHalf = Math.round(height / 2);\n        this._postProcessHalfTexture1 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessHalfFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture1, 0);\n        this._postProcessHalfTexture2 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessHalfFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture2, 0);\n        const widthQuarter = Math.round(widthHalf / 2);\n        const heightQuarter = Math.round(heightHalf / 2);\n        this._postProcessQuarterTexture1 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessQuarterFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture1, 0);\n        this._postProcessQuarterTexture2 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessQuarterFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture2, 0);\n        const widthEighth = Math.round(widthQuarter / 2);\n        const heightEighth = Math.round(heightQuarter / 2);\n        this._postProcessEighthTexture1 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessEighthFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture1, 0);\n        this._postProcessEighthTexture2 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessEighthFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture2, 0);\n        const widthSixteenth = Math.round(widthEighth / 2);\n        const hgeightSixteenth = Math.round(heightEighth / 2);\n        this._postProcessSixteenthTexture1 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessSixteenthFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture1, 0);\n        this._postProcessSixteenthTexture2 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n        this._postProcessSixteenthFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture2, 0);\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffers resized ${width},${height}`);\n    }\n    _createContext(canvas) {\n        let supported = false;\n        const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === undefined ? false : this._options.preserveDrawingBuffer : false;\n        const options = {\n            stencil: true,\n            alpha: false,\n            antialias: false,\n            preserveDrawingBuffer: preserveDrawingBuffer\n        };\n        const gl = canvas.getContext(\"webgl2\", options);\n        if (gl) {\n            const OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n            const EXT_color_buffer_float = gl.getExtension(\"EXT_color_buffer_float\");\n            if (OES_texture_float_linear && EXT_color_buffer_float && gl.MAX_DRAW_BUFFERS > 3) {\n                const texture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(gl, 1, 1, gl.RGBA, gl.FLOAT, gl.LINEAR, null, gl.RGBA32F);\n                const framebuffer = gl.createFramebuffer();\n                gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n                const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n                if (status == gl.FRAMEBUFFER_COMPLETE) supported = true;\n                gl.bindTexture(gl.TEXTURE_2D, null);\n            }\n        }\n        return supported ? gl : null;\n    }\n    prepare() {\n        let viewport;\n        switch(this._core.config.stereoMode){\n            case (0, $4a6417d29706362f$export$ec20dfa68810b176).none:\n                viewport = this._viewports[0];\n                viewport.x = 0;\n                viewport.y = 0;\n                viewport.width = this._canvas.width;\n                viewport.height = this._canvas.height;\n                this._viewportOffset = 0;\n                this._viewportCount = 1;\n                break;\n            case (0, $4a6417d29706362f$export$ec20dfa68810b176).left:\n                viewport = this._viewports[0];\n                viewport.x = 0;\n                viewport.y = 0;\n                viewport.width = this._canvas.width;\n                viewport.height = this._canvas.height;\n                this._viewportOffset = 0;\n                this._viewportCount = 1;\n                break;\n            case (0, $4a6417d29706362f$export$ec20dfa68810b176).right:\n                viewport = this._viewports[1];\n                viewport.x = 0;\n                viewport.y = 0;\n                viewport.width = this._canvas.width;\n                viewport.height = this._canvas.height;\n                this._viewportOffset = 1;\n                this._viewportCount = 1;\n                break;\n        }\n    }\n    createTransitionBuffer(ids) {\n        const buffer = new (0, $5c168c6596bfbd28$export$76de936b3c1c4170)(this._core, ids);\n        buffer.initializeContext(this._gl);\n        return buffer;\n    }\n    createCartesian2dAxesVisual(axes) {\n        const visual = new (0, $e9fa83a8cf03e87c$export$30e3ee7ba3e49080)(this._core, this, axes);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n        const visual = new (0, $e3e392e891911753$export$3dc3b91df297f2ee)(this._core, this, axes);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    _createLabelVisual(label) {\n        return new (0, $de477c17b1036dd4$export$71c7fa1581020e2c)(this._core, this, label);\n    }\n    createLabelSetVisual(labelSet) {\n        const visual = new (0, $de477c17b1036dd4$export$97e93e7019ef67b9)(this._core, this, labelSet);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    createImageVisual(image) {\n        const visual = new (0, $8a9611d4c44522de$export$6f251cd327b2ff1)(this._core, this, image);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    createFontVisual(font) {\n        const visual = new (0, $24cf6d98e6e0d82f$export$e784a6eab4d2d700)(this._core, font);\n        visual.initializeContext(this._gl);\n        return visual;\n    }\n    getDataUrl(mimeType) {\n        return this._canvas.toDataURL(mimeType);\n    }\n    update(elapsedTime) {\n        super.update(elapsedTime);\n        if (this._shadowWidth != this._config.shadowWidth || this._shadowHeight != this._config.shadowHeight) {\n            this._shadowWidth = this._config.shadowWidth;\n            this._shadowHeight = this._config.shadowHeight;\n            this._shadowColorTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n            this._shadowDepthTexture = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n            this._shadowFrameBuffer = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._shadowFrameBuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._shadowColorTexture, 0);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._shadowDepthTexture, 0);\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `shadow map resized ${this._shadowWidth},${this._shadowHeight}`);\n        }\n        if (this._ssaoWidth != this._config.ssaoWidth || this._ssaoHeight != this._config.ssaoHeight) {\n            this._ssaoWidth = this._config.ssaoWidth;\n            this._ssaoHeight = this._config.ssaoHeight;\n            this._ssaoTexture1 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n            this._ssaoFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture1, 0);\n            this._ssaoTexture2 = (0, $a25f5529f6cda489$export$c41e4fcbf45db179).create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n            this._ssaoFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture2, 0);\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `ssao map resized ${this._ssaoWidth},${this._ssaoHeight}`);\n        }\n        if (this._config.isDofEnabled && this._config.dofAutoFocus) {\n            this._core.getModelManipulationOrigin(this._modelManipulationOrigin);\n            this._core.getModelPosition(this._modelPosition);\n            (0, $31054a6c69637582$exports).add(this._position, this._modelManipulationOrigin, this._modelPosition);\n            this._core.camera.getPosition(this._cameraPosition);\n            (0, $31054a6c69637582$exports).subtract(this._position, this._position, this._cameraPosition);\n            const distance = -this._position[2];\n            const amount = Math.min(elapsedTime * this._core.config.focusSmoothing, 1);\n            this._config.dofFocusDistance = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).lerp(this._config.dofFocusDistance, distance, amount);\n        }\n    }\n    render(elapsedTime) {\n        return $8e6261810f478ee0$var$__awaiter(this, void 0, void 0, function*() {\n            this._gl.enable(this._gl.DEPTH_TEST);\n            this._gl.enable(this._gl.CULL_FACE);\n            this._gl.cullFace(this._gl.BACK);\n            this._gl.disable(this._gl.BLEND);\n            if (this.isPickingEnabled) {\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.clearColor(0, 0, 0, 0);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n            }\n            this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n            const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n            this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1);\n            this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT | this._gl.STENCIL_BUFFER_BIT);\n            if (this.config.isShadowEnabled) {\n                this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                this._gl.clear(this._gl.DEPTH_BUFFER_BIT);\n                (0, $1ac1b59392edf35b$exports).perspective(this._shadowPMatrix, (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(30), this._config.shadowWidth / this._config.shadowHeight, this._core.config.nearPlane, this._core.config.farPlane);\n                (0, $31054a6c69637582$exports).set(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                (0, $ba3ca37806a2b6fa$exports).fromMat4(this._cameraRotation, this.inverseVMatrices[0]);\n                (0, $31054a6c69637582$exports).transformMat3(this._position, this._config.keyLightPosition, this._cameraRotation);\n                (0, $31054a6c69637582$exports).add(this._position, this._position, this._modelPosition);\n                (0, $1ac1b59392edf35b$exports).lookAt(this._shadowVMatrix, this._position, this._modelPosition, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY);\n            }\n            for(let i = 0; i < this.transitionBuffers.length; i++){\n                const transitionBuffer = this.transitionBuffers[i];\n                if (transitionBuffer.isVisible) this._renderTransitionBuffer(transitionBuffer);\n            }\n            const axesVisuals = this.axesVisibility == (0, $4a6417d29706362f$export$7dbc7c2b82487e42).current ? this.currentAxes : this.axesVisibility == (0, $4a6417d29706362f$export$7dbc7c2b82487e42).previous ? this.previousAxes : null;\n            if (axesVisuals) for(let i = 0; i < axesVisuals.length; i++){\n                const axesVisual = axesVisuals[i];\n                if (axesVisual.isVisible) {\n                    axesVisual.pickedIdColor = this._pickedIdColor;\n                    axesVisual.pickFramebuffer = this._pickFrameBuffer;\n                    axesVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                    axesVisual.render(elapsedTime);\n                }\n            }\n            if (this.areLabelsVisible) for(let i = 0; i < this.labelSets.length; i++){\n                const labelSetVisual = this.labelSets[i];\n                if (labelSetVisual.isVisible) {\n                    labelSetVisual.pickedIdColor = this._pickedIdColor;\n                    labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n                    labelSetVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                    labelSetVisual.render(elapsedTime);\n                }\n            }\n            if (this.areImagesVisible) for(let i = 0; i < this.images.length; i++){\n                const imageVisual = this.images[i];\n                if (imageVisual.isVisible) {\n                    imageVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                    imageVisual.render(elapsedTime);\n                }\n            }\n            if (this._backgroundShader.isInitialized) {\n                this._backgroundShader.prepare();\n                this._backgroundShader.color = (0, $31054a6c69637582$exports).fromValues(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n                this._backgroundShader.apply();\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for(let i = 0; i < this._viewportCount; i++){\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                this._gl.bindVertexArray(null);\n            }\n            if (this.isPickingEnabled) {\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n                this._pickedType = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).decodeType(this._pickedPixels);\n                (0, $4c4ac78b213a9c07$exports).set(this._pickedIdColor, this._pickedPixels[0] / 0xff, this._pickedPixels[1] / 0xff, this._pickedPixels[2] / 0xff, this._pickedPixels[3] / 0xff);\n                this._pickedId = (0, $a60d0d861ccf87e8$export$aadd933e49c67c12).decodeNumber(this._pickedPixels);\n            } else {\n                (0, $4c4ac78b213a9c07$exports).set(this._pickedIdColor, 0, 0, 0, 0);\n                this._pickedId = 0;\n            }\n            if (this.transitionBuffers.length > 0 && this._quad.isInitialized) {\n                const viewport = this._viewportOffset;\n                this._postProcess(this.vMatrices[viewport], this.inverseVMatrices[viewport], this.pMatrices[viewport], this._viewports[viewport]);\n            }\n            if (this.isLassoPicking && this._lassoShader.isInitialized) {\n                this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n                this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n                const lassoWidth = this.lassoX1 - this.lassoX0;\n                const lassoHeight = this.lassoY1 - this.lassoY0;\n                this._lassoShader.prepare();\n                this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n                this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n                this._lassoShader.apply();\n                const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n                for(let i = 0; i < this._viewportCount; i++){\n                    const viewportIndex = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n                    const viewport = this._viewports[viewportIndex];\n                    this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n                    this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n                    this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n                    this._lassoMMatrix[10] = 1;\n                    this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n                    this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n                    this._lassoShader.mMatrix = this._lassoMMatrix;\n                    (0, $91b0cc4981465964$exports).set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n                    this._lassoShader.thickness = this._lassoThickness;\n                    this._lassoShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        });\n    }\n    _renderTransitionBuffer(transitionBuffer) {\n        const currentBuffer = transitionBuffer.currentBuffer;\n        const previousBuffer = transitionBuffer.previousBuffer;\n        const currentPalette = transitionBuffer.currentPalette;\n        const previousPalette = transitionBuffer.previousPalette;\n        const currentAtlas = transitionBuffer.currentAtlas;\n        const previousAtlas = transitionBuffer.previousAtlas;\n        const unitType = transitionBuffer.unitType === undefined ? currentBuffer.unitType : transitionBuffer.unitType;\n        const id = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n        const hoverId = id > -1 ? (0, $0a0587bd8b0d58e8$export$849e31d725692576).getIdHover(currentBuffer.dataView, id) : -1;\n        const activeId = transitionBuffer.activeId;\n        if (this._blockShader.isInitialized && (unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).block || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).blockSdf)) {\n            this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._blockShader.prepare();\n            this._blockShader.mMatrix = this.mMatrix;\n            this._blockShader.time = this.transitionTime;\n            this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._blockShader.rangeMin = currentBuffer.from;\n            this._blockShader.rangeMax = currentBuffer.to;\n            this._blockShader.hover = hoverId;\n            this._blockShader.active = activeId;\n            this._blockShader.specularPower = this._config.specularPower;\n            this._blockShader.specularIntensity = this._config.specularIntensity;\n            this._blockShader.apply();\n            this._blockShader.isPickShader = false;\n            this._blockShader.isShadowMap = false;\n            this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                this._blockShader.vMatrix = this.vMatrices[viewport];\n                this._blockShader.pMatrix = this.pMatrices[viewport];\n                this._blockShader.applyView();\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this._config.isShadowEnabled) {\n                this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                this._gl.cullFace(this._gl.FRONT);\n                this._blockShader.isPickShader = false;\n                this._blockShader.isShadowMap = true;\n                this._blockShader.vMatrix = this._shadowVMatrix;\n                this._blockShader.pMatrix = this._shadowPMatrix;\n                this._blockShader.applyView();\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                this._gl.colorMask(true, true, true, true);\n                this._gl.cullFace(this._gl.BACK);\n            }\n            if (this.isPickingEnabled) {\n                this._blockShader.isPickShader = true;\n                this._blockShader.isShadowMap = false;\n                this._blockShader.pMatrix = this.pickPMatrix;\n                this._blockShader.vMatrix = this.pickVMatrix;\n                this._blockShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        } else if (this._sphereShader.isInitialized && (unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).sphere || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).sphereSdf)) {\n            this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._sphereShader.prepare();\n            this._sphereShader.mMatrix = this.mMatrix;\n            this._sphereShader.time = this.transitionTime;\n            this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._sphereShader.rangeMin = currentBuffer.from;\n            this._sphereShader.rangeMax = currentBuffer.to;\n            this._sphereShader.hover = hoverId;\n            this._sphereShader.active = activeId;\n            this._sphereShader.specularPower = this._config.specularPower;\n            this._sphereShader.specularIntensity = this._config.specularIntensity;\n            this._sphereShader.apply();\n            this._sphereShader.isPickShader = false;\n            this._sphereShader.isShadowMap = false;\n            this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                this._sphereShader.vMatrix = this.vMatrices[viewport];\n                this._sphereShader.pMatrix = this.pMatrices[viewport];\n                this._sphereShader.applyView();\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this._config.isShadowEnabled) {\n                this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                this._sphereShader.isPickShader = false;\n                this._sphereShader.isShadowMap = true;\n                this._sphereShader.vMatrix = this._shadowVMatrix;\n                this._sphereShader.pMatrix = this._shadowPMatrix;\n                this._sphereShader.applyView();\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                this._gl.colorMask(true, true, true, true);\n            }\n            if (this.isPickingEnabled) {\n                this._sphereShader.isPickShader = true;\n                this._sphereShader.isShadowMap = false;\n                this._sphereShader.pMatrix = this.pickPMatrix;\n                this._sphereShader.vMatrix = this.pickVMatrix;\n                this._sphereShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        } else if (this._cylinderShader.isInitialized && (unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinder || unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinderSdf)) {\n            this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._cylinderShader.prepare();\n            this._cylinderShader.mMatrix = this.mMatrix;\n            this._cylinderShader.time = this.transitionTime;\n            this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._cylinderShader.rangeMin = currentBuffer.from;\n            this._cylinderShader.rangeMax = currentBuffer.to;\n            this._cylinderShader.hover = hoverId;\n            this._cylinderShader.active = activeId;\n            this._cylinderShader.specularPower = this._config.specularPower;\n            this._cylinderShader.specularIntensity = this._config.specularIntensity;\n            this._cylinderShader.apply();\n            this._cylinderShader.isPickShader = false;\n            this._cylinderShader.isShadowMap = false;\n            this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                this._cylinderShader.vMatrix = this.vMatrices[viewport];\n                this._cylinderShader.pMatrix = this.pMatrices[viewport];\n                this._cylinderShader.applyView();\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this._config.isShadowEnabled) {\n                this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                this._cylinderShader.isPickShader = false;\n                this._cylinderShader.isShadowMap = true;\n                this._cylinderShader.vMatrix = this._shadowVMatrix;\n                this._cylinderShader.pMatrix = this._shadowPMatrix;\n                this._cylinderShader.applyView();\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                this._gl.colorMask(true, true, true, true);\n            }\n            if (this.isPickingEnabled) {\n                this._cylinderShader.isPickShader = true;\n                this._cylinderShader.isShadowMap = false;\n                this._cylinderShader.pMatrix = this.pickPMatrix;\n                this._cylinderShader.vMatrix = this.pickVMatrix;\n                this._cylinderShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        } else if (this._sdfShader.isInitialized && unitType == (0, $4a6417d29706362f$export$80d48287646c9e3b).sdf) {\n            this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n            this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n            this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n            this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n            this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n            this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n            this._sdfShader.prepare();\n            this._sdfShader.mMatrix = this.mMatrix;\n            this._sdfShader.time = this.transitionTime;\n            this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n            this._sdfShader.rangeMin = currentBuffer.from;\n            this._sdfShader.rangeMax = currentBuffer.to;\n            this._sdfShader.hover = hoverId;\n            this._sdfShader.active = activeId;\n            this._sdfShader.specularPower = this._config.specularPower;\n            this._sdfShader.specularIntensity = this._config.specularIntensity;\n            this._sdfShader.apply();\n            this._sdfShader.isPickShader = false;\n            this._sdfShader.isShadowMap = false;\n            this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n            for(let i = 0; i < this._viewportCount; i++){\n                const viewport = i + this._viewportOffset;\n                this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                this._sdfShader.vMatrix = this.vMatrices[viewport];\n                this._sdfShader.pMatrix = this.pMatrices[viewport];\n                this._sdfShader.applyView();\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n            if (this._config.isShadowEnabled) {\n                this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                this._gl.cullFace(this._gl.FRONT);\n                this._sdfShader.isPickShader = false;\n                this._sdfShader.isShadowMap = true;\n                this._sdfShader.vMatrix = this._shadowVMatrix;\n                this._sdfShader.pMatrix = this._shadowPMatrix;\n                this._sdfShader.applyView();\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                this._gl.colorMask(true, true, true, true);\n                this._gl.cullFace(this._gl.BACK);\n            }\n            if (this.isPickingEnabled) {\n                this._sdfShader.isPickShader = true;\n                this._sdfShader.isShadowMap = false;\n                this._sdfShader.pMatrix = this.pickPMatrix;\n                this._sdfShader.vMatrix = this.pickVMatrix;\n                this._sdfShader.applyView();\n                this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n            }\n        }\n    }\n    _postProcess(vMatrix, inverseVMatrix, pMatrix, viewport) {\n        if (this._deferredShader.isInitialized) {\n            this._gl.disable(this._gl.DEPTH_TEST);\n            let ssaoTexture;\n            if (this._config.isSsaoEnabled && this._ssaoShader.isInitialized) {\n                this._gl.viewport(0, 0, this._config.ssaoWidth, this._config.ssaoHeight);\n                ssaoTexture = this._ssaoTexture1;\n                this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer1);\n                this._ssaoShader.vertexBuffer = this._quad.vertexBuffer;\n                this._ssaoShader.indexBuffer = this._quad.indexBuffer;\n                this._ssaoShader.texture2D1 = this._positionTexture;\n                this._ssaoShader.texture2D2 = this._normalTexture;\n                this._ssaoShader.texture2D3 = this._ssaoNoiseTexture;\n                this._ssaoShader.prepare();\n                this._ssaoShader.pMatrix = pMatrix;\n                this._ssaoShader.ssaoNoiseSize = this._config.ssaoNoiseSize;\n                this._ssaoShader.ssaoRadius = this._config.ssaoRadius;\n                this._ssaoShader.ssaoPower = this._config.ssaoPower;\n                this._ssaoShader.ssaoKernel = this._ssaoSampleKernel;\n                this._ssaoShader.left = 0;\n                this._ssaoShader.top = 0;\n                this._ssaoShader.width = this._config.ssaoWidth;\n                this._ssaoShader.height = this._config.ssaoHeight;\n                this._ssaoShader.apply();\n                this._ssaoShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                if (this._config.ssaoBlurEnabled && this._boxShader.isInitialized) {\n                    ssaoTexture = this._ssaoTexture2;\n                    this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer2);\n                    this._boxShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._boxShader.indexBuffer = this._quad.indexBuffer;\n                    this._boxShader.texture2D = this._ssaoTexture1;\n                    this._boxShader.prepare();\n                    this._boxShader.left = 0;\n                    this._boxShader.top = 0;\n                    this._boxShader.width = this._config.ssaoWidth;\n                    this._boxShader.height = this._config.ssaoHeight;\n                    this._boxShader.apply();\n                    this._boxShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n            this._gl.viewport(viewport.left, viewport.top, viewport.width, viewport.height);\n            let postProcessFrameBuffer = this._postProcessFrameBuffer1;\n            this._shaderResources.bindFramebuffer(postProcessFrameBuffer);\n            this._deferredShader.vertexBuffer = this._quad.vertexBuffer;\n            this._deferredShader.indexBuffer = this._quad.indexBuffer;\n            this._deferredShader.texture2D1 = this._positionTexture;\n            this._deferredShader.texture2D2 = this._colorTexture;\n            this._deferredShader.texture2D3 = this._normalTexture;\n            this._deferredShader.texture2D4 = this._config.isSsaoEnabled ? ssaoTexture : null;\n            this._deferredShader.texture2D5 = this._shadowDepthTexture;\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n            this._deferredShader.prepare();\n            this._deferredShader.isShadowEnabled = this._config.isShadowEnabled;\n            this._deferredShader.isSsaoEnabled = this._config.isSsaoEnabled;\n            this._deferredShader.inverseVMatrix = inverseVMatrix;\n            this._deferredShader.shadowVMatrix = this._shadowVMatrix;\n            this._deferredShader.shadowPMatrix = this._shadowPMatrix;\n            this._deferredShader.vMatrix = vMatrix;\n            this._deferredShader.keyLightIntensity = this._config.keyLightIntensity;\n            this._deferredShader.fillLight1Intensity = this._config.fillLight1Intensity;\n            this._deferredShader.fillLight2Intensity = this._config.fillLight2Intensity;\n            this._core.camera.getPosition(this._cameraPosition);\n            (0, $ba3ca37806a2b6fa$exports).fromMat4(this._cameraRotation, vMatrix);\n            (0, $31054a6c69637582$exports).set(this._position, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            (0, $31054a6c69637582$exports).normalize(this._deferredShader.directionToKeyLight, this._config.keyLightPosition);\n            (0, $31054a6c69637582$exports).subtract(this._direction, this._cameraPosition, this._position);\n            (0, $31054a6c69637582$exports).normalize(this._direction, this._direction);\n            (0, $31054a6c69637582$exports).add(this._deferredShader.keyLightHalfAngle, this._direction, this._deferredShader.directionToKeyLight);\n            (0, $31054a6c69637582$exports).normalize(this._deferredShader.keyLightHalfAngle, this._deferredShader.keyLightHalfAngle);\n            (0, $31054a6c69637582$exports).copy(this._deferredShader.directionToFillLight1, this._config.fillLight1Position);\n            (0, $31054a6c69637582$exports).copy(this._deferredShader.directionToFillLight2, this._config.fillLight2Position);\n            this._deferredShader.left = viewport.left;\n            this._deferredShader.top = viewport.top;\n            this._deferredShader.width = viewport.width;\n            this._deferredShader.height = viewport.height;\n            this._deferredShader.shadowMapWidth = this._config.shadowWidth;\n            this._deferredShader.shadowMapHeight = this._config.shadowHeight;\n            this._deferredShader.ambientIntensity = this._config.ambientIntensity;\n            this._deferredShader.materialIntensity = this._config.materialIntensity;\n            this._deferredShader.specularPower = this._config.specularPower;\n            this._deferredShader.specularIntensity = this._config.specularIntensity;\n            this._deferredShader.apply();\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            const widthHalf = Math.round(viewport.width / 2);\n            const heightHalf = Math.round(viewport.height / 2);\n            const widthQuarter = Math.round(widthHalf / 2);\n            const heightQuarter = Math.round(heightHalf / 2);\n            const widthEighth = Math.round(widthQuarter / 2);\n            const heightEighth = Math.round(heightQuarter / 2);\n            const widthSixteenth = Math.round(widthEighth / 2);\n            const heightSixteenth = Math.round(heightEighth / 2);\n            if (this._config.isDofEnabled && this._dofBlurShader.isInitialized && this._dofCombineShader.isInitialized) {\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n                this._dofBlurShader.vertexBuffer = this._quad.vertexBuffer;\n                this._dofBlurShader.indexBuffer = this._quad.indexBuffer;\n                this._dofBlurShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                this._dofBlurShader.texture2D2 = this._positionTexture;\n                this._dofBlurShader.prepare();\n                this._dofBlurShader.focusDepth = this._config.dofFocusDistance;\n                this._dofBlurShader.nearFocusDepth = this._config.dofFocusDistance - this._config.dofFocusRange / 2;\n                this._dofBlurShader.farFocusDepth = this._config.dofFocusDistance + this._config.dofFocusRange / 2;\n                this._dofBlurShader.maxBackgroundBlur = this._config.dofMaxBackgroundBlur;\n                this._dofBlurShader.left = viewport.left;\n                this._dofBlurShader.top = viewport.top;\n                this._dofBlurShader.width = viewport.width;\n                this._dofBlurShader.height = viewport.height;\n                this._dofBlurShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n                this._dofCombineShader.vertexBuffer = this._quad.vertexBuffer;\n                this._dofCombineShader.indexBuffer = this._quad.indexBuffer;\n                this._dofCombineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                this._dofCombineShader.texture2D2 = this._postProcessDofTexture;\n                this._dofCombineShader.prepare();\n                this._dofCombineShader.focusDepth = this._config.dofFocusDistance;\n                this._dofCombineShader.left = viewport.left;\n                this._dofCombineShader.top = viewport.top;\n                this._dofCombineShader.width = viewport.width;\n                this._dofCombineShader.height = viewport.height;\n                this._dofCombineShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n            if (this._config.isBloomEnabled && this._brightPassShader.isInitialized && this._gaussianShader.isInitialized) {\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n                this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                this._brightPassShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n                this._brightPassShader.prepare();\n                this._brightPassShader.width = widthHalf;\n                this._brightPassShader.height = heightHalf;\n                this._brightPassShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n                this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                this._brightPassShader.texture2D = this._postProcessHalfTexture1;\n                this._brightPassShader.prepare();\n                this._brightPassShader.width = widthQuarter;\n                this._brightPassShader.height = heightQuarter;\n                this._brightPassShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n                this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                this._brightPassShader.texture2D = this._postProcessQuarterTexture1;\n                this._brightPassShader.prepare();\n                this._brightPassShader.width = widthEighth;\n                this._brightPassShader.height = heightEighth;\n                this._brightPassShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n                this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                this._brightPassShader.texture2D = this._postProcessEighthTexture1;\n                this._brightPassShader.prepare();\n                this._brightPassShader.width = widthSixteenth;\n                this._brightPassShader.height = heightSixteenth;\n                this._brightPassShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n                this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                this._gaussianShader.texture2D = this._postProcessHalfTexture1;\n                this._gaussianShader.prepare();\n                this._gaussianShader.width = widthHalf;\n                this._gaussianShader.height = heightHalf;\n                this._gaussianShader.horizontal = true;\n                this._gaussianShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n                this._gaussianShader.texture2D = this._postProcessHalfTexture2;\n                this._gaussianShader.prepare();\n                this._gaussianShader.horizontal = false;\n                this._gaussianShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n                this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                this._gaussianShader.texture2D = this._postProcessQuarterTexture1;\n                this._gaussianShader.prepare();\n                this._gaussianShader.width = widthQuarter;\n                this._gaussianShader.height = heightQuarter;\n                this._gaussianShader.horizontal = true;\n                this._gaussianShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n                this._gaussianShader.texture2D = this._postProcessQuarterTexture2;\n                this._gaussianShader.prepare();\n                this._gaussianShader.horizontal = false;\n                this._gaussianShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n                this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                this._gaussianShader.texture2D = this._postProcessEighthTexture1;\n                this._gaussianShader.prepare();\n                this._gaussianShader.width = widthEighth;\n                this._gaussianShader.height = heightEighth;\n                this._gaussianShader.horizontal = true;\n                this._gaussianShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n                this._gaussianShader.texture2D = this._postProcessEighthTexture2;\n                this._gaussianShader.prepare();\n                this._gaussianShader.horizontal = false;\n                this._gaussianShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n                this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                this._gaussianShader.texture2D = this._postProcessSixteenthTexture1;\n                this._gaussianShader.prepare();\n                this._gaussianShader.width = widthSixteenth;\n                this._gaussianShader.height = heightSixteenth;\n                this._gaussianShader.horizontal = true;\n                this._gaussianShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n                this._gaussianShader.texture2D = this._postProcessSixteenthTexture2;\n                this._gaussianShader.prepare();\n                this._gaussianShader.horizontal = false;\n                this._gaussianShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n            if (this._config.isFxaaEnabled && this._fxaaShader.isInitialized) {\n                postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n                this._fxaaShader.vertexBuffer = this._quad.vertexBuffer;\n                this._fxaaShader.indexBuffer = this._quad.indexBuffer;\n                this._fxaaShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                this._fxaaShader.prepare();\n                this._fxaaShader.left = viewport.left;\n                this._fxaaShader.top = viewport.top;\n                this._fxaaShader.width = viewport.width;\n                this._fxaaShader.height = viewport.height;\n                this._fxaaShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n            this._shaderResources.bindFramebuffer(null);\n            this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._combineShader.vertexBuffer = this._quad.vertexBuffer;\n            this._combineShader.indexBuffer = this._quad.indexBuffer;\n            this._combineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n            if (this._config.isBloomEnabled) {\n                this._combineShader.texture2D2 = this._postProcessHalfTexture1;\n                this._combineShader.texture2D3 = this._postProcessQuarterTexture1;\n                this._combineShader.texture2D4 = this._postProcessEighthTexture1;\n                this._combineShader.texture2D5 = this._postProcessSixteenthTexture1;\n            } else {\n                this._combineShader.texture2D2 = null;\n                this._combineShader.texture2D3 = null;\n                this._combineShader.texture2D4 = null;\n                this._combineShader.texture2D5 = null;\n            }\n            this._combineShader.prepare();\n            this._combineShader.viewport = viewport;\n            this._combineShader.intensity = this._config.bloomIntensity;\n            this._combineShader.apply();\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n    }\n}\n\n\n\n\nvar $14a55defd301d57e$exports = {};\n\n$parcel$export($14a55defd301d57e$exports, \"Main\", () => $1d3eb987c5042c2f$export$861edd1ccea2f746);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $7aa9321c6c2cf59f$export$29cd7b75162a9425 extends (0, $a123db7d2af0bebc$export$ecd9923dfd29c8e1) {\n    constructor(){\n        super();\n        this.reset();\n    }\n}\n\n\n\nvar $1d3eb987c5042c2f$var$__awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nclass $1d3eb987c5042c2f$export$861edd1ccea2f746 extends (0, $a123db7d2af0bebc$export$30686c90897c890d) {\n    constructor(options){\n        super(options);\n        this._positions = new Float32Array([\n            -0.5,\n            0.5,\n            0.5,\n            0.5,\n            0.5,\n            0.5,\n            0.5,\n            -0.5,\n            0.5,\n            -0.5,\n            -0.5,\n            0.5,\n            -0.5,\n            0.5,\n            -0.5,\n            0.5,\n            0.5,\n            -0.5,\n            0.5,\n            -0.5,\n            -0.5,\n            -0.5,\n            -0.5,\n            -0.5\n        ]);\n        this._colors = new Float32Array([\n            0.0,\n            1.0,\n            1.0,\n            1.0,\n            1.0,\n            1.0,\n            1.0,\n            0.0,\n            1.0,\n            0.0,\n            0.0,\n            1.0,\n            0.0,\n            1.0,\n            0.0,\n            1.0,\n            1.0,\n            0.0,\n            1.0,\n            0.0,\n            0.0,\n            0.0,\n            0.0,\n            0.0\n        ]);\n        this._indices = new Uint16Array([\n            5,\n            4,\n            1,\n            0,\n            3,\n            4,\n            7,\n            5,\n            6,\n            1,\n            2,\n            3,\n            6,\n            7\n        ]);\n        this._vertShaderCode = `\n// Quaternion\nlet EPSILON: f32 = 0.000001;\n\nfn slerp(a: vec4<f32>, b: vec4<f32>, t: f32) -> vec4<f32> {\n    var c = b;\n    var cosom: f32 = dot(a, b);\n    if (cosom < 0.0) {\n        cosom = -cosom;\n        c = -c;\n    }\n    var scale0: f32;\n    var scale1: f32;\n    if (1.0 - cosom > EPSILON) {\n        // Standard case (slerp)\n        let omega: f32 = acos(cosom);\n        let sinom: f32 = sin(omega);\n        scale0 = sin((1.0 - t) * omega) / sinom;\n        scale1 = sin(t * omega) / sinom;\n    }\n    else {\n        // \"From\" and \"to\" quaternions are very close so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n    }\n    return vec4<f32>(scale0 * a + scale1 * c);\n}\n\nfn rotate(p: vec3<f32>, q: vec4<f32>) -> vec3<f32> {\n\treturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\n}\n\nstruct VSOut {\n    @builtin(position) Position: vec4<f32>,\n    @location(0) color: vec3<f32>,\n}\n\nstruct Uniforms {\n    modelViewProj: mat4x4<f32>,\n}\n\nstruct Instance {\n    position : vec3<f32>,\n    size : vec3<f32>,\n    color : vec3<f32>,\n    rotation : vec4<f32>,\n}\n\n@group(0) @binding(0) var<uniform> uniforms : Uniforms;\n\n@group(0) @binding(1) var<storage, read> instances : array<Instance>;\n\n@stage(vertex)\nfn main(\n    @builtin(instance_index) instanceIdx: u32,\n    @location(0)             inPos:       vec3<f32>,\n    @location(1)             inColor:     vec3<f32>) -> VSOut {\n    var vsOut: VSOut;\n    \n    let instance = instances[instanceIdx];\n\n    // Size\n    var position = inPos * instance.size;\n\n    // Slerp, rotate\n    if (instance.rotation.w != 1.0) {\n        position = rotate(position, instance.rotation);\n    }\n\n    // Position\n    position = position + instance.position;\n\n    vsOut.Position = uniforms.modelViewProj * vec4<f32>(position, 1.0);\n\n    vsOut.color = inColor;\n    return vsOut;\n}`;\n        this._fragShaderCode = `\n@stage(fragment)\nfn main(\n    @location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {\n        return vec4<f32>(inColor, 1.0);\n}`;\n        (0, $14f38b7dd89457d7$exports).setMatrixArrayType(Float32Array);\n        this._config = new (0, $7aa9321c6c2cf59f$export$29cd7b75162a9425)();\n        this._mvpMatrix = (0, $1ac1b59392edf35b$exports).create();\n    }\n    initialize(core) {\n        super.initialize(core);\n        this._initializeAPI().then(()=>{\n            this._initializeResources().then(()=>{\n                this._resizeBackings();\n                this._isInitialized = true;\n            });\n        });\n    }\n    get isSupported() {\n        return navigator.gpu !== undefined;\n    }\n    _initializeAPI() {\n        return $1d3eb987c5042c2f$var$__awaiter(this, void 0, void 0, function*() {\n            try {\n                const gpu = navigator.gpu;\n                this._adapter = yield gpu.requestAdapter();\n                this._device = yield this._adapter.requestDevice();\n                this._queue = this._device.queue;\n                this._context = this._canvas.getContext(\"webgpu\");\n            } catch (e) {\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).error, e);\n                return false;\n            }\n            return true;\n        });\n    }\n    _initializeResources() {\n        return $1d3eb987c5042c2f$var$__awaiter(this, void 0, void 0, function*() {\n            const canvasConfig = {\n                device: this._device,\n                format: \"bgra8unorm\",\n                alphaMode: \"opaque\"\n            };\n            this._context.configure(canvasConfig);\n            let bufferDescriptor;\n            bufferDescriptor = {\n                size: this._positions.byteLength,\n                usage: GPUBufferUsage.VERTEX,\n                mappedAtCreation: true\n            };\n            this._positionBuffer = this._device.createBuffer(bufferDescriptor);\n            new Float32Array(this._positionBuffer.getMappedRange()).set(this._positions);\n            this._positionBuffer.unmap();\n            bufferDescriptor = {\n                size: this._colors.byteLength,\n                usage: GPUBufferUsage.VERTEX,\n                mappedAtCreation: true\n            };\n            this._colorBuffer = this._device.createBuffer(bufferDescriptor);\n            new Float32Array(this._colorBuffer.getMappedRange()).set(this._colors);\n            this._colorBuffer.unmap();\n            bufferDescriptor = {\n                size: this._indices.byteLength + 3 & -4,\n                usage: GPUBufferUsage.INDEX,\n                mappedAtCreation: true\n            };\n            this._indexBuffer = this._device.createBuffer(bufferDescriptor);\n            new Uint16Array(this._indexBuffer.getMappedRange()).set(this._indices);\n            this._indexBuffer.unmap();\n            const vertexShaderDescriptor = {\n                code: this._vertShaderCode\n            };\n            this._vertModule = this._device.createShaderModule(vertexShaderDescriptor);\n            const fragmentShaderDescriptor = {\n                code: this._fragShaderCode\n            };\n            this._fragModule = this._device.createShaderModule(fragmentShaderDescriptor);\n            const positionAttribDesc = {\n                shaderLocation: 0,\n                offset: 0,\n                format: \"float32x3\"\n            };\n            const colorAttribDesc = {\n                shaderLocation: 1,\n                offset: 0,\n                format: \"float32x3\"\n            };\n            const positionBufferDesc = {\n                attributes: [\n                    positionAttribDesc\n                ],\n                arrayStride: 12,\n                stepMode: \"vertex\"\n            };\n            const colorBufferDesc = {\n                attributes: [\n                    colorAttribDesc\n                ],\n                arrayStride: 12,\n                stepMode: \"vertex\"\n            };\n            const depthStencil = {\n                depthWriteEnabled: true,\n                depthCompare: \"less\",\n                format: \"depth24plus-stencil8\"\n            };\n            const vertex = {\n                module: this._vertModule,\n                entryPoint: \"main\",\n                buffers: [\n                    positionBufferDesc,\n                    colorBufferDesc\n                ]\n            };\n            const colorState = {\n                format: \"bgra8unorm\"\n            };\n            const fragment = {\n                module: this._fragModule,\n                entryPoint: \"main\",\n                targets: [\n                    colorState\n                ]\n            };\n            const primitive = {\n                frontFace: \"cw\",\n                cullMode: \"none\",\n                topology: \"triangle-strip\",\n                stripIndexFormat: \"uint16\"\n            };\n            const renderPipelineDescriptor = {\n                vertex: vertex,\n                fragment: fragment,\n                primitive: primitive,\n                depthStencil: depthStencil,\n                layout: \"auto\"\n            };\n            this._renderPipeline = this._device.createRenderPipeline(renderPipelineDescriptor);\n            const uniformBufferSize1 = 64;\n            this._uniformBuffer = this._device.createBuffer({\n                size: uniformBufferSize1,\n                usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n            });\n            const stride = 16;\n            let instanceData;\n            if (this.transitionBuffers && this.transitionBuffers.length > 0) {\n                const buffer = this.transitionBuffers[0].currentBuffer;\n                this._instanceCount = buffer.length;\n                instanceData = new Float32Array(this._instanceCount * stride);\n                const position = (0, $31054a6c69637582$exports).create();\n                const size = (0, $31054a6c69637582$exports).create();\n                const color = (0, $91b0cc4981465964$exports).create();\n                const rotation = (0, $39ece26d1239bb77$exports).create();\n                const positionOffset = 0;\n                const sizeOffset = 4;\n                const colorOffset = 8;\n                const rotationOffset = 12;\n                for(let i = 0; i < buffer.length; i++){\n                    const offset = stride * i;\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTranslation(buffer.dataView, i, position);\n                    instanceData.set(position, offset + positionOffset);\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getScale(buffer.dataView, i, size);\n                    instanceData.set(size, offset + sizeOffset);\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getColor(buffer.dataView, i, color);\n                    instanceData.set(color, offset + colorOffset);\n                    (0, $0a0587bd8b0d58e8$export$849e31d725692576).getRotation(buffer.dataView, i, rotation);\n                    instanceData.set(rotation, offset + rotationOffset);\n                }\n            } else {\n                const side = 10;\n                this._instanceCount = side * side * side;\n                instanceData = new Float32Array(this._instanceCount * stride);\n                for(let i = 0; i < this._instanceCount; ++i){\n                    const offset = stride * i;\n                    instanceData[offset] = (i % side - side / 2) / side;\n                    instanceData[offset + 1] = (Math.floor(i / side) % side - side / 2) / side;\n                    instanceData[offset + 2] = (Math.floor(i / side / side) - side / 2) / side;\n                    instanceData[offset + 4] = 0.75 / side;\n                    instanceData[offset + 5] = 0.75 / side;\n                    instanceData[offset + 6] = 0.75 / side;\n                }\n            }\n            const instanceBuffer = this._device.createBuffer({\n                size: instanceData.byteLength,\n                usage: GPUBufferUsage.VERTEX | GPUBufferUsage.STORAGE,\n                mappedAtCreation: true\n            });\n            new Float32Array(instanceBuffer.getMappedRange()).set(instanceData);\n            instanceBuffer.unmap();\n            this._uniformBindGroup = this._device.createBindGroup({\n                layout: this._renderPipeline.getBindGroupLayout(0),\n                entries: [\n                    {\n                        binding: 0,\n                        resource: {\n                            buffer: this._uniformBuffer\n                        }\n                    },\n                    {\n                        binding: 1,\n                        resource: {\n                            buffer: instanceBuffer,\n                            offset: 0,\n                            size: instanceData.byteLength\n                        }\n                    }\n                ]\n            });\n            this._colorAttachment = {\n                view: undefined,\n                clearValue: {\n                    r: 0,\n                    g: 0,\n                    b: 0,\n                    a: 1\n                },\n                loadOp: \"clear\",\n                storeOp: \"store\"\n            };\n            this._depthAttachment = {\n                view: undefined,\n                depthClearValue: 1,\n                depthLoadOp: \"clear\",\n                depthStoreOp: \"store\",\n                stencilLoadOp: \"clear\",\n                stencilStoreOp: \"store\"\n            };\n            this._renderPassDescriptor = {\n                colorAttachments: [\n                    this._colorAttachment\n                ],\n                depthStencilAttachment: this._depthAttachment\n            };\n        });\n    }\n    _resizeBackings() {\n        const size = [\n            this.width,\n            this.height,\n            1\n        ];\n        const depthTextureDesc = {\n            size: size,\n            dimension: \"2d\",\n            format: \"depth24plus-stencil8\",\n            usage: GPUTextureUsage.RENDER_ATTACHMENT\n        };\n        this._depthTexture = this._device.createTexture(depthTextureDesc);\n        this._depthTextureView = this._depthTexture.createView();\n        this._renderPassDescriptor.depthStencilAttachment.view = this._depthTextureView;\n    }\n    _encodeCommands() {\n        this._renderPassDescriptor.colorAttachments[0].view = this._context.getCurrentTexture().createView();\n        const commandEncoder = this._device.createCommandEncoder();\n        const passEncoder = commandEncoder.beginRenderPass(this._renderPassDescriptor);\n        passEncoder.setPipeline(this._renderPipeline);\n        passEncoder.setViewport(0, 0, this._canvas.width, this._canvas.height, 0, 1);\n        passEncoder.setScissorRect(0, 0, this._canvas.width, this._canvas.height);\n        passEncoder.setVertexBuffer(0, this._positionBuffer);\n        passEncoder.setVertexBuffer(1, this._colorBuffer);\n        passEncoder.setIndexBuffer(this._indexBuffer, \"uint16\");\n        passEncoder.setBindGroup(0, this._uniformBindGroup);\n        passEncoder.drawIndexed(this._indices.length, this._instanceCount);\n        passEncoder.end();\n        const commands = commandEncoder.finish();\n        this._queue.submit([\n            commands\n        ]);\n    }\n    update(elapsedTime) {\n        (0, $1ac1b59392edf35b$exports).multiply(this._mvpMatrix, this.pMatrices[0], this.mvMatrices[0]);\n    }\n    render(elapsedTime) {\n        return $1d3eb987c5042c2f$var$__awaiter(this, void 0, void 0, function*() {\n            const mvpMatrix = this._mvpMatrix;\n            this._device.queue.writeBuffer(this._uniformBuffer, 0, mvpMatrix.buffer, mvpMatrix.byteOffset, mvpMatrix.byteLength);\n            this._encodeCommands();\n        });\n    }\n    _resize(width, height) {\n        super._resize(width, height);\n        if (this._isInitialized) {\n            this._resizeBackings();\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffers resized ${width},${height}`);\n        }\n    }\n}\n\n\n\n\nvar $9824374ee38ba7ca$exports = {};\n\n$parcel$export($9824374ee38ba7ca$exports, \"Main\", () => $d5ed11dd11fe7749$export$861edd1ccea2f746);\n$parcel$export($9824374ee38ba7ca$exports, \"MaterialType\", () => $62116d012d21b949$export$bd062416169c6728);\n$parcel$export($9824374ee38ba7ca$exports, \"Material\", () => $62116d012d21b949$export$a2d8b23205c25948);\n$parcel$export($9824374ee38ba7ca$exports, \"MetalMaterial\", () => $62116d012d21b949$export$bd17d4a4be11a968);\n$parcel$export($9824374ee38ba7ca$exports, \"GlossyMaterial\", () => $62116d012d21b949$export$5e39c2cd3ef82349);\n$parcel$export($9824374ee38ba7ca$exports, \"VarnishMaterial\", () => $62116d012d21b949$export$1af23049b2ba0aa3);\n$parcel$export($9824374ee38ba7ca$exports, \"LambertianMaterial\", () => $62116d012d21b949$export$61026b7fc8ee0236);\n$parcel$export($9824374ee38ba7ca$exports, \"DielectricMaterial\", () => $62116d012d21b949$export$9578dd56c4cc3fb4);\n$parcel$export($9824374ee38ba7ca$exports, \"DiffuseLightMaterial\", () => $62116d012d21b949$export$5ea5fb140816887a);\n$parcel$export($9824374ee38ba7ca$exports, \"IsotropicMaterial\", () => $62116d012d21b949$export$87cc275e72e16d48);\n$parcel$export($9824374ee38ba7ca$exports, \"Texture\", () => $6060da1e598714a9$export$5431306cf43de24a);\n$parcel$export($9824374ee38ba7ca$exports, \"SolidColorTexture\", () => $6060da1e598714a9$export$b696913510b740d6);\n$parcel$export($9824374ee38ba7ca$exports, \"ImageTexture\", () => $6060da1e598714a9$export$3ad126b3fdb68b5e);\n$parcel$export($9824374ee38ba7ca$exports, \"CheckerTexture\", () => $6060da1e598714a9$export$510d156fb224ecac);\n$parcel$export($9824374ee38ba7ca$exports, \"GridTexture\", () => $6060da1e598714a9$export$121882bab8adda73);\n$parcel$export($9824374ee38ba7ca$exports, \"Light\", () => $1596feb7c9451159$export$6ecadb6ed240d696);\n$parcel$export($9824374ee38ba7ca$exports, \"SphereLight\", () => $1596feb7c9451159$export$f6705b6c922d7219);\n$parcel$export($9824374ee38ba7ca$exports, \"RectLight\", () => $1596feb7c9451159$export$1f9284d52f5c21ca);\n$parcel$export($9824374ee38ba7ca$exports, \"Ground\", () => $6fc486c90d5a34f3$export$c6957adcf93c393f);\n$parcel$export($9824374ee38ba7ca$exports, \"Constants\", () => $ca7af8634961ee25$export$a002182e51710d39);\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ /*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nconst $62116d012d21b949$export$bd062416169c6728 = {\n    lambertian: 0,\n    metal: 1,\n    dielectric: 2,\n    glossy: 3,\n    diffuseLight: 4,\n    isotropic: 5,\n    varnish: 6\n};\nclass $62116d012d21b949$export$673ddcc6bf213111 extends Float32Array {\n    constructor(count){\n        super(count * $62116d012d21b949$export$673ddcc6bf213111.SIZE);\n        this.TYPE_OFFSET = 0;\n        this.FUZZ_OFFSET = 1;\n        this.REFRACTIVE_INDEX_OFFSET = 2;\n        this.TEXTURE_ID_OFFSET = 3;\n        this.COLOR_OFFSET = 4;\n        this.GLOSSINESS_OFFSET = 7;\n        this.ID_COLOR_OFFSET = 8;\n        this.DENSITY_OFFSET = 12;\n    }\n    getType(index) {\n        return this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.TYPE_OFFSET];\n    }\n    setType(index, value) {\n        this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.TYPE_OFFSET] = value;\n    }\n    getFuzz(index) {\n        return this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.FUZZ_OFFSET];\n    }\n    setFuzz(index, value) {\n        this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.FUZZ_OFFSET] = value;\n    }\n    getRefractiveIndex(index) {\n        return this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.REFRACTIVE_INDEX_OFFSET];\n    }\n    setRefractiveIndex(index, value) {\n        this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.REFRACTIVE_INDEX_OFFSET] = value;\n    }\n    getTextureId(index) {\n        return this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.TEXTURE_ID_OFFSET];\n    }\n    setTextureId(index, value) {\n        this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.TEXTURE_ID_OFFSET] = value;\n    }\n    getColor(index, value) {\n        const offset = $62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.COLOR_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setColor(index, value) {\n        const offset = $62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.COLOR_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getGlossiness(index) {\n        return this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.GLOSSINESS_OFFSET];\n    }\n    setGlossiness(index, value) {\n        this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.GLOSSINESS_OFFSET] = value;\n    }\n    getDensity(index) {\n        return this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.DENSITY_OFFSET];\n    }\n    setDensity(index, value) {\n        this[$62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.DENSITY_OFFSET] = value;\n    }\n    getIdColor(index, value) {\n        const offset = $62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.ID_COLOR_OFFSET;\n        (0, $4c4ac78b213a9c07$exports).set(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n    }\n    setIdColor(index, value) {\n        const offset = $62116d012d21b949$export$673ddcc6bf213111.SIZE * index + this.ID_COLOR_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n        this[offset + 3] = value[3];\n    }\n}\n$62116d012d21b949$export$673ddcc6bf213111.SIZE = 16;\nclass $62116d012d21b949$export$a2d8b23205c25948 {\n    get texture() {\n        return this._texture;\n    }\n    get idColor() {\n        return this._idColor;\n    }\n    constructor(options){\n        this._idColor = (options === null || options === void 0 ? void 0 : options.idColor) || (0, $4c4ac78b213a9c07$exports).fromValues(0, 0, 0, 0);\n    }\n    toBuffer(buffer, index, textureId) {}\n}\nclass $62116d012d21b949$export$61026b7fc8ee0236 extends $62116d012d21b949$export$a2d8b23205c25948 {\n    constructor(options){\n        super(options);\n        this._texture = options.texture;\n    }\n    toBuffer(buffer, index, textureId) {\n        buffer.setType(index, $62116d012d21b949$export$bd062416169c6728.lambertian);\n        buffer.setIdColor(index, this.idColor);\n        buffer.setTextureId(index, textureId);\n    }\n}\nclass $62116d012d21b949$export$bd17d4a4be11a968 extends $62116d012d21b949$export$a2d8b23205c25948 {\n    constructor(options){\n        super(options);\n        this.fuzz = options.fuzz !== undefined ? options.fuzz : 0;\n        this._texture = options.texture;\n    }\n    toBuffer(buffer, index, textureId) {\n        buffer.setType(index, $62116d012d21b949$export$bd062416169c6728.metal);\n        buffer.setIdColor(index, this.idColor);\n        buffer.setFuzz(index, this.fuzz);\n        buffer.setTextureId(index, textureId);\n    }\n}\nclass $62116d012d21b949$export$9578dd56c4cc3fb4 extends $62116d012d21b949$export$a2d8b23205c25948 {\n    constructor(options){\n        super(options);\n        this.fuzz = options && options.fuzz !== undefined ? options.fuzz : 0;\n        this.refractiveIndex = options && options.refractiveIndex !== undefined ? options.refractiveIndex : 1.5;\n        this.glossiness = options && options.glossiness !== undefined ? options.glossiness : 1;\n        this.color = options && options.color || (0, $31054a6c69637582$exports).fromValues(1, 1, 1);\n        this.density = options && options.density !== undefined ? options.density : 1;\n    }\n    toBuffer(buffer, index, textureId) {\n        buffer.setType(index, $62116d012d21b949$export$bd062416169c6728.dielectric);\n        buffer.setIdColor(index, this.idColor);\n        buffer.setRefractiveIndex(index, this.refractiveIndex);\n        buffer.setFuzz(index, this.fuzz);\n        buffer.setGlossiness(index, this.glossiness);\n        buffer.setColor(index, (0, $31054a6c69637582$exports).fromValues(-Math.log(this.color[0]) * this.density, -Math.log(this.color[1]) * this.density, -Math.log(this.color[2]) * this.density));\n    }\n}\nclass $62116d012d21b949$export$5ea5fb140816887a extends $62116d012d21b949$export$a2d8b23205c25948 {\n    constructor(options){\n        super(options);\n        this.color = options && options.color || (0, $31054a6c69637582$exports).fromValues(1, 1, 1);\n    }\n    toBuffer(buffer, index, textureId) {\n        buffer.setType(index, $62116d012d21b949$export$bd062416169c6728.diffuseLight);\n        buffer.setIdColor(index, this.idColor);\n        buffer.setColor(index, this.color);\n    }\n}\nclass $62116d012d21b949$export$5e39c2cd3ef82349 extends $62116d012d21b949$export$a2d8b23205c25948 {\n    constructor(options){\n        super(options);\n        this._texture = options.texture;\n        this.fuzz = options.fuzz !== undefined ? options.fuzz : 0;\n        this.refractiveIndex = options.refractiveIndex !== undefined ? options.refractiveIndex : 1.5;\n        this.glossiness = options.glossiness !== undefined ? options.glossiness : 1;\n    }\n    toBuffer(buffer, index, textureId) {\n        buffer.setType(index, $62116d012d21b949$export$bd062416169c6728.glossy);\n        buffer.setIdColor(index, this.idColor);\n        buffer.setFuzz(index, this.fuzz);\n        buffer.setGlossiness(index, this.glossiness);\n        buffer.setRefractiveIndex(index, this.refractiveIndex);\n        buffer.setTextureId(index, textureId);\n    }\n}\nclass $62116d012d21b949$export$87cc275e72e16d48 extends $62116d012d21b949$export$a2d8b23205c25948 {\n    constructor(options){\n        super(options);\n        this.density = options.density;\n        this.color = options.color;\n    }\n    toBuffer(buffer, index, textureId) {\n        buffer.setType(index, $62116d012d21b949$export$bd062416169c6728.isotropic);\n        buffer.setIdColor(index, this.idColor);\n        buffer.setDensity(index, this.density);\n        buffer.setColor(index, this.color);\n    }\n}\nclass $62116d012d21b949$export$1af23049b2ba0aa3 extends $62116d012d21b949$export$a2d8b23205c25948 {\n    constructor(options){\n        super(options);\n        this.fuzz = options && options.fuzz !== undefined ? options.fuzz : 0;\n        this.refractiveIndex = options && options.refractiveIndex !== undefined ? options.refractiveIndex : 1.5;\n        this.glossiness = options && options.glossiness !== undefined ? options.glossiness : 1;\n    }\n    toBuffer(buffer, index, textureId) {\n        buffer.setType(index, $62116d012d21b949$export$bd062416169c6728.varnish);\n        buffer.setIdColor(index, this.idColor);\n        buffer.setFuzz(index, this.fuzz);\n        buffer.setGlossiness(index, this.glossiness);\n        buffer.setRefractiveIndex(index, this.refractiveIndex);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nconst $6060da1e598714a9$export$8490d66844ef9609 = {\n    none: 0,\n    solidColor: 1,\n    image: 2,\n    sdfText: 3,\n    checker: 4,\n    grid: 5\n};\nclass $6060da1e598714a9$export$6aa93a36bc90f68e extends Float32Array {\n    constructor(count){\n        super(count * $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE);\n        this.COLOR0_OFFSET = 0;\n        this.TYPE_OFFSET = 3;\n        this.COLOR1_OFFSET = 4;\n        this.SIZE0_OFFSET = 8;\n        this.SIZE1_OFFSET = 12;\n        this.CLIP_OFFSET = 16;\n        this.OFFSET_OFFSET = 20;\n    }\n    getType(index) {\n        return this[$6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.TYPE_OFFSET];\n    }\n    setType(index, value) {\n        this[$6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.TYPE_OFFSET] = value;\n    }\n    getColor0(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.COLOR0_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setColor0(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.COLOR0_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getColor1(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.COLOR1_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setColor1(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.COLOR1_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getSize0(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.SIZE0_OFFSET;\n        (0, $4c4ac78b213a9c07$exports).set(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n    }\n    setSize0(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.SIZE0_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n        this[offset + 3] = value[3];\n    }\n    getSize1(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.SIZE1_OFFSET;\n        (0, $4c4ac78b213a9c07$exports).set(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n    }\n    setSize1(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.SIZE1_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n        this[offset + 3] = value[3];\n    }\n    getClip(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.CLIP_OFFSET;\n        (0, $4c4ac78b213a9c07$exports).set(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n    }\n    setClip(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.CLIP_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n        this[offset + 3] = value[3];\n    }\n    getOffset(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.OFFSET_OFFSET;\n        (0, $91b0cc4981465964$exports).set(value, this[offset], this[offset + 1]);\n    }\n    setOffset(index, value) {\n        const offset = $6060da1e598714a9$export$6aa93a36bc90f68e.SIZE * index + this.OFFSET_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n    }\n}\n$6060da1e598714a9$export$6aa93a36bc90f68e.SIZE = 24;\nclass $6060da1e598714a9$export$5431306cf43de24a {\n}\nclass $6060da1e598714a9$export$b696913510b740d6 extends $6060da1e598714a9$export$5431306cf43de24a {\n    constructor(options){\n        super();\n        this.color = options.color;\n        this.borderColor = options.borderColor || (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_ONE;\n        this._color = (0, $31054a6c69637582$exports).fromValues(Math.pow(this.color[0], 2.2), Math.pow(this.color[1], 2.2), Math.pow(this.color[2], 2.2));\n        this._borderColor = (0, $31054a6c69637582$exports).fromValues(Math.pow(this.borderColor[0], 2.2), Math.pow(this.borderColor[1], 2.2), Math.pow(this.borderColor[2], 2.2));\n    }\n    toBuffer(buffer, index) {\n        buffer.setType(index, $6060da1e598714a9$export$8490d66844ef9609.solidColor);\n        buffer.setColor0(index, this._color);\n        buffer.setColor1(index, this._borderColor);\n    }\n}\nclass $6060da1e598714a9$export$3ad126b3fdb68b5e extends $6060da1e598714a9$export$5431306cf43de24a {\n    constructor(options){\n        super();\n        this.image = options.image;\n    }\n    toBuffer(buffer, index) {\n        buffer.setType(index, $6060da1e598714a9$export$8490d66844ef9609.image);\n    }\n}\nclass $6060da1e598714a9$export$510d156fb224ecac extends $6060da1e598714a9$export$5431306cf43de24a {\n    constructor(options){\n        super();\n        this.color0 = options.color0;\n        this.color1 = options.color1;\n        this.size = options.size;\n        this.offset = options.offset || (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ZERO;\n        this._color0 = (0, $31054a6c69637582$exports).fromValues(Math.pow(this.color0[0], 2.2), Math.pow(this.color0[1], 2.2), Math.pow(this.color0[2], 2.2));\n        this._color1 = (0, $31054a6c69637582$exports).fromValues(Math.pow(this.color1[0], 2.2), Math.pow(this.color1[1], 2.2), Math.pow(this.color1[2], 2.2));\n    }\n    toBuffer(buffer, index) {\n        buffer.setType(index, $6060da1e598714a9$export$8490d66844ef9609.checker);\n        buffer.setColor0(index, this._color0);\n        buffer.setColor1(index, this._color1);\n        buffer.setSize0(index, (0, $4c4ac78b213a9c07$exports).fromValues(this.size[0], this.size[1], 0, 0));\n        buffer.setOffset(index, this.offset);\n    }\n}\nclass $6060da1e598714a9$export$121882bab8adda73 extends $6060da1e598714a9$export$5431306cf43de24a {\n    constructor(options){\n        super();\n        this.color0 = options.color0;\n        this.color1 = options.color1;\n        this.size = options.size;\n        this.minorSize = options.minorSize;\n        this.thickness = options.thickness;\n        this.minorThickness = options.minorThickness;\n        this.offset = options.offset || (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR2_ZERO;\n        this.clip = options.clip || (0, $4c4ac78b213a9c07$exports).fromValues(0, 0, 1, 1);\n        this._color0 = (0, $31054a6c69637582$exports).fromValues(Math.pow(this.color0[0], 2.2), Math.pow(this.color0[1], 2.2), Math.pow(this.color0[2], 2.2));\n        this._color1 = (0, $31054a6c69637582$exports).fromValues(Math.pow(this.color1[0], 2.2), Math.pow(this.color1[1], 2.2), Math.pow(this.color1[2], 2.2));\n    }\n    toBuffer(buffer, index) {\n        buffer.setType(index, $6060da1e598714a9$export$8490d66844ef9609.grid);\n        buffer.setColor0(index, this._color0);\n        buffer.setColor1(index, this._color1);\n        buffer.setSize0(index, (0, $4c4ac78b213a9c07$exports).fromValues(this.size[0], this.size[1], this.minorSize[0], this.minorSize[1]));\n        buffer.setSize1(index, (0, $4c4ac78b213a9c07$exports).fromValues(this.thickness[0], this.thickness[1], this.minorThickness[0], this.minorThickness[1]));\n        buffer.setOffset(index, this.offset);\n        buffer.setClip(index, this.clip);\n    }\n}\n\n\nclass $cdd30208cd147f64$export$29cd7b75162a9425 extends (0, $a123db7d2af0bebc$export$ecd9923dfd29c8e1) {\n    constructor(){\n        super();\n        this.reset();\n    }\n    standardLightingOptions(options) {\n        const azimuthOffset = options && options.azimuthOffset ? options.azimuthOffset : this.lightingAzimuthOffset;\n        const altitude = options && options.altitude ? options.altitude : this.lightingAltitude;\n        const size = options && options.size ? options.size : this.lightingSize;\n        const distance = options && options.distance ? options.distance : this.lightingDistance;\n        const azimuths = [\n            -45,\n            45,\n            -135\n        ];\n        const brightnesses = [\n            10,\n            1,\n            1\n        ];\n        const lights = [];\n        for(let i = 0; i < azimuths.length; i++)lights.push({\n            azimuth: azimuths[i] + azimuthOffset,\n            altitude: altitude,\n            distance: distance,\n            size: (0, $91b0cc4981465964$exports).fromValues(size, size),\n            yaw: azimuths[i] + azimuthOffset,\n            pitch: altitude,\n            color: (0, $31054a6c69637582$exports).fromValues(brightnesses[i], brightnesses[i], brightnesses[i])\n        });\n        return lights;\n    }\n    reset() {\n        this.aperture = 0;\n        this.focusDistance = 0;\n        this.exposure = 1;\n        this.maxSamplesPerPixel = 10000;\n        this.shutterSpeed = 0;\n        this.raysPerFrame = 1;\n        this.maxPrimsInNode = 1;\n        this.defaultMaterial = new (0, $62116d012d21b949$export$61026b7fc8ee0236)({\n            texture: new (0, $6060da1e598714a9$export$b696913510b740d6)({\n                color: (0, $31054a6c69637582$exports).fromValues(0.5, 0.5, 0.5)\n            })\n        });\n        this.defaultTextMaterial = new (0, $62116d012d21b949$export$61026b7fc8ee0236)({\n            texture: new (0, $6060da1e598714a9$export$b696913510b740d6)({\n                color: (0, $31054a6c69637582$exports).fromValues(1, 1, 1)\n            })\n        });\n        this.groundSize = (0, $91b0cc4981465964$exports).fromValues(10, 10);\n        this.maxLights = 12;\n        this.backgroundColor = (0, $4c4ac78b213a9c07$exports).fromValues(1, 1, 1, 1);\n        this.ambientColor = (0, $31054a6c69637582$exports).fromValues(1, 1, 1);\n        this.lightingAltitude = 30;\n        this.lightingSize = 0.5;\n        this.lightingDistance = 1.5;\n        this.lightingAzimuthOffset = 0;\n        this.lightingAltitudeOffset = 0;\n        this.lightingSizeOffset = 0;\n        this.lightingDistanceOffset = 0;\n        this.isDepthMultisampled = false;\n        this.isNormalMultisampled = false;\n        this.autoDepth = true;\n        this.minDepth = 1;\n        this.maxDepth = 10;\n        this.edgeDepth = 0.01;\n        this.edgeNormal = 0.025;\n        this.edgeForeground = (0, $4c4ac78b213a9c07$exports).fromValues(1, 1, 1, 1);\n        this.edgeBackground = (0, $4c4ac78b213a9c07$exports).fromValues(0, 0, 0, 1);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\nclass $f858a5fa67a435f5$export$8ec70f2db73b49aa {\n    get min() {\n        return this._min;\n    }\n    get max() {\n        return this._max;\n    }\n    constructor(){\n        this._min = (0, $31054a6c69637582$exports).fromValues(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n        this._max = (0, $31054a6c69637582$exports).fromValues(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n    }\n    centroid(centroid) {\n        centroid[0] = (this._min[0] + this._max[0]) / 2;\n        centroid[1] = (this._min[1] + this._max[1]) / 2;\n        centroid[2] = (this._min[2] + this._max[2]) / 2;\n    }\n    size(size) {\n        size[0] = this._max[0] - this._min[0];\n        size[1] = this._max[1] - this._min[1];\n        size[2] = this._max[2] - this._min[2];\n    }\n    offset(point, normalized) {\n        normalized[0] = (point[0] - this._min[0]) / (this._max[0] - this._min[0]);\n        normalized[1] = (point[1] - this._min[1]) / (this._max[1] - this._min[1]);\n        normalized[2] = (point[2] - this._min[2]) / (this._max[2] - this._min[2]);\n    }\n    unionBounds(bounds) {\n        (0, $31054a6c69637582$exports).min(this._min, this._min, bounds.min);\n        (0, $31054a6c69637582$exports).max(this._max, this._max, bounds.max);\n    }\n    unionPoint(point) {\n        (0, $31054a6c69637582$exports).min(this._min, this._min, point);\n        (0, $31054a6c69637582$exports).max(this._max, this._max, point);\n    }\n    maximumExtent() {\n        const dx = this._max[0] - this._min[0];\n        const dy = this._max[1] - this._min[1];\n        const dz = this._max[2] - this._min[2];\n        if (dx > dy && dx > dz) return 0;\n        else if (dy > dz) return 1;\n        return 2;\n    }\n    surfaceArea() {\n        const dx = this._max[0] - this._min[0];\n        const dy = this._max[1] - this._min[1];\n        const dz = this._max[2] - this._min[2];\n        return 2 * (dx * dy + dx * dz + dy * dz);\n    }\n    rotate(rotation) {\n        const sizeX = this._max[0] - this._min[0];\n        const sizeY = this._max[1] - this._min[1];\n        const sizeZ = this._max[2] - this._min[2];\n        const min = (0, $31054a6c69637582$exports).fromValues(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n        const max = (0, $31054a6c69637582$exports).fromValues(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n        const position = (0, $31054a6c69637582$exports).create();\n        const vertices = (0, $c2c30e4dcf8004c5$export$a15f0a83a652dd40).POSITIONS;\n        for(let i = 0; i < 8; i++){\n            (0, $31054a6c69637582$exports).set(position, vertices[i * 3] * sizeX, vertices[i * 3 + 1] * sizeY, vertices[i * 3 + 2] * sizeZ);\n            (0, $31054a6c69637582$exports).transformQuat(position, position, rotation);\n            (0, $31054a6c69637582$exports).min(min, min, position);\n            (0, $31054a6c69637582$exports).max(max, max, position);\n        }\n        (0, $31054a6c69637582$exports).copy(this._min, min);\n        (0, $31054a6c69637582$exports).copy(this._max, max);\n    }\n    fromCylinder(pa, pb, radius) {\n        const a = (0, $31054a6c69637582$exports).create();\n        (0, $31054a6c69637582$exports).subtract(a, pb, pa);\n        const aa = (0, $31054a6c69637582$exports).dot(a, a);\n        const ex = radius * Math.sqrt(1 - a[0] * a[0] / aa);\n        const ey = radius * Math.sqrt(1 - a[1] * a[1] / aa);\n        const ez = radius * Math.sqrt(1 - a[2] * a[2] / aa);\n        this._min[0] = Math.min(pa[0] - ex, pb[0] - ex);\n        this._min[1] = Math.min(pa[1] - ey, pb[1] - ey);\n        this._min[2] = Math.min(pa[2] - ez, pb[2] - ez);\n        this._max[0] = Math.max(pa[0] + ex, pb[0] + ex);\n        this._max[1] = Math.max(pa[1] + ey, pb[1] + ey);\n        this._max[2] = Math.max(pa[2] + ez, pb[2] + ez);\n    }\n}\n\n\nconst $66964bfc3ddbcb4c$export$8daabe80e4a041 = {\n    sphere: 0,\n    box: 1,\n    cylinder: 2,\n    hexPrism: 3,\n    rotatedBox: 4,\n    xyRect: 5,\n    xzRect: 6,\n    yzRect: 7,\n    rotatedXyRect: 8,\n    fontXyRect: 9,\n    rotatedFontXyRect: 10,\n    boxSdf: 11,\n    cylinderSdf: 12,\n    hexPrismSdf: 13,\n    constantMedium: 14,\n    sdfXyRect: 15,\n    rotatedSdfXyRect: 16,\n    rotatedBoxSdf: 17,\n    xYDisk: 18,\n    rotatedXyDisk: 19,\n    ringSdf: 20,\n    rotatedRingSdf: 21,\n    sphereSdf: 22,\n    tubeSdf: 23\n};\nclass $66964bfc3ddbcb4c$export$1337e9dd34ffc243 extends Float32Array {\n    constructor(count){\n        super(count * $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE);\n        this.CENTER0_OFFSET = 0;\n        this.TYPE_OFFSET = 3;\n        this.SIZE0_OFFSET = 4;\n        this.MATERIAL_ID_OFFSET = 7;\n        this.ROTATION0_OFFSET = 8;\n        this.ROTATION1_OFFSET = 12;\n        this.TEXCOORD0_OFFSET = 16;\n        this.TEXCOORD1_OFFSET = 18;\n        this.CENTER1_OFFSET = 20;\n        this.ROUNDING_OFFSET = 23;\n        this.SIZE1_OFFSET = 24;\n        this.BOUNDARY_TYPE_OFFSET = 27;\n        this.TIME0_OFFSET = 28;\n        this.TIME1_OFFSET = 29;\n        this.TEX_ID_OFFSET = 30;\n        this.SDF_BUFFER_OFFSET = 31;\n        this.SDF_BORDER_OFFSET = 32;\n        this.PARAMETER_1_OFFSET = 33;\n        this.PARAMETER_2_OFFSET = 34;\n        this.MATERIAL_FUZZ_OFFSET = 35;\n        this.MATERIAL_GLOSS_OFFSET = 36;\n        this.MATERIAL_DENSITY_OFFSET = 37;\n        this.MATERIAL_REFRACTIVE_INDEX_OFFSET = 38;\n        this.MATERIAL_COLOR_OFFSET = 40;\n        this.MATERIAL_TYPE_ID_OFFSET = 43;\n        this.SEGMENT_COLOR_OFFSET = 44;\n        this.TEXTURE_TYPE_ID_OFFSET = 48;\n        this.TEXTURE_ID_OFFSET = 49;\n    }\n    getType(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TYPE_OFFSET];\n    }\n    setType(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TYPE_OFFSET] = value;\n    }\n    getCenter0(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.CENTER0_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setCenter0(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.CENTER0_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getCenter1(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.CENTER1_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setCenter1(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.CENTER1_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getTime0(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TIME0_OFFSET];\n    }\n    setTime0(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TIME0_OFFSET] = value;\n    }\n    getTime1(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TIME1_OFFSET];\n    }\n    setTime1(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TIME1_OFFSET] = value;\n    }\n    getSize0(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SIZE0_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setSize0(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SIZE0_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getSize1(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SIZE1_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setSize1(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SIZE1_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getRotation0(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.ROTATION0_OFFSET;\n        (0, $39ece26d1239bb77$exports).set(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n    }\n    setRotation0(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.ROTATION0_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n        this[offset + 3] = value[3];\n    }\n    getRotation1(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.ROTATION1_OFFSET;\n        (0, $39ece26d1239bb77$exports).set(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n    }\n    setRotation1(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.ROTATION1_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n        this[offset + 3] = value[3];\n    }\n    getTexCoord0(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TEXCOORD0_OFFSET;\n        (0, $91b0cc4981465964$exports).set(value, this[offset], this[offset + 1]);\n    }\n    setTexCoord0(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TEXCOORD0_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n    }\n    getTexCoord1(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TEXCOORD1_OFFSET;\n        (0, $91b0cc4981465964$exports).set(value, this[offset], this[offset + 1]);\n    }\n    setTexCoord1(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TEXCOORD1_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n    }\n    getRounding(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.ROUNDING_OFFSET];\n    }\n    setRounding(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.ROUNDING_OFFSET] = value;\n    }\n    getParameter1(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.PARAMETER_1_OFFSET];\n    }\n    setParameter1(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.PARAMETER_1_OFFSET] = value;\n    }\n    getParameter2(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.PARAMETER_2_OFFSET];\n    }\n    setParameter2(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.PARAMETER_2_OFFSET] = value;\n    }\n    getBoundaryType(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.BOUNDARY_TYPE_OFFSET];\n    }\n    setBoundaryType(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.BOUNDARY_TYPE_OFFSET] = value;\n    }\n    getTexId(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TEX_ID_OFFSET];\n    }\n    setTexId(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.TEX_ID_OFFSET] = value;\n    }\n    getSdfBuffer(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SDF_BUFFER_OFFSET];\n    }\n    setSdfBuffer(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SDF_BUFFER_OFFSET] = value;\n    }\n    getSdfBorder(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SDF_BORDER_OFFSET];\n    }\n    setSdfBorder(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SDF_BORDER_OFFSET] = value;\n    }\n    getMaterialTypeId(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_TYPE_ID_OFFSET];\n    }\n    setMaterialTypeId(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_TYPE_ID_OFFSET] = value;\n    }\n    getMaterialFuzz(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_FUZZ_OFFSET];\n    }\n    setMaterialFuzz(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_FUZZ_OFFSET] = value;\n    }\n    getMaterialDensity(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_DENSITY_OFFSET];\n    }\n    setMaterialDensity(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_DENSITY_OFFSET] = value;\n    }\n    getMaterialGloss(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_GLOSS_OFFSET];\n    }\n    setMaterialGloss(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_GLOSS_OFFSET] = value;\n    }\n    getMaterialRefractiveIndex(index) {\n        return this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_REFRACTIVE_INDEX_OFFSET];\n    }\n    setMaterialRefractiveIndex(index, value) {\n        this[$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_REFRACTIVE_INDEX_OFFSET] = value;\n    }\n    getMaterialColor(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_COLOR_OFFSET;\n        value[0] = this[offset];\n        value[1] = this[offset + 1];\n        value[2] = this[offset + 2];\n    }\n    setMaterialColor(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.MATERIAL_COLOR_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getSegmentColor(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SEGMENT_COLOR_OFFSET;\n        value[0] = this[offset];\n        value[1] = this[offset + 1];\n        value[2] = this[offset + 2];\n        value[3] = this[offset + 3];\n    }\n    setSegmentColor(index, value) {\n        const offset = $66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE * index + this.SEGMENT_COLOR_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n        this[offset + 3] = value[3];\n    }\n}\n$66964bfc3ddbcb4c$export$1337e9dd34ffc243.SIZE = 52;\nclass $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    get center0() {\n        return this._center0;\n    }\n    get center1() {\n        return this._center1;\n    }\n    get time0() {\n        return this._time0;\n    }\n    get time1() {\n        return this._time1;\n    }\n    get bounds() {\n        return this._bounds;\n    }\n    get offset0() {\n        return this._offset0;\n    }\n    get offset1() {\n        return this._offset1;\n    }\n    constructor(options){\n        this._center0 = options.center0;\n        this._center1 = options.center1;\n        this._time0 = options.time0;\n        this._time1 = options.time1;\n        this._bounds = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        this._offset0 = (0, $31054a6c69637582$exports).create();\n        this._offset1 = (0, $31054a6c69637582$exports).create();\n        this.materialFuzz = options.materialFuzz;\n        this.materialType = options.materialType;\n        this.materialGloss = options.materialGloss;\n        this.materialDensity = options.materialDensity;\n        this.materialRefractiveIndex = options.materialRefractiveIndex;\n        this.materialColor = options.materialColor;\n        this.segmentColor = options.segmentColor;\n    }\n    toBuffer(buffer, index) {\n        buffer.setCenter0(index, this._center0);\n        buffer.setCenter1(index, this._center1);\n        buffer.setTime0(index, this._time0);\n        buffer.setTime1(index, this._time1);\n        buffer.setMaterialTypeId(index, this.materialType);\n        buffer.setMaterialFuzz(index, this.materialFuzz);\n        buffer.setMaterialGloss(index, this.materialGloss);\n        buffer.setMaterialDensity(index, this.materialDensity);\n        buffer.setMaterialRefractiveIndex(index, this.materialRefractiveIndex);\n        buffer.setMaterialColor(index, this.materialColor);\n        buffer.setSegmentColor(index, this.segmentColor);\n    }\n}\nclass $66964bfc3ddbcb4c$export$f44a85073ff35bb extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    get radius() {\n        return this._radius;\n    }\n    constructor(options){\n        super(options);\n        this._radius = options.radius;\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        min[0] = Math.min(this._center0[0] - this._radius, this._center1[0] - this._radius);\n        max[0] = Math.max(this._center0[0] + this._radius, this._center1[0] + this._radius);\n        min[1] = Math.min(this._center0[1] - this._radius, this._center1[1] - this._radius);\n        max[1] = Math.max(this._center0[1] + this._radius, this._center1[1] + this._radius);\n        min[2] = Math.min(this._center0[2] - this._radius, this._center1[2] - this._radius);\n        max[2] = Math.max(this._center0[2] + this._radius, this._center1[2] + this._radius);\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.sphere);\n        buffer.setSize0(index, (0, $31054a6c69637582$exports).fromValues(this._radius, this._radius, this._radius));\n    }\n}\nclass $66964bfc3ddbcb4c$export$3f7e8ab42d22375 extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    get texCoord0() {\n        return this._texCoord0;\n    }\n    get texCoord1() {\n        return this._texCoord1;\n    }\n    constructor(options){\n        super(options);\n        this._thickness = 0.00001;\n        this._radius0 = options.radius0;\n        this._radius1 = options.radius1;\n        this._texCoord0 = options.texCoord0;\n        this._texCoord1 = options.texCoord1;\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        min[0] = Math.min(this._center0[0] - this._radius0, this._center1[0] - this._radius1);\n        max[0] = Math.max(this._center0[0] + this._radius0, this._center1[0] + this._radius1);\n        min[1] = Math.min(this._center0[1] - this._radius0, this._center1[1] - this._radius1);\n        max[1] = Math.max(this._center0[1] + this._radius0, this._center1[1] + this._radius1);\n        min[2] = Math.min(this._center0[2] - this._thickness, this._center1[2] - this._thickness);\n        max[2] = Math.max(this._center0[2] + this._thickness, this._center1[2] + this._thickness);\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.xYDisk);\n        buffer.setSize0(index, (0, $31054a6c69637582$exports).fromValues(this._radius0, this._radius0, this._thickness));\n        buffer.setSize1(index, (0, $31054a6c69637582$exports).fromValues(this._radius1, this._radius1, this._thickness));\n        buffer.setTexCoord0(index, this._texCoord0);\n        buffer.setTexCoord1(index, this._texCoord1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$1d27985e95946d19 extends $66964bfc3ddbcb4c$export$3f7e8ab42d22375 {\n    constructor(options){\n        super(options);\n        this._rotation0 = options.rotation0;\n        this._rotation1 = options.rotation1;\n        const rotatedBounds0 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const rotatedBounds1 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const min0 = rotatedBounds0.min;\n        const max0 = rotatedBounds0.max;\n        const min1 = rotatedBounds1.min;\n        const max1 = rotatedBounds1.max;\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation0, min0, max0, this._offset0);\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation1, min1, max1, this._offset1);\n        min0[0] = Math.min(min0[0], min1[0]);\n        max0[0] = Math.max(max0[0], max1[0]);\n        min0[1] = Math.min(min0[1], min1[1]);\n        max0[1] = Math.max(max0[1], max1[1]);\n        min0[2] = Math.min(min0[2], min1[2]);\n        max0[2] = Math.max(max0[2], max1[2]);\n        this._bounds = rotatedBounds0;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.rotatedXyDisk);\n        buffer.setRotation0(index, this._rotation0);\n        buffer.setRotation1(index, this._rotation1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$d84131593262075b extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    constructor(options){\n        super(options);\n        this._size0 = options.size0;\n        this._size1 = options.size1;\n        this._angle = options.angle0;\n        this._innerRadius = options.innerRadius0;\n        this._rounding = options.rounding;\n        const outerRadius = this._size0[0];\n        const innerRadius = this._size0[1];\n        const extrudedThicknesses = this._size0[2];\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        max[1] = this._center0[1] + outerRadius;\n        const sinAngle = Math.sin(this._angle);\n        const cosAngle = Math.cos(this._angle);\n        if (this._angle < (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI_OVER_TWO) {\n            min[0] = this.center0[0] - sinAngle * outerRadius;\n            max[0] = this.center0[0] + sinAngle * outerRadius;\n            min[1] = this.center0[1] + cosAngle * innerRadius;\n        } else {\n            min[0] = this._center0[0] - outerRadius;\n            max[0] = this._center0[0] + outerRadius;\n            min[1] = this._center0[1] + cosAngle * outerRadius;\n        }\n        min[2] = this._center0[2] - extrudedThicknesses;\n        max[2] = this._center0[2] + extrudedThicknesses;\n        this.offset0[0] = (min[0] + max[0]) / 2 - this._center0[0];\n        this.offset0[1] = (min[1] + max[1]) / 2 - this._center0[1];\n        this.offset0[2] = (min[2] + max[2]) / 2 - this._center0[2];\n        this.offset1[0] = (min[0] + max[0]) / 2 - this._center1[0];\n        this.offset1[1] = (min[1] + max[1]) / 2 - this._center1[1];\n        this.offset1[2] = (min[2] + max[2]) / 2 - this._center1[2];\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.ringSdf);\n        buffer.setSize0(index, this._size0);\n        buffer.setSize1(index, this._size1);\n        buffer.setParameter1(index, this._angle);\n        buffer.setParameter2(index, this._innerRadius);\n        buffer.setRounding(index, this._rounding);\n    }\n}\nclass $66964bfc3ddbcb4c$export$2d4dbfe5a7e22bdf extends $66964bfc3ddbcb4c$export$d84131593262075b {\n    constructor(options){\n        super(options);\n        this._rotation0 = options.rotation0;\n        this._rotation1 = options.rotation1;\n        const rotatedBounds0 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const rotatedBounds1 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const min0 = rotatedBounds0.min;\n        const max0 = rotatedBounds0.max;\n        const min1 = rotatedBounds1.min;\n        const max1 = rotatedBounds1.max;\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation0, min0, max0, this._offset0);\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation1, min1, max1, this._offset1);\n        min0[0] = Math.min(min0[0], min1[0]);\n        max0[0] = Math.max(max0[0], max1[0]);\n        min0[1] = Math.min(min0[1], min1[1]);\n        max0[1] = Math.max(max0[1], max1[1]);\n        min0[2] = Math.min(min0[2], min1[2]);\n        max0[2] = Math.max(max0[2], max1[2]);\n        this._bounds = rotatedBounds0;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.rotatedRingSdf);\n        buffer.setRotation0(index, this._rotation0);\n        buffer.setRotation1(index, this._rotation1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$8c6d7438a2b5cc70 extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    constructor(options){\n        super(options);\n        this._innerRadius = options.innerRadius;\n        this._outerRadius = options.outerRadius;\n        this._height = options.height;\n        this._rounding = options.rounding;\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        min[0] = this._center1[0] - this._outerRadius;\n        max[0] = this._center1[0] + this._outerRadius;\n        min[1] = this._center1[1] - this._height;\n        max[1] = this._center1[1] + this._height;\n        min[2] = this._center1[2] - this._outerRadius;\n        max[2] = this._center1[2] + this._outerRadius;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.tubeSdf);\n        buffer.setSize0(index, (0, $31054a6c69637582$exports).fromValues(this._innerRadius, this._height, this._outerRadius));\n        buffer.setRounding(index, this._rounding);\n    }\n}\nclass $66964bfc3ddbcb4c$export$28497cc10fec95c2 extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    constructor(options){\n        super(options);\n        this._size0 = options.size0;\n        this._size1 = options.size1;\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        min[0] = Math.min(this._center0[0] - this._size0[0], this._center1[0] - this._size1[0]);\n        max[0] = Math.max(this._center0[0] + this._size0[0], this._center1[0] + this._size1[0]);\n        min[1] = Math.min(this._center0[1] - this._size0[1], this._center1[1] - this._size1[1]);\n        max[1] = Math.max(this._center0[1] + this._size0[1], this._center1[1] + this._size1[1]);\n        min[2] = Math.min(this._center0[2] - this._size0[2], this._center1[2] - this._size1[2]);\n        max[2] = Math.max(this._center0[2] + this._size0[2], this._center1[2] + this._size1[2]);\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.box);\n        buffer.setSize0(index, this._size0);\n        buffer.setSize1(index, this._size1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$86630ee69b6c2fb extends $66964bfc3ddbcb4c$export$f44a85073ff35bb {\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.sphereSdf);\n    }\n}\nclass $66964bfc3ddbcb4c$export$dfaec831a2de7e90 extends $66964bfc3ddbcb4c$export$28497cc10fec95c2 {\n    constructor(options){\n        super(options);\n        this._rounding = options.rounding;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.boxSdf);\n        buffer.setRounding(index, this._rounding);\n    }\n}\nclass $66964bfc3ddbcb4c$export$e349e1996fd043a1 extends $66964bfc3ddbcb4c$export$dfaec831a2de7e90 {\n    constructor(options){\n        super(options);\n        this._rotation0 = options.rotation0;\n        this._rotation1 = options.rotation1;\n        const rotatedBounds0 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const rotatedBounds1 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const min0 = rotatedBounds0.min;\n        const max0 = rotatedBounds0.max;\n        const min1 = rotatedBounds1.min;\n        const max1 = rotatedBounds1.max;\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation0, min0, max0, this._offset0);\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation1, min1, max1, this._offset1);\n        min0[0] = Math.min(min0[0], min1[0]);\n        max0[0] = Math.max(max0[0], max1[0]);\n        min0[1] = Math.min(min0[1], min1[1]);\n        max0[1] = Math.max(max0[1], max1[1]);\n        min0[2] = Math.min(min0[2], min1[2]);\n        max0[2] = Math.max(max0[2], max1[2]);\n        this._bounds = rotatedBounds0;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.rotatedBoxSdf);\n        buffer.setRotation0(index, this._rotation0);\n        buffer.setRotation1(index, this._rotation1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$acdc70fb29a0312b extends $66964bfc3ddbcb4c$export$28497cc10fec95c2 {\n    constructor(options){\n        super(options);\n        this._rotation0 = options.rotation0;\n        this._rotation1 = options.rotation1;\n        const rotatedBounds0 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const rotatedBounds1 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const min0 = rotatedBounds0.min;\n        const max0 = rotatedBounds0.max;\n        const min1 = rotatedBounds1.min;\n        const max1 = rotatedBounds1.max;\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation0, min0, max0, this._offset0);\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation1, min1, max1, this._offset1);\n        min0[0] = Math.min(min0[0], min1[0]);\n        max0[0] = Math.max(max0[0], max1[0]);\n        min0[1] = Math.min(min0[1], min1[1]);\n        max0[1] = Math.max(max0[1], max1[1]);\n        min0[2] = Math.min(min0[2], min1[2]);\n        max0[2] = Math.max(max0[2], max1[2]);\n        this._bounds = rotatedBounds0;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.rotatedBox);\n        buffer.setRotation0(index, this._rotation0);\n        buffer.setRotation1(index, this._rotation1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$cd2cb390b9add281 extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    get radius() {\n        return this._radius;\n    }\n    get height() {\n        return this._height;\n    }\n    constructor(options){\n        super(options);\n        this._radius = options.radius;\n        this._height = options.height;\n        this._rotation0 = options.rotation0 || (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY;\n        this._rotation1 = options.rotation1 || (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY;\n        if (this._rotation0[3] * this._rotation1[3] == 1) {\n            const min = this._bounds.min;\n            const max = this._bounds.max;\n            min[0] = Math.min(this._center0[0] - this._radius, this._center1[0] - this._radius);\n            max[0] = Math.max(this._center0[0] + this._radius, this._center1[0] + this._radius);\n            min[1] = Math.min(this._center0[1] - this._height, this._center1[1] - this._height);\n            max[1] = Math.max(this._center0[1] + this._height, this._center1[1] + this._height);\n            min[2] = Math.min(this._center0[2] - this._radius, this._center1[2] - this._radius);\n            max[2] = Math.max(this._center0[2] + this._radius, this._center1[2] + this._radius);\n        } else {\n            const ca0 = (0, $31054a6c69637582$exports).create();\n            const pa0 = (0, $31054a6c69637582$exports).create();\n            const pb0 = (0, $31054a6c69637582$exports).create();\n            (0, $31054a6c69637582$exports).transformQuat(ca0, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._rotation0);\n            (0, $31054a6c69637582$exports).scaleAndAdd(pa0, this._center0, ca0, -this._height);\n            (0, $31054a6c69637582$exports).scaleAndAdd(pb0, this._center0, ca0, this._height);\n            const ca1 = (0, $31054a6c69637582$exports).create();\n            const pa1 = (0, $31054a6c69637582$exports).create();\n            const pb1 = (0, $31054a6c69637582$exports).create();\n            (0, $31054a6c69637582$exports).transformQuat(ca1, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, this._rotation1);\n            (0, $31054a6c69637582$exports).scaleAndAdd(pa1, this._center1, ca1, -this._height);\n            (0, $31054a6c69637582$exports).scaleAndAdd(pb1, this._center1, ca1, this._height);\n            this._bounds.fromCylinder(pa0, pb0, this._radius);\n            const bounds = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n            bounds.fromCylinder(pa1, pb1, this._radius);\n            const min0 = this._bounds.min;\n            const max0 = this._bounds.max;\n            const min1 = bounds.min;\n            const max1 = bounds.max;\n            min0[0] = Math.min(min0[0], min1[0]);\n            max0[0] = Math.max(max0[0], max1[0]);\n            min0[1] = Math.min(min0[1], min1[1]);\n            max0[1] = Math.max(max0[1], max1[1]);\n            min0[2] = Math.min(min0[2], min1[2]);\n            max0[2] = Math.max(max0[2], max1[2]);\n        }\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.cylinder);\n        buffer.setSize0(index, (0, $31054a6c69637582$exports).fromValues(this._radius, this._height, this._radius));\n        buffer.setSize1(index, (0, $31054a6c69637582$exports).fromValues(this._radius, this._height, this._radius));\n        buffer.setRotation0(index, this._rotation0);\n        buffer.setRotation1(index, this._rotation1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$563880b935f7aee2 extends $66964bfc3ddbcb4c$export$cd2cb390b9add281 {\n    constructor(options){\n        super(options);\n        this._rounding = options.rounding;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.cylinderSdf);\n        buffer.setRounding(index, this._rounding);\n    }\n}\nclass $66964bfc3ddbcb4c$export$2104cbf9d09a457a extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    get radius() {\n        return this._radius;\n    }\n    get height() {\n        return this._height;\n    }\n    constructor(options){\n        super(options);\n        this._radius = options.radius;\n        this._height = options.height;\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        min[0] = this._center0[0] - this._radius * (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE_OVER_TWO;\n        max[0] = this._center0[0] + this._radius * (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE_OVER_TWO;\n        min[1] = this._center0[1] - this._height;\n        max[1] = this._center0[1] + this._height;\n        min[2] = this._center0[2] - this._radius;\n        max[2] = this._center0[2] + this._radius;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.hexPrism);\n        buffer.setSize0(index, (0, $31054a6c69637582$exports).fromValues(this._radius * (0, $d4d7bd6cc65a5081$export$a002182e51710d39).ROOT_THREE_OVER_TWO, this._height, this._radius));\n    }\n}\nclass $66964bfc3ddbcb4c$export$df234dab64f8469a extends $66964bfc3ddbcb4c$export$2104cbf9d09a457a {\n    constructor(options){\n        super(options);\n        this._rounding = options.rounding;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.hexPrismSdf);\n        buffer.setRounding(index, this._rounding);\n    }\n}\nclass $66964bfc3ddbcb4c$export$3d594d9378ccaeb1 extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    get texCoord0() {\n        return this._texCoord0;\n    }\n    get texCoord1() {\n        return this._texCoord1;\n    }\n    constructor(options){\n        super(options);\n        this._thickness = 0.00001;\n        this._size0 = options.size0;\n        this._size1 = options.size1;\n        this._texCoord0 = options.texCoord0;\n        this._texCoord1 = options.texCoord1;\n        this._setBounds();\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setTexCoord0(index, this._texCoord0);\n        buffer.setTexCoord1(index, this._texCoord1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$379f0673f20ddbc9 extends $66964bfc3ddbcb4c$export$3d594d9378ccaeb1 {\n    _setBounds() {\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        min[0] = Math.min(this._center0[0] - this._size0[0], this._center1[0] - this._size1[0]);\n        max[0] = Math.max(this._center0[0] + this._size0[0], this._center1[0] + this._size1[0]);\n        min[1] = Math.min(this._center0[1] - this._size0[1], this._center1[1] - this._size1[1]);\n        max[1] = Math.max(this._center0[1] + this._size0[1], this._center1[1] + this._size1[1]);\n        min[2] = Math.min(this._center0[2] - this._thickness, this._center1[2] - this._thickness);\n        max[2] = Math.max(this._center0[2] + this._thickness, this._center1[2] + this._thickness);\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.xyRect);\n        buffer.setSize0(index, (0, $31054a6c69637582$exports).fromValues(this._size0[0], this._size0[1], this._thickness));\n        buffer.setSize1(index, (0, $31054a6c69637582$exports).fromValues(this._size1[0], this._size1[1], this._thickness));\n    }\n}\nclass $66964bfc3ddbcb4c$export$57071e021ef37bbb extends $66964bfc3ddbcb4c$export$3d594d9378ccaeb1 {\n    _setBounds() {\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        min[0] = Math.min(this._center0[0] - this._size0[0], this._center1[0] - this._size1[0]);\n        max[0] = Math.max(this._center0[0] + this._size0[0], this._center1[0] + this._size1[0]);\n        min[1] = Math.min(this._center0[1] - this._thickness, this._center1[1] - this._thickness);\n        max[1] = Math.max(this._center0[1] + this._thickness, this._center1[1] + this._thickness);\n        min[2] = Math.min(this._center0[2] - this._size0[1], this._center1[2] - this._size1[1]);\n        max[2] = Math.max(this._center0[2] + this._size0[1], this._center1[2] + this._size1[1]);\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.xzRect);\n        buffer.setSize0(index, (0, $31054a6c69637582$exports).fromValues(this._size0[0], this._thickness, this._size0[1]));\n        buffer.setSize1(index, (0, $31054a6c69637582$exports).fromValues(this._size1[0], this._thickness, this._size1[1]));\n    }\n}\nclass $66964bfc3ddbcb4c$export$c9a72925228aaa16 extends $66964bfc3ddbcb4c$export$3d594d9378ccaeb1 {\n    _setBounds() {\n        const min = this._bounds.min;\n        const max = this._bounds.max;\n        min[0] = Math.min(this._center0[0] - this._thickness, this._center1[0] - this._thickness);\n        max[0] = Math.max(this._center0[0] + this._thickness, this._center1[0] + this._thickness);\n        min[1] = Math.min(this._center0[1] - this._size0[0], this._center1[1] - this._size1[0]);\n        max[1] = Math.max(this._center0[1] + this._size0[0], this._center1[1] + this._size1[0]);\n        min[2] = Math.min(this._center0[2] - this._size0[1], this._center1[2] - this._size1[1]);\n        max[2] = Math.max(this._center0[2] + this._size0[1], this._center1[2] + this._size1[1]);\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.yzRect);\n        buffer.setSize0(index, (0, $31054a6c69637582$exports).fromValues(this._thickness, this._size0[0], this._size0[1]));\n        buffer.setSize1(index, (0, $31054a6c69637582$exports).fromValues(this._thickness, this._size1[0], this._size1[1]));\n    }\n}\nclass $66964bfc3ddbcb4c$export$da0b2fe0ae5e85dd extends $66964bfc3ddbcb4c$export$379f0673f20ddbc9 {\n    constructor(options){\n        super(options);\n        this._sdfBuffer = options.sdfBuffer;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setSdfBuffer(index, this._sdfBuffer);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.fontXyRect);\n    }\n}\nclass $66964bfc3ddbcb4c$export$6d714417e0aa3f19 extends $66964bfc3ddbcb4c$export$379f0673f20ddbc9 {\n    constructor(options){\n        super(options);\n        this._texId = options.texId;\n        this._sdfBuffer = options.sdfBuffer;\n        this._sdfBorder = options.sdfBorder;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setTexId(index, this._texId);\n        buffer.setSdfBuffer(index, this._sdfBuffer);\n        buffer.setSdfBorder(index, this._sdfBorder);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.sdfXyRect);\n    }\n}\nclass $66964bfc3ddbcb4c$export$71089e9c0fdb5c5 extends $66964bfc3ddbcb4c$export$379f0673f20ddbc9 {\n    constructor(options){\n        super(options);\n        this._rotation0 = options.rotation0;\n        this._rotation1 = options.rotation1;\n        const rotatedBounds0 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const rotatedBounds1 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        const min0 = rotatedBounds0.min;\n        const max0 = rotatedBounds0.max;\n        const min1 = rotatedBounds1.min;\n        const max1 = rotatedBounds1.max;\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation0, min0, max0, this._offset0);\n        (0, $9614560ff899e49d$export$93b17801046b2267).rotateBounds(this._bounds.min, this._bounds.max, this._rotation1, min1, max1, this._offset1);\n        min0[0] = Math.min(min0[0], min1[0]);\n        max0[0] = Math.max(max0[0], max1[0]);\n        min0[1] = Math.min(min0[1], min1[1]);\n        max0[1] = Math.max(max0[1], max1[1]);\n        min0[2] = Math.min(min0[2], min1[2]);\n        max0[2] = Math.max(max0[2], max1[2]);\n        this._bounds = rotatedBounds0;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.rotatedXyRect);\n        buffer.setRotation0(index, this._rotation0);\n        buffer.setRotation1(index, this._rotation1);\n    }\n}\nclass $66964bfc3ddbcb4c$export$402b844452575dc9 extends $66964bfc3ddbcb4c$export$71089e9c0fdb5c5 {\n    constructor(options){\n        super(options);\n        this._sdfBuffer = options.sdfBuffer;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setSdfBuffer(index, this._sdfBuffer);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.rotatedFontXyRect);\n    }\n}\nclass $66964bfc3ddbcb4c$export$c2e43d40ab2c967e extends $66964bfc3ddbcb4c$export$71089e9c0fdb5c5 {\n    constructor(options){\n        super(options);\n        this._texId = options.texId;\n        this._sdfBuffer = options.sdfBuffer;\n        this._sdfBorder = options.sdfBorder;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setTexId(index, this._texId);\n        buffer.setSdfBuffer(index, this._sdfBuffer);\n        buffer.setSdfBorder(index, this._sdfBorder);\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.rotatedSdfXyRect);\n    }\n}\nclass $66964bfc3ddbcb4c$export$412c0ed39e393270 extends $66964bfc3ddbcb4c$export$cb7224ab7735b16e {\n    get boundary() {\n        return this._boundary;\n    }\n    constructor(options){\n        super(options);\n        this._boundary = options.boundary;\n        this._bounds = this._boundary.bounds;\n    }\n    toBuffer(buffer, index) {\n        this._boundary.toBuffer(buffer, index);\n        buffer.setBoundaryType(index, buffer.getType(index));\n        buffer.setType(index, $66964bfc3ddbcb4c$export$8daabe80e4a041.constantMedium);\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nconst $e1b604d7f27d3d8e$export$7173403786dbea8d = `\nconst PI = 3.1415926535897932385f;\nconst TWO_PI = 6.2831853071795864769f;\nconst ROOT_THREE_OVER_TWO = 0.86602540378443864676f;\nconst ONE_OVER_LOG10 = 1f / log(10f);\n\nstruct ColorBuffer {\n    values: array<f32>,\n}\n\n// (normal.x, normal.y, normal.z, depth)\nstruct NormalDepthBuffer {\n    values: array<f32>,\n}\n\n// Min, max\n// TODO: Convert to atomic add with uint\nstruct DepthMinMaxBuffer {\n    values: array<atomic<u32>>,\n}\n\nstruct Ray {\n    origin: vec3<f32>,\n    direction: vec3<f32>,\n    time: f32,\n}\n\nstruct HitRecord {\n    normal: vec3<f32>,\n    t: f32,\n    frontFace: bool,\n    // materialId: u32,\n    uv: vec2<f32>,\n    id: u32,\n    previousId: u32,\n    position: vec3<f32>,\n    previousPosition: vec3<f32>,\n    isAbsorbing: bool,\n    previousIsAbsorbing: bool,\n    absorption: vec3<f32>,\n    previousAbsorption: vec3<f32>,\n    sdfBorder: bool,\n}\n\nstruct Camera {\n    origin: vec3<f32>,\n    lowerLeftCorner: vec3<f32>,\n    horizontal: vec3<f32>,\n    vertical: vec3<f32>,\n    u: vec3<f32>,\n    v: vec3<f32>,\n    w: vec3<f32>,\n    aspectRatio: f32,\n    viewportWidth: f32,\n    viewportHeight: f32,\n    fov: f32,\n    aperture: f32,\n    focusDistance: f32,\n    time0: f32,\n    time1: f32,\n}\n\n                                //         offest   align    size\nstruct Uniforms {               // ------------------------------\n    position: vec3<f32>,        //              0      16      12\n    width: f32,                 //             12       4       4\n    right: vec3<f32>,           //             16      16      12\n    height: f32,                //             28       4       4\n    up: vec3<f32>,              //             32      16      12\n    seed: f32,                  //             44       4       4\n    forward: vec3<f32>,         //             48      16      12\n    fov: f32,                   //             60       4       4\n    backgroundColor: vec3<f32>, //             64      16      12\n    time0: f32,                 //             76       4       4\n    ambientColor: vec3<f32>,    //             80      16      12\n    time1: f32,                 //             92       4       4\n    tilesX : f32,               //             96       4       4\n    tilesY : f32,               //            100       4       4\n    tileOffsetX : f32,          //            104       4       4\n    tileOffsetY : f32,          //            108       4       4    \n    lookAt: vec3<f32>,          //            112      16      12\n    aperture: f32,              //            124       4       4\n    focusDistance: f32,         //            128       4       4\n    raysPerFrame : f32,         //            132       4       4\n                                // padding    136       4       4\n                                // ------------------------------\n                                //                     16     144\n}\n\n// id   type\n// ----------------\n// 0    none\n// 1    solidColor\n// 2    image\n// 3    sdfText\n// 4    checker\n// 5    grid\n                       //         offest   align    size\nstruct Texture {       // ------------------------------\n    color0: vec3<f32>, //              0      16      12\n    typeId: f32,       //             12       4       4\n    color1: vec3<f32>, //             16      12      12\n                       // padding     28       4      12\n    size0: vec4<f32>,  //             32      16      16\n    size1: vec4<f32>,  //             48      16      16\n    clip:  vec4<f32>,  //             64      16      16\n    offset: vec2<f32>, //             80       8       8\n}                      // padding     88       4       8\n                       // ------------------------------\n                       //                     16      96\n\n\n// id   type\n// ---------------\n// 0    lambertian\n// 1    metal\n// 2    dielectric\n// 3    diffuse light\n// 4    glossy\n// 5    isotropic\n// 6    varnitsh\n                          //         offest   align    size\nstruct Material {         // ------------------------------\n    typeId: f32,          //              0       4       4\n    fuzz: f32,            //              4       4       4\n    refractiveIndex: f32, //              8       4       4\n    textureId: f32,       //             12       4       4\n    color: vec3<f32>,     //             16      16      12\n    glossiness: f32,      //             28       4       4\n    idColor: vec4<f32>,   //             32      16      16\n    density: f32,         //             48       4       4\n                          // padding     52       4      12\n                          // ------------------------------\n}                         //                     16      64\n\n// id   type\n// ----------------\n// 0    distant\n// 1    sphere\n// 2    rect\n// 3    disk\n// 4    cylinder\n// 5    dome\n                         //         offest   align    size\nstruct Light {           // ------------------------------\n    rotation: vec4<f32>, //              0      16      16\n    center: vec3<f32>,   //             16      16      12\n    typeId: f32,         //             28       4       4\n    size: vec3<f32>,     //             32      16      12\n                         // padding     44       4       4\n    color: vec3<f32>,    //             48      16      12\n                         // padding     60       4       4\n}                        // ------------------------------\n                         //                     16      64\n\n// id   type\n// ----------------\n//  0   sphere\n//  1   box\n//  2   cylinder\n//  3   hexPrism\n//  4   rotatedBox\n//  5   xyRect\n//  6   xzRect\n//  7   yzRect\n//  8   rotatedXyRect\n//  9   fontXyRect\n// 10   rotatedFontXyRect\n// 11   boxSdf\n// 12   cylinderSdf\n// 13   hexPrismSdf\n// 14   constantMedium\n// 15   sdfXyRect\n// 16   rotatedSdfXyRect\n// 17   rotatedBoxSdf\n// 18   xyDisk\n// 19   rotatedXyDisk\n// 20   ringSdf\n// 21   rotatedRingSdf\n// 22   sphereSdf\n// 23   tubeSdf\n                                  //         offest   align    size\nstruct Hittable {                 // ------------------------------\n    center0: vec3<f32>,           //              0      16      12\n    typeId: f32,                  //             12       4       4\n    size0: vec3<f32>,             //             16      16      12\n    materialId: f32,              //             28       4       4\n    rotation0: vec4<f32>,         //             32      16      16\n    rotation1: vec4<f32>,         //             48      16      16\n    texCoord0: vec2<f32>,         //             64       8       8\n    texCoord1: vec2<f32>,         //             72       8       8\n    center1: vec3<f32>,           //             80      16      12\n    rounding: f32,                //             92       4       4\n    size1: vec3<f32>,             //             96      16      12\n    boundaryTypeId: f32,          //            108       4       4\n    time0: f32,                   //            112       4       4\n    time1: f32,                   //            116       4       4\n    texId: f32,                   //            120       4       4\n    sdfBuffer: f32,               //            124       4       4\n    sdfBorder: f32,               //            128       4       4\n    parameter1: f32,              //            132       4       4\n    parameter2: f32,              //            136       4       4\n    materialFuzz: f32,            //            140       4       4\n    materialGloss: f32,           //            144       4       4\n    materialDensity: f32,         //            148       4       4\n    materialRefractiveIndex: f32, //            152       4       4\n                                  // padding    156       4       4\n    materialColor: vec3<f32>,     //            160      16      12\n    materialTypeId: f32,          //            172       4       4\n    segmentColor: vec4<f32>,      //            176      16      16\n    textureTypeId: f32,           //            192       4       4\n    textureId: f32,               //            196       4       4\n                                  // padding    200       4       8\n}                                 // ------------------------------\n                                  //                     16     208\n\n                            //         offest   align    size\nstruct LinearBVHNode {      // ------------------------------\n    center: vec3<f32>,      //              0      16      12\n    primitivesOffset: f32,  //             12       4       4\n    size: vec3<f32>,        //             16      16      12\n    secondChildOffset: f32, //             28       4       4\n    nPrimitives: f32,       //             32       4       4\n    axis: f32,              //             36       4       4\n}                           // padding     40       4       8\n                            // ------------------------------\n                            //                     16      48\n\nstruct HittableBuffer {\n    hittables: array<Hittable>,\n}\n\n// struct MaterialBuffer {\n//     materials: array<Material>,\n// }\n\nstruct TextureBuffer {\n    textures: array<Texture>,\n}\n\nstruct LightBuffer {\n    lights: array<Light>,\n}\n\nstruct LinearBVHNodeBuffer {\n    nodes: array<LinearBVHNode>,\n}\n\n// Schlick's approximation for reflectance\nfn reflectance(cos: f32, refractiveIndex: f32) -> f32 {\n    var r = (1f - refractiveIndex) / (1f + refractiveIndex);\n    r = r * r;\n    return r + (1f - r) * pow(1f - cos, 5f);\n}\n\nfn refraction(uv: vec3<f32>, n: vec3<f32>, etaiOverEtat: f32) -> vec3<f32> {\n    let cosTheta = min(dot(-uv, n), 1f);\n    let rOutPerp =  etaiOverEtat * (uv + cosTheta * n);\n    let rOutParallel = -sqrt(abs(1f - dot(rOutPerp, rOutPerp))) * n;\n    return rOutPerp + rOutParallel;\n}\n\nfn getCamera(uniforms: Uniforms) -> Camera {\n    var camera: Camera;\n    camera.aperture = uniforms.aperture;\n    camera.aspectRatio = uniforms.width / uniforms.height;\n    camera.fov = uniforms.fov;\n    camera.viewportHeight = 2f * tan(camera.fov / 2f);\n    camera.viewportWidth = camera.aspectRatio * camera.viewportHeight;\n    camera.origin = uniforms.position;\n    camera.u = uniforms.right;\n    camera.v = uniforms.up;\n    camera.w = uniforms.forward;\n    let focusDistance = dot(camera.w, camera.origin - uniforms.lookAt) + uniforms.focusDistance;\n    camera.horizontal = camera.u * camera.viewportWidth * focusDistance;\n    camera.vertical = camera.v * camera.viewportHeight * focusDistance;\n    camera.lowerLeftCorner = camera.origin - camera.horizontal / 2f + camera.vertical / 2f - camera.w * focusDistance;\n    camera.time0 = uniforms.time0;\n    camera.time1 = uniforms.time1;\n    return camera;\n}\n\nfn getCameraRay(camera: Camera, seed: ptr<function, u32>, texCoord: vec2<f32>) -> Ray {\n    // Depth of field\n    let rd = camera.aperture * randomInUnitDisk(seed);\n    let offset = camera.u * rd.x + camera.v * rd.y;\n\n    var ray: Ray;\n    ray.origin = camera.origin + offset;\n    ray.direction = normalize(camera.lowerLeftCorner + texCoord.x * camera.horizontal - texCoord.y * camera.vertical - camera.origin - offset);\n    ray.time = camera.time0 + random(seed) * (camera.time1 - camera.time0);\n    return ray;\n}\n\nfn degreesToRadians(degrees: f32) -> f32 {\n    return degrees * PI / 180f;\n}\n\n// See https://www.reedbeta.com/blog/hash-functions-for-gpu-rendering/\nfn random(seed: ptr<function, u32>) -> f32 {\n    var random = ((*seed >> ((*seed >> 28u) + 4u)) ^ *seed) * 277803737u;\n    random = (random >> 22u) ^ random;\n    *seed = *seed * 747796405u + 2891336453u;\n    return f32(random) / 4294967295f; // [0,1]\n}\n\nfn randomInUnitDisk(seed: ptr<function, u32>) -> vec2<f32> {\n    var p: vec2<f32>;\n    loop {\n        p = 2f * vec2<f32>(random(seed), random(seed)) - vec2<f32>(1f, 1f);\n        if (dot(p, p) <= 1f) { break; }\n    }\n    return p;\n}\n\n// fn randomInUnitDisk(seed: ptr<function, u32>) -> vec2<f32> {\n//     let t = TWO_PI * random(seed);\n//     let r = sqrt(random(seed));\n//     return r * vec2<f32>(cos(t), sin(t));\n// }\n\nfn randomInUnitSphere(seed: ptr<function, u32>) -> vec3<f32> {\n    var p: vec3<f32>;\n    loop {\n        p = 2f * vec3<f32>(random(seed), random(seed), random(seed)) - vec3<f32>(1f, 1f, 1f);\n        if (dot(p, p) <= 1f) { break; }\n    }\n    return p;\n}\n\nfn randomUnitVector(seed: ptr<function, u32>) -> vec3<f32> {\n    return normalize(randomInUnitSphere(seed));\n}\n\n// fn randomUnitVector(seed: ptr<function, u32>) -> vec3<f32> {\n//     let theta = TWO_PI * random(seed); // [0,2Pi]\n//     let phi = acos(2f * random(seed) - 1f); // [-1,1]\n//     return vec3<f32>(sin(phi) * cos(theta), sin(phi) * sin(theta), cos(phi));\n// }\n\nfn rayAt(ray: Ray, t: f32) -> vec3<f32> {\n    return ray.origin + ray.direction * t;\n}\n\nfn setFaceNormal(ray: Ray, outwardNormal: vec3<f32>, hitRecord: ptr<function, HitRecord>) {\n    (*hitRecord).frontFace = dot(ray.direction, outwardNormal) < 0f;\n    (*hitRecord).normal = select(-outwardNormal, outwardNormal, (*hitRecord).frontFace);\n}\n\n// fn hitWorld(ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>, seed: ptr<function, u32>) -> bool {\n//     var hitAnything = false;\n//     var closestSoFar = tMax;\n//     let invDir = vec3<f32>(1f, 1f, 1f) / ray.direction;\n//     var tempHitRecord: HitRecord;\n//     for (var i: u32 = 0u; i < arrayLength(&hittableBuffer.hittables); i = i + 1u) {\n//         if (hit(i, ray, invDir, tMin, closestSoFar, &tempHitRecord, seed)) {\n//             hitAnything = true;\n//             closestSoFar = tempHitRecord.t;\n//             tempHitRecord.materialId = u32(hittableBuffer.hittables[i].materialId);\n//             *hitRecord = tempHitRecord;\n//         }\n//     }\n//     return hitAnything;\n// }\n\nfn hitBVH(ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>, seed: ptr<function, u32>) -> bool {\n    var hitAnything = false;\n    var closestSoFar = tMax;\n    let invDir = vec3<f32>(1f, 1f, 1f) / ray.direction;\n    var tempHitRecord: HitRecord;\n    var toVisitOffset = 0u;\n    var currentNodeIndex = 0u;\n    var nodesToVisit: array<u32, 64>;\n    loop {\n        let node = &linearBVHNodeBuffer.nodes[currentNodeIndex];\n        // Check ray against BVH node\n        if (intersectBox((*node).center, (*node).size, ray, invDir, tMin, closestSoFar)) {\n            let nPrimitives = u32((*node).nPrimitives);\n            if (nPrimitives > 0u) {\n                let primitiveOffset = u32((*node).primitivesOffset);\n                for (var i: u32 = 0u; i < nPrimitives; i = i + 1u) {\n                    let id = primitiveOffset + i;\n                    if (hit(id, ray, invDir, tMin, closestSoFar, &tempHitRecord, seed)) {\n                        hitAnything = true;\n                        closestSoFar = tempHitRecord.t;\n                        // tempHitRecord.materialId = u32(hittableBuffer.hittables[id].materialId);\n                        tempHitRecord.id = id;\n                    }\n                }\n                if (toVisitOffset == 0u) { break; }\n                toVisitOffset = toVisitOffset - 1u;\n                currentNodeIndex = nodesToVisit[toVisitOffset];\n            }\n            else {\n                // Put far BVH node on nodesToVisit stack, advance to near node\n                if (ray.direction[u32((*node).axis)] < 0f) {\n                   nodesToVisit[toVisitOffset] = currentNodeIndex + 1u;\n                   currentNodeIndex = u32((*node).secondChildOffset);\n                } else {\n                   nodesToVisit[toVisitOffset] = u32((*node).secondChildOffset);\n                   currentNodeIndex = currentNodeIndex + 1u;\n                }\n                toVisitOffset = toVisitOffset + 1u;\n            }\n        }\n        else {\n            if (toVisitOffset == 0u) { break; }\n            toVisitOffset = toVisitOffset - 1u;\n            currentNodeIndex = nodesToVisit[toVisitOffset];\n        }\n    }\n    if (hitAnything) {\n        tempHitRecord.previousId = (*hitRecord).id;\n        tempHitRecord.previousPosition = (*hitRecord).position;\n        tempHitRecord.previousIsAbsorbing = (*hitRecord).isAbsorbing;\n        tempHitRecord.previousAbsorption = (*hitRecord).absorption;\n        *hitRecord = tempHitRecord;\n        return true;\n    };\n    return false;\n}\n\nfn hit(id: u32, ray: Ray, invDir: vec3<f32>, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>, seed: ptr<function, u32>) -> bool {\n    switch u32(hittableBuffer.hittables[id].typeId) {\n        default: {\n            return false;\n        }\n        case 0u: {\n            return hitSphere(id, ray, tMin, tMax, hitRecord);\n        }\n        case 1u: {\n            return hitBox(id, ray, invDir, tMin, tMax, hitRecord);\n        }\n        case 2u: {\n            return hitCylinder(id, ray, tMin, tMax, hitRecord);\n        }\n        case 3u: {\n            return hitHexPrism(id, ray, tMin, tMax, hitRecord);\n        }\n        case 4u: {\n            return hitRotatedBox(id, ray, tMin, tMax, hitRecord);\n        }\n        case 5u: {\n            return hitXyRect(id, ray, tMin, tMax, hitRecord);\n        }\n        case 6u: {\n            return hitXzRect(id, ray, tMin, tMax, hitRecord);\n        }\n        // case 7u: {\n        //     return hitYzRect(hittable, ray, tMin, tMax, hitRecord);\n        // }\n        case 8u: {\n            return hitRotatedXyRect(id, ray, tMin, tMax, hitRecord);\n        }\n        case 9u: {\n            return hitFontXyRect(id, ray, tMin, tMax, hitRecord);\n        }\n        case 10u: {\n            return hitRotatedFontXyRect(id, ray, tMin, tMax, hitRecord);\n        }\n        case 11u: {\n            return hitBoxSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 12u: {\n            return hitCylinderSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 13u: {\n            return hitHexPrismSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 14u: {\n            return hitConstantMedium(id, ray, invDir, tMin, tMax, hitRecord, seed);\n        }\n        case 15u: {\n            return hitSdfXyRect(id, ray, tMin, tMax, hitRecord, seed);\n        }\n        case 16u: {\n            return hitRotatedSdfXyRect(id, ray, tMin, tMax, hitRecord, seed);\n        }\n        case 17u: {\n            return hitRotatedBoxSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 18u: {\n            return hitXyDisk(id, ray, tMin, tMax, hitRecord);\n        }\n        case 19u: {\n            return hitRotatedXyDisk(id, ray, tMin, tMax, hitRecord);\n        }\n        case 20u: {\n            return hitRingSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 21u: {\n            return hitRotatedRingSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 22u: {\n            return hitSphereSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 23u: {\n            return hitTubeSdf(id, ray, tMin, tMax, hitRecord);\n        }\n    }\n}\n\nfn intersectBox(center: vec3<f32>, size: vec3<f32>, ray: Ray, invDir: vec3<f32>, tMin: f32, tMax: f32) -> bool {\n    let oc = ray.origin - center;\n    let n = invDir * oc;\n    let k = abs(invDir) * size; // Box size is from center to edge\n    let t0 = -n - k;\n    let t1 = -n + k;\n    let tNear = max(max(t0.x, t0.y), t0.z);\n    let tFar = min(min(t1.x, t1.y), t1.z);\n    if (tNear > tFar) { return false; }\n    return tNear < tMax && tFar > 0f; // Must return true when inside box, even if closestSoFar is closer than far box intersection\n}\n\nfn hitConstantMedium(id: u32, ray: Ray, invDir: vec3<f32>, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>, seed: ptr<function, u32>) -> bool {\n    let constantMedium = &hittableBuffer.hittables[id];\n    let boundaryTypeId = u32((*constantMedium).boundaryTypeId);\n    var tempHitRecord1: HitRecord;\n    if (!hitConstantMediumBoundary(id, boundaryTypeId, ray, invDir, -100f, 100f, &tempHitRecord1)) { return false; }\n    var tempHitRecord2: HitRecord;\n    // When raymarching narrow grazing angles, adding SHADOW_OFFSET is < epsilon from surface, so hit function returns tN not tF, hence distanceInsideBoundary is incorrect\n    // Add larger distance to t\n    if (!hitConstantMediumBoundary(id, boundaryTypeId, ray, invDir, tempHitRecord1.t + 0.001f, 100f, &tempHitRecord2)) { return false; }\n    if (tempHitRecord1.t < tMin) { tempHitRecord1.t = tMin; }\n    if (tempHitRecord2.t > tMax) { tempHitRecord2.t = tMax; }\n    if (tempHitRecord1.t >= tempHitRecord2.t) {\n        return false;\n    }\n    tempHitRecord1.t = max(tempHitRecord1.t, 0f);\n    let distanceInsideBoundary = tempHitRecord2.t - tempHitRecord1.t;\n    // let negativeInverseDensity = -1f / materialBuffer.materials[u32((*constantMedium).materialId)].density;\n    let negativeInverseDensity = -1f / constantMedium.materialDensity;\n    let hitDistance = negativeInverseDensity * log(random(seed));\n    if (hitDistance > distanceInsideBoundary) { return false; }\n    let t = tempHitRecord1.t + hitDistance;\n    (*hitRecord).t = t;\n    (*hitRecord).position = rayAt(ray, t);\n    return true;\n}\n\nfn hitConstantMediumBoundary(id: u32, boundaryTypeId: u32, ray: Ray, invDir: vec3<f32>, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    switch boundaryTypeId {\n        default: {\n            return false;\n        }\n        case 0u: {\n            return hitSphere(id, ray, tMin, tMax, hitRecord);\n        }\n        case 1u: {\n            return hitBox(id, ray, invDir, tMin, tMax, hitRecord);\n        }\n        case 2u: {\n            return hitCylinder(id, ray, tMin, tMax, hitRecord);\n        }\n        case 3u: {\n            return hitHexPrism(id, ray, tMin, tMax, hitRecord);\n        }\n        case 4u: {\n            return hitRotatedBox(id, ray, tMin, tMax, hitRecord);\n        }\n        case 11u: {\n            return hitBoxSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 12u: {\n            return hitCylinderSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 13u: {\n            return hitHexPrismSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 17u: {\n            return hitRotatedBoxSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 20u: {\n            return hitRingSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 21u: {\n            return hitRotatedRingSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 22u: {\n            return hitSphereSdf(id, ray, tMin, tMax, hitRecord);\n        }\n        case 23u: {\n            return hitTubeSdf(id, ray, tMin, tMax, hitRecord);\n        }\n    }\n}\n\nfn hitSphere(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let sphere = &hittableBuffer.hittables[id];\n    let radius = (*sphere).size0.x;\n    let center = (*sphere).center0;\n    let oc = ray.origin - center;\n    let b = dot(oc, ray.direction);\n    let c = dot(oc, oc) - radius * radius;\n    var h = b * b - c;\n    if (h < 0f) { return false; }\n    h = sqrt(h);\n\n    // Find the nearest root in range\n    var root = -b - h;\n    if (root < tMin || root > tMax) {\n        root = -b + h;\n        if (root < tMin || root > tMax) { return false; }\n    }\n\n    // (*hitRecord).t = root;\n    // (*hitRecord).position = rayAt(ray, root);\n    // let outwardNormal = ((*hitRecord).position - center) / radius;\n    // setFaceNormal(ray, outwardNormal, hitRecord);\n\n    // Reduce precision error in t by ensuring hit position is on sphere surface\n    let outwardNormal = normalize(ray.origin + ray.direction * root - center);\n    setFaceNormal(ray, outwardNormal, hitRecord);\n    (*hitRecord).position = center + outwardNormal * radius; // Use outward normal with internal reflection\n    (*hitRecord).t = root; // I should also re-calculate t, but this would involve another normalization. t is only used to check closest hit, so only important with overlapping geometry\n\n    // UV\n    let phi = atan2(outwardNormal.x, outwardNormal.z); // [-pi,pi]\n    let theta = asin(outwardNormal.y); // [-pi/2, pi/2]\n    (*hitRecord).uv = vec2<f32>(phi / TWO_PI + 0.5f, theta / PI + 0.5f); // [0,1]\n    return true;\n}\n\nfn hitBox(id: u32, ray: Ray, invDir: vec3<f32>, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let box = &hittableBuffer.hittables[id];\n    let time =  min(max((ray.time - (*box).time0) / ((*box).time1 - (*box).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*box).center0 + time * ((*box).center1 - (*box).center0);\n    let size = (*box).size0 + time * ((*box).size1 - (*box).size0);\n    let oc = ray.origin - center;\n    let n = invDir * oc;\n    let k = abs(invDir) * size; // Box size is from center to edge\n    let t1 = -n - k;\n    let t2 = -n + k;\n    let tNear = max(max(t1.x, t1.y), t1.z);\n    let tFar = min(min(t2.x, t2.y), t2.z);\n    // if (tFar <= tNear) { return false; }\n    if (tNear > tFar || tFar < 0f) { return false; }\n\n    // Find nearest root in range\n    var outwardNormal: vec3<f32>;\n    var root = tNear;\n    if (root < tMin || root > tMax) {\n        root = tFar;\n        if (root < tMin || root > tMax) { return false; }\n        outwardNormal = sign(ray.direction) * step(t2.xyz, t2.yzx) * step(t2.xyz, t2.zxy);\n    }\n    else {\n        outwardNormal = -sign(ray.direction) * step(t1.yzx, t1.xyz) * step(t1.zxy, t1.xyz);\n    }\n\n    (*hitRecord).t = root;\n    (*hitRecord).position = rayAt(ray, root);\n    setFaceNormal(ray, outwardNormal, hitRecord);\n    return true;\n}\n\nfn hitRotatedBox(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let rotatedBox = &hittableBuffer.hittables[id];\n    let time =  min(max((ray.time - (*rotatedBox).time0) / ((*rotatedBox).time1 - (*rotatedBox).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*rotatedBox).center0 + time * ((*rotatedBox).center1 - (*rotatedBox).center0);\n    let rotation = slerpQuat((*rotatedBox).rotation0, (*rotatedBox).rotation1, time);\n    let invRotation = conjugate(rotation);\n    var rotatedRay: Ray;\n    rotatedRay.origin = rotateQuat(ray.origin - center, invRotation) + center;\n    rotatedRay.direction = rotateQuat(ray.direction, invRotation);\n    rotatedRay.time = ray.time;\n    let rotatedInvDir = vec3<f32>(1f, 1f, 1f) / rotatedRay.direction;\n    let hit = hitBox(id, rotatedRay, rotatedInvDir, tMin, tMax, hitRecord);\n    if (hit) {\n        (*hitRecord).position = rotateQuat((*hitRecord).position - center, rotation) + center;\n        (*hitRecord).normal = rotateQuat((*hitRecord).normal, rotation);\n        return true;\n    }\n    return false;\n}\n\nfn hitXyDisk(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let xyDisk = &hittableBuffer.hittables[id];\n    let oc = ray.origin - (*xyDisk).center0;\n\n    // Distance to plane, t\n    let t = -oc.z / ray.direction.z;\n\n    // If direction == 0, t = +/- infinity, which always returns false\n    if (t < tMin || t > tMax) { return false; }\n\n    // Intersection point in model space\n    let p = oc + t * ray.direction;\n\n    // Bounds\n    let radius = (*xyDisk).size0.x;\n    if (dot(p, p) > radius * radius) { return false; } // dot(p, p) is squared distance from disk center to intersection point\n\n    // Texture coords\n    var uv = vec2<f32>(0.5 * p.xy / radius + vec2<f32>(0.5f, 0.5f));\n    let texCoord0 = (*xyDisk).texCoord0;\n    let texCoord1 = (*xyDisk).texCoord1;\n    uv = texCoord0 + uv * (texCoord1 - texCoord0);\n\n    (*hitRecord).uv = uv;\n    (*hitRecord).t = t;\n    (*hitRecord).position = rayAt(ray, t);\n    let outwardNormal = vec3<f32>(0f, 0f, 1f);\n    setFaceNormal(ray, outwardNormal, hitRecord);\n    return true;\n}\n\nfn hitRotatedXyDisk(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let rotatedXyDisk = &hittableBuffer.hittables[id];\n    // let center = (*rotatedXyDisk).center0;\n    let time =  min(max((ray.time - (*rotatedXyDisk).time0) / ((*rotatedXyDisk).time1 - (*rotatedXyDisk).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*rotatedXyDisk).center0 + time * ((*rotatedXyDisk).center1 - (*rotatedXyDisk).center0);\n    let rotation = slerpQuat((*rotatedXyDisk).rotation0, (*rotatedXyDisk).rotation1, time);\n    let invRotation = conjugate(rotation);\n    var rotatedRay: Ray;\n    rotatedRay.origin = rotateQuat(ray.origin - center, invRotation) + center;\n    rotatedRay.direction = rotateQuat(ray.direction, invRotation);\n    rotatedRay.time = ray.time;\n    let hit = hitXyDisk(id, rotatedRay, tMin, tMax, hitRecord);\n    if (hit) {\n        (*hitRecord).position = rotateQuat((*hitRecord).position - center, rotation) + center;\n        (*hitRecord).normal = rotateQuat((*hitRecord).normal, rotation);\n        return true;\n    }\n    return false;\n}\n\nfn hitXyRect(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let xyRect = &hittableBuffer.hittables[id];\n    let oc = ray.origin - (*xyRect).center0;\n\n    // Distance to plane, t\n    let t = -oc.z / ray.direction.z;\n\n    // If direction == 0, t = +/- infinity, which always returns false\n    if (t < tMin || t > tMax) { return false; }\n\n    // Intersection point in model space\n    let p = oc + t * ray.direction;\n\n    // Bounds\n    let size = (*xyRect).size0;\n    if (abs(p.x) > size.x || abs(p.y) > size.y) { return false; }\n\n    // Texture coords\n    var uv = vec2<f32>(0.5 * p.xy / size.xy + vec2<f32>(0.5f, 0.5f));\n    let texCoord0 = (*xyRect).texCoord0;\n    let texCoord1 = (*xyRect).texCoord1;\n    uv = texCoord0 + uv * (texCoord1 - texCoord0);\n\n    (*hitRecord).uv = uv;\n    (*hitRecord).t = t;\n    (*hitRecord).position = rayAt(ray, t);\n    let outwardNormal = vec3<f32>(0f, 0f, 1f);\n    setFaceNormal(ray, outwardNormal, hitRecord);\n    return true;\n}\n\nfn hitRotatedXyRect(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let rotatedXyRect = &hittableBuffer.hittables[id];\n    // let center = (*rotatedXyRect).center0;\n    let time =  min(max((ray.time - (*rotatedXyRect).time0) / ((*rotatedXyRect).time1 - (*rotatedXyRect).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*rotatedXyRect).center0 + time * ((*rotatedXyRect).center1 - (*rotatedXyRect).center0);\n    let rotation = slerpQuat((*rotatedXyRect).rotation0, (*rotatedXyRect).rotation1, time);\n    let invRotation = conjugate(rotation);\n    var rotatedRay: Ray;\n    rotatedRay.origin = rotateQuat(ray.origin - center, invRotation) + center;\n    rotatedRay.direction = rotateQuat(ray.direction, invRotation);\n    rotatedRay.time = ray.time;\n    let hit = hitXyRect(id, rotatedRay, tMin, tMax, hitRecord);\n    if (hit) {\n        (*hitRecord).position = rotateQuat((*hitRecord).position - center, rotation) + center;\n        (*hitRecord).normal = rotateQuat((*hitRecord).normal, rotation);\n        return true;\n    }\n    return false;\n}\n\nfn hitXzRect(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let xzRect = &hittableBuffer.hittables[id];\n    let oc = ray.origin - (*xzRect).center0;\n\n    // Distance to plane, t\n    let t = -oc.y / ray.direction.y;\n\n    // If direction == 0, t = +/- infinity, which always returns false\n    if (t < tMin || t > tMax) { return false; }\n\n    // Intersection point in model space\n    let p = oc + t * ray.direction;\n\n    // Bounds\n    let size = (*xzRect).size0;\n    if (abs(p.x) > size.x || abs(p.z) > size.z) { return false; }\n\n    // Texture coords\n    var uv = vec2<f32>(0.5 * p.xz / size.xz + vec2<f32>(0.5f, 0.5f));\n    let texCoord0 = (*xzRect).texCoord0;\n    let texCoord1 = (*xzRect).texCoord1;\n    uv = texCoord0 + uv * (texCoord1 - texCoord0);\n\n    (*hitRecord).uv = uv;\n    (*hitRecord).t = t;\n    (*hitRecord).position = rayAt(ray, t);\n    let outwardNormal = vec3<f32>(0f, 1f, 0f);\n    setFaceNormal(ray, outwardNormal, hitRecord);\n    return true;\n}\n\n// fn hitYzRect(yzRect: Hittable, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n//     let oc = ray.origin - yzRect.center0;\n\n//     // Distance to plane, t\n//     let t = -oc.x / ray.direction.x;\n\n//     // If direction == 0, t = +/- infinity, which always returns false\n//     if (t < tMin || t > tMax) { return false; }\n\n//     // Intersection point in model space\n//     let p = oc + t * ray.direction;\n\n//     // Bounds\n//     if (abs(p.y) > yzRect.size0.y || abs(p.z) > yzRect.size0.z) { return false; }\n\n//     // Texture coords\n//     var uv = vec2<f32>(0.5 * p.yz / yzRect.size0.yz + vec2<f32>(0.5f, 0.5f));\n//     uv = yzRect.texCoord0 + uv * (yzRect.texCoord1 - yzRect.texCoord0);\n\n//     (*hitRecord).uv = uv;\n//     (*hitRecord).t = t;\n//     (*hitRecord).position = rayAt(ray, t);\n//     let outwardNormal = vec3<f32>(1f, 0f, 0f);\n//     setFaceNormal(ray, outwardNormal, hitRecord);\n//     return true;\n// }\n\n// TODO: Share hit function with XyRect\nfn hitFontXyRect(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let xyRect = &hittableBuffer.hittables[id];\n\n    // let oc = ray.origin - (*xyRect).center0;\n    let time =  min(max((ray.time - (*xyRect).time0) / ((*xyRect).time1 - (*xyRect).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*xyRect).center0 + time * ((*xyRect).center1 - (*xyRect).center0);\n    let oc = ray.origin - center;\n\n    // Distance to plane, t\n    let t = -oc.z / ray.direction.z;\n\n    // If direction == 0, t = +/- infinity, which always returns false\n    if (t < tMin || t > tMax) { return false; }\n\n    // Intersection point in model space\n    let p = oc + t * ray.direction;\n\n    // Bounds\n    let size = (*xyRect).size0;\n    if (abs(p.x) > size.x || abs(p.y) > size.y) { return false; }\n\n    // Texture coords\n    var uv = vec2<f32>(0.5 * p.xy / size.xy + vec2<f32>(0.5f, 0.5f));\n    let texCoord0 = (*xyRect).texCoord0;\n    let texCoord1 = (*xyRect).texCoord1;\n    uv = texCoord0 + uv * (texCoord1 - texCoord0);\n\n    // Sample sdf\n    let buffer = xyRect.sdfBuffer / 0xff;\n    let r = textureSampleLevel(fontTexture, linearSampler, uv, 0f).r;\n    if (r < buffer) { return false; }\n\n    (*hitRecord).uv = uv;\n    (*hitRecord).t = t;\n    (*hitRecord).position = rayAt(ray, t);\n    let outwardNormal = vec3<f32>(0f, 0f, 1f);\n    setFaceNormal(ray, outwardNormal, hitRecord);\n    return true;\n}\n\nfn hitRotatedFontXyRect(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let rotatedXyRect = &hittableBuffer.hittables[id];\n    // let center = (*rotatedXyRect).center0;\n    let time =  min(max((ray.time - (*rotatedXyRect).time0) / ((*rotatedXyRect).time1 - (*rotatedXyRect).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*rotatedXyRect).center0 + time * ((*rotatedXyRect).center1 - (*rotatedXyRect).center0);\n    let rotation = slerpQuat((*rotatedXyRect).rotation0, (*rotatedXyRect).rotation1, time);\n    let invRotation = conjugate(rotation);\n    var rotatedRay: Ray;\n    rotatedRay.origin = rotateQuat(ray.origin - center, invRotation) + center;\n    rotatedRay.direction = rotateQuat(ray.direction, invRotation);\n    rotatedRay.time = ray.time;\n    let hit = hitFontXyRect(id, rotatedRay, tMin, tMax, hitRecord);\n    if (hit) {\n        (*hitRecord).position = rotateQuat((*hitRecord).position - center, rotation) + center;\n        (*hitRecord).normal = rotateQuat((*hitRecord).normal, rotation);\n        return true;\n    }\n    return false;\n}\n\n// TODO: Share hit function with FontXyRect, specifying texture\nfn hitSdfXyRect(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>, seed: ptr<function, u32>) -> bool {\n    let xyRect = &hittableBuffer.hittables[id];\n\n    // let oc = ray.origin - (*xyRect).center0;\n    let time =  min(max((ray.time - (*xyRect).time0) / ((*xyRect).time1 - (*xyRect).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*xyRect).center0 + time * ((*xyRect).center1 - (*xyRect).center0);\n    let oc = ray.origin - center;\n\n    // Distance to plane, t\n    let t = -oc.z / ray.direction.z;\n\n    // If direction == 0, t = +/- infinity, which always returns false\n    if (t < tMin || t > tMax) { return false; }\n\n    // Intersection point in model space\n    let p = oc + t * ray.direction;\n\n    // Bounds\n    // let size = (*xyRect).size0;\n    let size = (*xyRect).size0 + time * ((*xyRect).size1 - (*xyRect).size0);\n    if (abs(p.x) > (*xyRect).size0.x || abs(p.y) > (*xyRect).size0.y) { return false; }\n\n    // Zero-thickness transparency\n    // TODO: Pre-multiplied alpha\n    // if (random(seed) > 0.5f) { return false; }\n\n    // Texture coords\n    var uv = vec2<f32>(0.5 * p.xy / size.xy + vec2<f32>(0.5f, 0.5f));\n    let texCoord0 = (*xyRect).texCoord0;\n    let texCoord1 = (*xyRect).texCoord1;\n    uv = texCoord0 + uv * (texCoord1 - texCoord0);\n\n    // Sample sdf\n    let buffer = xyRect.sdfBuffer / 0xff;\n    // let r = textureSampleLevel(atlasTexture, linearSampler, uv, 0f).r;\n    var r: f32;\n    if ((*xyRect).texId == 0f) {\n        r = textureSampleLevel(atlasTexture, linearSampler, uv, 0f).r;\n    }\n    else {\n        r = textureSampleLevel(fontTexture, linearSampler, uv, 0f).r;\n    }\n    if (r < buffer) { return false; }\n\n    // sdfBorder\n    let border = xyRect.sdfBorder / 0xff;\n    (*hitRecord).sdfBorder = r - buffer < border;\n\n    (*hitRecord).uv = uv;\n    (*hitRecord).t = t;\n    (*hitRecord).position = rayAt(ray, t);\n    let outwardNormal = vec3<f32>(0f, 0f, 1f);\n    setFaceNormal(ray, outwardNormal, hitRecord);\n    return true;\n}\n\nfn hitRotatedSdfXyRect(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>, seed: ptr<function, u32>) -> bool {\n    let rotatedXyRect = &hittableBuffer.hittables[id];\n    // let center = (*rotatedXyRect).center0;\n    let time =  min(max((ray.time - (*rotatedXyRect).time0) / ((*rotatedXyRect).time1 - (*rotatedXyRect).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*rotatedXyRect).center0 + time * ((*rotatedXyRect).center1 - (*rotatedXyRect).center0);\n    let rotation = slerpQuat((*rotatedXyRect).rotation0, (*rotatedXyRect).rotation1, time);\n    let invRotation = conjugate(rotation);\n    var rotatedRay: Ray;\n    rotatedRay.origin = rotateQuat(ray.origin - center, invRotation) + center;\n    rotatedRay.direction = rotateQuat(ray.direction, invRotation);\n    rotatedRay.time = ray.time;\n    let hit = hitSdfXyRect(id, rotatedRay, tMin, tMax, hitRecord, seed);\n    if (hit) {\n        (*hitRecord).position = rotateQuat((*hitRecord).position - center, rotation) + center;\n        (*hitRecord).normal = rotateQuat((*hitRecord).normal, rotation);\n        return true;\n    }\n    return false;\n}\n\nfn rotateQuat(v: vec3<f32>, q: vec4<f32>) -> vec3<f32> {\n    return v + 2f * cross(q.xyz, cross(q.xyz, v) + q.w * v);\n}\n\nfn slerpQuat(q0: vec4<f32>, q1: vec4<f32>, t: f32) -> vec4<f32> {\n    var cosom = dot(q0, q1);\n    var q2 = q1;\n\tif (cosom < 0f) {\n\t\tcosom = -cosom;\n\t\tq2 = -q2;\n\t}\n\tvar s0: f32;\n    var s1: f32;\n\tif (1f - cosom > 0.000001f) {\n\t\t// SLERP\n\t\tlet omega = acos(cosom);\n\t\tlet sinom = sin(omega);\n\t\ts0 = sin((1f - t) * omega) / sinom;\n\t\ts1 = sin(t * omega) / sinom;\n\t}\n\telse {\n\t\t// Quaternions close enough for LERP\n\t\ts0 = 1f - t;\n\t\ts1 = t;\n\t}\n\treturn s0 * q0 + s1 * q2;\n}\n\nfn conjugate(q: vec4<f32>) -> vec4<f32> {\n    return vec4<f32>(-q.x, -q.y, -q.z, q.w);\n}\n\nfn hitCylinder(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let cylinder = &hittableBuffer.hittables[id];\n    let time =  min(max((ray.time - (*cylinder).time0) / ((*cylinder).time1 - (*cylinder).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*cylinder).center0 + time * ((*cylinder).center1 - (*cylinder).center0);\n    let size = (*cylinder).size0 + time * ((*cylinder).size1 - (*cylinder).size0);\n    let rotation = slerpQuat((*cylinder).rotation0, (*cylinder).rotation1, time);\n    let ra = size.x; // Radius\n    let ca = rotateQuat(vec3<f32>(0f, 1f, 0f), rotation);\n    let oc = ray.origin - center;\n    let card = dot(ca, ray.direction);\n    let caoc = dot(ca, oc);\n    let a = 1f - card * card;\n    let b = dot(oc, ray.direction) - caoc * card;\n    let c = dot(oc, oc) - caoc * caoc - ra * ra;\n    var h = b * b - a * c;\n    if (h < 0f) { return false; }\n    h = sqrt(h);\n    let br0 = (-b - h) / a;\n    let br1 = (-b + h) / a;\n\n    // Body\n    let ch = size.y; // Half-height\n    let y0 = caoc + br0 * card;\n    let y1 = caoc + br1 * card;\n    let bt0 = select(10000000f, br0, abs(y0) < ch);\n    let bt1 = select(-10000000f, br1, abs(y1) < ch);\n\n    // Caps\n    let sy0 = sign(y0);\n    let sy1 = sign(y1);\n    let cr0 = (sy0 * ch - caoc) / card;\n    let cr1 = (sy1 * ch - caoc) / card;\n    let ct0 = select(10000000f, cr0, abs(b + a * cr0) < h);\n    let ct1 = select(-10000000f, cr1, abs(b + a * cr1) < h);\n\n    // Find the nearest root in range\n    let tN = min(bt0, ct0);\n    let tF = max(bt1, ct1);\n    var root = tN;\n    if (root < tMin || root > tMax) {\n        root = tF;\n        if (root < tMin || root > tMax) { return false; }\n    }\n\n    // Normal\n    var outwardNormal: vec3<f32>;\n    if (root == bt0 || root == bt1) {\n        let y = select(y1, y0, root == bt0);\n        // outwardNormal = (oc + root * ray.direction - ca * y) / ra;\n\n        // Reduce precision error in t by ensuring hit position is on cylinder surface\n        outwardNormal = normalize(oc + root * ray.direction - ca * y);\n        setFaceNormal(ray, outwardNormal, hitRecord);\n        (*hitRecord).position = center + ca * y + outwardNormal * ra; // Use outward normal with internal reflection\n        (*hitRecord).t = root;\n    }\n    else {\n        let sy = select(sy1, sy0, root == ct0);\n        outwardNormal = ca * sy;\n\n        // TODO: Reduce precision error\n        setFaceNormal(ray, outwardNormal, hitRecord);\n        (*hitRecord).position = rayAt(ray, root);\n        (*hitRecord).t = root;\n    }\n\n    // setFaceNormal(ray, outwardNormal, hitRecord);\n    // (*hitRecord).position = rayAt(ray, root);\n    // (*hitRecord).t = root;\n    return true;\n}\n\nfn hitHexPrism(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let hexPrism = &hittableBuffer.hittables[id];\n    let time =  min(max((ray.time - (*hexPrism).time0) / ((*hexPrism).time1 - (*hexPrism).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*hexPrism).center0 + time * ((*hexPrism).center1 - (*hexPrism).center0);\n    let oc = ray.origin - center;\n    let size = (*hexPrism).size0;\n    let ra = size.x; // Distance from center to edge\n    let he = size.y; // Half-height\n    let rd = ray.direction;\n\n    // Normals\n    let n1 = vec3<f32>(1f, 0f, 0f);\n    let n2 = vec3<f32>(0.5f, 0f, ROOT_THREE_OVER_TWO);\n    let n3 = vec3<f32>(-0.5f, 0f, ROOT_THREE_OVER_TWO);\n    let n4 = vec3<f32>(0f, 1f, 0f);\n\n    // Slabs intersections\n    var t1 = vec3<f32>((vec2<f32>(ra, -ra) - dot(oc, n1)) / dot(rd, n1), 1f);\n    var t2 = vec3<f32>((vec2<f32>(ra, -ra) - dot(oc, n2)) / dot(rd, n2), 1f);\n    var t3 = vec3<f32>((vec2<f32>(ra, -ra) - dot(oc, n3)) / dot(rd, n3), 1f);\n    var t4 = vec3<f32>((vec2<f32>(he, -he) - dot(oc, n4)) / dot(rd, n4), 1f);\n\n    // Inetsection selection\n    if (t1.y < t1.x) { t1 = vec3<f32>(t1.yx, -1f); }\n    if (t2.y < t2.x) { t2 = vec3<f32>(t2.yx, -1f); }\n    if (t3.y < t3.x) { t3 = vec3<f32>(t3.yx, -1f); }\n    if (t4.y < t4.x) { t4 = vec3<f32>(t4.yx, -1f); }\n\n    var tN = vec4<f32>(t1.x, t1.z * n1);\n    if (t2.x > tN.x) { tN = vec4<f32>(t2.x, t2.z * n2); }\n    if (t3.x > tN.x) { tN = vec4<f32>(t3.x, t3.z * n3); }\n    if (t4.x > tN.x) { tN = vec4<f32>(t4.x, t4.z * n4); }\n\n    let tF = min(min(t1.y,t2.y),min(t3.y,t4.y));\n\n    if (tN.x > tF || tF < 0f) { return false; }\n\n    // Find the nearest root in range\n    var outwardNormal: vec3<f32>;\n    var root = tN.x;\n    if (root < tMin || root > tMax) {\n        root = tF;\n        if (root < tMin || root > tMax) { return false; }\n\n        // Normal\n        if (root == t1.y) { outwardNormal = -t1.z * n1; }\n        else if (root == t2.y) { outwardNormal = -t2.z * n2; }\n        else if (root == t3.y) { outwardNormal = -t3.z * n3; }\n        else if (root == t4.y) { outwardNormal = -t4.z * n4; }\n    }\n    else {\n        outwardNormal = tN.yzw;\n    }\n\n    (*hitRecord).t = root;\n    (*hitRecord).position = rayAt(ray, root);\n    setFaceNormal(ray, outwardNormal, hitRecord);\n    return true;\n}\n\nfn mapBoxSdf(p: vec3<f32>, b: vec3<f32>, r: f32) -> f32 {\n    let q = abs(p) - b;\n    return length(max(q, vec3<f32>(0f, 0f, 0f))) + min(max(q.x, max(q.y, q.z)), 0f) - r;\n}\n\n// Box frame\n// fn mapBoxSdf(p: vec3<f32>, b: vec3<f32>, r: f32) -> f32 {\n//     let s = abs(p) - b;\n//     // let e = b.y / 3f;\n//     let e = 0.0002f;\n//     let q = abs(s + e) - e;\n//     return min(min(\n//       length(max(vec3<f32>(s.x, q.y, q.z), vec3<f32>(0f, 0f, 0f))) + min(max(s.x, max(q.y,q.z)), 0f),\n//       length(max(vec3<f32>(q.x, s.y, q.z), vec3<f32>(0f, 0f, 0f))) + min(max(q.x, max(s.y,q.z)), 0f)),\n//       length(max(vec3<f32>(q.x, q.y, s.z), vec3<f32>(0f, 0f, 0f))) + min(max(q.x, max(q.y,s.z)), 0f));\n// }\n\nfn hitBoxSdf(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let boxSdf = &hittableBuffer.hittables[id];\n    var t = tMin;\n    let r = (*boxSdf).rounding;\n    // let size = (*boxSdf).size0 - r;\n    let time =  min(max((ray.time - (*boxSdf).time0) / ((*boxSdf).time1 - (*boxSdf).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*boxSdf).center0 + time * ((*boxSdf).center1 - (*boxSdf).center0);\n    // TODO: r0, r1\n    let size = (*boxSdf).size0 + time * ((*boxSdf).size1 - (*boxSdf).size0) - r;\n    for (var i: u32 = 0u; i < 256u; i = i + 1u) {\n        let position = rayAt(ray, t);\n        let oc = position - center;\n        let distance = abs(mapBoxSdf(oc, size, r));\n        t = t + distance;\n        if (t > tMax) { return false; }\n        if (distance < 0.000001f) {\n            (*hitRecord).t = t;\n            (*hitRecord).position = rayAt(ray, t);\n\n            // Normal\n            let h = 0.000001f; // replace by an appropriate value\n            let k = vec2<f32>(1f, -1f);\n            let outwardNormal =  normalize(\n                k.xyy * mapBoxSdf(oc + k.xyy * h, size, r) +\n                k.yyx * mapBoxSdf(oc + k.yyx * h, size, r) +\n                k.yxy * mapBoxSdf(oc + k.yxy * h, size, r) +\n                k.xxx * mapBoxSdf(oc + k.xxx * h, size, r));\n            setFaceNormal(ray, outwardNormal, hitRecord);\n            return true;\n        }\n    }\n    return false;\n}\n\nfn mapSphereSdf(p: vec3<f32>, r: f32) -> f32 {\n    return length(p) - r;\n}\n\nfn hitSphereSdf(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let sphereSdf = &hittableBuffer.hittables[id];\n    var t = tMin;\n    let center = (*sphereSdf).center0;\n    let r = (*sphereSdf).size0.x;\n    for (var i: u32 = 0u; i < 256u; i = i + 1u) {\n        let position = rayAt(ray, t);\n        let oc = position - center;\n        let distance = abs(mapSphereSdf(oc, r));\n        t = t + distance;\n        if (t > tMax) { return false; }\n        if (distance < 0.000001f) {\n            (*hitRecord).t = t;\n            (*hitRecord).position = rayAt(ray, t);\n\n            // Normal\n            let h = 0.000001f; // replace by an appropriate value\n            let k = vec2<f32>(1f, -1f);\n            let outwardNormal =  normalize(\n                k.xyy * mapSphereSdf(oc + k.xyy * h, r) +\n                k.yyx * mapSphereSdf(oc + k.yyx * h, r) +\n                k.yxy * mapSphereSdf(oc + k.yxy * h, r) +\n                k.xxx * mapSphereSdf(oc + k.xxx * h, r));\n            setFaceNormal(ray, outwardNormal, hitRecord);\n            return true;\n        }\n    }\n    return false;\n}\n\nfn hitRotatedBoxSdf(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let rotatedBoxSdf = &hittableBuffer.hittables[id];\n    let time =  min(max((ray.time - (*rotatedBoxSdf).time0) / ((*rotatedBoxSdf).time1 - (*rotatedBoxSdf).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*rotatedBoxSdf).center0 + time * ((*rotatedBoxSdf).center1 - (*rotatedBoxSdf).center0);\n    let rotation = slerpQuat((*rotatedBoxSdf).rotation0, (*rotatedBoxSdf).rotation1, time);\n    let invRotation = conjugate(rotation);\n    var rotatedRay: Ray;\n    rotatedRay.origin = rotateQuat(ray.origin - center, invRotation) + center;\n    rotatedRay.direction = rotateQuat(ray.direction, invRotation);\n    rotatedRay.time = ray.time;\n    let hit = hitBoxSdf(id, rotatedRay, tMin, tMax, hitRecord);\n    if (hit) {\n        (*hitRecord).position = rotateQuat((*hitRecord).position - center, rotation) + center;\n        (*hitRecord).normal = rotateQuat((*hitRecord).normal, rotation);\n        return true;\n    }\n    return false;\n}\n\nfn mapCylinderSdf(p: vec3<f32>, a: vec3<f32>, b: vec3<f32>, r0: f32, r1: f32) -> f32 {\n    let ba: vec3<f32> = b - a;\n    let pa: vec3<f32> = p - a;\n    let baba: f32 = dot(ba, ba);\n    let paba: f32 = dot(pa, ba);\n    let x: f32 = length(pa * baba - ba * paba) - r0 * baba;\n    let y: f32 = abs(paba - baba * 0.5f) - baba * 0.5f;\n    let x2: f32 = x * x;\n    let y2: f32 = y * y * baba;\n    // let d: f32 = (max(x, y) < 0f) ? -min(x2, y2) : (((x > 0f) ? x2 : 0f) + ((y > 0f) ? y2 : 0f));\n    let d: f32 = select(select(0f, x2, x > 0f) + select(0f, y2, y > 0f), -min(x2, y2), max(x, y) < 0f);\n    return sign(d) * sqrt(abs(d)) / baba - r1;\n}\n\nfn hitCylinderSdf(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let cylinderSdf = &hittableBuffer.hittables[id];\n    let time =  min(max((ray.time - (*cylinderSdf).time0) / ((*cylinderSdf).time1 - (*cylinderSdf).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*cylinderSdf).center0 + time * ((*cylinderSdf).center1 - (*cylinderSdf).center0);\n    let size = (*cylinderSdf).size0 + time * ((*cylinderSdf).size1 - (*cylinderSdf).size0);\n    let rotation = slerpQuat((*cylinderSdf).rotation0, (*cylinderSdf).rotation1, time);\n    var t = tMin;\n    let r1 = (*cylinderSdf).rounding;\n    let r0 = size.x - r1;\n    let h0 = size.y - r1;\n    let ca = rotateQuat(vec3<f32>(0f, 1f, 0f), rotation);\n    let pa = ca * h0;\n    let pb = -pa;\n    for (var i: u32 = 0u; i < 256u; i = i + 1u) {\n        let position = rayAt(ray, t);\n        let oc = position - center;\n        let distance = abs(mapCylinderSdf(oc, pa, pb, r0, r1));\n        t = t + distance;\n        if (t > tMax) { return false; }\n        if (distance < 0.000001f) {\n            (*hitRecord).t = t;\n            (*hitRecord).position = rayAt(ray, t);\n\n            // Normal\n            let h = 0.000001f; // replace by an appropriate value\n            let k = vec2<f32>(1f, -1f);\n            let outwardNormal =  normalize(\n                k.xyy * mapCylinderSdf(oc + k.xyy * h, pa, pb, r0, r1) +\n                k.yyx * mapCylinderSdf(oc + k.yyx * h, pa, pb, r0, r1) +\n                k.yxy * mapCylinderSdf(oc + k.yxy * h, pa, pb, r0, r1) +\n                k.xxx * mapCylinderSdf(oc + k.xxx * h, pa, pb, r0, r1));\n            setFaceNormal(ray, outwardNormal, hitRecord);\n            return true;\n        }\n    }\n    return false;\n}\n\nfn mapHexPrismSdf(p: vec3<f32>, hx: f32, hy: f32, r: f32) -> f32 {\n    let k = vec3<f32>(-0.8660254, 0.5, 0.57735); // (-sqrt(3)/2 or sin(60), 0.5, sqrt(3)/3 or tan(30))\n    var p0 = abs(p.zxy);\n    let p1 = p0.xy - 2f * min(dot(k.xy, p0.xy), 0f) * k.xy;\n    let d = vec2<f32>(length(p1.xy - vec2(clamp(p1.x, -k.z * hx, k.z * hx), hx)) * sign(p1.y - hx), p0.z - hy);\n    return min(max(d.x, d.y), 0f) + length(max(d, vec2<f32>(0f, 0f))) - r;\n}\n\nfn hitHexPrismSdf(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let hexPrismSdf = &hittableBuffer.hittables[id];\n    var t = tMin;\n    let r = (*hexPrismSdf).rounding;\n    let size = (*hexPrismSdf).size0;\n    let time =  min(max((ray.time - (*hexPrismSdf).time0) / ((*hexPrismSdf).time1 - (*hexPrismSdf).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*hexPrismSdf).center0 + time * ((*hexPrismSdf).center1 - (*hexPrismSdf).center0);\n    let hx = size.x - r;\n    let hy = size.y - r;\n    for (var i: u32 = 0u; i < 256u; i = i + 1u) {\n        let position = rayAt(ray, t);\n        let oc = position - center;\n        let distance = abs(mapHexPrismSdf(oc, hx, hy, r));\n        t = t + distance;\n        if (t > tMax) { return false; }\n        if (distance < 0.000001f) {\n            (*hitRecord).t = t;\n            (*hitRecord).position = rayAt(ray, t);\n\n            // Normal\n            let h = 0.000001f; // Replace by an appropriate value\n            let k = vec2<f32>(1f, -1f);\n            let outwardNormal =  normalize(\n                k.xyy * mapHexPrismSdf(oc + k.xyy * h, hx, hy, r) +\n                k.yyx * mapHexPrismSdf(oc + k.yyx * h, hx, hy, r) +\n                k.yxy * mapHexPrismSdf(oc + k.yxy * h, hx, hy, r) +\n                k.xxx * mapHexPrismSdf(oc + k.xxx * h, hx, hy, r));\n            setFaceNormal(ray, outwardNormal, hitRecord);\n            return true;\n        }\n    }\n    return false;\n}\n\nfn mapRingSdf(p: vec3<f32>, n: vec2<f32>, r: f32, th: f32, h: f32, rounding: f32) -> f32 {\n    let px = abs(p.x);\n    // expand result of mat2x2(n.x,n.y,-n.y,n.x)*p;\n    // let p2 = vec2<f32>(n.x * px + n.y * p.y, -n.y * px + n.x * p.y);\n    // Column-major instead of row-major\n    let p2 = vec2<f32>(n.x * px - n.y * p.y, n.y * px + n.x * p.y);\n    let d = max(abs(length(p2) - r) - th * 0.5f, length(vec2<f32>(p2.x, max(0f, abs(r - p2.y) - th * 0.5f))) * sign(p2.x));\n\n    // Extrude\n    let w = vec2<f32>(d, abs(p.z) - h);\n  \treturn min(max(w.x, w.y), 0f) + length(max(w, vec2<f32>(0f, 0f))) - rounding;\n}\n\nfn hitRingSdf(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let ringSdf = &hittableBuffer.hittables[id];\n    var t = tMin;\n    let size = (*ringSdf).size0;\n    let center = (*ringSdf).center0;\n    let rounding = (*ringSdf).rounding;\n    let outerr = size.x;\n    let innerr = size.y;\n    // Reduce angle such that inner radius arc reduces by rounding\n    var angle = (*ringSdf).parameter1;\n    angle -= angle * rounding /  innerr * PI * 2;\n    let cs = vec2<f32>(cos(angle), sin(angle));\n    let r = (outerr + innerr) * 0.5f;\n    let th = (outerr - innerr) - rounding;\n    let e = size.z - rounding;\n    for (var i: u32 = 0u; i < 256u; i = i + 1u) {\n        let position = rayAt(ray, t);\n        let oc = position - center;\n        let distance = abs(mapRingSdf(oc, cs, r, th, e, rounding));\n        t = t + distance;\n        if (t > tMax) { return false; }\n        if (distance < 0.000001f) {\n            (*hitRecord).t = t;\n            (*hitRecord).position = rayAt(ray, t);\n\n            // Normal\n            let h = 0.00001f; // replace by an appropriate value\n            let k = vec2<f32>(1f, -1f);\n            let outwardNormal =  normalize(\n                k.xyy * mapRingSdf(oc + k.xyy * h, cs, r, th, e, rounding) +\n                k.yyx * mapRingSdf(oc + k.yyx * h, cs, r, th, e, rounding) +\n                k.yxy * mapRingSdf(oc + k.yxy * h, cs, r, th, e, rounding) +\n                k.xxx * mapRingSdf(oc + k.xxx * h, cs, r, th, e, rounding));\n            setFaceNormal(ray, outwardNormal, hitRecord);\n            return true;\n        }\n    }\n    return false;\n}\n\nfn hitRotatedRingSdf(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let rotatedRingSdf = &hittableBuffer.hittables[id];\n    let time =  min(max((ray.time - (*rotatedRingSdf).time0) / ((*rotatedRingSdf).time1 - (*rotatedRingSdf).time0), 0f), 1f); // Normalize time to [0,1]\n    let center = (*rotatedRingSdf).center0 + time * ((*rotatedRingSdf).center1 - (*rotatedRingSdf).center0);\n    let rotation = slerpQuat((*rotatedRingSdf).rotation0, (*rotatedRingSdf).rotation1, time);\n    let invRotation = conjugate(rotation);\n    var rotatedRay: Ray;\n    rotatedRay.origin = rotateQuat(ray.origin - center, invRotation) + center;\n    rotatedRay.direction = rotateQuat(ray.direction, invRotation);\n    rotatedRay.time = ray.time;\n    let hit = hitRingSdf(id, rotatedRay, tMin, tMax, hitRecord);\n    if (hit) {\n        (*hitRecord).position = rotateQuat((*hitRecord).position - center, rotation) + center;\n        (*hitRecord).normal = rotateQuat((*hitRecord).normal, rotation);\n        return true;\n    }\n    return false;\n}\n\nfn mapTubeSdf(p: vec3<f32>, r: f32, th: f32, h: f32, rounding: f32) -> f32 {\n    // Circle\n    // return length(p) - r;\n    // Annular\n    // abs(sdShape(p)) - r\n    // Annular circle\n    let d = abs(length(p.xz) - r) - th / 2f;\n    \n    // Extrude\n    let w = vec2<f32>(d, abs(p.y) - h);\n  \treturn min(max(w.x, w.y), 0f) + length(max(w, vec2<f32>(0f, 0f))) - rounding;\n}\n\nfn hitTubeSdf(id: u32, ray: Ray, tMin: f32, tMax: f32, hitRecord: ptr<function, HitRecord>) -> bool {\n    let tubeSdf = &hittableBuffer.hittables[id];\n    var t = tMin;\n    let size = (*tubeSdf).size0;\n    let center = (*tubeSdf).center0;\n    let rounding = (*tubeSdf).rounding;\n    let outerr = size.z;\n    let innerr = size.x;\n    let e = size.y - rounding;\n    let r = (outerr + innerr) * 0.5f;\n    let th = (outerr - innerr) - rounding;\n    for (var i: u32 = 0u; i < 256u; i = i + 1u) {\n        let position = rayAt(ray, t);\n        let oc = position - center;\n        let distance = abs(mapTubeSdf(oc, r, th, e, rounding));\n        t = t + distance;\n        if (t > tMax) { return false; }\n        if (distance < 0.000001f) {\n            (*hitRecord).t = t;\n            (*hitRecord).position = rayAt(ray, t);\n\n            // Normal\n            let h = 0.00001f; // replace by an appropriate value\n            let k = vec2<f32>(1f, -1f);\n            let outwardNormal =  normalize(\n                k.xyy * mapTubeSdf(oc + k.xyy * h, r, th, e, rounding) +\n                k.yyx * mapTubeSdf(oc + k.yyx * h, r, th, e, rounding) +\n                k.yxy * mapTubeSdf(oc + k.yxy * h, r, th, e, rounding) +\n                k.xxx * mapTubeSdf(oc + k.xxx * h, r, th, e, rounding));\n            setFaceNormal(ray, outwardNormal, hitRecord);\n            return true;\n        }\n    }\n    return false;\n}\n\nfn hitLights(ray: Ray) -> vec3<f32> {\n    var hit: bool;\n    for (var i: u32 = 0u; i < arrayLength(&lightBuffer.lights); i = i + 1u) {\n        // let light = lightBuffer.lights[i];\n        // TODO: Directional lights\n        switch u32(lightBuffer.lights[i].typeId) {\n            default: {\n                hit = hitSphereLight(i, ray);\n            }\n            case 2u: {\n                hit = hitRectLight(i, ray);\n            }\n        }\n        if (hit) {\n            return lightBuffer.lights[i].color;\n        }\n    }\n\n    // Background color\n    // return vec3<f32>(0f, 0f, 0f);\n    // return vec3<f32>(1f, 1f, 1f);\n    // return uniforms.backgroundColor;\n\n    // Ambient light (not background color)\n    return uniforms.ambientColor;\n\n    // TODO: Dome light\n    // let t = 0.5f * (ray.direction.y + 1f);\n    // let background = (1f - t) * vec3<f32>(1f, 1f, 1f) + t * vec3<f32>(0.5f, 0.7f, 1.0f);\n    // return background;\n}\n\nfn hitSphereLight(id: u32, ray: Ray) -> bool {\n    let sphere = &lightBuffer.lights[id];\n    let radius = (*sphere).size.x;\n    let oc = ray.origin - (*sphere).center;\n    let b = dot(oc, ray.direction);\n    let c = dot(oc, oc) - radius * radius;\n    var h = b * b - c;\n    if (h < 0f) { return false; }\n    return b < 0f; // Ensure ray towards light\n}\n\nfn hitRectLight(id: u32, ray: Ray) -> bool {\n    let rotatedXyRect = &lightBuffer.lights[id];\n    let center = (*rotatedXyRect).center;\n    let rotation = (*rotatedXyRect).rotation;\n    let invRotation = conjugate(rotation);\n    var rotatedRay: Ray;\n    rotatedRay.origin = rotateQuat(ray.origin - center, invRotation) + center;\n    rotatedRay.direction = rotateQuat(ray.direction, invRotation);\n    if (dot(rotatedRay.direction, vec3<f32>(0f, 0f, 1f)) < 0f) { return false; } // Directional light\n    let oc = rotatedRay.origin - center;\n    let t = -oc.z / rotatedRay.direction.z;\n    if (t < 0f) { return false; }\n    let p = oc + t * rotatedRay.direction;\n    if (abs(p.x) > (*rotatedXyRect).size.x || abs(p.y) > (*rotatedXyRect).size.y) { return false; }\n    return true;\n}\n\nfn nearZero(v: vec3<f32>) -> bool {\n    return max(max(abs(v.x), abs(v.y)), abs(v.z)) < 0.00000001f; // 1e-8\n}\n\nfn scatterLambertian(ray: ptr<function, Ray>, hitRecord: HitRecord, attenuation: ptr<function, vec3<f32>>, seed: ptr<function, u32>) -> bool {\n    let scatterDirection = hitRecord.normal + randomUnitVector(seed);\n\n    // Catch degenerate scatter direction\n    (*ray).direction = select(normalize(scatterDirection), hitRecord.normal, nearZero(scatterDirection));\n\n    (*ray).origin = hitRecord.position;\n    (*attenuation) = textureValue(hitRecord);\n    return true;\n}\n\nfn scatterMetal(ray: ptr<function, Ray>, hitRecord: HitRecord, attenuation: ptr<function, vec3<f32>>, seed: ptr<function, u32>) -> bool {\n    // let fuzz = materialBuffer.materials[hitRecord.materialId].fuzz;\n    let fuzz = hittableBuffer.hittables[hitRecord.id].materialFuzz;\n    (*ray).direction = normalize(reflect((*ray).direction, hitRecord.normal) + fuzz * randomInUnitSphere(seed));\n\n    (*ray).origin = hitRecord.position;\n    (*attenuation) = textureValue(hitRecord);\n\n    // Absorb any rays which fuzz scatters below the surface\n    return dot((*ray).direction, hitRecord.normal) > 0f;\n}\n\nfn scatterGlossy(ray: ptr<function, Ray>, hitRecord: HitRecord, attenuation: ptr<function, vec3<f32>>, seed: ptr<function, u32>) -> bool {\n    // Specular\n    // let material = &materialBuffer.materials[hitRecord.materialId];\n    // let fuzz = (*material).fuzz;\n    // let refractiveIndex = (*material).refractiveIndex;\n    // let glossiness = (*material).glossiness;\n    let hittable = hittableBuffer.hittables[hitRecord.id];\n    let fuzz = hittable.materialFuzz;\n    let refractiveIndex = hittable.materialRefractiveIndex;\n    let glossiness = hittable.materialGloss;\n    let refractionRatio = select(refractiveIndex, 1f / refractiveIndex, hitRecord.frontFace);\n    let cosTheta = min(dot(-(*ray).direction, hitRecord.normal), 1f);\n    if (reflectance(cosTheta, refractionRatio) * glossiness > random(seed)) {\n        (*ray).direction = normalize(reflect((*ray).direction, hitRecord.normal) + fuzz * randomInUnitSphere(seed));\n        (*ray).origin = hitRecord.position;\n        (*attenuation) = vec3<f32>(1f, 1f, 1f);\n\n        // Absorb any rays which fuzz scatters below the surface\n        return dot((*ray).direction, hitRecord.normal) > 0f;\n    }\n    else {\n        // Lambertian\n        return scatterLambertian(ray, hitRecord, attenuation, seed);\n    }\n}\n\nfn scatterDielectric(ray: ptr<function, Ray>, hitRecord: ptr<function, HitRecord>, attenuation: ptr<function, vec3<f32>>, seed: ptr<function, u32>) -> bool {\n    // let material = &materialBuffer.materials[(*hitRecord).materialId];\n    // let refractiveIndex = (*material).refractiveIndex;\n    let hittable = hittableBuffer.hittables[hitRecord.id];\n    let refractiveIndex = hittable.materialRefractiveIndex;\n    // TODO: If still inside another material, use its refractive index\n    let refractionRatio = select(refractiveIndex, 1f / refractiveIndex, (*hitRecord).frontFace);\n    let cosTheta = min(dot(-(*ray).direction, (*hitRecord).normal), 1f);\n    let sinTheta = sqrt(1f - cosTheta * cosTheta);\n    let cannotRefract = refractionRatio * sinTheta > 1f;\n    // if (cannotRefract || reflectance(cosTheta, refractionRatio) > random(seed)) {\n    // if (cannotRefract || reflectance(cosTheta, refractionRatio) * (*material).glossiness > random(seed)) {\n    if (cannotRefract || reflectance(cosTheta, refractionRatio) * hittable.materialGloss > random(seed)) {\n        (*ray).direction = reflect((*ray).direction, (*hitRecord).normal);\n    }\n    else {\n        (*ray).direction = refraction((*ray).direction, (*hitRecord).normal, refractionRatio);\n    }\n    (*ray).origin = (*hitRecord).position;\n    // (*ray).direction = normalize((*ray).direction + (*material).fuzz * randomInUnitSphere(seed));\n    (*ray).direction = normalize((*ray).direction + hittable.materialFuzz * randomInUnitSphere(seed));\n\n    // Did the ray enter/stay inside?\n    (*attenuation) = vec3<f32>(1f, 1f, 1f);\n    // if (dot((*ray).direction, (*hitRecord).normal) < 0f) {\n        if (dot((*ray).direction, select(-(*hitRecord).normal, (*hitRecord).normal, (*hitRecord).frontFace)) < 0f) {\n        (*hitRecord).isAbsorbing = true;\n        // (*hitRecord).absorption = (*material).color;\n        // (*hitRecord).absorption = hittable.materialColor;\n        (*hitRecord).absorption = hittable.materialColor * hittable.materialDensity;\n\n        // If already inside another absorbing dielectric, add to absorption\n        if ((*hitRecord).previousIsAbsorbing && (*hitRecord).id != (*hitRecord).previousId) {\n            (*hitRecord).absorption = (*hitRecord).absorption + (*hitRecord).previousAbsorption;\n        }\n    }\n    return true;\n}\n\nfn scatterIsotropic(ray: ptr<function, Ray>, hitRecord: HitRecord, attenuation: ptr<function, vec3<f32>>, seed: ptr<function, u32>) -> bool {\n    (*ray).direction = randomUnitVector(seed);\n    (*ray).origin = hitRecord.position;\n    let hittable = hittableBuffer.hittables[hitRecord.id];\n    (*attenuation) = hittable.materialColor;\n    return true;\n}\n\nfn scatterVarnish(ray: ptr<function, Ray>, hitRecord: HitRecord, attenuation: ptr<function, vec3<f32>>, seed: ptr<function, u32>) -> bool {\n    // Front-face only (no internal reflection or refraction)\n    // let material = &materialBuffer.materials[hitRecord.materialId];\n    let hittable = hittableBuffer.hittables[hitRecord.id];\n    // if (hitRecord.frontFace && (*material).glossiness > random(seed)) {\n    if (hitRecord.frontFace && hittable.materialGloss > random(seed)) {\n        // let refractiveIndex = (*material).refractiveIndex;\n        let refractiveIndex = hittable.materialRefractiveIndex;\n        let refractionRatio = select(refractiveIndex, 1f / refractiveIndex, hitRecord.frontFace);\n        let cosTheta = min(dot(-(*ray).direction, hitRecord.normal), 1f);\n        let sinTheta = sqrt(1f - cosTheta * cosTheta);\n        let cannotRefract = refractionRatio * sinTheta > 1f;\n        if (cannotRefract || reflectance(cosTheta, refractionRatio) > random(seed)) {\n            (*ray).direction = reflect((*ray).direction, hitRecord.normal);\n        }\n        else {\n            // Refraction improves definition at edges and deepens color on faces\n            (*ray).direction = refraction((*ray).direction, hitRecord.normal, refractionRatio);\n        }\n        // (*ray).direction = normalize((*ray).direction + (*material).fuzz * randomInUnitSphere(seed));\n        (*ray).direction = normalize((*ray).direction + hittable.materialFuzz * randomInUnitSphere(seed));\n    }\n    // Pass-through\n    (*ray).origin = hitRecord.position;\n    (*attenuation) = vec3<f32>(1f, 1f, 1f);\n    return true;\n}\n\nfn textureValue(hitRecord: HitRecord) -> vec3<f32> {\n    // let textureId = materialBuffer.materials[hitRecord.materialId].textureId;\n    let hittable = hittableBuffer.hittables[hitRecord.id];\n    // let texture = &textureBuffer.textures[u32(textureId)];\n    let texture = &textureBuffer.textures[u32(hittable.textureId)];\n    switch u32((*texture).typeId) {\n        // No texture\n        default: {\n            return vec3<f32>();\n        }\n        // Solid color\n        case 1u: {\n            if (hitRecord.sdfBorder) {\n                return (*texture).color1;\n            }\n            else {\n                // return (*texture).color0;\n                return hittableBuffer.hittables[hitRecord.id].materialColor;\n            }\n\n            // Debug uv\n            // return vec3<f32>(hitRecord.uv, 0f);\n        }\n        // Image\n        case 2u: {\n            // Sample in linear space\n            return textureSampleLevel(backgroundTexture, linearSampler, hitRecord.uv, 0f).rgb;\n            // return vec3(hitRecord.uv.x, hitRecord.uv.y, 0f);\n        }\n        // Checker\n        case 4u: {\n            let q = trunc((hitRecord.uv + (*texture).offset) / (*texture).size0.xy);\n            return select((*texture).color0, (*texture).color1, (q.x + q.y) % 2f > 0f);\n        }\n        // Grid\n        case 5u: {\n            let size0 = (*texture).size0;\n            let size1 = (*texture).size1;\n            let clip = (*texture).clip;\n            if (hitRecord.uv.x < clip.x || hitRecord.uv.y < clip.y || hitRecord.uv.x > clip.z || hitRecord.uv.y > clip.w) {\n                return (*texture).color1;\n            }\n            let uv = hitRecord.uv + (*texture).offset;\n            var d = uv / size0.xy;\n            d = abs(d - round(d)) * size0.xy;\n            if (d.x < size1.x || d.y < size1.y) {\n                return (*texture).color0;\n            }\n            else {\n                d = uv / size0.zw;\n                d = abs(d - round(d)) * size0.zw;\n                if (d.x < size1.z || d.y < size1.w) {\n                    return (*texture).color0;\n                }\n                return (*texture).color1;\n            }\n        }\n    }\n}\n\nfn rayColor(ray: ptr<function, Ray>, seed: ptr<function, u32>) -> vec3<f32> {\n    let maxDepth = 16u; // TODO: Pass as uniform\n    var depth = 0u;\n    // var result: Color;\n    var color = vec3<f32>(1f, 1f, 1f);\n    var attenuation = vec3<f32>(1f, 1f, 1f);\n    var emitted = vec3<f32>(0f, 0f, 0f);\n    var hitRecord: HitRecord;\n    hitRecord.id = 4294967295; // -1 as u32\n    var scatter: bool;\n    loop {\n        // if (hitWorld(*ray, 0.00001f, 100f, &hitRecord, seed)) {\n        if (hitBVH(*ray, 0.00001f, 100f, &hitRecord, seed)) {\n            // Debug normal, depth\n            // First hit\n            // if (depth == 0u) {\n            //     result.normal = hitRecord.normal * 0.5f + vec3<f32>(0.5f, 0.5f, 0.5f);\n            //     // result.normal = hitRecord.normal * 0.5f + vec3<f32>(0.5f, 0.5f, 0.5f)\n            //     // result.depth = 1f / hitRecord.t;\n            //     result.depth = -1f / dot(hitRecord.position - (*ray).origin, uniforms.forward);\n            // }\n            // return result;\n\n            // Depth\n            depth = depth + 1u;\n            if (depth == maxDepth) {\n                // Exceeded bounce limit, no more light is gathered\n                // result.color = vec3<f32>(0f, 0f, 0f);\n                // return result;\n                return vec3<f32>(0f, 0f, 0f);\n            }\n\n            // Bounce\n            // If last hit was travelling INTO a dielectric, use last hit position to calculate distance\n            // and apply Beer's law to attenuate the light. Modify the dielectric scattering function to\n            // recrord travelling INTO a dielectric based on hitRecord normal and ray direction.\n            // Reset this flag each time here.\n            if (hitRecord.previousIsAbsorbing) {\n                // Beer's law\n                let d = distance(hitRecord.previousPosition, hitRecord.position);\n                color = color * exp(-d * hitRecord.previousAbsorption);\n            }\n            // Reset absorption\n            hitRecord.isAbsorbing = false;\n            hitRecord.absorption = vec3<f32>(0f, 0f, 0f);\n\n            // switch u32(materialBuffer.materials[hitRecord.materialId].typeId) {\n            switch u32(hittableBuffer.hittables[hitRecord.id].materialTypeId) {\n                case 0u: {\n                    scatter = scatterLambertian(ray, hitRecord, &attenuation, seed);\n                    break;\n                }\n                case 1u: {\n                    scatter = scatterMetal(ray, hitRecord, &attenuation, seed);\n                    break;\n                }\n                case 2u: {\n                    scatter = scatterDielectric(ray, &hitRecord, &attenuation, seed);\n                    break;\n                }\n                case 3u: {\n                    scatter = scatterGlossy(ray, hitRecord, &attenuation, seed);\n                    break;\n                }\n                case 4u: {\n                    // Diffuse light\n                    scatter = false;\n                    // emitted = materialBuffer.materials[hitRecord.materialId].color;\n                    emitted = hittableBuffer.hittables[hitRecord.id].materialColor;\n                    break;\n                }\n                case 5u: {\n                    scatter = scatterIsotropic(ray, hitRecord, &attenuation, seed);\n                    break;\n                }\n                case 6u: {\n                    scatter = scatterVarnish(ray, hitRecord, &attenuation, seed);\n                    break;\n                }\n                default: {\n                    scatter = false;\n                }\n            }\n\n            if (scatter) {\n                // Attenuate\n                color = color * attenuation;\n            }\n            else {\n                // Emit\n                // result.color = color * emitted;\n                // return result;\n                return color * emitted;\n            }\n        }\n        else {\n            // return color;\n\n            // No hits\n            if (depth > 0u) { // Hide lights, background\n                return hitLights(*ray) * color;\n                // result.color = hitLights(*ray) * color;\n                // return result;\n            }\n            else {\n                // return vec3<f32>(0f, 0f, 0f);\n                return uniforms.backgroundColor;\n                // result.color = uniforms.backgroundColor;\n                // return result;\n            }\n\n            // Background\n            // let t = 0.5f * ((*ray).direction.y + 1f);\n            // let background = (1f - t) * vec3<f32>(1f, 1f, 1f) + t * vec3<f32>(0.5f, 0.7f, 1.0f);\n            // return color * background;\n        }\n    }\n}\n\n// TODO: Try writing color directly using var outputTexture : texture_storage_2d<rgb32f,read_write>;\n// textureStore(outputTexture, uv, vec3<f32>(1f, 1f, 1f));\n@group(0) @binding(0) var<storage, read_write> outputColorBuffer: ColorBuffer;\n@group(0) @binding(1) var<uniform> uniforms: Uniforms;\n@group(0) @binding(2) var<storage, read> hittableBuffer: HittableBuffer;\n// @group(0) @binding(3) var<storage, read> materialBuffer: MaterialBuffer;\n@group(0) @binding(3) var<storage, read> textureBuffer: TextureBuffer;\n@group(0) @binding(4) var<storage, read> lightBuffer: LightBuffer;\n@group(0) @binding(5) var<storage, read> linearBVHNodeBuffer: LinearBVHNodeBuffer;\n@group(0) @binding(6) var linearSampler: sampler;\n@group(0) @binding(7) var fontTexture: texture_2d<f32>;\n@group(0) @binding(8) var backgroundTexture: texture_2d<f32>;\n@group(0) @binding(9) var atlasTexture: texture_2d<f32>;\n@group(0) @binding(10) var<storage, read_write> outputNormalDepthBuffer: NormalDepthBuffer;\n@group(0) @binding(11) var<storage, read_write> depthMinMaxBuffer: DepthMinMaxBuffer;\n\n// TODO: Move lighting to seperate bind group so I can update it independently\n\n@compute @workgroup_size(256, 1, 1)\nfn clear(@builtin(global_invocation_id) globalId : vec3<u32>) {\n    var index = globalId.x * 3u;\n    outputColorBuffer.values[index] = 0f;\n    outputColorBuffer.values[index + 1u] = 0f;\n    outputColorBuffer.values[index + 2u] = 0f;\n    index = globalId.x * 4u;\n    outputNormalDepthBuffer.values[index] = 0f; // Normal x\n    outputNormalDepthBuffer.values[index + 1u] = 0f; // Normal y\n    outputNormalDepthBuffer.values[index + 2u] = 0f; // Normal z\n    outputNormalDepthBuffer.values[index + 3u] = 0f; // Depth\n    atomicStore(&depthMinMaxBuffer.values[0], 4294967295u);\n    atomicStore(&depthMinMaxBuffer.values[1], 0u);\n}\n\n@compute @workgroup_size(256, 1, 1)\nfn depthNormal(@builtin(global_invocation_id) globalId : vec3<u32>) {\n    let imageSize = vec2<f32>(uniforms.width * uniforms.tilesX, uniforms.height * uniforms.tilesY);\n    let tileSize = vec2<f32>(uniforms.width, uniforms.height);\n\n    // Tex coords [0,1]\n    // let id = f32(globalId.x);\n    // let v = floor(id / imageSize.x);\n    // let u = (id - v * imageSize.x);\n    // let uv = vec2<f32>(u, v);\n    // let texCoord = uv / imageSize;\n\n    // Pixel coords ([0,width-1], [0,height-1])\n    let id = f32(globalId.x);\n    let tilePixelY = floor(id / tileSize.x);\n    let tilePixelX = id - tilePixelY * tileSize.x;\n    let imagePixelX = tilePixelX + uniforms.tileOffsetX * tileSize.x;\n    let imagePixelY = tilePixelY + uniforms.tileOffsetY * tileSize.y;\n\n    // Tex coords ([0,1], [0,1])\n    let texCoord = vec2<f32>(imagePixelX / imageSize.x, imagePixelY / imageSize.y);\n\n    // Camera\n    var camera = getCamera(uniforms);\n\n    // Sample position (sub-pixel sampling has same seed, but only sampled once per frame)\n    let samplePos = vec2<f32>(texCoord);\n\n    // Ray\n    var seed = 0u; // No depth of field for depth, normal\n    var ray = getCameraRay(camera, &seed, samplePos);\n\n    // Result\n    var normal = vec3<f32>(0f, 0f, 0f);\n    var depth = 0f;\n    var hitRecord: HitRecord;\n    if (hitBVH(ray, 0.00001f, 100f, &hitRecord, &seed)) {\n        normal = hitRecord.normal * 0.5f + vec3<f32>(0.5f, 0.5f, 0.5f);\n        depth = -1f / dot(hitRecord.position - ray.origin, uniforms.forward);\n    }\n\n    let index = globalId.x * 4u;\n    // let index = u32(tilePixelY * tileSize.x + tilePixelX) * 4u;\n    outputNormalDepthBuffer.values[index] = normal.x;\n    outputNormalDepthBuffer.values[index + 1u] = normal.y;\n    outputNormalDepthBuffer.values[index + 2u] = normal.z;\n    outputNormalDepthBuffer.values[index + 3u] = depth;\n\n    // Min, max depth\n    // When depth is 0, it means no hit, so ignore\n    if (depth > 0f) {\n        atomicMin(&depthMinMaxBuffer.values[0], u32(depth * 1000f));\n    }\n    atomicMax(&depthMinMaxBuffer.values[1], u32(depth * 1000f));\n}\n\n@compute @workgroup_size(256, 1, 1)\nfn depthNormalMultisampled(@builtin(global_invocation_id) globalId : vec3<u32>) {\n    let imageSize = vec2<f32>(uniforms.width * uniforms.tilesX, uniforms.height * uniforms.tilesY);\n    let tileSize = vec2<f32>(uniforms.width, uniforms.height);\n\n    // Tex coords [0,1]\n    // let id = f32(globalId.x);\n    // let v = floor(id / imageSize.x);\n    // let u = (id - v * imageSize.x);\n    // let uv = vec2<f32>(u, v);\n    // let texCoord = uv / imageSize;\n\n    // Pixel coords ([0,width-1], [0,height-1])\n    let id = f32(globalId.x);\n    let tilePixelY = floor(id / tileSize.x);\n    let tilePixelX = id - tilePixelY * tileSize.x;\n    let imagePixelX = tilePixelX + uniforms.tileOffsetX * tileSize.x;\n    let imagePixelY = tilePixelY + uniforms.tileOffsetY * tileSize.y;\n\n    // Tex coords ([0,1], [0,1])\n    let texCoord = vec2<f32>(imagePixelX / imageSize.x, imagePixelY / imageSize.y);\n\n    // Camera\n    var camera = getCamera(uniforms);\n\n    // Sample position (sub-pixel sampling has same seed, but only sampled once per frame)\n    var frameSeed = u32(uniforms.seed);\n    var seed = u32(tilePixelY * tileSize.x + tilePixelX) + frameSeed * u32(tileSize.x * tileSize.y);\n    let samplePos = vec2<f32>(texCoord) + vec2<f32>(random(&seed), random(&seed)) / imageSize;\n\n    // Ray\n    var ray = getCameraRay(camera, &seed, samplePos);\n\n    // Result\n    var normal = vec3<f32>(0f, 0f, 0f);\n    var depth = 0f;\n    var hitRecord: HitRecord;\n    if (hitBVH(ray, 0.00001f, 100f, &hitRecord, &seed)) {\n        normal = hitRecord.normal * 0.5f + vec3<f32>(0.5f, 0.5f, 0.5f);\n        depth = -1f / dot(hitRecord.position - ray.origin, uniforms.forward);\n    }\n\n    let index = globalId.x * 4u;\n    // let index = u32(tilePixelY * tileSize.x + tilePixelX) * 4u;\n    outputNormalDepthBuffer.values[index] += normal.x;\n    outputNormalDepthBuffer.values[index + 1u] += normal.y;\n    outputNormalDepthBuffer.values[index + 2u] += normal.z;\n    outputNormalDepthBuffer.values[index + 3u] += depth;\n\n    // Min, max depth\n    // When depth is 0, it means no hit, so ignore\n    if (depth > 0f) {\n        atomicMin(&depthMinMaxBuffer.values[0], u32(depth * 1000f));\n    }\n    atomicMax(&depthMinMaxBuffer.values[1], u32(depth * 1000f));\n}\n\n@compute @workgroup_size(256, 1, 1)\nfn segment(@builtin(global_invocation_id) globalId : vec3<u32>) {\n    let imageSize = vec2<f32>(uniforms.width * uniforms.tilesX, uniforms.height * uniforms.tilesY);\n    let tileSize = vec2<f32>(uniforms.width, uniforms.height);\n\n    // Tex coords [0,1]\n    // let id = f32(globalId.x);\n    // let v = floor(id / imageSize.x);\n    // let u = (id - v * imageSize.x);\n    // let uv = vec2<f32>(u, v);\n    // let texCoord = uv / imageSize;\n\n    // Pixel coords ([0,width-1], [0,height-1])\n    let id = f32(globalId.x);\n    // let tilePixelY = floor(id / tileSize.x);\n    // let tilePixelX = id - tilePixelY * tileSize.x;\n    let tilePixelY = floor(id / (tileSize.x + 1)); // Overdispatched by 1\n    let tilePixelX = id - tilePixelY * (tileSize.x + 1); // Overdispatched by 1\n    let imagePixelX = tilePixelX + uniforms.tileOffsetX * tileSize.x;\n    let imagePixelY = tilePixelY + uniforms.tileOffsetY * tileSize.y;\n\n    // Tex coords ([0,1], [0,1]), can be > 1 with overdispatching\n    let texCoord = vec2<f32>(imagePixelX / imageSize.x, imagePixelY / imageSize.y);\n\n    // Camera\n    var camera = getCamera(uniforms);\n\n    // Sample position (sub-pixel sampling has same seed, but only sampled once per frame)\n    let samplePos = vec2<f32>(texCoord);\n\n    // Ray\n    var seed = 0u; // No depth of field for depth, normal\n    var ray = getCameraRay(camera, &seed, samplePos);\n\n    // Result\n    var color = vec4<f32>(1f, 1f, 1f, 0f);\n    var hitRecord: HitRecord;\n    if (hitBVH(ray, 0.00001f, 100f, &hitRecord, &seed)) {\n        // color = materialBuffer.materials[hitRecord.materialId].idColor;\n\n        // TODO: Generate unique id color in main if not supplied\n        // let id = f32(hitRecord.id & 255u) / 255f;\n        // color.x = id;\n        // color.y = id;\n        // color.z = id;\n\n        color = hittableBuffer.hittables[hitRecord.id].segmentColor;\n\n        // let color3 = textureValue(hitRecord);\n        // color.x = color3.x;\n        // color.y = color3.y;\n        // color.z = color3.z;\n    }\n\n    let index = globalId.x * 4u;\n    // let index = u32(tilePixelY * (tileSize.x + 1) + tilePixelX) * 4u; // Overdispatched by 1\n    outputNormalDepthBuffer.values[index] = color.x;\n    outputNormalDepthBuffer.values[index + 1u] = color.y;\n    outputNormalDepthBuffer.values[index + 2u] = color.z;\n    outputNormalDepthBuffer.values[index + 3u] = color.w;\n\n    // TODO: Expand outputNormalDepthBuffer to store additional color channel for filling edges, or use separate buffer\n}\n\n// @builtin(local_invocation_id) localId : vec3<u32>,\n// @builtin(num_workgroups) numWorkgroups : vec3<u32>,\n// @builtin(workgroup_id) workgroupId : vec3<u32>\n// TODO: Use workgroup dimensions xy to get position directly froem globalId\n//       Then store using textureStore\n//       Check within bounds due to overdispatching\n\n@compute @workgroup_size(256, 1, 1)\nfn main(@builtin(global_invocation_id) globalId : vec3<u32>) {\n    let imageSize = vec2<f32>(uniforms.width * uniforms.tilesX, uniforms.height * uniforms.tilesY);\n    let tileSize = vec2<f32>(uniforms.width, uniforms.height);\n\n    // TODO: Pixels at x=0 have noise when object overlaps right-side of screen at widths of 75, 150, 300, 600, 1200, 2400\n\n    // Tex coords [0,1]\n    // let id = f32(globalId.x);\n    // TODO: Divide by (imageSize.x - 1)\n    // let v = floor(id / imageSize.x);\n    // let u = (id - v * imageSize.x);\n    // let uv = vec2<f32>(u, v);\n    // let texCoord = uv / imageSize;\n\n    // Pixel coords ([0,width-1], [0,height-1])\n    let id = f32(globalId.x);\n    let tilePixelY = floor(id / tileSize.x);\n    let tilePixelX = id - tilePixelY * tileSize.x;\n    let imagePixelX = tilePixelX + uniforms.tileOffsetX * tileSize.x;\n    let imagePixelY = tilePixelY + uniforms.tileOffsetY * tileSize.y;\n\n    // Tex coords ([0,1], [0,1])\n    let texCoord = vec2<f32>(imagePixelX / imageSize.x, imagePixelY / imageSize.y);\n\n    // Camera\n    var camera = getCamera(uniforms);\n\n    // Frame seed\n    var frameSeed = u32(uniforms.seed);\n    let raysPerFrame = u32(uniforms.raysPerFrame);\n    var color = vec3<f32>(0f, 0f, 0f);\n    var depth = 0f;\n    var normal = vec3<f32>(0f, 0f, 0f);\n    var seed: u32;\n\n    for (var i = 0u; i < raysPerFrame; i = i + 1u) {\n        // Random number generator\n        // See https://nelari.us/post/weekend_raytracing_with_wgpu_1/#implement-a-random-number-generator\n        // fn initRng(pixel: vec2<u32>, resolution: vec2<u32>, frame: u32) -> u32 {\n        //     // Adapted from https://github.com/boksajak/referencePT\n        //     let seed = dot(pixel, vec2<u32>(1u, resolution.x)) ^ jenkinsHash(frame);\n        //     return jenkinsHash(seed);\n        // }\n        //\n        // fn jenkinsHash(input: u32) -> u32 {\n        //     var x = input;\n        //     x += x << 10u;\n        //     x ^= x >> 6u;\n        //     x += x << 3u;\n        //     x ^= x >> 11u;\n        //     x += x << 15u;\n        //     return x;\n        // }\n        // TODO: Consider switching to u32 for uniforms and use vec3<u32> arithmetic\n        seed = u32(tilePixelY * tileSize.x + tilePixelX) + frameSeed * u32(tileSize.x * tileSize.y);\n\n        // Sample position (sub-pixel sampling has same seed, but only sampled once per frame)\n        let samplePos = vec2<f32>(texCoord) + vec2<f32>(random(&seed), random(&seed)) / imageSize;\n\n        // Ray\n        var ray = getCameraRay(camera, &seed, samplePos);\n\n        // Color [0,1]\n        // let color = result.color;\n        // let color = clamp(result.color, vec3<f32>(0f, 0f, 0f), vec3<f32>(1f, 1f, 1f));\n        // let color = clamp(result.color, vec3<f32>(0f, 0f, 0f), vec3<f32>(10f, 10f, 10f)); // Max light\n        color += clamp(rayColor(&ray, &seed), vec3<f32>(0f, 0f, 0f), vec3<f32>(10f, 10f, 10f)); // Max light\n\n        // Depth\n        // let depth = 1f / rayColor(&ray, &seed).depth;\n        // color = vec3<f32>(depth, depth, depth);\n        // depth += result.depth;\n\n        // Normal\n        // normal += result.normal;\n\n        // Next frame\n        frameSeed = frameSeed + 1u;\n    }\n    let index = globalId.x * 3u;\n    outputColorBuffer.values[index + 0u] = outputColorBuffer.values[index + 0u] + color.x;\n    outputColorBuffer.values[index + 1u] = outputColorBuffer.values[index + 1u] + color.y;\n    outputColorBuffer.values[index + 2u] = outputColorBuffer.values[index + 2u] + color.z;\n    // outputDepthBuffer.values[globalId.x] = outputDepthBuffer.values[globalId.x] + depth;\n    // outputNormalBuffer.values[index + 0u] = outputNormalBuffer.values[index + 0u] + normal.x;\n    // outputNormalBuffer.values[index + 1u] = outputNormalBuffer.values[index + 1u] + normal.y;\n    // outputNormalBuffer.values[index + 2u] = outputNormalBuffer.values[index + 2u] + normal.z;\n}`;\nclass $e1b604d7f27d3d8e$export$893bf7cc4a794b30 extends Float32Array {\n    constructor(){\n        super($e1b604d7f27d3d8e$export$893bf7cc4a794b30.SIZE);\n        this.POSITION_OFFSET = 0;\n        this.WIDTH_OFFSET = 3;\n        this.RIGHT_OFFSET = 4;\n        this.HEIGHT_OFFSET = 7;\n        this.UP_OFFSET = 8;\n        this.SEED_OFFSET = 11;\n        this.FORWARD_OFFSET = 12;\n        this.FOV_OFFSET = 15;\n        this.BACKGROUND_COLOR_OFFSET = 16;\n        this.TIME0_OFFSET = 19;\n        this.AMBIENT_COLOR_OFFSET = 20;\n        this.TIME1_OFFSET = 23;\n        this.TILES_X = 24;\n        this.TILES_Y = 25;\n        this.TILE_OFFSET_X = 26;\n        this.TILE_OFFSET_Y = 27;\n        this.LOOKAT_OFFSET = 28;\n        this.APERTURE_OFFSET = 31;\n        this.FOCUS_DISTANCE_OFFSET = 32;\n        this.RAYS_PER_FRAME_OFFSET = 33;\n    }\n    getFocusDistance() {\n        return this[this.FOCUS_DISTANCE_OFFSET];\n    }\n    setFocusDistance(value) {\n        this[this.FOCUS_DISTANCE_OFFSET] = value;\n    }\n    getWidth() {\n        return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value) {\n        this[this.WIDTH_OFFSET] = value;\n    }\n    getHeight() {\n        return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value) {\n        this[this.HEIGHT_OFFSET] = value;\n    }\n    getSeed() {\n        return this[this.SEED_OFFSET];\n    }\n    setSeed(value) {\n        this[this.SEED_OFFSET] = value;\n    }\n    getRaysPerFrame() {\n        return this[this.RAYS_PER_FRAME_OFFSET];\n    }\n    setRaysPerFrame(value) {\n        this[this.RAYS_PER_FRAME_OFFSET] = value;\n    }\n    getFieldOfView() {\n        return this[this.FOV_OFFSET];\n    }\n    setFieldOfView(value) {\n        this[this.FOV_OFFSET] = value;\n    }\n    getAperture() {\n        return this[this.APERTURE_OFFSET];\n    }\n    setAperture(value) {\n        this[this.APERTURE_OFFSET] = value;\n    }\n    getPosition(value) {\n        (0, $31054a6c69637582$exports).set(value, this[this.POSITION_OFFSET], this[this.POSITION_OFFSET + 1], this[this.POSITION_OFFSET + 2]);\n    }\n    setPosition(value) {\n        this[this.POSITION_OFFSET] = value[0];\n        this[this.POSITION_OFFSET + 1] = value[1];\n        this[this.POSITION_OFFSET + 2] = value[2];\n    }\n    getRight(value) {\n        (0, $31054a6c69637582$exports).set(value, this[this.RIGHT_OFFSET], this[this.RIGHT_OFFSET + 1], this[this.RIGHT_OFFSET + 2]);\n    }\n    setRight(value) {\n        this[this.RIGHT_OFFSET] = value[0];\n        this[this.RIGHT_OFFSET + 1] = value[1];\n        this[this.RIGHT_OFFSET + 2] = value[2];\n    }\n    getUp(value) {\n        (0, $31054a6c69637582$exports).set(value, this[this.UP_OFFSET], this[this.UP_OFFSET + 1], this[this.UP_OFFSET + 2]);\n    }\n    setUp(value) {\n        this[this.UP_OFFSET] = value[0];\n        this[this.UP_OFFSET + 1] = value[1];\n        this[this.UP_OFFSET + 2] = value[2];\n    }\n    getForward(value) {\n        (0, $31054a6c69637582$exports).set(value, this[this.FORWARD_OFFSET], this[this.FORWARD_OFFSET + 1], this[this.FORWARD_OFFSET + 2]);\n    }\n    setForward(value) {\n        this[this.FORWARD_OFFSET] = value[0];\n        this[this.FORWARD_OFFSET + 1] = value[1];\n        this[this.FORWARD_OFFSET + 2] = value[2];\n    }\n    getBackgroundColor(value) {\n        (0, $4c4ac78b213a9c07$exports).set(value, this[this.BACKGROUND_COLOR_OFFSET], this[this.BACKGROUND_COLOR_OFFSET + 1], this[this.BACKGROUND_COLOR_OFFSET + 2], this[this.BACKGROUND_COLOR_OFFSET + 3]);\n    }\n    setBackgroundColor(value) {\n        this[this.BACKGROUND_COLOR_OFFSET] = value[0];\n        this[this.BACKGROUND_COLOR_OFFSET + 1] = value[1];\n        this[this.BACKGROUND_COLOR_OFFSET + 2] = value[2];\n        this[this.BACKGROUND_COLOR_OFFSET + 3] = value[3];\n    }\n    getAmbientColor(value) {\n        (0, $31054a6c69637582$exports).set(value, this[this.AMBIENT_COLOR_OFFSET], this[this.AMBIENT_COLOR_OFFSET + 1], this[this.AMBIENT_COLOR_OFFSET + 2]);\n    }\n    setAmbientColor(value) {\n        this[this.AMBIENT_COLOR_OFFSET] = value[0];\n        this[this.AMBIENT_COLOR_OFFSET + 1] = value[1];\n        this[this.AMBIENT_COLOR_OFFSET + 2] = value[2];\n    }\n    getTime0() {\n        return this[this.TIME0_OFFSET];\n    }\n    setTime0(value) {\n        this[this.TIME0_OFFSET] = value;\n    }\n    getTime1() {\n        return this[this.TIME1_OFFSET];\n    }\n    setTime1(value) {\n        this[this.TIME1_OFFSET] = value;\n    }\n    getTilesX() {\n        return this[this.TILES_X];\n    }\n    setTilesX(value) {\n        this[this.TILES_X] = value;\n    }\n    getTilesY() {\n        return this[this.TILES_Y];\n    }\n    setTilesY(value) {\n        this[this.TILES_Y] = value;\n    }\n    getTileOffsetX() {\n        return this[this.TILE_OFFSET_X];\n    }\n    setTileOffsetX(value) {\n        this[this.TILE_OFFSET_X] = value;\n    }\n    getTileOffsetY() {\n        return this[this.TILE_OFFSET_Y];\n    }\n    setTileOffsetY(value) {\n        this[this.TILE_OFFSET_Y] = value;\n    }\n    getLookAt(value) {\n        (0, $31054a6c69637582$exports).set(value, this[this.LOOKAT_OFFSET], this[this.LOOKAT_OFFSET + 1], this[this.LOOKAT_OFFSET + 2]);\n    }\n    setLookAt(value) {\n        this[this.LOOKAT_OFFSET] = value[0];\n        this[this.LOOKAT_OFFSET + 1] = value[1];\n        this[this.LOOKAT_OFFSET + 2] = value[2];\n    }\n}\n$e1b604d7f27d3d8e$export$893bf7cc4a794b30.SIZE = 36;\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nconst $e354276e6b56108d$export$739cc3561e95931b = `\nconst GAMMA = vec3<f32>(0.45454545f); // 1 / 2.2\n\nstruct ColorData {\n    data : array<f32>,\n}\n\nstruct NormalDepthData {\n    data : array<f32>,\n}\n\n                               //         offest   align    size\nstruct Uniforms {              // ------------------------------\n    width: f32,                //              0       4       4\n    height: f32,               //              4       4       4\n    samplesPerPixel: f32,      //              8       4       4\n    exposure: f32,             //             12       4       4\n    minDepth: f32,             //             16       4       4\n    maxDepth: f32,             //             20       4       4\n    normalEdge: f32,           //             24       4       4\n    depthEdge: f32,            //             28       4       4\n    edgeForeground: vec4<f32>, //             32      16      16\n    edgeBackground: vec4<f32>, //             48      16      16\n}                              // ------------------------------\n                               //                     16      64\n\n@group(0) @binding(0) var<uniform> uniforms : Uniforms;\n@group(0) @binding(1) var<storage, read> colorBuffer : ColorData;\n@group(0) @binding(2) var<storage, read> normalDepthBuffer : NormalDepthData;\n\nstruct VertexOutput {\n    @builtin(position) Position : vec4<f32>,\n};\n\n@vertex\nfn vert_main(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput {\n    var pos = array<vec2<f32>, 6>(\n        vec2<f32>( 1f,  1f),\n        vec2<f32>( 1f, -1f),\n        vec2<f32>(-1f, -1f),\n        vec2<f32>( 1f,  1f),\n        vec2<f32>(-1f, -1f),\n        vec2<f32>(-1f,  1f));\n    var output : VertexOutput;\n    output.Position = vec4<f32>(pos[vertexIndex], 0f, 1f);\n    return output;\n}\n\n@fragment\nfn frag_main(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n    let x = floor(coord.x);\n    let y = floor(coord.y);\n    let index = u32(x + y * uniforms.width) * 3u;\n    // [0,1]\n    var color = vec3<f32>(colorBuffer.data[index + 0u], colorBuffer.data[index + 1u], colorBuffer.data[index + 2u]) / uniforms.samplesPerPixel;\n    // Gamma-correct\n    return vec4<f32>(pow(color, GAMMA), 1f);\n}\n\n@fragment\nfn frag_depth(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n    let x = floor(coord.x);\n    let y = floor(coord.y);\n    let index = u32(x + y * uniforms.width) * 4u;\n    let depth = normalDepthBuffer.data[index + 3u];\n    let minDepth = uniforms.minDepth;\n    let maxDepth = uniforms.maxDepth;\n    if (minDepth == maxDepth) {\n        // Raw, unnormalized depth\n        return vec4<f32>(vec3<f32>(depth, depth, depth), 1f);\n    }\n    else {\n        // Normalize depth\n        var normalizedDepth = (depth - minDepth) / (maxDepth - minDepth);\n        return vec4<f32>(normalizedDepth, normalizedDepth, normalizedDepth, 1f);\n    }\n}\n\n@fragment\nfn frag_depthMultisampled(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n    let x = floor(coord.x);\n    let y = floor(coord.y);\n    let index = u32(x + y * uniforms.width) * 4u;\n    let depth = normalDepthBuffer.data[index + 3u] / uniforms.samplesPerPixel;\n    let minDepth = uniforms.minDepth;\n    let maxDepth = uniforms.maxDepth;\n    if (minDepth == maxDepth) {\n        // Raw, unnormalized depth\n        return vec4<f32>(vec3<f32>(depth, depth, depth), 1f);\n    }\n    else {\n        // Normalize depth\n        var normalizedDepth = (depth - minDepth) / (maxDepth - minDepth);\n        return vec4<f32>(normalizedDepth, normalizedDepth, normalizedDepth, 1f);\n    }\n}\n\n@fragment\nfn frag_normal(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n    let x = floor(coord.x);\n    let y = floor(coord.y);\n    let index = u32(x + y * uniforms.width) * 4u;\n    return vec4<f32>(normalDepthBuffer.data[index + 0u], normalDepthBuffer.data[index + 1u], normalDepthBuffer.data[index + 2u], 1f);\n}\n\n@fragment\nfn frag_normalMultisampled(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n    let x = floor(coord.x);\n    let y = floor(coord.y);\n    let index = u32(x + y * uniforms.width) * 4u;\n    return vec4<f32>(normalDepthBuffer.data[index + 0u] / uniforms.samplesPerPixel, normalDepthBuffer.data[index + 1u] / uniforms.samplesPerPixel, normalDepthBuffer.data[index + 2u] / uniforms.samplesPerPixel, 1f);\n}\n\n// @fragment\n// fn frag_edge(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n//     let x = floor(coord.x);\n//     let y = floor(coord.y);\n//     let index = u32(x + y * uniforms.width) * 4u;\n\n//     // Prevent edge detection at screen edges\n//     if (x == 0 || x == uniforms.width - 1 || y == 0 || y == uniforms.height - 1) {\n//         return vec4<f32>(0f, 0f, 0f, 1f);\n//     }\n\n//     // Normal derivatives\n//     let p = vec3<f32>(normalDepthBuffer.data[index + 0u], normalDepthBuffer.data[index + 1u], normalDepthBuffer.data[index + 2u]);\n//     let px = vec3<f32>(normalDepthBuffer.data[index + 4u], normalDepthBuffer.data[index + 5u], normalDepthBuffer.data[index + 6u]);\n//     let py = vec3<f32>(normalDepthBuffer.data[index + u32(uniforms.width) * 4u + 0u], normalDepthBuffer.data[index + u32(uniforms.width) * 4u + 1u], normalDepthBuffer.data[index + u32(uniforms.width) * 4u + 2u]);\n//     let dpdx = px - p;\n//     let dpdy = py - p;\n//     let fwidth = abs(dpdx) + abs(dpdy);\n\n//     // Depth derivatives\n//     let d = normalDepthBuffer.data[index + 3u];\n//     let dx = normalDepthBuffer.data[index + 7u];\n//     let dy = normalDepthBuffer.data[index + u32(uniforms.width) * 4u + 3u];\n//     let ddpx = dx - d;\n//     let ddpy = dy - d;\n    \n//     // Normalize depth\n//     // let minDepth = uniforms.minDepth;\n//     // let maxDepth = uniforms.maxDepth;\n//     // let nd = (d - minDepth) / (maxDepth - minDepth);\n//     // let ndx = (dx - minDepth) / (maxDepth - minDepth);\n//     // let ndy = (dy - minDepth) / (maxDepth - minDepth);\n//     // let ddpx = ndx - nd;\n//     // let ddpy = ndy - nd;\n    \n//     let dfwidth = abs(ddpx) + abs(ddpy);\n\n//     // Output white when magnitude of dpdx over a threshold\n//     let depthEdge = uniforms.depthEdge;\n//     let normalEdge = uniforms.normalEdge;\n//     if (dot(fwidth, fwidth) > normalEdge || dfwidth > depthEdge) {\n//         return vec4<f32>(1f, 1f, 1f, 1f);\n//     } else {\n//         return vec4<f32>(0f, 0f, 0f, 1f);\n//     }\n// }\n\n@fragment\nfn frag_edge(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n    let x = floor(coord.x);\n    let y = floor(coord.y);\n    // let index = u32(x + y * uniforms.width) * 4u;\n    let index = u32(x + y * (uniforms.width + 1)) * 4u; // Overdispatched by 1\n    let background = uniforms.edgeBackground;\n    let foreground = uniforms.edgeForeground;\n    \n    // Prevent edge detection at screen edges\n    // Over-dispatched, so this is not needed\n    // if (x == uniforms.width - 1 || y == uniforms.height - 1) { return background; }\n\n    // Segment derivatives\n    // let yOffset = index + u32(uniforms.width) * 4u;\n    let yOffset = index + u32(uniforms.width + 1) * 4u; // Overdispatched by 1\n    let p = vec4<f32>(normalDepthBuffer.data[index + 0u], normalDepthBuffer.data[index + 1u], normalDepthBuffer.data[index + 2u], normalDepthBuffer.data[index + 3u]);\n    let px = vec4<f32>(normalDepthBuffer.data[index + 4u], normalDepthBuffer.data[index + 5u], normalDepthBuffer.data[index + 6u], normalDepthBuffer.data[index + 7u]);\n    let py = vec4<f32>(normalDepthBuffer.data[yOffset + 0u], normalDepthBuffer.data[yOffset + 1u], normalDepthBuffer.data[yOffset + 2u], normalDepthBuffer.data[yOffset + 3u]);\n    let dpdx = px - p;\n    let dpdy = py - p;\n    let fwidth = abs(dpdx) + abs(dpdy);\n\n    // Output white when magnitude of dpdx over a threshold\n    if (dot(fwidth, fwidth) > 0f) {\n        return foreground;\n    } else {\n        return background;\n\n        // TODO: Add another mode for edgeFill, or a flag for edgeFill (0 = background, 1 = color)\n        // Use idColor\n        // return p;\n        // return vec4<f32>(p.x, p.y, p.z, 1f);\n    }\n}\n\n@fragment\nfn frag_segment(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n    let x = floor(coord.x);\n    let y = floor(coord.y);\n\n    // let index = u32(x + y * uniforms.width) * 4u;\n    let index = u32(x + y * (uniforms.width + 1)) * 4u; // Overdispatched by 1\n    return vec4<f32>(normalDepthBuffer.data[index + 0u], normalDepthBuffer.data[index + 1u], normalDepthBuffer.data[index + 2u], 1f);\n}\n\n@fragment\nfn frag_main_hdr(@builtin(position) coord: vec4<f32>) -> @location(0) vec4<f32> {\n    let x = floor(coord.x);\n    let y = floor(coord.y);\n    let index = u32(x + y * uniforms.width) * 3u;\n    var color = vec3<f32>(colorBuffer.data[index + 0u], colorBuffer.data[index + 1u], colorBuffer.data[index + 2u]) / uniforms.samplesPerPixel;\n\n    // Simple tone-mapping from HDR to LDR\n    // if (uniforms.exposure > 0f) {\n    //     color = color * uniforms.exposure;\n    //     color = color / (color + vec3<f32>(1f, 1f, 1f));\n    // }\n    \n    color = color * uniforms.exposure;\n    // ACES\n    // https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/\n    let a = 2.51f;\n    let b = 0.03f;\n    let c = 2.43f;\n    let d = 0.59f;\n    let e = 0.14f;\n    color = (color * (a * color + b)) / (color * (c * color + d) + e);\n\n    // TODO: Can I get the avg luminance in the same way as the min/max depth?\n\n    // sRGB?\n    // https://sotrh.github.io/learn-wgpu/intermediate/tutorial13-hdr/#output-too-dark-on-webgpu\n\n// // Maps HDR values to linear values\n// // Based on http://www.oscars.org/science-technology/sci-tech-projects/aces\n// fn aces_tone_map(hdr: vec3<f32>) -> vec3<f32> {\n//     let m1 = mat3x3(\n//         0.59719, 0.07600, 0.02840,\n//         0.35458, 0.90834, 0.13383,\n//         0.04823, 0.01566, 0.83777,\n//     );\n//     let m2 = mat3x3(\n//         1.60475, -0.10208, -0.00327,\n//         -0.53108,  1.10813, -0.07276,\n//         -0.07367, -0.00605,  1.07602,\n//     );\n//     let v = m1 * hdr;\n//     let a = v * (v + 0.0245786) - 0.000090537;\n//     let b = v * (0.983729 * v + 0.4329510) + 0.238081;\n//     return clamp(m2 * (a / b), vec3(0.0), vec3(1.0));\n// }\n\n    // See https://bruop.github.io/tonemapping/\n    // See https://www.shadertoy.com/view/WdjSW3\n    // See https://sibras.github.io/OpenGL4-Tutorials/docs/Tutorials/10-Tutorial10/\n\n    // Gamma-correct\n    return vec4<f32>(pow(color, GAMMA), 1f);\n}`;\nclass $e354276e6b56108d$export$186ae5dce927ebd1 extends Float32Array {\n    constructor(){\n        super($e354276e6b56108d$export$186ae5dce927ebd1.SIZE);\n        this.WIDTH_OFFSET = 0;\n        this.HEIGHT_OFFSET = 1;\n        this.SPP_OFFSET = 2;\n        this.EXPOSURE_OFFSET = 3;\n        this.MIN_DEPTH_OFFSET = 4;\n        this.MAX_DEPTH_OFFSET = 5;\n        this.EDGE_NORMAL_OFFSET = 6;\n        this.EDGE_DEPTH_OFFSET = 7;\n        this.EDGE_FOREGROUND_OFFSET = 8;\n        this.EDGE_BACKGROUND_OFFSET = 12;\n    }\n    getWidth() {\n        return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value) {\n        this[this.WIDTH_OFFSET] = value;\n    }\n    getHeight() {\n        return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value) {\n        this[this.HEIGHT_OFFSET] = value;\n    }\n    getSamplesPerPixel() {\n        return this[this.SPP_OFFSET];\n    }\n    setSamplesPerPixel(value) {\n        this[this.SPP_OFFSET] = value;\n    }\n    getExposure() {\n        return this[this.EXPOSURE_OFFSET];\n    }\n    setExposure(value) {\n        this[this.EXPOSURE_OFFSET] = value;\n    }\n    getMinDepth() {\n        return this[this.MIN_DEPTH_OFFSET];\n    }\n    setMinDepth(value) {\n        this[this.MIN_DEPTH_OFFSET] = value;\n    }\n    getMaxDepth() {\n        return this[this.MAX_DEPTH_OFFSET];\n    }\n    setMaxDepth(value) {\n        this[this.MAX_DEPTH_OFFSET] = value;\n    }\n    getEdgeDepth() {\n        return this[this.EDGE_DEPTH_OFFSET];\n    }\n    setEdgeDepth(value) {\n        this[this.EDGE_DEPTH_OFFSET] = value;\n    }\n    getEdgeNormal() {\n        return this[this.EDGE_NORMAL_OFFSET];\n    }\n    setEdgeNormal(value) {\n        this[this.EDGE_NORMAL_OFFSET] = value;\n    }\n    getEdgeForeground(value) {\n        (0, $4c4ac78b213a9c07$exports).set(value, this[this.EDGE_FOREGROUND_OFFSET], this[this.EDGE_FOREGROUND_OFFSET + 1], this[this.EDGE_FOREGROUND_OFFSET + 2], this[this.EDGE_FOREGROUND_OFFSET + 3]);\n    }\n    setEdgeForeground(value) {\n        this[this.EDGE_FOREGROUND_OFFSET] = value[0];\n        this[this.EDGE_FOREGROUND_OFFSET + 1] = value[1];\n        this[this.EDGE_FOREGROUND_OFFSET + 2] = value[2];\n        this[this.EDGE_FOREGROUND_OFFSET + 3] = value[3];\n    }\n    getEdgeBackground(value) {\n        (0, $4c4ac78b213a9c07$exports).set(value, this[this.EDGE_BACKGROUND_OFFSET], this[this.EDGE_BACKGROUND_OFFSET + 1], this[this.EDGE_BACKGROUND_OFFSET + 2], this[this.EDGE_BACKGROUND_OFFSET + 3]);\n    }\n    setEdgeBackground(value) {\n        this[this.EDGE_BACKGROUND_OFFSET] = value[0];\n        this[this.EDGE_BACKGROUND_OFFSET + 1] = value[1];\n        this[this.EDGE_BACKGROUND_OFFSET + 2] = value[2];\n        this[this.EDGE_BACKGROUND_OFFSET + 3] = value[3];\n    }\n}\n$e354276e6b56108d$export$186ae5dce927ebd1.SIZE = 16;\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nconst $ee56e2b41e5e87b5$export$17e31acd02f2a1e = {\n    middle: \"middle\",\n    equalCounts: \"equalCounts\",\n    sah: \"sah\"\n};\nclass $ee56e2b41e5e87b5$var$BVHPrimitiveInfo {\n    get primitiveNumber() {\n        return this._primitiveNumber;\n    }\n    get bounds() {\n        return this._bounds;\n    }\n    get centroid() {\n        return this._centroid;\n    }\n    constructor(primitiveNumber, bounds){\n        this._primitiveNumber = primitiveNumber;\n        this._bounds = bounds;\n        this._centroid = (0, $31054a6c69637582$exports).create();\n        bounds.centroid(this._centroid);\n    }\n}\nclass $ee56e2b41e5e87b5$var$BVHBuildNode {\n    get bounds() {\n        return this._bounds;\n    }\n    get left() {\n        return this._left;\n    }\n    get right() {\n        return this._right;\n    }\n    get splitAxis() {\n        return this._splitAxis;\n    }\n    get firstPrimOffset() {\n        return this._firstPrimOffset;\n    }\n    get nPrimitives() {\n        return this._nPrimitives;\n    }\n    get start() {\n        return this._start;\n    }\n    get end() {\n        return this._end;\n    }\n    constructor(start, end){\n        this._start = start;\n        this._end = end;\n    }\n    initLeaf(first, n, bounds) {\n        this._firstPrimOffset = first;\n        this._nPrimitives = n;\n        this._bounds = bounds;\n        this._left = null;\n        this._right = null;\n    }\n    initInterior(axis, left, right) {\n        this._left = left;\n        this._right = right;\n        this._bounds = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        this._bounds.unionBounds(this._left.bounds);\n        this._bounds.unionBounds(this._right.bounds);\n        this._splitAxis = axis;\n        this._nPrimitives = 0;\n    }\n}\nclass $ee56e2b41e5e87b5$export$7213561f8313b4 {\n    constructor(){\n        this.bounds = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        this.primitivesOffset = 0;\n        this.secondChildOffset = 0;\n        this.nPrimitives = 0;\n        this.axis = 0;\n        this._centroid = (0, $31054a6c69637582$exports).create();\n        this._size = (0, $31054a6c69637582$exports).create();\n    }\n    toBuffer(buffer, index) {\n        this.bounds.centroid(this._centroid);\n        buffer.setCenter(index, this._centroid);\n        this.bounds.size(this._size);\n        (0, $31054a6c69637582$exports).scale(this._size, this._size, 0.5);\n        buffer.setSize(index, this._size);\n        buffer.setPrimitivesOffset(index, this.primitivesOffset);\n        buffer.setSecondChildOffset(index, this.secondChildOffset);\n        buffer.setNPrimitives(index, this.nPrimitives);\n        buffer.setAxis(index, this.axis);\n    }\n}\nclass $ee56e2b41e5e87b5$export$c191703b2daa3f18 {\n    get orderedPrimitives() {\n        return this._orderedPrimitives;\n    }\n    get nodes() {\n        return this._nodes;\n    }\n    constructor(core, primitives, maxPrimsInNode, splitMethod){\n        this._core = core;\n        if (!primitives || primitives.length == 0) return;\n        let start = performance.now();\n        this._maxPrimsInNode = maxPrimsInNode;\n        this._splitMethod = splitMethod;\n        this._primitives = primitives;\n        this._normalized = (0, $31054a6c69637582$exports).create();\n        this._primitiveInfo = [];\n        for(let i = 0; i < primitives.length; i++)this._primitiveInfo.push(new $ee56e2b41e5e87b5$var$BVHPrimitiveInfo(i, primitives[i].bounds));\n        this._totalNodes = 0;\n        this._orderedPrimitives = [];\n        const root = this._recursiveBuild(0, primitives.length);\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `bvh ${this._totalNodes} nodes split ${this._splitMethod} ${Math.round(window.performance.now() - start)}ms`);\n        start = performance.now();\n        this._nodes = [];\n        for(let i = 0; i < this._totalNodes; i++)this._nodes.push(new $ee56e2b41e5e87b5$export$7213561f8313b4());\n        this._offset = 0;\n        this._flattenBVHTree(root);\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `bvh flattened ${Math.round(window.performance.now() - start)}ms`);\n    }\n    _recursiveBuild(start, end) {\n        const node = new $ee56e2b41e5e87b5$var$BVHBuildNode(start, end - 1);\n        this._totalNodes++;\n        const bounds = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n        for(let i = start; i < end; i++)bounds.unionBounds(this._primitiveInfo[i].bounds);\n        const nPrimitives = end - start;\n        if (nPrimitives == 1) {\n            const firstPrimOffset = this._orderedPrimitives.length;\n            for(let i = start; i < end; i++){\n                const primNum = this._primitiveInfo[i].primitiveNumber;\n                this._orderedPrimitives.push(this._primitives[primNum]);\n            }\n            node.initLeaf(firstPrimOffset, nPrimitives, bounds);\n            return node;\n        } else {\n            const centroidBounds = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n            for(let i = start; i < end; i++)centroidBounds.unionPoint(this._primitiveInfo[i].centroid);\n            const dim = centroidBounds.maximumExtent();\n            let mid = Math.floor((start + end) / 2);\n            if (centroidBounds.max[dim] == centroidBounds.min[dim]) {\n                const firstPrimOffset = this._orderedPrimitives.length;\n                for(let i = start; i < end; i++){\n                    const primNum = this._primitiveInfo[i].primitiveNumber;\n                    this._orderedPrimitives.push(this._primitives[primNum]);\n                }\n                node.initLeaf(firstPrimOffset, nPrimitives, bounds);\n                return node;\n            } else {\n                switch(this._splitMethod){\n                    case $ee56e2b41e5e87b5$export$17e31acd02f2a1e.middle:\n                        break;\n                    case $ee56e2b41e5e87b5$export$17e31acd02f2a1e.equalCounts:\n                        mid = Math.floor((start + end) / 2);\n                        const primtiveInfo = this._primitiveInfo.slice(start, end);\n                        primtiveInfo.sort(function(a, b) {\n                            return a.centroid[dim] - b.centroid[dim];\n                        });\n                        for(let i = start; i < end; i++)this._primitiveInfo[i] = primtiveInfo[i - start];\n                        break;\n                    case $ee56e2b41e5e87b5$export$17e31acd02f2a1e.sah:\n                    default:\n                        if (nPrimitives <= 4) {\n                            mid = Math.floor((start + end) / 2);\n                            const primtiveInfo = this._primitiveInfo.slice(start, end);\n                            primtiveInfo.sort(function(a, b) {\n                                return a.centroid[dim] - b.centroid[dim];\n                            });\n                            for(let i = start; i < end; i++)this._primitiveInfo[i] = primtiveInfo[i - start];\n                        } else {\n                            const nBuckets = 12;\n                            const buckets = [];\n                            for(let i = 0; i < nBuckets; i++)buckets.push({\n                                count: 0,\n                                bounds: new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)()\n                            });\n                            for(let i = start; i < end; i++){\n                                centroidBounds.offset(this._primitiveInfo[i].centroid, this._normalized);\n                                const b = Math.min(Math.round(nBuckets * this._normalized[dim]), nBuckets - 1);\n                                buckets[b].count++;\n                                buckets[b].bounds.unionBounds(this._primitiveInfo[i].bounds);\n                            }\n                            const cost = [];\n                            for(let i = 0; i < nBuckets - 1; i++){\n                                const b0 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n                                const b1 = new (0, $f858a5fa67a435f5$export$8ec70f2db73b49aa)();\n                                let count0 = 0;\n                                let count1 = 0;\n                                for(let j = 0; j <= i; j++){\n                                    b0.unionBounds(buckets[j].bounds);\n                                    count0 += buckets[j].count;\n                                }\n                                for(let j = i + 1; j < nBuckets; j++){\n                                    b1.unionBounds(buckets[j].bounds);\n                                    count1 += buckets[j].count;\n                                }\n                                cost.push(0.125 + (count0 * b0.surfaceArea() + count1 * b1.surfaceArea()) / bounds.surfaceArea());\n                            }\n                            let minCost = cost[0];\n                            let minCostSplitBucket = 0;\n                            for(let i = 1; i < nBuckets - 1; i++)if (cost[i] < minCost) {\n                                minCost = cost[i];\n                                minCostSplitBucket = i;\n                            }\n                            const leafCost = nPrimitives;\n                            if (nPrimitives > this._maxPrimsInNode || minCost < leafCost) {\n                                const primtiveInfo = this._primitiveInfo.slice(start, end);\n                                primtiveInfo.sort(function(a, b) {\n                                    return a.centroid[dim] - b.centroid[dim];\n                                });\n                                for(let i = start; i < end; i++)this._primitiveInfo[i] = primtiveInfo[i - start];\n                                for(let i = start; i < end; i++){\n                                    centroidBounds.offset(this._primitiveInfo[i].centroid, this._normalized);\n                                    const b = Math.min(Math.round(nBuckets * this._normalized[dim]), nBuckets - 1);\n                                    if (b > minCostSplitBucket) {\n                                        mid = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                const firstPrimOffset = this._orderedPrimitives.length;\n                                for(let i = start; i < end; i++){\n                                    const primNum = this._primitiveInfo[i].primitiveNumber;\n                                    this._orderedPrimitives.push(this._primitives[primNum]);\n                                }\n                                node.initLeaf(firstPrimOffset, nPrimitives, bounds);\n                                return node;\n                            }\n                        }\n                        break;\n                }\n                node.initInterior(dim, this._recursiveBuild(start, mid), this._recursiveBuild(mid, end));\n            }\n        }\n        return node;\n    }\n    _flattenBVHTree(node) {\n        const linearNode = this._nodes[this._offset];\n        linearNode.bounds = node.bounds;\n        const myOffset = this._offset++;\n        if (node.nPrimitives > 0) {\n            linearNode.primitivesOffset = node.firstPrimOffset;\n            linearNode.nPrimitives = node.nPrimitives;\n        } else {\n            linearNode.axis = node.splitAxis;\n            linearNode.nPrimitives = 0;\n            this._flattenBVHTree(node.left);\n            linearNode.secondChildOffset = this._flattenBVHTree(node.right);\n        }\n        return myOffset;\n    }\n}\nclass $ee56e2b41e5e87b5$export$9e920ed4165673f5 extends Float32Array {\n    constructor(count){\n        super(count * $ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE);\n        this.CENTER_OFFSET = 0;\n        this.SIZE_OFFSET = 4;\n        this.PRIMITIVES_OFFSET_OFFSET = 3;\n        this.SECOND_CHILD_OFFSET_OFFSET = 7;\n        this.N_PRIMITIVES_OFFSET = 8;\n        this.AXIS_OFFSET = 9;\n    }\n    getCenter(index, value) {\n        const offset = $ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.CENTER_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setCenter(index, value) {\n        const offset = $ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.CENTER_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getSize(index, value) {\n        const offset = $ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.SIZE_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setSize(index, value) {\n        const offset = $ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.SIZE_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getPrimitivesOffset(index) {\n        return this[$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.PRIMITIVES_OFFSET_OFFSET];\n    }\n    setPrimitivesOffset(index, value) {\n        this[$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.PRIMITIVES_OFFSET_OFFSET] = value;\n    }\n    getSecondChildOffset(index) {\n        return this[$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.SECOND_CHILD_OFFSET_OFFSET];\n    }\n    setSecondChildOffset(index, value) {\n        this[$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.SECOND_CHILD_OFFSET_OFFSET] = value;\n    }\n    getNPrimitives(index) {\n        return this[$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.N_PRIMITIVES_OFFSET];\n    }\n    setNPrimitives(index, value) {\n        this[$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.N_PRIMITIVES_OFFSET] = value;\n    }\n    getAxis(index) {\n        return this[$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.AXIS_OFFSET];\n    }\n    setAxis(index, value) {\n        this[$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE * index + this.AXIS_OFFSET] = value;\n    }\n}\n$ee56e2b41e5e87b5$export$9e920ed4165673f5.SIZE = 12;\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nconst $1596feb7c9451159$export$72af01233b4eb08d = {\n    distant: 0,\n    sphere: 1,\n    rect: 2,\n    disc: 3,\n    cylinder: 4,\n    dome: 5\n};\nclass $1596feb7c9451159$export$82650fd3490ceb3f extends Float32Array {\n    constructor(count){\n        super(count * $1596feb7c9451159$export$82650fd3490ceb3f.SIZE);\n        this.ROTATION_OFFSET = 0;\n        this.CENTER_OFFSET = 4;\n        this.TYPE_OFFSET = 7;\n        this.SIZE_OFFSET = 8;\n        this.COLOR_OFFSET = 12;\n    }\n    getType(index) {\n        return this[$1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.TYPE_OFFSET];\n    }\n    setType(index, value) {\n        this[$1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.TYPE_OFFSET] = value;\n    }\n    getCenter(index, value) {\n        const offset = $1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.CENTER_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setCenter(index, value) {\n        const offset = $1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.CENTER_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getSize(index, value) {\n        const offset = $1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.SIZE_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setSize(index, value) {\n        const offset = $1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.SIZE_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getColor(index, value) {\n        const offset = $1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.COLOR_OFFSET;\n        (0, $31054a6c69637582$exports).set(value, this[offset], this[offset + 1], this[offset + 2]);\n    }\n    setColor(index, value) {\n        const offset = $1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.COLOR_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n    }\n    getRotation(index, value) {\n        const offset = $1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.ROTATION_OFFSET;\n        (0, $39ece26d1239bb77$exports).set(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n    }\n    setRotation(index, value) {\n        const offset = $1596feb7c9451159$export$82650fd3490ceb3f.SIZE * index + this.ROTATION_OFFSET;\n        this[offset] = value[0];\n        this[offset + 1] = value[1];\n        this[offset + 2] = value[2];\n        this[offset + 3] = value[3];\n    }\n}\n$1596feb7c9451159$export$82650fd3490ceb3f.SIZE = 16;\nclass $1596feb7c9451159$export$6ecadb6ed240d696 {\n    constructor(options){\n        this.color = options.color;\n        this.center = options.center;\n    }\n    toBuffer(buffer, index) {\n        buffer.setCenter(index, this.center);\n        buffer.setColor(index, this.color);\n    }\n}\nclass $1596feb7c9451159$export$f6705b6c922d7219 extends $1596feb7c9451159$export$6ecadb6ed240d696 {\n    constructor(options){\n        super(options);\n        this.radius = options.radius / 2;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $1596feb7c9451159$export$72af01233b4eb08d.sphere);\n        buffer.setSize(index, (0, $31054a6c69637582$exports).fromValues(this.radius, this.radius, this.radius));\n    }\n}\nclass $1596feb7c9451159$export$1f9284d52f5c21ca extends $1596feb7c9451159$export$6ecadb6ed240d696 {\n    constructor(options){\n        super(options);\n        this._thickness = 0.00001;\n        this.size = options.size;\n        this.rotation = options.rotation;\n    }\n    toBuffer(buffer, index) {\n        super.toBuffer(buffer, index);\n        buffer.setType(index, $1596feb7c9451159$export$72af01233b4eb08d.rect);\n        buffer.setSize(index, (0, $31054a6c69637582$exports).fromValues(this.size[0], this.size[1], this._thickness));\n        buffer.setRotation(index, this.rotation);\n    }\n}\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \nclass $70798b808a7c0587$export$e784a6eab4d2d700 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get font() {\n        return this._font;\n    }\n    constructor(core, font){\n        this._core = core;\n        this._font = font;\n        font.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n    }\n    initializeContext(device) {\n        this._device = device;\n        this._hasChanged = true;\n        this._isInitialized = true;\n    }\n    update() {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            const start = window.performance.now();\n            const imageData = this._font.atlas.imageData;\n            const textureSize = {\n                width: imageData.width,\n                height: imageData.height\n            };\n            createImageBitmap(imageData).then((imageBitmap)=>{\n                const textureDescriptor = {\n                    size: textureSize,\n                    format: 'rgba8unorm',\n                    usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT\n                };\n                this.texture = this._device.createTexture(textureDescriptor);\n                const imageCopyExternalImage = {\n                    source: imageBitmap\n                };\n                const imageCopyTextureTagged = {\n                    texture: this.texture\n                };\n                const copySize = {\n                    width: imageData.width,\n                    height: imageData.height\n                };\n                this._device.queue.copyExternalImageToTexture(imageCopyExternalImage, imageCopyTextureTagged, copySize);\n                if (this.hasChangedCallback) this.hasChangedCallback();\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `${this._font.name} texture updated ${Math.round(window.performance.now() - start)}ms`);\n            });\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $18e0078d8611e105$export$6f251cd327b2ff1 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get image() {\n        return this._image;\n    }\n    render(elapsedTime) {}\n    constructor(core, main, image){\n        this._core = core;\n        this._main = main;\n        this._image = image;\n        this.isVisible = true;\n        image.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n    }\n    initializeContext(device) {\n        if (!this._image.isInitialized) this._image.initialize();\n        this._hasChanged = true;\n        this._isInitialized = true;\n    }\n    update() {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            const modelPosition = (0, $31054a6c69637582$exports).create();\n            const modelScale = this._core.getModelScale();\n            const modelRotation = (0, $39ece26d1239bb77$exports).create();\n            this._core.getModelRotation(modelRotation);\n            const modelSizeX = this._image.maxBoundsX - this._image.minBoundsX;\n            const modelSizeY = this._image.maxBoundsY - this._image.minBoundsY;\n            const modelSizeZ = this._image.maxBoundsZ - this._image.minBoundsZ;\n            const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n            const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n            (0, $31054a6c69637582$exports).set(modelPosition, this._main.mMatrix[12], this._main.mMatrix[13], this._main.mMatrix[14]);\n            if (this._image instanceof (0, $f7de7bdc7bccbb25$export$3f0bd71f9b37d8ee)) {\n                const imageQuad = this._image;\n                const position = (0, $31054a6c69637582$exports).fromValues((imageQuad.minBoundsX + imageQuad.maxBoundsX) / 2, (imageQuad.minBoundsY + imageQuad.maxBoundsY) / 2, (imageQuad.minBoundsZ + imageQuad.maxBoundsZ) / 2);\n                (0, $31054a6c69637582$exports).subtract(position, imageQuad.position, position);\n                (0, $31054a6c69637582$exports).scale(position, position, boundsScaling);\n                (0, $31054a6c69637582$exports).scale(position, position, modelScale);\n                (0, $31054a6c69637582$exports).transformQuat(position, position, modelRotation);\n                (0, $31054a6c69637582$exports).add(position, position, modelPosition);\n                const hittableRotatedXyRectOptions = {\n                    center0: position,\n                    center1: position,\n                    time0: 1,\n                    time1: 1,\n                    size0: (0, $91b0cc4981465964$exports).fromValues(imageQuad.width * boundsScaling * modelScale / 2, imageQuad.height * boundsScaling * modelScale / 2),\n                    size1: (0, $91b0cc4981465964$exports).fromValues(imageQuad.width * boundsScaling * modelScale / 2, imageQuad.height * boundsScaling * modelScale / 2),\n                    texCoord0: imageQuad.texCoord0,\n                    texCoord1: imageQuad.texCoord1,\n                    rotation0: imageQuad.rotation,\n                    rotation1: imageQuad.rotation\n                };\n                this.hittable = new (0, $66964bfc3ddbcb4c$export$71089e9c0fdb5c5)(hittableRotatedXyRectOptions);\n            } else if (this._image instanceof (0, $f7de7bdc7bccbb25$export$f4ca272a8ace4457)) {\n                const imageSphere = this._image;\n                const position = imageSphere.position;\n                (0, $31054a6c69637582$exports).subtract(position, imageSphere.position, position);\n                (0, $31054a6c69637582$exports).scale(position, position, boundsScaling);\n                (0, $31054a6c69637582$exports).scale(position, position, modelScale);\n                (0, $31054a6c69637582$exports).transformQuat(position, position, modelRotation);\n                (0, $31054a6c69637582$exports).add(position, position, modelPosition);\n                const hittableSphereOptions = {\n                    center0: position,\n                    center1: position,\n                    time0: 1,\n                    time1: 1,\n                    radius: imageSphere.radius * boundsScaling\n                };\n                this.hittable = new (0, $66964bfc3ddbcb4c$export$f44a85073ff35bb)(hittableSphereOptions);\n            }\n            if (this.hasChangedCallback) this.hasChangedCallback();\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $b084cfc4223cd4fe$export$97e93e7019ef67b9 {\n    get isInitialized() {\n        return this._isInitialized;\n    }\n    get label() {\n        return this._labelSet;\n    }\n    render(elapsedTime) {}\n    constructor(core, main, labelSet){\n        this._core = core;\n        this._main = main;\n        this._labelSet = labelSet;\n        this.isVisible = true;\n        labelSet.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n        if (!this._labelSet.isInitialized) this._labelSet.initialize();\n        if (this._labelSet.text && this._labelSet.text.length > 0) this._hasChanged = true;\n        this._isInitialized = true;\n    }\n    update() {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            this.hittables = [];\n            const modelPosition = (0, $31054a6c69637582$exports).create();\n            const modelScale = this._core.getModelScale();\n            const modelRotation = (0, $39ece26d1239bb77$exports).create();\n            this._core.getModelRotation(modelRotation);\n            (0, $31054a6c69637582$exports).set(modelPosition, this._main.mMatrix[12], this._main.mMatrix[13], this._main.mMatrix[14]);\n            const glpyhRotation = (0, $39ece26d1239bb77$exports).create();\n            const glyphInvRotation = (0, $39ece26d1239bb77$exports).create();\n            const position0 = (0, $31054a6c69637582$exports).create();\n            const position1 = (0, $31054a6c69637582$exports).create();\n            const dataView = this._labelSet.verticesView;\n            const labelCount = this._labelSet.text.length;\n            let glyphIndex = 0;\n            for(let i = 0; i < labelCount; i++){\n                const materialType = this._labelSet.materialType !== undefined ? this._labelSet.materialType : this._labelSet.materialTypes ? this._labelSet.materialTypes[i] : 0;\n                const materialColor = this._labelSet.materialColor ? this._labelSet.materialColor : this._labelSet.materialColors ? [\n                    this._labelSet.materialColors[i * 3],\n                    this._labelSet.materialColors[i * 3 + 1],\n                    this._labelSet.materialColors[i * 3 + 2]\n                ] : this._core.config.textColor;\n                const materialFuzz = this._labelSet.materialFuzz !== undefined ? this._labelSet.materialFuzz : this._labelSet.materialFuzzes ? this._labelSet.materialFuzzes[i] : 0;\n                const materialGloss = this._labelSet.materialGloss !== undefined ? this._labelSet.materialGloss : this._labelSet.materialGlosses ? this._labelSet.materialGlosses[i] : 0;\n                const segmentColor = this._labelSet.segmentColor ? this._labelSet.segmentColor : this._labelSet.segmentColors ? [\n                    this._labelSet.segmentColors[i * 4],\n                    this._labelSet.segmentColors[i * 4 + 1],\n                    this._labelSet.segmentColors[i * 4 + 2],\n                    this._labelSet.segmentColors[i * 4 + 3]\n                ] : [\n                    0,\n                    0,\n                    0,\n                    0\n                ];\n                materialColor[0] = Math.pow(materialColor[0], 2.2);\n                materialColor[1] = Math.pow(materialColor[1], 2.2);\n                materialColor[2] = Math.pow(materialColor[2], 2.2);\n                const glyphCount = this._labelSet.text[i].length;\n                for(let j = 0; j < glyphCount; j++){\n                    (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).getPosition(dataView, glyphIndex * 4 + 2, position0);\n                    (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).getPosition(dataView, glyphIndex * 4 + 1, position1);\n                    (0, $31054a6c69637582$exports).scale(position0, position0, modelScale);\n                    (0, $31054a6c69637582$exports).scale(position1, position1, modelScale);\n                    (0, $31054a6c69637582$exports).transformQuat(position0, position0, modelRotation);\n                    (0, $31054a6c69637582$exports).transformQuat(position1, position1, modelRotation);\n                    (0, $31054a6c69637582$exports).add(position0, position0, modelPosition);\n                    (0, $31054a6c69637582$exports).add(position1, position1, modelPosition);\n                    const centroid = (0, $31054a6c69637582$exports).create();\n                    (0, $31054a6c69637582$exports).add(centroid, position0, position1);\n                    (0, $31054a6c69637582$exports).scale(centroid, centroid, 0.5);\n                    if (this._labelSet.rotation) (0, $39ece26d1239bb77$exports).set(glpyhRotation, this._labelSet.rotation[0], this._labelSet.rotation[1], this._labelSet.rotation[2], this._labelSet.rotation[3]);\n                    else if (this._labelSet.rotations) (0, $39ece26d1239bb77$exports).set(glpyhRotation, this._labelSet.rotations[i * 4], this._labelSet.rotations[i * 4 + 1], this._labelSet.rotations[i * 4 + 2], this._labelSet.rotations[i * 4 + 3]);\n                    else (0, $39ece26d1239bb77$exports).identity(glpyhRotation);\n                    const rotation = (0, $39ece26d1239bb77$exports).clone(glpyhRotation);\n                    (0, $39ece26d1239bb77$exports).multiply(rotation, modelRotation, rotation);\n                    (0, $39ece26d1239bb77$exports).conjugate(glyphInvRotation, rotation);\n                    (0, $31054a6c69637582$exports).subtract(position0, position0, centroid);\n                    (0, $31054a6c69637582$exports).subtract(position1, position1, centroid);\n                    (0, $31054a6c69637582$exports).transformQuat(position0, position0, glyphInvRotation);\n                    (0, $31054a6c69637582$exports).transformQuat(position1, position1, glyphInvRotation);\n                    (0, $31054a6c69637582$exports).add(position0, position0, centroid);\n                    (0, $31054a6c69637582$exports).add(position1, position1, centroid);\n                    const texCoord0 = (0, $91b0cc4981465964$exports).create();\n                    const texCoord1 = (0, $91b0cc4981465964$exports).create();\n                    (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).getTexCoord(dataView, glyphIndex * 4 + 2, texCoord0);\n                    (0, $0a0587bd8b0d58e8$export$74c3c25430a16442).getTexCoord(dataView, glyphIndex * 4 + 1, texCoord1);\n                    const hittableFontOptions = {\n                        center0: centroid,\n                        center1: centroid,\n                        time0: 1,\n                        time1: 1,\n                        size0: (0, $91b0cc4981465964$exports).fromValues((position1[0] - position0[0]) / 2, (position1[1] - position0[1]) / 2),\n                        size1: (0, $91b0cc4981465964$exports).fromValues((position1[0] - position0[0]) / 2, (position1[1] - position0[1]) / 2),\n                        texCoord0: texCoord0,\n                        texCoord1: texCoord1,\n                        rotation0: rotation,\n                        rotation1: rotation,\n                        sdfBuffer: this._core.config.sdfBuffer,\n                        materialType: materialType,\n                        materialColor: materialColor,\n                        materialFuzz: materialFuzz,\n                        materialGloss: materialGloss,\n                        segmentColor: segmentColor\n                    };\n                    const hittable = new (0, $66964bfc3ddbcb4c$export$402b844452575dc9)(hittableFontOptions);\n                    this.hittables.push(hittable);\n                    glyphIndex++;\n                }\n            }\n            if (this.hasChangedCallback) this.hasChangedCallback();\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n\n\n\n\n\n\nclass $93345e9ee93b28fb$export$a143d493d941bafc extends (0, $96371271bb28b98d$export$c1cecec923d96e5c) {\n    constructor(core, ids){\n        super(core, ids);\n        this._isInitialized = true;\n    }\n    update() {\n        if (this._isInitialized) {\n            if (this.hasChangedCallback) this.hasChangedCallback();\n        }\n    }\n}\nclass $93345e9ee93b28fb$export$76de936b3c1c4170 extends (0, $96371271bb28b98d$export$e17d4fc1dafc1240) {\n    get time0() {\n        return this._time0;\n    }\n    set time0(value) {\n        if (this._time0 != value) {\n            this._time0 = value;\n            this._hasChanged = true;\n        }\n    }\n    get time1() {\n        return this._time1;\n    }\n    set time1(value) {\n        if (this._time1 != value) {\n            this._time1 = value;\n            this._hasChanged = true;\n        }\n    }\n    get duration() {\n        return this._duration;\n    }\n    set duration(value) {\n        if (this._duration != value) {\n            this._duration = value;\n            this._hasChanged = true;\n        }\n    }\n    get stagger() {\n        return this.stagger;\n    }\n    set stagger(value) {\n        if (this._stagger != value) {\n            this._stagger = value;\n            this._hasChanged = true;\n        }\n    }\n    constructor(core, main, ids){\n        super(core, ids, $93345e9ee93b28fb$export$a143d493d941bafc, (0, $548ced3eab978a8c$export$e2fbaa661ec19dbf), (0, $0a2e9437355c0494$export$e47fdbcb2ea069e5));\n        this._main = main;\n        this._time0 = 0;\n        this._time1 = 1;\n        this._buffer1.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n        this._buffer2.hasChangedCallback = ()=>{\n            this._hasChanged = true;\n        };\n        this._isInitialized = true;\n    }\n    update() {\n        if (this._hasChanged && this._isInitialized) {\n            this._hasChanged = false;\n            const start = window.performance.now();\n            this.hittables = [];\n            const modelPosition = (0, $31054a6c69637582$exports).create();\n            const modelScale = this._core.getModelScale();\n            const modelRotation = (0, $39ece26d1239bb77$exports).create();\n            this._core.getModelRotation(modelRotation);\n            this.minY = Number.MAX_VALUE;\n            (0, $31054a6c69637582$exports).set(modelPosition, this._main.mMatrix[12], this._main.mMatrix[13], this._main.mMatrix[14]);\n            const previousBuffer = this.previousBuffer;\n            const currentBuffer = this.currentBuffer;\n            const currentUnitTranslation = (0, $31054a6c69637582$exports).create();\n            const previousUnitTranslation = (0, $31054a6c69637582$exports).create();\n            const currentUnitScale = (0, $31054a6c69637582$exports).create();\n            const previousUnitScale = (0, $31054a6c69637582$exports).create();\n            const currentUnitRotation = (0, $39ece26d1239bb77$exports).create();\n            const previousUnitRotation = (0, $39ece26d1239bb77$exports).create();\n            const unitOrder = (0, $91b0cc4981465964$exports).create();\n            const transitionDuration = this._duration / (this._duration + this._stagger);\n            const rgb = [\n                0,\n                0,\n                0\n            ];\n            const rgba = [\n                0,\n                0,\n                0,\n                0\n            ];\n            for(let j = 0; j < currentBuffer.ids.length; j++){\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getOrder(currentBuffer.dataView, j, unitOrder);\n                const startTime = unitOrder[1] * (1 - transitionDuration);\n                const animation0 = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp((this._time0 - startTime) / transitionDuration, 0, 1);\n                const animation1 = (0, $2d4d1eb6f32f02f2$export$80a8c44b8858d625).clamp((this._time1 - startTime) / transitionDuration, 0, 1);\n                const unitScale0 = (0, $31054a6c69637582$exports).create();\n                const unitScale1 = (0, $31054a6c69637582$exports).create();\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getScale(currentBuffer.dataView, j, currentUnitScale);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getScale(previousBuffer.dataView, j, previousUnitScale);\n                (0, $31054a6c69637582$exports).lerp(unitScale0, previousUnitScale, currentUnitScale, animation0);\n                (0, $31054a6c69637582$exports).lerp(unitScale1, previousUnitScale, currentUnitScale, animation1);\n                const unitTranslation0 = (0, $31054a6c69637582$exports).create();\n                const unitTranslation1 = (0, $31054a6c69637582$exports).create();\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTranslation(currentBuffer.dataView, j, currentUnitTranslation);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTranslation(previousBuffer.dataView, j, previousUnitTranslation);\n                (0, $31054a6c69637582$exports).lerp(unitTranslation0, previousUnitTranslation, currentUnitTranslation, animation0);\n                (0, $31054a6c69637582$exports).lerp(unitTranslation1, previousUnitTranslation, currentUnitTranslation, animation1);\n                const unitRotation0 = (0, $39ece26d1239bb77$exports).create();\n                const unitRotation1 = (0, $39ece26d1239bb77$exports).create();\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getRotation(currentBuffer.dataView, j, currentUnitRotation);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getRotation(previousBuffer.dataView, j, previousUnitRotation);\n                (0, $39ece26d1239bb77$exports).slerp(unitRotation0, previousUnitRotation, currentUnitRotation, animation0);\n                (0, $39ece26d1239bb77$exports).slerp(unitRotation1, previousUnitRotation, currentUnitRotation, animation1);\n                (0, $39ece26d1239bb77$exports).multiply(unitRotation0, modelRotation, unitRotation0);\n                (0, $39ece26d1239bb77$exports).multiply(unitRotation1, modelRotation, unitRotation1);\n                (0, $31054a6c69637582$exports).scale(unitTranslation0, unitTranslation0, modelScale);\n                (0, $31054a6c69637582$exports).scale(unitTranslation1, unitTranslation1, modelScale);\n                (0, $31054a6c69637582$exports).transformQuat(unitTranslation0, unitTranslation0, modelRotation);\n                (0, $31054a6c69637582$exports).transformQuat(unitTranslation1, unitTranslation1, modelRotation);\n                (0, $31054a6c69637582$exports).add(unitTranslation0, unitTranslation0, modelPosition);\n                (0, $31054a6c69637582$exports).add(unitTranslation1, unitTranslation1, modelPosition);\n                (0, $31054a6c69637582$exports).scale(unitScale0, unitScale0, modelScale / 2);\n                (0, $31054a6c69637582$exports).scale(unitScale1, unitScale1, modelScale / 2);\n                unitScale0[0] = Math.max(unitScale0[0], 0.00001);\n                unitScale0[1] = Math.max(unitScale0[1], 0.00001);\n                unitScale0[2] = Math.max(unitScale0[2], 0.00001);\n                unitScale1[0] = Math.max(unitScale1[0], 0.00001);\n                unitScale1[1] = Math.max(unitScale1[1], 0.00001);\n                unitScale1[2] = Math.max(unitScale1[2], 0.00001);\n                const endTime = startTime + transitionDuration;\n                const time0 = Math.min(Math.max((startTime - this._time0) / (this._time1 - this.time0), 0), 1);\n                const time1 = Math.min(Math.max((endTime - this._time0) / (this._time1 - this.time0), 0), 1);\n                let hittable;\n                let unitTexCoord;\n                switch(currentBuffer.unitType){\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).sphere:\n                        hittable = new (0, $66964bfc3ddbcb4c$export$f44a85073ff35bb)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            radius: unitScale0[0]\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).sphereSdf:\n                        hittable = new (0, $66964bfc3ddbcb4c$export$86630ee69b6c2fb)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            radius: unitScale0[0]\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).disk:\n                        unitTexCoord = (0, $4c4ac78b213a9c07$exports).create();\n                        (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTexCoord(currentBuffer.dataView, j, unitTexCoord);\n                        if (unitRotation1[3] == 1) hittable = new (0, $66964bfc3ddbcb4c$export$3f7e8ab42d22375)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            radius0: unitScale0[0],\n                            radius1: unitScale1[0],\n                            texCoord0: (0, $91b0cc4981465964$exports).fromValues(unitTexCoord[0], unitTexCoord[3]),\n                            texCoord1: (0, $91b0cc4981465964$exports).fromValues(unitTexCoord[2], unitTexCoord[1])\n                        });\n                        else hittable = new (0, $66964bfc3ddbcb4c$export$1d27985e95946d19)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            radius0: unitScale0[0],\n                            radius1: unitScale1[0],\n                            rotation0: unitRotation0,\n                            rotation1: unitRotation1,\n                            texCoord0: (0, $91b0cc4981465964$exports).fromValues(unitTexCoord[0], unitTexCoord[3]),\n                            texCoord1: (0, $91b0cc4981465964$exports).fromValues(unitTexCoord[2], unitTexCoord[1])\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).block:\n                        if (unitRotation1[3] == 1) hittable = new (0, $66964bfc3ddbcb4c$export$28497cc10fec95c2)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            size0: unitScale0,\n                            size1: unitScale1\n                        });\n                        else hittable = new (0, $66964bfc3ddbcb4c$export$acdc70fb29a0312b)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            size0: unitScale0,\n                            size1: unitScale1,\n                            rotation0: unitRotation0,\n                            rotation1: unitRotation1\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).sdf:\n                        unitTexCoord = (0, $4c4ac78b213a9c07$exports).create();\n                        (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTexCoord(currentBuffer.dataView, j, unitTexCoord);\n                        const texId = (0, $0a0587bd8b0d58e8$export$849e31d725692576).getTexture(currentBuffer.dataView, j);\n                        const sdfBuffer = (0, $0a0587bd8b0d58e8$export$849e31d725692576).getSdfBuffer(currentBuffer.dataView, j);\n                        const sdfBorder = (0, $0a0587bd8b0d58e8$export$849e31d725692576).getSdfBorder(currentBuffer.dataView, j);\n                        const options = {\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            size0: (0, $91b0cc4981465964$exports).fromValues(unitScale0[0], unitScale0[1]),\n                            size1: (0, $91b0cc4981465964$exports).fromValues(unitScale1[0], unitScale1[1]),\n                            texCoord0: (0, $91b0cc4981465964$exports).fromValues(unitTexCoord[0], unitTexCoord[3]),\n                            texCoord1: (0, $91b0cc4981465964$exports).fromValues(unitTexCoord[2], unitTexCoord[1]),\n                            rotation0: unitRotation0,\n                            rotation1: unitRotation1,\n                            texId: texId,\n                            sdfBuffer: sdfBuffer,\n                            sdfBorder: sdfBorder\n                        };\n                        hittable = unitRotation1[3] == 1 ? new (0, $66964bfc3ddbcb4c$export$6d714417e0aa3f19)(options) : new (0, $66964bfc3ddbcb4c$export$c2e43d40ab2c967e)(options);\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).blockSdf:\n                        if (unitRotation1[3] == 1) hittable = new (0, $66964bfc3ddbcb4c$export$dfaec831a2de7e90)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            size0: unitScale0,\n                            size1: unitScale1,\n                            rounding: Math.min(Math.min(Math.min((0, $0a0587bd8b0d58e8$export$849e31d725692576).getRounding(currentBuffer.dataView, j) * modelScale, unitScale0[0]), unitScale0[1]), unitScale0[2])\n                        });\n                        else hittable = new (0, $66964bfc3ddbcb4c$export$e349e1996fd043a1)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            size0: unitScale0,\n                            size1: unitScale1,\n                            rounding: Math.min(Math.min(Math.min((0, $0a0587bd8b0d58e8$export$849e31d725692576).getRounding(currentBuffer.dataView, j) * modelScale, unitScale0[0]), unitScale0[1]), unitScale0[2]),\n                            rotation0: unitRotation0,\n                            rotation1: unitRotation1\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).ringSdf:\n                        if (unitRotation1[3] == 1) hittable = new (0, $66964bfc3ddbcb4c$export$d84131593262075b)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            size0: unitScale0,\n                            size1: unitScale1,\n                            angle0: (0, $0a0587bd8b0d58e8$export$849e31d725692576).getParameter1(currentBuffer.dataView, j),\n                            innerRadius0: (0, $0a0587bd8b0d58e8$export$849e31d725692576).getParameter2(currentBuffer.dataView, j),\n                            rounding: Math.min(Math.min(Math.min((0, $0a0587bd8b0d58e8$export$849e31d725692576).getRounding(currentBuffer.dataView, j) * modelScale, unitScale0[0]), unitScale0[1]), unitScale0[2])\n                        });\n                        else hittable = new (0, $66964bfc3ddbcb4c$export$2d4dbfe5a7e22bdf)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            size0: unitScale0,\n                            size1: unitScale1,\n                            angle0: (0, $0a0587bd8b0d58e8$export$849e31d725692576).getParameter1(currentBuffer.dataView, j),\n                            innerRadius0: (0, $0a0587bd8b0d58e8$export$849e31d725692576).getParameter2(currentBuffer.dataView, j),\n                            rounding: Math.min(Math.min(Math.min((0, $0a0587bd8b0d58e8$export$849e31d725692576).getRounding(currentBuffer.dataView, j) * modelScale, unitScale0[0]), unitScale0[1]), unitScale0[2]),\n                            rotation0: unitRotation0,\n                            rotation1: unitRotation1\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).tubeSdf:\n                        hittable = new (0, $66964bfc3ddbcb4c$export$8c6d7438a2b5cc70)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            innerRadius: unitScale0[0],\n                            outerRadius: unitScale0[2],\n                            height: unitScale0[1],\n                            rounding: Math.min(Math.min(Math.min((0, $0a0587bd8b0d58e8$export$849e31d725692576).getRounding(currentBuffer.dataView, j) * modelScale, unitScale0[0]), unitScale0[1]), unitScale0[2])\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinder:\n                        hittable = new (0, $66964bfc3ddbcb4c$export$cd2cb390b9add281)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            radius: unitScale0[0],\n                            height: unitScale0[1],\n                            rotation0: unitRotation0,\n                            rotation1: unitRotation1\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinderSdf:\n                        hittable = new (0, $66964bfc3ddbcb4c$export$563880b935f7aee2)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            radius: unitScale0[0],\n                            height: unitScale0[1],\n                            rounding: Math.min(Math.min((0, $0a0587bd8b0d58e8$export$849e31d725692576).getRounding(currentBuffer.dataView, j) * modelScale, unitScale0[0]), unitScale0[1]),\n                            rotation0: unitRotation0,\n                            rotation1: unitRotation1\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).hexPrism:\n                        hittable = new (0, $66964bfc3ddbcb4c$export$2104cbf9d09a457a)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            radius: unitScale0[0],\n                            height: unitScale0[1]\n                        });\n                        break;\n                    case (0, $4a6417d29706362f$export$80d48287646c9e3b).hexPrismSdf:\n                        hittable = new (0, $66964bfc3ddbcb4c$export$df234dab64f8469a)({\n                            center0: unitTranslation0,\n                            center1: unitTranslation1,\n                            time0: time0,\n                            time1: time1,\n                            radius: unitScale0[0],\n                            height: unitScale0[1],\n                            rounding: Math.min(Math.min((0, $0a0587bd8b0d58e8$export$849e31d725692576).getRounding(currentBuffer.dataView, j) * modelScale, unitScale0[0]), unitScale0[1])\n                        });\n                        break;\n                }\n                hittable.materialType = (0, $0a0587bd8b0d58e8$export$849e31d725692576).getMatId(currentBuffer.dataView, j);\n                hittable.materialFuzz = (0, $0a0587bd8b0d58e8$export$849e31d725692576).getMatFuzz(currentBuffer.dataView, j);\n                hittable.materialRefractiveIndex = (0, $0a0587bd8b0d58e8$export$849e31d725692576).getMatRefractiveIndex(currentBuffer.dataView, j);\n                hittable.materialDensity = (0, $0a0587bd8b0d58e8$export$849e31d725692576).getMatDensity(currentBuffer.dataView, j);\n                hittable.materialGloss = (0, $0a0587bd8b0d58e8$export$849e31d725692576).getMatGloss(currentBuffer.dataView, j);\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getMatColor(currentBuffer.dataView, j, rgb);\n                rgb[0] = Math.pow(rgb[0], 2.2);\n                rgb[1] = Math.pow(rgb[1], 2.2);\n                rgb[2] = Math.pow(rgb[2], 2.2);\n                hittable.materialColor = [\n                    rgb[0],\n                    rgb[1],\n                    rgb[2]\n                ];\n                (0, $0a0587bd8b0d58e8$export$849e31d725692576).getSegColor(currentBuffer.dataView, j, rgba);\n                hittable.segmentColor = [\n                    rgba[0],\n                    rgba[1],\n                    rgba[2],\n                    rgba[3]\n                ];\n                if (hittable.materialType == (0, $62116d012d21b949$export$bd062416169c6728).isotropic) this.hittables.push(new (0, $66964bfc3ddbcb4c$export$412c0ed39e393270)({\n                    boundary: hittable,\n                    center0: unitTranslation0,\n                    center1: unitTranslation1,\n                    time0: time0,\n                    time1: time1,\n                    materialDensity: hittable.materialDensity,\n                    materialColor: hittable.materialColor\n                }));\n                else this.hittables.push(hittable);\n                this.minY = Math.min(hittable.bounds.min[1], this.minY);\n            }\n            if (this.hasChangedCallback) this.hasChangedCallback();\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n}\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ class $ca7af8634961ee25$export$a002182e51710d39 {\n}\n$ca7af8634961ee25$export$a002182e51710d39.SHADOW_OFFSET = 0.001;\n\n\n\nvar $d5ed11dd11fe7749$var$__awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nclass $d5ed11dd11fe7749$export$861edd1ccea2f746 extends (0, $a123db7d2af0bebc$export$30686c90897c890d) {\n    get frameCount() {\n        return this._frameCount;\n    }\n    get duration() {\n        return this._duration;\n    }\n    get config() {\n        return this._config;\n    }\n    set lights(value) {\n        if (value != this._lights) {\n            this._lights = value;\n            this._haveLightsChanged = true;\n            this._frameCount = 0;\n        }\n    }\n    get lights() {\n        return this._lights;\n    }\n    restart() {\n        this._frameCount = 0;\n        this._core.start();\n    }\n    constructor(options){\n        super(options);\n        (0, $14f38b7dd89457d7$exports).setMatrixArrayType(Float32Array);\n        this._config = new (0, $cdd30208cd147f64$export$29cd7b75162a9425)();\n        this._frameCount = 0;\n        this._duration = 0;\n        this._position = (0, $31054a6c69637582$exports).create();\n        this._right = (0, $31054a6c69637582$exports).create();\n        this._up = (0, $31054a6c69637582$exports).create();\n        this._forward = (0, $31054a6c69637582$exports).create();\n        this._modelPosition = (0, $31054a6c69637582$exports).create();\n        this._backgroundColor = (0, $4c4ac78b213a9c07$exports).create();\n        this._ambientColor = (0, $31054a6c69637582$exports).create();\n    }\n    initialize(core) {\n        super.initialize(core);\n        this._hittables = [];\n        this._lightBuffer = null;\n        this._worldCreated = false;\n        this._initializeAPI().then(()=>{\n            this._initializeResources();\n        });\n    }\n    _initializeAPI() {\n        return $d5ed11dd11fe7749$var$__awaiter(this, void 0, void 0, function*() {\n            try {\n                const start = window.performance.now();\n                const gpu = navigator.gpu;\n                this._presentationFormat = gpu.getPreferredCanvasFormat();\n                this._adapter = yield gpu.requestAdapter();\n                const gpuDeviceDescriptor = {\n                    requiredLimits: {\n                        maxStorageBufferBindingSize: 134217728,\n                        maxComputeWorkgroupsPerDimension: 256\n                    }\n                };\n                this._device = yield this._adapter.requestDevice(gpuDeviceDescriptor);\n                this._maxComputeWorkgroupsPerDimension = this._device.limits.maxComputeWorkgroupsPerDimension;\n                this._queue = this._device.queue;\n                this._context = this._canvas.getContext(\"webgpu\");\n                this._device.lost.then(()=>{\n                    this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).error, \"GPU lost\");\n                    this._core.stop();\n                    this._queue = null;\n                    this._device = null;\n                    this._adapter = null;\n                    this._context = null;\n                    this._initializeAPI().then(()=>{\n                        this._initializeResources();\n                        this._hasWorldChanged = true;\n                        this._lightBuffer = null;\n                        this._haveLightsChanged = true;\n                        this._core.start();\n                    });\n                });\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `WebGPU API initialized ${Math.round(window.performance.now() - start)}ms`);\n            } catch (e) {\n                this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).error, e);\n                return false;\n            }\n            return true;\n        });\n    }\n    _initializeResources() {\n        const start = window.performance.now();\n        const canvasConfig = {\n            device: this._device,\n            format: this._presentationFormat,\n            alphaMode: \"premultiplied\"\n        };\n        this._context.configure(canvasConfig);\n        const computeUniformBufferDescriptor = {\n            label: \"Compute uniform buffer\",\n            size: (0, $e1b604d7f27d3d8e$export$893bf7cc4a794b30).SIZE * 4,\n            usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n        };\n        this._computeUniformBuffer = this._device.createBuffer(computeUniformBufferDescriptor);\n        this._computeUniformBufferData = new (0, $e1b604d7f27d3d8e$export$893bf7cc4a794b30)();\n        const depthMinMaxBufferDescriptor = {\n            label: \"Depth min max buffer\",\n            size: 8,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n        };\n        this._depthMinMaxBuffer = this._device.createBuffer(depthMinMaxBufferDescriptor);\n        const depthMinMaxBufferResultDescriptor = {\n            label: \"Depth min max result buffer\",\n            size: 8,\n            usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n        };\n        this._depthMinMaxResultBuffer = this._device.createBuffer(depthMinMaxBufferResultDescriptor);\n        const fullscreenQuadUniformBufferDescriptor = {\n            label: \"Full screen quad uniform buffer\",\n            size: (0, $e354276e6b56108d$export$186ae5dce927ebd1).SIZE * 4,\n            usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n        };\n        this._fullscreenQuadUniformBuffer = this._device.createBuffer(fullscreenQuadUniformBufferDescriptor);\n        this._fullscreenQuadUniformBufferData = new (0, $e354276e6b56108d$export$186ae5dce927ebd1)();\n        this._sampler = this._device.createSampler({\n            label: \"Sampler\",\n            magFilter: \"linear\",\n            minFilter: \"linear\"\n        });\n        for(const key in this.fonts){\n            const fontVisual = this.fonts[key];\n            fontVisual.initializeContext(this._device);\n            fontVisual.update();\n        }\n        for(let i = 0; i < this.images.length; i++){\n            const image = this.images[i];\n            image.initializeContext(this._device);\n            image.update();\n        }\n        const textureSize = {\n            width: 1,\n            height: 1\n        };\n        const textureDescriptor = {\n            label: \"Placeholder texture\",\n            size: textureSize,\n            format: this._presentationFormat,\n            usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT\n        };\n        this._texture = this._device.createTexture(textureDescriptor);\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `WebGPU resources initialized ${Math.round(window.performance.now() - start)}ms`);\n        this._isInitialized = true;\n    }\n    get isSupported() {\n        return navigator.gpu !== undefined;\n    }\n    _createWorld() {\n        return $d5ed11dd11fe7749$var$__awaiter(this, void 0, void 0, function*() {\n            const start = performance.now();\n            this._hittables = this._getHittables();\n            if (this._hittables.length == 0) return;\n            const bvhAccel = new (0, $ee56e2b41e5e87b5$export$c191703b2daa3f18)(this._core, this._hittables, this._config.maxPrimsInNode, (0, $ee56e2b41e5e87b5$export$17e31acd02f2a1e).sah);\n            const hittables = bvhAccel.orderedPrimitives;\n            for(let i = 0; i < this.transitionBuffers.length; i++){\n                const transitionBuffer = this.transitionBuffers[i];\n                if (transitionBuffer.isVisible) {\n                    const atlas = transitionBuffer.currentAtlas;\n                    if (atlas.imageData) {\n                        const imageData = atlas.imageData;\n                        const textureSize = {\n                            width: imageData.width,\n                            height: imageData.height\n                        };\n                        yield createImageBitmap(imageData).then((imageBitmap)=>{\n                            const textureDescriptor = {\n                                label: \"Atlas texture\",\n                                size: textureSize,\n                                format: this._presentationFormat,\n                                usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT\n                            };\n                            this._atlasTexture = this._device.createTexture(textureDescriptor);\n                            const imageCopyExternalImage = {\n                                source: imageBitmap\n                            };\n                            const imageCopyTextureTagged = {\n                                texture: this._atlasTexture\n                            };\n                            const copySize = {\n                                width: imageData.width,\n                                height: imageData.height\n                            };\n                            this._device.queue.copyExternalImageToTexture(imageCopyExternalImage, imageCopyTextureTagged, copySize);\n                            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `atlas texture updated ${Math.round(window.performance.now() - start)}ms`);\n                        });\n                        break;\n                    }\n                }\n            }\n            const textures = [];\n            if (textures.length == 0) textures.push(new (0, $6060da1e598714a9$export$b696913510b740d6)({\n                color: (0, $31054a6c69637582$exports).fromValues(1, 1, 1)\n            }));\n            const textureBufferSizeBytes = textures.length * (0, $6060da1e598714a9$export$6aa93a36bc90f68e).SIZE * 4;\n            const textureBufferDescriptor = {\n                label: \"Texture buffer\",\n                size: textureBufferSizeBytes,\n                usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n            };\n            this._textureBuffer = this._device.createBuffer(textureBufferDescriptor);\n            this._textureBufferData = new (0, $6060da1e598714a9$export$6aa93a36bc90f68e)(textures.length);\n            for(let i = 0; i < textures.length; i++)textures[i].toBuffer(this._textureBufferData, i);\n            const hittableBufferSizeBytes = hittables.length * (0, $66964bfc3ddbcb4c$export$1337e9dd34ffc243).SIZE * 4;\n            const hittableBufferDescriptor = {\n                label: \"Hittable buffer\",\n                size: hittableBufferSizeBytes,\n                usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n            };\n            this._hittableBuffer = this._device.createBuffer(hittableBufferDescriptor);\n            this._hittableBufferData = new (0, $66964bfc3ddbcb4c$export$1337e9dd34ffc243)(hittables.length);\n            for(let i = 0; i < hittables.length; i++){\n                const hittable = hittables[i];\n                hittable.toBuffer(this._hittableBufferData, i);\n            }\n            const linearBVHNodes = bvhAccel.nodes;\n            const linearBVHNodeBufferSizeBytes = linearBVHNodes.length * (0, $ee56e2b41e5e87b5$export$9e920ed4165673f5).SIZE * 4;\n            const linearBVHNodeBufferDescriptor = {\n                label: \"Linear BVH node buffer\",\n                size: linearBVHNodeBufferSizeBytes,\n                usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n            };\n            this._linearBVHNodeBuffer = this._device.createBuffer(linearBVHNodeBufferDescriptor);\n            this._linearBVHNodeBufferData = new (0, $ee56e2b41e5e87b5$export$9e920ed4165673f5)(linearBVHNodes.length);\n            for(let i = 0; i < linearBVHNodes.length; i++)linearBVHNodes[i].toBuffer(this._linearBVHNodeBufferData, i);\n            this._device.queue.writeBuffer(this._hittableBuffer, 0, this._hittableBufferData.buffer, this._hittableBufferData.byteOffset, this._hittableBufferData.byteLength);\n            this._device.queue.writeBuffer(this._textureBuffer, 0, this._textureBufferData.buffer, this._textureBufferData.byteOffset, this._textureBufferData.byteLength);\n            this._device.queue.writeBuffer(this._linearBVHNodeBuffer, 0, this._linearBVHNodeBufferData.buffer, this._linearBVHNodeBufferData.byteOffset, this._linearBVHNodeBufferData.byteLength);\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `create world ${Math.round(window.performance.now() - start)}ms`);\n        });\n    }\n    _createLights() {\n        if (!this._lights || this._lights.length == 0) {\n            const options = {\n                center: (0, $31054a6c69637582$exports).fromValues(0, 0, 0),\n                size: (0, $91b0cc4981465964$exports).fromValues(0, 0),\n                color: (0, $31054a6c69637582$exports).fromValues(0, 0, 0),\n                rotation: (0, $39ece26d1239bb77$exports).create()\n            };\n            this._lights = [\n                new (0, $1596feb7c9451159$export$1f9284d52f5c21ca)(options)\n            ];\n        }\n        const modelScale = this._core.getModelScale();\n        (0, $31054a6c69637582$exports).set(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n        if (!this._lightBuffer) {\n            const lightBufferSizeBytes = this._config.maxLights * (0, $1596feb7c9451159$export$82650fd3490ceb3f).SIZE * 4;\n            const lightBufferDescriptor = {\n                label: \"Light buffer\",\n                size: lightBufferSizeBytes,\n                usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n            };\n            this._lightBuffer = this._device.createBuffer(lightBufferDescriptor);\n            this._lightBufferData = new (0, $1596feb7c9451159$export$82650fd3490ceb3f)(this._config.maxLights);\n        }\n        for(let i = 0; i < this._lights.length; i++){\n            const light = this._lights[i];\n            let lightCopy;\n            if (light instanceof (0, $1596feb7c9451159$export$1f9284d52f5c21ca)) lightCopy = new (0, $1596feb7c9451159$export$1f9284d52f5c21ca)({\n                center: (0, $31054a6c69637582$exports).clone(light.center),\n                color: (0, $31054a6c69637582$exports).clone(light.color),\n                rotation: (0, $39ece26d1239bb77$exports).clone(light.rotation),\n                size: (0, $91b0cc4981465964$exports).fromValues(light.size[0] * modelScale, light.size[1] * modelScale)\n            });\n            else if (light instanceof (0, $1596feb7c9451159$export$f6705b6c922d7219)) lightCopy = new (0, $1596feb7c9451159$export$f6705b6c922d7219)({\n                center: (0, $31054a6c69637582$exports).clone(light.center),\n                color: (0, $31054a6c69637582$exports).clone(light.color),\n                radius: light.radius * modelScale\n            });\n            (0, $31054a6c69637582$exports).scale(lightCopy.center, lightCopy.center, modelScale);\n            (0, $31054a6c69637582$exports).add(lightCopy.center, lightCopy.center, this._modelPosition);\n            lightCopy.toBuffer(this._lightBufferData, i);\n        }\n        this._device.queue.writeBuffer(this._lightBuffer, 0, this._lightBufferData.buffer, this._lightBufferData.byteOffset, this._lightBufferData.byteLength);\n        this._areLightsInitialized = true;\n    }\n    standardLighting(lights) {\n        lights || (lights = this._config.standardLightingOptions());\n        const rectLights = [];\n        for(let i = 0; i < lights.length; i++){\n            const light = lights[i];\n            const center = (0, $31054a6c69637582$exports).create();\n            const rotation = (0, $39ece26d1239bb77$exports).create();\n            const azimuth = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(light.azimuth);\n            const altitude = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(-light.altitude);\n            (0, $39ece26d1239bb77$exports).rotateY(rotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY, azimuth);\n            (0, $39ece26d1239bb77$exports).rotateX(rotation, rotation, altitude);\n            (0, $31054a6c69637582$exports).transformQuat(center, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITZ, rotation);\n            (0, $31054a6c69637582$exports).scale(center, center, light.distance);\n            const yaw = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(light.yaw);\n            const pitch = (0, $a49c65c28e06311e$export$210d3b2db589eb5c).degreesToRadians(-light.altitude);\n            (0, $39ece26d1239bb77$exports).rotateY(rotation, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_IDENTITY, yaw);\n            (0, $39ece26d1239bb77$exports).rotateX(rotation, rotation, pitch);\n            rectLights.push(new (0, $1596feb7c9451159$export$1f9284d52f5c21ca)({\n                center: center,\n                rotation: rotation,\n                size: light.size,\n                color: light.color\n            }));\n        }\n        return rectLights;\n    }\n    _getHittables() {\n        const hittables = [];\n        let minY = Number.MAX_VALUE;\n        for(let i = 0; i < this.transitionBuffers.length; i++){\n            const transitionBuffer = this.transitionBuffers[i];\n            if (transitionBuffer.isVisible && transitionBuffer.hittables && transitionBuffer.hittables.length > 0) {\n                minY = Math.min(minY, transitionBuffer.minY);\n                for(let j = 0; j < transitionBuffer.hittables.length; j++)hittables.push(transitionBuffer.hittables[j]);\n            }\n        }\n        if (this.labelSets && this.labelSets.length > 0) for(let i = 0; i < this.labelSets.length; i++){\n            const labelSet = this.labelSets[i];\n            if (labelSet.hittables) for(let j = 0; j < labelSet.hittables.length; j++)hittables.push(labelSet.hittables[j]);\n        }\n        if (this.images && this.images.length > 0) {\n            for(let i = 0; i < this.images.length; i++)if (this.images[i].hittable) {\n                const hittable = this.images[i].hittable;\n                hittables.push(hittable);\n                minY = Math.min(hittable.bounds.min[1], minY);\n            }\n        }\n        if (this.ground) {\n            const modelPosition = (0, $31054a6c69637582$exports).create();\n            const modelScale = this._core.getModelScale();\n            const modelRotation = (0, $39ece26d1239bb77$exports).create();\n            this._core.getModelRotation(modelRotation);\n            (0, $31054a6c69637582$exports).set(modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            const groundSize = (0, $91b0cc4981465964$exports).create();\n            const groundPosition = (0, $31054a6c69637582$exports).create();\n            (0, $91b0cc4981465964$exports).scale(groundSize, this.ground.size || this._config.groundSize, modelScale);\n            if (this.ground.position) (0, $31054a6c69637582$exports).scale(groundPosition, this.ground.position, modelScale);\n            else (0, $31054a6c69637582$exports).set(groundPosition, 0, minY - (0, $ca7af8634961ee25$export$a002182e51710d39).SHADOW_OFFSET, 0);\n            const color = this.ground.color || [\n                0.5,\n                0.5,\n                0.5\n            ];\n            const options = {\n                size0: groundSize,\n                size1: groundSize,\n                center0: groundPosition,\n                center1: groundPosition,\n                time0: 1,\n                time1: 1,\n                texCoord0: (0, $91b0cc4981465964$exports).fromValues(0, 0),\n                texCoord1: (0, $91b0cc4981465964$exports).fromValues(1, 1),\n                materialType: (0, $62116d012d21b949$export$bd062416169c6728).lambertian,\n                materialColor: [\n                    Math.pow(color[0], 2.2),\n                    Math.pow(color[1], 2.2),\n                    Math.pow(color[2], 2.2)\n                ],\n                segmentColor: [\n                    0,\n                    0,\n                    0,\n                    0\n                ]\n            };\n            (0, $31054a6c69637582$exports).add(options.center0, options.center0, modelPosition);\n            hittables.push(new (0, $66964bfc3ddbcb4c$export$57071e021ef37bbb)(options));\n        }\n        return hittables;\n    }\n    createFontVisual(font) {\n        const visual = new (0, $70798b808a7c0587$export$e784a6eab4d2d700)(this._core, font);\n        if (this._isInitialized) visual.initializeContext(this._device);\n        visual.hasChangedCallback = ()=>{\n            this._hasWorldChanged = true;\n        };\n        return visual;\n    }\n    createImageVisual(image) {\n        const visual = new (0, $18e0078d8611e105$export$6f251cd327b2ff1)(this._core, this, image);\n        if (this._isInitialized) visual.initializeContext(this._device);\n        visual.hasChangedCallback = ()=>{\n            this._hasWorldChanged = true;\n        };\n        return visual;\n    }\n    createLabelSetVisual(labelSet) {\n        const visual = new (0, $b084cfc4223cd4fe$export$97e93e7019ef67b9)(this._core, this, labelSet);\n        visual.hasChangedCallback = ()=>{\n            this._hasWorldChanged = true;\n        };\n        return visual;\n    }\n    createTransitionBuffer(ids) {\n        const transitionBuffer = new (0, $93345e9ee93b28fb$export$76de936b3c1c4170)(this._core, this, ids);\n        transitionBuffer.hasChangedCallback = ()=>{\n            this._hasWorldChanged = true;\n        };\n        return transitionBuffer;\n    }\n    _resizeBackings() {\n        const width = this.width;\n        const height = this.height;\n        const colorChannels = 3;\n        const outputColorBufferSizeBytes = Uint32Array.BYTES_PER_ELEMENT * width * height * colorChannels;\n        const outputColorBufferDescriptor = {\n            label: \"Output color buffer\",\n            size: outputColorBufferSizeBytes,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n        };\n        const outputColorBuffer = this._device.createBuffer(outputColorBufferDescriptor);\n        const outputNormalDepthBufferSizeBytes = Uint32Array.BYTES_PER_ELEMENT * (width + 1) * (height + 1) * 4;\n        const outputDepthBufferDescriptor = {\n            label: \"Output normal depth buffer\",\n            size: outputNormalDepthBufferSizeBytes,\n            usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n        };\n        const outputNormalDepthBuffer = this._device.createBuffer(outputDepthBufferDescriptor);\n        const computeShaderModuleDescriptor = {\n            code: (0, $e1b604d7f27d3d8e$export$7173403786dbea8d)\n        };\n        const computeModule = this._device.createShaderModule(computeShaderModuleDescriptor);\n        const computeBindGroupLayoutDescriptor = {\n            entries: [\n                {\n                    binding: 0,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"storage\"\n                    }\n                },\n                {\n                    binding: 1,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"uniform\"\n                    }\n                },\n                {\n                    binding: 2,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"read-only-storage\"\n                    }\n                },\n                {\n                    binding: 3,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"read-only-storage\"\n                    }\n                },\n                {\n                    binding: 4,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"read-only-storage\"\n                    }\n                },\n                {\n                    binding: 5,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"read-only-storage\"\n                    }\n                },\n                {\n                    binding: 6,\n                    visibility: GPUShaderStage.COMPUTE,\n                    sampler: {\n                        type: \"filtering\"\n                    }\n                },\n                {\n                    binding: 7,\n                    visibility: GPUShaderStage.COMPUTE,\n                    texture: {\n                        multisampled: false,\n                        sampleType: \"float\",\n                        viewDimension: \"2d\"\n                    }\n                },\n                {\n                    binding: 8,\n                    visibility: GPUShaderStage.COMPUTE,\n                    texture: {\n                        multisampled: false,\n                        sampleType: \"float\",\n                        viewDimension: \"2d\"\n                    }\n                },\n                {\n                    binding: 9,\n                    visibility: GPUShaderStage.COMPUTE,\n                    texture: {\n                        multisampled: false,\n                        sampleType: \"float\",\n                        viewDimension: \"2d\"\n                    }\n                },\n                {\n                    binding: 10,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"storage\"\n                    }\n                },\n                {\n                    binding: 11,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"storage\"\n                    }\n                }\n            ]\n        };\n        const computeBindGroupLayout = this._device.createBindGroupLayout(computeBindGroupLayoutDescriptor);\n        const computeBindGroupDescriptor = {\n            label: \"Compute bind group descriptor\",\n            layout: computeBindGroupLayout,\n            entries: [\n                {\n                    binding: 0,\n                    resource: {\n                        buffer: outputColorBuffer\n                    }\n                },\n                {\n                    binding: 1,\n                    resource: {\n                        buffer: this._computeUniformBuffer\n                    }\n                },\n                {\n                    binding: 2,\n                    resource: {\n                        buffer: this._hittableBuffer\n                    }\n                },\n                {\n                    binding: 3,\n                    resource: {\n                        buffer: this._textureBuffer\n                    }\n                },\n                {\n                    binding: 4,\n                    resource: {\n                        buffer: this._lightBuffer\n                    }\n                },\n                {\n                    binding: 5,\n                    resource: {\n                        buffer: this._linearBVHNodeBuffer\n                    }\n                },\n                {\n                    binding: 6,\n                    resource: this._sampler\n                },\n                {\n                    binding: 7,\n                    resource: (this.fonts[this._core.font.name].texture || this._texture).createView()\n                },\n                {\n                    binding: 8,\n                    resource: (this._backgroundTexture || this._texture).createView()\n                },\n                {\n                    binding: 9,\n                    resource: (this._atlasTexture || this._texture).createView()\n                },\n                {\n                    binding: 10,\n                    resource: {\n                        buffer: outputNormalDepthBuffer\n                    }\n                },\n                {\n                    binding: 11,\n                    resource: {\n                        buffer: this._depthMinMaxBuffer\n                    }\n                }\n            ]\n        };\n        this._computeBindGroup = this._device.createBindGroup(computeBindGroupDescriptor);\n        const computePipelineLayoutDescriptor = {\n            label: \"Compute pipeline layout descriptor\",\n            bindGroupLayouts: [\n                computeBindGroupLayout\n            ]\n        };\n        const computePipelineLayout = this._device.createPipelineLayout(computePipelineLayoutDescriptor);\n        const compute = {\n            module: computeModule,\n            entryPoint: \"main\"\n        };\n        const computePipelineDescriptor = {\n            label: \"Compute pipeline descriptor\",\n            layout: computePipelineLayout,\n            compute: compute\n        };\n        this._computePipeline = this._device.createComputePipeline(computePipelineDescriptor);\n        const computeDepthNormal = {\n            module: computeModule,\n            entryPoint: \"depthNormal\"\n        };\n        const computeDepthNormalPipelineDescriptor = {\n            label: \"Depth normal pipeline descriptor\",\n            layout: computePipelineLayout,\n            compute: computeDepthNormal\n        };\n        this._computeDepthNormalPipeline = this._device.createComputePipeline(computeDepthNormalPipelineDescriptor);\n        const computeDepthNormalMultisampled = {\n            module: computeModule,\n            entryPoint: \"depthNormalMultisampled\"\n        };\n        const computeDepthNormalMultisampledPipelineDescriptor = {\n            label: \"Depth normal multisampled pipeline descriptor\",\n            layout: computePipelineLayout,\n            compute: computeDepthNormalMultisampled\n        };\n        this._computeDepthNormalMultisampledPipeline = this._device.createComputePipeline(computeDepthNormalMultisampledPipelineDescriptor);\n        const computeSegment = {\n            module: computeModule,\n            entryPoint: \"segment\"\n        };\n        const computeSegmentPipelineDescriptor = {\n            label: \"Segment pipeline descriptor\",\n            layout: computePipelineLayout,\n            compute: computeSegment\n        };\n        this._computeSegmentPipeline = this._device.createComputePipeline(computeSegmentPipelineDescriptor);\n        const clearBindGroupLayoutDescriptor = {\n            label: \"Clear bind group layout descriptor\",\n            entries: [\n                {\n                    binding: 0,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"storage\"\n                    }\n                },\n                {\n                    binding: 10,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"storage\"\n                    }\n                },\n                {\n                    binding: 11,\n                    visibility: GPUShaderStage.COMPUTE,\n                    buffer: {\n                        type: \"storage\"\n                    }\n                }\n            ]\n        };\n        const clearBindGroupLayout = this._device.createBindGroupLayout(clearBindGroupLayoutDescriptor);\n        const clearBindGroupDescriptor = {\n            label: \"Clear bind group descriptor\",\n            layout: clearBindGroupLayout,\n            entries: [\n                {\n                    binding: 0,\n                    resource: {\n                        buffer: outputColorBuffer\n                    }\n                },\n                {\n                    binding: 10,\n                    resource: {\n                        buffer: outputNormalDepthBuffer\n                    }\n                },\n                {\n                    binding: 11,\n                    resource: {\n                        buffer: this._depthMinMaxBuffer\n                    }\n                }\n            ]\n        };\n        this._clearBindGroup = this._device.createBindGroup(clearBindGroupDescriptor);\n        const clearPipelineLayoutDescriptor = {\n            label: \"Clear pipeline layout descriptor\",\n            bindGroupLayouts: [\n                clearBindGroupLayout\n            ]\n        };\n        const clearPipelineLayout = this._device.createPipelineLayout(clearPipelineLayoutDescriptor);\n        const clear = {\n            module: computeModule,\n            entryPoint: \"clear\"\n        };\n        const clearPipelineDescriptor = {\n            label: \"Clear pipeline descriptor\",\n            layout: clearPipelineLayout,\n            compute: clear\n        };\n        this._clearPipeline = this._device.createComputePipeline(clearPipelineDescriptor);\n        const fullscreenQuadShaderDescriptor = {\n            label: \"Fullscreen quad shader descriptor\",\n            code: (0, $e354276e6b56108d$export$739cc3561e95931b)\n        };\n        const fullscreenQuadModule = this._device.createShaderModule(fullscreenQuadShaderDescriptor);\n        const fullscreenQuadBindGroupLayoutDescriptor = {\n            label: \"Fullscreen quad bind group layout descriptor\",\n            entries: [\n                {\n                    binding: 0,\n                    visibility: GPUShaderStage.FRAGMENT,\n                    buffer: {\n                        type: \"uniform\"\n                    }\n                },\n                {\n                    binding: 1,\n                    visibility: GPUShaderStage.FRAGMENT,\n                    buffer: {\n                        type: \"read-only-storage\"\n                    }\n                },\n                {\n                    binding: 2,\n                    visibility: GPUShaderStage.FRAGMENT,\n                    buffer: {\n                        type: \"read-only-storage\"\n                    }\n                }\n            ]\n        };\n        const fullscreenQuadBindGroupLayout = this._device.createBindGroupLayout(fullscreenQuadBindGroupLayoutDescriptor);\n        const fullscreenQuadPipelineLayoutDescriptor = {\n            label: \"Fullscreen quad pipeline layout descriptor\",\n            bindGroupLayouts: [\n                fullscreenQuadBindGroupLayout\n            ]\n        };\n        const fullscreenQuadPipelineLayout = this._device.createPipelineLayout(fullscreenQuadPipelineLayoutDescriptor);\n        const vertex = {\n            module: fullscreenQuadModule,\n            entryPoint: \"vert_main\"\n        };\n        const primitive = {\n            topology: \"triangle-list\"\n        };\n        const colorState = {\n            format: this._presentationFormat\n        };\n        const fragment = {\n            module: fullscreenQuadModule,\n            entryPoint: \"frag_main\",\n            targets: [\n                colorState\n            ]\n        };\n        const fullscreenQuadPiplelineDescriptor = {\n            label: \"Fullscreen quad pipeline descriptor\",\n            layout: fullscreenQuadPipelineLayout,\n            vertex: vertex,\n            fragment: fragment,\n            primitive: primitive\n        };\n        this._fullscreenQuadPipeline = this._device.createRenderPipeline(fullscreenQuadPiplelineDescriptor);\n        const fullscreenQuadBindGroupDescriptor = {\n            label: \"Fullscreen quad bind group descriptor\",\n            layout: fullscreenQuadBindGroupLayout,\n            entries: [\n                {\n                    binding: 0,\n                    resource: {\n                        buffer: this._fullscreenQuadUniformBuffer\n                    }\n                },\n                {\n                    binding: 1,\n                    resource: {\n                        buffer: outputColorBuffer\n                    }\n                },\n                {\n                    binding: 2,\n                    resource: {\n                        buffer: outputNormalDepthBuffer\n                    }\n                }\n            ]\n        };\n        this._fullscreenQuadBindGroup = this._device.createBindGroup(fullscreenQuadBindGroupDescriptor);\n        const fragmentHdr = {\n            module: fullscreenQuadModule,\n            entryPoint: \"frag_main_hdr\",\n            targets: [\n                colorState\n            ]\n        };\n        const fullscreenQuadHdrPiplelineDescriptor = {\n            label: \"Fullscreen quad HDR pipeline descriptor\",\n            layout: fullscreenQuadPipelineLayout,\n            vertex: vertex,\n            fragment: fragmentHdr,\n            primitive: primitive\n        };\n        this._fullscreenQuadHdrPipeline = this._device.createRenderPipeline(fullscreenQuadHdrPiplelineDescriptor);\n        const fragmentDepth = {\n            module: fullscreenQuadModule,\n            entryPoint: \"frag_depth\",\n            targets: [\n                colorState\n            ]\n        };\n        const fullscreenQuadDepthPiplelineDescriptor = {\n            label: \"Fullscreen quad depth pipeline descriptor\",\n            layout: fullscreenQuadPipelineLayout,\n            vertex: vertex,\n            fragment: fragmentDepth,\n            primitive: primitive\n        };\n        this._fullscreenQuadDepthPipeline = this._device.createRenderPipeline(fullscreenQuadDepthPiplelineDescriptor);\n        const fragmentDepthMultisampled = {\n            module: fullscreenQuadModule,\n            entryPoint: \"frag_depthMultisampled\",\n            targets: [\n                colorState\n            ]\n        };\n        const fullscreenQuadDepthMultisampledPiplelineDescriptor = {\n            label: \"Fullscreen quad depth multisampled pipeline descriptor\",\n            layout: fullscreenQuadPipelineLayout,\n            vertex: vertex,\n            fragment: fragmentDepthMultisampled,\n            primitive: primitive\n        };\n        this._fullscreenQuadDepthMultisampledPipeline = this._device.createRenderPipeline(fullscreenQuadDepthMultisampledPiplelineDescriptor);\n        const fragmentNormal = {\n            module: fullscreenQuadModule,\n            entryPoint: \"frag_normal\",\n            targets: [\n                colorState\n            ]\n        };\n        const fullscreenQuadNormalPiplelineDescriptor = {\n            label: \"Fullscreen quad normal pipeline descriptor\",\n            layout: fullscreenQuadPipelineLayout,\n            vertex: vertex,\n            fragment: fragmentNormal,\n            primitive: primitive\n        };\n        this._fullscreenQuadNormalPipeline = this._device.createRenderPipeline(fullscreenQuadNormalPiplelineDescriptor);\n        const fragmentNormalMultisampled = {\n            module: fullscreenQuadModule,\n            entryPoint: \"frag_normalMultisampled\",\n            targets: [\n                colorState\n            ]\n        };\n        const fullscreenQuadNormalMultisampledPiplelineDescriptor = {\n            label: \"Fullscreen quad normal multisampled pipeline descriptor\",\n            layout: fullscreenQuadPipelineLayout,\n            vertex: vertex,\n            fragment: fragmentNormalMultisampled,\n            primitive: primitive\n        };\n        this._fullscreenQuadNormalMultisampledPipeline = this._device.createRenderPipeline(fullscreenQuadNormalMultisampledPiplelineDescriptor);\n        const fragmentEdge = {\n            module: fullscreenQuadModule,\n            entryPoint: \"frag_edge\",\n            targets: [\n                colorState\n            ]\n        };\n        const fullscreenQuadEdgePiplelineDescriptor = {\n            label: \"Fullscreen quad edge pipeline descriptor\",\n            layout: fullscreenQuadPipelineLayout,\n            vertex: vertex,\n            fragment: fragmentEdge,\n            primitive: primitive\n        };\n        this._fullscreenQuadEdgePipeline = this._device.createRenderPipeline(fullscreenQuadEdgePiplelineDescriptor);\n        const fragmentSegment = {\n            module: fullscreenQuadModule,\n            entryPoint: \"frag_segment\",\n            targets: [\n                colorState\n            ]\n        };\n        const fullscreenQuadSegmentPiplelineDescriptor = {\n            label: \"Fullscreen quad segment pipeline descriptor\",\n            layout: fullscreenQuadPipelineLayout,\n            vertex: vertex,\n            fragment: fragmentSegment,\n            primitive: primitive\n        };\n        this._fullscreenQuadSegmentPipeline = this._device.createRenderPipeline(fullscreenQuadSegmentPiplelineDescriptor);\n        this._computeUniformBufferData.setWidth(width);\n        this._computeUniformBufferData.setHeight(height);\n        this._fullscreenQuadUniformBufferData.setWidth(width);\n        this._fullscreenQuadUniformBufferData.setHeight(height);\n        this._computeUniformBufferData.setTime0(0);\n        this._computeUniformBufferData.setTime1(1);\n        this._frameCount = 0;\n        this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, \"backings resized\");\n    }\n    update(elapsedTime) {\n        super.update(elapsedTime);\n        if (this._core.config.renderMode != this._previousRenderMode) {\n            const isPreviousDepthNormal = this._previousRenderMode == (0, $4a6417d29706362f$export$2386c8c1d9db2d57).depth || this._previousRenderMode == (0, $4a6417d29706362f$export$2386c8c1d9db2d57).normal;\n            const isCurrentDepthNormal = this._core.config.renderMode == (0, $4a6417d29706362f$export$2386c8c1d9db2d57).depth || this._core.config.renderMode == (0, $4a6417d29706362f$export$2386c8c1d9db2d57).normal;\n            if (isPreviousDepthNormal != isCurrentDepthNormal) this.clear();\n            this._previousRenderMode = this._core.config.renderMode;\n        }\n        for(let i = 0; i < this.transitionBuffers.length; i++){\n            const transitionBuffer = this.transitionBuffers[i];\n            if (transitionBuffer.isVisible) {\n                const time0 = this._core.renderer.transitionTime;\n                const time1 = Math.min(time0 + this._config.shutterSpeed, 1);\n                transitionBuffer.time0 = time0;\n                transitionBuffer.time1 = time1;\n                transitionBuffer.duration = this._core.config.transitionDuration;\n                transitionBuffer.stagger = this._core.config.transitionStaggering;\n                transitionBuffer.update();\n            }\n        }\n        if (this._haveLightsChanged || !this._lightBuffer) {\n            this._haveLightsChanged = false;\n            this._createLights();\n        }\n        if (this._hasWorldChanged) {\n            this._hasWorldChanged = false;\n            this._createWorld().then(()=>{\n                if (this._hittables.length > 0) {\n                    this._resizeBackings();\n                    this._worldCreated = true;\n                }\n            });\n        }\n        if (this._core.config.isDebugVisible) this._core.debugText.addLine(`frm tot  ${this._frameCount}`);\n    }\n    render(elapsedTime) {\n        return $d5ed11dd11fe7749$var$__awaiter(this, void 0, void 0, function*() {\n            if (!this._worldCreated || !this._areLightsInitialized || this._hittables.length == 0) return;\n            const epsilon = 0.000001;\n            if (Math.abs(this._computeUniformBufferData.getFieldOfView() - this._core.config.fov) > epsilon) {\n                this._frameCount = 0;\n                this._computeUniformBufferData.setFieldOfView(this._core.config.fov);\n            }\n            if (Math.abs(this._computeUniformBufferData.getAperture() - this._config.aperture) > epsilon) {\n                this._frameCount = 0;\n                this._computeUniformBufferData.setAperture(this._config.aperture);\n            }\n            if (Math.abs(this._computeUniformBufferData.getFocusDistance() - this._config.focusDistance) > epsilon) {\n                this._frameCount = 0;\n                this._computeUniformBufferData.setFocusDistance(this._config.focusDistance);\n            }\n            const m = this.inverseVMatrices[0];\n            this._computeUniformBufferData.getPosition(this._position);\n            this._computeUniformBufferData.getRight(this._right);\n            this._computeUniformBufferData.getUp(this._up);\n            this._computeUniformBufferData.getForward(this._forward);\n            if (Math.abs(this._position[0] - m[12]) > epsilon || Math.abs(this._position[1] - m[13]) > epsilon || Math.abs(this._position[2] - m[14]) > epsilon || Math.abs(this._right[0] - m[0]) > epsilon || Math.abs(this._right[1] - m[1]) > epsilon || Math.abs(this._right[2] - m[2]) > epsilon || Math.abs(this._up[0] - m[4]) > epsilon || Math.abs(this._up[1] - m[5]) > epsilon || Math.abs(this._up[2] - m[6]) > epsilon || Math.abs(this._forward[0] - m[8]) > epsilon || Math.abs(this._forward[1] - m[9]) > epsilon || Math.abs(this._forward[2] - m[10]) > epsilon) {\n                this._frameCount = 0;\n                (0, $31054a6c69637582$exports).set(this._position, m[12], m[13], m[14]);\n                (0, $31054a6c69637582$exports).set(this._right, m[0], m[1], m[2]);\n                (0, $31054a6c69637582$exports).set(this._up, m[4], m[5], m[6]);\n                (0, $31054a6c69637582$exports).set(this._forward, m[8], m[9], m[10]);\n                this._computeUniformBufferData.setPosition(this._position);\n                this._computeUniformBufferData.setRight(this._right);\n                this._computeUniformBufferData.setUp(this._up);\n                this._computeUniformBufferData.setForward(this._forward);\n                this._core.getModelPosition(this._modelPosition);\n                this._computeUniformBufferData.setLookAt(this._modelPosition);\n            }\n            this._computeUniformBufferData.getBackgroundColor(this._backgroundColor);\n            this._computeUniformBufferData.getAmbientColor(this._ambientColor);\n            if (!(0, $4c4ac78b213a9c07$exports).equals(this._backgroundColor, this._config.backgroundColor)) {\n                this._frameCount = 0;\n                this._computeUniformBufferData.setBackgroundColor(this._config.backgroundColor);\n            }\n            if (!(0, $31054a6c69637582$exports).equals(this._ambientColor, this._config.ambientColor)) {\n                this._frameCount = 0;\n                this._computeUniformBufferData.setAmbientColor(this._config.ambientColor);\n            }\n            this._tilesX = this._computeUniformBufferData.getTilesX();\n            this._tilesY = this._computeUniformBufferData.getTilesY();\n            this._tileOffsetX = this._computeUniformBufferData.getTileOffsetX();\n            this._tileOffsetY = this._computeUniformBufferData.getTileOffsetY();\n            if (this._tilesX != this._core.config.tilesX || this._tilesY != this._core.config.tilesY || this._tileOffsetX != this._core.config.tileOffsetX || this._tileOffsetY != this._core.config.tileOffsetY) {\n                this._frameCount = 0;\n                this._computeUniformBufferData.setTilesX(this._core.config.tilesX);\n                this._computeUniformBufferData.setTilesY(this._core.config.tilesY);\n                this._computeUniformBufferData.setTileOffsetX(this._core.config.tileOffsetX);\n                this._computeUniformBufferData.setTileOffsetY(this._core.config.tileOffsetY);\n            }\n            const clear = this._frameCount == 0;\n            if (clear) {\n                this._duration = 0;\n                this._startTime = performance.now();\n            }\n            if (this._frameCount >= this._config.maxSamplesPerPixel) {\n                this._core.stop();\n                return;\n            }\n            const raysPerFrame = this._config.raysPerFrame;\n            this._computeUniformBufferData.setRaysPerFrame(raysPerFrame);\n            this._computeUniformBufferData.setSeed(this._core.totalFrames * raysPerFrame);\n            this._device.queue.writeBuffer(this._computeUniformBuffer, 0, this._computeUniformBufferData.buffer, this._computeUniformBufferData.byteOffset, this._computeUniformBufferData.byteLength);\n            this._frameCount += raysPerFrame;\n            this._fullscreenQuadUniformBufferData.setSamplesPerPixel(this._frameCount);\n            this._fullscreenQuadUniformBufferData.setExposure(this._config.exposure);\n            this._fullscreenQuadUniformBufferData.setEdgeForeground(this._config.edgeForeground);\n            this._fullscreenQuadUniformBufferData.setEdgeBackground(this._config.edgeBackground);\n            this._fullscreenQuadUniformBufferData.setMinDepth(this._config.minDepth);\n            this._fullscreenQuadUniformBufferData.setMaxDepth(this._config.maxDepth);\n            this._device.queue.writeBuffer(this._fullscreenQuadUniformBuffer, 0, this._fullscreenQuadUniformBufferData.buffer, this._fullscreenQuadUniformBufferData.byteOffset, this._fullscreenQuadUniformBufferData.byteLength);\n            yield this._encodeCommands(clear);\n            this._duration = performance.now() - this._startTime;\n        });\n    }\n    clear() {\n        this._frameCount = 0;\n    }\n    _encodeCommands(clear) {\n        return $d5ed11dd11fe7749$var$__awaiter(this, void 0, void 0, function*() {\n            const commandEncoder = this._device.createCommandEncoder();\n            const computePassEncoder = commandEncoder.beginComputePass();\n            let computeDispatchCount;\n            switch(this._core.config.renderMode){\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).segment:\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).edge:\n                    computeDispatchCount = Math.min(Math.ceil((this.width + 1) * (this.height + 1) / 256), this._maxComputeWorkgroupsPerDimension);\n                    break;\n                default:\n                    computeDispatchCount = Math.min(Math.ceil(this.width * this.height / 256), this._maxComputeWorkgroupsPerDimension);\n            }\n            if (clear) {\n                computePassEncoder.setPipeline(this._clearPipeline);\n                computePassEncoder.setBindGroup(0, this._clearBindGroup);\n                computePassEncoder.dispatchWorkgroups(computeDispatchCount, 1, 1);\n            }\n            switch(this._core.config.renderMode){\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).color:\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).hdr:\n                    computePassEncoder.setPipeline(this._computePipeline);\n                    computePassEncoder.setBindGroup(0, this._computeBindGroup);\n                    computePassEncoder.dispatchWorkgroups(computeDispatchCount, 1, 1);\n                    computePassEncoder.end();\n                    break;\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).depth:\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).normal:\n                    computePassEncoder.setPipeline(this.config.isDepthMultisampled || this.config.isNormalMultisampled ? this._computeDepthNormalMultisampledPipeline : this._computeDepthNormalPipeline);\n                    computePassEncoder.setBindGroup(0, this._computeBindGroup);\n                    computePassEncoder.dispatchWorkgroups(computeDispatchCount, 1, 1);\n                    computePassEncoder.end();\n                    commandEncoder.copyBufferToBuffer(this._depthMinMaxBuffer, 0, this._depthMinMaxResultBuffer, 0, this._depthMinMaxResultBuffer.size);\n                    if (this._config.autoDepth) {\n                        yield this._depthMinMaxResultBuffer.mapAsync(GPUMapMode.READ);\n                        const depthMinMax = new Uint32Array(this._depthMinMaxResultBuffer.getMappedRange());\n                        const depthMin = depthMinMax[0] / 1000;\n                        const depthMax = depthMinMax[1] / 1000;\n                        this._config.minDepth = depthMin;\n                        this._config.maxDepth = depthMax;\n                        this._depthMinMaxResultBuffer.unmap();\n                    }\n                    break;\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).edge:\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).segment:\n                    computePassEncoder.setPipeline(this._computeSegmentPipeline);\n                    computePassEncoder.setBindGroup(0, this._computeBindGroup);\n                    computePassEncoder.dispatchWorkgroups(computeDispatchCount, 1, 1);\n                    computePassEncoder.end();\n                    break;\n            }\n            const colorAttachment = {\n                view: this._context.getCurrentTexture().createView(),\n                clearValue: {\n                    r: 0.0,\n                    g: 0.0,\n                    b: 0.0,\n                    a: 0.0\n                },\n                loadOp: \"clear\",\n                storeOp: \"store\"\n            };\n            const fullscreenQuadRenderPassDescriptor = {\n                colorAttachments: [\n                    colorAttachment\n                ]\n            };\n            const renderPassEncoder = commandEncoder.beginRenderPass(fullscreenQuadRenderPassDescriptor);\n            switch(this._core.config.renderMode){\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).color:\n                    renderPassEncoder.setPipeline(this._fullscreenQuadPipeline);\n                    break;\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).hdr:\n                    renderPassEncoder.setPipeline(this._fullscreenQuadHdrPipeline);\n                    break;\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).depth:\n                    renderPassEncoder.setPipeline(this.config.isDepthMultisampled ? this._fullscreenQuadDepthMultisampledPipeline : this._fullscreenQuadDepthPipeline);\n                    break;\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).normal:\n                    renderPassEncoder.setPipeline(this.config.isNormalMultisampled ? this._fullscreenQuadNormalMultisampledPipeline : this._fullscreenQuadNormalPipeline);\n                    break;\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).edge:\n                    renderPassEncoder.setPipeline(this._fullscreenQuadEdgePipeline);\n                    break;\n                case (0, $4a6417d29706362f$export$2386c8c1d9db2d57).segment:\n                    renderPassEncoder.setPipeline(this._fullscreenQuadSegmentPipeline);\n                    break;\n            }\n            renderPassEncoder.setBindGroup(0, this._fullscreenQuadBindGroup);\n            renderPassEncoder.draw(6, 1, 0, 0);\n            renderPassEncoder.end();\n            this._queue.submit([\n                commandEncoder.finish()\n            ]);\n        });\n    }\n    _resize(width, height) {\n        super._resize(width, height);\n        if (this._isInitialized && this._hittables.length > 0) {\n            this._resizeBackings();\n            this._core.log.write((0, $4a6417d29706362f$export$243e62d78d3b544d).info, `buffers resized ${width},${height}`);\n        }\n    }\n}\n\n\n\n\n\nclass $6fc486c90d5a34f3$export$c6957adcf93c393f {\n    constructor(options){\n        if (options) {\n            this.position = options.position;\n            this.size = options.size;\n            this.color = options.color;\n        }\n    }\n}\n\n\n\n\n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n/*!\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n */ \n\n\nclass $1c0006f54d34984f$export$647e10fa8ac00c88 extends (0, $ec7cf7ba687c1511$export$c755714d282122f0) {\n    getTwist(value) {\n        (0, $39ece26d1239bb77$exports).copy(value, this._cameraRotation);\n    }\n    setTwist(value, isSmooth) {\n        (0, $39ece26d1239bb77$exports).copy(this._cameraRotation, value);\n        if (!isSmooth) (0, $39ece26d1239bb77$exports).copy(this._smoothedCameraRotation, value);\n    }\n    twist(angle, x, y) {\n        this.unproject(this._vec3, x, y, 1);\n        (0, $31054a6c69637582$exports).normalize(this._vec3, this._vec3);\n        (0, $31054a6c69637582$exports).transformQuat(this._vec3, this._vec3, this._orbitRotation);\n        this._twist(this._vec3, angle);\n    }\n    _twist(axis, angle) {\n        (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, axis, angle);\n        (0, $39ece26d1239bb77$exports).multiply(this._cameraRotation, this._quat, this._cameraRotation);\n    }\n    rotate(translationDelta) {\n        (0, $31054a6c69637582$exports).set(this._vec3, translationDelta[1], translationDelta[0], 0);\n        const length = (0, $31054a6c69637582$exports).length(this._vec3);\n        const angle = length * (0, $d4d7bd6cc65a5081$export$a002182e51710d39).PI / Math.min(this.width, this.height);\n        (0, $31054a6c69637582$exports).scale(this._vec3, this._vec3, 1 / length);\n        (0, $39ece26d1239bb77$exports).setAxisAngle(this._quat, this._vec3, angle);\n        (0, $39ece26d1239bb77$exports).multiply(this._orbitRotation, this._quat, this._orbitRotation);\n    }\n}\n\n\n\n\n\n\n\n\n\n\nvar $c5578f8838abba3d$exports = {};\n\n$parcel$export($c5578f8838abba3d$exports, \"addDiv\", () => $99b4426d930847de$export$6758c6c7563dc60e);\n$parcel$export($c5578f8838abba3d$exports, \"addEl\", () => $99b4426d930847de$export$3ca29736d56b698a);\n$parcel$export($c5578f8838abba3d$exports, \"allTruthy\", () => $8abd7176cef66691$export$84af6d08e329f176);\n$parcel$export($c5578f8838abba3d$exports, \"clone\", () => $97d77b6293df43c2$export$9cd59f9826255e47);\n$parcel$export($c5578f8838abba3d$exports, \"colorFromString\", () => $ef0b145002741ccf$export$78ed65bc9abd64b1);\n$parcel$export($c5578f8838abba3d$exports, \"colorIsEqual\", () => $ef0b145002741ccf$export$7da6ac10e55d4f2a);\n$parcel$export($c5578f8838abba3d$exports, \"colorToString\", () => $ef0b145002741ccf$export$f86d83653e5a505e);\n$parcel$export($c5578f8838abba3d$exports, \"concat\", () => $8abd7176cef66691$export$ee1b3e54f0441b22);\n$parcel$export($c5578f8838abba3d$exports, \"createElement\", () => $fe86f88c0c9aea93$export$c8a8987d4410bf2d);\n$parcel$export($c5578f8838abba3d$exports, \"deepMerge\", () => $97d77b6293df43c2$export$6969335ea1e4e77c);\n$parcel$export($c5578f8838abba3d$exports, \"desaturate\", () => $ef0b145002741ccf$export$fb75607d98509d9);\n$parcel$export($c5578f8838abba3d$exports, \"getActiveElementInfo\", () => $fe86f88c0c9aea93$export$5ec2c407fb44f02);\n$parcel$export($c5578f8838abba3d$exports, \"mount\", () => $fe86f88c0c9aea93$export$186d02efde07ef98);\n$parcel$export($c5578f8838abba3d$exports, \"outerSize\", () => $99b4426d930847de$export$7642631117982e98);\n$parcel$export($c5578f8838abba3d$exports, \"push\", () => $8abd7176cef66691$export$4cbf152802aa238);\n$parcel$export($c5578f8838abba3d$exports, \"setActiveElement\", () => $fe86f88c0c9aea93$export$7d007ff58288f238);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * This file is for external facing export only, do not use this for internal references,\n * as it may cause circular dependencies in Rollup.\n */ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $8abd7176cef66691$export$ee1b3e54f0441b22(...args) {\n    return args.reduce((p, c)=>c ? p.concat(c) : p, []);\n}\nfunction $8abd7176cef66691$export$84af6d08e329f176(...args) {\n    return args.reduce((p, c)=>c ? p.concat(c) : p, []).filter(Boolean);\n}\nfunction $8abd7176cef66691$export$4cbf152802aa238(arr, items) {\n    arr.push.apply(arr, items);\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * Create a new element as a child of another element.\n * @param tagName Tag name of the new tag to create.\n * @param parentElement Reference of the element to append to.\n * @returns new HTMLElement.\n */ function $99b4426d930847de$export$3ca29736d56b698a(tagName, parentElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n}\nfunction $99b4426d930847de$export$6758c6c7563dc60e(parentElement, className) {\n    const div = $99b4426d930847de$export$3ca29736d56b698a('div', parentElement);\n    if (className) div.className = className;\n    return div;\n}\nfunction $99b4426d930847de$export$7642631117982e98(el) {\n    const cs = getComputedStyle(el);\n    const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return {\n        height: height,\n        width: width\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $6509a37883102e3a$exports = {};\n\n$parcel$defineInteropFlag($6509a37883102e3a$exports);\n\n$parcel$export($6509a37883102e3a$exports, \"default\", () => $6509a37883102e3a$export$2e2bcd8739ae039);\nvar $6509a37883102e3a$var$isMergeableObject = function isMergeableObject(value) {\n    return $6509a37883102e3a$var$isNonNullObject(value) && !$6509a37883102e3a$var$isSpecial(value);\n};\nfunction $6509a37883102e3a$var$isNonNullObject(value) {\n    return !!value && typeof value === 'object';\n}\nfunction $6509a37883102e3a$var$isSpecial(value) {\n    var stringValue = Object.prototype.toString.call(value);\n    return stringValue === '[object RegExp]' || stringValue === '[object Date]' || $6509a37883102e3a$var$isReactElement(value);\n}\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar $6509a37883102e3a$var$canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar $6509a37883102e3a$var$REACT_ELEMENT_TYPE = $6509a37883102e3a$var$canUseSymbol ? Symbol.for('react.element') : 0xeac7;\nfunction $6509a37883102e3a$var$isReactElement(value) {\n    return value.$$typeof === $6509a37883102e3a$var$REACT_ELEMENT_TYPE;\n}\nfunction $6509a37883102e3a$var$emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n}\nfunction $6509a37883102e3a$var$cloneUnlessOtherwiseSpecified(value, options) {\n    return options.clone !== false && options.isMergeableObject(value) ? $6509a37883102e3a$var$deepmerge($6509a37883102e3a$var$emptyTarget(value), value, options) : value;\n}\nfunction $6509a37883102e3a$var$defaultArrayMerge(target, source, options) {\n    return target.concat(source).map(function(element) {\n        return $6509a37883102e3a$var$cloneUnlessOtherwiseSpecified(element, options);\n    });\n}\nfunction $6509a37883102e3a$var$mergeObject(target, source, options) {\n    var destination = {};\n    if (options.isMergeableObject(target)) Object.keys(target).forEach(function(key) {\n        destination[key] = $6509a37883102e3a$var$cloneUnlessOtherwiseSpecified(target[key], options);\n    });\n    Object.keys(source).forEach(function(key) {\n        if (!options.isMergeableObject(source[key]) || !target[key]) destination[key] = $6509a37883102e3a$var$cloneUnlessOtherwiseSpecified(source[key], options);\n        else destination[key] = $6509a37883102e3a$var$deepmerge(target[key], source[key], options);\n    });\n    return destination;\n}\nfunction $6509a37883102e3a$var$deepmerge(target, source, options) {\n    options = options || {};\n    options.arrayMerge = options.arrayMerge || $6509a37883102e3a$var$defaultArrayMerge;\n    options.isMergeableObject = options.isMergeableObject || $6509a37883102e3a$var$isMergeableObject;\n    var sourceIsArray = Array.isArray(source);\n    var targetIsArray = Array.isArray(target);\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n    if (!sourceAndTargetTypesMatch) return $6509a37883102e3a$var$cloneUnlessOtherwiseSpecified(source, options);\n    else if (sourceIsArray) return options.arrayMerge(target, source, options);\n    else return $6509a37883102e3a$var$mergeObject(target, source, options);\n}\n$6509a37883102e3a$var$deepmerge.all = function deepmergeAll(array, options) {\n    if (!Array.isArray(array)) throw new Error('first argument should be an array');\n    return array.reduce(function(prev, next) {\n        return $6509a37883102e3a$var$deepmerge(prev, next, options);\n    }, {});\n};\nvar $6509a37883102e3a$var$deepmerge_1 = $6509a37883102e3a$var$deepmerge;\nvar $6509a37883102e3a$export$2e2bcd8739ae039 = $6509a37883102e3a$var$deepmerge_1;\n\n\n/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */ function $d689e8e40778a90e$var$isObject(o) {\n    return Object.prototype.toString.call(o) === '[object Object]';\n}\nfunction $d689e8e40778a90e$export$53b83ca8eaab0383(o) {\n    var ctor, prot;\n    if ($d689e8e40778a90e$var$isObject(o) === false) return false;\n    // If has modified constructor\n    ctor = o.constructor;\n    if (ctor === undefined) return true;\n    // If has modified prototype\n    prot = ctor.prototype;\n    if ($d689e8e40778a90e$var$isObject(prot) === false) return false;\n    // If constructor does not have an Object-specific method\n    if (prot.hasOwnProperty('isPrototypeOf') === false) return false;\n    // Most likely a plain Object\n    return true;\n}\n\n\nconst $97d77b6293df43c2$var$deepmerge = $6509a37883102e3a$exports.default || $6509a37883102e3a$exports;\nfunction $97d77b6293df43c2$export$9cd59f9826255e47(objectToClone) {\n    if (!objectToClone) return objectToClone;\n    return $97d77b6293df43c2$var$deepmerge.all([\n        objectToClone\n    ]);\n}\nconst $97d77b6293df43c2$var$dontMerge = (destination, source)=>source;\nfunction $97d77b6293df43c2$export$6969335ea1e4e77c(...objectsToMerge) {\n    const objects = objectsToMerge.filter(Boolean);\n    return $97d77b6293df43c2$var$deepmerge.all(objects, {\n        arrayMerge: $97d77b6293df43c2$var$dontMerge,\n        isMergeableObject: (0, $d689e8e40778a90e$export$53b83ca8eaab0383)\n    });\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nvar $hNlxu = parcelRequire(\"hNlxu\");\nfunction $ef0b145002741ccf$var$rgbToDeckglColor(c) {\n    return [\n        c.r,\n        c.g,\n        c.b,\n        c.opacity * 255\n    ];\n}\nfunction $ef0b145002741ccf$export$7da6ac10e55d4f2a(a, b) {\n    if (a.length !== b.length) return false;\n    for(let i = 0; i < a.length; i++){\n        if (a[i] !== b[i]) return false;\n    }\n    return true;\n}\nfunction $ef0b145002741ccf$export$78ed65bc9abd64b1(cssColorSpecifier) {\n    if (cssColorSpecifier) {\n        const dc = (0, $hNlxu.default)(cssColorSpecifier);\n        if (dc) {\n            const c = dc.rgb();\n            return $ef0b145002741ccf$var$rgbToDeckglColor(c);\n        }\n    }\n}\nfunction $ef0b145002741ccf$export$f86d83653e5a505e(color) {\n    const c = [\n        ...color\n    ];\n    if (c.length > 3) c[3] /= 255;\n    return `rgba(${c.join(',')})`;\n}\nfunction $ef0b145002741ccf$export$fb75607d98509d9(color, value) {\n    const rgb = (0, $hNlxu.rgb)(color[0], color[1], color[2], color[3] / 255);\n    const hslColor = (0, $hNlxu.hsl)(rgb);\n    hslColor.s = value;\n    const c = hslColor.rgb();\n    return $ef0b145002741ccf$var$rgbToDeckglColor(c);\n}\n\n\n\n\n\nvar $a2698ea08ecf5377$exports = {};\n\n$parcel$export($a2698ea08ecf5377$exports, \"minHeight\", () => $a2698ea08ecf5377$export$a43cf604e12f3b17);\n$parcel$export($a2698ea08ecf5377$exports, \"minWidth\", () => $a2698ea08ecf5377$export$ee148fbbe8357dd2);\n$parcel$export($a2698ea08ecf5377$exports, \"defaultPresenterStyle\", () => $a2698ea08ecf5377$export$83ac8f5ae8122afc);\n$parcel$export($a2698ea08ecf5377$exports, \"defaultPresenterConfig\", () => $a2698ea08ecf5377$export$200f593236aebbdc);\n$parcel$export($a2698ea08ecf5377$exports, \"createStage\", () => $a2698ea08ecf5377$export$afa8810fbe5c2601);\n$parcel$export($a2698ea08ecf5377$exports, \"groupStrokeWidth\", () => $a2698ea08ecf5377$export$62471df653c738cc);\n$parcel$export($a2698ea08ecf5377$exports, \"lineZ\", () => $a2698ea08ecf5377$export$c25c42a6ee2ec894);\n$parcel$export($a2698ea08ecf5377$exports, \"defaultView\", () => $a2698ea08ecf5377$export$93acc5219d6538bb);\n$parcel$export($a2698ea08ecf5377$exports, \"minZ\", () => $a2698ea08ecf5377$export$ce94e349d95a214c);\n$parcel$export($a2698ea08ecf5377$exports, \"min3dDepth\", () => $a2698ea08ecf5377$export$d90a7322036a432e);\n$parcel$export($a2698ea08ecf5377$exports, \"minPixelSize\", () => $a2698ea08ecf5377$export$c9c7d435df6c4ed7);\n$parcel$export($a2698ea08ecf5377$exports, \"defaultOnAxisItem\", () => $a2698ea08ecf5377$export$f66a5ef821fcc5df);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst $a2698ea08ecf5377$export$a43cf604e12f3b17 = '100px';\nconst $a2698ea08ecf5377$export$ee148fbbe8357dd2 = '100px';\nconst $a2698ea08ecf5377$export$83ac8f5ae8122afc = {\n    cssPrefix: 'vega-morphcharts-',\n    defaultCubeColor: [\n        128,\n        128,\n        128,\n        255\n    ],\n    highlightColor: [\n        0,\n        0,\n        0,\n        255\n    ]\n};\nconst $a2698ea08ecf5377$export$200f593236aebbdc = {\n    onCubeClick: (e, cube)=>{},\n    onCubeHover: (e, cube)=>{},\n    transitionDurations: {\n        position: 600,\n        stagger: 600,\n        view: 600\n    },\n    renderer: {\n        advanced: false,\n        advancedOptions: {},\n        basicOptions: {\n            antialias: true\n        }\n    }\n};\nfunction $a2698ea08ecf5377$export$afa8810fbe5c2601(view) {\n    const stage = {\n        view: view,\n        cubeData: [],\n        pathData: [],\n        axes: {\n            x: [],\n            y: [],\n            z: []\n        },\n        gridLines: [],\n        textData: [],\n        legend: {\n            rows: {}\n        },\n        facets: []\n    };\n    return stage;\n}\nconst $a2698ea08ecf5377$export$62471df653c738cc = 1;\nconst $a2698ea08ecf5377$export$c25c42a6ee2ec894 = 0;\nconst $a2698ea08ecf5377$export$93acc5219d6538bb = '2d';\nconst $a2698ea08ecf5377$export$ce94e349d95a214c = 0.5;\nconst $a2698ea08ecf5377$export$d90a7322036a432e = 0.05;\nconst $a2698ea08ecf5377$export$c9c7d435df6c4ed7 = 0.5;\nconst $a2698ea08ecf5377$var$zAxisEncodeColor = [\n    7,\n    7,\n    7,\n    255\n];\nconst $a2698ea08ecf5377$var$zAxisOutColor = [\n    0,\n    0,\n    0,\n    255\n];\nfunction $a2698ea08ecf5377$export$f66a5ef821fcc5df(vegaItem, stageItem, stage, currAxis) {\n    if ((0, $ef0b145002741ccf$export$7da6ac10e55d4f2a)(stageItem.color, $a2698ea08ecf5377$var$zAxisEncodeColor)) {\n        stageItem.color = $a2698ea08ecf5377$var$zAxisOutColor;\n        if (currAxis.axisRole !== 'z') {\n            const previousAxisRole = $a2698ea08ecf5377$var$removeCurrentAxes(stage, currAxis);\n            if (previousAxisRole) {\n                currAxis.axisRole = 'z';\n                stage.axes.z.push(currAxis);\n            }\n        }\n    }\n}\nfunction $a2698ea08ecf5377$var$removeCurrentAxes(stage, currAxis) {\n    //find the current axis, remove it from parent\n    for(const axisRole in stage.axes){\n        const axes = stage.axes[axisRole];\n        for(let i = 0; i < axes.length; i++)if (axes[i] === currAxis) {\n            axes.splice(i, 1);\n            return axisRole;\n        }\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $94b078fc391e7135$var$vega = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null\n};\nconst $94b078fc391e7135$export$e2253033e6e1df16 = {\n    vega: $94b078fc391e7135$var$vega\n};\nfunction $94b078fc391e7135$export$1f96ae73734a86cc(vega) {\n    $94b078fc391e7135$export$e2253033e6e1df16.vega = vega;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nvar $57337365aaceccbe$exports = {};\n\n$parcel$export($57337365aaceccbe$exports, \"PresenterElement\", () => $57337365aaceccbe$export$79420be32f83a5b0);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * HTML elements outputted by the presenter.\n */ var $57337365aaceccbe$export$79420be32f83a5b0;\n(function(PresenterElement) {\n    PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n    PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n    PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n    PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n    PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n})($57337365aaceccbe$export$79420be32f83a5b0 || ($57337365aaceccbe$export$79420be32f83a5b0 = {}));\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nconst $93b302f28dcf836b$export$b0b33bcc0f604685 = (props)=>{\n    const rows = [];\n    const addRow = (row, i)=>{\n        const fn = $93b302f28dcf836b$var$symbolMap[row.symbol.shape];\n        let jsx;\n        if (fn) jsx = fn(row.symbol);\n        else jsx = (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"span\", null, \"x\");\n        rows.push({\n            cells: [\n                {\n                    className: 'symbol',\n                    content: jsx\n                },\n                {\n                    className: 'label',\n                    content: row.label,\n                    title: row.label\n                }\n            ]\n        });\n    };\n    const sorted = Object.keys(props.legend.rows).sort((a, b)=>+a - +b);\n    sorted.forEach((i)=>addRow(props.legend.rows[i], +i));\n    if (sorted.length) return (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)((0, $837e7efbc300fecc$export$54ec01a60f47d33d), {\n        rows: rows,\n        rowClassName: \"legend-row\",\n        onRowClick: (e, i)=>props.onClick(e, props.legend, i)\n    }, props.legend.title !== void 0 && (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"tr\", {\n        onClick: (e)=>props.onClick(e, props.legend, null)\n    }, (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"th\", {\n        colSpan: 2\n    }, props.legend.title)));\n};\nconst $93b302f28dcf836b$var$symbolMap = {\n    square: function(symbol) {\n        return (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"div\", {\n            style: {\n                height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                backgroundColor: symbol.fill,\n                borderColor: symbol.fill\n            }\n        });\n    }\n};\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nfunction $a1265428470a4521$export$ba5a93ad8642dce4(presenter) {\n    const rootDiv = (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"div\", {\n        className: $a1265428470a4521$export$2913c0c0b5623090((0, $57337365aaceccbe$export$79420be32f83a5b0).root, presenter)\n    }, (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"div\", {\n        className: $a1265428470a4521$export$2913c0c0b5623090((0, $57337365aaceccbe$export$79420be32f83a5b0).gl, presenter),\n        style: {\n            minHeight: $a2698ea08ecf5377$export$a43cf604e12f3b17,\n            minWidth: $a2698ea08ecf5377$export$ee148fbbe8357dd2\n        }\n    }), (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"div\", {\n        className: $a1265428470a4521$export$2913c0c0b5623090((0, $57337365aaceccbe$export$79420be32f83a5b0).panel, presenter)\n    }, (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"div\", {\n        className: $a1265428470a4521$export$2913c0c0b5623090((0, $57337365aaceccbe$export$79420be32f83a5b0).vegaControls, presenter)\n    }), (0, $fe86f88c0c9aea93$export$c8a8987d4410bf2d)(\"div\", {\n        className: $a1265428470a4521$export$2913c0c0b5623090((0, $57337365aaceccbe$export$79420be32f83a5b0).legend, presenter)\n    })));\n    (0, $fe86f88c0c9aea93$export$186d02efde07ef98)(rootDiv, presenter.el);\n}\nfunction $a1265428470a4521$export$2913c0c0b5623090(type, presenter) {\n    return `${presenter.style.cssPrefix}${(0, $57337365aaceccbe$export$79420be32f83a5b0)[type]}`;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $532135db04b63f4f$export$9a79ca9001afcc6d(allocatedSize, empty, cubes) {\n    const patched = new Array(allocatedSize);\n    patched.fill(empty);\n    cubes.forEach((cube)=>patched[cube.ordinal] = cube);\n    return patched;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst $ee42e7a385711003$var$legendMap = {\n    'legend-title': function(legend, textItem) {\n        legend.title = textItem.text;\n    },\n    'legend-symbol': function(legend, symbol) {\n        const { bounds: bounds, fill: fill, shape: shape } = symbol;\n        //this object is safe for serialization\n        const legendRowSymbol = {\n            bounds: bounds,\n            fill: fill,\n            shape: shape\n        };\n        const i = symbol.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        legend.rows[i].symbol = legendRowSymbol;\n    },\n    'legend-label': function(legend, label) {\n        const i = label.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        const row = legend.rows[i];\n        row.label = label.text;\n        row.value = label.datum.value;\n    }\n};\nconst $ee42e7a385711003$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        const fn = $ee42e7a385711003$var$legendMap[item.mark.role];\n        if (fn) fn(stage.legend, item);\n    });\n};\nvar $ee42e7a385711003$export$2e2bcd8739ae039 = $ee42e7a385711003$var$markStager;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst $1c2daaedca40f764$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        const { bounds: bounds, height: height, url: url, width: width } = item;\n        let { x1: x1, x2: x2, y1: y1, y2: y2 } = bounds;\n        x1 += x;\n        x2 += x;\n        y1 += y;\n        y2 += y;\n        if (!stage.backgroundImages) stage.backgroundImages = [];\n        stage.backgroundImages.push({\n            bounds: {\n                x1: x1,\n                x2: x2,\n                y1: y1,\n                y2: y2\n            },\n            height: height,\n            url: url,\n            width: width\n        });\n    });\n};\nvar $1c2daaedca40f764$export$2e2bcd8739ae039 = $1c2daaedca40f764$var$markStager;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nconst $1c0091b6f51baefd$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        const noZ = item.z === undefined;\n        const z = noZ ? 0 : (item.z || 0) + (0, $a2698ea08ecf5377$export$ce94e349d95a214c);\n        const depth = (noZ ? 0 : item.depth || 0) + (0, $a2698ea08ecf5377$export$d90a7322036a432e);\n        //change direction of y from SVG to GL\n        const ty = -1;\n        const ordinal = options.assignCubeOrdinal(item.datum);\n        if (ordinal > options.maxOrdinal) options.maxOrdinal = ordinal;\n        if (ordinal === undefined) ;\n        else {\n            const cube = {\n                ordinal: ordinal,\n                size: [\n                    item.width,\n                    item.height,\n                    depth\n                ],\n                position: [\n                    x + (+item.x || 0),\n                    ty * (y + (+item.y || 0)) - +item.height,\n                    z\n                ],\n                color: (0, $ef0b145002741ccf$export$78ed65bc9abd64b1)(item.fill) || options.defaultCubeColor || [\n                    128,\n                    128,\n                    128,\n                    128\n                ]\n            };\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n            stage.cubeData.push(cube);\n        }\n    });\n};\nvar $1c0091b6f51baefd$export$2e2bcd8739ae039 = $1c0091b6f51baefd$var$markStager;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nconst $3799405dfc10eafe$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        const x1 = item.x || 0;\n        const y1 = item.y || 0;\n        const x2 = item.x2 != null ? item.x2 : x1;\n        const y2 = item.y2 != null ? item.y2 : y1;\n        const lineItem = $3799405dfc10eafe$var$styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n        const { currAxis: currAxis } = options;\n        if (options.modifyAxis) options.modifyAxis(item, lineItem, stage, currAxis);\n        if (item.mark.role === 'axis-tick') currAxis.ticks.push(lineItem);\n        else if (item.mark.role === 'axis-domain') currAxis.domain = lineItem;\n        else stage.gridLines.push(lineItem);\n    });\n};\nfunction $3799405dfc10eafe$var$styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n    const line = {\n        sourcePosition: [\n            x1,\n            -y1,\n            (0, $a2698ea08ecf5377$export$c25c42a6ee2ec894)\n        ],\n        targetPosition: [\n            x2,\n            -y2,\n            (0, $a2698ea08ecf5377$export$c25c42a6ee2ec894)\n        ],\n        color: (0, $ef0b145002741ccf$export$78ed65bc9abd64b1)(stroke),\n        strokeWidth: strokeWidth\n    };\n    return line;\n}\nfunction $3799405dfc10eafe$export$827f4ee28efc37(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n    const lines = [\n        $3799405dfc10eafe$var$styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n        $3799405dfc10eafe$var$styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n        $3799405dfc10eafe$var$styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n        $3799405dfc10eafe$var$styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)\n    ];\n    if (diagonals) {\n        lines.push($3799405dfc10eafe$var$styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n        lines.push($3799405dfc10eafe$var$styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n    }\n    return lines;\n}\nvar $3799405dfc10eafe$export$2e2bcd8739ae039 = $3799405dfc10eafe$var$markStager;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n//change direction of y from SVG to GL\nconst $6a99e81bd9058351$var$ty = -1;\nconst $6a99e81bd9058351$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    const g = Object.assign({\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 1\n    }, scene.items[0]);\n    const path = {\n        strokeWidth: g.strokeWidth,\n        strokeColor: (0, $ef0b145002741ccf$export$78ed65bc9abd64b1)(g.stroke),\n        positions: scene.items.map((it)=>[\n                it.x,\n                $6a99e81bd9058351$var$ty * it.y,\n                it.z || 0\n            ])\n    };\n    path.strokeColor[3] *= g.strokeOpacity;\n    path.strokeColor[3] *= g.opacity;\n    stage.pathData.push(path);\n};\nvar $6a99e81bd9058351$export$2e2bcd8739ae039 = $6a99e81bd9058351$var$markStager;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ // import { AlignmentBaseline, TextAnchor } from '@deck.gl/layers/text-layer/text-layer';\n\n\nconst $74ed9c7a2f9d83d8$var$markStager = (options, stage, scene, x, y, groupType)=>{\n    //change direction of y from SVG to GL\n    const ty = -1;\n    (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.sceneVisit(scene, function(item) {\n        if (!item.text) return;\n        const size = item.fontSize;\n        //const alignmentBaseline = convertBaseline(item.baseline);\n        //const yOffset = alignmentBaseline === 'top' ? item.fontSize / 2 : 0;    //fixup to get tick text correct\n        const yOffset = 0;\n        const textItem = {\n            color: (0, $ef0b145002741ccf$export$78ed65bc9abd64b1)(item.fill),\n            text: item.limit === undefined ? item.text : (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.truncate(item.text, item.limit, 'right', item.ellipsis || '...'),\n            position: [\n                x + (item.x || 0),\n                ty * (y + (item.y || 0) + yOffset),\n                0\n            ],\n            size: size,\n            angle: $74ed9c7a2f9d83d8$var$convertAngle(item.angle),\n            //textAnchor: convertAlignment(item.align),\n            //alignmentBaseline,\n            metaData: item.metaData\n        };\n        const { currAxis: currAxis } = options;\n        if (options.modifyAxis) options.modifyAxis(item, textItem, stage, currAxis);\n        if (item.mark.role === 'axis-label') {\n            const tickText = textItem;\n            tickText.value = item.datum.value;\n            currAxis.tickText.push(tickText);\n        } else if (item.mark.role === 'axis-title') currAxis.title = textItem;\n        else stage.textData.push(textItem);\n    });\n};\nfunction $74ed9c7a2f9d83d8$var$convertAngle(vegaTextAngle) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) return 360 - vegaTextAngle;\n    return 0;\n}\nvar // function convertAlignment(textAlign: SceneTextAlign): TextAnchor {\n//     switch (textAlign) {\n//         case 'center': return 'middle';\n//         case 'left': return 'start';\n//         case 'right': return 'end';\n//     }\n//     return 'start';\n// }\n// function convertBaseline(baseline: SceneTextBaseline): AlignmentBaseline {\n//     switch (baseline) {\n//         case 'middle': return 'center';\n//     }\n//     return baseline || 'bottom';\n// }\n$74ed9c7a2f9d83d8$export$2e2bcd8739ae039 = $74ed9c7a2f9d83d8$var$markStager;\n\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $f1bfde149acb9a2e$export$d460f747b73abb10;\n(function(GroupType) {\n    GroupType[GroupType[\"none\"] = 0] = \"none\";\n    GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n    GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n    GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n    GroupType[GroupType[\"zAxis\"] = 4] = \"zAxis\";\n})($f1bfde149acb9a2e$export$d460f747b73abb10 || ($f1bfde149acb9a2e$export$d460f747b73abb10 = {}));\n\n\nfunction $684c20b0d21986c1$var$getAxisGroupType(item, options) {\n    const axisItem = item;\n    const axisMark = axisItem === null || axisItem === void 0 ? void 0 : axisItem.mark;\n    if ((axisMark === null || axisMark === void 0 ? void 0 : axisMark.zindex) === options.zAxisZindex && options.zAxisZindex !== undefined) return (0, $f1bfde149acb9a2e$export$d460f747b73abb10).zAxis;\n    switch(axisItem.orient){\n        case 'bottom':\n        case 'top':\n            return (0, $f1bfde149acb9a2e$export$d460f747b73abb10).xAxis;\n        case 'left':\n        case 'right':\n            return (0, $f1bfde149acb9a2e$export$d460f747b73abb10).yAxis;\n    }\n}\nfunction $684c20b0d21986c1$var$convertGroupRole(item, options) {\n    if (item.mark.role === 'legend') return (0, $f1bfde149acb9a2e$export$d460f747b73abb10).legend;\n    if (item.mark.role === 'axis') {\n        const groupType = $684c20b0d21986c1$var$getAxisGroupType(item, options);\n        if (groupType !== undefined) return groupType;\n    }\n}\nconst $684c20b0d21986c1$var$group = (options, stage, scene, x, y, groupType)=>{\n    (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.sceneVisit(scene, function(g) {\n        const gx = g.x || 0, gy = g.y || 0;\n        if (g.context && g.context.background && !stage.backgroundColor) stage.backgroundColor = (0, $ef0b145002741ccf$export$78ed65bc9abd64b1)(g.context.background);\n        if (g.stroke) {\n            const facetRect = {\n                datum: g.datum,\n                lines: (0, $3799405dfc10eafe$export$827f4ee28efc37)(gx + x, gy + y, g.height, g.width, g.stroke, (0, $a2698ea08ecf5377$export$62471df653c738cc))\n            };\n            stage.facets.push(facetRect);\n        }\n        groupType = $684c20b0d21986c1$var$convertGroupRole(g, options) || groupType;\n        $684c20b0d21986c1$var$setCurrentAxis(options, stage, groupType);\n        // draw group contents\n        (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.sceneVisit(g, function(item) {\n            $684c20b0d21986c1$var$mainStager(options, stage, item, gx + x, gy + y, groupType);\n        });\n    });\n};\nfunction $684c20b0d21986c1$var$setCurrentAxis(options, stage, groupType) {\n    let axisRole;\n    switch(groupType){\n        case (0, $f1bfde149acb9a2e$export$d460f747b73abb10).xAxis:\n            axisRole = 'x';\n            break;\n        case (0, $f1bfde149acb9a2e$export$d460f747b73abb10).yAxis:\n            axisRole = 'y';\n            break;\n        case (0, $f1bfde149acb9a2e$export$d460f747b73abb10).zAxis:\n            axisRole = 'z';\n            break;\n        default:\n            return;\n    }\n    options.currAxis = {\n        axisRole: axisRole,\n        domain: null,\n        tickText: [],\n        ticks: []\n    };\n    stage.axes[axisRole].push(options.currAxis);\n}\nconst $684c20b0d21986c1$var$markStagers = {\n    group: $684c20b0d21986c1$var$group,\n    legend: $ee42e7a385711003$export$2e2bcd8739ae039,\n    image: $1c2daaedca40f764$export$2e2bcd8739ae039,\n    rect: $1c0091b6f51baefd$export$2e2bcd8739ae039,\n    rule: $3799405dfc10eafe$export$2e2bcd8739ae039,\n    line: $6a99e81bd9058351$export$2e2bcd8739ae039,\n    text: $74ed9c7a2f9d83d8$export$2e2bcd8739ae039\n};\nconst $684c20b0d21986c1$var$mainStager = (options, stage, scene, x, y, groupType)=>{\n    if (scene.marktype !== 'group' && groupType === (0, $f1bfde149acb9a2e$export$d460f747b73abb10).legend) (0, $ee42e7a385711003$export$2e2bcd8739ae039)(options, stage, scene, x, y, groupType);\n    else {\n        const markStager = $684c20b0d21986c1$var$markStagers[scene.marktype];\n        if (markStager) markStager(options, stage, scene, x, y, groupType);\n    }\n};\nfunction $684c20b0d21986c1$export$d78988dba6734aaa(options, stage, scene) {\n    $684c20b0d21986c1$var$mainStager(options, stage, scene, 0, 0, null);\n    $684c20b0d21986c1$var$sortAxis(stage.axes.x, 0);\n    $684c20b0d21986c1$var$sortAxis(stage.axes.y, 1);\n    $684c20b0d21986c1$var$sortAxis(stage.axes.z, 1);\n}\nfunction $684c20b0d21986c1$var$sortAxis(axes, dim) {\n    axes.forEach((axis)=>{\n        if (axis.domain) $684c20b0d21986c1$var$orderDomain(axis.domain, dim);\n        axis.ticks.sort((a, b)=>a.sourcePosition[dim] - b.sourcePosition[dim]);\n        axis.tickText.sort((a, b)=>a.position[dim] - b.position[dim]);\n    });\n}\nfunction $684c20b0d21986c1$var$orderDomain(domain, dim) {\n    if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n        const temp = domain.targetPosition;\n        domain.targetPosition = domain.sourcePosition;\n        domain.sourcePosition = temp;\n    }\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $36f1cad8963ffaec$export$b1d52f954c5faa57(b1, b2) {\n    if (!b1 && !b2) return;\n    if (!b1) return b2;\n    if (!b2) return b1;\n    const minProps = [\n        'minBoundsX',\n        'minBoundsY',\n        'minBoundsZ'\n    ];\n    const maxProps = [\n        'maxBoundsX',\n        'maxBoundsY',\n        'maxBoundsZ'\n    ];\n    const result = {};\n    minProps.forEach((p)=>result[p] = $36f1cad8963ffaec$var$notNull(Math.min, b1[p], b2[p]));\n    maxProps.forEach((p)=>result[p] = $36f1cad8963ffaec$var$notNull(Math.max, b1[p], b2[p]));\n    return result;\n}\nfunction $36f1cad8963ffaec$var$notNull(fn, v1, v2) {\n    if (v1 == null && v2 == null) return null;\n    if (v1 == null) return v2;\n    if (v2 == null) return v1;\n    return fn(v1, v2);\n}\nfunction $36f1cad8963ffaec$export$a2647aa13413c947(b, minBoundsX, minBoundsY, minBoundsZ, maxBoundsX, maxBoundsY, maxBoundsZ) {\n    return $36f1cad8963ffaec$export$b1d52f954c5faa57(b, {\n        minBoundsX: minBoundsX,\n        minBoundsY: minBoundsY,\n        minBoundsZ: minBoundsZ,\n        maxBoundsX: maxBoundsX,\n        maxBoundsY: maxBoundsY,\n        maxBoundsZ: maxBoundsZ\n    });\n}\n\n\nconst $81bc6306df670951$export$b820fac18d588132 = (props)=>{\n    const { config: config, height: height, ref: ref, stage: stage } = props;\n    const { core: core } = ref;\n    const { renderer: renderer } = core;\n    const { x: x, y: y, z: z } = stage.axes;\n    const xyz = [\n        ...x,\n        ...y,\n        ...z\n    ];\n    renderer.currentAxes = [];\n    if (!xyz.length) {\n        renderer.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).none;\n        return;\n    }\n    renderer.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).current;\n    const correlation = new $81bc6306df670951$var$AxesCorrelation(stage, 3);\n    const { axesSets: axesSets, labels: labels } = correlation;\n    const grid = correlation.getGrid();\n    if (grid.byColumn[0]) {\n        grid.byColumn[0].forEach((row)=>{\n            row.axesSet.showFacetTitleY = true;\n        });\n        grid.byRow[0].forEach((col)=>{\n            col.axesSet.showFacetTitleX = true;\n        });\n    }\n    if (grid.rows > 1) {\n        const { byRow: byRow } = grid;\n        byRow[0].forEach(({ axesSet: axesSet }, col)=>{\n            if (!axesSet.y) {\n                if (byRow[1][col].axesSet) {\n                    //move x up\n                    byRow[1][col].axesSet.x.tickText = axesSet.x.tickText;\n                    byRow[1][col].axesSet.showFacetTitleX = axesSet.showFacetTitleX;\n                    delete axesSet.x;\n                }\n            }\n        });\n    }\n    let bounds;\n    const allAxesSetBounds = [];\n    let anyZ = false;\n    for(let i = 0; i < axesSets.length; i++)if (axesSets[i].z) {\n        anyZ = true;\n        break;\n    }\n    const is3d = stage.view === '3d' && anyZ;\n    axesSets.forEach((axesSet)=>{\n        if (!axesSet.x && !axesSet.y) return;\n        const axesSetBounds = {\n            axesSet: axesSet,\n            maxBoundsX: null,\n            maxBoundsY: null,\n            maxBoundsZ: null,\n            minBoundsX: null,\n            minBoundsY: null,\n            minBoundsZ: null\n        };\n        if (is3d) {\n            const zBounds = $81bc6306df670951$var$getDomainBounds(1, axesSet.z);\n            axesSetBounds.minBoundsZ = -zBounds.maxBounds;\n            axesSetBounds.maxBoundsZ = -zBounds.minBounds;\n        }\n        const yBounds = $81bc6306df670951$var$getDomainBounds(1, axesSet.y);\n        axesSetBounds.minBoundsY = yBounds.minBounds;\n        axesSetBounds.maxBoundsY = yBounds.maxBounds;\n        axesSetBounds.y = yBounds.minBounds;\n        axesSetBounds.h = yBounds.maxBounds - yBounds.minBounds;\n        const xBounds = $81bc6306df670951$var$getDomainBounds(0, axesSet.x);\n        axesSetBounds.minBoundsX = xBounds.minBounds;\n        axesSetBounds.maxBoundsX = xBounds.maxBounds;\n        axesSetBounds.x = xBounds.minBounds;\n        axesSetBounds.w = xBounds.maxBounds - xBounds.minBounds;\n        allAxesSetBounds.push(axesSetBounds);\n        bounds = (0, $36f1cad8963ffaec$export$b1d52f954c5faa57)(bounds, axesSetBounds);\n    });\n    const facetLabelX = labels.filter((label)=>label.axisRole === 'x')[0];\n    const facetLabelY = labels.filter((label)=>label.axisRole === 'y')[0];\n    core.inputManager.pickAxesTitleCallback = ({ axis: axis, axes: axes, manipulator: manipulator })=>{\n        const axesSet = axesSets[axes];\n        let a;\n        let f;\n        switch(axis){\n            case 0:\n                a = axesSet.x;\n                f = facetLabelX;\n                break;\n            case 1:\n                a = axesSet.y;\n                f = facetLabelY;\n                break;\n            case 2:\n                a = axesSet.z;\n                break;\n        }\n        if (a) config.onTextClick(manipulator.event, a.title || f.title);\n    };\n    allAxesSetBounds.forEach((axesSetBounds)=>{\n        const { axesSet: axesSet } = axesSetBounds;\n        if (!axesSet.x && !axesSet.y) return;\n        const cartesian = new (is3d ? (0, $4559f2a5f6bc9c8c$exports).Cartesian3dAxes : (0, $4559f2a5f6bc9c8c$exports).Cartesian2dAxes)(core);\n        cartesian.isDivisionPickingEnabled = [\n            false,\n            false,\n            false\n        ];\n        cartesian.arePickDivisionsVisible = [\n            false,\n            false,\n            false\n        ];\n        cartesian.isLabelPickingEnabled = [\n            false,\n            false,\n            false\n        ];\n        cartesian.isTitlePickingEnabled = [\n            false,\n            false,\n            false\n        ];\n        cartesian.isGridPickingEnabled = false;\n        cartesian.isHeadingPickingEnabled = [\n            false,\n            false,\n            false\n        ];\n        $81bc6306df670951$var$createAxes(cartesian, 0, 0, axesSet.x, (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular, height, props, axesSet.showFacetTitleX && facetLabelX);\n        $81bc6306df670951$var$createAxes(cartesian, 1, 1, axesSet.y, (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular, height, props, axesSet.showFacetTitleY && facetLabelY);\n        if (is3d) $81bc6306df670951$var$createAxes(cartesian, 1, 2, axesSet.z, (0, $4a6417d29706362f$export$d2304d1f23cf3ace).perpendicular, height, props);\n        $81bc6306df670951$var$configCartesianAxes(is3d, bounds, cartesian);\n        const { maxBoundsX: maxBoundsX, maxBoundsY: maxBoundsY, minBoundsX: minBoundsX, minBoundsY: minBoundsY } = bounds;\n        const w = maxBoundsX - minBoundsX;\n        const h = maxBoundsY - minBoundsY;\n        cartesian.scalingX = axesSetBounds.w / w;\n        cartesian.scalingY = axesSetBounds.h / h;\n        cartesian.offsetX = (axesSetBounds.x - minBoundsX + axesSetBounds.w / 2) / w - 0.5;\n        cartesian.offsetY = (axesSetBounds.y - minBoundsY + axesSetBounds.h / 2) / h - 0.5;\n        const aspect = h / w;\n        if (aspect > 1) cartesian.offsetX /= aspect;\n        else cartesian.offsetY *= aspect;\n        const axes = is3d ? renderer.createCartesian3dAxesVisual(cartesian) : renderer.createCartesian2dAxesVisual(cartesian);\n        renderer.currentAxes.push(axes);\n        props.config.onAxesComplete && props.config.onAxesComplete(cartesian);\n    });\n    return {\n        bounds: bounds\n    };\n};\nconst $81bc6306df670951$var$nullDomain = {\n    sourcePosition: [\n        0,\n        0,\n        0\n    ],\n    targetPosition: [\n        0,\n        0,\n        0\n    ]\n};\nclass $81bc6306df670951$var$AxesCorrelation {\n    constructor(stage, dimensions){\n        this.dimensions = dimensions;\n        const { x: x, y: y, z: z } = stage.axes;\n        this.axesSets = [];\n        this.labels = [];\n        [\n            x,\n            y,\n            z\n        ].forEach((axes)=>{\n            axes.forEach((axis)=>{\n                if (this.axesSets.length === 0) this.initialize(axis);\n                else this.correlate(axis);\n            });\n        });\n    }\n    getGrid() {\n        const mapCols = {};\n        const mapRows = {};\n        this.axesSets.forEach((axesSet)=>{\n            var _a;\n            const domain = (_a = axesSet === null || axesSet === void 0 ? void 0 : axesSet.x) === null || _a === void 0 ? void 0 : _a.domain;\n            if (!domain) return;\n            const col = domain.sourcePosition[0].toString();\n            const row = domain.sourcePosition[1].toString();\n            if (!mapCols[col]) mapCols[col] = {};\n            mapCols[col][row] = axesSet;\n            mapRows[row] = null;\n        });\n        const colKeys = Object.keys(mapCols).sort((a, b)=>+a - +b);\n        const rowKeys = Object.keys(mapRows).sort((a, b)=>+a - +b);\n        return {\n            cols: colKeys.length,\n            rows: rowKeys.length,\n            byColumn: colKeys.map((colKey)=>rowKeys.map((rowKey)=>{\n                    return {\n                        colKey: colKey,\n                        rowKey: rowKey,\n                        axesSet: mapCols[colKey][rowKey]\n                    };\n                })),\n            byRow: rowKeys.map((rowKey)=>colKeys.map((colKey)=>{\n                    return {\n                        colKey: colKey,\n                        rowKey: rowKey,\n                        axesSet: mapCols[colKey][rowKey]\n                    };\n                }))\n        };\n    }\n    initialize(axis) {\n        if (!axis.domain) {\n            this.labels.push(axis);\n            return;\n        }\n        const axesSet = {};\n        axesSet[axis.axisRole] = axis;\n        this.axesSets.push(axesSet);\n    }\n    correlate(axis) {\n        if (!axis.domain) {\n            this.labels.push(axis);\n            return;\n        }\n        for(let i = 0; i < this.axesSets.length; i++){\n            const axesSet = this.axesSets[i];\n            for(const axisRole in axesSet){\n                const test = axesSet[axisRole];\n                if (this.matchDomains(axis.domain, test.domain)) {\n                    //prefer the axes with titles\n                    if (!axesSet[axis.axisRole] || !axesSet[axis.axisRole].tickText.length && axis.tickText.length) axesSet[axis.axisRole] = axis;\n                    return;\n                }\n            }\n        }\n        this.initialize(axis);\n    }\n    matchDomains(a, b) {\n        if (this.matchPoint(a.sourcePosition, b.sourcePosition)) return true;\n        if (this.matchPoint(a.sourcePosition, b.targetPosition)) return true;\n        if (this.matchPoint(a.targetPosition, b.targetPosition)) return true;\n        if (this.matchPoint(a.targetPosition, b.sourcePosition)) return true;\n        return false;\n    }\n    matchPoint(a, b) {\n        for(let i = 0; i < this.dimensions; i++){\n            if (a[i] !== b[i]) return false;\n        }\n        return true;\n    }\n}\nfunction $81bc6306df670951$var$createAxes(cartesian, dim2d, dim3d, axis, orientation, height, props, facetLabel) {\n    const domain = (axis === null || axis === void 0 ? void 0 : axis.domain) || $81bc6306df670951$var$nullDomain;\n    const { tickPositions: tickPositions, tickText: tickText, textPos: textPos, textSize: textSize } = $81bc6306df670951$var$convertAxis(axis, domain, dim2d, height);\n    if (axis.axisRole === 'z') {\n        tickPositions.forEach((t, i)=>tickPositions[i] = 1 - t);\n        textPos.forEach((t, i)=>textPos[i] = 1 - t);\n        tickText.reverse();\n        tickPositions.reverse();\n        textPos.reverse();\n    }\n    cartesian.setTickPositions(dim3d, tickPositions);\n    cartesian.zero[dim3d] = 0; //TODO get any \"zero\" gridline position from vega\n    cartesian.setLabelPositions(dim3d, textPos);\n    cartesian.setLabels(dim3d, tickText);\n    cartesian.setLabelSizes(dim3d, textSize);\n    const title = (axis === null || axis === void 0 ? void 0 : axis.title) || (facetLabel === null || facetLabel === void 0 ? void 0 : facetLabel.title);\n    if (title === null || title === void 0 ? void 0 : title.text) {\n        cartesian.setTitle(dim3d, title.text);\n        cartesian.setTitleSize(dim3d, title.size / height);\n    }\n    cartesian.setLabelOrientation(dim3d, orientation);\n    props.config.onAxisConfig && props.config.onAxisConfig(cartesian, dim3d, axis);\n    return {\n        tickText: tickText\n    };\n}\nfunction $81bc6306df670951$var$configCartesianAxes(is3d, bounds, cartesian) {\n    if (is3d) cartesian.isEdgeVisible[(0, $4a6417d29706362f$export$99dacba06f5726bd).topBack] = false;\n    cartesian.isEdgeVisible[(0, $4a6417d29706362f$export$99dacba06f5726bd).backRight] = false;\n    cartesian.isEdgeVisible[(0, $4a6417d29706362f$export$99dacba06f5726bd).bottomRight] = false;\n    cartesian.isEdgeVisible[(0, $4a6417d29706362f$export$99dacba06f5726bd).frontRight] = false;\n    cartesian.isEdgeVisible[(0, $4a6417d29706362f$export$99dacba06f5726bd).topFront] = false;\n    cartesian.isEdgeVisible[(0, $4a6417d29706362f$export$99dacba06f5726bd).topRight] = false;\n    const { maxBoundsX: maxBoundsX, maxBoundsY: maxBoundsY, maxBoundsZ: maxBoundsZ, minBoundsX: minBoundsX, minBoundsY: minBoundsY, minBoundsZ: minBoundsZ } = bounds;\n    cartesian.minBoundsX = minBoundsX;\n    cartesian.maxBoundsX = maxBoundsX;\n    cartesian.minBoundsY = minBoundsY;\n    cartesian.maxBoundsY = maxBoundsY;\n    if (is3d) {\n        cartesian.minBoundsZ = minBoundsZ;\n        cartesian.maxBoundsZ = maxBoundsZ;\n    }\n}\nfunction $81bc6306df670951$var$getDomainBounds(dim2d, axis) {\n    const domain = (axis === null || axis === void 0 ? void 0 : axis.domain) || $81bc6306df670951$var$nullDomain;\n    const minBounds = domain.sourcePosition[dim2d];\n    const maxBounds = domain.targetPosition[dim2d];\n    return {\n        maxBounds: maxBounds,\n        minBounds: minBounds\n    };\n}\nfunction $81bc6306df670951$var$convertAxis(axis, domain, dim, height) {\n    const start = domain.sourcePosition[dim];\n    const span = domain.targetPosition[dim] - start;\n    const tickPositions = axis ? axis.ticks.map((t)=>(t.sourcePosition[dim] - start) / span) : [];\n    const tickText = axis ? axis.tickText.map((t)=>t.text) : [];\n    const textPos = axis ? axis.tickText.map((t)=>(t.position[dim] - start) / span) : [];\n    const textSize = axis ? axis.tickText.map((t)=>t.size / height) : [];\n    if (tickPositions.length) {\n        if (tickPositions[0] !== 0) tickPositions[0] = 0;\n        if (tickPositions[tickPositions.length - 1] !== 1) tickPositions[tickPositions.length - 1] = 1;\n    }\n    return {\n        tickPositions: tickPositions,\n        tickText: tickText,\n        textPos: textPos,\n        textSize: textSize\n    };\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nclass $b85abf0fe2345f80$export$7cefaad7e81641ff {\n    constructor(quant = 5){\n        this.quant = quant;\n        this.colorMap = {};\n        this.colorArray = [];\n    }\n    getColorKey(rgbaColor) {\n        const color = rgbaColor.slice(0, 3).map((e)=>Math.floor(e / this.quant) * this.quant);\n        color[3] = rgbaColor[3]; //retain alpha\n        return JSON.stringify(color);\n    }\n    registerColor(rgbaColor) {\n        const colorKey = this.getColorKey(rgbaColor);\n        if (!this.colorMap[colorKey]) {\n            this.colorMap[colorKey] = {\n                index: this.colorArray.length,\n                rgbaColor: rgbaColor\n            };\n            this.colorArray.push(rgbaColor);\n        }\n        return this.colorMap[colorKey].index;\n    }\n    getPalette() {\n        return {\n            palette: new Uint8Array(this.colorArray.flat()),\n            maxColor: this.colorArray.length - 1\n        };\n    }\n}\nfunction $b85abf0fe2345f80$var$convert(newColor) {\n    const c = (0, $ef0b145002741ccf$export$78ed65bc9abd64b1)(newColor).slice(0, 3);\n    return c.map((v)=>v / 255);\n}\nfunction $b85abf0fe2345f80$export$419c579437571e95(ref, colors) {\n    if (!colors) return;\n    const { config: config } = ref.core;\n    config.activeColor = $b85abf0fe2345f80$var$convert(colors.activeItemColor);\n    config.backgroundColor = new Float32Array($b85abf0fe2345f80$var$convert(colors.backgroundColor));\n    config.textColor = $b85abf0fe2345f80$var$convert(colors.textColor);\n    config.textBorderColor = $b85abf0fe2345f80$var$convert(colors.textBorderColor);\n    config.axesTextColor = $b85abf0fe2345f80$var$convert(colors.axesTextLabelColor);\n    config.axesGridBackgroundColor = $b85abf0fe2345f80$var$convert(colors.axesGridBackgroundColor);\n    config.axesGridHighlightColor = $b85abf0fe2345f80$var$convert(colors.axesGridHighlightColor);\n    config.axesGridMinorColor = $b85abf0fe2345f80$var$convert(colors.axesGridMinorColor);\n    config.axesGridMajorColor = $b85abf0fe2345f80$var$convert(colors.axesGridMajorColor);\n    config.axesGridZeroColor = $b85abf0fe2345f80$var$convert(colors.axesGridZeroColor);\n    //TODO fix this - hack to reset the background color\n    ref.core.renderer['_theme'] = null;\n}\n\n\nconst $9241682e5783df33$var$key = 'cube';\nconst $9241682e5783df33$export$1858923cd0c63ab5 = (props)=>{\n    const { ref: ref, stage: stage } = props;\n    const { core: core } = ref;\n    const scatter = new (0, $f35934b4176df23d$exports).Scatter(core);\n    const { ids: ids, colors: colors, positionsX: positionsX, positionsY: positionsY, positionsZ: positionsZ, sizesX: sizesX, sizesY: sizesY, sizesZ: sizesZ, bounds: bounds, maxColor: maxColor, palette: palette } = $9241682e5783df33$var$convert(stage);\n    if (!ids.length) return;\n    const { renderer: renderer } = core;\n    let cubeTransitionBuffer = renderer.transitionBuffers.find((t)=>t.key === $9241682e5783df33$var$key);\n    if (!cubeTransitionBuffer) {\n        cubeTransitionBuffer = renderer.createTransitionBuffer(ids);\n        cubeTransitionBuffer.key = $9241682e5783df33$var$key;\n        renderer.transitionBuffers.push(cubeTransitionBuffer);\n    } else cubeTransitionBuffer.swap();\n    scatter.layout(cubeTransitionBuffer.currentBuffer, ids, {\n        positionsX: positionsX,\n        positionsY: positionsY,\n        positionsZ: positionsZ\n    });\n    const layer = {\n        positionsX: positionsX,\n        positionsY: positionsY,\n        positionsZ: positionsZ,\n        update: (newBounds, selected, stagger)=>{\n            const { colors: colors, maxColor: maxColor, minColor: minColor, palette: palette } = layer.unitColorMap;\n            // reference off of core.renderer to get the actual buffer\n            const currCubeTransitionBuffer = core.renderer.transitionBuffers.find((t)=>t.key === $9241682e5783df33$var$key);\n            currCubeTransitionBuffer.currentBuffer.unitType = (0, $4a6417d29706362f$export$80d48287646c9e3b).block;\n            currCubeTransitionBuffer.currentPalette.colors = palette;\n            let options = Object.assign({\n                selected: selected,\n                colors: colors,\n                minColor: minColor,\n                maxColor: maxColor,\n                sizesX: sizesX,\n                sizesY: sizesY,\n                sizesZ: sizesZ\n            }, newBounds);\n            if (stagger === null || stagger === void 0 ? void 0 : stagger.staggerOrders) {\n                const { maxStaggerOrder: maxStaggerOrder, minStaggerOrder: minStaggerOrder, staggerOrders: staggerOrders } = stagger;\n                options = Object.assign(Object.assign({}, options), {\n                    maxStaggerOrder: maxStaggerOrder,\n                    minStaggerOrder: minStaggerOrder,\n                    staggerOrders: staggerOrders\n                });\n            }\n            scatter.update(currCubeTransitionBuffer.currentBuffer, ids, options);\n        },\n        bounds: bounds,\n        unitColorMap: {\n            colors: colors,\n            ids: ids,\n            minColor: 0,\n            maxColor: maxColor,\n            palette: palette\n        }\n    };\n    return layer;\n};\nfunction $9241682e5783df33$var$convert(stage) {\n    const { cubeData: cubeData } = stage;\n    const { length: length } = cubeData;\n    const ids = [];\n    const colors = new Float64Array(length);\n    const positionsX = new Float64Array(length);\n    const positionsY = new Float64Array(length);\n    const positionsZ = new Float64Array(length);\n    const sizesX = new Float64Array(length);\n    const sizesY = new Float64Array(length);\n    const sizesZ = new Float64Array(length);\n    let bounds;\n    const colorMap = new (0, $b85abf0fe2345f80$export$7cefaad7e81641ff)();\n    cubeData.forEach((cube, i)=>{\n        ids.push(i);\n        if (cube.isEmpty) {\n            positionsX[i] = 0;\n            positionsY[i] = 0;\n            positionsZ[i] = 0;\n            sizesX[i] = 0;\n            sizesY[i] = 0;\n            sizesZ[i] = 0;\n            colors[i] = 0;\n        } else {\n            //ids.push(cube.ordinal);\n            positionsX[i] = cube.position[0] + cube.size[0] * 0.5;\n            positionsY[i] = cube.position[1] + cube.size[1] * 0.5;\n            positionsZ[i] = cube.position[2] + cube.size[2] * 0.5;\n            sizesX[i] = cube.size[0];\n            sizesY[i] = cube.size[1];\n            sizesZ[i] = cube.size[2];\n            bounds = (0, $36f1cad8963ffaec$export$a2647aa13413c947)(bounds, cube.position[0], cube.position[1], cube.position[2], cube.position[0] + cube.size[0], cube.position[1] + cube.size[1], cube.position[2] + cube.size[2]);\n            colors[i] = colorMap.registerColor(cube.color);\n        }\n    });\n    const { palette: palette, maxColor: maxColor } = colorMap.getPalette();\n    return {\n        ids: new Uint32Array(ids),\n        colors: colors,\n        positionsX: positionsX,\n        positionsY: positionsY,\n        positionsZ: positionsZ,\n        sizesX: sizesX,\n        sizesY: sizesY,\n        sizesZ: sizesZ,\n        bounds: bounds,\n        maxColor: maxColor,\n        palette: palette\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nconst $7ec432d4679a9501$var$key = 'line';\nconst $7ec432d4679a9501$export$9c2bb35a54d315bd = (props)=>{\n    const { height: height, ref: ref, stage: stage, width: width } = props;\n    const { core: core } = ref;\n    const lines = new (0, $f35934b4176df23d$exports).Line(core);\n    const { ids: ids, fromIds: fromIds, toIds: toIds, lineColors: lineColors, lineSizes: lineSizes, bounds: bounds, positionsX: positionsX, positionsY: positionsY, positionsZ: positionsZ, lineMaxColor: lineMaxColor, palette: palette } = $7ec432d4679a9501$var$convert(stage, height, width);\n    if (!ids.length) return;\n    const { renderer: renderer } = core;\n    let lineTransitionBuffer = renderer.transitionBuffers.find((t)=>t.key === $7ec432d4679a9501$var$key);\n    if (!lineTransitionBuffer) {\n        lineTransitionBuffer = renderer.createTransitionBuffer(ids);\n        lineTransitionBuffer.key = $7ec432d4679a9501$var$key;\n        renderer.transitionBuffers.push(lineTransitionBuffer);\n    } else lineTransitionBuffer.swap();\n    lines.layout(lineTransitionBuffer.currentBuffer, ids, fromIds, toIds, {\n        positionsX: positionsX,\n        positionsY: positionsY,\n        positionsZ: positionsZ,\n        lineSizes: lineSizes,\n        sizeScaling: 1\n    });\n    let options = {\n        lineColors: lineColors,\n        lineMinColor: 0,\n        lineMaxColor: lineMaxColor\n    };\n    // Unit type\n    lineTransitionBuffer.currentBuffer.unitType = (0, $4a6417d29706362f$export$80d48287646c9e3b).cylinder;\n    lineTransitionBuffer.currentPalette.colors = palette;\n    return {\n        update: (newBounds)=>{\n            options = Object.assign(Object.assign({}, options), newBounds);\n            // reference off of core.renderer to get the actual buffer\n            const currLineTransitionBuffer = core.renderer.transitionBuffers.find((t)=>t.key === $7ec432d4679a9501$var$key);\n            lines.update(currLineTransitionBuffer.currentBuffer, ids, fromIds, toIds, options);\n        },\n        bounds: bounds,\n        unitColorMap: {\n            ids: ids,\n            colors: lineColors,\n            minColor: 0,\n            maxColor: lineMaxColor,\n            palette: palette\n        }\n    };\n};\nfunction $7ec432d4679a9501$var$convert(stage, height, width) {\n    const { pathData: pathData } = stage;\n    const positions = [];\n    const lines = [];\n    const colorMap = new (0, $b85abf0fe2345f80$export$7cefaad7e81641ff)();\n    pathData.forEach((path)=>{\n        const color = colorMap.registerColor(path.strokeColor);\n        let from = positions.length;\n        positions.push(path.positions[0]);\n        for(let i = 1; i < path.positions.length; i++){\n            const to = positions.length;\n            positions.push(path.positions[i]);\n            lines.push({\n                id: lines.length,\n                from: from,\n                to: to,\n                color: color,\n                size: path.strokeWidth\n            });\n            from = to;\n        }\n    });\n    const ids = new Uint32Array(lines.length);\n    const fromIds = new Uint32Array(lines.length);\n    const toIds = new Uint32Array(lines.length);\n    const lineColors = new Float64Array(lines.length);\n    const lineSizes = new Float64Array(lines.length);\n    lines.forEach((line, i)=>{\n        ids[i] = i;\n        fromIds[i] = line.from;\n        toIds[i] = line.to;\n        lineColors[i] = line.color;\n        lineSizes[i] = line.size;\n    });\n    const positionsX = new Float64Array(positions.length);\n    const positionsY = new Float64Array(positions.length);\n    const positionsZ = new Float64Array(positions.length);\n    let bounds;\n    positions.forEach((p, i)=>{\n        positionsX[i] = p[0];\n        positionsY[i] = p[1] + height;\n        positionsZ[i] = p[2];\n        bounds = (0, $36f1cad8963ffaec$export$a2647aa13413c947)(bounds, positionsX[i], positionsY[i], positionsZ[i], positionsX[i], positionsY[i], positionsZ[i]);\n    });\n    const { palette: palette, maxColor: lineMaxColor } = colorMap.getPalette();\n    return {\n        ids: ids,\n        fromIds: fromIds,\n        toIds: toIds,\n        lineColors: lineColors,\n        lineSizes: lineSizes,\n        bounds: bounds,\n        positionsX: positionsX,\n        positionsY: positionsY,\n        positionsZ: positionsZ,\n        lineMaxColor: lineMaxColor,\n        palette: palette\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nconst $ee7c2c84baff3529$export$bbc48f7bb3ba03ac = (props)=>{\n    const { ref: ref, stage: stage } = props;\n    const { core: core } = ref;\n    const { positionsX: positionsX, positionsY: positionsY, positionsZ: positionsZ, sizes: sizes, bounds: bounds, maxGlyphs: maxGlyphs, text: text } = $ee7c2c84baff3529$var$convert(stage);\n    if (text.length === 0) {\n        core.renderer.labelSets = [];\n        return;\n    }\n    const options = {\n        text: text,\n        maxGlyphs: maxGlyphs,\n        scales: sizes\n    };\n    const labelSet = new (0, $8fe9a403f3311664$exports).LabelSet(core, options);\n    labelSet.positionsX = positionsX;\n    labelSet.positionsY = positionsY;\n    labelSet.positionsZ = positionsZ;\n    labelSet.horizontalAlignment = (0, $4a6417d29706362f$export$d94dcb5bec64086e).center;\n    labelSet.verticalAlignment = (0, $4a6417d29706362f$export$c12e835f91722ef8).center;\n    const layer = {\n        update: (bounds)=>{\n            const { maxBoundsX: maxBoundsX, maxBoundsY: maxBoundsY, maxBoundsZ: maxBoundsZ, minBoundsX: minBoundsX, minBoundsY: minBoundsY, minBoundsZ: minBoundsZ } = bounds;\n            labelSet.minBoundsX = minBoundsX;\n            labelSet.minBoundsY = minBoundsY;\n            labelSet.minBoundsZ = minBoundsZ;\n            labelSet.maxBoundsX = maxBoundsX;\n            labelSet.maxBoundsY = maxBoundsY;\n            labelSet.maxBoundsZ = maxBoundsZ;\n        },\n        bounds: bounds\n    };\n    const labelSetVisual = core.renderer.createLabelSetVisual(labelSet);\n    core.renderer.labelSets = [\n        labelSetVisual\n    ];\n    return layer;\n};\nfunction $ee7c2c84baff3529$var$convert(stage) {\n    const { textData: textData } = stage;\n    const { length: length } = textData;\n    const ids = [];\n    const text = [];\n    const colors = new Float64Array(length);\n    const positionsX = new Float64Array(length);\n    const positionsY = new Float64Array(length);\n    const positionsZ = new Float64Array(length);\n    const sizes = new Float64Array(length);\n    let bounds;\n    let maxGlyphs = 0;\n    const colorMap = new (0, $b85abf0fe2345f80$export$7cefaad7e81641ff)();\n    textData.forEach((t, i)=>{\n        ids.push(i);\n        text.push(t.text);\n        maxGlyphs += t.text.length;\n        positionsX[i] = t.position[0];\n        positionsY[i] = t.position[1];\n        positionsZ[i] = t.position[2];\n        sizes[i] = 1.5 * t.size; //scale similar to axes\n        bounds = (0, $36f1cad8963ffaec$export$a2647aa13413c947)(bounds, t.position[0], t.position[1], t.position[2], t.position[0], t.position[1], t.position[2]);\n        colors[i] = colorMap.registerColor(t.color);\n    });\n    const { palette: palette, maxColor: maxColor } = colorMap.getPalette();\n    return {\n        ids: new Uint32Array(ids),\n        colors: colors,\n        positionsX: positionsX,\n        positionsY: positionsY,\n        positionsZ: positionsZ,\n        sizes: sizes,\n        bounds: bounds,\n        maxColor: maxColor,\n        maxGlyphs: maxGlyphs,\n        palette: palette,\n        text: text\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $e8568da1cd4c527e$export$d93c68e129326488(url) {\n    return new Promise((resolve, reject)=>{\n        const imageElement = document.createElement('img');\n        imageElement.onload = ()=>{\n            const canvas = document.createElement('canvas');\n            const ctx = canvas.getContext('2d');\n            const { height: height, width: width } = imageElement;\n            canvas.width = width;\n            canvas.height = height;\n            ctx.drawImage(imageElement, 0, 0);\n            resolve(ctx.getImageData(0, 0, width, height));\n        };\n        imageElement.src = url;\n    });\n}\nfunction $e8568da1cd4c527e$export$9d5d32bc62ddf581(core, imageData, bounds, position, width, height) {\n    const { maxBoundsX: maxBoundsX, maxBoundsY: maxBoundsY, maxBoundsZ: maxBoundsZ, minBoundsX: minBoundsX, minBoundsY: minBoundsY, minBoundsZ: minBoundsZ } = bounds;\n    const imageOptions = {\n        imageData: imageData,\n        position: position,\n        height: height,\n        width: width,\n        minBoundsX: minBoundsX,\n        maxBoundsX: maxBoundsX,\n        minBoundsZ: minBoundsZ,\n        maxBoundsZ: maxBoundsZ,\n        minBoundsY: minBoundsY,\n        maxBoundsY: maxBoundsY\n    };\n    return new (0, $8fe9a403f3311664$exports).ImageQuad(core, imageOptions);\n}\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $2d7c211c29fc4124$var$createCameraDefaults() {\n    const qModelRotation2d = (0, $39ece26d1239bb77$exports).create();\n    const qModelRotation3d = (0, $d4d7bd6cc65a5081$export$a002182e51710d39).QUAT_ROTATEX_MINUS_90;\n    const qCameraRotation2d = (0, $39ece26d1239bb77$exports).create();\n    const qCameraRotation3d = (0, $39ece26d1239bb77$exports).create();\n    const qAngle = (0, $39ece26d1239bb77$exports).create();\n    const vCameraPosition = (0, $31054a6c69637582$exports).create();\n    // Altitude (pitch around local right axis)\n    (0, $39ece26d1239bb77$exports).setAxisAngle(qCameraRotation3d, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITX, (0, $92f02b8a0655b486$exports).AngleHelper.degreesToRadians(30));\n    // Azimuth (yaw around global up axis)\n    (0, $39ece26d1239bb77$exports).setAxisAngle(qAngle, (0, $d4d7bd6cc65a5081$export$a002182e51710d39).VECTOR3_UNITY, (0, $92f02b8a0655b486$exports).AngleHelper.degreesToRadians(-25));\n    (0, $39ece26d1239bb77$exports).multiply(qCameraRotation3d, qCameraRotation3d, qAngle);\n    return {\n        qModelRotation2d: qModelRotation2d,\n        qModelRotation3d: qModelRotation3d,\n        qCameraRotation2d: qCameraRotation2d,\n        qCameraRotation3d: qCameraRotation3d,\n        vCameraPosition: vCameraPosition\n    };\n}\nconst $2d7c211c29fc4124$export$504e5adc1166f08a = $2d7c211c29fc4124$var$createCameraDefaults();\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nconst { qCameraRotation2d: $10880856df36f20b$var$qCameraRotation2d, qCameraRotation3d: $10880856df36f20b$var$qCameraRotation3d, qModelRotation2d: $10880856df36f20b$var$qModelRotation2d, qModelRotation3d: $10880856df36f20b$var$qModelRotation3d, vCameraPosition: $10880856df36f20b$var$vCameraPosition } = (0, $2d7c211c29fc4124$export$504e5adc1166f08a);\nfunction $10880856df36f20b$export$21ad5731ba175a64(ref, lastPresenterConfig, lastView, transistion2dOnly) {\n    const { cameraTransitioner: cameraTransitioner, core: core, modelTransitioner: modelTransitioner, positionTransitioner: positionTransitioner } = ref;\n    ref.reset = ()=>{\n        core.reset(true);\n        if (lastView === '3d') {\n            modelTransitioner.qRotation.to = $10880856df36f20b$var$qModelRotation3d;\n            cameraTransitioner.qRotation.to = $10880856df36f20b$var$qCameraRotation3d;\n            cameraTransitioner.vPosition.to = $10880856df36f20b$var$vCameraPosition;\n        } else {\n            modelTransitioner.qRotation.to = $10880856df36f20b$var$qModelRotation2d;\n            cameraTransitioner.qRotation.to = $10880856df36f20b$var$qCameraRotation2d;\n            cameraTransitioner.vPosition.to = $10880856df36f20b$var$vCameraPosition;\n        }\n        (0, $39ece26d1239bb77$exports).slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.to, modelTransitioner.qRotation.to, 0);\n        core.setModelRotation(modelTransitioner.qRotation.current, true);\n        core.camera.setOrbit(cameraTransitioner.qRotation.to, true);\n        core.camera.setPosition(cameraTransitioner.vPosition.to, true);\n    };\n    const cam = (t)=>{\n        (0, $39ece26d1239bb77$exports).slerp(cameraTransitioner.qRotation.current, cameraTransitioner.qRotation.from, cameraTransitioner.qRotation.to, t);\n        (0, $31054a6c69637582$exports).lerp(cameraTransitioner.vPosition.current, cameraTransitioner.vPosition.from, cameraTransitioner.vPosition.to, t);\n        core.camera.setOrbit(cameraTransitioner.qRotation.current, false);\n        core.camera.setPosition(cameraTransitioner.vPosition.current, false);\n        // disable picking during transitions, as the performance degradation could reduce the framerate\n        core.inputManager.isPickingEnabled = false;\n    };\n    core.updateCallback = (elapsedTime)=>{\n        const { transitionDurations: transitionDurations } = lastPresenterConfig;\n        if (positionTransitioner.isTransitioning) {\n            const t = positionTransitioner.elapse(elapsedTime, transitionDurations.position + transitionDurations.stagger);\n            core.renderer.transitionTime = t;\n            $10880856df36f20b$export$7e9aa6bed81b6dc3(transistion2dOnly, core);\n        } else core.inputManager.isPickingEnabled = true;\n        if (modelTransitioner.isTransitioning) {\n            const tm = modelTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n            if (modelTransitioner.shouldTransition) {\n                (0, $39ece26d1239bb77$exports).slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.from, modelTransitioner.qRotation.to, tm);\n                core.setModelRotation(modelTransitioner.qRotation.current, false);\n            }\n            cam(tm);\n        }\n        if (cameraTransitioner.isTransitioning) {\n            const t = cameraTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n            cam(t);\n        }\n    };\n}\nfunction $10880856df36f20b$export$7e9aa6bed81b6dc3(transistion2dOnly, core) {\n    const t = core.renderer.transitionTime;\n    if (transistion2dOnly) {\n        if (t < 0.5) core.renderer.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).previous;\n        else core.renderer.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).current;\n    } else {\n        if (t <= 0.01) core.renderer.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).previous;\n        else if (t >= 0.99) core.renderer.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).current;\n        else core.renderer.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).none;\n    }\n}\n\n\nfunction $1b83ab2bb6ce8534$export$bd1c7209c525d9d0(ref, prevStage, stage, height, width, preStage, colors, config) {\n    const { qCameraRotation2d: qCameraRotation2d, qCameraRotation3d: qCameraRotation3d, qModelRotation2d: qModelRotation2d, qModelRotation3d: qModelRotation3d, vCameraPosition: vCameraPosition } = (0, $2d7c211c29fc4124$export$504e5adc1166f08a);\n    const { core: core, cameraTransitioner: cameraTransitioner, modelTransitioner: modelTransitioner, positionTransitioner: positionTransitioner } = ref;\n    let transistion2dOnly = false;\n    let cameraTo;\n    let holdCamera;\n    if (config.camera === 'hold') holdCamera = true;\n    else cameraTo = config.camera;\n    if (prevStage && prevStage.view !== stage.view) {\n        modelTransitioner.shouldTransition = !holdCamera;\n        if (stage.view === '2d') {\n            modelTransitioner.qRotation.from = qModelRotation3d;\n            modelTransitioner.qRotation.to = qModelRotation2d;\n            cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d;\n            cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n        } else {\n            modelTransitioner.qRotation.from = qModelRotation2d;\n            modelTransitioner.qRotation.to = qModelRotation3d;\n            cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d;\n            cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n        }\n    } else {\n        modelTransitioner.shouldTransition = false;\n        if (stage.view === '2d') {\n            transistion2dOnly = true;\n            modelTransitioner.qRotation.to = qModelRotation2d;\n            cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d;\n            cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n        } else {\n            modelTransitioner.qRotation.to = qModelRotation3d;\n            cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d;\n            cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n        }\n    }\n    core.camera.getOrbit(cameraTransitioner.qRotation.from);\n    core.camera.getPosition(cameraTransitioner.vPosition.from);\n    if (!prevStage) {\n        core.setModelRotation(modelTransitioner.qRotation.to, false);\n        core.camera.setOrbit(cameraTransitioner.qRotation.to, false);\n        core.camera.setPosition(cameraTransitioner.vPosition.to, false);\n    } else if (!holdCamera) cameraTransitioner.begin();\n    positionTransitioner.begin();\n    if (modelTransitioner.shouldTransition) modelTransitioner.begin();\n    const props = {\n        ref: ref,\n        stage: stage,\n        height: height,\n        width: width,\n        config: config\n    };\n    const cubeLayer = (0, $9241682e5783df33$export$1858923cd0c63ab5)(props);\n    const lineLayer = (0, $7ec432d4679a9501$export$9c2bb35a54d315bd)(props);\n    const textLayer = (0, $ee7c2c84baff3529$export$bbc48f7bb3ba03ac)(props);\n    const { backgroundImages: backgroundImages } = stage;\n    let contentBounds = (0, $36f1cad8963ffaec$export$b1d52f954c5faa57)((0, $36f1cad8963ffaec$export$b1d52f954c5faa57)(cubeLayer === null || cubeLayer === void 0 ? void 0 : cubeLayer.bounds, lineLayer === null || lineLayer === void 0 ? void 0 : lineLayer.bounds), (0, $36f1cad8963ffaec$export$b1d52f954c5faa57)(textLayer === null || textLayer === void 0 ? void 0 : textLayer.bounds, null));\n    backgroundImages === null || backgroundImages === void 0 || backgroundImages.forEach((backgroundImage)=>{\n        contentBounds = (0, $36f1cad8963ffaec$export$b1d52f954c5faa57)(contentBounds, $1b83ab2bb6ce8534$var$convertBounds(backgroundImage.bounds));\n    });\n    props.bounds = contentBounds;\n    core.renderer.previousAxes = core.renderer.currentAxes;\n    const axesLayer = (0, $81bc6306df670951$export$b820fac18d588132)(props);\n    core.config.transitionStaggering = config.transitionDurations.stagger;\n    core.config.transitionDuration = config.transitionDurations.position;\n    let bounds;\n    if (axesLayer && axesLayer.bounds) bounds = axesLayer.bounds;\n    else bounds = contentBounds;\n    ref.setMorphChartsRendererOptions(config.renderer);\n    if (preStage) preStage(stage, cubeLayer);\n    //add images\n    core.renderer.images = [];\n    if (backgroundImages) {\n        const addImage = (imageBounds, imageData)=>{\n            const imageWidth = imageBounds.maxBoundsX - imageBounds.minBoundsX;\n            const imageHeight = imageBounds.maxBoundsY - imageBounds.minBoundsY;\n            const position = [\n                imageBounds.minBoundsX + imageWidth / 2,\n                imageBounds.minBoundsY + imageHeight / 2,\n                0\n            ];\n            const imageQuad = (0, $e8568da1cd4c527e$export$9d5d32bc62ddf581)(core, imageData, contentBounds, position, imageWidth, imageHeight);\n            const imageVisual = core.renderer.createImageVisual(imageQuad);\n            core.renderer.images.push(imageVisual);\n        };\n        const imageDataCache = {};\n        backgroundImages.forEach((backgroundImage)=>{\n            const imageBounds = $1b83ab2bb6ce8534$var$convertBounds(backgroundImage.bounds);\n            const imageData = imageDataCache[backgroundImage.url];\n            if (imageData) addImage(imageBounds, imageData);\n            else (0, $e8568da1cd4c527e$export$d93c68e129326488)(backgroundImage.url).then((imageData)=>{\n                imageDataCache[backgroundImage.url] = imageData;\n                addImage(imageBounds, imageData);\n            });\n        });\n    }\n    //Now call update on each layout\n    $1b83ab2bb6ce8534$var$layersWithSelection(cubeLayer, lineLayer, textLayer, config.layerSelection, bounds, ref.layerStagger);\n    (0, $10880856df36f20b$export$21ad5731ba175a64)(ref, config, stage.view, transistion2dOnly);\n    core.renderer.transitionTime = 0; // Set renderer transition time for this render pass to prevent rendering target buffer for single frame\n    (0, $b85abf0fe2345f80$export$419c579437571e95)(ref, colors);\n    return {\n        bounds: bounds,\n        getCubeLayer: ()=>cubeLayer,\n        update: (layerSelection)=>$1b83ab2bb6ce8534$var$layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds, ref.layerStagger),\n        activate: (id)=>core.renderer.transitionBuffers[0].activeId = id,\n        moveCamera: (camera)=>{\n            if (!(positionTransitioner.isTransitioning || modelTransitioner.isTransitioning)) {\n                core.camera.getOrbit(cameraTransitioner.qRotation.from);\n                core.camera.getPosition(cameraTransitioner.vPosition.from);\n                cameraTransitioner.move(camera.position, camera.rotation);\n            }\n        },\n        setTransitionTimeAxesVisibility: ()=>{\n            (0, $10880856df36f20b$export$7e9aa6bed81b6dc3)(transistion2dOnly, core);\n        }\n    };\n}\nfunction $1b83ab2bb6ce8534$var$layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds, layerStagger) {\n    const layerItems = [\n        {\n            layer: cubeLayer,\n            selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.cubes,\n            stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.cubes\n        },\n        {\n            layer: lineLayer,\n            selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.lines,\n            stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.lines\n        },\n        {\n            layer: textLayer,\n            selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.texts,\n            stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.texts\n        }\n    ];\n    layerItems.forEach((layerItem)=>{\n        var _a;\n        return (_a = layerItem.layer) === null || _a === void 0 ? void 0 : _a.update(bounds, layerItem.selection, layerItem.stagger);\n    });\n}\nfunction $1b83ab2bb6ce8534$var$convertBounds(bounds) {\n    if (!bounds) return;\n    return {\n        minBoundsX: bounds.x1,\n        maxBoundsX: bounds.x2,\n        minBoundsY: -bounds.y2,\n        maxBoundsY: -bounds.y1,\n        minBoundsZ: (0, $a2698ea08ecf5377$export$ce94e349d95a214c),\n        maxBoundsZ: (0, $a2698ea08ecf5377$export$ce94e349d95a214c)\n    };\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $d8003eaa8f8e4cc9$export$9d095798a92180d1(prev, next) {\n    var _a, _b;\n    if (!prev || !next) return true;\n    if (prev.advanced !== next.advanced) return true;\n    if (!prev.advanced) return ((_a = prev.basicOptions) === null || _a === void 0 ? void 0 : _a.antialias) != ((_b = next.basicOptions) === null || _b === void 0 ? void 0 : _b.antialias);\n}\nfunction $d8003eaa8f8e4cc9$export$4aa259f2a0167a49(mcRendererOptions, core) {\n    const advanced = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced;\n    const r = advanced ? new (0, $2d9c5cad0d6d7650$exports).Advanced.Main() : new (0, $2d9c5cad0d6d7650$exports).Basic.Main(mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.basicOptions);\n    core.renderer = r;\n    $d8003eaa8f8e4cc9$export$cfea0671ae41cdf(r, mcRendererOptions);\n    return r;\n}\nfunction $d8003eaa8f8e4cc9$export$cfea0671ae41cdf(renderer, mcRendererOptions) {\n    const o = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advancedOptions;\n    if ((mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced) && o) for(const key in o)renderer.config[key] = o[key];\n}\nfunction $d8003eaa8f8e4cc9$export$12cca049a4826e61(advanced) {\n    const r = advanced ? new (0, $2d9c5cad0d6d7650$exports).Advanced.Main() : new (0, $2d9c5cad0d6d7650$exports).Basic.Main();\n    return r.isSupported;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst $683c1da9288101c3$var$rightButton = 2;\nfunction $683c1da9288101c3$export$63db8d52413993da(core, options) {\n    const { container: container, pickGridCallback: pickGridCallback } = options;\n    const { inputManager: inputManager } = core;\n    if (options.onLasso) inputManager.pickLassoCallback = (result)=>{\n        options.onLasso(result.ids[0], result.manipulator.event);\n    };\n    inputManager.singleTouchAction = (manipulator)=>{\n        if (manipulator.button == $683c1da9288101c3$var$rightButton || manipulator.shiftKey || manipulator.ctrlKey) return (0, $4a6417d29706362f$export$226dc1249c607930).rotate;\n        else if (manipulator.altKey) return (0, $4a6417d29706362f$export$226dc1249c607930).lasso;\n        else return (0, $4a6417d29706362f$export$226dc1249c607930).translate;\n    };\n    inputManager.pickAxesGridCallback = ({ divisionX: divisionX, divisionY: divisionY, divisionZ: divisionZ, manipulator: manipulator })=>{\n        clearClickTimeout();\n        const { altKey: altKey, button: button, shiftKey: shiftKey } = manipulator;\n        const me = {\n            altKey: altKey,\n            shiftKey: shiftKey,\n            button: button\n        };\n        const e = me;\n        pickGridCallback([\n            divisionX,\n            divisionY,\n            divisionZ\n        ], e);\n    };\n    const canvas = container.getElementsByTagName('canvas')[0];\n    let pickedId;\n    const hover = (e)=>{\n        if (core.renderer.pickedId !== pickedId) {\n            pickedId = core.renderer.pickedId;\n            const ordinal = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n            options.onCubeHover(e, ordinal);\n        }\n    };\n    canvas.addEventListener('mousemove', (e)=>{\n        clearClickTimeout();\n        if (mousedown) options.onCubeHover(e, null);\n        hover(e);\n    });\n    canvas.addEventListener('mouseout', hover);\n    canvas.addEventListener('mouseover', hover);\n    let mousedown;\n    canvas.addEventListener('mousedown', ()=>{\n        mousedown = true;\n    });\n    canvas.addEventListener('mouseup', (e)=>{\n        mousedown = false;\n    });\n    let canvasClickTimeout;\n    const clearClickTimeout = ()=>{\n        clearTimeout(canvasClickTimeout);\n        canvasClickTimeout = null;\n    };\n    canvas.addEventListener('click', (e)=>{\n        canvasClickTimeout = setTimeout(()=>{\n            options.onCanvasClick(e);\n        }, 50);\n    });\n    inputManager.pickItemCallback = ({ manipulator: manipulator })=>{\n        clearClickTimeout();\n        const ordinal = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n        options.onCubeClick(manipulator.event, ordinal);\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $330562a1521921df$export$b1a09cb1b71f86aa(t) {\n    return t * t * t;\n}\nfunction $330562a1521921df$export$68d528839c701b6(t) {\n    return --t * t * t + 1;\n}\nfunction $330562a1521921df$export$89238d3bc79d3ada(t) {\n    return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n\n\nfunction $b5dc14ede53105b0$export$24c5ac7c37452e7d(t) {\n    if (t === 0 || t === 1) return t;\n    return (0, $330562a1521921df$export$89238d3bc79d3ada)(t);\n}\n\n\nclass $94a3b4c744fcf3db$export$935eb9f0b5d28fbb {\n    constructor(){\n        this.isTransitioning = false;\n    }\n    begin() {\n        this.isTransitioning = true;\n        this.time = 0;\n    }\n    elapse(elapsedTime, totalTime, ease = false) {\n        this.time += elapsedTime;\n        if (this.time >= totalTime) {\n            this.isTransitioning = false;\n            this.time = totalTime;\n            this.ended && this.ended();\n        }\n        const t = this.time / totalTime;\n        return ease ? (0, $b5dc14ede53105b0$export$24c5ac7c37452e7d)(t) : t;\n    }\n}\nclass $94a3b4c744fcf3db$export$8498d8ad19b48a8b extends $94a3b4c744fcf3db$export$935eb9f0b5d28fbb {\n    constructor(){\n        super();\n        this.qRotation = {\n            from: (0, $39ece26d1239bb77$exports).create(),\n            to: null,\n            current: (0, $39ece26d1239bb77$exports).create()\n        };\n        this.vPosition = {\n            from: (0, $31054a6c69637582$exports).create(),\n            to: null,\n            current: (0, $31054a6c69637582$exports).create()\n        };\n    }\n    move(position, rotation) {\n        this.begin();\n        this.qRotation.to = rotation;\n        this.vPosition.to = position;\n    }\n}\nclass $94a3b4c744fcf3db$export$e4008bc37533ca62 extends $94a3b4c744fcf3db$export$935eb9f0b5d28fbb {\n    constructor(){\n        super();\n        this.shouldTransition = false;\n        this.qRotation = {\n            from: null,\n            to: null,\n            current: (0, $39ece26d1239bb77$exports).create()\n        };\n    }\n}\n\n\nfunction $77dc6121b64606a8$export$2cd8252107eb640b(options, mcRendererOptions) {\n    const { container: container } = options;\n    const core = new (0, $4a6417d29706362f$export$4143ab5b91744744)({\n        container: container\n    });\n    (0, $d8003eaa8f8e4cc9$export$4aa259f2a0167a49)(mcRendererOptions, core);\n    (0, $683c1da9288101c3$export$63db8d52413993da)(core, options);\n    core.config.pickSelectDelay = 50;\n    const cameraTransitioner = new (0, $94a3b4c744fcf3db$export$8498d8ad19b48a8b)();\n    const modelTransitioner = new (0, $94a3b4c744fcf3db$export$e4008bc37533ca62)();\n    const positionTransitioner = new (0, $94a3b4c744fcf3db$export$935eb9f0b5d28fbb)();\n    positionTransitioner.ended = ()=>{\n        core.renderer.axesVisibility = (0, $4a6417d29706362f$export$7dbc7c2b82487e42).current;\n    };\n    const ref = {\n        supportedRenders: {\n            advanced: (0, $d8003eaa8f8e4cc9$export$12cca049a4826e61)(true),\n            basic: (0, $d8003eaa8f8e4cc9$export$12cca049a4826e61)(false)\n        },\n        reset: null,\n        cameraTransitioner: cameraTransitioner,\n        modelTransitioner: modelTransitioner,\n        positionTransitioner: positionTransitioner,\n        core: core,\n        setMorphChartsRendererOptions (mcRendererOptions) {\n            if ((0, $d8003eaa8f8e4cc9$export$9d095798a92180d1)(ref.lastMorphChartsRendererOptions, mcRendererOptions)) {\n                (0, $d8003eaa8f8e4cc9$export$4aa259f2a0167a49)(mcRendererOptions, core);\n                (0, $683c1da9288101c3$export$63db8d52413993da)(core, options);\n            } else if (mcRendererOptions.advanced) //same renderer, poke the config\n            (0, $d8003eaa8f8e4cc9$export$cfea0671ae41cdf)(core.renderer, mcRendererOptions);\n            ref.lastMorphChartsRendererOptions = mcRendererOptions;\n        },\n        lastMorphChartsRendererOptions: mcRendererOptions,\n        layerStagger: {}\n    };\n    return ref;\n}\n\n\n\n\nclass $6dfc103fcb41a0e6$export$893c88c42e3630f9 {\n    /**\n     * Get the previously rendered Stage object.\n     */ get stage() {\n        return this._last.stage;\n    }\n    /**\n     * Get the current View camera type.\n     */ get view() {\n        return this._last.view;\n    }\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */ constructor(el, style){\n        this.el = el;\n        this.style = (0, $97d77b6293df43c2$export$6969335ea1e4e77c)((0, $a2698ea08ecf5377$export$83ac8f5ae8122afc), style);\n        (0, $a1265428470a4521$export$ba5a93ad8642dce4)(this);\n        this._last = {\n            view: null,\n            height: null,\n            width: null,\n            cubeCount: null,\n            stage: null\n        };\n    }\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */ animationCancel() {\n        if (this.animationTimer) {\n            clearTimeout(this.animationTimer);\n            this.animationTimer = null;\n            if (this.logger) this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || 'handler'}`);\n            if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) this.queuedAnimationOptions.animationCanceled.call(null);\n        }\n    }\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */ animationQueue(handler, timeout, options) {\n        if (this.logger) this.logger(`queueing animation ${options && options.waitingLabel || 'waiting'}...(${timeout})`);\n        this.animationCancel();\n        this.animationTimer = setTimeout(()=>{\n            if (this.logger) this.logger(`queueing animation ${options && options.handlerLabel || 'handler'}...`);\n            handler();\n        }, timeout);\n    }\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */ getElement(type) {\n        const elements = this.el.getElementsByClassName((0, $a1265428470a4521$export$2913c0c0b5623090)(type, this));\n        if (elements && elements.length) return elements[0];\n    }\n    /**\n     * Present the Vega Scene, or Stage object using Morphcharts.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area.\n     * @param config Optional presentation configuration object.\n     */ present(sceneOrStage, height, width, config) {\n        this.animationCancel();\n        const scene = sceneOrStage;\n        let stage;\n        const options = {\n            maxOrdinal: 0,\n            currAxis: null,\n            defaultCubeColor: this.style.defaultCubeColor,\n            assignCubeOrdinal: config && config.onSceneRectAssignCubeOrdinal || (()=>options.maxOrdinal++),\n            modifyAxis: (config === null || config === void 0 ? void 0 : config.onAxisItem) ? config.onAxisItem : (0, $a2698ea08ecf5377$export$f66a5ef821fcc5df),\n            zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n        };\n        //determine if this is a vega scene\n        if (scene.marktype) {\n            stage = (0, $a2698ea08ecf5377$export$afa8810fbe5c2601)(scene.view);\n            (0, $684c20b0d21986c1$export$d78988dba6734aaa)(options, stage, scene);\n        } else stage = sceneOrStage;\n        const c = (0, $97d77b6293df43c2$export$6969335ea1e4e77c)((0, $a2698ea08ecf5377$export$200f593236aebbdc), config);\n        if (!this.morphchartsref) {\n            this._morphChartsOptions = {\n                container: this.getElement((0, $57337365aaceccbe$export$79420be32f83a5b0).gl),\n                pickGridCallback: c.axisPickGridCallback,\n                onCubeHover: (e, ordinal)=>{\n                    c.onCubeHover(e, {\n                        ordinal: ordinal,\n                        color: null,\n                        position: null,\n                        size: null\n                    });\n                },\n                onCubeClick: (e, ordinal)=>{\n                    c.onCubeClick(e, {\n                        ordinal: ordinal,\n                        color: null,\n                        position: null,\n                        size: null\n                    });\n                },\n                onCanvasClick: config === null || config === void 0 ? void 0 : config.onLayerClick,\n                onLasso: config === null || config === void 0 ? void 0 : config.onLasso\n            };\n            this.morphchartsref = (0, $77dc6121b64606a8$export$2cd8252107eb640b)(this._morphChartsOptions, c.renderer || (0, $a2698ea08ecf5377$export$200f593236aebbdc).renderer);\n        }\n        let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n        if (options.maxOrdinal) {\n            cubeCount = Math.max(cubeCount, options.maxOrdinal);\n            const empty = {\n                isEmpty: true\n            };\n            stage.cubeData = (0, $532135db04b63f4f$export$9a79ca9001afcc6d)(cubeCount, empty, stage.cubeData);\n        }\n        config.preLayer && config.preLayer(stage);\n        this.morphChartsRenderResult = (0, $1b83ab2bb6ce8534$export$bd1c7209c525d9d0)(this.morphchartsref, this._last.stage, stage, height, width, config && config.preStage, config && config.morphChartsColors, c);\n        delete stage.cubeData;\n        delete stage.redraw;\n        this._last = {\n            cubeCount: cubeCount,\n            height: height,\n            width: width,\n            stage: stage,\n            view: stage.view\n        };\n        const a = (0, $fe86f88c0c9aea93$export$5ec2c407fb44f02)();\n        (0, $fe86f88c0c9aea93$export$186d02efde07ef98)((0, $93b302f28dcf836b$export$b0b33bcc0f604685)({\n            legend: stage.legend,\n            onClick: config && config.onLegendClick\n        }), this.getElement((0, $57337365aaceccbe$export$79420be32f83a5b0).legend));\n        (0, $fe86f88c0c9aea93$export$7d007ff58288f238)(a);\n        if (config && config.onPresent) config.onPresent();\n    }\n    canvasToDataURL() {\n        return new Promise((resolve, reject)=>{\n            this.morphchartsref.core.afterRenderCallback = ()=>{\n                this.morphchartsref.core.afterRenderCallback = null;\n                const canvas = this.getElement((0, $57337365aaceccbe$export$79420be32f83a5b0).gl).getElementsByTagName('canvas')[0];\n                const png = canvas.toDataURL('image/png');\n                resolve(png);\n            };\n        });\n    }\n    configColors(mcColors) {\n        (0, $b85abf0fe2345f80$export$419c579437571e95)(this.morphchartsref, mcColors);\n    }\n    /**\n     * Home the camera to the last initial position.\n     */ homeCamera() {\n        var _a;\n        (_a = this.morphchartsref) === null || _a === void 0 || _a.reset();\n    }\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */ showGuides() {\n        this.getElement((0, $57337365aaceccbe$export$79420be32f83a5b0).gl).classList.add('show-center');\n    //TODO Morphcharts gridlines\n    }\n    finalize() {\n        this.animationCancel();\n        if (this.morphchartsref) this.morphchartsref.core.stop();\n        if (this.el) this.el.innerHTML = '';\n        this._last = null;\n        this.morphchartsref = null;\n        this.el = null;\n        this.logger = null;\n        this.queuedAnimationOptions = null;\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n//pass in the SuperClass, which should be a vega.View\nfunction $c4d8d05347e8dad9$var$_RendererGl(loader) {\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class RendererGlInternal extends (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.Renderer {\n        initialize(el, width, height, origin) {\n            this.height = height;\n            this.width = width;\n            // this method will invoke resize to size the canvas appropriately\n            return super.initialize(el, width, height, origin);\n        }\n        resize(width, height, origin) {\n            super.resize(width, height, origin);\n            this.origin = origin;\n            this.height = height;\n            this.width = width;\n            //rteturn this for vega\n            return this;\n        }\n        _render(scene, items) {\n            const scene3d = scene;\n            scene3d.view = this.getView();\n            this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n            //return this for vega\n            return this;\n        }\n    }\n    const instance = new RendererGlInternal(loader);\n    return instance;\n}\nconst $c4d8d05347e8dad9$export$ca9a02b0553384e7 = $c4d8d05347e8dad9$var$_RendererGl;\n\n\nlet $51fbad27d38c01a6$var$registered = false;\n//dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n//pass in the SuperClass, which should be a vega.View\nfunction $51fbad27d38c01a6$var$_ViewGl(runtime, config) {\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class ViewGlInternal extends (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.View {\n        constructor(runtime, config = {}){\n            super(runtime, config);\n            this.config = config;\n            this.presenter = config.presenter;\n            config.presenterConfig = config.presenterConfig || {};\n            config.presenterConfig.redraw = ()=>{\n                this._redraw = true; //use Vega View private member _redraw\n                this.run();\n            };\n        }\n        renderer(...args) {\n            if (args && args.length) {\n                const renderer = args[0];\n                if (renderer === 'morphcharts' && !$51fbad27d38c01a6$var$registered) {\n                    (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.renderModule('morphcharts', {\n                        handler: (0, $94b078fc391e7135$export$e2253033e6e1df16).vega.CanvasHandler,\n                        renderer: (0, $c4d8d05347e8dad9$export$ca9a02b0553384e7)\n                    });\n                    $51fbad27d38c01a6$var$registered = true;\n                }\n                return super.renderer(renderer);\n            } else return super.renderer();\n        }\n        initialize(el) {\n            if (!this.presenter) this.presenter = new (0, $6dfc103fcb41a0e6$export$893c88c42e3630f9)(el);\n            super.initialize(this.presenter.getElement((0, $57337365aaceccbe$export$79420be32f83a5b0).vegaControls));\n            const renderer = this._renderer;\n            renderer.presenterConfig = this.config.presenterConfig;\n            renderer.presenter = this.presenter;\n            renderer.getView = this.config && this.config.getView || (()=>this.presenter.view || (0, $a2698ea08ecf5377$export$93acc5219d6538bb));\n            return this;\n        }\n        error(e) {\n            if (this.presenter.logger) this.presenter.logger(e);\n        }\n    }\n    const instance = new ViewGlInternal(runtime, config);\n    return instance;\n}\nconst $51fbad27d38c01a6$export$6d8f9057dcd7f9e6 = $51fbad27d38c01a6$var$_ViewGl;\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $f6508cfd53d266a5$export$83d89fbfd8236492 = '1.0.6';\n\n\n$parcel$exportWildcard($e296aaf527fc4d25$exports, $57337365aaceccbe$exports);\n\n\nconst { defaultPresenterStyle: $16f9e3e56a5dcd59$var$defaultPresenterStyle } = $a2698ea08ecf5377$exports;\nconst $16f9e3e56a5dcd59$export$fb736e4909afb3d7 = {\n    colors: {\n        activeCube: 'purple',\n        defaultCube: $c5578f8838abba3d$exports.colorToString($16f9e3e56a5dcd59$var$defaultPresenterStyle.defaultCubeColor),\n        hoveredCube: $c5578f8838abba3d$exports.colorToString($16f9e3e56a5dcd59$var$defaultPresenterStyle.highlightColor),\n        selectedCube: 'yellow',\n        axisSelectHighlight: $c5578f8838abba3d$exports.colorToString([\n            128,\n            128,\n            128,\n            128\n        ]),\n        axisLine: '#000',\n        axisText: '#000',\n        gridLine: '#CCC',\n        backgroundColor: '#FFF'\n    },\n    language: {\n        headers: {\n            chart: 'Chart',\n            details: 'Details',\n            legend: 'Legend',\n            selection: 'Select & Filter'\n        },\n        bing: 'bing',\n        newColorMap: 'remap color to filtered items',\n        oldColorMap: 'keep same colors',\n        deselect: 'deselect',\n        exclude: 'exclude',\n        isolate: 'isolate',\n        legendOther: 'other',\n        nextDetail: '>',\n        previousDetail: '<',\n        reset: 'reset',\n        colorBinCount: 'Color bin count',\n        colorReverse: 'Color reverse',\n        count: 'Count',\n        percent: 'Percent',\n        sum: 'Sum',\n        scatterPointScale: 'Point scale',\n        FacetMaxBins: 'Facet max bins',\n        FacetVMaxBins: 'Cross facet max bins',\n        XMaxBins: 'X axis max bins',\n        YMaxBins: 'Y axis max bins',\n        XGridSize: 'X grid size',\n        YGridSize: 'Y grid size',\n        InnerPaddingSize: 'Inner padding size',\n        OuterPaddingSize: 'Outer padding size',\n        treeMapMethod: 'Treemap layout',\n        facetColumns: 'Facet columns',\n        facetRows: 'Facet rows',\n        markOpacitySignal: 'Mark opacity',\n        textScaleSignal: 'Text scale',\n        xAxisTextAngleSignal: 'X axis text angle',\n        yAxisTextAngleSignal: 'Y axis text angle',\n        zGrounded: 'Z grounded',\n        zScaleProportion: 'Z scale proportion to Y',\n        selectionCount: (count)=>`${count} items selected`\n    },\n    maxLegends: 19,\n    onError: (errors)=>{\n    //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n    },\n    filterRenderingTimerPadding: 200,\n    selectionPolygonZ: -1,\n    tickSize: 10\n};\nfunction $16f9e3e56a5dcd59$export$c4db461e5e345a8(options) {\n    const style = {\n        cssPrefix: $16f9e3e56a5dcd59$export$f0d47e1c119d5bf2,\n        fontFamily: options.fontFamily,\n        defaultCubeColor: $c5578f8838abba3d$exports.colorFromString(options.colors.defaultCube)\n    };\n    if (options.colors.hoveredCube) style.highlightColor = $c5578f8838abba3d$exports.colorFromString(options.colors.hoveredCube);\n    //if (options.lightSettings) {\n    // style.lightSettings = options.lightSettings;\n    //}\n    return style;\n}\nconst $16f9e3e56a5dcd59$export$f0d47e1c119d5bf2 = 'sanddance-';\nconst $16f9e3e56a5dcd59$export$1641cdccd8d44edd = {\n    black: '#212121',\n    gray: '#D2D2D2',\n    blue: '#0060F0',\n    green: '#00C000',\n    orange: '#FF9900',\n    red: '#E00000'\n};\n\n\nfunction $048ba25c9a3f4065$export$81adea670bebefbe(columnName, includeVegaMorphChartsFields = false) {\n    if (includeVegaMorphChartsFields) {\n        if (columnName === (0, $44b8bb162b63b5b5$export$5672246984822a29)) return true;\n    }\n    for(const f in 0, $8d0624e259fe9d79$export$10df5429b7082be2){\n        if (columnName === (0, $8d0624e259fe9d79$export$10df5429b7082be2)[f]) return true;\n    }\n    return false;\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nconst $1f9940ddae6f4302$var$dualPairs = [\n    [\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).black,\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).gray\n    ],\n    [\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).red,\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).green\n    ],\n    [\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).red,\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).blue\n    ],\n    [\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).black,\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).red\n    ],\n    [\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).black,\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).orange\n    ],\n    [\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).black,\n        (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd).green\n    ]\n];\nconst $1f9940ddae6f4302$export$2ad73d393c16f81c = [\n    {\n        scheme: (0, $8d0624e259fe9d79$export$c991c3dd58d9959c),\n        colors: [\n            (0, $16f9e3e56a5dcd59$export$fb736e4909afb3d7).colors.defaultCube\n        ]\n    }\n];\n$1f9940ddae6f4302$var$createDualColorSchemes();\nfunction $1f9940ddae6f4302$export$3030070885af9365(vega) {\n    $1f9940ddae6f4302$export$2ad73d393c16f81c.forEach((cs)=>{\n        if (cs.colors.length === 1) vega.scheme(cs.scheme, (x)=>cs.colors[0]);\n        else vega.scheme(cs.scheme, cs.colors);\n    });\n}\nfunction $1f9940ddae6f4302$var$createPair(names, colors) {\n    const scheme = `dual_${names[0]}${names[1]}`;\n    $1f9940ddae6f4302$export$2ad73d393c16f81c.push({\n        scheme: scheme,\n        colors: colors\n    });\n}\nfunction $1f9940ddae6f4302$var$createDualColorSchemes() {\n    $1f9940ddae6f4302$var$dualPairs.forEach((colors)=>{\n        const names = colors.map((color)=>{\n            for(const key in 0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd)if (color === (0, $16f9e3e56a5dcd59$export$1641cdccd8d44edd)[key]) return key;\n        });\n        $1f9940ddae6f4302$var$createPair(names, colors);\n        $1f9940ddae6f4302$var$createPair([\n            ...names\n        ].reverse(), [\n            ...colors\n        ].reverse());\n    });\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $6b115708bb157a7f$export$d9e571576e98a7ab;\n(function(DataLayoutChange) {\n    DataLayoutChange[DataLayoutChange[\"same\"] = 0] = \"same\";\n    DataLayoutChange[DataLayoutChange[\"reset\"] = 1] = \"reset\";\n    DataLayoutChange[DataLayoutChange[\"refine\"] = 2] = \"refine\";\n})($6b115708bb157a7f$export$d9e571576e98a7ab || ($6b115708bb157a7f$export$d9e571576e98a7ab = {}));\nclass $6b115708bb157a7f$export$c774d8c9d4e9e234 {\n    constructor(dataScope, props){\n        this.dataScope = dataScope;\n        this.props = props;\n    }\n    select(search) {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.select(search);\n            this.props.onDataChanged($6b115708bb157a7f$export$d9e571576e98a7ab.same);\n            resolve();\n        });\n    }\n    deselect() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deselect();\n            this.props.onDataChanged($6b115708bb157a7f$export$d9e571576e98a7ab.same);\n            resolve();\n        });\n    }\n    filter(search, keepData, collapseData, rebase) {\n        if (rebase) this.dataScope.collapse(false, keepData);\n        this.dataScope.collapse(true, collapseData);\n        return new Promise((resolve, reject)=>{\n            this.props.onAnimateDataChange($6b115708bb157a7f$export$d9e571576e98a7ab.refine, 'before refine', 'refine').then(()=>{\n                this.dataScope.deselect();\n                this.dataScope.setFilteredData(keepData);\n                this.props.onDataChanged($6b115708bb157a7f$export$d9e571576e98a7ab.refine, search);\n                resolve();\n            }).catch(reject);\n        });\n    }\n    reset() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deselect();\n            let time;\n            if (!this.dataScope.hasFilteredData()) time = 0;\n            else this.dataScope.setFilteredData(null);\n            this.props.onAnimateDataChange($6b115708bb157a7f$export$d9e571576e98a7ab.reset, 'before reset', 'reset', time).then(()=>{\n                this.dataScope.collapse(false);\n                this.props.onDataChanged($6b115708bb157a7f$export$d9e571576e98a7ab.reset);\n                resolve();\n            }).catch(reject);\n        });\n    }\n    activate(datum) {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.activate(datum);\n            this.props.onDataChanged($6b115708bb157a7f$export$d9e571576e98a7ab.same);\n            resolve();\n        });\n    }\n    deactivate() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deactivate();\n            this.props.onDataChanged($6b115708bb157a7f$export$d9e571576e98a7ab.same);\n            resolve();\n        });\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $e4e496e11632ad2b$export$cb7265fd11709ea(niceValue) {\n    //convert \"nice\" numbers to numeric value\n    return (niceValue + '').replace(/[\\s,]/g, '');\n}\nfunction $e4e496e11632ad2b$var$tickValue(axis, i) {\n    const tick = axis.tickText[i];\n    let value;\n    if (tick) value = axis.tickText[i].value;\n    return {\n        tick: tick,\n        value: value\n    };\n}\nfunction $e4e496e11632ad2b$export$1be0843eea5393e4(column) {\n    const searchExpression = {\n        name: column.name,\n        operator: 'isnullorEmpty'\n    };\n    return searchExpression;\n}\nfunction $e4e496e11632ad2b$export$8543b98d22318eca(column, value) {\n    if (value == null) return $e4e496e11632ad2b$export$1be0843eea5393e4(column);\n    const searchExpression = {\n        name: column.name,\n        operator: '==',\n        value: value\n    };\n    return searchExpression;\n}\nfunction $e4e496e11632ad2b$export$e531b549585c011c(column, values) {\n    const expressions = values.map((value, i)=>{\n        const searchExpression = {\n            name: column.name,\n            operator: '!=',\n            value: value\n        };\n        if (i) searchExpression.clause = '&&';\n        return searchExpression;\n    });\n    const searchExpressionGroup = {\n        expressions: expressions\n    };\n    return searchExpressionGroup;\n}\nfunction $e4e496e11632ad2b$export$64b81e116b959f8a(axis, column, i) {\n    const result = $e4e496e11632ad2b$var$tickValue(axis, i);\n    if (result.tick) return $e4e496e11632ad2b$export$8543b98d22318eca(column, result.value);\n}\nfunction $e4e496e11632ad2b$export$8bb38a473c12645e(column, lowValue, highValue, lowOperator = '>=', highOperator = '<') {\n    const expressions = [];\n    if (lowValue !== undefined) expressions.push({\n        name: column.name,\n        operator: lowOperator,\n        value: lowValue\n    });\n    if (highValue !== undefined) expressions.push({\n        name: column.name,\n        operator: highOperator,\n        value: highValue\n    });\n    if (expressions.length > 1) expressions[1].clause = '&&';\n    const searchExpressionGroup = {\n        expressions: expressions\n    };\n    return searchExpressionGroup;\n}\nfunction $e4e496e11632ad2b$export$80908cccce4a97cb(axis, column, i) {\n    const low = $e4e496e11632ad2b$var$tickValue(axis, i);\n    const high = $e4e496e11632ad2b$var$tickValue(axis, i + 1);\n    return $e4e496e11632ad2b$export$8bb38a473c12645e(column, low.value, high.value);\n}\n\n\nconst $a696a51a900f8bbc$var$dimToRole = {\n    0: 'x',\n    1: 'y',\n    2: 'z'\n};\nconst $a696a51a900f8bbc$var$roleToDim = {\n    x: 0,\n    y: 1,\n    z: 1\n};\nclass $a696a51a900f8bbc$export$b4d41fd4fcc19c {\n    constructor(specCapabilities, columns, stage){\n        this.specCapabilities = specCapabilities;\n        this.columns = columns;\n        this.stage = stage;\n    }\n    convert(divisions) {\n        const searchRoles = [];\n        divisions.forEach((division, i)=>{\n            const role = $a696a51a900f8bbc$var$dimToRole[i];\n            const axes = this.stage.axes[role];\n            //all axes in a faceted chart should be the same\n            const axis = axes.filter((axis)=>axis.tickText.length)[0];\n            if (axis) {\n                const capabilities = this.specCapabilities.roles.filter((r)=>r.role === role)[0];\n                const column = this.columns[role];\n                if (division >= 0 && (capabilities === null || capabilities === void 0 ? void 0 : capabilities.axisSelection)) searchRoles.push({\n                    axis: axis,\n                    role: role,\n                    capabilities: capabilities,\n                    column: column,\n                    division: division\n                });\n            }\n        });\n        switch(searchRoles.length){\n            case 0:\n                return null;\n            case 1:\n                return this.getSearchFromSearchRole(searchRoles[0]);\n            default:\n                {\n                    const roles = searchRoles.map((searchRole)=>this.getSearchFromSearchRole(searchRole));\n                    roles.forEach((role, i)=>{\n                        if (i === 0) return;\n                        role.clause = '&&';\n                    });\n                    return roles;\n                }\n        }\n    }\n    getSearchFromSearchRole(searchRole) {\n        const getSearch = searchRole.capabilities.axisSelection === 'exact' ? (a, c, i)=>({\n                expressions: [\n                    (0, $e4e496e11632ad2b$export$64b81e116b959f8a)(a, c, i)\n                ]\n            }) : (0, $e4e496e11632ad2b$export$80908cccce4a97cb);\n        const { axis: axis, column: column, division: division } = searchRole;\n        return getSearch(axis, column, division);\n    }\n}\nfunction $a696a51a900f8bbc$export$abaa25886c91cb0e(axes) {\n    axes.forEach((axis)=>{\n        if (axis.ticks.length === 0) return;\n        const dim = $a696a51a900f8bbc$var$roleToDim[axis.axisRole];\n        const { color: color } = axis.ticks[0];\n        const newLine = (value)=>{\n            const line = {\n                sourcePosition: [\n                    0,\n                    0,\n                    0\n                ],\n                targetPosition: [\n                    0,\n                    0,\n                    0\n                ],\n                color: color\n            };\n            line.sourcePosition[dim] = value;\n            return line;\n        };\n        const newTicks = [];\n        newTicks.push(newLine(axis.domain.sourcePosition[dim]));\n        for(let i = 1; i < axis.ticks.length; i++)newTicks.push(newLine((axis.ticks[i].sourcePosition[dim] + axis.ticks[i - 1].sourcePosition[dim]) / 2));\n        newTicks.push(newLine(axis.domain.targetPosition[dim]));\n        axis.ticks = newTicks;\n    });\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $d862cbedfe5e328a$export$44addeff9a96c1e7(colorContext, presenter) {\n    if (!colorContext.colorMap) colorContext.colorMap = presenter.morphChartsRenderResult.getCubeLayer().unitColorMap;\n    colorContext.legend = $c5578f8838abba3d$exports.clone(presenter.stage.legend);\n    colorContext.legendElement = presenter.getElement($57337365aaceccbe$export$79420be32f83a5b0.legend).children[0];\n}\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\nclass $298086c83cbc7842$export$3fb74a6ae4f1171d {\n    constructor(){\n        this.filteredColumnsStats = {};\n    }\n    setData(data, columns) {\n        const differentData = this.data !== data;\n        if (differentData) {\n            if (this.data) //clean up things we added to old data\n            this.deselect();\n            this.data = data;\n            this.columns = columns;\n            this.filteredData = null;\n            this.filteredColumnsStats = {};\n        }\n        return differentData;\n    }\n    setFilteredData(filteredData) {\n        this.filteredData = filteredData;\n        this.filteredColumnsStats = {};\n    }\n    getColumns(columnTypes) {\n        if (!this.columns) this.columns = (0, $15b363a2e3ff0bb7$export$3f19ad07848df794)($94b078fc391e7135$export$e2253033e6e1df16.vega.inferTypes, this.data, columnTypes);\n        return this.columns;\n    }\n    getFilteredColumnStats(columnName) {\n        if (!this.filteredColumnsStats[columnName]) this.filteredColumnsStats[columnName] = (0, $8e54999951217c95$export$432f698644f45d1)(this.filteredData, this.columns.filter((c)=>c.name === columnName)[0]);\n        return this.filteredColumnsStats[columnName];\n    }\n    currentData() {\n        return this.filteredData || this.data;\n    }\n    select(search) {\n        this.deselect();\n        if (search) {\n            this.selection = this.createUserSelection(search, true, false);\n            if (this.selection.included.length) this.activate(this.selection.included[0]);\n        }\n    }\n    createUserSelection(search, assign, rebase) {\n        const exec = new (0, $60ec9c9c9a132a89$export$bbfd672d43392844)(search, this.getColumns());\n        const s = {\n            search: search,\n            included: [],\n            excluded: []\n        };\n        const data = rebase ? this.data : this.currentData();\n        data.forEach((datum)=>{\n            if (exec.run(datum)) {\n                if (assign) datum[(0, $8d0624e259fe9d79$export$10df5429b7082be2).Selected] = true;\n                s.included.push(datum);\n            } else s.excluded.push(datum);\n        });\n        return s;\n    }\n    deselect() {\n        this.deactivate();\n        this.data.forEach((datum)=>{\n            delete datum[(0, $8d0624e259fe9d79$export$10df5429b7082be2).Selected];\n        });\n        this.selection = null;\n    }\n    hasFilteredData() {\n        return !!this.filteredData;\n    }\n    hasSelectedData() {\n        return !!this.selection;\n    }\n    collapse(collapsed, data = this.data) {\n        data.forEach((datum)=>{\n            datum[(0, $8d0624e259fe9d79$export$10df5429b7082be2).Collapsed] = collapsed;\n        });\n        this.isCollapsed = collapsed;\n    }\n    activate(datum) {\n        this.deactivate();\n        datum[(0, $8d0624e259fe9d79$export$10df5429b7082be2).Active] = true;\n        this.active = datum;\n    }\n    deactivate() {\n        if (this.active) delete this.active[(0, $8d0624e259fe9d79$export$10df5429b7082be2).Active];\n        this.active = null;\n    }\n    ordinalIndexWithinSelection(ordinal) {\n        if (this.selection) for(let i = 0; i < this.selection.included.length; i++){\n            const datum = this.selection.included[i];\n            if (datum[0, $44b8bb162b63b5b5$export$5672246984822a29] === ordinal) return {\n                datum: datum,\n                index: i\n            };\n        }\n        return {\n            datum: null,\n            index: -1\n        };\n    }\n    finalize() {\n        this.data = null;\n        this.filteredData = null;\n        this.filteredColumnsStats = null;\n        if (this.selection) {\n            this.selection.excluded = null;\n            this.selection.included = null;\n            this.selection = null;\n        }\n    }\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\nvar $f701b9e6e9858c3b$var$Action;\n(function(Action) {\n    Action[Action[\"deselect\"] = 0] = \"deselect\";\n    Action[Action[\"isolate\"] = 1] = \"isolate\";\n    Action[Action[\"exclude\"] = 2] = \"exclude\";\n    Action[Action[\"reset\"] = 3] = \"reset\";\n    Action[Action[\"next\"] = 4] = \"next\";\n    Action[Action[\"previous\"] = 5] = \"previous\";\n})($f701b9e6e9858c3b$var$Action || ($f701b9e6e9858c3b$var$Action = {}));\nclass $f701b9e6e9858c3b$export$3e8048d3cf2ba3fd {\n    constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps){\n        this.language = language;\n        this.animator = animator;\n        this.dataScope = dataScope;\n        this.colorMapHandler = colorMapHandler;\n        this.hasColorMaps = hasColorMaps;\n        this.element = (0, $c5578f8838abba3d$exports).addDiv(parentElement, `${(0, $16f9e3e56a5dcd59$export$f0d47e1c119d5bf2)}unitControls`);\n        this.clear();\n    }\n    finalize() {\n        if (this.element) this.element.innerHTML = '';\n        this.dataScope = null;\n        this.element = null;\n    }\n    clear() {\n        this.state = {\n            userSelection: null,\n            index: -1,\n            remapColor: false\n        };\n        this.render();\n    }\n    clearSelection() {\n        this.state.userSelection = null;\n        this.state.index = -1;\n        this.render();\n    }\n    populate(userSelection, index = 0) {\n        this.state.userSelection = userSelection;\n        this.state.index = index;\n        this.render();\n    }\n    selectByNameValue(columnName, value) {\n        const search = {\n            name: columnName,\n            operator: '==',\n            value: value\n        };\n        this.clearSelection();\n        this.animator.select(search);\n        this.populate(this.dataScope.selection);\n    }\n    remapChanged(remap) {\n        this.state.remapColor = remap;\n        this.colorMapHandler(remap);\n        this.render();\n    }\n    handleAction(action) {\n        let p;\n        const u = this.state.userSelection;\n        switch(action){\n            case $f701b9e6e9858c3b$var$Action.deselect:\n                this.clearSelection();\n                p = this.animator.deselect();\n                break;\n            case $f701b9e6e9858c3b$var$Action.exclude:\n                this.clearSelection();\n                p = this.animator.filter((0, $b144ef381004fc94$export$6897c284b6f9f4dc)(u.search), u.excluded, u.included, false);\n                this.state.remapColor = false;\n                break;\n            case $f701b9e6e9858c3b$var$Action.isolate:\n                this.clearSelection();\n                p = this.animator.filter(u.search, u.included, u.excluded, false);\n                this.state.remapColor = false;\n                break;\n            case $f701b9e6e9858c3b$var$Action.reset:\n                this.clear();\n                p = this.animator.reset();\n                break;\n            default:\n                switch(action){\n                    case $f701b9e6e9858c3b$var$Action.previous:\n                        this.state.index--;\n                        if (this.state.index < 0) this.state.index = this.state.userSelection.included.length - 1;\n                        break;\n                    case $f701b9e6e9858c3b$var$Action.next:\n                        this.state.index++;\n                        if (this.state.index >= this.state.userSelection.included.length) this.state.index = 0;\n                        break;\n                }\n                this.render();\n                p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n        p.then(()=>this.render());\n    }\n    render() {\n        const hasRefinedData = this.dataScope.hasFilteredData();\n        const renderProps = {\n            language: this.language,\n            actionHandler: (action)=>this.handleAction(action),\n            selectionHandler: (columnName, value)=>this.selectByNameValue(columnName, value),\n            count: this.state.userSelection && this.state.userSelection.included.length,\n            hasRefinedData: hasRefinedData,\n            item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n            remapColorHandler: (remap)=>this.remapChanged(remap),\n            hasColorMaps: this.hasColorMaps() && hasRefinedData,\n            remapColor: this.state.remapColor\n        };\n        const a = $c5578f8838abba3d$exports.getActiveElementInfo();\n        $c5578f8838abba3d$exports.mount($f701b9e6e9858c3b$var$renderDetails(renderProps), this.element);\n        $c5578f8838abba3d$exports.setActiveElement(a);\n    }\n}\nconst $f701b9e6e9858c3b$var$renderDetails = (props)=>{\n    const controlButtons = [\n        $c5578f8838abba3d$exports.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler($f701b9e6e9858c3b$var$Action.deselect)\n        }, props.language.deselect),\n        $c5578f8838abba3d$exports.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler($f701b9e6e9858c3b$var$Action.isolate)\n        }, props.language.isolate),\n        $c5578f8838abba3d$exports.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler($f701b9e6e9858c3b$var$Action.exclude)\n        }, props.language.exclude)\n    ];\n    const colorMapping = $c5578f8838abba3d$exports.createElement(\"div\", null, $c5578f8838abba3d$exports.createElement(\"button\", {\n        disabled: props.remapColor,\n        onClick: (e)=>props.remapColorHandler(true)\n    }, props.language.newColorMap), $c5578f8838abba3d$exports.createElement(\"button\", {\n        disabled: !props.remapColor,\n        onClick: (e)=>props.remapColorHandler(false)\n    }, props.language.oldColorMap));\n    const singleItem = props.count === 1;\n    const scrollButtons = [\n        $c5578f8838abba3d$exports.createElement(\"button\", {\n            disabled: singleItem,\n            onClick: (e)=>props.actionHandler($f701b9e6e9858c3b$var$Action.previous)\n        }, props.language.previousDetail),\n        $c5578f8838abba3d$exports.createElement(\"button\", {\n            disabled: singleItem,\n            onClick: (e)=>props.actionHandler($f701b9e6e9858c3b$var$Action.next)\n        }, props.language.nextDetail),\n        $c5578f8838abba3d$exports.createElement(\"span\", null, \" \", props.language.selectionCount(props.count))\n    ];\n    const rows = [];\n    for(const prop in props.item){\n        if (prop === (0, $44b8bb162b63b5b5$export$5672246984822a29)) continue;\n        if ((0, $048ba25c9a3f4065$export$81adea670bebefbe)(prop)) continue;\n        rows.push({\n            cells: [\n                {\n                    content: prop\n                },\n                {\n                    content: $f701b9e6e9858c3b$var$linkSelect(props.language, prop, props.item[prop], props.selectionHandler)\n                }\n            ]\n        });\n    }\n    return $c5578f8838abba3d$exports.createElement(\"div\", null, props.hasColorMaps && colorMapping, $c5578f8838abba3d$exports.createElement(\"h4\", null, props.language.headers.selection), $c5578f8838abba3d$exports.createElement(\"div\", {\n        className: `${(0, $16f9e3e56a5dcd59$export$f0d47e1c119d5bf2)}selection`\n    }, controlButtons, $c5578f8838abba3d$exports.createElement(\"button\", {\n        disabled: !props.hasRefinedData,\n        onClick: (e)=>props.actionHandler($f701b9e6e9858c3b$var$Action.reset)\n    }, \"reset\")), props.item && $c5578f8838abba3d$exports.createElement(\"h4\", null, props.language.headers.details), $c5578f8838abba3d$exports.createElement(\"div\", null, $c5578f8838abba3d$exports.createElement(\"div\", {\n        className: `${(0, $16f9e3e56a5dcd59$export$f0d47e1c119d5bf2)}details-scroll`\n    }, props.item && scrollButtons), $c5578f8838abba3d$exports.createElement(\"div\", {\n        className: `${(0, $16f9e3e56a5dcd59$export$f0d47e1c119d5bf2)}details`\n    }, props.item && $c5578f8838abba3d$exports.createElement((0, $230d9e8a9013f7fd$exports).Table, {\n        rows: rows\n    }))));\n};\nfunction $f701b9e6e9858c3b$var$linkSelect(language, columnName, value, selectionHandler) {\n    return $c5578f8838abba3d$exports.createElement(\"span\", null, $c5578f8838abba3d$exports.createElement(\"a\", {\n        href: \"#\",\n        onClick: (e)=>selectionHandler(columnName, value)\n    }, value), isNaN(value) ? [\n        ' ',\n        $c5578f8838abba3d$exports.createElement(\"a\", {\n            className: \"bing-search\",\n            href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n            target: \"_blank\"\n        }, language.bing)\n    ] : '');\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $5daa0c31e678116a$export$1d674716cc6da32f(presenter, headers) {\n    const vegaControls = presenter.getElement((0, $57337365aaceccbe$export$79420be32f83a5b0).vegaControls);\n    $5daa0c31e678116a$var$conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n    const legend = presenter.getElement((0, $57337365aaceccbe$export$79420be32f83a5b0).legend);\n    $5daa0c31e678116a$var$conditionalHeader(!!legend.children.length, legend, headers.legend);\n}\nfunction $5daa0c31e678116a$var$conditionalHeader(condition, element, header) {\n    const existing = $5daa0c31e678116a$var$existingHeader(element, header);\n    if (condition && !existing) $5daa0c31e678116a$var$addHeader(element, header);\n    if (!condition && existing) existing.remove();\n}\nfunction $5daa0c31e678116a$var$addHeader(element, header) {\n    const h = document.createElement('h4');\n    h.innerHTML = header;\n    element.insertAdjacentElement('beforebegin', h);\n}\nfunction $5daa0c31e678116a$var$existingHeader(element, header) {\n    const { previousElementSibling: previousElementSibling } = element;\n    if (previousElementSibling && previousElementSibling.innerHTML === header) return previousElementSibling;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $5c5541ba560b58df$var$legendRange(colorBinType, column, legend, clickedIndex) {\n    if (column.quantitative) return $5c5541ba560b58df$var$selectQuantitative(colorBinType, column, legend, clickedIndex);\n    else return $5c5541ba560b58df$var$selectCategorical(column, legend, clickedIndex);\n}\nfunction $5c5541ba560b58df$var$selectCategorical(column, legend, clickedIndex) {\n    const value = legend.rows[clickedIndex].value;\n    if (value === (0, $8d0624e259fe9d79$export$8653a30c44b6e879)) {\n        const values = [];\n        for(const i in legend.rows)if (+i !== clickedIndex) values.push(legend.rows[i].value);\n        return (0, $e4e496e11632ad2b$export$e531b549585c011c)(column, values);\n    } else //select equal\n    return {\n        expressions: [\n            (0, $e4e496e11632ad2b$export$8543b98d22318eca)(column, legend.rows[clickedIndex].value)\n        ]\n    };\n}\nfunction $5c5541ba560b58df$var$selectQuantitative(colorBinType, column, legend, clickedIndex) {\n    const keys = Object.keys(legend.rows).map((key)=>+key).sort((a, b)=>+a - +b);\n    let lowValue;\n    let lowOperator;\n    let highValue;\n    let highOperator;\n    const rowText = legend.rows[clickedIndex].label;\n    switch(colorBinType){\n        case 'continuous':\n            lowValue = rowText;\n            if (clickedIndex < keys.length - 1) highValue = legend.rows[clickedIndex + 1].value;\n            break;\n        default:\n            {\n                if (rowText.indexOf('null') > 0) {\n                    const ex = {\n                        expressions: [\n                            (0, $e4e496e11632ad2b$export$1be0843eea5393e4)(column)\n                        ]\n                    };\n                    return ex;\n                }\n                const dash = rowText.indexOf(\"\\u2013\"); //this is not the common dash character!\n                if (dash > 0) {\n                    //bug in Vega for quantize?\n                    //lowOperator = '>';\n                    //highOperator = '<=';\n                    lowValue = rowText.substr(0, dash);\n                    highValue = rowText.substr(dash + 1);\n                } else {\n                    if (rowText.indexOf('<') >= 0) highValue = rowText.substring(2);\n                    else if (rowText.indexOf(\"\\u2265\") >= 0) lowValue = rowText.substring(2);\n                }\n            }\n    }\n    if (lowValue) lowValue = (0, $e4e496e11632ad2b$export$cb7265fd11709ea)(lowValue);\n    if (highValue) highValue = (0, $e4e496e11632ad2b$export$cb7265fd11709ea)(highValue);\n    if (lowValue === highValue) return {\n        expressions: [\n            (0, $e4e496e11632ad2b$export$8543b98d22318eca)(column, lowValue)\n        ]\n    };\n    else return (0, $e4e496e11632ad2b$export$8bb38a473c12645e)(column, lowValue, highValue, lowOperator, highOperator);\n}\nfunction $5c5541ba560b58df$export$71ab65a966760ac3(colorBinType, colorColumn, legend, language) {\n    const rowTexts = [];\n    for(const i in legend.rows){\n        const row = legend.rows[i];\n        row.search = $5c5541ba560b58df$var$legendRange(colorBinType, colorColumn, legend, +i);\n        if (row.value === (0, $8d0624e259fe9d79$export$8653a30c44b6e879)) row.label = language.legendOther;\n        else rowTexts.push(row.value);\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $70eaad7e9e4ac896$export$f03cc77b21b3a2b2(columns, data, ordinalMap) {\n    const uCol = columns.uid && columns.uid.name;\n    if (ordinalMap) data.forEach((d, i)=>{\n        const key = uCol ? d[uCol] : i;\n        d[0, $44b8bb162b63b5b5$export$5672246984822a29] = ordinalMap[key];\n    });\n    else {\n        ordinalMap = {};\n        data.forEach((d, i)=>{\n            d[0, $44b8bb162b63b5b5$export$5672246984822a29] = i;\n            const uColValue = uCol ? d[uCol] : i;\n            ordinalMap[uColValue] = i;\n        });\n    }\n    return ordinalMap;\n}\nfunction $70eaad7e9e4ac896$export$5844459bbee68321(cube, data) {\n    const len = data.length;\n    for(let i = 0; i < len; i++){\n        if (data[i][0, $44b8bb162b63b5b5$export$5672246984822a29] === cube.ordinal) return i;\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst { allTruthy: $a4463fda52a937f9$export$84af6d08e329f176, concat: $a4463fda52a937f9$export$ee1b3e54f0441b22, push: $a4463fda52a937f9$export$4cbf152802aa238 } = (0, $c5578f8838abba3d$exports);\n\n\nfunction $a52b757f33a54d2e$export$cb06c97de370398d(search) {\n    let group;\n    const vegaSearch = search;\n    if (Array.isArray(vegaSearch)) {\n        //flatten into one group\n        group = {\n            expressions: []\n        };\n        vegaSearch.forEach((g)=>{\n            const clonedExpressions = $c5578f8838abba3d$exports.clone(g.expressions).filter(Boolean);\n            clonedExpressions[0].clause = '&&';\n            (0, $a4463fda52a937f9$export$4cbf152802aa238)(group.expressions, clonedExpressions);\n        });\n    } else group = vegaSearch ? {\n        expressions: vegaSearch.expressions.filter(Boolean)\n    } : null;\n    return group;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $6728ad2e40252478$export$385a06e733eab4de(sv, b) {\n    if (!sv || !b || !b.signals || !b.signals.length) return;\n    for(const key in sv){\n        const value = sv[key];\n        const signalB = b.signals.filter((signal)=>signal.name === key)[0];\n        if (signalB && signalB.bind) signalB.value = value;\n    }\n}\nfunction $6728ad2e40252478$export$764590c093441ac7(view, spec) {\n    if (!view || !spec || !spec.signals || !spec.signals.length) return;\n    const result = {};\n    spec.signals.forEach((signalA)=>{\n        //bound to a UI control\n        if (signalA.bind) try {\n            result[signalA.name] = view.signal(signalA.name);\n        } catch (e) {\n        // continue regardless of error\n        }\n    });\n    return result;\n}\n//signals not capable of handling with MorphCharts\nconst $6728ad2e40252478$var$hideSignalUI = [\n    (0, $8d0624e259fe9d79$export$809e371dee643808).MarkOpacity,\n    (0, $8d0624e259fe9d79$export$809e371dee643808).TextAngleX,\n    (0, $8d0624e259fe9d79$export$809e371dee643808).TextAngleY\n];\nfunction $6728ad2e40252478$export$dc91f38fb87dcbc8(spec) {\n    spec.signals.forEach((signal)=>{\n        if ($6728ad2e40252478$var$hideSignalUI.indexOf(signal.name) >= 0) delete signal.bind;\n    });\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nconst { outerSize: $40d5ab22242de7d1$var$outerSize } = $c5578f8838abba3d$exports;\nconst { Table: $40d5ab22242de7d1$var$Table } = $230d9e8a9013f7fd$exports;\nclass $40d5ab22242de7d1$export$28c660c63b792dea {\n    constructor(props){\n        this.props = props;\n        const renderProps = {\n            cssPrefix: props.cssPrefix,\n            rows: $40d5ab22242de7d1$var$getRows(props.dataItem)\n        };\n        this.finalizeHandler = ()=>this.destroy();\n        this.element = $40d5ab22242de7d1$var$renderTooltip(renderProps);\n        if (this.element) {\n            this.element.style.position = 'absolute';\n            this.child = this.element.firstChild;\n            document.body.appendChild(this.element);\n            //measure and move as necessary\n            let m = $40d5ab22242de7d1$var$outerSize(this.child);\n            while(m.height > document.documentElement.clientHeight){\n                const tr = this.child.querySelector('tr:last-child');\n                if (tr) tr.parentElement.removeChild(tr);\n                else break;\n                m = $40d5ab22242de7d1$var$outerSize(this.child);\n            }\n            let position;\n            const te = props.event;\n            if (te.touches) position = te[0];\n            else {\n                const pme = props.event;\n                position = pme;\n            }\n            if (position.clientX + m.width >= document.documentElement.clientWidth) this.child.style.right = '0';\n            let moveTop = true;\n            if (position.clientY + m.height >= document.documentElement.clientHeight) {\n                if (position.clientY - m.height > 0) this.child.style.bottom = '0';\n                else moveTop = false;\n            }\n            if (moveTop) this.element.style.top = `${position.clientY}px`;\n            this.element.style.left = `${position.clientX}px`;\n            this.child.addEventListener('mouseenter', this.finalizeHandler);\n            this.child.addEventListener('mousemove', this.finalizeHandler);\n            this.child.addEventListener('mouseover', this.finalizeHandler);\n        }\n    }\n    destroy() {\n        this.child.removeEventListener('mouseenter', this.finalizeHandler);\n        this.child.removeEventListener('mousemove', this.finalizeHandler);\n        this.child.removeEventListener('mouseover', this.finalizeHandler);\n        if (this.element) document.body.removeChild(this.element);\n        this.element = null;\n    }\n}\nfunction $40d5ab22242de7d1$export$ce0d7ac3b25f14e3(item) {\n    const ret = {};\n    for(const columnName in item){\n        if (columnName === (0, $44b8bb162b63b5b5$export$5672246984822a29)) continue;\n        if ((0, $048ba25c9a3f4065$export$81adea670bebefbe)(columnName)) continue;\n        ret[columnName] = item[columnName];\n    }\n    return ret;\n}\nfunction $40d5ab22242de7d1$var$getRows(item) {\n    const rows = [];\n    for(const columnName in item){\n        const value = item[columnName];\n        let content;\n        switch(value){\n            case null:\n                content = $c5578f8838abba3d$exports.createElement(\"i\", null, \"null\");\n                break;\n            case undefined:\n                content = $c5578f8838abba3d$exports.createElement(\"i\", null, \"undefined\");\n                break;\n            default:\n                content = value.toString();\n        }\n        //}\n        rows.push({\n            cells: [\n                {\n                    content: columnName + ':'\n                },\n                {\n                    content: content\n                }\n            ]\n        });\n    }\n    return rows;\n}\nconst $40d5ab22242de7d1$var$renderTooltip = (props)=>{\n    return props.rows.length === 0 ? null : $c5578f8838abba3d$exports.createElement(\"div\", {\n        className: `${props.cssPrefix}tooltip`\n    }, $40d5ab22242de7d1$var$Table({\n        rows: props.rows\n    }));\n};\n\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ class $10ee4fd0042461c6$export$fba22c9d3f66adb {\n    resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n        if (forceNewCharacterSet || $10ee4fd0042461c6$var$needsNewCharacterSet(oldInsight, newInsight)) this.chars = undefined;\n    }\n    getCharacterSet(stage) {\n        if (!this.chars) {\n            const map = {};\n            const addText = (text)=>{\n                Array.from(text).forEach((char)=>{\n                    map[char] = true;\n                });\n            };\n            stage.textData.forEach((t)=>addText(t.text));\n            const { x: x, y: y } = stage.axes;\n            [\n                x,\n                y\n            ].forEach((axes)=>{\n                axes.forEach((axis)=>{\n                    if (axis.tickText) axis.tickText.forEach((t)=>addText(t.text));\n                    if (axis.title) addText(axis.title.text);\n                });\n            });\n            this.chars = Object.keys(map);\n        }\n        return this.chars;\n    }\n}\nfunction $10ee4fd0042461c6$var$needsNewCharacterSet(oldInsight, newInsight) {\n    if (!oldInsight) return true;\n    if (!newInsight) return true;\n    if (oldInsight.chart !== newInsight.chart) return true;\n    if (oldInsight.facetStyle !== newInsight.facetStyle) return true;\n    if (oldInsight.totalStyle !== newInsight.totalStyle) return true;\n    if (oldInsight.hideAxes !== newInsight.hideAxes) return true;\n    if ($10ee4fd0042461c6$var$differentObjectValues(oldInsight.signalValues, newInsight.signalValues)) return true;\n    if ($10ee4fd0042461c6$var$differentObjectValues(oldInsight.size, newInsight.size)) return true;\n    const oldColumns = oldInsight.columns;\n    const newColumns = newInsight.columns;\n    if (oldColumns.facet !== newColumns.facet) return true;\n    if (oldColumns.facetV !== newColumns.facetV) return true;\n    if (oldColumns.x !== newColumns.x) return true;\n    if (oldColumns.y !== newColumns.y) return true;\n    if (oldColumns.z !== newColumns.z) return true;\n    return false;\n}\nfunction $10ee4fd0042461c6$var$differentObjectValues(a, b) {\n    if (!a && !b) return false;\n    if (!a || !b) return true;\n    const keys = Object.keys(b);\n    for(let i = 0; i < keys.length; i++){\n        const key = keys[i];\n        const ta = typeof a;\n        const tb = typeof b;\n        if (ta !== tb) return true;\n        if (ta === 'object') return $10ee4fd0042461c6$var$differentObjectValues(a[key], b[key]);\n        else {\n            if (a[key] !== b[key]) return true;\n        }\n    }\n    return false;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst $b37ec5f783bfc709$var$e10 = Math.sqrt(50), $b37ec5f783bfc709$var$e5 = Math.sqrt(10), $b37ec5f783bfc709$var$e2 = Math.sqrt(2);\nfunction $b37ec5f783bfc709$var$tickSpec(start, stop, count) {\n    const step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log10(step)), error = step / Math.pow(10, power), factor = error >= $b37ec5f783bfc709$var$e10 ? 10 : error >= $b37ec5f783bfc709$var$e5 ? 5 : error >= $b37ec5f783bfc709$var$e2 ? 2 : 1;\n    let i1, i2, inc;\n    if (power < 0) {\n        inc = Math.pow(10, -power) / factor;\n        i1 = Math.round(start * inc);\n        i2 = Math.round(stop * inc);\n        if (i1 / inc < start) ++i1;\n        if (i2 / inc > stop) --i2;\n        inc = -inc;\n    } else {\n        inc = Math.pow(10, power) * factor;\n        i1 = Math.round(start / inc);\n        i2 = Math.round(stop / inc);\n        if (i1 * inc < start) ++i1;\n        if (i2 * inc > stop) --i2;\n    }\n    if (i2 < i1 && 0.5 <= count && count < 2) return $b37ec5f783bfc709$var$tickSpec(start, stop, count * 2);\n    return [\n        i1,\n        i2,\n        inc\n    ];\n}\nfunction $b37ec5f783bfc709$export$2e2bcd8739ae039(start, stop, count) {\n    stop = +stop, start = +start, count = +count;\n    if (!(count > 0)) return [];\n    if (start === stop) return [\n        start\n    ];\n    const reverse = stop < start, [i1, i2, inc] = reverse ? $b37ec5f783bfc709$var$tickSpec(stop, start, count) : $b37ec5f783bfc709$var$tickSpec(start, stop, count);\n    if (!(i2 >= i1)) return [];\n    const n = i2 - i1 + 1, ticks = new Array(n);\n    if (reverse) {\n        if (inc < 0) for(let i = 0; i < n; ++i)ticks[i] = (i2 - i) / -inc;\n        else for(let i = 0; i < n; ++i)ticks[i] = (i2 - i) * inc;\n    } else {\n        if (inc < 0) for(let i = 0; i < n; ++i)ticks[i] = (i1 + i) / -inc;\n        else for(let i = 0; i < n; ++i)ticks[i] = (i1 + i) * inc;\n    }\n    return ticks;\n}\nfunction $b37ec5f783bfc709$export$bc64d00cc98e7e95(start, stop, count) {\n    stop = +stop, start = +start, count = +count;\n    return $b37ec5f783bfc709$var$tickSpec(start, stop, count)[2];\n}\nfunction $b37ec5f783bfc709$export$81087d9b915d4ede(start, stop, count) {\n    stop = +stop, start = +start, count = +count;\n    const reverse = stop < start, inc = reverse ? $b37ec5f783bfc709$export$bc64d00cc98e7e95(stop, start, count) : $b37ec5f783bfc709$export$bc64d00cc98e7e95(start, stop, count);\n    return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n\n\nfunction $3de15593722c01cd$export$2e2bcd8739ae039(a, b) {\n    return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n\n\n\nfunction $3b670352137ef9af$export$2e2bcd8739ae039(a, b) {\n    return a == null || b == null ? NaN : b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n\n\nfunction $df292301a551a084$export$2e2bcd8739ae039(f) {\n    let compare1, compare2, delta;\n    // If an accessor is specified, promote it to a comparator. In this case we\n    // can test whether the search value is (self-) comparable. We can’t do this\n    // for a comparator (except for specific, known comparators) because we can’t\n    // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n    // used to test whether a single value is comparable.\n    if (f.length !== 2) {\n        compare1 = (0, $3de15593722c01cd$export$2e2bcd8739ae039);\n        compare2 = (d, x)=>(0, $3de15593722c01cd$export$2e2bcd8739ae039)(f(d), x);\n        delta = (d, x)=>f(d) - x;\n    } else {\n        compare1 = f === (0, $3de15593722c01cd$export$2e2bcd8739ae039) || f === (0, $3b670352137ef9af$export$2e2bcd8739ae039) ? f : $df292301a551a084$var$zero;\n        compare2 = f;\n        delta = f;\n    }\n    function left(a, x, lo = 0, hi = a.length) {\n        if (lo < hi) {\n            if (compare1(x, x) !== 0) return hi;\n            do {\n                const mid = lo + hi >>> 1;\n                if (compare2(a[mid], x) < 0) lo = mid + 1;\n                else hi = mid;\n            }while (lo < hi);\n        }\n        return lo;\n    }\n    function right(a, x, lo = 0, hi = a.length) {\n        if (lo < hi) {\n            if (compare1(x, x) !== 0) return hi;\n            do {\n                const mid = lo + hi >>> 1;\n                if (compare2(a[mid], x) <= 0) lo = mid + 1;\n                else hi = mid;\n            }while (lo < hi);\n        }\n        return lo;\n    }\n    function center(a, x, lo = 0, hi = a.length) {\n        const i = left(a, x, lo, hi - 1);\n        return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n    }\n    return {\n        left: left,\n        center: center,\n        right: right\n    };\n}\nfunction $df292301a551a084$var$zero() {\n    return 0;\n}\n\n\nfunction $37fd68d7f32545a9$export$2e2bcd8739ae039(x) {\n    return x === null ? NaN : +x;\n}\nfunction* $37fd68d7f32545a9$export$1f6c9cc012ebacae(values, valueof) {\n    if (valueof === undefined) {\n        for (let value of values)if (value != null && (value = +value) >= value) yield value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) yield value;\n    }\n}\n\n\nconst $b9a62473dad8dfb1$var$ascendingBisect = (0, $df292301a551a084$export$2e2bcd8739ae039)((0, $3de15593722c01cd$export$2e2bcd8739ae039));\nconst $b9a62473dad8dfb1$export$4d945ad3ad5751b0 = $b9a62473dad8dfb1$var$ascendingBisect.right;\nconst $b9a62473dad8dfb1$export$df7d25c84ebd12a5 = $b9a62473dad8dfb1$var$ascendingBisect.left;\nconst $b9a62473dad8dfb1$export$c1cb828b1117c77b = (0, $df292301a551a084$export$2e2bcd8739ae039)((0, $37fd68d7f32545a9$export$2e2bcd8739ae039)).center;\nvar $b9a62473dad8dfb1$export$2e2bcd8739ae039 = $b9a62473dad8dfb1$export$4d945ad3ad5751b0;\n\n\n\nvar $hNlxu = parcelRequire(\"hNlxu\");\n\nvar $hNlxu = parcelRequire(\"hNlxu\");\nfunction $518fc8babc76e0b6$export$4e41033bfeec1a4c(t1, v0, v1, v2, v3) {\n    var t2 = t1 * t1, t3 = t2 * t1;\n    return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;\n}\nfunction $518fc8babc76e0b6$export$2e2bcd8739ae039(values) {\n    var n = values.length - 1;\n    return function(t) {\n        var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n        return $518fc8babc76e0b6$export$4e41033bfeec1a4c((t - i / n) * n, v0, v1, v2, v3);\n    };\n}\n\n\n\nfunction $e9dd78f8e9102c31$export$2e2bcd8739ae039(values) {\n    var n = values.length;\n    return function(t) {\n        var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];\n        return (0, $518fc8babc76e0b6$export$4e41033bfeec1a4c)((t - i / n) * n, v0, v1, v2, v3);\n    };\n}\n\n\nvar $4e3362e63ead71f2$export$2e2bcd8739ae039 = (x)=>()=>x;\n\n\nfunction $27ad955e998bf52e$var$linear(a, d) {\n    return function(t) {\n        return a + t * d;\n    };\n}\nfunction $27ad955e998bf52e$var$exponential(a, b, y) {\n    return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n        return Math.pow(a + t * b, y);\n    };\n}\nfunction $27ad955e998bf52e$export$97d7b0c7ddb78dcf(a, b) {\n    var d = b - a;\n    return d ? $27ad955e998bf52e$var$linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : (0, $4e3362e63ead71f2$export$2e2bcd8739ae039)(isNaN(a) ? b : a);\n}\nfunction $27ad955e998bf52e$export$a7ebe8cc6aaf8d37(y) {\n    return (y = +y) === 1 ? $27ad955e998bf52e$export$2e2bcd8739ae039 : function(a, b) {\n        return b - a ? $27ad955e998bf52e$var$exponential(a, b, y) : (0, $4e3362e63ead71f2$export$2e2bcd8739ae039)(isNaN(a) ? b : a);\n    };\n}\nfunction $27ad955e998bf52e$export$2e2bcd8739ae039(a, b) {\n    var d = b - a;\n    return d ? $27ad955e998bf52e$var$linear(a, d) : (0, $4e3362e63ead71f2$export$2e2bcd8739ae039)(isNaN(a) ? b : a);\n}\n\n\nvar $d2b5792f11522b9c$export$2e2bcd8739ae039 = function rgbGamma(y) {\n    var color = (0, $27ad955e998bf52e$export$a7ebe8cc6aaf8d37)(y);\n    function rgb(start, end) {\n        var r = color((start = (0, $hNlxu.rgb)(start)).r, (end = (0, $hNlxu.rgb)(end)).r), g = color(start.g, end.g), b = color(start.b, end.b), opacity = (0, $27ad955e998bf52e$export$2e2bcd8739ae039)(start.opacity, end.opacity);\n        return function(t) {\n            start.r = r(t);\n            start.g = g(t);\n            start.b = b(t);\n            start.opacity = opacity(t);\n            return start + \"\";\n        };\n    }\n    rgb.gamma = rgbGamma;\n    return rgb;\n}(1);\nfunction $d2b5792f11522b9c$var$rgbSpline(spline) {\n    return function(colors) {\n        var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color;\n        for(i = 0; i < n; ++i){\n            color = (0, $hNlxu.rgb)(colors[i]);\n            r[i] = color.r || 0;\n            g[i] = color.g || 0;\n            b[i] = color.b || 0;\n        }\n        r = spline(r);\n        g = spline(g);\n        b = spline(b);\n        color.opacity = 1;\n        return function(t) {\n            color.r = r(t);\n            color.g = g(t);\n            color.b = b(t);\n            return color + \"\";\n        };\n    };\n}\nvar $d2b5792f11522b9c$export$2c0e28f2e2852d3f = $d2b5792f11522b9c$var$rgbSpline((0, $518fc8babc76e0b6$export$2e2bcd8739ae039));\nvar $d2b5792f11522b9c$export$53d5214f625ccd4c = $d2b5792f11522b9c$var$rgbSpline((0, $e9dd78f8e9102c31$export$2e2bcd8739ae039));\n\n\n\nfunction $46768ce7d23501ac$export$2e2bcd8739ae039(a, b) {\n    if (!b) b = [];\n    var n = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i;\n    return function(t) {\n        for(i = 0; i < n; ++i)c[i] = a[i] * (1 - t) + b[i] * t;\n        return c;\n    };\n}\nfunction $46768ce7d23501ac$export$5cd576d1827d40c8(x) {\n    return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\n\nfunction $95a25b90f136cdc4$export$2e2bcd8739ae039(a, b) {\n    return ((0, $46768ce7d23501ac$export$5cd576d1827d40c8)(b) ? (0, $46768ce7d23501ac$export$2e2bcd8739ae039) : $95a25b90f136cdc4$export$15d09067c6a5ee49)(a, b);\n}\nfunction $95a25b90f136cdc4$export$15d09067c6a5ee49(a, b) {\n    var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i;\n    for(i = 0; i < na; ++i)x[i] = (0, $2225a6ce38a3bc4c$export$2e2bcd8739ae039)(a[i], b[i]);\n    for(; i < nb; ++i)c[i] = b[i];\n    return function(t) {\n        for(i = 0; i < na; ++i)c[i] = x[i](t);\n        return c;\n    };\n}\n\n\nfunction $da6ea7fcca21587a$export$2e2bcd8739ae039(a, b) {\n    var d = new Date;\n    return a = +a, b = +b, function(t) {\n        return d.setTime(a * (1 - t) + b * t), d;\n    };\n}\n\n\nfunction $861516f390bef007$export$2e2bcd8739ae039(a, b) {\n    return a = +a, b = +b, function(t) {\n        return a * (1 - t) + b * t;\n    };\n}\n\n\n\nfunction $53cc6176cc97d313$export$2e2bcd8739ae039(a, b) {\n    var i = {}, c = {}, k;\n    if (a === null || typeof a !== \"object\") a = {};\n    if (b === null || typeof b !== \"object\") b = {};\n    for(k in b)if (k in a) i[k] = (0, $2225a6ce38a3bc4c$export$2e2bcd8739ae039)(a[k], b[k]);\n    else c[k] = b[k];\n    return function(t) {\n        for(k in i)c[k] = i[k](t);\n        return c;\n    };\n}\n\n\n\nvar $ffc4486c2fe4e856$var$reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, $ffc4486c2fe4e856$var$reB = new RegExp($ffc4486c2fe4e856$var$reA.source, \"g\");\nfunction $ffc4486c2fe4e856$var$zero(b) {\n    return function() {\n        return b;\n    };\n}\nfunction $ffc4486c2fe4e856$var$one(b) {\n    return function(t) {\n        return b(t) + \"\";\n    };\n}\nfunction $ffc4486c2fe4e856$export$2e2bcd8739ae039(a, b) {\n    var bi = $ffc4486c2fe4e856$var$reA.lastIndex = $ffc4486c2fe4e856$var$reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; // number interpolators\n    // Coerce inputs to strings.\n    a = a + \"\", b = b + \"\";\n    // Interpolate pairs of numbers in a & b.\n    while((am = $ffc4486c2fe4e856$var$reA.exec(a)) && (bm = $ffc4486c2fe4e856$var$reB.exec(b))){\n        if ((bs = bm.index) > bi) {\n            bs = b.slice(bi, bs);\n            if (s[i]) s[i] += bs; // coalesce with previous string\n            else s[++i] = bs;\n        }\n        if ((am = am[0]) === (bm = bm[0])) {\n            if (s[i]) s[i] += bm; // coalesce with previous string\n            else s[++i] = bm;\n        } else {\n            s[++i] = null;\n            q.push({\n                i: i,\n                x: (0, $861516f390bef007$export$2e2bcd8739ae039)(am, bm)\n            });\n        }\n        bi = $ffc4486c2fe4e856$var$reB.lastIndex;\n    }\n    // Add remains of b.\n    if (bi < b.length) {\n        bs = b.slice(bi);\n        if (s[i]) s[i] += bs; // coalesce with previous string\n        else s[++i] = bs;\n    }\n    // Special optimization for only a single match.\n    // Otherwise, interpolate each of the numbers and rejoin the string.\n    return s.length < 2 ? q[0] ? $ffc4486c2fe4e856$var$one(q[0].x) : $ffc4486c2fe4e856$var$zero(b) : (b = q.length, function(t) {\n        for(var i = 0, o; i < b; ++i)s[(o = q[i]).i] = o.x(t);\n        return s.join(\"\");\n    });\n}\n\n\n\n\nfunction $2225a6ce38a3bc4c$export$2e2bcd8739ae039(a, b) {\n    var t = typeof b, c;\n    return b == null || t === \"boolean\" ? (0, $4e3362e63ead71f2$export$2e2bcd8739ae039)(b) : (t === \"number\" ? (0, $861516f390bef007$export$2e2bcd8739ae039) : t === \"string\" ? (c = (0, $hNlxu.default)(b)) ? (b = c, $d2b5792f11522b9c$export$2e2bcd8739ae039) : (0, $ffc4486c2fe4e856$export$2e2bcd8739ae039) : b instanceof (0, $hNlxu.default) ? (0, $d2b5792f11522b9c$export$2e2bcd8739ae039) : b instanceof Date ? (0, $da6ea7fcca21587a$export$2e2bcd8739ae039) : (0, $46768ce7d23501ac$export$5cd576d1827d40c8)(b) ? (0, $46768ce7d23501ac$export$2e2bcd8739ae039) : Array.isArray(b) ? (0, $95a25b90f136cdc4$export$15d09067c6a5ee49) : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? (0, $53cc6176cc97d313$export$2e2bcd8739ae039) : (0, $861516f390bef007$export$2e2bcd8739ae039))(a, b);\n}\n\nfunction $066659eef754a0fa$export$2e2bcd8739ae039(a, b) {\n    return a = +a, b = +b, function(t) {\n        return Math.round(a * (1 - t) + b * t);\n    };\n}\n\n\nfunction $c3498260456ca185$export$2e2bcd8739ae039(x) {\n    return function() {\n        return x;\n    };\n}\n\n\nfunction $40c2318887ac8736$export$2e2bcd8739ae039(x) {\n    return +x;\n}\n\n\nvar $c16acaa6fa39a403$var$unit = [\n    0,\n    1\n];\nfunction $c16acaa6fa39a403$export$f0954fd7d5368655(x) {\n    return x;\n}\nfunction $c16acaa6fa39a403$var$normalize(a, b) {\n    return (b -= a = +a) ? function(x) {\n        return (x - a) / b;\n    } : (0, $c3498260456ca185$export$2e2bcd8739ae039)(isNaN(b) ? NaN : 0.5);\n}\nfunction $c16acaa6fa39a403$var$clamper(a, b) {\n    var t;\n    if (a > b) t = a, a = b, b = t;\n    return function(x) {\n        return Math.max(a, Math.min(b, x));\n    };\n}\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction $c16acaa6fa39a403$var$bimap(domain, range, interpolate) {\n    var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n    if (d1 < d0) d0 = $c16acaa6fa39a403$var$normalize(d1, d0), r0 = interpolate(r1, r0);\n    else d0 = $c16acaa6fa39a403$var$normalize(d0, d1), r0 = interpolate(r0, r1);\n    return function(x) {\n        return r0(d0(x));\n    };\n}\nfunction $c16acaa6fa39a403$var$polymap(domain, range, interpolate) {\n    var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i = -1;\n    // Reverse descending domains.\n    if (domain[j] < domain[0]) {\n        domain = domain.slice().reverse();\n        range = range.slice().reverse();\n    }\n    while(++i < j){\n        d[i] = $c16acaa6fa39a403$var$normalize(domain[i], domain[i + 1]);\n        r[i] = interpolate(range[i], range[i + 1]);\n    }\n    return function(x) {\n        var i = (0, $b9a62473dad8dfb1$export$2e2bcd8739ae039)(domain, x, 1, j) - 1;\n        return r[i](d[i](x));\n    };\n}\nfunction $c16acaa6fa39a403$export$784d13d8ee351f07(source, target) {\n    return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());\n}\nfunction $c16acaa6fa39a403$export$6b468dcfb64c653c() {\n    var domain = $c16acaa6fa39a403$var$unit, range = $c16acaa6fa39a403$var$unit, interpolate = (0, $2225a6ce38a3bc4c$export$2e2bcd8739ae039), transform, untransform, unknown, clamp = $c16acaa6fa39a403$export$f0954fd7d5368655, piecewise, output, input;\n    function rescale() {\n        var n = Math.min(domain.length, range.length);\n        if (clamp !== $c16acaa6fa39a403$export$f0954fd7d5368655) clamp = $c16acaa6fa39a403$var$clamper(domain[0], domain[n - 1]);\n        piecewise = n > 2 ? $c16acaa6fa39a403$var$polymap : $c16acaa6fa39a403$var$bimap;\n        output = input = null;\n        return scale;\n    }\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n    }\n    scale.invert = function(y) {\n        return clamp(untransform((input || (input = piecewise(range, domain.map(transform), (0, $861516f390bef007$export$2e2bcd8739ae039))))(y)));\n    };\n    scale.domain = function(_) {\n        return arguments.length ? (domain = Array.from(_, (0, $40c2318887ac8736$export$2e2bcd8739ae039)), rescale()) : domain.slice();\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n    };\n    scale.rangeRound = function(_) {\n        return range = Array.from(_), interpolate = (0, $066659eef754a0fa$export$2e2bcd8739ae039), rescale();\n    };\n    scale.clamp = function(_) {\n        return arguments.length ? (clamp = _ ? true : $c16acaa6fa39a403$export$f0954fd7d5368655, rescale()) : clamp !== $c16acaa6fa39a403$export$f0954fd7d5368655;\n    };\n    scale.interpolate = function(_) {\n        return arguments.length ? (interpolate = _, rescale()) : interpolate;\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    return function(t, u) {\n        transform = t, untransform = u;\n        return rescale();\n    };\n}\nfunction $c16acaa6fa39a403$export$2e2bcd8739ae039() {\n    return $c16acaa6fa39a403$export$6b468dcfb64c653c()($c16acaa6fa39a403$export$f0954fd7d5368655, $c16acaa6fa39a403$export$f0954fd7d5368655);\n}\n\n\nfunction $73c7a1f077a54c73$export$23c7bb9e6558da2a(domain, range) {\n    switch(arguments.length){\n        case 0:\n            break;\n        case 1:\n            this.range(domain);\n            break;\n        default:\n            this.range(range).domain(domain);\n            break;\n    }\n    return this;\n}\nfunction $73c7a1f077a54c73$export$7d6b419e59e83f3d(domain, interpolator) {\n    switch(arguments.length){\n        case 0:\n            break;\n        case 1:\n            if (typeof domain === \"function\") this.interpolator(domain);\n            else this.range(domain);\n            break;\n        default:\n            this.domain(domain);\n            if (typeof interpolator === \"function\") this.interpolator(interpolator);\n            else this.range(interpolator);\n            break;\n    }\n    return this;\n}\n\n\n\nfunction $336606e4467c7c06$export$2e2bcd8739ae039(x) {\n    return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString(\"en\").replace(/,/g, \"\") : x.toString(10);\n}\nfunction $336606e4467c7c06$export$8f8e23dd27dc19f5(x, p) {\n    if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n    var i, coefficient = x.slice(0, i);\n    // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n    // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n    return [\n        coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n        +x.slice(i + 1)\n    ];\n}\n\n\nfunction $66ddd43ef132fe4c$export$2e2bcd8739ae039(x) {\n    return x = (0, $336606e4467c7c06$export$8f8e23dd27dc19f5)(Math.abs(x)), x ? x[1] : NaN;\n}\n\n\nfunction $4886ae7df3b00c8d$export$2e2bcd8739ae039(grouping, thousands) {\n    return function(value, width) {\n        var i = value.length, t = [], j = 0, g = grouping[0], length = 0;\n        while(i > 0 && g > 0){\n            if (length + g + 1 > width) g = Math.max(1, width - length);\n            t.push(value.substring(i -= g, i + g));\n            if ((length += g + 1) > width) break;\n            g = grouping[j = (j + 1) % grouping.length];\n        }\n        return t.reverse().join(thousands);\n    };\n}\n\n\nfunction $08e49d150cf0e40b$export$2e2bcd8739ae039(numerals) {\n    return function(value) {\n        return value.replace(/[0-9]/g, function(i) {\n            return numerals[+i];\n        });\n    };\n}\n\n\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar $4e7c2ad27f8b8986$var$re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nfunction $4e7c2ad27f8b8986$export$2e2bcd8739ae039(specifier) {\n    if (!(match = $4e7c2ad27f8b8986$var$re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match;\n    return new $4e7c2ad27f8b8986$export$963aac351db36ed4({\n        fill: match[1],\n        align: match[2],\n        sign: match[3],\n        symbol: match[4],\n        zero: match[5],\n        width: match[6],\n        comma: match[7],\n        precision: match[8] && match[8].slice(1),\n        trim: match[9],\n        type: match[10]\n    });\n}\n$4e7c2ad27f8b8986$export$2e2bcd8739ae039.prototype = $4e7c2ad27f8b8986$export$963aac351db36ed4.prototype; // instanceof\nfunction $4e7c2ad27f8b8986$export$963aac351db36ed4(specifier) {\n    this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === undefined ? undefined : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n$4e7c2ad27f8b8986$export$963aac351db36ed4.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n\n\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nfunction $df30648ee9197e79$export$2e2bcd8739ae039(s) {\n    out: for(var n = s.length, i = 1, i0 = -1, i1; i < n; ++i)switch(s[i]){\n        case \".\":\n            i0 = i1 = i;\n            break;\n        case \"0\":\n            if (i0 === 0) i0 = i;\n            i1 = i;\n            break;\n        default:\n            if (!+s[i]) break out;\n            if (i0 > 0) i0 = 0;\n            break;\n    }\n    return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n\n\n\n\nvar $54258f7cd36fe54f$export$6863724d9a42263;\nfunction $54258f7cd36fe54f$export$2e2bcd8739ae039(x, p) {\n    var d = (0, $336606e4467c7c06$export$8f8e23dd27dc19f5)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1], i = exponent - ($54258f7cd36fe54f$export$6863724d9a42263 = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, $336606e4467c7c06$export$8f8e23dd27dc19f5)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n\n\n\nfunction $679e3c4c7287d755$export$2e2bcd8739ae039(x, p) {\n    var d = (0, $336606e4467c7c06$export$8f8e23dd27dc19f5)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1];\n    return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n\n\nvar $80f7b023ca9d43c7$export$2e2bcd8739ae039 = {\n    \"%\": (x, p)=>(x * 100).toFixed(p),\n    \"b\": (x)=>Math.round(x).toString(2),\n    \"c\": (x)=>x + \"\",\n    \"d\": (0, $336606e4467c7c06$export$2e2bcd8739ae039),\n    \"e\": (x, p)=>x.toExponential(p),\n    \"f\": (x, p)=>x.toFixed(p),\n    \"g\": (x, p)=>x.toPrecision(p),\n    \"o\": (x)=>Math.round(x).toString(8),\n    \"p\": (x, p)=>(0, $679e3c4c7287d755$export$2e2bcd8739ae039)(x * 100, p),\n    \"r\": (0, $679e3c4c7287d755$export$2e2bcd8739ae039),\n    \"s\": (0, $54258f7cd36fe54f$export$2e2bcd8739ae039),\n    \"X\": (x)=>Math.round(x).toString(16).toUpperCase(),\n    \"x\": (x)=>Math.round(x).toString(16)\n};\n\n\n\nfunction $40245bd1e15a08bc$export$2e2bcd8739ae039(x) {\n    return x;\n}\n\n\nvar $c953dd2438486cb9$var$map = Array.prototype.map, $c953dd2438486cb9$var$prefixes = [\n    \"y\",\n    \"z\",\n    \"a\",\n    \"f\",\n    \"p\",\n    \"n\",\n    \"\\xb5\",\n    \"m\",\n    \"\",\n    \"k\",\n    \"M\",\n    \"G\",\n    \"T\",\n    \"P\",\n    \"E\",\n    \"Z\",\n    \"Y\"\n];\nfunction $c953dd2438486cb9$export$2e2bcd8739ae039(locale) {\n    var group = locale.grouping === undefined || locale.thousands === undefined ? (0, $40245bd1e15a08bc$export$2e2bcd8739ae039) : (0, $4886ae7df3b00c8d$export$2e2bcd8739ae039)($c953dd2438486cb9$var$map.call(locale.grouping, Number), locale.thousands + \"\"), currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\", currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\", decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\", numerals = locale.numerals === undefined ? (0, $40245bd1e15a08bc$export$2e2bcd8739ae039) : (0, $08e49d150cf0e40b$export$2e2bcd8739ae039)($c953dd2438486cb9$var$map.call(locale.numerals, String)), percent = locale.percent === undefined ? \"%\" : locale.percent + \"\", minus = locale.minus === undefined ? \"\\u2212\" : locale.minus + \"\", nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n    function newFormat(specifier) {\n        specifier = (0, $4e7c2ad27f8b8986$export$2e2bcd8739ae039)(specifier);\n        var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;\n        // The \"n\" type is an alias for \",g\".\n        if (type === \"n\") comma = true, type = \"g\";\n        else if (!(0, $80f7b023ca9d43c7$export$2e2bcd8739ae039)[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n        // If zero fill is specified, padding goes after sign and before digits.\n        if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\";\n        // Compute the prefix and suffix.\n        // For SI-prefix, the suffix is lazily computed.\n        var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\", suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n        // What format function should we use?\n        // Is this an integer type?\n        // Can this type generate exponential notation?\n        var formatType = (0, $80f7b023ca9d43c7$export$2e2bcd8739ae039)[type], maybeSuffix = /[defgprs%]/.test(type);\n        // Set the default precision if not specified,\n        // or clamp the specified precision to the supported range.\n        // For significant precision, it must be in [1, 21].\n        // For fixed precision, it must be in [0, 20].\n        precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n        function format(value) {\n            var valuePrefix = prefix, valueSuffix = suffix, i, n, c;\n            if (type === \"c\") {\n                valueSuffix = formatType(value) + valueSuffix;\n                value = \"\";\n            } else {\n                value = +value;\n                // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n                var valueNegative = value < 0 || 1 / value < 0;\n                // Perform the initial formatting.\n                value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n                // Trim insignificant zeros.\n                if (trim) value = (0, $df30648ee9197e79$export$2e2bcd8739ae039)(value);\n                // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n                if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n                // Compute the prefix and suffix.\n                valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n                valueSuffix = (type === \"s\" ? $c953dd2438486cb9$var$prefixes[8 + (0, $54258f7cd36fe54f$export$6863724d9a42263) / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n                // Break the formatted value into the integer “value” part that can be\n                // grouped, and fractional or exponential “suffix” part that is not.\n                if (maybeSuffix) {\n                    i = -1, n = value.length;\n                    while(++i < n)if (c = value.charCodeAt(i), 48 > c || c > 57) {\n                        valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n                        value = value.slice(0, i);\n                        break;\n                    }\n                }\n            }\n            // If the fill character is not \"0\", grouping is applied before padding.\n            if (comma && !zero) value = group(value, Infinity);\n            // Compute the padding.\n            var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n            // If the fill character is \"0\", grouping is applied after padding.\n            if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n            // Reconstruct the final output based on the desired alignment.\n            switch(align){\n                case \"<\":\n                    value = valuePrefix + value + valueSuffix + padding;\n                    break;\n                case \"=\":\n                    value = valuePrefix + padding + value + valueSuffix;\n                    break;\n                case \"^\":\n                    value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n                    break;\n                default:\n                    value = padding + valuePrefix + value + valueSuffix;\n                    break;\n            }\n            return numerals(value);\n        }\n        format.toString = function() {\n            return specifier + \"\";\n        };\n        return format;\n    }\n    function formatPrefix(specifier, value) {\n        var f = newFormat((specifier = (0, $4e7c2ad27f8b8986$export$2e2bcd8739ae039)(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor((0, $66ddd43ef132fe4c$export$2e2bcd8739ae039)(value) / 3))) * 3, k = Math.pow(10, -e), prefix = $c953dd2438486cb9$var$prefixes[8 + e / 3];\n        return function(value) {\n            return f(k * value) + prefix;\n        };\n    }\n    return {\n        format: newFormat,\n        formatPrefix: formatPrefix\n    };\n}\n\n\nvar $2ab610105ad986f3$var$locale;\nvar $2ab610105ad986f3$export$d9468344d3651243;\nvar $2ab610105ad986f3$export$8d85692a469dde6f;\n$2ab610105ad986f3$export$2e2bcd8739ae039({\n    thousands: \",\",\n    grouping: [\n        3\n    ],\n    currency: [\n        \"$\",\n        \"\"\n    ]\n});\nfunction $2ab610105ad986f3$export$2e2bcd8739ae039(definition) {\n    $2ab610105ad986f3$var$locale = (0, $c953dd2438486cb9$export$2e2bcd8739ae039)(definition);\n    $2ab610105ad986f3$export$d9468344d3651243 = $2ab610105ad986f3$var$locale.format;\n    $2ab610105ad986f3$export$8d85692a469dde6f = $2ab610105ad986f3$var$locale.formatPrefix;\n    return $2ab610105ad986f3$var$locale;\n}\n\n\nfunction $d781694d8ec32acd$export$2e2bcd8739ae039(step) {\n    return Math.max(0, -(0, $66ddd43ef132fe4c$export$2e2bcd8739ae039)(Math.abs(step)));\n}\n\n\nfunction $c52109cbb6bdab7a$export$2e2bcd8739ae039(step, value) {\n    return Math.max(0, Math.max(-8, Math.min(8, Math.floor((0, $66ddd43ef132fe4c$export$2e2bcd8739ae039)(value) / 3))) * 3 - (0, $66ddd43ef132fe4c$export$2e2bcd8739ae039)(Math.abs(step)));\n}\n\n\nfunction $d7d2d4681a1afd8c$export$2e2bcd8739ae039(step, max) {\n    step = Math.abs(step), max = Math.abs(max) - step;\n    return Math.max(0, (0, $66ddd43ef132fe4c$export$2e2bcd8739ae039)(max) - (0, $66ddd43ef132fe4c$export$2e2bcd8739ae039)(step)) + 1;\n}\n\n\nfunction $2f05cfe5fa1e6600$export$2e2bcd8739ae039(start, stop, count, specifier) {\n    var step = (0, $b37ec5f783bfc709$export$81087d9b915d4ede)(start, stop, count), precision;\n    specifier = (0, $4e7c2ad27f8b8986$export$2e2bcd8739ae039)(specifier == null ? \",f\" : specifier);\n    switch(specifier.type){\n        case \"s\":\n            var value = Math.max(Math.abs(start), Math.abs(stop));\n            if (specifier.precision == null && !isNaN(precision = (0, $c52109cbb6bdab7a$export$2e2bcd8739ae039)(step, value))) specifier.precision = precision;\n            return (0, $2ab610105ad986f3$export$8d85692a469dde6f)(specifier, value);\n        case \"\":\n        case \"e\":\n        case \"g\":\n        case \"p\":\n        case \"r\":\n            if (specifier.precision == null && !isNaN(precision = (0, $d7d2d4681a1afd8c$export$2e2bcd8739ae039)(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n            break;\n        case \"f\":\n        case \"%\":\n            if (specifier.precision == null && !isNaN(precision = (0, $d781694d8ec32acd$export$2e2bcd8739ae039)(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n            break;\n    }\n    return (0, $2ab610105ad986f3$export$d9468344d3651243)(specifier);\n}\n\n\nfunction $f7220656076fa594$export$16a5d4b4a61a274d(scale) {\n    var domain = scale.domain;\n    scale.ticks = function(count) {\n        var d = domain();\n        return (0, $b37ec5f783bfc709$export$2e2bcd8739ae039)(d[0], d[d.length - 1], count == null ? 10 : count);\n    };\n    scale.tickFormat = function(count, specifier) {\n        var d = domain();\n        return (0, $2f05cfe5fa1e6600$export$2e2bcd8739ae039)(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n    };\n    scale.nice = function(count) {\n        if (count == null) count = 10;\n        var d = domain();\n        var i0 = 0;\n        var i1 = d.length - 1;\n        var start = d[i0];\n        var stop = d[i1];\n        var prestep;\n        var step;\n        var maxIter = 10;\n        if (stop < start) {\n            step = start, start = stop, stop = step;\n            step = i0, i0 = i1, i1 = step;\n        }\n        while(maxIter-- > 0){\n            step = (0, $b37ec5f783bfc709$export$bc64d00cc98e7e95)(start, stop, count);\n            if (step === prestep) {\n                d[i0] = start;\n                d[i1] = stop;\n                return domain(d);\n            } else if (step > 0) {\n                start = Math.floor(start / step) * step;\n                stop = Math.ceil(stop / step) * step;\n            } else if (step < 0) {\n                start = Math.ceil(start * step) / step;\n                stop = Math.floor(stop * step) / step;\n            } else break;\n            prestep = step;\n        }\n        return scale;\n    };\n    return scale;\n}\nfunction $f7220656076fa594$export$2e2bcd8739ae039() {\n    var scale = (0, $c16acaa6fa39a403$export$2e2bcd8739ae039)();\n    scale.copy = function() {\n        return (0, $c16acaa6fa39a403$export$784d13d8ee351f07)(scale, $f7220656076fa594$export$2e2bcd8739ae039());\n    };\n    (0, $73c7a1f077a54c73$export$23c7bb9e6558da2a).apply(scale, arguments);\n    return $f7220656076fa594$export$16a5d4b4a61a274d(scale);\n}\n\n\n\nfunction $099aaea57d9dcbf4$export$2be97f482a239d30(transition, currentData, selection, presenter) {\n    const { layerStagger: layerStagger } = presenter.morphchartsref;\n    const { morphChartsRenderResult: morphChartsRenderResult } = presenter;\n    const cubelayer = morphChartsRenderResult.getCubeLayer();\n    const range = transition.reverse ? [\n        1,\n        0\n    ] : [\n        0,\n        1\n    ];\n    if (!transition || transition.type === 'ordinal' && !transition.reverse) delete layerStagger.cubes;\n    else {\n        const staggerOrders = new Float64Array(cubelayer.positionsX.length);\n        switch(transition.type){\n            case 'ordinal':\n                {\n                    //reverse ordinal\n                    const scale = (0, $f7220656076fa594$export$2e2bcd8739ae039)(range).domain([\n                        0,\n                        currentData.length\n                    ]);\n                    currentData.forEach((datum, i)=>{\n                        const glOrdinal = datum[0, $44b8bb162b63b5b5$export$5672246984822a29];\n                        staggerOrders[glOrdinal] = scale(i);\n                    });\n                    break;\n                }\n            case 'column':\n                if (transition.column.quantitative) {\n                    const values = new Float64Array(currentData.length);\n                    currentData.forEach((datum, i)=>{\n                        values[i] = datum[transition.column.name];\n                    });\n                    const stats = (0, $8e54999951217c95$export$432f698644f45d1)(currentData, transition.column);\n                    const scale = (0, $f7220656076fa594$export$2e2bcd8739ae039)(range).domain([\n                        stats.min,\n                        stats.max\n                    ]);\n                    currentData.forEach((datum, i)=>{\n                        const glOrdinal = datum[0, $44b8bb162b63b5b5$export$5672246984822a29];\n                        staggerOrders[glOrdinal] = scale(values[i]);\n                    });\n                } else {\n                    const strings = new Array(currentData.length);\n                    currentData.forEach((datum, i)=>{\n                        strings[i] = datum[transition.column.name];\n                    });\n                    (0, $8e54999951217c95$export$432f698644f45d1)(currentData, transition.column, (distictValues)=>{\n                        currentData.forEach((datum, i)=>{\n                            const glOrdinal = datum[0, $44b8bb162b63b5b5$export$5672246984822a29];\n                            const index = distictValues.indexOf(strings[i]);\n                            const staggerOrder = index / distictValues.length;\n                            staggerOrders[glOrdinal] = transition.reverse ? 1 - staggerOrder : staggerOrder;\n                        });\n                    });\n                }\n                break;\n            case 'position':\n                {\n                    const dimensions = {\n                        x: cubelayer.positionsX,\n                        y: cubelayer.positionsY,\n                        z: cubelayer.positionsZ\n                    };\n                    const positions = dimensions[transition.dimension];\n                    const values = new Float64Array(currentData.length);\n                    currentData.forEach((datum, i)=>{\n                        const glOrdinal = datum[0, $44b8bb162b63b5b5$export$5672246984822a29];\n                        values[i] = positions[glOrdinal];\n                    });\n                    const stats = (0, $8e54999951217c95$export$432f698644f45d1)(values, null, 'number', true);\n                    const scale = (0, $f7220656076fa594$export$2e2bcd8739ae039)(range).domain([\n                        stats.min,\n                        stats.max\n                    ]);\n                    currentData.forEach((datum, i)=>{\n                        const glOrdinal = datum[0, $44b8bb162b63b5b5$export$5672246984822a29];\n                        staggerOrders[glOrdinal] = scale(values[i]);\n                    });\n                    break;\n                }\n        }\n        layerStagger.cubes = {\n            staggerOrders: staggerOrders,\n            maxStaggerOrder: 1,\n            minStaggerOrder: 0\n        };\n    }\n    cubelayer.update(morphChartsRenderResult.bounds, selection, layerStagger.cubes);\n}\n\n\nvar $6662f126c1d9f58b$var$__awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nconst { defaultView: $6662f126c1d9f58b$var$defaultView } = $a2698ea08ecf5377$exports;\nconst $6662f126c1d9f58b$var$zAxisZindex = 1010;\nlet $6662f126c1d9f58b$var$didRegisterColorSchemes = false;\nclass $6662f126c1d9f58b$export$2ec4afd9b3c16a85 {\n    /**\n     * Instantiate a new Viewer.\n     * @param element Parent HTMLElement to present within.\n     * @param options Optional viewer options object.\n     */ constructor(element, options){\n        this.element = element;\n        this.options = $c5578f8838abba3d$exports.deepMerge((0, $16f9e3e56a5dcd59$export$fb736e4909afb3d7), options);\n        this.presenter = new $6dfc103fcb41a0e6$export$893c88c42e3630f9(element, (0, $16f9e3e56a5dcd59$export$c4db461e5e345a8)(this.options));\n        //this.presenter.logger = console.log;\n        this._characterSet = new (0, $10ee4fd0042461c6$export$fba22c9d3f66adb)();\n        this._dataScope = new (0, $298086c83cbc7842$export$3fb74a6ae4f1171d)();\n        this._animator = new (0, $6b115708bb157a7f$export$c774d8c9d4e9e234)(this._dataScope, {\n            onDataChanged: this.onDataChanged.bind(this),\n            onAnimateDataChange: this.onAnimateDataChange.bind(this)\n        });\n        this._details = new (0, $f701b9e6e9858c3b$export$3e8048d3cf2ba3fd)(this.presenter.getElement($57337365aaceccbe$export$79420be32f83a5b0.panel), this.options.language, this._animator, this._dataScope, (remap)=>{\n            this.currentColorContext = ~~remap;\n            this.renderSameLayout();\n        }, ()=>this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n        this.insight = {};\n    }\n    changeColorContexts(colorContexts) {\n        this.colorContexts = colorContexts;\n        this.currentColorContext = 0;\n        this.options.onColorContextChange && this.options.onColorContextChange();\n    }\n    applyLegendColorContext(colorContext) {\n        const a = $c5578f8838abba3d$exports.getActiveElementInfo();\n        $c5578f8838abba3d$exports.mount(colorContext.legendElement, this.presenter.getElement($57337365aaceccbe$export$79420be32f83a5b0.legend));\n        $c5578f8838abba3d$exports.setActiveElement(a);\n        this.presenter.stage.legend = colorContext.legend;\n    }\n    onAnimateDataChange(dataChange, waitingLabel, handlerLabel, time) {\n        var _a;\n        if (time === undefined) {\n            const transitionDurations = ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transitionDurations) || $a2698ea08ecf5377$exports.defaultPresenterConfig.transitionDurations;\n            time = transitionDurations.position + transitionDurations.stagger;\n        }\n        return new Promise((resolve, reject)=>{\n            let innerPromise;\n            if (dataChange === (0, $6b115708bb157a7f$export$d9e571576e98a7ab).refine) {\n                const oldColorContext = this.colorContexts[this.currentColorContext];\n                innerPromise = new Promise((innerResolve)=>{\n                    this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), {\n                        preStage: (stage, cubeLayer)=>{\n                            (0, $5c5541ba560b58df$export$71ab65a966760ac3)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                            this.overrideAxisLabels(stage);\n                            cubeLayer.unitColorMap = oldColorContext.colorMap;\n                            if (this.options.onStage) this.options.onStage(stage);\n                        }\n                    })).then(()=>{\n                        //apply old legend\n                        this.applyLegendColorContext(oldColorContext);\n                        innerResolve();\n                    });\n                });\n            } else innerPromise = this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), {\n                preStage: (stage, colorMapper)=>{\n                    (0, $5c5541ba560b58df$export$71ab65a966760ac3)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                    this.overrideAxisLabels(stage);\n                    if (this.options.onStage) this.options.onStage(stage);\n                }\n            }));\n            innerPromise.then(()=>{\n                this.presenter.animationQueue(resolve, time, {\n                    waitingLabel: waitingLabel,\n                    handlerLabel: handlerLabel,\n                    animationCanceled: reject\n                });\n            });\n        });\n    }\n    onDataChanged(dataLayout, filter) {\n        return $6662f126c1d9f58b$var$__awaiter(this, void 0, void 0, function*() {\n            switch(dataLayout){\n                case (0, $6b115708bb157a7f$export$d9e571576e98a7ab).same:\n                    {\n                        const hasSelectedData = this._dataScope.hasSelectedData();\n                        const hasActive = !!this._dataScope.active;\n                        if (hasSelectedData || hasActive) this.presenter.morphChartsRenderResult.update({\n                            cubes: this.convertSearchToSet()\n                        });\n                        else this.presenter.morphChartsRenderResult.update({\n                            cubes: null\n                        });\n                        break;\n                    }\n                case (0, $6b115708bb157a7f$export$d9e571576e98a7ab).refine:\n                    {\n                        //save cube colors\n                        const oldColorContext = this.colorContexts[this.currentColorContext];\n                        let colorMap;\n                        this.presenter.morphChartsRenderResult.update({\n                            cubes: null\n                        });\n                        yield this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), {\n                            preStage: (stage, cubeLayer)=>{\n                                //save off the spec colors\n                                colorMap = cubeLayer.unitColorMap;\n                                cubeLayer.unitColorMap = oldColorContext.colorMap;\n                                this.preStage(stage, cubeLayer);\n                            },\n                            onPresent: ()=>{\n                                //save new legend\n                                const newColorContext = {\n                                    colorMap: colorMap,\n                                    legend: $c5578f8838abba3d$exports.clone(this.presenter.stage.legend),\n                                    legendElement: this.presenter.getElement($57337365aaceccbe$export$79420be32f83a5b0.legend).children[0]\n                                };\n                                //apply old legend\n                                this.applyLegendColorContext(oldColorContext);\n                                this.changeColorContexts([\n                                    oldColorContext,\n                                    newColorContext\n                                ]);\n                                this.onPresent();\n                            }\n                        }));\n                        //narrow the filter only if it is different\n                        if (!$4c4e2fc4d7da02f0$export$398604a469f7de9a(this.insight.filter, filter)) this.insight.filter = $ed08d33b174a5471$export$ec67f55c222e1546(this.insight.filter, filter);\n                        if (this.options.onDataFilter) this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                        break;\n                    }\n                case (0, $6b115708bb157a7f$export$d9e571576e98a7ab).reset:\n                    {\n                        const colorContext = {\n                            colorMap: null,\n                            legend: null,\n                            legendElement: null\n                        };\n                        this.changeColorContexts([\n                            colorContext\n                        ]);\n                        this.presenter.morphChartsRenderResult.update({\n                            cubes: null\n                        });\n                        yield this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), {\n                            onPresent: ()=>{\n                                //color needs to change instantly\n                                (0, $d862cbedfe5e328a$export$44addeff9a96c1e7)(colorContext, this.presenter);\n                                this.onPresent();\n                            }\n                        }));\n                        delete this.insight.filter;\n                        if (this.options.onDataFilter) this.options.onDataFilter(null, null);\n                        break;\n                    }\n            }\n            if (this.options.onSelectionChanged) {\n                const sel = this.getSelection();\n                this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n            }\n        });\n    }\n    convertSearchToSet() {\n        if (this._dataScope.selection) {\n            const s = new Set();\n            let found = false;\n            this._dataScope.selection.included.forEach((o, i)=>{\n                s.add(o[0, $44b8bb162b63b5b5$export$5672246984822a29]);\n                found = true;\n            });\n            if (!found) s.add(-1);\n            return s;\n        }\n    }\n    convertSetToSearch(s) {\n        const search = {\n            expressions: []\n        };\n        s.forEach((value)=>{\n            search.expressions.push({\n                name: (0, $44b8bb162b63b5b5$export$5672246984822a29),\n                operator: '==',\n                value: value,\n                clause: '||'\n            });\n        });\n        return search;\n    }\n    getSpecColumnsWithFilteredStats() {\n        if (!this._dataScope.hasFilteredData()) return this._specColumns;\n        const roles = [\n            'color',\n            'facet',\n            'group',\n            'size',\n            'sort',\n            'sum',\n            'x',\n            'y',\n            'z'\n        ];\n        const specColumns = Object.assign({}, this._specColumns);\n        roles.forEach((r)=>{\n            if (specColumns[r]) {\n                const column = Object.assign({}, specColumns[r]);\n                column.stats = this.getColumnStats(column);\n                specColumns[r] = column;\n            }\n        });\n        return specColumns;\n    }\n    renderNewLayout(signalValues, presenterConfig, view) {\n        return $6662f126c1d9f58b$var$__awaiter(this, void 0, void 0, function*() {\n            const currData = this._dataScope.currentData();\n            const context = {\n                specColumns: this.getSpecColumnsWithFilteredStats(),\n                insight: this.insight,\n                specViewOptions: Object.assign(Object.assign({}, this.options), {\n                    zAxisOptions: {\n                        showZAxis: true,\n                        zIndex: $6662f126c1d9f58b$var$zAxisZindex\n                    },\n                    collapseFacetAxes: true\n                })\n            };\n            const specResult = (0, $1c081eb26c39473d$export$3f8fe6489e95757d)(context, currData);\n            if (!specResult.errors) {\n                const uiValues = (0, $6728ad2e40252478$export$764590c093441ac7)(this.vegaViewGl, this.vegaSpec);\n                (0, $6728ad2e40252478$export$385a06e733eab4de)(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n                (0, $6728ad2e40252478$export$dc91f38fb87dcbc8)(specResult.vegaSpec);\n                this.vegaSpec = specResult.vegaSpec;\n                this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n                this.specCapabilities = specResult.specCapabilities;\n                const config = this.createConfig(presenterConfig);\n                this._lastPresenterConfig = config.presenterConfig;\n                if (view) config.getView = ()=>view;\n                if (!$6662f126c1d9f58b$var$didRegisterColorSchemes) {\n                    (0, $1f9940ddae6f4302$export$3030070885af9365)($94b078fc391e7135$export$e2253033e6e1df16.vega);\n                    $6662f126c1d9f58b$var$didRegisterColorSchemes = true;\n                }\n                try {\n                    if (this.vegaViewGl) this.vegaViewGl.finalize();\n                    const runtime = $94b078fc391e7135$export$e2253033e6e1df16.vega.parse(this.vegaSpec);\n                    this.vegaViewGl = new $51fbad27d38c01a6$export$6d8f9057dcd7f9e6(runtime, config).renderer('morphcharts').initialize(this.element);\n                    yield this.vegaViewGl.runAsync();\n                    const handler = (n, v)=>{\n                        this._characterSet.resetCharacterSet(true);\n                    };\n                    this.vegaSpec.signals.forEach((s)=>{\n                        this.vegaViewGl.addSignalListener(s.name, handler);\n                    });\n                    //capture new color color contexts via signals\n                    this.configForSignalCapture(config.presenterConfig);\n                } catch (e) {\n                    specResult.errors = [\n                        e.message\n                    ];\n                }\n                if (!specResult.errors) (0, $5daa0c31e678116a$export$1d674716cc6da32f)(this.presenter, this.options.language.headers);\n            }\n            if (specResult.errors) {\n                if (this.options.onError) this.options.onError(specResult.errors);\n                else if (this.presenter.logger) this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n            }\n            return specResult;\n        });\n    }\n    /**\n     * Render the same layout with new options.\n     * @param newViewerOptions New options object.\n     */ renderSameLayout(newViewerOptions) {\n        const colorContext = this.colorContexts[this.currentColorContext];\n        this.applyLegendColorContext(colorContext);\n        if (newViewerOptions) {\n            if (newViewerOptions.colors) {\n                //set theme colors PresenterConfig\n                const mcColors = this.getMorphChartsColors();\n                this.presenter.configColors(mcColors);\n                this._lastPresenterConfig.morphChartsColors = mcColors;\n            }\n            this.options = $c5578f8838abba3d$exports.deepMerge(this.options, newViewerOptions);\n        }\n        this.presenter.morphChartsRenderResult.getCubeLayer().unitColorMap = colorContext.colorMap;\n        this.presenter.morphChartsRenderResult.update({\n            cubes: this.convertSearchToSet()\n        });\n    }\n    getView(view) {\n        if (view === undefined) {\n            if (this.presenter.view === null) return $6662f126c1d9f58b$var$defaultView;\n            else return this.presenter.view;\n        } else return view;\n    }\n    transformData(values, transform) {\n        try {\n            const runtime = $94b078fc391e7135$export$e2253033e6e1df16.vega.parse({\n                $schema: 'https://vega.github.io/schema/vega/v4.json',\n                data: [\n                    {\n                        name: 'source',\n                        values: values,\n                        transform: transform\n                    }\n                ]\n            });\n            new $51fbad27d38c01a6$export$6d8f9057dcd7f9e6(runtime).run();\n        } catch (e) {\n        // continue regardless of error\n        }\n        return values;\n    }\n    /**\n     * Render data into a visualization.\n     * @param insightSetup InsightSetup object to create a visualization rendering.\n     * @param data Array of data objects.\n     * @param renderOptions Optional RenderOptions object.\n     */ render(insightSetup_1, data_1) {\n        return $6662f126c1d9f58b$var$__awaiter(this, arguments, void 0, function*(insightSetup, data, renderOptions = {}) {\n            const { insight: insight, setup: setup } = insightSetup;\n            let result;\n            //see if refine expression has changed\n            if (!$4c4e2fc4d7da02f0$export$398604a469f7de9a(insight.filter, this.insight.filter)) {\n                const transitionDurations = (setup === null || setup === void 0 ? void 0 : setup.transitionDurations) || $a2698ea08ecf5377$exports.defaultPresenterConfig.transitionDurations;\n                const renderTime = transitionDurations.position + transitionDurations.stagger;\n                const allowAsyncRenderTime = renderTime + this.options.filterRenderingTimerPadding;\n                if (insight.filter) {\n                    //refining\n                    result = yield this._render(insightSetup, data, renderOptions, true);\n                    this.presenter.animationQueue(()=>{\n                        this.filter(insight.filter, renderOptions.rebaseFilter && renderOptions.rebaseFilter());\n                    }, allowAsyncRenderTime, {\n                        waitingLabel: 'layout before refine',\n                        handlerLabel: 'refine after layout'\n                    });\n                } else {\n                    //not refining\n                    this._dataScope.setFilteredData(null);\n                    result = yield this._render(insightSetup, data, renderOptions, true);\n                    this.presenter.animationQueue(()=>{\n                        this.reset();\n                    }, allowAsyncRenderTime, {\n                        waitingLabel: 'layout before reset',\n                        handlerLabel: 'reset after layout'\n                    });\n                }\n            } else result = yield this._render(insightSetup, data, renderOptions, false);\n            return result;\n        });\n    }\n    shouldViewstateTransition(newInsight, oldInsight) {\n        if (!oldInsight.columns) return false;\n        if (oldInsight.chart !== newInsight.chart) return true;\n        if (oldInsight.size.height !== newInsight.size.height) return true;\n        if (oldInsight.size.width !== newInsight.size.width) return true;\n        if (oldInsight.columns.facet !== newInsight.columns.facet) return true;\n        return false;\n    }\n    configForSignalCapture(presenterConfig) {\n        const colorContext = {\n            colorMap: null,\n            legend: null,\n            legendElement: null\n        };\n        //now be ready to capture color changing signals \n        presenterConfig.preStage = (stage, cubeLayer)=>{\n            if (this._shouldSaveColorContext()) //save off the colors from Vega layout\n            colorContext.colorMap = cubeLayer.unitColorMap;\n            this.preStage(stage, cubeLayer);\n        };\n        presenterConfig.onPresent = ()=>{\n            if (this._shouldSaveColorContext()) {\n                (0, $d862cbedfe5e328a$export$44addeff9a96c1e7)(colorContext, this.presenter);\n                this.changeColorContexts([\n                    colorContext\n                ]);\n                this._dataScope.deselect();\n            }\n            this.onPresent();\n        };\n    }\n    onPresent() {\n        var _a;\n        if ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transition) (0, $099aaea57d9dcbf4$export$2be97f482a239d30)(this.setup.transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n        this.options.onPresent && this.options.onPresent();\n    }\n    _render(insightSetup, data, renderOptions, forceNewCharacterSet) {\n        return $6662f126c1d9f58b$var$__awaiter(this, void 0, void 0, function*() {\n            const { insight: insight, setup: setup } = insightSetup;\n            if (this._tooltip) {\n                this._tooltip.destroy();\n                this._tooltip = null;\n            }\n            if (this._dataScope.setData(data, renderOptions.columns)) //apply transform to the data\n            this.transformData(data, insight.transform);\n            this._specColumns = (0, $2b29a67d615af3f6$export$9e6128b2231f5173)(insight, this._dataScope.getColumns(renderOptions.columnTypes));\n            const ordinalMap = (0, $70eaad7e9e4ac896$export$f03cc77b21b3a2b2)(this._specColumns, data, renderOptions.ordinalMap);\n            this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n            this.insight = $c5578f8838abba3d$exports.clone(insight);\n            this.setup = setup;\n            this._shouldSaveColorContext = ()=>!renderOptions.initialColorContext;\n            const colorContext = renderOptions.initialColorContext || {\n                colorMap: null,\n                legend: null,\n                legendElement: null\n            };\n            const specResult = yield this.renderNewLayout(insight.signalValues, Object.assign(Object.assign({}, setup || {}), {\n                preStage: (stage, cubeLayer)=>{\n                    if (this._shouldSaveColorContext()) //save off the colors from Vega layout\n                    colorContext.colorMap = cubeLayer.unitColorMap;\n                    else //apply passed colorContext\n                    cubeLayer.unitColorMap = colorContext.colorMap;\n                    //if items are selected, repaint\n                    const hasSelectedData = !!this._dataScope.hasSelectedData();\n                    //const hasActive = !!this._dataScope.active;\n                    hasSelectedData || this._dataScope.active;\n                    this.preStage(stage, cubeLayer);\n                },\n                onPresent: ()=>{\n                    if (this._shouldSaveColorContext()) {\n                        (0, $d862cbedfe5e328a$export$44addeff9a96c1e7)(colorContext, this.presenter);\n                        this.changeColorContexts([\n                            colorContext\n                        ]);\n                    } else //apply passed colorContext\n                    this.applyLegendColorContext(colorContext);\n                    this.onPresent();\n                },\n                shouldViewstateTransition: ()=>this.shouldViewstateTransition(insight, this.insight)\n            }), this.getView(insight.view));\n            //future signal changes should save the color context\n            this._shouldSaveColorContext = ()=>!renderOptions.discardColorContextUpdates || !renderOptions.discardColorContextUpdates();\n            this._details.render();\n            const result = {\n                ordinalMap: ordinalMap,\n                specResult: specResult\n            };\n            return result;\n        });\n    }\n    overrideAxisLabels(stage) {\n    // if (this._specColumns.x && this._specColumns.x.type === 'date') {\n    //     stage.axes.x.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.x)\n    //     ));\n    // }\n    // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n    //     stage.axes.y.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.y)\n    //     ));\n    // }\n    }\n    preLayer(stage) {\n        //convert ticks\n        let axisRole;\n        for(axisRole in stage.axes){\n            const capability = this.specCapabilities.roles.filter((r)=>r.role === axisRole)[0];\n            if (capability && (capability.axisSelectionBetweenTicks || capability.axisSelection === 'exact')) (0, $a696a51a900f8bbc$export$abaa25886c91cb0e)(stage.axes[axisRole]);\n        }\n    }\n    preStage(stage, cubeLayer) {\n        this.overrideAxisLabels(stage);\n        this._axisSelection = new (0, $a696a51a900f8bbc$export$b4d41fd4fcc19c)(this.specCapabilities, this._specColumns, stage);\n        (0, $5c5541ba560b58df$export$71ab65a966760ac3)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n        if (this.options.onStage) this.options.onStage(stage);\n    }\n    onCubeClick(e, cube) {\n        this.options.onCubeClick && this.options.onCubeClick(e, cube);\n        const hasSelectedData = this._dataScope.hasSelectedData();\n        if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n            //if active is within selection, keep the selection and activate the one.\n            const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n            if (indexWithinSelection.index >= 0) {\n                this.activate(indexWithinSelection.datum);\n                this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                if (this.options.onSelectionChanged) {\n                    const sel = this.getSelection();\n                    this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                }\n                return;\n            }\n        }\n        if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][0, $44b8bb162b63b5b5$export$5672246984822a29] === cube.ordinal) {\n            this.deselect();\n            return;\n        }\n        const search = {\n            name: (0, $44b8bb162b63b5b5$export$5672246984822a29),\n            operator: '==',\n            value: cube.ordinal\n        };\n        this.select(search);\n    }\n    onCubeHover(event, cube) {\n        var _a, _b;\n        if (this._tooltip) {\n            this._tooltip.destroy();\n            this._tooltip = null;\n        }\n        if (!cube) return;\n        const currentData = this._dataScope.currentData();\n        const index = (0, $70eaad7e9e4ac896$export$5844459bbee68321)(cube, currentData);\n        if (index >= 0) {\n            const dataItem = (0, $40d5ab22242de7d1$export$ce0d7ac3b25f14e3)(((_a = this.options.tooltipOptions) === null || _a === void 0 ? void 0 : _a.prepareDataItem(currentData[index])) || currentData[index]);\n            const tooltipCreateOptions = {\n                dataItem: dataItem,\n                event: event\n            };\n            if ((_b = this.options.tooltipOptions) === null || _b === void 0 ? void 0 : _b.create) this._tooltip = this.options.tooltipOptions.create(tooltipCreateOptions);\n            else this._tooltip = new (0, $40d5ab22242de7d1$export$28c660c63b792dea)(Object.assign(Object.assign({}, tooltipCreateOptions), {\n                cssPrefix: this.presenter.style.cssPrefix\n            }));\n        }\n    }\n    onTextHover(e, t) {\n        //return true if highlight color is different\n        if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor) return false;\n        return !$c5578f8838abba3d$exports.colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n    }\n    getMorphChartsColors() {\n        const { colors: colors } = this.options;\n        return {\n            activeItemColor: colors.activeCube,\n            axesGridBackgroundColor: colors.backgroundColor,\n            axesGridHighlightColor: colors.axisSelectHighlight,\n            axesGridMajorColor: colors.gridLine,\n            axesGridMinorColor: colors.gridLine,\n            axesGridZeroColor: colors.gridLine,\n            axesTextHeadingColor: colors.axisText,\n            axesTextLabelColor: colors.axisText,\n            axesTextTitleColor: colors.axisText,\n            backgroundColor: colors.backgroundColor,\n            textBorderColor: colors.backgroundColor,\n            textColor: colors.axisText\n        };\n    }\n    createConfig(c) {\n        var _a;\n        const { getTextColor: getTextColor, getTextHighlightColor: getTextHighlightColor, onTextClick: onTextClick } = this.options;\n        const defaultPresenterConfig = {\n            morphChartsColors: this.getMorphChartsColors(),\n            zAxisZindex: $6662f126c1d9f58b$var$zAxisZindex,\n            getCharacterSet: (stage)=>this._characterSet.getCharacterSet(stage),\n            getTextColor: getTextColor,\n            getTextHighlightColor: getTextHighlightColor,\n            onTextClick: (e, t)=>{\n                if (t.metaData && t.metaData.search) {\n                    //used by facets to select the facet\n                    const search = (0, $a52b757f33a54d2e$export$cb06c97de370398d)(t.metaData.search);\n                    if (this.options.onAxisClick) this.options.onAxisClick(e, search);\n                    else this.select(search);\n                }\n                if (onTextClick) onTextClick(e, t);\n            },\n            onCubeClick: this.onCubeClick.bind(this),\n            onCubeHover: this.onCubeHover.bind(this),\n            onTextHover: this.onTextHover.bind(this),\n            preLayer: this.preLayer.bind(this),\n            preStage: this.preStage.bind(this),\n            onPresent: this.onPresent.bind(this),\n            onAxisConfig: (cartesian, dim3d, axis)=>{\n                if (!axis) return;\n                const role = this.specCapabilities.roles.filter((r)=>r.role === axis.axisRole)[0];\n                if (role === null || role === void 0 ? void 0 : role.axisSelection) {\n                    cartesian.isDivisionPickingEnabled[dim3d] = true;\n                    cartesian.arePickDivisionsVisible[dim3d] = axis.tickText.length > 0;\n                    cartesian.isLabelPickingEnabled[dim3d] = true;\n                    cartesian.isTitlePickingEnabled[dim3d] = true;\n                    cartesian.isHeadingPickingEnabled[dim3d] = true;\n                    cartesian.isGridPickingEnabled = false;\n                }\n            },\n            onAxesComplete: (cartesian)=>{},\n            axisPickGridCallback: (divisions, e)=>{\n                const search = this._axisSelection.convert(divisions);\n                if (this.options.onAxisClick) this.options.onAxisClick(e, search); //TODO change onAxisClick to accept Search\n                else this.select(search);\n            },\n            onLayerClick: (e)=>{\n                this.options.onCanvasClick && this.options.onCanvasClick(e);\n                this.deselect();\n            },\n            onLegendClick: (e, legend, clickedIndex)=>{\n                const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n                if (legendRow) {\n                    if (this.options.onLegendRowClick) this.options.onLegendRowClick(e, legendRow);\n                    else this.select(legendRow.search);\n                } else if (this.options.onLegendHeaderClick) //header clicked\n                this.options.onLegendHeaderClick(e);\n            },\n            onSceneRectAssignCubeOrdinal: (datum)=>{\n                //TODO see if datum is a facet selection rect\n                return datum[0, $44b8bb162b63b5b5$export$5672246984822a29];\n            },\n            onTargetViewState: (h, w)=>{\n                const { height: height, width: width } = this.insight.size;\n                let newViewStateTarget;\n                if (this.options.onNewViewStateTarget) newViewStateTarget = this.options.onNewViewStateTarget();\n                return {\n                    height: height,\n                    width: width,\n                    newViewStateTarget: newViewStateTarget\n                };\n            },\n            layerSelection: {\n                cubes: this.convertSearchToSet()\n            },\n            preserveDrawingBuffer: this.options.preserveDrawingBuffer\n        };\n        if (!this.options.disableLasso) defaultPresenterConfig.onLasso = (ids, e)=>{\n            this.deselect();\n            const search = this.convertSetToSearch(ids);\n            this.select(search);\n        };\n        if (this.options.onBeforeCreateLayers) defaultPresenterConfig.preLayer = (stage)=>{\n            this.preLayer(stage);\n            this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n        };\n        const config = {\n            presenter: this.presenter,\n            presenterConfig: Object.assign(defaultPresenterConfig, c)\n        };\n        if ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transitionDurations) config.presenterConfig.transitionDurations = this.setup.transitionDurations;\n        return config;\n    }\n    /**\n     * Filter the data and animate.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n     */ filter(search, rebase = false) {\n        const u = this._dataScope.createUserSelection(search, false, rebase);\n        return new Promise((resolve, reject)=>{\n            this._animator.filter(search, u.included, u.excluded, rebase).then(()=>{\n                this._details.clear();\n                this._details.clearSelection();\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n    /**\n     * Remove any filtration and animate.\n     */ reset() {\n        return new Promise((resolve, reject)=>{\n            this._animator.reset().then(()=>{\n                this._details.clear();\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Select cubes by a filter expression.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     */ select(search) {\n        return new Promise((resolve, reject)=>{\n            this._animator.select(search).then(()=>{\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n    /**\n     * Removes any selection.\n     */ deselect() {\n        return new Promise((resolve, reject)=>{\n            this._animator.deselect().then(()=>{\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Gets the current selection.\n     */ getSelection() {\n        if (!this._dataScope) return null;\n        const selectionState = {\n            search: this._dataScope.selection && this._dataScope.selection.search || null,\n            selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n            active: this._dataScope.active\n        };\n        return selectionState;\n    }\n    /**\n     * Set one data row to the active state.\n     */ activate(datum) {\n        return new Promise((resolve, reject)=>{\n            this._animator.activate(datum).then(()=>{\n                this.presenter.morphChartsRenderResult.activate(datum[0, $44b8bb162b63b5b5$export$5672246984822a29]);\n                this._details.render();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Deactivate item.\n     */ deActivate() {\n        return new Promise((resolve, reject)=>{\n            if (this._dataScope && this._dataScope.active) this._animator.deactivate().then(()=>{\n                this.presenter.morphChartsRenderResult.activate(-1);\n                this._details.render();\n                resolve();\n            });\n            else resolve();\n        });\n    }\n    /**\n     * Gets the current camera.\n     * @param transitionFinal Optional flag to get camera destination when transition completes.\n     */ getCamera(transitionFinal = false) {\n        var _a, _b, _c, _d, _e, _f, _g;\n        let position = [\n            0,\n            0,\n            0\n        ];\n        let rotation = [\n            0,\n            0,\n            0,\n            0\n        ];\n        if (transitionFinal) {\n            position = Array.from((_b = (_a = this.presenter) === null || _a === void 0 ? void 0 : _a.morphchartsref) === null || _b === void 0 ? void 0 : _b.cameraTransitioner.vPosition.to);\n            rotation = Array.from((_d = (_c = this.presenter) === null || _c === void 0 ? void 0 : _c.morphchartsref) === null || _d === void 0 ? void 0 : _d.cameraTransitioner.qRotation.to);\n        } else {\n            const camera = (_g = (_f = (_e = this.presenter) === null || _e === void 0 ? void 0 : _e.morphchartsref) === null || _f === void 0 ? void 0 : _f.core) === null || _g === void 0 ? void 0 : _g.camera;\n            if (camera) {\n                camera.getPosition(position);\n                camera.getOrbit(rotation);\n            }\n        }\n        return {\n            position: position,\n            rotation: rotation,\n            captureSize: this.insight.size\n        };\n    }\n    /**\n     * Sets the current camera.\n     * @param camera Camera to set.\n     */ setCamera(camera) {\n        var _a, _b;\n        if (camera) (_b = (_a = this.presenter) === null || _a === void 0 ? void 0 : _a.morphChartsRenderResult) === null || _b === void 0 || _b.moveCamera(camera);\n    }\n    /**\n     * Gets the current insight with signal values.\n     */ getInsight() {\n        const insight = Object.assign({}, this.insight);\n        insight.signalValues = this.getSignalValues();\n        return insight;\n    }\n    /**\n     * Gets column stats from current data (filtered or all).\n     * @param column Column to get stats for.\n     */ getColumnStats(column) {\n        return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n    }\n    /**\n     * Gets current signal values.\n     */ getSignalValues() {\n        return (0, $6728ad2e40252478$export$764590c093441ac7)(this.vegaViewGl, this.vegaSpec);\n    }\n    assignTransitionStagger(transition) {\n        (0, $099aaea57d9dcbf4$export$2be97f482a239d30)(transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n    }\n    finalize() {\n        if (this._dataScope) this._dataScope.finalize();\n        if (this._details) this._details.finalize();\n        if (this._tooltip) this._tooltip.destroy();\n        if (this.vegaViewGl) this.vegaViewGl.finalize();\n        if (this.presenter) this.presenter.finalize();\n        if (this.element) this.element.innerHTML = '';\n        this.colorContexts = null;\n        this.element = null;\n        this.options = null;\n        this.presenter = null;\n        this.vegaSpec = null;\n        this.vegaViewGl = null;\n        this._animator = null;\n        this._dataScope = null;\n        this._details = null;\n        this._tooltip = null;\n    }\n}\n/**\n * Default Viewer options.\n */ $6662f126c1d9f58b$export$2ec4afd9b3c16a85.defaultViewerOptions = (0, $16f9e3e56a5dcd59$export$fb736e4909afb3d7);\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $59c3ac7cbbe40380$export$83d89fbfd8236492 = '4.0.6';\n\n\nconst $1342cf7df79546f0$export$1f96ae73734a86cc = (0, $94b078fc391e7135$export$1f96ae73734a86cc);\n\n\nvar $e295d8097c1ad61a$exports = {};\n\n$parcel$export($e295d8097c1ad61a$exports, \"classList\", () => $e295d8097c1ad61a$export$11c615ce16f87241);\n$parcel$export($e295d8097c1ad61a$exports, \"deepCompare\", () => $e295d8097c1ad61a$export$e12301e595e16ad8);\n$parcel$export($e295d8097c1ad61a$exports, \"compareInsight\", () => $e295d8097c1ad61a$export$62baf1cd3780635c);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $0e23dbf070c5d238$exports = {};\n\n$parcel$defineInteropFlag($0e23dbf070c5d238$exports);\n\n$parcel$export($0e23dbf070c5d238$exports, \"default\", () => $0e23dbf070c5d238$export$2e2bcd8739ae039);\nvar $0e23dbf070c5d238$export$2e2bcd8739ae039 = $0e23dbf070c5d238$var$compare;\n/*\n  primitives: value1 === value2\n  functions: value1.toString == value2.toString\n  arrays: if length, sequence and values of properties are identical\n  objects: if length, names and values of properties are identical\n  compare([[1, [2, 3]], [[1, [2, 3]]); // true\n  compare([[1, [2, 3], 4], [[1, [2, 3]]); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3}); // true\n  compare({a: 2, b: 3}, {b: 3, a: 2}); // true\n  compare({a: 2, b: 3, c: 4}, {a: 2, b: 3}); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3, c: 4}); // false\n  compare([[1, [2, {a: 4}], 4], [[1, [2, {a: 4}]]); // true\n*/ function $0e23dbf070c5d238$var$compare(value1, value2) {\n    if (value1 === value2) return true;\n    /* eslint-disable no-self-compare */ // if both values are NaNs return true\n    if (value1 !== value1 && value2 !== value2) return true;\n    if (({}).toString.call(value1) != ({}).toString.call(value2)) return false;\n    if (value1 !== Object(value1)) // non equal primitives\n    return false;\n    if (!value1) return false;\n    if (Array.isArray(value1)) return $0e23dbf070c5d238$var$compareArrays(value1, value2);\n    if (({}).toString.call(value1) == '[object Set]') return $0e23dbf070c5d238$var$compareArrays(Array.from(value1), Array.from(value2));\n    if (({}).toString.call(value1) == '[object Object]') return $0e23dbf070c5d238$var$compareObjects(value1, value2);\n    else return $0e23dbf070c5d238$var$compareNativeSubtypes(value1, value2);\n}\nfunction $0e23dbf070c5d238$var$compareNativeSubtypes(value1, value2) {\n    // e.g. Function, RegExp, Date\n    return value1.toString() === value2.toString();\n}\nfunction $0e23dbf070c5d238$var$compareArrays(value1, value2) {\n    var len = value1.length;\n    if (len != value2.length) return false;\n    var alike = true;\n    for(var i = 0; i < len; i++)if (!$0e23dbf070c5d238$var$compare(value1[i], value2[i])) {\n        alike = false;\n        break;\n    }\n    return alike;\n}\nfunction $0e23dbf070c5d238$var$compareObjects(value1, value2) {\n    var keys1 = Object.keys(value1).sort();\n    var keys2 = Object.keys(value2).sort();\n    var len = keys1.length;\n    if (len != keys2.length) return false;\n    for(var i = 0; i < len; i++){\n        var key1 = keys1[i];\n        var key2 = keys2[i];\n        if (!(key1 == key2 && $0e23dbf070c5d238$var$compare(value1[key1], value2[key2]))) return false;\n    }\n    return true;\n}\n\n\nconst $e295d8097c1ad61a$export$11c615ce16f87241 = (...args)=>{\n    return args.filter(Boolean).join(' ');\n};\nconst $e295d8097c1ad61a$export$e12301e595e16ad8 = $0e23dbf070c5d238$exports.default || $0e23dbf070c5d238$exports;\nfunction $e295d8097c1ad61a$var$addNullable(insight, signalValues) {\n    const withNulls = Object.assign(Object.assign({\n        view: null,\n        filter: null\n    }, insight), {\n        signalValues: signalValues\n    });\n    return withNulls;\n}\nfunction $e295d8097c1ad61a$export$62baf1cd3780635c(viewer, insight) {\n    const currentInsight = viewer.getInsight();\n    const a = $e295d8097c1ad61a$var$addNullable(currentInsight, Object.assign(Object.assign({}, viewer.insight.signalValues), currentInsight.signalValues));\n    const b = $e295d8097c1ad61a$var$addNullable(insight, Object.assign(Object.assign({}, a.signalValues), insight.signalValues));\n    const compare = $e295d8097c1ad61a$export$e12301e595e16ad8(a, b);\n    return {\n        a: a,\n        b: b,\n        compare: compare\n    };\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nconst $a94804e25c3acfaf$export$e2253033e6e1df16 = {\n    react: null,\n    reactDOM: null\n};\nfunction $a94804e25c3acfaf$export$1f96ae73734a86cc(react, reactDOM, vega) {\n    $e296aaf527fc4d25$exports.use(vega);\n    $a94804e25c3acfaf$export$e2253033e6e1df16.react = react;\n    $a94804e25c3acfaf$export$e2253033e6e1df16.reactDOM = reactDOM;\n    //inform React that we are using a dynamic base class\n    (0, $7a3dcfea67f8da12$export$2ec4afd9b3c16a85).prototype = react.Component.prototype;\n}\n\n\n\n\nfunction $7a3dcfea67f8da12$var$_Viewer(_props) {\n    class __Viewer extends (0, $a94804e25c3acfaf$export$e2253033e6e1df16).react.Component {\n        layout() {\n            const { props: props } = this;\n            this.lastData = props.data;\n            this.viewer.render({\n                insight: props.insight,\n                setup: props.setup\n            }, props.data, props.renderOptions).then((renderResult)=>{\n                //TODO: show errors if any\n                //console.log('viewer render');\n                props.onView && props.onView(renderResult);\n            }).catch((e)=>{\n                //console.log('viewer error');\n                props.onError && props.onError(e);\n            });\n        }\n        view() {\n            var _a, _b, _c, _d, _e;\n            const { props: props } = this;\n            let didLayout = false;\n            if (props.insight && props.data) {\n                const c = (0, $e295d8097c1ad61a$export$62baf1cd3780635c)(this.viewer, props.insight);\n                const sameDataRef = props.data === this.lastData;\n                if (!c.compare || !sameDataRef) {\n                    this.layout();\n                    didLayout = true;\n                }\n            }\n            if (!didLayout && props.setup) {\n                const { camera: camera } = props.setup;\n                //compare setup, move camera\n                if (camera !== 'hold') {\n                    if (!(0, $e295d8097c1ad61a$export$e12301e595e16ad8)(this.viewer.setup.camera, camera)) {\n                        //camera is different\n                        if (!camera) (_b = (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.presenter) === null || _b === void 0 || _b.homeCamera();\n                        else this.viewer.setCamera(camera);\n                        //save this for next comparison\n                        const setup = (0, $e296aaf527fc4d25$exports).util.clone(this.viewer.setup);\n                        setup.camera = camera;\n                        this.viewer.setup = setup;\n                    }\n                }\n                if (props.setup.renderer) (_e = (_d = (_c = this.viewer) === null || _c === void 0 ? void 0 : _c.presenter) === null || _d === void 0 ? void 0 : _d.morphchartsref) === null || _e === void 0 || _e.setMorphChartsRendererOptions(props.setup.renderer);\n            }\n        }\n        componentDidMount() {\n            const { props: props } = this;\n            const element = (0, $a94804e25c3acfaf$export$e2253033e6e1df16).reactDOM.findDOMNode(this.viewerDiv);\n            this.viewer = new (0, $6662f126c1d9f58b$export$2ec4afd9b3c16a85)(element, props.viewerOptions);\n            if (props.onMount) {\n                if (props.onMount(this.viewer.presenter.getElement((0, $e296aaf527fc4d25$exports).PresenterElement.gl))) this.view();\n            } else this.view();\n        }\n        componentDidUpdate() {\n            const { props: props } = this;\n            this.viewer.options = (0, $e296aaf527fc4d25$exports).util.deepMerge(this.viewer.options, props.viewerOptions);\n            this.view();\n        }\n        componentWillUnmount() {\n            this.viewer.finalize();\n        }\n        render() {\n            return (0, $a94804e25c3acfaf$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-ReactViewer\",\n                ref: (div)=>this.viewerDiv = div\n            });\n        }\n    }\n    return new __Viewer(_props);\n}\nconst $7a3dcfea67f8da12$export$2ec4afd9b3c16a85 = $7a3dcfea67f8da12$var$_Viewer;\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $d76008c8107bb02f$export$83d89fbfd8236492 = '4.0.2';\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $d5b6ce321475881f$export$21c51bc433c16634 = {\n    appName: 'SandDance',\n    bingsearch: 'Bing',\n    bingsearchDescription: (term)=>`Search Bing for \"${term}\"`,\n    buttonClose: 'Close',\n    buttonSelect: 'Search & Select',\n    buttonColorSchemeMap: 'Map color scheme to filtered data',\n    buttonColorSchemeRemap: 'Remap color to filtered data',\n    buttonColorSchemeKeep: 'Keep same color scheme',\n    buttonCopyToClipboard: 'Copy to clipboard',\n    buttonExclude: 'Exclude',\n    buttonExport: 'Export',\n    buttonExportCount: (total)=>total == 1 ? 'Export 1 row...' : `Export ${total} rows...`,\n    buttonIsolate: 'Isolate',\n    buttonReset: 'Stop filtering',\n    buttonDeselect: 'Clear selection',\n    buttonToolbarFloat: 'Float toolbar',\n    buttonToolbarDock: 'Dock toolbar',\n    buttonToolbarHide: 'Hide toolbar',\n    buttonToolbarShow: 'Show toolbar',\n    buttonNextDataItem: 'Next data item',\n    buttonPrevDataItem: 'Previous data item',\n    buttonCreateSnapshot: 'Create snapshot',\n    buttonNextSnapshot: 'Next snapshot',\n    buttonPrevSnapshot: 'Previous snapshot',\n    buttonUpdateSnapshot: 'Update snapshot',\n    buttonAddExpression: 'Add expression',\n    buttonAddExpressionGroup: 'Add group',\n    buttonDeleteExpression: 'Delete',\n    buttonDeleteExpressionGroup: 'Delete group',\n    buttonClearSnapshots: 'Clear snapshots',\n    buttonDeleteSnapshot: 'Delete snapshot',\n    buttonEditSnapshot: 'Edit snapshot',\n    buttonMoveUp: 'Move up',\n    buttonMoveDown: 'Move down',\n    buttonShowVegaSpec: 'Show Vega spec',\n    buttonLaunchVegaEditor: 'Open Vega Editor',\n    buttonCameraHome: 'Center chart in window',\n    buttonTooltipMapping: 'Tooltip columns...',\n    buttonBackgroundImage: 'Background image...',\n    buttonTransitionReverse: 'Play Reverse',\n    buttonTransitionPause: 'Pause',\n    buttonTransitionPlay: 'Play',\n    buttonUndo: 'Undo',\n    buttonRedo: 'Redo',\n    buttonColumnTypes: 'Column types...',\n    buttonApply: 'Apply',\n    buttonRemove: 'Remove',\n    buttonResetToDefault: 'Reset to default',\n    chartTypeBarChartH: 'Bar',\n    chartTypeBarChartV: 'Column',\n    chartTypeDensity: 'Density',\n    chartTypeGrid: 'Grid',\n    chartTypeScatterPlot: 'Scatter',\n    chartTypeStacks: 'Stacks',\n    chartTypeStrips: 'Strips',\n    chartTypeTreeMap: 'Treemap',\n    defaultFileName: 'sanddance-data',\n    errorExportFilenameEmpty: 'Filename cannot be blank',\n    errorExportFilenameCharacters: (characters)=>`A filename cannot contain any of the following characters: ${characters}`,\n    errorColumnMustBeNumeric: 'Numeric column required for this chart type.',\n    errorNumericValue: 'Value must be numeric',\n    errorImageFormat: 'File is not an image',\n    labelBackgroundImageDialogTitle: 'Background image',\n    labelBackgroundImageSubtext: 'Background image can only be shown on Scatterplot, Density, and Stacks charts. Columns must be numeric type.',\n    labelBackgroundLeft: 'Left extent',\n    labelBackgroundRight: 'Right extent',\n    labelBackgroundBottom: 'Bottom extent',\n    labelBackgroundTop: 'Top extent',\n    labelBlank: 'blank',\n    labelNull: 'null',\n    labelTrue: 'true',\n    labelFalse: 'false',\n    labelSystemInfo: 'System info',\n    labelChangeColumnType: 'Change column type',\n    labelChartSettings: 'Chart settings',\n    labelEditColumn: 'Edit',\n    labelColumnName: 'Column name',\n    labelColumnType: 'Column type',\n    labelColumnDistinct: 'Distinct values',\n    labelColumnHasColorData: 'Has color data',\n    labelColumnIsColorData: 'Is color data',\n    labelColumnQuantitativeMin: 'Min',\n    labelColumnQuantitativeMax: 'Max',\n    labelColumnQuantitativeMean: 'Mean',\n    labelDataBrowser: 'Data browser',\n    labelDataScope: 'Scope',\n    labelExport: 'Export Data',\n    labelExportFormat: 'File format',\n    labelExportCSV: '.CSV - Comma separated values',\n    labelExportHTML: '.HTML - A SandDance html page embedding this data',\n    labelExportJSON: '.JSON - JavaScript object notation',\n    labelExportTSV: '.TSV - Tab separated values',\n    labelHistory: 'History',\n    labelHistoryWarning: 'This will erase your current history.',\n    labelTools: 'Tools',\n    labelHoldCamera: 'Keep previous camera position',\n    labelVegaSpec: 'Vega specification',\n    labelColor: 'Chart color',\n    labelError: 'Error',\n    labelExportFileName: 'File name',\n    labelSnapshots: 'Snapshots',\n    labelSnapshotSettingThumbnailWidth: 'Thumbnail image width',\n    labelSearch: 'Select by search',\n    labelSearchClause: 'Clause',\n    labelSearchColumn: 'Field',\n    labelSearchOperator: 'Operator',\n    labelSearchValue: 'Value',\n    labelSearchValuePlaceholder: 'Value to search for',\n    labelChart: 'Chart',\n    labelChartCanvas: 'Chart canvas',\n    labelColumnMapping: 'Column Mapping',\n    labelChartTypeOptions: 'Chart options',\n    labelColorBin: 'Color binning',\n    labelColorOptions: 'Color options',\n    labelColorBinExplanation: 'For numeric columns',\n    labelColorFieldInfo: (colorColumnName, colorColumnType, categoricalNumeric, distinctValueCount)=>`Field <span className=\"fieldname\">${colorColumnName}</span> is of type <span className=\"fieldtype\">${colorColumnType}</span>${categoricalNumeric ? ` and has ${distinctValueCount} distinct values` : ''}.`,\n    labelColorFieldIsColorData: (colorColumnName)=>`Field <span className=\"fieldname\">${colorColumnName}</span> contains direct color data.`,\n    labelColorBinNone: 'None (continuous)',\n    labelColorBinQuantize: 'Quantize',\n    labelColorBinQuantile: 'Quantile',\n    labelColorFilter: 'Note: Colors will be re-mapped to the filter when viewing this snapshot.',\n    labelColorScheme: 'Scheme',\n    labelTotal: 'Total by',\n    labelTotalByCountSquare: 'Count (Grid layout)',\n    labelTotalByCountStrip: 'Count (Strip layout)',\n    labelTotalBySumStrip: 'Sum (Strip layout)',\n    labelTotalBySumTreemap: 'Sum (Treemap layout)',\n    labelTotalBySumStripPercent: 'Sum as percentage (Strip layout)',\n    labelColumnColor: 'Color by',\n    labelColumnFacet: 'Facet by',\n    labelFacetLayout: 'Facet layout',\n    labelFacetLayoutWrap: 'Wrap',\n    // labelFacetLayoutHorizontal: 'Horizontal',\n    // labelFacetLayoutVertical: 'Vertical',\n    labelFacetLayoutCross: \"\\u229E\",\n    labelColumnFacetV: 'Cross facet by',\n    labelColumnSort: 'Sort by',\n    labelColumnX: 'X Axis',\n    labelColumnY: 'Y Axis',\n    labelColumnZ: 'Z Axis',\n    labelColumnSize: 'Size by',\n    labelColumnGroup: 'Group by',\n    labelAliasColor: 'Color',\n    labelAliasFacet: 'Facet',\n    labelAliasFacetV: 'Vertical facet',\n    labelAliasSort: 'Sort',\n    labelAliasX: 'X Axis',\n    labelAliasY: 'Y Axis',\n    labelAliasZ: 'Z Axis',\n    labelAliasSize: 'Size',\n    labelAliasGroup: 'Group',\n    labelDataItemIsFiltered: 'Item is filtered from view',\n    labelHistoryInit: 'Initial view',\n    labelHistoryFilterClear: 'Clear filter',\n    labelHistoryFilterIExclude: 'Exclude filter',\n    labelHistoryFilterIsolate: 'Isolate filter',\n    labelHistoryChangeChartType: (chart)=>`Change chart type to ${chart}`,\n    labelHistoryMapColumn: (column)=>`Map ${column} role`,\n    labelHistoryUnMapColumn: (column)=>`Unmap ${column} role`,\n    labelHistoryReviveSnapshot: 'Revive snapshot',\n    labelHistoryColorBin: 'Change color binning',\n    labelHistoryDirectColor: 'Change direct color',\n    labelRenderer: 'Renderer quality',\n    labelRendererAdvancedDisabled: 'Renderer quality (Enhanced 3D mode not supported on this device)',\n    labelRendererBasic: 'Standard mode',\n    labelRendererAdvanced: 'Enhanced 3D mode',\n    labelRendererOptions: 'Renderer options ...',\n    labelRendererOptionsDialogTitle: 'Renderer options',\n    labelRendererOptionsAntialias: 'Antialias',\n    labelRendererOptionsBloom: 'Bloom highlighting (for selections)',\n    labelRendererOptionsBloomIntensity: 'Intensity',\n    labelRendererOptionsDof: 'Depth of Field',\n    labelRendererOptionsDofRange: 'Focus Range',\n    labelRendererOptionsFxaa: 'Antialias',\n    labelRendererOptionsShadow: 'Shadows',\n    labelRendererOptionsSsao: 'Screen Space Ambient Occlusion',\n    labelShowLegend: 'Show legend',\n    labelShowAxes: 'Show axes',\n    labelSnapshotTitle: 'Title',\n    labelSnapshotDescription: 'Note (optional)',\n    labelTooltipMapping: 'Tooltip columns',\n    labelTransition: 'Transition',\n    labelTransitionOptions: 'Transition options',\n    labelTransitionScrubber: 'Scrub transition',\n    labelTransitionStaggerBy: 'Stagger by',\n    labelTransitionStaggerByOrdinal: 'Data order',\n    labelTransitionStaggerByColumn: 'Column',\n    labelTransitionStaggerByPosition: 'Axis position',\n    labelTransitionStaggerOptions: 'Stagger options',\n    labelTransitionStaggerReverse: 'Reverse',\n    labelTransitionDurations: 'Transition durations',\n    labelTransitionCamera: '2D / 3D view',\n    labelTransitionDuration: 'Duration',\n    labelTransitionStagger: 'Stagger',\n    labelVegaSpecData: 'Data reference',\n    labelVegaSpecNotes: 'Note: You may need to change the color scheme to make this visible in Vega.',\n    labelYes: 'Yes',\n    labelNo: 'No',\n    labelConfirmation: 'Are you sure?',\n    labelColumnTypes: 'Column types',\n    loading: 'Loading...',\n    schemeCategorical: 'Categorical',\n    schemeCyclical: 'Cyclical',\n    schemeDiverging: 'Diverging',\n    schemeDual: 'Dual',\n    schemeSequentialMultiHue: 'Sequential Multi Hue',\n    schemeSequentialMultiHueDark: 'For dark backgrounds',\n    schemeSequentialMultiHueLight: 'For light backgrounds',\n    schemeSequentialSingleHue: 'Sequential Single Hue',\n    selectDataSpanAll: 'All rows',\n    selectDataSpanFilter: 'Filtered',\n    selectDataSpanSelection: 'Selected',\n    selectVegaSpecDataNone: 'None',\n    selectVegaSpecDataInline: 'Inline - WARNING this may use substantial browser/clipboard memory for large data sets.',\n    selectVegaSpecDataUrl: 'URL',\n    record: (current, total)=>`${current} of ${total}`,\n    searchEQ: '=',\n    searchNEQ: '<>',\n    searchGT: '>',\n    searchGTE: '>=',\n    searchLT: '<',\n    searchLTE: '<=',\n    searchNULL: 'is null or empty',\n    searchIN: 'contains',\n    searchSW: 'starts with',\n    searchWHERE: 'Where',\n    searchAND: 'and',\n    searchOR: 'or',\n    selectAny: '-- any --',\n    selectNone: '-- none --',\n    selectNumeric: 'Numeric',\n    selectNonNumeric: 'Categorical',\n    selectDirectColor: 'Direct color',\n    selectReference: 'Column mappings',\n    tooltipSearch: (column, value)=>`Click to search in '${column}' for \"${value}\"`,\n    labelRequired: 'required',\n    labelSystem: 'System',\n    labelViewType2d: 'View in 2D',\n    labelViewType3d: 'View in 3D',\n    labelDataColors: 'Enabled if this data column contains any CSS color values.',\n    labelDataNullAll: 'Loading data...',\n    labelDataNullFiltered: 'You can filter by first making a selection, then choosing <b>Isolate</b> or <b>Exclude</b> in the top bar.',\n    labelDataNullSelection: 'You can select by: <ul><li>clicking the chart axes</li><li>clicking in the legend</li><li>searching</li</ul>',\n    labelZeroAll: 'Dataset contains zero rows.',\n    labelZeroSearchResults: 'No rows matched your search.',\n    signalGroups: [\n        {\n            prefix: 'Chart',\n            label: 'Chart options'\n        },\n        {\n            prefix: 'Mark',\n            label: 'Mark options'\n        },\n        {\n            prefix: 'RoleColor',\n            label: 'Color options'\n        },\n        {\n            prefix: 'RoleFacet',\n            label: 'Facet options'\n        },\n        {\n            prefix: 'RoleSort',\n            label: 'Sort options'\n        },\n        {\n            prefix: 'RoleX',\n            label: 'X axis options'\n        },\n        {\n            prefix: 'RoleY',\n            label: 'Y axis options'\n        },\n        {\n            prefix: 'RoleZ',\n            label: 'Z axis options'\n        },\n        {\n            prefix: 'Text',\n            label: 'Text options'\n        },\n        {\n            prefix: '*',\n            label: 'Options'\n        }\n    ],\n    percentValueFormat: (value)=>`${value}%`\n};\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $baf9c68afdd76912$export$c25acd513dcc8062(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.IconButton, Object.assign({}, props, {\n        styles: props.styles || {\n            root: {\n                color: props.themePalette.black\n            },\n            rootHovered: {\n                background: 'transparent',\n                color: props.themePalette.themePrimary\n            },\n            rootPressed: {\n                background: 'transparent'\n            },\n            menuIcon: {\n                display: 'none'\n            }\n        },\n        iconProps: {\n            iconName: props.iconName\n        },\n        menuProps: props.menuProps\n    }));\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $1bd1c9b4aadcc080$export$d4a30c86ebfe9b93 = 20;\nclass $1bd1c9b4aadcc080$export$a4585e6c8aa63810 {\n    constructor(columns, data){}\n}\nfunction $1bd1c9b4aadcc080$export$1ce96159c3ba4e5a(c) {\n    if (c.quantitative) return 'redyellowgreen';\n    else if (c.stats.distinctValueCount === 2) return 'dual_redgreen';\n    else if (c.stats.distinctValueCount <= 10) return 'category10';\n    return 'category20';\n}\n\n\nconst $1b33c7f022f96886$var$maxDistinctVal = 20;\nconst $1b33c7f022f96886$var$minDistinctVal = 2;\nclass $1b33c7f022f96886$export$3f3e73d6f76170d5 {\n    constructor(columns, data){\n        let score = -1;\n        for(let i = 0; i < columns.length; i++){\n            const recommendation = new $1b33c7f022f96886$export$63cf70b2e8d83b38(columns[i], data).recommend();\n            if (recommendation.score > score) {\n                this.best = recommendation;\n                score = recommendation.score;\n            }\n            if (score === 1) break;\n        }\n        for(let k = 0; k < columns.length; k++){\n            const column = columns[k];\n            if (column.name === this.best.columns.x || column.stats.isSequential) continue;\n            if (column.quantitative || column.stats.distinctValueCount < (0, $1bd1c9b4aadcc080$export$d4a30c86ebfe9b93) && column.stats.distinctValueCount > 1) {\n                this.best.columns.color = this.best.columns.sort = column.name;\n                this.best.scheme = (0, $1bd1c9b4aadcc080$export$1ce96159c3ba4e5a)(column);\n                if (column.quantitative) this.best.colorBin = 'quantile';\n                break;\n            }\n        }\n    }\n    recommend() {\n        return this.best;\n    }\n}\nclass $1b33c7f022f96886$export$63cf70b2e8d83b38 {\n    constructor(column, data){\n        this.score = 0;\n        this.column = column;\n        //the total score for bar chart is 1\n        this.rules = [\n            (column)=>{\n                if (column.stats.isSequential) return false;\n                else if (column.quantitative) return true;\n                else if (!column.quantitative && column.stats.distinctValueCount <= $1b33c7f022f96886$var$maxDistinctVal && column.stats.distinctValueCount >= $1b33c7f022f96886$var$minDistinctVal) return true;\n                else return false;\n            }\n        ];\n        for(let i = 0; i < this.rules.length; i++)if (this.rules[i](column)) this.score++;\n    }\n    recommend() {\n        const rec = {\n            chart: 'barchart',\n            columns: {\n                x: this.column.name\n            },\n            score: this.score,\n            scheme: undefined,\n            view: '2d'\n        };\n        return rec;\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ //TODO: languages other than english\nconst $c0be89b17d0e5664$var$longitudeNames = [\n    'lon',\n    'long',\n    'longitude'\n];\nconst $c0be89b17d0e5664$var$latitudeNames = [\n    'lat',\n    'latitude'\n];\nfunction $c0be89b17d0e5664$var$isSpec(names, limits, column, data) {\n    let is = false;\n    const cname = column.name.toLowerCase();\n    for(let i = 0; i < names.length; i++)if (names[i] === cname) {\n        is = true;\n        break;\n    }\n    data;\n    return is;\n}\nfunction $c0be89b17d0e5664$export$b0e111396640b96e(column, data) {\n    return $c0be89b17d0e5664$var$isSpec($c0be89b17d0e5664$var$longitudeNames, [\n        -180,\n        180\n    ], column, data);\n}\nfunction $c0be89b17d0e5664$export$bf99c8928a43a542(column, data) {\n    return $c0be89b17d0e5664$var$isSpec($c0be89b17d0e5664$var$latitudeNames, [\n        -90,\n        90\n    ], column, data);\n}\nfunction $c0be89b17d0e5664$export$e66a5fd74bbd95cc(column, data) {\n    return $c0be89b17d0e5664$export$bf99c8928a43a542(column, data) || $c0be89b17d0e5664$export$b0e111396640b96e(column, data);\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nclass $73347858f569d476$export$15d95472a5608ce4 {\n    constructor(columns, data){\n        const rec = {\n            chart: 'scatterplot',\n            score: undefined,\n            columns: {},\n            scheme: undefined,\n            view: '2d'\n        };\n        columns.forEach((column)=>{\n            if (!rec.columns.x) {\n                if (column.name.toLowerCase() === 'x') return rec.columns.x = column.name;\n                else if ((0, $c0be89b17d0e5664$export$b0e111396640b96e)(column)) return rec.columns.x = column.name;\n            }\n            if (!rec.columns.y) {\n                if (column.name.toLowerCase() === 'y') return rec.columns.y = column.name;\n                else if ((0, $c0be89b17d0e5664$export$bf99c8928a43a542)(column)) return rec.columns.y = column.name;\n            }\n            if (!rec.columns.color && !column.stats.isSequential) {\n                if (column.quantitative || column.stats.distinctValueCount < (0, $1bd1c9b4aadcc080$export$d4a30c86ebfe9b93)) {\n                    rec.columns.color = rec.columns.sort = column.name;\n                    rec.scheme = (0, $1bd1c9b4aadcc080$export$1ce96159c3ba4e5a)(column);\n                    if (column.quantitative) rec.colorBin = 'quantile';\n                    return;\n                }\n            }\n        });\n        if (rec.columns.x && rec.columns.y) this.best = rec;\n    }\n    recommend() {\n        return this.best;\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $2231af94bc7593e4$export$29f7204f5c690e43(columns, strict) {\n    for(let i = 0; i < columns.length; i++){\n        const c = columns[i];\n        if (c.quantitative) {\n            if (strict && c.stats.hasNegative) continue;\n            if (strict && c.stats.isSequential) continue;\n            if (strict && (0, $c0be89b17d0e5664$export$e66a5fd74bbd95cc)(c)) continue;\n            return c;\n        }\n    }\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nclass $431d9b72caa01089$export$28206cc98a74452 {\n    constructor(columns, data){\n        const quickRec = new (0, $73347858f569d476$export$15d95472a5608ce4)(columns, data).recommend();\n        if (quickRec) this.rec = quickRec;\n        else {\n            const barChartrec = new (0, $1b33c7f022f96886$export$3f3e73d6f76170d5)(columns, data).recommend();\n            if (barChartrec && barChartrec.score >= 1) this.rec = barChartrec;\n            else this.rec = {\n                chart: 'grid',\n                columns: {},\n                score: 1\n            };\n        }\n    }\n    recommend() {\n        return this.rec;\n    }\n}\n\n\n\n\n\n\nfunction $cdd6162a40e9c08a$export$1e096674a95fd43b(insightColumns, actualColumns, transform) {\n    //ensure columns exist\n    for(const role in insightColumns){\n        const columnName = insightColumns[role];\n        const column = actualColumns.filter((c)=>c.name === columnName)[0];\n        const transformColumn = transform ? transform.filter((t)=>{\n            switch(t.type){\n                case 'formula':\n                    return t.as === columnName;\n            }\n        })[0] : null;\n        if (!(column || transformColumn)) delete insightColumns[role];\n    }\n}\nfunction $cdd6162a40e9c08a$export$c2563952d877899(chart, totalStyle, insightColumns, actualColumns) {\n    //ensure columns are populated\n    const nonInternal = actualColumns.filter((c)=>!(0, $1342cf7df79546f0$exports).util.isInternalFieldName(c.name));\n    const firstColumn = nonInternal[0];\n    const firstColumnName = firstColumn && firstColumn.name;\n    const firstQuantitative = nonInternal.filter((c)=>c.quantitative)[0];\n    const firstQuantitativeColumnName = firstQuantitative && firstQuantitative.name;\n    const ensureColumn = (role, quantitative, treemap)=>{\n        if (!insightColumns[role]) {\n            if (treemap) insightColumns[role] = $cdd6162a40e9c08a$export$7e0d3b5c6570ae8b(actualColumns).name;\n            else insightColumns[role] = quantitative ? firstQuantitativeColumnName : firstColumnName;\n        }\n    };\n    function checkRequiresSize() {\n        switch(totalStyle){\n            case 'sum-strip':\n            case 'sum-strip-percent':\n                ensureColumn('size', true);\n                break;\n            case 'sum-treemap':\n                ensureColumn('size', true, true);\n                break;\n        }\n    }\n    switch(chart){\n        case 'barchart':\n        case 'barchartV':\n            ensureColumn('x');\n            checkRequiresSize();\n            break;\n        case 'barchartH':\n            ensureColumn('y');\n            checkRequiresSize();\n            break;\n        case 'density':\n            ensureColumn('x');\n            ensureColumn('y');\n            checkRequiresSize();\n            break;\n        case 'scatterplot':\n        case 'stacks':\n            ensureColumn('x');\n            ensureColumn('y');\n            break;\n        case 'treemap':\n            if (!insightColumns.size) insightColumns.size = $cdd6162a40e9c08a$export$7e0d3b5c6570ae8b(actualColumns).name;\n            if (!insightColumns.size) //error - no numeric column\n            return [\n                (0, $d5b6ce321475881f$export$21c51bc433c16634).errorColumnMustBeNumeric\n            ];\n            break;\n    }\n}\nfunction $cdd6162a40e9c08a$export$7e0d3b5c6570ae8b(columns) {\n    let column = (0, $2231af94bc7593e4$export$29f7204f5c690e43)(columns, true);\n    if (!column) column = (0, $2231af94bc7593e4$export$29f7204f5c690e43)(columns, false);\n    return column;\n}\nfunction $cdd6162a40e9c08a$export$3351a8d90bcc13aa(insight, columns) {\n    if (columns && insight.columns && insight.columns.color) return columns.filter((c)=>c.name === insight.columns.color)[0];\n}\nfunction $cdd6162a40e9c08a$export$46ec3e17747a00c9(columns) {\n    const bounds = [];\n    const getBound = (dimension, dataExtent, column)=>{\n        const { stats: stats } = column;\n        const numericValue = dataExtent === 'max' ? stats.max : stats.min;\n        return {\n            columnName: column.name,\n            dimension: dimension,\n            valid: true,\n            dataExtent: dataExtent,\n            numericValue: numericValue,\n            stringValue: numericValue.toString()\n        };\n    };\n    const dataExtents = [\n        'max',\n        'min'\n    ];\n    const dimensions = [\n        'x',\n        'y'\n    ];\n    columns.forEach((c)=>{\n        if (c.quantitative) dimensions.forEach((dimension)=>dataExtents.forEach((dataExtent)=>bounds.push(getBound(dimension, dataExtent, c))));\n    });\n    return bounds;\n}\n\n\nfunction $15c8a952544b8f28$var$_BackgroundImageEditor(_props) {\n    class __BackgroundImageEditor extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                backgroundImageColumnBounds: [],\n                readyToApply: false,\n                hidden: true\n            };\n        }\n        show(insightColumns) {\n            const { explorer: explorer, quantitativeColumns: quantitativeColumns } = this.props;\n            if (!quantitativeColumns.length) //TODO show error\n            return;\n            const xCol = quantitativeColumns.filter((c)=>c.name === insightColumns.x)[0];\n            const yCol = quantitativeColumns.filter((c)=>c.name === insightColumns.y)[0];\n            let backgroundImageColumnBounds;\n            if (explorer.imageHolder.backgroundImageColumnBounds.length < quantitativeColumns.length * 4) backgroundImageColumnBounds = (0, $cdd6162a40e9c08a$export$46ec3e17747a00c9)(explorer.state.dataContent.columns);\n            else backgroundImageColumnBounds = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone(explorer.imageHolder.backgroundImageColumnBounds);\n            const newState = {\n                hidden: false,\n                xCol: xCol,\n                yCol: yCol,\n                backgroundImageColumnBounds: backgroundImageColumnBounds\n            };\n            !xCol || yCol;\n            this.setState(newState);\n            this.checkReady();\n        }\n        render() {\n            const { props: props, state: state } = this;\n            const { explorer: explorer } = props;\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                hidden: state.hidden,\n                onDismiss: ()=>this.setState({\n                        hidden: true,\n                        backgroundImageFileFormatError: null\n                    }),\n                modalProps: {\n                    containerClassName: 'sanddance-background-image-dialog'\n                },\n                dialogContentProps: {\n                    type: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DialogType.normal,\n                    title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelBackgroundImageDialogTitle,\n                    subText: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelBackgroundImageSubtext\n                },\n                buttons: [\n                    (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                        key: 'apply',\n                        iconProps: {\n                            iconName: 'Photo2Add'\n                        },\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonApply,\n                        onClick: ()=>this.applyImage(true),\n                        disabled: !state.readyToApply\n                    })\n                ]\n            }, explorer.imageHolder.img ? (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: 'thumbnail'\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"img\", {\n                src: explorer.imageHolder.img.src\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                key: 'remove',\n                iconProps: {\n                    iconName: 'Photo2Remove'\n                },\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonRemove,\n                onClick: ()=>{\n                    explorer.imageHolder.img = null;\n                    this.applyImage(false);\n                    this.setState({\n                        readyToApply: false\n                    });\n                }\n            })) : (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: 'thumbnail'\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"input\", {\n                type: \"file\",\n                onChange: (e)=>this.readBackgroundImage(e)\n            }), state.backgroundImageFileFormatError && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"error\"\n            }, state.backgroundImageFileFormatError)), this.inputForColumn(state.xCol, 'X axis', 'x', (0, $d5b6ce321475881f$export$21c51bc433c16634).labelBackgroundLeft, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelBackgroundRight), this.inputForColumn(state.yCol, 'Y axis', 'y', (0, $d5b6ce321475881f$export$21c51bc433c16634).labelBackgroundBottom, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelBackgroundTop));\n        }\n        inputForColumn(column, label, dimension, minLabel, maxLabel) {\n            const { props: props, state: state } = this;\n            const fieldInput = (label, dataExtent, getDefault)=>{\n                const bounds = state.backgroundImageColumnBounds.filter((b)=>b.columnName === (column === null || column === void 0 ? void 0 : column.name) && b.dimension === dimension && b.dataExtent === dataExtent)[0];\n                if (!bounds) return null;\n                return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: 'axis-bound-field'\n                }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.TextField, {\n                    label: label,\n                    onChange: (e, value)=>{\n                        const numericValue = +value;\n                        bounds.stringValue = value;\n                        bounds.valid = !(!value || isNaN(numericValue));\n                        if (bounds.valid) bounds.numericValue = numericValue;\n                        this.setState({\n                            backgroundImageColumnBounds: [\n                                ...state.backgroundImageColumnBounds\n                            ]\n                        });\n                        this.checkReady();\n                    },\n                    value: bounds.stringValue,\n                    errorMessage: bounds.valid ? null : (0, $d5b6ce321475881f$export$21c51bc433c16634).errorNumericValue,\n                    onRenderSuffix: (a)=>{\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                            iconName: 'ScaleVolume',\n                            themePalette: props.themePalette,\n                            title: 'Use data extent' //TODO\n                            ,\n                            onClick: ()=>{\n                                bounds.numericValue = getDefault();\n                                bounds.stringValue = bounds.numericValue.toString();\n                                bounds.valid = true;\n                                this.setState({\n                                    backgroundImageColumnBounds: [\n                                        ...state.backgroundImageColumnBounds\n                                    ]\n                                });\n                                this.checkReady();\n                            }\n                        });\n                    }\n                }));\n            };\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: 'axis-bounds'\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Dropdown, {\n                label: label,\n                options: props.quantitativeColumns.map((c)=>{\n                    const option = {\n                        key: c.name,\n                        text: c.name\n                    };\n                    return option;\n                }),\n                onChange: (e, o)=>{\n                    const newState = {\n                        readyToApply: false\n                    };\n                    const newColumn = props.quantitativeColumns.filter((c)=>c.name === o.key)[0];\n                    switch(dimension){\n                        case 'x':\n                            newState.xCol = newColumn;\n                            break;\n                        case 'y':\n                            newState.yCol = newColumn;\n                            break;\n                    }\n                    this.setState(newState);\n                    this.checkReady();\n                },\n                selectedKey: column === null || column === void 0 ? void 0 : column.name\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: 'axis-bound-fields'\n            }, fieldInput(minLabel, 'min', ()=>column.stats.min), fieldInput(maxLabel, 'max', ()=>column.stats.max)));\n        }\n        readBackgroundImage(e) {\n            if (e.target.files) {\n                const file = e.target.files[0];\n                const reader = new FileReader();\n                reader.onload = ()=>{\n                    const img = new Image();\n                    img.onerror = ()=>{\n                        this.setState({\n                            backgroundImageFileFormatError: (0, $d5b6ce321475881f$export$21c51bc433c16634).errorImageFormat\n                        });\n                    };\n                    img.onload = ()=>{\n                        //success\n                        const { src: src, height: height, width: width } = img;\n                        this.props.explorer.imageHolder.img = {\n                            src: src,\n                            height: height,\n                            width: width\n                        };\n                        this.checkReady();\n                    };\n                    try {\n                        img.src = reader.result;\n                    } catch (e) {\n                        this.setState({\n                            backgroundImageFileFormatError: (0, $d5b6ce321475881f$export$21c51bc433c16634).errorImageFormat\n                        });\n                    }\n                };\n                reader.readAsDataURL(file);\n            }\n        }\n        checkReady() {\n            //allow state to resolve\n            setTimeout(()=>{\n                const { state: state, props: props } = this;\n                const { explorer: explorer } = props;\n                const { backgroundImageColumnBounds: backgroundImageColumnBounds } = state;\n                let valid = true;\n                const dimensions = [\n                    'x',\n                    'y'\n                ];\n                const dataExtents = [\n                    'max',\n                    'min'\n                ];\n                [\n                    state.xCol,\n                    state.yCol\n                ].forEach((c)=>dimensions.forEach((dimension)=>dataExtents.forEach((dataExtent)=>{\n                            const bounds = backgroundImageColumnBounds.filter((b)=>b.columnName === c.name && b.dataExtent === dataExtent && b.dimension === dimension)[0];\n                            if (!bounds.valid) valid = false;\n                        })));\n                const readyToApply = explorer.imageHolder.img && valid; //TODO if not already applied\n                this.setState({\n                    readyToApply: readyToApply\n                });\n            }, 0);\n        }\n        applyImage(showBackgroundImage) {\n            const { props: props, state: state } = this;\n            const { explorer: explorer } = props;\n            explorer.imageHolder.showBackgroundImage = showBackgroundImage;\n            explorer.imageHolder.backgroundImageColumnBounds = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone(state.backgroundImageColumnBounds);\n            if (showBackgroundImage) switch(props.chart){\n                case 'density':\n                case 'scatterplot':\n                case 'stacks':\n                    break;\n                default:\n                    //TODO use xcol & ycol\n                    //make sure x & y are numeric\n                    explorer.changeChartType('scatterplot');\n                    return;\n            }\n            explorer.forceUpdate();\n        }\n    }\n    return new __BackgroundImageEditor(_props);\n}\nconst $15c8a952544b8f28$export$5696019163aa3cca = $15c8a952544b8f28$var$_BackgroundImageEditor;\nfunction $15c8a952544b8f28$export$5aa9f35b88971754(insight, imageHolder, columns) {\n    if (!imageHolder.showBackgroundImage || !columns.x || !columns.y) return;\n    const { backgroundImageColumnBounds: backgroundImageColumnBounds } = imageHolder;\n    const xBounds = backgroundImageColumnBounds.filter((b)=>b.columnName === columns.x && b.dimension === 'x');\n    const yBounds = backgroundImageColumnBounds.filter((b)=>b.columnName === columns.y && b.dimension === 'y');\n    if (!xBounds.length || !yBounds.length) return;\n    const allBounds = [\n        ...xBounds,\n        ...yBounds\n    ];\n    for(let i = 0; i < allBounds.length; i++){\n        if (!allBounds[i].valid) return;\n    }\n    const bottom = yBounds.filter((b)=>b.dataExtent === 'min')[0];\n    const left = xBounds.filter((b)=>b.dataExtent === 'min')[0];\n    const right = xBounds.filter((b)=>b.dataExtent === 'max')[0];\n    const top = yBounds.filter((b)=>b.dataExtent === 'max')[0];\n    const all = [\n        bottom,\n        left,\n        right,\n        top\n    ];\n    for(let i = 0; i < all.length; i++){\n        if (!all[i]) return;\n    }\n    const { src: src, height: height, width: width } = imageHolder.img;\n    insight.backgroundImage = {\n        url: src,\n        size: {\n            height: height,\n            width: width\n        },\n        extents: {\n            bottom: bottom.numericValue,\n            left: left.numericValue,\n            right: right.numericValue,\n            top: top.numericValue\n        }\n    };\n    insight.size = insight.backgroundImage.size;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst $8f56f1ed6ae42f13$export$8263e1ed1ef30f07 = 200;\nfunction $8f56f1ed6ae42f13$export$931cbfb6bfb85fc(props) {\n    const newProps = Object.assign({}, props);\n    let selectedKey = null;\n    if (newProps.options && newProps.options.length > 1) {\n        const selectedOptions = newProps.options.filter((option)=>option.selected);\n        if (selectedOptions && selectedOptions.length > 0) selectedKey = selectedOptions[0].key;\n    }\n    if (newProps.collapseLabel) newProps.onRenderTitle = (a, b)=>{\n        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"span\", null, newProps.label, \": \", a[0].text);\n    };\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Dropdown, Object.assign({\n        dropdownWidth: $8f56f1ed6ae42f13$export$8263e1ed1ef30f07\n    }, newProps, {\n        label: newProps.collapseLabel ? null : newProps.label,\n        selectedKey: selectedKey\n    }));\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $00e2720d7006b5f2$export$d54e4e563d2a9303(explorer, signal) {\n    let initialValue;\n    try {\n        initialValue = explorer.viewer.vegaViewGl.signal(signal.name);\n    } catch (error) {\n    // continue regardless of error\n    }\n    return initialValue;\n}\nfunction $00e2720d7006b5f2$export$8210dfe1863c478(props) {\n    if (!props.explorer.viewer || !props.signal) return null;\n    if (props.signal.bind) {\n        const input = props.signal.bind.input;\n        if (input) {\n            const fn = $00e2720d7006b5f2$var$map[input];\n            if (fn) {\n                const prefix = props.prefix ? `${props.prefix} ` : '';\n                const control = fn(prefix, props.signal.bind, props.initialValue, (value)=>{\n                    props.onChange && props.onChange(value);\n                    props.explorer.signal(props.signal.name, value, props.newViewStateTarget);\n                }, props.disabled, props.collapseLabel, props.componentRef);\n                return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: \"sanddance-signal\"\n                }, control);\n            }\n        }\n    }\n    return null;\n}\nconst $00e2720d7006b5f2$var$map = {};\n$00e2720d7006b5f2$var$map['range'] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    let debouncer;\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Slider, {\n        componentRef: ref,\n        label: prefix + bind.name,\n        max: bind.max,\n        min: bind.min,\n        step: bind.step,\n        defaultValue: initialValue,\n        onChange: (value)=>{\n            if (debouncer) clearTimeout(debouncer);\n            debouncer = setTimeout(()=>onChange(value), bind.debounce || 0);\n        },\n        disabled: disabled\n    });\n};\n$00e2720d7006b5f2$var$map['select'] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    const options = bind.options.map((o, i)=>{\n        const option = {\n            key: o,\n            text: o\n        };\n        return option;\n    });\n    const label = prefix + bind.name;\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Dropdown, {\n        componentRef: ref,\n        onRenderTitle: collapseLabel ? (a, b)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"span\", null, label, \": \", a[0].text) : undefined,\n        defaultSelectedKey: initialValue,\n        label: collapseLabel ? undefined : label,\n        options: options,\n        onChange: (e, o)=>onChange(o.text),\n        disabled: disabled\n    });\n};\n$00e2720d7006b5f2$var$map['checkbox'] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n        componentRef: ref,\n        defaultChecked: initialValue,\n        label: prefix + bind.name,\n        onChange: (e, checked)=>onChange(checked),\n        disabled: disabled\n    });\n}; //TODO other signal types\n\n\n\nconst $3ecc97321af8bbc8$var$maxFacets = 50;\nconst $3ecc97321af8bbc8$var$roleLabels = {\n    color: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnColor,\n    facet: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnFacet,\n    facetV: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnFacetV,\n    group: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnGroup,\n    size: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnSize,\n    sort: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnSort,\n    uid: null,\n    x: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnX,\n    y: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnY,\n    z: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnZ\n};\nconst $3ecc97321af8bbc8$var$aliasLabels = {\n    color: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasColor,\n    facet: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasFacet,\n    facetV: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasFacetV,\n    group: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasGroup,\n    size: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasSize,\n    sort: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasSort,\n    uid: null,\n    x: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasX,\n    y: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasY,\n    z: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasZ\n};\nfunction $3ecc97321af8bbc8$var$filterColumnList(context, columns) {\n    switch(context){\n        case 'facet':\n        case 'facetV':\n            return columns.filter((column)=>column.quantitative || column.stats.distinctValueCount && column.stats.distinctValueCount < $3ecc97321af8bbc8$var$maxFacets);\n        default:\n            return columns.slice();\n    }\n}\nfunction $3ecc97321af8bbc8$var$optionsForSpecColumn(sectionName, columns, role, disabledColumnName, selectedColumnName) {\n    const filtered = $3ecc97321af8bbc8$var$filterColumnList(role, columns);\n    const options = filtered.map((column)=>{\n        const option = {\n            key: `column:${column.name}`,\n            text: column.name,\n            data: column,\n            selected: selectedColumnName === column.name,\n            disabled: disabledColumnName === column.name\n        };\n        return option;\n    });\n    if (options.length) {\n        const option = {\n            key: sectionName,\n            text: sectionName,\n            itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n        };\n        options.unshift(option);\n    }\n    return options;\n}\nfunction $3ecc97321af8bbc8$var$optionsForReference(sectionName, specRoles) {\n    const options = specRoles.map((specRole)=>{\n        const option = {\n            key: `role:${specRole.role}`,\n            text: $3ecc97321af8bbc8$var$aliasLabels[specRole.role],\n            data: specRole.role\n        };\n        return option;\n    }).sort((a, b)=>a.text.localeCompare(b.text));\n    if (options.length) {\n        const option = {\n            key: sectionName,\n            text: sectionName,\n            itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n        };\n        options.unshift(option);\n    }\n    return options;\n}\nfunction $3ecc97321af8bbc8$var$selectFirst(options) {\n    for(let i = 0; i < options.length; i++){\n        if (options[i].itemType === (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header) continue;\n        options[i].selected = true;\n        return;\n    }\n}\nfunction $3ecc97321af8bbc8$export$c171b40a34e110b5(props) {\n    if (!props.specRole) return null;\n    let categoricalColumns;\n    let directColorColumns;\n    let directColorGroup;\n    let referenceGroup = [];\n    if (props.specRole.role === 'color') {\n        categoricalColumns = props.categoricalColumns.filter((c)=>!c.isColorData);\n        directColorColumns = props.categoricalColumns.filter((c)=>c.isColorData);\n        directColorGroup = $3ecc97321af8bbc8$var$optionsForSpecColumn((0, $d5b6ce321475881f$export$21c51bc433c16634).selectDirectColor, directColorColumns, 'color', props.disabledColumnName, props.selectedColumnName);\n    } else categoricalColumns = props.categoricalColumns;\n    if (props.specRole.role === 'sort') {\n        const others = props.specCapabilities.roles.filter((specRole)=>specRole.role !== props.specRole.role);\n        referenceGroup = $3ecc97321af8bbc8$var$optionsForReference((0, $d5b6ce321475881f$export$21c51bc433c16634).selectReference, others);\n    }\n    const quantitativeGroup = $3ecc97321af8bbc8$var$optionsForSpecColumn((0, $d5b6ce321475881f$export$21c51bc433c16634).selectNumeric, props.quantitativeColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const categoricGroup = props.specRole.excludeCategoric ? null : $3ecc97321af8bbc8$var$optionsForSpecColumn((0, $d5b6ce321475881f$export$21c51bc433c16634).selectNonNumeric, categoricalColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const options = referenceGroup.concat(quantitativeGroup).concat(categoricGroup).concat(directColorGroup).filter(Boolean);\n    return options;\n}\nfunction $3ecc97321af8bbc8$export$83b9e0badda50eeb(props) {\n    const options = $3ecc97321af8bbc8$export$c171b40a34e110b5(props);\n    if (props.specRole.allowNone) options.unshift({\n        key: -1,\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectNone\n    });\n    const hasSelection = options.reduce((p, c)=>{\n        return p || c.selected;\n    }, false);\n    if (!hasSelection) $3ecc97321af8bbc8$var$selectFirst(options);\n    let signals;\n    if (props.explorer.viewer && props.explorer.viewer.vegaSpec) {\n        if (props.specRole.signals) signals = props.explorer.viewer.vegaSpec.signals.filter((s)=>props.specRole.signals.indexOf(s.name) >= 0);\n    }\n    const label = $3ecc97321af8bbc8$var$roleLabels[props.specRole.role];\n    const signalElements = !props.hideSignals && signals && signals.map((signal, i)=>{\n        let initialValue;\n        try {\n            initialValue = props.explorer.viewer.vegaViewGl.signal(signal.name);\n        } catch (error) {\n        // continue regardless of error\n        }\n        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $00e2720d7006b5f2$export$8210dfe1863c478), {\n            key: signal.name + i + initialValue,\n            explorer: props.explorer,\n            signal: signal,\n            initialValue: initialValue,\n            onChange: (value)=>props.onChangeSignal && props.onChangeSignal(signal.name, value),\n            collapseLabel: props.collapseLabel\n        });\n    });\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-columnMap\"\n    }, props.prefix, !props.hideDropdown && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n        componentRef: props.componentRef,\n        collapseLabel: props.collapseLabel,\n        disabled: props.disabled,\n        label: label,\n        options: options,\n        onChange: (e, o)=>props.changeColumnMapping(props.specRole.role, typeof o.data === 'string' ? o.data : (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone(o.data)),\n        onDismiss: props.onDismiss\n    }), signalElements, props.suffix);\n}\n\n\n\nfunction $f47e4461409e9b5c$export$48e4a8ab7f4530ac(stage, specCapabilities) {\n    for(const axisName in stage.axes)specCapabilities.roles.forEach((specRole)=>{\n        if (specRole.role === axisName) {\n            const axes = stage.axes[axisName];\n            axes.forEach((axis)=>{\n                if (axis.title) {\n                    const textItem = axis.title;\n                    textItem.specRole = specRole;\n                }\n            });\n        }\n    });\n}\nfunction $f47e4461409e9b5c$var$px(n) {\n    return n + 'px';\n}\nfunction $f47e4461409e9b5c$var$_PositionedColumnMap(_props) {\n    class __PositionedColumnMap extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            const { left: left, top: top } = props;\n            this.state = {\n                left: left,\n                top: top\n            };\n            this.dropdownRef = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n        }\n        focus() {\n            if (!this.focused) {\n                this.focused = true;\n                this.dropdownRef.current.focus(true);\n            }\n        }\n        componentDidMount() {\n            const size = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.outerSize(this.div);\n            const over = {\n                left: Math.max(0, this.state.left + size.width - this.props.container.offsetWidth),\n                top: Math.max(0, this.state.top + size.height - this.props.container.offsetHeight)\n            };\n            if (over.left || over.top) {\n                let { left: left, top: top } = this.state;\n                left -= over.left;\n                top -= over.top;\n                this.setState({\n                    left: left,\n                    top: top\n                });\n            } else this.focus();\n        }\n        componentDidUpdate() {\n            this.focus();\n        }\n        render() {\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div) this.div = div;\n                },\n                className: \"sanddance-columnMap-absolute\",\n                style: {\n                    position: 'absolute',\n                    left: $f47e4461409e9b5c$var$px(this.state.left),\n                    top: $f47e4461409e9b5c$var$px(this.state.top)\n                }\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $3ecc97321af8bbc8$export$83b9e0badda50eeb), Object.assign({}, this.props, {\n                componentRef: this.dropdownRef,\n                hideSignals: true\n            })));\n        }\n    }\n    return new __PositionedColumnMap(_props);\n}\nconst $f47e4461409e9b5c$export$3e341bd56774d659 = $f47e4461409e9b5c$var$_PositionedColumnMap;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\nfunction $0edfbb46d4822ac6$var$_ColumnTypeChanger(_props) {\n    class __ColumnTypeChanger extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = this.getInitialState();\n        }\n        getInitialState() {\n            const { props: props } = this;\n            return {\n                dialogHidden: true,\n                confirmationHidden: true,\n                quantitativeColumns: props.initialQuantitativeColumns.map((c)=>(0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone(c)),\n                categoricalColumns: props.initialCategoricalColumns.map((c)=>(0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone(c)),\n                columnTypes: null\n            };\n        }\n        closeDialog() {\n            this.setState(this.getInitialState());\n        }\n        openConfirmation(columnTypes) {\n            this.setState({\n                columnTypes: columnTypes,\n                confirmationHidden: false\n            });\n        }\n        render() {\n            const { props: props, state: state } = this;\n            const hasChanges = props.initialQuantitativeColumns.some((c, i)=>{\n                return c.quantitative !== state.quantitativeColumns[i].quantitative;\n            });\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonColumnTypes,\n                onClick: ()=>this.setState({\n                        dialogHidden: false\n                    })\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                minWidth: \"80%\",\n                hidden: state.dialogHidden,\n                onDismiss: ()=>this.closeDialog(),\n                dialogContentProps: {\n                    className: `sanddance-dialog ${props.theme}`,\n                    type: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DialogType.normal,\n                    title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnTypes\n                },\n                buttons: [\n                    (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                        key: \"revert\",\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonResetToDefault,\n                        onClick: ()=>this.openConfirmation(null),\n                        iconProps: {\n                            iconName: 'Undo'\n                        }\n                    }),\n                    (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                        key: \"apply\",\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonApply,\n                        onClick: ()=>{\n                            const columnTypes = {};\n                            state.quantitativeColumns.forEach((c)=>{\n                                columnTypes[c.name] = c.quantitative ? c.type : 'string';\n                            });\n                            state.categoricalColumns.forEach((c)=>{\n                                columnTypes[c.name] = 'string';\n                            });\n                            this.openConfirmation(columnTypes);\n                        },\n                        iconProps: {\n                            iconName: 'Accept'\n                        },\n                        disabled: !hasChanges\n                    })\n                ]\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: 'sanddance-columnTypes'\n            }, state.quantitativeColumns.length > 0 && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"h3\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).selectNumeric), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"table\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"thead\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"tr\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelEditColumn), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnName), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnQuantitativeMin), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnQuantitativeMax), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnQuantitativeMean), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnDistinct))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"tbody\", null, state.quantitativeColumns.map((c, i)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"tr\", {\n                    key: i,\n                    className: c.quantitative ? '' : 'changed'\n                }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                    iconName: 'Edit',\n                    onClick: undefined,\n                    menuProps: {\n                        items: [\n                            (0, $d5b6ce321475881f$export$21c51bc433c16634).selectNumeric,\n                            (0, $d5b6ce321475881f$export$21c51bc433c16634).selectNonNumeric\n                        ].map((t)=>{\n                            return {\n                                key: t,\n                                text: t,\n                                onClick: ()=>{\n                                    c.quantitative = t === (0, $d5b6ce321475881f$export$21c51bc433c16634).selectNumeric;\n                                    this.setState({\n                                        quantitativeColumns: [\n                                            ...state.quantitativeColumns\n                                        ]\n                                    });\n                                }\n                            };\n                        })\n                    },\n                    themePalette: props.themePalette,\n                    title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelChangeColumnType\n                })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, c.name), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, c.stats.min), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, c.stats.max), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, c.stats.mean), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, c.stats.distinctValueCount)))))), state.categoricalColumns.length > 0 && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"h3\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).selectNonNumeric), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"table\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"thead\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"tr\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnName), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnType), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnDistinct), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnHasColorData), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"th\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnIsColorData))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"tbody\", null, state.categoricalColumns.map((c, i)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"tr\", {\n                    key: i\n                }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, c.name), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, c.type), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, c.stats.distinctValueCount), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, (!!c.stats.hasColorData).toString()), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"td\", null, (!!c.isColorData).toString())))))))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                hidden: state.confirmationHidden,\n                onDismiss: ()=>this.setState({\n                        confirmationHidden: true\n                    }),\n                dialogContentProps: {\n                    className: `sanddance-dialog ${props.theme}`,\n                    type: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DialogType.normal,\n                    title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelConfirmation,\n                    subText: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryWarning\n                },\n                buttons: (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonApply,\n                    onClick: ()=>{\n                        this.closeDialog();\n                        this.props.onConfirmUpdate(this.state.columnTypes);\n                    },\n                    iconProps: {\n                        iconName: 'Accept'\n                    }\n                })\n            }));\n        }\n    }\n    return new __ColumnTypeChanger(_props);\n}\nconst $0edfbb46d4822ac6$export$12df67f310f5f846 = $0edfbb46d4822ac6$var$_ColumnTypeChanger;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $c90c20f7be6ae7d5$export$c4b7cd609ccf4a5a = (title, embed)=>`<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>${title}</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/css/sanddance-explorer.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/css/sanddance-embed.css\" />\n</head>\n<body>\n    <script src=\"https://unpkg.com/react@17/umd/react.production.min.js\"></script>\n    <script src=\"https://unpkg.com/react-dom@17/umd/react-dom.production.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@6.2/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/@fluentui/react@8/dist/fluentui-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/fluentui-icons@1/dist/umd/fluentui-icons.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/umd/sanddance-embed.js\"></script>\n    ${embed}\n</body>\n</html>`;\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $3a2778f19bd71931$export$65aea4b3b539487b(data, delimiter) {\n    const fields = Object.keys(data[0]);\n    const file = data.map((row)=>{\n        return fields.map((fieldName)=>{\n            const value = row[fieldName];\n            if (typeof value === 'number') return value;\n            if (typeof value === 'string') {\n                if (value.indexOf(delimiter) >= 0) return `\"${value.replace(/\"/g, '\"\"')}\"`;\n                else return value;\n            }\n            return '';\n        }).join(delimiter);\n    });\n    file.unshift(fields.join(delimiter));\n    return file.join('\\n');\n}\n\n\n\n\nconst $cff73bb5fafa0795$var$exportTypes = [\n    [\n        'json',\n        (0, $d5b6ce321475881f$export$21c51bc433c16634).labelExportJSON\n    ],\n    [\n        'csv',\n        (0, $d5b6ce321475881f$export$21c51bc433c16634).labelExportCSV\n    ],\n    [\n        'tsv',\n        (0, $d5b6ce321475881f$export$21c51bc433c16634).labelExportTSV\n    ],\n    [\n        'html',\n        (0, $d5b6ce321475881f$export$21c51bc433c16634).labelExportHTML\n    ]\n];\nfunction $cff73bb5fafa0795$var$_DataExportPicker(_props) {\n    class __DataExportPicker extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = this.getInitialState(this.props);\n        }\n        getInitialState(props) {\n            const initialState = {\n                initializer: props.initializer,\n                dialogHidden: true,\n                exportType: $cff73bb5fafa0795$var$exportTypes[0][0],\n                fileName: props.initializer.fileName,\n                fileNameError: '',\n                working: false\n            };\n            return initialState;\n        }\n        componentDidUpdate() {\n            if (!(0, $e295d8097c1ad61a$exports).deepCompare(this.props.initializer, this.state.initializer)) this.setState(this.getInitialState(this.props));\n        }\n        // Converts to dataExport type and calls dataExportHandler to deal with data\n        createExport(exportType, displayName) {\n            const final = (data)=>{\n                this.props.dataExportHandler(data, exportType, displayName);\n                this.close();\n            };\n            const json = JSON.stringify(this.props.data, $cff73bb5fafa0795$var$columnReplacer);\n            switch(exportType){\n                case 'json':\n                    final(json);\n                    break;\n                case 'csv':\n                    final((0, $3a2778f19bd71931$export$65aea4b3b539487b)(JSON.parse(json), ','));\n                    break;\n                case 'tsv':\n                    final((0, $3a2778f19bd71931$export$65aea4b3b539487b)(JSON.parse(json), '\\t'));\n                    break;\n                case 'html':\n                    {\n                        const csv = (0, $3a2778f19bd71931$export$65aea4b3b539487b)(JSON.parse(json), ',');\n                        const html = (0, $c90c20f7be6ae7d5$export$c4b7cd609ccf4a5a)(`${(0, $d5b6ce321475881f$export$21c51bc433c16634).appName} - ${escape(displayName)}`, $cff73bb5fafa0795$var$embedScript(csv, displayName));\n                        final(html);\n                    }\n            }\n        }\n        close() {\n            this.setState({\n                dialogHidden: true,\n                working: false\n            });\n        }\n        render() {\n            const closeDialog = ()=>this.close();\n            if (this.state.delayAction) requestAnimationFrame(()=>{\n                //allow render to complete\n                if (this.state.delayAction) {\n                    this.state.delayAction();\n                    this.setState({\n                        delayAction: null\n                    });\n                }\n            });\n            const disabled = this.state.working || this.state.dialogHidden;\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                className: \"search-action search-bottom-action\",\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonExportCount(this.props.data.length),\n                onClick: ()=>this.setState({\n                        dialogHidden: false\n                    }),\n                disabled: this.props.disabled\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                hidden: this.state.dialogHidden,\n                onDismiss: closeDialog,\n                dialogContentProps: {\n                    className: `sanddance-dialog ${this.props.theme}`,\n                    type: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DialogType.normal,\n                    title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelExport\n                },\n                buttons: [\n                    (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                        key: 0,\n                        disabled: disabled || !!this.state.fileNameError,\n                        onClick: (e)=>this.setState({\n                                delayAction: ()=>this.createExport(this.state.exportType, this.state.fileName),\n                                working: true\n                            }),\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonExport,\n                        iconProps: {\n                            iconName: 'Download'\n                        }\n                    })\n                ]\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.TextField, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelExportFileName,\n                onChange: (e, displayName)=>{\n                    const displayNameError = $cff73bb5fafa0795$var$getFileNameError(displayName);\n                    this.setState({\n                        fileName: displayName,\n                        fileNameError: displayNameError\n                    });\n                },\n                errorMessage: this.state.fileNameError,\n                value: this.state.fileName\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.ChoiceGroup, {\n                className: \"sanddance-form-separate\",\n                disabled: disabled,\n                selectedKey: this.state.exportType,\n                options: $cff73bb5fafa0795$var$exportTypes.map(([exportType, text])=>{\n                    return {\n                        key: exportType,\n                        text: text,\n                        disabled: false\n                    };\n                }),\n                onChange: (ev, option)=>this.setState({\n                        exportType: option.key\n                    }),\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelExportFormat\n            })));\n        }\n    }\n    return new __DataExportPicker(_props);\n}\nconst $cff73bb5fafa0795$export$b1b568728c48eba1 = $cff73bb5fafa0795$var$_DataExportPicker;\nconst $cff73bb5fafa0795$var$illegalChars = '\\\\/:*?\"<>|';\nfunction $cff73bb5fafa0795$var$getFileNameError(displayName) {\n    if (!displayName) return (0, $d5b6ce321475881f$export$21c51bc433c16634).errorExportFilenameEmpty;\n    for(let i = 0; i < $cff73bb5fafa0795$var$illegalChars.length; i++){\n        if (displayName.indexOf($cff73bb5fafa0795$var$illegalChars[i]) >= 0) return (0, $d5b6ce321475881f$export$21c51bc433c16634).errorExportFilenameCharacters($cff73bb5fafa0795$var$illegalChars);\n    }\n}\nfunction $cff73bb5fafa0795$export$748f956e607b675b(fileName) {\n    $cff73bb5fafa0795$var$exportTypes.forEach(([exportType])=>{\n        const re = new RegExp(`\\\\.${exportType}`, 'ig');\n        fileName = fileName.replace(re, '');\n    });\n    return fileName;\n}\nfunction $cff73bb5fafa0795$var$columnReplacer(name, value) {\n    if ((0, $1342cf7df79546f0$exports).util.isInternalFieldName(name, true)) return undefined;\n    return value === null ? '' : value;\n}\nfunction $cff73bb5fafa0795$var$embedScript(csv, displayName, snapshots) {\n    const dataFile = {\n        type: 'csv',\n        displayName: displayName,\n        snapshots: snapshots\n    };\n    return `<pre id='csv-data' style='display:none'>${csv}</pre>\n    <script>SandDanceEmbed.load(Object.assign({rawText: document.getElementById('csv-data').innerText}, ${JSON.stringify(dataFile)}))</script>`;\n}\nfunction $cff73bb5fafa0795$export$9f4b684ea6be1a90(data, displayName, snapshots) {\n    const json = JSON.stringify(data, $cff73bb5fafa0795$var$columnReplacer);\n    const csv = (0, $3a2778f19bd71931$export$65aea4b3b539487b)(JSON.parse(json), ',');\n    const html = (0, $c90c20f7be6ae7d5$export$c4b7cd609ccf4a5a)(`${(0, $d5b6ce321475881f$export$21c51bc433c16634).appName} - ${escape(displayName)}`, $cff73bb5fafa0795$var$embedScript(csv, displayName, snapshots));\n    return html;\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $e295d8097c1ad61a$exports).classList('sanddance-group', props.className)\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"group-head\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"label\", null, props.label), props.labelCount && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"span\", {\n        className: \"count\"\n    }, \"(\", props.labelCount, \")\")), props.children && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"group-body\"\n    }, props.children));\n}\n\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $2ec5b051a3376e1a$export$ce08aabc421980f4(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, props.allColumns.map((c, i)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n            key: c.name\n        }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"label\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n            checked: props.exclusions.indexOf(c.name) < 0,\n            inlineLabel: true,\n            label: c.name,\n            onChange: ()=>props.toggleExclusion(c.name)\n        })))));\n}\n\n\n\n\nconst $b4b5d5b480eaf9ae$var$singleFacetLayouts = [\n    {\n        facetStyle: 'wrap',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelFacetLayoutWrap\n    }\n];\nconst $b4b5d5b480eaf9ae$export$3fab399b77d7be2a = [\n    {\n        key: 'grid',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).chartTypeGrid\n    },\n    {\n        key: 'scatterplot',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).chartTypeScatterPlot\n    },\n    {\n        key: 'density',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).chartTypeDensity\n    },\n    {\n        key: 'barchartV',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).chartTypeBarChartV\n    },\n    {\n        key: 'barchartH',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).chartTypeBarChartH\n    },\n    {\n        key: 'treemap',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).chartTypeTreeMap\n    },\n    {\n        key: 'strips',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).chartTypeStrips\n    },\n    {\n        key: 'stacks',\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).chartTypeStacks\n    }\n];\nfunction $b4b5d5b480eaf9ae$export$7d1536ca08644643(key) {\n    for(let i = 0; i < $b4b5d5b480eaf9ae$export$3fab399b77d7be2a.length; i++){\n        if (key === $b4b5d5b480eaf9ae$export$3fab399b77d7be2a[i].key) return $b4b5d5b480eaf9ae$export$3fab399b77d7be2a[i].text;\n    }\n}\nfunction $b4b5d5b480eaf9ae$var$_Chart(_props) {\n    class __Chart extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                showTooltipDialog: false\n            };\n            this.choiceRef = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                return (_a = this.choiceRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n            };\n        }\n        render() {\n            const { props: props } = this;\n            const { explorer: explorer, specCapabilities: specCapabilities } = props;\n            const signals = explorer.viewer && explorer.viewer.vegaSpec && specCapabilities && specCapabilities.signals && explorer.viewer.vegaSpec.signals.filter((s)=>specCapabilities.signals.indexOf(s.name) >= 0);\n            const hasOptions = !!signals || (specCapabilities === null || specCapabilities === void 0 ? void 0 : specCapabilities.backgroundImage);\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelChart\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"calculator\"\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.ChoiceGroup, {\n                componentRef: this.choiceRef,\n                selectedKey: props.chart,\n                className: \"sanddance-chart-type\",\n                options: $b4b5d5b480eaf9ae$export$3fab399b77d7be2a.map((o)=>{\n                    return Object.assign(Object.assign({}, o), {\n                        disabled: props.disabled || o.key === 'treemap' && props.quantitativeColumns.length === 0\n                    });\n                }),\n                onChange: (e, o)=>props.explorer.changeChartType(o.key)\n            }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnMapping\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, specCapabilities && specCapabilities.roles.map((specRole, i)=>{\n                const specColumnInRole = props.insightColumns[specRole.role];\n                const selectedColumnName = specColumnInRole;\n                let disabledColumnName;\n                let prefix;\n                let suffix;\n                let hideDropdown = false;\n                let { totalStyle: totalStyle } = props;\n                if (!totalStyle) totalStyle = 'count-square';\n                let { facetStyle: facetStyle } = props;\n                if (!facetStyle) facetStyle = 'wrap';\n                switch(specRole.role){\n                    case 'facet':\n                        suffix = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n                            disabled: !props.insightColumns.facet,\n                            collapseLabel: props.collapseLabels,\n                            label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelFacetLayout,\n                            calloutProps: {\n                                style: {\n                                    minWidth: '18em'\n                                }\n                            },\n                            options: [\n                                {\n                                    key: 'header1',\n                                    text: `${(0, $d5b6ce321475881f$export$21c51bc433c16634).labelFacetLayout}:`,\n                                    itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n                                },\n                                ...$b4b5d5b480eaf9ae$var$singleFacetLayouts.map((f)=>{\n                                    const o = {\n                                        key: f.facetStyle,\n                                        text: f.text,\n                                        data: f,\n                                        selected: facetStyle === f.facetStyle\n                                    };\n                                    return o;\n                                }),\n                                {\n                                    key: 'divider',\n                                    text: '-',\n                                    itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Divider\n                                },\n                                {\n                                    key: 'header2',\n                                    text: `${(0, $d5b6ce321475881f$export$21c51bc433c16634).labelColumnFacetV}:`,\n                                    itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n                                },\n                                ...(0, $3ecc97321af8bbc8$export$c171b40a34e110b5)(Object.assign(Object.assign({}, props), {\n                                    specRole: specRole,\n                                    selectedColumnName: props.insightColumns.facetV\n                                })).map((o)=>{\n                                    if (o.itemType !== (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header) {\n                                        const facetData = {\n                                            facetStyle: 'cross',\n                                            column: o.data\n                                        };\n                                        o.data = facetData;\n                                        o.text = `${(0, $d5b6ce321475881f$export$21c51bc433c16634).labelFacetLayoutCross} ${o.text}`;\n                                    }\n                                    return o;\n                                })\n                            ],\n                            onChange: (e, o)=>{\n                                const facetData = o.data;\n                                props.changeColumnMapping('facet', 'facet', null, {\n                                    facetStyle: facetData.facetStyle\n                                });\n                                if (facetData.facetStyle === 'cross') props.changeColumnMapping('facetV', (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone(facetData.column));\n                            }\n                        });\n                        break;\n                    case 'facetV':\n                        hideDropdown = true;\n                        break;\n                    case 'size':\n                        {\n                            const options = [\n                                {\n                                    key: 'count-square',\n                                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTotalByCountSquare,\n                                    data: 'count-square',\n                                    selected: !totalStyle || totalStyle === 'count-square'\n                                },\n                                {\n                                    key: 'count-strip',\n                                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTotalByCountStrip,\n                                    data: 'count-strip',\n                                    selected: totalStyle === 'count-strip'\n                                },\n                                {\n                                    key: 'sum-strip',\n                                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTotalBySumStrip,\n                                    data: 'sum-strip',\n                                    selected: totalStyle === 'sum-strip'\n                                },\n                                {\n                                    key: 'sum-treemap',\n                                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTotalBySumTreemap,\n                                    data: 'sum-treemap',\n                                    selected: totalStyle === 'sum-treemap',\n                                    disabled: props.quantitativeColumns.length === 0\n                                }\n                            ];\n                            if (specCapabilities.percentage) options.push({\n                                key: 'sum-strip-percent',\n                                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTotalBySumStripPercent,\n                                data: 'sum-strip-percent',\n                                selected: totalStyle === 'sum-strip-percent',\n                                disabled: props.quantitativeColumns.length === 0\n                            });\n                            prefix = !specCapabilities.countsAndSums ? null : (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n                                collapseLabel: props.collapseLabels,\n                                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTotal,\n                                calloutProps: {\n                                    style: {\n                                        minWidth: '18em'\n                                    }\n                                },\n                                options: options,\n                                onChange: (e, o)=>{\n                                    const totalStyle = o.data;\n                                    let defaultColumn;\n                                    if (totalStyle.indexOf('sum-') === 0) {\n                                        if (totalStyle === 'sum-treemap') defaultColumn = (0, $cdd6162a40e9c08a$export$7e0d3b5c6570ae8b)(props.allColumns);\n                                        defaultColumn = defaultColumn || props.quantitativeColumns[0];\n                                    }\n                                    props.changeColumnMapping('size', 'size', defaultColumn, {\n                                        totalStyle: totalStyle\n                                    });\n                                }\n                            });\n                            break;\n                        }\n                }\n                const disabled = props.disabled || specRole.disabled || specRole.role === 'size' && !(!specCapabilities.countsAndSums || totalStyle.indexOf('sum-') === 0) || specRole.role === 'sort' && specCapabilities.countsAndSums && totalStyle === 'sum-treemap';\n                return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $3ecc97321af8bbc8$export$83b9e0badda50eeb), Object.assign({}, props, {\n                    prefix: prefix,\n                    suffix: suffix,\n                    collapseLabel: props.collapseLabels,\n                    disabled: disabled,\n                    disabledColumnName: disabledColumnName,\n                    selectedColumnName: selectedColumnName,\n                    specRole: specRole,\n                    key: i,\n                    onChangeSignal: (name, value)=>props.onChangeSignal(specRole.role, selectedColumnName, name, value),\n                    hideDropdown: hideDropdown\n                }));\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                className: 'sanddance-chart-button',\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonTooltipMapping,\n                onClick: ()=>this.setState({\n                        showTooltipDialog: true\n                    })\n            }))), hasOptions && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelChartTypeOptions\n            }, signals && signals.map((signal, i)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $00e2720d7006b5f2$export$8210dfe1863c478), {\n                    key: i,\n                    signal: signal,\n                    explorer: explorer,\n                    initialValue: (0, $00e2720d7006b5f2$export$d54e4e563d2a9303)(explorer, signal),\n                    disabled: props.disabled || this.disableSignal(signal),\n                    collapseLabel: props.collapseLabels,\n                    newViewStateTarget: false\n                })), (specCapabilities === null || specCapabilities === void 0 ? void 0 : specCapabilities.backgroundImage) && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                className: 'sanddance-chart-button',\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonBackgroundImage,\n                onClick: ()=>{\n                    let insightColumns;\n                    switch(props.chart){\n                        case 'scatterplot':\n                        case 'stacks':\n                            insightColumns = props.insightColumns;\n                            break;\n                    }\n                    if (!insightColumns) insightColumns = props.explorer.changeChartType('scatterplot');\n                    this.backgroundImageEditor.show(insightColumns);\n                }\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                hidden: !this.state.showTooltipDialog,\n                onDismiss: ()=>this.setState({\n                        showTooltipDialog: false\n                    }),\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTooltipMapping\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $2ec5b051a3376e1a$export$ce08aabc421980f4), {\n                allColumns: props.allColumns,\n                exclusions: props.tooltipExclusions,\n                toggleExclusion: props.toggleTooltipExclusion\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $15c8a952544b8f28$export$5696019163aa3cca), Object.assign({}, props, {\n                ref: (e)=>this.backgroundImageEditor = e\n            })));\n        }\n        disableSignal(signal) {\n            if (this.props.view === '2d' && signal.name === (0, $1342cf7df79546f0$exports).constants.SignalNames.ZGrounded) return true;\n            return false;\n        }\n    }\n    return new __Chart(_props);\n}\nconst $b4b5d5b480eaf9ae$export$acaa6426d77a227e = $b4b5d5b480eaf9ae$var$_Chart;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $4b388f5c1e44e369$export$2c73285ae9390cec(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.TextField, Object.assign({\n        onKeyUp: (e)=>{\n            e.nativeEvent.stopImmediatePropagation();\n        }\n    }, props));\n}\n\n\n\n\nconst $420fc835a380b3a6$export$210195f4ae250f0a = 100;\nfunction $420fc835a380b3a6$export$c2b32f315f251228(column) {\n    const type = column && column.type;\n    switch(type){\n        case 'boolean':\n            return [\n                [\n                    '==',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchEQ\n                ],\n                [\n                    '!=',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchNEQ\n                ],\n                [\n                    'isnullorEmpty',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchNULL\n                ]\n            ];\n        case 'date':\n        case 'integer':\n        case 'number':\n            return [\n                [\n                    '==',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchEQ\n                ],\n                [\n                    '!=',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchNEQ\n                ],\n                [\n                    '>',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchGT\n                ],\n                [\n                    '>=',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchGTE\n                ],\n                [\n                    '<',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchLT\n                ],\n                [\n                    '<=',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchLTE\n                ],\n                [\n                    'isnullorEmpty',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchNULL\n                ]\n            ];\n        case 'string':\n        default:\n            return [\n                [\n                    '==',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchEQ\n                ],\n                [\n                    '!=',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchNEQ\n                ],\n                [\n                    '>',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchGT\n                ],\n                [\n                    '>=',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchGTE\n                ],\n                [\n                    '<',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchLT\n                ],\n                [\n                    '<=',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchLTE\n                ],\n                [\n                    'contains',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchIN\n                ],\n                [\n                    'starts',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchSW\n                ],\n                [\n                    'isnullorEmpty',\n                    (0, $d5b6ce321475881f$export$21c51bc433c16634).searchNULL\n                ]\n            ];\n    }\n}\nfunction $420fc835a380b3a6$var$getExpressionClauses(currClause, disableOR) {\n    const keys = [\n        [\n            '&&',\n            (0, $d5b6ce321475881f$export$21c51bc433c16634).searchAND\n        ]\n    ];\n    if (!disableOR) keys.push([\n        '||',\n        (0, $d5b6ce321475881f$export$21c51bc433c16634).searchOR\n    ]);\n    return keys.map((key, i)=>{\n        const [clause, text] = key;\n        const selected = currClause == clause; //deliberate double equal \n        const option = {\n            key: i,\n            text: text,\n            data: clause,\n            selected: selected\n        };\n        return option;\n    });\n}\nfunction $420fc835a380b3a6$var$getOperators(ex, column) {\n    let anySelected = false;\n    const validOperators = $420fc835a380b3a6$export$c2b32f315f251228(column);\n    const options = validOperators.map((validoperator)=>{\n        const [op, text] = validoperator;\n        const selected = ex.operator === op;\n        anySelected = anySelected || selected;\n        const option = {\n            key: op,\n            text: text,\n            data: op,\n            selected: selected\n        };\n        return option;\n    });\n    if (!anySelected) options[0].selected = true;\n    return options;\n}\nfunction $420fc835a380b3a6$var$getDistinctValues(data, columnName) {\n    const distinctMap = {};\n    for(let i = 0; i < data.length; i++){\n        const row = data[i];\n        const value = row[columnName];\n        distinctMap[value] = true;\n    }\n    return Object.keys(distinctMap).sort();\n}\nfunction $420fc835a380b3a6$var$getValues(ex, column, data, autoCompleteDistinctValues) {\n    const stats = column && column.stats;\n    if (stats && stats.distinctValueCount < $420fc835a380b3a6$export$210195f4ae250f0a) {\n        if (!autoCompleteDistinctValues[column.name]) autoCompleteDistinctValues[column.name] = $420fc835a380b3a6$var$getDistinctValues(data, column.name);\n        return autoCompleteDistinctValues[column.name].map((v, i)=>({\n                key: i,\n                text: v\n            }));\n    }\n    return [];\n}\nfunction $420fc835a380b3a6$export$c72d34660a162238(ex) {\n    if (ex.operator === 'isnullorEmpty') return '';\n    return typeof ex.value === 'string' ? ex.value : ex.value == null ? '' : ex.value.toString();\n}\nfunction $420fc835a380b3a6$export$793106cac50ab579(props) {\n    const ex = props.searchExpression;\n    const possibleValues = $420fc835a380b3a6$var$getValues(ex, props.column, props.data, props.autoCompleteDistinctValues);\n    //TODO better date handling with calendar picker\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, props.index > 0 && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearchClause,\n        dropdownWidth: 120,\n        disabled: !ex.unlocked || props.disableOR,\n        options: $420fc835a380b3a6$var$getExpressionClauses(ex.clause, props.disableOR),\n        onChange: (e, o)=>props.onUpdateExpression({\n                clause: o.data\n            }, props.index)\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n        componentRef: props.dropdownRef,\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearchColumn,\n        options: [\n            {\n                key: '',\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectAny,\n                data: null,\n                selected: ex.name === null\n            }\n        ].concat(props.columns.map((c, i)=>({\n                key: c.name,\n                text: c.name,\n                data: c,\n                selected: c.name === ex.name\n            }))),\n        onChange: (e, o)=>props.onUpdateExpression({\n                name: o.data && o.data.name || null\n            }, props.index)\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearchOperator,\n        dropdownWidth: 120,\n        options: $420fc835a380b3a6$var$getOperators(ex, props.column),\n        onChange: (e, o)=>props.onUpdateExpression({\n                operator: o.data\n            }, props.index)\n    }), possibleValues.length > 0 && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.ComboBox, {\n        className: \"search-field\",\n        label: props.collapseLabels ? null : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearchValue,\n        placeholder: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearchValuePlaceholder,\n        disabled: ex.operator === 'isnullorEmpty',\n        dropdownWidth: (0, $8f56f1ed6ae42f13$export$8263e1ed1ef30f07),\n        allowFreeform: true,\n        autoComplete: \"on\",\n        errorMessage: ex.errorMessage,\n        text: $420fc835a380b3a6$export$c72d34660a162238(ex),\n        options: $420fc835a380b3a6$var$getValues(ex, props.column, props.data, props.autoCompleteDistinctValues),\n        onChange: (e, o, i, value)=>{\n            if (o) value = o.text;\n            props.onUpdateExpression({\n                value: value\n            }, props.index);\n        }\n    }), possibleValues.length === 0 && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $4b388f5c1e44e369$export$2c73285ae9390cec), {\n        className: \"search-field\",\n        label: props.collapseLabels ? null : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearchValue,\n        placeholder: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearchValuePlaceholder,\n        disabled: ex.operator === 'isnullorEmpty',\n        errorMessage: ex.errorMessage,\n        value: $420fc835a380b3a6$export$c72d34660a162238(ex),\n        onChange: (e, v)=>props.onUpdateExpression({\n                value: v\n            }, props.index)\n    }));\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $f9294a04a77df05a$export$353f5b6fc5456de1(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, Object.assign({}, props, {\n        styles: {\n            root: Object.assign({\n                backgroundColor: 'transparent',\n                height: '30px',\n                width: props.width,\n                padding: 0\n            }, props.rootStyle),\n            rootDisabled: {\n                backgroundColor: 'transparent'\n            },\n            icon: {\n                color: props.themePalette.themePrimary\n            },\n            label: {\n                fontWeight: '400',\n                textAlign: props.textAlign || 'left'\n            }\n        },\n        iconProps: {\n            iconName: props.iconName\n        }\n    }));\n}\n\n\n\n\n\n\nconst $7c89aab16f679c36$var$maxClauses = 5;\nfunction $7c89aab16f679c36$var$getColumnWithName(columnName, columns) {\n    for(let i = 0; i < columns.length; i++){\n        if (columns[i].name === columnName) return columns[i];\n    }\n}\nfunction $7c89aab16f679c36$var$validateExpression(ex) {\n    if (ex.operator === 'isnullorEmpty') {\n        ex.errorMessage = null;\n        return;\n    }\n    const s = (0, $420fc835a380b3a6$export$c72d34660a162238)(ex);\n    if (s.length === 0) ex.errorMessage = (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRequired;\n    else ex.errorMessage = null;\n}\nfunction $7c89aab16f679c36$var$clearExpressionValidation(ex) {\n    if (ex.operator === 'isnullorEmpty') {\n        ex.errorMessage = null;\n        return;\n    }\n    const s = (0, $420fc835a380b3a6$export$c72d34660a162238)(ex);\n    if (s.length !== 0) ex.errorMessage = null;\n}\nfunction $7c89aab16f679c36$var$getGroupClauses(currClause, index, disableGroupOR) {\n    let keys;\n    if (index === 0) keys = [\n        [\n            null,\n            (0, $d5b6ce321475881f$export$21c51bc433c16634).searchWHERE\n        ]\n    ];\n    else {\n        keys = [\n            [\n                '&&',\n                (0, $d5b6ce321475881f$export$21c51bc433c16634).searchAND\n            ]\n        ];\n        if (!disableGroupOR) keys.push([\n            '||',\n            (0, $d5b6ce321475881f$export$21c51bc433c16634).searchOR\n        ]);\n    }\n    return keys.map((key, i)=>{\n        const [clause, text] = key;\n        const selected = currClause == clause; //deliberate double equal \n        const option = {\n            key: i,\n            text: text,\n            data: clause,\n            selected: selected\n        };\n        return option;\n    });\n}\nfunction $7c89aab16f679c36$var$_Search(_props) {\n    class __Search extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = this.getInitialState(this.props);\n            this.dropdownRef = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                return (_a = this.dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n            };\n        }\n        getInitialState(props) {\n            const initialState = {\n                groups: props.initializer.search || [\n                    this.newGroup(0, null)\n                ],\n                sortedColumns: [\n                    ...props.initializer.columns\n                ].sort((a, b)=>a.name.localeCompare(b.name)),\n                initializer: props.initializer\n            };\n            initialState.groups.forEach((group)=>{\n                group.expressions.forEach((ex)=>ex.unlocked = group.expressions.length <= 2);\n            });\n            return initialState;\n        }\n        componentDidUpdate() {\n            if (!(0, $e295d8097c1ad61a$exports).deepCompare(this.props.initializer, this.state.initializer)) this.setState(this.getInitialState(this.props));\n        }\n        validateAndSearch() {\n            const groups = [\n                ...this.state.groups\n            ];\n            groups.forEach((group)=>{\n                group.expressions.forEach($7c89aab16f679c36$var$validateExpression);\n                const errors = group.expressions.reduce((p, c)=>p || c.errorMessage, '');\n                if (errors) this.setState({\n                    groups: groups\n                });\n                else this.props.onSelect(this.state.groups);\n            });\n        }\n        newGroup(key, clause) {\n            const group = {\n                key: key,\n                clause: clause,\n                expressions: [\n                    this.newExpression(0, null)\n                ]\n            };\n            return group;\n        }\n        updateGroup(partialGroup, groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = Object.assign(Object.assign({}, groups[groupIndex]), partialGroup);\n            groups[groupIndex] = group;\n            this.setState({\n                groups: groups\n            });\n        }\n        addGroup() {\n            const groups = [\n                ...this.state.groups\n            ];\n            const maxKey = groups.reduce((max, p)=>p.key > max ? p.key : max, groups[0].key);\n            const newGroup = this.newGroup(maxKey + 1, '&&');\n            groups.push(newGroup);\n            this.setState({\n                groups: groups\n            });\n        }\n        deleteGroup(groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            groups.splice(groupIndex, 1);\n            this.setState({\n                groups: groups\n            });\n        }\n        newExpression(key, clause) {\n            const ex = {\n                key: key,\n                clause: clause,\n                name: null,\n                operator: 'contains',\n                value: ''\n            };\n            return ex;\n        }\n        addExpression(groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = Object.assign({}, groups[groupIndex]);\n            const expressions = [\n                ...group.expressions\n            ];\n            const maxKey = expressions.reduce((max, p)=>p.key > max ? p.key : max, expressions[0].key);\n            const newEx = this.newExpression(maxKey + 1, '&&');\n            expressions.push(newEx);\n            if (expressions.length === 2) newEx.unlocked = true;\n            else {\n                expressions.forEach((ex)=>ex.unlocked = false);\n                newEx.clause = expressions[1].clause;\n            }\n            group.expressions = expressions;\n            groups[groupIndex] = group;\n            this.setState({\n                groups: groups\n            });\n        }\n        updateExpression(partialEx, groupIndex, index) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = Object.assign({}, groups[groupIndex]);\n            const expressions = [\n                ...group.expressions\n            ];\n            const currentEx = expressions[index];\n            if (currentEx.name !== partialEx.name) {\n                //choose an appropriate operator when switching data type\n                const oldColumn = $7c89aab16f679c36$var$getColumnWithName(currentEx.name, this.state.sortedColumns);\n                const newColumn = $7c89aab16f679c36$var$getColumnWithName(partialEx.name, this.state.sortedColumns);\n                const oldType = oldColumn && oldColumn.type;\n                const newType = newColumn && newColumn.type;\n                if (oldType !== newType) {\n                    const newOperators = (0, $420fc835a380b3a6$export$c2b32f315f251228)(newColumn).map((validOperator)=>validOperator[0]);\n                    //see if old operator is compatible\n                    if (newOperators.indexOf(currentEx.operator) < 0) //not compatible, so choose \"equal\"\n                    partialEx.operator = '==';\n                }\n            }\n            const ex = Object.assign(Object.assign({}, currentEx), partialEx);\n            $7c89aab16f679c36$var$clearExpressionValidation(ex);\n            expressions[index] = ex;\n            group.expressions = expressions;\n            groups[groupIndex] = group;\n            this.setState({\n                groups: groups\n            });\n        }\n        deleteExpression(groupIndex, index) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = Object.assign({}, groups[groupIndex]);\n            const expressions = [\n                ...group.expressions\n            ];\n            expressions.splice(index, 1);\n            if (expressions.length === 2) expressions[1].unlocked = true;\n            group.expressions = expressions;\n            groups[groupIndex] = group;\n            this.setState({\n                groups: groups\n            });\n        }\n        render() {\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                className: \"sanddance-search\",\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearch\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, this.state.groups.map((group, groupIndex)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: \"sanddance-search-group\",\n                    key: group.key\n                }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n                    collapseLabel: this.props.collapseLabels,\n                    className: \"search-group-clause\",\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearchClause,\n                    disabled: groupIndex === 0 || this.props.disableGroupOR,\n                    dropdownWidth: 120,\n                    options: $7c89aab16f679c36$var$getGroupClauses(group.clause, groupIndex, this.props.disableGroupOR),\n                    onChange: (e, o)=>this.updateGroup({\n                            clause: o.data\n                        }, groupIndex)\n                }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, group.expressions.map((ex, i)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                        className: \"sanddance-search-expression\",\n                        key: ex.key\n                    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $420fc835a380b3a6$export$793106cac50ab579), {\n                        dropdownRef: groupIndex === 0 && i === 0 ? this.dropdownRef : undefined,\n                        collapseLabels: this.props.collapseLabels,\n                        onUpdateExpression: (ex, i)=>this.updateExpression(ex, groupIndex, i),\n                        autoCompleteDistinctValues: this.props.autoCompleteDistinctValues,\n                        index: i,\n                        columns: this.state.sortedColumns,\n                        data: this.props.data,\n                        searchExpression: ex,\n                        disableOR: this.props.disableExpressionOR,\n                        column: $7c89aab16f679c36$var$getColumnWithName(ex.name, this.state.sortedColumns)\n                    }), group.expressions.length > 1 && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f9294a04a77df05a$export$353f5b6fc5456de1), {\n                        themePalette: this.props.themePalette,\n                        className: \"search-action\",\n                        iconName: \"Cancel\",\n                        onClick: ()=>this.deleteExpression(groupIndex, i),\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonDeleteExpression\n                    })))), group.expressions.length < $7c89aab16f679c36$var$maxClauses && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f9294a04a77df05a$export$353f5b6fc5456de1), {\n                    themePalette: this.props.themePalette,\n                    className: \"search-action\",\n                    iconName: \"Add\",\n                    onClick: ()=>this.addExpression(groupIndex),\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonAddExpression\n                })), this.state.groups.length > 1 && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f9294a04a77df05a$export$353f5b6fc5456de1), {\n                    themePalette: this.props.themePalette,\n                    className: \"search-action\",\n                    iconName: \"Cancel\",\n                    onClick: ()=>this.deleteGroup(groupIndex),\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonDeleteExpressionGroup\n                }))), this.state.groups.length < $7c89aab16f679c36$var$maxClauses && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f9294a04a77df05a$export$353f5b6fc5456de1), {\n                themePalette: this.props.themePalette,\n                className: \"search-action search-bottom-action\",\n                iconName: \"Add\",\n                onClick: ()=>this.addGroup(),\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonAddExpressionGroup\n            }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                className: \"search-action search-bottom-action\",\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonSelect,\n                onClick: ()=>this.validateAndSearch()\n            }));\n        }\n    }\n    return new __Search(_props);\n}\nconst $7c89aab16f679c36$export$4b85d3515bd863a5 = $7c89aab16f679c36$var$_Search;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nvar $4293b5c02e7b8c3d$var$PresenterElement = (0, $1342cf7df79546f0$exports).VegaMorphCharts.PresenterElement;\nfunction $4293b5c02e7b8c3d$export$f80a6900d44a74ee(viewer) {\n    const tags = viewer.presenter.getElement($4293b5c02e7b8c3d$var$PresenterElement.gl).getElementsByTagName('canvas');\n    if (tags) return tags[0];\n}\nfunction $4293b5c02e7b8c3d$export$95ea862e038e2d34(viewer) {\n    const canvas = $4293b5c02e7b8c3d$export$f80a6900d44a74ee(viewer);\n    if (canvas) canvas.tabIndex = -1;\n}\nconst $4293b5c02e7b8c3d$export$8e76ac9f37578d1b = {\n    webgl: !!document.createElement('canvas').getContext('webgl'),\n    webgl2: !!document.createElement('canvas').getContext('webgl2')\n};\n\n\n\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $ce16cf456563b677$export$83d89fbfd8236492 = '4.1.8';\n\n\nvar $e46ab1f70cbc9878$var$SandDance = $1342cf7df79546f0$exports;\nvar $e46ab1f70cbc9878$var$DataRefType;\n(function(DataRefType) {\n    DataRefType[DataRefType[\"none\"] = 0] = \"none\";\n    DataRefType[DataRefType[\"inline\"] = 1] = \"inline\";\n    DataRefType[DataRefType[\"url\"] = 2] = \"url\";\n})($e46ab1f70cbc9878$var$DataRefType || ($e46ab1f70cbc9878$var$DataRefType = {}));\nfunction $e46ab1f70cbc9878$var$filterSignals(signal) {\n    switch(signal.name){\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.XBins:\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.YBins:\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.FacetBins:\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.FacetVBins:\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.ColorBinCount:\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.ColorReverse:\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.PointScale:\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.TreeMapMethod:\n        case $e46ab1f70cbc9878$var$SandDance.constants.SignalNames.ZGrounded:\n            return false;\n        default:\n            return !!signal.bind;\n    }\n}\nfunction $e46ab1f70cbc9878$var$cloneData(vegaSpec) {\n    const data0 = vegaSpec.data[0];\n    const valuesData = data0;\n    const values = valuesData.values;\n    delete valuesData.values;\n    const data = $e46ab1f70cbc9878$var$SandDance.VegaMorphCharts.util.clone(vegaSpec.data);\n    valuesData.values = values;\n    return {\n        data: data,\n        values: values\n    };\n}\nfunction $e46ab1f70cbc9878$var$cloneScales(vegaSpec) {\n    return $e46ab1f70cbc9878$var$SandDance.VegaMorphCharts.util.clone(vegaSpec.scales);\n}\nfunction $e46ab1f70cbc9878$var$serializeSpec(vegaSpec, datafile, dataRefType, transform, scheme) {\n    const scales = $e46ab1f70cbc9878$var$cloneScales(vegaSpec);\n    const colorScale = scales.filter((scale)=>scale.name === $e46ab1f70cbc9878$var$SandDance.constants.ScaleNames.Color)[0];\n    if (scheme.indexOf('dual_') >= 0) colorScale.range = $e46ab1f70cbc9878$var$SandDance.colorSchemes.filter((cs)=>cs.scheme === scheme)[0].colors;\n    const clone = $e46ab1f70cbc9878$var$cloneData(vegaSpec);\n    const data0 = clone.data[0];\n    if (dataRefType === $e46ab1f70cbc9878$var$DataRefType.inline) {\n        const valuesData = data0;\n        valuesData.format = {\n            parse: 'auto',\n            type: 'json'\n        };\n        valuesData.values = clone.values;\n    } else if (dataRefType === $e46ab1f70cbc9878$var$DataRefType.none) {\n        const valuesData = data0;\n        valuesData.values = [];\n        if (transform) {\n            if (valuesData.transform) valuesData.transform.push.apply(valuesData.transform, transform);\n            else valuesData.transform = transform;\n        }\n    } else if (dataRefType === $e46ab1f70cbc9878$var$DataRefType.url) {\n        const urlData = data0;\n        urlData.url = datafile.dataUrl;\n        urlData.format = {\n            parse: 'auto',\n            type: datafile.type\n        };\n        if (transform) {\n            if (urlData.transform) urlData.transform.push.apply(urlData.transform, transform);\n            else urlData.transform = transform;\n        }\n    }\n    return Object.assign(Object.assign({}, vegaSpec), {\n        data: clone.data,\n        scales: scales\n    });\n}\nfunction $e46ab1f70cbc9878$var$defaultDataRefType(datafile) {\n    if (datafile.dataUrl) return $e46ab1f70cbc9878$var$DataRefType.url;\n    return $e46ab1f70cbc9878$var$DataRefType.none;\n}\nfunction $e46ab1f70cbc9878$var$initState(props) {\n    return {\n        showSystemDialog: false,\n        showVegaDialog: false,\n        dataRefType: $e46ab1f70cbc9878$var$defaultDataRefType(props.dataFile),\n        spec: null\n    };\n}\nfunction $e46ab1f70cbc9878$var$signalGroupKey(key) {\n    for(let i = 0; i < (0, $d5b6ce321475881f$export$21c51bc433c16634).signalGroups.length; i++){\n        if ((0, $d5b6ce321475881f$export$21c51bc433c16634).signalGroups[i].prefix === key) return key;\n    }\n    return '*';\n}\nfunction $e46ab1f70cbc9878$var$vegaSignalGroups(vegaSignals) {\n    const signalGroupMap = {};\n    vegaSignals.forEach((vs)=>{\n        const split = vs.name.split('_');\n        const key = $e46ab1f70cbc9878$var$signalGroupKey(split[0]);\n        signalGroupMap[key] = signalGroupMap[key] || [];\n        signalGroupMap[key].push(vs);\n    });\n    return signalGroupMap;\n}\nfunction $e46ab1f70cbc9878$var$_Settings(_props) {\n    class __Settings extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = $e46ab1f70cbc9878$var$initState(props);\n        }\n        render() {\n            const { props: props, state: state } = this;\n            if (!props.explorer.viewer || !props.explorer.viewer.vegaSpec) return null;\n            const options = [\n                {\n                    key: $e46ab1f70cbc9878$var$DataRefType.none,\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectVegaSpecDataNone,\n                    selected: this.state.dataRefType === $e46ab1f70cbc9878$var$DataRefType.none,\n                    data: $e46ab1f70cbc9878$var$DataRefType.none\n                },\n                !props.dataFile.rawText && {\n                    key: $e46ab1f70cbc9878$var$DataRefType.url,\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectVegaSpecDataUrl,\n                    selected: this.state.dataRefType === $e46ab1f70cbc9878$var$DataRefType.url,\n                    data: $e46ab1f70cbc9878$var$DataRefType.url\n                },\n                {\n                    key: $e46ab1f70cbc9878$var$DataRefType.inline,\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectVegaSpecDataInline,\n                    selected: this.state.dataRefType === $e46ab1f70cbc9878$var$DataRefType.inline,\n                    data: $e46ab1f70cbc9878$var$DataRefType.inline\n                }\n            ].filter(Boolean);\n            const signalGroupMap = $e46ab1f70cbc9878$var$vegaSignalGroups(props.explorer.viewer.vegaSpec.signals);\n            let first = true;\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).signalGroups.map((sg, gi)=>{\n                const vegaSignals = signalGroupMap[sg.prefix];\n                if (vegaSignals) {\n                    const filteredVegaSignals = vegaSignals.filter($e46ab1f70cbc9878$var$filterSignals);\n                    if (filteredVegaSignals.length > 0) return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                        key: sg.prefix,\n                        label: sg.label\n                    }, filteredVegaSignals.map((signal, i)=>{\n                        const ref = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n                        if (first) {\n                            first = false;\n                            props.explorer.dialogFocusHandler.focus = ()=>{\n                                const f = ref.current;\n                                if (f === null || f === void 0 ? void 0 : f.focus) f.focus();\n                            };\n                        }\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $00e2720d7006b5f2$export$8210dfe1863c478), {\n                            componentRef: ref,\n                            key: i,\n                            signal: signal,\n                            explorer: props.explorer,\n                            initialValue: (0, $00e2720d7006b5f2$export$d54e4e563d2a9303)(props.explorer, signal),\n                            newViewStateTarget: false\n                        });\n                    }));\n                }\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelChartCanvas\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelShowAxes,\n                defaultChecked: !props.hideAxes,\n                onChange: (e, checked)=>props.onToggleAxes(!checked)\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelShowLegend,\n                defaultChecked: !props.hideLegend,\n                onChange: (e, checked)=>props.onToggleLegend(!checked)\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTools\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonShowVegaSpec,\n                onClick: ()=>this.setState({\n                        showVegaDialog: true,\n                        spec: $e46ab1f70cbc9878$var$serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, this.state.dataRefType, props.explorer.viewer.getInsight().transform, this.props.scheme)\n                    })\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSnapshots\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSnapshotSettingThumbnailWidth,\n                onChange: (value)=>{\n                    this.props.explorer.snapshotThumbWidth = value;\n                },\n                min: 100,\n                max: 800,\n                defaultValue: this.props.explorer.snapshotThumbWidth\n            })), props.additionalSettings && props.additionalSettings.map((g, i)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                    key: i,\n                    label: g.groupLabel\n                }, g.children)), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSystem\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSystemInfo,\n                onClick: ()=>this.setState({\n                        showSystemDialog: true\n                    })\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                hidden: !state.showVegaDialog,\n                onDismiss: ()=>this.setState($e46ab1f70cbc9878$var$initState(this.props)),\n                minWidth: \"80%\",\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelVegaSpec,\n                buttons: [\n                    (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                        key: \"copy\",\n                        iconProps: {\n                            iconName: 'Copy'\n                        },\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonCopyToClipboard,\n                        onClick: ()=>{\n                            const pre = document.getElementById('sanddance-vega-spec');\n                            const range = document.createRange();\n                            range.selectNode(pre);\n                            const selection = window.getSelection();\n                            selection.removeAllRanges();\n                            selection.addRange(range);\n                            document.execCommand('copy');\n                        }\n                    }),\n                    (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n                        key: \"edit\",\n                        iconProps: {\n                            iconName: 'OpenInNewWindow'\n                        },\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonLaunchVegaEditor,\n                        onClick: ()=>{\n                            window.open('https://vega.github.io/editor/', '_blank');\n                        }\n                    })\n                ]\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelVegaSpecData,\n                options: options,\n                onChange: (e, o)=>this.setState({\n                        dataRefType: o.data,\n                        spec: $e46ab1f70cbc9878$var$serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, o.data, props.explorer.viewer.getInsight().transform, this.props.scheme)\n                    })\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"pre\", {\n                id: \"sanddance-vega-spec\"\n            }, JSON.stringify(this.state.spec, null, 2)), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelVegaSpecNotes)), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                hidden: !state.showSystemDialog,\n                onDismiss: ()=>this.setState($e46ab1f70cbc9878$var$initState(this.props)),\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSystemInfo\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"ul\", null, this.props.children, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, \"SandDanceExplorer version: \", (0, $ce16cf456563b677$export$83d89fbfd8236492)), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, \"SandDanceReact version: \", $d76008c8107bb02f$export$83d89fbfd8236492), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, \"SandDance version: \", $e46ab1f70cbc9878$var$SandDance.version), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, \"Vega-MorphCharts version: \", $e46ab1f70cbc9878$var$SandDance.VegaMorphCharts.version), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, \"WebGL enabled: \", (0, $4293b5c02e7b8c3d$export$8e76ac9f37578d1b).webgl ? (0, $d5b6ce321475881f$export$21c51bc433c16634).labelYes : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelNo), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, \"WebGL2 enabled: \", (0, $4293b5c02e7b8c3d$export$8e76ac9f37578d1b).webgl2 ? (0, $d5b6ce321475881f$export$21c51bc433c16634).labelYes : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelNo))));\n        }\n    }\n    return new __Settings(_props);\n}\nconst $e46ab1f70cbc9878$export$c72f6eaae7b9adff = $e46ab1f70cbc9878$var$_Settings;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\nfunction $e07b04fee87ea13f$var$_SnapshotEditor(_props) {\n    class __SnapshotEditor extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                showEditFormDialog: false,\n                title: '',\n                description: '',\n                image: null,\n                bgColor: null,\n                insight: null,\n                editIndex: -1\n            };\n        }\n        resize(src, thumbWidth) {\n            if (!src) return;\n            const img = new Image();\n            img.onload = ()=>{\n                const canvas = document.createElement('canvas'), ctx = canvas.getContext('2d');\n                const ratio = img.width / thumbWidth;\n                canvas.height = img.height / ratio;\n                canvas.width = thumbWidth;\n                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n                const image = canvas.toDataURL();\n                this.setState({\n                    image: image\n                });\n            };\n            img.src = src;\n        }\n        editSnapshot(snapshot, editIndex = -1) {\n            if (snapshot) this.setState(Object.assign(Object.assign({\n                showEditFormDialog: true\n            }, snapshot), {\n                editIndex: editIndex\n            }));\n            else {\n                const { explorer: explorer } = this.props;\n                const signalValues = explorer.viewer.getSignalValues();\n                explorer.viewer.deselect().then(()=>{\n                    const canvas = (0, $4293b5c02e7b8c3d$export$f80a6900d44a74ee)(explorer.viewer);\n                    const bgColor = canvas && window.getComputedStyle(canvas).backgroundColor;\n                    const insight = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone(explorer.viewer.getInsight());\n                    delete insight.size;\n                    insight.signalValues = signalValues;\n                    const title = this.props.getTitle && this.props.getTitle(insight) || '';\n                    const description = this.props.getDescription && this.props.getDescription(insight) || '';\n                    this.setState({\n                        showEditFormDialog: true,\n                        bgColor: bgColor,\n                        title: title,\n                        description: description,\n                        insight: insight,\n                        image: null,\n                        editIndex: editIndex\n                    });\n                    //allow deselection to render\n                    setTimeout(()=>{\n                        explorer.viewer.presenter.canvasToDataURL().then((dataUrl)=>{\n                            this.resize(dataUrl, explorer.snapshotThumbWidth);\n                        });\n                    }, 500);\n                });\n            }\n        }\n        render() {\n            var _a, _b;\n            const { explorer: explorer } = this.props;\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                modalProps: {\n                    className: (0, $e295d8097c1ad61a$exports).classList('sanddance-snapshot-dialog', this.props.theme)\n                },\n                minWidth: `${explorer.snapshotThumbWidth + 64}px`,\n                hidden: !this.state.showEditFormDialog,\n                onDismiss: ()=>this.setState({\n                        showEditFormDialog: false\n                    }),\n                title: this.state.editIndex >= 0 ? (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonEditSnapshot : (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonCreateSnapshot,\n                buttons: (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                    disabled: !this.state.image || !this.state.title,\n                    key: 0,\n                    onClick: (e)=>{\n                        const setup = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone(explorer.getSetup());\n                        if (setup.camera !== 'hold') //get the latest camera movement, instead of what's in state\n                        setup.camera = explorer.viewer.getCamera();\n                        const snapshot = {\n                            title: this.state.title,\n                            description: this.state.description,\n                            insight: this.state.insight,\n                            image: this.state.image,\n                            bgColor: this.state.bgColor,\n                            setup: setup\n                        };\n                        this.props.modifySnapShot && this.props.modifySnapShot(snapshot);\n                        this.props.onWriteSnapshot(snapshot, this.state.editIndex);\n                        this.setState({\n                            showEditFormDialog: false,\n                            title: '',\n                            description: '',\n                            image: null\n                        });\n                    },\n                    iconProps: {\n                        iconName: 'Camera'\n                    },\n                    text: this.state.editIndex >= 0 ? (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonUpdateSnapshot : (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonCreateSnapshot\n                })\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.TextField, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSnapshotTitle,\n                onChange: (e, title)=>this.setState({\n                        title: title\n                    }),\n                value: this.state.title\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.TextField, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSnapshotDescription,\n                onChange: (e, description)=>this.setState({\n                        description: description\n                    }),\n                value: this.state.description,\n                multiline: true\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: 'thumbnail'\n            }, !this.state.image && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Spinner, null), this.state.image && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"img\", {\n                src: this.state.image,\n                style: {\n                    backgroundColor: this.state.bgColor\n                }\n            })), ((_b = (_a = explorer.viewer) === null || _a === void 0 ? void 0 : _a.colorContexts) === null || _b === void 0 ? void 0 : _b.length) > 1 && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorFilter));\n        }\n    }\n    return new __SnapshotEditor(_props);\n}\nconst $e07b04fee87ea13f$export$15b376344cc89d12 = $e07b04fee87ea13f$var$_SnapshotEditor;\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\n\nfunction $ce6d2e0261fc46dc$var$_Snapshots(_props) {\n    class __Snapshots extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                confirmation: null,\n                title: '',\n                description: '',\n                image: null,\n                bgColor: null,\n                insight: null\n            };\n        }\n        render() {\n            const items = [\n                {\n                    key: 'clear',\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonClearSnapshots,\n                    onClick: ()=>this.setState({\n                            confirmation: {\n                                buttonText: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonClearSnapshots,\n                                handler: ()=>this.props.onClearSnapshots()\n                            }\n                        }),\n                    disabled: this.props.snapshots.length === 0\n                }\n            ];\n            if (this.props.getTopActions) items.push.apply(items, this.props.getTopActions(this.props.snapshots));\n            const ref = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n            this.props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                (_a = ref.current) === null || _a === void 0 || _a.focus();\n            };\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                className: \"sanddance-snapshots\",\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSnapshots\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                componentRef: ref,\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonCreateSnapshot,\n                onClick: (e)=>this.props.editor.editSnapshot(),\n                split: true,\n                menuProps: {\n                    items: items\n                }\n            }), this.props.getChildren && this.props.getChildren(this.props.snapshots), this.state.confirmation && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                hidden: false,\n                buttons: (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.PrimaryButton, {\n                    key: 0,\n                    onClick: (e)=>{\n                        this.setState({\n                            confirmation: null\n                        });\n                        this.state.confirmation.handler();\n                    },\n                    iconProps: {\n                        iconName: 'Delete'\n                    },\n                    text: this.state.confirmation.buttonText\n                }),\n                onDismiss: ()=>this.setState({\n                        confirmation: null\n                    })\n            }, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelConfirmation), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, this.props.snapshots.map((snapshot, i)=>{\n                const actions = this.props.getActions && this.props.getActions(snapshot, i) || [];\n                actions.push({\n                    iconButtonProps: {\n                        themePalette: this.props.themePalette,\n                        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonEditSnapshot,\n                        onClick: (e)=>this.props.editor.editSnapshot(snapshot, i),\n                        iconName: 'Edit'\n                    }\n                });\n                if (this.props.snapshots.length > 1) actions.push({\n                    iconButtonProps: {\n                        disabled: i === 0,\n                        themePalette: this.props.themePalette,\n                        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonMoveUp,\n                        onClick: (e)=>this.props.onMoveUp(i),\n                        iconName: 'SortUp'\n                    }\n                }, {\n                    iconButtonProps: {\n                        disabled: i > this.props.snapshots.length - 2,\n                        themePalette: this.props.themePalette,\n                        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonMoveDown,\n                        onClick: (e)=>this.props.onMoveDown(i),\n                        iconName: 'SortDown'\n                    }\n                });\n                actions.push({\n                    iconButtonProps: {\n                        themePalette: this.props.themePalette,\n                        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonDeleteSnapshot,\n                        onClick: ()=>this.setState({\n                                confirmation: {\n                                    buttonText: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonDeleteSnapshot,\n                                    handler: ()=>this.props.onRemoveSnapshot(i)\n                                }\n                            }),\n                        iconName: 'Delete'\n                    }\n                });\n                return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    key: i,\n                    className: (0, $e295d8097c1ad61a$exports).classList('snapshot', i === this.props.selectedSnapshotIndex && 'selected')\n                }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    onClick: (e)=>this.props.onSnapshotClick(snapshot, i)\n                }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: 'title'\n                }, snapshot.title), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    className: 'thumbnail'\n                }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"img\", {\n                    title: snapshot.description,\n                    src: snapshot.image,\n                    style: {\n                        backgroundColor: snapshot.bgColor\n                    }\n                }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement($ce6d2e0261fc46dc$var$Actions, {\n                    actions: actions,\n                    snapshot: snapshot\n                }));\n            }))));\n        }\n    }\n    return new __Snapshots(_props);\n}\nconst $ce6d2e0261fc46dc$export$3e09886744a57615 = $ce6d2e0261fc46dc$var$_Snapshots;\nfunction $ce6d2e0261fc46dc$var$Actions(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"actions\"\n    }, props.actions.map((action, i)=>{\n        if (action.iconButtonProps) return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), Object.assign({\n            key: i\n        }, action.iconButtonProps));\n        if (action.element) return action.element;\n    }));\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\n\n\nconst $7169c11dc639bbc5$var$positions = [\n    [\n        'x',\n        (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasX\n    ],\n    [\n        'y',\n        (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasY\n    ],\n    [\n        'z',\n        (0, $d5b6ce321475881f$export$21c51bc433c16634).labelAliasZ\n    ]\n];\nconst $7169c11dc639bbc5$var$autoScrubInterval = 50; //tune to get the smoothest animation while able to do an update pass through React\nfunction $7169c11dc639bbc5$var$_TransitionEditor(_props) {\n    class __TransitionEditor extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.state = Object.assign({\n                scrub: 100,\n                pauseDisabled: true\n            }, this.initialCalc(props.transitionDurations));\n            this.autoScrubber = new $7169c11dc639bbc5$var$AutoScrubber($7169c11dc639bbc5$var$autoScrubInterval, (direction, interval)=>{\n                const totalMs = this.state.totalTransition * 1000;\n                const currentMs = this.state.scrub / 100 * totalMs;\n                const scrubMs = currentMs + direction * interval;\n                let scrub = scrubMs / totalMs * 100;\n                if (direction < 0 && scrub <= 0) {\n                    scrub = 0;\n                    this.autoScrubber.stop();\n                }\n                if (direction > 0 && scrub >= 100) {\n                    scrub = 100;\n                    this.autoScrubber.stop();\n                }\n                this.setScrubState(scrub);\n            });\n        }\n        initialCalc(transitionDurations) {\n            const totalTransition = (transitionDurations.position + transitionDurations.stagger) / 1000;\n            const staggerPercent = transitionDurations.stagger === 0 ? 1 : transitionDurations.stagger / (totalTransition * 1000) * 100;\n            const viewTransition = transitionDurations.view / 1000;\n            return {\n                totalTransition: totalTransition,\n                staggerPercent: staggerPercent,\n                viewTransition: viewTransition\n            };\n        }\n        setScrubState(scrub) {\n            const { morphChartsRenderResult: morphChartsRenderResult, morphchartsref: morphchartsref } = this.props.explorer.viewer.presenter;\n            morphchartsref.core.renderer.transitionTime = scrub / 100;\n            morphChartsRenderResult.setTransitionTimeAxesVisibility();\n            scrub = Math.round(scrub);\n            this.setState({\n                scrub: scrub,\n                pauseDisabled: this.autoScrubber.isStopped()\n            });\n        }\n        setDurations() {\n            setTimeout(()=>{\n                const { props: props, state: state } = this;\n                const { totalTransition: totalTransition, staggerPercent: staggerPercent, viewTransition: viewTransition } = state;\n                const stagger = totalTransition * staggerPercent / 100;\n                const { transitionDurations: transitionDurations } = props;\n                transitionDurations.position = (totalTransition - stagger) * 1000;\n                transitionDurations.stagger = stagger * 1000;\n                transitionDurations.view = viewTransition * 1000;\n                $7169c11dc639bbc5$export$39fa25c8c3576e7a(props.explorer.viewer, transitionDurations);\n                props.changeSetup(null, false);\n            });\n        }\n        render() {\n            const { props: props, state: state } = this;\n            const { explorer: explorer, transitionDurations: transitionDurations, changeSetup: changeSetup } = props;\n            const sliderRef = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n            explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                return (_a = sliderRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n            };\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransition\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Slider, {\n                componentRef: sliderRef,\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionScrubber,\n                min: 0,\n                max: 100,\n                valueFormat: (0, $d5b6ce321475881f$export$21c51bc433c16634).percentValueFormat,\n                value: state.scrub,\n                onChange: (scrub)=>{\n                    this.autoScrubber.stop();\n                    this.setScrubState(scrub);\n                }\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                themePalette: props.themePalette,\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonTransitionReverse,\n                iconName: 'PlayReverseResume',\n                onClick: ()=>{\n                    this.autoScrubber.toggleScrubbing(-1);\n                    if (state.scrub === 0) this.setState({\n                        scrub: 100\n                    });\n                }\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                themePalette: props.themePalette,\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonTransitionPause,\n                iconName: 'Pause',\n                onClick: ()=>{\n                    this.autoScrubber.togglePause();\n                },\n                disabled: state.pauseDisabled\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                themePalette: props.themePalette,\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonTransitionPlay,\n                iconName: 'PlayResume',\n                onClick: ()=>{\n                    this.autoScrubber.toggleScrubbing(1);\n                    if (state.scrub === 100) this.setState({\n                        scrub: 0\n                    });\n                }\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionOptions\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHoldCamera,\n                checked: explorer.state.holdCamera,\n                onChange: (e, holdCamera)=>{\n                    changeSetup({\n                        holdCamera: holdCamera\n                    }, false);\n                }\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.ChoiceGroup, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStaggerBy,\n                selectedKey: props.transitionType,\n                options: [\n                    {\n                        key: 'ordinal',\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStaggerByOrdinal\n                    },\n                    {\n                        key: 'column',\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStaggerByColumn\n                    },\n                    {\n                        key: 'position',\n                        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStaggerByPosition\n                    }\n                ],\n                onChange: (e, o)=>{\n                    const transitionType = o.key;\n                    changeSetup({\n                        transitionType: transitionType\n                    }, true);\n                }\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStaggerOptions\n            }, (()=>{\n                switch(props.transitionType){\n                    case 'column':\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n                            collapseLabel: props.compactUI,\n                            label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStaggerByColumn,\n                            options: $7169c11dc639bbc5$var$getColumnOptions(props, props.transitionColumn.name),\n                            onChange: (e, o)=>{\n                                changeSetup({\n                                    transitionColumn: o.data\n                                }, true);\n                            }\n                        });\n                    case 'position':\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n                            collapseLabel: props.compactUI,\n                            label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStaggerByPosition,\n                            options: $7169c11dc639bbc5$var$positions.map(([key, text])=>{\n                                return {\n                                    key: key,\n                                    text: text,\n                                    selected: props.transitionDimension === key\n                                };\n                            }),\n                            onChange: (e, o)=>{\n                                changeSetup({\n                                    transitionDimension: o.key\n                                }, true);\n                            }\n                        });\n                }\n            })(), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStaggerReverse,\n                checked: props.transitionReverse,\n                onChange: (e, transitionReverse)=>changeSetup({\n                        transitionReverse: transitionReverse\n                    }, true)\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionDurations\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionDuration,\n                onChange: (totalTransition)=>{\n                    this.setState({\n                        totalTransition: totalTransition\n                    });\n                    this.setDurations();\n                },\n                min: 0,\n                max: 5,\n                step: 0.1,\n                value: state.totalTransition\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionStagger,\n                onChange: (staggerPercent)=>{\n                    this.setState({\n                        staggerPercent: staggerPercent\n                    });\n                    this.setDurations();\n                },\n                min: 0,\n                max: 100,\n                valueFormat: (0, $d5b6ce321475881f$export$21c51bc433c16634).percentValueFormat,\n                value: state.staggerPercent\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Slider, {\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransitionCamera,\n                onChange: (viewTransition)=>{\n                    this.setState({\n                        viewTransition: viewTransition\n                    });\n                    this.setDurations();\n                },\n                min: 0,\n                max: 5,\n                step: 0.1,\n                value: state.viewTransition\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f9294a04a77df05a$export$353f5b6fc5456de1), {\n                themePalette: props.themePalette,\n                onClick: ()=>{\n                    const defaults = (0, $1342cf7df79546f0$exports).VegaMorphCharts.defaults.defaultPresenterConfig.transitionDurations;\n                    const { position: position, stagger: stagger, view: view } = defaults;\n                    transitionDurations.position = position;\n                    transitionDurations.stagger = stagger;\n                    transitionDurations.view = view;\n                    this.setState(Object.assign({}, this.initialCalc(transitionDurations)));\n                    this.setDurations();\n                },\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonResetToDefault\n            })));\n        }\n    }\n    return new __TransitionEditor(_props);\n}\nconst $7169c11dc639bbc5$export$df231814b4232ebd = $7169c11dc639bbc5$var$_TransitionEditor;\nfunction $7169c11dc639bbc5$var$groupOptions(sectionName, columns, selectedKey) {\n    const options = columns.map((column)=>{\n        const option = {\n            key: `column:${column.name}`,\n            text: column.name,\n            data: column,\n            selected: column.name === selectedKey\n        };\n        return option;\n    });\n    if (options.length) {\n        const option = {\n            key: sectionName,\n            text: sectionName,\n            itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n        };\n        options.unshift(option);\n    }\n    return options;\n}\nfunction $7169c11dc639bbc5$var$getColumnOptions(props, selectedKey) {\n    const quantitativeGroup = $7169c11dc639bbc5$var$groupOptions((0, $d5b6ce321475881f$export$21c51bc433c16634).selectNumeric, props.quantitativeColumns, selectedKey);\n    const categoricGroup = $7169c11dc639bbc5$var$groupOptions((0, $d5b6ce321475881f$export$21c51bc433c16634).selectNonNumeric, props.categoricalColumns, selectedKey);\n    return quantitativeGroup.concat(categoricGroup);\n}\nfunction $7169c11dc639bbc5$export$d5639c01d489b0c(state) {\n    const reverse = state.transitionReverse;\n    switch(state.transitionType){\n        case 'ordinal':\n            return {\n                type: 'ordinal',\n                reverse: reverse\n            };\n        case 'column':\n            return {\n                type: 'column',\n                column: state.transitionColumn,\n                reverse: reverse\n            };\n        case 'position':\n            return {\n                type: 'position',\n                dimension: state.transitionDimension,\n                reverse: reverse\n            };\n    }\n}\nfunction $7169c11dc639bbc5$export$39fa25c8c3576e7a(viewer, transitionDurations) {\n    var _a, _b;\n    const config = (_b = (_a = viewer === null || viewer === void 0 ? void 0 : viewer.presenter) === null || _a === void 0 ? void 0 : _a.morphchartsref) === null || _b === void 0 ? void 0 : _b.core.config;\n    if (config) {\n        const { position: position, stagger: stagger } = transitionDurations;\n        config.transitionDuration = position;\n        config.transitionStaggering = stagger;\n    }\n}\nclass $7169c11dc639bbc5$var$AutoScrubber {\n    constructor(interval, onInterval){\n        this.interval = interval;\n        this.onInterval = onInterval;\n    }\n    getSignedInterval() {\n        return this.interval * this.direction;\n    }\n    toggleScrubbing(direction) {\n        if (this.isScrubbing() && direction === this.direction) this.pause();\n        else this.start(direction);\n    }\n    isPaused() {\n        return !this.isScrubbing() && this.direction !== undefined;\n    }\n    isStopped() {\n        return !this.isScrubbing() && this.direction === undefined;\n    }\n    isScrubbing() {\n        return this.autoScrubTimer !== undefined;\n    }\n    togglePause() {\n        if (this.isScrubbing()) this.pause();\n        else if (this.direction) this.start(this.direction);\n    }\n    start(direction) {\n        this.direction = direction;\n        if (!this.isScrubbing()) this.autoScrubTimer = setInterval(()=>this.onInterval(this.direction, this.interval), this.interval);\n    }\n    pause() {\n        clearInterval(this.autoScrubTimer);\n        this.autoScrubTimer = undefined;\n    }\n    stop() {\n        this.pause();\n        this.direction = undefined;\n    }\n}\n\n\nvar $688b2ed8e5aa6452$exports = {};\n\n$parcel$export($688b2ed8e5aa6452$exports, \"Explorer\", () => $688b2ed8e5aa6452$export$43584986cb77a794);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\nconst $46e7ccd2bf7a69a1$var$className = 'sanddance-panel-tools';\nfunction $46e7ccd2bf7a69a1$var$ensureToolbar(panel) {\n    const existing = panel.getElementsByClassName($46e7ccd2bf7a69a1$var$className);\n    if (existing.length > 0) return existing[0];\n    else {\n        const div = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.addDiv(panel, $46e7ccd2bf7a69a1$var$className);\n        panel.insertAdjacentElement('afterbegin', div);\n        return div;\n    }\n}\nfunction $46e7ccd2bf7a69a1$export$225a002951c27da7(presenter, showLegend, props) {\n    const panel = presenter.getElement((0, $1342cf7df79546f0$exports).VegaMorphCharts.PresenterElement.panel);\n    const div = $46e7ccd2bf7a69a1$var$ensureToolbar(panel);\n    (0, $a601a4135959dcb0$export$e2253033e6e1df16).reactDOM.render($46e7ccd2bf7a69a1$var$ColorMap(props), div);\n    panel.style.display = showLegend ? '' : 'none';\n}\nfunction $46e7ccd2bf7a69a1$var$ColorMap(props) {\n    const menuProps = {\n        items: [\n            {\n                key: 'new',\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonColorSchemeRemap,\n                disabled: !props.canRemap || props.isRemap,\n                onClick: ()=>props.colorMapHandler(true)\n            },\n            {\n                key: 'old',\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonColorSchemeKeep,\n                disabled: !props.canRemap || !props.isRemap,\n                onClick: ()=>props.colorMapHandler(false)\n            }\n        ]\n    };\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n        styles: {\n            menuIcon: {\n                display: 'none'\n            }\n        },\n        themePalette: props.themePalette,\n        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonColorSchemeMap,\n        onClick: null,\n        iconName: props.canRemap ? 'FiltersSolid' : 'Filters',\n        menuProps: menuProps\n    }));\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $e3b58b932870fa44$export$ba25af89e7ea3c1a(newColumn, oldColumn, oldScheme) {\n    if (oldColumn && oldColumn.quantitative === newColumn.quantitative && $e3b58b932870fa44$var$defaultColorScheme(oldColumn) === $e3b58b932870fa44$var$defaultColorScheme(newColumn)) return oldScheme;\n    return $e3b58b932870fa44$var$defaultColorScheme(newColumn);\n}\nfunction $e3b58b932870fa44$var$defaultColorScheme(c) {\n    if (c.quantitative) return 'redyellowgreen';\n    else if (c.stats.distinctValueCount === 2) return 'dual_redgreen';\n    else if (c.stats.distinctValueCount <= 10) return 'category10';\n    return 'category20';\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\nfunction $9609e207e93b7923$export$2e2bcd8739ae039(x) {\n    return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString(\"en\").replace(/,/g, \"\") : x.toString(10);\n}\nfunction $9609e207e93b7923$export$8f8e23dd27dc19f5(x, p) {\n    if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n    var i, coefficient = x.slice(0, i);\n    // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n    // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n    return [\n        coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n        +x.slice(i + 1)\n    ];\n}\n\n\nfunction $75b9c15a84f36786$export$2e2bcd8739ae039(x) {\n    return x = (0, $9609e207e93b7923$export$8f8e23dd27dc19f5)(Math.abs(x)), x ? x[1] : NaN;\n}\n\n\nfunction $a4f5516ee00a18bc$export$2e2bcd8739ae039(grouping, thousands) {\n    return function(value, width) {\n        var i = value.length, t = [], j = 0, g = grouping[0], length = 0;\n        while(i > 0 && g > 0){\n            if (length + g + 1 > width) g = Math.max(1, width - length);\n            t.push(value.substring(i -= g, i + g));\n            if ((length += g + 1) > width) break;\n            g = grouping[j = (j + 1) % grouping.length];\n        }\n        return t.reverse().join(thousands);\n    };\n}\n\n\nfunction $3db498c77a24c909$export$2e2bcd8739ae039(numerals) {\n    return function(value) {\n        return value.replace(/[0-9]/g, function(i) {\n            return numerals[+i];\n        });\n    };\n}\n\n\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar $beac99c87b86c748$var$re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nfunction $beac99c87b86c748$export$2e2bcd8739ae039(specifier) {\n    if (!(match = $beac99c87b86c748$var$re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match;\n    return new $beac99c87b86c748$export$963aac351db36ed4({\n        fill: match[1],\n        align: match[2],\n        sign: match[3],\n        symbol: match[4],\n        zero: match[5],\n        width: match[6],\n        comma: match[7],\n        precision: match[8] && match[8].slice(1),\n        trim: match[9],\n        type: match[10]\n    });\n}\n$beac99c87b86c748$export$2e2bcd8739ae039.prototype = $beac99c87b86c748$export$963aac351db36ed4.prototype; // instanceof\nfunction $beac99c87b86c748$export$963aac351db36ed4(specifier) {\n    this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === undefined ? undefined : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n$beac99c87b86c748$export$963aac351db36ed4.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n\n\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nfunction $bd6ac69290a29cb5$export$2e2bcd8739ae039(s) {\n    out: for(var n = s.length, i = 1, i0 = -1, i1; i < n; ++i)switch(s[i]){\n        case \".\":\n            i0 = i1 = i;\n            break;\n        case \"0\":\n            if (i0 === 0) i0 = i;\n            i1 = i;\n            break;\n        default:\n            if (!+s[i]) break out;\n            if (i0 > 0) i0 = 0;\n            break;\n    }\n    return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n\n\n\n\nvar $58e383fbc32baa60$export$6863724d9a42263;\nfunction $58e383fbc32baa60$export$2e2bcd8739ae039(x, p) {\n    var d = (0, $9609e207e93b7923$export$8f8e23dd27dc19f5)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1], i = exponent - ($58e383fbc32baa60$export$6863724d9a42263 = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, $9609e207e93b7923$export$8f8e23dd27dc19f5)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n\n\n\nfunction $3903417d864b94de$export$2e2bcd8739ae039(x, p) {\n    var d = (0, $9609e207e93b7923$export$8f8e23dd27dc19f5)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1];\n    return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n\n\nvar $865b2da11efc775a$export$2e2bcd8739ae039 = {\n    \"%\": function(x, p) {\n        return (x * 100).toFixed(p);\n    },\n    \"b\": function(x) {\n        return Math.round(x).toString(2);\n    },\n    \"c\": function(x) {\n        return x + \"\";\n    },\n    \"d\": (0, $9609e207e93b7923$export$2e2bcd8739ae039),\n    \"e\": function(x, p) {\n        return x.toExponential(p);\n    },\n    \"f\": function(x, p) {\n        return x.toFixed(p);\n    },\n    \"g\": function(x, p) {\n        return x.toPrecision(p);\n    },\n    \"o\": function(x) {\n        return Math.round(x).toString(8);\n    },\n    \"p\": function(x, p) {\n        return (0, $3903417d864b94de$export$2e2bcd8739ae039)(x * 100, p);\n    },\n    \"r\": (0, $3903417d864b94de$export$2e2bcd8739ae039),\n    \"s\": (0, $58e383fbc32baa60$export$2e2bcd8739ae039),\n    \"X\": function(x) {\n        return Math.round(x).toString(16).toUpperCase();\n    },\n    \"x\": function(x) {\n        return Math.round(x).toString(16);\n    }\n};\n\n\n\nfunction $aca4ed01afa40869$export$2e2bcd8739ae039(x) {\n    return x;\n}\n\n\nvar $afe689d3eee04304$var$map = Array.prototype.map, $afe689d3eee04304$var$prefixes = [\n    \"y\",\n    \"z\",\n    \"a\",\n    \"f\",\n    \"p\",\n    \"n\",\n    \"\\xb5\",\n    \"m\",\n    \"\",\n    \"k\",\n    \"M\",\n    \"G\",\n    \"T\",\n    \"P\",\n    \"E\",\n    \"Z\",\n    \"Y\"\n];\nfunction $afe689d3eee04304$export$2e2bcd8739ae039(locale) {\n    var group = locale.grouping === undefined || locale.thousands === undefined ? (0, $aca4ed01afa40869$export$2e2bcd8739ae039) : (0, $a4f5516ee00a18bc$export$2e2bcd8739ae039)($afe689d3eee04304$var$map.call(locale.grouping, Number), locale.thousands + \"\"), currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\", currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\", decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\", numerals = locale.numerals === undefined ? (0, $aca4ed01afa40869$export$2e2bcd8739ae039) : (0, $3db498c77a24c909$export$2e2bcd8739ae039)($afe689d3eee04304$var$map.call(locale.numerals, String)), percent = locale.percent === undefined ? \"%\" : locale.percent + \"\", minus = locale.minus === undefined ? \"-\" : locale.minus + \"\", nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n    function newFormat(specifier) {\n        specifier = (0, $beac99c87b86c748$export$2e2bcd8739ae039)(specifier);\n        var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;\n        // The \"n\" type is an alias for \",g\".\n        if (type === \"n\") comma = true, type = \"g\";\n        else if (!(0, $865b2da11efc775a$export$2e2bcd8739ae039)[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n        // If zero fill is specified, padding goes after sign and before digits.\n        if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\";\n        // Compute the prefix and suffix.\n        // For SI-prefix, the suffix is lazily computed.\n        var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\", suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n        // What format function should we use?\n        // Is this an integer type?\n        // Can this type generate exponential notation?\n        var formatType = (0, $865b2da11efc775a$export$2e2bcd8739ae039)[type], maybeSuffix = /[defgprs%]/.test(type);\n        // Set the default precision if not specified,\n        // or clamp the specified precision to the supported range.\n        // For significant precision, it must be in [1, 21].\n        // For fixed precision, it must be in [0, 20].\n        precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n        function format(value) {\n            var valuePrefix = prefix, valueSuffix = suffix, i, n, c;\n            if (type === \"c\") {\n                valueSuffix = formatType(value) + valueSuffix;\n                value = \"\";\n            } else {\n                value = +value;\n                // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n                var valueNegative = value < 0 || 1 / value < 0;\n                // Perform the initial formatting.\n                value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n                // Trim insignificant zeros.\n                if (trim) value = (0, $bd6ac69290a29cb5$export$2e2bcd8739ae039)(value);\n                // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n                if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n                // Compute the prefix and suffix.\n                valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n                valueSuffix = (type === \"s\" ? $afe689d3eee04304$var$prefixes[8 + (0, $58e383fbc32baa60$export$6863724d9a42263) / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n                // Break the formatted value into the integer “value” part that can be\n                // grouped, and fractional or exponential “suffix” part that is not.\n                if (maybeSuffix) {\n                    i = -1, n = value.length;\n                    while(++i < n)if (c = value.charCodeAt(i), 48 > c || c > 57) {\n                        valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n                        value = value.slice(0, i);\n                        break;\n                    }\n                }\n            }\n            // If the fill character is not \"0\", grouping is applied before padding.\n            if (comma && !zero) value = group(value, Infinity);\n            // Compute the padding.\n            var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n            // If the fill character is \"0\", grouping is applied after padding.\n            if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n            // Reconstruct the final output based on the desired alignment.\n            switch(align){\n                case \"<\":\n                    value = valuePrefix + value + valueSuffix + padding;\n                    break;\n                case \"=\":\n                    value = valuePrefix + padding + value + valueSuffix;\n                    break;\n                case \"^\":\n                    value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n                    break;\n                default:\n                    value = padding + valuePrefix + value + valueSuffix;\n                    break;\n            }\n            return numerals(value);\n        }\n        format.toString = function() {\n            return specifier + \"\";\n        };\n        return format;\n    }\n    function formatPrefix(specifier, value) {\n        var f = newFormat((specifier = (0, $beac99c87b86c748$export$2e2bcd8739ae039)(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor((0, $75b9c15a84f36786$export$2e2bcd8739ae039)(value) / 3))) * 3, k = Math.pow(10, -e), prefix = $afe689d3eee04304$var$prefixes[8 + e / 3];\n        return function(value) {\n            return f(k * value) + prefix;\n        };\n    }\n    return {\n        format: newFormat,\n        formatPrefix: formatPrefix\n    };\n}\n\n\nvar $25eae809e43888aa$var$locale;\nvar $25eae809e43888aa$export$d9468344d3651243;\nvar $25eae809e43888aa$export$8d85692a469dde6f;\n$25eae809e43888aa$export$2e2bcd8739ae039({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [\n        3\n    ],\n    currency: [\n        \"$\",\n        \"\"\n    ],\n    minus: \"-\"\n});\nfunction $25eae809e43888aa$export$2e2bcd8739ae039(definition) {\n    $25eae809e43888aa$var$locale = (0, $afe689d3eee04304$export$2e2bcd8739ae039)(definition);\n    $25eae809e43888aa$export$d9468344d3651243 = $25eae809e43888aa$var$locale.format;\n    $25eae809e43888aa$export$8d85692a469dde6f = $25eae809e43888aa$var$locale.formatPrefix;\n    return $25eae809e43888aa$var$locale;\n}\n\n\nvar $86b892255d8eb4f0$export$f0297ce57faf7d71;\n(function(DataScopeId) {\n    DataScopeId[DataScopeId[\"AllData\"] = 0] = \"AllData\";\n    DataScopeId[DataScopeId[\"SelectedData\"] = 1] = \"SelectedData\";\n    DataScopeId[DataScopeId[\"FilteredData\"] = 2] = \"FilteredData\";\n})($86b892255d8eb4f0$export$f0297ce57faf7d71 || ($86b892255d8eb4f0$export$f0297ce57faf7d71 = {}));\nfunction $86b892255d8eb4f0$export$6d13117e74df8390(selectedItemIndex) {\n    selectedItemIndex[$86b892255d8eb4f0$export$f0297ce57faf7d71.AllData] = 0;\n    selectedItemIndex[$86b892255d8eb4f0$export$f0297ce57faf7d71.FilteredData] = 0;\n    selectedItemIndex[$86b892255d8eb4f0$export$f0297ce57faf7d71.SelectedData] = 0;\n}\nconst $86b892255d8eb4f0$var$shortFormat = (0, $25eae809e43888aa$export$d9468344d3651243)('.2~s');\nfunction $86b892255d8eb4f0$var$short(n) {\n    return n === -1 ? '--' : n ? n < 1000 ? n.toString() : $86b892255d8eb4f0$var$shortFormat(n) : '0';\n}\nfunction $86b892255d8eb4f0$export$3fb74a6ae4f1171d(props) {\n    const dataCount = Object.assign({\n        all: -1,\n        filtered: -1,\n        selected: -1\n    }, props.dataCount);\n    return props.compact ? (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $e295d8097c1ad61a$exports).classList('sanddance-datascope', 'compact'),\n        onClick: props.onCompactClick\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement($86b892255d8eb4f0$var$Compact, Object.assign({}, props, {\n        dataScopeId: $86b892255d8eb4f0$export$f0297ce57faf7d71.AllData,\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanAll,\n        count: dataCount.all\n    })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement($86b892255d8eb4f0$var$Compact, Object.assign({}, props, {\n        dataScopeId: $86b892255d8eb4f0$export$f0297ce57faf7d71.FilteredData,\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanFilter,\n        count: dataCount.filtered\n    })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement($86b892255d8eb4f0$var$Compact, Object.assign({}, props, {\n        dataScopeId: $86b892255d8eb4f0$export$f0297ce57faf7d71.SelectedData,\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanSelection,\n        count: dataCount.selected\n    }))) : (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $e295d8097c1ad61a$exports).classList('sanddance-datascope', 'extended', props.active && 'active')\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, props.dataSet), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"datascope-buttons\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement($86b892255d8eb4f0$var$DataScopeButton, Object.assign({}, props, {\n        dataScopeId: $86b892255d8eb4f0$export$f0297ce57faf7d71.AllData,\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanAll,\n        count: dataCount.all\n    })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement($86b892255d8eb4f0$var$DataScopeButton, Object.assign({}, props, {\n        dataScopeId: $86b892255d8eb4f0$export$f0297ce57faf7d71.FilteredData,\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanFilter,\n        count: dataCount.filtered\n    })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement($86b892255d8eb4f0$var$DataScopeButton, Object.assign({}, props, {\n        dataScopeId: $86b892255d8eb4f0$export$f0297ce57faf7d71.SelectedData,\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanSelection,\n        count: dataCount.selected\n    })))));\n}\nfunction $86b892255d8eb4f0$var$Compact(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: props.text,\n        onClick: ()=>{\n            props.onDataScopeClick(props.dataScopeId);\n        }\n    }, $86b892255d8eb4f0$var$short(props.count));\n}\nfunction $86b892255d8eb4f0$var$DataScopeButton(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f9294a04a77df05a$export$353f5b6fc5456de1), {\n        themePalette: props.themePalette,\n        className: (0, $e295d8097c1ad61a$exports).classList('datascope-button', props.selectedDataScope === props.dataScopeId && 'selected'),\n        disabled: props.disabled,\n        text: props.text,\n        onClick: ()=>{\n            props.onDataScopeClick(props.dataScopeId);\n        },\n        onRenderText: ()=>{\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                title: props.count > 0 ? props.count.toString() : ''\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"label\", null, props.text), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, $86b892255d8eb4f0$var$short(props.count)));\n        },\n        onRenderIcon: ()=>null\n    });\n}\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nfunction $c8096a1892befafb$export$fcc7818a78919c8c(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $e295d8097c1ad61a$exports).classList('scrollable-container', props.className),\n        role: props.role\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"scrollable\"\n    }, props.children));\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var $2752fa503c160704$export$f3b7566ffe363e3b;\n(function(SideTabId) {\n    SideTabId[SideTabId[\"ChartType\"] = 0] = \"ChartType\";\n    SideTabId[SideTabId[\"Data\"] = 1] = \"Data\";\n    SideTabId[SideTabId[\"Search\"] = 2] = \"Search\";\n    SideTabId[SideTabId[\"Color\"] = 3] = \"Color\";\n    SideTabId[SideTabId[\"Snapshots\"] = 4] = \"Snapshots\";\n    SideTabId[SideTabId[\"History\"] = 5] = \"History\";\n    SideTabId[SideTabId[\"Transition\"] = 6] = \"Transition\";\n    SideTabId[SideTabId[\"Settings\"] = 7] = \"Settings\";\n    SideTabId[SideTabId[\"Pin\"] = 8] = \"Pin\";\n    SideTabId[SideTabId[\"Collapse\"] = 9] = \"Collapse\";\n})($2752fa503c160704$export$f3b7566ffe363e3b || ($2752fa503c160704$export$f3b7566ffe363e3b = {}));\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nfunction $d7542c73853af2f5$export$a8fc19311f33df91(props) {\n    const selected = !props.closed && props.selectedSideTab === props.sideTabId;\n    const buttonProps = props.omitAriaSelected ? {} : {\n        'aria-selected': selected\n    };\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $e295d8097c1ad61a$exports).classList('vbutton', selected && 'selected')\n    }, props.badgeText && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"count\"\n    }, props.badgeText), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), Object.assign({}, buttonProps, {\n        role: props.role || 'tab',\n        themePalette: props.themePalette,\n        className: \"vbutton\",\n        iconName: props.iconName,\n        title: props.title,\n        onClick: ()=>{\n            props.onSideTabClick(props.sideTabId);\n        }\n    })));\n}\n\n\nfunction $a4defabaac4a9afe$export$1ba59dacbcbf90fe(props) {\n    const sidebuttons = [\n        {\n            sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).ChartType,\n            iconName: 'BIDashboard',\n            title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelChart\n        },\n        {\n            sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Color,\n            iconName: 'Color',\n            title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColor\n        },\n        {\n            sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Data,\n            iconName: 'Table',\n            title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelDataBrowser\n        },\n        {\n            sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Search,\n            iconName: 'Search',\n            title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSearch\n        },\n        !props.snapshotsHidden && {\n            sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Snapshots,\n            iconName: 'Camera',\n            title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelSnapshots\n        },\n        {\n            sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).History,\n            iconName: 'History',\n            title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistory\n        },\n        {\n            sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Transition,\n            iconName: 'Flow',\n            title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTransition\n        },\n        {\n            sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Settings,\n            iconName: 'Settings',\n            title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelChartSettings\n        }\n    ].filter(Boolean);\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $e295d8097c1ad61a$exports).classList('sanddance-sidebar', 'calculator', props.pinned && 'pinned', props.closed && 'closed')\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sidebar-content\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $86b892255d8eb4f0$export$3fb74a6ae4f1171d), Object.assign({}, props.dataScopeProps)), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"vbuttons\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sidebar-dialogs\",\n        role: 'tablist'\n    }, sidebuttons.map((sidebutton, i)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $d7542c73853af2f5$export$a8fc19311f33df91), Object.assign({\n            key: i\n        }, props, sidebutton, {\n            themePalette: props.themePalette\n        })))), !props.hideSidebarControls && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sidebar-controls\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $d7542c73853af2f5$export$a8fc19311f33df91), Object.assign({}, props, {\n        omitAriaSelected: true,\n        role: 'button',\n        sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Pin,\n        iconName: props.pinned ? 'Pinned' : 'Pin',\n        title: props.pinned ? (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonToolbarFloat : (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonToolbarDock\n    })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $d7542c73853af2f5$export$a8fc19311f33df91), Object.assign({}, props, {\n        omitAriaSelected: true,\n        role: 'button',\n        sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Collapse,\n        iconName: props.closed ? 'DoubleChevronRight12' : 'DoubleChevronLeft12',\n        title: props.closed ? (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonToolbarShow : (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonToolbarHide\n    })))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $c8096a1892befafb$export$fcc7818a78919c8c), {\n        role: 'tabpanel'\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sidetab\"\n    }, props.children)), props.calculating && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"calculating\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Spinner, {\n        size: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.SpinnerSize.large\n    }))));\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ //adapted from https://github.com/OfficeDev/office-ui-fabric-react/blob/master/packages/fluent-theme/src/fluent/styles/CommandBarButton.styles.ts\n\nconst $c05716ad448a35c4$export$26e7026630023d76 = (props)=>{\n    const { theme: theme } = props;\n    if (!theme) throw new Error('Theme is undefined or null.');\n    const { palette: palette, semanticColors: semanticColors } = theme;\n    const BUTTON_ICON_CLASSNAME = '.ms-Button-icon';\n    return {\n        root: [\n            Object.assign({}, (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.getFocusStyle(theme, {\n                inset: 2\n            })),\n            {\n                backgroundColor: palette.white\n            }\n        ],\n        rootHovered: {\n            backgroundColor: palette.neutralLighter,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDarkAlt\n                }\n            }\n        },\n        rootPressed: {\n            backgroundColor: palette.neutralLight,\n            color: palette.neutralDark,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootChecked: {\n            backgroundColor: palette.neutralLight,\n            color: palette.neutralDark,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootCheckedHovered: {\n            backgroundColor: palette.neutralQuaternaryAlt,\n            color: palette.neutralDark\n        },\n        rootExpanded: {\n            color: palette.neutralDark,\n            backgroundColor: palette.neutralLight,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootExpandedHovered: {\n            background: palette.neutralQuaternaryAlt\n        },\n        rootDisabled: {\n            backgroundColor: palette.white,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: semanticColors.disabledBodySubtext\n                }\n            }\n        },\n        splitButtonMenuButton: {\n            backgroundColor: palette.white,\n            color: palette.neutralSecondary,\n            selectors: {\n                ':hover': {\n                    backgroundColor: palette.neutralLighter,\n                    selectors: {\n                        [BUTTON_ICON_CLASSNAME]: {\n                            color: palette.neutralPrimary\n                        }\n                    }\n                },\n                ':active': {\n                    backgroundColor: palette.neutralLight,\n                    selectors: {\n                        [BUTTON_ICON_CLASSNAME]: {\n                            color: palette.neutralPrimary\n                        }\n                    }\n                }\n            }\n        },\n        splitButtonMenuButtonDisabled: {\n            backgroundColor: palette.white\n        },\n        icon: {\n            color: palette.themePrimary\n        }\n    };\n};\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst $c0b58eaa2b5865b5$var$s = `\n ......\n.......\n...\n......\n ......\n    ...\n.......\n......\n`;\nconst $c0b58eaa2b5865b5$var$d = $c0b58eaa2b5865b5$var$s.split('\\n').map((row, irow)=>row.length ? row.split('').map((char, icol)=>char.trim() ? `M${2 * icol + 1} ${2 * (irow - 1) + 1} v1 h1 v-1 Z` : '').join(' ') : '').join('\\n');\nfunction $c0b58eaa2b5865b5$export$e6ff31bff12b7ff4() {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 16 16\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"path\", {\n        d: $c0b58eaa2b5865b5$var$d\n    }));\n}\n\n\n\n\n\nfunction $17936d27f9fcfa1f$export$1ca1e38143dcc152(props) {\n    var _a;\n    const zeroResults = props.selectionState.selectedData && props.selectionState.selectedData.length === 0;\n    const disabled = !props.loaded;\n    const items = [\n        {\n            key: 'undo',\n            name: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonUndo,\n            iconProps: {\n                iconName: 'Undo'\n            },\n            disabled: disabled || props.historyItems.length === 0 || props.historyIndex === 0,\n            onClick: props.undo\n        },\n        {\n            key: 'redo',\n            name: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonRedo,\n            iconProps: {\n                iconName: 'Redo'\n            },\n            disabled: disabled || props.historyItems.length <= 1 || props.historyIndex >= props.historyItems.length - 1,\n            onClick: props.redo\n        },\n        {\n            key: 'deselect',\n            name: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonDeselect,\n            iconProps: {\n                iconName: 'Cancel'\n            },\n            disabled: disabled || !props.selectionSearch,\n            onClick: props.doDeselect\n        },\n        {\n            key: 'isolate',\n            name: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonIsolate,\n            iconProps: {\n                iconName: 'Filter'\n            },\n            disabled: disabled || !props.selectionSearch || zeroResults,\n            onClick: ()=>props.doFilter(props.selectionSearch, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryFilterIsolate)\n        },\n        {\n            key: 'exclude',\n            name: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonExclude,\n            iconProps: {\n                iconName: 'ClearFilter'\n            },\n            disabled: disabled || !props.selectionSearch || zeroResults,\n            onClick: ()=>props.doFilter((0, $1342cf7df79546f0$exports).searchExpression.invert(props.selectionSearch), (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryFilterIExclude)\n        },\n        {\n            key: 'reset',\n            name: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonReset,\n            iconProps: {\n                iconName: 'RemoveFilter'\n            },\n            disabled: disabled || !props.filter,\n            onClick: ()=>props.doUnfilter((0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryFilterClear)\n        }\n    ];\n    if (props.buttons) items.push.apply(items, props.buttons);\n    if (props.collapseLabels) items.forEach((item)=>item.iconOnly = true);\n    const farItems = [];\n    if (!props.snapshotsHidden) farItems.push({\n        key: 'previous-snapshot',\n        iconProps: {\n            iconName: 'Previous'\n        },\n        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonPrevSnapshot,\n        onClick: props.onSnapshotPreviousClick,\n        disabled: !props.snapshots || props.snapshots.length < 2\n    }, {\n        key: 'snapshot',\n        iconProps: {\n            iconName: 'Camera'\n        },\n        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonCreateSnapshot,\n        onClick: props.onSnapshotClick,\n        disabled: !props.loaded\n    }, {\n        key: 'next-snapshot',\n        iconProps: {\n            iconName: 'Next'\n        },\n        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonNextSnapshot,\n        onClick: props.onSnapshotNextClick,\n        disabled: !props.snapshots || props.snapshots.length < 2\n    });\n    farItems.push({\n        key: 'view',\n        iconProps: {\n            iconName: props.view === '2d' ? 'CubeShape' : 'Page'\n        },\n        title: props.view === '2d' ? (0, $d5b6ce321475881f$export$21c51bc433c16634).labelViewType3d : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelViewType2d,\n        onClick: props.onViewClick,\n        disabled: !props.loaded\n    });\n    if ((_a = props.iconButtons) === null || _a === void 0 ? void 0 : _a.length) farItems.push(...props.iconButtons);\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explorer-topbar\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"logo\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $c0b58eaa2b5865b5$export$e6ff31bff12b7ff4), null), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"a\", {\n        href: props.logoClickUrl || '/',\n        target: props.logoClickTarget || '_blank'\n    }, (0, $d5b6ce321475881f$export$21c51bc433c16634).appName)), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explorer-commandbar\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Customizer, {\n        scopedSettings: {\n            CommandBarButton: {\n                styles: (buttonProps)=>{\n                    buttonProps.theme.palette = props.themePalette;\n                    return (0, $c05716ad448a35c4$export$26e7026630023d76)(buttonProps);\n                }\n            }\n        }\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.CommandBar, {\n        items: items,\n        farItems: farItems,\n        styles: {\n            root: {\n                backgroundColor: 'transparent',\n                height: 'unset',\n                paddingLeft: 0,\n                paddingRight: 0\n            }\n        }\n    }))));\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nconst $105d7d4c8faa6087$export$9d26f8f2be82424f = (dataFile, columnTypes)=>new Promise((resolve, reject)=>{\n        const vega = (0, $1342cf7df79546f0$exports).VegaMorphCharts.base.vega;\n        const loader = vega.loader();\n        function handleRawText(text) {\n            let data;\n            try {\n                data = vega.read(text, {\n                    type: dataFile.type,\n                    parse: {}\n                });\n            } catch (e) {\n                reject(e);\n            }\n            if (data) $105d7d4c8faa6087$export$c084150d12efae43(data, dataFile.type, columnTypes).then((dc)=>{\n                if (dataFile.snapshotsUrl) fetch(dataFile.snapshotsUrl).then((response)=>response.json()).then((snapshots)=>{\n                    dc.snapshots = snapshots;\n                    resolve(dc);\n                }).catch(reject);\n                else if (dataFile.snapshots) {\n                    dc.snapshots = dataFile.snapshots;\n                    resolve(dc);\n                } else resolve(dc);\n            }).catch(reject);\n        }\n        if (dataFile.dataUrl) loader.load(dataFile.dataUrl).then(handleRawText).catch(reject);\n        else if (dataFile.rawText) handleRawText(dataFile.rawText);\n        else reject('dataFile object must have either dataUrl or rawText property set.');\n    });\nconst $105d7d4c8faa6087$export$c084150d12efae43 = (data, type, columnTypes)=>new Promise((resolve, reject)=>{\n        const parse = type === 'csv' || type === 'tsv';\n        if (parse) //convert empty strings to null so that vega.inferType will get dates\n        data.forEach((row)=>{\n            for(const column in row)if (row[column] === '') row[column] = null;\n        });\n        const columns = (0, $1342cf7df79546f0$exports).util.getColumnsFromData((0, $1342cf7df79546f0$exports).VegaMorphCharts.base.vega.inferTypes, data, columnTypes).filter((c)=>c.name && c.name.trim()).sort((a, b)=>a.name.localeCompare(b.name));\n        if (parse) {\n            const booleanColumns = columns.filter((c)=>c.type === 'boolean');\n            const dateColumns = columns.filter((c)=>c.type === 'date');\n            const numericColumns = columns.filter((c)=>c.type === 'integer' || c.type === 'number');\n            data.forEach((obj)=>{\n                booleanColumns.forEach((c)=>{\n                    obj[c.name] = ('' + obj[c.name]).toLowerCase() === 'true';\n                });\n                dateColumns.forEach((c)=>{\n                    const input = obj[c.name];\n                    if (input !== null) {\n                        const d = new Date(input);\n                        d.input = input;\n                        obj[c.name] = d;\n                    }\n                });\n                numericColumns.forEach((c)=>{\n                    const n = parseFloat(obj[c.name]);\n                    obj[c.name] = isNaN(n) ? null : n;\n                });\n            });\n        }\n        resolve({\n            data: data,\n            columns: columns\n        });\n    });\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nvar $a7be03ae5c68c2c3$var$util = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util;\nconst $a7be03ae5c68c2c3$export$3465a0e7b289ab72 = {};\n$a7be03ae5c68c2c3$export$3465a0e7b289ab72[''] = {\n    themePrimary: '#0078d4',\n    themeLighterAlt: '#eff6fc',\n    themeLighter: '#deecf9',\n    themeLight: '#c7e0f4',\n    themeTertiary: '#71afe5',\n    themeSecondary: '#2b88d8',\n    themeDarkAlt: '#106ebe',\n    themeDark: '#005a9e',\n    themeDarker: '#004578',\n    neutralLighterAlt: '#faf9f8',\n    neutralLighter: '#f3f2f1',\n    neutralLight: '#edebe9',\n    neutralQuaternaryAlt: '#e1dfdd',\n    neutralQuaternary: '#d0d0d0',\n    neutralTertiaryAlt: '#c8c6c4',\n    neutralTertiary: '#595959',\n    neutralSecondary: '#373737',\n    neutralSecondaryAlt: '#373737',\n    neutralPrimaryAlt: '#2f2f2f',\n    neutralPrimary: '#000000',\n    neutralDark: '#151515',\n    black: '#0b0b0b',\n    white: '#ffffff'\n};\n$a7be03ae5c68c2c3$export$3465a0e7b289ab72['dark-theme'] = {\n    themePrimary: '#0078d4',\n    themeLighterAlt: '#eff6fc',\n    themeLighter: '#deecf9',\n    themeLight: '#c7e0f4',\n    themeTertiary: '#71afe5',\n    themeSecondary: '#2b88d8',\n    themeDarkAlt: '#106ebe',\n    themeDark: '#005a9e',\n    themeDarker: '#004578',\n    neutralLighterAlt: '#0b0b0b',\n    neutralLighter: '#151515',\n    neutralLight: '#252525',\n    neutralQuaternaryAlt: '#2f2f2f',\n    neutralQuaternary: '#373737',\n    neutralTertiaryAlt: '#595959',\n    neutralTertiary: '#c8c8c8',\n    neutralSecondary: '#d0d0d0',\n    neutralSecondaryAlt: '#d0d0d0',\n    neutralPrimaryAlt: '#dadada',\n    neutralPrimary: '#ffffff',\n    neutralDark: '#f4f4f4',\n    black: '#f8f8f8',\n    white: '#000000'\n};\nfunction $a7be03ae5c68c2c3$export$93a255849c3bdb97(themePalette) {\n    const c = $a7be03ae5c68c2c3$var$util.colorFromString(themePalette.themeSecondary);\n    c[3] = 256 / 3; // one-third opacity background\n    return {\n        axisLine: themePalette.black,\n        axisText: themePalette.black,\n        gridLine: themePalette.neutralLight,\n        backgroundColor: themePalette.white,\n        hoveredCube: themePalette.black,\n        clickableText: themePalette.themeDark,\n        clickableTextHighlight: $a7be03ae5c68c2c3$var$util.colorToString(c),\n        searchText: themePalette.neutralPrimary,\n        searchTextHighlight: themePalette.neutralPrimaryAlt\n    };\n}\n\n\n\n\n\nconst $2273a7d1147da1bc$export$a5975749f0374264 = 'Segoe UI, sans-serif';\nconst $2273a7d1147da1bc$export$fb736e4909afb3d7 = {\n    colors: (0, $a7be03ae5c68c2c3$export$93a255849c3bdb97)((0, $a7be03ae5c68c2c3$export$3465a0e7b289ab72)['']),\n    fontFamily: $2273a7d1147da1bc$export$a5975749f0374264\n};\nconst $2273a7d1147da1bc$export$7e33de69431bbb06 = 300;\nconst $2273a7d1147da1bc$export$6093ee13d2f7fa25 = {\n    advanced: false,\n    advancedOptions: {\n        bloomIntensity: 2,\n        isBloomEnabled: false,\n        isDofEnabled: false,\n        dofFocusRange: 0.25,\n        isFxaaEnabled: false,\n        isShadowEnabled: true,\n        isSsaoEnabled: true\n    },\n    basicOptions: {\n        antialias: true\n    }\n};\nfunction $2273a7d1147da1bc$export$d1b579ecf4cf2d3f(props) {\n    const renderer = props.initialRenderer || $2273a7d1147da1bc$export$6093ee13d2f7fa25;\n    if (!renderer.advancedOptions) renderer.advancedOptions = $2273a7d1147da1bc$export$6093ee13d2f7fa25.advancedOptions;\n    if (!renderer.basicOptions) renderer.basicOptions = $2273a7d1147da1bc$export$6093ee13d2f7fa25.basicOptions;\n    const state = {\n        calculating: null,\n        errors: null,\n        autoCompleteDistinctValues: {},\n        colorBin: null,\n        dataContent: null,\n        dataFile: null,\n        search: null,\n        totalStyle: null,\n        facetStyle: 'wrap',\n        filter: null,\n        filteredData: null,\n        specCapabilities: null,\n        size: {\n            height: null,\n            width: null\n        },\n        scheme: null,\n        transform: null,\n        columns: null,\n        chart: 'grid',\n        signalValues: null,\n        hideAxes: false,\n        hideLegend: false,\n        sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).ChartType,\n        dataScopeId: (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData,\n        selectedItemIndex: {},\n        sidebarClosed: props.initialSidebarClosed === undefined ? false : props.initialSidebarClosed,\n        sidebarPinned: props.initialSidebarPinned === undefined ? true : props.initialSidebarPinned,\n        view: props.initialView || '2d',\n        snapshots: [],\n        selectedSnapshotIndex: -1,\n        tooltipExclusions: [],\n        positionedColumnMapProps: null,\n        note: null,\n        historyIndex: -1,\n        historyItems: [],\n        renderer: renderer,\n        transitionType: 'ordinal',\n        transitionDimension: 'x',\n        transitionDurations: (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone((0, $1342cf7df79546f0$exports).VegaMorphCharts.defaults.defaultPresenterConfig.transitionDurations)\n    };\n    (0, $86b892255d8eb4f0$export$6d13117e74df8390)(state.selectedItemIndex);\n    return state;\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $e94be5df56df841b$export$535452b9416b5e17(selected, scheme) {\n    return {\n        key: scheme,\n        text: scheme,\n        selected: selected === scheme,\n        scheme: scheme,\n        children: $e94be5df56df841b$export$dc7e195cef98649[scheme]\n    };\n}\nfunction $e94be5df56df841b$export$3482e66b4441447f(key, text) {\n    return {\n        key: key,\n        text: text,\n        itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n    };\n}\nconst $e94be5df56df841b$export$dc7e195cef98649 = {};\n\n\nconst $604fb89637945be9$var$p8 = `${12.5}%`;\nconst $604fb89637945be9$var$p9 = `${100 / 9}%`;\nconst $604fb89637945be9$var$p10 = `${10}%`;\nconst $604fb89637945be9$var$p12 = `${100 / 12}%`;\nconst $604fb89637945be9$var$p20 = `${5}%`;\nlet $604fb89637945be9$var$loaded = false;\nfunction $604fb89637945be9$var$load() {\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['accent'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7fc97f\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(127, 201, 127)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#beaed4\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(190, 174, 212)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdc086\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(253, 192, 134)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffff99\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(255, 255, 153)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#386cb0\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(56, 108, 176)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f0027f\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(240, 2, 127)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bf5b17\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(191, 91, 23)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#666666\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(102, 102, 102)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['category10'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#1f77b4\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(31, 119, 180)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff7f0e\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(255, 127, 14)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#2ca02c\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(44, 160, 44)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d62728\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(214, 39, 40)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9467bd\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(148, 103, 189)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8c564b\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(140, 86, 75)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e377c2\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(227, 119, 194)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7f7f7f\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(127, 127, 127)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bcbd22\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(188, 189, 34)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#17becf\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(23, 190, 207)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['category20'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#1f77b4\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(31, 119, 180)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#aec7e8\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(174, 199, 232)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff7f0e\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(255, 127, 14)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffbb78\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(255, 187, 120)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#2ca02c\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(44, 160, 44)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#98df8a\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(152, 223, 138)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d62728\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(214, 39, 40)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff9896\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(255, 152, 150)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9467bd\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(148, 103, 189)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c5b0d5\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(197, 176, 213)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8c564b\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(140, 86, 75)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c49c94\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(196, 156, 148)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e377c2\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(227, 119, 194)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f7b6d2\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(247, 182, 210)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7f7f7f\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(127, 127, 127)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c7c7c7\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(199, 199, 199)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bcbd22\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(188, 189, 34)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#dbdb8d\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(219, 219, 141)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#17becf\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(23, 190, 207)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9edae5\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(158, 218, 229)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['category20b'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#393b79\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(57, 59, 121)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#5254a3\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(82, 84, 163)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#6b6ecf\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(107, 110, 207)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9c9ede\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(156, 158, 222)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#637939\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(99, 121, 57)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8ca252\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(140, 162, 82)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b5cf6b\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(181, 207, 107)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#cedb9c\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(206, 219, 156)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8c6d31\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(140, 109, 49)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bd9e39\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(189, 158, 57)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e7ba52\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(231, 186, 82)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e7cb94\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(231, 203, 148)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#843c39\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(132, 60, 57)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ad494a\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(173, 73, 74)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d6616b\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(214, 97, 107)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e7969c\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(231, 150, 156)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7b4173\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(123, 65, 115)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a55194\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(165, 81, 148)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ce6dbd\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(206, 109, 189)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#de9ed6\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(222, 158, 214)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['category20c'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#3182bd\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(49, 130, 189)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#6baed6\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(107, 174, 214)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9ecae1\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(158, 202, 225)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c6dbef\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(198, 219, 239)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e6550d\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(230, 85, 13)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fd8d3c\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(253, 141, 60)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdae6b\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(253, 174, 107)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdd0a2\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(253, 208, 162)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#31a354\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(49, 163, 84)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#74c476\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(116, 196, 118)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a1d99b\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(161, 217, 155)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#c7e9c0\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(199, 233, 192)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#756bb1\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(117, 107, 177)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9e9ac8\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(158, 154, 200)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bcbddc\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(188, 189, 220)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#dadaeb\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(218, 218, 235)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#636363\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(99, 99, 99)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#969696\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(150, 150, 150)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bdbdbd\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(189, 189, 189)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d9d9d9\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(217, 217, 217)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['dark2'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#1b9e77\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(27, 158, 119)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d95f02\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(217, 95, 2)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#7570b3\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(117, 112, 179)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e7298a\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(231, 41, 138)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#66a61e\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(102, 166, 30)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e6ab02\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(230, 171, 2)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a6761d\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(166, 118, 29)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#666666\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(102, 102, 102)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['paired'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a6cee3\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(166, 206, 227)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#1f78b4\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(31, 120, 180)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b2df8a\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(178, 223, 138)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#33a02c\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(51, 160, 44)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fb9a99\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(251, 154, 153)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e31a1c\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(227, 26, 28)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdbf6f\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(253, 191, 111)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff7f00\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(255, 127, 0)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#cab2d6\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(202, 178, 214)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#6a3d9a\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(106, 61, 154)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffff99\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(255, 255, 153)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b15928\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(177, 89, 40)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['pastel1'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fbb4ae\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(251, 180, 174)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b3cde3\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(179, 205, 227)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ccebc5\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(204, 235, 197)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#decbe4\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(222, 203, 228)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fed9a6\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(254, 217, 166)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffffcc\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(255, 255, 204)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e5d8bd\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(229, 216, 189)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fddaec\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(253, 218, 236)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f2f2f2\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(242, 242, 242)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['pastel2'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b3e2cd\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(179, 226, 205)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdcdac\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(253, 205, 172)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#cbd5e8\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(203, 213, 232)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f4cae4\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(244, 202, 228)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e6f5c9\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(230, 245, 201)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fff2ae\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(255, 242, 174)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f1e2cc\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(241, 226, 204)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#cccccc\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(204, 204, 204)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['set1'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e41a1c\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(228, 26, 28)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#377eb8\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(55, 126, 184)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#4daf4a\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(77, 175, 74)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#984ea3\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(152, 78, 163)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff7f00\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(255, 127, 0)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffff33\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(255, 255, 51)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a65628\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(166, 86, 40)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f781bf\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(247, 129, 191)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#999999\",\n        style: {\n            width: $604fb89637945be9$var$p9,\n            background: 'rgb(153, 153, 153)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['set2'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#66c2a5\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(102, 194, 165)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fc8d62\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(252, 141, 98)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8da0cb\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(141, 160, 203)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e78ac3\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(231, 138, 195)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#a6d854\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(166, 216, 84)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffd92f\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(255, 217, 47)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e5c494\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(229, 196, 148)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b3b3b3\",\n        style: {\n            width: $604fb89637945be9$var$p8,\n            background: 'rgb(179, 179, 179)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['set3'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#8dd3c7\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(141, 211, 199)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffffb3\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(255, 255, 179)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bebada\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(190, 186, 218)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fb8072\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(251, 128, 114)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#80b1d3\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(128, 177, 211)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fdb462\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(253, 180, 98)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b3de69\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(179, 222, 105)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fccde5\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(252, 205, 229)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d9d9d9\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(217, 217, 217)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bc80bd\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(188, 128, 189)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ccebc5\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(204, 235, 197)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffed6f\",\n        style: {\n            width: $604fb89637945be9$var$p12,\n            background: 'rgb(255, 237, 111)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['tableau10'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#4c78a8\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(76, 120, 168)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f58518\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(245, 133, 24)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e45756\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(228, 87, 86)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#72b7b2\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(114, 183, 178)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#54a24b\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(84, 162, 75)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#eeca3b\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(238, 202, 59)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b279a2\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(178, 121, 162)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff9da6\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(255, 157, 166)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9d755d\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(157, 117, 93)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bab0ac\",\n        style: {\n            width: $604fb89637945be9$var$p10,\n            background: 'rgb(186, 176, 172)'\n        }\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['tableau20'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#4c78a8\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(76, 120, 168)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9ecae9\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(158, 202, 233)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f58518\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(245, 133, 24)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ffbf79\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(255, 191, 121)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#54a24b\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(84, 162, 75)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#88d27a\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(136, 210, 122)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b79a20\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(183, 154, 32)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#f2cf5b\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(242, 207, 91)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#439894\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(67, 152, 148)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#83bcb6\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(131, 188, 182)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#e45756\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(228, 87, 86)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#ff9d98\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(255, 157, 152)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#79706e\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(121, 112, 110)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#bab0ac\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(186, 176, 172)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d67195\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(214, 113, 149)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#fcbfd2\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(252, 191, 210)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#b279a2\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(178, 121, 162)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d6a5c9\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(214, 165, 201)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#9e765f\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(158, 118, 95)'\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        title: \"#d8b5a5\",\n        style: {\n            width: $604fb89637945be9$var$p20,\n            background: 'rgb(216, 181, 165)'\n        }\n    }));\n    $604fb89637945be9$var$loaded = true;\n}\nfunction $604fb89637945be9$export$f3a499247c9822d1(selected) {\n    if (!$604fb89637945be9$var$loaded) $604fb89637945be9$var$load();\n    return [\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'accent'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'category10'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'category20'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'category20b'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'category20c'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'dark2'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'paired'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'pastel1'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'pastel2'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'set1'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'set2'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'set3'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'tableau10'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'tableau20')\n    ];\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nlet $557d0cbc8fb1bfa4$var$loaded = false;\nfunction $557d0cbc8fb1bfa4$var$load() {\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['rainbow'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-rainbow\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#6e40aa\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#bf3caf\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#fe4b83\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#ff7847\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#e2b72f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#aff05b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#52f667\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#1ddfa3\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#23abd8\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#4c6edb\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#6e40aa\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-rainbow)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['sinebow'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-sinebow\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#ff4040\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#e78d0b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#a7d503\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#58fc2a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#18f472\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#00bfbf\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#1872f4\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#582afc\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#a703d5\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#e70b8d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#ff4040\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-sinebow)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    $557d0cbc8fb1bfa4$var$loaded = true;\n}\nfunction $557d0cbc8fb1bfa4$export$6b2b632c28721cf0(selected) {\n    if (!$557d0cbc8fb1bfa4$var$loaded) $557d0cbc8fb1bfa4$var$load();\n    return [\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'rainbow'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'sinebow')\n    ];\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nlet $c865794ee37c2239$var$loaded = false;\nfunction $c865794ee37c2239$var$load() {\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['blueorange'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-blueorange\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(5, 48, 97)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(34, 101, 163)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(75, 148, 196)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(143, 194, 221)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(205, 227, 238)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(242, 240, 235)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(253, 221, 179)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(248, 182, 100)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(221, 132, 31)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(178, 90, 9)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 59, 8)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-blueorange)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['brownbluegreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-brownbluegreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(84, 48, 5)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(139, 84, 15)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(188, 132, 53)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(222, 190, 123)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(242, 228, 192)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(238, 241, 234)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(195, 231, 226)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(127, 201, 191)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(57, 152, 143)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(10, 103, 95)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 60, 48)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-brownbluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['purplegreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplegreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(64, 0, 75)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(115, 47, 128)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(154, 109, 170)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(193, 164, 205)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(228, 210, 230)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(239, 240, 239)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(214, 238, 209)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(162, 215, 158)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(92, 173, 101)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(33, 120, 57)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['pinkyellowgreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-pinkyellowgreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(142, 1, 82)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(192, 38, 126)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(221, 114, 173)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(240, 179, 214)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(250, 221, 237)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(245, 243, 239)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(225, 242, 202)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(182, 222, 135)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(128, 187, 71)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(79, 145, 37)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(39, 100, 25)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-pinkyellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['purpleorange'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purpleorange\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(45, 0, 75)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(85, 45, 132)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(129, 112, 172)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(176, 170, 208)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(215, 215, 233)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(243, 238, 234)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(253, 221, 179)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(248, 182, 100)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(221, 132, 31)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(178, 90, 9)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 59, 8)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purpleorange)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['redblue'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redblue\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(172, 32, 47)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 96, 80)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(241, 163, 133)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(251, 215, 196)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(242, 239, 238)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(205, 227, 238)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(143, 194, 221)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(75, 148, 196)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(34, 101, 163)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(5, 48, 97)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['redgrey'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redgrey\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(172, 32, 47)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 96, 80)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(241, 163, 133)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(252, 216, 197)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 244, 241)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(223, 223, 223)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(184, 184, 184)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(134, 134, 134)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(78, 78, 78)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(26, 26, 26)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redgrey)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['redyellowblue'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redyellowblue\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(165, 0, 38)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(212, 50, 44)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(241, 110, 67)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 100)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 144)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 248, 193)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(220, 241, 236)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(171, 214, 232)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(117, 171, 208)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(74, 116, 180)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(49, 54, 149)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redyellowblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['redyellowgreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redyellowgreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(165, 0, 38)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(212, 50, 44)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(241, 110, 67)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 99)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 141)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(249, 247, 174)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(215, 238, 142)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(164, 216, 110)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(100, 188, 97)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(34, 150, 79)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 104, 55)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redyellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['spectral'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-spectral\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(158, 1, 66)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(209, 60, 75)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(240, 112, 74)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 99)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 141)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 248, 176)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(224, 243, 161)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(169, 221, 162)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(105, 189, 169)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(66, 136, 181)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(94, 79, 162)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-spectral)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    $c865794ee37c2239$var$loaded = true;\n}\nfunction $c865794ee37c2239$export$ab7b13a7cc99f3af(selected) {\n    if (!$c865794ee37c2239$var$loaded) $c865794ee37c2239$var$load();\n    return [\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'blueorange'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'brownbluegreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'purplegreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'pinkyellowgreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'purpleorange'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'redblue'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'redgrey'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'redyellowblue'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'redyellowgreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'spectral')\n    ];\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nlet $76702a7bfec8e284$var$loaded = false;\nfunction $76702a7bfec8e284$var$load() {\n    (0, $1342cf7df79546f0$exports).colorSchemes.filter((cs)=>cs.colors.length === 2).map((binaryScheme, i)=>{\n        (0, $e94be5df56df841b$export$dc7e195cef98649)[binaryScheme.scheme] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n            className: \"swatch\"\n        }, binaryScheme.colors.map((color, j)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                key: j,\n                title: color,\n                style: {\n                    width: '50%',\n                    backgroundColor: color\n                }\n            })));\n    });\n    $76702a7bfec8e284$var$loaded = true;\n}\nfunction $76702a7bfec8e284$export$d1699a1bbdf17835(selected) {\n    if (!$76702a7bfec8e284$var$loaded) $76702a7bfec8e284$var$load();\n    return (0, $1342cf7df79546f0$exports).colorSchemes.filter((cs)=>cs.colors.length === 2).map((binaryScheme, i)=>(0, $e94be5df56df841b$export$535452b9416b5e17)(selected, binaryScheme.scheme));\n}\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\nlet $f0ccc6e9e43e6b56$var$loaded = false;\nfunction $f0ccc6e9e43e6b56$var$load() {\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['viridis'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-viridis\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#440154\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#482475\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#414487\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#355f8d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#2a788e\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#21918c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#22a884\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#44bf70\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#7ad151\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#bddf26\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fde725\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-viridis)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['inferno'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-inferno\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#000004\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#160b39\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#420a68\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#6a176e\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#932667\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#bc3754\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#dd513a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f37819\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fca50a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#f6d746\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fcffa4\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-inferno)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['magma'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-magma\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#000004\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#140e36\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#3b0f70\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#641a80\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#8c2981\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#b73779\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#de4968\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f7705c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fe9f6d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#fecf92\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fcfdbf\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-magma)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['plasma'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-plasma\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#0d0887\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#41049d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#6a00a8\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#8f0da4\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#b12a90\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#cc4778\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#e16462\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f2844b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fca636\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#fcce25\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#f0f921\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-plasma)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['cividis'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-cividis\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#002051\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#0a326a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#2b446e\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#4d566d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#696970\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#7f7c75\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#948f78\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#ada476\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#caba6a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#ead156\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fdea45\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-cividis)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['turbo'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-turbo\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#23171b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#4a58dd\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#2f9df5\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#27d7c4\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#4df884\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#95fb51\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#dedd32\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#ffa423\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#f65f18\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#ba2208\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#900c00\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-turbo)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['bluegreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-bluegreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 253)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(232, 246, 249)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 239, 237)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(183, 228, 218)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(143, 211, 193)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(104, 194, 163)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(73, 177, 127)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 153, 89)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 127, 60)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 100, 41)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-bluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['bluepurple'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-bluepurple\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 253)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(228, 238, 245)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(204, 221, 236)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(178, 202, 225)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(156, 179, 213)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(143, 149, 198)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(140, 116, 181)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(137, 82, 165)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(133, 45, 143)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(115, 15, 113)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(77, 0, 75)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-bluepurple)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['goldgreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-goldgreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#f4d166\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#d5ca60\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#b6c35c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#98bb59\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#7cb257\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#60a656\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#4b9c53\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#3f8f4f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#33834a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#257740\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#146c36\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-goldgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['goldorange'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-goldorange\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#f4d166\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#f8be5c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#f8aa4c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#f5983b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#f3852a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#ef701b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#e2621f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#d65322\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#c54923\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#b14223\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#9e3a26\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-goldorange)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['goldred'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-goldred\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#f4d166\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#f6be59\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#f9aa51\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#fc964e\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#f6834b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#ee734a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#e56249\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#db5247\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#cf4244\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#c43141\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#b71d3e\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-goldred)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['greenblue'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-greenblue\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 240)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(229, 245, 223)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(211, 238, 206)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(189, 229, 191)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(158, 217, 187)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(123, 203, 196)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(88, 183, 205)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(57, 156, 198)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(29, 126, 183)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(11, 96, 161)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 64, 129)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greenblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['orangered'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-orangered\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 236)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 235, 207)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 220, 175)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(253, 202, 148)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(253, 176, 122)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 142, 93)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(241, 108, 73)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(224, 69, 48)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(200, 29, 19)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(167, 4, 3)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 0, 0)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-orangered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['purplebluegreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplebluegreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 251)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 231, 242)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(219, 216, 234)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(190, 201, 226)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(152, 185, 217)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(105, 168, 207)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(64, 150, 192)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(25, 135, 159)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(3, 120, 119)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(1, 99, 83)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(1, 70, 54)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplebluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['purpleblue'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purpleblue\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 251)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 234, 244)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(219, 218, 235)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(191, 201, 226)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(155, 185, 217)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(114, 168, 207)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(67, 148, 195)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(26, 125, 182)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(6, 103, 161)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(4, 82, 129)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(2, 56, 88)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purpleblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['purplered'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplered\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 244, 249)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(234, 227, 240)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(220, 201, 226)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(208, 170, 210)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(208, 138, 194)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(221, 99, 174)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(227, 56, 144)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(215, 28, 108)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(183, 11, 79)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(143, 2, 58)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['redpurple'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-redpurple\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 243)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(253, 228, 225)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(252, 207, 204)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(251, 181, 188)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(249, 147, 176)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(243, 105, 163)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(224, 62, 152)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(192, 23, 136)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(153, 3, 124)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(112, 1, 116)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(73, 0, 106)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redpurple)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['yellowgreenblue'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-yellowgreenblue\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 217)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 249, 189)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 238, 179)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(169, 221, 183)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(115, 201, 189)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(69, 180, 194)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(40, 151, 191)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(32, 115, 178)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(35, 78, 160)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(28, 49, 133)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 29, 88)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yellowgreenblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['yellowgreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-yellowgreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 229)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(247, 252, 196)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(228, 244, 172)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(199, 232, 155)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(162, 216, 138)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(120, 197, 120)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(78, 175, 99)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 148, 78)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 121, 63)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 96, 52)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 69, 41)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['yelloworangebrown'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-yelloworangebrown\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 229)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(255, 248, 196)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(254, 234, 161)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(254, 214, 118)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 186, 74)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 153, 44)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(238, 121, 24)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(216, 91, 10)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(183, 67, 4)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(143, 50, 4)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(102, 37, 6)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yelloworangebrown)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['yelloworangered'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-yelloworangered\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 204)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(255, 240, 169)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(254, 224, 135)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(254, 201, 101)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 171, 75)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(253, 137, 60)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(250, 92, 46)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(236, 48, 35)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(211, 17, 33)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(175, 2, 37)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(128, 0, 38)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yelloworangered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['darkblue'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-darkblue\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#323232\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#2e4463\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#1e588a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#086da7\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#0082b9\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#039ac7\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#12b1d4\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#2bc8e2\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#3ddff0\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#61f4fb\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#ffffff\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-darkblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['darkgold'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-darkgold\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#3c3c3c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#554a38\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#6d5a35\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#846f32\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#a0832d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#bf9828\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#dbb022\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f0cb23\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fae241\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#fff290\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#ffffff\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-darkgold)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['darkgreen'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-darkgreen\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#3a3a3a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#245447\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#076a4c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#038145\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#2d9642\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#5fa941\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#89bb3f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#b3cb3b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#dbdc34\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#ffed39\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#ffffaa\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-darkgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['darkmulti'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-darkmulti\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#373737\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#294767\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#1e5b88\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#1a748b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#1f8e7e\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#29a869\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#6abf50\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#aad332\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#eae30d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#fff166\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#ffffff\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-darkmulti)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['darkred'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-darkred\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#343434\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#643633\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#8c3a36\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#b03e38\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#d14632\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#e75d1e\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#eb7e20\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#ed9c25\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#efb92d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#f3d431\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#ffeb2c\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-darkred)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['lightgreyred'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-lightgreyred\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#efe9e6\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#e2dcd9\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#d7cecb\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#ccc1be\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#c0b4af\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#c4a293\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#d38b66\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#de7336\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#e15917\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#df3a10\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#dc000b\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-lightgreyred)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['lightgreyteal'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-lightgreyteal\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#e4eaea\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#d7ddde\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#cbd1d4\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#bcc6ca\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#adbac0\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#85b2be\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#4aacc1\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#22a1c2\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#2192c0\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#1e84be\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#1876bc\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-lightgreyteal)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['lightmulti'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-lightmulti\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#e0f1f2\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#caebd7\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#b8e2b3\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#bddf93\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#d8e17e\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#f6e072\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#f6c659\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f4a946\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#f58a3f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#f56c3f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#ef4a3c\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-lightmulti)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['lightorange'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-lightorange\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#f2e7da\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#f7d7bd\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#f9c7a0\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#fab78a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#faa47a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#f8936d\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#f38264\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#ed725f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#e6605b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#dd4f5b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#d43d5b\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-lightorange)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['lighttealblue'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-lighttealblue\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#e3e9e0\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#c4ddd1\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#a2d1cb\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#84c4c9\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#66b5c3\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#49a7bd\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#3698b4\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#3188a9\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#2d799e\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#276994\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#255988\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-lighttealblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    $f0ccc6e9e43e6b56$var$loaded = true;\n}\nfunction $f0ccc6e9e43e6b56$export$a4fd36c4882aa76e(selected) {\n    if (!$f0ccc6e9e43e6b56$var$loaded) $f0ccc6e9e43e6b56$var$load();\n    return [\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'viridis'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'magma'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'inferno'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'plasma'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'cividis'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'turbo'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'bluegreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'bluepurple'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'goldgreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'goldorange'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'goldred'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'greenblue'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'orangered'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'purplebluegreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'purpleblue'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'purplered'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'redpurple'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'yellowgreenblue'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'yellowgreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'yelloworangebrown'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'yelloworangered'),\n        (0, $e94be5df56df841b$export$3482e66b4441447f)('schemeSequentialMultiHueDark', (0, $d5b6ce321475881f$export$21c51bc433c16634).schemeSequentialMultiHueDark),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'darkblue'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'darkgold'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'darkgreen'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'darkmulti'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'darkred'),\n        (0, $e94be5df56df841b$export$3482e66b4441447f)('schemeSequentialMultiHueLight', (0, $d5b6ce321475881f$export$21c51bc433c16634).schemeSequentialMultiHueLight),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'lightgreyred'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'lightgreyteal'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'lightmulti'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'lightorange'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'lighttealblue')\n    ];\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\nlet $9bfd5718c2e1a138$var$loaded = false;\nfunction $9bfd5718c2e1a138$var$load() {\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['blues'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-blues\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 251, 255)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(227, 238, 249)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(207, 225, 242)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(181, 212, 233)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(147, 195, 223)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(109, 174, 213)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(75, 151, 201)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 126, 188)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(24, 100, 170)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(10, 74, 144)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 48, 107)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-blues)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['tealblues'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-tealblues\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#bce4d8\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#a3d6d2\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#8cc9cd\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#76bdc7\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#5fb0c0\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#45a2b9\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#3993b0\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#3584a6\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#32759b\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#2f6790\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#2c5985\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-tealblues)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['teals'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-teals\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#bbdfdf\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#a2d4d5\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#8ac9c9\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#75bcbb\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#61b0af\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#4da5a4\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#379998\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#2b8b8c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#1e7f7f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#127273\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#006667\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-teals)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['greens'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-greens\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 245)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(232, 246, 227)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(211, 238, 205)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(183, 226, 177)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(151, 212, 148)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(115, 195, 120)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(77, 175, 98)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 152, 79)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 127, 59)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 100, 41)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greens)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['greys'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-greys\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 255)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(242, 242, 242)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(226, 226, 226)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(206, 206, 206)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(180, 180, 180)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(151, 151, 151)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(122, 122, 122)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(95, 95, 95)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(64, 64, 64)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(30, 30, 30)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 0, 0)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greys)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['purples'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-purples\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(252, 251, 253)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(241, 239, 246)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(226, 225, 239)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(206, 206, 229)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(182, 181, 216)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(158, 155, 201)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(135, 130, 188)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(115, 99, 172)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(97, 64, 155)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(80, 31, 140)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(63, 0, 125)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purples)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['browns'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-browns\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#eedbbd\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#ecca96\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#e9b97a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#e4a865\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#dc9856\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#d18954\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#c7784c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#c0673f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#b85536\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#ad4433\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#9f3632\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-browns)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['reds'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-reds\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 245, 240)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 227, 214)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 201, 180)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 170, 142)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(252, 138, 107)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(249, 105, 76)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(239, 69, 51)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(217, 39, 35)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(187, 21, 26)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(151, 11, 19)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(103, 0, 13)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-reds)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['oranges'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-oranges\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 245, 235)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 232, 211)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 216, 179)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(253, 194, 140)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(253, 167, 98)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 141, 61)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(242, 112, 29)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(226, 86, 9)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(196, 65, 3)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(159, 51, 3)\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 39, 4)\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-oranges)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, $e94be5df56df841b$export$dc7e195cef98649)['warmgreys'] = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"defs\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"linearGradient\", {\n        id: \"gradient-warmgreys\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#dcd4d0\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#cec5c1\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#c0b8b4\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#b3aaa7\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#a59c99\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#98908c\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#8b827f\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#7e7673\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#726866\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#665c5a\"\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#59504e\"\n    }))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"rect\", {\n        fill: \"url(#gradient-warmgreys)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    $9bfd5718c2e1a138$var$loaded = true;\n}\nfunction $9bfd5718c2e1a138$export$9b3c8b6a286fd957(selected) {\n    if (!$9bfd5718c2e1a138$var$loaded) $9bfd5718c2e1a138$var$load();\n    return [\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'blues'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'tealblues'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'teals'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'greens'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'browns'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'oranges'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'reds'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'purples'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'warmgreys'),\n        (0, $e94be5df56df841b$export$535452b9416b5e17)(selected, 'greys')\n    ];\n}\n\n\n\nconst $6b72b192df8d0014$var$maxDistinctColors = 20;\nfunction $6b72b192df8d0014$export$e2fbaa661ec19dbf(props) {\n    const { distinctValueCount: distinctValueCount } = props.colorColumn.stats;\n    const isDual = distinctValueCount === 2;\n    const categoricalNumeric = distinctValueCount > 0 && distinctValueCount < $6b72b192df8d0014$var$maxDistinctColors;\n    let isQualitative = false;\n    let isQuantitative = false;\n    switch(props.colorColumn.type){\n        case 'boolean':\n        case 'string':\n            isQualitative = true;\n            break;\n        case 'number':\n            isQuantitative = true;\n            break;\n        case 'date':\n        case 'integer':\n            isQuantitative = true;\n            isQualitative = categoricalNumeric;\n    }\n    const selected = props.scheme;\n    const options = [];\n    function menu(name, opts) {\n        if (options.length) options.push({\n            key: 'divider' + options.length,\n            text: null,\n            itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Divider\n        });\n        options.push({\n            key: name,\n            text: name,\n            itemType: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header\n        });\n        options.push.apply(options, opts);\n    }\n    isQualitative && menu((0, $d5b6ce321475881f$export$21c51bc433c16634).schemeCategorical, (0, $604fb89637945be9$export$f3a499247c9822d1)(selected));\n    isQuantitative && menu((0, $d5b6ce321475881f$export$21c51bc433c16634).schemeSequentialSingleHue, (0, $9bfd5718c2e1a138$export$9b3c8b6a286fd957)(selected));\n    isQuantitative && menu((0, $d5b6ce321475881f$export$21c51bc433c16634).schemeSequentialMultiHue, (0, $f0ccc6e9e43e6b56$export$a4fd36c4882aa76e)(selected));\n    isQuantitative && menu((0, $d5b6ce321475881f$export$21c51bc433c16634).schemeDiverging, (0, $c865794ee37c2239$export$ab7b13a7cc99f3af)(selected));\n    isQuantitative && menu((0, $d5b6ce321475881f$export$21c51bc433c16634).schemeCyclical, (0, $557d0cbc8fb1bfa4$export$6b2b632c28721cf0)(selected));\n    isDual && menu((0, $d5b6ce321475881f$export$21c51bc433c16634).schemeDual, (0, $76702a7bfec8e284$export$d1699a1bbdf17835)(selected));\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-palette\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorFieldInfo(props.colorColumn.name, props.colorColumn.type, categoricalNumeric, distinctValueCount)\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n        collapseLabel: props.collapseLabel,\n        disabled: props.disabled,\n        dropdownWidth: 400,\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorScheme,\n        onRenderOption: (option)=>{\n            if (option.itemType === (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DropdownMenuItemType.Header) return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"span\", null, option.text);\n            else return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-scheme option\"\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"span\", {\n                className: \"name\"\n            }, option.scheme), option.children);\n        },\n        options: options,\n        onChange: (e, o)=>{\n            props.changeColorScheme(o.scheme);\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: (0, $e295d8097c1ad61a$exports).classList('sanddance-scheme', props.disabled && 'disabled')\n    }, props.scheme && (0, $e94be5df56df841b$export$dc7e195cef98649)[props.scheme]));\n}\n\n\n\n\n\nfunction $2cfe18e9e3d5fffb$export$892596cec99bc70e(props) {\n    const colorColumn = props.dataContent.columns.filter((c)=>c.name === props.colorColumn)[0];\n    const disabledColorBin = !colorColumn || !colorColumn.quantitative || props.directColor;\n    const colorBin = props.colorBin || 'quantize';\n    const dropdownRef = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n    props.explorer.dialogFocusHandler.focus = ()=>{\n        var _a;\n        return (_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n    };\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-color-dialog\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColor\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $3ecc97321af8bbc8$export$83b9e0badda50eeb), Object.assign({}, props, {\n        componentRef: dropdownRef,\n        collapseLabel: props.compactUI,\n        selectedColumnName: props.colorColumn,\n        specRole: props.specCapabilities && props.specCapabilities.roles.filter((r)=>r.role === 'color')[0],\n        key: 0\n    })), colorColumn && colorColumn.isColorData && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorFieldIsColorData(colorColumn.name)\n        }\n    }), colorColumn && !colorColumn.isColorData && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $6b72b192df8d0014$export$e2fbaa661ec19dbf), {\n        collapseLabel: props.compactUI,\n        scheme: props.scheme,\n        colorColumn: colorColumn,\n        changeColorScheme: (scheme)=>{\n            props.onColorSchemeChange(scheme);\n        },\n        disabled: props.disabled || props.directColor || colorColumn && colorColumn.isColorData\n    }), colorColumn && !colorColumn.isColorData && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $00e2720d7006b5f2$export$8210dfe1863c478), {\n        disabled: props.disabled || !colorColumn || props.directColor || colorColumn && colorColumn.isColorData,\n        signal: props.colorReverseSignal,\n        explorer: props.explorer,\n        initialValue: (0, $00e2720d7006b5f2$export$d54e4e563d2a9303)(props.explorer, props.colorReverseSignal),\n        onChange: props.onColorReverseChange,\n        collapseLabel: props.compactUI\n    })), colorColumn && !colorColumn.isColorData && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorBin\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explanation\"\n    }, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorBinExplanation), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.ChoiceGroup, {\n        selectedKey: colorBin,\n        options: [\n            {\n                key: 'continuous',\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorBinNone,\n                disabled: disabledColorBin\n            },\n            {\n                key: 'quantize',\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorBinQuantize,\n                disabled: disabledColorBin\n            },\n            {\n                key: 'quantile',\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorBinQuantile,\n                disabled: disabledColorBin\n            }\n        ],\n        onChange: (e, o)=>{\n            props.onColorBinChange(o.key);\n        }\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $00e2720d7006b5f2$export$8210dfe1863c478), {\n        disabled: props.disabled || disabledColorBin || props.colorBin === 'continuous',\n        signal: props.colorBinSignal,\n        explorer: props.explorer,\n        initialValue: (0, $00e2720d7006b5f2$export$d54e4e563d2a9303)(props.explorer, props.colorBinSignal),\n        onChange: props.onColorBinCountChange,\n        collapseLabel: props.compactUI\n    })), colorColumn && !colorColumn.isColorData && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelColorOptions\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDirectColor,\n        disabled: !colorColumn.stats.hasColorData,\n        checked: !!(colorColumn.stats.hasColorData && props.directColor),\n        onChange: (e, checked)=>props.onDirectColorChange(checked)\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelDataColors\n        }\n    })));\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const $482602738369d734$export$ec835b702d42f3f0 = {\n    ENTER: 13\n};\n\n\n\n\nfunction $abe5706469fa09a5$var$isNumber(value) {\n    if (typeof value === 'number') return true;\n    if (!isNaN(value)) return true;\n    return false;\n}\nfunction $abe5706469fa09a5$var$isBoolean(value) {\n    if (typeof value === 'boolean') return true;\n    if (typeof value === 'string') switch(value.toLowerCase()){\n        case \"true\":\n        case \"false\":\n            return true;\n    }\n    return false;\n}\nfunction $abe5706469fa09a5$var$bingSearchLink(column, value) {\n    if ($abe5706469fa09a5$var$isNumber(value)) return null;\n    if ($abe5706469fa09a5$var$isBoolean(value)) return null;\n    if (column && column.stats.distinctValueCount === 2) return null;\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: 'bing-search'\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"a\", {\n        href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n        target: '_blank',\n        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).bingsearchDescription(value),\n        \"aria-label\": (0, $d5b6ce321475881f$export$21c51bc433c16634).bingsearchDescription(value)\n    }, (0, $d5b6ce321475881f$export$21c51bc433c16634).bingsearch));\n}\nfunction $abe5706469fa09a5$var$displayValue(value) {\n    switch(value){\n        case '':\n            return {\n                special: true,\n                display: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelBlank\n            };\n        case null:\n            return {\n                special: true,\n                display: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelNull\n            };\n        case true:\n            return {\n                special: true,\n                display: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelTrue\n            };\n        case false:\n            return {\n                special: true,\n                display: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelFalse\n            };\n        default:\n            if (typeof value === 'object') {\n                if (value instanceof Date) {\n                    const d = value;\n                    return $abe5706469fa09a5$var$displayValue(d.input);\n                }\n                return {\n                    special: false,\n                    display: value.toLocaleString()\n                };\n            }\n            return {\n                special: false,\n                display: value\n            };\n    }\n}\nfunction $abe5706469fa09a5$var$displayValueElement(nvp) {\n    const d = $abe5706469fa09a5$var$displayValue(nvp.value);\n    if (d.special) return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"i\", null, d.display);\n    return d.display;\n}\nfunction $abe5706469fa09a5$export$e9ab04247990d50b(props) {\n    if (!props.item) return null;\n    const nameValuePairs = [];\n    for(const columnName in props.item){\n        if (columnName === (0, $1342cf7df79546f0$exports).constants.GL_ORDINAL && !props.showSystemFields) continue;\n        if ((0, $1342cf7df79546f0$exports).util.isInternalFieldName(columnName)) continue;\n        const nameValuePair = {\n            columnName: columnName,\n            value: props.item[columnName]\n        };\n        if (!props.bingSearchDisabled) nameValuePair.bingSearch = $abe5706469fa09a5$var$bingSearchLink(props.columns.filter((c)=>c.name === columnName)[0], props.item[columnName]);\n        nameValuePairs.push(nameValuePair);\n    }\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"sanddance-dataItem\"\n    }, nameValuePairs.map((nameValuePair, i)=>{\n        const ex = {\n            key: 0,\n            name: nameValuePair.columnName,\n            operator: '==',\n            value: nameValuePair.value\n        };\n        if (nameValuePair.value === null || nameValuePair.value === '') {\n            ex.operator = 'isnullorEmpty';\n            delete ex.value;\n        }\n        const searchClick = (e)=>{\n            const search = {\n                key: 0,\n                expressions: [\n                    ex\n                ]\n            };\n            props.onSearch(e, [\n                search\n            ]);\n        };\n        const title = (0, $d5b6ce321475881f$export$21c51bc433c16634).tooltipSearch(nameValuePair.columnName, $abe5706469fa09a5$var$displayValue(nameValuePair.value).display);\n        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n            key: i,\n            onClick: !props.disabled ? searchClick : null,\n            title: title,\n            onKeyUp: (e)=>{\n                if (e.keyCode === (0, $482602738369d734$export$ec835b702d42f3f0).ENTER) searchClick(e);\n            },\n            tabIndex: 0,\n            className: \"name-value\"\n        }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n            className: \"column-name\"\n        }, nameValuePair.columnName), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n            className: \"column-value\"\n        }, $abe5706469fa09a5$var$displayValueElement(nameValuePair)), nameValuePair.bingSearch);\n    }));\n}\n\n\n\n\n\n\n\n\nconst $9ca0c376beb8c2ec$export$bbe9fd33806c217d = {};\n$9ca0c376beb8c2ec$export$bbe9fd33806c217d[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData] = (0, $d5b6ce321475881f$export$21c51bc433c16634).labelZeroAll;\n$9ca0c376beb8c2ec$export$bbe9fd33806c217d[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData] = null; //empty array is not used\n$9ca0c376beb8c2ec$export$bbe9fd33806c217d[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData] = (0, $d5b6ce321475881f$export$21c51bc433c16634).labelZeroSearchResults;\nconst $9ca0c376beb8c2ec$export$79bd5e38ba2a6de0 = {};\n$9ca0c376beb8c2ec$export$79bd5e38ba2a6de0[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData] = (0, $d5b6ce321475881f$export$21c51bc433c16634).labelDataNullAll;\n$9ca0c376beb8c2ec$export$79bd5e38ba2a6de0[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData] = (0, $d5b6ce321475881f$export$21c51bc433c16634).labelDataNullFiltered;\n$9ca0c376beb8c2ec$export$79bd5e38ba2a6de0[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData] = (0, $d5b6ce321475881f$export$21c51bc433c16634).labelDataNullSelection;\nfunction $9ca0c376beb8c2ec$export$1ce2294f62fa7154(props) {\n    function activateRecord(newIndex) {\n        props.onActivate(props.data[newIndex], newIndex);\n    }\n    const { index: index } = props;\n    const length = props.data && props.data.length || 0;\n    const dropdownRef = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n    props.explorer.dialogFocusHandler.focus = ()=>{\n        var _a;\n        return (_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n    };\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelDataBrowser,\n        className: \"sanddance-dataIndex\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $8f56f1ed6ae42f13$export$931cbfb6bfb85fc), {\n        componentRef: dropdownRef,\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelDataScope,\n        collapseLabel: true,\n        options: [\n            {\n                key: (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData,\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanAll,\n                isSelected: props.selectedDataScope === (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData\n            },\n            {\n                key: (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData,\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanFilter,\n                isSelected: props.selectedDataScope === (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData\n            },\n            {\n                key: (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData,\n                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).selectDataSpanSelection,\n                isSelected: props.selectedDataScope === (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData\n            }\n        ],\n        onChange: (e, o)=>{\n            props.onDataScopeClick(o.key);\n        }\n    }), !props.data && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        dangerouslySetInnerHTML: {\n            __html: props.nullMessage\n        }\n    }), props.data && !props.data.length && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, props.zeroMessage), !!length && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"index\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n        themePalette: props.themePalette,\n        iconName: \"ChevronLeftMed\",\n        onClick: (e)=>activateRecord(index <= 0 ? length - 1 : index - 1),\n        disabled: props.disabled || length === 1,\n        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonPrevDataItem\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"span\", null, (0, $d5b6ce321475881f$export$21c51bc433c16634).record(index + 1, length)), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n        themePalette: props.themePalette,\n        iconName: \"ChevronRightMed\",\n        onClick: (e)=>activateRecord(index >= length - 1 ? 0 : index + 1),\n        disabled: props.disabled || length === 1,\n        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonNextDataItem\n    })), !props.itemVisible && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        className: \"item-filtered\"\n    }, (0, $d5b6ce321475881f$export$21c51bc433c16634).labelDataItemIsFiltered), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $abe5706469fa09a5$export$e9ab04247990d50b), {\n        columns: props.columns,\n        item: props.data[index],\n        disabled: props.disabled,\n        onSearch: props.onSearch,\n        bingSearchDisabled: props.bingSearchDisabled\n    })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $0edfbb46d4822ac6$export$12df67f310f5f846), {\n        theme: props.theme,\n        themePalette: props.themePalette,\n        initialCategoricalColumns: props.categoricalColumns,\n        initialQuantitativeColumns: props.quantitativeColumns,\n        onConfirmUpdate: props.onUpdateColumnTypes\n    }), props.dataExportHandler && props.data && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $cff73bb5fafa0795$export$b1b568728c48eba1), {\n        theme: props.theme,\n        initializer: {\n            fileName: `${(0, $cff73bb5fafa0795$export$748f956e607b675b)(props.displayName)} (${props.data.length})`\n        },\n        data: props.data,\n        dataExportHandler: props.dataExportHandler,\n        disabled: props.disabled\n    }));\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\nfunction $1451439fef5c6aa0$export$84202caead5689ba(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $5b1483fb7f067be1$export$eb2fcfdbd7ba97d4), {\n        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistory,\n        className: \"sanddance-history\"\n    }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"ol\", null, props.historyItems.map((hi, i)=>{\n        let ref;\n        if (i === props.historyIndex) {\n            ref = (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                (_a = ref.current) === null || _a === void 0 || _a.focus();\n            };\n        }\n        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", {\n            key: i,\n            className: (0, $e295d8097c1ad61a$exports).classList(i === props.historyIndex && 'selected'),\n            onKeyUp: (e)=>{\n                if (e.keyCode === (0, $482602738369d734$export$ec835b702d42f3f0).ENTER) props.redo(i);\n            }\n        }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n            className: 'sanddance-history-button',\n            componentRef: ref,\n            text: hi.label,\n            onClick: ()=>props.redo(i)\n        }));\n    })));\n}\nfunction $1451439fef5c6aa0$export$a5701bb72c00a527(historicInsight) {\n    const { colorBin: colorBin, columns: columns, directColor: directColor, facetStyle: facetStyle, filter: filter, hideAxes: hideAxes, hideLegend: hideLegend, scheme: scheme, signalValues: signalValues, size: size, totalStyle: totalStyle, transform: transform, chart: chart, view: view } = historicInsight;\n    const insight = {\n        colorBin: colorBin,\n        columns: columns,\n        directColor: directColor,\n        facetStyle: facetStyle,\n        filter: filter,\n        hideAxes: hideAxes,\n        hideLegend: hideLegend,\n        scheme: scheme,\n        signalValues: signalValues,\n        size: size,\n        totalStyle: totalStyle,\n        transform: transform,\n        chart: chart,\n        view: view\n    };\n    return insight;\n}\nfunction $1451439fef5c6aa0$export$5c9ba34b2d024c9b(historyItems, index) {\n    let filter = null;\n    let historicInsight = {};\n    for(let i = 0; i < index + 1; i++){\n        const historyItem = historyItems[i];\n        if (historyItem) {\n            if (historyItem.historicInsight.filter === null) filter = null;\n            else if (historyItem.historicInsight.rebaseFilter) filter = historyItem.historicInsight.filter;\n            else if (historyItem.historicInsight.filter) filter = (0, $1342cf7df79546f0$exports).searchExpression.narrow(filter, historyItem.historicInsight.filter);\n            historicInsight = Object.assign(Object.assign({}, historicInsight), historyItem.historicInsight);\n        }\n    }\n    return Object.assign(Object.assign({}, historicInsight), {\n        filter: filter\n    });\n}\n\n\n\n\n\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function $c887e455511417d2$var$hasClientXY(e) {\n    if (e && e.clientX !== undefined && e.clientX !== undefined) return {\n        top: e.clientY,\n        left: e.clientX\n    };\n}\nfunction $c887e455511417d2$export$1690e12b840569b9(e) {\n    const xy = $c887e455511417d2$var$hasClientXY(e);\n    if (xy) return xy;\n    const te = e;\n    if (te === null || te === void 0 ? void 0 : te.touches) for(let i = 0; i < te.touches.length; i++){\n        const xy = $c887e455511417d2$var$hasClientXY(te.touches[i]);\n        if (xy) return xy;\n    }\n    const el = e.target;\n    if (el && el.getClientRects) return el.getClientRects()[0];\n}\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $d5291de605e66403$export$1915de5807f54194(prefs, partialInsight) {\n    if (partialInsight) {\n        const specTypePrefs = prefs[partialInsight.chart] || {};\n        prefs[partialInsight.chart] = specTypePrefs;\n        for(const _role in partialInsight.columns){\n            const role = _role;\n            if (role === 'color' || role === 'x') {\n                const rolePrefs = specTypePrefs[role] || {};\n                specTypePrefs[role] = rolePrefs;\n                const column = partialInsight.columns[role];\n                const copySignalValue = (signalName)=>{\n                    if (partialInsight.signalValues && partialInsight.signalValues[signalName] && rolePrefs[column]) {\n                        const signalValues = rolePrefs[column].signalValues || {};\n                        signalValues[signalName] = partialInsight.signalValues[signalName];\n                        rolePrefs[column].signalValues = signalValues;\n                    }\n                };\n                switch(role){\n                    case 'color':\n                        rolePrefs[column] = {\n                            scheme: partialInsight.scheme,\n                            colorBin: partialInsight.colorBin\n                        };\n                        copySignalValue((0, $1342cf7df79546f0$exports).constants.SignalNames.ColorBinCount);\n                        break;\n                    case 'x':\n                        copySignalValue((0, $1342cf7df79546f0$exports).constants.SignalNames.XBins);\n                        break;\n                }\n            }\n        }\n    }\n}\nfunction $d5291de605e66403$export$c2992dc6411becf6(prefs, chart, role, column, signalName, signalValue) {\n    const partialInsight = $d5291de605e66403$export$a14483004c11686f(prefs, chart, role, column, {\n        signalValues: {}\n    });\n    partialInsight.signalValues[signalName] = signalValue;\n}\nfunction $d5291de605e66403$export$318d2f27a5d54aff(prefs, chart, role, columnName) {\n    const specTypePrefs = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.deepMerge({}, prefs['*'], prefs[chart]);\n    const rolePrefs = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.deepMerge({}, specTypePrefs['*'], specTypePrefs[role]);\n    const partialInsight = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.deepMerge({}, rolePrefs['*'], rolePrefs[columnName]);\n    return partialInsight;\n}\nfunction $d5291de605e66403$export$a14483004c11686f(prefs, chart, role, column, partialInsight) {\n    const SpecTypePrefs = prefs[chart] || {};\n    prefs[chart] = SpecTypePrefs;\n    const rolePrefs = SpecTypePrefs[role] || {};\n    SpecTypePrefs[role] = rolePrefs;\n    rolePrefs[column] = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.deepMerge({}, rolePrefs[column], partialInsight);\n    return rolePrefs[column];\n}\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \nfunction $5b0ca40e09feefab$var$comparableGroup(group) {\n    return Object.assign(Object.assign({}, group), {\n        clause: null\n    });\n}\nfunction $5b0ca40e09feefab$var$compareGroup(a, b) {\n    return (0, $1342cf7df79546f0$exports).searchExpression.compareGroup($5b0ca40e09feefab$var$comparableGroup(a), $5b0ca40e09feefab$var$comparableGroup(b));\n}\nfunction $5b0ca40e09feefab$export$c2270d7efbef44bf(haystack, needle) {\n    const groups = [];\n    let found = false;\n    //look for item in all\n    haystack.forEach((group)=>{\n        if ($5b0ca40e09feefab$var$compareGroup(group, needle)) //if it exists, don't add it\n        found = true;\n        else groups.push(group);\n    });\n    return {\n        groups: groups,\n        found: found\n    };\n}\nfunction $5b0ca40e09feefab$export$3ffa48e55176070e(search) {\n    const groups = (0, $1342cf7df79546f0$exports).searchExpression.ensureSearchExpressionGroupArray(search);\n    const dialogSearch = groups.map((group, groupIndex)=>{\n        return Object.assign(Object.assign({\n            key: groupIndex\n        }, group), {\n            expressions: group.expressions.map((ex, i)=>{\n                const ex2 = Object.assign({\n                    key: i\n                }, ex);\n                return ex2;\n            })\n        });\n    });\n    return dialogSearch;\n}\n\n\n\n\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ \n\n\n\n\nfunction $24a2c07dd03771c2$var$_Renderer(_props) {\n    class __Renderer extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            var _a, _b;\n            super(props);\n            this.state = this.getInitialState(props);\n            if (!((_b = (_a = this.state.viewer) === null || _a === void 0 ? void 0 : _a.presenter) === null || _b === void 0 ? void 0 : _b.morphchartsref)) {\n                const t = setInterval(()=>{\n                    var _a, _b;\n                    const newState = this.getInitialState(props);\n                    if (this.mounted && ((_b = (_a = newState.viewer) === null || _a === void 0 ? void 0 : _a.presenter) === null || _b === void 0 ? void 0 : _b.morphchartsref)) {\n                        clearInterval(t);\n                        this.setState(newState);\n                    }\n                }, 10);\n            }\n        }\n        componentDidMount() {\n            this.mounted = true;\n        }\n        componentWillUnmount() {\n            this.mounted = false;\n        }\n        getInitialState(props) {\n            const { viewer: viewer } = props.explorer;\n            return {\n                showOptions: false,\n                viewer: viewer\n            };\n        }\n        setOptions(newOptions) {\n            const { explorer: explorer } = this.props;\n            const renderer = Object.assign(Object.assign({}, explorer.state.renderer), newOptions);\n            const { onSetupOptionsChanged: onSetupOptionsChanged } = explorer.props;\n            if (onSetupOptionsChanged) {\n                const setup = explorer.getSetup();\n                setup.renderer = renderer;\n                onSetupOptionsChanged(setup);\n            }\n            explorer.setState({\n                renderer: renderer\n            });\n        }\n        setBasicOptions(newOptions) {\n            this.setOptions({\n                advanced: false,\n                basicOptions: Object.assign(Object.assign({}, this.props.basicOptions), newOptions)\n            });\n        }\n        setAdvancedOptions(newOptions) {\n            this.setOptions({\n                advanced: true,\n                advancedOptions: Object.assign(Object.assign({}, this.props.advancedOptions), newOptions)\n            });\n        }\n        render() {\n            var _a, _b;\n            const { props: props, state: state } = this;\n            const iconButtonStyles = {\n                menuIcon: {\n                    display: 'none'\n                }\n            };\n            if (!((_b = (_a = state.viewer) === null || _a === void 0 ? void 0 : _a.presenter) === null || _b === void 0 ? void 0 : _b.morphchartsref)) return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                styles: iconButtonStyles,\n                className: 'sanddance-advanced-renderer',\n                disabled: true,\n                iconName: 'HourGlass',\n                onClick: undefined,\n                themePalette: props.themePalette,\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRenderer\n            });\n            else {\n                const { morphchartsref: morphchartsref } = state.viewer.presenter;\n                const choiceButtonStyle = {\n                    border: 'none'\n                };\n                const { advanced: advanced, advancedOptions: advancedOptions, basicOptions: basicOptions } = props;\n                return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                    iconName: 'PicturePosition',\n                    title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonCameraHome,\n                    onClick: props.onHomeClick,\n                    styles: iconButtonStyles,\n                    themePalette: props.themePalette\n                }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                    styles: iconButtonStyles,\n                    className: 'sanddance-advanced-renderer',\n                    iconName: advanced ? 'DiamondSolid' : 'Diamond',\n                    disabled: !morphchartsref.supportedRenders.advanced,\n                    onClick: undefined,\n                    themePalette: props.themePalette,\n                    title: morphchartsref.supportedRenders.advanced ? (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRenderer : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererAdvancedDisabled,\n                    menuProps: {\n                        items: [\n                            {\n                                key: 'basic',\n                                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererBasic,\n                                iconProps: {\n                                    iconName: advanced ? null : 'RadioBullet'\n                                },\n                                onClick: ()=>advanced && this.setOptions({\n                                        advanced: false\n                                    })\n                            },\n                            {\n                                key: 'advanced',\n                                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererAdvanced,\n                                iconProps: {\n                                    iconName: advanced ? 'RadioBullet' : null\n                                },\n                                onClick: ()=>!advanced && this.setOptions({\n                                        advanced: true\n                                    })\n                            },\n                            {\n                                key: 'options',\n                                text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptions,\n                                onClick: (e)=>this.setState({\n                                        showOptions: true\n                                    })\n                            }\n                        ]\n                    }\n                }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                    hidden: !state.showOptions,\n                    dialogContentProps: {\n                        className: 'sanddance-renderer-dialog',\n                        title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsDialogTitle\n                    },\n                    onDismiss: ()=>this.setState({\n                            showOptions: false\n                        })\n                }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f9294a04a77df05a$export$353f5b6fc5456de1), {\n                    iconName: advanced ? 'RadioBtnOff' : 'RadioBtnOn',\n                    onClick: ()=>this.setOptions({\n                            advanced: false\n                        }),\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererBasic,\n                    themePalette: props.themePalette,\n                    rootStyle: choiceButtonStyle\n                }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"ul\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                    checked: basicOptions.antialias,\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsAntialias,\n                    onChange: (e, antialias)=>this.setBasicOptions({\n                            antialias: antialias\n                        })\n                })))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f9294a04a77df05a$export$353f5b6fc5456de1), {\n                    iconName: advanced ? 'RadioBtnOn' : 'RadioBtnOff',\n                    onClick: ()=>this.setOptions({\n                            advanced: true\n                        }),\n                    text: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererAdvanced,\n                    themePalette: props.themePalette,\n                    rootStyle: choiceButtonStyle\n                }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"ul\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                    checked: advancedOptions.isShadowEnabled,\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsShadow,\n                    onChange: (e, isShadowEnabled)=>this.setAdvancedOptions({\n                            isShadowEnabled: isShadowEnabled\n                        })\n                })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                    checked: advancedOptions.isSsaoEnabled,\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsSsao,\n                    onChange: (e, isSsaoEnabled)=>this.setAdvancedOptions({\n                            isSsaoEnabled: isSsaoEnabled\n                        })\n                })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                    checked: advancedOptions.isBloomEnabled,\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsBloom,\n                    onChange: (e, isBloomEnabled)=>this.setAdvancedOptions({\n                            isBloomEnabled: isBloomEnabled\n                        })\n                }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"ul\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Slider, {\n                    value: advancedOptions.bloomIntensity,\n                    min: 0.1,\n                    max: 5,\n                    step: 0.01,\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsBloomIntensity,\n                    onChange: (bloomIntensity)=>this.setAdvancedOptions({\n                            bloomIntensity: bloomIntensity,\n                            isBloomEnabled: true\n                        })\n                })))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                    checked: advancedOptions.isDofEnabled,\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsDof,\n                    onChange: (e, isDofEnabled)=>this.setAdvancedOptions({\n                            isDofEnabled: isDofEnabled\n                        })\n                }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"ul\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Slider, {\n                    value: advancedOptions.dofFocusRange,\n                    min: 0,\n                    max: 2,\n                    step: 0.01,\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsDofRange,\n                    onChange: (dofFocusRange)=>this.setAdvancedOptions({\n                            dofFocusRange: dofFocusRange,\n                            isDofEnabled: true\n                        })\n                })))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"li\", null, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Toggle, {\n                    checked: advancedOptions.isFxaaEnabled,\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelRendererOptionsFxaa,\n                    onChange: (e, isFxaaEnabled)=>this.setAdvancedOptions({\n                            isFxaaEnabled: isFxaaEnabled\n                        })\n                }))))));\n            }\n        }\n    }\n    return new __Renderer(_props);\n}\nconst $24a2c07dd03771c2$export$88530751e3977073 = $24a2c07dd03771c2$var$_Renderer;\n\n\n\nfunction $688b2ed8e5aa6452$var$_Explorer(_props) {\n    class __Explorer extends (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.Component {\n        constructor(props){\n            super(props);\n            this.dialogFocusHandler = {};\n            this.state = (0, $2273a7d1147da1bc$export$d1b579ecf4cf2d3f)(props);\n            this.imageHolder = {\n                img: null,\n                backgroundImageColumnBounds: [],\n                showBackgroundImage: false\n            };\n            this.snapshotThumbWidth = (0, $2273a7d1147da1bc$export$7e33de69431bbb06);\n            this.discardColorContextUpdates = true;\n            this.updateViewerOptions(Object.assign(Object.assign({}, (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.clone((0, $1342cf7df79546f0$exports).Viewer.defaultViewerOptions)), props.viewerOptions));\n        }\n        finalize() {\n            if (this.viewer) this.viewer.finalize();\n        }\n        updateViewerOptions(viewerOptions) {\n            this.viewerOptions = Object.assign(Object.assign({}, (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.deepMerge((0, $2273a7d1147da1bc$export$fb736e4909afb3d7), {\n                tooltipOptions: {\n                    prepareDataItem: (item)=>{\n                        const ret = {};\n                        for(const columnName in item)if (this.state.tooltipExclusions.indexOf(columnName) < 0) ret[columnName] = item[columnName];\n                        return ret;\n                    }\n                }\n            }, this.viewerOptions, viewerOptions)), {\n                onColorContextChange: ()=>this.manageColorToolbar(),\n                onDataFilter: (filter, filteredData)=>{\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    selectedItemIndex[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData] = 0;\n                    this.changeInsight({\n                        filter: filter\n                    }, {\n                        label: this.historicFilterChange,\n                        omit: !this.historicFilterChange\n                    });\n                    this.historicFilterChange = null;\n                    this.setState({\n                        filteredData: filteredData,\n                        selectedItemIndex: selectedItemIndex\n                    });\n                    if (this.state.sideTabId === (0, $2752fa503c160704$export$f3b7566ffe363e3b).Data && this.state.dataScopeId === (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData) //make sure item is active\n                    requestAnimationFrame(()=>filteredData && this.silentActivation(filteredData[0]));\n                    viewerOptions && viewerOptions.onDataFilter && viewerOptions.onDataFilter(filter, filteredData);\n                },\n                onSelectionChanged: (newSearch, index, selectedData)=>{\n                    if (this.ignoreSelectionChange) return;\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    selectedItemIndex[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData] = index || 0;\n                    let { search: search } = this.state;\n                    const { sideTabId: sideTabId } = this.state;\n                    if (newSearch) search = (0, $5b0ca40e09feefab$export$3ffa48e55176070e)(newSearch);\n                    this.setState({\n                        search: search,\n                        selectedItemIndex: selectedItemIndex,\n                        sideTabId: sideTabId\n                    });\n                    viewerOptions && viewerOptions.onSelectionChanged && viewerOptions.onSelectionChanged(newSearch, index, selectedData);\n                },\n                onAxisClick: (e, search)=>{\n                    this.toggleableSearch(e, search);\n                    viewerOptions && viewerOptions.onAxisClick && viewerOptions.onAxisClick(e, search);\n                },\n                onLegendHeaderClick: (e)=>{\n                    const pos = (0, $c887e455511417d2$export$1690e12b840569b9)(e);\n                    const specRole = this.state.specCapabilities && this.state.specCapabilities.roles.filter((r)=>r.role === 'color')[0];\n                    const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), {\n                        collapseLabel: true,\n                        container: this.div,\n                        selectedColumnName: this.state.columns['color'],\n                        onDismiss: ()=>{\n                            this.setState({\n                                positionedColumnMapProps: null\n                            });\n                        },\n                        specRole: specRole,\n                        left: pos.left - this.div.clientLeft,\n                        top: pos.top - this.div.clientTop\n                    });\n                    this.setState({\n                        positionedColumnMapProps: positionedColumnMapProps\n                    });\n                },\n                onLegendRowClick: (e, legendRow)=>{\n                    this.toggleableSearch(e, legendRow.search);\n                    viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onLegendRowClick(e, legendRow);\n                },\n                onError: (errors)=>{\n                    this.setState({\n                        errors: errors\n                    });\n                    viewerOptions && viewerOptions.onError && viewerOptions.onError(errors);\n                },\n                onBeforeCreateLayers: (stage, specCapabilities)=>{\n                    (0, $f47e4461409e9b5c$export$48e4a8ab7f4530ac)(stage, specCapabilities);\n                },\n                getTextColor: (o)=>{\n                    if (o.specRole) return (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.colorFromString(this.viewerOptions.colors.clickableText);\n                    else if (o.metaData && o.metaData.search) return (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.colorFromString(this.viewerOptions.colors.searchText);\n                    else return o.color;\n                },\n                getTextHighlightColor: (o)=>{\n                    if (o.specRole) return (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.colorFromString(this.viewerOptions.colors.clickableTextHighlight);\n                    else if (o.metaData && o.metaData.search) return (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.colorFromString(this.viewerOptions.colors.searchTextHighlight);\n                    else return [\n                        0,\n                        0,\n                        0,\n                        0\n                    ];\n                },\n                onTextClick: (e, text)=>{\n                    if (e && text) {\n                        const pos = (0, $c887e455511417d2$export$1690e12b840569b9)(e);\n                        const rect = this.viewer.element.getBoundingClientRect();\n                        pos.left += rect.left;\n                        pos.top += rect.top;\n                        const { specRole: specRole } = text;\n                        if (pos && specRole) {\n                            const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), {\n                                collapseLabel: true,\n                                container: this.div,\n                                selectedColumnName: this.state.columns[specRole.role],\n                                onDismiss: ()=>{\n                                    this.setState({\n                                        positionedColumnMapProps: null\n                                    });\n                                },\n                                specRole: specRole,\n                                left: pos.left,\n                                top: pos.top\n                            });\n                            this.setState({\n                                positionedColumnMapProps: positionedColumnMapProps\n                            });\n                        } else this.setState({\n                            positionedColumnMapProps: null\n                        });\n                    }\n                },\n                onNewViewStateTarget: ()=>this.newViewStateTarget\n            });\n            if (this.viewer && this.viewer.presenter) {\n                const newPresenterStyle = (0, $1342cf7df79546f0$exports).util.getPresenterStyle(this.viewerOptions);\n                const mergePrenterStyle = Object.assign(Object.assign({}, this.viewer.presenter.style), newPresenterStyle);\n                this.viewer.presenter.style = mergePrenterStyle;\n                this.viewer.options = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.deepMerge(this.viewer.options, this.props.viewerOptions, this.viewerOptions);\n            }\n        }\n        signal(signalName, signalValue, newViewStateTarget) {\n            switch(signalName){\n                case (0, $1342cf7df79546f0$exports).constants.SignalNames.ColorBinCount:\n                case (0, $1342cf7df79546f0$exports).constants.SignalNames.ColorReverse:\n                case (0, $1342cf7df79546f0$exports).constants.SignalNames.MarkOpacity:\n                    this.discardColorContextUpdates = false;\n                    break;\n            }\n            this.newViewStateTarget = newViewStateTarget;\n            this.viewer.vegaViewGl.signal(signalName, signalValue);\n            this.viewer.vegaViewGl.runAsync().then(()=>{\n                //deeply set the state without a state change. This prevents a redraw if re-rendered\n                if (this.state.signalValues) this.state.signalValues[signalName] = signalValue;\n                this.discardColorContextUpdates = true;\n                this.newViewStateTarget = undefined;\n                this.props.onSignalChanged && this.props.onSignalChanged(signalName, signalValue);\n            });\n        }\n        manageColorToolbar() {\n            const canRemap = this.viewer.colorContexts && this.viewer.colorContexts.length > 1;\n            (0, $46e7ccd2bf7a69a1$export$225a002951c27da7)(this.viewer.presenter, !!this.state.columns.color, {\n                themePalette: (0, $a7be03ae5c68c2c3$export$3465a0e7b289ab72)[this.props.theme || ''],\n                canRemap: canRemap,\n                isRemap: canRemap && this.viewer.currentColorContext > 0,\n                colorMapHandler: (remap)=>{\n                    this.viewer.currentColorContext = ~~remap;\n                    this.viewer.renderSameLayout();\n                    this.manageColorToolbar();\n                }\n            });\n        }\n        getInsight() {\n            return this.viewer.getInsight();\n        }\n        getSetup() {\n            return {\n                camera: this.state.holdCamera ? 'hold' : this.state.camera,\n                renderer: this.state.renderer,\n                transition: (0, $7169c11dc639bbc5$export$d5639c01d489b0c)(this.state),\n                transitionDurations: this.state.transitionDurations\n            };\n        }\n        setSetup(setup, newState) {\n            newState.camera = undefined;\n            if (setup) {\n                this.props.onSetupOptionsChanged && this.props.onSetupOptionsChanged(setup);\n                const { camera: camera, renderer: renderer, transition: transition, transitionDurations: transitionDurations } = setup;\n                newState.renderer = renderer;\n                newState.transitionType = transition.type;\n                if (camera === 'hold') newState.holdCamera = true;\n                else {\n                    newState.holdCamera = false;\n                    newState.camera = camera;\n                }\n                if (transition.type === 'column') newState.transitionColumn = transition.column;\n                else if (transition.type === 'position') newState.transitionDimension = transition.dimension;\n                if (transitionDurations) {\n                    newState.transitionDurations = transitionDurations;\n                    (0, $7169c11dc639bbc5$export$39fa25c8c3576e7a)(this.viewer, transitionDurations);\n                }\n            }\n        }\n        setInsight(historyAction, newState = {}, partialInsight = this.viewer.getInsight(), rebaseFilter, setup) {\n            const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n            (0, $86b892255d8eb4f0$export$6d13117e74df8390)(selectedItemIndex);\n            const historicInsight = Object.assign({\n                chart: null,\n                scheme: null,\n                columns: null,\n                filter: null,\n                rebaseFilter: rebaseFilter\n            }, partialInsight);\n            const state = Object.assign({\n                filteredData: null,\n                selectedItemIndex: selectedItemIndex,\n                search: (0, $5b0ca40e09feefab$export$3ffa48e55176070e)(historicInsight.filter)\n            }, newState);\n            const changeInsight = ()=>{\n                this.getColorContext = null;\n                this.setSetup(setup, historicInsight);\n                this.changeInsight(historicInsight, historyAction, state, setup);\n            };\n            const currentFilter = this.viewer.getInsight().filter;\n            if (rebaseFilter && currentFilter && historicInsight.filter) {\n                if ((0, $1342cf7df79546f0$exports).searchExpression.startsWith(historicInsight.filter, currentFilter)) changeInsight();\n                else {\n                    const { transitionDurations: transitionDurations } = this.state;\n                    const renderTime = transitionDurations.position + transitionDurations.stagger;\n                    const allowAsyncRenderTime = renderTime + this.viewerOptions.filterRenderingTimerPadding;\n                    this.viewer.reset().then(()=>new Promise((resolve, reject)=>{\n                            setTimeout(resolve, allowAsyncRenderTime);\n                        })).then(changeInsight);\n                }\n            } else changeInsight();\n        }\n        handleReviveSnapshot(snapshot, selectedSnapshotIndex) {\n            let handled = false;\n            if (this.props.onSnapshotClick) {\n                this.setState({\n                    selectedSnapshotIndex: selectedSnapshotIndex\n                });\n                handled = this.props.onSnapshotClick(snapshot, selectedSnapshotIndex);\n            }\n            if (!handled) this.reviveSnapshot(selectedSnapshotIndex);\n        }\n        reviveSnapshot(snapshotOrIndex) {\n            if (typeof snapshotOrIndex === 'number') {\n                const selectedSnapshotIndex = snapshotOrIndex;\n                const snapshot = this.state.snapshots[selectedSnapshotIndex];\n                const newState = {\n                    note: snapshot.description,\n                    selectedSnapshotIndex: selectedSnapshotIndex\n                };\n                if (!this.state.sidebarClosed) {\n                    newState.sideTabId = (0, $2752fa503c160704$export$f3b7566ffe363e3b).Snapshots;\n                    this.scrollSnapshotIntoView(selectedSnapshotIndex);\n                }\n                if (snapshot.insight) {\n                    const { backgroundImage: backgroundImage } = snapshot.insight;\n                    this.imageHolder.showBackgroundImage = !!backgroundImage;\n                    if (backgroundImage) this.imageHolder.img = {\n                        src: backgroundImage.url,\n                        height: backgroundImage.size.height,\n                        width: backgroundImage.size.width\n                    };\n                }\n                this.setInsight({\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryReviveSnapshot\n                }, newState, snapshot.insight, true, snapshot.setup);\n            } else {\n                const snapshot = snapshotOrIndex;\n                if (snapshot.insight) this.setInsight({\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryReviveSnapshot\n                }, {\n                    note: snapshot.description,\n                    selectedSnapshotIndex: -1\n                }, snapshot.insight, true, snapshot.setup); //don't navigate to sideTab\n                else this.setState({\n                    note: snapshot.description,\n                    selectedSnapshotIndex: -1\n                });\n            }\n        }\n        load(data, getPartialInsight, optionsOrPrefs) {\n            this.setState({\n                historyIndex: -1,\n                historyItems: []\n            });\n            this.changeInsight({\n                columns: null\n            }, {\n                label: null,\n                omit: true\n            }, {\n                note: null\n            });\n            return new Promise((resolve, reject)=>{\n                const loadFinal = (dataContent)=>{\n                    let partialInsight;\n                    this.prefs = optionsOrPrefs && optionsOrPrefs.chartPrefs || optionsOrPrefs || {};\n                    this.imageHolder.backgroundImageColumnBounds = (0, $cdd6162a40e9c08a$export$46ec3e17747a00c9)(dataContent.columns);\n                    if (getPartialInsight) {\n                        partialInsight = getPartialInsight(dataContent.columns);\n                        (0, $d5291de605e66403$export$1915de5807f54194)(this.prefs, partialInsight);\n                    }\n                    if (!partialInsight) {\n                        //load recommendation\n                        const r = new (0, $431d9b72caa01089$export$28206cc98a74452)(dataContent.columns, dataContent.data);\n                        partialInsight = r.recommend();\n                    }\n                    partialInsight = Object.assign({\n                        facetStyle: 'wrap',\n                        filter: null,\n                        totalStyle: null,\n                        transform: null\n                    }, partialInsight);\n                    if (partialInsight.chart === 'barchart') partialInsight.chart = 'barchartV';\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    const sideTabId = (0, $2752fa503c160704$export$f3b7566ffe363e3b).ChartType;\n                    (0, $86b892255d8eb4f0$export$6d13117e74df8390)(selectedItemIndex);\n                    const newState = Object.assign({\n                        camera: undefined,\n                        columns: {},\n                        dataFile: dataFile,\n                        dataContent: dataContent,\n                        snapshots: dataContent.snapshots || this.state.snapshots,\n                        autoCompleteDistinctValues: {},\n                        filteredData: null,\n                        tooltipExclusions: optionsOrPrefs && optionsOrPrefs.tooltipExclusions || [],\n                        selectedItemIndex: selectedItemIndex,\n                        sideTabId: sideTabId\n                    }, partialInsight);\n                    this.getColorContext = null;\n                    (0, $cdd6162a40e9c08a$export$1e096674a95fd43b)(newState.columns, dataContent.columns, newState.transform);\n                    const errors = (0, $cdd6162a40e9c08a$export$c2563952d877899)(partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.chart, partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.totalStyle, newState.columns, dataContent.columns);\n                    newState.errors = errors;\n                    newState.transitionColumn = dataContent.columns[0];\n                    const setup = optionsOrPrefs && optionsOrPrefs.setup;\n                    this.setSetup(setup, newState);\n                    //change insight\n                    this.changeInsight(partialInsight, {\n                        label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryInit,\n                        insert: true\n                    }, newState, optionsOrPrefs && optionsOrPrefs.setup);\n                    //make sure item is active\n                    this.activateDataBrowserItem(sideTabId, this.state.dataScopeId);\n                    resolve();\n                };\n                let dataFile;\n                if (Array.isArray(data)) return (0, $105d7d4c8faa6087$export$c084150d12efae43)(data, 'json', optionsOrPrefs && optionsOrPrefs.columnTypes).then((result)=>{\n                    dataFile = {\n                        type: 'json'\n                    };\n                    loadFinal(result);\n                }).catch(reject);\n                else {\n                    dataFile = data;\n                    return (0, $105d7d4c8faa6087$export$9d26f8f2be82424f)(dataFile, optionsOrPrefs && optionsOrPrefs.columnTypes).then(loadFinal).catch(reject);\n                }\n            });\n        }\n        changeChartType(chart) {\n            const partialInsight = Object.assign({}, (0, $d5291de605e66403$export$318d2f27a5d54aff)(this.prefs, chart, '*', '*'));\n            const insight = Object.assign({\n                chart: chart\n            }, partialInsight);\n            const columns = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.deepMerge({}, partialInsight.columns, this.state.columns);\n            const { signalValues: signalValues } = this.viewer.getInsight();\n            insight.signalValues = Object.assign(Object.assign({}, this.state.signalValues), signalValues);\n            insight.columns = Object.assign({}, columns);\n            insight.totalStyle = this.state.totalStyle;\n            let errors;\n            //special case mappings when switching chart type\n            if (this.state.chart === 'scatterplot' && (chart === 'barchart' || chart === 'barchartV')) insight.columns = Object.assign(Object.assign({}, columns), {\n                sort: columns.y\n            });\n            else if (this.state.chart === 'scatterplot' && chart === 'barchartH') insight.columns = Object.assign(Object.assign({}, columns), {\n                sort: columns.x\n            });\n            else if (chart === 'treemap') {\n                insight.view = '2d';\n                if (!columns.size) {\n                    //make sure size exists and is numeric\n                    let sizeColumn;\n                    //first check prefs\n                    if (partialInsight && partialInsight.columns && partialInsight.columns.size) {\n                        const prefSizeColumn = this.state.dataContent.columns.filter((c)=>c.name === partialInsight.columns.size)[0];\n                        if (prefSizeColumn && prefSizeColumn.quantitative) sizeColumn = prefSizeColumn;\n                    }\n                    if (!sizeColumn) sizeColumn = (0, $cdd6162a40e9c08a$export$7e0d3b5c6570ae8b)(this.state.dataContent.columns);\n                    if (!sizeColumn) //error - no numeric columns\n                    errors = [\n                        (0, $d5b6ce321475881f$export$21c51bc433c16634).errorColumnMustBeNumeric\n                    ];\n                    else insight.columns = Object.assign(Object.assign({}, columns), {\n                        size: sizeColumn.name\n                    });\n                }\n            } else if (chart === 'stacks') insight.view = '3d';\n            (0, $cdd6162a40e9c08a$export$1e096674a95fd43b)(insight.columns, this.state.dataContent.columns, this.state.transform);\n            errors = (0, $cdd6162a40e9c08a$export$c2563952d877899)(chart, insight.totalStyle, insight.columns, this.state.dataContent.columns);\n            this.calculate(()=>{\n                this.changeInsight(insight, {\n                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryChangeChartType((0, $b4b5d5b480eaf9ae$export$7d1536ca08644643)(chart))\n                }, errors ? {\n                    errors: errors,\n                    camera: undefined\n                } : {\n                    camera: undefined\n                });\n            });\n            return insight.columns;\n        }\n        calculate(calculating) {\n            this.setState({\n                calculating: calculating\n            });\n        }\n        changeView(view) {\n            this.changeInsight({\n                view: view\n            }, {\n                label: view === '2d' ? (0, $d5b6ce321475881f$export$21c51bc433c16634).labelViewType2d : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelViewType3d\n            });\n        }\n        //state members which change the insight\n        changeInsight(partialInsight, historyAction, additionalUIState, historicSetup) {\n            if (!partialInsight.signalValues) partialInsight.signalValues = null;\n            if (partialInsight.chart === 'barchart') partialInsight.chart = 'barchartV';\n            this.addHistory(Object.assign(Object.assign({}, partialInsight), {\n                historicSetup: historicSetup\n            }), historyAction, additionalUIState);\n        }\n        addHistory(historicInsight, historyAction, additionalUIState) {\n            const setCleanState = (newState)=>{\n                const cleanState = Object.assign(Object.assign({}, newState), additionalUIState);\n                if (!cleanState.note) cleanState.note = null;\n                delete cleanState.rebaseFilter;\n                if (this.viewer) {\n                    const { signalValues: signalValues } = this.viewer.getInsight();\n                    cleanState.signalValues = Object.assign(Object.assign(Object.assign({}, this.state.signalValues), signalValues), cleanState.signalValues);\n                }\n                this.setState(cleanState);\n            };\n            if (historyAction.omit) {\n                setCleanState(historicInsight);\n                return;\n            }\n            const historyItems = this.state.historyItems.slice(0, this.state.historyIndex + 1);\n            const historyIndex = historyItems.length;\n            historyItems.push({\n                label: historyAction.label,\n                historicInsight: historicInsight\n            });\n            if (historyAction.insert) setCleanState({\n                historyIndex: historyIndex,\n                historyItems: historyItems\n            });\n            else setCleanState(Object.assign(Object.assign({}, historicInsight), {\n                historyIndex: historyIndex,\n                historyItems: historyItems\n            }));\n        }\n        replay(index) {\n            return (0, $1451439fef5c6aa0$export$5c9ba34b2d024c9b)(this.state.historyItems, index);\n        }\n        undo() {\n            const historyIndex = this.state.historyIndex - 1;\n            if (historyIndex < 0) return;\n            this.doReplay(historyIndex);\n        }\n        redo(historyIndex = this.state.historyIndex + 1) {\n            if (historyIndex >= this.state.historyItems.length) return;\n            this.doReplay(historyIndex);\n        }\n        doReplay(historyIndex) {\n            const newState = this.replay(historyIndex);\n            this.rebaseFilter = true;\n            this.setSetup(newState.historicSetup, newState);\n            this.setState(Object.assign(Object.assign({}, newState), {\n                historyIndex: historyIndex\n            }));\n        }\n        changespecCapabilities(specCapabilities) {\n            this.setState({\n                specCapabilities: specCapabilities\n            });\n        }\n        changeColumnMapping(role, column, options) {\n            const columns = Object.assign({}, this.state.columns);\n            const label = column ? (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryMapColumn(role) : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryUnMapColumn(role);\n            const final = ()=>{\n                const partialInsight = {\n                    columns: columns,\n                    totalStyle: options ? options.totalStyle : this.state.totalStyle\n                };\n                const errors = (0, $cdd6162a40e9c08a$export$c2563952d877899)(this.state.chart, partialInsight.totalStyle, partialInsight.columns, this.state.dataContent.columns);\n                columns[role] = column && column.name;\n                this.changeInsight(partialInsight, {\n                    label: label\n                }, errors ? {\n                    errors: errors,\n                    camera: this.viewer.getCamera()\n                } : {\n                    camera: this.viewer.getCamera()\n                });\n            };\n            const _changeInsight = (newInsight, columnUpdate, historyAction)=>{\n                newInsight.columns = (0, $1342cf7df79546f0$exports).VegaMorphCharts.util.deepMerge({}, columns, columnUpdate);\n                (0, $d5291de605e66403$export$a14483004c11686f)(this.prefs, this.state.chart, '*', '*', {\n                    columns: columnUpdate\n                });\n                this.changeInsight(newInsight, historyAction, {\n                    camera: this.viewer.getCamera()\n                });\n            };\n            if (column) {\n                let columnUpdate;\n                switch(role){\n                    case 'facet':\n                        {\n                            (0, $d5291de605e66403$export$318d2f27a5d54aff)(this.prefs, this.state.chart, 'facet', column.name);\n                            const historicInsight = {\n                                columns: columns,\n                                facetStyle: options ? options.facetStyle : this.state.facetStyle\n                            };\n                            columnUpdate = {\n                                facet: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label: label\n                            });\n                            break;\n                        }\n                    case 'color':\n                        {\n                            let calculating = null;\n                            const historicInsight = {\n                                scheme: options && options.scheme,\n                                columns: columns,\n                                colorBin: this.state.colorBin\n                            };\n                            if (!historicInsight.scheme) (0, $d5291de605e66403$export$318d2f27a5d54aff)(this.prefs, this.state.chart, 'color', column.name);\n                            if (!historicInsight.scheme) historicInsight.scheme = (0, $e3b58b932870fa44$export$ba25af89e7ea3c1a)(column, null, this.state.scheme);\n                            if (!column.stats.hasColorData) {\n                                historicInsight.directColor = false;\n                                if (this.state.directColor !== historicInsight.directColor) calculating = ()=>this._resize();\n                            }\n                            if (this.state.columns && this.state.columns.color && this.state.columns.color !== column.name) {\n                                const currColorColumn = this.state.dataContent.columns.filter((c)=>c.name === this.state.columns.color)[0];\n                                if (column.isColorData != currColorColumn.isColorData) calculating = ()=>this._resize();\n                            }\n                            this.ignoreSelectionChange = true;\n                            this.viewer.deselect().then(()=>{\n                                this.ignoreSelectionChange = false;\n                                //allow deselection to render\n                                requestAnimationFrame(()=>{\n                                    columnUpdate = {\n                                        color: column.name\n                                    };\n                                    this.getColorContext = null;\n                                    this.setState({\n                                        calculating: calculating\n                                    });\n                                    _changeInsight(historicInsight, columnUpdate, {\n                                        label: label\n                                    });\n                                });\n                            });\n                            break;\n                        }\n                    case 'x':\n                        {\n                            (0, $d5291de605e66403$export$318d2f27a5d54aff)(this.prefs, this.state.chart, 'x', column.name);\n                            const historicInsight = {\n                                columns: columns\n                            };\n                            columnUpdate = {\n                                x: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label: label\n                            });\n                            break;\n                        }\n                    case 'size':\n                        {\n                            (0, $d5291de605e66403$export$318d2f27a5d54aff)(this.prefs, this.state.chart, 'size', column.name);\n                            const historicInsight = {\n                                totalStyle: options ? options.totalStyle : this.state.totalStyle\n                            };\n                            columnUpdate = {\n                                size: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label: label\n                            });\n                            break;\n                        }\n                    default:\n                        final();\n                        break;\n                }\n            } else switch(role){\n                case 'facet':\n                    columns.facet = null;\n                    columns.facetV = null;\n                    this.changeInsight({\n                        columns: columns,\n                        facetStyle: 'wrap'\n                    }, {\n                        label: label\n                    });\n                    break;\n                default:\n                    final();\n                    break;\n            }\n        }\n        setSideTabId(sideTabId, dataScopeId) {\n            if (sideTabId === (0, $2752fa503c160704$export$f3b7566ffe363e3b).Data && dataScopeId == null) //choose most relevant DataScopeId\n            dataScopeId = this.getBestDataScopeId();\n            if (dataScopeId == null) dataScopeId = this.state.dataScopeId;\n            const calculating = ()=>{\n                this.dialogFocusHandler.focus && this.dialogFocusHandler.focus();\n            };\n            this.setState({\n                sideTabId: sideTabId,\n                dataScopeId: dataScopeId,\n                sidebarClosed: false,\n                calculating: calculating\n            });\n            this.activateDataBrowserItem(sideTabId, dataScopeId);\n        }\n        getBestDataScopeId() {\n            let dataScopeId;\n            const selectionState = this.viewer && this.viewer.getSelection();\n            if (selectionState && selectionState.selectedData && selectionState.selectedData.length) dataScopeId = (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData;\n            else if (this.state.filteredData) dataScopeId = (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData;\n            else dataScopeId = (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData;\n            return dataScopeId;\n        }\n        activateDataBrowserItem(sideTabId, dataScopeId) {\n            if (!this.viewer) return;\n            let itemToActivate;\n            if (sideTabId === (0, $2752fa503c160704$export$f3b7566ffe363e3b).Data) switch(dataScopeId){\n                case (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData:\n                    itemToActivate = this.state.dataContent && this.state.dataContent.data[this.state.selectedItemIndex[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData]];\n                    break;\n                case (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData:\n                    itemToActivate = this.state.filteredData && this.state.filteredData[this.state.selectedItemIndex[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData]];\n                    break;\n                case (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData:\n                    {\n                        const selection = this.viewer.getSelection() || {};\n                        itemToActivate = selection.selectedData && selection.selectedData[this.state.selectedItemIndex[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData]];\n                        break;\n                    }\n            }\n            this.silentActivation(itemToActivate);\n        }\n        silentActivation(itemToActivate) {\n            this.ignoreSelectionChange = true;\n            const done = ()=>{\n                this.ignoreSelectionChange = false;\n            };\n            if (itemToActivate) return this.viewer.activate(itemToActivate).then(done);\n            else return this.viewer.deActivate().then(done);\n        }\n        sidebar(sidebarClosed, sidebarPinned) {\n            this.setState({\n                sidebarClosed: sidebarClosed,\n                sidebarPinned: sidebarPinned\n            });\n        }\n        resize() {\n            this.setState({\n                calculating: ()=>this._resize()\n            });\n        }\n        _resize() {\n            this.changeInsight({\n                size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed)\n            }, {\n                label: 'resize',\n                omit: true\n            });\n        }\n        viewerMounted(glDiv) {\n            this.setState({\n                size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed),\n                signalValues: this.state.signalValues\n            });\n        }\n        getLayoutDivSize(pinned, closed) {\n            const div = pinned && !closed ? this.layoutDivPinned : this.layoutDivUnpinned;\n            return {\n                height: div.offsetHeight,\n                width: div.offsetWidth\n            };\n        }\n        toggleableSearch(e, search) {\n            if (e.ctrlKey) {\n                this.setState({\n                    search: (0, $5b0ca40e09feefab$export$3ffa48e55176070e)(search)\n                });\n                this.setSideTabId((0, $2752fa503c160704$export$f3b7566ffe363e3b).Search);\n            } else {\n                const oldSelection = this.viewer.getSelection();\n                if (oldSelection.search) {\n                    //look for matching groups and toggle them\n                    const result = (0, $5b0ca40e09feefab$export$c2270d7efbef44bf)((0, $1342cf7df79546f0$exports).searchExpression.ensureSearchExpressionGroupArray(oldSelection.search), search);\n                    if (result.found) {\n                        //removing a group\n                        if (result.groups.length === 0) this.doDeselect();\n                        else //select with new search removed\n                        this.doSelect(result.groups);\n                    } else //adding a new group\n                    if (e.altKey || e.shiftKey) {\n                        let group = true;\n                        if (e.altKey) search.clause = '&&';\n                        else if (e.shiftKey) {\n                            if (this.props.searchORDisabled) group = false;\n                            else search.clause = '||';\n                        }\n                        if (group) {\n                            result.groups.push(search);\n                            this.doSelect(result.groups);\n                        } else this.doSelect(search);\n                    } else //replace\n                    this.doSelect(search);\n                } else this.doSelect(search);\n            }\n        }\n        doFilter(search, historicFilterChange) {\n            this.historicFilterChange = historicFilterChange;\n            this.viewer.filter(search);\n        }\n        doUnfilter(historicFilterChange) {\n            this.historicFilterChange = historicFilterChange;\n            this.viewer.reset();\n        }\n        doSelect(search) {\n            return this.viewer.select(search);\n        }\n        doDeselect() {\n            return this.viewer.deselect();\n        }\n        writeSnapshot(snapshot, editIndex) {\n            let { selectedSnapshotIndex: selectedSnapshotIndex } = this.state;\n            let snapshots;\n            if (editIndex >= 0) {\n                snapshots = [\n                    ...this.state.snapshots\n                ];\n                snapshots[editIndex] = snapshot;\n                this.setState({\n                    snapshots: snapshots,\n                    selectedSnapshotIndex: selectedSnapshotIndex\n                });\n            } else {\n                const note = snapshot.description;\n                snapshots = this.state.snapshots.concat(snapshot);\n                selectedSnapshotIndex = snapshots.length - 1;\n                this.scrollSnapshotIntoView(selectedSnapshotIndex);\n                this.setState({\n                    sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Snapshots,\n                    snapshots: snapshots,\n                    selectedSnapshotIndex: selectedSnapshotIndex,\n                    note: note\n                });\n            }\n            this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n        }\n        scrollSnapshotIntoView(selectedSnapshotIndex) {\n            clearTimeout(this.scrollSnapshotTimer);\n            if (this.state.sidebarClosed) return;\n            this.scrollSnapshotTimer = setTimeout(()=>{\n                const selectedSnapshotElement = this.div.querySelector(`.snapshot:nth-child(${selectedSnapshotIndex + 1})`);\n                if (selectedSnapshotElement) selectedSnapshotElement.scrollIntoView({\n                    behavior: 'smooth',\n                    block: 'nearest'\n                });\n            }, 500);\n        }\n        componentDidMount() {\n            if (this.props.mounted) this.props.mounted(this);\n        }\n        render() {\n            var _a, _b, _c;\n            const insight = (0, $1451439fef5c6aa0$export$a5701bb72c00a527)(this.state);\n            const loaded = !!(insight.columns && this.state.dataContent);\n            if (loaded) (0, $15c8a952544b8f28$export$5aa9f35b88971754)(insight, this.imageHolder, this.state.columns);\n            const selectionState = this.viewer && this.viewer.getSelection() || {};\n            const selectionSearch = selectionState && selectionState.search;\n            const columnMapProps = this.getColumnMapBaseProps();\n            const datas = {};\n            datas[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData] = this.state.dataContent && this.state.dataContent.data;\n            datas[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).FilteredData] = this.state.filteredData;\n            datas[(0, $86b892255d8eb4f0$export$f0297ce57faf7d71).SelectedData] = selectionState && selectionState.selectedData;\n            if (this.state.calculating) requestAnimationFrame(()=>{\n                //allow render to complete\n                if (this.state.calculating) {\n                    this.state.calculating();\n                    this.setState({\n                        calculating: null\n                    });\n                }\n            });\n            const theme = this.props.theme || '';\n            const themePalette = (0, $a7be03ae5c68c2c3$export$3465a0e7b289ab72)[theme];\n            let renderOptions;\n            if (loaded) renderOptions = Object.assign(Object.assign({}, this.props.renderOptions), {\n                rebaseFilter: ()=>this.rebaseFilter,\n                initialColorContext: this.getColorContext && this.getColorContext(this.viewer.insight, insight),\n                discardColorContextUpdates: ()=>this.discardColorContextUpdates,\n                columns: (_a = this.state.dataContent) === null || _a === void 0 ? void 0 : _a.columns\n            });\n            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div) this.div = div;\n                },\n                className: (0, $e295d8097c1ad61a$exports).classList('sanddance-explorer', this.props.theme)\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $17936d27f9fcfa1f$export$1ca1e38143dcc152), {\n                collapseLabels: this.props.compactUI,\n                historyIndex: this.state.historyIndex,\n                historyItems: this.state.historyItems,\n                undo: ()=>this.undo(),\n                redo: ()=>this.redo(),\n                logoClickUrl: this.props.logoClickUrl,\n                logoClickTarget: this.props.logoClickTarget,\n                themePalette: themePalette,\n                loaded: loaded,\n                doDeselect: this.doDeselect.bind(this),\n                doFilter: this.doFilter.bind(this),\n                doUnfilter: this.doUnfilter.bind(this),\n                filter: this.state.filter,\n                selectionSearch: selectionSearch,\n                selectionState: selectionState,\n                buttons: this.props.topBarButtonProps,\n                iconButtons: this.props.topBarIconButtonProps,\n                view: this.state.view,\n                snapshotsHidden: (_b = this.props.snapshotProps) === null || _b === void 0 ? void 0 : _b.hidden,\n                snapshots: this.state.snapshots,\n                onSnapshotPreviousClick: ()=>{\n                    let selectedSnapshotIndex;\n                    if (this.state.selectedSnapshotIndex === -1) selectedSnapshotIndex = this.state.snapshots.length - 1;\n                    else {\n                        selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n                        selectedSnapshotIndex--;\n                        if (selectedSnapshotIndex < 0) selectedSnapshotIndex = this.state.snapshots.length - 1;\n                    }\n                    this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n                },\n                onSnapshotClick: ()=>this.snapshotEditor.editSnapshot(),\n                onSnapshotNextClick: ()=>{\n                    let selectedSnapshotIndex;\n                    if (this.state.selectedSnapshotIndex === -1) selectedSnapshotIndex = 0;\n                    else {\n                        selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n                        selectedSnapshotIndex++;\n                        if (selectedSnapshotIndex > this.state.snapshots.length - 1) selectedSnapshotIndex = 0;\n                    }\n                    this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n                },\n                onViewClick: ()=>{\n                    const view = this.state.view === '2d' ? '3d' : '2d';\n                    this.changeInsight({\n                        view: view\n                    }, {\n                        label: view === '2d' ? (0, $d5b6ce321475881f$export$21c51bc433c16634).labelViewType2d : (0, $d5b6ce321475881f$export$21c51bc433c16634).labelViewType3d\n                    });\n                }\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: (0, $e295d8097c1ad61a$exports).classList('sanddance-main', this.state.sidebarPinned && 'pinned', this.state.sidebarClosed && 'closed', (insight.hideLegend || insight.directColor || !(0, $cdd6162a40e9c08a$export$3351a8d90bcc13aa)(insight, this.state.dataContent && this.state.dataContent.columns)) && 'hide-legend')\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div && !this.layoutDivUnpinned) this.layoutDivUnpinned = div;\n                },\n                className: \"sanddance-layout-unpinned\"\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div && !this.layoutDivPinned) this.layoutDivPinned = div;\n                },\n                className: \"sanddance-layout-pinned\"\n            }), !loaded && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"loading\"\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Spinner, {\n                size: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.SpinnerSize.large,\n                label: (0, $d5b6ce321475881f$export$21c51bc433c16634).loading\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a4defabaac4a9afe$export$1ba59dacbcbf90fe), {\n                themePalette: themePalette,\n                calculating: !!this.state.calculating,\n                closed: this.state.sidebarClosed,\n                hideSidebarControls: this.props.hideSidebarControls,\n                snapshotsHidden: (_c = this.props.snapshotProps) === null || _c === void 0 ? void 0 : _c.hidden,\n                pinned: this.state.sidebarPinned,\n                disabled: !loaded,\n                dataScopeProps: {\n                    themePalette: themePalette,\n                    compact: this.state.sidebarClosed,\n                    onCompactClick: ()=>{\n                        this.changeInsight({\n                            size: this.getLayoutDivSize(this.state.sidebarPinned, false)\n                        }, {\n                            label: null,\n                            omit: true\n                        }, {\n                            sidebarClosed: false\n                        });\n                    },\n                    dataSet: this.props.datasetElement,\n                    dataCount: loaded && {\n                        all: this.state.dataContent && this.state.dataContent.data.length,\n                        filtered: this.state.filteredData && this.state.filteredData.length,\n                        selected: selectionState && selectionState.selectedData && selectionState.selectedData.length\n                    },\n                    active: this.state.sideTabId === (0, $2752fa503c160704$export$f3b7566ffe363e3b).Data,\n                    onDataScopeClick: (dataScopeId)=>this.setSideTabId((0, $2752fa503c160704$export$f3b7566ffe363e3b).Data, dataScopeId),\n                    selectedDataScope: this.state.dataScopeId,\n                    disabled: !loaded\n                },\n                onSideTabClick: (sideTabId)=>{\n                    //collapse or toggle\n                    if (sideTabId === (0, $2752fa503c160704$export$f3b7566ffe363e3b).Collapse || this.state.sideTabId === sideTabId) {\n                        let { dataScopeId: dataScopeId, sidebarClosed: sidebarClosed } = this.state;\n                        if (sidebarClosed && sideTabId === (0, $2752fa503c160704$export$f3b7566ffe363e3b).Data) dataScopeId = this.getBestDataScopeId();\n                        sidebarClosed = !this.state.sidebarClosed;\n                        this.changeInsight({\n                            size: this.getLayoutDivSize(this.state.sidebarPinned, sidebarClosed)\n                        }, {\n                            label: null,\n                            omit: true\n                        }, {\n                            dataScopeId: dataScopeId,\n                            sidebarClosed: sidebarClosed\n                        });\n                    } else if (sideTabId === (0, $2752fa503c160704$export$f3b7566ffe363e3b).Pin) this.changeInsight({\n                        size: this.getLayoutDivSize(!this.state.sidebarPinned, this.state.sidebarClosed)\n                    }, {\n                        label: null,\n                        omit: true\n                    }, {\n                        sidebarPinned: !this.state.sidebarPinned\n                    });\n                    else this.setSideTabId(sideTabId);\n                },\n                selectedSideTab: this.state.sideTabId\n            }, loaded && (()=>{\n                switch(this.state.sideTabId){\n                    case (0, $2752fa503c160704$export$f3b7566ffe363e3b).ChartType:\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $b4b5d5b480eaf9ae$export$acaa6426d77a227e), Object.assign({\n                            themePalette: themePalette,\n                            collapseLabels: this.props.compactUI,\n                            tooltipExclusions: this.state.tooltipExclusions,\n                            toggleTooltipExclusion: (columnName)=>{\n                                const tooltipExclusions = [\n                                    ...this.state.tooltipExclusions\n                                ];\n                                const i = tooltipExclusions.indexOf(columnName);\n                                if (i < 0) tooltipExclusions.push(columnName);\n                                else tooltipExclusions.splice(i, 1);\n                                this.setState({\n                                    tooltipExclusions: tooltipExclusions\n                                });\n                                this.props.onTooltipExclusionsChanged && this.props.onTooltipExclusionsChanged(tooltipExclusions);\n                            },\n                            disabled: !loaded || this.state.sidebarClosed\n                        }, columnMapProps, {\n                            chart: this.state.chart,\n                            view: this.state.view,\n                            insightColumns: this.state.columns,\n                            onChangeSignal: (role, column, name, value)=>(0, $d5291de605e66403$export$c2992dc6411becf6)(this.prefs, this.state.chart, role, column, name, value)\n                        }));\n                    case (0, $2752fa503c160704$export$f3b7566ffe363e3b).Color:\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $2cfe18e9e3d5fffb$export$892596cec99bc70e), Object.assign({\n                            compactUI: this.props.compactUI,\n                            specCapabilities: this.state.specCapabilities,\n                            disabled: !loaded || this.state.sidebarClosed\n                        }, columnMapProps, {\n                            dataContent: this.state.dataContent,\n                            scheme: this.state.scheme,\n                            colorBin: this.state.colorBin,\n                            colorBinSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s)=>s.name === (0, $1342cf7df79546f0$exports).constants.SignalNames.ColorBinCount)[0],\n                            colorReverseSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s)=>s.name === (0, $1342cf7df79546f0$exports).constants.SignalNames.ColorReverse)[0],\n                            colorColumn: this.state.columns.color,\n                            onColorBinChange: (colorBin)=>{\n                                this.ignoreSelectionChange = true;\n                                this.viewer.deselect().then(()=>{\n                                    this.ignoreSelectionChange = false;\n                                    //allow deselection to render\n                                    requestAnimationFrame(()=>{\n                                        this.getColorContext = null;\n                                        this.changeInsight({\n                                            colorBin: colorBin\n                                        }, {\n                                            label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryColorBin\n                                        });\n                                        (0, $d5291de605e66403$export$a14483004c11686f)(this.prefs, this.state.chart, 'color', this.state.columns.color, {\n                                            colorBin: colorBin\n                                        });\n                                    });\n                                });\n                            },\n                            onColorSchemeChange: (scheme)=>{\n                                this.changeColumnMapping('color', this.state.dataContent.columns.filter((c)=>c.name === this.state.columns.color)[0], {\n                                    scheme: scheme\n                                });\n                                (0, $d5291de605e66403$export$a14483004c11686f)(this.prefs, this.state.chart, 'color', this.state.columns.color, {\n                                    scheme: scheme\n                                });\n                            },\n                            onColorBinCountChange: (value)=>{\n                                const signalValues = {};\n                                signalValues[(0, $1342cf7df79546f0$exports).constants.SignalNames.ColorBinCount] = value;\n                                (0, $d5291de605e66403$export$a14483004c11686f)(this.prefs, this.state.chart, 'color', this.state.columns.color, {\n                                    signalValues: signalValues\n                                });\n                            },\n                            onColorReverseChange: (value)=>{\n                                this.getColorContext = null;\n                            },\n                            directColor: this.state.directColor,\n                            onDirectColorChange: (directColor)=>{\n                                this.changeInsight({\n                                    directColor: directColor\n                                }, {\n                                    label: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelHistoryDirectColor\n                                }, {\n                                    calculating: ()=>this._resize()\n                                });\n                            }\n                        }));\n                    case (0, $2752fa503c160704$export$f3b7566ffe363e3b).Data:\n                        {\n                            const data = datas[this.state.dataScopeId];\n                            let itemVisible = true;\n                            switch(this.state.dataScopeId){\n                                case (0, $86b892255d8eb4f0$export$f0297ce57faf7d71).AllData:\n                                    {\n                                        const item = this.state.selectedItemIndex[this.state.dataScopeId];\n                                        itemVisible = this.state.dataContent && !this.state.filteredData || this.state.filteredData.indexOf(data[item]) >= 0;\n                                    }\n                            }\n                            return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $9ca0c376beb8c2ec$export$1ce2294f62fa7154), {\n                                explorer: this,\n                                theme: this.props.theme,\n                                themePalette: themePalette,\n                                disabled: !loaded || this.state.sidebarClosed,\n                                columns: this.state.dataContent && this.state.dataContent.columns,\n                                categoricalColumns: columnMapProps.categoricalColumns,\n                                quantitativeColumns: columnMapProps.quantitativeColumns,\n                                data: data,\n                                displayName: this.state.dataFile && this.state.dataFile.displayName || (0, $d5b6ce321475881f$export$21c51bc433c16634).defaultFileName,\n                                nullMessage: (0, $9ca0c376beb8c2ec$export$79bd5e38ba2a6de0)[this.state.dataScopeId],\n                                zeroMessage: (0, $9ca0c376beb8c2ec$export$bbe9fd33806c217d)[this.state.dataScopeId],\n                                index: this.state.selectedItemIndex[this.state.dataScopeId],\n                                itemVisible: itemVisible,\n                                dataExportHandler: this.props.dataExportHandler,\n                                selectedDataScope: this.state.dataScopeId,\n                                onDataScopeClick: (dataScopeId)=>this.setSideTabId((0, $2752fa503c160704$export$f3b7566ffe363e3b).Data, dataScopeId),\n                                onActivate: (row, index)=>{\n                                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                                    selectedItemIndex[this.state.dataScopeId] = index;\n                                    this.setState({\n                                        selectedItemIndex: selectedItemIndex\n                                    });\n                                    this.silentActivation(row);\n                                },\n                                onSearch: (e, search)=>{\n                                    if (e.ctrlKey) this.setState({\n                                        sideTabId: (0, $2752fa503c160704$export$f3b7566ffe363e3b).Search,\n                                        search: search\n                                    });\n                                    else this.doSelect(search);\n                                },\n                                bingSearchDisabled: this.props.bingSearchDisabled,\n                                onUpdateColumnTypes: (columnTypes)=>{\n                                    this.load(this.state.dataFile, null, {\n                                        prefs: this.prefs,\n                                        columnTypes: columnTypes\n                                    });\n                                }\n                            });\n                        }\n                    case (0, $2752fa503c160704$export$f3b7566ffe363e3b).Search:\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $7c89aab16f679c36$export$4b85d3515bd863a5), {\n                            explorer: this,\n                            collapseLabels: this.props.compactUI,\n                            themePalette: themePalette,\n                            disabled: !loaded || this.state.sidebarClosed,\n                            disableGroupOR: this.props.searchORDisabled,\n                            disableExpressionOR: this.props.searchORDisabled,\n                            initializer: {\n                                columns: columnMapProps.allColumns,\n                                search: this.state.search\n                            },\n                            autoCompleteDistinctValues: this.state.autoCompleteDistinctValues,\n                            onSelect: (expr)=>this.doSelect(expr),\n                            data: this.state.dataContent.data\n                        });\n                    case (0, $2752fa503c160704$export$f3b7566ffe363e3b).Snapshots:\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $ce6d2e0261fc46dc$export$3e09886744a57615), Object.assign({}, this.props.snapshotProps, {\n                            editor: this.snapshotEditor,\n                            themePalette: themePalette,\n                            explorer: this,\n                            snapshots: this.state.snapshots,\n                            selectedSnapshotIndex: this.state.selectedSnapshotIndex,\n                            onClearSnapshots: ()=>{\n                                const snapshots = [];\n                                this.setState({\n                                    snapshots: snapshots,\n                                    selectedSnapshotIndex: -1\n                                });\n                                this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                            },\n                            onWriteSnapshot: (s, i)=>this.writeSnapshot(s, i),\n                            onRemoveSnapshot: (i)=>{\n                                const snapshots = [\n                                    ...this.state.snapshots\n                                ];\n                                snapshots.splice(i, 1);\n                                let { selectedSnapshotIndex: selectedSnapshotIndex } = this.state;\n                                if (i === selectedSnapshotIndex) selectedSnapshotIndex = -1;\n                                else if (selectedSnapshotIndex > i) selectedSnapshotIndex--;\n                                this.setState({\n                                    snapshots: snapshots,\n                                    selectedSnapshotIndex: selectedSnapshotIndex\n                                });\n                                this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                            },\n                            onSnapshotClick: (snapshot, selectedSnapshotIndex)=>{\n                                this.setState({\n                                    selectedSnapshotIndex: selectedSnapshotIndex\n                                });\n                                this.calculate(()=>{\n                                    this.handleReviveSnapshot(snapshot, selectedSnapshotIndex);\n                                });\n                            },\n                            onMoveUp: (i)=>{\n                                if (i > 0) {\n                                    const snapshots = [\n                                        ...this.state.snapshots\n                                    ];\n                                    const temp = snapshots[i - 1];\n                                    snapshots[i - 1] = snapshots[i];\n                                    snapshots[i] = temp;\n                                    let { selectedSnapshotIndex: selectedSnapshotIndex } = this.state;\n                                    if (i === selectedSnapshotIndex) selectedSnapshotIndex = i - 1;\n                                    else if (i - 1 === selectedSnapshotIndex) selectedSnapshotIndex = i;\n                                    this.setState({\n                                        snapshots: snapshots,\n                                        selectedSnapshotIndex: selectedSnapshotIndex\n                                    });\n                                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                }\n                            },\n                            onMoveDown: (i)=>{\n                                if (i < this.state.snapshots.length - 1) {\n                                    const snapshots = [\n                                        ...this.state.snapshots\n                                    ];\n                                    const temp = snapshots[i + 1];\n                                    snapshots[i + 1] = snapshots[i];\n                                    snapshots[i] = temp;\n                                    let { selectedSnapshotIndex: selectedSnapshotIndex } = this.state;\n                                    if (i === selectedSnapshotIndex) selectedSnapshotIndex = i + 1;\n                                    else if (i + 1 === selectedSnapshotIndex) selectedSnapshotIndex = i;\n                                    this.setState({\n                                        snapshots: snapshots,\n                                        selectedSnapshotIndex: selectedSnapshotIndex\n                                    });\n                                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                }\n                            }\n                        }));\n                    case (0, $2752fa503c160704$export$f3b7566ffe363e3b).History:\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $1451439fef5c6aa0$export$84202caead5689ba), {\n                            explorer: this,\n                            themePalette: themePalette,\n                            historyIndex: this.state.historyIndex,\n                            historyItems: this.state.historyItems,\n                            redo: (i)=>this.redo(i)\n                        });\n                    case (0, $2752fa503c160704$export$f3b7566ffe363e3b).Transition:\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $7169c11dc639bbc5$export$df231814b4232ebd), Object.assign({}, columnMapProps, this.state, {\n                            compactUI: this.props.compactUI,\n                            explorer: this,\n                            themePalette: themePalette,\n                            changeSetup: (newState, affectsStagger)=>{\n                                const calculating = ()=>{\n                                    if (affectsStagger) this.viewer.assignTransitionStagger((0, $7169c11dc639bbc5$export$d5639c01d489b0c)(this.state));\n                                    this.props.onSetupOptionsChanged && this.props.onSetupOptionsChanged(this.getSetup());\n                                };\n                                if (newState) this.setState(Object.assign(Object.assign({}, newState), {\n                                    calculating: calculating\n                                }));\n                                else calculating();\n                            }\n                        }));\n                    case (0, $2752fa503c160704$export$f3b7566ffe363e3b).Settings:\n                        return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $e46ab1f70cbc9878$export$c72f6eaae7b9adff), {\n                            explorer: this,\n                            dataFile: this.state.dataFile,\n                            scheme: this.state.scheme,\n                            hideLegend: this.state.hideLegend,\n                            onToggleLegend: (hideLegend)=>this.setState({\n                                    hideLegend: hideLegend,\n                                    calculating: ()=>this._resize()\n                                }),\n                            hideAxes: this.state.hideAxes,\n                            onToggleAxes: (hideAxes)=>this.setState({\n                                    calculating: ()=>this.setState({\n                                            hideAxes: hideAxes\n                                        })\n                                }),\n                            additionalSettings: this.props.additionalSettings\n                        }, this.props.systemInfoChildren);\n                }\n            })()), loaded && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: \"sanddance-view\"\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $7a3dcfea67f8da12$export$2ec4afd9b3c16a85), {\n                renderOptions: renderOptions,\n                viewerOptions: this.viewerOptions,\n                ref: (reactViewer)=>{\n                    if (reactViewer) this.viewer = reactViewer.viewer;\n                },\n                onView: (renderResult)=>{\n                    this.rebaseFilter = false;\n                    this.changespecCapabilities(renderResult.specResult.errors ? renderResult.specResult.specCapabilities : this.viewer.specCapabilities);\n                    this.getColorContext = (oldInsight, newInsight)=>{\n                        if (!oldInsight && !newInsight) return null;\n                        if (!oldInsight || !newInsight) return null;\n                        if (oldInsight.scheme !== newInsight.scheme) return null;\n                        if (oldInsight.columns.color !== newInsight.columns.color) return null;\n                        if (oldInsight.directColor != newInsight.directColor) return null;\n                        return this.viewer.colorContexts && this.viewer.colorContexts[this.viewer.currentColorContext];\n                    };\n                    //don't allow tabbing to the canvas\n                    (0, $4293b5c02e7b8c3d$export$95ea862e038e2d34)(this.viewer);\n                    this.props.onView && this.props.onView();\n                },\n                onError: (e)=>{\n                    this.props.onError && this.props.onError(e);\n                },\n                data: this.state.dataContent.data,\n                insight: insight,\n                setup: this.getSetup(),\n                onMount: (el)=>this.viewerMounted(el)\n            }), this.state.note && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                className: 'sanddance-note'\n            }, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $baf9c68afdd76912$export$c25acd513dcc8062), {\n                className: 'cancel',\n                themePalette: themePalette,\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonClose,\n                iconName: 'Cancel',\n                onClick: ()=>this.setState({\n                        note: null\n                    })\n            }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", null, this.state.note)), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $24a2c07dd03771c2$export$88530751e3977073), {\n                explorer: this,\n                advanced: this.state.renderer.advanced,\n                advancedOptions: this.state.renderer.advancedOptions,\n                basicOptions: this.state.renderer.basicOptions,\n                themePalette: themePalette,\n                onHomeClick: ()=>{\n                    this.setState({\n                        camera: undefined\n                    });\n                    this.viewer.presenter.homeCamera();\n                }\n            })), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f4b615ab5c14d90e$export$3ddf2d174ce01153), {\n                title: (0, $d5b6ce321475881f$export$21c51bc433c16634).labelError,\n                hidden: !this.state.errors,\n                onDismiss: ()=>{\n                    this.setState({\n                        errors: null\n                    });\n                }\n            }, this.state.errors && this.state.errors.map((error, i)=>(0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n                    key: i\n                }, error))), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $e07b04fee87ea13f$export$15b376344cc89d12), Object.assign({\n                ref: (se)=>this.snapshotEditor = se\n            }, this.props.snapshotProps, {\n                explorer: this,\n                onWriteSnapshot: (s, i)=>this.writeSnapshot(s, i),\n                theme: this.props.theme,\n                themePalette: themePalette\n            }))), this.state.positionedColumnMapProps && (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $f47e4461409e9b5c$export$3e341bd56774d659), Object.assign({}, this.state.positionedColumnMapProps)));\n        }\n        getColumnMapBaseProps() {\n            const allColumns = this.state.dataContent && this.state.dataContent.columns.filter((c)=>!(0, $1342cf7df79546f0$exports).util.isInternalFieldName(c.name, true));\n            const quantitativeColumns = allColumns && allColumns.filter((c)=>c.quantitative);\n            const categoricalColumns = allColumns && allColumns.filter((c)=>!c.quantitative);\n            const props = {\n                changeColumnMapping: (role, columnOrRole, defaultColumn, options)=>{\n                    let column;\n                    if (typeof columnOrRole === 'string') {\n                        //look up current insight\n                        const columnName = this.state.columns[columnOrRole];\n                        column = allColumns.filter((c)=>c.name === columnName)[0] || defaultColumn;\n                    } else column = columnOrRole;\n                    this.changeColumnMapping(role, column, options);\n                },\n                facetStyle: this.state.facetStyle,\n                totalStyle: this.state.totalStyle,\n                allColumns: allColumns,\n                quantitativeColumns: quantitativeColumns,\n                categoricalColumns: categoricalColumns,\n                specCapabilities: this.state.specCapabilities,\n                explorer: this\n            };\n            return props;\n        }\n    }\n    return new __Explorer(_props);\n}\nconst $688b2ed8e5aa6452$export$43584986cb77a794 = $688b2ed8e5aa6452$var$_Explorer;\n\n\n\n\nconst $a601a4135959dcb0$export$e2253033e6e1df16 = {\n    fluentUI: null,\n    react: null,\n    reactDOM: null\n};\nfunction $a601a4135959dcb0$export$1f96ae73734a86cc(fluentUI, react, reactDOM, vega) {\n    (0, $a94804e25c3acfaf$export$1f96ae73734a86cc)(react, reactDOM, vega);\n    $a601a4135959dcb0$export$e2253033e6e1df16.fluentUI = fluentUI;\n    $a601a4135959dcb0$export$e2253033e6e1df16.react = react;\n    $a601a4135959dcb0$export$e2253033e6e1df16.reactDOM = reactDOM;\n    //inform React that we are using a dynamic base class\n    (0, $15c8a952544b8f28$export$5696019163aa3cca).prototype = react.Component.prototype;\n    (0, $b4b5d5b480eaf9ae$export$acaa6426d77a227e).prototype = react.Component.prototype;\n    (0, $0edfbb46d4822ac6$export$12df67f310f5f846).prototype = react.Component.prototype;\n    (0, $cff73bb5fafa0795$export$b1b568728c48eba1).prototype = react.Component.prototype;\n    (0, $688b2ed8e5aa6452$export$43584986cb77a794).prototype = react.Component.prototype;\n    (0, $f47e4461409e9b5c$export$3e341bd56774d659).prototype = react.Component.prototype;\n    (0, $24a2c07dd03771c2$export$88530751e3977073).prototype = react.Component.prototype;\n    (0, $7c89aab16f679c36$export$4b85d3515bd863a5).prototype = react.Component.prototype;\n    (0, $e07b04fee87ea13f$export$15b376344cc89d12).prototype = react.Component.prototype;\n    (0, $ce6d2e0261fc46dc$export$3e09886744a57615).prototype = react.Component.prototype;\n    (0, $e46ab1f70cbc9878$export$c72f6eaae7b9adff).prototype = react.Component.prototype;\n    (0, $7169c11dc639bbc5$export$df231814b4232ebd).prototype = react.Component.prototype;\n}\n\n\n\nfunction $f4b615ab5c14d90e$export$3ddf2d174ce01153(props) {\n    return (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.Dialog, Object.assign({}, props, {\n        dialogContentProps: Object.assign({\n            type: (0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DialogType.normal,\n            title: props.title\n        }, props.dialogContentProps)\n    }), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement(\"div\", {\n        onKeyUp: (e)=>{\n            e.nativeEvent.stopImmediatePropagation();\n        }\n    }, props.children), (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DialogFooter, null, props.buttons, (0, $a601a4135959dcb0$export$e2253033e6e1df16).react.createElement((0, $a601a4135959dcb0$export$e2253033e6e1df16).fluentUI.DefaultButton, {\n        iconProps: {\n            iconName: 'Cancel'\n        },\n        onClick: props.onDismiss,\n        text: (0, $d5b6ce321475881f$export$21c51bc433c16634).buttonClose\n    })));\n}\n\n\n$parcel$exportWildcard($5d1e60eb15fea085$exports, $f4b615ab5c14d90e$exports);\n\n\n\n\n\n\n\n\n\n\n$parcel$exportWildcard($fa693121602b4446$exports, $688b2ed8e5aa6452$exports);\n\n\nwindow.SandDanceExplorer = $fa693121602b4446$exports;\n\n})();\n"
  },
  {
    "path": "docs/dist/sanddance-react/v4/sanddance-react.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@msrvida/sanddance')) :\n  typeof define === 'function' && define.amd ? define(['exports', '@msrvida/sanddance'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.SandDanceReact = {}, global.SandDance));\n})(this, (function (exports, SandDance) { 'use strict';\n\n  function _interopNamespaceDefault(e) {\n    var n = Object.create(null);\n    if (e) {\n      Object.keys(e).forEach(function (k) {\n        if (k !== 'default') {\n          var d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: function () { return e[k]; }\n          });\n        }\n      });\n    }\n    n.default = e;\n    return Object.freeze(n);\n  }\n\n  var SandDance__namespace = /*#__PURE__*/_interopNamespaceDefault(SandDance);\n\n  var collectionCompare = compare;\n\n  /*\n    primitives: value1 === value2\n    functions: value1.toString == value2.toString\n    arrays: if length, sequence and values of properties are identical\n    objects: if length, names and values of properties are identical\n    compare([[1, [2, 3]], [[1, [2, 3]]); // true\n    compare([[1, [2, 3], 4], [[1, [2, 3]]); // false\n    compare({a: 2, b: 3}, {a: 2, b: 3}); // true\n    compare({a: 2, b: 3}, {b: 3, a: 2}); // true\n    compare({a: 2, b: 3, c: 4}, {a: 2, b: 3}); // false\n    compare({a: 2, b: 3}, {a: 2, b: 3, c: 4}); // false\n    compare([[1, [2, {a: 4}], 4], [[1, [2, {a: 4}]]); // true\n  */\n\n  function compare(value1, value2) {\n    if (value1 === value2) {\n      return true;\n    }\n    /* eslint-disable no-self-compare */\n    // if both values are NaNs return true\n    if (value1 !== value1 && value2 !== value2) {\n      return true;\n    }\n    if ({}.toString.call(value1) != {}.toString.call(value2)) {\n      return false;\n    }\n    if (value1 !== Object(value1)) {\n      // non equal primitives\n      return false;\n    }\n    if (!value1) {\n      return false;\n    }\n    if (Array.isArray(value1)) {\n      return compareArrays(value1, value2);\n    }\n    if ({}.toString.call(value1) == '[object Set]') {\n      return compareArrays(Array.from(value1), Array.from(value2));\n    }\n    if ({}.toString.call(value1) == '[object Object]') {\n      return compareObjects(value1, value2);\n    } else {\n      return compareNativeSubtypes(value1, value2);\n    }\n  }\n\n  function compareNativeSubtypes(value1, value2) {\n    // e.g. Function, RegExp, Date\n    return value1.toString() === value2.toString();\n  }\n\n  function compareArrays(value1, value2) {\n    var len = value1.length;\n    if (len != value2.length) {\n      return false;\n    }\n    var alike = true;\n    for (var i = 0; i < len; i++) {\n      if (!compare(value1[i], value2[i])) {\n        alike = false;\n        break;\n      }\n    }\n    return alike;\n  }\n\n  function compareObjects(value1, value2) {\n    var keys1 = Object.keys(value1).sort();\n    var keys2 = Object.keys(value2).sort();\n    var len = keys1.length;\n    if (len != keys2.length) {\n      return false;\n    }\n    for (var i = 0; i < len; i++) {\n      var key1 = keys1[i];\n      var key2 = keys2[i];\n      if (!(key1 == key2 && compare(value1[key1], value2[key2]))) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  var compare$1 = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    default: collectionCompare\n  });\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  const classList = (...args) => {\n      return args.filter(Boolean).join(' ');\n  };\n  const deepCompare = (collectionCompare || compare$1);\n  function addNullable(insight, signalValues) {\n      const withNulls = Object.assign(Object.assign({ view: null, filter: null }, insight), { signalValues });\n      return withNulls;\n  }\n  function compareInsight(viewer, insight) {\n      const currentInsight = viewer.getInsight();\n      const a = addNullable(currentInsight, Object.assign(Object.assign({}, viewer.insight.signalValues), currentInsight.signalValues));\n      const b = addNullable(insight, Object.assign(Object.assign({}, a.signalValues), insight.signalValues));\n      const compare = deepCompare(a, b);\n      return { a, b, compare };\n  }\n\n  var util = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    classList: classList,\n    compareInsight: compareInsight,\n    deepCompare: deepCompare\n  });\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  const base = {\n      react: null,\n      reactDOM: null,\n  };\n  /**\n   * Specify the dependency libraries to use for rendering.\n   * @param react React library.\n   * @param vega Vega library.\n   * @param deck @deck.gl/core library.\n   * @param layers @deck.gl/layers library.\n   * @param luma @luma.gl/core library.\n   */\n  function use(react, reactDOM, vega) {\n      SandDance__namespace.VegaMorphCharts.use(vega);\n      base.react = react;\n      base.reactDOM = reactDOM;\n      //inform React that we are using a dynamic base class\n      Viewer.prototype = react.Component.prototype;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  function _Viewer(_props) {\n      class __Viewer extends base.react.Component {\n          layout() {\n              const { props } = this;\n              this.lastData = props.data;\n              this.viewer.render({\n                  insight: props.insight,\n                  setup: props.setup,\n              }, props.data, props.renderOptions).then(renderResult => {\n                  //TODO: show errors if any\n                  //console.log('viewer render');\n                  props.onView && props.onView(renderResult);\n              }).catch(e => {\n                  //console.log('viewer error');\n                  props.onError && props.onError(e);\n              });\n          }\n          view() {\n              var _a, _b, _c, _d, _e;\n              const { props } = this;\n              let didLayout = false;\n              if (props.insight && props.data) {\n                  const c = compareInsight(this.viewer, props.insight);\n                  const sameDataRef = props.data === this.lastData;\n                  if (!c.compare || !sameDataRef) {\n                      this.layout();\n                      didLayout = true;\n                  }\n              }\n              if (!didLayout && props.setup) {\n                  const { camera } = props.setup;\n                  //compare setup, move camera\n                  if (camera !== 'hold') {\n                      if (!deepCompare(this.viewer.setup.camera, camera)) {\n                          //camera is different\n                          if (!camera) {\n                              (_b = (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.presenter) === null || _b === void 0 ? void 0 : _b.homeCamera();\n                          }\n                          else {\n                              this.viewer.setCamera(camera);\n                          }\n                          //save this for next comparison\n                          const setup = SandDance.VegaMorphCharts.util.clone(this.viewer.setup);\n                          setup.camera = camera;\n                          this.viewer.setup = setup;\n                      }\n                  }\n                  if (props.setup.renderer) {\n                      (_e = (_d = (_c = this.viewer) === null || _c === void 0 ? void 0 : _c.presenter) === null || _d === void 0 ? void 0 : _d.morphchartsref) === null || _e === void 0 ? void 0 : _e.setMorphChartsRendererOptions(props.setup.renderer);\n                  }\n              }\n          }\n          componentDidMount() {\n              const { props } = this;\n              const element = base.reactDOM.findDOMNode(this.viewerDiv);\n              this.viewer = new SandDance.Viewer(element, props.viewerOptions);\n              if (props.onMount) {\n                  if (props.onMount(this.viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl))) {\n                      this.view();\n                  }\n              }\n              else {\n                  this.view();\n              }\n          }\n          componentDidUpdate() {\n              const { props } = this;\n              this.viewer.options = SandDance.VegaMorphCharts.util.deepMerge(this.viewer.options, props.viewerOptions);\n              this.view();\n          }\n          componentWillUnmount() {\n              this.viewer.finalize();\n          }\n          render() {\n              return (base.react.createElement(\"div\", { className: \"sanddance-ReactViewer\", ref: div => (this.viewerDiv = div) }));\n          }\n      }\n      return new __Viewer(_props);\n  }\n  const Viewer = _Viewer;\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  const version = '4.0.2';\n\n  exports.SandDance = SandDance__namespace;\n  exports.Viewer = Viewer;\n  exports.use = use;\n  exports.util = util;\n  exports.version = version;\n\n}));\n"
  },
  {
    "path": "docs/dist/vega-deck.gl/v2/vega-deck.gl.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (factory((global.VegaDeckGl = {})));\n}(this, (function (exports) { 'use strict';\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    const GL_ORDINAL = 'GL_ORDINAL';\n    const layerNames = {\n        cubes: 'LAYER_CUBES',\n        lines: 'LAYER_LINES',\n        text: 'LAYER_TEXT'\n    };\n\n    var constants = /*#__PURE__*/Object.freeze({\n        GL_ORDINAL: GL_ORDINAL,\n        layerNames: layerNames\n    });\n\n    function unwrapExports (x) {\n    \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n    }\n\n    function createCommonjsModule(fn, module) {\n    \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n    }\n\n    var xregexp = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n    /*!\n     * XRegExp 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2007-2017 MIT License\n     */\n\n    /**\n     * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and\n     * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to\n     * make your client-side grepping simpler and more powerful, while freeing you from related\n     * cross-browser inconsistencies.\n     */\n\n    // ==--------------------------==\n    // Private stuff\n    // ==--------------------------==\n\n    // Property name used for extended regex instance data\n    var REGEX_DATA = 'xregexp';\n    // Optional features that can be installed and uninstalled\n    var features = {\n        astral: false\n    };\n    // Native methods to use and restore ('native' is an ES3 reserved keyword)\n    var nativ = {\n        exec: RegExp.prototype.exec,\n        test: RegExp.prototype.test,\n        match: String.prototype.match,\n        replace: String.prototype.replace,\n        split: String.prototype.split\n    };\n    // Storage for fixed/extended native methods\n    var fixed = {};\n    // Storage for regexes cached by `XRegExp.cache`\n    var regexCache = {};\n    // Storage for pattern details cached by the `XRegExp` constructor\n    var patternCache = {};\n    // Storage for regex syntax tokens added internally or by `XRegExp.addToken`\n    var tokens = [];\n    // Token scopes\n    var defaultScope = 'default';\n    var classScope = 'class';\n    // Regexes that match native regex syntax, including octals\n    var nativeTokens = {\n        // Any native multicharacter token in default scope, or any single character\n        'default': /\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|\\(\\?(?:[:=!]|<[=!])|[?*+]\\?|{\\d+(?:,\\d*)?}\\??|[\\s\\S]/,\n        // Any native multicharacter token in character class scope, or any single character\n        'class': /\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|[\\s\\S]/\n    };\n    // Any backreference or dollar-prefixed character in replacement strings\n    var replacementToken = /\\$(?:{([\\w$]+)}|<([\\w$]+)>|(\\d\\d?|[\\s\\S]))/g;\n    // Check for correct `exec` handling of nonparticipating capturing groups\n    var correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined;\n    // Check for ES6 `flags` prop support\n    var hasFlagsProp = /x/.flags !== undefined;\n    // Shortcut to `Object.prototype.toString`\n    var toString = {}.toString;\n\n    function hasNativeFlag(flag) {\n        // Can't check based on the presence of properties/getters since browsers might support such\n        // properties even when they don't support the corresponding flag in regex construction (tested\n        // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`\n        // throws an error)\n        var isSupported = true;\n        try {\n        } catch (exception) {\n            isSupported = false;\n        }\n        return isSupported;\n    }\n    // Check for ES6 `u` flag support\n    var hasNativeU = hasNativeFlag('u');\n    // Check for ES6 `y` flag support\n    var hasNativeY = hasNativeFlag('y');\n    // Tracker for known flags, including addon flags\n    var registeredFlags = {\n        g: true,\n        i: true,\n        m: true,\n        u: hasNativeU,\n        y: hasNativeY\n    };\n\n    /**\n     * Attaches extended data and `XRegExp.prototype` properties to a regex object.\n     *\n     * @private\n     * @param {RegExp} regex Regex to augment.\n     * @param {Array} captureNames Array with capture names, or `null`.\n     * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.\n     * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.\n     * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal\n     *   operations, and never exposed to users. For internal-only regexes, we can improve perf by\n     *   skipping some operations like attaching `XRegExp.prototype` properties.\n     * @returns {RegExp} Augmented regex.\n     */\n    function augment(regex, captureNames, xSource, xFlags, isInternalOnly) {\n        var p = void 0;\n\n        regex[REGEX_DATA] = {\n            captureNames: captureNames\n        };\n\n        if (isInternalOnly) {\n            return regex;\n        }\n\n        // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value\n        if (regex.__proto__) {\n            regex.__proto__ = XRegExp.prototype;\n        } else {\n            for (p in XRegExp.prototype) {\n                // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this\n                // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`\n                // extensions exist on `regex.prototype` anyway\n                regex[p] = XRegExp.prototype[p];\n            }\n        }\n\n        regex[REGEX_DATA].source = xSource;\n        // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order\n        regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;\n\n        return regex;\n    }\n\n    /**\n     * Removes any duplicate characters from the provided string.\n     *\n     * @private\n     * @param {String} str String to remove duplicate characters from.\n     * @returns {String} String with any duplicate characters removed.\n     */\n    function clipDuplicates(str) {\n        return nativ.replace.call(str, /([\\s\\S])(?=[\\s\\S]*\\1)/g, '');\n    }\n\n    /**\n     * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`\n     * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing\n     * flags g and y while copying the regex.\n     *\n     * @private\n     * @param {RegExp} regex Regex to copy.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `addG` {Boolean} Add flag g while copying the regex.\n     *   - `addY` {Boolean} Add flag y while copying the regex.\n     *   - `removeG` {Boolean} Remove flag g while copying the regex.\n     *   - `removeY` {Boolean} Remove flag y while copying the regex.\n     *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal\n     *     operations, and never exposed to users. For internal-only regexes, we can improve perf by\n     *     skipping some operations like attaching `XRegExp.prototype` properties.\n     *   - `source` {String} Overrides `<regex>.source`, for special cases.\n     * @returns {RegExp} Copy of the provided regex, possibly with modified flags.\n     */\n    function copyRegex(regex, options) {\n        if (!XRegExp.isRegExp(regex)) {\n            throw new TypeError('Type RegExp expected');\n        }\n\n        var xData = regex[REGEX_DATA] || {};\n        var flags = getNativeFlags(regex);\n        var flagsToAdd = '';\n        var flagsToRemove = '';\n        var xregexpSource = null;\n        var xregexpFlags = null;\n\n        options = options || {};\n\n        if (options.removeG) {\n            flagsToRemove += 'g';\n        }\n        if (options.removeY) {\n            flagsToRemove += 'y';\n        }\n        if (flagsToRemove) {\n            flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), '');\n        }\n\n        if (options.addG) {\n            flagsToAdd += 'g';\n        }\n        if (options.addY) {\n            flagsToAdd += 'y';\n        }\n        if (flagsToAdd) {\n            flags = clipDuplicates(flags + flagsToAdd);\n        }\n\n        if (!options.isInternalOnly) {\n            if (xData.source !== undefined) {\n                xregexpSource = xData.source;\n            }\n            // null or undefined; don't want to add to `flags` if the previous value was null, since\n            // that indicates we're not tracking original precompilation flags\n            if (xData.flags != null) {\n                // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never\n                // removed for non-internal regexes, so don't need to handle it\n                xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;\n            }\n        }\n\n        // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid\n        // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and\n        // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the\n        // translation to native regex syntax\n        regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);\n\n        return regex;\n    }\n\n    /**\n     * Converts hexadecimal to decimal.\n     *\n     * @private\n     * @param {String} hex\n     * @returns {Number}\n     */\n    function dec(hex) {\n        return parseInt(hex, 16);\n    }\n\n    /**\n     * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an\n     * inline comment or whitespace with flag x. This is used directly as a token handler function\n     * passed to `XRegExp.addToken`.\n     *\n     * @private\n     * @param {String} match Match arg of `XRegExp.addToken` handler\n     * @param {String} scope Scope arg of `XRegExp.addToken` handler\n     * @param {String} flags Flags arg of `XRegExp.addToken` handler\n     * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.\n     */\n    function getContextualTokenSeparator(match, scope, flags) {\n        if (\n        // No need to separate tokens if at the beginning or end of a group\n        match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' ||\n        // Avoid separating tokens when the following token is a quantifier\n        isQuantifierNext(match.input, match.index + match[0].length, flags)) {\n            return '';\n        }\n        // Keep tokens separated. This avoids e.g. inadvertedly changing `\\1 1` or `\\1(?#)1` to `\\11`.\n        // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax\n        // error `(? :` into `(?:`.\n        return '(?:)';\n    }\n\n    /**\n     * Returns native `RegExp` flags used by a regex object.\n     *\n     * @private\n     * @param {RegExp} regex Regex to check.\n     * @returns {String} Native flags in use.\n     */\n    function getNativeFlags(regex) {\n        return hasFlagsProp ? regex.flags :\n        // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation\n        // with an empty string) allows this to continue working predictably when\n        // `XRegExp.proptotype.toString` is overridden\n        nativ.exec.call(/\\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];\n    }\n\n    /**\n     * Determines whether a regex has extended instance data used to track capture names.\n     *\n     * @private\n     * @param {RegExp} regex Regex to check.\n     * @returns {Boolean} Whether the regex uses named capture.\n     */\n    function hasNamedCapture(regex) {\n        return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);\n    }\n\n    /**\n     * Converts decimal to hexadecimal.\n     *\n     * @private\n     * @param {Number|String} dec\n     * @returns {String}\n     */\n    function hex(dec) {\n        return parseInt(dec, 10).toString(16);\n    }\n\n    /**\n     * Checks whether the next nonignorable token after the specified position is a quantifier.\n     *\n     * @private\n     * @param {String} pattern Pattern to search within.\n     * @param {Number} pos Index in `pattern` to search at.\n     * @param {String} flags Flags used by the pattern.\n     * @returns {Boolean} Whether the next nonignorable token is a quantifier.\n     */\n    function isQuantifierNext(pattern, pos, flags) {\n        return nativ.test.call(flags.indexOf('x') !== -1 ?\n        // Ignore any leading whitespace, line comments, and inline comments\n        /^(?:\\s|#[^#\\n]*|\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/ :\n        // Ignore any leading inline comments\n        /^(?:\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/, pattern.slice(pos));\n    }\n\n    /**\n     * Determines whether a value is of the specified type, by resolving its internal [[Class]].\n     *\n     * @private\n     * @param {*} value Object to check.\n     * @param {String} type Type to check for, in TitleCase.\n     * @returns {Boolean} Whether the object matches the type.\n     */\n    function isType(value, type) {\n        return toString.call(value) === '[object ' + type + ']';\n    }\n\n    /**\n     * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.\n     *\n     * @private\n     * @param {String} str\n     * @returns {String}\n     */\n    function pad4(str) {\n        while (str.length < 4) {\n            str = '0' + str;\n        }\n        return str;\n    }\n\n    /**\n     * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads\n     * the flag preparation logic from the `XRegExp` constructor.\n     *\n     * @private\n     * @param {String} pattern Regex pattern, possibly with a leading mode modifier.\n     * @param {String} flags Any combination of flags.\n     * @returns {Object} Object with properties `pattern` and `flags`.\n     */\n    function prepareFlags(pattern, flags) {\n        var i = void 0;\n\n        // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags\n        if (clipDuplicates(flags) !== flags) {\n            throw new SyntaxError('Invalid duplicate regex flag ' + flags);\n        }\n\n        // Strip and apply a leading mode modifier with any combination of flags except g or y\n        pattern = nativ.replace.call(pattern, /^\\(\\?([\\w$]+)\\)/, function ($0, $1) {\n            if (nativ.test.call(/[gy]/, $1)) {\n                throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0);\n            }\n            // Allow duplicate flags within the mode modifier\n            flags = clipDuplicates(flags + $1);\n            return '';\n        });\n\n        // Throw on unknown native or nonnative flags\n        for (i = 0; i < flags.length; ++i) {\n            if (!registeredFlags[flags[i]]) {\n                throw new SyntaxError('Unknown regex flag ' + flags[i]);\n            }\n        }\n\n        return {\n            pattern: pattern,\n            flags: flags\n        };\n    }\n\n    /**\n     * Prepares an options object from the given value.\n     *\n     * @private\n     * @param {String|Object} value Value to convert to an options object.\n     * @returns {Object} Options object.\n     */\n    function prepareOptions(value) {\n        var options = {};\n\n        if (isType(value, 'String')) {\n            XRegExp.forEach(value, /[^\\s,]+/, function (match) {\n                options[match] = true;\n            });\n\n            return options;\n        }\n\n        return value;\n    }\n\n    /**\n     * Registers a flag so it doesn't throw an 'unknown flag' error.\n     *\n     * @private\n     * @param {String} flag Single-character flag to register.\n     */\n    function registerFlag(flag) {\n        if (!/^[\\w$]$/.test(flag)) {\n            throw new Error('Flag must be a single character A-Za-z0-9_$');\n        }\n\n        registeredFlags[flag] = true;\n    }\n\n    /**\n     * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified\n     * position, until a match is found.\n     *\n     * @private\n     * @param {String} pattern Original pattern from which an XRegExp object is being built.\n     * @param {String} flags Flags being used to construct the regex.\n     * @param {Number} pos Position to search for tokens within `pattern`.\n     * @param {Number} scope Regex scope to apply: 'default' or 'class'.\n     * @param {Object} context Context object to use for token handler functions.\n     * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.\n     */\n    function runTokens(pattern, flags, pos, scope, context) {\n        var i = tokens.length;\n        var leadChar = pattern[pos];\n        var result = null;\n        var match = void 0;\n        var t = void 0;\n\n        // Run in reverse insertion order\n        while (i--) {\n            t = tokens[i];\n            if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(flags.indexOf(t.flag) !== -1)) {\n                continue;\n            }\n\n            match = XRegExp.exec(pattern, t.regex, pos, 'sticky');\n            if (match) {\n                result = {\n                    matchLength: match[0].length,\n                    output: t.handler.call(context, match, scope, flags),\n                    reparse: t.reparse\n                };\n                // Finished with token tests\n                break;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to\n     * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if\n     * the Unicode Base addon is not available, since flag A is registered by that addon.\n     *\n     * @private\n     * @param {Boolean} on `true` to enable; `false` to disable.\n     */\n    function setAstral(on) {\n        features.astral = on;\n    }\n\n    /**\n     * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow\n     * the ES5 abstract operation `ToObject`.\n     *\n     * @private\n     * @param {*} value Object to check and return.\n     * @returns {*} The provided object.\n     */\n    function toObject(value) {\n        // null or undefined\n        if (value == null) {\n            throw new TypeError('Cannot convert null or undefined to object');\n        }\n\n        return value;\n    }\n\n    // ==--------------------------==\n    // Constructor\n    // ==--------------------------==\n\n    /**\n     * Creates an extended regular expression object for matching text with a pattern. Differs from a\n     * native regular expression in that additional syntax and flags are supported. The returned object\n     * is in fact a native `RegExp` and works with all native methods.\n     *\n     * @class XRegExp\n     * @constructor\n     * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.\n     * @param {String} [flags] Any combination of flags.\n     *   Native flags:\n     *     - `g` - global\n     *     - `i` - ignore case\n     *     - `m` - multiline anchors\n     *     - `u` - unicode (ES6)\n     *     - `y` - sticky (Firefox 3+, ES6)\n     *   Additional XRegExp flags:\n     *     - `n` - explicit capture\n     *     - `s` - dot matches all (aka singleline)\n     *     - `x` - free-spacing and line comments (aka extended)\n     *     - `A` - astral (requires the Unicode Base addon)\n     *   Flags cannot be provided when constructing one `RegExp` from another.\n     * @returns {RegExp} Extended regular expression object.\n     * @example\n     *\n     * // With named capture and flag x\n     * XRegExp(`(?<year>  [0-9]{4} ) -?  # year\n     *          (?<month> [0-9]{2} ) -?  # month\n     *          (?<day>   [0-9]{2} )     # day`, 'x');\n     *\n     * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)\n     * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and\n     * // have fresh `lastIndex` properties (set to zero).\n     * XRegExp(/regex/);\n     */\n    function XRegExp(pattern, flags) {\n        if (XRegExp.isRegExp(pattern)) {\n            if (flags !== undefined) {\n                throw new TypeError('Cannot supply flags when copying a RegExp');\n            }\n            return copyRegex(pattern);\n        }\n\n        // Copy the argument behavior of `RegExp`\n        pattern = pattern === undefined ? '' : String(pattern);\n        flags = flags === undefined ? '' : String(flags);\n\n        if (XRegExp.isInstalled('astral') && !(flags.indexOf('A') !== -1)) {\n            // This causes an error to be thrown if the Unicode Base addon is not available\n            flags += 'A';\n        }\n\n        if (!patternCache[pattern]) {\n            patternCache[pattern] = {};\n        }\n\n        if (!patternCache[pattern][flags]) {\n            var context = {\n                hasNamedCapture: false,\n                captureNames: []\n            };\n            var scope = defaultScope;\n            var output = '';\n            var pos = 0;\n            var result = void 0;\n\n            // Check for flag-related errors, and strip/apply flags in a leading mode modifier\n            var applied = prepareFlags(pattern, flags);\n            var appliedPattern = applied.pattern;\n            var appliedFlags = applied.flags;\n\n            // Use XRegExp's tokens to translate the pattern to a native regex pattern.\n            // `appliedPattern.length` may change on each iteration if tokens use `reparse`\n            while (pos < appliedPattern.length) {\n                do {\n                    // Check for custom tokens at the current position\n                    result = runTokens(appliedPattern, appliedFlags, pos, scope, context);\n                    // If the matched token used the `reparse` option, splice its output into the\n                    // pattern before running tokens again at the same position\n                    if (result && result.reparse) {\n                        appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength);\n                    }\n                } while (result && result.reparse);\n\n                if (result) {\n                    output += result.output;\n                    pos += result.matchLength || 1;\n                } else {\n                    // Get the native token at the current position\n                    var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0];\n                    output += token;\n                    pos += token.length;\n                    if (token === '[' && scope === defaultScope) {\n                        scope = classScope;\n                    } else if (token === ']' && scope === classScope) {\n                        scope = defaultScope;\n                    }\n                }\n            }\n\n            patternCache[pattern][flags] = {\n                // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty\n                // groups are sometimes inserted during regex transpilation in order to keep tokens\n                // separated. However, more than one empty group in a row is never needed.\n                pattern: nativ.replace.call(output, /(?:\\(\\?:\\))+/g, '(?:)'),\n                // Strip all but native flags\n                flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),\n                // `context.captureNames` has an item for each capturing group, even if unnamed\n                captures: context.hasNamedCapture ? context.captureNames : null\n            };\n        }\n\n        var generated = patternCache[pattern][flags];\n        return augment(new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags);\n    }\n\n    // Add `RegExp.prototype` to the prototype chain\n    XRegExp.prototype = /(?:)/;\n\n    // ==--------------------------==\n    // Public properties\n    // ==--------------------------==\n\n    /**\n     * The XRegExp version number as a string containing three dot-separated parts. For example,\n     * '2.0.0-beta-3'.\n     *\n     * @static\n     * @memberOf XRegExp\n     * @type String\n     */\n    XRegExp.version = '4.0.0';\n\n    // ==--------------------------==\n    // Public methods\n    // ==--------------------------==\n\n    // Intentionally undocumented; used in tests and addons\n    XRegExp._clipDuplicates = clipDuplicates;\n    XRegExp._hasNativeFlag = hasNativeFlag;\n    XRegExp._dec = dec;\n    XRegExp._hex = hex;\n    XRegExp._pad4 = pad4;\n\n    /**\n     * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to\n     * create XRegExp addons. If more than one token can match the same string, the last added wins.\n     *\n     * @memberOf XRegExp\n     * @param {RegExp} regex Regex object that matches the new token.\n     * @param {Function} handler Function that returns a new pattern string (using native regex syntax)\n     *   to replace the matched token within all future XRegExp regexes. Has access to persistent\n     *   properties of the regex being built, through `this`. Invoked with three arguments:\n     *   - The match array, with named backreference properties.\n     *   - The regex scope where the match was found: 'default' or 'class'.\n     *   - The flags used by the regex, including any flags in a leading mode modifier.\n     *   The handler function becomes part of the XRegExp construction process, so be careful not to\n     *   construct XRegExps within the function or you will trigger infinite recursion.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.\n     *   - `flag` {String} Single-character flag that triggers the token. This also registers the\n     *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.\n     *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are\n     *     not required to trigger the token. This registers the flags, to prevent XRegExp from\n     *     throwing an 'unknown flag' error when any of the flags are used.\n     *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as\n     *     final, and instead be reparseable by other tokens (including the current token). Allows\n     *     token chaining or deferring.\n     *   - `leadChar` {String} Single character that occurs at the beginning of any successful match\n     *     of the token (not always applicable). This doesn't change the behavior of the token unless\n     *     you provide an erroneous value. However, providing it can increase the token's performance\n     *     since the token can be skipped at any positions where this character doesn't appear.\n     * @example\n     *\n     * // Basic usage: Add \\a for the ALERT control code\n     * XRegExp.addToken(\n     *   /\\\\a/,\n     *   () => '\\\\x07',\n     *   {scope: 'all'}\n     * );\n     * XRegExp('\\\\a[\\\\a-\\\\n]+').test('\\x07\\n\\x07'); // -> true\n     *\n     * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.\n     * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of\n     * // character classes only)\n     * XRegExp.addToken(\n     *   /([?*+]|{\\d+(?:,\\d*)?})(\\??)/,\n     *   (match) => `${match[1]}${match[2] ? '' : '?'}`,\n     *   {flag: 'U'}\n     * );\n     * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'\n     * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'\n     */\n    XRegExp.addToken = function (regex, handler, options) {\n        options = options || {};\n        var optionalFlags = options.optionalFlags;\n        var i = void 0;\n\n        if (options.flag) {\n            registerFlag(options.flag);\n        }\n\n        if (optionalFlags) {\n            optionalFlags = nativ.split.call(optionalFlags, '');\n            for (i = 0; i < optionalFlags.length; ++i) {\n                registerFlag(optionalFlags[i]);\n            }\n        }\n\n        // Add to the private list of syntax tokens\n        tokens.push({\n            regex: copyRegex(regex, {\n                addG: true,\n                addY: hasNativeY,\n                isInternalOnly: true\n            }),\n            handler: handler,\n            scope: options.scope || defaultScope,\n            flag: options.flag,\n            reparse: options.reparse,\n            leadChar: options.leadChar\n        });\n\n        // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags\n        // might now produce different results\n        XRegExp.cache.flush('patterns');\n    };\n\n    /**\n     * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with\n     * the same pattern and flag combination, the cached copy of the regex is returned.\n     *\n     * @memberOf XRegExp\n     * @param {String} pattern Regex pattern string.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {RegExp} Cached XRegExp object.\n     * @example\n     *\n     * while (match = XRegExp.cache('.', 'gs').exec(str)) {\n     *   // The regex is compiled once only\n     * }\n     */\n    XRegExp.cache = function (pattern, flags) {\n        if (!regexCache[pattern]) {\n            regexCache[pattern] = {};\n        }\n        return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));\n    };\n\n    // Intentionally undocumented; used in tests\n    XRegExp.cache.flush = function (cacheName) {\n        if (cacheName === 'patterns') {\n            // Flush the pattern cache used by the `XRegExp` constructor\n            patternCache = {};\n        } else {\n            // Flush the regex cache populated by `XRegExp.cache`\n            regexCache = {};\n        }\n    };\n\n    /**\n     * Escapes any regular expression metacharacters, for use when matching literal strings. The result\n     * can safely be used at any point within a regex that uses any flags.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to escape.\n     * @returns {String} String with regex metacharacters escaped.\n     * @example\n     *\n     * XRegExp.escape('Escaped? <.>');\n     * // -> 'Escaped\\?\\ <\\.>'\n     */\n    XRegExp.escape = function (str) {\n        return nativ.replace.call(toObject(str), /[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n    };\n\n    /**\n     * Executes a regex search in a specified string. Returns a match array or `null`. If the provided\n     * regex uses named capture, named backreference properties are included on the match array.\n     * Optional `pos` and `sticky` arguments specify the search start position, and whether the match\n     * must start at the specified position only. The `lastIndex` property of the provided regex is not\n     * used, but is updated for compatibility. Also fixes browser bugs compared to the native\n     * `RegExp.prototype.exec` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Number} [pos=0] Zero-based index at which to start the search.\n     * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n     *   only. The string `'sticky'` is accepted as an alternative to `true`.\n     * @returns {Array} Match array with named backreference properties, or `null`.\n     * @example\n     *\n     * // Basic use, with named backreference\n     * let match = XRegExp.exec('U+2620', XRegExp('U\\\\+(?<hex>[0-9A-F]{4})'));\n     * match.hex; // -> '2620'\n     *\n     * // With pos and sticky, in a loop\n     * let pos = 2, result = [], match;\n     * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\\d)>/, pos, 'sticky')) {\n     *   result.push(match[1]);\n     *   pos = match.index + match[0].length;\n     * }\n     * // result -> ['2', '3', '4']\n     */\n    XRegExp.exec = function (str, regex, pos, sticky) {\n        var cacheKey = 'g';\n        var addY = false;\n        var fakeY = false;\n        var match = void 0;\n\n        addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);\n        if (addY) {\n            cacheKey += 'y';\n        } else if (sticky) {\n            // Simulate sticky matching by appending an empty capture to the original regex. The\n            // resulting regex will succeed no matter what at the current index (set with `lastIndex`),\n            // and will not search the rest of the subject string. We'll know that the original regex\n            // has failed if that last capture is `''` rather than `undefined` (i.e., if that last\n            // capture participated in the match).\n            fakeY = true;\n            cacheKey += 'FakeY';\n        }\n\n        regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.match`/`replace`\n        var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n            addG: true,\n            addY: addY,\n            source: fakeY ? regex.source + '|()' : undefined,\n            removeY: sticky === false,\n            isInternalOnly: true\n        }));\n\n        pos = pos || 0;\n        r2.lastIndex = pos;\n\n        // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.\n        match = fixed.exec.call(r2, str);\n\n        // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means\n        // the original regexp failed (see above).\n        if (fakeY && match && match.pop() === '') {\n            match = null;\n        }\n\n        if (regex.global) {\n            regex.lastIndex = match ? r2.lastIndex : 0;\n        }\n\n        return match;\n    };\n\n    /**\n     * Executes a provided function once per regex match. Searches always start at the beginning of the\n     * string and continue until the end, regardless of the state of the regex's `global` property and\n     * initial `lastIndex`.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Function} callback Function to execute for each match. Invoked with four arguments:\n     *   - The match array, with named backreference properties.\n     *   - The zero-based match index.\n     *   - The string being traversed.\n     *   - The regex object being used to traverse the string.\n     * @example\n     *\n     * // Extracts every other digit from a string\n     * const evens = [];\n     * XRegExp.forEach('1a2345', /\\d/, (match, i) => {\n     *   if (i % 2) evens.push(+match[0]);\n     * });\n     * // evens -> [2, 4]\n     */\n    XRegExp.forEach = function (str, regex, callback) {\n        var pos = 0;\n        var i = -1;\n        var match = void 0;\n\n        while (match = XRegExp.exec(str, regex, pos)) {\n            // Because `regex` is provided to `callback`, the function could use the deprecated/\n            // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`\n            // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,\n            // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of\n            // regexes, mutating the regex will not have any effect on the iteration or matched strings,\n            // which is a nice side effect that brings extra safety.\n            callback(match, ++i, str, regex);\n\n            pos = match.index + (match[0].length || 1);\n        }\n    };\n\n    /**\n     * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with\n     * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native\n     * regexes are not recompiled using XRegExp syntax.\n     *\n     * @memberOf XRegExp\n     * @param {RegExp} regex Regex to globalize.\n     * @returns {RegExp} Copy of the provided regex with flag `g` added.\n     * @example\n     *\n     * const globalCopy = XRegExp.globalize(/regex/);\n     * globalCopy.global; // -> true\n     */\n    XRegExp.globalize = function (regex) {\n        return copyRegex(regex, { addG: true });\n    };\n\n    /**\n     * Installs optional features according to the specified options. Can be undone using\n     * `XRegExp.uninstall`.\n     *\n     * @memberOf XRegExp\n     * @param {Object|String} options Options object or string.\n     * @example\n     *\n     * // With an options object\n     * XRegExp.install({\n     *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)\n     *   astral: true\n     * });\n     *\n     * // With an options string\n     * XRegExp.install('astral');\n     */\n    XRegExp.install = function (options) {\n        options = prepareOptions(options);\n\n        if (!features.astral && options.astral) {\n            setAstral(true);\n        }\n    };\n\n    /**\n     * Checks whether an individual optional feature is installed.\n     *\n     * @memberOf XRegExp\n     * @param {String} feature Name of the feature to check. One of:\n     *   - `astral`\n     * @returns {Boolean} Whether the feature is installed.\n     * @example\n     *\n     * XRegExp.isInstalled('astral');\n     */\n    XRegExp.isInstalled = function (feature) {\n        return !!features[feature];\n    };\n\n    /**\n     * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes\n     * created in another frame, when `instanceof` and `constructor` checks would fail.\n     *\n     * @memberOf XRegExp\n     * @param {*} value Object to check.\n     * @returns {Boolean} Whether the object is a `RegExp` object.\n     * @example\n     *\n     * XRegExp.isRegExp('string'); // -> false\n     * XRegExp.isRegExp(/regex/i); // -> true\n     * XRegExp.isRegExp(RegExp('^', 'm')); // -> true\n     * XRegExp.isRegExp(XRegExp('(?s).')); // -> true\n     */\n    XRegExp.isRegExp = function (value) {\n        return toString.call(value) === '[object RegExp]';\n    }; // isType(value, 'RegExp');\n\n    /**\n     * Returns the first matched string, or in global mode, an array containing all matched strings.\n     * This is essentially a more convenient re-implementation of `String.prototype.match` that gives\n     * the result types you actually want (string instead of `exec`-style array in match-first mode,\n     * and an empty array instead of `null` when no matches are found in match-all mode). It also lets\n     * you override flag g and ignore `lastIndex`, and fixes browser bugs.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to\n     *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,\n     *   `scope` is 'all'.\n     * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all\n     *   mode: Array of all matched strings, or an empty array.\n     * @example\n     *\n     * // Match first\n     * XRegExp.match('abc', /\\w/); // -> 'a'\n     * XRegExp.match('abc', /\\w/g, 'one'); // -> 'a'\n     * XRegExp.match('abc', /x/g, 'one'); // -> null\n     *\n     * // Match all\n     * XRegExp.match('abc', /\\w/g); // -> ['a', 'b', 'c']\n     * XRegExp.match('abc', /\\w/, 'all'); // -> ['a', 'b', 'c']\n     * XRegExp.match('abc', /x/, 'all'); // -> []\n     */\n    XRegExp.match = function (str, regex, scope) {\n        var global = regex.global && scope !== 'one' || scope === 'all';\n        var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';\n\n        regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.exec`/`replace`\n        var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n            addG: !!global,\n            removeG: scope === 'one',\n            isInternalOnly: true\n        }));\n\n        var result = nativ.match.call(toObject(str), r2);\n\n        if (regex.global) {\n            regex.lastIndex = scope === 'one' && result ?\n            // Can't use `r2.lastIndex` since `r2` is nonglobal in this case\n            result.index + result[0].length : 0;\n        }\n\n        return global ? result || [] : result && result[0];\n    };\n\n    /**\n     * Retrieves the matches from searching a string using a chain of regexes that successively search\n     * within previous matches. The provided `chain` array can contain regexes and or objects with\n     * `regex` and `backref` properties. When a backreference is specified, the named or numbered\n     * backreference is passed forward to the next regex or returned.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {Array} chain Regexes that each search for matches within preceding results.\n     * @returns {Array} Matches by the last regex in the chain, or an empty array.\n     * @example\n     *\n     * // Basic usage; matches numbers within <b> tags\n     * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [\n     *   XRegExp('(?is)<b>.*?</b>'),\n     *   /\\d+/\n     * ]);\n     * // -> ['2', '4', '56']\n     *\n     * // Passing forward and returning specific backreferences\n     * html = '<a href=\"http://xregexp.com/api/\">XRegExp</a>\\\n     *         <a href=\"http://www.google.com/\">Google</a>';\n     * XRegExp.matchChain(html, [\n     *   {regex: /<a href=\"([^\"]+)\">/i, backref: 1},\n     *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}\n     * ]);\n     * // -> ['xregexp.com', 'www.google.com']\n     */\n    XRegExp.matchChain = function (str, chain) {\n        return function recurseChain(values, level) {\n            var item = chain[level].regex ? chain[level] : { regex: chain[level] };\n            var matches = [];\n\n            function addMatch(match) {\n                if (item.backref) {\n                    // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the\n                    // `undefined`s for backreferences to nonparticipating capturing groups. In such\n                    // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw\n                    // the exception, so also check if the backreference is a number that is within the\n                    // bounds of the array.\n                    if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) {\n                        throw new ReferenceError('Backreference to undefined group: ' + item.backref);\n                    }\n\n                    matches.push(match[item.backref] || '');\n                } else {\n                    matches.push(match[0]);\n                }\n            }\n\n            for (var i = 0; i < values.length; ++i) {\n                XRegExp.forEach(values[i], item.regex, addMatch);\n            }\n\n            return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);\n        }([str], 0);\n    };\n\n    /**\n     * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string\n     * or regex, and the replacement can be a string or a function to be called for each match. To\n     * perform a global search and replace, use the optional `scope` argument or include flag g if using\n     * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.\n     * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser\n     * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp|String} search Search pattern to be replaced.\n     * @param {String|Function} replacement Replacement string or a function invoked to create it.\n     *   Replacement strings can include special replacement syntax:\n     *     - $$ - Inserts a literal $ character.\n     *     - $&, $0 - Inserts the matched substring.\n     *     - $` - Inserts the string that precedes the matched substring (left context).\n     *     - $' - Inserts the string that follows the matched substring (right context).\n     *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts\n     *       backreference n/nn.\n     *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing\n     *       group, inserts backreference n.\n     *   Replacement functions are invoked with three or more arguments:\n     *     - The matched substring (corresponds to $& above). Named backreferences are accessible as\n     *       properties of this first argument.\n     *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).\n     *     - The zero-based index of the match within the total search string.\n     *     - The total string being searched.\n     * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not\n     *   explicitly specified and using a regex with flag g, `scope` is 'all'.\n     * @returns {String} New string with one or all matches replaced.\n     * @example\n     *\n     * // Regex search, using named backreferences in replacement string\n     * const name = XRegExp('(?<first>\\\\w+) (?<last>\\\\w+)');\n     * XRegExp.replace('John Smith', name, '$<last>, $<first>');\n     * // -> 'Smith, John'\n     *\n     * // Regex search, using named backreferences in replacement function\n     * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);\n     * // -> 'Smith, John'\n     *\n     * // String search, with replace-all\n     * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');\n     * // -> 'XRegExp builds XRegExps'\n     */\n    XRegExp.replace = function (str, search, replacement, scope) {\n        var isRegex = XRegExp.isRegExp(search);\n        var global = search.global && scope !== 'one' || scope === 'all';\n        var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';\n        var s2 = search;\n\n        if (isRegex) {\n            search[REGEX_DATA] = search[REGEX_DATA] || {};\n\n            // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s\n            // `lastIndex` isn't updated *during* replacement iterations\n            s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {\n                addG: !!global,\n                removeG: scope === 'one',\n                isInternalOnly: true\n            }));\n        } else if (global) {\n            s2 = new RegExp(XRegExp.escape(String(search)), 'g');\n        }\n\n        // Fixed `replace` required for named backreferences, etc.\n        var result = fixed.replace.call(toObject(str), s2, replacement);\n\n        if (isRegex && search.global) {\n            // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n            search.lastIndex = 0;\n        }\n\n        return result;\n    };\n\n    /**\n     * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an\n     * array of replacement details. Later replacements operate on the output of earlier replacements.\n     * Replacement details are accepted as an array with a regex or string to search for, the\n     * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp\n     * replacement text syntax, which supports named backreference properties via `${name}` or\n     * `$<name>`.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {Array} replacements Array of replacement detail arrays.\n     * @returns {String} New string with all replacements.\n     * @example\n     *\n     * str = XRegExp.replaceEach(str, [\n     *   [XRegExp('(?<name>a)'), 'z${name}'],\n     *   [/b/gi, 'y'],\n     *   [/c/g, 'x', 'one'], // scope 'one' overrides /g\n     *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g\n     *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings\n     *   [/f/g, ($0) => $0.toUpperCase()]\n     * ]);\n     */\n    XRegExp.replaceEach = function (str, replacements) {\n        var i = void 0;\n        var r = void 0;\n\n        for (i = 0; i < replacements.length; ++i) {\n            r = replacements[i];\n            str = XRegExp.replace(str, r[0], r[1], r[2]);\n        }\n\n        return str;\n    };\n\n    /**\n     * Splits a string into an array of strings using a regex or string separator. Matches of the\n     * separator are not included in the result array. However, if `separator` is a regex that contains\n     * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n     * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n     * cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to split.\n     * @param {RegExp|String} separator Regex or string to use for separating the string.\n     * @param {Number} [limit] Maximum number of items to include in the result array.\n     * @returns {Array} Array of substrings.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.split('a b c', ' ');\n     * // -> ['a', 'b', 'c']\n     *\n     * // With limit\n     * XRegExp.split('a b c', ' ', 2);\n     * // -> ['a', 'b']\n     *\n     * // Backreferences in result array\n     * XRegExp.split('..word1..', /([a-z]+)(\\d+)/i);\n     * // -> ['..', 'word', '1', '..']\n     */\n    XRegExp.split = function (str, separator, limit) {\n        return fixed.split.call(toObject(str), separator, limit);\n    };\n\n    /**\n     * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and\n     * `sticky` arguments specify the search start position, and whether the match must start at the\n     * specified position only. The `lastIndex` property of the provided regex is not used, but is\n     * updated for compatibility. Also fixes browser bugs compared to the native\n     * `RegExp.prototype.test` and can be used reliably cross-browser.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {RegExp} regex Regex to search with.\n     * @param {Number} [pos=0] Zero-based index at which to start the search.\n     * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n     *   only. The string `'sticky'` is accepted as an alternative to `true`.\n     * @returns {Boolean} Whether the regex matched the provided value.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.test('abc', /c/); // -> true\n     *\n     * // With pos and sticky\n     * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false\n     * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true\n     */\n    // Do this the easy way :-)\n    XRegExp.test = function (str, regex, pos, sticky) {\n        return !!XRegExp.exec(str, regex, pos, sticky);\n    };\n\n    /**\n     * Uninstalls optional features according to the specified options. All optional features start out\n     * uninstalled, so this is used to undo the actions of `XRegExp.install`.\n     *\n     * @memberOf XRegExp\n     * @param {Object|String} options Options object or string.\n     * @example\n     *\n     * // With an options object\n     * XRegExp.uninstall({\n     *   // Disables support for astral code points in Unicode addons\n     *   astral: true\n     * });\n     *\n     * // With an options string\n     * XRegExp.uninstall('astral');\n     */\n    XRegExp.uninstall = function (options) {\n        options = prepareOptions(options);\n\n        if (features.astral && options.astral) {\n            setAstral(false);\n        }\n    };\n\n    /**\n     * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as\n     * regex objects or strings. Metacharacters are escaped in patterns provided as strings.\n     * Backreferences in provided regex objects are automatically renumbered to work correctly within\n     * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the\n     * `flags` argument.\n     *\n     * @memberOf XRegExp\n     * @param {Array} patterns Regexes and strings to combine.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @param {Object} [options] Options object with optional properties:\n     *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.\n     * @returns {RegExp} Union of the provided regexes and strings.\n     * @example\n     *\n     * XRegExp.union(['a+b*c', /(dogs)\\1/, /(cats)\\1/], 'i');\n     * // -> /a\\+b\\*c|(dogs)\\1|(cats)\\2/i\n     *\n     * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});\n     * // -> /manbearpig/i\n     */\n    XRegExp.union = function (patterns, flags, options) {\n        options = options || {};\n        var conjunction = options.conjunction || 'or';\n        var numCaptures = 0;\n        var numPriorCaptures = void 0;\n        var captureNames = void 0;\n\n        function rewrite(match, paren, backref) {\n            var name = captureNames[numCaptures - numPriorCaptures];\n\n            // Capturing group\n            if (paren) {\n                ++numCaptures;\n                // If the current capture has a name, preserve the name\n                if (name) {\n                    return '(?<' + name + '>';\n                }\n                // Backreference\n            } else if (backref) {\n                // Rewrite the backreference\n                return '\\\\' + (+backref + numPriorCaptures);\n            }\n\n            return match;\n        }\n\n        if (!(isType(patterns, 'Array') && patterns.length)) {\n            throw new TypeError('Must provide a nonempty array of patterns to merge');\n        }\n\n        var parts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n        var output = [];\n        var pattern = void 0;\n        for (var i = 0; i < patterns.length; ++i) {\n            pattern = patterns[i];\n\n            if (XRegExp.isRegExp(pattern)) {\n                numPriorCaptures = numCaptures;\n                captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || [];\n\n                // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are\n                // independently valid; helps keep this simple. Named captures are put back\n                output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));\n            } else {\n                output.push(XRegExp.escape(pattern));\n            }\n        }\n\n        var separator = conjunction === 'none' ? '' : '|';\n        return XRegExp(output.join(separator), flags);\n    };\n\n    // ==--------------------------==\n    // Fixed/extended native methods\n    // ==--------------------------==\n\n    /**\n     * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n     * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.\n     *\n     * @memberOf RegExp\n     * @param {String} str String to search.\n     * @returns {Array} Match array with named backreference properties, or `null`.\n     */\n    fixed.exec = function (str) {\n        var origLastIndex = this.lastIndex;\n        var match = nativ.exec.apply(this, arguments);\n\n        if (match) {\n            // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing\n            // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9\n            // in standards mode follows the spec.\n            if (!correctExecNpcg && match.length > 1 && match.indexOf('') !== -1) {\n                var r2 = copyRegex(this, {\n                    removeG: true,\n                    isInternalOnly: true\n                });\n                // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n                // matching due to characters outside the match\n                nativ.replace.call(String(str).slice(match.index), r2, function () {\n                    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                        args[_key] = arguments[_key];\n                    }\n\n                    var len = args.length;\n                    // Skip index 0 and the last 2\n                    for (var i = 1; i < len - 2; ++i) {\n                        if (args[i] === undefined) {\n                            match[i] = undefined;\n                        }\n                    }\n                });\n            }\n\n            // Attach named capture properties\n            if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {\n                // Skip index 0\n                for (var i = 1; i < match.length; ++i) {\n                    var name = this[REGEX_DATA].captureNames[i - 1];\n                    if (name) {\n                        match[name] = match[i];\n                    }\n                }\n            }\n\n            // Fix browsers that increment `lastIndex` after zero-length matches\n            if (this.global && !match[0].length && this.lastIndex > match.index) {\n                this.lastIndex = match.index;\n            }\n        }\n\n        if (!this.global) {\n            // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n            this.lastIndex = origLastIndex;\n        }\n\n        return match;\n    };\n\n    /**\n     * Fixes browser bugs in the native `RegExp.prototype.test`.\n     *\n     * @memberOf RegExp\n     * @param {String} str String to search.\n     * @returns {Boolean} Whether the regex matched the provided value.\n     */\n    fixed.test = function (str) {\n        // Do this the easy way :-)\n        return !!fixed.exec.call(this, str);\n    };\n\n    /**\n     * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n     * bugs in the native `String.prototype.match`.\n     *\n     * @memberOf String\n     * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.\n     * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,\n     *   the result of calling `regex.exec(this)`.\n     */\n    fixed.match = function (regex) {\n        if (!XRegExp.isRegExp(regex)) {\n            // Use the native `RegExp` rather than `XRegExp`\n            regex = new RegExp(regex);\n        } else if (regex.global) {\n            var result = nativ.match.apply(this, arguments);\n            // Fixes IE bug\n            regex.lastIndex = 0;\n\n            return result;\n        }\n\n        return fixed.exec.call(regex, toObject(this));\n    };\n\n    /**\n     * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement\n     * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also\n     * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex\n     * search value, and the value of a replacement regex's `lastIndex` property during replacement\n     * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third\n     * (`flags`) argument. Use via `XRegExp.replace`.\n     *\n     * @memberOf String\n     * @param {RegExp|String} search Search pattern to be replaced.\n     * @param {String|Function} replacement Replacement string or a function invoked to create it.\n     * @returns {String} New string with one or all matches replaced.\n     */\n    fixed.replace = function (search, replacement) {\n        var isRegex = XRegExp.isRegExp(search);\n        var origLastIndex = void 0;\n        var captureNames = void 0;\n        var result = void 0;\n\n        if (isRegex) {\n            if (search[REGEX_DATA]) {\n                captureNames = search[REGEX_DATA].captureNames;\n            }\n            // Only needed if `search` is nonglobal\n            origLastIndex = search.lastIndex;\n        } else {\n            search += ''; // Type-convert\n        }\n\n        // Don't use `typeof`; some older browsers return 'function' for regex objects\n        if (isType(replacement, 'Function')) {\n            // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement\n            // functions isn't type-converted to a string\n            result = nativ.replace.call(String(this), search, function () {\n                for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                    args[_key2] = arguments[_key2];\n                }\n\n                if (captureNames) {\n                    // Change the `args[0]` string primitive to a `String` object that can store\n                    // properties. This really does need to use `String` as a constructor\n                    args[0] = new String(args[0]);\n                    // Store named backreferences on the first argument\n                    for (var i = 0; i < captureNames.length; ++i) {\n                        if (captureNames[i]) {\n                            args[0][captureNames[i]] = args[i + 1];\n                        }\n                    }\n                }\n                // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari\n                // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)\n                if (isRegex && search.global) {\n                    search.lastIndex = args[args.length - 2] + args[0].length;\n                }\n                // ES6 specs the context for replacement functions as `undefined`\n                return replacement.apply(undefined, args);\n            });\n        } else {\n            // Ensure that the last value of `args` will be a string when given nonstring `this`,\n            // while still throwing on null or undefined context\n            result = nativ.replace.call(this == null ? this : String(this), search, function () {\n                for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n                    args[_key3] = arguments[_key3];\n                }\n\n                return nativ.replace.call(String(replacement), replacementToken, replacer);\n\n                function replacer($0, bracketed, angled, dollarToken) {\n                    bracketed = bracketed || angled;\n                    // Named or numbered backreference with curly or angled braces\n                    if (bracketed) {\n                        // XRegExp behavior for `${n}` or `$<n>`:\n                        // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the\n                        //    entire match. Any number of leading zeros may be used.\n                        // 2. Backreference to named capture `n`, if it exists and is not an integer\n                        //    overridden by numbered capture. In practice, this does not overlap with\n                        //    numbered capture since XRegExp does not allow named capture to use a bare\n                        //    integer as the name.\n                        // 3. If the name or number does not refer to an existing capturing group, it's\n                        //    an error.\n                        var n = +bracketed; // Type-convert; drop leading zeros\n                        if (n <= args.length - 3) {\n                            return args[n] || '';\n                        }\n                        // Groups with the same name is an error, else would need `lastIndexOf`\n                        n = captureNames ? captureNames.indexOf(bracketed) : -1;\n                        if (n < 0) {\n                            throw new SyntaxError('Backreference to undefined group ' + $0);\n                        }\n                        return args[n + 1] || '';\n                    }\n                    // Else, special variable or numbered backreference without curly braces\n                    if (dollarToken === '$') {\n                        // $$\n                        return '$';\n                    }\n                    if (dollarToken === '&' || +dollarToken === 0) {\n                        // $&, $0 (not followed by 1-9), $00\n                        return args[0];\n                    }\n                    if (dollarToken === '`') {\n                        // $` (left context)\n                        return args[args.length - 1].slice(0, args[args.length - 2]);\n                    }\n                    if (dollarToken === \"'\") {\n                        // $' (right context)\n                        return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                    }\n                    // Else, numbered backreference without braces\n                    dollarToken = +dollarToken; // Type-convert; drop leading zero\n                    // XRegExp behavior for `$n` and `$nn`:\n                    // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.\n                    // - `$1` is an error if no capturing groups.\n                    // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`\n                    //   instead.\n                    // - `$01` is `$1` if at least one capturing group, else it's an error.\n                    // - `$0` (not followed by 1-9) and `$00` are the entire match.\n                    // Native behavior, for comparison:\n                    // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.\n                    // - `$1` is a literal `$1` if no capturing groups.\n                    // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.\n                    // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.\n                    // - `$0` is a literal `$0`.\n                    if (!isNaN(dollarToken)) {\n                        if (dollarToken > args.length - 3) {\n                            throw new SyntaxError('Backreference to undefined group ' + $0);\n                        }\n                        return args[dollarToken] || '';\n                    }\n                    // `$` followed by an unsupported char is an error, unlike native JS\n                    throw new SyntaxError('Invalid token ' + $0);\n                }\n            });\n        }\n\n        if (isRegex) {\n            if (search.global) {\n                // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n                search.lastIndex = 0;\n            } else {\n                // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n                search.lastIndex = origLastIndex;\n            }\n        }\n\n        return result;\n    };\n\n    /**\n     * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.\n     *\n     * @memberOf String\n     * @param {RegExp|String} separator Regex or string to use for separating the string.\n     * @param {Number} [limit] Maximum number of items to include in the result array.\n     * @returns {Array} Array of substrings.\n     */\n    fixed.split = function (separator, limit) {\n        if (!XRegExp.isRegExp(separator)) {\n            // Browsers handle nonregex split correctly, so use the faster native method\n            return nativ.split.apply(this, arguments);\n        }\n\n        var str = String(this);\n        var output = [];\n        var origLastIndex = separator.lastIndex;\n        var lastLastIndex = 0;\n        var lastLength = void 0;\n\n        // Values for `limit`, per the spec:\n        // If undefined: pow(2,32) - 1\n        // If 0, Infinity, or NaN: 0\n        // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);\n        // If negative number: pow(2,32) - floor(abs(limit))\n        // If other: Type-convert, then use the above rules\n        // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless\n        // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+\n        limit = (limit === undefined ? -1 : limit) >>> 0;\n\n        XRegExp.forEach(str, separator, function (match) {\n            // This condition is not the same as `if (match[0].length)`\n            if (match.index + match[0].length > lastLastIndex) {\n                output.push(str.slice(lastLastIndex, match.index));\n                if (match.length > 1 && match.index < str.length) {\n                    Array.prototype.push.apply(output, match.slice(1));\n                }\n                lastLength = match[0].length;\n                lastLastIndex = match.index + lastLength;\n            }\n        });\n\n        if (lastLastIndex === str.length) {\n            if (!nativ.test.call(separator, '') || lastLength) {\n                output.push('');\n            }\n        } else {\n            output.push(str.slice(lastLastIndex));\n        }\n\n        separator.lastIndex = origLastIndex;\n        return output.length > limit ? output.slice(0, limit) : output;\n    };\n\n    // ==--------------------------==\n    // Built-in syntax/flag tokens\n    // ==--------------------------==\n\n    /*\n     * Letter escapes that natively match literal characters: `\\a`, `\\A`, etc. These should be\n     * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser\n     * consistency and to reserve their syntax, but lets them be superseded by addons.\n     */\n    XRegExp.addToken(/\\\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|x(?![\\dA-Fa-f]{2}))/, function (match, scope) {\n        // \\B is allowed in default scope only\n        if (match[1] === 'B' && scope === defaultScope) {\n            return match[0];\n        }\n        throw new SyntaxError('Invalid escape ' + match[0]);\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Unicode code point escape with curly braces: `\\u{N..}`. `N..` is any one or more digit\n     * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag\n     * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to\n     * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior\n     * if you follow a `\\u{N..}` token that references a code point above U+FFFF with a quantifier, or\n     * if you use the same in a character class.\n     */\n    XRegExp.addToken(/\\\\u{([\\dA-Fa-f]+)}/, function (match, scope, flags) {\n        var code = dec(match[1]);\n        if (code > 0x10FFFF) {\n            throw new SyntaxError('Invalid Unicode code point ' + match[0]);\n        }\n        if (code <= 0xFFFF) {\n            // Converting to \\uNNNN avoids needing to escape the literal character and keep it\n            // separate from preceding tokens\n            return '\\\\u' + pad4(hex(code));\n        }\n        // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling\n        if (hasNativeU && flags.indexOf('u') !== -1) {\n            return match[0];\n        }\n        throw new SyntaxError('Cannot use Unicode code point above \\\\u{FFFF} without flag u');\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.\n     * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because\n     * character class endings can't be determined.\n     */\n    XRegExp.addToken(/\\[(\\^?)\\]/,\n    // For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n    // (?!) should work like \\b\\B, but is unreliable in some versions of Firefox\n    /* eslint-disable no-confusing-arrow */\n    function (match) {\n        return match[1] ? '[\\\\s\\\\S]' : '\\\\b\\\\B';\n    },\n    /* eslint-enable no-confusing-arrow */\n    { leadChar: '[' });\n\n    /*\n     * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in\n     * free-spacing mode (flag x).\n     */\n    XRegExp.addToken(/\\(\\?#[^)]*\\)/, getContextualTokenSeparator, { leadChar: '(' });\n\n    /*\n     * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.\n     */\n    XRegExp.addToken(/\\s+|#[^\\n]*\\n?/, getContextualTokenSeparator, { flag: 'x' });\n\n    /*\n     * Dot, in dotall mode (aka singleline mode, flag s) only.\n     */\n    XRegExp.addToken(/\\./, function () {\n        return '[\\\\s\\\\S]';\n    }, {\n        flag: 's',\n        leadChar: '.'\n    });\n\n    /*\n     * Named backreference: `\\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,\n     * and $ only. Also allows numbered backreferences as `\\k<n>`.\n     */\n    XRegExp.addToken(/\\\\k<([\\w$]+)>/, function (match) {\n        // Groups with the same name is an error, else would need `lastIndexOf`\n        var index = isNaN(match[1]) ? this.captureNames.indexOf(match[1]) + 1 : +match[1];\n        var endIndex = match.index + match[0].length;\n        if (!index || index > this.captureNames.length) {\n            throw new SyntaxError('Backreference to undefined group ' + match[0]);\n        }\n        // Keep backreferences separate from subsequent literal numbers. This avoids e.g.\n        // inadvertedly changing `(?<n>)\\k<n>1` to `()\\11`.\n        return '\\\\' + index + (endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');\n    }, { leadChar: '\\\\' });\n\n    /*\n     * Numbered backreference or octal, plus any following digits: `\\0`, `\\11`, etc. Octals except `\\0`\n     * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches\n     * are returned unaltered. IE < 9 doesn't support backreferences above `\\99` in regex syntax.\n     */\n    XRegExp.addToken(/\\\\(\\d+)/, function (match, scope) {\n        if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {\n            throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]);\n        }\n        return match[0];\n    }, {\n        scope: 'all',\n        leadChar: '\\\\'\n    });\n\n    /*\n     * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the\n     * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style\n     * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively\n     * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to\n     * Python-style named capture as octals.\n     */\n    XRegExp.addToken(/\\(\\?P?<([\\w$]+)>/, function (match) {\n        // Disallow bare integers as names because named backreferences are added to match arrays\n        // and therefore numeric properties may lead to incorrect lookups\n        if (!isNaN(match[1])) {\n            throw new SyntaxError('Cannot use integer as capture name ' + match[0]);\n        }\n        if (match[1] === 'length' || match[1] === '__proto__') {\n            throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]);\n        }\n        if (this.captureNames.indexOf(match[1]) !== -1) {\n            throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]);\n        }\n        this.captureNames.push(match[1]);\n        this.hasNamedCapture = true;\n        return '(';\n    }, { leadChar: '(' });\n\n    /*\n     * Capturing group; match the opening parenthesis only. Required for support of named capturing\n     * groups. Also adds explicit capture mode (flag n).\n     */\n    XRegExp.addToken(/\\((?!\\?)/, function (match, scope, flags) {\n        if (flags.indexOf('n') !== -1) {\n            return '(?:';\n        }\n        this.captureNames.push(null);\n        return '(';\n    }, {\n        optionalFlags: 'n',\n        leadChar: '('\n    });\n\n    exports.default = XRegExp;\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(xregexp);\n\n    var build = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp.build 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2012-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n        var REGEX_DATA = 'xregexp';\n        var subParts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n        var parts = XRegExp.union([/\\({{([\\w$]+)}}\\)|{{([\\w$]+)}}/, subParts], 'g', {\n            conjunction: 'or'\n        });\n\n        /**\n         * Strips a leading `^` and trailing unescaped `$`, if both are present.\n         *\n         * @private\n         * @param {String} pattern Pattern to process.\n         * @returns {String} Pattern with edge anchors removed.\n         */\n        function deanchor(pattern) {\n            // Allow any number of empty noncapturing groups before/after anchors, because regexes\n            // built/generated by XRegExp sometimes include them\n            var leadingAnchor = /^(?:\\(\\?:\\))*\\^/;\n            var trailingAnchor = /\\$(?:\\(\\?:\\))*$/;\n\n            if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) &&\n            // Ensure that the trailing `$` isn't escaped\n            trailingAnchor.test(pattern.replace(/\\\\[\\s\\S]/g, ''))) {\n                return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');\n            }\n\n            return pattern;\n        }\n\n        /**\n         * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.\n         *\n         * @private\n         * @param {String|RegExp} value Value to convert.\n         * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not\n         *   already a regex generated by XRegExp\n         * @returns {RegExp} XRegExp object with XRegExp syntax applied.\n         */\n        function asXRegExp(value, addFlagX) {\n            var flags = addFlagX ? 'x' : '';\n            return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ?\n            // Don't recompile, to preserve capture names\n            value :\n            // Recompile as XRegExp\n            XRegExp(value.source, flags) :\n            // Compile string as XRegExp\n            XRegExp(value, flags);\n        }\n\n        function interpolate(substitution) {\n            return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);\n        }\n\n        function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {\n            subpatterns['subpattern' + subpatternIndex] = interpolated;\n            return subpatterns;\n        }\n\n        function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {\n            var hasSubpattern = subpatternIndex < rawLiterals.length - 1;\n            return raw + (hasSubpattern ? '{{subpattern' + subpatternIndex + '}}' : '');\n        }\n\n        /**\n         * Provides tagged template literals that create regexes with XRegExp syntax and flags. The\n         * provided pattern is handled as a raw string, so backslashes don't need to be escaped.\n         *\n         * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated\n         * patterns are treated as atomic units when quantified, interpolated strings have their special\n         * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated\n         * regexes if both are present, and any backreferences within an interpolated regex are\n         * rewritten to work within the overall pattern.\n         *\n         * @memberOf XRegExp\n         * @param {String} [flags] Any combination of XRegExp flags.\n         * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.\n         * @example\n         *\n         * const h12 = /1[0-2]|0?[1-9]/;\n         * const h24 = /2[0-3]|[01][0-9]/;\n         * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;\n         * const minutes = /^[0-5][0-9]$/;\n         * // Note that explicitly naming the 'minutes' group is required for named backreferences\n         * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;\n         * time.test('10:59'); // -> true\n         * XRegExp.exec('10:59', time).minutes; // -> '59'\n         */\n        XRegExp.tag = function (flags) {\n            return function (literals) {\n                for (var _len = arguments.length, substitutions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                    substitutions[_key - 1] = arguments[_key];\n                }\n\n                var subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});\n                var pattern = literals.raw.map(embedSubpatternAfter).join('');\n                return XRegExp.build(pattern, subpatterns, flags);\n            };\n        };\n\n        /**\n         * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in\n         * the outer pattern and provided subpatterns are automatically renumbered to work correctly.\n         * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.\n         *\n         * @memberOf XRegExp\n         * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows\n         *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within\n         *   character classes.\n         * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A\n         *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.\n         * @param {String} [flags] Any combination of XRegExp flags.\n         * @returns {RegExp} Regex with interpolated subpatterns.\n         * @example\n         *\n         * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {\n         *   hours: XRegExp.build('{{h12}} : | {{h24}}', {\n         *     h12: /1[0-2]|0?[1-9]/,\n         *     h24: /2[0-3]|[01][0-9]/\n         *   }, 'x'),\n         *   minutes: /^[0-5][0-9]$/\n         * });\n         * time.test('10:59'); // -> true\n         * XRegExp.exec('10:59', time).minutes; // -> '59'\n         */\n        XRegExp.build = function (pattern, subs, flags) {\n            flags = flags || '';\n            // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how\n            // some browsers convert `RegExp('\\n')` to a regex that contains the literal characters `\\`\n            // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.\n            var addFlagX = flags.indexOf('x') !== -1;\n            var inlineFlags = /^\\(\\?([\\w$]+)\\)/.exec(pattern);\n            // Add flags within a leading mode modifier to the overall pattern's flags\n            if (inlineFlags) {\n                flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);\n            }\n\n            var data = {};\n            for (var p in subs) {\n                if (subs.hasOwnProperty(p)) {\n                    // Passing to XRegExp enables extended syntax and ensures independent validity,\n                    // lest an unescaped `(`, `)`, `[`, or trailing `\\` breaks the `(?:)` wrapper. For\n                    // subpatterns provided as native regexes, it dies on octals and adds the property\n                    // used to hold extended regex instance data, for simplicity.\n                    var sub = asXRegExp(subs[p], addFlagX);\n                    data[p] = {\n                        // Deanchoring allows embedding independently useful anchored regexes. If you\n                        // really need to keep your anchors, double them (i.e., `^^...$$`).\n                        pattern: deanchor(sub.source),\n                        names: sub[REGEX_DATA].captureNames || []\n                    };\n                }\n            }\n\n            // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;\n            // helps keep this simple. Named captures will be put back.\n            var patternAsRegex = asXRegExp(pattern, addFlagX);\n\n            // 'Caps' is short for 'captures'\n            var numCaps = 0;\n            var numPriorCaps = void 0;\n            var numOuterCaps = 0;\n            var outerCapsMap = [0];\n            var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];\n            var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {\n                var subName = $1 || $2;\n                var capName = void 0;\n                var intro = void 0;\n                var localCapIndex = void 0;\n                // Named subpattern\n                if (subName) {\n                    if (!data.hasOwnProperty(subName)) {\n                        throw new ReferenceError('Undefined property ' + $0);\n                    }\n                    // Named subpattern was wrapped in a capturing group\n                    if ($1) {\n                        capName = outerCapNames[numOuterCaps];\n                        outerCapsMap[++numOuterCaps] = ++numCaps;\n                        // If it's a named group, preserve the name. Otherwise, use the subpattern name\n                        // as the capture name\n                        intro = '(?<' + (capName || subName) + '>';\n                    } else {\n                        intro = '(?:';\n                    }\n                    numPriorCaps = numCaps;\n                    var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {\n                        // Capturing group\n                        if (paren) {\n                            capName = data[subName].names[numCaps - numPriorCaps];\n                            ++numCaps;\n                            // If the current capture has a name, preserve the name\n                            if (capName) {\n                                return '(?<' + capName + '>';\n                            }\n                            // Backreference\n                        } else if (backref) {\n                            localCapIndex = +backref - 1;\n                            // Rewrite the backreference\n                            return data[subName].names[localCapIndex] ?\n                            // Need to preserve the backreference name in case using flag `n`\n                            '\\\\k<' + data[subName].names[localCapIndex] + '>' : '\\\\' + (+backref + numPriorCaps);\n                        }\n                        return match;\n                    });\n                    return '' + intro + rewrittenSubpattern + ')';\n                }\n                // Capturing group\n                if ($3) {\n                    capName = outerCapNames[numOuterCaps];\n                    outerCapsMap[++numOuterCaps] = ++numCaps;\n                    // If the current capture has a name, preserve the name\n                    if (capName) {\n                        return '(?<' + capName + '>';\n                    }\n                    // Backreference\n                } else if ($4) {\n                    localCapIndex = +$4 - 1;\n                    // Rewrite the backreference\n                    return outerCapNames[localCapIndex] ?\n                    // Need to preserve the backreference name in case using flag `n`\n                    '\\\\k<' + outerCapNames[localCapIndex] + '>' : '\\\\' + outerCapsMap[+$4];\n                }\n                return $0;\n            });\n\n            return XRegExp(output, flags);\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(build);\n\n    var matchrecursive = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp.matchRecursive 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2009-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Returns a match detail object composed of the provided values.\n         *\n         * @private\n         */\n        function row(name, value, start, end) {\n            return {\n                name: name,\n                value: value,\n                start: start,\n                end: end\n            };\n        }\n\n        /**\n         * Returns an array of match strings between outermost left and right delimiters, or an array of\n         * objects with detailed match parts and position data. An error is thrown if delimiters are\n         * unbalanced within the data.\n         *\n         * @memberOf XRegExp\n         * @param {String} str String to search.\n         * @param {String} left Left delimiter as an XRegExp pattern.\n         * @param {String} right Right delimiter as an XRegExp pattern.\n         * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.\n         * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.\n         * @returns {Array} Array of matches, or an empty array.\n         * @example\n         *\n         * // Basic usage\n         * let str = '(t((e))s)t()(ing)';\n         * XRegExp.matchRecursive(str, '\\\\(', '\\\\)', 'g');\n         * // -> ['t((e))s', '', 'ing']\n         *\n         * // Extended information mode with valueNames\n         * str = 'Here is <div> <div>an</div></div> example';\n         * XRegExp.matchRecursive(str, '<div\\\\s*>', '</div>', 'gi', {\n         *   valueNames: ['between', 'left', 'match', 'right']\n         * });\n         * // -> [\n         * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},\n         * // {name: 'left',    value: '<div>',          start: 8,  end: 13},\n         * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},\n         * // {name: 'right',   value: '</div>',         start: 27, end: 33},\n         * // {name: 'between', value: ' example',       start: 33, end: 41}\n         * // ]\n         *\n         * // Omitting unneeded parts with null valueNames, and using escapeChar\n         * str = '...{1}.\\\\{{function(x,y){return {y:x}}}';\n         * XRegExp.matchRecursive(str, '{', '}', 'g', {\n         *   valueNames: ['literal', null, 'value', null],\n         *   escapeChar: '\\\\'\n         * });\n         * // -> [\n         * // {name: 'literal', value: '...',  start: 0, end: 3},\n         * // {name: 'value',   value: '1',    start: 4, end: 5},\n         * // {name: 'literal', value: '.\\\\{', start: 6, end: 9},\n         * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}\n         * // ]\n         *\n         * // Sticky mode via flag y\n         * str = '<1><<<2>>><3>4<5>';\n         * XRegExp.matchRecursive(str, '<', '>', 'gy');\n         * // -> ['1', '<<2>>', '3']\n         */\n        XRegExp.matchRecursive = function (str, left, right, flags, options) {\n            flags = flags || '';\n            options = options || {};\n            var global = flags.indexOf('g') !== -1;\n            var sticky = flags.indexOf('y') !== -1;\n            // Flag `y` is controlled internally\n            var basicFlags = flags.replace(/y/g, '');\n            var escapeChar = options.escapeChar;\n            var vN = options.valueNames;\n            var output = [];\n            var openTokens = 0;\n            var delimStart = 0;\n            var delimEnd = 0;\n            var lastOuterEnd = 0;\n            var outerStart = void 0;\n            var innerStart = void 0;\n            var leftMatch = void 0;\n            var rightMatch = void 0;\n            var esc = void 0;\n            left = XRegExp(left, basicFlags);\n            right = XRegExp(right, basicFlags);\n\n            if (escapeChar) {\n                if (escapeChar.length > 1) {\n                    throw new Error('Cannot use more than one escape character');\n                }\n                escapeChar = XRegExp.escape(escapeChar);\n                // Example of concatenated `esc` regex:\n                // `escapeChar`: '%'\n                // `left`: '<'\n                // `right`: '>'\n                // Regex is: /(?:%[\\S\\s]|(?:(?!<|>)[^%])+)+/\n                esc = new RegExp('(?:' + escapeChar + '[\\\\S\\\\s]|(?:(?!' +\n                // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.\n                // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax\n                // transformation resulting from those flags was already applied to `left` and\n                // `right` when they were passed through the XRegExp constructor above.\n                XRegExp.union([left, right], '', { conjunction: 'or' }).source + ')[^' + escapeChar + '])+)+',\n                // Flags `gy` not needed here\n                flags.replace(/[^imu]+/g, ''));\n            }\n\n            while (true) {\n                // If using an escape character, advance to the delimiter's next starting position,\n                // skipping any escaped characters in between\n                if (escapeChar) {\n                    delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;\n                }\n                leftMatch = XRegExp.exec(str, left, delimEnd);\n                rightMatch = XRegExp.exec(str, right, delimEnd);\n                // Keep the leftmost match only\n                if (leftMatch && rightMatch) {\n                    if (leftMatch.index <= rightMatch.index) {\n                        rightMatch = null;\n                    } else {\n                        leftMatch = null;\n                    }\n                }\n                // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):\n                // LM | RM | OT | Result\n                // 1  | 0  | 1  | loop\n                // 1  | 0  | 0  | loop\n                // 0  | 1  | 1  | loop\n                // 0  | 1  | 0  | throw\n                // 0  | 0  | 1  | throw\n                // 0  | 0  | 0  | break\n                // The paths above don't include the sticky mode special case. The loop ends after the\n                // first completed match if not `global`.\n                if (leftMatch || rightMatch) {\n                    delimStart = (leftMatch || rightMatch).index;\n                    delimEnd = delimStart + (leftMatch || rightMatch)[0].length;\n                } else if (!openTokens) {\n                    break;\n                }\n                if (sticky && !openTokens && delimStart > lastOuterEnd) {\n                    break;\n                }\n                if (leftMatch) {\n                    if (!openTokens) {\n                        outerStart = delimStart;\n                        innerStart = delimEnd;\n                    }\n                    ++openTokens;\n                } else if (rightMatch && openTokens) {\n                    if (! --openTokens) {\n                        if (vN) {\n                            if (vN[0] && outerStart > lastOuterEnd) {\n                                output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));\n                            }\n                            if (vN[1]) {\n                                output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));\n                            }\n                            if (vN[2]) {\n                                output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));\n                            }\n                            if (vN[3]) {\n                                output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));\n                            }\n                        } else {\n                            output.push(str.slice(innerStart, delimStart));\n                        }\n                        lastOuterEnd = delimEnd;\n                        if (!global) {\n                            break;\n                        }\n                    }\n                } else {\n                    throw new Error('Unbalanced delimiter found in string');\n                }\n                // If the delimiter matched an empty string, avoid an infinite loop\n                if (delimStart === delimEnd) {\n                    ++delimEnd;\n                }\n            }\n\n            if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {\n                output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));\n            }\n\n            return output;\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(matchrecursive);\n\n    var unicodeBase = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Base 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2008-2017 MIT License\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds base support for Unicode matching:\n         * - Adds syntax `\\p{..}` for matching Unicode tokens. Tokens can be inverted using `\\P{..}` or\n         *   `\\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the\n         *   braces for token names that are a single letter (e.g. `\\pL` or `PL`).\n         * - Adds flag A (astral), which enables 21-bit Unicode support.\n         * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.\n         *\n         * Unicode Base relies on externally provided Unicode character data. Official addons are\n         * available to provide data for Unicode categories, scripts, blocks, and properties.\n         *\n         * @requires XRegExp\n         */\n\n        // ==--------------------------==\n        // Private stuff\n        // ==--------------------------==\n\n        // Storage for Unicode data\n        var unicode = {};\n\n        // Reuse utils\n        var dec = XRegExp._dec;\n        var hex = XRegExp._hex;\n        var pad4 = XRegExp._pad4;\n\n        // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed\n        function normalize(name) {\n            return name.replace(/[- _]+/g, '').toLowerCase();\n        }\n\n        // Gets the decimal code of a literal code unit, \\xHH, \\uHHHH, or a backslash-escaped literal\n        function charCode(chr) {\n            var esc = /^\\\\[xu](.+)/.exec(chr);\n            return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\\\' ? 1 : 0);\n        }\n\n        // Inverts a list of ordered BMP characters and ranges\n        function invertBmp(range) {\n            var output = '';\n            var lastEnd = -1;\n\n            XRegExp.forEach(range, /(\\\\x..|\\\\u....|\\\\?[\\s\\S])(?:-(\\\\x..|\\\\u....|\\\\?[\\s\\S]))?/, function (m) {\n                var start = charCode(m[1]);\n                if (start > lastEnd + 1) {\n                    output += '\\\\u' + pad4(hex(lastEnd + 1));\n                    if (start > lastEnd + 2) {\n                        output += '-\\\\u' + pad4(hex(start - 1));\n                    }\n                }\n                lastEnd = charCode(m[2] || m[1]);\n            });\n\n            if (lastEnd < 0xFFFF) {\n                output += '\\\\u' + pad4(hex(lastEnd + 1));\n                if (lastEnd < 0xFFFE) {\n                    output += '-\\\\uFFFF';\n                }\n            }\n\n            return output;\n        }\n\n        // Generates an inverted BMP range on first use\n        function cacheInvertedBmp(slug) {\n            var prop = 'b!';\n            return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));\n        }\n\n        // Combines and optionally negates BMP and astral data\n        function buildAstral(slug, isNegated) {\n            var item = unicode[slug];\n            var combined = '';\n\n            if (item.bmp && !item.isBmpLast) {\n                combined = '[' + item.bmp + ']' + (item.astral ? '|' : '');\n            }\n            if (item.astral) {\n                combined += item.astral;\n            }\n            if (item.isBmpLast && item.bmp) {\n                combined += (item.astral ? '|' : '') + '[' + item.bmp + ']';\n            }\n\n            // Astral Unicode tokens always match a code point, never a code unit\n            return isNegated ? '(?:(?!' + combined + ')(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\0-\\uFFFF]))' : '(?:' + combined + ')';\n        }\n\n        // Builds a complete astral pattern on first use\n        function cacheAstral(slug, isNegated) {\n            var prop = isNegated ? 'a!' : 'a=';\n            return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));\n        }\n\n        // ==--------------------------==\n        // Core functionality\n        // ==--------------------------==\n\n        /*\n         * Add astral mode (flag A) and Unicode token syntax: `\\p{..}`, `\\P{..}`, `\\p{^..}`, `\\pC`.\n         */\n        XRegExp.addToken(\n        // Use `*` instead of `+` to avoid capturing `^` as the token name in `\\p{^}`\n        /\\\\([pP])(?:{(\\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {\n            var ERR_DOUBLE_NEG = 'Invalid double negation ';\n            var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';\n            var ERR_UNKNOWN_REF = 'Unicode token missing data ';\n            var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';\n            var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';\n            // Negated via \\P{..} or \\p{^..}\n            var isNegated = match[1] === 'P' || !!match[2];\n            // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A\n            var isAstralMode = flags.indexOf('A') !== -1;\n            // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\\p{}`\n            var slug = normalize(match[4] || match[3]);\n            // Token data object\n            var item = unicode[slug];\n\n            if (match[1] === 'P' && match[2]) {\n                throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);\n            }\n            if (!unicode.hasOwnProperty(slug)) {\n                throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);\n            }\n\n            // Switch to the negated form of the referenced Unicode token\n            if (item.inverseOf) {\n                slug = normalize(item.inverseOf);\n                if (!unicode.hasOwnProperty(slug)) {\n                    throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf);\n                }\n                item = unicode[slug];\n                isNegated = !isNegated;\n            }\n\n            if (!(item.bmp || isAstralMode)) {\n                throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);\n            }\n            if (isAstralMode) {\n                if (scope === 'class') {\n                    throw new SyntaxError(ERR_ASTRAL_IN_CLASS);\n                }\n\n                return cacheAstral(slug, isNegated);\n            }\n\n            return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : (isNegated ? '[^' : '[') + item.bmp + ']';\n        }, {\n            scope: 'all',\n            optionalFlags: 'A',\n            leadChar: '\\\\'\n        });\n\n        /**\n         * Adds to the list of Unicode tokens that XRegExp regexes can match via `\\p` or `\\P`.\n         *\n         * @memberOf XRegExp\n         * @param {Array} data Objects with named character ranges. Each object may have properties\n         *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are\n         *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If\n         *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,\n         *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are\n         *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and\n         *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan\n         *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and\n         *   `astral` data should be a combination of literal characters and `\\xHH` or `\\uHHHH` escape\n         *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be\n         *   escaped, apart from range-creating hyphens. The `astral` data can additionally use\n         *   character classes and alternation, and should use surrogate pairs to represent astral code\n         *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is\n         *   defined as the exact inverse of another token.\n         * @example\n         *\n         * // Basic use\n         * XRegExp.addUnicodeData([{\n         *   name: 'XDigit',\n         *   alias: 'Hexadecimal',\n         *   bmp: '0-9A-Fa-f'\n         * }]);\n         * XRegExp('\\\\p{XDigit}:\\\\p{Hexadecimal}+').test('0:3D'); // -> true\n         */\n        XRegExp.addUnicodeData = function (data) {\n            var ERR_NO_NAME = 'Unicode token requires name';\n            var ERR_NO_DATA = 'Unicode token has no character data ';\n            var item = void 0;\n\n            for (var i = 0; i < data.length; ++i) {\n                item = data[i];\n                if (!item.name) {\n                    throw new Error(ERR_NO_NAME);\n                }\n                if (!(item.inverseOf || item.bmp || item.astral)) {\n                    throw new Error(ERR_NO_DATA + item.name);\n                }\n                unicode[normalize(item.name)] = item;\n                if (item.alias) {\n                    unicode[normalize(item.alias)] = item;\n                }\n            }\n\n            // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and\n            // flags might now produce different results\n            XRegExp.cache.flush('patterns');\n        };\n\n        /**\n         * @ignore\n         *\n         * Return a reference to the internal Unicode definition structure for the given Unicode\n         * Property if the given name is a legal Unicode Property for use in XRegExp `\\p` or `\\P` regex\n         * constructs.\n         *\n         * @memberOf XRegExp\n         * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),\n         *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode\n         *   Properties and Property Aliases.\n         * @returns {Object} Reference to definition structure when the name matches a Unicode Property.\n         *\n         * @note\n         * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.\n         *\n         * @note\n         * This method is *not* part of the officially documented API and may change or be removed in\n         * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode\n         * structures set up by XRegExp.\n         */\n        XRegExp._getUnicodeProperty = function (name) {\n            var slug = normalize(name);\n            return unicode[slug];\n        };\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeBase);\n\n    var unicodeBlocks = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Blocks 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,\n         * `\\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and\n         * underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'InAdlam',\n            astral: '\\uD83A[\\uDD00-\\uDD5F]'\n        }, {\n            name: 'InAegean_Numbers',\n            astral: '\\uD800[\\uDD00-\\uDD3F]'\n        }, {\n            name: 'InAhom',\n            astral: '\\uD805[\\uDF00-\\uDF3F]'\n        }, {\n            name: 'InAlchemical_Symbols',\n            astral: '\\uD83D[\\uDF00-\\uDF7F]'\n        }, {\n            name: 'InAlphabetic_Presentation_Forms',\n            bmp: '\\uFB00-\\uFB4F'\n        }, {\n            name: 'InAnatolian_Hieroglyphs',\n            astral: '\\uD811[\\uDC00-\\uDE7F]'\n        }, {\n            name: 'InAncient_Greek_Musical_Notation',\n            astral: '\\uD834[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InAncient_Greek_Numbers',\n            astral: '\\uD800[\\uDD40-\\uDD8F]'\n        }, {\n            name: 'InAncient_Symbols',\n            astral: '\\uD800[\\uDD90-\\uDDCF]'\n        }, {\n            name: 'InArabic',\n            bmp: '\\u0600-\\u06FF'\n        }, {\n            name: 'InArabic_Extended_A',\n            bmp: '\\u08A0-\\u08FF'\n        }, {\n            name: 'InArabic_Mathematical_Alphabetic_Symbols',\n            astral: '\\uD83B[\\uDE00-\\uDEFF]'\n        }, {\n            name: 'InArabic_Presentation_Forms_A',\n            bmp: '\\uFB50-\\uFDFF'\n        }, {\n            name: 'InArabic_Presentation_Forms_B',\n            bmp: '\\uFE70-\\uFEFF'\n        }, {\n            name: 'InArabic_Supplement',\n            bmp: '\\u0750-\\u077F'\n        }, {\n            name: 'InArmenian',\n            bmp: '\\u0530-\\u058F'\n        }, {\n            name: 'InArrows',\n            bmp: '\\u2190-\\u21FF'\n        }, {\n            name: 'InAvestan',\n            astral: '\\uD802[\\uDF00-\\uDF3F]'\n        }, {\n            name: 'InBalinese',\n            bmp: '\\u1B00-\\u1B7F'\n        }, {\n            name: 'InBamum',\n            bmp: '\\uA6A0-\\uA6FF'\n        }, {\n            name: 'InBamum_Supplement',\n            astral: '\\uD81A[\\uDC00-\\uDE3F]'\n        }, {\n            name: 'InBasic_Latin',\n            bmp: '\\0-\\x7F'\n        }, {\n            name: 'InBassa_Vah',\n            astral: '\\uD81A[\\uDED0-\\uDEFF]'\n        }, {\n            name: 'InBatak',\n            bmp: '\\u1BC0-\\u1BFF'\n        }, {\n            name: 'InBengali',\n            bmp: '\\u0980-\\u09FF'\n        }, {\n            name: 'InBhaiksuki',\n            astral: '\\uD807[\\uDC00-\\uDC6F]'\n        }, {\n            name: 'InBlock_Elements',\n            bmp: '\\u2580-\\u259F'\n        }, {\n            name: 'InBopomofo',\n            bmp: '\\u3100-\\u312F'\n        }, {\n            name: 'InBopomofo_Extended',\n            bmp: '\\u31A0-\\u31BF'\n        }, {\n            name: 'InBox_Drawing',\n            bmp: '\\u2500-\\u257F'\n        }, {\n            name: 'InBrahmi',\n            astral: '\\uD804[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InBraille_Patterns',\n            bmp: '\\u2800-\\u28FF'\n        }, {\n            name: 'InBuginese',\n            bmp: '\\u1A00-\\u1A1F'\n        }, {\n            name: 'InBuhid',\n            bmp: '\\u1740-\\u175F'\n        }, {\n            name: 'InByzantine_Musical_Symbols',\n            astral: '\\uD834[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InCJK_Compatibility',\n            bmp: '\\u3300-\\u33FF'\n        }, {\n            name: 'InCJK_Compatibility_Forms',\n            bmp: '\\uFE30-\\uFE4F'\n        }, {\n            name: 'InCJK_Compatibility_Ideographs',\n            bmp: '\\uF900-\\uFAFF'\n        }, {\n            name: 'InCJK_Compatibility_Ideographs_Supplement',\n            astral: '\\uD87E[\\uDC00-\\uDE1F]'\n        }, {\n            name: 'InCJK_Radicals_Supplement',\n            bmp: '\\u2E80-\\u2EFF'\n        }, {\n            name: 'InCJK_Strokes',\n            bmp: '\\u31C0-\\u31EF'\n        }, {\n            name: 'InCJK_Symbols_and_Punctuation',\n            bmp: '\\u3000-\\u303F'\n        }, {\n            name: 'InCJK_Unified_Ideographs',\n            bmp: '\\u4E00-\\u9FFF'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_A',\n            bmp: '\\u3400-\\u4DBF'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_B',\n            astral: '[\\uD840-\\uD868][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDEDF]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_C',\n            astral: '\\uD869[\\uDF00-\\uDFFF]|[\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF3F]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_D',\n            astral: '\\uD86D[\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1F]'\n        }, {\n            name: 'InCJK_Unified_Ideographs_Extension_E',\n            astral: '\\uD86E[\\uDC20-\\uDFFF]|[\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD873[\\uDC00-\\uDEAF]'\n        }, {\n            name: 'InCarian',\n            astral: '\\uD800[\\uDEA0-\\uDEDF]'\n        }, {\n            name: 'InCaucasian_Albanian',\n            astral: '\\uD801[\\uDD30-\\uDD6F]'\n        }, {\n            name: 'InChakma',\n            astral: '\\uD804[\\uDD00-\\uDD4F]'\n        }, {\n            name: 'InCham',\n            bmp: '\\uAA00-\\uAA5F'\n        }, {\n            name: 'InCherokee',\n            bmp: '\\u13A0-\\u13FF'\n        }, {\n            name: 'InCherokee_Supplement',\n            bmp: '\\uAB70-\\uABBF'\n        }, {\n            name: 'InCombining_Diacritical_Marks',\n            bmp: '\\u0300-\\u036F'\n        }, {\n            name: 'InCombining_Diacritical_Marks_Extended',\n            bmp: '\\u1AB0-\\u1AFF'\n        }, {\n            name: 'InCombining_Diacritical_Marks_Supplement',\n            bmp: '\\u1DC0-\\u1DFF'\n        }, {\n            name: 'InCombining_Diacritical_Marks_for_Symbols',\n            bmp: '\\u20D0-\\u20FF'\n        }, {\n            name: 'InCombining_Half_Marks',\n            bmp: '\\uFE20-\\uFE2F'\n        }, {\n            name: 'InCommon_Indic_Number_Forms',\n            bmp: '\\uA830-\\uA83F'\n        }, {\n            name: 'InControl_Pictures',\n            bmp: '\\u2400-\\u243F'\n        }, {\n            name: 'InCoptic',\n            bmp: '\\u2C80-\\u2CFF'\n        }, {\n            name: 'InCoptic_Epact_Numbers',\n            astral: '\\uD800[\\uDEE0-\\uDEFF]'\n        }, {\n            name: 'InCounting_Rod_Numerals',\n            astral: '\\uD834[\\uDF60-\\uDF7F]'\n        }, {\n            name: 'InCuneiform',\n            astral: '\\uD808[\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InCuneiform_Numbers_and_Punctuation',\n            astral: '\\uD809[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InCurrency_Symbols',\n            bmp: '\\u20A0-\\u20CF'\n        }, {\n            name: 'InCypriot_Syllabary',\n            astral: '\\uD802[\\uDC00-\\uDC3F]'\n        }, {\n            name: 'InCyrillic',\n            bmp: '\\u0400-\\u04FF'\n        }, {\n            name: 'InCyrillic_Extended_A',\n            bmp: '\\u2DE0-\\u2DFF'\n        }, {\n            name: 'InCyrillic_Extended_B',\n            bmp: '\\uA640-\\uA69F'\n        }, {\n            name: 'InCyrillic_Extended_C',\n            bmp: '\\u1C80-\\u1C8F'\n        }, {\n            name: 'InCyrillic_Supplement',\n            bmp: '\\u0500-\\u052F'\n        }, {\n            name: 'InDeseret',\n            astral: '\\uD801[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'InDevanagari',\n            bmp: '\\u0900-\\u097F'\n        }, {\n            name: 'InDevanagari_Extended',\n            bmp: '\\uA8E0-\\uA8FF'\n        }, {\n            name: 'InDingbats',\n            bmp: '\\u2700-\\u27BF'\n        }, {\n            name: 'InDomino_Tiles',\n            astral: '\\uD83C[\\uDC30-\\uDC9F]'\n        }, {\n            name: 'InDuployan',\n            astral: '\\uD82F[\\uDC00-\\uDC9F]'\n        }, {\n            name: 'InEarly_Dynastic_Cuneiform',\n            astral: '\\uD809[\\uDC80-\\uDD4F]'\n        }, {\n            name: 'InEgyptian_Hieroglyphs',\n            astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InElbasan',\n            astral: '\\uD801[\\uDD00-\\uDD2F]'\n        }, {\n            name: 'InEmoticons',\n            astral: '\\uD83D[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InEnclosed_Alphanumeric_Supplement',\n            astral: '\\uD83C[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InEnclosed_Alphanumerics',\n            bmp: '\\u2460-\\u24FF'\n        }, {\n            name: 'InEnclosed_CJK_Letters_and_Months',\n            bmp: '\\u3200-\\u32FF'\n        }, {\n            name: 'InEnclosed_Ideographic_Supplement',\n            astral: '\\uD83C[\\uDE00-\\uDEFF]'\n        }, {\n            name: 'InEthiopic',\n            bmp: '\\u1200-\\u137F'\n        }, {\n            name: 'InEthiopic_Extended',\n            bmp: '\\u2D80-\\u2DDF'\n        }, {\n            name: 'InEthiopic_Extended_A',\n            bmp: '\\uAB00-\\uAB2F'\n        }, {\n            name: 'InEthiopic_Supplement',\n            bmp: '\\u1380-\\u139F'\n        }, {\n            name: 'InGeneral_Punctuation',\n            bmp: '\\u2000-\\u206F'\n        }, {\n            name: 'InGeometric_Shapes',\n            bmp: '\\u25A0-\\u25FF'\n        }, {\n            name: 'InGeometric_Shapes_Extended',\n            astral: '\\uD83D[\\uDF80-\\uDFFF]'\n        }, {\n            name: 'InGeorgian',\n            bmp: '\\u10A0-\\u10FF'\n        }, {\n            name: 'InGeorgian_Supplement',\n            bmp: '\\u2D00-\\u2D2F'\n        }, {\n            name: 'InGlagolitic',\n            bmp: '\\u2C00-\\u2C5F'\n        }, {\n            name: 'InGlagolitic_Supplement',\n            astral: '\\uD838[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InGothic',\n            astral: '\\uD800[\\uDF30-\\uDF4F]'\n        }, {\n            name: 'InGrantha',\n            astral: '\\uD804[\\uDF00-\\uDF7F]'\n        }, {\n            name: 'InGreek_Extended',\n            bmp: '\\u1F00-\\u1FFF'\n        }, {\n            name: 'InGreek_and_Coptic',\n            bmp: '\\u0370-\\u03FF'\n        }, {\n            name: 'InGujarati',\n            bmp: '\\u0A80-\\u0AFF'\n        }, {\n            name: 'InGurmukhi',\n            bmp: '\\u0A00-\\u0A7F'\n        }, {\n            name: 'InHalfwidth_and_Fullwidth_Forms',\n            bmp: '\\uFF00-\\uFFEF'\n        }, {\n            name: 'InHangul_Compatibility_Jamo',\n            bmp: '\\u3130-\\u318F'\n        }, {\n            name: 'InHangul_Jamo',\n            bmp: '\\u1100-\\u11FF'\n        }, {\n            name: 'InHangul_Jamo_Extended_A',\n            bmp: '\\uA960-\\uA97F'\n        }, {\n            name: 'InHangul_Jamo_Extended_B',\n            bmp: '\\uD7B0-\\uD7FF'\n        }, {\n            name: 'InHangul_Syllables',\n            bmp: '\\uAC00-\\uD7AF'\n        }, {\n            name: 'InHanunoo',\n            bmp: '\\u1720-\\u173F'\n        }, {\n            name: 'InHatran',\n            astral: '\\uD802[\\uDCE0-\\uDCFF]'\n        }, {\n            name: 'InHebrew',\n            bmp: '\\u0590-\\u05FF'\n        }, {\n            name: 'InHigh_Private_Use_Surrogates',\n            bmp: '\\uDB80-\\uDBFF'\n        }, {\n            name: 'InHigh_Surrogates',\n            bmp: '\\uD800-\\uDB7F'\n        }, {\n            name: 'InHiragana',\n            bmp: '\\u3040-\\u309F'\n        }, {\n            name: 'InIPA_Extensions',\n            bmp: '\\u0250-\\u02AF'\n        }, {\n            name: 'InIdeographic_Description_Characters',\n            bmp: '\\u2FF0-\\u2FFF'\n        }, {\n            name: 'InIdeographic_Symbols_and_Punctuation',\n            astral: '\\uD81B[\\uDFE0-\\uDFFF]'\n        }, {\n            name: 'InImperial_Aramaic',\n            astral: '\\uD802[\\uDC40-\\uDC5F]'\n        }, {\n            name: 'InInscriptional_Pahlavi',\n            astral: '\\uD802[\\uDF60-\\uDF7F]'\n        }, {\n            name: 'InInscriptional_Parthian',\n            astral: '\\uD802[\\uDF40-\\uDF5F]'\n        }, {\n            name: 'InJavanese',\n            bmp: '\\uA980-\\uA9DF'\n        }, {\n            name: 'InKaithi',\n            astral: '\\uD804[\\uDC80-\\uDCCF]'\n        }, {\n            name: 'InKana_Supplement',\n            astral: '\\uD82C[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InKanbun',\n            bmp: '\\u3190-\\u319F'\n        }, {\n            name: 'InKangxi_Radicals',\n            bmp: '\\u2F00-\\u2FDF'\n        }, {\n            name: 'InKannada',\n            bmp: '\\u0C80-\\u0CFF'\n        }, {\n            name: 'InKatakana',\n            bmp: '\\u30A0-\\u30FF'\n        }, {\n            name: 'InKatakana_Phonetic_Extensions',\n            bmp: '\\u31F0-\\u31FF'\n        }, {\n            name: 'InKayah_Li',\n            bmp: '\\uA900-\\uA92F'\n        }, {\n            name: 'InKharoshthi',\n            astral: '\\uD802[\\uDE00-\\uDE5F]'\n        }, {\n            name: 'InKhmer',\n            bmp: '\\u1780-\\u17FF'\n        }, {\n            name: 'InKhmer_Symbols',\n            bmp: '\\u19E0-\\u19FF'\n        }, {\n            name: 'InKhojki',\n            astral: '\\uD804[\\uDE00-\\uDE4F]'\n        }, {\n            name: 'InKhudawadi',\n            astral: '\\uD804[\\uDEB0-\\uDEFF]'\n        }, {\n            name: 'InLao',\n            bmp: '\\u0E80-\\u0EFF'\n        }, {\n            name: 'InLatin_Extended_Additional',\n            bmp: '\\u1E00-\\u1EFF'\n        }, {\n            name: 'InLatin_Extended_A',\n            bmp: '\\u0100-\\u017F'\n        }, {\n            name: 'InLatin_Extended_B',\n            bmp: '\\u0180-\\u024F'\n        }, {\n            name: 'InLatin_Extended_C',\n            bmp: '\\u2C60-\\u2C7F'\n        }, {\n            name: 'InLatin_Extended_D',\n            bmp: '\\uA720-\\uA7FF'\n        }, {\n            name: 'InLatin_Extended_E',\n            bmp: '\\uAB30-\\uAB6F'\n        }, {\n            name: 'InLatin_1_Supplement',\n            bmp: '\\x80-\\xFF'\n        }, {\n            name: 'InLepcha',\n            bmp: '\\u1C00-\\u1C4F'\n        }, {\n            name: 'InLetterlike_Symbols',\n            bmp: '\\u2100-\\u214F'\n        }, {\n            name: 'InLimbu',\n            bmp: '\\u1900-\\u194F'\n        }, {\n            name: 'InLinear_A',\n            astral: '\\uD801[\\uDE00-\\uDF7F]'\n        }, {\n            name: 'InLinear_B_Ideograms',\n            astral: '\\uD800[\\uDC80-\\uDCFF]'\n        }, {\n            name: 'InLinear_B_Syllabary',\n            astral: '\\uD800[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InLisu',\n            bmp: '\\uA4D0-\\uA4FF'\n        }, {\n            name: 'InLow_Surrogates',\n            bmp: '\\uDC00-\\uDFFF'\n        }, {\n            name: 'InLycian',\n            astral: '\\uD800[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'InLydian',\n            astral: '\\uD802[\\uDD20-\\uDD3F]'\n        }, {\n            name: 'InMahajani',\n            astral: '\\uD804[\\uDD50-\\uDD7F]'\n        }, {\n            name: 'InMahjong_Tiles',\n            astral: '\\uD83C[\\uDC00-\\uDC2F]'\n        }, {\n            name: 'InMalayalam',\n            bmp: '\\u0D00-\\u0D7F'\n        }, {\n            name: 'InMandaic',\n            bmp: '\\u0840-\\u085F'\n        }, {\n            name: 'InManichaean',\n            astral: '\\uD802[\\uDEC0-\\uDEFF]'\n        }, {\n            name: 'InMarchen',\n            astral: '\\uD807[\\uDC70-\\uDCBF]'\n        }, {\n            name: 'InMathematical_Alphanumeric_Symbols',\n            astral: '\\uD835[\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InMathematical_Operators',\n            bmp: '\\u2200-\\u22FF'\n        }, {\n            name: 'InMeetei_Mayek',\n            bmp: '\\uABC0-\\uABFF'\n        }, {\n            name: 'InMeetei_Mayek_Extensions',\n            bmp: '\\uAAE0-\\uAAFF'\n        }, {\n            name: 'InMende_Kikakui',\n            astral: '\\uD83A[\\uDC00-\\uDCDF]'\n        }, {\n            name: 'InMeroitic_Cursive',\n            astral: '\\uD802[\\uDDA0-\\uDDFF]'\n        }, {\n            name: 'InMeroitic_Hieroglyphs',\n            astral: '\\uD802[\\uDD80-\\uDD9F]'\n        }, {\n            name: 'InMiao',\n            astral: '\\uD81B[\\uDF00-\\uDF9F]'\n        }, {\n            name: 'InMiscellaneous_Mathematical_Symbols_A',\n            bmp: '\\u27C0-\\u27EF'\n        }, {\n            name: 'InMiscellaneous_Mathematical_Symbols_B',\n            bmp: '\\u2980-\\u29FF'\n        }, {\n            name: 'InMiscellaneous_Symbols',\n            bmp: '\\u2600-\\u26FF'\n        }, {\n            name: 'InMiscellaneous_Symbols_and_Arrows',\n            bmp: '\\u2B00-\\u2BFF'\n        }, {\n            name: 'InMiscellaneous_Symbols_and_Pictographs',\n            astral: '\\uD83C[\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDDFF]'\n        }, {\n            name: 'InMiscellaneous_Technical',\n            bmp: '\\u2300-\\u23FF'\n        }, {\n            name: 'InModi',\n            astral: '\\uD805[\\uDE00-\\uDE5F]'\n        }, {\n            name: 'InModifier_Tone_Letters',\n            bmp: '\\uA700-\\uA71F'\n        }, {\n            name: 'InMongolian',\n            bmp: '\\u1800-\\u18AF'\n        }, {\n            name: 'InMongolian_Supplement',\n            astral: '\\uD805[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InMro',\n            astral: '\\uD81A[\\uDE40-\\uDE6F]'\n        }, {\n            name: 'InMultani',\n            astral: '\\uD804[\\uDE80-\\uDEAF]'\n        }, {\n            name: 'InMusical_Symbols',\n            astral: '\\uD834[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InMyanmar',\n            bmp: '\\u1000-\\u109F'\n        }, {\n            name: 'InMyanmar_Extended_A',\n            bmp: '\\uAA60-\\uAA7F'\n        }, {\n            name: 'InMyanmar_Extended_B',\n            bmp: '\\uA9E0-\\uA9FF'\n        }, {\n            name: 'InNKo',\n            bmp: '\\u07C0-\\u07FF'\n        }, {\n            name: 'InNabataean',\n            astral: '\\uD802[\\uDC80-\\uDCAF]'\n        }, {\n            name: 'InNew_Tai_Lue',\n            bmp: '\\u1980-\\u19DF'\n        }, {\n            name: 'InNewa',\n            astral: '\\uD805[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InNumber_Forms',\n            bmp: '\\u2150-\\u218F'\n        }, {\n            name: 'InOgham',\n            bmp: '\\u1680-\\u169F'\n        }, {\n            name: 'InOl_Chiki',\n            bmp: '\\u1C50-\\u1C7F'\n        }, {\n            name: 'InOld_Hungarian',\n            astral: '\\uD803[\\uDC80-\\uDCFF]'\n        }, {\n            name: 'InOld_Italic',\n            astral: '\\uD800[\\uDF00-\\uDF2F]'\n        }, {\n            name: 'InOld_North_Arabian',\n            astral: '\\uD802[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'InOld_Permic',\n            astral: '\\uD800[\\uDF50-\\uDF7F]'\n        }, {\n            name: 'InOld_Persian',\n            astral: '\\uD800[\\uDFA0-\\uDFDF]'\n        }, {\n            name: 'InOld_South_Arabian',\n            astral: '\\uD802[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InOld_Turkic',\n            astral: '\\uD803[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'InOptical_Character_Recognition',\n            bmp: '\\u2440-\\u245F'\n        }, {\n            name: 'InOriya',\n            bmp: '\\u0B00-\\u0B7F'\n        }, {\n            name: 'InOrnamental_Dingbats',\n            astral: '\\uD83D[\\uDE50-\\uDE7F]'\n        }, {\n            name: 'InOsage',\n            astral: '\\uD801[\\uDCB0-\\uDCFF]'\n        }, {\n            name: 'InOsmanya',\n            astral: '\\uD801[\\uDC80-\\uDCAF]'\n        }, {\n            name: 'InPahawh_Hmong',\n            astral: '\\uD81A[\\uDF00-\\uDF8F]'\n        }, {\n            name: 'InPalmyrene',\n            astral: '\\uD802[\\uDC60-\\uDC7F]'\n        }, {\n            name: 'InPau_Cin_Hau',\n            astral: '\\uD806[\\uDEC0-\\uDEFF]'\n        }, {\n            name: 'InPhags_pa',\n            bmp: '\\uA840-\\uA87F'\n        }, {\n            name: 'InPhaistos_Disc',\n            astral: '\\uD800[\\uDDD0-\\uDDFF]'\n        }, {\n            name: 'InPhoenician',\n            astral: '\\uD802[\\uDD00-\\uDD1F]'\n        }, {\n            name: 'InPhonetic_Extensions',\n            bmp: '\\u1D00-\\u1D7F'\n        }, {\n            name: 'InPhonetic_Extensions_Supplement',\n            bmp: '\\u1D80-\\u1DBF'\n        }, {\n            name: 'InPlaying_Cards',\n            astral: '\\uD83C[\\uDCA0-\\uDCFF]'\n        }, {\n            name: 'InPrivate_Use_Area',\n            bmp: '\\uE000-\\uF8FF'\n        }, {\n            name: 'InPsalter_Pahlavi',\n            astral: '\\uD802[\\uDF80-\\uDFAF]'\n        }, {\n            name: 'InRejang',\n            bmp: '\\uA930-\\uA95F'\n        }, {\n            name: 'InRumi_Numeral_Symbols',\n            astral: '\\uD803[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'InRunic',\n            bmp: '\\u16A0-\\u16FF'\n        }, {\n            name: 'InSamaritan',\n            bmp: '\\u0800-\\u083F'\n        }, {\n            name: 'InSaurashtra',\n            bmp: '\\uA880-\\uA8DF'\n        }, {\n            name: 'InSharada',\n            astral: '\\uD804[\\uDD80-\\uDDDF]'\n        }, {\n            name: 'InShavian',\n            astral: '\\uD801[\\uDC50-\\uDC7F]'\n        }, {\n            name: 'InShorthand_Format_Controls',\n            astral: '\\uD82F[\\uDCA0-\\uDCAF]'\n        }, {\n            name: 'InSiddham',\n            astral: '\\uD805[\\uDD80-\\uDDFF]'\n        }, {\n            name: 'InSinhala',\n            bmp: '\\u0D80-\\u0DFF'\n        }, {\n            name: 'InSinhala_Archaic_Numbers',\n            astral: '\\uD804[\\uDDE0-\\uDDFF]'\n        }, {\n            name: 'InSmall_Form_Variants',\n            bmp: '\\uFE50-\\uFE6F'\n        }, {\n            name: 'InSora_Sompeng',\n            astral: '\\uD804[\\uDCD0-\\uDCFF]'\n        }, {\n            name: 'InSpacing_Modifier_Letters',\n            bmp: '\\u02B0-\\u02FF'\n        }, {\n            name: 'InSpecials',\n            bmp: '\\uFFF0-\\uFFFF'\n        }, {\n            name: 'InSundanese',\n            bmp: '\\u1B80-\\u1BBF'\n        }, {\n            name: 'InSundanese_Supplement',\n            bmp: '\\u1CC0-\\u1CCF'\n        }, {\n            name: 'InSuperscripts_and_Subscripts',\n            bmp: '\\u2070-\\u209F'\n        }, {\n            name: 'InSupplemental_Arrows_A',\n            bmp: '\\u27F0-\\u27FF'\n        }, {\n            name: 'InSupplemental_Arrows_B',\n            bmp: '\\u2900-\\u297F'\n        }, {\n            name: 'InSupplemental_Arrows_C',\n            astral: '\\uD83E[\\uDC00-\\uDCFF]'\n        }, {\n            name: 'InSupplemental_Mathematical_Operators',\n            bmp: '\\u2A00-\\u2AFF'\n        }, {\n            name: 'InSupplemental_Punctuation',\n            bmp: '\\u2E00-\\u2E7F'\n        }, {\n            name: 'InSupplemental_Symbols_and_Pictographs',\n            astral: '\\uD83E[\\uDD00-\\uDDFF]'\n        }, {\n            name: 'InSupplementary_Private_Use_Area_A',\n            astral: '[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InSupplementary_Private_Use_Area_B',\n            astral: '[\\uDBC0-\\uDBFF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InSutton_SignWriting',\n            astral: '\\uD836[\\uDC00-\\uDEAF]'\n        }, {\n            name: 'InSyloti_Nagri',\n            bmp: '\\uA800-\\uA82F'\n        }, {\n            name: 'InSyriac',\n            bmp: '\\u0700-\\u074F'\n        }, {\n            name: 'InTagalog',\n            bmp: '\\u1700-\\u171F'\n        }, {\n            name: 'InTagbanwa',\n            bmp: '\\u1760-\\u177F'\n        }, {\n            name: 'InTags',\n            astral: '\\uDB40[\\uDC00-\\uDC7F]'\n        }, {\n            name: 'InTai_Le',\n            bmp: '\\u1950-\\u197F'\n        }, {\n            name: 'InTai_Tham',\n            bmp: '\\u1A20-\\u1AAF'\n        }, {\n            name: 'InTai_Viet',\n            bmp: '\\uAA80-\\uAADF'\n        }, {\n            name: 'InTai_Xuan_Jing_Symbols',\n            astral: '\\uD834[\\uDF00-\\uDF5F]'\n        }, {\n            name: 'InTakri',\n            astral: '\\uD805[\\uDE80-\\uDECF]'\n        }, {\n            name: 'InTamil',\n            bmp: '\\u0B80-\\u0BFF'\n        }, {\n            name: 'InTangut',\n            astral: '[\\uD81C-\\uD821][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'InTangut_Components',\n            astral: '\\uD822[\\uDC00-\\uDEFF]'\n        }, {\n            name: 'InTelugu',\n            bmp: '\\u0C00-\\u0C7F'\n        }, {\n            name: 'InThaana',\n            bmp: '\\u0780-\\u07BF'\n        }, {\n            name: 'InThai',\n            bmp: '\\u0E00-\\u0E7F'\n        }, {\n            name: 'InTibetan',\n            bmp: '\\u0F00-\\u0FFF'\n        }, {\n            name: 'InTifinagh',\n            bmp: '\\u2D30-\\u2D7F'\n        }, {\n            name: 'InTirhuta',\n            astral: '\\uD805[\\uDC80-\\uDCDF]'\n        }, {\n            name: 'InTransport_and_Map_Symbols',\n            astral: '\\uD83D[\\uDE80-\\uDEFF]'\n        }, {\n            name: 'InUgaritic',\n            astral: '\\uD800[\\uDF80-\\uDF9F]'\n        }, {\n            name: 'InUnified_Canadian_Aboriginal_Syllabics',\n            bmp: '\\u1400-\\u167F'\n        }, {\n            name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended',\n            bmp: '\\u18B0-\\u18FF'\n        }, {\n            name: 'InVai',\n            bmp: '\\uA500-\\uA63F'\n        }, {\n            name: 'InVariation_Selectors',\n            bmp: '\\uFE00-\\uFE0F'\n        }, {\n            name: 'InVariation_Selectors_Supplement',\n            astral: '\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'InVedic_Extensions',\n            bmp: '\\u1CD0-\\u1CFF'\n        }, {\n            name: 'InVertical_Forms',\n            bmp: '\\uFE10-\\uFE1F'\n        }, {\n            name: 'InWarang_Citi',\n            astral: '\\uD806[\\uDCA0-\\uDCFF]'\n        }, {\n            name: 'InYi_Radicals',\n            bmp: '\\uA490-\\uA4CF'\n        }, {\n            name: 'InYi_Syllables',\n            bmp: '\\uA000-\\uA48F'\n        }, {\n            name: 'InYijing_Hexagram_Symbols',\n            bmp: '\\u4DC0-\\u4DFF'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeBlocks);\n\n    var unicodeCategories = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Categories 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for Unicode's general categories. E.g., `\\p{Lu}` or `\\p{Uppercase Letter}`. See\n         * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token\n         * names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'C',\n            alias: 'Other',\n            isBmpLast: true,\n            bmp: '\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u08E2\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180E\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',\n            astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCBD\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA0-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDD73-\\uDD7A\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]'\n        }, {\n            name: 'Cc',\n            alias: 'Control',\n            bmp: '\\0-\\x1F\\x7F-\\x9F'\n        }, {\n            name: 'Cf',\n            alias: 'Format',\n            bmp: '\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB',\n            astral: '\\uD804\\uDCBD|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n        }, {\n            name: 'Cn',\n            alias: 'Unassigned',\n            bmp: '\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u05FF\\u061D\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF',\n            astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n        }, {\n            name: 'Co',\n            alias: 'Private_Use',\n            bmp: '\\uE000-\\uF8FF',\n            astral: '[\\uDB80-\\uDBBE\\uDBC0-\\uDBFE][\\uDC00-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDC00-\\uDFFD]'\n        }, {\n            name: 'Cs',\n            alias: 'Surrogate',\n            bmp: '\\uD800-\\uDFFF'\n        }, {\n            name: 'L',\n            alias: 'Letter',\n            bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Ll',\n            alias: 'Lowercase_Letter',\n            bmp: 'a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n            astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n        }, {\n            name: 'Lm',\n            alias: 'Modifier_Letter',\n            bmp: '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E\\uFF9F',\n            astral: '\\uD81A[\\uDF40-\\uDF43]|\\uD81B[\\uDF93-\\uDF9F\\uDFE0]'\n        }, {\n            name: 'Lo',\n            alias: 'Other_Letter',\n            bmp: '\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC50-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Lt',\n            alias: 'Titlecase_Letter',\n            bmp: '\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC'\n        }, {\n            name: 'Lu',\n            alias: 'Uppercase_Letter',\n            bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n            astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]'\n        }, {\n            name: 'M',\n            alias: 'Mark',\n            bmp: '\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n            astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDDCA-\\uDDCC\\uDE2C-\\uDE37\\uDE3E\\uDEDF-\\uDEEA\\uDF00-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC35-\\uDC46\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDDDC\\uDDDD\\uDE30-\\uDE40\\uDEAB-\\uDEB7\\uDF1D-\\uDF2B]|\\uD807[\\uDC2F-\\uDC36\\uDC38-\\uDC3F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'Mc',\n            alias: 'Spacing_Mark',\n            bmp: '\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\u1CF3\\u302E\\u302F\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC',\n            astral: '\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3E\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB0-\\uDCB2\\uDCB9\\uDCBB-\\uDCBE\\uDCC1\\uDDAF-\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF20\\uDF21\\uDF26]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4]|\\uD81B[\\uDF51-\\uDF7E]|\\uD834[\\uDD65\\uDD66\\uDD6D-\\uDD72]'\n        }, {\n            name: 'Me',\n            alias: 'Enclosing_Mark',\n            bmp: '\\u0488\\u0489\\u1ABE\\u20DD-\\u20E0\\u20E2-\\u20E4\\uA670-\\uA672'\n        }, {\n            name: 'Mn',\n            alias: 'Nonspacing_Mark',\n            bmp: '\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D01\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n            astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDCA-\\uDDCC\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3C\\uDF40\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDCB3-\\uDCB8\\uDCBA\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'N',\n            alias: 'Number',\n            bmp: '0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n            astral: '\\uD800[\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD801[\\uDCA0-\\uDCA9]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDDE1-\\uDDF4\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF3B]|\\uD806[\\uDCE0-\\uDCF2]|\\uD807[\\uDC50-\\uDC6C]|\\uD809[\\uDC00-\\uDC6E]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDCC7-\\uDCCF\\uDD50-\\uDD59]|\\uD83C[\\uDD00-\\uDD0C]'\n        }, {\n            name: 'Nd',\n            alias: 'Decimal_Number',\n            bmp: '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n            astral: '\\uD801[\\uDCA0-\\uDCA9]|\\uD804[\\uDC66-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF39]|\\uD806[\\uDCE0-\\uDCE9]|\\uD807[\\uDC50-\\uDC59]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDD50-\\uDD59]'\n        }, {\n            name: 'Nl',\n            alias: 'Letter_Number',\n            bmp: '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',\n            astral: '\\uD800[\\uDD40-\\uDD74\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD809[\\uDC00-\\uDC6E]'\n        }, {\n            name: 'No',\n            alias: 'Other_Number',\n            bmp: '\\xB2\\xB3\\xB9\\xBC-\\xBE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',\n            astral: '\\uD800[\\uDD07-\\uDD33\\uDD75-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC65\\uDDE1-\\uDDF4]|\\uD805[\\uDF3A\\uDF3B]|\\uD806[\\uDCEA-\\uDCF2]|\\uD807[\\uDC5A-\\uDC6C]|\\uD81A[\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD83A[\\uDCC7-\\uDCCF]|\\uD83C[\\uDD00-\\uDD0C]'\n        }, {\n            name: 'P',\n            alias: 'Punctuation',\n            bmp: '\\x21-\\x23\\x25-\\\\x2A\\x2C-\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5B-\\\\x5D\\x5F\\\\x7B\\x7D\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E44\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Pc',\n            alias: 'Connector_Punctuation',\n            bmp: '\\x5F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F'\n        }, {\n            name: 'Pd',\n            alias: 'Dash_Punctuation',\n            bmp: '\\\\x2D\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D'\n        }, {\n            name: 'Pe',\n            alias: 'Close_Punctuation',\n            bmp: '\\\\x29\\\\x5D\\x7D\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63'\n        }, {\n            name: 'Pf',\n            alias: 'Final_Punctuation',\n            bmp: '\\xBB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21'\n        }, {\n            name: 'Pi',\n            alias: 'Initial_Punctuation',\n            bmp: '\\xAB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20'\n        }, {\n            name: 'Po',\n            alias: 'Other_Punctuation',\n            bmp: '\\x21-\\x23\\x25-\\x27\\\\x2A\\x2C\\\\x2E\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5C\\xA1\\xA7\\xB6\\xB7\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166D\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43\\u2E44\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Ps',\n            alias: 'Open_Punctuation',\n            bmp: '\\\\x28\\\\x5B\\\\x7B\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62'\n        }, {\n            name: 'S',\n            alias: 'Symbol',\n            bmp: '\\\\x24\\\\x2B\\x3C-\\x3E\\\\x5E\\x60\\\\x7C\\x7E\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20BE\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uFB29\\uFBB2-\\uFBC1\\uFDFC\\uFDFD\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',\n            astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83B[\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n        }, {\n            name: 'Sc',\n            alias: 'Currency_Symbol',\n            bmp: '\\\\x24\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BE\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6'\n        }, {\n            name: 'Sk',\n            alias: 'Modifier_Symbol',\n            bmp: '\\\\x5E\\x60\\xA8\\xAF\\xB4\\xB8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uFBB2-\\uFBC1\\uFF3E\\uFF40\\uFFE3',\n            astral: '\\uD83C[\\uDFFB-\\uDFFF]'\n        }, {\n            name: 'Sm',\n            alias: 'Math_Symbol',\n            bmp: '\\\\x2B\\x3C-\\x3E\\\\x7C\\x7E\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',\n            astral: '\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD83B[\\uDEF0\\uDEF1]'\n        }, {\n            name: 'So',\n            alias: 'Other_Symbol',\n            bmp: '\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',\n            astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFA]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n        }, {\n            name: 'Z',\n            alias: 'Separator',\n            bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n        }, {\n            name: 'Zl',\n            alias: 'Line_Separator',\n            bmp: '\\u2028'\n        }, {\n            name: 'Zp',\n            alias: 'Paragraph_Separator',\n            bmp: '\\u2029'\n        }, {\n            name: 'Zs',\n            alias: 'Space_Separator',\n            bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeCategories);\n\n    var unicodeProperties = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Properties 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2012-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See\n         * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from\n         * UAX #44 <http://unicode.org/reports/tr44/>:\n         *\n         * - Alphabetic\n         *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +\n         *   Lo + Nl + Other_Alphabetic.\n         *\n         * - Default_Ignorable_Code_Point\n         *   For programmatic determination of default ignorable code points. New characters that should\n         *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,\n         *   permitting programs to correctly handle the default rendering of such characters when not\n         *   otherwise supported.\n         *\n         * - Lowercase\n         *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.\n         *\n         * - Noncharacter_Code_Point\n         *   Code points permanently reserved for internal use.\n         *\n         * - Uppercase\n         *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.\n         *\n         * - White_Space\n         *   Spaces, separator characters and other control characters which should be treated by\n         *   programming languages as \"white space\" for the purpose of parsing elements.\n         *\n         * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS\n         * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are\n         * included in XRegExp's Unicode Categories and Unicode Scripts addons.\n         *\n         * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');\n        }\n\n        var unicodeData = [{\n            name: 'ASCII',\n            bmp: '\\0-\\x7F'\n        }, {\n            name: 'Alphabetic',\n            bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0345\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05B0-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0657\\u0659-\\u065F\\u066E-\\u06D3\\u06D5-\\u06DC\\u06E1-\\u06E8\\u06ED-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710-\\u073F\\u074D-\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0817\\u081A-\\u082C\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08DF\\u08E3-\\u08E9\\u08F0-\\u093B\\u093D-\\u094C\\u094E-\\u0950\\u0955-\\u0963\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD-\\u09C4\\u09C7\\u09C8\\u09CB\\u09CC\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09F0\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A70-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB\\u0ACC\\u0AD0\\u0AE0-\\u0AE3\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D-\\u0B44\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD0\\u0BD7\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4C\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCC\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E46\\u0E4D\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ECD\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F81\\u0F88-\\u0F97\\u0F99-\\u0FBC\\u1000-\\u1036\\u1038\\u103B-\\u103F\\u1050-\\u1062\\u1065-\\u1068\\u106E-\\u1086\\u108E\\u109C\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1713\\u1720-\\u1733\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17B3\\u17B6-\\u17C8\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u1938\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A61-\\u1A74\\u1AA7\\u1B00-\\u1B33\\u1B35-\\u1B43\\u1B45-\\u1B4B\\u1B80-\\u1BA9\\u1BAC-\\u1BAF\\u1BBA-\\u1BE5\\u1BE7-\\u1BF1\\u1C00-\\u1C35\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1DE7-\\u1DF4\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u24B6-\\u24E9\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA674-\\uA67B\\uA67F-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA827\\uA840-\\uA873\\uA880-\\uA8C3\\uA8C5\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA92A\\uA930-\\uA952\\uA960-\\uA97C\\uA980-\\uA9B2\\uA9B4-\\uA9BF\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAABE\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF5\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC45\\uDC82-\\uDCB8\\uDCD0-\\uDCE8\\uDD00-\\uDD32\\uDD50-\\uDD72\\uDD76\\uDD80-\\uDDBF\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE34\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEE8\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D-\\uDF44\\uDF47\\uDF48\\uDF4B\\uDF4C\\uDF50\\uDF57\\uDF5D-\\uDF63]|\\uD805[\\uDC00-\\uDC41\\uDC43-\\uDC45\\uDC47-\\uDC4A\\uDC80-\\uDCC1\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDB5\\uDDB8-\\uDDBE\\uDDD8-\\uDDDD\\uDE00-\\uDE3E\\uDE40\\uDE44\\uDE80-\\uDEB5\\uDF00-\\uDF19\\uDF1D-\\uDF2A]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC3E\\uDC40\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9E]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD47]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Any',\n            isBmpLast: true,\n            bmp: '\\0-\\uFFFF',\n            astral: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'Default_Ignorable_Code_Point',\n            bmp: '\\xAD\\u034F\\u061C\\u115F\\u1160\\u17B4\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8',\n            astral: '\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|[\\uDB40-\\uDB43][\\uDC00-\\uDFFF]'\n        }, {\n            name: 'Lowercase',\n            bmp: 'a-z\\xAA\\xB5\\xBA\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02B8\\u02C0\\u02C1\\u02E0-\\u02E4\\u0345\\u0371\\u0373\\u0377\\u037A-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1DBF\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u2090-\\u209C\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2170-\\u217F\\u2184\\u24D0-\\u24E9\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7D\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B-\\uA69D\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7F8-\\uA7FA\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n            astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n        }, {\n            name: 'Noncharacter_Code_Point',\n            bmp: '\\uFDD0-\\uFDEF\\uFFFE\\uFFFF',\n            astral: '[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n        }, {\n            name: 'Uppercase',\n            bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n            astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]'\n        }, {\n            name: 'White_Space',\n            bmp: '\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n        }];\n\n        // Add non-generated data\n        unicodeData.push({\n            name: 'Assigned',\n            // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode\n            // Categories addon is required to use this property\n            inverseOf: 'Cn'\n        });\n\n        XRegExp.addUnicodeData(unicodeData);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeProperties);\n\n    var unicodeScripts = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n        value: true\n    });\n\n    /*!\n     * XRegExp Unicode Scripts 4.0.0\n     * <xregexp.com>\n     * Steven Levithan (c) 2010-2017 MIT License\n     * Unicode data by Mathias Bynens <mathiasbynens.be>\n     */\n\n    exports.default = function (XRegExp) {\n\n        /**\n         * Adds support for all Unicode scripts. E.g., `\\p{Latin}`. Token names are case insensitive,\n         * and any spaces, hyphens, and underscores are ignored.\n         *\n         * Uses Unicode 9.0.0.\n         *\n         * @requires XRegExp, Unicode Base\n         */\n\n        if (!XRegExp.addUnicodeData) {\n            throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');\n        }\n\n        XRegExp.addUnicodeData([{\n            name: 'Adlam',\n            astral: '\\uD83A[\\uDD00-\\uDD4A\\uDD50-\\uDD59\\uDD5E\\uDD5F]'\n        }, {\n            name: 'Ahom',\n            astral: '\\uD805[\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF3F]'\n        }, {\n            name: 'Anatolian_Hieroglyphs',\n            astral: '\\uD811[\\uDC00-\\uDE46]'\n        }, {\n            name: 'Arabic',\n            bmp: '\\u0600-\\u0604\\u0606-\\u060B\\u060D-\\u061A\\u061E\\u0620-\\u063F\\u0641-\\u064A\\u0656-\\u066F\\u0671-\\u06DC\\u06DE-\\u06FF\\u0750-\\u077F\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u08FF\\uFB50-\\uFBC1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFD\\uFE70-\\uFE74\\uFE76-\\uFEFC',\n            astral: '\\uD803[\\uDE60-\\uDE7E]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB\\uDEF0\\uDEF1]'\n        }, {\n            name: 'Armenian',\n            bmp: '\\u0531-\\u0556\\u0559-\\u055F\\u0561-\\u0587\\u058A\\u058D-\\u058F\\uFB13-\\uFB17'\n        }, {\n            name: 'Avestan',\n            astral: '\\uD802[\\uDF00-\\uDF35\\uDF39-\\uDF3F]'\n        }, {\n            name: 'Balinese',\n            bmp: '\\u1B00-\\u1B4B\\u1B50-\\u1B7C'\n        }, {\n            name: 'Bamum',\n            bmp: '\\uA6A0-\\uA6F7',\n            astral: '\\uD81A[\\uDC00-\\uDE38]'\n        }, {\n            name: 'Bassa_Vah',\n            astral: '\\uD81A[\\uDED0-\\uDEED\\uDEF0-\\uDEF5]'\n        }, {\n            name: 'Batak',\n            bmp: '\\u1BC0-\\u1BF3\\u1BFC-\\u1BFF'\n        }, {\n            name: 'Bengali',\n            bmp: '\\u0980-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FB'\n        }, {\n            name: 'Bhaiksuki',\n            astral: '\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC45\\uDC50-\\uDC6C]'\n        }, {\n            name: 'Bopomofo',\n            bmp: '\\u02EA\\u02EB\\u3105-\\u312D\\u31A0-\\u31BA'\n        }, {\n            name: 'Brahmi',\n            astral: '\\uD804[\\uDC00-\\uDC4D\\uDC52-\\uDC6F\\uDC7F]'\n        }, {\n            name: 'Braille',\n            bmp: '\\u2800-\\u28FF'\n        }, {\n            name: 'Buginese',\n            bmp: '\\u1A00-\\u1A1B\\u1A1E\\u1A1F'\n        }, {\n            name: 'Buhid',\n            bmp: '\\u1740-\\u1753'\n        }, {\n            name: 'Canadian_Aboriginal',\n            bmp: '\\u1400-\\u167F\\u18B0-\\u18F5'\n        }, {\n            name: 'Carian',\n            astral: '\\uD800[\\uDEA0-\\uDED0]'\n        }, {\n            name: 'Caucasian_Albanian',\n            astral: '\\uD801[\\uDD30-\\uDD63\\uDD6F]'\n        }, {\n            name: 'Chakma',\n            astral: '\\uD804[\\uDD00-\\uDD34\\uDD36-\\uDD43]'\n        }, {\n            name: 'Cham',\n            bmp: '\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA5C-\\uAA5F'\n        }, {\n            name: 'Cherokee',\n            bmp: '\\u13A0-\\u13F5\\u13F8-\\u13FD\\uAB70-\\uABBF'\n        }, {\n            name: 'Common',\n            bmp: '\\0-\\x40\\\\x5B-\\x60\\\\x7B-\\xA9\\xAB-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02B9-\\u02DF\\u02E5-\\u02E9\\u02EC-\\u02FF\\u0374\\u037E\\u0385\\u0387\\u0589\\u0605\\u060C\\u061B\\u061C\\u061F\\u0640\\u06DD\\u08E2\\u0964\\u0965\\u0E3F\\u0FD5-\\u0FD8\\u10FB\\u16EB-\\u16ED\\u1735\\u1736\\u1802\\u1803\\u1805\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u2000-\\u200B\\u200E-\\u2064\\u2066-\\u2070\\u2074-\\u207E\\u2080-\\u208E\\u20A0-\\u20BE\\u2100-\\u2125\\u2127-\\u2129\\u212C-\\u2131\\u2133-\\u214D\\u214F-\\u215F\\u2189-\\u218B\\u2190-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u2460-\\u27FF\\u2900-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2E00-\\u2E44\\u2FF0-\\u2FFB\\u3000-\\u3004\\u3006\\u3008-\\u3020\\u3030-\\u3037\\u303C-\\u303F\\u309B\\u309C\\u30A0\\u30FB\\u30FC\\u3190-\\u319F\\u31C0-\\u31E3\\u3220-\\u325F\\u327F-\\u32CF\\u3358-\\u33FF\\u4DC0-\\u4DFF\\uA700-\\uA721\\uA788-\\uA78A\\uA830-\\uA839\\uA92E\\uA9CF\\uAB5B\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFEFF\\uFF01-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFF70\\uFF9E\\uFF9F\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFF9-\\uFFFD',\n            astral: '\\uD800[\\uDD00-\\uDD02\\uDD07-\\uDD33\\uDD37-\\uDD3F\\uDD90-\\uDD9B\\uDDD0-\\uDDFC\\uDEE1-\\uDEFB]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD66\\uDD6A-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDF00-\\uDF56\\uDF60-\\uDF71]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD00-\\uDD0C\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n        }, {\n            name: 'Coptic',\n            bmp: '\\u03E2-\\u03EF\\u2C80-\\u2CF3\\u2CF9-\\u2CFF'\n        }, {\n            name: 'Cuneiform',\n            astral: '\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC70-\\uDC74\\uDC80-\\uDD43]'\n        }, {\n            name: 'Cypriot',\n            astral: '\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F]'\n        }, {\n            name: 'Cyrillic',\n            bmp: '\\u0400-\\u0484\\u0487-\\u052F\\u1C80-\\u1C88\\u1D2B\\u1D78\\u2DE0-\\u2DFF\\uA640-\\uA69F\\uFE2E\\uFE2F'\n        }, {\n            name: 'Deseret',\n            astral: '\\uD801[\\uDC00-\\uDC4F]'\n        }, {\n            name: 'Devanagari',\n            bmp: '\\u0900-\\u0950\\u0953-\\u0963\\u0966-\\u097F\\uA8E0-\\uA8FD'\n        }, {\n            name: 'Duployan',\n            astral: '\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9C-\\uDC9F]'\n        }, {\n            name: 'Egyptian_Hieroglyphs',\n            astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]'\n        }, {\n            name: 'Elbasan',\n            astral: '\\uD801[\\uDD00-\\uDD27]'\n        }, {\n            name: 'Ethiopic',\n            bmp: '\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u137C\\u1380-\\u1399\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E'\n        }, {\n            name: 'Georgian',\n            bmp: '\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u10FF\\u2D00-\\u2D25\\u2D27\\u2D2D'\n        }, {\n            name: 'Glagolitic',\n            bmp: '\\u2C00-\\u2C2E\\u2C30-\\u2C5E',\n            astral: '\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]'\n        }, {\n            name: 'Gothic',\n            astral: '\\uD800[\\uDF30-\\uDF4A]'\n        }, {\n            name: 'Grantha',\n            astral: '\\uD804[\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]'\n        }, {\n            name: 'Greek',\n            bmp: '\\u0370-\\u0373\\u0375-\\u0377\\u037A-\\u037D\\u037F\\u0384\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03E1\\u03F0-\\u03FF\\u1D26-\\u1D2A\\u1D5D-\\u1D61\\u1D66-\\u1D6A\\u1DBF\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FC4\\u1FC6-\\u1FD3\\u1FD6-\\u1FDB\\u1FDD-\\u1FEF\\u1FF2-\\u1FF4\\u1FF6-\\u1FFE\\u2126\\uAB65',\n            astral: '\\uD800[\\uDD40-\\uDD8E\\uDDA0]|\\uD834[\\uDE00-\\uDE45]'\n        }, {\n            name: 'Gujarati',\n            bmp: '\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AF1\\u0AF9'\n        }, {\n            name: 'Gurmukhi',\n            bmp: '\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75'\n        }, {\n            name: 'Han',\n            bmp: '\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uF900-\\uFA6D\\uFA70-\\uFAD9',\n            astral: '[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n        }, {\n            name: 'Hangul',\n            bmp: '\\u1100-\\u11FF\\u302E\\u302F\\u3131-\\u318E\\u3200-\\u321E\\u3260-\\u327E\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n        }, {\n            name: 'Hanunoo',\n            bmp: '\\u1720-\\u1734'\n        }, {\n            name: 'Hatran',\n            astral: '\\uD802[\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDCFF]'\n        }, {\n            name: 'Hebrew',\n            bmp: '\\u0591-\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F4\\uFB1D-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFB4F'\n        }, {\n            name: 'Hiragana',\n            bmp: '\\u3041-\\u3096\\u309D-\\u309F',\n            astral: '\\uD82C\\uDC01|\\uD83C\\uDE00'\n        }, {\n            name: 'Imperial_Aramaic',\n            astral: '\\uD802[\\uDC40-\\uDC55\\uDC57-\\uDC5F]'\n        }, {\n            name: 'Inherited',\n            bmp: '\\u0300-\\u036F\\u0485\\u0486\\u064B-\\u0655\\u0670\\u0951\\u0952\\u1AB0-\\u1ABE\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u200C\\u200D\\u20D0-\\u20F0\\u302A-\\u302D\\u3099\\u309A\\uFE00-\\uFE0F\\uFE20-\\uFE2D',\n            astral: '\\uD800[\\uDDFD\\uDEE0]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD]|\\uDB40[\\uDD00-\\uDDEF]'\n        }, {\n            name: 'Inscriptional_Pahlavi',\n            astral: '\\uD802[\\uDF60-\\uDF72\\uDF78-\\uDF7F]'\n        }, {\n            name: 'Inscriptional_Parthian',\n            astral: '\\uD802[\\uDF40-\\uDF55\\uDF58-\\uDF5F]'\n        }, {\n            name: 'Javanese',\n            bmp: '\\uA980-\\uA9CD\\uA9D0-\\uA9D9\\uA9DE\\uA9DF'\n        }, {\n            name: 'Kaithi',\n            astral: '\\uD804[\\uDC80-\\uDCC1]'\n        }, {\n            name: 'Kannada',\n            bmp: '\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2'\n        }, {\n            name: 'Katakana',\n            bmp: '\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D',\n            astral: '\\uD82C\\uDC00'\n        }, {\n            name: 'Kayah_Li',\n            bmp: '\\uA900-\\uA92D\\uA92F'\n        }, {\n            name: 'Kharoshthi',\n            astral: '\\uD802[\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F-\\uDE47\\uDE50-\\uDE58]'\n        }, {\n            name: 'Khmer',\n            bmp: '\\u1780-\\u17DD\\u17E0-\\u17E9\\u17F0-\\u17F9\\u19E0-\\u19FF'\n        }, {\n            name: 'Khojki',\n            astral: '\\uD804[\\uDE00-\\uDE11\\uDE13-\\uDE3E]'\n        }, {\n            name: 'Khudawadi',\n            astral: '\\uD804[\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9]'\n        }, {\n            name: 'Lao',\n            bmp: '\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF'\n        }, {\n            name: 'Latin',\n            bmp: 'A-Za-z\\xAA\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02B8\\u02E0-\\u02E4\\u1D00-\\u1D25\\u1D2C-\\u1D5C\\u1D62-\\u1D65\\u1D6B-\\u1D77\\u1D79-\\u1DBE\\u1E00-\\u1EFF\\u2071\\u207F\\u2090-\\u209C\\u212A\\u212B\\u2132\\u214E\\u2160-\\u2188\\u2C60-\\u2C7F\\uA722-\\uA787\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA7FF\\uAB30-\\uAB5A\\uAB5C-\\uAB64\\uFB00-\\uFB06\\uFF21-\\uFF3A\\uFF41-\\uFF5A'\n        }, {\n            name: 'Lepcha',\n            bmp: '\\u1C00-\\u1C37\\u1C3B-\\u1C49\\u1C4D-\\u1C4F'\n        }, {\n            name: 'Limbu',\n            bmp: '\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1940\\u1944-\\u194F'\n        }, {\n            name: 'Linear_A',\n            astral: '\\uD801[\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]'\n        }, {\n            name: 'Linear_B',\n            astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA]'\n        }, {\n            name: 'Lisu',\n            bmp: '\\uA4D0-\\uA4FF'\n        }, {\n            name: 'Lycian',\n            astral: '\\uD800[\\uDE80-\\uDE9C]'\n        }, {\n            name: 'Lydian',\n            astral: '\\uD802[\\uDD20-\\uDD39\\uDD3F]'\n        }, {\n            name: 'Mahajani',\n            astral: '\\uD804[\\uDD50-\\uDD76]'\n        }, {\n            name: 'Malayalam',\n            bmp: '\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4F\\u0D54-\\u0D63\\u0D66-\\u0D7F'\n        }, {\n            name: 'Mandaic',\n            bmp: '\\u0840-\\u085B\\u085E'\n        }, {\n            name: 'Manichaean',\n            astral: '\\uD802[\\uDEC0-\\uDEE6\\uDEEB-\\uDEF6]'\n        }, {\n            name: 'Marchen',\n            astral: '\\uD807[\\uDC70-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]'\n        }, {\n            name: 'Meetei_Mayek',\n            bmp: '\\uAAE0-\\uAAF6\\uABC0-\\uABED\\uABF0-\\uABF9'\n        }, {\n            name: 'Mende_Kikakui',\n            astral: '\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCD6]'\n        }, {\n            name: 'Meroitic_Cursive',\n            astral: '\\uD802[\\uDDA0-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDDFF]'\n        }, {\n            name: 'Meroitic_Hieroglyphs',\n            astral: '\\uD802[\\uDD80-\\uDD9F]'\n        }, {\n            name: 'Miao',\n            astral: '\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]'\n        }, {\n            name: 'Modi',\n            astral: '\\uD805[\\uDE00-\\uDE44\\uDE50-\\uDE59]'\n        }, {\n            name: 'Mongolian',\n            bmp: '\\u1800\\u1801\\u1804\\u1806-\\u180E\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA',\n            astral: '\\uD805[\\uDE60-\\uDE6C]'\n        }, {\n            name: 'Mro',\n            astral: '\\uD81A[\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE6E\\uDE6F]'\n        }, {\n            name: 'Multani',\n            astral: '\\uD804[\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA9]'\n        }, {\n            name: 'Myanmar',\n            bmp: '\\u1000-\\u109F\\uA9E0-\\uA9FE\\uAA60-\\uAA7F'\n        }, {\n            name: 'Nabataean',\n            astral: '\\uD802[\\uDC80-\\uDC9E\\uDCA7-\\uDCAF]'\n        }, {\n            name: 'New_Tai_Lue',\n            bmp: '\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u19DE\\u19DF'\n        }, {\n            name: 'Newa',\n            astral: '\\uD805[\\uDC00-\\uDC59\\uDC5B\\uDC5D]'\n        }, {\n            name: 'Nko',\n            bmp: '\\u07C0-\\u07FA'\n        }, {\n            name: 'Ogham',\n            bmp: '\\u1680-\\u169C'\n        }, {\n            name: 'Ol_Chiki',\n            bmp: '\\u1C50-\\u1C7F'\n        }, {\n            name: 'Old_Hungarian',\n            astral: '\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDCFF]'\n        }, {\n            name: 'Old_Italic',\n            astral: '\\uD800[\\uDF00-\\uDF23]'\n        }, {\n            name: 'Old_North_Arabian',\n            astral: '\\uD802[\\uDE80-\\uDE9F]'\n        }, {\n            name: 'Old_Permic',\n            astral: '\\uD800[\\uDF50-\\uDF7A]'\n        }, {\n            name: 'Old_Persian',\n            astral: '\\uD800[\\uDFA0-\\uDFC3\\uDFC8-\\uDFD5]'\n        }, {\n            name: 'Old_South_Arabian',\n            astral: '\\uD802[\\uDE60-\\uDE7F]'\n        }, {\n            name: 'Old_Turkic',\n            astral: '\\uD803[\\uDC00-\\uDC48]'\n        }, {\n            name: 'Oriya',\n            bmp: '\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B77'\n        }, {\n            name: 'Osage',\n            astral: '\\uD801[\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB]'\n        }, {\n            name: 'Osmanya',\n            astral: '\\uD801[\\uDC80-\\uDC9D\\uDCA0-\\uDCA9]'\n        }, {\n            name: 'Pahawh_Hmong',\n            astral: '\\uD81A[\\uDF00-\\uDF45\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]'\n        }, {\n            name: 'Palmyrene',\n            astral: '\\uD802[\\uDC60-\\uDC7F]'\n        }, {\n            name: 'Pau_Cin_Hau',\n            astral: '\\uD806[\\uDEC0-\\uDEF8]'\n        }, {\n            name: 'Phags_Pa',\n            bmp: '\\uA840-\\uA877'\n        }, {\n            name: 'Phoenician',\n            astral: '\\uD802[\\uDD00-\\uDD1B\\uDD1F]'\n        }, {\n            name: 'Psalter_Pahlavi',\n            astral: '\\uD802[\\uDF80-\\uDF91\\uDF99-\\uDF9C\\uDFA9-\\uDFAF]'\n        }, {\n            name: 'Rejang',\n            bmp: '\\uA930-\\uA953\\uA95F'\n        }, {\n            name: 'Runic',\n            bmp: '\\u16A0-\\u16EA\\u16EE-\\u16F8'\n        }, {\n            name: 'Samaritan',\n            bmp: '\\u0800-\\u082D\\u0830-\\u083E'\n        }, {\n            name: 'Saurashtra',\n            bmp: '\\uA880-\\uA8C5\\uA8CE-\\uA8D9'\n        }, {\n            name: 'Sharada',\n            astral: '\\uD804[\\uDD80-\\uDDCD\\uDDD0-\\uDDDF]'\n        }, {\n            name: 'Shavian',\n            astral: '\\uD801[\\uDC50-\\uDC7F]'\n        }, {\n            name: 'Siddham',\n            astral: '\\uD805[\\uDD80-\\uDDB5\\uDDB8-\\uDDDD]'\n        }, {\n            name: 'SignWriting',\n            astral: '\\uD836[\\uDC00-\\uDE8B\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]'\n        }, {\n            name: 'Sinhala',\n            bmp: '\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2-\\u0DF4',\n            astral: '\\uD804[\\uDDE1-\\uDDF4]'\n        }, {\n            name: 'Sora_Sompeng',\n            astral: '\\uD804[\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9]'\n        }, {\n            name: 'Sundanese',\n            bmp: '\\u1B80-\\u1BBF\\u1CC0-\\u1CC7'\n        }, {\n            name: 'Syloti_Nagri',\n            bmp: '\\uA800-\\uA82B'\n        }, {\n            name: 'Syriac',\n            bmp: '\\u0700-\\u070D\\u070F-\\u074A\\u074D-\\u074F'\n        }, {\n            name: 'Tagalog',\n            bmp: '\\u1700-\\u170C\\u170E-\\u1714'\n        }, {\n            name: 'Tagbanwa',\n            bmp: '\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773'\n        }, {\n            name: 'Tai_Le',\n            bmp: '\\u1950-\\u196D\\u1970-\\u1974'\n        }, {\n            name: 'Tai_Tham',\n            bmp: '\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA0-\\u1AAD'\n        }, {\n            name: 'Tai_Viet',\n            bmp: '\\uAA80-\\uAAC2\\uAADB-\\uAADF'\n        }, {\n            name: 'Takri',\n            astral: '\\uD805[\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]'\n        }, {\n            name: 'Tamil',\n            bmp: '\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BFA'\n        }, {\n            name: 'Tangut',\n            astral: '\\uD81B\\uDFE0|[\\uD81C-\\uD820][\\uDC00-\\uDFFF]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]'\n        }, {\n            name: 'Telugu',\n            bmp: '\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C78-\\u0C7F'\n        }, {\n            name: 'Thaana',\n            bmp: '\\u0780-\\u07B1'\n        }, {\n            name: 'Thai',\n            bmp: '\\u0E01-\\u0E3A\\u0E40-\\u0E5B'\n        }, {\n            name: 'Tibetan',\n            bmp: '\\u0F00-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F97\\u0F99-\\u0FBC\\u0FBE-\\u0FCC\\u0FCE-\\u0FD4\\u0FD9\\u0FDA'\n        }, {\n            name: 'Tifinagh',\n            bmp: '\\u2D30-\\u2D67\\u2D6F\\u2D70\\u2D7F'\n        }, {\n            name: 'Tirhuta',\n            astral: '\\uD805[\\uDC80-\\uDCC7\\uDCD0-\\uDCD9]'\n        }, {\n            name: 'Ugaritic',\n            astral: '\\uD800[\\uDF80-\\uDF9D\\uDF9F]'\n        }, {\n            name: 'Vai',\n            bmp: '\\uA500-\\uA62B'\n        }, {\n            name: 'Warang_Citi',\n            astral: '\\uD806[\\uDCA0-\\uDCF2\\uDCFF]'\n        }, {\n            name: 'Yi',\n            bmp: '\\uA000-\\uA48C\\uA490-\\uA4C6'\n        }]);\n    };\n\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(unicodeScripts);\n\n    var lib = createCommonjsModule(function (module, exports) {\n\n    Object.defineProperty(exports, \"__esModule\", {\n      value: true\n    });\n\n\n\n    var _xregexp2 = _interopRequireDefault(xregexp);\n\n\n\n    var _build2 = _interopRequireDefault(build);\n\n\n\n    var _matchrecursive2 = _interopRequireDefault(matchrecursive);\n\n\n\n    var _unicodeBase2 = _interopRequireDefault(unicodeBase);\n\n\n\n    var _unicodeBlocks2 = _interopRequireDefault(unicodeBlocks);\n\n\n\n    var _unicodeCategories2 = _interopRequireDefault(unicodeCategories);\n\n\n\n    var _unicodeProperties2 = _interopRequireDefault(unicodeProperties);\n\n\n\n    var _unicodeScripts2 = _interopRequireDefault(unicodeScripts);\n\n    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n    (0, _build2.default)(_xregexp2.default);\n    (0, _matchrecursive2.default)(_xregexp2.default);\n    (0, _unicodeBase2.default)(_xregexp2.default);\n    (0, _unicodeBlocks2.default)(_xregexp2.default);\n    (0, _unicodeCategories2.default)(_xregexp2.default);\n    (0, _unicodeProperties2.default)(_xregexp2.default);\n    (0, _unicodeScripts2.default)(_xregexp2.default);\n\n    exports.default = _xregexp2.default;\n    module.exports = exports['default'];\n    });\n\n    unwrapExports(lib);\n\n    var decamelize = (text, separator) => {\n    \tif (typeof text !== 'string') {\n    \t\tthrow new TypeError('Expected a string');\n    \t}\n\n    \tseparator = typeof separator === 'undefined' ? '_' : separator;\n\n    \tconst regex1 = lib('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n    \tconst regex2 = lib('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n\n    \treturn text\n    \t\t// TODO: Use this instead of `xregexp` when targeting Node.js 10:\n    \t\t// .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n    \t\t// .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n    \t\t.replace(regex1, `$1${separator}$2`)\n    \t\t.replace(regex2, `$1${separator}$2`)\n    \t\t.toLowerCase();\n    };\n\n    var _decamelize = /*#__PURE__*/Object.freeze({\n        default: decamelize,\n        __moduleExports: decamelize\n    });\n\n    //handle es6 / bundling\n    const decamelize$1 = (decamelize || _decamelize);\n    function createElement(tag, attrs, ...children) {\n        if (typeof tag === 'function') {\n            const fn = tag;\n            const props = attrs;\n            props.children = children;\n            return fn(props);\n        }\n        else {\n            const el = document.createElement(tag);\n            const map = attrs;\n            for (let name in map) {\n                if (name && map.hasOwnProperty(name)) {\n                    let value = map[name];\n                    if (name === 'className' && value !== void 0) {\n                        el.setAttribute('class', value.toString());\n                    }\n                    else if (value === false || value === null || value === undefined) {\n                        continue;\n                    }\n                    else if (value === true) {\n                        el.setAttribute(name, name);\n                    }\n                    else if (typeof value === 'function') {\n                        el[name.toLowerCase()] = value;\n                    }\n                    else if (typeof value === 'object') {\n                        el.setAttribute(name, flatten(value));\n                    }\n                    else {\n                        el.setAttribute(name, value.toString());\n                    }\n                }\n            }\n            if (children && children.length > 0) {\n                appendChildren(el, children);\n            }\n            return el;\n        }\n    }\n    function flatten(o) {\n        const arr = [];\n        for (let prop in o)\n            arr.push(`${decamelize$1(prop, '-')}:${o[prop]}`);\n        return arr.join(';');\n    }\n    function addChild(parentElement, child) {\n        if (child === null || child === undefined || typeof child === \"boolean\") {\n            return;\n        }\n        else if (Array.isArray(child)) {\n            appendChildren(parentElement, child);\n        }\n        else if (isElement(child)) {\n            parentElement.appendChild(child);\n        }\n        else {\n            parentElement.appendChild(document.createTextNode(child.toString()));\n        }\n    }\n    function appendChildren(parentElement, children) {\n        children.forEach(child => addChild(parentElement, child));\n    }\n    function isElement(el) {\n        //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n        return !!el.nodeType;\n    }\n    function mount(element, container) {\n        const activeChildPositions = getActiveChildPositions(container);\n        container.innerHTML = '';\n        if (element) {\n            addChild(container, element);\n            if (activeChildPositions)\n                focusChildAtPosition(container, activeChildPositions);\n        }\n    }\n    function focusChildAtPosition(element, childPositions) {\n        while (element && childPositions.length)\n            element = element.children.item(childPositions.shift());\n        if (element)\n            element.focus();\n    }\n    function getActiveChildPositions(containerElement) {\n        var active = document.activeElement;\n        var childPositions = [];\n        while (active !== document.body && active !== containerElement) {\n            childPositions.unshift(childPosition(active));\n            active = active.parentElement;\n        }\n        if (active === containerElement && childPositions.length)\n            return childPositions;\n    }\n    function childPosition(element) {\n        let i = 0;\n        while (element = element.previousElementSibling)\n            i++;\n        return i;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const KeyCodes = {\n        ENTER: 13\n    };\n    const Table = (props) => {\n        return (createElement(\"table\", { className: props.className },\n            props.children,\n            props.rows.map((row, i) => (createElement(\"tr\", { className: props.rowClassName || '', onClick: e => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: e => {\n                    if (e.keyCode === KeyCodes.ENTER && props.onRowClick) {\n                        props.onRowClick(e, i);\n                    }\n                } }, row.cells.map((cell, i) => (createElement(\"td\", { className: cell.className || '', title: cell.title || '' }, cell.content))))))));\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var controls = /*#__PURE__*/Object.freeze({\n        Table: Table\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n\n    var types = /*#__PURE__*/Object.freeze({\n\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    /**\n     * Create a new element as a child of another element.\n     * @param tagName Tag name of the new tag to create.\n     * @param parentElement Reference of the element to append to.\n     * @returns new HTMLElement.\n     */\n    function addEl(tagName, parentElement) {\n        const el = document.createElement(tagName);\n        parentElement.appendChild(el);\n        return el;\n    }\n    /**\n     * Create a new div HTMLElement as a child of another element.\n     * @param parentElement Reference of the element to append to.\n     * @param className Optional css class name to apply to the div.\n     */\n    function addDiv(parentElement, className) {\n        const div = addEl('div', parentElement);\n        if (className) {\n            div.className = className;\n        }\n        return div;\n    }\n    /**\n     * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n     * @param el HTML Element to measure.\n     */\n    function outerSize(el) {\n        const cs = getComputedStyle(el);\n        const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n        const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n        return { height, width };\n    }\n\n    var isMergeableObject = function isMergeableObject(value) {\n    \treturn isNonNullObject(value)\n    \t\t&& !isSpecial(value)\n    };\n\n    function isNonNullObject(value) {\n    \treturn !!value && typeof value === 'object'\n    }\n\n    function isSpecial(value) {\n    \tvar stringValue = Object.prototype.toString.call(value);\n\n    \treturn stringValue === '[object RegExp]'\n    \t\t|| stringValue === '[object Date]'\n    \t\t|| isReactElement(value)\n    }\n\n    // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n    var canUseSymbol = typeof Symbol === 'function' && Symbol.for;\n    var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\n    function isReactElement(value) {\n    \treturn value.$$typeof === REACT_ELEMENT_TYPE\n    }\n\n    function emptyTarget(val) {\n    \treturn Array.isArray(val) ? [] : {}\n    }\n\n    function cloneUnlessOtherwiseSpecified(value, options) {\n    \treturn (options.clone !== false && options.isMergeableObject(value))\n    \t\t? deepmerge(emptyTarget(value), value, options)\n    \t\t: value\n    }\n\n    function defaultArrayMerge(target, source, options) {\n    \treturn target.concat(source).map(function(element) {\n    \t\treturn cloneUnlessOtherwiseSpecified(element, options)\n    \t})\n    }\n\n    function mergeObject(target, source, options) {\n    \tvar destination = {};\n    \tif (options.isMergeableObject(target)) {\n    \t\tObject.keys(target).forEach(function(key) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    \t\t});\n    \t}\n    \tObject.keys(source).forEach(function(key) {\n    \t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    \t\t} else {\n    \t\t\tdestination[key] = deepmerge(target[key], source[key], options);\n    \t\t}\n    \t});\n    \treturn destination\n    }\n\n    function deepmerge(target, source, options) {\n    \toptions = options || {};\n    \toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    \toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n    \tvar sourceIsArray = Array.isArray(source);\n    \tvar targetIsArray = Array.isArray(target);\n    \tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n    \tif (!sourceAndTargetTypesMatch) {\n    \t\treturn cloneUnlessOtherwiseSpecified(source, options)\n    \t} else if (sourceIsArray) {\n    \t\treturn options.arrayMerge(target, source, options)\n    \t} else {\n    \t\treturn mergeObject(target, source, options)\n    \t}\n    }\n\n    deepmerge.all = function deepmergeAll(array, options) {\n    \tif (!Array.isArray(array)) {\n    \t\tthrow new Error('first argument should be an array')\n    \t}\n\n    \treturn array.reduce(function(prev, next) {\n    \t\treturn deepmerge(prev, next, options)\n    \t}, {})\n    };\n\n    var deepmerge_1 = deepmerge;\n\n    var _deepmerge = /*#__PURE__*/Object.freeze({\n        default: deepmerge_1\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const deepmerge$1 = (deepmerge_1 || _deepmerge);\n    function clone(objectToClone) {\n        if (!objectToClone)\n            return objectToClone;\n        return deepmerge$1.all([objectToClone]);\n    }\n    const dontMerge = (destination, source) => source;\n    function deepMerge(...objectsToMerge) {\n        const objects = objectsToMerge.filter(Boolean);\n        return deepmerge$1.all(objects, { arrayMerge: dontMerge });\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n        reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n        reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n        reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n        reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n        reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color, color, {\n      copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable: function() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb: function() {\n        return this;\n      },\n      displayable: function() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n    }\n\n    function rgb_formatRgb() {\n      var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n      return (a === 1 ? \"rgb(\" : \"rgba(\")\n          + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \"\n          + Math.max(0, Math.min(255, Math.round(this.b) || 0))\n          + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n\n    function hex(value) {\n      value = Math.max(0, Math.min(255, Math.round(value) || 0));\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl: function() {\n        var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\")\n            + (this.h || 0) + \", \"\n            + (this.s || 0) * 100 + \"%, \"\n            + (this.l || 0) * 100 + \"%\"\n            + (a === 1 ? \")\" : \", \" + a + \")\");\n      }\n    }));\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    var deg2rad = Math.PI / 180;\n    var rad2deg = 180 / Math.PI;\n\n    // https://observablehq.com/@mbostock/lab-and-rgb\n    var K = 18,\n        Xn = 0.96422,\n        Yn = 1,\n        Zn = 0.82521,\n        t0 = 4 / 29,\n        t1 = 6 / 29,\n        t2 = 3 * t1 * t1,\n        t3 = t1 * t1 * t1;\n\n    function labConvert(o) {\n      if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n      if (o instanceof Hcl) return hcl2lab(o);\n      if (!(o instanceof Rgb)) o = rgbConvert(o);\n      var r = rgb2lrgb(o.r),\n          g = rgb2lrgb(o.g),\n          b = rgb2lrgb(o.b),\n          y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n      if (r === g && g === b) x = z = y; else {\n        x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n        z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n      }\n      return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n    }\n\n    function lab(l, a, b, opacity) {\n      return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n    }\n\n    function Lab(l, a, b, opacity) {\n      this.l = +l;\n      this.a = +a;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Lab, lab, extend(Color, {\n      brighter: function(k) {\n        return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n      },\n      darker: function(k) {\n        return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n      },\n      rgb: function() {\n        var y = (this.l + 16) / 116,\n            x = isNaN(this.a) ? y : y + this.a / 500,\n            z = isNaN(this.b) ? y : y - this.b / 200;\n        x = Xn * lab2xyz(x);\n        y = Yn * lab2xyz(y);\n        z = Zn * lab2xyz(z);\n        return new Rgb(\n          lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n          lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n          lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n          this.opacity\n        );\n      }\n    }));\n\n    function xyz2lab(t) {\n      return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n    }\n\n    function lab2xyz(t) {\n      return t > t1 ? t * t * t : t2 * (t - t0);\n    }\n\n    function lrgb2rgb(x) {\n      return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n    }\n\n    function rgb2lrgb(x) {\n      return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n    }\n\n    function hclConvert(o) {\n      if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n      if (!(o instanceof Lab)) o = labConvert(o);\n      if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n      var h = Math.atan2(o.b, o.a) * rad2deg;\n      return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n    }\n\n    function hcl(h, c, l, opacity) {\n      return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hcl(h, c, l, opacity) {\n      this.h = +h;\n      this.c = +c;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    function hcl2lab(o) {\n      if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n      var h = o.h * deg2rad;\n      return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n    }\n\n    define(Hcl, hcl, extend(Color, {\n      brighter: function(k) {\n        return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n      },\n      darker: function(k) {\n        return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n      },\n      rgb: function() {\n        return hcl2lab(this).rgb();\n      }\n    }));\n\n    var A = -0.14861,\n        B = +1.78277,\n        C = -0.29227,\n        D = -0.90649,\n        E = +1.97294,\n        ED = E * D,\n        EB = E * B,\n        BC_DA = B * C - D * A;\n\n    function cubehelixConvert(o) {\n      if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Rgb)) o = rgbConvert(o);\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n          bl = b - l,\n          k = (E * (g - l) - C * bl) / D,\n          s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n          h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;\n      return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n    }\n\n    function cubehelix(h, s, l, opacity) {\n      return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Cubehelix(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Cubehelix, cubehelix, extend(Color, {\n      brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb: function() {\n        var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,\n            l = +this.l,\n            a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n            cosh = Math.cos(h),\n            sinh = Math.sin(h);\n        return new Rgb(\n          255 * (l + a * (A * cosh + B * sinh)),\n          255 * (l + a * (C * cosh + D * sinh)),\n          255 * (l + a * (E * cosh)),\n          this.opacity\n        );\n      }\n    }));\n\n    function rgbToDeckglColor(c) {\n        return [c.r, c.g, c.b, c.opacity * 255];\n    }\n    /**\n     * Compares 2 colors to see if they are equal.\n     * @param a Color to compare\n     * @param b Color to compare\n     * @returns True if colors are equal.\n     */\n    function colorIsEqual(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    /**\n     * Convert a CSS color string to a Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n     * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n     */\n    function colorFromString(cssColorSpecifier) {\n        if (cssColorSpecifier) {\n            const dc = color(cssColorSpecifier);\n            if (dc) {\n                const c = dc.rgb();\n                return rgbToDeckglColor(c);\n            }\n        }\n    }\n    /**\n     * Convert a Deck.gl color to a CSS rgba() string.\n     * @param color A Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n     */\n    function colorToString(color$$1) {\n        const c = [...color$$1];\n        if (c.length > 3) {\n            c[3] /= 255;\n        }\n        return `rgba(${c.join(',')})`;\n    }\n    function desaturate(color$$1, value) {\n        const rgb$$1 = rgb(color$$1[0], color$$1[1], color$$1[2], color$$1[3] / 255);\n        const hslColor = hsl(rgb$$1);\n        hslColor.s = value;\n        const c = hslColor.rgb();\n        return rgbToDeckglColor(c);\n    }\n    function isColor(cssColorSpecifier) {\n        return !!color(cssColorSpecifier);\n    }\n\n    let vega = {\n        CanvasHandler: null,\n        inferType: null,\n        inferTypes: null,\n        loader: null,\n        parse: null,\n        read: null,\n        renderModule: null,\n        Renderer: null,\n        sceneVisit: null,\n        scheme: null,\n        View: null\n    };\n    let deck = {\n        CompositeLayer: null,\n        COORDINATE_SYSTEM: null,\n        Deck: null,\n        Layer: null,\n        LinearInterpolator: null,\n        OrbitView: null,\n        _OrbitController: null\n    };\n    let layers = {\n        IconLayer: null,\n        LineLayer: null,\n        PolygonLayer: null,\n        TextLayer: null\n    };\n    let luma = {\n        CubeGeometry: null,\n        fp64: null,\n        Model: null,\n        Texture2D: null\n    };\n    /**\n     * References to dependency libraries.\n     */\n    const base = {\n        deck,\n        layers,\n        luma,\n        vega\n    };\n    /**\n     * Specify the dependency libraries to use for rendering.\n     * @param vega Vega library.\n     * @param deck deck/core library.\n     * @param layers deck/layers library.\n     * @param luma luma.gl library.\n     */\n    function use(vega, deck, layers, luma) {\n        base.deck = deck;\n        base.layers = layers;\n        base.luma = luma;\n        base.vega = vega;\n    }\n\n    var tinySdf = TinySDF;\n    var default_1 = TinySDF;\n\n    var INF = 1e20;\n\n    function TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) {\n        this.fontSize = fontSize || 24;\n        this.buffer = buffer === undefined ? 3 : buffer;\n        this.cutoff = cutoff || 0.25;\n        this.fontFamily = fontFamily || 'sans-serif';\n        this.fontWeight = fontWeight || 'normal';\n        this.radius = radius || 8;\n        var size = this.size = this.fontSize + this.buffer * 2;\n\n        this.canvas = document.createElement('canvas');\n        this.canvas.width = this.canvas.height = size;\n\n        this.ctx = this.canvas.getContext('2d');\n        this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily;\n        this.ctx.textBaseline = 'middle';\n        this.ctx.fillStyle = 'black';\n\n        // temporary arrays for the distance transform\n        this.gridOuter = new Float64Array(size * size);\n        this.gridInner = new Float64Array(size * size);\n        this.f = new Float64Array(size);\n        this.d = new Float64Array(size);\n        this.z = new Float64Array(size + 1);\n        this.v = new Int16Array(size);\n\n        // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852\n        this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1));\n    }\n\n    TinySDF.prototype.draw = function (char) {\n        this.ctx.clearRect(0, 0, this.size, this.size);\n        this.ctx.fillText(char, this.buffer, this.middle);\n\n        var imgData = this.ctx.getImageData(0, 0, this.size, this.size);\n        var alphaChannel = new Uint8ClampedArray(this.size * this.size);\n\n        for (var i = 0; i < this.size * this.size; i++) {\n            var a = imgData.data[i * 4 + 3] / 255; // alpha value\n            this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2);\n            this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2);\n        }\n\n        edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z);\n        edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z);\n\n        for (i = 0; i < this.size * this.size; i++) {\n            var d = this.gridOuter[i] - this.gridInner[i];\n            alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff))));\n        }\n\n        return alphaChannel;\n    };\n\n    // 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\n    function edt(data, width, height, f, d, v, z) {\n        for (var x = 0; x < width; x++) {\n            for (var y = 0; y < height; y++) {\n                f[y] = data[y * width + x];\n            }\n            edt1d(f, d, v, z, height);\n            for (y = 0; y < height; y++) {\n                data[y * width + x] = d[y];\n            }\n        }\n        for (y = 0; y < height; y++) {\n            for (x = 0; x < width; x++) {\n                f[x] = data[y * width + x];\n            }\n            edt1d(f, d, v, z, width);\n            for (x = 0; x < width; x++) {\n                data[y * width + x] = Math.sqrt(d[x]);\n            }\n        }\n    }\n\n    // 1D squared distance transform\n    function edt1d(f, d, v, z, n) {\n        v[0] = 0;\n        z[0] = -INF;\n        z[1] = +INF;\n\n        for (var q = 1, k = 0; q < n; q++) {\n            var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n            while (s <= z[k]) {\n                k--;\n                s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n            }\n            k++;\n            v[k] = q;\n            z[k] = s;\n            z[k + 1] = +INF;\n        }\n\n        for (q = 0, k = 0; q < n; q++) {\n            while (z[k + 1] < q) k++;\n            d[q] = (q - v[k]) * (q - v[k]) + f[v[k]];\n        }\n    }\n    tinySdf.default = default_1;\n\n    //from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/font-atlas.js\n    const GL_TEXTURE_WRAP_S = 0x2802;\n    const GL_TEXTURE_WRAP_T = 0x2803;\n    const GL_CLAMP_TO_EDGE = 0x812f;\n    const MAX_CANVAS_WIDTH = 1024;\n    const BASELINE_SCALE = 0.9;\n    const HEIGHT_SCALE = 1.2;\n    function getDefaultCharacterSet() {\n        const charSet = [];\n        for (let i = 32; i < 128; i++) {\n            charSet.push(String.fromCharCode(i));\n        }\n        return charSet;\n    }\n    const DEFAULT_CHAR_SET = getDefaultCharacterSet();\n    const DEFAULT_FONT_FAMILY = 'Monaco, monospace';\n    const DEFAULT_FONT_WEIGHT = 'normal';\n    const DEFAULT_FONT_SETTINGS = {\n        fontSize: 64,\n        buffer: 2,\n        sdf: false,\n        cutoff: 0.25,\n        radius: 3\n    };\n    function populateAlphaChannel(alphaChannel, imageData) {\n        // populate distance value from tinySDF to image alpha channel\t\n        for (let i = 0; i < alphaChannel.length; i++) {\n            imageData.data[4 * i + 3] = alphaChannel[i];\n        }\n    }\n    function setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n        ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n        ctx.fillStyle = '#000';\n        ctx.textBaseline = 'alphabetic';\n        ctx.textAlign = 'left';\n    }\n    function buildMapping({ ctx, fontHeight, buffer, characterSet, maxCanvasWidth }) {\n        const mapping = {};\n        let row = 0;\n        let x = 0;\n        Array.from(characterSet).forEach(char => {\n            // measure texts\n            // TODO - use Advanced text metrics when they are adopted:\n            // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n            const { width } = ctx.measureText(char);\n            if (x + width + buffer * 2 > maxCanvasWidth) {\n                x = 0;\n                row++;\n            }\n            mapping[char] = {\n                x: x + buffer,\n                y: row * (fontHeight + buffer * 2) + buffer,\n                width,\n                height: fontHeight,\n                mask: true\n            };\n            x += width + buffer * 2;\n        });\n        const canvasHeight = (row + 1) * (fontHeight + buffer * 2);\n        return { mapping, canvasHeight };\n    }\n    function makeFontAtlas(gl, fontSettings) {\n        const mergedFontSettings = Object.assign({\n            fontFamily: DEFAULT_FONT_FAMILY,\n            fontWeight: DEFAULT_FONT_WEIGHT,\n            characterSet: DEFAULT_CHAR_SET\n        }, DEFAULT_FONT_SETTINGS, fontSettings);\n        const { fontFamily, fontWeight, characterSet, fontSize, buffer, sdf, radius, cutoff } = mergedFontSettings;\n        const canvas = document.createElement('canvas');\n        const ctx = canvas.getContext('2d');\n        // build mapping\n        setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n        const fontHeight = fontSize * HEIGHT_SCALE;\n        const { canvasHeight, mapping } = buildMapping({\n            ctx,\n            fontHeight,\n            buffer,\n            characterSet,\n            maxCanvasWidth: MAX_CANVAS_WIDTH\n        });\n        canvas.width = MAX_CANVAS_WIDTH;\n        canvas.height = canvasHeight;\n        setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n        // layout characters\n        if (sdf) {\n            const tinySDF = new tinySdf(fontSize, buffer, radius, cutoff, fontFamily, fontWeight);\n            // used to store distance values from tinySDF\t\n            const imageData = ctx.createImageData(tinySDF.size, tinySDF.size);\n            for (const char of characterSet) {\n                populateAlphaChannel(tinySDF.draw(char), imageData);\n                ctx.putImageData(imageData, mapping[char].x - buffer, mapping[char].y - buffer);\n            }\n        }\n        else {\n            for (const char of characterSet) {\n                ctx.fillText(char, mapping[char].x, mapping[char].y + fontSize * BASELINE_SCALE);\n            }\n        }\n        return {\n            scale: HEIGHT_SCALE,\n            mapping,\n            texture: new base.luma.Texture2D(gl, {\n                pixels: canvas,\n                // padding is added only between the characters but not for borders\n                // enforce CLAMP_TO_EDGE to avoid any artifacts.\n                parameters: {\n                    [GL_TEXTURE_WRAP_S]: GL_CLAMP_TO_EDGE,\n                    [GL_TEXTURE_WRAP_T]: GL_CLAMP_TO_EDGE\n                }\n            })\n        };\n    }\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    //adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-fragment.glsl.js\n    var fs = `\\\n#define SHADER_NAME multi-icon-layer-fragment-shader\n\nprecision highp float;\n\nuniform sampler2D iconsTexture;\nuniform float buffer;\nuniform bool sdf;\n\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nconst float MIN_ALPHA = 0.05;\n\nvoid main(void) {\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\n  \n  float alpha = texColor.a;\n\n  // if enable sdf (signed distance fields)\t\n  if (sdf) {\t\n    float distance = texture2D(iconsTexture, vTextureCoords).a;\t\n    alpha = smoothstep(buffer - vGamma, buffer + vGamma, distance);\t\n  }\n\n  // Take the global opacity and the alpha from vColor into account for the alpha component\n  float a = alpha * vColor.a;\n\n  if (picking_uActive) {\n\n    // use picking color for entire rectangle\n    gl_FragColor = vec4(picking_vRGBcolor_Aselected.rgb, 1.0);\n  \n  } else {\n\n    if (a < MIN_ALPHA) {\n      discard;\n    } else {\n\n      gl_FragColor = vec4(vColor.rgb, a);\n\n      // use highlight color if this fragment belongs to the selected object.\n      bool selected = bool(picking_vRGBcolor_Aselected.a);\n      if (selected) {\n        gl_FragColor = vec4(vHighlightColor.rgb, a);\n      }\n    }\n  }\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    //adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-vertex.glsl.js\n    var vs = `\\\n#define SHADER_NAME multi-icon-layer-vertex-shader\n\nattribute vec2 positions;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute float instanceSizes;\nattribute float instanceAngles;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\nattribute vec4 instanceIconFrames;\nattribute float instanceColorModes;\nattribute vec2 instanceOffsets;\n\n// the following three attributes are for the multi-icon layer\nattribute vec2 instancePixelOffset;\nattribute vec4 instanceHighlightColors;\n\nuniform float sizeScale;\nuniform vec2 iconsTextureDim;\nuniform float gamma;\nuniform float opacity;\n\nvarying float vColorMode;\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nvec2 rotate_by_angle(vec2 vertex, float angle) {\n  float angle_radian = angle * PI / 180.0;\n  float cos_angle = cos(angle_radian);\n  float sin_angle = sin(angle_radian);\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\n  return rotationMatrix * vertex;\n}\n\nvoid main(void) {\n  vec2 iconSize = instanceIconFrames.zw;\n  // scale icon height to match instanceSize\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : instanceSizes / iconSize.y;\n\n  // scale and rotate vertex in \"pixel\" value and convert back to fraction in clipspace\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\n\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * sizeScale * instanceScale;\n  pixelOffset += instancePixelOffset;\n  pixelOffset.y *= -1.0;\n\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.0));\n  gl_Position += project_pixel_to_clipspace(pixelOffset);\n\n  vTextureCoords = mix(\n    instanceIconFrames.xy,\n    instanceIconFrames.xy + iconSize,\n    (positions.xy + 1.0) / 2.0\n  ) / iconsTextureDim;\n\n  vTextureCoords.y = 1.0 - vTextureCoords.y;\n\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\n  vHighlightColor = vec4(instanceHighlightColors.rgb, instanceHighlightColors.a * opacity) / 255.;\n\n  picking_setPickingColor(instancePickingColors);\n\n  vGamma = gamma / (sizeScale * iconSize.y);\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    // TODO expose as layer properties\n    const DEFAULT_GAMMA = 0.2;\n    const DEFAULT_BUFFER = 192.0 / 256;\n    const defaultProps = {\n        getShiftInQueue: { type: 'accessor', value: x => x.shift || 0 },\n        getLengthOfQueue: { type: 'accessor', value: x => x.len || 1 },\n        // 1: left, 0: middle, -1: right\n        getAnchorX: { type: 'accessor', value: x => x.anchorX || 0 },\n        // 1: top, 0: center, -1: bottom\n        getAnchorY: { type: 'accessor', value: x => x.anchorY || 0 },\n        getPixelOffset: { type: 'accessor', value: [0, 0] },\n        // object with the same pickingIndex will be picked when any one of them is being picked\n        getPickingIndex: { type: 'accessor', value: x => x.objectIndex }\n    };\n    //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n    const UNSIGNED_BYTE = 0x1401;\n    function _MultiIconLayer(...props) {\n        class __MultiIconLayer extends base.layers.IconLayer {\n            constructor(...props) {\n                super(...arguments);\n            }\n            getShaders() {\n                return Object.assign({}, super.getShaders(), {\n                    vs,\n                    fs\n                });\n            }\n            initializeState() {\n                super.initializeState();\n                const attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePixelOffset: {\n                        size: 2,\n                        transition: true,\n                        accessor: 'getPixelOffset'\n                    },\n                    instanceHighlightColors: {\n                        size: 4,\n                        type: UNSIGNED_BYTE,\n                        transition: true,\n                        accessor: 'getHighlightColor',\n                        defaultValue: [0, 255, 0, 255]\n                    }\n                });\n            }\n            updateState(updateParams) {\n                super.updateState(updateParams);\n                const { changeFlags } = updateParams;\n                if (changeFlags.updateTriggersChanged &&\n                    (changeFlags.updateTriggersChanged.getAnchorX || changeFlags.updateTriggersChanged.getAnchorY)) {\n                    this.getAttributeManager().invalidate('instanceOffsets');\n                }\n            }\n            draw({ uniforms }) {\n                const { sdf } = this.props;\n                super.draw({\n                    uniforms: Object.assign({}, uniforms, {\n                        // Refer the following doc about gamma and buffer\n                        // https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817\n                        buffer: DEFAULT_BUFFER,\n                        gamma: DEFAULT_GAMMA,\n                        sdf: Boolean(sdf)\n                    })\n                });\n            }\n            calculateInstanceOffsets(attribute) {\n                const { data, iconMapping, getIcon, getAnchorX, getAnchorY, getLengthOfQueue, getShiftInQueue } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                for (const object of data) {\n                    const icon = getIcon(object);\n                    const rect = iconMapping[icon] || {};\n                    const len = getLengthOfQueue(object);\n                    const shiftX = getShiftInQueue(object);\n                    value[i++] = ((getAnchorX(object) - 1) * len) / 2 + rect.width / 2 + shiftX || 0;\n                    value[i++] = (rect.height / 2) * getAnchorY(object) || 0;\n                }\n            }\n            calculateInstancePickingColors(attribute) {\n                const { data, getPickingIndex } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                const pickingColor = [];\n                for (const point of data) {\n                    const index = getPickingIndex(point);\n                    this.encodePickingColor(index, pickingColor);\n                    value[i++] = pickingColor[0];\n                    value[i++] = pickingColor[1];\n                    value[i++] = pickingColor[2];\n                }\n            }\n        }\n        __MultiIconLayer.layerName = 'MultiIconLayer';\n        __MultiIconLayer.defaultProps = defaultProps;\n        const instance = new __MultiIconLayer(...arguments);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * CubeLayer - a Deck.gl layer to render cuboids.\n     * This is instantiatable by calling `new MultiIconLayer()`.\n     */\n    const MultiIconLayer = _MultiIconLayer;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    const TEXT_ANCHOR = {\n        start: 1,\n        middle: 0,\n        end: -1\n    };\n    const ALIGNMENT_BASELINE = {\n        top: 1,\n        center: 0,\n        bottom: -1\n    };\n    const DEFAULT_COLOR = [0, 0, 0, 255];\n    const MISSING_CHAR_WIDTH = 32;\n    const FONT_SETTINGS_PROPS = ['fontSize', 'buffer', 'sdf', 'radius', 'cutoff'];\n    const defaultProps$1 = {\n        fp64: false,\n        sizeScale: 1,\n        characterSet: DEFAULT_CHAR_SET,\n        fontFamily: DEFAULT_FONT_FAMILY,\n        fontWeight: DEFAULT_FONT_WEIGHT,\n        fontSettings: {},\n        getText: { type: 'accessor', value: x => x.text },\n        getPosition: { type: 'accessor', value: x => x.position },\n        getColor: { type: 'accessor', value: DEFAULT_COLOR },\n        getSize: { type: 'accessor', value: 32 },\n        getAngle: { type: 'accessor', value: 0 },\n        getHighlightColor: { type: 'accessor', value: DEFAULT_COLOR },\n        getTextAnchor: { type: 'accessor', value: 'middle' },\n        getAlignmentBaseline: { type: 'accessor', value: 'center' },\n        getPixelOffset: { type: 'accessor', value: [0, 0] }\n    };\n    function _ChromaticTextLayer(props) {\n        class __ChromaticTextLayer extends base.deck.CompositeLayer {\n            updateState({ props, oldProps, changeFlags }) {\n                const fontChanged = this.fontChanged(oldProps, props);\n                if (fontChanged) {\n                    this.updateFontAtlas();\n                }\n                if (changeFlags.dataChanged ||\n                    fontChanged ||\n                    (changeFlags.updateTriggersChanged &&\n                        (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText))) {\n                    this.transformStringToLetters();\n                }\n            }\n            updateFontAtlas() {\n                const { gl } = this.context;\n                const { fontSettings, fontFamily, fontWeight, characterSet } = this.props;\n                const mergedFontSettings = Object.assign({}, DEFAULT_FONT_SETTINGS, fontSettings, {\n                    fontFamily,\n                    fontWeight,\n                    characterSet\n                });\n                const { scale, mapping, texture } = makeFontAtlas(gl, mergedFontSettings);\n                this.setState({\n                    scale,\n                    iconAtlas: texture,\n                    iconMapping: mapping\n                });\n            }\n            fontChanged(oldProps, props) {\n                if (oldProps.fontFamily !== props.fontFamily ||\n                    oldProps.characterSet !== props.characterSet ||\n                    oldProps.fontWeight !== props.fontWeight) {\n                    return true;\n                }\n                if (oldProps.fontSettings === props.fontSettings) {\n                    return false;\n                }\n                const oldFontSettings = oldProps.fontSettings || {};\n                const fontSettings = props.fontSettings || {};\n                return FONT_SETTINGS_PROPS.some(prop => oldFontSettings[prop] !== fontSettings[prop]);\n            }\n            getPickingInfo({ info }) {\n                // because `TextLayer` assign the same pickingInfoIndex for one text label,\n                // here info.index refers the index of text label in props.data\n                return Object.assign(info, {\n                    // override object with original data\n                    object: info.index >= 0 ? this.props.data[info.index] : null\n                });\n            }\n            /* eslint-disable no-loop-func */\n            transformStringToLetters() {\n                const { data, getText } = this.props;\n                const { iconMapping } = this.state;\n                const transformedData = [];\n                let objectIndex = 0;\n                for (const val of data) {\n                    const text = getText(val);\n                    if (text) {\n                        const letters = Array.from(text);\n                        const offsets = [0];\n                        let offsetLeft = 0;\n                        letters.forEach((letter, i) => {\n                            const datum = {\n                                text: letter,\n                                index: i,\n                                offsets,\n                                len: text.length,\n                                // reference of original object and object index\n                                object: val,\n                                objectIndex\n                            };\n                            const frame = iconMapping[letter];\n                            if (frame) {\n                                offsetLeft += frame.width;\n                            }\n                            else {\n                                //log.warn(`Missing character: ${letter}`)();\n                                offsetLeft += MISSING_CHAR_WIDTH;\n                            }\n                            offsets.push(offsetLeft);\n                            transformedData.push(datum);\n                        });\n                    }\n                    objectIndex++;\n                }\n                this.setState({ data: transformedData });\n            }\n            /* eslint-enable no-loop-func */\n            getLetterOffset(datum) {\n                return datum.offsets[datum.index];\n            }\n            getTextLength(datum) {\n                return datum.offsets[datum.offsets.length - 1];\n            }\n            _getAccessor(accessor) {\n                if (typeof accessor === 'function') {\n                    return x => accessor(x.object);\n                }\n                return accessor;\n            }\n            getAnchorXFromTextAnchor(getTextAnchor) {\n                return x => {\n                    const textAnchor = typeof getTextAnchor === 'function' ? getTextAnchor(x.object) : getTextAnchor;\n                    if (!TEXT_ANCHOR.hasOwnProperty(textAnchor)) {\n                        throw new Error(`Invalid text anchor parameter: ${textAnchor}`);\n                    }\n                    return TEXT_ANCHOR[textAnchor];\n                };\n            }\n            getAnchorYFromAlignmentBaseline(getAlignmentBaseline) {\n                return x => {\n                    const alignmentBaseline = typeof getAlignmentBaseline === 'function'\n                        ? getAlignmentBaseline(x.object)\n                        : getAlignmentBaseline;\n                    if (!ALIGNMENT_BASELINE.hasOwnProperty(alignmentBaseline)) {\n                        throw new Error(`Invalid alignment baseline parameter: ${alignmentBaseline}`);\n                    }\n                    return ALIGNMENT_BASELINE[alignmentBaseline];\n                };\n            }\n            renderLayers() {\n                const { data, scale, iconAtlas, iconMapping } = this.state;\n                const { getPosition, getColor, getSize, getAngle, getHighlightColor, getTextAnchor, getAlignmentBaseline, getPixelOffset, fp64, sdf, sizeScale, transitions, updateTriggers } = this.props;\n                const SubLayerClass = this.getSubLayerClass('characters', MultiIconLayer);\n                return new SubLayerClass({\n                    sdf,\n                    iconAtlas,\n                    iconMapping,\n                    getPosition: d => getPosition(d.object),\n                    getColor: this._getAccessor(getColor),\n                    getSize: this._getAccessor(getSize),\n                    getAngle: this._getAccessor(getAngle),\n                    getHighlightColor: this._getAccessor(getHighlightColor),\n                    getAnchorX: this.getAnchorXFromTextAnchor(getTextAnchor),\n                    getAnchorY: this.getAnchorYFromAlignmentBaseline(getAlignmentBaseline),\n                    getPixelOffset: this._getAccessor(getPixelOffset),\n                    fp64,\n                    sizeScale: sizeScale * scale,\n                    transitions: transitions && {\n                        getPosition: transitions.getPosition,\n                        getAngle: transitions.getAngle,\n                        getHighlightColor: transitions.getHighlightColor,\n                        getColor: transitions.getColor,\n                        getSize: transitions.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset\n                    }\n                }, this.getSubLayerProps({\n                    id: 'characters',\n                    updateTriggers: {\n                        getPosition: updateTriggers.getPosition,\n                        getAngle: updateTriggers.getAngle,\n                        getHighlightColor: updateTriggers.getHighlightColor,\n                        getColor: updateTriggers.getColor,\n                        getSize: updateTriggers.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset,\n                        getAnchorX: updateTriggers.getTextAnchor,\n                        getAnchorY: updateTriggers.getAlignmentBaseline\n                    }\n                }), {\n                    data,\n                    getIcon: d => d.text,\n                    getShiftInQueue: d => this.getLetterOffset(d),\n                    getLengthOfQueue: d => this.getTextLength(d)\n                });\n            }\n        }\n        __ChromaticTextLayer.layerName = 'TextLayer';\n        __ChromaticTextLayer.defaultProps = defaultProps$1;\n        const instance = new __ChromaticTextLayer(props);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * TextLayer - a modification of deck.gl's TextLayer.\n     * This is instantiatable by calling `new TextLayer()`.\n     */\n    const ChromaticTextLayer = _ChromaticTextLayer;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    // Licensed under the MIT license.\n    function concat(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []);\n    }\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    var fs$1 = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n\n    const minHeight = '100px';\n    const minWidth = '100px';\n    const lightSettings = {\n        '2d': {},\n        '3d': {\n            lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n            ambientRatio: 0.3,\n            diffuseRatio: 0.6,\n            specularRatio: 0.4,\n            lightsStrength: [0.3, 0.0, 0.8, 0.0],\n            numberOfLights: 2\n        }\n    };\n    const defaultPresenterStyle = {\n        cssPrefix: 'vega-deckgl-',\n        defaultCubeColor: [128, 128, 128, 255],\n        highlightColor: [0, 0, 0, 255],\n        lightSettings\n    };\n    const defaultPresenterConfig = {\n        onCubeClick: (e, cube) => { },\n        onCubeHover: (e, cube) => { },\n        transitionDurations: {\n            color: 100,\n            position: 600,\n            size: 600,\n            view: 600\n        }\n    };\n    function createStage(view) {\n        const stage = {\n            view,\n            cubeData: [],\n            axes: {\n                x: [],\n                y: []\n            },\n            gridLines: [],\n            textData: [],\n            legend: {\n                rows: {}\n            },\n            facets: []\n        };\n        return stage;\n    }\n    const groupStrokeWidth = 1;\n    const lineZ = -1;\n    const defaultView = '2d';\n    const min3dDepth = 0.05;\n    const minPixelSize = 0.5;\n\n    var defaults = /*#__PURE__*/Object.freeze({\n        minHeight: minHeight,\n        minWidth: minWidth,\n        defaultPresenterStyle: defaultPresenterStyle,\n        defaultPresenterConfig: defaultPresenterConfig,\n        createStage: createStage,\n        groupStrokeWidth: groupStrokeWidth,\n        lineZ: lineZ,\n        defaultView: defaultView,\n        min3dDepth: min3dDepth,\n        minPixelSize: minPixelSize\n    });\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    var vs$1 = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_scale(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_scale(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_scale(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, offset, position_worldspace);\n\n  float lightWeight = 1.0;\n  \n  //allow for a small amount of error around the min3dDepth \n  if (instanceSizes.z >= ${min3dDepth.toFixed(4)} - 0.0001) {\n    lightWeight = lighting_getLightWeight(\n      position_worldspace.xyz, // the w component is always 1.0\n      normals\n    );\n  }\n\n  vec3 lightWeightedColor = lightWeight * instanceColors.rgb;\n  vec3 mixedLight = mix(instanceColors.rgb, lightWeightedColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n    const UNSIGNED_BYTE$1 = 0x1401;\n    const DEFAULT_COLOR$1 = [255, 0, 255, 255];\n    const defaultProps$2 = {\n        lightingMix: 0.5,\n        fp64: false,\n        getSize: x => x.size,\n        getPosition: x => x.position,\n        getColor: x => x.color\n    };\n    function _CubeLayer(props) {\n        //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n        class __CubeLayer extends base.deck.Layer {\n            getShaders() {\n                const projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n                return { vs: vs$1, fs: fs$1, modules: [projectModule, 'lighting', 'picking'] };\n            }\n            initializeState() {\n                const attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        transition: true,\n                        accessor: 'getPosition'\n                    },\n                    instancePositions64xyLow: {\n                        size: 3,\n                        accessor: 'getPosition',\n                        update: this.calculateInstancePositions64xyLow\n                    },\n                    instanceSizes: {\n                        size: 3,\n                        transition: true,\n                        accessor: 'getSize'\n                    },\n                    instanceColors: {\n                        size: 4,\n                        type: UNSIGNED_BYTE$1,\n                        transition: true,\n                        accessor: 'getColor',\n                        defaultValue: DEFAULT_COLOR$1\n                    }\n                });\n            }\n            updateState({ props, oldProps, changeFlags }) {\n                super.updateState({ props, oldProps, changeFlags }); //TODO add parameter type to deck.gl-typings\n                // Re-generate model if geometry changed\n                if (props.fp64 !== oldProps.fp64) {\n                    const { gl } = this.context;\n                    if (this.state.model) {\n                        this.state.model.delete();\n                    }\n                    this.setState({ model: this._getModel(gl) });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n            _getModel(gl) {\n                return new base.luma.Model(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new base.luma.CubeGeometry(),\n                    isInstanced: true,\n                    shaderCache: this.context.shaderCache\n                }));\n            }\n            draw({ uniforms }) {\n                let { lightingMix } = this.props;\n                if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n                    lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n                }\n                this.state.model.render(Object.assign({}, uniforms, {\n                    lightingMix\n                }));\n            }\n            calculateInstancePositions64xyLow(attribute) {\n                const isFP64 = this.use64bitPositions();\n                attribute.constant = !isFP64;\n                if (!isFP64) {\n                    attribute.value = new Float32Array(2);\n                    return;\n                }\n                const { data, getPosition } = this.props;\n                const { value } = attribute;\n                let i = 0;\n                for (const point of data) {\n                    const position = getPosition(point);\n                    value[i++] = base.luma.fp64.fp64LowPart(position[0]);\n                    value[i++] = base.luma.fp64.fp64LowPart(position[1]);\n                }\n            }\n        }\n        __CubeLayer.layerName = 'CubeLayer';\n        __CubeLayer.defaultProps = defaultProps$2;\n        const instance = new __CubeLayer(props);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * CubeLayer - a Deck.gl layer to render cuboids.\n     * This is instantiatable by calling `new CubeLayer()`.\n     */\n    const CubeLayer = _CubeLayer;\n\n    var pi = Math.PI;\n\n    function expInOut(t) {\n      return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n    }\n\n    var tau = 2 * Math.PI;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function getLayers(presenter, config, stage, lightSettings, lightingMix, interpolator, guideLines) {\n        const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n        const { x, y } = stage.axes;\n        const lines = concat(stage.gridLines, guideLines);\n        const texts = [...stage.textData];\n        [x, y].forEach(axes => {\n            axes.forEach(axis => {\n                if (axis.domain)\n                    lines.push(axis.domain);\n                if (axis.ticks)\n                    lines.push.apply(lines, axis.ticks);\n                if (axis.tickText)\n                    texts.push.apply(texts, axis.tickText);\n                if (axis.title)\n                    texts.push(axis.title);\n            });\n        });\n        if (stage.facets) {\n            stage.facets.forEach(f => {\n                if (f.lines)\n                    lines.push.apply(lines, f.lines);\n                if (f.facetTitle)\n                    texts.push(f.facetTitle);\n            });\n        }\n        const lineLayer = newLineLayer(layerNames.lines, lines);\n        const textLayer = newTextLayer(presenter, layerNames.text, texts, config, presenter.style.fontFamily);\n        return [textLayer, cubeLayer, lineLayer];\n    }\n    function newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings, lightingMix, interpolator) {\n        const getPosition = getTiming(config.transitionDurations.position, expInOut);\n        const getSize = getTiming(config.transitionDurations.size, expInOut);\n        const getColor = getTiming(config.transitionDurations.color);\n        const cubeLayerProps = {\n            interpolator,\n            lightingMix,\n            id: layerNames.cubes,\n            data: cubeData,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            pickable: true,\n            autoHighlight: true,\n            highlightColor,\n            onClick: (o, e) => {\n                config.onCubeClick(e && e.srcEvent, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onCube = false;\n                    config.onCubeHover(e && e.srcEvent, null);\n                }\n                else {\n                    presenter.deckgl.interactiveState.onCube = true;\n                    config.onCubeHover(e && e.srcEvent, o.object);\n                }\n            },\n            lightSettings,\n            transitions: {\n                getPosition,\n                getColor,\n                getSize\n            }\n        };\n        return new CubeLayer(cubeLayerProps);\n    }\n    function newLineLayer(id, data) {\n        return new base.layers.LineLayer({\n            id,\n            data,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            getColor: (o) => o.color,\n            getStrokeWidth: (o) => o.strokeWidth\n        });\n    }\n    function newTextLayer(presenter, id, data, config, fontFamily) {\n        const props = {\n            id,\n            data,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.IDENTITY,\n            autoHighlight: true,\n            pickable: true,\n            getHighlightColor: config.getTextHighlightColor || (o => o.color),\n            onClick: (o, e) => {\n                let pe = e && e.srcEvent;\n                //handle iOS event\n                if (e.center) {\n                    pe = { clientX: e.center.x, clientY: e.center.y };\n                }\n                config.onTextClick && config.onTextClick(pe, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onText = false;\n                }\n                else {\n                    presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n                }\n            },\n            getColor: config.getTextColor || (o => o.color),\n            getTextAnchor: o => o.textAnchor,\n            getSize: o => o.size,\n            getAngle: o => o.angle,\n            fontSettings: {\n                sdf: true,\n                fontSize: 128,\n                buffer: 3\n            }\n        };\n        if (fontFamily) {\n            props.fontFamily = fontFamily;\n        }\n        return new ChromaticTextLayer(props);\n    }\n    function getTiming(duration, easing) {\n        let timing;\n        if (duration) {\n            timing = {\n                duration\n            };\n            if (easing) {\n                timing.easing = easing;\n            }\n        }\n        return timing;\n    }\n    function getCubeLayer(deckProps) {\n        return deckProps.layers.filter(layer => layer.id === layerNames.cubes)[0];\n    }\n    function getCubes(deckProps) {\n        const cubeLayer = getCubeLayer(deckProps);\n        if (!cubeLayer)\n            return;\n        const cubeLayerProps = cubeLayer.props;\n        return cubeLayerProps.data;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    var util = /*#__PURE__*/Object.freeze({\n        addDiv: addDiv,\n        addEl: addEl,\n        clone: clone,\n        colorFromString: colorFromString,\n        colorIsEqual: colorIsEqual,\n        colorToString: colorToString,\n        deepMerge: deepMerge,\n        desaturate: desaturate,\n        isColor: isColor,\n        getCubeLayer: getCubeLayer,\n        getCubes: getCubes,\n        outerSize: outerSize\n    });\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const markStager = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            var x1, y1, x2, y2;\n            x1 = item.x || 0;\n            y1 = item.y || 0;\n            x2 = item.x2 != null ? item.x2 : x1;\n            y2 = item.y2 != null ? item.y2 : y1;\n            const lineItem = styledLine(x1 + x - options.offsetX, y1 + y - options.offsetY, x2 + x - options.offsetX, y2 + y - options.offsetY, item.stroke, item.strokeWidth);\n            if (item.mark.role === 'axis-tick') {\n                options.currAxis.ticks.push(lineItem);\n            }\n            else if (item.mark.role === 'axis-domain') {\n                options.currAxis.domain = lineItem;\n            }\n            else {\n                stage.gridLines.push(lineItem);\n            }\n        });\n    };\n    function styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n        const line = {\n            sourcePosition: [x1, -y1, lineZ],\n            targetPosition: [x2, -y2, lineZ],\n            color: colorFromString(stroke),\n            strokeWidth: strokeWidth * 10 //translate width to deck.gl\n        };\n        return line;\n    }\n    function box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n        const lines = [\n            styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n            styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n            styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n            styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)\n        ];\n        if (diagonals) {\n            lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n            lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n        }\n        return lines;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    (function (PresenterElement) {\n        PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n        PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n        PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n        PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n        PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n    })(exports.PresenterElement || (exports.PresenterElement = {}));\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function initializePanel(presenter) {\n        const rootDiv = (createElement(\"div\", { className: className(exports.PresenterElement.root, presenter) },\n            createElement(\"div\", { className: className(exports.PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n            createElement(\"div\", { className: className(exports.PresenterElement.panel, presenter) },\n                createElement(\"div\", { className: className(exports.PresenterElement.vegaControls, presenter) }),\n                createElement(\"div\", { className: className(exports.PresenterElement.legend, presenter) }))));\n        mount(rootDiv, presenter.el);\n    }\n    function className(type, presenter) {\n        return `${presenter.style.cssPrefix}${exports.PresenterElement[type]}`;\n    }\n\n    function createOrbitControllerClass(factoryOptions) {\n        function wrapper(props) {\n            class OrbitControllerInternal extends base.deck._OrbitController {\n                constructor(props) {\n                    super(props);\n                    this.invertPan = true;\n                }\n                _onDoubleTap(event) {\n                    if (factoryOptions && factoryOptions.doubleClickHandler) {\n                        factoryOptions.doubleClickHandler(event, this);\n                    }\n                    else {\n                        super._onDoubleTap(event);\n                    }\n                }\n                _onPanRotate(event) {\n                    if (!this.dragRotate) {\n                        return false;\n                    }\n                    return this._onPanRotateStandard(event);\n                }\n            }\n            const instance = new OrbitControllerInternal(props);\n            return instance;\n        }\n        return wrapper;\n    }\n\n    //adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\n    const CANVAS_STYLE = {\n        position: 'absolute',\n        left: 0,\n        top: 0,\n        width: '100%',\n        height: '100%'\n    };\n    // Create canvas elements for map and deck\n    function createCanvas(props) {\n        let { container = document.body } = props;\n        if (typeof container === 'string') {\n            container = document.getElementById(container);\n        }\n        if (!container) {\n            throw Error('Deck: container not found');\n        }\n        // Add DOM elements\n        const containerStyle = window.getComputedStyle(container);\n        if (containerStyle.position === 'static') {\n            container.style.position = 'relative';\n        }\n        const deckCanvas = document.createElement('canvas');\n        container.appendChild(deckCanvas);\n        Object.assign(deckCanvas.style, CANVAS_STYLE);\n        return { container, deckCanvas };\n    }\n    /**\n     * Creates Deck.gl classes for rendering WebGL.\n     * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n     */\n    function createDeckGLClassesForPresenter(factoryOptions) {\n        const OrbitControllerClass = createOrbitControllerClass(factoryOptions);\n        //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n        //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n        function wrapper(props) {\n            /**\n             * @params container (Element) - DOM element to add deck.gl canvas to\n             * @params controller (Object) - Controller class. Leave empty for auto detection\n             */\n            class DeckGLInternal extends base.deck.Deck {\n                constructor(props = {}) {\n                    if (typeof document === 'undefined') {\n                        // Not browser\n                        throw Error('Deck can only be used in the browser');\n                    }\n                    const { deckCanvas } = createCanvas(props);\n                    const viewState = props.initialViewState || props.viewState || {};\n                    super(Object.assign({}, props, {\n                        width: '100%',\n                        height: '100%',\n                        canvas: deckCanvas,\n                        controller: OrbitControllerClass,\n                        initialViewState: viewState\n                    }));\n                    // Callback for the controller\n                    this._updateViewState = params => {\n                        if (this.onViewStateChange) {\n                            this.onViewStateChange(params);\n                        }\n                    };\n                }\n                setProps(props) {\n                    // this._updateViewState must be bound to `this`\n                    // but we don't have access to the current instance before calling super().\n                    if ('onViewStateChange' in props && this._updateViewState) {\n                        // This is called at least once at _onRendererInitialized\n                        this.onViewStateChange = props.onViewStateChange;\n                        props.onViewStateChange = this._updateViewState;\n                    }\n                    super.setProps(props);\n                }\n            }\n            const instance = new DeckGLInternal(props);\n            return instance;\n        }\n        return {\n            OrbitControllerClass,\n            DeckGL_Class: wrapper\n        };\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const LegendView = (props) => {\n        const rows = [];\n        const addRow = (row, i) => {\n            const fn = symbolMap[row.symbol.shape];\n            let jsx;\n            if (fn) {\n                jsx = fn(row.symbol);\n            }\n            else {\n                jsx = createElement(\"span\", null, \"x\");\n                //console.log(`need to render ${row.symbol.shape} symbol shape`);\n            }\n            rows.push({\n                cells: [\n                    { className: 'symbol', content: jsx },\n                    { className: 'label', content: row.label, title: row.label }\n                ]\n            });\n        };\n        var sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n        sorted.forEach(i => addRow(props.legend.rows[i], +i));\n        if (sorted.length) {\n            return (createElement(Table, { rows: rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\"tr\", { onClick: e => props.onClick(e, props.legend, null) },\n                createElement(\"th\", { colSpan: 2 }, props.legend.title))));\n        }\n    };\n    const symbolMap = {\n        square: function (symbol) {\n            return (createElement(\"div\", { style: {\n                    height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                    width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                    backgroundColor: symbol.fill,\n                    borderColor: symbol.fill\n                } }));\n        }\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function wrapper(props) {\n        class LinearInterpolatorInternal extends base.deck.LinearInterpolator {\n            constructor(transitionProps) {\n                super(transitionProps);\n            }\n            interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n                if (this.layerStartProps && this.layerEndProps) {\n                    this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n                }\n                return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n            }\n        }\n        const instance = new LinearInterpolatorInternal(props);\n        return instance;\n    }\n    const LinearInterpolator = wrapper;\n\n    function patchCubeArray(allocatedSize, empty, cubes) {\n        const patched = new Array(allocatedSize);\n        patched.fill(empty);\n        cubes.forEach(cube => patched[cube.ordinal] = cube);\n        return patched;\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const legendMap = {\n        'legend-title': function (legend, textItem) {\n            legend.title = textItem.text;\n        },\n        'legend-symbol': function (legend, symbol) {\n            const { bounds, fill, shape } = symbol;\n            //this object is safe for serialization\n            const legendRowSymbol = { bounds, fill, shape };\n            const i = symbol.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            legend.rows[i].symbol = legendRowSymbol;\n        },\n        'legend-label': function (legend, label) {\n            const i = label.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            const row = legend.rows[i];\n            row.label = label.text;\n            row.value = label.datum.value;\n        }\n    };\n    const markStager$1 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const fn = legendMap[item.mark.role];\n            if (fn) {\n                fn(stage.legend, item);\n            }\n        });\n    };\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    const markStager$2 = (options, stage, scene, x, y, groupType) => {\n        let i = 0;\n        base.vega.sceneVisit(scene, function (item) {\n            //for orthographic (2d) - always use 0 or else Deck will not show them\n            const z = stage.view === '2d' ? 0 : (item.z || 0);\n            const depth = (stage.view === '2d' ? 0 : (item.depth || 0)) + min3dDepth;\n            //change direction of y from SVG to GL\n            const ty = -1;\n            let ordinal = i;\n            if (item.datum.GL_ORDINAL !== void 0) {\n                options.ordinalsSpecified = true;\n                ordinal = item.datum.GL_ORDINAL;\n                if (ordinal > options.maxOrdinal) {\n                    options.maxOrdinal = ordinal;\n                }\n            }\n            const cube = {\n                ordinal,\n                size: [item.width, item.height, depth],\n                position: [x + (item.x || 0) - options.offsetX, ty * (y + (item.y || 0) - options.offsetY) - item.height, z],\n                color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n            };\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n            stage.cubeData.push(cube);\n            i++;\n        });\n    };\n\n    const markStager$3 = (options, stage, scene, x, y, groupType) => {\n        //scale Deck.Gl text to Vega size\n        const fontScale = 6;\n        //Deck.gl centers text on Y. TODO: is this correct on x axis?\n        const offsetYCenter = 16;\n        //change direction of y from SVG to GL\n        const ty = -1;\n        base.vega.sceneVisit(scene, function (item) {\n            if (!item.text)\n                return;\n            const size = item.fontSize * fontScale;\n            const textItem = {\n                color: colorFromString(item.fill),\n                text: item.text.toString(),\n                position: [x + item.x - options.offsetX, ty * (y + item.y + offsetYCenter - options.offsetY), 0],\n                size,\n                angle: convertAngle(item.angle),\n                textAnchor: convertAlignment(item.align),\n                alignmentBaseline: convertBaseline(item.baseline)\n            };\n            if (item.mark.role === 'axis-label') {\n                const tickText = textItem;\n                tickText.value = item.datum.value;\n                options.currAxis.tickText.push(tickText);\n            }\n            else if (item.mark.role === 'axis-title') {\n                options.currAxis.title = textItem;\n            }\n            else if (options.currFacetRect && !options.currFacetRect.facetTitle) {\n                options.currFacetRect.facetTitle = textItem;\n                textItem.position = [x - options.offsetX, ty * (y + offsetYCenter - options.offsetY), 0];\n            }\n            else {\n                stage.textData.push(textItem);\n            }\n        });\n    };\n    function convertAngle(vegaTextAngle) {\n        if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n            return 360 - vegaTextAngle;\n        }\n        return 0;\n    }\n    function convertAlignment(textAlign) {\n        switch (textAlign) {\n            case 'center': return 'middle';\n            case 'left': return 'start';\n            case 'right': return 'end';\n        }\n        return 'start';\n    }\n    function convertBaseline(baseline) {\n        switch (baseline) {\n            case 'middle': return 'center';\n        }\n        return baseline || 'bottom';\n    }\n\n    var GroupType;\n    (function (GroupType) {\n        GroupType[GroupType[\"none\"] = 0] = \"none\";\n        GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n        GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n        GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n    })(GroupType || (GroupType = {}));\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    function convertGroupRole(group) {\n        if (group.mark.role === 'legend')\n            return GroupType.legend;\n        if (group.mark.role === 'axis') {\n            var vegaAxisDatum = group.datum;\n            if (vegaAxisDatum) {\n                switch (vegaAxisDatum.orient) {\n                    case 'bottom':\n                    case 'top':\n                        return GroupType.xAxis;\n                    case 'left':\n                    case 'right':\n                        return GroupType.yAxis;\n                }\n            }\n        }\n    }\n    const group = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (g) {\n            if (g.bounds.x1 < options.offsetX) {\n                options.offsetX = g.bounds.x1;\n            }\n            if (g.bounds.y1 < options.offsetY) {\n                options.offsetY = g.bounds.y1;\n            }\n            const gx = g.x || 0, gy = g.y || 0;\n            if (g.context && g.context.background && !stage.backgroundColor) {\n                stage.backgroundColor = colorFromString(g.context.background);\n            }\n            if (g.stroke) {\n                const facetRect = {\n                    lines: box(gx + x - options.offsetX, gy + y - options.offsetY, g.height, g.width, g.stroke, groupStrokeWidth)\n                };\n                stage.facets.push(facetRect);\n                options.currFacetRect = facetRect;\n            }\n            groupType = convertGroupRole(g) || groupType;\n            setCurrentAxis(options, stage, groupType);\n            // draw group contents\n            base.vega.sceneVisit(g, function (item) {\n                mainStager(options, stage, item, gx + x, gy + y, groupType);\n            });\n        });\n    };\n    function setCurrentAxis(options, stage, groupType) {\n        let axes;\n        switch (groupType) {\n            case GroupType.xAxis:\n                axes = stage.axes.x;\n                break;\n            case GroupType.yAxis:\n                axes = stage.axes.y;\n                break;\n            default:\n                return;\n        }\n        options.currAxis = {\n            domain: null,\n            tickText: [],\n            ticks: []\n        };\n        axes.push(options.currAxis);\n    }\n    const markStagers = {\n        group,\n        legend: markStager$1,\n        rect: markStager$2,\n        rule: markStager,\n        text: markStager$3\n    };\n    var mainStager = (options, stage, scene, x, y, groupType) => {\n        if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n            markStager$1(options, stage, scene, x, y, groupType);\n        }\n        else {\n            var markStager$$1 = markStagers[scene.marktype];\n            if (markStager$$1) {\n                markStager$$1(options, stage, scene, x, y, groupType);\n            }\n        }\n    };\n    function sceneToStage(options, stage, scene) {\n        mainStager(options, stage, scene, 0, 0, null);\n        sortAxis(stage.axes.x, 0);\n        sortAxis(stage.axes.y, 1);\n    }\n    function sortAxis(axes, dim) {\n        axes.forEach(axis => {\n            if (axis.domain)\n                orderDomain(axis.domain, dim);\n            axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n            axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n        });\n    }\n    function orderDomain(domain, dim) {\n        if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n            const temp = domain.targetPosition;\n            domain.targetPosition = domain.sourcePosition;\n            domain.sourcePosition = temp;\n        }\n    }\n\n    const viewStateProps = ['distance', 'fov', 'lookAt', 'rotationOrbit', 'rotationX', 'zoom'];\n    function targetViewState(height, width, view) {\n        const distance = 10;\n        const fov = 60;\n        const lookAt = [width / 2, -height / 2, 0];\n        //add a 4th dimension to make transitions work\n        lookAt.push(1);\n        if (view === '2d') {\n            return {\n                distance,\n                fov,\n                lookAt,\n                rotationOrbit: 0,\n                rotationX: 0,\n                zoom: 10 / height\n            };\n        }\n        else {\n            return {\n                distance,\n                fov,\n                lookAt,\n                rotationOrbit: -25,\n                rotationX: 60,\n                zoom: 9 / height\n            };\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    /**\n     * Class which presents a Stage of chart data using Deck.gl to render.\n     */\n    class Presenter {\n        /**\n         * Instantiate a new Presenter.\n         * @param el Parent HTMLElement to present within.\n         * @param style Optional PresenterStyle styling options.\n         */\n        constructor(el, style) {\n            this.el = el;\n            this.style = deepMerge(defaultPresenterStyle, style);\n            initializePanel(this);\n            this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n        }\n        /**\n         * Get the previously rendered Stage object.\n         */\n        get stage() {\n            return this._last.stage;\n        }\n        /**\n         * Get the current View camera type.\n         */\n        get view() {\n            return this._last.view;\n        }\n        /**\n         * Cancels any pending animation, calling animationCanceled() on original queue.\n         */\n        animationCancel() {\n            if (this.animationTimer) {\n                clearTimeout(this.animationTimer);\n                this.animationTimer = null;\n                if (this.logger) {\n                    this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n                }\n                if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                    this.queuedAnimationOptions.animationCanceled.call(null);\n                }\n            }\n        }\n        /**\n         * Stops the current animation and queues a new animation.\n         * @param handler Function to invoke when timeout is complete.\n         * @param timeout Length of time to wait before invoking the handler.\n         * @param options Optional QueuedAnimationOptions object.\n         */\n        animationQueue(handler, timeout, options) {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...`);\n            }\n            this.animationCancel();\n            this.animationTimer = setTimeout(() => {\n                if (this.logger) {\n                    this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n                }\n                handler();\n            }, timeout);\n        }\n        /**\n         * Retrieve a sub-element of the rendered output.\n         * @param type PresenterElement type of the HTMLElement to retrieve.\n         */\n        getElement(type) {\n            const elements = this.el.getElementsByClassName(className(type, this));\n            if (elements && elements.length) {\n                return elements[0];\n            }\n        }\n        /**\n         * Present the Vega Scene, or Stage object using Deck.gl.\n         * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n         * @param height Height of the rendering area.\n         * @param width Width of the rendering area.\n         * @param config Optional presentation configuration object.\n         */\n        present(sceneOrStage, height, width, config) {\n            this.animationCancel();\n            let scene = sceneOrStage;\n            let stage;\n            let options = {\n                offsetX: 0,\n                offsetY: 0,\n                maxOrdinal: -1,\n                ordinalsSpecified: false,\n                currAxis: null,\n                currFacetRect: null,\n                defaultCubeColor: this.style.defaultCubeColor\n            };\n            //determine if this is a vega scene\n            if (scene.marktype) {\n                stage = createStage(scene.view);\n                sceneToStage(options, stage, scene);\n            }\n            else {\n                stage = sceneOrStage;\n            }\n            if (!this.deckgl) {\n                const classes = createDeckGLClassesForPresenter({\n                    doubleClickHandler: () => {\n                        this.homeCamera();\n                    }\n                });\n                this.OrbitControllerClass = classes.OrbitControllerClass;\n                const deckProps = {\n                    onLayerClick: config && config.onLayerClick,\n                    views: [new base.deck.OrbitView({ controller: this.OrbitControllerClass })],\n                    container: this.getElement(exports.PresenterElement.gl),\n                    getCursor: (interactiveState) => {\n                        if (interactiveState.onText || interactiveState.onAxisSelection) {\n                            return 'pointer';\n                        }\n                        else if (interactiveState.onCube) {\n                            return 'default';\n                        }\n                        else {\n                            return 'grab';\n                        }\n                    }\n                };\n                if (stage.backgroundColor) {\n                    deckProps.style = { 'background-color': colorToString(stage.backgroundColor) };\n                }\n                this.deckgl = new classes.DeckGL_Class(deckProps);\n            }\n            let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n            if (options.ordinalsSpecified) {\n                cubeCount = Math.max(cubeCount, options.maxOrdinal + 1);\n                const empty = {\n                    isEmpty: true,\n                    color: [0, 0, 0, 0] // possibly a bug in Deck.gl? set color to invisible.\n                };\n                stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n            }\n            this.setDeckProps(stage, height, width, cubeCount, config);\n            mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(exports.PresenterElement.legend));\n            if (config && config.onPresent) {\n                config.onPresent();\n            }\n        }\n        /**\n         * Present the same recently rendered Stage with only slight modifications such as a color change,\n         * using the previous Stage values as a basis.\n         * @param stage Partially populated Stage object containing changes.\n         * @param modifyConfig Optional presentation configuration object.\n         */\n        rePresent(stage, modifyConfig) {\n            const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n            this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n        }\n        isNewBounds(view, height, width, cubeCount) {\n            const lastBounds = this.lastBounds();\n            for (let prop in lastBounds) {\n                if (lastBounds[prop] === null)\n                    return true;\n            }\n            const newBounds = { cubeCount, height, view, width };\n            for (let prop in lastBounds) {\n                if (lastBounds[prop] !== newBounds[prop])\n                    return true;\n            }\n        }\n        lastBounds() {\n            const { cubeCount, height, view, width } = this._last;\n            return { cubeCount, height, view, width };\n        }\n        setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n            const config = deepMerge(defaultPresenterConfig, modifyConfig);\n            const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n            let lightSettings = this.style.lightSettings[stage.view];\n            let lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n            let linearInterpolator;\n            //choose the current OrbitView viewstate if possible\n            let viewState = (this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView)\n                //otherwise use the initial viewstate if any\n                || this.deckgl.props.viewState;\n            if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n                viewState = targetViewState(height, width, stage.view);\n                const oldCubeLayer = getCubeLayer(this.deckgl.props);\n                if (oldCubeLayer) {\n                    linearInterpolator = new LinearInterpolator(viewStateProps);\n                    linearInterpolator.layerStartProps = { lightingMix: oldCubeLayer.props.lightingMix };\n                    linearInterpolator.layerEndProps = { lightingMix };\n                    viewState.transitionDuration = config.transitionDurations.view;\n                    viewState.transitionEasing = expInOut;\n                    viewState.transitionInterpolator = linearInterpolator;\n                }\n                if (stage.view === '2d') {\n                    lightSettings = this.style.lightSettings['3d'];\n                }\n            }\n            const guideLines = this._showGuides && box(0, 0, height, width, '#0f0', 1, true);\n            config.preLayer && config.preLayer(stage);\n            const layers = getLayers(this, config, stage, lightSettings, lightingMix, linearInterpolator, guideLines);\n            const deckProps = {\n                views: [new base.deck.OrbitView({ controller: this.OrbitControllerClass })],\n                viewState,\n                layers\n            };\n            if (config && config.preStage) {\n                config.preStage(stage, deckProps);\n            }\n            this.deckgl.setProps(deckProps);\n            delete stage.cubeData;\n            this._last = {\n                cubeCount,\n                height,\n                width,\n                stage: stage,\n                view: stage.view\n            };\n        }\n        /**\n         * Home the camera to the last initial position.\n         */\n        homeCamera() {\n            const viewState = targetViewState(this._last.height, this._last.width, this._last.view);\n            viewState.transitionDuration = defaultPresenterConfig.transitionDurations.view;\n            viewState.transitionEasing = expInOut;\n            viewState.transitionInterpolator = new LinearInterpolator(viewStateProps);\n            const deckProps = {\n                views: this.deckgl.props.views,\n                viewState,\n                layers: this.deckgl.props.layers\n            };\n            this.deckgl.setProps(deckProps);\n        }\n        /**\n         * Get cube data array from the cubes layer.\n         */\n        getCubeData() {\n            return getCubes(this.deckgl.props);\n        }\n        /**\n         * Show guidelines of rendering height/width and center of OrbitView.\n         */\n        showGuides() {\n            this._showGuides = true;\n            this.getElement(exports.PresenterElement.gl).classList.add('show-center');\n            this.rePresent(Object.assign(Object.assign({}, this._last.stage), { cubeData: this.getCubeData() }));\n        }\n        finalize() {\n            this.animationCancel();\n            if (this.deckgl)\n                this.deckgl.finalize();\n            if (this.el)\n                this.el.innerHTML = '';\n            this._last = null;\n            this.deckgl = null;\n            this.el = null;\n            this.logger = null;\n            this.queuedAnimationOptions = null;\n        }\n    }\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    //pass in the SuperClass, which should be a vega.View\n    function _RendererGl(loader) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class RendererGlInternal extends base.vega.Renderer {\n            initialize(el, width, height, origin) {\n                this.height = height;\n                this.width = width;\n                // this method will invoke resize to size the canvas appropriately\n                return super.initialize(el, width, height, origin);\n            }\n            resize(width, height, origin) {\n                super.resize(width, height, origin);\n                this.origin = origin;\n                this.height = height;\n                this.width = width;\n                //rteturn this for vega\n                return this;\n            }\n            _render(scene, items) {\n                const scene3d = scene;\n                scene3d.view = this.getView();\n                this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n                //return this for vega\n                return this;\n            }\n        }\n        const instance = new RendererGlInternal(loader);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n     * This is instantiated by ViewGl.\n     */\n    const RendererGl = _RendererGl;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n    let registered = false;\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n    //pass in the SuperClass, which should be a vega.View\n    function _ViewGl(runtime, config) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class ViewGlInternal extends base.vega.View {\n            constructor(runtime, config = {}) {\n                super(runtime, config);\n                this.config = config;\n                this.presenter = config.presenter;\n                config.presenterConfig = config.presenterConfig || {};\n                config.presenterConfig.redraw = () => {\n                    this._redraw = true; //use Vega View private member _redraw\n                    this.run();\n                };\n            }\n            renderer(renderer) {\n                if (renderer === 'deck.gl' && !registered) {\n                    base.vega.renderModule('deck.gl', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                    registered = true;\n                }\n                return super.renderer(renderer);\n            }\n            initialize(el) {\n                if (!this.presenter) {\n                    this.presenter = new Presenter(el);\n                }\n                super.initialize(this.presenter.getElement(exports.PresenterElement.vegaControls));\n                const renderer = this._renderer;\n                renderer.presenterConfig = this.config.presenterConfig;\n                renderer.presenter = this.presenter;\n                renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView);\n                return this;\n            }\n            error(e) {\n                if (this.presenter.logger) {\n                    this.presenter.logger(e);\n                }\n            }\n        }\n        const instance = new ViewGlInternal(runtime, config);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.View, with added properties for accessing a Presenter.\n     * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n     */\n    const ViewGl = _ViewGl;\n\n    // Copyright (c) Microsoft Corporation. All rights reserved.\n\n    exports.constants = constants;\n    exports.controls = controls;\n    exports.defaults = defaults;\n    exports.types = types;\n    exports.util = util;\n    exports.base = base;\n    exports.use = use;\n    exports.Presenter = Presenter;\n    exports.ViewGl = ViewGl;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"
  },
  {
    "path": "docs/dist/vega-deck.gl/v3/vega-deck.gl.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.VegaDeckGl = {}));\n})(this, (function (exports) { 'use strict';\n\n    function _mergeNamespaces(n, m) {\n        m.forEach(function (e) {\n            e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n                if (k !== 'default' && !(k in n)) {\n                    var d = Object.getOwnPropertyDescriptor(e, k);\n                    Object.defineProperty(n, k, d.get ? d : {\n                        enumerable: true,\n                        get: function () { return e[k]; }\n                    });\n                }\n            });\n        });\n        return Object.freeze(n);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const layerNames = {\n        cubes: 'LAYER_CUBES',\n        lines: 'LAYER_LINES',\n        text: 'LAYER_TEXT',\n        paths: 'LAYER_PATHS',\n        polygons: 'LAYER_POLYGONS',\n    };\n\n    var constants = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        layerNames: layerNames\n    });\n\n    function getDefaultExportFromCjs (x) {\n    \treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n    }\n\n    var require$$0$1 = [\n    \t\"a\",\n    \t\"abbr\",\n    \t\"address\",\n    \t\"area\",\n    \t\"article\",\n    \t\"aside\",\n    \t\"audio\",\n    \t\"b\",\n    \t\"base\",\n    \t\"bdi\",\n    \t\"bdo\",\n    \t\"blockquote\",\n    \t\"body\",\n    \t\"br\",\n    \t\"button\",\n    \t\"canvas\",\n    \t\"caption\",\n    \t\"cite\",\n    \t\"code\",\n    \t\"col\",\n    \t\"colgroup\",\n    \t\"data\",\n    \t\"datalist\",\n    \t\"dd\",\n    \t\"del\",\n    \t\"details\",\n    \t\"dfn\",\n    \t\"dialog\",\n    \t\"div\",\n    \t\"dl\",\n    \t\"dt\",\n    \t\"em\",\n    \t\"embed\",\n    \t\"fieldset\",\n    \t\"figcaption\",\n    \t\"figure\",\n    \t\"footer\",\n    \t\"form\",\n    \t\"h1\",\n    \t\"h2\",\n    \t\"h3\",\n    \t\"h4\",\n    \t\"h5\",\n    \t\"h6\",\n    \t\"head\",\n    \t\"header\",\n    \t\"hgroup\",\n    \t\"hr\",\n    \t\"html\",\n    \t\"i\",\n    \t\"iframe\",\n    \t\"img\",\n    \t\"input\",\n    \t\"ins\",\n    \t\"kbd\",\n    \t\"keygen\",\n    \t\"label\",\n    \t\"legend\",\n    \t\"li\",\n    \t\"link\",\n    \t\"main\",\n    \t\"map\",\n    \t\"mark\",\n    \t\"math\",\n    \t\"menu\",\n    \t\"menuitem\",\n    \t\"meta\",\n    \t\"meter\",\n    \t\"nav\",\n    \t\"noscript\",\n    \t\"object\",\n    \t\"ol\",\n    \t\"optgroup\",\n    \t\"option\",\n    \t\"output\",\n    \t\"p\",\n    \t\"param\",\n    \t\"picture\",\n    \t\"pre\",\n    \t\"progress\",\n    \t\"q\",\n    \t\"rb\",\n    \t\"rp\",\n    \t\"rt\",\n    \t\"rtc\",\n    \t\"ruby\",\n    \t\"s\",\n    \t\"samp\",\n    \t\"script\",\n    \t\"section\",\n    \t\"select\",\n    \t\"slot\",\n    \t\"small\",\n    \t\"source\",\n    \t\"span\",\n    \t\"strong\",\n    \t\"style\",\n    \t\"sub\",\n    \t\"summary\",\n    \t\"sup\",\n    \t\"svg\",\n    \t\"table\",\n    \t\"tbody\",\n    \t\"td\",\n    \t\"template\",\n    \t\"textarea\",\n    \t\"tfoot\",\n    \t\"th\",\n    \t\"thead\",\n    \t\"time\",\n    \t\"title\",\n    \t\"tr\",\n    \t\"track\",\n    \t\"u\",\n    \t\"ul\",\n    \t\"var\",\n    \t\"video\",\n    \t\"wbr\"\n    ];\n\n    var htmlTags$1;\n    var hasRequiredHtmlTags;\n\n    function requireHtmlTags () {\n    \tif (hasRequiredHtmlTags) return htmlTags$1;\n    \thasRequiredHtmlTags = 1;\n    \thtmlTags$1 = require$$0$1;\n    \treturn htmlTags$1;\n    }\n\n    var htmlTagsExports = requireHtmlTags();\n    var index$1 = /*@__PURE__*/getDefaultExportFromCjs(htmlTagsExports);\n\n    var htmlTags = /*#__PURE__*/_mergeNamespaces({\n        __proto__: null,\n        default: index$1\n    }, [htmlTagsExports]);\n\n    var require$$0 = [\n    \t\"a\",\n    \t\"altGlyph\",\n    \t\"altGlyphDef\",\n    \t\"altGlyphItem\",\n    \t\"animate\",\n    \t\"animateColor\",\n    \t\"animateMotion\",\n    \t\"animateTransform\",\n    \t\"circle\",\n    \t\"clipPath\",\n    \t\"color-profile\",\n    \t\"cursor\",\n    \t\"defs\",\n    \t\"desc\",\n    \t\"ellipse\",\n    \t\"feBlend\",\n    \t\"feColorMatrix\",\n    \t\"feComponentTransfer\",\n    \t\"feComposite\",\n    \t\"feConvolveMatrix\",\n    \t\"feDiffuseLighting\",\n    \t\"feDisplacementMap\",\n    \t\"feDistantLight\",\n    \t\"feFlood\",\n    \t\"feFuncA\",\n    \t\"feFuncB\",\n    \t\"feFuncG\",\n    \t\"feFuncR\",\n    \t\"feGaussianBlur\",\n    \t\"feImage\",\n    \t\"feMerge\",\n    \t\"feMergeNode\",\n    \t\"feMorphology\",\n    \t\"feOffset\",\n    \t\"fePointLight\",\n    \t\"feSpecularLighting\",\n    \t\"feSpotLight\",\n    \t\"feTile\",\n    \t\"feTurbulence\",\n    \t\"filter\",\n    \t\"font\",\n    \t\"font-face\",\n    \t\"font-face-format\",\n    \t\"font-face-name\",\n    \t\"font-face-src\",\n    \t\"font-face-uri\",\n    \t\"foreignObject\",\n    \t\"g\",\n    \t\"glyph\",\n    \t\"glyphRef\",\n    \t\"hkern\",\n    \t\"image\",\n    \t\"line\",\n    \t\"linearGradient\",\n    \t\"marker\",\n    \t\"mask\",\n    \t\"metadata\",\n    \t\"missing-glyph\",\n    \t\"mpath\",\n    \t\"path\",\n    \t\"pattern\",\n    \t\"polygon\",\n    \t\"polyline\",\n    \t\"radialGradient\",\n    \t\"rect\",\n    \t\"script\",\n    \t\"set\",\n    \t\"stop\",\n    \t\"style\",\n    \t\"svg\",\n    \t\"switch\",\n    \t\"symbol\",\n    \t\"text\",\n    \t\"textPath\",\n    \t\"title\",\n    \t\"tref\",\n    \t\"tspan\",\n    \t\"use\",\n    \t\"view\",\n    \t\"vkern\"\n    ];\n\n    var lib;\n    var hasRequiredLib;\n\n    function requireLib () {\n    \tif (hasRequiredLib) return lib;\n    \thasRequiredLib = 1;\n    \tlib = require$$0;\n    \treturn lib;\n    }\n\n    var libExports = requireLib();\n    var index = /*@__PURE__*/getDefaultExportFromCjs(libExports);\n\n    var svgTags = /*#__PURE__*/_mergeNamespaces({\n        __proto__: null,\n        default: index\n    }, [libExports]);\n\n    const htmlTagArray = index$1 || htmlTags;\n    const svgTagArray = index || svgTags;\n    /**\n     * Decamelizes a string with/without a custom separator (hyphen by default).\n     * from: https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript\n     *\n     * @param str String in camelcase\n     * @param separator Separator for the new decamelized string.\n     */\n    function decamelize(str, separator = '-') {\n        return str\n            .replace(/([a-z\\d])([A-Z])/g, '$1' + separator + '$2')\n            .replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, '$1' + separator + '$2')\n            .toLowerCase();\n    }\n    function createElement(tag, attrs, ...children) {\n        if (typeof tag === 'function') {\n            const fn = tag;\n            const props = attrs;\n            props.children = children;\n            return fn(props);\n        }\n        else {\n            const ns = tagNamespace(tag);\n            const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n            const map = attrs;\n            let ref;\n            for (let name in map) {\n                if (name && map.hasOwnProperty(name)) {\n                    let value = map[name];\n                    if (name === 'className' && value !== void 0) {\n                        setAttribute(el, ns, 'class', value.toString());\n                    }\n                    else if (name === 'disabled' && !value) ;\n                    else if (value === null || value === undefined) {\n                        continue;\n                    }\n                    else if (value === true) {\n                        setAttribute(el, ns, name, name);\n                    }\n                    else if (typeof value === 'function') {\n                        if (name === 'ref') {\n                            ref = value;\n                        }\n                        else {\n                            el[name.toLowerCase()] = value;\n                        }\n                    }\n                    else if (typeof value === 'object') {\n                        setAttribute(el, ns, name, flatten(value));\n                    }\n                    else {\n                        setAttribute(el, ns, name, value.toString());\n                    }\n                }\n            }\n            if (children && children.length > 0) {\n                appendChildren(el, children);\n            }\n            if (ref) {\n                ref(el);\n            }\n            return el;\n        }\n    }\n    function setAttribute(el, ns, name, value) {\n        if (ns) {\n            el.setAttributeNS(null, name, value);\n        }\n        else {\n            el.setAttribute(name, value);\n        }\n    }\n    function flatten(o) {\n        const arr = [];\n        for (let prop in o)\n            arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n        return arr.join(';');\n    }\n    function addChild(parentElement, child) {\n        if (child === null || child === undefined || typeof child === \"boolean\") {\n            return;\n        }\n        else if (Array.isArray(child)) {\n            appendChildren(parentElement, child);\n        }\n        else if (isElement(child)) {\n            parentElement.appendChild(child);\n        }\n        else {\n            parentElement.appendChild(document.createTextNode(child.toString()));\n        }\n    }\n    function appendChildren(parentElement, children) {\n        children.forEach(child => addChild(parentElement, child));\n    }\n    function isElement(el) {\n        //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n        return !!el.nodeType;\n    }\n    function mount(element, container) {\n        container.innerHTML = '';\n        if (element) {\n            addChild(container, element);\n        }\n    }\n    function findElementByChildPositions(childPositions, container) {\n        let element = container || document.body;\n        let childPosition;\n        while (element && childPositions.length) {\n            childPosition = childPositions.shift();\n            element = element.children.item(childPosition);\n        }\n        if (element) {\n            return element;\n        }\n    }\n    function focusActiveElement(element, activeElementInfo) {\n        element.focus();\n        element.scrollTop = activeElementInfo.scrollTop;\n        const input = element;\n        if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) {\n            input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n        }\n    }\n    function setActiveElement(activeElementInfo, container) {\n        if (activeElementInfo) {\n            const element = findElementByChildPositions(activeElementInfo.childPositions, container);\n            if (element) {\n                focusActiveElement(element, activeElementInfo);\n            }\n        }\n    }\n    function getActiveElementInfo(container) {\n        let element = document.activeElement;\n        const { scrollTop, selectionDirection, selectionEnd, selectionStart } = element;\n        const activeElementInfo = {\n            childPositions: [],\n            scrollTop,\n            selectionDirection,\n            selectionEnd,\n            selectionStart\n        };\n        while (element && element !== document.body && element !== container) {\n            activeElementInfo.childPositions.unshift(getChildPosition(element));\n            element = element.parentElement;\n        }\n        if ((element === document.body || element === container) && activeElementInfo.childPositions.length)\n            return activeElementInfo;\n    }\n    function getChildPosition(element) {\n        let childPosition = 0;\n        while (element = element.previousElementSibling)\n            childPosition++;\n        return childPosition;\n    }\n    function tagNamespace(tag) {\n        //issue: this won't disambiguate certain tags which exist in both svg and html: <a>, <title> ...\n        if (tag === 'svg' || (svgTagArray.indexOf(tag) >= 0 && !(htmlTagArray.indexOf(tag) >= 0))) {\n            return \"http://www.w3.org/2000/svg\";\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const KeyCodes = {\n        ENTER: 'Enter',\n    };\n    const Table = (props) => {\n        return (createElement(\"table\", { className: props.className },\n            props.children,\n            props.rows.map((row, i) => (createElement(\"tr\", { className: props.rowClassName || '', onClick: e => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: e => {\n                    if (e.key === KeyCodes.ENTER && props.onRowClick) {\n                        props.onRowClick(e, i);\n                    }\n                } }, row.cells.map((cell, i) => (createElement(\"td\", { className: cell.className || '', title: cell.title || '' }, cell.content))))))));\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * This file is for external facing export only, do not use this for internal references,\n     * as it may cause circular dependencies in Rollup.\n     */\n\n    var controls = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        Table: Table\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n\n    var types = /*#__PURE__*/Object.freeze({\n        __proto__: null\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function concat(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []);\n    }\n    /**\n     * Returns array with items which are truthy.\n     * @param args array or arrays to concat into a single array.\n     */\n    function allTruthy(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n    }\n    /**\n     * Add an array to an existing array in place.\n     * @param arr Array to append to.\n     * @param items Arrof of items to append.\n     */\n    function push(arr, items) {\n        arr.push.apply(arr, items);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Create a new element as a child of another element.\n     * @param tagName Tag name of the new tag to create.\n     * @param parentElement Reference of the element to append to.\n     * @returns new HTMLElement.\n     */\n    function addEl(tagName, parentElement) {\n        const el = document.createElement(tagName);\n        parentElement.appendChild(el);\n        return el;\n    }\n    /**\n     * Create a new div HTMLElement as a child of another element.\n     * @param parentElement Reference of the element to append to.\n     * @param className Optional css class name to apply to the div.\n     */\n    function addDiv(parentElement, className) {\n        const div = addEl('div', parentElement);\n        if (className) {\n            div.className = className;\n        }\n        return div;\n    }\n    /**\n     * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n     * @param el HTML Element to measure.\n     */\n    function outerSize(el) {\n        const cs = getComputedStyle(el);\n        const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n        const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n        return { height, width };\n    }\n\n    var isMergeableObject = function isMergeableObject(value) {\n    \treturn isNonNullObject(value)\n    \t\t&& !isSpecial(value)\n    };\n\n    function isNonNullObject(value) {\n    \treturn !!value && typeof value === 'object'\n    }\n\n    function isSpecial(value) {\n    \tvar stringValue = Object.prototype.toString.call(value);\n\n    \treturn stringValue === '[object RegExp]'\n    \t\t|| stringValue === '[object Date]'\n    \t\t|| isReactElement(value)\n    }\n\n    // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n    var canUseSymbol = typeof Symbol === 'function' && Symbol.for;\n    var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\n    function isReactElement(value) {\n    \treturn value.$$typeof === REACT_ELEMENT_TYPE\n    }\n\n    function emptyTarget(val) {\n    \treturn Array.isArray(val) ? [] : {}\n    }\n\n    function cloneUnlessOtherwiseSpecified(value, options) {\n    \treturn (options.clone !== false && options.isMergeableObject(value))\n    \t\t? deepmerge$1(emptyTarget(value), value, options)\n    \t\t: value\n    }\n\n    function defaultArrayMerge(target, source, options) {\n    \treturn target.concat(source).map(function(element) {\n    \t\treturn cloneUnlessOtherwiseSpecified(element, options)\n    \t})\n    }\n\n    function mergeObject(target, source, options) {\n    \tvar destination = {};\n    \tif (options.isMergeableObject(target)) {\n    \t\tObject.keys(target).forEach(function(key) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    \t\t});\n    \t}\n    \tObject.keys(source).forEach(function(key) {\n    \t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    \t\t} else {\n    \t\t\tdestination[key] = deepmerge$1(target[key], source[key], options);\n    \t\t}\n    \t});\n    \treturn destination\n    }\n\n    function deepmerge$1(target, source, options) {\n    \toptions = options || {};\n    \toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    \toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n    \tvar sourceIsArray = Array.isArray(source);\n    \tvar targetIsArray = Array.isArray(target);\n    \tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n    \tif (!sourceAndTargetTypesMatch) {\n    \t\treturn cloneUnlessOtherwiseSpecified(source, options)\n    \t} else if (sourceIsArray) {\n    \t\treturn options.arrayMerge(target, source, options)\n    \t} else {\n    \t\treturn mergeObject(target, source, options)\n    \t}\n    }\n\n    deepmerge$1.all = function deepmergeAll(array, options) {\n    \tif (!Array.isArray(array)) {\n    \t\tthrow new Error('first argument should be an array')\n    \t}\n\n    \treturn array.reduce(function(prev, next) {\n    \t\treturn deepmerge$1(prev, next, options)\n    \t}, {})\n    };\n\n    var deepmerge_1 = deepmerge$1;\n\n    var _deepmerge = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        default: deepmerge_1\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const deepmerge = (deepmerge_1 || _deepmerge);\n    function clone(objectToClone) {\n        if (!objectToClone)\n            return objectToClone;\n        return deepmerge.all([objectToClone]);\n    }\n    const dontMerge = (destination, source) => source;\n    function deepMerge(...objectsToMerge) {\n        const objects = objectsToMerge.filter(Boolean);\n        return deepmerge.all(objects, { arrayMerge: dontMerge });\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n        reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n        reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n        reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n        reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n        reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color, color, {\n      copy(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHex8: color_formatHex8,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHex8() {\n      return this.rgb().formatHex8();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb, extend(Color, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb() {\n        return this;\n      },\n      clamp() {\n        return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n      },\n      displayable() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatHex8: rgb_formatHex8,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n    }\n\n    function rgb_formatHex8() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n    }\n\n    function rgb_formatRgb() {\n      const a = clampa(this.opacity);\n      return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n    }\n\n    function clampa(opacity) {\n      return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n    }\n\n    function clampi(value) {\n      return Math.max(0, Math.min(255, Math.round(value) || 0));\n    }\n\n    function hex(value) {\n      value = clampi(value);\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      clamp() {\n        return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n      },\n      displayable() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl() {\n        const a = clampa(this.opacity);\n        return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n      }\n    }));\n\n    function clamph(value) {\n      value = (value || 0) % 360;\n      return value < 0 ? value + 360 : value;\n    }\n\n    function clampt(value) {\n      return Math.max(0, Math.min(1, value || 0));\n    }\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function rgbToDeckglColor(c) {\n        return [c.r, c.g, c.b, c.opacity * 255];\n    }\n    /**\n     * Compares 2 colors to see if they are equal.\n     * @param a RGBAColor to compare\n     * @param b RGBAColor to compare\n     * @returns True if colors are equal.\n     */\n    function colorIsEqual(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    /**\n     * Convert a CSS color string to a Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n     * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n     */\n    function colorFromString(cssColorSpecifier) {\n        if (cssColorSpecifier) {\n            const dc = color(cssColorSpecifier);\n            if (dc) {\n                const c = dc.rgb();\n                return rgbToDeckglColor(c);\n            }\n        }\n    }\n    /**\n     * Convert a Deck.gl color to a CSS rgba() string.\n     * @param color A Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n     */\n    function colorToString(color) {\n        const c = [...color];\n        if (c.length > 3) {\n            c[3] /= 255;\n        }\n        return `rgba(${c.join(',')})`;\n    }\n    function desaturate(color, value) {\n        const rgb$1 = rgb(color[0], color[1], color[2], color[3] / 255);\n        const hslColor = hsl(rgb$1);\n        hslColor.s = value;\n        const c = hslColor.rgb();\n        return rgbToDeckglColor(c);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const vega = {\n        CanvasHandler: null,\n        inferType: null,\n        inferTypes: null,\n        loader: null,\n        parse: null,\n        read: null,\n        renderModule: null,\n        Renderer: null,\n        sceneVisit: null,\n        scheme: null,\n        truncate: null,\n        View: null,\n    };\n    const deck = {\n        _CameraLight: null,\n        AmbientLight: null,\n        CompositeLayer: null,\n        COORDINATE_SYSTEM: null,\n        Deck: null,\n        DirectionalLight: null,\n        Layer: null,\n        LightingEffect: null,\n        LinearInterpolator: null,\n        OrbitView: null,\n        OrbitController: null,\n        gouraudLighting: null,\n        picking: null,\n        project32: null,\n    };\n    const layers = {\n        IconLayer: null,\n        LineLayer: null,\n        PathLayer: null,\n        PolygonLayer: null,\n        TextLayer: null,\n    };\n    const luma = {\n        CubeGeometry: null,\n        Model: null,\n        Texture2D: null,\n    };\n    /**\n     * References to dependency libraries.\n     */\n    const base = {\n        deck,\n        layers,\n        luma,\n        vega,\n    };\n    /**\n     * Specify the dependency libraries to use for rendering.\n     * @param vega Vega library.\n     * @param deck deck/core library.\n     * @param layers deck/layers library.\n     * @param luma luma.gl library.\n     */\n    function use(vega, deck, layers, luma) {\n        base.deck = deck;\n        base.layers = layers;\n        base.luma = luma;\n        base.vega = vega;\n    }\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    var fs = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const minHeight = '100px';\n    const minWidth = '100px';\n    // const lightSettings: { [view in View]: LightSettings } = {\n    //     '2d': {},\n    //     '3d': {\n    //         lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n    //         ambientRatio: 0.3,\n    //         diffuseRatio: 0.6,\n    //         specularRatio: 0.4,\n    //         lightsStrength: [0.3, 0.0, 0.8, 0.0],\n    //         numberOfLights: 2\n    //     }\n    // };\n    const defaultPresenterStyle = {\n        cssPrefix: 'vega-deckgl-',\n        defaultCubeColor: [128, 128, 128, 255],\n        highlightColor: [0, 0, 0, 255],\n        //lightSettings\n    };\n    const defaultPresenterConfig = {\n        onCubeClick: (e, cube) => { },\n        onCubeHover: (e, cube) => { },\n        transitionDurations: {\n            color: 100,\n            position: 600,\n            size: 600,\n            view: 600,\n        },\n    };\n    function createStage(view) {\n        const stage = {\n            view,\n            cubeData: [],\n            pathData: [],\n            polygonData: [],\n            axes: {\n                x: [],\n                y: [],\n                z: [],\n            },\n            gridLines: [],\n            textData: [],\n            legend: {\n                rows: {},\n            },\n            facets: [],\n        };\n        return stage;\n    }\n    const groupStrokeWidth = 1;\n    const lineZ = -1;\n    const defaultView = '2d';\n    const min3dDepth = 0.05;\n    const minPixelSize = 0.5;\n\n    var defaults = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        createStage: createStage,\n        defaultPresenterConfig: defaultPresenterConfig,\n        defaultPresenterStyle: defaultPresenterStyle,\n        defaultView: defaultView,\n        groupStrokeWidth: groupStrokeWidth,\n        lineZ: lineZ,\n        min3dDepth: min3dDepth,\n        minHeight: minHeight,\n        minPixelSize: minPixelSize,\n        minWidth: minWidth\n    });\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    var vs = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec3 instancePositions64Low;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_size(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_size(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_size(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset, position_worldspace);\n  \n  vec3 lightColor = lighting_getLightColor(instanceColors.rgb, project_uCameraPosition, position_worldspace.xyz, project_normal(normals));\n  vec3 mixedLight = mix(instanceColors.rgb, lightColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n\n    // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n    //\n    // Permission is hereby granted, free of charge, to any person obtaining a copy\n    // of this software and associated documentation files (the \"Software\"), to deal\n    // in the Software without restriction, including without limitation the rights\n    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    // copies of the Software, and to permit persons to whom the Software is\n    // furnished to do so, subject to the following conditions:\n    //\n    // The above copyright notice and this permission notice shall be included in\n    // all copies or substantial portions of the Software.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    // THE SOFTWARE.\n    // Adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/layers/src/grid-cell-layer/grid-cell-layer.js\n    //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n    const UNSIGNED_BYTE = 0x1401;\n    const DOUBLE = 0x140a;\n    const DEFAULT_COLOR = [255, 0, 255, 255];\n    const defaultProps = {\n        lightingMix: 0.5,\n        getSize: x => x.size,\n        getPosition: x => x.position,\n        getColor: x => x.color,\n        material: { ambient: 0.5, diffuse: 1 },\n    };\n    function _CubeLayer(props) {\n        //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n        class __CubeLayer extends base.deck.Layer {\n            getShaders() {\n                return { vs, fs, modules: [base.deck.project32, base.deck.gouraudLighting, base.deck.picking] };\n            }\n            initializeState() {\n                const attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: DOUBLE,\n                        transition: true,\n                        accessor: 'getPosition',\n                    },\n                    instanceSizes: {\n                        size: 3,\n                        transition: true,\n                        accessor: 'getSize',\n                    },\n                    instanceColors: {\n                        size: 4,\n                        type: UNSIGNED_BYTE,\n                        transition: true,\n                        accessor: 'getColor',\n                        defaultValue: DEFAULT_COLOR,\n                    },\n                });\n            }\n            updateState({ props, oldProps, changeFlags }) {\n                super.updateState({ props, oldProps, changeFlags }); //TODO add parameter type to deck.gl-typings\n                // Re-generate model if geometry changed\n                //if (props.fp64 !== oldProps.fp64) {\n                const { gl } = this.context;\n                if (this.state.model) {\n                    this.state.model.delete();\n                }\n                this.setState({ model: this._getModel(gl) });\n                this.getAttributeManager().invalidateAll();\n                //}\n            }\n            _getModel(gl) {\n                return new base.luma.Model(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new base.luma.CubeGeometry(),\n                    isInstanced: true,\n                    //shaderCache: this.context['shaderCache']\n                }));\n            }\n            draw({ uniforms }) {\n                let { lightingMix } = this.props;\n                if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n                    lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n                }\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    lightingMix,\n                })).draw();\n            }\n        }\n        __CubeLayer.layerName = 'CubeLayer';\n        __CubeLayer.defaultProps = defaultProps;\n        const instance = new __CubeLayer(props);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * CubeLayer - a Deck.gl layer to render cuboids.\n     * This is instantiatable by calling `new CubeLayer()`.\n     */\n    const CubeLayer = _CubeLayer;\n\n    // tpmt is two power minus ten times t scaled to [0,1]\n    function tpmt(x) {\n      return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n    }\n\n    function expInOut(t) {\n      return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function easing(t) {\n        if (t === 0 || t === 1)\n            return t;\n        return expInOut(t);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getLayers(presenter, config, stage, lightSettings /*LightSettings*/, lightingMix, interpolator, guideLines) {\n        const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n        const { x, y, z } = stage.axes;\n        const lines = concat(stage.gridLines, guideLines);\n        const texts = [...stage.textData];\n        [x, y, z].forEach(axes => {\n            axes.forEach(axis => {\n                if (axis.domain)\n                    lines.push(axis.domain);\n                if (axis.ticks)\n                    lines.push.apply(lines, axis.ticks);\n                if (axis.tickText)\n                    texts.push.apply(texts, axis.tickText);\n                if (axis.title)\n                    texts.push(axis.title);\n            });\n        });\n        let characterSet;\n        if (config.getCharacterSet) {\n            characterSet = config.getCharacterSet(stage);\n        }\n        else {\n            //Basic symbols, numbers, and uppercase / lowercase alphabet\n            characterSet = new Array(95).fill(1).map((_, i) => String.fromCharCode(32 + i));\n        }\n        if (stage.facets) {\n            stage.facets.forEach(f => {\n                if (f.lines)\n                    lines.push.apply(lines, f.lines);\n            });\n        }\n        const lineLayer = newLineLayer(layerNames.lines, lines);\n        const textLayer = newTextLayer(presenter, layerNames.text, texts, config, presenter.style.fontFamily, characterSet);\n        const pathLayer = newPathLayer(layerNames.paths, stage.pathData);\n        const polygonLayer = newPolygonLayer(layerNames.polygons, stage.polygonData);\n        return [textLayer, cubeLayer, lineLayer, pathLayer, polygonLayer];\n    }\n    function newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings /*LightSettings*/, lightingMix, interpolator) {\n        const getPosition = getTiming(config.transitionDurations.position, easing);\n        const getSize = getTiming(config.transitionDurations.size, easing);\n        const getColor = getTiming(config.transitionDurations.color);\n        const cubeLayerProps = {\n            interpolator,\n            lightingMix,\n            id: layerNames.cubes,\n            data: cubeData,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            pickable: true,\n            autoHighlight: true,\n            highlightColor,\n            onClick: (o, e) => {\n                config.onCubeClick(e && e.srcEvent, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onCube = false;\n                    config.onCubeHover(e && e.srcEvent, null);\n                }\n                else {\n                    presenter.deckgl.interactiveState.onCube = true;\n                    config.onCubeHover(e && e.srcEvent, o.object);\n                }\n            },\n            //lightSettings,\n            transitions: {\n                getPosition,\n                getColor,\n                getSize,\n            },\n        };\n        return new CubeLayer(cubeLayerProps);\n    }\n    function newLineLayer(id, data) {\n        return new base.layers.LineLayer({\n            id,\n            data,\n            widthUnits: 'pixels',\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            getColor: (o) => o.color,\n            getWidth: (o) => o.strokeWidth,\n        });\n    }\n    function newPathLayer(id, data) {\n        if (!data)\n            return null;\n        return new base.layers.PathLayer({\n            id,\n            data,\n            billboard: true,\n            widthScale: 1,\n            widthMinPixels: 2,\n            widthUnits: 'pixels',\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            getPath: (o) => o.positions,\n            getColor: (o) => o.strokeColor,\n            getWidth: (o) => o.strokeWidth,\n        });\n    }\n    function newPolygonLayer(id, data) {\n        if (!data)\n            return null;\n        const newlayer = new base.layers.PolygonLayer({\n            id,\n            data,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            getPolygon: (o) => o.positions,\n            getFillColor: (o) => o.fillColor,\n            getLineColor: (o) => o.strokeColor,\n            wireframe: false,\n            filled: true,\n            stroked: true,\n            pickable: true,\n            extruded: true,\n            getElevation: (o) => o.depth,\n            getLineWidth: (o) => o.strokeWidth,\n        });\n        return newlayer;\n    }\n    function newTextLayer(presenter, id, data, config, fontFamily, characterSet) {\n        let alphaCutoff = config.getTextHighlightAlphaCutoff && config.getTextHighlightAlphaCutoff();\n        if (alphaCutoff === undefined) {\n            alphaCutoff = 0.1;\n        }\n        const props = {\n            id,\n            data,\n            characterSet,\n            coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n            sizeUnits: 'pixels',\n            autoHighlight: true,\n            pickable: true,\n            highlightColor: p => {\n                if (config.getTextHighlightColor) {\n                    return config.getTextHighlightColor(p.object);\n                }\n                else {\n                    return [0, 0, 0, 0];\n                }\n            },\n            onClick: (o, e) => {\n                const pe = e && e.srcEvent;\n                config.onTextClick && config.onTextClick(pe, o.object);\n            },\n            onHover: (o, e) => {\n                if (o.index === -1) {\n                    presenter.deckgl.interactiveState.onText = false;\n                }\n                else {\n                    presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n                }\n            },\n            getColor: config.getTextColor || (o => o.color),\n            getTextAnchor: o => o.textAnchor,\n            getSize: o => o.size,\n            getAngle: o => o.angle,\n            fontSettings: {\n                sdf: false,\n                fontSize: 128,\n                buffer: 3,\n            },\n            _subLayerProps: { characters: { alphaCutoff } },\n        };\n        if (fontFamily) {\n            props.fontFamily = fontFamily;\n        }\n        return new base.layers.TextLayer(props);\n    }\n    function getTiming(duration, easing) {\n        let timing;\n        if (duration) {\n            timing = {\n                duration,\n                type: 'interpolation',\n            };\n            if (easing) {\n                timing.easing = easing;\n            }\n        }\n        return timing;\n    }\n    function getCubeLayer(deckProps) {\n        return deckProps.layers.filter(layer => layer && layer.id === layerNames.cubes)[0];\n    }\n    function getCubes(deckProps) {\n        const cubeLayer = getCubeLayer(deckProps);\n        if (!cubeLayer)\n            return;\n        const cubeLayerProps = cubeLayer.props;\n        return cubeLayerProps.data;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * This file is for external facing export only, do not use this for internal references,\n     * as it may cause circular dependencies in Rollup.\n     */\n\n    var util = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        addDiv: addDiv,\n        addEl: addEl,\n        allTruthy: allTruthy,\n        clone: clone,\n        colorFromString: colorFromString,\n        colorIsEqual: colorIsEqual,\n        colorToString: colorToString,\n        concat: concat,\n        createElement: createElement,\n        deepMerge: deepMerge,\n        desaturate: desaturate,\n        getActiveElementInfo: getActiveElementInfo,\n        getCubeLayer: getCubeLayer,\n        getCubes: getCubes,\n        mount: mount,\n        outerSize: outerSize,\n        push: push,\n        setActiveElement: setActiveElement\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function createOrbitControllerClass(factoryOptions) {\n        function wrapper(props) {\n            class OrbitControllerInternal extends base.deck.OrbitController {\n                constructor(props) {\n                    super(props);\n                    this.invertPan = true;\n                }\n                handleEvent(event) {\n                    if (event.type === 'doubletap') {\n                        if (factoryOptions && factoryOptions.doubleClickHandler) {\n                            return factoryOptions.doubleClickHandler(event, this);\n                        }\n                    }\n                    return super.handleEvent(event);\n                }\n            }\n            const instance = new OrbitControllerInternal(props);\n            return instance;\n        }\n        return wrapper;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\n    const CANVAS_STYLE = {\n        position: 'absolute',\n        left: 0,\n        top: 0,\n        width: '100%',\n        height: '100%',\n    };\n    // Create canvas elements for map and deck\n    function createCanvas(props) {\n        let { container = document.body } = props;\n        if (typeof container === 'string') {\n            container = document.getElementById(container);\n        }\n        if (!container) {\n            throw Error('Deck: container not found');\n        }\n        // Add DOM elements\n        const containerStyle = window.getComputedStyle(container);\n        if (containerStyle.position === 'static') {\n            container.style.position = 'relative';\n        }\n        const deckCanvas = document.createElement('canvas');\n        container.appendChild(deckCanvas);\n        Object.assign(deckCanvas.style, CANVAS_STYLE);\n        return { container, deckCanvas };\n    }\n    /**\n     * Creates Deck.gl classes for rendering WebGL.\n     * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n     */\n    function createDeckGLClassesForPresenter(factoryOptions) {\n        const OrbitControllerClass = createOrbitControllerClass(factoryOptions);\n        //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n        //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n        function wrapper(props) {\n            /**\n             * @params container (Element) - DOM element to add deck.gl canvas to\n             * @params controller (Object) - Controller class. Leave empty for auto detection\n             */\n            class DeckGLInternal extends base.deck.Deck {\n                constructor(props) {\n                    if (typeof document === 'undefined') {\n                        // Not browser\n                        throw Error('Deck can only be used in the browser');\n                    }\n                    const { deckCanvas } = createCanvas(props);\n                    const viewState = props.initialViewState || props.viewState || {};\n                    super(Object.assign({}, props, {\n                        width: '100%',\n                        height: '100%',\n                        canvas: deckCanvas,\n                        controller: OrbitControllerClass,\n                        initialViewState: viewState,\n                    }));\n                    // Callback for the controller\n                    this._updateViewState = params => {\n                        if (this.onViewStateChange) {\n                            this.onViewStateChange(params);\n                        }\n                    };\n                }\n                setProps(props) {\n                    // this._updateViewState must be bound to `this`\n                    // but we don't have access to the current instance before calling super().\n                    if ('onViewStateChange' in props && this._updateViewState) {\n                        // This is called at least once at _onRendererInitialized\n                        this.onViewStateChange = props.onViewStateChange;\n                        props.onViewStateChange = this._updateViewState;\n                    }\n                    super.setProps(props);\n                }\n            }\n            const instance = new DeckGLInternal(props);\n            return instance;\n        }\n        return {\n            OrbitControllerClass,\n            DeckGL_Class: wrapper,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function wrapper(props) {\n        class LinearInterpolatorInternal extends base.deck.LinearInterpolator {\n            constructor(transitionProps) {\n                super(transitionProps);\n            }\n            interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n                if (this.layerStartProps && this.layerEndProps) {\n                    this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n                }\n                return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n            }\n        }\n        const instance = new LinearInterpolatorInternal(props);\n        return instance;\n    }\n    const LinearInterpolator = wrapper;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function lightingEffects() {\n        const ambientLight = new base.deck.AmbientLight({\n            color: [255, 255, 255],\n            intensity: 0.3,\n        });\n        const cameraLight = new base.deck._CameraLight({\n            color: [255, 255, 255],\n            intensity: 1,\n        });\n        // const directionalLight = new base.deck.DirectionalLight({\n        //     color: [255, 255, 255],\n        //     direction: [0, 0, -1],\n        //     intensity: 0.2\n        //   });\n        return [new base.deck.LightingEffect({ ambientLight, cameraLight })];\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * HTML elements outputted by the presenter.\n     */\n    exports.PresenterElement = void 0;\n    (function (PresenterElement) {\n        PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n        PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n        PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n        PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n        PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n    })(exports.PresenterElement || (exports.PresenterElement = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const LegendView = (props) => {\n        const rows = [];\n        const addRow = (row, i) => {\n            const fn = symbolMap[row.symbol.shape];\n            let jsx;\n            if (fn) {\n                jsx = fn(row.symbol);\n            }\n            else {\n                jsx = createElement(\"span\", null, \"x\");\n                //console.log(`need to render ${row.symbol.shape} symbol shape`);\n            }\n            rows.push({\n                cells: [\n                    { className: 'symbol', content: jsx },\n                    { className: 'label', content: row.label, title: row.label },\n                ],\n            });\n        };\n        const sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n        sorted.forEach(i => addRow(props.legend.rows[i]));\n        if (sorted.length) {\n            return (createElement(Table, { rows: rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== undefined && (createElement(\"tr\", { tabIndex: props.onClick ? 0 : -1, onClick: e => props.onClick(e, props.legend, null), onKeyUp: e => {\n                    if (e.key === KeyCodes.ENTER && props.onClick) {\n                        props.onClick(e, props.legend, null);\n                    }\n                } },\n                createElement(\"th\", { colSpan: 2 }, props.legend.title)))));\n        }\n    };\n    const symbolMap = {\n        square: function (symbol) {\n            return (createElement(\"div\", { style: {\n                    height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                    width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                    backgroundColor: symbol.fill,\n                    borderColor: symbol.fill,\n                } }));\n        },\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function zSwap(v3) {\n        const temp = -v3[1]; //negeative y to positive z\n        if (v3[0] === lineZ) {\n            v3[0] = 0;\n        }\n        v3[1] = v3[2];\n        v3[2] = temp;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$5 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const x1 = item.x || 0;\n            const y1 = item.y || 0;\n            const x2 = item.x2 != null ? item.x2 : x1;\n            const y2 = item.y2 != null ? item.y2 : y1;\n            const lineItem = styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n            if (item.mark.role === 'axis-tick') {\n                if (options.currAxis.role === 'z') {\n                    zSwap(lineItem.sourcePosition);\n                    zSwap(lineItem.targetPosition);\n                }\n                options.currAxis.ticks.push(lineItem);\n            }\n            else if (item.mark.role === 'axis-domain') {\n                if (options.currAxis.role === 'z') {\n                    zSwap(lineItem.sourcePosition);\n                    zSwap(lineItem.targetPosition);\n                }\n                options.currAxis.domain = lineItem;\n            }\n            else {\n                stage.gridLines.push(lineItem);\n            }\n        });\n    };\n    function styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n        const line = {\n            sourcePosition: [x1, -y1, lineZ], //-1 = change direction of y from SVG to GL\n            targetPosition: [x2, -y2, lineZ],\n            color: colorFromString(stroke),\n            strokeWidth: strokeWidth,\n        };\n        return line;\n    }\n    function box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n        const lines = [\n            styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n            styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n            styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n            styledLine(gx, gy + height, gx, gy, stroke, strokeWidth),\n        ];\n        if (diagonals) {\n            lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n            lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n        }\n        return lines;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function initializePanel(presenter) {\n        const rootDiv = (createElement(\"div\", { className: className(exports.PresenterElement.root, presenter) },\n            createElement(\"div\", { className: className(exports.PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n            createElement(\"div\", { className: className(exports.PresenterElement.panel, presenter) },\n                createElement(\"div\", { className: className(exports.PresenterElement.vegaControls, presenter) }),\n                createElement(\"div\", { className: className(exports.PresenterElement.legend, presenter) }))));\n        mount(rootDiv, presenter.el);\n    }\n    function className(type, presenter) {\n        return `${presenter.style.cssPrefix}${exports.PresenterElement[type]}`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function patchCubeArray(allocatedSize, empty, cubes) {\n        const patched = new Array(allocatedSize);\n        patched.fill(empty);\n        cubes.forEach(cube => patched[cube.ordinal] = cube);\n        return patched;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const legendMap = {\n        'legend-title': function (legend, textItem) {\n            legend.title = textItem.text;\n        },\n        'legend-symbol': function (legend, symbol) {\n            const { bounds, fill, shape } = symbol;\n            //this object is safe for serialization\n            const legendRowSymbol = { bounds, fill, shape };\n            const i = symbol.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            legend.rows[i].symbol = legendRowSymbol;\n        },\n        'legend-label': function (legend, label) {\n            const i = label.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            const row = legend.rows[i];\n            row.label = label.text;\n            row.value = label.datum.value;\n        },\n    };\n    const markStager$4 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const fn = legendMap[item.mark.role];\n            if (fn) {\n                fn(stage.legend, item);\n            }\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$3 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            //for orthographic (2d) - always use 0 or else Deck will not show them\n            const z = stage.view === '2d' ? 0 : (item.z || 0);\n            const depth = (stage.view === '2d' ? 0 : (item.depth || 0)) + min3dDepth;\n            //change direction of y from SVG to GL\n            const ty = -1;\n            const ordinal = options.assignCubeOrdinal(item.datum);\n            if (ordinal > options.maxOrdinal) {\n                options.maxOrdinal = ordinal;\n            }\n            if (ordinal === undefined) ;\n            else {\n                const cube = {\n                    ordinal,\n                    size: [item.width, item.height, depth],\n                    position: [x + (item.x || 0), ty * (y + (item.y || 0)) - item.height, z],\n                    color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128],\n                };\n                cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n                stage.cubeData.push(cube);\n            }\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //change direction of y from SVG to GL\n    const ty$1 = -1;\n    const markStager$2 = (options, stage, scene, x, y, groupType) => {\n        const g = Object.assign({ opacity: 1, strokeOpacity: 1, strokeWidth: 1 }, scene.items[0]);\n        const path = {\n            strokeWidth: g.strokeWidth,\n            strokeColor: colorFromString(g.stroke),\n            positions: scene.items.map((it) => [\n                it.x,\n                ty$1 * it.y,\n                it.z || 0,\n            ]),\n        };\n        path.strokeColor[3] *= g.strokeOpacity;\n        path.strokeColor[3] *= g.opacity;\n        stage.pathData.push(path);\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$1 = (options, stage, scene, x, y, groupType) => {\n        //scale Deck.Gl text to Vega size\n        const fontScale = 1;\n        //change direction of y from SVG to GL\n        const ty = -1;\n        base.vega.sceneVisit(scene, function (item) {\n            if (!item.text)\n                return;\n            const size = item.fontSize * fontScale;\n            const alignmentBaseline = convertBaseline(item.baseline);\n            const yOffset = alignmentBaseline === 'top' ? item.fontSize / 2 : 0; //fixup to get tick text correct\n            const textItem = {\n                color: colorFromString(item.fill),\n                text: item.limit === undefined ? item.text : base.vega.truncate(item.text, item.limit, 'right', item.ellipsis || '...'), //use dots instead of unicode ellipsis for deck.gl's default font atlas\n                position: [x + (item.x || 0), ty * (y + (item.y || 0) + yOffset), 0],\n                size,\n                angle: convertAngle(item.angle),\n                textAnchor: convertAlignment(item.align),\n                alignmentBaseline,\n                metaData: item.metaData,\n            };\n            if (item.mark.role === 'axis-label') {\n                const tickText = textItem;\n                tickText.value = item.datum.value;\n                if (options.currAxis.role === 'z') {\n                    zSwap(tickText.position);\n                }\n                options.currAxis.tickText.push(tickText);\n            }\n            else if (item.mark.role === 'axis-title') {\n                if (options.currAxis.role === 'z') {\n                    zSwap(textItem.position);\n                }\n                options.currAxis.title = textItem;\n            }\n            else {\n                stage.textData.push(textItem);\n            }\n        });\n    };\n    function convertAngle(vegaTextAngle) {\n        if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n            return 360 - vegaTextAngle;\n        }\n        return 0;\n    }\n    function convertAlignment(textAlign) {\n        switch (textAlign) {\n            case 'center': return 'middle';\n            case 'left': return 'start';\n            case 'right': return 'end';\n        }\n        return 'start';\n    }\n    function convertBaseline(baseline) {\n        switch (baseline) {\n            case 'middle': return 'center';\n        }\n        return baseline || 'bottom';\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //change direction of y from SVG to GL\n    const ty = -1;\n    const markStager = (options, stage, scene, x, y, groupType) => {\n        const g = Object.assign({ fillOpacity: 1, opacity: 1, strokeOpacity: 1, strokeWidth: 0, depth: 0 }, scene.items[0]);\n        const points = scene.items.map((item) => {\n            item = Object.assign({ z: 0 }, item);\n            item = Object.assign({ x2: item.x, y2: item.y, z2: item.z }, item);\n            return [\n                item.x,\n                ty * item.y,\n                item.z,\n                item.x2,\n                ty * item.y2,\n                item.z2,\n            ];\n        });\n        const positions = [];\n        const startpoint = [points[0][0], points[0][1], points[0][2]];\n        points.forEach(p => {\n            positions.push([p[0], p[1], p[2]]);\n        });\n        points.reverse().forEach(p => {\n            positions.push([p[3], p[4], p[5]]);\n        });\n        positions.push(startpoint);\n        const polygon = {\n            fillColor: colorFromString(g.fill) || [0, 0, 0, 0],\n            positions,\n            strokeColor: colorFromString(g.stroke) || [0, 0, 0, 0],\n            strokeWidth: g.strokeWidth,\n            depth: g.depth,\n        };\n        polygon.fillColor[3] *= g.fillOpacity;\n        polygon.fillColor[3] *= g.opacity;\n        polygon.strokeColor[3] *= g.strokeOpacity;\n        polygon.strokeColor[3] *= g.opacity;\n        stage.polygonData.push(polygon);\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    var GroupType;\n    (function (GroupType) {\n        GroupType[GroupType[\"none\"] = 0] = \"none\";\n        GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n        GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n        GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n        GroupType[GroupType[\"zAxis\"] = 4] = \"zAxis\";\n    })(GroupType || (GroupType = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getOrientItem(group) {\n        if (group.orient) {\n            return group;\n        }\n        return group.datum;\n    }\n    function convertGroupRole(group, options) {\n        if (group.mark.role === 'legend')\n            return GroupType.legend;\n        if (group.mark.role === 'axis') {\n            if ((group.mark).zindex === options.zAxisZindex && options.zAxisZindex !== undefined) {\n                return GroupType.zAxis;\n            }\n            const orientItem = getOrientItem(group);\n            if (orientItem) {\n                switch (orientItem.orient) {\n                    case 'bottom':\n                    case 'top':\n                        return GroupType.xAxis;\n                    case 'left':\n                    case 'right':\n                        return GroupType.yAxis;\n                }\n            }\n        }\n    }\n    const group = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (g) {\n            const gx = g.x || 0, gy = g.y || 0;\n            if (g.context && g.context.background && !stage.backgroundColor) {\n                stage.backgroundColor = colorFromString(g.context.background);\n            }\n            if (g.stroke) {\n                const facetRect = {\n                    datum: g.datum,\n                    lines: box(gx + x, gy + y, g.height, g.width, g.stroke, groupStrokeWidth),\n                };\n                stage.facets.push(facetRect);\n            }\n            groupType = convertGroupRole(g, options) || groupType;\n            setCurrentAxis(options, stage, groupType);\n            // draw group contents\n            base.vega.sceneVisit(g, function (item) {\n                mainStager(options, stage, item, gx + x, gy + y, groupType);\n            });\n        });\n    };\n    function setCurrentAxis(options, stage, groupType) {\n        let axes;\n        let role;\n        switch (groupType) {\n            case GroupType.xAxis:\n                axes = stage.axes.x;\n                role = 'x';\n                break;\n            case GroupType.yAxis:\n                axes = stage.axes.y;\n                role = 'y';\n                break;\n            case GroupType.zAxis:\n                axes = stage.axes.z;\n                role = 'z';\n                break;\n            default:\n                return;\n        }\n        options.currAxis = {\n            domain: null,\n            tickText: [],\n            ticks: [],\n            role,\n        };\n        axes.push(options.currAxis);\n    }\n    const markStagers = {\n        group,\n        legend: markStager$4,\n        rect: markStager$3,\n        rule: markStager$5,\n        line: markStager$2,\n        area: markStager,\n        text: markStager$1,\n    };\n    const mainStager = (options, stage, scene, x, y, groupType) => {\n        if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n            markStager$4(options, stage, scene);\n        }\n        else {\n            const markStager = markStagers[scene.marktype];\n            if (markStager) {\n                markStager(options, stage, scene, x, y, groupType);\n            }\n        }\n    };\n    function sceneToStage(options, stage, scene) {\n        mainStager(options, stage, scene, 0, 0, null);\n        sortAxis(stage.axes.x, 0);\n        sortAxis(stage.axes.y, 1);\n    }\n    function sortAxis(axes, dim) {\n        axes.forEach(axis => {\n            if (axis.domain)\n                orderDomain(axis.domain, dim);\n            axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n            axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n        });\n    }\n    function orderDomain(domain, dim) {\n        if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n            const temp = domain.targetPosition;\n            domain.targetPosition = domain.sourcePosition;\n            domain.sourcePosition = temp;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const viewStateProps = ['target', 'rotationOrbit', 'rotationX', 'zoom'];\n    function targetViewState(height, width, view) {\n        const target = [width / 2, -height / 2, 0];\n        if (view === '2d') {\n            return {\n                target,\n                rotationOrbit: 0,\n                rotationX: 90,\n                zoom: -0.2,\n            };\n        }\n        else {\n            return {\n                target,\n                rotationOrbit: 25,\n                rotationX: 30,\n                zoom: -0.4,\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Class which presents a Stage of chart data using Deck.gl to render.\n     */\n    class Presenter {\n        /**\n         * Get the previously rendered Stage object.\n         */\n        get stage() {\n            return this._last.stage;\n        }\n        /**\n         * Get the current View camera type.\n         */\n        get view() {\n            return this._last.view;\n        }\n        /**\n         * Instantiate a new Presenter.\n         * @param el Parent HTMLElement to present within.\n         * @param style Optional PresenterStyle styling options.\n         */\n        constructor(el, style) {\n            this.el = el;\n            this.style = deepMerge(defaultPresenterStyle, style);\n            initializePanel(this);\n            this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n        }\n        /**\n         * Cancels any pending animation, calling animationCanceled() on original queue.\n         */\n        animationCancel() {\n            if (this.animationTimer) {\n                clearTimeout(this.animationTimer);\n                this.animationTimer = null;\n                if (this.logger) {\n                    this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n                }\n                if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                    this.queuedAnimationOptions.animationCanceled.call(null);\n                }\n            }\n        }\n        /**\n         * Stops the current animation and queues a new animation.\n         * @param handler Function to invoke when timeout is complete.\n         * @param timeout Length of time to wait before invoking the handler.\n         * @param options Optional QueuedAnimationOptions object.\n         */\n        animationQueue(handler, timeout, options) {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...`);\n            }\n            this.animationCancel();\n            this.animationTimer = setTimeout(() => {\n                if (this.logger) {\n                    this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n                }\n                handler();\n            }, timeout);\n        }\n        /**\n         * Retrieve a sub-element of the rendered output.\n         * @param type PresenterElement type of the HTMLElement to retrieve.\n         */\n        getElement(type) {\n            const elements = this.el.getElementsByClassName(className(type, this));\n            if (elements && elements.length) {\n                return elements[0];\n            }\n        }\n        /**\n         * Present the Vega Scene, or Stage object using Deck.gl.\n         * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n         * @param height Height of the rendering area.\n         * @param width Width of the rendering area.\n         * @param config Optional presentation configuration object.\n         */\n        present(sceneOrStage, height, width, config) {\n            this.animationCancel();\n            const scene = sceneOrStage;\n            let stage;\n            const options = {\n                maxOrdinal: 0,\n                currAxis: null,\n                defaultCubeColor: this.style.defaultCubeColor,\n                assignCubeOrdinal: (config === null || config === void 0 ? void 0 : config.onSceneRectAssignCubeOrdinal) || (() => options.maxOrdinal++),\n                zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex,\n            };\n            //determine if this is a vega scene\n            if (scene.marktype) {\n                stage = createStage(scene.view);\n                sceneToStage(options, stage, scene);\n            }\n            else {\n                stage = sceneOrStage;\n            }\n            if (!this.deckgl) {\n                const classes = createDeckGLClassesForPresenter({\n                    doubleClickHandler: () => {\n                        this.homeCamera();\n                        return true;\n                    },\n                });\n                this.OrbitControllerClass = classes.OrbitControllerClass;\n                const initialViewState = targetViewState(height, width, stage.view);\n                let glOptions;\n                if (config && config.preserveDrawingBuffer) {\n                    glOptions = { preserveDrawingBuffer: true };\n                }\n                const deckProps = {\n                    glOptions,\n                    height: null,\n                    width: null,\n                    effects: lightingEffects(),\n                    layers: [],\n                    onClick: config && config.onLayerClick,\n                    views: [new base.deck.OrbitView({ controller: base.deck.OrbitController })],\n                    initialViewState,\n                    container: this.getElement(exports.PresenterElement.gl),\n                    getCursor: (interactiveState) => {\n                        if (interactiveState.onText || interactiveState.onAxisSelection) {\n                            return 'pointer';\n                        }\n                        else if (interactiveState.onCube) {\n                            return 'default';\n                        }\n                        else {\n                            return 'grab';\n                        }\n                    },\n                };\n                if (stage.backgroundColor) {\n                    deckProps.style = { 'background-color': colorToString(stage.backgroundColor) };\n                }\n                this.deckgl = new classes.DeckGL_Class(deckProps);\n            }\n            let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n            if (options.maxOrdinal) {\n                cubeCount = Math.max(cubeCount, options.maxOrdinal);\n                const empty = {\n                    isEmpty: true,\n                    color: [0, 0, 0, 0], // possibly a bug in Deck.gl? set color to invisible.\n                };\n                stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n            }\n            this.setDeckProps(stage, height, width, cubeCount, config);\n            const a = getActiveElementInfo();\n            mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(exports.PresenterElement.legend));\n            setActiveElement(a);\n            if (config && config.onPresent) {\n                config.onPresent();\n            }\n        }\n        /**\n         * Present the same recently rendered Stage with only slight modifications such as a color change,\n         * using the previous Stage values as a basis.\n         * @param stage Partially populated Stage object containing changes.\n         * @param modifyConfig Optional presentation configuration object.\n         */\n        rePresent(stage, modifyConfig) {\n            const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n            this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n        }\n        isNewBounds(view, height, width, cubeCount) {\n            const lastBounds = this.lastBounds();\n            for (const prop in lastBounds) {\n                if (lastBounds[prop] === null)\n                    return true;\n            }\n            const newBounds = { cubeCount, height, view, width };\n            for (const prop in lastBounds) {\n                if (lastBounds[prop] !== newBounds[prop])\n                    return true;\n            }\n        }\n        lastBounds() {\n            const { cubeCount, height, view, width } = this._last;\n            return { cubeCount, height, view, width };\n        }\n        setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n            const config = deepMerge(defaultPresenterConfig, modifyConfig);\n            const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n            //let lightSettings = this.style.lightSettings[stage.view];\n            const lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n            let linearInterpolator;\n            //choose the current OrbitView viewstate if possible\n            let viewState = (this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView)\n                //otherwise use the initial viewstate if any\n                || this.deckgl.props.viewState;\n            if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n                let newViewStateTarget = true;\n                if (config && config.onTargetViewState) {\n                    const result = config.onTargetViewState(height, width);\n                    height = result.height;\n                    width = result.width;\n                    if (result.newViewStateTarget !== undefined) {\n                        newViewStateTarget = result.newViewStateTarget;\n                    }\n                }\n                if (!viewState || newViewStateTarget) {\n                    viewState = targetViewState(height, width, stage.view);\n                }\n                const oldCubeLayer = getCubeLayer(this.deckgl.props);\n                if (oldCubeLayer) {\n                    linearInterpolator = new LinearInterpolator(viewStateProps);\n                    linearInterpolator.layerStartProps = { lightingMix: oldCubeLayer.props.lightingMix };\n                    linearInterpolator.layerEndProps = { lightingMix };\n                    viewState.transitionDuration = config.transitionDurations.view;\n                    viewState.transitionEasing = easing;\n                    viewState.transitionInterpolator = linearInterpolator;\n                }\n                if (stage.view === '2d') ;\n            }\n            const guideLines = this._showGuides && box(0, 0, height, width, '#0f0', 1, true);\n            config.preLayer && config.preLayer(stage);\n            const layers = getLayers(this, config, stage, /*lightSettings*/ null, lightingMix, linearInterpolator, guideLines);\n            const deckProps = {\n                effects: lightingEffects(),\n                views: [new base.deck.OrbitView({ controller: base.deck.OrbitController })],\n                initialViewState: viewState,\n                layers,\n            };\n            if (config && config.preStage) {\n                config.preStage(stage, deckProps);\n            }\n            requestAnimationFrame(() => this.deckgl.setProps(Object.assign(Object.assign({}, deckProps), { onAfterRender: () => {\n                    if (this._afterRenderHandler) {\n                        this._afterRenderHandler();\n                    }\n                } })));\n            delete stage.cubeData;\n            this._last = {\n                cubeCount,\n                height,\n                width,\n                stage: stage,\n                view: stage.view,\n            };\n        }\n        canvasToDataURL() {\n            return new Promise((resolve, reject) => {\n                this._afterRenderHandler = () => {\n                    this._afterRenderHandler = null;\n                    const png = this.deckgl.canvas.toDataURL('image/png');\n                    resolve(png);\n                };\n            });\n        }\n        /**\n         * Home the camera to the last initial position.\n         */\n        homeCamera() {\n            const viewState = targetViewState(this._last.height, this._last.width, this._last.view);\n            viewState.transitionDuration = defaultPresenterConfig.transitionDurations.view;\n            viewState.transitionEasing = easing;\n            viewState.transitionInterpolator = new LinearInterpolator(viewStateProps);\n            const deckProps = {\n                effects: lightingEffects(),\n                views: this.deckgl.props.views,\n                initialViewState: viewState,\n                layers: this.deckgl.props.layers,\n            };\n            this.deckgl.setProps(deckProps);\n        }\n        /**\n         * Get cube data array from the cubes layer.\n         */\n        getCubeData() {\n            return getCubes(this.deckgl.props);\n        }\n        /**\n         * Show guidelines of rendering height/width and center of OrbitView.\n         */\n        showGuides() {\n            this._showGuides = true;\n            this.getElement(exports.PresenterElement.gl).classList.add('show-center');\n            this.rePresent(Object.assign(Object.assign({}, this._last.stage), { cubeData: this.getCubeData() }));\n        }\n        finalize() {\n            this.animationCancel();\n            if (this.deckgl)\n                this.deckgl.finalize();\n            if (this.el)\n                this.el.innerHTML = '';\n            this._last = null;\n            this.deckgl = null;\n            this.el = null;\n            this.logger = null;\n            this.queuedAnimationOptions = null;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //pass in the SuperClass, which should be a vega.View\n    function _RendererGl(loader) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class RendererGlInternal extends base.vega.Renderer {\n            initialize(el, width, height, origin) {\n                this.height = height;\n                this.width = width;\n                // this method will invoke resize to size the canvas appropriately\n                return super.initialize(el, width, height, origin);\n            }\n            resize(width, height, origin) {\n                super.resize(width, height, origin);\n                this.origin = origin;\n                this.height = height;\n                this.width = width;\n                //rteturn this for vega\n                return this;\n            }\n            _render(scene, items) {\n                const scene3d = scene;\n                scene3d.view = this.getView();\n                this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n                //return this for vega\n                return this;\n            }\n        }\n        const instance = new RendererGlInternal(loader);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n     * This is instantiated by ViewGl.\n     */\n    const RendererGl = _RendererGl;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    let registered = false;\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n    //pass in the SuperClass, which should be a vega.View\n    function _ViewGl(runtime, config) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class ViewGlInternal extends base.vega.View {\n            constructor(runtime, config = {}) {\n                super(runtime, config);\n                this.config = config;\n                this.presenter = config.presenter;\n                config.presenterConfig = config.presenterConfig || {};\n                config.presenterConfig.redraw = () => {\n                    this._redraw = true; //use Vega View private member _redraw\n                    this.run();\n                };\n            }\n            renderer(...args) {\n                if (args && args.length) {\n                    const renderer = args[0];\n                    if (renderer === 'deck.gl' && !registered) {\n                        base.vega.renderModule('deck.gl', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                        registered = true;\n                    }\n                    return super.renderer(renderer);\n                }\n                else {\n                    return super.renderer();\n                }\n            }\n            initialize(el) {\n                if (!this.presenter) {\n                    this.presenter = new Presenter(el);\n                }\n                super.initialize(this.presenter.getElement(exports.PresenterElement.vegaControls));\n                const renderer = this._renderer;\n                renderer.presenterConfig = this.config.presenterConfig;\n                renderer.presenter = this.presenter;\n                renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView);\n                return this;\n            }\n            error(e) {\n                if (this.presenter.logger) {\n                    this.presenter.logger(e);\n                }\n            }\n        }\n        const instance = new ViewGlInternal(runtime, config);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.View, with added properties for accessing a Presenter.\n     * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n     */\n    const ViewGl = _ViewGl;\n\n    exports.Presenter = Presenter;\n    exports.ViewGl = ViewGl;\n    exports.base = base;\n    exports.constants = constants;\n    exports.controls = controls;\n    exports.defaults = defaults;\n    exports.types = types;\n    exports.use = use;\n    exports.util = util;\n\n}));\n"
  },
  {
    "path": "docs/dist/vega-morphcharts/v1/vega-morphcharts.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.VegaMorphCharts = {}));\n})(this, (function (exports) { 'use strict';\n\n    const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n    /**\n     * Decamelizes a string with/without a custom separator (hyphen by default).\n     * from: https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript\n     *\n     * @param str String in camelcase\n     * @param separator Separator for the new decamelized string.\n     */\n    function decamelize(str, separator = '-') {\n        return str\n            .replace(/([a-z\\d])([A-Z])/g, '$1' + separator + '$2')\n            .replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, '$1' + separator + '$2')\n            .toLowerCase();\n    }\n    function createElement(tag, attrs, ...children) {\n        if (typeof tag === 'function') {\n            const fn = tag;\n            let props = attrs;\n            // Handle case where props is null but children are provided\n            if (props === null || props === undefined) {\n                props = { children };\n            }\n            else {\n                props.children = children;\n            }\n            return fn(props);\n        }\n        else {\n            const ns = (tag === 'svg') ? SVG_NAMESPACE : null;\n            const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n            const map = attrs;\n            let ref;\n            for (let name in map) {\n                if (name && map.hasOwnProperty(name)) {\n                    let value = map[name];\n                    if (name === 'className' && value !== void 0) {\n                        setAttribute(el, ns, 'class', value.toString());\n                    }\n                    else if (name === 'disabled' && !value) ;\n                    else if (value === null || value === undefined) {\n                        continue;\n                    }\n                    else if (value === true) {\n                        setAttribute(el, ns, name, name);\n                    }\n                    else if (typeof value === 'function') {\n                        if (name === 'ref') {\n                            ref = value;\n                        }\n                        else {\n                            el[name.toLowerCase()] = value;\n                        }\n                    }\n                    else if (typeof value === 'object') {\n                        setAttribute(el, ns, name, flatten(value));\n                    }\n                    else {\n                        setAttribute(el, ns, name, value.toString());\n                    }\n                }\n            }\n            if (children && children.length > 0) {\n                appendChildren(el, children);\n            }\n            if (ref) {\n                ref(el);\n            }\n            return el;\n        }\n    }\n    function setAttribute(el, ns, name, value) {\n        if (ns) {\n            el.setAttributeNS(null, name, value);\n        }\n        else {\n            el.setAttribute(name, value);\n        }\n    }\n    function flatten(o) {\n        const arr = [];\n        for (let prop in o)\n            arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n        return arr.join(';');\n    }\n    function isInsideForeignObject(element) {\n        let current = element;\n        while (current) {\n            if (current.tagName.toLowerCase() === 'foreignobject') {\n                return true;\n            }\n            current = current.parentElement;\n        }\n        return false;\n    }\n    function recreateWithSvgNamespace(element) {\n        const svgElement = document.createElementNS(SVG_NAMESPACE, element.tagName.toLowerCase());\n        // Copy attributes\n        for (let i = 0; i < element.attributes.length; i++) {\n            const attr = element.attributes[i];\n            svgElement.setAttributeNS(null, attr.name, attr.value);\n        }\n        // Copy event handlers and other properties\n        // Common event handlers that need to be copied\n        const eventProperties = ['onclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmouseout',\n            'onmousemove', 'onkeydown', 'onkeyup', 'onkeypress', 'onfocus', 'onblur'];\n        for (const prop of eventProperties) {\n            if (element[prop]) {\n                svgElement[prop] = element[prop];\n            }\n        }\n        // Copy children recursively\n        for (let i = 0; i < element.childNodes.length; i++) {\n            const child = element.childNodes[i];\n            if (child.nodeType === Node.ELEMENT_NODE) {\n                svgElement.appendChild(recreateWithSvgNamespace(child));\n            }\n            else {\n                svgElement.appendChild(child.cloneNode(true));\n            }\n        }\n        return svgElement;\n    }\n    function addChild(parentElement, child) {\n        if (child === null || child === undefined || typeof child === \"boolean\") {\n            return;\n        }\n        else if (Array.isArray(child)) {\n            appendChildren(parentElement, child);\n        }\n        else if (isElement(child)) {\n            const childEl = child;\n            // If parent is SVG and child was created with wrong namespace, recreate it\n            // Exception: don't recreate elements inside foreignObject as they should remain HTML\n            if (parentElement.namespaceURI === SVG_NAMESPACE &&\n                childEl.namespaceURI !== SVG_NAMESPACE &&\n                childEl.tagName.toLowerCase() !== 'foreignobject' &&\n                !isInsideForeignObject(parentElement)) {\n                const recreated = recreateWithSvgNamespace(childEl);\n                parentElement.appendChild(recreated);\n            }\n            else {\n                parentElement.appendChild(childEl);\n            }\n        }\n        else {\n            parentElement.appendChild(document.createTextNode(child.toString()));\n        }\n    }\n    function appendChildren(parentElement, children) {\n        children.forEach(child => addChild(parentElement, child));\n    }\n    function isElement(el) {\n        //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n        return !!el.nodeType;\n    }\n    function mount(element, container) {\n        container.innerHTML = '';\n        if (element) {\n            addChild(container, element);\n        }\n    }\n    function findElementByChildPositions(childPositions, container) {\n        let element = container || document.body;\n        let childPosition;\n        while (element && childPositions.length) {\n            childPosition = childPositions.shift();\n            element = element.children.item(childPosition);\n        }\n        if (element) {\n            return element;\n        }\n    }\n    function focusActiveElement(element, activeElementInfo) {\n        element.focus();\n        element.scrollTop = activeElementInfo.scrollTop;\n        const input = element;\n        if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) {\n            input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n        }\n    }\n    function setActiveElement(activeElementInfo, container) {\n        if (activeElementInfo) {\n            const element = findElementByChildPositions(activeElementInfo.childPositions, container);\n            if (element) {\n                focusActiveElement(element, activeElementInfo);\n            }\n        }\n    }\n    function getActiveElementInfo(container) {\n        let element = document.activeElement;\n        const { scrollTop, selectionDirection, selectionEnd, selectionStart } = element;\n        const activeElementInfo = {\n            childPositions: [],\n            scrollTop,\n            selectionDirection,\n            selectionEnd,\n            selectionStart\n        };\n        while (element && element !== document.body && element !== container) {\n            activeElementInfo.childPositions.unshift(getChildPosition(element));\n            element = element.parentElement;\n        }\n        if ((element === document.body || element === container) && activeElementInfo.childPositions.length)\n            return activeElementInfo;\n    }\n    function getChildPosition(element) {\n        let childPosition = 0;\n        while (element = element.previousElementSibling)\n            childPosition++;\n        return childPosition;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const KeyCodes = {\n        ENTER: 'Enter',\n    };\n    const Table = (props) => {\n        return (createElement(\"table\", { className: props.className },\n            props.children,\n            props.rows.map((row, i) => (createElement(\"tr\", { className: props.rowClassName || '', onClick: e => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: e => {\n                    if (e.key === KeyCodes.ENTER && props.onRowClick) {\n                        props.onRowClick(e, i);\n                    }\n                } }, row.cells.map((cell, i) => (createElement(\"td\", { className: cell.className || '', title: cell.title || '' }, cell.content))))))));\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * This file is for external facing export only, do not use this for internal references,\n     * as it may cause circular dependencies in Rollup.\n     */\n\n    var controls = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        Table: Table\n    });\n\n    /**\n     * Common utilities\n     * @module glMatrix\n     */\n\n    // Configuration Constants\n    var EPSILON = 0.000001;\n    var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\n\n    /**\n     * Sets the type of array used when creating new vectors and matrices\n     *\n     * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n     */\n    function setMatrixArrayType(type) {\n      ARRAY_TYPE = type;\n    }\n\n    /**\n     * 3x3 Matrix\n     * @module mat3\n     */\n\n    /**\n     * Creates a new identity mat3\n     *\n     * @returns {mat3} a new 3x3 matrix\n     */\n    function create$5() {\n      var out = new ARRAY_TYPE(9);\n      if (ARRAY_TYPE != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[5] = 0;\n        out[6] = 0;\n        out[7] = 0;\n      }\n      out[0] = 1;\n      out[4] = 1;\n      out[8] = 1;\n      return out;\n    }\n\n    /**\n     * Copies the upper-left 3x3 values into the given mat3.\n     *\n     * @param {mat3} out the receiving 3x3 matrix\n     * @param {ReadonlyMat4} a   the source 4x4 matrix\n     * @returns {mat3} out\n     */\n    function fromMat4(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      out[3] = a[4];\n      out[4] = a[5];\n      out[5] = a[6];\n      out[6] = a[8];\n      out[7] = a[9];\n      out[8] = a[10];\n      return out;\n    }\n\n    /**\n     * Create a new mat3 with the given values\n     *\n     * @param {Number} m00 Component in column 0, row 0 position (index 0)\n     * @param {Number} m01 Component in column 0, row 1 position (index 1)\n     * @param {Number} m02 Component in column 0, row 2 position (index 2)\n     * @param {Number} m10 Component in column 1, row 0 position (index 3)\n     * @param {Number} m11 Component in column 1, row 1 position (index 4)\n     * @param {Number} m12 Component in column 1, row 2 position (index 5)\n     * @param {Number} m20 Component in column 2, row 0 position (index 6)\n     * @param {Number} m21 Component in column 2, row 1 position (index 7)\n     * @param {Number} m22 Component in column 2, row 2 position (index 8)\n     * @returns {mat3} A new mat3\n     */\n    function fromValues$5(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n      var out = new ARRAY_TYPE(9);\n      out[0] = m00;\n      out[1] = m01;\n      out[2] = m02;\n      out[3] = m10;\n      out[4] = m11;\n      out[5] = m12;\n      out[6] = m20;\n      out[7] = m21;\n      out[8] = m22;\n      return out;\n    }\n\n    /**\n     * Calculates a 3x3 matrix from the given quaternion\n     *\n     * @param {mat3} out mat3 receiving operation result\n     * @param {ReadonlyQuat} q Quaternion to create matrix from\n     *\n     * @returns {mat3} out\n     */\n    function fromQuat$1(out, q) {\n      var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n      var x2 = x + x;\n      var y2 = y + y;\n      var z2 = z + z;\n      var xx = x * x2;\n      var yx = y * x2;\n      var yy = y * y2;\n      var zx = z * x2;\n      var zy = z * y2;\n      var zz = z * z2;\n      var wx = w * x2;\n      var wy = w * y2;\n      var wz = w * z2;\n      out[0] = 1 - yy - zz;\n      out[3] = yx - wz;\n      out[6] = zx + wy;\n      out[1] = yx + wz;\n      out[4] = 1 - xx - zz;\n      out[7] = zy - wx;\n      out[2] = zx - wy;\n      out[5] = zy + wx;\n      out[8] = 1 - xx - yy;\n      return out;\n    }\n\n    /**\n     * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n     * @module mat4\n     */\n\n    /**\n     * Creates a new identity mat4\n     *\n     * @returns {mat4} a new 4x4 matrix\n     */\n    function create$4() {\n      var out = new ARRAY_TYPE(16);\n      if (ARRAY_TYPE != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[4] = 0;\n        out[6] = 0;\n        out[7] = 0;\n        out[8] = 0;\n        out[9] = 0;\n        out[11] = 0;\n        out[12] = 0;\n        out[13] = 0;\n        out[14] = 0;\n      }\n      out[0] = 1;\n      out[5] = 1;\n      out[10] = 1;\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Copy the values from one mat4 to another\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the source matrix\n     * @returns {mat4} out\n     */\n    function copy$4(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      out[3] = a[3];\n      out[4] = a[4];\n      out[5] = a[5];\n      out[6] = a[6];\n      out[7] = a[7];\n      out[8] = a[8];\n      out[9] = a[9];\n      out[10] = a[10];\n      out[11] = a[11];\n      out[12] = a[12];\n      out[13] = a[13];\n      out[14] = a[14];\n      out[15] = a[15];\n      return out;\n    }\n\n    /**\n     * Create a new mat4 with the given values\n     *\n     * @param {Number} m00 Component in column 0, row 0 position (index 0)\n     * @param {Number} m01 Component in column 0, row 1 position (index 1)\n     * @param {Number} m02 Component in column 0, row 2 position (index 2)\n     * @param {Number} m03 Component in column 0, row 3 position (index 3)\n     * @param {Number} m10 Component in column 1, row 0 position (index 4)\n     * @param {Number} m11 Component in column 1, row 1 position (index 5)\n     * @param {Number} m12 Component in column 1, row 2 position (index 6)\n     * @param {Number} m13 Component in column 1, row 3 position (index 7)\n     * @param {Number} m20 Component in column 2, row 0 position (index 8)\n     * @param {Number} m21 Component in column 2, row 1 position (index 9)\n     * @param {Number} m22 Component in column 2, row 2 position (index 10)\n     * @param {Number} m23 Component in column 2, row 3 position (index 11)\n     * @param {Number} m30 Component in column 3, row 0 position (index 12)\n     * @param {Number} m31 Component in column 3, row 1 position (index 13)\n     * @param {Number} m32 Component in column 3, row 2 position (index 14)\n     * @param {Number} m33 Component in column 3, row 3 position (index 15)\n     * @returns {mat4} A new mat4\n     */\n    function fromValues$4(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n      var out = new ARRAY_TYPE(16);\n      out[0] = m00;\n      out[1] = m01;\n      out[2] = m02;\n      out[3] = m03;\n      out[4] = m10;\n      out[5] = m11;\n      out[6] = m12;\n      out[7] = m13;\n      out[8] = m20;\n      out[9] = m21;\n      out[10] = m22;\n      out[11] = m23;\n      out[12] = m30;\n      out[13] = m31;\n      out[14] = m32;\n      out[15] = m33;\n      return out;\n    }\n\n    /**\n     * Set a mat4 to the identity matrix\n     *\n     * @param {mat4} out the receiving matrix\n     * @returns {mat4} out\n     */\n    function identity(out) {\n      out[0] = 1;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = 1;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[10] = 1;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Inverts a mat4\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the source matrix\n     * @returns {mat4 | null} out, or null if source matrix is not invertible\n     */\n    function invert(out, a) {\n      var a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n      var a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n      var a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n      var a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n      var b00 = a00 * a11 - a01 * a10;\n      var b01 = a00 * a12 - a02 * a10;\n      var b02 = a00 * a13 - a03 * a10;\n      var b03 = a01 * a12 - a02 * a11;\n      var b04 = a01 * a13 - a03 * a11;\n      var b05 = a02 * a13 - a03 * a12;\n      var b06 = a20 * a31 - a21 * a30;\n      var b07 = a20 * a32 - a22 * a30;\n      var b08 = a20 * a33 - a23 * a30;\n      var b09 = a21 * a32 - a22 * a31;\n      var b10 = a21 * a33 - a23 * a31;\n      var b11 = a22 * a33 - a23 * a32;\n\n      // Calculate the determinant\n      var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n      if (!det) {\n        return null;\n      }\n      det = 1.0 / det;\n      out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n      out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n      out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n      out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n      out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n      out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n      out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n      out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n      out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n      out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n      out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n      out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n      out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n      out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n      out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n      out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n      return out;\n    }\n\n    /**\n     * Multiplies two mat4s\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the first operand\n     * @param {ReadonlyMat4} b the second operand\n     * @returns {mat4} out\n     */\n    function multiply$2(out, a, b) {\n      var a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n      var a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n      var a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n      var a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n      // Cache only the current line of the second matrix\n      var b0 = b[0],\n        b1 = b[1],\n        b2 = b[2],\n        b3 = b[3];\n      out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n      out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n      out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n      out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n      b0 = b[4];\n      b1 = b[5];\n      b2 = b[6];\n      b3 = b[7];\n      out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n      out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n      out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n      out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n      b0 = b[8];\n      b1 = b[9];\n      b2 = b[10];\n      b3 = b[11];\n      out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n      out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n      out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n      out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n      b0 = b[12];\n      b1 = b[13];\n      b2 = b[14];\n      b3 = b[15];\n      out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n      out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n      out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n      out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n      return out;\n    }\n\n    /**\n     * Translate a mat4 by the given vector\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the matrix to translate\n     * @param {ReadonlyVec3} v vector to translate by\n     * @returns {mat4} out\n     */\n    function translate(out, a, v) {\n      var x = v[0],\n        y = v[1],\n        z = v[2];\n      var a00, a01, a02, a03;\n      var a10, a11, a12, a13;\n      var a20, a21, a22, a23;\n      if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n      } else {\n        a00 = a[0];\n        a01 = a[1];\n        a02 = a[2];\n        a03 = a[3];\n        a10 = a[4];\n        a11 = a[5];\n        a12 = a[6];\n        a13 = a[7];\n        a20 = a[8];\n        a21 = a[9];\n        a22 = a[10];\n        a23 = a[11];\n        out[0] = a00;\n        out[1] = a01;\n        out[2] = a02;\n        out[3] = a03;\n        out[4] = a10;\n        out[5] = a11;\n        out[6] = a12;\n        out[7] = a13;\n        out[8] = a20;\n        out[9] = a21;\n        out[10] = a22;\n        out[11] = a23;\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n      }\n      return out;\n    }\n\n    /**\n     * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n     *\n     * @param {mat4} out the receiving matrix\n     * @param {ReadonlyMat4} a the matrix to scale\n     * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n     * @returns {mat4} out\n     **/\n    function scale$1(out, a, v) {\n      var x = v[0],\n        y = v[1],\n        z = v[2];\n      out[0] = a[0] * x;\n      out[1] = a[1] * x;\n      out[2] = a[2] * x;\n      out[3] = a[3] * x;\n      out[4] = a[4] * y;\n      out[5] = a[5] * y;\n      out[6] = a[6] * y;\n      out[7] = a[7] * y;\n      out[8] = a[8] * z;\n      out[9] = a[9] * z;\n      out[10] = a[10] * z;\n      out[11] = a[11] * z;\n      out[12] = a[12];\n      out[13] = a[13];\n      out[14] = a[14];\n      out[15] = a[15];\n      return out;\n    }\n\n    /**\n     * Creates a matrix from a vector scaling\n     * This is equivalent to (but much faster than):\n     *\n     *     mat4.identity(dest);\n     *     mat4.scale(dest, dest, vec);\n     *\n     * @param {mat4} out mat4 receiving operation result\n     * @param {ReadonlyVec3} v Scaling vector\n     * @returns {mat4} out\n     */\n    function fromScaling(out, v) {\n      out[0] = v[0];\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = v[1];\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[10] = v[2];\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Creates a matrix from a quaternion rotation, vector translation and vector scale\n     * This is equivalent to (but much faster than):\n     *\n     *     mat4.identity(dest);\n     *     mat4.translate(dest, dest, vec);\n     *     let quatMat = mat4.create();\n     *     mat4.fromQuat(quatMat, quat);\n     *     mat4.multiply(dest, dest, quatMat);\n     *     mat4.scale(dest, dest, scale)\n     *\n     * @param {mat4} out mat4 receiving operation result\n     * @param {quat} q Rotation quaternion\n     * @param {ReadonlyVec3} v Translation vector\n     * @param {ReadonlyVec3} s Scaling vector\n     * @returns {mat4} out\n     */\n    function fromRotationTranslationScale(out, q, v, s) {\n      // Quaternion math\n      var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n      var x2 = x + x;\n      var y2 = y + y;\n      var z2 = z + z;\n      var xx = x * x2;\n      var xy = x * y2;\n      var xz = x * z2;\n      var yy = y * y2;\n      var yz = y * z2;\n      var zz = z * z2;\n      var wx = w * x2;\n      var wy = w * y2;\n      var wz = w * z2;\n      var sx = s[0];\n      var sy = s[1];\n      var sz = s[2];\n      out[0] = (1 - (yy + zz)) * sx;\n      out[1] = (xy + wz) * sx;\n      out[2] = (xz - wy) * sx;\n      out[3] = 0;\n      out[4] = (xy - wz) * sy;\n      out[5] = (1 - (xx + zz)) * sy;\n      out[6] = (yz + wx) * sy;\n      out[7] = 0;\n      out[8] = (xz + wy) * sz;\n      out[9] = (yz - wx) * sz;\n      out[10] = (1 - (xx + yy)) * sz;\n      out[11] = 0;\n      out[12] = v[0];\n      out[13] = v[1];\n      out[14] = v[2];\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n     * This is equivalent to (but much faster than):\n     *\n     *     mat4.identity(dest);\n     *     mat4.translate(dest, dest, vec);\n     *     mat4.translate(dest, dest, origin);\n     *     let quatMat = mat4.create();\n     *     mat4.fromQuat(quatMat, quat);\n     *     mat4.multiply(dest, dest, quatMat);\n     *     mat4.scale(dest, dest, scale)\n     *     mat4.translate(dest, dest, negativeOrigin);\n     *\n     * @param {mat4} out mat4 receiving operation result\n     * @param {quat} q Rotation quaternion\n     * @param {ReadonlyVec3} v Translation vector\n     * @param {ReadonlyVec3} s Scaling vector\n     * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n     * @returns {mat4} out\n     */\n    function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n      // Quaternion math\n      var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n      var x2 = x + x;\n      var y2 = y + y;\n      var z2 = z + z;\n      var xx = x * x2;\n      var xy = x * y2;\n      var xz = x * z2;\n      var yy = y * y2;\n      var yz = y * z2;\n      var zz = z * z2;\n      var wx = w * x2;\n      var wy = w * y2;\n      var wz = w * z2;\n      var sx = s[0];\n      var sy = s[1];\n      var sz = s[2];\n      var ox = o[0];\n      var oy = o[1];\n      var oz = o[2];\n      var out0 = (1 - (yy + zz)) * sx;\n      var out1 = (xy + wz) * sx;\n      var out2 = (xz - wy) * sx;\n      var out4 = (xy - wz) * sy;\n      var out5 = (1 - (xx + zz)) * sy;\n      var out6 = (yz + wx) * sy;\n      var out8 = (xz + wy) * sz;\n      var out9 = (yz - wx) * sz;\n      var out10 = (1 - (xx + yy)) * sz;\n      out[0] = out0;\n      out[1] = out1;\n      out[2] = out2;\n      out[3] = 0;\n      out[4] = out4;\n      out[5] = out5;\n      out[6] = out6;\n      out[7] = 0;\n      out[8] = out8;\n      out[9] = out9;\n      out[10] = out10;\n      out[11] = 0;\n      out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n      out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n      out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Calculates a 4x4 matrix from the given quaternion\n     *\n     * @param {mat4} out mat4 receiving operation result\n     * @param {ReadonlyQuat} q Quaternion to create matrix from\n     *\n     * @returns {mat4} out\n     */\n    function fromQuat(out, q) {\n      var x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n      var x2 = x + x;\n      var y2 = y + y;\n      var z2 = z + z;\n      var xx = x * x2;\n      var yx = y * x2;\n      var yy = y * y2;\n      var zx = z * x2;\n      var zy = z * y2;\n      var zz = z * z2;\n      var wx = w * x2;\n      var wy = w * y2;\n      var wz = w * z2;\n      out[0] = 1 - yy - zz;\n      out[1] = yx + wz;\n      out[2] = zx - wy;\n      out[3] = 0;\n      out[4] = yx - wz;\n      out[5] = 1 - xx - zz;\n      out[6] = zy + wx;\n      out[7] = 0;\n      out[8] = zx + wy;\n      out[9] = zy - wx;\n      out[10] = 1 - xx - yy;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Generates a frustum matrix with the given bounds\n     *\n     * @param {mat4} out mat4 frustum matrix will be written into\n     * @param {Number} left Left bound of the frustum\n     * @param {Number} right Right bound of the frustum\n     * @param {Number} bottom Bottom bound of the frustum\n     * @param {Number} top Top bound of the frustum\n     * @param {Number} near Near bound of the frustum\n     * @param {Number} far Far bound of the frustum\n     * @returns {mat4} out\n     */\n    function frustum(out, left, right, bottom, top, near, far) {\n      var rl = 1 / (right - left);\n      var tb = 1 / (top - bottom);\n      var nf = 1 / (near - far);\n      out[0] = near * 2 * rl;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = near * 2 * tb;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = (right + left) * rl;\n      out[9] = (top + bottom) * tb;\n      out[10] = (far + near) * nf;\n      out[11] = -1;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = far * near * 2 * nf;\n      out[15] = 0;\n      return out;\n    }\n\n    /**\n     * Generates a perspective projection matrix with the given bounds.\n     * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n     * which matches WebGL/OpenGL's clip volume.\n     * Passing null/undefined/no value for far will generate infinite projection matrix.\n     *\n     * @param {mat4} out mat4 frustum matrix will be written into\n     * @param {number} fovy Vertical field of view in radians\n     * @param {number} aspect Aspect ratio. typically viewport width/height\n     * @param {number} near Near bound of the frustum\n     * @param {number} far Far bound of the frustum, can be null or Infinity\n     * @returns {mat4} out\n     */\n    function perspectiveNO(out, fovy, aspect, near, far) {\n      var f = 1.0 / Math.tan(fovy / 2);\n      out[0] = f / aspect;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = f;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[11] = -1;\n      out[12] = 0;\n      out[13] = 0;\n      out[15] = 0;\n      if (far != null && far !== Infinity) {\n        var nf = 1 / (near - far);\n        out[10] = (far + near) * nf;\n        out[14] = 2 * far * near * nf;\n      } else {\n        out[10] = -1;\n        out[14] = -2 * near;\n      }\n      return out;\n    }\n\n    /**\n     * Alias for {@link mat4.perspectiveNO}\n     * @function\n     */\n    var perspective = perspectiveNO;\n\n    /**\n     * Generates a look-at matrix with the given eye position, focal point, and up axis.\n     * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n     *\n     * @param {mat4} out mat4 frustum matrix will be written into\n     * @param {ReadonlyVec3} eye Position of the viewer\n     * @param {ReadonlyVec3} center Point the viewer is looking at\n     * @param {ReadonlyVec3} up vec3 pointing up\n     * @returns {mat4} out\n     */\n    function lookAt(out, eye, center, up) {\n      var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n      var eyex = eye[0];\n      var eyey = eye[1];\n      var eyez = eye[2];\n      var upx = up[0];\n      var upy = up[1];\n      var upz = up[2];\n      var centerx = center[0];\n      var centery = center[1];\n      var centerz = center[2];\n      if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) {\n        return identity(out);\n      }\n      z0 = eyex - centerx;\n      z1 = eyey - centery;\n      z2 = eyez - centerz;\n      len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n      z0 *= len;\n      z1 *= len;\n      z2 *= len;\n      x0 = upy * z2 - upz * z1;\n      x1 = upz * z0 - upx * z2;\n      x2 = upx * z1 - upy * z0;\n      len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n      if (!len) {\n        x0 = 0;\n        x1 = 0;\n        x2 = 0;\n      } else {\n        len = 1 / len;\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n      }\n      y0 = z1 * x2 - z2 * x1;\n      y1 = z2 * x0 - z0 * x2;\n      y2 = z0 * x1 - z1 * x0;\n      len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n      if (!len) {\n        y0 = 0;\n        y1 = 0;\n        y2 = 0;\n      } else {\n        len = 1 / len;\n        y0 *= len;\n        y1 *= len;\n        y2 *= len;\n      }\n      out[0] = x0;\n      out[1] = y0;\n      out[2] = z0;\n      out[3] = 0;\n      out[4] = x1;\n      out[5] = y1;\n      out[6] = z1;\n      out[7] = 0;\n      out[8] = x2;\n      out[9] = y2;\n      out[10] = z2;\n      out[11] = 0;\n      out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n      out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n      out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n      out[15] = 1;\n      return out;\n    }\n\n    /**\n     * Alias for {@link mat4.multiply}\n     * @function\n     */\n    var mul = multiply$2;\n\n    /**\n     * 3 Dimensional Vector\n     * @module vec3\n     */\n\n    /**\n     * Creates a new, empty vec3\n     *\n     * @returns {vec3} a new 3D vector\n     */\n    function create$3() {\n      var out = new ARRAY_TYPE(3);\n      if (ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n      }\n      return out;\n    }\n\n    /**\n     * Creates a new vec3 initialized with values from an existing vector\n     *\n     * @param {ReadonlyVec3} a vector to clone\n     * @returns {vec3} a new 3D vector\n     */\n    function clone$4(a) {\n      var out = new ARRAY_TYPE(3);\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      return out;\n    }\n\n    /**\n     * Calculates the length of a vec3\n     *\n     * @param {ReadonlyVec3} a vector to calculate length of\n     * @returns {Number} length of a\n     */\n    function length(a) {\n      var x = a[0];\n      var y = a[1];\n      var z = a[2];\n      return Math.sqrt(x * x + y * y + z * z);\n    }\n\n    /**\n     * Creates a new vec3 initialized with the given values\n     *\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @returns {vec3} a new 3D vector\n     */\n    function fromValues$3(x, y, z) {\n      var out = new ARRAY_TYPE(3);\n      out[0] = x;\n      out[1] = y;\n      out[2] = z;\n      return out;\n    }\n\n    /**\n     * Copy the values from one vec3 to another\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the source vector\n     * @returns {vec3} out\n     */\n    function copy$3(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      return out;\n    }\n\n    /**\n     * Set the components of a vec3 to the given values\n     *\n     * @param {vec3} out the receiving vector\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @returns {vec3} out\n     */\n    function set$3(out, x, y, z) {\n      out[0] = x;\n      out[1] = y;\n      out[2] = z;\n      return out;\n    }\n\n    /**\n     * Adds two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function add(out, a, b) {\n      out[0] = a[0] + b[0];\n      out[1] = a[1] + b[1];\n      out[2] = a[2] + b[2];\n      return out;\n    }\n\n    /**\n     * Subtracts vector b from vector a\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function subtract(out, a, b) {\n      out[0] = a[0] - b[0];\n      out[1] = a[1] - b[1];\n      out[2] = a[2] - b[2];\n      return out;\n    }\n\n    /**\n     * Multiplies two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function multiply$1(out, a, b) {\n      out[0] = a[0] * b[0];\n      out[1] = a[1] * b[1];\n      out[2] = a[2] * b[2];\n      return out;\n    }\n\n    /**\n     * Returns the minimum of two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function min(out, a, b) {\n      out[0] = Math.min(a[0], b[0]);\n      out[1] = Math.min(a[1], b[1]);\n      out[2] = Math.min(a[2], b[2]);\n      return out;\n    }\n\n    /**\n     * Returns the maximum of two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function max(out, a, b) {\n      out[0] = Math.max(a[0], b[0]);\n      out[1] = Math.max(a[1], b[1]);\n      out[2] = Math.max(a[2], b[2]);\n      return out;\n    }\n\n    /**\n     * Scales a vec3 by a scalar number\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the vector to scale\n     * @param {Number} b amount to scale the vector by\n     * @returns {vec3} out\n     */\n    function scale(out, a, b) {\n      out[0] = a[0] * b;\n      out[1] = a[1] * b;\n      out[2] = a[2] * b;\n      return out;\n    }\n\n    /**\n     * Adds two vec3's after scaling the second operand by a scalar value\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @param {Number} scale the amount to scale b by before adding\n     * @returns {vec3} out\n     */\n    function scaleAndAdd(out, a, b, scale) {\n      out[0] = a[0] + b[0] * scale;\n      out[1] = a[1] + b[1] * scale;\n      out[2] = a[2] + b[2] * scale;\n      return out;\n    }\n\n    /**\n     * Calculates the euclidian distance between two vec3's\n     *\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {Number} distance between a and b\n     */\n    function distance(a, b) {\n      var x = b[0] - a[0];\n      var y = b[1] - a[1];\n      var z = b[2] - a[2];\n      return Math.sqrt(x * x + y * y + z * z);\n    }\n\n    /**\n     * Calculates the squared euclidian distance between two vec3's\n     *\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {Number} squared distance between a and b\n     */\n    function squaredDistance(a, b) {\n      var x = b[0] - a[0];\n      var y = b[1] - a[1];\n      var z = b[2] - a[2];\n      return x * x + y * y + z * z;\n    }\n\n    /**\n     * Calculates the squared length of a vec3\n     *\n     * @param {ReadonlyVec3} a vector to calculate squared length of\n     * @returns {Number} squared length of a\n     */\n    function squaredLength(a) {\n      var x = a[0];\n      var y = a[1];\n      var z = a[2];\n      return x * x + y * y + z * z;\n    }\n\n    /**\n     * Negates the components of a vec3\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a vector to negate\n     * @returns {vec3} out\n     */\n    function negate(out, a) {\n      out[0] = -a[0];\n      out[1] = -a[1];\n      out[2] = -a[2];\n      return out;\n    }\n\n    /**\n     * Normalize a vec3\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a vector to normalize\n     * @returns {vec3} out\n     */\n    function normalize$2(out, a) {\n      var x = a[0];\n      var y = a[1];\n      var z = a[2];\n      var len = x * x + y * y + z * z;\n      if (len > 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n      }\n      out[0] = a[0] * len;\n      out[1] = a[1] * len;\n      out[2] = a[2] * len;\n      return out;\n    }\n\n    /**\n     * Calculates the dot product of two vec3's\n     *\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {Number} dot product of a and b\n     */\n    function dot$1(a, b) {\n      return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n    }\n\n    /**\n     * Computes the cross product of two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @returns {vec3} out\n     */\n    function cross(out, a, b) {\n      var ax = a[0],\n        ay = a[1],\n        az = a[2];\n      var bx = b[0],\n        by = b[1],\n        bz = b[2];\n      out[0] = ay * bz - az * by;\n      out[1] = az * bx - ax * bz;\n      out[2] = ax * by - ay * bx;\n      return out;\n    }\n\n    /**\n     * Performs a linear interpolation between two vec3's\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the first operand\n     * @param {ReadonlyVec3} b the second operand\n     * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n     * @returns {vec3} out\n     */\n    function lerp(out, a, b, t) {\n      var ax = a[0];\n      var ay = a[1];\n      var az = a[2];\n      out[0] = ax + t * (b[0] - ax);\n      out[1] = ay + t * (b[1] - ay);\n      out[2] = az + t * (b[2] - az);\n      return out;\n    }\n\n    /**\n     * Transforms the vec3 with a mat4.\n     * 4th vector component is implicitly '1'\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the vector to transform\n     * @param {ReadonlyMat4} m matrix to transform with\n     * @returns {vec3} out\n     */\n    function transformMat4$2(out, a, m) {\n      var x = a[0],\n        y = a[1],\n        z = a[2];\n      var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n      w = w || 1.0;\n      out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n      out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n      out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n      return out;\n    }\n\n    /**\n     * Transforms the vec3 with a mat3.\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the vector to transform\n     * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n     * @returns {vec3} out\n     */\n    function transformMat3(out, a, m) {\n      var x = a[0],\n        y = a[1],\n        z = a[2];\n      out[0] = x * m[0] + y * m[3] + z * m[6];\n      out[1] = x * m[1] + y * m[4] + z * m[7];\n      out[2] = x * m[2] + y * m[5] + z * m[8];\n      return out;\n    }\n\n    /**\n     * Transforms the vec3 with a quat\n     * Can also be used for dual quaternions. (Multiply it with the real part)\n     *\n     * @param {vec3} out the receiving vector\n     * @param {ReadonlyVec3} a the vector to transform\n     * @param {ReadonlyQuat} q normalized quaternion to transform with\n     * @returns {vec3} out\n     */\n    function transformQuat(out, a, q) {\n      // Fast Vector Rotation using Quaternions by Robert Eisele\n      // https://raw.org/proof/vector-rotation-using-quaternions/\n\n      var qx = q[0],\n        qy = q[1],\n        qz = q[2],\n        qw = q[3];\n      var vx = a[0],\n        vy = a[1],\n        vz = a[2];\n\n      // t = q x v\n      var tx = qy * vz - qz * vy;\n      var ty = qz * vx - qx * vz;\n      var tz = qx * vy - qy * vx;\n\n      // t = 2t\n      tx = tx + tx;\n      ty = ty + ty;\n      tz = tz + tz;\n\n      // v + w t + q x t\n      out[0] = vx + qw * tx + qy * tz - qz * ty;\n      out[1] = vy + qw * ty + qz * tx - qx * tz;\n      out[2] = vz + qw * tz + qx * ty - qy * tx;\n      return out;\n    }\n\n    /**\n     * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n     *\n     * @param {ReadonlyVec3} a The first vector.\n     * @param {ReadonlyVec3} b The second vector.\n     * @returns {Boolean} True if the vectors are equal, false otherwise.\n     */\n    function exactEquals$1(a, b) {\n      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n    }\n\n    /**\n     * Returns whether or not the vectors have approximately the same elements in the same position.\n     *\n     * @param {ReadonlyVec3} a The first vector.\n     * @param {ReadonlyVec3} b The second vector.\n     * @returns {Boolean} True if the vectors are equal, false otherwise.\n     */\n    function equals$2(a, b) {\n      var a0 = a[0],\n        a1 = a[1],\n        a2 = a[2];\n      var b0 = b[0],\n        b1 = b[1],\n        b2 = b[2];\n      return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n    }\n\n    /**\n     * Alias for {@link vec3.length}\n     * @function\n     */\n    var len = length;\n\n    /**\n     * Perform some operation over an array of vec3s.\n     *\n     * @param {Array} a the array of vectors to iterate over\n     * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n     * @param {Number} offset Number of elements to skip at the beginning of the array\n     * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n     * @param {Function} fn Function to call for each vector in the array\n     * @param {Object} [arg] additional argument to pass to fn\n     * @returns {Array} a\n     * @function\n     */\n    (function () {\n      var vec = create$3();\n      return function (a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) {\n          stride = 3;\n        }\n        if (!offset) {\n          offset = 0;\n        }\n        if (count) {\n          l = Math.min(count * stride + offset, a.length);\n        } else {\n          l = a.length;\n        }\n        for (i = offset; i < l; i += stride) {\n          vec[0] = a[i];\n          vec[1] = a[i + 1];\n          vec[2] = a[i + 2];\n          fn(vec, vec, arg);\n          a[i] = vec[0];\n          a[i + 1] = vec[1];\n          a[i + 2] = vec[2];\n        }\n        return a;\n      };\n    })();\n\n    /**\n     * 4 Dimensional Vector\n     * @module vec4\n     */\n\n    /**\n     * Creates a new, empty vec4\n     *\n     * @returns {vec4} a new 4D vector\n     */\n    function create$2() {\n      var out = new ARRAY_TYPE(4);\n      if (ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n      }\n      return out;\n    }\n\n    /**\n     * Creates a new vec4 initialized with values from an existing vector\n     *\n     * @param {ReadonlyVec4} a vector to clone\n     * @returns {vec4} a new 4D vector\n     */\n    function clone$3(a) {\n      var out = new ARRAY_TYPE(4);\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      out[3] = a[3];\n      return out;\n    }\n\n    /**\n     * Creates a new vec4 initialized with the given values\n     *\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @param {Number} w W component\n     * @returns {vec4} a new 4D vector\n     */\n    function fromValues$2(x, y, z, w) {\n      var out = new ARRAY_TYPE(4);\n      out[0] = x;\n      out[1] = y;\n      out[2] = z;\n      out[3] = w;\n      return out;\n    }\n\n    /**\n     * Copy the values from one vec4 to another\n     *\n     * @param {vec4} out the receiving vector\n     * @param {ReadonlyVec4} a the source vector\n     * @returns {vec4} out\n     */\n    function copy$2(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      out[3] = a[3];\n      return out;\n    }\n\n    /**\n     * Set the components of a vec4 to the given values\n     *\n     * @param {vec4} out the receiving vector\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @param {Number} w W component\n     * @returns {vec4} out\n     */\n    function set$2(out, x, y, z, w) {\n      out[0] = x;\n      out[1] = y;\n      out[2] = z;\n      out[3] = w;\n      return out;\n    }\n\n    /**\n     * Normalize a vec4\n     *\n     * @param {vec4} out the receiving vector\n     * @param {ReadonlyVec4} a vector to normalize\n     * @returns {vec4} out\n     */\n    function normalize$1(out, a) {\n      var x = a[0];\n      var y = a[1];\n      var z = a[2];\n      var w = a[3];\n      var len = x * x + y * y + z * z + w * w;\n      if (len > 0) {\n        len = 1 / Math.sqrt(len);\n      }\n      out[0] = x * len;\n      out[1] = y * len;\n      out[2] = z * len;\n      out[3] = w * len;\n      return out;\n    }\n\n    /**\n     * Calculates the dot product of two vec4's\n     *\n     * @param {ReadonlyVec4} a the first operand\n     * @param {ReadonlyVec4} b the second operand\n     * @returns {Number} dot product of a and b\n     */\n    function dot(a, b) {\n      return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n    }\n\n    /**\n     * Transforms the vec4 with a mat4.\n     *\n     * @param {vec4} out the receiving vector\n     * @param {ReadonlyVec4} a the vector to transform\n     * @param {ReadonlyMat4} m matrix to transform with\n     * @returns {vec4} out\n     */\n    function transformMat4$1(out, a, m) {\n      var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n      out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n      out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n      out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n      out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n      return out;\n    }\n\n    /**\n     * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n     *\n     * @param {ReadonlyVec4} a The first vector.\n     * @param {ReadonlyVec4} b The second vector.\n     * @returns {Boolean} True if the vectors are equal, false otherwise.\n     */\n    function exactEquals(a, b) {\n      return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n    }\n\n    /**\n     * Perform some operation over an array of vec4s.\n     *\n     * @param {Array} a the array of vectors to iterate over\n     * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n     * @param {Number} offset Number of elements to skip at the beginning of the array\n     * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n     * @param {Function} fn Function to call for each vector in the array\n     * @param {Object} [arg] additional argument to pass to fn\n     * @returns {Array} a\n     * @function\n     */\n    (function () {\n      var vec = create$2();\n      return function (a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) {\n          stride = 4;\n        }\n        if (!offset) {\n          offset = 0;\n        }\n        if (count) {\n          l = Math.min(count * stride + offset, a.length);\n        } else {\n          l = a.length;\n        }\n        for (i = offset; i < l; i += stride) {\n          vec[0] = a[i];\n          vec[1] = a[i + 1];\n          vec[2] = a[i + 2];\n          vec[3] = a[i + 3];\n          fn(vec, vec, arg);\n          a[i] = vec[0];\n          a[i + 1] = vec[1];\n          a[i + 2] = vec[2];\n          a[i + 3] = vec[3];\n        }\n        return a;\n      };\n    })();\n\n    /**\n     * Quaternion in the format XYZW\n     * @module quat\n     */\n\n    /**\n     * Creates a new identity quat\n     *\n     * @returns {quat} a new quaternion\n     */\n    function create$1() {\n      var out = new ARRAY_TYPE(4);\n      if (ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n      }\n      out[3] = 1;\n      return out;\n    }\n\n    /**\n     * Sets a quat from the given angle and rotation axis,\n     * then returns it.\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyVec3} axis the axis around which to rotate\n     * @param {Number} rad the angle in radians\n     * @returns {quat} out\n     **/\n    function setAxisAngle(out, axis, rad) {\n      rad = rad * 0.5;\n      var s = Math.sin(rad);\n      out[0] = s * axis[0];\n      out[1] = s * axis[1];\n      out[2] = s * axis[2];\n      out[3] = Math.cos(rad);\n      return out;\n    }\n\n    /**\n     * Multiplies two quat's\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a the first operand\n     * @param {ReadonlyQuat} b the second operand\n     * @returns {quat} out\n     */\n    function multiply(out, a, b) {\n      var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n      var bx = b[0],\n        by = b[1],\n        bz = b[2],\n        bw = b[3];\n      out[0] = ax * bw + aw * bx + ay * bz - az * by;\n      out[1] = ay * bw + aw * by + az * bx - ax * bz;\n      out[2] = az * bw + aw * bz + ax * by - ay * bx;\n      out[3] = aw * bw - ax * bx - ay * by - az * bz;\n      return out;\n    }\n\n    /**\n     * Rotates a quaternion by the given angle about the X axis\n     *\n     * @param {quat} out quat receiving operation result\n     * @param {ReadonlyQuat} a quat to rotate\n     * @param {number} rad angle (in radians) to rotate\n     * @returns {quat} out\n     */\n    function rotateX(out, a, rad) {\n      rad *= 0.5;\n      var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n      var bx = Math.sin(rad),\n        bw = Math.cos(rad);\n      out[0] = ax * bw + aw * bx;\n      out[1] = ay * bw + az * bx;\n      out[2] = az * bw - ay * bx;\n      out[3] = aw * bw - ax * bx;\n      return out;\n    }\n\n    /**\n     * Rotates a quaternion by the given angle about the Y axis\n     *\n     * @param {quat} out quat receiving operation result\n     * @param {ReadonlyQuat} a quat to rotate\n     * @param {number} rad angle (in radians) to rotate\n     * @returns {quat} out\n     */\n    function rotateY(out, a, rad) {\n      rad *= 0.5;\n      var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n      var by = Math.sin(rad),\n        bw = Math.cos(rad);\n      out[0] = ax * bw - az * by;\n      out[1] = ay * bw + aw * by;\n      out[2] = az * bw + ax * by;\n      out[3] = aw * bw - ay * by;\n      return out;\n    }\n\n    /**\n     * Performs a spherical linear interpolation between two quat\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a the first operand\n     * @param {ReadonlyQuat} b the second operand\n     * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n     * @returns {quat} out\n     */\n    function slerp(out, a, b, t) {\n      // benchmarks:\n      //    http://jsperf.com/quaternion-slerp-implementations\n      var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n      var bx = b[0],\n        by = b[1],\n        bz = b[2],\n        bw = b[3];\n      var omega, cosom, sinom, scale0, scale1;\n\n      // calc cosine\n      cosom = ax * bx + ay * by + az * bz + aw * bw;\n      // adjust signs (if necessary)\n      if (cosom < 0.0) {\n        cosom = -cosom;\n        bx = -bx;\n        by = -by;\n        bz = -bz;\n        bw = -bw;\n      }\n      // calculate coefficients\n      if (1.0 - cosom > EPSILON) {\n        // standard case (slerp)\n        omega = Math.acos(cosom);\n        sinom = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n      } else {\n        // \"from\" and \"to\" quaternions are very close\n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n      }\n      // calculate final values\n      out[0] = scale0 * ax + scale1 * bx;\n      out[1] = scale0 * ay + scale1 * by;\n      out[2] = scale0 * az + scale1 * bz;\n      out[3] = scale0 * aw + scale1 * bw;\n      return out;\n    }\n\n    /**\n     * Calculates the conjugate of a quat\n     * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a quat to calculate conjugate of\n     * @returns {quat} out\n     */\n    function conjugate(out, a) {\n      out[0] = -a[0];\n      out[1] = -a[1];\n      out[2] = -a[2];\n      out[3] = a[3];\n      return out;\n    }\n\n    /**\n     * Creates a quaternion from the given 3x3 rotation matrix.\n     *\n     * NOTE: The resultant quaternion is not normalized, so you should be sure\n     * to renormalize the quaternion yourself where necessary.\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyMat3} m rotation matrix\n     * @returns {quat} out\n     * @function\n     */\n    function fromMat3(out, m) {\n      // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n      // article \"Quaternion Calculus and Fast Animation\".\n      var fTrace = m[0] + m[4] + m[8];\n      var fRoot;\n      if (fTrace > 0.0) {\n        // |w| > 1/2, may as well choose w > 1/2\n        fRoot = Math.sqrt(fTrace + 1.0); // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot; // 1/(4w)\n        out[0] = (m[5] - m[7]) * fRoot;\n        out[1] = (m[6] - m[2]) * fRoot;\n        out[2] = (m[1] - m[3]) * fRoot;\n      } else {\n        // |w| <= 1/2\n        var i = 0;\n        if (m[4] > m[0]) i = 1;\n        if (m[8] > m[i * 3 + i]) i = 2;\n        var j = (i + 1) % 3;\n        var k = (i + 2) % 3;\n        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n      }\n      return out;\n    }\n\n    /**\n     * Creates a new quat initialized with values from an existing quaternion\n     *\n     * @param {ReadonlyQuat} a quaternion to clone\n     * @returns {quat} a new quaternion\n     * @function\n     */\n    var clone$2 = clone$3;\n\n    /**\n     * Creates a new quat initialized with the given values\n     *\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @param {Number} w W component\n     * @returns {quat} a new quaternion\n     * @function\n     */\n    var fromValues$1 = fromValues$2;\n\n    /**\n     * Copy the values from one quat to another\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a the source quaternion\n     * @returns {quat} out\n     * @function\n     */\n    var copy$1 = copy$2;\n\n    /**\n     * Set the components of a quat to the given values\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @param {Number} z Z component\n     * @param {Number} w W component\n     * @returns {quat} out\n     * @function\n     */\n    var set$1 = set$2;\n\n    /**\n     * Normalize a quat\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a quaternion to normalize\n     * @returns {quat} out\n     * @function\n     */\n    var normalize = normalize$1;\n\n    /**\n     * Returns whether or not the quaternions point approximately to the same direction.\n     *\n     * Both quaternions are assumed to be unit length.\n     *\n     * @param {ReadonlyQuat} a The first unit quaternion.\n     * @param {ReadonlyQuat} b The second unit quaternion.\n     * @returns {Boolean} True if the quaternions are equal, false otherwise.\n     */\n    function equals$1(a, b) {\n      return Math.abs(dot(a, b)) >= 1 - EPSILON;\n    }\n\n    /**\n     * Sets a quaternion to represent the shortest rotation from one\n     * vector to another.\n     *\n     * Both vectors are assumed to be unit length.\n     *\n     * @param {quat} out the receiving quaternion.\n     * @param {ReadonlyVec3} a the initial vector\n     * @param {ReadonlyVec3} b the destination vector\n     * @returns {quat} out\n     */\n    var rotationTo = function () {\n      var tmpvec3 = create$3();\n      var xUnitVec3 = fromValues$3(1, 0, 0);\n      var yUnitVec3 = fromValues$3(0, 1, 0);\n      return function (out, a, b) {\n        var dot = dot$1(a, b);\n        if (dot < -0.999999) {\n          cross(tmpvec3, xUnitVec3, a);\n          if (len(tmpvec3) < 0.000001) cross(tmpvec3, yUnitVec3, a);\n          normalize$2(tmpvec3, tmpvec3);\n          setAxisAngle(out, tmpvec3, Math.PI);\n          return out;\n        } else if (dot > 0.999999) {\n          out[0] = 0;\n          out[1] = 0;\n          out[2] = 0;\n          out[3] = 1;\n          return out;\n        } else {\n          cross(tmpvec3, a, b);\n          out[0] = tmpvec3[0];\n          out[1] = tmpvec3[1];\n          out[2] = tmpvec3[2];\n          out[3] = 1 + dot;\n          return normalize(out, out);\n        }\n      };\n    }();\n\n    /**\n     * Performs a spherical linear interpolation with two control points\n     *\n     * @param {quat} out the receiving quaternion\n     * @param {ReadonlyQuat} a the first operand\n     * @param {ReadonlyQuat} b the second operand\n     * @param {ReadonlyQuat} c the third operand\n     * @param {ReadonlyQuat} d the fourth operand\n     * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n     * @returns {quat} out\n     */\n    (function () {\n      var temp1 = create$1();\n      var temp2 = create$1();\n      return function (out, a, b, c, d, t) {\n        slerp(temp1, a, d, t);\n        slerp(temp2, b, c, t);\n        slerp(out, temp1, temp2, 2 * t * (1 - t));\n        return out;\n      };\n    })();\n\n    /**\n     * Sets the specified quaternion with values corresponding to the given\n     * axes. Each axis is a vec3 and is expected to be unit length and\n     * perpendicular to all other specified axes.\n     *\n     * @param {ReadonlyVec3} view  the vector representing the viewing direction\n     * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n     * @param {ReadonlyVec3} up    the vector representing the local \"up\" direction\n     * @returns {quat} out\n     */\n    (function () {\n      var matr = create$5();\n      return function (out, view, right, up) {\n        matr[0] = right[0];\n        matr[3] = right[1];\n        matr[6] = right[2];\n        matr[1] = up[0];\n        matr[4] = up[1];\n        matr[7] = up[2];\n        matr[2] = -view[0];\n        matr[5] = -view[1];\n        matr[8] = -view[2];\n        return normalize(out, fromMat3(out, matr));\n      };\n    })();\n\n    /**\n     * 2 Dimensional Vector\n     * @module vec2\n     */\n\n    /**\n     * Creates a new, empty vec2\n     *\n     * @returns {vec2} a new 2D vector\n     */\n    function create() {\n      var out = new ARRAY_TYPE(2);\n      if (ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n      }\n      return out;\n    }\n\n    /**\n     * Creates a new vec2 initialized with values from an existing vector\n     *\n     * @param {ReadonlyVec2} a vector to clone\n     * @returns {vec2} a new 2D vector\n     */\n    function clone$1(a) {\n      var out = new ARRAY_TYPE(2);\n      out[0] = a[0];\n      out[1] = a[1];\n      return out;\n    }\n\n    /**\n     * Creates a new vec2 initialized with the given values\n     *\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @returns {vec2} a new 2D vector\n     */\n    function fromValues(x, y) {\n      var out = new ARRAY_TYPE(2);\n      out[0] = x;\n      out[1] = y;\n      return out;\n    }\n\n    /**\n     * Copy the values from one vec2 to another\n     *\n     * @param {vec2} out the receiving vector\n     * @param {ReadonlyVec2} a the source vector\n     * @returns {vec2} out\n     */\n    function copy(out, a) {\n      out[0] = a[0];\n      out[1] = a[1];\n      return out;\n    }\n\n    /**\n     * Set the components of a vec2 to the given values\n     *\n     * @param {vec2} out the receiving vector\n     * @param {Number} x X component\n     * @param {Number} y Y component\n     * @returns {vec2} out\n     */\n    function set(out, x, y) {\n      out[0] = x;\n      out[1] = y;\n      return out;\n    }\n\n    /**\n     * Transforms the vec2 with a mat4\n     * 3rd vector component is implicitly '0'\n     * 4th vector component is implicitly '1'\n     *\n     * @param {vec2} out the receiving vector\n     * @param {ReadonlyVec2} a the vector to transform\n     * @param {ReadonlyMat4} m matrix to transform with\n     * @returns {vec2} out\n     */\n    function transformMat4(out, a, m) {\n      var x = a[0];\n      var y = a[1];\n      out[0] = m[0] * x + m[4] * y + m[12];\n      out[1] = m[1] * x + m[5] * y + m[13];\n      return out;\n    }\n\n    /**\n     * Returns whether or not the vectors have approximately the same elements in the same position.\n     *\n     * @param {ReadonlyVec2} a The first vector.\n     * @param {ReadonlyVec2} b The second vector.\n     * @returns {Boolean} True if the vectors are equal, false otherwise.\n     */\n    function equals(a, b) {\n      var a0 = a[0],\n        a1 = a[1];\n      var b0 = b[0],\n        b1 = b[1];\n      return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n    }\n\n    /**\n     * Perform some operation over an array of vec2s.\n     *\n     * @param {Array} a the array of vectors to iterate over\n     * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n     * @param {Number} offset Number of elements to skip at the beginning of the array\n     * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n     * @param {Function} fn Function to call for each vector in the array\n     * @param {Object} [arg] additional argument to pass to fn\n     * @returns {Array} a\n     * @function\n     */\n    (function () {\n      var vec = create();\n      return function (a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) {\n          stride = 2;\n        }\n        if (!offset) {\n          offset = 0;\n        }\n        if (count) {\n          l = Math.min(count * stride + offset, a.length);\n        } else {\n          l = a.length;\n        }\n        for (i = offset; i < l; i += stride) {\n          vec[0] = a[i];\n          vec[1] = a[i + 1];\n          fn(vec, vec, arg);\n          a[i] = vec[0];\n          a[i + 1] = vec[1];\n        }\n        return a;\n      };\n    })();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Constants {\n    }\n    Constants.TWO_PI = 6.283185307179586;\n    Constants.PI = 3.141592653589793;\n    Constants.PI_OVER_TWO = 1.5707963267948966;\n    Constants.PI_OVER_THREE = 1.0471975511965976;\n    Constants.PI_OVER_FOUR = 0.7853981633974483;\n    Constants.PI_OVER_SIX = 0.5235987755982988;\n    Constants.LOG_2 = 0.6931471805599453;\n    Constants.RADIANS_PER_DEGREE = 0.017453292519943295;\n    Constants.DEGREES_PER_RADIAN = 57.29577951308232;\n    Constants.ROOT_TWO = 1.4142135623730951;\n    Constants.ROOT_TWO_OVER_TWO = 0.7071067811865476;\n    Constants.ROOT_THREE = 1.7320508075688772;\n    Constants.ROOT_THREE_OVER_TWO = 0.8660254037844386;\n    Constants.ROOT_THREE_OVER_THREE = 0.5773502691896257;\n    Constants.VECTOR2_ZERO = fromValues(0, 0);\n    Constants.VECTOR2_ONE = fromValues(1, 1);\n    Constants.VECTOR2_UNITX = fromValues(1, 0);\n    Constants.VECTOR2_UNITY = fromValues(0, 1);\n    Constants.VECTOR3_ZERO = fromValues$3(0, 0, 0);\n    Constants.VECTOR3_ONE = fromValues$3(1, 1, 1);\n    Constants.VECTOR3_UNITX = fromValues$3(1, 0, 0);\n    Constants.VECTOR3_UNITY = fromValues$3(0, 1, 0);\n    Constants.VECTOR3_UNITZ = fromValues$3(0, 0, 1);\n    Constants.VECTOR3_REFLECTX = fromValues$3(1, -1, -1);\n    Constants.VECTOR3_REFLECTY = fromValues$3(-1, 1, -1);\n    Constants.VECTOR3_REFLECTZ = fromValues$3(-1, -1, 1);\n    Constants.VECTOR4_ZERO = fromValues$2(0, 0, 0, 0);\n    Constants.VECTOR4_ONE = fromValues$2(1, 1, 1, 1);\n    Constants.VECTOR4_UNITX = fromValues$2(1, 0, 0, 0);\n    Constants.VECTOR4_UNITY = fromValues$2(0, 1, 0, 0);\n    Constants.VECTOR4_UNITZ = fromValues$2(0, 0, 1, 0);\n    Constants.VECTOR4_UNITW = fromValues$2(0, 0, 0, 1);\n    Constants.MAT3_IDENTITY = create$5();\n    Constants.MAT4_IDENTITY = create$4();\n    Constants.MAT4_ROTATION_MINUS_90 = fromValues$4(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n    Constants.QUAT_IDENTITY = create$1();\n    Constants.QUAT_ROTATEX_PLUS_90 = fromValues$1(Constants.ROOT_TWO_OVER_TWO, 0, 0, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEX_MINUS_90 = fromValues$1(-Constants.ROOT_TWO_OVER_TWO, 0, 0, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEY_PLUS_90 = fromValues$1(0, Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEY_MINUS_90 = fromValues$1(0, -Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEZ_PLUS_90 = fromValues$1(0, 0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO);\n    Constants.QUAT_ROTATEZ_MINUS_90 = fromValues$1(0, 0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO);\n    Constants.MILLISECONDS_PER_DAY = 86400000;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class MathHelper {\n        static simpleLinearRegression(points) {\n            const n = points.length;\n            let sumX = 0;\n            let sumY = 0;\n            let sumXY = 0;\n            let sumXX = 0;\n            for (let i = 0; i < n; i++) {\n                sumX += points[i].x;\n                sumY += points[i].y;\n                sumXY += points[i].x * points[i].y;\n                sumXX += points[i].x * points[i].x;\n            }\n            const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n            const yIntercept = (sumY - slope * sumX) / n;\n            return { slope, yIntercept };\n        }\n        static clamp(value, min, max) {\n            return Math.max(Math.min(value, max), min);\n        }\n        static lerp(value1, value2, amount) {\n            return value1 + (value2 - value1) * amount;\n        }\n        static normalize(value, min, max, from = 0, to = 1) {\n            return max - min == 0 ? 0 : Math.max(Math.min((to - from) * (value - min) / (max - min) + from, to), from);\n        }\n        static splitExponent(value, result) {\n            let exponent = Math.round(Math.log10(Math.abs(value)));\n            let coefficient = value / Math.pow(10, exponent);\n            if (coefficient < 1) {\n                coefficient *= 10;\n                exponent--;\n            }\n            result[0] = coefficient;\n            result[1] = exponent;\n        }\n        static combineExponent(mantissa, exponent) {\n            return mantissa * Math.pow(10, exponent);\n        }\n        static isPowerOf2(value) {\n            return (value & (value - 1)) == 0;\n        }\n    }\n    class PseudoRandom {\n        constructor(seed) {\n            this._seed = seed % 2147483647;\n            if (this._seed <= 0)\n                this._seed += 2147483646;\n        }\n        next() {\n            return this._seed = this._seed * 16807 % 2147483647;\n        }\n        ;\n        nextFloat() {\n            return (this.next() - 1) / 2147483646;\n        }\n        ;\n        nextInteger(min, max) {\n            return Math.floor(this.nextFloat() * (max - min + 1) + min);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AngleHelper {\n        static degreesToRadians(degrees) {\n            return degrees * Constants.RADIANS_PER_DEGREE;\n        }\n        static radiansToDegrees(radians) {\n            return radians * Constants.DEGREES_PER_RADIAN;\n        }\n        static wrapAngle(angle) {\n            if (angle > Constants.PI)\n                angle = angle - Constants.TWO_PI;\n            else if (angle < -Constants.PI)\n                angle += Constants.TWO_PI;\n            return angle;\n        }\n        static sphericalToCartesian(altitude, longitude, latitude, result) {\n            latitude = AngleHelper.degreesToRadians(latitude);\n            longitude = AngleHelper.degreesToRadians(longitude);\n            const scale = Math.cos(latitude);\n            result[0] = altitude * scale * Math.sin(longitude);\n            result[1] = altitude * Math.sin(latitude);\n            result[2] = altitude * scale * Math.cos(longitude);\n        }\n        static cartesianToSpherical(x, y, z, result) {\n            result[0] = Math.atan2(x, z);\n            result[1] = Math.asin(y);\n        }\n        static angleBetweenVectors(from, to) {\n            if (exactEquals$1(from, to)) {\n                return 0;\n            }\n            else {\n                const dot = MathHelper.clamp(dot$1(from, to), -1, 1);\n                return Math.acos(dot);\n            }\n        }\n        static signedAngleBetweenVectors(from, to, up) {\n            if (exactEquals$1(from, to)) {\n                return 0;\n            }\n            else {\n                const dot = MathHelper.clamp(dot$1(from, to), -1, 1);\n                let angle = Math.acos(dot);\n                cross(AngleHelper._vec3, from, to);\n                if (dot$1(AngleHelper._vec3, up) < 0) {\n                    angle = -angle;\n                }\n                return angle;\n            }\n        }\n    }\n    AngleHelper._vec3 = create$3();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class CameraBase {\n        getView(view) {\n            this.getPosition(view.position);\n        }\n        setView(view, isSmooth) {\n            this.setPosition(view.position, isSmooth);\n        }\n        lerpView(from, to, time) {\n            lerp(this._vec3, from.position, to.position, time);\n            this.setPosition(this._vec3, false);\n        }\n        get vMatrices() { return this._vMatrices; }\n        get inverseVMatrices() { return this._inverseVMatrices; }\n        get mvMatrices() { return this._mvMatrices; }\n        get pMatrices() { return this._pMatrices; }\n        get inversePMatrices() { return this._inversePMatrices; }\n        get pickVMatrix() { return this._pickVMatrix; }\n        get rMatrix() { return this._mat3; }\n        getOrbit(value) { copy$1(value, this._orbitRotation); }\n        setOrbit(value, isSmooth) {\n            copy$1(this._orbitRotation, value);\n            if (!isSmooth) {\n                copy$1(this._smoothedOrbitRotation, value);\n            }\n        }\n        ;\n        getPosition(value) { copy$3(value, this._cameraPosition); }\n        setPosition(value, isSmooth) {\n            copy$3(this._cameraPosition, value);\n            if (!isSmooth) {\n                copy$3(this._smoothedCameraPosition, value);\n            }\n        }\n        ;\n        constructor(core) {\n            this._core = core;\n            this._vec3 = create$3();\n            this._quat = create$1();\n            this._mat3 = create$5();\n            this._right = create$3();\n            this._up = create$3();\n            this._forward = create$3();\n            this._modelManipulationOrigin = create$3();\n            this.modelPosition = create$3();\n            this.modelScale = create$3();\n            this.modelRotation = create$1();\n            this._orbitRotation = create$1();\n            this._orbitDirection = create$1();\n            this._smoothedOrbitRotation = create$1();\n            this._smoothedCameraPosition = create$3();\n            this._smoothedCameraRotation = create$1();\n            this._cameraPosition = create$3();\n            this._cameraRotation = create$1();\n            this._combinedPosition = create$3();\n            this._combinedRotation = create$1();\n            this._leftToRightEye = create$3();\n            this._pickVMatrix = create$4();\n            this._eyePositions = [create$3(), create$3()];\n            this._vMatrices = [create$4(), create$4()];\n            this._mvMatrices = [create$4(), create$4()];\n            this._pMatrices = [create$4(), create$4()];\n            this._inverseVMatrices = [create$4(), create$4()];\n            this._inversePMatrices = [create$4(), create$4()];\n        }\n        reset(isSmooth) {\n            copy$3(this._cameraPosition, Constants.VECTOR3_ZERO);\n            copy$1(this._cameraRotation, Constants.QUAT_IDENTITY);\n            copy$1(this._orbitRotation, Constants.QUAT_IDENTITY);\n            if (!isSmooth) {\n                this.syncSmooth();\n            }\n        }\n        update(elapsedTime) {\n            let amount = Math.min(elapsedTime * this._core.config.positionSmoothing, 1);\n            lerp(this._smoothedCameraPosition, this._smoothedCameraPosition, this._cameraPosition, amount);\n            amount = Math.min(elapsedTime * this._core.config.rotationSmoothing, 1);\n            slerp(this._smoothedCameraRotation, this._smoothedCameraRotation, this._cameraRotation, amount);\n            slerp(this._smoothedOrbitRotation, this._smoothedOrbitRotation, this._orbitRotation, amount);\n            const epsilon = 0.000001;\n            let x;\n            let y;\n            let z;\n            let w;\n            x = this._smoothedCameraPosition[0] - this._cameraPosition[0];\n            y = this._smoothedCameraPosition[1] - this._cameraPosition[1];\n            z = this._smoothedCameraPosition[2] - this._cameraPosition[2];\n            if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon) {\n                copy$3(this._smoothedCameraPosition, this._cameraPosition);\n            }\n            x = this._smoothedCameraRotation[0] - this._cameraRotation[0];\n            y = this._smoothedCameraRotation[1] - this._cameraRotation[1];\n            z = this._smoothedCameraRotation[2] - this._cameraRotation[2];\n            w = this._smoothedCameraRotation[3] - this._cameraRotation[3];\n            if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon && Math.abs(w) < epsilon) {\n                copy$1(this._smoothedCameraRotation, this._cameraRotation);\n            }\n            x = this._smoothedOrbitRotation[0] - this._orbitRotation[0];\n            y = this._smoothedOrbitRotation[1] - this._orbitRotation[1];\n            z = this._smoothedOrbitRotation[2] - this._orbitRotation[2];\n            w = this._smoothedOrbitRotation[3] - this._orbitRotation[3];\n            if (Math.abs(x) < epsilon && Math.abs(y) < epsilon && Math.abs(z) < epsilon && Math.abs(w) < epsilon) {\n                copy$1(this._smoothedOrbitRotation, this._orbitRotation);\n            }\n            normalize(this._smoothedCameraRotation, this._smoothedCameraRotation);\n            normalize(this._smoothedOrbitRotation, this._smoothedOrbitRotation);\n            conjugate(this._orbitDirection, this._smoothedOrbitRotation);\n            transformMat4$2(this._modelManipulationOrigin, this.modelManipulationOrigin, this.modelMMatrix);\n            subtract(this._vec3, this._smoothedCameraPosition, this._modelManipulationOrigin);\n            transformQuat(this._combinedPosition, this._vec3, this._orbitDirection);\n            add(this._combinedPosition, this._combinedPosition, this._modelManipulationOrigin);\n            multiply(this._combinedRotation, this._orbitDirection, this._smoothedCameraRotation);\n            fromQuat$1(this._mat3, this._combinedRotation);\n            this._right[0] = this._mat3[0];\n            this._right[1] = this._mat3[1];\n            this._right[2] = this._mat3[2];\n            this._up[0] = this._mat3[3];\n            this._up[1] = this._mat3[4];\n            this._up[2] = this._mat3[5];\n            this._forward[0] = this._mat3[6];\n            this._forward[1] = this._mat3[7];\n            this._forward[2] = this._mat3[8];\n            const view = this._vMatrices[0];\n            view[0] = this._right[0];\n            view[1] = this._up[0];\n            view[2] = this._forward[0];\n            view[4] = this._right[1];\n            view[5] = this._up[1];\n            view[6] = this._forward[1];\n            view[8] = this._right[2];\n            view[9] = this._up[2];\n            view[10] = this._forward[2];\n            view[12] = -dot$1(this._right, this._combinedPosition);\n            view[13] = -dot$1(this._up, this._combinedPosition);\n            view[14] = -dot$1(this._forward, this._combinedPosition);\n            const aspectRatio = this.width / this.height;\n            if (this._core.config.stereoMode == StereoMode.none) {\n                if (this._core.config.tilesX != 1 || this._core.config.tilesY != 1) {\n                    const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n                    const bottom = -top;\n                    const left = -aspectRatio * top;\n                    const right = aspectRatio * top;\n                    const width = right - left;\n                    const height = top - bottom;\n                    const tileWidth = width / this._core.config.tilesX;\n                    const tileHeight = height / this._core.config.tilesY;\n                    frustum(this._pMatrices[0], left + this._core.config.tileOffsetX * tileWidth, left + (this._core.config.tileOffsetX + 1) * tileWidth, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY - 1) * tileHeight, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY) * tileHeight, this._core.config.nearPlane, this._core.config.farPlane);\n                }\n                else {\n                    perspective(this.pMatrices[0], this._core.config.fov, aspectRatio, this._core.config.nearPlane, this._core.config.farPlane);\n                }\n                multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n                invert(this._inverseVMatrices[0], this.vMatrices[0]);\n                invert(this._inversePMatrices[0], this.pMatrices[0]);\n            }\n            else {\n                cross(this._leftToRightEye, this._forward, this._up);\n                normalize$2(this._leftToRightEye, this._leftToRightEye);\n                scaleAndAdd(this._eyePositions[0], this._combinedPosition, this._leftToRightEye, -this._core.config.ipd);\n                scaleAndAdd(this._eyePositions[1], this._combinedPosition, this._leftToRightEye, this._core.config.ipd);\n                this._vMatrices[0][12] += this._core.config.ipd * 0.5;\n                copy$4(this._vMatrices[1], this._vMatrices[0]);\n                this._vMatrices[1][12] -= this._core.config.ipd;\n                const frustumShift = this._core.config.ipd * 0.5 * this._core.config.nearPlane / this._core.config.screenDistance;\n                const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n                const bottom = -top;\n                let left = -aspectRatio * top + frustumShift;\n                let right = aspectRatio * top + frustumShift;\n                frustum(this._pMatrices[0], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n                left = -aspectRatio * top - frustumShift;\n                right = aspectRatio * top - frustumShift;\n                frustum(this._pMatrices[1], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n                multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n                multiply$2(this._mvMatrices[1], this._vMatrices[1], this.modelMMatrix);\n                invert(this._inverseVMatrices[0], this._vMatrices[0]);\n                invert(this._inversePMatrices[0], this._pMatrices[0]);\n                copy$4(this._inverseVMatrices[1], this._inverseVMatrices[0]);\n                this._inverseVMatrices[1][12] += this._core.config.ipd;\n                invert(this._inversePMatrices[1], this._pMatrices[1]);\n            }\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`cam off ${this._cameraPosition[0] < 0 ? \"\" : \" \"}${this._cameraPosition[0].toFixed(3)},${this._cameraPosition[1] < 0 ? \"\" : \" \"}${this._cameraPosition[1].toFixed(3)},${this._cameraPosition[2] < 0 ? \"\" : \" \"}${this._cameraPosition[2].toFixed(3)}`);\n                this._core.debugText.addLine(`cam pos ${this._combinedPosition[0] < 0 ? \"\" : \" \"}${this._combinedPosition[0].toFixed(3)},${this._combinedPosition[1] < 0 ? \"\" : \" \"}${this._combinedPosition[1].toFixed(3)},${this._combinedPosition[2] < 0 ? \"\" : \" \"}${this._combinedPosition[2].toFixed(3)}`);\n                this._core.debugText.addLine(`cam rot ${this._combinedRotation[0] < 0 ? \"\" : \" \"}${this._combinedRotation[0].toFixed(3)},${this._combinedRotation[1] < 0 ? \"\" : \" \"}${this._combinedRotation[1].toFixed(3)},${this._combinedRotation[2] < 0 ? \"\" : \" \"}${this._combinedRotation[2].toFixed(3)},${this._combinedRotation[3] < 0 ? \"\" : \" \"}${this._combinedRotation[3].toFixed(3)}`);\n            }\n        }\n        _zoom(direction, distance) {\n            scaleAndAdd(this._cameraPosition, this._cameraPosition, direction, distance);\n        }\n        rotate(translationDelta) { }\n        zoom(zoomDelta, x, y) {\n            this.unproject(this._vec3, x, y, 1);\n            normalize$2(this._vec3, this._vec3);\n            const distance$1 = zoomDelta * distance(this._combinedPosition, this.modelPosition);\n            transformQuat(this._vec3, this._vec3, this._orbitRotation);\n            this._zoom(this._vec3, distance$1);\n        }\n        _twist(axis, angle) { }\n        twist(angle, x, y) { }\n        updatePickVMatrix(x, y) {\n            this.unproject(this._vec3, x, y, 1);\n            lookAt(this._pickVMatrix, this._combinedPosition, this._vec3, this._up);\n        }\n        syncSmooth() {\n            copy$3(this._smoothedCameraPosition, this._cameraPosition);\n            copy$1(this._smoothedCameraRotation, this._cameraRotation);\n            copy$1(this._smoothedOrbitRotation, this._orbitRotation);\n        }\n        updateModelManipulationOrigin(from, to) {\n            const a = create$3();\n            const b = create$3();\n            const c = create$3();\n            const d = create$3();\n            transformMat4$2(a, from, this.modelMMatrix);\n            transformMat4$2(b, to, this.modelMMatrix);\n            subtract(a, this._cameraPosition, a);\n            subtract(b, this._cameraPosition, b);\n            transformQuat(c, a, this._orbitDirection);\n            transformQuat(d, b, this._orbitDirection);\n            subtract(c, c, a);\n            subtract(d, d, b);\n            subtract(this._vec3, c, d);\n            transformQuat(this._vec3, this._vec3, this._orbitRotation);\n            add(this._cameraPosition, this._cameraPosition, this._vec3);\n            add(this._smoothedCameraPosition, this._smoothedCameraPosition, this._vec3);\n        }\n        unproject(position, x, y, z) {\n            set$3(position, 2 * x / this.width - 1, 1 - 2 * y / this.height, z);\n            transformMat4$2(position, position, this._inversePMatrices[0]);\n            transformMat4$2(position, position, this._inverseVMatrices[0]);\n        }\n        translate(translationDelta) {\n            const distance$1 = distance(this.modelPosition, this._combinedPosition);\n            const height = 2 * Math.tan(this._core.config.fov / 2) * distance$1 / this.height;\n            set$3(this._vec3, height * translationDelta[0], -height * translationDelta[1], 0);\n            transformQuat(this._vec3, this._vec3, this._combinedRotation);\n            transformQuat(this._vec3, this._vec3, this._orbitRotation);\n            subtract(this._cameraPosition, this._cameraPosition, this._vec3);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AltAzimuthCamera extends CameraBase {\n        getView(view) {\n            super.getView(view);\n            view.altitude = this.altitude;\n            view.azimuth = this.azimuth;\n            view.fov = this._core.config.fov;\n        }\n        setView(view, isSmooth) {\n            super.setView(view, isSmooth);\n            this.setAltAzimuth(view.altitude, view.azimuth, isSmooth);\n            this._core.config.fov = view.fov;\n        }\n        lerpView(from, to, time) {\n            super.lerpView(from, to, time);\n            this.setAltAzimuth(MathHelper.lerp(from.altitude, to.altitude, time), MathHelper.lerp(from.azimuth, to.azimuth, time), false);\n            this._core.config.fov = MathHelper.lerp(from.fov, to.fov, time);\n        }\n        update(elapsedTime) {\n            super.update(elapsedTime);\n            if (this._core.config.isDebugVisible) {\n                const altitude = AngleHelper.radiansToDegrees(this.altitude);\n                const azimuth = AngleHelper.radiansToDegrees(this.azimuth);\n                this._core.debugText.addLine(`cam alt ${altitude < 0 ? \"\" : \" \"}${altitude.toFixed(1)}`);\n                this._core.debugText.addLine(`cam azi ${azimuth < 0 ? \"\" : \" \"}${azimuth.toFixed(1)}`);\n            }\n        }\n        get altitude() {\n            transformQuat(this._up, Constants.VECTOR3_UNITY, this._combinedRotation);\n            transformQuat(this._right, Constants.VECTOR3_UNITX, this._combinedRotation);\n            return -AngleHelper.signedAngleBetweenVectors(Constants.VECTOR3_UNITY, this._up, this._right);\n        }\n        get azimuth() {\n            transformQuat(this._up, Constants.VECTOR3_UNITY, this._combinedRotation);\n            transformQuat(this._right, Constants.VECTOR3_UNITX, this._combinedRotation);\n            return -AngleHelper.signedAngleBetweenVectors(Constants.VECTOR3_UNITX, this._right, this._up);\n        }\n        setAltAzimuth(altitude, azimuth, isSmooth) {\n            setAxisAngle(this._quat, Constants.VECTOR3_UNITX, altitude);\n            multiply(this._orbitRotation, this._quat, Constants.QUAT_IDENTITY);\n            setAxisAngle(this._quat, Constants.VECTOR3_UNITY, azimuth);\n            multiply(this._orbitRotation, this._orbitRotation, this._quat);\n            if (!isSmooth) {\n                this.syncSmooth();\n            }\n        }\n        rotate(translationDelta) {\n            const length = Math.min(this.width, this.height);\n            let angle = translationDelta[1] * Constants.PI / length;\n            setAxisAngle(this._quat, Constants.VECTOR3_UNITX, angle);\n            multiply(this._orbitRotation, this._quat, this._orbitRotation);\n            angle = translationDelta[0] * Constants.PI / length;\n            setAxisAngle(this._quat, Constants.VECTOR3_UNITY, angle);\n            multiply(this._orbitRotation, this._orbitRotation, this._quat);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Config$2 = class Config {\n        constructor(core) {\n            this.reset();\n        }\n        reset() {\n            this.isDebugVisible = false;\n            this.logLevel = LogLevel.warn;\n            this.shaderPath = \"shaders\";\n            this.fontPath = \"fonts\";\n            this.modelDistance = 0.5;\n            this.modelSize = 0.25;\n            this.stereoMode = StereoMode.none;\n            this.ipd = 0.06;\n            this.screenDistance = 0.5;\n            this.fov = AngleHelper.degreesToRadians(30);\n            this.nearPlane = 0.01;\n            this.farPlane = 100;\n            this.pickWidth = 512;\n            this.pickHeight = 512;\n            this.pickHoldDelay = 1000;\n            this.pickSelectDelay = 100;\n            this.resizeMinimumDelay = 250;\n            this.rotationSmoothing = 0.02;\n            this.positionSmoothing = 0.02;\n            this.focusSmoothing = 0.01;\n            this.scaleSmoothing = 0.02;\n            this.mouseWheelZoomScale = -2e-3;\n            this.mouseWheelRotationScale = -2e-3;\n            this.dragToleranceSquared = 100;\n            this.manipulatorMinRelativeDistanceSquared = 100;\n            this.isMultiTouchEnabled = true;\n            this.isMultiTouchZoomEnabled = true;\n            this.isMultiTouchTwistEnabled = true;\n            this.isMultiTouchRotateEnabled = true;\n            this.isMultiTouchTranslateEnabled = true;\n            this.multiTouchZoomScale = 1;\n            this.cameraMinDistance = 0.1;\n            this.cameraMaxDistance = 10;\n            this.xrControllerRayColor = fromValues$3(0.5, 0.5, 0.5);\n            this.xrControllerProfile = \"windows-mixed-reality\";\n            this.xrControllerHandedness = \"right\";\n            this.paletteColor = new Uint8Array([0x80, 0x80, 0x80, 0]);\n            this.textColor = create$3();\n            this.textHoverColor = create$3();\n            this.textBorderColor = create$3();\n            this.textBorderWidth = 0x18 / 0xff;\n            this.identityRotation = Constants.VECTOR3_UNITY;\n            this.axesTextLabelMaxGlyphs = 32;\n            this.axesTextColor = create$3();\n            this.axesTextBorderColor = create$3();\n            this.axesTextHoverColor = create$3();\n            this.axesTextLabelMajorSize = 0.03;\n            this.axesTextLabelMinorSize = 0.02;\n            this.axesTextTitleMaxGlyphs = 127;\n            this.axesTextTitleSize = 0.05;\n            this.axesTextHeadingMaxGlyphs = 128;\n            this.axesTextHeadingSize = 0.075;\n            this.axesTextTitleLineHeight = 1.5;\n            this.axesTextHeadingLineHeight = 1.5;\n            this.axesTextLabelLineHeight = 1.5;\n            this.axesGridMajorThickness = 0.0002;\n            this.axesGridMinorThickness = 0.0001;\n            this.axesGridZeroThickness = 0.002;\n            this.axesGridPickDivisionHeight = 0.025;\n            this.axesGridBackgroundColor = create$3();\n            this.axesGridHighlightColor = create$3();\n            this.axesGridMinorColor = create$3();\n            this.axesGridMajorColor = create$3();\n            this.axesGridZeroColor = create$3();\n            this.axesGridDefaultDivisions = 10;\n            this.keyTitleMaxGlyphs = 64;\n            this.keyLabelMaxGlyphs = 64;\n            this.selectionColor = create$3();\n            this.hoverColor = create$3();\n            this.activeColor = create$3();\n            this.highlightMode = HighlightMode.color;\n            this.lassoThickness = 4;\n            this.lassoDashWidth = 2;\n            this.lassoColor = create$3();\n            this.minCubifiedTreeMapSlice = 0.01;\n            this.sdfBuffer = 0xc0;\n            this.sdfBorder = 0x0;\n            this.forceDirectIsEnabled = false;\n            this.forceDirectAttraction = 1;\n            this.forceDirectRepulsion = 1;\n            this.forceDirectGravity = 1;\n            this.forceDirectInterval = 0.1;\n            this.forceDirectMaxDistance = 0.1;\n            this.forceDirectTheta = 1;\n            this.forceDirectIterationsPerLayout = 1;\n            this.forceDirectEdgeWeightPower = 1;\n            this.forceDirectLockX = false;\n            this.forceDirectLockY = false;\n            this.forceDirectLockZ = false;\n            this.transitionDuration = 400;\n            this.transitionStaggering = 100;\n            this.transitionView = true;\n            this.isTransitionPickingEnabled = false;\n            this.backgroundColor = create$2();\n            this.theme = Theme.light;\n            this.ambientColor = create$3();\n            this.renderMode = RenderMode.color;\n            this.tilesX = 1;\n            this.tilesY = 1;\n            this.tileOffsetX = 0;\n            this.tileOffsetY = 0;\n        }\n        get theme() { return this._theme; }\n        set theme(value) {\n            if (this._theme != value) {\n                this._theme = value;\n                switch (value) {\n                    case Theme.dark:\n                        set$2(this.backgroundColor, 0, 0, 0, 1);\n                        set$3(this.textColor, 0.9, 0.9, 0.9);\n                        set$3(this.textHoverColor, 1, 1, 1);\n                        set$3(this.textBorderColor, 0, 0, 0);\n                        set$3(this.axesTextColor, 0.9, 0.9, 0.9);\n                        set$3(this.axesTextBorderColor, 0, 0, 0);\n                        set$3(this.axesTextHoverColor, 1, 1, 1);\n                        set$3(this.axesGridBackgroundColor, 0.02, 0.02, 0.02);\n                        set$3(this.axesGridHighlightColor, 0.04, 0.04, 0.04);\n                        set$3(this.axesGridMinorColor, 0.05, 0.05, 0.05);\n                        set$3(this.axesGridMajorColor, 0.1, 0.1, 0.1);\n                        set$3(this.axesGridZeroColor, 0.05, 0.1, 0.1);\n                        set$3(this.selectionColor, 1, 1, 0);\n                        set$3(this.hoverColor, 1, 0, 1);\n                        set$3(this.activeColor, 0, 1, 1);\n                        set$3(this.lassoColor, 0.9, 0.9, 0.9);\n                        break;\n                    case Theme.light:\n                        set$2(this.backgroundColor, 1, 1, 1, 1);\n                        set$3(this.textColor, 0, 0, 0);\n                        set$3(this.textHoverColor, 0.1, 0.1, 0.1);\n                        set$3(this.textBorderColor, 1, 1, 1);\n                        set$3(this.axesTextColor, 0, 0, 0);\n                        set$3(this.axesTextBorderColor, 1, 1, 1);\n                        set$3(this.axesTextHoverColor, 0.1, 0.1, 0.1);\n                        set$3(this.axesGridBackgroundColor, 1, 1, 1);\n                        set$3(this.axesGridHighlightColor, 0.925, 0.925, 0.925);\n                        set$3(this.axesGridMinorColor, 0.9, 0.9, 0.9);\n                        set$3(this.axesGridMajorColor, 0.8, 0.8, 0.8);\n                        set$3(this.axesGridZeroColor, 0.7, 0.9, 0.9);\n                        set$3(this.selectionColor, 1, 1, 0);\n                        set$3(this.hoverColor, 1, 0, 1);\n                        set$3(this.activeColor, 0, 1, 1);\n                        set$3(this.lassoColor, 0.1, 0.1, 0.1);\n                        break;\n                }\n                if (this.themeChangedCallback) {\n                    this.themeChangedCallback(this._theme);\n                }\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DebugText {\n        get text() { return this._text; }\n        constructor() {\n            this.clear();\n        }\n        clear() {\n            this._text = \"\";\n        }\n        addLine(value) {\n            this._text += value + \"\\n\";\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Fps {\n        get frameCounter() { return this._frameCounter; }\n        get totalFrames() { return this._totalFrames; }\n        constructor(core) {\n            this._core = core;\n            this._totalFrames = 0;\n            this.reset();\n        }\n        update(elapsedTime) {\n            this._elapsedTime += elapsedTime;\n            if (this._elapsedTime > 1000) {\n                this._elapsedTime -= 1000;\n                this._fps = this._frameCounter;\n                this._frameCounter = 0;\n            }\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`fps      ${this._fps}`);\n            }\n        }\n        render() {\n            this._frameCounter++;\n            this._totalFrames++;\n        }\n        reset() {\n            this._fps = 0;\n            this._frameCounter = 0;\n            this._elapsedTime = 0;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    const PaletteType = {\n        sequentialsinglehue: \"sequentialsinglehue\",\n        sequentialmultihue: \"sequentialmultihue\",\n        diverging: \"diverging\",\n        qualitative: \"qualitative\",\n    };\n    class PaletteResources {\n        constructor() {\n            this.palettes = {\n                \"blues\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 251, 255, 222, 235, 247, 198, 219, 239, 158, 202, 225, 107, 174, 214, 66, 146, 198, 33, 113, 181, 8, 81, 156, 8, 48, 107]) },\n                \"greens\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 252, 245, 229, 245, 224, 199, 233, 192, 161, 217, 155, 116, 196, 118, 65, 171, 93, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n                \"greys\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 255, 255, 240, 240, 240, 217, 217, 217, 189, 189, 189, 150, 150, 150, 115, 115, 115, 82, 82, 82, 37, 37, 37, 0, 0, 0]) },\n                \"oranges\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 235, 254, 230, 206, 253, 208, 162, 253, 174, 107, 253, 141, 60, 241, 105, 19, 217, 72, 1, 166, 54, 3, 127, 39, 4]) },\n                \"purples\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([252, 251, 253, 239, 237, 245, 218, 218, 235, 188, 189, 220, 158, 154, 200, 128, 125, 186, 106, 81, 163, 84, 39, 143, 63, 0, 125]) },\n                \"reds\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 240, 254, 224, 210, 252, 187, 161, 252, 146, 114, 251, 106, 74, 239, 59, 44, 203, 24, 29, 165, 15, 21, 103, 0, 13]) },\n                \"viridis\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([0x48, 0x25, 0x75, 0x41, 0x44, 0x87, 0x35, 0x60, 0x8d, 0x2a, 0x78, 0x8e, 0x21, 0x91, 0x8d, 0x22, 0xa8, 0x84, 0x43, 0xbf, 0x71, 0x7a, 0xd1, 0x51, 0xbc, 0xdf, 0x27]) },\n                \"inferno\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([0x17, 0x0c, 0x3b, 0x42, 0x0a, 0x68, 0x6b, 0x17, 0x6e, 0x93, 0x26, 0x67, 0xbb, 0x37, 0x55, 0xdd, 0x51, 0x3a, 0xf3, 0x77, 0x1a, 0xfc, 0xa5, 0x0a, 0xf6, 0xd6, 0x45]) },\n                \"magma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([0x15, 0x0e, 0x37, 0x3b, 0x0f, 0x70, 0x65, 0x1a, 0x80, 0x8c, 0x29, 0x81, 0xb6, 0x37, 0x7a, 0xde, 0x49, 0x68, 0xf7, 0x6f, 0x5c, 0xfe, 0x9f, 0x6d, 0xfe, 0xce, 0x91]) },\n                \"plasma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([0x42, 0x03, 0x9d, 0x6a, 0x00, 0xa8, 0x90, 0x0d, 0xa4, 0xb1, 0x2a, 0x90, 0xcb, 0x47, 0x79, 0xe1, 0x64, 0x62, 0xf2, 0x83, 0x4c, 0xfc, 0xa6, 0x36, 0xfc, 0xce, 0x25]) },\n                \"bluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 229, 245, 249, 204, 236, 230, 153, 216, 201, 102, 194, 164, 65, 174, 118, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n                \"bluepurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 224, 236, 244, 191, 211, 230, 158, 188, 218, 140, 150, 198, 140, 107, 177, 136, 65, 157, 129, 15, 124, 77, 0, 75]) },\n                \"greenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 240, 224, 243, 219, 204, 235, 197, 168, 221, 181, 123, 204, 196, 78, 179, 211, 43, 140, 190, 8, 104, 172, 8, 64, 129]) },\n                \"orangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 236, 254, 232, 200, 253, 212, 158, 253, 187, 132, 252, 141, 89, 239, 101, 72, 215, 48, 31, 179, 0, 0, 127, 0, 0]) },\n                \"purpleblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 231, 242, 208, 209, 230, 166, 189, 219, 116, 169, 207, 54, 144, 192, 5, 112, 176, 4, 90, 141, 2, 56, 88]) },\n                \"purplebluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 226, 240, 208, 209, 230, 166, 189, 219, 103, 169, 207, 54, 144, 192, 2, 129, 138, 1, 108, 89, 1, 70, 54]) },\n                \"purplered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 244, 249, 231, 225, 239, 212, 185, 218, 201, 148, 199, 223, 101, 176, 231, 41, 138, 206, 18, 86, 152, 0, 67, 103, 0, 31]) },\n                \"redpurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 243, 253, 224, 221, 252, 197, 192, 250, 159, 181, 247, 104, 161, 221, 52, 151, 174, 1, 126, 122, 1, 119, 73, 0, 106]) },\n                \"yellowgreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 247, 252, 185, 217, 240, 163, 173, 221, 142, 120, 198, 121, 65, 171, 93, 35, 132, 67, 0, 104, 55, 0, 69, 41]) },\n                \"yellowgreenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 217, 237, 248, 177, 199, 233, 180, 127, 205, 187, 65, 182, 196, 29, 145, 192, 34, 94, 168, 37, 52, 148, 8, 29, 88]) },\n                \"yelloworangebrown\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 255, 247, 188, 254, 227, 145, 254, 196, 79, 254, 153, 41, 236, 112, 20, 204, 76, 2, 153, 52, 4, 102, 37, 6]) },\n                \"yelloworangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 204, 255, 237, 160, 254, 217, 118, 254, 178, 76, 253, 141, 60, 252, 78, 42, 227, 26, 28, 189, 0, 38, 128, 0, 38]) },\n                \"brownbluegreen\": { type: PaletteType.diverging, colors: new Uint8Array([84, 48, 5, 140, 81, 10, 191, 129, 45, 223, 194, 125, 246, 232, 195, 245, 245, 245, 199, 234, 229, 128, 205, 193, 53, 151, 143, 1, 102, 94, 0, 60, 48]) },\n                \"pinkyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([142, 1, 82, 197, 27, 125, 222, 119, 174, 241, 182, 218, 253, 224, 239, 247, 247, 247, 230, 245, 208, 184, 225, 134, 127, 188, 65, 77, 146, 33, 39, 100, 25]) },\n                \"purplegreen\": { type: PaletteType.diverging, colors: new Uint8Array([64, 0, 75, 118, 42, 131, 153, 112, 171, 194, 165, 207, 231, 212, 232, 247, 247, 247, 217, 240, 211, 166, 219, 160, 90, 174, 97, 27, 120, 55, 0, 68, 27]) },\n                \"purpleorange\": { type: PaletteType.diverging, colors: new Uint8Array([127, 59, 8, 179, 88, 6, 224, 130, 20, 253, 184, 99, 254, 224, 182, 247, 247, 247, 216, 218, 235, 178, 171, 210, 128, 115, 172, 84, 39, 136, 45, 0, 75]) },\n                \"redblue\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 247, 247, 247, 209, 229, 240, 146, 197, 222, 67, 147, 195, 33, 102, 172, 5, 48, 97]) },\n                \"redgrey\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 255, 255, 255, 224, 224, 224, 186, 186, 186, 135, 135, 135, 77, 77, 77, 26, 26, 26]) },\n                \"redyellowblue\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 144, 255, 255, 191, 224, 243, 248, 171, 217, 233, 116, 173, 209, 69, 117, 180, 49, 54, 149]) },\n                \"redyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 217, 239, 139, 166, 217, 106, 102, 189, 99, 26, 152, 80, 0, 104, 55]) },\n                \"spectral\": { type: PaletteType.diverging, colors: new Uint8Array([158, 1, 66, 213, 62, 79, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 230, 245, 152, 171, 221, 164, 102, 194, 165, 50, 136, 189, 94, 79, 162]) },\n                \"accent\": { type: PaletteType.qualitative, colors: new Uint8Array([127, 201, 127, 190, 174, 212, 253, 192, 134, 255, 255, 153, 56, 108, 176, 240, 2, 127, 191, 91, 23, 102, 102, 102]) },\n                \"category10\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 255, 127, 14, 44, 160, 44, 214, 39, 40, 148, 103, 189, 140, 86, 75, 227, 119, 194, 127, 127, 127, 188, 189, 34, 23, 190, 207]) },\n                \"category20\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 174, 199, 232, 255, 127, 14, 255, 187, 120, 44, 160, 44, 152, 223, 138, 214, 39, 40, 255, 152, 150, 148, 103, 189, 197, 176, 213, 140, 86, 75, 196, 156, 148, 227, 119, 194, 247, 182, 210, 127, 127, 127, 199, 199, 199, 188, 189, 34, 219, 219, 141, 23, 190, 207, 158, 218, 229]) },\n                \"dark2\": { type: PaletteType.qualitative, colors: new Uint8Array([27, 158, 119, 217, 95, 2, 117, 112, 179, 231, 41, 138, 102, 166, 30, 230, 171, 2, 166, 118, 29, 102, 102, 102]) },\n                \"paired\": { type: PaletteType.qualitative, colors: new Uint8Array([166, 206, 227, 31, 120, 180, 178, 223, 138, 51, 160, 44, 251, 154, 153, 227, 26, 28, 253, 191, 111, 255, 127, 0, 202, 178, 214, 106, 61, 154, 255, 255, 153, 177, 89, 40]) },\n                \"pastel1\": { type: PaletteType.qualitative, colors: new Uint8Array([251, 180, 174, 179, 205, 227, 204, 235, 197, 222, 203, 228, 254, 217, 166, 255, 255, 204, 229, 216, 189, 253, 218, 236, 242, 242, 242]) },\n                \"pastel2\": { type: PaletteType.qualitative, colors: new Uint8Array([179, 226, 205, 253, 205, 172, 203, 213, 232, 244, 202, 228, 230, 245, 201, 255, 242, 174, 241, 226, 204, 204, 204, 204]) },\n                \"set1\": { type: PaletteType.qualitative, colors: new Uint8Array([228, 26, 28, 55, 126, 184, 77, 175, 74, 152, 78, 163, 255, 127, 0, 255, 255, 51, 166, 86, 40, 247, 129, 191, 153, 153, 153]) },\n                \"set2\": { type: PaletteType.qualitative, colors: new Uint8Array([102, 194, 165, 252, 141, 98, 141, 160, 203, 231, 138, 195, 166, 216, 84, 255, 217, 47, 229, 196, 148, 179, 179, 179]) },\n                \"set3\": { type: PaletteType.qualitative, colors: new Uint8Array([141, 211, 199, 255, 255, 179, 190, 186, 218, 251, 128, 114, 128, 177, 211, 253, 180, 98, 179, 222, 105, 252, 205, 229, 217, 217, 217, 188, 128, 189, 204, 235, 197, 255, 237, 111]) },\n            };\n        }\n    }\n    class PaletteBase {\n        get colors() { return this._colors; }\n        set colors(value) {\n            if (this._colors != value) {\n                this._colors = value;\n                this._changed = true;\n            }\n        }\n        constructor() {\n            this._colors = null;\n        }\n        copyFrom(palette) {\n            if (palette.colors) {\n                this.colors = new Uint8Array(palette.colors);\n            }\n            else {\n                this.colors = null;\n            }\n        }\n        update() { }\n    }\n    let Palette$2 = class Palette extends PaletteBase {\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class PositionVertex {\n        static getPosition(buffer, index, value) {\n            const offset = index * PositionVertex.SIZE;\n            set$3(value, buffer[offset], buffer[offset + 1], buffer[offset + 2]);\n        }\n        static setPosition(buffer, index, value) {\n            const offset = index * PositionVertex.SIZE;\n            buffer[offset] = value[0];\n            buffer[offset + 1] = value[1];\n            buffer[offset + 2] = value[2];\n        }\n    }\n    PositionVertex.SIZE = 3;\n    PositionVertex.SIZE_BYTES = 12;\n    class PositionColorVertex {\n        static getPosition(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setPosition(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getColor(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n            set$3(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF);\n        }\n        static setColor(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n        }\n    }\n    PositionColorVertex.SIZE_BYTES = 16;\n    PositionColorVertex.POSITION_OFFSET_BYTES = 0;\n    PositionColorVertex.COLOR_OFFSET_BYTES = 12;\n    class PositionTextureVertex {\n        static getPosition(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setPosition(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = PositionColorVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        }\n    }\n    PositionTextureVertex.SIZE_BYTES = 16;\n    PositionTextureVertex.POSITION_OFFSET_BYTES = 0;\n    PositionTextureVertex.TEX_COORD_OFFSET_BYTES = 12;\n    class PositionTexturePickVertex {\n        static getPosition(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setPosition(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        }\n        static getIdColor(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            set$2(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n        }\n        static setIdColor(bufferView, index, value) {\n            const offset = PositionTexturePickVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n            bufferView.setUint8(offset + 3, value[3] * 0xFF);\n        }\n    }\n    PositionTexturePickVertex.SIZE_BYTES = 20;\n    PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES = 0;\n    PositionTexturePickVertex.POSITION_OFFSET_BYTES = 4;\n    PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES = 16;\n    class PositionNormalTextureVertex {\n        static getPosition(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setPosition(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.POSITION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getNormal(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n            set$3(value, bufferView.getInt8(offset) / 0x7F, bufferView.getInt8(offset + 1) / 0x7F, bufferView.getInt8(offset + 2) / 0x7F);\n        }\n        static setNormal(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n            bufferView.setInt8(offset, value[0] * 0x7F);\n            bufferView.setInt8(offset + 1, value[1] * 0x7F);\n            bufferView.setInt8(offset + 2, value[2] * 0x7F);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = PositionNormalTextureVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        }\n    }\n    PositionNormalTextureVertex.SIZE_BYTES = 20;\n    PositionNormalTextureVertex.POSITION_OFFSET_BYTES = 0;\n    PositionNormalTextureVertex.NORMAL_OFFSET_BYTES = 12;\n    PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES = 16;\n    class PickGridVertex {\n        static getTranslation(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setTranslation(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static getNormal(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n            set$3(value, bufferView.getInt8(offset) / 0x7F, bufferView.getInt8(offset + 1) / 0x7F, bufferView.getInt8(offset + 2) / 0x7F);\n        }\n        static setNormal(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.NORMAL_OFFSET_BYTES;\n            bufferView.setInt8(offset, value[0] * 0x7F);\n            bufferView.setInt8(offset + 1, value[1] * 0x7F);\n            bufferView.setInt8(offset + 2, value[2] * 0x7F);\n        }\n        static getIdColor(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            set$2(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n        }\n        static setIdColor(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n            bufferView.setUint8(offset + 3, value[3] * 0xFF);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            set(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF);\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.TEX_COORD_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n        }\n        static getBounds(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.BOUNDS_OFFSET_BYTES;\n            set$2(value, bufferView.getUint16(offset, true) / 0xFFFF, bufferView.getUint16(offset + 2, true) / 0xFFFF, bufferView.getUint16(offset + 4, true) / 0xFFFF, bufferView.getUint16(offset + 6, true) / 0xFFFF);\n        }\n        static setBounds(bufferView, index, value) {\n            const offset = PickGridVertex.SIZE_BYTES * index + this.BOUNDS_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFFFF, true);\n            bufferView.setUint16(offset + 2, value[1] * 0xFFFF, true);\n            bufferView.setUint16(offset + 4, value[2] * 0xFFFF, true);\n            bufferView.setUint16(offset + 6, value[3] * 0xFFFF, true);\n        }\n    }\n    PickGridVertex.SIZE_BYTES = 32;\n    PickGridVertex.TRANSLATION_OFFSET_BYTES = 0;\n    PickGridVertex.NORMAL_OFFSET_BYTES = 12;\n    PickGridVertex.ID_COLOR_OFFSET_BYTES = 16;\n    PickGridVertex.TEX_COORD_OFFSET_BYTES = 20;\n    PickGridVertex.BOUNDS_OFFSET_BYTES = 24;\n    class UnitVertex {\n        static getIdHover(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.ID_HOVER_OFFSET_BYTES, true);\n        }\n        static setIdHover(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.ID_HOVER_OFFSET_BYTES, value, true);\n        }\n        static copyIdHover(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ID_HOVER_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ID_HOVER_OFFSET_BYTES, true), true);\n        }\n        static getTranslation(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setTranslation(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.TRANSLATION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static copyTranslation(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TRANSLATION_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TRANSLATION_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n            toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n        }\n        static getColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n            set(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF);\n        }\n        static setColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n        }\n        static copyColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.COLOR_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.COLOR_OFFSET_BYTES;\n            toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n            toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n        }\n        static getOrder(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ORDER_OFFSET_BYTES;\n            set(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true));\n        }\n        static setOrder(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ORDER_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n        }\n        static copyOrder(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ORDER_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ORDER_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n        }\n        static getScale(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.SCALE_OFFSET_BYTES;\n            set$3(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true));\n        }\n        static setScale(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.SCALE_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n        }\n        static copyScale(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SCALE_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SCALE_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n            toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n        }\n        static getRotation(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ROTATION_OFFSET_BYTES;\n            set$1(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true), bufferView.getFloat32(offset + 12, true));\n        }\n        static setRotation(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ROTATION_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n            bufferView.setFloat32(offset + 12, value[3], true);\n        }\n        static copyRotation(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ROTATION_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ROTATION_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n            toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n            toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n        }\n        static getTexCoord(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.TEXCOORD_OFFSET_BYTES;\n            set$1(value, bufferView.getFloat32(offset, true), bufferView.getFloat32(offset + 4, true), bufferView.getFloat32(offset + 8, true), bufferView.getFloat32(offset + 12, true));\n        }\n        static setTexCoord(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.TEXCOORD_OFFSET_BYTES;\n            bufferView.setFloat32(offset, value[0], true);\n            bufferView.setFloat32(offset + 4, value[1], true);\n            bufferView.setFloat32(offset + 8, value[2], true);\n            bufferView.setFloat32(offset + 12, value[3], true);\n        }\n        static copyTexCoord(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TEXCOORD_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TEXCOORD_OFFSET_BYTES;\n            toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n            toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n            toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n            toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n        }\n        static getIdColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            set$2(value, bufferView.getUint8(offset) / 0xFF, bufferView.getUint8(offset + 1) / 0xFF, bufferView.getUint8(offset + 2) / 0xFF, bufferView.getUint8(offset + 3) / 0xFF);\n        }\n        static setIdColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.ID_COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n            bufferView.setUint8(offset + 3, value[3] * 0xFF);\n        }\n        static getSelected(bufferView, index) {\n            return bufferView.getInt8(UnitVertex.SIZE_BYTES * index + this.SELECTED_OFFSET_BYTES) / 0x7F;\n        }\n        static setSelected(bufferView, index, value) {\n            bufferView.setInt8(UnitVertex.SIZE_BYTES * index + this.SELECTED_OFFSET_BYTES, value * 0x7F);\n        }\n        static copySelected(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setInt8(UnitVertex.SIZE_BYTES * toIndex + this.SELECTED_OFFSET_BYTES, fromBufferView.getInt8(UnitVertex.SIZE_BYTES * fromIndex + this.SELECTED_OFFSET_BYTES));\n        }\n        static getRounding(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.ROUNDING_OFFSET_BYTES, true);\n        }\n        static setRounding(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.ROUNDING_OFFSET_BYTES, value, true);\n        }\n        static copyRounding(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ROUNDING_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ROUNDING_OFFSET_BYTES, true), true);\n        }\n        static getParameter1(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.PARAMETER_1_OFFSET_BYTES, true);\n        }\n        static setParameter1(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.PARAMETER_1_OFFSET_BYTES, value, true);\n        }\n        static copyParameter1(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_1_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_1_OFFSET_BYTES, true), true);\n        }\n        static getParameter2(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.PARAMETER_2_OFFSET_BYTES, true);\n        }\n        static setParameter2(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.PARAMETER_2_OFFSET_BYTES, value, true);\n        }\n        static copyParameter2(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_2_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_2_OFFSET_BYTES, true), true);\n        }\n        static getMaterial(bufferView, index) {\n            return bufferView.getUint16(UnitVertex.SIZE_BYTES * index + this.MATERIAL_OFFSET_BYTES);\n        }\n        static setMaterial(bufferView, index, value) {\n            bufferView.setUint16(UnitVertex.SIZE_BYTES * index + this.MATERIAL_OFFSET_BYTES, value);\n        }\n        static copyMaterial(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint16(UnitVertex.SIZE_BYTES * toIndex + this.MATERIAL_OFFSET_BYTES, fromBufferView.getUint16(UnitVertex.SIZE_BYTES * fromIndex + this.MATERIAL_OFFSET_BYTES, true), true);\n        }\n        static getTexture(bufferView, index) {\n            return bufferView.getUint8(UnitVertex.SIZE_BYTES * index + this.TEXTURE_OFFSET_BYTES);\n        }\n        static setTexture(bufferView, index, value) {\n            bufferView.setUint8(UnitVertex.SIZE_BYTES * index + this.TEXTURE_OFFSET_BYTES, value);\n        }\n        static copyTexture(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.TEXTURE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.TEXTURE_OFFSET_BYTES));\n        }\n        static getSdfBuffer(bufferView, index) {\n            return bufferView.getUint8(UnitVertex.SIZE_BYTES * index + this.SDF_BUFFER_OFFSET_BYTES);\n        }\n        static setSdfBuffer(bufferView, index, value) {\n            bufferView.setUint8(UnitVertex.SIZE_BYTES * index + this.SDF_BUFFER_OFFSET_BYTES, value);\n        }\n        static copySdfBuffer(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BUFFER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BUFFER_OFFSET_BYTES));\n        }\n        static getSdfBorder(bufferView, index) {\n            return bufferView.getUint8(UnitVertex.SIZE_BYTES * index + this.SDF_BORDER_OFFSET_BYTES);\n        }\n        static setSdfBorder(bufferView, index, value) {\n            bufferView.setUint8(UnitVertex.SIZE_BYTES * index + this.SDF_BORDER_OFFSET_BYTES, value);\n        }\n        static copySdfBorder(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BORDER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BORDER_OFFSET_BYTES));\n        }\n        static getMatId(bufferView, index) {\n            return bufferView.getUint8(UnitVertex.SIZE_BYTES * index + this.MAT_TYPE_OFFSET_BYTES);\n        }\n        static setMatId(bufferView, index, value) {\n            bufferView.setUint8(UnitVertex.SIZE_BYTES * index + this.MAT_TYPE_OFFSET_BYTES, value);\n        }\n        static copyMatId(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_TYPE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_TYPE_OFFSET_BYTES));\n        }\n        static getMatColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_COLOR_OFFSET_BYTES;\n            value[0] = bufferView.getUint16(offset) / 0xFF;\n            value[1] = bufferView.getUint16(offset + 2) / 0xFF;\n            value[2] = bufferView.getUint16(offset + 4) / 0xFF;\n        }\n        static setMatColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_COLOR_OFFSET_BYTES;\n            bufferView.setUint16(offset, value[0] * 0xFF);\n            bufferView.setUint16(offset + 2, value[1] * 0xFF);\n            bufferView.setUint16(offset + 4, value[2] * 0xFF);\n        }\n        static copyMatColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.MAT_COLOR_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.MAT_COLOR_OFFSET_BYTES;\n            toBufferView.setUint16(toOffset, fromBufferView.getUint16(fromOffset));\n            toBufferView.setUint16(toOffset + 2, fromBufferView.getUint16(fromOffset + 2));\n            toBufferView.setUint16(toOffset + 4, fromBufferView.getUint16(fromOffset + 4));\n        }\n        static getMatFuzz(bufferView, index) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_FUZZ_OFFSET_BYTES;\n            return bufferView.getUint8(offset) / 0xFF;\n        }\n        static setMatFuzz(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_FUZZ_OFFSET_BYTES;\n            bufferView.setUint8(offset, value * 0xFF);\n        }\n        static copyMatFuzz(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_FUZZ_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_FUZZ_OFFSET_BYTES));\n        }\n        static getMatGloss(bufferView, index) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_GLOSS_OFFSET_BYTES;\n            return bufferView.getUint8(offset) / 0xFF;\n        }\n        static setMatGloss(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.MAT_GLOSS_OFFSET_BYTES;\n            bufferView.setUint8(offset, value * 0xFF);\n        }\n        static copyMatGloss(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_GLOSS_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_GLOSS_OFFSET_BYTES));\n        }\n        static getMatDensity(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.MAT_DENSITY_OFFSET_BYTES, true);\n        }\n        static setMatDensity(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.MAT_DENSITY_OFFSET_BYTES, value, true);\n        }\n        static copyMatDensity(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_DENSITY_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_DENSITY_OFFSET_BYTES, true), true);\n        }\n        static getMatRefractiveIndex(bufferView, index) {\n            return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true);\n        }\n        static setMatRefractiveIndex(bufferView, index, value) {\n            bufferView.setFloat32(UnitVertex.SIZE_BYTES * index + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, value, true);\n        }\n        static copyMatRefractiveIndex(fromBufferView, fromIndex, toBufferView, toIndex) {\n            toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true), true);\n        }\n        static getSegColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.SEG_COLOR_OFFSET_BYTES;\n            value[0] = bufferView.getUint8(offset) / 0xFF;\n            value[1] = bufferView.getUint8(offset + 1) / 0xFF;\n            value[2] = bufferView.getUint8(offset + 2) / 0xFF;\n            value[3] = bufferView.getUint8(offset + 3) / 0xFF;\n        }\n        static setSegColor(bufferView, index, value) {\n            const offset = UnitVertex.SIZE_BYTES * index + this.SEG_COLOR_OFFSET_BYTES;\n            bufferView.setUint8(offset, value[0] * 0xFF);\n            bufferView.setUint8(offset + 1, value[1] * 0xFF);\n            bufferView.setUint8(offset + 2, value[2] * 0xFF);\n            bufferView.setUint8(offset + 3, value[3] * 0xFF);\n        }\n        static copySegColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n            const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SEG_COLOR_OFFSET_BYTES;\n            const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SEG_COLOR_OFFSET_BYTES;\n            toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n            toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n            toBufferView.setUint8(toOffset + 2, fromBufferView.getUint8(fromOffset + 2));\n            toBufferView.setUint8(toOffset + 3, fromBufferView.getUint8(fromOffset + 3));\n        }\n    }\n    UnitVertex.SIZE_BYTES = 120;\n    UnitVertex.ID_HOVER_OFFSET_BYTES = 0;\n    UnitVertex.ID_COLOR_OFFSET_BYTES = 4;\n    UnitVertex.ORDER_OFFSET_BYTES = 8;\n    UnitVertex.STAGGER_ORDER_OFFSET_BYTES = 12;\n    UnitVertex.SELECTED_OFFSET_BYTES = 80;\n    UnitVertex.TRANSLATION_OFFSET_BYTES = 16;\n    UnitVertex.COLOR_OFFSET_BYTES = 28;\n    UnitVertex.MATERIAL_OFFSET_BYTES = 30;\n    UnitVertex.SCALE_OFFSET_BYTES = 32;\n    UnitVertex.ROUNDING_OFFSET_BYTES = 44;\n    UnitVertex.ROTATION_OFFSET_BYTES = 48;\n    UnitVertex.TEXCOORD_OFFSET_BYTES = 64;\n    UnitVertex.TEXTURE_OFFSET_BYTES = 81;\n    UnitVertex.SDF_BUFFER_OFFSET_BYTES = 82;\n    UnitVertex.SDF_BORDER_OFFSET_BYTES = 83;\n    UnitVertex.PARAMETER_1_OFFSET_BYTES = 84;\n    UnitVertex.PARAMETER_2_OFFSET_BYTES = 88;\n    UnitVertex.MAT_TYPE_OFFSET_BYTES = 92;\n    UnitVertex.MAT_COLOR_OFFSET_BYTES = 112;\n    UnitVertex.MAT_FUZZ_OFFSET_BYTES = 96;\n    UnitVertex.MAT_GLOSS_OFFSET_BYTES = 97;\n    UnitVertex.MAT_DENSITY_OFFSET_BYTES = 100;\n    UnitVertex.MAT_REFRACTIVE_INDEX_OFFSET_BYTES = 104;\n    UnitVertex.SEG_COLOR_OFFSET_BYTES = 108;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ObjMesh {\n    }\n    class ObjHelper {\n        constructor(core) {\n            this._core = core;\n        }\n        read(data) {\n            const start = window.performance.now();\n            const indices = [];\n            const positions = [];\n            const normals = [];\n            const texCoords = [];\n            const meshes = [];\n            const indexOffsets = [];\n            const indexCounts = [];\n            const faceLookup = {};\n            const lines = data.split(\"\\n\");\n            let faceCount = 0;\n            for (let i = 0; i < lines.length; i++) {\n                const parts = lines[i].trim().split(\" \");\n                if (parts.length > 0) {\n                    switch (parts[0]) {\n                        case \"o\":\n                            meshes.push(parts[1]);\n                            indexOffsets.push(indices.length);\n                            break;\n                        case \"v\":\n                            positions.push(parseFloat(parts[1]));\n                            positions.push(parseFloat(parts[2]));\n                            positions.push(parseFloat(parts[3]));\n                            break;\n                        case \"vt\":\n                            texCoords.push(parseFloat(parts[1]));\n                            texCoords.push(parseFloat(parts[2]));\n                            break;\n                        case \"vn\":\n                            normals.push(parseFloat(parts[1]));\n                            normals.push(parseFloat(parts[2]));\n                            normals.push(parseFloat(parts[3]));\n                            break;\n                        case \"f\":\n                            for (let i = 0; i < parts.length - 1; i++) {\n                                const part = parts[i + 1];\n                                if (faceLookup[part] == undefined) {\n                                    faceLookup[part] = faceCount++;\n                                }\n                                indices.push(faceLookup[part]);\n                            }\n                            break;\n                    }\n                }\n            }\n            for (let i = 0; i < meshes.length - 1; i++) {\n                indexCounts.push(indexOffsets[i + 1] - indexOffsets[i]);\n            }\n            indexCounts.push(indices.length - indexOffsets[meshes.length - 1]);\n            const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * Object.keys(faceLookup).length);\n            const dataView = new DataView(vertices);\n            let minX = Number.MAX_VALUE;\n            let minY = Number.MAX_VALUE;\n            let minZ = Number.MAX_VALUE;\n            let maxX = -Number.MAX_VALUE;\n            let maxY = -Number.MAX_VALUE;\n            let maxZ = -Number.MAX_VALUE;\n            const faces = Object.keys(faceLookup);\n            const _vec2 = create();\n            const _vec3 = create$3();\n            let hasTexCoords, hasNormals;\n            if (faces.length > 0) {\n                const faceParts = faces[0].split(\"/\");\n                hasTexCoords = faceParts.length > 1 && !isNaN(parseInt(faceParts[1]));\n                hasNormals = faceParts.length > 2 && !isNaN(parseInt(faceParts[2]));\n            }\n            for (let i = 0; i < faces.length; i++) {\n                const faceParts = faces[i].split(\"/\");\n                let index = (parseInt(faceParts[0]) - 1) * 3;\n                const x = positions[index];\n                const y = positions[index + 1];\n                const z = positions[index + 2];\n                set$3(_vec3, x, y, z);\n                PositionNormalTextureVertex.setPosition(dataView, i, _vec3);\n                minX = Math.min(x, minX);\n                minY = Math.min(y, minY);\n                minZ = Math.min(z, minZ);\n                maxX = Math.max(x, maxX);\n                maxY = Math.max(y, maxY);\n                maxZ = Math.max(z, maxZ);\n                if (hasNormals) {\n                    index = (parseInt(faceParts[2]) - 1) * 3;\n                    set$3(_vec3, normals[index], normals[index + 1], normals[index + 2]);\n                    PositionNormalTextureVertex.setNormal(dataView, i, _vec3);\n                }\n                if (hasTexCoords) {\n                    index = (parseInt(faceParts[1]) - 1) * 2;\n                    set(_vec2, texCoords[index], texCoords[index + 1]);\n                    PositionNormalTextureVertex.setTexCoord(dataView, i, _vec2);\n                }\n            }\n            const originX = (minX + maxX) / 2;\n            const originY = (minY + maxY) / 2;\n            const originZ = (minZ + maxZ) / 2;\n            const objMesh = new ObjMesh();\n            objMesh.vertices = vertices;\n            objMesh.indices = new Uint16Array(indices);\n            objMesh.meshes = meshes;\n            objMesh.indexOffsets = indexOffsets;\n            objMesh.indexCounts = indexCounts;\n            objMesh.indexCount = indices.length;\n            objMesh.minX = minX;\n            objMesh.minY = minY;\n            objMesh.minZ = minZ;\n            objMesh.maxX = maxX;\n            objMesh.maxY = maxY;\n            objMesh.maxZ = maxZ;\n            objMesh.originX = originX;\n            objMesh.originY = originY;\n            objMesh.originZ = originZ;\n            this._core.log.write(LogLevel.info, `obj loaded ${Math.round(window.performance.now() - start)}ms`);\n            return objMesh;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cube {\n    }\n    Cube.POSITIONS = new Float32Array([\n        -0.5, 0.5, 0.5,\n        0.5, 0.5, 0.5,\n        0.5, -0.5, 0.5,\n        -0.5, -0.5, 0.5,\n        -0.5, 0.5, -0.5,\n        0.5, 0.5, -0.5,\n        0.5, -0.5, -0.5,\n        -0.5, -0.5, -0.5\n    ]);\n    Cube.INDICES = new Uint16Array([5, 4, 1, 0, 3, 4, 7, 5, 6, 1, 2, 3, 6, 7]);\n    Cube.CUBE_MAP_INDICES = new Uint16Array([2, 3, 1, 0, 4, 3, 7, 2, 6, 1, 5, 4, 6, 7]);\n    Cube.FACE_NORMALS = [\n        fromValues$3(0, 1, 0),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, -1, 0),\n        fromValues$3(-1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 0, -1)\n    ];\n    Cube.FACE_POSITIONS = [\n        fromValues$3(0.0, 0.5, 0.0),\n        fromValues$3(0.5, 0.0, 0.0),\n        fromValues$3(0.0, -0.5, 0.0),\n        fromValues$3(-0.5, 0.0, 0.0),\n        fromValues$3(0.0, 0.0, 0.5),\n        fromValues$3(0.0, 0.0, -0.5)\n    ];\n    Cube.FACE_ROTATIONS = [\n        fromValues$5(1, 0, 0, 0, 0, -1, 0, 1, 0),\n        fromValues$5(0, 0, -1, 0, 1, 0, 1, 0, 0),\n        fromValues$5(1, 0, 0, 0, 0, 1, 0, -1, 0),\n        fromValues$5(0, 0, 1, 0, 1, 0, -1, 0, 0),\n        fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n        fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n    ];\n    Cube.EDGE_POSITIONS = [\n        fromValues$3(0, 0.5, 0.5),\n        fromValues$3(0.5, 0.5, 0),\n        fromValues$3(0, 0.5, -0.5),\n        fromValues$3(-0.5, 0.5, 0),\n        fromValues$3(0, -0.5, 0.5),\n        fromValues$3(0.5, -0.5, 0),\n        fromValues$3(0, -0.5, -0.5),\n        fromValues$3(-0.5, -0.5, 0),\n        fromValues$3(0.5, 0, 0.5),\n        fromValues$3(0.5, 0, -0.5),\n        fromValues$3(-0.5, 0, -0.5),\n        fromValues$3(-0.5, 0, 0.5)\n    ];\n    Cube.EDGE_NORMALS = [\n        fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO)\n    ];\n    Cube.EDGE_CORNERS = [\n        [0, 1],\n        [1, 5],\n        [4, 5],\n        [0, 4],\n        [2, 3],\n        [2, 6],\n        [6, 7],\n        [3, 7],\n        [1, 2],\n        [5, 6],\n        [4, 7],\n        [0, 3]\n    ];\n    Cube.EDGE_FACES = [\n        [0, 4],\n        [0, 1],\n        [0, 5],\n        [0, 3],\n        [2, 4],\n        [2, 1],\n        [2, 5],\n        [2, 3],\n        [1, 4],\n        [1, 5],\n        [3, 5],\n        [3, 4]\n    ];\n    Cube.EDGE_AXIS = [\n        0,\n        2,\n        0,\n        2,\n        0,\n        2,\n        0,\n        2,\n        1,\n        1,\n        1,\n        1\n    ];\n    Cube.AXIS_EDGES = [\n        [0, 2, 4, 6],\n        [8, 9, 10, 11],\n        [1, 3, 5, 7]\n    ];\n    Cube.AXIS_FACES = [\n        [1, 3],\n        [0, 2],\n        [4, 5]\n    ];\n    Cube.OPPOSITE_FACES = [\n        2,\n        3,\n        0,\n        1,\n        5,\n        4\n    ];\n    Cube.EDGE_POSITIVES = [\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 1, 0),\n        fromValues$3(0, 1, 0),\n        fromValues$3(0, 1, 0),\n        fromValues$3(0, 1, 0)\n    ];\n    Cube.EDGE_FORWARDS = [\n        fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n        fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO)\n    ];\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let ControllerVisual$1 = class ControllerVisual {\n        render(elapsedTime, xrFrame) { }\n        update(elapsedTime) { }\n        constructor(controller) {\n            this.controller = controller;\n        }\n    };\n    class Controller {\n        get isInitialized() { return this._isInitialized; }\n        get mMatrix() { return this._mMatrix; }\n        get indexCount() { return this._indexCount; }\n        get vertices() { return this._vertices; }\n        get indices() { return this._indices; }\n        get texture() { return this._texture; }\n        get rayMMatrix() { return this._rayMMatrix; }\n        get rayIndexCount() { return this._rayIndexCount; }\n        get rayVertices() { return this._rayVertices; }\n        get rayIndices() { return this._rayIndices; }\n        constructor(core, options) {\n            this._cubeObj = `o Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 -1.000000\nv 1.000000 1.000000 -0.999999\nv 0.999999 1.000000 1.000001\nv -1.000000 1.000000 1.000000\nv -1.000000 1.000000 -1.000000\nvt 1.000000 0.333333\nvt 1.000000 0.666667\nvt 0.666667 0.666667\nvt 0.666667 0.333333\nvt 0.666667 0.000000\nvt 0.000000 0.333333\nvt 0.000000 0.000000\nvt 0.333333 0.000000\nvt 0.333333 1.000000\nvt 0.000000 1.000000\nvt 0.000000 0.666667\nvt 0.333333 0.333333\nvt 0.333333 0.666667\nvt 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.000000 0.000000 1.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\ns off\nf 2/1/1 3/2/1 4/3/1\nf 8/1/2 7/4/2 6/5/2\nf 5/6/3 6/7/3 2/8/3\nf 6/8/4 7/5/4 3/4/4\nf 3/9/5 7/10/5 8/11/5\nf 1/12/6 4/13/6 8/11/6\nf 1/4/1 2/1/1 4/3/1\nf 5/14/2 8/1/2 6/5/2\nf 1/12/3 5/6/3 2/8/3\nf 2/12/4 6/8/4 3/4/4\nf 4/13/5 3/9/5 8/11/5\nf 5/6/6 1/12/6 8/11/6`;\n            this._core = core;\n            this._obj = options.obj;\n            this._texture = options.texture || new ImageData(new Uint8ClampedArray([0, 0, 0, 255]), 1, 1);\n        }\n        initialize() {\n            const _vec3 = create$3();\n            this._mMatrix = create$4();\n            const objMesh = new ObjHelper(this._core).read(this._obj || this._cubeObj);\n            if (!this._obj) {\n                this.useRayPose = true;\n                const modelThickness = 0.02;\n                const modelLength = 0.1;\n                set$3(_vec3, modelThickness, modelThickness, modelLength);\n                fromScaling(this._mMatrix, _vec3);\n                set$3(_vec3, 0, 0, 1);\n                translate(this._mMatrix, this._mMatrix, _vec3);\n            }\n            this._vertices = objMesh.vertices;\n            this._indices = objMesh.indices;\n            this._indexCount = objMesh.indexCount;\n            this._rayMMatrix = create$4();\n            const rayVertices = Cube.POSITIONS;\n            this._rayVertices = new ArrayBuffer(PositionColorVertex.SIZE_BYTES * rayVertices.length / PositionVertex.SIZE);\n            const rayVerticesView = new DataView(this._rayVertices);\n            const rayIndices = Cube.INDICES;\n            this._rayIndices = new Uint16Array(rayIndices);\n            const rayVertexCount = rayVertices.length / PositionVertex.SIZE;\n            this._rayIndexCount = rayIndices.length;\n            for (let i = 0; i < rayVertexCount; i++) {\n                set$3(_vec3, rayVertices[i * PositionVertex.SIZE], rayVertices[i * PositionVertex.SIZE + 1], rayVertices[i * PositionVertex.SIZE + 2]);\n                PositionColorVertex.setPosition(rayVerticesView, i, _vec3);\n                PositionColorVertex.setColor(rayVerticesView, i, this._core.config.xrControllerRayColor);\n            }\n            const rayThickness = 0.0025;\n            const rayLength = 10;\n            set$3(_vec3, rayThickness, rayThickness, rayLength);\n            fromScaling(this._rayMMatrix, _vec3);\n            set$3(_vec3, 0, 0, -0.5);\n            translate(this._rayMMatrix, this._rayMMatrix, _vec3);\n            this._isInitialized = true;\n            this._core.log.write(LogLevel.info, \"controller initialized\");\n        }\n        update(elapsedTime) { }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class MatrixHelper {\n        static fieldOfViewFromProjectionMatrix(p) {\n            return 2 * Math.atan(1 / p[5]);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AxesVisual {\n        render(elapsedTime, xrFrame) { }\n        update(elapsedTime) { }\n        constructor(axes) {\n            this.axes = axes;\n        }\n    }\n    class AxesBase {\n        get isInitialized() { return this._isInitialized; }\n        set vMatrix(value) { this._vMatrix = value; }\n        pickGrid(id) {\n            const offset = id * 3;\n            return {\n                divisionX: this._pickGrid[offset] - 1,\n                divisionY: this._pickGrid[offset + 1] - 1,\n                divisionZ: this._pickGrid[offset + 2] - 1,\n            };\n        }\n        pickTitle(id) {\n            return { axis: this._pickTitle[id], };\n        }\n        pickLabel(id) {\n            const offset = id * 2;\n            return {\n                axis: this._pickLabel[offset],\n                label: this._pickLabel[offset + 1],\n            };\n        }\n        pickHeading(id) {\n            return { axis: this._pickHeading[id], };\n        }\n        getFromValues(index) { return this._fromValues[index]; }\n        setFromValues(index, value) {\n            if (this._fromValues[index] != value) {\n                this._fromValues[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getToValues(index) { return this._toValues[index]; }\n        setToValues(index, value) {\n            if (this._toValues[index] != value) {\n                this._toValues[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        get font() { return this._font; }\n        set font(value) {\n            if (this._font != value) {\n                this._font = value;\n                this._hasChanged = true;\n            }\n        }\n        get gridPickDivisionHeight() { return this._gridPickDivisionHeight; }\n        set gridPickDivisionHeight(value) {\n            if (this._gridPickDivisionHeight != value) {\n                this._gridPickDivisionHeight = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core) {\n            this._core = core;\n            this._mMatrix = create$4();\n            this._mvMatrix = create$4();\n            this._textMetric = { maxTop: 0, width: 0, maxHeight: 0 };\n            this._gridPickDivisionHeight = core.config.axesGridPickDivisionHeight;\n            this.textBorderWidth = core.config.textBorderWidth;\n            this.gamma = 0;\n            this.gridMajorThickness = core.config.axesGridMajorThickness;\n            this.gridMinorThickness = core.config.axesGridMinorThickness;\n            this.gridZeroThickness = core.config.axesGridZeroThickness;\n            this._font = core.font;\n            this.isGridPickingEnabled = false;\n        }\n        update(elapsedTime) { }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Quad$2 = class Quad {\n        static positions(transform) {\n            const positions = new Float32Array(12);\n            const position = create$3();\n            for (let i = 0; i < 4; i++) {\n                set$3(position, this.POSITIONS[i * 3], this.POSITIONS[i * 3 + 1], this.POSITIONS[i * 3 + 2]);\n                transformMat4$2(position, position, transform);\n                positions[i * 3] = position[0];\n                positions[i * 3 + 1] = position[1];\n                positions[i * 3 + 2] = position[2];\n            }\n            return positions;\n        }\n        static textured(transform, texTransform = Constants.MAT4_IDENTITY) {\n            const positions = this.positions(transform);\n            const texCoords = this.TEX_COORDS;\n            const vertices = new ArrayBuffer(PositionTextureVertex.SIZE_BYTES * positions.length / 3);\n            const verticesView = new DataView(vertices);\n            const position = create$3();\n            const texCoord = create();\n            for (let i = 0; i < positions.length / PositionVertex.SIZE; i++) {\n                set$3(position, positions[i * PositionVertex.SIZE], positions[i * PositionVertex.SIZE + 1], positions[i * PositionVertex.SIZE + 2]);\n                set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n                transformMat4(texCoord, texCoord, texTransform);\n                PositionTextureVertex.setPosition(verticesView, i, position);\n                PositionTextureVertex.setTexCoord(verticesView, i, texCoord);\n            }\n            return verticesView;\n        }\n        static normalTextured(transform, texTransform = Constants.MAT4_IDENTITY) {\n            const positions = this.positions(transform);\n            const texCoords = this.TEX_COORDS;\n            const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * positions.length / 3);\n            const verticesView = new DataView(vertices);\n            const position = create$3();\n            const texCoord = create();\n            const normal3 = create$3();\n            const normal4 = create$2();\n            for (let i = 0; i < positions.length / PositionVertex.SIZE; i++) {\n                set$3(position, positions[i * PositionVertex.SIZE], positions[i * PositionVertex.SIZE + 1], positions[i * PositionVertex.SIZE + 2]);\n                set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n                transformMat4(texCoord, texCoord, texTransform);\n                PositionNormalTextureVertex.setPosition(verticesView, i, position);\n                set$2(normal4, 0.0, 0.0, 1.0, 0.0);\n                transformMat4$1(normal4, normal4, transform);\n                set$3(normal3, normal4[0], normal4[1], normal4[2]);\n                normalize$2(normal3, normal3);\n                PositionNormalTextureVertex.setNormal(verticesView, i, normal3);\n                PositionNormalTextureVertex.setTexCoord(verticesView, i, texCoord);\n            }\n            return verticesView;\n        }\n    };\n    Quad$2.FACE_NORMALS = [\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 0, -1)\n    ];\n    Quad$2.FACE_ROTATIONS = [\n        fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n        fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n    ];\n    Quad$2.EDGE_POSITIONS = [\n        fromValues$3(0, 0.5, 0),\n        fromValues$3(0.5, 0, 0),\n        fromValues$3(0, -0.5, 0),\n        fromValues$3(-0.5, 0, 0)\n    ];\n    Quad$2.EDGE_NORMALS = [\n        fromValues$3(0, 1, 0),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, -1, 0),\n        fromValues$3(-1, 0, 0)\n    ];\n    Quad$2.EDGE_POSITIVES = [\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 1, 0),\n        fromValues$3(1, 0, 0),\n        fromValues$3(0, 1, 0)\n    ];\n    Quad$2.EDGE_FORWARDS = [\n        fromValues$3(0, 0, -1),\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 0, 1),\n        fromValues$3(0, 0, -1)\n    ];\n    Quad$2.AXIS_EDGES = [\n        [0, 2],\n        [1, 3]\n    ];\n    Quad$2.POSITIONS = new Float32Array([\n        -0.5, 0.5, 0,\n        0.5, 0.5, 0,\n        -0.5, -0.5, 0,\n        0.5, -0.5, 0\n    ]);\n    Quad$2.INDICES = new Uint16Array([0, 2, 1, 1, 2, 3]);\n    Quad$2.TEX_COORDS = new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]);\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class TextHelper {\n        static truncate(text, length) {\n            return text.length > length ? `${text.substr(0, length - 1)}…` : text;\n        }\n        static measure(font, text, size) {\n            size.width = 0;\n            let maxDescent = 0;\n            for (const char of text) {\n                let glyph = font.glyphs[char];\n                if (!glyph) {\n                    font.addGlyph(char);\n                    glyph = font.glyphs[char];\n                }\n                size.width += glyph.advance;\n                size.maxTop = Math.max(glyph.top, size.maxTop);\n                maxDescent = Math.max(glyph.height - glyph.top, maxDescent);\n            }\n            size.maxHeight = size.maxTop + maxDescent;\n        }\n        static wrap(font, text, maxWidth) {\n            const lines = [];\n            let width = 0;\n            let start = 0;\n            let lastBreakingChar = -1;\n            let widthAfterLastBreakingChar = 0;\n            for (let i = 0; i < text.length; i++) {\n                let char = text.charAt(i);\n                let glyph = font.glyphs[char];\n                if (!glyph) {\n                    font.addGlyph(char);\n                    glyph = font.glyphs[char];\n                }\n                width += glyph.advance;\n                if (char == \" \" || char == \"-\") {\n                    widthAfterLastBreakingChar = width;\n                    lastBreakingChar = i;\n                }\n                if (width > maxWidth) {\n                    if (lastBreakingChar == -1) {\n                        lines.push(text.substring(start, i));\n                        start = i;\n                        width += glyph.advance;\n                    }\n                    else {\n                        lines.push(text.substring(start, lastBreakingChar));\n                        start = lastBreakingChar + 1;\n                        width -= widthAfterLastBreakingChar;\n                        widthAfterLastBreakingChar = 0;\n                        lastBreakingChar = -1;\n                    }\n                }\n            }\n            lines.push(text.substring(start, text.length));\n            return lines;\n        }\n        static addString(font, text, vertices, indices, index, position, scale, offset, rotation, idColor) {\n            for (const char of text) {\n                this.addGlyph(font, char, vertices, indices, index++, position, scale, offset, rotation, idColor);\n            }\n        }\n        static addGlyph(font, char, vertices, indices, index, position, scale, offset, rotation, idColor) {\n            let glyph = font.glyphs[char];\n            if (!glyph) {\n                font.addGlyph(char);\n                glyph = font.glyphs[char];\n            }\n            const vertexOffset = index * 4;\n            const width = glyph.width * scale;\n            const height = glyph.height * scale;\n            const top = glyph.top * scale;\n            const border = font.border * scale;\n            const x0 = offset[0] - border;\n            const x1 = offset[0] + width + border;\n            const y0 = offset[1] + top + border;\n            const y1 = offset[1] + top - height - border;\n            const z0 = offset[2];\n            set$3(this._topLeft, x0, y0, z0);\n            set$3(this._topRight, x1, y0, z0);\n            set$3(this._bottomLeft, x0, y1, z0);\n            set$3(this._bottomRight, x1, y1, z0);\n            if (rotation) {\n                transformQuat(this._topLeft, this._topLeft, rotation);\n                transformQuat(this._topRight, this._topRight, rotation);\n                transformQuat(this._bottomLeft, this._bottomLeft, rotation);\n                transformQuat(this._bottomRight, this._bottomRight, rotation);\n            }\n            add(this._vec3, this._topLeft, position);\n            PositionTexturePickVertex.setPosition(vertices, vertexOffset, this._vec3);\n            add(this._vec3, this._topRight, position);\n            PositionTexturePickVertex.setPosition(vertices, vertexOffset + 1, this._vec3);\n            add(this._vec3, this._bottomLeft, position);\n            PositionTexturePickVertex.setPosition(vertices, vertexOffset + 2, this._vec3);\n            add(this._vec3, this._bottomRight, position);\n            PositionTexturePickVertex.setPosition(vertices, vertexOffset + 3, this._vec3);\n            set(this._vec2, glyph.u0, glyph.v0);\n            PositionTexturePickVertex.setTexCoord(vertices, vertexOffset, this._vec2);\n            set(this._vec2, glyph.u1, glyph.v0);\n            PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 1, this._vec2);\n            set(this._vec2, glyph.u0, glyph.v1);\n            PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 2, this._vec2);\n            set(this._vec2, glyph.u1, glyph.v1);\n            PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 3, this._vec2);\n            PositionTexturePickVertex.setIdColor(vertices, vertexOffset, idColor);\n            PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 1, idColor);\n            PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 2, idColor);\n            PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 3, idColor);\n            offset[0] += glyph.advance * scale;\n            const indexTemplate = Quad$2.INDICES;\n            const indexOffset = index * 6;\n            for (let i = 0; i < 6; i++) {\n                indices[indexOffset + i] = indexTemplate[i] + vertexOffset;\n            }\n        }\n    }\n    TextHelper._vec2 = create();\n    TextHelper._vec3 = create$3();\n    TextHelper._topLeft = create$3();\n    TextHelper._topRight = create$3();\n    TextHelper._bottomLeft = create$3();\n    TextHelper._bottomRight = create$3();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class PickHelper {\n        static nextPickId() { return this._pickId++; }\n        static encodeNumber(number, type, color) {\n            const encoded = number | PickHelper.encodeType(type);\n            PickHelper.float32ToVec4(encoded, color);\n        }\n        static decodeNumber(color) {\n            return color[0] + (color[1] << 8) + (color[2] << 16);\n        }\n        static encodeVec3(vec3, type, color) {\n            const encoded = vec3[0] | (vec3[1] << 8) | (vec3[2] << 16) | PickHelper.encodeType(type);\n            PickHelper.float32ToVec4(encoded, color);\n        }\n        static decodeVec3(color, axes) {\n            axes[0] = color[0];\n            axes[1] = color[1];\n            axes[2] = color[2];\n        }\n        static encodeType(type) {\n            return type << 24;\n        }\n        static decodeType(color) {\n            return color[3];\n        }\n        static float32ToVec4(number, color) {\n            color[0] = ((number & 0xFF) >>> 0) / 0xFF;\n            color[1] = ((number & 0xFF00) >>> 8) / 0xFF;\n            color[2] = ((number & 0xFF0000) >>> 16) / 0xFF;\n            color[3] = ((number & 0xFF000000) >>> 24) / 0xFF;\n        }\n        static uint8ArrayToNumber(color) {\n            return color[0] + (color[1] << 8) + (color[2] << 16) + (color[3] << 24);\n        }\n    }\n    PickHelper._pickId = 1;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cartesian3dAxes extends AxesBase {\n        get size() { return this._size; }\n        get isDiscreteX() { return this._isDiscrete[0]; }\n        set isDiscreteX(value) {\n            if (value != this._isDiscrete[0]) {\n                this._isDiscrete[0] = value;\n                this._hasChanged = true;\n            }\n        }\n        get isDiscreteY() { return this._isDiscrete[1]; }\n        set isDiscreteY(value) {\n            if (value != this._isDiscrete[1]) {\n                this._isDiscrete[1] = value;\n                this._hasChanged = true;\n            }\n        }\n        get isDiscreteZ() { return this._isDiscrete[2]; }\n        set isDiscreteZ(value) {\n            if (value != this._isDiscrete[2]) {\n                this._isDiscrete[2] = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsX() { return this._minBoundsX; }\n        set minBoundsX(value) {\n            if (value != this._minBoundsX) {\n                this._minBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsX() { return this._maxBoundsX; }\n        set maxBoundsX(value) {\n            if (value != this._minBoundsX) {\n                this._maxBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsY() { return this._minBoundsY; }\n        set minBoundsY(value) {\n            if (value != this._minBoundsY) {\n                this._minBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsY() { return this._maxBoundsY; }\n        set maxBoundsY(value) {\n            if (value != this._minBoundsY) {\n                this._maxBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsZ() { return this._minBoundsZ; }\n        set minBoundsZ(value) {\n            if (value != this._minBoundsZ) {\n                this._minBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsZ() { return this._maxBoundsZ; }\n        set maxBoundsZ(value) {\n            if (value != this._minBoundsZ) {\n                this._maxBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        getIsOutsideEdge(index) { return this._isOutsideEdge[index]; }\n        getIsForwardFace(index) { return this._isForwardFace[index]; }\n        get textVertices() { return this._textVertices; }\n        get textIndices() { return this._textIndices; }\n        getLabelMMatrix(index) { return this._labelMMatrices[index]; }\n        setLabelPositions(index, value) {\n            if (this._labelPositions[index] != value) {\n                this._labelPositions[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setLabels(index, value) {\n            if (this._labels[index] != value) {\n                this._labels[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setLabelSizes(index, value) {\n            if (this._labelSizes[index] != value) {\n                this._labelSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getLabelOrientation(index) { return this._orientations[index]; }\n        setLabelOrientation(index, orientation) {\n            if (this._orientations[index] != orientation) {\n                this._orientations[index] = orientation;\n                this._hasChanged = true;\n            }\n        }\n        getTitleIndexCount(index) { return this._titleIndexCounts[index]; }\n        getTitleIndexOffset(index) { return this._titleIndexOffsets[index]; }\n        getTitleMMatrix(index) { return this._titleMMatrices[index]; }\n        setTitle(index, value) {\n            if (this._titles[index] != value) {\n                this._titles[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setTitleSize(index, value) {\n            if (this._titleSizes[index] != value) {\n                this._titleSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getHeadingIndexCount(index) { return this._headingIndexCounts[index]; }\n        getHeadingIndexOffset(index) { return this._headingIndexOffsets[index]; }\n        getHeadingMMatrix(index) { return this._headingMMatrices[index]; }\n        setHeading(index, value) {\n            if (this._headings[index] != value) {\n                this._headings[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setHeadingSize(index, value) {\n            if (this._headingSizes[index] != value) {\n                this._headingSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getIsLeftToRightHorizontal(index) { return this._isLeftToRightHorizontal[index]; }\n        getIsLeftToRightVertical(index) { return this._isLeftToRightVertical[index]; }\n        getAxesLeftToRightIndexCount(index) { return this._axesLeftToRightIndexCounts[index]; }\n        getAxesRightToLeftIndexCount(index) { return this._axesRightToLeftIndexCounts[index]; }\n        getAxesLeftToRightIndexOffset(index) { return this._axesLeftToRightIndexOffsets[index]; }\n        getAxesRightToLeftIndexOffset(index) { return this._axesRightToLeftIndexOffsets[index]; }\n        get gridVertices() { return this._gridVertices; }\n        get gridIndices() { return this._gridIndices; }\n        getGridTicksIndexCount(index) { return this._gridTicksIndexCounts[index]; }\n        getGridTicksIndexOffset(index) { return this._gridTicksIndexOffsets[index]; }\n        getGridFaceIndexCount(index) { return this._gridFaceIndexCounts[index]; }\n        getGridFaceIndexOffset(index) { return this._gridFaceIndexOffsets[index]; }\n        getGridTicksMMatrix(index) { return this._gridTicksMMatrices[index]; }\n        getGridFaceMMatrix(index) { return this._gridFaceMMatrices[index]; }\n        getGridTicksScale(index) { return this._gridTicksScales[index]; }\n        getGridFaceZero(index) { return this._gridFaceZeros[index]; }\n        getGridTicksZero(index) { return this._gridTicksZeros[index]; }\n        getGridFaceMinorGridlines(index) { return this._gridFaceMinorGridlines[index]; }\n        getGridTicksMinorGridlines(index) { return this._gridTicksMinorGridlines[index]; }\n        setTickPositions(index, value) {\n            if (this._gridTicksPositions[index] != value) {\n                this._gridTicksPositions[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingX() { return this._scalingX; }\n        set scalingX(value) {\n            if (value != this._scalingX) {\n                this._scalingX = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingY() { return this._scalingY; }\n        set scalingY(value) {\n            if (value != this._scalingY) {\n                this._scalingY = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingZ() { return this._scalingZ; }\n        set scalingZ(value) {\n            if (value != this._scalingZ) {\n                this._scalingZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetX() { return this._offset[12]; }\n        set offsetX(value) {\n            if (value != this._offset[12]) {\n                this._offset[12] = value;\n            }\n        }\n        get offsetY() { return this._offset[13]; }\n        set offsetY(value) {\n            if (value != this._offset[13]) {\n                this._offset[13] = value;\n            }\n        }\n        get offsetZ() { return this._offset[14]; }\n        set offsetZ(value) {\n            if (value != this._offset[14]) {\n                this._offset[14] = value;\n            }\n        }\n        constructor(core) {\n            super(core);\n            this._size = create$3();\n            this._translation = create$3();\n            this._normal = create$3();\n            this._forward = create$3();\n            this._right = create$3();\n            this._up = create$3();\n            this._texCoord = create();\n            this._bounds = create$2();\n            this._vec3 = create$3();\n            this._vec4 = create$2();\n            this._mat3 = create$5();\n            this._isDiscrete = [false, false, false];\n            this._minBoundsX = 0;\n            this._minBoundsY = 0;\n            this._minBoundsZ = 0;\n            this._maxBoundsX = 0;\n            this._maxBoundsY = 0;\n            this._maxBoundsZ = 0;\n            this._isForwardFace = [];\n            this._isForwardEdge = [];\n            this._isOutsideEdge = [];\n            for (let i = 0; i < 6; i++) {\n                this._isForwardFace.push(false);\n            }\n            for (let i = 0; i < 12; i++) {\n                this._isForwardEdge.push(false);\n                this._isOutsideEdge.push(false);\n            }\n            this._textOffset = create$3();\n            this._textPosition = create$3();\n            this._distances = [];\n            for (let i = 0; i < 12; i++) {\n                this._distances.push(0);\n            }\n            this._labelPositions = [];\n            this._labels = [];\n            this._labelSizes = [];\n            this._maxLabelSize = [];\n            this._axesLeftToRightIndexCounts = [];\n            this._axesRightToLeftIndexCounts = [];\n            this._axesLeftToRightIndexOffsets = [];\n            this._axesRightToLeftIndexOffsets = [];\n            this._labelMMatrices = [];\n            this._orientations = [];\n            for (let i = 0; i < 3; i++) {\n                this._maxLabelSize.push(create());\n                this._orientations.push(AxesTextOrientation.parallel);\n                this._axesLeftToRightIndexCounts.push(0);\n                this._axesRightToLeftIndexCounts.push(0);\n                this._axesLeftToRightIndexOffsets.push(0);\n                this._axesRightToLeftIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 12; i++) {\n                this._labelMMatrices.push(create$4());\n            }\n            this._titles = [];\n            this._titleSizes = [];\n            this._titleIndexCounts = [];\n            this._titleIndexOffsets = [];\n            this._titleMMatrices = [];\n            for (let i = 0; i < 3; i++) {\n                this._titles.push(null);\n                this._titleSizes.push(core.config.axesTextTitleSize);\n                this._titleIndexCounts.push(0);\n                this._titleIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 12; i++) {\n                this._titleMMatrices.push(create$4());\n            }\n            this._headings = [];\n            this._headingSizes = [];\n            this._headingIndexCounts = [];\n            this._headingIndexOffsets = [];\n            this._headingMMatrices = [];\n            this.isHeadingVisible = [];\n            for (let i = 0; i < 3; i++) {\n                this._headings.push(null);\n                this._headingSizes.push(core.config.axesTextHeadingSize);\n                this._headingIndexCounts.push(0);\n                this._headingIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 12; i++) {\n                this._headingMMatrices.push(create$4());\n                this.isHeadingVisible.push(true);\n            }\n            this.isEdgeVisible = [];\n            this._edgePosition = create$3();\n            this._edgePositive = create$3();\n            this._edgeNormal = create$3();\n            this._edgeNormalTemp = create$3();\n            this._edgePositiveTemp = create$3();\n            this._isLeftToRightHorizontal = [];\n            this._isLeftToRightVertical = [];\n            this._edgeHorizontalRight = [];\n            this._edgeHorizontalUp = [];\n            this._edgeHorizontalForward = [];\n            this._edgeVerticalRight = [];\n            this._edgeVerticalUp = [];\n            this._edgeVerticalForward = [];\n            for (let i = 0; i < 12; i++) {\n                this.isEdgeVisible.push(true);\n                this._isLeftToRightHorizontal.push(false);\n                this._isLeftToRightVertical.push(false);\n                this._edgeHorizontalRight.push(create$3());\n                this._edgeHorizontalUp.push(create$3());\n                this._edgeHorizontalForward.push(create$3());\n                this._edgeVerticalRight.push(create$3());\n                this._edgeVerticalUp.push(create$3());\n                this._edgeVerticalForward.push(create$3());\n            }\n            this.isFaceVisible = [];\n            for (let i = 0; i < 6; i++) {\n                this.isFaceVisible.push(true);\n            }\n            this.arePickDivisionsVisible = [];\n            this.areFacesVisible = [];\n            this._indexTemplate = Quad$2.INDICES;\n            this.zero = create$3();\n            this._gridTicksZeros = [];\n            this._gridFaceZeros = [];\n            this.minorGridlines = fromValues$3(1, 1, 1);\n            this._gridTicksMinorGridlines = [];\n            this._gridFaceMinorGridlines = [];\n            this._gridTicksPositions = [];\n            this._gridTicksScales = [];\n            this._gridTicksIndexCounts = [];\n            this._gridTicksIndexOffsets = [];\n            this._gridFaceScale = create$3();\n            this._gridFaceIndexCounts = [];\n            this._gridFaceIndexOffsets = [];\n            this._gridFaceMMatrices = [];\n            this._gridTicksMMatrices = [];\n            this._gridTicksRotations = [];\n            for (let i = 0; i < 3; i++) {\n                this.arePickDivisionsVisible.push(true);\n                this.areFacesVisible.push(true);\n                this._gridTicksZeros.push(create());\n                this._gridFaceZeros.push(create());\n                this._gridTicksMinorGridlines.push(create());\n                this._gridFaceMinorGridlines.push(create());\n                this._gridTicksScales.push(create$3());\n                this._gridTicksIndexCounts.push(0);\n                this._gridTicksIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 6; i++) {\n                this._gridFaceIndexCounts.push(0);\n                this._gridFaceIndexOffsets.push(0);\n                this._gridFaceMMatrices.push(create$4());\n            }\n            for (let i = 0; i < 12; i++) {\n                this._gridTicksMMatrices.push(create$4());\n                this._gridTicksRotations.push(create$4());\n                const _mat4 = this._gridTicksRotations[i];\n                _mat4[0] = Cube.EDGE_POSITIVES[i][0];\n                _mat4[1] = Cube.EDGE_POSITIVES[i][1];\n                _mat4[2] = Cube.EDGE_POSITIVES[i][2];\n                _mat4[4] = Cube.EDGE_NORMALS[i][0];\n                _mat4[5] = Cube.EDGE_NORMALS[i][1];\n                _mat4[6] = Cube.EDGE_NORMALS[i][2];\n                cross(this._vec3, Cube.EDGE_POSITIVES[i], Cube.EDGE_NORMALS[i]);\n                _mat4[8] = this._vec3[0];\n                _mat4[9] = this._vec3[1];\n                _mat4[10] = this._vec3[2];\n            }\n            this._fromValues = [null, null, null];\n            this._toValues = [null, null, null];\n            this.isDivisionPickingEnabled = [false, false, false];\n            this.isLabelPickingEnabled = [false, false, false];\n            this.isTitlePickingEnabled = [false, false, false];\n            this.isHeadingPickingEnabled = [false, false, false];\n            this.isAxisReversed = [false, false, false];\n            this._scalingX = 1;\n            this._scalingY = 1;\n            this._scalingZ = 1;\n            this._offset = create$4();\n        }\n        initialize() {\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this.isInitialized) {\n                if (this._hasChanged) {\n                    const start = window.performance.now();\n                    this._hasChanged = false;\n                    set$3(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, this._maxBoundsZ - this._minBoundsZ);\n                    const maxBounds = Math.max(this._size[0], Math.max(this._size[1], this._size[2]));\n                    this._size[0] *= this._scalingX / maxBounds;\n                    this._size[1] *= this._scalingY / maxBounds;\n                    this._size[2] *= this._scalingZ / maxBounds;\n                    this._updateGrids(this._size);\n                    this._updateText(this._size);\n                    if (this.hasChangedCallback) {\n                        this.hasChangedCallback();\n                    }\n                    this._core.log.write(LogLevel.info, `cartesian3d updated ${Math.round(window.performance.now() - start)}ms`);\n                }\n                multiply$2(this._mMatrix, this.mMatrix, this._offset);\n                this._mvMatrix = create$4();\n                multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n                fromMat4(this._mat3, this._mvMatrix);\n                for (let faceId = 0; faceId < 6; faceId++) {\n                    multiply$1(this._vec3, Cube.FACE_POSITIONS[faceId], this._size);\n                    transformMat4$2(this._forward, this._vec3, this._mvMatrix);\n                    transformMat3(this._normal, Cube.FACE_NORMALS[faceId], this._mat3);\n                    this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n                }\n                this._forward[0] = this._mat3[2];\n                this._forward[1] = this._mat3[5];\n                this._forward[2] = this._mat3[8];\n                for (let edgeId = 0; edgeId < 12; edgeId++) {\n                    const faceIds = Cube.EDGE_FACES[edgeId];\n                    const forward1 = this._isForwardFace[faceIds[0]];\n                    const forward2 = this._isForwardFace[faceIds[1]];\n                    const outsideEdge = forward1 != forward2;\n                    this._isOutsideEdge[edgeId] = outsideEdge;\n                    if (outsideEdge) {\n                        this._isForwardEdge[edgeId] = dot$1(Cube.EDGE_FORWARDS[edgeId], this._forward) < 0;\n                    }\n                    this._distances[edgeId] = 0;\n                }\n                for (let axisId = 0; axisId < 3; axisId++) {\n                    if (this.arePickDivisionsVisible[axisId]) {\n                        set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n                        set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n                        const gridTicksScale = this._gridTicksScales[axisId];\n                        for (let edge = 0; edge < 4; edge++) {\n                            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                            if (this._isOutsideEdge[edgeId] && this.isEdgeVisible[edgeId]) {\n                                let distance = this._distances[edgeId];\n                                distance += this._gridPickDivisionHeight * 0.5;\n                                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                                multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n                                scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance);\n                                translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                                if (!this._isForwardEdge[edgeId]) {\n                                    scale$1(gridTicksMMatrix, gridTicksMMatrix, Constants.VECTOR3_REFLECTX);\n                                }\n                                scale$1(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                                distance += this._gridPickDivisionHeight * 0.5;\n                                this._distances[edgeId] = distance;\n                            }\n                        }\n                    }\n                }\n                for (let axisId = 0; axisId < 3; axisId++) {\n                    if (this.areFacesVisible[axisId]) {\n                        const axisId2 = axisId == 0 ? 1 : 0;\n                        const axisId3 = axisId == 2 ? 1 : 2;\n                        set(this._gridFaceZeros[axisId], this.zero[axisId2], this.zero[axisId3]);\n                        set(this._gridFaceMinorGridlines[axisId], this.minorGridlines[axisId2], this.minorGridlines[axisId3]);\n                        for (let face = 0; face < 2; face++) {\n                            const faceId = Cube.AXIS_FACES[axisId][face];\n                            if (this._isForwardFace[faceId]) {\n                                const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                                scale$1(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                                if (this._size[axisId] > 0) {\n                                    translate(gridFaceMMatrix, gridFaceMMatrix, Cube.FACE_POSITIONS[faceId]);\n                                }\n                            }\n                        }\n                    }\n                }\n                for (let axisId = 0; axisId < 3; axisId++) {\n                    for (let edge = 0; edge < 4; edge++) {\n                        const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                        if (this._isOutsideEdge[edgeId]) {\n                            multiply$1(this._edgePosition, Cube.EDGE_POSITIONS[edgeId], this._size);\n                            transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n                            normalize$2(this._forward, this._edgePosition);\n                            negate(this._forward, this._forward);\n                            cross(this._right, Constants.VECTOR3_UNITY, this._forward);\n                            normalize$2(this._right, this._right);\n                            cross(this._up, this._forward, this._right);\n                            transformMat3(this._edgeNormal, Cube.EDGE_NORMALS[edgeId], this._mat3);\n                            transformMat3(this._edgePositive, Cube.EDGE_POSITIVES[edgeId], this._mat3);\n                            copy$3(this._edgeNormalTemp, this._edgeNormal);\n                            copy$3(this._edgePositiveTemp, this._edgePositive);\n                            const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n                            const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n                            const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n                            if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n                                copy$3(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n                            }\n                            else {\n                                negate(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n                                negate(this._edgeNormalTemp, this._edgeNormalTemp);\n                            }\n                            if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n                                this._isLeftToRightHorizontal[edgeId] = true;\n                                copy$3(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n                            }\n                            else {\n                                this._isLeftToRightHorizontal[edgeId] = false;\n                                negate(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n                                negate(this._edgePositiveTemp, this._edgePositiveTemp);\n                            }\n                            cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n                            if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n                                this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                                negate(edgeHorizontalRight, edgeHorizontalRight);\n                            }\n                            cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n                            const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n                            const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n                            const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n                            if (dot$1(this._edgeNormal, this._right) < 0) {\n                                copy$3(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n                            }\n                            else {\n                                negate(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n                                negate(this._edgeNormal, this._edgeNormal);\n                            }\n                            if (dot$1(this._edgePositive, this._up) < 0) {\n                                this._isLeftToRightVertical[edgeId] = true;\n                                copy$3(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n                            }\n                            else {\n                                this._isLeftToRightVertical[edgeId] = false;\n                                negate(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n                                negate(this._edgePositive, this._edgePositive);\n                            }\n                            cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n                            if (dot$1(edgeVerticalForward, this._forward) < 0) {\n                                this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                                negate(edgeVerticalRight, edgeVerticalRight);\n                            }\n                            cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n                            if (this.isEdgeVisible[edgeId]) {\n                                if (this._labels[axisId]) {\n                                    this._updateLabels(axisId, edgeId);\n                                }\n                                if (this._titles[axisId]) {\n                                    this._updateTitle(axisId, edgeId);\n                                }\n                            }\n                            if (this.isHeadingVisible[edgeId]) {\n                                this._updateHeading(axisId, edgeId);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        _updateLabels(axisId, edgeId) {\n            const orientation = this._orientations[axisId];\n            let distance = this._distances[edgeId];\n            let maxLabelSize = this._maxLabelSize[axisId][1];\n            if (orientation == AxesTextOrientation.parallel)\n                maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n            distance += maxLabelSize * 0.5;\n            multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance);\n            const labelMMatrix = this._labelMMatrices[edgeId];\n            labelMMatrix[12] = this._vec3[0];\n            labelMMatrix[13] = this._vec3[1];\n            labelMMatrix[14] = this._vec3[2];\n            if (orientation == AxesTextOrientation.parallel) {\n                const right = this._edgeHorizontalRight[edgeId];\n                const up = this._edgeHorizontalUp[edgeId];\n                const forward = this._edgeHorizontalForward[edgeId];\n                labelMMatrix[0] = right[0];\n                labelMMatrix[1] = right[1];\n                labelMMatrix[2] = right[2];\n                labelMMatrix[4] = up[0];\n                labelMMatrix[5] = up[1];\n                labelMMatrix[6] = up[2];\n                labelMMatrix[8] = forward[0];\n                labelMMatrix[9] = forward[1];\n                labelMMatrix[10] = forward[2];\n            }\n            else {\n                const right = this._edgeVerticalRight[edgeId];\n                const up = this._edgeVerticalUp[edgeId];\n                const forward = this._edgeVerticalForward[edgeId];\n                labelMMatrix[0] = right[0];\n                labelMMatrix[1] = right[1];\n                labelMMatrix[2] = right[2];\n                labelMMatrix[4] = up[0];\n                labelMMatrix[5] = up[1];\n                labelMMatrix[6] = up[2];\n                labelMMatrix[8] = forward[0];\n                labelMMatrix[9] = forward[1];\n                labelMMatrix[10] = forward[2];\n            }\n            multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n            if (orientation == AxesTextOrientation.perpendicular) {\n                multiply$2(labelMMatrix, labelMMatrix, Constants.MAT4_ROTATION_MINUS_90);\n            }\n            distance += maxLabelSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateTitle(axisId, edgeId) {\n            let distance = this._distances[edgeId];\n            const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n            distance += titleTextSize * 0.5;\n            multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance);\n            const titleMMatrix = this._titleMMatrices[edgeId];\n            titleMMatrix[12] = this._vec3[0];\n            titleMMatrix[13] = this._vec3[1];\n            titleMMatrix[14] = this._vec3[2];\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            titleMMatrix[0] = right[0];\n            titleMMatrix[1] = right[1];\n            titleMMatrix[2] = right[2];\n            titleMMatrix[4] = up[0];\n            titleMMatrix[5] = up[1];\n            titleMMatrix[6] = up[2];\n            titleMMatrix[8] = forward[0];\n            titleMMatrix[9] = forward[1];\n            titleMMatrix[10] = forward[2];\n            multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n            distance += titleTextSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateHeading(axisId, edgeId) {\n            let distance = this._distances[edgeId];\n            const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n            distance += headingTextSize * 0.5;\n            multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance);\n            const headingMMatrix = this._headingMMatrices[edgeId];\n            headingMMatrix[12] = this._vec3[0];\n            headingMMatrix[13] = this._vec3[1];\n            headingMMatrix[14] = this._vec3[2];\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            headingMMatrix[0] = right[0];\n            headingMMatrix[1] = right[1];\n            headingMMatrix[2] = right[2];\n            headingMMatrix[4] = up[0];\n            headingMMatrix[5] = up[1];\n            headingMMatrix[6] = up[2];\n            headingMMatrix[8] = forward[0];\n            headingMMatrix[9] = forward[1];\n            headingMMatrix[10] = forward[2];\n            multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n            distance += headingTextSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateGrids(size) {\n            let offset = 0;\n            this.pickGridLookup = {};\n            this._pickGrid = [];\n            const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n            const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n            const zDivisions = this._gridTicksPositions[2] ? this._gridTicksPositions[2].length - 1 : 0;\n            const count = 2 * (xDivisions * yDivisions) +\n                2 * (xDivisions * zDivisions) +\n                2 * (yDivisions * zDivisions) +\n                xDivisions +\n                yDivisions +\n                zDivisions;\n            const byteLength = PickGridVertex.SIZE_BYTES * count * 4;\n            if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n                this._gridVertices = new ArrayBuffer(byteLength);\n                this._gridVerticesView = new DataView(this._gridVertices);\n                this._gridIndices = new Uint16Array(count * 6);\n            }\n            for (let axisId = 0; axisId < 3; axisId++) {\n                const width = size[axisId];\n                set$3(this._gridTicksScales[axisId], width, this._gridPickDivisionHeight, 1);\n                offset = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset);\n                for (let face = 0; face < 2; face++) {\n                    const faceId = Cube.AXIS_FACES[axisId][face];\n                    offset = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset);\n                }\n                this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n            }\n        }\n        _updateText(size) {\n            let glyphOffset = 0;\n            let count = 0;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                const labels = this._labels[axisId];\n                if (labels) {\n                    for (let i = 0; i < labels.length; i++) {\n                        count += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n                    }\n                }\n                const title = this._titles[axisId];\n                if (title) {\n                    count += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n                }\n                const heading = this._headings[axisId];\n                if (heading) {\n                    count += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n                }\n            }\n            const byteLength = PositionTexturePickVertex.SIZE_BYTES * count * 4;\n            if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n                this._textVertices = new ArrayBuffer(byteLength);\n                this._textVerticesView = new DataView(this._textVertices);\n                this._textIndices = new Uint16Array(count * 6);\n            }\n            this.pickLabelLookup = {};\n            this._pickLabel = [];\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (this._labels[axisId]) {\n                    const width = size[axisId];\n                    const maxLabelSize = this._maxLabelSize[axisId];\n                    const orientation = this._orientations[axisId];\n                    set(maxLabelSize, 0, 0);\n                    this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n                    glyphOffset = this._updateLeftToRightAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n                    this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n                    this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n                    glyphOffset = this._updateRightToLeftAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n                    this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n                }\n                else {\n                    this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n                    this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n                    this._axesLeftToRightIndexCounts[axisId] = 0;\n                    this._axesRightToLeftIndexCounts[axisId] = 0;\n                    this._maxLabelSize[axisId][0] = 0;\n                    this._maxLabelSize[axisId][1] = 0;\n                }\n            }\n            this.pickTitleLookup = {};\n            this._pickTitle = [];\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (this._titles[axisId]) {\n                    set$3(this._textPosition, 0, 0, 0);\n                    set$3(this._textOffset, 0, 0, 0);\n                    this._titleIndexOffsets[axisId] = glyphOffset * 6;\n                    const text = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n                    const scale = this._titleSizes[axisId] / this._font.size;\n                    TextHelper.measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const maxGlyphTop = this._textMetric.maxTop * scale;\n                    const lineHeight = this._font.size * scale;\n                    this._textOffset[0] -= width / 2;\n                    this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n                    this.pickTitleLookup[pickId] = this._pickTitle.length;\n                    this._pickTitle.push(axisId);\n                    TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                    glyphOffset += text.length;\n                    this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n                }\n                else {\n                    this._titleIndexOffsets[axisId] = glyphOffset * 6;\n                    this._titleIndexCounts[axisId] = 0;\n                }\n            }\n            this.pickHeadingLookup = {};\n            this._pickHeading = [];\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (this._headings[axisId]) {\n                    set$3(this._textPosition, 0, 0, 0);\n                    set$3(this._textOffset, 0, 0, 0);\n                    this._headingIndexOffsets[axisId] = glyphOffset * 6;\n                    const text = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n                    const scale = this._headingSizes[axisId] / this._font.size;\n                    TextHelper.measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const maxGlyphTop = this._textMetric.maxTop * scale;\n                    const lineHeight = this._font.size * scale;\n                    this._textOffset[0] -= width / 2;\n                    this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n                    this.pickHeadingLookup[pickId] = this._pickHeading.length;\n                    this._pickHeading.push(axisId);\n                    TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                    glyphOffset += text.length;\n                    this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n                }\n                else {\n                    this._headingIndexOffsets[axisId] = glyphOffset * 6;\n                    this._headingIndexCounts[axisId] = 0;\n                }\n            }\n        }\n        _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n            const isAxisReversed = this.isAxisReversed[axisId];\n            for (let label = 0; label < labels.length; label++) {\n                const text = TextHelper.truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n                const lineHeight = scales[label];\n                const scale = lineHeight / this._font.size;\n                TextHelper.measure(this._font, text, this._textMetric);\n                const width = this._textMetric.width * scale;\n                const maxGlyphTop = this._textMetric.maxTop * scale;\n                const position = isAxisReversed ? 1 - positions[label] : positions[label];\n                switch (orientation) {\n                    case AxesTextOrientation.parallel:\n                        set$3(this._textPosition, (position - 0.5) * size, 0, 0);\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[0] = -width / 2;\n                        }\n                        else {\n                            this._textOffset[0] = position == 0 ? 0 : position == 1 ? -width : -width / 2;\n                        }\n                        this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                        maxSize[0] = Math.max(width, maxSize[0]);\n                        maxSize[1] = Math.max(lineHeight, maxSize[1]);\n                        break;\n                    case AxesTextOrientation.perpendicular:\n                        set$3(this._textPosition, 0, (position - 0.5) * size, 0);\n                        this._textOffset[0] = -width / 2;\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[1] = -maxGlyphTop / 2;\n                        }\n                        else {\n                            this._textOffset[1] = position == 0 ? 0 : position == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n                        }\n                        maxSize[0] = Math.max(lineHeight, maxSize[0]);\n                        maxSize[1] = Math.max(width, maxSize[1]);\n                        break;\n                }\n                const pickId = PickHelper.nextPickId();\n                PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n                this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n                this._pickLabel.push(axisId);\n                this._pickLabel.push(label);\n                TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                glyphOffset += text.length;\n            }\n            return glyphOffset;\n        }\n        _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n            const isAxisReversed = this.isAxisReversed[axisId];\n            for (let label = 0; label < labels.length; label++) {\n                const text = TextHelper.truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n                const lineHeight = scales[label];\n                const scale = lineHeight / this._font.size;\n                TextHelper.measure(this._font, text, this._textMetric);\n                const width = this._textMetric.width * scale;\n                const maxGlyphTop = this._textMetric.maxTop * scale;\n                const position = isAxisReversed ? 1 - positions[label] : positions[label];\n                switch (orientation) {\n                    case AxesTextOrientation.parallel:\n                        set$3(this._textPosition, (0.5 - position) * size, 0, 0);\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[0] = -width / 2;\n                        }\n                        else {\n                            this._textOffset[0] = label == 0 ? -width : label == labels.length - 1 ? 0 : -width / 2;\n                        }\n                        this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                        break;\n                    case AxesTextOrientation.perpendicular:\n                        set$3(this._textPosition, 0, (0.5 - position) * size, 0);\n                        this._textOffset[0] = -width / 2;\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[1] = -maxGlyphTop / 2;\n                        }\n                        else {\n                            this._textOffset[1] = label == 0 ? -maxGlyphTop : label == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n                        }\n                        break;\n                }\n                const pickId = PickHelper.nextPickId();\n                PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n                this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n                this._pickLabel.push(axisId);\n                this._pickLabel.push(label);\n                TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                glyphOffset += text.length;\n            }\n            return glyphOffset;\n        }\n        _updateGridTicks(axisId, dataView, indices, offset) {\n            this._gridTicksIndexOffsets[axisId] = offset * 6;\n            if (this._gridTicksPositions[axisId]) {\n                const axes = create$3();\n                const positions = this._gridTicksPositions[axisId];\n                const isAxisReversed = this.isAxisReversed[axisId];\n                let vertexOffset = offset * 4;\n                for (let position = 0; position < positions.length - 1; position++) {\n                    const left = isAxisReversed ? 1 - positions[position + 1] - 0.5 : positions[position] - 0.5;\n                    const right = isAxisReversed ? 1 - positions[position] - 0.5 : positions[position + 1] - 0.5;\n                    axes[axisId] = position + 1;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n                    this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                    this._pickGrid.push(axes[0]);\n                    this._pickGrid.push(axes[1]);\n                    this._pickGrid.push(axes[2]);\n                    let indexOffset = offset * 6;\n                    for (let j = 0; j < this._indexTemplate.length; j++) {\n                        indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n                    }\n                    set$2(this._bounds, left + 0.5, 0, right + 0.5, 1);\n                    this._translation[0] = left;\n                    this._translation[1] = 0.5;\n                    this._translation[2] = 0;\n                    this._texCoord[0] = left + 0.5;\n                    this._texCoord[1] = 1;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = right;\n                    this._texCoord[0] = right + 0.5;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = left;\n                    this._translation[1] = -0.5;\n                    this._texCoord[0] = left + 0.5;\n                    this._texCoord[1] = 0;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = right;\n                    this._texCoord[0] = right + 0.5;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    offset++;\n                }\n            }\n            this._gridTicksIndexCounts[axisId] = offset * 6 - this._gridTicksIndexOffsets[axisId];\n            return offset;\n        }\n        _updateGridFace(axisId, faceId, dataView, indices, offset) {\n            set$3(this._translation, 0, 0, 0);\n            this._gridFaceIndexOffsets[faceId] = offset * 6;\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n                const axes = create$3();\n                negate(this._normal, Cube.FACE_NORMALS[faceId]);\n                const positions2 = this._gridTicksPositions[axisId2];\n                const positions3 = this._gridTicksPositions[axisId3];\n                const isAxisReversed2 = this.isAxisReversed[axisId2];\n                const isAxisReversed3 = this.isAxisReversed[axisId3];\n                for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n                    const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n                    const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n                    axes[axisId2] = position2 + 1;\n                    let vertexOffset = offset * 4;\n                    for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n                        const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n                        const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n                        axes[axisId3] = position3 + 1;\n                        const pickId = PickHelper.nextPickId();\n                        PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n                        this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                        this._pickGrid.push(axes[0]);\n                        this._pickGrid.push(axes[1]);\n                        this._pickGrid.push(axes[2]);\n                        let indexOffset = offset * 6;\n                        for (let i = 0; i < this._indexTemplate.length; i++) {\n                            indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n                        }\n                        set$2(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n                        this._translation[axisId2] = min2;\n                        this._translation[axisId3] = max3;\n                        this._texCoord[0] = min2 + 0.5;\n                        this._texCoord[1] = max3 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = max2;\n                        this._texCoord[0] = max2 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = min2;\n                        this._translation[axisId3] = min3;\n                        this._texCoord[0] = min2 + 0.5;\n                        this._texCoord[1] = min3 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = max2;\n                        this._texCoord[0] = max2 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        offset++;\n                    }\n                }\n            }\n            this._gridFaceIndexCounts[faceId] = offset * 6 - this._gridFaceIndexOffsets[faceId];\n            return offset;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cartesian2dAxes extends AxesBase {\n        get size() { return this._size; }\n        get isDiscreteX() { return this._isDiscrete[0]; }\n        set isDiscreteX(value) {\n            if (value != this._isDiscrete[0]) {\n                this._isDiscrete[0] = value;\n                this._hasChanged = true;\n            }\n        }\n        get isDiscreteY() { return this._isDiscrete[1]; }\n        set isDiscreteY(value) {\n            if (value != this._isDiscrete[1]) {\n                this._isDiscrete[1] = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsX() { return this._minBoundsX; }\n        set minBoundsX(value) {\n            if (value != this._minBoundsX) {\n                this._minBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsX() { return this._maxBoundsX; }\n        set maxBoundsX(value) {\n            if (value != this._minBoundsX) {\n                this._maxBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsY() { return this._minBoundsY; }\n        set minBoundsY(value) {\n            if (value != this._minBoundsY) {\n                this._minBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsY() { return this._maxBoundsY; }\n        set maxBoundsY(value) {\n            if (value != this._minBoundsY) {\n                this._maxBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        getIsOutsideEdge(index) { return this._isOutsideEdge[index]; }\n        getIsForwardFace(index) { return this._isForwardFace[index]; }\n        get textVertices() { return this._textVertices; }\n        get textIndices() { return this._textIndices; }\n        getLabelMMatrix(index) { return this._labelMMatrices[index]; }\n        setLabelPositions(index, value) {\n            if (this._labelPositions[index] != value) {\n                this._labelPositions[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setLabels(index, value) {\n            if (this._labels[index] != value) {\n                this._labels[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setLabelSizes(index, value) {\n            if (this._labelSizes[index] != value) {\n                this._labelSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getLabelOrientation(index) { return this._orientations[index]; }\n        setLabelOrientation(index, orientation) {\n            if (this._orientations[index] != orientation) {\n                this._orientations[index] = orientation;\n                this._hasChanged = true;\n            }\n        }\n        getTitleIndexCount(index) { return this._titleIndexCounts[index]; }\n        getTitleIndexOffset(index) { return this._titleIndexOffsets[index]; }\n        getTitleMMatrix(index) { return this._titleMMatrices[index]; }\n        setTitle(index, value) {\n            if (this._titles[index] != value) {\n                this._titles[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setTitleSize(index, value) {\n            if (this._titleSizes[index] != value) {\n                this._titleSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getHeadingIndexCount(index) { return this._headingIndexCounts[index]; }\n        getHeadingIndexOffset(index) { return this._headingIndexOffsets[index]; }\n        getHeadingMMatrix(index) { return this._headingMMatrices[index]; }\n        setHeading(index, value) {\n            if (this._headings[index] != value) {\n                this._headings[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        setHeadingSize(index, value) {\n            if (this._headingSizes[index] != value) {\n                this._headingSizes[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        getIsLeftToRightHorizontal(index) { return this._isLeftToRightHorizontal[index]; }\n        getIsLeftToRightVertical(index) { return this._isLeftToRightVertical[index]; }\n        getAxesLeftToRightIndexCount(index) { return this._axesLeftToRightIndexCounts[index]; }\n        getAxesRightToLeftIndexCount(index) { return this._axesRightToLeftIndexCounts[index]; }\n        getAxesLeftToRightIndexOffset(index) { return this._axesLeftToRightIndexOffsets[index]; }\n        getAxesRightToLeftIndexOffset(index) { return this._axesRightToLeftIndexOffsets[index]; }\n        get gridVertices() { return this._gridVertices; }\n        get gridIndices() { return this._gridIndices; }\n        getGridTicksIndexCount(index) { return this._gridTicksIndexCounts[index]; }\n        getGridTicksIndexOffset(index) { return this._gridTicksIndexOffsets[index]; }\n        getGridFaceIndexCount(index) { return this._gridFaceIndexCounts[index]; }\n        getGridFaceIndexOffset(index) { return this._gridFaceIndexOffsets[index]; }\n        getGridTicksMMatrix(index) { return this._gridTicksMMatrices[index]; }\n        getGridFaceMMatrix(index) { return this._gridFaceMMatrices[index]; }\n        getGridTicksScale(index) { return this._gridTicksScales[index]; }\n        getGridTicksZero(index) { return this._gridTicksZeros[index]; }\n        get gridFaceZero() { return this._gridFaceZeros; }\n        get gridFaceMinorGridlines() { return this._gridFaceMinorGridlines; }\n        getGridTicksMinorGridlines(index) { return this._gridTicksMinorGridlines[index]; }\n        setTickPositions(index, value) {\n            if (this._gridTicksPositions[index] != value) {\n                this._gridTicksPositions[index] = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingX() { return this._scalingX; }\n        set scalingX(value) {\n            if (value != this._scalingX) {\n                this._scalingX = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalingY() { return this._scalingY; }\n        set scalingY(value) {\n            if (value != this._scalingY) {\n                this._scalingY = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetX() { return this._offset[12]; }\n        set offsetX(value) {\n            if (value != this._offset[12]) {\n                this._offset[12] = value;\n            }\n        }\n        get offsetY() { return this._offset[13]; }\n        set offsetY(value) {\n            if (value != this._offset[13]) {\n                this._offset[13] = value;\n            }\n        }\n        set rotation(value) {\n            if (this._rotation != value) {\n                this._rotation = value;\n                this._rMatrix = create$4();\n                fromQuat(this._rMatrix, value);\n            }\n        }\n        constructor(core) {\n            super(core);\n            this._size = create$3();\n            this._translation = create$3();\n            this._normal = create$3();\n            this._forward = create$3();\n            this._right = create$3();\n            this._up = create$3();\n            this._texCoord = create();\n            this._bounds = create$2();\n            this._vec3 = create$3();\n            this._vec4 = create$2();\n            this._mat3 = create$5();\n            this._isDiscrete = [false, false];\n            this._minBoundsX = 0;\n            this._minBoundsY = 0;\n            this._maxBoundsX = 0;\n            this._maxBoundsY = 0;\n            this._isForwardFace = [];\n            this._isForwardEdge = [];\n            this._isOutsideEdge = [];\n            for (let i = 0; i < 2; i++) {\n                this._isForwardFace.push(false);\n            }\n            for (let i = 0; i < 4; i++) {\n                this._isForwardEdge.push(false);\n                this._isOutsideEdge.push(false);\n            }\n            this._textOffset = create$3();\n            this._textPosition = create$3();\n            this._distances = [];\n            for (let i = 0; i < 4; i++) {\n                this._distances.push(0);\n            }\n            this._labelPositions = [];\n            this._labels = [];\n            this._labelSizes = [];\n            this._maxLabelSize = [];\n            this._axesLeftToRightIndexCounts = [];\n            this._axesRightToLeftIndexCounts = [];\n            this._axesLeftToRightIndexOffsets = [];\n            this._axesRightToLeftIndexOffsets = [];\n            this._labelMMatrices = [];\n            this._orientations = [];\n            for (let i = 0; i < 2; i++) {\n                this._maxLabelSize.push(create());\n                this._orientations.push(AxesTextOrientation.parallel);\n                this._axesLeftToRightIndexCounts.push(0);\n                this._axesRightToLeftIndexCounts.push(0);\n                this._axesLeftToRightIndexOffsets.push(0);\n                this._axesRightToLeftIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 4; i++) {\n                this._labelMMatrices.push(create$4());\n            }\n            this._titles = [];\n            this._titleSizes = [];\n            this._titleIndexCounts = [];\n            this._titleIndexOffsets = [];\n            this._titleMMatrices = [];\n            for (let i = 0; i < 2; i++) {\n                this._titles.push(null);\n                this._titleSizes.push(core.config.axesTextTitleSize);\n                this._titleIndexCounts.push(0);\n                this._titleIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 4; i++) {\n                this._titleMMatrices.push(create$4());\n            }\n            this._headings = [];\n            this._headingSizes = [];\n            this._headingIndexCounts = [];\n            this._headingIndexOffsets = [];\n            this._headingMMatrices = [];\n            this.isHeadingVisible = [];\n            for (let i = 0; i < 2; i++) {\n                this._headings.push(null);\n                this._headingSizes.push(core.config.axesTextHeadingSize);\n                this._headingIndexCounts.push(0);\n                this._headingIndexOffsets.push(0);\n            }\n            for (let i = 0; i < 4; i++) {\n                this._headingMMatrices.push(create$4());\n                this.isHeadingVisible.push(true);\n            }\n            this.isEdgeVisible = [];\n            this._edgePosition = create$3();\n            this._edgePositive = create$3();\n            this._edgeNormal = create$3();\n            this._edgeNormalTemp = create$3();\n            this._edgePositiveTemp = create$3();\n            this._isLeftToRightHorizontal = [];\n            this._isLeftToRightVertical = [];\n            this._edgeHorizontalRight = [];\n            this._edgeHorizontalUp = [];\n            this._edgeHorizontalForward = [];\n            this._edgeVerticalRight = [];\n            this._edgeVerticalUp = [];\n            this._edgeVerticalForward = [];\n            for (let i = 0; i < 4; i++) {\n                this.isEdgeVisible.push(true);\n                this._isLeftToRightHorizontal.push(false);\n                this._isLeftToRightVertical.push(false);\n                this._edgeHorizontalRight.push(create$3());\n                this._edgeHorizontalUp.push(create$3());\n                this._edgeHorizontalForward.push(create$3());\n                this._edgeVerticalRight.push(create$3());\n                this._edgeVerticalUp.push(create$3());\n                this._edgeVerticalForward.push(create$3());\n            }\n            this.isFaceVisible = [];\n            for (let i = 0; i < 2; i++) {\n                this.isFaceVisible.push(true);\n            }\n            this.arePickDivisionsVisible = [];\n            this.areFacesVisible = [];\n            this._indexTemplate = Quad$2.INDICES;\n            this.zero = create$3();\n            this._gridTicksZeros = [];\n            this._gridFaceZeros = create();\n            this.minorGridlines = fromValues$3(1, 1, 1);\n            this._gridTicksMinorGridlines = [];\n            this._gridFaceMinorGridlines = create();\n            this._gridTicksPositions = [];\n            this._gridTicksScales = [];\n            this._gridTicksIndexCounts = [];\n            this._gridTicksIndexOffsets = [];\n            this._gridFaceScale = create$3();\n            this._gridFaceIndexCounts = [];\n            this._gridFaceIndexOffsets = [];\n            this._gridFaceMMatrices = [];\n            this._gridTicksMMatrices = [];\n            this._gridTicksRotations = [];\n            for (let i = 0; i < 2; i++) {\n                this.arePickDivisionsVisible.push(true);\n                this.areFacesVisible.push(true);\n                this._gridTicksZeros.push(create());\n                this._gridTicksMinorGridlines.push(create());\n                this._gridTicksScales.push(create$3());\n                this._gridTicksIndexCounts.push(0);\n                this._gridTicksIndexOffsets.push(0);\n                this._gridFaceIndexCounts.push(0);\n                this._gridFaceIndexOffsets.push(0);\n                this._gridFaceMMatrices.push(create$4());\n            }\n            for (let i = 0; i < 4; i++) {\n                this._gridTicksMMatrices.push(create$4());\n                this._gridTicksRotations.push(create$4());\n                const _mat4 = this._gridTicksRotations[i];\n                _mat4[0] = Quad$2.EDGE_POSITIVES[i][0];\n                _mat4[1] = Quad$2.EDGE_POSITIVES[i][1];\n                _mat4[2] = Quad$2.EDGE_POSITIVES[i][2];\n                _mat4[4] = Quad$2.EDGE_NORMALS[i][0];\n                _mat4[5] = Quad$2.EDGE_NORMALS[i][1];\n                _mat4[6] = Quad$2.EDGE_NORMALS[i][2];\n                cross(this._vec3, Quad$2.EDGE_POSITIVES[i], Quad$2.EDGE_NORMALS[i]);\n                _mat4[8] = this._vec3[0];\n                _mat4[9] = this._vec3[1];\n                _mat4[10] = this._vec3[2];\n            }\n            this._fromValues = [null, null];\n            this._toValues = [null, null];\n            this.isDivisionPickingEnabled = [false, false];\n            this.isLabelPickingEnabled = [false, false];\n            this.isTitlePickingEnabled = [false, false];\n            this.isHeadingPickingEnabled = [false, false];\n            this.isAxisReversed = [false, false];\n            this._scalingX = 1;\n            this._scalingY = 1;\n            this._offset = create$4();\n        }\n        initialize() {\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this.isInitialized) {\n                if (this._hasChanged) {\n                    const start = window.performance.now();\n                    this._hasChanged = false;\n                    set$3(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, 0);\n                    const maxBounds = Math.max(this._size[0], this._size[1]);\n                    this._size[0] *= this._scalingX / maxBounds;\n                    this._size[1] *= this._scalingY / maxBounds;\n                    this._updateGrids(this._size);\n                    this._updateText(this._size);\n                    if (this.hasChangedCallback) {\n                        this.hasChangedCallback();\n                    }\n                    this._core.log.write(LogLevel.info, `cartesian2d updated ${Math.round(window.performance.now() - start)}ms`);\n                }\n                if (this._rMatrix) {\n                    mul(this._mMatrix, this.mMatrix, this._rMatrix);\n                    mul(this._mMatrix, this._mMatrix, this._offset);\n                }\n                else {\n                    multiply$2(this._mMatrix, this.mMatrix, this._offset);\n                }\n                this._mvMatrix = create$4();\n                multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n                fromMat4(this._mat3, this._mvMatrix);\n                for (let faceId = 0; faceId < 2; faceId++) {\n                    transformMat4$2(this._forward, Constants.VECTOR3_ZERO, this._mvMatrix);\n                    transformMat3(this._normal, Quad$2.FACE_NORMALS[faceId], this._mat3);\n                    this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n                }\n                this._forward[0] = this._mat3[2];\n                this._forward[1] = this._mat3[5];\n                this._forward[2] = this._mat3[8];\n                for (let edgeId = 0; edgeId < 4; edgeId++) {\n                    this._isForwardEdge[edgeId] = dot$1(Quad$2.EDGE_FORWARDS[edgeId], this._forward) < 0;\n                    this._distances[edgeId] = 0;\n                }\n                for (let axisId = 0; axisId < 2; axisId++) {\n                    if (this.arePickDivisionsVisible[axisId]) {\n                        set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n                        set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n                        const gridTicksScale = this._gridTicksScales[axisId];\n                        for (let edge = 0; edge < 2; edge++) {\n                            const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                            if (this.isEdgeVisible[edgeId]) {\n                                let distance = this._distances[edgeId];\n                                distance += this._gridPickDivisionHeight * 0.5;\n                                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                                multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n                                scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance);\n                                translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                                if (!this._isForwardEdge[edgeId]) {\n                                    scale$1(gridTicksMMatrix, gridTicksMMatrix, Constants.VECTOR3_REFLECTX);\n                                }\n                                scale$1(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                                distance += this._gridPickDivisionHeight * 0.5;\n                                this._distances[edgeId] = distance;\n                            }\n                        }\n                    }\n                }\n                set(this._gridFaceZeros, this.zero[0], this.zero[1]);\n                set(this._gridFaceMinorGridlines, this.minorGridlines[0], this.minorGridlines[1]);\n                for (let faceId = 0; faceId < 2; faceId++) {\n                    if (this._isForwardFace[faceId]) {\n                        const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                        scale$1(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                    }\n                }\n                for (let axisId = 0; axisId < 2; axisId++) {\n                    for (let edge = 0; edge < 2; edge++) {\n                        const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                        multiply$1(this._edgePosition, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n                        transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n                        normalize$2(this._forward, this._edgePosition);\n                        negate(this._forward, this._forward);\n                        cross(this._right, Constants.VECTOR3_UNITY, this._forward);\n                        normalize$2(this._right, this._right);\n                        cross(this._up, this._forward, this._right);\n                        transformMat3(this._edgeNormal, Quad$2.EDGE_NORMALS[edgeId], this._mat3);\n                        transformMat3(this._edgePositive, Quad$2.EDGE_POSITIVES[edgeId], this._mat3);\n                        copy$3(this._edgeNormalTemp, this._edgeNormal);\n                        copy$3(this._edgePositiveTemp, this._edgePositive);\n                        const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n                        const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n                        const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n                        if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n                            copy$3(edgeHorizontalUp, Quad$2.EDGE_NORMALS[edgeId]);\n                        }\n                        else {\n                            negate(edgeHorizontalUp, Quad$2.EDGE_NORMALS[edgeId]);\n                            negate(this._edgeNormalTemp, this._edgeNormalTemp);\n                        }\n                        if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n                            this._isLeftToRightHorizontal[edgeId] = true;\n                            copy$3(edgeHorizontalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n                        }\n                        else {\n                            this._isLeftToRightHorizontal[edgeId] = false;\n                            negate(edgeHorizontalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n                            negate(this._edgePositiveTemp, this._edgePositiveTemp);\n                        }\n                        cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n                        if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n                            this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                            negate(edgeHorizontalRight, edgeHorizontalRight);\n                        }\n                        cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n                        const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n                        const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n                        const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n                        if (dot$1(this._edgeNormal, this._right) < 0) {\n                            copy$3(edgeVerticalUp, Quad$2.EDGE_NORMALS[edgeId]);\n                        }\n                        else {\n                            negate(edgeVerticalUp, Quad$2.EDGE_NORMALS[edgeId]);\n                            negate(this._edgeNormal, this._edgeNormal);\n                        }\n                        if (dot$1(this._edgePositive, this._up) < 0) {\n                            this._isLeftToRightVertical[edgeId] = true;\n                            copy$3(edgeVerticalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n                        }\n                        else {\n                            this._isLeftToRightVertical[edgeId] = false;\n                            negate(edgeVerticalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n                            negate(this._edgePositive, this._edgePositive);\n                        }\n                        cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n                        if (dot$1(edgeVerticalForward, this._forward) < 0) {\n                            this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                            negate(edgeVerticalRight, edgeVerticalRight);\n                        }\n                        cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n                        if (this.isEdgeVisible[edgeId]) {\n                            if (this._labels[axisId]) {\n                                this._updateLabels(axisId, edgeId);\n                            }\n                            if (this._titles[axisId]) {\n                                this._updateTitle(axisId, edgeId);\n                            }\n                        }\n                        if (this.isHeadingVisible[edgeId]) {\n                            this._updateHeading(axisId, edgeId);\n                        }\n                    }\n                }\n            }\n        }\n        _updateLabels(axisId, edgeId) {\n            const orientation = this._orientations[axisId];\n            let distance = this._distances[edgeId];\n            let maxLabelSize = this._maxLabelSize[axisId][1];\n            if (orientation == AxesTextOrientation.parallel)\n                maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n            distance += maxLabelSize * 0.5;\n            multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance);\n            const labelMMatrix = this._labelMMatrices[edgeId];\n            labelMMatrix[12] = this._vec3[0];\n            labelMMatrix[13] = this._vec3[1];\n            labelMMatrix[14] = this._vec3[2];\n            if (orientation == AxesTextOrientation.parallel) {\n                const right = this._edgeHorizontalRight[edgeId];\n                const up = this._edgeHorizontalUp[edgeId];\n                const forward = this._edgeHorizontalForward[edgeId];\n                labelMMatrix[0] = right[0];\n                labelMMatrix[1] = right[1];\n                labelMMatrix[2] = right[2];\n                labelMMatrix[4] = up[0];\n                labelMMatrix[5] = up[1];\n                labelMMatrix[6] = up[2];\n                labelMMatrix[8] = forward[0];\n                labelMMatrix[9] = forward[1];\n                labelMMatrix[10] = forward[2];\n            }\n            else {\n                const right = this._edgeVerticalRight[edgeId];\n                const up = this._edgeVerticalUp[edgeId];\n                const forward = this._edgeVerticalForward[edgeId];\n                labelMMatrix[0] = right[0];\n                labelMMatrix[1] = right[1];\n                labelMMatrix[2] = right[2];\n                labelMMatrix[4] = up[0];\n                labelMMatrix[5] = up[1];\n                labelMMatrix[6] = up[2];\n                labelMMatrix[8] = forward[0];\n                labelMMatrix[9] = forward[1];\n                labelMMatrix[10] = forward[2];\n            }\n            multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n            if (orientation == AxesTextOrientation.perpendicular) {\n                multiply$2(labelMMatrix, labelMMatrix, Constants.MAT4_ROTATION_MINUS_90);\n            }\n            distance += maxLabelSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateTitle(axisId, edgeId) {\n            let distance = this._distances[edgeId];\n            const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n            distance += titleTextSize * 0.5;\n            multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance);\n            const titleMMatrix = this._titleMMatrices[edgeId];\n            titleMMatrix[12] = this._vec3[0];\n            titleMMatrix[13] = this._vec3[1];\n            titleMMatrix[14] = this._vec3[2];\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            titleMMatrix[0] = right[0];\n            titleMMatrix[1] = right[1];\n            titleMMatrix[2] = right[2];\n            titleMMatrix[4] = up[0];\n            titleMMatrix[5] = up[1];\n            titleMMatrix[6] = up[2];\n            titleMMatrix[8] = forward[0];\n            titleMMatrix[9] = forward[1];\n            titleMMatrix[10] = forward[2];\n            multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n            distance += titleTextSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateHeading(axisId, edgeId) {\n            let distance = this._distances[edgeId];\n            const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n            distance += headingTextSize * 0.5;\n            multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n            scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance);\n            const headingMMatrix = this._headingMMatrices[edgeId];\n            headingMMatrix[12] = this._vec3[0];\n            headingMMatrix[13] = this._vec3[1];\n            headingMMatrix[14] = this._vec3[2];\n            const right = this._edgeHorizontalRight[edgeId];\n            const up = this._edgeHorizontalUp[edgeId];\n            const forward = this._edgeHorizontalForward[edgeId];\n            headingMMatrix[0] = right[0];\n            headingMMatrix[1] = right[1];\n            headingMMatrix[2] = right[2];\n            headingMMatrix[4] = up[0];\n            headingMMatrix[5] = up[1];\n            headingMMatrix[6] = up[2];\n            headingMMatrix[8] = forward[0];\n            headingMMatrix[9] = forward[1];\n            headingMMatrix[10] = forward[2];\n            multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n            distance += headingTextSize * 0.5;\n            this._distances[edgeId] = distance;\n        }\n        _updateGrids(size) {\n            let offset = 0;\n            this.pickGridLookup = {};\n            this._pickGrid = [];\n            const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n            const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n            const count = 2 * (xDivisions * yDivisions) +\n                xDivisions +\n                yDivisions;\n            const byteLength = PickGridVertex.SIZE_BYTES * count * 4;\n            if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n                this._gridVertices = new ArrayBuffer(byteLength);\n                this._gridVerticesView = new DataView(this._gridVertices);\n                this._gridIndices = new Uint16Array(count * 6);\n            }\n            for (let axisId = 0; axisId < 2; axisId++) {\n                const width = size[axisId];\n                set$3(this._gridTicksScales[axisId], width, this._gridPickDivisionHeight, 1);\n                offset = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset);\n                this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n            }\n            const axisId = 2;\n            this._gridFaceScale[axisId] = 1;\n            for (let faceId = 0; faceId < 2; faceId++) {\n                offset = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset);\n            }\n        }\n        _updateText(size) {\n            let glyphOffset = 0;\n            let count = 0;\n            for (let axisId = 0; axisId < 2; axisId++) {\n                const labels = this._labels[axisId];\n                if (labels) {\n                    for (let i = 0; i < labels.length; i++) {\n                        count += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n                    }\n                }\n                const title = this._titles[axisId];\n                if (title) {\n                    count += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n                }\n                const heading = this._headings[axisId];\n                if (heading) {\n                    count += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n                }\n            }\n            const byteLength = PositionTexturePickVertex.SIZE_BYTES * count * 4;\n            if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n                this._textVertices = new ArrayBuffer(byteLength);\n                this._textVerticesView = new DataView(this._textVertices);\n                this._textIndices = new Uint16Array(count * 6);\n            }\n            this.pickLabelLookup = {};\n            this._pickLabel = [];\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (this._labels[axisId]) {\n                    const width = size[axisId];\n                    const maxLabelSize = this._maxLabelSize[axisId];\n                    const orientation = this._orientations[axisId];\n                    set(maxLabelSize, 0, 0);\n                    this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n                    glyphOffset = this._updateLeftToRightAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n                    this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n                    this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n                    glyphOffset = this._updateRightToLeftAxisLabels(axisId, width, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n                    this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n                }\n                else {\n                    this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n                    this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n                    this._axesLeftToRightIndexCounts[axisId] = 0;\n                    this._axesRightToLeftIndexCounts[axisId] = 0;\n                    this._maxLabelSize[axisId][0] = 0;\n                    this._maxLabelSize[axisId][1] = 0;\n                }\n            }\n            this.pickTitleLookup = {};\n            this._pickTitle = [];\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (this._titles[axisId]) {\n                    set$3(this._textPosition, 0, 0, 0);\n                    set$3(this._textOffset, 0, 0, 0);\n                    this._titleIndexOffsets[axisId] = glyphOffset * 6;\n                    const text = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n                    const scale = this._titleSizes[axisId] / this._font.size;\n                    TextHelper.measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const maxGlyphTop = this._textMetric.maxTop * scale;\n                    const lineHeight = this._font.size * scale;\n                    this._textOffset[0] -= width / 2;\n                    this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n                    this.pickTitleLookup[pickId] = this._pickTitle.length;\n                    this._pickTitle.push(axisId);\n                    TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                    glyphOffset += text.length;\n                    this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n                }\n                else {\n                    this._titleIndexOffsets[axisId] = glyphOffset * 6;\n                    this._titleIndexCounts[axisId] = 0;\n                }\n            }\n            this.pickHeadingLookup = {};\n            this._pickHeading = [];\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (this._headings[axisId]) {\n                    set$3(this._textPosition, 0, 0, 0);\n                    set$3(this._textOffset, 0, 0, 0);\n                    this._headingIndexOffsets[axisId] = glyphOffset * 6;\n                    const text = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n                    const scale = this._headingSizes[axisId] / this._font.size;\n                    TextHelper.measure(this._font, text, this._textMetric);\n                    const width = this._textMetric.width * scale;\n                    const maxGlyphTop = this._textMetric.maxTop * scale;\n                    const lineHeight = this._font.size * scale;\n                    this._textOffset[0] -= width / 2;\n                    this._textOffset[1] -= (lineHeight - maxGlyphTop) / 2;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n                    this.pickHeadingLookup[pickId] = this._pickHeading.length;\n                    this._pickHeading.push(axisId);\n                    TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                    glyphOffset += text.length;\n                    this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n                }\n                else {\n                    this._headingIndexOffsets[axisId] = glyphOffset * 6;\n                    this._headingIndexCounts[axisId] = 0;\n                }\n            }\n        }\n        _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n            const isAxisReversed = this.isAxisReversed[axisId];\n            for (let label = 0; label < labels.length; label++) {\n                const text = TextHelper.truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n                const lineHeight = scales[label];\n                const scale = lineHeight / this._font.size;\n                TextHelper.measure(this._font, text, this._textMetric);\n                const width = this._textMetric.width * scale;\n                const maxGlyphTop = this._textMetric.maxTop * scale;\n                const position = isAxisReversed ? 1 - positions[label] : positions[label];\n                switch (orientation) {\n                    case AxesTextOrientation.parallel:\n                        set$3(this._textPosition, (position - 0.5) * size, 0, 0);\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[0] = -width / 2;\n                        }\n                        else {\n                            this._textOffset[0] = position == 0 ? 0 : position == 1 ? -width : -width / 2;\n                        }\n                        this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                        maxSize[0] = Math.max(width, maxSize[0]);\n                        maxSize[1] = Math.max(lineHeight, maxSize[1]);\n                        break;\n                    case AxesTextOrientation.perpendicular:\n                        set$3(this._textPosition, 0, (position - 0.5) * size, 0);\n                        this._textOffset[0] = -width / 2;\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[1] = -maxGlyphTop / 2;\n                        }\n                        else {\n                            this._textOffset[1] = position == 0 ? 0 : position == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n                        }\n                        maxSize[0] = Math.max(lineHeight, maxSize[0]);\n                        maxSize[1] = Math.max(width, maxSize[1]);\n                        break;\n                }\n                const pickId = PickHelper.nextPickId();\n                PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n                this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n                this._pickLabel.push(axisId);\n                this._pickLabel.push(label);\n                TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                glyphOffset += text.length;\n            }\n            return glyphOffset;\n        }\n        _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales) {\n            const isAxisReversed = this.isAxisReversed[axisId];\n            for (let label = 0; label < labels.length; label++) {\n                const text = TextHelper.truncate(labels[label], this._core.config.axesTextLabelMaxGlyphs);\n                const lineHeight = scales[label];\n                const scale = lineHeight / this._font.size;\n                TextHelper.measure(this._font, text, this._textMetric);\n                const width = this._textMetric.width * scale;\n                const maxGlyphTop = this._textMetric.maxTop * scale;\n                const position = isAxisReversed ? 1 - positions[label] : positions[label];\n                switch (orientation) {\n                    case AxesTextOrientation.parallel:\n                        set$3(this._textPosition, (0.5 - position) * size, 0, 0);\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[0] = -width / 2;\n                        }\n                        else {\n                            this._textOffset[0] = label == 0 ? -width : label == labels.length - 1 ? 0 : -width / 2;\n                        }\n                        this._textOffset[1] = (maxGlyphTop - lineHeight) / 2;\n                        break;\n                    case AxesTextOrientation.perpendicular:\n                        set$3(this._textPosition, 0, (0.5 - position) * size, 0);\n                        this._textOffset[0] = -width / 2;\n                        if (this._isDiscrete[axisId]) {\n                            this._textOffset[1] = -maxGlyphTop / 2;\n                        }\n                        else {\n                            this._textOffset[1] = label == 0 ? -maxGlyphTop : label == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n                        }\n                        break;\n                }\n                const pickId = PickHelper.nextPickId();\n                PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n                this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n                this._pickLabel.push(axisId);\n                this._pickLabel.push(label);\n                TextHelper.addString(this._font, text, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale, this._textOffset, null, this._vec4);\n                glyphOffset += text.length;\n            }\n            return glyphOffset;\n        }\n        _updateGridTicks(axisId, dataView, indices, offset) {\n            this._gridTicksIndexOffsets[axisId] = offset * 6;\n            if (this._gridTicksPositions[axisId]) {\n                const axes = create$3();\n                const positions = this._gridTicksPositions[axisId];\n                const isAxisReversed = this.isAxisReversed[axisId];\n                let vertexOffset = offset * 4;\n                for (let position = 0; position < positions.length - 1; position++) {\n                    const left = isAxisReversed ? 1 - positions[position + 1] - 0.5 : positions[position] - 0.5;\n                    const right = isAxisReversed ? 1 - positions[position] - 0.5 : positions[position + 1] - 0.5;\n                    axes[axisId] = position + 1;\n                    const pickId = PickHelper.nextPickId();\n                    PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n                    this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                    this._pickGrid.push(axes[0]);\n                    this._pickGrid.push(axes[1]);\n                    this._pickGrid.push(axes[2]);\n                    let indexOffset = offset * 6;\n                    for (let j = 0; j < this._indexTemplate.length; j++) {\n                        indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n                    }\n                    set$2(this._bounds, left + 0.5, 0, right + 0.5, 1);\n                    this._translation[0] = left;\n                    this._translation[1] = 0.5;\n                    this._translation[2] = 0;\n                    this._texCoord[0] = left + 0.5;\n                    this._texCoord[1] = 1;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = right;\n                    this._texCoord[0] = right + 0.5;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = left;\n                    this._translation[1] = -0.5;\n                    this._texCoord[0] = left + 0.5;\n                    this._texCoord[1] = 0;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    this._translation[0] = right;\n                    this._texCoord[0] = right + 0.5;\n                    PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                    PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n                    PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                    PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                    PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                    vertexOffset++;\n                    offset++;\n                }\n            }\n            this._gridTicksIndexCounts[axisId] = offset * 6 - this._gridTicksIndexOffsets[axisId];\n            return offset;\n        }\n        _updateGridFace(axisId, faceId, dataView, indices, offset) {\n            set$3(this._translation, 0, 0, 0);\n            this._gridFaceIndexOffsets[faceId] = offset * 6;\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n                const axes = create$3();\n                negate(this._normal, Quad$2.FACE_NORMALS[faceId]);\n                const positions2 = this._gridTicksPositions[axisId2];\n                const positions3 = this._gridTicksPositions[axisId3];\n                const isAxisReversed2 = this.isAxisReversed[axisId2];\n                const isAxisReversed3 = this.isAxisReversed[axisId3];\n                for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n                    const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n                    const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n                    axes[axisId2] = position2 + 1;\n                    let vertexOffset = offset * 4;\n                    for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n                        const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n                        const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n                        axes[axisId3] = position3 + 1;\n                        const pickId = PickHelper.nextPickId();\n                        PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n                        this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n                        this._pickGrid.push(axes[0]);\n                        this._pickGrid.push(axes[1]);\n                        this._pickGrid.push(axes[2]);\n                        let indexOffset = offset * 6;\n                        for (let i = 0; i < this._indexTemplate.length; i++) {\n                            indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n                        }\n                        set$2(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n                        this._translation[axisId2] = min2;\n                        this._translation[axisId3] = max3;\n                        this._texCoord[0] = min2 + 0.5;\n                        this._texCoord[1] = max3 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = max2;\n                        this._texCoord[0] = max2 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = min2;\n                        this._translation[axisId3] = min3;\n                        this._texCoord[0] = min2 + 0.5;\n                        this._texCoord[1] = min3 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        this._translation[axisId2] = max2;\n                        this._texCoord[0] = max2 + 0.5;\n                        PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n                        PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n                        PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n                        PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n                        PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n                        vertexOffset++;\n                        offset++;\n                    }\n                }\n            }\n            this._gridFaceIndexCounts[faceId] = offset * 6 - this._gridFaceIndexOffsets[faceId];\n            return offset;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Glyph {\n        toJSON() {\n            return {\n                key: this.key,\n                char: this.char,\n                width: this.width,\n                height: this.height,\n                top: this.top,\n                left: this.left,\n                advance: this.advance,\n                u0: this.u0,\n                v0: this.v0,\n                u1: this.u1,\n                v1: this.v1,\n            };\n        }\n    }\n    let FontVisual$2 = class FontVisual {\n        update() { }\n        constructor(font) {\n            this.font = font;\n        }\n    };\n    class Font {\n        get atlas() { return this._rasterizer.fontAtlas; }\n        get count() { return this._chars.size; }\n        constructor(core, rasterizer) {\n            this._core = core;\n            this._rasterizer = rasterizer;\n            this._chars = new Set();\n            this._previousSize = 0;\n            this.glyphs = {};\n        }\n        addGlyph(char) {\n            if (!this._chars.has(char)) {\n                this._chars.add(char);\n                this._rasterizer.draw(char);\n                this._hasChanged = true;\n            }\n        }\n        update() {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._core.log.write(LogLevel.info, `${this.name} added ${this._chars.size - this._previousSize} new glyphs`);\n                this._previousSize = this._chars.size;\n                if (this.hasChangedCallback) {\n                    this.hasChangedCallback();\n                }\n            }\n        }\n        toJSON() {\n            const glyphs = [];\n            for (let key in this.glyphs) {\n                const glyph = this.glyphs[key];\n                glyphs.push(glyph.toJSON());\n            }\n            return {\n                name: this.name,\n                size: this.size,\n                border: this.border,\n                glyphs: glyphs,\n                edgeValue: this.edgeValue,\n            };\n        }\n    }\n    class FontAtlas {\n        constructor(width, height) {\n            const canvas = document.createElement(\"canvas\");\n            canvas.width = width;\n            canvas.height = height;\n            const context = canvas.getContext(\"2d\");\n            context.clearRect(0, 0, width, height);\n            this.imageData = context.getImageData(0, 0, width, height);\n            this.x = 0;\n            this.top = new Uint16Array(width);\n        }\n    }\n    class FontRasterizer {\n        get font() { return this._font; }\n        get fontAtlas() { return this._fontAtlas; }\n        constructor(core, options) {\n            let start = performance.now();\n            this._core = core;\n            this._fontAtlas = options.fontAtlas;\n            this._fontSize = options.fontSize;\n            this._border = options.border;\n            this._fontFamily = options.fontFamily;\n            this._fontWeight = options.fontWeight;\n            this._fontStyle = options.fontStyle;\n            this._baseline = options.baseline;\n            this._maxDistance = options.maxDistance;\n            this._edgeValue = options.edgeValue;\n            this._font = new Font(core, this);\n            this._font.name = `${this._fontFamily}${this._fontSize}${this._fontWeight == \"normal\" ? \"\" : this._fontWeight}${this._fontStyle == \"normal\" ? \"\" : this._fontStyle}`.replace(/[^a-z0-9,]/ig, \"\").toLowerCase();\n            this._font.size = this._fontSize;\n            this._font.border = this._border;\n            this._font.edgeValue = this._edgeValue;\n            const glyphRasterizerOptions = {\n                baseline: this._baseline,\n                border: this._border,\n                edgeValue: this._edgeValue,\n                fontFamily: this._fontFamily,\n                fontSize: this._fontSize,\n                fontStyle: this._fontStyle,\n                fontWeight: this._fontWeight,\n                maxDistance: this._maxDistance,\n            };\n            this._glyphRasterizer = new GlyphRasterizer(core, glyphRasterizerOptions);\n            this._core.log.write(LogLevel.info, `font rasterizer ${Math.round(window.performance.now() - start)}ms`);\n        }\n        draw(char) {\n            const glyph = this._glyphRasterizer.draw(char);\n            const texWidth = glyph.width + 2 * this._border;\n            const texHeight = glyph.height + 2 * this._border;\n            const width = this._fontAtlas.imageData.width;\n            const height = this._fontAtlas.imageData.height;\n            if (this._fontAtlas.x + texWidth > width) {\n                this._fontAtlas.x = 0;\n            }\n            let y = 0;\n            for (let x = this._fontAtlas.x; x < this._fontAtlas.x + texWidth; x++) {\n                y = Math.max(y, this._fontAtlas.top[x]);\n            }\n            if (y + texHeight > height) {\n                this._core.log.write(LogLevel.warn, `${this._font.name} height overflow`);\n            }\n            for (let x = this._fontAtlas.x; x < this._fontAtlas.x + texWidth; x++) {\n                this._fontAtlas.top[x] = y + texHeight;\n            }\n            glyph.u0 = this._fontAtlas.x / width;\n            glyph.v0 = y / height;\n            glyph.u1 = (this._fontAtlas.x + texWidth) / width;\n            glyph.v1 = (y + texHeight) / height;\n            this._font.glyphs[char] = glyph;\n            for (let i = 0; i < glyph.distances.length; i++) {\n                const distance = glyph.distances[i];\n                const dataX = i % texWidth;\n                const dataY = Math.floor(i / texWidth);\n                const offset = (this._fontAtlas.x + dataX + (y + dataY) * width) * 4;\n                this._fontAtlas.imageData.data[offset + 0] = distance;\n                this._fontAtlas.imageData.data[offset + 1] = distance;\n                this._fontAtlas.imageData.data[offset + 2] = distance;\n                this._fontAtlas.imageData.data[offset + 3] = 0xff;\n            }\n            this._fontAtlas.x += texWidth;\n        }\n    }\n    class GlyphRasterizer {\n        constructor(core, options) {\n            let start = performance.now();\n            this._core = core;\n            this._fontSize = options.fontSize;\n            this._border = options.border;\n            this._fontFamily = options.fontFamily;\n            this._fontWeight = options.fontWeight;\n            this._fontStyle = options.fontStyle;\n            this._baseline = options.baseline;\n            this._maxDistance = options.maxDistance;\n            this._edgeValue = options.edgeValue;\n            this._size = this._fontSize + this._border * 2;\n            this._size += this._border * 2;\n            this._gridOuter = new Float64Array(this._size * this._size);\n            this._gridInner = new Float64Array(this._size * this._size);\n            this._f = new Float64Array(this._size);\n            this._z = new Float64Array(this._size + 1);\n            this._v = new Uint16Array(this._size);\n            const canvas = document.createElement(\"canvas\");\n            canvas.width = canvas.height = this._size;\n            this._context = canvas.getContext(\"2d\", { willReadFrequently: true });\n            this._context.font = `${this._fontStyle} ${this._fontWeight} ${this._fontSize}px ${this._fontFamily} `;\n            this._context.textBaseline = this._baseline;\n            this._context.textAlign = \"left\";\n            this._context.fillStyle = \"black\";\n            this._core.log.write(LogLevel.info, `glyph rasterizer ${Math.round(window.performance.now() - start)}ms`);\n        }\n        draw(char) {\n            const textMetrics = this._context.measureText(char);\n            const glyphLeft = 0;\n            const glyphTop = Math.floor(textMetrics.actualBoundingBoxAscent);\n            let glyphWidth = Math.ceil(textMetrics.actualBoundingBoxRight);\n            let glyphHeight = Math.ceil(textMetrics.actualBoundingBoxAscent) + Math.ceil(textMetrics.actualBoundingBoxDescent);\n            glyphWidth = Math.min(this._size - this._border, glyphWidth);\n            glyphHeight = Math.min(this._size - this._border, glyphHeight);\n            const width = glyphWidth + 2 * this._border;\n            const height = glyphHeight + 2 * this._border;\n            const length = width * height;\n            const distances = new Uint8ClampedArray(length);\n            const gradientsX = new Uint8ClampedArray(length);\n            const gradientsY = new Uint8ClampedArray(length);\n            const pixels = new Uint8ClampedArray(length);\n            const glyph = new Glyph();\n            glyph.char = char;\n            glyph.key = char.codePointAt(0);\n            glyph.distances = distances;\n            glyph.gradientsX = gradientsX;\n            glyph.gradientsY = gradientsY;\n            glyph.pixels = pixels;\n            glyph.width = glyphWidth;\n            glyph.height = glyphHeight;\n            glyph.top = glyphTop;\n            glyph.left = glyphLeft;\n            glyph.advance = textMetrics.width;\n            if (glyphWidth == 0 || glyphHeight == 0) {\n                return glyph;\n            }\n            this._context.clearRect(this._border, this._border, glyphWidth, glyphHeight);\n            this._context.fillText(char, this._border, this._border + glyphTop);\n            const imgData = this._context.getImageData(this._border, this._border, glyphWidth, glyphHeight);\n            for (let i = 0; i < length; i++) {\n                this._gridOuter[i] = Number.MAX_VALUE;\n                this._gridInner[i] = 0;\n            }\n            for (let y = 0; y < glyphHeight; y++) {\n                for (let x = 0; x < glyphWidth; x++) {\n                    const a = imgData.data[4 * (y * glyphWidth + x) + 3] / 0xff;\n                    if (a > 0) {\n                        const j = (y + this._border) * width + x + this._border;\n                        if (a == 1) {\n                            this._gridOuter[j] = 0;\n                            this._gridInner[j] = Number.MAX_VALUE;\n                        }\n                        else {\n                            const d = 0.5 - a;\n                            this._gridOuter[j] = d > 0 ? d * d : 0;\n                            this._gridInner[j] = d < 0 ? d * d : 0;\n                            pixels[j] = 0xff;\n                        }\n                    }\n                }\n            }\n            this._edt(this._gridOuter, 0, 0, width, height, width, this._f, this._v, this._z);\n            this._edt(this._gridInner, this._border, this._border, glyphWidth, glyphHeight, width, this._f, this._v, this._z);\n            const distances2 = new Float32Array(length);\n            for (let i = 0; i < length; i++) {\n                const distance = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n                distances[i] = Math.round(this._edgeValue - distance * 0xff / this._maxDistance);\n                distances2[i] = distance;\n            }\n            for (let i = 0; i < length; i++) {\n                const x = i % width;\n                const y = Math.floor(i / width);\n                const d = distances2[i];\n                const sign = d < 0 ? -1 : 1;\n                const x0 = x > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n                const x1 = x < width - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n                const y0 = y > 0 ? distances2[i - width] : Number.MAX_VALUE;\n                const y1 = y < height - 1 ? distances2[i + width] : Number.MAX_VALUE;\n                let gradientX = sign * x0 < sign * x1 ? d - x0 : x1 - d;\n                let gradientY = sign * y0 < sign * y1 ? y0 - d : d - y1;\n                gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 0xff);\n                gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 0xff);\n            }\n            return glyph;\n        }\n        _edt(data, x0, y0, width, height, gridSize, f, v, z) {\n            for (let x = x0; x < x0 + width; x++)\n                this._edt1d(data, y0 * gridSize + x, gridSize, height, f, v, z);\n            for (let y = y0; y < y0 + height; y++)\n                this._edt1d(data, y * gridSize + x0, 1, width, f, v, z);\n        }\n        _edt1d(grid, offset, stride, n, f, v, z) {\n            v[0] = 0;\n            z[0] = -Number.MAX_VALUE;\n            z[1] = Number.MAX_VALUE;\n            f[0] = grid[offset];\n            for (let q = 1, k = 0, s = 0; q < n; q++) {\n                f[q] = grid[offset + q * stride];\n                const q2 = q * q;\n                do {\n                    const r = v[k];\n                    s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n                } while (s <= z[k] && --k > -1);\n                k++;\n                v[k] = q;\n                z[k] = s;\n                z[k + 1] = Number.MAX_VALUE;\n            }\n            for (let q = 0, k = 0; q < n; q++) {\n                while (z[k + 1] < q) {\n                    k++;\n                }\n                const r = v[k];\n                const qr = q - r;\n                grid[offset + q * stride] = f[r] + qr * qr;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ManipulationProcessor {\n        get manipulators() { return this._manipulators; }\n        get count() { return this._count; }\n        get isDragging() { return this._isDragging; }\n        constructor(core) {\n            this._core = core;\n            this._count = 0;\n            this._centroid = create$3();\n            this._previousCentroid = create$3();\n            this._relativePositionToCentroid = create$3();\n            this._directionToCentroid = create$3();\n            this._previousDirectionToCentroid = create$3();\n            this._manipulators = {};\n            this._removedManipulators = [];\n            this.cumulativeTranslation = create$3();\n            this.translationDelta = create$3();\n            this.centroid = create$3();\n            this.maxScale = Number.MAX_VALUE;\n            this.twistAxis = fromValues$3(0, 0, 1);\n            this.initialize();\n        }\n        update(elapsedTime, manipulators) {\n            for (const key in this._manipulators) {\n                const manipulator = this._manipulators[key];\n                if (!manipulators[manipulator.id]) {\n                    if (this.removeManipulator) {\n                        this.removeManipulator(manipulator);\n                    }\n                    this._removedManipulators.push(manipulator.id);\n                }\n            }\n            if (this._removedManipulators.length > 0) {\n                for (let i = 0; i < this._removedManipulators.length; i++) {\n                    delete this._manipulators[this._removedManipulators[i]];\n                    this._count--;\n                }\n                this._removedManipulators = [];\n            }\n            for (const key in manipulators) {\n                const manipulator = manipulators[key];\n                if (!this._manipulators[manipulator.id]) {\n                    if (!this.addManipulator || this.addManipulator(manipulator)) {\n                        copy$3(manipulator.initialPosition, manipulator.position);\n                        this._manipulators[manipulator.id] = manipulator;\n                        this._count++;\n                    }\n                }\n            }\n            set$3(this.translationDelta, 0, 0, 0);\n            this.scaleDelta = 0;\n            this.twistDelta = 0;\n            if (this._count > 0) {\n                if (this._previousCount > 0) {\n                    if (this.prepareManipulation) {\n                        this.prepareManipulation();\n                    }\n                    this._process();\n                    if (this.processManipulation) {\n                        this.processManipulation(elapsedTime);\n                    }\n                }\n                else {\n                    this.initialize();\n                    if (this.beginManipulation) {\n                        this.beginManipulation();\n                    }\n                }\n            }\n            else {\n                if (this._previousCount > 0) {\n                    if (this.endManipulation) {\n                        this.endManipulation();\n                    }\n                }\n            }\n            this._isDragging = (this._count == 1 && squaredLength(this.cumulativeTranslation) > this._core.config.dragToleranceSquared) || this._count > 1;\n            this._previousCount = this._count;\n        }\n        initialize() {\n            set$3(this.centroid, 0, 0, 0);\n            set$3(this.cumulativeTranslation, 0, 0, 0);\n            this.cumulativeScale = 1;\n            this.cumulativeTwist = 0;\n        }\n        _process() {\n            if (this._previousCount > 0) {\n                let persisted = 0;\n                for (const key in this._manipulators) {\n                    const manipulator = this._manipulators[key];\n                    if (manipulator.isPersisted) {\n                        persisted++;\n                    }\n                }\n                const removed = this._previousCount - persisted;\n                if (persisted > 0) {\n                    if (removed > 0) {\n                        copy$3(this._centroid, this._previousCentroid);\n                    }\n                    else {\n                        set$3(this._centroid, 0, 0, 0);\n                        for (const key in this._manipulators) {\n                            const manipulator = this._manipulators[key];\n                            if (manipulator.isPersisted) {\n                                add(this._centroid, this._centroid, manipulator.position);\n                            }\n                        }\n                        scale(this._centroid, this._centroid, 1 / persisted);\n                    }\n                    for (const key in this._manipulators) {\n                        const manipulator = this._manipulators[key];\n                        if (manipulator.isPersisted) {\n                            manipulator.maxTranslationSquared = Math.max(manipulator.maxTranslationSquared, squaredDistance(manipulator.position, manipulator.initialPosition));\n                            add(this.translationDelta, this.translationDelta, manipulator.position);\n                            subtract(this.translationDelta, this.translationDelta, manipulator.previousPosition);\n                            subtract(this._relativePositionToCentroid, manipulator.position, this._centroid);\n                            const distanceToCentroidSquared = squaredLength(this._relativePositionToCentroid);\n                            if (distanceToCentroidSquared < this._core.config.manipulatorMinRelativeDistanceSquared) {\n                                this.scaleDelta += 1;\n                            }\n                            else {\n                                const distanceToCentroid = Math.sqrt(distanceToCentroidSquared);\n                                const previousDistanceToCentroidSquared = squaredLength(manipulator.previousPositionRelativeToCentroid);\n                                const previousDistanceToCentroid = Math.sqrt(previousDistanceToCentroidSquared);\n                                this.scaleDelta += distanceToCentroid / previousDistanceToCentroid;\n                                scale(this._directionToCentroid, this._relativePositionToCentroid, 1 / distanceToCentroid);\n                                scale(this._previousDirectionToCentroid, manipulator.previousPositionRelativeToCentroid, 1 / previousDistanceToCentroid);\n                                this.twistDelta += AngleHelper.signedAngleBetweenVectors(this._previousDirectionToCentroid, this._directionToCentroid, this.twistAxis);\n                            }\n                        }\n                    }\n                    scale(this.translationDelta, this.translationDelta, 1 / persisted);\n                    add(this.cumulativeTranslation, this.cumulativeTranslation, this.translationDelta);\n                    this.scaleDelta /= persisted;\n                    this.cumulativeScale = MathHelper.clamp(this.cumulativeScale * this.scaleDelta, this.minScale, this.maxScale);\n                    this.scaleDelta -= 1;\n                    this.twistDelta /= persisted;\n                    this.cumulativeTwist += this.twistDelta;\n                }\n            }\n            set$3(this.centroid, 0, 0, 0);\n            for (const key in this._manipulators) {\n                const manipulator = this._manipulators[key];\n                add(this.centroid, this.centroid, manipulator.position);\n            }\n            scale(this.centroid, this.centroid, 1 / this._count);\n            for (const key in this._manipulators) {\n                const manipulator = this._manipulators[key];\n                subtract(manipulator.positionRelativeToCentroid, manipulator.position, this.centroid);\n            }\n            copy$3(this._previousCentroid, this.centroid);\n            for (const key in this._manipulators) {\n                const manipulator = this._manipulators[key];\n                manipulator.isPersisted = true;\n                copy$3(manipulator.previousPosition, manipulator.position);\n                copy$3(manipulator.previousRotationAxis, manipulator.rotationAxis);\n                copy$3(manipulator.previousPositionRelativeToCentroid, manipulator.positionRelativeToCentroid);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class MouseWheel {\n        constructor(core) {\n            this._core = core;\n            this._previousTotal = 0;\n            this.total = 0;\n        }\n        initialize(element) {\n            element.addEventListener(\"wheel\", e => {\n                e.preventDefault();\n                const wheelEvent = e;\n                this.total += wheelEvent.deltaY;\n            }, { passive: false });\n        }\n        update(elapsedTime) {\n            const total = this.total;\n            this.delta = total - this._previousTotal;\n            this._previousTotal = total;\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`mse whl ${this.total < 0 ? \"\" : \" \"}${Math.round(this.total)}`);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Manipulator {\n        constructor() {\n            this.pickedIndex = 0;\n            this.maxTranslationSquared = 0;\n            this.initialPosition = create$3();\n            this.position = create$3();\n            this.previousPosition = create$3();\n            this.holdOrigin = create$3();\n            this.positionRelativeToCentroid = create$3();\n            this.previousPositionRelativeToCentroid = create$3();\n            this.rotationAxis = create$3();\n            this.previousRotationAxis = create$3();\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Pointers {\n        get hoverX() { return this._hoverX; }\n        ;\n        get hoverY() { return this._hoverY; }\n        ;\n        get hoverId() { return this._hoverId; }\n        ;\n        constructor(core, manipulators) {\n            this._core = core;\n            this._manipulators = manipulators;\n        }\n        initialize(element) {\n            this._element = element;\n            element.addEventListener(\"pointerdown\", (e) => this._handlePointerDown(e), { passive: true });\n            element.addEventListener(\"pointermove\", (e) => this._handlePointerMove(e), { passive: true });\n            element.addEventListener(\"pointerup\", (e) => this._handlePointerUp(e), { passive: true });\n            element.addEventListener(\"pointercancel\", (e) => this._handlePointerCancel(e), { passive: true });\n            element.addEventListener(\"pointerleave\", (e) => this._handlePointerLeave(e), { passive: true });\n            element.addEventListener(\"pointerout\", (e) => this._handlePointerOut(e), { passive: true });\n        }\n        update(elapsedTime) {\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`pen rot  ${(this._tiltX | 0).toFixed(3)},${(this._tiltY | 0).toFixed(3)},${(this._twist | 0).toFixed(3)}`);\n                this._core.debugText.addLine(`hov pos  ${this.hoverX ? `${this.hoverX.toFixed(3)},${this.hoverY.toFixed(3)}px` : \"\"}`);\n            }\n        }\n        _handlePointerDown(e) {\n            this._element.focus();\n            const devicePixelRatio = this._core.renderer.devicePixelRatio;\n            const manipulator = new Manipulator();\n            const id = e.pointerId;\n            const x = e.offsetX * devicePixelRatio;\n            const y = e.offsetY * devicePixelRatio;\n            manipulator.id = id;\n            manipulator.position[0] = x;\n            manipulator.position[1] = y;\n            manipulator.type = e.pointerType;\n            manipulator.button = e.button;\n            manipulator.shiftKey = e.shiftKey;\n            manipulator.ctrlKey = e.ctrlKey;\n            manipulator.altKey = e.altKey;\n            manipulator.event = e;\n            this._manipulators[id] = manipulator;\n            this._hoverId = id;\n            this._hoverX = x;\n            this._hoverY = y;\n        }\n        _handlePointerMove(e) {\n            const devicePixelRatio = this._core.renderer.devicePixelRatio;\n            const x = e.offsetX * devicePixelRatio;\n            const y = e.offsetY * devicePixelRatio;\n            const id = e.pointerId;\n            const manipulator = this._manipulators[id];\n            if (manipulator) {\n                manipulator.position[0] = x;\n                manipulator.position[1] = y;\n                manipulator.event = e;\n            }\n            switch (e.pointerType) {\n                case \"mouse\":\n                    this._hoverId = id;\n                    this._hoverX = x;\n                    this._hoverY = y;\n                    break;\n                case \"pen\":\n                    this._hoverId = id;\n                    this._hoverX = x;\n                    this._hoverY = y;\n                    this._tiltX = e.tiltX;\n                    this._tiltY = e.tiltY;\n                    this._twist = e.twist;\n                    break;\n            }\n        }\n        _handlePointerUp(e) {\n            const manipulator = this._manipulators[e.pointerId];\n            if (manipulator) {\n                manipulator.event = e;\n            }\n            this._remove(e.pointerId);\n        }\n        _handlePointerCancel(e) {\n            this._remove(e.pointerId);\n        }\n        _handlePointerLeave(e) {\n            this._resetHover();\n            this._remove(e.pointerId);\n        }\n        _handlePointerOut(e) {\n            this._resetHover();\n            this._remove(e.pointerId);\n        }\n        _resetHover() {\n            this._hoverId = null;\n            this._hoverX = null;\n            this._hoverY = null;\n        }\n        _remove(pointerId) {\n            const manipulator = this._manipulators[pointerId];\n            if (manipulator) {\n                delete this._manipulators[pointerId];\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AnimationHelper {\n        static smoothStep(value) {\n            return value * value * (3 - 2 * value);\n        }\n        static damp(value, target, threshold, dampening) {\n            if (Math.abs(target) < threshold) {\n                return MathHelper.lerp(value, 0, dampening);\n            }\n            else {\n                return MathHelper.lerp(value, target, dampening);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Keyboard {\n        constructor(core) {\n            this._core = core;\n            this._pressedKeys = new Set();\n            this._previousPressedKeys = new Set();\n        }\n        initialize(element) {\n            element.addEventListener(\"keydown\", (e) => { this._handleKeyDown(e); }, false);\n            element.addEventListener(\"keyup\", (e) => { this._handleKeyUp(e); }, false);\n        }\n        update(elapsedTime) {\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`key tot  ${this._pressedKeys.size}`);\n            }\n        }\n        isKeyDown(key) {\n            return this._pressedKeys.has(key);\n        }\n        wasKeyReleased(key) {\n            if (this._pressedKeys.has(key)) {\n                if (!this._previousPressedKeys.has(key)) {\n                    this._previousPressedKeys.add(key);\n                    return true;\n                }\n            }\n            else {\n                this._previousPressedKeys.delete(key);\n            }\n            return false;\n        }\n        _handleKeyDown(e) {\n            const keyboardEvent = e;\n            const key = keyboardEvent.key;\n            if (!this._pressedKeys.has(key)) {\n                this._pressedKeys.add(key);\n            }\n        }\n        _handleKeyUp(e) {\n            const keyboardEvent = e;\n            const key = keyboardEvent.key;\n            if (this._pressedKeys.has(key)) {\n                this._pressedKeys.delete(key);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Manager {\n        constructor(core) {\n            this._manipulators = {};\n            this._core = core;\n            this._vec3 = create$3();\n            this._manipulationProcessor = new ManipulationProcessor(core);\n            this._manipulators = {};\n            this._pointers = new Pointers(core, this._manipulators);\n            this._pointers.initialize(core.container);\n            this._mouseWheel = new MouseWheel(core);\n            this._mouseWheel.initialize(core.container);\n            this._keyboard = new Keyboard(core);\n            this._keyboard.initialize(core.container);\n            this.isPickingEnabled = true;\n            this.mouseWheelZoomScale = this._core.config.mouseWheelZoomScale;\n            this.mouseWheelRotationScale = this._core.config.mouseWheelRotationScale;\n            this.multiTouchZoomScale = this._core.config.multiTouchZoomScale;\n            this.pickHoldDelay = this._core.config.pickHoldDelay;\n            this.pickSelectDelay = this._core.config.pickSelectDelay;\n            const rightButton = 2;\n            this.singleTouchAction = (manipulator) => {\n                if ((manipulator.type == \"mouse\" && manipulator.button == rightButton) || manipulator.shiftKey || manipulator.ctrlKey) {\n                    return SingleTouchAction.translate;\n                }\n                else if (manipulator.altKey || (manipulator.type == \"pen\" && manipulator.button == rightButton)) {\n                    return SingleTouchAction.lasso;\n                }\n                else {\n                    return SingleTouchAction.rotate;\n                }\n            };\n            this.mouseWheelAction = (keyboard) => {\n                if (this._keyboard.isKeyDown(\"Control\")) {\n                    return MouseWheelAction.rotateY;\n                }\n                else {\n                    return MouseWheelAction.zoom;\n                }\n            };\n            this.lassoPickType = PickType.data;\n            this._thumbstickX = 0;\n            this._previousControllerButtonPressed = [false, false, false, false];\n            this._quat0 = create$1();\n            this._quat1 = create$1();\n        }\n        update(elapsedTime, xrFrame) {\n            if (xrFrame) {\n                const inputSources = this._core.webXRSession.inputSources;\n                if (inputSources.length > 0 && this._core.renderer.controllers.length > 0) {\n                    const inputSource = inputSources[0];\n                    const controllerVisual = this._core.renderer.controllers[0];\n                    if (inputSource.gripSpace && inputSource.targetRayMode == \"tracked-pointer\") {\n                        const gripPose = xrFrame.getPose(inputSource.gripSpace, this._core.renderer.webXRReferenceSpace);\n                        if (gripPose) {\n                            controllerVisual.mMatrix = gripPose.transform.matrix;\n                        }\n                        const gamepad = inputSource.gamepad;\n                        this._core.renderer.isPickingEnabled = false;\n                        const rayPose = xrFrame.getPose(inputSource.targetRaySpace, this._core.renderer.webXRReferenceSpace);\n                        if (rayPose) {\n                            controllerVisual.rayMMatrix = rayPose.transform.matrix;\n                            if (gamepad.buttons[0].value > 0 && this.isPickingEnabled) {\n                                this._core.renderer.pickVMatrix = rayPose.transform.inverse.matrix;\n                                this._core.renderer.isPickingEnabled = true;\n                            }\n                        }\n                        const threshold = 0.2;\n                        const dampening = Math.min(0.015 * elapsedTime, 1);\n                        this._thumbstickX = AnimationHelper.damp(this._thumbstickX, gamepad.axes[2], threshold, dampening);\n                        if (this._thumbstickX != 0) {\n                            setAxisAngle(this._quat0, Constants.VECTOR3_UNITY, 0.01 * this._thumbstickX * elapsedTime);\n                            this._core.getModelRotation(this._quat1);\n                            multiply(this._quat1, this._quat0, this._quat1);\n                            this._core.setModelRotation(this._quat1, true);\n                        }\n                        if (gamepad.buttons[2].pressed) {\n                            if (!this._previousControllerButtonPressed[2]) {\n                                this._previousControllerButtonPressed[2] = true;\n                                if (this.controllerButtonPressedCallback) {\n                                    this.controllerButtonPressedCallback(2);\n                                }\n                            }\n                        }\n                        else {\n                            this._previousControllerButtonPressed[2] = false;\n                        }\n                    }\n                }\n            }\n            else {\n                const camera = this._core.camera;\n                this._manipulationProcessor.update(elapsedTime, this._manipulators);\n                this._pointers.update(elapsedTime);\n                this._mouseWheel.update(elapsedTime);\n                this._keyboard.update(elapsedTime);\n                if (this._mouseWheel.delta != 0) {\n                    switch (this.mouseWheelAction(this._keyboard)) {\n                        case MouseWheelAction.zoom:\n                            if (this._pointers.hoverX, this._pointers.hoverY) {\n                                camera.zoom(this._mouseWheel.delta * this.mouseWheelZoomScale, this._pointers.hoverX, this._pointers.hoverY);\n                            }\n                            break;\n                        case MouseWheelAction.rotateY:\n                            setAxisAngle(this._quat0, Constants.VECTOR3_UNITY, this._mouseWheel.delta * this.mouseWheelRotationScale);\n                            camera.getOrbit(this._quat1);\n                            multiply(this._quat1, this._quat1, this._quat0);\n                            camera.setOrbit(this._quat1, true);\n                            break;\n                    }\n                }\n                const count = this._manipulationProcessor.count;\n                if (count == 0) {\n                    if (this._isLassoPicking) {\n                        this._isLassoPicking = false;\n                        this._core.renderer.isLassoPicking = false;\n                        const x0 = Math.min(this._lassoX0, this._lassoX1);\n                        const y0 = Math.min(this._lassoY0, this._lassoY1);\n                        const x1 = Math.max(this._lassoX0, this._lassoX1);\n                        const y1 = Math.max(this._lassoY0, this._lassoY1);\n                        if (x1 - x0 > 0 && y1 - y0 > 0) {\n                            const sets = this._core.pickLasso(x0, y0, x1, y1, this.lassoPickType);\n                            const result = {\n                                x0: x0,\n                                y0: y0,\n                                x1: x1,\n                                y1: y1,\n                                pickType: this.lassoPickType,\n                                ids: sets,\n                                manipulator: this._manipulator,\n                            };\n                            this.pickLassoCallback(result);\n                        }\n                    }\n                }\n                else if (count == 1) {\n                    const translationDelta = this._manipulationProcessor.translationDelta;\n                    if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n                        const manipulators = this._manipulationProcessor.manipulators;\n                        for (const key in manipulators) {\n                            const manipulator = manipulators[key];\n                            switch (this.singleTouchAction(manipulator)) {\n                                case SingleTouchAction.rotate:\n                                    camera.rotate(translationDelta);\n                                    break;\n                                case SingleTouchAction.translate:\n                                    camera.translate(translationDelta);\n                                    break;\n                                case SingleTouchAction.lasso:\n                                    if (this.pickLassoCallback) {\n                                        if (!this._isLassoPicking) {\n                                            this._isLassoPicking = true;\n                                            this._core.renderer.isLassoPicking = true;\n                                            this._lassoX0 = manipulator.position[0];\n                                            this._lassoY0 = manipulator.position[1];\n                                        }\n                                        this._lassoX1 = manipulator.position[0];\n                                        this._lassoY1 = manipulator.position[1];\n                                        this._core.renderer.lassoX0 = Math.min(this._lassoX0, this._lassoX1);\n                                        this._core.renderer.lassoY0 = Math.min(this._lassoY0, this._lassoY1);\n                                        this._core.renderer.lassoX1 = Math.max(this._lassoX0, this._lassoX1);\n                                        this._core.renderer.lassoY1 = Math.max(this._lassoY0, this._lassoY1);\n                                    }\n                                    break;\n                            }\n                            break;\n                        }\n                    }\n                }\n                else {\n                    const translationDelta = this._manipulationProcessor.translationDelta;\n                    const camera = this._core.camera;\n                    if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n                        camera.translate(translationDelta);\n                    }\n                    if (this._manipulationProcessor.scaleDelta != 0) {\n                        const distance = this._manipulationProcessor.scaleDelta * this.multiTouchZoomScale;\n                        camera.zoom(distance, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n                    }\n                    if (this._manipulationProcessor.twistDelta != 0) {\n                        camera.twist(this._manipulationProcessor.twistDelta, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n                    }\n                }\n                if (this.isPickingEnabled && !this._manipulationProcessor.isDragging && !this._isLassoPicking) {\n                    const camera = this._core.camera;\n                    const renderer = this._core.renderer;\n                    if (renderer.isCapturingPickImage) {\n                        camera.updatePickVMatrix(renderer.width / 2, renderer.height / 2);\n                        renderer.pickVMatrix = camera.pickVMatrix;\n                        renderer.isPickingEnabled = true;\n                        this._pickedTime = 0;\n                    }\n                    else if (this._pointers.hoverId > -1) {\n                        const pickingX = this._pointers.hoverX;\n                        const pickingY = this._pointers.hoverY;\n                        camera.updatePickVMatrix(pickingX, pickingY);\n                        renderer.pickVMatrix = camera.pickVMatrix;\n                        renderer.isPickingEnabled = true;\n                        if (this._pickedId != renderer.pickedId) {\n                            this._pickedId = renderer.pickedId;\n                            this._pickedTime = 0;\n                        }\n                        else {\n                            if (this._manipulationProcessor.count == 1) {\n                                this._pickedTime += elapsedTime;\n                                for (const key in this._manipulators) {\n                                    this._manipulator = this._manipulators[key];\n                                    break;\n                                }\n                            }\n                        }\n                        if (this._pickedTime > 0) {\n                            switch (renderer.pickedType) {\n                                case PickType.data:\n                                    if (this._pickedTime > this.pickHoldDelay) {\n                                        renderer.getVertexPosition(this._vec3, this._pickedId);\n                                        this._core.setModelManipulationOrigin(this._vec3);\n                                        this._pickedTime = 0;\n                                    }\n                                    else if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.transitionBuffers.length; i++) {\n                                                const transitionBuffer = renderer.transitionBuffers[i];\n                                                const id = transitionBuffer.pickIdLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = {\n                                                        transitionBuffer: i,\n                                                        id: id,\n                                                        manipulator: this._manipulator,\n                                                    };\n                                                    this._core.log.write(LogLevel.info, `picked id ${result.id}, transition buffer ${i}`);\n                                                    if (this.pickItemCallback) {\n                                                        this.pickItemCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.label:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.labelSets.length; i++) {\n                                                const labelSet = renderer.labelSets[i].label;\n                                                const id = labelSet.pickIdLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = {\n                                                        label: id,\n                                                        set: i,\n                                                        manipulator: this._manipulator,\n                                                    };\n                                                    this._core.log.write(LogLevel.info, `picked label ${result.label}, set ${result.set}`);\n                                                    if (this.pickLabelSetCallback) {\n                                                        this.pickLabelSetCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.axesDivision:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.currentAxes.length; i++) {\n                                                const axes = renderer.currentAxes[i].axes;\n                                                const id = axes.pickGridLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = axes.pickGrid(id);\n                                                    result.axes = i;\n                                                    result.manipulator = this._manipulator;\n                                                    this._core.log.write(LogLevel.info, `picked division (${result.divisionX}, ${result.divisionY}, ${result.divisionZ}), axes ${result.axes}`);\n                                                    if (this.pickAxesGridCallback) {\n                                                        this.pickAxesGridCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.axesTitle:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.currentAxes.length; i++) {\n                                                const axes = renderer.currentAxes[i].axes;\n                                                const id = axes.pickTitleLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = axes.pickTitle(id);\n                                                    result.axes = i;\n                                                    result.manipulator = this._manipulator;\n                                                    this._core.log.write(LogLevel.info, `picked title ${result.axis}, axes ${result.axes}`);\n                                                    if (this.pickAxesTitleCallback) {\n                                                        this.pickAxesTitleCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.axesLabel:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.currentAxes.length; i++) {\n                                                const axes = renderer.currentAxes[i].axes;\n                                                const id = axes.pickLabelLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = axes.pickLabel(id);\n                                                    result.axes = i;\n                                                    result.manipulator = this._manipulator;\n                                                    this._core.log.write(LogLevel.info, `picked label ${result.label}, axis ${result.axis}, axes ${result.axes}`);\n                                                    if (this.pickAxesLabelCallback) {\n                                                        this.pickAxesLabelCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                                case PickType.axesHeading:\n                                    if (this._manipulationProcessor.count == 0) {\n                                        if (this._pickedTime > this.pickSelectDelay) {\n                                            for (let i = 0; i < renderer.currentAxes.length; i++) {\n                                                const axes = renderer.currentAxes[i].axes;\n                                                const id = axes.pickHeadingLookup[this._pickedId];\n                                                if (id > -1) {\n                                                    const result = axes.pickHeading(id);\n                                                    result.axes = i;\n                                                    result.manipulator = this._manipulator;\n                                                    this._core.log.write(LogLevel.info, `picked heading ${result.axis}, axes ${result.axes}`);\n                                                    if (this.pickAxesHeadingCallback) {\n                                                        this.pickAxesHeadingCallback(result);\n                                                    }\n                                                    break;\n                                                }\n                                            }\n                                        }\n                                        this._pickedTime = 0;\n                                    }\n                                    break;\n                            }\n                        }\n                    }\n                    else {\n                        renderer.isPickingEnabled = false;\n                        this._pickedTime = 0;\n                    }\n                }\n                else {\n                    this._core.renderer.isPickingEnabled = false;\n                    this._pickedTime = 0;\n                }\n            }\n            if (this._core.config.isDebugVisible) {\n                this._core.debugText.addLine(`man tot  ${this._manipulationProcessor.count}`);\n                this._core.debugText.addLine(`pck key  ${this._core.renderer.pickedId}`);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Log {\n        constructor(core) {\n            this._core = core;\n        }\n        write(level, value) {\n            if (level >= this._core.config.logLevel) {\n                switch (level) {\n                    case LogLevel.trace:\n                        console.trace(value);\n                        break;\n                    case LogLevel.debug:\n                        console.debug(value);\n                        break;\n                    case LogLevel.info:\n                        console.info(value);\n                        break;\n                    case LogLevel.warn:\n                        console.warn(value);\n                        break;\n                    case LogLevel.error:\n                        console.error(value);\n                        break;\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    var __awaiter$3 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    class Core {\n        get container() { return this._container; }\n        get started() { return this._started; }\n        get debugText() { return this._debugText; }\n        get log() { return this._log; }\n        get totalFrames() { return this._fps.totalFrames; }\n        get camera() { return this._camera; }\n        set camera(value) { this._camera = value; }\n        getModelRotation(value) { copy$1(value, this._modelRotation); }\n        setModelRotation(value, isSmooth) {\n            copy$1(this._modelRotation, value);\n            if (!isSmooth) {\n                copy$1(this._smoothedModelRotation, this._modelRotation);\n            }\n        }\n        getModelScale() { return this._modelScale[0]; }\n        setModelScale(value, isSmooth) {\n            set$3(this._modelScale, value, value, value);\n            if (!isSmooth) {\n                copy$3(this._smoothedModelScale, this._modelScale);\n            }\n        }\n        getModelManipulationOrigin(value) { copy$3(value, this._modelManipulationOrigin); }\n        setModelManipulationOrigin(value) { this._updateManipulationOrigin(value); }\n        getModelPosition(value) { copy$3(value, this._modelPosition); }\n        setModelPosition(value, isSmooth) {\n            copy$3(this._modelPosition, value);\n            if (!isSmooth) {\n                copy$3(this._smoothedModelPosition, this._modelPosition);\n            }\n        }\n        get webXRSession() { return this._webXRSession; }\n        get renderer() { return this._renderer; }\n        set renderer(renderer) {\n            if (this._renderer == renderer) {\n                return;\n            }\n            if (this._renderer) {\n                this.stop();\n                this._renderer.remove();\n            }\n            if (!renderer.isInitialized) {\n                renderer.initialize(this);\n            }\n            if (this._renderer) {\n                renderer.transitionTime = this._renderer.transitionTime;\n                for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n                    const previousTransitionBuffer = this._renderer.transitionBuffers[i];\n                    const transitionBuffer = renderer.createTransitionBuffer(previousTransitionBuffer.currentBuffer.ids);\n                    transitionBuffer.copyFrom(previousTransitionBuffer);\n                    renderer.transitionBuffers.push(transitionBuffer);\n                }\n                const currentAxes = this._renderer.currentAxes;\n                if (currentAxes) {\n                    renderer.currentAxes = [];\n                    for (let i = 0; i < currentAxes.length; i++) {\n                        const axesVisual = currentAxes[i];\n                        const axes = axesVisual.axes;\n                        if (axes instanceof Cartesian3dAxes) {\n                            const cartesian3dAxesVisual = renderer.createCartesian3dAxesVisual(axes);\n                            renderer.currentAxes.push(cartesian3dAxesVisual);\n                        }\n                        else if (axes instanceof Cartesian2dAxes) {\n                            renderer.currentAxes.push(renderer.createCartesian2dAxesVisual(axes));\n                        }\n                    }\n                }\n                const labelSets = this._renderer.labelSets;\n                if (labelSets) {\n                    renderer.labelSets = [];\n                    for (let i = 0; i < labelSets.length; i++) {\n                        renderer.labelSets.push(renderer.createLabelSetVisual(labelSets[i].label));\n                    }\n                }\n                const images = this._renderer.images;\n                if (images) {\n                    renderer.images = [];\n                    for (let i = 0; i < images.length; i++) {\n                        renderer.images.push(renderer.createImageVisual(images[i].image));\n                    }\n                }\n                const fonts = this._renderer.fonts;\n                if (fonts) {\n                    for (const key in fonts) {\n                        const font = fonts[key].font;\n                        renderer.fonts[font.name] = renderer.createFontVisual(font);\n                    }\n                }\n            }\n            else {\n                renderer.fonts[this._font.name] = renderer.createFontVisual(this._font);\n            }\n            if (this._renderer) {\n                this._renderer.finalize();\n            }\n            this._renderer = renderer;\n            this._fps.reset();\n            this.start();\n        }\n        get font() { return this._font; }\n        get paletteResources() { return this._paletteResources; }\n        get config() { return this._config; }\n        get inputManager() { return this._inputManager; }\n        constructor(options) {\n            setMatrixArrayType(Array);\n            this._vec3 = create$3();\n            this._quat = create$1();\n            this._mat4 = create$4();\n            this._container = options && options.container ? options.container : document.body;\n            this._config = new Config$2(this);\n            this._log = new Log(this);\n            this._debugText = new DebugText();\n            this._inputManager = (options && options.useInputManager === false) ? null : new Manager(this);\n            const fontRasterizerOptions = options && options.fontRasterizerOptions ? options.fontRasterizerOptions : {\n                fontAtlas: new FontAtlas(256, 512),\n                fontSize: 24,\n                border: 3,\n                fontFamily: \"\\\"segoe ui semibold\\\", sans-serif\",\n                fontWeight: \"normal\",\n                fontStyle: \"normal\",\n                baseline: \"alphabetic\",\n                maxDistance: 8,\n                edgeValue: 0xc0,\n            };\n            const fontRasterizer = new FontRasterizer(this, fontRasterizerOptions);\n            this._font = fontRasterizer.font;\n            this._paletteResources = new PaletteResources();\n            this._previousTime = 0;\n            this._fps = new Fps(this);\n            this._modelMMatrix = create$4();\n            this._modelPosition = create$3();\n            this._modelRotation = create$1();\n            this._modelScale = create$3();\n            this._smoothedModelPosition = create$3();\n            this._smoothedModelRotation = create$1();\n            this._smoothedModelScale = create$3();\n            this._modelManipulationOrigin = create$3();\n            this._camera = new AltAzimuthCamera(this);\n            this.resetModel(false);\n        }\n        getView(view) {\n            this.getModelPosition(view.position);\n            this.getModelRotation(view.rotation);\n            view.scale = this.getModelScale();\n        }\n        setView(view, isSmooth) {\n            this.setModelPosition(view.position, isSmooth);\n            this.setModelRotation(view.rotation, isSmooth);\n            this.setModelScale(view.scale, isSmooth);\n        }\n        lerpView(from, to, time) {\n            lerp(this._vec3, from.position, to.position, time);\n            this.setModelPosition(this._vec3, false);\n            slerp(this._quat, from.rotation, to.rotation, time);\n            this.setModelRotation(this._quat, false);\n            this.setModelScale(MathHelper.lerp(from.scale, to.scale, time), false);\n        }\n        resetModel(isSmooth) {\n            set$3(this._modelPosition, 0, 0, -this._config.modelDistance);\n            set$3(this._modelScale, this._config.modelSize, this._config.modelSize, this._config.modelSize);\n            set$1(this._modelRotation, 0, 0, 0, 1);\n            if (!isSmooth) {\n                this._syncSmooth();\n            }\n        }\n        resetManipulationOrigin() {\n            if (!exactEquals$1(this._modelManipulationOrigin, Constants.VECTOR3_ZERO)) {\n                this._updateManipulationOrigin(Constants.VECTOR3_ZERO);\n            }\n        }\n        reset(isSmooth) {\n            this.resetModel(isSmooth);\n            this.resetManipulationOrigin();\n            this._camera.reset(isSmooth);\n        }\n        start() {\n            if (!this._started && this._renderer) {\n                this._windowAnimationFrame = window.requestAnimationFrame((currentTime) => this._tick(currentTime));\n                this._started = true;\n                this._log.write(LogLevel.info, \"render loop started\");\n                if (this.startCallback) {\n                    this.startCallback();\n                }\n            }\n        }\n        stop() {\n            if (this._started) {\n                this._started = false;\n                if (this._windowAnimationFrame != null) {\n                    window.cancelAnimationFrame(this._windowAnimationFrame);\n                    this._windowAnimationFrame = null;\n                    this._log.write(LogLevel.info, \"render loop stopped\");\n                }\n                if (this.stopCallback) {\n                    this.stopCallback();\n                }\n            }\n        }\n        checkWebXRSupport() {\n            const xrSystem = navigator.xr;\n            if (xrSystem) {\n                xrSystem.isSessionSupported(\"immersive-vr\").then((supported) => {\n                    if (supported) {\n                        this._log.write(LogLevel.info, \"WebXR supported\");\n                        if (this.webXRSupportedCallback) {\n                            this.webXRSupportedCallback();\n                        }\n                    }\n                });\n            }\n        }\n        requestWebXRSession() {\n            if (this._webXRSession) {\n                this._webXRSession.end();\n            }\n            else {\n                navigator.xr.requestSession(\"immersive-vr\").then((session) => this._webXRSessionStarted(session));\n            }\n        }\n        _webXRSessionStarted(session) {\n            if (this.webXRSessionStartedCallback) {\n                this.webXRSessionStartedCallback();\n            }\n            this._webXRSession = session;\n            session.onend = () => this._webXRSessionEnded();\n            this._renderer.initializeWebXR(session).then(() => {\n                if (this._windowAnimationFrame) {\n                    window.cancelAnimationFrame(this._windowAnimationFrame);\n                    this._windowAnimationFrame = null;\n                }\n                session.requestAnimationFrame((currentTime, xrframe) => this._tick(currentTime, xrframe));\n            });\n            session.oninputsourceschange = (event) => this._webXRInputSourcesChanged(event);\n        }\n        _webXRSessionEnded() {\n            if (this.webXRSessionEndedCallback) {\n                this.webXRSessionEndedCallback();\n            }\n            this._webXRSession = null;\n            this._renderer.controllers.length = 0;\n            this.start();\n        }\n        _webXRInputSourcesChanged(event) {\n            if (event.added.length > 0) {\n                const added = event.added[0];\n                if (added.targetRayMode == \"tracked-pointer\") {\n                    const profiles = added.profiles;\n                    const handedness = added.handedness;\n                    if (this.webXRInputSourceRequestCallback) {\n                        this.webXRInputSourceRequestCallback(profiles, handedness, (response) => {\n                            const options = {\n                                profiles: profiles,\n                                handedness: handedness,\n                                obj: response.obj,\n                                texture: response.texture,\n                            };\n                            const controller = new Controller(this, options);\n                            this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n                        }, (e) => {\n                            this._log.write(LogLevel.error, e);\n                        });\n                    }\n                    else {\n                        const options = {};\n                        const controller = new Controller(this, options);\n                        this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n                    }\n                }\n            }\n            if (event.removed.length > 0) {\n                this.renderer.controllers.length = 0;\n            }\n        }\n        _tick(currentTime, xrFrame) {\n            return __awaiter$3(this, void 0, void 0, function* () {\n                let elapsedTime = currentTime - this._previousTime;\n                this._previousTime = currentTime;\n                if (elapsedTime > 0) {\n                    this.update(elapsedTime, xrFrame);\n                    yield this.render(elapsedTime, xrFrame);\n                }\n                if (xrFrame) {\n                    xrFrame.session.requestAnimationFrame((currentTime, xrframe) => this._tick(currentTime, xrframe));\n                }\n                else if (this._started) {\n                    this._windowAnimationFrame = window.requestAnimationFrame((currentTime) => this._tick(currentTime));\n                }\n            });\n        }\n        update(elapsedTime, xrFrame) {\n            this._renderer.setSize(elapsedTime);\n            if (this.updateCallback) {\n                this.updateCallback(elapsedTime, xrFrame);\n            }\n            if (this._config.isDebugVisible) {\n                this._debugText.clear();\n            }\n            this._fps.update(elapsedTime);\n            if (this._inputManager) {\n                this._inputManager.isPickingEnabled = this._config.isTransitionPickingEnabled || this._renderer.transitionTime == 1;\n                this._inputManager.update(elapsedTime, xrFrame);\n            }\n            let amount = Math.min(elapsedTime * this._config.positionSmoothing, 1);\n            lerp(this._smoothedModelPosition, this._smoothedModelPosition, this._modelPosition, amount);\n            amount = Math.min(elapsedTime * this._config.rotationSmoothing, 1);\n            slerp(this._smoothedModelRotation, this._smoothedModelRotation, this._modelRotation, amount);\n            amount = Math.min(elapsedTime * this._config.scaleSmoothing, 1);\n            lerp(this._smoothedModelScale, this._smoothedModelScale, this._modelScale, amount);\n            fromRotationTranslationScaleOrigin(this._modelMMatrix, this._smoothedModelRotation, this._smoothedModelPosition, this._smoothedModelScale, this._modelManipulationOrigin);\n            this._renderer.mMatrix = this._modelMMatrix;\n            if (this._config.isDebugVisible) {\n                this._debugText.addLine(`mod pos ${this._smoothedModelPosition[0] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[0].toFixed(3)},${this._smoothedModelPosition[1] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[1].toFixed(3)},${this._smoothedModelPosition[2] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[2].toFixed(3)}`);\n                this._debugText.addLine(`mod rot ${this._smoothedModelRotation[0] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[0].toFixed(3)},${this._smoothedModelRotation[1] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[1].toFixed(3)},${this._smoothedModelRotation[2] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[2].toFixed(3)},${this._smoothedModelRotation[3] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[3].toFixed(3)}`);\n                this._debugText.addLine(`mod siz  ${this._smoothedModelScale[0].toFixed(3)}`);\n                this._debugText.addLine(`man ori ${this._modelManipulationOrigin[0] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[0].toFixed(3)},${this._modelManipulationOrigin[1] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[1].toFixed(3)},${this._modelManipulationOrigin[2] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[2].toFixed(3)}`);\n                this._debugText.addLine(`scr dst  ${this._config.screenDistance.toFixed(3)}`);\n                this._debugText.addLine(`cam fov  ${Math.round(AngleHelper.radiansToDegrees(this._config.fov))}`);\n                this._debugText.addLine(`tbf tot  ${this._renderer.transitionBuffers.length}`);\n            }\n            if (!xrFrame) {\n                this._camera.width = this._renderer.width;\n                this._camera.height = this._renderer.height;\n                this._camera.modelMMatrix = this._modelMMatrix;\n                this._camera.modelPosition = this._smoothedModelPosition;\n                this._camera.modelRotation = this._smoothedModelRotation;\n                this._camera.modelScale = this._smoothedModelScale;\n                this._camera.modelManipulationOrigin = this._modelManipulationOrigin;\n                this._camera.update(elapsedTime);\n                this._renderer.vMatrices = this._camera.vMatrices;\n                this._renderer.mvMatrices = this._camera.mvMatrices;\n                this._renderer.pMatrices = this._camera.pMatrices;\n                this._renderer.inverseVMatrices = this._camera.inverseVMatrices;\n                this._renderer.inversePMatrices = this._camera.inversePMatrices;\n            }\n            this._renderer.prepare(xrFrame);\n            if (!xrFrame && this._config.stereoMode == StereoMode.none) {\n                this._renderer.pickPMatrix = this._camera.pMatrices[0];\n            }\n            else {\n                const fov = MatrixHelper.fieldOfViewFromProjectionMatrix(this._renderer.pMatrices[0]);\n                perspective(this._mat4, fov, this._renderer.width / this._renderer.height, this._config.nearPlane, this._config.farPlane);\n                this._renderer.pickPMatrix = this._mat4;\n            }\n            if (this._renderer.isInitialized) {\n                this._renderer.update(elapsedTime);\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            return __awaiter$3(this, void 0, void 0, function* () {\n                this._fps.render();\n                if (this._renderer.isInitialized) {\n                    yield this._renderer.render(elapsedTime, xrFrame);\n                    if (this.afterRenderCallback) {\n                        this.afterRenderCallback();\n                    }\n                }\n            });\n        }\n        _syncSmooth() {\n            copy$3(this._smoothedModelPosition, this._modelPosition);\n            copy$3(this._smoothedModelScale, this._modelScale);\n            copy$1(this._smoothedModelRotation, this._modelRotation);\n        }\n        _updateManipulationOrigin(position) {\n            this._log.write(LogLevel.info, `manipulation origin ${position[0].toFixed(3)},${position[1].toFixed(3)},${position[2].toFixed(3)}`);\n            this._camera.updateModelManipulationOrigin(this._modelManipulationOrigin, position);\n            copy$3(this._modelManipulationOrigin, position);\n            transformMat4$2(this._vec3, this._modelManipulationOrigin, this._modelMMatrix);\n            subtract(this._modelPosition, this._vec3, this._modelManipulationOrigin);\n            copy$3(this._smoothedModelPosition, this._modelPosition);\n            if (this.manipulationOriginChangedCallback) {\n                const result = {\n                    x: position[0],\n                    y: position[1],\n                    z: position[2],\n                };\n                this.manipulationOriginChangedCallback(result);\n            }\n        }\n        pickLasso(x0, y0, x1, y1, pickType) {\n            const inverseMMatrix = create$4();\n            invert(inverseMMatrix, this._modelMMatrix);\n            const sets = [];\n            const nearPositions = [create$3(), create$3(), create$3(), create$3()];\n            const farPositions = [create$3(), create$3(), create$3(), create$3()];\n            const directions = [create$3(), create$3(), create$3(), create$3()];\n            this._camera.unproject(nearPositions[0], x0, y1, -1);\n            this._camera.unproject(farPositions[0], x0, y1, 1);\n            this._camera.unproject(nearPositions[1], x1, y1, -1);\n            this._camera.unproject(farPositions[1], x1, y1, 1);\n            this._camera.unproject(nearPositions[2], x1, y0, -1);\n            this._camera.unproject(farPositions[2], x1, y0, 1);\n            this._camera.unproject(nearPositions[3], x0, y0, -1);\n            this._camera.unproject(farPositions[3], x0, y0, 1);\n            for (let i = 0; i < 4; i++) {\n                transformMat4$2(nearPositions[i], nearPositions[i], inverseMMatrix);\n                transformMat4$2(farPositions[i], farPositions[i], inverseMMatrix);\n                subtract(directions[i], farPositions[i], nearPositions[i]);\n                normalize$2(directions[i], directions[i]);\n            }\n            const normals = [create$3(), create$3(), create$3(), create$3()];\n            const d = [];\n            for (let i = 0; i < 4; i++) {\n                cross(normals[i], directions[(i + 1) % 4], directions[i]);\n                normalize$2(normals[i], normals[i]);\n                d.push(-dot$1(normals[i], nearPositions[i]));\n            }\n            if (pickType == PickType.data) {\n                const translation = create$3();\n                for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n                    const transitionBuffer = this._renderer.transitionBuffers[i];\n                    const set = new Set();\n                    if (transitionBuffer.isVisible) {\n                        const start = window.performance.now();\n                        const currentBuffer = transitionBuffer.currentBuffer;\n                        const lookup = currentBuffer.lookup;\n                        for (let j = 0; j < currentBuffer.length; j++) {\n                            const id = currentBuffer.ids[j];\n                            const index = lookup[id];\n                            if (index != null) {\n                                UnitVertex.getTranslation(currentBuffer.dataView, index, translation);\n                                let isInside = true;\n                                for (let k = 0; k < 4; k++) {\n                                    let distance = dot$1(normals[k], translation);\n                                    distance += d[k];\n                                    if (distance < 0) {\n                                        isInside = false;\n                                        break;\n                                    }\n                                }\n                                if (isInside) {\n                                    set.add(id);\n                                }\n                            }\n                        }\n                        if (set.size > 0) {\n                            this._log.write(LogLevel.info, `lasso transition buffer ${i} picked ${set.size} ${Math.round(window.performance.now() - start)}ms`);\n                        }\n                    }\n                    sets.push(set);\n                }\n            }\n            return sets;\n        }\n    }\n    const StereoMode = {\n        none: \"none\",\n        split: \"split\",\n        anaglyph: \"anaglyph\",\n        left: \"left\",\n        right: \"right\",\n    };\n    const HorizontalAlignment = {\n        left: \"left\",\n        center: \"center\",\n        right: \"right\",\n    };\n    const VerticalAlignment = {\n        top: \"top\",\n        center: \"center\",\n        bottom: \"bottom\",\n    };\n    const AxesTextOrientation = {\n        parallel: \"parallel\",\n        perpendicular: \"perpendicular\",\n    };\n    const AxesVisibility = {\n        none: \"none\",\n        current: \"current\",\n        previous: \"previous\",\n    };\n    const PickType = {\n        none: 0,\n        data: 1,\n        label: 2,\n        axesDivision: 3,\n        axesTitle: 4,\n        axesLabel: 5,\n        axesHeading: 6,\n    };\n    const Theme = {\n        dark: \"dark\",\n        light: \"light\",\n    };\n    const HighlightMode = {\n        luminance: \"luminance\",\n        color: \"color\",\n    };\n    const UnitType = {\n        block: \"block\",\n        blockSdf: \"blockSdf\",\n        sphere: \"sphere\",\n        sphereSdf: \"sphereSdf\",\n        cylinder: \"cylinder\",\n        cylinderSdf: \"cylinderSdf\",\n        hexPrism: \"hexPrism\",\n        hexPrismSdf: \"hexPrismSdf\",\n        sdf: \"sdf\",\n        disk: \"disk\",\n        ringSdf: \"ringSdf\"};\n    const SingleTouchAction = {\n        translate: \"translate\",\n        rotate: \"rotate\",\n        lasso: \"lasso\",\n    };\n    const MouseWheelAction = {\n        zoom: \"zoom\",\n        rotateY: \"rotateY\",\n    };\n    const LogLevel = {\n        trace: 0,\n        debug: 1,\n        info: 2,\n        warn: 3,\n        error: 4,\n    };\n    const Edge3D = {\n        topFront: 0,\n        topRight: 1,\n        topBack: 2,\n        bottomRight: 5,\n        frontRight: 8,\n        backRight: 9};\n    const RenderMode = {\n        color: \"color\"};\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let LabelSetVisual$2 = class LabelSetVisual {\n        render(elapsedTime, xrFrame) { }\n        update(elapsedTime) { }\n        constructor(labelSet) {\n            this.label = labelSet;\n        }\n    };\n    class LabelBase {\n        get material() { return this._material; }\n        get vertices() { return this._vertices; }\n        get verticesView() { return this._verticesView; }\n        get indices() { return this._indices; }\n        get indexCount() { return this._indexCount; }\n        get isInitialized() { return this._isInitialized; }\n        get mMatrix() { return this._mMatrix; }\n        get materialType() { return this._materialType; }\n        get materialColor() { return this._materialColor; }\n        get materialFuzz() { return this._materialFuzz; }\n        get materialGloss() { return this._materialGloss; }\n        get segmentColor() { return this._segmentColor; }\n        get scale() { return this._scale; }\n        set scale(value) {\n            if (this._scale != value) {\n                this._scale = value;\n                this._hasChanged = true;\n            }\n        }\n        get font() { return this._font; }\n        set font(value) {\n            if (this._font != value) {\n                this._font = value;\n                this._hasChanged = true;\n            }\n        }\n        get rotation() { return this._rotation; }\n        set rotation(value) {\n            if (this._rotation != value) {\n                this._rotation = value;\n                this._hasChanged = true;\n            }\n        }\n        set reverseX(value) {\n            if (this._reverseX != value) {\n                this._reverseX = value;\n                this._hasChanged = true;\n            }\n        }\n        set reverseY(value) {\n            if (this._reverseY != value) {\n                this._reverseY = value;\n                this._hasChanged = true;\n            }\n        }\n        set reverseZ(value) {\n            if (this._reverseZ != value) {\n                this._reverseZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get horizontalAlignment() { return this._horizontalAlignment; }\n        set horizontalAlignment(value) {\n            if (this._horizontalAlignment != value) {\n                this._horizontalAlignment = value;\n                this._hasChanged = true;\n            }\n        }\n        get verticalAlignment() { return this._verticalAlignment; }\n        set verticalAlignment(value) {\n            if (this._verticalAlignment != value) {\n                this._verticalAlignment = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetX() { return this._offsetX; }\n        set offsetX(value) {\n            if (this._offsetX != value) {\n                this._offsetX = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetY() { return this._offsetY; }\n        set offsetY(value) {\n            if (this._offsetY != value) {\n                this._offsetY = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetZ() { return this._offsetZ; }\n        set offsetZ(value) {\n            if (this._offsetZ != value) {\n                this._offsetZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxGlyphTop() { return this._maxGlyphTop; }\n        set maxGlyphTop(value) {\n            if (this._maxGlyphTop != value) {\n                this._maxGlyphTop = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxGlyphHeight() { return this._maxGlyphHeight; }\n        set maxGlyphHeight(value) {\n            if (this._maxGlyphHeight != value) {\n                this._maxGlyphHeight = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core, options) {\n            this._core = core;\n            this._offset = create$3();\n            this._vec3 = create$3();\n            this._vec4 = create$2();\n            this._mMatrix = create$4();\n            this._indexCount = 0;\n            this._maxGlyphs = options.maxGlyphs;\n            this._textMetric = { width: 0, maxHeight: 0, maxTop: 0 };\n            this.scale = options.scale ? options.scale : 1;\n            this.offsetX = options.offsetX ? options.offsetX : 0;\n            this.offsetY = options.offsetY ? options.offsetY : 0;\n            this.offsetZ = options.offsetZ ? options.offsetZ : 0;\n            this.reverseX = options.reverseX;\n            this.reverseY = options.reverseY;\n            this.reverseZ = options.reverseZ;\n            this.rotation = options.rotation;\n            this.maxGlyphTop = options.maxGlyphTop;\n            this.horizontalAlignment = options.horizontalAlignment === undefined ? HorizontalAlignment.center : options.horizontalAlignment;\n            this.verticalAlignment = options.verticalAlignment === undefined ? VerticalAlignment.center : options.verticalAlignment;\n            this._material = options.material;\n            this.borderWidth = core.config.textBorderWidth;\n            this.gamma = 0;\n            this._materialType = options.materialType || 0;\n            this._materialColor = options.materialColor || core.config.textColor;\n            this._materialFuzz = options.materialFuzz || 0;\n            this._materialGloss = options.materialGloss || 0;\n            this._segmentColor = options.segmentColor;\n        }\n        initialize() {\n            this._vertices = new ArrayBuffer(PositionTexturePickVertex.SIZE_BYTES * this._maxGlyphs * 4);\n            this._verticesView = new DataView(this._vertices);\n            this._indices = new Uint32Array(this._maxGlyphs * 6);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) { }\n    }\n    class LabelSet extends LabelBase {\n        get materials() { return this._materials; }\n        get materialTypes() { return this._materialTypes; }\n        get materialColors() { return this._materialColors; }\n        get materialFuzzes() { return this._materialFuzzes; }\n        get materialGlosses() { return this._materialGlosses; }\n        get segmentColors() { return this._segmentColors; }\n        get minBoundsX() { return this._minBoundsX; }\n        set minBoundsX(value) {\n            if (this._minBoundsX != value) {\n                this._minBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsY() { return this._minBoundsY; }\n        set minBoundsY(value) {\n            if (this._minBoundsY != value) {\n                this._minBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsZ() { return this._minBoundsZ; }\n        set minBoundsZ(value) {\n            if (this._minBoundsZ != value) {\n                this._minBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsX() { return this._maxBoundsX; }\n        set maxBoundsX(value) {\n            if (this._maxBoundsX != value) {\n                this._maxBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsY() { return this._maxBoundsY; }\n        set maxBoundsY(value) {\n            if (this._maxBoundsY != value) {\n                this._maxBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsZ() { return this._maxBoundsZ; }\n        set maxBoundsZ(value) {\n            if (this._maxBoundsZ != value) {\n                this._maxBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionsX() { return this._positionsX; }\n        set positionsX(value) {\n            if (this._positionsX != value) {\n                this._positionsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionsY() { return this._positionsY; }\n        set positionsY(value) {\n            if (this._positionsY != value) {\n                this._positionsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionsZ() { return this._positionsZ; }\n        set positionsZ(value) {\n            if (this._positionsZ != value) {\n                this._positionsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionScalingX() { return this._positionScalingX; }\n        set positionScalingX(value) {\n            if (this._positionScalingX != value) {\n                this._positionScalingX = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionScalingY() { return this._positionScalingY; }\n        set positionScalingY(value) {\n            if (this._positionScalingY != value) {\n                this._positionScalingY = value;\n                this._hasChanged = true;\n            }\n        }\n        get positionScalingZ() { return this._positionScalingZ; }\n        set positionScalingZ(value) {\n            if (this._positionScalingZ != value) {\n                this._positionScalingZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get rotations() { return this._rotations; }\n        set rotations(value) {\n            if (this._rotations != value) {\n                this._rotations = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetsX() { return this._offsetsX; }\n        set offsetsX(value) {\n            if (this._offsetsX != value) {\n                this._offsetsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetsY() { return this._offsetsY; }\n        set offsetsY(value) {\n            if (this._offsetsY != value) {\n                this._offsetsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetsZ() { return this._offsetsZ; }\n        set offsetsZ(value) {\n            if (this._offsetsZ != value) {\n                this._offsetsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetScalingX() { return this._offsetScalingX; }\n        set offsetScalingX(value) {\n            if (this._offsetScalingX != value) {\n                this._offsetScalingX = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetScalingY() { return this._offsetScalingY; }\n        set offsetScalingY(value) {\n            if (this._offsetScalingY != value) {\n                this._offsetScalingY = value;\n                this._hasChanged = true;\n            }\n        }\n        get offsetScalingZ() { return this._offsetScalingZ; }\n        set offsetScalingZ(value) {\n            if (this._offsetScalingZ != value) {\n                this._offsetScalingZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get text() { return this._text; }\n        set text(value) {\n            if (this._text != value) {\n                this._text = value;\n                this._hasChanged = true;\n            }\n        }\n        get horizontalAlignments() { return this._horizontalAlignments; }\n        set horizontalAlignments(value) {\n            if (this._horizontalAlignments != value) {\n                this._horizontalAlignments = value;\n                this._hasChanged = true;\n            }\n        }\n        get verticalAlignments() { return this._verticalAlignments; }\n        set verticalAlignments(value) {\n            if (this._verticalAlignments != value) {\n                this._verticalAlignments = value;\n                this._hasChanged = true;\n            }\n        }\n        get scales() { return this._scales; }\n        set scales(value) {\n            if (this._scales != value) {\n                this._scales = value;\n                this._hasChanged = true;\n            }\n        }\n        get scalesScaling() { return this._scalesScaling; }\n        set scalesScaling(value) {\n            if (this._scalesScaling != value) {\n                this._scalesScaling = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core, options) {\n            super(core, options);\n            this._quat = create$1();\n            this._materials = options.materials;\n            this._materialType = options.materialType;\n            this._materialColor = options.materialColors ? null : options.materialColor || core.config.textColor;\n            this._materialColors = options.materialColors;\n            this.minBoundsX = options.minBoundsX ? options.minBoundsX : 0;\n            this.minBoundsY = options.minBoundsY ? options.minBoundsY : 0;\n            this.minBoundsZ = options.minBoundsZ ? options.minBoundsZ : 0;\n            this.maxBoundsX = options.maxBoundsX ? options.maxBoundsX : 1;\n            this.maxBoundsY = options.maxBoundsY ? options.maxBoundsY : 1;\n            this.maxBoundsZ = options.maxBoundsZ ? options.maxBoundsZ : 1;\n            this._font = options.font || core.font;\n            this.text = options.text;\n            this.positionsX = options.positionsX;\n            this.positionsY = options.positionsY;\n            this.positionsZ = options.positionsZ;\n            this.positionScalingX = options.positionScalingX ? options.positionScalingX : 1;\n            this.positionScalingY = options.positionScalingY ? options.positionScalingY : 1;\n            this.positionScalingZ = options.positionScalingZ ? options.positionScalingZ : 1;\n            this.rotations = options.rotations;\n            this.offsetsX = options.offsetsX;\n            this.offsetsY = options.offsetsY;\n            this.offsetsZ = options.offsetsZ;\n            this.offsetScalingX = options.offsetScalingX ? options.offsetScalingX : 1;\n            this.offsetScalingY = options.offsetScalingY ? options.offsetScalingY : 1;\n            this.offsetScalingZ = options.offsetScalingZ ? options.offsetScalingZ : 1;\n            if (options.horizontalAlignments)\n                this.horizontalAlignments = options.horizontalAlignments;\n            if (options.verticalAlignments)\n                this.verticalAlignments = options.verticalAlignments;\n            if (options.scales)\n                this.scales = options.scales;\n            this.scalesScaling = options.scalesScaling ? options.scalesScaling : 1;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged && this._isInitialized) {\n                this._hasChanged = false;\n                this.pickIdLookup = {};\n                if (!this._text) {\n                    this._indexCount = 0;\n                }\n                else {\n                    const start = window.performance.now();\n                    const modelSizeX = this._maxBoundsX - this._minBoundsX;\n                    const modelSizeY = this._maxBoundsY - this._minBoundsY;\n                    const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n                    const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n                    const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n                    const modelOriginX = (this._minBoundsX + this._maxBoundsX) / 2;\n                    const modelOriginY = (this._minBoundsY + this._maxBoundsY) / 2;\n                    const modelOriginZ = (this._minBoundsZ + this._maxBoundsZ) / 2;\n                    if (this._rotation) {\n                        set$1(this._quat, this._rotation[0], this._rotation[1], this._rotation[2], this._rotation[3]);\n                    }\n                    let glyphs = 0;\n                    for (let i = 0; i < this._text.length; i++) {\n                        const offsetX = (this._offsetsX ? this._offsetsX[i] / 2 : this._offsetX) * boundsScaling * this._offsetScalingX;\n                        const offsetY = (this._offsetsY ? this._offsetsY[i] / 2 : this._offsetY) * boundsScaling * this._offsetScalingY;\n                        const offsetZ = (this._offsetsZ ? this._offsetsZ[i] / 2 : this._offsetZ) * boundsScaling * this._offsetScalingZ;\n                        const text = TextHelper.truncate(this._text[i], this._maxGlyphs - glyphs);\n                        const scale = (this._scales ? this._scales[i] * this._scalesScaling : this._scale) * boundsScaling / this._font.size;\n                        TextHelper.measure(this._font, text, this._textMetric);\n                        const width = this._textMetric.width * scale;\n                        const lineHeight = this._font.size * scale;\n                        const maxGlyphTop = (this._maxGlyphTop ? this._maxGlyphTop : this._textMetric.maxTop) * scale;\n                        const horizontalAlignment = this._horizontalAlignments ? this._horizontalAlignments[i] : this._horizontalAlignment;\n                        switch (horizontalAlignment) {\n                            case HorizontalAlignment.left:\n                                this._offset[0] = offsetX;\n                                break;\n                            case HorizontalAlignment.center:\n                                this._offset[0] = offsetX - width / 2;\n                                break;\n                            case HorizontalAlignment.right:\n                                this._offset[0] = offsetX - width;\n                                break;\n                        }\n                        const verticalAlignment = this._verticalAlignments ? this._verticalAlignments[i] : this._verticalAlignment;\n                        switch (verticalAlignment) {\n                            case VerticalAlignment.top:\n                                this._offset[1] = offsetY - lineHeight / 2;\n                                break;\n                            case VerticalAlignment.center:\n                                this._offset[1] = offsetY;\n                                break;\n                            case VerticalAlignment.bottom:\n                                this._offset[1] = offsetY + lineHeight / 2;\n                                break;\n                        }\n                        this._offset[1] -= maxGlyphTop / 2;\n                        this._offset[2] = offsetZ;\n                        let positionX = this.positionsX ? this.positionsX[i] * this.positionScalingX : 0;\n                        let positionY = this.positionsY ? this.positionsY[i] * this.positionScalingY : 0;\n                        let positionZ = this.positionsZ ? this.positionsZ[i] * this.positionScalingZ : 0;\n                        if (this._reverseX) {\n                            positionX = this.minBoundsX + this.maxBoundsX - positionX;\n                        }\n                        if (this._reverseY) {\n                            positionY = this.minBoundsY + this.maxBoundsY - positionY;\n                        }\n                        if (this._reverseZ) {\n                            positionZ = this.minBoundsZ + this.maxBoundsZ - positionZ;\n                        }\n                        set$3(this._vec3, (positionX - modelOriginX) * boundsScaling, (positionY - modelOriginY) * boundsScaling, (positionZ - modelOriginZ) * boundsScaling);\n                        if (this._rotations) {\n                            set$1(this._quat, this._rotations[i * 4], this._rotations[i * 4 + 1], this._rotations[i * 4 + 2], this._rotations[i * 4 + 3]);\n                        }\n                        const pickId = PickHelper.nextPickId();\n                        PickHelper.encodeNumber(pickId, PickType.label, this._vec4);\n                        this.pickIdLookup[pickId] = i;\n                        TextHelper.addString(this._font, text, this._verticesView, this._indices, glyphs, this._vec3, scale, this._offset, this._rotation || this._rotations ? this._quat : null, this._vec4);\n                        glyphs += text.length;\n                        if (glyphs >= this._maxGlyphs) {\n                            glyphs = this._maxGlyphs;\n                            break;\n                        }\n                    }\n                    this._indexCount = glyphs * 6;\n                    this._core.log.write(LogLevel.info, `label set updated ${Math.round(window.performance.now() - start)}ms`);\n                    if (this.hasChangedCallback) {\n                        this.hasChangedCallback();\n                    }\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let ImageVisual$2 = class ImageVisual {\n        render(elapsedTime, xrFrame) { }\n        update(elapsedTime) { }\n        constructor(image) {\n            this.image = image;\n        }\n    };\n    class ImageBase {\n        get material() { return this._material; }\n        get vertices() { return this._vertices; }\n        get indices() { return this._indices; }\n        get indexCount() { return this._indexCount; }\n        get isInitialized() { return this._isInitialized; }\n        get mMatrix() { return this._mMatrix; }\n        get imageData() { return this._imageData; }\n        set imageData(value) {\n            if (this._imageData != value) {\n                this._imageData = value;\n                this._hasChanged = true;\n            }\n        }\n        get rotation() { return this._rotation; }\n        set rotation(value) {\n            if (!equals$1(this._rotation, value)) {\n                copy$1(this._rotation, value);\n                this._hasChanged = true;\n            }\n        }\n        get position() { return this._position; }\n        set position(value) {\n            if (!equals$2(this._position, value)) {\n                copy$3(this._position, value);\n                this._hasChanged = true;\n            }\n        }\n        get texCoord0() { return this._texCoord0; }\n        set texCoord0(value) {\n            if (!equals(this._texCoord0, value)) {\n                copy(this._texCoord0, value);\n                this._hasChanged = true;\n            }\n        }\n        get texCoord1() { return this._texCoord1; }\n        set texCoord1(value) {\n            if (!equals(this._texCoord1, value)) {\n                copy(this._texCoord1, value);\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsX() { return this._minBoundsX; }\n        set minBoundsX(value) {\n            if (this._minBoundsX != value) {\n                this._minBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsY() { return this._minBoundsY; }\n        set minBoundsY(value) {\n            if (this._minBoundsY != value) {\n                this._minBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get minBoundsZ() { return this._minBoundsZ; }\n        set minBoundsZ(value) {\n            if (this._minBoundsZ != value) {\n                this._minBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsX() { return this._maxBoundsX; }\n        set maxBoundsX(value) {\n            if (this._maxBoundsX != value) {\n                this._maxBoundsX = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsY() { return this._maxBoundsY; }\n        set maxBoundsY(value) {\n            if (this._maxBoundsY != value) {\n                this._maxBoundsY = value;\n                this._hasChanged = true;\n            }\n        }\n        get maxBoundsZ() { return this._maxBoundsZ; }\n        set maxBoundsZ(value) {\n            if (this._maxBoundsZ != value) {\n                this._maxBoundsZ = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core, options) {\n            this._core = core;\n            this._mMatrix = create$4();\n            this._origin = create$3();\n            this._translation = create$3();\n            this._scale = create$3();\n            this._transform = create$4();\n            this._imageData = options.imageData;\n            this._minBoundsX = options.minBoundsX === undefined ? 0 : options.minBoundsX;\n            this._minBoundsY = options.minBoundsY === undefined ? 0 : options.minBoundsY;\n            this._minBoundsZ = options.minBoundsZ === undefined ? 0 : options.minBoundsZ;\n            this._maxBoundsX = options.maxBoundsX === undefined ? 1 : options.maxBoundsX;\n            this._maxBoundsY = options.maxBoundsY === undefined ? 1 : options.maxBoundsY;\n            this._maxBoundsZ = options.maxBoundsZ === undefined ? 1 : options.maxBoundsZ;\n            this._position = options.position ? clone$4(options.position) : create$3();\n            this._rotation = options.rotation ? clone$2(options.rotation) : create$1();\n            this._texCoord0 = options.texCoord0 ? clone$1(options.texCoord0) : fromValues(0, 0);\n            this._texCoord1 = options.texCoord1 ? clone$1(options.texCoord1) : fromValues(1, 1);\n            this._material = options.material === undefined ? -1 : options.material;\n            this._hasChanged = true;\n        }\n    }\n    class ImageQuad extends ImageBase {\n        get width() { return this._width; }\n        set width(value) {\n            if (this._width != value) {\n                this._width = value;\n                this._hasChanged = true;\n            }\n        }\n        get height() { return this._height; }\n        set height(value) {\n            if (this._height != value) {\n                this._height = value;\n                this._hasChanged = true;\n            }\n        }\n        constructor(core, options) {\n            super(core, options);\n            this._width = options.width === undefined ? 1 : options.width;\n            this._height = options.height === undefined ? 1 : options.height;\n            this._texTransform = create$4();\n            translate(this._texTransform, this._texTransform, fromValues$3(0, 1, 0));\n            scale$1(this._texTransform, this._texTransform, fromValues$3(1, -1, 1));\n        }\n        initialize() {\n            this._vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * 4);\n            this._indices = Quad$2.INDICES;\n            this._indexCount = this._indices.length;\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged && this._isInitialized) {\n                this._hasChanged = false;\n                const modelSizeX = this._maxBoundsX - this._minBoundsX;\n                const modelSizeY = this._maxBoundsY - this._minBoundsY;\n                const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n                const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n                const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n                set$3(this._origin, (this._minBoundsX + this._maxBoundsX) / 2, (this._minBoundsY + this._maxBoundsY) / 2, (this._minBoundsZ + this._maxBoundsZ) / 2);\n                subtract(this._translation, this._position, this._origin);\n                scale(this._translation, this._translation, boundsScaling);\n                set$3(this._scale, this._width, this._height, 1);\n                scale(this._scale, this._scale, boundsScaling);\n                fromRotationTranslationScale(this._transform, this._rotation, this._translation, this._scale);\n                this._verticesView = Quad$2.normalTextured(this._transform, this._texTransform);\n                this._vertices = this._verticesView.buffer;\n                if (this.hasChangedCallback) {\n                    this.hasChangedCallback();\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class BoundsHelper {\n        static rotateBounds(minBounds, maxBounds, rotation, rotatedMinBounds, rotatedMaxBounds, offset) {\n            const sizeX = maxBounds[0] - minBounds[0];\n            const sizeY = maxBounds[1] - minBounds[1];\n            const sizeZ = maxBounds[2] - minBounds[2];\n            const min$1 = rotatedMinBounds;\n            const max$1 = rotatedMaxBounds;\n            set$3(min$1, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n            set$3(max$1, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n            const vertices = Cube.POSITIONS;\n            const position = create$3();\n            for (let i = 0; i < 8; i++) {\n                set$3(position, vertices[i * 3] * sizeX, vertices[i * 3 + 1] * sizeY, vertices[i * 3 + 2] * sizeZ);\n                add(position, position, offset);\n                transformQuat(position, position, rotation);\n                subtract(position, position, offset);\n                min(min$1, min$1, position);\n                max(max$1, max$1, position);\n            }\n            add(position, minBounds, maxBounds);\n            scale(position, position, 0.5);\n            add(min$1, min$1, position);\n            add(max$1, max$1, position);\n        }\n        static cylinder(pa, pb, radius, minBounds, maxBounds) {\n            const a = create$3();\n            subtract(a, pb, pa);\n            const aa = dot$1(a, a);\n            const ex = radius * Math.sqrt(1 - a[0] * a[0] / aa);\n            const ey = radius * Math.sqrt(1 - a[1] * a[1] / aa);\n            const ez = radius * Math.sqrt(1 - a[2] * a[2] / aa);\n            minBounds[0] = Math.min(pa[0] - ex, pb[0] - ex);\n            minBounds[1] = Math.min(pa[1] - ey, pb[1] - ey);\n            minBounds[2] = Math.min(pa[2] - ez, pb[2] - ez);\n            maxBounds[0] = Math.max(pa[0] + ex, pb[0] + ex);\n            maxBounds[1] = Math.max(pa[1] + ey, pb[1] + ey);\n            maxBounds[2] = Math.max(pa[2] + ez, pb[2] + ez);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class LayoutBase {\n        get facetScaling() { return this._facetScaling; }\n        offsetX(facetCoordX) { return (((facetCoordX + 0.5) / this._facetsX) - 0.5) * (this.maxModelBoundsX - this.minModelBoundsX) / this._maxBounds; }\n        offsetY(facetCoordY) { return (((facetCoordY + 0.5) / this._facetsY) - 0.5) * (this.maxModelBoundsY - this.minModelBoundsY) / this._maxBounds; }\n        offsetZ(facetCoordZ) { return (((facetCoordZ + 0.5) / this._facetsZ) - 0.5) * (this.maxModelBoundsZ - this.minModelBoundsZ) / this._maxBounds; }\n        constructor(core) {\n            this._core = core;\n            this.modelOriginX = 0;\n            this.modelOriginY = 0;\n            this.modelOriginZ = 0;\n            this.minModelBoundsX = 0;\n            this.minModelBoundsY = 0;\n            this.minModelBoundsZ = 0;\n            this.maxModelBoundsX = 0;\n            this.maxModelBoundsY = 0;\n            this.maxModelBoundsZ = 0;\n            this.minLayoutBoundsX = 0;\n            this.minLayoutBoundsY = 0;\n            this.minLayoutBoundsZ = 0;\n            this.maxLayoutBoundsX = 0;\n            this.maxLayoutBoundsY = 0;\n            this.maxLayoutBoundsZ = 0;\n            this._facetSpacingX = 0;\n            this._facetSpacingY = 0;\n            this._facetSpacingZ = 0;\n            this._facetSizeX = 0;\n            this._facetSizeY = 0;\n            this._facetSizeZ = 0;\n            this._facetsX = 1;\n            this._facetsY = 1;\n            this._facetsZ = 1;\n        }\n        _updateModelBounds(options) {\n            this.minModelBoundsX = options.minBoundsX === undefined ? this.minLayoutBoundsX : options.minBoundsX;\n            this.minModelBoundsY = options.minBoundsY === undefined ? this.minLayoutBoundsY : options.minBoundsY;\n            this.minModelBoundsZ = options.minBoundsZ === undefined ? this.minLayoutBoundsZ : options.minBoundsZ;\n            this.maxModelBoundsX = options.maxBoundsX === undefined ? this.maxLayoutBoundsX : options.maxBoundsX;\n            this.maxModelBoundsY = options.maxBoundsY === undefined ? this.maxLayoutBoundsY : options.maxBoundsY;\n            this.maxModelBoundsZ = options.maxBoundsZ === undefined ? this.maxLayoutBoundsZ : options.maxBoundsZ;\n            this._isFacetted =\n                (options.facetsX !== undefined && options.facetsX > 1 && options.facetCoordsX != null) ||\n                    (options.facetsY !== undefined && options.facetsY > 1 && options.facetCoordsY != null) ||\n                    (options.facetsZ !== undefined && options.facetsZ > 1 && options.facetCoordsZ != null);\n            this._facetSpacingX = options.facetSpacingX === undefined ? 0 : options.facetSpacingX;\n            this._facetSpacingY = options.facetSpacingY === undefined ? 0 : options.facetSpacingY;\n            this._facetSpacingZ = options.facetSpacingZ === undefined ? 0 : options.facetSpacingZ;\n            let modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n            let modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n            let modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n            const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n            this._facetSizeX = modelSizeX;\n            this._facetSizeY = modelSizeY;\n            this._facetSizeZ = modelSizeZ;\n            this._facetsX = options.facetCoordsX ? options.facetsX : 1;\n            this._facetsY = options.facetCoordsY ? options.facetsY : 1;\n            this._facetsZ = options.facetCoordsZ ? options.facetsZ : 1;\n            this.minModelBoundsX -= this._facetSizeX * this._facetSpacingX / 2;\n            this.minModelBoundsY -= this._facetSizeY * this._facetSpacingY / 2;\n            this.minModelBoundsZ -= this._facetSizeZ * this._facetSpacingZ / 2;\n            this.maxModelBoundsX = this.minModelBoundsX + this._facetsX * this._facetSizeX * (1 + this._facetSpacingX);\n            this.maxModelBoundsY = this.minModelBoundsY + this._facetsY * this._facetSizeY * (1 + this._facetSpacingY);\n            this.maxModelBoundsZ = this.minModelBoundsZ + this._facetsZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n            this.modelOriginX = (this.minModelBoundsX + this.maxModelBoundsX) / 2;\n            this.modelOriginY = (this.minModelBoundsY + this.maxModelBoundsY) / 2;\n            this.modelOriginZ = (this.minModelBoundsZ + this.maxModelBoundsZ) / 2;\n            modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n            modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n            modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n            this._maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n            this._boundsScaling = this._maxBounds == 0 ? 1 : 1 / this._maxBounds;\n            this._facetScaling = maxBounds / this._maxBounds;\n        }\n        resetCumulativeLayoutBounds() {\n            this.minCumulativeLayoutBoundsX = undefined;\n            this.minCumulativeLayoutBoundsY = undefined;\n            this.minCumulativeLayoutBoundsZ = undefined;\n            this.maxCumulativeLayoutBoundsX = undefined;\n            this.maxCumulativeLayoutBoundsY = undefined;\n            this.maxCumulativeLayoutBoundsZ = undefined;\n        }\n        _updateCumulativeLayoutBounds() {\n            this.minCumulativeLayoutBoundsX = this.minCumulativeLayoutBoundsX === undefined ? this.minLayoutBoundsX : Math.min(this.minCumulativeLayoutBoundsX, this.minLayoutBoundsX);\n            this.minCumulativeLayoutBoundsY = this.minCumulativeLayoutBoundsY === undefined ? this.minLayoutBoundsY : Math.min(this.minCumulativeLayoutBoundsY, this.minLayoutBoundsY);\n            this.minCumulativeLayoutBoundsZ = this.minCumulativeLayoutBoundsZ === undefined ? this.minLayoutBoundsZ : Math.min(this.minCumulativeLayoutBoundsZ, this.minLayoutBoundsZ);\n            this.maxCumulativeLayoutBoundsX = this.maxCumulativeLayoutBoundsX === undefined ? this.maxLayoutBoundsX : Math.max(this.maxCumulativeLayoutBoundsX, this.maxLayoutBoundsX);\n            this.maxCumulativeLayoutBoundsY = this.maxCumulativeLayoutBoundsY === undefined ? this.maxLayoutBoundsY : Math.max(this.maxCumulativeLayoutBoundsY, this.maxLayoutBoundsY);\n            this.maxCumulativeLayoutBoundsZ = this.maxCumulativeLayoutBoundsZ === undefined ? this.maxLayoutBoundsZ : Math.max(this.maxCumulativeLayoutBoundsZ, this.maxLayoutBoundsZ);\n        }\n        unitToModelSize(unitSize) {\n            return unitSize / this._boundsScaling;\n        }\n        unitToModelPositionX(unitPositionX) {\n            return this.unitToModelSize(unitPositionX) + this.modelOriginX;\n        }\n        unitToModelPositionY(unitPositionY) {\n            return this.unitToModelSize(unitPositionY) + this.modelOriginY;\n        }\n        unitToModelPositionZ(unitPositionZ) {\n            return this.unitToModelSize(unitPositionZ) + this.modelOriginZ;\n        }\n        unitToModelPosition(unitPosition, modelPosition) {\n            modelPosition[0] = this.unitToModelPositionX(unitPosition[0]);\n            modelPosition[1] = this.unitToModelPositionY(unitPosition[1]);\n            modelPosition[2] = this.unitToModelPositionZ(unitPosition[2]);\n        }\n        modelToUnitSize(modelSize) {\n            return modelSize * this._boundsScaling;\n        }\n        modelToUnitPositionX(modelPositionX) {\n            return (modelPositionX - this.modelOriginX) * this._boundsScaling;\n        }\n        modelToUnitPositionY(modelPositionY) {\n            return (modelPositionY - this.modelOriginY) * this._boundsScaling;\n        }\n        modelToUnitPositionZ(modelPositionZ) {\n            return (modelPositionZ - this.modelOriginZ) * this._boundsScaling;\n        }\n        modelToUnitPosition(modelPosition, unitPosition) {\n            unitPosition[0] = this.modelToUnitPositionX(modelPosition[0]);\n            unitPosition[1] = this.modelToUnitPositionY(modelPosition[1]);\n            unitPosition[2] = this.modelToUnitPositionZ(modelPosition[2]);\n        }\n        inclusiveUnitBounds(buffer, ids, unitType, offset, count, minBounds, maxBounds) {\n            set$3(minBounds, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n            set$3(maxBounds, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n            const unitScale = create$3();\n            const unitRotation = create$1();\n            const unitTranslation = create$3();\n            const lookup = buffer.lookup;\n            const dataView = buffer.dataView;\n            let minBounds0;\n            let maxBounds0;\n            let minBounds1;\n            let maxBounds1;\n            switch (unitType) {\n                case UnitType.sphere:\n                case UnitType.sphereSdf:\n                    for (let i = 0; i < count; i++) {\n                        const id = ids[i + offset];\n                        const index = lookup[id];\n                        UnitVertex.getTranslation(dataView, index, unitTranslation);\n                        UnitVertex.getScale(dataView, index, unitScale);\n                        const radius = unitScale[0] / 2;\n                        minBounds[0] = Math.min(minBounds[0], unitTranslation[0] - radius);\n                        minBounds[1] = Math.min(minBounds[1], unitTranslation[1] - radius);\n                        minBounds[2] = Math.min(minBounds[2], unitTranslation[2] - radius);\n                        maxBounds[0] = Math.max(maxBounds[0], unitTranslation[0] + radius);\n                        maxBounds[1] = Math.max(maxBounds[1], unitTranslation[1] + radius);\n                        maxBounds[2] = Math.max(maxBounds[2], unitTranslation[2] + radius);\n                    }\n                    break;\n                case UnitType.hexPrism:\n                case UnitType.hexPrismSdf:\n                case UnitType.block:\n                case UnitType.blockSdf:\n                    minBounds0 = create$3();\n                    maxBounds0 = create$3();\n                    minBounds1 = create$3();\n                    maxBounds1 = create$3();\n                    for (let i = 0; i < count; i++) {\n                        const id = ids[i + offset];\n                        const index = lookup[id];\n                        UnitVertex.getTranslation(dataView, index, unitTranslation);\n                        UnitVertex.getRotation(dataView, index, unitRotation);\n                        UnitVertex.getScale(dataView, index, unitScale);\n                        minBounds0[0] = unitTranslation[0] - unitScale[0] / 2;\n                        minBounds0[1] = unitTranslation[1] - unitScale[1] / 2;\n                        minBounds0[2] = unitTranslation[2] - unitScale[2] / 2;\n                        maxBounds0[0] = unitTranslation[0] + unitScale[0] / 2;\n                        maxBounds0[1] = unitTranslation[1] + unitScale[1] / 2;\n                        maxBounds0[2] = unitTranslation[2] + unitScale[2] / 2;\n                        BoundsHelper.rotateBounds(minBounds0, maxBounds0, unitRotation, minBounds1, maxBounds1, Constants.VECTOR3_ZERO);\n                        min(minBounds, minBounds, minBounds1);\n                        max(maxBounds, maxBounds, maxBounds1);\n                    }\n                    break;\n                case UnitType.cylinder:\n                case UnitType.cylinderSdf:\n                    minBounds0 = create$3();\n                    maxBounds0 = create$3();\n                    const pa = create$3();\n                    const pb = create$3();\n                    const identityRotation = Constants.VECTOR3_UNITY;\n                    let ca;\n                    for (let i = 0; i < count; i++) {\n                        const id = ids[i + offset];\n                        const index = lookup[id];\n                        UnitVertex.getTranslation(dataView, index, unitTranslation);\n                        UnitVertex.getRotation(dataView, index, unitRotation);\n                        UnitVertex.getScale(dataView, index, unitScale);\n                        const length = unitScale[1];\n                        const radius = Math.max(unitScale[0], unitScale[2]);\n                        if (length != 0 && radius != 0) {\n                            if (equals$1(unitRotation, Constants.QUAT_IDENTITY)) {\n                                ca = identityRotation;\n                            }\n                            else {\n                                ca = create$3();\n                                transformQuat(ca, identityRotation, unitRotation);\n                            }\n                            scaleAndAdd(pa, unitTranslation, ca, -length * 0.5);\n                            scaleAndAdd(pb, unitTranslation, ca, length * 0.5);\n                            BoundsHelper.cylinder(pa, pb, radius, minBounds0, maxBounds0);\n                            min(minBounds, minBounds, minBounds0);\n                            max(maxBounds, maxBounds, maxBounds0);\n                        }\n                    }\n                    break;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Scatter extends LayoutBase {\n        layout(buffer, ids, options) {\n            const start = window.performance.now();\n            const offset = options.offset === undefined ? 0 : options.offset;\n            const count = options.count === undefined ? ids.length : options.count;\n            const positionScalingX = options.positionScalingX === undefined ? 1 : options.positionScalingX;\n            const positionScalingY = options.positionScalingY === undefined ? 1 : options.positionScalingY;\n            const positionScalingZ = options.positionScalingZ === undefined ? 1 : options.positionScalingZ;\n            if (!this._positions || this._positions.length < buffer.length * 3) {\n                this._positions = new Float32Array(buffer.length * 3);\n            }\n            this.minLayoutBoundsX = Number.MAX_VALUE;\n            this.minLayoutBoundsY = Number.MAX_VALUE;\n            this.minLayoutBoundsZ = Number.MAX_VALUE;\n            this.maxLayoutBoundsX = -Number.MAX_VALUE;\n            this.maxLayoutBoundsY = -Number.MAX_VALUE;\n            this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n            const lookup = buffer.lookup;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const index = lookup[id];\n                let positionX = options.positionsX ? options.positionsX[id] * positionScalingX : 0;\n                let positionY = options.positionsY ? options.positionsY[id] * positionScalingY : 0;\n                let positionZ = options.positionsZ ? options.positionsZ[id] * positionScalingZ : 0;\n                this._positions[index * 3] = positionX;\n                this._positions[index * 3 + 1] = positionY;\n                this._positions[index * 3 + 2] = positionZ;\n                this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, positionX);\n                this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, positionY);\n                this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, positionZ);\n                this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, positionX);\n                this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, positionY);\n                this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, positionZ);\n            }\n            this._updateCumulativeLayoutBounds();\n            this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        update(buffer, ids, options) {\n            const start = window.performance.now();\n            const offset = options.offset === undefined ? 0 : options.offset;\n            const count = options.count === undefined ? ids.length : options.count;\n            const dataView = buffer.dataView;\n            const _vec2 = create();\n            const _vec3 = create$3();\n            const _vec4 = create$2();\n            const _quat = create$1();\n            const sizeScalingX = options.sizeScaling === undefined ? options.sizeScalingX === undefined ? 1 : options.sizeScalingX : options.sizeScaling;\n            const sizeScalingY = options.sizeScaling === undefined ? options.sizeScalingY === undefined ? 1 : options.sizeScalingY : options.sizeScaling;\n            const sizeScalingZ = options.sizeScaling === undefined ? options.sizeScalingZ === undefined ? 1 : options.sizeScalingZ : options.sizeScaling;\n            const sizesX = options.sizes ? options.sizes : options.sizesX;\n            const sizesY = options.sizes ? options.sizes : options.sizesY;\n            const sizesZ = options.sizes ? options.sizes : options.sizesZ;\n            const minSize = options.minSize === undefined ? 0 : options.minSize;\n            const minColor = options.minColor === undefined ? 0 : options.minColor;\n            const maxColor = options.maxColor === undefined ? 1 : options.maxColor;\n            const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n            const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n            const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n            const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n            const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n            const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n            const reverseX = options.reverseX === undefined ? false : options.reverseX;\n            const reverseY = options.reverseY === undefined ? false : options.reverseY;\n            const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n            this._updateModelBounds(options);\n            if (options.rotation) {\n                _quat[0] = options.rotation[0];\n                _quat[1] = options.rotation[1];\n                _quat[2] = options.rotation[2];\n                _quat[3] = options.rotation[3];\n            }\n            else {\n                rotationTo(_quat, this._core.config.identityRotation, Constants.VECTOR3_UNITY);\n            }\n            if (options.texCoord) {\n                _vec4[0] = options.texCoord[0];\n                _vec4[1] = options.texCoord[1];\n                _vec4[2] = options.texCoord[2];\n                _vec4[3] = options.texCoord[3];\n            }\n            const lookup = buffer.lookup;\n            const selection = options.selected && options.selected.size > 0;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const index = lookup[id];\n                let positionX = this._positions[index * 3];\n                let positionY = this._positions[index * 3 + 1];\n                let positionZ = this._positions[index * 3 + 2];\n                if (this._isFacetted) {\n                    if (reverseX) {\n                        positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                    }\n                    if (reverseY) {\n                        positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                    }\n                    if (reverseZ) {\n                        positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                    }\n                    const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                    const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                    const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                    positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                    positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                    positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n                }\n                else {\n                    if (reverseX) {\n                        positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                    }\n                    if (reverseY) {\n                        positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                    }\n                    if (reverseZ) {\n                        positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n                    }\n                }\n                _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n                _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n                _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n                UnitVertex.setTranslation(dataView, index, _vec3);\n                _vec3[0] = Math.max((sizesX ? Math.abs(sizesX[id]) : 1) * sizeScalingX, minSize) * this._boundsScaling;\n                _vec3[1] = Math.max((sizesY ? Math.abs(sizesY[id]) : 1) * sizeScalingY, minSize) * this._boundsScaling;\n                _vec3[2] = Math.max((sizesZ ? Math.abs(sizesZ[id]) : 1) * sizeScalingZ, minSize) * this._boundsScaling;\n                UnitVertex.setScale(dataView, index, _vec3);\n                if (options.rotations) {\n                    _quat[0] = options.rotations[id * 4];\n                    _quat[1] = options.rotations[id * 4 + 1];\n                    _quat[2] = options.rotations[id * 4 + 2];\n                    _quat[3] = options.rotations[id * 4 + 3];\n                    UnitVertex.setRotation(dataView, index, _quat);\n                }\n                else {\n                    UnitVertex.setRotation(dataView, index, _quat);\n                }\n                if (options.colors) {\n                    const size = 1 / (maxColor - minColor + 1);\n                    const color = MathHelper.normalize(options.colors[id], minColor, maxColor, size / 2, 1 - size / 2);\n                    if (options.colors1) {\n                        const color1 = MathHelper.normalize(options.colors1[id], minColor, maxColor, size / 2, 1 - size / 2);\n                        set(_vec2, color, color1);\n                    }\n                    else {\n                        set(_vec2, color, color);\n                    }\n                    UnitVertex.setColor(dataView, index, _vec2);\n                }\n                else {\n                    UnitVertex.setColor(dataView, index, Constants.VECTOR2_ONE);\n                }\n                UnitVertex.setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n                UnitVertex.setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n                if (options.order !== undefined) {\n                    const order = MathHelper.normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                    _vec2[0] = orderReverse ? 1 - order : order;\n                }\n                else {\n                    _vec2[0] = count == 1 ? 0 : i / (count - 1);\n                }\n                if (options.staggerOrder !== undefined) {\n                    _vec2[1] = options.staggerOrder;\n                }\n                else if (options.staggerOrders) {\n                    const stagger = MathHelper.normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                    _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n                }\n                else {\n                    _vec2[1] = count == 1 ? 0 : i / (count - 1);\n                }\n                UnitVertex.setOrder(dataView, index, _vec2);\n                UnitVertex.setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n                UnitVertex.setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n                UnitVertex.setParameter1(dataView, index, options.parameter1 ? options.parameter1 : options.parameters1 ? options.parameters1[id] : 0);\n                UnitVertex.setParameter2(dataView, index, options.parameter2 ? options.parameter2 : options.parameters2 ? options.parameters2[id] : 0);\n                UnitVertex.setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n                UnitVertex.setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n                if (options.texCoords) {\n                    _vec4[0] = options.texCoords[id * 4];\n                    _vec4[1] = options.texCoords[id * 4 + 1];\n                    _vec4[2] = options.texCoords[id * 4 + 2];\n                    _vec4[3] = options.texCoords[id * 4 + 3];\n                    UnitVertex.setTexCoord(dataView, index, _vec4);\n                }\n                else {\n                    UnitVertex.setTexCoord(dataView, index, _vec4);\n                }\n                UnitVertex.setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n                UnitVertex.setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [options.materialColors[id * 3], options.materialColors[id * 3 + 1], options.materialColors[id * 3 + 2]] : [0, 0, 0]);\n                UnitVertex.setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n                UnitVertex.setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n                UnitVertex.setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n                UnitVertex.setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n                UnitVertex.setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [options.segmentColors[id * 4], options.segmentColors[id * 4 + 1], options.segmentColors[id * 4 + 2], options.segmentColors[id * 4 + 3]] : [buffer.idColors[id * 4], buffer.idColors[id * 4 + 1], buffer.idColors[id * 4 + 2], buffer.idColors[id * 4 + 3]]);\n            }\n            buffer.update();\n            this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    fromValues$3(0.2126, 0.7152, 0.0722);\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    create$3();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    create$3();\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class PathHelper {\n        static getFilenameWithoutExtension(path) {\n            const dot = path.lastIndexOf('.');\n            if (dot == -1) {\n                return path;\n            }\n            else {\n                const start = path.lastIndexOf('/') == -1 ? 0 : path.lastIndexOf('/') + 1;\n                return path.substring(start, dot);\n            }\n        }\n        static getExtension(path) {\n            const dot = path.lastIndexOf('.');\n            if (dot == -1 || dot == path.length - 1) {\n                return null;\n            }\n            else {\n                return path.substring(dot + 1, path.length);\n            }\n        }\n        static getFilename(path) {\n            if (path.lastIndexOf('/') == -1) {\n                return path;\n            }\n            else {\n                const start = path.lastIndexOf('/') + 1;\n                return path.substring(start, path.length);\n            }\n        }\n        static getPath(path) {\n            if (path.lastIndexOf('/') == -1) {\n                return \"\";\n            }\n            else {\n                return path.substring(0, path.lastIndexOf('/'));\n            }\n        }\n        static combine(first, second) {\n            const seperator = first.lastIndexOf('/') == first.length - 1;\n            if (second.indexOf('/') == 0) {\n                if (seperator) {\n                    return first.substring(0, first.length - 1) + second;\n                }\n                else {\n                    return first + second;\n                }\n            }\n            else {\n                if (seperator) {\n                    return first + second;\n                }\n                else {\n                    return first + '/' + second;\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class TextureHelper {\n        static create(gl, width, height, format, type, filter, bytes, internalFormat = format) {\n            const texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, texture);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n            gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, bytes);\n            return texture;\n        }\n        static fromImage(gl, image, mipmaps, filter) {\n            const texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_2D, texture);\n            gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n            if (mipmaps && MathHelper.isPowerOf2(image.width) && MathHelper.isPowerOf2(image.height))\n                gl.generateMipmap(gl.TEXTURE_2D);\n            else {\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n                gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n            }\n            gl.bindTexture(gl.TEXTURE_2D, null);\n            return texture;\n        }\n        static cubemapFromImages(gl, images) {\n            const texture = gl.createTexture();\n            gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n            const targets = [\n                gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n                gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n                gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n                gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n                gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n                gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n            ];\n            for (let i = 0; i < 6; i++) {\n                gl.texImage2D(targets[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, images[i]);\n                gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n                gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n            }\n            gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n            gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n            return texture;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Line extends LayoutBase {\n        layout(buffer, ids, fromIds, toIds, options) {\n            const start = window.performance.now();\n            const offset = options.offset === undefined ? 0 : options.offset;\n            const count = options.count === undefined ? ids.length : options.count;\n            const positionScalingX = options.positionScalingX === undefined ? 1 : options.positionScalingX;\n            const positionScalingY = options.positionScalingY === undefined ? 1 : options.positionScalingY;\n            const positionScalingZ = options.positionScalingZ === undefined ? 1 : options.positionScalingZ;\n            const sizeScalingX = options.sizeScaling === undefined ? options.sizeScalingX === undefined ? 1 : options.sizeScalingX : options.sizeScaling;\n            const sizeScalingY = options.sizeScaling === undefined ? options.sizeScalingY === undefined ? 1 : options.sizeScalingY : options.sizeScaling;\n            const sizeScalingZ = options.sizeScaling === undefined ? options.sizeScalingZ === undefined ? 1 : options.sizeScalingZ : options.sizeScaling;\n            const minSize = options.minSize === undefined ? 0 : options.minSize;\n            const offsetScaling = options.offsetScaling === undefined ? 1 : options.offsetScaling;\n            if (!this._positions || this._positions.length < buffer.length * 3) {\n                this._positions = new Float32Array(buffer.length * 3);\n                this._sizes = new Float32Array(buffer.length * 3);\n                this._rotations = new Float32Array(buffer.length * 4);\n            }\n            this.minLayoutBoundsX = Number.MAX_VALUE;\n            this.minLayoutBoundsY = Number.MAX_VALUE;\n            this.minLayoutBoundsZ = Number.MAX_VALUE;\n            this.maxLayoutBoundsX = -Number.MAX_VALUE;\n            this.maxLayoutBoundsY = -Number.MAX_VALUE;\n            this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n            const _vec3 = create$3();\n            const _quat = create$1();\n            const direction = create$3();\n            const lookup = buffer.lookup;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const fromId = fromIds[id];\n                const toId = toIds[id];\n                const index = lookup[id];\n                let toPositionX = options.positionsX ? options.positionsX[toId] * positionScalingX : 0;\n                let toPositionY = options.positionsY ? options.positionsY[toId] * positionScalingY : 0;\n                let toPositionZ = options.positionsZ ? options.positionsZ[toId] * positionScalingZ : 0;\n                let fromPositionX = options.positionsX ? options.positionsX[fromId] * positionScalingX : 0;\n                let fromPositionY = options.positionsY ? options.positionsY[fromId] * positionScalingY : 0;\n                let fromPositionZ = options.positionsZ ? options.positionsZ[fromId] * positionScalingZ : 0;\n                if (fromId == toId) {\n                    this._sizes[index * 3] = 0;\n                    this._sizes[index * 3 + 1] = 0;\n                    this._sizes[index * 3 + 2] = 0;\n                    this._rotations[index * 4] = 0;\n                    this._rotations[index * 4 + 1] = 0;\n                    this._rotations[index * 4 + 2] = 0;\n                    this._rotations[index * 4 + 3] = 1;\n                }\n                else {\n                    direction[0] = toPositionX - fromPositionX;\n                    direction[1] = toPositionY - fromPositionY;\n                    direction[2] = toPositionZ - fromPositionZ;\n                    let length$1 = length(direction);\n                    scale(direction, direction, 1 / length$1);\n                    rotationTo(_quat, this._core.config.identityRotation, direction);\n                    this._rotations[index * 4] = _quat[0];\n                    this._rotations[index * 4 + 1] = _quat[1];\n                    this._rotations[index * 4 + 2] = _quat[2];\n                    this._rotations[index * 4 + 3] = _quat[3];\n                    if (options.offsets) {\n                        const fromOffset = options.offsets[fromId] * offsetScaling / 2;\n                        const toOffset = options.offsets[toId] * offsetScaling / 2;\n                        toPositionX -= direction[0] * toOffset;\n                        toPositionY -= direction[1] * toOffset;\n                        toPositionZ -= direction[2] * toOffset;\n                        fromPositionX += direction[0] * fromOffset;\n                        fromPositionY += direction[1] * fromOffset;\n                        fromPositionZ += direction[2] * fromOffset;\n                        length$1 = Math.max(length$1 - toOffset - fromOffset, minSize);\n                    }\n                    this._sizes[index * 3 + 1] = Math.max(length$1 * sizeScalingY, minSize);\n                    if (options.lineSizes) {\n                        this._sizes[index * 3] = Math.max(options.lineSizes[id] * sizeScalingX, minSize);\n                        this._sizes[index * 3 + 2] = Math.max(options.lineSizes[id] * sizeScalingZ, minSize);\n                    }\n                    else if (options.endSizes) {\n                        this._sizes[index * 3] = Math.max(options.endSizes[fromId] * sizeScalingX, minSize);\n                        this._sizes[index * 3 + 2] = Math.max(options.endSizes[toId] * sizeScalingZ, minSize);\n                    }\n                    else {\n                        this._sizes[index * 3] = sizeScalingX;\n                        this._sizes[index * 3 + 2] = sizeScalingZ;\n                    }\n                }\n                _vec3[0] = (fromPositionX + toPositionX) / 2;\n                _vec3[1] = (fromPositionY + toPositionY) / 2;\n                _vec3[2] = (fromPositionZ + toPositionZ) / 2;\n                this._positions[index * 3] = _vec3[0];\n                this._positions[index * 3 + 1] = _vec3[1];\n                this._positions[index * 3 + 2] = _vec3[2];\n                this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, fromPositionX);\n                this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, fromPositionY);\n                this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, fromPositionZ);\n                this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, toPositionX);\n                this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, toPositionY);\n                this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, toPositionZ);\n                this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, fromPositionX);\n                this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, fromPositionY);\n                this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, fromPositionZ);\n                this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, toPositionX);\n                this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, toPositionY);\n                this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, toPositionZ);\n            }\n            this._updateCumulativeLayoutBounds();\n            this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        update(buffer, ids, fromIds, toIds, options) {\n            const start = window.performance.now();\n            const offset = options.offset === undefined ? 0 : options.offset;\n            const count = options.count === undefined ? ids.length : options.count;\n            const dataView = buffer.dataView;\n            const _vec2 = create();\n            const _vec3 = create$3();\n            const _quat = create$1();\n            const endMinColor = options.endMinColor === undefined ? 0 : options.endMinColor;\n            const endMaxColor = options.endMaxColor === undefined ? 1 : options.endMaxColor;\n            const lineMinColor = options.lineMinColor === undefined ? 0 : options.lineMinColor;\n            const lineMaxColor = options.lineMaxColor === undefined ? 1 : options.lineMaxColor;\n            const minOrder = options.minOrder === undefined ? 0 : options.minOrder;\n            const maxOrder = options.maxOrder === undefined ? 1 : options.maxOrder;\n            const orderReverse = options.orderReverse === undefined ? false : options.orderReverse;\n            const minStaggerOrder = options.minStaggerOrder === undefined ? 0 : options.minStaggerOrder;\n            const maxStaggerOrder = options.maxStaggerOrder === undefined ? 1 : options.maxStaggerOrder;\n            const staggerOrderReverse = options.staggerOrderReverse === undefined ? false : options.staggerOrderReverse;\n            const reverseX = options.reverseX === undefined ? false : options.reverseX;\n            const reverseY = options.reverseY === undefined ? false : options.reverseY;\n            const reverseZ = options.reverseZ === undefined ? false : options.reverseZ;\n            this._updateModelBounds(options);\n            const lookup = buffer.lookup;\n            const selection = options.selected && options.selected.size > 0;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const fromId = fromIds[id];\n                const toId = toIds[id];\n                const index = lookup[id];\n                let positionX = this._positions[index * 3];\n                let positionY = this._positions[index * 3 + 1];\n                let positionZ = this._positions[index * 3 + 2];\n                if (this._isFacetted) {\n                    if (reverseX) {\n                        positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n                    }\n                    if (reverseY) {\n                        positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n                    }\n                    if (reverseZ) {\n                        positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n                    }\n                    const facetX = options.facetCoordsX ? options.facetCoordsX[id] : 0;\n                    const facetY = options.facetCoordsY ? options.facetCoordsY[id] : 0;\n                    const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id] : 0;\n                    positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n                    positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n                    positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n                }\n                else {\n                    if (reverseX) {\n                        positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n                    }\n                    if (reverseY) {\n                        positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n                    }\n                    if (reverseZ) {\n                        positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n                    }\n                }\n                _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n                _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n                _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n                UnitVertex.setTranslation(dataView, index, _vec3);\n                _vec3[0] = this._sizes[index * 3] * this._boundsScaling;\n                _vec3[1] = this._sizes[index * 3 + 1] * this._boundsScaling;\n                _vec3[2] = this._sizes[index * 3 + 2] * this._boundsScaling;\n                UnitVertex.setScale(dataView, index, _vec3);\n                _quat[0] = this._rotations[index * 4];\n                _quat[1] = this._rotations[index * 4 + 1];\n                _quat[2] = this._rotations[index * 4 + 2];\n                _quat[3] = this._rotations[index * 4 + 3];\n                if (reverseX) {\n                    _quat[1] = -_quat[1];\n                    _quat[2] = -_quat[2];\n                }\n                if (reverseY) {\n                    _quat[0] = -_quat[0];\n                    _quat[2] = -_quat[2];\n                }\n                if (reverseZ) {\n                    _quat[0] = -_quat[0];\n                    _quat[1] = -_quat[1];\n                }\n                UnitVertex.setRotation(dataView, index, _quat);\n                let size;\n                if (options.endColors) {\n                    size = 1 / (endMaxColor - endMinColor + 1);\n                    const fromColor = MathHelper.normalize(options.endColors[fromId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n                    const toColor = MathHelper.normalize(options.endColors[toId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n                    set(_vec2, fromColor, toColor);\n                    UnitVertex.setColor(dataView, index, _vec2);\n                }\n                else if (options.lineColors) {\n                    size = 1 / (lineMaxColor - lineMinColor + 1);\n                    const color = MathHelper.normalize(options.lineColors[id], lineMinColor, lineMaxColor, size / 2, 1 - size / 2);\n                    set(_vec2, color, color);\n                    UnitVertex.setColor(dataView, index, _vec2);\n                }\n                else {\n                    UnitVertex.setColor(dataView, index, Constants.VECTOR2_ONE);\n                }\n                UnitVertex.setIdHover(dataView, index, options.hover ? options.hover[id] : id);\n                UnitVertex.setSelected(dataView, index, selection ? options.selected.has(id) ? 1 : -1 : 0);\n                if (options.order !== undefined) {\n                    const order = MathHelper.normalize(options.order[id], minOrder, maxOrder, 0, 1);\n                    _vec2[0] = orderReverse ? 1 - order : order;\n                }\n                else {\n                    _vec2[0] = count == 1 ? 0 : i / (count - 1);\n                }\n                if (options.staggerOrder !== undefined) {\n                    _vec2[1] = options.staggerOrder;\n                }\n                else if (options.staggerOrders) {\n                    const stagger = MathHelper.normalize(options.staggerOrders[id], minStaggerOrder, maxStaggerOrder, 0, 1);\n                    _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n                }\n                else {\n                    _vec2[1] = count == 1 ? 0 : i / (count - 1);\n                }\n                UnitVertex.setOrder(dataView, index, _vec2);\n                UnitVertex.setMaterial(dataView, index, options.material ? options.material : options.materials ? options.materials[id] : 0);\n                UnitVertex.setRounding(dataView, index, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id] * this._boundsScaling : 0);\n                UnitVertex.setSdfBuffer(dataView, index, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id] : this._core.config.sdfBuffer);\n                UnitVertex.setSdfBorder(dataView, index, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id] : this._core.config.sdfBorder);\n                UnitVertex.setMatId(dataView, index, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id] : 0);\n                UnitVertex.setMatColor(dataView, index, options.materialColor ? options.materialColor : options.materialColors ? [options.materialColors[id * 3], options.materialColors[id * 3 + 1], options.materialColors[id * 3 + 2]] : [0, 0, 0]);\n                UnitVertex.setMatFuzz(dataView, index, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id] : 0);\n                UnitVertex.setMatGloss(dataView, index, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id] : 0);\n                UnitVertex.setMatDensity(dataView, index, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id] : 0);\n                UnitVertex.setMatRefractiveIndex(dataView, index, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id] : 0);\n                UnitVertex.setSegColor(dataView, index, options.segmentColor ? options.segmentColor : options.segmentColors ? [options.segmentColors[id * 4], options.segmentColors[id * 4 + 1], options.segmentColors[id * 4 + 2], options.segmentColors[id * 4 + 3]] : [buffer.idColors[id * 4], buffer.idColors[id * 4 + 1], buffer.idColors[id * 4 + 2], buffer.idColors[id * 4 + 3]]);\n            }\n            buffer.update();\n            this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AtlasBase {\n        get imageData() { return this._imageData; }\n        set imageData(value) {\n            if (this._imageData != value) {\n                this._imageData = value;\n                this._changed = true;\n            }\n        }\n        constructor() {\n            this._imageData = null;\n        }\n        copyFrom(atlas) {\n            if (atlas.imageData) {\n                this._imageData = atlas.imageData;\n                this._changed = true;\n            }\n            else {\n                this.imageData = null;\n            }\n        }\n        update() { }\n    }\n    let Atlas$2 = class Atlas extends AtlasBase {\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class BufferBase {\n        get isInitialized() { return this._isInitialized; }\n        get ids() { return this._ids; }\n        get dataView() { return this._dataView; }\n        get vertices() { return this._vertices; }\n        get lookup() { return this._lookup; }\n        get length() { return this._length; }\n        get selected() { return this._selected; }\n        constructor(core, ids) {\n            this._core = core;\n            this._ids = ids;\n            this._length = ids.length;\n            this._vertices = new ArrayBuffer(this._length * UnitVertex.SIZE_BYTES);\n            this._dataView = new DataView(this._vertices);\n            this._selected = new Set();\n            this.from = 0;\n            this.to = 1;\n            this.unitType = UnitType.block;\n            this._lookup = {};\n            for (let i = 0; i < this._length; i++) {\n                const id = ids[i];\n                this._lookup[id] = i;\n                UnitVertex.setRotation(this._dataView, i, Constants.QUAT_IDENTITY);\n            }\n        }\n        createShared() {\n            const buffer = Object.create(this);\n            buffer._vertices = new ArrayBuffer(buffer._vertices.byteLength);\n            buffer._dataView = new DataView(buffer._vertices);\n            return buffer;\n        }\n        copyFrom(buffer) {\n            const start = window.performance.now();\n            const fromDataView = buffer.dataView;\n            const toDataView = this._dataView;\n            const lookup = buffer.lookup;\n            for (let i = 0; i < this._length; i++) {\n                const index = lookup[this._ids[i]];\n                if (index != null) {\n                    UnitVertex.copyIdHover(fromDataView, index, toDataView, i);\n                    UnitVertex.copyTranslation(fromDataView, index, toDataView, i);\n                    UnitVertex.copyScale(fromDataView, index, toDataView, i);\n                    UnitVertex.copyRotation(fromDataView, index, toDataView, i);\n                    UnitVertex.copyColor(fromDataView, index, toDataView, i);\n                    UnitVertex.copySelected(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMaterial(fromDataView, index, toDataView, i);\n                    UnitVertex.copyRounding(fromDataView, index, toDataView, i);\n                    UnitVertex.copyOrder(fromDataView, index, toDataView, i);\n                    UnitVertex.copyTexCoord(fromDataView, index, toDataView, i);\n                    UnitVertex.copyTexture(fromDataView, index, toDataView, i);\n                    UnitVertex.copySdfBuffer(fromDataView, index, toDataView, i);\n                    UnitVertex.copySdfBorder(fromDataView, index, toDataView, i);\n                    UnitVertex.copyParameter1(fromDataView, index, toDataView, i);\n                    UnitVertex.copyParameter2(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatId(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatColor(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatFuzz(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatRefractiveIndex(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatGloss(fromDataView, index, toDataView, i);\n                    UnitVertex.copyMatDensity(fromDataView, index, toDataView, i);\n                    UnitVertex.copySegColor(fromDataView, index, toDataView, i);\n                }\n                else {\n                    UnitVertex.setRotation(toDataView, i, Constants.QUAT_IDENTITY);\n                }\n            }\n            this.unitType = buffer.unitType;\n            this._selected = buffer.selected;\n            this._core.log.write(LogLevel.info, `buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        update() { }\n        updateSelection(options) {\n            const start = window.performance.now();\n            const ids = options && options.ids ? options.ids : this._ids;\n            const offset = options && options.offset !== undefined ? options.offset : 0;\n            const count = options && options.count !== undefined ? options.count : ids.length;\n            const selection = this._selected.size > 0;\n            const dataView = this._dataView;\n            for (let i = 0; i < count; i++) {\n                const id = ids[i + offset];\n                const index = this._lookup[id];\n                UnitVertex.setSelected(dataView, index, selection ? this._selected.has(id) ? 1 : -1 : 0);\n            }\n            this.update();\n            this._core.log.write(LogLevel.info, `buffer update selection ${count} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n    class TransitionBufferBase {\n        get pickIdLookup() { return this._pickIdLookup; }\n        get currentBuffer() { return this._isBuffer1Current ? this._buffer1 : this._buffer2; }\n        get previousBuffer() { return this._isBuffer1Current ? this._buffer2 : this._buffer1; }\n        get currentPalette() { return this._isBuffer1Current ? this._palette1 : this._palette2; }\n        get previousPalette() { return this._isBuffer1Current ? this._palette2 : this._palette1; }\n        get currentAtlas() { return this._isBuffer1Current ? this._atlas1 : this._atlas2; }\n        get previousAtlas() { return this._isBuffer1Current ? this._atlas2 : this._atlas1; }\n        get isInitialized() { return this._isInitialized; }\n        get length() { return this._length; }\n        constructor(core, ids, bufferType, paletteType, atlasType) {\n            this.bufferType = bufferType;\n            this.paletteType = paletteType;\n            this.atlasType = atlasType;\n            this._core = core;\n            this._length = ids.length;\n            this.id = TransitionBufferBase._id++;\n            this.isVisible = true;\n            this.transitionTime = 1;\n            this.activeId = -1;\n            const start = window.performance.now();\n            this._buffer1 = new bufferType(core, ids);\n            this._buffer2 = this._buffer1.createShared();\n            this._palette1 = new paletteType();\n            this._palette2 = new paletteType();\n            this._atlas1 = new atlasType();\n            this._atlas2 = new atlasType();\n            this.isPickingEnabled = true;\n            this._pickIdLookup = {};\n            const dataView1 = this._buffer1.dataView;\n            const dataView2 = this._buffer2.dataView;\n            const _vec4 = create$2();\n            this.idColors = new Float32Array(this._length * 4);\n            this._buffer1.idColors = this.idColors;\n            this._buffer2.idColors = this.idColors;\n            for (let i = 0; i < this._length; i++) {\n                const id = ids[i];\n                const pickId = PickHelper.nextPickId();\n                this._pickIdLookup[pickId] = id;\n                PickHelper.encodeNumber(pickId, PickType.data, _vec4);\n                this.idColors[i * 4] = _vec4[0];\n                this.idColors[i * 4 + 1] = _vec4[1];\n                this.idColors[i * 4 + 2] = _vec4[2];\n                this.idColors[i * 4 + 3] = _vec4[3];\n                UnitVertex.setIdColor(dataView1, i, _vec4);\n                UnitVertex.setIdColor(dataView2, i, _vec4);\n            }\n            this._core.log.write(LogLevel.info, `transition buffer created ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n        swap() {\n            this._isBuffer1Current = !this._isBuffer1Current;\n        }\n        copyFrom(transitionBuffer) {\n            const start = window.performance.now();\n            this.key = transitionBuffer.key;\n            this.isVisible = transitionBuffer.isVisible;\n            this.transitionTime = transitionBuffer.transitionTime;\n            this.isPickingEnabled = transitionBuffer.isPickingEnabled;\n            this.unitType = transitionBuffer.unitType;\n            this.activeId = transitionBuffer.activeId;\n            this.currentBuffer.copyFrom(transitionBuffer.currentBuffer);\n            this.previousBuffer.copyFrom(transitionBuffer.previousBuffer);\n            this.currentBuffer.update();\n            this.previousBuffer.update();\n            this.currentPalette.copyFrom(transitionBuffer.currentPalette);\n            this.previousPalette.copyFrom(transitionBuffer.previousPalette);\n            this.currentAtlas.copyFrom(transitionBuffer.currentAtlas);\n            this.previousAtlas.copyFrom(transitionBuffer.previousAtlas);\n            this._core.log.write(LogLevel.info, `transition buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n        }\n    }\n    TransitionBufferBase._id = 1;\n    let Buffer$2 = class Buffer extends BufferBase {\n        constructor(core, ids) {\n            super(core, ids);\n        }\n    };\n    let TransitionBuffer$2 = class TransitionBuffer extends TransitionBufferBase {\n        constructor(core, ids) {\n            super(core, ids, Buffer$2, Palette$2, Atlas$2);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DebugAxes {\n        get vertices() { return this._vertices; }\n        get indices() { return this._indices; }\n        get indexCount() { return this._indexCount; }\n        get isInitialized() { return this._isInitialized; }\n        initialize() {\n            let vertexOffset = 0;\n            let indexOffset = 0;\n            const axisVertices = Cube.POSITIONS;\n            const axisIndices = Cube.INDICES;\n            this._vertices = new ArrayBuffer(3 * PositionColorVertex.SIZE_BYTES * axisVertices.length / PositionVertex.SIZE);\n            const verticesView = new DataView(this._vertices);\n            this._indices = new Uint16Array(3 * axisIndices.length + 4);\n            const vertexCount = axisVertices.length / PositionVertex.SIZE;\n            const indexCount = axisIndices.length;\n            const transform = create$4();\n            const length = 1;\n            const width = 0.01;\n            transform[0] = length;\n            transform[5] = width;\n            transform[10] = width;\n            transform[12] = 0.5;\n            transform[13] = 0;\n            transform[14] = 0;\n            this._createAxis(axisVertices, axisIndices, verticesView, this._indices, Constants.VECTOR3_UNITX, transform, vertexOffset, indexOffset);\n            indexOffset += indexCount;\n            this._indices[indexOffset++] = axisIndices[indexCount - 1] + vertexOffset;\n            vertexOffset += vertexCount;\n            this._indices[indexOffset++] = axisIndices[0] + vertexOffset;\n            transform[0] = width;\n            transform[5] = length;\n            transform[10] = width;\n            transform[12] = 0;\n            transform[13] = 0.5;\n            transform[14] = 0;\n            this._createAxis(axisVertices, axisIndices, verticesView, this._indices, Constants.VECTOR3_UNITY, transform, vertexOffset, indexOffset);\n            indexOffset += indexCount;\n            this._indices[indexOffset++] = axisIndices[indexCount - 1] + vertexOffset;\n            vertexOffset += vertexCount;\n            this._indices[indexOffset++] = axisIndices[0] + vertexOffset;\n            transform[0] = width;\n            transform[5] = width;\n            transform[10] = length;\n            transform[12] = 0;\n            transform[13] = 0;\n            transform[14] = 0.5;\n            this._createAxis(axisVertices, axisIndices, verticesView, this._indices, Constants.VECTOR3_UNITZ, transform, vertexOffset, indexOffset);\n            this._indexCount = this._indices.length;\n            this._isInitialized = true;\n        }\n        update(elapsedTime) { }\n        _createAxis(axisVertices, axisIndices, verticesView, indices, color, transform, vertexOffset, indexOffset) {\n            const position = create$3();\n            const vertexCount = axisVertices.length / PositionVertex.SIZE;\n            const indexCount = axisIndices.length;\n            for (let i = 0; i < vertexCount; i++) {\n                set$3(position, axisVertices[i * PositionVertex.SIZE], axisVertices[i * PositionVertex.SIZE + 1], axisVertices[i * PositionVertex.SIZE + 2]);\n                transformMat4$2(position, position, transform);\n                PositionColorVertex.setPosition(verticesView, vertexOffset + i, position);\n                PositionColorVertex.setColor(verticesView, vertexOffset + i, color);\n            }\n            for (let i = 0; i < indexCount; i++) {\n                indices[indexOffset + i] = axisIndices[i] + vertexOffset;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    var __awaiter$2 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    class RendererConfig {\n        reset() { }\n    }\n    class RendererBase {\n        get isInitialized() { return this._isInitialized; }\n        get config() { return this._config; }\n        get devicePixelRatio() { return this._devicePixelRatio; }\n        get width() { return this._canvas.width; }\n        set width(value) { this._options.width = value; }\n        get height() { return this._canvas.height; }\n        set height(value) { this._options.height = value; }\n        get webXRReferenceSpace() { return this._webXRReferenceSpace; }\n        get pickedType() { return this._pickedType; }\n        get pickedId() { return this._pickedId; }\n        get isCapturingPickImage() { return this._isCapturingPickImage; }\n        capturePickImage() {\n            this._isCapturingPickImage = true;\n        }\n        get backgroundColor() { return this._backgroundColor; }\n        set backgroundColor(value) {\n            if (!exactEquals(value, this._backgroundColor)) {\n                this._backgroundColor = value;\n            }\n        }\n        get ambientColor() { return this._ambientColor; }\n        set ambientColor(value) {\n            if (!exactEquals$1(value, this._ambientColor)) {\n                this._ambientColor = value;\n            }\n        }\n        get currentAxes() { return this._isAxes1Current ? this._axes1 : this._axes2; }\n        set currentAxes(value) { if (this._isAxes1Current) {\n            this._axes1 = value;\n        }\n        else {\n            this._axes2 = value;\n        } }\n        get previousAxes() { return this._isAxes1Current ? this._axes2 : this._axes1; }\n        set previousAxes(value) { if (this._isAxes1Current) {\n            this._axes2 = value;\n        }\n        else {\n            this._axes1 = value;\n        } }\n        swapAxes() { this._isAxes1Current = !this._isAxes1Current; }\n        createCartesian2dAxesVisual(axes) {\n            return new AxesVisual(axes);\n        }\n        createCartesian3dAxesVisual(axes) {\n            return new AxesVisual(axes);\n        }\n        _createDebugAxesVisual(debugAxes) { return null; }\n        createLabelSetVisual(labelSet) {\n            return new LabelSetVisual$2(labelSet);\n        }\n        createControllerVisual(controller) {\n            return new ControllerVisual$1(controller);\n        }\n        ;\n        createTransitionBuffer(ids) {\n            return new TransitionBuffer$2(this._core, ids);\n        }\n        createImageVisual(image) {\n            return new ImageVisual$2(image);\n        }\n        ;\n        createFontVisual(font) {\n            return new FontVisual$2(font);\n        }\n        constructor(options) {\n            this._options = options;\n            this.fonts = {};\n        }\n        get isWebXRSupported() { return false; }\n        initialize(core) {\n            this._core = core;\n            this._canvas = document.createElement(\"canvas\");\n            const contextmenu = this._options && this._options.contextmenu;\n            if (!contextmenu) {\n                this._canvas.addEventListener(\"contextmenu\", (e) => { e.preventDefault(); });\n            }\n            this._canvas.tabIndex = this._core.container.tabIndex;\n            this._canvas.style.display = \"block\";\n            this._canvas.style.touchAction = \"none\";\n            this._core.container.appendChild(this._canvas);\n            this._mvMatrices = [create$4(), create$4()];\n            this.pickPMatrix = create$4();\n            this.axesVisibility = AxesVisibility.current;\n            this._debugAxes = new DebugAxes();\n            this._debugAxesVisual = this._createDebugAxesVisual(this._debugAxes);\n            this.transitionTime = 1;\n            this.transitionBuffers = [];\n            this.areLabelsVisible = true;\n            this.labelSets = [];\n            this.controllers = [];\n            this.areImagesVisible = true;\n            this.images = [];\n            this._viewports = [new DOMRect(), new DOMRect()];\n            this.isPickingEnabled = false;\n            this._pickedType = PickType.none;\n            this._pickedId = 0;\n            this._lassoMMatrix = create$4();\n            this._lassoThickness = create();\n            this._resizeMinimumDelay = -1;\n            this._previousResizeWidth = -1;\n            this._previousResizeHeight = -1;\n        }\n        remove() {\n            this._core.container.removeChild(this._canvas);\n        }\n        finalize() {\n            this._isInitialized = false;\n        }\n        setSize(elapsedTime) {\n            if (this._options && this._options.width && this._options.height) {\n                this._devicePixelRatio = 1;\n                this._resizeWidth = this._options.width;\n                this._resizeHeight = this._options.height;\n            }\n            else {\n                this._devicePixelRatio = window.devicePixelRatio || 1;\n                this._resizeWidth = this._core.container.clientWidth * devicePixelRatio;\n                this._resizeHeight = this._core.container.clientHeight * devicePixelRatio;\n            }\n            if (this._resizeWidth != this._previousResizeWidth || this._resizeHeight != this._previousResizeHeight) {\n                this._previousResizeWidth = this._resizeWidth;\n                this._previousResizeHeight = this._resizeHeight;\n                this._isResizing = true;\n                this._resizeElapsedTime = elapsedTime;\n            }\n            if (this._isResizing) {\n                if (this._resizeElapsedTime > this._resizeMinimumDelay && this._isInitialized) {\n                    this._isResizing = false;\n                    this._resizeMinimumDelay = this._core.config.resizeMinimumDelay;\n                    this._resize(this._resizeWidth, this._resizeHeight);\n                }\n                else {\n                    this._resizeElapsedTime += elapsedTime;\n                }\n            }\n        }\n        _resize(width, height) {\n            this._canvas.style.width = `${Math.floor(width / this._devicePixelRatio)}px`;\n            this._canvas.style.height = `${Math.floor(height / this._devicePixelRatio)}px`;\n            width = Math.floor(width);\n            height = Math.floor(height);\n            this._canvas.width = width;\n            this._canvas.height = height;\n        }\n        update(elapsedTime) {\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                const transitionBuffer = this.transitionBuffers[i];\n                if (transitionBuffer.isVisible) {\n                    const previous = transitionBuffer.previousPalette;\n                    const current = transitionBuffer.currentPalette;\n                    if (previous) {\n                        previous.update();\n                    }\n                    if (current) {\n                        current.update();\n                    }\n                }\n            }\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                const transitionBuffer = this.transitionBuffers[i];\n                if (transitionBuffer.isVisible) {\n                    const previous = transitionBuffer.previousAtlas;\n                    const current = transitionBuffer.currentAtlas;\n                    if (previous) {\n                        previous.update();\n                    }\n                    if (current) {\n                        current.update();\n                    }\n                }\n            }\n            if (this._core.config.isDebugVisible) {\n                if (this._debugAxesVisual) {\n                    this._debugAxesVisual.mMatrix = this.mMatrix;\n                    this._debugAxesVisual.vMatrices = this.vMatrices;\n                    this._debugAxesVisual.pMatrices = this.pMatrices;\n                    this._debugAxesVisual.viewports = this._viewports;\n                    this._debugAxesVisual.viewportOffset = this._viewportOffset;\n                    this._debugAxesVisual.viewportCount = this._viewportCount;\n                }\n            }\n            if (this.areLabelsVisible) {\n                for (let i = 0; i < this.labelSets.length; i++) {\n                    const labelSetVisual = this.labelSets[i];\n                    if (labelSetVisual.isVisible) {\n                        this.labelSets[i].label.update(elapsedTime);\n                        labelSetVisual.mMatrix = this.mMatrix;\n                        labelSetVisual.vMatrices = this.vMatrices;\n                        labelSetVisual.pMatrices = this.pMatrices;\n                        labelSetVisual.isPickingEnabled = this.isPickingEnabled;\n                        labelSetVisual.pickPMatrix = this.pickPMatrix;\n                        labelSetVisual.pickVMatrix = this.pickVMatrix;\n                        labelSetVisual.viewports = this._viewports;\n                        labelSetVisual.viewportOffset = this._viewportOffset;\n                        labelSetVisual.viewportCount = this._viewportCount;\n                        labelSetVisual.update(elapsedTime);\n                    }\n                }\n            }\n            if (this.areImagesVisible) {\n                for (let i = 0; i < this.images.length; i++) {\n                    const imageVisual = this.images[i];\n                    if (imageVisual && imageVisual.isVisible) {\n                        const image = this.images[i].image;\n                        image.update(elapsedTime);\n                        imageVisual.mMatrix = this.mMatrix;\n                        imageVisual.vMatrices = this.vMatrices;\n                        imageVisual.pMatrices = this.pMatrices;\n                        imageVisual.isPickingEnabled = this.isPickingEnabled;\n                        imageVisual.pickPMatrix = this.pickPMatrix;\n                        imageVisual.pickVMatrix = this.pickVMatrix;\n                        imageVisual.viewports = this._viewports;\n                        imageVisual.viewportOffset = this._viewportOffset;\n                        imageVisual.viewportCount = this._viewportCount;\n                        imageVisual.update(elapsedTime);\n                    }\n                }\n            }\n            for (let i = 0; i < this.controllers.length; i++) {\n                const controllerVisual = this.controllers[i];\n                if (controllerVisual.isVisible) {\n                    const controller = this.controllers[i].controller;\n                    controller.update(elapsedTime);\n                    controllerVisual.vMatrices = this.vMatrices;\n                    controllerVisual.inverseVMatrices = this.vMatrices;\n                    controllerVisual.pMatrices = this.pMatrices;\n                    controllerVisual.viewports = this._viewports;\n                    controllerVisual.viewportOffset = this._viewportOffset;\n                    controllerVisual.viewportCount = this._viewportCount;\n                    controllerVisual.update(elapsedTime);\n                }\n            }\n            const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n            if (axesVisuals) {\n                for (let i = 0; i < axesVisuals.length; i++) {\n                    const axesVisual = axesVisuals[i];\n                    if (axesVisual.isVisible) {\n                        const axes = axesVisual.axes;\n                        axes.mMatrix = this.mMatrix;\n                        axes.vMatrix = this.vMatrices[0];\n                        axes.update(elapsedTime);\n                        axesVisual.vMatrices = this.vMatrices;\n                        axesVisual.pMatrices = this.pMatrices;\n                        axesVisual.isPickingEnabled = this.isPickingEnabled;\n                        axesVisual.pickPMatrix = this.pickPMatrix;\n                        axesVisual.pickVMatrix = this.pickVMatrix;\n                        axesVisual.viewports = this._viewports;\n                        axesVisual.viewportOffset = this._viewportOffset;\n                        axesVisual.viewportCount = this._viewportCount;\n                        axesVisual.update(elapsedTime);\n                    }\n                }\n            }\n            for (const key in this.fonts) {\n                const fontVisual = this.fonts[key];\n                const font = fontVisual.font;\n                font.update();\n                fontVisual.update();\n            }\n        }\n        getVertexPosition(position, pickedId) {\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                const transitionBuffer = this.transitionBuffers[i];\n                const id = transitionBuffer.pickIdLookup[pickedId];\n                if (id > -1) {\n                    const index = transitionBuffer.currentBuffer.lookup[id];\n                    const dataView = transitionBuffer.currentBuffer.dataView;\n                    UnitVertex.getTranslation(dataView, index, position);\n                    break;\n                }\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            return __awaiter$2(this, void 0, void 0, function* () { });\n        }\n        prepare(xrFrame) { }\n        initializeWebXR(session) {\n            return null;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Quad$1 = class Quad {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        get indexBuffer() { return this._indexBuffer; }\n        get indexCount() { return this._indexCount; }\n        initializeContext(gl) {\n            const _vec3 = fromValues$3(2, 2, 2);\n            const _mat4 = create$4();\n            fromScaling(_mat4, _vec3);\n            const vertices = Quad$2.positions(_mat4);\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Quad$2.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this._indexCount = indices.length;\n            this._isInitialized = true;\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Atlas$1 = class Atlas extends AtlasBase {\n        get texture() { return this._texture; }\n        get defaultTexture() { return this._defaultTexture; }\n        initializeContext(core, gl) {\n            this._gl = gl;\n            this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([0xff, 0xff, 0xff, 0xff]));\n            this._updateTexture();\n        }\n        update() {\n            super.update();\n            if (this._changed) {\n                this._changed = false;\n                this._updateTexture();\n            }\n        }\n        _updateTexture() {\n            if (this._imageData) {\n                this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n            }\n            else {\n                this._texture = null;\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Palette$1 = class Palette extends PaletteBase {\n        get texture() { return this._texture; }\n        get defaultTexture() { return this._defaultTexture; }\n        initializeContext(core, gl) {\n            this._gl = gl;\n            this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n            this._updateTexture();\n        }\n        update() {\n            super.update();\n            if (this._changed) {\n                this._changed = false;\n                this._updateTexture();\n            }\n        }\n        _updateTexture() {\n            if (this._colors) {\n                const colors = new Uint8Array(this._colors);\n                for (let i = 0; i < colors.length; i++) {\n                    colors[i] = Math.pow(colors[i] / 0xff, 2.2) * 0xff;\n                }\n                this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors);\n            }\n            else {\n                this._texture = null;\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Buffer$1 = class Buffer extends BufferBase {\n        get vertexBuffer() { return this._vertexBuffer; }\n        initializeContext(gl) {\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update() {\n            if (this._isInitialized) {\n                const start = window.performance.now();\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n                this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n            }\n        }\n    };\n    let TransitionBuffer$1 = class TransitionBuffer extends TransitionBufferBase {\n        constructor(core, ids) {\n            super(core, ids, Buffer$1, Palette$1, Atlas$1);\n        }\n        initializeContext(gl) {\n            this._buffer1.initializeContext(gl);\n            this._buffer2.initializeContext(gl);\n            this._palette1.initializeContext(this._core, gl);\n            this._palette2.initializeContext(this._core, gl);\n            this._atlas1.initializeContext(this._core, gl);\n            this._atlas2.initializeContext(this._core, gl);\n            this._isInitialized = true;\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Config$1 = class Config extends RendererConfig {\n        constructor() {\n            super();\n            this.reset();\n        }\n        reset() {\n            this.specularIntensity = 0.15;\n            this.specularPower = 150;\n            this.lightPosition = fromValues$3(-0.5, 0.5, 0);\n            this.ambient = 0.01;\n            const _quat1 = create$1();\n            const _quat2 = create$1();\n            let angle = AngleHelper.degreesToRadians(15);\n            setAxisAngle(_quat1, Constants.VECTOR3_UNITX, angle);\n            multiply(_quat2, _quat1, _quat2);\n            angle = AngleHelper.degreesToRadians(-15);\n            setAxisAngle(_quat1, Constants.VECTOR3_UNITY, angle);\n            multiply(_quat2, _quat2, _quat1);\n            this.directionToLight = create$3();\n            transformQuat(this.directionToLight, Constants.VECTOR3_UNITZ, _quat2);\n            this.halfAngle = create$3();\n            add(this.halfAngle, Constants.VECTOR3_UNITZ, this.directionToLight);\n            normalize$2(this.halfAngle, this.halfAngle);\n            this.isFxaaEnabled = false;\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Resources$1 = class Resources {\n        bindFramebuffer(framebuffer) {\n            if (this.framebuffer != framebuffer) {\n                this.framebuffer = framebuffer;\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n            }\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this.framebuffer = this._gl.createFramebuffer();\n            this.ANGLE_instanced_arrays = gl.getExtension(\"ANGLE_instanced_arrays\");\n            this.OES_standard_derivatives = gl.getExtension(\"OES_standard_derivatives\");\n            this.EXT_frag_depth = gl.getExtension(\"EXT_frag_depth\");\n            this.OES_element_index_uint = gl.getExtension(\"OES_element_index_uint\");\n            this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n        }\n    };\n    Resources$1.glsl = {\n        \"anaglyph.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nconst vec3 LEFT_MASK = vec3(1.0, 0.0, 0.0);\\nconst vec3 RIGHT_MASK = vec3(0.0, 1.0, 1.0);\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 color = LEFT_MASK * dot(texture2D(uSampler1, texCoords).rgb, LUMINANCE);\\ncolor += RIGHT_MASK * dot(texture2D(uSampler2, texCoords).rgb, LUMINANCE);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n\",\n        \"color.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec3 vColor;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(vColor, GAMMA), 1.0);\\n}\\n\",\n        \"color.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec3 aColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying lowp vec3 vColor;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvColor = aColor;\\n}\\n\",\n        \"lasso.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\ngl_FragColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n\",\n        \"lasso.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n        \"model.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform sampler2D uSampler;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(texture2D(uSampler, vTexCoord).xyz, GAMMA), 1.0);\\nvec3 color = texture2D(uSampler, vTexCoord).xyz;\\nfloat ambient = 0.01;\\nvec3 normal = normalize(vNormal);\\nfloat diffuse = 0.5 * max(dot(uDirectionToLight, normal), 0.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (ambient + diffuse);\\ncolor += specular;\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n\",\n        \"model.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nvTexCoord = aTexCoord;\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(aNormal, 0.0));\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\n}\\n\",\n        \"pickgrid.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#define Derivatives\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nuniform vec3 uDirectionToLight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick)\\n{\\ngl_FragColor = vColor;\\n}\\nelse\\n{\\nvec2 buffer;\\n#ifdef Derivatives\\nbuffer = fwidth(vTexCoord);\\n#else\\nbuffer = vec2(0.002);\\n#endif\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nfloat diffuse = 0.2 * max(dot(uDirectionToLight, vNormal), 0.0);\\nfloat ambient = 0.8;\\ncolor.xyz *= (ambient + diffuse);\\ncolor.xyz = pow(color.xyz, GAMMA);\\ngl_FragColor = color;\\n}\\n}\\n\",\n        \"pickgrid.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec4 aIdColor;\\nattribute mediump vec2 aTexCoord;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n        \"sdftext.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#define Derivatives\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse {\\nfloat distance = texture2D(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\ngl_FragColor = vec4(pow(mix(uBorderColor, mix(uColor, uHoverColor, vHover), value), GAMMA), 1.0);\\n}\\n}\\n\",\n        \"sdftext.vertex.fx\": \"#version 100\\nattribute lowp vec4 aIdColor;\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n        \"simple.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n        \"texture.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nif (uPick) {\\ngl_FragColor = vec4(0.0);\\n}\\nelse {\\ngl_FragColor = vec4(texture2D(uSampler, vTexCoord).xyz, 1.0);\\n}\\n}\\n\",\n        \"texture.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n        \"unitblock.fragment.fx\": \"#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void)\\n{\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n\",\n        \"unitblock.vertex.fx\": \"#version 100\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n        \"unitcylinder.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - sqrt(h1);\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - sqrt(h2);\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n        \"unitcylinder.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n        \"unithexprism.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform mat4 uVMatrix;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nvec4 iHexPrism( in vec3 ro, in vec3 rd, in float ra, in float he )\\n{\\nconst vec3 n1 = vec3( 1.0,0.0,0.0);\\nconst vec3 n2 = vec3( 0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n3 = vec3(-0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n4 = vec3( 0.0,1.0,0.0);\\nvec3 t1 = vec3((vec2(ra,-ra)-dot(ro,n1))/dot(rd,n1), 1.0);\\nvec3 t2 = vec3((vec2(ra,-ra)-dot(ro,n2))/dot(rd,n2), 1.0);\\nvec3 t3 = vec3((vec2(ra,-ra)-dot(ro,n3))/dot(rd,n3), 1.0);\\nvec3 t4 = vec3((vec2(he,-he)-dot(ro,n4))/dot(rd,n4), 1.0);\\nif( t1.y<t1.x ) t1=vec3(t1.yx,-1.0);\\nif( t2.y<t2.x ) t2=vec3(t2.yx,-1.0);\\nif( t3.y<t3.x ) t3=vec3(t3.yx,-1.0);\\nif( t4.y<t4.x ) t4=vec3(t4.yx,-1.0);\\nvec4 tN=vec4(t1.x,t1.z*n1);\\nif( t2.x>tN.x ) tN=vec4(t2.x,t2.z*n2);\\nif( t3.x>tN.x ) tN=vec4(t3.x,t3.z*n3);\\nif( t4.x>tN.x ) tN=vec4(t4.x,t4.z*n4);\\nfloat tF = min(min(t1.y,t2.y),min(t3.y,t4.y));\\nif( tN.x>tF || tF<0.0) return vec4(-1.0);\\nreturn tN;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = -vViewCenter;\\nmat3 rot = mat3(uVMatrix);\\nvec3 rdd = rd * rot;\\nvec3 roo = ro * rot;\\nvec4 tnor = iHexPrism(roo, rdd, vRadius * vScaling, vHeight * vScaling);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = rot * tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n        \"unithexprism.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvRadius = 0.0;\\nvHeight = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvRadius = scale.x * ROOT_THREE_OVER_TWO;\\nvHeight = scale.y;\\nvec3 position = aPosition;\\nposition.y *= scale.y;\\nposition.z *= scale.x;\\nposition.x *= scale.x * ROOT_THREE_OVER_TWO;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvScaling = length(uMMatrix[0].xyz) / 2.0;\\n}\\n}\\n\",\n        \"unitsdf.fragment.fx\": \"#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform vec3\t uBackgroundColor;\\nuniform float \t uBuffer;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nfloat distance = mix(texture2D(uPreviousSampler1, vPreviousTexCoord).r, texture2D(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer) {\\ndiscard;\\n}\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\nfloat uGamma = 0.0;\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer + gamma, uBuffer, distance);\\ngl_FragColor = vec4(mix(color, uBackgroundColor, value), 1.0);\\n}\\n}\\n\",\n        \"unitsdf.vertex.fx\": \"#version 100\\n#include \\\"quat.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute mediump vec4 aTexCoord;\\nattribute mediump vec4 aPreviousTexCoord;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n\",\n        \"unitsphere.fragment.fx\": \"#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat sphIntersect(in vec3 ro, in vec3 rd, in vec4 sph)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot(oc, rd);\\nfloat c = dot(oc, oc) - sph.w * sph.w;\\nfloat h = b * b - c;\\nif (h < 0.0) return -1.0;\\nreturn -b - sqrt(h);\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n\",\n        \"unitsphere.vertex.fx\": \"#version 100\\n#include \\\"common.include.fx\\\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute lowp float aColor;\\nattribute lowp float aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump float vRadius;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec4 translation = vec4(mix(aPreviousTranslation, aTranslation, animation), 1.0);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * translation).xyz;\\ntranslation.xyz += aPosition * scale;\\nvViewPosition = (mvMatrix * translation).xyz;\\ngl_Position = uPMatrix * vec4(vViewPosition, 1.0);\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n\",\n        \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nmat3 transpose(in mat3 mat) {\\nvec3 i0 = mat[0];\\nvec3 i1 = mat[1];\\nvec3 i2 = mat[2];\\nreturn mat3\\n(\\nvec3(i0.x, i1.x, i2.x),\\nvec3(i0.y, i1.y, i2.y),\\nvec3(i0.z, i1.z, i2.z)\\n);\\n}\\n\",\n        \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\",\n    };\n    let ShaderBase$1 = class ShaderBase {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        set vertexBuffer(value) {\n            if (this._vertexBuffer != value) {\n                this._vertexBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        get indexBuffer() { return this._indexBuffer; }\n        set indexBuffer(value) {\n            if (this._indexBuffer != value) {\n                this._indexBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        constructor(core, main) {\n            this._core = core;\n            this._main = main;\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n        }\n        _createProgram(vs, fs) {\n            const program = this._gl.createProgram();\n            this._gl.attachShader(program, vs);\n            this._gl.attachShader(program, fs);\n            this._gl.linkProgram(program);\n            if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n                this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n            }\n            return program;\n        }\n        _compileShader(source, type) {\n            const shader = this._gl.createShader(type);\n            this._gl.shaderSource(shader, source);\n            this._gl.compileShader(shader);\n            if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n                this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n            }\n            return shader;\n        }\n        _removeDirective(shaderSource, directive) {\n            const remove = `#define ${directive}`;\n            const index = shaderSource.indexOf(remove);\n            shaderSource = (index == -1) ? shaderSource : shaderSource.substring(0, index) + shaderSource.substring(index + remove.length);\n            return shaderSource;\n        }\n        prepare() {\n            if (this._program != this._main.shaderResources.currentProgram) {\n                if (this._main.shaderResources.currentShader) {\n                    this._main.shaderResources.currentShader.disableProgram();\n                }\n                this.enableProgram(this._program);\n                this.updateBuffers();\n                this.updateTextures();\n            }\n            else {\n                if (this._haveBuffersChanged) {\n                    this.updateBuffers();\n                }\n                if (this._haveTexturesChanged) {\n                    this.updateTextures();\n                }\n            }\n        }\n        apply() { }\n        applyModel() { }\n        applyView() { }\n        enableProgram(program) {\n            this._gl.useProgram(program);\n            this._main.shaderResources.currentProgram = program;\n            this._main.shaderResources.currentShader = this;\n        }\n        updateBuffers() {\n            this._haveBuffersChanged = false;\n        }\n        updateTextures() {\n            this._haveTexturesChanged = false;\n        }\n        disableProgram() {\n            this._main.shaderResources.currentShader = null;\n            this._main.shaderResources.currentProgram = null;\n        }\n        _shaderFromFile(vsName, fsName, callback) {\n            callback(this._includesFromFile(Resources$1.glsl[vsName]), this._includesFromFile(Resources$1.glsl[fsName]));\n        }\n        _shaderFromUrl(vsName, fsName, callback) {\n            this._sourceFromUrl(vsName, (vsSource) => {\n                this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n                    this._sourceFromUrl(fsName, (fsSource) => {\n                        this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n                            callback(vsIncSource, fsIncSource);\n                        });\n                    });\n                });\n            });\n        }\n        _sourceFromUrl(url, callback) {\n            const request = new XMLHttpRequest();\n            request.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n            request.onreadystatechange = () => {\n                if (request.readyState == XMLHttpRequest.DONE && request.status == 200) {\n                    callback(request.responseText);\n                }\n            };\n            request.send();\n        }\n        _includesFromFile(source) {\n            let index = 0;\n            do {\n                index = source.indexOf(\"#include\", index);\n                if (index != -1) {\n                    const start = source.indexOf(\"\\\"\", index);\n                    const end = source.indexOf(\"\\\"\", start + 1);\n                    const name = source.substring(start + 1, end);\n                    const inc = Resources$1.glsl[name];\n                    source = source.substring(0, index) + inc + source.substring(end + 1);\n                }\n            } while (index != -1);\n            return source;\n        }\n        _includesFromUrl(source, index, callback) {\n            index = source.indexOf(\"#include\", index);\n            if (index != -1) {\n                const start = source.indexOf(\"\\\"\", index);\n                const end = source.indexOf(\"\\\"\", start + 1);\n                const name = source.substring(start + 1, end);\n                this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n                    source = source.substring(0, index) + include + source.substring(end + 1);\n                    this._includesFromUrl(source, index, callback);\n                });\n            }\n            else {\n                callback(source);\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Color$1 = class Color extends ShaderBase$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"color.vertex.fx\", \"color.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionColorVertex.SIZE_BYTES, PositionColorVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 3, this._gl.UNSIGNED_BYTE, true, PositionColorVertex.SIZE_BYTES, PositionColorVertex.COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Texture$1 = class Texture extends ShaderBase$1 {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1i(this._samplerUniform, 0);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Lasso$3 = class Lasso extends ShaderBase$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n            this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform3fv(this._colorUniform, this.color);\n            this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Model extends ShaderBase$1 {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"model.vertex.fx\", \"model.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n            this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n            this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n            this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n            this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n        }\n        applyView() {\n            this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n            this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let SdfText$1 = class SdfText extends ShaderBase$1 {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.OES_standard_derivatives == null) {\n                        fsSource = this._removeDirective(fsSource, \"Derivatives\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n            this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n            this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n            this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n            this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform3fv(this._colorUniform, this.color);\n            this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n            this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n            this._gl.uniform1f(this._gammaUniform, this.gamma);\n            this._gl.uniform1f(this._bufferUniform, this.buffer);\n            this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n            this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n        }\n        applyModel() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let PickGrid$1 = class PickGrid extends ShaderBase$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.OES_standard_derivatives == null) {\n                        fsSource = this._removeDirective(fsSource, \"Derivatives\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n            this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n            this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n            this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n            this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n            this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n            this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n            this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n            this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n            this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n            this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n            this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n            this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n            this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n            this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n            this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n            this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n            this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n            this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n            this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n            this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n            this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n            this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n            this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n            this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        ApplyFace() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n            this._gl.uniform2fv(this._zeroUniform, this.zero);\n            this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._boundsAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitShader$1 = class UnitShader extends ShaderBase$1 {\n        get paletteTexture() { return this._paletteTexture; }\n        set paletteTexture(value) {\n            if (this._paletteTexture != value) {\n                this._paletteTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get previousPaletteTexture() { return this._previousPaletteTexture; }\n        set previousPaletteTexture(value) {\n            if (this._previousPaletteTexture != value) {\n                this._previousPaletteTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get sdfTexture() { return this._sdfTexture; }\n        set sdfTexture(value) {\n            if (this._sdfTexture != value) {\n                this._sdfTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get previousSdfTexture() { return this._previousSdfTexture; }\n        set previousSdfTexture(value) {\n            if (this._previousSdfTexture != value) {\n                this._previousSdfTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        set instanceBuffer(value) {\n            if (this._instanceBuffer != value) {\n                this._instanceBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        set previousInstanceBuffer(value) {\n            if (this._previousInstanceBuffer != value) {\n                this._previousInstanceBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        initializeData() {\n            this._areBuffersInitialized = false;\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n            this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n            this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n            this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n            this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n            this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n            this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n            this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n            this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n            this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n            this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n            this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n            this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n            this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n            this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n            this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n            this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n            this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n            this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n            this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n            this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n            this._ambientUniform = gl.getUniformLocation(this._program, \"uAmbient\");\n            this._activeColorUniform = gl.getUniformLocation(this._program, \"uActiveColor\");\n            this._selectedColorUniform = gl.getUniformLocation(this._program, \"uSelectedColor\");\n            this._highlightModeUniform = gl.getUniformLocation(this._program, \"uHighlightMode\");\n            const vertices = Cube.POSITIONS;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Cube.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this.indexCount = indices.length;\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._updateCurrentBuffer();\n            this._updatePreviousBuffer();\n        }\n        _updateCurrentBuffer() {\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n            this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 1);\n            this._gl.enableVertexAttribArray(this._idAttribute);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._translationAttribute);\n            this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 1);\n            this._gl.enableVertexAttribArray(this._scaleAttribute);\n            this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 1);\n            this._gl.enableVertexAttribArray(this._selectedAttribute);\n            this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 1);\n            this._gl.enableVertexAttribArray(this._orderAttribute);\n        }\n        _updatePreviousBuffer() {\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            if (this._previousInstanceBuffer != this._instanceBuffer) {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n            }\n            this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n            this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n            this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1f(this._timeUniform, this.time);\n            this._gl.uniform1f(this._durationUniform, this.duration);\n            this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n            this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n            this._gl.uniform1i(this._previousSampler0Uniform, 0);\n            this._gl.uniform1i(this._sampler0Uniform, 1);\n            this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n            this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n            this._gl.uniform1f(this._ambientUniform, this.ambient);\n            this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n            this._gl.uniform3fv(this._activeColorUniform, this.activeColor);\n            this._gl.uniform3fv(this._selectedColorUniform, this.selectedColor);\n            this._gl.uniform1f(this._hoverUniform, this.hover);\n            this._gl.uniform1f(this._activeUniform, this.active);\n            this._gl.uniform1f(this._highlightModeUniform, this.highlightMode == HighlightMode.luminance ? 0.0 : 1.0);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n            this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n            this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n        }\n        updateTextures() {\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 0);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitBlock$1 = class UnitBlock extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.OES_standard_derivatives == null) {\n                        vsSource = this._removeDirective(vsSource, \"Derivatives\");\n                        fsSource = this._removeDirective(fsSource, \"Derivatives\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitSphere$1 = class UnitSphere extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.EXT_frag_depth == null) {\n                        fsSource = this._removeDirective(fsSource, \"FragDepth\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitCylinder$1 = class UnitCylinder extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.EXT_frag_depth == null) {\n                        fsSource = this._removeDirective(fsSource, \"FragDepth\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitHexPrism extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unithexprism.vertex.fx\", \"unithexprism.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.EXT_frag_depth == null) {\n                        fsSource = this._removeDirective(fsSource, \"FragDepth\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let UnitSdf$1 = class UnitSdf extends UnitShader$1 {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n                    if (this._main.shaderResources.OES_standard_derivatives == null) {\n                        vsSource = this._removeDirective(vsSource, \"Derivatives\");\n                        fsSource = this._removeDirective(fsSource, \"Derivatives\");\n                    }\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n            this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n            this._sdfBufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n            this._sdfBackgroundColorUniform = gl.getUniformLocation(this._program, \"uBackgroundColor\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 1);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        apply() {\n            super.apply();\n            this._gl.uniform1i(this._previousSampler1Uniform, 2);\n            this._gl.uniform1i(this._sampler1Uniform, 3);\n            this._gl.uniform1f(this._sdfBufferUniform, this.sdfBuffer);\n            this._gl.uniform3fv(this._sdfBackgroundColorUniform, this.sdfBackgroundColor);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n            this._gl.activeTexture(this._gl.TEXTURE3);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n        }\n        disableProgram() {\n            super.disableProgram();\n            const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 0);\n            ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 0);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Anaglyph extends ShaderBase$1 {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"anaglyph.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DebugAxesVisual {\n        get isInitialized() { return this._isInitialized && this._main.colorShader.isInitialized; }\n        constructor(core, main, debugAxes) {\n            this._main = main;\n            this._debugAxes = debugAxes;\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._debugAxes.isInitialized) {\n                this._debugAxes.initialize();\n            }\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._debugAxes.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._debugAxes.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) { }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const colorShader = this._main.colorShader;\n                const shaderResources = this._main.shaderResources;\n                colorShader.vertexBuffer = this._vertexBuffer;\n                colorShader.indexBuffer = this._indexBuffer;\n                colorShader.prepare();\n                colorShader.mMatrix = this.mMatrix;\n                colorShader.apply();\n                for (let i = 0; i < this.viewportCount; i++) {\n                    const viewport = i + this.viewportOffset;\n                    shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    colorShader.vMatrix = this.vMatrices[viewport];\n                    colorShader.pMatrix = this.pMatrices[viewport];\n                    colorShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._debugAxes.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let AxesVisualBase$1 = class AxesVisualBase {\n        get isInitialized() { return this._isInitialized; }\n        get axes() { return this._axes; }\n        constructor(core) {\n            this._core = core;\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n        }\n        update(elapsedTime) { }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                this._renderGrid();\n                this._renderText();\n            }\n        }\n        _renderGrid() { }\n        _renderText() { }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Cartesian2dVisual$1 = class Cartesian2dVisual extends AxesVisualBase$1 {\n        get isInitialized() { return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized; }\n        constructor(core, main, cartesian2dAxes) {\n            super(core);\n            this._main = main;\n            this._axes = cartesian2dAxes;\n            this._axes.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            const axes = this._axes;\n            if (!axes.isInitialized) {\n                axes.initialize();\n            }\n            if (axes.gridVertices) {\n                this._createGridBuffers();\n            }\n            if (axes.textVertices) {\n                this._createTextBuffers();\n            }\n            this._isInitialized = true;\n        }\n        _createGridBuffers() {\n            const axes = this._axes;\n            this._gridVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n            this._gridIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n            this._gridBufferSize = axes.gridVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n        }\n        _createTextBuffers() {\n            const axes = this._axes;\n            this._textVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n            this._textIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n            this._textBufferSize = axes.textVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                const axes = this._axes;\n                if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n                    this._createGridBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                    this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n                }\n                if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n                    this._createTextBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                    this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n                }\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        _renderText() {\n            const axes = this._axes;\n            const shader = this._main.sdfTextShader;\n            const shaderResources = this._main.shaderResources;\n            const fontVisual = this._main.fonts[axes.font.name];\n            shader.vertexBuffer = this._textVertexBuffer;\n            shader.indexBuffer = this._textIndexBuffer;\n            shader.texture2D = fontVisual.texture;\n            shader.prepare();\n            shader.buffer = fontVisual.font.edgeValue / 0xff;\n            shader.gamma = axes.gamma;\n            shader.borderWidth = axes.textBorderWidth;\n            shader.color = axes.textColor || this._core.config.axesTextColor;\n            shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n            shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n            shader.pickedIdColor = this.pickedIdColor;\n            shader.apply();\n            let indexCount, indexOffset;\n            for (let axisId = 0; axisId < 2; axisId++) {\n                const orientation = axes.getLabelOrientation(axisId);\n                for (let edge = 0; edge < 2; edge++) {\n                    const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                    if (axes.isEdgeVisible[edgeId]) {\n                        if ((orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId)) || (orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId))) {\n                            indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                            indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                        }\n                        else {\n                            indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                            indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                        }\n                        if (indexCount > 0) {\n                            shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                        indexCount = axes.getTitleIndexCount(axisId);\n                        if (indexCount > 0) {\n                            indexOffset = axes.getTitleIndexOffset(axisId);\n                            shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                    indexCount = axes.getHeadingIndexCount(axisId);\n                    if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                        indexOffset = axes.getHeadingIndexOffset(axisId);\n                        shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        for (let i = 0; i < this.viewportCount; i++) {\n                            const viewport = i + this.viewportOffset;\n                            shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                }\n            }\n        }\n        _renderGrid() {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            gridShader.vertexBuffer = this._gridVertexBuffer;\n            gridShader.indexBuffer = this._gridIndexBuffer;\n            gridShader.prepare();\n            gridShader.majorThickness = axes.gridMajorThickness;\n            gridShader.minorThickness = axes.gridMinorThickness;\n            gridShader.zeroThickness = axes.gridZeroThickness;\n            gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n            gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n            gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n            gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n            gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n            gridShader.pickedIdColor = this.pickedIdColor;\n            gridShader.directionToLight = Constants.VECTOR3_UNITZ;\n            gridShader.apply();\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (axes.arePickDivisionsVisible[axisId]) {\n                    const gridTicksScale = axes.getGridTicksScale(axisId);\n                    const width = gridTicksScale[0];\n                    const height = gridTicksScale[1];\n                    gridShader.zero = axes.getGridTicksZero(axisId);\n                    gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n                    for (let edge = 0; edge < 2; edge++) {\n                        const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                        if (axes.isEdgeVisible[edgeId]) {\n                            this._renderGridTicks(axisId, edgeId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.disable(this._gl.CULL_FACE);\n            const size = axes.size;\n            const axisId2 = 0;\n            const axisId3 = 1;\n            const width = size[axisId2];\n            const height = size[axisId3];\n            gridShader.zero = axes.gridFaceZero;\n            gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n            for (let face = 0; face < 2; face++) {\n                const faceId = face;\n                if (axes.getIsForwardFace(faceId)) {\n                    this._renderGridFace(faceId, width, height);\n                }\n            }\n            this._gl.enable(this._gl.CULL_FACE);\n        }\n        _renderGridTicks(axisId, edgeId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, this._axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, this._axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n        }\n        _renderGridFace(faceId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Cartesian3dVisual$1 = class Cartesian3dVisual extends AxesVisualBase$1 {\n        get isInitialized() { return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized; }\n        constructor(core, main, cartesian3dAxes) {\n            super(core);\n            this._main = main;\n            this._axes = cartesian3dAxes;\n            this._axes.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            const axes = this._axes;\n            if (!axes.isInitialized) {\n                axes.initialize();\n            }\n            if (axes.gridVertices) {\n                this._createGridBuffers();\n            }\n            if (axes.textVertices) {\n                this._createTextBuffers();\n            }\n            this._isInitialized = true;\n        }\n        _createGridBuffers() {\n            const axes = this._axes;\n            this._gridVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n            this._gridIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n            this._gridBufferSize = axes.gridVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n        }\n        _createTextBuffers() {\n            const axes = this._axes;\n            this._textVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n            this._textIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n            this._textBufferSize = axes.textVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                const axes = this._axes;\n                if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n                    this._createGridBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                    this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n                }\n                if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n                    this._createTextBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                    this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n                }\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        _renderText() {\n            const axes = this._axes;\n            const shader = this._main.sdfTextShader;\n            const shaderResources = this._main.shaderResources;\n            const fontVisual = this._main.fonts[axes.font.name];\n            shader.vertexBuffer = this._textVertexBuffer;\n            shader.indexBuffer = this._textIndexBuffer;\n            shader.texture2D = fontVisual.texture;\n            shader.prepare();\n            shader.buffer = fontVisual.font.edgeValue / 0xff;\n            shader.gamma = axes.gamma;\n            shader.borderWidth = axes.textBorderWidth;\n            shader.color = axes.textColor || this._core.config.axesTextColor;\n            shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n            shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n            shader.pickedIdColor = this.pickedIdColor;\n            shader.apply();\n            let indexCount, indexOffset;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                const orientation = axes.getLabelOrientation(axisId);\n                for (let edge = 0; edge < 4; edge++) {\n                    const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                    if (axes.getIsOutsideEdge(edgeId)) {\n                        if (axes.isEdgeVisible[edgeId]) {\n                            if ((orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId)) || (orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId))) {\n                                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                            }\n                            else {\n                                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                            }\n                            if (indexCount > 0) {\n                                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                                shader.applyModel();\n                                shader.isPickShader = false;\n                                for (let i = 0; i < this.viewportCount; i++) {\n                                    const viewport = i + this.viewportOffset;\n                                    shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                    shader.vMatrix = this.vMatrices[viewport];\n                                    shader.pMatrix = this.pMatrices[viewport];\n                                    shader.applyView();\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                    shader.isPickShader = true;\n                                    shader.pMatrix = this.pickPMatrix;\n                                    shader.vMatrix = this.pickVMatrix;\n                                    shader.applyView();\n                                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                            }\n                            indexCount = axes.getTitleIndexCount(axisId);\n                            if (indexCount > 0) {\n                                indexOffset = axes.getTitleIndexOffset(axisId);\n                                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                                shader.applyModel();\n                                shader.isPickShader = false;\n                                for (let i = 0; i < this.viewportCount; i++) {\n                                    const viewport = i + this.viewportOffset;\n                                    shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                    shader.vMatrix = this.vMatrices[viewport];\n                                    shader.pMatrix = this.pMatrices[viewport];\n                                    shader.applyView();\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                    shader.isPickShader = true;\n                                    shader.pMatrix = this.pickPMatrix;\n                                    shader.vMatrix = this.pickVMatrix;\n                                    shader.applyView();\n                                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                            }\n                        }\n                        indexCount = axes.getHeadingIndexCount(axisId);\n                        if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                            indexOffset = axes.getHeadingIndexOffset(axisId);\n                            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        _renderGrid() {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            gridShader.vertexBuffer = this._gridVertexBuffer;\n            gridShader.indexBuffer = this._gridIndexBuffer;\n            gridShader.prepare();\n            gridShader.majorThickness = axes.gridMajorThickness;\n            gridShader.minorThickness = axes.gridMinorThickness;\n            gridShader.zeroThickness = axes.gridZeroThickness;\n            gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n            gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n            gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n            gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n            gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n            gridShader.pickedIdColor = this.pickedIdColor;\n            gridShader.directionToLight = Constants.VECTOR3_UNITZ;\n            gridShader.apply();\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (axes.arePickDivisionsVisible[axisId]) {\n                    const gridTicksScale = axes.getGridTicksScale(axisId);\n                    const width = gridTicksScale[0];\n                    const height = gridTicksScale[1];\n                    gridShader.zero = axes.getGridTicksZero(axisId);\n                    gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n                    for (let edge = 0; edge < 4; edge++) {\n                        const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                        if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n                            this._renderGridTicks(axisId, edgeId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.disable(this._gl.CULL_FACE);\n            const size = axes.size;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (axes.areFacesVisible[axisId]) {\n                    const axisId2 = axisId == 0 ? 1 : 0;\n                    const axisId3 = axisId == 2 ? 1 : 2;\n                    const width = size[axisId2];\n                    const height = size[axisId3];\n                    gridShader.zero = axes.getGridFaceZero(axisId);\n                    gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n                    for (let face = 0; face < 2; face++) {\n                        const faceId = Cube.AXIS_FACES[axisId][face];\n                        if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n                            this._renderGridFace(faceId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.enable(this._gl.CULL_FACE);\n        }\n        _renderGridTicks(axisId, edgeId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n        }\n        _renderGridFace(faceId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ControllerVisual {\n        get isInitialized() { return this._isInitialized && this._modelShader.isInitialized && this._colorShader.isInitialized; }\n        get controller() { return this._controller; }\n        constructor(core, main, controller) {\n            this._core = core;\n            this._main = main;\n            this._mMatrix = create$4();\n            this._vec3 = create$3();\n            this._controller = controller;\n            this._modelShader = main.modelShader;\n            this._colorShader = main.colorShader;\n            this.mMatrix = create$4();\n            this.rayMMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._controller.isInitialized) {\n                this._controller.initialize();\n            }\n            this._initialize(gl);\n        }\n        _initialize(gl) {\n            this._gl = gl;\n            this.modelTexture = TextureHelper.fromImage(gl, this._controller.texture, false, gl.LINEAR);\n            this._modelVertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._modelVertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._controller.vertices, gl.STATIC_DRAW);\n            this._modelIndexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._modelIndexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.indices, gl.STATIC_DRAW);\n            this._rayVertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._rayVertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._controller.rayVertices, gl.STATIC_DRAW);\n            this._rayIndexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._rayIndexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.rayIndices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) { }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                this._modelShader.vertexBuffer = this._modelVertexBuffer;\n                this._modelShader.indexBuffer = this._modelIndexBuffer;\n                this._modelShader.texture2D = this.modelTexture;\n                this._modelShader.prepare();\n                multiply$2(this._mMatrix, this._controller.useRayPose ? this.rayMMatrix : this.mMatrix, this._controller.mMatrix);\n                this._modelShader.mMatrix = this._mMatrix;\n                this._modelShader.specularPower = 10;\n                this._modelShader.specularIntensity = 0.01;\n                this._modelShader.apply();\n                this._modelShader.applyModel();\n                for (let i = 0; i < this.viewportCount; i++) {\n                    const viewport = i + this.viewportOffset;\n                    this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    this._modelShader.directionToLight = Constants.VECTOR3_UNITZ;\n                    this._modelShader.halfAngle = Constants.VECTOR3_UNITZ;\n                    this._modelShader.vMatrix = this.vMatrices[viewport];\n                    this._modelShader.pMatrix = this.pMatrices[viewport];\n                    this._modelShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._controller.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this.isRayVisible) {\n                    this._colorShader.vertexBuffer = this._rayVertexBuffer;\n                    this._colorShader.indexBuffer = this._rayIndexBuffer;\n                    this._colorShader.prepare();\n                    multiply$2(this._mMatrix, this.rayMMatrix, this._controller.rayMMatrix);\n                    this._colorShader.mMatrix = this._mMatrix;\n                    this._colorShader.apply();\n                    this._colorShader.applyModel();\n                    for (let i = 0; i < this.viewportCount; i++) {\n                        const viewport = i + this.viewportOffset;\n                        this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                        this._colorShader.vMatrix = this.vMatrices[viewport];\n                        this._colorShader.pMatrix = this.pMatrices[viewport];\n                        this._colorShader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._controller.rayIndexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let ImageVisual$1 = class ImageVisual {\n        get isInitialized() { return this._isInitialized && this._main.textureShader.isInitialized; }\n        get image() { return this._image; }\n        constructor(core, main, image) {\n            this._core = core;\n            this._main = main;\n            this._image = image;\n            this._image.hasChangedCallback = () => { this._hasChanged = true; };\n            this.mMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._image.isInitialized) {\n                this._image.initialize();\n            }\n            this._gl = gl;\n            if (this._image.imageData) {\n                this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n            }\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const textureShader = this._main.textureShader;\n                const shaderResources = this._main.shaderResources;\n                textureShader.vertexBuffer = this._vertexBuffer;\n                textureShader.indexBuffer = this._indexBuffer;\n                textureShader.texture2D = this.texture;\n                textureShader.prepare();\n                textureShader.mMatrix = this.mMatrix;\n                textureShader.isPickShader = false;\n                textureShader.apply();\n                for (let i = 0; i < this.viewportCount; i++) {\n                    const viewport = i + this.viewportOffset;\n                    shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    textureShader.vMatrix = this.vMatrices[viewport];\n                    textureShader.pMatrix = this.pMatrices[viewport];\n                    textureShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this.isPickingEnabled) {\n                    textureShader.isPickShader = true;\n                    textureShader.vMatrix = this.pickVMatrix;\n                    textureShader.pMatrix = this.pickPMatrix;\n                    textureShader.applyView();\n                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let LabelVisualBase$1 = class LabelVisualBase {\n        get isInitialized() { return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized; }\n        constructor(core, main, label) {\n            this._core = core;\n            this._main = main;\n            this._label = label;\n            this._label.hasChangedCallback = () => { this._hasChanged = true; };\n            this._mMatrix = create$4();\n            this.mMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._label.isInitialized) {\n                this._label.initialize();\n            }\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const indexCount = this._label.indexCount;\n                if (indexCount > 0) {\n                    const shader = this._main.sdfTextShader;\n                    const fontVisual = this._main.fonts[this._label.font.name];\n                    shader.vertexBuffer = this._vertexBuffer;\n                    shader.indexBuffer = this._indexBuffer;\n                    shader.texture2D = fontVisual.texture;\n                    shader.prepare();\n                    shader.gamma = this._label.gamma;\n                    shader.buffer = fontVisual.font.edgeValue / 0xff;\n                    shader.borderWidth = this._label.borderWidth;\n                    shader.color = this._label.color || this._core.config.textColor;\n                    shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n                    shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n                    shader.pickedIdColor = this.pickedIdColor;\n                    shader.apply();\n                    multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n                    shader.mMatrix = this._mMatrix;\n                    shader.applyModel();\n                    shader.isPickShader = false;\n                    for (let i = 0; i < this.viewportCount; i++) {\n                        const viewport = i + this.viewportOffset;\n                        this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                        shader.vMatrix = this.vMatrices[viewport];\n                        shader.pMatrix = this.pMatrices[viewport];\n                        shader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n                    }\n                    if (this.isPickingEnabled) {\n                        shader.isPickShader = true;\n                        shader.pMatrix = this.pickPMatrix;\n                        shader.vMatrix = this.pickVMatrix;\n                        shader.applyView();\n                        this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n                        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n                    }\n                }\n            }\n        }\n    };\n    let LabelVisual$1 = class LabelVisual extends LabelVisualBase$1 {\n        get label() { return this._label; }\n        set text(value) { this._label.text = value; }\n        get text() { return this._label.text; }\n        constructor(core, main, label) {\n            super(core, main, label);\n        }\n    };\n    let LabelSetVisual$1 = class LabelSetVisual extends LabelVisualBase$1 {\n        get label() { return this._label; }\n        constructor(core, main, label) {\n            super(core, main, label);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let FontVisual$1 = class FontVisual {\n        get isInitialized() { return this._isInitialized; }\n        get font() { return this._font; }\n        constructor(core, font) {\n            this._core = core;\n            this._font = font;\n            font.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this._isInitialized = true;\n            if (this._font.count > 0) {\n                this._hasChanged = true;\n            }\n        }\n        update() {\n            if (this._hasChanged && this._isInitialized) {\n                this._hasChanged = false;\n                this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n                this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Lasso$2 = class Lasso {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        get indexBuffer() { return this._indexBuffer; }\n        get indexCount() { return this._indexCount; }\n        initializeContext(gl) {\n            const vertices = Quad$2.textured(Constants.MAT4_IDENTITY);\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Quad$2.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this._indexCount = indices.length;\n            this._isInitialized = true;\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    var __awaiter$1 = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    let Main$1 = class Main extends RendererBase {\n        get shaderResources() { return this._shaderResources; }\n        get colorShader() { return this._colorShader; }\n        get textureShader() { return this._textureShader; }\n        get lassoShader() { return this._lassoShader; }\n        get modelShader() { return this._modelShader; }\n        get sdfTextShader() { return this._sdfTextShader; }\n        get gridShader() { return this._gridShader; }\n        get blockShader() { return this._blockShader; }\n        get sphereShader() { return this._sphereShader; }\n        get cyclinderShader() { return this._cylinderShader; }\n        get hexPrismShader() { return this._hexPrismShader; }\n        get sdfShader() { return this._sdfShader; }\n        get anaglyphShader() { return this._anaglyphShader; }\n        get currentAxes() { return this._isAxes1Current ? this._axes1 : this._axes2; }\n        set currentAxes(value) { if (this._isAxes1Current) {\n            this._axes1 = value;\n        }\n        else {\n            this._axes2 = value;\n        } }\n        get previousAxes() { return this._isAxes1Current ? this._axes2 : this._axes1; }\n        set previousAxes(value) { if (this._isAxes1Current) {\n            this._axes2 = value;\n        }\n        else {\n            this._axes1 = value;\n        } }\n        get config() { return this._config; }\n        constructor(options) {\n            super(options);\n            this._config = new Config$1();\n            this._quad = new Quad$1();\n            this._lasso = new Lasso$2();\n            this._pickedPixels = new Uint8Array(4);\n            this._pickedIdColor = create$2();\n            this._mat3 = create$5();\n            this._directionToCamera = create$3();\n            this._directionToLight = create$3();\n            this._halfAngle = create$3();\n            this._cameraPosition = create$3();\n            this._modelPosition = create$3();\n            this.depthEnabled = true;\n        }\n        get isSupported() {\n            return this._createContext(document.createElement(\"canvas\")) !== null;\n        }\n        get isWebXRSupported() {\n            return true;\n        }\n        initialize(core) {\n            super.initialize(core);\n            this._shaderResources = new Resources$1();\n            this._colorShader = new Color$1(this._core, this);\n            this._textureShader = new Texture$1(this._core, this);\n            this._lassoShader = new Lasso$3(this._core, this);\n            this._modelShader = new Model(this._core, this);\n            this._sdfTextShader = new SdfText$1(this._core, this);\n            this._gridShader = new PickGrid$1(this._core, this);\n            this._anaglyphShader = new Anaglyph(this._core, this);\n            this._blockShader = new UnitBlock$1(this._core, this);\n            this._sphereShader = new UnitSphere$1(this._core, this);\n            this._cylinderShader = new UnitCylinder$1(this._core, this);\n            this._hexPrismShader = new UnitHexPrism(this._core, this);\n            this._sdfShader = new UnitSdf$1(this._core, this);\n            this._initializeContext(this._createContext(this._canvas));\n            this._canvas.addEventListener(\"webglcontextlost\", (event) => {\n                this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n                this._isInitialized = false;\n                event.preventDefault();\n            }, false);\n            this._canvas.addEventListener(\"webglcontextrestored\", () => {\n                this._initializeContext(this._createContext(this._canvas));\n                this._isInitialized = true;\n                this._core.log.write(LogLevel.info, \"WebGL context restored\");\n            }, false);\n            this._isInitialized = true;\n        }\n        _initializeContext(gl) {\n            this._gl = gl;\n            for (const key in this.fonts) {\n                const fontVisual = this.fonts[key];\n                fontVisual.initializeContext(gl);\n            }\n            this._shaderResources.initializeContext(this._gl);\n            this._colorShader.initializeContext(this._gl);\n            this._textureShader.initializeContext(this._gl);\n            this._lassoShader.initializeContext(this._gl);\n            this._modelShader.initializeContext(this._gl);\n            this._sdfTextShader.initializeContext(this._gl);\n            this._gridShader.initializeContext(this._gl);\n            this._anaglyphShader.initializeContext(this._gl);\n            this._blockShader.initializeContext(this._gl);\n            this._sphereShader.initializeContext(this._gl);\n            this._cylinderShader.initializeContext(this._gl);\n            this._hexPrismShader.initializeContext(this._gl);\n            this._sdfShader.initializeContext(this._gl);\n            this._quad.initializeContext(this._gl);\n            this._lasso.initializeContext(this._gl);\n            this._debugAxesVisual.initializeContext(this._gl);\n            this._framebuffers = [null, null];\n            const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n            const renderBuffer = this._gl.createRenderbuffer();\n            this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, this._core.config.pickWidth, this._core.config.pickHeight);\n            const framebuffer = this._gl.createFramebuffer();\n            this._shaderResources.bindFramebuffer(framebuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n            this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n            this._pickFrameBuffer = framebuffer;\n            this._anaglyphTextures = [null, null];\n            this.anaglyphFramebuffers = [null, null];\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                this.transitionBuffers[i].initializeContext(this._gl);\n            }\n            if (this._axes1) {\n                for (let i = 0; i < this._axes1.length; i++) {\n                    this._axes1[i].initializeContext(this._gl);\n                }\n            }\n            if (this._axes2) {\n                for (let i = 0; i < this._axes2.length; i++) {\n                    this._axes2[i].initializeContext(this._gl);\n                }\n            }\n            for (let i = 0; i < this.labelSets.length; i++) {\n                this.labelSets[i].initializeContext(this._gl);\n            }\n            for (let i = 0; i < this.images.length; i++) {\n                this.images[i].initializeContext(this._gl);\n            }\n            for (let i = 0; i < this.controllers.length; i++) {\n                this.controllers[i].initializeContext(this._gl);\n            }\n        }\n        _resize(width, height) {\n            super._resize(width, height);\n            for (let i = 0; i < 2; i++) {\n                const texture = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n                const renderBuffer = this._gl.createRenderbuffer();\n                this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n                this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, width, height);\n                const framebuffer = this._gl.createFramebuffer();\n                this._shaderResources.bindFramebuffer(framebuffer);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n                this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n                this._anaglyphTextures[i] = texture;\n                this.anaglyphFramebuffers[i] = framebuffer;\n            }\n            this._core.log.write(LogLevel.info, `buffers resized ${width},${height}`);\n        }\n        _createContext(canvas) {\n            const antialias = this._options ? this._options.antialias === undefined ? true : this._options.antialias : true;\n            const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === undefined ? false : this._options.preserveDrawingBuffer : false;\n            return canvas.getContext(\"webgl\", {\n                stencil: true,\n                alpha: true,\n                antialias: antialias,\n                preserveDrawingBuffer: preserveDrawingBuffer,\n            });\n        }\n        initializeWebXR(session) {\n            const promise = new Promise((resolve, reject) => {\n                this._gl.makeXRCompatible().then(() => {\n                    session.updateRenderState({\n                        baseLayer: new XRWebGLLayer(session, this._gl),\n                        depthNear: this._core.config.nearPlane,\n                        depthFar: this._core.config.farPlane\n                    });\n                    session.requestReferenceSpace('local').then((refSpace) => {\n                        this._webXRReferenceSpace = refSpace;\n                        resolve();\n                    });\n                });\n            });\n            return promise;\n        }\n        prepare(xrFrame) {\n            if (xrFrame) {\n                const pose = xrFrame.getViewerPose(this._webXRReferenceSpace);\n                if (pose) {\n                    const glLayer = xrFrame.session.renderState.baseLayer;\n                    for (let i = 0; i < pose.views.length; i++) {\n                        const view = pose.views[i];\n                        this.vMatrices[i] = view.transform.inverse.matrix;\n                        this.inverseVMatrices[i] = view.transform.matrix;\n                        multiply$2(this._mvMatrices[i], this.vMatrices[i], this.mMatrix);\n                        this.mvMatrices[i] = this._mvMatrices[i];\n                        this.pMatrices[i] = view.projectionMatrix;\n                        const viewport = glLayer.getViewport(view);\n                        this._viewports[i].x = viewport.x;\n                        this._viewports[i].y = viewport.y;\n                        this._viewports[i].width = viewport.width;\n                        this._viewports[i].height = viewport.height;\n                        this._framebuffers[i] = glLayer.framebuffer;\n                    }\n                }\n                this._viewportOffset = 0;\n                this._viewportCount = 2;\n            }\n            else {\n                let viewport;\n                switch (this._core.config.stereoMode) {\n                    case StereoMode.none:\n                        viewport = this._viewports[0];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 0;\n                        this._viewportCount = 1;\n                        this._framebuffers[0] = null;\n                        break;\n                    case StereoMode.left:\n                        viewport = this._viewports[0];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 0;\n                        this._viewportCount = 1;\n                        this._framebuffers[0] = null;\n                        break;\n                    case StereoMode.right:\n                        viewport = this._viewports[1];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 1;\n                        this._viewportCount = 1;\n                        this._framebuffers[1] = null;\n                        break;\n                    case StereoMode.anaglyph:\n                        viewport = this._viewports[0];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        viewport = this._viewports[1];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 0;\n                        this._viewportCount = 2;\n                        this._framebuffers[0] = this.anaglyphFramebuffers[0];\n                        this._framebuffers[1] = this.anaglyphFramebuffers[1];\n                        break;\n                    case StereoMode.split:\n                        viewport = this._viewports[0];\n                        viewport.x = 0;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width / 2;\n                        viewport.height = this._canvas.height;\n                        viewport = this._viewports[1];\n                        viewport.x = this._canvas.width / 2;\n                        viewport.y = 0;\n                        viewport.width = this._canvas.width / 2;\n                        viewport.height = this._canvas.height;\n                        this._viewportOffset = 0;\n                        this._viewportCount = 2;\n                        this._framebuffers[0] = null;\n                        this._framebuffers[1] = null;\n                        break;\n                }\n            }\n        }\n        createTransitionBuffer(ids) {\n            const buffer = new TransitionBuffer$1(this._core, ids);\n            buffer.initializeContext(this._gl);\n            return buffer;\n        }\n        createControllerVisual(controller) {\n            const visual = new ControllerVisual(this._core, this, controller);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createCartesian2dAxesVisual(axes) {\n            const visual = new Cartesian2dVisual$1(this._core, this, axes);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createCartesian3dAxesVisual(axes) {\n            const visual = new Cartesian3dVisual$1(this._core, this, axes);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        _createDebugAxesVisual(debugAxes) {\n            return new DebugAxesVisual(this._core, this, debugAxes);\n        }\n        _createLabelVisual(label) {\n            return new LabelVisual$1(this._core, this, label);\n        }\n        createLabelSetVisual(labelSet) {\n            const visual = new LabelSetVisual$1(this._core, this, labelSet);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createImageVisual(image) {\n            const visual = new ImageVisual$1(this._core, this, image);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createFontVisual(font) {\n            const visual = new FontVisual$1(this._core, font);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        getDataUrl(mimeType) {\n            return this._canvas.toDataURL(mimeType);\n        }\n        render(elapsedTime, xrFrame) {\n            return __awaiter$1(this, void 0, void 0, function* () {\n                if (this.depthEnabled) {\n                    this._gl.enable(this._gl.DEPTH_TEST);\n                }\n                else {\n                    this._gl.disable(this._gl.DEPTH_TEST);\n                }\n                this._gl.enable(this._gl.CULL_FACE);\n                this._gl.disable(this._gl.BLEND);\n                if (this.isPickingEnabled) {\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.clearColor(0, 0, 0, 0);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n                this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], backgroundColor[3]);\n                if (xrFrame) {\n                    const glLayer = xrFrame.session.renderState.baseLayer;\n                    this._shaderResources.bindFramebuffer(glLayer.framebuffer);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                else if (this._core.config.stereoMode == StereoMode.anaglyph) {\n                    for (let i = 0; i < 2; i++) {\n                        this._shaderResources.bindFramebuffer(this.anaglyphFramebuffers[i]);\n                        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                    }\n                    this._shaderResources.bindFramebuffer(null);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                else {\n                    this._shaderResources.bindFramebuffer(null);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                if (this._core.config.isDebugVisible) {\n                    this._debugAxesVisual.framebuffers = this._framebuffers;\n                    this._debugAxesVisual.render(elapsedTime, xrFrame);\n                }\n                const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n                if (axesVisuals) {\n                    for (let i = 0; i < axesVisuals.length; i++) {\n                        const axesVisual = axesVisuals[i];\n                        if (axesVisual.isVisible) {\n                            axesVisual.pickedIdColor = this._pickedIdColor;\n                            axesVisual.pickFramebuffer = this._pickFrameBuffer;\n                            axesVisual.framebuffers = this._framebuffers;\n                            axesVisual.render(elapsedTime, xrFrame);\n                        }\n                    }\n                }\n                for (let i = 0; i < this.transitionBuffers.length; i++) {\n                    const transitionBuffer = this.transitionBuffers[i];\n                    if (transitionBuffer.isVisible) {\n                        this._renderTransitionBuffer(xrFrame, transitionBuffer);\n                    }\n                }\n                if (this.areLabelsVisible) {\n                    for (let i = 0; i < this.labelSets.length; i++) {\n                        const labelSetVisual = this.labelSets[i];\n                        if (labelSetVisual.isVisible) {\n                            labelSetVisual.pickedIdColor = this._pickedIdColor;\n                            labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n                            labelSetVisual.framebuffers = this._framebuffers;\n                            labelSetVisual.render(elapsedTime, xrFrame);\n                        }\n                    }\n                }\n                if (this.areImagesVisible) {\n                    for (let i = 0; i < this.images.length; i++) {\n                        const imageVisual = this.images[i];\n                        if (imageVisual.isVisible) {\n                            imageVisual.framebuffers = this._framebuffers;\n                            imageVisual.pickFramebuffer = this._pickFrameBuffer;\n                            imageVisual.isPickingEnabled = this.isPickingEnabled;\n                            imageVisual.render(elapsedTime, xrFrame);\n                        }\n                    }\n                }\n                for (let i = 0; i < this.controllers.length; i++) {\n                    const controllerVisual = this.controllers[i];\n                    if (controllerVisual.isVisible) {\n                        controllerVisual.isRayVisible = this.isPickingEnabled;\n                        controllerVisual.framebuffers = this._framebuffers;\n                        controllerVisual.render(elapsedTime, xrFrame);\n                    }\n                }\n                if (this.isPickingEnabled) {\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n                    this._pickedType = PickHelper.decodeType(this._pickedPixels);\n                    set$2(this._pickedIdColor, this._pickedPixels[0] / 0xff, this._pickedPixels[1] / 0xff, this._pickedPixels[2] / 0xff, this._pickedPixels[3] / 0xff);\n                    this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n                    if (this._isCapturingPickImage && this.capturePickImageCallback) {\n                        this._isCapturingPickImage = false;\n                        const data = new Uint8ClampedArray(this._core.config.pickWidth * this._core.config.pickHeight * 4);\n                        this._gl.readPixels(0, 0, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, data);\n                        for (let i = 0; i < data.length / 4; i++) {\n                            if (data[i * 4 + 3] == PickType.data) {\n                                data[i * 4 + 3] = 255;\n                            }\n                            else {\n                                data[i * 4] = 0;\n                                data[i * 4 + 1] = 0;\n                                data[i * 4 + 2] = 0;\n                                data[i * 4 + 3] = 0;\n                            }\n                        }\n                        const length = this._core.config.pickWidth * this._core.config.pickHeight * 4;\n                        const row = this._core.config.pickWidth * 4;\n                        const end = (this._core.config.pickHeight - 1) * row;\n                        const flipped = new Uint8ClampedArray(length);\n                        for (let i = 0; i < length; i += row) {\n                            flipped.set(data.subarray(i, i + row), end - i);\n                        }\n                        this.capturePickImageCallback(flipped, this._core.config.pickWidth, this._core.config.pickHeight);\n                    }\n                }\n                else {\n                    set$2(this._pickedIdColor, 0, 0, 0, 0);\n                    this._pickedId = 0;\n                }\n                if (this.isLassoPicking && this._lassoShader.isInitialized) {\n                    this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n                    this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n                    const lassoWidth = this.lassoX1 - this.lassoX0;\n                    const lassoHeight = this.lassoY1 - this.lassoY0;\n                    this._lassoShader.prepare();\n                    this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n                    this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n                    this._lassoShader.apply();\n                    const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n                    for (let i = 0; i < this._viewportCount; i++) {\n                        const viewportIndex = i + this._viewportOffset;\n                        this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n                        const viewport = this._viewports[viewportIndex];\n                        this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n                        this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n                        this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n                        this._lassoMMatrix[10] = 1;\n                        this._lassoMMatrix[12] = ((this.lassoX0 + lassoWidth / 2) / viewport.width) * 2 - 1;\n                        this._lassoMMatrix[13] = 1 - ((this.lassoY0 + lassoHeight / 2) / viewport.height) * 2;\n                        this._lassoShader.mMatrix = this._lassoMMatrix;\n                        set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n                        this._lassoShader.thickness = this._lassoThickness;\n                        this._lassoShader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n                if (this._core.config.stereoMode == StereoMode.anaglyph && this._anaglyphShader.isInitialized && this._quad.isInitialized) {\n                    this._shaderResources.bindFramebuffer(null);\n                    this._gl.viewport(this._viewports[0].x, this._viewports[0].y, this._viewports[0].width, this._viewports[0].height);\n                    this._anaglyphShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._anaglyphShader.indexBuffer = this._quad.indexBuffer;\n                    this._anaglyphShader.texture2D1 = this._anaglyphTextures[0];\n                    this._anaglyphShader.texture2D2 = this._anaglyphTextures[1];\n                    this._anaglyphShader.prepare();\n                    this._anaglyphShader.viewport = this._viewports[0];\n                    this._anaglyphShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            });\n        }\n        _renderTransitionBuffer(xrFrame, transitionBuffer) {\n            const currentBuffer = transitionBuffer.currentBuffer;\n            const previousBuffer = transitionBuffer.previousBuffer;\n            const currentPalette = transitionBuffer.currentPalette;\n            const previousPalette = transitionBuffer.previousPalette;\n            const currentAtlas = transitionBuffer.currentAtlas;\n            const previousAtlas = transitionBuffer.previousAtlas;\n            const unitType = transitionBuffer.unitType === undefined ? currentBuffer.unitType : transitionBuffer.unitType;\n            const id = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n            const hoverId = id > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id) : -1;\n            const activeId = transitionBuffer.activeId;\n            if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf || unitType == UnitType.ringSdf)) {\n                this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._blockShader.prepare();\n                this._blockShader.mMatrix = this.mMatrix;\n                this._blockShader.time = this.transitionTime;\n                this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._blockShader.rangeMin = 0;\n                this._blockShader.rangeMax = transitionBuffer.length - 1;\n                this._blockShader.hover = hoverId;\n                this._blockShader.active = activeId;\n                this._blockShader.selectedColor = this._core.config.selectionColor;\n                this._blockShader.hoverColor = this._core.config.hoverColor;\n                this._blockShader.activeColor = this._core.config.activeColor;\n                this._blockShader.highlightMode = this._core.config.highlightMode;\n                this._blockShader.specularPower = this._config.specularPower;\n                this._blockShader.specularIntensity = this._config.specularIntensity;\n                this._blockShader.ambient = this._config.ambient;\n                this._blockShader.apply();\n                this._blockShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$2(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$2(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$2(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._blockShader.directionToLight = this._directionToLight;\n                        this._blockShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._blockShader.directionToLight = this._config.directionToLight;\n                        this._blockShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._blockShader.vMatrix = vMatrix;\n                    this._blockShader.pMatrix = this.pMatrices[viewport];\n                    this._blockShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._blockShader.isPickShader = true;\n                    this._blockShader.pMatrix = this.pickPMatrix;\n                    this._blockShader.vMatrix = this.pickVMatrix;\n                    this._blockShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf || unitType == UnitType.disk)) {\n                this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._sphereShader.prepare();\n                this._sphereShader.mMatrix = this.mMatrix;\n                this._sphereShader.time = this.transitionTime;\n                this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._sphereShader.rangeMin = 0;\n                this._sphereShader.rangeMax = transitionBuffer.length - 1;\n                this._sphereShader.hover = hoverId;\n                this._sphereShader.active = activeId;\n                this._sphereShader.selectedColor = this._core.config.selectionColor;\n                this._sphereShader.hoverColor = this._core.config.hoverColor;\n                this._sphereShader.activeColor = this._core.config.activeColor;\n                this._sphereShader.highlightMode = this._core.config.highlightMode;\n                this._sphereShader.specularPower = this._config.specularPower;\n                this._sphereShader.specularIntensity = this._config.specularIntensity;\n                this._sphereShader.ambient = this._config.ambient;\n                this._sphereShader.apply();\n                this._sphereShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$2(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$2(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$2(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._sphereShader.directionToLight = this._directionToLight;\n                        this._sphereShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._sphereShader.directionToLight = this._config.directionToLight;\n                        this._sphereShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._sphereShader.vMatrix = vMatrix;\n                    this._sphereShader.pMatrix = this.pMatrices[viewport];\n                    this._sphereShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._sphereShader.isPickShader = true;\n                    this._sphereShader.pMatrix = this.pickPMatrix;\n                    this._sphereShader.vMatrix = this.pickVMatrix;\n                    this._sphereShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n                this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._cylinderShader.prepare();\n                this._cylinderShader.mMatrix = this.mMatrix;\n                this._cylinderShader.time = this.transitionTime;\n                this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._cylinderShader.rangeMin = 0;\n                this._cylinderShader.rangeMax = transitionBuffer.length - 1;\n                this._cylinderShader.hover = hoverId;\n                this._cylinderShader.active = activeId;\n                this._cylinderShader.selectedColor = this._core.config.selectionColor;\n                this._cylinderShader.hoverColor = this._core.config.hoverColor;\n                this._cylinderShader.activeColor = this._core.config.activeColor;\n                this._cylinderShader.highlightMode = this._core.config.highlightMode;\n                this._cylinderShader.specularPower = this._config.specularPower;\n                this._cylinderShader.specularIntensity = this._config.specularIntensity;\n                this._cylinderShader.ambient = this._config.ambient;\n                this._cylinderShader.apply();\n                this._cylinderShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$2(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$2(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$2(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._cylinderShader.directionToLight = this._directionToLight;\n                        this._cylinderShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._cylinderShader.directionToLight = this._config.directionToLight;\n                        this._cylinderShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._cylinderShader.vMatrix = vMatrix;\n                    this._cylinderShader.pMatrix = this.pMatrices[viewport];\n                    this._cylinderShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._cylinderShader.isPickShader = true;\n                    this._cylinderShader.pMatrix = this.pickPMatrix;\n                    this._cylinderShader.vMatrix = this.pickVMatrix;\n                    this._cylinderShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._hexPrismShader.isInitialized && (unitType == UnitType.hexPrism || unitType == UnitType.hexPrismSdf)) {\n                this._hexPrismShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._hexPrismShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._hexPrismShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._hexPrismShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._hexPrismShader.prepare();\n                this._hexPrismShader.mMatrix = this.mMatrix;\n                this._hexPrismShader.time = this.transitionTime;\n                this._hexPrismShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._hexPrismShader.rangeMin = 0;\n                this._hexPrismShader.rangeMax = transitionBuffer.length - 1;\n                this._hexPrismShader.hover = hoverId;\n                this._hexPrismShader.active = activeId;\n                this._hexPrismShader.selectedColor = this._core.config.selectionColor;\n                this._hexPrismShader.hoverColor = this._core.config.hoverColor;\n                this._hexPrismShader.activeColor = this._core.config.activeColor;\n                this._hexPrismShader.highlightMode = this._core.config.highlightMode;\n                this._hexPrismShader.specularPower = this._config.specularPower;\n                this._hexPrismShader.specularIntensity = this._config.specularIntensity;\n                this._hexPrismShader.ambient = this._config.ambient;\n                this._hexPrismShader.apply();\n                this._hexPrismShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$2(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$2(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$2(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._hexPrismShader.directionToLight = this._directionToLight;\n                        this._hexPrismShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._hexPrismShader.directionToLight = this._config.directionToLight;\n                        this._hexPrismShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._hexPrismShader.vMatrix = vMatrix;\n                    this._hexPrismShader.pMatrix = this.pMatrices[viewport];\n                    this._hexPrismShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._hexPrismShader.isPickShader = true;\n                    this._hexPrismShader.pMatrix = this.pickPMatrix;\n                    this._hexPrismShader.vMatrix = this.pickVMatrix;\n                    this._hexPrismShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n                this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n                this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n                this._sdfShader.prepare();\n                this._sdfShader.mMatrix = this.mMatrix;\n                this._sdfShader.time = this.transitionTime;\n                this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._sdfShader.rangeMin = 0;\n                this._sdfShader.rangeMax = transitionBuffer.length - 1;\n                this._sdfShader.hover = hoverId;\n                this._sdfShader.active = activeId;\n                this._sdfShader.selectedColor = this._core.config.selectionColor;\n                this._sdfShader.hoverColor = this._core.config.hoverColor;\n                this._sdfShader.activeColor = this._core.config.activeColor;\n                this._sdfShader.highlightMode = this._core.config.highlightMode;\n                this._sdfShader.sdfBuffer = (this.sdfBuffer || this._core.config.sdfBuffer) / 0xff;\n                this._sdfShader.sdfBackgroundColor = this.sdfBackgroundColor || fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n                this._sdfShader.specularPower = this._config.specularPower;\n                this._sdfShader.specularIntensity = this._config.specularIntensity;\n                this._sdfShader.ambient = this._config.ambient;\n                this._sdfShader.apply();\n                this._sdfShader.isPickShader = false;\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    const vMatrix = this.vMatrices[viewport];\n                    if (xrFrame) {\n                        set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                        subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n                        normalize$2(this._directionToLight, this._directionToLight);\n                        const inverseVMatrix = this.inverseVMatrices[viewport];\n                        set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n                        subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n                        normalize$2(this._directionToCamera, this._directionToCamera);\n                        add(this._halfAngle, this._directionToLight, this._directionToCamera);\n                        normalize$2(this._halfAngle, this._halfAngle);\n                        fromMat4(this._mat3, vMatrix);\n                        transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n                        transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n                        this._sdfShader.directionToLight = this._directionToLight;\n                        this._sdfShader.halfAngle = this._halfAngle;\n                    }\n                    else {\n                        this._sdfShader.directionToLight = this._config.directionToLight;\n                        this._sdfShader.halfAngle = this._config.halfAngle;\n                    }\n                    this._sdfShader.vMatrix = vMatrix;\n                    this._sdfShader.pMatrix = this.pMatrices[viewport];\n                    this._sdfShader.applyView();\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n                    this._sdfShader.isPickShader = true;\n                    this._sdfShader.pMatrix = this.pickPMatrix;\n                    this._sdfShader.vMatrix = this.pickVMatrix;\n                    this._sdfShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Quad {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        get indexBuffer() { return this._indexBuffer; }\n        get indexCount() { return this._indexCount; }\n        initializeContext(gl) {\n            const _vec3 = fromValues$3(2, 2, 2);\n            const _mat4 = create$4();\n            fromScaling(_mat4, _vec3);\n            const vertices = Quad$2.positions(_mat4);\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Quad$2.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this._indexCount = indices.length;\n            this._isInitialized = true;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Atlas extends AtlasBase {\n        get texture() { return this._texture; }\n        get defaultTexture() { return this._defaultTexture; }\n        initializeContext(core, gl) {\n            this._gl = gl;\n            this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([0xff, 0xff, 0xff, 0xff]));\n            this._updateTexture();\n        }\n        update() {\n            super.update();\n            if (this._changed) {\n                this._changed = false;\n                this._updateTexture();\n            }\n        }\n        _updateTexture() {\n            if (this._imageData) {\n                this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n            }\n            else {\n                this._texture = null;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Palette extends PaletteBase {\n        get texture() { return this._texture; }\n        get defaultTexture() { return this._defaultTexture; }\n        initializeContext(core, gl) {\n            this._gl = gl;\n            this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n            this._updateTexture();\n        }\n        update() {\n            super.update();\n            if (this._changed) {\n                this._changed = false;\n                this._updateTexture();\n            }\n        }\n        _updateTexture() {\n            if (this._colors) {\n                const colors = new Uint8Array(this._colors);\n                for (let i = 0; i < colors.length; i++) {\n                    colors[i] = Math.pow(colors[i] / 0xff, 2.2) * 0xff;\n                }\n                this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors);\n            }\n            else {\n                this._texture = null;\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Buffer extends BufferBase {\n        get vertexBuffer() { return this._vertexBuffer; }\n        constructor(core, ids) {\n            super(core, ids);\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update() {\n            if (this._isInitialized) {\n                const start = window.performance.now();\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n                this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n            }\n        }\n    }\n    class TransitionBuffer extends TransitionBufferBase {\n        constructor(core, ids) {\n            super(core, ids, Buffer, Palette, Atlas);\n        }\n        initializeContext(gl) {\n            this._buffer1.initializeContext(gl);\n            this._buffer2.initializeContext(gl);\n            this._palette1.initializeContext(this._core, gl);\n            this._palette2.initializeContext(this._core, gl);\n            this._atlas1.initializeContext(this._core, gl);\n            this._atlas2.initializeContext(this._core, gl);\n            this._isInitialized = true;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Config extends RendererConfig {\n        get keyLightAltitude() { return this._keyLightAltitude; }\n        set keyLightAltitude(value) {\n            this._keyLightAltitude = value;\n            this._updateLights();\n        }\n        get keyLightAzimuth() { return this._keyLightAzimuth; }\n        set keyLightAzimuth(value) {\n            this._keyLightAzimuth = value;\n            this._updateLights();\n        }\n        get keyLightDistance() { return this._keyLightDistance; }\n        set keyLightDistance(value) {\n            this._keyLightDistance = value;\n            this._updateLights();\n        }\n        get fillLight1Altitude() { return this._fillLight1Altitude; }\n        set fillLight1Altitude(value) {\n            this._fillLight1Altitude = value;\n            this._updateLights();\n        }\n        get fillLight1Azimuth() { return this._fillLight1Azimuth; }\n        set fillLight1Azimuth(value) {\n            this._fillLight1Azimuth = value;\n            this._updateLights();\n        }\n        get fillLight2Altitude() { return this._fillLight2Altitude; }\n        set fillLight2Altitude(value) {\n            this._fillLight2Altitude = value;\n            this._updateLights();\n        }\n        get fillLight2Azimuth() { return this._fillLight2Azimuth; }\n        set fillLight2Azimuth(value) {\n            this._fillLight2Azimuth = value;\n            this._updateLights();\n        }\n        constructor() {\n            super();\n            this._rotation = create$1();\n            this.keyLightPosition = create$3();\n            this.fillLight1Position = create$3();\n            this.fillLight2Position = create$3();\n            this.reset();\n        }\n        _updateLights() {\n            this._updateLight(this._keyLightAltitude, this._keyLightAzimuth, this._keyLightDistance, this.keyLightPosition);\n            this._updateLight(this._fillLight1Altitude, this._fillLight1Azimuth, 1, this.fillLight1Position);\n            this._updateLight(this._fillLight2Altitude, this._fillLight2Azimuth, 1, this.fillLight2Position);\n        }\n        _updateLight(altitude, azimuth, distance, position) {\n            rotateY(this._rotation, Constants.QUAT_IDENTITY, AngleHelper.degreesToRadians(azimuth));\n            rotateX(this._rotation, this._rotation, AngleHelper.degreesToRadians(-altitude));\n            transformQuat(position, Constants.VECTOR3_UNITZ, this._rotation);\n            scale(position, position, distance);\n        }\n        reset() {\n            this.isSsaoEnabled = true;\n            this.ssaoWidth = 1024;\n            this.ssaoHeight = 1024;\n            this.ssaoBlurEnabled = true;\n            this.ssaoKernelSize = 8;\n            this.ssaoNoiseSize = 4;\n            this.ssaoRadius = 0.02;\n            this.ssaoPower = 1;\n            this.isShadowEnabled = true;\n            this.shadowWidth = 1024;\n            this.shadowHeight = 1024;\n            this.isDofEnabled = false;\n            this.dofAutoFocus = true;\n            this.dofFocusDistance = 0.5;\n            this.dofFocusRange = 0.5;\n            this.dofMaxBackgroundBlur = 0.75;\n            this.isBloomEnabled = false;\n            this.bloomIntensity = 2;\n            this.specularIntensity = 0.15;\n            this.specularPower = 150;\n            this.ambientIntensity = 0.1;\n            this.materialIntensity = 0.5;\n            this.keyLightIntensity = 1.5;\n            this.fillLight1Intensity = 0.25;\n            this.fillLight2Intensity = 0.25;\n            this._keyLightAltitude = 30;\n            this._keyLightAzimuth = -45;\n            this._keyLightDistance = 1;\n            this._fillLight1Altitude = 30;\n            this._fillLight1Azimuth = 45;\n            this._fillLight2Altitude = 30;\n            this._fillLight2Azimuth = -135;\n            this._updateLights();\n            this.isFxaaEnabled = false;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Resources {\n        bindFramebuffer(framebuffer) {\n            if (this.framebuffer != framebuffer) {\n                this.framebuffer = framebuffer;\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n            }\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this.framebuffer = this._gl.createFramebuffer();\n            this.OES_texture_float = gl.getExtension(\"OES_texture_float\");\n            this.OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n            this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n        }\n    }\n    Resources.glsl = {\n        \"background.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\ngl_FragDepth = 0.99999;\\nmyPosition = vec4(0.0, 0.0, -FAR_PLANE, 0.0);\\nmyColor = vec4(uColor, 1.0);\\nmyNormal = vec4(0.0, 0.0, 1.0, 0.0);\\n}\\n\",\n        \"box.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nfloat result = 0.0;\\nfor (int x = -2; x < 2; x++)\\n{\\nfor (int y = -2; y < 2; y++)\\n{\\nvec2 offset = vec2(float(x) + 0.5, float(y) + 0.5) * texelSize;\\nresult += texture(uSampler, texCoords + offset).r;\\n}\\n}\\nresult /= 16.0;\\nmyOutputColor = vec4(vec3(result), 1.0);\\n}\\n\",\n        \"bright.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec4 color = texture(uSampler, texCoords);\\nmyOutputColor = vec4(color.rgb * color.a, 1.0);\\n}\\n\",\n        \"combine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform float uIntensity;\\nout vec4 myOutputColor;\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 bloom =\\ntexture(uSampler2, texCoords).rgb +\\ntexture(uSampler3, texCoords).rgb +\\ntexture(uSampler4, texCoords).rgb +\\ntexture(uSampler5, texCoords).rgb;\\nbloom *= uIntensity;\\nvec3 color = texture(uSampler1, texCoords).rgb;\\ncolor += bloom;\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n        \"deferred.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform mat4 uInverseVMatrix;\\nuniform mat4 uShadowVMatrix;\\nuniform mat4 uShadowPMatrix;\\nuniform bool uShadow;\\nuniform bool uSsao;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform vec3 uKeyLightHalfAngle;\\nuniform vec3 uDirectionToKeyLight;\\nuniform vec3 uDirectionToFillLight1;\\nuniform vec3 uDirectionToFillLight2;\\nuniform vec2 uShadowMapSize;\\nuniform float uKeyLightIntensity;\\nuniform float uFillLight1Intensity;\\nuniform float uFillLight2Intensity;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbientIntensity;\\nuniform float uMaterialIntensity;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec4 position = texture(uSampler1, texCoords);\\nvec4 color = texture(uSampler2, texCoords);\\nvec4 normal = texture(uSampler3, texCoords);\\nfloat shadow;\\nif (uShadow)\\n{\\nvec4 positionWorld = uInverseVMatrix * vec4(position.xyz, 1.0);\\nvec4 positionShadowView = uShadowVMatrix * positionWorld;\\nvec4 positionShadowViewProjection = uShadowPMatrix * positionShadowView;\\nvec3 projCoords = positionShadowViewProjection.xyz / positionShadowViewProjection.w;\\nprojCoords = projCoords * 0.5 + 0.5;\\nfloat minProjCoords = min(projCoords.x, projCoords.y);\\nfloat maxProjCoords = max(projCoords.x, projCoords.y);\\nif (minProjCoords < 0.0 || maxProjCoords > 1.0)\\n{\\nshadow = 1.0;\\n}\\nelse\\n{\\nfloat currentDepth = projCoords.z;\\nfloat bias = 0.0;\\nvec2 texelSize = 1.0 / uShadowMapSize;\\nfor(int x = -1; x <= 1; ++x)\\n{\\nfor(int y = -1; y <= 1; ++y)\\n{\\nfloat pcfDepth = texture(uSampler5, projCoords.xy + vec2(x, y) * texelSize).r;\\nshadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;\\n}\\n}\\nshadow /= 9.0;\\nshadow = clamp(1.0 - shadow, 0.0, 1.0);\\n}\\n}\\nelse\\n{\\nshadow = 1.0;\\n}\\nfloat ssao = uSsao ? texture(uSampler4, texCoords).r : 1.0;\\nfloat diffuseIntensity = clamp(dot(normal.rgb, uDirectionToKeyLight), 0.0, 1.0) * uKeyLightIntensity * shadow;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight1), 0.0, 1.0) * uFillLight1Intensity * ssao;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight2), 0.0, 1.0) * uFillLight2Intensity * ssao;\\nvec3 diffuse = color.rgb * diffuseIntensity * uMaterialIntensity;\\nvec3 ambient = uAmbientIntensity * color.rgb * ssao;\\nvec3 emissive = color.w * color.rgb;\\nfloat specular = normal.w * clamp(pow(clamp(dot(normal.rgb, uKeyLightHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity * uKeyLightIntensity * shadow, 0.0, 1.0);\\nvec3 result = min(ambient + diffuse + specular + emissive, 1.0);\\nresult = pow(result, GAMMA);\\nmyOutputColor = vec4(result, position.w);\\n}\\n\",\n        \"dofblur.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uNearFocusDepth;\\nuniform float uFarFocusDepth;\\nuniform float uMaxBackgroundBlur;\\nout vec4 myOutputColor;\\nfloat circleOfConfusion(in float depth )\\n{\\nfloat f;\\nif (depth < uFocusDepth)\\n{\\nf = (depth - uFocusDepth) / (uFocusDepth - uNearFocusDepth);\\nf = clamp(f, -1.0, 0.0);\\n}\\nelse\\n{\\nf = (depth - uFocusDepth) / (uFarFocusDepth - uFocusDepth);\\nf = clamp(f, 0.0, uMaxBackgroundBlur);\\n}\\nreturn f * 0.5 + 0.5;\\n}\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nvec4 color = texture(uSampler1, texCoords);\\nfloat depth = -texture(uSampler2, texCoords).z;\\nfloat coc = circleOfConfusion(depth);\\nmyOutputColor = vec4(coc);\\n}\\n\",\n        \"dofcombine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uAperture;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nout vec4 myOutputColor;\\nconst float MAX_CIRCLE_OF_CONFUSION = 3.0;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec2 texelSizeLow = texelSize * 4.0;\\nconst int NUM_TAPS = 13;\\nvec2 samples[NUM_TAPS];\\nsamples[0] = vec2(-0.326212,-0.405810);\\nsamples[1] = vec2(-0.840144,-0.073580);\\nsamples[2] = vec2(-0.695914, 0.457137);\\nsamples[3] = vec2(-0.203345, 0.620716);\\nsamples[4] = vec2( 0.962340,-0.194983);\\nsamples[5] = vec2( 0.473434,-0.480026);\\nsamples[6] = vec2( 0.519456, 0.767022);\\nsamples[7] = vec2( 0.185461,-0.893124);\\nsamples[8] = vec2( 0.507431, 0.064425);\\nsamples[9] = vec2( 0.896420, 0.412458);\\nsamples[10] = vec2(-0.321940,-0.932615);\\nsamples[11] = vec2(-0.791559,-0.597710);\\nsamples[12] = vec2( 0.000000, 0.000000);\\nconst float maxCoC = 5.0;\\nconst float radiusScale = 0.5;\\nvec4 cOut = texture(uSampler1, texCoords);\\nfloat coc = texture(uSampler2, texCoords).r;\\nfloat centerDepth = coc;\\nfloat discRadius = abs(coc * 2.0 - 1.0) * maxCoC;\\nfloat discRadiusLow = discRadius * radiusScale;\\ncOut = vec4(0.0);\\nfloat acc = 0.0;\\nfor (int t = 0; t < NUM_TAPS; t++)\\n{\\nvec2 coordLow = texCoords + (texelSizeLow * samples[t] * discRadiusLow);\\nvec2 coordHigh = texCoords + (texelSize * samples[t] * discRadius);\\nvec4 tapLow = texture(uSampler1, coordLow);\\nvec4 tapHigh = texture(uSampler1, coordHigh);\\nfloat cocLow = texture(uSampler2, coordLow).r;\\nfloat cocHigh = texture(uSampler2, coordHigh).r;\\nfloat tapBlur = abs(cocHigh * 2.0 - 1.0);\\nvec4 tap = mix(tapHigh, tapLow, tapBlur);\\nfloat cocBlur = mix(cocHigh, cocLow, tapBlur);\\ncocBlur = (cocBlur >= centerDepth) ? 1.0 : abs(cocBlur * 2.0 - 1.0);\\ncOut += tap * cocBlur;\\nacc += cocBlur;\\n}\\nvec4 result = cOut / acc;\\nmyOutputColor = result;\\n}\\n\",\n        \"downsample.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nmyOutputColor = texture(uSampler, texCoords);\\n}\\n\",\n        \"fxaa.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nconst float FXAA_SPAN_MAX = 8.0;\\nconst float FXAA_REDUCE_MUL = 1.0 / 8.0;\\nconst float FXAA_REDUCE_MIN = 1.0 / 128.0;\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec3 color = texture(uSampler, texCoords).rgb;\\nvec3 colorNW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorNE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorSW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y + texelSize.y)).rgb;\\nvec3 colorSE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y + texelSize.y)).rgb;\\nfloat luminance = dot(color, LUMINANCE);\\nfloat luminanceNW = dot(colorNW, LUMINANCE);\\nfloat luminanceNE = dot(colorNE, LUMINANCE);\\nfloat luminanceSW = dot(colorSW, LUMINANCE);\\nfloat luminanceSE = dot(colorSE, LUMINANCE);\\nfloat luminanceMin = min(luminance, min(min(luminanceNW, luminanceNE), min(luminanceSW, luminanceSE)));\\nfloat luminanceMax = max(luminance, max(max(luminanceNW, luminanceNE), max(luminanceSW, luminanceSE)));\\nvec2 dir = vec2(luminanceSW + luminanceSE - luminanceNW - luminanceNE, luminanceNW + luminanceSW - luminanceNE - luminanceSE);\\nfloat dirReduce = max((luminanceNW + luminanceNE + luminanceSW + luminanceSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\\nfloat rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\\ndir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texelSize;\\nvec3 colorA = 0.5 * (\\ntexture(uSampler, texCoords.xy + dir * (1.0/3.0 - 0.5)).rgb +\\ntexture(uSampler, texCoords.xy + dir * (2.0/3.0 - 0.5)).rgb);\\nvec3 colorB = colorA * 0.5 + 0.25 * (\\ntexture(uSampler, texCoords.xy - dir * 0.5).rgb +\\ntexture(uSampler, texCoords.xy + dir * 0.5).rgb);\\nluminance = dot(colorB, LUMINANCE);\\nif (luminance < luminanceMin || luminance > luminanceMax)\\n{\\nmyOutputColor = vec4(colorA, 1.0);\\n}\\nelse\\n{\\nmyOutputColor = vec4(colorB, 1.0);\\n}\\n}\\n\",\n        \"gaussian.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nuniform bool uHorizontal;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec2 texelSize = vec2(1.0) / uResolution;\\nconst int NUM_WEIGHTS = 3;\\nfloat weights[NUM_WEIGHTS];\\nweights[0] = 0.2270270270;\\nweights[1] = 0.3162162162;\\nweights[2] = 0.0702702703;\\nfloat offsets[NUM_WEIGHTS];\\noffsets[0] = 0.0;\\noffsets[1] = 1.3846153846;\\noffsets[2] = 3.2307692308;\\nvec3 color = texture(uSampler, texCoords).rgb * weights[0];\\nif (uHorizontal)\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\n}\\n}\\nelse\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\n}\\n}\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n        \"lasso.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nin mediump vec2 vTexCoord;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\nmyOutputColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n\",\n        \"lasso.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nout mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n        \"pickgrid.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nin lowp vec4 vColor;\\nin mediump vec2 vTexCoord;\\nin mediump vec4 vBounds;\\nin mediump vec3 vNormal;\\nin vec3 vViewPosition;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void) {\\nif (uPick)\\n{\\nmyPosition = vColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec2 buffer = fwidth(vTexCoord);\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\nmyColor.xyz = color.xyz;\\n}\\n}\\n\",\n        \"pickgrid.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin lowp vec4 aIdColor;\\nin mediump vec2 aTexCoord;\\nin mediump vec3 aNormal;\\nin mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nout lowp vec4 vColor;\\nout mediump vec2 vTexCoord;\\nout mediump vec4 vBounds;\\nout mediump vec3 vNormal;\\nout vec3 vViewPosition;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n        \"sdftext.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nin lowp vec4 vIdColor;\\nin lowp float vHover;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick) {\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nfloat distance = texture(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth)\\n{\\ndiscard;\\n}\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, mix(uColor, uHoverColor, vHover), value);\\nmyPosition.xyz = vViewPosition;\\nmyNormal.xyz = vNormal;\\nmyColor.w = 1.0;\\nmyPosition.w = 0.0;\\nmyNormal.w = 0.0;\\n}\\n}\\n\",\n        \"sdftext.vertex.fx\": \"#version 300 es\\nin lowp vec4 aIdColor;\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nout vec3 vViewPosition;\\nout vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nout lowp vec4 vIdColor;\\nout lowp float vHover;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(0.0, 0.0, 1.0, 0.0));\\nvec4 viewPosition = mvMatrix* vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n        \"simple.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n        \"ssao.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nconst int SSAO_KERNEL_SIZE = 8;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform mat4 uPMatrix;\\nuniform vec4 uViewport;\\nuniform float uSsaoNoiseSize;\\nuniform float uSsaoRadius;\\nuniform float uSsaoPower;\\nuniform vec3 uSsaoKernel[SSAO_KERNEL_SIZE];\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 position = texture(uSampler1, texCoords).rgb;\\nvec3 normal = texture(uSampler2, texCoords).rgb;\\nfloat occlusion = 0.0;\\nvec2 noiseScale = uViewport.zw / uSsaoNoiseSize;\\nvec3 randomVec = texture(uSampler3, texCoords * noiseScale).rgb;\\nvec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));\\nvec3 bitangent = cross(normal, tangent);\\nmat3 tbn = mat3(tangent, bitangent, normal);\\nfor(int i = 0; i < SSAO_KERNEL_SIZE; i++)\\n{\\nvec3 mySample = tbn * uSsaoKernel[i];\\nmySample = position + mySample * uSsaoRadius;\\nvec4 offset = vec4(mySample, 1.0);\\noffset = uPMatrix * offset;\\noffset.xy /= offset.w;\\noffset.xy = offset.xy * 0.5 + 0.5;\\nfloat sampleDepth = texture(uSampler1, offset.xy).z;\\nfloat rangeCheck = abs(position.z - sampleDepth) > uSsaoRadius ? 0.0 : 1.0;\\nocclusion += (sampleDepth < mySample.z ? 0.0 : 1.0) * rangeCheck;\\n}\\nocclusion /= float(SSAO_KERNEL_SIZE);\\nocclusion = pow(1.0 - occlusion, uSsaoPower);\\nmyOutputColor = vec4(occlusion, 0.0, 0.0, 1.0);\\n}\\n\",\n        \"texture.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\nuniform sampler2D uSampler;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nmyPosition.xyz = vViewPosition;\\nmyColor.xyz = pow(texture(uSampler, vTexCoord).xyz, INV_GAMMA);\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\n}\\n\",\n        \"texture.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec3 aNormal;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nout vec3 vViewPosition;\\nout mediump vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\n}\\n\",\n        \"unitblock.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n        \"unitblock.vertex.fx\": \"#version 300 es\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n        \"unitcylinder.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec4 vCircle1;\\nin vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w, uShadow ? -1.0 : 1.0);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n        \"unitcylinder.vertex.fx\": \"#version 300 es\\n#include \\\"common.include.fx\\\"\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout vec3 vViewPosition;\\nout vec4 vCircle1;\\nout vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n\",\n        \"unitsdf.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec2 vTexCoord;\\nin mediump vec2 vPreviousTexCoord;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nfloat uBorderWidth = 0.0 / 255.0;\\nfloat uBuffer = 192.0 / 255.0;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat distance = mix(texture(uPreviousSampler1, vPreviousTexCoord).r, texture(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat uGamma = 0.0;\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, color, value);\\n}\\n}\\n\",\n        \"unitsdf.vertex.fx\": \"#version 300 es\\n#include \\\"quat.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin mediump vec4 aTexCoord;\\nin mediump vec4 aPreviousTexCoord;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout mediump vec2 vTexCoord;\\nout mediump vec2 vPreviousTexCoord;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n\",\n        \"unitsphere.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \\\"common.include.fx\\\"\\n#include \\\"intersect.include.fx\\\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec3 vViewCenter;\\nin mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s, uShadow ? -1.0 : 1.0);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n\",\n        \"unitsphere.vertex.fx\": \"#version 300 es\\n#include \\\"common.include.fx\\\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin lowp float aColor;\\nin lowp float aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump float vRadius;\\nout vec3 vViewPosition;\\nout vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\ntranslation.xyz += aPosition * scale;\\nvec4 viewPosition = mvMatrix * vec4(translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n\",\n        \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\n\",\n        \"intersect.include.fx\": \"float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph, in float shadow)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot( oc, rd );\\nfloat c = dot( oc, oc ) - sph.w*sph.w;\\nfloat h = b*b - c;\\nif( h<0.0 ) return -1.0;\\nreturn -b - shadow * sqrt( h );\\n}\\nfloat roundedboxIntersect( in vec3 ro, in vec3 rd, in vec3 size, in float rad )\\n{\\nvec3 m = 1.0/rd;\\nvec3 n = m*ro;\\nvec3 k = abs(m)*(size+rad);\\nvec3 t1 = -n - k;\\nvec3 t2 = -n + k;\\nfloat tN = max( max( t1.x, t1.y ), t1.z );\\nfloat tF = min( min( t2.x, t2.y ), t2.z );\\nif( tN > tF || tF < 0.0) return -1.0;\\nfloat t = tN;\\nvec3 pos = ro+t*rd;\\nvec3 s = sign(pos);\\nro *= s;\\nrd *= s;\\npos *= s;\\npos -= size;\\npos = max( pos.xyz, pos.yzx );\\nif( min(min(pos.x,pos.y),pos.z)<0.0 ) return t;\\nvec3 oc = ro - size;\\nvec3 dd = rd*rd;\\nvec3 oo = oc*oc;\\nvec3 od = oc*rd;\\nfloat ra2 = rad*rad;\\nt = 1e20;\\n{\\nfloat b = od.x + od.y + od.z;\\nfloat c = oo.x + oo.y + oo.z - ra2;\\nfloat h = b*b - c;\\nif( h>0.0 ) t = -b-sqrt(h);\\n}\\n{\\nfloat a = dd.y + dd.z;\\nfloat b = od.y + od.z;\\nfloat c = oo.y + oo.z - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.x+rd.x*h)<size.x ) t = h;\\n}\\n}\\n{\\nfloat a = dd.z + dd.x;\\nfloat b = od.z + od.x;\\nfloat c = oo.z + oo.x - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.y+rd.y*h)<size.y ) t = h;\\n}\\n}\\n{\\nfloat a = dd.x + dd.y;\\nfloat b = od.x + od.y;\\nfloat c = oo.x + oo.y - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.z+rd.z*h)<size.z ) t = h;\\n}\\n}\\nif( t>1e19 ) t=-1.0;\\nreturn t;\\n}\\nvec3 roundedboxNormal( in vec3 pos, in vec3 siz, in float rad )\\n{\\nreturn sign(pos)*normalize(max(abs(pos)-siz,0.0));\\n}\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - shadow * sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-shadow * sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - shadow * sqrt( h1 );\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - shadow * sqrt( h2 );\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\n\",\n        \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\",\n    };\n    class ShaderBase {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        set vertexBuffer(value) {\n            if (this._vertexBuffer != value) {\n                this._vertexBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        get indexBuffer() { return this._indexBuffer; }\n        set indexBuffer(value) {\n            if (this._indexBuffer != value) {\n                this._indexBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        constructor(core, main) {\n            this._core = core;\n            this._main = main;\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n        }\n        _createProgram(vs, fs) {\n            const program = this._gl.createProgram();\n            this._gl.attachShader(program, vs);\n            this._gl.attachShader(program, fs);\n            this._gl.linkProgram(program);\n            if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n                this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n            }\n            return program;\n        }\n        _compileShader(source, type) {\n            const shader = this._gl.createShader(type);\n            this._gl.shaderSource(shader, source);\n            this._gl.compileShader(shader);\n            if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n                this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n            }\n            return shader;\n        }\n        _removeDirective(shaderSource, directive) {\n            const remove = `#define ${directive}`;\n            const index = shaderSource.indexOf(remove);\n            shaderSource = (index == -1) ? shaderSource : shaderSource.substring(0, index) + shaderSource.substring(index + remove.length);\n            return shaderSource;\n        }\n        prepare() {\n            if (this._program != this._main.shaderResources.currentProgram) {\n                if (this._main.shaderResources.currentShader) {\n                    this._main.shaderResources.currentShader.disableProgram();\n                }\n                this.enableProgram(this._program);\n                this.updateBuffers();\n                this.updateTextures();\n            }\n            else {\n                if (this._haveBuffersChanged) {\n                    this.updateBuffers();\n                }\n                if (this._haveTexturesChanged) {\n                    this.updateTextures();\n                }\n            }\n        }\n        apply() { }\n        applyModel() { }\n        applyView() { }\n        enableProgram(program) {\n            this._gl.useProgram(program);\n            this._main.shaderResources.currentProgram = program;\n            this._main.shaderResources.currentShader = this;\n        }\n        updateBuffers() {\n            this._haveBuffersChanged = false;\n        }\n        updateTextures() {\n            this._haveTexturesChanged = false;\n        }\n        disableProgram() {\n            this._main.shaderResources.currentShader = null;\n            this._main.shaderResources.currentProgram = null;\n        }\n        _shaderFromFile(vsName, fsName, callback) {\n            callback(this._includesFromFile(Resources.glsl[vsName]), this._includesFromFile(Resources.glsl[fsName]));\n        }\n        _shaderFromUrl(vsName, fsName, callback) {\n            this._sourceFromUrl(vsName, (vsSource) => {\n                this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n                    this._sourceFromUrl(fsName, (fsSource) => {\n                        this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n                            callback(vsIncSource, fsIncSource);\n                        });\n                    });\n                });\n            });\n        }\n        _sourceFromUrl(url, callback) {\n            const request = new XMLHttpRequest();\n            request.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n            request.onreadystatechange = () => {\n                if (request.readyState == XMLHttpRequest.DONE && request.status == 200) {\n                    callback(request.responseText);\n                }\n            };\n            request.send();\n        }\n        _includesFromFile(source) {\n            let index = 0;\n            do {\n                index = source.indexOf(\"#include\", index);\n                if (index != -1) {\n                    const start = source.indexOf(\"\\\"\", index);\n                    const end = source.indexOf(\"\\\"\", start + 1);\n                    const name = source.substring(start + 1, end);\n                    const inc = Resources.glsl[name];\n                    source = source.substring(0, index) + inc + source.substring(end + 1);\n                }\n            } while (index != -1);\n            return source;\n        }\n        _includesFromUrl(source, index, callback) {\n            index = source.indexOf(\"#include\", index);\n            if (index != -1) {\n                const start = source.indexOf(\"\\\"\", index);\n                const end = source.indexOf(\"\\\"\", start + 1);\n                const name = source.substring(start + 1, end);\n                this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n                    source = source.substring(0, index) + include + source.substring(end + 1);\n                    this._includesFromUrl(source, index, callback);\n                });\n            }\n            else {\n                callback(source);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Texture extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1i(this._samplerUniform, 0);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    let Lasso$1 = class Lasso extends ShaderBase {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n            this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform3fv(this._colorUniform, this.color);\n            this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class SdfText extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n            this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n            this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n            this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n            this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform3fv(this._colorUniform, this.color);\n            this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n            this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n            this._gl.uniform1f(this._gammaUniform, this.gamma);\n            this._gl.uniform1f(this._bufferUniform, this.buffer);\n            this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n            this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n        }\n        applyModel() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class PickGrid extends ShaderBase {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n            this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n            this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n            this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n            this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n            this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n            this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n            this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n            this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n            this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n            this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n            this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n            this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n            this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n            this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n            this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n            this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n            this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n            this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n            this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n            this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n            this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n            this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n        }\n        applyView() {\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        ApplyFace() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n            this._gl.uniform2fv(this._zeroUniform, this.zero);\n            this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._normalAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n            this._gl.enableVertexAttribArray(this._boundsAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitShader extends ShaderBase {\n        get paletteTexture() { return this._paletteTexture; }\n        set paletteTexture(value) {\n            if (this._paletteTexture != value) {\n                this._paletteTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get previousPaletteTexture() { return this._previousPaletteTexture; }\n        set previousPaletteTexture(value) {\n            if (this._previousPaletteTexture != value) {\n                this._previousPaletteTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get sdfTexture() { return this._sdfTexture; }\n        set sdfTexture(value) {\n            if (this._sdfTexture != value) {\n                this._sdfTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get previousSdfTexture() { return this._previousSdfTexture; }\n        set previousSdfTexture(value) {\n            if (this._previousSdfTexture != value) {\n                this._previousSdfTexture = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        set instanceBuffer(value) {\n            if (this._instanceBuffer != value) {\n                this._instanceBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        set previousInstanceBuffer(value) {\n            if (this._previousInstanceBuffer != value) {\n                this._previousInstanceBuffer = value;\n                this._haveBuffersChanged = true;\n            }\n        }\n        initializeData() {\n            this._areBuffersInitialized = false;\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n            this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n            this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n            this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n            this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n            this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n            this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n            this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n            this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n            this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n            this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n            this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n            this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n            this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n            this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n            this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n            this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n            this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n            this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n            this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n            this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n            const vertices = Cube.POSITIONS;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Cube.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this.indexCount = indices.length;\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._updateCurrentBuffer();\n            this._updatePreviousBuffer();\n        }\n        _updateCurrentBuffer() {\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n            this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._idAttribute, 1);\n            this._gl.enableVertexAttribArray(this._idAttribute);\n            this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._idColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._idColorAttribute);\n            this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._translationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._translationAttribute);\n            this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._scaleAttribute, 1);\n            this._gl.enableVertexAttribArray(this._scaleAttribute);\n            this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._selectedAttribute, 1);\n            this._gl.enableVertexAttribArray(this._selectedAttribute);\n            this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._orderAttribute, 1);\n            this._gl.enableVertexAttribArray(this._orderAttribute);\n        }\n        _updatePreviousBuffer() {\n            if (this._previousInstanceBuffer != this._instanceBuffer) {\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n            }\n            this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n            this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousScaleAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n            this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n        }\n        apply() {\n            this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n            this._gl.uniform1f(this._timeUniform, this.time);\n            this._gl.uniform1f(this._durationUniform, this.duration);\n            this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n            this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n            this._gl.uniform1i(this._previousSampler0Uniform, 0);\n            this._gl.uniform1i(this._sampler0Uniform, 1);\n            this._gl.uniform1f(this._hoverUniform, this.hover);\n            this._gl.uniform1f(this._activeUniform, this.active);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n            this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n            this._gl.uniform1i(this._shadowUniform, this.isShadowMap ? 1 : 0);\n        }\n        updateTextures() {\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n        }\n        disableProgram() {\n            super.disableProgram();\n            this._gl.vertexAttribDivisor(this._translationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._scaleAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousScaleAttribute, 0);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 0);\n            this._gl.vertexAttribDivisor(this._selectedAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 0);\n            this._gl.vertexAttribDivisor(this._orderAttribute, 0);\n            this._gl.vertexAttribDivisor(this._idAttribute, 0);\n            this._gl.vertexAttribDivisor(this._idColorAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitBlock extends UnitShader {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitSphere extends UnitShader {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitCylinder extends UnitShader {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        disableProgram() {\n            super.disableProgram();\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class UnitSdf extends UnitShader {\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            super._initializeShader(gl, vsSource, fsSource);\n            this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n            this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n            this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n            this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n            this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n            this._isInitialized = true;\n        }\n        _updateCurrentBuffer() {\n            super._updateCurrentBuffer();\n            this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._rotationAttribute);\n            this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._texCoordAttribute, 1);\n            this._gl.enableVertexAttribArray(this._texCoordAttribute);\n            this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._colorAttribute);\n        }\n        _updatePreviousBuffer() {\n            super._updatePreviousBuffer();\n            this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n            this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n            this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n            this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n            this._gl.enableVertexAttribArray(this._previousColorAttribute);\n        }\n        apply() {\n            super.apply();\n            this._gl.uniform1i(this._previousSampler1Uniform, 2);\n            this._gl.uniform1i(this._sampler1Uniform, 3);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n            this._gl.activeTexture(this._gl.TEXTURE3);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n        }\n        disableProgram() {\n            super.disableProgram();\n            this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n            this._gl.vertexAttribDivisor(this._texCoordAttribute, 0);\n            this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 0);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Background extends ShaderBase {\n        constructor(core, main) {\n            super(core, main);\n            this._quad = new Quad();\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            this._quad.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"background.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n            this._isInitialized = true;\n            this._vao = gl.createVertexArray();\n            gl.bindVertexArray(this._vao);\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._quad.vertexBuffer);\n            gl.vertexAttribPointer(this._positionAttribute, 3, gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            gl.enableVertexAttribArray(this._positionAttribute);\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._quad.indexBuffer);\n            gl.bindVertexArray(null);\n        }\n        apply() {\n            this._gl.uniform3fv(this._colorUniform, this.color);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindVertexArray(this._vao);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Ssao extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D3() { return this._texture2D3; }\n        set texture2D3(value) {\n            if (this._texture2D3 != value) {\n                this._texture2D3 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"ssao.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n            this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._ssaoNoiseSizeUniform = gl.getUniformLocation(this._program, \"uSsaoNoiseSize\");\n            this._ssaoRadiusUniform = gl.getUniformLocation(this._program, \"uSsaoRadius\");\n            this._ssaoPowerUniform = gl.getUniformLocation(this._program, \"uSsaoPower\");\n            this._ssaoKernelUniform = gl.getUniformLocation(this._program, \"uSsaoKernel\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n            this._gl.uniform1i(this._samplerUniform3, 2);\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1f(this._ssaoNoiseSizeUniform, this.ssaoNoiseSize);\n            this._gl.uniform1f(this._ssaoRadiusUniform, this.ssaoRadius);\n            this._gl.uniform1f(this._ssaoPowerUniform, this.ssaoPower);\n            this._gl.uniform3fv(this._ssaoKernelUniform, this.ssaoKernel);\n        }\n        applyView() {\n            this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Box extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"box.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Deferred extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D3() { return this._texture2D3; }\n        set texture2D3(value) {\n            if (this._texture2D3 != value) {\n                this._texture2D3 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D4() { return this._texture2D4; }\n        set texture2D4(value) {\n            if (this._texture2D4 != value) {\n                this._texture2D4 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D5() { return this._texture2D5; }\n        set texture2D5(value) {\n            if (this._texture2D5 != value) {\n                this._texture2D5 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        constructor(core, main) {\n            super(core, main);\n            this.directionToKeyLight = create$3();\n            this.directionToFillLight1 = create$3();\n            this.directionToFillLight2 = create$3();\n            this.keyLightHalfAngle = create$3();\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"deferred.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n            this._ssaoUniform = gl.getUniformLocation(this._program, \"uSsao\");\n            this._inverseVMatrixUniform = gl.getUniformLocation(this._program, \"uInverseVMatrix\");\n            this._shadowVMatrixUniform = gl.getUniformLocation(this._program, \"uShadowVMatrix\");\n            this._shadowPMatrixUniform = gl.getUniformLocation(this._program, \"uShadowPMatrix\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n            this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n            this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._shadowMapSizeUniform = gl.getUniformLocation(this._program, \"uShadowMapSize\");\n            this._keyLightHalfAngleUniform = gl.getUniformLocation(this._program, \"uKeyLightHalfAngle\");\n            this._directionToKeyLightUniform = gl.getUniformLocation(this._program, \"uDirectionToKeyLight\");\n            this._directionToFillLight1Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight1\");\n            this._directionToFillLight2Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight2\");\n            this._keyLightIntensityUniform = gl.getUniformLocation(this._program, \"uKeyLightIntensity\");\n            this._fillLight1IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight1Intensity\");\n            this._fillLight2IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight2Intensity\");\n            this._ambientIntensityUniform = gl.getUniformLocation(this._program, \"uAmbientIntensity\");\n            this._materialIntensityUniform = gl.getUniformLocation(this._program, \"uMaterialIntensity\");\n            this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n            this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._shadowUniform, this.isShadowEnabled ? 1 : 0);\n            this._gl.uniform1i(this._ssaoUniform, this.isSsaoEnabled ? 1 : 0);\n            this._gl.uniformMatrix4fv(this._inverseVMatrixUniform, false, this.inverseVMatrix);\n            this._gl.uniformMatrix4fv(this._shadowVMatrixUniform, false, this.shadowVMatrix);\n            this._gl.uniformMatrix4fv(this._shadowPMatrixUniform, false, this.shadowPMatrix);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n            this._gl.uniform1i(this._samplerUniform3, 2);\n            this._gl.uniform1i(this._samplerUniform4, 3);\n            this._gl.uniform1i(this._samplerUniform5, 4);\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform2f(this._shadowMapSizeUniform, this.shadowMapWidth, this.shadowMapHeight);\n            this._gl.uniform1f(this._keyLightIntensityUniform, this.keyLightIntensity);\n            this._gl.uniform1f(this._fillLight1IntensityUniform, this.fillLight1Intensity);\n            this._gl.uniform1f(this._fillLight2IntensityUniform, this.fillLight2Intensity);\n            this._gl.uniform1f(this._ambientIntensityUniform, this.ambientIntensity);\n            this._gl.uniform1f(this._materialIntensityUniform, this.materialIntensity);\n            this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n            this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n            this._gl.uniform3fv(this._directionToKeyLightUniform, this.directionToKeyLight);\n            this._gl.uniform3fv(this._directionToFillLight1Uniform, this.directionToFillLight1);\n            this._gl.uniform3fv(this._directionToFillLight2Uniform, this.directionToFillLight2);\n            this._gl.uniform3fv(this._keyLightHalfAngleUniform, this.keyLightHalfAngle);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n            this._gl.activeTexture(this._gl.TEXTURE3);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n            this._gl.activeTexture(this._gl.TEXTURE4);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Combine extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D3() { return this._texture2D3; }\n        set texture2D3(value) {\n            if (this._texture2D3 != value) {\n                this._texture2D3 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D4() { return this._texture2D4; }\n        set texture2D4(value) {\n            if (this._texture2D4 != value) {\n                this._texture2D4 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D5() { return this._texture2D5; }\n        set texture2D5(value) {\n            if (this._texture2D5 != value) {\n                this._texture2D5 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"combine.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._intensityUniform = gl.getUniformLocation(this._program, \"uIntensity\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n            this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n            this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n            this._gl.uniform1f(this._intensityUniform, this.intensity);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n            this._gl.uniform1i(this._samplerUniform3, 2);\n            this._gl.uniform1i(this._samplerUniform4, 3);\n            this._gl.uniform1i(this._samplerUniform5, 4);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n            this._gl.activeTexture(this._gl.TEXTURE3);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n            this._gl.activeTexture(this._gl.TEXTURE4);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DofBlur extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"dofblur.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n            this._nearFocusDepthUniform = gl.getUniformLocation(this._program, \"uNearFocusDepth\");\n            this._farFocusDepthUniform = gl.getUniformLocation(this._program, \"uFarFocusDepth\");\n            this._maxBackgroundBlurUniform = gl.getUniformLocation(this._program, \"uMaxBackgroundBlur\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n            this._gl.uniform1f(this._nearFocusDepthUniform, this.nearFocusDepth);\n            this._gl.uniform1f(this._farFocusDepthUniform, this.farFocusDepth);\n            this._gl.uniform1f(this._maxBackgroundBlurUniform, this.maxBackgroundBlur);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Downsample extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"downsample.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1i(this._samplerUniform, 0);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Gaussian extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"gaussian.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n            this._horizontalUniform = gl.getUniformLocation(this._program, \"uHorizontal\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n            this._gl.uniform1i(this._horizontalUniform, this.horizontal ? 1 : 0);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class DofCombine extends ShaderBase {\n        get texture2D1() { return this._texture2D1; }\n        set texture2D1(value) {\n            if (this._texture2D1 != value) {\n                this._texture2D1 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D2() { return this._texture2D2; }\n        set texture2D2(value) {\n            if (this._texture2D2 != value) {\n                this._texture2D2 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        get texture2D3() { return this._texture2D3; }\n        set texture2D3(value) {\n            if (this._texture2D3 != value) {\n                this._texture2D3 = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"dofcombine.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n            this._apertureUniform = gl.getUniformLocation(this._program, \"uAperture\");\n            this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n            this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n            this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n            this._gl.uniform1f(this._apertureUniform, this.aperture);\n            this._gl.uniform1i(this._samplerUniform1, 0);\n            this._gl.uniform1i(this._samplerUniform2, 1);\n            this._gl.uniform1i(this._samplerUniform3, 2);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n            this._gl.activeTexture(this._gl.TEXTURE1);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n            this._gl.activeTexture(this._gl.TEXTURE2);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Fxaa extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"fxaa.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n            this._gl.uniform1i(this._samplerUniform, 0);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Bright extends ShaderBase {\n        get texture2D() { return this._texture2D; }\n        set texture2D(value) {\n            if (this._texture2D != value) {\n                this._texture2D = value;\n                this._haveTexturesChanged = true;\n            }\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            if (this._isLoaded) {\n                this._initializeShader(gl, this._vsSource, this._fsSource);\n            }\n            else {\n                this._shaderFromFile(\"simple.vertex.fx\", \"bright.fragment.fx\", (vsSource, fsSource) => {\n                    this._vsSource = vsSource;\n                    this._fsSource = fsSource;\n                    this._isLoaded = true;\n                    this._initializeShader(gl, vsSource, fsSource);\n                });\n            }\n        }\n        _initializeShader(gl, vsSource, fsSource) {\n            const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n            const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n            this._program = this._createProgram(vs, fs);\n            this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n            this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n            this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n            this._isInitialized = true;\n        }\n        apply() {\n            this._gl.uniform1i(this._samplerUniform, 0);\n            this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n        }\n        updateBuffers() {\n            super.updateBuffers();\n            super.updateBuffers();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n            this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n            this._gl.enableVertexAttribArray(this._positionAttribute);\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        }\n        updateTextures() {\n            super.updateTextures();\n            this._gl.activeTexture(this._gl.TEXTURE0);\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class AxesVisualBase {\n        get isInitialized() { return this._isInitialized; }\n        get axes() { return this._axes; }\n        constructor(core) {\n            this._core = core;\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n        }\n        update(elapsedTime) { }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                this._renderGrid();\n                this._renderText();\n            }\n        }\n        _renderGrid() { }\n        _renderText() { }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cartesian2dVisual extends AxesVisualBase {\n        get isInitialized() { return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized; }\n        constructor(core, main, cartesian2dAxes) {\n            super(core);\n            this._main = main;\n            this._axes = cartesian2dAxes;\n            this._axes.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            const axes = this._axes;\n            if (!axes.isInitialized) {\n                axes.initialize();\n            }\n            if (axes.gridVertices) {\n                this._createGridBuffers();\n            }\n            if (axes.textVertices) {\n                this._createTextBuffers();\n            }\n            this._isInitialized = true;\n        }\n        _createGridBuffers() {\n            const axes = this._axes;\n            this._gridVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n            this._gridIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n            this._gridBufferSize = axes.gridVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n        }\n        _createTextBuffers() {\n            const axes = this._axes;\n            this._textVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n            this._textIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n            this._textBufferSize = axes.textVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                const axes = this._axes;\n                if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n                    this._createGridBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                    this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n                }\n                if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n                    this._createTextBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                    this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n                }\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        _renderText() {\n            const shader = this._main.sdfTextShader;\n            const shaderResources = this._main.shaderResources;\n            const axes = this._axes;\n            const fontVisual = this._main.fonts[axes.font.name];\n            shader.vertexBuffer = this._textVertexBuffer;\n            shader.indexBuffer = this._textIndexBuffer;\n            shader.texture2D = fontVisual.texture;\n            shader.prepare();\n            shader.buffer = fontVisual.font.edgeValue / 0xff;\n            shader.gamma = axes.gamma;\n            shader.borderWidth = axes.textBorderWidth;\n            shader.color = axes.textColor || this._core.config.axesTextColor;\n            shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n            shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n            shader.pickedIdColor = this.pickedIdColor;\n            shader.apply();\n            let indexCount, indexOffset;\n            for (let axisId = 0; axisId < 2; axisId++) {\n                const orientation = axes.getLabelOrientation(axisId);\n                for (let edge = 0; edge < 2; edge++) {\n                    const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                    if (axes.isEdgeVisible[edgeId]) {\n                        if ((orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId)) || (orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId))) {\n                            indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                            indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                        }\n                        else {\n                            indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                            indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                        }\n                        if (indexCount > 0) {\n                            shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                        indexCount = axes.getTitleIndexCount(axisId);\n                        if (indexCount > 0) {\n                            indexOffset = axes.getTitleIndexOffset(axisId);\n                            shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                    indexCount = axes.getHeadingIndexCount(axisId);\n                    if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                        indexOffset = axes.getHeadingIndexOffset(axisId);\n                        shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                        shader.applyModel();\n                        shader.isPickShader = false;\n                        shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                        for (let i = 0; i < this.viewportCount; i++) {\n                            const viewport = i + this.viewportOffset;\n                            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                            shader.vMatrix = this.vMatrices[viewport];\n                            shader.pMatrix = this.pMatrices[viewport];\n                            shader.applyView();\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                        if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                            shader.isPickShader = true;\n                            shader.pMatrix = this.pickPMatrix;\n                            shader.vMatrix = this.pickVMatrix;\n                            shader.applyView();\n                            shaderResources.bindFramebuffer(this.pickFramebuffer);\n                            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                        }\n                    }\n                }\n            }\n        }\n        _renderGrid() {\n            const gridShader = this._main.gridShader;\n            const axes = this._axes;\n            gridShader.vertexBuffer = this._gridVertexBuffer;\n            gridShader.indexBuffer = this._gridIndexBuffer;\n            gridShader.prepare();\n            gridShader.majorThickness = axes.gridMajorThickness;\n            gridShader.minorThickness = axes.gridMinorThickness;\n            gridShader.zeroThickness = axes.gridZeroThickness;\n            gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n            gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n            gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n            gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n            gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n            gridShader.pickedIdColor = this.pickedIdColor;\n            gridShader.apply();\n            for (let axisId = 0; axisId < 2; axisId++) {\n                if (axes.arePickDivisionsVisible[axisId]) {\n                    const gridTicksScale = axes.getGridTicksScale(axisId);\n                    const width = gridTicksScale[0];\n                    const height = gridTicksScale[1];\n                    gridShader.zero = axes.getGridTicksZero(axisId);\n                    gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n                    for (let edge = 0; edge < 2; edge++) {\n                        const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n                        if (axes.isEdgeVisible[edgeId]) {\n                            this._renderGridTicks(axisId, edgeId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.disable(this._gl.CULL_FACE);\n            const size = axes.size;\n            const axisId2 = 0;\n            const axisId3 = 1;\n            const width = size[axisId2];\n            const height = size[axisId3];\n            gridShader.zero = axes.gridFaceZero;\n            gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n            for (let face = 0; face < 2; face++) {\n                const faceId = face;\n                if (axes.getIsForwardFace(faceId)) {\n                    this._renderGridFace(faceId, width, height);\n                }\n            }\n            this._gl.enable(this._gl.CULL_FACE);\n        }\n        _renderGridTicks(axisId, edgeId, width, height) {\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            const axes = this._axes;\n            gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n        }\n        _renderGridFace(faceId, width, height) {\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            const axes = this._axes;\n            gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Cartesian3dVisual extends AxesVisualBase {\n        get isInitialized() { return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized; }\n        constructor(core, main, cartesian3dAxes) {\n            super(core);\n            this._main = main;\n            this._axes = cartesian3dAxes;\n            this._axes.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            super.initializeContext(gl);\n            const axes = this._axes;\n            if (!axes.isInitialized) {\n                axes.initialize();\n            }\n            if (axes.gridVertices) {\n                this._createGridBuffers();\n            }\n            if (axes.textVertices) {\n                this._createTextBuffers();\n            }\n            this._isInitialized = true;\n        }\n        _createGridBuffers() {\n            const axes = this._axes;\n            this._gridVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n            this._gridIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n            this._gridBufferSize = axes.gridVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n        }\n        _createTextBuffers() {\n            const axes = this._axes;\n            this._textVertexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n            this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n            this._textIndexBuffer = this._gl.createBuffer();\n            this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n            this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n            this._textBufferSize = axes.textVertices.byteLength;\n            this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                const axes = this._axes;\n                if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n                    this._createGridBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n                    this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n                }\n                if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n                    this._createTextBuffers();\n                }\n                else {\n                    this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n                    this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n                    this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n                    this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n                    this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n                }\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        _renderText() {\n            const axes = this._axes;\n            const shader = this._main.sdfTextShader;\n            const shaderResources = this._main.shaderResources;\n            const fontVisual = this._main.fonts[axes.font.name];\n            shader.vertexBuffer = this._textVertexBuffer;\n            shader.indexBuffer = this._textIndexBuffer;\n            shader.texture2D = fontVisual.texture;\n            shader.prepare();\n            shader.buffer = fontVisual.font.edgeValue / 0xff;\n            shader.gamma = axes.gamma;\n            shader.borderWidth = axes.textBorderWidth;\n            shader.color = axes.textColor || this._core.config.axesTextColor;\n            shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n            shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n            shader.pickedIdColor = this.pickedIdColor;\n            shader.apply();\n            let indexCount, indexOffset;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                const orientation = axes.getLabelOrientation(axisId);\n                for (let edge = 0; edge < 4; edge++) {\n                    const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                    if (axes.getIsOutsideEdge(edgeId)) {\n                        if (axes.isEdgeVisible[edgeId]) {\n                            if ((orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId)) || (orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId))) {\n                                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n                            }\n                            else {\n                                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n                            }\n                            if (indexCount > 0) {\n                                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                                shader.applyModel();\n                                shader.isPickShader = false;\n                                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                                for (let i = 0; i < this.viewportCount; i++) {\n                                    const viewport = i + this.viewportOffset;\n                                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                    shader.vMatrix = this.vMatrices[viewport];\n                                    shader.pMatrix = this.pMatrices[viewport];\n                                    shader.applyView();\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                                    shader.isPickShader = true;\n                                    shader.pMatrix = this.pickPMatrix;\n                                    shader.vMatrix = this.pickVMatrix;\n                                    shader.applyView();\n                                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                            }\n                            indexCount = axes.getTitleIndexCount(axisId);\n                            if (indexCount > 0) {\n                                indexOffset = axes.getTitleIndexOffset(axisId);\n                                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                                shader.applyModel();\n                                shader.isPickShader = false;\n                                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                                for (let i = 0; i < this.viewportCount; i++) {\n                                    const viewport = i + this.viewportOffset;\n                                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                    shader.vMatrix = this.vMatrices[viewport];\n                                    shader.pMatrix = this.pMatrices[viewport];\n                                    shader.applyView();\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                                    shader.isPickShader = true;\n                                    shader.pMatrix = this.pickPMatrix;\n                                    shader.vMatrix = this.pickVMatrix;\n                                    shader.applyView();\n                                    shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                    this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                                }\n                            }\n                        }\n                        indexCount = axes.getHeadingIndexCount(axisId);\n                        if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n                            indexOffset = axes.getHeadingIndexOffset(axisId);\n                            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n                            shader.applyModel();\n                            shader.isPickShader = false;\n                            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                            for (let i = 0; i < this.viewportCount; i++) {\n                                const viewport = i + this.viewportOffset;\n                                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                                shader.vMatrix = this.vMatrices[viewport];\n                                shader.pMatrix = this.pMatrices[viewport];\n                                shader.applyView();\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                                shader.isPickShader = true;\n                                shader.pMatrix = this.pickPMatrix;\n                                shader.vMatrix = this.pickVMatrix;\n                                shader.applyView();\n                                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        _renderGrid() {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            gridShader.vertexBuffer = this._gridVertexBuffer;\n            gridShader.indexBuffer = this._gridIndexBuffer;\n            gridShader.prepare();\n            gridShader.majorThickness = axes.gridMajorThickness;\n            gridShader.minorThickness = axes.gridMinorThickness;\n            gridShader.zeroThickness = axes.gridZeroThickness;\n            gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n            gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n            gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n            gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n            gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n            gridShader.pickedIdColor = this.pickedIdColor;\n            gridShader.apply();\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (axes.arePickDivisionsVisible[axisId]) {\n                    const gridTicksScale = axes.getGridTicksScale(axisId);\n                    const width = gridTicksScale[0];\n                    const height = gridTicksScale[1];\n                    gridShader.zero = axes.getGridTicksZero(axisId);\n                    gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n                    for (let edge = 0; edge < 4; edge++) {\n                        const edgeId = Cube.AXIS_EDGES[axisId][edge];\n                        if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n                            this._renderGridTicks(axisId, edgeId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.disable(this._gl.CULL_FACE);\n            const size = axes.size;\n            for (let axisId = 0; axisId < 3; axisId++) {\n                if (axes.areFacesVisible[axisId]) {\n                    const axisId2 = axisId == 0 ? 1 : 0;\n                    const axisId3 = axisId == 2 ? 1 : 2;\n                    const width = size[axisId2];\n                    const height = size[axisId3];\n                    gridShader.zero = axes.getGridFaceZero(axisId);\n                    gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n                    for (let face = 0; face < 2; face++) {\n                        const faceId = Cube.AXIS_FACES[axisId][face];\n                        if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n                            this._renderGridFace(faceId, width, height);\n                        }\n                    }\n                }\n            }\n            this._gl.enable(this._gl.CULL_FACE);\n        }\n        _renderGridTicks(axisId, edgeId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n            }\n        }\n        _renderGridFace(faceId, width, height) {\n            const axes = this._axes;\n            const gridShader = this._main.gridShader;\n            const shaderResources = this._main.shaderResources;\n            gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n            gridShader.faceWidth = width;\n            gridShader.faceHeight = height;\n            gridShader.ApplyFace();\n            gridShader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                gridShader.vMatrix = this.vMatrices[viewport];\n                gridShader.pMatrix = this.pMatrices[viewport];\n                gridShader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n            if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n                gridShader.isPickShader = true;\n                gridShader.vMatrix = this.pickVMatrix;\n                gridShader.pMatrix = this.pickPMatrix;\n                gridShader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class FontVisual {\n        get isInitialized() { return this._isInitialized; }\n        get font() { return this._font; }\n        constructor(core, font) {\n            this._core = core;\n            this._font = font;\n            font.hasChangedCallback = () => { this._hasChanged = true; };\n        }\n        initializeContext(gl) {\n            this._gl = gl;\n            this._isInitialized = true;\n            if (this._font.count > 0) {\n                this._hasChanged = true;\n            }\n        }\n        update() {\n            if (this._hasChanged && this._isInitialized) {\n                this._hasChanged = false;\n                this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n                this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class LabelVisualBase {\n        get isInitialized() { return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized; }\n        constructor(core, main, label) {\n            this._core = core;\n            this._main = main;\n            this._label = label;\n            this._label.hasChangedCallback = () => { this._hasChanged = true; };\n            this._mMatrix = create$4();\n            this.mMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._label.isInitialized) {\n                this._label.initialize();\n            }\n            this._gl = gl;\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n                this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n                this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const indexCount = this._label.indexCount;\n                if (indexCount > 0) {\n                    const shader = this._main.sdfTextShader;\n                    const fontVisual = this._main.fonts[this._label.font.name];\n                    shader.vertexBuffer = this._vertexBuffer;\n                    shader.indexBuffer = this._indexBuffer;\n                    shader.texture2D = fontVisual.texture;\n                    shader.prepare();\n                    shader.gamma = this._label.gamma;\n                    shader.buffer = fontVisual.font.edgeValue / 0xff;\n                    shader.borderWidth = this._label.borderWidth;\n                    shader.color = this._label.color || this._core.config.textColor;\n                    shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n                    shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n                    shader.pickedIdColor = this.pickedIdColor;\n                    shader.apply();\n                    multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n                    shader.mMatrix = this._mMatrix;\n                    shader.applyModel();\n                    shader.isPickShader = false;\n                    this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                    for (let i = 0; i < this.viewportCount; i++) {\n                        const viewport = i + this.viewportOffset;\n                        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                        shader.vMatrix = this.vMatrices[viewport];\n                        shader.pMatrix = this.pMatrices[viewport];\n                        shader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                    if (this.isPickingEnabled) {\n                        shader.isPickShader = true;\n                        shader.pMatrix = this.pickPMatrix;\n                        shader.vMatrix = this.pickVMatrix;\n                        shader.applyView();\n                        this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n                        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                        this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n            }\n        }\n    }\n    class LabelVisual extends LabelVisualBase {\n        get label() { return this._label; }\n        set text(value) { this._label.text = value; }\n        get text() { return this._label.text; }\n        constructor(core, main, label) {\n            super(core, main, label);\n        }\n    }\n    class LabelSetVisual extends LabelVisualBase {\n        get label() { return this._label; }\n        constructor(core, main, label) {\n            super(core, main, label);\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ImageVisual {\n        get isInitialized() { return this._isInitialized && this._main.textureShader.isInitialized; }\n        get image() { return this._image; }\n        constructor(core, main, image) {\n            this._core = core;\n            this._main = main;\n            this._image = image;\n            this._image.hasChangedCallback = () => { this._hasChanged = true; };\n            this.mMatrix = create$4();\n            this.isVisible = true;\n        }\n        initializeContext(gl) {\n            if (!this._image.isInitialized) {\n                this._image.initialize();\n            }\n            this._gl = gl;\n            if (this._image.imageData) {\n                this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n            }\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n            this._isInitialized = true;\n        }\n        update(elapsedTime) {\n            if (this._hasChanged) {\n                this._hasChanged = false;\n                this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n                this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n                this._main.shaderResources.currentProgram = null;\n            }\n        }\n        render(elapsedTime, xrFrame) {\n            if (this.isInitialized) {\n                const textureShader = this._main.textureShader;\n                textureShader.vertexBuffer = this._vertexBuffer;\n                textureShader.indexBuffer = this._indexBuffer;\n                textureShader.texture2D = this.texture;\n                textureShader.prepare();\n                textureShader.mMatrix = this.mMatrix;\n                textureShader.apply();\n                this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                    const viewport = i + this.viewportOffset;\n                    this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                    textureShader.vMatrix = this.vMatrices[viewport];\n                    textureShader.pMatrix = this.pMatrices[viewport];\n                    textureShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class Lasso {\n        get isInitialized() { return this._isInitialized; }\n        get vertexBuffer() { return this._vertexBuffer; }\n        get indexBuffer() { return this._indexBuffer; }\n        get indexCount() { return this._indexCount; }\n        initializeContext(gl) {\n            const vertices = Quad$2.textured(Constants.MAT4_IDENTITY);\n            this._vertexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n            gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n            const indices = Quad$2.INDICES;\n            this._indexBuffer = gl.createBuffer();\n            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n            this._indexCount = indices.length;\n            this._isInitialized = true;\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n    class Main extends RendererBase {\n        get shaderResources() { return this._shaderResources; }\n        get textureShader() { return this._textureShader; }\n        get lassoShader() { return this._lassoShader; }\n        get sdfTextShader() { return this._sdfTextShader; }\n        get gridShader() { return this._gridShader; }\n        get blockShader() { return this._blockShader; }\n        get sphereShader() { return this._sphereShader; }\n        get cyclinderShader() { return this._cylinderShader; }\n        get sdfShader() { return this._sdfShader; }\n        get currentAxes() { return this._isAxes1Current ? this._axes1 : this._axes2; }\n        set currentAxes(value) { if (this._isAxes1Current) {\n            this._axes1 = value;\n        }\n        else {\n            this._axes2 = value;\n        } }\n        get previousAxes() { return this._isAxes1Current ? this._axes2 : this._axes1; }\n        set previousAxes(value) { if (this._isAxes1Current) {\n            this._axes2 = value;\n        }\n        else {\n            this._axes1 = value;\n        } }\n        get config() { return this._config; }\n        constructor(options) {\n            super(options);\n            this._config = new Config();\n            this._quad = new Quad();\n            this._lasso = new Lasso();\n            this._pickedPixels = new Uint8Array(4);\n            this._pickedIdColor = create$2();\n            this._position = create$3();\n            this._direction = create$3();\n            this._cameraRotation = create$5();\n            this._cameraPosition = create$3();\n            this._modelPosition = create$3();\n            this._modelManipulationOrigin = create$3();\n            this._shadowVMatrix = create$4();\n            this._shadowPMatrix = create$4();\n        }\n        get isSupported() {\n            return this._createContext(document.createElement(\"canvas\")) !== null;\n        }\n        initialize(core) {\n            super.initialize(core);\n            this._shaderResources = new Resources();\n            this._textureShader = new Texture(core, this);\n            this._lassoShader = new Lasso$1(core, this);\n            this._sdfTextShader = new SdfText(core, this);\n            this._gridShader = new PickGrid(core, this);\n            this._blockShader = new UnitBlock(core, this);\n            this._sphereShader = new UnitSphere(core, this);\n            this._cylinderShader = new UnitCylinder(core, this);\n            this._sdfShader = new UnitSdf(core, this);\n            this._backgroundShader = new Background(core, this);\n            this._ssaoShader = new Ssao(core, this);\n            this._boxShader = new Box(core, this);\n            this._deferredShader = new Deferred(core, this);\n            this._combineShader = new Combine(core, this);\n            this._dofBlurShader = new DofBlur(core, this);\n            this._downsampleShader = new Downsample(core, this);\n            this._gaussianShader = new Gaussian(core, this);\n            this._dofCombineShader = new DofCombine(core, this);\n            this._fxaaShader = new Fxaa(core, this);\n            this._brightPassShader = new Bright(core, this);\n            this._initializeContext(this._createContext(this._canvas));\n            this._canvas.addEventListener(\"webglcontextlost\", (event) => {\n                this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n                event.preventDefault();\n            }, false);\n            this._canvas.addEventListener(\"webglcontextrestored\", () => {\n                this._initializeContext(this._createContext(this._canvas));\n                this._core.log.write(LogLevel.info, \"WebGL context restored\");\n            }, false);\n            this._isInitialized = true;\n        }\n        _initializeContext(gl) {\n            this._gl = gl;\n            for (const key in this.fonts) {\n                const fontVisual = this.fonts[key];\n                fontVisual.initializeContext(gl);\n            }\n            this._ssaoSampleKernel = new Float32Array(this._config.ssaoKernelSize * 3);\n            const random = new PseudoRandom(0);\n            const _vec3 = create$3();\n            for (let i = 0; i < this._config.ssaoKernelSize; i++) {\n                _vec3[0] = random.nextFloat() * 2 - 1;\n                _vec3[1] = random.nextFloat() * 2 - 1;\n                _vec3[2] = random.nextFloat();\n                normalize$2(_vec3, _vec3);\n                scale(_vec3, _vec3, random.nextFloat());\n                let scale$1 = i / this._config.ssaoKernelSize;\n                scale$1 = MathHelper.lerp(0.1, 1, scale$1 * scale$1);\n                scale(_vec3, _vec3, scale$1);\n                this._ssaoSampleKernel[i * 3] = _vec3[0];\n                this._ssaoSampleKernel[i * 3 + 1] = _vec3[1];\n                this._ssaoSampleKernel[i * 3 + 2] = _vec3[2];\n            }\n            const noise = new Float32Array(this._config.ssaoNoiseSize * this._config.ssaoNoiseSize * 4);\n            _vec3[2] = 0;\n            for (let i = 0; i < this._config.ssaoNoiseSize * this._config.ssaoNoiseSize; i++) {\n                _vec3[0] = random.nextFloat() * 2 - 1;\n                _vec3[1] = random.nextFloat() * 2 - 1;\n                normalize$2(_vec3, _vec3);\n                noise[i * 4] = _vec3[0];\n                noise[i * 4 + 1] = _vec3[1];\n            }\n            this._ssaoNoiseTexture = this._gl.createTexture();\n            this._gl.bindTexture(this._gl.TEXTURE_2D, this._ssaoNoiseTexture);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST);\n            this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST);\n            this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA32F, this._config.ssaoNoiseSize, this._config.ssaoNoiseSize, 0, this._gl.RGBA, this._gl.FLOAT, noise);\n            this._ssaoWidth = -1;\n            this._ssaoHeight = -1;\n            this._shadowWidth = -1;\n            this._shadowHeight = -1;\n            this._shaderResources.initializeContext(this._gl);\n            this._textureShader.initializeContext(this._gl);\n            this._lassoShader.initializeContext(this._gl);\n            this._sdfTextShader.initializeContext(this._gl);\n            this._gridShader.initializeContext(this._gl);\n            this._blockShader.initializeContext(this._gl);\n            this._sphereShader.initializeContext(this._gl);\n            this._cylinderShader.initializeContext(this._gl);\n            this._sdfShader.initializeContext(this._gl);\n            this._backgroundShader.initializeContext(this._gl);\n            this._ssaoShader.initializeContext(this._gl);\n            this._boxShader.initializeContext(this._gl);\n            this._deferredShader.initializeContext(this._gl);\n            this._combineShader.initializeContext(this._gl);\n            this._dofBlurShader.initializeContext(this._gl);\n            this._downsampleShader.initializeContext(this._gl);\n            this._gaussianShader.initializeContext(this._gl);\n            this._dofCombineShader.initializeContext(this._gl);\n            this._fxaaShader.initializeContext(this._gl);\n            this._brightPassShader.initializeContext(this._gl);\n            this._quad.initializeContext(this._gl);\n            this._lasso.initializeContext(this._gl);\n            this._framebuffers = [null, null];\n            const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n            const renderBuffer = this._gl.createRenderbuffer();\n            this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, this._core.config.pickWidth, this._core.config.pickHeight);\n            const framebuffer = this._gl.createFramebuffer();\n            this._shaderResources.bindFramebuffer(framebuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n            this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n            this._pickFrameBuffer = framebuffer;\n            for (let i = 0; i < this.transitionBuffers.length; i++) {\n                this.transitionBuffers[i].initializeContext(this._gl);\n            }\n            if (this._axes1) {\n                for (let i = 0; i < this._axes1.length; i++) {\n                    this._axes1[i].initializeContext(this._gl);\n                }\n            }\n            if (this._axes2) {\n                for (let i = 0; i < this._axes2.length; i++) {\n                    this._axes2[i].initializeContext(this._gl);\n                }\n            }\n            for (let i = 0; i < this.labelSets.length; i++) {\n                this.labelSets[i].initializeContext(this._gl);\n            }\n            for (let i = 0; i < this.images.length; i++) {\n                this.images[i].initializeContext(this._gl);\n            }\n        }\n        _resize(width, height) {\n            super._resize(width, height);\n            this._positionTexture = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.NEAREST, null, this._gl.RGBA32F);\n            this._colorTexture = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._normalTexture = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._geometryFrameBuffer = this._gl.createFramebuffer();\n            this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._positionTexture, 0);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT1, this._gl.TEXTURE_2D, this._colorTexture, 0);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT2, this._gl.TEXTURE_2D, this._normalTexture, 0);\n            const renderBuffer = this._gl.createRenderbuffer();\n            this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, width, height);\n            this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n            this._gl.drawBuffers([this._gl.COLOR_ATTACHMENT0, this._gl.COLOR_ATTACHMENT1, this._gl.COLOR_ATTACHMENT2]);\n            this._postProcessTexture1 = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessDepthTexture = TextureHelper.create(this._gl, width, height, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n            this._postProcessFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture1, 0);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._postProcessDepthTexture, 0);\n            this._postProcessTexture2 = TextureHelper.create(this._gl, width, height, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture2, 0);\n            this._postProcessDofTexture = TextureHelper.create(this._gl, width, height, this._gl.RED, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.R32F);\n            this._postProcessDofFrameBuffer = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessDofTexture, 0);\n            const widthHalf = Math.round(width / 2);\n            const heightHalf = Math.round(height / 2);\n            this._postProcessHalfTexture1 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessHalfFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture1, 0);\n            this._postProcessHalfTexture2 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessHalfFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture2, 0);\n            const widthQuarter = Math.round(widthHalf / 2);\n            const heightQuarter = Math.round(heightHalf / 2);\n            this._postProcessQuarterTexture1 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessQuarterFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture1, 0);\n            this._postProcessQuarterTexture2 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessQuarterFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture2, 0);\n            const widthEighth = Math.round(widthQuarter / 2);\n            const heightEighth = Math.round(heightQuarter / 2);\n            this._postProcessEighthTexture1 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessEighthFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture1, 0);\n            this._postProcessEighthTexture2 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessEighthFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture2, 0);\n            const widthSixteenth = Math.round(widthEighth / 2);\n            const hgeightSixteenth = Math.round(heightEighth / 2);\n            this._postProcessSixteenthTexture1 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessSixteenthFrameBuffer1 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture1, 0);\n            this._postProcessSixteenthTexture2 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n            this._postProcessSixteenthFrameBuffer2 = this._gl.createFramebuffer();\n            this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n            this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture2, 0);\n            this._core.log.write(LogLevel.info, `buffers resized ${width},${height}`);\n        }\n        _createContext(canvas) {\n            let supported = false;\n            const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === undefined ? false : this._options.preserveDrawingBuffer : false;\n            const options = {\n                stencil: true,\n                alpha: false,\n                antialias: false,\n                preserveDrawingBuffer: preserveDrawingBuffer,\n            };\n            const gl = canvas.getContext(\"webgl2\", options);\n            if (gl) {\n                const OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n                const EXT_color_buffer_float = gl.getExtension(\"EXT_color_buffer_float\");\n                if (OES_texture_float_linear && EXT_color_buffer_float && gl.MAX_DRAW_BUFFERS > 3) {\n                    const texture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.FLOAT, gl.LINEAR, null, gl.RGBA32F);\n                    const framebuffer = gl.createFramebuffer();\n                    gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n                    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n                    const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n                    if (status == gl.FRAMEBUFFER_COMPLETE) {\n                        supported = true;\n                    }\n                    gl.bindTexture(gl.TEXTURE_2D, null);\n                }\n            }\n            return supported ? gl : null;\n        }\n        prepare() {\n            let viewport;\n            switch (this._core.config.stereoMode) {\n                case StereoMode.none:\n                    viewport = this._viewports[0];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 0;\n                    this._viewportCount = 1;\n                    break;\n                case StereoMode.left:\n                    viewport = this._viewports[0];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 0;\n                    this._viewportCount = 1;\n                    break;\n                case StereoMode.right:\n                    viewport = this._viewports[1];\n                    viewport.x = 0;\n                    viewport.y = 0;\n                    viewport.width = this._canvas.width;\n                    viewport.height = this._canvas.height;\n                    this._viewportOffset = 1;\n                    this._viewportCount = 1;\n                    break;\n            }\n        }\n        createTransitionBuffer(ids) {\n            const buffer = new TransitionBuffer(this._core, ids);\n            buffer.initializeContext(this._gl);\n            return buffer;\n        }\n        createCartesian2dAxesVisual(axes) {\n            const visual = new Cartesian2dVisual(this._core, this, axes);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createCartesian3dAxesVisual(axes) {\n            const visual = new Cartesian3dVisual(this._core, this, axes);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        _createLabelVisual(label) {\n            return new LabelVisual(this._core, this, label);\n        }\n        createLabelSetVisual(labelSet) {\n            const visual = new LabelSetVisual(this._core, this, labelSet);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createImageVisual(image) {\n            const visual = new ImageVisual(this._core, this, image);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        createFontVisual(font) {\n            const visual = new FontVisual(this._core, font);\n            visual.initializeContext(this._gl);\n            return visual;\n        }\n        getDataUrl(mimeType) {\n            return this._canvas.toDataURL(mimeType);\n        }\n        update(elapsedTime) {\n            super.update(elapsedTime);\n            if (this._shadowWidth != this._config.shadowWidth || this._shadowHeight != this._config.shadowHeight) {\n                this._shadowWidth = this._config.shadowWidth;\n                this._shadowHeight = this._config.shadowHeight;\n                this._shadowColorTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n                this._shadowDepthTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n                this._shadowFrameBuffer = this._gl.createFramebuffer();\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._shadowFrameBuffer);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._shadowColorTexture, 0);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._shadowDepthTexture, 0);\n                this._core.log.write(LogLevel.info, `shadow map resized ${this._shadowWidth},${this._shadowHeight}`);\n            }\n            if (this._ssaoWidth != this._config.ssaoWidth || this._ssaoHeight != this._config.ssaoHeight) {\n                this._ssaoWidth = this._config.ssaoWidth;\n                this._ssaoHeight = this._config.ssaoHeight;\n                this._ssaoTexture1 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n                this._ssaoFrameBuffer1 = this._gl.createFramebuffer();\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer1);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture1, 0);\n                this._ssaoTexture2 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n                this._ssaoFrameBuffer2 = this._gl.createFramebuffer();\n                this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer2);\n                this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture2, 0);\n                this._core.log.write(LogLevel.info, `ssao map resized ${this._ssaoWidth},${this._ssaoHeight}`);\n            }\n            if (this._config.isDofEnabled && this._config.dofAutoFocus) {\n                this._core.getModelManipulationOrigin(this._modelManipulationOrigin);\n                this._core.getModelPosition(this._modelPosition);\n                add(this._position, this._modelManipulationOrigin, this._modelPosition);\n                this._core.camera.getPosition(this._cameraPosition);\n                subtract(this._position, this._position, this._cameraPosition);\n                const distance = -this._position[2];\n                const amount = Math.min(elapsedTime * this._core.config.focusSmoothing, 1);\n                this._config.dofFocusDistance = MathHelper.lerp(this._config.dofFocusDistance, distance, amount);\n            }\n        }\n        render(elapsedTime) {\n            return __awaiter(this, void 0, void 0, function* () {\n                this._gl.enable(this._gl.DEPTH_TEST);\n                this._gl.enable(this._gl.CULL_FACE);\n                this._gl.cullFace(this._gl.BACK);\n                this._gl.disable(this._gl.BLEND);\n                if (this.isPickingEnabled) {\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.clearColor(0, 0, 0, 0);\n                    this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                }\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n                this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT | this._gl.STENCIL_BUFFER_BIT);\n                if (this.config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.clear(this._gl.DEPTH_BUFFER_BIT);\n                    perspective(this._shadowPMatrix, AngleHelper.degreesToRadians(30), this._config.shadowWidth / this._config.shadowHeight, this._core.config.nearPlane, this._core.config.farPlane);\n                    set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                    fromMat4(this._cameraRotation, this.inverseVMatrices[0]);\n                    transformMat3(this._position, this._config.keyLightPosition, this._cameraRotation);\n                    add(this._position, this._position, this._modelPosition);\n                    lookAt(this._shadowVMatrix, this._position, this._modelPosition, Constants.VECTOR3_UNITY);\n                }\n                for (let i = 0; i < this.transitionBuffers.length; i++) {\n                    const transitionBuffer = this.transitionBuffers[i];\n                    if (transitionBuffer.isVisible) {\n                        this._renderTransitionBuffer(transitionBuffer);\n                    }\n                }\n                const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n                if (axesVisuals) {\n                    for (let i = 0; i < axesVisuals.length; i++) {\n                        const axesVisual = axesVisuals[i];\n                        if (axesVisual.isVisible) {\n                            axesVisual.pickedIdColor = this._pickedIdColor;\n                            axesVisual.pickFramebuffer = this._pickFrameBuffer;\n                            axesVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                            axesVisual.render(elapsedTime);\n                        }\n                    }\n                }\n                if (this.areLabelsVisible) {\n                    for (let i = 0; i < this.labelSets.length; i++) {\n                        const labelSetVisual = this.labelSets[i];\n                        if (labelSetVisual.isVisible) {\n                            labelSetVisual.pickedIdColor = this._pickedIdColor;\n                            labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n                            labelSetVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                            labelSetVisual.render(elapsedTime);\n                        }\n                    }\n                }\n                if (this.areImagesVisible) {\n                    for (let i = 0; i < this.images.length; i++) {\n                        const imageVisual = this.images[i];\n                        if (imageVisual.isVisible) {\n                            imageVisual.geometryFramebuffer = this._geometryFrameBuffer;\n                            imageVisual.render(elapsedTime);\n                        }\n                    }\n                }\n                if (this._backgroundShader.isInitialized) {\n                    this._backgroundShader.prepare();\n                    this._backgroundShader.color = fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n                    this._backgroundShader.apply();\n                    this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                    for (let i = 0; i < this._viewportCount; i++) {\n                        const viewport = i + this._viewportOffset;\n                        this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                    this._gl.bindVertexArray(null);\n                }\n                if (this.isPickingEnabled) {\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n                    this._pickedType = PickHelper.decodeType(this._pickedPixels);\n                    set$2(this._pickedIdColor, this._pickedPixels[0] / 0xff, this._pickedPixels[1] / 0xff, this._pickedPixels[2] / 0xff, this._pickedPixels[3] / 0xff);\n                    this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n                }\n                else {\n                    set$2(this._pickedIdColor, 0, 0, 0, 0);\n                    this._pickedId = 0;\n                }\n                if (this.transitionBuffers.length > 0 && this._quad.isInitialized) {\n                    const viewport = this._viewportOffset;\n                    this._postProcess(this.vMatrices[viewport], this.inverseVMatrices[viewport], this.pMatrices[viewport], this._viewports[viewport]);\n                }\n                if (this.isLassoPicking && this._lassoShader.isInitialized) {\n                    this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n                    this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n                    const lassoWidth = this.lassoX1 - this.lassoX0;\n                    const lassoHeight = this.lassoY1 - this.lassoY0;\n                    this._lassoShader.prepare();\n                    this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n                    this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n                    this._lassoShader.apply();\n                    const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n                    for (let i = 0; i < this._viewportCount; i++) {\n                        const viewportIndex = i + this._viewportOffset;\n                        this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n                        const viewport = this._viewports[viewportIndex];\n                        this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n                        this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n                        this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n                        this._lassoMMatrix[10] = 1;\n                        this._lassoMMatrix[12] = ((this.lassoX0 + lassoWidth / 2) / viewport.width) * 2 - 1;\n                        this._lassoMMatrix[13] = 1 - ((this.lassoY0 + lassoHeight / 2) / viewport.height) * 2;\n                        this._lassoShader.mMatrix = this._lassoMMatrix;\n                        set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n                        this._lassoShader.thickness = this._lassoThickness;\n                        this._lassoShader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n            });\n        }\n        _renderTransitionBuffer(transitionBuffer) {\n            const currentBuffer = transitionBuffer.currentBuffer;\n            const previousBuffer = transitionBuffer.previousBuffer;\n            const currentPalette = transitionBuffer.currentPalette;\n            const previousPalette = transitionBuffer.previousPalette;\n            const currentAtlas = transitionBuffer.currentAtlas;\n            const previousAtlas = transitionBuffer.previousAtlas;\n            const unitType = transitionBuffer.unitType === undefined ? currentBuffer.unitType : transitionBuffer.unitType;\n            const id = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n            const hoverId = id > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id) : -1;\n            const activeId = transitionBuffer.activeId;\n            if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf)) {\n                this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._blockShader.prepare();\n                this._blockShader.mMatrix = this.mMatrix;\n                this._blockShader.time = this.transitionTime;\n                this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._blockShader.rangeMin = currentBuffer.from;\n                this._blockShader.rangeMax = currentBuffer.to;\n                this._blockShader.hover = hoverId;\n                this._blockShader.active = activeId;\n                this._blockShader.specularPower = this._config.specularPower;\n                this._blockShader.specularIntensity = this._config.specularIntensity;\n                this._blockShader.apply();\n                this._blockShader.isPickShader = false;\n                this._blockShader.isShadowMap = false;\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._blockShader.vMatrix = this.vMatrices[viewport];\n                    this._blockShader.pMatrix = this.pMatrices[viewport];\n                    this._blockShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this._config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                    this._gl.cullFace(this._gl.FRONT);\n                    this._blockShader.isPickShader = false;\n                    this._blockShader.isShadowMap = true;\n                    this._blockShader.vMatrix = this._shadowVMatrix;\n                    this._blockShader.pMatrix = this._shadowPMatrix;\n                    this._blockShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                    this._gl.colorMask(true, true, true, true);\n                    this._gl.cullFace(this._gl.BACK);\n                }\n                if (this.isPickingEnabled) {\n                    this._blockShader.isPickShader = true;\n                    this._blockShader.isShadowMap = false;\n                    this._blockShader.pMatrix = this.pickPMatrix;\n                    this._blockShader.vMatrix = this.pickVMatrix;\n                    this._blockShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf)) {\n                this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._sphereShader.prepare();\n                this._sphereShader.mMatrix = this.mMatrix;\n                this._sphereShader.time = this.transitionTime;\n                this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._sphereShader.rangeMin = currentBuffer.from;\n                this._sphereShader.rangeMax = currentBuffer.to;\n                this._sphereShader.hover = hoverId;\n                this._sphereShader.active = activeId;\n                this._sphereShader.specularPower = this._config.specularPower;\n                this._sphereShader.specularIntensity = this._config.specularIntensity;\n                this._sphereShader.apply();\n                this._sphereShader.isPickShader = false;\n                this._sphereShader.isShadowMap = false;\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._sphereShader.vMatrix = this.vMatrices[viewport];\n                    this._sphereShader.pMatrix = this.pMatrices[viewport];\n                    this._sphereShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this._config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                    this._sphereShader.isPickShader = false;\n                    this._sphereShader.isShadowMap = true;\n                    this._sphereShader.vMatrix = this._shadowVMatrix;\n                    this._sphereShader.pMatrix = this._shadowPMatrix;\n                    this._sphereShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                    this._gl.colorMask(true, true, true, true);\n                }\n                if (this.isPickingEnabled) {\n                    this._sphereShader.isPickShader = true;\n                    this._sphereShader.isShadowMap = false;\n                    this._sphereShader.pMatrix = this.pickPMatrix;\n                    this._sphereShader.vMatrix = this.pickVMatrix;\n                    this._sphereShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n                this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._cylinderShader.prepare();\n                this._cylinderShader.mMatrix = this.mMatrix;\n                this._cylinderShader.time = this.transitionTime;\n                this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._cylinderShader.rangeMin = currentBuffer.from;\n                this._cylinderShader.rangeMax = currentBuffer.to;\n                this._cylinderShader.hover = hoverId;\n                this._cylinderShader.active = activeId;\n                this._cylinderShader.specularPower = this._config.specularPower;\n                this._cylinderShader.specularIntensity = this._config.specularIntensity;\n                this._cylinderShader.apply();\n                this._cylinderShader.isPickShader = false;\n                this._cylinderShader.isShadowMap = false;\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._cylinderShader.vMatrix = this.vMatrices[viewport];\n                    this._cylinderShader.pMatrix = this.pMatrices[viewport];\n                    this._cylinderShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this._config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                    this._cylinderShader.isPickShader = false;\n                    this._cylinderShader.isShadowMap = true;\n                    this._cylinderShader.vMatrix = this._shadowVMatrix;\n                    this._cylinderShader.pMatrix = this._shadowPMatrix;\n                    this._cylinderShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                    this._gl.colorMask(true, true, true, true);\n                }\n                if (this.isPickingEnabled) {\n                    this._cylinderShader.isPickShader = true;\n                    this._cylinderShader.isShadowMap = false;\n                    this._cylinderShader.pMatrix = this.pickPMatrix;\n                    this._cylinderShader.vMatrix = this.pickVMatrix;\n                    this._cylinderShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n            else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n                this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n                this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n                this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n                this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n                this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n                this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n                this._sdfShader.prepare();\n                this._sdfShader.mMatrix = this.mMatrix;\n                this._sdfShader.time = this.transitionTime;\n                this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n                this._sdfShader.rangeMin = currentBuffer.from;\n                this._sdfShader.rangeMax = currentBuffer.to;\n                this._sdfShader.hover = hoverId;\n                this._sdfShader.active = activeId;\n                this._sdfShader.specularPower = this._config.specularPower;\n                this._sdfShader.specularIntensity = this._config.specularIntensity;\n                this._sdfShader.apply();\n                this._sdfShader.isPickShader = false;\n                this._sdfShader.isShadowMap = false;\n                this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n                for (let i = 0; i < this._viewportCount; i++) {\n                    const viewport = i + this._viewportOffset;\n                    this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n                    this._sdfShader.vMatrix = this.vMatrices[viewport];\n                    this._sdfShader.pMatrix = this.pMatrices[viewport];\n                    this._sdfShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n                if (this._config.isShadowEnabled) {\n                    this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n                    this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n                    this._gl.cullFace(this._gl.FRONT);\n                    this._sdfShader.isPickShader = false;\n                    this._sdfShader.isShadowMap = true;\n                    this._sdfShader.vMatrix = this._shadowVMatrix;\n                    this._sdfShader.pMatrix = this._shadowPMatrix;\n                    this._sdfShader.applyView();\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                    this._gl.colorMask(true, true, true, true);\n                    this._gl.cullFace(this._gl.BACK);\n                }\n                if (this.isPickingEnabled) {\n                    this._sdfShader.isPickShader = true;\n                    this._sdfShader.isShadowMap = false;\n                    this._sdfShader.pMatrix = this.pickPMatrix;\n                    this._sdfShader.vMatrix = this.pickVMatrix;\n                    this._sdfShader.applyView();\n                    this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n                    this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                    this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n                }\n            }\n        }\n        _postProcess(vMatrix, inverseVMatrix, pMatrix, viewport) {\n            if (this._deferredShader.isInitialized) {\n                this._gl.disable(this._gl.DEPTH_TEST);\n                let ssaoTexture;\n                if (this._config.isSsaoEnabled && this._ssaoShader.isInitialized) {\n                    this._gl.viewport(0, 0, this._config.ssaoWidth, this._config.ssaoHeight);\n                    ssaoTexture = this._ssaoTexture1;\n                    this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer1);\n                    this._ssaoShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._ssaoShader.indexBuffer = this._quad.indexBuffer;\n                    this._ssaoShader.texture2D1 = this._positionTexture;\n                    this._ssaoShader.texture2D2 = this._normalTexture;\n                    this._ssaoShader.texture2D3 = this._ssaoNoiseTexture;\n                    this._ssaoShader.prepare();\n                    this._ssaoShader.pMatrix = pMatrix;\n                    this._ssaoShader.ssaoNoiseSize = this._config.ssaoNoiseSize;\n                    this._ssaoShader.ssaoRadius = this._config.ssaoRadius;\n                    this._ssaoShader.ssaoPower = this._config.ssaoPower;\n                    this._ssaoShader.ssaoKernel = this._ssaoSampleKernel;\n                    this._ssaoShader.left = 0;\n                    this._ssaoShader.top = 0;\n                    this._ssaoShader.width = this._config.ssaoWidth;\n                    this._ssaoShader.height = this._config.ssaoHeight;\n                    this._ssaoShader.apply();\n                    this._ssaoShader.applyView();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    if (this._config.ssaoBlurEnabled && this._boxShader.isInitialized) {\n                        ssaoTexture = this._ssaoTexture2;\n                        this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer2);\n                        this._boxShader.vertexBuffer = this._quad.vertexBuffer;\n                        this._boxShader.indexBuffer = this._quad.indexBuffer;\n                        this._boxShader.texture2D = this._ssaoTexture1;\n                        this._boxShader.prepare();\n                        this._boxShader.left = 0;\n                        this._boxShader.top = 0;\n                        this._boxShader.width = this._config.ssaoWidth;\n                        this._boxShader.height = this._config.ssaoHeight;\n                        this._boxShader.apply();\n                        this._boxShader.applyView();\n                        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    }\n                }\n                this._gl.viewport(viewport.left, viewport.top, viewport.width, viewport.height);\n                let postProcessFrameBuffer = this._postProcessFrameBuffer1;\n                this._shaderResources.bindFramebuffer(postProcessFrameBuffer);\n                this._deferredShader.vertexBuffer = this._quad.vertexBuffer;\n                this._deferredShader.indexBuffer = this._quad.indexBuffer;\n                this._deferredShader.texture2D1 = this._positionTexture;\n                this._deferredShader.texture2D2 = this._colorTexture;\n                this._deferredShader.texture2D3 = this._normalTexture;\n                this._deferredShader.texture2D4 = this._config.isSsaoEnabled ? ssaoTexture : null;\n                this._deferredShader.texture2D5 = this._shadowDepthTexture;\n                this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\n                this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n                this._deferredShader.prepare();\n                this._deferredShader.isShadowEnabled = this._config.isShadowEnabled;\n                this._deferredShader.isSsaoEnabled = this._config.isSsaoEnabled;\n                this._deferredShader.inverseVMatrix = inverseVMatrix;\n                this._deferredShader.shadowVMatrix = this._shadowVMatrix;\n                this._deferredShader.shadowPMatrix = this._shadowPMatrix;\n                this._deferredShader.vMatrix = vMatrix;\n                this._deferredShader.keyLightIntensity = this._config.keyLightIntensity;\n                this._deferredShader.fillLight1Intensity = this._config.fillLight1Intensity;\n                this._deferredShader.fillLight2Intensity = this._config.fillLight2Intensity;\n                this._core.camera.getPosition(this._cameraPosition);\n                fromMat4(this._cameraRotation, vMatrix);\n                set$3(this._position, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n                normalize$2(this._deferredShader.directionToKeyLight, this._config.keyLightPosition);\n                subtract(this._direction, this._cameraPosition, this._position);\n                normalize$2(this._direction, this._direction);\n                add(this._deferredShader.keyLightHalfAngle, this._direction, this._deferredShader.directionToKeyLight);\n                normalize$2(this._deferredShader.keyLightHalfAngle, this._deferredShader.keyLightHalfAngle);\n                copy$3(this._deferredShader.directionToFillLight1, this._config.fillLight1Position);\n                copy$3(this._deferredShader.directionToFillLight2, this._config.fillLight2Position);\n                this._deferredShader.left = viewport.left;\n                this._deferredShader.top = viewport.top;\n                this._deferredShader.width = viewport.width;\n                this._deferredShader.height = viewport.height;\n                this._deferredShader.shadowMapWidth = this._config.shadowWidth;\n                this._deferredShader.shadowMapHeight = this._config.shadowHeight;\n                this._deferredShader.ambientIntensity = this._config.ambientIntensity;\n                this._deferredShader.materialIntensity = this._config.materialIntensity;\n                this._deferredShader.specularPower = this._config.specularPower;\n                this._deferredShader.specularIntensity = this._config.specularIntensity;\n                this._deferredShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                const widthHalf = Math.round(viewport.width / 2);\n                const heightHalf = Math.round(viewport.height / 2);\n                const widthQuarter = Math.round(widthHalf / 2);\n                const heightQuarter = Math.round(heightHalf / 2);\n                const widthEighth = Math.round(widthQuarter / 2);\n                const heightEighth = Math.round(heightQuarter / 2);\n                const widthSixteenth = Math.round(widthEighth / 2);\n                const heightSixteenth = Math.round(heightEighth / 2);\n                if (this._config.isDofEnabled && this._dofBlurShader.isInitialized && this._dofCombineShader.isInitialized) {\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n                    this._dofBlurShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._dofBlurShader.indexBuffer = this._quad.indexBuffer;\n                    this._dofBlurShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                    this._dofBlurShader.texture2D2 = this._positionTexture;\n                    this._dofBlurShader.prepare();\n                    this._dofBlurShader.focusDepth = this._config.dofFocusDistance;\n                    this._dofBlurShader.nearFocusDepth = this._config.dofFocusDistance - this._config.dofFocusRange / 2;\n                    this._dofBlurShader.farFocusDepth = this._config.dofFocusDistance + this._config.dofFocusRange / 2;\n                    this._dofBlurShader.maxBackgroundBlur = this._config.dofMaxBackgroundBlur;\n                    this._dofBlurShader.left = viewport.left;\n                    this._dofBlurShader.top = viewport.top;\n                    this._dofBlurShader.width = viewport.width;\n                    this._dofBlurShader.height = viewport.height;\n                    this._dofBlurShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n                    this._dofCombineShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._dofCombineShader.indexBuffer = this._quad.indexBuffer;\n                    this._dofCombineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                    this._dofCombineShader.texture2D2 = this._postProcessDofTexture;\n                    this._dofCombineShader.prepare();\n                    this._dofCombineShader.focusDepth = this._config.dofFocusDistance;\n                    this._dofCombineShader.left = viewport.left;\n                    this._dofCombineShader.top = viewport.top;\n                    this._dofCombineShader.width = viewport.width;\n                    this._dofCombineShader.height = viewport.height;\n                    this._dofCombineShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this._config.isBloomEnabled && this._brightPassShader.isInitialized && this._gaussianShader.isInitialized) {\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n                    this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                    this._brightPassShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n                    this._brightPassShader.prepare();\n                    this._brightPassShader.width = widthHalf;\n                    this._brightPassShader.height = heightHalf;\n                    this._brightPassShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n                    this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                    this._brightPassShader.texture2D = this._postProcessHalfTexture1;\n                    this._brightPassShader.prepare();\n                    this._brightPassShader.width = widthQuarter;\n                    this._brightPassShader.height = heightQuarter;\n                    this._brightPassShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n                    this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                    this._brightPassShader.texture2D = this._postProcessQuarterTexture1;\n                    this._brightPassShader.prepare();\n                    this._brightPassShader.width = widthEighth;\n                    this._brightPassShader.height = heightEighth;\n                    this._brightPassShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n                    this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n                    this._brightPassShader.texture2D = this._postProcessEighthTexture1;\n                    this._brightPassShader.prepare();\n                    this._brightPassShader.width = widthSixteenth;\n                    this._brightPassShader.height = heightSixteenth;\n                    this._brightPassShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n                    this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                    this._gaussianShader.texture2D = this._postProcessHalfTexture1;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.width = widthHalf;\n                    this._gaussianShader.height = heightHalf;\n                    this._gaussianShader.horizontal = true;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n                    this._gaussianShader.texture2D = this._postProcessHalfTexture2;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.horizontal = false;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n                    this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                    this._gaussianShader.texture2D = this._postProcessQuarterTexture1;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.width = widthQuarter;\n                    this._gaussianShader.height = heightQuarter;\n                    this._gaussianShader.horizontal = true;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n                    this._gaussianShader.texture2D = this._postProcessQuarterTexture2;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.horizontal = false;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n                    this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                    this._gaussianShader.texture2D = this._postProcessEighthTexture1;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.width = widthEighth;\n                    this._gaussianShader.height = heightEighth;\n                    this._gaussianShader.horizontal = true;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n                    this._gaussianShader.texture2D = this._postProcessEighthTexture2;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.horizontal = false;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n                    this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n                    this._gaussianShader.texture2D = this._postProcessSixteenthTexture1;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.width = widthSixteenth;\n                    this._gaussianShader.height = heightSixteenth;\n                    this._gaussianShader.horizontal = true;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n                    this._gaussianShader.texture2D = this._postProcessSixteenthTexture2;\n                    this._gaussianShader.prepare();\n                    this._gaussianShader.horizontal = false;\n                    this._gaussianShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                if (this._config.isFxaaEnabled && this._fxaaShader.isInitialized) {\n                    postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n                    this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n                    this._fxaaShader.vertexBuffer = this._quad.vertexBuffer;\n                    this._fxaaShader.indexBuffer = this._quad.indexBuffer;\n                    this._fxaaShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n                    this._fxaaShader.prepare();\n                    this._fxaaShader.left = viewport.left;\n                    this._fxaaShader.top = viewport.top;\n                    this._fxaaShader.width = viewport.width;\n                    this._fxaaShader.height = viewport.height;\n                    this._fxaaShader.apply();\n                    this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n                }\n                this._shaderResources.bindFramebuffer(null);\n                this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n                this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n                this._combineShader.vertexBuffer = this._quad.vertexBuffer;\n                this._combineShader.indexBuffer = this._quad.indexBuffer;\n                this._combineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n                if (this._config.isBloomEnabled) {\n                    this._combineShader.texture2D2 = this._postProcessHalfTexture1;\n                    this._combineShader.texture2D3 = this._postProcessQuarterTexture1;\n                    this._combineShader.texture2D4 = this._postProcessEighthTexture1;\n                    this._combineShader.texture2D5 = this._postProcessSixteenthTexture1;\n                }\n                else {\n                    this._combineShader.texture2D2 = null;\n                    this._combineShader.texture2D3 = null;\n                    this._combineShader.texture2D4 = null;\n                    this._combineShader.texture2D5 = null;\n                }\n                this._combineShader.prepare();\n                this._combineShader.viewport = viewport;\n                this._combineShader.intensity = this._config.bloomIntensity;\n                this._combineShader.apply();\n                this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n            }\n        }\n    }\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class MaterialBufferData extends Float32Array {\n        constructor(count) {\n            super(count * MaterialBufferData.SIZE);\n            this.TYPE_OFFSET = 0 / 4;\n            this.FUZZ_OFFSET = 4 / 4;\n            this.REFRACTIVE_INDEX_OFFSET = 8 / 4;\n            this.TEXTURE_ID_OFFSET = 12 / 4;\n            this.COLOR_OFFSET = 16 / 4;\n            this.GLOSSINESS_OFFSET = 28 / 4;\n            this.ID_COLOR_OFFSET = 32 / 4;\n            this.DENSITY_OFFSET = 48 / 4;\n        }\n        getType(index) {\n            return this[MaterialBufferData.SIZE * index + this.TYPE_OFFSET];\n        }\n        setType(index, value) {\n            this[MaterialBufferData.SIZE * index + this.TYPE_OFFSET] = value;\n        }\n        getFuzz(index) {\n            return this[MaterialBufferData.SIZE * index + this.FUZZ_OFFSET];\n        }\n        setFuzz(index, value) {\n            this[MaterialBufferData.SIZE * index + this.FUZZ_OFFSET] = value;\n        }\n        getRefractiveIndex(index) {\n            return this[MaterialBufferData.SIZE * index + this.REFRACTIVE_INDEX_OFFSET];\n        }\n        setRefractiveIndex(index, value) {\n            this[MaterialBufferData.SIZE * index + this.REFRACTIVE_INDEX_OFFSET] = value;\n        }\n        getTextureId(index) {\n            return this[MaterialBufferData.SIZE * index + this.TEXTURE_ID_OFFSET];\n        }\n        setTextureId(index, value) {\n            this[MaterialBufferData.SIZE * index + this.TEXTURE_ID_OFFSET] = value;\n        }\n        getColor(index, value) {\n            const offset = MaterialBufferData.SIZE * index + this.COLOR_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setColor(index, value) {\n            const offset = MaterialBufferData.SIZE * index + this.COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getGlossiness(index) {\n            return this[MaterialBufferData.SIZE * index + this.GLOSSINESS_OFFSET];\n        }\n        setGlossiness(index, value) {\n            this[MaterialBufferData.SIZE * index + this.GLOSSINESS_OFFSET] = value;\n        }\n        getDensity(index) {\n            return this[MaterialBufferData.SIZE * index + this.DENSITY_OFFSET];\n        }\n        setDensity(index, value) {\n            this[MaterialBufferData.SIZE * index + this.DENSITY_OFFSET] = value;\n        }\n        getIdColor(index, value) {\n            const offset = MaterialBufferData.SIZE * index + this.ID_COLOR_OFFSET;\n            set$2(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setIdColor(index, value) {\n            const offset = MaterialBufferData.SIZE * index + this.ID_COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n    }\n    MaterialBufferData.SIZE = 64 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class TextureBufferData extends Float32Array {\n        constructor(count) {\n            super(count * TextureBufferData.SIZE);\n            this.COLOR0_OFFSET = 0 / 4;\n            this.TYPE_OFFSET = 12 / 4;\n            this.COLOR1_OFFSET = 16 / 4;\n            this.SIZE0_OFFSET = 32 / 4;\n            this.SIZE1_OFFSET = 48 / 4;\n            this.CLIP_OFFSET = 64 / 4;\n            this.OFFSET_OFFSET = 80 / 4;\n        }\n        getType(index) {\n            return this[TextureBufferData.SIZE * index + this.TYPE_OFFSET];\n        }\n        setType(index, value) {\n            this[TextureBufferData.SIZE * index + this.TYPE_OFFSET] = value;\n        }\n        getColor0(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.COLOR0_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setColor0(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.COLOR0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getColor1(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.COLOR1_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setColor1(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.COLOR1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSize0(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.SIZE0_OFFSET;\n            set$2(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setSize0(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.SIZE0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getSize1(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.SIZE1_OFFSET;\n            set$2(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setSize1(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.SIZE1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getClip(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.CLIP_OFFSET;\n            set$2(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setClip(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.CLIP_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getOffset(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.OFFSET_OFFSET;\n            set(value, this[offset], this[offset + 1]);\n        }\n        setOffset(index, value) {\n            const offset = TextureBufferData.SIZE * index + this.OFFSET_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n        }\n    }\n    TextureBufferData.SIZE = 96 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class HittableBufferData extends Float32Array {\n        constructor(count) {\n            super(count * HittableBufferData.SIZE);\n            this.CENTER0_OFFSET = 0 / 4;\n            this.TYPE_OFFSET = 12 / 4;\n            this.SIZE0_OFFSET = 16 / 4;\n            this.MATERIAL_ID_OFFSET = 28 / 4;\n            this.ROTATION0_OFFSET = 32 / 4;\n            this.ROTATION1_OFFSET = 48 / 4;\n            this.TEXCOORD0_OFFSET = 64 / 4;\n            this.TEXCOORD1_OFFSET = 72 / 4;\n            this.CENTER1_OFFSET = 80 / 4;\n            this.ROUNDING_OFFSET = 92 / 4;\n            this.SIZE1_OFFSET = 96 / 4;\n            this.BOUNDARY_TYPE_OFFSET = 108 / 4;\n            this.TIME0_OFFSET = 112 / 4;\n            this.TIME1_OFFSET = 116 / 4;\n            this.TEX_ID_OFFSET = 120 / 4;\n            this.SDF_BUFFER_OFFSET = 124 / 4;\n            this.SDF_BORDER_OFFSET = 128 / 4;\n            this.PARAMETER_1_OFFSET = 132 / 4;\n            this.PARAMETER_2_OFFSET = 136 / 4;\n            this.MATERIAL_FUZZ_OFFSET = 140 / 4;\n            this.MATERIAL_GLOSS_OFFSET = 144 / 4;\n            this.MATERIAL_DENSITY_OFFSET = 148 / 4;\n            this.MATERIAL_REFRACTIVE_INDEX_OFFSET = 152 / 4;\n            this.MATERIAL_COLOR_OFFSET = 160 / 4;\n            this.MATERIAL_TYPE_ID_OFFSET = 172 / 4;\n            this.SEGMENT_COLOR_OFFSET = 176 / 4;\n            this.TEXTURE_TYPE_ID_OFFSET = 192 / 4;\n            this.TEXTURE_ID_OFFSET = 196 / 4;\n        }\n        getType(index) {\n            return this[HittableBufferData.SIZE * index + this.TYPE_OFFSET];\n        }\n        setType(index, value) {\n            this[HittableBufferData.SIZE * index + this.TYPE_OFFSET] = value;\n        }\n        getCenter0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.CENTER0_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setCenter0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.CENTER0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getCenter1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.CENTER1_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setCenter1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.CENTER1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getTime0(index) {\n            return this[HittableBufferData.SIZE * index + this.TIME0_OFFSET];\n        }\n        setTime0(index, value) {\n            this[HittableBufferData.SIZE * index + this.TIME0_OFFSET] = value;\n        }\n        getTime1(index) {\n            return this[HittableBufferData.SIZE * index + this.TIME1_OFFSET];\n        }\n        setTime1(index, value) {\n            this[HittableBufferData.SIZE * index + this.TIME1_OFFSET] = value;\n        }\n        getSize0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SIZE0_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setSize0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SIZE0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSize1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SIZE1_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setSize1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SIZE1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getRotation0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.ROTATION0_OFFSET;\n            set$1(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setRotation0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.ROTATION0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getRotation1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.ROTATION1_OFFSET;\n            set$1(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setRotation1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.ROTATION1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n        getTexCoord0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.TEXCOORD0_OFFSET;\n            set(value, this[offset], this[offset + 1]);\n        }\n        setTexCoord0(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.TEXCOORD0_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n        }\n        getTexCoord1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.TEXCOORD1_OFFSET;\n            set(value, this[offset], this[offset + 1]);\n        }\n        setTexCoord1(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.TEXCOORD1_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n        }\n        getRounding(index) {\n            return this[HittableBufferData.SIZE * index + this.ROUNDING_OFFSET];\n        }\n        setRounding(index, value) {\n            this[HittableBufferData.SIZE * index + this.ROUNDING_OFFSET] = value;\n        }\n        getParameter1(index) {\n            return this[HittableBufferData.SIZE * index + this.PARAMETER_1_OFFSET];\n        }\n        setParameter1(index, value) {\n            this[HittableBufferData.SIZE * index + this.PARAMETER_1_OFFSET] = value;\n        }\n        getParameter2(index) {\n            return this[HittableBufferData.SIZE * index + this.PARAMETER_2_OFFSET];\n        }\n        setParameter2(index, value) {\n            this[HittableBufferData.SIZE * index + this.PARAMETER_2_OFFSET] = value;\n        }\n        getBoundaryType(index) {\n            return this[HittableBufferData.SIZE * index + this.BOUNDARY_TYPE_OFFSET];\n        }\n        setBoundaryType(index, value) {\n            this[HittableBufferData.SIZE * index + this.BOUNDARY_TYPE_OFFSET] = value;\n        }\n        getTexId(index) {\n            return this[HittableBufferData.SIZE * index + this.TEX_ID_OFFSET];\n        }\n        setTexId(index, value) {\n            this[HittableBufferData.SIZE * index + this.TEX_ID_OFFSET] = value;\n        }\n        getSdfBuffer(index) {\n            return this[HittableBufferData.SIZE * index + this.SDF_BUFFER_OFFSET];\n        }\n        setSdfBuffer(index, value) {\n            this[HittableBufferData.SIZE * index + this.SDF_BUFFER_OFFSET] = value;\n        }\n        getSdfBorder(index) {\n            return this[HittableBufferData.SIZE * index + this.SDF_BORDER_OFFSET];\n        }\n        setSdfBorder(index, value) {\n            this[HittableBufferData.SIZE * index + this.SDF_BORDER_OFFSET] = value;\n        }\n        getMaterialTypeId(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_TYPE_ID_OFFSET];\n        }\n        setMaterialTypeId(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_TYPE_ID_OFFSET] = value;\n        }\n        getMaterialFuzz(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_FUZZ_OFFSET];\n        }\n        setMaterialFuzz(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_FUZZ_OFFSET] = value;\n        }\n        getMaterialDensity(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_DENSITY_OFFSET];\n        }\n        setMaterialDensity(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_DENSITY_OFFSET] = value;\n        }\n        getMaterialGloss(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_GLOSS_OFFSET];\n        }\n        setMaterialGloss(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_GLOSS_OFFSET] = value;\n        }\n        getMaterialRefractiveIndex(index) {\n            return this[HittableBufferData.SIZE * index + this.MATERIAL_REFRACTIVE_INDEX_OFFSET];\n        }\n        setMaterialRefractiveIndex(index, value) {\n            this[HittableBufferData.SIZE * index + this.MATERIAL_REFRACTIVE_INDEX_OFFSET] = value;\n        }\n        getMaterialColor(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.MATERIAL_COLOR_OFFSET;\n            value[0] = this[offset];\n            value[1] = this[offset + 1];\n            value[2] = this[offset + 2];\n        }\n        setMaterialColor(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.MATERIAL_COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSegmentColor(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SEGMENT_COLOR_OFFSET;\n            value[0] = this[offset];\n            value[1] = this[offset + 1];\n            value[2] = this[offset + 2];\n            value[3] = this[offset + 3];\n        }\n        setSegmentColor(index, value) {\n            const offset = HittableBufferData.SIZE * index + this.SEGMENT_COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n    }\n    HittableBufferData.SIZE = 208 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class ComputeUniformBufferData extends Float32Array {\n        constructor() {\n            super(ComputeUniformBufferData.SIZE);\n            this.POSITION_OFFSET = 0 / 4;\n            this.WIDTH_OFFSET = 12 / 4;\n            this.RIGHT_OFFSET = 16 / 4;\n            this.HEIGHT_OFFSET = 28 / 4;\n            this.UP_OFFSET = 32 / 4;\n            this.SEED_OFFSET = 44 / 4;\n            this.FORWARD_OFFSET = 48 / 4;\n            this.FOV_OFFSET = 60 / 4;\n            this.BACKGROUND_COLOR_OFFSET = 64 / 4;\n            this.TIME0_OFFSET = 76 / 4;\n            this.AMBIENT_COLOR_OFFSET = 80 / 4;\n            this.TIME1_OFFSET = 92 / 4;\n            this.TILES_X = 96 / 4;\n            this.TILES_Y = 100 / 4;\n            this.TILE_OFFSET_X = 104 / 4;\n            this.TILE_OFFSET_Y = 108 / 4;\n            this.LOOKAT_OFFSET = 112 / 4;\n            this.APERTURE_OFFSET = 124 / 4;\n            this.FOCUS_DISTANCE_OFFSET = 128 / 4;\n            this.RAYS_PER_FRAME_OFFSET = 132 / 4;\n        }\n        getFocusDistance() {\n            return this[this.FOCUS_DISTANCE_OFFSET];\n        }\n        setFocusDistance(value) {\n            this[this.FOCUS_DISTANCE_OFFSET] = value;\n        }\n        getWidth() {\n            return this[this.WIDTH_OFFSET];\n        }\n        setWidth(value) {\n            this[this.WIDTH_OFFSET] = value;\n        }\n        getHeight() {\n            return this[this.HEIGHT_OFFSET];\n        }\n        setHeight(value) {\n            this[this.HEIGHT_OFFSET] = value;\n        }\n        getSeed() {\n            return this[this.SEED_OFFSET];\n        }\n        setSeed(value) {\n            this[this.SEED_OFFSET] = value;\n        }\n        getRaysPerFrame() {\n            return this[this.RAYS_PER_FRAME_OFFSET];\n        }\n        setRaysPerFrame(value) {\n            this[this.RAYS_PER_FRAME_OFFSET] = value;\n        }\n        getFieldOfView() {\n            return this[this.FOV_OFFSET];\n        }\n        setFieldOfView(value) {\n            this[this.FOV_OFFSET] = value;\n        }\n        getAperture() {\n            return this[this.APERTURE_OFFSET];\n        }\n        setAperture(value) {\n            this[this.APERTURE_OFFSET] = value;\n        }\n        getPosition(value) {\n            set$3(value, this[this.POSITION_OFFSET], this[this.POSITION_OFFSET + 1], this[this.POSITION_OFFSET + 2]);\n        }\n        setPosition(value) {\n            this[this.POSITION_OFFSET] = value[0];\n            this[this.POSITION_OFFSET + 1] = value[1];\n            this[this.POSITION_OFFSET + 2] = value[2];\n        }\n        getRight(value) {\n            set$3(value, this[this.RIGHT_OFFSET], this[this.RIGHT_OFFSET + 1], this[this.RIGHT_OFFSET + 2]);\n        }\n        setRight(value) {\n            this[this.RIGHT_OFFSET] = value[0];\n            this[this.RIGHT_OFFSET + 1] = value[1];\n            this[this.RIGHT_OFFSET + 2] = value[2];\n        }\n        getUp(value) {\n            set$3(value, this[this.UP_OFFSET], this[this.UP_OFFSET + 1], this[this.UP_OFFSET + 2]);\n        }\n        setUp(value) {\n            this[this.UP_OFFSET] = value[0];\n            this[this.UP_OFFSET + 1] = value[1];\n            this[this.UP_OFFSET + 2] = value[2];\n        }\n        getForward(value) {\n            set$3(value, this[this.FORWARD_OFFSET], this[this.FORWARD_OFFSET + 1], this[this.FORWARD_OFFSET + 2]);\n        }\n        setForward(value) {\n            this[this.FORWARD_OFFSET] = value[0];\n            this[this.FORWARD_OFFSET + 1] = value[1];\n            this[this.FORWARD_OFFSET + 2] = value[2];\n        }\n        getBackgroundColor(value) {\n            set$2(value, this[this.BACKGROUND_COLOR_OFFSET], this[this.BACKGROUND_COLOR_OFFSET + 1], this[this.BACKGROUND_COLOR_OFFSET + 2], this[this.BACKGROUND_COLOR_OFFSET + 3]);\n        }\n        setBackgroundColor(value) {\n            this[this.BACKGROUND_COLOR_OFFSET] = value[0];\n            this[this.BACKGROUND_COLOR_OFFSET + 1] = value[1];\n            this[this.BACKGROUND_COLOR_OFFSET + 2] = value[2];\n            this[this.BACKGROUND_COLOR_OFFSET + 3] = value[3];\n        }\n        getAmbientColor(value) {\n            set$3(value, this[this.AMBIENT_COLOR_OFFSET], this[this.AMBIENT_COLOR_OFFSET + 1], this[this.AMBIENT_COLOR_OFFSET + 2]);\n        }\n        setAmbientColor(value) {\n            this[this.AMBIENT_COLOR_OFFSET] = value[0];\n            this[this.AMBIENT_COLOR_OFFSET + 1] = value[1];\n            this[this.AMBIENT_COLOR_OFFSET + 2] = value[2];\n        }\n        getTime0() {\n            return this[this.TIME0_OFFSET];\n        }\n        setTime0(value) {\n            this[this.TIME0_OFFSET] = value;\n        }\n        getTime1() {\n            return this[this.TIME1_OFFSET];\n        }\n        setTime1(value) {\n            this[this.TIME1_OFFSET] = value;\n        }\n        getTilesX() {\n            return this[this.TILES_X];\n        }\n        setTilesX(value) {\n            this[this.TILES_X] = value;\n        }\n        getTilesY() {\n            return this[this.TILES_Y];\n        }\n        setTilesY(value) {\n            this[this.TILES_Y] = value;\n        }\n        getTileOffsetX() {\n            return this[this.TILE_OFFSET_X];\n        }\n        setTileOffsetX(value) {\n            this[this.TILE_OFFSET_X] = value;\n        }\n        getTileOffsetY() {\n            return this[this.TILE_OFFSET_Y];\n        }\n        setTileOffsetY(value) {\n            this[this.TILE_OFFSET_Y] = value;\n        }\n        getLookAt(value) {\n            set$3(value, this[this.LOOKAT_OFFSET], this[this.LOOKAT_OFFSET + 1], this[this.LOOKAT_OFFSET + 2]);\n        }\n        setLookAt(value) {\n            this[this.LOOKAT_OFFSET] = value[0];\n            this[this.LOOKAT_OFFSET + 1] = value[1];\n            this[this.LOOKAT_OFFSET + 2] = value[2];\n        }\n    }\n    ComputeUniformBufferData.SIZE = 144 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class FullscreenQuadUniformBufferData extends Float32Array {\n        constructor() {\n            super(FullscreenQuadUniformBufferData.SIZE);\n            this.WIDTH_OFFSET = 0 / 4;\n            this.HEIGHT_OFFSET = 4 / 4;\n            this.SPP_OFFSET = 8 / 4;\n            this.EXPOSURE_OFFSET = 12 / 4;\n            this.MIN_DEPTH_OFFSET = 16 / 4;\n            this.MAX_DEPTH_OFFSET = 20 / 4;\n            this.EDGE_NORMAL_OFFSET = 24 / 4;\n            this.EDGE_DEPTH_OFFSET = 28 / 4;\n            this.EDGE_FOREGROUND_OFFSET = 32 / 4;\n            this.EDGE_BACKGROUND_OFFSET = 48 / 4;\n        }\n        getWidth() {\n            return this[this.WIDTH_OFFSET];\n        }\n        setWidth(value) {\n            this[this.WIDTH_OFFSET] = value;\n        }\n        getHeight() {\n            return this[this.HEIGHT_OFFSET];\n        }\n        setHeight(value) {\n            this[this.HEIGHT_OFFSET] = value;\n        }\n        getSamplesPerPixel() {\n            return this[this.SPP_OFFSET];\n        }\n        setSamplesPerPixel(value) {\n            this[this.SPP_OFFSET] = value;\n        }\n        getExposure() {\n            return this[this.EXPOSURE_OFFSET];\n        }\n        setExposure(value) {\n            this[this.EXPOSURE_OFFSET] = value;\n        }\n        getMinDepth() {\n            return this[this.MIN_DEPTH_OFFSET];\n        }\n        setMinDepth(value) {\n            this[this.MIN_DEPTH_OFFSET] = value;\n        }\n        getMaxDepth() {\n            return this[this.MAX_DEPTH_OFFSET];\n        }\n        setMaxDepth(value) {\n            this[this.MAX_DEPTH_OFFSET] = value;\n        }\n        getEdgeDepth() {\n            return this[this.EDGE_DEPTH_OFFSET];\n        }\n        setEdgeDepth(value) {\n            this[this.EDGE_DEPTH_OFFSET] = value;\n        }\n        getEdgeNormal() {\n            return this[this.EDGE_NORMAL_OFFSET];\n        }\n        setEdgeNormal(value) {\n            this[this.EDGE_NORMAL_OFFSET] = value;\n        }\n        getEdgeForeground(value) {\n            set$2(value, this[this.EDGE_FOREGROUND_OFFSET], this[this.EDGE_FOREGROUND_OFFSET + 1], this[this.EDGE_FOREGROUND_OFFSET + 2], this[this.EDGE_FOREGROUND_OFFSET + 3]);\n        }\n        setEdgeForeground(value) {\n            this[this.EDGE_FOREGROUND_OFFSET] = value[0];\n            this[this.EDGE_FOREGROUND_OFFSET + 1] = value[1];\n            this[this.EDGE_FOREGROUND_OFFSET + 2] = value[2];\n            this[this.EDGE_FOREGROUND_OFFSET + 3] = value[3];\n        }\n        getEdgeBackground(value) {\n            set$2(value, this[this.EDGE_BACKGROUND_OFFSET], this[this.EDGE_BACKGROUND_OFFSET + 1], this[this.EDGE_BACKGROUND_OFFSET + 2], this[this.EDGE_BACKGROUND_OFFSET + 3]);\n        }\n        setEdgeBackground(value) {\n            this[this.EDGE_BACKGROUND_OFFSET] = value[0];\n            this[this.EDGE_BACKGROUND_OFFSET + 1] = value[1];\n            this[this.EDGE_BACKGROUND_OFFSET + 2] = value[2];\n            this[this.EDGE_BACKGROUND_OFFSET + 3] = value[3];\n        }\n    }\n    FullscreenQuadUniformBufferData.SIZE = 64 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class LinearBVHNodeBufferData extends Float32Array {\n        constructor(count) {\n            super(count * LinearBVHNodeBufferData.SIZE);\n            this.CENTER_OFFSET = 0 / 4;\n            this.SIZE_OFFSET = 16 / 4;\n            this.PRIMITIVES_OFFSET_OFFSET = 12 / 4;\n            this.SECOND_CHILD_OFFSET_OFFSET = 28 / 4;\n            this.N_PRIMITIVES_OFFSET = 32 / 4;\n            this.AXIS_OFFSET = 36 / 4;\n        }\n        getCenter(index, value) {\n            const offset = LinearBVHNodeBufferData.SIZE * index + this.CENTER_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setCenter(index, value) {\n            const offset = LinearBVHNodeBufferData.SIZE * index + this.CENTER_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSize(index, value) {\n            const offset = LinearBVHNodeBufferData.SIZE * index + this.SIZE_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setSize(index, value) {\n            const offset = LinearBVHNodeBufferData.SIZE * index + this.SIZE_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getPrimitivesOffset(index) {\n            return this[LinearBVHNodeBufferData.SIZE * index + this.PRIMITIVES_OFFSET_OFFSET];\n        }\n        setPrimitivesOffset(index, value) {\n            this[LinearBVHNodeBufferData.SIZE * index + this.PRIMITIVES_OFFSET_OFFSET] = value;\n        }\n        getSecondChildOffset(index) {\n            return this[LinearBVHNodeBufferData.SIZE * index + this.SECOND_CHILD_OFFSET_OFFSET];\n        }\n        setSecondChildOffset(index, value) {\n            this[LinearBVHNodeBufferData.SIZE * index + this.SECOND_CHILD_OFFSET_OFFSET] = value;\n        }\n        getNPrimitives(index) {\n            return this[LinearBVHNodeBufferData.SIZE * index + this.N_PRIMITIVES_OFFSET];\n        }\n        setNPrimitives(index, value) {\n            this[LinearBVHNodeBufferData.SIZE * index + this.N_PRIMITIVES_OFFSET] = value;\n        }\n        getAxis(index) {\n            return this[LinearBVHNodeBufferData.SIZE * index + this.AXIS_OFFSET];\n        }\n        setAxis(index, value) {\n            this[LinearBVHNodeBufferData.SIZE * index + this.AXIS_OFFSET] = value;\n        }\n    }\n    LinearBVHNodeBufferData.SIZE = 48 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    class LightBufferData extends Float32Array {\n        constructor(count) {\n            super(count * LightBufferData.SIZE);\n            this.ROTATION_OFFSET = 0 / 4;\n            this.CENTER_OFFSET = 16 / 4;\n            this.TYPE_OFFSET = 28 / 4;\n            this.SIZE_OFFSET = 32 / 4;\n            this.COLOR_OFFSET = 48 / 4;\n        }\n        getType(index) {\n            return this[LightBufferData.SIZE * index + this.TYPE_OFFSET];\n        }\n        setType(index, value) {\n            this[LightBufferData.SIZE * index + this.TYPE_OFFSET] = value;\n        }\n        getCenter(index, value) {\n            const offset = LightBufferData.SIZE * index + this.CENTER_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setCenter(index, value) {\n            const offset = LightBufferData.SIZE * index + this.CENTER_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getSize(index, value) {\n            const offset = LightBufferData.SIZE * index + this.SIZE_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setSize(index, value) {\n            const offset = LightBufferData.SIZE * index + this.SIZE_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getColor(index, value) {\n            const offset = LightBufferData.SIZE * index + this.COLOR_OFFSET;\n            set$3(value, this[offset], this[offset + 1], this[offset + 2]);\n        }\n        setColor(index, value) {\n            const offset = LightBufferData.SIZE * index + this.COLOR_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n        }\n        getRotation(index, value) {\n            const offset = LightBufferData.SIZE * index + this.ROTATION_OFFSET;\n            set$1(value, this[offset], this[offset + 1], this[offset + 2], this[offset + 3]);\n        }\n        setRotation(index, value) {\n            const offset = LightBufferData.SIZE * index + this.ROTATION_OFFSET;\n            this[offset] = value[0];\n            this[offset + 1] = value[1];\n            this[offset + 2] = value[2];\n            this[offset + 3] = value[3];\n        }\n    }\n    LightBufferData.SIZE = 64 / 4;\n\n    /*!\n     * Copyright (c) Microsoft Corporation.\n     * Licensed under the MIT License.\n     */\n    (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n        return new (P || (P = Promise))(function (resolve, reject) {\n            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n            function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n            step((generator = generator.apply(thisArg, _arguments || [])).next());\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * This file is for external facing export only, do not use this for internal references,\n     * as it may cause circular dependencies in Rollup.\n     */\n\n    var types = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        MorphChartsCore: Core\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function concat(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []);\n    }\n    /**\n     * Returns array with items which are truthy.\n     * @param args array or arrays to concat into a single array.\n     */\n    function allTruthy(...args) {\n        return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n    }\n    /**\n     * Add an array to an existing array in place.\n     * @param arr Array to append to.\n     * @param items Arrof of items to append.\n     */\n    function push(arr, items) {\n        arr.push.apply(arr, items);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Create a new element as a child of another element.\n     * @param tagName Tag name of the new tag to create.\n     * @param parentElement Reference of the element to append to.\n     * @returns new HTMLElement.\n     */\n    function addEl(tagName, parentElement) {\n        const el = document.createElement(tagName);\n        parentElement.appendChild(el);\n        return el;\n    }\n    /**\n     * Create a new div HTMLElement as a child of another element.\n     * @param parentElement Reference of the element to append to.\n     * @param className Optional css class name to apply to the div.\n     */\n    function addDiv(parentElement, className) {\n        const div = addEl('div', parentElement);\n        if (className) {\n            div.className = className;\n        }\n        return div;\n    }\n    /**\n     * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n     * @param el HTML Element to measure.\n     */\n    function outerSize(el) {\n        const cs = getComputedStyle(el);\n        const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n        const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n        return { height, width };\n    }\n\n    var isMergeableObject = function isMergeableObject(value) {\n    \treturn isNonNullObject(value)\n    \t\t&& !isSpecial(value)\n    };\n\n    function isNonNullObject(value) {\n    \treturn !!value && typeof value === 'object'\n    }\n\n    function isSpecial(value) {\n    \tvar stringValue = Object.prototype.toString.call(value);\n\n    \treturn stringValue === '[object RegExp]'\n    \t\t|| stringValue === '[object Date]'\n    \t\t|| isReactElement(value)\n    }\n\n    // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n    var canUseSymbol = typeof Symbol === 'function' && Symbol.for;\n    var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\n    function isReactElement(value) {\n    \treturn value.$$typeof === REACT_ELEMENT_TYPE\n    }\n\n    function emptyTarget(val) {\n    \treturn Array.isArray(val) ? [] : {}\n    }\n\n    function cloneUnlessOtherwiseSpecified(value, options) {\n    \treturn (options.clone !== false && options.isMergeableObject(value))\n    \t\t? deepmerge$1(emptyTarget(value), value, options)\n    \t\t: value\n    }\n\n    function defaultArrayMerge(target, source, options) {\n    \treturn target.concat(source).map(function(element) {\n    \t\treturn cloneUnlessOtherwiseSpecified(element, options)\n    \t})\n    }\n\n    function mergeObject(target, source, options) {\n    \tvar destination = {};\n    \tif (options.isMergeableObject(target)) {\n    \t\tObject.keys(target).forEach(function(key) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    \t\t});\n    \t}\n    \tObject.keys(source).forEach(function(key) {\n    \t\tif (!options.isMergeableObject(source[key]) || !target[key]) {\n    \t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    \t\t} else {\n    \t\t\tdestination[key] = deepmerge$1(target[key], source[key], options);\n    \t\t}\n    \t});\n    \treturn destination\n    }\n\n    function deepmerge$1(target, source, options) {\n    \toptions = options || {};\n    \toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    \toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\n    \tvar sourceIsArray = Array.isArray(source);\n    \tvar targetIsArray = Array.isArray(target);\n    \tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n    \tif (!sourceAndTargetTypesMatch) {\n    \t\treturn cloneUnlessOtherwiseSpecified(source, options)\n    \t} else if (sourceIsArray) {\n    \t\treturn options.arrayMerge(target, source, options)\n    \t} else {\n    \t\treturn mergeObject(target, source, options)\n    \t}\n    }\n\n    deepmerge$1.all = function deepmergeAll(array, options) {\n    \tif (!Array.isArray(array)) {\n    \t\tthrow new Error('first argument should be an array')\n    \t}\n\n    \treturn array.reduce(function(prev, next) {\n    \t\treturn deepmerge$1(prev, next, options)\n    \t}, {})\n    };\n\n    var deepmerge_1 = deepmerge$1;\n\n    var _deepmerge = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        default: deepmerge_1\n    });\n\n    /*!\n     * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n     *\n     * Copyright (c) 2014-2017, Jon Schlinkert.\n     * Released under the MIT License.\n     */\n\n    function isObject(o) {\n      return Object.prototype.toString.call(o) === '[object Object]';\n    }\n\n    function isPlainObject(o) {\n      var ctor,prot;\n\n      if (isObject(o) === false) return false;\n\n      // If has modified constructor\n      ctor = o.constructor;\n      if (ctor === undefined) return true;\n\n      // If has modified prototype\n      prot = ctor.prototype;\n      if (isObject(prot) === false) return false;\n\n      // If constructor does not have an Object-specific method\n      if (prot.hasOwnProperty('isPrototypeOf') === false) {\n        return false;\n      }\n\n      // Most likely a plain Object\n      return true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const deepmerge = (deepmerge_1 || _deepmerge);\n    function clone(objectToClone) {\n        if (!objectToClone)\n            return objectToClone;\n        return deepmerge.all([objectToClone]);\n    }\n    const dontMerge = (destination, source) => source;\n    function deepMerge(...objectsToMerge) {\n        const objects = objectsToMerge.filter(Boolean);\n        return deepmerge.all(objects, { arrayMerge: dontMerge, isMergeableObject: isPlainObject });\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n        reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n        reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n        reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n        reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n        reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color, color, {\n      copy(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHex8: color_formatHex8,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHex8() {\n      return this.rgb().formatHex8();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb, extend(Color, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb() {\n        return this;\n      },\n      clamp() {\n        return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n      },\n      displayable() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatHex8: rgb_formatHex8,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n    }\n\n    function rgb_formatHex8() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n    }\n\n    function rgb_formatRgb() {\n      const a = clampa(this.opacity);\n      return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n    }\n\n    function clampa(opacity) {\n      return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n    }\n\n    function clampi(value) {\n      return Math.max(0, Math.min(255, Math.round(value) || 0));\n    }\n\n    function hex(value) {\n      value = clampi(value);\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      clamp() {\n        return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n      },\n      displayable() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl() {\n        const a = clampa(this.opacity);\n        return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n      }\n    }));\n\n    function clamph(value) {\n      value = (value || 0) % 360;\n      return value < 0 ? value + 360 : value;\n    }\n\n    function clampt(value) {\n      return Math.max(0, Math.min(1, value || 0));\n    }\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function rgbToDeckglColor(c) {\n        return [c.r, c.g, c.b, c.opacity * 255];\n    }\n    /**\n     * Compares 2 colors to see if they are equal.\n     * @param a RGBAColor to compare\n     * @param b RGBAColor to compare\n     * @returns True if colors are equal.\n     */\n    function colorIsEqual(a, b) {\n        if (a.length !== b.length)\n            return false;\n        for (let i = 0; i < a.length; i++) {\n            if (a[i] !== b[i])\n                return false;\n        }\n        return true;\n    }\n    /**\n     * Convert a CSS color string to a Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n     * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n     */\n    function colorFromString(cssColorSpecifier) {\n        if (cssColorSpecifier) {\n            const dc = color(cssColorSpecifier);\n            if (dc) {\n                const c = dc.rgb();\n                return rgbToDeckglColor(c);\n            }\n        }\n    }\n    /**\n     * Convert a Deck.gl color to a CSS rgba() string.\n     * @param color A Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n     */\n    function colorToString(color) {\n        const c = [...color];\n        if (c.length > 3) {\n            c[3] /= 255;\n        }\n        return `rgba(${c.join(',')})`;\n    }\n    function desaturate(color, value) {\n        const rgb$1 = rgb(color[0], color[1], color[2], color[3] / 255);\n        const hslColor = hsl(rgb$1);\n        hslColor.s = value;\n        const c = hslColor.rgb();\n        return rgbToDeckglColor(c);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * This file is for external facing export only, do not use this for internal references,\n     * as it may cause circular dependencies in Rollup.\n     */\n\n    var util = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        addDiv: addDiv,\n        addEl: addEl,\n        allTruthy: allTruthy,\n        clone: clone,\n        colorFromString: colorFromString,\n        colorIsEqual: colorIsEqual,\n        colorToString: colorToString,\n        concat: concat,\n        createElement: createElement,\n        deepMerge: deepMerge,\n        desaturate: desaturate,\n        getActiveElementInfo: getActiveElementInfo,\n        mount: mount,\n        outerSize: outerSize,\n        push: push,\n        setActiveElement: setActiveElement\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const minHeight = '100px';\n    const minWidth = '100px';\n    const defaultPresenterStyle = {\n        cssPrefix: 'vega-morphcharts-',\n        defaultCubeColor: [128, 128, 128, 255],\n        highlightColor: [0, 0, 0, 255],\n    };\n    const defaultPresenterConfig = {\n        onCubeClick: (e, cube) => { },\n        onCubeHover: (e, cube) => { },\n        transitionDurations: {\n            position: 600,\n            stagger: 600,\n            view: 600,\n        },\n        renderer: {\n            advanced: false,\n            advancedOptions: {},\n            basicOptions: {\n                antialias: true,\n            },\n        },\n    };\n    function createStage(view) {\n        const stage = {\n            view,\n            cubeData: [],\n            pathData: [],\n            axes: {\n                x: [],\n                y: [],\n                z: [],\n            },\n            gridLines: [],\n            textData: [],\n            legend: {\n                rows: {},\n            },\n            facets: [],\n        };\n        return stage;\n    }\n    const groupStrokeWidth = 1;\n    const lineZ = 0;\n    const defaultView = '2d';\n    const minZ = 0.5;\n    const min3dDepth = 0.05;\n    const minPixelSize = 0.5;\n    const zAxisEncodeColor = [7, 7, 7, 255];\n    const zAxisOutColor = [0, 0, 0, 255];\n    function defaultOnAxisItem(vegaItem, stageItem, stage, currAxis) {\n        if (colorIsEqual(stageItem.color, zAxisEncodeColor)) {\n            stageItem.color = zAxisOutColor;\n            if (currAxis.axisRole !== 'z') {\n                const previousAxisRole = removeCurrentAxes(stage, currAxis);\n                if (previousAxisRole) {\n                    currAxis.axisRole = 'z';\n                    stage.axes.z.push(currAxis);\n                }\n            }\n        }\n    }\n    function removeCurrentAxes(stage, currAxis) {\n        //find the current axis, remove it from parent\n        for (const axisRole in stage.axes) {\n            const axes = stage.axes[axisRole];\n            for (let i = 0; i < axes.length; i++) {\n                if (axes[i] === currAxis) {\n                    axes.splice(i, 1);\n                    return axisRole;\n                }\n            }\n        }\n    }\n\n    var defaults = /*#__PURE__*/Object.freeze({\n        __proto__: null,\n        createStage: createStage,\n        defaultOnAxisItem: defaultOnAxisItem,\n        defaultPresenterConfig: defaultPresenterConfig,\n        defaultPresenterStyle: defaultPresenterStyle,\n        defaultView: defaultView,\n        groupStrokeWidth: groupStrokeWidth,\n        lineZ: lineZ,\n        min3dDepth: min3dDepth,\n        minHeight: minHeight,\n        minPixelSize: minPixelSize,\n        minWidth: minWidth,\n        minZ: minZ\n    });\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const vega = {\n        CanvasHandler: null,\n        inferType: null,\n        inferTypes: null,\n        loader: null,\n        parse: null,\n        read: null,\n        renderModule: null,\n        Renderer: null,\n        sceneVisit: null,\n        scheme: null,\n        truncate: null,\n        View: null,\n    };\n    /**\n     * References to dependency libraries.\n     */\n    const base = {\n        vega,\n    };\n    /**\n     * Specify the dependency libraries to use for rendering.\n     * @param vega Vega library.\n     */\n    function use(vega) {\n        base.vega = vega;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * HTML elements outputted by the presenter.\n     */\n    exports.PresenterElement = void 0;\n    (function (PresenterElement) {\n        PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n        PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n        PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n        PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n        PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n    })(exports.PresenterElement || (exports.PresenterElement = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const LegendView = (props) => {\n        const rows = [];\n        const addRow = (row, i) => {\n            const fn = symbolMap[row.symbol.shape];\n            let jsx;\n            if (fn) {\n                jsx = fn(row.symbol);\n            }\n            else {\n                jsx = createElement(\"span\", null, \"x\");\n                //console.log(`need to render ${row.symbol.shape} symbol shape`);\n            }\n            rows.push({\n                cells: [\n                    { className: 'symbol', content: jsx },\n                    { className: 'label', content: row.label, title: row.label },\n                ],\n            });\n        };\n        const sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n        sorted.forEach(i => addRow(props.legend.rows[i]));\n        if (sorted.length) {\n            return (createElement(Table, { rows: rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\"tr\", { onClick: e => props.onClick(e, props.legend, null) },\n                createElement(\"th\", { colSpan: 2 }, props.legend.title))));\n        }\n    };\n    const symbolMap = {\n        square: function (symbol) {\n            return (createElement(\"div\", { style: {\n                    height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                    width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                    backgroundColor: symbol.fill,\n                    borderColor: symbol.fill,\n                } }));\n        },\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function initializePanel(presenter) {\n        const rootDiv = (createElement(\"div\", { className: className(exports.PresenterElement.root, presenter) },\n            createElement(\"div\", { className: className(exports.PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n            createElement(\"div\", { className: className(exports.PresenterElement.panel, presenter) },\n                createElement(\"div\", { className: className(exports.PresenterElement.vegaControls, presenter) }),\n                createElement(\"div\", { className: className(exports.PresenterElement.legend, presenter) }))));\n        mount(rootDiv, presenter.el);\n    }\n    function className(type, presenter) {\n        return `${presenter.style.cssPrefix}${exports.PresenterElement[type]}`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function patchCubeArray(allocatedSize, empty, cubes) {\n        const patched = new Array(allocatedSize);\n        patched.fill(empty);\n        cubes.forEach(cube => patched[cube.ordinal] = cube);\n        return patched;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const legendMap = {\n        'legend-title': function (legend, textItem) {\n            legend.title = textItem.text;\n        },\n        'legend-symbol': function (legend, symbol) {\n            const { bounds, fill, shape } = symbol;\n            //this object is safe for serialization\n            const legendRowSymbol = { bounds, fill, shape };\n            const i = symbol.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            legend.rows[i].symbol = legendRowSymbol;\n        },\n        'legend-label': function (legend, label) {\n            const i = label.datum.index;\n            legend.rows[i] = legend.rows[i] || {};\n            const row = legend.rows[i];\n            row.label = label.text;\n            row.value = label.datum.value;\n        },\n    };\n    const markStager$5 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const fn = legendMap[item.mark.role];\n            if (fn) {\n                fn(stage.legend, item);\n            }\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$4 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const { bounds, height, url, width } = item;\n            let { x1, x2, y1, y2 } = bounds;\n            x1 += x;\n            x2 += x;\n            y1 += y;\n            y2 += y;\n            if (!stage.backgroundImages) {\n                stage.backgroundImages = [];\n            }\n            stage.backgroundImages.push({ bounds: { x1, x2, y1, y2 }, height, url, width });\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$3 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const noZ = item.z === undefined;\n            const z = noZ ? 0 : (item.z || 0) + minZ;\n            const depth = (noZ ? 0 : (item.depth || 0)) + min3dDepth;\n            //change direction of y from SVG to GL\n            const ty = -1;\n            const ordinal = options.assignCubeOrdinal(item.datum);\n            if (ordinal > options.maxOrdinal) {\n                options.maxOrdinal = ordinal;\n            }\n            if (ordinal === undefined) ;\n            else {\n                const cube = {\n                    ordinal,\n                    size: [item.width, item.height, depth],\n                    position: [x + ((+item.x) || 0), ty * (y + ((+item.y) || 0)) - (+item.height), z],\n                    color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128],\n                };\n                cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n                stage.cubeData.push(cube);\n            }\n        });\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const markStager$2 = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (item) {\n            const x1 = item.x || 0;\n            const y1 = item.y || 0;\n            const x2 = item.x2 != null ? item.x2 : x1;\n            const y2 = item.y2 != null ? item.y2 : y1;\n            const lineItem = styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n            const { currAxis } = options;\n            if (options.modifyAxis) {\n                options.modifyAxis(item, lineItem, stage, currAxis);\n            }\n            if (item.mark.role === 'axis-tick') {\n                currAxis.ticks.push(lineItem);\n            }\n            else if (item.mark.role === 'axis-domain') {\n                currAxis.domain = lineItem;\n            }\n            else {\n                stage.gridLines.push(lineItem);\n            }\n        });\n    };\n    function styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n        const line = {\n            sourcePosition: [x1, -y1, lineZ], //-1 = change direction of y from SVG to GL\n            targetPosition: [x2, -y2, lineZ],\n            color: colorFromString(stroke),\n            strokeWidth: strokeWidth,\n        };\n        return line;\n    }\n    function box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n        const lines = [\n            styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n            styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n            styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n            styledLine(gx, gy + height, gx, gy, stroke, strokeWidth),\n        ];\n        if (diagonals) {\n            lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n            lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n        }\n        return lines;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //change direction of y from SVG to GL\n    const ty = -1;\n    const markStager$1 = (options, stage, scene, x, y, groupType) => {\n        const g = Object.assign({ opacity: 1, strokeOpacity: 1, strokeWidth: 1 }, scene.items[0]);\n        const path = {\n            strokeWidth: g.strokeWidth,\n            strokeColor: colorFromString(g.stroke),\n            positions: scene.items.map((it) => [\n                it.x,\n                ty * it.y,\n                it.z || 0,\n            ]),\n        };\n        path.strokeColor[3] *= g.strokeOpacity;\n        path.strokeColor[3] *= g.opacity;\n        stage.pathData.push(path);\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    // import { AlignmentBaseline, TextAnchor } from '@deck.gl/layers/text-layer/text-layer';\n    const markStager = (options, stage, scene, x, y, groupType) => {\n        //change direction of y from SVG to GL\n        const ty = -1;\n        base.vega.sceneVisit(scene, function (item) {\n            if (!item.text)\n                return;\n            const size = item.fontSize;\n            //const alignmentBaseline = convertBaseline(item.baseline);\n            //const yOffset = alignmentBaseline === 'top' ? item.fontSize / 2 : 0;    //fixup to get tick text correct\n            const yOffset = 0;\n            const textItem = {\n                color: colorFromString(item.fill),\n                text: item.limit === undefined ? item.text : base.vega.truncate(item.text, item.limit, 'right', item.ellipsis || '...'), //use dots instead of unicode ellipsis for\n                position: [x + (item.x || 0), ty * (y + (item.y || 0) + yOffset), 0],\n                size,\n                angle: convertAngle(item.angle),\n                //textAnchor: convertAlignment(item.align),\n                //alignmentBaseline,\n                metaData: item.metaData,\n            };\n            const { currAxis } = options;\n            if (options.modifyAxis) {\n                options.modifyAxis(item, textItem, stage, currAxis);\n            }\n            if (item.mark.role === 'axis-label') {\n                const tickText = textItem;\n                tickText.value = item.datum.value;\n                currAxis.tickText.push(tickText);\n            }\n            else if (item.mark.role === 'axis-title') {\n                currAxis.title = textItem;\n            }\n            else {\n                stage.textData.push(textItem);\n            }\n        });\n    };\n    function convertAngle(vegaTextAngle) {\n        if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n            return 360 - vegaTextAngle;\n        }\n        return 0;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    var GroupType;\n    (function (GroupType) {\n        GroupType[GroupType[\"none\"] = 0] = \"none\";\n        GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n        GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n        GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n        GroupType[GroupType[\"zAxis\"] = 4] = \"zAxis\";\n    })(GroupType || (GroupType = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getAxisGroupType(item, options) {\n        const axisItem = item;\n        const axisMark = axisItem === null || axisItem === void 0 ? void 0 : axisItem.mark;\n        if ((axisMark === null || axisMark === void 0 ? void 0 : axisMark.zindex) === options.zAxisZindex && options.zAxisZindex !== undefined) {\n            return GroupType.zAxis;\n        }\n        switch (axisItem.orient) {\n            case 'bottom':\n            case 'top':\n                return GroupType.xAxis;\n            case 'left':\n            case 'right':\n                return GroupType.yAxis;\n        }\n    }\n    function convertGroupRole(item, options) {\n        if (item.mark.role === 'legend')\n            return GroupType.legend;\n        if (item.mark.role === 'axis') {\n            const groupType = getAxisGroupType(item, options);\n            if (groupType !== undefined) {\n                return groupType;\n            }\n        }\n    }\n    const group = (options, stage, scene, x, y, groupType) => {\n        base.vega.sceneVisit(scene, function (g) {\n            const gx = g.x || 0, gy = g.y || 0;\n            if (g.context && g.context.background && !stage.backgroundColor) {\n                stage.backgroundColor = colorFromString(g.context.background);\n            }\n            if (g.stroke) {\n                const facetRect = {\n                    datum: g.datum,\n                    lines: box(gx + x, gy + y, g.height, g.width, g.stroke, groupStrokeWidth),\n                };\n                stage.facets.push(facetRect);\n            }\n            groupType = convertGroupRole(g, options) || groupType;\n            setCurrentAxis(options, stage, groupType);\n            // draw group contents\n            base.vega.sceneVisit(g, function (item) {\n                mainStager(options, stage, item, gx + x, gy + y, groupType);\n            });\n        });\n    };\n    function setCurrentAxis(options, stage, groupType) {\n        let axisRole;\n        switch (groupType) {\n            case GroupType.xAxis:\n                axisRole = 'x';\n                break;\n            case GroupType.yAxis:\n                axisRole = 'y';\n                break;\n            case GroupType.zAxis:\n                axisRole = 'z';\n                break;\n            default:\n                return;\n        }\n        options.currAxis = {\n            axisRole,\n            domain: null,\n            tickText: [],\n            ticks: [],\n        };\n        stage.axes[axisRole].push(options.currAxis);\n    }\n    const markStagers = {\n        group,\n        legend: markStager$5,\n        image: markStager$4,\n        rect: markStager$3,\n        rule: markStager$2,\n        line: markStager$1,\n        text: markStager,\n    };\n    const mainStager = (options, stage, scene, x, y, groupType) => {\n        if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n            markStager$5(options, stage, scene);\n        }\n        else {\n            const markStager = markStagers[scene.marktype];\n            if (markStager) {\n                markStager(options, stage, scene, x, y, groupType);\n            }\n        }\n    };\n    function sceneToStage(options, stage, scene) {\n        mainStager(options, stage, scene, 0, 0, null);\n        sortAxis(stage.axes.x, 0);\n        sortAxis(stage.axes.y, 1);\n        sortAxis(stage.axes.z, 1);\n    }\n    function sortAxis(axes, dim) {\n        axes.forEach(axis => {\n            if (axis.domain)\n                orderDomain(axis.domain, dim);\n            axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n            axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n        });\n    }\n    function orderDomain(domain, dim) {\n        if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n            const temp = domain.targetPosition;\n            domain.targetPosition = domain.sourcePosition;\n            domain.sourcePosition = temp;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function outerBounds(b1, b2) {\n        if (!b1 && !b2)\n            return;\n        if (!b1)\n            return b2;\n        if (!b2)\n            return b1;\n        const minProps = [\n            'minBoundsX',\n            'minBoundsY',\n            'minBoundsZ',\n        ];\n        const maxProps = [\n            'maxBoundsX',\n            'maxBoundsY',\n            'maxBoundsZ',\n        ];\n        const result = {};\n        minProps.forEach(p => result[p] = notNull(Math.min, b1[p], b2[p]));\n        maxProps.forEach(p => result[p] = notNull(Math.max, b1[p], b2[p]));\n        return result;\n    }\n    function notNull(fn, v1, v2) {\n        if (v1 == null && v2 == null)\n            return null;\n        if (v1 == null)\n            return v2;\n        if (v2 == null)\n            return v1;\n        return fn(v1, v2);\n    }\n    function increment(b, minBoundsX, minBoundsY, minBoundsZ, maxBoundsX, maxBoundsY, maxBoundsZ) {\n        return outerBounds(b, {\n            minBoundsX,\n            minBoundsY,\n            minBoundsZ,\n            maxBoundsX,\n            maxBoundsY,\n            maxBoundsZ,\n        });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const createAxesLayer = (props) => {\n        const { config, height, ref, stage } = props;\n        const { core } = ref;\n        const { renderer } = core;\n        const { x, y, z } = stage.axes;\n        const xyz = [...x, ...y, ...z];\n        renderer.currentAxes = [];\n        if (!xyz.length) {\n            renderer.axesVisibility = AxesVisibility.none;\n            return;\n        }\n        renderer.axesVisibility = AxesVisibility.current;\n        const correlation = new AxesCorrelation(stage, 3);\n        const { axesSets, labels } = correlation;\n        const grid = correlation.getGrid();\n        if (grid.byColumn[0]) {\n            grid.byColumn[0].forEach(row => { row.axesSet.showFacetTitleY = true; });\n            grid.byRow[0].forEach(col => { col.axesSet.showFacetTitleX = true; });\n        }\n        if (grid.rows > 1) {\n            const { byRow } = grid;\n            byRow[0].forEach(({ axesSet }, col) => {\n                if (!axesSet.y) {\n                    if (byRow[1][col].axesSet) {\n                        //move x up\n                        byRow[1][col].axesSet.x.tickText = axesSet.x.tickText;\n                        byRow[1][col].axesSet.showFacetTitleX = axesSet.showFacetTitleX;\n                        delete axesSet.x;\n                    }\n                }\n            });\n        }\n        let bounds;\n        const allAxesSetBounds = [];\n        let anyZ = false;\n        for (let i = 0; i < axesSets.length; i++) {\n            if (axesSets[i].z) {\n                anyZ = true;\n                break;\n            }\n        }\n        const is3d = stage.view === '3d' && anyZ;\n        axesSets.forEach(axesSet => {\n            if (!axesSet.x && !axesSet.y)\n                return;\n            const axesSetBounds = {\n                axesSet,\n                maxBoundsX: null,\n                maxBoundsY: null,\n                maxBoundsZ: null,\n                minBoundsX: null,\n                minBoundsY: null,\n                minBoundsZ: null,\n            };\n            if (is3d) {\n                const zBounds = getDomainBounds(1, axesSet.z);\n                axesSetBounds.minBoundsZ = -zBounds.maxBounds;\n                axesSetBounds.maxBoundsZ = -zBounds.minBounds;\n            }\n            const yBounds = getDomainBounds(1, axesSet.y);\n            axesSetBounds.minBoundsY = yBounds.minBounds;\n            axesSetBounds.maxBoundsY = yBounds.maxBounds;\n            axesSetBounds.y = yBounds.minBounds;\n            axesSetBounds.h = yBounds.maxBounds - yBounds.minBounds;\n            const xBounds = getDomainBounds(0, axesSet.x);\n            axesSetBounds.minBoundsX = xBounds.minBounds;\n            axesSetBounds.maxBoundsX = xBounds.maxBounds;\n            axesSetBounds.x = xBounds.minBounds;\n            axesSetBounds.w = xBounds.maxBounds - xBounds.minBounds;\n            allAxesSetBounds.push(axesSetBounds);\n            bounds = outerBounds(bounds, axesSetBounds);\n        });\n        const facetLabelX = labels.filter(label => label.axisRole === 'x')[0];\n        const facetLabelY = labels.filter(label => label.axisRole === 'y')[0];\n        core.inputManager.pickAxesTitleCallback = ({ axis, axes, manipulator }) => {\n            const axesSet = axesSets[axes];\n            let a;\n            let f;\n            switch (axis) {\n                case 0: {\n                    a = axesSet.x;\n                    f = facetLabelX;\n                    break;\n                }\n                case 1: {\n                    a = axesSet.y;\n                    f = facetLabelY;\n                    break;\n                }\n                case 2: {\n                    a = axesSet.z;\n                    break;\n                }\n            }\n            if (a) {\n                config.onTextClick(manipulator.event, a.title || f.title);\n            }\n        };\n        allAxesSetBounds.forEach(axesSetBounds => {\n            const { axesSet } = axesSetBounds;\n            if (!axesSet.x && !axesSet.y)\n                return;\n            const cartesian = new (is3d ? Cartesian3dAxes : Cartesian2dAxes)(core);\n            cartesian.isDivisionPickingEnabled = [false, false, false];\n            cartesian.arePickDivisionsVisible = [false, false, false];\n            cartesian.isLabelPickingEnabled = [false, false, false];\n            cartesian.isTitlePickingEnabled = [false, false, false];\n            cartesian.isGridPickingEnabled = false;\n            cartesian.isHeadingPickingEnabled = [false, false, false];\n            createAxes(cartesian, 0, 0, axesSet.x, AxesTextOrientation.perpendicular, height, props, axesSet.showFacetTitleX && facetLabelX);\n            createAxes(cartesian, 1, 1, axesSet.y, AxesTextOrientation.perpendicular, height, props, axesSet.showFacetTitleY && facetLabelY);\n            if (is3d) {\n                createAxes(cartesian, 1, 2, axesSet.z, AxesTextOrientation.perpendicular, height, props);\n            }\n            configCartesianAxes(is3d, bounds, cartesian);\n            const { maxBoundsX, maxBoundsY, minBoundsX, minBoundsY, } = bounds;\n            const w = maxBoundsX - minBoundsX;\n            const h = maxBoundsY - minBoundsY;\n            cartesian.scalingX = axesSetBounds.w / w;\n            cartesian.scalingY = axesSetBounds.h / h;\n            cartesian.offsetX = ((axesSetBounds.x - minBoundsX + axesSetBounds.w / 2) / w) - 0.5;\n            cartesian.offsetY = ((axesSetBounds.y - minBoundsY + axesSetBounds.h / 2) / h) - 0.5;\n            const aspect = (h / w);\n            if (aspect > 1) {\n                cartesian.offsetX /= aspect;\n            }\n            else {\n                cartesian.offsetY *= aspect;\n            }\n            const axes = is3d ? renderer.createCartesian3dAxesVisual(cartesian) : renderer.createCartesian2dAxesVisual(cartesian);\n            renderer.currentAxes.push(axes);\n            props.config.onAxesComplete && props.config.onAxesComplete(cartesian);\n        });\n        return { bounds };\n    };\n    const nullDomain = {\n        sourcePosition: [0, 0, 0],\n        targetPosition: [0, 0, 0],\n    };\n    class AxesCorrelation {\n        constructor(stage, dimensions) {\n            this.dimensions = dimensions;\n            const { x, y, z } = stage.axes;\n            this.axesSets = [];\n            this.labels = [];\n            [x, y, z].forEach(axes => {\n                axes.forEach(axis => {\n                    if (this.axesSets.length === 0) {\n                        this.initialize(axis);\n                    }\n                    else {\n                        this.correlate(axis);\n                    }\n                });\n            });\n        }\n        getGrid() {\n            const mapCols = {};\n            const mapRows = {};\n            this.axesSets.forEach(axesSet => {\n                var _a;\n                const domain = (_a = axesSet === null || axesSet === void 0 ? void 0 : axesSet.x) === null || _a === void 0 ? void 0 : _a.domain;\n                if (!domain)\n                    return;\n                const col = domain.sourcePosition[0].toString();\n                const row = domain.sourcePosition[1].toString();\n                if (!mapCols[col]) {\n                    mapCols[col] = {};\n                }\n                mapCols[col][row] = axesSet;\n                mapRows[row] = null;\n            });\n            const colKeys = Object.keys(mapCols).sort((a, b) => +a - +b);\n            const rowKeys = Object.keys(mapRows).sort((a, b) => +a - +b);\n            return {\n                cols: colKeys.length,\n                rows: rowKeys.length,\n                byColumn: colKeys.map(colKey => rowKeys.map(rowKey => { return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] }; })),\n                byRow: rowKeys.map(rowKey => colKeys.map(colKey => { return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] }; })),\n            };\n        }\n        initialize(axis) {\n            if (!axis.domain) {\n                this.labels.push(axis);\n                return;\n            }\n            const axesSet = {};\n            axesSet[axis.axisRole] = axis;\n            this.axesSets.push(axesSet);\n        }\n        correlate(axis) {\n            if (!axis.domain) {\n                this.labels.push(axis);\n                return;\n            }\n            for (let i = 0; i < this.axesSets.length; i++) {\n                const axesSet = this.axesSets[i];\n                for (const axisRole in axesSet) {\n                    const test = axesSet[axisRole];\n                    if (this.matchDomains(axis.domain, test.domain)) {\n                        //prefer the axes with titles\n                        if (!axesSet[axis.axisRole] || (!axesSet[axis.axisRole].tickText.length && axis.tickText.length)) {\n                            axesSet[axis.axisRole] = axis;\n                        }\n                        return;\n                    }\n                }\n            }\n            this.initialize(axis);\n        }\n        matchDomains(a, b) {\n            if (this.matchPoint(a.sourcePosition, b.sourcePosition))\n                return true;\n            if (this.matchPoint(a.sourcePosition, b.targetPosition))\n                return true;\n            if (this.matchPoint(a.targetPosition, b.targetPosition))\n                return true;\n            if (this.matchPoint(a.targetPosition, b.sourcePosition))\n                return true;\n            return false;\n        }\n        matchPoint(a, b) {\n            for (let i = 0; i < this.dimensions; i++) {\n                if (a[i] !== b[i])\n                    return false;\n            }\n            return true;\n        }\n    }\n    function createAxes(cartesian, dim2d, dim3d, axis, orientation, height, props, facetLabel) {\n        const domain = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n        const { tickPositions, tickText, textPos, textSize } = convertAxis(axis, domain, dim2d, height);\n        if (axis.axisRole === 'z') {\n            tickPositions.forEach((t, i) => tickPositions[i] = 1 - t);\n            textPos.forEach((t, i) => textPos[i] = 1 - t);\n            tickText.reverse();\n            tickPositions.reverse();\n            textPos.reverse();\n        }\n        cartesian.setTickPositions(dim3d, tickPositions);\n        cartesian.zero[dim3d] = 0; //TODO get any \"zero\" gridline position from vega\n        cartesian.setLabelPositions(dim3d, textPos);\n        cartesian.setLabels(dim3d, tickText);\n        cartesian.setLabelSizes(dim3d, textSize);\n        const title = (axis === null || axis === void 0 ? void 0 : axis.title) || (facetLabel === null || facetLabel === void 0 ? void 0 : facetLabel.title);\n        if (title === null || title === void 0 ? void 0 : title.text) {\n            cartesian.setTitle(dim3d, title.text);\n            cartesian.setTitleSize(dim3d, title.size / height);\n        }\n        cartesian.setLabelOrientation(dim3d, orientation);\n        props.config.onAxisConfig && props.config.onAxisConfig(cartesian, dim3d, axis);\n        return {\n            tickText,\n        };\n    }\n    function configCartesianAxes(is3d, bounds, cartesian) {\n        if (is3d) {\n            cartesian.isEdgeVisible[Edge3D.topBack] = false;\n        }\n        cartesian.isEdgeVisible[Edge3D.backRight] = false;\n        cartesian.isEdgeVisible[Edge3D.bottomRight] = false;\n        cartesian.isEdgeVisible[Edge3D.frontRight] = false;\n        cartesian.isEdgeVisible[Edge3D.topFront] = false;\n        cartesian.isEdgeVisible[Edge3D.topRight] = false;\n        const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ, } = bounds;\n        cartesian.minBoundsX = minBoundsX;\n        cartesian.maxBoundsX = maxBoundsX;\n        cartesian.minBoundsY = minBoundsY;\n        cartesian.maxBoundsY = maxBoundsY;\n        if (is3d) {\n            cartesian.minBoundsZ = minBoundsZ;\n            cartesian.maxBoundsZ = maxBoundsZ;\n        }\n    }\n    function getDomainBounds(dim2d, axis) {\n        const domain = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n        const minBounds = domain.sourcePosition[dim2d];\n        const maxBounds = domain.targetPosition[dim2d];\n        return {\n            maxBounds,\n            minBounds,\n        };\n    }\n    function convertAxis(axis, domain, dim, height) {\n        const start = domain.sourcePosition[dim];\n        const span = domain.targetPosition[dim] - start;\n        const tickPositions = axis\n            ?\n                axis.ticks.map(t => (t.sourcePosition[dim] - start) / span)\n            :\n                [];\n        const tickText = axis ?\n            axis.tickText.map(t => t.text)\n            :\n                [];\n        const textPos = axis ?\n            axis.tickText.map(t => (t.position[dim] - start) / span)\n            :\n                [];\n        const textSize = axis ?\n            axis.tickText.map(t => t.size / height)\n            :\n                [];\n        if (tickPositions.length) {\n            if (tickPositions[0] !== 0) {\n                tickPositions[0] = 0;\n            }\n            if (tickPositions[tickPositions.length - 1] !== 1) {\n                tickPositions[tickPositions.length - 1] = 1;\n            }\n        }\n        return {\n            tickPositions,\n            tickText,\n            textPos,\n            textSize,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class ColorMap {\n        constructor(quant = 5) {\n            this.quant = quant;\n            this.colorMap = {};\n            this.colorArray = [];\n        }\n        getColorKey(rgbaColor) {\n            const color = rgbaColor.slice(0, 3).map(e => Math.floor(e / this.quant) * this.quant);\n            color[3] = rgbaColor[3]; //retain alpha\n            return JSON.stringify(color);\n        }\n        registerColor(rgbaColor) {\n            const colorKey = this.getColorKey(rgbaColor);\n            if (!this.colorMap[colorKey]) {\n                this.colorMap[colorKey] = {\n                    index: this.colorArray.length,\n                    rgbaColor,\n                };\n                this.colorArray.push(rgbaColor);\n            }\n            return this.colorMap[colorKey].index;\n        }\n        getPalette() {\n            return {\n                palette: new Uint8Array(this.colorArray.flat()),\n                maxColor: this.colorArray.length - 1,\n            };\n        }\n    }\n    function convert$3(newColor) {\n        const c = colorFromString(newColor).slice(0, 3);\n        return c.map(v => v / 255);\n    }\n    function colorConfig(ref, colors) {\n        if (!colors)\n            return;\n        const { config } = ref.core;\n        config.activeColor = convert$3(colors.activeItemColor);\n        config.backgroundColor = new Float32Array(convert$3(colors.backgroundColor));\n        config.textColor = convert$3(colors.textColor);\n        config.textBorderColor = convert$3(colors.textBorderColor);\n        config.axesTextColor = convert$3(colors.axesTextLabelColor);\n        config.axesGridBackgroundColor = convert$3(colors.axesGridBackgroundColor);\n        config.axesGridHighlightColor = convert$3(colors.axesGridHighlightColor);\n        config.axesGridMinorColor = convert$3(colors.axesGridMinorColor);\n        config.axesGridMajorColor = convert$3(colors.axesGridMajorColor);\n        config.axesGridZeroColor = convert$3(colors.axesGridZeroColor);\n        //TODO fix this - hack to reset the background color\n        ref.core.renderer['_theme'] = null;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const key$1 = 'cube';\n    const createCubeLayer = (props) => {\n        const { ref, stage } = props;\n        const { core } = ref;\n        const scatter = new Scatter(core);\n        const { ids, colors, positionsX, positionsY, positionsZ, sizesX, sizesY, sizesZ, bounds, maxColor, palette, } = convert$2(stage);\n        if (!ids.length)\n            return;\n        const { renderer } = core;\n        let cubeTransitionBuffer = renderer.transitionBuffers.find(t => t.key === key$1);\n        if (!cubeTransitionBuffer) {\n            cubeTransitionBuffer = renderer.createTransitionBuffer(ids);\n            cubeTransitionBuffer.key = key$1;\n            renderer.transitionBuffers.push(cubeTransitionBuffer);\n        }\n        else {\n            cubeTransitionBuffer.swap();\n        }\n        scatter.layout(cubeTransitionBuffer.currentBuffer, ids, {\n            positionsX,\n            positionsY,\n            positionsZ,\n        });\n        const layer = {\n            positionsX,\n            positionsY,\n            positionsZ,\n            update: (newBounds, selected, stagger) => {\n                const { colors, maxColor, minColor, palette } = layer.unitColorMap;\n                // reference off of core.renderer to get the actual buffer\n                const currCubeTransitionBuffer = core.renderer.transitionBuffers.find(t => t.key === key$1);\n                currCubeTransitionBuffer.currentBuffer.unitType = UnitType.block;\n                currCubeTransitionBuffer.currentPalette.colors = palette;\n                let options = Object.assign({ selected,\n                    colors,\n                    minColor,\n                    maxColor,\n                    sizesX,\n                    sizesY,\n                    sizesZ }, newBounds);\n                if (stagger === null || stagger === void 0 ? void 0 : stagger.staggerOrders) {\n                    const { maxStaggerOrder, minStaggerOrder, staggerOrders } = stagger;\n                    options = Object.assign(Object.assign({}, options), { maxStaggerOrder,\n                        minStaggerOrder,\n                        staggerOrders });\n                }\n                scatter.update(currCubeTransitionBuffer.currentBuffer, ids, options);\n            },\n            bounds,\n            unitColorMap: {\n                colors,\n                ids,\n                minColor: 0,\n                maxColor,\n                palette,\n            },\n        };\n        return layer;\n    };\n    function convert$2(stage) {\n        const { cubeData } = stage;\n        const { length } = cubeData;\n        const ids = [];\n        const colors = new Float64Array(length);\n        const positionsX = new Float64Array(length);\n        const positionsY = new Float64Array(length);\n        const positionsZ = new Float64Array(length);\n        const sizesX = new Float64Array(length);\n        const sizesY = new Float64Array(length);\n        const sizesZ = new Float64Array(length);\n        let bounds;\n        const colorMap = new ColorMap();\n        cubeData.forEach((cube, i) => {\n            ids.push(i);\n            if (cube.isEmpty) {\n                positionsX[i] = 0;\n                positionsY[i] = 0;\n                positionsZ[i] = 0;\n                sizesX[i] = 0;\n                sizesY[i] = 0;\n                sizesZ[i] = 0;\n                colors[i] = 0;\n            }\n            else {\n                //ids.push(cube.ordinal);\n                positionsX[i] = cube.position[0] + cube.size[0] * 0.5;\n                positionsY[i] = cube.position[1] + cube.size[1] * 0.5;\n                positionsZ[i] = cube.position[2] + cube.size[2] * 0.5;\n                sizesX[i] = cube.size[0];\n                sizesY[i] = cube.size[1];\n                sizesZ[i] = cube.size[2];\n                bounds = increment(bounds, cube.position[0], cube.position[1], cube.position[2], cube.position[0] + cube.size[0], cube.position[1] + cube.size[1], cube.position[2] + cube.size[2]);\n                colors[i] = colorMap.registerColor(cube.color);\n            }\n        });\n        const { palette, maxColor } = colorMap.getPalette();\n        return {\n            ids: new Uint32Array(ids),\n            colors,\n            positionsX,\n            positionsY,\n            positionsZ,\n            sizesX,\n            sizesY,\n            sizesZ,\n            bounds,\n            maxColor,\n            palette,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const key = 'line';\n    const createLineLayer = (props) => {\n        const { height, ref, stage} = props;\n        const { core } = ref;\n        const lines = new Line(core);\n        const { ids, fromIds, toIds, lineColors, lineSizes, bounds, positionsX, positionsY, positionsZ, lineMaxColor, palette, } = convert$1(stage, height);\n        if (!ids.length)\n            return;\n        const { renderer } = core;\n        let lineTransitionBuffer = renderer.transitionBuffers.find(t => t.key === key);\n        if (!lineTransitionBuffer) {\n            lineTransitionBuffer = renderer.createTransitionBuffer(ids);\n            lineTransitionBuffer.key = key;\n            renderer.transitionBuffers.push(lineTransitionBuffer);\n        }\n        else {\n            lineTransitionBuffer.swap();\n        }\n        lines.layout(lineTransitionBuffer.currentBuffer, ids, fromIds, toIds, {\n            positionsX,\n            positionsY,\n            positionsZ,\n            lineSizes,\n            sizeScaling: 1,\n        });\n        let options = {\n            lineColors,\n            lineMinColor: 0,\n            lineMaxColor,\n        };\n        // Unit type\n        lineTransitionBuffer.currentBuffer.unitType = UnitType.cylinder;\n        lineTransitionBuffer.currentPalette.colors = palette;\n        return {\n            update: newBounds => {\n                options = Object.assign(Object.assign({}, options), newBounds);\n                // reference off of core.renderer to get the actual buffer\n                const currLineTransitionBuffer = core.renderer.transitionBuffers.find(t => t.key === key);\n                lines.update(currLineTransitionBuffer.currentBuffer, ids, fromIds, toIds, options);\n            },\n            bounds,\n            unitColorMap: {\n                ids,\n                colors: lineColors,\n                minColor: 0,\n                maxColor: lineMaxColor,\n                palette,\n            },\n        };\n    };\n    function convert$1(stage, height, width) {\n        const { pathData } = stage;\n        const positions = [];\n        const lines = [];\n        const colorMap = new ColorMap();\n        pathData.forEach(path => {\n            const color = colorMap.registerColor(path.strokeColor);\n            let from = positions.length;\n            positions.push(path.positions[0]);\n            for (let i = 1; i < path.positions.length; i++) {\n                const to = positions.length;\n                positions.push(path.positions[i]);\n                lines.push({\n                    id: lines.length,\n                    from,\n                    to,\n                    color,\n                    size: path.strokeWidth,\n                });\n                from = to;\n            }\n        });\n        const ids = new Uint32Array(lines.length);\n        const fromIds = new Uint32Array(lines.length);\n        const toIds = new Uint32Array(lines.length);\n        const lineColors = new Float64Array(lines.length);\n        const lineSizes = new Float64Array(lines.length);\n        lines.forEach((line, i) => {\n            ids[i] = i;\n            fromIds[i] = line.from;\n            toIds[i] = line.to;\n            lineColors[i] = line.color;\n            lineSizes[i] = line.size;\n        });\n        const positionsX = new Float64Array(positions.length);\n        const positionsY = new Float64Array(positions.length);\n        const positionsZ = new Float64Array(positions.length);\n        let bounds;\n        positions.forEach((p, i) => {\n            positionsX[i] = p[0];\n            positionsY[i] = p[1] + height;\n            positionsZ[i] = p[2];\n            bounds = increment(bounds, positionsX[i], positionsY[i], positionsZ[i], positionsX[i], positionsY[i], positionsZ[i]);\n        });\n        const { palette, maxColor: lineMaxColor } = colorMap.getPalette();\n        return {\n            ids,\n            fromIds,\n            toIds,\n            lineColors,\n            lineSizes,\n            bounds,\n            positionsX,\n            positionsY,\n            positionsZ,\n            lineMaxColor,\n            palette,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const createTextLayer = (props) => {\n        const { ref, stage } = props;\n        const { core } = ref;\n        const { positionsX, positionsY, positionsZ, sizes, bounds, maxGlyphs, text, } = convert(stage);\n        if (text.length === 0) {\n            core.renderer.labelSets = [];\n            return;\n        }\n        const options = {\n            text,\n            maxGlyphs,\n            scales: sizes,\n        };\n        const labelSet = new LabelSet(core, options);\n        labelSet.positionsX = positionsX;\n        labelSet.positionsY = positionsY;\n        labelSet.positionsZ = positionsZ;\n        labelSet.horizontalAlignment = HorizontalAlignment.center;\n        labelSet.verticalAlignment = VerticalAlignment.center;\n        const layer = {\n            update: bounds => {\n                const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ, } = bounds;\n                labelSet.minBoundsX = minBoundsX;\n                labelSet.minBoundsY = minBoundsY;\n                labelSet.minBoundsZ = minBoundsZ;\n                labelSet.maxBoundsX = maxBoundsX;\n                labelSet.maxBoundsY = maxBoundsY;\n                labelSet.maxBoundsZ = maxBoundsZ;\n            },\n            bounds,\n        };\n        const labelSetVisual = core.renderer.createLabelSetVisual(labelSet);\n        core.renderer.labelSets = [labelSetVisual];\n        return layer;\n    };\n    function convert(stage) {\n        const { textData } = stage;\n        const { length } = textData;\n        const ids = [];\n        const text = [];\n        const colors = new Float64Array(length);\n        const positionsX = new Float64Array(length);\n        const positionsY = new Float64Array(length);\n        const positionsZ = new Float64Array(length);\n        const sizes = new Float64Array(length);\n        let bounds;\n        let maxGlyphs = 0;\n        const colorMap = new ColorMap();\n        textData.forEach((t, i) => {\n            ids.push(i);\n            text.push(t.text);\n            maxGlyphs += t.text.length;\n            positionsX[i] = t.position[0];\n            positionsY[i] = t.position[1];\n            positionsZ[i] = t.position[2];\n            sizes[i] = 1.5 * t.size; //scale similar to axes\n            bounds = increment(bounds, t.position[0], t.position[1], t.position[2], t.position[0], t.position[1], t.position[2]);\n            colors[i] = colorMap.registerColor(t.color);\n        });\n        const { palette, maxColor } = colorMap.getPalette();\n        return {\n            ids: new Uint32Array(ids),\n            colors,\n            positionsX,\n            positionsY,\n            positionsZ,\n            sizes,\n            bounds,\n            maxColor,\n            maxGlyphs,\n            palette,\n            text,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getImageData(url) {\n        return new Promise((resolve, reject) => {\n            const imageElement = document.createElement('img');\n            imageElement.onload = () => {\n                const canvas = document.createElement('canvas');\n                const ctx = canvas.getContext('2d');\n                const { height, width } = imageElement;\n                canvas.width = width;\n                canvas.height = height;\n                ctx.drawImage(imageElement, 0, 0);\n                resolve(ctx.getImageData(0, 0, width, height));\n            };\n            imageElement.src = url;\n        });\n    }\n    function createImageQuad(core, imageData, bounds, position, width, height) {\n        const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds;\n        const imageOptions = {\n            imageData,\n            position,\n            height,\n            width,\n            minBoundsX,\n            maxBoundsX,\n            minBoundsZ,\n            maxBoundsZ,\n            minBoundsY,\n            maxBoundsY,\n        };\n        return new ImageQuad(core, imageOptions);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function createCameraDefaults() {\n        const qModelRotation2d = create$1();\n        const qModelRotation3d = Constants.QUAT_ROTATEX_MINUS_90;\n        const qCameraRotation2d = create$1();\n        const qCameraRotation3d = create$1();\n        const qAngle = create$1();\n        const vCameraPosition = create$3();\n        // Altitude (pitch around local right axis)\n        setAxisAngle(qCameraRotation3d, Constants.VECTOR3_UNITX, AngleHelper.degreesToRadians(30));\n        // Azimuth (yaw around global up axis)\n        setAxisAngle(qAngle, Constants.VECTOR3_UNITY, AngleHelper.degreesToRadians(-25));\n        multiply(qCameraRotation3d, qCameraRotation3d, qAngle);\n        return {\n            qModelRotation2d,\n            qModelRotation3d,\n            qCameraRotation2d,\n            qCameraRotation3d,\n            vCameraPosition,\n        };\n    }\n    const cameraDefaults = createCameraDefaults();\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n    function applyCameraCallbacks(ref, lastPresenterConfig, lastView, transistion2dOnly) {\n        const { cameraTransitioner, core, modelTransitioner, positionTransitioner } = ref;\n        ref.reset = () => {\n            core.reset(true);\n            if (lastView === '3d') {\n                modelTransitioner.qRotation.to = qModelRotation3d;\n                cameraTransitioner.qRotation.to = qCameraRotation3d;\n                cameraTransitioner.vPosition.to = vCameraPosition;\n            }\n            else {\n                modelTransitioner.qRotation.to = qModelRotation2d;\n                cameraTransitioner.qRotation.to = qCameraRotation2d;\n                cameraTransitioner.vPosition.to = vCameraPosition;\n            }\n            slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.to, modelTransitioner.qRotation.to, 0);\n            core.setModelRotation(modelTransitioner.qRotation.current, true);\n            core.camera.setOrbit(cameraTransitioner.qRotation.to, true);\n            core.camera.setPosition(cameraTransitioner.vPosition.to, true);\n        };\n        const cam = (t) => {\n            slerp(cameraTransitioner.qRotation.current, cameraTransitioner.qRotation.from, cameraTransitioner.qRotation.to, t);\n            lerp(cameraTransitioner.vPosition.current, cameraTransitioner.vPosition.from, cameraTransitioner.vPosition.to, t);\n            core.camera.setOrbit(cameraTransitioner.qRotation.current, false);\n            core.camera.setPosition(cameraTransitioner.vPosition.current, false);\n            // disable picking during transitions, as the performance degradation could reduce the framerate\n            core.inputManager.isPickingEnabled = false;\n        };\n        core.updateCallback = (elapsedTime) => {\n            const { transitionDurations } = lastPresenterConfig;\n            if (positionTransitioner.isTransitioning) {\n                const t = positionTransitioner.elapse(elapsedTime, transitionDurations.position + transitionDurations.stagger);\n                core.renderer.transitionTime = t;\n                setTransitionTimeAxesVisibility(transistion2dOnly, core);\n            }\n            else {\n                core.inputManager.isPickingEnabled = true;\n            }\n            if (modelTransitioner.isTransitioning) {\n                const tm = modelTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n                if (modelTransitioner.shouldTransition) {\n                    slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.from, modelTransitioner.qRotation.to, tm);\n                    core.setModelRotation(modelTransitioner.qRotation.current, false);\n                }\n                cam(tm);\n            }\n            if (cameraTransitioner.isTransitioning) {\n                const t = cameraTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n                cam(t);\n            }\n        };\n    }\n    function setTransitionTimeAxesVisibility(transistion2dOnly, core) {\n        const t = core.renderer.transitionTime;\n        if (transistion2dOnly) {\n            if (t < 0.5) {\n                core.renderer.axesVisibility = AxesVisibility.previous;\n            }\n            else {\n                core.renderer.axesVisibility = AxesVisibility.current;\n            }\n        }\n        else {\n            if (t <= 0.01) {\n                core.renderer.axesVisibility = AxesVisibility.previous;\n            }\n            else if (t >= 0.99) {\n                core.renderer.axesVisibility = AxesVisibility.current;\n            }\n            else {\n                core.renderer.axesVisibility = AxesVisibility.none;\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function morphChartsRender(ref, prevStage, stage, height, width, preStage, colors, config) {\n        const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n        const { core, cameraTransitioner, modelTransitioner, positionTransitioner } = ref;\n        let transistion2dOnly = false;\n        let cameraTo;\n        let holdCamera;\n        if (config.camera === 'hold') {\n            holdCamera = true;\n        }\n        else {\n            cameraTo = config.camera;\n        }\n        if (prevStage && (prevStage.view !== stage.view)) {\n            modelTransitioner.shouldTransition = !holdCamera;\n            if (stage.view === '2d') {\n                modelTransitioner.qRotation.from = qModelRotation3d;\n                modelTransitioner.qRotation.to = qModelRotation2d;\n                cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d;\n                cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n            }\n            else {\n                modelTransitioner.qRotation.from = qModelRotation2d;\n                modelTransitioner.qRotation.to = qModelRotation3d;\n                cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d;\n                cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n            }\n        }\n        else {\n            modelTransitioner.shouldTransition = false;\n            if (stage.view === '2d') {\n                transistion2dOnly = true;\n                modelTransitioner.qRotation.to = qModelRotation2d;\n                cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d;\n                cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n            }\n            else {\n                modelTransitioner.qRotation.to = qModelRotation3d;\n                cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d;\n                cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition;\n            }\n        }\n        core.camera.getOrbit(cameraTransitioner.qRotation.from);\n        core.camera.getPosition(cameraTransitioner.vPosition.from);\n        if (!prevStage) {\n            core.setModelRotation(modelTransitioner.qRotation.to, false);\n            core.camera.setOrbit(cameraTransitioner.qRotation.to, false);\n            core.camera.setPosition(cameraTransitioner.vPosition.to, false);\n        }\n        else if (!holdCamera) {\n            cameraTransitioner.begin();\n        }\n        positionTransitioner.begin();\n        if (modelTransitioner.shouldTransition) {\n            modelTransitioner.begin();\n        }\n        const props = { ref, stage, height, config };\n        const cubeLayer = createCubeLayer(props);\n        const lineLayer = createLineLayer(props);\n        const textLayer = createTextLayer(props);\n        const { backgroundImages } = stage;\n        let contentBounds = outerBounds(outerBounds(cubeLayer === null || cubeLayer === void 0 ? void 0 : cubeLayer.bounds, lineLayer === null || lineLayer === void 0 ? void 0 : lineLayer.bounds), outerBounds(textLayer === null || textLayer === void 0 ? void 0 : textLayer.bounds, null));\n        backgroundImages === null || backgroundImages === void 0 ? void 0 : backgroundImages.forEach(backgroundImage => {\n            contentBounds = outerBounds(contentBounds, convertBounds(backgroundImage.bounds));\n        });\n        props.bounds = contentBounds;\n        core.renderer.previousAxes = core.renderer.currentAxes;\n        const axesLayer = createAxesLayer(props);\n        core.config.transitionStaggering = config.transitionDurations.stagger;\n        core.config.transitionDuration = config.transitionDurations.position;\n        let bounds;\n        if (axesLayer && axesLayer.bounds) {\n            bounds = axesLayer.bounds;\n        }\n        else {\n            bounds = contentBounds;\n        }\n        ref.setMorphChartsRendererOptions(config.renderer);\n        if (preStage) {\n            preStage(stage, cubeLayer);\n        }\n        //add images\n        core.renderer.images = [];\n        if (backgroundImages) {\n            const addImage = (imageBounds, imageData) => {\n                const imageWidth = imageBounds.maxBoundsX - imageBounds.minBoundsX;\n                const imageHeight = imageBounds.maxBoundsY - imageBounds.minBoundsY;\n                const position = [imageBounds.minBoundsX + imageWidth / 2, imageBounds.minBoundsY + imageHeight / 2, 0];\n                const imageQuad = createImageQuad(core, imageData, contentBounds, position, imageWidth, imageHeight);\n                const imageVisual = core.renderer.createImageVisual(imageQuad);\n                core.renderer.images.push(imageVisual);\n            };\n            const imageDataCache = {};\n            backgroundImages.forEach(backgroundImage => {\n                const imageBounds = convertBounds(backgroundImage.bounds);\n                const imageData = imageDataCache[backgroundImage.url];\n                if (imageData) {\n                    addImage(imageBounds, imageData);\n                }\n                else {\n                    getImageData(backgroundImage.url).then(imageData => {\n                        imageDataCache[backgroundImage.url] = imageData;\n                        addImage(imageBounds, imageData);\n                    });\n                }\n            });\n        }\n        //Now call update on each layout\n        layersWithSelection(cubeLayer, lineLayer, textLayer, config.layerSelection, bounds, ref.layerStagger);\n        applyCameraCallbacks(ref, config, stage.view, transistion2dOnly);\n        core.renderer.transitionTime = 0; // Set renderer transition time for this render pass to prevent rendering target buffer for single frame\n        colorConfig(ref, colors);\n        return {\n            bounds,\n            getCubeLayer: () => cubeLayer,\n            update: layerSelection => layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds, ref.layerStagger),\n            activate: id => core.renderer.transitionBuffers[0].activeId = id,\n            moveCamera: (camera) => {\n                if (!(positionTransitioner.isTransitioning || modelTransitioner.isTransitioning)) {\n                    core.camera.getOrbit(cameraTransitioner.qRotation.from);\n                    core.camera.getPosition(cameraTransitioner.vPosition.from);\n                    cameraTransitioner.move(camera.position, camera.rotation);\n                }\n            },\n            setTransitionTimeAxesVisibility: () => {\n                setTransitionTimeAxesVisibility(transistion2dOnly, core);\n            },\n        };\n    }\n    function layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds, layerStagger) {\n        const layerItems = [\n            {\n                layer: cubeLayer,\n                selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.cubes,\n                stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.cubes,\n            },\n            {\n                layer: lineLayer,\n                selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.lines,\n                stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.lines,\n            },\n            {\n                layer: textLayer,\n                selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.texts,\n                stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.texts,\n            },\n        ];\n        layerItems.forEach(layerItem => { var _a; return (_a = layerItem.layer) === null || _a === void 0 ? void 0 : _a.update(bounds, layerItem.selection, layerItem.stagger); });\n    }\n    function convertBounds(bounds) {\n        if (!bounds)\n            return;\n        return {\n            minBoundsX: bounds.x1,\n            maxBoundsX: bounds.x2,\n            minBoundsY: -bounds.y2,\n            maxBoundsY: -bounds.y1,\n            minBoundsZ: minZ,\n            maxBoundsZ: minZ,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function shouldChangeRenderer(prev, next) {\n        var _a, _b;\n        if (!prev || !next)\n            return true;\n        if (prev.advanced !== next.advanced)\n            return true;\n        if (!prev.advanced) {\n            return ((_a = prev.basicOptions) === null || _a === void 0 ? void 0 : _a.antialias) != ((_b = next.basicOptions) === null || _b === void 0 ? void 0 : _b.antialias);\n        }\n    }\n    function getRenderer(mcRendererOptions, core) {\n        const advanced = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced;\n        const r = advanced ?\n            new Main()\n            :\n                new Main$1(mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.basicOptions);\n        core.renderer = r;\n        setRendererOptions(r, mcRendererOptions);\n        return r;\n    }\n    function setRendererOptions(renderer, mcRendererOptions) {\n        const o = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advancedOptions;\n        if ((mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced) && o) {\n            for (const key in o) {\n                renderer.config[key] = o[key];\n            }\n        }\n    }\n    function rendererEnabled(advanced) {\n        const r = advanced ?\n            new Main()\n            :\n                new Main$1();\n        return r.isSupported;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const rightButton = 2;\n    function listenCanvasEvents(core, options) {\n        const { container, pickGridCallback } = options;\n        const { inputManager } = core;\n        if (options.onLasso) {\n            inputManager.pickLassoCallback = result => {\n                options.onLasso(result.ids[0], result.manipulator.event);\n            };\n        }\n        inputManager.singleTouchAction = manipulator => {\n            if (manipulator.button == rightButton || manipulator.shiftKey || manipulator.ctrlKey) {\n                return SingleTouchAction.rotate;\n            }\n            else if (manipulator.altKey) {\n                return SingleTouchAction.lasso;\n            }\n            else {\n                return SingleTouchAction.translate;\n            }\n        };\n        inputManager.pickAxesGridCallback = ({ divisionX, divisionY, divisionZ, manipulator }) => {\n            clearClickTimeout();\n            const { altKey, button, shiftKey } = manipulator;\n            const me = { altKey, shiftKey, button };\n            const e = me;\n            pickGridCallback([divisionX, divisionY, divisionZ], e);\n        };\n        const canvas = container.getElementsByTagName('canvas')[0];\n        let pickedId;\n        const hover = (e) => {\n            if (core.renderer.pickedId !== pickedId) {\n                pickedId = core.renderer.pickedId;\n                const ordinal = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n                options.onCubeHover(e, ordinal);\n            }\n        };\n        canvas.addEventListener('mousemove', (e) => {\n            clearClickTimeout();\n            if (mousedown) {\n                options.onCubeHover(e, null);\n            }\n            hover(e);\n        });\n        canvas.addEventListener('mouseout', hover);\n        canvas.addEventListener('mouseover', hover);\n        let mousedown;\n        canvas.addEventListener('mousedown', () => {\n            mousedown = true;\n        });\n        canvas.addEventListener('mouseup', (e) => {\n            mousedown = false;\n        });\n        let canvasClickTimeout;\n        const clearClickTimeout = () => {\n            clearTimeout(canvasClickTimeout);\n            canvasClickTimeout = null;\n        };\n        canvas.addEventListener('click', (e) => {\n            canvasClickTimeout = setTimeout(() => {\n                options.onCanvasClick(e);\n            }, 50);\n        });\n        inputManager.pickItemCallback = ({ manipulator }) => {\n            clearClickTimeout();\n            const ordinal = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n            options.onCubeClick(manipulator.event, ordinal);\n        };\n    }\n\n    function cubicInOut(t) {\n      return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function easing(t) {\n        if (t === 0 || t === 1)\n            return t;\n        return cubicInOut(t);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Transitioner {\n        constructor() {\n            this.isTransitioning = false;\n        }\n        begin() {\n            this.isTransitioning = true;\n            this.time = 0;\n        }\n        elapse(elapsedTime, totalTime, ease = false) {\n            this.time += elapsedTime;\n            if (this.time >= totalTime) {\n                this.isTransitioning = false;\n                this.time = totalTime;\n                this.ended && this.ended();\n            }\n            const t = this.time / totalTime;\n            return ease ? easing(t) : t;\n        }\n    }\n    class CameraTransitioner extends Transitioner {\n        constructor() {\n            super();\n            this.qRotation = {\n                from: create$1(),\n                to: null,\n                current: create$1(),\n            };\n            this.vPosition = {\n                from: create$3(),\n                to: null,\n                current: create$3(),\n            };\n        }\n        move(position, rotation) {\n            this.begin();\n            this.qRotation.to = rotation;\n            this.vPosition.to = position;\n        }\n    }\n    class ModelTransitioner extends Transitioner {\n        constructor() {\n            super();\n            this.shouldTransition = false;\n            this.qRotation = {\n                from: null,\n                to: null,\n                current: create$1(),\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function init(options, mcRendererOptions) {\n        const { container } = options;\n        const core = new Core({ container });\n        getRenderer(mcRendererOptions, core);\n        listenCanvasEvents(core, options);\n        core.config.pickSelectDelay = 50;\n        const cameraTransitioner = new CameraTransitioner();\n        const modelTransitioner = new ModelTransitioner();\n        const positionTransitioner = new Transitioner();\n        positionTransitioner.ended = () => {\n            core.renderer.axesVisibility = AxesVisibility.current;\n        };\n        const ref = {\n            supportedRenders: {\n                advanced: rendererEnabled(true),\n                basic: rendererEnabled(false),\n            },\n            reset: null,\n            cameraTransitioner,\n            modelTransitioner,\n            positionTransitioner,\n            core,\n            setMorphChartsRendererOptions(mcRendererOptions) {\n                if (shouldChangeRenderer(ref.lastMorphChartsRendererOptions, mcRendererOptions)) {\n                    getRenderer(mcRendererOptions, core);\n                    listenCanvasEvents(core, options);\n                }\n                else {\n                    if (mcRendererOptions.advanced) {\n                        //same renderer, poke the config\n                        setRendererOptions(core.renderer, mcRendererOptions);\n                    }\n                }\n                ref.lastMorphChartsRendererOptions = mcRendererOptions;\n            },\n            lastMorphChartsRendererOptions: mcRendererOptions,\n            layerStagger: {},\n        };\n        return ref;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Class which presents a Stage of chart data using MorphCharts to render.\n     */\n    class Presenter {\n        /**\n         * Get the previously rendered Stage object.\n         */\n        get stage() {\n            return this._last.stage;\n        }\n        /**\n         * Get the current View camera type.\n         */\n        get view() {\n            return this._last.view;\n        }\n        /**\n         * Instantiate a new Presenter.\n         * @param el Parent HTMLElement to present within.\n         * @param style Optional PresenterStyle styling options.\n         */\n        constructor(el, style) {\n            this.el = el;\n            this.style = deepMerge(defaultPresenterStyle, style);\n            initializePanel(this);\n            this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n        }\n        /**\n         * Cancels any pending animation, calling animationCanceled() on original queue.\n         */\n        animationCancel() {\n            if (this.animationTimer) {\n                clearTimeout(this.animationTimer);\n                this.animationTimer = null;\n                if (this.logger) {\n                    this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n                }\n                if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                    this.queuedAnimationOptions.animationCanceled.call(null);\n                }\n            }\n        }\n        /**\n         * Stops the current animation and queues a new animation.\n         * @param handler Function to invoke when timeout is complete.\n         * @param timeout Length of time to wait before invoking the handler.\n         * @param options Optional QueuedAnimationOptions object.\n         */\n        animationQueue(handler, timeout, options) {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...(${timeout})`);\n            }\n            this.animationCancel();\n            this.animationTimer = setTimeout(() => {\n                if (this.logger) {\n                    this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n                }\n                handler();\n            }, timeout);\n        }\n        /**\n         * Retrieve a sub-element of the rendered output.\n         * @param type PresenterElement type of the HTMLElement to retrieve.\n         */\n        getElement(type) {\n            const elements = this.el.getElementsByClassName(className(type, this));\n            if (elements && elements.length) {\n                return elements[0];\n            }\n        }\n        /**\n         * Present the Vega Scene, or Stage object using Morphcharts.\n         * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n         * @param height Height of the rendering area.\n         * @param width Width of the rendering area.\n         * @param config Optional presentation configuration object.\n         */\n        present(sceneOrStage, height, width, config) {\n            this.animationCancel();\n            const scene = sceneOrStage;\n            let stage;\n            const options = {\n                maxOrdinal: 0,\n                currAxis: null,\n                defaultCubeColor: this.style.defaultCubeColor,\n                assignCubeOrdinal: (config && config.onSceneRectAssignCubeOrdinal) || (() => options.maxOrdinal++),\n                modifyAxis: (config === null || config === void 0 ? void 0 : config.onAxisItem) ? config.onAxisItem : defaultOnAxisItem,\n                zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex,\n            };\n            //determine if this is a vega scene\n            if (scene.marktype) {\n                stage = createStage(scene.view);\n                sceneToStage(options, stage, scene);\n            }\n            else {\n                stage = sceneOrStage;\n            }\n            const c = deepMerge(defaultPresenterConfig, config);\n            if (!this.morphchartsref) {\n                this._morphChartsOptions = {\n                    container: this.getElement(exports.PresenterElement.gl),\n                    pickGridCallback: c.axisPickGridCallback,\n                    onCubeHover: (e, ordinal) => {\n                        c.onCubeHover(e, { ordinal, color: null, position: null, size: null });\n                    },\n                    onCubeClick: (e, ordinal) => {\n                        c.onCubeClick(e, { ordinal, color: null, position: null, size: null });\n                    },\n                    onCanvasClick: config === null || config === void 0 ? void 0 : config.onLayerClick,\n                    onLasso: config === null || config === void 0 ? void 0 : config.onLasso,\n                };\n                this.morphchartsref = init(this._morphChartsOptions, c.renderer || defaultPresenterConfig.renderer);\n            }\n            let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n            if (options.maxOrdinal) {\n                cubeCount = Math.max(cubeCount, options.maxOrdinal);\n                const empty = {\n                    isEmpty: true,\n                };\n                stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n            }\n            config.preLayer && config.preLayer(stage);\n            this.morphChartsRenderResult = morphChartsRender(this.morphchartsref, this._last.stage, stage, height, width, config && config.preStage, config && config.morphChartsColors, c);\n            delete stage.cubeData;\n            delete stage.redraw;\n            this._last = {\n                cubeCount,\n                height,\n                width,\n                stage,\n                view: stage.view,\n            };\n            const a = getActiveElementInfo();\n            mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(exports.PresenterElement.legend));\n            setActiveElement(a);\n            if (config && config.onPresent) {\n                config.onPresent();\n            }\n        }\n        canvasToDataURL() {\n            return new Promise((resolve, reject) => {\n                this.morphchartsref.core.afterRenderCallback = () => {\n                    this.morphchartsref.core.afterRenderCallback = null;\n                    const canvas = this.getElement(exports.PresenterElement.gl).getElementsByTagName('canvas')[0];\n                    const png = canvas.toDataURL('image/png');\n                    resolve(png);\n                };\n            });\n        }\n        configColors(mcColors) {\n            colorConfig(this.morphchartsref, mcColors);\n        }\n        /**\n         * Home the camera to the last initial position.\n         */\n        homeCamera() {\n            var _a;\n            (_a = this.morphchartsref) === null || _a === void 0 ? void 0 : _a.reset();\n        }\n        /**\n         * Show guidelines of rendering height/width and center of OrbitView.\n         */\n        showGuides() {\n            this.getElement(exports.PresenterElement.gl).classList.add('show-center');\n            //TODO Morphcharts gridlines\n        }\n        finalize() {\n            this.animationCancel();\n            if (this.morphchartsref)\n                this.morphchartsref.core.stop();\n            if (this.el)\n                this.el.innerHTML = '';\n            this._last = null;\n            this.morphchartsref = null;\n            this.el = null;\n            this.logger = null;\n            this.queuedAnimationOptions = null;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //pass in the SuperClass, which should be a vega.View\n    function _RendererGl(loader) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class RendererGlInternal extends base.vega.Renderer {\n            initialize(el, width, height, origin) {\n                this.height = height;\n                this.width = width;\n                // this method will invoke resize to size the canvas appropriately\n                return super.initialize(el, width, height, origin);\n            }\n            resize(width, height, origin) {\n                super.resize(width, height, origin);\n                this.origin = origin;\n                this.height = height;\n                this.width = width;\n                //rteturn this for vega\n                return this;\n            }\n            _render(scene, items) {\n                const scene3d = scene;\n                scene3d.view = this.getView();\n                this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n                //return this for vega\n                return this;\n            }\n        }\n        const instance = new RendererGlInternal(loader);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n     * This is instantiated by ViewGl.\n     */\n    const RendererGl = _RendererGl;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    let registered = false;\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n    //pass in the SuperClass, which should be a vega.View\n    function _ViewGl(runtime, config) {\n        //dynamic superclass, since we don't know have vega.View in the declaration phase\n        class ViewGlInternal extends base.vega.View {\n            constructor(runtime, config = {}) {\n                super(runtime, config);\n                this.config = config;\n                this.presenter = config.presenter;\n                config.presenterConfig = config.presenterConfig || {};\n                config.presenterConfig.redraw = () => {\n                    this._redraw = true; //use Vega View private member _redraw\n                    this.run();\n                };\n            }\n            renderer(...args) {\n                if (args && args.length) {\n                    const renderer = args[0];\n                    if (renderer === 'morphcharts' && !registered) {\n                        base.vega.renderModule('morphcharts', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                        registered = true;\n                    }\n                    return super.renderer(renderer);\n                }\n                else {\n                    return super.renderer();\n                }\n            }\n            initialize(el) {\n                if (!this.presenter) {\n                    this.presenter = new Presenter(el);\n                }\n                super.initialize(this.presenter.getElement(exports.PresenterElement.vegaControls));\n                const renderer = this._renderer;\n                renderer.presenterConfig = this.config.presenterConfig;\n                renderer.presenter = this.presenter;\n                renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView);\n                return this;\n            }\n            error(e) {\n                if (this.presenter.logger) {\n                    this.presenter.logger(e);\n                }\n            }\n        }\n        const instance = new ViewGlInternal(runtime, config);\n        return instance;\n    }\n    //signature to allow this function to be used with the 'new' keyword.\n    //need to trick the compiler by casting to 'any'.\n    /**\n     * Subclass of Vega.View, with added properties for accessing a Presenter.\n     * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n     */\n    const ViewGl = _ViewGl;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const version = '1.0.6';\n\n    exports.Presenter = Presenter;\n    exports.ViewGl = ViewGl;\n    exports.base = base;\n    exports.controls = controls;\n    exports.defaults = defaults;\n    exports.types = types;\n    exports.use = use;\n    exports.util = util;\n    exports.version = version;\n\n}));\n"
  },
  {
    "path": "docs/docs/changelog.md",
    "content": "---\nlayout: docs\ntitle: Documentation Changelog\n---\n\n# Documentation Changelog\n\n* December 2024 - API docs taken down for maintenance\n* July 2022 - Major version to v4\n* May 2021 - Docs generated with <a href=\"https://typedoc.org\">TypeDoc</a>\n* June 2020 - Major version to v3 - [see what's new in v3](v3)\n* December 2019 - Major version to v2\n* April 2019 - Initial release\n"
  },
  {
    "path": "docs/docs/contributing.md",
    "content": "---\nlayout: docs\ntitle: Contributing\n---\n\n# Contributing\nWe would love to accept your contributions to SandDance. Before you consider making any changes, please review the legal policy of Microsoft below.\n\n# Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n### How to contribute\n* Submit a CLA (below)\n* Fork the repo.\n* Clone the repo to your computer.\n* Make code changes locally.\n* Make sure you can build with no errors.\n* Commit changes in your own repo.\n* Push changes to your fork.\n* Make a pull request.\n\n### Legal\nYou will need to complete a Contributor License Agreement (CLA). Briefly, this agreement testifies that you are granting us permission to use the submitted change according to the terms of the project's license, and that the work being submitted is under appropriate copyright.\n\nPlease submit a Contributor License Agreement (CLA) before submitting a pull request. You may visit [https://cla.opensource.microsoft.com/](https://cla.opensource.microsoft.com/) to sign digitally. Once we have received the signed CLA, we'll review the request.\n"
  },
  {
    "path": "docs/docs/index.md",
    "content": "---\nlayout: docs\ntitle: Docs\n---\n\n# Introduction\n\nSandDance is an offering of several JavaScript components:\n\n* [sanddance](https://github.com/microsoft/SandDance/tree/main/packages/sanddance) - the core SandDance visualization canvas.\n* [sanddance-specs](https://github.com/microsoft/SandDance/tree/main/packages/sanddance-specs) - Vega specifications for unit visualizations.\n* [sanddance-react](https://github.com/microsoft/SandDance/tree/main/packages/sanddance-react) - the core SandDance visualization canvas for use in React based applications.\n* [sanddance-explorer](https://github.com/microsoft/SandDance/tree/main/packages/sanddance-explorer) - the core SandDance visualization canvas with UI to enable data exploration, for use in React based applications.\n* [sanddance-embed](https://github.com/microsoft/SandDance/tree/main/packages/sanddance-embed) - the easiest way to embed SandDance Explorer in your applications, via an `<iframe>` tag.\n* [vega-morphcharts](https://github.com/microsoft/SandDance/tree/main/packages/vega-morphcharts) - the View component for Vega visualizations, using MorphCharts for WebGL rendering.\n* [data-inference](https://github.com/microsoft/SandDance/tree/main/packages/data-inference) - Infer column types in tabular data.\n* [chart-types](https://github.com/microsoft/SandDance/tree/main/packages/chart-types) - TypeScript types for creating charts.\n"
  },
  {
    "path": "docs/embed/v1/sanddance-embed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-embed@1/dist/css/sanddance-embed.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-explorer@1/dist/css/sanddance-explorer.css\" />\n</head>\n\n<body>\n    <script src=\"https://unpkg.com/react@16/umd/react.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@16/umd/react-dom.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/deck.gl@6/deckgl.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@4/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/office-ui-fabric-react@6.204.4/dist/office-ui-fabric-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@1/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@1/dist/umd/sanddance-embed.js\"></script>\n\n    <div id=\"app\"></div>\n\n    <!--EMBED-->\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/embed/v2/sanddance-embed-privacy-footer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-embed@2/dist/css/sanddance-embed.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-explorer@2.2/dist/css/sanddance-explorer.css\" />\n    <style>\n        body {\n            display: grid;\n            grid-template-rows: auto 0fr;\n        }\n\n        #app {\n            position: unset;\n        }\n\n        footer {\n            border-top: 1px solid #ccc;\n            font-size: smaller;\n            padding: 6px 1em;\n        }\n    </style>\n</head>\n\n<body>\n    <script src=\"https://unpkg.com/react@16/umd/react.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@16/umd/react-dom.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/deck.gl@6/deckgl.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@5.8/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/office-ui-fabric-react@6.204.4/dist/office-ui-fabric-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@2.2/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@2/dist/umd/sanddance-embed.js\"></script>\n\n    <div id=\"app\"></div>\n\n    <!--EMBED-->\n\n    <footer>\n        <span>\n            This site does not collect any personal information or use cookies.\n            <a href=\"https://go.microsoft.com/fwlink/?LinkId=521839\">Privacy & Cookies</a>\n        </span>\n        <span>\n            <a href=\"https://www.microsoft.com/en-us/servicesagreement/\">Terms of Use</a>\n        </span>\n        <span>\n            ©2020 Microsoft.\n        </span>\n    </footer>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/embed/v2/sanddance-embed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-embed@2/dist/css/sanddance-embed.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-explorer@2.2/dist/css/sanddance-explorer.css\" />\n</head>\n\n<body>\n    <script src=\"https://unpkg.com/react@16/umd/react.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@16/umd/react-dom.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/deck.gl@6/deckgl.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@5.9/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/office-ui-fabric-react@6.204.4/dist/office-ui-fabric-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@2.2/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@2/dist/umd/sanddance-embed.js\"></script>\n\n    <div id=\"app\"></div>\n\n    <!--EMBED-->\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/embed/v3/sanddance-embed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-embed@3/dist/css/sanddance-embed.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-explorer@3/dist/css/sanddance-explorer.css\" />\n</head>\n\n<body>\n    <script src=\"https://unpkg.com/react@16.13/umd/react.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@16.13/umd/react-dom.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/deck.gl@8.3.7/dist.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@5.17/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/@fluentui/react@7.150/dist/fluentui-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@3/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@3/dist/umd/sanddance-embed.js\"></script>\n\n    <div id=\"app\"></div>\n\n    <!--EMBED-->\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/embed/v4/dynamic/target.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n</head>\n\n<body>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@4.4/dist/umd/sanddance-embed.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/embed/v4/dynamic/test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <header>\n        <h1>sanddance embed test</h1>\n    </header>\n\n    <iframe id=\"embed\" title=\"embed\" style=\"width: 90%; height: 700px\" src=\"target.html\"></iframe>\n\n    <div>\n        <button id=\"button_theme\">toggle dark theme</button>\n        <button id=\"button_insight\">get insight</button>\n        <button id=\"button_setup\">get setup</button>\n    </div>\n\n    <script>\n        window.onmessage = (e) => {\n            console.log('messaged', e.data);\n        };\n        const embedIframe = document.getElementById('embed');\n        embedIframe.onload = () => {\n            fetch('../../../sample-data/titanicmaster.tsv')\n                .then(response => response.text())\n                .then(rawText => {\n                    const data = { rawText, type: 'tsv' };\n                    embedIframe.contentWindow.postMessage({\n                        action: 'load',\n                        data,\n                        insight: {\n                            chart: 'barchartH',\n                            columns: {\n                                y: 'Age',\n                                z: 'TicketCost',\n                                color: 'Class'\n                            },\n                            scheme: 'category10',\n                            view: '3d',\n                        },\n                        props: {\n                            theme: 'dark-theme',\n                            initialSidebarClosed: true,\n                            initialSidebarPinned: false,\n                            initialRenderer: {\n                                advanced: true,\n                            },\n                        }\n                    }, '*');\n                });\n        };\n\n        let dark = true;\n        const button_theme = document.getElementById('button_theme');\n        button_theme.onclick = () => {\n            dark = !dark;\n            embedIframe.contentWindow.postMessage({ action: 'theme', dark }, '*');\n        };\n\n        const button_insight = document.getElementById('button_insight');\n        button_insight.onclick = () => {\n            embedIframe.contentWindow.postMessage({ action: 'getInsight' }, '*');\n        };\n\n        const button_setup = document.getElementById('button_setup');\n        button_setup.onclick = () => {\n            embedIframe.contentWindow.postMessage({ action: 'getSetup' }, '*');\n        };\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/embed/v4/sanddance-embed.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/css/sanddance-explorer.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/css/sanddance-embed.css\" />\n</head>\n<body>\n    <script src=\"https://unpkg.com/react@17/umd/react.production.min.js\"></script>\n    <script src=\"https://unpkg.com/react-dom@17/umd/react-dom.production.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@6.2/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/@fluentui/react@8/dist/fluentui-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/fluentui-icons@1/dist/umd/fluentui-icons.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/umd/sanddance-embed.js\"></script>\n    <!--EMBED-->\n</body>\n</html>"
  },
  {
    "path": "docs/embed/v4/test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <header>\n        <h1>sanddance embed test</h1>\n    </header>\n\n    <iframe id=\"embed\" title=\"embed\" style=\"width: 90%; height: 700px\" src=\"sanddance-embed.html\"></iframe>\n\n    <div>\n        <button id=\"button_theme\">toggle dark theme</button>\n    </div>\n\n    <script>\n        window.onmessage = (e) => {\n            console.log('messaged', e.data);\n        };\n        const embedIframe = document.getElementById('embed');\n        embedIframe.onload = () => {\n            fetch('../../sample-data/titanicmaster.tsv')\n                .then(response => response.text())\n                .then(rawText => {\n                    const data = { rawText, type: 'tsv' };\n                    embedIframe.contentWindow.postMessage({ action: 'load', data, props: { theme: 'dark-theme' } }, '*');\n                });\n        };\n\n        let dark = true;\n        const button_theme = document.getElementById('button_theme');\n        button_theme.onclick = () => {\n            dark = !dark;\n            embedIframe.contentWindow.postMessage({ action: 'theme', dark }, '*');\n        };\n\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/examples/index.md",
    "content": "---\nlayout: page\ntitle: Examples\n---\n\n# Examples\n\n## Subsystem\n\n### data-inference\n* [data-inference test](../tests/data-inference/v2/) using UMD/CDN\n\n### sanddance-specs\n* [sanddance-specs 2D vega specs tests](../tests/sanddance-specs/v2/) using UMD/CDN\n\n### vega-morphcharts\n* [simple vega spec](../tests/v4/umd/vega-morphcharts.test.html) using UMD/CDN\n* [vega spec test](../tests/v4/es6/vega-morphcharts-test-es6.html) using bundled es6\n* [transition between vega specs](../tests/v4/umd/transition.html) using UMD/CDN\n\n## <a name=\"component\"></a>SandDance component v4\n* [simple scatterplot](../tests/v4/umd/test.html) using UMD/CDN\n* [scatterplot fetch + transform](../tests/v4/umd/transforms.html) using UMD/CDN\n* [scatterplot](../tests/v4/es6/sanddance-test-es6.html) using bundled ES6\n* [demovote scatterplot](../tests/v4/umd/scatterplotTest.html) using UMD/CDN\n* [qualitative barchart](../tests/v4/umd/qualBarChartTest.html) using UMD/CDN\n* [quantitative barchart](../tests/v4/umd/quanBarChartTest.html) using UMD/CDN\n* [titanic treemap](../tests/v4/umd/treeMapTest.html) using UMD/CDN\n* [react component](../tests/v4/umd/sanddance-react.html) using UMD/CDN\n\n## <a name=\"apps\"></a>SandDance apps v4\n* [Web app](../tests/v4/es6/app)\n* [Power BI custom visual](../dist/powerbi/v4/SandDance201929976D117A654D0BAB8E96507442D80B.4.2.0.2.pbiviz) 4.2.0.2\n* [Azure Data Studio extension](../dist/azdata/v4/azdata-sanddance-4.1.1.vsix) 4.1.1\n* [VSCode extension](../dist/vscode/v4/vscode-sanddance-4.2.0.vsix) 4.2.0\n* [sanddance-embed example](../embed/v4/test.html)\n\n## Previous versions\n\n[version 3](v3)"
  },
  {
    "path": "docs/examples/v3.md",
    "content": "---\nlayout: page\ntitle: V3 Examples\n---\n\n# V3 Examples\n\n## Subsystem\n\n### sanddance-specs\n* [sanddance-specs 2D vega specs tests](../tests/sanddance-specs/v2/) using UMD/CDN\n\n### deck.gl cube-layer\n* [cubeTest](../tests/v3/umd/cubeTest.html) using UMD/CDN\n\n### vega-deck.gl\n* [simple vega spec](../tests/v3/umd/vega-deck.gl.test.html) using UMD/CDN\n* [transition between vega specs](../tests/v3/umd/transition.html) using UMD/CDN\n\n## SandDance component v3\n* [simple scatterplot](../tests/v3/umd/test.html) using UMD/CDN\n* [scatterplot fetch + transform](../tests/v3/umd/transforms.html) using UMD/CDN\n* [scatterplot](../tests/v3/es6/sanddance-test-es6.html) using bundled ES6\n* [demovote scatterplot](../tests/v3/umd/scatterplotTest.html) using UMD/CDN\n* [qualitative barchart](../tests/v3/umd/qualBarChartTest.html) using UMD/CDN\n* [quantitative barchart](../tests/v3/umd/quanBarChartTest.html) using UMD/CDN\n* [titanic treemap](../tests/v3/umd/treeMapTest.html) using UMD/CDN\n\n## SandDance apps v3\n* [Web app](../tests/v3/es6/app)\n* [Embed the hosted SandDance Explorer via Iframe](../tests/v3/umd/embed.html)\n* [Power BI custom visual](../dist/powerbi/v3/SandDance201929976D117A654D0BAB8E96507442D80B.3.2.0.pbiviz) SandDance 2019\n* [Azure Data Studio extension](../dist/azdata/v3/azdata-sanddance-3.3.0.vsix)\n* [VSCode extension](../dist/vscode/v3/vscode-sanddance-3.3.0.vsix)\n"
  },
  {
    "path": "docs/external/js/react-dom.development.js",
    "content": "/** @license React v16.13.1\n * react-dom.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :\n  (global = global || self, factory(global.ReactDOM = {}, global.React));\n}(this, (function (exports, React) { 'use strict';\n\n  var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; // Prevent newer renderers from RTE when used with older react package versions.\n  // Current owner and dispatcher used to share the same ref,\n  // but PR #14548 split them out to better support the react-debug-tools package.\n\n  if (!ReactSharedInternals.hasOwnProperty('ReactCurrentDispatcher')) {\n    ReactSharedInternals.ReactCurrentDispatcher = {\n      current: null\n    };\n  }\n\n  if (!ReactSharedInternals.hasOwnProperty('ReactCurrentBatchConfig')) {\n    ReactSharedInternals.ReactCurrentBatchConfig = {\n      suspense: null\n    };\n  }\n\n  // by calls to these methods by a Babel plugin.\n  //\n  // In PROD (or in packages without access to React internals),\n  // they are left as they are instead.\n\n  function warn(format) {\n    {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      printWarning('warn', format, args);\n    }\n  }\n  function error(format) {\n    {\n      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        args[_key2 - 1] = arguments[_key2];\n      }\n\n      printWarning('error', format, args);\n    }\n  }\n\n  function printWarning(level, format, args) {\n    // When changing this logic, you might want to also\n    // update consoleWithStackDev.www.js as well.\n    {\n      var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n    in') === 0;\n\n      if (!hasExistingStack) {\n        var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n        var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n        if (stack !== '') {\n          format += '%s';\n          args = args.concat([stack]);\n        }\n      }\n\n      var argsWithFormat = args.map(function (item) {\n        return '' + item;\n      }); // Careful: RN currently depends on this prefix\n\n      argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n      // breaks IE9: https://github.com/facebook/react/issues/13610\n      // eslint-disable-next-line react-internal/no-production-logging\n\n      Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n      try {\n        // --- Welcome to debugging React ---\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        var argIndex = 0;\n        var message = 'Warning: ' + format.replace(/%s/g, function () {\n          return args[argIndex++];\n        });\n        throw new Error(message);\n      } catch (x) {}\n    }\n  }\n\n  if (!React) {\n    {\n      throw Error( \"ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.\" );\n    }\n  }\n\n  var invokeGuardedCallbackImpl = function (name, func, context, a, b, c, d, e, f) {\n    var funcArgs = Array.prototype.slice.call(arguments, 3);\n\n    try {\n      func.apply(context, funcArgs);\n    } catch (error) {\n      this.onError(error);\n    }\n  };\n\n  {\n    // In DEV mode, we swap out invokeGuardedCallback for a special version\n    // that plays more nicely with the browser's DevTools. The idea is to preserve\n    // \"Pause on exceptions\" behavior. Because React wraps all user-provided\n    // functions in invokeGuardedCallback, and the production version of\n    // invokeGuardedCallback uses a try-catch, all user exceptions are treated\n    // like caught exceptions, and the DevTools won't pause unless the developer\n    // takes the extra step of enabling pause on caught exceptions. This is\n    // unintuitive, though, because even though React has caught the error, from\n    // the developer's perspective, the error is uncaught.\n    //\n    // To preserve the expected \"Pause on exceptions\" behavior, we don't use a\n    // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake\n    // DOM node, and call the user-provided callback from inside an event handler\n    // for that fake event. If the callback throws, the error is \"captured\" using\n    // a global event handler. But because the error happens in a different\n    // event loop context, it does not interrupt the normal program flow.\n    // Effectively, this gives us try-catch behavior without actually using\n    // try-catch. Neat!\n    // Check that the browser supports the APIs we need to implement our special\n    // DEV version of invokeGuardedCallback\n    if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {\n      var fakeNode = document.createElement('react');\n\n      var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {\n        // If document doesn't exist we know for sure we will crash in this method\n        // when we call document.createEvent(). However this can cause confusing\n        // errors: https://github.com/facebookincubator/create-react-app/issues/3482\n        // So we preemptively throw with a better message instead.\n        if (!(typeof document !== 'undefined')) {\n          {\n            throw Error( \"The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous.\" );\n          }\n        }\n\n        var evt = document.createEvent('Event'); // Keeps track of whether the user-provided callback threw an error. We\n        // set this to true at the beginning, then set it to false right after\n        // calling the function. If the function errors, `didError` will never be\n        // set to false. This strategy works even if the browser is flaky and\n        // fails to call our global error handler, because it doesn't rely on\n        // the error event at all.\n\n        var didError = true; // Keeps track of the value of window.event so that we can reset it\n        // during the callback to let user code access window.event in the\n        // browsers that support it.\n\n        var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event\n        // dispatching: https://github.com/facebook/react/issues/13688\n\n        var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); // Create an event handler for our fake event. We will synchronously\n        // dispatch our fake event using `dispatchEvent`. Inside the handler, we\n        // call the user-provided callback.\n\n        var funcArgs = Array.prototype.slice.call(arguments, 3);\n\n        function callCallback() {\n          // We immediately remove the callback from event listeners so that\n          // nested `invokeGuardedCallback` calls do not clash. Otherwise, a\n          // nested call would trigger the fake event handlers of any call higher\n          // in the stack.\n          fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the\n          // window.event assignment in both IE <= 10 as they throw an error\n          // \"Member not found\" in strict mode, and in Firefox which does not\n          // support window.event.\n\n          if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {\n            window.event = windowEvent;\n          }\n\n          func.apply(context, funcArgs);\n          didError = false;\n        } // Create a global error event handler. We use this to capture the value\n        // that was thrown. It's possible that this error handler will fire more\n        // than once; for example, if non-React code also calls `dispatchEvent`\n        // and a handler for that event throws. We should be resilient to most of\n        // those cases. Even if our error event handler fires more than once, the\n        // last error event is always used. If the callback actually does error,\n        // we know that the last error event is the correct one, because it's not\n        // possible for anything else to have happened in between our callback\n        // erroring and the code that follows the `dispatchEvent` call below. If\n        // the callback doesn't error, but the error event was fired, we know to\n        // ignore it because `didError` will be false, as described above.\n\n\n        var error; // Use this to track whether the error event is ever called.\n\n        var didSetError = false;\n        var isCrossOriginError = false;\n\n        function handleWindowError(event) {\n          error = event.error;\n          didSetError = true;\n\n          if (error === null && event.colno === 0 && event.lineno === 0) {\n            isCrossOriginError = true;\n          }\n\n          if (event.defaultPrevented) {\n            // Some other error handler has prevented default.\n            // Browsers silence the error report if this happens.\n            // We'll remember this to later decide whether to log it or not.\n            if (error != null && typeof error === 'object') {\n              try {\n                error._suppressLogging = true;\n              } catch (inner) {// Ignore.\n              }\n            }\n          }\n        } // Create a fake event type.\n\n\n        var evtType = \"react-\" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers\n\n        window.addEventListener('error', handleWindowError);\n        fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function\n        // errors, it will trigger our global error handler.\n\n        evt.initEvent(evtType, false, false);\n        fakeNode.dispatchEvent(evt);\n\n        if (windowEventDescriptor) {\n          Object.defineProperty(window, 'event', windowEventDescriptor);\n        }\n\n        if (didError) {\n          if (!didSetError) {\n            // The callback errored, but the error event never fired.\n            error = new Error('An error was thrown inside one of your components, but React ' + \"doesn't know what it was. This is likely due to browser \" + 'flakiness. React does its best to preserve the \"Pause on ' + 'exceptions\" behavior of the DevTools, which requires some ' + \"DEV-mode only tricks. It's possible that these don't work in \" + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');\n          } else if (isCrossOriginError) {\n            error = new Error(\"A cross-origin error was thrown. React doesn't have access to \" + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');\n          }\n\n          this.onError(error);\n        } // Remove our event listeners\n\n\n        window.removeEventListener('error', handleWindowError);\n      };\n\n      invokeGuardedCallbackImpl = invokeGuardedCallbackDev;\n    }\n  }\n\n  var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;\n\n  var hasError = false;\n  var caughtError = null; // Used by event system to capture/rethrow the first error.\n\n  var hasRethrowError = false;\n  var rethrowError = null;\n  var reporter = {\n    onError: function (error) {\n      hasError = true;\n      caughtError = error;\n    }\n  };\n  /**\n   * Call a function while guarding against errors that happens within it.\n   * Returns an error if it throws, otherwise null.\n   *\n   * In production, this is implemented using a try-catch. The reason we don't\n   * use a try-catch directly is so that we can swap out a different\n   * implementation in DEV mode.\n   *\n   * @param {String} name of the guard to use for logging or debugging\n   * @param {Function} func The function to invoke\n   * @param {*} context The context to use when calling the function\n   * @param {...*} args Arguments for function\n   */\n\n  function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {\n    hasError = false;\n    caughtError = null;\n    invokeGuardedCallbackImpl$1.apply(reporter, arguments);\n  }\n  /**\n   * Same as invokeGuardedCallback, but instead of returning an error, it stores\n   * it in a global so it can be rethrown by `rethrowCaughtError` later.\n   * TODO: See if caughtError and rethrowError can be unified.\n   *\n   * @param {String} name of the guard to use for logging or debugging\n   * @param {Function} func The function to invoke\n   * @param {*} context The context to use when calling the function\n   * @param {...*} args Arguments for function\n   */\n\n  function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {\n    invokeGuardedCallback.apply(this, arguments);\n\n    if (hasError) {\n      var error = clearCaughtError();\n\n      if (!hasRethrowError) {\n        hasRethrowError = true;\n        rethrowError = error;\n      }\n    }\n  }\n  /**\n   * During execution of guarded functions we will capture the first error which\n   * we will rethrow to be handled by the top level error handler.\n   */\n\n  function rethrowCaughtError() {\n    if (hasRethrowError) {\n      var error = rethrowError;\n      hasRethrowError = false;\n      rethrowError = null;\n      throw error;\n    }\n  }\n  function hasCaughtError() {\n    return hasError;\n  }\n  function clearCaughtError() {\n    if (hasError) {\n      var error = caughtError;\n      hasError = false;\n      caughtError = null;\n      return error;\n    } else {\n      {\n        {\n          throw Error( \"clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n    }\n  }\n\n  var getFiberCurrentPropsFromNode = null;\n  var getInstanceFromNode = null;\n  var getNodeFromInstance = null;\n  function setComponentTree(getFiberCurrentPropsFromNodeImpl, getInstanceFromNodeImpl, getNodeFromInstanceImpl) {\n    getFiberCurrentPropsFromNode = getFiberCurrentPropsFromNodeImpl;\n    getInstanceFromNode = getInstanceFromNodeImpl;\n    getNodeFromInstance = getNodeFromInstanceImpl;\n\n    {\n      if (!getNodeFromInstance || !getInstanceFromNode) {\n        error('EventPluginUtils.setComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.');\n      }\n    }\n  }\n  var validateEventDispatches;\n\n  {\n    validateEventDispatches = function (event) {\n      var dispatchListeners = event._dispatchListeners;\n      var dispatchInstances = event._dispatchInstances;\n      var listenersIsArr = Array.isArray(dispatchListeners);\n      var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;\n      var instancesIsArr = Array.isArray(dispatchInstances);\n      var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;\n\n      if (instancesIsArr !== listenersIsArr || instancesLen !== listenersLen) {\n        error('EventPluginUtils: Invalid `event`.');\n      }\n    };\n  }\n  /**\n   * Dispatch the event to the listener.\n   * @param {SyntheticEvent} event SyntheticEvent to handle\n   * @param {function} listener Application-level callback\n   * @param {*} inst Internal component instance\n   */\n\n\n  function executeDispatch(event, listener, inst) {\n    var type = event.type || 'unknown-event';\n    event.currentTarget = getNodeFromInstance(inst);\n    invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);\n    event.currentTarget = null;\n  }\n  /**\n   * Standard/simple iteration through an event's collected dispatches.\n   */\n\n  function executeDispatchesInOrder(event) {\n    var dispatchListeners = event._dispatchListeners;\n    var dispatchInstances = event._dispatchInstances;\n\n    {\n      validateEventDispatches(event);\n    }\n\n    if (Array.isArray(dispatchListeners)) {\n      for (var i = 0; i < dispatchListeners.length; i++) {\n        if (event.isPropagationStopped()) {\n          break;\n        } // Listeners and Instances are two parallel arrays that are always in sync.\n\n\n        executeDispatch(event, dispatchListeners[i], dispatchInstances[i]);\n      }\n    } else if (dispatchListeners) {\n      executeDispatch(event, dispatchListeners, dispatchInstances);\n    }\n\n    event._dispatchListeners = null;\n    event._dispatchInstances = null;\n  }\n\n  var FunctionComponent = 0;\n  var ClassComponent = 1;\n  var IndeterminateComponent = 2; // Before we know whether it is function or class\n\n  var HostRoot = 3; // Root of a host tree. Could be nested inside another node.\n\n  var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\n\n  var HostComponent = 5;\n  var HostText = 6;\n  var Fragment = 7;\n  var Mode = 8;\n  var ContextConsumer = 9;\n  var ContextProvider = 10;\n  var ForwardRef = 11;\n  var Profiler = 12;\n  var SuspenseComponent = 13;\n  var MemoComponent = 14;\n  var SimpleMemoComponent = 15;\n  var LazyComponent = 16;\n  var IncompleteClassComponent = 17;\n  var DehydratedFragment = 18;\n  var SuspenseListComponent = 19;\n  var FundamentalComponent = 20;\n  var ScopeComponent = 21;\n  var Block = 22;\n\n  /**\n   * Injectable ordering of event plugins.\n   */\n  var eventPluginOrder = null;\n  /**\n   * Injectable mapping from names to event plugin modules.\n   */\n\n  var namesToPlugins = {};\n  /**\n   * Recomputes the plugin list using the injected plugins and plugin ordering.\n   *\n   * @private\n   */\n\n  function recomputePluginOrdering() {\n    if (!eventPluginOrder) {\n      // Wait until an `eventPluginOrder` is injected.\n      return;\n    }\n\n    for (var pluginName in namesToPlugins) {\n      var pluginModule = namesToPlugins[pluginName];\n      var pluginIndex = eventPluginOrder.indexOf(pluginName);\n\n      if (!(pluginIndex > -1)) {\n        {\n          throw Error( \"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `\" + pluginName + \"`.\" );\n        }\n      }\n\n      if (plugins[pluginIndex]) {\n        continue;\n      }\n\n      if (!pluginModule.extractEvents) {\n        {\n          throw Error( \"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `\" + pluginName + \"` does not.\" );\n        }\n      }\n\n      plugins[pluginIndex] = pluginModule;\n      var publishedEvents = pluginModule.eventTypes;\n\n      for (var eventName in publishedEvents) {\n        if (!publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName)) {\n          {\n            throw Error( \"EventPluginRegistry: Failed to publish event `\" + eventName + \"` for plugin `\" + pluginName + \"`.\" );\n          }\n        }\n      }\n    }\n  }\n  /**\n   * Publishes an event so that it can be dispatched by the supplied plugin.\n   *\n   * @param {object} dispatchConfig Dispatch configuration for the event.\n   * @param {object} PluginModule Plugin publishing the event.\n   * @return {boolean} True if the event was successfully published.\n   * @private\n   */\n\n\n  function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {\n    if (!!eventNameDispatchConfigs.hasOwnProperty(eventName)) {\n      {\n        throw Error( \"EventPluginRegistry: More than one plugin attempted to publish the same event name, `\" + eventName + \"`.\" );\n      }\n    }\n\n    eventNameDispatchConfigs[eventName] = dispatchConfig;\n    var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n\n    if (phasedRegistrationNames) {\n      for (var phaseName in phasedRegistrationNames) {\n        if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n          var phasedRegistrationName = phasedRegistrationNames[phaseName];\n          publishRegistrationName(phasedRegistrationName, pluginModule, eventName);\n        }\n      }\n\n      return true;\n    } else if (dispatchConfig.registrationName) {\n      publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);\n      return true;\n    }\n\n    return false;\n  }\n  /**\n   * Publishes a registration name that is used to identify dispatched events.\n   *\n   * @param {string} registrationName Registration name to add.\n   * @param {object} PluginModule Plugin publishing the event.\n   * @private\n   */\n\n\n  function publishRegistrationName(registrationName, pluginModule, eventName) {\n    if (!!registrationNameModules[registrationName]) {\n      {\n        throw Error( \"EventPluginRegistry: More than one plugin attempted to publish the same registration name, `\" + registrationName + \"`.\" );\n      }\n    }\n\n    registrationNameModules[registrationName] = pluginModule;\n    registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;\n\n    {\n      var lowerCasedName = registrationName.toLowerCase();\n      possibleRegistrationNames[lowerCasedName] = registrationName;\n\n      if (registrationName === 'onDoubleClick') {\n        possibleRegistrationNames.ondblclick = registrationName;\n      }\n    }\n  }\n  /**\n   * Registers plugins so that they can extract and dispatch events.\n   */\n\n  /**\n   * Ordered list of injected plugins.\n   */\n\n\n  var plugins = [];\n  /**\n   * Mapping from event name to dispatch config\n   */\n\n  var eventNameDispatchConfigs = {};\n  /**\n   * Mapping from registration name to plugin module\n   */\n\n  var registrationNameModules = {};\n  /**\n   * Mapping from registration name to event name\n   */\n\n  var registrationNameDependencies = {};\n  /**\n   * Mapping from lowercase registration names to the properly cased version,\n   * used to warn in the case of missing event handlers. Available\n   * only in true.\n   * @type {Object}\n   */\n\n  var possibleRegistrationNames =  {} ; // Trust the developer to only use possibleRegistrationNames in true\n\n  /**\n   * Injects an ordering of plugins (by plugin name). This allows the ordering\n   * to be decoupled from injection of the actual plugins so that ordering is\n   * always deterministic regardless of packaging, on-the-fly injection, etc.\n   *\n   * @param {array} InjectedEventPluginOrder\n   * @internal\n   */\n\n  function injectEventPluginOrder(injectedEventPluginOrder) {\n    if (!!eventPluginOrder) {\n      {\n        throw Error( \"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.\" );\n      }\n    } // Clone the ordering so it cannot be dynamically mutated.\n\n\n    eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);\n    recomputePluginOrdering();\n  }\n  /**\n   * Injects plugins to be used by plugin event system. The plugin names must be\n   * in the ordering injected by `injectEventPluginOrder`.\n   *\n   * Plugins can be injected as part of page initialization or on-the-fly.\n   *\n   * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n   * @internal\n   */\n\n  function injectEventPluginsByName(injectedNamesToPlugins) {\n    var isOrderingDirty = false;\n\n    for (var pluginName in injectedNamesToPlugins) {\n      if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n        continue;\n      }\n\n      var pluginModule = injectedNamesToPlugins[pluginName];\n\n      if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {\n        if (!!namesToPlugins[pluginName]) {\n          {\n            throw Error( \"EventPluginRegistry: Cannot inject two different event plugins using the same name, `\" + pluginName + \"`.\" );\n          }\n        }\n\n        namesToPlugins[pluginName] = pluginModule;\n        isOrderingDirty = true;\n      }\n    }\n\n    if (isOrderingDirty) {\n      recomputePluginOrdering();\n    }\n  }\n\n  var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');\n\n  var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n  var _assign = ReactInternals.assign;\n\n  var PLUGIN_EVENT_SYSTEM = 1;\n  var IS_REPLAYED = 1 << 5;\n  var IS_FIRST_ANCESTOR = 1 << 6;\n\n  var restoreImpl = null;\n  var restoreTarget = null;\n  var restoreQueue = null;\n\n  function restoreStateOfTarget(target) {\n    // We perform this translation at the end of the event loop so that we\n    // always receive the correct fiber here\n    var internalInstance = getInstanceFromNode(target);\n\n    if (!internalInstance) {\n      // Unmounted\n      return;\n    }\n\n    if (!(typeof restoreImpl === 'function')) {\n      {\n        throw Error( \"setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted.\n\n    if (stateNode) {\n      var _props = getFiberCurrentPropsFromNode(stateNode);\n\n      restoreImpl(internalInstance.stateNode, internalInstance.type, _props);\n    }\n  }\n\n  function setRestoreImplementation(impl) {\n    restoreImpl = impl;\n  }\n  function enqueueStateRestore(target) {\n    if (restoreTarget) {\n      if (restoreQueue) {\n        restoreQueue.push(target);\n      } else {\n        restoreQueue = [target];\n      }\n    } else {\n      restoreTarget = target;\n    }\n  }\n  function needsStateRestore() {\n    return restoreTarget !== null || restoreQueue !== null;\n  }\n  function restoreStateIfNeeded() {\n    if (!restoreTarget) {\n      return;\n    }\n\n    var target = restoreTarget;\n    var queuedTargets = restoreQueue;\n    restoreTarget = null;\n    restoreQueue = null;\n    restoreStateOfTarget(target);\n\n    if (queuedTargets) {\n      for (var i = 0; i < queuedTargets.length; i++) {\n        restoreStateOfTarget(queuedTargets[i]);\n      }\n    }\n  }\n\n  var enableProfilerTimer = true; // Trace which interactions trigger each commit.\n\n  var enableDeprecatedFlareAPI = false; // Experimental Host Component support.\n\n  var enableFundamentalAPI = false; // Experimental Scope support.\n  var warnAboutStringRefs = false;\n\n  // the renderer. Such as when we're dispatching events or if third party\n  // libraries need to call batchedUpdates. Eventually, this API will go away when\n  // everything is batched by default. We'll then have a similar API to opt-out of\n  // scheduled work and instead do synchronous work.\n  // Defaults\n\n  var batchedUpdatesImpl = function (fn, bookkeeping) {\n    return fn(bookkeeping);\n  };\n\n  var discreteUpdatesImpl = function (fn, a, b, c, d) {\n    return fn(a, b, c, d);\n  };\n\n  var flushDiscreteUpdatesImpl = function () {};\n\n  var batchedEventUpdatesImpl = batchedUpdatesImpl;\n  var isInsideEventHandler = false;\n  var isBatchingEventUpdates = false;\n\n  function finishEventHandler() {\n    // Here we wait until all updates have propagated, which is important\n    // when using controlled components within layers:\n    // https://github.com/facebook/react/issues/1698\n    // Then we restore state of any controlled component.\n    var controlledComponentsHavePendingUpdates = needsStateRestore();\n\n    if (controlledComponentsHavePendingUpdates) {\n      // If a controlled event was fired, we may need to restore the state of\n      // the DOM node back to the controlled value. This is necessary when React\n      // bails out of the update without touching the DOM.\n      flushDiscreteUpdatesImpl();\n      restoreStateIfNeeded();\n    }\n  }\n\n  function batchedUpdates(fn, bookkeeping) {\n    if (isInsideEventHandler) {\n      // If we are currently inside another batch, we need to wait until it\n      // fully completes before restoring state.\n      return fn(bookkeeping);\n    }\n\n    isInsideEventHandler = true;\n\n    try {\n      return batchedUpdatesImpl(fn, bookkeeping);\n    } finally {\n      isInsideEventHandler = false;\n      finishEventHandler();\n    }\n  }\n  function batchedEventUpdates(fn, a, b) {\n    if (isBatchingEventUpdates) {\n      // If we are currently inside another batch, we need to wait until it\n      // fully completes before restoring state.\n      return fn(a, b);\n    }\n\n    isBatchingEventUpdates = true;\n\n    try {\n      return batchedEventUpdatesImpl(fn, a, b);\n    } finally {\n      isBatchingEventUpdates = false;\n      finishEventHandler();\n    }\n  } // This is for the React Flare event system\n  function discreteUpdates(fn, a, b, c, d) {\n    var prevIsInsideEventHandler = isInsideEventHandler;\n    isInsideEventHandler = true;\n\n    try {\n      return discreteUpdatesImpl(fn, a, b, c, d);\n    } finally {\n      isInsideEventHandler = prevIsInsideEventHandler;\n\n      if (!isInsideEventHandler) {\n        finishEventHandler();\n      }\n    }\n  }\n  function flushDiscreteUpdatesIfNeeded(timeStamp) {\n    // event.timeStamp isn't overly reliable due to inconsistencies in\n    // how different browsers have historically provided the time stamp.\n    // Some browsers provide high-resolution time stamps for all events,\n    // some provide low-resolution time stamps for all events. FF < 52\n    // even mixes both time stamps together. Some browsers even report\n    // negative time stamps or time stamps that are 0 (iOS9) in some cases.\n    // Given we are only comparing two time stamps with equality (!==),\n    // we are safe from the resolution differences. If the time stamp is 0\n    // we bail-out of preventing the flush, which can affect semantics,\n    // such as if an earlier flush removes or adds event listeners that\n    // are fired in the subsequent flush. However, this is the same\n    // behaviour as we had before this change, so the risks are low.\n    if (!isInsideEventHandler && (!enableDeprecatedFlareAPI  )) {\n      flushDiscreteUpdatesImpl();\n    }\n  }\n  function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) {\n    batchedUpdatesImpl = _batchedUpdatesImpl;\n    discreteUpdatesImpl = _discreteUpdatesImpl;\n    flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl;\n    batchedEventUpdatesImpl = _batchedEventUpdatesImpl;\n  }\n\n  var DiscreteEvent = 0;\n  var UserBlockingEvent = 1;\n  var ContinuousEvent = 2;\n\n  var ReactInternals$1 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n  var _ReactInternals$Sched = ReactInternals$1.Scheduler,\n      unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback,\n      unstable_now = _ReactInternals$Sched.unstable_now,\n      unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback,\n      unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield,\n      unstable_requestPaint = _ReactInternals$Sched.unstable_requestPaint,\n      unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode,\n      unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority,\n      unstable_next = _ReactInternals$Sched.unstable_next,\n      unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution,\n      unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution,\n      unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel,\n      unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority,\n      unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority,\n      unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority,\n      unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority,\n      unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority,\n      unstable_forceFrameRate = _ReactInternals$Sched.unstable_forceFrameRate,\n      unstable_flushAllWithoutAsserting = _ReactInternals$Sched.unstable_flushAllWithoutAsserting;\n\n  // A reserved attribute.\n  // It is handled by React separately and shouldn't be written to the DOM.\n  var RESERVED = 0; // A simple string attribute.\n  // Attributes that aren't in the whitelist are presumed to have this type.\n\n  var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called\n  // \"enumerated\" attributes with \"true\" and \"false\" as possible values.\n  // When true, it should be set to a \"true\" string.\n  // When false, it should be set to a \"false\" string.\n\n  var BOOLEANISH_STRING = 2; // A real boolean attribute.\n  // When true, it should be present (set either to an empty string or its name).\n  // When false, it should be omitted.\n\n  var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.\n  // When true, it should be present (set either to an empty string or its name).\n  // When false, it should be omitted.\n  // For any other value, should be present with that value.\n\n  var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.\n  // When falsy, it should be removed.\n\n  var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.\n  // When falsy, it should be removed.\n\n  var POSITIVE_NUMERIC = 6;\n\n  /* eslint-disable max-len */\n  var ATTRIBUTE_NAME_START_CHAR = \":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n  /* eslint-enable max-len */\n\n  var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + \"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n  var ROOT_ATTRIBUTE_NAME = 'data-reactroot';\n  var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  var illegalAttributeNameCache = {};\n  var validatedAttributeNameCache = {};\n  function isAttributeNameSafe(attributeName) {\n    if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {\n      return true;\n    }\n\n    if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {\n      return false;\n    }\n\n    if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n      validatedAttributeNameCache[attributeName] = true;\n      return true;\n    }\n\n    illegalAttributeNameCache[attributeName] = true;\n\n    {\n      error('Invalid attribute name: `%s`', attributeName);\n    }\n\n    return false;\n  }\n  function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {\n    if (propertyInfo !== null) {\n      return propertyInfo.type === RESERVED;\n    }\n\n    if (isCustomComponentTag) {\n      return false;\n    }\n\n    if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {\n      return true;\n    }\n\n    return false;\n  }\n  function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {\n    if (propertyInfo !== null && propertyInfo.type === RESERVED) {\n      return false;\n    }\n\n    switch (typeof value) {\n      case 'function': // $FlowIssue symbol is perfectly valid here\n\n      case 'symbol':\n        // eslint-disable-line\n        return true;\n\n      case 'boolean':\n        {\n          if (isCustomComponentTag) {\n            return false;\n          }\n\n          if (propertyInfo !== null) {\n            return !propertyInfo.acceptsBooleans;\n          } else {\n            var prefix = name.toLowerCase().slice(0, 5);\n            return prefix !== 'data-' && prefix !== 'aria-';\n          }\n        }\n\n      default:\n        return false;\n    }\n  }\n  function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {\n    if (value === null || typeof value === 'undefined') {\n      return true;\n    }\n\n    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {\n      return true;\n    }\n\n    if (isCustomComponentTag) {\n      return false;\n    }\n\n    if (propertyInfo !== null) {\n      switch (propertyInfo.type) {\n        case BOOLEAN:\n          return !value;\n\n        case OVERLOADED_BOOLEAN:\n          return value === false;\n\n        case NUMERIC:\n          return isNaN(value);\n\n        case POSITIVE_NUMERIC:\n          return isNaN(value) || value < 1;\n      }\n    }\n\n    return false;\n  }\n  function getPropertyInfo(name) {\n    return properties.hasOwnProperty(name) ? properties[name] : null;\n  }\n\n  function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL) {\n    this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;\n    this.attributeName = attributeName;\n    this.attributeNamespace = attributeNamespace;\n    this.mustUseProperty = mustUseProperty;\n    this.propertyName = name;\n    this.type = type;\n    this.sanitizeURL = sanitizeURL;\n  } // When adding attributes to this list, be sure to also add them to\n  // the `possibleStandardNames` module to ensure casing and incorrect\n  // name warnings.\n\n\n  var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.\n\n  var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular\n  // elements (not just inputs). Now that ReactDOMInput assigns to the\n  // defaultValue property -- do we need this?\n  'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];\n\n  reservedProps.forEach(function (name) {\n    properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false);\n  }); // A few React string attributes have a different name.\n  // This is a mapping from React prop names to the attribute names.\n\n  [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {\n    var name = _ref[0],\n        attributeName = _ref[1];\n    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n    attributeName, // attributeName\n    null, // attributeNamespace\n    false);\n  }); // These are \"enumerated\" HTML attributes that accept \"true\" and \"false\".\n  // In React, we let users pass `true` and `false` even though technically\n  // these aren't boolean attributes (they are coerced to strings).\n\n  ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {\n    properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false);\n  }); // These are \"enumerated\" SVG attributes that accept \"true\" and \"false\".\n  // In React, we let users pass `true` and `false` even though technically\n  // these aren't boolean attributes (they are coerced to strings).\n  // Since these are SVG attributes, their attribute names are case-sensitive.\n\n  ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {\n    properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false);\n  }); // These are HTML boolean attributes.\n\n  ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM\n  // on the client side because the browsers are inconsistent. Instead we call focus().\n  'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata\n  'itemScope'].forEach(function (name) {\n    properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false);\n  }); // These are the few React props that we set as DOM properties\n  // rather than attributes. These are all booleans.\n\n  ['checked', // Note: `option.selected` is not updated if `select.multiple` is\n  // disabled with `removeAttribute`. We have special logic for handling this.\n  'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n  ].forEach(function (name) {\n    properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false);\n  }); // These are HTML attributes that are \"overloaded booleans\": they behave like\n  // booleans, but can also accept a string value.\n\n  ['capture', 'download' // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n  ].forEach(function (name) {\n    properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false);\n  }); // These are HTML attributes that must be positive numbers.\n\n  ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n  ].forEach(function (name) {\n    properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty\n    name, // attributeName\n    null, // attributeNamespace\n    false);\n  }); // These are HTML attributes that must be numbers.\n\n  ['rowSpan', 'start'].forEach(function (name) {\n    properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty\n    name.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false);\n  });\n  var CAMELIZE = /[\\-\\:]([a-z])/g;\n\n  var capitalize = function (token) {\n    return token[1].toUpperCase();\n  }; // This is a list of all SVG attributes that need special casing, namespacing,\n  // or boolean value assignment. Regular attributes that just accept strings\n  // and have the same names are omitted, just like in the HTML whitelist.\n  // Some of these attributes can be hard to find. This list was created by\n  // scraping the MDN documentation.\n\n\n  ['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n  ].forEach(function (attributeName) {\n    var name = attributeName.replace(CAMELIZE, capitalize);\n    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n    attributeName, null, // attributeNamespace\n    false);\n  }); // String SVG attributes with the xlink namespace.\n\n  ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n  ].forEach(function (attributeName) {\n    var name = attributeName.replace(CAMELIZE, capitalize);\n    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n    attributeName, 'http://www.w3.org/1999/xlink', false);\n  }); // String SVG attributes with the xml namespace.\n\n  ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,\n  // you'll need to set attributeName to name.toLowerCase()\n  // instead in the assignment below.\n  ].forEach(function (attributeName) {\n    var name = attributeName.replace(CAMELIZE, capitalize);\n    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n    attributeName, 'http://www.w3.org/XML/1998/namespace', false);\n  }); // These attribute exists both in HTML and SVG.\n  // The attribute name is case-sensitive in SVG so we can't just use\n  // the React name like we do for attributes that exist only in HTML.\n\n  ['tabIndex', 'crossOrigin'].forEach(function (attributeName) {\n    properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n    attributeName.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    false);\n  }); // These attributes accept URLs. These must not allow javascript: URLS.\n  // These will also need to accept Trusted Types object in the future.\n\n  var xlinkHref = 'xlinkHref';\n  properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty\n  'xlink:href', 'http://www.w3.org/1999/xlink', true);\n  ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {\n    properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n    attributeName.toLowerCase(), // attributeName\n    null, // attributeNamespace\n    true);\n  });\n\n  var ReactDebugCurrentFrame = null;\n\n  {\n    ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n  } // A javascript: URL can contain leading C0 control or \\u0020 SPACE,\n  // and any newline or tab are filtered out as if they're not part of the URL.\n  // https://url.spec.whatwg.org/#url-parsing\n  // Tab or newline are defined as \\r\\n\\t:\n  // https://infra.spec.whatwg.org/#ascii-tab-or-newline\n  // A C0 control is a code point in the range \\u0000 NULL to \\u001F\n  // INFORMATION SEPARATOR ONE, inclusive:\n  // https://infra.spec.whatwg.org/#c0-control-or-space\n\n  /* eslint-disable max-len */\n\n\n  var isJavaScriptProtocol = /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*\\:/i;\n  var didWarn = false;\n\n  function sanitizeURL(url) {\n    {\n      if (!didWarn && isJavaScriptProtocol.test(url)) {\n        didWarn = true;\n\n        error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));\n      }\n    }\n  }\n\n  /**\n   * Get the value for a property on a node. Only used in DEV for SSR validation.\n   * The \"expected\" argument is used as a hint of what the expected value is.\n   * Some properties have multiple equivalent values.\n   */\n  function getValueForProperty(node, name, expected, propertyInfo) {\n    {\n      if (propertyInfo.mustUseProperty) {\n        var propertyName = propertyInfo.propertyName;\n        return node[propertyName];\n      } else {\n        if ( propertyInfo.sanitizeURL) {\n          // If we haven't fully disabled javascript: URLs, and if\n          // the hydration is successful of a javascript: URL, we\n          // still want to warn on the client.\n          sanitizeURL('' + expected);\n        }\n\n        var attributeName = propertyInfo.attributeName;\n        var stringValue = null;\n\n        if (propertyInfo.type === OVERLOADED_BOOLEAN) {\n          if (node.hasAttribute(attributeName)) {\n            var value = node.getAttribute(attributeName);\n\n            if (value === '') {\n              return true;\n            }\n\n            if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n              return value;\n            }\n\n            if (value === '' + expected) {\n              return expected;\n            }\n\n            return value;\n          }\n        } else if (node.hasAttribute(attributeName)) {\n          if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n            // We had an attribute but shouldn't have had one, so read it\n            // for the error message.\n            return node.getAttribute(attributeName);\n          }\n\n          if (propertyInfo.type === BOOLEAN) {\n            // If this was a boolean, it doesn't matter what the value is\n            // the fact that we have it is the same as the expected.\n            return expected;\n          } // Even if this property uses a namespace we use getAttribute\n          // because we assume its namespaced name is the same as our config.\n          // To use getAttributeNS we need the local name which we don't have\n          // in our config atm.\n\n\n          stringValue = node.getAttribute(attributeName);\n        }\n\n        if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n          return stringValue === null ? expected : stringValue;\n        } else if (stringValue === '' + expected) {\n          return expected;\n        } else {\n          return stringValue;\n        }\n      }\n    }\n  }\n  /**\n   * Get the value for a attribute on a node. Only used in DEV for SSR validation.\n   * The third argument is used as a hint of what the expected value is. Some\n   * attributes have multiple equivalent values.\n   */\n\n  function getValueForAttribute(node, name, expected) {\n    {\n      if (!isAttributeNameSafe(name)) {\n        return;\n      }\n\n      if (!node.hasAttribute(name)) {\n        return expected === undefined ? undefined : null;\n      }\n\n      var value = node.getAttribute(name);\n\n      if (value === '' + expected) {\n        return expected;\n      }\n\n      return value;\n    }\n  }\n  /**\n   * Sets the value for a property on a node.\n   *\n   * @param {DOMElement} node\n   * @param {string} name\n   * @param {*} value\n   */\n\n  function setValueForProperty(node, name, value, isCustomComponentTag) {\n    var propertyInfo = getPropertyInfo(name);\n\n    if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {\n      return;\n    }\n\n    if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {\n      value = null;\n    } // If the prop isn't in the special list, treat it as a simple attribute.\n\n\n    if (isCustomComponentTag || propertyInfo === null) {\n      if (isAttributeNameSafe(name)) {\n        var _attributeName = name;\n\n        if (value === null) {\n          node.removeAttribute(_attributeName);\n        } else {\n          node.setAttribute(_attributeName,  '' + value);\n        }\n      }\n\n      return;\n    }\n\n    var mustUseProperty = propertyInfo.mustUseProperty;\n\n    if (mustUseProperty) {\n      var propertyName = propertyInfo.propertyName;\n\n      if (value === null) {\n        var type = propertyInfo.type;\n        node[propertyName] = type === BOOLEAN ? false : '';\n      } else {\n        // Contrary to `setAttribute`, object properties are properly\n        // `toString`ed by IE8/9.\n        node[propertyName] = value;\n      }\n\n      return;\n    } // The rest are treated as attributes with special cases.\n\n\n    var attributeName = propertyInfo.attributeName,\n        attributeNamespace = propertyInfo.attributeNamespace;\n\n    if (value === null) {\n      node.removeAttribute(attributeName);\n    } else {\n      var _type = propertyInfo.type;\n      var attributeValue;\n\n      if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {\n        // If attribute type is boolean, we know for sure it won't be an execution sink\n        // and we won't require Trusted Type here.\n        attributeValue = '';\n      } else {\n        // `setAttribute` with objects becomes only `[object]` in IE8/9,\n        // ('' + value) makes it output the correct toString()-value.\n        {\n          attributeValue = '' + value;\n        }\n\n        if (propertyInfo.sanitizeURL) {\n          sanitizeURL(attributeValue.toString());\n        }\n      }\n\n      if (attributeNamespace) {\n        node.setAttributeNS(attributeNamespace, attributeName, attributeValue);\n      } else {\n        node.setAttribute(attributeName, attributeValue);\n      }\n    }\n  }\n\n  var BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\n  function describeComponentFrame (name, source, ownerName) {\n    var sourceInfo = '';\n\n    if (source) {\n      var path = source.fileName;\n      var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n      {\n        // In DEV, include code for a common special case:\n        // prefer \"folder/index.js\" instead of just \"index.js\".\n        if (/^index\\./.test(fileName)) {\n          var match = path.match(BEFORE_SLASH_RE);\n\n          if (match) {\n            var pathBeforeSlash = match[1];\n\n            if (pathBeforeSlash) {\n              var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n              fileName = folderName + '/' + fileName;\n            }\n          }\n        }\n      }\n\n      sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n    } else if (ownerName) {\n      sourceInfo = ' (created by ' + ownerName + ')';\n    }\n\n    return '\\n    in ' + (name || 'Unknown') + sourceInfo;\n  }\n\n  // The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n  // nor polyfill, then a plain number is used for performance.\n  var hasSymbol = typeof Symbol === 'function' && Symbol.for;\n  var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\n  var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\n  var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\n  var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\n  var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\n  var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\n  var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n  var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\n  var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\n  var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\n  var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\n  var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\n  var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\n  var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\n  var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n  var FAUX_ITERATOR_SYMBOL = '@@iterator';\n  function getIteratorFn(maybeIterable) {\n    if (maybeIterable === null || typeof maybeIterable !== 'object') {\n      return null;\n    }\n\n    var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n    if (typeof maybeIterator === 'function') {\n      return maybeIterator;\n    }\n\n    return null;\n  }\n\n  var Uninitialized = -1;\n  var Pending = 0;\n  var Resolved = 1;\n  var Rejected = 2;\n  function refineResolvedLazyComponent(lazyComponent) {\n    return lazyComponent._status === Resolved ? lazyComponent._result : null;\n  }\n  function initializeLazyComponentType(lazyComponent) {\n    if (lazyComponent._status === Uninitialized) {\n      lazyComponent._status = Pending;\n      var ctor = lazyComponent._ctor;\n      var thenable = ctor();\n      lazyComponent._result = thenable;\n      thenable.then(function (moduleObject) {\n        if (lazyComponent._status === Pending) {\n          var defaultExport = moduleObject.default;\n\n          {\n            if (defaultExport === undefined) {\n              error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\\n\\nYour code should look like: \\n  ' + \"const MyComponent = lazy(() => import('./MyComponent'))\", moduleObject);\n            }\n          }\n\n          lazyComponent._status = Resolved;\n          lazyComponent._result = defaultExport;\n        }\n      }, function (error) {\n        if (lazyComponent._status === Pending) {\n          lazyComponent._status = Rejected;\n          lazyComponent._result = error;\n        }\n      });\n    }\n  }\n\n  function getWrappedName(outerType, innerType, wrapperName) {\n    var functionName = innerType.displayName || innerType.name || '';\n    return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n  }\n\n  function getComponentName(type) {\n    if (type == null) {\n      // Host root, text node or just invalid type.\n      return null;\n    }\n\n    {\n      if (typeof type.tag === 'number') {\n        error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n      }\n    }\n\n    if (typeof type === 'function') {\n      return type.displayName || type.name || null;\n    }\n\n    if (typeof type === 'string') {\n      return type;\n    }\n\n    switch (type) {\n      case REACT_FRAGMENT_TYPE:\n        return 'Fragment';\n\n      case REACT_PORTAL_TYPE:\n        return 'Portal';\n\n      case REACT_PROFILER_TYPE:\n        return \"Profiler\";\n\n      case REACT_STRICT_MODE_TYPE:\n        return 'StrictMode';\n\n      case REACT_SUSPENSE_TYPE:\n        return 'Suspense';\n\n      case REACT_SUSPENSE_LIST_TYPE:\n        return 'SuspenseList';\n    }\n\n    if (typeof type === 'object') {\n      switch (type.$$typeof) {\n        case REACT_CONTEXT_TYPE:\n          return 'Context.Consumer';\n\n        case REACT_PROVIDER_TYPE:\n          return 'Context.Provider';\n\n        case REACT_FORWARD_REF_TYPE:\n          return getWrappedName(type, type.render, 'ForwardRef');\n\n        case REACT_MEMO_TYPE:\n          return getComponentName(type.type);\n\n        case REACT_BLOCK_TYPE:\n          return getComponentName(type.render);\n\n        case REACT_LAZY_TYPE:\n          {\n            var thenable = type;\n            var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n            if (resolvedThenable) {\n              return getComponentName(resolvedThenable);\n            }\n\n            break;\n          }\n      }\n    }\n\n    return null;\n  }\n\n  var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;\n\n  function describeFiber(fiber) {\n    switch (fiber.tag) {\n      case HostRoot:\n      case HostPortal:\n      case HostText:\n      case Fragment:\n      case ContextProvider:\n      case ContextConsumer:\n        return '';\n\n      default:\n        var owner = fiber._debugOwner;\n        var source = fiber._debugSource;\n        var name = getComponentName(fiber.type);\n        var ownerName = null;\n\n        if (owner) {\n          ownerName = getComponentName(owner.type);\n        }\n\n        return describeComponentFrame(name, source, ownerName);\n    }\n  }\n\n  function getStackByFiberInDevAndProd(workInProgress) {\n    var info = '';\n    var node = workInProgress;\n\n    do {\n      info += describeFiber(node);\n      node = node.return;\n    } while (node);\n\n    return info;\n  }\n  var current = null;\n  var isRendering = false;\n  function getCurrentFiberOwnerNameInDevOrNull() {\n    {\n      if (current === null) {\n        return null;\n      }\n\n      var owner = current._debugOwner;\n\n      if (owner !== null && typeof owner !== 'undefined') {\n        return getComponentName(owner.type);\n      }\n    }\n\n    return null;\n  }\n  function getCurrentFiberStackInDev() {\n    {\n      if (current === null) {\n        return '';\n      } // Safe because if current fiber exists, we are reconciling,\n      // and it is guaranteed to be the work-in-progress version.\n\n\n      return getStackByFiberInDevAndProd(current);\n    }\n  }\n  function resetCurrentFiber() {\n    {\n      ReactDebugCurrentFrame$1.getCurrentStack = null;\n      current = null;\n      isRendering = false;\n    }\n  }\n  function setCurrentFiber(fiber) {\n    {\n      ReactDebugCurrentFrame$1.getCurrentStack = getCurrentFiberStackInDev;\n      current = fiber;\n      isRendering = false;\n    }\n  }\n  function setIsRendering(rendering) {\n    {\n      isRendering = rendering;\n    }\n  }\n\n  // Flow does not allow string concatenation of most non-string types. To work\n  // around this limitation, we use an opaque type that can only be obtained by\n  // passing the value through getToStringValue first.\n  function toString(value) {\n    return '' + value;\n  }\n  function getToStringValue(value) {\n    switch (typeof value) {\n      case 'boolean':\n      case 'number':\n      case 'object':\n      case 'string':\n      case 'undefined':\n        return value;\n\n      default:\n        // function, symbol are assigned as empty strings\n        return '';\n    }\n  }\n\n  /**\n   * Copyright (c) 2013-present, Facebook, Inc.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   */\n\n  var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\n  var ReactPropTypesSecret_1 = ReactPropTypesSecret;\n\n  var printWarning$1 = function() {};\n\n  {\n    var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;\n    var loggedTypeFailures = {};\n    var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n    printWarning$1 = function(text) {\n      var message = 'Warning: ' + text;\n      if (typeof console !== 'undefined') {\n        console.error(message);\n      }\n      try {\n        // --- Welcome to debugging React ---\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        throw new Error(message);\n      } catch (x) {}\n    };\n  }\n\n  /**\n   * Assert that the values match with the type specs.\n   * Error messages are memorized and will only be shown once.\n   *\n   * @param {object} typeSpecs Map of name to a ReactPropType\n   * @param {object} values Runtime values that need to be type-checked\n   * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n   * @param {string} componentName Name of the component for error messages.\n   * @param {?Function} getStack Returns the component stack.\n   * @private\n   */\n  function checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n    {\n      for (var typeSpecName in typeSpecs) {\n        if (has(typeSpecs, typeSpecName)) {\n          var error;\n          // Prop type validation may throw. In case they do, we don't want to\n          // fail the render phase where it didn't fail before. So we log it.\n          // After these have been cleaned up, we'll let them throw.\n          try {\n            // This is intentionally an invariant that gets caught. It's the same\n            // behavior as without this statement except with a better message.\n            if (typeof typeSpecs[typeSpecName] !== 'function') {\n              var err = Error(\n                (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n                'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'\n              );\n              err.name = 'Invariant Violation';\n              throw err;\n            }\n            error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1);\n          } catch (ex) {\n            error = ex;\n          }\n          if (error && !(error instanceof Error)) {\n            printWarning$1(\n              (componentName || 'React class') + ': type specification of ' +\n              location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n              'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n              'You may have forgotten to pass an argument to the type checker ' +\n              'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n              'shape all require an argument).'\n            );\n          }\n          if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n            // Only monitor this failure once because there tends to be a lot of the\n            // same error.\n            loggedTypeFailures[error.message] = true;\n\n            var stack = getStack ? getStack() : '';\n\n            printWarning$1(\n              'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n            );\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Resets warning cache when testing.\n   *\n   * @private\n   */\n  checkPropTypes.resetWarningCache = function() {\n    {\n      loggedTypeFailures = {};\n    }\n  };\n\n  var checkPropTypes_1 = checkPropTypes;\n\n  var ReactDebugCurrentFrame$2 = null;\n  var ReactControlledValuePropTypes = {\n    checkPropTypes: null\n  };\n\n  {\n    ReactDebugCurrentFrame$2 = ReactSharedInternals.ReactDebugCurrentFrame;\n    var hasReadOnlyValue = {\n      button: true,\n      checkbox: true,\n      image: true,\n      hidden: true,\n      radio: true,\n      reset: true,\n      submit: true\n    };\n    var propTypes = {\n      value: function (props, propName, componentName) {\n        if (hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {\n          return null;\n        }\n\n        return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n      },\n      checked: function (props, propName, componentName) {\n        if (props.onChange || props.readOnly || props.disabled || props[propName] == null || enableDeprecatedFlareAPI ) {\n          return null;\n        }\n\n        return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n      }\n    };\n    /**\n     * Provide a linked `value` attribute for controlled forms. You should not use\n     * this outside of the ReactDOM controlled form components.\n     */\n\n    ReactControlledValuePropTypes.checkPropTypes = function (tagName, props) {\n      checkPropTypes_1(propTypes, props, 'prop', tagName, ReactDebugCurrentFrame$2.getStackAddendum);\n    };\n  }\n\n  function isCheckable(elem) {\n    var type = elem.type;\n    var nodeName = elem.nodeName;\n    return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');\n  }\n\n  function getTracker(node) {\n    return node._valueTracker;\n  }\n\n  function detachTracker(node) {\n    node._valueTracker = null;\n  }\n\n  function getValueFromNode(node) {\n    var value = '';\n\n    if (!node) {\n      return value;\n    }\n\n    if (isCheckable(node)) {\n      value = node.checked ? 'true' : 'false';\n    } else {\n      value = node.value;\n    }\n\n    return value;\n  }\n\n  function trackValueOnNode(node) {\n    var valueField = isCheckable(node) ? 'checked' : 'value';\n    var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);\n    var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail\n    // and don't track value will cause over reporting of changes,\n    // but it's better then a hard failure\n    // (needed for certain tests that spyOn input values and Safari)\n\n    if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {\n      return;\n    }\n\n    var get = descriptor.get,\n        set = descriptor.set;\n    Object.defineProperty(node, valueField, {\n      configurable: true,\n      get: function () {\n        return get.call(this);\n      },\n      set: function (value) {\n        currentValue = '' + value;\n        set.call(this, value);\n      }\n    }); // We could've passed this the first time\n    // but it triggers a bug in IE11 and Edge 14/15.\n    // Calling defineProperty() again should be equivalent.\n    // https://github.com/facebook/react/issues/11768\n\n    Object.defineProperty(node, valueField, {\n      enumerable: descriptor.enumerable\n    });\n    var tracker = {\n      getValue: function () {\n        return currentValue;\n      },\n      setValue: function (value) {\n        currentValue = '' + value;\n      },\n      stopTracking: function () {\n        detachTracker(node);\n        delete node[valueField];\n      }\n    };\n    return tracker;\n  }\n\n  function track(node) {\n    if (getTracker(node)) {\n      return;\n    } // TODO: Once it's just Fiber we can move this to node._wrapperState\n\n\n    node._valueTracker = trackValueOnNode(node);\n  }\n  function updateValueIfChanged(node) {\n    if (!node) {\n      return false;\n    }\n\n    var tracker = getTracker(node); // if there is no tracker at this point it's unlikely\n    // that trying again will succeed\n\n    if (!tracker) {\n      return true;\n    }\n\n    var lastValue = tracker.getValue();\n    var nextValue = getValueFromNode(node);\n\n    if (nextValue !== lastValue) {\n      tracker.setValue(nextValue);\n      return true;\n    }\n\n    return false;\n  }\n\n  var didWarnValueDefaultValue = false;\n  var didWarnCheckedDefaultChecked = false;\n  var didWarnControlledToUncontrolled = false;\n  var didWarnUncontrolledToControlled = false;\n\n  function isControlled(props) {\n    var usesChecked = props.type === 'checkbox' || props.type === 'radio';\n    return usesChecked ? props.checked != null : props.value != null;\n  }\n  /**\n   * Implements an <input> host component that allows setting these optional\n   * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n   *\n   * If `checked` or `value` are not supplied (or null/undefined), user actions\n   * that affect the checked state or value will trigger updates to the element.\n   *\n   * If they are supplied (and not null/undefined), the rendered element will not\n   * trigger updates to the element. Instead, the props must change in order for\n   * the rendered element to be updated.\n   *\n   * The rendered element will be initialized as unchecked (or `defaultChecked`)\n   * with an empty value (or `defaultValue`).\n   *\n   * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n   */\n\n\n  function getHostProps(element, props) {\n    var node = element;\n    var checked = props.checked;\n\n    var hostProps = _assign({}, props, {\n      defaultChecked: undefined,\n      defaultValue: undefined,\n      value: undefined,\n      checked: checked != null ? checked : node._wrapperState.initialChecked\n    });\n\n    return hostProps;\n  }\n  function initWrapperState(element, props) {\n    {\n      ReactControlledValuePropTypes.checkPropTypes('input', props);\n\n      if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {\n        error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n        didWarnCheckedDefaultChecked = true;\n      }\n\n      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {\n        error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n        didWarnValueDefaultValue = true;\n      }\n    }\n\n    var node = element;\n    var defaultValue = props.defaultValue == null ? '' : props.defaultValue;\n    node._wrapperState = {\n      initialChecked: props.checked != null ? props.checked : props.defaultChecked,\n      initialValue: getToStringValue(props.value != null ? props.value : defaultValue),\n      controlled: isControlled(props)\n    };\n  }\n  function updateChecked(element, props) {\n    var node = element;\n    var checked = props.checked;\n\n    if (checked != null) {\n      setValueForProperty(node, 'checked', checked, false);\n    }\n  }\n  function updateWrapper(element, props) {\n    var node = element;\n\n    {\n      var controlled = isControlled(props);\n\n      if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {\n        error('A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);\n\n        didWarnUncontrolledToControlled = true;\n      }\n\n      if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {\n        error('A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components', props.type);\n\n        didWarnControlledToUncontrolled = true;\n      }\n    }\n\n    updateChecked(element, props);\n    var value = getToStringValue(props.value);\n    var type = props.type;\n\n    if (value != null) {\n      if (type === 'number') {\n        if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.\n        // eslint-disable-next-line\n        node.value != value) {\n          node.value = toString(value);\n        }\n      } else if (node.value !== toString(value)) {\n        node.value = toString(value);\n      }\n    } else if (type === 'submit' || type === 'reset') {\n      // Submit/reset inputs need the attribute removed completely to avoid\n      // blank-text buttons.\n      node.removeAttribute('value');\n      return;\n    }\n\n    {\n      // When syncing the value attribute, the value comes from a cascade of\n      // properties:\n      //  1. The value React property\n      //  2. The defaultValue React property\n      //  3. Otherwise there should be no change\n      if (props.hasOwnProperty('value')) {\n        setDefaultValue(node, props.type, value);\n      } else if (props.hasOwnProperty('defaultValue')) {\n        setDefaultValue(node, props.type, getToStringValue(props.defaultValue));\n      }\n    }\n\n    {\n      // When syncing the checked attribute, it only changes when it needs\n      // to be removed, such as transitioning from a checkbox into a text input\n      if (props.checked == null && props.defaultChecked != null) {\n        node.defaultChecked = !!props.defaultChecked;\n      }\n    }\n  }\n  function postMountWrapper(element, props, isHydrating) {\n    var node = element; // Do not assign value if it is already set. This prevents user text input\n    // from being lost during SSR hydration.\n\n    if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {\n      var type = props.type;\n      var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the\n      // default value provided by the browser. See: #12872\n\n      if (isButton && (props.value === undefined || props.value === null)) {\n        return;\n      }\n\n      var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input\n      // from being lost during SSR hydration.\n\n      if (!isHydrating) {\n        {\n          // When syncing the value attribute, the value property should use\n          // the wrapperState._initialValue property. This uses:\n          //\n          //   1. The value React property when present\n          //   2. The defaultValue React property when present\n          //   3. An empty string\n          if (initialValue !== node.value) {\n            node.value = initialValue;\n          }\n        }\n      }\n\n      {\n        // Otherwise, the value attribute is synchronized to the property,\n        // so we assign defaultValue to the same thing as the value property\n        // assignment step above.\n        node.defaultValue = initialValue;\n      }\n    } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug\n    // this is needed to work around a chrome bug where setting defaultChecked\n    // will sometimes influence the value of checked (even after detachment).\n    // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416\n    // We need to temporarily unset name to avoid disrupting radio button groups.\n\n\n    var name = node.name;\n\n    if (name !== '') {\n      node.name = '';\n    }\n\n    {\n      // When syncing the checked attribute, both the checked property and\n      // attribute are assigned at the same time using defaultChecked. This uses:\n      //\n      //   1. The checked React property when present\n      //   2. The defaultChecked React property when present\n      //   3. Otherwise, false\n      node.defaultChecked = !node.defaultChecked;\n      node.defaultChecked = !!node._wrapperState.initialChecked;\n    }\n\n    if (name !== '') {\n      node.name = name;\n    }\n  }\n  function restoreControlledState(element, props) {\n    var node = element;\n    updateWrapper(node, props);\n    updateNamedCousins(node, props);\n  }\n\n  function updateNamedCousins(rootNode, props) {\n    var name = props.name;\n\n    if (props.type === 'radio' && name != null) {\n      var queryRoot = rootNode;\n\n      while (queryRoot.parentNode) {\n        queryRoot = queryRoot.parentNode;\n      } // If `rootNode.form` was non-null, then we could try `form.elements`,\n      // but that sometimes behaves strangely in IE8. We could also try using\n      // `form.getElementsByName`, but that will only return direct children\n      // and won't include inputs that use the HTML5 `form=` attribute. Since\n      // the input might not even be in a form. It might not even be in the\n      // document. Let's just use the local `querySelectorAll` to ensure we don't\n      // miss anything.\n\n\n      var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n      for (var i = 0; i < group.length; i++) {\n        var otherNode = group[i];\n\n        if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n          continue;\n        } // This will throw if radio buttons rendered by different copies of React\n        // and the same name are rendered into the same form (same as #1939).\n        // That's probably okay; we don't support it just as we don't support\n        // mixing React radio buttons with non-React ones.\n\n\n        var otherProps = getFiberCurrentPropsFromNode$1(otherNode);\n\n        if (!otherProps) {\n          {\n            throw Error( \"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.\" );\n          }\n        } // We need update the tracked value on the named cousin since the value\n        // was changed but the input saw no event or value set\n\n\n        updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that\n        // was previously checked to update will cause it to be come re-checked\n        // as appropriate.\n\n        updateWrapper(otherNode, otherProps);\n      }\n    }\n  } // In Chrome, assigning defaultValue to certain input types triggers input validation.\n  // For number inputs, the display value loses trailing decimal points. For email inputs,\n  // Chrome raises \"The specified value <x> is not a valid email address\".\n  //\n  // Here we check to see if the defaultValue has actually changed, avoiding these problems\n  // when the user is inputting text\n  //\n  // https://github.com/facebook/react/issues/7253\n\n\n  function setDefaultValue(node, type, value) {\n    if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js\n    type !== 'number' || node.ownerDocument.activeElement !== node) {\n      if (value == null) {\n        node.defaultValue = toString(node._wrapperState.initialValue);\n      } else if (node.defaultValue !== toString(value)) {\n        node.defaultValue = toString(value);\n      }\n    }\n  }\n\n  var didWarnSelectedSetOnOption = false;\n  var didWarnInvalidChild = false;\n\n  function flattenChildren(children) {\n    var content = ''; // Flatten children. We'll warn if they are invalid\n    // during validateProps() which runs for hydration too.\n    // Note that this would throw on non-element objects.\n    // Elements are stringified (which is normally irrelevant\n    // but matters for <fbt>).\n\n    React.Children.forEach(children, function (child) {\n      if (child == null) {\n        return;\n      }\n\n      content += child; // Note: we don't warn about invalid children here.\n      // Instead, this is done separately below so that\n      // it happens during the hydration codepath too.\n    });\n    return content;\n  }\n  /**\n   * Implements an <option> host component that warns when `selected` is set.\n   */\n\n\n  function validateProps(element, props) {\n    {\n      // This mirrors the codepath above, but runs for hydration too.\n      // Warn about invalid children here so that client and hydration are consistent.\n      // TODO: this seems like it could cause a DEV-only throw for hydration\n      // if children contains a non-element object. We should try to avoid that.\n      if (typeof props.children === 'object' && props.children !== null) {\n        React.Children.forEach(props.children, function (child) {\n          if (child == null) {\n            return;\n          }\n\n          if (typeof child === 'string' || typeof child === 'number') {\n            return;\n          }\n\n          if (typeof child.type !== 'string') {\n            return;\n          }\n\n          if (!didWarnInvalidChild) {\n            didWarnInvalidChild = true;\n\n            error('Only strings and numbers are supported as <option> children.');\n          }\n        });\n      } // TODO: Remove support for `selected` in <option>.\n\n\n      if (props.selected != null && !didWarnSelectedSetOnOption) {\n        error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');\n\n        didWarnSelectedSetOnOption = true;\n      }\n    }\n  }\n  function postMountWrapper$1(element, props) {\n    // value=\"\" should make a value attribute (#6219)\n    if (props.value != null) {\n      element.setAttribute('value', toString(getToStringValue(props.value)));\n    }\n  }\n  function getHostProps$1(element, props) {\n    var hostProps = _assign({\n      children: undefined\n    }, props);\n\n    var content = flattenChildren(props.children);\n\n    if (content) {\n      hostProps.children = content;\n    }\n\n    return hostProps;\n  }\n\n  var didWarnValueDefaultValue$1;\n\n  {\n    didWarnValueDefaultValue$1 = false;\n  }\n\n  function getDeclarationErrorAddendum() {\n    var ownerName = getCurrentFiberOwnerNameInDevOrNull();\n\n    if (ownerName) {\n      return '\\n\\nCheck the render method of `' + ownerName + '`.';\n    }\n\n    return '';\n  }\n\n  var valuePropNames = ['value', 'defaultValue'];\n  /**\n   * Validation function for `value` and `defaultValue`.\n   */\n\n  function checkSelectPropTypes(props) {\n    {\n      ReactControlledValuePropTypes.checkPropTypes('select', props);\n\n      for (var i = 0; i < valuePropNames.length; i++) {\n        var propName = valuePropNames[i];\n\n        if (props[propName] == null) {\n          continue;\n        }\n\n        var isArray = Array.isArray(props[propName]);\n\n        if (props.multiple && !isArray) {\n          error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());\n        } else if (!props.multiple && isArray) {\n          error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());\n        }\n      }\n    }\n  }\n\n  function updateOptions(node, multiple, propValue, setDefaultSelected) {\n    var options = node.options;\n\n    if (multiple) {\n      var selectedValues = propValue;\n      var selectedValue = {};\n\n      for (var i = 0; i < selectedValues.length; i++) {\n        // Prefix to avoid chaos with special keys.\n        selectedValue['$' + selectedValues[i]] = true;\n      }\n\n      for (var _i = 0; _i < options.length; _i++) {\n        var selected = selectedValue.hasOwnProperty('$' + options[_i].value);\n\n        if (options[_i].selected !== selected) {\n          options[_i].selected = selected;\n        }\n\n        if (selected && setDefaultSelected) {\n          options[_i].defaultSelected = true;\n        }\n      }\n    } else {\n      // Do not set `select.value` as exact behavior isn't consistent across all\n      // browsers for all cases.\n      var _selectedValue = toString(getToStringValue(propValue));\n\n      var defaultSelected = null;\n\n      for (var _i2 = 0; _i2 < options.length; _i2++) {\n        if (options[_i2].value === _selectedValue) {\n          options[_i2].selected = true;\n\n          if (setDefaultSelected) {\n            options[_i2].defaultSelected = true;\n          }\n\n          return;\n        }\n\n        if (defaultSelected === null && !options[_i2].disabled) {\n          defaultSelected = options[_i2];\n        }\n      }\n\n      if (defaultSelected !== null) {\n        defaultSelected.selected = true;\n      }\n    }\n  }\n  /**\n   * Implements a <select> host component that allows optionally setting the\n   * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n   * stringable. If `multiple` is true, the prop must be an array of stringables.\n   *\n   * If `value` is not supplied (or null/undefined), user actions that change the\n   * selected option will trigger updates to the rendered options.\n   *\n   * If it is supplied (and not null/undefined), the rendered options will not\n   * update in response to user actions. Instead, the `value` prop must change in\n   * order for the rendered options to update.\n   *\n   * If `defaultValue` is provided, any options with the supplied values will be\n   * selected.\n   */\n\n\n  function getHostProps$2(element, props) {\n    return _assign({}, props, {\n      value: undefined\n    });\n  }\n  function initWrapperState$1(element, props) {\n    var node = element;\n\n    {\n      checkSelectPropTypes(props);\n    }\n\n    node._wrapperState = {\n      wasMultiple: !!props.multiple\n    };\n\n    {\n      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {\n        error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');\n\n        didWarnValueDefaultValue$1 = true;\n      }\n    }\n  }\n  function postMountWrapper$2(element, props) {\n    var node = element;\n    node.multiple = !!props.multiple;\n    var value = props.value;\n\n    if (value != null) {\n      updateOptions(node, !!props.multiple, value, false);\n    } else if (props.defaultValue != null) {\n      updateOptions(node, !!props.multiple, props.defaultValue, true);\n    }\n  }\n  function postUpdateWrapper(element, props) {\n    var node = element;\n    var wasMultiple = node._wrapperState.wasMultiple;\n    node._wrapperState.wasMultiple = !!props.multiple;\n    var value = props.value;\n\n    if (value != null) {\n      updateOptions(node, !!props.multiple, value, false);\n    } else if (wasMultiple !== !!props.multiple) {\n      // For simplicity, reapply `defaultValue` if `multiple` is toggled.\n      if (props.defaultValue != null) {\n        updateOptions(node, !!props.multiple, props.defaultValue, true);\n      } else {\n        // Revert the select back to its default unselected state.\n        updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);\n      }\n    }\n  }\n  function restoreControlledState$1(element, props) {\n    var node = element;\n    var value = props.value;\n\n    if (value != null) {\n      updateOptions(node, !!props.multiple, value, false);\n    }\n  }\n\n  var didWarnValDefaultVal = false;\n\n  /**\n   * Implements a <textarea> host component that allows setting `value`, and\n   * `defaultValue`. This differs from the traditional DOM API because value is\n   * usually set as PCDATA children.\n   *\n   * If `value` is not supplied (or null/undefined), user actions that affect the\n   * value will trigger updates to the element.\n   *\n   * If `value` is supplied (and not null/undefined), the rendered element will\n   * not trigger updates to the element. Instead, the `value` prop must change in\n   * order for the rendered element to be updated.\n   *\n   * The rendered element will be initialized with an empty value, the prop\n   * `defaultValue` if specified, or the children content (deprecated).\n   */\n  function getHostProps$3(element, props) {\n    var node = element;\n\n    if (!(props.dangerouslySetInnerHTML == null)) {\n      {\n        throw Error( \"`dangerouslySetInnerHTML` does not make sense on <textarea>.\" );\n      }\n    } // Always set children to the same thing. In IE9, the selection range will\n    // get reset if `textContent` is mutated.  We could add a check in setTextContent\n    // to only set the value if/when the value differs from the node value (which would\n    // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this\n    // solution. The value can be a boolean or object so that's why it's forced\n    // to be a string.\n\n\n    var hostProps = _assign({}, props, {\n      value: undefined,\n      defaultValue: undefined,\n      children: toString(node._wrapperState.initialValue)\n    });\n\n    return hostProps;\n  }\n  function initWrapperState$2(element, props) {\n    var node = element;\n\n    {\n      ReactControlledValuePropTypes.checkPropTypes('textarea', props);\n\n      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {\n        error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');\n\n        didWarnValDefaultVal = true;\n      }\n    }\n\n    var initialValue = props.value; // Only bother fetching default value if we're going to use it\n\n    if (initialValue == null) {\n      var children = props.children,\n          defaultValue = props.defaultValue;\n\n      if (children != null) {\n        {\n          error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');\n        }\n\n        {\n          if (!(defaultValue == null)) {\n            {\n              throw Error( \"If you supply `defaultValue` on a <textarea>, do not pass children.\" );\n            }\n          }\n\n          if (Array.isArray(children)) {\n            if (!(children.length <= 1)) {\n              {\n                throw Error( \"<textarea> can only have at most one child.\" );\n              }\n            }\n\n            children = children[0];\n          }\n\n          defaultValue = children;\n        }\n      }\n\n      if (defaultValue == null) {\n        defaultValue = '';\n      }\n\n      initialValue = defaultValue;\n    }\n\n    node._wrapperState = {\n      initialValue: getToStringValue(initialValue)\n    };\n  }\n  function updateWrapper$1(element, props) {\n    var node = element;\n    var value = getToStringValue(props.value);\n    var defaultValue = getToStringValue(props.defaultValue);\n\n    if (value != null) {\n      // Cast `value` to a string to ensure the value is set correctly. While\n      // browsers typically do this as necessary, jsdom doesn't.\n      var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed\n\n      if (newValue !== node.value) {\n        node.value = newValue;\n      }\n\n      if (props.defaultValue == null && node.defaultValue !== newValue) {\n        node.defaultValue = newValue;\n      }\n    }\n\n    if (defaultValue != null) {\n      node.defaultValue = toString(defaultValue);\n    }\n  }\n  function postMountWrapper$3(element, props) {\n    var node = element; // This is in postMount because we need access to the DOM node, which is not\n    // available until after the component has mounted.\n\n    var textContent = node.textContent; // Only set node.value if textContent is equal to the expected\n    // initial value. In IE10/IE11 there is a bug where the placeholder attribute\n    // will populate textContent as well.\n    // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/\n\n    if (textContent === node._wrapperState.initialValue) {\n      if (textContent !== '' && textContent !== null) {\n        node.value = textContent;\n      }\n    }\n  }\n  function restoreControlledState$2(element, props) {\n    // DOM component is still mounted; update\n    updateWrapper$1(element, props);\n  }\n\n  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  var Namespaces = {\n    html: HTML_NAMESPACE,\n    mathml: MATH_NAMESPACE,\n    svg: SVG_NAMESPACE\n  }; // Assumes there is no parent namespace.\n\n  function getIntrinsicNamespace(type) {\n    switch (type) {\n      case 'svg':\n        return SVG_NAMESPACE;\n\n      case 'math':\n        return MATH_NAMESPACE;\n\n      default:\n        return HTML_NAMESPACE;\n    }\n  }\n  function getChildNamespace(parentNamespace, type) {\n    if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {\n      // No (or default) parent namespace: potential entry point.\n      return getIntrinsicNamespace(type);\n    }\n\n    if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {\n      // We're leaving SVG.\n      return HTML_NAMESPACE;\n    } // By default, pass namespace below.\n\n\n    return parentNamespace;\n  }\n\n  /* globals MSApp */\n\n  /**\n   * Create a function which has 'unsafe' privileges (required by windows8 apps)\n   */\n  var createMicrosoftUnsafeLocalFunction = function (func) {\n    if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {\n      return function (arg0, arg1, arg2, arg3) {\n        MSApp.execUnsafeLocalFunction(function () {\n          return func(arg0, arg1, arg2, arg3);\n        });\n      };\n    } else {\n      return func;\n    }\n  };\n\n  var reusableSVGContainer;\n  /**\n   * Set the innerHTML property of a node\n   *\n   * @param {DOMElement} node\n   * @param {string} html\n   * @internal\n   */\n\n  var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {\n    if (node.namespaceURI === Namespaces.svg) {\n\n      if (!('innerHTML' in node)) {\n        // IE does not have innerHTML for SVG nodes, so instead we inject the\n        // new markup in a temp node and then move the child nodes across into\n        // the target node\n        reusableSVGContainer = reusableSVGContainer || document.createElement('div');\n        reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';\n        var svgNode = reusableSVGContainer.firstChild;\n\n        while (node.firstChild) {\n          node.removeChild(node.firstChild);\n        }\n\n        while (svgNode.firstChild) {\n          node.appendChild(svgNode.firstChild);\n        }\n\n        return;\n      }\n    }\n\n    node.innerHTML = html;\n  });\n\n  /**\n   * HTML nodeType values that represent the type of the node\n   */\n  var ELEMENT_NODE = 1;\n  var TEXT_NODE = 3;\n  var COMMENT_NODE = 8;\n  var DOCUMENT_NODE = 9;\n  var DOCUMENT_FRAGMENT_NODE = 11;\n\n  /**\n   * Set the textContent property of a node. For text updates, it's faster\n   * to set the `nodeValue` of the Text node directly instead of using\n   * `.textContent` which will remove the existing node and create a new one.\n   *\n   * @param {DOMElement} node\n   * @param {string} text\n   * @internal\n   */\n\n  var setTextContent = function (node, text) {\n    if (text) {\n      var firstChild = node.firstChild;\n\n      if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {\n        firstChild.nodeValue = text;\n        return;\n      }\n    }\n\n    node.textContent = text;\n  };\n\n  // Do not use the below two methods directly!\n  // Instead use constants exported from DOMTopLevelEventTypes in ReactDOM.\n  // (It is the only module that is allowed to access these methods.)\n  function unsafeCastStringToDOMTopLevelType(topLevelType) {\n    return topLevelType;\n  }\n  function unsafeCastDOMTopLevelTypeToString(topLevelType) {\n    return topLevelType;\n  }\n\n  /**\n   * Generate a mapping of standard vendor prefixes using the defined style property and event name.\n   *\n   * @param {string} styleProp\n   * @param {string} eventName\n   * @returns {object}\n   */\n\n  function makePrefixMap(styleProp, eventName) {\n    var prefixes = {};\n    prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n    prefixes['Webkit' + styleProp] = 'webkit' + eventName;\n    prefixes['Moz' + styleProp] = 'moz' + eventName;\n    return prefixes;\n  }\n  /**\n   * A list of event names to a configurable list of vendor prefixes.\n   */\n\n\n  var vendorPrefixes = {\n    animationend: makePrefixMap('Animation', 'AnimationEnd'),\n    animationiteration: makePrefixMap('Animation', 'AnimationIteration'),\n    animationstart: makePrefixMap('Animation', 'AnimationStart'),\n    transitionend: makePrefixMap('Transition', 'TransitionEnd')\n  };\n  /**\n   * Event names that have already been detected and prefixed (if applicable).\n   */\n\n  var prefixedEventNames = {};\n  /**\n   * Element to check for prefixes on.\n   */\n\n  var style = {};\n  /**\n   * Bootstrap if a DOM exists.\n   */\n\n  if (canUseDOM) {\n    style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,\n    // the un-prefixed \"animation\" and \"transition\" properties are defined on the\n    // style object but the events that fire will still be prefixed, so we need\n    // to check if the un-prefixed events are usable, and if not remove them from the map.\n\n    if (!('AnimationEvent' in window)) {\n      delete vendorPrefixes.animationend.animation;\n      delete vendorPrefixes.animationiteration.animation;\n      delete vendorPrefixes.animationstart.animation;\n    } // Same as above\n\n\n    if (!('TransitionEvent' in window)) {\n      delete vendorPrefixes.transitionend.transition;\n    }\n  }\n  /**\n   * Attempts to determine the correct vendor prefixed event name.\n   *\n   * @param {string} eventName\n   * @returns {string}\n   */\n\n\n  function getVendorPrefixedEventName(eventName) {\n    if (prefixedEventNames[eventName]) {\n      return prefixedEventNames[eventName];\n    } else if (!vendorPrefixes[eventName]) {\n      return eventName;\n    }\n\n    var prefixMap = vendorPrefixes[eventName];\n\n    for (var styleProp in prefixMap) {\n      if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {\n        return prefixedEventNames[eventName] = prefixMap[styleProp];\n      }\n    }\n\n    return eventName;\n  }\n\n  /**\n   * To identify top level events in ReactDOM, we use constants defined by this\n   * module. This is the only module that uses the unsafe* methods to express\n   * that the constants actually correspond to the browser event names. This lets\n   * us save some bundle size by avoiding a top level type -> event name map.\n   * The rest of ReactDOM code should import top level types from this file.\n   */\n\n  var TOP_ABORT = unsafeCastStringToDOMTopLevelType('abort');\n  var TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationend'));\n  var TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationiteration'));\n  var TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('animationstart'));\n  var TOP_BLUR = unsafeCastStringToDOMTopLevelType('blur');\n  var TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType('canplay');\n  var TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType('canplaythrough');\n  var TOP_CANCEL = unsafeCastStringToDOMTopLevelType('cancel');\n  var TOP_CHANGE = unsafeCastStringToDOMTopLevelType('change');\n  var TOP_CLICK = unsafeCastStringToDOMTopLevelType('click');\n  var TOP_CLOSE = unsafeCastStringToDOMTopLevelType('close');\n  var TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType('compositionend');\n  var TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType('compositionstart');\n  var TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType('compositionupdate');\n  var TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType('contextmenu');\n  var TOP_COPY = unsafeCastStringToDOMTopLevelType('copy');\n  var TOP_CUT = unsafeCastStringToDOMTopLevelType('cut');\n  var TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType('dblclick');\n  var TOP_AUX_CLICK = unsafeCastStringToDOMTopLevelType('auxclick');\n  var TOP_DRAG = unsafeCastStringToDOMTopLevelType('drag');\n  var TOP_DRAG_END = unsafeCastStringToDOMTopLevelType('dragend');\n  var TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType('dragenter');\n  var TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType('dragexit');\n  var TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType('dragleave');\n  var TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType('dragover');\n  var TOP_DRAG_START = unsafeCastStringToDOMTopLevelType('dragstart');\n  var TOP_DROP = unsafeCastStringToDOMTopLevelType('drop');\n  var TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType('durationchange');\n  var TOP_EMPTIED = unsafeCastStringToDOMTopLevelType('emptied');\n  var TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');\n  var TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');\n  var TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');\n  var TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');\n  var TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('gotpointercapture');\n  var TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');\n  var TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');\n  var TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');\n  var TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType('keypress');\n  var TOP_KEY_UP = unsafeCastStringToDOMTopLevelType('keyup');\n  var TOP_LOAD = unsafeCastStringToDOMTopLevelType('load');\n  var TOP_LOAD_START = unsafeCastStringToDOMTopLevelType('loadstart');\n  var TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');\n  var TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType('loadedmetadata');\n  var TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType('lostpointercapture');\n  var TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');\n  var TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');\n  var TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');\n  var TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType('mouseover');\n  var TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType('mouseup');\n  var TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');\n  var TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');\n  var TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');\n  var TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');\n  var TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType('pointercancel');\n  var TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType('pointerdown');\n  var TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType('pointermove');\n  var TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');\n  var TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType('pointerover');\n  var TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');\n  var TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');\n  var TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');\n  var TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');\n  var TOP_SCROLL = unsafeCastStringToDOMTopLevelType('scroll');\n  var TOP_SEEKED = unsafeCastStringToDOMTopLevelType('seeked');\n  var TOP_SEEKING = unsafeCastStringToDOMTopLevelType('seeking');\n  var TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType('selectionchange');\n  var TOP_STALLED = unsafeCastStringToDOMTopLevelType('stalled');\n  var TOP_SUBMIT = unsafeCastStringToDOMTopLevelType('submit');\n  var TOP_SUSPEND = unsafeCastStringToDOMTopLevelType('suspend');\n  var TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType('textInput');\n  var TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType('timeupdate');\n  var TOP_TOGGLE = unsafeCastStringToDOMTopLevelType('toggle');\n  var TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType('touchcancel');\n  var TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType('touchend');\n  var TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType('touchmove');\n  var TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType('touchstart');\n  var TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName('transitionend'));\n  var TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType('volumechange');\n  var TOP_WAITING = unsafeCastStringToDOMTopLevelType('waiting');\n  var TOP_WHEEL = unsafeCastStringToDOMTopLevelType('wheel'); // List of events that need to be individually attached to media elements.\n  // Note that events in this list will *not* be listened to at the top level\n  // unless they're explicitly whitelisted in `ReactBrowserEventEmitter.listenTo`.\n\n  var mediaEventTypes = [TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING];\n  function getRawEventName(topLevelType) {\n    return unsafeCastDOMTopLevelTypeToString(topLevelType);\n  }\n\n  var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // prettier-ignore\n\n  var elementListenerMap = new PossiblyWeakMap();\n  function getListenerMapForElement(element) {\n    var listenerMap = elementListenerMap.get(element);\n\n    if (listenerMap === undefined) {\n      listenerMap = new Map();\n      elementListenerMap.set(element, listenerMap);\n    }\n\n    return listenerMap;\n  }\n\n  /**\n   * `ReactInstanceMap` maintains a mapping from a public facing stateful\n   * instance (key) and the internal representation (value). This allows public\n   * methods to accept the user facing instance as an argument and map them back\n   * to internal methods.\n   *\n   * Note that this module is currently shared and assumed to be stateless.\n   * If this becomes an actual Map, that will break.\n   */\n  function get(key) {\n    return key._reactInternalFiber;\n  }\n  function has$1(key) {\n    return key._reactInternalFiber !== undefined;\n  }\n  function set(key, value) {\n    key._reactInternalFiber = value;\n  }\n\n  // Don't change these two values. They're used by React Dev Tools.\n  var NoEffect =\n  /*              */\n  0;\n  var PerformedWork =\n  /*         */\n  1; // You can change the rest (and add more).\n\n  var Placement =\n  /*             */\n  2;\n  var Update =\n  /*                */\n  4;\n  var PlacementAndUpdate =\n  /*    */\n  6;\n  var Deletion =\n  /*              */\n  8;\n  var ContentReset =\n  /*          */\n  16;\n  var Callback =\n  /*              */\n  32;\n  var DidCapture =\n  /*            */\n  64;\n  var Ref =\n  /*                   */\n  128;\n  var Snapshot =\n  /*              */\n  256;\n  var Passive =\n  /*               */\n  512;\n  var Hydrating =\n  /*             */\n  1024;\n  var HydratingAndUpdate =\n  /*    */\n  1028; // Passive & Update & Callback & Ref & Snapshot\n\n  var LifecycleEffectMask =\n  /*   */\n  932; // Union of all host effects\n\n  var HostEffectMask =\n  /*        */\n  2047;\n  var Incomplete =\n  /*            */\n  2048;\n  var ShouldCapture =\n  /*         */\n  4096;\n\n  var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;\n  function getNearestMountedFiber(fiber) {\n    var node = fiber;\n    var nearestMounted = fiber;\n\n    if (!fiber.alternate) {\n      // If there is no alternate, this might be a new tree that isn't inserted\n      // yet. If it is, then it will have a pending insertion effect on it.\n      var nextNode = node;\n\n      do {\n        node = nextNode;\n\n        if ((node.effectTag & (Placement | Hydrating)) !== NoEffect) {\n          // This is an insertion or in-progress hydration. The nearest possible\n          // mounted fiber is the parent but we need to continue to figure out\n          // if that one is still mounted.\n          nearestMounted = node.return;\n        }\n\n        nextNode = node.return;\n      } while (nextNode);\n    } else {\n      while (node.return) {\n        node = node.return;\n      }\n    }\n\n    if (node.tag === HostRoot) {\n      // TODO: Check if this was a nested HostRoot when used with\n      // renderContainerIntoSubtree.\n      return nearestMounted;\n    } // If we didn't hit the root, that means that we're in an disconnected tree\n    // that has been unmounted.\n\n\n    return null;\n  }\n  function getSuspenseInstanceFromFiber(fiber) {\n    if (fiber.tag === SuspenseComponent) {\n      var suspenseState = fiber.memoizedState;\n\n      if (suspenseState === null) {\n        var current = fiber.alternate;\n\n        if (current !== null) {\n          suspenseState = current.memoizedState;\n        }\n      }\n\n      if (suspenseState !== null) {\n        return suspenseState.dehydrated;\n      }\n    }\n\n    return null;\n  }\n  function getContainerFromFiber(fiber) {\n    return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;\n  }\n  function isFiberMounted(fiber) {\n    return getNearestMountedFiber(fiber) === fiber;\n  }\n  function isMounted(component) {\n    {\n      var owner = ReactCurrentOwner.current;\n\n      if (owner !== null && owner.tag === ClassComponent) {\n        var ownerFiber = owner;\n        var instance = ownerFiber.stateNode;\n\n        if (!instance._warnedAboutRefsInRender) {\n          error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component');\n        }\n\n        instance._warnedAboutRefsInRender = true;\n      }\n    }\n\n    var fiber = get(component);\n\n    if (!fiber) {\n      return false;\n    }\n\n    return getNearestMountedFiber(fiber) === fiber;\n  }\n\n  function assertIsMounted(fiber) {\n    if (!(getNearestMountedFiber(fiber) === fiber)) {\n      {\n        throw Error( \"Unable to find node on an unmounted component.\" );\n      }\n    }\n  }\n\n  function findCurrentFiberUsingSlowPath(fiber) {\n    var alternate = fiber.alternate;\n\n    if (!alternate) {\n      // If there is no alternate, then we only need to check if it is mounted.\n      var nearestMounted = getNearestMountedFiber(fiber);\n\n      if (!(nearestMounted !== null)) {\n        {\n          throw Error( \"Unable to find node on an unmounted component.\" );\n        }\n      }\n\n      if (nearestMounted !== fiber) {\n        return null;\n      }\n\n      return fiber;\n    } // If we have two possible branches, we'll walk backwards up to the root\n    // to see what path the root points to. On the way we may hit one of the\n    // special cases and we'll deal with them.\n\n\n    var a = fiber;\n    var b = alternate;\n\n    while (true) {\n      var parentA = a.return;\n\n      if (parentA === null) {\n        // We're at the root.\n        break;\n      }\n\n      var parentB = parentA.alternate;\n\n      if (parentB === null) {\n        // There is no alternate. This is an unusual case. Currently, it only\n        // happens when a Suspense component is hidden. An extra fragment fiber\n        // is inserted in between the Suspense fiber and its children. Skip\n        // over this extra fragment fiber and proceed to the next parent.\n        var nextParent = parentA.return;\n\n        if (nextParent !== null) {\n          a = b = nextParent;\n          continue;\n        } // If there's no parent, we're at the root.\n\n\n        break;\n      } // If both copies of the parent fiber point to the same child, we can\n      // assume that the child is current. This happens when we bailout on low\n      // priority: the bailed out fiber's child reuses the current child.\n\n\n      if (parentA.child === parentB.child) {\n        var child = parentA.child;\n\n        while (child) {\n          if (child === a) {\n            // We've determined that A is the current branch.\n            assertIsMounted(parentA);\n            return fiber;\n          }\n\n          if (child === b) {\n            // We've determined that B is the current branch.\n            assertIsMounted(parentA);\n            return alternate;\n          }\n\n          child = child.sibling;\n        } // We should never have an alternate for any mounting node. So the only\n        // way this could possibly happen is if this was unmounted, if at all.\n\n\n        {\n          {\n            throw Error( \"Unable to find node on an unmounted component.\" );\n          }\n        }\n      }\n\n      if (a.return !== b.return) {\n        // The return pointer of A and the return pointer of B point to different\n        // fibers. We assume that return pointers never criss-cross, so A must\n        // belong to the child set of A.return, and B must belong to the child\n        // set of B.return.\n        a = parentA;\n        b = parentB;\n      } else {\n        // The return pointers point to the same fiber. We'll have to use the\n        // default, slow path: scan the child sets of each parent alternate to see\n        // which child belongs to which set.\n        //\n        // Search parent A's child set\n        var didFindChild = false;\n        var _child = parentA.child;\n\n        while (_child) {\n          if (_child === a) {\n            didFindChild = true;\n            a = parentA;\n            b = parentB;\n            break;\n          }\n\n          if (_child === b) {\n            didFindChild = true;\n            b = parentA;\n            a = parentB;\n            break;\n          }\n\n          _child = _child.sibling;\n        }\n\n        if (!didFindChild) {\n          // Search parent B's child set\n          _child = parentB.child;\n\n          while (_child) {\n            if (_child === a) {\n              didFindChild = true;\n              a = parentB;\n              b = parentA;\n              break;\n            }\n\n            if (_child === b) {\n              didFindChild = true;\n              b = parentB;\n              a = parentA;\n              break;\n            }\n\n            _child = _child.sibling;\n          }\n\n          if (!didFindChild) {\n            {\n              throw Error( \"Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.\" );\n            }\n          }\n        }\n      }\n\n      if (!(a.alternate === b)) {\n        {\n          throw Error( \"Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n    } // If the root is not a host container, we're in a disconnected tree. I.e.\n    // unmounted.\n\n\n    if (!(a.tag === HostRoot)) {\n      {\n        throw Error( \"Unable to find node on an unmounted component.\" );\n      }\n    }\n\n    if (a.stateNode.current === a) {\n      // We've determined that A is the current branch.\n      return fiber;\n    } // Otherwise B has to be current branch.\n\n\n    return alternate;\n  }\n  function findCurrentHostFiber(parent) {\n    var currentParent = findCurrentFiberUsingSlowPath(parent);\n\n    if (!currentParent) {\n      return null;\n    } // Next we'll drill down this component to find the first HostComponent/Text.\n\n\n    var node = currentParent;\n\n    while (true) {\n      if (node.tag === HostComponent || node.tag === HostText) {\n        return node;\n      } else if (node.child) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === currentParent) {\n        return null;\n      }\n\n      while (!node.sibling) {\n        if (!node.return || node.return === currentParent) {\n          return null;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    } // Flow needs the return null here, but ESLint complains about it.\n    // eslint-disable-next-line no-unreachable\n\n\n    return null;\n  }\n  function findCurrentHostFiberWithNoPortals(parent) {\n    var currentParent = findCurrentFiberUsingSlowPath(parent);\n\n    if (!currentParent) {\n      return null;\n    } // Next we'll drill down this component to find the first HostComponent/Text.\n\n\n    var node = currentParent;\n\n    while (true) {\n      if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI ) {\n        return node;\n      } else if (node.child && node.tag !== HostPortal) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === currentParent) {\n        return null;\n      }\n\n      while (!node.sibling) {\n        if (!node.return || node.return === currentParent) {\n          return null;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    } // Flow needs the return null here, but ESLint complains about it.\n    // eslint-disable-next-line no-unreachable\n\n\n    return null;\n  }\n\n  /**\n   * Accumulates items that must not be null or undefined into the first one. This\n   * is used to conserve memory by avoiding array allocations, and thus sacrifices\n   * API cleanness. Since `current` can be null before being passed in and not\n   * null after this function, make sure to assign it back to `current`:\n   *\n   * `a = accumulateInto(a, b);`\n   *\n   * This API should be sparingly used. Try `accumulate` for something cleaner.\n   *\n   * @return {*|array<*>} An accumulation of items.\n   */\n\n  function accumulateInto(current, next) {\n    if (!(next != null)) {\n      {\n        throw Error( \"accumulateInto(...): Accumulated items must not be null or undefined.\" );\n      }\n    }\n\n    if (current == null) {\n      return next;\n    } // Both are not empty. Warning: Never call x.concat(y) when you are not\n    // certain that x is an Array (x could be a string with concat method).\n\n\n    if (Array.isArray(current)) {\n      if (Array.isArray(next)) {\n        current.push.apply(current, next);\n        return current;\n      }\n\n      current.push(next);\n      return current;\n    }\n\n    if (Array.isArray(next)) {\n      // A bit too dangerous to mutate `next`.\n      return [current].concat(next);\n    }\n\n    return [current, next];\n  }\n\n  /**\n   * @param {array} arr an \"accumulation\" of items which is either an Array or\n   * a single item. Useful when paired with the `accumulate` module. This is a\n   * simple utility that allows us to reason about a collection of items, but\n   * handling the case when there is exactly one item (and we do not need to\n   * allocate an array).\n   * @param {function} cb Callback invoked with each element or a collection.\n   * @param {?} [scope] Scope used as `this` in a callback.\n   */\n  function forEachAccumulated(arr, cb, scope) {\n    if (Array.isArray(arr)) {\n      arr.forEach(cb, scope);\n    } else if (arr) {\n      cb.call(scope, arr);\n    }\n  }\n\n  /**\n   * Internal queue of events that have accumulated their dispatches and are\n   * waiting to have their dispatches executed.\n   */\n\n  var eventQueue = null;\n  /**\n   * Dispatches an event and releases it back into the pool, unless persistent.\n   *\n   * @param {?object} event Synthetic event to be dispatched.\n   * @private\n   */\n\n  var executeDispatchesAndRelease = function (event) {\n    if (event) {\n      executeDispatchesInOrder(event);\n\n      if (!event.isPersistent()) {\n        event.constructor.release(event);\n      }\n    }\n  };\n\n  var executeDispatchesAndReleaseTopLevel = function (e) {\n    return executeDispatchesAndRelease(e);\n  };\n\n  function runEventsInBatch(events) {\n    if (events !== null) {\n      eventQueue = accumulateInto(eventQueue, events);\n    } // Set `eventQueue` to null before processing it so that we can tell if more\n    // events get enqueued while processing.\n\n\n    var processingEventQueue = eventQueue;\n    eventQueue = null;\n\n    if (!processingEventQueue) {\n      return;\n    }\n\n    forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);\n\n    if (!!eventQueue) {\n      {\n        throw Error( \"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.\" );\n      }\n    } // This would be a good time to rethrow if any of the event handlers threw.\n\n\n    rethrowCaughtError();\n  }\n\n  /**\n   * Gets the target node from a native browser event by accounting for\n   * inconsistencies in browser DOM APIs.\n   *\n   * @param {object} nativeEvent Native browser event.\n   * @return {DOMEventTarget} Target node.\n   */\n\n  function getEventTarget(nativeEvent) {\n    // Fallback to nativeEvent.srcElement for IE9\n    // https://github.com/facebook/react/issues/12506\n    var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963\n\n    if (target.correspondingUseElement) {\n      target = target.correspondingUseElement;\n    } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n    // @see http://www.quirksmode.org/js/events_properties.html\n\n\n    return target.nodeType === TEXT_NODE ? target.parentNode : target;\n  }\n\n  /**\n   * Checks if an event is supported in the current execution environment.\n   *\n   * NOTE: This will not work correctly for non-generic events such as `change`,\n   * `reset`, `load`, `error`, and `select`.\n   *\n   * Borrows from Modernizr.\n   *\n   * @param {string} eventNameSuffix Event name, e.g. \"click\".\n   * @return {boolean} True if the event is supported.\n   * @internal\n   * @license Modernizr 3.0.0pre (Custom Build) | MIT\n   */\n\n  function isEventSupported(eventNameSuffix) {\n    if (!canUseDOM) {\n      return false;\n    }\n\n    var eventName = 'on' + eventNameSuffix;\n    var isSupported = eventName in document;\n\n    if (!isSupported) {\n      var element = document.createElement('div');\n      element.setAttribute(eventName, 'return;');\n      isSupported = typeof element[eventName] === 'function';\n    }\n\n    return isSupported;\n  }\n\n  /**\n   * Summary of `DOMEventPluginSystem` event handling:\n   *\n   *  - Top-level delegation is used to trap most native browser events. This\n   *    may only occur in the main thread and is the responsibility of\n   *    ReactDOMEventListener, which is injected and can therefore support\n   *    pluggable event sources. This is the only work that occurs in the main\n   *    thread.\n   *\n   *  - We normalize and de-duplicate events to account for browser quirks. This\n   *    may be done in the worker thread.\n   *\n   *  - Forward these native events (with the associated top-level type used to\n   *    trap it) to `EventPluginRegistry`, which in turn will ask plugins if they want\n   *    to extract any synthetic events.\n   *\n   *  - The `EventPluginRegistry` will then process each event by annotating them with\n   *    \"dispatches\", a sequence of listeners and IDs that care about that event.\n   *\n   *  - The `EventPluginRegistry` then dispatches the events.\n   *\n   * Overview of React and the event system:\n   *\n   * +------------+    .\n   * |    DOM     |    .\n   * +------------+    .\n   *       |           .\n   *       v           .\n   * +------------+    .\n   * | ReactEvent |    .\n   * |  Listener  |    .\n   * +------------+    .                         +-----------+\n   *       |           .               +--------+|SimpleEvent|\n   *       |           .               |         |Plugin     |\n   * +-----|------+    .               v         +-----------+\n   * |     |      |    .    +--------------+                    +------------+\n   * |     +-----------.--->|PluginRegistry|                    |    Event   |\n   * |            |    .    |              |     +-----------+  | Propagators|\n   * | ReactEvent |    .    |              |     |TapEvent   |  |------------|\n   * |  Emitter   |    .    |              |<---+|Plugin     |  |other plugin|\n   * |            |    .    |              |     +-----------+  |  utilities |\n   * |     +-----------.--->|              |                    +------------+\n   * |     |      |    .    +--------------+\n   * +-----|------+    .                ^        +-----------+\n   *       |           .                |        |Enter/Leave|\n   *       +           .                +-------+|Plugin     |\n   * +-------------+   .                         +-----------+\n   * | application |   .\n   * |-------------|   .\n   * |             |   .\n   * |             |   .\n   * +-------------+   .\n   *                   .\n   *    React Core     .  General Purpose Event Plugin System\n   */\n\n  var CALLBACK_BOOKKEEPING_POOL_SIZE = 10;\n  var callbackBookkeepingPool = [];\n\n  function releaseTopLevelCallbackBookKeeping(instance) {\n    instance.topLevelType = null;\n    instance.nativeEvent = null;\n    instance.targetInst = null;\n    instance.ancestors.length = 0;\n\n    if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {\n      callbackBookkeepingPool.push(instance);\n    }\n  } // Used to store ancestor hierarchy in top level callback\n\n\n  function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags) {\n    if (callbackBookkeepingPool.length) {\n      var instance = callbackBookkeepingPool.pop();\n      instance.topLevelType = topLevelType;\n      instance.eventSystemFlags = eventSystemFlags;\n      instance.nativeEvent = nativeEvent;\n      instance.targetInst = targetInst;\n      return instance;\n    }\n\n    return {\n      topLevelType: topLevelType,\n      eventSystemFlags: eventSystemFlags,\n      nativeEvent: nativeEvent,\n      targetInst: targetInst,\n      ancestors: []\n    };\n  }\n  /**\n   * Find the deepest React component completely containing the root of the\n   * passed-in instance (for use when entire React trees are nested within each\n   * other). If React trees are not nested, returns null.\n   */\n\n\n  function findRootContainerNode(inst) {\n    if (inst.tag === HostRoot) {\n      return inst.stateNode.containerInfo;\n    } // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n    // traversal, but caching is difficult to do correctly without using a\n    // mutation observer to listen for all DOM changes.\n\n\n    while (inst.return) {\n      inst = inst.return;\n    }\n\n    if (inst.tag !== HostRoot) {\n      // This can happen if we're in a detached tree.\n      return null;\n    }\n\n    return inst.stateNode.containerInfo;\n  }\n  /**\n   * Allows registered plugins an opportunity to extract events from top-level\n   * native browser events.\n   *\n   * @return {*} An accumulation of synthetic events.\n   * @internal\n   */\n\n\n  function extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var events = null;\n\n    for (var i = 0; i < plugins.length; i++) {\n      // Not every plugin in the ordering may be loaded at runtime.\n      var possiblePlugin = plugins[i];\n\n      if (possiblePlugin) {\n        var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);\n\n        if (extractedEvents) {\n          events = accumulateInto(events, extractedEvents);\n        }\n      }\n    }\n\n    return events;\n  }\n\n  function runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n    var events = extractPluginEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);\n    runEventsInBatch(events);\n  }\n\n  function handleTopLevel(bookKeeping) {\n    var targetInst = bookKeeping.targetInst; // Loop through the hierarchy, in case there's any nested components.\n    // It's important that we build the array of ancestors before calling any\n    // event handlers, because event handlers can modify the DOM, leading to\n    // inconsistencies with ReactMount's node cache. See #1105.\n\n    var ancestor = targetInst;\n\n    do {\n      if (!ancestor) {\n        var ancestors = bookKeeping.ancestors;\n        ancestors.push(ancestor);\n        break;\n      }\n\n      var root = findRootContainerNode(ancestor);\n\n      if (!root) {\n        break;\n      }\n\n      var tag = ancestor.tag;\n\n      if (tag === HostComponent || tag === HostText) {\n        bookKeeping.ancestors.push(ancestor);\n      }\n\n      ancestor = getClosestInstanceFromNode(root);\n    } while (ancestor);\n\n    for (var i = 0; i < bookKeeping.ancestors.length; i++) {\n      targetInst = bookKeeping.ancestors[i];\n      var eventTarget = getEventTarget(bookKeeping.nativeEvent);\n      var topLevelType = bookKeeping.topLevelType;\n      var nativeEvent = bookKeeping.nativeEvent;\n      var eventSystemFlags = bookKeeping.eventSystemFlags; // If this is the first ancestor, we mark it on the system flags\n\n      if (i === 0) {\n        eventSystemFlags |= IS_FIRST_ANCESTOR;\n      }\n\n      runExtractedPluginEventsInBatch(topLevelType, targetInst, nativeEvent, eventTarget, eventSystemFlags);\n    }\n  }\n\n  function dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst) {\n    var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst, eventSystemFlags);\n\n    try {\n      // Event queue being processed in the same cycle allows\n      // `preventDefault`.\n      batchedEventUpdates(handleTopLevel, bookKeeping);\n    } finally {\n      releaseTopLevelCallbackBookKeeping(bookKeeping);\n    }\n  }\n  /**\n   * We listen for bubbled touch events on the document object.\n   *\n   * Firefox v8.01 (and possibly others) exhibited strange behavior when\n   * mounting `onmousemove` events at some node that was not the document\n   * element. The symptoms were that if your mouse is not moving over something\n   * contained within that mount point (for example on the background) the\n   * top-level listeners for `onmousemove` won't be called. However, if you\n   * register the `mousemove` on the document object, then it will of course\n   * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n   * top-level listeners to the document object only, at least for these\n   * movement types of events and possibly all events.\n   *\n   * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n   *\n   * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n   * they bubble to document.\n   *\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   * @param {object} mountAt Container where to mount the listener\n   */\n\n  function legacyListenToEvent(registrationName, mountAt) {\n    var listenerMap = getListenerMapForElement(mountAt);\n    var dependencies = registrationNameDependencies[registrationName];\n\n    for (var i = 0; i < dependencies.length; i++) {\n      var dependency = dependencies[i];\n      legacyListenToTopLevelEvent(dependency, mountAt, listenerMap);\n    }\n  }\n  function legacyListenToTopLevelEvent(topLevelType, mountAt, listenerMap) {\n    if (!listenerMap.has(topLevelType)) {\n      switch (topLevelType) {\n        case TOP_SCROLL:\n          trapCapturedEvent(TOP_SCROLL, mountAt);\n          break;\n\n        case TOP_FOCUS:\n        case TOP_BLUR:\n          trapCapturedEvent(TOP_FOCUS, mountAt);\n          trapCapturedEvent(TOP_BLUR, mountAt); // We set the flag for a single dependency later in this function,\n          // but this ensures we mark both as attached rather than just one.\n\n          listenerMap.set(TOP_BLUR, null);\n          listenerMap.set(TOP_FOCUS, null);\n          break;\n\n        case TOP_CANCEL:\n        case TOP_CLOSE:\n          if (isEventSupported(getRawEventName(topLevelType))) {\n            trapCapturedEvent(topLevelType, mountAt);\n          }\n\n          break;\n\n        case TOP_INVALID:\n        case TOP_SUBMIT:\n        case TOP_RESET:\n          // We listen to them on the target DOM elements.\n          // Some of them bubble so we don't want them to fire twice.\n          break;\n\n        default:\n          // By default, listen on the top level to all non-media events.\n          // Media events don't bubble so adding the listener wouldn't do anything.\n          var isMediaEvent = mediaEventTypes.indexOf(topLevelType) !== -1;\n\n          if (!isMediaEvent) {\n            trapBubbledEvent(topLevelType, mountAt);\n          }\n\n          break;\n      }\n\n      listenerMap.set(topLevelType, null);\n    }\n  }\n  function isListeningToAllDependencies(registrationName, mountAt) {\n    var listenerMap = getListenerMapForElement(mountAt);\n    var dependencies = registrationNameDependencies[registrationName];\n\n    for (var i = 0; i < dependencies.length; i++) {\n      var dependency = dependencies[i];\n\n      if (!listenerMap.has(dependency)) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  var attemptUserBlockingHydration;\n  function setAttemptUserBlockingHydration(fn) {\n    attemptUserBlockingHydration = fn;\n  }\n  var attemptContinuousHydration;\n  function setAttemptContinuousHydration(fn) {\n    attemptContinuousHydration = fn;\n  }\n  var attemptHydrationAtCurrentPriority;\n  function setAttemptHydrationAtCurrentPriority(fn) {\n    attemptHydrationAtCurrentPriority = fn;\n  } // TODO: Upgrade this definition once we're on a newer version of Flow that\n  var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.\n\n  var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.\n  // if the last target was dehydrated.\n\n  var queuedFocus = null;\n  var queuedDrag = null;\n  var queuedMouse = null; // For pointer events there can be one latest event per pointerId.\n\n  var queuedPointers = new Map();\n  var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.\n\n  var queuedExplicitHydrationTargets = [];\n  function hasQueuedDiscreteEvents() {\n    return queuedDiscreteEvents.length > 0;\n  }\n  var discreteReplayableEvents = [TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_TOUCH_CANCEL, TOP_TOUCH_END, TOP_TOUCH_START, TOP_AUX_CLICK, TOP_DOUBLE_CLICK, TOP_POINTER_CANCEL, TOP_POINTER_DOWN, TOP_POINTER_UP, TOP_DRAG_END, TOP_DRAG_START, TOP_DROP, TOP_COMPOSITION_END, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_INPUT, TOP_TEXT_INPUT, TOP_CLOSE, TOP_CANCEL, TOP_COPY, TOP_CUT, TOP_PASTE, TOP_CLICK, TOP_CHANGE, TOP_CONTEXT_MENU, TOP_RESET, TOP_SUBMIT];\n  var continuousReplayableEvents = [TOP_FOCUS, TOP_BLUR, TOP_DRAG_ENTER, TOP_DRAG_LEAVE, TOP_MOUSE_OVER, TOP_MOUSE_OUT, TOP_POINTER_OVER, TOP_POINTER_OUT, TOP_GOT_POINTER_CAPTURE, TOP_LOST_POINTER_CAPTURE];\n  function isReplayableDiscreteEvent(eventType) {\n    return discreteReplayableEvents.indexOf(eventType) > -1;\n  }\n\n  function trapReplayableEventForDocument(topLevelType, document, listenerMap) {\n    legacyListenToTopLevelEvent(topLevelType, document, listenerMap);\n  }\n\n  function eagerlyTrapReplayableEvents(container, document) {\n    var listenerMapForDoc = getListenerMapForElement(document); // Discrete\n\n    discreteReplayableEvents.forEach(function (topLevelType) {\n      trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);\n    }); // Continuous\n\n    continuousReplayableEvents.forEach(function (topLevelType) {\n      trapReplayableEventForDocument(topLevelType, document, listenerMapForDoc);\n    });\n  }\n\n  function createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n    return {\n      blockedOn: blockedOn,\n      topLevelType: topLevelType,\n      eventSystemFlags: eventSystemFlags | IS_REPLAYED,\n      nativeEvent: nativeEvent,\n      container: container\n    };\n  }\n\n  function queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n    var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n    queuedDiscreteEvents.push(queuedEvent);\n  } // Resets the replaying for this type of continuous event to no event.\n\n  function clearIfContinuousEvent(topLevelType, nativeEvent) {\n    switch (topLevelType) {\n      case TOP_FOCUS:\n      case TOP_BLUR:\n        queuedFocus = null;\n        break;\n\n      case TOP_DRAG_ENTER:\n      case TOP_DRAG_LEAVE:\n        queuedDrag = null;\n        break;\n\n      case TOP_MOUSE_OVER:\n      case TOP_MOUSE_OUT:\n        queuedMouse = null;\n        break;\n\n      case TOP_POINTER_OVER:\n      case TOP_POINTER_OUT:\n        {\n          var pointerId = nativeEvent.pointerId;\n          queuedPointers.delete(pointerId);\n          break;\n        }\n\n      case TOP_GOT_POINTER_CAPTURE:\n      case TOP_LOST_POINTER_CAPTURE:\n        {\n          var _pointerId = nativeEvent.pointerId;\n          queuedPointerCaptures.delete(_pointerId);\n          break;\n        }\n    }\n  }\n\n  function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n    if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {\n      var queuedEvent = createQueuedReplayableEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n\n      if (blockedOn !== null) {\n        var _fiber2 = getInstanceFromNode$1(blockedOn);\n\n        if (_fiber2 !== null) {\n          // Attempt to increase the priority of this target.\n          attemptContinuousHydration(_fiber2);\n        }\n      }\n\n      return queuedEvent;\n    } // If we have already queued this exact event, then it's because\n    // the different event systems have different DOM event listeners.\n    // We can accumulate the flags and store a single event to be\n    // replayed.\n\n\n    existingQueuedEvent.eventSystemFlags |= eventSystemFlags;\n    return existingQueuedEvent;\n  }\n\n  function queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent) {\n    // These set relatedTarget to null because the replayed event will be treated as if we\n    // moved from outside the window (no target) onto the target once it hydrates.\n    // Instead of mutating we could clone the event.\n    switch (topLevelType) {\n      case TOP_FOCUS:\n        {\n          var focusEvent = nativeEvent;\n          queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, topLevelType, eventSystemFlags, container, focusEvent);\n          return true;\n        }\n\n      case TOP_DRAG_ENTER:\n        {\n          var dragEvent = nativeEvent;\n          queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, topLevelType, eventSystemFlags, container, dragEvent);\n          return true;\n        }\n\n      case TOP_MOUSE_OVER:\n        {\n          var mouseEvent = nativeEvent;\n          queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, topLevelType, eventSystemFlags, container, mouseEvent);\n          return true;\n        }\n\n      case TOP_POINTER_OVER:\n        {\n          var pointerEvent = nativeEvent;\n          var pointerId = pointerEvent.pointerId;\n          queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, topLevelType, eventSystemFlags, container, pointerEvent));\n          return true;\n        }\n\n      case TOP_GOT_POINTER_CAPTURE:\n        {\n          var _pointerEvent = nativeEvent;\n          var _pointerId2 = _pointerEvent.pointerId;\n          queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, topLevelType, eventSystemFlags, container, _pointerEvent));\n          return true;\n        }\n    }\n\n    return false;\n  } // Check if this target is unblocked. Returns true if it's unblocked.\n\n  function attemptExplicitHydrationTarget(queuedTarget) {\n    // TODO: This function shares a lot of logic with attemptToDispatchEvent.\n    // Try to unify them. It's a bit tricky since it would require two return\n    // values.\n    var targetInst = getClosestInstanceFromNode(queuedTarget.target);\n\n    if (targetInst !== null) {\n      var nearestMounted = getNearestMountedFiber(targetInst);\n\n      if (nearestMounted !== null) {\n        var tag = nearestMounted.tag;\n\n        if (tag === SuspenseComponent) {\n          var instance = getSuspenseInstanceFromFiber(nearestMounted);\n\n          if (instance !== null) {\n            // We're blocked on hydrating this boundary.\n            // Increase its priority.\n            queuedTarget.blockedOn = instance;\n            unstable_runWithPriority(queuedTarget.priority, function () {\n              attemptHydrationAtCurrentPriority(nearestMounted);\n            });\n            return;\n          }\n        } else if (tag === HostRoot) {\n          var root = nearestMounted.stateNode;\n\n          if (root.hydrate) {\n            queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of\n            // a root other than sync.\n\n            return;\n          }\n        }\n      }\n    }\n\n    queuedTarget.blockedOn = null;\n  }\n\n  function attemptReplayContinuousQueuedEvent(queuedEvent) {\n    if (queuedEvent.blockedOn !== null) {\n      return false;\n    }\n\n    var nextBlockedOn = attemptToDispatchEvent(queuedEvent.topLevelType, queuedEvent.eventSystemFlags, queuedEvent.container, queuedEvent.nativeEvent);\n\n    if (nextBlockedOn !== null) {\n      // We're still blocked. Try again later.\n      var _fiber3 = getInstanceFromNode$1(nextBlockedOn);\n\n      if (_fiber3 !== null) {\n        attemptContinuousHydration(_fiber3);\n      }\n\n      queuedEvent.blockedOn = nextBlockedOn;\n      return false;\n    }\n\n    return true;\n  }\n\n  function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {\n    if (attemptReplayContinuousQueuedEvent(queuedEvent)) {\n      map.delete(key);\n    }\n  }\n\n  function replayUnblockedEvents() {\n    hasScheduledReplayAttempt = false; // First replay discrete events.\n\n    while (queuedDiscreteEvents.length > 0) {\n      var nextDiscreteEvent = queuedDiscreteEvents[0];\n\n      if (nextDiscreteEvent.blockedOn !== null) {\n        // We're still blocked.\n        // Increase the priority of this boundary to unblock\n        // the next discrete event.\n        var _fiber4 = getInstanceFromNode$1(nextDiscreteEvent.blockedOn);\n\n        if (_fiber4 !== null) {\n          attemptUserBlockingHydration(_fiber4);\n        }\n\n        break;\n      }\n\n      var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.topLevelType, nextDiscreteEvent.eventSystemFlags, nextDiscreteEvent.container, nextDiscreteEvent.nativeEvent);\n\n      if (nextBlockedOn !== null) {\n        // We're still blocked. Try again later.\n        nextDiscreteEvent.blockedOn = nextBlockedOn;\n      } else {\n        // We've successfully replayed the first event. Let's try the next one.\n        queuedDiscreteEvents.shift();\n      }\n    } // Next replay any continuous events.\n\n\n    if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {\n      queuedFocus = null;\n    }\n\n    if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {\n      queuedDrag = null;\n    }\n\n    if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {\n      queuedMouse = null;\n    }\n\n    queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);\n    queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);\n  }\n\n  function scheduleCallbackIfUnblocked(queuedEvent, unblocked) {\n    if (queuedEvent.blockedOn === unblocked) {\n      queuedEvent.blockedOn = null;\n\n      if (!hasScheduledReplayAttempt) {\n        hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are\n        // now unblocked. This first might not actually be unblocked yet.\n        // We could check it early to avoid scheduling an unnecessary callback.\n\n        unstable_scheduleCallback(unstable_NormalPriority, replayUnblockedEvents);\n      }\n    }\n  }\n\n  function retryIfBlockedOn(unblocked) {\n    // Mark anything that was blocked on this as no longer blocked\n    // and eligible for a replay.\n    if (queuedDiscreteEvents.length > 0) {\n      scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's\n      // worth it because we expect very few discrete events to queue up and once\n      // we are actually fully unblocked it will be fast to replay them.\n\n      for (var i = 1; i < queuedDiscreteEvents.length; i++) {\n        var queuedEvent = queuedDiscreteEvents[i];\n\n        if (queuedEvent.blockedOn === unblocked) {\n          queuedEvent.blockedOn = null;\n        }\n      }\n    }\n\n    if (queuedFocus !== null) {\n      scheduleCallbackIfUnblocked(queuedFocus, unblocked);\n    }\n\n    if (queuedDrag !== null) {\n      scheduleCallbackIfUnblocked(queuedDrag, unblocked);\n    }\n\n    if (queuedMouse !== null) {\n      scheduleCallbackIfUnblocked(queuedMouse, unblocked);\n    }\n\n    var unblock = function (queuedEvent) {\n      return scheduleCallbackIfUnblocked(queuedEvent, unblocked);\n    };\n\n    queuedPointers.forEach(unblock);\n    queuedPointerCaptures.forEach(unblock);\n\n    for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {\n      var queuedTarget = queuedExplicitHydrationTargets[_i];\n\n      if (queuedTarget.blockedOn === unblocked) {\n        queuedTarget.blockedOn = null;\n      }\n    }\n\n    while (queuedExplicitHydrationTargets.length > 0) {\n      var nextExplicitTarget = queuedExplicitHydrationTargets[0];\n\n      if (nextExplicitTarget.blockedOn !== null) {\n        // We're still blocked.\n        break;\n      } else {\n        attemptExplicitHydrationTarget(nextExplicitTarget);\n\n        if (nextExplicitTarget.blockedOn === null) {\n          // We're unblocked.\n          queuedExplicitHydrationTargets.shift();\n        }\n      }\n    }\n  }\n\n  function addEventBubbleListener(element, eventType, listener) {\n    element.addEventListener(eventType, listener, false);\n  }\n  function addEventCaptureListener(element, eventType, listener) {\n    element.addEventListener(eventType, listener, true);\n  }\n\n  // do it in two places, which duplicates logic\n  // and increases the bundle size, we do it all\n  // here once. If we remove or refactor the\n  // SimpleEventPlugin, we should also remove or\n  // update the below line.\n\n  var simpleEventPluginEventTypes = {};\n  var topLevelEventsToDispatchConfig = new Map();\n  var eventPriorities = new Map(); // We store most of the events in this module in pairs of two strings so we can re-use\n  // the code required to apply the same logic for event prioritization and that of the\n  // SimpleEventPlugin. This complicates things slightly, but the aim is to reduce code\n  // duplication (for which there would be quite a bit). For the events that are not needed\n  // for the SimpleEventPlugin (otherDiscreteEvents) we process them separately as an\n  // array of top level events.\n  // Lastly, we ignore prettier so we can keep the formatting sane.\n  // prettier-ignore\n\n  var discreteEventPairsForSimpleEventPlugin = [TOP_BLUR, 'blur', TOP_CANCEL, 'cancel', TOP_CLICK, 'click', TOP_CLOSE, 'close', TOP_CONTEXT_MENU, 'contextMenu', TOP_COPY, 'copy', TOP_CUT, 'cut', TOP_AUX_CLICK, 'auxClick', TOP_DOUBLE_CLICK, 'doubleClick', TOP_DRAG_END, 'dragEnd', TOP_DRAG_START, 'dragStart', TOP_DROP, 'drop', TOP_FOCUS, 'focus', TOP_INPUT, 'input', TOP_INVALID, 'invalid', TOP_KEY_DOWN, 'keyDown', TOP_KEY_PRESS, 'keyPress', TOP_KEY_UP, 'keyUp', TOP_MOUSE_DOWN, 'mouseDown', TOP_MOUSE_UP, 'mouseUp', TOP_PASTE, 'paste', TOP_PAUSE, 'pause', TOP_PLAY, 'play', TOP_POINTER_CANCEL, 'pointerCancel', TOP_POINTER_DOWN, 'pointerDown', TOP_POINTER_UP, 'pointerUp', TOP_RATE_CHANGE, 'rateChange', TOP_RESET, 'reset', TOP_SEEKED, 'seeked', TOP_SUBMIT, 'submit', TOP_TOUCH_CANCEL, 'touchCancel', TOP_TOUCH_END, 'touchEnd', TOP_TOUCH_START, 'touchStart', TOP_VOLUME_CHANGE, 'volumeChange'];\n  var otherDiscreteEvents = [TOP_CHANGE, TOP_SELECTION_CHANGE, TOP_TEXT_INPUT, TOP_COMPOSITION_START, TOP_COMPOSITION_END, TOP_COMPOSITION_UPDATE]; // prettier-ignore\n\n  var userBlockingPairsForSimpleEventPlugin = [TOP_DRAG, 'drag', TOP_DRAG_ENTER, 'dragEnter', TOP_DRAG_EXIT, 'dragExit', TOP_DRAG_LEAVE, 'dragLeave', TOP_DRAG_OVER, 'dragOver', TOP_MOUSE_MOVE, 'mouseMove', TOP_MOUSE_OUT, 'mouseOut', TOP_MOUSE_OVER, 'mouseOver', TOP_POINTER_MOVE, 'pointerMove', TOP_POINTER_OUT, 'pointerOut', TOP_POINTER_OVER, 'pointerOver', TOP_SCROLL, 'scroll', TOP_TOGGLE, 'toggle', TOP_TOUCH_MOVE, 'touchMove', TOP_WHEEL, 'wheel']; // prettier-ignore\n\n  var continuousPairsForSimpleEventPlugin = [TOP_ABORT, 'abort', TOP_ANIMATION_END, 'animationEnd', TOP_ANIMATION_ITERATION, 'animationIteration', TOP_ANIMATION_START, 'animationStart', TOP_CAN_PLAY, 'canPlay', TOP_CAN_PLAY_THROUGH, 'canPlayThrough', TOP_DURATION_CHANGE, 'durationChange', TOP_EMPTIED, 'emptied', TOP_ENCRYPTED, 'encrypted', TOP_ENDED, 'ended', TOP_ERROR, 'error', TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture', TOP_LOAD, 'load', TOP_LOADED_DATA, 'loadedData', TOP_LOADED_METADATA, 'loadedMetadata', TOP_LOAD_START, 'loadStart', TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture', TOP_PLAYING, 'playing', TOP_PROGRESS, 'progress', TOP_SEEKING, 'seeking', TOP_STALLED, 'stalled', TOP_SUSPEND, 'suspend', TOP_TIME_UPDATE, 'timeUpdate', TOP_TRANSITION_END, 'transitionEnd', TOP_WAITING, 'waiting'];\n  /**\n   * Turns\n   * ['abort', ...]\n   * into\n   * eventTypes = {\n   *   'abort': {\n   *     phasedRegistrationNames: {\n   *       bubbled: 'onAbort',\n   *       captured: 'onAbortCapture',\n   *     },\n   *     dependencies: [TOP_ABORT],\n   *   },\n   *   ...\n   * };\n   * topLevelEventsToDispatchConfig = new Map([\n   *   [TOP_ABORT, { sameConfig }],\n   * ]);\n   */\n\n  function processSimpleEventPluginPairsByPriority(eventTypes, priority) {\n    // As the event types are in pairs of two, we need to iterate\n    // through in twos. The events are in pairs of two to save code\n    // and improve init perf of processing this array, as it will\n    // result in far fewer object allocations and property accesses\n    // if we only use three arrays to process all the categories of\n    // instead of tuples.\n    for (var i = 0; i < eventTypes.length; i += 2) {\n      var topEvent = eventTypes[i];\n      var event = eventTypes[i + 1];\n      var capitalizedEvent = event[0].toUpperCase() + event.slice(1);\n      var onEvent = 'on' + capitalizedEvent;\n      var config = {\n        phasedRegistrationNames: {\n          bubbled: onEvent,\n          captured: onEvent + 'Capture'\n        },\n        dependencies: [topEvent],\n        eventPriority: priority\n      };\n      eventPriorities.set(topEvent, priority);\n      topLevelEventsToDispatchConfig.set(topEvent, config);\n      simpleEventPluginEventTypes[event] = config;\n    }\n  }\n\n  function processTopEventPairsByPriority(eventTypes, priority) {\n    for (var i = 0; i < eventTypes.length; i++) {\n      eventPriorities.set(eventTypes[i], priority);\n    }\n  } // SimpleEventPlugin\n\n\n  processSimpleEventPluginPairsByPriority(discreteEventPairsForSimpleEventPlugin, DiscreteEvent);\n  processSimpleEventPluginPairsByPriority(userBlockingPairsForSimpleEventPlugin, UserBlockingEvent);\n  processSimpleEventPluginPairsByPriority(continuousPairsForSimpleEventPlugin, ContinuousEvent); // Not used by SimpleEventPlugin\n\n  processTopEventPairsByPriority(otherDiscreteEvents, DiscreteEvent);\n  function getEventPriorityForPluginSystem(topLevelType) {\n    var priority = eventPriorities.get(topLevelType); // Default to a ContinuousEvent. Note: we might\n    // want to warn if we can't detect the priority\n    // for the event.\n\n    return priority === undefined ? ContinuousEvent : priority;\n  }\n\n  // Intentionally not named imports because Rollup would use dynamic dispatch for\n  var UserBlockingPriority = unstable_UserBlockingPriority,\n      runWithPriority = unstable_runWithPriority; // TODO: can we stop exporting these?\n\n  var _enabled = true;\n  function setEnabled(enabled) {\n    _enabled = !!enabled;\n  }\n  function isEnabled() {\n    return _enabled;\n  }\n  function trapBubbledEvent(topLevelType, element) {\n    trapEventForPluginEventSystem(element, topLevelType, false);\n  }\n  function trapCapturedEvent(topLevelType, element) {\n    trapEventForPluginEventSystem(element, topLevelType, true);\n  }\n\n  function trapEventForPluginEventSystem(container, topLevelType, capture) {\n    var listener;\n\n    switch (getEventPriorityForPluginSystem(topLevelType)) {\n      case DiscreteEvent:\n        listener = dispatchDiscreteEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n        break;\n\n      case UserBlockingEvent:\n        listener = dispatchUserBlockingUpdate.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n        break;\n\n      case ContinuousEvent:\n      default:\n        listener = dispatchEvent.bind(null, topLevelType, PLUGIN_EVENT_SYSTEM, container);\n        break;\n    }\n\n    var rawEventName = getRawEventName(topLevelType);\n\n    if (capture) {\n      addEventCaptureListener(container, rawEventName, listener);\n    } else {\n      addEventBubbleListener(container, rawEventName, listener);\n    }\n  }\n\n  function dispatchDiscreteEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n    flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp);\n    discreteUpdates(dispatchEvent, topLevelType, eventSystemFlags, container, nativeEvent);\n  }\n\n  function dispatchUserBlockingUpdate(topLevelType, eventSystemFlags, container, nativeEvent) {\n    runWithPriority(UserBlockingPriority, dispatchEvent.bind(null, topLevelType, eventSystemFlags, container, nativeEvent));\n  }\n\n  function dispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n    if (!_enabled) {\n      return;\n    }\n\n    if (hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(topLevelType)) {\n      // If we already have a queue of discrete events, and this is another discrete\n      // event, then we can't dispatch it regardless of its target, since they\n      // need to dispatch in order.\n      queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know.\n      topLevelType, eventSystemFlags, container, nativeEvent);\n      return;\n    }\n\n    var blockedOn = attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent);\n\n    if (blockedOn === null) {\n      // We successfully dispatched this event.\n      clearIfContinuousEvent(topLevelType, nativeEvent);\n      return;\n    }\n\n    if (isReplayableDiscreteEvent(topLevelType)) {\n      // This this to be replayed later once the target is available.\n      queueDiscreteEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent);\n      return;\n    }\n\n    if (queueIfContinuousEvent(blockedOn, topLevelType, eventSystemFlags, container, nativeEvent)) {\n      return;\n    } // We need to clear only if we didn't queue because\n    // queueing is accummulative.\n\n\n    clearIfContinuousEvent(topLevelType, nativeEvent); // This is not replayable so we'll invoke it but without a target,\n    // in case the event system needs to trace it.\n\n    {\n      dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, null);\n    }\n  } // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked.\n\n  function attemptToDispatchEvent(topLevelType, eventSystemFlags, container, nativeEvent) {\n    // TODO: Warn if _enabled is false.\n    var nativeEventTarget = getEventTarget(nativeEvent);\n    var targetInst = getClosestInstanceFromNode(nativeEventTarget);\n\n    if (targetInst !== null) {\n      var nearestMounted = getNearestMountedFiber(targetInst);\n\n      if (nearestMounted === null) {\n        // This tree has been unmounted already. Dispatch without a target.\n        targetInst = null;\n      } else {\n        var tag = nearestMounted.tag;\n\n        if (tag === SuspenseComponent) {\n          var instance = getSuspenseInstanceFromFiber(nearestMounted);\n\n          if (instance !== null) {\n            // Queue the event to be replayed later. Abort dispatching since we\n            // don't want this event dispatched twice through the event system.\n            // TODO: If this is the first discrete event in the queue. Schedule an increased\n            // priority for this boundary.\n            return instance;\n          } // This shouldn't happen, something went wrong but to avoid blocking\n          // the whole system, dispatch the event without a target.\n          // TODO: Warn.\n\n\n          targetInst = null;\n        } else if (tag === HostRoot) {\n          var root = nearestMounted.stateNode;\n\n          if (root.hydrate) {\n            // If this happens during a replay something went wrong and it might block\n            // the whole system.\n            return getContainerFromFiber(nearestMounted);\n          }\n\n          targetInst = null;\n        } else if (nearestMounted !== targetInst) {\n          // If we get an event (ex: img onload) before committing that\n          // component's mount, ignore it for now (that is, treat it as if it was an\n          // event on a non-React tree). We might also consider queueing events and\n          // dispatching them after the mount.\n          targetInst = null;\n        }\n      }\n    }\n\n    {\n      dispatchEventForLegacyPluginEventSystem(topLevelType, eventSystemFlags, nativeEvent, targetInst);\n    } // We're not blocked on anything.\n\n\n    return null;\n  }\n\n  // List derived from Gecko source code:\n  // https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js\n  var shorthandToLonghand = {\n    animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],\n    background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],\n    backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],\n    border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],\n    borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],\n    borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],\n    borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],\n    borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],\n    borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],\n    borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],\n    borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],\n    borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],\n    borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],\n    borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],\n    borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],\n    borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],\n    borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],\n    columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],\n    columns: ['columnCount', 'columnWidth'],\n    flex: ['flexBasis', 'flexGrow', 'flexShrink'],\n    flexFlow: ['flexDirection', 'flexWrap'],\n    font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],\n    fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],\n    gap: ['columnGap', 'rowGap'],\n    grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],\n    gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],\n    gridColumn: ['gridColumnEnd', 'gridColumnStart'],\n    gridColumnGap: ['columnGap'],\n    gridGap: ['columnGap', 'rowGap'],\n    gridRow: ['gridRowEnd', 'gridRowStart'],\n    gridRowGap: ['rowGap'],\n    gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],\n    listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],\n    margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],\n    marker: ['markerEnd', 'markerMid', 'markerStart'],\n    mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],\n    maskPosition: ['maskPositionX', 'maskPositionY'],\n    outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],\n    overflow: ['overflowX', 'overflowY'],\n    padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],\n    placeContent: ['alignContent', 'justifyContent'],\n    placeItems: ['alignItems', 'justifyItems'],\n    placeSelf: ['alignSelf', 'justifySelf'],\n    textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],\n    textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],\n    transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],\n    wordWrap: ['overflowWrap']\n  };\n\n  /**\n   * CSS properties which accept numbers but are not in units of \"px\".\n   */\n  var isUnitlessNumber = {\n    animationIterationCount: true,\n    borderImageOutset: true,\n    borderImageSlice: true,\n    borderImageWidth: true,\n    boxFlex: true,\n    boxFlexGroup: true,\n    boxOrdinalGroup: true,\n    columnCount: true,\n    columns: true,\n    flex: true,\n    flexGrow: true,\n    flexPositive: true,\n    flexShrink: true,\n    flexNegative: true,\n    flexOrder: true,\n    gridArea: true,\n    gridRow: true,\n    gridRowEnd: true,\n    gridRowSpan: true,\n    gridRowStart: true,\n    gridColumn: true,\n    gridColumnEnd: true,\n    gridColumnSpan: true,\n    gridColumnStart: true,\n    fontWeight: true,\n    lineClamp: true,\n    lineHeight: true,\n    opacity: true,\n    order: true,\n    orphans: true,\n    tabSize: true,\n    widows: true,\n    zIndex: true,\n    zoom: true,\n    // SVG-related properties\n    fillOpacity: true,\n    floodOpacity: true,\n    stopOpacity: true,\n    strokeDasharray: true,\n    strokeDashoffset: true,\n    strokeMiterlimit: true,\n    strokeOpacity: true,\n    strokeWidth: true\n  };\n  /**\n   * @param {string} prefix vendor-specific prefix, eg: Webkit\n   * @param {string} key style name, eg: transitionDuration\n   * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n   * WebkitTransitionDuration\n   */\n\n  function prefixKey(prefix, key) {\n    return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n  }\n  /**\n   * Support style names that may come passed in prefixed by adding permutations\n   * of vendor prefixes.\n   */\n\n\n  var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n  // infinite loop, because it iterates over the newly added props too.\n\n  Object.keys(isUnitlessNumber).forEach(function (prop) {\n    prefixes.forEach(function (prefix) {\n      isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n    });\n  });\n\n  /**\n   * Convert a value into the proper css writable value. The style name `name`\n   * should be logical (no hyphens), as specified\n   * in `CSSProperty.isUnitlessNumber`.\n   *\n   * @param {string} name CSS property name such as `topMargin`.\n   * @param {*} value CSS property value such as `10px`.\n   * @return {string} Normalized style value with dimensions applied.\n   */\n\n  function dangerousStyleValue(name, value, isCustomProperty) {\n    // Note that we've removed escapeTextForBrowser() calls here since the\n    // whole string will be escaped when the attribute is injected into\n    // the markup. If you provide unsafe user data here they can inject\n    // arbitrary CSS which may be problematic (I couldn't repro this):\n    // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n    // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n    // This is not an XSS hole but instead a potential CSS injection issue\n    // which has lead to a greater discussion about how we're going to\n    // trust URLs moving forward. See #2115901\n    var isEmpty = value == null || typeof value === 'boolean' || value === '';\n\n    if (isEmpty) {\n      return '';\n    }\n\n    if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {\n      return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n    }\n\n    return ('' + value).trim();\n  }\n\n  var uppercasePattern = /([A-Z])/g;\n  var msPattern = /^ms-/;\n  /**\n   * Hyphenates a camelcased CSS property name, for example:\n   *\n   *   > hyphenateStyleName('backgroundColor')\n   *   < \"background-color\"\n   *   > hyphenateStyleName('MozTransition')\n   *   < \"-moz-transition\"\n   *   > hyphenateStyleName('msTransition')\n   *   < \"-ms-transition\"\n   *\n   * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n   * is converted to `-ms-`.\n   */\n\n  function hyphenateStyleName(name) {\n    return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');\n  }\n\n  var warnValidStyle = function () {};\n\n  {\n    // 'msTransform' is correct, but the other prefixes should be capitalized\n    var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;\n    var msPattern$1 = /^-ms-/;\n    var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon\n\n    var badStyleValueWithSemicolonPattern = /;\\s*$/;\n    var warnedStyleNames = {};\n    var warnedStyleValues = {};\n    var warnedForNaNValue = false;\n    var warnedForInfinityValue = false;\n\n    var camelize = function (string) {\n      return string.replace(hyphenPattern, function (_, character) {\n        return character.toUpperCase();\n      });\n    };\n\n    var warnHyphenatedStyleName = function (name) {\n      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n        return;\n      }\n\n      warnedStyleNames[name] = true;\n\n      error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests\n      // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix\n      // is converted to lowercase `ms`.\n      camelize(name.replace(msPattern$1, 'ms-')));\n    };\n\n    var warnBadVendoredStyleName = function (name) {\n      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n        return;\n      }\n\n      warnedStyleNames[name] = true;\n\n      error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));\n    };\n\n    var warnStyleValueWithSemicolon = function (name, value) {\n      if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {\n        return;\n      }\n\n      warnedStyleValues[value] = true;\n\n      error(\"Style property values shouldn't contain a semicolon. \" + 'Try \"%s: %s\" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));\n    };\n\n    var warnStyleValueIsNaN = function (name, value) {\n      if (warnedForNaNValue) {\n        return;\n      }\n\n      warnedForNaNValue = true;\n\n      error('`NaN` is an invalid value for the `%s` css style property.', name);\n    };\n\n    var warnStyleValueIsInfinity = function (name, value) {\n      if (warnedForInfinityValue) {\n        return;\n      }\n\n      warnedForInfinityValue = true;\n\n      error('`Infinity` is an invalid value for the `%s` css style property.', name);\n    };\n\n    warnValidStyle = function (name, value) {\n      if (name.indexOf('-') > -1) {\n        warnHyphenatedStyleName(name);\n      } else if (badVendoredStyleNamePattern.test(name)) {\n        warnBadVendoredStyleName(name);\n      } else if (badStyleValueWithSemicolonPattern.test(value)) {\n        warnStyleValueWithSemicolon(name, value);\n      }\n\n      if (typeof value === 'number') {\n        if (isNaN(value)) {\n          warnStyleValueIsNaN(name, value);\n        } else if (!isFinite(value)) {\n          warnStyleValueIsInfinity(name, value);\n        }\n      }\n    };\n  }\n\n  var warnValidStyle$1 = warnValidStyle;\n\n  /**\n   * Operations for dealing with CSS properties.\n   */\n\n  /**\n   * This creates a string that is expected to be equivalent to the style\n   * attribute generated by server-side rendering. It by-passes warnings and\n   * security checks so it's not safe to use this value for anything other than\n   * comparison. It is only used in DEV for SSR validation.\n   */\n\n  function createDangerousStringForStyles(styles) {\n    {\n      var serialized = '';\n      var delimiter = '';\n\n      for (var styleName in styles) {\n        if (!styles.hasOwnProperty(styleName)) {\n          continue;\n        }\n\n        var styleValue = styles[styleName];\n\n        if (styleValue != null) {\n          var isCustomProperty = styleName.indexOf('--') === 0;\n          serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';\n          serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);\n          delimiter = ';';\n        }\n      }\n\n      return serialized || null;\n    }\n  }\n  /**\n   * Sets the value for multiple styles on a node.  If a value is specified as\n   * '' (empty string), the corresponding style property will be unset.\n   *\n   * @param {DOMElement} node\n   * @param {object} styles\n   */\n\n  function setValueForStyles(node, styles) {\n    var style = node.style;\n\n    for (var styleName in styles) {\n      if (!styles.hasOwnProperty(styleName)) {\n        continue;\n      }\n\n      var isCustomProperty = styleName.indexOf('--') === 0;\n\n      {\n        if (!isCustomProperty) {\n          warnValidStyle$1(styleName, styles[styleName]);\n        }\n      }\n\n      var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);\n\n      if (styleName === 'float') {\n        styleName = 'cssFloat';\n      }\n\n      if (isCustomProperty) {\n        style.setProperty(styleName, styleValue);\n      } else {\n        style[styleName] = styleValue;\n      }\n    }\n  }\n\n  function isValueEmpty(value) {\n    return value == null || typeof value === 'boolean' || value === '';\n  }\n  /**\n   * Given {color: 'red', overflow: 'hidden'} returns {\n   *   color: 'color',\n   *   overflowX: 'overflow',\n   *   overflowY: 'overflow',\n   * }. This can be read as \"the overflowY property was set by the overflow\n   * shorthand\". That is, the values are the property that each was derived from.\n   */\n\n\n  function expandShorthandMap(styles) {\n    var expanded = {};\n\n    for (var key in styles) {\n      var longhands = shorthandToLonghand[key] || [key];\n\n      for (var i = 0; i < longhands.length; i++) {\n        expanded[longhands[i]] = key;\n      }\n    }\n\n    return expanded;\n  }\n  /**\n   * When mixing shorthand and longhand property names, we warn during updates if\n   * we expect an incorrect result to occur. In particular, we warn for:\n   *\n   * Updating a shorthand property (longhand gets overwritten):\n   *   {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}\n   *   becomes .style.font = 'baz'\n   * Removing a shorthand property (longhand gets lost too):\n   *   {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}\n   *   becomes .style.font = ''\n   * Removing a longhand property (should revert to shorthand; doesn't):\n   *   {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}\n   *   becomes .style.fontVariant = ''\n   */\n\n\n  function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {\n    {\n\n      if (!nextStyles) {\n        return;\n      }\n\n      var expandedUpdates = expandShorthandMap(styleUpdates);\n      var expandedStyles = expandShorthandMap(nextStyles);\n      var warnedAbout = {};\n\n      for (var key in expandedUpdates) {\n        var originalKey = expandedUpdates[key];\n        var correctOriginalKey = expandedStyles[key];\n\n        if (correctOriginalKey && originalKey !== correctOriginalKey) {\n          var warningKey = originalKey + ',' + correctOriginalKey;\n\n          if (warnedAbout[warningKey]) {\n            continue;\n          }\n\n          warnedAbout[warningKey] = true;\n\n          error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + \"avoid this, don't mix shorthand and non-shorthand properties \" + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey);\n        }\n      }\n    }\n  }\n\n  // For HTML, certain tags should omit their close tag. We keep a whitelist for\n  // those special-case tags.\n  var omittedCloseTags = {\n    area: true,\n    base: true,\n    br: true,\n    col: true,\n    embed: true,\n    hr: true,\n    img: true,\n    input: true,\n    keygen: true,\n    link: true,\n    meta: true,\n    param: true,\n    source: true,\n    track: true,\n    wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.\n\n  };\n\n  // `omittedCloseTags` except that `menuitem` should still have its closing tag.\n\n  var voidElementTags = _assign({\n    menuitem: true\n  }, omittedCloseTags);\n\n  var HTML = '__html';\n  var ReactDebugCurrentFrame$3 = null;\n\n  {\n    ReactDebugCurrentFrame$3 = ReactSharedInternals.ReactDebugCurrentFrame;\n  }\n\n  function assertValidProps(tag, props) {\n    if (!props) {\n      return;\n    } // Note the use of `==` which checks for null or undefined.\n\n\n    if (voidElementTags[tag]) {\n      if (!(props.children == null && props.dangerouslySetInnerHTML == null)) {\n        {\n          throw Error( tag + \" is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.\" + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );\n        }\n      }\n    }\n\n    if (props.dangerouslySetInnerHTML != null) {\n      if (!(props.children == null)) {\n        {\n          throw Error( \"Can only set one of `children` or `props.dangerouslySetInnerHTML`.\" );\n        }\n      }\n\n      if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) {\n        {\n          throw Error( \"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.\" );\n        }\n      }\n    }\n\n    {\n      if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {\n        error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.');\n      }\n    }\n\n    if (!(props.style == null || typeof props.style === 'object')) {\n      {\n        throw Error( \"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.\" + ( ReactDebugCurrentFrame$3.getStackAddendum() ) );\n      }\n    }\n  }\n\n  function isCustomComponent(tagName, props) {\n    if (tagName.indexOf('-') === -1) {\n      return typeof props.is === 'string';\n    }\n\n    switch (tagName) {\n      // These are reserved SVG and MathML elements.\n      // We don't mind this whitelist too much because we expect it to never grow.\n      // The alternative is to track the namespace in a few places which is convoluted.\n      // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts\n      case 'annotation-xml':\n      case 'color-profile':\n      case 'font-face':\n      case 'font-face-src':\n      case 'font-face-uri':\n      case 'font-face-format':\n      case 'font-face-name':\n      case 'missing-glyph':\n        return false;\n\n      default:\n        return true;\n    }\n  }\n\n  // When adding attributes to the HTML or SVG whitelist, be sure to\n  // also add them to this module to ensure casing and incorrect name\n  // warnings.\n  var possibleStandardNames = {\n    // HTML\n    accept: 'accept',\n    acceptcharset: 'acceptCharset',\n    'accept-charset': 'acceptCharset',\n    accesskey: 'accessKey',\n    action: 'action',\n    allowfullscreen: 'allowFullScreen',\n    alt: 'alt',\n    as: 'as',\n    async: 'async',\n    autocapitalize: 'autoCapitalize',\n    autocomplete: 'autoComplete',\n    autocorrect: 'autoCorrect',\n    autofocus: 'autoFocus',\n    autoplay: 'autoPlay',\n    autosave: 'autoSave',\n    capture: 'capture',\n    cellpadding: 'cellPadding',\n    cellspacing: 'cellSpacing',\n    challenge: 'challenge',\n    charset: 'charSet',\n    checked: 'checked',\n    children: 'children',\n    cite: 'cite',\n    class: 'className',\n    classid: 'classID',\n    classname: 'className',\n    cols: 'cols',\n    colspan: 'colSpan',\n    content: 'content',\n    contenteditable: 'contentEditable',\n    contextmenu: 'contextMenu',\n    controls: 'controls',\n    controlslist: 'controlsList',\n    coords: 'coords',\n    crossorigin: 'crossOrigin',\n    dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',\n    data: 'data',\n    datetime: 'dateTime',\n    default: 'default',\n    defaultchecked: 'defaultChecked',\n    defaultvalue: 'defaultValue',\n    defer: 'defer',\n    dir: 'dir',\n    disabled: 'disabled',\n    disablepictureinpicture: 'disablePictureInPicture',\n    download: 'download',\n    draggable: 'draggable',\n    enctype: 'encType',\n    for: 'htmlFor',\n    form: 'form',\n    formmethod: 'formMethod',\n    formaction: 'formAction',\n    formenctype: 'formEncType',\n    formnovalidate: 'formNoValidate',\n    formtarget: 'formTarget',\n    frameborder: 'frameBorder',\n    headers: 'headers',\n    height: 'height',\n    hidden: 'hidden',\n    high: 'high',\n    href: 'href',\n    hreflang: 'hrefLang',\n    htmlfor: 'htmlFor',\n    httpequiv: 'httpEquiv',\n    'http-equiv': 'httpEquiv',\n    icon: 'icon',\n    id: 'id',\n    innerhtml: 'innerHTML',\n    inputmode: 'inputMode',\n    integrity: 'integrity',\n    is: 'is',\n    itemid: 'itemID',\n    itemprop: 'itemProp',\n    itemref: 'itemRef',\n    itemscope: 'itemScope',\n    itemtype: 'itemType',\n    keyparams: 'keyParams',\n    keytype: 'keyType',\n    kind: 'kind',\n    label: 'label',\n    lang: 'lang',\n    list: 'list',\n    loop: 'loop',\n    low: 'low',\n    manifest: 'manifest',\n    marginwidth: 'marginWidth',\n    marginheight: 'marginHeight',\n    max: 'max',\n    maxlength: 'maxLength',\n    media: 'media',\n    mediagroup: 'mediaGroup',\n    method: 'method',\n    min: 'min',\n    minlength: 'minLength',\n    multiple: 'multiple',\n    muted: 'muted',\n    name: 'name',\n    nomodule: 'noModule',\n    nonce: 'nonce',\n    novalidate: 'noValidate',\n    open: 'open',\n    optimum: 'optimum',\n    pattern: 'pattern',\n    placeholder: 'placeholder',\n    playsinline: 'playsInline',\n    poster: 'poster',\n    preload: 'preload',\n    profile: 'profile',\n    radiogroup: 'radioGroup',\n    readonly: 'readOnly',\n    referrerpolicy: 'referrerPolicy',\n    rel: 'rel',\n    required: 'required',\n    reversed: 'reversed',\n    role: 'role',\n    rows: 'rows',\n    rowspan: 'rowSpan',\n    sandbox: 'sandbox',\n    scope: 'scope',\n    scoped: 'scoped',\n    scrolling: 'scrolling',\n    seamless: 'seamless',\n    selected: 'selected',\n    shape: 'shape',\n    size: 'size',\n    sizes: 'sizes',\n    span: 'span',\n    spellcheck: 'spellCheck',\n    src: 'src',\n    srcdoc: 'srcDoc',\n    srclang: 'srcLang',\n    srcset: 'srcSet',\n    start: 'start',\n    step: 'step',\n    style: 'style',\n    summary: 'summary',\n    tabindex: 'tabIndex',\n    target: 'target',\n    title: 'title',\n    type: 'type',\n    usemap: 'useMap',\n    value: 'value',\n    width: 'width',\n    wmode: 'wmode',\n    wrap: 'wrap',\n    // SVG\n    about: 'about',\n    accentheight: 'accentHeight',\n    'accent-height': 'accentHeight',\n    accumulate: 'accumulate',\n    additive: 'additive',\n    alignmentbaseline: 'alignmentBaseline',\n    'alignment-baseline': 'alignmentBaseline',\n    allowreorder: 'allowReorder',\n    alphabetic: 'alphabetic',\n    amplitude: 'amplitude',\n    arabicform: 'arabicForm',\n    'arabic-form': 'arabicForm',\n    ascent: 'ascent',\n    attributename: 'attributeName',\n    attributetype: 'attributeType',\n    autoreverse: 'autoReverse',\n    azimuth: 'azimuth',\n    basefrequency: 'baseFrequency',\n    baselineshift: 'baselineShift',\n    'baseline-shift': 'baselineShift',\n    baseprofile: 'baseProfile',\n    bbox: 'bbox',\n    begin: 'begin',\n    bias: 'bias',\n    by: 'by',\n    calcmode: 'calcMode',\n    capheight: 'capHeight',\n    'cap-height': 'capHeight',\n    clip: 'clip',\n    clippath: 'clipPath',\n    'clip-path': 'clipPath',\n    clippathunits: 'clipPathUnits',\n    cliprule: 'clipRule',\n    'clip-rule': 'clipRule',\n    color: 'color',\n    colorinterpolation: 'colorInterpolation',\n    'color-interpolation': 'colorInterpolation',\n    colorinterpolationfilters: 'colorInterpolationFilters',\n    'color-interpolation-filters': 'colorInterpolationFilters',\n    colorprofile: 'colorProfile',\n    'color-profile': 'colorProfile',\n    colorrendering: 'colorRendering',\n    'color-rendering': 'colorRendering',\n    contentscripttype: 'contentScriptType',\n    contentstyletype: 'contentStyleType',\n    cursor: 'cursor',\n    cx: 'cx',\n    cy: 'cy',\n    d: 'd',\n    datatype: 'datatype',\n    decelerate: 'decelerate',\n    descent: 'descent',\n    diffuseconstant: 'diffuseConstant',\n    direction: 'direction',\n    display: 'display',\n    divisor: 'divisor',\n    dominantbaseline: 'dominantBaseline',\n    'dominant-baseline': 'dominantBaseline',\n    dur: 'dur',\n    dx: 'dx',\n    dy: 'dy',\n    edgemode: 'edgeMode',\n    elevation: 'elevation',\n    enablebackground: 'enableBackground',\n    'enable-background': 'enableBackground',\n    end: 'end',\n    exponent: 'exponent',\n    externalresourcesrequired: 'externalResourcesRequired',\n    fill: 'fill',\n    fillopacity: 'fillOpacity',\n    'fill-opacity': 'fillOpacity',\n    fillrule: 'fillRule',\n    'fill-rule': 'fillRule',\n    filter: 'filter',\n    filterres: 'filterRes',\n    filterunits: 'filterUnits',\n    floodopacity: 'floodOpacity',\n    'flood-opacity': 'floodOpacity',\n    floodcolor: 'floodColor',\n    'flood-color': 'floodColor',\n    focusable: 'focusable',\n    fontfamily: 'fontFamily',\n    'font-family': 'fontFamily',\n    fontsize: 'fontSize',\n    'font-size': 'fontSize',\n    fontsizeadjust: 'fontSizeAdjust',\n    'font-size-adjust': 'fontSizeAdjust',\n    fontstretch: 'fontStretch',\n    'font-stretch': 'fontStretch',\n    fontstyle: 'fontStyle',\n    'font-style': 'fontStyle',\n    fontvariant: 'fontVariant',\n    'font-variant': 'fontVariant',\n    fontweight: 'fontWeight',\n    'font-weight': 'fontWeight',\n    format: 'format',\n    from: 'from',\n    fx: 'fx',\n    fy: 'fy',\n    g1: 'g1',\n    g2: 'g2',\n    glyphname: 'glyphName',\n    'glyph-name': 'glyphName',\n    glyphorientationhorizontal: 'glyphOrientationHorizontal',\n    'glyph-orientation-horizontal': 'glyphOrientationHorizontal',\n    glyphorientationvertical: 'glyphOrientationVertical',\n    'glyph-orientation-vertical': 'glyphOrientationVertical',\n    glyphref: 'glyphRef',\n    gradienttransform: 'gradientTransform',\n    gradientunits: 'gradientUnits',\n    hanging: 'hanging',\n    horizadvx: 'horizAdvX',\n    'horiz-adv-x': 'horizAdvX',\n    horizoriginx: 'horizOriginX',\n    'horiz-origin-x': 'horizOriginX',\n    ideographic: 'ideographic',\n    imagerendering: 'imageRendering',\n    'image-rendering': 'imageRendering',\n    in2: 'in2',\n    in: 'in',\n    inlist: 'inlist',\n    intercept: 'intercept',\n    k1: 'k1',\n    k2: 'k2',\n    k3: 'k3',\n    k4: 'k4',\n    k: 'k',\n    kernelmatrix: 'kernelMatrix',\n    kernelunitlength: 'kernelUnitLength',\n    kerning: 'kerning',\n    keypoints: 'keyPoints',\n    keysplines: 'keySplines',\n    keytimes: 'keyTimes',\n    lengthadjust: 'lengthAdjust',\n    letterspacing: 'letterSpacing',\n    'letter-spacing': 'letterSpacing',\n    lightingcolor: 'lightingColor',\n    'lighting-color': 'lightingColor',\n    limitingconeangle: 'limitingConeAngle',\n    local: 'local',\n    markerend: 'markerEnd',\n    'marker-end': 'markerEnd',\n    markerheight: 'markerHeight',\n    markermid: 'markerMid',\n    'marker-mid': 'markerMid',\n    markerstart: 'markerStart',\n    'marker-start': 'markerStart',\n    markerunits: 'markerUnits',\n    markerwidth: 'markerWidth',\n    mask: 'mask',\n    maskcontentunits: 'maskContentUnits',\n    maskunits: 'maskUnits',\n    mathematical: 'mathematical',\n    mode: 'mode',\n    numoctaves: 'numOctaves',\n    offset: 'offset',\n    opacity: 'opacity',\n    operator: 'operator',\n    order: 'order',\n    orient: 'orient',\n    orientation: 'orientation',\n    origin: 'origin',\n    overflow: 'overflow',\n    overlineposition: 'overlinePosition',\n    'overline-position': 'overlinePosition',\n    overlinethickness: 'overlineThickness',\n    'overline-thickness': 'overlineThickness',\n    paintorder: 'paintOrder',\n    'paint-order': 'paintOrder',\n    panose1: 'panose1',\n    'panose-1': 'panose1',\n    pathlength: 'pathLength',\n    patterncontentunits: 'patternContentUnits',\n    patterntransform: 'patternTransform',\n    patternunits: 'patternUnits',\n    pointerevents: 'pointerEvents',\n    'pointer-events': 'pointerEvents',\n    points: 'points',\n    pointsatx: 'pointsAtX',\n    pointsaty: 'pointsAtY',\n    pointsatz: 'pointsAtZ',\n    prefix: 'prefix',\n    preservealpha: 'preserveAlpha',\n    preserveaspectratio: 'preserveAspectRatio',\n    primitiveunits: 'primitiveUnits',\n    property: 'property',\n    r: 'r',\n    radius: 'radius',\n    refx: 'refX',\n    refy: 'refY',\n    renderingintent: 'renderingIntent',\n    'rendering-intent': 'renderingIntent',\n    repeatcount: 'repeatCount',\n    repeatdur: 'repeatDur',\n    requiredextensions: 'requiredExtensions',\n    requiredfeatures: 'requiredFeatures',\n    resource: 'resource',\n    restart: 'restart',\n    result: 'result',\n    results: 'results',\n    rotate: 'rotate',\n    rx: 'rx',\n    ry: 'ry',\n    scale: 'scale',\n    security: 'security',\n    seed: 'seed',\n    shaperendering: 'shapeRendering',\n    'shape-rendering': 'shapeRendering',\n    slope: 'slope',\n    spacing: 'spacing',\n    specularconstant: 'specularConstant',\n    specularexponent: 'specularExponent',\n    speed: 'speed',\n    spreadmethod: 'spreadMethod',\n    startoffset: 'startOffset',\n    stddeviation: 'stdDeviation',\n    stemh: 'stemh',\n    stemv: 'stemv',\n    stitchtiles: 'stitchTiles',\n    stopcolor: 'stopColor',\n    'stop-color': 'stopColor',\n    stopopacity: 'stopOpacity',\n    'stop-opacity': 'stopOpacity',\n    strikethroughposition: 'strikethroughPosition',\n    'strikethrough-position': 'strikethroughPosition',\n    strikethroughthickness: 'strikethroughThickness',\n    'strikethrough-thickness': 'strikethroughThickness',\n    string: 'string',\n    stroke: 'stroke',\n    strokedasharray: 'strokeDasharray',\n    'stroke-dasharray': 'strokeDasharray',\n    strokedashoffset: 'strokeDashoffset',\n    'stroke-dashoffset': 'strokeDashoffset',\n    strokelinecap: 'strokeLinecap',\n    'stroke-linecap': 'strokeLinecap',\n    strokelinejoin: 'strokeLinejoin',\n    'stroke-linejoin': 'strokeLinejoin',\n    strokemiterlimit: 'strokeMiterlimit',\n    'stroke-miterlimit': 'strokeMiterlimit',\n    strokewidth: 'strokeWidth',\n    'stroke-width': 'strokeWidth',\n    strokeopacity: 'strokeOpacity',\n    'stroke-opacity': 'strokeOpacity',\n    suppresscontenteditablewarning: 'suppressContentEditableWarning',\n    suppresshydrationwarning: 'suppressHydrationWarning',\n    surfacescale: 'surfaceScale',\n    systemlanguage: 'systemLanguage',\n    tablevalues: 'tableValues',\n    targetx: 'targetX',\n    targety: 'targetY',\n    textanchor: 'textAnchor',\n    'text-anchor': 'textAnchor',\n    textdecoration: 'textDecoration',\n    'text-decoration': 'textDecoration',\n    textlength: 'textLength',\n    textrendering: 'textRendering',\n    'text-rendering': 'textRendering',\n    to: 'to',\n    transform: 'transform',\n    typeof: 'typeof',\n    u1: 'u1',\n    u2: 'u2',\n    underlineposition: 'underlinePosition',\n    'underline-position': 'underlinePosition',\n    underlinethickness: 'underlineThickness',\n    'underline-thickness': 'underlineThickness',\n    unicode: 'unicode',\n    unicodebidi: 'unicodeBidi',\n    'unicode-bidi': 'unicodeBidi',\n    unicoderange: 'unicodeRange',\n    'unicode-range': 'unicodeRange',\n    unitsperem: 'unitsPerEm',\n    'units-per-em': 'unitsPerEm',\n    unselectable: 'unselectable',\n    valphabetic: 'vAlphabetic',\n    'v-alphabetic': 'vAlphabetic',\n    values: 'values',\n    vectoreffect: 'vectorEffect',\n    'vector-effect': 'vectorEffect',\n    version: 'version',\n    vertadvy: 'vertAdvY',\n    'vert-adv-y': 'vertAdvY',\n    vertoriginx: 'vertOriginX',\n    'vert-origin-x': 'vertOriginX',\n    vertoriginy: 'vertOriginY',\n    'vert-origin-y': 'vertOriginY',\n    vhanging: 'vHanging',\n    'v-hanging': 'vHanging',\n    videographic: 'vIdeographic',\n    'v-ideographic': 'vIdeographic',\n    viewbox: 'viewBox',\n    viewtarget: 'viewTarget',\n    visibility: 'visibility',\n    vmathematical: 'vMathematical',\n    'v-mathematical': 'vMathematical',\n    vocab: 'vocab',\n    widths: 'widths',\n    wordspacing: 'wordSpacing',\n    'word-spacing': 'wordSpacing',\n    writingmode: 'writingMode',\n    'writing-mode': 'writingMode',\n    x1: 'x1',\n    x2: 'x2',\n    x: 'x',\n    xchannelselector: 'xChannelSelector',\n    xheight: 'xHeight',\n    'x-height': 'xHeight',\n    xlinkactuate: 'xlinkActuate',\n    'xlink:actuate': 'xlinkActuate',\n    xlinkarcrole: 'xlinkArcrole',\n    'xlink:arcrole': 'xlinkArcrole',\n    xlinkhref: 'xlinkHref',\n    'xlink:href': 'xlinkHref',\n    xlinkrole: 'xlinkRole',\n    'xlink:role': 'xlinkRole',\n    xlinkshow: 'xlinkShow',\n    'xlink:show': 'xlinkShow',\n    xlinktitle: 'xlinkTitle',\n    'xlink:title': 'xlinkTitle',\n    xlinktype: 'xlinkType',\n    'xlink:type': 'xlinkType',\n    xmlbase: 'xmlBase',\n    'xml:base': 'xmlBase',\n    xmllang: 'xmlLang',\n    'xml:lang': 'xmlLang',\n    xmlns: 'xmlns',\n    'xml:space': 'xmlSpace',\n    xmlnsxlink: 'xmlnsXlink',\n    'xmlns:xlink': 'xmlnsXlink',\n    xmlspace: 'xmlSpace',\n    y1: 'y1',\n    y2: 'y2',\n    y: 'y',\n    ychannelselector: 'yChannelSelector',\n    z: 'z',\n    zoomandpan: 'zoomAndPan'\n  };\n\n  var ariaProperties = {\n    'aria-current': 0,\n    // state\n    'aria-details': 0,\n    'aria-disabled': 0,\n    // state\n    'aria-hidden': 0,\n    // state\n    'aria-invalid': 0,\n    // state\n    'aria-keyshortcuts': 0,\n    'aria-label': 0,\n    'aria-roledescription': 0,\n    // Widget Attributes\n    'aria-autocomplete': 0,\n    'aria-checked': 0,\n    'aria-expanded': 0,\n    'aria-haspopup': 0,\n    'aria-level': 0,\n    'aria-modal': 0,\n    'aria-multiline': 0,\n    'aria-multiselectable': 0,\n    'aria-orientation': 0,\n    'aria-placeholder': 0,\n    'aria-pressed': 0,\n    'aria-readonly': 0,\n    'aria-required': 0,\n    'aria-selected': 0,\n    'aria-sort': 0,\n    'aria-valuemax': 0,\n    'aria-valuemin': 0,\n    'aria-valuenow': 0,\n    'aria-valuetext': 0,\n    // Live Region Attributes\n    'aria-atomic': 0,\n    'aria-busy': 0,\n    'aria-live': 0,\n    'aria-relevant': 0,\n    // Drag-and-Drop Attributes\n    'aria-dropeffect': 0,\n    'aria-grabbed': 0,\n    // Relationship Attributes\n    'aria-activedescendant': 0,\n    'aria-colcount': 0,\n    'aria-colindex': 0,\n    'aria-colspan': 0,\n    'aria-controls': 0,\n    'aria-describedby': 0,\n    'aria-errormessage': 0,\n    'aria-flowto': 0,\n    'aria-labelledby': 0,\n    'aria-owns': 0,\n    'aria-posinset': 0,\n    'aria-rowcount': 0,\n    'aria-rowindex': 0,\n    'aria-rowspan': 0,\n    'aria-setsize': 0\n  };\n\n  var warnedProperties = {};\n  var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\n  var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\n  var hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n\n  function validateProperty(tagName, name) {\n    {\n      if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) {\n        return true;\n      }\n\n      if (rARIACamel.test(name)) {\n        var ariaName = 'aria-' + name.slice(4).toLowerCase();\n        var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM\n        // DOM properties, then it is an invalid aria-* attribute.\n\n        if (correctName == null) {\n          error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);\n\n          warnedProperties[name] = true;\n          return true;\n        } // aria-* attributes should be lowercase; suggest the lowercase version.\n\n\n        if (name !== correctName) {\n          error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);\n\n          warnedProperties[name] = true;\n          return true;\n        }\n      }\n\n      if (rARIA.test(name)) {\n        var lowerCasedName = name.toLowerCase();\n        var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM\n        // DOM properties, then it is an invalid aria-* attribute.\n\n        if (standardName == null) {\n          warnedProperties[name] = true;\n          return false;\n        } // aria-* attributes should be lowercase; suggest the lowercase version.\n\n\n        if (name !== standardName) {\n          error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);\n\n          warnedProperties[name] = true;\n          return true;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  function warnInvalidARIAProps(type, props) {\n    {\n      var invalidProps = [];\n\n      for (var key in props) {\n        var isValid = validateProperty(type, key);\n\n        if (!isValid) {\n          invalidProps.push(key);\n        }\n      }\n\n      var unknownPropString = invalidProps.map(function (prop) {\n        return '`' + prop + '`';\n      }).join(', ');\n\n      if (invalidProps.length === 1) {\n        error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);\n      } else if (invalidProps.length > 1) {\n        error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop', unknownPropString, type);\n      }\n    }\n  }\n\n  function validateProperties(type, props) {\n    if (isCustomComponent(type, props)) {\n      return;\n    }\n\n    warnInvalidARIAProps(type, props);\n  }\n\n  var didWarnValueNull = false;\n  function validateProperties$1(type, props) {\n    {\n      if (type !== 'input' && type !== 'textarea' && type !== 'select') {\n        return;\n      }\n\n      if (props != null && props.value === null && !didWarnValueNull) {\n        didWarnValueNull = true;\n\n        if (type === 'select' && props.multiple) {\n          error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type);\n        } else {\n          error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);\n        }\n      }\n    }\n  }\n\n  var validateProperty$1 = function () {};\n\n  {\n    var warnedProperties$1 = {};\n    var _hasOwnProperty = Object.prototype.hasOwnProperty;\n    var EVENT_NAME_REGEX = /^on./;\n    var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;\n    var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\n    var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\n\n    validateProperty$1 = function (tagName, name, value, canUseEventSystem) {\n      if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {\n        return true;\n      }\n\n      var lowerCasedName = name.toLowerCase();\n\n      if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {\n        error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');\n\n        warnedProperties$1[name] = true;\n        return true;\n      } // We can't rely on the event system being injected on the server.\n\n\n      if (canUseEventSystem) {\n        if (registrationNameModules.hasOwnProperty(name)) {\n          return true;\n        }\n\n        var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;\n\n        if (registrationName != null) {\n          error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);\n\n          warnedProperties$1[name] = true;\n          return true;\n        }\n\n        if (EVENT_NAME_REGEX.test(name)) {\n          error('Unknown event handler property `%s`. It will be ignored.', name);\n\n          warnedProperties$1[name] = true;\n          return true;\n        }\n      } else if (EVENT_NAME_REGEX.test(name)) {\n        // If no event plugins have been injected, we are in a server environment.\n        // So we can't tell if the event name is correct for sure, but we can filter\n        // out known bad ones like `onclick`. We can't suggest a specific replacement though.\n        if (INVALID_EVENT_NAME_REGEX.test(name)) {\n          error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);\n        }\n\n        warnedProperties$1[name] = true;\n        return true;\n      } // Let the ARIA attribute hook validate ARIA attributes\n\n\n      if (rARIA$1.test(name) || rARIACamel$1.test(name)) {\n        return true;\n      }\n\n      if (lowerCasedName === 'innerhtml') {\n        error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      if (lowerCasedName === 'aria') {\n        error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {\n        error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      if (typeof value === 'number' && isNaN(value)) {\n        error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      var propertyInfo = getPropertyInfo(name);\n      var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.\n\n      if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n        var standardName = possibleStandardNames[lowerCasedName];\n\n        if (standardName !== name) {\n          error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);\n\n          warnedProperties$1[name] = true;\n          return true;\n        }\n      } else if (!isReserved && name !== lowerCasedName) {\n        // Unknown attributes should have lowercase casing since that's how they\n        // will be cased anyway with server rendering.\n        error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {\n        if (value) {\n          error('Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.', value, name, name, value, name);\n        } else {\n          error('Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name);\n        }\n\n        warnedProperties$1[name] = true;\n        return true;\n      } // Now that we've validated casing, do not validate\n      // data types for reserved props\n\n\n      if (isReserved) {\n        return true;\n      } // Warn when a known attribute is a bad type\n\n\n      if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {\n        warnedProperties$1[name] = true;\n        return false;\n      } // Warn when passing the strings 'false' or 'true' into a boolean prop\n\n\n      if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {\n        error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string \"false\".', name, value);\n\n        warnedProperties$1[name] = true;\n        return true;\n      }\n\n      return true;\n    };\n  }\n\n  var warnUnknownProperties = function (type, props, canUseEventSystem) {\n    {\n      var unknownProps = [];\n\n      for (var key in props) {\n        var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);\n\n        if (!isValid) {\n          unknownProps.push(key);\n        }\n      }\n\n      var unknownPropString = unknownProps.map(function (prop) {\n        return '`' + prop + '`';\n      }).join(', ');\n\n      if (unknownProps.length === 1) {\n        error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);\n      } else if (unknownProps.length > 1) {\n        error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior', unknownPropString, type);\n      }\n    }\n  };\n\n  function validateProperties$2(type, props, canUseEventSystem) {\n    if (isCustomComponent(type, props)) {\n      return;\n    }\n\n    warnUnknownProperties(type, props, canUseEventSystem);\n  }\n\n  var didWarnInvalidHydration = false;\n  var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';\n  var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';\n  var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';\n  var AUTOFOCUS = 'autoFocus';\n  var CHILDREN = 'children';\n  var STYLE = 'style';\n  var HTML$1 = '__html';\n  var HTML_NAMESPACE$1 = Namespaces.html;\n  var warnedUnknownTags;\n  var suppressHydrationWarning;\n  var validatePropertiesInDevelopment;\n  var warnForTextDifference;\n  var warnForPropDifference;\n  var warnForExtraAttributes;\n  var warnForInvalidEventListener;\n  var canDiffStyleForHydrationWarning;\n  var normalizeMarkupForTextOrAttribute;\n  var normalizeHTML;\n\n  {\n    warnedUnknownTags = {\n      // Chrome is the only major browser not shipping <time>. But as of July\n      // 2017 it intends to ship it due to widespread usage. We intentionally\n      // *don't* warn for <time> even if it's unrecognized by Chrome because\n      // it soon will be, and many apps have been using it anyway.\n      time: true,\n      // There are working polyfills for <dialog>. Let people use it.\n      dialog: true,\n      // Electron ships a custom <webview> tag to display external web content in\n      // an isolated frame and process.\n      // This tag is not present in non Electron environments such as JSDom which\n      // is often used for testing purposes.\n      // @see https://electronjs.org/docs/api/webview-tag\n      webview: true\n    };\n\n    validatePropertiesInDevelopment = function (type, props) {\n      validateProperties(type, props);\n      validateProperties$1(type, props);\n      validateProperties$2(type, props,\n      /* canUseEventSystem */\n      true);\n    }; // IE 11 parses & normalizes the style attribute as opposed to other\n    // browsers. It adds spaces and sorts the properties in some\n    // non-alphabetical order. Handling that would require sorting CSS\n    // properties in the client & server versions or applying\n    // `expectedStyle` to a temporary DOM node to read its `style` attribute\n    // normalized. Since it only affects IE, we're skipping style warnings\n    // in that browser completely in favor of doing all that work.\n    // See https://github.com/facebook/react/issues/11807\n\n\n    canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF.\n    // It also can turn \\u0000 into \\uFFFD inside attributes.\n    // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream\n    // If we have a mismatch, it might be caused by that.\n    // We will still patch up in this case but not fire the warning.\n\n    var NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g;\n    var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\n\n    normalizeMarkupForTextOrAttribute = function (markup) {\n      var markupString = typeof markup === 'string' ? markup : '' + markup;\n      return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');\n    };\n\n    warnForTextDifference = function (serverText, clientText) {\n      if (didWarnInvalidHydration) {\n        return;\n      }\n\n      var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);\n      var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);\n\n      if (normalizedServerText === normalizedClientText) {\n        return;\n      }\n\n      didWarnInvalidHydration = true;\n\n      error('Text content did not match. Server: \"%s\" Client: \"%s\"', normalizedServerText, normalizedClientText);\n    };\n\n    warnForPropDifference = function (propName, serverValue, clientValue) {\n      if (didWarnInvalidHydration) {\n        return;\n      }\n\n      var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);\n      var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);\n\n      if (normalizedServerValue === normalizedClientValue) {\n        return;\n      }\n\n      didWarnInvalidHydration = true;\n\n      error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));\n    };\n\n    warnForExtraAttributes = function (attributeNames) {\n      if (didWarnInvalidHydration) {\n        return;\n      }\n\n      didWarnInvalidHydration = true;\n      var names = [];\n      attributeNames.forEach(function (name) {\n        names.push(name);\n      });\n\n      error('Extra attributes from the server: %s', names);\n    };\n\n    warnForInvalidEventListener = function (registrationName, listener) {\n      if (listener === false) {\n        error('Expected `%s` listener to be a function, instead got `false`.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName);\n      } else {\n        error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);\n      }\n    }; // Parse the HTML and read it back to normalize the HTML string so that it\n    // can be used for comparison.\n\n\n    normalizeHTML = function (parent, html) {\n      // We could have created a separate document here to avoid\n      // re-initializing custom elements if they exist. But this breaks\n      // how <noscript> is being handled. So we use the same document.\n      // See the discussion in https://github.com/facebook/react/pull/11157.\n      var testElement = parent.namespaceURI === HTML_NAMESPACE$1 ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);\n      testElement.innerHTML = html;\n      return testElement.innerHTML;\n    };\n  }\n\n  function ensureListeningTo(rootContainerElement, registrationName) {\n    var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;\n    var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument;\n    legacyListenToEvent(registrationName, doc);\n  }\n\n  function getOwnerDocumentFromRootContainer(rootContainerElement) {\n    return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;\n  }\n\n  function noop() {}\n\n  function trapClickOnNonInteractiveElement(node) {\n    // Mobile Safari does not fire properly bubble click events on\n    // non-interactive elements, which means delegated click listeners do not\n    // fire. The workaround for this bug involves attaching an empty click\n    // listener on the target node.\n    // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n    // Just set it using the onclick property so that we don't have to manage any\n    // bookkeeping for it. Not sure if we need to clear it when the listener is\n    // removed.\n    // TODO: Only do this for the relevant Safaris maybe?\n    node.onclick = noop;\n  }\n\n  function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {\n    for (var propKey in nextProps) {\n      if (!nextProps.hasOwnProperty(propKey)) {\n        continue;\n      }\n\n      var nextProp = nextProps[propKey];\n\n      if (propKey === STYLE) {\n        {\n          if (nextProp) {\n            // Freeze the next style object so that we can assume it won't be\n            // mutated. We have already warned for this in the past.\n            Object.freeze(nextProp);\n          }\n        } // Relies on `updateStylesByID` not mutating `styleUpdates`.\n\n\n        setValueForStyles(domElement, nextProp);\n      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n\n        if (nextHtml != null) {\n          setInnerHTML(domElement, nextHtml);\n        }\n      } else if (propKey === CHILDREN) {\n        if (typeof nextProp === 'string') {\n          // Avoid setting initial textContent when the text is empty. In IE11 setting\n          // textContent on a <textarea> will cause the placeholder to not\n          // show within the <textarea> until it has been focused and blurred again.\n          // https://github.com/facebook/react/issues/6731#issuecomment-254874553\n          var canSetTextContent = tag !== 'textarea' || nextProp !== '';\n\n          if (canSetTextContent) {\n            setTextContent(domElement, nextProp);\n          }\n        } else if (typeof nextProp === 'number') {\n          setTextContent(domElement, '' + nextProp);\n        }\n      } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n        if (nextProp != null) {\n          if ( typeof nextProp !== 'function') {\n            warnForInvalidEventListener(propKey, nextProp);\n          }\n\n          ensureListeningTo(rootContainerElement, propKey);\n        }\n      } else if (nextProp != null) {\n        setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);\n      }\n    }\n  }\n\n  function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {\n    // TODO: Handle wasCustomComponentTag\n    for (var i = 0; i < updatePayload.length; i += 2) {\n      var propKey = updatePayload[i];\n      var propValue = updatePayload[i + 1];\n\n      if (propKey === STYLE) {\n        setValueForStyles(domElement, propValue);\n      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n        setInnerHTML(domElement, propValue);\n      } else if (propKey === CHILDREN) {\n        setTextContent(domElement, propValue);\n      } else {\n        setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);\n      }\n    }\n  }\n\n  function createElement(type, props, rootContainerElement, parentNamespace) {\n    var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML\n    // tags get no namespace.\n\n    var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);\n    var domElement;\n    var namespaceURI = parentNamespace;\n\n    if (namespaceURI === HTML_NAMESPACE$1) {\n      namespaceURI = getIntrinsicNamespace(type);\n    }\n\n    if (namespaceURI === HTML_NAMESPACE$1) {\n      {\n        isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to\n        // allow <SVG> or <mATH>.\n\n        if (!isCustomComponentTag && type !== type.toLowerCase()) {\n          error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);\n        }\n      }\n\n      if (type === 'script') {\n        // Create the script via .innerHTML so its \"parser-inserted\" flag is\n        // set to true and it does not execute\n        var div = ownerDocument.createElement('div');\n\n        div.innerHTML = '<script><' + '/script>'; // eslint-disable-line\n        // This is guaranteed to yield a script element.\n\n        var firstChild = div.firstChild;\n        domElement = div.removeChild(firstChild);\n      } else if (typeof props.is === 'string') {\n        // $FlowIssue `createElement` should be updated for Web Components\n        domElement = ownerDocument.createElement(type, {\n          is: props.is\n        });\n      } else {\n        // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.\n        // See discussion in https://github.com/facebook/react/pull/6896\n        // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240\n        domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`\n        // attributes on `select`s needs to be added before `option`s are inserted.\n        // This prevents:\n        // - a bug where the `select` does not scroll to the correct option because singular\n        //  `select` elements automatically pick the first item #13222\n        // - a bug where the `select` set the first item as selected despite the `size` attribute #14239\n        // See https://github.com/facebook/react/issues/13222\n        // and https://github.com/facebook/react/issues/14239\n\n        if (type === 'select') {\n          var node = domElement;\n\n          if (props.multiple) {\n            node.multiple = true;\n          } else if (props.size) {\n            // Setting a size greater than 1 causes a select to behave like `multiple=true`, where\n            // it is possible that no option is selected.\n            //\n            // This is only necessary when a select in \"single selection mode\".\n            node.size = props.size;\n          }\n        }\n      }\n    } else {\n      domElement = ownerDocument.createElementNS(namespaceURI, type);\n    }\n\n    {\n      if (namespaceURI === HTML_NAMESPACE$1) {\n        if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {\n          warnedUnknownTags[type] = true;\n\n          error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);\n        }\n      }\n    }\n\n    return domElement;\n  }\n  function createTextNode(text, rootContainerElement) {\n    return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);\n  }\n  function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {\n    var isCustomComponentTag = isCustomComponent(tag, rawProps);\n\n    {\n      validatePropertiesInDevelopment(tag, rawProps);\n    } // TODO: Make sure that we check isMounted before firing any of these events.\n\n\n    var props;\n\n    switch (tag) {\n      case 'iframe':\n      case 'object':\n      case 'embed':\n        trapBubbledEvent(TOP_LOAD, domElement);\n        props = rawProps;\n        break;\n\n      case 'video':\n      case 'audio':\n        // Create listener for each media event\n        for (var i = 0; i < mediaEventTypes.length; i++) {\n          trapBubbledEvent(mediaEventTypes[i], domElement);\n        }\n\n        props = rawProps;\n        break;\n\n      case 'source':\n        trapBubbledEvent(TOP_ERROR, domElement);\n        props = rawProps;\n        break;\n\n      case 'img':\n      case 'image':\n      case 'link':\n        trapBubbledEvent(TOP_ERROR, domElement);\n        trapBubbledEvent(TOP_LOAD, domElement);\n        props = rawProps;\n        break;\n\n      case 'form':\n        trapBubbledEvent(TOP_RESET, domElement);\n        trapBubbledEvent(TOP_SUBMIT, domElement);\n        props = rawProps;\n        break;\n\n      case 'details':\n        trapBubbledEvent(TOP_TOGGLE, domElement);\n        props = rawProps;\n        break;\n\n      case 'input':\n        initWrapperState(domElement, rawProps);\n        props = getHostProps(domElement, rawProps);\n        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n        // to onChange. Even if there is no listener.\n\n        ensureListeningTo(rootContainerElement, 'onChange');\n        break;\n\n      case 'option':\n        validateProps(domElement, rawProps);\n        props = getHostProps$1(domElement, rawProps);\n        break;\n\n      case 'select':\n        initWrapperState$1(domElement, rawProps);\n        props = getHostProps$2(domElement, rawProps);\n        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n        // to onChange. Even if there is no listener.\n\n        ensureListeningTo(rootContainerElement, 'onChange');\n        break;\n\n      case 'textarea':\n        initWrapperState$2(domElement, rawProps);\n        props = getHostProps$3(domElement, rawProps);\n        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n        // to onChange. Even if there is no listener.\n\n        ensureListeningTo(rootContainerElement, 'onChange');\n        break;\n\n      default:\n        props = rawProps;\n    }\n\n    assertValidProps(tag, props);\n    setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);\n\n    switch (tag) {\n      case 'input':\n        // TODO: Make sure we check if this is still unmounted or do any clean\n        // up necessary since we never stop tracking anymore.\n        track(domElement);\n        postMountWrapper(domElement, rawProps, false);\n        break;\n\n      case 'textarea':\n        // TODO: Make sure we check if this is still unmounted or do any clean\n        // up necessary since we never stop tracking anymore.\n        track(domElement);\n        postMountWrapper$3(domElement);\n        break;\n\n      case 'option':\n        postMountWrapper$1(domElement, rawProps);\n        break;\n\n      case 'select':\n        postMountWrapper$2(domElement, rawProps);\n        break;\n\n      default:\n        if (typeof props.onClick === 'function') {\n          // TODO: This cast may not be sound for SVG, MathML or custom elements.\n          trapClickOnNonInteractiveElement(domElement);\n        }\n\n        break;\n    }\n  } // Calculate the diff between the two objects.\n\n  function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {\n    {\n      validatePropertiesInDevelopment(tag, nextRawProps);\n    }\n\n    var updatePayload = null;\n    var lastProps;\n    var nextProps;\n\n    switch (tag) {\n      case 'input':\n        lastProps = getHostProps(domElement, lastRawProps);\n        nextProps = getHostProps(domElement, nextRawProps);\n        updatePayload = [];\n        break;\n\n      case 'option':\n        lastProps = getHostProps$1(domElement, lastRawProps);\n        nextProps = getHostProps$1(domElement, nextRawProps);\n        updatePayload = [];\n        break;\n\n      case 'select':\n        lastProps = getHostProps$2(domElement, lastRawProps);\n        nextProps = getHostProps$2(domElement, nextRawProps);\n        updatePayload = [];\n        break;\n\n      case 'textarea':\n        lastProps = getHostProps$3(domElement, lastRawProps);\n        nextProps = getHostProps$3(domElement, nextRawProps);\n        updatePayload = [];\n        break;\n\n      default:\n        lastProps = lastRawProps;\n        nextProps = nextRawProps;\n\n        if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {\n          // TODO: This cast may not be sound for SVG, MathML or custom elements.\n          trapClickOnNonInteractiveElement(domElement);\n        }\n\n        break;\n    }\n\n    assertValidProps(tag, nextProps);\n    var propKey;\n    var styleName;\n    var styleUpdates = null;\n\n    for (propKey in lastProps) {\n      if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {\n        continue;\n      }\n\n      if (propKey === STYLE) {\n        var lastStyle = lastProps[propKey];\n\n        for (styleName in lastStyle) {\n          if (lastStyle.hasOwnProperty(styleName)) {\n            if (!styleUpdates) {\n              styleUpdates = {};\n            }\n\n            styleUpdates[styleName] = '';\n          }\n        }\n      } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n        // This is a special case. If any listener updates we need to ensure\n        // that the \"current\" fiber pointer gets updated so we need a commit\n        // to update this element.\n        if (!updatePayload) {\n          updatePayload = [];\n        }\n      } else {\n        // For all other deleted properties we add it to the queue. We use\n        // the whitelist in the commit phase instead.\n        (updatePayload = updatePayload || []).push(propKey, null);\n      }\n    }\n\n    for (propKey in nextProps) {\n      var nextProp = nextProps[propKey];\n      var lastProp = lastProps != null ? lastProps[propKey] : undefined;\n\n      if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {\n        continue;\n      }\n\n      if (propKey === STYLE) {\n        {\n          if (nextProp) {\n            // Freeze the next style object so that we can assume it won't be\n            // mutated. We have already warned for this in the past.\n            Object.freeze(nextProp);\n          }\n        }\n\n        if (lastProp) {\n          // Unset styles on `lastProp` but not on `nextProp`.\n          for (styleName in lastProp) {\n            if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n              if (!styleUpdates) {\n                styleUpdates = {};\n              }\n\n              styleUpdates[styleName] = '';\n            }\n          } // Update styles that changed since `lastProp`.\n\n\n          for (styleName in nextProp) {\n            if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {\n              if (!styleUpdates) {\n                styleUpdates = {};\n              }\n\n              styleUpdates[styleName] = nextProp[styleName];\n            }\n          }\n        } else {\n          // Relies on `updateStylesByID` not mutating `styleUpdates`.\n          if (!styleUpdates) {\n            if (!updatePayload) {\n              updatePayload = [];\n            }\n\n            updatePayload.push(propKey, styleUpdates);\n          }\n\n          styleUpdates = nextProp;\n        }\n      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n        var lastHtml = lastProp ? lastProp[HTML$1] : undefined;\n\n        if (nextHtml != null) {\n          if (lastHtml !== nextHtml) {\n            (updatePayload = updatePayload || []).push(propKey, nextHtml);\n          }\n        }\n      } else if (propKey === CHILDREN) {\n        if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {\n          (updatePayload = updatePayload || []).push(propKey, '' + nextProp);\n        }\n      } else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameModules.hasOwnProperty(propKey)) {\n        if (nextProp != null) {\n          // We eagerly listen to this even though we haven't committed yet.\n          if ( typeof nextProp !== 'function') {\n            warnForInvalidEventListener(propKey, nextProp);\n          }\n\n          ensureListeningTo(rootContainerElement, propKey);\n        }\n\n        if (!updatePayload && lastProp !== nextProp) {\n          // This is a special case. If any listener updates we need to ensure\n          // that the \"current\" props pointer gets updated so we need a commit\n          // to update this element.\n          updatePayload = [];\n        }\n      } else {\n        // For any other property we always add it to the queue and then we\n        // filter it out using the whitelist during the commit.\n        (updatePayload = updatePayload || []).push(propKey, nextProp);\n      }\n    }\n\n    if (styleUpdates) {\n      {\n        validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);\n      }\n\n      (updatePayload = updatePayload || []).push(STYLE, styleUpdates);\n    }\n\n    return updatePayload;\n  } // Apply the diff.\n\n  function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {\n    // Update checked *before* name.\n    // In the middle of an update, it is possible to have multiple checked.\n    // When a checked radio tries to change name, browser makes another radio's checked false.\n    if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {\n      updateChecked(domElement, nextRawProps);\n    }\n\n    var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);\n    var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.\n\n    updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props\n    // changed.\n\n    switch (tag) {\n      case 'input':\n        // Update the wrapper around inputs *after* updating props. This has to\n        // happen after `updateDOMProperties`. Otherwise HTML5 input validations\n        // raise warnings and prevent the new value from being assigned.\n        updateWrapper(domElement, nextRawProps);\n        break;\n\n      case 'textarea':\n        updateWrapper$1(domElement, nextRawProps);\n        break;\n\n      case 'select':\n        // <select> value update needs to occur after <option> children\n        // reconciliation\n        postUpdateWrapper(domElement, nextRawProps);\n        break;\n    }\n  }\n\n  function getPossibleStandardName(propName) {\n    {\n      var lowerCasedName = propName.toLowerCase();\n\n      if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n        return null;\n      }\n\n      return possibleStandardNames[lowerCasedName] || null;\n    }\n  }\n\n  function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) {\n    var isCustomComponentTag;\n    var extraAttributeNames;\n\n    {\n      suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING] === true;\n      isCustomComponentTag = isCustomComponent(tag, rawProps);\n      validatePropertiesInDevelopment(tag, rawProps);\n    } // TODO: Make sure that we check isMounted before firing any of these events.\n\n\n    switch (tag) {\n      case 'iframe':\n      case 'object':\n      case 'embed':\n        trapBubbledEvent(TOP_LOAD, domElement);\n        break;\n\n      case 'video':\n      case 'audio':\n        // Create listener for each media event\n        for (var i = 0; i < mediaEventTypes.length; i++) {\n          trapBubbledEvent(mediaEventTypes[i], domElement);\n        }\n\n        break;\n\n      case 'source':\n        trapBubbledEvent(TOP_ERROR, domElement);\n        break;\n\n      case 'img':\n      case 'image':\n      case 'link':\n        trapBubbledEvent(TOP_ERROR, domElement);\n        trapBubbledEvent(TOP_LOAD, domElement);\n        break;\n\n      case 'form':\n        trapBubbledEvent(TOP_RESET, domElement);\n        trapBubbledEvent(TOP_SUBMIT, domElement);\n        break;\n\n      case 'details':\n        trapBubbledEvent(TOP_TOGGLE, domElement);\n        break;\n\n      case 'input':\n        initWrapperState(domElement, rawProps);\n        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n        // to onChange. Even if there is no listener.\n\n        ensureListeningTo(rootContainerElement, 'onChange');\n        break;\n\n      case 'option':\n        validateProps(domElement, rawProps);\n        break;\n\n      case 'select':\n        initWrapperState$1(domElement, rawProps);\n        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n        // to onChange. Even if there is no listener.\n\n        ensureListeningTo(rootContainerElement, 'onChange');\n        break;\n\n      case 'textarea':\n        initWrapperState$2(domElement, rawProps);\n        trapBubbledEvent(TOP_INVALID, domElement); // For controlled components we always need to ensure we're listening\n        // to onChange. Even if there is no listener.\n\n        ensureListeningTo(rootContainerElement, 'onChange');\n        break;\n    }\n\n    assertValidProps(tag, rawProps);\n\n    {\n      extraAttributeNames = new Set();\n      var attributes = domElement.attributes;\n\n      for (var _i = 0; _i < attributes.length; _i++) {\n        var name = attributes[_i].name.toLowerCase();\n\n        switch (name) {\n          // Built-in SSR attribute is whitelisted\n          case 'data-reactroot':\n            break;\n          // Controlled attributes are not validated\n          // TODO: Only ignore them on controlled tags.\n\n          case 'value':\n            break;\n\n          case 'checked':\n            break;\n\n          case 'selected':\n            break;\n\n          default:\n            // Intentionally use the original name.\n            // See discussion in https://github.com/facebook/react/pull/10676.\n            extraAttributeNames.add(attributes[_i].name);\n        }\n      }\n    }\n\n    var updatePayload = null;\n\n    for (var propKey in rawProps) {\n      if (!rawProps.hasOwnProperty(propKey)) {\n        continue;\n      }\n\n      var nextProp = rawProps[propKey];\n\n      if (propKey === CHILDREN) {\n        // For text content children we compare against textContent. This\n        // might match additional HTML that is hidden when we read it using\n        // textContent. E.g. \"foo\" will match \"f<span>oo</span>\" but that still\n        // satisfies our requirement. Our requirement is not to produce perfect\n        // HTML and attributes. Ideally we should preserve structure but it's\n        // ok not to if the visible content is still enough to indicate what\n        // even listeners these nodes might be wired up to.\n        // TODO: Warn if there is more than a single textNode as a child.\n        // TODO: Should we use domElement.firstChild.nodeValue to compare?\n        if (typeof nextProp === 'string') {\n          if (domElement.textContent !== nextProp) {\n            if ( !suppressHydrationWarning) {\n              warnForTextDifference(domElement.textContent, nextProp);\n            }\n\n            updatePayload = [CHILDREN, nextProp];\n          }\n        } else if (typeof nextProp === 'number') {\n          if (domElement.textContent !== '' + nextProp) {\n            if ( !suppressHydrationWarning) {\n              warnForTextDifference(domElement.textContent, nextProp);\n            }\n\n            updatePayload = [CHILDREN, '' + nextProp];\n          }\n        }\n      } else if (registrationNameModules.hasOwnProperty(propKey)) {\n        if (nextProp != null) {\n          if ( typeof nextProp !== 'function') {\n            warnForInvalidEventListener(propKey, nextProp);\n          }\n\n          ensureListeningTo(rootContainerElement, propKey);\n        }\n      } else if ( // Convince Flow we've calculated it (it's DEV-only in this method.)\n      typeof isCustomComponentTag === 'boolean') {\n        // Validate that the properties correspond to their expected values.\n        var serverValue = void 0;\n        var propertyInfo = getPropertyInfo(propKey);\n\n        if (suppressHydrationWarning) ; else if ( propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated\n        // TODO: Only ignore them on controlled tags.\n        propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n          var serverHTML = domElement.innerHTML;\n          var nextHtml = nextProp ? nextProp[HTML$1] : undefined;\n          var expectedHTML = normalizeHTML(domElement, nextHtml != null ? nextHtml : '');\n\n          if (expectedHTML !== serverHTML) {\n            warnForPropDifference(propKey, serverHTML, expectedHTML);\n          }\n        } else if (propKey === STYLE) {\n          // $FlowFixMe - Should be inferred as not undefined.\n          extraAttributeNames.delete(propKey);\n\n          if (canDiffStyleForHydrationWarning) {\n            var expectedStyle = createDangerousStringForStyles(nextProp);\n            serverValue = domElement.getAttribute('style');\n\n            if (expectedStyle !== serverValue) {\n              warnForPropDifference(propKey, serverValue, expectedStyle);\n            }\n          }\n        } else if (isCustomComponentTag) {\n          // $FlowFixMe - Should be inferred as not undefined.\n          extraAttributeNames.delete(propKey.toLowerCase());\n          serverValue = getValueForAttribute(domElement, propKey, nextProp);\n\n          if (nextProp !== serverValue) {\n            warnForPropDifference(propKey, serverValue, nextProp);\n          }\n        } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {\n          var isMismatchDueToBadCasing = false;\n\n          if (propertyInfo !== null) {\n            // $FlowFixMe - Should be inferred as not undefined.\n            extraAttributeNames.delete(propertyInfo.attributeName);\n            serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);\n          } else {\n            var ownNamespace = parentNamespace;\n\n            if (ownNamespace === HTML_NAMESPACE$1) {\n              ownNamespace = getIntrinsicNamespace(tag);\n            }\n\n            if (ownNamespace === HTML_NAMESPACE$1) {\n              // $FlowFixMe - Should be inferred as not undefined.\n              extraAttributeNames.delete(propKey.toLowerCase());\n            } else {\n              var standardName = getPossibleStandardName(propKey);\n\n              if (standardName !== null && standardName !== propKey) {\n                // If an SVG prop is supplied with bad casing, it will\n                // be successfully parsed from HTML, but will produce a mismatch\n                // (and would be incorrectly rendered on the client).\n                // However, we already warn about bad casing elsewhere.\n                // So we'll skip the misleading extra mismatch warning in this case.\n                isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.\n\n                extraAttributeNames.delete(standardName);\n              } // $FlowFixMe - Should be inferred as not undefined.\n\n\n              extraAttributeNames.delete(propKey);\n            }\n\n            serverValue = getValueForAttribute(domElement, propKey, nextProp);\n          }\n\n          if (nextProp !== serverValue && !isMismatchDueToBadCasing) {\n            warnForPropDifference(propKey, serverValue, nextProp);\n          }\n        }\n      }\n    }\n\n    {\n      // $FlowFixMe - Should be inferred as not undefined.\n      if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {\n        // $FlowFixMe - Should be inferred as not undefined.\n        warnForExtraAttributes(extraAttributeNames);\n      }\n    }\n\n    switch (tag) {\n      case 'input':\n        // TODO: Make sure we check if this is still unmounted or do any clean\n        // up necessary since we never stop tracking anymore.\n        track(domElement);\n        postMountWrapper(domElement, rawProps, true);\n        break;\n\n      case 'textarea':\n        // TODO: Make sure we check if this is still unmounted or do any clean\n        // up necessary since we never stop tracking anymore.\n        track(domElement);\n        postMountWrapper$3(domElement);\n        break;\n\n      case 'select':\n      case 'option':\n        // For input and textarea we current always set the value property at\n        // post mount to force it to diverge from attributes. However, for\n        // option and select we don't quite do the same thing and select\n        // is not resilient to the DOM state changing so we don't do that here.\n        // TODO: Consider not doing this for input and textarea.\n        break;\n\n      default:\n        if (typeof rawProps.onClick === 'function') {\n          // TODO: This cast may not be sound for SVG, MathML or custom elements.\n          trapClickOnNonInteractiveElement(domElement);\n        }\n\n        break;\n    }\n\n    return updatePayload;\n  }\n  function diffHydratedText(textNode, text) {\n    var isDifferent = textNode.nodeValue !== text;\n    return isDifferent;\n  }\n  function warnForUnmatchedText(textNode, text) {\n    {\n      warnForTextDifference(textNode.nodeValue, text);\n    }\n  }\n  function warnForDeletedHydratableElement(parentNode, child) {\n    {\n      if (didWarnInvalidHydration) {\n        return;\n      }\n\n      didWarnInvalidHydration = true;\n\n      error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());\n    }\n  }\n  function warnForDeletedHydratableText(parentNode, child) {\n    {\n      if (didWarnInvalidHydration) {\n        return;\n      }\n\n      didWarnInvalidHydration = true;\n\n      error('Did not expect server HTML to contain the text node \"%s\" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());\n    }\n  }\n  function warnForInsertedHydratedElement(parentNode, tag, props) {\n    {\n      if (didWarnInvalidHydration) {\n        return;\n      }\n\n      didWarnInvalidHydration = true;\n\n      error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());\n    }\n  }\n  function warnForInsertedHydratedText(parentNode, text) {\n    {\n      if (text === '') {\n        // We expect to insert empty text nodes since they're not represented in\n        // the HTML.\n        // TODO: Remove this special case if we can just avoid inserting empty\n        // text nodes.\n        return;\n      }\n\n      if (didWarnInvalidHydration) {\n        return;\n      }\n\n      didWarnInvalidHydration = true;\n\n      error('Expected server HTML to contain a matching text node for \"%s\" in <%s>.', text, parentNode.nodeName.toLowerCase());\n    }\n  }\n  function restoreControlledState$3(domElement, tag, props) {\n    switch (tag) {\n      case 'input':\n        restoreControlledState(domElement, props);\n        return;\n\n      case 'textarea':\n        restoreControlledState$2(domElement, props);\n        return;\n\n      case 'select':\n        restoreControlledState$1(domElement, props);\n        return;\n    }\n  }\n\n  function getActiveElement(doc) {\n    doc = doc || (typeof document !== 'undefined' ? document : undefined);\n\n    if (typeof doc === 'undefined') {\n      return null;\n    }\n\n    try {\n      return doc.activeElement || doc.body;\n    } catch (e) {\n      return doc.body;\n    }\n  }\n\n  /**\n   * Given any node return the first leaf node without children.\n   *\n   * @param {DOMElement|DOMTextNode} node\n   * @return {DOMElement|DOMTextNode}\n   */\n\n  function getLeafNode(node) {\n    while (node && node.firstChild) {\n      node = node.firstChild;\n    }\n\n    return node;\n  }\n  /**\n   * Get the next sibling within a container. This will walk up the\n   * DOM if a node's siblings have been exhausted.\n   *\n   * @param {DOMElement|DOMTextNode} node\n   * @return {?DOMElement|DOMTextNode}\n   */\n\n\n  function getSiblingNode(node) {\n    while (node) {\n      if (node.nextSibling) {\n        return node.nextSibling;\n      }\n\n      node = node.parentNode;\n    }\n  }\n  /**\n   * Get object describing the nodes which contain characters at offset.\n   *\n   * @param {DOMElement|DOMTextNode} root\n   * @param {number} offset\n   * @return {?object}\n   */\n\n\n  function getNodeForCharacterOffset(root, offset) {\n    var node = getLeafNode(root);\n    var nodeStart = 0;\n    var nodeEnd = 0;\n\n    while (node) {\n      if (node.nodeType === TEXT_NODE) {\n        nodeEnd = nodeStart + node.textContent.length;\n\n        if (nodeStart <= offset && nodeEnd >= offset) {\n          return {\n            node: node,\n            offset: offset - nodeStart\n          };\n        }\n\n        nodeStart = nodeEnd;\n      }\n\n      node = getLeafNode(getSiblingNode(node));\n    }\n  }\n\n  /**\n   * @param {DOMElement} outerNode\n   * @return {?object}\n   */\n\n  function getOffsets(outerNode) {\n    var ownerDocument = outerNode.ownerDocument;\n    var win = ownerDocument && ownerDocument.defaultView || window;\n    var selection = win.getSelection && win.getSelection();\n\n    if (!selection || selection.rangeCount === 0) {\n      return null;\n    }\n\n    var anchorNode = selection.anchorNode,\n        anchorOffset = selection.anchorOffset,\n        focusNode = selection.focusNode,\n        focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be \"anonymous divs\", e.g. the\n    // up/down buttons on an <input type=\"number\">. Anonymous divs do not seem to\n    // expose properties, triggering a \"Permission denied error\" if any of its\n    // properties are accessed. The only seemingly possible way to avoid erroring\n    // is to access a property that typically works for non-anonymous divs and\n    // catch any error that may otherwise arise. See\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n\n    try {\n      /* eslint-disable no-unused-expressions */\n      anchorNode.nodeType;\n      focusNode.nodeType;\n      /* eslint-enable no-unused-expressions */\n    } catch (e) {\n      return null;\n    }\n\n    return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);\n  }\n  /**\n   * Returns {start, end} where `start` is the character/codepoint index of\n   * (anchorNode, anchorOffset) within the textContent of `outerNode`, and\n   * `end` is the index of (focusNode, focusOffset).\n   *\n   * Returns null if you pass in garbage input but we should probably just crash.\n   *\n   * Exported only for testing.\n   */\n\n  function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {\n    var length = 0;\n    var start = -1;\n    var end = -1;\n    var indexWithinAnchor = 0;\n    var indexWithinFocus = 0;\n    var node = outerNode;\n    var parentNode = null;\n\n    outer: while (true) {\n      var next = null;\n\n      while (true) {\n        if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {\n          start = length + anchorOffset;\n        }\n\n        if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {\n          end = length + focusOffset;\n        }\n\n        if (node.nodeType === TEXT_NODE) {\n          length += node.nodeValue.length;\n        }\n\n        if ((next = node.firstChild) === null) {\n          break;\n        } // Moving from `node` to its first child `next`.\n\n\n        parentNode = node;\n        node = next;\n      }\n\n      while (true) {\n        if (node === outerNode) {\n          // If `outerNode` has children, this is always the second time visiting\n          // it. If it has no children, this is still the first loop, and the only\n          // valid selection is anchorNode and focusNode both equal to this node\n          // and both offsets 0, in which case we will have handled above.\n          break outer;\n        }\n\n        if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {\n          start = length;\n        }\n\n        if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {\n          end = length;\n        }\n\n        if ((next = node.nextSibling) !== null) {\n          break;\n        }\n\n        node = parentNode;\n        parentNode = node.parentNode;\n      } // Moving from `node` to its next sibling `next`.\n\n\n      node = next;\n    }\n\n    if (start === -1 || end === -1) {\n      // This should never happen. (Would happen if the anchor/focus nodes aren't\n      // actually inside the passed-in node.)\n      return null;\n    }\n\n    return {\n      start: start,\n      end: end\n    };\n  }\n  /**\n   * In modern non-IE browsers, we can support both forward and backward\n   * selections.\n   *\n   * Note: IE10+ supports the Selection object, but it does not support\n   * the `extend` method, which means that even in modern IE, it's not possible\n   * to programmatically create a backward selection. Thus, for all IE\n   * versions, we use the old IE API to create our selections.\n   *\n   * @param {DOMElement|DOMTextNode} node\n   * @param {object} offsets\n   */\n\n  function setOffsets(node, offsets) {\n    var doc = node.ownerDocument || document;\n    var win = doc && doc.defaultView || window; // Edge fails with \"Object expected\" in some scenarios.\n    // (For instance: TinyMCE editor used in a list component that supports pasting to add more,\n    // fails when pasting 100+ items)\n\n    if (!win.getSelection) {\n      return;\n    }\n\n    var selection = win.getSelection();\n    var length = node.textContent.length;\n    var start = Math.min(offsets.start, length);\n    var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.\n    // Flip backward selections, so we can set with a single range.\n\n    if (!selection.extend && start > end) {\n      var temp = end;\n      end = start;\n      start = temp;\n    }\n\n    var startMarker = getNodeForCharacterOffset(node, start);\n    var endMarker = getNodeForCharacterOffset(node, end);\n\n    if (startMarker && endMarker) {\n      if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {\n        return;\n      }\n\n      var range = doc.createRange();\n      range.setStart(startMarker.node, startMarker.offset);\n      selection.removeAllRanges();\n\n      if (start > end) {\n        selection.addRange(range);\n        selection.extend(endMarker.node, endMarker.offset);\n      } else {\n        range.setEnd(endMarker.node, endMarker.offset);\n        selection.addRange(range);\n      }\n    }\n  }\n\n  function isTextNode(node) {\n    return node && node.nodeType === TEXT_NODE;\n  }\n\n  function containsNode(outerNode, innerNode) {\n    if (!outerNode || !innerNode) {\n      return false;\n    } else if (outerNode === innerNode) {\n      return true;\n    } else if (isTextNode(outerNode)) {\n      return false;\n    } else if (isTextNode(innerNode)) {\n      return containsNode(outerNode, innerNode.parentNode);\n    } else if ('contains' in outerNode) {\n      return outerNode.contains(innerNode);\n    } else if (outerNode.compareDocumentPosition) {\n      return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n    } else {\n      return false;\n    }\n  }\n\n  function isInDocument(node) {\n    return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);\n  }\n\n  function isSameOriginFrame(iframe) {\n    try {\n      // Accessing the contentDocument of a HTMLIframeElement can cause the browser\n      // to throw, e.g. if it has a cross-origin src attribute.\n      // Safari will show an error in the console when the access results in \"Blocked a frame with origin\". e.g:\n      // iframe.contentDocument.defaultView;\n      // A safety way is to access one of the cross origin properties: Window or Location\n      // Which might result in \"SecurityError\" DOM Exception and it is compatible to Safari.\n      // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl\n      return typeof iframe.contentWindow.location.href === 'string';\n    } catch (err) {\n      return false;\n    }\n  }\n\n  function getActiveElementDeep() {\n    var win = window;\n    var element = getActiveElement();\n\n    while (element instanceof win.HTMLIFrameElement) {\n      if (isSameOriginFrame(element)) {\n        win = element.contentWindow;\n      } else {\n        return element;\n      }\n\n      element = getActiveElement(win.document);\n    }\n\n    return element;\n  }\n  /**\n   * @ReactInputSelection: React input selection module. Based on Selection.js,\n   * but modified to be suitable for react and has a couple of bug fixes (doesn't\n   * assume buttons have range selections allowed).\n   * Input selection module for React.\n   */\n\n  /**\n   * @hasSelectionCapabilities: we get the element types that support selection\n   * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`\n   * and `selectionEnd` rows.\n   */\n\n\n  function hasSelectionCapabilities(elem) {\n    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n    return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');\n  }\n  function getSelectionInformation() {\n    var focusedElem = getActiveElementDeep();\n    return {\n      // Used by Flare\n      activeElementDetached: null,\n      focusedElem: focusedElem,\n      selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null\n    };\n  }\n  /**\n   * @restoreSelection: If any selection information was potentially lost,\n   * restore it. This is useful when performing operations that could remove dom\n   * nodes and place them back in, resulting in focus being lost.\n   */\n\n  function restoreSelection(priorSelectionInformation) {\n    var curFocusedElem = getActiveElementDeep();\n    var priorFocusedElem = priorSelectionInformation.focusedElem;\n    var priorSelectionRange = priorSelectionInformation.selectionRange;\n\n    if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n      if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {\n        setSelection(priorFocusedElem, priorSelectionRange);\n      } // Focusing a node can change the scroll position, which is undesirable\n\n\n      var ancestors = [];\n      var ancestor = priorFocusedElem;\n\n      while (ancestor = ancestor.parentNode) {\n        if (ancestor.nodeType === ELEMENT_NODE) {\n          ancestors.push({\n            element: ancestor,\n            left: ancestor.scrollLeft,\n            top: ancestor.scrollTop\n          });\n        }\n      }\n\n      if (typeof priorFocusedElem.focus === 'function') {\n        priorFocusedElem.focus();\n      }\n\n      for (var i = 0; i < ancestors.length; i++) {\n        var info = ancestors[i];\n        info.element.scrollLeft = info.left;\n        info.element.scrollTop = info.top;\n      }\n    }\n  }\n  /**\n   * @getSelection: Gets the selection bounds of a focused textarea, input or\n   * contentEditable node.\n   * -@input: Look up selection bounds of this input\n   * -@return {start: selectionStart, end: selectionEnd}\n   */\n\n  function getSelection(input) {\n    var selection;\n\n    if ('selectionStart' in input) {\n      // Modern browser with input or textarea.\n      selection = {\n        start: input.selectionStart,\n        end: input.selectionEnd\n      };\n    } else {\n      // Content editable or old IE textarea.\n      selection = getOffsets(input);\n    }\n\n    return selection || {\n      start: 0,\n      end: 0\n    };\n  }\n  /**\n   * @setSelection: Sets the selection bounds of a textarea or input and focuses\n   * the input.\n   * -@input     Set selection bounds of this input or textarea\n   * -@offsets   Object of same form that is returned from get*\n   */\n\n  function setSelection(input, offsets) {\n    var start = offsets.start,\n        end = offsets.end;\n\n    if (end === undefined) {\n      end = start;\n    }\n\n    if ('selectionStart' in input) {\n      input.selectionStart = start;\n      input.selectionEnd = Math.min(end, input.value.length);\n    } else {\n      setOffsets(input, offsets);\n    }\n  }\n\n  var validateDOMNesting = function () {};\n\n  var updatedAncestorInfo = function () {};\n\n  {\n    // This validation code was written based on the HTML5 parsing spec:\n    // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n    //\n    // Note: this does not catch all invalid nesting, nor does it try to (as it's\n    // not clear what practical benefit doing so provides); instead, we warn only\n    // for cases where the parser will give a parse tree differing from what React\n    // intended. For example, <b><div></div></b> is invalid but we don't warn\n    // because it still parses correctly; we do warn for other cases like nested\n    // <p> tags where the beginning of the second element implicitly closes the\n    // first, causing a confusing mess.\n    // https://html.spec.whatwg.org/multipage/syntax.html#special\n    var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n\n    var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point\n    // TODO: Distinguish by namespace here -- for <title>, including it here\n    // errs on the side of fewer warnings\n    'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope\n\n    var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags\n\n    var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];\n    var emptyAncestorInfo = {\n      current: null,\n      formTag: null,\n      aTagInScope: null,\n      buttonTagInScope: null,\n      nobrTagInScope: null,\n      pTagInButtonScope: null,\n      listItemTagAutoclosing: null,\n      dlItemTagAutoclosing: null\n    };\n\n    updatedAncestorInfo = function (oldInfo, tag) {\n      var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);\n\n      var info = {\n        tag: tag\n      };\n\n      if (inScopeTags.indexOf(tag) !== -1) {\n        ancestorInfo.aTagInScope = null;\n        ancestorInfo.buttonTagInScope = null;\n        ancestorInfo.nobrTagInScope = null;\n      }\n\n      if (buttonScopeTags.indexOf(tag) !== -1) {\n        ancestorInfo.pTagInButtonScope = null;\n      } // See rules for 'li', 'dd', 'dt' start tags in\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n\n\n      if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {\n        ancestorInfo.listItemTagAutoclosing = null;\n        ancestorInfo.dlItemTagAutoclosing = null;\n      }\n\n      ancestorInfo.current = info;\n\n      if (tag === 'form') {\n        ancestorInfo.formTag = info;\n      }\n\n      if (tag === 'a') {\n        ancestorInfo.aTagInScope = info;\n      }\n\n      if (tag === 'button') {\n        ancestorInfo.buttonTagInScope = info;\n      }\n\n      if (tag === 'nobr') {\n        ancestorInfo.nobrTagInScope = info;\n      }\n\n      if (tag === 'p') {\n        ancestorInfo.pTagInButtonScope = info;\n      }\n\n      if (tag === 'li') {\n        ancestorInfo.listItemTagAutoclosing = info;\n      }\n\n      if (tag === 'dd' || tag === 'dt') {\n        ancestorInfo.dlItemTagAutoclosing = info;\n      }\n\n      return ancestorInfo;\n    };\n    /**\n     * Returns whether\n     */\n\n\n    var isTagValidWithParent = function (tag, parentTag) {\n      // First, let's check if we're in an unusual parsing mode...\n      switch (parentTag) {\n        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect\n        case 'select':\n          return tag === 'option' || tag === 'optgroup' || tag === '#text';\n\n        case 'optgroup':\n          return tag === 'option' || tag === '#text';\n        // Strictly speaking, seeing an <option> doesn't mean we're in a <select>\n        // but\n\n        case 'option':\n          return tag === '#text';\n        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd\n        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption\n        // No special behavior since these rules fall back to \"in body\" mode for\n        // all except special table nodes which cause bad parsing behavior anyway.\n        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr\n\n        case 'tr':\n          return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';\n        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody\n\n        case 'tbody':\n        case 'thead':\n        case 'tfoot':\n          return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';\n        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup\n\n        case 'colgroup':\n          return tag === 'col' || tag === 'template';\n        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable\n\n        case 'table':\n          return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';\n        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead\n\n        case 'head':\n          return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';\n        // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element\n\n        case 'html':\n          return tag === 'head' || tag === 'body' || tag === 'frameset';\n\n        case 'frameset':\n          return tag === 'frame';\n\n        case '#document':\n          return tag === 'html';\n      } // Probably in the \"in body\" parsing mode, so we outlaw only tag combos\n      // where the parsing rules cause implicit opens or closes to be added.\n      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n\n\n      switch (tag) {\n        case 'h1':\n        case 'h2':\n        case 'h3':\n        case 'h4':\n        case 'h5':\n        case 'h6':\n          return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';\n\n        case 'rp':\n        case 'rt':\n          return impliedEndTags.indexOf(parentTag) === -1;\n\n        case 'body':\n        case 'caption':\n        case 'col':\n        case 'colgroup':\n        case 'frameset':\n        case 'frame':\n        case 'head':\n        case 'html':\n        case 'tbody':\n        case 'td':\n        case 'tfoot':\n        case 'th':\n        case 'thead':\n        case 'tr':\n          // These tags are only valid with a few parents that have special child\n          // parsing rules -- if we're down here, then none of those matched and\n          // so we allow it only if we don't know what the parent is, as all other\n          // cases are invalid.\n          return parentTag == null;\n      }\n\n      return true;\n    };\n    /**\n     * Returns whether\n     */\n\n\n    var findInvalidAncestorForTag = function (tag, ancestorInfo) {\n      switch (tag) {\n        case 'address':\n        case 'article':\n        case 'aside':\n        case 'blockquote':\n        case 'center':\n        case 'details':\n        case 'dialog':\n        case 'dir':\n        case 'div':\n        case 'dl':\n        case 'fieldset':\n        case 'figcaption':\n        case 'figure':\n        case 'footer':\n        case 'header':\n        case 'hgroup':\n        case 'main':\n        case 'menu':\n        case 'nav':\n        case 'ol':\n        case 'p':\n        case 'section':\n        case 'summary':\n        case 'ul':\n        case 'pre':\n        case 'listing':\n        case 'table':\n        case 'hr':\n        case 'xmp':\n        case 'h1':\n        case 'h2':\n        case 'h3':\n        case 'h4':\n        case 'h5':\n        case 'h6':\n          return ancestorInfo.pTagInButtonScope;\n\n        case 'form':\n          return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n        case 'li':\n          return ancestorInfo.listItemTagAutoclosing;\n\n        case 'dd':\n        case 'dt':\n          return ancestorInfo.dlItemTagAutoclosing;\n\n        case 'button':\n          return ancestorInfo.buttonTagInScope;\n\n        case 'a':\n          // Spec says something about storing a list of markers, but it sounds\n          // equivalent to this check.\n          return ancestorInfo.aTagInScope;\n\n        case 'nobr':\n          return ancestorInfo.nobrTagInScope;\n      }\n\n      return null;\n    };\n\n    var didWarn$1 = {};\n\n    validateDOMNesting = function (childTag, childText, ancestorInfo) {\n      ancestorInfo = ancestorInfo || emptyAncestorInfo;\n      var parentInfo = ancestorInfo.current;\n      var parentTag = parentInfo && parentInfo.tag;\n\n      if (childText != null) {\n        if (childTag != null) {\n          error('validateDOMNesting: when childText is passed, childTag should be null');\n        }\n\n        childTag = '#text';\n      }\n\n      var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;\n      var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);\n      var invalidParentOrAncestor = invalidParent || invalidAncestor;\n\n      if (!invalidParentOrAncestor) {\n        return;\n      }\n\n      var ancestorTag = invalidParentOrAncestor.tag;\n      var addendum = getCurrentFiberStackInDev();\n      var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;\n\n      if (didWarn$1[warnKey]) {\n        return;\n      }\n\n      didWarn$1[warnKey] = true;\n      var tagDisplayName = childTag;\n      var whitespaceInfo = '';\n\n      if (childTag === '#text') {\n        if (/\\S/.test(childText)) {\n          tagDisplayName = 'Text nodes';\n        } else {\n          tagDisplayName = 'Whitespace text nodes';\n          whitespaceInfo = \" Make sure you don't have any extra whitespace between tags on \" + 'each line of your source code.';\n        }\n      } else {\n        tagDisplayName = '<' + childTag + '>';\n      }\n\n      if (invalidParent) {\n        var info = '';\n\n        if (ancestorTag === 'table' && childTag === 'tr') {\n          info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';\n        }\n\n        error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info);\n      } else {\n        error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag);\n      }\n    };\n  }\n\n  var SUPPRESS_HYDRATION_WARNING$1;\n\n  {\n    SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';\n  }\n\n  var SUSPENSE_START_DATA = '$';\n  var SUSPENSE_END_DATA = '/$';\n  var SUSPENSE_PENDING_START_DATA = '$?';\n  var SUSPENSE_FALLBACK_START_DATA = '$!';\n  var STYLE$1 = 'style';\n  var eventsEnabled = null;\n  var selectionInformation = null;\n\n  function shouldAutoFocusHostComponent(type, props) {\n    switch (type) {\n      case 'button':\n      case 'input':\n      case 'select':\n      case 'textarea':\n        return !!props.autoFocus;\n    }\n\n    return false;\n  }\n  function getRootHostContext(rootContainerInstance) {\n    var type;\n    var namespace;\n    var nodeType = rootContainerInstance.nodeType;\n\n    switch (nodeType) {\n      case DOCUMENT_NODE:\n      case DOCUMENT_FRAGMENT_NODE:\n        {\n          type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';\n          var root = rootContainerInstance.documentElement;\n          namespace = root ? root.namespaceURI : getChildNamespace(null, '');\n          break;\n        }\n\n      default:\n        {\n          var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;\n          var ownNamespace = container.namespaceURI || null;\n          type = container.tagName;\n          namespace = getChildNamespace(ownNamespace, type);\n          break;\n        }\n    }\n\n    {\n      var validatedTag = type.toLowerCase();\n      var ancestorInfo = updatedAncestorInfo(null, validatedTag);\n      return {\n        namespace: namespace,\n        ancestorInfo: ancestorInfo\n      };\n    }\n  }\n  function getChildHostContext(parentHostContext, type, rootContainerInstance) {\n    {\n      var parentHostContextDev = parentHostContext;\n      var namespace = getChildNamespace(parentHostContextDev.namespace, type);\n      var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);\n      return {\n        namespace: namespace,\n        ancestorInfo: ancestorInfo\n      };\n    }\n  }\n  function getPublicInstance(instance) {\n    return instance;\n  }\n  function prepareForCommit(containerInfo) {\n    eventsEnabled = isEnabled();\n    selectionInformation = getSelectionInformation();\n    setEnabled(false);\n  }\n  function resetAfterCommit(containerInfo) {\n    restoreSelection(selectionInformation);\n    setEnabled(eventsEnabled);\n    eventsEnabled = null;\n\n    selectionInformation = null;\n  }\n  function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n    var parentNamespace;\n\n    {\n      // TODO: take namespace into account when validating.\n      var hostContextDev = hostContext;\n      validateDOMNesting(type, null, hostContextDev.ancestorInfo);\n\n      if (typeof props.children === 'string' || typeof props.children === 'number') {\n        var string = '' + props.children;\n        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);\n        validateDOMNesting(null, string, ownAncestorInfo);\n      }\n\n      parentNamespace = hostContextDev.namespace;\n    }\n\n    var domElement = createElement(type, props, rootContainerInstance, parentNamespace);\n    precacheFiberNode(internalInstanceHandle, domElement);\n    updateFiberProps(domElement, props);\n    return domElement;\n  }\n  function appendInitialChild(parentInstance, child) {\n    parentInstance.appendChild(child);\n  }\n  function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {\n    setInitialProperties(domElement, type, props, rootContainerInstance);\n    return shouldAutoFocusHostComponent(type, props);\n  }\n  function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {\n    {\n      var hostContextDev = hostContext;\n\n      if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {\n        var string = '' + newProps.children;\n        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);\n        validateDOMNesting(null, string, ownAncestorInfo);\n      }\n    }\n\n    return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);\n  }\n  function shouldSetTextContent(type, props) {\n    return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;\n  }\n  function shouldDeprioritizeSubtree(type, props) {\n    return !!props.hidden;\n  }\n  function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {\n    {\n      var hostContextDev = hostContext;\n      validateDOMNesting(null, text, hostContextDev.ancestorInfo);\n    }\n\n    var textNode = createTextNode(text, rootContainerInstance);\n    precacheFiberNode(internalInstanceHandle, textNode);\n    return textNode;\n  }\n  // if a component just imports ReactDOM (e.g. for findDOMNode).\n  // Some environments might not have setTimeout or clearTimeout.\n\n  var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;\n  var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;\n  var noTimeout = -1; // -------------------\n  function commitMount(domElement, type, newProps, internalInstanceHandle) {\n    // Despite the naming that might imply otherwise, this method only\n    // fires if there is an `Update` effect scheduled during mounting.\n    // This happens if `finalizeInitialChildren` returns `true` (which it\n    // does to implement the `autoFocus` attribute on the client). But\n    // there are also other cases when this might happen (such as patching\n    // up text content during hydration mismatch). So we'll check this again.\n    if (shouldAutoFocusHostComponent(type, newProps)) {\n      domElement.focus();\n    }\n  }\n  function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {\n    // Update the props handle so that we know which props are the ones with\n    // with current event handlers.\n    updateFiberProps(domElement, newProps); // Apply the diff to the DOM node.\n\n    updateProperties(domElement, updatePayload, type, oldProps, newProps);\n  }\n  function resetTextContent(domElement) {\n    setTextContent(domElement, '');\n  }\n  function commitTextUpdate(textInstance, oldText, newText) {\n    textInstance.nodeValue = newText;\n  }\n  function appendChild(parentInstance, child) {\n    parentInstance.appendChild(child);\n  }\n  function appendChildToContainer(container, child) {\n    var parentNode;\n\n    if (container.nodeType === COMMENT_NODE) {\n      parentNode = container.parentNode;\n      parentNode.insertBefore(child, container);\n    } else {\n      parentNode = container;\n      parentNode.appendChild(child);\n    } // This container might be used for a portal.\n    // If something inside a portal is clicked, that click should bubble\n    // through the React tree. However, on Mobile Safari the click would\n    // never bubble through the *DOM* tree unless an ancestor with onclick\n    // event exists. So we wouldn't see it and dispatch it.\n    // This is why we ensure that non React root containers have inline onclick\n    // defined.\n    // https://github.com/facebook/react/issues/11918\n\n\n    var reactRootContainer = container._reactRootContainer;\n\n    if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {\n      // TODO: This cast may not be sound for SVG, MathML or custom elements.\n      trapClickOnNonInteractiveElement(parentNode);\n    }\n  }\n  function insertBefore(parentInstance, child, beforeChild) {\n    parentInstance.insertBefore(child, beforeChild);\n  }\n  function insertInContainerBefore(container, child, beforeChild) {\n    if (container.nodeType === COMMENT_NODE) {\n      container.parentNode.insertBefore(child, beforeChild);\n    } else {\n      container.insertBefore(child, beforeChild);\n    }\n  }\n  function removeChild(parentInstance, child) {\n    parentInstance.removeChild(child);\n  }\n  function removeChildFromContainer(container, child) {\n    if (container.nodeType === COMMENT_NODE) {\n      container.parentNode.removeChild(child);\n    } else {\n      container.removeChild(child);\n    }\n  }\n\n  function hideInstance(instance) {\n    // pass host context to this method?\n\n\n    instance = instance;\n    var style = instance.style;\n\n    if (typeof style.setProperty === 'function') {\n      style.setProperty('display', 'none', 'important');\n    } else {\n      style.display = 'none';\n    }\n  }\n  function hideTextInstance(textInstance) {\n    textInstance.nodeValue = '';\n  }\n  function unhideInstance(instance, props) {\n    instance = instance;\n    var styleProp = props[STYLE$1];\n    var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;\n    instance.style.display = dangerousStyleValue('display', display);\n  }\n  function unhideTextInstance(textInstance, text) {\n    textInstance.nodeValue = text;\n  } // -------------------\n  function canHydrateInstance(instance, type, props) {\n    if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {\n      return null;\n    } // This has now been refined to an element node.\n\n\n    return instance;\n  }\n  function canHydrateTextInstance(instance, text) {\n    if (text === '' || instance.nodeType !== TEXT_NODE) {\n      // Empty strings are not parsed by HTML so there won't be a correct match here.\n      return null;\n    } // This has now been refined to a text node.\n\n\n    return instance;\n  }\n  function isSuspenseInstancePending(instance) {\n    return instance.data === SUSPENSE_PENDING_START_DATA;\n  }\n  function isSuspenseInstanceFallback(instance) {\n    return instance.data === SUSPENSE_FALLBACK_START_DATA;\n  }\n\n  function getNextHydratable(node) {\n    // Skip non-hydratable nodes.\n    for (; node != null; node = node.nextSibling) {\n      var nodeType = node.nodeType;\n\n      if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {\n        break;\n      }\n    }\n\n    return node;\n  }\n\n  function getNextHydratableSibling(instance) {\n    return getNextHydratable(instance.nextSibling);\n  }\n  function getFirstHydratableChild(parentInstance) {\n    return getNextHydratable(parentInstance.firstChild);\n  }\n  function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n    precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events\n    // get attached.\n\n    updateFiberProps(instance, props);\n    var parentNamespace;\n\n    {\n      var hostContextDev = hostContext;\n      parentNamespace = hostContextDev.namespace;\n    }\n\n    return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);\n  }\n  function hydrateTextInstance(textInstance, text, internalInstanceHandle) {\n    precacheFiberNode(internalInstanceHandle, textInstance);\n    return diffHydratedText(textInstance, text);\n  }\n  function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {\n    var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.\n    // There might be nested nodes so we need to keep track of how\n    // deep we are and only break out when we're back on top.\n\n    var depth = 0;\n\n    while (node) {\n      if (node.nodeType === COMMENT_NODE) {\n        var data = node.data;\n\n        if (data === SUSPENSE_END_DATA) {\n          if (depth === 0) {\n            return getNextHydratableSibling(node);\n          } else {\n            depth--;\n          }\n        } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {\n          depth++;\n        }\n      }\n\n      node = node.nextSibling;\n    } // TODO: Warn, we didn't find the end comment boundary.\n\n\n    return null;\n  } // Returns the SuspenseInstance if this node is a direct child of a\n  // SuspenseInstance. I.e. if its previous sibling is a Comment with\n  // SUSPENSE_x_START_DATA. Otherwise, null.\n\n  function getParentSuspenseInstance(targetInstance) {\n    var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.\n    // There might be nested nodes so we need to keep track of how\n    // deep we are and only break out when we're back on top.\n\n    var depth = 0;\n\n    while (node) {\n      if (node.nodeType === COMMENT_NODE) {\n        var data = node.data;\n\n        if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {\n          if (depth === 0) {\n            return node;\n          } else {\n            depth--;\n          }\n        } else if (data === SUSPENSE_END_DATA) {\n          depth++;\n        }\n      }\n\n      node = node.previousSibling;\n    }\n\n    return null;\n  }\n  function commitHydratedContainer(container) {\n    // Retry if any event replaying was blocked on this.\n    retryIfBlockedOn(container);\n  }\n  function commitHydratedSuspenseInstance(suspenseInstance) {\n    // Retry if any event replaying was blocked on this.\n    retryIfBlockedOn(suspenseInstance);\n  }\n  function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {\n    {\n      warnForUnmatchedText(textInstance, text);\n    }\n  }\n  function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {\n    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n      warnForUnmatchedText(textInstance, text);\n    }\n  }\n  function didNotHydrateContainerInstance(parentContainer, instance) {\n    {\n      if (instance.nodeType === ELEMENT_NODE) {\n        warnForDeletedHydratableElement(parentContainer, instance);\n      } else if (instance.nodeType === COMMENT_NODE) ; else {\n        warnForDeletedHydratableText(parentContainer, instance);\n      }\n    }\n  }\n  function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {\n    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n      if (instance.nodeType === ELEMENT_NODE) {\n        warnForDeletedHydratableElement(parentInstance, instance);\n      } else if (instance.nodeType === COMMENT_NODE) ; else {\n        warnForDeletedHydratableText(parentInstance, instance);\n      }\n    }\n  }\n  function didNotFindHydratableContainerInstance(parentContainer, type, props) {\n    {\n      warnForInsertedHydratedElement(parentContainer, type);\n    }\n  }\n  function didNotFindHydratableContainerTextInstance(parentContainer, text) {\n    {\n      warnForInsertedHydratedText(parentContainer, text);\n    }\n  }\n  function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {\n    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n      warnForInsertedHydratedElement(parentInstance, type);\n    }\n  }\n  function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {\n    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {\n      warnForInsertedHydratedText(parentInstance, text);\n    }\n  }\n  function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) {\n    if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) ;\n  }\n\n  var randomKey = Math.random().toString(36).slice(2);\n  var internalInstanceKey = '__reactInternalInstance$' + randomKey;\n  var internalEventHandlersKey = '__reactEventHandlers$' + randomKey;\n  var internalContainerInstanceKey = '__reactContainere$' + randomKey;\n  function precacheFiberNode(hostInst, node) {\n    node[internalInstanceKey] = hostInst;\n  }\n  function markContainerAsRoot(hostRoot, node) {\n    node[internalContainerInstanceKey] = hostRoot;\n  }\n  function unmarkContainerAsRoot(node) {\n    node[internalContainerInstanceKey] = null;\n  }\n  function isContainerMarkedAsRoot(node) {\n    return !!node[internalContainerInstanceKey];\n  } // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.\n  // If the target node is part of a hydrated or not yet rendered subtree, then\n  // this may also return a SuspenseComponent or HostRoot to indicate that.\n  // Conceptually the HostRoot fiber is a child of the Container node. So if you\n  // pass the Container node as the targetNode, you will not actually get the\n  // HostRoot back. To get to the HostRoot, you need to pass a child of it.\n  // The same thing applies to Suspense boundaries.\n\n  function getClosestInstanceFromNode(targetNode) {\n    var targetInst = targetNode[internalInstanceKey];\n\n    if (targetInst) {\n      // Don't return HostRoot or SuspenseComponent here.\n      return targetInst;\n    } // If the direct event target isn't a React owned DOM node, we need to look\n    // to see if one of its parents is a React owned DOM node.\n\n\n    var parentNode = targetNode.parentNode;\n\n    while (parentNode) {\n      // We'll check if this is a container root that could include\n      // React nodes in the future. We need to check this first because\n      // if we're a child of a dehydrated container, we need to first\n      // find that inner container before moving on to finding the parent\n      // instance. Note that we don't check this field on  the targetNode\n      // itself because the fibers are conceptually between the container\n      // node and the first child. It isn't surrounding the container node.\n      // If it's not a container, we check if it's an instance.\n      targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];\n\n      if (targetInst) {\n        // Since this wasn't the direct target of the event, we might have\n        // stepped past dehydrated DOM nodes to get here. However they could\n        // also have been non-React nodes. We need to answer which one.\n        // If we the instance doesn't have any children, then there can't be\n        // a nested suspense boundary within it. So we can use this as a fast\n        // bailout. Most of the time, when people add non-React children to\n        // the tree, it is using a ref to a child-less DOM node.\n        // Normally we'd only need to check one of the fibers because if it\n        // has ever gone from having children to deleting them or vice versa\n        // it would have deleted the dehydrated boundary nested inside already.\n        // However, since the HostRoot starts out with an alternate it might\n        // have one on the alternate so we need to check in case this was a\n        // root.\n        var alternate = targetInst.alternate;\n\n        if (targetInst.child !== null || alternate !== null && alternate.child !== null) {\n          // Next we need to figure out if the node that skipped past is\n          // nested within a dehydrated boundary and if so, which one.\n          var suspenseInstance = getParentSuspenseInstance(targetNode);\n\n          while (suspenseInstance !== null) {\n            // We found a suspense instance. That means that we haven't\n            // hydrated it yet. Even though we leave the comments in the\n            // DOM after hydrating, and there are boundaries in the DOM\n            // that could already be hydrated, we wouldn't have found them\n            // through this pass since if the target is hydrated it would\n            // have had an internalInstanceKey on it.\n            // Let's get the fiber associated with the SuspenseComponent\n            // as the deepest instance.\n            var targetSuspenseInst = suspenseInstance[internalInstanceKey];\n\n            if (targetSuspenseInst) {\n              return targetSuspenseInst;\n            } // If we don't find a Fiber on the comment, it might be because\n            // we haven't gotten to hydrate it yet. There might still be a\n            // parent boundary that hasn't above this one so we need to find\n            // the outer most that is known.\n\n\n            suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent\n            // host component also hasn't hydrated yet. We can return it\n            // below since it will bail out on the isMounted check later.\n          }\n        }\n\n        return targetInst;\n      }\n\n      targetNode = parentNode;\n      parentNode = targetNode.parentNode;\n    }\n\n    return null;\n  }\n  /**\n   * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent\n   * instance, or null if the node was not rendered by this React.\n   */\n\n  function getInstanceFromNode$1(node) {\n    var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];\n\n    if (inst) {\n      if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {\n        return inst;\n      } else {\n        return null;\n      }\n    }\n\n    return null;\n  }\n  /**\n   * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding\n   * DOM node.\n   */\n\n  function getNodeFromInstance$1(inst) {\n    if (inst.tag === HostComponent || inst.tag === HostText) {\n      // In Fiber this, is just the state node right now. We assume it will be\n      // a host component or host text.\n      return inst.stateNode;\n    } // Without this first invariant, passing a non-DOM-component triggers the next\n    // invariant for a missing parent, which is super confusing.\n\n\n    {\n      {\n        throw Error( \"getNodeFromInstance: Invalid argument.\" );\n      }\n    }\n  }\n  function getFiberCurrentPropsFromNode$1(node) {\n    return node[internalEventHandlersKey] || null;\n  }\n  function updateFiberProps(node, props) {\n    node[internalEventHandlersKey] = props;\n  }\n\n  function getParent(inst) {\n    do {\n      inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.\n      // That is depending on if we want nested subtrees (layers) to bubble\n      // events to their parent. We could also go through parentNode on the\n      // host node but that wouldn't work for React Native and doesn't let us\n      // do the portal feature.\n    } while (inst && inst.tag !== HostComponent);\n\n    if (inst) {\n      return inst;\n    }\n\n    return null;\n  }\n  /**\n   * Return the lowest common ancestor of A and B, or null if they are in\n   * different trees.\n   */\n\n\n  function getLowestCommonAncestor(instA, instB) {\n    var depthA = 0;\n\n    for (var tempA = instA; tempA; tempA = getParent(tempA)) {\n      depthA++;\n    }\n\n    var depthB = 0;\n\n    for (var tempB = instB; tempB; tempB = getParent(tempB)) {\n      depthB++;\n    } // If A is deeper, crawl up.\n\n\n    while (depthA - depthB > 0) {\n      instA = getParent(instA);\n      depthA--;\n    } // If B is deeper, crawl up.\n\n\n    while (depthB - depthA > 0) {\n      instB = getParent(instB);\n      depthB--;\n    } // Walk in lockstep until we find a match.\n\n\n    var depth = depthA;\n\n    while (depth--) {\n      if (instA === instB || instA === instB.alternate) {\n        return instA;\n      }\n\n      instA = getParent(instA);\n      instB = getParent(instB);\n    }\n\n    return null;\n  }\n  /**\n   * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n   */\n\n  function traverseTwoPhase(inst, fn, arg) {\n    var path = [];\n\n    while (inst) {\n      path.push(inst);\n      inst = getParent(inst);\n    }\n\n    var i;\n\n    for (i = path.length; i-- > 0;) {\n      fn(path[i], 'captured', arg);\n    }\n\n    for (i = 0; i < path.length; i++) {\n      fn(path[i], 'bubbled', arg);\n    }\n  }\n  /**\n   * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n   * should would receive a `mouseEnter` or `mouseLeave` event.\n   *\n   * Does not invoke the callback on the nearest common ancestor because nothing\n   * \"entered\" or \"left\" that element.\n   */\n\n  function traverseEnterLeave(from, to, fn, argFrom, argTo) {\n    var common = from && to ? getLowestCommonAncestor(from, to) : null;\n    var pathFrom = [];\n\n    while (true) {\n      if (!from) {\n        break;\n      }\n\n      if (from === common) {\n        break;\n      }\n\n      var alternate = from.alternate;\n\n      if (alternate !== null && alternate === common) {\n        break;\n      }\n\n      pathFrom.push(from);\n      from = getParent(from);\n    }\n\n    var pathTo = [];\n\n    while (true) {\n      if (!to) {\n        break;\n      }\n\n      if (to === common) {\n        break;\n      }\n\n      var _alternate = to.alternate;\n\n      if (_alternate !== null && _alternate === common) {\n        break;\n      }\n\n      pathTo.push(to);\n      to = getParent(to);\n    }\n\n    for (var i = 0; i < pathFrom.length; i++) {\n      fn(pathFrom[i], 'bubbled', argFrom);\n    }\n\n    for (var _i = pathTo.length; _i-- > 0;) {\n      fn(pathTo[_i], 'captured', argTo);\n    }\n  }\n\n  function isInteractive(tag) {\n    return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';\n  }\n\n  function shouldPreventMouseEvent(name, type, props) {\n    switch (name) {\n      case 'onClick':\n      case 'onClickCapture':\n      case 'onDoubleClick':\n      case 'onDoubleClickCapture':\n      case 'onMouseDown':\n      case 'onMouseDownCapture':\n      case 'onMouseMove':\n      case 'onMouseMoveCapture':\n      case 'onMouseUp':\n      case 'onMouseUpCapture':\n      case 'onMouseEnter':\n        return !!(props.disabled && isInteractive(type));\n\n      default:\n        return false;\n    }\n  }\n  /**\n   * @param {object} inst The instance, which is the source of events.\n   * @param {string} registrationName Name of listener (e.g. `onClick`).\n   * @return {?function} The stored callback.\n   */\n\n\n  function getListener(inst, registrationName) {\n    var listener; // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not\n    // live here; needs to be moved to a better place soon\n\n    var stateNode = inst.stateNode;\n\n    if (!stateNode) {\n      // Work in progress (ex: onload events in incremental mode).\n      return null;\n    }\n\n    var props = getFiberCurrentPropsFromNode(stateNode);\n\n    if (!props) {\n      // Work in progress.\n      return null;\n    }\n\n    listener = props[registrationName];\n\n    if (shouldPreventMouseEvent(registrationName, inst.type, props)) {\n      return null;\n    }\n\n    if (!(!listener || typeof listener === 'function')) {\n      {\n        throw Error( \"Expected `\" + registrationName + \"` listener to be a function, instead got a value of `\" + typeof listener + \"` type.\" );\n      }\n    }\n\n    return listener;\n  }\n\n  /**\n   * Some event types have a notion of different registration names for different\n   * \"phases\" of propagation. This finds listeners by a given phase.\n   */\n  function listenerAtPhase(inst, event, propagationPhase) {\n    var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n    return getListener(inst, registrationName);\n  }\n  /**\n   * A small set of propagation patterns, each of which will accept a small amount\n   * of information, and generate a set of \"dispatch ready event objects\" - which\n   * are sets of events that have already been annotated with a set of dispatched\n   * listener functions/ids. The API is designed this way to discourage these\n   * propagation strategies from actually executing the dispatches, since we\n   * always want to collect the entire set of dispatches before executing even a\n   * single one.\n   */\n\n  /**\n   * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n   * here, allows us to not have to bind or create functions for each event.\n   * Mutating the event's members allows us to not have to create a wrapping\n   * \"dispatch\" object that pairs the event with the listener.\n   */\n\n\n  function accumulateDirectionalDispatches(inst, phase, event) {\n    {\n      if (!inst) {\n        error('Dispatching inst must not be null');\n      }\n    }\n\n    var listener = listenerAtPhase(inst, event, phase);\n\n    if (listener) {\n      event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n      event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n    }\n  }\n  /**\n   * Collect dispatches (must be entirely collected before dispatching - see unit\n   * tests). Lazily allocate the array to conserve memory.  We must loop through\n   * each event and perform the traversal for each one. We cannot perform a\n   * single traversal for the entire collection of events because each event may\n   * have a different target.\n   */\n\n\n  function accumulateTwoPhaseDispatchesSingle(event) {\n    if (event && event.dispatchConfig.phasedRegistrationNames) {\n      traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);\n    }\n  }\n  /**\n   * Accumulates without regard to direction, does not look for phased\n   * registration names. Same as `accumulateDirectDispatchesSingle` but without\n   * requiring that the `dispatchMarker` be the same as the dispatched ID.\n   */\n\n\n  function accumulateDispatches(inst, ignoredDirection, event) {\n    if (inst && event && event.dispatchConfig.registrationName) {\n      var registrationName = event.dispatchConfig.registrationName;\n      var listener = getListener(inst, registrationName);\n\n      if (listener) {\n        event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n        event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n      }\n    }\n  }\n  /**\n   * Accumulates dispatches on an `SyntheticEvent`, but only for the\n   * `dispatchMarker`.\n   * @param {SyntheticEvent} event\n   */\n\n\n  function accumulateDirectDispatchesSingle(event) {\n    if (event && event.dispatchConfig.registrationName) {\n      accumulateDispatches(event._targetInst, null, event);\n    }\n  }\n\n  function accumulateTwoPhaseDispatches(events) {\n    forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n  }\n  function accumulateEnterLeaveDispatches(leave, enter, from, to) {\n    traverseEnterLeave(from, to, accumulateDispatches, leave, enter);\n  }\n  function accumulateDirectDispatches(events) {\n    forEachAccumulated(events, accumulateDirectDispatchesSingle);\n  }\n\n  /**\n   * These variables store information about text content of a target node,\n   * allowing comparison of content before and after a given event.\n   *\n   * Identify the node where selection currently begins, then observe\n   * both its text content and its current position in the DOM. Since the\n   * browser may natively replace the target node during composition, we can\n   * use its position to find its replacement.\n   *\n   *\n   */\n  var root = null;\n  var startText = null;\n  var fallbackText = null;\n  function initialize(nativeEventTarget) {\n    root = nativeEventTarget;\n    startText = getText();\n    return true;\n  }\n  function reset() {\n    root = null;\n    startText = null;\n    fallbackText = null;\n  }\n  function getData() {\n    if (fallbackText) {\n      return fallbackText;\n    }\n\n    var start;\n    var startValue = startText;\n    var startLength = startValue.length;\n    var end;\n    var endValue = getText();\n    var endLength = endValue.length;\n\n    for (start = 0; start < startLength; start++) {\n      if (startValue[start] !== endValue[start]) {\n        break;\n      }\n    }\n\n    var minEnd = startLength - start;\n\n    for (end = 1; end <= minEnd; end++) {\n      if (startValue[startLength - end] !== endValue[endLength - end]) {\n        break;\n      }\n    }\n\n    var sliceTail = end > 1 ? 1 - end : undefined;\n    fallbackText = endValue.slice(start, sliceTail);\n    return fallbackText;\n  }\n  function getText() {\n    if ('value' in root) {\n      return root.value;\n    }\n\n    return root.textContent;\n  }\n\n  var EVENT_POOL_SIZE = 10;\n  /**\n   * @interface Event\n   * @see http://www.w3.org/TR/DOM-Level-3-Events/\n   */\n\n  var EventInterface = {\n    type: null,\n    target: null,\n    // currentTarget is set when dispatching; no use in copying it here\n    currentTarget: function () {\n      return null;\n    },\n    eventPhase: null,\n    bubbles: null,\n    cancelable: null,\n    timeStamp: function (event) {\n      return event.timeStamp || Date.now();\n    },\n    defaultPrevented: null,\n    isTrusted: null\n  };\n\n  function functionThatReturnsTrue() {\n    return true;\n  }\n\n  function functionThatReturnsFalse() {\n    return false;\n  }\n  /**\n   * Synthetic events are dispatched by event plugins, typically in response to a\n   * top-level event delegation handler.\n   *\n   * These systems should generally use pooling to reduce the frequency of garbage\n   * collection. The system should check `isPersistent` to determine whether the\n   * event should be released into the pool after being dispatched. Users that\n   * need a persisted event should invoke `persist`.\n   *\n   * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n   * normalizing browser quirks. Subclasses do not necessarily have to implement a\n   * DOM interface; custom application-specific events can also subclass this.\n   *\n   * @param {object} dispatchConfig Configuration used to dispatch this event.\n   * @param {*} targetInst Marker identifying the event target.\n   * @param {object} nativeEvent Native browser event.\n   * @param {DOMEventTarget} nativeEventTarget Target node.\n   */\n\n\n  function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {\n    {\n      // these have a getter/setter for warnings\n      delete this.nativeEvent;\n      delete this.preventDefault;\n      delete this.stopPropagation;\n      delete this.isDefaultPrevented;\n      delete this.isPropagationStopped;\n    }\n\n    this.dispatchConfig = dispatchConfig;\n    this._targetInst = targetInst;\n    this.nativeEvent = nativeEvent;\n    var Interface = this.constructor.Interface;\n\n    for (var propName in Interface) {\n      if (!Interface.hasOwnProperty(propName)) {\n        continue;\n      }\n\n      {\n        delete this[propName]; // this has a getter/setter for warnings\n      }\n\n      var normalize = Interface[propName];\n\n      if (normalize) {\n        this[propName] = normalize(nativeEvent);\n      } else {\n        if (propName === 'target') {\n          this.target = nativeEventTarget;\n        } else {\n          this[propName] = nativeEvent[propName];\n        }\n      }\n    }\n\n    var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;\n\n    if (defaultPrevented) {\n      this.isDefaultPrevented = functionThatReturnsTrue;\n    } else {\n      this.isDefaultPrevented = functionThatReturnsFalse;\n    }\n\n    this.isPropagationStopped = functionThatReturnsFalse;\n    return this;\n  }\n\n  _assign(SyntheticEvent.prototype, {\n    preventDefault: function () {\n      this.defaultPrevented = true;\n      var event = this.nativeEvent;\n\n      if (!event) {\n        return;\n      }\n\n      if (event.preventDefault) {\n        event.preventDefault();\n      } else if (typeof event.returnValue !== 'unknown') {\n        event.returnValue = false;\n      }\n\n      this.isDefaultPrevented = functionThatReturnsTrue;\n    },\n    stopPropagation: function () {\n      var event = this.nativeEvent;\n\n      if (!event) {\n        return;\n      }\n\n      if (event.stopPropagation) {\n        event.stopPropagation();\n      } else if (typeof event.cancelBubble !== 'unknown') {\n        // The ChangeEventPlugin registers a \"propertychange\" event for\n        // IE. This event does not support bubbling or cancelling, and\n        // any references to cancelBubble throw \"Member not found\".  A\n        // typeof check of \"unknown\" circumvents this issue (and is also\n        // IE specific).\n        event.cancelBubble = true;\n      }\n\n      this.isPropagationStopped = functionThatReturnsTrue;\n    },\n\n    /**\n     * We release all dispatched `SyntheticEvent`s after each event loop, adding\n     * them back into the pool. This allows a way to hold onto a reference that\n     * won't be added back into the pool.\n     */\n    persist: function () {\n      this.isPersistent = functionThatReturnsTrue;\n    },\n\n    /**\n     * Checks if this event should be released back into the pool.\n     *\n     * @return {boolean} True if this should not be released, false otherwise.\n     */\n    isPersistent: functionThatReturnsFalse,\n\n    /**\n     * `PooledClass` looks for `destructor` on each instance it releases.\n     */\n    destructor: function () {\n      var Interface = this.constructor.Interface;\n\n      for (var propName in Interface) {\n        {\n          Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));\n        }\n      }\n\n      this.dispatchConfig = null;\n      this._targetInst = null;\n      this.nativeEvent = null;\n      this.isDefaultPrevented = functionThatReturnsFalse;\n      this.isPropagationStopped = functionThatReturnsFalse;\n      this._dispatchListeners = null;\n      this._dispatchInstances = null;\n\n      {\n        Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));\n        Object.defineProperty(this, 'isDefaultPrevented', getPooledWarningPropertyDefinition('isDefaultPrevented', functionThatReturnsFalse));\n        Object.defineProperty(this, 'isPropagationStopped', getPooledWarningPropertyDefinition('isPropagationStopped', functionThatReturnsFalse));\n        Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', function () {}));\n        Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', function () {}));\n      }\n    }\n  });\n\n  SyntheticEvent.Interface = EventInterface;\n  /**\n   * Helper to reduce boilerplate when creating subclasses.\n   */\n\n  SyntheticEvent.extend = function (Interface) {\n    var Super = this;\n\n    var E = function () {};\n\n    E.prototype = Super.prototype;\n    var prototype = new E();\n\n    function Class() {\n      return Super.apply(this, arguments);\n    }\n\n    _assign(prototype, Class.prototype);\n\n    Class.prototype = prototype;\n    Class.prototype.constructor = Class;\n    Class.Interface = _assign({}, Super.Interface, Interface);\n    Class.extend = Super.extend;\n    addEventPoolingTo(Class);\n    return Class;\n  };\n\n  addEventPoolingTo(SyntheticEvent);\n  /**\n   * Helper to nullify syntheticEvent instance properties when destructing\n   *\n   * @param {String} propName\n   * @param {?object} getVal\n   * @return {object} defineProperty object\n   */\n\n  function getPooledWarningPropertyDefinition(propName, getVal) {\n    var isFunction = typeof getVal === 'function';\n    return {\n      configurable: true,\n      set: set,\n      get: get\n    };\n\n    function set(val) {\n      var action = isFunction ? 'setting the method' : 'setting the property';\n      warn(action, 'This is effectively a no-op');\n      return val;\n    }\n\n    function get() {\n      var action = isFunction ? 'accessing the method' : 'accessing the property';\n      var result = isFunction ? 'This is a no-op function' : 'This is set to null';\n      warn(action, result);\n      return getVal;\n    }\n\n    function warn(action, result) {\n      {\n        error(\"This synthetic event is reused for performance reasons. If you're seeing this, \" + \"you're %s `%s` on a released/nullified synthetic event. %s. \" + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result);\n      }\n    }\n  }\n\n  function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {\n    var EventConstructor = this;\n\n    if (EventConstructor.eventPool.length) {\n      var instance = EventConstructor.eventPool.pop();\n      EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);\n      return instance;\n    }\n\n    return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);\n  }\n\n  function releasePooledEvent(event) {\n    var EventConstructor = this;\n\n    if (!(event instanceof EventConstructor)) {\n      {\n        throw Error( \"Trying to release an event instance into a pool of a different type.\" );\n      }\n    }\n\n    event.destructor();\n\n    if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {\n      EventConstructor.eventPool.push(event);\n    }\n  }\n\n  function addEventPoolingTo(EventConstructor) {\n    EventConstructor.eventPool = [];\n    EventConstructor.getPooled = getPooledEvent;\n    EventConstructor.release = releasePooledEvent;\n  }\n\n  /**\n   * @interface Event\n   * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n   */\n\n  var SyntheticCompositionEvent = SyntheticEvent.extend({\n    data: null\n  });\n\n  /**\n   * @interface Event\n   * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n   *      /#events-inputevents\n   */\n\n  var SyntheticInputEvent = SyntheticEvent.extend({\n    data: null\n  });\n\n  var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\n\n  var START_KEYCODE = 229;\n  var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;\n  var documentMode = null;\n\n  if (canUseDOM && 'documentMode' in document) {\n    documentMode = document.documentMode;\n  } // Webkit offers a very useful `textInput` event that can be used to\n  // directly represent `beforeInput`. The IE `textinput` event is not as\n  // useful, so we don't use it.\n\n\n  var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied\n  // by the native compositionend event may be incorrect. Japanese ideographic\n  // spaces, for instance (\\u3000) are not recorded correctly.\n\n  var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);\n  var SPACEBAR_CODE = 32;\n  var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); // Events and their corresponding property names.\n\n  var eventTypes = {\n    beforeInput: {\n      phasedRegistrationNames: {\n        bubbled: 'onBeforeInput',\n        captured: 'onBeforeInputCapture'\n      },\n      dependencies: [TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE]\n    },\n    compositionEnd: {\n      phasedRegistrationNames: {\n        bubbled: 'onCompositionEnd',\n        captured: 'onCompositionEndCapture'\n      },\n      dependencies: [TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n    },\n    compositionStart: {\n      phasedRegistrationNames: {\n        bubbled: 'onCompositionStart',\n        captured: 'onCompositionStartCapture'\n      },\n      dependencies: [TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n    },\n    compositionUpdate: {\n      phasedRegistrationNames: {\n        bubbled: 'onCompositionUpdate',\n        captured: 'onCompositionUpdateCapture'\n      },\n      dependencies: [TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN]\n    }\n  }; // Track whether we've ever handled a keypress on the space key.\n\n  var hasSpaceKeypress = false;\n  /**\n   * Return whether a native keypress event is assumed to be a command.\n   * This is required because Firefox fires `keypress` events for key commands\n   * (cut, copy, select-all, etc.) even though no character is inserted.\n   */\n\n  function isKeypressCommand(nativeEvent) {\n    return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n    !(nativeEvent.ctrlKey && nativeEvent.altKey);\n  }\n  /**\n   * Translate native top level events into event types.\n   *\n   * @param {string} topLevelType\n   * @return {object}\n   */\n\n\n  function getCompositionEventType(topLevelType) {\n    switch (topLevelType) {\n      case TOP_COMPOSITION_START:\n        return eventTypes.compositionStart;\n\n      case TOP_COMPOSITION_END:\n        return eventTypes.compositionEnd;\n\n      case TOP_COMPOSITION_UPDATE:\n        return eventTypes.compositionUpdate;\n    }\n  }\n  /**\n   * Does our fallback best-guess model think this event signifies that\n   * composition has begun?\n   *\n   * @param {string} topLevelType\n   * @param {object} nativeEvent\n   * @return {boolean}\n   */\n\n\n  function isFallbackCompositionStart(topLevelType, nativeEvent) {\n    return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;\n  }\n  /**\n   * Does our fallback mode think that this event is the end of composition?\n   *\n   * @param {string} topLevelType\n   * @param {object} nativeEvent\n   * @return {boolean}\n   */\n\n\n  function isFallbackCompositionEnd(topLevelType, nativeEvent) {\n    switch (topLevelType) {\n      case TOP_KEY_UP:\n        // Command keys insert or clear IME input.\n        return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;\n\n      case TOP_KEY_DOWN:\n        // Expect IME keyCode on each keydown. If we get any other\n        // code we must have exited earlier.\n        return nativeEvent.keyCode !== START_KEYCODE;\n\n      case TOP_KEY_PRESS:\n      case TOP_MOUSE_DOWN:\n      case TOP_BLUR:\n        // Events are not possible without cancelling IME.\n        return true;\n\n      default:\n        return false;\n    }\n  }\n  /**\n   * Google Input Tools provides composition data via a CustomEvent,\n   * with the `data` property populated in the `detail` object. If this\n   * is available on the event object, use it. If not, this is a plain\n   * composition event and we have nothing special to extract.\n   *\n   * @param {object} nativeEvent\n   * @return {?string}\n   */\n\n\n  function getDataFromCustomEvent(nativeEvent) {\n    var detail = nativeEvent.detail;\n\n    if (typeof detail === 'object' && 'data' in detail) {\n      return detail.data;\n    }\n\n    return null;\n  }\n  /**\n   * Check if a composition event was triggered by Korean IME.\n   * Our fallback mode does not work well with IE's Korean IME,\n   * so just use native composition events when Korean IME is used.\n   * Although CompositionEvent.locale property is deprecated,\n   * it is available in IE, where our fallback mode is enabled.\n   *\n   * @param {object} nativeEvent\n   * @return {boolean}\n   */\n\n\n  function isUsingKoreanIME(nativeEvent) {\n    return nativeEvent.locale === 'ko';\n  } // Track the current IME composition status, if any.\n\n\n  var isComposing = false;\n  /**\n   * @return {?object} A SyntheticCompositionEvent.\n   */\n\n  function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    var eventType;\n    var fallbackData;\n\n    if (canUseCompositionEvent) {\n      eventType = getCompositionEventType(topLevelType);\n    } else if (!isComposing) {\n      if (isFallbackCompositionStart(topLevelType, nativeEvent)) {\n        eventType = eventTypes.compositionStart;\n      }\n    } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n      eventType = eventTypes.compositionEnd;\n    }\n\n    if (!eventType) {\n      return null;\n    }\n\n    if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {\n      // The current composition is stored statically and must not be\n      // overwritten while composition continues.\n      if (!isComposing && eventType === eventTypes.compositionStart) {\n        isComposing = initialize(nativeEventTarget);\n      } else if (eventType === eventTypes.compositionEnd) {\n        if (isComposing) {\n          fallbackData = getData();\n        }\n      }\n    }\n\n    var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);\n\n    if (fallbackData) {\n      // Inject data generated from fallback path into the synthetic event.\n      // This matches the property of native CompositionEventInterface.\n      event.data = fallbackData;\n    } else {\n      var customData = getDataFromCustomEvent(nativeEvent);\n\n      if (customData !== null) {\n        event.data = customData;\n      }\n    }\n\n    accumulateTwoPhaseDispatches(event);\n    return event;\n  }\n  /**\n   * @param {TopLevelType} topLevelType Number from `TopLevelType`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {?string} The string corresponding to this `beforeInput` event.\n   */\n\n\n  function getNativeBeforeInputChars(topLevelType, nativeEvent) {\n    switch (topLevelType) {\n      case TOP_COMPOSITION_END:\n        return getDataFromCustomEvent(nativeEvent);\n\n      case TOP_KEY_PRESS:\n        /**\n         * If native `textInput` events are available, our goal is to make\n         * use of them. However, there is a special case: the spacebar key.\n         * In Webkit, preventing default on a spacebar `textInput` event\n         * cancels character insertion, but it *also* causes the browser\n         * to fall back to its default spacebar behavior of scrolling the\n         * page.\n         *\n         * Tracking at:\n         * https://code.google.com/p/chromium/issues/detail?id=355103\n         *\n         * To avoid this issue, use the keypress event as if no `textInput`\n         * event is available.\n         */\n        var which = nativeEvent.which;\n\n        if (which !== SPACEBAR_CODE) {\n          return null;\n        }\n\n        hasSpaceKeypress = true;\n        return SPACEBAR_CHAR;\n\n      case TOP_TEXT_INPUT:\n        // Record the characters to be added to the DOM.\n        var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled\n        // it at the keypress level and bail immediately. Android Chrome\n        // doesn't give us keycodes, so we need to ignore it.\n\n        if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {\n          return null;\n        }\n\n        return chars;\n\n      default:\n        // For other native event types, do nothing.\n        return null;\n    }\n  }\n  /**\n   * For browsers that do not provide the `textInput` event, extract the\n   * appropriate string to use for SyntheticInputEvent.\n   *\n   * @param {number} topLevelType Number from `TopLevelEventTypes`.\n   * @param {object} nativeEvent Native browser event.\n   * @return {?string} The fallback string for this `beforeInput` event.\n   */\n\n\n  function getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n    // If we are currently composing (IME) and using a fallback to do so,\n    // try to extract the composed characters from the fallback object.\n    // If composition event is available, we extract a string only at\n    // compositionevent, otherwise extract it at fallback events.\n    if (isComposing) {\n      if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n        var chars = getData();\n        reset();\n        isComposing = false;\n        return chars;\n      }\n\n      return null;\n    }\n\n    switch (topLevelType) {\n      case TOP_PASTE:\n        // If a paste event occurs after a keypress, throw out the input\n        // chars. Paste events should not lead to BeforeInput events.\n        return null;\n\n      case TOP_KEY_PRESS:\n        /**\n         * As of v27, Firefox may fire keypress events even when no character\n         * will be inserted. A few possibilities:\n         *\n         * - `which` is `0`. Arrow keys, Esc key, etc.\n         *\n         * - `which` is the pressed key code, but no char is available.\n         *   Ex: 'AltGr + d` in Polish. There is no modified character for\n         *   this key combination and no character is inserted into the\n         *   document, but FF fires the keypress for char code `100` anyway.\n         *   No `input` event will occur.\n         *\n         * - `which` is the pressed key code, but a command combination is\n         *   being used. Ex: `Cmd+C`. No character is inserted, and no\n         *   `input` event will occur.\n         */\n        if (!isKeypressCommand(nativeEvent)) {\n          // IE fires the `keypress` event when a user types an emoji via\n          // Touch keyboard of Windows.  In such a case, the `char` property\n          // holds an emoji character like `\\uD83D\\uDE0A`.  Because its length\n          // is 2, the property `which` does not represent an emoji correctly.\n          // In such a case, we directly return the `char` property instead of\n          // using `which`.\n          if (nativeEvent.char && nativeEvent.char.length > 1) {\n            return nativeEvent.char;\n          } else if (nativeEvent.which) {\n            return String.fromCharCode(nativeEvent.which);\n          }\n        }\n\n        return null;\n\n      case TOP_COMPOSITION_END:\n        return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;\n\n      default:\n        return null;\n    }\n  }\n  /**\n   * Extract a SyntheticInputEvent for `beforeInput`, based on either native\n   * `textInput` or fallback behavior.\n   *\n   * @return {?object} A SyntheticInputEvent.\n   */\n\n\n  function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n    var chars;\n\n    if (canUseTextInputEvent) {\n      chars = getNativeBeforeInputChars(topLevelType, nativeEvent);\n    } else {\n      chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);\n    } // If no characters are being inserted, no BeforeInput event should\n    // be fired.\n\n\n    if (!chars) {\n      return null;\n    }\n\n    var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);\n    event.data = chars;\n    accumulateTwoPhaseDispatches(event);\n    return event;\n  }\n  /**\n   * Create an `onBeforeInput` event to match\n   * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n   *\n   * This event plugin is based on the native `textInput` event\n   * available in Chrome, Safari, Opera, and IE. This event fires after\n   * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n   *\n   * `beforeInput` is spec'd but not implemented in any browsers, and\n   * the `input` event does not provide any useful information about what has\n   * actually been added, contrary to the spec. Thus, `textInput` is the best\n   * available event to identify the characters that have actually been inserted\n   * into the target node.\n   *\n   * This plugin is also responsible for emitting `composition` events, thus\n   * allowing us to share composition fallback code for both `beforeInput` and\n   * `composition` event types.\n   */\n\n\n  var BeforeInputEventPlugin = {\n    eventTypes: eventTypes,\n    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n      var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n      var beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n\n      if (composition === null) {\n        return beforeInput;\n      }\n\n      if (beforeInput === null) {\n        return composition;\n      }\n\n      return [composition, beforeInput];\n    }\n  };\n\n  /**\n   * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n   */\n  var supportedInputTypes = {\n    color: true,\n    date: true,\n    datetime: true,\n    'datetime-local': true,\n    email: true,\n    month: true,\n    number: true,\n    password: true,\n    range: true,\n    search: true,\n    tel: true,\n    text: true,\n    time: true,\n    url: true,\n    week: true\n  };\n\n  function isTextInputElement(elem) {\n    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n\n    if (nodeName === 'input') {\n      return !!supportedInputTypes[elem.type];\n    }\n\n    if (nodeName === 'textarea') {\n      return true;\n    }\n\n    return false;\n  }\n\n  var eventTypes$1 = {\n    change: {\n      phasedRegistrationNames: {\n        bubbled: 'onChange',\n        captured: 'onChangeCapture'\n      },\n      dependencies: [TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE]\n    }\n  };\n\n  function createAndAccumulateChangeEvent(inst, nativeEvent, target) {\n    var event = SyntheticEvent.getPooled(eventTypes$1.change, inst, nativeEvent, target);\n    event.type = 'change'; // Flag this event loop as needing state restore.\n\n    enqueueStateRestore(target);\n    accumulateTwoPhaseDispatches(event);\n    return event;\n  }\n  /**\n   * For IE shims\n   */\n\n\n  var activeElement = null;\n  var activeElementInst = null;\n  /**\n   * SECTION: handle `change` event\n   */\n\n  function shouldUseChangeEvent(elem) {\n    var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n    return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';\n  }\n\n  function manualDispatchChangeEvent(nativeEvent) {\n    var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the\n    // other events and have it go through ReactBrowserEventEmitter. Since it\n    // doesn't, we manually listen for the events and so we have to enqueue and\n    // process the abstract event manually.\n    //\n    // Batching is necessary here in order to ensure that all event handlers run\n    // before the next rerender (including event handlers attached to ancestor\n    // elements instead of directly on the input). Without this, controlled\n    // components don't work properly in conjunction with event bubbling because\n    // the component is rerendered and the value reverted before all the event\n    // handlers can run. See https://github.com/facebook/react/issues/708.\n\n    batchedUpdates(runEventInBatch, event);\n  }\n\n  function runEventInBatch(event) {\n    runEventsInBatch(event);\n  }\n\n  function getInstIfValueChanged(targetInst) {\n    var targetNode = getNodeFromInstance$1(targetInst);\n\n    if (updateValueIfChanged(targetNode)) {\n      return targetInst;\n    }\n  }\n\n  function getTargetInstForChangeEvent(topLevelType, targetInst) {\n    if (topLevelType === TOP_CHANGE) {\n      return targetInst;\n    }\n  }\n  /**\n   * SECTION: handle `input` event\n   */\n\n\n  var isInputEventSupported = false;\n\n  if (canUseDOM) {\n    // IE9 claims to support the input event but fails to trigger it when\n    // deleting text, so we ignore its input events.\n    isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);\n  }\n  /**\n   * (For IE <=9) Starts tracking propertychange events on the passed-in element\n   * and override the value property so that we can distinguish user events from\n   * value changes in JS.\n   */\n\n\n  function startWatchingForValueChange(target, targetInst) {\n    activeElement = target;\n    activeElementInst = targetInst;\n    activeElement.attachEvent('onpropertychange', handlePropertyChange);\n  }\n  /**\n   * (For IE <=9) Removes the event listeners from the currently-tracked element,\n   * if any exists.\n   */\n\n\n  function stopWatchingForValueChange() {\n    if (!activeElement) {\n      return;\n    }\n\n    activeElement.detachEvent('onpropertychange', handlePropertyChange);\n    activeElement = null;\n    activeElementInst = null;\n  }\n  /**\n   * (For IE <=9) Handles a propertychange event, sending a `change` event if\n   * the value of the active element has changed.\n   */\n\n\n  function handlePropertyChange(nativeEvent) {\n    if (nativeEvent.propertyName !== 'value') {\n      return;\n    }\n\n    if (getInstIfValueChanged(activeElementInst)) {\n      manualDispatchChangeEvent(nativeEvent);\n    }\n  }\n\n  function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {\n    if (topLevelType === TOP_FOCUS) {\n      // In IE9, propertychange fires for most input events but is buggy and\n      // doesn't fire when text is deleted, but conveniently, selectionchange\n      // appears to fire in all of the remaining cases so we catch those and\n      // forward the event if the value has changed\n      // In either case, we don't want to call the event handler if the value\n      // is changed from JS so we redefine a setter for `.value` that updates\n      // our activeElementValue variable, allowing us to ignore those changes\n      //\n      // stopWatching() should be a noop here but we call it just in case we\n      // missed a blur event somehow.\n      stopWatchingForValueChange();\n      startWatchingForValueChange(target, targetInst);\n    } else if (topLevelType === TOP_BLUR) {\n      stopWatchingForValueChange();\n    }\n  } // For IE8 and IE9.\n\n\n  function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {\n    if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) {\n      // On the selectionchange event, the target is just document which isn't\n      // helpful for us so just check activeElement instead.\n      //\n      // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n      // propertychange on the first input event after setting `value` from a\n      // script and fires only keydown, keypress, keyup. Catching keyup usually\n      // gets it and catching keydown lets us fire an event for the first\n      // keystroke if user does a key repeat (it'll be a little delayed: right\n      // before the second keystroke). Other input methods (e.g., paste) seem to\n      // fire selectionchange normally.\n      return getInstIfValueChanged(activeElementInst);\n    }\n  }\n  /**\n   * SECTION: handle `click` event\n   */\n\n\n  function shouldUseClickEvent(elem) {\n    // Use the `click` event to detect changes to checkbox and radio inputs.\n    // This approach works across all browsers, whereas `change` does not fire\n    // until `blur` in IE8.\n    var nodeName = elem.nodeName;\n    return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');\n  }\n\n  function getTargetInstForClickEvent(topLevelType, targetInst) {\n    if (topLevelType === TOP_CLICK) {\n      return getInstIfValueChanged(targetInst);\n    }\n  }\n\n  function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {\n    if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) {\n      return getInstIfValueChanged(targetInst);\n    }\n  }\n\n  function handleControlledInputBlur(node) {\n    var state = node._wrapperState;\n\n    if (!state || !state.controlled || node.type !== 'number') {\n      return;\n    }\n\n    {\n      // If controlled, assign the value attribute to the current value on blur\n      setDefaultValue(node, 'number', node.value);\n    }\n  }\n  /**\n   * This plugin creates an `onChange` event that normalizes change events\n   * across form elements. This event fires at a time when it's possible to\n   * change the element's value without seeing a flicker.\n   *\n   * Supported elements are:\n   * - input (see `isTextInputElement`)\n   * - textarea\n   * - select\n   */\n\n\n  var ChangeEventPlugin = {\n    eventTypes: eventTypes$1,\n    _isInputEventSupported: isInputEventSupported,\n    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n      var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n      var getTargetInstFunc, handleEventFunc;\n\n      if (shouldUseChangeEvent(targetNode)) {\n        getTargetInstFunc = getTargetInstForChangeEvent;\n      } else if (isTextInputElement(targetNode)) {\n        if (isInputEventSupported) {\n          getTargetInstFunc = getTargetInstForInputOrChangeEvent;\n        } else {\n          getTargetInstFunc = getTargetInstForInputEventPolyfill;\n          handleEventFunc = handleEventsForInputEventPolyfill;\n        }\n      } else if (shouldUseClickEvent(targetNode)) {\n        getTargetInstFunc = getTargetInstForClickEvent;\n      }\n\n      if (getTargetInstFunc) {\n        var inst = getTargetInstFunc(topLevelType, targetInst);\n\n        if (inst) {\n          var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);\n          return event;\n        }\n      }\n\n      if (handleEventFunc) {\n        handleEventFunc(topLevelType, targetNode, targetInst);\n      } // When blurring, set the value attribute for number inputs\n\n\n      if (topLevelType === TOP_BLUR) {\n        handleControlledInputBlur(targetNode);\n      }\n    }\n  };\n\n  var SyntheticUIEvent = SyntheticEvent.extend({\n    view: null,\n    detail: null\n  });\n\n  /**\n   * Translation from modifier key to the associated property in the event.\n   * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n   */\n  var modifierKeyToProp = {\n    Alt: 'altKey',\n    Control: 'ctrlKey',\n    Meta: 'metaKey',\n    Shift: 'shiftKey'\n  }; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support\n  // getModifierState. If getModifierState is not supported, we map it to a set of\n  // modifier keys exposed by the event. In this case, Lock-keys are not supported.\n\n  function modifierStateGetter(keyArg) {\n    var syntheticEvent = this;\n    var nativeEvent = syntheticEvent.nativeEvent;\n\n    if (nativeEvent.getModifierState) {\n      return nativeEvent.getModifierState(keyArg);\n    }\n\n    var keyProp = modifierKeyToProp[keyArg];\n    return keyProp ? !!nativeEvent[keyProp] : false;\n  }\n\n  function getEventModifierState(nativeEvent) {\n    return modifierStateGetter;\n  }\n\n  var previousScreenX = 0;\n  var previousScreenY = 0; // Use flags to signal movementX/Y has already been set\n\n  var isMovementXSet = false;\n  var isMovementYSet = false;\n  /**\n   * @interface MouseEvent\n   * @see http://www.w3.org/TR/DOM-Level-3-Events/\n   */\n\n  var SyntheticMouseEvent = SyntheticUIEvent.extend({\n    screenX: null,\n    screenY: null,\n    clientX: null,\n    clientY: null,\n    pageX: null,\n    pageY: null,\n    ctrlKey: null,\n    shiftKey: null,\n    altKey: null,\n    metaKey: null,\n    getModifierState: getEventModifierState,\n    button: null,\n    buttons: null,\n    relatedTarget: function (event) {\n      return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n    },\n    movementX: function (event) {\n      if ('movementX' in event) {\n        return event.movementX;\n      }\n\n      var screenX = previousScreenX;\n      previousScreenX = event.screenX;\n\n      if (!isMovementXSet) {\n        isMovementXSet = true;\n        return 0;\n      }\n\n      return event.type === 'mousemove' ? event.screenX - screenX : 0;\n    },\n    movementY: function (event) {\n      if ('movementY' in event) {\n        return event.movementY;\n      }\n\n      var screenY = previousScreenY;\n      previousScreenY = event.screenY;\n\n      if (!isMovementYSet) {\n        isMovementYSet = true;\n        return 0;\n      }\n\n      return event.type === 'mousemove' ? event.screenY - screenY : 0;\n    }\n  });\n\n  /**\n   * @interface PointerEvent\n   * @see http://www.w3.org/TR/pointerevents/\n   */\n\n  var SyntheticPointerEvent = SyntheticMouseEvent.extend({\n    pointerId: null,\n    width: null,\n    height: null,\n    pressure: null,\n    tangentialPressure: null,\n    tiltX: null,\n    tiltY: null,\n    twist: null,\n    pointerType: null,\n    isPrimary: null\n  });\n\n  var eventTypes$2 = {\n    mouseEnter: {\n      registrationName: 'onMouseEnter',\n      dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]\n    },\n    mouseLeave: {\n      registrationName: 'onMouseLeave',\n      dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER]\n    },\n    pointerEnter: {\n      registrationName: 'onPointerEnter',\n      dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]\n    },\n    pointerLeave: {\n      registrationName: 'onPointerLeave',\n      dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER]\n    }\n  };\n  var EnterLeaveEventPlugin = {\n    eventTypes: eventTypes$2,\n\n    /**\n     * For almost every interaction we care about, there will be both a top-level\n     * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n     * we do not extract duplicate events. However, moving the mouse into the\n     * browser from outside will not fire a `mouseout` event. In this case, we use\n     * the `mouseover` top-level event.\n     */\n    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n      var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER;\n      var isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;\n\n      if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0 && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n        // If this is an over event with a target, then we've already dispatched\n        // the event in the out event of the other target. If this is replayed,\n        // then it's because we couldn't dispatch against this target previously\n        // so we have to do it now instead.\n        return null;\n      }\n\n      if (!isOutEvent && !isOverEvent) {\n        // Must not be a mouse or pointer in or out - ignoring.\n        return null;\n      }\n\n      var win;\n\n      if (nativeEventTarget.window === nativeEventTarget) {\n        // `nativeEventTarget` is probably a window object.\n        win = nativeEventTarget;\n      } else {\n        // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n        var doc = nativeEventTarget.ownerDocument;\n\n        if (doc) {\n          win = doc.defaultView || doc.parentWindow;\n        } else {\n          win = window;\n        }\n      }\n\n      var from;\n      var to;\n\n      if (isOutEvent) {\n        from = targetInst;\n        var related = nativeEvent.relatedTarget || nativeEvent.toElement;\n        to = related ? getClosestInstanceFromNode(related) : null;\n\n        if (to !== null) {\n          var nearestMounted = getNearestMountedFiber(to);\n\n          if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {\n            to = null;\n          }\n        }\n      } else {\n        // Moving to a node from outside the window.\n        from = null;\n        to = targetInst;\n      }\n\n      if (from === to) {\n        // Nothing pertains to our managed components.\n        return null;\n      }\n\n      var eventInterface, leaveEventType, enterEventType, eventTypePrefix;\n\n      if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) {\n        eventInterface = SyntheticMouseEvent;\n        leaveEventType = eventTypes$2.mouseLeave;\n        enterEventType = eventTypes$2.mouseEnter;\n        eventTypePrefix = 'mouse';\n      } else if (topLevelType === TOP_POINTER_OUT || topLevelType === TOP_POINTER_OVER) {\n        eventInterface = SyntheticPointerEvent;\n        leaveEventType = eventTypes$2.pointerLeave;\n        enterEventType = eventTypes$2.pointerEnter;\n        eventTypePrefix = 'pointer';\n      }\n\n      var fromNode = from == null ? win : getNodeFromInstance$1(from);\n      var toNode = to == null ? win : getNodeFromInstance$1(to);\n      var leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget);\n      leave.type = eventTypePrefix + 'leave';\n      leave.target = fromNode;\n      leave.relatedTarget = toNode;\n      var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget);\n      enter.type = eventTypePrefix + 'enter';\n      enter.target = toNode;\n      enter.relatedTarget = fromNode;\n      accumulateEnterLeaveDispatches(leave, enter, from, to); // If we are not processing the first ancestor, then we\n      // should not process the same nativeEvent again, as we\n      // will have already processed it in the first ancestor.\n\n      if ((eventSystemFlags & IS_FIRST_ANCESTOR) === 0) {\n        return [leave];\n      }\n\n      return [leave, enter];\n    }\n  };\n\n  /**\n   * inlined Object.is polyfill to avoid requiring consumers ship their own\n   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n   */\n  function is(x, y) {\n    return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare\n    ;\n  }\n\n  var objectIs = typeof Object.is === 'function' ? Object.is : is;\n\n  var hasOwnProperty$2 = Object.prototype.hasOwnProperty;\n  /**\n   * Performs equality by iterating through keys on an object and returning false\n   * when any key has values which are not strictly equal between the arguments.\n   * Returns true when the values of all keys are strictly equal.\n   */\n\n  function shallowEqual(objA, objB) {\n    if (objectIs(objA, objB)) {\n      return true;\n    }\n\n    if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n      return false;\n    }\n\n    var keysA = Object.keys(objA);\n    var keysB = Object.keys(objB);\n\n    if (keysA.length !== keysB.length) {\n      return false;\n    } // Test for A's keys different from B.\n\n\n    for (var i = 0; i < keysA.length; i++) {\n      if (!hasOwnProperty$2.call(objB, keysA[i]) || !objectIs(objA[keysA[i]], objB[keysA[i]])) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;\n  var eventTypes$3 = {\n    select: {\n      phasedRegistrationNames: {\n        bubbled: 'onSelect',\n        captured: 'onSelectCapture'\n      },\n      dependencies: [TOP_BLUR, TOP_CONTEXT_MENU, TOP_DRAG_END, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE]\n    }\n  };\n  var activeElement$1 = null;\n  var activeElementInst$1 = null;\n  var lastSelection = null;\n  var mouseDown = false;\n  /**\n   * Get an object which is a unique representation of the current selection.\n   *\n   * The return value will not be consistent across nodes or browsers, but\n   * two identical selections on the same node will return identical objects.\n   *\n   * @param {DOMElement} node\n   * @return {object}\n   */\n\n  function getSelection$1(node) {\n    if ('selectionStart' in node && hasSelectionCapabilities(node)) {\n      return {\n        start: node.selectionStart,\n        end: node.selectionEnd\n      };\n    } else {\n      var win = node.ownerDocument && node.ownerDocument.defaultView || window;\n      var selection = win.getSelection();\n      return {\n        anchorNode: selection.anchorNode,\n        anchorOffset: selection.anchorOffset,\n        focusNode: selection.focusNode,\n        focusOffset: selection.focusOffset\n      };\n    }\n  }\n  /**\n   * Get document associated with the event target.\n   *\n   * @param {object} nativeEventTarget\n   * @return {Document}\n   */\n\n\n  function getEventTargetDocument(eventTarget) {\n    return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;\n  }\n  /**\n   * Poll selection to see whether it's changed.\n   *\n   * @param {object} nativeEvent\n   * @param {object} nativeEventTarget\n   * @return {?SyntheticEvent}\n   */\n\n\n  function constructSelectEvent(nativeEvent, nativeEventTarget) {\n    // Ensure we have the right element, and that the user is not dragging a\n    // selection (this matches native `select` event behavior). In HTML5, select\n    // fires only on input and textarea thus if there's no focused element we\n    // won't dispatch.\n    var doc = getEventTargetDocument(nativeEventTarget);\n\n    if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {\n      return null;\n    } // Only fire when selection has actually changed.\n\n\n    var currentSelection = getSelection$1(activeElement$1);\n\n    if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n      lastSelection = currentSelection;\n      var syntheticEvent = SyntheticEvent.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);\n      syntheticEvent.type = 'select';\n      syntheticEvent.target = activeElement$1;\n      accumulateTwoPhaseDispatches(syntheticEvent);\n      return syntheticEvent;\n    }\n\n    return null;\n  }\n  /**\n   * This plugin creates an `onSelect` event that normalizes select events\n   * across form elements.\n   *\n   * Supported elements are:\n   * - input (see `isTextInputElement`)\n   * - textarea\n   * - contentEditable\n   *\n   * This differs from native browser implementations in the following ways:\n   * - Fires on contentEditable fields as well as inputs.\n   * - Fires for collapsed selection.\n   * - Fires after user input.\n   */\n\n\n  var SelectEventPlugin = {\n    eventTypes: eventTypes$3,\n    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, container) {\n      var containerOrDoc = container || getEventTargetDocument(nativeEventTarget); // Track whether all listeners exists for this plugin. If none exist, we do\n      // not extract events. See #3639.\n\n      if (!containerOrDoc || !isListeningToAllDependencies('onSelect', containerOrDoc)) {\n        return null;\n      }\n\n      var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n\n      switch (topLevelType) {\n        // Track the input node that has focus.\n        case TOP_FOCUS:\n          if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {\n            activeElement$1 = targetNode;\n            activeElementInst$1 = targetInst;\n            lastSelection = null;\n          }\n\n          break;\n\n        case TOP_BLUR:\n          activeElement$1 = null;\n          activeElementInst$1 = null;\n          lastSelection = null;\n          break;\n        // Don't fire the event while the user is dragging. This matches the\n        // semantics of the native select event.\n\n        case TOP_MOUSE_DOWN:\n          mouseDown = true;\n          break;\n\n        case TOP_CONTEXT_MENU:\n        case TOP_MOUSE_UP:\n        case TOP_DRAG_END:\n          mouseDown = false;\n          return constructSelectEvent(nativeEvent, nativeEventTarget);\n        // Chrome and IE fire non-standard event when selection is changed (and\n        // sometimes when it hasn't). IE's event fires out of order with respect\n        // to key and input events on deletion, so we discard it.\n        //\n        // Firefox doesn't support selectionchange, so check selection status\n        // after each key entry. The selection changes after keydown and before\n        // keyup, but we check on keydown as well in the case of holding down a\n        // key, when multiple keydown events are fired but only one keyup is.\n        // This is also our approach for IE handling, for the reason above.\n\n        case TOP_SELECTION_CHANGE:\n          if (skipSelectionChangeEvent) {\n            break;\n          }\n\n        // falls through\n\n        case TOP_KEY_DOWN:\n        case TOP_KEY_UP:\n          return constructSelectEvent(nativeEvent, nativeEventTarget);\n      }\n\n      return null;\n    }\n  };\n\n  /**\n   * @interface Event\n   * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent\n   */\n\n  var SyntheticAnimationEvent = SyntheticEvent.extend({\n    animationName: null,\n    elapsedTime: null,\n    pseudoElement: null\n  });\n\n  /**\n   * @interface Event\n   * @see http://www.w3.org/TR/clipboard-apis/\n   */\n\n  var SyntheticClipboardEvent = SyntheticEvent.extend({\n    clipboardData: function (event) {\n      return 'clipboardData' in event ? event.clipboardData : window.clipboardData;\n    }\n  });\n\n  /**\n   * @interface FocusEvent\n   * @see http://www.w3.org/TR/DOM-Level-3-Events/\n   */\n\n  var SyntheticFocusEvent = SyntheticUIEvent.extend({\n    relatedTarget: null\n  });\n\n  /**\n   * `charCode` represents the actual \"character code\" and is safe to use with\n   * `String.fromCharCode`. As such, only keys that correspond to printable\n   * characters produce a valid `charCode`, the only exception to this is Enter.\n   * The Tab-key is considered non-printable and does not have a `charCode`,\n   * presumably because it does not produce a tab-character in browsers.\n   *\n   * @param {object} nativeEvent Native browser event.\n   * @return {number} Normalized `charCode` property.\n   */\n  function getEventCharCode(nativeEvent) {\n    var charCode;\n    var keyCode = nativeEvent.keyCode;\n\n    if ('charCode' in nativeEvent) {\n      charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.\n\n      if (charCode === 0 && keyCode === 13) {\n        charCode = 13;\n      }\n    } else {\n      // IE8 does not implement `charCode`, but `keyCode` has the correct value.\n      charCode = keyCode;\n    } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)\n    // report Enter as charCode 10 when ctrl is pressed.\n\n\n    if (charCode === 10) {\n      charCode = 13;\n    } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.\n    // Must not discard the (non-)printable Enter-key.\n\n\n    if (charCode >= 32 || charCode === 13) {\n      return charCode;\n    }\n\n    return 0;\n  }\n\n  /**\n   * Normalization of deprecated HTML5 `key` values\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n   */\n\n  var normalizeKey = {\n    Esc: 'Escape',\n    Spacebar: ' ',\n    Left: 'ArrowLeft',\n    Up: 'ArrowUp',\n    Right: 'ArrowRight',\n    Down: 'ArrowDown',\n    Del: 'Delete',\n    Win: 'OS',\n    Menu: 'ContextMenu',\n    Apps: 'ContextMenu',\n    Scroll: 'ScrollLock',\n    MozPrintableKey: 'Unidentified'\n  };\n  /**\n   * Translation from legacy `keyCode` to HTML5 `key`\n   * Only special keys supported, all others depend on keyboard layout or browser\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n   */\n\n  var translateToKey = {\n    '8': 'Backspace',\n    '9': 'Tab',\n    '12': 'Clear',\n    '13': 'Enter',\n    '16': 'Shift',\n    '17': 'Control',\n    '18': 'Alt',\n    '19': 'Pause',\n    '20': 'CapsLock',\n    '27': 'Escape',\n    '32': ' ',\n    '33': 'PageUp',\n    '34': 'PageDown',\n    '35': 'End',\n    '36': 'Home',\n    '37': 'ArrowLeft',\n    '38': 'ArrowUp',\n    '39': 'ArrowRight',\n    '40': 'ArrowDown',\n    '45': 'Insert',\n    '46': 'Delete',\n    '112': 'F1',\n    '113': 'F2',\n    '114': 'F3',\n    '115': 'F4',\n    '116': 'F5',\n    '117': 'F6',\n    '118': 'F7',\n    '119': 'F8',\n    '120': 'F9',\n    '121': 'F10',\n    '122': 'F11',\n    '123': 'F12',\n    '144': 'NumLock',\n    '145': 'ScrollLock',\n    '224': 'Meta'\n  };\n  /**\n   * @param {object} nativeEvent Native browser event.\n   * @return {string} Normalized `key` property.\n   */\n\n  function getEventKey(nativeEvent) {\n    if (nativeEvent.key) {\n      // Normalize inconsistent values reported by browsers due to\n      // implementations of a working draft specification.\n      // FireFox implements `key` but returns `MozPrintableKey` for all\n      // printable characters (normalized to `Unidentified`), ignore it.\n      var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n\n      if (key !== 'Unidentified') {\n        return key;\n      }\n    } // Browser does not implement `key`, polyfill as much of it as we can.\n\n\n    if (nativeEvent.type === 'keypress') {\n      var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can\n      // thus be captured by `keypress`, no other non-printable key should.\n\n      return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n    }\n\n    if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n      // While user keyboard layout determines the actual meaning of each\n      // `keyCode` value, almost all function keys have a universal value.\n      return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n    }\n\n    return '';\n  }\n\n  /**\n   * @interface KeyboardEvent\n   * @see http://www.w3.org/TR/DOM-Level-3-Events/\n   */\n\n  var SyntheticKeyboardEvent = SyntheticUIEvent.extend({\n    key: getEventKey,\n    location: null,\n    ctrlKey: null,\n    shiftKey: null,\n    altKey: null,\n    metaKey: null,\n    repeat: null,\n    locale: null,\n    getModifierState: getEventModifierState,\n    // Legacy Interface\n    charCode: function (event) {\n      // `charCode` is the result of a KeyPress event and represents the value of\n      // the actual printable character.\n      // KeyPress is deprecated, but its replacement is not yet final and not\n      // implemented in any major browser. Only KeyPress has charCode.\n      if (event.type === 'keypress') {\n        return getEventCharCode(event);\n      }\n\n      return 0;\n    },\n    keyCode: function (event) {\n      // `keyCode` is the result of a KeyDown/Up event and represents the value of\n      // physical keyboard key.\n      // The actual meaning of the value depends on the users' keyboard layout\n      // which cannot be detected. Assuming that it is a US keyboard layout\n      // provides a surprisingly accurate mapping for US and European users.\n      // Due to this, it is left to the user to implement at this time.\n      if (event.type === 'keydown' || event.type === 'keyup') {\n        return event.keyCode;\n      }\n\n      return 0;\n    },\n    which: function (event) {\n      // `which` is an alias for either `keyCode` or `charCode` depending on the\n      // type of the event.\n      if (event.type === 'keypress') {\n        return getEventCharCode(event);\n      }\n\n      if (event.type === 'keydown' || event.type === 'keyup') {\n        return event.keyCode;\n      }\n\n      return 0;\n    }\n  });\n\n  /**\n   * @interface DragEvent\n   * @see http://www.w3.org/TR/DOM-Level-3-Events/\n   */\n\n  var SyntheticDragEvent = SyntheticMouseEvent.extend({\n    dataTransfer: null\n  });\n\n  /**\n   * @interface TouchEvent\n   * @see http://www.w3.org/TR/touch-events/\n   */\n\n  var SyntheticTouchEvent = SyntheticUIEvent.extend({\n    touches: null,\n    targetTouches: null,\n    changedTouches: null,\n    altKey: null,\n    metaKey: null,\n    ctrlKey: null,\n    shiftKey: null,\n    getModifierState: getEventModifierState\n  });\n\n  /**\n   * @interface Event\n   * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent\n   */\n\n  var SyntheticTransitionEvent = SyntheticEvent.extend({\n    propertyName: null,\n    elapsedTime: null,\n    pseudoElement: null\n  });\n\n  /**\n   * @interface WheelEvent\n   * @see http://www.w3.org/TR/DOM-Level-3-Events/\n   */\n\n  var SyntheticWheelEvent = SyntheticMouseEvent.extend({\n    deltaX: function (event) {\n      return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n      'wheelDeltaX' in event ? -event.wheelDeltaX : 0;\n    },\n    deltaY: function (event) {\n      return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n      'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n      'wheelDelta' in event ? -event.wheelDelta : 0;\n    },\n    deltaZ: null,\n    // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n    // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n    // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n    // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n    deltaMode: null\n  });\n\n  var knownHTMLTopLevelTypes = [TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING];\n  var SimpleEventPlugin = {\n    // simpleEventPluginEventTypes gets populated from\n    // the DOMEventProperties module.\n    eventTypes: simpleEventPluginEventTypes,\n    extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags) {\n      var dispatchConfig = topLevelEventsToDispatchConfig.get(topLevelType);\n\n      if (!dispatchConfig) {\n        return null;\n      }\n\n      var EventConstructor;\n\n      switch (topLevelType) {\n        case TOP_KEY_PRESS:\n          // Firefox creates a keypress event for function keys too. This removes\n          // the unwanted keypress events. Enter is however both printable and\n          // non-printable. One would expect Tab to be as well (but it isn't).\n          if (getEventCharCode(nativeEvent) === 0) {\n            return null;\n          }\n\n        /* falls through */\n\n        case TOP_KEY_DOWN:\n        case TOP_KEY_UP:\n          EventConstructor = SyntheticKeyboardEvent;\n          break;\n\n        case TOP_BLUR:\n        case TOP_FOCUS:\n          EventConstructor = SyntheticFocusEvent;\n          break;\n\n        case TOP_CLICK:\n          // Firefox creates a click event on right mouse clicks. This removes the\n          // unwanted click events.\n          if (nativeEvent.button === 2) {\n            return null;\n          }\n\n        /* falls through */\n\n        case TOP_AUX_CLICK:\n        case TOP_DOUBLE_CLICK:\n        case TOP_MOUSE_DOWN:\n        case TOP_MOUSE_MOVE:\n        case TOP_MOUSE_UP: // TODO: Disabled elements should not respond to mouse events\n\n        /* falls through */\n\n        case TOP_MOUSE_OUT:\n        case TOP_MOUSE_OVER:\n        case TOP_CONTEXT_MENU:\n          EventConstructor = SyntheticMouseEvent;\n          break;\n\n        case TOP_DRAG:\n        case TOP_DRAG_END:\n        case TOP_DRAG_ENTER:\n        case TOP_DRAG_EXIT:\n        case TOP_DRAG_LEAVE:\n        case TOP_DRAG_OVER:\n        case TOP_DRAG_START:\n        case TOP_DROP:\n          EventConstructor = SyntheticDragEvent;\n          break;\n\n        case TOP_TOUCH_CANCEL:\n        case TOP_TOUCH_END:\n        case TOP_TOUCH_MOVE:\n        case TOP_TOUCH_START:\n          EventConstructor = SyntheticTouchEvent;\n          break;\n\n        case TOP_ANIMATION_END:\n        case TOP_ANIMATION_ITERATION:\n        case TOP_ANIMATION_START:\n          EventConstructor = SyntheticAnimationEvent;\n          break;\n\n        case TOP_TRANSITION_END:\n          EventConstructor = SyntheticTransitionEvent;\n          break;\n\n        case TOP_SCROLL:\n          EventConstructor = SyntheticUIEvent;\n          break;\n\n        case TOP_WHEEL:\n          EventConstructor = SyntheticWheelEvent;\n          break;\n\n        case TOP_COPY:\n        case TOP_CUT:\n        case TOP_PASTE:\n          EventConstructor = SyntheticClipboardEvent;\n          break;\n\n        case TOP_GOT_POINTER_CAPTURE:\n        case TOP_LOST_POINTER_CAPTURE:\n        case TOP_POINTER_CANCEL:\n        case TOP_POINTER_DOWN:\n        case TOP_POINTER_MOVE:\n        case TOP_POINTER_OUT:\n        case TOP_POINTER_OVER:\n        case TOP_POINTER_UP:\n          EventConstructor = SyntheticPointerEvent;\n          break;\n\n        default:\n          {\n            if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {\n              error('SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType);\n            }\n          } // HTML Events\n          // @see http://www.w3.org/TR/html5/index.html#events-0\n\n\n          EventConstructor = SyntheticEvent;\n          break;\n      }\n\n      var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);\n      accumulateTwoPhaseDispatches(event);\n      return event;\n    }\n  };\n\n  /**\n   * Specifies a deterministic ordering of `EventPlugin`s. A convenient way to\n   * reason about plugins, without having to package every one of them. This\n   * is better than having plugins be ordered in the same order that they\n   * are injected because that ordering would be influenced by the packaging order.\n   * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n   * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n   */\n\n  var DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];\n  /**\n   * Inject modules for resolving DOM hierarchy and plugin ordering.\n   */\n\n  injectEventPluginOrder(DOMEventPluginOrder);\n  setComponentTree(getFiberCurrentPropsFromNode$1, getInstanceFromNode$1, getNodeFromInstance$1);\n  /**\n   * Some important event plugins included by default (without having to require\n   * them).\n   */\n\n  injectEventPluginsByName({\n    SimpleEventPlugin: SimpleEventPlugin,\n    EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n    ChangeEventPlugin: ChangeEventPlugin,\n    SelectEventPlugin: SelectEventPlugin,\n    BeforeInputEventPlugin: BeforeInputEventPlugin\n  });\n\n  // Prefix measurements so that it's possible to filter them.\n  // Longer prefixes are hard to read in DevTools.\n  var reactEmoji = \"\\u269B\";\n  var warningEmoji = \"\\u26D4\";\n  var supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; // Keep track of current fiber so that we know the path to unwind on pause.\n  // TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?\n\n  var currentFiber = null; // If we're in the middle of user code, which fiber and method is it?\n  // Reusing `currentFiber` would be confusing for this because user code fiber\n  // can change during commit phase too, but we don't need to unwind it (since\n  // lifecycles in the commit phase don't resemble a tree).\n\n  var currentPhase = null;\n  var currentPhaseFiber = null; // Did lifecycle hook schedule an update? This is often a performance problem,\n  // so we will keep track of it, and include it in the report.\n  // Track commits caused by cascading updates.\n\n  var isCommitting = false;\n  var hasScheduledUpdateInCurrentCommit = false;\n  var hasScheduledUpdateInCurrentPhase = false;\n  var commitCountInCurrentWorkLoop = 0;\n  var effectCountInCurrentCommit = 0;\n  // to avoid stretch the commit phase with measurement overhead.\n\n  var labelsInCurrentCommit = new Set();\n\n  var formatMarkName = function (markName) {\n    return reactEmoji + \" \" + markName;\n  };\n\n  var formatLabel = function (label, warning) {\n    var prefix = warning ? warningEmoji + \" \" : reactEmoji + \" \";\n    var suffix = warning ? \" Warning: \" + warning : '';\n    return \"\" + prefix + label + suffix;\n  };\n\n  var beginMark = function (markName) {\n    performance.mark(formatMarkName(markName));\n  };\n\n  var clearMark = function (markName) {\n    performance.clearMarks(formatMarkName(markName));\n  };\n\n  var endMark = function (label, markName, warning) {\n    var formattedMarkName = formatMarkName(markName);\n    var formattedLabel = formatLabel(label, warning);\n\n    try {\n      performance.measure(formattedLabel, formattedMarkName);\n    } catch (err) {} // If previous mark was missing for some reason, this will throw.\n    // This could only happen if React crashed in an unexpected place earlier.\n    // Don't pile on with more errors.\n    // Clear marks immediately to avoid growing buffer.\n\n\n    performance.clearMarks(formattedMarkName);\n    performance.clearMeasures(formattedLabel);\n  };\n\n  var getFiberMarkName = function (label, debugID) {\n    return label + \" (#\" + debugID + \")\";\n  };\n\n  var getFiberLabel = function (componentName, isMounted, phase) {\n    if (phase === null) {\n      // These are composite component total time measurements.\n      return componentName + \" [\" + (isMounted ? 'update' : 'mount') + \"]\";\n    } else {\n      // Composite component methods.\n      return componentName + \".\" + phase;\n    }\n  };\n\n  var beginFiberMark = function (fiber, phase) {\n    var componentName = getComponentName(fiber.type) || 'Unknown';\n    var debugID = fiber._debugID;\n    var isMounted = fiber.alternate !== null;\n    var label = getFiberLabel(componentName, isMounted, phase);\n\n    if (isCommitting && labelsInCurrentCommit.has(label)) {\n      // During the commit phase, we don't show duplicate labels because\n      // there is a fixed overhead for every measurement, and we don't\n      // want to stretch the commit phase beyond necessary.\n      return false;\n    }\n\n    labelsInCurrentCommit.add(label);\n    var markName = getFiberMarkName(label, debugID);\n    beginMark(markName);\n    return true;\n  };\n\n  var clearFiberMark = function (fiber, phase) {\n    var componentName = getComponentName(fiber.type) || 'Unknown';\n    var debugID = fiber._debugID;\n    var isMounted = fiber.alternate !== null;\n    var label = getFiberLabel(componentName, isMounted, phase);\n    var markName = getFiberMarkName(label, debugID);\n    clearMark(markName);\n  };\n\n  var endFiberMark = function (fiber, phase, warning) {\n    var componentName = getComponentName(fiber.type) || 'Unknown';\n    var debugID = fiber._debugID;\n    var isMounted = fiber.alternate !== null;\n    var label = getFiberLabel(componentName, isMounted, phase);\n    var markName = getFiberMarkName(label, debugID);\n    endMark(label, markName, warning);\n  };\n\n  var shouldIgnoreFiber = function (fiber) {\n    // Host components should be skipped in the timeline.\n    // We could check typeof fiber.type, but does this work with RN?\n    switch (fiber.tag) {\n      case HostRoot:\n      case HostComponent:\n      case HostText:\n      case HostPortal:\n      case Fragment:\n      case ContextProvider:\n      case ContextConsumer:\n      case Mode:\n        return true;\n\n      default:\n        return false;\n    }\n  };\n\n  var clearPendingPhaseMeasurement = function () {\n    if (currentPhase !== null && currentPhaseFiber !== null) {\n      clearFiberMark(currentPhaseFiber, currentPhase);\n    }\n\n    currentPhaseFiber = null;\n    currentPhase = null;\n    hasScheduledUpdateInCurrentPhase = false;\n  };\n\n  var pauseTimers = function () {\n    // Stops all currently active measurements so that they can be resumed\n    // if we continue in a later deferred loop from the same unit of work.\n    var fiber = currentFiber;\n\n    while (fiber) {\n      if (fiber._debugIsCurrentlyTiming) {\n        endFiberMark(fiber, null, null);\n      }\n\n      fiber = fiber.return;\n    }\n  };\n\n  var resumeTimersRecursively = function (fiber) {\n    if (fiber.return !== null) {\n      resumeTimersRecursively(fiber.return);\n    }\n\n    if (fiber._debugIsCurrentlyTiming) {\n      beginFiberMark(fiber, null);\n    }\n  };\n\n  var resumeTimers = function () {\n    // Resumes all measurements that were active during the last deferred loop.\n    if (currentFiber !== null) {\n      resumeTimersRecursively(currentFiber);\n    }\n  };\n\n  function recordEffect() {\n    {\n      effectCountInCurrentCommit++;\n    }\n  }\n  function recordScheduleUpdate() {\n    {\n      if (isCommitting) {\n        hasScheduledUpdateInCurrentCommit = true;\n      }\n\n      if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {\n        hasScheduledUpdateInCurrentPhase = true;\n      }\n    }\n  }\n  function startWorkTimer(fiber) {\n    {\n      if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n        return;\n      } // If we pause, this is the fiber to unwind from.\n\n\n      currentFiber = fiber;\n\n      if (!beginFiberMark(fiber, null)) {\n        return;\n      }\n\n      fiber._debugIsCurrentlyTiming = true;\n    }\n  }\n  function cancelWorkTimer(fiber) {\n    {\n      if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n        return;\n      } // Remember we shouldn't complete measurement for this fiber.\n      // Otherwise flamechart will be deep even for small updates.\n\n\n      fiber._debugIsCurrentlyTiming = false;\n      clearFiberMark(fiber, null);\n    }\n  }\n  function stopWorkTimer(fiber) {\n    {\n      if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n        return;\n      } // If we pause, its parent is the fiber to unwind from.\n\n\n      currentFiber = fiber.return;\n\n      if (!fiber._debugIsCurrentlyTiming) {\n        return;\n      }\n\n      fiber._debugIsCurrentlyTiming = false;\n      endFiberMark(fiber, null, null);\n    }\n  }\n  function stopFailedWorkTimer(fiber) {\n    {\n      if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n        return;\n      } // If we pause, its parent is the fiber to unwind from.\n\n\n      currentFiber = fiber.return;\n\n      if (!fiber._debugIsCurrentlyTiming) {\n        return;\n      }\n\n      fiber._debugIsCurrentlyTiming = false;\n      var warning = fiber.tag === SuspenseComponent ? 'Rendering was suspended' : 'An error was thrown inside this error boundary';\n      endFiberMark(fiber, null, warning);\n    }\n  }\n  function startPhaseTimer(fiber, phase) {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      clearPendingPhaseMeasurement();\n\n      if (!beginFiberMark(fiber, phase)) {\n        return;\n      }\n\n      currentPhaseFiber = fiber;\n      currentPhase = phase;\n    }\n  }\n  function stopPhaseTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      if (currentPhase !== null && currentPhaseFiber !== null) {\n        var warning = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;\n        endFiberMark(currentPhaseFiber, currentPhase, warning);\n      }\n\n      currentPhase = null;\n      currentPhaseFiber = null;\n    }\n  }\n  function startWorkLoopTimer(nextUnitOfWork) {\n    {\n      currentFiber = nextUnitOfWork;\n\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      commitCountInCurrentWorkLoop = 0; // This is top level call.\n      // Any other measurements are performed within.\n\n      beginMark('(React Tree Reconciliation)'); // Resume any measurements that were in progress during the last loop.\n\n      resumeTimers();\n    }\n  }\n  function stopWorkLoopTimer(interruptedBy, didCompleteRoot) {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      var warning = null;\n\n      if (interruptedBy !== null) {\n        if (interruptedBy.tag === HostRoot) {\n          warning = 'A top-level update interrupted the previous render';\n        } else {\n          var componentName = getComponentName(interruptedBy.type) || 'Unknown';\n          warning = \"An update to \" + componentName + \" interrupted the previous render\";\n        }\n      } else if (commitCountInCurrentWorkLoop > 1) {\n        warning = 'There were cascading updates';\n      }\n\n      commitCountInCurrentWorkLoop = 0;\n      var label = didCompleteRoot ? '(React Tree Reconciliation: Completed Root)' : '(React Tree Reconciliation: Yielded)'; // Pause any measurements until the next loop.\n\n      pauseTimers();\n      endMark(label, '(React Tree Reconciliation)', warning);\n    }\n  }\n  function startCommitTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      isCommitting = true;\n      hasScheduledUpdateInCurrentCommit = false;\n      labelsInCurrentCommit.clear();\n      beginMark('(Committing Changes)');\n    }\n  }\n  function stopCommitTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      var warning = null;\n\n      if (hasScheduledUpdateInCurrentCommit) {\n        warning = 'Lifecycle hook scheduled a cascading update';\n      } else if (commitCountInCurrentWorkLoop > 0) {\n        warning = 'Caused by a cascading update in earlier commit';\n      }\n\n      hasScheduledUpdateInCurrentCommit = false;\n      commitCountInCurrentWorkLoop++;\n      isCommitting = false;\n      labelsInCurrentCommit.clear();\n      endMark('(Committing Changes)', '(Committing Changes)', warning);\n    }\n  }\n  function startCommitSnapshotEffectsTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      effectCountInCurrentCommit = 0;\n      beginMark('(Committing Snapshot Effects)');\n    }\n  }\n  function stopCommitSnapshotEffectsTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      var count = effectCountInCurrentCommit;\n      effectCountInCurrentCommit = 0;\n      endMark(\"(Committing Snapshot Effects: \" + count + \" Total)\", '(Committing Snapshot Effects)', null);\n    }\n  }\n  function startCommitHostEffectsTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      effectCountInCurrentCommit = 0;\n      beginMark('(Committing Host Effects)');\n    }\n  }\n  function stopCommitHostEffectsTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      var count = effectCountInCurrentCommit;\n      effectCountInCurrentCommit = 0;\n      endMark(\"(Committing Host Effects: \" + count + \" Total)\", '(Committing Host Effects)', null);\n    }\n  }\n  function startCommitLifeCyclesTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      effectCountInCurrentCommit = 0;\n      beginMark('(Calling Lifecycle Methods)');\n    }\n  }\n  function stopCommitLifeCyclesTimer() {\n    {\n      if (!supportsUserTiming) {\n        return;\n      }\n\n      var count = effectCountInCurrentCommit;\n      effectCountInCurrentCommit = 0;\n      endMark(\"(Calling Lifecycle Methods: \" + count + \" Total)\", '(Calling Lifecycle Methods)', null);\n    }\n  }\n\n  var valueStack = [];\n  var fiberStack;\n\n  {\n    fiberStack = [];\n  }\n\n  var index = -1;\n\n  function createCursor(defaultValue) {\n    return {\n      current: defaultValue\n    };\n  }\n\n  function pop(cursor, fiber) {\n    if (index < 0) {\n      {\n        error('Unexpected pop.');\n      }\n\n      return;\n    }\n\n    {\n      if (fiber !== fiberStack[index]) {\n        error('Unexpected Fiber popped.');\n      }\n    }\n\n    cursor.current = valueStack[index];\n    valueStack[index] = null;\n\n    {\n      fiberStack[index] = null;\n    }\n\n    index--;\n  }\n\n  function push(cursor, value, fiber) {\n    index++;\n    valueStack[index] = cursor.current;\n\n    {\n      fiberStack[index] = fiber;\n    }\n\n    cursor.current = value;\n  }\n\n  var warnedAboutMissingGetChildContext;\n\n  {\n    warnedAboutMissingGetChildContext = {};\n  }\n\n  var emptyContextObject = {};\n\n  {\n    Object.freeze(emptyContextObject);\n  } // A cursor to the current merged context object on the stack.\n\n\n  var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.\n\n  var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.\n  // We use this to get access to the parent context after we have already\n  // pushed the next context provider, and now need to merge their contexts.\n\n  var previousContext = emptyContextObject;\n\n  function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {\n    {\n      if (didPushOwnContextIfProvider && isContextProvider(Component)) {\n        // If the fiber is a context provider itself, when we read its context\n        // we may have already pushed its own child context on the stack. A context\n        // provider should not \"see\" its own child context. Therefore we read the\n        // previous (parent) context instead for a context provider.\n        return previousContext;\n      }\n\n      return contextStackCursor.current;\n    }\n  }\n\n  function cacheContext(workInProgress, unmaskedContext, maskedContext) {\n    {\n      var instance = workInProgress.stateNode;\n      instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;\n      instance.__reactInternalMemoizedMaskedChildContext = maskedContext;\n    }\n  }\n\n  function getMaskedContext(workInProgress, unmaskedContext) {\n    {\n      var type = workInProgress.type;\n      var contextTypes = type.contextTypes;\n\n      if (!contextTypes) {\n        return emptyContextObject;\n      } // Avoid recreating masked context unless unmasked context has changed.\n      // Failing to do this will result in unnecessary calls to componentWillReceiveProps.\n      // This may trigger infinite loops if componentWillReceiveProps calls setState.\n\n\n      var instance = workInProgress.stateNode;\n\n      if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {\n        return instance.__reactInternalMemoizedMaskedChildContext;\n      }\n\n      var context = {};\n\n      for (var key in contextTypes) {\n        context[key] = unmaskedContext[key];\n      }\n\n      {\n        var name = getComponentName(type) || 'Unknown';\n        checkPropTypes_1(contextTypes, context, 'context', name, getCurrentFiberStackInDev);\n      } // Cache unmasked context so we can avoid recreating masked context unless necessary.\n      // Context is created before the class component is instantiated so check for instance.\n\n\n      if (instance) {\n        cacheContext(workInProgress, unmaskedContext, context);\n      }\n\n      return context;\n    }\n  }\n\n  function hasContextChanged() {\n    {\n      return didPerformWorkStackCursor.current;\n    }\n  }\n\n  function isContextProvider(type) {\n    {\n      var childContextTypes = type.childContextTypes;\n      return childContextTypes !== null && childContextTypes !== undefined;\n    }\n  }\n\n  function popContext(fiber) {\n    {\n      pop(didPerformWorkStackCursor, fiber);\n      pop(contextStackCursor, fiber);\n    }\n  }\n\n  function popTopLevelContextObject(fiber) {\n    {\n      pop(didPerformWorkStackCursor, fiber);\n      pop(contextStackCursor, fiber);\n    }\n  }\n\n  function pushTopLevelContextObject(fiber, context, didChange) {\n    {\n      if (!(contextStackCursor.current === emptyContextObject)) {\n        {\n          throw Error( \"Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n      push(contextStackCursor, context, fiber);\n      push(didPerformWorkStackCursor, didChange, fiber);\n    }\n  }\n\n  function processChildContext(fiber, type, parentContext) {\n    {\n      var instance = fiber.stateNode;\n      var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.\n      // It has only been added in Fiber to match the (unintentional) behavior in Stack.\n\n      if (typeof instance.getChildContext !== 'function') {\n        {\n          var componentName = getComponentName(type) || 'Unknown';\n\n          if (!warnedAboutMissingGetChildContext[componentName]) {\n            warnedAboutMissingGetChildContext[componentName] = true;\n\n            error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);\n          }\n        }\n\n        return parentContext;\n      }\n\n      var childContext;\n      startPhaseTimer(fiber, 'getChildContext');\n      childContext = instance.getChildContext();\n      stopPhaseTimer();\n\n      for (var contextKey in childContext) {\n        if (!(contextKey in childContextTypes)) {\n          {\n            throw Error( (getComponentName(type) || 'Unknown') + \".getChildContext(): key \\\"\" + contextKey + \"\\\" is not defined in childContextTypes.\" );\n          }\n        }\n      }\n\n      {\n        var name = getComponentName(type) || 'Unknown';\n        checkPropTypes_1(childContextTypes, childContext, 'child context', name, // In practice, there is one case in which we won't get a stack. It's when\n        // somebody calls unstable_renderSubtreeIntoContainer() and we process\n        // context from the parent component instance. The stack will be missing\n        // because it's outside of the reconciliation, and so the pointer has not\n        // been set. This is rare and doesn't matter. We'll also remove that API.\n        getCurrentFiberStackInDev);\n      }\n\n      return _assign({}, parentContext, {}, childContext);\n    }\n  }\n\n  function pushContextProvider(workInProgress) {\n    {\n      var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.\n      // If the instance does not exist yet, we will push null at first,\n      // and replace it on the stack later when invalidating the context.\n\n      var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.\n      // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.\n\n      previousContext = contextStackCursor.current;\n      push(contextStackCursor, memoizedMergedChildContext, workInProgress);\n      push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);\n      return true;\n    }\n  }\n\n  function invalidateContextProvider(workInProgress, type, didChange) {\n    {\n      var instance = workInProgress.stateNode;\n\n      if (!instance) {\n        {\n          throw Error( \"Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n      if (didChange) {\n        // Merge parent and own context.\n        // Skip this if we're not updating due to sCU.\n        // This avoids unnecessarily recomputing memoized values.\n        var mergedContext = processChildContext(workInProgress, type, previousContext);\n        instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.\n        // It is important to unwind the context in the reverse order.\n\n        pop(didPerformWorkStackCursor, workInProgress);\n        pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.\n\n        push(contextStackCursor, mergedContext, workInProgress);\n        push(didPerformWorkStackCursor, didChange, workInProgress);\n      } else {\n        pop(didPerformWorkStackCursor, workInProgress);\n        push(didPerformWorkStackCursor, didChange, workInProgress);\n      }\n    }\n  }\n\n  function findCurrentUnmaskedContext(fiber) {\n    {\n      // Currently this is only used with renderSubtreeIntoContainer; not sure if it\n      // makes sense elsewhere\n      if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) {\n        {\n          throw Error( \"Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n      var node = fiber;\n\n      do {\n        switch (node.tag) {\n          case HostRoot:\n            return node.stateNode.context;\n\n          case ClassComponent:\n            {\n              var Component = node.type;\n\n              if (isContextProvider(Component)) {\n                return node.stateNode.__reactInternalMemoizedMergedChildContext;\n              }\n\n              break;\n            }\n        }\n\n        node = node.return;\n      } while (node !== null);\n\n      {\n        {\n          throw Error( \"Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n    }\n  }\n\n  var LegacyRoot = 0;\n  var BlockingRoot = 1;\n  var ConcurrentRoot = 2;\n\n  var ReactInternals$2 = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n  var _ReactInternals$Sched$1 = ReactInternals$2.SchedulerTracing,\n      __interactionsRef = _ReactInternals$Sched$1.__interactionsRef,\n      __subscriberRef = _ReactInternals$Sched$1.__subscriberRef,\n      unstable_clear = _ReactInternals$Sched$1.unstable_clear,\n      unstable_getCurrent = _ReactInternals$Sched$1.unstable_getCurrent,\n      unstable_getThreadID = _ReactInternals$Sched$1.unstable_getThreadID,\n      unstable_subscribe = _ReactInternals$Sched$1.unstable_subscribe,\n      unstable_trace = _ReactInternals$Sched$1.unstable_trace,\n      unstable_unsubscribe = _ReactInternals$Sched$1.unstable_unsubscribe,\n      unstable_wrap = _ReactInternals$Sched$1.unstable_wrap;\n\n  var Scheduler_runWithPriority = unstable_runWithPriority,\n      Scheduler_scheduleCallback = unstable_scheduleCallback,\n      Scheduler_cancelCallback = unstable_cancelCallback,\n      Scheduler_shouldYield = unstable_shouldYield,\n      Scheduler_requestPaint = unstable_requestPaint,\n      Scheduler_now = unstable_now,\n      Scheduler_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel,\n      Scheduler_ImmediatePriority = unstable_ImmediatePriority,\n      Scheduler_UserBlockingPriority = unstable_UserBlockingPriority,\n      Scheduler_NormalPriority = unstable_NormalPriority,\n      Scheduler_LowPriority = unstable_LowPriority,\n      Scheduler_IdlePriority = unstable_IdlePriority;\n\n  {\n    // Provide explicit error message when production+profiling bundle of e.g.\n    // react-dom is used with production (non-profiling) bundle of\n    // scheduler/tracing\n    if (!(__interactionsRef != null && __interactionsRef.current != null)) {\n      {\n        throw Error( \"It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at http://fb.me/react-profiling\" );\n      }\n    }\n  }\n\n  var fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use\n  // ascending numbers so we can compare them like numbers. They start at 90 to\n  // avoid clashing with Scheduler's priorities.\n\n  var ImmediatePriority = 99;\n  var UserBlockingPriority$1 = 98;\n  var NormalPriority = 97;\n  var LowPriority = 96;\n  var IdlePriority = 95; // NoPriority is the absence of priority. Also React-only.\n\n  var NoPriority = 90;\n  var shouldYield = Scheduler_shouldYield;\n  var requestPaint = // Fall back gracefully if we're running an older version of Scheduler.\n  Scheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {};\n  var syncQueue = null;\n  var immediateQueueCallbackNode = null;\n  var isFlushingSyncQueue = false;\n  var initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly.\n  // This will be the case for modern browsers that support `performance.now`. In\n  // older browsers, Scheduler falls back to `Date.now`, which returns a Unix\n  // timestamp. In that case, subtract the module initialization time to simulate\n  // the behavior of performance.now and keep our times small enough to fit\n  // within 32 bits.\n  // TODO: Consider lifting this into Scheduler.\n\n  var now = initialTimeMs < 10000 ? Scheduler_now : function () {\n    return Scheduler_now() - initialTimeMs;\n  };\n  function getCurrentPriorityLevel() {\n    switch (Scheduler_getCurrentPriorityLevel()) {\n      case Scheduler_ImmediatePriority:\n        return ImmediatePriority;\n\n      case Scheduler_UserBlockingPriority:\n        return UserBlockingPriority$1;\n\n      case Scheduler_NormalPriority:\n        return NormalPriority;\n\n      case Scheduler_LowPriority:\n        return LowPriority;\n\n      case Scheduler_IdlePriority:\n        return IdlePriority;\n\n      default:\n        {\n          {\n            throw Error( \"Unknown priority level.\" );\n          }\n        }\n\n    }\n  }\n\n  function reactPriorityToSchedulerPriority(reactPriorityLevel) {\n    switch (reactPriorityLevel) {\n      case ImmediatePriority:\n        return Scheduler_ImmediatePriority;\n\n      case UserBlockingPriority$1:\n        return Scheduler_UserBlockingPriority;\n\n      case NormalPriority:\n        return Scheduler_NormalPriority;\n\n      case LowPriority:\n        return Scheduler_LowPriority;\n\n      case IdlePriority:\n        return Scheduler_IdlePriority;\n\n      default:\n        {\n          {\n            throw Error( \"Unknown priority level.\" );\n          }\n        }\n\n    }\n  }\n\n  function runWithPriority$1(reactPriorityLevel, fn) {\n    var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);\n    return Scheduler_runWithPriority(priorityLevel, fn);\n  }\n  function scheduleCallback(reactPriorityLevel, callback, options) {\n    var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel);\n    return Scheduler_scheduleCallback(priorityLevel, callback, options);\n  }\n  function scheduleSyncCallback(callback) {\n    // Push this callback into an internal queue. We'll flush these either in\n    // the next tick, or earlier if something calls `flushSyncCallbackQueue`.\n    if (syncQueue === null) {\n      syncQueue = [callback]; // Flush the queue in the next tick, at the earliest.\n\n      immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl);\n    } else {\n      // Push onto existing queue. Don't need to schedule a callback because\n      // we already scheduled one when we created the queue.\n      syncQueue.push(callback);\n    }\n\n    return fakeCallbackNode;\n  }\n  function cancelCallback(callbackNode) {\n    if (callbackNode !== fakeCallbackNode) {\n      Scheduler_cancelCallback(callbackNode);\n    }\n  }\n  function flushSyncCallbackQueue() {\n    if (immediateQueueCallbackNode !== null) {\n      var node = immediateQueueCallbackNode;\n      immediateQueueCallbackNode = null;\n      Scheduler_cancelCallback(node);\n    }\n\n    flushSyncCallbackQueueImpl();\n  }\n\n  function flushSyncCallbackQueueImpl() {\n    if (!isFlushingSyncQueue && syncQueue !== null) {\n      // Prevent re-entrancy.\n      isFlushingSyncQueue = true;\n      var i = 0;\n\n      try {\n        var _isSync = true;\n        var queue = syncQueue;\n        runWithPriority$1(ImmediatePriority, function () {\n          for (; i < queue.length; i++) {\n            var callback = queue[i];\n\n            do {\n              callback = callback(_isSync);\n            } while (callback !== null);\n          }\n        });\n        syncQueue = null;\n      } catch (error) {\n        // If something throws, leave the remaining callbacks on the queue.\n        if (syncQueue !== null) {\n          syncQueue = syncQueue.slice(i + 1);\n        } // Resume flushing in the next tick\n\n\n        Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue);\n        throw error;\n      } finally {\n        isFlushingSyncQueue = false;\n      }\n    }\n  }\n\n  var NoMode = 0;\n  var StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root\n  // tag instead\n\n  var BlockingMode = 2;\n  var ConcurrentMode = 4;\n  var ProfileMode = 8;\n\n  // Max 31 bit integer. The max integer size in V8 for 32-bit systems.\n  // Math.pow(2, 30) - 1\n  // 0b111111111111111111111111111111\n  var MAX_SIGNED_31_BIT_INT = 1073741823;\n\n  var NoWork = 0; // TODO: Think of a better name for Never. The key difference with Idle is that\n  // Never work can be committed in an inconsistent state without tearing the UI.\n  // The main example is offscreen content, like a hidden subtree. So one possible\n  // name is Offscreen. However, it also includes dehydrated Suspense boundaries,\n  // which are inconsistent in the sense that they haven't finished yet, but\n  // aren't visibly inconsistent because the server rendered HTML matches what the\n  // hydrated tree would look like.\n\n  var Never = 1; // Idle is slightly higher priority than Never. It must completely finish in\n  // order to be consistent.\n\n  var Idle = 2; // Continuous Hydration is slightly higher than Idle and is used to increase\n  // priority of hover targets.\n\n  var ContinuousHydration = 3;\n  var Sync = MAX_SIGNED_31_BIT_INT;\n  var Batched = Sync - 1;\n  var UNIT_SIZE = 10;\n  var MAGIC_NUMBER_OFFSET = Batched - 1; // 1 unit of expiration time represents 10ms.\n\n  function msToExpirationTime(ms) {\n    // Always subtract from the offset so that we don't clash with the magic number for NoWork.\n    return MAGIC_NUMBER_OFFSET - (ms / UNIT_SIZE | 0);\n  }\n  function expirationTimeToMs(expirationTime) {\n    return (MAGIC_NUMBER_OFFSET - expirationTime) * UNIT_SIZE;\n  }\n\n  function ceiling(num, precision) {\n    return ((num / precision | 0) + 1) * precision;\n  }\n\n  function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {\n    return MAGIC_NUMBER_OFFSET - ceiling(MAGIC_NUMBER_OFFSET - currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);\n  } // TODO: This corresponds to Scheduler's NormalPriority, not LowPriority. Update\n  // the names to reflect.\n\n\n  var LOW_PRIORITY_EXPIRATION = 5000;\n  var LOW_PRIORITY_BATCH_SIZE = 250;\n  function computeAsyncExpiration(currentTime) {\n    return computeExpirationBucket(currentTime, LOW_PRIORITY_EXPIRATION, LOW_PRIORITY_BATCH_SIZE);\n  }\n  function computeSuspenseExpiration(currentTime, timeoutMs) {\n    // TODO: Should we warn if timeoutMs is lower than the normal pri expiration time?\n    return computeExpirationBucket(currentTime, timeoutMs, LOW_PRIORITY_BATCH_SIZE);\n  } // We intentionally set a higher expiration time for interactive updates in\n  // dev than in production.\n  //\n  // If the main thread is being blocked so long that you hit the expiration,\n  // it's a problem that could be solved with better scheduling.\n  //\n  // People will be more likely to notice this and fix it with the long\n  // expiration time in development.\n  //\n  // In production we opt for better UX at the risk of masking scheduling\n  // problems, by expiring fast.\n\n  var HIGH_PRIORITY_EXPIRATION =  500 ;\n  var HIGH_PRIORITY_BATCH_SIZE = 100;\n  function computeInteractiveExpiration(currentTime) {\n    return computeExpirationBucket(currentTime, HIGH_PRIORITY_EXPIRATION, HIGH_PRIORITY_BATCH_SIZE);\n  }\n  function inferPriorityFromExpirationTime(currentTime, expirationTime) {\n    if (expirationTime === Sync) {\n      return ImmediatePriority;\n    }\n\n    if (expirationTime === Never || expirationTime === Idle) {\n      return IdlePriority;\n    }\n\n    var msUntil = expirationTimeToMs(expirationTime) - expirationTimeToMs(currentTime);\n\n    if (msUntil <= 0) {\n      return ImmediatePriority;\n    }\n\n    if (msUntil <= HIGH_PRIORITY_EXPIRATION + HIGH_PRIORITY_BATCH_SIZE) {\n      return UserBlockingPriority$1;\n    }\n\n    if (msUntil <= LOW_PRIORITY_EXPIRATION + LOW_PRIORITY_BATCH_SIZE) {\n      return NormalPriority;\n    } // TODO: Handle LowPriority\n    // Assume anything lower has idle priority\n\n\n    return IdlePriority;\n  }\n\n  var ReactStrictModeWarnings = {\n    recordUnsafeLifecycleWarnings: function (fiber, instance) {},\n    flushPendingUnsafeLifecycleWarnings: function () {},\n    recordLegacyContextWarning: function (fiber, instance) {},\n    flushLegacyContextWarning: function () {},\n    discardPendingWarnings: function () {}\n  };\n\n  {\n    var findStrictRoot = function (fiber) {\n      var maybeStrictRoot = null;\n      var node = fiber;\n\n      while (node !== null) {\n        if (node.mode & StrictMode) {\n          maybeStrictRoot = node;\n        }\n\n        node = node.return;\n      }\n\n      return maybeStrictRoot;\n    };\n\n    var setToSortedString = function (set) {\n      var array = [];\n      set.forEach(function (value) {\n        array.push(value);\n      });\n      return array.sort().join(', ');\n    };\n\n    var pendingComponentWillMountWarnings = [];\n    var pendingUNSAFE_ComponentWillMountWarnings = [];\n    var pendingComponentWillReceivePropsWarnings = [];\n    var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n    var pendingComponentWillUpdateWarnings = [];\n    var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.\n\n    var didWarnAboutUnsafeLifecycles = new Set();\n\n    ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {\n      // Dedup strategy: Warn once per component.\n      if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {\n        return;\n      }\n\n      if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.\n      instance.componentWillMount.__suppressDeprecationWarning !== true) {\n        pendingComponentWillMountWarnings.push(fiber);\n      }\n\n      if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') {\n        pendingUNSAFE_ComponentWillMountWarnings.push(fiber);\n      }\n\n      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {\n        pendingComponentWillReceivePropsWarnings.push(fiber);\n      }\n\n      if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n        pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);\n      }\n\n      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {\n        pendingComponentWillUpdateWarnings.push(fiber);\n      }\n\n      if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {\n        pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);\n      }\n    };\n\n    ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {\n      // We do an initial pass to gather component names\n      var componentWillMountUniqueNames = new Set();\n\n      if (pendingComponentWillMountWarnings.length > 0) {\n        pendingComponentWillMountWarnings.forEach(function (fiber) {\n          componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');\n          didWarnAboutUnsafeLifecycles.add(fiber.type);\n        });\n        pendingComponentWillMountWarnings = [];\n      }\n\n      var UNSAFE_componentWillMountUniqueNames = new Set();\n\n      if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {\n        pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {\n          UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component');\n          didWarnAboutUnsafeLifecycles.add(fiber.type);\n        });\n        pendingUNSAFE_ComponentWillMountWarnings = [];\n      }\n\n      var componentWillReceivePropsUniqueNames = new Set();\n\n      if (pendingComponentWillReceivePropsWarnings.length > 0) {\n        pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {\n          componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');\n          didWarnAboutUnsafeLifecycles.add(fiber.type);\n        });\n        pendingComponentWillReceivePropsWarnings = [];\n      }\n\n      var UNSAFE_componentWillReceivePropsUniqueNames = new Set();\n\n      if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {\n        pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {\n          UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component');\n          didWarnAboutUnsafeLifecycles.add(fiber.type);\n        });\n        pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n      }\n\n      var componentWillUpdateUniqueNames = new Set();\n\n      if (pendingComponentWillUpdateWarnings.length > 0) {\n        pendingComponentWillUpdateWarnings.forEach(function (fiber) {\n          componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');\n          didWarnAboutUnsafeLifecycles.add(fiber.type);\n        });\n        pendingComponentWillUpdateWarnings = [];\n      }\n\n      var UNSAFE_componentWillUpdateUniqueNames = new Set();\n\n      if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {\n        pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {\n          UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component');\n          didWarnAboutUnsafeLifecycles.add(fiber.type);\n        });\n        pendingUNSAFE_ComponentWillUpdateWarnings = [];\n      } // Finally, we flush all the warnings\n      // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'\n\n\n      if (UNSAFE_componentWillMountUniqueNames.size > 0) {\n        var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);\n\n        error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\\n' + '\\nPlease update the following components: %s', sortedNames);\n      }\n\n      if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {\n        var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);\n\n        error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + \"* If you're updating state whenever props change, \" + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\\n' + '\\nPlease update the following components: %s', _sortedNames);\n      }\n\n      if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {\n        var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);\n\n        error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + '\\nPlease update the following components: %s', _sortedNames2);\n      }\n\n      if (componentWillMountUniqueNames.size > 0) {\n        var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);\n\n        warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames3);\n      }\n\n      if (componentWillReceivePropsUniqueNames.size > 0) {\n        var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);\n\n        warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + \"* If you're updating state whenever props change, refactor your \" + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://fb.me/react-derived-state\\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames4);\n      }\n\n      if (componentWillUpdateUniqueNames.size > 0) {\n        var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);\n\n        warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://fb.me/react-unsafe-component-lifecycles for details.\\n\\n' + '* Move data fetching code or side effects to componentDidUpdate.\\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 17.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\\n' + '\\nPlease update the following components: %s', _sortedNames5);\n      }\n    };\n\n    var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.\n\n    var didWarnAboutLegacyContext = new Set();\n\n    ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {\n      var strictRoot = findStrictRoot(fiber);\n\n      if (strictRoot === null) {\n        error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.');\n\n        return;\n      } // Dedup strategy: Warn once per component.\n\n\n      if (didWarnAboutLegacyContext.has(fiber.type)) {\n        return;\n      }\n\n      var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);\n\n      if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {\n        if (warningsForRoot === undefined) {\n          warningsForRoot = [];\n          pendingLegacyContextWarning.set(strictRoot, warningsForRoot);\n        }\n\n        warningsForRoot.push(fiber);\n      }\n    };\n\n    ReactStrictModeWarnings.flushLegacyContextWarning = function () {\n      pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {\n        if (fiberArray.length === 0) {\n          return;\n        }\n\n        var firstFiber = fiberArray[0];\n        var uniqueNames = new Set();\n        fiberArray.forEach(function (fiber) {\n          uniqueNames.add(getComponentName(fiber.type) || 'Component');\n          didWarnAboutLegacyContext.add(fiber.type);\n        });\n        var sortedNames = setToSortedString(uniqueNames);\n        var firstComponentStack = getStackByFiberInDevAndProd(firstFiber);\n\n        error('Legacy context API has been detected within a strict-mode tree.' + '\\n\\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\\n\\nPlease update the following components: %s' + '\\n\\nLearn more about this warning here: https://fb.me/react-legacy-context' + '%s', sortedNames, firstComponentStack);\n      });\n    };\n\n    ReactStrictModeWarnings.discardPendingWarnings = function () {\n      pendingComponentWillMountWarnings = [];\n      pendingUNSAFE_ComponentWillMountWarnings = [];\n      pendingComponentWillReceivePropsWarnings = [];\n      pendingUNSAFE_ComponentWillReceivePropsWarnings = [];\n      pendingComponentWillUpdateWarnings = [];\n      pendingUNSAFE_ComponentWillUpdateWarnings = [];\n      pendingLegacyContextWarning = new Map();\n    };\n  }\n\n  var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.\n\n  var failedBoundaries = null;\n  var setRefreshHandler = function (handler) {\n    {\n      resolveFamily = handler;\n    }\n  };\n  function resolveFunctionForHotReloading(type) {\n    {\n      if (resolveFamily === null) {\n        // Hot reloading is disabled.\n        return type;\n      }\n\n      var family = resolveFamily(type);\n\n      if (family === undefined) {\n        return type;\n      } // Use the latest known implementation.\n\n\n      return family.current;\n    }\n  }\n  function resolveClassForHotReloading(type) {\n    // No implementation differences.\n    return resolveFunctionForHotReloading(type);\n  }\n  function resolveForwardRefForHotReloading(type) {\n    {\n      if (resolveFamily === null) {\n        // Hot reloading is disabled.\n        return type;\n      }\n\n      var family = resolveFamily(type);\n\n      if (family === undefined) {\n        // Check if we're dealing with a real forwardRef. Don't want to crash early.\n        if (type !== null && type !== undefined && typeof type.render === 'function') {\n          // ForwardRef is special because its resolved .type is an object,\n          // but it's possible that we only have its inner render function in the map.\n          // If that inner render function is different, we'll build a new forwardRef type.\n          var currentRender = resolveFunctionForHotReloading(type.render);\n\n          if (type.render !== currentRender) {\n            var syntheticType = {\n              $$typeof: REACT_FORWARD_REF_TYPE,\n              render: currentRender\n            };\n\n            if (type.displayName !== undefined) {\n              syntheticType.displayName = type.displayName;\n            }\n\n            return syntheticType;\n          }\n        }\n\n        return type;\n      } // Use the latest known implementation.\n\n\n      return family.current;\n    }\n  }\n  function isCompatibleFamilyForHotReloading(fiber, element) {\n    {\n      if (resolveFamily === null) {\n        // Hot reloading is disabled.\n        return false;\n      }\n\n      var prevType = fiber.elementType;\n      var nextType = element.type; // If we got here, we know types aren't === equal.\n\n      var needsCompareFamilies = false;\n      var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;\n\n      switch (fiber.tag) {\n        case ClassComponent:\n          {\n            if (typeof nextType === 'function') {\n              needsCompareFamilies = true;\n            }\n\n            break;\n          }\n\n        case FunctionComponent:\n          {\n            if (typeof nextType === 'function') {\n              needsCompareFamilies = true;\n            } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n              // We don't know the inner type yet.\n              // We're going to assume that the lazy inner type is stable,\n              // and so it is sufficient to avoid reconciling it away.\n              // We're not going to unwrap or actually use the new lazy type.\n              needsCompareFamilies = true;\n            }\n\n            break;\n          }\n\n        case ForwardRef:\n          {\n            if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {\n              needsCompareFamilies = true;\n            } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n              needsCompareFamilies = true;\n            }\n\n            break;\n          }\n\n        case MemoComponent:\n        case SimpleMemoComponent:\n          {\n            if ($$typeofNextType === REACT_MEMO_TYPE) {\n              // TODO: if it was but can no longer be simple,\n              // we shouldn't set this.\n              needsCompareFamilies = true;\n            } else if ($$typeofNextType === REACT_LAZY_TYPE) {\n              needsCompareFamilies = true;\n            }\n\n            break;\n          }\n\n        default:\n          return false;\n      } // Check if both types have a family and it's the same one.\n\n\n      if (needsCompareFamilies) {\n        // Note: memo() and forwardRef() we'll compare outer rather than inner type.\n        // This means both of them need to be registered to preserve state.\n        // If we unwrapped and compared the inner types for wrappers instead,\n        // then we would risk falsely saying two separate memo(Foo)\n        // calls are equivalent because they wrap the same Foo function.\n        var prevFamily = resolveFamily(prevType);\n\n        if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }\n  function markFailedErrorBoundaryForHotReloading(fiber) {\n    {\n      if (resolveFamily === null) {\n        // Hot reloading is disabled.\n        return;\n      }\n\n      if (typeof WeakSet !== 'function') {\n        return;\n      }\n\n      if (failedBoundaries === null) {\n        failedBoundaries = new WeakSet();\n      }\n\n      failedBoundaries.add(fiber);\n    }\n  }\n  var scheduleRefresh = function (root, update) {\n    {\n      if (resolveFamily === null) {\n        // Hot reloading is disabled.\n        return;\n      }\n\n      var staleFamilies = update.staleFamilies,\n          updatedFamilies = update.updatedFamilies;\n      flushPassiveEffects();\n      flushSync(function () {\n        scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);\n      });\n    }\n  };\n  var scheduleRoot = function (root, element) {\n    {\n      if (root.context !== emptyContextObject) {\n        // Super edge case: root has a legacy _renderSubtree context\n        // but we don't know the parentComponent so we can't pass it.\n        // Just ignore. We'll delete this with _renderSubtree code path later.\n        return;\n      }\n\n      flushPassiveEffects();\n      syncUpdates(function () {\n        updateContainer(element, root, null, null);\n      });\n    }\n  };\n\n  function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {\n    {\n      var alternate = fiber.alternate,\n          child = fiber.child,\n          sibling = fiber.sibling,\n          tag = fiber.tag,\n          type = fiber.type;\n      var candidateType = null;\n\n      switch (tag) {\n        case FunctionComponent:\n        case SimpleMemoComponent:\n        case ClassComponent:\n          candidateType = type;\n          break;\n\n        case ForwardRef:\n          candidateType = type.render;\n          break;\n      }\n\n      if (resolveFamily === null) {\n        throw new Error('Expected resolveFamily to be set during hot reload.');\n      }\n\n      var needsRender = false;\n      var needsRemount = false;\n\n      if (candidateType !== null) {\n        var family = resolveFamily(candidateType);\n\n        if (family !== undefined) {\n          if (staleFamilies.has(family)) {\n            needsRemount = true;\n          } else if (updatedFamilies.has(family)) {\n            if (tag === ClassComponent) {\n              needsRemount = true;\n            } else {\n              needsRender = true;\n            }\n          }\n        }\n      }\n\n      if (failedBoundaries !== null) {\n        if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {\n          needsRemount = true;\n        }\n      }\n\n      if (needsRemount) {\n        fiber._debugNeedsRemount = true;\n      }\n\n      if (needsRemount || needsRender) {\n        scheduleWork(fiber, Sync);\n      }\n\n      if (child !== null && !needsRemount) {\n        scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);\n      }\n\n      if (sibling !== null) {\n        scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);\n      }\n    }\n  }\n\n  var findHostInstancesForRefresh = function (root, families) {\n    {\n      var hostInstances = new Set();\n      var types = new Set(families.map(function (family) {\n        return family.current;\n      }));\n      findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);\n      return hostInstances;\n    }\n  };\n\n  function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {\n    {\n      var child = fiber.child,\n          sibling = fiber.sibling,\n          tag = fiber.tag,\n          type = fiber.type;\n      var candidateType = null;\n\n      switch (tag) {\n        case FunctionComponent:\n        case SimpleMemoComponent:\n        case ClassComponent:\n          candidateType = type;\n          break;\n\n        case ForwardRef:\n          candidateType = type.render;\n          break;\n      }\n\n      var didMatch = false;\n\n      if (candidateType !== null) {\n        if (types.has(candidateType)) {\n          didMatch = true;\n        }\n      }\n\n      if (didMatch) {\n        // We have a match. This only drills down to the closest host components.\n        // There's no need to search deeper because for the purpose of giving\n        // visual feedback, \"flashing\" outermost parent rectangles is sufficient.\n        findHostInstancesForFiberShallowly(fiber, hostInstances);\n      } else {\n        // If there's no match, maybe there will be one further down in the child tree.\n        if (child !== null) {\n          findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);\n        }\n      }\n\n      if (sibling !== null) {\n        findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);\n      }\n    }\n  }\n\n  function findHostInstancesForFiberShallowly(fiber, hostInstances) {\n    {\n      var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);\n\n      if (foundHostInstances) {\n        return;\n      } // If we didn't find any host children, fallback to closest host parent.\n\n\n      var node = fiber;\n\n      while (true) {\n        switch (node.tag) {\n          case HostComponent:\n            hostInstances.add(node.stateNode);\n            return;\n\n          case HostPortal:\n            hostInstances.add(node.stateNode.containerInfo);\n            return;\n\n          case HostRoot:\n            hostInstances.add(node.stateNode.containerInfo);\n            return;\n        }\n\n        if (node.return === null) {\n          throw new Error('Expected to reach root first.');\n        }\n\n        node = node.return;\n      }\n    }\n  }\n\n  function findChildHostInstancesForFiberShallowly(fiber, hostInstances) {\n    {\n      var node = fiber;\n      var foundHostInstances = false;\n\n      while (true) {\n        if (node.tag === HostComponent) {\n          // We got a match.\n          foundHostInstances = true;\n          hostInstances.add(node.stateNode); // There may still be more, so keep searching.\n        } else if (node.child !== null) {\n          node.child.return = node;\n          node = node.child;\n          continue;\n        }\n\n        if (node === fiber) {\n          return foundHostInstances;\n        }\n\n        while (node.sibling === null) {\n          if (node.return === null || node.return === fiber) {\n            return foundHostInstances;\n          }\n\n          node = node.return;\n        }\n\n        node.sibling.return = node.return;\n        node = node.sibling;\n      }\n    }\n\n    return false;\n  }\n\n  function resolveDefaultProps(Component, baseProps) {\n    if (Component && Component.defaultProps) {\n      // Resolve default props. Taken from ReactElement\n      var props = _assign({}, baseProps);\n\n      var defaultProps = Component.defaultProps;\n\n      for (var propName in defaultProps) {\n        if (props[propName] === undefined) {\n          props[propName] = defaultProps[propName];\n        }\n      }\n\n      return props;\n    }\n\n    return baseProps;\n  }\n  function readLazyComponentType(lazyComponent) {\n    initializeLazyComponentType(lazyComponent);\n\n    if (lazyComponent._status !== Resolved) {\n      throw lazyComponent._result;\n    }\n\n    return lazyComponent._result;\n  }\n\n  var valueCursor = createCursor(null);\n  var rendererSigil;\n\n  {\n    // Use this to detect multiple renderers using the same context\n    rendererSigil = {};\n  }\n\n  var currentlyRenderingFiber = null;\n  var lastContextDependency = null;\n  var lastContextWithAllBitsObserved = null;\n  var isDisallowedContextReadInDEV = false;\n  function resetContextDependencies() {\n    // This is called right before React yields execution, to ensure `readContext`\n    // cannot be called outside the render phase.\n    currentlyRenderingFiber = null;\n    lastContextDependency = null;\n    lastContextWithAllBitsObserved = null;\n\n    {\n      isDisallowedContextReadInDEV = false;\n    }\n  }\n  function enterDisallowedContextReadInDEV() {\n    {\n      isDisallowedContextReadInDEV = true;\n    }\n  }\n  function exitDisallowedContextReadInDEV() {\n    {\n      isDisallowedContextReadInDEV = false;\n    }\n  }\n  function pushProvider(providerFiber, nextValue) {\n    var context = providerFiber.type._context;\n\n    {\n      push(valueCursor, context._currentValue, providerFiber);\n      context._currentValue = nextValue;\n\n      {\n        if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {\n          error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');\n        }\n\n        context._currentRenderer = rendererSigil;\n      }\n    }\n  }\n  function popProvider(providerFiber) {\n    var currentValue = valueCursor.current;\n    pop(valueCursor, providerFiber);\n    var context = providerFiber.type._context;\n\n    {\n      context._currentValue = currentValue;\n    }\n  }\n  function calculateChangedBits(context, newValue, oldValue) {\n    if (objectIs(oldValue, newValue)) {\n      // No change\n      return 0;\n    } else {\n      var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n\n      {\n        if ((changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits) {\n          error('calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits);\n        }\n      }\n\n      return changedBits | 0;\n    }\n  }\n  function scheduleWorkOnParentPath(parent, renderExpirationTime) {\n    // Update the child expiration time of all the ancestors, including\n    // the alternates.\n    var node = parent;\n\n    while (node !== null) {\n      var alternate = node.alternate;\n\n      if (node.childExpirationTime < renderExpirationTime) {\n        node.childExpirationTime = renderExpirationTime;\n\n        if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {\n          alternate.childExpirationTime = renderExpirationTime;\n        }\n      } else if (alternate !== null && alternate.childExpirationTime < renderExpirationTime) {\n        alternate.childExpirationTime = renderExpirationTime;\n      } else {\n        // Neither alternate was updated, which means the rest of the\n        // ancestor path already has sufficient priority.\n        break;\n      }\n\n      node = node.return;\n    }\n  }\n  function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {\n    var fiber = workInProgress.child;\n\n    if (fiber !== null) {\n      // Set the return pointer of the child to the work-in-progress fiber.\n      fiber.return = workInProgress;\n    }\n\n    while (fiber !== null) {\n      var nextFiber = void 0; // Visit this fiber.\n\n      var list = fiber.dependencies;\n\n      if (list !== null) {\n        nextFiber = fiber.child;\n        var dependency = list.firstContext;\n\n        while (dependency !== null) {\n          // Check if the context matches.\n          if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) {\n            // Match! Schedule an update on this fiber.\n            if (fiber.tag === ClassComponent) {\n              // Schedule a force update on the work-in-progress.\n              var update = createUpdate(renderExpirationTime, null);\n              update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the\n              // update to the current fiber, too, which means it will persist even if\n              // this render is thrown away. Since it's a race condition, not sure it's\n              // worth fixing.\n\n              enqueueUpdate(fiber, update);\n            }\n\n            if (fiber.expirationTime < renderExpirationTime) {\n              fiber.expirationTime = renderExpirationTime;\n            }\n\n            var alternate = fiber.alternate;\n\n            if (alternate !== null && alternate.expirationTime < renderExpirationTime) {\n              alternate.expirationTime = renderExpirationTime;\n            }\n\n            scheduleWorkOnParentPath(fiber.return, renderExpirationTime); // Mark the expiration time on the list, too.\n\n            if (list.expirationTime < renderExpirationTime) {\n              list.expirationTime = renderExpirationTime;\n            } // Since we already found a match, we can stop traversing the\n            // dependency list.\n\n\n            break;\n          }\n\n          dependency = dependency.next;\n        }\n      } else if (fiber.tag === ContextProvider) {\n        // Don't scan deeper if this is a matching provider\n        nextFiber = fiber.type === workInProgress.type ? null : fiber.child;\n      } else {\n        // Traverse down.\n        nextFiber = fiber.child;\n      }\n\n      if (nextFiber !== null) {\n        // Set the return pointer of the child to the work-in-progress fiber.\n        nextFiber.return = fiber;\n      } else {\n        // No child. Traverse to next sibling.\n        nextFiber = fiber;\n\n        while (nextFiber !== null) {\n          if (nextFiber === workInProgress) {\n            // We're back to the root of this subtree. Exit.\n            nextFiber = null;\n            break;\n          }\n\n          var sibling = nextFiber.sibling;\n\n          if (sibling !== null) {\n            // Set the return pointer of the sibling to the work-in-progress fiber.\n            sibling.return = nextFiber.return;\n            nextFiber = sibling;\n            break;\n          } // No more siblings. Traverse up.\n\n\n          nextFiber = nextFiber.return;\n        }\n      }\n\n      fiber = nextFiber;\n    }\n  }\n  function prepareToReadContext(workInProgress, renderExpirationTime) {\n    currentlyRenderingFiber = workInProgress;\n    lastContextDependency = null;\n    lastContextWithAllBitsObserved = null;\n    var dependencies = workInProgress.dependencies;\n\n    if (dependencies !== null) {\n      var firstContext = dependencies.firstContext;\n\n      if (firstContext !== null) {\n        if (dependencies.expirationTime >= renderExpirationTime) {\n          // Context list has a pending update. Mark that this fiber performed work.\n          markWorkInProgressReceivedUpdate();\n        } // Reset the work-in-progress list\n\n\n        dependencies.firstContext = null;\n      }\n    }\n  }\n  function readContext(context, observedBits) {\n    {\n      // This warning would fire if you read context inside a Hook like useMemo.\n      // Unlike the class check below, it's not enforced in production for perf.\n      if (isDisallowedContextReadInDEV) {\n        error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');\n      }\n    }\n\n    if (lastContextWithAllBitsObserved === context) ; else if (observedBits === false || observedBits === 0) ; else {\n      var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types.\n\n      if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) {\n        // Observe all updates.\n        lastContextWithAllBitsObserved = context;\n        resolvedObservedBits = MAX_SIGNED_31_BIT_INT;\n      } else {\n        resolvedObservedBits = observedBits;\n      }\n\n      var contextItem = {\n        context: context,\n        observedBits: resolvedObservedBits,\n        next: null\n      };\n\n      if (lastContextDependency === null) {\n        if (!(currentlyRenderingFiber !== null)) {\n          {\n            throw Error( \"Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().\" );\n          }\n        } // This is the first dependency for this component. Create a new list.\n\n\n        lastContextDependency = contextItem;\n        currentlyRenderingFiber.dependencies = {\n          expirationTime: NoWork,\n          firstContext: contextItem,\n          responders: null\n        };\n      } else {\n        // Append a new context item.\n        lastContextDependency = lastContextDependency.next = contextItem;\n      }\n    }\n\n    return  context._currentValue ;\n  }\n\n  var UpdateState = 0;\n  var ReplaceState = 1;\n  var ForceUpdate = 2;\n  var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.\n  // It should only be read right after calling `processUpdateQueue`, via\n  // `checkHasForceUpdateAfterProcessing`.\n\n  var hasForceUpdate = false;\n  var didWarnUpdateInsideUpdate;\n  var currentlyProcessingQueue;\n\n  {\n    didWarnUpdateInsideUpdate = false;\n    currentlyProcessingQueue = null;\n  }\n\n  function initializeUpdateQueue(fiber) {\n    var queue = {\n      baseState: fiber.memoizedState,\n      baseQueue: null,\n      shared: {\n        pending: null\n      },\n      effects: null\n    };\n    fiber.updateQueue = queue;\n  }\n  function cloneUpdateQueue(current, workInProgress) {\n    // Clone the update queue from current. Unless it's already a clone.\n    var queue = workInProgress.updateQueue;\n    var currentQueue = current.updateQueue;\n\n    if (queue === currentQueue) {\n      var clone = {\n        baseState: currentQueue.baseState,\n        baseQueue: currentQueue.baseQueue,\n        shared: currentQueue.shared,\n        effects: currentQueue.effects\n      };\n      workInProgress.updateQueue = clone;\n    }\n  }\n  function createUpdate(expirationTime, suspenseConfig) {\n    var update = {\n      expirationTime: expirationTime,\n      suspenseConfig: suspenseConfig,\n      tag: UpdateState,\n      payload: null,\n      callback: null,\n      next: null\n    };\n    update.next = update;\n\n    {\n      update.priority = getCurrentPriorityLevel();\n    }\n\n    return update;\n  }\n  function enqueueUpdate(fiber, update) {\n    var updateQueue = fiber.updateQueue;\n\n    if (updateQueue === null) {\n      // Only occurs if the fiber has been unmounted.\n      return;\n    }\n\n    var sharedQueue = updateQueue.shared;\n    var pending = sharedQueue.pending;\n\n    if (pending === null) {\n      // This is the first update. Create a circular list.\n      update.next = update;\n    } else {\n      update.next = pending.next;\n      pending.next = update;\n    }\n\n    sharedQueue.pending = update;\n\n    {\n      if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {\n        error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');\n\n        didWarnUpdateInsideUpdate = true;\n      }\n    }\n  }\n  function enqueueCapturedUpdate(workInProgress, update) {\n    var current = workInProgress.alternate;\n\n    if (current !== null) {\n      // Ensure the work-in-progress queue is a clone\n      cloneUpdateQueue(current, workInProgress);\n    } // Captured updates go only on the work-in-progress queue.\n\n\n    var queue = workInProgress.updateQueue; // Append the update to the end of the list.\n\n    var last = queue.baseQueue;\n\n    if (last === null) {\n      queue.baseQueue = update.next = update;\n      update.next = update;\n    } else {\n      update.next = last.next;\n      last.next = update;\n    }\n  }\n\n  function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {\n    switch (update.tag) {\n      case ReplaceState:\n        {\n          var payload = update.payload;\n\n          if (typeof payload === 'function') {\n            // Updater function\n            {\n              enterDisallowedContextReadInDEV();\n\n              if ( workInProgress.mode & StrictMode) {\n                payload.call(instance, prevState, nextProps);\n              }\n            }\n\n            var nextState = payload.call(instance, prevState, nextProps);\n\n            {\n              exitDisallowedContextReadInDEV();\n            }\n\n            return nextState;\n          } // State object\n\n\n          return payload;\n        }\n\n      case CaptureUpdate:\n        {\n          workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;\n        }\n      // Intentional fallthrough\n\n      case UpdateState:\n        {\n          var _payload = update.payload;\n          var partialState;\n\n          if (typeof _payload === 'function') {\n            // Updater function\n            {\n              enterDisallowedContextReadInDEV();\n\n              if ( workInProgress.mode & StrictMode) {\n                _payload.call(instance, prevState, nextProps);\n              }\n            }\n\n            partialState = _payload.call(instance, prevState, nextProps);\n\n            {\n              exitDisallowedContextReadInDEV();\n            }\n          } else {\n            // Partial state object\n            partialState = _payload;\n          }\n\n          if (partialState === null || partialState === undefined) {\n            // Null and undefined are treated as no-ops.\n            return prevState;\n          } // Merge the partial state and the previous state.\n\n\n          return _assign({}, prevState, partialState);\n        }\n\n      case ForceUpdate:\n        {\n          hasForceUpdate = true;\n          return prevState;\n        }\n    }\n\n    return prevState;\n  }\n\n  function processUpdateQueue(workInProgress, props, instance, renderExpirationTime) {\n    // This is always non-null on a ClassComponent or HostRoot\n    var queue = workInProgress.updateQueue;\n    hasForceUpdate = false;\n\n    {\n      currentlyProcessingQueue = queue.shared;\n    } // The last rebase update that is NOT part of the base state.\n\n\n    var baseQueue = queue.baseQueue; // The last pending update that hasn't been processed yet.\n\n    var pendingQueue = queue.shared.pending;\n\n    if (pendingQueue !== null) {\n      // We have new updates that haven't been processed yet.\n      // We'll add them to the base queue.\n      if (baseQueue !== null) {\n        // Merge the pending queue and the base queue.\n        var baseFirst = baseQueue.next;\n        var pendingFirst = pendingQueue.next;\n        baseQueue.next = pendingFirst;\n        pendingQueue.next = baseFirst;\n      }\n\n      baseQueue = pendingQueue;\n      queue.shared.pending = null; // TODO: Pass `current` as argument\n\n      var current = workInProgress.alternate;\n\n      if (current !== null) {\n        var currentQueue = current.updateQueue;\n\n        if (currentQueue !== null) {\n          currentQueue.baseQueue = pendingQueue;\n        }\n      }\n    } // These values may change as we process the queue.\n\n\n    if (baseQueue !== null) {\n      var first = baseQueue.next; // Iterate through the list of updates to compute the result.\n\n      var newState = queue.baseState;\n      var newExpirationTime = NoWork;\n      var newBaseState = null;\n      var newBaseQueueFirst = null;\n      var newBaseQueueLast = null;\n\n      if (first !== null) {\n        var update = first;\n\n        do {\n          var updateExpirationTime = update.expirationTime;\n\n          if (updateExpirationTime < renderExpirationTime) {\n            // Priority is insufficient. Skip this update. If this is the first\n            // skipped update, the previous update/state is the new base\n            // update/state.\n            var clone = {\n              expirationTime: update.expirationTime,\n              suspenseConfig: update.suspenseConfig,\n              tag: update.tag,\n              payload: update.payload,\n              callback: update.callback,\n              next: null\n            };\n\n            if (newBaseQueueLast === null) {\n              newBaseQueueFirst = newBaseQueueLast = clone;\n              newBaseState = newState;\n            } else {\n              newBaseQueueLast = newBaseQueueLast.next = clone;\n            } // Update the remaining priority in the queue.\n\n\n            if (updateExpirationTime > newExpirationTime) {\n              newExpirationTime = updateExpirationTime;\n            }\n          } else {\n            // This update does have sufficient priority.\n            if (newBaseQueueLast !== null) {\n              var _clone = {\n                expirationTime: Sync,\n                // This update is going to be committed so we never want uncommit it.\n                suspenseConfig: update.suspenseConfig,\n                tag: update.tag,\n                payload: update.payload,\n                callback: update.callback,\n                next: null\n              };\n              newBaseQueueLast = newBaseQueueLast.next = _clone;\n            } // Mark the event time of this update as relevant to this render pass.\n            // TODO: This should ideally use the true event time of this update rather than\n            // its priority which is a derived and not reverseable value.\n            // TODO: We should skip this update if it was already committed but currently\n            // we have no way of detecting the difference between a committed and suspended\n            // update here.\n\n\n            markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.\n\n            newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance);\n            var callback = update.callback;\n\n            if (callback !== null) {\n              workInProgress.effectTag |= Callback;\n              var effects = queue.effects;\n\n              if (effects === null) {\n                queue.effects = [update];\n              } else {\n                effects.push(update);\n              }\n            }\n          }\n\n          update = update.next;\n\n          if (update === null || update === first) {\n            pendingQueue = queue.shared.pending;\n\n            if (pendingQueue === null) {\n              break;\n            } else {\n              // An update was scheduled from inside a reducer. Add the new\n              // pending updates to the end of the list and keep processing.\n              update = baseQueue.next = pendingQueue.next;\n              pendingQueue.next = first;\n              queue.baseQueue = baseQueue = pendingQueue;\n              queue.shared.pending = null;\n            }\n          }\n        } while (true);\n      }\n\n      if (newBaseQueueLast === null) {\n        newBaseState = newState;\n      } else {\n        newBaseQueueLast.next = newBaseQueueFirst;\n      }\n\n      queue.baseState = newBaseState;\n      queue.baseQueue = newBaseQueueLast; // Set the remaining expiration time to be whatever is remaining in the queue.\n      // This should be fine because the only two other things that contribute to\n      // expiration time are props and context. We're already in the middle of the\n      // begin phase by the time we start processing the queue, so we've already\n      // dealt with the props. Context in components that specify\n      // shouldComponentUpdate is tricky; but we'll have to account for\n      // that regardless.\n\n      markUnprocessedUpdateTime(newExpirationTime);\n      workInProgress.expirationTime = newExpirationTime;\n      workInProgress.memoizedState = newState;\n    }\n\n    {\n      currentlyProcessingQueue = null;\n    }\n  }\n\n  function callCallback(callback, context) {\n    if (!(typeof callback === 'function')) {\n      {\n        throw Error( \"Invalid argument passed as callback. Expected a function. Instead received: \" + callback );\n      }\n    }\n\n    callback.call(context);\n  }\n\n  function resetHasForceUpdateBeforeProcessing() {\n    hasForceUpdate = false;\n  }\n  function checkHasForceUpdateAfterProcessing() {\n    return hasForceUpdate;\n  }\n  function commitUpdateQueue(finishedWork, finishedQueue, instance) {\n    // Commit the effects\n    var effects = finishedQueue.effects;\n    finishedQueue.effects = null;\n\n    if (effects !== null) {\n      for (var i = 0; i < effects.length; i++) {\n        var effect = effects[i];\n        var callback = effect.callback;\n\n        if (callback !== null) {\n          effect.callback = null;\n          callCallback(callback, instance);\n        }\n      }\n    }\n  }\n\n  var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig;\n  function requestCurrentSuspenseConfig() {\n    return ReactCurrentBatchConfig.suspense;\n  }\n\n  var fakeInternalInstance = {};\n  var isArray = Array.isArray; // React.Component uses a shared frozen object by default.\n  // We'll use it to determine whether we need to initialize legacy refs.\n\n  var emptyRefsObject = new React.Component().refs;\n  var didWarnAboutStateAssignmentForComponent;\n  var didWarnAboutUninitializedState;\n  var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;\n  var didWarnAboutLegacyLifecyclesAndDerivedState;\n  var didWarnAboutUndefinedDerivedState;\n  var warnOnUndefinedDerivedState;\n  var warnOnInvalidCallback;\n  var didWarnAboutDirectlyAssigningPropsToState;\n  var didWarnAboutContextTypeAndContextTypes;\n  var didWarnAboutInvalidateContextType;\n\n  {\n    didWarnAboutStateAssignmentForComponent = new Set();\n    didWarnAboutUninitializedState = new Set();\n    didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();\n    didWarnAboutLegacyLifecyclesAndDerivedState = new Set();\n    didWarnAboutDirectlyAssigningPropsToState = new Set();\n    didWarnAboutUndefinedDerivedState = new Set();\n    didWarnAboutContextTypeAndContextTypes = new Set();\n    didWarnAboutInvalidateContextType = new Set();\n    var didWarnOnInvalidCallback = new Set();\n\n    warnOnInvalidCallback = function (callback, callerName) {\n      if (callback === null || typeof callback === 'function') {\n        return;\n      }\n\n      var key = callerName + \"_\" + callback;\n\n      if (!didWarnOnInvalidCallback.has(key)) {\n        didWarnOnInvalidCallback.add(key);\n\n        error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n      }\n    };\n\n    warnOnUndefinedDerivedState = function (type, partialState) {\n      if (partialState === undefined) {\n        var componentName = getComponentName(type) || 'Component';\n\n        if (!didWarnAboutUndefinedDerivedState.has(componentName)) {\n          didWarnAboutUndefinedDerivedState.add(componentName);\n\n          error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);\n        }\n      }\n    }; // This is so gross but it's at least non-critical and can be removed if\n    // it causes problems. This is meant to give a nicer error message for\n    // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,\n    // ...)) which otherwise throws a \"_processChildContext is not a function\"\n    // exception.\n\n\n    Object.defineProperty(fakeInternalInstance, '_processChildContext', {\n      enumerable: false,\n      value: function () {\n        {\n          {\n            throw Error( \"_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).\" );\n          }\n        }\n      }\n    });\n    Object.freeze(fakeInternalInstance);\n  }\n\n  function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {\n    var prevState = workInProgress.memoizedState;\n\n    {\n      if ( workInProgress.mode & StrictMode) {\n        // Invoke the function an extra time to help detect side-effects.\n        getDerivedStateFromProps(nextProps, prevState);\n      }\n    }\n\n    var partialState = getDerivedStateFromProps(nextProps, prevState);\n\n    {\n      warnOnUndefinedDerivedState(ctor, partialState);\n    } // Merge the partial state and the previous state.\n\n\n    var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState);\n    workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the\n    // base state.\n\n    if (workInProgress.expirationTime === NoWork) {\n      // Queue is always non-null for classes\n      var updateQueue = workInProgress.updateQueue;\n      updateQueue.baseState = memoizedState;\n    }\n  }\n  var classComponentUpdater = {\n    isMounted: isMounted,\n    enqueueSetState: function (inst, payload, callback) {\n      var fiber = get(inst);\n      var currentTime = requestCurrentTimeForUpdate();\n      var suspenseConfig = requestCurrentSuspenseConfig();\n      var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n      var update = createUpdate(expirationTime, suspenseConfig);\n      update.payload = payload;\n\n      if (callback !== undefined && callback !== null) {\n        {\n          warnOnInvalidCallback(callback, 'setState');\n        }\n\n        update.callback = callback;\n      }\n\n      enqueueUpdate(fiber, update);\n      scheduleWork(fiber, expirationTime);\n    },\n    enqueueReplaceState: function (inst, payload, callback) {\n      var fiber = get(inst);\n      var currentTime = requestCurrentTimeForUpdate();\n      var suspenseConfig = requestCurrentSuspenseConfig();\n      var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n      var update = createUpdate(expirationTime, suspenseConfig);\n      update.tag = ReplaceState;\n      update.payload = payload;\n\n      if (callback !== undefined && callback !== null) {\n        {\n          warnOnInvalidCallback(callback, 'replaceState');\n        }\n\n        update.callback = callback;\n      }\n\n      enqueueUpdate(fiber, update);\n      scheduleWork(fiber, expirationTime);\n    },\n    enqueueForceUpdate: function (inst, callback) {\n      var fiber = get(inst);\n      var currentTime = requestCurrentTimeForUpdate();\n      var suspenseConfig = requestCurrentSuspenseConfig();\n      var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n      var update = createUpdate(expirationTime, suspenseConfig);\n      update.tag = ForceUpdate;\n\n      if (callback !== undefined && callback !== null) {\n        {\n          warnOnInvalidCallback(callback, 'forceUpdate');\n        }\n\n        update.callback = callback;\n      }\n\n      enqueueUpdate(fiber, update);\n      scheduleWork(fiber, expirationTime);\n    }\n  };\n\n  function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {\n    var instance = workInProgress.stateNode;\n\n    if (typeof instance.shouldComponentUpdate === 'function') {\n      {\n        if ( workInProgress.mode & StrictMode) {\n          // Invoke the function an extra time to help detect side-effects.\n          instance.shouldComponentUpdate(newProps, newState, nextContext);\n        }\n      }\n\n      startPhaseTimer(workInProgress, 'shouldComponentUpdate');\n      var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);\n      stopPhaseTimer();\n\n      {\n        if (shouldUpdate === undefined) {\n          error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component');\n        }\n      }\n\n      return shouldUpdate;\n    }\n\n    if (ctor.prototype && ctor.prototype.isPureReactComponent) {\n      return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);\n    }\n\n    return true;\n  }\n\n  function checkClassInstance(workInProgress, ctor, newProps) {\n    var instance = workInProgress.stateNode;\n\n    {\n      var name = getComponentName(ctor) || 'Component';\n      var renderPresent = instance.render;\n\n      if (!renderPresent) {\n        if (ctor.prototype && typeof ctor.prototype.render === 'function') {\n          error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);\n        } else {\n          error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);\n        }\n      }\n\n      if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {\n        error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);\n      }\n\n      if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {\n        error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);\n      }\n\n      if (instance.propTypes) {\n        error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);\n      }\n\n      if (instance.contextType) {\n        error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);\n      }\n\n      {\n        if (instance.contextTypes) {\n          error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);\n        }\n\n        if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {\n          didWarnAboutContextTypeAndContextTypes.add(ctor);\n\n          error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);\n        }\n      }\n\n      if (typeof instance.componentShouldUpdate === 'function') {\n        error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);\n      }\n\n      if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {\n        error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component');\n      }\n\n      if (typeof instance.componentDidUnmount === 'function') {\n        error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);\n      }\n\n      if (typeof instance.componentDidReceiveProps === 'function') {\n        error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);\n      }\n\n      if (typeof instance.componentWillRecieveProps === 'function') {\n        error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);\n      }\n\n      if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {\n        error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);\n      }\n\n      var hasMutatedProps = instance.props !== newProps;\n\n      if (instance.props !== undefined && hasMutatedProps) {\n        error('%s(...): When calling super() in `%s`, make sure to pass ' + \"up the same props that your component's constructor was passed.\", name, name);\n      }\n\n      if (instance.defaultProps) {\n        error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);\n      }\n\n      if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {\n        didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);\n\n        error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor));\n      }\n\n      if (typeof instance.getDerivedStateFromProps === 'function') {\n        error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);\n      }\n\n      if (typeof instance.getDerivedStateFromError === 'function') {\n        error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);\n      }\n\n      if (typeof ctor.getSnapshotBeforeUpdate === 'function') {\n        error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);\n      }\n\n      var _state = instance.state;\n\n      if (_state && (typeof _state !== 'object' || isArray(_state))) {\n        error('%s.state: must be set to an object or null', name);\n      }\n\n      if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {\n        error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);\n      }\n    }\n  }\n\n  function adoptClassInstance(workInProgress, instance) {\n    instance.updater = classComponentUpdater;\n    workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates\n\n    set(instance, workInProgress);\n\n    {\n      instance._reactInternalInstance = fakeInternalInstance;\n    }\n  }\n\n  function constructClassInstance(workInProgress, ctor, props) {\n    var isLegacyContextConsumer = false;\n    var unmaskedContext = emptyContextObject;\n    var context = emptyContextObject;\n    var contextType = ctor.contextType;\n\n    {\n      if ('contextType' in ctor) {\n        var isValid = // Allow null for conditional declaration\n        contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>\n\n        if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {\n          didWarnAboutInvalidateContextType.add(ctor);\n          var addendum = '';\n\n          if (contextType === undefined) {\n            addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.';\n          } else if (typeof contextType !== 'object') {\n            addendum = ' However, it is set to a ' + typeof contextType + '.';\n          } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {\n            addendum = ' Did you accidentally pass the Context.Provider instead?';\n          } else if (contextType._context !== undefined) {\n            // <Context.Consumer>\n            addendum = ' Did you accidentally pass the Context.Consumer instead?';\n          } else {\n            addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';\n          }\n\n          error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum);\n        }\n      }\n    }\n\n    if (typeof contextType === 'object' && contextType !== null) {\n      context = readContext(contextType);\n    } else {\n      unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n      var contextTypes = ctor.contextTypes;\n      isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;\n      context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;\n    } // Instantiate twice to help detect side-effects.\n\n\n    {\n      if ( workInProgress.mode & StrictMode) {\n        new ctor(props, context); // eslint-disable-line no-new\n      }\n    }\n\n    var instance = new ctor(props, context);\n    var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;\n    adoptClassInstance(workInProgress, instance);\n\n    {\n      if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {\n        var componentName = getComponentName(ctor) || 'Component';\n\n        if (!didWarnAboutUninitializedState.has(componentName)) {\n          didWarnAboutUninitializedState.add(componentName);\n\n          error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName);\n        }\n      } // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n      // Warn about these lifecycles if they are present.\n      // Don't warn about react-lifecycles-compat polyfilled methods though.\n\n\n      if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {\n        var foundWillMountName = null;\n        var foundWillReceivePropsName = null;\n        var foundWillUpdateName = null;\n\n        if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {\n          foundWillMountName = 'componentWillMount';\n        } else if (typeof instance.UNSAFE_componentWillMount === 'function') {\n          foundWillMountName = 'UNSAFE_componentWillMount';\n        }\n\n        if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {\n          foundWillReceivePropsName = 'componentWillReceiveProps';\n        } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n          foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n        }\n\n        if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {\n          foundWillUpdateName = 'componentWillUpdate';\n        } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {\n          foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n        }\n\n        if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {\n          var _componentName = getComponentName(ctor) || 'Component';\n\n          var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';\n\n          if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {\n            didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);\n\n            error('Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\\n\\n' + 'The above lifecycles should be removed. Learn more about this warning here:\\n' + 'https://fb.me/react-unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? \"\\n  \" + foundWillMountName : '', foundWillReceivePropsName !== null ? \"\\n  \" + foundWillReceivePropsName : '', foundWillUpdateName !== null ? \"\\n  \" + foundWillUpdateName : '');\n          }\n        }\n      }\n    } // Cache unmasked context so we can avoid recreating masked context unless necessary.\n    // ReactFiberContext usually updates this cache but can't for newly-created instances.\n\n\n    if (isLegacyContextConsumer) {\n      cacheContext(workInProgress, unmaskedContext, context);\n    }\n\n    return instance;\n  }\n\n  function callComponentWillMount(workInProgress, instance) {\n    startPhaseTimer(workInProgress, 'componentWillMount');\n    var oldState = instance.state;\n\n    if (typeof instance.componentWillMount === 'function') {\n      instance.componentWillMount();\n    }\n\n    if (typeof instance.UNSAFE_componentWillMount === 'function') {\n      instance.UNSAFE_componentWillMount();\n    }\n\n    stopPhaseTimer();\n\n    if (oldState !== instance.state) {\n      {\n        error('%s.componentWillMount(): Assigning directly to this.state is ' + \"deprecated (except inside a component's \" + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component');\n      }\n\n      classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n    }\n  }\n\n  function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {\n    var oldState = instance.state;\n    startPhaseTimer(workInProgress, 'componentWillReceiveProps');\n\n    if (typeof instance.componentWillReceiveProps === 'function') {\n      instance.componentWillReceiveProps(newProps, nextContext);\n    }\n\n    if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {\n      instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n    }\n\n    stopPhaseTimer();\n\n    if (instance.state !== oldState) {\n      {\n        var componentName = getComponentName(workInProgress.type) || 'Component';\n\n        if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {\n          didWarnAboutStateAssignmentForComponent.add(componentName);\n\n          error('%s.componentWillReceiveProps(): Assigning directly to ' + \"this.state is deprecated (except inside a component's \" + 'constructor). Use setState instead.', componentName);\n        }\n      }\n\n      classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n    }\n  } // Invokes the mount life-cycles on a previously never rendered instance.\n\n\n  function mountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {\n    {\n      checkClassInstance(workInProgress, ctor, newProps);\n    }\n\n    var instance = workInProgress.stateNode;\n    instance.props = newProps;\n    instance.state = workInProgress.memoizedState;\n    instance.refs = emptyRefsObject;\n    initializeUpdateQueue(workInProgress);\n    var contextType = ctor.contextType;\n\n    if (typeof contextType === 'object' && contextType !== null) {\n      instance.context = readContext(contextType);\n    } else {\n      var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n      instance.context = getMaskedContext(workInProgress, unmaskedContext);\n    }\n\n    {\n      if (instance.state === newProps) {\n        var componentName = getComponentName(ctor) || 'Component';\n\n        if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {\n          didWarnAboutDirectlyAssigningPropsToState.add(componentName);\n\n          error('%s: It is not recommended to assign props directly to state ' + \"because updates to props won't be reflected in state. \" + 'In most cases, it is better to use props directly.', componentName);\n        }\n      }\n\n      if (workInProgress.mode & StrictMode) {\n        ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);\n      }\n\n      {\n        ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);\n      }\n    }\n\n    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n    instance.state = workInProgress.memoizedState;\n    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n\n    if (typeof getDerivedStateFromProps === 'function') {\n      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n      instance.state = workInProgress.memoizedState;\n    } // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n\n    if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {\n      callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's\n      // process them now.\n\n      processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n      instance.state = workInProgress.memoizedState;\n    }\n\n    if (typeof instance.componentDidMount === 'function') {\n      workInProgress.effectTag |= Update;\n    }\n  }\n\n  function resumeMountClassInstance(workInProgress, ctor, newProps, renderExpirationTime) {\n    var instance = workInProgress.stateNode;\n    var oldProps = workInProgress.memoizedProps;\n    instance.props = oldProps;\n    var oldContext = instance.context;\n    var contextType = ctor.contextType;\n    var nextContext = emptyContextObject;\n\n    if (typeof contextType === 'object' && contextType !== null) {\n      nextContext = readContext(contextType);\n    } else {\n      var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n      nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);\n    }\n\n    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n    var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what\n    // ever the previously attempted to render - not the \"current\". However,\n    // during componentDidUpdate we pass the \"current\" props.\n    // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {\n      if (oldProps !== newProps || oldContext !== nextContext) {\n        callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);\n      }\n    }\n\n    resetHasForceUpdateBeforeProcessing();\n    var oldState = workInProgress.memoizedState;\n    var newState = instance.state = oldState;\n    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n    newState = workInProgress.memoizedState;\n\n    if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {\n      // If an update was already in progress, we should schedule an Update\n      // effect even though we're bailing out, so that cWU/cDU are called.\n      if (typeof instance.componentDidMount === 'function') {\n        workInProgress.effectTag |= Update;\n      }\n\n      return false;\n    }\n\n    if (typeof getDerivedStateFromProps === 'function') {\n      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n      newState = workInProgress.memoizedState;\n    }\n\n    var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);\n\n    if (shouldUpdate) {\n      // In order to support react-lifecycles-compat polyfilled components,\n      // Unsafe lifecycles should not be invoked for components using the new APIs.\n      if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {\n        startPhaseTimer(workInProgress, 'componentWillMount');\n\n        if (typeof instance.componentWillMount === 'function') {\n          instance.componentWillMount();\n        }\n\n        if (typeof instance.UNSAFE_componentWillMount === 'function') {\n          instance.UNSAFE_componentWillMount();\n        }\n\n        stopPhaseTimer();\n      }\n\n      if (typeof instance.componentDidMount === 'function') {\n        workInProgress.effectTag |= Update;\n      }\n    } else {\n      // If an update was already in progress, we should schedule an Update\n      // effect even though we're bailing out, so that cWU/cDU are called.\n      if (typeof instance.componentDidMount === 'function') {\n        workInProgress.effectTag |= Update;\n      } // If shouldComponentUpdate returned false, we should still update the\n      // memoized state to indicate that this work can be reused.\n\n\n      workInProgress.memoizedProps = newProps;\n      workInProgress.memoizedState = newState;\n    } // Update the existing instance's state, props, and context pointers even\n    // if shouldComponentUpdate returns false.\n\n\n    instance.props = newProps;\n    instance.state = newState;\n    instance.context = nextContext;\n    return shouldUpdate;\n  } // Invokes the update life-cycles and returns false if it shouldn't rerender.\n\n\n  function updateClassInstance(current, workInProgress, ctor, newProps, renderExpirationTime) {\n    var instance = workInProgress.stateNode;\n    cloneUpdateQueue(current, workInProgress);\n    var oldProps = workInProgress.memoizedProps;\n    instance.props = workInProgress.type === workInProgress.elementType ? oldProps : resolveDefaultProps(workInProgress.type, oldProps);\n    var oldContext = instance.context;\n    var contextType = ctor.contextType;\n    var nextContext = emptyContextObject;\n\n    if (typeof contextType === 'object' && contextType !== null) {\n      nextContext = readContext(contextType);\n    } else {\n      var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);\n      nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);\n    }\n\n    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;\n    var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what\n    // ever the previously attempted to render - not the \"current\". However,\n    // during componentDidUpdate we pass the \"current\" props.\n    // In order to support react-lifecycles-compat polyfilled components,\n    // Unsafe lifecycles should not be invoked for components using the new APIs.\n\n    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {\n      if (oldProps !== newProps || oldContext !== nextContext) {\n        callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);\n      }\n    }\n\n    resetHasForceUpdateBeforeProcessing();\n    var oldState = workInProgress.memoizedState;\n    var newState = instance.state = oldState;\n    processUpdateQueue(workInProgress, newProps, instance, renderExpirationTime);\n    newState = workInProgress.memoizedState;\n\n    if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {\n      // If an update was already in progress, we should schedule an Update\n      // effect even though we're bailing out, so that cWU/cDU are called.\n      if (typeof instance.componentDidUpdate === 'function') {\n        if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n          workInProgress.effectTag |= Update;\n        }\n      }\n\n      if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n        if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n          workInProgress.effectTag |= Snapshot;\n        }\n      }\n\n      return false;\n    }\n\n    if (typeof getDerivedStateFromProps === 'function') {\n      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);\n      newState = workInProgress.memoizedState;\n    }\n\n    var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);\n\n    if (shouldUpdate) {\n      // In order to support react-lifecycles-compat polyfilled components,\n      // Unsafe lifecycles should not be invoked for components using the new APIs.\n      if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {\n        startPhaseTimer(workInProgress, 'componentWillUpdate');\n\n        if (typeof instance.componentWillUpdate === 'function') {\n          instance.componentWillUpdate(newProps, newState, nextContext);\n        }\n\n        if (typeof instance.UNSAFE_componentWillUpdate === 'function') {\n          instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);\n        }\n\n        stopPhaseTimer();\n      }\n\n      if (typeof instance.componentDidUpdate === 'function') {\n        workInProgress.effectTag |= Update;\n      }\n\n      if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n        workInProgress.effectTag |= Snapshot;\n      }\n    } else {\n      // If an update was already in progress, we should schedule an Update\n      // effect even though we're bailing out, so that cWU/cDU are called.\n      if (typeof instance.componentDidUpdate === 'function') {\n        if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n          workInProgress.effectTag |= Update;\n        }\n      }\n\n      if (typeof instance.getSnapshotBeforeUpdate === 'function') {\n        if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n          workInProgress.effectTag |= Snapshot;\n        }\n      } // If shouldComponentUpdate returned false, we should still update the\n      // memoized props/state to indicate that this work can be reused.\n\n\n      workInProgress.memoizedProps = newProps;\n      workInProgress.memoizedState = newState;\n    } // Update the existing instance's state, props, and context pointers even\n    // if shouldComponentUpdate returns false.\n\n\n    instance.props = newProps;\n    instance.state = newState;\n    instance.context = nextContext;\n    return shouldUpdate;\n  }\n\n  var didWarnAboutMaps;\n  var didWarnAboutGenerators;\n  var didWarnAboutStringRefs;\n  var ownerHasKeyUseWarning;\n  var ownerHasFunctionTypeWarning;\n\n  var warnForMissingKey = function (child) {};\n\n  {\n    didWarnAboutMaps = false;\n    didWarnAboutGenerators = false;\n    didWarnAboutStringRefs = {};\n    /**\n     * Warn if there's no key explicitly set on dynamic arrays of children or\n     * object keys are not valid. This allows us to keep track of children between\n     * updates.\n     */\n\n    ownerHasKeyUseWarning = {};\n    ownerHasFunctionTypeWarning = {};\n\n    warnForMissingKey = function (child) {\n      if (child === null || typeof child !== 'object') {\n        return;\n      }\n\n      if (!child._store || child._store.validated || child.key != null) {\n        return;\n      }\n\n      if (!(typeof child._store === 'object')) {\n        {\n          throw Error( \"React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n      child._store.validated = true;\n      var currentComponentErrorInfo = 'Each child in a list should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + getCurrentFiberStackInDev();\n\n      if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n        return;\n      }\n\n      ownerHasKeyUseWarning[currentComponentErrorInfo] = true;\n\n      error('Each child in a list should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.');\n    };\n  }\n\n  var isArray$1 = Array.isArray;\n\n  function coerceRef(returnFiber, current, element) {\n    var mixedRef = element.ref;\n\n    if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {\n      {\n        // TODO: Clean this up once we turn on the string ref warning for\n        // everyone, because the strict mode case will no longer be relevant\n        if ((returnFiber.mode & StrictMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs\n        // because these cannot be automatically converted to an arrow function\n        // using a codemod. Therefore, we don't have to warn about string refs again.\n        !(element._owner && element._self && element._owner.stateNode !== element._self)) {\n          var componentName = getComponentName(returnFiber.type) || 'Component';\n\n          if (!didWarnAboutStringRefs[componentName]) {\n            {\n              error('A string ref, \"%s\", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref%s', mixedRef, getStackByFiberInDevAndProd(returnFiber));\n            }\n\n            didWarnAboutStringRefs[componentName] = true;\n          }\n        }\n      }\n\n      if (element._owner) {\n        var owner = element._owner;\n        var inst;\n\n        if (owner) {\n          var ownerFiber = owner;\n\n          if (!(ownerFiber.tag === ClassComponent)) {\n            {\n              throw Error( \"Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://fb.me/react-strict-mode-string-ref\" );\n            }\n          }\n\n          inst = ownerFiber.stateNode;\n        }\n\n        if (!inst) {\n          {\n            throw Error( \"Missing owner for string ref \" + mixedRef + \". This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n\n        var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref\n\n        if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) {\n          return current.ref;\n        }\n\n        var ref = function (value) {\n          var refs = inst.refs;\n\n          if (refs === emptyRefsObject) {\n            // This is a lazy pooled frozen object, so we need to initialize.\n            refs = inst.refs = {};\n          }\n\n          if (value === null) {\n            delete refs[stringRef];\n          } else {\n            refs[stringRef] = value;\n          }\n        };\n\n        ref._stringRef = stringRef;\n        return ref;\n      } else {\n        if (!(typeof mixedRef === 'string')) {\n          {\n            throw Error( \"Expected ref to be a function, a string, an object returned by React.createRef(), or null.\" );\n          }\n        }\n\n        if (!element._owner) {\n          {\n            throw Error( \"Element ref was specified as a string (\" + mixedRef + \") but no owner was set. This could happen for one of the following reasons:\\n1. You may be adding a ref to a function component\\n2. You may be adding a ref to a component that was not created inside a component's render method\\n3. You have multiple copies of React loaded\\nSee https://fb.me/react-refs-must-have-owner for more information.\" );\n          }\n        }\n      }\n    }\n\n    return mixedRef;\n  }\n\n  function throwOnInvalidObjectType(returnFiber, newChild) {\n    if (returnFiber.type !== 'textarea') {\n      var addendum = '';\n\n      {\n        addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + getCurrentFiberStackInDev();\n      }\n\n      {\n        {\n          throw Error( \"Objects are not valid as a React child (found: \" + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + \").\" + addendum );\n        }\n      }\n    }\n  }\n\n  function warnOnFunctionType() {\n    {\n      var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + getCurrentFiberStackInDev();\n\n      if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {\n        return;\n      }\n\n      ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;\n\n      error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.');\n    }\n  } // This wrapper function exists because I expect to clone the code in each path\n  // to be able to optimize each path individually by branching early. This needs\n  // a compiler or we can do it manually. Helpers that don't need this branching\n  // live outside of this function.\n\n\n  function ChildReconciler(shouldTrackSideEffects) {\n    function deleteChild(returnFiber, childToDelete) {\n      if (!shouldTrackSideEffects) {\n        // Noop.\n        return;\n      } // Deletions are added in reversed order so we add it to the front.\n      // At this point, the return fiber's effect list is empty except for\n      // deletions, so we can just append the deletion to the list. The remaining\n      // effects aren't added until the complete phase. Once we implement\n      // resuming, this may not be true.\n\n\n      var last = returnFiber.lastEffect;\n\n      if (last !== null) {\n        last.nextEffect = childToDelete;\n        returnFiber.lastEffect = childToDelete;\n      } else {\n        returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n      }\n\n      childToDelete.nextEffect = null;\n      childToDelete.effectTag = Deletion;\n    }\n\n    function deleteRemainingChildren(returnFiber, currentFirstChild) {\n      if (!shouldTrackSideEffects) {\n        // Noop.\n        return null;\n      } // TODO: For the shouldClone case, this could be micro-optimized a bit by\n      // assuming that after the first child we've already added everything.\n\n\n      var childToDelete = currentFirstChild;\n\n      while (childToDelete !== null) {\n        deleteChild(returnFiber, childToDelete);\n        childToDelete = childToDelete.sibling;\n      }\n\n      return null;\n    }\n\n    function mapRemainingChildren(returnFiber, currentFirstChild) {\n      // Add the remaining children to a temporary map so that we can find them by\n      // keys quickly. Implicit (null) keys get added to this set with their index\n      // instead.\n      var existingChildren = new Map();\n      var existingChild = currentFirstChild;\n\n      while (existingChild !== null) {\n        if (existingChild.key !== null) {\n          existingChildren.set(existingChild.key, existingChild);\n        } else {\n          existingChildren.set(existingChild.index, existingChild);\n        }\n\n        existingChild = existingChild.sibling;\n      }\n\n      return existingChildren;\n    }\n\n    function useFiber(fiber, pendingProps) {\n      // We currently set sibling to null and index to 0 here because it is easy\n      // to forget to do before returning it. E.g. for the single child case.\n      var clone = createWorkInProgress(fiber, pendingProps);\n      clone.index = 0;\n      clone.sibling = null;\n      return clone;\n    }\n\n    function placeChild(newFiber, lastPlacedIndex, newIndex) {\n      newFiber.index = newIndex;\n\n      if (!shouldTrackSideEffects) {\n        // Noop.\n        return lastPlacedIndex;\n      }\n\n      var current = newFiber.alternate;\n\n      if (current !== null) {\n        var oldIndex = current.index;\n\n        if (oldIndex < lastPlacedIndex) {\n          // This is a move.\n          newFiber.effectTag = Placement;\n          return lastPlacedIndex;\n        } else {\n          // This item can stay in place.\n          return oldIndex;\n        }\n      } else {\n        // This is an insertion.\n        newFiber.effectTag = Placement;\n        return lastPlacedIndex;\n      }\n    }\n\n    function placeSingleChild(newFiber) {\n      // This is simpler for the single child case. We only need to do a\n      // placement for inserting new children.\n      if (shouldTrackSideEffects && newFiber.alternate === null) {\n        newFiber.effectTag = Placement;\n      }\n\n      return newFiber;\n    }\n\n    function updateTextNode(returnFiber, current, textContent, expirationTime) {\n      if (current === null || current.tag !== HostText) {\n        // Insert\n        var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n        created.return = returnFiber;\n        return created;\n      } else {\n        // Update\n        var existing = useFiber(current, textContent);\n        existing.return = returnFiber;\n        return existing;\n      }\n    }\n\n    function updateElement(returnFiber, current, element, expirationTime) {\n      if (current !== null) {\n        if (current.elementType === element.type || ( // Keep this check inline so it only runs on the false path:\n         isCompatibleFamilyForHotReloading(current, element) )) {\n          // Move based on index\n          var existing = useFiber(current, element.props);\n          existing.ref = coerceRef(returnFiber, current, element);\n          existing.return = returnFiber;\n\n          {\n            existing._debugSource = element._source;\n            existing._debugOwner = element._owner;\n          }\n\n          return existing;\n        }\n      } // Insert\n\n\n      var created = createFiberFromElement(element, returnFiber.mode, expirationTime);\n      created.ref = coerceRef(returnFiber, current, element);\n      created.return = returnFiber;\n      return created;\n    }\n\n    function updatePortal(returnFiber, current, portal, expirationTime) {\n      if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {\n        // Insert\n        var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n        created.return = returnFiber;\n        return created;\n      } else {\n        // Update\n        var existing = useFiber(current, portal.children || []);\n        existing.return = returnFiber;\n        return existing;\n      }\n    }\n\n    function updateFragment(returnFiber, current, fragment, expirationTime, key) {\n      if (current === null || current.tag !== Fragment) {\n        // Insert\n        var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);\n        created.return = returnFiber;\n        return created;\n      } else {\n        // Update\n        var existing = useFiber(current, fragment);\n        existing.return = returnFiber;\n        return existing;\n      }\n    }\n\n    function createChild(returnFiber, newChild, expirationTime) {\n      if (typeof newChild === 'string' || typeof newChild === 'number') {\n        // Text nodes don't have keys. If the previous node is implicitly keyed\n        // we can continue to replace it without aborting even if it is not a text\n        // node.\n        var created = createFiberFromText('' + newChild, returnFiber.mode, expirationTime);\n        created.return = returnFiber;\n        return created;\n      }\n\n      if (typeof newChild === 'object' && newChild !== null) {\n        switch (newChild.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n            {\n              var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);\n\n              _created.ref = coerceRef(returnFiber, null, newChild);\n              _created.return = returnFiber;\n              return _created;\n            }\n\n          case REACT_PORTAL_TYPE:\n            {\n              var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);\n\n              _created2.return = returnFiber;\n              return _created2;\n            }\n        }\n\n        if (isArray$1(newChild) || getIteratorFn(newChild)) {\n          var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);\n\n          _created3.return = returnFiber;\n          return _created3;\n        }\n\n        throwOnInvalidObjectType(returnFiber, newChild);\n      }\n\n      {\n        if (typeof newChild === 'function') {\n          warnOnFunctionType();\n        }\n      }\n\n      return null;\n    }\n\n    function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {\n      // Update the fiber if the keys match, otherwise return null.\n      var key = oldFiber !== null ? oldFiber.key : null;\n\n      if (typeof newChild === 'string' || typeof newChild === 'number') {\n        // Text nodes don't have keys. If the previous node is implicitly keyed\n        // we can continue to replace it without aborting even if it is not a text\n        // node.\n        if (key !== null) {\n          return null;\n        }\n\n        return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);\n      }\n\n      if (typeof newChild === 'object' && newChild !== null) {\n        switch (newChild.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n            {\n              if (newChild.key === key) {\n                if (newChild.type === REACT_FRAGMENT_TYPE) {\n                  return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);\n                }\n\n                return updateElement(returnFiber, oldFiber, newChild, expirationTime);\n              } else {\n                return null;\n              }\n            }\n\n          case REACT_PORTAL_TYPE:\n            {\n              if (newChild.key === key) {\n                return updatePortal(returnFiber, oldFiber, newChild, expirationTime);\n              } else {\n                return null;\n              }\n            }\n        }\n\n        if (isArray$1(newChild) || getIteratorFn(newChild)) {\n          if (key !== null) {\n            return null;\n          }\n\n          return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);\n        }\n\n        throwOnInvalidObjectType(returnFiber, newChild);\n      }\n\n      {\n        if (typeof newChild === 'function') {\n          warnOnFunctionType();\n        }\n      }\n\n      return null;\n    }\n\n    function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {\n      if (typeof newChild === 'string' || typeof newChild === 'number') {\n        // Text nodes don't have keys, so we neither have to check the old nor\n        // new node for the key. If both are text nodes, they match.\n        var matchedFiber = existingChildren.get(newIdx) || null;\n        return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);\n      }\n\n      if (typeof newChild === 'object' && newChild !== null) {\n        switch (newChild.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n            {\n              var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n\n              if (newChild.type === REACT_FRAGMENT_TYPE) {\n                return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);\n              }\n\n              return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);\n            }\n\n          case REACT_PORTAL_TYPE:\n            {\n              var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n\n              return updatePortal(returnFiber, _matchedFiber2, newChild, expirationTime);\n            }\n        }\n\n        if (isArray$1(newChild) || getIteratorFn(newChild)) {\n          var _matchedFiber3 = existingChildren.get(newIdx) || null;\n\n          return updateFragment(returnFiber, _matchedFiber3, newChild, expirationTime, null);\n        }\n\n        throwOnInvalidObjectType(returnFiber, newChild);\n      }\n\n      {\n        if (typeof newChild === 'function') {\n          warnOnFunctionType();\n        }\n      }\n\n      return null;\n    }\n    /**\n     * Warns if there is a duplicate or missing key\n     */\n\n\n    function warnOnInvalidKey(child, knownKeys) {\n      {\n        if (typeof child !== 'object' || child === null) {\n          return knownKeys;\n        }\n\n        switch (child.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n          case REACT_PORTAL_TYPE:\n            warnForMissingKey(child);\n            var key = child.key;\n\n            if (typeof key !== 'string') {\n              break;\n            }\n\n            if (knownKeys === null) {\n              knownKeys = new Set();\n              knownKeys.add(key);\n              break;\n            }\n\n            if (!knownKeys.has(key)) {\n              knownKeys.add(key);\n              break;\n            }\n\n            error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key);\n\n            break;\n        }\n      }\n\n      return knownKeys;\n    }\n\n    function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {\n      // This algorithm can't optimize by searching from both ends since we\n      // don't have backpointers on fibers. I'm trying to see how far we can get\n      // with that model. If it ends up not being worth the tradeoffs, we can\n      // add it later.\n      // Even with a two ended optimization, we'd want to optimize for the case\n      // where there are few changes and brute force the comparison instead of\n      // going for the Map. It'd like to explore hitting that path first in\n      // forward-only mode and only go for the Map once we notice that we need\n      // lots of look ahead. This doesn't handle reversal as well as two ended\n      // search but that's unusual. Besides, for the two ended optimization to\n      // work on Iterables, we'd need to copy the whole set.\n      // In this first iteration, we'll just live with hitting the bad case\n      // (adding everything to a Map) in for every insert/move.\n      // If you change this code, also update reconcileChildrenIterator() which\n      // uses the same algorithm.\n      {\n        // First, validate keys.\n        var knownKeys = null;\n\n        for (var i = 0; i < newChildren.length; i++) {\n          var child = newChildren[i];\n          knownKeys = warnOnInvalidKey(child, knownKeys);\n        }\n      }\n\n      var resultingFirstChild = null;\n      var previousNewFiber = null;\n      var oldFiber = currentFirstChild;\n      var lastPlacedIndex = 0;\n      var newIdx = 0;\n      var nextOldFiber = null;\n\n      for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {\n        if (oldFiber.index > newIdx) {\n          nextOldFiber = oldFiber;\n          oldFiber = null;\n        } else {\n          nextOldFiber = oldFiber.sibling;\n        }\n\n        var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);\n\n        if (newFiber === null) {\n          // TODO: This breaks on empty slots like null children. That's\n          // unfortunate because it triggers the slow path all the time. We need\n          // a better way to communicate whether this was a miss or null,\n          // boolean, undefined, etc.\n          if (oldFiber === null) {\n            oldFiber = nextOldFiber;\n          }\n\n          break;\n        }\n\n        if (shouldTrackSideEffects) {\n          if (oldFiber && newFiber.alternate === null) {\n            // We matched the slot, but we didn't reuse the existing fiber, so we\n            // need to delete the existing child.\n            deleteChild(returnFiber, oldFiber);\n          }\n        }\n\n        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          // TODO: Move out of the loop. This only happens for the first run.\n          resultingFirstChild = newFiber;\n        } else {\n          // TODO: Defer siblings if we're not at the right index for this slot.\n          // I.e. if we had null values before, then we want to defer this\n          // for each null value. However, we also don't want to call updateSlot\n          // with the previous one.\n          previousNewFiber.sibling = newFiber;\n        }\n\n        previousNewFiber = newFiber;\n        oldFiber = nextOldFiber;\n      }\n\n      if (newIdx === newChildren.length) {\n        // We've reached the end of the new children. We can delete the rest.\n        deleteRemainingChildren(returnFiber, oldFiber);\n        return resultingFirstChild;\n      }\n\n      if (oldFiber === null) {\n        // If we don't have any more existing children we can choose a fast path\n        // since the rest will all be insertions.\n        for (; newIdx < newChildren.length; newIdx++) {\n          var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);\n\n          if (_newFiber === null) {\n            continue;\n          }\n\n          lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);\n\n          if (previousNewFiber === null) {\n            // TODO: Move out of the loop. This only happens for the first run.\n            resultingFirstChild = _newFiber;\n          } else {\n            previousNewFiber.sibling = _newFiber;\n          }\n\n          previousNewFiber = _newFiber;\n        }\n\n        return resultingFirstChild;\n      } // Add all children to a key map for quick lookups.\n\n\n      var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.\n\n      for (; newIdx < newChildren.length; newIdx++) {\n        var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);\n\n        if (_newFiber2 !== null) {\n          if (shouldTrackSideEffects) {\n            if (_newFiber2.alternate !== null) {\n              // The new fiber is a work in progress, but if there exists a\n              // current, that means that we reused the fiber. We need to delete\n              // it from the child list so that we don't add it to the deletion\n              // list.\n              existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);\n            }\n          }\n\n          lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);\n\n          if (previousNewFiber === null) {\n            resultingFirstChild = _newFiber2;\n          } else {\n            previousNewFiber.sibling = _newFiber2;\n          }\n\n          previousNewFiber = _newFiber2;\n        }\n      }\n\n      if (shouldTrackSideEffects) {\n        // Any existing children that weren't consumed above were deleted. We need\n        // to add them to the deletion list.\n        existingChildren.forEach(function (child) {\n          return deleteChild(returnFiber, child);\n        });\n      }\n\n      return resultingFirstChild;\n    }\n\n    function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {\n      // This is the same implementation as reconcileChildrenArray(),\n      // but using the iterator instead.\n      var iteratorFn = getIteratorFn(newChildrenIterable);\n\n      if (!(typeof iteratorFn === 'function')) {\n        {\n          throw Error( \"An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.\" );\n        }\n      }\n\n      {\n        // We don't support rendering Generators because it's a mutation.\n        // See https://github.com/facebook/react/issues/12995\n        if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag\n        newChildrenIterable[Symbol.toStringTag] === 'Generator') {\n          if (!didWarnAboutGenerators) {\n            error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.');\n          }\n\n          didWarnAboutGenerators = true;\n        } // Warn about using Maps as children\n\n\n        if (newChildrenIterable.entries === iteratorFn) {\n          if (!didWarnAboutMaps) {\n            error('Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.');\n          }\n\n          didWarnAboutMaps = true;\n        } // First, validate keys.\n        // We'll get a different iterator later for the main pass.\n\n\n        var _newChildren = iteratorFn.call(newChildrenIterable);\n\n        if (_newChildren) {\n          var knownKeys = null;\n\n          var _step = _newChildren.next();\n\n          for (; !_step.done; _step = _newChildren.next()) {\n            var child = _step.value;\n            knownKeys = warnOnInvalidKey(child, knownKeys);\n          }\n        }\n      }\n\n      var newChildren = iteratorFn.call(newChildrenIterable);\n\n      if (!(newChildren != null)) {\n        {\n          throw Error( \"An iterable object provided no iterator.\" );\n        }\n      }\n\n      var resultingFirstChild = null;\n      var previousNewFiber = null;\n      var oldFiber = currentFirstChild;\n      var lastPlacedIndex = 0;\n      var newIdx = 0;\n      var nextOldFiber = null;\n      var step = newChildren.next();\n\n      for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {\n        if (oldFiber.index > newIdx) {\n          nextOldFiber = oldFiber;\n          oldFiber = null;\n        } else {\n          nextOldFiber = oldFiber.sibling;\n        }\n\n        var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);\n\n        if (newFiber === null) {\n          // TODO: This breaks on empty slots like null children. That's\n          // unfortunate because it triggers the slow path all the time. We need\n          // a better way to communicate whether this was a miss or null,\n          // boolean, undefined, etc.\n          if (oldFiber === null) {\n            oldFiber = nextOldFiber;\n          }\n\n          break;\n        }\n\n        if (shouldTrackSideEffects) {\n          if (oldFiber && newFiber.alternate === null) {\n            // We matched the slot, but we didn't reuse the existing fiber, so we\n            // need to delete the existing child.\n            deleteChild(returnFiber, oldFiber);\n          }\n        }\n\n        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n\n        if (previousNewFiber === null) {\n          // TODO: Move out of the loop. This only happens for the first run.\n          resultingFirstChild = newFiber;\n        } else {\n          // TODO: Defer siblings if we're not at the right index for this slot.\n          // I.e. if we had null values before, then we want to defer this\n          // for each null value. However, we also don't want to call updateSlot\n          // with the previous one.\n          previousNewFiber.sibling = newFiber;\n        }\n\n        previousNewFiber = newFiber;\n        oldFiber = nextOldFiber;\n      }\n\n      if (step.done) {\n        // We've reached the end of the new children. We can delete the rest.\n        deleteRemainingChildren(returnFiber, oldFiber);\n        return resultingFirstChild;\n      }\n\n      if (oldFiber === null) {\n        // If we don't have any more existing children we can choose a fast path\n        // since the rest will all be insertions.\n        for (; !step.done; newIdx++, step = newChildren.next()) {\n          var _newFiber3 = createChild(returnFiber, step.value, expirationTime);\n\n          if (_newFiber3 === null) {\n            continue;\n          }\n\n          lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);\n\n          if (previousNewFiber === null) {\n            // TODO: Move out of the loop. This only happens for the first run.\n            resultingFirstChild = _newFiber3;\n          } else {\n            previousNewFiber.sibling = _newFiber3;\n          }\n\n          previousNewFiber = _newFiber3;\n        }\n\n        return resultingFirstChild;\n      } // Add all children to a key map for quick lookups.\n\n\n      var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.\n\n      for (; !step.done; newIdx++, step = newChildren.next()) {\n        var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);\n\n        if (_newFiber4 !== null) {\n          if (shouldTrackSideEffects) {\n            if (_newFiber4.alternate !== null) {\n              // The new fiber is a work in progress, but if there exists a\n              // current, that means that we reused the fiber. We need to delete\n              // it from the child list so that we don't add it to the deletion\n              // list.\n              existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);\n            }\n          }\n\n          lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);\n\n          if (previousNewFiber === null) {\n            resultingFirstChild = _newFiber4;\n          } else {\n            previousNewFiber.sibling = _newFiber4;\n          }\n\n          previousNewFiber = _newFiber4;\n        }\n      }\n\n      if (shouldTrackSideEffects) {\n        // Any existing children that weren't consumed above were deleted. We need\n        // to add them to the deletion list.\n        existingChildren.forEach(function (child) {\n          return deleteChild(returnFiber, child);\n        });\n      }\n\n      return resultingFirstChild;\n    }\n\n    function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {\n      // There's no need to check for keys on text nodes since we don't have a\n      // way to define them.\n      if (currentFirstChild !== null && currentFirstChild.tag === HostText) {\n        // We already have an existing node so let's just update it and delete\n        // the rest.\n        deleteRemainingChildren(returnFiber, currentFirstChild.sibling);\n        var existing = useFiber(currentFirstChild, textContent);\n        existing.return = returnFiber;\n        return existing;\n      } // The existing first child is not a text node so we need to create one\n      // and delete the existing ones.\n\n\n      deleteRemainingChildren(returnFiber, currentFirstChild);\n      var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    }\n\n    function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {\n      var key = element.key;\n      var child = currentFirstChild;\n\n      while (child !== null) {\n        // TODO: If key === null and child.key === null, then this only applies to\n        // the first item in the list.\n        if (child.key === key) {\n          switch (child.tag) {\n            case Fragment:\n              {\n                if (element.type === REACT_FRAGMENT_TYPE) {\n                  deleteRemainingChildren(returnFiber, child.sibling);\n                  var existing = useFiber(child, element.props.children);\n                  existing.return = returnFiber;\n\n                  {\n                    existing._debugSource = element._source;\n                    existing._debugOwner = element._owner;\n                  }\n\n                  return existing;\n                }\n\n                break;\n              }\n\n            case Block:\n\n            // We intentionally fallthrough here if enableBlocksAPI is not on.\n            // eslint-disable-next-lined no-fallthrough\n\n            default:\n              {\n                if (child.elementType === element.type || ( // Keep this check inline so it only runs on the false path:\n                 isCompatibleFamilyForHotReloading(child, element) )) {\n                  deleteRemainingChildren(returnFiber, child.sibling);\n\n                  var _existing3 = useFiber(child, element.props);\n\n                  _existing3.ref = coerceRef(returnFiber, child, element);\n                  _existing3.return = returnFiber;\n\n                  {\n                    _existing3._debugSource = element._source;\n                    _existing3._debugOwner = element._owner;\n                  }\n\n                  return _existing3;\n                }\n\n                break;\n              }\n          } // Didn't match.\n\n\n          deleteRemainingChildren(returnFiber, child);\n          break;\n        } else {\n          deleteChild(returnFiber, child);\n        }\n\n        child = child.sibling;\n      }\n\n      if (element.type === REACT_FRAGMENT_TYPE) {\n        var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);\n        created.return = returnFiber;\n        return created;\n      } else {\n        var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);\n\n        _created4.ref = coerceRef(returnFiber, currentFirstChild, element);\n        _created4.return = returnFiber;\n        return _created4;\n      }\n    }\n\n    function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {\n      var key = portal.key;\n      var child = currentFirstChild;\n\n      while (child !== null) {\n        // TODO: If key === null and child.key === null, then this only applies to\n        // the first item in the list.\n        if (child.key === key) {\n          if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {\n            deleteRemainingChildren(returnFiber, child.sibling);\n            var existing = useFiber(child, portal.children || []);\n            existing.return = returnFiber;\n            return existing;\n          } else {\n            deleteRemainingChildren(returnFiber, child);\n            break;\n          }\n        } else {\n          deleteChild(returnFiber, child);\n        }\n\n        child = child.sibling;\n      }\n\n      var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n      created.return = returnFiber;\n      return created;\n    } // This API will tag the children with the side-effect of the reconciliation\n    // itself. They will be added to the side-effect list as we pass through the\n    // children and the parent.\n\n\n    function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {\n      // This function is not recursive.\n      // If the top level item is an array, we treat it as a set of children,\n      // not as a fragment. Nested arrays on the other hand will be treated as\n      // fragment nodes. Recursion happens at the normal flow.\n      // Handle top level unkeyed fragments as if they were arrays.\n      // This leads to an ambiguity between <>{[...]}</> and <>...</>.\n      // We treat the ambiguous cases above the same.\n      var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;\n\n      if (isUnkeyedTopLevelFragment) {\n        newChild = newChild.props.children;\n      } // Handle object types\n\n\n      var isObject = typeof newChild === 'object' && newChild !== null;\n\n      if (isObject) {\n        switch (newChild.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n            return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));\n\n          case REACT_PORTAL_TYPE:\n            return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));\n        }\n      }\n\n      if (typeof newChild === 'string' || typeof newChild === 'number') {\n        return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));\n      }\n\n      if (isArray$1(newChild)) {\n        return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);\n      }\n\n      if (getIteratorFn(newChild)) {\n        return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);\n      }\n\n      if (isObject) {\n        throwOnInvalidObjectType(returnFiber, newChild);\n      }\n\n      {\n        if (typeof newChild === 'function') {\n          warnOnFunctionType();\n        }\n      }\n\n      if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) {\n        // If the new child is undefined, and the return fiber is a composite\n        // component, throw an error. If Fiber return types are disabled,\n        // we already threw above.\n        switch (returnFiber.tag) {\n          case ClassComponent:\n            {\n              {\n                var instance = returnFiber.stateNode;\n\n                if (instance.render._isMockFunction) {\n                  // We allow auto-mocks to proceed as if they're returning null.\n                  break;\n                }\n              }\n            }\n          // Intentionally fall through to the next case, which handles both\n          // functions and classes\n          // eslint-disable-next-lined no-fallthrough\n\n          case FunctionComponent:\n            {\n              var Component = returnFiber.type;\n\n              {\n                {\n                  throw Error( (Component.displayName || Component.name || 'Component') + \"(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.\" );\n                }\n              }\n            }\n        }\n      } // Remaining cases are all treated as empty.\n\n\n      return deleteRemainingChildren(returnFiber, currentFirstChild);\n    }\n\n    return reconcileChildFibers;\n  }\n\n  var reconcileChildFibers = ChildReconciler(true);\n  var mountChildFibers = ChildReconciler(false);\n  function cloneChildFibers(current, workInProgress) {\n    if (!(current === null || workInProgress.child === current.child)) {\n      {\n        throw Error( \"Resuming work not yet implemented.\" );\n      }\n    }\n\n    if (workInProgress.child === null) {\n      return;\n    }\n\n    var currentChild = workInProgress.child;\n    var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);\n    workInProgress.child = newChild;\n    newChild.return = workInProgress;\n\n    while (currentChild.sibling !== null) {\n      currentChild = currentChild.sibling;\n      newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);\n      newChild.return = workInProgress;\n    }\n\n    newChild.sibling = null;\n  } // Reset a workInProgress child set to prepare it for a second pass.\n\n  function resetChildFibers(workInProgress, renderExpirationTime) {\n    var child = workInProgress.child;\n\n    while (child !== null) {\n      resetWorkInProgress(child, renderExpirationTime);\n      child = child.sibling;\n    }\n  }\n\n  var NO_CONTEXT = {};\n  var contextStackCursor$1 = createCursor(NO_CONTEXT);\n  var contextFiberStackCursor = createCursor(NO_CONTEXT);\n  var rootInstanceStackCursor = createCursor(NO_CONTEXT);\n\n  function requiredContext(c) {\n    if (!(c !== NO_CONTEXT)) {\n      {\n        throw Error( \"Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    return c;\n  }\n\n  function getRootHostContainer() {\n    var rootInstance = requiredContext(rootInstanceStackCursor.current);\n    return rootInstance;\n  }\n\n  function pushHostContainer(fiber, nextRootInstance) {\n    // Push current root instance onto the stack;\n    // This allows us to reset root when portals are popped.\n    push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.\n    // This enables us to pop only Fibers that provide unique contexts.\n\n    push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.\n    // However, we can't just call getRootHostContext() and push it because\n    // we'd have a different number of entries on the stack depending on\n    // whether getRootHostContext() throws somewhere in renderer code or not.\n    // So we push an empty value first. This lets us safely unwind on errors.\n\n    push(contextStackCursor$1, NO_CONTEXT, fiber);\n    var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.\n\n    pop(contextStackCursor$1, fiber);\n    push(contextStackCursor$1, nextRootContext, fiber);\n  }\n\n  function popHostContainer(fiber) {\n    pop(contextStackCursor$1, fiber);\n    pop(contextFiberStackCursor, fiber);\n    pop(rootInstanceStackCursor, fiber);\n  }\n\n  function getHostContext() {\n    var context = requiredContext(contextStackCursor$1.current);\n    return context;\n  }\n\n  function pushHostContext(fiber) {\n    var rootInstance = requiredContext(rootInstanceStackCursor.current);\n    var context = requiredContext(contextStackCursor$1.current);\n    var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique.\n\n    if (context === nextContext) {\n      return;\n    } // Track the context and the Fiber that provided it.\n    // This enables us to pop only Fibers that provide unique contexts.\n\n\n    push(contextFiberStackCursor, fiber, fiber);\n    push(contextStackCursor$1, nextContext, fiber);\n  }\n\n  function popHostContext(fiber) {\n    // Do not pop unless this Fiber provided the current context.\n    // pushHostContext() only pushes Fibers that provide unique contexts.\n    if (contextFiberStackCursor.current !== fiber) {\n      return;\n    }\n\n    pop(contextStackCursor$1, fiber);\n    pop(contextFiberStackCursor, fiber);\n  }\n\n  var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is\n  // inherited deeply down the subtree. The upper bits only affect\n  // this immediate suspense boundary and gets reset each new\n  // boundary or suspense list.\n\n  var SubtreeSuspenseContextMask = 1; // Subtree Flags:\n  // InvisibleParentSuspenseContext indicates that one of our parent Suspense\n  // boundaries is not currently showing visible main content.\n  // Either because it is already showing a fallback or is not mounted at all.\n  // We can use this to determine if it is desirable to trigger a fallback at\n  // the parent. If not, then we might need to trigger undesirable boundaries\n  // and/or suspend the commit to avoid hiding the parent content.\n\n  var InvisibleParentSuspenseContext = 1; // Shallow Flags:\n  // ForceSuspenseFallback can be used by SuspenseList to force newly added\n  // items into their fallback state during one of the render passes.\n\n  var ForceSuspenseFallback = 2;\n  var suspenseStackCursor = createCursor(DefaultSuspenseContext);\n  function hasSuspenseContext(parentContext, flag) {\n    return (parentContext & flag) !== 0;\n  }\n  function setDefaultShallowSuspenseContext(parentContext) {\n    return parentContext & SubtreeSuspenseContextMask;\n  }\n  function setShallowSuspenseContext(parentContext, shallowContext) {\n    return parentContext & SubtreeSuspenseContextMask | shallowContext;\n  }\n  function addSubtreeSuspenseContext(parentContext, subtreeContext) {\n    return parentContext | subtreeContext;\n  }\n  function pushSuspenseContext(fiber, newContext) {\n    push(suspenseStackCursor, newContext, fiber);\n  }\n  function popSuspenseContext(fiber) {\n    pop(suspenseStackCursor, fiber);\n  }\n\n  function shouldCaptureSuspense(workInProgress, hasInvisibleParent) {\n    // If it was the primary children that just suspended, capture and render the\n    // fallback. Otherwise, don't capture and bubble to the next boundary.\n    var nextState = workInProgress.memoizedState;\n\n    if (nextState !== null) {\n      if (nextState.dehydrated !== null) {\n        // A dehydrated boundary always captures.\n        return true;\n      }\n\n      return false;\n    }\n\n    var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop.\n\n    if (props.fallback === undefined) {\n      return false;\n    } // Regular boundaries always capture.\n\n\n    if (props.unstable_avoidThisFallback !== true) {\n      return true;\n    } // If it's a boundary we should avoid, then we prefer to bubble up to the\n    // parent boundary if it is currently invisible.\n\n\n    if (hasInvisibleParent) {\n      return false;\n    } // If the parent is not able to handle it, we must handle it.\n\n\n    return true;\n  }\n  function findFirstSuspended(row) {\n    var node = row;\n\n    while (node !== null) {\n      if (node.tag === SuspenseComponent) {\n        var state = node.memoizedState;\n\n        if (state !== null) {\n          var dehydrated = state.dehydrated;\n\n          if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {\n            return node;\n          }\n        }\n      } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't\n      // keep track of whether it suspended or not.\n      node.memoizedProps.revealOrder !== undefined) {\n        var didSuspend = (node.effectTag & DidCapture) !== NoEffect;\n\n        if (didSuspend) {\n          return node;\n        }\n      } else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === row) {\n        return null;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === row) {\n          return null;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n\n    return null;\n  }\n\n  function createDeprecatedResponderListener(responder, props) {\n    var eventResponderListener = {\n      responder: responder,\n      props: props\n    };\n\n    {\n      Object.freeze(eventResponderListener);\n    }\n\n    return eventResponderListener;\n  }\n\n  var HasEffect =\n  /* */\n  1; // Represents the phase in which the effect (not the clean-up) fires.\n\n  var Layout =\n  /*    */\n  2;\n  var Passive$1 =\n  /*   */\n  4;\n\n  var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher,\n      ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;\n  var didWarnAboutMismatchedHooksForComponent;\n\n  {\n    didWarnAboutMismatchedHooksForComponent = new Set();\n  }\n\n  // These are set right before calling the component.\n  var renderExpirationTime = NoWork; // The work-in-progress fiber. I've named it differently to distinguish it from\n  // the work-in-progress hook.\n\n  var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The\n  // current hook list is the list that belongs to the current fiber. The\n  // work-in-progress hook list is a new list that will be added to the\n  // work-in-progress fiber.\n\n  var currentHook = null;\n  var workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This\n  // does not get reset if we do another render pass; only when we're completely\n  // finished evaluating this component. This is an optimization so we know\n  // whether we need to clear render phase updates after a throw.\n\n  var didScheduleRenderPhaseUpdate = false;\n  var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook\n\n  var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.\n  // The list stores the order of hooks used during the initial render (mount).\n  // Subsequent renders (updates) reference this list.\n\n  var hookTypesDev = null;\n  var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore\n  // the dependencies for Hooks that need them (e.g. useEffect or useMemo).\n  // When true, such Hooks will always be \"remounted\". Only used during hot reload.\n\n  var ignorePreviousDependencies = false;\n\n  function mountHookTypesDev() {\n    {\n      var hookName = currentHookNameInDev;\n\n      if (hookTypesDev === null) {\n        hookTypesDev = [hookName];\n      } else {\n        hookTypesDev.push(hookName);\n      }\n    }\n  }\n\n  function updateHookTypesDev() {\n    {\n      var hookName = currentHookNameInDev;\n\n      if (hookTypesDev !== null) {\n        hookTypesUpdateIndexDev++;\n\n        if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {\n          warnOnHookMismatchInDev(hookName);\n        }\n      }\n    }\n  }\n\n  function checkDepsAreArrayDev(deps) {\n    {\n      if (deps !== undefined && deps !== null && !Array.isArray(deps)) {\n        // Verify deps, but only on mount to avoid extra checks.\n        // It's unlikely their type would change as usually you define them inline.\n        error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps);\n      }\n    }\n  }\n\n  function warnOnHookMismatchInDev(currentHookName) {\n    {\n      var componentName = getComponentName(currentlyRenderingFiber$1.type);\n\n      if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {\n        didWarnAboutMismatchedHooksForComponent.add(componentName);\n\n        if (hookTypesDev !== null) {\n          var table = '';\n          var secondColumnStart = 30;\n\n          for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {\n            var oldHookName = hookTypesDev[i];\n            var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;\n            var row = i + 1 + \". \" + oldHookName; // Extra space so second column lines up\n            // lol @ IE not supporting String#repeat\n\n            while (row.length < secondColumnStart) {\n              row += ' ';\n            }\n\n            row += newHookName + '\\n';\n            table += row;\n          }\n\n          error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://fb.me/rules-of-hooks\\n\\n' + '   Previous render            Next render\\n' + '   ------------------------------------------------------\\n' + '%s' + '   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\n', componentName, table);\n        }\n      }\n    }\n  }\n\n  function throwInvalidHookError() {\n    {\n      {\n        throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n      }\n    }\n  }\n\n  function areHookInputsEqual(nextDeps, prevDeps) {\n    {\n      if (ignorePreviousDependencies) {\n        // Only true when this component is being hot reloaded.\n        return false;\n      }\n    }\n\n    if (prevDeps === null) {\n      {\n        error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev);\n      }\n\n      return false;\n    }\n\n    {\n      // Don't bother comparing lengths in prod because these arrays should be\n      // passed inline.\n      if (nextDeps.length !== prevDeps.length) {\n        error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\\n\\n' + 'Previous: %s\\n' + 'Incoming: %s', currentHookNameInDev, \"[\" + prevDeps.join(', ') + \"]\", \"[\" + nextDeps.join(', ') + \"]\");\n      }\n    }\n\n    for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {\n      if (objectIs(nextDeps[i], prevDeps[i])) {\n        continue;\n      }\n\n      return false;\n    }\n\n    return true;\n  }\n\n  function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderExpirationTime) {\n    renderExpirationTime = nextRenderExpirationTime;\n    currentlyRenderingFiber$1 = workInProgress;\n\n    {\n      hookTypesDev = current !== null ? current._debugHookTypes : null;\n      hookTypesUpdateIndexDev = -1; // Used for hot reloading:\n\n      ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;\n    }\n\n    workInProgress.memoizedState = null;\n    workInProgress.updateQueue = null;\n    workInProgress.expirationTime = NoWork; // The following should have already been reset\n    // currentHook = null;\n    // workInProgressHook = null;\n    // didScheduleRenderPhaseUpdate = false;\n    // TODO Warn if no hooks are used at all during mount, then some are used during update.\n    // Currently we will identify the update render as a mount because memoizedState === null.\n    // This is tricky because it's valid for certain types of components (e.g. React.lazy)\n    // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used.\n    // Non-stateful hooks (e.g. context) don't get added to memoizedState,\n    // so memoizedState would be null during updates and mounts.\n\n    {\n      if (current !== null && current.memoizedState !== null) {\n        ReactCurrentDispatcher.current = HooksDispatcherOnUpdateInDEV;\n      } else if (hookTypesDev !== null) {\n        // This dispatcher handles an edge case where a component is updating,\n        // but no stateful hooks have been used.\n        // We want to match the production code behavior (which will use HooksDispatcherOnMount),\n        // but with the extra DEV validation to ensure hooks ordering hasn't changed.\n        // This dispatcher does that.\n        ReactCurrentDispatcher.current = HooksDispatcherOnMountWithHookTypesInDEV;\n      } else {\n        ReactCurrentDispatcher.current = HooksDispatcherOnMountInDEV;\n      }\n    }\n\n    var children = Component(props, secondArg); // Check if there was a render phase update\n\n    if (workInProgress.expirationTime === renderExpirationTime) {\n      // Keep rendering in a loop for as long as render phase updates continue to\n      // be scheduled. Use a counter to prevent infinite loops.\n      var numberOfReRenders = 0;\n\n      do {\n        workInProgress.expirationTime = NoWork;\n\n        if (!(numberOfReRenders < RE_RENDER_LIMIT)) {\n          {\n            throw Error( \"Too many re-renders. React limits the number of renders to prevent an infinite loop.\" );\n          }\n        }\n\n        numberOfReRenders += 1;\n\n        {\n          // Even when hot reloading, allow dependencies to stabilize\n          // after first render to prevent infinite render phase updates.\n          ignorePreviousDependencies = false;\n        } // Start over from the beginning of the list\n\n\n        currentHook = null;\n        workInProgressHook = null;\n        workInProgress.updateQueue = null;\n\n        {\n          // Also validate hook order for cascading updates.\n          hookTypesUpdateIndexDev = -1;\n        }\n\n        ReactCurrentDispatcher.current =  HooksDispatcherOnRerenderInDEV ;\n        children = Component(props, secondArg);\n      } while (workInProgress.expirationTime === renderExpirationTime);\n    } // We can assume the previous dispatcher is always this one, since we set it\n    // at the beginning of the render phase and there's no re-entrancy.\n\n\n    ReactCurrentDispatcher.current = ContextOnlyDispatcher;\n\n    {\n      workInProgress._debugHookTypes = hookTypesDev;\n    } // This check uses currentHook so that it works the same in DEV and prod bundles.\n    // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.\n\n\n    var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;\n    renderExpirationTime = NoWork;\n    currentlyRenderingFiber$1 = null;\n    currentHook = null;\n    workInProgressHook = null;\n\n    {\n      currentHookNameInDev = null;\n      hookTypesDev = null;\n      hookTypesUpdateIndexDev = -1;\n    }\n\n    didScheduleRenderPhaseUpdate = false;\n\n    if (!!didRenderTooFewHooks) {\n      {\n        throw Error( \"Rendered fewer hooks than expected. This may be caused by an accidental early return statement.\" );\n      }\n    }\n\n    return children;\n  }\n  function bailoutHooks(current, workInProgress, expirationTime) {\n    workInProgress.updateQueue = current.updateQueue;\n    workInProgress.effectTag &= ~(Passive | Update);\n\n    if (current.expirationTime <= expirationTime) {\n      current.expirationTime = NoWork;\n    }\n  }\n  function resetHooksAfterThrow() {\n    // We can assume the previous dispatcher is always this one, since we set it\n    // at the beginning of the render phase and there's no re-entrancy.\n    ReactCurrentDispatcher.current = ContextOnlyDispatcher;\n\n    if (didScheduleRenderPhaseUpdate) {\n      // There were render phase updates. These are only valid for this render\n      // phase, which we are now aborting. Remove the updates from the queues so\n      // they do not persist to the next render. Do not remove updates from hooks\n      // that weren't processed.\n      //\n      // Only reset the updates from the queue if it has a clone. If it does\n      // not have a clone, that means it wasn't processed, and the updates were\n      // scheduled before we entered the render phase.\n      var hook = currentlyRenderingFiber$1.memoizedState;\n\n      while (hook !== null) {\n        var queue = hook.queue;\n\n        if (queue !== null) {\n          queue.pending = null;\n        }\n\n        hook = hook.next;\n      }\n    }\n\n    renderExpirationTime = NoWork;\n    currentlyRenderingFiber$1 = null;\n    currentHook = null;\n    workInProgressHook = null;\n\n    {\n      hookTypesDev = null;\n      hookTypesUpdateIndexDev = -1;\n      currentHookNameInDev = null;\n    }\n\n    didScheduleRenderPhaseUpdate = false;\n  }\n\n  function mountWorkInProgressHook() {\n    var hook = {\n      memoizedState: null,\n      baseState: null,\n      baseQueue: null,\n      queue: null,\n      next: null\n    };\n\n    if (workInProgressHook === null) {\n      // This is the first hook in the list\n      currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;\n    } else {\n      // Append to the end of the list\n      workInProgressHook = workInProgressHook.next = hook;\n    }\n\n    return workInProgressHook;\n  }\n\n  function updateWorkInProgressHook() {\n    // This function is used both for updates and for re-renders triggered by a\n    // render phase update. It assumes there is either a current hook we can\n    // clone, or a work-in-progress hook from a previous render pass that we can\n    // use as a base. When we reach the end of the base list, we must switch to\n    // the dispatcher used for mounts.\n    var nextCurrentHook;\n\n    if (currentHook === null) {\n      var current = currentlyRenderingFiber$1.alternate;\n\n      if (current !== null) {\n        nextCurrentHook = current.memoizedState;\n      } else {\n        nextCurrentHook = null;\n      }\n    } else {\n      nextCurrentHook = currentHook.next;\n    }\n\n    var nextWorkInProgressHook;\n\n    if (workInProgressHook === null) {\n      nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;\n    } else {\n      nextWorkInProgressHook = workInProgressHook.next;\n    }\n\n    if (nextWorkInProgressHook !== null) {\n      // There's already a work-in-progress. Reuse it.\n      workInProgressHook = nextWorkInProgressHook;\n      nextWorkInProgressHook = workInProgressHook.next;\n      currentHook = nextCurrentHook;\n    } else {\n      // Clone from the current hook.\n      if (!(nextCurrentHook !== null)) {\n        {\n          throw Error( \"Rendered more hooks than during the previous render.\" );\n        }\n      }\n\n      currentHook = nextCurrentHook;\n      var newHook = {\n        memoizedState: currentHook.memoizedState,\n        baseState: currentHook.baseState,\n        baseQueue: currentHook.baseQueue,\n        queue: currentHook.queue,\n        next: null\n      };\n\n      if (workInProgressHook === null) {\n        // This is the first hook in the list.\n        currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;\n      } else {\n        // Append to the end of the list.\n        workInProgressHook = workInProgressHook.next = newHook;\n      }\n    }\n\n    return workInProgressHook;\n  }\n\n  function createFunctionComponentUpdateQueue() {\n    return {\n      lastEffect: null\n    };\n  }\n\n  function basicStateReducer(state, action) {\n    // $FlowFixMe: Flow doesn't like mixed types\n    return typeof action === 'function' ? action(state) : action;\n  }\n\n  function mountReducer(reducer, initialArg, init) {\n    var hook = mountWorkInProgressHook();\n    var initialState;\n\n    if (init !== undefined) {\n      initialState = init(initialArg);\n    } else {\n      initialState = initialArg;\n    }\n\n    hook.memoizedState = hook.baseState = initialState;\n    var queue = hook.queue = {\n      pending: null,\n      dispatch: null,\n      lastRenderedReducer: reducer,\n      lastRenderedState: initialState\n    };\n    var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);\n    return [hook.memoizedState, dispatch];\n  }\n\n  function updateReducer(reducer, initialArg, init) {\n    var hook = updateWorkInProgressHook();\n    var queue = hook.queue;\n\n    if (!(queue !== null)) {\n      {\n        throw Error( \"Should have a queue. This is likely a bug in React. Please file an issue.\" );\n      }\n    }\n\n    queue.lastRenderedReducer = reducer;\n    var current = currentHook; // The last rebase update that is NOT part of the base state.\n\n    var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet.\n\n    var pendingQueue = queue.pending;\n\n    if (pendingQueue !== null) {\n      // We have new updates that haven't been processed yet.\n      // We'll add them to the base queue.\n      if (baseQueue !== null) {\n        // Merge the pending queue and the base queue.\n        var baseFirst = baseQueue.next;\n        var pendingFirst = pendingQueue.next;\n        baseQueue.next = pendingFirst;\n        pendingQueue.next = baseFirst;\n      }\n\n      current.baseQueue = baseQueue = pendingQueue;\n      queue.pending = null;\n    }\n\n    if (baseQueue !== null) {\n      // We have a queue to process.\n      var first = baseQueue.next;\n      var newState = current.baseState;\n      var newBaseState = null;\n      var newBaseQueueFirst = null;\n      var newBaseQueueLast = null;\n      var update = first;\n\n      do {\n        var updateExpirationTime = update.expirationTime;\n\n        if (updateExpirationTime < renderExpirationTime) {\n          // Priority is insufficient. Skip this update. If this is the first\n          // skipped update, the previous update/state is the new base\n          // update/state.\n          var clone = {\n            expirationTime: update.expirationTime,\n            suspenseConfig: update.suspenseConfig,\n            action: update.action,\n            eagerReducer: update.eagerReducer,\n            eagerState: update.eagerState,\n            next: null\n          };\n\n          if (newBaseQueueLast === null) {\n            newBaseQueueFirst = newBaseQueueLast = clone;\n            newBaseState = newState;\n          } else {\n            newBaseQueueLast = newBaseQueueLast.next = clone;\n          } // Update the remaining priority in the queue.\n\n\n          if (updateExpirationTime > currentlyRenderingFiber$1.expirationTime) {\n            currentlyRenderingFiber$1.expirationTime = updateExpirationTime;\n            markUnprocessedUpdateTime(updateExpirationTime);\n          }\n        } else {\n          // This update does have sufficient priority.\n          if (newBaseQueueLast !== null) {\n            var _clone = {\n              expirationTime: Sync,\n              // This update is going to be committed so we never want uncommit it.\n              suspenseConfig: update.suspenseConfig,\n              action: update.action,\n              eagerReducer: update.eagerReducer,\n              eagerState: update.eagerState,\n              next: null\n            };\n            newBaseQueueLast = newBaseQueueLast.next = _clone;\n          } // Mark the event time of this update as relevant to this render pass.\n          // TODO: This should ideally use the true event time of this update rather than\n          // its priority which is a derived and not reverseable value.\n          // TODO: We should skip this update if it was already committed but currently\n          // we have no way of detecting the difference between a committed and suspended\n          // update here.\n\n\n          markRenderEventTimeAndConfig(updateExpirationTime, update.suspenseConfig); // Process this update.\n\n          if (update.eagerReducer === reducer) {\n            // If this update was processed eagerly, and its reducer matches the\n            // current reducer, we can use the eagerly computed state.\n            newState = update.eagerState;\n          } else {\n            var action = update.action;\n            newState = reducer(newState, action);\n          }\n        }\n\n        update = update.next;\n      } while (update !== null && update !== first);\n\n      if (newBaseQueueLast === null) {\n        newBaseState = newState;\n      } else {\n        newBaseQueueLast.next = newBaseQueueFirst;\n      } // Mark that the fiber performed work, but only if the new state is\n      // different from the current state.\n\n\n      if (!objectIs(newState, hook.memoizedState)) {\n        markWorkInProgressReceivedUpdate();\n      }\n\n      hook.memoizedState = newState;\n      hook.baseState = newBaseState;\n      hook.baseQueue = newBaseQueueLast;\n      queue.lastRenderedState = newState;\n    }\n\n    var dispatch = queue.dispatch;\n    return [hook.memoizedState, dispatch];\n  }\n\n  function rerenderReducer(reducer, initialArg, init) {\n    var hook = updateWorkInProgressHook();\n    var queue = hook.queue;\n\n    if (!(queue !== null)) {\n      {\n        throw Error( \"Should have a queue. This is likely a bug in React. Please file an issue.\" );\n      }\n    }\n\n    queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous\n    // work-in-progress hook.\n\n    var dispatch = queue.dispatch;\n    var lastRenderPhaseUpdate = queue.pending;\n    var newState = hook.memoizedState;\n\n    if (lastRenderPhaseUpdate !== null) {\n      // The queue doesn't persist past this render pass.\n      queue.pending = null;\n      var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;\n      var update = firstRenderPhaseUpdate;\n\n      do {\n        // Process this render phase update. We don't have to check the\n        // priority because it will always be the same as the current\n        // render's.\n        var action = update.action;\n        newState = reducer(newState, action);\n        update = update.next;\n      } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is\n      // different from the current state.\n\n\n      if (!objectIs(newState, hook.memoizedState)) {\n        markWorkInProgressReceivedUpdate();\n      }\n\n      hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to\n      // the base state unless the queue is empty.\n      // TODO: Not sure if this is the desired semantics, but it's what we\n      // do for gDSFP. I can't remember why.\n\n      if (hook.baseQueue === null) {\n        hook.baseState = newState;\n      }\n\n      queue.lastRenderedState = newState;\n    }\n\n    return [newState, dispatch];\n  }\n\n  function mountState(initialState) {\n    var hook = mountWorkInProgressHook();\n\n    if (typeof initialState === 'function') {\n      // $FlowFixMe: Flow doesn't like mixed types\n      initialState = initialState();\n    }\n\n    hook.memoizedState = hook.baseState = initialState;\n    var queue = hook.queue = {\n      pending: null,\n      dispatch: null,\n      lastRenderedReducer: basicStateReducer,\n      lastRenderedState: initialState\n    };\n    var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue);\n    return [hook.memoizedState, dispatch];\n  }\n\n  function updateState(initialState) {\n    return updateReducer(basicStateReducer);\n  }\n\n  function rerenderState(initialState) {\n    return rerenderReducer(basicStateReducer);\n  }\n\n  function pushEffect(tag, create, destroy, deps) {\n    var effect = {\n      tag: tag,\n      create: create,\n      destroy: destroy,\n      deps: deps,\n      // Circular\n      next: null\n    };\n    var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;\n\n    if (componentUpdateQueue === null) {\n      componentUpdateQueue = createFunctionComponentUpdateQueue();\n      currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;\n      componentUpdateQueue.lastEffect = effect.next = effect;\n    } else {\n      var lastEffect = componentUpdateQueue.lastEffect;\n\n      if (lastEffect === null) {\n        componentUpdateQueue.lastEffect = effect.next = effect;\n      } else {\n        var firstEffect = lastEffect.next;\n        lastEffect.next = effect;\n        effect.next = firstEffect;\n        componentUpdateQueue.lastEffect = effect;\n      }\n    }\n\n    return effect;\n  }\n\n  function mountRef(initialValue) {\n    var hook = mountWorkInProgressHook();\n    var ref = {\n      current: initialValue\n    };\n\n    {\n      Object.seal(ref);\n    }\n\n    hook.memoizedState = ref;\n    return ref;\n  }\n\n  function updateRef(initialValue) {\n    var hook = updateWorkInProgressHook();\n    return hook.memoizedState;\n  }\n\n  function mountEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {\n    var hook = mountWorkInProgressHook();\n    var nextDeps = deps === undefined ? null : deps;\n    currentlyRenderingFiber$1.effectTag |= fiberEffectTag;\n    hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, undefined, nextDeps);\n  }\n\n  function updateEffectImpl(fiberEffectTag, hookEffectTag, create, deps) {\n    var hook = updateWorkInProgressHook();\n    var nextDeps = deps === undefined ? null : deps;\n    var destroy = undefined;\n\n    if (currentHook !== null) {\n      var prevEffect = currentHook.memoizedState;\n      destroy = prevEffect.destroy;\n\n      if (nextDeps !== null) {\n        var prevDeps = prevEffect.deps;\n\n        if (areHookInputsEqual(nextDeps, prevDeps)) {\n          pushEffect(hookEffectTag, create, destroy, nextDeps);\n          return;\n        }\n      }\n    }\n\n    currentlyRenderingFiber$1.effectTag |= fiberEffectTag;\n    hook.memoizedState = pushEffect(HasEffect | hookEffectTag, create, destroy, nextDeps);\n  }\n\n  function mountEffect(create, deps) {\n    {\n      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n      if ('undefined' !== typeof jest) {\n        warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);\n      }\n    }\n\n    return mountEffectImpl(Update | Passive, Passive$1, create, deps);\n  }\n\n  function updateEffect(create, deps) {\n    {\n      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n      if ('undefined' !== typeof jest) {\n        warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1);\n      }\n    }\n\n    return updateEffectImpl(Update | Passive, Passive$1, create, deps);\n  }\n\n  function mountLayoutEffect(create, deps) {\n    return mountEffectImpl(Update, Layout, create, deps);\n  }\n\n  function updateLayoutEffect(create, deps) {\n    return updateEffectImpl(Update, Layout, create, deps);\n  }\n\n  function imperativeHandleEffect(create, ref) {\n    if (typeof ref === 'function') {\n      var refCallback = ref;\n\n      var _inst = create();\n\n      refCallback(_inst);\n      return function () {\n        refCallback(null);\n      };\n    } else if (ref !== null && ref !== undefined) {\n      var refObject = ref;\n\n      {\n        if (!refObject.hasOwnProperty('current')) {\n          error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}');\n        }\n      }\n\n      var _inst2 = create();\n\n      refObject.current = _inst2;\n      return function () {\n        refObject.current = null;\n      };\n    }\n  }\n\n  function mountImperativeHandle(ref, create, deps) {\n    {\n      if (typeof create !== 'function') {\n        error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');\n      }\n    } // TODO: If deps are provided, should we skip comparing the ref itself?\n\n\n    var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;\n    return mountEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);\n  }\n\n  function updateImperativeHandle(ref, create, deps) {\n    {\n      if (typeof create !== 'function') {\n        error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');\n      }\n    } // TODO: If deps are provided, should we skip comparing the ref itself?\n\n\n    var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;\n    return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);\n  }\n\n  function mountDebugValue(value, formatterFn) {// This hook is normally a no-op.\n    // The react-debug-hooks package injects its own implementation\n    // so that e.g. DevTools can display custom hook values.\n  }\n\n  var updateDebugValue = mountDebugValue;\n\n  function mountCallback(callback, deps) {\n    var hook = mountWorkInProgressHook();\n    var nextDeps = deps === undefined ? null : deps;\n    hook.memoizedState = [callback, nextDeps];\n    return callback;\n  }\n\n  function updateCallback(callback, deps) {\n    var hook = updateWorkInProgressHook();\n    var nextDeps = deps === undefined ? null : deps;\n    var prevState = hook.memoizedState;\n\n    if (prevState !== null) {\n      if (nextDeps !== null) {\n        var prevDeps = prevState[1];\n\n        if (areHookInputsEqual(nextDeps, prevDeps)) {\n          return prevState[0];\n        }\n      }\n    }\n\n    hook.memoizedState = [callback, nextDeps];\n    return callback;\n  }\n\n  function mountMemo(nextCreate, deps) {\n    var hook = mountWorkInProgressHook();\n    var nextDeps = deps === undefined ? null : deps;\n    var nextValue = nextCreate();\n    hook.memoizedState = [nextValue, nextDeps];\n    return nextValue;\n  }\n\n  function updateMemo(nextCreate, deps) {\n    var hook = updateWorkInProgressHook();\n    var nextDeps = deps === undefined ? null : deps;\n    var prevState = hook.memoizedState;\n\n    if (prevState !== null) {\n      // Assume these are defined. If they're not, areHookInputsEqual will warn.\n      if (nextDeps !== null) {\n        var prevDeps = prevState[1];\n\n        if (areHookInputsEqual(nextDeps, prevDeps)) {\n          return prevState[0];\n        }\n      }\n    }\n\n    var nextValue = nextCreate();\n    hook.memoizedState = [nextValue, nextDeps];\n    return nextValue;\n  }\n\n  function mountDeferredValue(value, config) {\n    var _mountState = mountState(value),\n        prevValue = _mountState[0],\n        setValue = _mountState[1];\n\n    mountEffect(function () {\n      var previousConfig = ReactCurrentBatchConfig$1.suspense;\n      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n      try {\n        setValue(value);\n      } finally {\n        ReactCurrentBatchConfig$1.suspense = previousConfig;\n      }\n    }, [value, config]);\n    return prevValue;\n  }\n\n  function updateDeferredValue(value, config) {\n    var _updateState = updateState(),\n        prevValue = _updateState[0],\n        setValue = _updateState[1];\n\n    updateEffect(function () {\n      var previousConfig = ReactCurrentBatchConfig$1.suspense;\n      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n      try {\n        setValue(value);\n      } finally {\n        ReactCurrentBatchConfig$1.suspense = previousConfig;\n      }\n    }, [value, config]);\n    return prevValue;\n  }\n\n  function rerenderDeferredValue(value, config) {\n    var _rerenderState = rerenderState(),\n        prevValue = _rerenderState[0],\n        setValue = _rerenderState[1];\n\n    updateEffect(function () {\n      var previousConfig = ReactCurrentBatchConfig$1.suspense;\n      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n      try {\n        setValue(value);\n      } finally {\n        ReactCurrentBatchConfig$1.suspense = previousConfig;\n      }\n    }, [value, config]);\n    return prevValue;\n  }\n\n  function startTransition(setPending, config, callback) {\n    var priorityLevel = getCurrentPriorityLevel();\n    runWithPriority$1(priorityLevel < UserBlockingPriority$1 ? UserBlockingPriority$1 : priorityLevel, function () {\n      setPending(true);\n    });\n    runWithPriority$1(priorityLevel > NormalPriority ? NormalPriority : priorityLevel, function () {\n      var previousConfig = ReactCurrentBatchConfig$1.suspense;\n      ReactCurrentBatchConfig$1.suspense = config === undefined ? null : config;\n\n      try {\n        setPending(false);\n        callback();\n      } finally {\n        ReactCurrentBatchConfig$1.suspense = previousConfig;\n      }\n    });\n  }\n\n  function mountTransition(config) {\n    var _mountState2 = mountState(false),\n        isPending = _mountState2[0],\n        setPending = _mountState2[1];\n\n    var start = mountCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n    return [start, isPending];\n  }\n\n  function updateTransition(config) {\n    var _updateState2 = updateState(),\n        isPending = _updateState2[0],\n        setPending = _updateState2[1];\n\n    var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n    return [start, isPending];\n  }\n\n  function rerenderTransition(config) {\n    var _rerenderState2 = rerenderState(),\n        isPending = _rerenderState2[0],\n        setPending = _rerenderState2[1];\n\n    var start = updateCallback(startTransition.bind(null, setPending, config), [setPending, config]);\n    return [start, isPending];\n  }\n\n  function dispatchAction(fiber, queue, action) {\n    {\n      if (typeof arguments[3] === 'function') {\n        error(\"State updates from the useState() and useReducer() Hooks don't support the \" + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().');\n      }\n    }\n\n    var currentTime = requestCurrentTimeForUpdate();\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, fiber, suspenseConfig);\n    var update = {\n      expirationTime: expirationTime,\n      suspenseConfig: suspenseConfig,\n      action: action,\n      eagerReducer: null,\n      eagerState: null,\n      next: null\n    };\n\n    {\n      update.priority = getCurrentPriorityLevel();\n    } // Append the update to the end of the list.\n\n\n    var pending = queue.pending;\n\n    if (pending === null) {\n      // This is the first update. Create a circular list.\n      update.next = update;\n    } else {\n      update.next = pending.next;\n      pending.next = update;\n    }\n\n    queue.pending = update;\n    var alternate = fiber.alternate;\n\n    if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) {\n      // This is a render phase update. Stash it in a lazily-created map of\n      // queue -> linked list of updates. After this render pass, we'll restart\n      // and apply the stashed updates on top of the work-in-progress hook.\n      didScheduleRenderPhaseUpdate = true;\n      update.expirationTime = renderExpirationTime;\n      currentlyRenderingFiber$1.expirationTime = renderExpirationTime;\n    } else {\n      if (fiber.expirationTime === NoWork && (alternate === null || alternate.expirationTime === NoWork)) {\n        // The queue is currently empty, which means we can eagerly compute the\n        // next state before entering the render phase. If the new state is the\n        // same as the current state, we may be able to bail out entirely.\n        var lastRenderedReducer = queue.lastRenderedReducer;\n\n        if (lastRenderedReducer !== null) {\n          var prevDispatcher;\n\n          {\n            prevDispatcher = ReactCurrentDispatcher.current;\n            ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n          }\n\n          try {\n            var currentState = queue.lastRenderedState;\n            var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute\n            // it, on the update object. If the reducer hasn't changed by the\n            // time we enter the render phase, then the eager state can be used\n            // without calling the reducer again.\n\n            update.eagerReducer = lastRenderedReducer;\n            update.eagerState = eagerState;\n\n            if (objectIs(eagerState, currentState)) {\n              // Fast path. We can bail out without scheduling React to re-render.\n              // It's still possible that we'll need to rebase this update later,\n              // if the component re-renders for a different reason and by that\n              // time the reducer has changed.\n              return;\n            }\n          } catch (error) {// Suppress the error. It will throw again in the render phase.\n          } finally {\n            {\n              ReactCurrentDispatcher.current = prevDispatcher;\n            }\n          }\n        }\n      }\n\n      {\n        // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n        if ('undefined' !== typeof jest) {\n          warnIfNotScopedWithMatchingAct(fiber);\n          warnIfNotCurrentlyActingUpdatesInDev(fiber);\n        }\n      }\n\n      scheduleWork(fiber, expirationTime);\n    }\n  }\n\n  var ContextOnlyDispatcher = {\n    readContext: readContext,\n    useCallback: throwInvalidHookError,\n    useContext: throwInvalidHookError,\n    useEffect: throwInvalidHookError,\n    useImperativeHandle: throwInvalidHookError,\n    useLayoutEffect: throwInvalidHookError,\n    useMemo: throwInvalidHookError,\n    useReducer: throwInvalidHookError,\n    useRef: throwInvalidHookError,\n    useState: throwInvalidHookError,\n    useDebugValue: throwInvalidHookError,\n    useResponder: throwInvalidHookError,\n    useDeferredValue: throwInvalidHookError,\n    useTransition: throwInvalidHookError\n  };\n  var HooksDispatcherOnMountInDEV = null;\n  var HooksDispatcherOnMountWithHookTypesInDEV = null;\n  var HooksDispatcherOnUpdateInDEV = null;\n  var HooksDispatcherOnRerenderInDEV = null;\n  var InvalidNestedHooksDispatcherOnMountInDEV = null;\n  var InvalidNestedHooksDispatcherOnUpdateInDEV = null;\n  var InvalidNestedHooksDispatcherOnRerenderInDEV = null;\n\n  {\n    var warnInvalidContextAccess = function () {\n      error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().');\n    };\n\n    var warnInvalidHookAccess = function () {\n      error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://fb.me/rules-of-hooks');\n    };\n\n    HooksDispatcherOnMountInDEV = {\n      readContext: function (context, observedBits) {\n        return readContext(context, observedBits);\n      },\n      useCallback: function (callback, deps) {\n        currentHookNameInDev = 'useCallback';\n        mountHookTypesDev();\n        checkDepsAreArrayDev(deps);\n        return mountCallback(callback, deps);\n      },\n      useContext: function (context, observedBits) {\n        currentHookNameInDev = 'useContext';\n        mountHookTypesDev();\n        return readContext(context, observedBits);\n      },\n      useEffect: function (create, deps) {\n        currentHookNameInDev = 'useEffect';\n        mountHookTypesDev();\n        checkDepsAreArrayDev(deps);\n        return mountEffect(create, deps);\n      },\n      useImperativeHandle: function (ref, create, deps) {\n        currentHookNameInDev = 'useImperativeHandle';\n        mountHookTypesDev();\n        checkDepsAreArrayDev(deps);\n        return mountImperativeHandle(ref, create, deps);\n      },\n      useLayoutEffect: function (create, deps) {\n        currentHookNameInDev = 'useLayoutEffect';\n        mountHookTypesDev();\n        checkDepsAreArrayDev(deps);\n        return mountLayoutEffect(create, deps);\n      },\n      useMemo: function (create, deps) {\n        currentHookNameInDev = 'useMemo';\n        mountHookTypesDev();\n        checkDepsAreArrayDev(deps);\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountMemo(create, deps);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useReducer: function (reducer, initialArg, init) {\n        currentHookNameInDev = 'useReducer';\n        mountHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountReducer(reducer, initialArg, init);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useRef: function (initialValue) {\n        currentHookNameInDev = 'useRef';\n        mountHookTypesDev();\n        return mountRef(initialValue);\n      },\n      useState: function (initialState) {\n        currentHookNameInDev = 'useState';\n        mountHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountState(initialState);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useDebugValue: function (value, formatterFn) {\n        currentHookNameInDev = 'useDebugValue';\n        mountHookTypesDev();\n        return mountDebugValue();\n      },\n      useResponder: function (responder, props) {\n        currentHookNameInDev = 'useResponder';\n        mountHookTypesDev();\n        return createDeprecatedResponderListener(responder, props);\n      },\n      useDeferredValue: function (value, config) {\n        currentHookNameInDev = 'useDeferredValue';\n        mountHookTypesDev();\n        return mountDeferredValue(value, config);\n      },\n      useTransition: function (config) {\n        currentHookNameInDev = 'useTransition';\n        mountHookTypesDev();\n        return mountTransition(config);\n      }\n    };\n    HooksDispatcherOnMountWithHookTypesInDEV = {\n      readContext: function (context, observedBits) {\n        return readContext(context, observedBits);\n      },\n      useCallback: function (callback, deps) {\n        currentHookNameInDev = 'useCallback';\n        updateHookTypesDev();\n        return mountCallback(callback, deps);\n      },\n      useContext: function (context, observedBits) {\n        currentHookNameInDev = 'useContext';\n        updateHookTypesDev();\n        return readContext(context, observedBits);\n      },\n      useEffect: function (create, deps) {\n        currentHookNameInDev = 'useEffect';\n        updateHookTypesDev();\n        return mountEffect(create, deps);\n      },\n      useImperativeHandle: function (ref, create, deps) {\n        currentHookNameInDev = 'useImperativeHandle';\n        updateHookTypesDev();\n        return mountImperativeHandle(ref, create, deps);\n      },\n      useLayoutEffect: function (create, deps) {\n        currentHookNameInDev = 'useLayoutEffect';\n        updateHookTypesDev();\n        return mountLayoutEffect(create, deps);\n      },\n      useMemo: function (create, deps) {\n        currentHookNameInDev = 'useMemo';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountMemo(create, deps);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useReducer: function (reducer, initialArg, init) {\n        currentHookNameInDev = 'useReducer';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountReducer(reducer, initialArg, init);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useRef: function (initialValue) {\n        currentHookNameInDev = 'useRef';\n        updateHookTypesDev();\n        return mountRef(initialValue);\n      },\n      useState: function (initialState) {\n        currentHookNameInDev = 'useState';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountState(initialState);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useDebugValue: function (value, formatterFn) {\n        currentHookNameInDev = 'useDebugValue';\n        updateHookTypesDev();\n        return mountDebugValue();\n      },\n      useResponder: function (responder, props) {\n        currentHookNameInDev = 'useResponder';\n        updateHookTypesDev();\n        return createDeprecatedResponderListener(responder, props);\n      },\n      useDeferredValue: function (value, config) {\n        currentHookNameInDev = 'useDeferredValue';\n        updateHookTypesDev();\n        return mountDeferredValue(value, config);\n      },\n      useTransition: function (config) {\n        currentHookNameInDev = 'useTransition';\n        updateHookTypesDev();\n        return mountTransition(config);\n      }\n    };\n    HooksDispatcherOnUpdateInDEV = {\n      readContext: function (context, observedBits) {\n        return readContext(context, observedBits);\n      },\n      useCallback: function (callback, deps) {\n        currentHookNameInDev = 'useCallback';\n        updateHookTypesDev();\n        return updateCallback(callback, deps);\n      },\n      useContext: function (context, observedBits) {\n        currentHookNameInDev = 'useContext';\n        updateHookTypesDev();\n        return readContext(context, observedBits);\n      },\n      useEffect: function (create, deps) {\n        currentHookNameInDev = 'useEffect';\n        updateHookTypesDev();\n        return updateEffect(create, deps);\n      },\n      useImperativeHandle: function (ref, create, deps) {\n        currentHookNameInDev = 'useImperativeHandle';\n        updateHookTypesDev();\n        return updateImperativeHandle(ref, create, deps);\n      },\n      useLayoutEffect: function (create, deps) {\n        currentHookNameInDev = 'useLayoutEffect';\n        updateHookTypesDev();\n        return updateLayoutEffect(create, deps);\n      },\n      useMemo: function (create, deps) {\n        currentHookNameInDev = 'useMemo';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return updateMemo(create, deps);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useReducer: function (reducer, initialArg, init) {\n        currentHookNameInDev = 'useReducer';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return updateReducer(reducer, initialArg, init);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useRef: function (initialValue) {\n        currentHookNameInDev = 'useRef';\n        updateHookTypesDev();\n        return updateRef();\n      },\n      useState: function (initialState) {\n        currentHookNameInDev = 'useState';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return updateState(initialState);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useDebugValue: function (value, formatterFn) {\n        currentHookNameInDev = 'useDebugValue';\n        updateHookTypesDev();\n        return updateDebugValue();\n      },\n      useResponder: function (responder, props) {\n        currentHookNameInDev = 'useResponder';\n        updateHookTypesDev();\n        return createDeprecatedResponderListener(responder, props);\n      },\n      useDeferredValue: function (value, config) {\n        currentHookNameInDev = 'useDeferredValue';\n        updateHookTypesDev();\n        return updateDeferredValue(value, config);\n      },\n      useTransition: function (config) {\n        currentHookNameInDev = 'useTransition';\n        updateHookTypesDev();\n        return updateTransition(config);\n      }\n    };\n    HooksDispatcherOnRerenderInDEV = {\n      readContext: function (context, observedBits) {\n        return readContext(context, observedBits);\n      },\n      useCallback: function (callback, deps) {\n        currentHookNameInDev = 'useCallback';\n        updateHookTypesDev();\n        return updateCallback(callback, deps);\n      },\n      useContext: function (context, observedBits) {\n        currentHookNameInDev = 'useContext';\n        updateHookTypesDev();\n        return readContext(context, observedBits);\n      },\n      useEffect: function (create, deps) {\n        currentHookNameInDev = 'useEffect';\n        updateHookTypesDev();\n        return updateEffect(create, deps);\n      },\n      useImperativeHandle: function (ref, create, deps) {\n        currentHookNameInDev = 'useImperativeHandle';\n        updateHookTypesDev();\n        return updateImperativeHandle(ref, create, deps);\n      },\n      useLayoutEffect: function (create, deps) {\n        currentHookNameInDev = 'useLayoutEffect';\n        updateHookTypesDev();\n        return updateLayoutEffect(create, deps);\n      },\n      useMemo: function (create, deps) {\n        currentHookNameInDev = 'useMemo';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n        try {\n          return updateMemo(create, deps);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useReducer: function (reducer, initialArg, init) {\n        currentHookNameInDev = 'useReducer';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n        try {\n          return rerenderReducer(reducer, initialArg, init);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useRef: function (initialValue) {\n        currentHookNameInDev = 'useRef';\n        updateHookTypesDev();\n        return updateRef();\n      },\n      useState: function (initialState) {\n        currentHookNameInDev = 'useState';\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnRerenderInDEV;\n\n        try {\n          return rerenderState(initialState);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useDebugValue: function (value, formatterFn) {\n        currentHookNameInDev = 'useDebugValue';\n        updateHookTypesDev();\n        return updateDebugValue();\n      },\n      useResponder: function (responder, props) {\n        currentHookNameInDev = 'useResponder';\n        updateHookTypesDev();\n        return createDeprecatedResponderListener(responder, props);\n      },\n      useDeferredValue: function (value, config) {\n        currentHookNameInDev = 'useDeferredValue';\n        updateHookTypesDev();\n        return rerenderDeferredValue(value, config);\n      },\n      useTransition: function (config) {\n        currentHookNameInDev = 'useTransition';\n        updateHookTypesDev();\n        return rerenderTransition(config);\n      }\n    };\n    InvalidNestedHooksDispatcherOnMountInDEV = {\n      readContext: function (context, observedBits) {\n        warnInvalidContextAccess();\n        return readContext(context, observedBits);\n      },\n      useCallback: function (callback, deps) {\n        currentHookNameInDev = 'useCallback';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return mountCallback(callback, deps);\n      },\n      useContext: function (context, observedBits) {\n        currentHookNameInDev = 'useContext';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return readContext(context, observedBits);\n      },\n      useEffect: function (create, deps) {\n        currentHookNameInDev = 'useEffect';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return mountEffect(create, deps);\n      },\n      useImperativeHandle: function (ref, create, deps) {\n        currentHookNameInDev = 'useImperativeHandle';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return mountImperativeHandle(ref, create, deps);\n      },\n      useLayoutEffect: function (create, deps) {\n        currentHookNameInDev = 'useLayoutEffect';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return mountLayoutEffect(create, deps);\n      },\n      useMemo: function (create, deps) {\n        currentHookNameInDev = 'useMemo';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountMemo(create, deps);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useReducer: function (reducer, initialArg, init) {\n        currentHookNameInDev = 'useReducer';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountReducer(reducer, initialArg, init);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useRef: function (initialValue) {\n        currentHookNameInDev = 'useRef';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return mountRef(initialValue);\n      },\n      useState: function (initialState) {\n        currentHookNameInDev = 'useState';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnMountInDEV;\n\n        try {\n          return mountState(initialState);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useDebugValue: function (value, formatterFn) {\n        currentHookNameInDev = 'useDebugValue';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return mountDebugValue();\n      },\n      useResponder: function (responder, props) {\n        currentHookNameInDev = 'useResponder';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return createDeprecatedResponderListener(responder, props);\n      },\n      useDeferredValue: function (value, config) {\n        currentHookNameInDev = 'useDeferredValue';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return mountDeferredValue(value, config);\n      },\n      useTransition: function (config) {\n        currentHookNameInDev = 'useTransition';\n        warnInvalidHookAccess();\n        mountHookTypesDev();\n        return mountTransition(config);\n      }\n    };\n    InvalidNestedHooksDispatcherOnUpdateInDEV = {\n      readContext: function (context, observedBits) {\n        warnInvalidContextAccess();\n        return readContext(context, observedBits);\n      },\n      useCallback: function (callback, deps) {\n        currentHookNameInDev = 'useCallback';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateCallback(callback, deps);\n      },\n      useContext: function (context, observedBits) {\n        currentHookNameInDev = 'useContext';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return readContext(context, observedBits);\n      },\n      useEffect: function (create, deps) {\n        currentHookNameInDev = 'useEffect';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateEffect(create, deps);\n      },\n      useImperativeHandle: function (ref, create, deps) {\n        currentHookNameInDev = 'useImperativeHandle';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateImperativeHandle(ref, create, deps);\n      },\n      useLayoutEffect: function (create, deps) {\n        currentHookNameInDev = 'useLayoutEffect';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateLayoutEffect(create, deps);\n      },\n      useMemo: function (create, deps) {\n        currentHookNameInDev = 'useMemo';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return updateMemo(create, deps);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useReducer: function (reducer, initialArg, init) {\n        currentHookNameInDev = 'useReducer';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return updateReducer(reducer, initialArg, init);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useRef: function (initialValue) {\n        currentHookNameInDev = 'useRef';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateRef();\n      },\n      useState: function (initialState) {\n        currentHookNameInDev = 'useState';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return updateState(initialState);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useDebugValue: function (value, formatterFn) {\n        currentHookNameInDev = 'useDebugValue';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateDebugValue();\n      },\n      useResponder: function (responder, props) {\n        currentHookNameInDev = 'useResponder';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return createDeprecatedResponderListener(responder, props);\n      },\n      useDeferredValue: function (value, config) {\n        currentHookNameInDev = 'useDeferredValue';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateDeferredValue(value, config);\n      },\n      useTransition: function (config) {\n        currentHookNameInDev = 'useTransition';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateTransition(config);\n      }\n    };\n    InvalidNestedHooksDispatcherOnRerenderInDEV = {\n      readContext: function (context, observedBits) {\n        warnInvalidContextAccess();\n        return readContext(context, observedBits);\n      },\n      useCallback: function (callback, deps) {\n        currentHookNameInDev = 'useCallback';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateCallback(callback, deps);\n      },\n      useContext: function (context, observedBits) {\n        currentHookNameInDev = 'useContext';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return readContext(context, observedBits);\n      },\n      useEffect: function (create, deps) {\n        currentHookNameInDev = 'useEffect';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateEffect(create, deps);\n      },\n      useImperativeHandle: function (ref, create, deps) {\n        currentHookNameInDev = 'useImperativeHandle';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateImperativeHandle(ref, create, deps);\n      },\n      useLayoutEffect: function (create, deps) {\n        currentHookNameInDev = 'useLayoutEffect';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateLayoutEffect(create, deps);\n      },\n      useMemo: function (create, deps) {\n        currentHookNameInDev = 'useMemo';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return updateMemo(create, deps);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useReducer: function (reducer, initialArg, init) {\n        currentHookNameInDev = 'useReducer';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return rerenderReducer(reducer, initialArg, init);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useRef: function (initialValue) {\n        currentHookNameInDev = 'useRef';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateRef();\n      },\n      useState: function (initialState) {\n        currentHookNameInDev = 'useState';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        var prevDispatcher = ReactCurrentDispatcher.current;\n        ReactCurrentDispatcher.current = InvalidNestedHooksDispatcherOnUpdateInDEV;\n\n        try {\n          return rerenderState(initialState);\n        } finally {\n          ReactCurrentDispatcher.current = prevDispatcher;\n        }\n      },\n      useDebugValue: function (value, formatterFn) {\n        currentHookNameInDev = 'useDebugValue';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return updateDebugValue();\n      },\n      useResponder: function (responder, props) {\n        currentHookNameInDev = 'useResponder';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return createDeprecatedResponderListener(responder, props);\n      },\n      useDeferredValue: function (value, config) {\n        currentHookNameInDev = 'useDeferredValue';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return rerenderDeferredValue(value, config);\n      },\n      useTransition: function (config) {\n        currentHookNameInDev = 'useTransition';\n        warnInvalidHookAccess();\n        updateHookTypesDev();\n        return rerenderTransition(config);\n      }\n    };\n  }\n\n  var now$1 = unstable_now;\n  var commitTime = 0;\n  var profilerStartTime = -1;\n\n  function getCommitTime() {\n    return commitTime;\n  }\n\n  function recordCommitTime() {\n\n    commitTime = now$1();\n  }\n\n  function startProfilerTimer(fiber) {\n\n    profilerStartTime = now$1();\n\n    if (fiber.actualStartTime < 0) {\n      fiber.actualStartTime = now$1();\n    }\n  }\n\n  function stopProfilerTimerIfRunning(fiber) {\n\n    profilerStartTime = -1;\n  }\n\n  function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {\n\n    if (profilerStartTime >= 0) {\n      var elapsedTime = now$1() - profilerStartTime;\n      fiber.actualDuration += elapsedTime;\n\n      if (overrideBaseTime) {\n        fiber.selfBaseDuration = elapsedTime;\n      }\n\n      profilerStartTime = -1;\n    }\n  }\n\n  // This may have been an insertion or a hydration.\n\n  var hydrationParentFiber = null;\n  var nextHydratableInstance = null;\n  var isHydrating = false;\n\n  function enterHydrationState(fiber) {\n\n    var parentInstance = fiber.stateNode.containerInfo;\n    nextHydratableInstance = getFirstHydratableChild(parentInstance);\n    hydrationParentFiber = fiber;\n    isHydrating = true;\n    return true;\n  }\n\n  function deleteHydratableInstance(returnFiber, instance) {\n    {\n      switch (returnFiber.tag) {\n        case HostRoot:\n          didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);\n          break;\n\n        case HostComponent:\n          didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);\n          break;\n      }\n    }\n\n    var childToDelete = createFiberFromHostInstanceForDeletion();\n    childToDelete.stateNode = instance;\n    childToDelete.return = returnFiber;\n    childToDelete.effectTag = Deletion; // This might seem like it belongs on progressedFirstDeletion. However,\n    // these children are not part of the reconciliation list of children.\n    // Even if we abort and rereconcile the children, that will try to hydrate\n    // again and the nodes are still in the host tree so these will be\n    // recreated.\n\n    if (returnFiber.lastEffect !== null) {\n      returnFiber.lastEffect.nextEffect = childToDelete;\n      returnFiber.lastEffect = childToDelete;\n    } else {\n      returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n    }\n  }\n\n  function insertNonHydratedInstance(returnFiber, fiber) {\n    fiber.effectTag = fiber.effectTag & ~Hydrating | Placement;\n\n    {\n      switch (returnFiber.tag) {\n        case HostRoot:\n          {\n            var parentContainer = returnFiber.stateNode.containerInfo;\n\n            switch (fiber.tag) {\n              case HostComponent:\n                var type = fiber.type;\n                var props = fiber.pendingProps;\n                didNotFindHydratableContainerInstance(parentContainer, type);\n                break;\n\n              case HostText:\n                var text = fiber.pendingProps;\n                didNotFindHydratableContainerTextInstance(parentContainer, text);\n                break;\n            }\n\n            break;\n          }\n\n        case HostComponent:\n          {\n            var parentType = returnFiber.type;\n            var parentProps = returnFiber.memoizedProps;\n            var parentInstance = returnFiber.stateNode;\n\n            switch (fiber.tag) {\n              case HostComponent:\n                var _type = fiber.type;\n                var _props = fiber.pendingProps;\n                didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type);\n                break;\n\n              case HostText:\n                var _text = fiber.pendingProps;\n                didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);\n                break;\n\n              case SuspenseComponent:\n                didNotFindHydratableSuspenseInstance(parentType, parentProps);\n                break;\n            }\n\n            break;\n          }\n\n        default:\n          return;\n      }\n    }\n  }\n\n  function tryHydrate(fiber, nextInstance) {\n    switch (fiber.tag) {\n      case HostComponent:\n        {\n          var type = fiber.type;\n          var props = fiber.pendingProps;\n          var instance = canHydrateInstance(nextInstance, type);\n\n          if (instance !== null) {\n            fiber.stateNode = instance;\n            return true;\n          }\n\n          return false;\n        }\n\n      case HostText:\n        {\n          var text = fiber.pendingProps;\n          var textInstance = canHydrateTextInstance(nextInstance, text);\n\n          if (textInstance !== null) {\n            fiber.stateNode = textInstance;\n            return true;\n          }\n\n          return false;\n        }\n\n      case SuspenseComponent:\n        {\n\n          return false;\n        }\n\n      default:\n        return false;\n    }\n  }\n\n  function tryToClaimNextHydratableInstance(fiber) {\n    if (!isHydrating) {\n      return;\n    }\n\n    var nextInstance = nextHydratableInstance;\n\n    if (!nextInstance) {\n      // Nothing to hydrate. Make it an insertion.\n      insertNonHydratedInstance(hydrationParentFiber, fiber);\n      isHydrating = false;\n      hydrationParentFiber = fiber;\n      return;\n    }\n\n    var firstAttemptedInstance = nextInstance;\n\n    if (!tryHydrate(fiber, nextInstance)) {\n      // If we can't hydrate this instance let's try the next one.\n      // We use this as a heuristic. It's based on intuition and not data so it\n      // might be flawed or unnecessary.\n      nextInstance = getNextHydratableSibling(firstAttemptedInstance);\n\n      if (!nextInstance || !tryHydrate(fiber, nextInstance)) {\n        // Nothing to hydrate. Make it an insertion.\n        insertNonHydratedInstance(hydrationParentFiber, fiber);\n        isHydrating = false;\n        hydrationParentFiber = fiber;\n        return;\n      } // We matched the next one, we'll now assume that the first one was\n      // superfluous and we'll delete it. Since we can't eagerly delete it\n      // we'll have to schedule a deletion. To do that, this node needs a dummy\n      // fiber associated with it.\n\n\n      deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);\n    }\n\n    hydrationParentFiber = fiber;\n    nextHydratableInstance = getFirstHydratableChild(nextInstance);\n  }\n\n  function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {\n\n    var instance = fiber.stateNode;\n    var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component.\n\n    fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there\n    // is a new ref we mark this as an update.\n\n    if (updatePayload !== null) {\n      return true;\n    }\n\n    return false;\n  }\n\n  function prepareToHydrateHostTextInstance(fiber) {\n\n    var textInstance = fiber.stateNode;\n    var textContent = fiber.memoizedProps;\n    var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);\n\n    {\n      if (shouldUpdate) {\n        // We assume that prepareToHydrateHostTextInstance is called in a context where the\n        // hydration parent is the parent host component of this host text.\n        var returnFiber = hydrationParentFiber;\n\n        if (returnFiber !== null) {\n          switch (returnFiber.tag) {\n            case HostRoot:\n              {\n                var parentContainer = returnFiber.stateNode.containerInfo;\n                didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);\n                break;\n              }\n\n            case HostComponent:\n              {\n                var parentType = returnFiber.type;\n                var parentProps = returnFiber.memoizedProps;\n                var parentInstance = returnFiber.stateNode;\n                didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);\n                break;\n              }\n          }\n        }\n      }\n    }\n\n    return shouldUpdate;\n  }\n\n  function skipPastDehydratedSuspenseInstance(fiber) {\n\n    var suspenseState = fiber.memoizedState;\n    var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;\n\n    if (!suspenseInstance) {\n      {\n        throw Error( \"Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);\n  }\n\n  function popToNextHostParent(fiber) {\n    var parent = fiber.return;\n\n    while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {\n      parent = parent.return;\n    }\n\n    hydrationParentFiber = parent;\n  }\n\n  function popHydrationState(fiber) {\n\n    if (fiber !== hydrationParentFiber) {\n      // We're deeper than the current hydration context, inside an inserted\n      // tree.\n      return false;\n    }\n\n    if (!isHydrating) {\n      // If we're not currently hydrating but we're in a hydration context, then\n      // we were an insertion and now need to pop up reenter hydration of our\n      // siblings.\n      popToNextHostParent(fiber);\n      isHydrating = true;\n      return false;\n    }\n\n    var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now.\n    // We only do this deeper than head and body since they tend to have random\n    // other nodes in them. We also ignore components with pure text content in\n    // side of them.\n    // TODO: Better heuristic.\n\n    if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {\n      var nextInstance = nextHydratableInstance;\n\n      while (nextInstance) {\n        deleteHydratableInstance(fiber, nextInstance);\n        nextInstance = getNextHydratableSibling(nextInstance);\n      }\n    }\n\n    popToNextHostParent(fiber);\n\n    if (fiber.tag === SuspenseComponent) {\n      nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);\n    } else {\n      nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;\n    }\n\n    return true;\n  }\n\n  function resetHydrationState() {\n\n    hydrationParentFiber = null;\n    nextHydratableInstance = null;\n    isHydrating = false;\n  }\n\n  var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;\n  var didReceiveUpdate = false;\n  var didWarnAboutBadClass;\n  var didWarnAboutModulePatternComponent;\n  var didWarnAboutContextTypeOnFunctionComponent;\n  var didWarnAboutGetDerivedStateOnFunctionComponent;\n  var didWarnAboutFunctionRefs;\n  var didWarnAboutReassigningProps;\n  var didWarnAboutRevealOrder;\n  var didWarnAboutTailOptions;\n\n  {\n    didWarnAboutBadClass = {};\n    didWarnAboutModulePatternComponent = {};\n    didWarnAboutContextTypeOnFunctionComponent = {};\n    didWarnAboutGetDerivedStateOnFunctionComponent = {};\n    didWarnAboutFunctionRefs = {};\n    didWarnAboutReassigningProps = false;\n    didWarnAboutRevealOrder = {};\n    didWarnAboutTailOptions = {};\n  }\n\n  function reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime) {\n    if (current === null) {\n      // If this is a fresh new component that hasn't been rendered yet, we\n      // won't update its child set by applying minimal side-effects. Instead,\n      // we will add them all to the child before it gets rendered. That means\n      // we can optimize this reconciliation pass by not tracking side-effects.\n      workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n    } else {\n      // If the current child is the same as the work in progress, it means that\n      // we haven't yet started any work on these children. Therefore, we use\n      // the clone algorithm to create a copy of all the current children.\n      // If we had any progressed work already, that is invalid at this point so\n      // let's throw it out.\n      workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime);\n    }\n  }\n\n  function forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime) {\n    // This function is fork of reconcileChildren. It's used in cases where we\n    // want to reconcile without matching against the existing set. This has the\n    // effect of all current children being unmounted; even if the type and key\n    // are the same, the old child is unmounted and a new child is created.\n    //\n    // To do this, we're going to go through the reconcile algorithm twice. In\n    // the first pass, we schedule a deletion for all the current children by\n    // passing null.\n    workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderExpirationTime); // In the second pass, we mount the new children. The trick here is that we\n    // pass null in place of where we usually pass the current child set. This has\n    // the effect of remounting all children regardless of whether their\n    // identities match.\n\n    workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n  }\n\n  function updateForwardRef(current, workInProgress, Component, nextProps, renderExpirationTime) {\n    // TODO: current can be non-null here even if the component\n    // hasn't yet mounted. This happens after the first render suspends.\n    // We'll need to figure out if this is fine or can cause issues.\n    {\n      if (workInProgress.type !== workInProgress.elementType) {\n        // Lazy component props can't be validated in createElement\n        // because they're only guaranteed to be resolved here.\n        var innerPropTypes = Component.propTypes;\n\n        if (innerPropTypes) {\n          checkPropTypes_1(innerPropTypes, nextProps, // Resolved props\n          'prop', getComponentName(Component), getCurrentFiberStackInDev);\n        }\n      }\n    }\n\n    var render = Component.render;\n    var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent\n\n    var nextChildren;\n    prepareToReadContext(workInProgress, renderExpirationTime);\n\n    {\n      ReactCurrentOwner$1.current = workInProgress;\n      setIsRendering(true);\n      nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);\n\n      if ( workInProgress.mode & StrictMode) {\n        // Only double-render components with Hooks\n        if (workInProgress.memoizedState !== null) {\n          nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderExpirationTime);\n        }\n      }\n\n      setIsRendering(false);\n    }\n\n    if (current !== null && !didReceiveUpdate) {\n      bailoutHooks(current, workInProgress, renderExpirationTime);\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    } // React DevTools reads this flag.\n\n\n    workInProgress.effectTag |= PerformedWork;\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    return workInProgress.child;\n  }\n\n  function updateMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {\n    if (current === null) {\n      var type = Component.type;\n\n      if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.\n      Component.defaultProps === undefined) {\n        var resolvedType = type;\n\n        {\n          resolvedType = resolveFunctionForHotReloading(type);\n        } // If this is a plain function component without default props,\n        // and with only the default shallow comparison, we upgrade it\n        // to a SimpleMemoComponent to allow fast path updates.\n\n\n        workInProgress.tag = SimpleMemoComponent;\n        workInProgress.type = resolvedType;\n\n        {\n          validateFunctionComponentInDev(workInProgress, type);\n        }\n\n        return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, updateExpirationTime, renderExpirationTime);\n      }\n\n      {\n        var innerPropTypes = type.propTypes;\n\n        if (innerPropTypes) {\n          // Inner memo component props aren't currently validated in createElement.\n          // We could move it there, but we'd still need this for lazy code path.\n          checkPropTypes_1(innerPropTypes, nextProps, // Resolved props\n          'prop', getComponentName(type), getCurrentFiberStackInDev);\n        }\n      }\n\n      var child = createFiberFromTypeAndProps(Component.type, null, nextProps, null, workInProgress.mode, renderExpirationTime);\n      child.ref = workInProgress.ref;\n      child.return = workInProgress;\n      workInProgress.child = child;\n      return child;\n    }\n\n    {\n      var _type = Component.type;\n      var _innerPropTypes = _type.propTypes;\n\n      if (_innerPropTypes) {\n        // Inner memo component props aren't currently validated in createElement.\n        // We could move it there, but we'd still need this for lazy code path.\n        checkPropTypes_1(_innerPropTypes, nextProps, // Resolved props\n        'prop', getComponentName(_type), getCurrentFiberStackInDev);\n      }\n    }\n\n    var currentChild = current.child; // This is always exactly one child\n\n    if (updateExpirationTime < renderExpirationTime) {\n      // This will be the props with resolved defaultProps,\n      // unlike current.memoizedProps which will be the unresolved ones.\n      var prevProps = currentChild.memoizedProps; // Default to shallow comparison\n\n      var compare = Component.compare;\n      compare = compare !== null ? compare : shallowEqual;\n\n      if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) {\n        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n      }\n    } // React DevTools reads this flag.\n\n\n    workInProgress.effectTag |= PerformedWork;\n    var newChild = createWorkInProgress(currentChild, nextProps);\n    newChild.ref = workInProgress.ref;\n    newChild.return = workInProgress;\n    workInProgress.child = newChild;\n    return newChild;\n  }\n\n  function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, updateExpirationTime, renderExpirationTime) {\n    // TODO: current can be non-null here even if the component\n    // hasn't yet mounted. This happens when the inner render suspends.\n    // We'll need to figure out if this is fine or can cause issues.\n    {\n      if (workInProgress.type !== workInProgress.elementType) {\n        // Lazy component props can't be validated in createElement\n        // because they're only guaranteed to be resolved here.\n        var outerMemoType = workInProgress.elementType;\n\n        if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {\n          // We warn when you define propTypes on lazy()\n          // so let's just skip over it to find memo() outer wrapper.\n          // Inner props for memo are validated later.\n          outerMemoType = refineResolvedLazyComponent(outerMemoType);\n        }\n\n        var outerPropTypes = outerMemoType && outerMemoType.propTypes;\n\n        if (outerPropTypes) {\n          checkPropTypes_1(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)\n          'prop', getComponentName(outerMemoType), getCurrentFiberStackInDev);\n        } // Inner propTypes will be validated in the function component path.\n\n      }\n    }\n\n    if (current !== null) {\n      var prevProps = current.memoizedProps;\n\n      if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload.\n       workInProgress.type === current.type )) {\n        didReceiveUpdate = false;\n\n        if (updateExpirationTime < renderExpirationTime) {\n          // The pending update priority was cleared at the beginning of\n          // beginWork. We're about to bail out, but there might be additional\n          // updates at a lower priority. Usually, the priority level of the\n          // remaining updates is accumlated during the evaluation of the\n          // component (i.e. when processing the update queue). But since since\n          // we're bailing out early *without* evaluating the component, we need\n          // to account for it here, too. Reset to the value of the current fiber.\n          // NOTE: This only applies to SimpleMemoComponent, not MemoComponent,\n          // because a MemoComponent fiber does not have hooks or an update queue;\n          // rather, it wraps around an inner component, which may or may not\n          // contains hooks.\n          // TODO: Move the reset at in beginWork out of the common path so that\n          // this is no longer necessary.\n          workInProgress.expirationTime = current.expirationTime;\n          return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n        }\n      }\n    }\n\n    return updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime);\n  }\n\n  function updateFragment(current, workInProgress, renderExpirationTime) {\n    var nextChildren = workInProgress.pendingProps;\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    return workInProgress.child;\n  }\n\n  function updateMode(current, workInProgress, renderExpirationTime) {\n    var nextChildren = workInProgress.pendingProps.children;\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    return workInProgress.child;\n  }\n\n  function updateProfiler(current, workInProgress, renderExpirationTime) {\n    {\n      workInProgress.effectTag |= Update;\n    }\n\n    var nextProps = workInProgress.pendingProps;\n    var nextChildren = nextProps.children;\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    return workInProgress.child;\n  }\n\n  function markRef(current, workInProgress) {\n    var ref = workInProgress.ref;\n\n    if (current === null && ref !== null || current !== null && current.ref !== ref) {\n      // Schedule a Ref effect\n      workInProgress.effectTag |= Ref;\n    }\n  }\n\n  function updateFunctionComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {\n    {\n      if (workInProgress.type !== workInProgress.elementType) {\n        // Lazy component props can't be validated in createElement\n        // because they're only guaranteed to be resolved here.\n        var innerPropTypes = Component.propTypes;\n\n        if (innerPropTypes) {\n          checkPropTypes_1(innerPropTypes, nextProps, // Resolved props\n          'prop', getComponentName(Component), getCurrentFiberStackInDev);\n        }\n      }\n    }\n\n    var context;\n\n    {\n      var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);\n      context = getMaskedContext(workInProgress, unmaskedContext);\n    }\n\n    var nextChildren;\n    prepareToReadContext(workInProgress, renderExpirationTime);\n\n    {\n      ReactCurrentOwner$1.current = workInProgress;\n      setIsRendering(true);\n      nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);\n\n      if ( workInProgress.mode & StrictMode) {\n        // Only double-render components with Hooks\n        if (workInProgress.memoizedState !== null) {\n          nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderExpirationTime);\n        }\n      }\n\n      setIsRendering(false);\n    }\n\n    if (current !== null && !didReceiveUpdate) {\n      bailoutHooks(current, workInProgress, renderExpirationTime);\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    } // React DevTools reads this flag.\n\n\n    workInProgress.effectTag |= PerformedWork;\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    return workInProgress.child;\n  }\n\n  function updateClassComponent(current, workInProgress, Component, nextProps, renderExpirationTime) {\n    {\n      if (workInProgress.type !== workInProgress.elementType) {\n        // Lazy component props can't be validated in createElement\n        // because they're only guaranteed to be resolved here.\n        var innerPropTypes = Component.propTypes;\n\n        if (innerPropTypes) {\n          checkPropTypes_1(innerPropTypes, nextProps, // Resolved props\n          'prop', getComponentName(Component), getCurrentFiberStackInDev);\n        }\n      }\n    } // Push context providers early to prevent context stack mismatches.\n    // During mounting we don't know the child context yet as the instance doesn't exist.\n    // We will invalidate the child context in finishClassComponent() right after rendering.\n\n\n    var hasContext;\n\n    if (isContextProvider(Component)) {\n      hasContext = true;\n      pushContextProvider(workInProgress);\n    } else {\n      hasContext = false;\n    }\n\n    prepareToReadContext(workInProgress, renderExpirationTime);\n    var instance = workInProgress.stateNode;\n    var shouldUpdate;\n\n    if (instance === null) {\n      if (current !== null) {\n        // A class component without an instance only mounts if it suspended\n        // inside a non-concurrent tree, in an inconsistent state. We want to\n        // treat it like a new mount, even though an empty version of it already\n        // committed. Disconnect the alternate pointers.\n        current.alternate = null;\n        workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n        workInProgress.effectTag |= Placement;\n      } // In the initial pass we might need to construct the instance.\n\n\n      constructClassInstance(workInProgress, Component, nextProps);\n      mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n      shouldUpdate = true;\n    } else if (current === null) {\n      // In a resume, we'll already have an instance we can reuse.\n      shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n    } else {\n      shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderExpirationTime);\n    }\n\n    var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime);\n\n    {\n      var inst = workInProgress.stateNode;\n\n      if (inst.props !== nextProps) {\n        if (!didWarnAboutReassigningProps) {\n          error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component');\n        }\n\n        didWarnAboutReassigningProps = true;\n      }\n    }\n\n    return nextUnitOfWork;\n  }\n\n  function finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderExpirationTime) {\n    // Refs should update even if shouldComponentUpdate returns false\n    markRef(current, workInProgress);\n    var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;\n\n    if (!shouldUpdate && !didCaptureError) {\n      // Context providers should defer to sCU for rendering\n      if (hasContext) {\n        invalidateContextProvider(workInProgress, Component, false);\n      }\n\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    }\n\n    var instance = workInProgress.stateNode; // Rerender\n\n    ReactCurrentOwner$1.current = workInProgress;\n    var nextChildren;\n\n    if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {\n      // If we captured an error, but getDerivedStateFromError is not defined,\n      // unmount all the children. componentDidCatch will schedule an update to\n      // re-render a fallback. This is temporary until we migrate everyone to\n      // the new API.\n      // TODO: Warn in a future release.\n      nextChildren = null;\n\n      {\n        stopProfilerTimerIfRunning();\n      }\n    } else {\n      {\n        setIsRendering(true);\n        nextChildren = instance.render();\n\n        if ( workInProgress.mode & StrictMode) {\n          instance.render();\n        }\n\n        setIsRendering(false);\n      }\n    } // React DevTools reads this flag.\n\n\n    workInProgress.effectTag |= PerformedWork;\n\n    if (current !== null && didCaptureError) {\n      // If we're recovering from an error, reconcile without reusing any of\n      // the existing children. Conceptually, the normal children and the children\n      // that are shown on error are two different sets, so we shouldn't reuse\n      // normal children even if their identities match.\n      forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderExpirationTime);\n    } else {\n      reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    } // Memoize state using the values we just used to render.\n    // TODO: Restructure so we never read values from the instance.\n\n\n    workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.\n\n    if (hasContext) {\n      invalidateContextProvider(workInProgress, Component, true);\n    }\n\n    return workInProgress.child;\n  }\n\n  function pushHostRootContext(workInProgress) {\n    var root = workInProgress.stateNode;\n\n    if (root.pendingContext) {\n      pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);\n    } else if (root.context) {\n      // Should always be set\n      pushTopLevelContextObject(workInProgress, root.context, false);\n    }\n\n    pushHostContainer(workInProgress, root.containerInfo);\n  }\n\n  function updateHostRoot(current, workInProgress, renderExpirationTime) {\n    pushHostRootContext(workInProgress);\n    var updateQueue = workInProgress.updateQueue;\n\n    if (!(current !== null && updateQueue !== null)) {\n      {\n        throw Error( \"If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n\n    var nextProps = workInProgress.pendingProps;\n    var prevState = workInProgress.memoizedState;\n    var prevChildren = prevState !== null ? prevState.element : null;\n    cloneUpdateQueue(current, workInProgress);\n    processUpdateQueue(workInProgress, nextProps, null, renderExpirationTime);\n    var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property\n    // being called \"element\".\n\n    var nextChildren = nextState.element;\n\n    if (nextChildren === prevChildren) {\n      // If the state is the same as before, that's a bailout because we had\n      // no work that expires at this time.\n      resetHydrationState();\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n    }\n\n    var root = workInProgress.stateNode;\n\n    if (root.hydrate && enterHydrationState(workInProgress)) {\n      // If we don't have any current children this might be the first pass.\n      // We always try to hydrate. If this isn't a hydration pass there won't\n      // be any children to hydrate which is effectively the same thing as\n      // not hydrating.\n      var child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n      workInProgress.child = child;\n      var node = child;\n\n      while (node) {\n        // Mark each child as hydrating. This is a fast path to know whether this\n        // tree is part of a hydrating tree. This is used to determine if a child\n        // node has fully mounted yet, and for scheduling event replaying.\n        // Conceptually this is similar to Placement in that a new subtree is\n        // inserted into the React tree here. It just happens to not need DOM\n        // mutations because it already exists.\n        node.effectTag = node.effectTag & ~Placement | Hydrating;\n        node = node.sibling;\n      }\n    } else {\n      // Otherwise reset hydration state in case we aborted and resumed another\n      // root.\n      reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n      resetHydrationState();\n    }\n\n    return workInProgress.child;\n  }\n\n  function updateHostComponent(current, workInProgress, renderExpirationTime) {\n    pushHostContext(workInProgress);\n\n    if (current === null) {\n      tryToClaimNextHydratableInstance(workInProgress);\n    }\n\n    var type = workInProgress.type;\n    var nextProps = workInProgress.pendingProps;\n    var prevProps = current !== null ? current.memoizedProps : null;\n    var nextChildren = nextProps.children;\n    var isDirectTextChild = shouldSetTextContent(type, nextProps);\n\n    if (isDirectTextChild) {\n      // We special case a direct text child of a host node. This is a common\n      // case. We won't handle it as a reified child. We will instead handle\n      // this in the host environment that also has access to this prop. That\n      // avoids allocating another HostText fiber and traversing it.\n      nextChildren = null;\n    } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {\n      // If we're switching from a direct text child to a normal child, or to\n      // empty, we need to schedule the text content to be reset.\n      workInProgress.effectTag |= ContentReset;\n    }\n\n    markRef(current, workInProgress); // Check the host config to see if the children are offscreen/hidden.\n\n    if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(type, nextProps)) {\n      {\n        markSpawnedWork(Never);\n      } // Schedule this fiber to re-render at offscreen priority. Then bailout.\n\n\n      workInProgress.expirationTime = workInProgress.childExpirationTime = Never;\n      return null;\n    }\n\n    reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    return workInProgress.child;\n  }\n\n  function updateHostText(current, workInProgress) {\n    if (current === null) {\n      tryToClaimNextHydratableInstance(workInProgress);\n    } // Nothing to do here. This is terminal. We'll do the completion step\n    // immediately after.\n\n\n    return null;\n  }\n\n  function mountLazyComponent(_current, workInProgress, elementType, updateExpirationTime, renderExpirationTime) {\n    if (_current !== null) {\n      // A lazy component only mounts if it suspended inside a non-\n      // concurrent tree, in an inconsistent state. We want to treat it like\n      // a new mount, even though an empty version of it already committed.\n      // Disconnect the alternate pointers.\n      _current.alternate = null;\n      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n      workInProgress.effectTag |= Placement;\n    }\n\n    var props = workInProgress.pendingProps; // We can't start a User Timing measurement with correct label yet.\n    // Cancel and resume right after we know the tag.\n\n    cancelWorkTimer(workInProgress);\n    var Component = readLazyComponentType(elementType); // Store the unwrapped component in the type.\n\n    workInProgress.type = Component;\n    var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);\n    startWorkTimer(workInProgress);\n    var resolvedProps = resolveDefaultProps(Component, props);\n    var child;\n\n    switch (resolvedTag) {\n      case FunctionComponent:\n        {\n          {\n            validateFunctionComponentInDev(workInProgress, Component);\n            workInProgress.type = Component = resolveFunctionForHotReloading(Component);\n          }\n\n          child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n          return child;\n        }\n\n      case ClassComponent:\n        {\n          {\n            workInProgress.type = Component = resolveClassForHotReloading(Component);\n          }\n\n          child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n          return child;\n        }\n\n      case ForwardRef:\n        {\n          {\n            workInProgress.type = Component = resolveForwardRefForHotReloading(Component);\n          }\n\n          child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderExpirationTime);\n          return child;\n        }\n\n      case MemoComponent:\n        {\n          {\n            if (workInProgress.type !== workInProgress.elementType) {\n              var outerPropTypes = Component.propTypes;\n\n              if (outerPropTypes) {\n                checkPropTypes_1(outerPropTypes, resolvedProps, // Resolved for outer only\n                'prop', getComponentName(Component), getCurrentFiberStackInDev);\n              }\n            }\n          }\n\n          child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too\n          updateExpirationTime, renderExpirationTime);\n          return child;\n        }\n    }\n\n    var hint = '';\n\n    {\n      if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {\n        hint = ' Did you wrap a component in React.lazy() more than once?';\n      }\n    } // This message intentionally doesn't mention ForwardRef or MemoComponent\n    // because the fact that it's a separate type of work is an\n    // implementation detail.\n\n\n    {\n      {\n        throw Error( \"Element type is invalid. Received a promise that resolves to: \" + Component + \". Lazy element type must resolve to a class or function.\" + hint );\n      }\n    }\n  }\n\n  function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderExpirationTime) {\n    if (_current !== null) {\n      // An incomplete component only mounts if it suspended inside a non-\n      // concurrent tree, in an inconsistent state. We want to treat it like\n      // a new mount, even though an empty version of it already committed.\n      // Disconnect the alternate pointers.\n      _current.alternate = null;\n      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n      workInProgress.effectTag |= Placement;\n    } // Promote the fiber to a class and try rendering again.\n\n\n    workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`\n    // Push context providers early to prevent context stack mismatches.\n    // During mounting we don't know the child context yet as the instance doesn't exist.\n    // We will invalidate the child context in finishClassComponent() right after rendering.\n\n    var hasContext;\n\n    if (isContextProvider(Component)) {\n      hasContext = true;\n      pushContextProvider(workInProgress);\n    } else {\n      hasContext = false;\n    }\n\n    prepareToReadContext(workInProgress, renderExpirationTime);\n    constructClassInstance(workInProgress, Component, nextProps);\n    mountClassInstance(workInProgress, Component, nextProps, renderExpirationTime);\n    return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);\n  }\n\n  function mountIndeterminateComponent(_current, workInProgress, Component, renderExpirationTime) {\n    if (_current !== null) {\n      // An indeterminate component only mounts if it suspended inside a non-\n      // concurrent tree, in an inconsistent state. We want to treat it like\n      // a new mount, even though an empty version of it already committed.\n      // Disconnect the alternate pointers.\n      _current.alternate = null;\n      workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect\n\n      workInProgress.effectTag |= Placement;\n    }\n\n    var props = workInProgress.pendingProps;\n    var context;\n\n    {\n      var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);\n      context = getMaskedContext(workInProgress, unmaskedContext);\n    }\n\n    prepareToReadContext(workInProgress, renderExpirationTime);\n    var value;\n\n    {\n      if (Component.prototype && typeof Component.prototype.render === 'function') {\n        var componentName = getComponentName(Component) || 'Unknown';\n\n        if (!didWarnAboutBadClass[componentName]) {\n          error(\"The <%s /> component appears to have a render method, but doesn't extend React.Component. \" + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);\n\n          didWarnAboutBadClass[componentName] = true;\n        }\n      }\n\n      if (workInProgress.mode & StrictMode) {\n        ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);\n      }\n\n      setIsRendering(true);\n      ReactCurrentOwner$1.current = workInProgress;\n      value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);\n      setIsRendering(false);\n    } // React DevTools reads this flag.\n\n\n    workInProgress.effectTag |= PerformedWork;\n\n    if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {\n      {\n        var _componentName = getComponentName(Component) || 'Unknown';\n\n        if (!didWarnAboutModulePatternComponent[_componentName]) {\n          error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + \"If you can't use a class try assigning the prototype on the function as a workaround. \" + \"`%s.prototype = React.Component.prototype`. Don't use an arrow function since it \" + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName);\n\n          didWarnAboutModulePatternComponent[_componentName] = true;\n        }\n      } // Proceed under the assumption that this is a class instance\n\n\n      workInProgress.tag = ClassComponent; // Throw out any hooks that were used.\n\n      workInProgress.memoizedState = null;\n      workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches.\n      // During mounting we don't know the child context yet as the instance doesn't exist.\n      // We will invalidate the child context in finishClassComponent() right after rendering.\n\n      var hasContext = false;\n\n      if (isContextProvider(Component)) {\n        hasContext = true;\n        pushContextProvider(workInProgress);\n      } else {\n        hasContext = false;\n      }\n\n      workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;\n      initializeUpdateQueue(workInProgress);\n      var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n\n      if (typeof getDerivedStateFromProps === 'function') {\n        applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props);\n      }\n\n      adoptClassInstance(workInProgress, value);\n      mountClassInstance(workInProgress, Component, props, renderExpirationTime);\n      return finishClassComponent(null, workInProgress, Component, true, hasContext, renderExpirationTime);\n    } else {\n      // Proceed under the assumption that this is a function component\n      workInProgress.tag = FunctionComponent;\n\n      {\n\n        if ( workInProgress.mode & StrictMode) {\n          // Only double-render components with Hooks\n          if (workInProgress.memoizedState !== null) {\n            value = renderWithHooks(null, workInProgress, Component, props, context, renderExpirationTime);\n          }\n        }\n      }\n\n      reconcileChildren(null, workInProgress, value, renderExpirationTime);\n\n      {\n        validateFunctionComponentInDev(workInProgress, Component);\n      }\n\n      return workInProgress.child;\n    }\n  }\n\n  function validateFunctionComponentInDev(workInProgress, Component) {\n    {\n      if (Component) {\n        if (Component.childContextTypes) {\n          error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');\n        }\n      }\n\n      if (workInProgress.ref !== null) {\n        var info = '';\n        var ownerName = getCurrentFiberOwnerNameInDevOrNull();\n\n        if (ownerName) {\n          info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n        }\n\n        var warningKey = ownerName || workInProgress._debugID || '';\n        var debugSource = workInProgress._debugSource;\n\n        if (debugSource) {\n          warningKey = debugSource.fileName + ':' + debugSource.lineNumber;\n        }\n\n        if (!didWarnAboutFunctionRefs[warningKey]) {\n          didWarnAboutFunctionRefs[warningKey] = true;\n\n          error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);\n        }\n      }\n\n      if (typeof Component.getDerivedStateFromProps === 'function') {\n        var _componentName2 = getComponentName(Component) || 'Unknown';\n\n        if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2]) {\n          error('%s: Function components do not support getDerivedStateFromProps.', _componentName2);\n\n          didWarnAboutGetDerivedStateOnFunctionComponent[_componentName2] = true;\n        }\n      }\n\n      if (typeof Component.contextType === 'object' && Component.contextType !== null) {\n        var _componentName3 = getComponentName(Component) || 'Unknown';\n\n        if (!didWarnAboutContextTypeOnFunctionComponent[_componentName3]) {\n          error('%s: Function components do not support contextType.', _componentName3);\n\n          didWarnAboutContextTypeOnFunctionComponent[_componentName3] = true;\n        }\n      }\n    }\n  }\n\n  var SUSPENDED_MARKER = {\n    dehydrated: null,\n    retryTime: NoWork\n  };\n\n  function shouldRemainOnFallback(suspenseContext, current, workInProgress) {\n    // If the context is telling us that we should show a fallback, and we're not\n    // already showing content, then we should show the fallback instead.\n    return hasSuspenseContext(suspenseContext, ForceSuspenseFallback) && (current === null || current.memoizedState !== null);\n  }\n\n  function updateSuspenseComponent(current, workInProgress, renderExpirationTime) {\n    var mode = workInProgress.mode;\n    var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.\n\n    {\n      if (shouldSuspend(workInProgress)) {\n        workInProgress.effectTag |= DidCapture;\n      }\n    }\n\n    var suspenseContext = suspenseStackCursor.current;\n    var nextDidTimeout = false;\n    var didSuspend = (workInProgress.effectTag & DidCapture) !== NoEffect;\n\n    if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) {\n      // Something in this boundary's subtree already suspended. Switch to\n      // rendering the fallback children.\n      nextDidTimeout = true;\n      workInProgress.effectTag &= ~DidCapture;\n    } else {\n      // Attempting the main content\n      if (current === null || current.memoizedState !== null) {\n        // This is a new mount or this boundary is already showing a fallback state.\n        // Mark this subtree context as having at least one invisible parent that could\n        // handle the fallback state.\n        // Boundaries without fallbacks or should be avoided are not considered since\n        // they cannot handle preferred fallback states.\n        if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) {\n          suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);\n        }\n      }\n    }\n\n    suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n    pushSuspenseContext(workInProgress, suspenseContext); // This next part is a bit confusing. If the children timeout, we switch to\n    // showing the fallback children in place of the \"primary\" children.\n    // However, we don't want to delete the primary children because then their\n    // state will be lost (both the React state and the host state, e.g.\n    // uncontrolled form inputs). Instead we keep them mounted and hide them.\n    // Both the fallback children AND the primary children are rendered at the\n    // same time. Once the primary children are un-suspended, we can delete\n    // the fallback children — don't need to preserve their state.\n    //\n    // The two sets of children are siblings in the host environment, but\n    // semantically, for purposes of reconciliation, they are two separate sets.\n    // So we store them using two fragment fibers.\n    //\n    // However, we want to avoid allocating extra fibers for every placeholder.\n    // They're only necessary when the children time out, because that's the\n    // only time when both sets are mounted.\n    //\n    // So, the extra fragment fibers are only used if the children time out.\n    // Otherwise, we render the primary children directly. This requires some\n    // custom reconciliation logic to preserve the state of the primary\n    // children. It's essentially a very basic form of re-parenting.\n\n    if (current === null) {\n      // If we're currently hydrating, try to hydrate this boundary.\n      // But only if this has a fallback.\n      if (nextProps.fallback !== undefined) {\n        tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.\n      } // This is the initial mount. This branch is pretty simple because there's\n      // no previous state that needs to be preserved.\n\n\n      if (nextDidTimeout) {\n        // Mount separate fragments for primary and fallback children.\n        var nextFallbackChildren = nextProps.fallback;\n        var primaryChildFragment = createFiberFromFragment(null, mode, NoWork, null);\n        primaryChildFragment.return = workInProgress;\n\n        if ((workInProgress.mode & BlockingMode) === NoMode) {\n          // Outside of blocking mode, we commit the effects from the\n          // partially completed, timed-out tree, too.\n          var progressedState = workInProgress.memoizedState;\n          var progressedPrimaryChild = progressedState !== null ? workInProgress.child.child : workInProgress.child;\n          primaryChildFragment.child = progressedPrimaryChild;\n          var progressedChild = progressedPrimaryChild;\n\n          while (progressedChild !== null) {\n            progressedChild.return = primaryChildFragment;\n            progressedChild = progressedChild.sibling;\n          }\n        }\n\n        var fallbackChildFragment = createFiberFromFragment(nextFallbackChildren, mode, renderExpirationTime, null);\n        fallbackChildFragment.return = workInProgress;\n        primaryChildFragment.sibling = fallbackChildFragment; // Skip the primary children, and continue working on the\n        // fallback children.\n\n        workInProgress.memoizedState = SUSPENDED_MARKER;\n        workInProgress.child = primaryChildFragment;\n        return fallbackChildFragment;\n      } else {\n        // Mount the primary children without an intermediate fragment fiber.\n        var nextPrimaryChildren = nextProps.children;\n        workInProgress.memoizedState = null;\n        return workInProgress.child = mountChildFibers(workInProgress, null, nextPrimaryChildren, renderExpirationTime);\n      }\n    } else {\n      // This is an update. This branch is more complicated because we need to\n      // ensure the state of the primary children is preserved.\n      var prevState = current.memoizedState;\n\n      if (prevState !== null) {\n        // wrapped in a fragment fiber.\n\n\n        var currentPrimaryChildFragment = current.child;\n        var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;\n\n        if (nextDidTimeout) {\n          // Still timed out. Reuse the current primary children by cloning\n          // its fragment. We're going to skip over these entirely.\n          var _nextFallbackChildren2 = nextProps.fallback;\n\n          var _primaryChildFragment2 = createWorkInProgress(currentPrimaryChildFragment, currentPrimaryChildFragment.pendingProps);\n\n          _primaryChildFragment2.return = workInProgress;\n\n          if ((workInProgress.mode & BlockingMode) === NoMode) {\n            // Outside of blocking mode, we commit the effects from the\n            // partially completed, timed-out tree, too.\n            var _progressedState = workInProgress.memoizedState;\n\n            var _progressedPrimaryChild = _progressedState !== null ? workInProgress.child.child : workInProgress.child;\n\n            if (_progressedPrimaryChild !== currentPrimaryChildFragment.child) {\n              _primaryChildFragment2.child = _progressedPrimaryChild;\n              var _progressedChild2 = _progressedPrimaryChild;\n\n              while (_progressedChild2 !== null) {\n                _progressedChild2.return = _primaryChildFragment2;\n                _progressedChild2 = _progressedChild2.sibling;\n              }\n            }\n          } // Because primaryChildFragment is a new fiber that we're inserting as the\n          // parent of a new tree, we need to set its treeBaseDuration.\n\n\n          if ( workInProgress.mode & ProfileMode) {\n            // treeBaseDuration is the sum of all the child tree base durations.\n            var _treeBaseDuration = 0;\n            var _hiddenChild = _primaryChildFragment2.child;\n\n            while (_hiddenChild !== null) {\n              _treeBaseDuration += _hiddenChild.treeBaseDuration;\n              _hiddenChild = _hiddenChild.sibling;\n            }\n\n            _primaryChildFragment2.treeBaseDuration = _treeBaseDuration;\n          } // Clone the fallback child fragment, too. These we'll continue\n          // working on.\n\n\n          var _fallbackChildFragment2 = createWorkInProgress(currentFallbackChildFragment, _nextFallbackChildren2);\n\n          _fallbackChildFragment2.return = workInProgress;\n          _primaryChildFragment2.sibling = _fallbackChildFragment2;\n          _primaryChildFragment2.childExpirationTime = NoWork; // Skip the primary children, and continue working on the\n          // fallback children.\n\n          workInProgress.memoizedState = SUSPENDED_MARKER;\n          workInProgress.child = _primaryChildFragment2;\n          return _fallbackChildFragment2;\n        } else {\n          // No longer suspended. Switch back to showing the primary children,\n          // and remove the intermediate fragment fiber.\n          var _nextPrimaryChildren = nextProps.children;\n          var currentPrimaryChild = currentPrimaryChildFragment.child;\n          var primaryChild = reconcileChildFibers(workInProgress, currentPrimaryChild, _nextPrimaryChildren, renderExpirationTime); // If this render doesn't suspend, we need to delete the fallback\n          // children. Wait until the complete phase, after we've confirmed the\n          // fallback is no longer needed.\n          // TODO: Would it be better to store the fallback fragment on\n          // the stateNode?\n          // Continue rendering the children, like we normally do.\n\n          workInProgress.memoizedState = null;\n          return workInProgress.child = primaryChild;\n        }\n      } else {\n        // The current tree has not already timed out. That means the primary\n        // children are not wrapped in a fragment fiber.\n        var _currentPrimaryChild = current.child;\n\n        if (nextDidTimeout) {\n          // Timed out. Wrap the children in a fragment fiber to keep them\n          // separate from the fallback children.\n          var _nextFallbackChildren3 = nextProps.fallback;\n\n          var _primaryChildFragment3 = createFiberFromFragment( // It shouldn't matter what the pending props are because we aren't\n          // going to render this fragment.\n          null, mode, NoWork, null);\n\n          _primaryChildFragment3.return = workInProgress;\n          _primaryChildFragment3.child = _currentPrimaryChild;\n\n          if (_currentPrimaryChild !== null) {\n            _currentPrimaryChild.return = _primaryChildFragment3;\n          } // Even though we're creating a new fiber, there are no new children,\n          // because we're reusing an already mounted tree. So we don't need to\n          // schedule a placement.\n          // primaryChildFragment.effectTag |= Placement;\n\n\n          if ((workInProgress.mode & BlockingMode) === NoMode) {\n            // Outside of blocking mode, we commit the effects from the\n            // partially completed, timed-out tree, too.\n            var _progressedState2 = workInProgress.memoizedState;\n\n            var _progressedPrimaryChild2 = _progressedState2 !== null ? workInProgress.child.child : workInProgress.child;\n\n            _primaryChildFragment3.child = _progressedPrimaryChild2;\n            var _progressedChild3 = _progressedPrimaryChild2;\n\n            while (_progressedChild3 !== null) {\n              _progressedChild3.return = _primaryChildFragment3;\n              _progressedChild3 = _progressedChild3.sibling;\n            }\n          } // Because primaryChildFragment is a new fiber that we're inserting as the\n          // parent of a new tree, we need to set its treeBaseDuration.\n\n\n          if ( workInProgress.mode & ProfileMode) {\n            // treeBaseDuration is the sum of all the child tree base durations.\n            var _treeBaseDuration2 = 0;\n            var _hiddenChild2 = _primaryChildFragment3.child;\n\n            while (_hiddenChild2 !== null) {\n              _treeBaseDuration2 += _hiddenChild2.treeBaseDuration;\n              _hiddenChild2 = _hiddenChild2.sibling;\n            }\n\n            _primaryChildFragment3.treeBaseDuration = _treeBaseDuration2;\n          } // Create a fragment from the fallback children, too.\n\n\n          var _fallbackChildFragment3 = createFiberFromFragment(_nextFallbackChildren3, mode, renderExpirationTime, null);\n\n          _fallbackChildFragment3.return = workInProgress;\n          _primaryChildFragment3.sibling = _fallbackChildFragment3;\n          _fallbackChildFragment3.effectTag |= Placement;\n          _primaryChildFragment3.childExpirationTime = NoWork; // Skip the primary children, and continue working on the\n          // fallback children.\n\n          workInProgress.memoizedState = SUSPENDED_MARKER;\n          workInProgress.child = _primaryChildFragment3;\n          return _fallbackChildFragment3;\n        } else {\n          // Still haven't timed out. Continue rendering the children, like we\n          // normally do.\n          workInProgress.memoizedState = null;\n          var _nextPrimaryChildren2 = nextProps.children;\n          return workInProgress.child = reconcileChildFibers(workInProgress, _currentPrimaryChild, _nextPrimaryChildren2, renderExpirationTime);\n        }\n      }\n    }\n  }\n\n  function scheduleWorkOnFiber(fiber, renderExpirationTime) {\n    if (fiber.expirationTime < renderExpirationTime) {\n      fiber.expirationTime = renderExpirationTime;\n    }\n\n    var alternate = fiber.alternate;\n\n    if (alternate !== null && alternate.expirationTime < renderExpirationTime) {\n      alternate.expirationTime = renderExpirationTime;\n    }\n\n    scheduleWorkOnParentPath(fiber.return, renderExpirationTime);\n  }\n\n  function propagateSuspenseContextChange(workInProgress, firstChild, renderExpirationTime) {\n    // Mark any Suspense boundaries with fallbacks as having work to do.\n    // If they were previously forced into fallbacks, they may now be able\n    // to unblock.\n    var node = firstChild;\n\n    while (node !== null) {\n      if (node.tag === SuspenseComponent) {\n        var state = node.memoizedState;\n\n        if (state !== null) {\n          scheduleWorkOnFiber(node, renderExpirationTime);\n        }\n      } else if (node.tag === SuspenseListComponent) {\n        // If the tail is hidden there might not be an Suspense boundaries\n        // to schedule work on. In this case we have to schedule it on the\n        // list itself.\n        // We don't have to traverse to the children of the list since\n        // the list will propagate the change when it rerenders.\n        scheduleWorkOnFiber(node, renderExpirationTime);\n      } else if (node.child !== null) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === workInProgress) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === workInProgress) {\n          return;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n\n  function findLastContentRow(firstChild) {\n    // This is going to find the last row among these children that is already\n    // showing content on the screen, as opposed to being in fallback state or\n    // new. If a row has multiple Suspense boundaries, any of them being in the\n    // fallback state, counts as the whole row being in a fallback state.\n    // Note that the \"rows\" will be workInProgress, but any nested children\n    // will still be current since we haven't rendered them yet. The mounted\n    // order may not be the same as the new order. We use the new order.\n    var row = firstChild;\n    var lastContentRow = null;\n\n    while (row !== null) {\n      var currentRow = row.alternate; // New rows can't be content rows.\n\n      if (currentRow !== null && findFirstSuspended(currentRow) === null) {\n        lastContentRow = row;\n      }\n\n      row = row.sibling;\n    }\n\n    return lastContentRow;\n  }\n\n  function validateRevealOrder(revealOrder) {\n    {\n      if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {\n        didWarnAboutRevealOrder[revealOrder] = true;\n\n        if (typeof revealOrder === 'string') {\n          switch (revealOrder.toLowerCase()) {\n            case 'together':\n            case 'forwards':\n            case 'backwards':\n              {\n                error('\"%s\" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase \"%s\" instead.', revealOrder, revealOrder.toLowerCase());\n\n                break;\n              }\n\n            case 'forward':\n            case 'backward':\n              {\n                error('\"%s\" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use \"%ss\" instead.', revealOrder, revealOrder.toLowerCase());\n\n                break;\n              }\n\n            default:\n              error('\"%s\" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean \"together\", \"forwards\" or \"backwards\"?', revealOrder);\n\n              break;\n          }\n        } else {\n          error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean \"together\", \"forwards\" or \"backwards\"?', revealOrder);\n        }\n      }\n    }\n  }\n\n  function validateTailOptions(tailMode, revealOrder) {\n    {\n      if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {\n        if (tailMode !== 'collapsed' && tailMode !== 'hidden') {\n          didWarnAboutTailOptions[tailMode] = true;\n\n          error('\"%s\" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean \"collapsed\" or \"hidden\"?', tailMode);\n        } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {\n          didWarnAboutTailOptions[tailMode] = true;\n\n          error('<SuspenseList tail=\"%s\" /> is only valid if revealOrder is ' + '\"forwards\" or \"backwards\". ' + 'Did you mean to specify revealOrder=\"forwards\"?', tailMode);\n        }\n      }\n    }\n  }\n\n  function validateSuspenseListNestedChild(childSlot, index) {\n    {\n      var isArray = Array.isArray(childSlot);\n      var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function';\n\n      if (isArray || isIterable) {\n        var type = isArray ? 'array' : 'iterable';\n\n        error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type);\n\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  function validateSuspenseListChildren(children, revealOrder) {\n    {\n      if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {\n        if (Array.isArray(children)) {\n          for (var i = 0; i < children.length; i++) {\n            if (!validateSuspenseListNestedChild(children[i], i)) {\n              return;\n            }\n          }\n        } else {\n          var iteratorFn = getIteratorFn(children);\n\n          if (typeof iteratorFn === 'function') {\n            var childrenIterator = iteratorFn.call(children);\n\n            if (childrenIterator) {\n              var step = childrenIterator.next();\n              var _i = 0;\n\n              for (; !step.done; step = childrenIterator.next()) {\n                if (!validateSuspenseListNestedChild(step.value, _i)) {\n                  return;\n                }\n\n                _i++;\n              }\n            }\n          } else {\n            error('A single row was passed to a <SuspenseList revealOrder=\"%s\" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder);\n          }\n        }\n      }\n    }\n  }\n\n  function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) {\n    var renderState = workInProgress.memoizedState;\n\n    if (renderState === null) {\n      workInProgress.memoizedState = {\n        isBackwards: isBackwards,\n        rendering: null,\n        renderingStartTime: 0,\n        last: lastContentRow,\n        tail: tail,\n        tailExpiration: 0,\n        tailMode: tailMode,\n        lastEffect: lastEffectBeforeRendering\n      };\n    } else {\n      // We can reuse the existing object from previous renders.\n      renderState.isBackwards = isBackwards;\n      renderState.rendering = null;\n      renderState.renderingStartTime = 0;\n      renderState.last = lastContentRow;\n      renderState.tail = tail;\n      renderState.tailExpiration = 0;\n      renderState.tailMode = tailMode;\n      renderState.lastEffect = lastEffectBeforeRendering;\n    }\n  } // This can end up rendering this component multiple passes.\n  // The first pass splits the children fibers into two sets. A head and tail.\n  // We first render the head. If anything is in fallback state, we do another\n  // pass through beginWork to rerender all children (including the tail) with\n  // the force suspend context. If the first render didn't have anything in\n  // in fallback state. Then we render each row in the tail one-by-one.\n  // That happens in the completeWork phase without going back to beginWork.\n\n\n  function updateSuspenseListComponent(current, workInProgress, renderExpirationTime) {\n    var nextProps = workInProgress.pendingProps;\n    var revealOrder = nextProps.revealOrder;\n    var tailMode = nextProps.tail;\n    var newChildren = nextProps.children;\n    validateRevealOrder(revealOrder);\n    validateTailOptions(tailMode, revealOrder);\n    validateSuspenseListChildren(newChildren, revealOrder);\n    reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n    var suspenseContext = suspenseStackCursor.current;\n    var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);\n\n    if (shouldForceFallback) {\n      suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);\n      workInProgress.effectTag |= DidCapture;\n    } else {\n      var didSuspendBefore = current !== null && (current.effectTag & DidCapture) !== NoEffect;\n\n      if (didSuspendBefore) {\n        // If we previously forced a fallback, we need to schedule work\n        // on any nested boundaries to let them know to try to render\n        // again. This is the same as context updating.\n        propagateSuspenseContextChange(workInProgress, workInProgress.child, renderExpirationTime);\n      }\n\n      suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n    }\n\n    pushSuspenseContext(workInProgress, suspenseContext);\n\n    if ((workInProgress.mode & BlockingMode) === NoMode) {\n      // Outside of blocking mode, SuspenseList doesn't work so we just\n      // use make it a noop by treating it as the default revealOrder.\n      workInProgress.memoizedState = null;\n    } else {\n      switch (revealOrder) {\n        case 'forwards':\n          {\n            var lastContentRow = findLastContentRow(workInProgress.child);\n            var tail;\n\n            if (lastContentRow === null) {\n              // The whole list is part of the tail.\n              // TODO: We could fast path by just rendering the tail now.\n              tail = workInProgress.child;\n              workInProgress.child = null;\n            } else {\n              // Disconnect the tail rows after the content row.\n              // We're going to render them separately later.\n              tail = lastContentRow.sibling;\n              lastContentRow.sibling = null;\n            }\n\n            initSuspenseListRenderState(workInProgress, false, // isBackwards\n            tail, lastContentRow, tailMode, workInProgress.lastEffect);\n            break;\n          }\n\n        case 'backwards':\n          {\n            // We're going to find the first row that has existing content.\n            // At the same time we're going to reverse the list of everything\n            // we pass in the meantime. That's going to be our tail in reverse\n            // order.\n            var _tail = null;\n            var row = workInProgress.child;\n            workInProgress.child = null;\n\n            while (row !== null) {\n              var currentRow = row.alternate; // New rows can't be content rows.\n\n              if (currentRow !== null && findFirstSuspended(currentRow) === null) {\n                // This is the beginning of the main content.\n                workInProgress.child = row;\n                break;\n              }\n\n              var nextRow = row.sibling;\n              row.sibling = _tail;\n              _tail = row;\n              row = nextRow;\n            } // TODO: If workInProgress.child is null, we can continue on the tail immediately.\n\n\n            initSuspenseListRenderState(workInProgress, true, // isBackwards\n            _tail, null, // last\n            tailMode, workInProgress.lastEffect);\n            break;\n          }\n\n        case 'together':\n          {\n            initSuspenseListRenderState(workInProgress, false, // isBackwards\n            null, // tail\n            null, // last\n            undefined, workInProgress.lastEffect);\n            break;\n          }\n\n        default:\n          {\n            // The default reveal order is the same as not having\n            // a boundary.\n            workInProgress.memoizedState = null;\n          }\n      }\n    }\n\n    return workInProgress.child;\n  }\n\n  function updatePortalComponent(current, workInProgress, renderExpirationTime) {\n    pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n    var nextChildren = workInProgress.pendingProps;\n\n    if (current === null) {\n      // Portals are special because we don't append the children during mount\n      // but at commit. Therefore we need to track insertions which the normal\n      // flow doesn't do during mount. This doesn't happen at the root because\n      // the root always starts with a \"current\" with a null child.\n      // TODO: Consider unifying this with how the root works.\n      workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n    } else {\n      reconcileChildren(current, workInProgress, nextChildren, renderExpirationTime);\n    }\n\n    return workInProgress.child;\n  }\n\n  function updateContextProvider(current, workInProgress, renderExpirationTime) {\n    var providerType = workInProgress.type;\n    var context = providerType._context;\n    var newProps = workInProgress.pendingProps;\n    var oldProps = workInProgress.memoizedProps;\n    var newValue = newProps.value;\n\n    {\n      var providerPropTypes = workInProgress.type.propTypes;\n\n      if (providerPropTypes) {\n        checkPropTypes_1(providerPropTypes, newProps, 'prop', 'Context.Provider', getCurrentFiberStackInDev);\n      }\n    }\n\n    pushProvider(workInProgress, newValue);\n\n    if (oldProps !== null) {\n      var oldValue = oldProps.value;\n      var changedBits = calculateChangedBits(context, newValue, oldValue);\n\n      if (changedBits === 0) {\n        // No change. Bailout early if children are the same.\n        if (oldProps.children === newProps.children && !hasContextChanged()) {\n          return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n        }\n      } else {\n        // The context value changed. Search for matching consumers and schedule\n        // them to update.\n        propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);\n      }\n    }\n\n    var newChildren = newProps.children;\n    reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n    return workInProgress.child;\n  }\n\n  var hasWarnedAboutUsingContextAsConsumer = false;\n\n  function updateContextConsumer(current, workInProgress, renderExpirationTime) {\n    var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In\n    // DEV mode, we create a separate object for Context.Consumer that acts\n    // like a proxy to Context. This proxy object adds unnecessary code in PROD\n    // so we use the old behaviour (Context.Consumer references Context) to\n    // reduce size and overhead. The separate object references context via\n    // a property called \"_context\", which also gives us the ability to check\n    // in DEV mode if this property exists or not and warn if it does not.\n\n    {\n      if (context._context === undefined) {\n        // This may be because it's a Context (rather than a Consumer).\n        // Or it may be because it's older React where they're the same thing.\n        // We only want to warn if we're sure it's a new React.\n        if (context !== context.Consumer) {\n          if (!hasWarnedAboutUsingContextAsConsumer) {\n            hasWarnedAboutUsingContextAsConsumer = true;\n\n            error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n          }\n        }\n      } else {\n        context = context._context;\n      }\n    }\n\n    var newProps = workInProgress.pendingProps;\n    var render = newProps.children;\n\n    {\n      if (typeof render !== 'function') {\n        error('A context consumer was rendered with multiple children, or a child ' + \"that isn't a function. A context consumer expects a single child \" + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.');\n      }\n    }\n\n    prepareToReadContext(workInProgress, renderExpirationTime);\n    var newValue = readContext(context, newProps.unstable_observedBits);\n    var newChildren;\n\n    {\n      ReactCurrentOwner$1.current = workInProgress;\n      setIsRendering(true);\n      newChildren = render(newValue);\n      setIsRendering(false);\n    } // React DevTools reads this flag.\n\n\n    workInProgress.effectTag |= PerformedWork;\n    reconcileChildren(current, workInProgress, newChildren, renderExpirationTime);\n    return workInProgress.child;\n  }\n\n  function markWorkInProgressReceivedUpdate() {\n    didReceiveUpdate = true;\n  }\n\n  function bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime) {\n    cancelWorkTimer(workInProgress);\n\n    if (current !== null) {\n      // Reuse previous dependencies\n      workInProgress.dependencies = current.dependencies;\n    }\n\n    {\n      // Don't update \"base\" render times for bailouts.\n      stopProfilerTimerIfRunning();\n    }\n\n    var updateExpirationTime = workInProgress.expirationTime;\n\n    if (updateExpirationTime !== NoWork) {\n      markUnprocessedUpdateTime(updateExpirationTime);\n    } // Check if the children have any pending work.\n\n\n    var childExpirationTime = workInProgress.childExpirationTime;\n\n    if (childExpirationTime < renderExpirationTime) {\n      // The children don't have any work either. We can skip them.\n      // TODO: Once we add back resuming, we should check if the children are\n      // a work-in-progress set. If so, we need to transfer their effects.\n      return null;\n    } else {\n      // This fiber doesn't have work, but its subtree does. Clone the child\n      // fibers and continue.\n      cloneChildFibers(current, workInProgress);\n      return workInProgress.child;\n    }\n  }\n\n  function remountFiber(current, oldWorkInProgress, newWorkInProgress) {\n    {\n      var returnFiber = oldWorkInProgress.return;\n\n      if (returnFiber === null) {\n        throw new Error('Cannot swap the root fiber.');\n      } // Disconnect from the old current.\n      // It will get deleted.\n\n\n      current.alternate = null;\n      oldWorkInProgress.alternate = null; // Connect to the new tree.\n\n      newWorkInProgress.index = oldWorkInProgress.index;\n      newWorkInProgress.sibling = oldWorkInProgress.sibling;\n      newWorkInProgress.return = oldWorkInProgress.return;\n      newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.\n\n      if (oldWorkInProgress === returnFiber.child) {\n        returnFiber.child = newWorkInProgress;\n      } else {\n        var prevSibling = returnFiber.child;\n\n        if (prevSibling === null) {\n          throw new Error('Expected parent to have a child.');\n        }\n\n        while (prevSibling.sibling !== oldWorkInProgress) {\n          prevSibling = prevSibling.sibling;\n\n          if (prevSibling === null) {\n            throw new Error('Expected to find the previous sibling.');\n          }\n        }\n\n        prevSibling.sibling = newWorkInProgress;\n      } // Delete the old fiber and place the new one.\n      // Since the old fiber is disconnected, we have to schedule it manually.\n\n\n      var last = returnFiber.lastEffect;\n\n      if (last !== null) {\n        last.nextEffect = current;\n        returnFiber.lastEffect = current;\n      } else {\n        returnFiber.firstEffect = returnFiber.lastEffect = current;\n      }\n\n      current.nextEffect = null;\n      current.effectTag = Deletion;\n      newWorkInProgress.effectTag |= Placement; // Restart work from the new fiber.\n\n      return newWorkInProgress;\n    }\n  }\n\n  function beginWork(current, workInProgress, renderExpirationTime) {\n    var updateExpirationTime = workInProgress.expirationTime;\n\n    {\n      if (workInProgress._debugNeedsRemount && current !== null) {\n        // This will restart the begin phase with a new fiber.\n        return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.expirationTime));\n      }\n    }\n\n    if (current !== null) {\n      var oldProps = current.memoizedProps;\n      var newProps = workInProgress.pendingProps;\n\n      if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:\n       workInProgress.type !== current.type )) {\n        // If props or context changed, mark the fiber as having performed work.\n        // This may be unset if the props are determined to be equal later (memo).\n        didReceiveUpdate = true;\n      } else if (updateExpirationTime < renderExpirationTime) {\n        didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering\n        // the begin phase. There's still some bookkeeping we that needs to be done\n        // in this optimized path, mostly pushing stuff onto the stack.\n\n        switch (workInProgress.tag) {\n          case HostRoot:\n            pushHostRootContext(workInProgress);\n            resetHydrationState();\n            break;\n\n          case HostComponent:\n            pushHostContext(workInProgress);\n\n            if (workInProgress.mode & ConcurrentMode && renderExpirationTime !== Never && shouldDeprioritizeSubtree(workInProgress.type, newProps)) {\n              {\n                markSpawnedWork(Never);\n              } // Schedule this fiber to re-render at offscreen priority. Then bailout.\n\n\n              workInProgress.expirationTime = workInProgress.childExpirationTime = Never;\n              return null;\n            }\n\n            break;\n\n          case ClassComponent:\n            {\n              var Component = workInProgress.type;\n\n              if (isContextProvider(Component)) {\n                pushContextProvider(workInProgress);\n              }\n\n              break;\n            }\n\n          case HostPortal:\n            pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n            break;\n\n          case ContextProvider:\n            {\n              var newValue = workInProgress.memoizedProps.value;\n              pushProvider(workInProgress, newValue);\n              break;\n            }\n\n          case Profiler:\n            {\n              // Profiler should only call onRender when one of its descendants actually rendered.\n              var hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;\n\n              if (hasChildWork) {\n                workInProgress.effectTag |= Update;\n              }\n            }\n\n            break;\n\n          case SuspenseComponent:\n            {\n              var state = workInProgress.memoizedState;\n\n              if (state !== null) {\n                // whether to retry the primary children, or to skip over it and\n                // go straight to the fallback. Check the priority of the primary\n                // child fragment.\n\n\n                var primaryChildFragment = workInProgress.child;\n                var primaryChildExpirationTime = primaryChildFragment.childExpirationTime;\n\n                if (primaryChildExpirationTime !== NoWork && primaryChildExpirationTime >= renderExpirationTime) {\n                  // The primary children have pending work. Use the normal path\n                  // to attempt to render the primary children again.\n                  return updateSuspenseComponent(current, workInProgress, renderExpirationTime);\n                } else {\n                  pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient\n                  // priority. Bailout.\n\n                  var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n\n                  if (child !== null) {\n                    // The fallback children have pending work. Skip over the\n                    // primary children and work on the fallback.\n                    return child.sibling;\n                  } else {\n                    return null;\n                  }\n                }\n              } else {\n                pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));\n              }\n\n              break;\n            }\n\n          case SuspenseListComponent:\n            {\n              var didSuspendBefore = (current.effectTag & DidCapture) !== NoEffect;\n\n              var _hasChildWork = workInProgress.childExpirationTime >= renderExpirationTime;\n\n              if (didSuspendBefore) {\n                if (_hasChildWork) {\n                  // If something was in fallback state last time, and we have all the\n                  // same children then we're still in progressive loading state.\n                  // Something might get unblocked by state updates or retries in the\n                  // tree which will affect the tail. So we need to use the normal\n                  // path to compute the correct tail.\n                  return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);\n                } // If none of the children had any work, that means that none of\n                // them got retried so they'll still be blocked in the same way\n                // as before. We can fast bail out.\n\n\n                workInProgress.effectTag |= DidCapture;\n              } // If nothing suspended before and we're rendering the same children,\n              // then the tail doesn't matter. Anything new that suspends will work\n              // in the \"together\" mode, so we can continue from the state we had.\n\n\n              var renderState = workInProgress.memoizedState;\n\n              if (renderState !== null) {\n                // Reset to the \"together\" mode in case we've started a different\n                // update in the past but didn't complete it.\n                renderState.rendering = null;\n                renderState.tail = null;\n              }\n\n              pushSuspenseContext(workInProgress, suspenseStackCursor.current);\n\n              if (_hasChildWork) {\n                break;\n              } else {\n                // If none of the children had any work, that means that none of\n                // them got retried so they'll still be blocked in the same way\n                // as before. We can fast bail out.\n                return null;\n              }\n            }\n        }\n\n        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderExpirationTime);\n      } else {\n        // An update was scheduled on this fiber, but there are no new props\n        // nor legacy context. Set this to false. If an update queue or context\n        // consumer produces a changed value, it will set this to true. Otherwise,\n        // the component will assume the children have not changed and bail out.\n        didReceiveUpdate = false;\n      }\n    } else {\n      didReceiveUpdate = false;\n    } // Before entering the begin phase, clear pending update priority.\n    // TODO: This assumes that we're about to evaluate the component and process\n    // the update queue. However, there's an exception: SimpleMemoComponent\n    // sometimes bails out later in the begin phase. This indicates that we should\n    // move this assignment out of the common path and into each branch.\n\n\n    workInProgress.expirationTime = NoWork;\n\n    switch (workInProgress.tag) {\n      case IndeterminateComponent:\n        {\n          return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderExpirationTime);\n        }\n\n      case LazyComponent:\n        {\n          var elementType = workInProgress.elementType;\n          return mountLazyComponent(current, workInProgress, elementType, updateExpirationTime, renderExpirationTime);\n        }\n\n      case FunctionComponent:\n        {\n          var _Component = workInProgress.type;\n          var unresolvedProps = workInProgress.pendingProps;\n          var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps);\n          return updateFunctionComponent(current, workInProgress, _Component, resolvedProps, renderExpirationTime);\n        }\n\n      case ClassComponent:\n        {\n          var _Component2 = workInProgress.type;\n          var _unresolvedProps = workInProgress.pendingProps;\n\n          var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps);\n\n          return updateClassComponent(current, workInProgress, _Component2, _resolvedProps, renderExpirationTime);\n        }\n\n      case HostRoot:\n        return updateHostRoot(current, workInProgress, renderExpirationTime);\n\n      case HostComponent:\n        return updateHostComponent(current, workInProgress, renderExpirationTime);\n\n      case HostText:\n        return updateHostText(current, workInProgress);\n\n      case SuspenseComponent:\n        return updateSuspenseComponent(current, workInProgress, renderExpirationTime);\n\n      case HostPortal:\n        return updatePortalComponent(current, workInProgress, renderExpirationTime);\n\n      case ForwardRef:\n        {\n          var type = workInProgress.type;\n          var _unresolvedProps2 = workInProgress.pendingProps;\n\n          var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);\n\n          return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderExpirationTime);\n        }\n\n      case Fragment:\n        return updateFragment(current, workInProgress, renderExpirationTime);\n\n      case Mode:\n        return updateMode(current, workInProgress, renderExpirationTime);\n\n      case Profiler:\n        return updateProfiler(current, workInProgress, renderExpirationTime);\n\n      case ContextProvider:\n        return updateContextProvider(current, workInProgress, renderExpirationTime);\n\n      case ContextConsumer:\n        return updateContextConsumer(current, workInProgress, renderExpirationTime);\n\n      case MemoComponent:\n        {\n          var _type2 = workInProgress.type;\n          var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.\n\n          var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);\n\n          {\n            if (workInProgress.type !== workInProgress.elementType) {\n              var outerPropTypes = _type2.propTypes;\n\n              if (outerPropTypes) {\n                checkPropTypes_1(outerPropTypes, _resolvedProps3, // Resolved for outer only\n                'prop', getComponentName(_type2), getCurrentFiberStackInDev);\n              }\n            }\n          }\n\n          _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);\n          return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, updateExpirationTime, renderExpirationTime);\n        }\n\n      case SimpleMemoComponent:\n        {\n          return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, updateExpirationTime, renderExpirationTime);\n        }\n\n      case IncompleteClassComponent:\n        {\n          var _Component3 = workInProgress.type;\n          var _unresolvedProps4 = workInProgress.pendingProps;\n\n          var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4);\n\n          return mountIncompleteClassComponent(current, workInProgress, _Component3, _resolvedProps4, renderExpirationTime);\n        }\n\n      case SuspenseListComponent:\n        {\n          return updateSuspenseListComponent(current, workInProgress, renderExpirationTime);\n        }\n    }\n\n    {\n      {\n        throw Error( \"Unknown unit of work tag (\" + workInProgress.tag + \"). This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n\n  function markUpdate(workInProgress) {\n    // Tag the fiber with an update effect. This turns a Placement into\n    // a PlacementAndUpdate.\n    workInProgress.effectTag |= Update;\n  }\n\n  function markRef$1(workInProgress) {\n    workInProgress.effectTag |= Ref;\n  }\n\n  var appendAllChildren;\n  var updateHostContainer;\n  var updateHostComponent$1;\n  var updateHostText$1;\n\n  {\n    // Mutation mode\n    appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {\n      // We only have the top Fiber that was created but we need recurse down its\n      // children to find all the terminal nodes.\n      var node = workInProgress.child;\n\n      while (node !== null) {\n        if (node.tag === HostComponent || node.tag === HostText) {\n          appendInitialChild(parent, node.stateNode);\n        } else if (node.tag === HostPortal) ; else if (node.child !== null) {\n          node.child.return = node;\n          node = node.child;\n          continue;\n        }\n\n        if (node === workInProgress) {\n          return;\n        }\n\n        while (node.sibling === null) {\n          if (node.return === null || node.return === workInProgress) {\n            return;\n          }\n\n          node = node.return;\n        }\n\n        node.sibling.return = node.return;\n        node = node.sibling;\n      }\n    };\n\n    updateHostContainer = function (workInProgress) {// Noop\n    };\n\n    updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {\n      // If we have an alternate, that means this is an update and we need to\n      // schedule a side-effect to do the updates.\n      var oldProps = current.memoizedProps;\n\n      if (oldProps === newProps) {\n        // In mutation mode, this is sufficient for a bailout because\n        // we won't touch this node even if children changed.\n        return;\n      } // If we get updated because one of our children updated, we don't\n      // have newProps so we'll have to reuse them.\n      // TODO: Split the update API as separate for the props vs. children.\n      // Even better would be if children weren't special cased at all tho.\n\n\n      var instance = workInProgress.stateNode;\n      var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host\n      // component is hitting the resume path. Figure out why. Possibly\n      // related to `hidden`.\n\n      var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.\n\n      workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there\n      // is a new ref we mark this as an update. All the work is done in commitWork.\n\n      if (updatePayload) {\n        markUpdate(workInProgress);\n      }\n    };\n\n    updateHostText$1 = function (current, workInProgress, oldText, newText) {\n      // If the text differs, mark it as an update. All the work in done in commitWork.\n      if (oldText !== newText) {\n        markUpdate(workInProgress);\n      }\n    };\n  }\n\n  function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n    switch (renderState.tailMode) {\n      case 'hidden':\n        {\n          // Any insertions at the end of the tail list after this point\n          // should be invisible. If there are already mounted boundaries\n          // anything before them are not considered for collapsing.\n          // Therefore we need to go through the whole tail to find if\n          // there are any.\n          var tailNode = renderState.tail;\n          var lastTailNode = null;\n\n          while (tailNode !== null) {\n            if (tailNode.alternate !== null) {\n              lastTailNode = tailNode;\n            }\n\n            tailNode = tailNode.sibling;\n          } // Next we're simply going to delete all insertions after the\n          // last rendered item.\n\n\n          if (lastTailNode === null) {\n            // All remaining items in the tail are insertions.\n            renderState.tail = null;\n          } else {\n            // Detach the insertion after the last node that was already\n            // inserted.\n            lastTailNode.sibling = null;\n          }\n\n          break;\n        }\n\n      case 'collapsed':\n        {\n          // Any insertions at the end of the tail list after this point\n          // should be invisible. If there are already mounted boundaries\n          // anything before them are not considered for collapsing.\n          // Therefore we need to go through the whole tail to find if\n          // there are any.\n          var _tailNode = renderState.tail;\n          var _lastTailNode = null;\n\n          while (_tailNode !== null) {\n            if (_tailNode.alternate !== null) {\n              _lastTailNode = _tailNode;\n            }\n\n            _tailNode = _tailNode.sibling;\n          } // Next we're simply going to delete all insertions after the\n          // last rendered item.\n\n\n          if (_lastTailNode === null) {\n            // All remaining items in the tail are insertions.\n            if (!hasRenderedATailFallback && renderState.tail !== null) {\n              // We suspended during the head. We want to show at least one\n              // row at the tail. So we'll keep on and cut off the rest.\n              renderState.tail.sibling = null;\n            } else {\n              renderState.tail = null;\n            }\n          } else {\n            // Detach the insertion after the last node that was already\n            // inserted.\n            _lastTailNode.sibling = null;\n          }\n\n          break;\n        }\n    }\n  }\n\n  function completeWork(current, workInProgress, renderExpirationTime) {\n    var newProps = workInProgress.pendingProps;\n\n    switch (workInProgress.tag) {\n      case IndeterminateComponent:\n      case LazyComponent:\n      case SimpleMemoComponent:\n      case FunctionComponent:\n      case ForwardRef:\n      case Fragment:\n      case Mode:\n      case Profiler:\n      case ContextConsumer:\n      case MemoComponent:\n        return null;\n\n      case ClassComponent:\n        {\n          var Component = workInProgress.type;\n\n          if (isContextProvider(Component)) {\n            popContext(workInProgress);\n          }\n\n          return null;\n        }\n\n      case HostRoot:\n        {\n          popHostContainer(workInProgress);\n          popTopLevelContextObject(workInProgress);\n          var fiberRoot = workInProgress.stateNode;\n\n          if (fiberRoot.pendingContext) {\n            fiberRoot.context = fiberRoot.pendingContext;\n            fiberRoot.pendingContext = null;\n          }\n\n          if (current === null || current.child === null) {\n            // If we hydrated, pop so that we can delete any remaining children\n            // that weren't hydrated.\n            var wasHydrated = popHydrationState(workInProgress);\n\n            if (wasHydrated) {\n              // If we hydrated, then we'll need to schedule an update for\n              // the commit side-effects on the root.\n              markUpdate(workInProgress);\n            }\n          }\n\n          updateHostContainer(workInProgress);\n          return null;\n        }\n\n      case HostComponent:\n        {\n          popHostContext(workInProgress);\n          var rootContainerInstance = getRootHostContainer();\n          var type = workInProgress.type;\n\n          if (current !== null && workInProgress.stateNode != null) {\n            updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);\n\n            if (current.ref !== workInProgress.ref) {\n              markRef$1(workInProgress);\n            }\n          } else {\n            if (!newProps) {\n              if (!(workInProgress.stateNode !== null)) {\n                {\n                  throw Error( \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\" );\n                }\n              } // This can happen when we abort work.\n\n\n              return null;\n            }\n\n            var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context\n            // \"stack\" as the parent. Then append children as we go in beginWork\n            // or completeWork depending on whether we want to add them top->down or\n            // bottom->up. Top->down is faster in IE11.\n\n            var _wasHydrated = popHydrationState(workInProgress);\n\n            if (_wasHydrated) {\n              // TODO: Move this and createInstance step into the beginPhase\n              // to consolidate.\n              if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {\n                // If changes to the hydrated node need to be applied at the\n                // commit-phase we mark this as such.\n                markUpdate(workInProgress);\n              }\n            } else {\n              var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);\n              appendAllChildren(instance, workInProgress, false, false); // This needs to be set before we mount Flare event listeners\n\n              workInProgress.stateNode = instance;\n              // (eg DOM renderer supports auto-focus for certain elements).\n              // Make sure such renderers get scheduled for later work.\n\n\n              if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {\n                markUpdate(workInProgress);\n              }\n            }\n\n            if (workInProgress.ref !== null) {\n              // If there is a ref on a host node we need to schedule a callback\n              markRef$1(workInProgress);\n            }\n          }\n\n          return null;\n        }\n\n      case HostText:\n        {\n          var newText = newProps;\n\n          if (current && workInProgress.stateNode != null) {\n            var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need\n            // to schedule a side-effect to do the updates.\n\n            updateHostText$1(current, workInProgress, oldText, newText);\n          } else {\n            if (typeof newText !== 'string') {\n              if (!(workInProgress.stateNode !== null)) {\n                {\n                  throw Error( \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\" );\n                }\n              } // This can happen when we abort work.\n\n            }\n\n            var _rootContainerInstance = getRootHostContainer();\n\n            var _currentHostContext = getHostContext();\n\n            var _wasHydrated2 = popHydrationState(workInProgress);\n\n            if (_wasHydrated2) {\n              if (prepareToHydrateHostTextInstance(workInProgress)) {\n                markUpdate(workInProgress);\n              }\n            } else {\n              workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);\n            }\n          }\n\n          return null;\n        }\n\n      case SuspenseComponent:\n        {\n          popSuspenseContext(workInProgress);\n          var nextState = workInProgress.memoizedState;\n\n          if ((workInProgress.effectTag & DidCapture) !== NoEffect) {\n            // Something suspended. Re-render with the fallback children.\n            workInProgress.expirationTime = renderExpirationTime; // Do not reset the effect list.\n\n            return workInProgress;\n          }\n\n          var nextDidTimeout = nextState !== null;\n          var prevDidTimeout = false;\n\n          if (current === null) {\n            if (workInProgress.memoizedProps.fallback !== undefined) {\n              popHydrationState(workInProgress);\n            }\n          } else {\n            var prevState = current.memoizedState;\n            prevDidTimeout = prevState !== null;\n\n            if (!nextDidTimeout && prevState !== null) {\n              // We just switched from the fallback to the normal children.\n              // Delete the fallback.\n              // TODO: Would it be better to store the fallback fragment on\n              // the stateNode during the begin phase?\n              var currentFallbackChild = current.child.sibling;\n\n              if (currentFallbackChild !== null) {\n                // Deletions go at the beginning of the return fiber's effect list\n                var first = workInProgress.firstEffect;\n\n                if (first !== null) {\n                  workInProgress.firstEffect = currentFallbackChild;\n                  currentFallbackChild.nextEffect = first;\n                } else {\n                  workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChild;\n                  currentFallbackChild.nextEffect = null;\n                }\n\n                currentFallbackChild.effectTag = Deletion;\n              }\n            }\n          }\n\n          if (nextDidTimeout && !prevDidTimeout) {\n            // If this subtreee is running in blocking mode we can suspend,\n            // otherwise we won't suspend.\n            // TODO: This will still suspend a synchronous tree if anything\n            // in the concurrent tree already suspended during this render.\n            // This is a known bug.\n            if ((workInProgress.mode & BlockingMode) !== NoMode) {\n              // TODO: Move this back to throwException because this is too late\n              // if this is a large tree which is common for initial loads. We\n              // don't know if we should restart a render or not until we get\n              // this marker, and this is too late.\n              // If this render already had a ping or lower pri updates,\n              // and this is the first time we know we're going to suspend we\n              // should be able to immediately restart from within throwException.\n              var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true;\n\n              if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {\n                // If this was in an invisible tree or a new render, then showing\n                // this boundary is ok.\n                renderDidSuspend();\n              } else {\n                // Otherwise, we're going to have to hide content so we should\n                // suspend for longer if possible.\n                renderDidSuspendDelayIfPossible();\n              }\n            }\n          }\n\n          {\n            // TODO: Only schedule updates if these values are non equal, i.e. it changed.\n            if (nextDidTimeout || prevDidTimeout) {\n              // If this boundary just timed out, schedule an effect to attach a\n              // retry listener to the promise. This flag is also used to hide the\n              // primary children. In mutation mode, we also need the flag to\n              // *unhide* children that were previously hidden, so check if this\n              // is currently timed out, too.\n              workInProgress.effectTag |= Update;\n            }\n          }\n\n          return null;\n        }\n\n      case HostPortal:\n        popHostContainer(workInProgress);\n        updateHostContainer(workInProgress);\n        return null;\n\n      case ContextProvider:\n        // Pop provider fiber\n        popProvider(workInProgress);\n        return null;\n\n      case IncompleteClassComponent:\n        {\n          // Same as class component case. I put it down here so that the tags are\n          // sequential to ensure this switch is compiled to a jump table.\n          var _Component = workInProgress.type;\n\n          if (isContextProvider(_Component)) {\n            popContext(workInProgress);\n          }\n\n          return null;\n        }\n\n      case SuspenseListComponent:\n        {\n          popSuspenseContext(workInProgress);\n          var renderState = workInProgress.memoizedState;\n\n          if (renderState === null) {\n            // We're running in the default, \"independent\" mode.\n            // We don't do anything in this mode.\n            return null;\n          }\n\n          var didSuspendAlready = (workInProgress.effectTag & DidCapture) !== NoEffect;\n          var renderedTail = renderState.rendering;\n\n          if (renderedTail === null) {\n            // We just rendered the head.\n            if (!didSuspendAlready) {\n              // This is the first pass. We need to figure out if anything is still\n              // suspended in the rendered set.\n              // If new content unsuspended, but there's still some content that\n              // didn't. Then we need to do a second pass that forces everything\n              // to keep showing their fallbacks.\n              // We might be suspended if something in this render pass suspended, or\n              // something in the previous committed pass suspended. Otherwise,\n              // there's no chance so we can skip the expensive call to\n              // findFirstSuspended.\n              var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.effectTag & DidCapture) === NoEffect);\n\n              if (!cannotBeSuspended) {\n                var row = workInProgress.child;\n\n                while (row !== null) {\n                  var suspended = findFirstSuspended(row);\n\n                  if (suspended !== null) {\n                    didSuspendAlready = true;\n                    workInProgress.effectTag |= DidCapture;\n                    cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as\n                    // part of the second pass. In that case nothing will subscribe to\n                    // its thennables. Instead, we'll transfer its thennables to the\n                    // SuspenseList so that it can retry if they resolve.\n                    // There might be multiple of these in the list but since we're\n                    // going to wait for all of them anyway, it doesn't really matter\n                    // which ones gets to ping. In theory we could get clever and keep\n                    // track of how many dependencies remain but it gets tricky because\n                    // in the meantime, we can add/remove/change items and dependencies.\n                    // We might bail out of the loop before finding any but that\n                    // doesn't matter since that means that the other boundaries that\n                    // we did find already has their listeners attached.\n\n                    var newThennables = suspended.updateQueue;\n\n                    if (newThennables !== null) {\n                      workInProgress.updateQueue = newThennables;\n                      workInProgress.effectTag |= Update;\n                    } // Rerender the whole list, but this time, we'll force fallbacks\n                    // to stay in place.\n                    // Reset the effect list before doing the second pass since that's now invalid.\n\n\n                    if (renderState.lastEffect === null) {\n                      workInProgress.firstEffect = null;\n                    }\n\n                    workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state.\n\n                    resetChildFibers(workInProgress, renderExpirationTime); // Set up the Suspense Context to force suspense and immediately\n                    // rerender the children.\n\n                    pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback));\n                    return workInProgress.child;\n                  }\n\n                  row = row.sibling;\n                }\n              }\n            } else {\n              cutOffTailIfNeeded(renderState, false);\n            } // Next we're going to render the tail.\n\n          } else {\n            // Append the rendered row to the child list.\n            if (!didSuspendAlready) {\n              var _suspended = findFirstSuspended(renderedTail);\n\n              if (_suspended !== null) {\n                workInProgress.effectTag |= DidCapture;\n                didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't\n                // get lost if this row ends up dropped during a second pass.\n\n                var _newThennables = _suspended.updateQueue;\n\n                if (_newThennables !== null) {\n                  workInProgress.updateQueue = _newThennables;\n                  workInProgress.effectTag |= Update;\n                }\n\n                cutOffTailIfNeeded(renderState, true); // This might have been modified.\n\n                if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate) {\n                  // We need to delete the row we just rendered.\n                  // Reset the effect list to what it was before we rendered this\n                  // child. The nested children have already appended themselves.\n                  var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point.\n\n                  if (lastEffect !== null) {\n                    lastEffect.nextEffect = null;\n                  } // We're done.\n\n\n                  return null;\n                }\n              } else if ( // The time it took to render last row is greater than time until\n              // the expiration.\n              now() * 2 - renderState.renderingStartTime > renderState.tailExpiration && renderExpirationTime > Never) {\n                // We have now passed our CPU deadline and we'll just give up further\n                // attempts to render the main content and only render fallbacks.\n                // The assumption is that this is usually faster.\n                workInProgress.effectTag |= DidCapture;\n                didSuspendAlready = true;\n                cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this\n                // to get it started back up to attempt the next item. If we can show\n                // them, then they really have the same priority as this render.\n                // So we'll pick it back up the very next render pass once we've had\n                // an opportunity to yield for paint.\n\n                var nextPriority = renderExpirationTime - 1;\n                workInProgress.expirationTime = workInProgress.childExpirationTime = nextPriority;\n\n                {\n                  markSpawnedWork(nextPriority);\n                }\n              }\n            }\n\n            if (renderState.isBackwards) {\n              // The effect list of the backwards tail will have been added\n              // to the end. This breaks the guarantee that life-cycles fire in\n              // sibling order but that isn't a strong guarantee promised by React.\n              // Especially since these might also just pop in during future commits.\n              // Append to the beginning of the list.\n              renderedTail.sibling = workInProgress.child;\n              workInProgress.child = renderedTail;\n            } else {\n              var previousSibling = renderState.last;\n\n              if (previousSibling !== null) {\n                previousSibling.sibling = renderedTail;\n              } else {\n                workInProgress.child = renderedTail;\n              }\n\n              renderState.last = renderedTail;\n            }\n          }\n\n          if (renderState.tail !== null) {\n            // We still have tail rows to render.\n            if (renderState.tailExpiration === 0) {\n              // Heuristic for how long we're willing to spend rendering rows\n              // until we just give up and show what we have so far.\n              var TAIL_EXPIRATION_TIMEOUT_MS = 500;\n              renderState.tailExpiration = now() + TAIL_EXPIRATION_TIMEOUT_MS; // TODO: This is meant to mimic the train model or JND but this\n              // is a per component value. It should really be since the start\n              // of the total render or last commit. Consider using something like\n              // globalMostRecentFallbackTime. That doesn't account for being\n              // suspended for part of the time or when it's a new render.\n              // It should probably use a global start time value instead.\n            } // Pop a row.\n\n\n            var next = renderState.tail;\n            renderState.rendering = next;\n            renderState.tail = next.sibling;\n            renderState.lastEffect = workInProgress.lastEffect;\n            renderState.renderingStartTime = now();\n            next.sibling = null; // Restore the context.\n            // TODO: We can probably just avoid popping it instead and only\n            // setting it the first time we go from not suspended to suspended.\n\n            var suspenseContext = suspenseStackCursor.current;\n\n            if (didSuspendAlready) {\n              suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);\n            } else {\n              suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);\n            }\n\n            pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.\n\n            return next;\n          }\n\n          return null;\n        }\n    }\n\n    {\n      {\n        throw Error( \"Unknown unit of work tag (\" + workInProgress.tag + \"). This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n\n  function unwindWork(workInProgress, renderExpirationTime) {\n    switch (workInProgress.tag) {\n      case ClassComponent:\n        {\n          var Component = workInProgress.type;\n\n          if (isContextProvider(Component)) {\n            popContext(workInProgress);\n          }\n\n          var effectTag = workInProgress.effectTag;\n\n          if (effectTag & ShouldCapture) {\n            workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture;\n            return workInProgress;\n          }\n\n          return null;\n        }\n\n      case HostRoot:\n        {\n          popHostContainer(workInProgress);\n          popTopLevelContextObject(workInProgress);\n          var _effectTag = workInProgress.effectTag;\n\n          if (!((_effectTag & DidCapture) === NoEffect)) {\n            {\n              throw Error( \"The root failed to unmount after an error. This is likely a bug in React. Please file an issue.\" );\n            }\n          }\n\n          workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture;\n          return workInProgress;\n        }\n\n      case HostComponent:\n        {\n          // TODO: popHydrationState\n          popHostContext(workInProgress);\n          return null;\n        }\n\n      case SuspenseComponent:\n        {\n          popSuspenseContext(workInProgress);\n\n          var _effectTag2 = workInProgress.effectTag;\n\n          if (_effectTag2 & ShouldCapture) {\n            workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.\n\n            return workInProgress;\n          }\n\n          return null;\n        }\n\n      case SuspenseListComponent:\n        {\n          popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been\n          // caught by a nested boundary. If not, it should bubble through.\n\n          return null;\n        }\n\n      case HostPortal:\n        popHostContainer(workInProgress);\n        return null;\n\n      case ContextProvider:\n        popProvider(workInProgress);\n        return null;\n\n      default:\n        return null;\n    }\n  }\n\n  function unwindInterruptedWork(interruptedWork) {\n    switch (interruptedWork.tag) {\n      case ClassComponent:\n        {\n          var childContextTypes = interruptedWork.type.childContextTypes;\n\n          if (childContextTypes !== null && childContextTypes !== undefined) {\n            popContext(interruptedWork);\n          }\n\n          break;\n        }\n\n      case HostRoot:\n        {\n          popHostContainer(interruptedWork);\n          popTopLevelContextObject(interruptedWork);\n          break;\n        }\n\n      case HostComponent:\n        {\n          popHostContext(interruptedWork);\n          break;\n        }\n\n      case HostPortal:\n        popHostContainer(interruptedWork);\n        break;\n\n      case SuspenseComponent:\n        popSuspenseContext(interruptedWork);\n        break;\n\n      case SuspenseListComponent:\n        popSuspenseContext(interruptedWork);\n        break;\n\n      case ContextProvider:\n        popProvider(interruptedWork);\n        break;\n    }\n  }\n\n  function createCapturedValue(value, source) {\n    // If the value is an error, call this function immediately after it is thrown\n    // so the stack is accurate.\n    return {\n      value: value,\n      source: source,\n      stack: getStackByFiberInDevAndProd(source)\n    };\n  }\n\n  function logCapturedError(capturedError) {\n\n    var error = capturedError.error;\n\n    {\n      var componentName = capturedError.componentName,\n          componentStack = capturedError.componentStack,\n          errorBoundaryName = capturedError.errorBoundaryName,\n          errorBoundaryFound = capturedError.errorBoundaryFound,\n          willRetry = capturedError.willRetry; // Browsers support silencing uncaught errors by calling\n      // `preventDefault()` in window `error` handler.\n      // We record this information as an expando on the error.\n\n      if (error != null && error._suppressLogging) {\n        if (errorBoundaryFound && willRetry) {\n          // The error is recoverable and was silenced.\n          // Ignore it and don't print the stack addendum.\n          // This is handy for testing error boundaries without noise.\n          return;\n        } // The error is fatal. Since the silencing might have\n        // been accidental, we'll surface it anyway.\n        // However, the browser would have silenced the original error\n        // so we'll print it first, and then print the stack addendum.\n\n\n        console['error'](error); // Don't transform to our wrapper\n        // For a more detailed description of this block, see:\n        // https://github.com/facebook/react/pull/13384\n      }\n\n      var componentNameMessage = componentName ? \"The above error occurred in the <\" + componentName + \"> component:\" : 'The above error occurred in one of your React components:';\n      var errorBoundaryMessage; // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.\n\n      if (errorBoundaryFound && errorBoundaryName) {\n        if (willRetry) {\n          errorBoundaryMessage = \"React will try to recreate this component tree from scratch \" + (\"using the error boundary you provided, \" + errorBoundaryName + \".\");\n        } else {\n          errorBoundaryMessage = \"This error was initially handled by the error boundary \" + errorBoundaryName + \".\\n\" + \"Recreating the tree from scratch failed so React will unmount the tree.\";\n        }\n      } else {\n        errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.';\n      }\n\n      var combinedMessage = \"\" + componentNameMessage + componentStack + \"\\n\\n\" + (\"\" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.\n      // We don't include the original error message and JS stack because the browser\n      // has already printed it. Even if the application swallows the error, it is still\n      // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.\n\n      console['error'](combinedMessage); // Don't transform to our wrapper\n    }\n  }\n\n  var didWarnAboutUndefinedSnapshotBeforeUpdate = null;\n\n  {\n    didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();\n  }\n\n  var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;\n  function logError(boundary, errorInfo) {\n    var source = errorInfo.source;\n    var stack = errorInfo.stack;\n\n    if (stack === null && source !== null) {\n      stack = getStackByFiberInDevAndProd(source);\n    }\n\n    var capturedError = {\n      componentName: source !== null ? getComponentName(source.type) : null,\n      componentStack: stack !== null ? stack : '',\n      error: errorInfo.value,\n      errorBoundary: null,\n      errorBoundaryName: null,\n      errorBoundaryFound: false,\n      willRetry: false\n    };\n\n    if (boundary !== null && boundary.tag === ClassComponent) {\n      capturedError.errorBoundary = boundary.stateNode;\n      capturedError.errorBoundaryName = getComponentName(boundary.type);\n      capturedError.errorBoundaryFound = true;\n      capturedError.willRetry = true;\n    }\n\n    try {\n      logCapturedError(capturedError);\n    } catch (e) {\n      // This method must not throw, or React internal state will get messed up.\n      // If console.error is overridden, or logCapturedError() shows a dialog that throws,\n      // we want to report this error outside of the normal stack as a last resort.\n      // https://github.com/facebook/react/issues/13188\n      setTimeout(function () {\n        throw e;\n      });\n    }\n  }\n\n  var callComponentWillUnmountWithTimer = function (current, instance) {\n    startPhaseTimer(current, 'componentWillUnmount');\n    instance.props = current.memoizedProps;\n    instance.state = current.memoizedState;\n    instance.componentWillUnmount();\n    stopPhaseTimer();\n  }; // Capture errors so they don't interrupt unmounting.\n\n\n  function safelyCallComponentWillUnmount(current, instance) {\n    {\n      invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current, instance);\n\n      if (hasCaughtError()) {\n        var unmountError = clearCaughtError();\n        captureCommitPhaseError(current, unmountError);\n      }\n    }\n  }\n\n  function safelyDetachRef(current) {\n    var ref = current.ref;\n\n    if (ref !== null) {\n      if (typeof ref === 'function') {\n        {\n          invokeGuardedCallback(null, ref, null, null);\n\n          if (hasCaughtError()) {\n            var refError = clearCaughtError();\n            captureCommitPhaseError(current, refError);\n          }\n        }\n      } else {\n        ref.current = null;\n      }\n    }\n  }\n\n  function safelyCallDestroy(current, destroy) {\n    {\n      invokeGuardedCallback(null, destroy, null);\n\n      if (hasCaughtError()) {\n        var error = clearCaughtError();\n        captureCommitPhaseError(current, error);\n      }\n    }\n  }\n\n  function commitBeforeMutationLifeCycles(current, finishedWork) {\n    switch (finishedWork.tag) {\n      case FunctionComponent:\n      case ForwardRef:\n      case SimpleMemoComponent:\n      case Block:\n        {\n          return;\n        }\n\n      case ClassComponent:\n        {\n          if (finishedWork.effectTag & Snapshot) {\n            if (current !== null) {\n              var prevProps = current.memoizedProps;\n              var prevState = current.memoizedState;\n              startPhaseTimer(finishedWork, 'getSnapshotBeforeUpdate');\n              var instance = finishedWork.stateNode; // We could update instance props and state here,\n              // but instead we rely on them being set during last render.\n              // TODO: revisit this when we implement resuming.\n\n              {\n                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                  if (instance.props !== finishedWork.memoizedProps) {\n                    error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                  }\n\n                  if (instance.state !== finishedWork.memoizedState) {\n                    error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                  }\n                }\n              }\n\n              var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);\n\n              {\n                var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;\n\n                if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {\n                  didWarnSet.add(finishedWork.type);\n\n                  error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type));\n                }\n              }\n\n              instance.__reactInternalSnapshotBeforeUpdate = snapshot;\n              stopPhaseTimer();\n            }\n          }\n\n          return;\n        }\n\n      case HostRoot:\n      case HostComponent:\n      case HostText:\n      case HostPortal:\n      case IncompleteClassComponent:\n        // Nothing to do for these component types\n        return;\n    }\n\n    {\n      {\n        throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n\n  function commitHookEffectListUnmount(tag, finishedWork) {\n    var updateQueue = finishedWork.updateQueue;\n    var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;\n\n    if (lastEffect !== null) {\n      var firstEffect = lastEffect.next;\n      var effect = firstEffect;\n\n      do {\n        if ((effect.tag & tag) === tag) {\n          // Unmount\n          var destroy = effect.destroy;\n          effect.destroy = undefined;\n\n          if (destroy !== undefined) {\n            destroy();\n          }\n        }\n\n        effect = effect.next;\n      } while (effect !== firstEffect);\n    }\n  }\n\n  function commitHookEffectListMount(tag, finishedWork) {\n    var updateQueue = finishedWork.updateQueue;\n    var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;\n\n    if (lastEffect !== null) {\n      var firstEffect = lastEffect.next;\n      var effect = firstEffect;\n\n      do {\n        if ((effect.tag & tag) === tag) {\n          // Mount\n          var create = effect.create;\n          effect.destroy = create();\n\n          {\n            var destroy = effect.destroy;\n\n            if (destroy !== undefined && typeof destroy !== 'function') {\n              var addendum = void 0;\n\n              if (destroy === null) {\n                addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';\n              } else if (typeof destroy.then === 'function') {\n                addendum = '\\n\\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\\n\\n' + 'useEffect(() => {\\n' + '  async function fetchData() {\\n' + '    // You can await here\\n' + '    const response = await MyAPI.getData(someId);\\n' + '    // ...\\n' + '  }\\n' + '  fetchData();\\n' + \"}, [someId]); // Or [] if effect doesn't need props or state\\n\\n\" + 'Learn more about data fetching with Hooks: https://fb.me/react-hooks-data-fetching';\n              } else {\n                addendum = ' You returned: ' + destroy;\n              }\n\n              error('An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s%s', addendum, getStackByFiberInDevAndProd(finishedWork));\n            }\n          }\n        }\n\n        effect = effect.next;\n      } while (effect !== firstEffect);\n    }\n  }\n\n  function commitPassiveHookEffects(finishedWork) {\n    if ((finishedWork.effectTag & Passive) !== NoEffect) {\n      switch (finishedWork.tag) {\n        case FunctionComponent:\n        case ForwardRef:\n        case SimpleMemoComponent:\n        case Block:\n          {\n            // TODO (#17945) We should call all passive destroy functions (for all fibers)\n            // before calling any create functions. The current approach only serializes\n            // these for a single fiber.\n            commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork);\n            commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);\n            break;\n          }\n      }\n    }\n  }\n\n  function commitLifeCycles(finishedRoot, current, finishedWork, committedExpirationTime) {\n    switch (finishedWork.tag) {\n      case FunctionComponent:\n      case ForwardRef:\n      case SimpleMemoComponent:\n      case Block:\n        {\n          // At this point layout effects have already been destroyed (during mutation phase).\n          // This is done to prevent sibling component effects from interfering with each other,\n          // e.g. a destroy function in one component should never override a ref set\n          // by a create function in another component during the same commit.\n          commitHookEffectListMount(Layout | HasEffect, finishedWork);\n\n          return;\n        }\n\n      case ClassComponent:\n        {\n          var instance = finishedWork.stateNode;\n\n          if (finishedWork.effectTag & Update) {\n            if (current === null) {\n              startPhaseTimer(finishedWork, 'componentDidMount'); // We could update instance props and state here,\n              // but instead we rely on them being set during last render.\n              // TODO: revisit this when we implement resuming.\n\n              {\n                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                  if (instance.props !== finishedWork.memoizedProps) {\n                    error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                  }\n\n                  if (instance.state !== finishedWork.memoizedState) {\n                    error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                  }\n                }\n              }\n\n              instance.componentDidMount();\n              stopPhaseTimer();\n            } else {\n              var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps);\n              var prevState = current.memoizedState;\n              startPhaseTimer(finishedWork, 'componentDidUpdate'); // We could update instance props and state here,\n              // but instead we rely on them being set during last render.\n              // TODO: revisit this when we implement resuming.\n\n              {\n                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                  if (instance.props !== finishedWork.memoizedProps) {\n                    error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                  }\n\n                  if (instance.state !== finishedWork.memoizedState) {\n                    error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                  }\n                }\n              }\n\n              instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);\n              stopPhaseTimer();\n            }\n          }\n\n          var updateQueue = finishedWork.updateQueue;\n\n          if (updateQueue !== null) {\n            {\n              if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {\n                if (instance.props !== finishedWork.memoizedProps) {\n                  error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n\n                if (instance.state !== finishedWork.memoizedState) {\n                  error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance');\n                }\n              }\n            } // We could update instance props and state here,\n            // but instead we rely on them being set during last render.\n            // TODO: revisit this when we implement resuming.\n\n\n            commitUpdateQueue(finishedWork, updateQueue, instance);\n          }\n\n          return;\n        }\n\n      case HostRoot:\n        {\n          var _updateQueue = finishedWork.updateQueue;\n\n          if (_updateQueue !== null) {\n            var _instance = null;\n\n            if (finishedWork.child !== null) {\n              switch (finishedWork.child.tag) {\n                case HostComponent:\n                  _instance = getPublicInstance(finishedWork.child.stateNode);\n                  break;\n\n                case ClassComponent:\n                  _instance = finishedWork.child.stateNode;\n                  break;\n              }\n            }\n\n            commitUpdateQueue(finishedWork, _updateQueue, _instance);\n          }\n\n          return;\n        }\n\n      case HostComponent:\n        {\n          var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted\n          // (eg DOM renderer may schedule auto-focus for inputs and form controls).\n          // These effects should only be committed when components are first mounted,\n          // aka when there is no current/alternate.\n\n          if (current === null && finishedWork.effectTag & Update) {\n            var type = finishedWork.type;\n            var props = finishedWork.memoizedProps;\n            commitMount(_instance2, type, props);\n          }\n\n          return;\n        }\n\n      case HostText:\n        {\n          // We have no life-cycles associated with text.\n          return;\n        }\n\n      case HostPortal:\n        {\n          // We have no life-cycles associated with portals.\n          return;\n        }\n\n      case Profiler:\n        {\n          {\n            var onRender = finishedWork.memoizedProps.onRender;\n\n            if (typeof onRender === 'function') {\n              {\n                onRender(finishedWork.memoizedProps.id, current === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, getCommitTime(), finishedRoot.memoizedInteractions);\n              }\n            }\n          }\n\n          return;\n        }\n\n      case SuspenseComponent:\n        {\n          commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n          return;\n        }\n\n      case SuspenseListComponent:\n      case IncompleteClassComponent:\n      case FundamentalComponent:\n      case ScopeComponent:\n        return;\n    }\n\n    {\n      {\n        throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n\n  function hideOrUnhideAllChildren(finishedWork, isHidden) {\n    {\n      // We only have the top Fiber that was inserted but we need to recurse down its\n      // children to find all the terminal nodes.\n      var node = finishedWork;\n\n      while (true) {\n        if (node.tag === HostComponent) {\n          var instance = node.stateNode;\n\n          if (isHidden) {\n            hideInstance(instance);\n          } else {\n            unhideInstance(node.stateNode, node.memoizedProps);\n          }\n        } else if (node.tag === HostText) {\n          var _instance3 = node.stateNode;\n\n          if (isHidden) {\n            hideTextInstance(_instance3);\n          } else {\n            unhideTextInstance(_instance3, node.memoizedProps);\n          }\n        } else if (node.tag === SuspenseComponent && node.memoizedState !== null && node.memoizedState.dehydrated === null) {\n          // Found a nested Suspense component that timed out. Skip over the\n          // primary child fragment, which should remain hidden.\n          var fallbackChildFragment = node.child.sibling;\n          fallbackChildFragment.return = node;\n          node = fallbackChildFragment;\n          continue;\n        } else if (node.child !== null) {\n          node.child.return = node;\n          node = node.child;\n          continue;\n        }\n\n        if (node === finishedWork) {\n          return;\n        }\n\n        while (node.sibling === null) {\n          if (node.return === null || node.return === finishedWork) {\n            return;\n          }\n\n          node = node.return;\n        }\n\n        node.sibling.return = node.return;\n        node = node.sibling;\n      }\n    }\n  }\n\n  function commitAttachRef(finishedWork) {\n    var ref = finishedWork.ref;\n\n    if (ref !== null) {\n      var instance = finishedWork.stateNode;\n      var instanceToUse;\n\n      switch (finishedWork.tag) {\n        case HostComponent:\n          instanceToUse = getPublicInstance(instance);\n          break;\n\n        default:\n          instanceToUse = instance;\n      } // Moved outside to ensure DCE works with this flag\n\n      if (typeof ref === 'function') {\n        ref(instanceToUse);\n      } else {\n        {\n          if (!ref.hasOwnProperty('current')) {\n            error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().%s', getComponentName(finishedWork.type), getStackByFiberInDevAndProd(finishedWork));\n          }\n        }\n\n        ref.current = instanceToUse;\n      }\n    }\n  }\n\n  function commitDetachRef(current) {\n    var currentRef = current.ref;\n\n    if (currentRef !== null) {\n      if (typeof currentRef === 'function') {\n        currentRef(null);\n      } else {\n        currentRef.current = null;\n      }\n    }\n  } // User-originating errors (lifecycles and refs) should not interrupt\n  // deletion, so don't let them throw. Host-originating errors should\n  // interrupt deletion, so it's okay\n\n\n  function commitUnmount(finishedRoot, current, renderPriorityLevel) {\n    onCommitUnmount(current);\n\n    switch (current.tag) {\n      case FunctionComponent:\n      case ForwardRef:\n      case MemoComponent:\n      case SimpleMemoComponent:\n      case Block:\n        {\n          var updateQueue = current.updateQueue;\n\n          if (updateQueue !== null) {\n            var lastEffect = updateQueue.lastEffect;\n\n            if (lastEffect !== null) {\n              var firstEffect = lastEffect.next;\n\n              {\n                // When the owner fiber is deleted, the destroy function of a passive\n                // effect hook is called during the synchronous commit phase. This is\n                // a concession to implementation complexity. Calling it in the\n                // passive effect phase (like they usually are, when dependencies\n                // change during an update) would require either traversing the\n                // children of the deleted fiber again, or including unmount effects\n                // as part of the fiber effect list.\n                //\n                // Because this is during the sync commit phase, we need to change\n                // the priority.\n                //\n                // TODO: Reconsider this implementation trade off.\n                var priorityLevel = renderPriorityLevel > NormalPriority ? NormalPriority : renderPriorityLevel;\n                runWithPriority$1(priorityLevel, function () {\n                  var effect = firstEffect;\n\n                  do {\n                    var _destroy = effect.destroy;\n\n                    if (_destroy !== undefined) {\n                      safelyCallDestroy(current, _destroy);\n                    }\n\n                    effect = effect.next;\n                  } while (effect !== firstEffect);\n                });\n              }\n            }\n          }\n\n          return;\n        }\n\n      case ClassComponent:\n        {\n          safelyDetachRef(current);\n          var instance = current.stateNode;\n\n          if (typeof instance.componentWillUnmount === 'function') {\n            safelyCallComponentWillUnmount(current, instance);\n          }\n\n          return;\n        }\n\n      case HostComponent:\n        {\n\n          safelyDetachRef(current);\n          return;\n        }\n\n      case HostPortal:\n        {\n          // TODO: this is recursive.\n          // We are also not using this parent because\n          // the portal will get pushed immediately.\n          {\n            unmountHostComponents(finishedRoot, current, renderPriorityLevel);\n          }\n\n          return;\n        }\n\n      case FundamentalComponent:\n        {\n\n          return;\n        }\n\n      case DehydratedFragment:\n        {\n\n          return;\n        }\n\n      case ScopeComponent:\n        {\n\n          return;\n        }\n    }\n  }\n\n  function commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) {\n    // While we're inside a removed host node we don't want to call\n    // removeChild on the inner nodes because they're removed by the top\n    // call anyway. We also want to call componentWillUnmount on all\n    // composites before this host node is removed from the tree. Therefore\n    // we do an inner loop while we're still inside the host node.\n    var node = root;\n\n    while (true) {\n      commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because they may contain more composite or host nodes.\n      // Skip portals because commitUnmount() currently visits them recursively.\n\n      if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above.\n      // If we don't use mutation we drill down into portals here instead.\n       node.tag !== HostPortal)) {\n        node.child.return = node;\n        node = node.child;\n        continue;\n      }\n\n      if (node === root) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === root) {\n          return;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n\n  function detachFiber(current) {\n    var alternate = current.alternate; // Cut off the return pointers to disconnect it from the tree. Ideally, we\n    // should clear the child pointer of the parent alternate to let this\n    // get GC:ed but we don't know which for sure which parent is the current\n    // one so we'll settle for GC:ing the subtree of this child. This child\n    // itself will be GC:ed when the parent updates the next time.\n\n    current.return = null;\n    current.child = null;\n    current.memoizedState = null;\n    current.updateQueue = null;\n    current.dependencies = null;\n    current.alternate = null;\n    current.firstEffect = null;\n    current.lastEffect = null;\n    current.pendingProps = null;\n    current.memoizedProps = null;\n    current.stateNode = null;\n\n    if (alternate !== null) {\n      detachFiber(alternate);\n    }\n  }\n\n  function getHostParentFiber(fiber) {\n    var parent = fiber.return;\n\n    while (parent !== null) {\n      if (isHostParent(parent)) {\n        return parent;\n      }\n\n      parent = parent.return;\n    }\n\n    {\n      {\n        throw Error( \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n\n  function isHostParent(fiber) {\n    return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;\n  }\n\n  function getHostSibling(fiber) {\n    // We're going to search forward into the tree until we find a sibling host\n    // node. Unfortunately, if multiple insertions are done in a row we have to\n    // search past them. This leads to exponential search for the next sibling.\n    // TODO: Find a more efficient way to do this.\n    var node = fiber;\n\n    siblings: while (true) {\n      // If we didn't find anything, let's try the next sibling.\n      while (node.sibling === null) {\n        if (node.return === null || isHostParent(node.return)) {\n          // If we pop out of the root or hit the parent the fiber we are the\n          // last sibling.\n          return null;\n        }\n\n        node = node.return;\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n\n      while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {\n        // If it is not host node and, we might have a host node inside it.\n        // Try to search down until we find one.\n        if (node.effectTag & Placement) {\n          // If we don't have a child, try the siblings instead.\n          continue siblings;\n        } // If we don't have a child, try the siblings instead.\n        // We also skip portals because they are not part of this host tree.\n\n\n        if (node.child === null || node.tag === HostPortal) {\n          continue siblings;\n        } else {\n          node.child.return = node;\n          node = node.child;\n        }\n      } // Check if this host node is stable or about to be placed.\n\n\n      if (!(node.effectTag & Placement)) {\n        // Found it!\n        return node.stateNode;\n      }\n    }\n  }\n\n  function commitPlacement(finishedWork) {\n\n\n    var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.\n\n    var parent;\n    var isContainer;\n    var parentStateNode = parentFiber.stateNode;\n\n    switch (parentFiber.tag) {\n      case HostComponent:\n        parent = parentStateNode;\n        isContainer = false;\n        break;\n\n      case HostRoot:\n        parent = parentStateNode.containerInfo;\n        isContainer = true;\n        break;\n\n      case HostPortal:\n        parent = parentStateNode.containerInfo;\n        isContainer = true;\n        break;\n\n      case FundamentalComponent:\n\n      // eslint-disable-next-line-no-fallthrough\n\n      default:\n        {\n          {\n            throw Error( \"Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n\n    }\n\n    if (parentFiber.effectTag & ContentReset) {\n      // Reset the text content of the parent before doing any insertions\n      resetTextContent(parent); // Clear ContentReset from the effect tag\n\n      parentFiber.effectTag &= ~ContentReset;\n    }\n\n    var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its\n    // children to find all the terminal nodes.\n\n    if (isContainer) {\n      insertOrAppendPlacementNodeIntoContainer(finishedWork, before, parent);\n    } else {\n      insertOrAppendPlacementNode(finishedWork, before, parent);\n    }\n  }\n\n  function insertOrAppendPlacementNodeIntoContainer(node, before, parent) {\n    var tag = node.tag;\n    var isHost = tag === HostComponent || tag === HostText;\n\n    if (isHost || enableFundamentalAPI ) {\n      var stateNode = isHost ? node.stateNode : node.stateNode.instance;\n\n      if (before) {\n        insertInContainerBefore(parent, stateNode, before);\n      } else {\n        appendChildToContainer(parent, stateNode);\n      }\n    } else if (tag === HostPortal) ; else {\n      var child = node.child;\n\n      if (child !== null) {\n        insertOrAppendPlacementNodeIntoContainer(child, before, parent);\n        var sibling = child.sibling;\n\n        while (sibling !== null) {\n          insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);\n          sibling = sibling.sibling;\n        }\n      }\n    }\n  }\n\n  function insertOrAppendPlacementNode(node, before, parent) {\n    var tag = node.tag;\n    var isHost = tag === HostComponent || tag === HostText;\n\n    if (isHost || enableFundamentalAPI ) {\n      var stateNode = isHost ? node.stateNode : node.stateNode.instance;\n\n      if (before) {\n        insertBefore(parent, stateNode, before);\n      } else {\n        appendChild(parent, stateNode);\n      }\n    } else if (tag === HostPortal) ; else {\n      var child = node.child;\n\n      if (child !== null) {\n        insertOrAppendPlacementNode(child, before, parent);\n        var sibling = child.sibling;\n\n        while (sibling !== null) {\n          insertOrAppendPlacementNode(sibling, before, parent);\n          sibling = sibling.sibling;\n        }\n      }\n    }\n  }\n\n  function unmountHostComponents(finishedRoot, current, renderPriorityLevel) {\n    // We only have the top Fiber that was deleted but we need to recurse down its\n    // children to find all the terminal nodes.\n    var node = current; // Each iteration, currentParent is populated with node's host parent if not\n    // currentParentIsValid.\n\n    var currentParentIsValid = false; // Note: these two variables *must* always be updated together.\n\n    var currentParent;\n    var currentParentIsContainer;\n\n    while (true) {\n      if (!currentParentIsValid) {\n        var parent = node.return;\n\n        findParent: while (true) {\n          if (!(parent !== null)) {\n            {\n              throw Error( \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\" );\n            }\n          }\n\n          var parentStateNode = parent.stateNode;\n\n          switch (parent.tag) {\n            case HostComponent:\n              currentParent = parentStateNode;\n              currentParentIsContainer = false;\n              break findParent;\n\n            case HostRoot:\n              currentParent = parentStateNode.containerInfo;\n              currentParentIsContainer = true;\n              break findParent;\n\n            case HostPortal:\n              currentParent = parentStateNode.containerInfo;\n              currentParentIsContainer = true;\n              break findParent;\n\n          }\n\n          parent = parent.return;\n        }\n\n        currentParentIsValid = true;\n      }\n\n      if (node.tag === HostComponent || node.tag === HostText) {\n        commitNestedUnmounts(finishedRoot, node, renderPriorityLevel); // After all the children have unmounted, it is now safe to remove the\n        // node from the tree.\n\n        if (currentParentIsContainer) {\n          removeChildFromContainer(currentParent, node.stateNode);\n        } else {\n          removeChild(currentParent, node.stateNode);\n        } // Don't visit children because we already visited them.\n\n      } else if (node.tag === HostPortal) {\n        if (node.child !== null) {\n          // When we go into a portal, it becomes the parent to remove from.\n          // We will reassign it back when we pop the portal on the way up.\n          currentParent = node.stateNode.containerInfo;\n          currentParentIsContainer = true; // Visit children because portals might contain host components.\n\n          node.child.return = node;\n          node = node.child;\n          continue;\n        }\n      } else {\n        commitUnmount(finishedRoot, node, renderPriorityLevel); // Visit children because we may find more host components below.\n\n        if (node.child !== null) {\n          node.child.return = node;\n          node = node.child;\n          continue;\n        }\n      }\n\n      if (node === current) {\n        return;\n      }\n\n      while (node.sibling === null) {\n        if (node.return === null || node.return === current) {\n          return;\n        }\n\n        node = node.return;\n\n        if (node.tag === HostPortal) {\n          // When we go out of the portal, we need to restore the parent.\n          // Since we don't keep a stack of them, we will search for it.\n          currentParentIsValid = false;\n        }\n      }\n\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n\n  function commitDeletion(finishedRoot, current, renderPriorityLevel) {\n    {\n      // Recursively delete all host nodes from the parent.\n      // Detach refs and call componentWillUnmount() on the whole subtree.\n      unmountHostComponents(finishedRoot, current, renderPriorityLevel);\n    }\n\n    detachFiber(current);\n  }\n\n  function commitWork(current, finishedWork) {\n\n    switch (finishedWork.tag) {\n      case FunctionComponent:\n      case ForwardRef:\n      case MemoComponent:\n      case SimpleMemoComponent:\n      case Block:\n        {\n          // Layout effects are destroyed during the mutation phase so that all\n          // destroy functions for all fibers are called before any create functions.\n          // This prevents sibling component effects from interfering with each other,\n          // e.g. a destroy function in one component should never override a ref set\n          // by a create function in another component during the same commit.\n          commitHookEffectListUnmount(Layout | HasEffect, finishedWork);\n          return;\n        }\n\n      case ClassComponent:\n        {\n          return;\n        }\n\n      case HostComponent:\n        {\n          var instance = finishedWork.stateNode;\n\n          if (instance != null) {\n            // Commit the work prepared earlier.\n            var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps\n            // as the newProps. The updatePayload will contain the real change in\n            // this case.\n\n            var oldProps = current !== null ? current.memoizedProps : newProps;\n            var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.\n\n            var updatePayload = finishedWork.updateQueue;\n            finishedWork.updateQueue = null;\n\n            if (updatePayload !== null) {\n              commitUpdate(instance, updatePayload, type, oldProps, newProps);\n            }\n          }\n\n          return;\n        }\n\n      case HostText:\n        {\n          if (!(finishedWork.stateNode !== null)) {\n            {\n              throw Error( \"This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.\" );\n            }\n          }\n\n          var textInstance = finishedWork.stateNode;\n          var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps\n          // as the newProps. The updatePayload will contain the real change in\n          // this case.\n\n          var oldText = current !== null ? current.memoizedProps : newText;\n          commitTextUpdate(textInstance, oldText, newText);\n          return;\n        }\n\n      case HostRoot:\n        {\n          {\n            var _root = finishedWork.stateNode;\n\n            if (_root.hydrate) {\n              // We've just hydrated. No need to hydrate again.\n              _root.hydrate = false;\n              commitHydratedContainer(_root.containerInfo);\n            }\n          }\n\n          return;\n        }\n\n      case Profiler:\n        {\n          return;\n        }\n\n      case SuspenseComponent:\n        {\n          commitSuspenseComponent(finishedWork);\n          attachSuspenseRetryListeners(finishedWork);\n          return;\n        }\n\n      case SuspenseListComponent:\n        {\n          attachSuspenseRetryListeners(finishedWork);\n          return;\n        }\n\n      case IncompleteClassComponent:\n        {\n          return;\n        }\n    }\n\n    {\n      {\n        throw Error( \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    }\n  }\n\n  function commitSuspenseComponent(finishedWork) {\n    var newState = finishedWork.memoizedState;\n    var newDidTimeout;\n    var primaryChildParent = finishedWork;\n\n    if (newState === null) {\n      newDidTimeout = false;\n    } else {\n      newDidTimeout = true;\n      primaryChildParent = finishedWork.child;\n      markCommitTimeOfFallback();\n    }\n\n    if ( primaryChildParent !== null) {\n      hideOrUnhideAllChildren(primaryChildParent, newDidTimeout);\n    }\n  }\n\n  function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {\n\n    var newState = finishedWork.memoizedState;\n\n    if (newState === null) {\n      var current = finishedWork.alternate;\n\n      if (current !== null) {\n        var prevState = current.memoizedState;\n\n        if (prevState !== null) {\n          var suspenseInstance = prevState.dehydrated;\n\n          if (suspenseInstance !== null) {\n            commitHydratedSuspenseInstance(suspenseInstance);\n          }\n        }\n      }\n    }\n  }\n\n  function attachSuspenseRetryListeners(finishedWork) {\n    // If this boundary just timed out, then it will have a set of thenables.\n    // For each thenable, attach a listener so that when it resolves, React\n    // attempts to re-render the boundary in the primary (pre-timeout) state.\n    var thenables = finishedWork.updateQueue;\n\n    if (thenables !== null) {\n      finishedWork.updateQueue = null;\n      var retryCache = finishedWork.stateNode;\n\n      if (retryCache === null) {\n        retryCache = finishedWork.stateNode = new PossiblyWeakSet();\n      }\n\n      thenables.forEach(function (thenable) {\n        // Memoize using the boundary fiber to prevent redundant listeners.\n        var retry = resolveRetryThenable.bind(null, finishedWork, thenable);\n\n        if (!retryCache.has(thenable)) {\n          {\n            if (thenable.__reactDoNotTraceInteractions !== true) {\n              retry = unstable_wrap(retry);\n            }\n          }\n\n          retryCache.add(thenable);\n          thenable.then(retry, retry);\n        }\n      });\n    }\n  }\n\n  function commitResetTextContent(current) {\n\n    resetTextContent(current.stateNode);\n  }\n\n  var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;\n\n  function createRootErrorUpdate(fiber, errorInfo, expirationTime) {\n    var update = createUpdate(expirationTime, null); // Unmount the root by rendering null.\n\n    update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property\n    // being called \"element\".\n\n    update.payload = {\n      element: null\n    };\n    var error = errorInfo.value;\n\n    update.callback = function () {\n      onUncaughtError(error);\n      logError(fiber, errorInfo);\n    };\n\n    return update;\n  }\n\n  function createClassErrorUpdate(fiber, errorInfo, expirationTime) {\n    var update = createUpdate(expirationTime, null);\n    update.tag = CaptureUpdate;\n    var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n\n    if (typeof getDerivedStateFromError === 'function') {\n      var error$1 = errorInfo.value;\n\n      update.payload = function () {\n        logError(fiber, errorInfo);\n        return getDerivedStateFromError(error$1);\n      };\n    }\n\n    var inst = fiber.stateNode;\n\n    if (inst !== null && typeof inst.componentDidCatch === 'function') {\n      update.callback = function callback() {\n        {\n          markFailedErrorBoundaryForHotReloading(fiber);\n        }\n\n        if (typeof getDerivedStateFromError !== 'function') {\n          // To preserve the preexisting retry behavior of error boundaries,\n          // we keep track of which ones already failed during this batch.\n          // This gets reset before we yield back to the browser.\n          // TODO: Warn in strict mode if getDerivedStateFromError is\n          // not defined.\n          markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined\n\n          logError(fiber, errorInfo);\n        }\n\n        var error$1 = errorInfo.value;\n        var stack = errorInfo.stack;\n        this.componentDidCatch(error$1, {\n          componentStack: stack !== null ? stack : ''\n        });\n\n        {\n          if (typeof getDerivedStateFromError !== 'function') {\n            // If componentDidCatch is the only error boundary method defined,\n            // then it needs to call setState to recover from errors.\n            // If no state update is scheduled then the boundary will swallow the error.\n            if (fiber.expirationTime !== Sync) {\n              error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown');\n            }\n          }\n        }\n      };\n    } else {\n      update.callback = function () {\n        markFailedErrorBoundaryForHotReloading(fiber);\n      };\n    }\n\n    return update;\n  }\n\n  function attachPingListener(root, renderExpirationTime, thenable) {\n    // Attach a listener to the promise to \"ping\" the root and retry. But\n    // only if one does not already exist for the current render expiration\n    // time (which acts like a \"thread ID\" here).\n    var pingCache = root.pingCache;\n    var threadIDs;\n\n    if (pingCache === null) {\n      pingCache = root.pingCache = new PossiblyWeakMap$1();\n      threadIDs = new Set();\n      pingCache.set(thenable, threadIDs);\n    } else {\n      threadIDs = pingCache.get(thenable);\n\n      if (threadIDs === undefined) {\n        threadIDs = new Set();\n        pingCache.set(thenable, threadIDs);\n      }\n    }\n\n    if (!threadIDs.has(renderExpirationTime)) {\n      // Memoize using the thread ID to prevent redundant listeners.\n      threadIDs.add(renderExpirationTime);\n      var ping = pingSuspendedRoot.bind(null, root, thenable, renderExpirationTime);\n      thenable.then(ping, ping);\n    }\n  }\n\n  function throwException(root, returnFiber, sourceFiber, value, renderExpirationTime) {\n    // The source fiber did not complete.\n    sourceFiber.effectTag |= Incomplete; // Its effect list is no longer valid.\n\n    sourceFiber.firstEffect = sourceFiber.lastEffect = null;\n\n    if (value !== null && typeof value === 'object' && typeof value.then === 'function') {\n      // This is a thenable.\n      var thenable = value;\n\n      if ((sourceFiber.mode & BlockingMode) === NoMode) {\n        // Reset the memoizedState to what it was before we attempted\n        // to render it.\n        var currentSource = sourceFiber.alternate;\n\n        if (currentSource) {\n          sourceFiber.updateQueue = currentSource.updateQueue;\n          sourceFiber.memoizedState = currentSource.memoizedState;\n          sourceFiber.expirationTime = currentSource.expirationTime;\n        } else {\n          sourceFiber.updateQueue = null;\n          sourceFiber.memoizedState = null;\n        }\n      }\n\n      var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view.\n\n      var _workInProgress = returnFiber;\n\n      do {\n        if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) {\n          // Found the nearest boundary.\n          // Stash the promise on the boundary fiber. If the boundary times out, we'll\n          // attach another listener to flip the boundary back to its normal state.\n          var thenables = _workInProgress.updateQueue;\n\n          if (thenables === null) {\n            var updateQueue = new Set();\n            updateQueue.add(thenable);\n            _workInProgress.updateQueue = updateQueue;\n          } else {\n            thenables.add(thenable);\n          } // If the boundary is outside of blocking mode, we should *not*\n          // suspend the commit. Pretend as if the suspended component rendered\n          // null and keep rendering. In the commit phase, we'll schedule a\n          // subsequent synchronous update to re-render the Suspense.\n          //\n          // Note: It doesn't matter whether the component that suspended was\n          // inside a blocking mode tree. If the Suspense is outside of it, we\n          // should *not* suspend the commit.\n\n\n          if ((_workInProgress.mode & BlockingMode) === NoMode) {\n            _workInProgress.effectTag |= DidCapture; // We're going to commit this fiber even though it didn't complete.\n            // But we shouldn't call any lifecycle methods or callbacks. Remove\n            // all lifecycle effect tags.\n\n            sourceFiber.effectTag &= ~(LifecycleEffectMask | Incomplete);\n\n            if (sourceFiber.tag === ClassComponent) {\n              var currentSourceFiber = sourceFiber.alternate;\n\n              if (currentSourceFiber === null) {\n                // This is a new mount. Change the tag so it's not mistaken for a\n                // completed class component. For example, we should not call\n                // componentWillUnmount if it is deleted.\n                sourceFiber.tag = IncompleteClassComponent;\n              } else {\n                // When we try rendering again, we should not reuse the current fiber,\n                // since it's known to be in an inconsistent state. Use a force update to\n                // prevent a bail out.\n                var update = createUpdate(Sync, null);\n                update.tag = ForceUpdate;\n                enqueueUpdate(sourceFiber, update);\n              }\n            } // The source fiber did not complete. Mark it with Sync priority to\n            // indicate that it still has pending work.\n\n\n            sourceFiber.expirationTime = Sync; // Exit without suspending.\n\n            return;\n          } // Confirmed that the boundary is in a concurrent mode tree. Continue\n          // with the normal suspend path.\n          //\n          // After this we'll use a set of heuristics to determine whether this\n          // render pass will run to completion or restart or \"suspend\" the commit.\n          // The actual logic for this is spread out in different places.\n          //\n          // This first principle is that if we're going to suspend when we complete\n          // a root, then we should also restart if we get an update or ping that\n          // might unsuspend it, and vice versa. The only reason to suspend is\n          // because you think you might want to restart before committing. However,\n          // it doesn't make sense to restart only while in the period we're suspended.\n          //\n          // Restarting too aggressively is also not good because it starves out any\n          // intermediate loading state. So we use heuristics to determine when.\n          // Suspense Heuristics\n          //\n          // If nothing threw a Promise or all the same fallbacks are already showing,\n          // then don't suspend/restart.\n          //\n          // If this is an initial render of a new tree of Suspense boundaries and\n          // those trigger a fallback, then don't suspend/restart. We want to ensure\n          // that we can show the initial loading state as quickly as possible.\n          //\n          // If we hit a \"Delayed\" case, such as when we'd switch from content back into\n          // a fallback, then we should always suspend/restart. SuspenseConfig applies to\n          // this case. If none is defined, JND is used instead.\n          //\n          // If we're already showing a fallback and it gets \"retried\", allowing us to show\n          // another level, but there's still an inner boundary that would show a fallback,\n          // then we suspend/restart for 500ms since the last time we showed a fallback\n          // anywhere in the tree. This effectively throttles progressive loading into a\n          // consistent train of commits. This also gives us an opportunity to restart to\n          // get to the completed state slightly earlier.\n          //\n          // If there's ambiguity due to batching it's resolved in preference of:\n          // 1) \"delayed\", 2) \"initial render\", 3) \"retry\".\n          //\n          // We want to ensure that a \"busy\" state doesn't get force committed. We want to\n          // ensure that new initial loading states can commit as soon as possible.\n\n\n          attachPingListener(root, renderExpirationTime, thenable);\n          _workInProgress.effectTag |= ShouldCapture;\n          _workInProgress.expirationTime = renderExpirationTime;\n          return;\n        } // This boundary already captured during this render. Continue to the next\n        // boundary.\n\n\n        _workInProgress = _workInProgress.return;\n      } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode.\n      // TODO: Use invariant so the message is stripped in prod?\n\n\n      value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\\n' + '\\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.' + getStackByFiberInDevAndProd(sourceFiber));\n    } // We didn't find a boundary that could handle this type of exception. Start\n    // over and traverse parent path again, this time treating the exception\n    // as an error.\n\n\n    renderDidError();\n    value = createCapturedValue(value, sourceFiber);\n    var workInProgress = returnFiber;\n\n    do {\n      switch (workInProgress.tag) {\n        case HostRoot:\n          {\n            var _errorInfo = value;\n            workInProgress.effectTag |= ShouldCapture;\n            workInProgress.expirationTime = renderExpirationTime;\n\n            var _update = createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime);\n\n            enqueueCapturedUpdate(workInProgress, _update);\n            return;\n          }\n\n        case ClassComponent:\n          // Capture and retry\n          var errorInfo = value;\n          var ctor = workInProgress.type;\n          var instance = workInProgress.stateNode;\n\n          if ((workInProgress.effectTag & DidCapture) === NoEffect && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {\n            workInProgress.effectTag |= ShouldCapture;\n            workInProgress.expirationTime = renderExpirationTime; // Schedule the error boundary to re-render using updated state\n\n            var _update2 = createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime);\n\n            enqueueCapturedUpdate(workInProgress, _update2);\n            return;\n          }\n\n          break;\n      }\n\n      workInProgress = workInProgress.return;\n    } while (workInProgress !== null);\n  }\n\n  var ceil = Math.ceil;\n  var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher,\n      ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner,\n      IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing;\n  var NoContext =\n  /*                    */\n  0;\n  var BatchedContext =\n  /*               */\n  1;\n  var EventContext =\n  /*                 */\n  2;\n  var DiscreteEventContext =\n  /*         */\n  4;\n  var LegacyUnbatchedContext =\n  /*       */\n  8;\n  var RenderContext =\n  /*                */\n  16;\n  var CommitContext =\n  /*                */\n  32;\n  var RootIncomplete = 0;\n  var RootFatalErrored = 1;\n  var RootErrored = 2;\n  var RootSuspended = 3;\n  var RootSuspendedWithDelay = 4;\n  var RootCompleted = 5;\n  // Describes where we are in the React execution stack\n  var executionContext = NoContext; // The root we're working on\n\n  var workInProgressRoot = null; // The fiber we're working on\n\n  var workInProgress = null; // The expiration time we're rendering\n\n  var renderExpirationTime$1 = NoWork; // Whether to root completed, errored, suspended, etc.\n\n  var workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown\n\n  var workInProgressRootFatalError = null; // Most recent event time among processed updates during this render.\n  // This is conceptually a time stamp but expressed in terms of an ExpirationTime\n  // because we deal mostly with expiration times in the hot path, so this avoids\n  // the conversion happening in the hot path.\n\n  var workInProgressRootLatestProcessedExpirationTime = Sync;\n  var workInProgressRootLatestSuspenseTimeout = Sync;\n  var workInProgressRootCanSuspendUsingConfig = null; // The work left over by components that were visited during this render. Only\n  // includes unprocessed updates, not work in bailed out children.\n\n  var workInProgressRootNextUnprocessedUpdateTime = NoWork; // If we're pinged while rendering we don't always restart immediately.\n  // This flag determines if it might be worthwhile to restart if an opportunity\n  // happens latere.\n\n  var workInProgressRootHasPendingPing = false; // The most recent time we committed a fallback. This lets us ensure a train\n  // model where we don't commit new loading states in too quick succession.\n\n  var globalMostRecentFallbackTime = 0;\n  var FALLBACK_THROTTLE_MS = 500;\n  var nextEffect = null;\n  var hasUncaughtError = false;\n  var firstUncaughtError = null;\n  var legacyErrorBoundariesThatAlreadyFailed = null;\n  var rootDoesHavePassiveEffects = false;\n  var rootWithPendingPassiveEffects = null;\n  var pendingPassiveEffectsRenderPriority = NoPriority;\n  var pendingPassiveEffectsExpirationTime = NoWork;\n  var rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates\n\n  var NESTED_UPDATE_LIMIT = 50;\n  var nestedUpdateCount = 0;\n  var rootWithNestedUpdates = null;\n  var NESTED_PASSIVE_UPDATE_LIMIT = 50;\n  var nestedPassiveUpdateCount = 0;\n  var interruptedBy = null; // Marks the need to reschedule pending interactions at these expiration times\n  // during the commit phase. This enables them to be traced across components\n  // that spawn new work during render. E.g. hidden boundaries, suspended SSR\n  // hydration or SuspenseList.\n\n  var spawnedWorkDuringRender = null; // Expiration times are computed by adding to the current time (the start\n  // time). However, if two updates are scheduled within the same event, we\n  // should treat their start times as simultaneous, even if the actual clock\n  // time has advanced between the first and second call.\n  // In other words, because expiration times determine how updates are batched,\n  // we want all updates of like priority that occur within the same event to\n  // receive the same expiration time. Otherwise we get tearing.\n\n  var currentEventTime = NoWork;\n  function requestCurrentTimeForUpdate() {\n    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {\n      // We're inside React, so it's fine to read the actual time.\n      return msToExpirationTime(now());\n    } // We're not inside React, so we may be in the middle of a browser event.\n\n\n    if (currentEventTime !== NoWork) {\n      // Use the same start time for all updates until we enter React again.\n      return currentEventTime;\n    } // This is the first update since React yielded. Compute a new start time.\n\n\n    currentEventTime = msToExpirationTime(now());\n    return currentEventTime;\n  }\n  function getCurrentTime() {\n    return msToExpirationTime(now());\n  }\n  function computeExpirationForFiber(currentTime, fiber, suspenseConfig) {\n    var mode = fiber.mode;\n\n    if ((mode & BlockingMode) === NoMode) {\n      return Sync;\n    }\n\n    var priorityLevel = getCurrentPriorityLevel();\n\n    if ((mode & ConcurrentMode) === NoMode) {\n      return priorityLevel === ImmediatePriority ? Sync : Batched;\n    }\n\n    if ((executionContext & RenderContext) !== NoContext) {\n      // Use whatever time we're already rendering\n      // TODO: Should there be a way to opt out, like with `runWithPriority`?\n      return renderExpirationTime$1;\n    }\n\n    var expirationTime;\n\n    if (suspenseConfig !== null) {\n      // Compute an expiration time based on the Suspense timeout.\n      expirationTime = computeSuspenseExpiration(currentTime, suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);\n    } else {\n      // Compute an expiration time based on the Scheduler priority.\n      switch (priorityLevel) {\n        case ImmediatePriority:\n          expirationTime = Sync;\n          break;\n\n        case UserBlockingPriority$1:\n          // TODO: Rename this to computeUserBlockingExpiration\n          expirationTime = computeInteractiveExpiration(currentTime);\n          break;\n\n        case NormalPriority:\n        case LowPriority:\n          // TODO: Handle LowPriority\n          // TODO: Rename this to... something better.\n          expirationTime = computeAsyncExpiration(currentTime);\n          break;\n\n        case IdlePriority:\n          expirationTime = Idle;\n          break;\n\n        default:\n          {\n            {\n              throw Error( \"Expected a valid priority level\" );\n            }\n          }\n\n      }\n    } // If we're in the middle of rendering a tree, do not update at the same\n    // expiration time that is already rendering.\n    // TODO: We shouldn't have to do this if the update is on a different root.\n    // Refactor computeExpirationForFiber + scheduleUpdate so we have access to\n    // the root when we check for this condition.\n\n\n    if (workInProgressRoot !== null && expirationTime === renderExpirationTime$1) {\n      // This is a trick to move this update into a separate batch\n      expirationTime -= 1;\n    }\n\n    return expirationTime;\n  }\n  function scheduleUpdateOnFiber(fiber, expirationTime) {\n    checkForNestedUpdates();\n    warnAboutRenderPhaseUpdatesInDEV(fiber);\n    var root = markUpdateTimeFromFiberToRoot(fiber, expirationTime);\n\n    if (root === null) {\n      warnAboutUpdateOnUnmountedFiberInDEV(fiber);\n      return;\n    }\n\n    checkForInterruption(fiber, expirationTime);\n    recordScheduleUpdate(); // TODO: computeExpirationForFiber also reads the priority. Pass the\n    // priority as an argument to that function and this one.\n\n    var priorityLevel = getCurrentPriorityLevel();\n\n    if (expirationTime === Sync) {\n      if ( // Check if we're inside unbatchedUpdates\n      (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering\n      (executionContext & (RenderContext | CommitContext)) === NoContext) {\n        // Register pending interactions on the root to avoid losing traced interaction data.\n        schedulePendingInteractions(root, expirationTime); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed\n        // root inside of batchedUpdates should be synchronous, but layout updates\n        // should be deferred until the end of the batch.\n\n        performSyncWorkOnRoot(root);\n      } else {\n        ensureRootIsScheduled(root);\n        schedulePendingInteractions(root, expirationTime);\n\n        if (executionContext === NoContext) {\n          // Flush the synchronous work now, unless we're already working or inside\n          // a batch. This is intentionally inside scheduleUpdateOnFiber instead of\n          // scheduleCallbackForFiber to preserve the ability to schedule a callback\n          // without immediately flushing it. We only do this for user-initiated\n          // updates, to preserve historical behavior of legacy mode.\n          flushSyncCallbackQueue();\n        }\n      }\n    } else {\n      ensureRootIsScheduled(root);\n      schedulePendingInteractions(root, expirationTime);\n    }\n\n    if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered\n    // discrete, even inside a discrete event.\n    priorityLevel === UserBlockingPriority$1 || priorityLevel === ImmediatePriority)) {\n      // This is the result of a discrete event. Track the lowest priority\n      // discrete update per root so we can flush them early, if needed.\n      if (rootsWithPendingDiscreteUpdates === null) {\n        rootsWithPendingDiscreteUpdates = new Map([[root, expirationTime]]);\n      } else {\n        var lastDiscreteTime = rootsWithPendingDiscreteUpdates.get(root);\n\n        if (lastDiscreteTime === undefined || lastDiscreteTime > expirationTime) {\n          rootsWithPendingDiscreteUpdates.set(root, expirationTime);\n        }\n      }\n    }\n  }\n  var scheduleWork = scheduleUpdateOnFiber; // This is split into a separate function so we can mark a fiber with pending\n  // work without treating it as a typical update that originates from an event;\n  // e.g. retrying a Suspense boundary isn't an update, but it does schedule work\n  // on a fiber.\n\n  function markUpdateTimeFromFiberToRoot(fiber, expirationTime) {\n    // Update the source fiber's expiration time\n    if (fiber.expirationTime < expirationTime) {\n      fiber.expirationTime = expirationTime;\n    }\n\n    var alternate = fiber.alternate;\n\n    if (alternate !== null && alternate.expirationTime < expirationTime) {\n      alternate.expirationTime = expirationTime;\n    } // Walk the parent path to the root and update the child expiration time.\n\n\n    var node = fiber.return;\n    var root = null;\n\n    if (node === null && fiber.tag === HostRoot) {\n      root = fiber.stateNode;\n    } else {\n      while (node !== null) {\n        alternate = node.alternate;\n\n        if (node.childExpirationTime < expirationTime) {\n          node.childExpirationTime = expirationTime;\n\n          if (alternate !== null && alternate.childExpirationTime < expirationTime) {\n            alternate.childExpirationTime = expirationTime;\n          }\n        } else if (alternate !== null && alternate.childExpirationTime < expirationTime) {\n          alternate.childExpirationTime = expirationTime;\n        }\n\n        if (node.return === null && node.tag === HostRoot) {\n          root = node.stateNode;\n          break;\n        }\n\n        node = node.return;\n      }\n    }\n\n    if (root !== null) {\n      if (workInProgressRoot === root) {\n        // Received an update to a tree that's in the middle of rendering. Mark\n        // that's unprocessed work on this root.\n        markUnprocessedUpdateTime(expirationTime);\n\n        if (workInProgressRootExitStatus === RootSuspendedWithDelay) {\n          // The root already suspended with a delay, which means this render\n          // definitely won't finish. Since we have a new update, let's mark it as\n          // suspended now, right before marking the incoming update. This has the\n          // effect of interrupting the current render and switching to the update.\n          // TODO: This happens to work when receiving an update during the render\n          // phase, because of the trick inside computeExpirationForFiber to\n          // subtract 1 from `renderExpirationTime` to move it into a\n          // separate bucket. But we should probably model it with an exception,\n          // using the same mechanism we use to force hydration of a subtree.\n          // TODO: This does not account for low pri updates that were already\n          // scheduled before the root started rendering. Need to track the next\n          // pending expiration time (perhaps by backtracking the return path) and\n          // then trigger a restart in the `renderDidSuspendDelayIfPossible` path.\n          markRootSuspendedAtTime(root, renderExpirationTime$1);\n        }\n      } // Mark that the root has a pending update.\n\n\n      markRootUpdatedAtTime(root, expirationTime);\n    }\n\n    return root;\n  }\n\n  function getNextRootExpirationTimeToWorkOn(root) {\n    // Determines the next expiration time that the root should render, taking\n    // into account levels that may be suspended, or levels that may have\n    // received a ping.\n    var lastExpiredTime = root.lastExpiredTime;\n\n    if (lastExpiredTime !== NoWork) {\n      return lastExpiredTime;\n    } // \"Pending\" refers to any update that hasn't committed yet, including if it\n    // suspended. The \"suspended\" range is therefore a subset.\n\n\n    var firstPendingTime = root.firstPendingTime;\n\n    if (!isRootSuspendedAtTime(root, firstPendingTime)) {\n      // The highest priority pending time is not suspended. Let's work on that.\n      return firstPendingTime;\n    } // If the first pending time is suspended, check if there's a lower priority\n    // pending level that we know about. Or check if we received a ping. Work\n    // on whichever is higher priority.\n\n\n    var lastPingedTime = root.lastPingedTime;\n    var nextKnownPendingLevel = root.nextKnownPendingLevel;\n    var nextLevel = lastPingedTime > nextKnownPendingLevel ? lastPingedTime : nextKnownPendingLevel;\n\n    if ( nextLevel <= Idle && firstPendingTime !== nextLevel) {\n      // Don't work on Idle/Never priority unless everything else is committed.\n      return NoWork;\n    }\n\n    return nextLevel;\n  } // Use this function to schedule a task for a root. There's only one task per\n  // root; if a task was already scheduled, we'll check to make sure the\n  // expiration time of the existing task is the same as the expiration time of\n  // the next level that the root has work on. This function is called on every\n  // update, and right before exiting a task.\n\n\n  function ensureRootIsScheduled(root) {\n    var lastExpiredTime = root.lastExpiredTime;\n\n    if (lastExpiredTime !== NoWork) {\n      // Special case: Expired work should flush synchronously.\n      root.callbackExpirationTime = Sync;\n      root.callbackPriority = ImmediatePriority;\n      root.callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));\n      return;\n    }\n\n    var expirationTime = getNextRootExpirationTimeToWorkOn(root);\n    var existingCallbackNode = root.callbackNode;\n\n    if (expirationTime === NoWork) {\n      // There's nothing to work on.\n      if (existingCallbackNode !== null) {\n        root.callbackNode = null;\n        root.callbackExpirationTime = NoWork;\n        root.callbackPriority = NoPriority;\n      }\n\n      return;\n    } // TODO: If this is an update, we already read the current time. Pass the\n    // time as an argument.\n\n\n    var currentTime = requestCurrentTimeForUpdate();\n    var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime); // If there's an existing render task, confirm it has the correct priority and\n    // expiration time. Otherwise, we'll cancel it and schedule a new one.\n\n    if (existingCallbackNode !== null) {\n      var existingCallbackPriority = root.callbackPriority;\n      var existingCallbackExpirationTime = root.callbackExpirationTime;\n\n      if ( // Callback must have the exact same expiration time.\n      existingCallbackExpirationTime === expirationTime && // Callback must have greater or equal priority.\n      existingCallbackPriority >= priorityLevel) {\n        // Existing callback is sufficient.\n        return;\n      } // Need to schedule a new task.\n      // TODO: Instead of scheduling a new task, we should be able to change the\n      // priority of the existing one.\n\n\n      cancelCallback(existingCallbackNode);\n    }\n\n    root.callbackExpirationTime = expirationTime;\n    root.callbackPriority = priorityLevel;\n    var callbackNode;\n\n    if (expirationTime === Sync) {\n      // Sync React callbacks are scheduled on a special internal queue\n      callbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));\n    } else {\n      callbackNode = scheduleCallback(priorityLevel, performConcurrentWorkOnRoot.bind(null, root), // Compute a task timeout based on the expiration time. This also affects\n      // ordering because tasks are processed in timeout order.\n      {\n        timeout: expirationTimeToMs(expirationTime) - now()\n      });\n    }\n\n    root.callbackNode = callbackNode;\n  } // This is the entry point for every concurrent task, i.e. anything that\n  // goes through Scheduler.\n\n\n  function performConcurrentWorkOnRoot(root, didTimeout) {\n    // Since we know we're in a React event, we can clear the current\n    // event time. The next update will compute a new event time.\n    currentEventTime = NoWork;\n\n    if (didTimeout) {\n      // The render task took too long to complete. Mark the current time as\n      // expired to synchronously render all expired work in a single batch.\n      var currentTime = requestCurrentTimeForUpdate();\n      markRootExpiredAtTime(root, currentTime); // This will schedule a synchronous callback.\n\n      ensureRootIsScheduled(root);\n      return null;\n    } // Determine the next expiration time to work on, using the fields stored\n    // on the root.\n\n\n    var expirationTime = getNextRootExpirationTimeToWorkOn(root);\n\n    if (expirationTime !== NoWork) {\n      var originalCallbackNode = root.callbackNode;\n\n      if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n        {\n          throw Error( \"Should not already be working.\" );\n        }\n      }\n\n      flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack\n      // and prepare a fresh one. Otherwise we'll continue where we left off.\n\n      if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {\n        prepareFreshStack(root, expirationTime);\n        startWorkOnPendingInteractions(root, expirationTime);\n      } // If we have a work-in-progress fiber, it means there's still work to do\n      // in this root.\n\n\n      if (workInProgress !== null) {\n        var prevExecutionContext = executionContext;\n        executionContext |= RenderContext;\n        var prevDispatcher = pushDispatcher();\n        var prevInteractions = pushInteractions(root);\n        startWorkLoopTimer(workInProgress);\n\n        do {\n          try {\n            workLoopConcurrent();\n            break;\n          } catch (thrownValue) {\n            handleError(root, thrownValue);\n          }\n        } while (true);\n\n        resetContextDependencies();\n        executionContext = prevExecutionContext;\n        popDispatcher(prevDispatcher);\n\n        {\n          popInteractions(prevInteractions);\n        }\n\n        if (workInProgressRootExitStatus === RootFatalErrored) {\n          var fatalError = workInProgressRootFatalError;\n          stopInterruptedWorkLoopTimer();\n          prepareFreshStack(root, expirationTime);\n          markRootSuspendedAtTime(root, expirationTime);\n          ensureRootIsScheduled(root);\n          throw fatalError;\n        }\n\n        if (workInProgress !== null) {\n          // There's still work left over. Exit without committing.\n          stopInterruptedWorkLoopTimer();\n        } else {\n          // We now have a consistent tree. The next step is either to commit it,\n          // or, if something suspended, wait to commit it after a timeout.\n          stopFinishedWorkLoopTimer();\n          var finishedWork = root.finishedWork = root.current.alternate;\n          root.finishedExpirationTime = expirationTime;\n          finishConcurrentRender(root, finishedWork, workInProgressRootExitStatus, expirationTime);\n        }\n\n        ensureRootIsScheduled(root);\n\n        if (root.callbackNode === originalCallbackNode) {\n          // The task node scheduled for this root is the same one that's\n          // currently executed. Need to return a continuation.\n          return performConcurrentWorkOnRoot.bind(null, root);\n        }\n      }\n    }\n\n    return null;\n  }\n\n  function finishConcurrentRender(root, finishedWork, exitStatus, expirationTime) {\n    // Set this to null to indicate there's no in-progress render.\n    workInProgressRoot = null;\n\n    switch (exitStatus) {\n      case RootIncomplete:\n      case RootFatalErrored:\n        {\n          {\n            {\n              throw Error( \"Root did not complete. This is a bug in React.\" );\n            }\n          }\n        }\n      // Flow knows about invariant, so it complains if I add a break\n      // statement, but eslint doesn't know about invariant, so it complains\n      // if I do. eslint-disable-next-line no-fallthrough\n\n      case RootErrored:\n        {\n          // If this was an async render, the error may have happened due to\n          // a mutation in a concurrent event. Try rendering one more time,\n          // synchronously, to see if the error goes away. If there are\n          // lower priority updates, let's include those, too, in case they\n          // fix the inconsistency. Render at Idle to include all updates.\n          // If it was Idle or Never or some not-yet-invented time, render\n          // at that time.\n          markRootExpiredAtTime(root, expirationTime > Idle ? Idle : expirationTime); // We assume that this second render pass will be synchronous\n          // and therefore not hit this path again.\n\n          break;\n        }\n\n      case RootSuspended:\n        {\n          markRootSuspendedAtTime(root, expirationTime);\n          var lastSuspendedTime = root.lastSuspendedTime;\n\n          if (expirationTime === lastSuspendedTime) {\n            root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);\n          } // We have an acceptable loading state. We need to figure out if we\n          // should immediately commit it or wait a bit.\n          // If we have processed new updates during this render, we may now\n          // have a new loading state ready. We want to ensure that we commit\n          // that as soon as possible.\n\n\n          var hasNotProcessedNewUpdates = workInProgressRootLatestProcessedExpirationTime === Sync;\n\n          if (hasNotProcessedNewUpdates && // do not delay if we're inside an act() scope\n          !( IsThisRendererActing.current)) {\n            // If we have not processed any new updates during this pass, then\n            // this is either a retry of an existing fallback state or a\n            // hidden tree. Hidden trees shouldn't be batched with other work\n            // and after that's fixed it can only be a retry. We're going to\n            // throttle committing retries so that we don't show too many\n            // loading states too quickly.\n            var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.\n\n            if (msUntilTimeout > 10) {\n              if (workInProgressRootHasPendingPing) {\n                var lastPingedTime = root.lastPingedTime;\n\n                if (lastPingedTime === NoWork || lastPingedTime >= expirationTime) {\n                  // This render was pinged but we didn't get to restart\n                  // earlier so try restarting now instead.\n                  root.lastPingedTime = expirationTime;\n                  prepareFreshStack(root, expirationTime);\n                  break;\n                }\n              }\n\n              var nextTime = getNextRootExpirationTimeToWorkOn(root);\n\n              if (nextTime !== NoWork && nextTime !== expirationTime) {\n                // There's additional work on this root.\n                break;\n              }\n\n              if (lastSuspendedTime !== NoWork && lastSuspendedTime !== expirationTime) {\n                // We should prefer to render the fallback of at the last\n                // suspended level. Ping the last suspended level to try\n                // rendering it again.\n                root.lastPingedTime = lastSuspendedTime;\n                break;\n              } // The render is suspended, it hasn't timed out, and there's no\n              // lower priority work to do. Instead of committing the fallback\n              // immediately, wait for more data to arrive.\n\n\n              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout);\n              break;\n            }\n          } // The work expired. Commit immediately.\n\n\n          commitRoot(root);\n          break;\n        }\n\n      case RootSuspendedWithDelay:\n        {\n          markRootSuspendedAtTime(root, expirationTime);\n          var _lastSuspendedTime = root.lastSuspendedTime;\n\n          if (expirationTime === _lastSuspendedTime) {\n            root.nextKnownPendingLevel = getRemainingExpirationTime(finishedWork);\n          }\n\n          if ( // do not delay if we're inside an act() scope\n          !( IsThisRendererActing.current)) {\n            // We're suspended in a state that should be avoided. We'll try to\n            // avoid committing it for as long as the timeouts let us.\n            if (workInProgressRootHasPendingPing) {\n              var _lastPingedTime = root.lastPingedTime;\n\n              if (_lastPingedTime === NoWork || _lastPingedTime >= expirationTime) {\n                // This render was pinged but we didn't get to restart earlier\n                // so try restarting now instead.\n                root.lastPingedTime = expirationTime;\n                prepareFreshStack(root, expirationTime);\n                break;\n              }\n            }\n\n            var _nextTime = getNextRootExpirationTimeToWorkOn(root);\n\n            if (_nextTime !== NoWork && _nextTime !== expirationTime) {\n              // There's additional work on this root.\n              break;\n            }\n\n            if (_lastSuspendedTime !== NoWork && _lastSuspendedTime !== expirationTime) {\n              // We should prefer to render the fallback of at the last\n              // suspended level. Ping the last suspended level to try\n              // rendering it again.\n              root.lastPingedTime = _lastSuspendedTime;\n              break;\n            }\n\n            var _msUntilTimeout;\n\n            if (workInProgressRootLatestSuspenseTimeout !== Sync) {\n              // We have processed a suspense config whose expiration time we\n              // can use as the timeout.\n              _msUntilTimeout = expirationTimeToMs(workInProgressRootLatestSuspenseTimeout) - now();\n            } else if (workInProgressRootLatestProcessedExpirationTime === Sync) {\n              // This should never normally happen because only new updates\n              // cause delayed states, so we should have processed something.\n              // However, this could also happen in an offscreen tree.\n              _msUntilTimeout = 0;\n            } else {\n              // If we don't have a suspense config, we're going to use a\n              // heuristic to determine how long we can suspend.\n              var eventTimeMs = inferTimeFromExpirationTime(workInProgressRootLatestProcessedExpirationTime);\n              var currentTimeMs = now();\n              var timeUntilExpirationMs = expirationTimeToMs(expirationTime) - currentTimeMs;\n              var timeElapsed = currentTimeMs - eventTimeMs;\n\n              if (timeElapsed < 0) {\n                // We get this wrong some time since we estimate the time.\n                timeElapsed = 0;\n              }\n\n              _msUntilTimeout = jnd(timeElapsed) - timeElapsed; // Clamp the timeout to the expiration time. TODO: Once the\n              // event time is exact instead of inferred from expiration time\n              // we don't need this.\n\n              if (timeUntilExpirationMs < _msUntilTimeout) {\n                _msUntilTimeout = timeUntilExpirationMs;\n              }\n            } // Don't bother with a very short suspense time.\n\n\n            if (_msUntilTimeout > 10) {\n              // The render is suspended, it hasn't timed out, and there's no\n              // lower priority work to do. Instead of committing the fallback\n              // immediately, wait for more data to arrive.\n              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout);\n              break;\n            }\n          } // The work expired. Commit immediately.\n\n\n          commitRoot(root);\n          break;\n        }\n\n      case RootCompleted:\n        {\n          // The work completed. Ready to commit.\n          if ( // do not delay if we're inside an act() scope\n          !( IsThisRendererActing.current) && workInProgressRootLatestProcessedExpirationTime !== Sync && workInProgressRootCanSuspendUsingConfig !== null) {\n            // If we have exceeded the minimum loading delay, which probably\n            // means we have shown a spinner already, we might have to suspend\n            // a bit longer to ensure that the spinner is shown for\n            // enough time.\n            var _msUntilTimeout2 = computeMsUntilSuspenseLoadingDelay(workInProgressRootLatestProcessedExpirationTime, expirationTime, workInProgressRootCanSuspendUsingConfig);\n\n            if (_msUntilTimeout2 > 10) {\n              markRootSuspendedAtTime(root, expirationTime);\n              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout2);\n              break;\n            }\n          }\n\n          commitRoot(root);\n          break;\n        }\n\n      default:\n        {\n          {\n            {\n              throw Error( \"Unknown root exit status.\" );\n            }\n          }\n        }\n    }\n  } // This is the entry point for synchronous tasks that don't go\n  // through Scheduler\n\n\n  function performSyncWorkOnRoot(root) {\n    // Check if there's expired work on this root. Otherwise, render at Sync.\n    var lastExpiredTime = root.lastExpiredTime;\n    var expirationTime = lastExpiredTime !== NoWork ? lastExpiredTime : Sync;\n\n    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n      {\n        throw Error( \"Should not already be working.\" );\n      }\n    }\n\n    flushPassiveEffects(); // If the root or expiration time have changed, throw out the existing stack\n    // and prepare a fresh one. Otherwise we'll continue where we left off.\n\n    if (root !== workInProgressRoot || expirationTime !== renderExpirationTime$1) {\n      prepareFreshStack(root, expirationTime);\n      startWorkOnPendingInteractions(root, expirationTime);\n    } // If we have a work-in-progress fiber, it means there's still work to do\n    // in this root.\n\n\n    if (workInProgress !== null) {\n      var prevExecutionContext = executionContext;\n      executionContext |= RenderContext;\n      var prevDispatcher = pushDispatcher();\n      var prevInteractions = pushInteractions(root);\n      startWorkLoopTimer(workInProgress);\n\n      do {\n        try {\n          workLoopSync();\n          break;\n        } catch (thrownValue) {\n          handleError(root, thrownValue);\n        }\n      } while (true);\n\n      resetContextDependencies();\n      executionContext = prevExecutionContext;\n      popDispatcher(prevDispatcher);\n\n      {\n        popInteractions(prevInteractions);\n      }\n\n      if (workInProgressRootExitStatus === RootFatalErrored) {\n        var fatalError = workInProgressRootFatalError;\n        stopInterruptedWorkLoopTimer();\n        prepareFreshStack(root, expirationTime);\n        markRootSuspendedAtTime(root, expirationTime);\n        ensureRootIsScheduled(root);\n        throw fatalError;\n      }\n\n      if (workInProgress !== null) {\n        // This is a sync render, so we should have finished the whole tree.\n        {\n          {\n            throw Error( \"Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.\" );\n          }\n        }\n      } else {\n        // We now have a consistent tree. Because this is a sync render, we\n        // will commit it even if something suspended.\n        stopFinishedWorkLoopTimer();\n        root.finishedWork = root.current.alternate;\n        root.finishedExpirationTime = expirationTime;\n        finishSyncRender(root);\n      } // Before exiting, make sure there's a callback scheduled for the next\n      // pending level.\n\n\n      ensureRootIsScheduled(root);\n    }\n\n    return null;\n  }\n\n  function finishSyncRender(root) {\n    // Set this to null to indicate there's no in-progress render.\n    workInProgressRoot = null;\n    commitRoot(root);\n  }\n  function flushDiscreteUpdates() {\n    // TODO: Should be able to flush inside batchedUpdates, but not inside `act`.\n    // However, `act` uses `batchedUpdates`, so there's no way to distinguish\n    // those two cases. Need to fix this before exposing flushDiscreteUpdates\n    // as a public API.\n    if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) {\n      {\n        if ((executionContext & RenderContext) !== NoContext) {\n          error('unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.');\n        }\n      } // We're already rendering, so we can't synchronously flush pending work.\n      // This is probably a nested event dispatch triggered by a lifecycle/effect,\n      // like `el.focus()`. Exit.\n\n\n      return;\n    }\n\n    flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that\n    // they fire before the next serial event.\n\n    flushPassiveEffects();\n  }\n  function syncUpdates(fn, a, b, c) {\n    return runWithPriority$1(ImmediatePriority, fn.bind(null, a, b, c));\n  }\n\n  function flushPendingDiscreteUpdates() {\n    if (rootsWithPendingDiscreteUpdates !== null) {\n      // For each root with pending discrete updates, schedule a callback to\n      // immediately flush them.\n      var roots = rootsWithPendingDiscreteUpdates;\n      rootsWithPendingDiscreteUpdates = null;\n      roots.forEach(function (expirationTime, root) {\n        markRootExpiredAtTime(root, expirationTime);\n        ensureRootIsScheduled(root);\n      }); // Now flush the immediate queue.\n\n      flushSyncCallbackQueue();\n    }\n  }\n\n  function batchedUpdates$1(fn, a) {\n    var prevExecutionContext = executionContext;\n    executionContext |= BatchedContext;\n\n    try {\n      return fn(a);\n    } finally {\n      executionContext = prevExecutionContext;\n\n      if (executionContext === NoContext) {\n        // Flush the immediate callbacks that were scheduled during this batch\n        flushSyncCallbackQueue();\n      }\n    }\n  }\n  function batchedEventUpdates$1(fn, a) {\n    var prevExecutionContext = executionContext;\n    executionContext |= EventContext;\n\n    try {\n      return fn(a);\n    } finally {\n      executionContext = prevExecutionContext;\n\n      if (executionContext === NoContext) {\n        // Flush the immediate callbacks that were scheduled during this batch\n        flushSyncCallbackQueue();\n      }\n    }\n  }\n  function discreteUpdates$1(fn, a, b, c, d) {\n    var prevExecutionContext = executionContext;\n    executionContext |= DiscreteEventContext;\n\n    try {\n      // Should this\n      return runWithPriority$1(UserBlockingPriority$1, fn.bind(null, a, b, c, d));\n    } finally {\n      executionContext = prevExecutionContext;\n\n      if (executionContext === NoContext) {\n        // Flush the immediate callbacks that were scheduled during this batch\n        flushSyncCallbackQueue();\n      }\n    }\n  }\n  function unbatchedUpdates(fn, a) {\n    var prevExecutionContext = executionContext;\n    executionContext &= ~BatchedContext;\n    executionContext |= LegacyUnbatchedContext;\n\n    try {\n      return fn(a);\n    } finally {\n      executionContext = prevExecutionContext;\n\n      if (executionContext === NoContext) {\n        // Flush the immediate callbacks that were scheduled during this batch\n        flushSyncCallbackQueue();\n      }\n    }\n  }\n  function flushSync(fn, a) {\n    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {\n      {\n        {\n          throw Error( \"flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.\" );\n        }\n      }\n    }\n\n    var prevExecutionContext = executionContext;\n    executionContext |= BatchedContext;\n\n    try {\n      return runWithPriority$1(ImmediatePriority, fn.bind(null, a));\n    } finally {\n      executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.\n      // Note that this will happen even if batchedUpdates is higher up\n      // the stack.\n\n      flushSyncCallbackQueue();\n    }\n  }\n\n  function prepareFreshStack(root, expirationTime) {\n    root.finishedWork = null;\n    root.finishedExpirationTime = NoWork;\n    var timeoutHandle = root.timeoutHandle;\n\n    if (timeoutHandle !== noTimeout) {\n      // The root previous suspended and scheduled a timeout to commit a fallback\n      // state. Now that we have additional work, cancel the timeout.\n      root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above\n\n      cancelTimeout(timeoutHandle);\n    }\n\n    if (workInProgress !== null) {\n      var interruptedWork = workInProgress.return;\n\n      while (interruptedWork !== null) {\n        unwindInterruptedWork(interruptedWork);\n        interruptedWork = interruptedWork.return;\n      }\n    }\n\n    workInProgressRoot = root;\n    workInProgress = createWorkInProgress(root.current, null);\n    renderExpirationTime$1 = expirationTime;\n    workInProgressRootExitStatus = RootIncomplete;\n    workInProgressRootFatalError = null;\n    workInProgressRootLatestProcessedExpirationTime = Sync;\n    workInProgressRootLatestSuspenseTimeout = Sync;\n    workInProgressRootCanSuspendUsingConfig = null;\n    workInProgressRootNextUnprocessedUpdateTime = NoWork;\n    workInProgressRootHasPendingPing = false;\n\n    {\n      spawnedWorkDuringRender = null;\n    }\n\n    {\n      ReactStrictModeWarnings.discardPendingWarnings();\n    }\n  }\n\n  function handleError(root, thrownValue) {\n    do {\n      try {\n        // Reset module-level state that was set during the render phase.\n        resetContextDependencies();\n        resetHooksAfterThrow();\n        resetCurrentFiber();\n\n        if (workInProgress === null || workInProgress.return === null) {\n          // Expected to be working on a non-root fiber. This is a fatal error\n          // because there's no ancestor that can handle it; the root is\n          // supposed to capture all errors that weren't caught by an error\n          // boundary.\n          workInProgressRootExitStatus = RootFatalErrored;\n          workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next\n          // sibling, or the parent if there are no siblings. But since the root\n          // has no siblings nor a parent, we set it to null. Usually this is\n          // handled by `completeUnitOfWork` or `unwindWork`, but since we're\n          // interntionally not calling those, we need set it here.\n          // TODO: Consider calling `unwindWork` to pop the contexts.\n\n          workInProgress = null;\n          return null;\n        }\n\n        if (enableProfilerTimer && workInProgress.mode & ProfileMode) {\n          // Record the time spent rendering before an error was thrown. This\n          // avoids inaccurate Profiler durations in the case of a\n          // suspended render.\n          stopProfilerTimerIfRunningAndRecordDelta(workInProgress, true);\n        }\n\n        throwException(root, workInProgress.return, workInProgress, thrownValue, renderExpirationTime$1);\n        workInProgress = completeUnitOfWork(workInProgress);\n      } catch (yetAnotherThrownValue) {\n        // Something in the return path also threw.\n        thrownValue = yetAnotherThrownValue;\n        continue;\n      } // Return to the normal work loop.\n\n\n      return;\n    } while (true);\n  }\n\n  function pushDispatcher(root) {\n    var prevDispatcher = ReactCurrentDispatcher$1.current;\n    ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;\n\n    if (prevDispatcher === null) {\n      // The React isomorphic package does not include a default dispatcher.\n      // Instead the first renderer will lazily attach one, in order to give\n      // nicer error messages.\n      return ContextOnlyDispatcher;\n    } else {\n      return prevDispatcher;\n    }\n  }\n\n  function popDispatcher(prevDispatcher) {\n    ReactCurrentDispatcher$1.current = prevDispatcher;\n  }\n\n  function pushInteractions(root) {\n    {\n      var prevInteractions = __interactionsRef.current;\n      __interactionsRef.current = root.memoizedInteractions;\n      return prevInteractions;\n    }\n  }\n\n  function popInteractions(prevInteractions) {\n    {\n      __interactionsRef.current = prevInteractions;\n    }\n  }\n\n  function markCommitTimeOfFallback() {\n    globalMostRecentFallbackTime = now();\n  }\n  function markRenderEventTimeAndConfig(expirationTime, suspenseConfig) {\n    if (expirationTime < workInProgressRootLatestProcessedExpirationTime && expirationTime > Idle) {\n      workInProgressRootLatestProcessedExpirationTime = expirationTime;\n    }\n\n    if (suspenseConfig !== null) {\n      if (expirationTime < workInProgressRootLatestSuspenseTimeout && expirationTime > Idle) {\n        workInProgressRootLatestSuspenseTimeout = expirationTime; // Most of the time we only have one config and getting wrong is not bad.\n\n        workInProgressRootCanSuspendUsingConfig = suspenseConfig;\n      }\n    }\n  }\n  function markUnprocessedUpdateTime(expirationTime) {\n    if (expirationTime > workInProgressRootNextUnprocessedUpdateTime) {\n      workInProgressRootNextUnprocessedUpdateTime = expirationTime;\n    }\n  }\n  function renderDidSuspend() {\n    if (workInProgressRootExitStatus === RootIncomplete) {\n      workInProgressRootExitStatus = RootSuspended;\n    }\n  }\n  function renderDidSuspendDelayIfPossible() {\n    if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) {\n      workInProgressRootExitStatus = RootSuspendedWithDelay;\n    } // Check if there's a lower priority update somewhere else in the tree.\n\n\n    if (workInProgressRootNextUnprocessedUpdateTime !== NoWork && workInProgressRoot !== null) {\n      // Mark the current render as suspended, and then mark that there's a\n      // pending update.\n      // TODO: This should immediately interrupt the current render, instead\n      // of waiting until the next time we yield.\n      markRootSuspendedAtTime(workInProgressRoot, renderExpirationTime$1);\n      markRootUpdatedAtTime(workInProgressRoot, workInProgressRootNextUnprocessedUpdateTime);\n    }\n  }\n  function renderDidError() {\n    if (workInProgressRootExitStatus !== RootCompleted) {\n      workInProgressRootExitStatus = RootErrored;\n    }\n  } // Called during render to determine if anything has suspended.\n  // Returns false if we're not sure.\n\n  function renderHasNotSuspendedYet() {\n    // If something errored or completed, we can't really be sure,\n    // so those are false.\n    return workInProgressRootExitStatus === RootIncomplete;\n  }\n\n  function inferTimeFromExpirationTime(expirationTime) {\n    // We don't know exactly when the update was scheduled, but we can infer an\n    // approximate start time from the expiration time.\n    var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);\n    return earliestExpirationTimeMs - LOW_PRIORITY_EXPIRATION;\n  }\n\n  function inferTimeFromExpirationTimeWithSuspenseConfig(expirationTime, suspenseConfig) {\n    // We don't know exactly when the update was scheduled, but we can infer an\n    // approximate start time from the expiration time by subtracting the timeout\n    // that was added to the event time.\n    var earliestExpirationTimeMs = expirationTimeToMs(expirationTime);\n    return earliestExpirationTimeMs - (suspenseConfig.timeoutMs | 0 || LOW_PRIORITY_EXPIRATION);\n  } // The work loop is an extremely hot path. Tell Closure not to inline it.\n\n  /** @noinline */\n\n\n  function workLoopSync() {\n    // Already timed out, so perform work without checking if we need to yield.\n    while (workInProgress !== null) {\n      workInProgress = performUnitOfWork(workInProgress);\n    }\n  }\n  /** @noinline */\n\n\n  function workLoopConcurrent() {\n    // Perform work until Scheduler asks us to yield\n    while (workInProgress !== null && !shouldYield()) {\n      workInProgress = performUnitOfWork(workInProgress);\n    }\n  }\n\n  function performUnitOfWork(unitOfWork) {\n    // The current, flushed, state of this fiber is the alternate. Ideally\n    // nothing should rely on this, but relying on it here means that we don't\n    // need an additional field on the work in progress.\n    var current = unitOfWork.alternate;\n    startWorkTimer(unitOfWork);\n    setCurrentFiber(unitOfWork);\n    var next;\n\n    if ( (unitOfWork.mode & ProfileMode) !== NoMode) {\n      startProfilerTimer(unitOfWork);\n      next = beginWork$1(current, unitOfWork, renderExpirationTime$1);\n      stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);\n    } else {\n      next = beginWork$1(current, unitOfWork, renderExpirationTime$1);\n    }\n\n    resetCurrentFiber();\n    unitOfWork.memoizedProps = unitOfWork.pendingProps;\n\n    if (next === null) {\n      // If this doesn't spawn new work, complete the current work.\n      next = completeUnitOfWork(unitOfWork);\n    }\n\n    ReactCurrentOwner$2.current = null;\n    return next;\n  }\n\n  function completeUnitOfWork(unitOfWork) {\n    // Attempt to complete the current unit of work, then move to the next\n    // sibling. If there are no more siblings, return to the parent fiber.\n    workInProgress = unitOfWork;\n\n    do {\n      // The current, flushed, state of this fiber is the alternate. Ideally\n      // nothing should rely on this, but relying on it here means that we don't\n      // need an additional field on the work in progress.\n      var current = workInProgress.alternate;\n      var returnFiber = workInProgress.return; // Check if the work completed or if something threw.\n\n      if ((workInProgress.effectTag & Incomplete) === NoEffect) {\n        setCurrentFiber(workInProgress);\n        var next = void 0;\n\n        if ( (workInProgress.mode & ProfileMode) === NoMode) {\n          next = completeWork(current, workInProgress, renderExpirationTime$1);\n        } else {\n          startProfilerTimer(workInProgress);\n          next = completeWork(current, workInProgress, renderExpirationTime$1); // Update render duration assuming we didn't error.\n\n          stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false);\n        }\n\n        stopWorkTimer(workInProgress);\n        resetCurrentFiber();\n        resetChildExpirationTime(workInProgress);\n\n        if (next !== null) {\n          // Completing this fiber spawned new work. Work on that next.\n          return next;\n        }\n\n        if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete\n        (returnFiber.effectTag & Incomplete) === NoEffect) {\n          // Append all the effects of the subtree and this fiber onto the effect\n          // list of the parent. The completion order of the children affects the\n          // side-effect order.\n          if (returnFiber.firstEffect === null) {\n            returnFiber.firstEffect = workInProgress.firstEffect;\n          }\n\n          if (workInProgress.lastEffect !== null) {\n            if (returnFiber.lastEffect !== null) {\n              returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;\n            }\n\n            returnFiber.lastEffect = workInProgress.lastEffect;\n          } // If this fiber had side-effects, we append it AFTER the children's\n          // side-effects. We can perform certain side-effects earlier if needed,\n          // by doing multiple passes over the effect list. We don't want to\n          // schedule our own side-effect on our own list because if end up\n          // reusing children we'll schedule this effect onto itself since we're\n          // at the end.\n\n\n          var effectTag = workInProgress.effectTag; // Skip both NoWork and PerformedWork tags when creating the effect\n          // list. PerformedWork effect is read by React DevTools but shouldn't be\n          // committed.\n\n          if (effectTag > PerformedWork) {\n            if (returnFiber.lastEffect !== null) {\n              returnFiber.lastEffect.nextEffect = workInProgress;\n            } else {\n              returnFiber.firstEffect = workInProgress;\n            }\n\n            returnFiber.lastEffect = workInProgress;\n          }\n        }\n      } else {\n        // This fiber did not complete because something threw. Pop values off\n        // the stack without entering the complete phase. If this is a boundary,\n        // capture values if possible.\n        var _next = unwindWork(workInProgress); // Because this fiber did not complete, don't reset its expiration time.\n\n\n        if ( (workInProgress.mode & ProfileMode) !== NoMode) {\n          // Record the render duration for the fiber that errored.\n          stopProfilerTimerIfRunningAndRecordDelta(workInProgress, false); // Include the time spent working on failed children before continuing.\n\n          var actualDuration = workInProgress.actualDuration;\n          var child = workInProgress.child;\n\n          while (child !== null) {\n            actualDuration += child.actualDuration;\n            child = child.sibling;\n          }\n\n          workInProgress.actualDuration = actualDuration;\n        }\n\n        if (_next !== null) {\n          // If completing this work spawned new work, do that next. We'll come\n          // back here again.\n          // Since we're restarting, remove anything that is not a host effect\n          // from the effect tag.\n          // TODO: The name stopFailedWorkTimer is misleading because Suspense\n          // also captures and restarts.\n          stopFailedWorkTimer(workInProgress);\n          _next.effectTag &= HostEffectMask;\n          return _next;\n        }\n\n        stopWorkTimer(workInProgress);\n\n        if (returnFiber !== null) {\n          // Mark the parent fiber as incomplete and clear its effect list.\n          returnFiber.firstEffect = returnFiber.lastEffect = null;\n          returnFiber.effectTag |= Incomplete;\n        }\n      }\n\n      var siblingFiber = workInProgress.sibling;\n\n      if (siblingFiber !== null) {\n        // If there is more work to do in this returnFiber, do that next.\n        return siblingFiber;\n      } // Otherwise, return to the parent\n\n\n      workInProgress = returnFiber;\n    } while (workInProgress !== null); // We've reached the root.\n\n\n    if (workInProgressRootExitStatus === RootIncomplete) {\n      workInProgressRootExitStatus = RootCompleted;\n    }\n\n    return null;\n  }\n\n  function getRemainingExpirationTime(fiber) {\n    var updateExpirationTime = fiber.expirationTime;\n    var childExpirationTime = fiber.childExpirationTime;\n    return updateExpirationTime > childExpirationTime ? updateExpirationTime : childExpirationTime;\n  }\n\n  function resetChildExpirationTime(completedWork) {\n    if (renderExpirationTime$1 !== Never && completedWork.childExpirationTime === Never) {\n      // The children of this component are hidden. Don't bubble their\n      // expiration times.\n      return;\n    }\n\n    var newChildExpirationTime = NoWork; // Bubble up the earliest expiration time.\n\n    if ( (completedWork.mode & ProfileMode) !== NoMode) {\n      // In profiling mode, resetChildExpirationTime is also used to reset\n      // profiler durations.\n      var actualDuration = completedWork.actualDuration;\n      var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will\n      // only be updated if work is done on the fiber (i.e. it doesn't bailout).\n      // When work is done, it should bubble to the parent's actualDuration. If\n      // the fiber has not been cloned though, (meaning no work was done), then\n      // this value will reflect the amount of time spent working on a previous\n      // render. In that case it should not bubble. We determine whether it was\n      // cloned by comparing the child pointer.\n\n      var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child;\n      var child = completedWork.child;\n\n      while (child !== null) {\n        var childUpdateExpirationTime = child.expirationTime;\n        var childChildExpirationTime = child.childExpirationTime;\n\n        if (childUpdateExpirationTime > newChildExpirationTime) {\n          newChildExpirationTime = childUpdateExpirationTime;\n        }\n\n        if (childChildExpirationTime > newChildExpirationTime) {\n          newChildExpirationTime = childChildExpirationTime;\n        }\n\n        if (shouldBubbleActualDurations) {\n          actualDuration += child.actualDuration;\n        }\n\n        treeBaseDuration += child.treeBaseDuration;\n        child = child.sibling;\n      }\n\n      completedWork.actualDuration = actualDuration;\n      completedWork.treeBaseDuration = treeBaseDuration;\n    } else {\n      var _child = completedWork.child;\n\n      while (_child !== null) {\n        var _childUpdateExpirationTime = _child.expirationTime;\n        var _childChildExpirationTime = _child.childExpirationTime;\n\n        if (_childUpdateExpirationTime > newChildExpirationTime) {\n          newChildExpirationTime = _childUpdateExpirationTime;\n        }\n\n        if (_childChildExpirationTime > newChildExpirationTime) {\n          newChildExpirationTime = _childChildExpirationTime;\n        }\n\n        _child = _child.sibling;\n      }\n    }\n\n    completedWork.childExpirationTime = newChildExpirationTime;\n  }\n\n  function commitRoot(root) {\n    var renderPriorityLevel = getCurrentPriorityLevel();\n    runWithPriority$1(ImmediatePriority, commitRootImpl.bind(null, root, renderPriorityLevel));\n    return null;\n  }\n\n  function commitRootImpl(root, renderPriorityLevel) {\n    do {\n      // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which\n      // means `flushPassiveEffects` will sometimes result in additional\n      // passive effects. So we need to keep flushing in a loop until there are\n      // no more pending effects.\n      // TODO: Might be better if `flushPassiveEffects` did not automatically\n      // flush synchronous work at the end, to avoid factoring hazards like this.\n      flushPassiveEffects();\n    } while (rootWithPendingPassiveEffects !== null);\n\n    flushRenderPhaseStrictModeWarningsInDEV();\n\n    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n      {\n        throw Error( \"Should not already be working.\" );\n      }\n    }\n\n    var finishedWork = root.finishedWork;\n    var expirationTime = root.finishedExpirationTime;\n\n    if (finishedWork === null) {\n      return null;\n    }\n\n    root.finishedWork = null;\n    root.finishedExpirationTime = NoWork;\n\n    if (!(finishedWork !== root.current)) {\n      {\n        throw Error( \"Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.\" );\n      }\n    } // commitRoot never returns a continuation; it always finishes synchronously.\n    // So we can clear these now to allow a new callback to be scheduled.\n\n\n    root.callbackNode = null;\n    root.callbackExpirationTime = NoWork;\n    root.callbackPriority = NoPriority;\n    root.nextKnownPendingLevel = NoWork;\n    startCommitTimer(); // Update the first and last pending times on this root. The new first\n    // pending time is whatever is left on the root fiber.\n\n    var remainingExpirationTimeBeforeCommit = getRemainingExpirationTime(finishedWork);\n    markRootFinishedAtTime(root, expirationTime, remainingExpirationTimeBeforeCommit);\n\n    if (root === workInProgressRoot) {\n      // We can reset these now that they are finished.\n      workInProgressRoot = null;\n      workInProgress = null;\n      renderExpirationTime$1 = NoWork;\n    } // This indicates that the last root we worked on is not the same one that\n    // we're committing now. This most commonly happens when a suspended root\n    // times out.\n    // Get the list of effects.\n\n\n    var firstEffect;\n\n    if (finishedWork.effectTag > PerformedWork) {\n      // A fiber's effect list consists only of its children, not itself. So if\n      // the root has an effect, we need to add it to the end of the list. The\n      // resulting list is the set that would belong to the root's parent, if it\n      // had one; that is, all the effects in the tree including the root.\n      if (finishedWork.lastEffect !== null) {\n        finishedWork.lastEffect.nextEffect = finishedWork;\n        firstEffect = finishedWork.firstEffect;\n      } else {\n        firstEffect = finishedWork;\n      }\n    } else {\n      // There is no effect on the root.\n      firstEffect = finishedWork.firstEffect;\n    }\n\n    if (firstEffect !== null) {\n      var prevExecutionContext = executionContext;\n      executionContext |= CommitContext;\n      var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles\n\n      ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass\n      // of the effect list for each phase: all mutation effects come before all\n      // layout effects, and so on.\n      // The first phase a \"before mutation\" phase. We use this phase to read the\n      // state of the host tree right before we mutate it. This is where\n      // getSnapshotBeforeUpdate is called.\n\n      startCommitSnapshotEffectsTimer();\n      prepareForCommit(root.containerInfo);\n      nextEffect = firstEffect;\n\n      do {\n        {\n          invokeGuardedCallback(null, commitBeforeMutationEffects, null);\n\n          if (hasCaughtError()) {\n            if (!(nextEffect !== null)) {\n              {\n                throw Error( \"Should be working on an effect.\" );\n              }\n            }\n\n            var error = clearCaughtError();\n            captureCommitPhaseError(nextEffect, error);\n            nextEffect = nextEffect.nextEffect;\n          }\n        }\n      } while (nextEffect !== null);\n\n      stopCommitSnapshotEffectsTimer();\n\n      {\n        // Mark the current commit time to be shared by all Profilers in this\n        // batch. This enables them to be grouped later.\n        recordCommitTime();\n      } // The next phase is the mutation phase, where we mutate the host tree.\n\n\n      startCommitHostEffectsTimer();\n      nextEffect = firstEffect;\n\n      do {\n        {\n          invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel);\n\n          if (hasCaughtError()) {\n            if (!(nextEffect !== null)) {\n              {\n                throw Error( \"Should be working on an effect.\" );\n              }\n            }\n\n            var _error = clearCaughtError();\n\n            captureCommitPhaseError(nextEffect, _error);\n            nextEffect = nextEffect.nextEffect;\n          }\n        }\n      } while (nextEffect !== null);\n\n      stopCommitHostEffectsTimer();\n      resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after\n      // the mutation phase, so that the previous tree is still current during\n      // componentWillUnmount, but before the layout phase, so that the finished\n      // work is current during componentDidMount/Update.\n\n      root.current = finishedWork; // The next phase is the layout phase, where we call effects that read\n      // the host tree after it's been mutated. The idiomatic use case for this is\n      // layout, but class component lifecycles also fire here for legacy reasons.\n\n      startCommitLifeCyclesTimer();\n      nextEffect = firstEffect;\n\n      do {\n        {\n          invokeGuardedCallback(null, commitLayoutEffects, null, root, expirationTime);\n\n          if (hasCaughtError()) {\n            if (!(nextEffect !== null)) {\n              {\n                throw Error( \"Should be working on an effect.\" );\n              }\n            }\n\n            var _error2 = clearCaughtError();\n\n            captureCommitPhaseError(nextEffect, _error2);\n            nextEffect = nextEffect.nextEffect;\n          }\n        }\n      } while (nextEffect !== null);\n\n      stopCommitLifeCyclesTimer();\n      nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an\n      // opportunity to paint.\n\n      requestPaint();\n\n      {\n        popInteractions(prevInteractions);\n      }\n\n      executionContext = prevExecutionContext;\n    } else {\n      // No effects.\n      root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were\n      // no effects.\n      // TODO: Maybe there's a better way to report this.\n\n      startCommitSnapshotEffectsTimer();\n      stopCommitSnapshotEffectsTimer();\n\n      {\n        recordCommitTime();\n      }\n\n      startCommitHostEffectsTimer();\n      stopCommitHostEffectsTimer();\n      startCommitLifeCyclesTimer();\n      stopCommitLifeCyclesTimer();\n    }\n\n    stopCommitTimer();\n    var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;\n\n    if (rootDoesHavePassiveEffects) {\n      // This commit has passive effects. Stash a reference to them. But don't\n      // schedule a callback until after flushing layout work.\n      rootDoesHavePassiveEffects = false;\n      rootWithPendingPassiveEffects = root;\n      pendingPassiveEffectsExpirationTime = expirationTime;\n      pendingPassiveEffectsRenderPriority = renderPriorityLevel;\n    } else {\n      // We are done with the effect chain at this point so let's clear the\n      // nextEffect pointers to assist with GC. If we have passive effects, we'll\n      // clear this in flushPassiveEffects.\n      nextEffect = firstEffect;\n\n      while (nextEffect !== null) {\n        var nextNextEffect = nextEffect.nextEffect;\n        nextEffect.nextEffect = null;\n        nextEffect = nextNextEffect;\n      }\n    } // Check if there's remaining work on this root\n\n\n    var remainingExpirationTime = root.firstPendingTime;\n\n    if (remainingExpirationTime !== NoWork) {\n      {\n        if (spawnedWorkDuringRender !== null) {\n          var expirationTimes = spawnedWorkDuringRender;\n          spawnedWorkDuringRender = null;\n\n          for (var i = 0; i < expirationTimes.length; i++) {\n            scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions);\n          }\n        }\n\n        schedulePendingInteractions(root, remainingExpirationTime);\n      }\n    } else {\n      // If there's no remaining work, we can clear the set of already failed\n      // error boundaries.\n      legacyErrorBoundariesThatAlreadyFailed = null;\n    }\n\n    {\n      if (!rootDidHavePassiveEffects) {\n        // If there are no passive effects, then we can complete the pending interactions.\n        // Otherwise, we'll wait until after the passive effects are flushed.\n        // Wait to do this until after remaining work has been scheduled,\n        // so that we don't prematurely signal complete for interactions when there's e.g. hidden work.\n        finishPendingInteractions(root, expirationTime);\n      }\n    }\n\n    if (remainingExpirationTime === Sync) {\n      // Count the number of times the root synchronously re-renders without\n      // finishing. If there are too many, it indicates an infinite update loop.\n      if (root === rootWithNestedUpdates) {\n        nestedUpdateCount++;\n      } else {\n        nestedUpdateCount = 0;\n        rootWithNestedUpdates = root;\n      }\n    } else {\n      nestedUpdateCount = 0;\n    }\n\n    onCommitRoot(finishedWork.stateNode, expirationTime); // Always call this before exiting `commitRoot`, to ensure that any\n    // additional work on this root is scheduled.\n\n    ensureRootIsScheduled(root);\n\n    if (hasUncaughtError) {\n      hasUncaughtError = false;\n      var _error3 = firstUncaughtError;\n      firstUncaughtError = null;\n      throw _error3;\n    }\n\n    if ((executionContext & LegacyUnbatchedContext) !== NoContext) {\n      // This is a legacy edge case. We just committed the initial mount of\n      // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired\n      // synchronously, but layout updates should be deferred until the end\n      // of the batch.\n      return null;\n    } // If layout work was scheduled, flush it now.\n\n\n    flushSyncCallbackQueue();\n    return null;\n  }\n\n  function commitBeforeMutationEffects() {\n    while (nextEffect !== null) {\n      var effectTag = nextEffect.effectTag;\n\n      if ((effectTag & Snapshot) !== NoEffect) {\n        setCurrentFiber(nextEffect);\n        recordEffect();\n        var current = nextEffect.alternate;\n        commitBeforeMutationLifeCycles(current, nextEffect);\n        resetCurrentFiber();\n      }\n\n      if ((effectTag & Passive) !== NoEffect) {\n        // If there are passive effects, schedule a callback to flush at\n        // the earliest opportunity.\n        if (!rootDoesHavePassiveEffects) {\n          rootDoesHavePassiveEffects = true;\n          scheduleCallback(NormalPriority, function () {\n            flushPassiveEffects();\n            return null;\n          });\n        }\n      }\n\n      nextEffect = nextEffect.nextEffect;\n    }\n  }\n\n  function commitMutationEffects(root, renderPriorityLevel) {\n    // TODO: Should probably move the bulk of this function to commitWork.\n    while (nextEffect !== null) {\n      setCurrentFiber(nextEffect);\n      var effectTag = nextEffect.effectTag;\n\n      if (effectTag & ContentReset) {\n        commitResetTextContent(nextEffect);\n      }\n\n      if (effectTag & Ref) {\n        var current = nextEffect.alternate;\n\n        if (current !== null) {\n          commitDetachRef(current);\n        }\n      } // The following switch statement is only concerned about placement,\n      // updates, and deletions. To avoid needing to add a case for every possible\n      // bitmap value, we remove the secondary effects from the effect tag and\n      // switch on that value.\n\n\n      var primaryEffectTag = effectTag & (Placement | Update | Deletion | Hydrating);\n\n      switch (primaryEffectTag) {\n        case Placement:\n          {\n            commitPlacement(nextEffect); // Clear the \"placement\" from effect tag so that we know that this is\n            // inserted, before any life-cycles like componentDidMount gets called.\n            // TODO: findDOMNode doesn't rely on this any more but isMounted does\n            // and isMounted is deprecated anyway so we should be able to kill this.\n\n            nextEffect.effectTag &= ~Placement;\n            break;\n          }\n\n        case PlacementAndUpdate:\n          {\n            // Placement\n            commitPlacement(nextEffect); // Clear the \"placement\" from effect tag so that we know that this is\n            // inserted, before any life-cycles like componentDidMount gets called.\n\n            nextEffect.effectTag &= ~Placement; // Update\n\n            var _current = nextEffect.alternate;\n            commitWork(_current, nextEffect);\n            break;\n          }\n\n        case Hydrating:\n          {\n            nextEffect.effectTag &= ~Hydrating;\n            break;\n          }\n\n        case HydratingAndUpdate:\n          {\n            nextEffect.effectTag &= ~Hydrating; // Update\n\n            var _current2 = nextEffect.alternate;\n            commitWork(_current2, nextEffect);\n            break;\n          }\n\n        case Update:\n          {\n            var _current3 = nextEffect.alternate;\n            commitWork(_current3, nextEffect);\n            break;\n          }\n\n        case Deletion:\n          {\n            commitDeletion(root, nextEffect, renderPriorityLevel);\n            break;\n          }\n      } // TODO: Only record a mutation effect if primaryEffectTag is non-zero.\n\n\n      recordEffect();\n      resetCurrentFiber();\n      nextEffect = nextEffect.nextEffect;\n    }\n  }\n\n  function commitLayoutEffects(root, committedExpirationTime) {\n    // TODO: Should probably move the bulk of this function to commitWork.\n    while (nextEffect !== null) {\n      setCurrentFiber(nextEffect);\n      var effectTag = nextEffect.effectTag;\n\n      if (effectTag & (Update | Callback)) {\n        recordEffect();\n        var current = nextEffect.alternate;\n        commitLifeCycles(root, current, nextEffect);\n      }\n\n      if (effectTag & Ref) {\n        recordEffect();\n        commitAttachRef(nextEffect);\n      }\n\n      resetCurrentFiber();\n      nextEffect = nextEffect.nextEffect;\n    }\n  }\n\n  function flushPassiveEffects() {\n    if (pendingPassiveEffectsRenderPriority !== NoPriority) {\n      var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority ? NormalPriority : pendingPassiveEffectsRenderPriority;\n      pendingPassiveEffectsRenderPriority = NoPriority;\n      return runWithPriority$1(priorityLevel, flushPassiveEffectsImpl);\n    }\n  }\n\n  function flushPassiveEffectsImpl() {\n    if (rootWithPendingPassiveEffects === null) {\n      return false;\n    }\n\n    var root = rootWithPendingPassiveEffects;\n    var expirationTime = pendingPassiveEffectsExpirationTime;\n    rootWithPendingPassiveEffects = null;\n    pendingPassiveEffectsExpirationTime = NoWork;\n\n    if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) {\n      {\n        throw Error( \"Cannot flush passive effects while already rendering.\" );\n      }\n    }\n\n    var prevExecutionContext = executionContext;\n    executionContext |= CommitContext;\n    var prevInteractions = pushInteractions(root);\n\n    {\n      // Note: This currently assumes there are no passive effects on the root fiber\n      // because the root is not part of its own effect list.\n      // This could change in the future.\n      var _effect2 = root.current.firstEffect;\n\n      while (_effect2 !== null) {\n        {\n          setCurrentFiber(_effect2);\n          invokeGuardedCallback(null, commitPassiveHookEffects, null, _effect2);\n\n          if (hasCaughtError()) {\n            if (!(_effect2 !== null)) {\n              {\n                throw Error( \"Should be working on an effect.\" );\n              }\n            }\n\n            var _error5 = clearCaughtError();\n\n            captureCommitPhaseError(_effect2, _error5);\n          }\n\n          resetCurrentFiber();\n        }\n\n        var nextNextEffect = _effect2.nextEffect; // Remove nextEffect pointer to assist GC\n\n        _effect2.nextEffect = null;\n        _effect2 = nextNextEffect;\n      }\n    }\n\n    {\n      popInteractions(prevInteractions);\n      finishPendingInteractions(root, expirationTime);\n    }\n\n    executionContext = prevExecutionContext;\n    flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this\n    // exceeds the limit, we'll fire a warning.\n\n    nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1;\n    return true;\n  }\n\n  function isAlreadyFailedLegacyErrorBoundary(instance) {\n    return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);\n  }\n  function markLegacyErrorBoundaryAsFailed(instance) {\n    if (legacyErrorBoundariesThatAlreadyFailed === null) {\n      legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);\n    } else {\n      legacyErrorBoundariesThatAlreadyFailed.add(instance);\n    }\n  }\n\n  function prepareToThrowUncaughtError(error) {\n    if (!hasUncaughtError) {\n      hasUncaughtError = true;\n      firstUncaughtError = error;\n    }\n  }\n\n  var onUncaughtError = prepareToThrowUncaughtError;\n\n  function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {\n    var errorInfo = createCapturedValue(error, sourceFiber);\n    var update = createRootErrorUpdate(rootFiber, errorInfo, Sync);\n    enqueueUpdate(rootFiber, update);\n    var root = markUpdateTimeFromFiberToRoot(rootFiber, Sync);\n\n    if (root !== null) {\n      ensureRootIsScheduled(root);\n      schedulePendingInteractions(root, Sync);\n    }\n  }\n\n  function captureCommitPhaseError(sourceFiber, error) {\n    if (sourceFiber.tag === HostRoot) {\n      // Error was thrown at the root. There is no parent, so the root\n      // itself should capture it.\n      captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);\n      return;\n    }\n\n    var fiber = sourceFiber.return;\n\n    while (fiber !== null) {\n      if (fiber.tag === HostRoot) {\n        captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error);\n        return;\n      } else if (fiber.tag === ClassComponent) {\n        var ctor = fiber.type;\n        var instance = fiber.stateNode;\n\n        if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {\n          var errorInfo = createCapturedValue(error, sourceFiber);\n          var update = createClassErrorUpdate(fiber, errorInfo, // TODO: This is always sync\n          Sync);\n          enqueueUpdate(fiber, update);\n          var root = markUpdateTimeFromFiberToRoot(fiber, Sync);\n\n          if (root !== null) {\n            ensureRootIsScheduled(root);\n            schedulePendingInteractions(root, Sync);\n          }\n\n          return;\n        }\n      }\n\n      fiber = fiber.return;\n    }\n  }\n  function pingSuspendedRoot(root, thenable, suspendedTime) {\n    var pingCache = root.pingCache;\n\n    if (pingCache !== null) {\n      // The thenable resolved, so we no longer need to memoize, because it will\n      // never be thrown again.\n      pingCache.delete(thenable);\n    }\n\n    if (workInProgressRoot === root && renderExpirationTime$1 === suspendedTime) {\n      // Received a ping at the same priority level at which we're currently\n      // rendering. We might want to restart this render. This should mirror\n      // the logic of whether or not a root suspends once it completes.\n      // TODO: If we're rendering sync either due to Sync, Batched or expired,\n      // we should probably never restart.\n      // If we're suspended with delay, we'll always suspend so we can always\n      // restart. If we're suspended without any updates, it might be a retry.\n      // If it's early in the retry we can restart. We can't know for sure\n      // whether we'll eventually process an update during this render pass,\n      // but it's somewhat unlikely that we get to a ping before that, since\n      // getting to the root most update is usually very fast.\n      if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && workInProgressRootLatestProcessedExpirationTime === Sync && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {\n        // Restart from the root. Don't need to schedule a ping because\n        // we're already working on this tree.\n        prepareFreshStack(root, renderExpirationTime$1);\n      } else {\n        // Even though we can't restart right now, we might get an\n        // opportunity later. So we mark this render as having a ping.\n        workInProgressRootHasPendingPing = true;\n      }\n\n      return;\n    }\n\n    if (!isRootSuspendedAtTime(root, suspendedTime)) {\n      // The root is no longer suspended at this time.\n      return;\n    }\n\n    var lastPingedTime = root.lastPingedTime;\n\n    if (lastPingedTime !== NoWork && lastPingedTime < suspendedTime) {\n      // There's already a lower priority ping scheduled.\n      return;\n    } // Mark the time at which this ping was scheduled.\n\n\n    root.lastPingedTime = suspendedTime;\n\n    ensureRootIsScheduled(root);\n    schedulePendingInteractions(root, suspendedTime);\n  }\n\n  function retryTimedOutBoundary(boundaryFiber, retryTime) {\n    // The boundary fiber (a Suspense component or SuspenseList component)\n    // previously was rendered in its fallback state. One of the promises that\n    // suspended it has resolved, which means at least part of the tree was\n    // likely unblocked. Try rendering again, at a new expiration time.\n    if (retryTime === NoWork) {\n      var suspenseConfig = null; // Retries don't carry over the already committed update.\n\n      var currentTime = requestCurrentTimeForUpdate();\n      retryTime = computeExpirationForFiber(currentTime, boundaryFiber, suspenseConfig);\n    } // TODO: Special case idle priority?\n\n\n    var root = markUpdateTimeFromFiberToRoot(boundaryFiber, retryTime);\n\n    if (root !== null) {\n      ensureRootIsScheduled(root);\n      schedulePendingInteractions(root, retryTime);\n    }\n  }\n  function resolveRetryThenable(boundaryFiber, thenable) {\n    var retryTime = NoWork; // Default\n\n    var retryCache;\n\n    {\n      retryCache = boundaryFiber.stateNode;\n    }\n\n    if (retryCache !== null) {\n      // The thenable resolved, so we no longer need to memoize, because it will\n      // never be thrown again.\n      retryCache.delete(thenable);\n    }\n\n    retryTimedOutBoundary(boundaryFiber, retryTime);\n  } // Computes the next Just Noticeable Difference (JND) boundary.\n  // The theory is that a person can't tell the difference between small differences in time.\n  // Therefore, if we wait a bit longer than necessary that won't translate to a noticeable\n  // difference in the experience. However, waiting for longer might mean that we can avoid\n  // showing an intermediate loading state. The longer we have already waited, the harder it\n  // is to tell small differences in time. Therefore, the longer we've already waited,\n  // the longer we can wait additionally. At some point we have to give up though.\n  // We pick a train model where the next boundary commits at a consistent schedule.\n  // These particular numbers are vague estimates. We expect to adjust them based on research.\n\n  function jnd(timeElapsed) {\n    return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;\n  }\n\n  function computeMsUntilSuspenseLoadingDelay(mostRecentEventTime, committedExpirationTime, suspenseConfig) {\n    var busyMinDurationMs = suspenseConfig.busyMinDurationMs | 0;\n\n    if (busyMinDurationMs <= 0) {\n      return 0;\n    }\n\n    var busyDelayMs = suspenseConfig.busyDelayMs | 0; // Compute the time until this render pass would expire.\n\n    var currentTimeMs = now();\n    var eventTimeMs = inferTimeFromExpirationTimeWithSuspenseConfig(mostRecentEventTime, suspenseConfig);\n    var timeElapsed = currentTimeMs - eventTimeMs;\n\n    if (timeElapsed <= busyDelayMs) {\n      // If we haven't yet waited longer than the initial delay, we don't\n      // have to wait any additional time.\n      return 0;\n    }\n\n    var msUntilTimeout = busyDelayMs + busyMinDurationMs - timeElapsed; // This is the value that is passed to `setTimeout`.\n\n    return msUntilTimeout;\n  }\n\n  function checkForNestedUpdates() {\n    if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {\n      nestedUpdateCount = 0;\n      rootWithNestedUpdates = null;\n\n      {\n        {\n          throw Error( \"Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.\" );\n        }\n      }\n    }\n\n    {\n      if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {\n        nestedPassiveUpdateCount = 0;\n\n        error('Maximum update depth exceeded. This can happen when a component ' + \"calls setState inside useEffect, but useEffect either doesn't \" + 'have a dependency array, or one of the dependencies changes on ' + 'every render.');\n      }\n    }\n  }\n\n  function flushRenderPhaseStrictModeWarningsInDEV() {\n    {\n      ReactStrictModeWarnings.flushLegacyContextWarning();\n\n      {\n        ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();\n      }\n    }\n  }\n\n  function stopFinishedWorkLoopTimer() {\n    var didCompleteRoot = true;\n    stopWorkLoopTimer(interruptedBy, didCompleteRoot);\n    interruptedBy = null;\n  }\n\n  function stopInterruptedWorkLoopTimer() {\n    // TODO: Track which fiber caused the interruption.\n    var didCompleteRoot = false;\n    stopWorkLoopTimer(interruptedBy, didCompleteRoot);\n    interruptedBy = null;\n  }\n\n  function checkForInterruption(fiberThatReceivedUpdate, updateExpirationTime) {\n    if ( workInProgressRoot !== null && updateExpirationTime > renderExpirationTime$1) {\n      interruptedBy = fiberThatReceivedUpdate;\n    }\n  }\n\n  var didWarnStateUpdateForUnmountedComponent = null;\n\n  function warnAboutUpdateOnUnmountedFiberInDEV(fiber) {\n    {\n      var tag = fiber.tag;\n\n      if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) {\n        // Only warn for user-defined components, not internal ones like Suspense.\n        return;\n      }\n      // the problematic code almost always lies inside that component.\n\n\n      var componentName = getComponentName(fiber.type) || 'ReactComponent';\n\n      if (didWarnStateUpdateForUnmountedComponent !== null) {\n        if (didWarnStateUpdateForUnmountedComponent.has(componentName)) {\n          return;\n        }\n\n        didWarnStateUpdateForUnmountedComponent.add(componentName);\n      } else {\n        didWarnStateUpdateForUnmountedComponent = new Set([componentName]);\n      }\n\n      error(\"Can't perform a React state update on an unmounted component. This \" + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.%s', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function', getStackByFiberInDevAndProd(fiber));\n    }\n  }\n\n  var beginWork$1;\n\n  {\n    var dummyFiber = null;\n\n    beginWork$1 = function (current, unitOfWork, expirationTime) {\n      // If a component throws an error, we replay it again in a synchronously\n      // dispatched event, so that the debugger will treat it as an uncaught\n      // error See ReactErrorUtils for more information.\n      // Before entering the begin phase, copy the work-in-progress onto a dummy\n      // fiber. If beginWork throws, we'll use this to reset the state.\n      var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);\n\n      try {\n        return beginWork(current, unitOfWork, expirationTime);\n      } catch (originalError) {\n        if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {\n          // Don't replay promises. Treat everything else like an error.\n          throw originalError;\n        } // Keep this code in sync with handleError; any changes here must have\n        // corresponding changes there.\n\n\n        resetContextDependencies();\n        resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the\n        // same fiber again.\n        // Unwind the failed stack frame\n\n        unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber.\n\n        assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);\n\n        if ( unitOfWork.mode & ProfileMode) {\n          // Reset the profiler timer.\n          startProfilerTimer(unitOfWork);\n        } // Run beginWork again.\n\n\n        invokeGuardedCallback(null, beginWork, null, current, unitOfWork, expirationTime);\n\n        if (hasCaughtError()) {\n          var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`.\n          // Rethrow this error instead of the original one.\n\n          throw replayError;\n        } else {\n          // This branch is reachable if the render phase is impure.\n          throw originalError;\n        }\n      }\n    };\n  }\n\n  var didWarnAboutUpdateInRender = false;\n  var didWarnAboutUpdateInRenderForAnotherComponent;\n\n  {\n    didWarnAboutUpdateInRenderForAnotherComponent = new Set();\n  }\n\n  function warnAboutRenderPhaseUpdatesInDEV(fiber) {\n    {\n      if (isRendering && (executionContext & RenderContext) !== NoContext) {\n        switch (fiber.tag) {\n          case FunctionComponent:\n          case ForwardRef:\n          case SimpleMemoComponent:\n            {\n              var renderingComponentName = workInProgress && getComponentName(workInProgress.type) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed.\n\n              var dedupeKey = renderingComponentName;\n\n              if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {\n                didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);\n                var setStateComponentName = getComponentName(fiber.type) || 'Unknown';\n\n                error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://fb.me/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName);\n              }\n\n              break;\n            }\n\n          case ClassComponent:\n            {\n              if (!didWarnAboutUpdateInRender) {\n                error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.');\n\n                didWarnAboutUpdateInRender = true;\n              }\n\n              break;\n            }\n        }\n      }\n    }\n  } // a 'shared' variable that changes when act() opens/closes in tests.\n\n\n  var IsThisRendererActing = {\n    current: false\n  };\n  function warnIfNotScopedWithMatchingAct(fiber) {\n    {\n      if ( IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) {\n        error(\"It looks like you're using the wrong act() around your test interactions.\\n\" + 'Be sure to use the matching version of act() corresponding to your renderer:\\n\\n' + '// for react-dom:\\n' + \"import {act} from 'react-dom/test-utils';\\n\" + '// ...\\n' + 'act(() => ...);\\n\\n' + '// for react-test-renderer:\\n' + \"import TestRenderer from 'react-test-renderer';\\n\" + 'const {act} = TestRenderer;\\n' + '// ...\\n' + 'act(() => ...);' + '%s', getStackByFiberInDevAndProd(fiber));\n      }\n    }\n  }\n  function warnIfNotCurrentlyActingEffectsInDEV(fiber) {\n    {\n      if ( (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {\n        error('An update to %s ran an effect, but was not wrapped in act(...).\\n\\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\\n\\n' + 'act(() => {\\n' + '  /* fire events that update state */\\n' + '});\\n' + '/* assert on the output */\\n\\n' + \"This ensures that you're testing the behavior the user would see \" + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));\n      }\n    }\n  }\n\n  function warnIfNotCurrentlyActingUpdatesInDEV(fiber) {\n    {\n      if ( executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) {\n        error('An update to %s inside a test was not wrapped in act(...).\\n\\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\\n\\n' + 'act(() => {\\n' + '  /* fire events that update state */\\n' + '});\\n' + '/* assert on the output */\\n\\n' + \"This ensures that you're testing the behavior the user would see \" + 'in the browser.' + ' Learn more at https://fb.me/react-wrap-tests-with-act' + '%s', getComponentName(fiber.type), getStackByFiberInDevAndProd(fiber));\n      }\n    }\n  }\n\n  var warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler.\n\n  var didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked\n  // scheduler is the actual recommendation. The alternative could be a testing build,\n  // a new lib, or whatever; we dunno just yet. This message is for early adopters\n  // to get their tests right.\n\n  function warnIfUnmockedScheduler(fiber) {\n    {\n      if (didWarnAboutUnmockedScheduler === false && unstable_flushAllWithoutAsserting === undefined) {\n        if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) {\n          didWarnAboutUnmockedScheduler = true;\n\n          error('In Concurrent or Sync modes, the \"scheduler\" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \\n' + \"jest.mock('scheduler', () => require('scheduler/unstable_mock'));\\n\\n\" + 'For more info, visit https://fb.me/react-mock-scheduler');\n        }\n      }\n    }\n  }\n\n  function computeThreadID(root, expirationTime) {\n    // Interaction threads are unique per root and expiration time.\n    return expirationTime * 1000 + root.interactionThreadID;\n  }\n\n  function markSpawnedWork(expirationTime) {\n\n    if (spawnedWorkDuringRender === null) {\n      spawnedWorkDuringRender = [expirationTime];\n    } else {\n      spawnedWorkDuringRender.push(expirationTime);\n    }\n  }\n\n  function scheduleInteractions(root, expirationTime, interactions) {\n\n    if (interactions.size > 0) {\n      var pendingInteractionMap = root.pendingInteractionMap;\n      var pendingInteractions = pendingInteractionMap.get(expirationTime);\n\n      if (pendingInteractions != null) {\n        interactions.forEach(function (interaction) {\n          if (!pendingInteractions.has(interaction)) {\n            // Update the pending async work count for previously unscheduled interaction.\n            interaction.__count++;\n          }\n\n          pendingInteractions.add(interaction);\n        });\n      } else {\n        pendingInteractionMap.set(expirationTime, new Set(interactions)); // Update the pending async work count for the current interactions.\n\n        interactions.forEach(function (interaction) {\n          interaction.__count++;\n        });\n      }\n\n      var subscriber = __subscriberRef.current;\n\n      if (subscriber !== null) {\n        var threadID = computeThreadID(root, expirationTime);\n        subscriber.onWorkScheduled(interactions, threadID);\n      }\n    }\n  }\n\n  function schedulePendingInteractions(root, expirationTime) {\n\n    scheduleInteractions(root, expirationTime, __interactionsRef.current);\n  }\n\n  function startWorkOnPendingInteractions(root, expirationTime) {\n    // we can accurately attribute time spent working on it, And so that cascading\n    // work triggered during the render phase will be associated with it.\n\n\n    var interactions = new Set();\n    root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {\n      if (scheduledExpirationTime >= expirationTime) {\n        scheduledInteractions.forEach(function (interaction) {\n          return interactions.add(interaction);\n        });\n      }\n    }); // Store the current set of interactions on the FiberRoot for a few reasons:\n    // We can re-use it in hot functions like performConcurrentWorkOnRoot()\n    // without having to recalculate it. We will also use it in commitWork() to\n    // pass to any Profiler onRender() hooks. This also provides DevTools with a\n    // way to access it when the onCommitRoot() hook is called.\n\n    root.memoizedInteractions = interactions;\n\n    if (interactions.size > 0) {\n      var subscriber = __subscriberRef.current;\n\n      if (subscriber !== null) {\n        var threadID = computeThreadID(root, expirationTime);\n\n        try {\n          subscriber.onWorkStarted(interactions, threadID);\n        } catch (error) {\n          // If the subscriber throws, rethrow it in a separate task\n          scheduleCallback(ImmediatePriority, function () {\n            throw error;\n          });\n        }\n      }\n    }\n  }\n\n  function finishPendingInteractions(root, committedExpirationTime) {\n\n    var earliestRemainingTimeAfterCommit = root.firstPendingTime;\n    var subscriber;\n\n    try {\n      subscriber = __subscriberRef.current;\n\n      if (subscriber !== null && root.memoizedInteractions.size > 0) {\n        var threadID = computeThreadID(root, committedExpirationTime);\n        subscriber.onWorkStopped(root.memoizedInteractions, threadID);\n      }\n    } catch (error) {\n      // If the subscriber throws, rethrow it in a separate task\n      scheduleCallback(ImmediatePriority, function () {\n        throw error;\n      });\n    } finally {\n      // Clear completed interactions from the pending Map.\n      // Unless the render was suspended or cascading work was scheduled,\n      // In which case– leave pending interactions until the subsequent render.\n      var pendingInteractionMap = root.pendingInteractionMap;\n      pendingInteractionMap.forEach(function (scheduledInteractions, scheduledExpirationTime) {\n        // Only decrement the pending interaction count if we're done.\n        // If there's still work at the current priority,\n        // That indicates that we are waiting for suspense data.\n        if (scheduledExpirationTime > earliestRemainingTimeAfterCommit) {\n          pendingInteractionMap.delete(scheduledExpirationTime);\n          scheduledInteractions.forEach(function (interaction) {\n            interaction.__count--;\n\n            if (subscriber !== null && interaction.__count === 0) {\n              try {\n                subscriber.onInteractionScheduledWorkCompleted(interaction);\n              } catch (error) {\n                // If the subscriber throws, rethrow it in a separate task\n                scheduleCallback(ImmediatePriority, function () {\n                  throw error;\n                });\n              }\n            }\n          });\n        }\n      });\n    }\n  }\n\n  var onScheduleFiberRoot = null;\n  var onCommitFiberRoot = null;\n  var onCommitFiberUnmount = null;\n  var hasLoggedError = false;\n  var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';\n  function injectInternals(internals) {\n    if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {\n      // No DevTools\n      return false;\n    }\n\n    var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n    if (hook.isDisabled) {\n      // This isn't a real property on the hook, but it can be set to opt out\n      // of DevTools integration and associated warnings and logs.\n      // https://github.com/facebook/react/issues/3877\n      return true;\n    }\n\n    if (!hook.supportsFiber) {\n      {\n        error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools');\n      } // DevTools exists, even though it doesn't support Fiber.\n\n\n      return true;\n    }\n\n    try {\n      var rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.\n\n      if (true) {\n        // Only used by Fast Refresh\n        if (typeof hook.onScheduleFiberRoot === 'function') {\n          onScheduleFiberRoot = function (root, children) {\n            try {\n              hook.onScheduleFiberRoot(rendererID, root, children);\n            } catch (err) {\n              if (true && !hasLoggedError) {\n                hasLoggedError = true;\n\n                error('React instrumentation encountered an error: %s', err);\n              }\n            }\n          };\n        }\n      }\n\n      onCommitFiberRoot = function (root, expirationTime) {\n        try {\n          var didError = (root.current.effectTag & DidCapture) === DidCapture;\n\n          if (enableProfilerTimer) {\n            var currentTime = getCurrentTime();\n            var priorityLevel = inferPriorityFromExpirationTime(currentTime, expirationTime);\n            hook.onCommitFiberRoot(rendererID, root, priorityLevel, didError);\n          } else {\n            hook.onCommitFiberRoot(rendererID, root, undefined, didError);\n          }\n        } catch (err) {\n          if (true) {\n            if (!hasLoggedError) {\n              hasLoggedError = true;\n\n              error('React instrumentation encountered an error: %s', err);\n            }\n          }\n        }\n      };\n\n      onCommitFiberUnmount = function (fiber) {\n        try {\n          hook.onCommitFiberUnmount(rendererID, fiber);\n        } catch (err) {\n          if (true) {\n            if (!hasLoggedError) {\n              hasLoggedError = true;\n\n              error('React instrumentation encountered an error: %s', err);\n            }\n          }\n        }\n      };\n    } catch (err) {\n      // Catch all errors because it is unsafe to throw during initialization.\n      {\n        error('React instrumentation encountered an error: %s.', err);\n      }\n    } // DevTools exists\n\n\n    return true;\n  }\n  function onScheduleRoot(root, children) {\n    if (typeof onScheduleFiberRoot === 'function') {\n      onScheduleFiberRoot(root, children);\n    }\n  }\n  function onCommitRoot(root, expirationTime) {\n    if (typeof onCommitFiberRoot === 'function') {\n      onCommitFiberRoot(root, expirationTime);\n    }\n  }\n  function onCommitUnmount(fiber) {\n    if (typeof onCommitFiberUnmount === 'function') {\n      onCommitFiberUnmount(fiber);\n    }\n  }\n\n  var hasBadMapPolyfill;\n\n  {\n    hasBadMapPolyfill = false;\n\n    try {\n      var nonExtensibleObject = Object.preventExtensions({});\n      var testMap = new Map([[nonExtensibleObject, null]]);\n      var testSet = new Set([nonExtensibleObject]); // This is necessary for Rollup to not consider these unused.\n      // https://github.com/rollup/rollup/issues/1771\n      // TODO: we can remove these if Rollup fixes the bug.\n\n      testMap.set(0, 0);\n      testSet.add(0);\n    } catch (e) {\n      // TODO: Consider warning about bad polyfills\n      hasBadMapPolyfill = true;\n    }\n  }\n\n  var debugCounter = 1;\n\n  function FiberNode(tag, pendingProps, key, mode) {\n    // Instance\n    this.tag = tag;\n    this.key = key;\n    this.elementType = null;\n    this.type = null;\n    this.stateNode = null; // Fiber\n\n    this.return = null;\n    this.child = null;\n    this.sibling = null;\n    this.index = 0;\n    this.ref = null;\n    this.pendingProps = pendingProps;\n    this.memoizedProps = null;\n    this.updateQueue = null;\n    this.memoizedState = null;\n    this.dependencies = null;\n    this.mode = mode; // Effects\n\n    this.effectTag = NoEffect;\n    this.nextEffect = null;\n    this.firstEffect = null;\n    this.lastEffect = null;\n    this.expirationTime = NoWork;\n    this.childExpirationTime = NoWork;\n    this.alternate = null;\n\n    {\n      // Note: The following is done to avoid a v8 performance cliff.\n      //\n      // Initializing the fields below to smis and later updating them with\n      // double values will cause Fibers to end up having separate shapes.\n      // This behavior/bug has something to do with Object.preventExtension().\n      // Fortunately this only impacts DEV builds.\n      // Unfortunately it makes React unusably slow for some applications.\n      // To work around this, initialize the fields below with doubles.\n      //\n      // Learn more about this here:\n      // https://github.com/facebook/react/issues/14365\n      // https://bugs.chromium.org/p/v8/issues/detail?id=8538\n      this.actualDuration = Number.NaN;\n      this.actualStartTime = Number.NaN;\n      this.selfBaseDuration = Number.NaN;\n      this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.\n      // This won't trigger the performance cliff mentioned above,\n      // and it simplifies other profiler code (including DevTools).\n\n      this.actualDuration = 0;\n      this.actualStartTime = -1;\n      this.selfBaseDuration = 0;\n      this.treeBaseDuration = 0;\n    } // This is normally DEV-only except www when it adds listeners.\n    // TODO: remove the User Timing integration in favor of Root Events.\n\n\n    {\n      this._debugID = debugCounter++;\n      this._debugIsCurrentlyTiming = false;\n    }\n\n    {\n      this._debugSource = null;\n      this._debugOwner = null;\n      this._debugNeedsRemount = false;\n      this._debugHookTypes = null;\n\n      if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {\n        Object.preventExtensions(this);\n      }\n    }\n  } // This is a constructor function, rather than a POJO constructor, still\n  // please ensure we do the following:\n  // 1) Nobody should add any instance methods on this. Instance methods can be\n  //    more difficult to predict when they get optimized and they are almost\n  //    never inlined properly in static compilers.\n  // 2) Nobody should rely on `instanceof Fiber` for type testing. We should\n  //    always know when it is a fiber.\n  // 3) We might want to experiment with using numeric keys since they are easier\n  //    to optimize in a non-JIT environment.\n  // 4) We can easily go from a constructor to a createFiber object literal if that\n  //    is faster.\n  // 5) It should be easy to port this to a C struct and keep a C implementation\n  //    compatible.\n\n\n  var createFiber = function (tag, pendingProps, key, mode) {\n    // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors\n    return new FiberNode(tag, pendingProps, key, mode);\n  };\n\n  function shouldConstruct(Component) {\n    var prototype = Component.prototype;\n    return !!(prototype && prototype.isReactComponent);\n  }\n\n  function isSimpleFunctionComponent(type) {\n    return typeof type === 'function' && !shouldConstruct(type) && type.defaultProps === undefined;\n  }\n  function resolveLazyComponentTag(Component) {\n    if (typeof Component === 'function') {\n      return shouldConstruct(Component) ? ClassComponent : FunctionComponent;\n    } else if (Component !== undefined && Component !== null) {\n      var $$typeof = Component.$$typeof;\n\n      if ($$typeof === REACT_FORWARD_REF_TYPE) {\n        return ForwardRef;\n      }\n\n      if ($$typeof === REACT_MEMO_TYPE) {\n        return MemoComponent;\n      }\n    }\n\n    return IndeterminateComponent;\n  } // This is used to create an alternate fiber to do work on.\n\n  function createWorkInProgress(current, pendingProps) {\n    var workInProgress = current.alternate;\n\n    if (workInProgress === null) {\n      // We use a double buffering pooling technique because we know that we'll\n      // only ever need at most two versions of a tree. We pool the \"other\" unused\n      // node that we're free to reuse. This is lazily created to avoid allocating\n      // extra objects for things that are never updated. It also allow us to\n      // reclaim the extra memory if needed.\n      workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);\n      workInProgress.elementType = current.elementType;\n      workInProgress.type = current.type;\n      workInProgress.stateNode = current.stateNode;\n\n      {\n        // DEV-only fields\n        {\n          workInProgress._debugID = current._debugID;\n        }\n\n        workInProgress._debugSource = current._debugSource;\n        workInProgress._debugOwner = current._debugOwner;\n        workInProgress._debugHookTypes = current._debugHookTypes;\n      }\n\n      workInProgress.alternate = current;\n      current.alternate = workInProgress;\n    } else {\n      workInProgress.pendingProps = pendingProps; // We already have an alternate.\n      // Reset the effect tag.\n\n      workInProgress.effectTag = NoEffect; // The effect list is no longer valid.\n\n      workInProgress.nextEffect = null;\n      workInProgress.firstEffect = null;\n      workInProgress.lastEffect = null;\n\n      {\n        // We intentionally reset, rather than copy, actualDuration & actualStartTime.\n        // This prevents time from endlessly accumulating in new commits.\n        // This has the downside of resetting values for different priority renders,\n        // But works for yielding (the common case) and should support resuming.\n        workInProgress.actualDuration = 0;\n        workInProgress.actualStartTime = -1;\n      }\n    }\n\n    workInProgress.childExpirationTime = current.childExpirationTime;\n    workInProgress.expirationTime = current.expirationTime;\n    workInProgress.child = current.child;\n    workInProgress.memoizedProps = current.memoizedProps;\n    workInProgress.memoizedState = current.memoizedState;\n    workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so\n    // it cannot be shared with the current fiber.\n\n    var currentDependencies = current.dependencies;\n    workInProgress.dependencies = currentDependencies === null ? null : {\n      expirationTime: currentDependencies.expirationTime,\n      firstContext: currentDependencies.firstContext,\n      responders: currentDependencies.responders\n    }; // These will be overridden during the parent's reconciliation\n\n    workInProgress.sibling = current.sibling;\n    workInProgress.index = current.index;\n    workInProgress.ref = current.ref;\n\n    {\n      workInProgress.selfBaseDuration = current.selfBaseDuration;\n      workInProgress.treeBaseDuration = current.treeBaseDuration;\n    }\n\n    {\n      workInProgress._debugNeedsRemount = current._debugNeedsRemount;\n\n      switch (workInProgress.tag) {\n        case IndeterminateComponent:\n        case FunctionComponent:\n        case SimpleMemoComponent:\n          workInProgress.type = resolveFunctionForHotReloading(current.type);\n          break;\n\n        case ClassComponent:\n          workInProgress.type = resolveClassForHotReloading(current.type);\n          break;\n\n        case ForwardRef:\n          workInProgress.type = resolveForwardRefForHotReloading(current.type);\n          break;\n      }\n    }\n\n    return workInProgress;\n  } // Used to reuse a Fiber for a second pass.\n\n  function resetWorkInProgress(workInProgress, renderExpirationTime) {\n    // This resets the Fiber to what createFiber or createWorkInProgress would\n    // have set the values to before during the first pass. Ideally this wouldn't\n    // be necessary but unfortunately many code paths reads from the workInProgress\n    // when they should be reading from current and writing to workInProgress.\n    // We assume pendingProps, index, key, ref, return are still untouched to\n    // avoid doing another reconciliation.\n    // Reset the effect tag but keep any Placement tags, since that's something\n    // that child fiber is setting, not the reconciliation.\n    workInProgress.effectTag &= Placement; // The effect list is no longer valid.\n\n    workInProgress.nextEffect = null;\n    workInProgress.firstEffect = null;\n    workInProgress.lastEffect = null;\n    var current = workInProgress.alternate;\n\n    if (current === null) {\n      // Reset to createFiber's initial values.\n      workInProgress.childExpirationTime = NoWork;\n      workInProgress.expirationTime = renderExpirationTime;\n      workInProgress.child = null;\n      workInProgress.memoizedProps = null;\n      workInProgress.memoizedState = null;\n      workInProgress.updateQueue = null;\n      workInProgress.dependencies = null;\n\n      {\n        // Note: We don't reset the actualTime counts. It's useful to accumulate\n        // actual time across multiple render passes.\n        workInProgress.selfBaseDuration = 0;\n        workInProgress.treeBaseDuration = 0;\n      }\n    } else {\n      // Reset to the cloned values that createWorkInProgress would've.\n      workInProgress.childExpirationTime = current.childExpirationTime;\n      workInProgress.expirationTime = current.expirationTime;\n      workInProgress.child = current.child;\n      workInProgress.memoizedProps = current.memoizedProps;\n      workInProgress.memoizedState = current.memoizedState;\n      workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so\n      // it cannot be shared with the current fiber.\n\n      var currentDependencies = current.dependencies;\n      workInProgress.dependencies = currentDependencies === null ? null : {\n        expirationTime: currentDependencies.expirationTime,\n        firstContext: currentDependencies.firstContext,\n        responders: currentDependencies.responders\n      };\n\n      {\n        // Note: We don't reset the actualTime counts. It's useful to accumulate\n        // actual time across multiple render passes.\n        workInProgress.selfBaseDuration = current.selfBaseDuration;\n        workInProgress.treeBaseDuration = current.treeBaseDuration;\n      }\n    }\n\n    return workInProgress;\n  }\n  function createHostRootFiber(tag) {\n    var mode;\n\n    if (tag === ConcurrentRoot) {\n      mode = ConcurrentMode | BlockingMode | StrictMode;\n    } else if (tag === BlockingRoot) {\n      mode = BlockingMode | StrictMode;\n    } else {\n      mode = NoMode;\n    }\n\n    if ( isDevToolsPresent) {\n      // Always collect profile timings when DevTools are present.\n      // This enables DevTools to start capturing timing at any point–\n      // Without some nodes in the tree having empty base times.\n      mode |= ProfileMode;\n    }\n\n    return createFiber(HostRoot, null, null, mode);\n  }\n  function createFiberFromTypeAndProps(type, // React$ElementType\n  key, pendingProps, owner, mode, expirationTime) {\n    var fiber;\n    var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.\n\n    var resolvedType = type;\n\n    if (typeof type === 'function') {\n      if (shouldConstruct(type)) {\n        fiberTag = ClassComponent;\n\n        {\n          resolvedType = resolveClassForHotReloading(resolvedType);\n        }\n      } else {\n        {\n          resolvedType = resolveFunctionForHotReloading(resolvedType);\n        }\n      }\n    } else if (typeof type === 'string') {\n      fiberTag = HostComponent;\n    } else {\n      getTag: switch (type) {\n        case REACT_FRAGMENT_TYPE:\n          return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);\n\n        case REACT_CONCURRENT_MODE_TYPE:\n          fiberTag = Mode;\n          mode |= ConcurrentMode | BlockingMode | StrictMode;\n          break;\n\n        case REACT_STRICT_MODE_TYPE:\n          fiberTag = Mode;\n          mode |= StrictMode;\n          break;\n\n        case REACT_PROFILER_TYPE:\n          return createFiberFromProfiler(pendingProps, mode, expirationTime, key);\n\n        case REACT_SUSPENSE_TYPE:\n          return createFiberFromSuspense(pendingProps, mode, expirationTime, key);\n\n        case REACT_SUSPENSE_LIST_TYPE:\n          return createFiberFromSuspenseList(pendingProps, mode, expirationTime, key);\n\n        default:\n          {\n            if (typeof type === 'object' && type !== null) {\n              switch (type.$$typeof) {\n                case REACT_PROVIDER_TYPE:\n                  fiberTag = ContextProvider;\n                  break getTag;\n\n                case REACT_CONTEXT_TYPE:\n                  // This is a consumer\n                  fiberTag = ContextConsumer;\n                  break getTag;\n\n                case REACT_FORWARD_REF_TYPE:\n                  fiberTag = ForwardRef;\n\n                  {\n                    resolvedType = resolveForwardRefForHotReloading(resolvedType);\n                  }\n\n                  break getTag;\n\n                case REACT_MEMO_TYPE:\n                  fiberTag = MemoComponent;\n                  break getTag;\n\n                case REACT_LAZY_TYPE:\n                  fiberTag = LazyComponent;\n                  resolvedType = null;\n                  break getTag;\n\n                case REACT_BLOCK_TYPE:\n                  fiberTag = Block;\n                  break getTag;\n\n              }\n            }\n\n            var info = '';\n\n            {\n              if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n                info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and \" + 'named imports.';\n              }\n\n              var ownerName = owner ? getComponentName(owner.type) : null;\n\n              if (ownerName) {\n                info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n              }\n            }\n\n            {\n              {\n                throw Error( \"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: \" + (type == null ? type : typeof type) + \".\" + info );\n              }\n            }\n          }\n      }\n    }\n\n    fiber = createFiber(fiberTag, pendingProps, key, mode);\n    fiber.elementType = type;\n    fiber.type = resolvedType;\n    fiber.expirationTime = expirationTime;\n    return fiber;\n  }\n  function createFiberFromElement(element, mode, expirationTime) {\n    var owner = null;\n\n    {\n      owner = element._owner;\n    }\n\n    var type = element.type;\n    var key = element.key;\n    var pendingProps = element.props;\n    var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, expirationTime);\n\n    {\n      fiber._debugSource = element._source;\n      fiber._debugOwner = element._owner;\n    }\n\n    return fiber;\n  }\n  function createFiberFromFragment(elements, mode, expirationTime, key) {\n    var fiber = createFiber(Fragment, elements, key, mode);\n    fiber.expirationTime = expirationTime;\n    return fiber;\n  }\n\n  function createFiberFromProfiler(pendingProps, mode, expirationTime, key) {\n    {\n      if (typeof pendingProps.id !== 'string' || typeof pendingProps.onRender !== 'function') {\n        error('Profiler must specify an \"id\" string and \"onRender\" function as props');\n      }\n    }\n\n    var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag.\n\n    fiber.elementType = REACT_PROFILER_TYPE;\n    fiber.type = REACT_PROFILER_TYPE;\n    fiber.expirationTime = expirationTime;\n    return fiber;\n  }\n\n  function createFiberFromSuspense(pendingProps, mode, expirationTime, key) {\n    var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.\n    // This needs to be fixed in getComponentName so that it relies on the tag\n    // instead.\n\n    fiber.type = REACT_SUSPENSE_TYPE;\n    fiber.elementType = REACT_SUSPENSE_TYPE;\n    fiber.expirationTime = expirationTime;\n    return fiber;\n  }\n  function createFiberFromSuspenseList(pendingProps, mode, expirationTime, key) {\n    var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);\n\n    {\n      // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag.\n      // This needs to be fixed in getComponentName so that it relies on the tag\n      // instead.\n      fiber.type = REACT_SUSPENSE_LIST_TYPE;\n    }\n\n    fiber.elementType = REACT_SUSPENSE_LIST_TYPE;\n    fiber.expirationTime = expirationTime;\n    return fiber;\n  }\n  function createFiberFromText(content, mode, expirationTime) {\n    var fiber = createFiber(HostText, content, null, mode);\n    fiber.expirationTime = expirationTime;\n    return fiber;\n  }\n  function createFiberFromHostInstanceForDeletion() {\n    var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type.\n\n    fiber.elementType = 'DELETED';\n    fiber.type = 'DELETED';\n    return fiber;\n  }\n  function createFiberFromPortal(portal, mode, expirationTime) {\n    var pendingProps = portal.children !== null ? portal.children : [];\n    var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);\n    fiber.expirationTime = expirationTime;\n    fiber.stateNode = {\n      containerInfo: portal.containerInfo,\n      pendingChildren: null,\n      // Used by persistent updates\n      implementation: portal.implementation\n    };\n    return fiber;\n  } // Used for stashing WIP properties to replay failed work in DEV.\n\n  function assignFiberPropertiesInDEV(target, source) {\n    if (target === null) {\n      // This Fiber's initial properties will always be overwritten.\n      // We only use a Fiber to ensure the same hidden class so DEV isn't slow.\n      target = createFiber(IndeterminateComponent, null, null, NoMode);\n    } // This is intentionally written as a list of all properties.\n    // We tried to use Object.assign() instead but this is called in\n    // the hottest path, and Object.assign() was too slow:\n    // https://github.com/facebook/react/issues/12502\n    // This code is DEV-only so size is not a concern.\n\n\n    target.tag = source.tag;\n    target.key = source.key;\n    target.elementType = source.elementType;\n    target.type = source.type;\n    target.stateNode = source.stateNode;\n    target.return = source.return;\n    target.child = source.child;\n    target.sibling = source.sibling;\n    target.index = source.index;\n    target.ref = source.ref;\n    target.pendingProps = source.pendingProps;\n    target.memoizedProps = source.memoizedProps;\n    target.updateQueue = source.updateQueue;\n    target.memoizedState = source.memoizedState;\n    target.dependencies = source.dependencies;\n    target.mode = source.mode;\n    target.effectTag = source.effectTag;\n    target.nextEffect = source.nextEffect;\n    target.firstEffect = source.firstEffect;\n    target.lastEffect = source.lastEffect;\n    target.expirationTime = source.expirationTime;\n    target.childExpirationTime = source.childExpirationTime;\n    target.alternate = source.alternate;\n\n    {\n      target.actualDuration = source.actualDuration;\n      target.actualStartTime = source.actualStartTime;\n      target.selfBaseDuration = source.selfBaseDuration;\n      target.treeBaseDuration = source.treeBaseDuration;\n    }\n\n    {\n      target._debugID = source._debugID;\n    }\n\n    target._debugSource = source._debugSource;\n    target._debugOwner = source._debugOwner;\n    target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming;\n    target._debugNeedsRemount = source._debugNeedsRemount;\n    target._debugHookTypes = source._debugHookTypes;\n    return target;\n  }\n\n  function FiberRootNode(containerInfo, tag, hydrate) {\n    this.tag = tag;\n    this.current = null;\n    this.containerInfo = containerInfo;\n    this.pendingChildren = null;\n    this.pingCache = null;\n    this.finishedExpirationTime = NoWork;\n    this.finishedWork = null;\n    this.timeoutHandle = noTimeout;\n    this.context = null;\n    this.pendingContext = null;\n    this.hydrate = hydrate;\n    this.callbackNode = null;\n    this.callbackPriority = NoPriority;\n    this.firstPendingTime = NoWork;\n    this.firstSuspendedTime = NoWork;\n    this.lastSuspendedTime = NoWork;\n    this.nextKnownPendingLevel = NoWork;\n    this.lastPingedTime = NoWork;\n    this.lastExpiredTime = NoWork;\n\n    {\n      this.interactionThreadID = unstable_getThreadID();\n      this.memoizedInteractions = new Set();\n      this.pendingInteractionMap = new Map();\n    }\n  }\n\n  function createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) {\n    var root = new FiberRootNode(containerInfo, tag, hydrate);\n    // stateNode is any.\n\n\n    var uninitializedFiber = createHostRootFiber(tag);\n    root.current = uninitializedFiber;\n    uninitializedFiber.stateNode = root;\n    initializeUpdateQueue(uninitializedFiber);\n    return root;\n  }\n  function isRootSuspendedAtTime(root, expirationTime) {\n    var firstSuspendedTime = root.firstSuspendedTime;\n    var lastSuspendedTime = root.lastSuspendedTime;\n    return firstSuspendedTime !== NoWork && firstSuspendedTime >= expirationTime && lastSuspendedTime <= expirationTime;\n  }\n  function markRootSuspendedAtTime(root, expirationTime) {\n    var firstSuspendedTime = root.firstSuspendedTime;\n    var lastSuspendedTime = root.lastSuspendedTime;\n\n    if (firstSuspendedTime < expirationTime) {\n      root.firstSuspendedTime = expirationTime;\n    }\n\n    if (lastSuspendedTime > expirationTime || firstSuspendedTime === NoWork) {\n      root.lastSuspendedTime = expirationTime;\n    }\n\n    if (expirationTime <= root.lastPingedTime) {\n      root.lastPingedTime = NoWork;\n    }\n\n    if (expirationTime <= root.lastExpiredTime) {\n      root.lastExpiredTime = NoWork;\n    }\n  }\n  function markRootUpdatedAtTime(root, expirationTime) {\n    // Update the range of pending times\n    var firstPendingTime = root.firstPendingTime;\n\n    if (expirationTime > firstPendingTime) {\n      root.firstPendingTime = expirationTime;\n    } // Update the range of suspended times. Treat everything lower priority or\n    // equal to this update as unsuspended.\n\n\n    var firstSuspendedTime = root.firstSuspendedTime;\n\n    if (firstSuspendedTime !== NoWork) {\n      if (expirationTime >= firstSuspendedTime) {\n        // The entire suspended range is now unsuspended.\n        root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;\n      } else if (expirationTime >= root.lastSuspendedTime) {\n        root.lastSuspendedTime = expirationTime + 1;\n      } // This is a pending level. Check if it's higher priority than the next\n      // known pending level.\n\n\n      if (expirationTime > root.nextKnownPendingLevel) {\n        root.nextKnownPendingLevel = expirationTime;\n      }\n    }\n  }\n  function markRootFinishedAtTime(root, finishedExpirationTime, remainingExpirationTime) {\n    // Update the range of pending times\n    root.firstPendingTime = remainingExpirationTime; // Update the range of suspended times. Treat everything higher priority or\n    // equal to this update as unsuspended.\n\n    if (finishedExpirationTime <= root.lastSuspendedTime) {\n      // The entire suspended range is now unsuspended.\n      root.firstSuspendedTime = root.lastSuspendedTime = root.nextKnownPendingLevel = NoWork;\n    } else if (finishedExpirationTime <= root.firstSuspendedTime) {\n      // Part of the suspended range is now unsuspended. Narrow the range to\n      // include everything between the unsuspended time (non-inclusive) and the\n      // last suspended time.\n      root.firstSuspendedTime = finishedExpirationTime - 1;\n    }\n\n    if (finishedExpirationTime <= root.lastPingedTime) {\n      // Clear the pinged time\n      root.lastPingedTime = NoWork;\n    }\n\n    if (finishedExpirationTime <= root.lastExpiredTime) {\n      // Clear the expired time\n      root.lastExpiredTime = NoWork;\n    }\n  }\n  function markRootExpiredAtTime(root, expirationTime) {\n    var lastExpiredTime = root.lastExpiredTime;\n\n    if (lastExpiredTime === NoWork || lastExpiredTime > expirationTime) {\n      root.lastExpiredTime = expirationTime;\n    }\n  }\n\n  var didWarnAboutNestedUpdates;\n  var didWarnAboutFindNodeInStrictMode;\n\n  {\n    didWarnAboutNestedUpdates = false;\n    didWarnAboutFindNodeInStrictMode = {};\n  }\n\n  function getContextForSubtree(parentComponent) {\n    if (!parentComponent) {\n      return emptyContextObject;\n    }\n\n    var fiber = get(parentComponent);\n    var parentContext = findCurrentUnmaskedContext(fiber);\n\n    if (fiber.tag === ClassComponent) {\n      var Component = fiber.type;\n\n      if (isContextProvider(Component)) {\n        return processChildContext(fiber, Component, parentContext);\n      }\n    }\n\n    return parentContext;\n  }\n\n  function findHostInstanceWithWarning(component, methodName) {\n    {\n      var fiber = get(component);\n\n      if (fiber === undefined) {\n        if (typeof component.render === 'function') {\n          {\n            {\n              throw Error( \"Unable to find node on an unmounted component.\" );\n            }\n          }\n        } else {\n          {\n            {\n              throw Error( \"Argument appears to not be a ReactComponent. Keys: \" + Object.keys(component) );\n            }\n          }\n        }\n      }\n\n      var hostFiber = findCurrentHostFiber(fiber);\n\n      if (hostFiber === null) {\n        return null;\n      }\n\n      if (hostFiber.mode & StrictMode) {\n        var componentName = getComponentName(fiber.type) || 'Component';\n\n        if (!didWarnAboutFindNodeInStrictMode[componentName]) {\n          didWarnAboutFindNodeInStrictMode[componentName] = true;\n\n          if (fiber.mode & StrictMode) {\n            error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));\n          } else {\n            error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-find-node%s', methodName, methodName, componentName, getStackByFiberInDevAndProd(hostFiber));\n          }\n        }\n      }\n\n      return hostFiber.stateNode;\n    }\n  }\n\n  function createContainer(containerInfo, tag, hydrate, hydrationCallbacks) {\n    return createFiberRoot(containerInfo, tag, hydrate);\n  }\n  function updateContainer(element, container, parentComponent, callback) {\n    {\n      onScheduleRoot(container, element);\n    }\n\n    var current$1 = container.current;\n    var currentTime = requestCurrentTimeForUpdate();\n\n    {\n      // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests\n      if ('undefined' !== typeof jest) {\n        warnIfUnmockedScheduler(current$1);\n        warnIfNotScopedWithMatchingAct(current$1);\n      }\n    }\n\n    var suspenseConfig = requestCurrentSuspenseConfig();\n    var expirationTime = computeExpirationForFiber(currentTime, current$1, suspenseConfig);\n    var context = getContextForSubtree(parentComponent);\n\n    if (container.context === null) {\n      container.context = context;\n    } else {\n      container.pendingContext = context;\n    }\n\n    {\n      if (isRendering && current !== null && !didWarnAboutNestedUpdates) {\n        didWarnAboutNestedUpdates = true;\n\n        error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\\n\\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown');\n      }\n    }\n\n    var update = createUpdate(expirationTime, suspenseConfig); // Caution: React DevTools currently depends on this property\n    // being called \"element\".\n\n    update.payload = {\n      element: element\n    };\n    callback = callback === undefined ? null : callback;\n\n    if (callback !== null) {\n      {\n        if (typeof callback !== 'function') {\n          error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);\n        }\n      }\n\n      update.callback = callback;\n    }\n\n    enqueueUpdate(current$1, update);\n    scheduleWork(current$1, expirationTime);\n    return expirationTime;\n  }\n  function getPublicRootInstance(container) {\n    var containerFiber = container.current;\n\n    if (!containerFiber.child) {\n      return null;\n    }\n\n    switch (containerFiber.child.tag) {\n      case HostComponent:\n        return getPublicInstance(containerFiber.child.stateNode);\n\n      default:\n        return containerFiber.child.stateNode;\n    }\n  }\n\n  function markRetryTimeImpl(fiber, retryTime) {\n    var suspenseState = fiber.memoizedState;\n\n    if (suspenseState !== null && suspenseState.dehydrated !== null) {\n      if (suspenseState.retryTime < retryTime) {\n        suspenseState.retryTime = retryTime;\n      }\n    }\n  } // Increases the priority of thennables when they resolve within this boundary.\n\n\n  function markRetryTimeIfNotHydrated(fiber, retryTime) {\n    markRetryTimeImpl(fiber, retryTime);\n    var alternate = fiber.alternate;\n\n    if (alternate) {\n      markRetryTimeImpl(alternate, retryTime);\n    }\n  }\n\n  function attemptUserBlockingHydration$1(fiber) {\n    if (fiber.tag !== SuspenseComponent) {\n      // We ignore HostRoots here because we can't increase\n      // their priority and they should not suspend on I/O,\n      // since you have to wrap anything that might suspend in\n      // Suspense.\n      return;\n    }\n\n    var expTime = computeInteractiveExpiration(requestCurrentTimeForUpdate());\n    scheduleWork(fiber, expTime);\n    markRetryTimeIfNotHydrated(fiber, expTime);\n  }\n  function attemptContinuousHydration$1(fiber) {\n    if (fiber.tag !== SuspenseComponent) {\n      // We ignore HostRoots here because we can't increase\n      // their priority and they should not suspend on I/O,\n      // since you have to wrap anything that might suspend in\n      // Suspense.\n      return;\n    }\n\n    scheduleWork(fiber, ContinuousHydration);\n    markRetryTimeIfNotHydrated(fiber, ContinuousHydration);\n  }\n  function attemptHydrationAtCurrentPriority$1(fiber) {\n    if (fiber.tag !== SuspenseComponent) {\n      // We ignore HostRoots here because we can't increase\n      // their priority other than synchronously flush it.\n      return;\n    }\n\n    var currentTime = requestCurrentTimeForUpdate();\n    var expTime = computeExpirationForFiber(currentTime, fiber, null);\n    scheduleWork(fiber, expTime);\n    markRetryTimeIfNotHydrated(fiber, expTime);\n  }\n  function findHostInstanceWithNoPortals(fiber) {\n    var hostFiber = findCurrentHostFiberWithNoPortals(fiber);\n\n    if (hostFiber === null) {\n      return null;\n    }\n\n    if (hostFiber.tag === FundamentalComponent) {\n      return hostFiber.stateNode.instance;\n    }\n\n    return hostFiber.stateNode;\n  }\n\n  var shouldSuspendImpl = function (fiber) {\n    return false;\n  };\n\n  function shouldSuspend(fiber) {\n    return shouldSuspendImpl(fiber);\n  }\n  var overrideHookState = null;\n  var overrideProps = null;\n  var scheduleUpdate = null;\n  var setSuspenseHandler = null;\n\n  {\n    var copyWithSetImpl = function (obj, path, idx, value) {\n      if (idx >= path.length) {\n        return value;\n      }\n\n      var key = path[idx];\n      var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here\n\n      updated[key] = copyWithSetImpl(obj[key], path, idx + 1, value);\n      return updated;\n    };\n\n    var copyWithSet = function (obj, path, value) {\n      return copyWithSetImpl(obj, path, 0, value);\n    }; // Support DevTools editable values for useState and useReducer.\n\n\n    overrideHookState = function (fiber, id, path, value) {\n      // For now, the \"id\" of stateful hooks is just the stateful hook index.\n      // This may change in the future with e.g. nested hooks.\n      var currentHook = fiber.memoizedState;\n\n      while (currentHook !== null && id > 0) {\n        currentHook = currentHook.next;\n        id--;\n      }\n\n      if (currentHook !== null) {\n        var newState = copyWithSet(currentHook.memoizedState, path, value);\n        currentHook.memoizedState = newState;\n        currentHook.baseState = newState; // We aren't actually adding an update to the queue,\n        // because there is no update we can add for useReducer hooks that won't trigger an error.\n        // (There's no appropriate action type for DevTools overrides.)\n        // As a result though, React will see the scheduled update as a noop and bailout.\n        // Shallow cloning props works as a workaround for now to bypass the bailout check.\n\n        fiber.memoizedProps = _assign({}, fiber.memoizedProps);\n        scheduleWork(fiber, Sync);\n      }\n    }; // Support DevTools props for function components, forwardRef, memo, host components, etc.\n\n\n    overrideProps = function (fiber, path, value) {\n      fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);\n\n      if (fiber.alternate) {\n        fiber.alternate.pendingProps = fiber.pendingProps;\n      }\n\n      scheduleWork(fiber, Sync);\n    };\n\n    scheduleUpdate = function (fiber) {\n      scheduleWork(fiber, Sync);\n    };\n\n    setSuspenseHandler = function (newShouldSuspendImpl) {\n      shouldSuspendImpl = newShouldSuspendImpl;\n    };\n  }\n\n  function injectIntoDevTools(devToolsConfig) {\n    var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;\n    var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\n    return injectInternals(_assign({}, devToolsConfig, {\n      overrideHookState: overrideHookState,\n      overrideProps: overrideProps,\n      setSuspenseHandler: setSuspenseHandler,\n      scheduleUpdate: scheduleUpdate,\n      currentDispatcherRef: ReactCurrentDispatcher,\n      findHostInstanceByFiber: function (fiber) {\n        var hostFiber = findCurrentHostFiber(fiber);\n\n        if (hostFiber === null) {\n          return null;\n        }\n\n        return hostFiber.stateNode;\n      },\n      findFiberByHostInstance: function (instance) {\n        if (!findFiberByHostInstance) {\n          // Might not be implemented by the renderer.\n          return null;\n        }\n\n        return findFiberByHostInstance(instance);\n      },\n      // React Refresh\n      findHostInstancesForRefresh:  findHostInstancesForRefresh ,\n      scheduleRefresh:  scheduleRefresh ,\n      scheduleRoot:  scheduleRoot ,\n      setRefreshHandler:  setRefreshHandler ,\n      // Enables DevTools to append owner stacks to error messages in DEV mode.\n      getCurrentFiber:  function () {\n        return current;\n      } \n    }));\n  }\n  var IsSomeRendererActing$1 = ReactSharedInternals.IsSomeRendererActing;\n\n  function ReactDOMRoot(container, options) {\n    this._internalRoot = createRootImpl(container, ConcurrentRoot, options);\n  }\n\n  function ReactDOMBlockingRoot(container, tag, options) {\n    this._internalRoot = createRootImpl(container, tag, options);\n  }\n\n  ReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children) {\n    var root = this._internalRoot;\n\n    {\n      if (typeof arguments[1] === 'function') {\n        error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');\n      }\n\n      var container = root.containerInfo;\n\n      if (container.nodeType !== COMMENT_NODE) {\n        var hostInstance = findHostInstanceWithNoPortals(root.current);\n\n        if (hostInstance) {\n          if (hostInstance.parentNode !== container) {\n            error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + \"root.unmount() to empty a root's container.\");\n          }\n        }\n      }\n    }\n\n    updateContainer(children, root, null, null);\n  };\n\n  ReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function () {\n    {\n      if (typeof arguments[0] === 'function') {\n        error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');\n      }\n    }\n\n    var root = this._internalRoot;\n    var container = root.containerInfo;\n    updateContainer(null, root, null, function () {\n      unmarkContainerAsRoot(container);\n    });\n  };\n\n  function createRootImpl(container, tag, options) {\n    // Tag is either LegacyRoot or Concurrent Root\n    var hydrate = options != null && options.hydrate === true;\n    var hydrationCallbacks = options != null && options.hydrationOptions || null;\n    var root = createContainer(container, tag, hydrate);\n    markContainerAsRoot(root.current, container);\n\n    if (hydrate && tag !== LegacyRoot) {\n      var doc = container.nodeType === DOCUMENT_NODE ? container : container.ownerDocument;\n      eagerlyTrapReplayableEvents(container, doc);\n    }\n\n    return root;\n  }\n  function createLegacyRoot(container, options) {\n    return new ReactDOMBlockingRoot(container, LegacyRoot, options);\n  }\n  function isValidContainer(node) {\n    return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));\n  }\n\n  var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;\n  var topLevelUpdateWarnings;\n  var warnedAboutHydrateAPI = false;\n\n  {\n    topLevelUpdateWarnings = function (container) {\n      if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {\n        var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);\n\n        if (hostInstance) {\n          if (hostInstance.parentNode !== container) {\n            error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.');\n          }\n        }\n      }\n\n      var isRootRenderedBySomeReact = !!container._reactRootContainer;\n      var rootEl = getReactRootElementInContainer(container);\n      var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));\n\n      if (hasNonRootReactChild && !isRootRenderedBySomeReact) {\n        error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.');\n      }\n\n      if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {\n        error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.');\n      }\n    };\n  }\n\n  function getReactRootElementInContainer(container) {\n    if (!container) {\n      return null;\n    }\n\n    if (container.nodeType === DOCUMENT_NODE) {\n      return container.documentElement;\n    } else {\n      return container.firstChild;\n    }\n  }\n\n  function shouldHydrateDueToLegacyHeuristic(container) {\n    var rootElement = getReactRootElementInContainer(container);\n    return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));\n  }\n\n  function legacyCreateRootFromDOMContainer(container, forceHydrate) {\n    var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content.\n\n    if (!shouldHydrate) {\n      var warned = false;\n      var rootSibling;\n\n      while (rootSibling = container.lastChild) {\n        {\n          if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {\n            warned = true;\n\n            error('render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.');\n          }\n        }\n\n        container.removeChild(rootSibling);\n      }\n    }\n\n    {\n      if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {\n        warnedAboutHydrateAPI = true;\n\n        warn('render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.');\n      }\n    }\n\n    return createLegacyRoot(container, shouldHydrate ? {\n      hydrate: true\n    } : undefined);\n  }\n\n  function warnOnInvalidCallback$1(callback, callerName) {\n    {\n      if (callback !== null && typeof callback !== 'function') {\n        error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n      }\n    }\n  }\n\n  function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {\n    {\n      topLevelUpdateWarnings(container);\n      warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render');\n    } // TODO: Without `any` type, Flow says \"Property cannot be accessed on any\n    // member of intersection type.\" Whyyyyyy.\n\n\n    var root = container._reactRootContainer;\n    var fiberRoot;\n\n    if (!root) {\n      // Initial mount\n      root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate);\n      fiberRoot = root._internalRoot;\n\n      if (typeof callback === 'function') {\n        var originalCallback = callback;\n\n        callback = function () {\n          var instance = getPublicRootInstance(fiberRoot);\n          originalCallback.call(instance);\n        };\n      } // Initial mount should not be batched.\n\n\n      unbatchedUpdates(function () {\n        updateContainer(children, fiberRoot, parentComponent, callback);\n      });\n    } else {\n      fiberRoot = root._internalRoot;\n\n      if (typeof callback === 'function') {\n        var _originalCallback = callback;\n\n        callback = function () {\n          var instance = getPublicRootInstance(fiberRoot);\n\n          _originalCallback.call(instance);\n        };\n      } // Update\n\n\n      updateContainer(children, fiberRoot, parentComponent, callback);\n    }\n\n    return getPublicRootInstance(fiberRoot);\n  }\n\n  function findDOMNode(componentOrElement) {\n    {\n      var owner = ReactCurrentOwner$3.current;\n\n      if (owner !== null && owner.stateNode !== null) {\n        var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;\n\n        if (!warnedAboutRefsInRender) {\n          error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component');\n        }\n\n        owner.stateNode._warnedAboutRefsInRender = true;\n      }\n    }\n\n    if (componentOrElement == null) {\n      return null;\n    }\n\n    if (componentOrElement.nodeType === ELEMENT_NODE) {\n      return componentOrElement;\n    }\n\n    {\n      return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');\n    }\n  }\n  function hydrate(element, container, callback) {\n    if (!isValidContainer(container)) {\n      {\n        throw Error( \"Target container is not a DOM element.\" );\n      }\n    }\n\n    {\n      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n      if (isModernRoot) {\n        error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?');\n      }\n    } // TODO: throw or warn if we couldn't hydrate?\n\n\n    return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);\n  }\n  function render(element, container, callback) {\n    if (!isValidContainer(container)) {\n      {\n        throw Error( \"Target container is not a DOM element.\" );\n      }\n    }\n\n    {\n      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n      if (isModernRoot) {\n        error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');\n      }\n    }\n\n    return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);\n  }\n  function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {\n    if (!isValidContainer(containerNode)) {\n      {\n        throw Error( \"Target container is not a DOM element.\" );\n      }\n    }\n\n    if (!(parentComponent != null && has$1(parentComponent))) {\n      {\n        throw Error( \"parentComponent must be a valid React Component\" );\n      }\n    }\n\n    return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);\n  }\n  function unmountComponentAtNode(container) {\n    if (!isValidContainer(container)) {\n      {\n        throw Error( \"unmountComponentAtNode(...): Target container is not a DOM element.\" );\n      }\n    }\n\n    {\n      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;\n\n      if (isModernRoot) {\n        error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?');\n      }\n    }\n\n    if (container._reactRootContainer) {\n      {\n        var rootEl = getReactRootElementInContainer(container);\n        var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);\n\n        if (renderedByDifferentReact) {\n          error(\"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by another copy of React.');\n        }\n      } // Unmount should not be batched.\n\n\n      unbatchedUpdates(function () {\n        legacyRenderSubtreeIntoContainer(null, null, container, false, function () {\n          // $FlowFixMe This should probably use `delete container._reactRootContainer`\n          container._reactRootContainer = null;\n          unmarkContainerAsRoot(container);\n        });\n      }); // If you call unmountComponentAtNode twice in quick succession, you'll\n      // get `true` twice. That's probably fine?\n\n      return true;\n    } else {\n      {\n        var _rootEl = getReactRootElementInContainer(container);\n\n        var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl)); // Check if the container itself is a React root node.\n\n        var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;\n\n        if (hasNonRootReactChild) {\n          error(\"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.');\n        }\n      }\n\n      return false;\n    }\n  }\n\n  function createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.\n  implementation) {\n    var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n    return {\n      // This tag allow us to uniquely identify this as a React Portal\n      $$typeof: REACT_PORTAL_TYPE,\n      key: key == null ? null : '' + key,\n      children: children,\n      containerInfo: containerInfo,\n      implementation: implementation\n    };\n  }\n\n  var ReactVersion = '16.13.1';\n\n  setAttemptUserBlockingHydration(attemptUserBlockingHydration$1);\n  setAttemptContinuousHydration(attemptContinuousHydration$1);\n  setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);\n  var didWarnAboutUnstableCreatePortal = false;\n\n  {\n    if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype\n    Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype\n    Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {\n      error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n    }\n  }\n\n  setRestoreImplementation(restoreControlledState$3);\n  setBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1);\n\n  function createPortal$1(children, container) {\n    var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n    if (!isValidContainer(container)) {\n      {\n        throw Error( \"Target container is not a DOM element.\" );\n      }\n    } // TODO: pass ReactDOM portal implementation as third argument\n    // $FlowFixMe The Flow type is opaque but there's no way to actually create it.\n\n\n    return createPortal(children, container, null, key);\n  }\n\n  function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {\n\n    return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);\n  }\n\n  function unstable_createPortal(children, container) {\n    var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n    {\n      if (!didWarnAboutUnstableCreatePortal) {\n        didWarnAboutUnstableCreatePortal = true;\n\n        warn('The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the \"unstable_\" prefix.');\n      }\n    }\n\n    return createPortal$1(children, container, key);\n  }\n\n  var Internals = {\n    // Keep in sync with ReactDOMUnstableNativeDependencies.js\n    // ReactTestUtils.js, and ReactTestUtilsAct.js. This is an array for better minification.\n    Events: [getInstanceFromNode$1, getNodeFromInstance$1, getFiberCurrentPropsFromNode$1, injectEventPluginsByName, eventNameDispatchConfigs, accumulateTwoPhaseDispatches, accumulateDirectDispatches, enqueueStateRestore, restoreStateIfNeeded, dispatchEvent, runEventsInBatch, flushPassiveEffects, IsThisRendererActing]\n  };\n  var foundDevTools = injectIntoDevTools({\n    findFiberByHostInstance: getClosestInstanceFromNode,\n    bundleType:  1 ,\n    version: ReactVersion,\n    rendererPackageName: 'react-dom'\n  });\n\n  {\n    if (!foundDevTools && canUseDOM && window.top === window.self) {\n      // If we're in Chrome or Firefox, provide a download link if not installed.\n      if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {\n        var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.\n\n        if (/^(https?|file):$/.test(protocol)) {\n          // eslint-disable-next-line react-internal/no-production-logging\n          console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold');\n        }\n      }\n    }\n  }\n\n  exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;\n  exports.createPortal = createPortal$1;\n  exports.findDOMNode = findDOMNode;\n  exports.flushSync = flushSync;\n  exports.hydrate = hydrate;\n  exports.render = render;\n  exports.unmountComponentAtNode = unmountComponentAtNode;\n  exports.unstable_batchedUpdates = batchedUpdates$1;\n  exports.unstable_createPortal = unstable_createPortal;\n  exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;\n  exports.version = ReactVersion;\n\n})));\n"
  },
  {
    "path": "docs/external/js/react.development.js",
    "content": "/** @license React v16.13.1\n * react.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = global || self, factory(global.React = {}));\n}(this, (function (exports) { 'use strict';\n\n  var ReactVersion = '16.13.1';\n\n  // The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n  // nor polyfill, then a plain number is used for performance.\n  var hasSymbol = typeof Symbol === 'function' && Symbol.for;\n  var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\n  var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\n  var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\n  var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\n  var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\n  var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\n  var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n  var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\n  var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\n  var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\n  var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\n  var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\n  var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\n  var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\n  var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\n  var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\n  var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n  var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n  var FAUX_ITERATOR_SYMBOL = '@@iterator';\n  function getIteratorFn(maybeIterable) {\n    if (maybeIterable === null || typeof maybeIterable !== 'object') {\n      return null;\n    }\n\n    var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n    if (typeof maybeIterator === 'function') {\n      return maybeIterator;\n    }\n\n    return null;\n  }\n\n  /*\n  object-assign\n  (c) Sindre Sorhus\n  @license MIT\n  */\n  /* eslint-disable no-unused-vars */\n  var getOwnPropertySymbols = Object.getOwnPropertySymbols;\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  var propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\n  function toObject(val) {\n  \tif (val === null || val === undefined) {\n  \t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n  \t}\n\n  \treturn Object(val);\n  }\n\n  function shouldUseNative() {\n  \ttry {\n  \t\tif (!Object.assign) {\n  \t\t\treturn false;\n  \t\t}\n\n  \t\t// Detect buggy property enumeration order in older V8 versions.\n\n  \t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n  \t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n  \t\ttest1[5] = 'de';\n  \t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n  \t\t\treturn false;\n  \t\t}\n\n  \t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n  \t\tvar test2 = {};\n  \t\tfor (var i = 0; i < 10; i++) {\n  \t\t\ttest2['_' + String.fromCharCode(i)] = i;\n  \t\t}\n  \t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n  \t\t\treturn test2[n];\n  \t\t});\n  \t\tif (order2.join('') !== '0123456789') {\n  \t\t\treturn false;\n  \t\t}\n\n  \t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n  \t\tvar test3 = {};\n  \t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n  \t\t\ttest3[letter] = letter;\n  \t\t});\n  \t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n  \t\t\t\t'abcdefghijklmnopqrst') {\n  \t\t\treturn false;\n  \t\t}\n\n  \t\treturn true;\n  \t} catch (err) {\n  \t\t// We don't expect any of the above to throw, but better to be safe.\n  \t\treturn false;\n  \t}\n  }\n\n  var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {\n  \tvar from;\n  \tvar to = toObject(target);\n  \tvar symbols;\n\n  \tfor (var s = 1; s < arguments.length; s++) {\n  \t\tfrom = Object(arguments[s]);\n\n  \t\tfor (var key in from) {\n  \t\t\tif (hasOwnProperty.call(from, key)) {\n  \t\t\t\tto[key] = from[key];\n  \t\t\t}\n  \t\t}\n\n  \t\tif (getOwnPropertySymbols) {\n  \t\t\tsymbols = getOwnPropertySymbols(from);\n  \t\t\tfor (var i = 0; i < symbols.length; i++) {\n  \t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n  \t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n  \t}\n\n  \treturn to;\n  };\n\n  /**\n   * Keeps track of the current dispatcher.\n   */\n  var ReactCurrentDispatcher = {\n    /**\n     * @internal\n     * @type {ReactComponent}\n     */\n    current: null\n  };\n\n  /**\n   * Keeps track of the current batch's configuration such as how long an update\n   * should suspend for if it needs to.\n   */\n  var ReactCurrentBatchConfig = {\n    suspense: null\n  };\n\n  /**\n   * Keeps track of the current owner.\n   *\n   * The current owner is the component who should own any components that are\n   * currently being constructed.\n   */\n  var ReactCurrentOwner = {\n    /**\n     * @internal\n     * @type {ReactComponent}\n     */\n    current: null\n  };\n\n  var BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\n  function describeComponentFrame (name, source, ownerName) {\n    var sourceInfo = '';\n\n    if (source) {\n      var path = source.fileName;\n      var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n      {\n        // In DEV, include code for a common special case:\n        // prefer \"folder/index.js\" instead of just \"index.js\".\n        if (/^index\\./.test(fileName)) {\n          var match = path.match(BEFORE_SLASH_RE);\n\n          if (match) {\n            var pathBeforeSlash = match[1];\n\n            if (pathBeforeSlash) {\n              var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n              fileName = folderName + '/' + fileName;\n            }\n          }\n        }\n      }\n\n      sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n    } else if (ownerName) {\n      sourceInfo = ' (created by ' + ownerName + ')';\n    }\n\n    return '\\n    in ' + (name || 'Unknown') + sourceInfo;\n  }\n\n  var Resolved = 1;\n  function refineResolvedLazyComponent(lazyComponent) {\n    return lazyComponent._status === Resolved ? lazyComponent._result : null;\n  }\n\n  function getWrappedName(outerType, innerType, wrapperName) {\n    var functionName = innerType.displayName || innerType.name || '';\n    return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n  }\n\n  function getComponentName(type) {\n    if (type == null) {\n      // Host root, text node or just invalid type.\n      return null;\n    }\n\n    {\n      if (typeof type.tag === 'number') {\n        error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n      }\n    }\n\n    if (typeof type === 'function') {\n      return type.displayName || type.name || null;\n    }\n\n    if (typeof type === 'string') {\n      return type;\n    }\n\n    switch (type) {\n      case REACT_FRAGMENT_TYPE:\n        return 'Fragment';\n\n      case REACT_PORTAL_TYPE:\n        return 'Portal';\n\n      case REACT_PROFILER_TYPE:\n        return \"Profiler\";\n\n      case REACT_STRICT_MODE_TYPE:\n        return 'StrictMode';\n\n      case REACT_SUSPENSE_TYPE:\n        return 'Suspense';\n\n      case REACT_SUSPENSE_LIST_TYPE:\n        return 'SuspenseList';\n    }\n\n    if (typeof type === 'object') {\n      switch (type.$$typeof) {\n        case REACT_CONTEXT_TYPE:\n          return 'Context.Consumer';\n\n        case REACT_PROVIDER_TYPE:\n          return 'Context.Provider';\n\n        case REACT_FORWARD_REF_TYPE:\n          return getWrappedName(type, type.render, 'ForwardRef');\n\n        case REACT_MEMO_TYPE:\n          return getComponentName(type.type);\n\n        case REACT_BLOCK_TYPE:\n          return getComponentName(type.render);\n\n        case REACT_LAZY_TYPE:\n          {\n            var thenable = type;\n            var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n            if (resolvedThenable) {\n              return getComponentName(resolvedThenable);\n            }\n\n            break;\n          }\n      }\n    }\n\n    return null;\n  }\n\n  var ReactDebugCurrentFrame = {};\n  var currentlyValidatingElement = null;\n  function setCurrentlyValidatingElement(element) {\n    {\n      currentlyValidatingElement = element;\n    }\n  }\n\n  {\n    // Stack implementation injected by the current renderer.\n    ReactDebugCurrentFrame.getCurrentStack = null;\n\n    ReactDebugCurrentFrame.getStackAddendum = function () {\n      var stack = ''; // Add an extra top frame while an element is being validated\n\n      if (currentlyValidatingElement) {\n        var name = getComponentName(currentlyValidatingElement.type);\n        var owner = currentlyValidatingElement._owner;\n        stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type));\n      } // Delegate to the injected renderer-specific implementation\n\n\n      var impl = ReactDebugCurrentFrame.getCurrentStack;\n\n      if (impl) {\n        stack += impl() || '';\n      }\n\n      return stack;\n    };\n  }\n\n  /**\n   * Used by act() to track whether you're inside an act() scope.\n   */\n  var IsSomeRendererActing = {\n    current: false\n  };\n\n  var ReactSharedInternals = {\n    ReactCurrentDispatcher: ReactCurrentDispatcher,\n    ReactCurrentBatchConfig: ReactCurrentBatchConfig,\n    ReactCurrentOwner: ReactCurrentOwner,\n    IsSomeRendererActing: IsSomeRendererActing,\n    // Used by renderers to avoid bundling object-assign twice in UMD bundles:\n    assign: objectAssign\n  };\n\n  {\n    objectAssign(ReactSharedInternals, {\n      // These should not be included in production.\n      ReactDebugCurrentFrame: ReactDebugCurrentFrame,\n      // Shim for React DOM 16.0.0 which still destructured (but not used) this.\n      // TODO: remove in React 17.0.\n      ReactComponentTreeHook: {}\n    });\n  }\n\n  // by calls to these methods by a Babel plugin.\n  //\n  // In PROD (or in packages without access to React internals),\n  // they are left as they are instead.\n\n  function warn(format) {\n    {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      printWarning('warn', format, args);\n    }\n  }\n  function error(format) {\n    {\n      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        args[_key2 - 1] = arguments[_key2];\n      }\n\n      printWarning('error', format, args);\n    }\n  }\n\n  function printWarning(level, format, args) {\n    // When changing this logic, you might want to also\n    // update consoleWithStackDev.www.js as well.\n    {\n      var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n    in') === 0;\n\n      if (!hasExistingStack) {\n        var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n        var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n        if (stack !== '') {\n          format += '%s';\n          args = args.concat([stack]);\n        }\n      }\n\n      var argsWithFormat = args.map(function (item) {\n        return '' + item;\n      }); // Careful: RN currently depends on this prefix\n\n      argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n      // breaks IE9: https://github.com/facebook/react/issues/13610\n      // eslint-disable-next-line react-internal/no-production-logging\n\n      Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n      try {\n        // --- Welcome to debugging React ---\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        var argIndex = 0;\n        var message = 'Warning: ' + format.replace(/%s/g, function () {\n          return args[argIndex++];\n        });\n        throw new Error(message);\n      } catch (x) {}\n    }\n  }\n\n  var didWarnStateUpdateForUnmountedComponent = {};\n\n  function warnNoop(publicInstance, callerName) {\n    {\n      var _constructor = publicInstance.constructor;\n      var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';\n      var warningKey = componentName + \".\" + callerName;\n\n      if (didWarnStateUpdateForUnmountedComponent[warningKey]) {\n        return;\n      }\n\n      error(\"Can't call %s on a component that is not yet mounted. \" + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);\n\n      didWarnStateUpdateForUnmountedComponent[warningKey] = true;\n    }\n  }\n  /**\n   * This is the abstract API for an update queue.\n   */\n\n\n  var ReactNoopUpdateQueue = {\n    /**\n     * Checks whether or not this composite component is mounted.\n     * @param {ReactClass} publicInstance The instance we want to test.\n     * @return {boolean} True if mounted, false otherwise.\n     * @protected\n     * @final\n     */\n    isMounted: function (publicInstance) {\n      return false;\n    },\n\n    /**\n     * Forces an update. This should only be invoked when it is known with\n     * certainty that we are **not** in a DOM transaction.\n     *\n     * You may want to call this when you know that some deeper aspect of the\n     * component's state has changed but `setState` was not called.\n     *\n     * This will not invoke `shouldComponentUpdate`, but it will invoke\n     * `componentWillUpdate` and `componentDidUpdate`.\n     *\n     * @param {ReactClass} publicInstance The instance that should rerender.\n     * @param {?function} callback Called after component is updated.\n     * @param {?string} callerName name of the calling function in the public API.\n     * @internal\n     */\n    enqueueForceUpdate: function (publicInstance, callback, callerName) {\n      warnNoop(publicInstance, 'forceUpdate');\n    },\n\n    /**\n     * Replaces all of the state. Always use this or `setState` to mutate state.\n     * You should treat `this.state` as immutable.\n     *\n     * There is no guarantee that `this.state` will be immediately updated, so\n     * accessing `this.state` after calling this method may return the old value.\n     *\n     * @param {ReactClass} publicInstance The instance that should rerender.\n     * @param {object} completeState Next state.\n     * @param {?function} callback Called after component is updated.\n     * @param {?string} callerName name of the calling function in the public API.\n     * @internal\n     */\n    enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {\n      warnNoop(publicInstance, 'replaceState');\n    },\n\n    /**\n     * Sets a subset of the state. This only exists because _pendingState is\n     * internal. This provides a merging strategy that is not available to deep\n     * properties which is confusing. TODO: Expose pendingState or don't use it\n     * during the merge.\n     *\n     * @param {ReactClass} publicInstance The instance that should rerender.\n     * @param {object} partialState Next partial state to be merged with state.\n     * @param {?function} callback Called after component is updated.\n     * @param {?string} Name of the calling function in the public API.\n     * @internal\n     */\n    enqueueSetState: function (publicInstance, partialState, callback, callerName) {\n      warnNoop(publicInstance, 'setState');\n    }\n  };\n\n  var emptyObject = {};\n\n  {\n    Object.freeze(emptyObject);\n  }\n  /**\n   * Base class helpers for the updating state of a component.\n   */\n\n\n  function Component(props, context, updater) {\n    this.props = props;\n    this.context = context; // If a component has string refs, we will assign a different object later.\n\n    this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the\n    // renderer.\n\n    this.updater = updater || ReactNoopUpdateQueue;\n  }\n\n  Component.prototype.isReactComponent = {};\n  /**\n   * Sets a subset of the state. Always use this to mutate\n   * state. You should treat `this.state` as immutable.\n   *\n   * There is no guarantee that `this.state` will be immediately updated, so\n   * accessing `this.state` after calling this method may return the old value.\n   *\n   * There is no guarantee that calls to `setState` will run synchronously,\n   * as they may eventually be batched together.  You can provide an optional\n   * callback that will be executed when the call to setState is actually\n   * completed.\n   *\n   * When a function is provided to setState, it will be called at some point in\n   * the future (not synchronously). It will be called with the up to date\n   * component arguments (state, props, context). These values can be different\n   * from this.* because your function may be called after receiveProps but before\n   * shouldComponentUpdate, and this new state, props, and context will not yet be\n   * assigned to this.\n   *\n   * @param {object|function} partialState Next partial state or function to\n   *        produce next partial state to be merged with current state.\n   * @param {?function} callback Called after state is updated.\n   * @final\n   * @protected\n   */\n\n  Component.prototype.setState = function (partialState, callback) {\n    if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) {\n      {\n        throw Error( \"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\" );\n      }\n    }\n\n    this.updater.enqueueSetState(this, partialState, callback, 'setState');\n  };\n  /**\n   * Forces an update. This should only be invoked when it is known with\n   * certainty that we are **not** in a DOM transaction.\n   *\n   * You may want to call this when you know that some deeper aspect of the\n   * component's state has changed but `setState` was not called.\n   *\n   * This will not invoke `shouldComponentUpdate`, but it will invoke\n   * `componentWillUpdate` and `componentDidUpdate`.\n   *\n   * @param {?function} callback Called after update is complete.\n   * @final\n   * @protected\n   */\n\n\n  Component.prototype.forceUpdate = function (callback) {\n    this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');\n  };\n  /**\n   * Deprecated APIs. These APIs used to exist on classic React classes but since\n   * we would like to deprecate them, we're not going to move them over to this\n   * modern base class. Instead, we define a getter that warns if it's accessed.\n   */\n\n\n  {\n    var deprecatedAPIs = {\n      isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n      replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n    };\n\n    var defineDeprecationWarning = function (methodName, info) {\n      Object.defineProperty(Component.prototype, methodName, {\n        get: function () {\n          warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);\n\n          return undefined;\n        }\n      });\n    };\n\n    for (var fnName in deprecatedAPIs) {\n      if (deprecatedAPIs.hasOwnProperty(fnName)) {\n        defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n      }\n    }\n  }\n\n  function ComponentDummy() {}\n\n  ComponentDummy.prototype = Component.prototype;\n  /**\n   * Convenience component with default shallow equality check for sCU.\n   */\n\n  function PureComponent(props, context, updater) {\n    this.props = props;\n    this.context = context; // If a component has string refs, we will assign a different object later.\n\n    this.refs = emptyObject;\n    this.updater = updater || ReactNoopUpdateQueue;\n  }\n\n  var pureComponentPrototype = PureComponent.prototype = new ComponentDummy();\n  pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.\n\n  objectAssign(pureComponentPrototype, Component.prototype);\n\n  pureComponentPrototype.isPureReactComponent = true;\n\n  // an immutable object with a single mutable value\n  function createRef() {\n    var refObject = {\n      current: null\n    };\n\n    {\n      Object.seal(refObject);\n    }\n\n    return refObject;\n  }\n\n  var hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n  var RESERVED_PROPS = {\n    key: true,\n    ref: true,\n    __self: true,\n    __source: true\n  };\n  var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;\n\n  {\n    didWarnAboutStringRefs = {};\n  }\n\n  function hasValidRef(config) {\n    {\n      if (hasOwnProperty$1.call(config, 'ref')) {\n        var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n        if (getter && getter.isReactWarning) {\n          return false;\n        }\n      }\n    }\n\n    return config.ref !== undefined;\n  }\n\n  function hasValidKey(config) {\n    {\n      if (hasOwnProperty$1.call(config, 'key')) {\n        var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n        if (getter && getter.isReactWarning) {\n          return false;\n        }\n      }\n    }\n\n    return config.key !== undefined;\n  }\n\n  function defineKeyPropWarningGetter(props, displayName) {\n    var warnAboutAccessingKey = function () {\n      {\n        if (!specialPropKeyWarningShown) {\n          specialPropKeyWarningShown = true;\n\n          error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n        }\n      }\n    };\n\n    warnAboutAccessingKey.isReactWarning = true;\n    Object.defineProperty(props, 'key', {\n      get: warnAboutAccessingKey,\n      configurable: true\n    });\n  }\n\n  function defineRefPropWarningGetter(props, displayName) {\n    var warnAboutAccessingRef = function () {\n      {\n        if (!specialPropRefWarningShown) {\n          specialPropRefWarningShown = true;\n\n          error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n        }\n      }\n    };\n\n    warnAboutAccessingRef.isReactWarning = true;\n    Object.defineProperty(props, 'ref', {\n      get: warnAboutAccessingRef,\n      configurable: true\n    });\n  }\n\n  function warnIfStringRefCannotBeAutoConverted(config) {\n    {\n      if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {\n        var componentName = getComponentName(ReactCurrentOwner.current.type);\n\n        if (!didWarnAboutStringRefs[componentName]) {\n          error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);\n\n          didWarnAboutStringRefs[componentName] = true;\n        }\n      }\n    }\n  }\n  /**\n   * Factory method to create a new React element. This no longer adheres to\n   * the class pattern, so do not use new to call it. Also, instanceof check\n   * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n   * if something is a React Element.\n   *\n   * @param {*} type\n   * @param {*} props\n   * @param {*} key\n   * @param {string|object} ref\n   * @param {*} owner\n   * @param {*} self A *temporary* helper to detect places where `this` is\n   * different from the `owner` when React.createElement is called, so that we\n   * can warn. We want to get rid of owner and replace string `ref`s with arrow\n   * functions, and as long as `this` and owner are the same, there will be no\n   * change in behavior.\n   * @param {*} source An annotation object (added by a transpiler or otherwise)\n   * indicating filename, line number, and/or other information.\n   * @internal\n   */\n\n\n  var ReactElement = function (type, key, ref, self, source, owner, props) {\n    var element = {\n      // This tag allows us to uniquely identify this as a React Element\n      $$typeof: REACT_ELEMENT_TYPE,\n      // Built-in properties that belong on the element\n      type: type,\n      key: key,\n      ref: ref,\n      props: props,\n      // Record the component responsible for creating this element.\n      _owner: owner\n    };\n\n    {\n      // The validation flag is currently mutative. We put it on\n      // an external backing store so that we can freeze the whole object.\n      // This can be replaced with a WeakMap once they are implemented in\n      // commonly used development environments.\n      element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n      // the validation flag non-enumerable (where possible, which should\n      // include every environment we run tests in), so the test framework\n      // ignores it.\n\n      Object.defineProperty(element._store, 'validated', {\n        configurable: false,\n        enumerable: false,\n        writable: true,\n        value: false\n      }); // self and source are DEV only properties.\n\n      Object.defineProperty(element, '_self', {\n        configurable: false,\n        enumerable: false,\n        writable: false,\n        value: self\n      }); // Two elements created in two different places should be considered\n      // equal for testing purposes and therefore we hide it from enumeration.\n\n      Object.defineProperty(element, '_source', {\n        configurable: false,\n        enumerable: false,\n        writable: false,\n        value: source\n      });\n\n      if (Object.freeze) {\n        Object.freeze(element.props);\n        Object.freeze(element);\n      }\n    }\n\n    return element;\n  };\n  /**\n   * Create and return a new ReactElement of the given type.\n   * See https://reactjs.org/docs/react-api.html#createelement\n   */\n\n  function createElement(type, config, children) {\n    var propName; // Reserved names are extracted\n\n    var props = {};\n    var key = null;\n    var ref = null;\n    var self = null;\n    var source = null;\n\n    if (config != null) {\n      if (hasValidRef(config)) {\n        ref = config.ref;\n\n        {\n          warnIfStringRefCannotBeAutoConverted(config);\n        }\n      }\n\n      if (hasValidKey(config)) {\n        key = '' + config.key;\n      }\n\n      self = config.__self === undefined ? null : config.__self;\n      source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object\n\n      for (propName in config) {\n        if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n          props[propName] = config[propName];\n        }\n      }\n    } // Children can be more than one argument, and those are transferred onto\n    // the newly allocated props object.\n\n\n    var childrenLength = arguments.length - 2;\n\n    if (childrenLength === 1) {\n      props.children = children;\n    } else if (childrenLength > 1) {\n      var childArray = Array(childrenLength);\n\n      for (var i = 0; i < childrenLength; i++) {\n        childArray[i] = arguments[i + 2];\n      }\n\n      {\n        if (Object.freeze) {\n          Object.freeze(childArray);\n        }\n      }\n\n      props.children = childArray;\n    } // Resolve default props\n\n\n    if (type && type.defaultProps) {\n      var defaultProps = type.defaultProps;\n\n      for (propName in defaultProps) {\n        if (props[propName] === undefined) {\n          props[propName] = defaultProps[propName];\n        }\n      }\n    }\n\n    {\n      if (key || ref) {\n        var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n        if (key) {\n          defineKeyPropWarningGetter(props, displayName);\n        }\n\n        if (ref) {\n          defineRefPropWarningGetter(props, displayName);\n        }\n      }\n    }\n\n    return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n  }\n  function cloneAndReplaceKey(oldElement, newKey) {\n    var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n    return newElement;\n  }\n  /**\n   * Clone and return a new ReactElement using element as the starting point.\n   * See https://reactjs.org/docs/react-api.html#cloneelement\n   */\n\n  function cloneElement(element, config, children) {\n    if (!!(element === null || element === undefined)) {\n      {\n        throw Error( \"React.cloneElement(...): The argument must be a React element, but you passed \" + element + \".\" );\n      }\n    }\n\n    var propName; // Original props are copied\n\n    var props = objectAssign({}, element.props); // Reserved names are extracted\n\n\n    var key = element.key;\n    var ref = element.ref; // Self is preserved since the owner is preserved.\n\n    var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a\n    // transpiler, and the original source is probably a better indicator of the\n    // true owner.\n\n    var source = element._source; // Owner will be preserved, unless ref is overridden\n\n    var owner = element._owner;\n\n    if (config != null) {\n      if (hasValidRef(config)) {\n        // Silently steal the ref from the parent.\n        ref = config.ref;\n        owner = ReactCurrentOwner.current;\n      }\n\n      if (hasValidKey(config)) {\n        key = '' + config.key;\n      } // Remaining properties override existing props\n\n\n      var defaultProps;\n\n      if (element.type && element.type.defaultProps) {\n        defaultProps = element.type.defaultProps;\n      }\n\n      for (propName in config) {\n        if (hasOwnProperty$1.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n          if (config[propName] === undefined && defaultProps !== undefined) {\n            // Resolve default props\n            props[propName] = defaultProps[propName];\n          } else {\n            props[propName] = config[propName];\n          }\n        }\n      }\n    } // Children can be more than one argument, and those are transferred onto\n    // the newly allocated props object.\n\n\n    var childrenLength = arguments.length - 2;\n\n    if (childrenLength === 1) {\n      props.children = children;\n    } else if (childrenLength > 1) {\n      var childArray = Array(childrenLength);\n\n      for (var i = 0; i < childrenLength; i++) {\n        childArray[i] = arguments[i + 2];\n      }\n\n      props.children = childArray;\n    }\n\n    return ReactElement(element.type, key, ref, self, source, owner, props);\n  }\n  /**\n   * Verifies the object is a ReactElement.\n   * See https://reactjs.org/docs/react-api.html#isvalidelement\n   * @param {?object} object\n   * @return {boolean} True if `object` is a ReactElement.\n   * @final\n   */\n\n  function isValidElement(object) {\n    return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n  }\n\n  var SEPARATOR = '.';\n  var SUBSEPARATOR = ':';\n  /**\n   * Escape and wrap key so it is safe to use as a reactid\n   *\n   * @param {string} key to be escaped.\n   * @return {string} the escaped key.\n   */\n\n  function escape(key) {\n    var escapeRegex = /[=:]/g;\n    var escaperLookup = {\n      '=': '=0',\n      ':': '=2'\n    };\n    var escapedString = ('' + key).replace(escapeRegex, function (match) {\n      return escaperLookup[match];\n    });\n    return '$' + escapedString;\n  }\n  /**\n   * TODO: Test that a single child and an array with one item have the same key\n   * pattern.\n   */\n\n\n  var didWarnAboutMaps = false;\n  var userProvidedKeyEscapeRegex = /\\/+/g;\n\n  function escapeUserProvidedKey(text) {\n    return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');\n  }\n\n  var POOL_SIZE = 10;\n  var traverseContextPool = [];\n\n  function getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {\n    if (traverseContextPool.length) {\n      var traverseContext = traverseContextPool.pop();\n      traverseContext.result = mapResult;\n      traverseContext.keyPrefix = keyPrefix;\n      traverseContext.func = mapFunction;\n      traverseContext.context = mapContext;\n      traverseContext.count = 0;\n      return traverseContext;\n    } else {\n      return {\n        result: mapResult,\n        keyPrefix: keyPrefix,\n        func: mapFunction,\n        context: mapContext,\n        count: 0\n      };\n    }\n  }\n\n  function releaseTraverseContext(traverseContext) {\n    traverseContext.result = null;\n    traverseContext.keyPrefix = null;\n    traverseContext.func = null;\n    traverseContext.context = null;\n    traverseContext.count = 0;\n\n    if (traverseContextPool.length < POOL_SIZE) {\n      traverseContextPool.push(traverseContext);\n    }\n  }\n  /**\n   * @param {?*} children Children tree container.\n   * @param {!string} nameSoFar Name of the key path so far.\n   * @param {!function} callback Callback to invoke with each child found.\n   * @param {?*} traverseContext Used to pass information throughout the traversal\n   * process.\n   * @return {!number} The number of children in this subtree.\n   */\n\n\n  function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n    var type = typeof children;\n\n    if (type === 'undefined' || type === 'boolean') {\n      // All of the above are perceived as null.\n      children = null;\n    }\n\n    var invokeCallback = false;\n\n    if (children === null) {\n      invokeCallback = true;\n    } else {\n      switch (type) {\n        case 'string':\n        case 'number':\n          invokeCallback = true;\n          break;\n\n        case 'object':\n          switch (children.$$typeof) {\n            case REACT_ELEMENT_TYPE:\n            case REACT_PORTAL_TYPE:\n              invokeCallback = true;\n          }\n\n      }\n    }\n\n    if (invokeCallback) {\n      callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array\n      // so that it's consistent if the number of children grows.\n      nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n      return 1;\n    }\n\n    var child;\n    var nextName;\n    var subtreeCount = 0; // Count of children found in the current subtree.\n\n    var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n    if (Array.isArray(children)) {\n      for (var i = 0; i < children.length; i++) {\n        child = children[i];\n        nextName = nextNamePrefix + getComponentKey(child, i);\n        subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n      }\n    } else {\n      var iteratorFn = getIteratorFn(children);\n\n      if (typeof iteratorFn === 'function') {\n\n        {\n          // Warn about using Maps as children\n          if (iteratorFn === children.entries) {\n            if (!didWarnAboutMaps) {\n              warn('Using Maps as children is deprecated and will be removed in ' + 'a future major release. Consider converting children to ' + 'an array of keyed ReactElements instead.');\n            }\n\n            didWarnAboutMaps = true;\n          }\n        }\n\n        var iterator = iteratorFn.call(children);\n        var step;\n        var ii = 0;\n\n        while (!(step = iterator.next()).done) {\n          child = step.value;\n          nextName = nextNamePrefix + getComponentKey(child, ii++);\n          subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n        }\n      } else if (type === 'object') {\n        var addendum = '';\n\n        {\n          addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum();\n        }\n\n        var childrenString = '' + children;\n\n        {\n          {\n            throw Error( \"Objects are not valid as a React child (found: \" + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + \").\" + addendum );\n          }\n        }\n      }\n    }\n\n    return subtreeCount;\n  }\n  /**\n   * Traverses children that are typically specified as `props.children`, but\n   * might also be specified through attributes:\n   *\n   * - `traverseAllChildren(this.props.children, ...)`\n   * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n   *\n   * The `traverseContext` is an optional argument that is passed through the\n   * entire traversal. It can be used to store accumulations or anything else that\n   * the callback might find relevant.\n   *\n   * @param {?*} children Children tree object.\n   * @param {!function} callback To invoke upon traversing each child.\n   * @param {?*} traverseContext Context for traversal.\n   * @return {!number} The number of children in this subtree.\n   */\n\n\n  function traverseAllChildren(children, callback, traverseContext) {\n    if (children == null) {\n      return 0;\n    }\n\n    return traverseAllChildrenImpl(children, '', callback, traverseContext);\n  }\n  /**\n   * Generate a key string that identifies a component within a set.\n   *\n   * @param {*} component A component that could contain a manual key.\n   * @param {number} index Index that is used if a manual key is not provided.\n   * @return {string}\n   */\n\n\n  function getComponentKey(component, index) {\n    // Do some typechecking here since we call this blindly. We want to ensure\n    // that we don't block potential future ES APIs.\n    if (typeof component === 'object' && component !== null && component.key != null) {\n      // Explicit key\n      return escape(component.key);\n    } // Implicit key determined by the index in the set\n\n\n    return index.toString(36);\n  }\n\n  function forEachSingleChild(bookKeeping, child, name) {\n    var func = bookKeeping.func,\n        context = bookKeeping.context;\n    func.call(context, child, bookKeeping.count++);\n  }\n  /**\n   * Iterates through children that are typically specified as `props.children`.\n   *\n   * See https://reactjs.org/docs/react-api.html#reactchildrenforeach\n   *\n   * The provided forEachFunc(child, index) will be called for each\n   * leaf child.\n   *\n   * @param {?*} children Children tree container.\n   * @param {function(*, int)} forEachFunc\n   * @param {*} forEachContext Context for forEachContext.\n   */\n\n\n  function forEachChildren(children, forEachFunc, forEachContext) {\n    if (children == null) {\n      return children;\n    }\n\n    var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);\n    traverseAllChildren(children, forEachSingleChild, traverseContext);\n    releaseTraverseContext(traverseContext);\n  }\n\n  function mapSingleChildIntoContext(bookKeeping, child, childKey) {\n    var result = bookKeeping.result,\n        keyPrefix = bookKeeping.keyPrefix,\n        func = bookKeeping.func,\n        context = bookKeeping.context;\n    var mappedChild = func.call(context, child, bookKeeping.count++);\n\n    if (Array.isArray(mappedChild)) {\n      mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) {\n        return c;\n      });\n    } else if (mappedChild != null) {\n      if (isValidElement(mappedChild)) {\n        mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as\n        // traverseAllChildren used to do for objects as children\n        keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);\n      }\n\n      result.push(mappedChild);\n    }\n  }\n\n  function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n    var escapedPrefix = '';\n\n    if (prefix != null) {\n      escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n    }\n\n    var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);\n    traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n    releaseTraverseContext(traverseContext);\n  }\n  /**\n   * Maps children that are typically specified as `props.children`.\n   *\n   * See https://reactjs.org/docs/react-api.html#reactchildrenmap\n   *\n   * The provided mapFunction(child, key, index) will be called for each\n   * leaf child.\n   *\n   * @param {?*} children Children tree container.\n   * @param {function(*, int)} func The map function.\n   * @param {*} context Context for mapFunction.\n   * @return {object} Object containing the ordered map of results.\n   */\n\n\n  function mapChildren(children, func, context) {\n    if (children == null) {\n      return children;\n    }\n\n    var result = [];\n    mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n    return result;\n  }\n  /**\n   * Count the number of children that are typically specified as\n   * `props.children`.\n   *\n   * See https://reactjs.org/docs/react-api.html#reactchildrencount\n   *\n   * @param {?*} children Children tree container.\n   * @return {number} The number of children.\n   */\n\n\n  function countChildren(children) {\n    return traverseAllChildren(children, function () {\n      return null;\n    }, null);\n  }\n  /**\n   * Flatten a children object (typically specified as `props.children`) and\n   * return an array with appropriately re-keyed children.\n   *\n   * See https://reactjs.org/docs/react-api.html#reactchildrentoarray\n   */\n\n\n  function toArray(children) {\n    var result = [];\n    mapIntoWithKeyPrefixInternal(children, result, null, function (child) {\n      return child;\n    });\n    return result;\n  }\n  /**\n   * Returns the first child in a collection of children and verifies that there\n   * is only one child in the collection.\n   *\n   * See https://reactjs.org/docs/react-api.html#reactchildrenonly\n   *\n   * The current implementation of this function assumes that a single child gets\n   * passed without a wrapper, but the purpose of this helper function is to\n   * abstract away the particular structure of children.\n   *\n   * @param {?object} children Child collection structure.\n   * @return {ReactElement} The first and only `ReactElement` contained in the\n   * structure.\n   */\n\n\n  function onlyChild(children) {\n    if (!isValidElement(children)) {\n      {\n        throw Error( \"React.Children.only expected to receive a single React element child.\" );\n      }\n    }\n\n    return children;\n  }\n\n  function createContext(defaultValue, calculateChangedBits) {\n    if (calculateChangedBits === undefined) {\n      calculateChangedBits = null;\n    } else {\n      {\n        if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') {\n          error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits);\n        }\n      }\n    }\n\n    var context = {\n      $$typeof: REACT_CONTEXT_TYPE,\n      _calculateChangedBits: calculateChangedBits,\n      // As a workaround to support multiple concurrent renderers, we categorize\n      // some renderers as primary and others as secondary. We only expect\n      // there to be two concurrent renderers at most: React Native (primary) and\n      // Fabric (secondary); React DOM (primary) and React ART (secondary).\n      // Secondary renderers store their context values on separate fields.\n      _currentValue: defaultValue,\n      _currentValue2: defaultValue,\n      // Used to track how many concurrent renderers this context currently\n      // supports within in a single renderer. Such as parallel server rendering.\n      _threadCount: 0,\n      // These are circular\n      Provider: null,\n      Consumer: null\n    };\n    context.Provider = {\n      $$typeof: REACT_PROVIDER_TYPE,\n      _context: context\n    };\n    var hasWarnedAboutUsingNestedContextConsumers = false;\n    var hasWarnedAboutUsingConsumerProvider = false;\n\n    {\n      // A separate object, but proxies back to the original context object for\n      // backwards compatibility. It has a different $$typeof, so we can properly\n      // warn for the incorrect usage of Context as a Consumer.\n      var Consumer = {\n        $$typeof: REACT_CONTEXT_TYPE,\n        _context: context,\n        _calculateChangedBits: context._calculateChangedBits\n      }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here\n\n      Object.defineProperties(Consumer, {\n        Provider: {\n          get: function () {\n            if (!hasWarnedAboutUsingConsumerProvider) {\n              hasWarnedAboutUsingConsumerProvider = true;\n\n              error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');\n            }\n\n            return context.Provider;\n          },\n          set: function (_Provider) {\n            context.Provider = _Provider;\n          }\n        },\n        _currentValue: {\n          get: function () {\n            return context._currentValue;\n          },\n          set: function (_currentValue) {\n            context._currentValue = _currentValue;\n          }\n        },\n        _currentValue2: {\n          get: function () {\n            return context._currentValue2;\n          },\n          set: function (_currentValue2) {\n            context._currentValue2 = _currentValue2;\n          }\n        },\n        _threadCount: {\n          get: function () {\n            return context._threadCount;\n          },\n          set: function (_threadCount) {\n            context._threadCount = _threadCount;\n          }\n        },\n        Consumer: {\n          get: function () {\n            if (!hasWarnedAboutUsingNestedContextConsumers) {\n              hasWarnedAboutUsingNestedContextConsumers = true;\n\n              error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n            }\n\n            return context.Consumer;\n          }\n        }\n      }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty\n\n      context.Consumer = Consumer;\n    }\n\n    {\n      context._currentRenderer = null;\n      context._currentRenderer2 = null;\n    }\n\n    return context;\n  }\n\n  function lazy(ctor) {\n    var lazyType = {\n      $$typeof: REACT_LAZY_TYPE,\n      _ctor: ctor,\n      // React uses these fields to store the result.\n      _status: -1,\n      _result: null\n    };\n\n    {\n      // In production, this would just set it on the object.\n      var defaultProps;\n      var propTypes;\n      Object.defineProperties(lazyType, {\n        defaultProps: {\n          configurable: true,\n          get: function () {\n            return defaultProps;\n          },\n          set: function (newDefaultProps) {\n            error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n            defaultProps = newDefaultProps; // Match production behavior more closely:\n\n            Object.defineProperty(lazyType, 'defaultProps', {\n              enumerable: true\n            });\n          }\n        },\n        propTypes: {\n          configurable: true,\n          get: function () {\n            return propTypes;\n          },\n          set: function (newPropTypes) {\n            error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n            propTypes = newPropTypes; // Match production behavior more closely:\n\n            Object.defineProperty(lazyType, 'propTypes', {\n              enumerable: true\n            });\n          }\n        }\n      });\n    }\n\n    return lazyType;\n  }\n\n  function forwardRef(render) {\n    {\n      if (render != null && render.$$typeof === REACT_MEMO_TYPE) {\n        error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');\n      } else if (typeof render !== 'function') {\n        error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);\n      } else {\n        if (render.length !== 0 && render.length !== 2) {\n          error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');\n        }\n      }\n\n      if (render != null) {\n        if (render.defaultProps != null || render.propTypes != null) {\n          error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');\n        }\n      }\n    }\n\n    return {\n      $$typeof: REACT_FORWARD_REF_TYPE,\n      render: render\n    };\n  }\n\n  function isValidElementType(type) {\n    return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n    type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n  }\n\n  function memo(type, compare) {\n    {\n      if (!isValidElementType(type)) {\n        error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);\n      }\n    }\n\n    return {\n      $$typeof: REACT_MEMO_TYPE,\n      type: type,\n      compare: compare === undefined ? null : compare\n    };\n  }\n\n  function resolveDispatcher() {\n    var dispatcher = ReactCurrentDispatcher.current;\n\n    if (!(dispatcher !== null)) {\n      {\n        throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n      }\n    }\n\n    return dispatcher;\n  }\n\n  function useContext(Context, unstable_observedBits) {\n    var dispatcher = resolveDispatcher();\n\n    {\n      if (unstable_observedBits !== undefined) {\n        error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\\n\\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : '');\n      } // TODO: add a more generic warning for invalid values.\n\n\n      if (Context._context !== undefined) {\n        var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs\n        // and nobody should be using this in existing code.\n\n        if (realContext.Consumer === Context) {\n          error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');\n        } else if (realContext.Provider === Context) {\n          error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');\n        }\n      }\n    }\n\n    return dispatcher.useContext(Context, unstable_observedBits);\n  }\n  function useState(initialState) {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useState(initialState);\n  }\n  function useReducer(reducer, initialArg, init) {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useReducer(reducer, initialArg, init);\n  }\n  function useRef(initialValue) {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useRef(initialValue);\n  }\n  function useEffect(create, deps) {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useEffect(create, deps);\n  }\n  function useLayoutEffect(create, deps) {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useLayoutEffect(create, deps);\n  }\n  function useCallback(callback, deps) {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useCallback(callback, deps);\n  }\n  function useMemo(create, deps) {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useMemo(create, deps);\n  }\n  function useImperativeHandle(ref, create, deps) {\n    var dispatcher = resolveDispatcher();\n    return dispatcher.useImperativeHandle(ref, create, deps);\n  }\n  function useDebugValue(value, formatterFn) {\n    {\n      var dispatcher = resolveDispatcher();\n      return dispatcher.useDebugValue(value, formatterFn);\n    }\n  }\n\n  /**\n   * Copyright (c) 2013-present, Facebook, Inc.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   */\n\n  var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\n  var ReactPropTypesSecret_1 = ReactPropTypesSecret;\n\n  var printWarning$1 = function() {};\n\n  {\n    var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;\n    var loggedTypeFailures = {};\n    var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n    printWarning$1 = function(text) {\n      var message = 'Warning: ' + text;\n      if (typeof console !== 'undefined') {\n        console.error(message);\n      }\n      try {\n        // --- Welcome to debugging React ---\n        // This error was thrown as a convenience so that you can use this stack\n        // to find the callsite that caused this warning to fire.\n        throw new Error(message);\n      } catch (x) {}\n    };\n  }\n\n  /**\n   * Assert that the values match with the type specs.\n   * Error messages are memorized and will only be shown once.\n   *\n   * @param {object} typeSpecs Map of name to a ReactPropType\n   * @param {object} values Runtime values that need to be type-checked\n   * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n   * @param {string} componentName Name of the component for error messages.\n   * @param {?Function} getStack Returns the component stack.\n   * @private\n   */\n  function checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n    {\n      for (var typeSpecName in typeSpecs) {\n        if (has(typeSpecs, typeSpecName)) {\n          var error;\n          // Prop type validation may throw. In case they do, we don't want to\n          // fail the render phase where it didn't fail before. So we log it.\n          // After these have been cleaned up, we'll let them throw.\n          try {\n            // This is intentionally an invariant that gets caught. It's the same\n            // behavior as without this statement except with a better message.\n            if (typeof typeSpecs[typeSpecName] !== 'function') {\n              var err = Error(\n                (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n                'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'\n              );\n              err.name = 'Invariant Violation';\n              throw err;\n            }\n            error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1);\n          } catch (ex) {\n            error = ex;\n          }\n          if (error && !(error instanceof Error)) {\n            printWarning$1(\n              (componentName || 'React class') + ': type specification of ' +\n              location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n              'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n              'You may have forgotten to pass an argument to the type checker ' +\n              'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n              'shape all require an argument).'\n            );\n          }\n          if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n            // Only monitor this failure once because there tends to be a lot of the\n            // same error.\n            loggedTypeFailures[error.message] = true;\n\n            var stack = getStack ? getStack() : '';\n\n            printWarning$1(\n              'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n            );\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Resets warning cache when testing.\n   *\n   * @private\n   */\n  checkPropTypes.resetWarningCache = function() {\n    {\n      loggedTypeFailures = {};\n    }\n  };\n\n  var checkPropTypes_1 = checkPropTypes;\n\n  var propTypesMisspellWarningShown;\n\n  {\n    propTypesMisspellWarningShown = false;\n  }\n\n  function getDeclarationErrorAddendum() {\n    if (ReactCurrentOwner.current) {\n      var name = getComponentName(ReactCurrentOwner.current.type);\n\n      if (name) {\n        return '\\n\\nCheck the render method of `' + name + '`.';\n      }\n    }\n\n    return '';\n  }\n\n  function getSourceInfoErrorAddendum(source) {\n    if (source !== undefined) {\n      var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n      var lineNumber = source.lineNumber;\n      return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n    }\n\n    return '';\n  }\n\n  function getSourceInfoErrorAddendumForProps(elementProps) {\n    if (elementProps !== null && elementProps !== undefined) {\n      return getSourceInfoErrorAddendum(elementProps.__source);\n    }\n\n    return '';\n  }\n  /**\n   * Warn if there's no key explicitly set on dynamic arrays of children or\n   * object keys are not valid. This allows us to keep track of children between\n   * updates.\n   */\n\n\n  var ownerHasKeyUseWarning = {};\n\n  function getCurrentComponentErrorInfo(parentType) {\n    var info = getDeclarationErrorAddendum();\n\n    if (!info) {\n      var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n      if (parentName) {\n        info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n      }\n    }\n\n    return info;\n  }\n  /**\n   * Warn if the element doesn't have an explicit key assigned to it.\n   * This element is in an array. The array could grow and shrink or be\n   * reordered. All children that haven't already been validated are required to\n   * have a \"key\" property assigned to it. Error statuses are cached so a warning\n   * will only be shown once.\n   *\n   * @internal\n   * @param {ReactElement} element Element that requires a key.\n   * @param {*} parentType element's parent's type.\n   */\n\n\n  function validateExplicitKey(element, parentType) {\n    if (!element._store || element._store.validated || element.key != null) {\n      return;\n    }\n\n    element._store.validated = true;\n    var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n    if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n      return;\n    }\n\n    ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n    // property, it may be the creator of the child that's responsible for\n    // assigning it a key.\n\n    var childOwner = '';\n\n    if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n      // Give the component that originally created this child.\n      childOwner = \" It was passed a child from \" + getComponentName(element._owner.type) + \".\";\n    }\n\n    setCurrentlyValidatingElement(element);\n\n    {\n      error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner);\n    }\n\n    setCurrentlyValidatingElement(null);\n  }\n  /**\n   * Ensure that every element either is passed in a static location, in an\n   * array with an explicit keys property defined, or in an object literal\n   * with valid key property.\n   *\n   * @internal\n   * @param {ReactNode} node Statically passed child of any type.\n   * @param {*} parentType node's parent's type.\n   */\n\n\n  function validateChildKeys(node, parentType) {\n    if (typeof node !== 'object') {\n      return;\n    }\n\n    if (Array.isArray(node)) {\n      for (var i = 0; i < node.length; i++) {\n        var child = node[i];\n\n        if (isValidElement(child)) {\n          validateExplicitKey(child, parentType);\n        }\n      }\n    } else if (isValidElement(node)) {\n      // This element was passed in a valid location.\n      if (node._store) {\n        node._store.validated = true;\n      }\n    } else if (node) {\n      var iteratorFn = getIteratorFn(node);\n\n      if (typeof iteratorFn === 'function') {\n        // Entry iterators used to provide implicit keys,\n        // but now we print a separate warning for them later.\n        if (iteratorFn !== node.entries) {\n          var iterator = iteratorFn.call(node);\n          var step;\n\n          while (!(step = iterator.next()).done) {\n            if (isValidElement(step.value)) {\n              validateExplicitKey(step.value, parentType);\n            }\n          }\n        }\n      }\n    }\n  }\n  /**\n   * Given an element, validate that its props follow the propTypes definition,\n   * provided by the type.\n   *\n   * @param {ReactElement} element\n   */\n\n\n  function validatePropTypes(element) {\n    {\n      var type = element.type;\n\n      if (type === null || type === undefined || typeof type === 'string') {\n        return;\n      }\n\n      var name = getComponentName(type);\n      var propTypes;\n\n      if (typeof type === 'function') {\n        propTypes = type.propTypes;\n      } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n      // Inner props are checked in the reconciler.\n      type.$$typeof === REACT_MEMO_TYPE)) {\n        propTypes = type.propTypes;\n      } else {\n        return;\n      }\n\n      if (propTypes) {\n        setCurrentlyValidatingElement(element);\n        checkPropTypes_1(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum);\n        setCurrentlyValidatingElement(null);\n      } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n        propTypesMisspellWarningShown = true;\n\n        error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown');\n      }\n\n      if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n        error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n      }\n    }\n  }\n  /**\n   * Given a fragment, validate that it can only be provided with fragment props\n   * @param {ReactElement} fragment\n   */\n\n\n  function validateFragmentProps(fragment) {\n    {\n      setCurrentlyValidatingElement(fragment);\n      var keys = Object.keys(fragment.props);\n\n      for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n\n        if (key !== 'children' && key !== 'key') {\n          error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n          break;\n        }\n      }\n\n      if (fragment.ref !== null) {\n        error('Invalid attribute `ref` supplied to `React.Fragment`.');\n      }\n\n      setCurrentlyValidatingElement(null);\n    }\n  }\n  function createElementWithValidation(type, props, children) {\n    var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n    // succeed and there will likely be errors in render.\n\n    if (!validType) {\n      var info = '';\n\n      if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n        info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n      }\n\n      var sourceInfo = getSourceInfoErrorAddendumForProps(props);\n\n      if (sourceInfo) {\n        info += sourceInfo;\n      } else {\n        info += getDeclarationErrorAddendum();\n      }\n\n      var typeString;\n\n      if (type === null) {\n        typeString = 'null';\n      } else if (Array.isArray(type)) {\n        typeString = 'array';\n      } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n        typeString = \"<\" + (getComponentName(type.type) || 'Unknown') + \" />\";\n        info = ' Did you accidentally export a JSX literal instead of a component?';\n      } else {\n        typeString = typeof type;\n      }\n\n      {\n        error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n      }\n    }\n\n    var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.\n    // TODO: Drop this when these are no longer allowed as the type argument.\n\n    if (element == null) {\n      return element;\n    } // Skip key warning if the type isn't valid since our key validation logic\n    // doesn't expect a non-string/function type and can throw confusing errors.\n    // We don't want exception behavior to differ between dev and prod.\n    // (Rendering will throw with a helpful message and as soon as the type is\n    // fixed, the key warnings will appear.)\n\n\n    if (validType) {\n      for (var i = 2; i < arguments.length; i++) {\n        validateChildKeys(arguments[i], type);\n      }\n    }\n\n    if (type === REACT_FRAGMENT_TYPE) {\n      validateFragmentProps(element);\n    } else {\n      validatePropTypes(element);\n    }\n\n    return element;\n  }\n  var didWarnAboutDeprecatedCreateFactory = false;\n  function createFactoryWithValidation(type) {\n    var validatedFactory = createElementWithValidation.bind(null, type);\n    validatedFactory.type = type;\n\n    {\n      if (!didWarnAboutDeprecatedCreateFactory) {\n        didWarnAboutDeprecatedCreateFactory = true;\n\n        warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');\n      } // Legacy hook: remove it\n\n\n      Object.defineProperty(validatedFactory, 'type', {\n        enumerable: false,\n        get: function () {\n          warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');\n\n          Object.defineProperty(this, 'type', {\n            value: type\n          });\n          return type;\n        }\n      });\n    }\n\n    return validatedFactory;\n  }\n  function cloneElementWithValidation(element, props, children) {\n    var newElement = cloneElement.apply(this, arguments);\n\n    for (var i = 2; i < arguments.length; i++) {\n      validateChildKeys(arguments[i], newElement.type);\n    }\n\n    validatePropTypes(newElement);\n    return newElement;\n  }\n\n  var enableSchedulerDebugging = false;\n  var enableProfiling = true;\n\n  var requestHostCallback;\n  var requestHostTimeout;\n  var cancelHostTimeout;\n  var shouldYieldToHost;\n  var requestPaint;\n  var getCurrentTime;\n  var forceFrameRate;\n\n  if ( // If Scheduler runs in a non-DOM environment, it falls back to a naive\n  // implementation using setTimeout.\n  typeof window === 'undefined' || // Check if MessageChannel is supported, too.\n  typeof MessageChannel !== 'function') {\n    // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore,\n    // fallback to a naive implementation.\n    var _callback = null;\n    var _timeoutID = null;\n\n    var _flushCallback = function () {\n      if (_callback !== null) {\n        try {\n          var currentTime = getCurrentTime();\n          var hasRemainingTime = true;\n\n          _callback(hasRemainingTime, currentTime);\n\n          _callback = null;\n        } catch (e) {\n          setTimeout(_flushCallback, 0);\n          throw e;\n        }\n      }\n    };\n\n    var initialTime = Date.now();\n\n    getCurrentTime = function () {\n      return Date.now() - initialTime;\n    };\n\n    requestHostCallback = function (cb) {\n      if (_callback !== null) {\n        // Protect against re-entrancy.\n        setTimeout(requestHostCallback, 0, cb);\n      } else {\n        _callback = cb;\n        setTimeout(_flushCallback, 0);\n      }\n    };\n\n    requestHostTimeout = function (cb, ms) {\n      _timeoutID = setTimeout(cb, ms);\n    };\n\n    cancelHostTimeout = function () {\n      clearTimeout(_timeoutID);\n    };\n\n    shouldYieldToHost = function () {\n      return false;\n    };\n\n    requestPaint = forceFrameRate = function () {};\n  } else {\n    // Capture local references to native APIs, in case a polyfill overrides them.\n    var performance = window.performance;\n    var _Date = window.Date;\n    var _setTimeout = window.setTimeout;\n    var _clearTimeout = window.clearTimeout;\n\n    if (typeof console !== 'undefined') {\n      // TODO: Scheduler no longer requires these methods to be polyfilled. But\n      // maybe we want to continue warning if they don't exist, to preserve the\n      // option to rely on it in the future?\n      var requestAnimationFrame = window.requestAnimationFrame;\n      var cancelAnimationFrame = window.cancelAnimationFrame; // TODO: Remove fb.me link\n\n      if (typeof requestAnimationFrame !== 'function') {\n        // Using console['error'] to evade Babel and ESLint\n        console['error'](\"This browser doesn't support requestAnimationFrame. \" + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n      }\n\n      if (typeof cancelAnimationFrame !== 'function') {\n        // Using console['error'] to evade Babel and ESLint\n        console['error'](\"This browser doesn't support cancelAnimationFrame. \" + 'Make sure that you load a ' + 'polyfill in older browsers. https://fb.me/react-polyfills');\n      }\n    }\n\n    if (typeof performance === 'object' && typeof performance.now === 'function') {\n      getCurrentTime = function () {\n        return performance.now();\n      };\n    } else {\n      var _initialTime = _Date.now();\n\n      getCurrentTime = function () {\n        return _Date.now() - _initialTime;\n      };\n    }\n\n    var isMessageLoopRunning = false;\n    var scheduledHostCallback = null;\n    var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main\n    // thread, like user events. By default, it yields multiple times per frame.\n    // It does not attempt to align with frame boundaries, since most tasks don't\n    // need to be frame aligned; for those that do, use requestAnimationFrame.\n\n    var yieldInterval = 5;\n    var deadline = 0; // TODO: Make this configurable\n\n    {\n      // `isInputPending` is not available. Since we have no way of knowing if\n      // there's pending input, always yield at the end of the frame.\n      shouldYieldToHost = function () {\n        return getCurrentTime() >= deadline;\n      }; // Since we yield every frame regardless, `requestPaint` has no effect.\n\n\n      requestPaint = function () {};\n    }\n\n    forceFrameRate = function (fps) {\n      if (fps < 0 || fps > 125) {\n        // Using console['error'] to evade Babel and ESLint\n        console['error']('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing framerates higher than 125 fps is not unsupported');\n        return;\n      }\n\n      if (fps > 0) {\n        yieldInterval = Math.floor(1000 / fps);\n      } else {\n        // reset the framerate\n        yieldInterval = 5;\n      }\n    };\n\n    var performWorkUntilDeadline = function () {\n      if (scheduledHostCallback !== null) {\n        var currentTime = getCurrentTime(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync\n        // cycle. This means there's always time remaining at the beginning of\n        // the message event.\n\n        deadline = currentTime + yieldInterval;\n        var hasTimeRemaining = true;\n\n        try {\n          var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime);\n\n          if (!hasMoreWork) {\n            isMessageLoopRunning = false;\n            scheduledHostCallback = null;\n          } else {\n            // If there's more work, schedule the next message event at the end\n            // of the preceding one.\n            port.postMessage(null);\n          }\n        } catch (error) {\n          // If a scheduler task throws, exit the current browser task so the\n          // error can be observed.\n          port.postMessage(null);\n          throw error;\n        }\n      } else {\n        isMessageLoopRunning = false;\n      } // Yielding to the browser will give it a chance to paint, so we can\n    };\n\n    var channel = new MessageChannel();\n    var port = channel.port2;\n    channel.port1.onmessage = performWorkUntilDeadline;\n\n    requestHostCallback = function (callback) {\n      scheduledHostCallback = callback;\n\n      if (!isMessageLoopRunning) {\n        isMessageLoopRunning = true;\n        port.postMessage(null);\n      }\n    };\n\n    requestHostTimeout = function (callback, ms) {\n      taskTimeoutID = _setTimeout(function () {\n        callback(getCurrentTime());\n      }, ms);\n    };\n\n    cancelHostTimeout = function () {\n      _clearTimeout(taskTimeoutID);\n\n      taskTimeoutID = -1;\n    };\n  }\n\n  function push(heap, node) {\n    var index = heap.length;\n    heap.push(node);\n    siftUp(heap, node, index);\n  }\n  function peek(heap) {\n    var first = heap[0];\n    return first === undefined ? null : first;\n  }\n  function pop(heap) {\n    var first = heap[0];\n\n    if (first !== undefined) {\n      var last = heap.pop();\n\n      if (last !== first) {\n        heap[0] = last;\n        siftDown(heap, last, 0);\n      }\n\n      return first;\n    } else {\n      return null;\n    }\n  }\n\n  function siftUp(heap, node, i) {\n    var index = i;\n\n    while (true) {\n      var parentIndex = index - 1 >>> 1;\n      var parent = heap[parentIndex];\n\n      if (parent !== undefined && compare(parent, node) > 0) {\n        // The parent is larger. Swap positions.\n        heap[parentIndex] = node;\n        heap[index] = parent;\n        index = parentIndex;\n      } else {\n        // The parent is smaller. Exit.\n        return;\n      }\n    }\n  }\n\n  function siftDown(heap, node, i) {\n    var index = i;\n    var length = heap.length;\n\n    while (index < length) {\n      var leftIndex = (index + 1) * 2 - 1;\n      var left = heap[leftIndex];\n      var rightIndex = leftIndex + 1;\n      var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those.\n\n      if (left !== undefined && compare(left, node) < 0) {\n        if (right !== undefined && compare(right, left) < 0) {\n          heap[index] = right;\n          heap[rightIndex] = node;\n          index = rightIndex;\n        } else {\n          heap[index] = left;\n          heap[leftIndex] = node;\n          index = leftIndex;\n        }\n      } else if (right !== undefined && compare(right, node) < 0) {\n        heap[index] = right;\n        heap[rightIndex] = node;\n        index = rightIndex;\n      } else {\n        // Neither child is smaller. Exit.\n        return;\n      }\n    }\n  }\n\n  function compare(a, b) {\n    // Compare sort index first, then task id.\n    var diff = a.sortIndex - b.sortIndex;\n    return diff !== 0 ? diff : a.id - b.id;\n  }\n\n  // TODO: Use symbols?\n  var NoPriority = 0;\n  var ImmediatePriority = 1;\n  var UserBlockingPriority = 2;\n  var NormalPriority = 3;\n  var LowPriority = 4;\n  var IdlePriority = 5;\n\n  var runIdCounter = 0;\n  var mainThreadIdCounter = 0;\n  var profilingStateSize = 4;\n  var sharedProfilingBuffer =  // $FlowFixMe Flow doesn't know about SharedArrayBuffer\n  typeof SharedArrayBuffer === 'function' ? new SharedArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : // $FlowFixMe Flow doesn't know about ArrayBuffer\n  typeof ArrayBuffer === 'function' ? new ArrayBuffer(profilingStateSize * Int32Array.BYTES_PER_ELEMENT) : null // Don't crash the init path on IE9\n  ;\n  var profilingState =  sharedProfilingBuffer !== null ? new Int32Array(sharedProfilingBuffer) : []; // We can't read this but it helps save bytes for null checks\n\n  var PRIORITY = 0;\n  var CURRENT_TASK_ID = 1;\n  var CURRENT_RUN_ID = 2;\n  var QUEUE_SIZE = 3;\n\n  {\n    profilingState[PRIORITY] = NoPriority; // This is maintained with a counter, because the size of the priority queue\n    // array might include canceled tasks.\n\n    profilingState[QUEUE_SIZE] = 0;\n    profilingState[CURRENT_TASK_ID] = 0;\n  } // Bytes per element is 4\n\n\n  var INITIAL_EVENT_LOG_SIZE = 131072;\n  var MAX_EVENT_LOG_SIZE = 524288; // Equivalent to 2 megabytes\n\n  var eventLogSize = 0;\n  var eventLogBuffer = null;\n  var eventLog = null;\n  var eventLogIndex = 0;\n  var TaskStartEvent = 1;\n  var TaskCompleteEvent = 2;\n  var TaskErrorEvent = 3;\n  var TaskCancelEvent = 4;\n  var TaskRunEvent = 5;\n  var TaskYieldEvent = 6;\n  var SchedulerSuspendEvent = 7;\n  var SchedulerResumeEvent = 8;\n\n  function logEvent(entries) {\n    if (eventLog !== null) {\n      var offset = eventLogIndex;\n      eventLogIndex += entries.length;\n\n      if (eventLogIndex + 1 > eventLogSize) {\n        eventLogSize *= 2;\n\n        if (eventLogSize > MAX_EVENT_LOG_SIZE) {\n          // Using console['error'] to evade Babel and ESLint\n          console['error'](\"Scheduler Profiling: Event log exceeded maximum size. Don't \" + 'forget to call `stopLoggingProfilingEvents()`.');\n          stopLoggingProfilingEvents();\n          return;\n        }\n\n        var newEventLog = new Int32Array(eventLogSize * 4);\n        newEventLog.set(eventLog);\n        eventLogBuffer = newEventLog.buffer;\n        eventLog = newEventLog;\n      }\n\n      eventLog.set(entries, offset);\n    }\n  }\n\n  function startLoggingProfilingEvents() {\n    eventLogSize = INITIAL_EVENT_LOG_SIZE;\n    eventLogBuffer = new ArrayBuffer(eventLogSize * 4);\n    eventLog = new Int32Array(eventLogBuffer);\n    eventLogIndex = 0;\n  }\n  function stopLoggingProfilingEvents() {\n    var buffer = eventLogBuffer;\n    eventLogSize = 0;\n    eventLogBuffer = null;\n    eventLog = null;\n    eventLogIndex = 0;\n    return buffer;\n  }\n  function markTaskStart(task, ms) {\n    {\n      profilingState[QUEUE_SIZE]++;\n\n      if (eventLog !== null) {\n        // performance.now returns a float, representing milliseconds. When the\n        // event is logged, it's coerced to an int. Convert to microseconds to\n        // maintain extra degrees of precision.\n        logEvent([TaskStartEvent, ms * 1000, task.id, task.priorityLevel]);\n      }\n    }\n  }\n  function markTaskCompleted(task, ms) {\n    {\n      profilingState[PRIORITY] = NoPriority;\n      profilingState[CURRENT_TASK_ID] = 0;\n      profilingState[QUEUE_SIZE]--;\n\n      if (eventLog !== null) {\n        logEvent([TaskCompleteEvent, ms * 1000, task.id]);\n      }\n    }\n  }\n  function markTaskCanceled(task, ms) {\n    {\n      profilingState[QUEUE_SIZE]--;\n\n      if (eventLog !== null) {\n        logEvent([TaskCancelEvent, ms * 1000, task.id]);\n      }\n    }\n  }\n  function markTaskErrored(task, ms) {\n    {\n      profilingState[PRIORITY] = NoPriority;\n      profilingState[CURRENT_TASK_ID] = 0;\n      profilingState[QUEUE_SIZE]--;\n\n      if (eventLog !== null) {\n        logEvent([TaskErrorEvent, ms * 1000, task.id]);\n      }\n    }\n  }\n  function markTaskRun(task, ms) {\n    {\n      runIdCounter++;\n      profilingState[PRIORITY] = task.priorityLevel;\n      profilingState[CURRENT_TASK_ID] = task.id;\n      profilingState[CURRENT_RUN_ID] = runIdCounter;\n\n      if (eventLog !== null) {\n        logEvent([TaskRunEvent, ms * 1000, task.id, runIdCounter]);\n      }\n    }\n  }\n  function markTaskYield(task, ms) {\n    {\n      profilingState[PRIORITY] = NoPriority;\n      profilingState[CURRENT_TASK_ID] = 0;\n      profilingState[CURRENT_RUN_ID] = 0;\n\n      if (eventLog !== null) {\n        logEvent([TaskYieldEvent, ms * 1000, task.id, runIdCounter]);\n      }\n    }\n  }\n  function markSchedulerSuspended(ms) {\n    {\n      mainThreadIdCounter++;\n\n      if (eventLog !== null) {\n        logEvent([SchedulerSuspendEvent, ms * 1000, mainThreadIdCounter]);\n      }\n    }\n  }\n  function markSchedulerUnsuspended(ms) {\n    {\n      if (eventLog !== null) {\n        logEvent([SchedulerResumeEvent, ms * 1000, mainThreadIdCounter]);\n      }\n    }\n  }\n\n  /* eslint-disable no-var */\n  // Math.pow(2, 30) - 1\n  // 0b111111111111111111111111111111\n\n  var maxSigned31BitInt = 1073741823; // Times out immediately\n\n  var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out\n\n  var USER_BLOCKING_PRIORITY = 250;\n  var NORMAL_PRIORITY_TIMEOUT = 5000;\n  var LOW_PRIORITY_TIMEOUT = 10000; // Never times out\n\n  var IDLE_PRIORITY = maxSigned31BitInt; // Tasks are stored on a min heap\n\n  var taskQueue = [];\n  var timerQueue = []; // Incrementing id counter. Used to maintain insertion order.\n\n  var taskIdCounter = 1; // Pausing the scheduler is useful for debugging.\n  var currentTask = null;\n  var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy.\n\n  var isPerformingWork = false;\n  var isHostCallbackScheduled = false;\n  var isHostTimeoutScheduled = false;\n\n  function advanceTimers(currentTime) {\n    // Check for tasks that are no longer delayed and add them to the queue.\n    var timer = peek(timerQueue);\n\n    while (timer !== null) {\n      if (timer.callback === null) {\n        // Timer was cancelled.\n        pop(timerQueue);\n      } else if (timer.startTime <= currentTime) {\n        // Timer fired. Transfer to the task queue.\n        pop(timerQueue);\n        timer.sortIndex = timer.expirationTime;\n        push(taskQueue, timer);\n\n        {\n          markTaskStart(timer, currentTime);\n          timer.isQueued = true;\n        }\n      } else {\n        // Remaining timers are pending.\n        return;\n      }\n\n      timer = peek(timerQueue);\n    }\n  }\n\n  function handleTimeout(currentTime) {\n    isHostTimeoutScheduled = false;\n    advanceTimers(currentTime);\n\n    if (!isHostCallbackScheduled) {\n      if (peek(taskQueue) !== null) {\n        isHostCallbackScheduled = true;\n        requestHostCallback(flushWork);\n      } else {\n        var firstTimer = peek(timerQueue);\n\n        if (firstTimer !== null) {\n          requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n        }\n      }\n    }\n  }\n\n  function flushWork(hasTimeRemaining, initialTime) {\n    {\n      markSchedulerUnsuspended(initialTime);\n    } // We'll need a host callback the next time work is scheduled.\n\n\n    isHostCallbackScheduled = false;\n\n    if (isHostTimeoutScheduled) {\n      // We scheduled a timeout but it's no longer needed. Cancel it.\n      isHostTimeoutScheduled = false;\n      cancelHostTimeout();\n    }\n\n    isPerformingWork = true;\n    var previousPriorityLevel = currentPriorityLevel;\n\n    try {\n      if (enableProfiling) {\n        try {\n          return workLoop(hasTimeRemaining, initialTime);\n        } catch (error) {\n          if (currentTask !== null) {\n            var currentTime = getCurrentTime();\n            markTaskErrored(currentTask, currentTime);\n            currentTask.isQueued = false;\n          }\n\n          throw error;\n        }\n      } else {\n        // No catch in prod codepath.\n        return workLoop(hasTimeRemaining, initialTime);\n      }\n    } finally {\n      currentTask = null;\n      currentPriorityLevel = previousPriorityLevel;\n      isPerformingWork = false;\n\n      {\n        var _currentTime = getCurrentTime();\n\n        markSchedulerSuspended(_currentTime);\n      }\n    }\n  }\n\n  function workLoop(hasTimeRemaining, initialTime) {\n    var currentTime = initialTime;\n    advanceTimers(currentTime);\n    currentTask = peek(taskQueue);\n\n    while (currentTask !== null && !(enableSchedulerDebugging )) {\n      if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || shouldYieldToHost())) {\n        // This currentTask hasn't expired, and we've reached the deadline.\n        break;\n      }\n\n      var callback = currentTask.callback;\n\n      if (callback !== null) {\n        currentTask.callback = null;\n        currentPriorityLevel = currentTask.priorityLevel;\n        var didUserCallbackTimeout = currentTask.expirationTime <= currentTime;\n        markTaskRun(currentTask, currentTime);\n        var continuationCallback = callback(didUserCallbackTimeout);\n        currentTime = getCurrentTime();\n\n        if (typeof continuationCallback === 'function') {\n          currentTask.callback = continuationCallback;\n          markTaskYield(currentTask, currentTime);\n        } else {\n          {\n            markTaskCompleted(currentTask, currentTime);\n            currentTask.isQueued = false;\n          }\n\n          if (currentTask === peek(taskQueue)) {\n            pop(taskQueue);\n          }\n        }\n\n        advanceTimers(currentTime);\n      } else {\n        pop(taskQueue);\n      }\n\n      currentTask = peek(taskQueue);\n    } // Return whether there's additional work\n\n\n    if (currentTask !== null) {\n      return true;\n    } else {\n      var firstTimer = peek(timerQueue);\n\n      if (firstTimer !== null) {\n        requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n      }\n\n      return false;\n    }\n  }\n\n  function unstable_runWithPriority(priorityLevel, eventHandler) {\n    switch (priorityLevel) {\n      case ImmediatePriority:\n      case UserBlockingPriority:\n      case NormalPriority:\n      case LowPriority:\n      case IdlePriority:\n        break;\n\n      default:\n        priorityLevel = NormalPriority;\n    }\n\n    var previousPriorityLevel = currentPriorityLevel;\n    currentPriorityLevel = priorityLevel;\n\n    try {\n      return eventHandler();\n    } finally {\n      currentPriorityLevel = previousPriorityLevel;\n    }\n  }\n\n  function unstable_next(eventHandler) {\n    var priorityLevel;\n\n    switch (currentPriorityLevel) {\n      case ImmediatePriority:\n      case UserBlockingPriority:\n      case NormalPriority:\n        // Shift down to normal priority\n        priorityLevel = NormalPriority;\n        break;\n\n      default:\n        // Anything lower than normal priority should remain at the current level.\n        priorityLevel = currentPriorityLevel;\n        break;\n    }\n\n    var previousPriorityLevel = currentPriorityLevel;\n    currentPriorityLevel = priorityLevel;\n\n    try {\n      return eventHandler();\n    } finally {\n      currentPriorityLevel = previousPriorityLevel;\n    }\n  }\n\n  function unstable_wrapCallback(callback) {\n    var parentPriorityLevel = currentPriorityLevel;\n    return function () {\n      // This is a fork of runWithPriority, inlined for performance.\n      var previousPriorityLevel = currentPriorityLevel;\n      currentPriorityLevel = parentPriorityLevel;\n\n      try {\n        return callback.apply(this, arguments);\n      } finally {\n        currentPriorityLevel = previousPriorityLevel;\n      }\n    };\n  }\n\n  function timeoutForPriorityLevel(priorityLevel) {\n    switch (priorityLevel) {\n      case ImmediatePriority:\n        return IMMEDIATE_PRIORITY_TIMEOUT;\n\n      case UserBlockingPriority:\n        return USER_BLOCKING_PRIORITY;\n\n      case IdlePriority:\n        return IDLE_PRIORITY;\n\n      case LowPriority:\n        return LOW_PRIORITY_TIMEOUT;\n\n      case NormalPriority:\n      default:\n        return NORMAL_PRIORITY_TIMEOUT;\n    }\n  }\n\n  function unstable_scheduleCallback(priorityLevel, callback, options) {\n    var currentTime = getCurrentTime();\n    var startTime;\n    var timeout;\n\n    if (typeof options === 'object' && options !== null) {\n      var delay = options.delay;\n\n      if (typeof delay === 'number' && delay > 0) {\n        startTime = currentTime + delay;\n      } else {\n        startTime = currentTime;\n      }\n\n      timeout = typeof options.timeout === 'number' ? options.timeout : timeoutForPriorityLevel(priorityLevel);\n    } else {\n      timeout = timeoutForPriorityLevel(priorityLevel);\n      startTime = currentTime;\n    }\n\n    var expirationTime = startTime + timeout;\n    var newTask = {\n      id: taskIdCounter++,\n      callback: callback,\n      priorityLevel: priorityLevel,\n      startTime: startTime,\n      expirationTime: expirationTime,\n      sortIndex: -1\n    };\n\n    {\n      newTask.isQueued = false;\n    }\n\n    if (startTime > currentTime) {\n      // This is a delayed task.\n      newTask.sortIndex = startTime;\n      push(timerQueue, newTask);\n\n      if (peek(taskQueue) === null && newTask === peek(timerQueue)) {\n        // All tasks are delayed, and this is the task with the earliest delay.\n        if (isHostTimeoutScheduled) {\n          // Cancel an existing timeout.\n          cancelHostTimeout();\n        } else {\n          isHostTimeoutScheduled = true;\n        } // Schedule a timeout.\n\n\n        requestHostTimeout(handleTimeout, startTime - currentTime);\n      }\n    } else {\n      newTask.sortIndex = expirationTime;\n      push(taskQueue, newTask);\n\n      {\n        markTaskStart(newTask, currentTime);\n        newTask.isQueued = true;\n      } // Schedule a host callback, if needed. If we're already performing work,\n      // wait until the next time we yield.\n\n\n      if (!isHostCallbackScheduled && !isPerformingWork) {\n        isHostCallbackScheduled = true;\n        requestHostCallback(flushWork);\n      }\n    }\n\n    return newTask;\n  }\n\n  function unstable_pauseExecution() {\n  }\n\n  function unstable_continueExecution() {\n\n    if (!isHostCallbackScheduled && !isPerformingWork) {\n      isHostCallbackScheduled = true;\n      requestHostCallback(flushWork);\n    }\n  }\n\n  function unstable_getFirstCallbackNode() {\n    return peek(taskQueue);\n  }\n\n  function unstable_cancelCallback(task) {\n    {\n      if (task.isQueued) {\n        var currentTime = getCurrentTime();\n        markTaskCanceled(task, currentTime);\n        task.isQueued = false;\n      }\n    } // Null out the callback to indicate the task has been canceled. (Can't\n    // remove from the queue because you can't remove arbitrary nodes from an\n    // array based heap, only the first one.)\n\n\n    task.callback = null;\n  }\n\n  function unstable_getCurrentPriorityLevel() {\n    return currentPriorityLevel;\n  }\n\n  function unstable_shouldYield() {\n    var currentTime = getCurrentTime();\n    advanceTimers(currentTime);\n    var firstTask = peek(taskQueue);\n    return firstTask !== currentTask && currentTask !== null && firstTask !== null && firstTask.callback !== null && firstTask.startTime <= currentTime && firstTask.expirationTime < currentTask.expirationTime || shouldYieldToHost();\n  }\n\n  var unstable_requestPaint = requestPaint;\n  var unstable_Profiling =  {\n    startLoggingProfilingEvents: startLoggingProfilingEvents,\n    stopLoggingProfilingEvents: stopLoggingProfilingEvents,\n    sharedProfilingBuffer: sharedProfilingBuffer\n  } ;\n\n\n\n  var Scheduler = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    unstable_ImmediatePriority: ImmediatePriority,\n    unstable_UserBlockingPriority: UserBlockingPriority,\n    unstable_NormalPriority: NormalPriority,\n    unstable_IdlePriority: IdlePriority,\n    unstable_LowPriority: LowPriority,\n    unstable_runWithPriority: unstable_runWithPriority,\n    unstable_next: unstable_next,\n    unstable_scheduleCallback: unstable_scheduleCallback,\n    unstable_cancelCallback: unstable_cancelCallback,\n    unstable_wrapCallback: unstable_wrapCallback,\n    unstable_getCurrentPriorityLevel: unstable_getCurrentPriorityLevel,\n    unstable_shouldYield: unstable_shouldYield,\n    unstable_requestPaint: unstable_requestPaint,\n    unstable_continueExecution: unstable_continueExecution,\n    unstable_pauseExecution: unstable_pauseExecution,\n    unstable_getFirstCallbackNode: unstable_getFirstCallbackNode,\n    get unstable_now () { return getCurrentTime; },\n    get unstable_forceFrameRate () { return forceFrameRate; },\n    unstable_Profiling: unstable_Profiling\n  });\n\n  var DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs.\n\n  var interactionIDCounter = 0;\n  var threadIDCounter = 0; // Set of currently traced interactions.\n  // Interactions \"stack\"–\n  // Meaning that newly traced interactions are appended to the previously active set.\n  // When an interaction goes out of scope, the previous set (if any) is restored.\n\n  var interactionsRef = null; // Listener(s) to notify when interactions begin and end.\n\n  var subscriberRef = null;\n\n  {\n    interactionsRef = {\n      current: new Set()\n    };\n    subscriberRef = {\n      current: null\n    };\n  }\n  function unstable_clear(callback) {\n\n    var prevInteractions = interactionsRef.current;\n    interactionsRef.current = new Set();\n\n    try {\n      return callback();\n    } finally {\n      interactionsRef.current = prevInteractions;\n    }\n  }\n  function unstable_getCurrent() {\n    {\n      return interactionsRef.current;\n    }\n  }\n  function unstable_getThreadID() {\n    return ++threadIDCounter;\n  }\n  function unstable_trace(name, timestamp, callback) {\n    var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID;\n\n    var interaction = {\n      __count: 1,\n      id: interactionIDCounter++,\n      name: name,\n      timestamp: timestamp\n    };\n    var prevInteractions = interactionsRef.current; // Traced interactions should stack/accumulate.\n    // To do that, clone the current interactions.\n    // The previous set will be restored upon completion.\n\n    var interactions = new Set(prevInteractions);\n    interactions.add(interaction);\n    interactionsRef.current = interactions;\n    var subscriber = subscriberRef.current;\n    var returnValue;\n\n    try {\n      if (subscriber !== null) {\n        subscriber.onInteractionTraced(interaction);\n      }\n    } finally {\n      try {\n        if (subscriber !== null) {\n          subscriber.onWorkStarted(interactions, threadID);\n        }\n      } finally {\n        try {\n          returnValue = callback();\n        } finally {\n          interactionsRef.current = prevInteractions;\n\n          try {\n            if (subscriber !== null) {\n              subscriber.onWorkStopped(interactions, threadID);\n            }\n          } finally {\n            interaction.__count--; // If no async work was scheduled for this interaction,\n            // Notify subscribers that it's completed.\n\n            if (subscriber !== null && interaction.__count === 0) {\n              subscriber.onInteractionScheduledWorkCompleted(interaction);\n            }\n          }\n        }\n      }\n    }\n\n    return returnValue;\n  }\n  function unstable_wrap(callback) {\n    var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID;\n\n    var wrappedInteractions = interactionsRef.current;\n    var subscriber = subscriberRef.current;\n\n    if (subscriber !== null) {\n      subscriber.onWorkScheduled(wrappedInteractions, threadID);\n    } // Update the pending async work count for the current interactions.\n    // Update after calling subscribers in case of error.\n\n\n    wrappedInteractions.forEach(function (interaction) {\n      interaction.__count++;\n    });\n    var hasRun = false;\n\n    function wrapped() {\n      var prevInteractions = interactionsRef.current;\n      interactionsRef.current = wrappedInteractions;\n      subscriber = subscriberRef.current;\n\n      try {\n        var returnValue;\n\n        try {\n          if (subscriber !== null) {\n            subscriber.onWorkStarted(wrappedInteractions, threadID);\n          }\n        } finally {\n          try {\n            returnValue = callback.apply(undefined, arguments);\n          } finally {\n            interactionsRef.current = prevInteractions;\n\n            if (subscriber !== null) {\n              subscriber.onWorkStopped(wrappedInteractions, threadID);\n            }\n          }\n        }\n\n        return returnValue;\n      } finally {\n        if (!hasRun) {\n          // We only expect a wrapped function to be executed once,\n          // But in the event that it's executed more than once–\n          // Only decrement the outstanding interaction counts once.\n          hasRun = true; // Update pending async counts for all wrapped interactions.\n          // If this was the last scheduled async work for any of them,\n          // Mark them as completed.\n\n          wrappedInteractions.forEach(function (interaction) {\n            interaction.__count--;\n\n            if (subscriber !== null && interaction.__count === 0) {\n              subscriber.onInteractionScheduledWorkCompleted(interaction);\n            }\n          });\n        }\n      }\n    }\n\n    wrapped.cancel = function cancel() {\n      subscriber = subscriberRef.current;\n\n      try {\n        if (subscriber !== null) {\n          subscriber.onWorkCanceled(wrappedInteractions, threadID);\n        }\n      } finally {\n        // Update pending async counts for all wrapped interactions.\n        // If this was the last scheduled async work for any of them,\n        // Mark them as completed.\n        wrappedInteractions.forEach(function (interaction) {\n          interaction.__count--;\n\n          if (subscriber && interaction.__count === 0) {\n            subscriber.onInteractionScheduledWorkCompleted(interaction);\n          }\n        });\n      }\n    };\n\n    return wrapped;\n  }\n\n  var subscribers = null;\n\n  {\n    subscribers = new Set();\n  }\n\n  function unstable_subscribe(subscriber) {\n    {\n      subscribers.add(subscriber);\n\n      if (subscribers.size === 1) {\n        subscriberRef.current = {\n          onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted,\n          onInteractionTraced: onInteractionTraced,\n          onWorkCanceled: onWorkCanceled,\n          onWorkScheduled: onWorkScheduled,\n          onWorkStarted: onWorkStarted,\n          onWorkStopped: onWorkStopped\n        };\n      }\n    }\n  }\n  function unstable_unsubscribe(subscriber) {\n    {\n      subscribers.delete(subscriber);\n\n      if (subscribers.size === 0) {\n        subscriberRef.current = null;\n      }\n    }\n  }\n\n  function onInteractionTraced(interaction) {\n    var didCatchError = false;\n    var caughtError = null;\n    subscribers.forEach(function (subscriber) {\n      try {\n        subscriber.onInteractionTraced(interaction);\n      } catch (error) {\n        if (!didCatchError) {\n          didCatchError = true;\n          caughtError = error;\n        }\n      }\n    });\n\n    if (didCatchError) {\n      throw caughtError;\n    }\n  }\n\n  function onInteractionScheduledWorkCompleted(interaction) {\n    var didCatchError = false;\n    var caughtError = null;\n    subscribers.forEach(function (subscriber) {\n      try {\n        subscriber.onInteractionScheduledWorkCompleted(interaction);\n      } catch (error) {\n        if (!didCatchError) {\n          didCatchError = true;\n          caughtError = error;\n        }\n      }\n    });\n\n    if (didCatchError) {\n      throw caughtError;\n    }\n  }\n\n  function onWorkScheduled(interactions, threadID) {\n    var didCatchError = false;\n    var caughtError = null;\n    subscribers.forEach(function (subscriber) {\n      try {\n        subscriber.onWorkScheduled(interactions, threadID);\n      } catch (error) {\n        if (!didCatchError) {\n          didCatchError = true;\n          caughtError = error;\n        }\n      }\n    });\n\n    if (didCatchError) {\n      throw caughtError;\n    }\n  }\n\n  function onWorkStarted(interactions, threadID) {\n    var didCatchError = false;\n    var caughtError = null;\n    subscribers.forEach(function (subscriber) {\n      try {\n        subscriber.onWorkStarted(interactions, threadID);\n      } catch (error) {\n        if (!didCatchError) {\n          didCatchError = true;\n          caughtError = error;\n        }\n      }\n    });\n\n    if (didCatchError) {\n      throw caughtError;\n    }\n  }\n\n  function onWorkStopped(interactions, threadID) {\n    var didCatchError = false;\n    var caughtError = null;\n    subscribers.forEach(function (subscriber) {\n      try {\n        subscriber.onWorkStopped(interactions, threadID);\n      } catch (error) {\n        if (!didCatchError) {\n          didCatchError = true;\n          caughtError = error;\n        }\n      }\n    });\n\n    if (didCatchError) {\n      throw caughtError;\n    }\n  }\n\n  function onWorkCanceled(interactions, threadID) {\n    var didCatchError = false;\n    var caughtError = null;\n    subscribers.forEach(function (subscriber) {\n      try {\n        subscriber.onWorkCanceled(interactions, threadID);\n      } catch (error) {\n        if (!didCatchError) {\n          didCatchError = true;\n          caughtError = error;\n        }\n      }\n    });\n\n    if (didCatchError) {\n      throw caughtError;\n    }\n  }\n\n\n\n  var SchedulerTracing = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    get __interactionsRef () { return interactionsRef; },\n    get __subscriberRef () { return subscriberRef; },\n    unstable_clear: unstable_clear,\n    unstable_getCurrent: unstable_getCurrent,\n    unstable_getThreadID: unstable_getThreadID,\n    unstable_trace: unstable_trace,\n    unstable_wrap: unstable_wrap,\n    unstable_subscribe: unstable_subscribe,\n    unstable_unsubscribe: unstable_unsubscribe\n  });\n\n  var ReactSharedInternals$1 = {\n    ReactCurrentDispatcher: ReactCurrentDispatcher,\n    ReactCurrentOwner: ReactCurrentOwner,\n    IsSomeRendererActing: IsSomeRendererActing,\n    // Used by renderers to avoid bundling object-assign twice in UMD bundles:\n    assign: objectAssign\n  };\n\n  {\n    objectAssign(ReactSharedInternals$1, {\n      // These should not be included in production.\n      ReactDebugCurrentFrame: ReactDebugCurrentFrame,\n      // Shim for React DOM 16.0.0 which still destructured (but not used) this.\n      // TODO: remove in React 17.0.\n      ReactComponentTreeHook: {}\n    });\n  } // Re-export the schedule API(s) for UMD bundles.\n  // This avoids introducing a dependency on a new UMD global in a minor update,\n  // Since that would be a breaking change (e.g. for all existing CodeSandboxes).\n  // This re-export is only required for UMD bundles;\n  // CJS bundles use the shared NPM package.\n\n\n  objectAssign(ReactSharedInternals$1, {\n    Scheduler: Scheduler,\n    SchedulerTracing: SchedulerTracing\n  });\n\n  {\n\n    try {\n      var frozenObject = Object.freeze({});\n      var testMap = new Map([[frozenObject, null]]);\n      var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused.\n      // https://github.com/rollup/rollup/issues/1771\n      // TODO: we can remove these if Rollup fixes the bug.\n\n      testMap.set(0, 0);\n      testSet.add(0);\n    } catch (e) {\n    }\n  }\n\n  var createElement$1 =  createElementWithValidation ;\n  var cloneElement$1 =  cloneElementWithValidation ;\n  var createFactory =  createFactoryWithValidation ;\n  var Children = {\n    map: mapChildren,\n    forEach: forEachChildren,\n    count: countChildren,\n    toArray: toArray,\n    only: onlyChild\n  };\n\n  exports.Children = Children;\n  exports.Component = Component;\n  exports.Fragment = REACT_FRAGMENT_TYPE;\n  exports.Profiler = REACT_PROFILER_TYPE;\n  exports.PureComponent = PureComponent;\n  exports.StrictMode = REACT_STRICT_MODE_TYPE;\n  exports.Suspense = REACT_SUSPENSE_TYPE;\n  exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals$1;\n  exports.cloneElement = cloneElement$1;\n  exports.createContext = createContext;\n  exports.createElement = createElement$1;\n  exports.createFactory = createFactory;\n  exports.createRef = createRef;\n  exports.forwardRef = forwardRef;\n  exports.isValidElement = isValidElement;\n  exports.lazy = lazy;\n  exports.memo = memo;\n  exports.useCallback = useCallback;\n  exports.useContext = useContext;\n  exports.useDebugValue = useDebugValue;\n  exports.useEffect = useEffect;\n  exports.useImperativeHandle = useImperativeHandle;\n  exports.useLayoutEffect = useLayoutEffect;\n  exports.useMemo = useMemo;\n  exports.useReducer = useReducer;\n  exports.useRef = useRef;\n  exports.useState = useState;\n  exports.version = ReactVersion;\n\n})));\n"
  },
  {
    "path": "docs/index.html",
    "content": "---\nlayout: page\ntitle: 'Home'\n---\n\n<h1 id=\"sanddance\">SandDance</h1>\n<p>Visually explore, understand, and present your data.</p>\n<p><img src=\"https://user-images.githubusercontent.com/11507384/189461831-9467863e-bff8-47d2-aa03-ab2b74658814.gif\" alt=\"sanddance-animation\"></p>\n<p>By using easy-to-understand views, SandDance helps you find insights about your data, which in turn help you tell stories supported by data, build cases based on evidence, test hypotheses, dig deeper into surface explanations, support decisions for purchases, or relate data into a wider, real world context.</p>\n<p>SandDance uses unit visualizations, which apply a one-to-one mapping between rows in your database and marks on the screen.\nSmooth animated transitions between views help you to maintain context as you interact with your data.</p>\n<blockquote>\n<p>This new version of SandDance has been rebuilt from scratch with the goal of being modular, extensible, and embeddable into your custom applications. We are now on GitHub so that we are open and driven by the community through contributions, feature requests, and discussion.</p>\n</blockquote>\n<p>SandDance was created by the <a href=\"https://aka.ms/vida\">Microsoft Research VIDA Group</a> which explores novel technologies for visualization and immersive data analytics.</p>\n<h2 id=\"where-can-i-use-sanddance\">Where can I use SandDance?</h2>\n<ul>\n<li><a href=\"/SandDance/app/\">Try it now on the web</a></li>\n<li>Microsoft apps:<ul>\n<li><a href=\"https://appsource.microsoft.com/en-us/product/power-bi-visuals/WA200000430\">Power BI</a> - <a href=\"https://github.com/microsoft/SandDance/blob/master/powerbi.md\"><em>see additional info</em></a></li>\n<li><a href=\"https://docs.microsoft.com/en-us/sql/azure-data-studio/sanddance-extension?view=sql-server-2017\">Azure Data Studio</a></li>\n<li><a href=\"https://marketplace.visualstudio.com/items?itemName=msrvida.vscode-sanddance\">VSCode extension</a></li>\n</ul>\n</li>\n<li>3rd Party apps:<ul>\n<li><a href=\"https://observablehq.com/collection/@danmarshall/sanddance\">Observable</a></li>\n<li><a href=\"https://core.hash.ai/\">HASH Core IDE</a> - <a href=\"https://docs.hash.ai/core/creating-simulations/views#step-explorer\"><em>see &#39;Step Explorer&#39; documentation</em></a></li>\n</ul>\n</li>\n<li>In your own JavaScript apps - see below</li>\n</ul>\n<h2 id=\"component-architecture\">Component architecture</h2>\n<p>SandDance is an offering of several JavaScript components:</p>\n<ul>\n<li><a href=\"https://github.com/microsoft/SandDance/tree/main/packages/sanddance\">sanddance</a> - the core SandDance visualization canvas.</li>\n<li><a href=\"https://github.com/microsoft/SandDance/tree/main/packages/sanddance-specs\">sanddance-specs</a> - <a href=\"https://vega.github.io/vega/docs/specification/\">Vega specifications</a> for unit visualizations.</li>\n<li><a href=\"https://github.com/microsoft/SandDance/tree/main/packages/sanddance-react\">sanddance-react</a> - the core SandDance visualization canvas for use in React based applications.</li>\n<li><a href=\"https://github.com/microsoft/SandDance/tree/main/packages/sanddance-explorer\">sanddance-explorer</a> - the core SandDance visualization canvas with UI to enable data exploration, for use in React based applications.</li>\n<li><a href=\"https://github.com/microsoft/SandDance/tree/main/packages/sanddance-embed\">sanddance-embed</a> - the easiest way to embed SandDance Explorer in your applications, via an <code>&lt;iframe&gt;</code> tag.</li>\n</ul>\n<h2 id=\"publications\">Publications</h2>\n<ul>\n<li>2018 - <a href=\"https://www.microsoft.com/en-us/research/uploads/prod/2019/01/atom.pdf\">Atom: A Grammar for Unit Visualizations</a><ul>\n<li>Deokgun Park, Steven Drucker, Roland Fernandez, Niklas Elmqvist</li>\n<li>IEEE Transactions on Visualization and Computer Graphics | December 2018, Vol 24(12): pp. 3032-3043</li>\n</ul>\n</li>\n<li>2015 - <a href=\"https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/sanddance.pdf\">A Unifying Framework for Animated and Interactive Unit Visualizations</a><ul>\n<li>Steven Drucker, Roland Fernandez </li>\n<li>MSR-TR-2015-65 | August 2015</li>\n</ul>\n</li>\n</ul>\n<h2 id=\"articles--videos\">Articles &amp; videos</h2>\n<ul>\n<li><a href=\"https://www.microsoft.com/en-us/research/project/sanddance/\">SandDance project @ Microsoft Research</a></li>\n<li><a href=\"https://note.microsoft.com/MSR-Webinar-Data-Visualization-Registration-On-Demand.html\">Microsoft Research webinar / Data Visualization: Bridging the Gap Between Users and Information</a>.</li>\n<li><a href=\"https://cloudblogs.microsoft.com/sqlserver/2019/08/15/the-august-release-of-azure-data-studio-is-now-available/\">SQL Server Blog / The August release of Azure Data Studio is now available</a></li>\n<li><a href=\"https://cloudblogs.microsoft.com/opensource/2020/06/23/whats-new-sanddance-3-microsoft-research/\">Open Source Blog / What’s new in SandDance 3</a></li>\n<li><a href=\"https://channel9.msdn.com/Shows/Data-Exposed/Introducing-SandDance-Data-Visualization-in-Azure-Data-Studio\">Channel 9 - Data Exposed / Introducing SandDance: Data Visualization in Azure Data Studio</a></li>\n<li><a href=\"https://channel9.msdn.com/Shows/Data-Exposed/What-is-SandDance\">Channel 9 - Data Exposed / What is SandDance?</a></li>\n<li><a href=\"https://news.ycombinator.com/item?id=21224685\">Hacker News / Microsoft open sources SandDance, a visual data exploration tool</a></li>\n<li><a href=\"https://analyticsindiamag.com/visualizations-with-sanddance-using-visual-studio-code/\">analyticsindiamag.com / Visualizations With SandDance Using Visual Studio Code</a></li>\n<li><a href=\"https://codeburst.io/exploring-titanic-dataset-using-microsofts-sandance-175eb04b3ac2\">codeburst.io / Exploring Titanic Dataset using Microsoft’s Sandance</a></li>\n<li><a href=\"https://www.mathkuro.com/vs-code/sand-dance/\">mathkuro.com / VS Codeのイケメンすぎる分析＆可視化ツールSand Danceの使い方</a></li>\n<li><a href=\"https://www.mathkuro.com/vs-code/sanddance-charts/\">mathkuro.com / 【SandDanceグラフサンプル】用途に合わせて選択しましょう◎</a></li>\n<li><a href=\"https://medium.com/@sefaoguzsaglam/how-to-start-data-visualizing-with-microsofts-sanddance-for-beginners-abe5c0552750\">medium.com - @sefaoguzsaglam / how to start data visualizing with Microsoft’s SandDance (for beginners)</a></li>\n<li><a href=\"https://www.mssqltips.com/sqlservertip/6045/sanddance-for-azure-data-studio/\">mssqltips.com / SandDance for Azure Data Studio</a></li>\n<li><a href=\"https://www.sqlshack.com/exploring-the-sanddance-visualizations-extension-in-azure-data-studio/\">sqlshack.com / Exploring the SandDance Visualizations extension in Azure Data Studio</a></li>\n<li><a href=\"https://torbjornzetterlund.com/i-got-to-do-some-sanddance-vizualisation/\">torbjornzetterlund.com / I got to do some SandDance visualization</a></li>\n<li><a href=\"https://www.youtube.com/watch?v=sI4WIQEz07w\">YouTube - Anjani Prasad Atluri / SandDance: A tutorial</a></li>\n<li><a href=\"https://www.youtube.com/watch?v=iUhvYMggzAQ\">YouTube - BI Tracks / SandDance Visualizations Tutorial - Azure Data Studio</a></li>\n</ul>\n<h2 id=\"changelog\">Changelog</h2>\n<ul>\n<li>July 2022 - Major version bump to v4: Now using MorphCharts.</li>\n<li>June 2020 - Major version bump to v3: Now using Deck.gl@8.</li>\n<li>December 2019 - Major version bump to v2: Now using Vega@5.</li>\n<li>August 2019 - Initial release to AppSource (Power BI marketplace).</li>\n<li>April 2019 - Initial release to GitHub.</li>\n</ul>\n<h2 id=\"known-issues\">Known issues</h2>\n<ul>\n<li>Animations require a WebGL2 enabled browser.</li>\n</ul>\n<h2 id=\"roadmap\">Roadmap</h2>\n<ul>\n<li><del>PowerBI custom visual based on this new architecture.</del> done!</li>\n<li><del>Additional views, such as stacks.</del> done!</li>\n<li>Code examples and tutorials.</li>\n<li><del>Faceting for all chart types.</del> done!</li>\n<li>Better date handling.</li>\n</ul>\n<h2 id=\"dependencies\">Dependencies</h2>\n<p>SandDance is created with open source libraries, using <a href=\"https://vega.github.io\">Vega</a> for chart layout.</p>\n<h2 id=\"development\">Development</h2>\n<p>See <a href=\"https://github.com/Microsoft/SandDance/blob/master/dev.md\">https://github.com/Microsoft/SandDance/blob/master/dev.md</a></p>\n<h2 id=\"contributing\">Contributing</h2>\n<p>This project welcomes contributions and suggestions.  Most contributions require you to agree to a\nContributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us\nthe rights to use your contribution. For details, visit <a href=\"https://cla.microsoft.com\">https://cla.microsoft.com</a>.</p>\n<p>When you submit a pull request, a CLA-bot will automatically determine whether you need to provide\na CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions\nprovided by the bot. You will only need to do this once across all repos using our CLA.</p>\n<p>This project has adopted the <a href=\"https://opensource.microsoft.com/codeofconduct/\">Microsoft Open Source Code of Conduct</a>.\nFor more information see the <a href=\"https://opensource.microsoft.com/codeofconduct/faq/\">Code of Conduct FAQ</a> or\ncontact <a href=\"mailto:opencode@microsoft.com\">opencode@microsoft.com</a> with any additional questions or comments.</p>\n"
  },
  {
    "path": "docs/sample-data/demovote.tsv",
    "content": "Id\tLongitude\tLatitude\tGeoName\tStateAbb\tState\tCounty\tTotalPop\tMedAge\tEducation\tUnemployment\tIncome\tMedHomeValue\tObama\tZipcodes\tWinner\tRealZip\tElectoralFraction\tZipNumbers\n0\t-86.396153\t32.461513000000004\tPrattville city\tAL\tAlabama\tAutauga County\t28676\t36.2\t25.4\t8.6\t24527\t129015\t0.2654\t36066\tRomney\t36066\t0.08858902\t36066.0\n1\t-86.70866600000001\t32.660992\tBillingsley town\tAL\tAlabama\tAutauga County\t132\t36.9\t9.3\t9.4\t17993\t59000\t0.2654\t36006\tRomney\t36006\t0.00040778900000000004\t36006.0\n2\t-86.658236\t32.432024\tAutaugaville town\tAL\tAlabama\tAutauga County\t939\t37.3\t9.2\t10.3\t15078\t61364\t0.2654\t36003\tRomney\t36003\t0.002900861\t36003.0\n3\t-87.88420699999999\t30.532878999999998\tFairhope city\tAL\tAlabama\tBaldwin County\t16442\t44.0\t36.8\t9.7\t26966\t200000\t0.2155\t36532\tRomney\t36532\t0.050794415999999995\t36532.0\n4\t-87.591481\t30.290025\tOrange Beach city\tAL\tAlabama\tBaldwin County\t6326\t49.5\t25.0\t9.6\t29576\t290024\t0.2155\t36561\tRomney\t36561\t0.019542968\t36561.0\n5\t-87.596406\t30.414659000000004\tElberta town\tAL\tAlabama\tBaldwin County\t616\t39.3\t15.7\t9.8\t19302\t144531\t0.2155\t36530\tRomney\t36530\t0.001903014\t36530.0\n6\t-87.6981\t30.270162\tGulf Shores city\tAL\tAlabama\tBaldwin County\t7052\t49.6\t30.4\t9.1\t26040\t222305\t0.2155\t36542\tRomney\t36542\t0.021785806\t36542.0\n7\t-87.756638\t30.626438\tLoxley town\tAL\tAlabama\tBaldwin County\t1944\t37.8\t11.7\t14.6\t16562\t113766\t0.2155\t36551\tRomney\t36551\t0.006005616\t36551.0\n8\t-87.681057\t30.399475\tFoley city\tAL\tAlabama\tBaldwin County\t10052\t41.3\t19.3\t9.5\t21844\t141691\t0.2155\t36535\tRomney\t36535\t0.031053732\t36535.0\n9\t-87.777106\t30.88075\tBay Minette city\tAL\tAlabama\tBaldwin County\t8689\t35.8\t17.6\t13.7\t17560\t99263\t0.2155\t36507\tRomney\t36507\t0.026843004\t36507.0\n10\t-87.923812\t30.675428999999998\tSpanish Fort city\tAL\tAlabama\tBaldwin County\t6463\t44.9\t43.0\t7.3\t33124\t234588\t0.2155\t365HH\tRomney\t365HH\t0.019966203000000002\t0.0\n11\t-87.749853\t30.545537\tSilverhill town\tAL\tAlabama\tBaldwin County\t730\t37.7\t18.4\t10.7\t20187\t131771\t0.2155\t36576\tRomney\t36576\t0.002255195\t36576.0\n12\t-87.892042\t30.629507\tDaphne city\tAL\tAlabama\tBaldwin County\t19303\t40.6\t41.2\t9.4\t29845\t186072\t0.2155\t36526\tRomney\t36526\t0.059632927999999995\t36526.0\n13\t-87.909695\t30.490309000000003\tPoint Clear CDP\tAL\tAlabama\tBaldwin County\t2427\t48.5\t42.3\t8.7\t35364\t262255\t0.2155\t36564\tRomney\t36564\t0.007497753\t36564.0\n14\t-87.697643\t30.481790999999998\tSummerdale town\tAL\tAlabama\tBaldwin County\t904\t35.3\t13.0\t11.7\t17931\t117733\t0.2155\t36580\tRomney\t36580\t0.002792735\t36580.0\n15\t-87.705828\t30.553251\tRobertsdale city\tAL\tAlabama\tBaldwin County\t5127\t35.5\t15.9\t12.5\t18868\t120496\t0.2155\t36576\tRomney\t36576\t0.015838886\t36576.0\n16\t-85.452597\t31.881273999999998\tClayton town\tAL\tAlabama\tBarbour County\t1483\t35.1\t11.9\t15.5\t15528\t69265\t0.5133\t36016\tRomney\t36016\t0.004581445\t36016.0\n17\t-85.558335\t31.781048\tLouisville town\tAL\tAlabama\tBarbour County\t586\t39.0\t13.5\t19.7\t14044\t68846\t0.5133\t36048\tRomney\t36048\t0.001810335\t36048.0\n18\t-85.61094399999999\t31.708565999999998\tClio town\tAL\tAlabama\tBarbour County\t2262\t36.5\t4.9\t14.2\t12498\t51795\t0.5133\t36017\tRomney\t36017\t0.006988016999999999\t36017.0\n19\t-85.503537\t31.663498999999998\tBlue Springs town\tAL\tAlabama\tBarbour County\t115\t45.0\t8.1\t12.8\t14464\t52500\t0.5133\t36017\tRomney\t36017\t0.000355271\t36017.0\n20\t-85.15055799999999\t31.910159999999998\tEufaula city\tAL\tAlabama\tBarbour County\t13539\t37.5\t18.2\t14.4\t17782\t97107\t0.5133\t36027\tRomney\t36027\t0.041826152000000005\t36027.0\n21\t-87.13314799999999\t32.959568\tCentreville city\tAL\tAlabama\tBibb County\t2863\t38.3\t13.3\t12.0\t17074\t93571\t0.2615\t35042\tRomney\t35042\t0.008844691\t35042.0\n22\t-87.175173\t32.942209000000005\tBrent city\tAL\tAlabama\tBibb County\t3615\t34.7\t8.9\t14.0\t14649\t80568\t0.2615\t35042\tRomney\t35042\t0.011167851000000001\t35042.0\n23\t-87.152775\t33.217284\tNorth Bibb town\tAL\tAlabama\tBibb County\t1040\t35.7\t9.9\t10.9\t18735\t103333\t0.2615\t35188\tRomney\t35188\t0.003212881\t35188.0\n24\t-87.1249\t33.118102\tWest Blocton town\tAL\tAlabama\tBibb County\t1387\t37.0\t5.1\t11.9\t18612\t74565\t0.2615\t35184\tRomney\t35184\t0.004284871\t35184.0\n25\t-86.503737\t33.988585\tRosa town\tAL\tAlabama\tBlount County\t346\t39.3\t9.9\t9.8\t19040\t101389\t0.1234\t35121\tRomney\t35121\t0.0010689010000000001\t35121.0\n26\t-86.389705\t34.116265999999996\tSnead town\tAL\tAlabama\tBlount County\t813\t38.0\t11.9\t11.7\t17454\t83696\t0.1234\t35980\tRomney\t35980\t0.002511608\t35980.0\n27\t-86.586764\t34.081410999999996\tBlountsville town\tAL\tAlabama\tBlount County\t1994\t38.6\t10.3\t13.3\t16581\t98981\t0.1234\t35031\tRomney\t35031\t0.006160082\t35031.0\n28\t-86.517845\t33.906383\tAllgood town\tAL\tAlabama\tBlount County\t720\t35.4\t5.8\t8.3\t18267\t99091\t0.1234\t35121\tRomney\t35121\t0.002224302\t35121.0\n29\t-86.823768\t33.878840999999994\tSmoke Rise CDP\tAL\tAlabama\tBlount County\t1976\t40.5\t14.5\t9.0\t22854\t152250\t0.1234\t35180\tRomney\t35180\t0.006104474\t35180.0\n30\t-86.629343\t33.901633000000004\tLocust Fork town\tAL\tAlabama\tBlount County\t1192\t38.8\t7.7\t11.2\t18686\t102778\t0.1234\t35097\tRomney\t35097\t0.0036824559999999998\t35097.0\n31\t-86.753028\t33.895539\tHayden town\tAL\tAlabama\tBlount County\t544\t37.0\t10.0\t14.5\t20899\t109000\t0.1234\t35079\tRomney\t35079\t0.001680584\t35079.0\n32\t-86.493539\t33.939633\tOneonta city\tAL\tAlabama\tBlount County\t6088\t41.2\t16.9\t6.6\t19441\t110846\t0.1234\t35121\tRomney\t35121\t0.018807712\t35121.0\n33\t-86.424412\t33.887555\tHighland Lake town\tAL\tAlabama\tBlount County\t466\t42.4\t16.4\t7.0\t19436\t124609\t0.1234\t35121\tRomney\t35121\t0.001439618\t35121.0\n34\t-86.430663\t34.079558\tSusan Moore town\tAL\tAlabama\tBlount County\t777\t38.5\t10.3\t11.6\t16718\t93077\t0.1234\t35031\tRomney\t35031\t0.002400393\t35031.0\n35\t-86.637259\t33.968296\tNectar town\tAL\tAlabama\tBlount County\t457\t38.7\t9.1\t9.5\t19315\t90000\t0.1234\t35049\tRomney\t35049\t0.001411814\t35049.0\n36\t-86.569588\t33.996512\tCleveland town\tAL\tAlabama\tBlount County\t1441\t38.1\t11.3\t14.3\t18234\t113934\t0.1234\t35049\tRomney\t35049\t0.004451694\t35049.0\n37\t-85.5205\t32.076334\tMidway town\tAL\tAlabama\tBullock County\t428\t39.0\t6.3\t13.8\t12963\t56818\t0.7631\t36053\tRomney\t36053\t0.0013222239999999999\t36053.0\n38\t-85.713972\t32.139559000000006\tUnion Springs city\tAL\tAlabama\tBullock County\t3530\t34.1\t9.2\t20.0\t12112\t73202\t0.7631\t36089\tRomney\t36089\t0.01090526\t36089.0\n39\t-86.713164\t31.545022999999997\tMcKenzie town\tAL\tAlabama\tButler County\t589\t45.8\t5.3\t10.5\t14767\t53800\t0.4603\t36456\tRomney\t36456\t0.001819603\t36456.0\n40\t-86.637722\t31.843453000000004\tGreenville city\tAL\tAlabama\tButler County\t6587\t39.9\t13.4\t20.6\t16201\t80951\t0.4603\t36037\tRomney\t36037\t0.020349277\t36037.0\n41\t-86.74664200000001\t31.639304\tGeorgiana town\tAL\tAlabama\tButler County\t1646\t41.8\t8.4\t20.6\t13385\t50000\t0.4603\t36033\tRomney\t36033\t0.005085002\t36033.0\n42\t-85.853718\t33.712092\tSaks CDP\tAL\tAlabama\tCalhoun County\t10252\t41.2\t15.1\t11.7\t20646\t96679\t0.3345\t36206\tRomney\t36206\t0.031671594\t36206.0\n43\t-85.958535\t33.607943\tBynum CDP\tAL\tAlabama\tCalhoun County\t1894\t40.2\t13.5\t10.5\t20653\t93807\t0.3345\t36260\tRomney\t36260\t0.005851151\t36260.0\n44\t-85.86093100000001\t33.614814\tHobson City town\tAL\tAlabama\tCalhoun County\t838\t44.2\t13.5\t13.8\t17859\t103226\t0.3345\t36203\tRomney\t36203\t0.002588841\t36203.0\n45\t-85.811635\t33.757068\tWeaver city\tAL\tAlabama\tCalhoun County\t2660\t40.0\t14.9\t10.2\t20524\t95821\t0.3345\t36277\tRomney\t36277\t0.008217561\t36277.0\n46\t-86.027748\t33.789211\tOhatchee town\tAL\tAlabama\tCalhoun County\t1268\t38.9\t12.4\t12.2\t17435\t89500\t0.3345\t36271\tRomney\t36271\t0.003917244\t36271.0\n47\t-85.874112\t33.652344\tWest End-Cobb Town CDP\tAL\tAlabama\tCalhoun County\t3614\t42.4\t4.5\t18.0\t14804\t61681\t0.3345\t36201\tRomney\t36201\t0.011164762\t36201.0\n48\t-85.81273900000001\t33.671673999999996\tAnniston city\tAL\tAlabama\tCalhoun County\t23189\t41.7\t21.0\t14.9\t21169\t100956\t0.3345\t36201\tRomney\t36201\t0.071637982\t36201.0\n49\t-85.838054\t33.688464\tBlue Mountain town\tAL\tAlabama\tCalhoun County\t228\t41.6\t4.3\t13.0\t18939\t68125\t0.3345\t36206\tRomney\t36206\t0.0007043619999999999\t36206.0\n50\t-85.617345\t33.961919\tPiedmont city\tAL\tAlabama\tCalhoun County\t4841\t41.9\t12.4\t12.6\t17369\t79541\t0.3345\t36272\tRomney\t36272\t0.014955343999999999\t36272.0\n51\t-85.832802\t33.602365\tOxford city\tAL\tAlabama\tCalhoun County\t15210\t40.6\t18.6\t11.1\t21174\t114668\t0.3345\t36203\tRomney\t36203\t0.046988387\t36203.0\n52\t-85.879041\t33.767494\tAlexandria CDP\tAL\tAlabama\tCalhoun County\t3903\t37.7\t18.4\t9.1\t20844\t120667\t0.3345\t36250\tRomney\t36250\t0.012057571999999999\t36250.0\n53\t-85.757537\t33.808886\tJacksonville city\tAL\tAlabama\tCalhoun County\t9289\t29.9\t31.6\t15.3\t19326\t115039\t0.3345\t36265\tRomney\t36265\t0.02869659\t36265.0\n54\t-85.40064699999999\t32.899756\tLa Fayette city\tAL\tAlabama\tChambers County\t3138\t40.7\t12.1\t20.0\t14258\t74500\t0.4697\t36862\tRomney\t36862\t0.009694251\t36862.0\n55\t-85.20427600000001\t32.865402\tLanett city\tAL\tAlabama\tChambers County\t7102\t39.1\t14.6\t23.0\t17363\t77885\t0.4697\t36863\tRomney\t36863\t0.021940271\t36863.0\n56\t-85.18118299999999\t32.815093\tValley city\tAL\tAlabama\tChambers County\t8807\t39.9\t10.0\t15.4\t18445\t74071\t0.4697\t36854\tRomney\t36854\t0.027207542999999997\t36854.0\n57\t-85.23925799999999\t32.840307\tHuguley CDP\tAL\tAlabama\tChambers County\t2743\t38.0\t6.3\t21.2\t18613\t70333\t0.4697\t36863\tRomney\t36863\t0.008473974\t36863.0\n58\t-85.35159300000001\t33.017312\tFive Points town\tAL\tAlabama\tChambers County\t152\t42.1\t15.1\t12.7\t15330\t76667\t0.4697\t36855\tRomney\t36855\t0.000469575\t36855.0\n59\t-85.775272\t34.183820000000004\tLeesburg town\tAL\tAlabama\tCherokee County\t791\t41.6\t9.1\t8.4\t17754\t85000\t0.2177\t35983\tRomney\t35983\t0.0024436429999999997\t35983.0\n60\t-85.777437\t34.263498999999996\tSand Rock town\tAL\tAlabama\tCherokee County\t522\t40.1\t8.0\t7.7\t17481\t82941\t0.2177\t35983\tRomney\t35983\t0.001612619\t35983.0\n61\t-85.669671\t34.154875\tCentre city\tAL\tAlabama\tCherokee County\t3358\t47.3\t18.6\t14.8\t19693\t105020\t0.2177\t35960\tRomney\t35960\t0.010373899\t35960.0\n62\t-85.558362\t34.268136\tGaylesville town\tAL\tAlabama\tCherokee County\t146\t40.5\t9.8\t6.3\t16285\t85000\t0.2177\t35959\tRomney\t35959\t0.00045103900000000003\t35959.0\n63\t-85.59206999999999\t34.219611\tCedar Bluff town\tAL\tAlabama\tCherokee County\t1515\t41.1\t12.2\t13.8\t18205\t92222\t0.2177\t35959\tRomney\t35959\t0.004680303\t35959.0\n64\t-86.718533\t32.917215\tThorsby town\tAL\tAlabama\tChilton County\t1925\t37.8\t11.7\t10.0\t16919\t100291\t0.1943\t35171\tRomney\t35171\t0.005946919\t35171.0\n65\t-86.878434\t32.786582\tMaplesville town\tAL\tAlabama\tChilton County\t736\t37.6\t11.8\t11.2\t17379\t85000\t0.1943\t36750\tRomney\t36750\t0.002273731\t36750.0\n66\t-86.622964\t32.841454\tClanton city\tAL\tAlabama\tChilton County\t8012\t39.8\t15.1\t12.3\t18882\t108489\t0.1943\t35045\tRomney\t35045\t0.024751542\t35045.0\n67\t-86.74329200000001\t32.965015\tJemison town\tAL\tAlabama\tChilton County\t2508\t37.5\t10.4\t11.8\t17250\t92766\t0.1943\t35085\tRomney\t35085\t0.007747987\t35085.0\n68\t-88.336587\t31.986977000000003\tNeedham town\tAL\tAlabama\tChoctaw County\t79\t40.0\t7.3\t20.0\t15568\t48750\t0.4747\t36915\tRomney\t36915\t0.000244055\t36915.0\n69\t-88.307963\t32.179142\tLisman town\tAL\tAlabama\tChoctaw County\t503\t38.3\t14.8\t20.7\t15134\t57778\t0.4747\t36912\tRomney\t36912\t0.0015539220000000001\t36912.0\n70\t-88.30936899999999\t31.910669\tToxey town\tAL\tAlabama\tChoctaw County\t129\t39.1\t8.1\t15.4\t17077\t50000\t0.4747\t36908\tRomney\t36908\t0.000398521\t36908.0\n71\t-88.32607\t31.767778000000003\tSilas town\tAL\tAlabama\tChoctaw County\t447\t38.1\t7.6\t15.3\t13802\t54615\t0.4747\t36919\tRomney\t36919\t0.001380921\t36919.0\n72\t-88.21405899999999\t32.095296999999995\tButler city\tAL\tAlabama\tChoctaw County\t1959\t43.1\t17.3\t12.0\t19696\t86163\t0.4747\t36904\tRomney\t36904\t0.006051956\t36904.0\n73\t-88.054624\t32.198831\tPennington town\tAL\tAlabama\tChoctaw County\t282\t40.1\t3.7\t27.6\t15047\t51111\t0.4747\t36916\tRomney\t36916\t0.000871185\t36916.0\n74\t-88.319286\t31.875769000000002\tGilbertown town\tAL\tAlabama\tChoctaw County\t169\t41.5\t10.2\t8.6\t21484\t67000\t0.4747\t36908\tRomney\t36908\t0.0005220930000000001\t36908.0\n75\t-87.890067\t31.532469\tJackson city\tAL\tAlabama\tClarke County\t5175\t39.4\t20.1\t20.4\t19669\t95000\t0.457\t36545\tRomney\t36545\t0.015987173\t36545.0\n76\t-87.740004\t31.791681\tFulton town\tAL\tAlabama\tClarke County\t284\t37.2\t6.6\t11.4\t16297\t61250\t0.457\t36446\tRomney\t36446\t0.0008773639999999999\t36446.0\n77\t-87.77591\t31.70327\tGrove Hill town\tAL\tAlabama\tClarke County\t1304\t40.4\t14.5\t21.8\t16398\t74545\t0.457\t36451\tRomney\t36451\t0.004028459\t36451.0\n78\t-87.74188000000001\t31.911203999999998\tThomasville city\tAL\tAlabama\tClarke County\t4619\t37.0\t18.8\t18.7\t17343\t87602\t0.457\t36784\tRomney\t36784\t0.014269516999999999\t36784.0\n79\t-88.08605899999999\t31.766559\tCoffeeville town\tAL\tAlabama\tClarke County\t331\t39.9\t5.5\t25.0\t14968\t60714\t0.457\t36524\tRomney\t36524\t0.001022561\t36524.0\n80\t-85.751131\t33.312253999999996\tLineville city\tAL\tAlabama\tClay County\t2352\t40.4\t11.0\t19.0\t16434\t86905\t0.2661\t36266\tRomney\t36266\t0.007266054\t36266.0\n81\t-85.83340600000001\t33.27022\tAshland city\tAL\tAlabama\tClay County\t1957\t43.0\t10.4\t16.8\t16439\t80500\t0.2661\t36251\tRomney\t36251\t0.006045777\t36251.0\n82\t-85.431178\t33.72958\tFruithurst city\tAL\tAlabama\tCleburne County\t272\t38.1\t4.9\t8.0\t16987\t68333\t0.1537\t36262\tRomney\t36262\t0.000840292\t36262.0\n83\t-85.509185\t33.706174\tEdwardsville town\tAL\tAlabama\tCleburne County\t209\t39.3\t7.1\t9.0\t17284\t86000\t0.1537\t36262\tRomney\t36262\t0.000645666\t36262.0\n84\t-85.584005\t33.646451\tHeflin city\tAL\tAlabama\tCleburne County\t3159\t42.1\t16.5\t11.4\t18479\t100360\t0.1537\t36264\tRomney\t36264\t0.009759127\t36264.0\n85\t-85.33906\t33.525844\tRanburne town\tAL\tAlabama\tCleburne County\t483\t40.2\t8.3\t9.4\t16499\t84375\t0.1537\t36273\tRomney\t36273\t0.001492136\t36273.0\n86\t-86.170472\t31.220079\tKinston town\tAL\tAlabama\tCoffee County\t568\t41.4\t12.9\t4.6\t16523\t71667\t0.2485\t36453\tRomney\t36453\t0.0017547270000000002\t36453.0\n87\t-85.784891\t31.343709000000004\tEnterprise city\tAL\tAlabama\tCoffee County\t24346\t38.0\t28.4\t8.2\t23404\t120549\t0.2485\t36330\tRomney\t36330\t0.075212313\t36330.0\n88\t-85.92283499999999\t31.378341\tNew Brockton town\tAL\tAlabama\tCoffee County\t1301\t44.5\t14.5\t8.8\t17838\t81951\t0.2485\t36351\tRomney\t36351\t0.004019191\t36351.0\n89\t-86.076497\t31.417465999999997\tElba city\tAL\tAlabama\tCoffee County\t4186\t40.6\t16.5\t12.6\t15703\t89044\t0.2485\t36323\tRomney\t36323\t0.012931847\t36323.0\n90\t-87.700823\t34.755943\tSheffield city\tAL\tAlabama\tColbert County\t9186\t41.4\t19.4\t14.8\t18638\t87755\t0.391\t35660\tRomney\t35660\t0.028378391\t35660.0\n91\t-87.96691\t34.75744\tCherokee town\tAL\tAlabama\tColbert County\t1171\t41.0\t9.5\t11.2\t19242\t75132\t0.391\t35616\tRomney\t35616\t0.003617581\t35616.0\n92\t-87.641739\t34.747601\tMuscle Shoals city\tAL\tAlabama\tColbert County\t12662\t40.4\t21.1\t9.2\t22755\t118517\t0.391\t35661\tRomney\t35661\t0.039116828\t35661.0\n93\t-87.672258\t34.595202\tLittleville town\tAL\tAlabama\tColbert County\t965\t39.9\t10.6\t10.8\t17460\t83571\t0.391\t35654\tRomney\t35654\t0.002981183\t35654.0\n94\t-87.705365\t34.725458\tTuscumbia city\tAL\tAlabama\tColbert County\t7872\t44.5\t16.4\t10.4\t20726\t95761\t0.391\t35674\tRomney\t35674\t0.024319039\t35674.0\n95\t-87.529045\t34.698614\tLeighton town\tAL\tAlabama\tColbert County\t806\t42.3\t10.1\t11.9\t16145\t71071\t0.391\t35646\tRomney\t35646\t0.002489983\t35646.0\n96\t-87.026915\t31.300145\tCastleberry town\tAL\tAlabama\tConecuh County\t550\t41.5\t6.3\t17.6\t12899\t65938\t0.506\t36432\tRomney\t36432\t0.00169912\t36432.0\n97\t-86.956981\t31.438491\tEvergreen city\tAL\tAlabama\tConecuh County\t3611\t39.5\t16.2\t19.6\t15705\t76037\t0.506\t36401\tRomney\t36401\t0.011155493999999998\t36401.0\n98\t-87.240521\t31.408315999999996\tRepton town\tAL\tAlabama\tConecuh County\t256\t39.7\t13.0\t19.6\t15807\t72500\t0.506\t36475\tRomney\t36475\t0.000790863\t36475.0\n99\t-86.21508\t32.889578\tRockford town\tAL\tAlabama\tCoosa County\t457\t41.8\t11.8\t8.8\t17064\t74000\t0.4148\t35136\tRomney\t35136\t0.001411814\t35136.0\n100\t-86.051606\t33.060704\tGoodwater city\tAL\tAlabama\tCoosa County\t1527\t40.0\t6.7\t17.3\t13854\t54804\t0.4148\t35072\tRomney\t35072\t0.004717375\t35072.0\n101\t-86.467341\t31.357957\tHeath town\tAL\tAlabama\tCovington County\t241\t44.1\t25.7\t9.6\t24136\t98333\t0.2045\t36420\tRomney\t36420\t0.0007445230000000001\t36420.0\n102\t-86.522707\t31.233802\tCarolina town\tAL\tAlabama\tCovington County\t204\t42.5\t9.0\t5.6\t15384\t79167\t0.2045\t36420\tRomney\t36420\t0.000630219\t36420.0\n103\t-86.48019000000001\t31.309263\tAndalusia city\tAL\tAlabama\tCovington County\t8884\t41.8\t19.9\t11.1\t19166\t81593\t0.2045\t36420\tRomney\t36420\t0.02744542\t36420.0\n104\t-86.460072\t31.242829999999998\tLibertyville town\tAL\tAlabama\tCovington County\t97\t42.5\t26.1\t9.8\t20291\t80000\t0.2045\t36420\tRomney\t36420\t0.000299663\t36420.0\n105\t-86.54119200000001\t31.35244\tRiver Falls town\tAL\tAlabama\tCovington County\t577\t40.6\t9.7\t9.2\t14979\t73235\t0.2045\t36476\tRomney\t36476\t0.001782531\t36476.0\n106\t-86.25537\t31.290549\tOpp city\tAL\tAlabama\tCovington County\t6145\t43.0\t16.1\t10.9\t18603\t74833\t0.2045\t36467\tRomney\t36467\t0.018983803\t36467.0\n107\t-86.350503\t31.012765\tLockhart town\tAL\tAlabama\tCovington County\t521\t47.7\t6.6\t13.0\t12740\t55000\t0.2045\t36455\tRomney\t36455\t0.00160953\t36455.0\n108\t-86.32203299999999\t31.237436\tHorn Hill town\tAL\tAlabama\tCovington County\t224\t42.7\t8.2\t10.9\t16879\t80833\t0.2045\t36467\tRomney\t36467\t0.000692005\t36467.0\n109\t-86.32291\t31.302198999999998\tBabbie town\tAL\tAlabama\tCovington County\t595\t42.9\t4.6\t11.1\t15144\t63125\t0.2045\t36467\tRomney\t36467\t0.001838139\t36467.0\n110\t-86.27845699999999\t31.224562\tOnycha town\tAL\tAlabama\tCovington County\t200\t40.9\t6.5\t11.1\t16186\t80000\t0.2045\t36467\tRomney\t36467\t0.000617862\t36467.0\n111\t-86.396672\t31.300538\tSanford town\tAL\tAlabama\tCovington County\t264\t41.9\t17.2\t10.0\t18969\t86429\t0.2045\t36420\tRomney\t36420\t0.0008155780000000001\t36420.0\n112\t-86.484139\t31.409232\tGantt town\tAL\tAlabama\tCovington County\t232\t45.8\t11.6\t6.7\t17668\t67857\t0.2045\t36476\tRomney\t36476\t0.00071672\t36476.0\n113\t-86.31356099999999\t31.017702000000003\tFlorala city\tAL\tAlabama\tCovington County\t1847\t43.6\t9.3\t15.0\t13988\t57459\t0.2045\t36455\tRomney\t36455\t0.005705953000000001\t36455.0\n114\t-86.60838299999999\t31.405533000000002\tRed Level town\tAL\tAlabama\tCovington County\t523\t38.5\t8.2\t13.3\t14605\t56905\t0.2045\t36474\tRomney\t36474\t0.001615709\t36474.0\n115\t-86.256918\t31.582251\tBrantley town\tAL\tAlabama\tCrenshaw County\t910\t43.6\t10.6\t9.4\t15049\t67857\t0.3191\t36009\tRomney\t36009\t0.0028112709999999997\t36009.0\n116\t-86.205698\t31.849444000000002\tPetrey town\tAL\tAlabama\tCrenshaw County\t60\t39.4\t9.5\t14.8\t13798\t70000\t0.3191\t36035\tRomney\t36035\t0.000185359\t36035.0\n117\t-86.308042\t31.733362\tRutledge town\tAL\tAlabama\tCrenshaw County\t454\t41.4\t12.0\t9.8\t15453\t78846\t0.3191\t36049\tRomney\t36049\t0.001402546\t36049.0\n118\t-86.173004\t31.667615\tGlenwood town\tAL\tAlabama\tCrenshaw County\t182\t44.4\t26.2\t7.4\t22625\t73333\t0.3191\t36034\tRomney\t36034\t0.000562254\t36034.0\n119\t-86.265558\t31.707798999999998\tLuverne city\tAL\tAlabama\tCrenshaw County\t2530\t43.5\t20.5\t9.5\t17348\t88000\t0.3191\t36049\tRomney\t36049\t0.007815951\t36049.0\n120\t-86.369398\t31.503121999999998\tDozier town\tAL\tAlabama\tCrenshaw County\t426\t42.2\t10.2\t9.9\t14258\t69500\t0.3191\t36028\tRomney\t36028\t0.001316046\t36028.0\n121\t-86.863158\t34.236003000000004\tSouth Vinemont town\tAL\tAlabama\tCullman County\t431\t44.7\t17.3\t7.2\t21824\t120000\t0.1462\t35179\tRomney\t35179\t0.001331492\t35179.0\n122\t-86.748427\t34.016662\tGarden City town\tAL\tAlabama\tCullman County\t593\t42.7\t7.7\t8.8\t16004\t80714\t0.1462\t35070\tRomney\t35070\t0.00183196\t35070.0\n123\t-86.948091\t34.238476\tWest Point town\tAL\tAlabama\tCullman County\t313\t39.2\t15.1\t9.7\t19894\t113462\t0.1462\t35179\tRomney\t35179\t0.0009669539999999999\t35179.0\n124\t-86.90158199999999\t33.94502\tColony town\tAL\tAlabama\tCullman County\t400\t38.6\t6.0\t10.4\t15661\t82143\t0.1462\t35033\tRomney\t35033\t0.001235724\t35033.0\n125\t-86.88509499999999\t34.044849\tDodge City town\tAL\tAlabama\tCullman County\t648\t40.2\t12.9\t11.2\t19830\t104779\t0.1462\t35077\tRomney\t35077\t0.002001872\t35077.0\n126\t-86.608225\t34.260887\tBaileyton town\tAL\tAlabama\tCullman County\t739\t38.0\t15.5\t9.5\t16352\t87941\t0.1462\t35019\tRomney\t35019\t0.002282999\t35019.0\n127\t-86.839911\t34.178034999999994\tCullman city\tAL\tAlabama\tCullman County\t14227\t42.2\t22.3\t9.8\t20335\t126274\t0.1462\t35055\tRomney\t35055\t0.043951597\t35055.0\n128\t-86.864839\t34.111117\tGood Hope town\tAL\tAlabama\tCullman County\t2128\t38.2\t14.8\t9.3\t18255\t100633\t0.1462\t35057\tRomney\t35057\t0.006574049\t35057.0\n129\t-86.683487\t34.247134\tFairview town\tAL\tAlabama\tCullman County\t527\t37.3\t12.7\t7.1\t17140\t98000\t0.1462\t35019\tRomney\t35019\t0.001628066\t35019.0\n130\t-86.763697\t34.063543\tHanceville city\tAL\tAlabama\tCullman County\t3170\t40.8\t8.7\t12.9\t17709\t91563\t0.1462\t35077\tRomney\t35077\t0.009793109\t35077.0\n131\t-86.614653\t34.172298\tHolly Pond town\tAL\tAlabama\tCullman County\t668\t37.1\t10.1\t9.8\t16159\t108929\t0.1462\t35083\tRomney\t35083\t0.002063658\t35083.0\n132\t-85.493429\t31.315604999999998\tMidland City town\tAL\tAlabama\tDale County\t1692\t36.2\t8.3\t10.3\t15885\t77979\t0.2842\t36350\tRomney\t36350\t0.0052271109999999996\t36350.0\n133\t-85.715429\t31.342812\tFort Rucker CDP\tAL\tAlabama\tDale County\t5990\t24.1\t29.5\t16.2\t12379\t120833\t0.2842\t36362\tRomney\t36362\t0.01850496\t36362.0\n134\t-85.543048\t31.31727\tPinckard town\tAL\tAlabama\tDale County\t634\t43.4\t9.9\t9.7\t18127\t75208\t0.2842\t36371\tRomney\t36371\t0.001958622\t36371.0\n135\t-85.454725\t31.314882\tNapier Field town\tAL\tAlabama\tDale County\t373\t39.9\t8.0\t12.3\t19021\t64286\t0.2842\t36350\tRomney\t36350\t0.001152312\t36350.0\n136\t-85.647992\t31.450246999999997\tOzark city\tAL\tAlabama\tDale County\t14693\t41.0\t15.3\t14.7\t18544\t94693\t0.2842\t36360\tRomney\t36360\t0.045391215\t36360.0\n137\t-85.724735\t31.243558\tClayhatchee town\tAL\tAlabama\tDale County\t569\t40.4\t10.7\t11.2\t17689\t80000\t0.2842\t36322\tRomney\t36322\t0.001757817\t36322.0\n138\t-85.450415\t31.300033000000003\tGrimes town\tAL\tAlabama\tDale County\t422\t34.0\t8.0\t11.1\t17126\t54091\t0.2842\t36350\tRomney\t36350\t0.0013036880000000001\t36350.0\n139\t-85.589247\t31.342463000000002\tNewton town\tAL\tAlabama\tDale County\t1585\t41.1\t13.6\t9.9\t19223\t74796\t0.2842\t36371\tRomney\t36371\t0.004896554\t36371.0\n140\t-85.73390699999999\t31.289699\tDaleville city\tAL\tAlabama\tDale County\t4477\t36.8\t14.9\t15.4\t20432\t87944\t0.2842\t36322\tRomney\t36322\t0.013830836\t36322.0\n141\t-85.767896\t31.30735\tLevel Plains town\tAL\tAlabama\tDale County\t1313\t38.9\t16.9\t11.9\t20378\t83478\t0.2842\t36322\tRomney\t36322\t0.004056262\t36322.0\n142\t-85.712897\t31.598029999999998\tAriton town\tAL\tAlabama\tDale County\t728\t39.7\t11.0\t12.1\t13633\t67059\t0.2842\t36311\tRomney\t36311\t0.0022490170000000003\t36311.0\n143\t-87.245474\t32.306763000000004\tOrrville town\tAL\tAlabama\tDallas County\t196\t39.3\t9.2\t19.6\t12146\t64167\t0.6970000000000001\t36767\tRomney\t36767\t0.000605505\t36767.0\n144\t-87.007362\t32.378448999999996\tSelmont-West Selmont CDP\tAL\tAlabama\tDallas County\t3139\t29.0\t4.7\t31.9\t9197\t42246\t0.6970000000000001\t36703\tRomney\t36703\t0.00969734\t36703.0\n145\t-87.033461\t32.416428\tSelma city\tAL\tAlabama\tDallas County\t18698\t37.7\t21.2\t23.2\t15740\t80924\t0.6970000000000001\t36701\tRomney\t36701\t0.057763895999999995\t36701.0\n146\t-85.875073\t34.4608\tShiloh town\tAL\tAlabama\tDeKalb County\t317\t40.6\t10.8\t11.2\t20033\t100735\t0.2187\t35971\tRomney\t35971\t0.000979311\t35971.0\n147\t-85.838708\t34.267593\tCollinsville town\tAL\tAlabama\tDeKalb County\t1743\t37.7\t8.3\t15.5\t14383\t69063\t0.2187\t35961\tRomney\t35961\t0.005384665\t35961.0\n148\t-85.898087\t34.532488\tPowell town\tAL\tAlabama\tDeKalb County\t982\t39.0\t11.9\t20.3\t16137\t78864\t0.2187\t35986\tRomney\t35986\t0.0030337009999999998\t35986.0\n149\t-85.669034\t34.702152000000005\tIder town\tAL\tAlabama\tDeKalb County\t727\t41.4\t10.7\t15.3\t17299\t82391\t0.2187\t35981\tRomney\t35981\t0.002245928\t35981.0\n150\t-85.986391\t34.383722\tLakeview town\tAL\tAlabama\tDeKalb County\t172\t39.1\t5.9\t15.9\t17136\t83000\t0.2187\t35974\tRomney\t35974\t0.0005313609999999999\t35974.0\n151\t-85.584061\t34.566245\tMentone town\tAL\tAlabama\tDeKalb County\t513\t43.2\t16.8\t9.7\t18357\t87500\t0.2187\t35984\tRomney\t35984\t0.001584815\t35984.0\n152\t-85.62133399999999\t34.557421000000005\tValley Head town\tAL\tAlabama\tDeKalb County\t690\t38.6\t10.7\t11.5\t16710\t80667\t0.2187\t35989\tRomney\t35989\t0.002131623\t35989.0\n153\t-85.83212900000001\t34.566927\tSylvania town\tAL\tAlabama\tDeKalb County\t1310\t38.4\t8.9\t13.5\t16181\t83750\t0.2187\t35988\tRomney\t35988\t0.004046995\t35988.0\n154\t-85.78093100000001\t34.448417\tPine Ridge town\tAL\tAlabama\tDeKalb County\t263\t39.2\t11.9\t18.3\t16693\t82857\t0.2187\t35968\tRomney\t35968\t0.000812488\t35968.0\n155\t-85.993504\t34.286784999999995\tCrossville town\tAL\tAlabama\tDeKalb County\t1495\t38.8\t10.8\t14.7\t16424\t100223\t0.2187\t35962\tRomney\t35962\t0.004618517\t35962.0\n156\t-85.69704200000001\t34.455261\tFort Payne city\tAL\tAlabama\tDeKalb County\t13314\t38.5\t15.1\t11.8\t20222\t97322\t0.2187\t35967\tRomney\t35967\t0.041131058\t35967.0\n157\t-85.639645\t34.568690999999994\tHammondville town\tAL\tAlabama\tDeKalb County\t535\t38.6\t13.3\t10.6\t19785\t94500\t0.2187\t35989\tRomney\t35989\t0.00165278\t35989.0\n158\t-86.003723\t34.357717\tGeraldine town\tAL\tAlabama\tDeKalb County\t835\t39.7\t10.8\t13.4\t16678\t97037\t0.2187\t35974\tRomney\t35974\t0.002579573\t35974.0\n159\t-85.90498000000001\t34.449584\tFyffe town\tAL\tAlabama\tDeKalb County\t1042\t39.3\t7.1\t15.0\t16901\t79063\t0.2187\t35971\tRomney\t35971\t0.00321906\t35971.0\n160\t-85.84436600000001\t34.494175\tRainsville city\tAL\tAlabama\tDeKalb County\t5057\t40.7\t10.3\t13.9\t18217\t97517\t0.2187\t35986\tRomney\t35986\t0.015622635\t35986.0\n161\t-85.739579\t34.631422\tHenagar town\tAL\tAlabama\tDeKalb County\t2491\t38.1\t6.7\t11.7\t17783\t86667\t0.2187\t35978\tRomney\t35978\t0.0076954680000000004\t35978.0\n162\t-86.37028000000001\t32.501329999999996\tMillbrook city\tAL\tAlabama\tElmore County\t14074\t33.2\t21.9\t10.3\t20731\t125911\t0.2519\t36054\tRomney\t36054\t0.043478932000000005\t36054.0\n163\t-86.187033\t32.498839000000004\tBlue Ridge CDP\tAL\tAlabama\tElmore County\t1592\t49.7\t36.9\t8.4\t38094\t209524\t0.2519\t36093\tRomney\t36093\t0.00491818\t36093.0\n164\t-85.871988\t32.54534\tTallassee city\tAL\tAlabama\tElmore County\t4988\t39.7\t13.5\t13.5\t18872\t85433\t0.2519\t36078\tRomney\t36078\t0.015409471999999999\t36078.0\n165\t-86.316191\t32.541824\tElmore town\tAL\tAlabama\tElmore County\t323\t32.0\t14.6\t11.5\t19665\t123750\t0.2519\t36025\tRomney\t36025\t0.000997847\t36025.0\n166\t-86.034143\t32.635146\tEclectic town\tAL\tAlabama\tElmore County\t1140\t37.3\t14.0\t12.7\t18162\t101761\t0.2519\t36024\tRomney\t36024\t0.003521812\t36024.0\n167\t-86.32784699999999\t32.497965\tCoosada town\tAL\tAlabama\tElmore County\t1597\t35.4\t13.1\t13.6\t16104\t89219\t0.2519\t36020\tRomney\t36020\t0.004933626\t36020.0\n168\t-86.392114\t32.586913\tDeatsville town\tAL\tAlabama\tElmore County\t728\t34.7\t18.8\t9.7\t22502\t132432\t0.2519\t36022\tRomney\t36022\t0.0022490170000000003\t36022.0\n169\t-86.20376800000001\t32.54528\tWetumpka city\tAL\tAlabama\tElmore County\t6675\t37.7\t16.8\t12.2\t19340\t106680\t0.2519\t36092\tRomney\t36092\t0.020621136\t36092.0\n170\t-87.055966\t31.090421000000003\tEast Brewton city\tAL\tAlabama\tEscambia County\t2338\t38.6\t9.9\t15.9\t14842\t67900\t0.3685\t36426\tRomney\t36426\t0.007222804\t36426.0\n171\t-87.05754\t31.058138\tRiverview town\tAL\tAlabama\tEscambia County\t92\t39.7\t6.3\t10.8\t18422\t66250\t0.3685\t36426\tRomney\t36426\t0.000284216\t36426.0\n172\t-87.074618\t31.117808\tBrewton city\tAL\tAlabama\tEscambia County\t5169\t43.7\t23.9\t13.0\t21130\t98611\t0.3685\t36426\tRomney\t36426\t0.015968637\t36426.0\n173\t-87.173611\t31.023534\tPollard town\tAL\tAlabama\tEscambia County\t116\t40.0\t8.6\t15.4\t19139\t76250\t0.3685\t36441\tRomney\t36441\t0.00035836\t36441.0\n174\t-87.254336\t31.013090000000002\tFlomaton town\tAL\tAlabama\tEscambia County\t1573\t38.8\t10.1\t14.4\t16988\t68810\t0.3685\t36441\tRomney\t36441\t0.0048594829999999995\t36441.0\n175\t-87.496588\t31.021626\tAtmore city\tAL\tAlabama\tEscambia County\t7160\t38.7\t14.6\t15.4\t15978\t77021\t0.3685\t36502\tRomney\t36502\t0.022119451000000002\t36502.0\n176\t-85.981445\t33.902102\tSouthside city\tAL\tAlabama\tEtowah County\t8156\t41.7\t23.3\t7.7\t26792\t134752\t0.3004\t35907\tRomney\t35907\t0.025196403\t35907.0\n177\t-86.113962\t33.933310999999996\tRainbow City\tAL\tAlabama\tEtowah County\t9139\t40.5\t28.1\t10.7\t24541\t138912\t0.3004\t35906\tRomney\t35906\t0.028233192999999997\t35906.0\n178\t-86.10390699999999\t34.057161\tRidgeville town\tAL\tAlabama\tEtowah County\t158\t42.5\t5.4\t7.0\t17112\t70000\t0.3004\t35954\tRomney\t35954\t0.000488111\t35954.0\n179\t-85.916229\t33.945392\tGlencoe city\tAL\tAlabama\tEtowah County\t5284\t44.5\t18.1\t10.0\t21339\t108078\t0.3004\t35905\tRomney\t35905\t0.016323908\t35905.0\n180\t-86.119213\t34.006368\tAttalla city\tAL\tAlabama\tEtowah County\t6359\t39.6\t8.2\t11.3\t17641\t66101\t0.3004\t35954\tRomney\t35954\t0.019644915\t35954.0\n181\t-86.286284\t34.064112\tWalnut Grove town\tAL\tAlabama\tEtowah County\t760\t37.3\t8.5\t13.1\t16132\t79063\t0.3004\t35990\tRomney\t35990\t0.002347875\t35990.0\n182\t-86.13552299999999\t34.154292\tMountainboro town\tAL\tAlabama\tEtowah County\t356\t42.6\t10.6\t13.2\t17101\t93750\t0.3004\t35956\tRomney\t35956\t0.0010997939999999999\t35956.0\n183\t-86.311385\t34.033465\tAltoona town\tAL\tAlabama\tEtowah County\t1068\t39.2\t7.6\t12.4\t15422\t68333\t0.3004\t35952\tRomney\t35952\t0.003299382\t35952.0\n184\t-85.864285\t33.990598999999996\tHokes Bluff city\tAL\tAlabama\tEtowah County\t4298\t43.1\t10.4\t11.9\t20246\t106341\t0.3004\t35903\tRomney\t35903\t0.013277849\t35903.0\n185\t-86.01483\t34.010071999999994\tGadsden city\tAL\tAlabama\tEtowah County\t36889\t40.2\t15.7\t15.5\t17671\t67463\t0.3004\t35901\tRomney\t35901\t0.11396151300000001\t35901.0\n186\t-86.032764\t34.074171\tReece City town\tAL\tAlabama\tEtowah County\t631\t42.4\t9.3\t9.5\t15973\t88889\t0.3004\t35904\tRomney\t35904\t0.001949354\t35904.0\n187\t-86.114594\t34.175377000000005\tSardis City town\tAL\tAlabama\tEtowah County\t1467\t40.7\t12.3\t11.7\t19167\t101054\t0.3004\t35956\tRomney\t35956\t0.004532016\t35956.0\n188\t-87.92825\t33.651826\tBelk town\tAL\tAlabama\tFayette County\t204\t36.9\t11.9\t12.2\t15958\t80000\t0.2283\t35545\tRomney\t35545\t0.000630219\t35545.0\n189\t-87.74361\t33.922235\tGlen Allen town\tAL\tAlabama\tFayette County\t463\t38.9\t8.6\t17.3\t15697\t75789\t0.2283\t35559\tRomney\t35559\t0.00143035\t35559.0\n190\t-87.83073\t33.694292\tFayette city\tAL\tAlabama\tFayette County\t4431\t44.1\t17.6\t15.7\t18479\t88633\t0.2283\t35555\tRomney\t35555\t0.013688727\t35555.0\n191\t-87.608737\t33.662933\tBerry town\tAL\tAlabama\tFayette County\t1241\t37.7\t8.7\t16.5\t12857\t56579\t0.2283\t35546\tRomney\t35546\t0.003833832\t35546.0\n192\t-87.928512\t34.327959\tHodges town\tAL\tAlabama\tFranklin County\t248\t40.4\t0.6\t13.3\t18240\t65000\t0.2914\t35571\tRomney\t35571\t0.0007661489999999999\t35571.0\n193\t-87.72874399999999\t34.506074\tRussellville city\tAL\tAlabama\tFranklin County\t8793\t38.9\t14.8\t11.9\t16161\t89362\t0.2914\t35653\tRomney\t35653\t0.027164293\t35653.0\n194\t-87.706198\t34.351978\tPhil Campbell town\tAL\tAlabama\tFranklin County\t1066\t42.3\t12.2\t12.5\t17138\t76333\t0.2914\t35581\tRomney\t35581\t0.0032932029999999998\t35581.0\n195\t-88.05619399999999\t34.374437\tVina town\tAL\tAlabama\tFranklin County\t396\t38.0\t6.2\t21.3\t15221\t63462\t0.2914\t35593\tRomney\t35593\t0.001223366\t35593.0\n196\t-88.13521899999999\t34.436992\tRed Bay city\tAL\tAlabama\tFranklin County\t3418\t42.0\t9.7\t9.9\t17981\t82440\t0.2914\t35582\tRomney\t35582\t0.010559258\t35582.0\n197\t-85.691509\t31.105567999999998\tHartford city\tAL\tAlabama\tGeneva County\t2319\t46.4\t11.7\t18.8\t17009\t82614\t0.1799\t36344\tRomney\t36344\t0.007164106999999999\t36344.0\n198\t-86.04634399999999\t31.112383\tSamson city\tAL\tAlabama\tGeneva County\t1942\t41.2\t8.5\t13.9\t13150\t63723\t0.1799\t36477\tRomney\t36477\t0.005999438\t36477.0\n199\t-85.878065\t31.041560999999998\tGeneva city\tAL\tAlabama\tGeneva County\t4153\t43.6\t10.1\t13.1\t16880\t75267\t0.1799\t36340\tRomney\t36340\t0.0128299\t36340.0\n200\t-85.595376\t31.1103\tSlocomb city\tAL\tAlabama\tGeneva County\t2068\t41.8\t9.3\t9.5\t17583\t80987\t0.1799\t36375\tRomney\t36375\t0.006388691\t36375.0\n201\t-85.52094699999999\t31.142867\tMalvern town\tAL\tAlabama\tGeneva County\t1423\t39.6\t10.5\t10.1\t18655\t91038\t0.1799\t36375\tRomney\t36375\t0.004396086\t36375.0\n202\t-85.910314\t31.166403000000003\tCoffee Springs town\tAL\tAlabama\tGeneva County\t234\t46.5\t12.0\t10.2\t16784\t83333\t0.1799\t36318\tRomney\t36318\t0.000722898\t36318.0\n203\t-85.844094\t31.036061\tEunola town\tAL\tAlabama\tGeneva County\t175\t41.7\t9.7\t7.6\t18815\t82143\t0.1799\t36340\tRomney\t36340\t0.000540629\t36340.0\n204\t-85.742791\t31.010246999999996\tBlack town\tAL\tAlabama\tGeneva County\t195\t42.3\t10.1\t6.9\t18698\t80714\t0.1799\t36314\tRomney\t36314\t0.000602415\t36314.0\n205\t-88.026478\t32.76981\tBoligee town\tAL\tAlabama\tGreene County\t332\t30.7\t13.5\t30.3\t11524\t56471\t0.8462\t35443\tRomney\t35443\t0.001025651\t35443.0\n206\t-87.904522\t32.999336\tUnion town\tAL\tAlabama\tGreene County\t204\t44.0\t10.3\t17.2\t16033\t51667\t0.8462\t35462\tRomney\t35462\t0.000630219\t35462.0\n207\t-87.89224399999999\t32.841138\tEutaw city\tAL\tAlabama\tGreene County\t1828\t39.4\t18.2\t17.6\t14290\t83333\t0.8462\t35462\tRomney\t35462\t0.005647256999999999\t35462.0\n208\t-87.86717800000001\t32.648941\tForkland town\tAL\tAlabama\tGreene County\t600\t38.1\t7.3\t23.1\t14549\t62813\t0.8462\t36740\tRomney\t36740\t0.001853585\t36740.0\n209\t-87.738739\t32.876308\tAkron town\tAL\tAlabama\tHale County\t558\t37.8\t9.0\t11.2\t13065\t54423\t0.6258\t35441\tRomney\t35441\t0.001723834\t35441.0\n210\t-87.595221\t32.701462\tGreensboro city\tAL\tAlabama\tHale County\t2636\t34.9\t14.7\t17.8\t14629\t68448\t0.6258\t36744\tRomney\t36744\t0.008143418000000001\t36744.0\n211\t-87.533226\t32.591887\tNewbern town\tAL\tAlabama\tHale County\t241\t33.5\t1.4\t16.5\t10841\t76500\t0.6258\t36765\tRomney\t36765\t0.0007445230000000001\t36765.0\n212\t-87.62841\t33.008537\tMoundville town\tAL\tAlabama\tHale County\t1814\t40.3\t11.3\t13.6\t17191\t93396\t0.6258\t35474\tRomney\t35474\t0.005604006\t35474.0\n213\t-85.252978\t31.566616999999997\tAbbeville city\tAL\tAlabama\tHenry County\t2841\t41.8\t15.8\t11.5\t16466\t79130\t0.3517\t36310\tRomney\t36310\t0.008776726\t36310.0\n214\t-85.13806\t31.409969\tHaleburg town\tAL\tAlabama\tHenry County\t120\t44.1\t17.4\t12.5\t19508\t80000\t0.3517\t36319\tRomney\t36319\t0.00037071699999999995\t36319.0\n215\t-85.34230500000001\t31.352304999999998\tHeadland city\tAL\tAlabama\tHenry County\t4078\t39.5\t20.7\t7.8\t19610\t104435\t0.3517\t36345\tRomney\t36345\t0.012598201000000002\t36345.0\n216\t-85.336665\t31.420569\tNewville town\tAL\tAlabama\tHenry County\t470\t40.5\t14.3\t13.1\t16222\t73846\t0.3517\t36353\tRomney\t36353\t0.001451975\t36353.0\n217\t-85.093602\t31.143964\tGordon town\tAL\tAlabama\tHouston County\t472\t41.7\t8.4\t19.5\t14849\t67500\t0.2946\t36370\tRomney\t36370\t0.001458154\t36370.0\n218\t-85.39784\t31.035769000000002\tMadrid town\tAL\tAlabama\tHouston County\t333\t37.9\t7.1\t7.4\t17385\t89167\t0.2946\t36320\tRomney\t36320\t0.00102874\t36320.0\n219\t-85.278025\t31.180335999999997\tAvon town\tAL\tAlabama\tHouston County\t514\t41.9\t12.0\t10.0\t18051\t94167\t0.2946\t36312\tRomney\t36312\t0.001587905\t36312.0\n220\t-85.400679\t31.319088\tDothan city\tAL\tAlabama\tHouston County\t64649\t38.7\t25.7\t11.5\t22783\t122815\t0.2946\t36303\tRomney\t36303\t0.19972072600000002\t36303.0\n221\t-85.306072\t31.203819\tCowarts town\tAL\tAlabama\tHouston County\t1761\t40.6\t9.1\t8.5\t17331\t85085\t0.2946\t36376\tRomney\t36376\t0.005440273000000001\t36376.0\n222\t-85.299929\t31.055279\tCottonwood town\tAL\tAlabama\tHouston County\t1330\t39.9\t10.2\t10.1\t15651\t84531\t0.2946\t36320\tRomney\t36320\t0.004108781\t36320.0\n223\t-85.46816700000001\t31.180057\tTaylor town\tAL\tAlabama\tHouston County\t2368\t35.9\t15.9\t8.3\t18617\t98991\t0.2946\t36305\tRomney\t36305\t0.007315483\t36305.0\n224\t-85.11030799999999\t31.296774\tColumbia town\tAL\tAlabama\tHouston County\t1001\t44.5\t9.5\t11.8\t16931\t59512\t0.2946\t36319\tRomney\t36319\t0.0030923979999999997\t36319.0\n225\t-85.335628\t31.292733000000002\tKinsey town\tAL\tAlabama\tHouston County\t2080\t33.6\t10.4\t13.0\t15970\t83636\t0.2946\t36376\tRomney\t36376\t0.006425762\t36376.0\n226\t-85.43975400000001\t31.122135999999998\tRehobeth town\tAL\tAlabama\tHouston County\t1145\t37.5\t15.1\t8.3\t18897\t106855\t0.2946\t36301\tRomney\t36301\t0.003537259\t36301.0\n227\t-85.235897\t31.185488\tAshford city\tAL\tAlabama\tHouston County\t2075\t42.4\t13.7\t11.4\t17356\t93750\t0.2946\t36312\tRomney\t36312\t0.006410316\t36312.0\n228\t-85.289663\t31.257943\tWebb town\tAL\tAlabama\tHouston County\t1295\t38.2\t9.2\t10.6\t15866\t76444\t0.2946\t36376\tRomney\t36376\t0.004000655\t36376.0\n229\t-85.964995\t34.718975\tHollywood town\tAL\tAlabama\tJackson County\t932\t39.1\t10.5\t12.7\t18739\t74250\t0.2822\t35752\tRomney\t35752\t0.002879236\t35752.0\n230\t-85.984928\t34.581720000000004\tSection town\tAL\tAlabama\tJackson County\t797\t40.0\t9.5\t10.0\t18416\t84762\t0.2822\t35771\tRomney\t35771\t0.002462179\t35771.0\n231\t-86.089802\t34.537447\tLangston town\tAL\tAlabama\tJackson County\t277\t41.5\t12.6\t9.9\t20231\t78333\t0.2822\t35755\tRomney\t35755\t0.0008557389999999999\t35755.0\n232\t-85.718647\t34.944893\tBridgeport city\tAL\tAlabama\tJackson County\t2649\t40.1\t8.9\t12.1\t18580\t74048\t0.2822\t35740\tRomney\t35740\t0.008183579\t35740.0\n233\t-86.04911\t34.649284\tScottsboro city\tAL\tAlabama\tJackson County\t14146\t42.8\t20.9\t12.2\t22204\t106799\t0.2822\t35769\tRomney\t35769\t0.043701363\t35769.0\n234\t-85.911947\t34.606157\tDutton town\tAL\tAlabama\tJackson County\t320\t38.5\t11.2\t10.8\t18351\t82500\t0.2822\t35744\tRomney\t35744\t0.0009885789999999998\t35744.0\n235\t-86.279135\t34.625628000000006\tWoodville town\tAL\tAlabama\tJackson County\t765\t39.2\t10.7\t10.5\t16924\t93158\t0.2822\t35776\tRomney\t35776\t0.0023633210000000003\t35776.0\n236\t-86.330653\t34.660189\tPaint Rock town\tAL\tAlabama\tJackson County\t191\t38.5\t10.1\t8.9\t16451\t91667\t0.2822\t35764\tRomney\t35764\t0.0005900580000000001\t35764.0\n237\t-85.846097\t34.684281\tPisgah town\tAL\tAlabama\tJackson County\t706\t38.6\t15.4\t10.4\t17237\t71786\t0.2822\t35765\tRomney\t35765\t0.002181052\t35765.0\n238\t-85.832544\t34.871074\tStevenson city\tAL\tAlabama\tJackson County\t1782\t41.7\t7.7\t14.3\t17546\t65000\t0.2822\t35772\tRomney\t35772\t0.0055051480000000005\t35772.0\n239\t-86.0852\t34.906526\tHytop town\tAL\tAlabama\tJackson County\t300\t38.8\t5.3\t10.7\t17819\t67778\t0.2822\t35745\tRomney\t35745\t0.0009267930000000001\t35745.0\n240\t-86.206014\t34.73462\tPleasant Groves town\tAL\tAlabama\tJackson County\t446\t39.2\t10.8\t11.0\t17058\t93500\t0.2822\t35774\tRomney\t35774\t0.001377832\t35774.0\n241\t-86.122584\t34.804266\tSkyline town\tAL\tAlabama\tJackson County\t812\t38.3\t6.6\t13.4\t15846\t71429\t0.2822\t35768\tRomney\t35768\t0.002508519\t35768.0\n242\t-86.673434\t33.690992\tPinson CDP\tAL\tAlabama\tJefferson County\t5154\t33.4\t16.2\t11.1\t21020\t114233\t0.525\t35126\tRomney\t35126\t0.015922298\t35126.0\n243\t-86.810638\t33.768910999999996\tKimberly town\tAL\tAlabama\tJefferson County\t2038\t38.9\t13.5\t9.8\t20840\t106024\t0.525\t35091\tRomney\t35091\t0.006296011\t35091.0\n244\t-87.00004799999999\t33.549184000000004\tMaytown town\tAL\tAlabama\tJefferson County\t423\t44.7\t9.1\t14.0\t20387\t96500\t0.525\t35118\tRomney\t35118\t0.001306778\t35118.0\n245\t-86.749992\t33.820547999999995\tTrafford town\tAL\tAlabama\tJefferson County\t602\t38.8\t9.8\t9.9\t17251\t81739\t0.525\t35172\tRomney\t35172\t0.0018597639999999999\t35172.0\n246\t-86.97568299999999\t33.492861\tPleasant Grove city\tAL\tAlabama\tJefferson County\t9952\t43.6\t19.5\t8.3\t24198\t132340\t0.525\t35127\tRomney\t35127\t0.030744801000000002\t35127.0\n247\t-86.957422\t33.528694\tEdgewater CDP\tAL\tAlabama\tJefferson County\t766\t40.3\t10.9\t18.2\t16773\t54255\t0.525\t35224\tRomney\t35224\t0.002366411\t35224.0\n248\t-86.925976\t33.426072999999995\tLipscomb city\tAL\tAlabama\tJefferson County\t2370\t37.6\t8.1\t13.5\t14874\t57723\t0.525\t35228\tRomney\t35228\t0.007321662\t35228.0\n249\t-86.922761\t33.455299\tMidfield city\tAL\tAlabama\tJefferson County\t5301\t36.5\t11.6\t14.1\t17750\t75000\t0.525\t35228\tRomney\t35228\t0.016376426\t35228.0\n250\t-87.029313\t33.514736\tSylvan Springs town\tAL\tAlabama\tJefferson County\t1422\t45.0\t8.8\t14.0\t20829\t101563\t0.525\t35118\tRomney\t35118\t0.004392997\t35118.0\n251\t-86.51303\t33.562288\tLeeds city\tAL\tAlabama\tJefferson County\t11389\t41.1\t19.4\t10.6\t22626\t106519\t0.525\t35004\tRomney\t35004\t0.035184138\t35004.0\n252\t-86.974581\t33.595948\tAdamsville city\tAL\tAlabama\tJefferson County\t4652\t42.2\t14.2\t10.7\t20294\t91939\t0.525\t35005\tRomney\t35005\t0.014371465\t35005.0\n253\t-86.945325\t33.439212\tBrighton city\tAL\tAlabama\tJefferson County\t3277\t39.8\t11.2\t14.1\t14789\t55697\t0.525\t35061\tRomney\t35061\t0.010123665\t35061.0\n254\t-87.039022\t33.467793\tConcord CDP\tAL\tAlabama\tJefferson County\t1814\t42.4\t18.9\t9.5\t25678\t131417\t0.525\t35023\tRomney\t35023\t0.005604006\t35023.0\n255\t-86.902016\t33.638756\tBrookside town\tAL\tAlabama\tJefferson County\t1376\t40.6\t10.1\t10.2\t18637\t89444\t0.525\t35036\tRomney\t35036\t0.004250889\t35036.0\n256\t-86.940282\t33.538922\tMinor CDP\tAL\tAlabama\tJefferson County\t1053\t41.3\t10.2\t16.4\t19212\t84138\t0.525\t35224\tRomney\t35224\t0.0032530420000000003\t35224.0\n257\t-86.677651\t33.643239\tCenter Point CDP\tAL\tAlabama\tJefferson County\t22801\t35.1\t16.6\t11.2\t21314\t107184\t0.525\t35215\tRomney\t35215\t0.070439331\t35215.0\n258\t-86.728826\t33.826355\tCounty Line town\tAL\tAlabama\tJefferson County\t351\t38.0\t8.4\t9.4\t18046\t88750\t0.525\t35172\tRomney\t35172\t0.001084347\t35172.0\n259\t-86.872282\t33.676963\tMount Olive CDP\tAL\tAlabama\tJefferson County\t4289\t42.0\t16.1\t9.7\t22994\t120918\t0.525\t35117\tRomney\t35117\t0.013250046000000001\t35117.0\n260\t-86.91976600000001\t33.474841\tFairfield city\tAL\tAlabama\tJefferson County\t11714\t36.3\t23.0\t16.1\t17058\t85281\t0.525\t35064\tRomney\t35064\t0.036188164\t35064.0\n261\t-86.799717\t33.664691\tGardendale city\tAL\tAlabama\tJefferson County\t12873\t44.6\t19.3\t9.6\t26128\t123114\t0.525\t35071\tRomney\t35071\t0.039768673\t35071.0\n262\t-86.75092099999999\t33.432039\tVestavia Hills city\tAL\tAlabama\tJefferson County\t25710\t39.4\t61.0\t8.4\t43740\t245704\t0.525\t35243\tRomney\t35243\t0.07942613\t35243.0\n263\t-86.80949100000001\t33.461791999999996\tHomewood city\tAL\tAlabama\tJefferson County\t23844\t31.1\t58.7\t8.6\t28795\t198271\t0.525\t35209\tRomney\t35209\t0.07366148\t35209.0\n264\t-86.803912\t33.7467\tMorris town\tAL\tAlabama\tJefferson County\t2032\t37.8\t18.0\t9.5\t20966\t126593\t0.525\t35116\tRomney\t35116\t0.006277476\t35116.0\n265\t-86.931073\t33.646775\tCardiff town\tAL\tAlabama\tJefferson County\t84\t42.1\t10.2\t11.1\t18909\t96667\t0.525\t35036\tRomney\t35036\t0.000259502\t35036.0\n266\t-86.64144300000001\t33.648216\tGrayson Valley CDP\tAL\tAlabama\tJefferson County\t6033\t38.3\t25.1\t8.1\t26374\t124827\t0.525\t35235\tRomney\t35235\t0.0186378\t35235.0\n267\t-86.957549\t33.630136\tGraysville city\tAL\tAlabama\tJefferson County\t2219\t43.8\t10.0\t11.7\t19536\t80385\t0.525\t35073\tRomney\t35073\t0.006855176\t35073.0\n268\t-87.081232\t33.476679\tRock Creek CDP\tAL\tAlabama\tJefferson County\t1507\t42.4\t18.4\t9.5\t25820\t131196\t0.525\t35023\tRomney\t35023\t0.004655588\t35023.0\n269\t-86.741157\t33.486096999999994\tMountain Brook city\tAL\tAlabama\tJefferson County\t19809\t41.4\t75.8\t7.4\t53376\t377496\t0.525\t35223\tRomney\t35223\t0.06119611900000001\t35223.0\n270\t-86.813383\t33.842484999999996\tWarrior city\tAL\tAlabama\tJefferson County\t3016\t41.1\t7.4\t12.6\t17664\t79235\t0.525\t35180\tRomney\t35180\t0.009317355\t35180.0\n271\t-86.899404\t33.573910999999995\tForestdale CDP\tAL\tAlabama\tJefferson County\t9927\t42.1\t23.3\t10.2\t22732\t112909\t0.525\t35214\tRomney\t35214\t0.030667569\t35214.0\n272\t-86.76769399999999\t33.593901\tTarrant city\tAL\tAlabama\tJefferson County\t6310\t40.1\t11.5\t13.4\t16724\t67767\t0.525\t35217\tRomney\t35217\t0.019493539\t35217.0\n273\t-86.938321\t33.519055\tMcDonald Chapel CDP\tAL\tAlabama\tJefferson County\t988\t42.8\t3.7\t14.1\t14733\t56493\t0.525\t35224\tRomney\t35224\t0.003052237\t35224.0\n274\t-86.728303\t33.459639\tCahaba Heights CDP\tAL\tAlabama\tJefferson County\t5103\t37.5\t62.6\t8.6\t39604\t177265\t0.525\t35243\tRomney\t35243\t0.015764743\t35243.0\n275\t-86.678566\t33.532897999999996\tIrondale city\tAL\tAlabama\tJefferson County\t9432\t42.6\t40.0\t8.6\t31076\t129815\t0.525\t35210\tRomney\t35210\t0.029138361\t35210.0\n276\t-86.801626\t33.617636\tFultondale city\tAL\tAlabama\tJefferson County\t7583\t41.0\t12.3\t13.3\t22974\t106484\t0.525\t35068\tRomney\t35068\t0.023426229\t35068.0\n277\t-86.965971\t33.373427\tBessemer city\tAL\tAlabama\tJefferson County\t28853\t36.3\t13.2\t17.0\t15290\t72937\t0.525\t35022\tRomney\t35022\t0.08913582800000001\t35022.0\n278\t-87.100837\t33.368001\tNorth Johns town\tAL\tAlabama\tJefferson County\t135\t39.3\t2.2\t10.2\t16660\t63750\t0.525\t35111\tRomney\t35111\t0.000417057\t35111.0\n279\t-86.65567\t33.530026\tBirmingham city\tAL\tAlabama\tJefferson County\t230105\t36.1\t22.2\t15.7\t18156\t80546\t0.525\t352HH\tRomney\t352HH\t0.710865408\t0.0\n280\t-87.06741600000001\t33.647981\tWest Jefferson town\tAL\tAlabama\tJefferson County\t324\t43.0\t12.2\t8.3\t17616\t71176\t0.525\t35130\tRomney\t35130\t0.001000936\t35130.0\n281\t-86.60923000000001\t33.715221\tClay CDP\tAL\tAlabama\tJefferson County\t5797\t39.7\t23.6\t8.7\t26021\t138641\t0.525\t35126\tRomney\t35126\t0.017908723\t35126.0\n282\t-86.973414\t33.553558\tMulga town\tAL\tAlabama\tJefferson County\t946\t41.1\t6.0\t13.4\t18536\t54118\t0.525\t35005\tRomney\t35005\t0.0029224859999999997\t35005.0\n283\t-86.650539\t33.669921\tChalkville CDP\tAL\tAlabama\tJefferson County\t4308\t35.8\t19.9\t9.3\t24500\t125159\t0.525\t35215\tRomney\t35215\t0.013308742\t35215.0\n284\t-86.548585\t33.637859999999996\tTrussville city\tAL\tAlabama\tJefferson County\t14799\t42.6\t32.1\t8.5\t30819\t177874\t0.525\t35173\tRomney\t35173\t0.045718681\t35173.0\n285\t-86.734421\t33.398514\tHoover city\tAL\tAlabama\tJefferson County\t70951\t37.4\t55.3\t8.6\t39711\t227585\t0.525\t35242\tRomney\t35242\t0.219189551\t35242.0\n286\t-87.00833399999999\t33.434137\tHueytown city\tAL\tAlabama\tJefferson County\t14591\t42.6\t15.2\t11.1\t22126\t97230\t0.525\t35023\tRomney\t35023\t0.045076105\t35023.0\n287\t-88.021776\t33.935415\tBeaverton town\tAL\tAlabama\tLamar County\t217\t41.0\t1.3\t18.2\t16412\t65714\t0.2294\t35544\tRomney\t35544\t0.00067038\t35544.0\n288\t-88.16777900000001\t34.027231\tDetroit town\tAL\tAlabama\tLamar County\t221\t39.0\t8.7\t13.9\t15081\t58500\t0.2294\t35552\tRomney\t35552\t0.000682737\t35552.0\n289\t-88.081958\t33.558491\tMillport town\tAL\tAlabama\tLamar County\t1051\t41.0\t10.7\t11.5\t18508\t72500\t0.2294\t35576\tRomney\t35576\t0.0032468640000000003\t35576.0\n290\t-88.126566\t33.891175\tSulligent city\tAL\tAlabama\tLamar County\t1870\t39.8\t6.1\t15.1\t15796\t64935\t0.2294\t35586\tRomney\t35586\t0.005777008\t35586.0\n291\t-88.11430899999999\t33.758977\tVernon city\tAL\tAlabama\tLamar County\t1954\t39.9\t13.2\t15.0\t18477\t75577\t0.2294\t35592\tRomney\t35592\t0.006036509000000001\t35592.0\n292\t-87.986175\t33.580892999999996\tKennedy town\tAL\tAlabama\tLamar County\t502\t39.5\t10.1\t16.5\t16499\t68000\t0.2294\t35574\tRomney\t35574\t0.001550833\t35574.0\n293\t-87.696779\t34.877159000000006\tUnderwood-Petersville CDP\tAL\tAlabama\tLauderdale County\t3285\t41.1\t28.4\t7.3\t25311\t123325\t0.3378\t35630\tRomney\t35630\t0.01014838\t35630.0\n294\t-87.271732\t34.91434\tAnderson town\tAL\tAlabama\tLauderdale County\t369\t40.8\t9.9\t14.1\t17872\t102404\t0.3378\t35610\tRomney\t35610\t0.001139955\t35610.0\n295\t-87.62441899999999\t34.869483\tSt. Florian town\tAL\tAlabama\tLauderdale County\t340\t43.0\t29.1\t9.0\t24786\t149107\t0.3378\t35634\tRomney\t35634\t0.001050365\t35634.0\n296\t-88.065368\t34.917277\tWaterloo town\tAL\tAlabama\tLauderdale County\t205\t46.1\t12.2\t16.8\t17509\t85455\t0.3378\t35677\tRomney\t35677\t0.0006333080000000001\t35677.0\n297\t-87.373518\t34.965121\tLexington town\tAL\tAlabama\tLauderdale County\t831\t41.4\t13.4\t9.1\t17911\t92885\t0.3378\t35648\tRomney\t35648\t0.002567216\t35648.0\n298\t-87.665761\t34.829192\tFlorence city\tAL\tAlabama\tLauderdale County\t36445\t38.8\t26.3\t12.2\t21127\t108305\t0.3378\t35630\tRomney\t35630\t0.11258986\t35630.0\n299\t-87.528816\t34.860639\tKillen town\tAL\tAlabama\tLauderdale County\t1206\t41.1\t27.4\t9.2\t25319\t137500\t0.3378\t35645\tRomney\t35645\t0.0037257059999999996\t35645.0\n300\t-87.282004\t34.825043\tRogersville town\tAL\tAlabama\tLauderdale County\t1273\t45.7\t17.7\t13.7\t21238\t106192\t0.3378\t35652\tRomney\t35652\t0.00393269\t35652.0\n301\t-87.31774300000001\t34.670904\tCourtland town\tAL\tAlabama\tLawrence County\t713\t39.7\t7.4\t12.9\t15309\t69737\t0.3583\t35618\tRomney\t35618\t0.002202677\t35618.0\n302\t-87.406371\t34.671751\tTown Creek town\tAL\tAlabama\tLawrence County\t1169\t39.6\t7.7\t15.1\t16383\t64500\t0.3583\t35672\tRomney\t35672\t0.003611402\t35672.0\n303\t-87.183723\t34.640724\tHillsboro town\tAL\tAlabama\tLawrence County\t614\t40.5\t8.1\t12.1\t20102\t83800\t0.3583\t35643\tRomney\t35643\t0.001896836\t35643.0\n304\t-87.28322800000001\t34.484095\tMoulton city\tAL\tAlabama\tLawrence County\t3218\t43.2\t10.6\t14.6\t17467\t83958\t0.3583\t35650\tRomney\t35650\t0.009941396\t35650.0\n305\t-87.308458\t34.67771\tNorth Courtland town\tAL\tAlabama\tLawrence County\t750\t38.6\t8.0\t17.2\t15566\t59394\t0.3583\t35618\tRomney\t35618\t0.002316982\t35618.0\n306\t-85.48167099999999\t32.59182\tAuburn city\tAL\tAlabama\tLee County\t52601\t23.8\t56.4\t12.8\t19526\t162599\t0.3923\t36849\tRomney\t36849\t0.162500734\t36849.0\n307\t-85.594909\t32.605095\tLoachapoka town\tAL\tAlabama\tLee County\t156\t35.8\t30.0\t9.2\t17341\t73333\t0.3923\t36832\tRomney\t36832\t0.00048193199999999997\t36832.0\n308\t-85.113425\t32.547309999999996\tSmiths CDP\tAL\tAlabama\tLee County\t26630\t34.2\t15.7\t8.5\t21949\t131962\t0.3923\t36877\tRomney\t36877\t0.082268294\t36877.0\n309\t-85.575352\t32.736785\tWaverly town\tAL\tAlabama\tLee County\t178\t39.3\t27.3\t18.9\t17809\t100000\t0.3923\t36879\tRomney\t36879\t0.0005498969999999999\t36879.0\n310\t-85.380799\t32.657984\tOpelika city\tAL\tAlabama\tLee County\t24500\t36.1\t25.0\t11.9\t19334\t121109\t0.3923\t36801\tRomney\t36801\t0.075688066\t36801.0\n311\t-87.151524\t34.987707\tLester town\tAL\tAlabama\tLimestone County\t114\t38.1\t9.2\t9.1\t18538\t100000\t0.2766\t35647\tRomney\t35647\t0.00035218099999999997\t35647.0\n312\t-86.976476\t34.928896\tElkmont town\tAL\tAlabama\tLimestone County\t539\t39.5\t16.0\t16.1\t18376\t110577\t0.2766\t35620\tRomney\t35620\t0.0016651370000000001\t35620.0\n313\t-86.950565\t34.783578999999996\tAthens city\tAL\tAlabama\tLimestone County\t20669\t39.8\t25.3\t11.6\t20838\t124574\t0.2766\t35613\tRomney\t35613\t0.063852924\t35613.0\n314\t-86.879731\t34.625956\tMooresville town\tAL\tAlabama\tLimestone County\t74\t42.5\t9.8\t8.8\t19377\t114063\t0.2766\t35649\tRomney\t35649\t0.000228609\t35649.0\n315\t-86.837239\t34.984687\tArdmore town\tAL\tAlabama\tLimestone County\t1189\t40.9\t8.4\t12.8\t17118\t95882\t0.2766\t35739\tRomney\t35739\t0.003673188\t35739.0\n316\t-86.57866800000001\t32.182151\tHayneville town\tAL\tAlabama\tLowndes County\t1051\t33.2\t9.7\t23.4\t11147\t66750\t0.7639\t36040\tRomney\t36040\t0.0032468640000000003\t36040.0\n317\t-86.817971\t32.307796999999994\tBenton town\tAL\tAlabama\tLowndes County\t42\t32.5\t15.4\t18.8\t13580\t50000\t0.7639\t36785\tRomney\t36785\t0.000129751\t36785.0\n318\t-86.714849\t32.299264\tWhite Hall town\tAL\tAlabama\tLowndes County\t936\t38.8\t14.4\t18.1\t17119\t64444\t0.7639\t36752\tRomney\t36752\t0.002891593\t36752.0\n319\t-86.567136\t31.986261\tFort Deposit town\tAL\tAlabama\tLowndes County\t1202\t36.7\t10.3\t21.9\t14359\t59118\t0.7639\t36032\tRomney\t36032\t0.0037133490000000003\t36032.0\n320\t-86.72039699999999\t32.180461\tMosses town\tAL\tAlabama\tLowndes County\t1060\t30.5\t7.3\t26.1\t10075\t51852\t0.7639\t36040\tRomney\t36040\t0.003274667\t36040.0\n321\t-86.610872\t32.276410999999996\tLowndesboro town\tAL\tAlabama\tLowndes County\t139\t44.5\t17.5\t14.9\t25570\t96667\t0.7639\t36752\tRomney\t36752\t0.00042941400000000003\t36752.0\n322\t-86.71173\t32.152993\tGordonville town\tAL\tAlabama\tLowndes County\t307\t30.4\t7.5\t26.0\t10056\t51875\t0.7639\t36040\tRomney\t36040\t0.000948418\t36040.0\n323\t-85.93444699999999\t32.397239\tShorter town\tAL\tAlabama\tMacon County\t366\t39.5\t10.0\t21.2\t14673\t86250\t0.87\t36075\tRomney\t36075\t0.001130687\t36075.0\n324\t-85.82432\t32.455044\tFranklin town\tAL\tAlabama\tMacon County\t147\t42.3\t19.2\t10.8\t19062\t83000\t0.87\t360HH\tRomney\t360HH\t0.00045412800000000004\t0.0\n325\t-85.713723\t32.478594\tTuskegee city\tAL\tAlabama\tMacon County\t10683\t27.9\t32.2\t24.3\t14689\t84918\t0.87\t36083\tRomney\t36083\t0.033003086\t36083.0\n326\t-85.647177\t32.57232\tNotasulga town\tAL\tAlabama\tMacon County\t931\t40.3\t17.2\t18.2\t17110\t72576\t0.87\t36866\tRomney\t36866\t0.002876147\t36866.0\n327\t-86.453946\t34.589526\tOwens Cross Roads town\tAL\tAlabama\tMadison County\t1286\t41.6\t12.8\t12.4\t19390\t106055\t0.39899999999999997\t35763\tRomney\t35763\t0.0039728509999999995\t35763.0\n328\t-86.647666\t34.683873999999996\tRedstone Arsenal CDP\tAL\tAlabama\tMadison County\t2411\t23.6\t30.8\t8.6\t14822\t165625\t0.39899999999999997\t35805\tRomney\t35805\t0.007448324\t35805.0\n329\t-86.567048\t34.923659\tHazel Green CDP\tAL\tAlabama\tMadison County\t4083\t35.4\t22.5\t9.7\t20564\t121179\t0.39899999999999997\t35750\tRomney\t35750\t0.012613648\t35750.0\n330\t-86.741513\t34.590348999999996\tTriana town\tAL\tAlabama\tMadison County\t489\t36.4\t20.6\t6.8\t17083\t95938\t0.39899999999999997\t35775\tRomney\t35775\t0.001510672\t35775.0\n331\t-86.412902\t34.536889\tNew Hope city\tAL\tAlabama\tMadison County\t2681\t39.2\t13.2\t10.6\t18956\t94643\t0.39899999999999997\t35760\tRomney\t35760\t0.008282437\t35760.0\n332\t-86.752024\t34.85576\tHarvest CDP\tAL\tAlabama\tMadison County\t5083\t36.3\t36.0\t7.3\t24872\t148120\t0.39899999999999997\t35749\tRomney\t35749\t0.015702957\t35749.0\n333\t-86.421858\t34.889361\tNew Market CDP\tAL\tAlabama\tMadison County\t1661\t38.6\t16.7\t7.9\t18707\t89111\t0.39899999999999997\t35761\tRomney\t35761\t0.0051313420000000005\t35761.0\n334\t-86.522067\t34.848943\tMoores Mill CDP\tAL\tAlabama\tMadison County\t5914\t38.6\t30.0\t7.1\t24852\t142897\t0.39899999999999997\t35759\tRomney\t35759\t0.018270172\t35759.0\n335\t-86.572191\t34.872803999999995\tMeridianville CDP\tAL\tAlabama\tMadison County\t5700\t40.9\t29.1\t6.0\t26817\t142708\t0.39899999999999997\t35759\tRomney\t35759\t0.01760906\t35759.0\n336\t-86.378022\t34.704968\tGurley town\tAL\tAlabama\tMadison County\t916\t40.2\t13.1\t9.8\t15287\t95385\t0.39899999999999997\t35748\tRomney\t35748\t0.002829807\t35748.0\n337\t-86.747823\t34.711131\tMadison city\tAL\tAlabama\tMadison County\t37983\t34.6\t54.1\t6.4\t32550\t191330\t0.39899999999999997\t35758\tRomney\t35758\t0.117341217\t35758.0\n338\t-86.607256\t34.713937\tHuntsville city\tAL\tAlabama\tMadison County\t172062\t38.8\t39.0\t9.9\t26749\t140466\t0.39899999999999997\t35805\tRomney\t35805\t0.531552656\t35805.0\n339\t-87.860702\t32.105246\tSweet Water town\tAL\tAlabama\tMarengo County\t234\t43.6\t12.7\t12.4\t17950\t59167\t0.5343\t36782\tRomney\t36782\t0.000722898\t36782.0\n340\t-87.792644\t32.300126\tLinden city\tAL\tAlabama\tMarengo County\t2245\t41.7\t16.5\t12.7\t16874\t75820\t0.5343\t36748\tRomney\t36748\t0.006935498000000001\t36748.0\n341\t-87.94926\t32.252083\tMyrtlewood town\tAL\tAlabama\tMarengo County\t123\t41.4\t13.3\t10.5\t16458\t70000\t0.5343\t36763\tRomney\t36763\t0.000379985\t36763.0\n342\t-87.834935\t32.501540999999996\tDemopolis city\tAL\tAlabama\tMarengo County\t7011\t37.1\t18.4\t19.7\t18160\t97773\t0.5343\t36732\tRomney\t36732\t0.021659143999999998\t36732.0\n343\t-87.641573\t32.350959\tDayton town\tAL\tAlabama\tMarengo County\t59\t38.3\t18.4\t10.5\t11941\t50000\t0.5343\t36738\tRomney\t36738\t0.000182269\t36738.0\n344\t-87.59378000000001\t32.458069\tFaunsdale town\tAL\tAlabama\tMarengo County\t85\t39.0\t18.5\t10.7\t12021\t46667\t0.5343\t36738\tRomney\t36738\t0.000262591\t36738.0\n345\t-87.775927\t32.342383\tProvidence town\tAL\tAlabama\tMarengo County\t290\t38.9\t5.2\t16.5\t16119\t59444\t0.5343\t36748\tRomney\t36748\t0.0008958999999999999\t36748.0\n346\t-87.623705\t32.268273\tThomaston town\tAL\tAlabama\tMarengo County\t365\t40.1\t17.1\t9.3\t16127\t50667\t0.5343\t36783\tRomney\t36783\t0.001127598\t36783.0\n347\t-87.908633\t33.975509\tGuin city\tAL\tAlabama\tMarion County\t2353\t42.0\t13.5\t16.7\t19009\t76058\t0.1854\t35563\tRomney\t35563\t0.007269144\t35563.0\n348\t-87.870221\t33.945446999999994\tGu-Win town\tAL\tAlabama\tMarion County\t201\t43.2\t9.0\t19.4\t17973\t76000\t0.1854\t35563\tRomney\t35563\t0.000620951\t35563.0\n349\t-87.716492\t34.265082\tBear Creek town\tAL\tAlabama\tMarion County\t957\t39.4\t9.5\t15.6\t17351\t74444\t0.1854\t35543\tRomney\t35543\t0.002956469\t35543.0\n350\t-87.77919399999999\t34.009565\tBrilliant town\tAL\tAlabama\tMarion County\t706\t41.1\t4.7\t16.8\t15522\t53864\t0.1854\t35548\tRomney\t35548\t0.002181052\t35548.0\n351\t-87.830112\t34.26937\tHackleburg town\tAL\tAlabama\tMarion County\t1476\t42.6\t6.9\t16.6\t16804\t66364\t0.1854\t35564\tRomney\t35564\t0.00455982\t35564.0\n352\t-87.98221600000001\t34.131376\tHamilton city\tAL\tAlabama\tMarion County\t6689\t41.9\t9.4\t17.5\t18951\t84660\t0.1854\t35570\tRomney\t35570\t0.020664387\t35570.0\n353\t-87.797712\t33.934818\tWinfield city\tAL\tAlabama\tMarion County\t4471\t42.7\t13.1\t15.2\t18616\t85217\t0.1854\t35594\tRomney\t35594\t0.0138123\t35594.0\n354\t-86.154572\t34.206185999999995\tBoaz city\tAL\tAlabama\tMarshall County\t8121\t42.3\t13.2\t9.8\t17906\t98478\t0.193\t35957\tRomney\t35957\t0.025088277000000003\t35957.0\n355\t-86.252957\t34.518356\tGrant town\tAL\tAlabama\tMarshall County\t753\t40.6\t14.2\t10.8\t19234\t95000\t0.193\t35747\tRomney\t35747\t0.00232625\t35747.0\n356\t-86.209818\t34.262658\tAlbertville city\tAL\tAlabama\tMarshall County\t18810\t35.5\t15.1\t11.4\t17407\t97876\t0.193\t35950\tRomney\t35950\t0.058109899000000007\t35950.0\n357\t-86.300987\t34.367561\tGuntersville city\tAL\tAlabama\tMarshall County\t7774\t42.3\t24.0\t10.6\t20754\t124131\t0.193\t35976\tRomney\t35976\t0.024016287\t35976.0\n358\t-86.321386\t34.171258\tDouglas town\tAL\tAlabama\tMarshall County\t578\t36.6\t11.1\t10.3\t14865\t85000\t0.193\t35980\tRomney\t35980\t0.001785621\t35980.0\n359\t-86.499664\t34.331081\tArab city\tAL\tAlabama\tMarshall County\t7691\t41.4\t22.2\t9.0\t21757\t123710\t0.193\t35016\tRomney\t35016\t0.023759874\t35016.0\n360\t-86.4482\t34.402499\tUnion Grove town\tAL\tAlabama\tMarshall County\t104\t41.6\t11.3\t10.2\t21481\t109375\t0.193\t35175\tRomney\t35175\t0.000321288\t35175.0\n361\t-88.107716\t30.689684999999997\tMobile city\tAL\tAlabama\tMobile County\t193381\t35.4\t26.4\t13.6\t20160\t113670\t0.4497\t36607\tRomney\t36607\t0.597413631\t36607.0\n362\t-88.12973000000001\t30.773571\tPrichard city\tAL\tAlabama\tMobile County\t26012\t34.2\t7.7\t19.3\t12498\t69117\t0.4497\t36612\tRomney\t36612\t0.080359101\t36612.0\n363\t-88.251279\t30.403190999999996\tBayou La Batre city\tAL\tAlabama\tMobile County\t2123\t35.9\t6.0\t14.5\t13477\t59250\t0.4497\t36509\tRomney\t36509\t0.0065586030000000005\t36509.0\n364\t-88.241924\t31.097837\tCitronelle city\tAL\tAlabama\tMobile County\t3583\t36.4\t9.0\t12.3\t16839\t83487\t0.4497\t36522\tRomney\t36522\t0.011068993999999999\t36522.0\n365\t-88.07939\t30.771440000000002\tChickasaw city\tAL\tAlabama\tMobile County\t6059\t38.8\t9.7\t12.0\t17175\t80447\t0.4497\t36611\tRomney\t36611\t0.018718122\t36611.0\n366\t-88.344924\t30.471651\tGrand Bay CDP\tAL\tAlabama\tMobile County\t4125\t37.9\t10.0\t13.0\t17631\t102736\t0.4497\t36541\tRomney\t36541\t0.012743398999999999\t36541.0\n367\t-88.207332\t30.246483\tDauphin Island town\tAL\tAlabama\tMobile County\t1384\t46.2\t20.0\t12.4\t22869\t137019\t0.4497\t36528\tRomney\t36528\t0.004275603\t36528.0\n368\t-88.180274\t30.544478\tTheodore CDP\tAL\tAlabama\tMobile County\t7200\t35.5\t9.8\t12.7\t16197\t101106\t0.4497\t36582\tRomney\t36582\t0.022243024\t36582.0\n369\t-88.009372\t30.890621000000003\tCreola town\tAL\tAlabama\tMobile County\t1985\t38.3\t11.2\t12.7\t17393\t109605\t0.4497\t36525\tRomney\t36525\t0.0061322780000000006\t36525.0\n370\t-88.060716\t30.855016\tSatsuma city\tAL\tAlabama\tMobile County\t5967\t39.5\t18.0\t9.4\t23540\t127673\t0.4497\t36572\tRomney\t36572\t0.018433906\t36572.0\n371\t-88.011639\t31.091346\tMount Vernon town\tAL\tAlabama\tMobile County\t878\t39.0\t2.9\t14.7\t12418\t62200\t0.4497\t36560\tRomney\t36560\t0.002712413\t36560.0\n372\t-88.201937\t30.584613\tTillmans Corner CDP\tAL\tAlabama\tMobile County\t16341\t37.4\t9.8\t11.8\t18204\t102040\t0.4497\t36619\tRomney\t36619\t0.050482396\t36619.0\n373\t-88.09733\t30.829396999999997\tSaraland city\tAL\tAlabama\tMobile County\t12466\t38.9\t11.9\t12.4\t19869\t108857\t0.4497\t36571\tRomney\t36571\t0.038511324\t36571.0\n374\t-87.343273\t31.426371999999997\tExcel town\tAL\tAlabama\tMonroe County\t658\t35.6\t9.6\t21.6\t16636\t73611\t0.4585\t36445\tRomney\t36445\t0.002032765\t36445.0\n375\t-87.327569\t31.516581\tMonroeville city\tAL\tAlabama\tMonroe County\t6562\t38.0\t20.0\t18.3\t20285\t101116\t0.4585\t36460\tRomney\t36460\t0.020272045\t36460.0\n376\t-87.403582\t31.435312\tFrisco City town\tAL\tAlabama\tMonroe County\t1363\t37.6\t7.6\t21.0\t15552\t57766\t0.4585\t36445\tRomney\t36445\t0.0042107279999999995\t36445.0\n377\t-87.209049\t31.733308\tBeatrice town\tAL\tAlabama\tMonroe County\t361\t40.0\t8.5\t25.7\t10817\t41667\t0.4585\t36425\tRomney\t36425\t0.00111524\t36425.0\n378\t-87.31776500000001\t31.823702\tVredenburgh town\tAL\tAlabama\tMonroe County\t288\t33.5\t2.4\t42.9\t8737\t18462\t0.4585\t36481\tRomney\t36481\t0.0008897210000000001\t36481.0\n379\t-86.26746\t32.348777\tMontgomery city\tAL\tAlabama\tMontgomery County\t201444\t35.1\t33.0\t13.0\t22543\t109723\t0.6181\t36106\tRomney\t36106\t0.622322728\t36106.0\n380\t-86.142758\t32.271964000000004\tPike Road city\tAL\tAlabama\tMontgomery County\t318\t38.1\t29.1\t11.7\t29769\t105682\t0.6181\t36064\tRomney\t36064\t0.0009824\t36064.0\n381\t-86.799371\t34.469076\tSomerville town\tAL\tAlabama\tMorgan County\t358\t39.8\t14.8\t11.1\t20117\t94375\t0.2717\t35670\tRomney\t35670\t0.0011059730000000001\t35670.0\n382\t-86.938691\t34.4385\tHartselle city\tAL\tAlabama\tMorgan County\t13530\t40.9\t22.1\t11.5\t23126\t115596\t0.2717\t35640\tRomney\t35640\t0.041798348\t35640.0\n383\t-86.88606300000001\t34.524638\tPriceville town\tAL\tAlabama\tMorgan County\t2086\t43.4\t23.2\t13.0\t27035\t127699\t0.2717\t35603\tRomney\t35603\t0.006444298\t35603.0\n384\t-86.922572\t34.628554\tDecatur city\tAL\tAlabama\tMorgan County\t55433\t38.1\t25.4\t13.0\t22283\t113189\t0.2717\t35649\tRomney\t35649\t0.17124965600000003\t35649.0\n385\t-86.90909599999999\t34.379626\tFalkville town\tAL\tAlabama\tMorgan County\t1364\t50.6\t13.3\t9.3\t17859\t83269\t0.2717\t35622\tRomney\t35622\t0.004213817\t35622.0\n386\t-87.08779\t34.600601\tTrinity town\tAL\tAlabama\tMorgan County\t2041\t42.3\t19.0\t7.9\t24512\t133600\t0.2717\t35673\tRomney\t35673\t0.0063052790000000004\t35673.0\n387\t-86.756651\t34.330327000000004\tEva town\tAL\tAlabama\tMorgan County\t509\t39.9\t9.3\t10.8\t18146\t87857\t0.2717\t35621\tRomney\t35621\t0.0015724579999999999\t35621.0\n388\t-87.509294\t32.447531\tUniontown city\tAL\tAlabama\tPerry County\t1581\t28.8\t10.8\t29.1\t9763\t52045\t0.7487\t36786\tRomney\t36786\t0.004884197\t36786.0\n389\t-87.317206\t32.631832\tMarion city\tAL\tAlabama\tPerry County\t3250\t33.5\t19.1\t17.4\t14092\t73222\t0.7487\t36756\tRomney\t36756\t0.010040254\t36756.0\n390\t-87.903568\t33.321870000000004\tGordo town\tAL\tAlabama\tPickens County\t1581\t41.8\t11.2\t12.8\t17348\t92069\t0.46299999999999997\t35466\tRomney\t35466\t0.004884197\t35466.0\n391\t-88.216101\t33.414064\tEthelsville town\tAL\tAlabama\tPickens County\t72\t43.0\t10.0\t10.7\t16901\t78333\t0.46299999999999997\t35461\tRomney\t35461\t0.00022243\t35461.0\n392\t-88.246016\t33.407287\tMacedonia town\tAL\tAlabama\tPickens County\t259\t41.2\t11.0\t10.1\t16865\t75625\t0.46299999999999997\t35461\tRomney\t35461\t0.000800131\t35461.0\n393\t-88.15920899999999\t33.123165\tAliceville city\tAL\tAlabama\tPickens County\t2422\t37.6\t15.1\t18.9\t14433\t71615\t0.46299999999999997\t35442\tRomney\t35442\t0.007482306\t35442.0\n394\t-88.09508199999999\t33.261874\tCarrollton town\tAL\tAlabama\tPickens County\t1013\t38.0\t9.7\t18.0\t15075\t82059\t0.46299999999999997\t35447\tRomney\t35447\t0.00312947\t35447.0\n395\t-88.017139\t33.378809999999994\tReform city\tAL\tAlabama\tPickens County\t1827\t40.3\t9.1\t15.8\t16277\t71548\t0.46299999999999997\t35481\tRomney\t35481\t0.005644166999999999\t35481.0\n396\t-88.274286\t33.233771999999995\tPickensville town\tAL\tAlabama\tPickens County\t618\t36.1\t6.3\t16.5\t12751\t60789\t0.46299999999999997\t35447\tRomney\t35447\t0.0019091929999999998\t35447.0\n397\t-88.300768\t33.136915\tMemphis town\tAL\tAlabama\tPickens County\t31\t41.3\t14.3\t9.1\t14838\t150000\t0.46299999999999997\t35442\tRomney\t35442\t9.58e-05\t35442.0\n398\t-88.175438\t33.148207\tMcMullen town\tAL\tAlabama\tPickens County\t63\t34.2\t10.3\t30.4\t11754\t47500\t0.46299999999999997\t35442\tRomney\t35442\t0.000194626\t35442.0\n399\t-85.966691\t31.801928000000004\tTroy city\tAL\tAlabama\tPike County\t15170\t29.6\t28.7\t12.5\t17646\t100109\t0.4273\t36079\tRomney\t36079\t0.046864815\t36079.0\n400\t-85.836649\t31.813391999999997\tBanks town\tAL\tAlabama\tPike County\t205\t40.9\t16.2\t9.1\t15807\t71875\t0.4273\t36005\tRomney\t36005\t0.0006333080000000001\t36005.0\n401\t-85.817859\t31.718113\tBrundidge city\tAL\tAlabama\tPike County\t2252\t43.8\t10.5\t14.0\t12449\t63571\t0.4273\t36010\tRomney\t36010\t0.006957123000000001\t36010.0\n402\t-86.12398\t31.718093\tGoshen town\tAL\tAlabama\tPike County\t271\t43.7\t22.3\t7.6\t18676\t86500\t0.4273\t36035\tRomney\t36035\t0.000837203\t36035.0\n403\t-85.568862\t33.124198\tWadley town\tAL\tAlabama\tRandolph County\t606\t34.9\t22.8\t13.7\t17183\t73889\t0.2954\t36276\tRomney\t36276\t0.001872121\t36276.0\n404\t-85.286048\t33.156337\tRock Mills CDP\tAL\tAlabama\tRandolph County\t705\t38.7\t8.8\t9.6\t18707\t73000\t0.2954\t36274\tRomney\t36274\t0.0021779629999999998\t36274.0\n405\t-85.39824499999999\t33.373020000000004\tWoodland town\tAL\tAlabama\tRandolph County\t180\t43.5\t16.8\t11.5\t19250\t102500\t0.2954\t36280\tRomney\t36280\t0.000556076\t36280.0\n406\t-85.369327\t33.145354\tRoanoke city\tAL\tAlabama\tRandolph County\t6183\t38.5\t13.5\t16.2\t15333\t80744\t0.2954\t36274\tRomney\t36274\t0.019101196\t36274.0\n407\t-85.48637099999999\t33.307646999999996\tWedowee town\tAL\tAlabama\tRandolph County\t767\t41.8\t14.1\t12.4\t16534\t93056\t0.2954\t36278\tRomney\t36278\t0.0023695\t36278.0\n408\t-85.014973\t32.518953\tPhenix City\tAL\tAlabama\tRussell County\t29821\t35.6\t14.7\t12.8\t17505\t108296\t0.5553\t36867\tRomney\t36867\t0.092126279\t36867.0\n409\t-85.08791\t32.460947\tLadonia CDP\tAL\tAlabama\tRussell County\t3142\t37.8\t9.2\t10.6\t16193\t95727\t0.5553\t36870\tRomney\t36870\t0.009706608\t36870.0\n410\t-85.41466700000001\t32.24009\tHurtsboro town\tAL\tAlabama\tRussell County\t557\t41.2\t9.9\t23.2\t14042\t53500\t0.5553\t36860\tRomney\t36860\t0.001720745\t36860.0\n411\t-86.435216\t33.650915999999995\tBranchville town\tAL\tAlabama\tSt. Clair County\t1152\t39.4\t11.9\t10.7\t18444\t110776\t0.1646\t35120\tRomney\t35120\t0.0035588840000000004\t35120.0\n412\t-86.138424\t33.747111\tRagland town\tAL\tAlabama\tSt. Clair County\t2221\t38.5\t11.0\t13.2\t15123\t89677\t0.1646\t35131\tRomney\t35131\t0.006861355\t35131.0\n413\t-86.496928\t33.599024\tMoody town\tAL\tAlabama\tSt. Clair County\t10425\t37.9\t13.3\t9.9\t19827\t127436\t0.1646\t35004\tRomney\t35004\t0.032206045\t35004.0\n414\t-86.270362\t33.834178\tAshville town\tAL\tAlabama\tSt. Clair County\t2793\t38.5\t11.0\t12.2\t16785\t94388\t0.1646\t35953\tRomney\t35953\t0.00862844\t35953.0\n415\t-86.20106\t33.936758000000005\tSteele town\tAL\tAlabama\tSt. Clair County\t1362\t41.3\t12.5\t13.9\t17589\t87031\t0.1646\t35987\tRomney\t35987\t0.004207639\t35987.0\n416\t-86.204802\t33.617124\tRiverside town\tAL\tAlabama\tSt. Clair County\t2002\t40.5\t14.4\t12.3\t20354\t126453\t0.1646\t35135\tRomney\t35135\t0.006184795999999999\t35135.0\n417\t-86.47583900000001\t33.77261\tSpringville town\tAL\tAlabama\tSt. Clair County\t3461\t39.2\t19.0\t10.8\t20951\t151658\t0.1646\t35146\tRomney\t35146\t0.010692098\t35146.0\n418\t-86.396624\t33.684472\tOdenville town\tAL\tAlabama\tSt. Clair County\t1392\t36.5\t9.0\t12.1\t17599\t103074\t0.1646\t35120\tRomney\t35120\t0.004300318\t35120.0\n419\t-86.266269\t33.559595\tPell City\tAL\tAlabama\tSt. Clair County\t11651\t40.8\t18.3\t13.5\t21901\t143942\t0.1646\t35128\tRomney\t35128\t0.035993537\t35128.0\n420\t-86.467135\t33.674304\tMargaret town\tAL\tAlabama\tSt. Clair County\t1787\t36.6\t8.9\t10.8\t18021\t106250\t0.1646\t35112\tRomney\t35112\t0.005520595\t35112.0\n421\t-86.50605\t33.71317\tArgo town\tAL\tAlabama\tSt. Clair County\t3479\t37.8\t10.2\t10.2\t18704\t112048\t0.1646\t35112\tRomney\t35112\t0.010747705\t35112.0\n422\t-86.68524599999999\t33.435293\tLake Purdy CDP\tAL\tAlabama\tShelby County\t7177\t32.4\t63.4\t8.8\t41335\t413454\t0.2162\t35242\tRomney\t35242\t0.022171969\t35242.0\n423\t-86.846018\t33.223009999999995\tAlabaster city\tAL\tAlabama\tShelby County\t28618\t34.5\t38.4\t7.3\t29599\t171383\t0.2162\t35114\tRomney\t35114\t0.08840984\t35114.0\n424\t-86.88049699999999\t33.081227\tWilton town\tAL\tAlabama\tShelby County\t649\t32.5\t11.8\t13.0\t15144\t85833\t0.2162\t35115\tRomney\t35115\t0.002004961\t35115.0\n425\t-86.65028000000001\t33.326146\tChelsea town\tAL\tAlabama\tShelby County\t4414\t35.3\t30.4\t7.5\t27041\t214486\t0.2162\t35043\tRomney\t35043\t0.013636209\t35043.0\n426\t-86.851795\t33.108596999999996\tMontevallo city\tAL\tAlabama\tShelby County\t5478\t30.8\t32.4\t14.0\t22296\t120349\t0.2162\t35115\tRomney\t35115\t0.016923234\t35115.0\n427\t-86.86200000000001\t33.286794\tHelena city\tAL\tAlabama\tShelby County\t14267\t34.5\t43.9\t6.2\t35804\t180945\t0.2162\t35080\tRomney\t35080\t0.044075169000000004\t35080.0\n428\t-86.606728\t33.192362\tColumbiana city\tAL\tAlabama\tShelby County\t3689\t37.0\t16.8\t12.2\t21266\t111771\t0.2162\t35051\tRomney\t35051\t0.01139646\t35051.0\n429\t-86.752685\t33.357824\tIndian Springs Village town\tAL\tAlabama\tShelby County\t2460\t41.1\t58.0\t7.6\t46102\t277038\t0.2162\t35124\tRomney\t35124\t0.0075997\t35124.0\n430\t-86.757785\t33.311432\tPelham city\tAL\tAlabama\tShelby County\t20237\t36.8\t40.2\t9.2\t31888\t170930\t0.2162\t35124\tRomney\t35124\t0.062518343\t35124.0\n431\t-86.698196\t33.402842\tMeadowbrook CDP\tAL\tAlabama\tShelby County\t6021\t41.5\t63.2\t8.3\t43722\t307270\t0.2162\t35242\tRomney\t35242\t0.018600728\t35242.0\n432\t-86.48645400000001\t33.235699\tWilsonville town\tAL\tAlabama\tShelby County\t1834\t41.1\t15.7\t9.9\t26107\t133898\t0.2162\t35186\tRomney\t35186\t0.005665791999999999\t35186.0\n433\t-86.74781\t33.126663\tCalera city\tAL\tAlabama\tShelby County\t7807\t37.7\t22.6\t9.2\t24849\t144444\t0.2162\t35040\tRomney\t35040\t0.024118234\t35040.0\n434\t-86.431893\t33.321199\tHarpersville town\tAL\tAlabama\tShelby County\t1852\t39.3\t12.1\t13.0\t18034\t67344\t0.2162\t35078\tRomney\t35078\t0.0057214\t35078.0\n435\t-86.373193\t33.399429\tVincent town\tAL\tAlabama\tShelby County\t2252\t41.0\t10.1\t11.8\t19888\t77179\t0.2162\t35178\tRomney\t35178\t0.006957123000000001\t35178.0\n436\t-88.313086\t32.869471999999995\tGeiger town\tAL\tAlabama\tSumter County\t145\t41.8\t9.0\t9.8\t13196\t51667\t0.7711\t35459\tRomney\t35459\t0.00044795\t35459.0\n437\t-88.375522\t32.441049\tCuba town\tAL\tAlabama\tSumter County\t275\t38.8\t16.8\t9.4\t18458\t73333\t0.7711\t36907\tRomney\t36907\t0.00084956\t36907.0\n438\t-88.31642099999999\t32.728771\tEmelle town\tAL\tAlabama\tSumter County\t29\t35.0\t11.8\t18.2\t13244\t50000\t0.7711\t35459\tRomney\t35459\t8.96e-05\t35459.0\n439\t-88.189044\t32.598215\tLivingston city\tAL\tAlabama\tSumter County\t2912\t27.4\t22.7\t15.5\t12982\t64318\t0.7711\t35470\tRomney\t35470\t0.008996067\t35470.0\n440\t-88.160791\t32.814956\tGainesville town\tAL\tAlabama\tSumter County\t210\t32.1\t11.1\t12.7\t13229\t52500\t0.7711\t35464\tRomney\t35464\t0.000648755\t35464.0\n441\t-88.293774\t32.500236\tYork city\tAL\tAlabama\tSumter County\t2596\t38.0\t14.3\t17.1\t12333\t66944\t0.7711\t36925\tRomney\t36925\t0.008019846\t36925.0\n442\t-88.126886\t32.691354\tEpes town\tAL\tAlabama\tSumter County\t203\t29.6\t18.1\t14.3\t12396\t48750\t0.7711\t35460\tRomney\t35460\t0.00062713\t35460.0\n443\t-86.265449\t33.192531\tMignon CDP\tAL\tAlabama\tTalladega County\t1336\t40.3\t8.3\t18.0\t17067\t59474\t0.4161\t35150\tRomney\t35150\t0.004127317\t35150.0\n444\t-86.442061\t33.119128\tTalladega Springs town\tAL\tAlabama\tTalladega County\t123\t40.3\t9.3\t13.7\t20317\t101563\t0.4161\t35143\tRomney\t35143\t0.000379985\t35143.0\n445\t-86.167907\t33.592313\tLincoln city\tAL\tAlabama\tTalladega County\t4881\t43.1\t15.4\t14.3\t20692\t86576\t0.4161\t35135\tRomney\t35135\t0.015078916000000001\t35135.0\n446\t-86.098703\t33.431188\tTalladega city\tAL\tAlabama\tTalladega County\t16287\t37.8\t16.1\t14.3\t16649\t84382\t0.4161\t35160\tRomney\t35160\t0.050315572999999995\t35160.0\n447\t-85.955959\t33.537112\tMunford CDP\tAL\tAlabama\tTalladega County\t2488\t38.0\t10.2\t15.4\t17501\t63551\t0.4161\t36268\tRomney\t36268\t0.0076862\t36268.0\n448\t-86.331977\t33.261994\tBon Air town\tAL\tAlabama\tTalladega County\t96\t30.0\t9.3\t10.3\t13116\t60000\t0.4161\t35044\tRomney\t35044\t0.000296574\t35044.0\n449\t-86.352791\t33.287136\tChildersburg city\tAL\tAlabama\tTalladega County\t5010\t37.3\t11.9\t18.5\t17227\t81289\t0.4161\t35044\tRomney\t35044\t0.015477437\t35044.0\n450\t-86.263559\t33.171762\tSylacauga city\tAL\tAlabama\tTalladega County\t12581\t40.7\t16.6\t18.3\t18303\t94952\t0.4161\t35150\tRomney\t35150\t0.038866594\t35150.0\n451\t-86.30189\t33.188031\tOak Grove town\tAL\tAlabama\tTalladega County\t445\t40.9\t9.1\t14.5\t18040\t98636\t0.4161\t35150\tRomney\t35150\t0.0013747420000000002\t35150.0\n452\t-86.036058\t33.389078000000005\tWaldo town\tAL\tAlabama\tTalladega County\t277\t44.3\t14.7\t9.6\t16257\t78750\t0.4161\t35160\tRomney\t35160\t0.0008557389999999999\t35160.0\n453\t-86.297459\t33.149333\tGantts Quarry town\tAL\tAlabama\tTalladega County\t0\t0.0\t0.0\t0.0\t0\t0\t0.4161\t35151\tRomney\t35151\t0.0\t35151.0\n454\t-85.814885\t32.883078000000005\tJacksons' Gap town\tAL\tAlabama\tTallapoosa County\t731\t42.2\t15.2\t13.8\t17262\t81538\t0.3352\t36861\tRomney\t36861\t0.002258285\t36861.0\n455\t-85.653689\t32.800342\tCamp Hill town\tAL\tAlabama\tTallapoosa County\t1193\t38.8\t8.0\t20.1\t15921\t54750\t0.3352\t36850\tRomney\t36850\t0.003685545\t36850.0\n456\t-85.78313\t33.084127\tGoldville town\tAL\tAlabama\tTallapoosa County\t37\t40.8\t7.7\t16.7\t16674\t75000\t0.3352\t36256\tRomney\t36256\t0.000114304\t36256.0\n457\t-85.63709200000001\t33.055673999999996\tDaviston town\tAL\tAlabama\tTallapoosa County\t269\t41.3\t3.2\t20.5\t16771\t65455\t0.3352\t36256\tRomney\t36256\t0.000831024\t36256.0\n458\t-85.780524\t33.027803000000006\tNew Site town\tAL\tAlabama\tTallapoosa County\t851\t40.9\t7.3\t14.9\t16584\t75357\t0.3352\t36256\tRomney\t36256\t0.002629002\t36256.0\n459\t-85.76713199999999\t32.832454\tDadeville city\tAL\tAlabama\tTallapoosa County\t2931\t41.3\t13.4\t18.5\t16215\t70909\t0.3352\t36853\tRomney\t36853\t0.009054764\t36853.0\n460\t-85.939462\t32.9306\tAlexander City\tAL\tAlabama\tTallapoosa County\t14205\t41.0\t18.0\t15.5\t19137\t89063\t0.3352\t35010\tRomney\t35010\t0.043883632\t35010.0\n461\t-87.68075\t33.244775\tCoker town\tAL\tAlabama\tTuscaloosa County\t801\t37.1\t11.0\t11.7\t15807\t101136\t0.4068\t35452\tRomney\t35452\t0.0024745360000000003\t35452.0\n462\t-87.23208199999999\t33.168154\tVance town\tAL\tAlabama\tTuscaloosa County\t1003\t34.5\t7.6\t13.9\t18589\t100368\t0.4068\t35490\tRomney\t35490\t0.003098577\t35490.0\n463\t-87.598435\t33.25492\tNorthport city\tAL\tAlabama\tTuscaloosa County\t21263\t36.0\t31.0\t10.3\t21855\t144902\t0.4068\t35473\tRomney\t35473\t0.06568797400000001\t35473.0\n464\t-87.528134\t33.234047\tTuscaloosa city\tAL\tAlabama\tTuscaloosa County\t81923\t31.3\t33.4\t12.7\t20623\t133017\t0.4068\t35403\tRomney\t35403\t0.253085447\t35403.0\n465\t-87.37713199999999\t33.165155\tCoaling city\tAL\tAlabama\tTuscaloosa County\t1265\t37.8\t13.1\t10.6\t20409\t102941\t0.4068\t35453\tRomney\t35453\t0.003907976\t35453.0\n466\t-87.138642\t33.281657\tLake View town\tAL\tAlabama\tTuscaloosa County\t1908\t36.6\t13.8\t10.0\t19996\t133451\t0.4068\t35111\tRomney\t35111\t0.005894401\t35111.0\n467\t-87.328928\t33.240701\tBrookwood town\tAL\tAlabama\tTuscaloosa County\t1795\t37.1\t7.9\t10.9\t17602\t82632\t0.4068\t35444\tRomney\t35444\t0.005545309\t35444.0\n468\t-87.482333\t33.229519\tHolt CDP\tAL\tAlabama\tTuscaloosa County\t3995\t33.7\t17.1\t10.9\t15277\t82368\t0.4068\t35404\tRomney\t35404\t0.012341788999999999\t35404.0\n469\t-87.620104\t33.922008\tEldridge town\tAL\tAlabama\tWalker County\t180\t41.7\t13.2\t12.2\t18694\t68750\t0.2294\t35554\tRomney\t35554\t0.000556076\t35554.0\n470\t-87.273173\t33.851003000000006\tJasper city\tAL\tAlabama\tWalker County\t13546\t43.6\t20.4\t11.6\t20518\t107473\t0.2294\t35501\tRomney\t35501\t0.041847777\t35501.0\n471\t-87.480962\t33.997504\tNauvoo town\tAL\tAlabama\tWalker County\t286\t40.0\t5.0\t13.2\t15544\t66429\t0.2294\t35578\tRomney\t35578\t0.000883542\t35578.0\n472\t-87.28021600000001\t33.732271999999995\tParrish town\tAL\tAlabama\tWalker County\t1249\t42.3\t5.0\t17.7\t16004\t58111\t0.2294\t35580\tRomney\t35580\t0.003858547\t35580.0\n473\t-87.192665\t33.761302\tCordova city\tAL\tAlabama\tWalker County\t2207\t43.3\t7.5\t14.7\t14434\t52986\t0.2294\t35550\tRomney\t35550\t0.006818105\t35550.0\n474\t-87.52419599999999\t33.896175\tCarbon Hill city\tAL\tAlabama\tWalker County\t1901\t42.5\t9.7\t15.9\t14301\t60246\t0.2294\t35549\tRomney\t35549\t0.005872776\t35549.0\n475\t-87.556946\t33.902831\tKansas town\tAL\tAlabama\tWalker County\t234\t43.5\t12.7\t17.3\t16586\t64583\t0.2294\t35549\tRomney\t35549\t0.000722898\t35549.0\n476\t-87.084903\t33.729328\tDora city\tAL\tAlabama\tWalker County\t2457\t40.2\t7.2\t14.3\t15452\t70263\t0.2294\t35148\tRomney\t35148\t0.007590431999999999\t35148.0\n477\t-87.02974300000001\t33.750686\tSumiton city\tAL\tAlabama\tWalker County\t2775\t40.8\t8.4\t10.3\t17121\t81641\t0.2294\t35148\tRomney\t35148\t0.008572831999999999\t35148.0\n478\t-87.083382\t33.822528000000005\tSipsey town\tAL\tAlabama\tWalker County\t519\t35.7\t4.3\t20.8\t15874\t54250\t0.2294\t35584\tRomney\t35584\t0.001603351\t35584.0\n479\t-87.389044\t33.714171\tOakman town\tAL\tAlabama\tWalker County\t978\t39.6\t8.1\t11.6\t15682\t70000\t0.2294\t35579\tRomney\t35579\t0.003021344\t35579.0\n480\t-88.319654\t31.625932000000002\tMillry town\tAL\tAlabama\tWashington County\t575\t40.2\t9.6\t12.3\t17181\t64706\t0.3387\t36558\tRomney\t36558\t0.0017763529999999998\t36558.0\n481\t-88.24628100000001\t31.469053000000002\tChatom town\tAL\tAlabama\tWashington County\t1257\t38.5\t13.0\t12.6\t19602\t92105\t0.3387\t36518\tRomney\t36518\t0.003883261\t36518.0\n482\t-88.028339\t31.264974\tMcIntosh town\tAL\tAlabama\tWashington County\t232\t32.3\t5.1\t15.5\t13328\t73125\t0.3387\t36553\tRomney\t36553\t0.00071672\t36553.0\n483\t-87.296539\t32.000888\tCamden town\tAL\tAlabama\tWilcox County\t2280\t38.6\t16.3\t26.1\t15610\t88387\t0.7426\t36726\tRomney\t36726\t0.007043624\t36726.0\n484\t-87.085235\t31.92162\tOak Hill town\tAL\tAlabama\tWilcox County\t35\t42.5\t13.0\t25.0\t11224\t12500\t0.7426\t36768\tRomney\t36768\t0.000108126\t36768.0\n485\t-86.98891\t31.872034999999997\tPine Apple town\tAL\tAlabama\tWilcox County\t162\t40.6\t13.8\t25.6\t11282\t37500\t0.7426\t36768\tRomney\t36768\t0.000500468\t36768.0\n486\t-87.587172\t31.985974\tPine Hill town\tAL\tAlabama\tWilcox County\t906\t36.0\t7.8\t27.6\t13784\t66364\t0.7426\t36769\tRomney\t36769\t0.0027989140000000004\t36769.0\n487\t-87.4819\t31.962238\tYellow Bluff town\tAL\tAlabama\tWilcox County\t169\t29.3\t4.4\t39.5\t8024\t48333\t0.7426\t36769\tRomney\t36769\t0.0005220930000000001\t36769.0\n488\t-87.40308399999999\t34.149477000000005\tDouble Springs town\tAL\tAlabama\tWinston County\t978\t43.0\t9.4\t17.7\t17220\t73250\t0.1322\t35553\tRomney\t35553\t0.003021344\t35553.0\n489\t-87.176587\t34.201609999999995\tAddison town\tAL\tAlabama\tWinston County\t755\t41.1\t7.6\t13.5\t16934\t84167\t0.1322\t35540\tRomney\t35540\t0.0023324279999999997\t35540.0\n490\t-87.547487\t34.042586\tLynn town\tAL\tAlabama\tWinston County\t569\t40.8\t5.1\t19.6\t16753\t54643\t0.1322\t35575\tRomney\t35575\t0.001757817\t35575.0\n491\t-87.208797\t34.088933000000004\tArley town\tAL\tAlabama\tWinston County\t363\t41.3\t9.9\t13.7\t18962\t85000\t0.1322\t35541\tRomney\t35541\t0.001121419\t35541.0\n492\t-87.60162\t34.090477\tNatural Bridge town\tAL\tAlabama\tWinston County\t27\t36.3\t0.0\t18.2\t15173\t60000\t0.1322\t35575\tRomney\t35575\t8.340000000000001e-05\t35575.0\n493\t-87.61459599999999\t34.238285\tHaleyville city\tAL\tAlabama\tWinston County\t3713\t43.8\t11.6\t16.8\t18425\t80194\t0.1322\t35565\tRomney\t35565\t0.011470603999999999\t35565.0\n494\t-109.550693\t35.701565\tGanado CDP\tAZ\tArizona\tApache County\t1618\t26.1\t33.7\t13.0\t14332\t34643\t0.6616\t86505\tRomney\t86505\t0.0030390659999999996\t86505.0\n495\t-109.29571000000001\t34.105278000000006\tEagar town\tAZ\tArizona\tApache County\t4192\t33.6\t18.8\t12.5\t16537\t112637\t0.6616\t85925\tRomney\t85925\t0.007873774\t85925.0\n496\t-109.379098\t34.510421\tSt. Johns city\tAZ\tArizona\tApache County\t3362\t31.3\t22.6\t14.3\t15227\t85316\t0.6616\t85936\tRomney\t85936\t0.006314797\t85936.0\n497\t-109.8473\t34.096447999999995\tMcNary CDP\tAZ\tArizona\tApache County\t397\t19.8\t1.1\t26.4\t3866\t27500\t0.6616\t85926\tRomney\t85926\t0.000745679\t85926.0\n498\t-109.46149399999999\t36.504311\tRound Rock CDP\tAZ\tArizona\tApache County\t655\t23.8\t4.5\t42.8\t4803\t33750\t0.6616\t86547\tRomney\t86547\t0.0012302769999999999\t86547.0\n499\t-109.07524199999999\t36.922025\tTeec Nos Pos CDP\tAZ\tArizona\tApache County\t856\t26.6\t4.7\t35.6\t7872\t41923\t0.6616\t86514\tRomney\t86514\t0.0016078129999999998\t86514.0\n500\t-109.87951699999999\t36.820654\tDennehotso CDP\tAZ\tArizona\tApache County\t757\t24.9\t5.1\t32.0\t7420\t40000\t0.6616\t86535\tRomney\t86535\t0.001421862\t86535.0\n501\t-109.15394199999999\t35.892337\tSawmill CDP\tAZ\tArizona\tApache County\t635\t26.8\t7.6\t39.2\t7663\t36944\t0.6616\t86549\tRomney\t86549\t0.0011927110000000002\t86549.0\n502\t-109.62933799999999\t36.719263\tRock Point CDP\tAZ\tArizona\tApache County\t765\t24.5\t18.2\t23.0\t9319\t31750\t0.6616\t86545\tRomney\t86545\t0.001436889\t86545.0\n503\t-109.22675\t36.411134000000004\tLukachukai CDP\tAZ\tArizona\tApache County\t1652\t25.9\t6.7\t45.6\t5129\t22045\t0.6616\t86507\tRomney\t86507\t0.003102928\t86507.0\n504\t-109.47272099999999\t35.91552\tNazlini CDP\tAZ\tArizona\tApache County\t417\t24.2\t3.4\t55.9\t5278\t29375\t0.6616\t86540\tRomney\t86540\t0.000783245\t86540.0\n505\t-109.215705\t36.303221\tTsaile CDP\tAZ\tArizona\tApache County\t1132\t23.8\t11.6\t29.9\t8802\t31250\t0.6616\t86556\tRomney\t86556\t0.002126219\t86556.0\n506\t-109.298803\t34.155865000000006\tSpringerville town\tAZ\tArizona\tApache County\t2036\t34.5\t15.6\t12.5\t15540\t103825\t0.6616\t85925\tRomney\t85925\t0.00382419\t85925.0\n507\t-109.57953700000002\t36.150307\tChinle CDP\tAZ\tArizona\tApache County\t5678\t24.0\t16.6\t37.0\t10150\t36552\t0.6616\t86503\tRomney\t86503\t0.010664906000000002\t86503.0\n508\t-109.382923\t36.966091999999996\tRed Mesa CDP\tAZ\tArizona\tApache County\t250\t25.7\t10.2\t31.4\t7830\t25000\t0.6616\t86514\tRomney\t86514\t0.000469571\t86514.0\n509\t-109.09631999999999\t35.660603\tSt. Michaels CDP\tAZ\tArizona\tApache County\t1356\t27.0\t14.2\t20.9\t14207\t55600\t0.6616\t86515\tRomney\t86515\t0.002546955\t86515.0\n510\t-109.068528\t35.746643\tFort Defiance CDP\tAZ\tArizona\tApache County\t4142\t26.5\t18.1\t26.9\t14377\t51757\t0.6616\t86515\tRomney\t86515\t0.007779859\t86515.0\n511\t-109.064062\t35.670359000000005\tWindow Rock CDP\tAZ\tArizona\tApache County\t3137\t27.3\t30.1\t18.8\t15483\t81406\t0.6616\t86515\tRomney\t86515\t0.005892181999999999\t86515.0\n512\t-109.6248\t35.753458\tBurnside CDP\tAZ\tArizona\tApache County\t669\t24.1\t15.5\t13.9\t11909\t31875\t0.6616\t86505\tRomney\t86505\t0.001256573\t86505.0\n513\t-109.86943000000001\t36.410765000000005\tRough Rock CDP\tAZ\tArizona\tApache County\t490\t23.4\t8.3\t54.1\t6435\t50000\t0.6616\t86538\tRomney\t86538\t0.00092036\t86538.0\n514\t-109.627288\t36.353088\tMany Farms CDP\tAZ\tArizona\tApache County\t1648\t24.0\t17.6\t29.8\t11540\t41250\t0.6616\t86538\tRomney\t86538\t0.003095415\t86538.0\n515\t-109.22376499999999\t35.271642\tHouck CDP\tAZ\tArizona\tApache County\t1155\t25.1\t0.9\t30.6\t7358\t32727\t0.6616\t86506\tRomney\t86506\t0.00216942\t86506.0\n516\t-109.850356\t35.753434999999996\tSteamboat CDP\tAZ\tArizona\tApache County\t249\t28.0\t5.9\t40.3\t7202\t26250\t0.6616\t86505\tRomney\t86505\t0.00046769300000000004\t86505.0\n517\t-109.933093\t31.343078000000002\tNaco CDP\tAZ\tArizona\tCochise County\t860\t39.9\t19.5\t10.0\t13672\t73750\t0.3769\t85603\tRomney\t85603\t0.001615326\t85603.0\n518\t-110.21579799999999\t31.452106\tSierra Vista Southeast CDP\tAZ\tArizona\tCochise County\t17527\t42.9\t27.1\t6.2\t25167\t117650\t0.3769\t85615\tRomney\t85615\t0.032920714\t85615.0\n519\t-109.537279\t31.349507\tDouglas city\tAZ\tArizona\tCochise County\t15474\t30.2\t11.4\t13.1\t13052\t74941\t0.3769\t85607\tRomney\t85607\t0.029064593\t85607.0\n520\t-109.566348\t31.361472999999997\tPirtleville CDP\tAZ\tArizona\tCochise County\t1830\t29.3\t6.3\t14.0\t9485\t53611\t0.3769\t85607\tRomney\t85607\t0.003437263\t85607.0\n521\t-110.063492\t31.718283000000003\tTombstone city\tAZ\tArizona\tCochise County\t1827\t56.6\t15.6\t7.0\t17160\t94919\t0.3769\t85638\tRomney\t85638\t0.003431628\t85638.0\n522\t-110.225048\t31.899351\tSt. David CDP\tAZ\tArizona\tCochise County\t2146\t51.1\t20.0\t9.3\t15973\t91932\t0.3769\t85630\tRomney\t85630\t0.004030801\t85630.0\n523\t-110.339621\t31.701208\tWhetstone CDP\tAZ\tArizona\tCochise County\t3611\t44.9\t12.5\t11.4\t17550\t91567\t0.3769\t85616\tRomney\t85616\t0.00678249\t85616.0\n524\t-110.314755\t31.562656\tSierra Vista city\tAZ\tArizona\tCochise County\t43768\t35.6\t29.9\t5.9\t25540\t125974\t0.3769\t85613\tRomney\t85613\t0.08220880900000001\t85613.0\n525\t-110.323218\t31.907459999999997\tBenson city\tAZ\tArizona\tCochise County\t5790\t50.3\t16.4\t15.7\t20223\t67732\t0.3769\t85602\tRomney\t85602\t0.010875273999999999\t85602.0\n526\t-110.34196499999999\t31.630926000000002\tHuachuca City town\tAZ\tArizona\tCochise County\t2449\t38.8\t11.1\t12.0\t16991\t75672\t0.3769\t85616\tRomney\t85616\t0.004599922\t85616.0\n527\t-109.83525800000001\t32.251456\tWillcox city\tAZ\tArizona\tCochise County\t4244\t39.0\t13.7\t11.6\t16200\t68821\t0.3769\t85643\tRomney\t85643\t0.007971445\t85643.0\n528\t-109.918656\t31.446715\tBisbee city\tAZ\tArizona\tCochise County\t6591\t45.2\t27.0\t9.9\t20267\t82892\t0.3769\t85603\tRomney\t85603\t0.012379781000000001\t85603.0\n529\t-111.97543200000001\t35.294831\tParks CDP\tAZ\tArizona\tCoconino County\t1374\t45.2\t35.3\t6.8\t23030\t197750\t0.563\t86018\tRomney\t86018\t0.002580765\t86018.0\n530\t-112.692545\t36.229805999999996\tSupai CDP\tAZ\tArizona\tCoconino County\t0\t0.0\t0.0\t0.0\t0\t0\t0.563\t86435\tRomney\t86435\t0.0\t86435.0\n531\t-112.134266\t35.976254\tTusayan CDP\tAZ\tArizona\tCoconino County\t627\t31.2\t29.8\t8.8\t22697\t33333\t0.563\t86023\tRomney\t86023\t0.001177685\t86023.0\n532\t-110.966177\t36.320695\tTonalea CDP\tAZ\tArizona\tCoconino County\t642\t24.0\t3.9\t38.0\t8909\t23333\t0.563\t86044\tRomney\t86044\t0.0012058589999999999\t86044.0\n533\t-111.459747\t36.903132\tPage city\tAZ\tArizona\tCoconino County\t7619\t33.9\t22.7\t9.8\t26758\t100610\t0.563\t86040\tRomney\t86040\t0.014310659\t86040.0\n534\t-111.631855\t34.938119\tMunds Park CDP\tAZ\tArizona\tCoconino County\t1585\t54.1\t31.1\t6.5\t27383\t181731\t0.563\t86017\tRomney\t86017\t0.0029770829999999997\t86017.0\n535\t-111.22064099999999\t36.112598\tMoenkopi CDP\tAZ\tArizona\tCoconino County\t990\t34.2\t10.1\t15.7\t16739\t94545\t0.563\t86045\tRomney\t86045\t0.001859503\t86045.0\n536\t-111.64728400000001\t36.613074\tBitter Springs CDP\tAZ\tArizona\tCoconino County\t607\t23.9\t0.0\t54.7\t9869\t38214\t0.563\t86036\tRomney\t86036\t0.001140119\t86036.0\n537\t-112.15648799999998\t36.049222\tGrand Canyon Village CDP\tAZ\tArizona\tCoconino County\t1655\t38.7\t37.2\t4.2\t31419\t26389\t0.563\t86023\tRomney\t86023\t0.003108563\t86023.0\n538\t-111.00191000000001\t35.295918\tLeupp CDP\tAZ\tArizona\tCoconino County\t1084\t27.0\t4.7\t19.7\t9494\t58810\t0.563\t86035\tRomney\t86035\t0.002036062\t86035.0\n539\t-111.649546\t35.091854\tMountainaire CDP\tAZ\tArizona\tCoconino County\t1051\t36.8\t44.9\t6.8\t28247\t150385\t0.563\t86017\tRomney\t86017\t0.0019740779999999998\t86017.0\n540\t-112.52083700000001\t36.966356\tFredonia town\tAZ\tArizona\tCoconino County\t1139\t35.1\t12.8\t12.3\t14680\t75455\t0.563\t86022\tRomney\t86022\t0.002139367\t86022.0\n541\t-112.183217\t35.247677\tWilliams city\tAZ\tArizona\tCoconino County\t3186\t37.2\t20.0\t10.2\t19734\t114011\t0.563\t86046\tRomney\t86046\t0.005984218\t86046.0\n542\t-111.106976\t36.591826\tKaibito CDP\tAZ\tArizona\tCoconino County\t1869\t21.7\t2.8\t40.2\t10909\t45000\t0.563\t86053\tRomney\t86053\t0.003510516\t86053.0\n543\t-111.42704499999999\t35.855058\tCameron CDP\tAZ\tArizona\tCoconino County\t1115\t26.5\t5.5\t19.9\t8926\t21413\t0.563\t86016\tRomney\t86016\t0.002094289\t86016.0\n544\t-111.433549\t36.870171\tLechee CDP\tAZ\tArizona\tCoconino County\t1833\t20.4\t6.1\t25.0\t12206\t44773\t0.563\t86040\tRomney\t86040\t0.003442898\t86040.0\n545\t-111.692753\t35.094877000000004\tKachina Village CDP\tAZ\tArizona\tCoconino County\t2691\t36.0\t45.6\t5.5\t27666\t170474\t0.563\t86017\tRomney\t86017\t0.005054467\t86017.0\n546\t-111.617346\t35.186440000000005\tFlagstaff city\tAZ\tArizona\tCoconino County\t60588\t28.7\t43.3\t8.0\t24550\t205374\t0.563\t86001\tRomney\t86001\t0.113801575\t86001.0\n547\t-111.24686100000001\t36.124955\tTuba City CDP\tAZ\tArizona\tCoconino County\t9184\t24.7\t20.7\t17.7\t15802\t36230\t0.563\t86045\tRomney\t86045\t0.017250176000000002\t86045.0\n548\t-110.750525\t33.386648\tGlobe city\tAZ\tArizona\tGila County\t7411\t40.9\t22.0\t11.9\t21700\t82633\t0.3564\t85501\tRomney\t85501\t0.013919975\t85501.0\n549\t-111.300425\t33.836529999999996\tTonto Basin CDP\tAZ\tArizona\tGila County\t911\t63.1\t7.0\t7.3\t16932\t78125\t0.3564\t85553\tRomney\t85553\t0.001711118\t85553.0\n550\t-111.31952700000001\t34.243292\tPayson town\tAZ\tArizona\tGila County\t14492\t52.4\t19.7\t10.3\t23701\t131474\t0.3564\t85541\tRomney\t85541\t0.027220117000000002\t85541.0\n551\t-110.781101\t32.999112\tHayden town\tAZ\tArizona\tGila County\t912\t34.5\t4.2\t18.9\t10615\t25673\t0.3564\t85235\tRomney\t85235\t0.0017129970000000002\t85235.0\n552\t-110.03191000000001\t33.78337\tCanyon Day CDP\tAZ\tArizona\tGila County\t1165\t24.8\t3.4\t33.6\t9745\t26923\t0.3564\t85941\tRomney\t85941\t0.0021882029999999997\t85941.0\n553\t-111.500997\t34.400045\tStrawberry CDP\tAZ\tArizona\tGila County\t1111\t59.7\t21.5\t7.2\t28065\t154830\t0.3564\t85544\tRomney\t85544\t0.002086775\t85544.0\n554\t-110.872973\t33.394360999999996\tMiami town\tAZ\tArizona\tGila County\t1650\t37.7\t5.1\t16.0\t16952\t47654\t0.3564\t85539\tRomney\t85539\t0.003099171\t85539.0\n555\t-111.45606000000001\t34.378783\tPine CDP\tAZ\tArizona\tGila County\t2177\t59.4\t28.7\t7.6\t30913\t170833\t0.3564\t85544\tRomney\t85544\t0.004089028\t85544.0\n556\t-110.81505\t33.402969\tCentral Heights-Midland City CDP\tAZ\tArizona\tGila County\t2713\t40.2\t10.9\t14.1\t17943\t65732\t0.3564\t85539\tRomney\t85539\t0.005095789\t85539.0\n557\t-110.948071\t34.121855\tYoung CDP\tAZ\tArizona\tGila County\t608\t53.3\t26.2\t8.6\t15880\t117813\t0.3564\t85554\tRomney\t85554\t0.001141998\t85554.0\n558\t-111.25441799999999\t34.251737\tSun Valley CDP\tAZ\tArizona\tGila County\t1671\t53.8\t23.3\t8.2\t25833\t162705\t0.3564\t85541\tRomney\t85541\t0.003138615\t85541.0\n559\t-110.841975\t33.406279\tClaypool CDP\tAZ\tArizona\tGila County\t1820\t41.4\t6.5\t11.9\t20533\t62647\t0.3564\t85539\tRomney\t85539\t0.00341848\t85539.0\n560\t-111.28931999999999\t34.101512\tGisela CDP\tAZ\tArizona\tGila County\t596\t54.8\t8.7\t9.4\t20639\t88214\t0.3564\t85541\tRomney\t85541\t0.001119458\t85541.0\n561\t-110.76168899999999\t32.990065\tWinkelman town\tAZ\tArizona\tGila County\t427\t40.6\t2.8\t11.3\t14933\t36923\t0.3564\t85235\tRomney\t85235\t0.000802028\t85235.0\n562\t-110.44470700000001\t33.302234000000006\tPeridot CDP\tAZ\tArizona\tGila County\t1519\t21.9\t5.0\t40.2\t7578\t37125\t0.3564\t85542\tRomney\t85542\t0.0028531159999999997\t85542.0\n563\t-110.465507\t33.349349\tSan Carlos CDP\tAZ\tArizona\tGila County\t3949\t24.9\t4.2\t47.6\t7148\t28068\t0.3564\t85542\tRomney\t85542\t0.00741735\t85542.0\n564\t-109.75478799999999\t32.837715\tThatcher town\tAZ\tArizona\tGraham County\t4762\t27.8\t23.9\t14.7\t16747\t103543\t0.3031\t85552\tRomney\t85552\t0.008944397\t85552.0\n565\t-109.83146299999999\t32.889144\tPima town\tAZ\tArizona\tGraham County\t2372\t31.4\t16.3\t16.6\t13118\t86803\t0.3031\t85543\tRomney\t85543\t0.004455294\t85543.0\n566\t-109.699503\t32.832498\tSafford city\tAZ\tArizona\tGraham County\t9590\t34.7\t17.9\t14.6\t18110\t96580\t0.3031\t85546\tRomney\t85546\t0.01801276\t85546.0\n567\t-109.713812\t32.734224\tSwift Trail Junction CDP\tAZ\tArizona\tGraham County\t3044\t34.9\t6.2\t15.1\t16668\t86176\t0.3031\t85546\tRomney\t85546\t0.005717501999999999\t85546.0\n568\t-109.094168\t32.73894\tDuncan town\tAZ\tArizona\tGreenlee County\t734\t37.3\t13.3\t14.1\t13140\t54792\t0.4387\t85534\tRomney\t85534\t0.0013786620000000001\t85534.0\n569\t-109.28811\t33.025093\tClifton town\tAZ\tArizona\tGreenlee County\t2516\t33.8\t12.2\t13.9\t18480\t65735\t0.4387\t85540\tRomney\t85540\t0.0047257670000000005\t85540.0\n570\t-109.330052\t33.052506\tMorenci CDP\tAZ\tArizona\tGreenlee County\t1872\t31.4\t24.4\t10.4\t23806\t117708\t0.4387\t85540\tRomney\t85540\t0.003516151\t85540.0\n571\t-114.26704299999999\t34.168013\tBluewater CDP\tAZ\tArizona\tLa Paz County\t696\t52.5\t10.9\t4.6\t19253\t76613\t0.3278\t85344\tRomney\t85344\t0.001307287\t85344.0\n572\t-113.605053\t33.780646000000004\tSalome CDP\tAZ\tArizona\tLa Paz County\t1828\t57.4\t7.6\t13.0\t17103\t62903\t0.3278\t85348\tRomney\t85348\t0.003433506\t85348.0\n573\t-113.543917\t33.832533000000005\tWenden CDP\tAZ\tArizona\tLa Paz County\t627\t57.0\t9.6\t11.5\t17167\t57083\t0.3278\t85357\tRomney\t85357\t0.001177685\t85357.0\n574\t-114.02356699999999\t33.940584\tBouse CDP\tAZ\tArizona\tLa Paz County\t673\t62.1\t7.0\t10.3\t16503\t62206\t0.3278\t85325\tRomney\t85325\t0.001264086\t85325.0\n575\t-114.176023\t34.240590000000005\tParker Strip CDP\tAZ\tArizona\tLa Paz County\t3172\t55.3\t11.1\t4.8\t24355\t90820\t0.3278\t85344\tRomney\t85344\t0.005957921999999999\t85344.0\n576\t-114.21704799999999\t33.667511\tQuartzsite town\tAZ\tArizona\tLa Paz County\t3661\t69.7\t12.3\t8.0\t21603\t55654\t0.3278\t85346\tRomney\t85346\t0.006876404\t85346.0\n577\t-114.488243\t33.617533\tEhrenberg CDP\tAZ\tArizona\tLa Paz County\t1359\t40.1\t5.1\t6.2\t22152\t40714\t0.3278\t85334\tRomney\t85334\t0.00255259\t85334.0\n578\t-114.21698899999998\t34.019133000000004\tParker town\tAZ\tArizona\tLa Paz County\t3524\t31.6\t18.4\t6.9\t18970\t106333\t0.3278\t85344\tRomney\t85344\t0.006619079\t85344.0\n579\t-114.67736299999999\t33.371258000000005\tCibola CDP\tAZ\tArizona\tLa Paz County\t190\t42.5\t15.3\t15.0\t15907\t93182\t0.3278\t85328\tRomney\t85328\t0.000356874\t85328.0\n580\t-114.404399\t33.99217\tPoston CDP\tAZ\tArizona\tLa Paz County\t387\t27.8\t3.8\t10.8\t11753\t22500\t0.3278\t85344\tRomney\t85344\t0.000726897\t85344.0\n581\t-112.22026000000001\t33.663053999999995\tGlendale city\tAZ\tArizona\tMaricopa County\t240531\t32.1\t23.4\t9.6\t24938\t123401\t0.4361\t85382\tRomney\t85382\t0.45178594200000005\t85382.0\n582\t-112.40881999999999\t33.351648\tGoodyear city\tAZ\tArizona\tMaricopa County\t69311\t38.2\t27.1\t7.4\t29575\t152022\t0.4361\t85338\tRomney\t85338\t0.13018586099999999\t85338.0\n583\t-112.632442\t33.542962\tBuckeye town\tAZ\tArizona\tMaricopa County\t32281\t36.8\t15.6\t9.0\t19959\t106067\t0.4361\t85355\tRomney\t85355\t0.060632940999999996\t85355.0\n584\t-111.75325500000001\t33.331909\tGilbert town\tAZ\tArizona\tMaricopa County\t176564\t31.5\t36.9\t6.6\t30661\t186538\t0.4361\t85296\tRomney\t85296\t0.33163764\t85296.0\n585\t-112.327584\t33.591418\tEl Mirage city\tAZ\tArizona\tMaricopa County\t31819\t34.2\t20.3\t11.3\t17943\t90723\t0.4361\t85335\tRomney\t85335\t0.059765173\t85335.0\n586\t-111.742047\t33.604104\tFountain Hills town\tAZ\tArizona\tMaricopa County\t25481\t49.2\t40.7\t6.1\t41964\t236726\t0.4361\t85268\tRomney\t85268\t0.047860598\t85268.0\n587\t-111.931776\t33.388356\tTempe city\tAZ\tArizona\tMaricopa County\t171055\t31.2\t42.2\t9.2\t28832\t136086\t0.4361\t85282\tRomney\t85282\t0.321290164\t85282.0\n588\t-112.257327\t33.448714\tTolleson city\tAZ\tArizona\tMaricopa County\t6715\t30.6\t13.9\t11.5\t16315\t76328\t0.4361\t85353\tRomney\t85353\t0.012612689\t85353.0\n589\t-112.360502\t33.383776\tAvondale city\tAZ\tArizona\tMaricopa County\t72486\t30.4\t19.4\t8.9\t23571\t132228\t0.4361\t85338\tRomney\t85338\t0.136149419\t85338.0\n590\t-111.869881\t33.216961\tSun Lakes CDP\tAZ\tArizona\tMaricopa County\t16370\t70.0\t35.9\t14.4\t42211\t156161\t0.4361\t85248\tRomney\t85248\t0.030747537000000002\t85248.0\n591\t-111.85837\t33.287303\tChandler city\tAZ\tArizona\tMaricopa County\t247921\t32.7\t34.5\t7.7\t30843\t152167\t0.4361\t85225\tRomney\t85225\t0.465666474\t85225.0\n592\t-111.64586499999999\t33.242048\tQueen Creek town\tAZ\tArizona\tMaricopa County\t15949\t35.0\t21.8\t6.2\t25715\t198065\t0.4361\t85242\tRomney\t85242\t0.029956779\t85242.0\n593\t-111.916133\t33.823479999999996\tCarefree town\tAZ\tArizona\tMaricopa County\t2969\t61.1\t51.1\t5.9\t72802\t476774\t0.4361\t85262\tRomney\t85262\t0.00557663\t85262.0\n594\t-112.083249\t33.879587\tNew River CDP\tAZ\tArizona\tMaricopa County\t37227\t38.9\t27.8\t6.1\t32525\t146168\t0.4361\t85087\tRomney\t85087\t0.069922942\t85087.0\n595\t-111.677255\t33.724903999999995\tRio Verde CDP\tAZ\tArizona\tMaricopa County\t1937\t64.1\t57.6\t5.7\t67848\t383171\t0.4361\t85263\tRomney\t85263\t0.003638239\t85263.0\n596\t-112.358049\t33.499431\tLitchfield Park city\tAZ\tArizona\tMaricopa County\t5337\t48.3\t49.5\t6.9\t47147\t203960\t0.4361\t85309\tRomney\t85309\t0.010024411\t85309.0\n597\t-111.973197\t33.843777\tCave Creek town\tAZ\tArizona\tMaricopa County\t5738\t48.2\t44.2\t5.9\t49420\t319275\t0.4361\t85331\tRomney\t85331\t0.010777603\t85331.0\n598\t-112.70666499999999\t32.958073999999996\tGila Bend town\tAZ\tArizona\tMaricopa County\t2248\t34.0\t9.3\t15.5\t13597\t41136\t0.4361\t85337\tRomney\t85337\t0.004222386\t85337.0\n599\t-112.35758899999999\t33.6694\tSun City West CDP\tAZ\tArizona\tMaricopa County\t27729\t76.6\t32.9\t11.6\t36729\t148495\t0.4361\t85375\tRomney\t85375\t0.052082985\t85375.0\n600\t-111.86506100000001\t33.686328\tScottsdale city\tAZ\tArizona\tMaricopa County\t238982\t44.1\t48.4\t7.6\t50172\t251505\t0.4361\t85255\tRomney\t85255\t0.44887647799999997\t85255.0\n601\t-112.297537\t33.923169\tPeoria city\tAZ\tArizona\tMaricopa County\t147814\t36.7\t24.9\t7.7\t29249\t143509\t0.4361\t85087\tRomney\t85087\t0.277636925\t85087.0\n602\t-111.96310600000001\t33.3668\tGuadalupe town\tAZ\tArizona\tMaricopa County\t7159\t27.6\t6.3\t15.0\t10032\t64231\t0.4361\t85283\tRomney\t85283\t0.013446646999999999\t85283.0\n603\t-112.458528\t33.667454\tSurprise city\tAZ\tArizona\tMaricopa County\t93738\t47.3\t24.0\t8.8\t27859\t130418\t0.4361\t85379\tRomney\t85379\t0.176066747\t85379.0\n604\t-112.282374\t33.615396000000004\tSun City CDP\tAZ\tArizona\tMaricopa County\t39462\t75.3\t23.3\t11.0\t33087\t99135\t0.4361\t85351\tRomney\t85351\t0.074120911\t85351.0\n605\t-112.08036100000001\t33.558346\tPhoenix city\tAZ\tArizona\tMaricopa County\t1579928\t31.9\t24.8\t10.6\t24816\t117170\t0.4361\t85021\tRomney\t85021\t2.9675562\t85021.0\n606\t-111.72829499999999\t33.40742\tMesa city\tAZ\tArizona\tMaricopa County\t471764\t33.4\t24.9\t8.7\t25927\t122209\t0.4361\t85206\tRomney\t85206\t0.8861075840000001\t85206.0\n607\t-112.305553\t33.586658\tYoungtown town\tAZ\tArizona\tMaricopa County\t4041\t67.0\t15.3\t13.3\t25915\t75655\t0.4361\t85363\tRomney\t85363\t0.0075901530000000005\t85363.0\n608\t-111.959584\t33.543504999999996\tParadise Valley town\tAZ\tArizona\tMaricopa County\t14124\t49.7\t72.8\t6.0\t86481\t814869\t0.4361\t85253\tRomney\t85253\t0.026528907999999997\t85253.0\n609\t-112.75451899999999\t33.968407\tWickenburg town\tAZ\tArizona\tMaricopa County\t6375\t49.2\t21.4\t7.5\t22738\t116760\t0.4361\t85390\tRomney\t85390\t0.011974071000000001\t85390.0\n610\t-114.26778200000001\t35.603858\tDolan Springs CDP\tAZ\tArizona\tMohave County\t2302\t59.1\t6.9\t25.9\t14562\t59402\t0.2777\t86441\tRomney\t86441\t0.0043238140000000005\t86441.0\n611\t-114.02715500000001\t35.273262\tNew Kingman-Butler CDP\tAZ\tArizona\tMohave County\t16193\t43.3\t4.6\t15.9\t16026\t66779\t0.2777\t86401\tRomney\t86401\t0.030415081\t86401.0\n612\t-114.374742\t34.552428000000006\tDesert Hills CDP\tAZ\tArizona\tMohave County\t2808\t57.1\t10.1\t16.2\t19987\t73035\t0.2777\t86404\tRomney\t86404\t0.005274226\t86404.0\n613\t-114.588955\t34.858897\tArizona Village CDP\tAZ\tArizona\tMohave County\t416\t38.4\t11.2\t14.1\t19575\t72857\t0.2777\t86440\tRomney\t86440\t0.0007813669999999999\t86440.0\n614\t-114.01644099999999\t35.211559\tKingman city\tAZ\tArizona\tMohave County\t26038\t40.9\t16.4\t11.0\t21540\t117051\t0.2777\t86401\tRomney\t86401\t0.048906804000000005\t86401.0\n615\t-112.983251\t36.977094\tColorado City town\tAZ\tArizona\tMohave County\t4815\t13.7\t6.8\t8.6\t7643\t137025\t0.2777\t86021\tRomney\t86021\t0.009043946\t86021.0\n616\t-114.314777\t34.502552\tLake Havasu City\tAZ\tArizona\tMohave County\t54593\t51.1\t14.9\t9.4\t24822\t133320\t0.2777\t86403\tRomney\t86403\t0.102541252\t86403.0\n617\t-114.568579\t34.962115000000004\tMesquite Creek CDP\tAZ\tArizona\tMohave County\t309\t51.7\t10.6\t5.8\t24448\t129861\t0.2777\t86426\tRomney\t86426\t0.00058039\t86426.0\n618\t-112.542225\t36.918703\tKaibab CDP\tAZ\tArizona\tMohave County\t372\t24.0\t8.9\t12.4\t15030\t94375\t0.2777\t86022\tRomney\t86022\t0.0006987219999999999\t86022.0\n619\t-113.42928300000001\t35.530747999999996\tPeach Springs CDP\tAZ\tArizona\tMohave County\t867\t26.2\t6.5\t28.5\t9775\t61875\t0.2777\t86434\tRomney\t86434\t0.001628474\t86434.0\n620\t-114.58621000000001\t34.934039\tMohave Valley CDP\tAZ\tArizona\tMohave County\t20800\t47.1\t10.5\t10.4\t19518\t120363\t0.2777\t86440\tRomney\t86440\t0.039068343\t86440.0\n621\t-114.560895\t35.121184\tBullhead City\tAZ\tArizona\tMohave County\t42877\t46.6\t10.8\t11.1\t20321\t95379\t0.2777\t864HH\tRomney\t864HH\t0.080535257\t0.0\n622\t-114.590554\t34.944882\tMojave Ranch Estates CDP\tAZ\tArizona\tMohave County\t29\t47.5\t13.6\t6.7\t24461\t125000\t0.2777\t86440\tRomney\t86440\t5.45e-05\t86440.0\n623\t-114.60673799999999\t34.916891\tWillow Valley CDP\tAZ\tArizona\tMohave County\t712\t46.8\t10.5\t17.0\t21637\t113095\t0.2777\t86440\tRomney\t86440\t0.0013373389999999999\t86440.0\n624\t-114.223717\t35.221813\tGolden Valley CDP\tAZ\tArizona\tMohave County\t5786\t49.9\t5.8\t22.5\t18336\t80650\t0.2777\t86413\tRomney\t86413\t0.010867761\t86413.0\n625\t-110.051204\t36.502728000000005\tChilchinbito CDP\tAZ\tArizona\tNavajo County\t553\t25.5\t1.4\t50.5\t7110\t38500\t0.4523\t86033\tRomney\t86033\t0.001038692\t86033.0\n626\t-109.92947099999999\t33.806145\tEast Fork CDP\tAZ\tArizona\tNavajo County\t1091\t24.6\t9.9\t31.4\t7463\t53043\t0.4523\t85941\tRomney\t85941\t0.00204921\t85941.0\n627\t-110.191468\t36.986632\tOljato-Monument Valley CDP\tAZ\tArizona\tNavajo County\t184\t26.2\t0.0\t23.9\t7841\t14375\t0.4523\t84536\tRomney\t84536\t0.000345605\t84536.0\n628\t-110.168539\t34.907125\tHolbrook city\tAZ\tArizona\tNavajo County\t5066\t31.4\t19.5\t14.0\t17175\t71474\t0.4523\t86025\tRomney\t86025\t0.009515395\t86025.0\n629\t-110.660632\t36.589539\tShonto CDP\tAZ\tArizona\tNavajo County\t671\t24.6\t7.6\t29.4\t11085\t44167\t0.4523\t86054\tRomney\t86054\t0.00126033\t86054.0\n630\t-110.746726\t35.035108\tWinslow West CDP\tAZ\tArizona\tNavajo County\t131\t40.2\t35.6\t15.0\t18540\t175000\t0.4523\t86047\tRomney\t86047\t0.000246055\t86047.0\n631\t-110.08706799999999\t34.523351\tSnowflake town\tAZ\tArizona\tNavajo County\t5707\t31.2\t19.7\t14.2\t16574\t105518\t0.4523\t85937\tRomney\t85937\t0.010719376999999999\t85937.0\n632\t-110.220903\t36.099097\tPinon CDP\tAZ\tArizona\tNavajo County\t1507\t23.8\t11.2\t28.4\t8036\t40625\t0.4523\t86510\tRomney\t86510\t0.002830577\t86510.0\n633\t-110.500474\t35.826692\tSecond Mesa CDP\tAZ\tArizona\tNavajo County\t961\t25.0\t7.7\t32.6\t8961\t38452\t0.4523\t86043\tRomney\t86043\t0.001805033\t86043.0\n634\t-110.258822\t36.714384\tKayenta CDP\tAZ\tArizona\tNavajo County\t5934\t24.1\t16.9\t25.4\t13051\t38500\t0.4523\t86033\tRomney\t86033\t0.011145747\t86033.0\n635\t-110.65734099999999\t35.922227\tHotevilla-Bacavi CDP\tAZ\tArizona\tNavajo County\t901\t37.8\t2.7\t19.2\t7159\t43400\t0.4523\t86039\tRomney\t86039\t0.001692335\t86039.0\n636\t-110.315545\t35.360923\tDilkon CDP\tAZ\tArizona\tNavajo County\t1550\t24.9\t3.0\t44.1\t7469\t62000\t0.4523\t86047\tRomney\t86047\t0.002911343\t86047.0\n637\t-110.129806\t35.769946999999995\tJeddito CDP\tAZ\tArizona\tNavajo County\t486\t23.6\t5.2\t26.9\t8032\t20750\t0.4523\t86034\tRomney\t86034\t0.0009128469999999999\t86034.0\n638\t-110.652918\t35.858588\tKykotsmovi Village CDP\tAZ\tArizona\tNavajo County\t922\t34.6\t15.5\t25.6\t12367\t55469\t0.4523\t86043\tRomney\t86043\t0.001731779\t86043.0\n639\t-109.965896\t34.148914000000005\tPinetop-Lakeside town\tAZ\tArizona\tNavajo County\t4043\t45.7\t28.8\t13.2\t21064\t125798\t0.4523\t85929\tRomney\t85929\t0.007593909\t85929.0\n640\t-110.709477\t35.025294\tWinslow city\tAZ\tArizona\tNavajo County\t9376\t30.6\t13.2\t14.3\t16982\t74750\t0.4523\t86047\tRomney\t86047\t0.017610807\t86047.0\n641\t-110.36724\t35.835001\tFirst Mesa CDP\tAZ\tArizona\tNavajo County\t1314\t27.7\t9.9\t25.8\t10036\t43281\t0.4523\t86042\tRomney\t86042\t0.002468067\t86042.0\n642\t-110.533649\t35.821131\tShongopovi CDP\tAZ\tArizona\tNavajo County\t746\t25.1\t8.0\t32.7\t8963\t38125\t0.4523\t86043\tRomney\t86043\t0.0014012010000000001\t86043.0\n643\t-110.570031\t34.414488\tHeber-Overgaard CDP\tAZ\tArizona\tNavajo County\t3560\t52.1\t15.6\t10.3\t17812\t118202\t0.4523\t85933\tRomney\t85933\t0.006686696999999999\t85933.0\n644\t-109.965356\t33.846314\tWhiteriver CDP\tAZ\tArizona\tNavajo County\t6272\t23.9\t7.5\t28.3\t7673\t45280\t0.4523\t85941\tRomney\t85941\t0.011780608\t85941.0\n645\t-110.207163\t35.815288\tKeams Canyon CDP\tAZ\tArizona\tNavajo County\t300\t32.6\t43.2\t17.5\t21081\t70000\t0.4523\t86034\tRomney\t86034\t0.000563486\t86034.0\n646\t-109.86160500000001\t35.527867\tGreasewood CDP\tAZ\tArizona\tNavajo County\t698\t25.3\t9.1\t29.8\t8159\t30000\t0.4523\t86031\tRomney\t86031\t0.0013110429999999998\t86031.0\n647\t-110.113198\t34.446338\tTaylor town\tAZ\tArizona\tNavajo County\t3828\t26.3\t15.1\t11.7\t15215\t96263\t0.4523\t85939\tRomney\t85939\t0.007190078000000001\t85939.0\n648\t-110.485394\t34.033283000000004\tCibecue CDP\tAZ\tArizona\tNavajo County\t1638\t23.5\t8.6\t37.1\t6670\t35909\t0.4523\t85911\tRomney\t85911\t0.003076632\t85911.0\n649\t-110.04684099999999\t34.237922\tShow Low city\tAZ\tArizona\tNavajo County\t9419\t39.4\t17.4\t12.9\t18959\t110399\t0.4523\t85901\tRomney\t85901\t0.017691573000000002\t85901.0\n650\t-112.889808\t32.384516\tAjo CDP\tAZ\tArizona\tPima County\t3846\t52.7\t15.5\t15.6\t18455\t79887\t0.5252\t85321\tRomney\t85321\t0.007223886999999999\t85321.0\n651\t-110.901124\t32.484519\tCatalina CDP\tAZ\tArizona\tPima County\t8294\t42.2\t25.8\t7.2\t24450\t122465\t0.5252\t85739\tRomney\t85739\t0.015578502\t85739.0\n652\t-110.899825\t32.144740999999996\tDrexel-Alvernon CDP\tAZ\tArizona\tPima County\t4555\t31.4\t4.8\t10.0\t14463\t84605\t0.5252\t85706\tRomney\t85706\t0.008555591\t85706.0\n653\t-111.04976699999999\t32.142706\tDrexel Heights CDP\tAZ\tArizona\tPima County\t28565\t33.2\t14.3\t8.7\t19767\t110684\t0.5252\t85746\tRomney\t85746\t0.053653232\t85746.0\n654\t-111.115502\t32.132988\tValencia West CDP\tAZ\tArizona\tPima County\t9893\t30.6\t5.8\t10.2\t11987\t90879\t0.5252\t85746\tRomney\t85746\t0.018581881\t85746.0\n655\t-110.692943\t32.011711\tVail CDP\tAZ\tArizona\tPima County\t5221\t36.2\t23.4\t4.9\t23810\t150985\t0.5252\t85641\tRomney\t85641\t0.00980653\t85641.0\n656\t-110.777786\t31.950584000000003\tCorona de Tucson CDP\tAZ\tArizona\tPima County\t1556\t41.2\t14.7\t5.9\t22550\t131250\t0.5252\t85641\tRomney\t85641\t0.0029226129999999997\t85641.0\n657\t-111.021225\t31.850176\tGreen Valley CDP\tAZ\tArizona\tPima County\t20485\t73.0\t38.3\t6.8\t37375\t151897\t0.5252\t85614\tRomney\t85614\t0.038476683\t85614.0\n658\t-111.33928600000002\t32.419375\tAvra Valley CDP\tAZ\tArizona\tPima County\t6647\t35.2\t7.7\t7.6\t17937\t93272\t0.5252\t85653\tRomney\t85653\t0.012484965\t85653.0\n659\t-111.041114\t32.412786\tTortolita CDP\tAZ\tArizona\tPima County\t5306\t43.1\t39.9\t6.9\t32725\t212337\t0.5252\t85742\tRomney\t85742\t0.009966184\t85742.0\n660\t-110.97895700000001\t31.929075\tSahuarita town\tAZ\tArizona\tPima County\t21613\t38.1\t32.4\t8.2\t22768\t160580\t0.5252\t85629\tRomney\t85629\t0.040595388999999996\t85629.0\n661\t-110.744656\t32.26812\tTanque Verde CDP\tAZ\tArizona\tPima County\t18246\t47.2\t51.8\t6.2\t43825\t311477\t0.5252\t85749\tRomney\t85749\t0.034271201\t85749.0\n662\t-110.975925\t32.421566999999996\tOro Valley town\tAZ\tArizona\tPima County\t40903\t49.4\t46.0\t7.1\t37574\t233625\t0.5252\t85737\tRomney\t85737\t0.076827521\t85737.0\n663\t-111.00601100000002\t32.34297\tCasas Adobes CDP\tAZ\tArizona\tPima County\t59952\t41.7\t38.8\t7.3\t30924\t168939\t0.5252\t85704\tRomney\t85704\t0.112606985\t85704.0\n664\t-110.94387900000001\t32.044098999999996\tSummit CDP\tAZ\tArizona\tPima County\t3915\t33.5\t7.5\t14.2\t16872\t65549\t0.5252\t85706\tRomney\t85706\t0.007353489\t85706.0\n665\t-110.883866\t32.304055\tCatalina Foothills CDP\tAZ\tArizona\tPima County\t58153\t49.9\t62.8\t7.0\t50002\t334289\t0.5252\t85718\tRomney\t85718\t0.109227949\t85718.0\n666\t-111.01031\t32.292608\tFlowing Wells CDP\tAZ\tArizona\tPima County\t15298\t38.6\t10.1\t12.1\t18747\t58191\t0.5252\t85705\tRomney\t85705\t0.028734015\t85705.0\n667\t-110.87688899999999\t32.13113\tLittletown CDP\tAZ\tArizona\tPima County\t1617\t35.9\t24.2\t7.0\t19450\t78077\t0.5252\t85706\tRomney\t85706\t0.0030371879999999997\t85706.0\n668\t-111.213324\t32.415735\tMarana town\tAZ\tArizona\tPima County\t35794\t37.3\t32.4\t6.7\t27033\t142464\t0.5252\t85654\tRomney\t85654\t0.067231359\t85654.0\n669\t-112.045451\t32.328378\tSanta Rosa CDP\tAZ\tArizona\tPima County\t542\t28.8\t5.6\t25.3\t8964\t18958\t0.5252\t85634\tRomney\t85634\t0.001018031\t85634.0\n670\t-111.246353\t32.343154\tPicture Rocks CDP\tAZ\tArizona\tPima County\t9675\t39.2\t17.9\t7.5\t19388\t109787\t0.5252\t85743\tRomney\t85743\t0.018172413999999998\t85743.0\n671\t-110.906623\t31.940687\tEast Sahuarita CDP\tAZ\tArizona\tPima County\t1673\t45.3\t21.6\t6.6\t24467\t132059\t0.5252\t85629\tRomney\t85629\t0.003142372\t85629.0\n672\t-110.87888000000001\t32.176974\tTucson city\tAZ\tArizona\tPima County\t540084\t33.2\t26.3\t10.6\t21245\t117672\t0.5252\t85708\tRomney\t85708\t1.014432064\t85708.0\n673\t-111.158052\t32.194809\tTucson Estates CDP\tAZ\tArizona\tPima County\t12103\t51.7\t15.6\t7.1\t23204\t92264\t0.5252\t85735\tRomney\t85735\t0.022732892\t85735.0\n674\t-112.321453\t32.038537\tPisinemo CDP\tAZ\tArizona\tPima County\t289\t28.1\t9.7\t21.2\t10218\t36875\t0.5252\t85634\tRomney\t85634\t0.000542825\t85634.0\n675\t-111.877124\t31.922411\tSells CDP\tAZ\tArizona\tPima County\t3372\t23.9\t9.5\t32.0\t9346\t49872\t0.5252\t85634\tRomney\t85634\t0.006333579000000001\t85634.0\n676\t-110.96898799999998\t32.195629\tSouth Tucson city\tAZ\tArizona\tPima County\t5957\t32.5\t5.6\t23.5\t10654\t61588\t0.5252\t85713\tRomney\t85713\t0.011188948\t85713.0\n677\t-111.283946\t32.05735\tThree Points CDP\tAZ\tArizona\tPima County\t5464\t33.2\t13.9\t13.8\t15415\t92516\t0.5252\t85736\tRomney\t85736\t0.010262953\t85736.0\n678\t-112.052198\t33.058597\tMaricopa CDP\tAZ\tArizona\tPinal County\t14843\t29.6\t14.5\t18.6\t17620\t97313\t0.4077\t85239\tRomney\t85239\t0.027879395\t85239.0\n679\t-111.11001999999999\t33.285090000000004\tSuperior town\tAZ\tArizona\tPinal County\t3253\t41.5\t10.1\t23.6\t17154\t57198\t0.4077\t85273\tRomney\t85273\t0.006110063000000001\t85273.0\n680\t-111.803068\t33.148143\tSantan CDP\tAZ\tArizona\tPinal County\t1008\t26.0\t6.1\t23.3\t9264\t30714\t0.4077\t85247\tRomney\t85247\t0.001893312\t85247.0\n681\t-110.907601\t33.056043\tKearny town\tAZ\tArizona\tPinal County\t3386\t42.6\t12.1\t11.4\t20586\t70095\t0.4077\t85237\tRomney\t85237\t0.006359875\t85237.0\n682\t-110.785853\t32.616896999999994\tOracle CDP\tAZ\tArizona\tPinal County\t5210\t42.5\t19.9\t12.0\t23690\t115175\t0.4077\t85623\tRomney\t85623\t0.009785869\t85623.0\n683\t-110.975096\t33.353515\tTop-of-the-World CDP\tAZ\tArizona\tPinal County\t337\t57.4\t22.6\t6.2\t37763\t98000\t0.4077\t85539\tRomney\t85539\t0.0006329819999999999\t85539.0\n684\t-111.67068\t32.750734\tArizona City CDP\tAZ\tArizona\tPinal County\t7083\t45.4\t15.6\t9.1\t26948\t103076\t0.4077\t85223\tRomney\t85223\t0.013303898\t85223.0\n685\t-110.73496100000001\t32.913047999999996\tDudleyville CDP\tAZ\tArizona\tPinal County\t1989\t38.0\t7.6\t12.4\t23339\t61154\t0.4077\t85292\tRomney\t85292\t0.00373591\t85292.0\n686\t-112.08121100000001\t33.01923\tAk-Chin Village CDP\tAZ\tArizona\tPinal County\t774\t26.5\t3.9\t18.9\t13742\t100198\t0.4077\t85239\tRomney\t85239\t0.0014537929999999999\t85239.0\n687\t-111.96431799999999\t32.879366\tStanfield CDP\tAZ\tArizona\tPinal County\t704\t28.6\t17.0\t23.8\t15735\t95769\t0.4077\t85272\tRomney\t85272\t0.0013223129999999999\t85272.0\n688\t-111.30473899999998\t33.28322\tQueen Valley CDP\tAZ\tArizona\tPinal County\t914\t59.8\t24.3\t6.4\t40005\t95313\t0.4077\t852XX\tRomney\t852XX\t0.001716753\t0.0\n689\t-111.36890700000001\t33.037636\tFlorence town\tAZ\tArizona\tPinal County\t17541\t34.8\t7.4\t13.2\t19669\t87769\t0.4077\t85232\tRomney\t85232\t0.03294701\t85232.0\n690\t-111.79811799999999\t32.745802000000005\tChuichu CDP\tAZ\tArizona\tPinal County\t460\t26.6\t3.8\t26.2\t9259\t39286\t0.4077\t85230\tRomney\t85230\t0.000864011\t85230.0\n691\t-111.436613\t33.371268\tGold Camp CDP\tAZ\tArizona\tPinal County\t11740\t57.6\t32.6\t7.9\t40330\t211774\t0.4077\t85219\tRomney\t85219\t0.022051074\t85219.0\n692\t-111.53485900000001\t33.418594\tApache Junction city\tAZ\tArizona\tPinal County\t32883\t48.4\t12.5\t11.7\t22247\t90936\t0.4077\t85220\tRomney\t85220\t0.06176366900000001\t85220.0\n693\t-111.529247\t32.984024\tCoolidge city\tAZ\tArizona\tPinal County\t7993\t32.3\t12.0\t20.4\t16519\t69553\t0.4077\t85228\tRomney\t85228\t0.015013138\t85228.0\n694\t-110.641361\t32.609229\tSan Manuel CDP\tAZ\tArizona\tPinal County\t4141\t32.1\t11.3\t17.7\t22849\t75526\t0.4077\t85631\tRomney\t85631\t0.007777981\t85631.0\n695\t-110.644438\t32.723552000000005\tMammoth town\tAZ\tArizona\tPinal County\t2644\t33.1\t6.4\t18.6\t15139\t56237\t0.4077\t85618\tRomney\t85618\t0.004966187\t85618.0\n696\t-111.746567\t32.906928\tCasa Grande city\tAZ\tArizona\tPinal County\t36982\t36.4\t22.5\t11.9\t22250\t96880\t0.4077\t85222\tRomney\t85222\t0.069462762\t85222.0\n697\t-111.605167\t32.743849\tEloy city\tAZ\tArizona\tPinal County\t10586\t28.2\t8.2\t16.1\t13772\t63468\t0.4077\t85231\tRomney\t85231\t0.019883533000000002\t85231.0\n698\t-111.765674\t33.088929\tSacaton CDP\tAZ\tArizona\tPinal County\t2344\t26.6\t2.7\t31.8\t10478\t39550\t0.4077\t85247\tRomney\t85247\t0.0044027020000000005\t85247.0\n699\t-111.61154199999999\t33.030784000000004\tBlackwater CDP\tAZ\tArizona\tPinal County\t723\t25.4\t1.1\t28.8\t11760\t54464\t0.4077\t85228\tRomney\t85228\t0.001358001\t85228.0\n700\t-111.02223400000001\t31.439789\tRio Rico Southwest CDP\tAZ\tArizona\tSanta Cruz County\t4570\t25.7\t15.7\t16.5\t12969\t109311\t0.6819\t85648\tRomney\t85648\t0.008583766\t85648.0\n701\t-110.664289\t31.692954999999998\tSonoita CDP\tAZ\tArizona\tSanta Cruz County\t797\t53.0\t43.2\t11.0\t35680\t237245\t0.6819\t85637\tRomney\t85637\t0.001496994\t85637.0\n702\t-110.534419\t31.653034\tElgin CDP\tAZ\tArizona\tSanta Cruz County\t719\t53.0\t43.0\t10.9\t35676\t236250\t0.6819\t85611\tRomney\t85611\t0.001350487\t85611.0\n703\t-111.05761499999998\t31.687192\tAmado CDP\tAZ\tArizona\tSanta Cruz County\t319\t40.8\t26.7\t29.0\t19613\t166667\t0.6819\t85645\tRomney\t85645\t0.000599173\t85645.0\n704\t-110.94416000000001\t31.454053000000002\tRio Rico Southeast CDP\tAZ\tArizona\tSanta Cruz County\t3474\t30.9\t20.7\t9.0\t18366\t121347\t0.6819\t85648\tRomney\t85648\t0.006525165\t85648.0\n705\t-111.05604\t31.625837\tTubac CDP\tAZ\tArizona\tSanta Cruz County\t1237\t60.4\t44.2\t11.8\t49324\t190938\t0.6819\t85646\tRomney\t85646\t0.002323439\t85646.0\n706\t-110.74748100000001\t31.543802000000003\tPatagonia town\tAZ\tArizona\tSanta Cruz County\t1057\t51.1\t30.7\t14.8\t18354\t71364\t0.6819\t85624\tRomney\t85624\t0.001985348\t85624.0\n707\t-110.933999\t31.362322\tNogales city\tAZ\tArizona\tSanta Cruz County\t20463\t29.9\t11.1\t23.5\t12842\t101286\t0.6819\t85621\tRomney\t85621\t0.038435361\t85621.0\n708\t-110.98014199999999\t31.53712\tRio Rico Northeast CDP\tAZ\tArizona\tSanta Cruz County\t4781\t31.0\t20.8\t8.9\t18365\t121324\t0.6819\t85648\tRomney\t85648\t0.008980084000000001\t85648.0\n709\t-111.046559\t31.502826000000002\tRio Rico Northwest CDP\tAZ\tArizona\tSanta Cruz County\t4321\t25.6\t15.7\t16.4\t12971\t109067\t0.6819\t85648\tRomney\t85648\t0.008116073\t85648.0\n710\t-111.051149\t31.569865000000004\tTumacacori-Carmen CDP\tAZ\tArizona\tSanta Cruz County\t822\t47.4\t20.4\t6.4\t25081\t87368\t0.6819\t85640\tRomney\t85640\t0.001543951\t85640.0\n711\t-112.489897\t34.882498999999996\tPaulden CDP\tAZ\tArizona\tYavapai County\t5264\t40.4\t17.3\t9.7\t20728\t143207\t0.3369\t86334\tRomney\t86334\t0.009887296\t86334.0\n712\t-112.85663000000001\t35.325629\tSeligman CDP\tAZ\tArizona\tYavapai County\t655\t49.1\t18.9\t15.6\t19726\t56552\t0.3369\t86337\tRomney\t86337\t0.0012302769999999999\t86337.0\n713\t-112.533061\t34.707991\tWilliamson CDP\tAZ\tArizona\tYavapai County\t4873\t51.7\t35.0\t7.9\t32059\t275387\t0.3369\t86323\tRomney\t86323\t0.009152885999999999\t86323.0\n714\t-111.90891200000002\t34.739218\tCornville CDP\tAZ\tArizona\tYavapai County\t4250\t46.9\t21.8\t9.2\t25071\t163587\t0.3369\t86325\tRomney\t86325\t0.007982714\t86325.0\n715\t-112.241247\t34.423625\tMayer CDP\tAZ\tArizona\tYavapai County\t2036\t47.0\t15.2\t13.9\t20704\t86402\t0.3369\t86327\tRomney\t86327\t0.00382419\t86327.0\n716\t-112.490867\t35.217192\tAsh Fork CDP\tAZ\tArizona\tYavapai County\t685\t40.2\t15.3\t15.8\t13728\t67083\t0.3369\t86320\tRomney\t86320\t0.0012866260000000001\t86320.0\n717\t-112.111107\t34.069635999999996\tBlack Canyon City CDP\tAZ\tArizona\tYavapai County\t3726\t55.0\t10.7\t10.1\t21665\t95104\t0.3369\t85324\tRomney\t85324\t0.006998493000000001\t85324.0\n718\t-112.15111399999999\t34.353194\tSpring Valley CDP\tAZ\tArizona\tYavapai County\t1705\t55.0\t10.8\t10.1\t21663\t95122\t0.3369\t86333\tRomney\t86333\t0.003202477\t86333.0\n719\t-112.107418\t34.310209\tCordes Lakes CDP\tAZ\tArizona\tYavapai County\t2596\t52.6\t12.5\t14.2\t22942\t81111\t0.3369\t86333\tRomney\t86333\t0.00487603\t86333.0\n720\t-112.61518600000001\t34.407922\tWilhoit CDP\tAZ\tArizona\tYavapai County\t779\t59.0\t12.1\t12.1\t17973\t100000\t0.3369\t86332\tRomney\t86332\t0.001463185\t86332.0\n721\t-111.761904\t34.781546\tBig Park CDP\tAZ\tArizona\tYavapai County\t6704\t60.6\t33.8\t11.0\t39607\t311820\t0.3369\t86351\tRomney\t86351\t0.012592026999999999\t86351.0\n722\t-112.05305200000001\t34.763073\tClarkdale town\tAZ\tArizona\tYavapai County\t5080\t50.6\t23.6\t8.7\t22464\t126819\t0.3369\t86324\tRomney\t86324\t0.009541691\t86324.0\n723\t-111.984452\t34.722296\tCottonwood-Verde Village CDP\tAZ\tArizona\tYavapai County\t11509\t47.5\t18.9\t9.2\t23074\t139417\t0.3369\t86326\tRomney\t86326\t0.02161719\t86326.0\n724\t-111.85582099999999\t34.568090000000005\tCamp Verde town\tAZ\tArizona\tYavapai County\t13045\t46.1\t19.1\t11.3\t20486\t112349\t0.3369\t86322\tRomney\t86322\t0.024502237000000003\t86322.0\n725\t-113.17513999999998\t34.576324\tBagdad CDP\tAZ\tArizona\tYavapai County\t2158\t33.3\t11.6\t11.8\t24578\t45667\t0.3369\t86321\tRomney\t86321\t0.004053340999999999\t86321.0\n726\t-112.86393600000001\t34.15258\tCongress CDP\tAZ\tArizona\tYavapai County\t2239\t62.9\t19.8\t9.0\t22751\t106125\t0.3369\t85332\tRomney\t85332\t0.004205482\t85332.0\n727\t-111.765381\t34.859107\tSedona city\tAZ\tArizona\tYavapai County\t11583\t56.1\t43.5\t9.2\t37916\t305556\t0.3369\t86336\tRomney\t86336\t0.021756183\t86336.0\n728\t-112.453139\t34.763319\tChino Valley town\tAZ\tArizona\tYavapai County\t10457\t41.1\t17.1\t10.5\t19362\t127738\t0.3369\t86323\tRomney\t86323\t0.019641234\t86323.0\n729\t-112.762798\t34.228357\tYarnell CDP\tAZ\tArizona\tYavapai County\t756\t59.1\t12.1\t12.1\t18025\t100521\t0.3369\t85362\tRomney\t85362\t0.001419984\t85362.0\n730\t-112.00502900000001\t34.722097\tCottonwood city\tAZ\tArizona\tYavapai County\t12653\t41.7\t17.6\t11.3\t22448\t132274\t0.3369\t86326\tRomney\t86326\t0.023765948999999998\t86326.0\n731\t-112.10788600000001\t34.746678\tJerome town\tAZ\tArizona\tYavapai County\t378\t50.6\t27.5\t8.7\t24100\t167647\t0.3369\t86331\tRomney\t86331\t0.000709992\t86331.0\n732\t-112.45176299999999\t34.575864\tPrescott city\tAZ\tArizona\tYavapai County\t40494\t52.5\t33.2\t9.0\t28596\t191842\t0.3369\t86301\tRomney\t86301\t0.076059302\t86301.0\n733\t-112.248318\t34.531553\tDewey-Humboldt CDP\tAZ\tArizona\tYavapai County\t9091\t52.8\t17.9\t8.6\t25048\t158840\t0.3369\t86327\tRomney\t86327\t0.017075495\t86327.0\n734\t-112.324669\t34.599274\tPrescott Valley town\tAZ\tArizona\tYavapai County\t38070\t41.4\t18.8\t9.7\t22020\t133066\t0.3369\t86314\tRomney\t86314\t0.071506337\t86314.0\n735\t-112.76463000000001\t34.277215000000005\tPeeples Valley CDP\tAZ\tArizona\tYavapai County\t439\t59.0\t12.1\t12.1\t17962\t100521\t0.3369\t85362\tRomney\t85362\t0.000824567\t85362.0\n736\t-111.79596000000001\t34.641290999999995\tLake Montezuma CDP\tAZ\tArizona\tYavapai County\t5002\t47.9\t22.6\t11.1\t22697\t129133\t0.3369\t86335\tRomney\t86335\t0.009395185\t86335.0\n737\t-114.39693999999999\t32.66108\tFortuna Foothills CDP\tAZ\tArizona\tYuma County\t26005\t65.7\t14.0\t15.0\t25854\t109729\t0.4292\t85367\tRomney\t85367\t0.04884482\t85367.0\n738\t-114.782077\t32.557306\tGadsden CDP\tAZ\tArizona\tYuma County\t1317\t25.8\t9.8\t23.1\t10663\t69091\t0.4292\t85336\tRomney\t85336\t0.002473702\t85336.0\n739\t-114.14889\t32.665889\tWellton town\tAZ\tArizona\tYuma County\t2322\t49.2\t9.1\t21.1\t20182\t79630\t0.4292\t85356\tRomney\t85356\t0.004361379\t85356.0\n740\t-113.961546\t32.700567\tTacna CDP\tAZ\tArizona\tYuma County\t696\t39.3\t11.7\t11.8\t17075\t96667\t0.4292\t85347\tRomney\t85347\t0.001307287\t85347.0\n741\t-114.544031\t32.596762\tYuma city\tAZ\tArizona\tYuma County\t92226\t31.2\t18.8\t15.9\t21621\t113279\t0.4292\t85365\tRomney\t85365\t0.173226779\t85365.0\n742\t-114.71010600000001\t32.596369\tSomerton city\tAZ\tArizona\tYuma County\t9878\t26.4\t7.2\t24.3\t11194\t93750\t0.4292\t85350\tRomney\t85350\t0.018553706\t85350.0\n743\t-114.76849399999999\t32.489982\tSan Luis city\tAZ\tArizona\tYuma County\t23444\t26.3\t4.6\t29.6\t10047\t91783\t0.4292\t85349\tRomney\t85349\t0.04403453\t85349.0\n744\t-91.41082800000001\t34.405861\tAlmyra town\tAR\tArkansas\tArkansas County\t299\t40.9\t10.8\t10.8\t20415\t60000\t0.37799999999999995\t72003\tRomney\t72003\t0.000955857\t72003.0\n745\t-91.37878\t34.118953999999995\tGillett city\tAR\tArkansas\tArkansas County\t716\t45.5\t19.5\t12.5\t18661\t60750\t0.37799999999999995\t72055\tRomney\t72055\t0.002288942\t72055.0\n746\t-91.33839\t34.289388\tDe Witt city\tAR\tArkansas\tArkansas County\t3361\t40.8\t11.3\t17.7\t18132\t56026\t0.37799999999999995\t72042\tRomney\t72042\t0.010744598999999999\t72042.0\n747\t-91.137439\t34.373743\tSt. Charles town\tAR\tArkansas\tArkansas County\t233\t44.4\t12.9\t11.9\t19569\t63333\t0.37799999999999995\t72140\tRomney\t72140\t0.000744865\t72140.0\n748\t-91.549873\t34.493153\tStuttgart city\tAR\tArkansas\tArkansas County\t9053\t39.1\t16.5\t20.4\t21124\t78565\t0.37799999999999995\t72160\tRomney\t72160\t0.028941045\t72160.0\n749\t-91.700361\t34.42293\tHumphrey city\tAR\tArkansas\tArkansas County\t731\t38.8\t5.1\t18.3\t16493\t50625\t0.37799999999999995\t72073\tRomney\t72073\t0.002336894\t72073.0\n750\t-91.497054\t33.298594\tMontrose city\tAR\tArkansas\tAshley County\t440\t34.5\t7.3\t14.9\t14241\t40750\t0.3609\t71658\tRomney\t71658\t0.001406612\t71658.0\n751\t-92.022286\t33.14014\tWest Crossett CDP\tAR\tArkansas\tAshley County\t1535\t39.3\t9.3\t12.2\t21115\t57167\t0.3609\t71635\tRomney\t71635\t0.004907158\t71635.0\n752\t-91.797824\t33.224383\tHamburg city\tAR\tArkansas\tAshley County\t2890\t39.2\t14.4\t11.8\t18660\t67100\t0.3609\t71646\tRomney\t71646\t0.009238884000000001\t71646.0\n753\t-91.54640400000001\t33.121095000000004\tParkdale city\tAR\tArkansas\tAshley County\t325\t38.0\t12.1\t11.3\t18616\t50000\t0.3609\t71661\tRomney\t71661\t0.001038975\t71661.0\n754\t-91.963207\t33.128398\tCrossett city\tAR\tArkansas\tAshley County\t5629\t39.5\t17.9\t9.3\t22085\t82007\t0.3609\t71635\tRomney\t71635\t0.017995045\t71635.0\n755\t-91.575136\t33.058628000000006\tWilmot city\tAR\tArkansas\tAshley County\t657\t44.4\t5.6\t15.1\t13294\t39615\t0.3609\t71676\tRomney\t71676\t0.002100328\t71676.0\n756\t-91.85108699999999\t33.357658\tFountain Hill town\tAR\tArkansas\tAshley County\t167\t38.8\t6.9\t14.3\t18247\t55000\t0.3609\t71642\tRomney\t71642\t0.000533873\t71642.0\n757\t-91.511134\t33.237756\tPortland city\tAR\tArkansas\tAshley County\t459\t37.5\t12.9\t12.6\t17526\t41429\t0.3609\t71663\tRomney\t71663\t0.0014673520000000001\t71663.0\n758\t-91.93664\t33.171124\tNorth Crossett CDP\tAR\tArkansas\tAshley County\t3337\t36.0\t6.2\t8.3\t17505\t54292\t0.3609\t71635\tRomney\t71635\t0.010667873999999999\t71635.0\n759\t-92.486763\t36.284946999999995\tGassville city\tAR\tArkansas\tBaxter County\t2050\t41.6\t9.3\t14.5\t15661\t85183\t0.2674\t72635\tRomney\t72635\t0.006553534000000001\t72635.0\n760\t-92.40657\t36.005665\tBig Flat town\tAR\tArkansas\tBaxter County\t105\t50.8\t17.3\t6.7\t24992\t117500\t0.2674\t72617\tRomney\t72617\t0.00033566900000000003\t72617.0\n761\t-92.281398\t36.20626\tNorfork city\tAR\tArkansas\tBaxter County\t512\t48.8\t12.6\t5.4\t21003\t98182\t0.2674\t72658\tRomney\t72658\t0.001636785\t72658.0\n762\t-92.521147\t36.281618\tCotter city\tAR\tArkansas\tBaxter County\t1046\t45.4\t12.4\t11.8\t19343\t88452\t0.2674\t72626\tRomney\t72626\t0.003343901\t72626.0\n763\t-92.281355\t36.270137\tBriarcliff town\tAR\tArkansas\tBaxter County\t270\t56.9\t14.7\t7.1\t24410\t105833\t0.2674\t72658\tRomney\t72658\t0.000863148\t72658.0\n764\t-92.538845\t36.373964\tLakeview city\tAR\tArkansas\tBaxter County\t843\t60.7\t16.6\t13.7\t20636\t123465\t0.2674\t72642\tRomney\t72642\t0.0026949409999999997\t72642.0\n765\t-92.387783\t36.332957\tMountain Home city\tAR\tArkansas\tBaxter County\t12011\t51.5\t16.7\t7.0\t23526\t124796\t0.2674\t72653\tRomney\t72653\t0.038397315\t72653.0\n766\t-92.27664399999999\t36.240762\tSalesville city\tAR\tArkansas\tBaxter County\t493\t56.4\t15.0\t7.3\t24743\t101210\t0.2674\t72658\tRomney\t72658\t0.001576045\t72658.0\n767\t-94.061654\t36.339919\tPrairie Creek CDP\tAR\tArkansas\tBenton County\t2128\t51.7\t34.9\t4.8\t42015\t185208\t0.2856\t72756\tRomney\t72756\t0.006802888000000001\t72756.0\n768\t-94.319748\t36.276834\tHighfill town\tAR\tArkansas\tBenton County\t392\t37.0\t15.7\t11.1\t18841\t119318\t0.2856\t72719\tRomney\t72719\t0.001253164\t72719.0\n769\t-94.071072\t36.397873\tAvoca town\tAR\tArkansas\tBenton County\t486\t37.6\t11.6\t7.5\t19135\t121635\t0.2856\t72711\tRomney\t72711\t0.0015536670000000001\t72711.0\n770\t-94.13949000000001\t36.264302\tLowell city\tAR\tArkansas\tBenton County\t6542\t31.9\t27.5\t5.8\t28817\t138501\t0.2856\t72745\tRomney\t72745\t0.020913765\t72745.0\n771\t-94.458574\t36.483508\tSulphur Springs city\tAR\tArkansas\tBenton County\t778\t34.6\t14.8\t5.8\t15904\t85833\t0.2856\t72768\tRomney\t72768\t0.002487146\t72768.0\n772\t-94.29424499999999\t36.464661\tBella Vista CDP\tAR\tArkansas\tBenton County\t23475\t59.9\t29.1\t7.8\t31405\t164970\t0.2856\t72715\tRomney\t72715\t0.075045955\t72715.0\n773\t-94.532223\t36.18322\tSiloam Springs city\tAR\tArkansas\tBenton County\t14474\t33.1\t22.9\t6.9\t21592\t113640\t0.2856\t72761\tRomney\t72761\t0.046271146\t72761.0\n774\t-94.284912\t36.363059\tCenterton city\tAR\tArkansas\tBenton County\t7627\t35.5\t15.3\t5.8\t20489\t122008\t0.2856\t72719\tRomney\t72719\t0.024382342999999997\t72719.0\n775\t-94.213779\t36.364912\tBentonville city\tAR\tArkansas\tBenton County\t30563\t31.4\t27.5\t7.1\t27248\t132059\t0.2856\t72712\tRomney\t72712\t0.09770519800000001\t72712.0\n776\t-94.458171\t36.339321000000005\tDecatur city\tAR\tArkansas\tBenton County\t1776\t34.4\t12.9\t6.8\t19464\t108209\t0.2856\t72722\tRomney\t72722\t0.005677598000000001\t72722.0\n777\t-93.97532199999999\t36.454679\tGarfield town\tAR\tArkansas\tBenton County\t512\t37.7\t7.7\t6.3\t17986\t98500\t0.2856\t72732\tRomney\t72732\t0.001636785\t72732.0\n778\t-94.222891\t36.275412\tCave Springs city\tAR\tArkansas\tBenton County\t2122\t40.0\t36.7\t4.1\t31440\t182366\t0.2856\t72718\tRomney\t72718\t0.006783707\t72718.0\n779\t-94.135805\t36.384976\tLittle Flock city\tAR\tArkansas\tBenton County\t3388\t30.5\t26.0\t7.0\t21475\t151852\t0.2856\t72711\tRomney\t72711\t0.010830913000000001\t72711.0\n780\t-94.42401600000001\t36.26083\tSpringtown town\tAR\tArkansas\tBenton County\t136\t35.5\t11.4\t6.3\t17656\t100000\t0.2856\t72734\tRomney\t72734\t0.000434771\t72734.0\n781\t-94.484033\t36.265651\tGentry city\tAR\tArkansas\tBenton County\t2888\t36.1\t14.3\t6.7\t18172\t98509\t0.2856\t72734\tRomney\t72734\t0.009232490999999999\t72734.0\n782\t-93.935458\t36.487589\tGateway town\tAR\tArkansas\tBenton County\t115\t40.9\t12.8\t3.9\t19723\t103125\t0.2856\t72732\tRomney\t72732\t0.000367637\t72732.0\n783\t-94.117634\t36.44808\tPea Ridge city\tAR\tArkansas\tBenton County\t2996\t38.3\t12.8\t6.4\t22974\t116422\t0.2856\t72751\tRomney\t72751\t0.00957775\t72751.0\n784\t-94.148275\t36.319365000000005\tRogers city\tAR\tArkansas\tBenton County\t53734\t33.6\t23.9\t6.8\t25199\t133504\t0.2856\t72758\tRomney\t72758\t0.17177931100000002\t72758.0\n785\t-94.455579\t36.421676\tGravette city\tAR\tArkansas\tBenton County\t2457\t35.2\t16.1\t6.3\t16694\t92069\t0.2856\t72736\tRomney\t72736\t0.00785465\t72736.0\n786\t-94.145882\t36.225709\tBethel Heights town\tAR\tArkansas\tBenton County\t2042\t33.2\t16.0\t6.1\t23932\t123482\t0.2856\t72745\tRomney\t72745\t0.006527959\t72745.0\n787\t-92.906487\t36.414837\tLead Hill town\tAR\tArkansas\tBoone County\t341\t43.8\t9.6\t7.0\t16812\t91429\t0.2451\t72644\tRomney\t72644\t0.001090124\t72644.0\n788\t-92.913176\t36.458675\tDiamond City\tAR\tArkansas\tBoone County\t792\t58.8\t11.7\t8.1\t21073\t83824\t0.2451\t72630\tRomney\t72630\t0.002531902\t72630.0\n789\t-93.120141\t36.243506\tHarrison city\tAR\tArkansas\tBoone County\t12554\t40.3\t17.9\t7.7\t22030\t111800\t0.2451\t72601\tRomney\t72601\t0.040133202\t72601.0\n790\t-93.046626\t36.200303999999996\tBellefonte town\tAR\tArkansas\tBoone County\t419\t39.9\t12.0\t7.3\t19029\t108553\t0.2451\t72601\tRomney\t72601\t0.0013394779999999998\t72601.0\n791\t-93.293082\t36.293011\tAlpena town\tAR\tArkansas\tBoone County\t434\t41.1\t13.0\t5.7\t17764\t105263\t0.2451\t72611\tRomney\t72611\t0.001387431\t72611.0\n792\t-93.190985\t36.458211\tOmaha town\tAR\tArkansas\tBoone County\t191\t42.5\t10.4\t14.6\t18464\t104167\t0.2451\t72662\tRomney\t72662\t0.0006105980000000001\t72662.0\n793\t-92.99044\t36.154003\tValley Springs town\tAR\tArkansas\tBoone County\t180\t40.0\t10.4\t4.8\t17886\t95000\t0.2451\t72633\tRomney\t72633\t0.000575432\t72633.0\n794\t-92.909467\t36.154176\tEverton town\tAR\tArkansas\tBoone County\t182\t38.4\t11.5\t7.0\t17549\t86667\t0.2451\t72633\tRomney\t72633\t0.000581826\t72633.0\n795\t-92.905603\t36.394907\tSouth Lead Hill town\tAR\tArkansas\tBoone County\t112\t43.4\t10.0\t6.4\t16816\t85000\t0.2451\t72644\tRomney\t72644\t0.00035804699999999996\t72644.0\n796\t-93.011459\t36.312907\tBergman town\tAR\tArkansas\tBoone County\t456\t40.7\t8.3\t7.4\t17830\t95000\t0.2451\t72601\tRomney\t72601\t0.001457762\t72601.0\n797\t-92.914681\t36.283611\tZinc town\tAR\tArkansas\tBoone County\t84\t43.8\t8.6\t7.9\t18197\t102500\t0.2451\t72672\tRomney\t72672\t0.000268535\t72672.0\n798\t-92.17159000000001\t33.447932\tHermitage town\tAR\tArkansas\tBradley County\t743\t32.5\t9.4\t6.3\t14828\t61875\t0.3968\t71647\tRomney\t71647\t0.002375256\t71647.0\n799\t-92.267094\t33.575878\tBanks town\tAR\tArkansas\tBradley County\t113\t42.2\t7.8\t16.3\t12717\t45000\t0.3968\t71631\tRomney\t71631\t0.00036124400000000004\t71631.0\n800\t-92.069067\t33.610792\tWarren city\tAR\tArkansas\tBradley County\t5949\t42.1\t15.2\t10.9\t17993\t59901\t0.3968\t71671\tRomney\t71671\t0.019018036000000002\t71671.0\n801\t-92.353277\t33.629246\tTinsman city\tAR\tArkansas\tCalhoun County\t64\t41.7\t2.2\t9.4\t20067\t38750\t0.3036\t71631\tRomney\t71631\t0.00020459799999999998\t71631.0\n802\t-92.489039\t33.775560999999996\tThornton city\tAR\tArkansas\tCalhoun County\t454\t40.4\t9.9\t5.9\t16274\t70625\t0.3036\t71766\tRomney\t71766\t0.001451368\t71766.0\n803\t-92.401052\t33.510157\tHarrell city\tAR\tArkansas\tCalhoun County\t247\t41.4\t1.7\t6.5\t17769\t54375\t0.3036\t71745\tRomney\t71745\t0.000789621\t71745.0\n804\t-92.46608\t33.536189\tHampton city\tAR\tArkansas\tCalhoun County\t1744\t44.1\t9.2\t9.2\t19796\t58039\t0.3036\t71744\tRomney\t71744\t0.005575299000000001\t71744.0\n805\t-93.772689\t36.475478\tBeaver town\tAR\tArkansas\tCarroll County\t81\t56.4\t26.9\t7.3\t28458\t187500\t0.363\t72631\tRomney\t72631\t0.000258945\t72631.0\n806\t-93.430398\t36.463644\tOak Grove town\tAR\tArkansas\tCarroll County\t423\t39.0\t9.4\t7.3\t17541\t107143\t0.363\t72660\tRomney\t72660\t0.001352266\t72660.0\n807\t-93.428737\t36.334226\tGreen Forest city\tAR\tArkansas\tCarroll County\t3121\t31.5\t8.1\t6.6\t15300\t84911\t0.363\t72638\tRomney\t72638\t0.009977356\t72638.0\n808\t-93.39734200000001\t36.496441\tBlue Eye town\tAR\tArkansas\tCarroll County\t40\t43.8\t11.1\t9.5\t17758\t95000\t0.363\t72660\tRomney\t72660\t0.000127874\t72660.0\n809\t-93.745181\t36.41065\tEureka Springs city\tAR\tArkansas\tCarroll County\t2500\t51.2\t28.5\t7.7\t22964\t152500\t0.363\t72632\tRomney\t72632\t0.007992114\t72632.0\n810\t-93.565375\t36.370733\tBerryville city\tAR\tArkansas\tCarroll County\t4890\t37.0\t11.6\t7.7\t17799\t114884\t0.363\t72616\tRomney\t72616\t0.015632576000000002\t72616.0\n811\t-91.263981\t33.119046000000004\tEudora city\tAR\tArkansas\tChicot County\t2438\t34.7\t11.6\t12.8\t12814\t45233\t0.6074\t71640\tRomney\t71640\t0.00779391\t71640.0\n812\t-91.282997\t33.327644\tLake Village city\tAR\tArkansas\tChicot County\t2357\t37.9\t20.0\t14.8\t16225\t64804\t0.6074\t71653\tRomney\t71653\t0.007534966\t71653.0\n813\t-91.438773\t33.526739\tDermott city\tAR\tArkansas\tChicot County\t3282\t36.8\t10.5\t15.4\t14249\t41667\t0.6074\t71638\tRomney\t71638\t0.010492048\t71638.0\n814\t-93.463391\t34.266182\tAmity city\tAR\tArkansas\tClark County\t780\t39.0\t8.5\t9.8\t16759\t65000\t0.4532\t71921\tRomney\t71921\t0.00249354\t71921.0\n815\t-93.071635\t34.189572\tCaddo Valley town\tAR\tArkansas\tClark County\t600\t35.4\t30.5\t7.0\t20308\t123162\t0.4532\t71923\tRomney\t71923\t0.001918107\t71923.0\n816\t-93.15531700000001\t33.915275\tGurdon city\tAR\tArkansas\tClark County\t2158\t37.1\t11.6\t5.7\t17428\t60526\t0.4532\t71743\tRomney\t71743\t0.006898793\t71743.0\n817\t-93.07204899999999\t34.124128000000006\tArkadelphia city\tAR\tArkansas\tClark County\t11274\t27.1\t33.7\t8.3\t18793\t108616\t0.4532\t71923\tRomney\t71923\t0.036041238999999996\t71923.0\n818\t-93.095523\t34.064066\tGum Springs town\tAR\tArkansas\tClark County\t197\t42.8\t28.8\t2.3\t20668\t95625\t0.4532\t71923\tRomney\t71923\t0.000629779\t71923.0\n819\t-93.33753399999999\t34.000457\tOkolona town\tAR\tArkansas\tClark County\t159\t44.3\t11.4\t7.7\t15882\t78333\t0.4532\t71962\tRomney\t71962\t0.000508298\t71962.0\n820\t-93.126067\t33.833205\tWhelen Springs town\tAR\tArkansas\tClark County\t83\t39.2\t5.4\t5.9\t18689\t48000\t0.4532\t71743\tRomney\t71743\t0.000265338\t71743.0\n821\t-90.58805600000001\t36.411077\tCorning city\tAR\tArkansas\tClay County\t3312\t40.1\t8.9\t18.3\t16334\t50867\t0.3401\t72422\tRomney\t72422\t0.010587953\t72422.0\n822\t-90.222368\t36.340796000000005\tGreenway town\tAR\tArkansas\tClay County\t251\t45.8\t7.1\t10.8\t22717\t50714\t0.3401\t72430\tRomney\t72430\t0.000802408\t72430.0\n823\t-90.293213\t36.264003\tRector city\tAR\tArkansas\tClay County\t1786\t44.1\t8.6\t12.0\t17227\t52849\t0.3401\t72461\tRomney\t72461\t0.005709567\t72461.0\n824\t-90.09519499999999\t36.306290000000004\tNimmons town\tAR\tArkansas\tClay County\t89\t45.0\t9.0\t9.1\t17129\t43333\t0.3401\t72430\tRomney\t72430\t0.000284519\t72430.0\n825\t-90.390815\t36.43658\tMcDougal town\tAR\tArkansas\tClay County\t173\t43.0\t4.1\t14.7\t16149\t44444\t0.3401\t72441\tRomney\t72441\t0.000553054\t72441.0\n826\t-90.267576\t36.429977\tPollard town\tAR\tArkansas\tClay County\t221\t41.2\t7.0\t3.9\t17187\t57857\t0.3401\t72456\tRomney\t72456\t0.000706503\t72456.0\n827\t-90.60220799999999\t36.320102\tKnobel town\tAR\tArkansas\tClay County\t351\t40.5\t5.2\t7.4\t15420\t38750\t0.3401\t72435\tRomney\t72435\t0.001122093\t72435.0\n828\t-90.722798\t36.454614\tSuccess town\tAR\tArkansas\tClay County\t163\t39.8\t8.0\t13.3\t17793\t39500\t0.3401\t72470\tRomney\t72470\t0.000521086\t72470.0\n829\t-90.728254\t36.393166\tDatto town\tAR\tArkansas\tClay County\t88\t41.3\t8.2\t12.5\t17756\t39167\t0.3401\t72424\tRomney\t72424\t0.00028132200000000003\t72424.0\n830\t-90.20054300000001\t36.385619\tPiggott city\tAR\tArkansas\tClay County\t3609\t43.7\t12.5\t10.3\t18333\t75317\t0.3401\t72454\tRomney\t72454\t0.011537416000000002\t72454.0\n831\t-90.1436\t36.455662\tSt. Francis city\tAR\tArkansas\tClay County\t249\t39.8\t12.1\t9.6\t18580\t60833\t0.3401\t72464\tRomney\t72464\t0.000796015\t72464.0\n832\t-90.661119\t36.281334\tPeach Orchard town\tAR\tArkansas\tClay County\t191\t40.2\t4.8\t7.6\t15435\t38750\t0.3401\t72453\tRomney\t72453\t0.0006105980000000001\t72453.0\n833\t-92.168626\t35.567557\tGreers Ferry city\tAR\tArkansas\tCleburne County\t966\t53.1\t14.2\t12.7\t20557\t121307\t0.225\t72067\tRomney\t72067\t0.0030881529999999997\t72067.0\n834\t-92.204897\t35.566509\tHigden town\tAR\tArkansas\tCleburne County\t110\t54.2\t19.8\t4.8\t25187\t117500\t0.225\t72067\tRomney\t72067\t0.000351653\t72067.0\n835\t-92.212316\t35.384423999999996\tQuitman city\tAR\tArkansas\tCleburne County\t780\t41.0\t9.3\t5.2\t18075\t91852\t0.225\t72131\tRomney\t72131\t0.00249354\t72131.0\n836\t-91.849238\t35.662457\tConcord town\tAR\tArkansas\tCleburne County\t247\t41.0\t4.6\t10.2\t16145\t62727\t0.225\t72523\tRomney\t72523\t0.000789621\t72523.0\n837\t-92.037054\t35.499406\tHeber Springs city\tAR\tArkansas\tCleburne County\t6730\t48.7\t22.0\t5.4\t23923\t119090\t0.225\t72543\tRomney\t72543\t0.021514772\t72543.0\n838\t-92.19313000000001\t33.954763\tRison city\tAR\tArkansas\tCleveland County\t1263\t40.1\t13.4\t11.3\t16618\t64853\t0.2587\t71665\tRomney\t71665\t0.004037616\t71665.0\n839\t-92.304472\t33.865567\tKingsland city\tAR\tArkansas\tCleveland County\t489\t37.6\t8.0\t10.4\t17933\t43750\t0.2587\t71652\tRomney\t71652\t0.0015632579999999999\t71652.0\n840\t-93.235831\t33.276371999999995\tMagnolia city\tAR\tArkansas\tColumbia County\t10705\t34.6\t28.2\t11.0\t21456\t87246\t0.3762\t71753\tRomney\t71753\t0.034222234\t71753.0\n841\t-93.196202\t33.09706\tEmerson town\tAR\tArkansas\tColumbia County\t318\t35.7\t7.9\t10.1\t16651\t49063\t0.3762\t71740\tRomney\t71740\t0.001016597\t71740.0\n842\t-93.208454\t33.348357\tMcNeil city\tAR\tArkansas\tColumbia County\t553\t31.3\t12.8\t18.2\t14336\t39688\t0.3762\t71752\tRomney\t71752\t0.0017678560000000002\t71752.0\n843\t-93.295106\t33.352271\tWaldo city\tAR\tArkansas\tColumbia County\t1461\t37.6\t10.4\t19.7\t15478\t45918\t0.3762\t71770\tRomney\t71770\t0.004670592\t71770.0\n844\t-93.461786\t33.099773\tTaylor city\tAR\tArkansas\tColumbia County\t476\t43.7\t12.1\t10.5\t18762\t57143\t0.3762\t71861\tRomney\t71861\t0.0015216989999999998\t71861.0\n845\t-92.554803\t35.149045\tMenifee town\tAR\tArkansas\tConway County\t341\t39.4\t11.4\t8.2\t16236\t74375\t0.3887\t72107\tRomney\t72107\t0.001090124\t72107.0\n846\t-92.7736\t35.100424\tOppelo city\tAR\tArkansas\tConway County\t707\t35.9\t7.3\t5.6\t18383\t76190\t0.3887\t72125\tRomney\t72125\t0.00226017\t72125.0\n847\t-92.641304\t35.160540000000005\tPlumerville city\tAR\tArkansas\tConway County\t933\t39.5\t11.2\t7.9\t16307\t73478\t0.3887\t72127\tRomney\t72127\t0.002982657\t72127.0\n848\t-92.740249\t35.155939000000004\tMorrilton city\tAR\tArkansas\tConway County\t6318\t39.7\t17.2\t8.8\t20425\t89196\t0.3887\t72110\tRomney\t72110\t0.020197672\t72110.0\n849\t-90.944011\t35.868114\tEgypt town\tAR\tArkansas\tCraighead County\t118\t36.6\t9.3\t4.1\t15729\t66667\t0.3321\t72427\tRomney\t72427\t0.000377228\t72427.0\n850\t-90.322641\t35.759394\tCaraway town\tAR\tArkansas\tCraighead County\t1475\t39.8\t6.7\t11.1\t15632\t44357\t0.3321\t72419\tRomney\t72419\t0.004715348\t72419.0\n851\t-90.931395\t35.800788\tCash town\tAR\tArkansas\tCraighead County\t284\t38.4\t12.0\t5.9\t15973\t50000\t0.3321\t72421\tRomney\t72421\t0.000907904\t72421.0\n852\t-90.58014\t35.902543\tBrookland town\tAR\tArkansas\tCraighead County\t1443\t34.4\t7.1\t6.1\t17817\t72685\t0.3321\t72417\tRomney\t72417\t0.004613048\t72417.0\n853\t-90.796982\t35.90797\tBono city\tAR\tArkansas\tCraighead County\t1666\t34.8\t9.2\t9.1\t18446\t70685\t0.3321\t72416\tRomney\t72416\t0.005325945\t72416.0\n854\t-90.449414\t35.820124\tLake City town\tAR\tArkansas\tCraighead County\t2165\t38.6\t11.1\t8.5\t16384\t58021\t0.3321\t72437\tRomney\t72437\t0.006921170999999999\t72437.0\n855\t-90.36780999999999\t35.837018\tBlack Oak town\tAR\tArkansas\tCraighead County\t316\t44.2\t10.9\t6.8\t19467\t56250\t0.3321\t72414\tRomney\t72414\t0.001010203\t72414.0\n856\t-90.679027\t35.821157\tJonesboro city\tAR\tArkansas\tCraighead County\t64419\t33.9\t29.8\t8.9\t23576\t107825\t0.3321\t72467\tRomney\t72467\t0.205937608\t72467.0\n857\t-90.554463\t35.746666999999995\tBay city\tAR\tArkansas\tCraighead County\t2036\t37.4\t10.4\t7.8\t18610\t59604\t0.3321\t72411\tRomney\t72411\t0.006508778000000001\t72411.0\n858\t-90.342434\t35.894269\tMonette city\tAR\tArkansas\tCraighead County\t1285\t44.1\t14.1\t7.2\t19160\t58455\t0.3321\t72447\tRomney\t72447\t0.004107947\t72447.0\n859\t-94.17944\t35.676593\tChester town\tAR\tArkansas\tCrawford County\t103\t42.5\t13.9\t8.9\t16958\t97500\t0.237\t72946\tRomney\t72946\t0.000329275\t72946.0\n860\t-94.16855600000001\t35.635238\tMountainburg city\tAR\tArkansas\tCrawford County\t735\t37.8\t9.0\t6.1\t16995\t85313\t0.237\t72946\tRomney\t72946\t0.002349682\t72946.0\n861\t-94.137233\t35.4948\tDyer town\tAR\tArkansas\tCrawford County\t720\t42.7\t17.5\t6.0\t20759\t103241\t0.237\t72935\tRomney\t72935\t0.0023017289999999998\t72935.0\n862\t-94.270038\t35.527440000000006\tRudy town\tAR\tArkansas\tCrawford County\t79\t39.5\t14.5\t5.1\t20645\t131250\t0.237\t72952\tRomney\t72952\t0.000252551\t72952.0\n863\t-94.07285300000001\t35.510348\tMulberry city\tAR\tArkansas\tCrawford County\t1933\t42.5\t7.6\t9.4\t16917\t84390\t0.237\t72947\tRomney\t72947\t0.006179503\t72947.0\n864\t-94.22451099999999\t35.490967\tAlma city\tAR\tArkansas\tCrawford County\t4800\t32.4\t12.5\t10.9\t19394\t105693\t0.237\t72921\tRomney\t72921\t0.01534486\t72921.0\n865\t-94.353409\t35.447408\tVan Buren city\tAR\tArkansas\tCrawford County\t21971\t33.9\t13.6\t10.7\t20577\t102186\t0.237\t72956\tRomney\t72956\t0.070237899\t72956.0\n866\t-94.361661\t35.582822\tCedarville city\tAR\tArkansas\tCrawford County\t1335\t38.7\t6.2\t6.6\t15006\t80588\t0.237\t72932\tRomney\t72932\t0.004267789\t72932.0\n867\t-94.236653\t35.426669\tKibler city\tAR\tArkansas\tCrawford County\t1076\t39.0\t9.2\t8.6\t19582\t94688\t0.237\t72921\tRomney\t72921\t0.0034398059999999997\t72921.0\n868\t-90.30481800000001\t35.103604\tEdmondson town\tAR\tArkansas\tCrittenden County\t509\t32.1\t16.3\t12.2\t14228\t59000\t0.5675\t72332\tRomney\t72332\t0.001627195\t72332.0\n869\t-90.229584\t35.285734999999995\tJericho town\tAR\tArkansas\tCrittenden County\t188\t29.2\t5.7\t23.1\t12544\t36667\t0.5675\t72364\tRomney\t72364\t0.000601007\t72364.0\n870\t-90.27798299999999\t35.411462\tGilmore town\tAR\tArkansas\tCrittenden County\t297\t38.0\t3.7\t17.9\t14103\t46923\t0.5675\t72339\tRomney\t72339\t0.000949463\t72339.0\n871\t-90.326352\t35.225834000000006\tCrawfordsville town\tAR\tArkansas\tCrittenden County\t501\t35.8\t8.8\t17.8\t15448\t51667\t0.5675\t72327\tRomney\t72327\t0.00160162\t72327.0\n872\t-90.20635899999999\t35.223126\tSunset city\tAR\tArkansas\tCrittenden County\t321\t33.5\t13.8\t14.3\t17719\t84500\t0.5675\t72364\tRomney\t72364\t0.001026187\t72364.0\n873\t-90.27015899999999\t35.196638\tMarion city\tAR\tArkansas\tCrittenden County\t11720\t33.8\t23.0\t6.7\t23118\t103705\t0.5675\t72364\tRomney\t72364\t0.037467033\t72364.0\n874\t-90.340456\t35.039931\tAnthonyville town\tAR\tArkansas\tCrittenden County\t234\t35.0\t12.2\t6.9\t17346\t38500\t0.5675\t72376\tRomney\t72376\t0.000748062\t72376.0\n875\t-90.181907\t35.147875\tWest Memphis city\tAR\tArkansas\tCrittenden County\t27595\t33.0\t14.0\t14.0\t18959\t75863\t0.5675\t72301\tRomney\t72301\t0.088216959\t72301.0\n876\t-90.41011800000001\t35.172269\tJennette town\tAR\tArkansas\tCrittenden County\t129\t40.4\t10.7\t19.6\t15354\t83333\t0.5675\t72327\tRomney\t72327\t0.00041239300000000005\t72327.0\n877\t-90.464294\t35.273396999999996\tEarle city\tAR\tArkansas\tCrittenden County\t2787\t32.4\t10.6\t17.6\t13606\t40500\t0.5675\t72331\tRomney\t72331\t0.008909609\t72331.0\n878\t-90.307234\t34.913175\tHorseshoe Lake town\tAR\tArkansas\tCrittenden County\t305\t46.6\t8.1\t10.9\t19233\t93889\t0.5675\t72348\tRomney\t72348\t0.000975038\t72348.0\n879\t-90.270785\t35.376096999999994\tTurrell city\tAR\tArkansas\tCrittenden County\t972\t34.7\t5.4\t17.5\t14054\t44211\t0.5675\t72339\tRomney\t72339\t0.0031073340000000002\t72339.0\n880\t-90.99444100000001\t35.402558\tHickory Ridge city\tAR\tArkansas\tCross County\t352\t41.3\t17.5\t9.9\t23854\t63333\t0.3411\t72347\tRomney\t72347\t0.00112529\t72347.0\n881\t-90.552816\t35.263339\tParkin city\tAR\tArkansas\tCross County\t1417\t36.4\t5.9\t16.8\t12208\t44468\t0.3411\t72373\tRomney\t72373\t0.00452993\t72373.0\n882\t-90.789424\t35.233563000000004\tWynne city\tAR\tArkansas\tCross County\t8331\t36.8\t14.8\t11.2\t19238\t85229\t0.3411\t72396\tRomney\t72396\t0.026632922000000003\t72396.0\n883\t-90.754483\t35.402142\tCherry Valley city\tAR\tArkansas\tCross County\t719\t37.4\t5.4\t13.0\t18640\t59063\t0.3411\t72324\tRomney\t72324\t0.0022985320000000003\t72324.0\n884\t-92.55534\t34.07263\tCarthage city\tAR\tArkansas\tDallas County\t331\t45.6\t7.6\t8.1\t13051\t41667\t0.4335\t71725\tRomney\t71725\t0.001058156\t71725.0\n885\t-92.85011899999999\t33.917342\tSparkman city\tAR\tArkansas\tDallas County\t546\t42.4\t11.6\t11.0\t18593\t46944\t0.4335\t71763\tRomney\t71763\t0.001745478\t71763.0\n886\t-92.416634\t33.818315999999996\tFordyce city\tAR\tArkansas\tDallas County\t4321\t38.7\t11.6\t15.1\t16259\t48118\t0.4335\t71742\tRomney\t71742\t0.013813571\t71742.0\n887\t-91.257232\t33.893917\tWatson city\tAR\tArkansas\tDesha County\t256\t42.5\t6.8\t13.7\t15236\t43571\t0.5527\t71674\tRomney\t71674\t0.000818393\t71674.0\n888\t-91.394486\t33.625971\tMcGehee city\tAR\tArkansas\tDesha County\t4040\t38.7\t16.2\t12.7\t17560\t60521\t0.5527\t71654\tRomney\t71654\t0.012915257\t71654.0\n889\t-91.443517\t33.702018\tReed town\tAR\tArkansas\tDesha County\t246\t43.2\t19.8\t10.1\t17309\t67143\t0.5527\t71670\tRomney\t71670\t0.000786424\t71670.0\n890\t-91.486226\t33.883231\tDumas city\tAR\tArkansas\tDesha County\t4900\t35.3\t12.5\t9.6\t16077\t56620\t0.5527\t71639\tRomney\t71639\t0.015664544\t71639.0\n891\t-91.205066\t33.608813\tArkansas City\tAR\tArkansas\tDesha County\t486\t40.5\t10.6\t14.5\t17342\t40667\t0.5527\t71630\tRomney\t71630\t0.0015536670000000001\t71630.0\n892\t-91.498439\t33.905409999999996\tMitchellville city\tAR\tArkansas\tDesha County\t443\t31.3\t5.1\t13.4\t13161\t46500\t0.5527\t71639\tRomney\t71639\t0.0014162029999999998\t71639.0\n893\t-91.470268\t33.398052\tJerome city\tAR\tArkansas\tDrew County\t46\t37.5\t12.9\t11.1\t20178\t75000\t0.3965\t71658\tRomney\t71658\t0.000147055\t71658.0\n894\t-91.473788\t33.774079\tWinchester city\tAR\tArkansas\tDrew County\t180\t36.1\t11.9\t15.6\t16788\t53750\t0.3965\t71677\tRomney\t71677\t0.000575432\t71677.0\n895\t-91.929051\t33.626498\tWilmar city\tAR\tArkansas\tDrew County\t563\t40.4\t9.0\t23.1\t13249\t53214\t0.3965\t71675\tRomney\t71675\t0.001799824\t71675.0\n896\t-91.4463\t33.713144\tTillar city\tAR\tArkansas\tDrew County\t226\t38.6\t13.0\t14.1\t18141\t56667\t0.3965\t71670\tRomney\t71670\t0.000722487\t71670.0\n897\t-91.793676\t33.626036\tMonticello city\tAR\tArkansas\tDrew County\t8984\t33.5\t26.0\t11.7\t20865\t84859\t0.3965\t71655\tRomney\t71655\t0.028720462000000002\t71655.0\n898\t-92.456638\t35.083993\tConway city\tAR\tArkansas\tFaulkner County\t56672\t29.4\t38.2\t8.1\t24686\t139142\t0.3285\t72032\tRomney\t72032\t0.181171644\t72032.0\n899\t-92.425253\t35.318578\tTwin Groves town\tAR\tArkansas\tFaulkner County\t389\t40.3\t13.2\t8.8\t18041\t84500\t0.3285\t72039\tRomney\t72039\t0.001243573\t72039.0\n900\t-92.207767\t35.081932\tVilonia town\tAR\tArkansas\tFaulkner County\t3087\t36.4\t20.9\t8.2\t20306\t122020\t0.3285\t72173\tRomney\t72173\t0.009868663\t72173.0\n901\t-92.41800400000001\t34.972762\tMayflower city\tAR\tArkansas\tFaulkner County\t2108\t44.4\t14.0\t10.1\t21720\t87698\t0.3285\t72106\tRomney\t72106\t0.006738951\t72106.0\n902\t-92.12403499999999\t35.223642\tMount Vernon city\tAR\tArkansas\tFaulkner County\t200\t38.2\t9.8\t9.0\t17483\t75000\t0.3285\t72111\tRomney\t72111\t0.000639369\t72111.0\n903\t-92.40873\t35.371244\tDamascus town\tAR\tArkansas\tFaulkner County\t324\t40.8\t10.7\t7.1\t19587\t88125\t0.3285\t72039\tRomney\t72039\t0.001035778\t72039.0\n904\t-92.203611\t35.197146999999994\tEnola town\tAR\tArkansas\tFaulkner County\t218\t37.0\t10.7\t7.2\t18850\t84000\t0.3285\t72047\tRomney\t72047\t0.0006969119999999999\t72047.0\n905\t-92.449216\t35.200619\tWooster town\tAR\tArkansas\tFaulkner County\t760\t36.3\t20.9\t8.5\t22372\t104167\t0.3285\t72181\tRomney\t72181\t0.002429603\t72181.0\n906\t-92.383667\t35.228766\tGreenbrier city\tAR\tArkansas\tFaulkner County\t4145\t35.7\t16.8\t8.6\t21742\t105500\t0.3285\t72058\tRomney\t72058\t0.013250926000000001\t72058.0\n907\t-92.27765600000001\t35.16576\tHolland city\tAR\tArkansas\tFaulkner County\t664\t36.9\t14.5\t7.9\t18989\t82308\t0.3285\t72047\tRomney\t72047\t0.0021227060000000002\t72047.0\n908\t-92.341764\t35.323295\tGuy town\tAR\tArkansas\tFaulkner County\t254\t39.5\t15.6\t3.1\t19631\t106667\t0.3285\t72039\tRomney\t72039\t0.000811999\t72039.0\n909\t-93.764321\t35.446622999999995\tAltus city\tAR\tArkansas\tFranklin County\t861\t40.0\t14.3\t9.7\t16379\t73235\t0.2639\t72821\tRomney\t72821\t0.0027524840000000004\t72821.0\n910\t-94.046723\t35.295563\tCharleston city\tAR\tArkansas\tFranklin County\t3067\t39.4\t13.8\t6.3\t19417\t84899\t0.2639\t72933\tRomney\t72933\t0.009804726\t72933.0\n911\t-93.954449\t35.307815000000005\tBranch city\tAR\tArkansas\tFranklin County\t363\t42.4\t9.1\t6.8\t19762\t88571\t0.2639\t72928\tRomney\t72928\t0.001160455\t72928.0\n912\t-93.842118\t35.500060999999995\tOzark city\tAR\tArkansas\tFranklin County\t3466\t39.9\t12.2\t8.5\t17249\t78750\t0.2639\t72949\tRomney\t72949\t0.011080267\t72949.0\n913\t-93.756824\t35.425231\tDenning town\tAR\tArkansas\tFranklin County\t284\t40.0\t13.1\t10.0\t15574\t67857\t0.2639\t72821\tRomney\t72821\t0.000907904\t72821.0\n914\t-93.75810899999999\t35.481848\tWiederkehr Village city\tAR\tArkansas\tFranklin County\t49\t39.2\t21.2\t8.0\t19873\t95000\t0.2639\t72821\tRomney\t72821\t0.000156645\t72821.0\n915\t-91.541331\t36.298091\tCherokee Village city\tAR\tArkansas\tFulton County\t4730\t59.0\t16.3\t13.9\t23209\t84162\t0.3211\t72529\tRomney\t72529\t0.015121081000000001\t72529.0\n916\t-91.541065\t36.492175\tMammoth Spring city\tAR\tArkansas\tFulton County\t1198\t45.1\t11.8\t8.5\t15386\t67381\t0.3211\t72554\tRomney\t72554\t0.0038298209999999997\t72554.0\n917\t-91.986143\t36.397282000000004\tViola town\tAR\tArkansas\tFulton County\t427\t42.0\t11.4\t5.0\t17665\t80000\t0.3211\t72583\tRomney\t72583\t0.001365053\t72583.0\n918\t-91.82271999999999\t36.371039\tSalem city\tAR\tArkansas\tFulton County\t1552\t42.6\t13.0\t5.6\t16047\t82273\t0.3211\t72576\tRomney\t72576\t0.004961505\t72576.0\n919\t-93.13390600000001\t34.464007\tRockwell CDP\tAR\tArkansas\tGarland County\t3651\t46.8\t27.7\t6.3\t26732\t127700\t0.3389\t71913\tRomney\t71913\t0.011671684\t71913.0\n920\t-92.81036999999999\t34.545009\tLonsdale town\tAR\tArkansas\tGarland County\t122\t39.1\t11.0\t5.3\t17802\t75000\t0.3389\t72087\tRomney\t72087\t0.000390015\t72087.0\n921\t-92.955565\t34.666838\tHot Springs Village CDP\tAR\tArkansas\tGarland County\t8944\t69.7\t35.7\t5.9\t34144\t182771\t0.3389\t71909\tRomney\t71909\t0.028592588999999998\t71909.0\n922\t-93.141947\t34.502334000000005\tPiney CDP\tAR\tArkansas\tGarland County\t4738\t40.0\t10.3\t7.6\t20038\t69006\t0.3389\t71913\tRomney\t71913\t0.015146655\t71913.0\n923\t-93.088763\t34.426876\tLake Hamilton CDP\tAR\tArkansas\tGarland County\t1963\t49.4\t34.2\t7.2\t26855\t215306\t0.3389\t71913\tRomney\t71913\t0.0062754080000000005\t71913.0\n924\t-93.172221\t34.570204\tMountain Pine city\tAR\tArkansas\tGarland County\t793\t36.6\t8.0\t11.1\t14020\t38690\t0.3389\t71968\tRomney\t71968\t0.002535099\t71968.0\n925\t-93.050618\t34.495296\tHot Springs city\tAR\tArkansas\tGarland County\t37276\t45.0\t18.9\t11.5\t21584\t93154\t0.3389\t71901\tRomney\t71901\t0.11916562300000001\t71901.0\n926\t-92.918302\t34.615126000000004\tFountain Lake town\tAR\tArkansas\tGarland County\t418\t51.4\t20.5\t5.4\t20208\t122500\t0.3389\t71909\tRomney\t71909\t0.001336282\t71909.0\n927\t-92.591433\t34.170054\tLeola town\tAR\tArkansas\tGrant County\t573\t36.8\t4.1\t11.5\t18651\t43864\t0.2266\t72084\tRomney\t72084\t0.001831793\t72084.0\n928\t-92.403145\t34.308443\tSheridan city\tAR\tArkansas\tGrant County\t4177\t39.7\t18.3\t5.1\t21863\t96250\t0.2266\t72150\tRomney\t72150\t0.013353225\t72150.0\n929\t-92.577963\t34.443276000000004\tTull town\tAR\tArkansas\tGrant County\t363\t44.5\t10.7\t7.5\t20102\t88333\t0.2266\t72167\tRomney\t72167\t0.001160455\t72167.0\n930\t-92.642032\t34.322911\tPoyen town\tAR\tArkansas\tGrant County\t291\t41.0\t9.0\t5.4\t19631\t80500\t0.2266\t72128\tRomney\t72128\t0.0009302819999999999\t72128.0\n931\t-92.542957\t34.317105\tPrattsville town\tAR\tArkansas\tGrant County\t288\t38.5\t10.1\t14.1\t20344\t62727\t0.2266\t72129\tRomney\t72129\t0.000920692\t72129.0\n932\t-90.514531\t36.056774\tParagould city\tAR\tArkansas\tGreene County\t24366\t38.6\t15.7\t10.9\t21011\t104329\t0.2907\t72450\tRomney\t72450\t0.077894344\t72450.0\n933\t-90.386167\t36.189569\tMarmaduke city\tAR\tArkansas\tGreene County\t1219\t38.5\t8.8\t8.8\t13825\t74375\t0.2907\t72443\tRomney\t72443\t0.003896955\t72443.0\n934\t-90.725713\t36.230482\tDelaplaine town\tAR\tArkansas\tGreene County\t130\t41.7\t8.6\t11.5\t13686\t53333\t0.2907\t72425\tRomney\t72425\t0.00041559\t72425.0\n935\t-90.50861\t36.126974\tOak Grove Heights town\tAR\tArkansas\tGreene County\t781\t37.2\t6.5\t10.8\t16379\t99773\t0.2907\t72450\tRomney\t72450\t0.002496737\t72450.0\n936\t-90.50434200000001\t36.209158\tLafe town\tAR\tArkansas\tGreene County\t440\t41.0\t2.9\t7.7\t17639\t71250\t0.2907\t72436\tRomney\t72436\t0.001406612\t72436.0\n937\t-93.577752\t33.871665\tBlevins city\tAR\tArkansas\tHempstead County\t380\t39.5\t10.0\t11.2\t18259\t75000\t0.3566\t71825\tRomney\t71825\t0.0012148010000000002\t71825.0\n938\t-93.620588\t33.729255\tOakhaven city\tAR\tArkansas\tHempstead County\t54\t41.3\t13.5\t12.0\t20243\t90000\t0.3566\t71801\tRomney\t71801\t0.00017263\t71801.0\n939\t-93.831801\t33.661259\tMcNab town\tAR\tArkansas\tHempstead County\t76\t43.8\t9.6\t9.7\t15329\t52500\t0.3566\t71838\tRomney\t71838\t0.00024296\t71838.0\n940\t-93.813661\t33.61258\tFulton city\tAR\tArkansas\tHempstead County\t259\t40.7\t10.6\t10.4\t15968\t59286\t0.3566\t71838\tRomney\t71838\t0.000827983\t71838.0\n941\t-93.590488\t33.668015000000004\tHope city\tAR\tArkansas\tHempstead County\t10606\t34.3\t13.6\t13.5\t15728\t70103\t0.3566\t71801\tRomney\t71801\t0.033905746\t71801.0\n942\t-93.72039699999999\t33.847887\tOzan city\tAR\tArkansas\tHempstead County\t80\t40.6\t11.1\t11.4\t18041\t67500\t0.3566\t71855\tRomney\t71855\t0.000255748\t71855.0\n943\t-93.641684\t33.918626\tMcCaskill city\tAR\tArkansas\tHempstead County\t87\t39.2\t13.8\t9.5\t18477\t75000\t0.3566\t71847\tRomney\t71847\t0.00027812599999999996\t71847.0\n944\t-93.567014\t33.511431\tPatmos town\tAR\tArkansas\tHempstead County\t63\t44.4\t19.1\t10.3\t23818\t72500\t0.3566\t71801\tRomney\t71801\t0.00020140099999999998\t71801.0\n945\t-93.683474\t33.773045\tWashington city\tAR\tArkansas\tHempstead County\t148\t39.0\t12.1\t14.7\t17691\t75000\t0.3566\t71862\tRomney\t71862\t0.00047313300000000004\t71862.0\n946\t-93.534816\t33.696215\tPerrytown city\tAR\tArkansas\tHempstead County\t246\t39.6\t9.2\t7.3\t16357\t77500\t0.3566\t71835\tRomney\t71835\t0.000786424\t71835.0\n947\t-92.91848900000001\t34.234173\tDonaldson town\tAR\tArkansas\tHot Spring County\t341\t42.5\t13.1\t7.4\t19669\t63000\t0.3401\t71941\tRomney\t71941\t0.001090124\t71941.0\n948\t-92.814573\t34.370518\tMalvern city\tAR\tArkansas\tHot Spring County\t9204\t39.5\t13.8\t10.4\t17146\t70082\t0.3401\t72104\tRomney\t72104\t0.029423769\t72104.0\n949\t-92.809673\t34.40397\tRockport town\tAR\tArkansas\tHot Spring County\t825\t40.0\t10.0\t8.4\t17978\t83750\t0.3401\t72104\tRomney\t72104\t0.002637398\t72104.0\n950\t-92.778984\t34.364583\tPerla town\tAR\tArkansas\tHot Spring County\t117\t38.2\t15.0\t9.6\t17650\t80000\t0.3401\t72104\tRomney\t72104\t0.000374031\t72104.0\n951\t-93.00328499999999\t34.224573\tFriendship town\tAR\tArkansas\tHot Spring County\t218\t39.1\t15.2\t5.0\t18456\t63750\t0.3401\t71941\tRomney\t71941\t0.0006969119999999999\t71941.0\n952\t-93.92220999999999\t33.876744\tMineral Springs city\tAR\tArkansas\tHoward County\t1260\t36.4\t11.3\t9.4\t15467\t70000\t0.3297\t71851\tRomney\t71851\t0.004028026\t71851.0\n953\t-93.897083\t33.818084999999996\tTollette town\tAR\tArkansas\tHoward County\t324\t42.6\t9.3\t16.3\t18115\t52500\t0.3297\t71851\tRomney\t71851\t0.001035778\t71851.0\n954\t-93.851446\t33.941441999999995\tNashville city\tAR\tArkansas\tHoward County\t4839\t36.7\t16.5\t9.4\t16330\t97029\t0.3297\t71852\tRomney\t71852\t0.015469537\t71852.0\n955\t-94.018618\t34.120977\tDierks city\tAR\tArkansas\tHoward County\t1177\t40.4\t12.3\t10.8\t15284\t46023\t0.3297\t71833\tRomney\t71833\t0.0037626870000000002\t71833.0\n956\t-91.50008100000001\t35.751688\tSulphur Rock town\tAR\tArkansas\tIndependence County\t414\t39.7\t11.8\t7.0\t18260\t78125\t0.2647\t72579\tRomney\t72579\t0.001323494\t72579.0\n957\t-91.623401\t35.76808\tBatesville city\tAR\tArkansas\tIndependence County\t9214\t40.2\t25.3\t8.4\t22781\t103271\t0.2647\t72501\tRomney\t72501\t0.029455737000000003\t72501.0\n958\t-91.571425\t35.767497\tMoorefield town\tAR\tArkansas\tIndependence County\t165\t40.8\t30.1\t7.1\t27405\t129167\t0.2647\t72501\tRomney\t72501\t0.00052748\t72501.0\n959\t-91.461085\t35.629603\tOil Trough town\tAR\tArkansas\tIndependence County\t219\t42.9\t8.8\t12.0\t19077\t68000\t0.2647\t72564\tRomney\t72564\t0.000700109\t72564.0\n960\t-91.482322\t35.703182\tMagness town\tAR\tArkansas\tIndependence County\t186\t40.8\t12.2\t8.4\t19063\t81000\t0.2647\t72553\tRomney\t72553\t0.000594613\t72553.0\n961\t-91.779374\t35.865085\tCushman town\tAR\tArkansas\tIndependence County\t492\t39.6\t5.5\t13.9\t16644\t58667\t0.2647\t72526\tRomney\t72526\t0.001572848\t72526.0\n962\t-91.44373399999999\t35.708748\tNewark city\tAR\tArkansas\tIndependence County\t1167\t36.5\t10.2\t10.9\t15700\t70179\t0.2647\t72562\tRomney\t72562\t0.0037307190000000004\t72562.0\n963\t-91.628192\t35.553284000000005\tPleasant Plains town\tAR\tArkansas\tIndependence County\t298\t41.0\t6.8\t10.6\t16604\t75000\t0.2647\t72568\tRomney\t72568\t0.00095266\t72568.0\n964\t-91.777586\t36.171702\tFranklin town\tAR\tArkansas\tIzard County\t181\t45.4\t11.9\t5.0\t18659\t86250\t0.2887\t72536\tRomney\t72536\t0.000578629\t72536.0\n965\t-91.77694699999999\t35.981921\tMount Pleasant town\tAR\tArkansas\tIzard County\t392\t40.9\t11.5\t8.0\t18529\t76250\t0.2887\t72561\tRomney\t72561\t0.001253164\t72561.0\n966\t-92.106391\t36.161167\tPineville town\tAR\tArkansas\tIzard County\t240\t39.8\t13.1\t8.6\t15552\t91000\t0.2887\t72566\tRomney\t72566\t0.000767243\t72566.0\n967\t-91.68924200000001\t36.257656\tHorseshoe Bend city\tAR\tArkansas\tIzard County\t2287\t65.3\t15.4\t13.6\t21697\t82595\t0.2887\t72513\tRomney\t72513\t0.007311186\t72513.0\n968\t-92.128638\t36.131403999999996\tCalico Rock city\tAR\tArkansas\tIzard County\t952\t45.3\t18.4\t8.5\t17088\t79167\t0.2887\t72519\tRomney\t72519\t0.003043397\t72519.0\n969\t-91.91959\t36.209028\tOxford city\tAR\tArkansas\tIzard County\t638\t43.7\t8.8\t9.8\t13962\t71667\t0.2887\t72565\tRomney\t72565\t0.0020395879999999997\t72565.0\n970\t-91.938455\t35.926978000000005\tGuion town\tAR\tArkansas\tIzard County\t86\t50.8\t17.5\t9.5\t19023\t82500\t0.2887\t72540\tRomney\t72540\t0.00027492900000000004\t72540.0\n971\t-91.902129\t36.063981\tMelbourne city\tAR\tArkansas\tIzard County\t1758\t41.9\t15.5\t9.9\t16516\t80323\t0.2887\t72556\tRomney\t72556\t0.005620055\t72556.0\n972\t-91.229919\t35.391040000000004\tTupelo town\tAR\tArkansas\tJackson County\t155\t39.8\t10.5\t5.0\t17066\t42143\t0.3918\t72169\tRomney\t72169\t0.000495511\t72169.0\n973\t-91.075416\t35.654126\tGrubbs town\tAR\tArkansas\tJackson County\t489\t28.4\t5.6\t8.4\t11283\t47045\t0.3918\t72431\tRomney\t72431\t0.0015632579999999999\t72431.0\n974\t-91.109408\t35.563325\tAmagon town\tAR\tArkansas\tJackson County\t85\t43.9\t5.1\t10.0\t13114\t34167\t0.3918\t72005\tRomney\t72005\t0.000271732\t72005.0\n975\t-91.307947\t35.641912\tJacksonport town\tAR\tArkansas\tJackson County\t236\t42.5\t10.8\t6.6\t21415\t59444\t0.3918\t72075\tRomney\t72075\t0.000754456\t72075.0\n976\t-91.200122\t35.727257\tTuckerman city\tAR\tArkansas\tJackson County\t1343\t45.5\t9.9\t11.1\t17917\t53944\t0.3918\t72473\tRomney\t72473\t0.004293364\t72473.0\n977\t-91.12878\t35.824375\tSwifton city\tAR\tArkansas\tJackson County\t699\t38.8\t11.1\t7.4\t16646\t48636\t0.3918\t72471\tRomney\t72471\t0.002234595\t72471.0\n978\t-91.261664\t35.647622999999996\tDiaz city\tAR\tArkansas\tJackson County\t1312\t39.3\t9.8\t9.2\t21120\t62000\t0.3918\t72043\tRomney\t72043\t0.004194262\t72043.0\n979\t-91.253772\t35.667877000000004\tCampbell Station town\tAR\tArkansas\tJackson County\t236\t37.3\t9.3\t11.0\t20906\t62857\t0.3918\t72043\tRomney\t72043\t0.000754456\t72043.0\n980\t-91.110316\t35.429057\tBeedeville town\tAR\tArkansas\tJackson County\t94\t43.8\t4.5\t11.1\t13108\t34167\t0.3918\t72014\tRomney\t72014\t0.000300504\t72014.0\n981\t-91.23156800000001\t35.44773\tWeldon town\tAR\tArkansas\tJackson County\t88\t38.6\t11.5\t4.4\t16977\t40000\t0.3918\t72169\tRomney\t72169\t0.00028132200000000003\t72169.0\n982\t-91.231607\t35.62529\tNewport city\tAR\tArkansas\tJackson County\t7306\t39.2\t17.6\t9.0\t18365\t76287\t0.3918\t72043\tRomney\t72043\t0.023356155\t72043.0\n983\t-91.951724\t34.384762\tSherrill town\tAR\tArkansas\tJefferson County\t113\t41.1\t6.5\t14.0\t15423\t43750\t0.638\t72152\tRomney\t72152\t0.00036124400000000004\t72152.0\n984\t-92.016706\t34.212389\tPine Bluff city\tAR\tArkansas\tJefferson County\t51818\t34.6\t20.7\t13.4\t18409\t69555\t0.638\t71601\tRomney\t71601\t0.165654155\t71601.0\n985\t-92.101549\t34.27448\tWhite Hall city\tAR\tArkansas\tJefferson County\t4670\t38.8\t19.3\t9.4\t24679\t101405\t0.638\t71602\tRomney\t71602\t0.01492927\t71602.0\n986\t-91.793071\t34.359122\tWabbaseka city\tAR\tArkansas\tJefferson County\t282\t36.5\t8.4\t16.5\t14649\t43889\t0.638\t72175\tRomney\t72175\t0.000901511\t72175.0\n987\t-92.183933\t34.441462\tRedfield city\tAR\tArkansas\tJefferson County\t1152\t38.9\t11.1\t6.5\t21503\t73241\t0.638\t72132\tRomney\t72132\t0.0036827659999999996\t72132.0\n988\t-91.84823100000001\t34.324052\tAltheimer city\tAR\tArkansas\tJefferson County\t1005\t38.2\t9.0\t19.2\t14151\t44545\t0.638\t72175\tRomney\t72175\t0.00321283\t72175.0\n989\t-93.665949\t35.436775\tCoal Hill city\tAR\tArkansas\tJohnson County\t1140\t36.5\t6.8\t11.1\t16387\t71304\t0.3456\t72832\tRomney\t72832\t0.0036444040000000004\t72832.0\n990\t-93.621448\t35.435449\tHartman city\tAR\tArkansas\tJohnson County\t582\t37.2\t13.9\t7.9\t15103\t59444\t0.3456\t72840\tRomney\t72840\t0.0018605639999999999\t72840.0\n991\t-93.480236\t35.456365999999996\tClarksville city\tAR\tArkansas\tJohnson County\t8328\t36.9\t19.6\t13.2\t17600\t92714\t0.3456\t72830\tRomney\t72830\t0.026623332000000003\t72830.0\n992\t-93.394712\t35.444552\tLamar city\tAR\tArkansas\tJohnson County\t1583\t37.1\t11.6\t7.9\t17613\t82667\t0.3456\t72846\tRomney\t72846\t0.005060607\t72846.0\n993\t-93.367565\t35.38218\tKnoxville city\tAR\tArkansas\tJohnson County\t608\t37.1\t13.1\t8.5\t16570\t91538\t0.3456\t72845\tRomney\t72845\t0.0019436820000000002\t72845.0\n994\t-93.65701800000001\t33.099268\tBradley city\tAR\tArkansas\tLafayette County\t501\t40.5\t11.9\t14.1\t16413\t46429\t0.4005\t71826\tRomney\t71826\t0.00160162\t71826.0\n995\t-93.57963000000001\t33.364411\tLewisville city\tAR\tArkansas\tLafayette County\t1297\t43.8\t13.6\t9.2\t16183\t47091\t0.4005\t71845\tRomney\t71845\t0.004146309\t71845.0\n996\t-93.435895\t33.357433\tBuckner city\tAR\tArkansas\tLafayette County\t354\t39.7\t10.6\t11.3\t18292\t49500\t0.4005\t71827\tRomney\t71827\t0.001131683\t71827.0\n997\t-93.495552\t33.35645\tStamps city\tAR\tArkansas\tLafayette County\t1826\t40.9\t11.9\t13.0\t16883\t44100\t0.4005\t71860\tRomney\t71860\t0.00583744\t71860.0\n998\t-90.97984\t36.044795\tHoxie city\tAR\tArkansas\tLawrence County\t2633\t36.4\t4.3\t8.9\t15639\t56632\t0.3227\t72433\tRomney\t72433\t0.008417295\t72433.0\n999\t-90.94805600000001\t36.086399\tWalnut Ridge city\tAR\tArkansas\tLawrence County\t4720\t43.0\t9.4\t6.5\t19112\t72990\t0.3227\t72476\tRomney\t72476\t0.015089112\t72476.0\n1000\t-91.180707\t36.201941999999995\tImboden town\tAR\tArkansas\tLawrence County\t622\t42.4\t10.4\t11.6\t16024\t68824\t0.3227\t72434\tRomney\t72434\t0.001988438\t72434.0\n1001\t-91.251173\t36.241838\tRavenden town\tAR\tArkansas\tLawrence County\t512\t40.0\t4.3\t16.6\t13169\t58214\t0.3227\t72459\tRomney\t72459\t0.001636785\t72459.0\n1002\t-91.251859\t36.004503\tLynn town\tAR\tArkansas\tLawrence County\t304\t40.3\t10.0\t6.8\t18019\t66500\t0.3227\t72440\tRomney\t72440\t0.0009718410000000001\t72440.0\n1003\t-91.118953\t36.082757\tPowhatan town\tAR\tArkansas\tLawrence County\t46\t42.5\t6.5\t5.6\t14887\t50000\t0.3227\t72458\tRomney\t72458\t0.000147055\t72458.0\n1004\t-91.107529\t36.106993\tBlack Rock city\tAR\tArkansas\tLawrence County\t643\t39.8\t6.5\t7.5\t14727\t58864\t0.3227\t72415\tRomney\t72415\t0.0020555720000000003\t72415.0\n1005\t-90.939965\t36.125448999999996\tCollege City town\tAR\tArkansas\tLawrence County\t279\t26.4\t18.3\t13.0\t16506\t50500\t0.3227\t72476\tRomney\t72476\t0.00089192\t72476.0\n1006\t-91.32064799999999\t35.966456\tStrawberry town\tAR\tArkansas\tLawrence County\t322\t40.5\t9.6\t8.7\t18925\t61667\t0.3227\t72469\tRomney\t72469\t0.001029384\t72469.0\n1007\t-91.071147\t36.084920000000004\tPortia town\tAR\tArkansas\tLawrence County\t450\t43.1\t7.1\t6.5\t14911\t59565\t0.3227\t72457\tRomney\t72457\t0.001438581\t72457.0\n1008\t-91.30260600000001\t36.080417\tSmithville town\tAR\tArkansas\tLawrence County\t75\t45.4\t7.4\t10.0\t17014\t67500\t0.3227\t72466\tRomney\t72466\t0.000239763\t72466.0\n1009\t-91.027513\t35.975664\tMinturn town\tAR\tArkansas\tLawrence County\t107\t40.6\t9.5\t9.1\t17906\t73750\t0.3227\t72445\tRomney\t72445\t0.00034206199999999997\t72445.0\n1010\t-90.863938\t35.978213000000004\tSedgwick town\tAR\tArkansas\tLawrence County\t118\t40.0\t11.3\t12.8\t22000\t55000\t0.3227\t72416\tRomney\t72416\t0.000377228\t72416.0\n1011\t-91.08309200000001\t35.894296999999995\tAlicia town\tAR\tArkansas\tLawrence County\t143\t43.1\t6.9\t6.7\t13687\t40833\t0.3227\t72410\tRomney\t72410\t0.000457149\t72410.0\n1012\t-90.733949\t34.655569\tLaGrange town\tAR\tArkansas\tLee County\t117\t33.0\t5.7\t10.0\t12329\t46250\t0.6154\t72355\tRomney\t72355\t0.000374031\t72355.0\n1013\t-90.820887\t34.657488\tRondo town\tAR\tArkansas\tLee County\t225\t43.3\t9.5\t13.3\t25782\t58333\t0.6154\t72311\tRomney\t72311\t0.00071929\t72311.0\n1014\t-90.897984\t34.719827\tAubrey town\tAR\tArkansas\tLee County\t185\t45.9\t10.3\t10.3\t14596\t32500\t0.6154\t72311\tRomney\t72311\t0.000591416\t72311.0\n1015\t-90.767493\t34.773744\tMarianna city\tAR\tArkansas\tLee County\t4601\t33.0\t11.7\t18.9\t12233\t58295\t0.6154\t72360\tRomney\t72360\t0.014708687\t72360.0\n1016\t-90.988062\t34.792158\tMoro town\tAR\tArkansas\tLee County\t227\t39.8\t11.5\t3.4\t16988\t52143\t0.6154\t72368\tRomney\t72368\t0.000725684\t72368.0\n1017\t-90.792364\t34.890941999999995\tHaynes town\tAR\tArkansas\tLee County\t163\t42.5\t15.7\t8.6\t13749\t50000\t0.6154\t72341\tRomney\t72341\t0.000521086\t72341.0\n1018\t-91.698164\t34.079\tGrady city\tAR\tArkansas\tLincoln County\t537\t31.4\t2.7\t13.9\t10614\t42667\t0.3824\t71644\tRomney\t71644\t0.0017167060000000001\t71644.0\n1019\t-91.564058\t33.98717\tGould city\tAR\tArkansas\tLincoln County\t1224\t33.2\t12.4\t14.7\t12330\t34881\t0.3824\t71643\tRomney\t71643\t0.003912939\t71643.0\n1020\t-91.842484\t33.942254\tStar City\tAR\tArkansas\tLincoln County\t2647\t40.5\t14.6\t13.1\t18890\t72537\t0.3824\t71667\tRomney\t71667\t0.008462051\t71667.0\n1021\t-94.04484599999999\t33.584175\tOgden town\tAR\tArkansas\tLittle River County\t198\t42.0\t16.8\t7.3\t21018\t86667\t0.3073\t71853\tRomney\t71853\t0.000632975\t71853.0\n1022\t-94.354332\t33.83075\tWinthrop city\tAR\tArkansas\tLittle River County\t203\t41.7\t6.4\t10.1\t19992\t70000\t0.3073\t71866\tRomney\t71866\t0.00064896\t71866.0\n1023\t-94.148038\t33.738549\tWilton town\tAR\tArkansas\tLittle River County\t397\t38.9\t7.0\t6.3\t20717\t58000\t0.3073\t71865\tRomney\t71865\t0.001269148\t71865.0\n1024\t-94.397991\t33.719842\tForeman city\tAR\tArkansas\tLittle River County\t992\t37.1\t7.3\t7.1\t16603\t65000\t0.3073\t71836\tRomney\t71836\t0.003171271\t71836.0\n1025\t-94.126595\t33.674444\tAshdown city\tAR\tArkansas\tLittle River County\t4781\t38.2\t10.7\t9.5\t20252\t74800\t0.3073\t71822\tRomney\t71822\t0.01528412\t71822.0\n1026\t-93.722338\t35.2897\tParis city\tAR\tArkansas\tLogan County\t3513\t42.1\t12.9\t11.4\t18315\t79907\t0.27399999999999997\t72855\tRomney\t72855\t0.011230519\t72855.0\n1027\t-93.524412\t35.382032\tMorrison Bluff town\tAR\tArkansas\tLogan County\t82\t37.5\t18.5\t8.9\t19569\t92500\t0.27399999999999997\t72863\tRomney\t72863\t0.00026214099999999997\t72863.0\n1028\t-93.888711\t35.306604\tRatcliff city\tAR\tArkansas\tLogan County\t205\t41.1\t7.8\t9.2\t19923\t81667\t0.27399999999999997\t72951\tRomney\t72951\t0.000655353\t72951.0\n1029\t-93.63868199999999\t35.298046\tSubiaco town\tAR\tArkansas\tLogan County\t458\t43.6\t9.7\t10.9\t15065\t77333\t0.27399999999999997\t72865\tRomney\t72865\t0.001464155\t72865.0\n1030\t-93.806481\t35.153215\tMagazine city\tAR\tArkansas\tLogan County\t935\t37.0\t9.1\t9.8\t15490\t63095\t0.27399999999999997\t72943\tRomney\t72943\t0.002989051\t72943.0\n1031\t-93.71608499999999\t35.131076\tBlue Mountain town\tAR\tArkansas\tLogan County\t123\t38.6\t11.9\t10.5\t13119\t55000\t0.27399999999999997\t72826\tRomney\t72826\t0.000393212\t72826.0\n1032\t-93.86797\t35.301743\tCaulksville town\tAR\tArkansas\tLogan County\t250\t40.9\t7.6\t9.4\t19931\t84286\t0.27399999999999997\t72951\tRomney\t72951\t0.0007992110000000001\t72951.0\n1033\t-93.919392\t35.139533\tBooneville city\tAR\tArkansas\tLogan County\t3997\t38.1\t11.3\t9.4\t16501\t77010\t0.27399999999999997\t72927\tRomney\t72927\t0.012777793\t72927.0\n1034\t-93.53953800000001\t35.36063\tScranton city\tAR\tArkansas\tLogan County\t245\t37.5\t17.4\t8.3\t19664\t93571\t0.27399999999999997\t72863\tRomney\t72863\t0.000783227\t72863.0\n1035\t-91.988956\t35.007684999999995\tAustin city\tAR\tArkansas\tLonoke County\t1561\t37.9\t18.3\t4.9\t24226\t112674\t0.2333\t72007\tRomney\t72007\t0.004990276\t72007.0\n1036\t-91.73431\t34.79533\tCarlisle city\tAR\tArkansas\tLonoke County\t2651\t43.8\t14.0\t6.8\t21459\t74747\t0.2333\t72024\tRomney\t72024\t0.008474838\t72024.0\n1037\t-92.008825\t34.61121\tKeo town\tAR\tArkansas\tLonoke County\t260\t41.8\t20.4\t9.5\t19600\t92000\t0.2333\t72083\tRomney\t72083\t0.00083118\t72083.0\n1038\t-91.90733900000001\t34.790017999999996\tLonoke city\tAR\tArkansas\tLonoke County\t4348\t39.3\t18.3\t10.3\t18937\t84550\t0.2333\t72086\tRomney\t72086\t0.013899885\t72086.0\n1039\t-92.085288\t34.697784000000006\tScott CDP\tAR\tArkansas\tLonoke County\t149\t44.3\t15.7\t5.2\t27246\t87500\t0.2333\t72142\tRomney\t72142\t0.00047633\t72142.0\n1040\t-91.967626\t34.545474\tEngland city\tAR\tArkansas\tLonoke County\t2941\t39.3\t15.3\t10.2\t17686\t75938\t0.2333\t72046\tRomney\t72046\t0.009401923000000001\t72046.0\n1041\t-91.784012\t34.539768\tAllport town\tAR\tArkansas\tLonoke County\t133\t39.3\t5.5\t14.6\t13964\t41000\t0.2333\t72072\tRomney\t72072\t0.00042518\t72072.0\n1042\t-91.760227\t34.542423\tHumnoke city\tAR\tArkansas\tLonoke County\t292\t39.7\t5.4\t15.1\t14026\t42500\t0.2333\t72072\tRomney\t72072\t0.000933479\t72072.0\n1043\t-91.870936\t34.540549\tCoy town\tAR\tArkansas\tLonoke County\t124\t38.8\t7.4\t2.2\t18874\t48500\t0.2333\t72046\tRomney\t72046\t0.000396409\t72046.0\n1044\t-91.957257\t35.013441\tWard city\tAR\tArkansas\tLonoke County\t3698\t31.4\t13.4\t9.4\t18167\t102998\t0.2333\t72007\tRomney\t72007\t0.011821936000000002\t72007.0\n1045\t-92.02684599999999\t34.976037\tCabot city\tAR\tArkansas\tLonoke County\t21697\t33.3\t22.1\t5.2\t26683\t124874\t0.2333\t72023\tRomney\t72023\t0.069361963\t72023.0\n1046\t-93.765424\t35.825105\tSt. Paul town\tAR\tArkansas\tMadison County\t177\t45.8\t13.3\t6.3\t14347\t72500\t0.3196\t72760\tRomney\t72760\t0.000565842\t72760.0\n1047\t-93.862296\t36.146258\tHindsville town\tAR\tArkansas\tMadison County\t76\t40.0\t13.2\t2.6\t18793\t100000\t0.3196\t72738\tRomney\t72738\t0.00024296\t72738.0\n1048\t-93.740029\t36.089141\tHuntsville city\tAR\tArkansas\tMadison County\t2263\t38.7\t15.7\t8.2\t16866\t90233\t0.3196\t72740\tRomney\t72740\t0.007234462\t72740.0\n1049\t-92.68599\t36.228565\tYellville city\tAR\tArkansas\tMarion County\t1460\t44.0\t13.5\t12.4\t14722\t94524\t0.2889\t72687\tRomney\t72687\t0.004667395\t72687.0\n1050\t-92.844105\t36.250972\tPyatt town\tAR\tArkansas\tMarion County\t256\t42.1\t9.8\t11.2\t16505\t83333\t0.2889\t72672\tRomney\t72672\t0.000818393\t72672.0\n1051\t-92.59278499999999\t36.277182\tFlippin city\tAR\tArkansas\tMarion County\t1646\t41.1\t10.6\t11.3\t14722\t94231\t0.2889\t72634\tRomney\t72634\t0.005262008\t72634.0\n1052\t-92.687938\t36.25196\tSummit city\tAR\tArkansas\tMarion County\t598\t42.2\t11.1\t11.0\t17030\t90000\t0.2889\t72677\tRomney\t72677\t0.001911714\t72677.0\n1053\t-92.589883\t36.374984999999995\tBull Shoals city\tAR\tArkansas\tMarion County\t1966\t61.0\t14.8\t11.9\t20970\t117320\t0.2889\t72619\tRomney\t72619\t0.006284999\t72619.0\n1054\t-93.714203\t33.360874\tGarland town\tAR\tArkansas\tMiller County\t396\t40.3\t17.4\t9.0\t20744\t93000\t0.2947\t71839\tRomney\t71839\t0.001265951\t71839.0\n1055\t-93.886567\t33.261140999999995\tFouke town\tAR\tArkansas\tMiller County\t866\t29.2\t8.3\t7.8\t17666\t55000\t0.2947\t71837\tRomney\t71837\t0.002768468\t71837.0\n1056\t-94.00303100000001\t33.435824\tTexarkana city\tAR\tArkansas\tMiller County\t28468\t36.5\t16.0\t8.0\t20984\t82306\t0.2947\t71854\tRomney\t71854\t0.091007806\t71854.0\n1057\t-90.12933000000001\t35.535764\tBassett town\tAR\tArkansas\tMississippi County\t132\t40.0\t10.1\t11.5\t16496\t51667\t0.4835\t72350\tRomney\t72350\t0.00042198400000000003\t72350.0\n1058\t-90.06012\t35.757397\tVictoria town\tAR\tArkansas\tMississippi County\t56\t35.8\t11.1\t13.0\t18249\t75000\t0.4835\t72370\tRomney\t72370\t0.000179023\t72370.0\n1059\t-90.0428\t35.566049\tWilson town\tAR\tArkansas\tMississippi County\t799\t38.5\t15.1\t6.3\t19221\t76250\t0.4835\t72395\tRomney\t72395\t0.00255428\t72395.0\n1060\t-90.095614\t35.673967\tKeiser city\tAR\tArkansas\tMississippi County\t646\t40.6\t10.6\t8.2\t16774\t58125\t0.4835\t72351\tRomney\t72351\t0.002065162\t72351.0\n1061\t-90.034602\t35.856939000000004\tDell town\tAR\tArkansas\tMississippi County\t229\t43.9\t10.6\t12.0\t20594\t67500\t0.4835\t72426\tRomney\t72426\t0.000732078\t72426.0\n1062\t-90.255628\t35.922198\tLeachville city\tAR\tArkansas\tMississippi County\t1872\t38.3\t11.6\t13.1\t15759\t48689\t0.4835\t72438\tRomney\t72438\t0.005984495\t72438.0\n1063\t-89.929745\t35.758255\tLuxora town\tAR\tArkansas\tMississippi County\t1097\t29.3\t6.5\t17.2\t13224\t49634\t0.4835\t72358\tRomney\t72358\t0.00350694\t72358.0\n1064\t-89.997123\t35.699677\tOsceola city\tAR\tArkansas\tMississippi County\t8582\t30.7\t14.1\t12.2\t16442\t73982\t0.4835\t72370\tRomney\t72370\t0.02743533\t72370.0\n1065\t-90.21336600000001\t35.589329\tDyess town\tAR\tArkansas\tMississippi County\t422\t34.3\t5.3\t14.0\t15410\t37885\t0.4835\t72330\tRomney\t72330\t0.001349069\t72330.0\n1066\t-90.083211\t35.613025\tMarie town\tAR\tArkansas\tMississippi County\t86\t42.1\t11.5\t7.5\t16842\t62500\t0.4835\t72395\tRomney\t72395\t0.00027492900000000004\t72395.0\n1067\t-90.26131\t35.459208000000004\tBirdsong town\tAR\tArkansas\tMississippi County\t41\t37.5\t14.8\t11.8\t13921\t35833\t0.4835\t72339\tRomney\t72339\t0.000131071\t72339.0\n1068\t-89.966913\t35.815290000000005\tBurdette town\tAR\tArkansas\tMississippi County\t118\t44.4\t10.7\t12.5\t20535\t70000\t0.4835\t72321\tRomney\t72321\t0.000377228\t72321.0\n1069\t-89.972133\t35.966736\tGosnell city\tAR\tArkansas\tMississippi County\t3557\t29.3\t11.2\t10.5\t22123\t76849\t0.4835\t72315\tRomney\t72315\t0.01137118\t72315.0\n1070\t-90.230952\t35.721989\tEtowah town\tAR\tArkansas\tMississippi County\t291\t35.3\t11.0\t11.2\t11880\t38333\t0.4835\t72428\tRomney\t72428\t0.0009302819999999999\t72428.0\n1071\t-89.90521700000001\t35.932817\tBlytheville city\tAR\tArkansas\tMississippi County\t16888\t34.3\t16.3\t15.6\t18520\t77627\t0.4835\t72315\tRomney\t72315\t0.053988332\t72315.0\n1072\t-90.150176\t35.508501\tJoiner city\tAR\tArkansas\tMississippi County\t425\t38.8\t10.5\t12.0\t16463\t50556\t0.4835\t72350\tRomney\t72350\t0.001358659\t72350.0\n1073\t-90.162414\t35.884328000000004\tManila city\tAR\tArkansas\tMississippi County\t2594\t39.8\t10.5\t10.3\t15095\t58871\t0.4835\t72442\tRomney\t72442\t0.008292618\t72442.0\n1074\t-91.386073\t34.631285\tRoe town\tAR\tArkansas\tMonroe County\t138\t41.1\t12.5\t5.0\t20229\t58333\t0.4901\t72134\tRomney\t72134\t0.000441165\t72134.0\n1075\t-91.177214\t34.954608\tFargo town\tAR\tArkansas\tMonroe County\t97\t36.7\t8.3\t11.8\t12369\t45000\t0.4901\t72392\tRomney\t72392\t0.000310094\t72392.0\n1076\t-91.189421\t34.889472999999995\tBrinkley city\tAR\tArkansas\tMonroe County\t3417\t38.9\t10.6\t10.3\t14467\t55490\t0.4901\t72021\tRomney\t72021\t0.010923622\t72021.0\n1077\t-91.30647900000001\t34.693776\tClarendon city\tAR\tArkansas\tMonroe County\t1936\t40.6\t12.3\t7.4\t18236\t50000\t0.4901\t72029\tRomney\t72029\t0.0061890930000000005\t72029.0\n1078\t-91.200326\t34.597553999999995\tHolly Grove city\tAR\tArkansas\tMonroe County\t531\t40.0\t12.5\t9.7\t14069\t44400\t0.4901\t72069\tRomney\t72069\t0.001697525\t72069.0\n1079\t-93.67926999999999\t34.458575\tNorman town\tAR\tArkansas\tMontgomery County\t396\t39.9\t9.1\t13.7\t16454\t54231\t0.2703\t71960\tRomney\t71960\t0.001265951\t71960.0\n1080\t-93.786103\t34.621188000000004\tOden town\tAR\tArkansas\tMontgomery County\t211\t44.0\t10.7\t4.6\t21909\t79167\t0.2703\t71961\tRomney\t71961\t0.000674534\t71961.0\n1081\t-93.710927\t34.460634000000006\tBlack Springs town\tAR\tArkansas\tMontgomery County\t107\t40.7\t9.7\t13.2\t16410\t50000\t0.2703\t71960\tRomney\t71960\t0.00034206199999999997\t71960.0\n1082\t-93.630868\t34.550951\tMount Ida city\tAR\tArkansas\tMontgomery County\t974\t48.7\t10.9\t10.2\t15547\t69833\t0.2703\t71957\tRomney\t71957\t0.003113728\t71957.0\n1083\t-93.279827\t33.587773\tRosston town\tAR\tArkansas\tNevada County\t278\t37.5\t11.9\t8.5\t16099\t49500\t0.3883\t71858\tRomney\t71858\t0.000888723\t71858.0\n1084\t-93.390628\t33.805479\tPrescott city\tAR\tArkansas\tNevada County\t3561\t39.9\t14.0\t13.2\t16056\t57403\t0.3883\t71857\tRomney\t71857\t0.011383968000000001\t71857.0\n1085\t-93.23459799999999\t33.627945000000004\tCale town\tAR\tArkansas\tNevada County\t79\t38.0\t11.8\t7.5\t16043\t48333\t0.3883\t71858\tRomney\t71858\t0.000252551\t71858.0\n1086\t-93.46538000000001\t33.728119\tEmmet city\tAR\tArkansas\tNevada County\t526\t39.3\t10.8\t5.5\t16812\t58462\t0.3883\t71835\tRomney\t71835\t0.0016815410000000002\t71835.0\n1087\t-93.401297\t33.560546\tBodcaw town\tAR\tArkansas\tNevada County\t156\t41.8\t7.1\t6.6\t18841\t65000\t0.3883\t71858\tRomney\t71858\t0.000498708\t71858.0\n1088\t-93.132103\t33.720898\tBluff City town\tAR\tArkansas\tNevada County\t160\t45.7\t18.3\t15.7\t20287\t55000\t0.3883\t71722\tRomney\t71722\t0.000511495\t71722.0\n1089\t-93.29513\t33.519058\tWillisville town\tAR\tArkansas\tNevada County\t191\t41.3\t7.0\t28.6\t18581\t46500\t0.3883\t71858\tRomney\t71858\t0.0006105980000000001\t71858.0\n1090\t-92.95468199999999\t36.101240999999995\tWestern Grove town\tAR\tArkansas\tNewton County\t397\t40.6\t11.7\t7.6\t15963\t79375\t0.2712\t72685\tRomney\t72685\t0.001269148\t72685.0\n1091\t-93.184338\t36.011575\tJasper city\tAR\tArkansas\tNewton County\t484\t44.8\t16.9\t6.8\t16679\t76875\t0.2712\t72641\tRomney\t72641\t0.0015472729999999998\t72641.0\n1092\t-93.096948\t33.751895000000005\tReader town\tAR\tArkansas\tOuachita County\t74\t47.9\t12.7\t17.9\t21374\t45000\t0.4492\t71722\tRomney\t71722\t0.000236567\t71722.0\n1093\t-92.846804\t33.567269\tCamden city\tAR\tArkansas\tOuachita County\t12029\t40.5\t16.3\t10.5\t18098\t63191\t0.4492\t71701\tRomney\t71701\t0.038454858\t71701.0\n1094\t-92.792101\t33.391552000000004\tLouann town\tAR\tArkansas\tOuachita County\t193\t41.2\t17.4\t7.4\t16373\t67500\t0.4492\t71751\tRomney\t71751\t0.000616991\t71751.0\n1095\t-92.742101\t33.608647999999995\tEast Camden town\tAR\tArkansas\tOuachita County\t831\t34.8\t11.1\t5.1\t19179\t64423\t0.4492\t71701\tRomney\t71701\t0.002656579\t71701.0\n1096\t-93.023937\t33.701563\tChidester city\tAR\tArkansas\tOuachita County\t345\t45.3\t25.6\t8.1\t20526\t88750\t0.4492\t71726\tRomney\t71726\t0.001102912\t71726.0\n1097\t-93.06697700000001\t33.421987\tStephens city\tAR\tArkansas\tOuachita County\t936\t40.9\t10.5\t11.8\t13213\t44286\t0.4492\t71764\tRomney\t71764\t0.002992248\t71764.0\n1098\t-92.61653100000001\t33.727165\tBearden city\tAR\tArkansas\tOuachita County\t963\t39.3\t9.0\t14.4\t17479\t45926\t0.4492\t71720\tRomney\t71720\t0.003078562\t71720.0\n1099\t-92.899026\t35.040083\tAdona town\tAR\tArkansas\tPerry County\t199\t38.0\t9.8\t4.9\t18149\t67500\t0.3014\t72001\tRomney\t72001\t0.000636172\t72001.0\n1100\t-92.79359699999999\t35.044626\tPerry town\tAR\tArkansas\tPerry County\t298\t38.8\t10.4\t8.7\t16679\t71111\t0.3014\t72125\tRomney\t72125\t0.00095266\t72125.0\n1101\t-92.630971\t34.998311\tBigelow town\tAR\tArkansas\tPerry County\t369\t38.2\t17.4\t10.2\t18083\t76563\t0.3014\t72016\tRomney\t72016\t0.001179636\t72016.0\n1102\t-92.803935\t35.009183\tPerryville city\tAR\tArkansas\tPerry County\t1589\t40.5\t11.9\t7.9\t17230\t74149\t0.3014\t72125\tRomney\t72125\t0.005079788\t72125.0\n1103\t-92.618841\t34.993485\tFourche town\tAR\tArkansas\tPerry County\t66\t36.3\t18.2\t9.1\t18137\t78333\t0.3014\t72016\tRomney\t72016\t0.00021099200000000002\t72016.0\n1104\t-92.694576\t35.034957\tHouston town\tAR\tArkansas\tPerry County\t153\t39.4\t13.5\t9.1\t18470\t83750\t0.3014\t72070\tRomney\t72070\t0.000489117\t72070.0\n1105\t-93.044874\t35.025428999999995\tCasa town\tAR\tArkansas\tPerry County\t223\t38.4\t10.1\t4.4\t18181\t70556\t0.3014\t72025\tRomney\t72025\t0.000712897\t72025.0\n1106\t-90.647076\t34.545765\tWest Helena city\tAR\tArkansas\tPhillips County\t7642\t30.7\t14.6\t12.9\t14580\t61159\t0.6559999999999999\t72390\tRomney\t72390\t0.024430295\t72390.0\n1107\t-90.752325\t34.598553\tLexa city\tAR\tArkansas\tPhillips County\t288\t39.8\t9.8\t11.3\t16396\t57500\t0.6559999999999999\t72355\tRomney\t72355\t0.000920692\t72355.0\n1108\t-90.60686899999999\t34.524144\tHelena city\tAR\tArkansas\tPhillips County\t5672\t33.6\t21.1\t16.5\t16159\t63973\t0.6559999999999999\t72342\tRomney\t72342\t0.018132508999999998\t72342.0\n1109\t-90.853449\t34.308599\tElaine city\tAR\tArkansas\tPhillips County\t658\t33.4\t14.5\t15.5\t13528\t45769\t0.6559999999999999\t72333\tRomney\t72333\t0.002103525\t72333.0\n1110\t-90.914372\t34.556235\tMarvell city\tAR\tArkansas\tPhillips County\t1084\t39.2\t16.8\t10.8\t15458\t52794\t0.6559999999999999\t72366\tRomney\t72366\t0.0034653809999999996\t72366.0\n1111\t-90.813325\t34.421192\tLake View city\tAR\tArkansas\tPhillips County\t489\t33.5\t7.9\t32.2\t11108\t43889\t0.6559999999999999\t72369\tRomney\t72369\t0.0015632579999999999\t72369.0\n1112\t-93.740558\t34.234918\tDaisy town\tAR\tArkansas\tPike County\t136\t44.8\t6.2\t6.5\t18761\t59000\t0.2247\t71950\tRomney\t71950\t0.000434771\t71950.0\n1113\t-93.550285\t34.330603\tGlenwood city\tAR\tArkansas\tPike County\t1776\t41.8\t12.6\t8.4\t16232\t78846\t0.2247\t71943\tRomney\t71943\t0.005677598000000001\t71943.0\n1114\t-93.690495\t34.064353999999994\tMurfreesboro city\tAR\tArkansas\tPike County\t1543\t43.2\t13.4\t10.5\t19824\t65761\t0.2247\t71958\tRomney\t71958\t0.004932733\t71958.0\n1115\t-93.50614200000001\t34.02984\tDelight city\tAR\tArkansas\tPike County\t296\t43.9\t9.0\t9.0\t16195\t72000\t0.2247\t71940\tRomney\t71940\t0.0009462660000000001\t71940.0\n1116\t-93.422558\t34.034225\tAntoine town\tAR\tArkansas\tPike County\t136\t40.6\t7.8\t1.8\t19738\t50000\t0.2247\t71922\tRomney\t71922\t0.000434771\t71922.0\n1117\t-90.333535\t35.607768\tLepanto city\tAR\tArkansas\tPoinsett County\t1960\t36.0\t9.4\t13.0\t15305\t56563\t0.3161\t72354\tRomney\t72354\t0.006265818\t72354.0\n1118\t-90.93463299999999\t35.565269\tWaldenburg town\tAR\tArkansas\tPoinsett County\t71\t43.5\t7.8\t6.1\t13534\t47500\t0.3161\t72475\tRomney\t72475\t0.000226976\t72475.0\n1119\t-90.52351999999999\t35.676624\tTrumann city\tAR\tArkansas\tPoinsett County\t6696\t36.4\t5.7\t11.9\t16386\t67306\t0.3161\t72472\tRomney\t72472\t0.021406078999999998\t72472.0\n1120\t-90.97264100000001\t35.491495\tFisher town\tAR\tArkansas\tPoinsett County\t235\t44.7\t8.7\t6.4\t13544\t50000\t0.3161\t72429\tRomney\t72429\t0.0007512589999999999\t72429.0\n1121\t-90.721595\t35.561927000000004\tHarrisburg city\tAR\tArkansas\tPoinsett County\t2220\t39.0\t9.2\t6.8\t16922\t57471\t0.3161\t72432\tRomney\t72432\t0.007096998\t72432.0\n1122\t-90.416736\t35.529576\tMarked Tree city\tAR\tArkansas\tPoinsett County\t2595\t40.8\t10.5\t11.4\t15042\t73487\t0.3161\t72365\tRomney\t72365\t0.008295815\t72365.0\n1123\t-90.90547600000001\t35.619707\tWeiner city\tAR\tArkansas\tPoinsett County\t796\t41.3\t16.7\t6.6\t21042\t71000\t0.3161\t72479\tRomney\t72479\t0.002544689\t72479.0\n1124\t-90.359274\t35.487914\tTyronza town\tAR\tArkansas\tPoinsett County\t834\t35.9\t8.3\t13.4\t17958\t61346\t0.3161\t72386\tRomney\t72386\t0.0026661690000000004\t72386.0\n1125\t-94.333337\t34.298787\tWickes town\tAR\tArkansas\tPolk County\t694\t34.5\t10.1\t11.8\t13793\t48438\t0.2014\t71973\tRomney\t71973\t0.002218611\t71973.0\n1126\t-94.32144699999999\t34.240276\tGrannis city\tAR\tArkansas\tPolk County\t610\t36.0\t10.3\t12.6\t16713\t71364\t0.2014\t71944\tRomney\t71944\t0.001950076\t71944.0\n1127\t-94.416891\t34.436623\tCove town\tAR\tArkansas\tPolk County\t403\t38.2\t7.5\t12.4\t16771\t55588\t0.2014\t71937\tRomney\t71937\t0.001288329\t71937.0\n1128\t-94.364643\t34.380162\tVandervoort town\tAR\tArkansas\tPolk County\t122\t39.3\t10.7\t11.5\t16669\t58750\t0.2014\t71937\tRomney\t71937\t0.000390015\t71937.0\n1129\t-94.3793\t34.485976\tHatfield town\tAR\tArkansas\tPolk County\t402\t39.0\t11.6\t9.9\t13693\t69333\t0.2014\t71945\tRomney\t71945\t0.001285132\t71945.0\n1130\t-94.237326\t34.581163000000004\tMena city\tAR\tArkansas\tPolk County\t5426\t42.1\t15.9\t8.3\t18565\t85141\t0.2014\t71953\tRomney\t71953\t0.017346085\t71953.0\n1131\t-93.112626\t35.402418\tDover city\tAR\tArkansas\tPope County\t1507\t37.6\t15.0\t8.4\t18307\t93125\t0.2508\t72837\tRomney\t72837\t0.004817647\t72837.0\n1132\t-92.976262\t35.464427\tHector town\tAR\tArkansas\tPope County\t521\t40.3\t10.3\t5.3\t17759\t73214\t0.2508\t72843\tRomney\t72843\t0.001665557\t72843.0\n1133\t-93.237352\t35.327965999999996\tLondon city\tAR\tArkansas\tPope County\t1002\t41.4\t17.3\t9.1\t20365\t96957\t0.2508\t72847\tRomney\t72847\t0.003203239\t72847.0\n1134\t-93.139898\t35.271961\tRussellville city\tAR\tArkansas\tPope County\t26436\t32.6\t28.8\t8.7\t21717\t110364\t0.2508\t72801\tRomney\t72801\t0.084511815\t72801.0\n1135\t-92.946318\t35.24155\tAtkins city\tAR\tArkansas\tPope County\t2918\t39.6\t11.1\t6.7\t17324\t82151\t0.2508\t72823\tRomney\t72823\t0.009328396\t72823.0\n1136\t-93.055378\t35.240565000000004\tPottsville town\tAR\tArkansas\tPope County\t1401\t38.6\t11.7\t9.3\t17270\t90000\t0.2508\t72858\tRomney\t72858\t0.004478780999999999\t72858.0\n1137\t-91.461703\t34.576260999999995\tUlm town\tAR\tArkansas\tPrairie County\t180\t45.8\t12.2\t7.4\t18691\t83125\t0.2802\t72170\tRomney\t72170\t0.000575432\t72170.0\n1138\t-91.410311\t34.81893\tFredonia (Biscoe) town\tAR\tArkansas\tPrairie County\t419\t41.1\t7.0\t9.8\t14913\t33571\t0.2802\t72017\tRomney\t72017\t0.0013394779999999998\t72017.0\n1139\t-91.46040500000001\t34.785816\tDe Valls Bluff town\tAR\tArkansas\tPrairie County\t756\t42.0\t11.5\t8.1\t18444\t46129\t0.2802\t72041\tRomney\t72041\t0.002416815\t72041.0\n1140\t-91.507143\t34.977332000000004\tDes Arc city\tAR\tArkansas\tPrairie County\t1813\t42.3\t11.1\t10.2\t18967\t55000\t0.2802\t72040\tRomney\t72040\t0.005795881\t72040.0\n1141\t-91.56939100000001\t34.818598\tHazen city\tAR\tArkansas\tPrairie County\t1565\t44.2\t11.9\t9.0\t19205\t69878\t0.2802\t72064\tRomney\t72064\t0.005003064000000001\t72064.0\n1142\t-92.220348\t34.610783000000005\tWrightsville city\tAR\tArkansas\tPulaski County\t1347\t37.7\t9.2\t12.0\t15672\t55000\t0.5474\t72183\tRomney\t72183\t0.004306150999999999\t72183.0\n1143\t-92.223519\t34.891734\tGibson CDP\tAR\tArkansas\tPulaski County\t5583\t37.7\t18.2\t7.1\t26304\t94475\t0.5474\t72120\tRomney\t72120\t0.01784799\t72120.0\n1144\t-92.320615\t34.607096999999996\tParkers-Iron Springs CDP\tAR\tArkansas\tPulaski County\t3480\t44.0\t9.2\t9.8\t23300\t78443\t0.5474\t72103\tRomney\t72103\t0.011125023000000001\t72103.0\n1145\t-92.410154\t34.852282\tMaumelle city\tAR\tArkansas\tPulaski County\t14848\t37.2\t43.3\t3.3\t36344\t156353\t0.5474\t72113\tRomney\t72113\t0.047466765999999994\t72113.0\n1146\t-92.344759\t34.780912\tCammack Village city\tAR\tArkansas\tPulaski County\t830\t37.9\t59.6\t3.0\t34799\t117135\t0.5474\t72207\tRomney\t72207\t0.002653382\t72207.0\n1147\t-92.19593499999999\t34.792986\tMcAlmont CDP\tAR\tArkansas\tPulaski County\t2034\t40.0\t8.6\t7.2\t15298\t59032\t0.5474\t72117\tRomney\t72117\t0.006502384\t72117.0\n1148\t-92.35882600000001\t34.7244\tLittle Rock city\tAR\tArkansas\tPulaski County\t194160\t36.5\t38.5\t8.4\t29293\t112571\t0.5474\t72204\tRomney\t72204\t0.620699576\t72204.0\n1149\t-92.246531\t34.671289\tSweet Home CDP\tAR\tArkansas\tPulaski County\t1017\t37.2\t10.2\t13.6\t13858\t60172\t0.5474\t72206\tRomney\t72206\t0.003251192\t72206.0\n1150\t-92.22124699999999\t34.537838\tWoodson CDP\tAR\tArkansas\tPulaski County\t444\t37.0\t4.9\t10.9\t15946\t66053\t0.5474\t72180\tRomney\t72180\t0.0014194000000000001\t72180.0\n1151\t-92.20691\t34.50691\tHensley CDP\tAR\tArkansas\tPulaski County\t149\t37.1\t5.1\t11.6\t16016\t66667\t0.5474\t72180\tRomney\t72180\t0.00047633\t72180.0\n1152\t-92.184758\t34.868660999999996\tGravel Ridge CDP\tAR\tArkansas\tPulaski County\t3234\t35.6\t16.3\t8.3\t24700\t88465\t0.5474\t72120\tRomney\t72120\t0.010338599\t72120.0\n1153\t-92.208838\t34.835844\tSherwood city\tAR\tArkansas\tPulaski County\t24127\t37.4\t28.3\t6.4\t28956\t113924\t0.5474\t72120\tRomney\t72120\t0.077130298\t72120.0\n1154\t-92.229796\t34.705252\tCollege Station CDP\tAR\tArkansas\tPulaski County\t715\t44.5\t7.4\t25.0\t12626\t46029\t0.5474\t72053\tRomney\t72053\t0.002285745\t72053.0\n1155\t-92.130955\t34.880497999999996\tJacksonville city\tAR\tArkansas\tPulaski County\t30394\t30.7\t16.7\t10.3\t20864\t87187\t0.5474\t72076\tRomney\t72076\t0.097164931\t72076.0\n1156\t-92.25177\t34.788044\tNorth Little Rock city\tAR\tArkansas\tPulaski County\t61470\t38.4\t24.5\t7.8\t24863\t95558\t0.5474\t72116\tRomney\t72116\t0.19651011\t72116.0\n1157\t-92.442832\t34.633935\tAlexander town\tAR\tArkansas\tPulaski County\t618\t37.7\t14.4\t6.4\t21410\t65000\t0.5474\t72022\tRomney\t72022\t0.001975651\t72022.0\n1158\t-90.902334\t36.422142\tMaynard town\tAR\tArkansas\tRandolph County\t372\t43.2\t8.7\t13.5\t14940\t58500\t0.3435\t72444\tRomney\t72444\t0.001189227\t72444.0\n1159\t-90.818268\t36.171689\tO'Kean town\tAR\tArkansas\tRandolph County\t195\t38.1\t4.6\t7.3\t18215\t47500\t0.3435\t72449\tRomney\t72449\t0.000623385\t72449.0\n1160\t-90.805275\t36.331891\tBiggers town\tAR\tArkansas\tRandolph County\t343\t40.3\t6.1\t10.8\t14444\t43529\t0.3435\t72413\tRomney\t72413\t0.001096518\t72413.0\n1161\t-90.96976\t36.263116\tPocahontas city\tAR\tArkansas\tRandolph County\t6323\t40.0\t17.3\t11.5\t18676\t80991\t0.3435\t724HH\tRomney\t724HH\t0.020213656\t0.0\n1162\t-90.758966\t36.360803999999995\tReyno town\tAR\tArkansas\tRandolph County\t503\t41.2\t9.7\t15.2\t13026\t47727\t0.3435\t72462\tRomney\t72462\t0.001608013\t72462.0\n1163\t-91.223263\t36.312736\tRavenden Springs town\tAR\tArkansas\tRandolph County\t151\t43.3\t10.1\t7.7\t18804\t80000\t0.3435\t72460\tRomney\t72460\t0.000482724\t72460.0\n1164\t-90.73040400000001\t35.019016\tMadison city\tAR\tArkansas\tSt. Francis County\t802\t32.3\t12.4\t11.6\t9281\t47500\t0.5872\t72359\tRomney\t72359\t0.00256387\t72359.0\n1165\t-90.813377\t35.079197\tCaldwell town\tAR\tArkansas\tSt. Francis County\t456\t36.6\t11.0\t9.7\t18280\t69583\t0.5872\t72322\tRomney\t72322\t0.001457762\t72322.0\n1166\t-90.470775\t34.948521\tHughes city\tAR\tArkansas\tSt. Francis County\t1553\t33.4\t12.2\t14.7\t12845\t50000\t0.5872\t72348\tRomney\t72348\t0.004964701\t72348.0\n1167\t-90.681249\t35.022129\tWidener town\tAR\tArkansas\tSt. Francis County\t274\t33.2\t15.9\t11.2\t17507\t43000\t0.5872\t72359\tRomney\t72359\t0.000875936\t72359.0\n1168\t-91.106166\t34.919728000000006\tWheatley city\tAR\tArkansas\tSt. Francis County\t299\t40.6\t6.5\t15.8\t15059\t53235\t0.5872\t72392\tRomney\t72392\t0.000955857\t72392.0\n1169\t-90.905652\t34.969103999999994\tPalestine city\tAR\tArkansas\tSt. Francis County\t743\t39.9\t7.3\t4.0\t16394\t67500\t0.5872\t72372\tRomney\t72372\t0.002375256\t72372.0\n1170\t-90.787121\t35.010591999999995\tForrest City\tAR\tArkansas\tSt. Francis County\t15460\t33.4\t13.6\t17.4\t14276\t72832\t0.5872\t72335\tRomney\t72335\t0.049423235999999995\t72335.0\n1171\t-90.81289100000001\t35.132863\tColt city\tAR\tArkansas\tSt. Francis County\t314\t38.1\t3.8\t9.3\t19447\t60000\t0.5872\t72322\tRomney\t72322\t0.00100381\t72322.0\n1172\t-92.664118\t34.453441\tTraskwood town\tAR\tArkansas\tSaline County\t641\t36.4\t8.4\t8.8\t19668\t74048\t0.2734\t72167\tRomney\t72167\t0.002049178\t72167.0\n1173\t-92.576225\t34.571345\tBenton city\tAR\tArkansas\tSaline County\t24967\t39.3\t20.2\t6.5\t26874\t113379\t0.2734\t72015\tRomney\t72015\t0.079815649\t72015.0\n1174\t-92.40912800000001\t34.621682\tShannon Hills city\tAR\tArkansas\tSaline County\t3007\t38.2\t10.0\t6.7\t21451\t78884\t0.2734\t72103\tRomney\t72103\t0.009612915\t72103.0\n1175\t-92.49126600000001\t34.614752\tBryant city\tAR\tArkansas\tSaline County\t13422\t37.9\t24.9\t5.9\t26399\t128653\t0.2734\t72022\tRomney\t72022\t0.042908064\t72022.0\n1176\t-92.559321\t34.630353\tSalem CDP\tAR\tArkansas\tSaline County\t2970\t38.2\t16.4\t7.4\t26123\t110516\t0.2734\t72002\tRomney\t72002\t0.009494632\t72002.0\n1177\t-92.326298\t34.555394\tEast End CDP\tAR\tArkansas\tSaline County\t6613\t37.3\t13.9\t6.1\t25114\t95000\t0.2734\t72065\tRomney\t72065\t0.021140741\t72065.0\n1178\t-92.507986\t34.559835\tBauxite town\tAR\tArkansas\tSaline County\t591\t36.6\t12.2\t7.2\t21718\t85417\t0.2734\t72022\tRomney\t72022\t0.0018893360000000001\t72022.0\n1179\t-92.63880999999999\t34.508497\tHaskell city\tAR\tArkansas\tSaline County\t3490\t37.5\t8.0\t18.0\t18276\t70700\t0.2734\t72015\tRomney\t72015\t0.011156992\t72015.0\n1180\t-94.228842\t35.067613\tMansfield city\tAR\tArkansas\tScott County\t1288\t37.4\t12.1\t5.0\t18031\t70306\t0.2464\t72944\tRomney\t72944\t0.004117537\t72944.0\n1181\t-94.094212\t34.900821\tWaldron city\tAR\tArkansas\tScott County\t4087\t37.4\t12.0\t7.7\t17103\t76205\t0.2464\t72958\tRomney\t72958\t0.013065509\t72958.0\n1182\t-92.63888299999999\t35.908664\tMarshall city\tAR\tArkansas\tSearcy County\t1300\t45.4\t9.4\t6.1\t16554\t71600\t0.2204\t72650\tRomney\t72650\t0.0041559\t72650.0\n1183\t-92.86217099999999\t36.063669\tPindall town\tAR\tArkansas\tSearcy County\t94\t38.9\t6.3\t9.1\t13688\t61667\t0.2204\t72669\tRomney\t72669\t0.000300504\t72669.0\n1184\t-92.717416\t35.991496999999995\tGilbert town\tAR\tArkansas\tSearcy County\t34\t38.8\t8.3\t13.3\t12251\t80000\t0.2204\t72675\tRomney\t72675\t0.000108693\t72675.0\n1185\t-92.812635\t36.029534000000005\tSt. Joe town\tAR\tArkansas\tSearcy County\t87\t41.7\t6.8\t10.5\t12557\t77500\t0.2204\t72675\tRomney\t72675\t0.00027812599999999996\t72675.0\n1186\t-92.55610300000001\t35.829645\tLeslie city\tAR\tArkansas\tSearcy County\t477\t41.2\t13.2\t11.0\t17067\t62500\t0.2204\t72645\tRomney\t72645\t0.001524895\t72645.0\n1187\t-94.38445\t35.364445\tFort Smith city\tAR\tArkansas\tSebastian County\t85879\t36.9\t21.1\t8.2\t23646\t99423\t0.3019\t72903\tRomney\t72903\t0.27454191899999997\t72903.0\n1188\t-94.234866\t35.328792\tCentral City town\tAR\tArkansas\tSebastian County\t587\t42.3\t15.3\t6.0\t22879\t106818\t0.3019\t729XX\tRomney\t729XX\t0.0018765479999999998\t0.0\n1189\t-94.379625\t35.023371999999995\tHartford city\tAR\tArkansas\tSebastian County\t839\t39.5\t5.2\t6.5\t17539\t59444\t0.3019\t72938\tRomney\t72938\t0.0026821540000000004\t72938.0\n1190\t-94.234306\t35.213653\tGreenwood city\tAR\tArkansas\tSebastian County\t7802\t34.7\t19.3\t5.3\t19291\t103031\t0.3019\t72936\tRomney\t72936\t0.024941791\t72936.0\n1191\t-94.17948\t35.334798\tLavaca city\tAR\tArkansas\tSebastian County\t2015\t36.8\t14.3\t6.1\t19237\t85319\t0.3019\t72941\tRomney\t72941\t0.006441644\t72941.0\n1192\t-94.266311\t35.081433000000004\tHuntington city\tAR\tArkansas\tSebastian County\t748\t39.8\t12.6\t5.9\t17879\t73400\t0.3019\t72940\tRomney\t72940\t0.002391241\t72940.0\n1193\t-94.35278000000001\t35.093205\tMidland town\tAR\tArkansas\tSebastian County\t283\t41.0\t12.0\t8.5\t16699\t72500\t0.3019\t72945\tRomney\t72945\t0.0009047069999999999\t72945.0\n1194\t-94.293959\t35.311784\tBarling city\tAR\tArkansas\tSebastian County\t4553\t35.8\t14.6\t11.6\t23450\t81955\t0.3019\t72923\tRomney\t72923\t0.014555239\t72923.0\n1195\t-94.4277\t35.234426\tBonanza town\tAR\tArkansas\tSebastian County\t613\t45.1\t16.7\t2.8\t25188\t137500\t0.3019\t72916\tRomney\t72916\t0.001959666\t72916.0\n1196\t-94.411277\t35.187513\tHackett city\tAR\tArkansas\tSebastian County\t812\t40.2\t6.1\t6.3\t18236\t80682\t0.3019\t72937\tRomney\t72937\t0.002595839\t72937.0\n1197\t-94.31448\t34.168889\tGillham town\tAR\tArkansas\tSevier County\t204\t38.0\t12.5\t7.1\t18628\t72500\t0.2406\t71841\tRomney\t71841\t0.000652157\t71841.0\n1198\t-94.176222\t33.971647999999995\tLockesburg town\tAR\tArkansas\tSevier County\t723\t35.4\t10.0\t7.8\t17073\t69000\t0.2406\t71846\tRomney\t71846\t0.002311319\t71846.0\n1199\t-94.355374\t33.94112\tHoratio city\tAR\tArkansas\tSevier County\t976\t35.0\t14.3\t8.7\t18316\t70882\t0.2406\t71842\tRomney\t71842\t0.0031201209999999996\t71842.0\n1200\t-94.34289100000001\t34.042922999999995\tDe Queen city\tAR\tArkansas\tSevier County\t6272\t32.0\t10.9\t8.5\t13828\t78000\t0.2406\t71832\tRomney\t71832\t0.020050617\t71832.0\n1201\t-94.117566\t33.83355\tBen Lomond town\tAR\tArkansas\tSevier County\t126\t42.8\t9.9\t7.9\t18010\t73333\t0.2406\t71823\tRomney\t71823\t0.000402803\t71823.0\n1202\t-91.47963299999999\t36.320928\tHardy city\tAR\tArkansas\tSharp County\t599\t53.0\t13.4\t10.5\t16459\t80000\t0.2872\t72542\tRomney\t72542\t0.001914911\t72542.0\n1203\t-91.65807099999999\t36.004668\tSidney town\tAR\tArkansas\tSharp County\t317\t41.1\t11.0\t12.2\t16127\t89000\t0.2872\t72577\tRomney\t72577\t0.0010134\t72577.0\n1204\t-91.60945600000001\t36.255377\tAsh Flat city\tAR\tArkansas\tSharp County\t919\t46.1\t14.4\t11.1\t15214\t81379\t0.2872\t72513\tRomney\t72513\t0.0029379009999999997\t72513.0\n1205\t-91.62200000000001\t36.07026\tEvening Shade town\tAR\tArkansas\tSharp County\t496\t44.5\t8.7\t9.3\t17551\t69750\t0.2872\t72532\tRomney\t72532\t0.001585636\t72532.0\n1206\t-91.360301\t36.251721\tWilliford town\tAR\tArkansas\tSharp County\t87\t45.0\t15.9\t2.9\t15961\t92500\t0.2872\t72482\tRomney\t72482\t0.00027812599999999996\t72482.0\n1207\t-91.516491\t36.26579\tHighland city\tAR\tArkansas\tSharp County\t1446\t46.5\t13.8\t4.5\t17665\t83971\t0.2872\t72542\tRomney\t72542\t0.0046226390000000004\t72542.0\n1208\t-91.547219\t35.950132\tCave City\tAR\tArkansas\tSharp County\t2200\t37.6\t6.2\t11.3\t14069\t70325\t0.2872\t72521\tRomney\t72521\t0.007033061\t72521.0\n1209\t-92.102967\t35.863009999999996\tMountain View city\tAR\tArkansas\tStone County\t3284\t47.5\t11.3\t6.9\t17589\t96719\t0.2533\t72560\tRomney\t72560\t0.010498442\t72560.0\n1210\t-92.230062\t35.962031\tFifty-Six city\tAR\tArkansas\tStone County\t162\t48.2\t14.9\t11.5\t16661\t94000\t0.2533\t72533\tRomney\t72533\t0.000517889\t72533.0\n1211\t-92.731171\t33.363962\tSmackover city\tAR\tArkansas\tUnion County\t1904\t42.8\t17.0\t9.0\t18018\t65152\t0.3607\t71762\tRomney\t71762\t0.006086794\t71762.0\n1212\t-92.538588\t33.328379999999996\tCalion city\tAR\tArkansas\tUnion County\t467\t41.9\t12.6\t8.8\t17626\t64231\t0.3607\t71724\tRomney\t71724\t0.001492927\t71724.0\n1213\t-92.35987\t33.107925\tStrong city\tAR\tArkansas\tUnion County\t575\t37.6\t9.9\t12.3\t14111\t46563\t0.3607\t71765\tRomney\t71765\t0.0018381860000000001\t71765.0\n1214\t-92.724246\t33.022397\tJunction City\tAR\tArkansas\tUnion County\t706\t39.4\t13.0\t12.6\t19562\t58750\t0.3607\t71749\tRomney\t71749\t0.002256973\t71749.0\n1215\t-92.662217\t33.320038000000004\tNorphlet city\tAR\tArkansas\tUnion County\t771\t39.3\t17.2\t10.4\t20597\t72632\t0.3607\t71759\tRomney\t71759\t0.002464768\t71759.0\n1216\t-92.66405\t33.218289\tEl Dorado city\tAR\tArkansas\tUnion County\t20048\t39.6\t21.1\t14.1\t20149\t73511\t0.3607\t71730\tRomney\t71730\t0.064090364\t71730.0\n1217\t-92.153253\t33.058840999999994\tFelsenthal town\tAR\tArkansas\tUnion County\t135\t42.2\t9.6\t19.6\t17310\t41667\t0.3607\t71747\tRomney\t71747\t0.000431574\t71747.0\n1218\t-92.181843\t33.041854\tHuttig city\tAR\tArkansas\tUnion County\t651\t41.9\t9.9\t19.0\t17269\t43043\t0.3607\t71747\tRomney\t71747\t0.002081147\t71747.0\n1219\t-92.313709\t35.644465000000004\tShirley town\tAR\tArkansas\tVan Buren County\t368\t51.8\t14.0\t10.2\t17042\t71111\t0.2849\t72153\tRomney\t72153\t0.001176439\t72153.0\n1220\t-92.453839\t35.580890000000004\tClinton city\tAR\tArkansas\tVan Buren County\t2328\t45.2\t13.0\t10.8\t18124\t83790\t0.2849\t72031\tRomney\t72031\t0.007442257\t72031.0\n1221\t-92.23524300000001\t35.606167\tFairfield Bay city\tAR\tArkansas\tVan Buren County\t2618\t66.6\t24.1\t9.3\t28200\t101463\t0.2849\t72088\tRomney\t72088\t0.008369342\t72088.0\n1222\t-94.246416\t36.175394\tTontitown city\tAR\tArkansas\tWashington County\t1224\t39.3\t20.0\t5.8\t22399\t156250\t0.4007\t72762\tRomney\t72762\t0.003912939\t72762.0\n1223\t-94.17223100000001\t36.13313\tJohnson city\tAR\tArkansas\tWashington County\t2794\t32.9\t35.9\t6.6\t26791\t141288\t0.4007\t72762\tRomney\t72762\t0.008931986999999999\t72762.0\n1224\t-94.216647\t36.215923\tElm Springs city\tAR\tArkansas\tWashington County\t1549\t41.1\t18.5\t6.2\t22490\t145833\t0.4007\t72762\tRomney\t72762\t0.004951914\t72762.0\n1225\t-94.255708\t36.049023\tFarmington city\tAR\tArkansas\tWashington County\t4570\t32.1\t22.9\t6.9\t18739\t115863\t0.4007\t72730\tRomney\t72730\t0.014609585\t72730.0\n1226\t-94.027212\t36.015952\tElkins city\tAR\tArkansas\tWashington County\t1993\t36.3\t18.0\t6.7\t20401\t106890\t0.4007\t72727\tRomney\t72727\t0.006371314\t72727.0\n1227\t-94.180008\t35.935602\tWest Fork city\tAR\tArkansas\tWashington County\t2285\t37.8\t13.2\t6.4\t18450\t103435\t0.4007\t72774\tRomney\t72774\t0.007304793\t72774.0\n1228\t-94.147173\t36.222683\tSpringdale city\tAR\tArkansas\tWashington County\t64482\t32.5\t21.2\t7.8\t20907\t118824\t0.4007\t72745\tRomney\t72745\t0.20613901\t72745.0\n1229\t-94.319353\t35.977318\tPrairie Grove city\tAR\tArkansas\tWashington County\t2875\t37.2\t18.1\t6.7\t19733\t108520\t0.4007\t72753\tRomney\t72753\t0.009190931999999999\t72753.0\n1230\t-94.423383\t35.949323\tLincoln city\tAR\tArkansas\tWashington County\t2007\t38.2\t9.8\t10.8\t16412\t99103\t0.4007\t72744\tRomney\t72744\t0.006416069\t72744.0\n1231\t-94.13014799999999\t35.800477\tWinslow city\tAR\tArkansas\tWashington County\t440\t41.8\t13.7\t5.0\t17674\t87500\t0.4007\t72959\tRomney\t72959\t0.001406612\t72959.0\n1232\t-94.185885\t36.000696999999995\tGreenland city\tAR\tArkansas\tWashington County\t1083\t36.4\t18.5\t7.1\t19450\t107933\t0.4007\t72701\tRomney\t72701\t0.003462184\t72701.0\n1233\t-94.155506\t36.072353\tFayetteville city\tAR\tArkansas\tWashington County\t74613\t28.7\t42.6\t8.0\t23982\t133046\t0.4007\t72701\tRomney\t72701\t0.238526254\t72701.0\n1234\t-94.002333\t36.104587\tGoshen town\tAR\tArkansas\tWashington County\t890\t39.9\t24.3\t6.1\t22829\t141000\t0.4007\t727HH\tRomney\t727HH\t0.0028451929999999998\t0.0\n1235\t-91.733387\t35.244157\tSearcy city\tAR\tArkansas\tWhite County\t21056\t32.6\t30.9\t9.8\t21232\t125943\t0.2174\t72143\tRomney\t72143\t0.067312785\t72143.0\n1236\t-91.83950300000001\t35.426113\tPangburn city\tAR\tArkansas\tWhite County\t703\t39.3\t12.2\t10.8\t16841\t80769\t0.2174\t72121\tRomney\t72121\t0.002247383\t72121.0\n1237\t-91.645705\t35.124441\tGriffithville town\tAR\tArkansas\tWhite County\t260\t41.0\t11.7\t13.3\t16494\t63333\t0.2174\t72060\tRomney\t72060\t0.00083118\t72060.0\n1238\t-91.71149799999999\t35.195393\tHigginson town\tAR\tArkansas\tWhite County\t354\t39.2\t9.1\t10.5\t17300\t67222\t0.2174\t72068\tRomney\t72068\t0.001131683\t72068.0\n1239\t-91.571147\t35.311105\tBald Knob city\tAR\tArkansas\tWhite County\t3547\t38.3\t10.7\t15.6\t18149\t64737\t0.2174\t72010\tRomney\t72010\t0.011339212\t72010.0\n1240\t-91.829577\t35.36356\tLetona town\tAR\tArkansas\tWhite County\t216\t39.0\t11.6\t11.0\t16835\t79000\t0.2174\t72085\tRomney\t72085\t0.0006905189999999999\t72085.0\n1241\t-91.894033\t35.071453999999996\tBeebe city\tAR\tArkansas\tWhite County\t5908\t37.3\t16.6\t8.8\t21152\t108797\t0.2174\t72012\tRomney\t72012\t0.018886965\t72012.0\n1242\t-91.780823\t35.14193\tGarner town\tAR\tArkansas\tWhite County\t281\t38.2\t7.4\t7.6\t13610\t68750\t0.2174\t72102\tRomney\t72102\t0.000898314\t72102.0\n1243\t-91.456753\t35.423544\tBradford city\tAR\tArkansas\tWhite County\t829\t40.2\t11.1\t8.5\t15582\t52692\t0.2174\t72020\tRomney\t72020\t0.002650185\t72020.0\n1244\t-91.822176\t35.113448999999996\tMcRae city\tAR\tArkansas\tWhite County\t790\t38.1\t7.5\t7.8\t13604\t68333\t0.2174\t72102\tRomney\t72102\t0.002525508\t72102.0\n1245\t-91.641348\t35.276412\tJudsonia city\tAR\tArkansas\tWhite County\t2112\t42.2\t9.2\t12.2\t16042\t69655\t0.2174\t72081\tRomney\t72081\t0.006751738\t72081.0\n1246\t-91.453579\t35.126422999999996\tGeorgetown town\tAR\tArkansas\tWhite County\t125\t41.7\t12.2\t12.8\t16492\t67500\t0.2174\t72060\tRomney\t72060\t0.000399606\t72060.0\n1247\t-91.670468\t35.235021\tKensett city\tAR\tArkansas\tWhite County\t1892\t39.1\t7.5\t11.5\t13507\t58839\t0.2174\t72082\tRomney\t72082\t0.006048431999999999\t72082.0\n1248\t-92.080551\t35.325205\tRose Bud town\tAR\tArkansas\tWhite County\t464\t42.2\t18.3\t6.3\t18967\t97222\t0.2174\t72137\tRomney\t72137\t0.001483336\t72137.0\n1249\t-91.609545\t35.202953\tWest Point town\tAR\tArkansas\tWhite County\t217\t38.2\t11.6\t7.6\t13277\t63000\t0.2174\t72082\tRomney\t72082\t0.000693716\t72082.0\n1250\t-91.510036\t35.362017\tRussell town\tAR\tArkansas\tWhite County\t229\t38.3\t6.5\t16.1\t14863\t66667\t0.2174\t72139\tRomney\t72139\t0.000732078\t72139.0\n1251\t-91.252054\t35.006054999999996\tCotton Plant city\tAR\tArkansas\tWoodruff County\t721\t41.3\t9.3\t21.4\t10291\t27632\t0.4991\t72036\tRomney\t72036\t0.002304926\t72036.0\n1252\t-91.12286999999999\t35.054402\tHunter town\tAR\tArkansas\tWoodruff County\t126\t41.6\t5.7\t6.6\t16226\t40000\t0.4991\t72074\tRomney\t72074\t0.000402803\t72074.0\n1253\t-91.19698299999999\t35.257434\tMcCrory city\tAR\tArkansas\tWoodruff County\t1587\t42.0\t15.0\t9.9\t18963\t59884\t0.4991\t72123\tRomney\t72123\t0.005073394\t72123.0\n1254\t-91.235162\t35.259083000000004\tPatterson town\tAR\tArkansas\tWoodruff County\t373\t45.9\t7.4\t12.9\t14145\t32500\t0.4991\t72123\tRomney\t72123\t0.001192423\t72123.0\n1255\t-91.361689\t35.285375\tAugusta city\tAR\tArkansas\tWoodruff County\t2463\t38.2\t9.4\t16.7\t15681\t45542\t0.4991\t72006\tRomney\t72006\t0.007873831\t72006.0\n1256\t-93.42362\t35.068923999999996\tCorinth town\tAR\tArkansas\tYell County\t56\t36.3\t7.5\t7.4\t16442\t65000\t0.2882\t72833\tRomney\t72833\t0.000179023\t72833.0\n1257\t-93.390302\t35.052793\tDanville city\tAR\tArkansas\tYell County\t2497\t34.4\t12.5\t6.2\t15250\t78382\t0.2882\t72833\tRomney\t72833\t0.007982524\t72833.0\n1258\t-93.297947\t34.989867\tPlainview city\tAR\tArkansas\tYell County\t736\t37.9\t9.0\t8.4\t14236\t55800\t0.2882\t72853\tRomney\t72853\t0.002352878\t72853.0\n1259\t-93.166952\t35.227494\tDardanelle city\tAR\tArkansas\tYell County\t4839\t38.8\t13.3\t9.7\t17829\t92542\t0.2882\t72834\tRomney\t72834\t0.015469537\t72834.0\n1260\t-93.52799\t35.110963\tHavana city\tAR\tArkansas\tYell County\t374\t38.8\t8.2\t8.2\t14937\t64091\t0.2882\t72842\tRomney\t72842\t0.00119562\t72842.0\n1261\t-93.224227\t35.030968\tOla city\tAR\tArkansas\tYell County\t1139\t37.3\t7.9\t10.2\t13999\t64762\t0.2882\t72853\tRomney\t72853\t0.003641207\t72853.0\n1262\t-93.445654\t35.091458\tBelleville city\tAR\tArkansas\tYell County\t318\t38.5\t6.4\t7.7\t16526\t78750\t0.2882\t72824\tRomney\t72824\t0.001016597\t72824.0\n1263\t-122.275351\t37.774504\tAlameda city\tCA\tCalifornia\tAlameda County\t74348\t39.8\t48.5\t11.4\t40408\t465844\t0.7885\t94501\tObama\t94501\t0.11831300199999999\t94501.0\n1264\t-122.031209\t37.521056\tNewark city\tCA\tCalifornia\tAlameda County\t43225\t35.1\t29.5\t12.6\t29146\t424728\t0.7885\t94560\tObama\t94560\t0.068785704\t94560.0\n1265\t-122.15892\t37.707397\tSan Leandro city\tCA\tCalifornia\tAlameda County\t82349\t39.4\t28.1\t13.0\t31296\t320659\t0.7885\t94577\tObama\t94577\t0.131045319\t94577.0\n1266\t-122.06706799999999\t37.712269\tCastro Valley CDP\tCA\tCalifornia\tAlameda County\t57792\t41.9\t36.8\t10.1\t39517\t422318\t0.7885\t94546\tObama\t94546\t0.091966764\t94546.0\n1267\t-122.27473799999999\t37.872559\tBerkeley city\tCA\tCalifornia\tAlameda County\t103975\t34.0\t69.7\t12.8\t40781\t526775\t0.7885\t94703\tObama\t94703\t0.165459654\t94703.0\n1268\t-122.048052\t37.675875\tFairview CDP\tCA\tCalifornia\tAlameda County\t9458\t41.3\t36.4\t11.9\t34329\t383944\t0.7885\t94542\tObama\t94542\t0.015050901\t94542.0\n1269\t-121.88094199999999\t37.595795\tSunol CDP\tCA\tCalifornia\tAlameda County\t1429\t42.6\t54.9\t11.0\t65054\t743119\t0.7885\t94586\tObama\t94586\t0.002274026\t94586.0\n1270\t-122.29112099999999\t37.838122999999996\tEmeryville city\tCA\tCalifornia\tAlameda County\t9609\t35.5\t62.5\t10.1\t50442\t241106\t0.7885\t94608\tObama\t94608\t0.015291193\t94608.0\n1271\t-122.11576799999999\t37.694158\tAshland CDP\tCA\tCalifornia\tAlameda County\t22029\t31.0\t17.9\t14.6\t22058\t258026\t0.7885\t94578\tObama\t94578\t0.035055645\t94578.0\n1272\t-122.13462\t37.673903\tSan Lorenzo CDP\tCA\tCalifornia\tAlameda County\t22152\t39.0\t18.8\t11.1\t28105\t313451\t0.7885\t94580\tObama\t94580\t0.03525138\t94580.0\n1273\t-122.103701\t37.679214\tCherryland CDP\tCA\tCalifornia\tAlameda County\t14348\t32.0\t12.2\t17.1\t20728\t262943\t0.7885\t94541\tObama\t94541\t0.022832557000000003\t94541.0\n1274\t-121.9841\t37.527466\tFremont city\tCA\tCalifornia\tAlameda County\t211689\t36.8\t49.2\t11.1\t40658\t495284\t0.7885\t94538\tObama\t94538\t0.336869331\t94538.0\n1275\t-122.214735\t37.790475\tOakland city\tCA\tCalifornia\tAlameda County\t417922\t34.6\t35.1\t17.5\t29508\t301190\t0.7885\t94602\tObama\t94602\t0.6650563070000001\t94602.0\n1276\t-122.300183\t37.889790999999995\tAlbany city\tCA\tCalifornia\tAlameda County\t16615\t38.1\t70.3\t7.6\t38736\t435269\t0.7885\t94706\tObama\t94706\t0.026440126\t94706.0\n1277\t-122.020164\t37.602306\tUnion City\tCA\tCalifornia\tAlameda County\t72617\t35.3\t36.5\t12.5\t28738\t427964\t0.7885\t94587\tObama\t94587\t0.115558391\t94587.0\n1278\t-121.90808500000001\t37.714220000000005\tDublin city\tCA\tCalifornia\tAlameda County\t42183\t36.1\t39.8\t9.7\t42861\t455405\t0.7885\t94568\tObama\t94568\t0.067127527\t94568.0\n1279\t-122.23003999999999\t37.822563\tPiedmont city\tCA\tCalifornia\tAlameda County\t10892\t47.1\t82.5\t8.4\t79314\t891007\t0.7885\t94611\tObama\t94611\t0.017332883\t94611.0\n1280\t-121.765899\t37.688503999999995\tLivermore city\tCA\tCalifornia\tAlameda County\t79207\t37.2\t37.7\t10.2\t41146\t448944\t0.7885\t94550\tObama\t94550\t0.12604532599999999\t94550.0\n1281\t-122.07721599999999\t37.633055\tHayward city\tCA\tCalifornia\tAlameda County\t147682\t33.1\t24.5\t13.9\t25580\t313250\t0.7885\t94544\tObama\t94544\t0.235012384\t94544.0\n1282\t-121.88116299999999\t37.667436\tPleasanton city\tCA\tCalifornia\tAlameda County\t67702\t40.3\t52.8\t9.1\t53452\t617515\t0.7885\t94566\tObama\t94566\t0.107736951\t94566.0\n1283\t-119.834321\t38.668566\tMarkleeville CDP\tCA\tCalifornia\tAlpine County\t163\t47.4\t35.4\t18.5\t32862\t291667\t0.5957\t96120\tObama\t96120\t0.000259389\t96120.0\n1284\t-120.052454\t38.692589\tKirkwood CDP\tCA\tCalifornia\tAlpine County\t89\t33.1\t25.5\t16.7\t22700\t316667\t0.5957\t95646\tObama\t95646\t0.000141629\t95646.0\n1285\t-120.0491\t38.472159999999995\tBear Valley CDP\tCA\tCalifornia\tAlpine County\t110\t47.1\t35.6\t18.9\t32876\t289286\t0.5957\t95646\tObama\t95646\t0.000175047\t95646.0\n1286\t-119.835527\t38.801206\tMesa Vista CDP\tCA\tCalifornia\tAlpine County\t168\t36.3\t24.0\t15.9\t22805\t275000\t0.5957\t96120\tObama\t96120\t0.000267345\t96120.0\n1287\t-119.800895\t38.785552\tAlpine Village CDP\tCA\tCalifornia\tAlpine County\t124\t39.1\t26.6\t15.2\t24175\t281250\t0.5957\t96120\tObama\t96120\t0.00019732599999999997\t96120.0\n1288\t-120.774121\t38.349136\tJackson city\tCA\tCalifornia\tAmador County\t4049\t49.2\t22.1\t12.1\t28865\t259422\t0.387\t95642\tObama\t95642\t0.006443339\t95642.0\n1289\t-120.84421100000002\t38.47814\tPlymouth city\tCA\tCalifornia\tAmador County\t1166\t46.3\t15.5\t11.3\t21630\t265000\t0.387\t95669\tObama\t95669\t0.0018555029999999999\t95669.0\n1290\t-120.823237\t38.41891\tAmador City\tCA\tCalifornia\tAmador County\t230\t49.5\t20.5\t9.2\t25125\t339286\t0.387\t95601\tObama\t95601\t0.000366008\t95601.0\n1291\t-120.80378300000001\t38.389976000000004\tSutter Creek city\tCA\tCalifornia\tAmador County\t2672\t48.5\t26.3\t12.3\t25731\t285817\t0.387\t95685\tObama\t95685\t0.004252062\t95685.0\n1292\t-120.941382\t38.362016\tIone city\tCA\tCalifornia\tAmador County\t7913\t34.9\t12.5\t9.8\t21845\t238761\t0.387\t95640\tObama\t95640\t0.012592279\t95640.0\n1293\t-121.526522\t39.758448\tConcow CDP\tCA\tCalifornia\tButte County\t1144\t48.8\t17.0\t21.2\t18802\t157432\t0.4702\t95969\tObama\t95969\t0.001820494\t95969.0\n1294\t-121.606528\t39.755479\tParadise town\tCA\tCalifornia\tButte County\t26550\t50.6\t21.7\t14.7\t23120\t188013\t0.4702\t95969\tObama\t95969\t0.042250097\t95969.0\n1295\t-121.566203\t39.499476\tOroville city\tCA\tCalifornia\tButte County\t14263\t33.2\t12.7\t19.7\t16214\t144559\t0.4702\t95965\tObama\t95965\t0.022697292999999997\t95965.0\n1296\t-121.535895\t39.481638000000004\tSouth Oroville CDP\tCA\tCalifornia\tButte County\t7997\t32.0\t5.4\t24.4\t12198\t117941\t0.4702\t95966\tObama\t95966\t0.012725951999999999\t95966.0\n1297\t-121.80764599999999\t39.75696\tChico city\tCA\tCalifornia\tButte County\t68334\t28.1\t37.0\t15.3\t21360\t229984\t0.4702\t95926\tObama\t95926\t0.10874267800000001\t95926.0\n1298\t-121.476056\t39.511287\tOroville East CDP\tCA\tCalifornia\tButte County\t9741\t54.7\t17.7\t12.7\t24644\t186350\t0.4702\t95966\tObama\t95966\t0.01550125\t95966.0\n1299\t-121.709877\t39.413468\tBiggs city\tCA\tCalifornia\tButte County\t2011\t28.9\t8.8\t20.4\t16054\t138110\t0.4702\t95917\tObama\t95917\t0.003200186\t95917.0\n1300\t-121.532256\t39.436469\tPalermo CDP\tCA\tCalifornia\tButte County\t6386\t40.2\t8.8\t22.7\t15862\t144258\t0.4702\t95968\tObama\t95968\t0.010162302\t95968.0\n1301\t-121.60788600000001\t39.822598\tMagalia CDP\tCA\tCalifornia\tButte County\t11345\t51.4\t17.5\t20.6\t20030\t168947\t0.4702\t95954\tObama\t95954\t0.018053761\t95954.0\n1302\t-121.648099\t39.490606\tThermalito CDP\tCA\tCalifornia\tButte County\t6476\t38.8\t4.3\t24.7\t15148\t129029\t0.4702\t95965\tObama\t95965\t0.010305523\t95965.0\n1303\t-121.787402\t39.623283\tDurham CDP\tCA\tCalifornia\tButte County\t5573\t40.2\t36.5\t11.6\t30361\t304106\t0.4702\t95938\tObama\t95938\t0.008868542\t95938.0\n1304\t-121.69705\t39.364095\tGridley city\tCA\tCalifornia\tButte County\t5578\t33.6\t9.1\t27.6\t14709\t147316\t0.4702\t95948\tObama\t95948\t0.008876499\t95948.0\n1305\t-120.70613600000001\t38.30553\tMokelumne Hill CDP\tCA\tCalifornia\tCalaveras County\t856\t50.8\t20.1\t13.1\t23723\t277016\t0.39799999999999996\t95642\tObama\t95642\t0.0013621879999999999\t95642.0\n1306\t-120.857055\t38.124989\tRancho Calaveras CDP\tCA\tCalifornia\tCalaveras County\t4927\t44.5\t16.8\t16.8\t24872\t255613\t0.39799999999999996\t95252\tObama\t95252\t0.007840536\t95252.0\n1307\t-120.27093700000002\t38.294738\tDorrington CDP\tCA\tCalifornia\tCalaveras County\t839\t52.3\t32.8\t8.5\t56067\t363366\t0.39799999999999996\t95223\tObama\t95223\t0.001335135\t95223.0\n1308\t-120.627619\t37.936296\tCopperopolis CDP\tCA\tCalifornia\tCalaveras County\t3503\t49.5\t17.2\t12.9\t25397\t294061\t0.39799999999999996\t95228\tObama\t95228\t0.005574467\t95228.0\n1309\t-120.354776\t38.24228\tArnold CDP\tCA\tCalifornia\tCalaveras County\t4710\t55.5\t27.8\t14.3\t28461\t281873\t0.39799999999999996\t95250\tObama\t95250\t0.007495215\t95250.0\n1310\t-120.405153\t38.166309999999996\tForest Meadows CDP\tCA\tCalifornia\tCalaveras County\t1412\t53.0\t38.7\t19.4\t33241\t366102\t0.39799999999999996\t95233\tObama\t95233\t0.0022469729999999998\t95233.0\n1311\t-120.434367\t38.144643\tMurphys CDP\tCA\tCalifornia\tCalaveras County\t2305\t53.7\t18.8\t14.6\t27156\t274206\t0.39799999999999996\t95247\tObama\t95247\t0.00366804\t95247.0\n1312\t-120.45728000000001\t38.074684999999995\tVallecito CDP\tCA\tCalifornia\tCalaveras County\t476\t49.2\t18.4\t17.7\t27171\t325641\t0.39799999999999996\t95251\tObama\t95251\t0.000757478\t95251.0\n1313\t-120.81511100000002\t38.183924\tValley Springs CDP\tCA\tCalifornia\tCalaveras County\t2979\t44.6\t18.2\t19.1\t22319\t289815\t0.39799999999999996\t95252\tObama\t95252\t0.004740604\t95252.0\n1314\t-120.537578\t38.404455\tWest Point CDP\tCA\tCalifornia\tCalaveras County\t837\t48.7\t2.8\t15.9\t16761\t170455\t0.39799999999999996\t95232\tObama\t95232\t0.0013319520000000002\t95232.0\n1315\t-120.37906100000001\t38.193872999999996\tAvery CDP\tCA\tCalifornia\tCalaveras County\t742\t52.9\t38.8\t19.4\t33241\t366667\t0.39799999999999996\t95233\tObama\t95233\t0.001180775\t95233.0\n1316\t-120.49123\t38.316856\tRail Road Flat CDP\tCA\tCalifornia\tCalaveras County\t612\t54.4\t12.9\t22.1\t24448\t266071\t0.39799999999999996\t95246\tObama\t95246\t0.0009739010000000001\t95246.0\n1317\t-120.511537\t38.250926\tMountain Ranch CDP\tCA\tCalifornia\tCalaveras County\t1744\t53.0\t19.7\t19.2\t24784\t276293\t0.39799999999999996\t95246\tObama\t95246\t0.002775298\t95246.0\n1318\t-120.957462\t38.198409999999996\tWallace CDP\tCA\tCalifornia\tCalaveras County\t237\t44.6\t8.4\t13.2\t23915\t253571\t0.39799999999999996\t95254\tObama\t95254\t0.00037714800000000006\t95254.0\n1319\t-120.551405\t38.072873\tAngels City\tCA\tCalifornia\tCalaveras County\t3512\t46.7\t18.3\t18.6\t23401\t238906\t0.39799999999999996\t95221\tObama\t95221\t0.005588789\t95221.0\n1320\t-120.67590200000001\t38.191045\tSan Andreas CDP\tCA\tCalifornia\tCalaveras County\t2812\t47.0\t16.2\t22.4\t21113\t189871\t0.39799999999999996\t95249\tObama\t95249\t0.00447485\t95249.0\n1321\t-122.009979\t39.205318\tColusa city\tCA\tCalifornia\tColusa County\t5593\t34.2\t15.6\t9.6\t18922\t211049\t0.3835\t95932\tObama\t95932\t0.008900369\t95932.0\n1322\t-122.06183700000001\t39.016788\tArbuckle CDP\tCA\tCalifornia\tColusa County\t2934\t27.9\t10.4\t15.8\t15868\t202717\t0.3835\t95912\tObama\t95912\t0.004668994\t95912.0\n1323\t-122.137325\t39.148668\tWilliams city\tCA\tCalifornia\tColusa County\t4804\t28.6\t8.4\t11.8\t13621\t185000\t0.3835\t95987\tObama\t95987\t0.007644801\t95987.0\n1324\t-122.00412299999999\t37.8565\tAlamo CDP\tCA\tCalifornia\tContra Costa County\t16271\t47.1\t66.5\t9.5\t74745\t883226\t0.6636\t94507\tObama\t94507\t0.025892705\t94507.0\n1325\t-122.08701599999999\t38.013833\tVine Hill CDP\tCA\tCalifornia\tContra Costa County\t3544\t36.4\t16.3\t13.4\t27121\t251677\t0.6636\t94553\tObama\t94553\t0.005639712\t94553.0\n1326\t-122.216426\t38.042418\tCrockett CDP\tCA\tCalifornia\tContra Costa County\t3287\t43.9\t32.6\t19.5\t37343\t261581\t0.6636\t94525\tObama\t94525\t0.005230737\t94525.0\n1327\t-122.12294399999999\t37.844002\tMoraga town\tCA\tCalifornia\tContra Costa County\t16287\t45.5\t71.6\t12.0\t55513\t785892\t0.6636\t94556\tObama\t94556\t0.025918167000000002\t94556.0\n1328\t-121.905973\t37.822308\tBlackhawk-Camino Tassajara CDP\tCA\tCalifornia\tContra Costa County\t10294\t46.0\t68.6\t10.2\t81180\t896378\t0.6636\t94506\tObama\t94506\t0.016381262\t94506.0\n1329\t-122.11941200000001\t37.892496\tLafayette city\tCA\tCalifornia\tContra Costa County\t24477\t45.7\t70.4\t9.1\t63814\t786932\t0.6636\t94549\tObama\t94549\t0.038951247\t94549.0\n1330\t-122.179404\t37.88089\tOrinda city\tCA\tCalifornia\tContra Costa County\t17676\t48.4\t77.6\t9.0\t71901\t842142\t0.6636\t94563\tObama\t94563\t0.028128538999999998\t94563.0\n1331\t-122.028176\t38.025757\tClyde CDP\tCA\tCalifornia\tContra Costa County\t750\t39.9\t23.6\t8.7\t39694\t251852\t0.6636\t945HH\tObama\t945HH\t0.001193506\t0.0\n1332\t-122.31413500000001\t37.944964\tEast Richmond Heights CDP\tCA\tCalifornia\tContra Costa County\t3308\t46.2\t50.6\t14.2\t35847\t338021\t0.6636\t94805\tObama\t94805\t0.005264155\t94805.0\n1333\t-122.32523400000001\t38.001336\tBayview-Montalvin CDP\tCA\tCalifornia\tContra Costa County\t5082\t34.3\t18.4\t17.7\t23697\t198826\t0.6636\t94806\tObama\t94806\t0.008087194\t94806.0\n1334\t-121.634326\t37.873044\tByron CDP\tCA\tCalifornia\tContra Costa County\t776\t32.5\t11.9\t9.9\t22367\t281250\t0.6636\t94514\tObama\t94514\t0.00123488\t94514.0\n1335\t-122.116841\t38.009081\tMountain View CDP\tCA\tCalifornia\tContra Costa County\t2441\t38.8\t24.6\t9.9\t32154\t236622\t0.6636\t94553\tObama\t94553\t0.003884463\t94553.0\n1336\t-121.89591399999999\t38.01682\tPittsburg city\tCA\tCalifornia\tContra Costa County\t63926\t31.7\t17.2\t16.1\t23147\t223763\t0.6636\t94565\tObama\t94565\t0.101728048\t94565.0\n1337\t-121.950773\t37.758646999999996\tSan Ramon city\tCA\tCalifornia\tContra Costa County\t47676\t39.9\t57.5\t9.2\t57123\t629373\t0.6636\t94583\tObama\t94583\t0.07586876099999999\t94583.0\n1338\t-122.278074\t37.907782\tKensington CDP\tCA\tCalifornia\tContra Costa County\t4891\t48.4\t80.6\t8.0\t65663\t636921\t0.6636\t94707\tObama\t94707\t0.007783248\t94707.0\n1339\t-122.114989\t38.000118\tMartinez city\tCA\tCalifornia\tContra Costa County\t36287\t41.6\t36.3\t12.3\t39180\t356155\t0.6636\t94553\tObama\t94553\t0.057744982\t94553.0\n1340\t-122.33036899999999\t37.96516\tRollingwood CDP\tCA\tCalifornia\tContra Costa County\t3107\t29.3\t12.8\t17.1\t17679\t202985\t0.6636\t94806\tObama\t94806\t0.004944296\t94806.0\n1341\t-122.186724\t38.04529\tPort Costa CDP\tCA\tCalifornia\tContra Costa County\t239\t48.6\t31.4\t16.3\t41555\t298214\t0.6636\t94569\tObama\t94569\t0.00038033\t94569.0\n1342\t-121.65738\t37.971176\tKnightsen CDP\tCA\tCalifornia\tContra Costa County\t897\t37.2\t12.9\t11.8\t30230\t321429\t0.6636\t94561\tObama\t94561\t0.0014274329999999999\t94561.0\n1343\t-121.970293\t37.812352000000004\tDanville town\tCA\tCalifornia\tContra Costa County\t44291\t43.2\t63.8\t10.3\t66785\t802407\t0.6636\t94526\tObama\t94526\t0.07048207299999999\t94526.0\n1344\t-121.71945\t37.936004\tBrentwood city\tCA\tCalifornia\tContra Costa County\t47111\t31.2\t24.6\t10.9\t33046\t360636\t0.6636\t94513\tObama\t94513\t0.07496965400000001\t94513.0\n1345\t-122.254857\t38.005901\tHercules city\tCA\tCalifornia\tContra Costa County\t22380\t40.2\t40.9\t11.0\t36625\t311338\t0.6636\t94547\tObama\t94547\t0.035614206\t94547.0\n1346\t-121.974805\t38.032059999999994\tBay Point CDP\tCA\tCalifornia\tContra Costa County\t22645\t30.1\t14.2\t18.3\t20451\t192538\t0.6636\t945HH\tObama\t945HH\t0.036035911000000004\t0.0\n1347\t-122.342817\t37.962778\tSan Pablo city\tCA\tCalifornia\tContra Costa County\t32819\t29.5\t12.2\t19.0\t17674\t191705\t0.6636\t94806\tObama\t94806\t0.052226212\t94806.0\n1348\t-122.337864\t37.948196\tRichmond city\tCA\tCalifornia\tContra Costa County\t105433\t33.8\t24.7\t17.2\t24612\t230047\t0.6636\t94805\tObama\t94805\t0.167779829\t94805.0\n1349\t-122.00158200000001\t37.972115\tConcord city\tCA\tCalifornia\tContra Costa County\t126662\t37.2\t29.8\t13.5\t30616\t314418\t0.6636\t94519\tObama\t94519\t0.201562401\t94519.0\n1350\t-122.075746\t37.954097\tPleasant Hill city\tCA\tCalifornia\tContra Costa County\t33299\t41.6\t47.2\t11.8\t43662\t426362\t0.6636\t94523\tObama\t94523\t0.052990055\t94523.0\n1351\t-121.960943\t37.840941\tDiablo CDP\tCA\tCalifornia\tContra Costa County\t988\t45.8\t65.3\t8.4\t71349\t726648\t0.6636\t94526\tObama\t94526\t0.001572245\t94526.0\n1352\t-121.597043\t37.91072\tDiscovery Bay CDP\tCA\tCalifornia\tContra Costa County\t13268\t40.9\t28.9\t9.2\t50773\t521387\t0.6636\t94514\tObama\t94514\t0.021113909\t94514.0\n1353\t-122.280915\t37.992748999999996\tPinole city\tCA\tCalifornia\tContra Costa County\t19086\t41.6\t32.1\t11.1\t30385\t319124\t0.6636\t94564\tObama\t94564\t0.030372329\t94564.0\n1354\t-122.300379\t37.975726\tEl Sobrante CDP\tCA\tCalifornia\tContra Costa County\t12328\t40.8\t29.7\t12.0\t31134\t283570\t0.6636\t94803\tObama\t94803\t0.019618049\t94803.0\n1355\t-122.31868\t37.993941\tTara Hills CDP\tCA\tCalifornia\tContra Costa County\t5354\t37.6\t15.4\t13.7\t26764\t263838\t0.6636\t94564\tObama\t94564\t0.008520038\t94564.0\n1356\t-122.040705\t37.90175\tWalnut Creek city\tCA\tCalifornia\tContra Costa County\t65873\t47.7\t58.7\t11.7\t50249\t489778\t0.6636\t94596\tObama\t94596\t0.104826389\t94596.0\n1357\t-121.70865900000001\t37.993068\tOakley city\tCA\tCalifornia\tContra Costa County\t34614\t32.0\t17.5\t11.0\t27979\t259624\t0.6636\t94561\tObama\t94561\t0.055082669\t94561.0\n1358\t-121.640373\t38.028929\tBethel Island CDP\tCA\tCalifornia\tContra Costa County\t2514\t53.5\t13.1\t18.5\t29196\t151078\t0.6636\t94511\tObama\t94511\t0.004000631\t94511.0\n1359\t-122.053894\t37.926965\tWaldon CDP\tCA\tCalifornia\tContra Costa County\t5281\t40.2\t59.3\t9.4\t51404\t341484\t0.6636\t94596\tObama\t94596\t0.00840387\t94596.0\n1360\t-122.069981\t37.987992\tPacheco CDP\tCA\tCalifornia\tContra Costa County\t3603\t43.9\t26.7\t12.7\t30472\t119149\t0.6636\t94520\tObama\t94520\t0.005733601\t94520.0\n1361\t-122.30248\t37.91962\tEl Cerrito city\tCA\tCalifornia\tContra Costa County\t23224\t44.7\t60.3\t12.1\t41521\t431391\t0.6636\t94530\tObama\t94530\t0.036957297\t94530.0\n1362\t-122.233176\t38.026461\tRodeo CDP\tCA\tCalifornia\tContra Costa County\t8980\t36.0\t22.4\t16.6\t28585\t284527\t0.6636\t94525\tObama\t94525\t0.01429024\t94525.0\n1363\t-121.796299\t37.979654\tAntioch city\tCA\tCalifornia\tContra Costa County\t104182\t33.0\t22.2\t13.2\t29924\t285263\t0.6636\t94509\tObama\t94509\t0.165789062\t94509.0\n1364\t-121.92997\t37.940094\tClayton city\tCA\tCalifornia\tContra Costa County\t10911\t44.6\t53.8\t8.6\t51776\t508750\t0.6636\t94517\tObama\t94517\t0.017363119\t94517.0\n1365\t-124.198552\t41.755041\tCrescent City\tCA\tCalifornia\tDel Norte County\t7503\t33.4\t10.6\t16.3\t18027\t162037\t0.4323\t95531\tObama\t95531\t0.01193983\t95531.0\n1366\t-124.00753999999999\t41.532381\tKlamath CDP\tCA\tCalifornia\tDel Norte County\t714\t45.9\t16.3\t17.5\t21494\t133152\t0.4323\t95548\tObama\t95548\t0.001136217\t95548.0\n1367\t-124.21551799999999\t41.766389000000004\tCrescent City North CDP\tCA\tCalifornia\tDel Norte County\t4048\t36.6\t16.4\t11.9\t16994\t158410\t0.4323\t95531\tObama\t95531\t0.006441746999999999\t95531.0\n1368\t-124.15824099999999\t41.752699\tBertsch-Oceanview CDP\tCA\tCalifornia\tDel Norte County\t2370\t40.4\t11.4\t15.2\t14611\t170427\t0.4323\t95531\tObama\t95531\t0.003771478\t95531.0\n1369\t-120.797591\t38.730789\tPlacerville city\tCA\tCalifornia\tEl Dorado County\t10062\t41.1\t22.3\t18.2\t26780\t221623\t0.3961\t95667\tObama\t95667\t0.016012071\t95667.0\n1370\t-119.98297099999999\t38.939186\tSouth Lake Tahoe city\tCA\tCalifornia\tEl Dorado County\t25882\t34.3\t21.0\t16.5\t22732\t218917\t0.3961\t96150\tObama\t96150\t0.041187081\t96150.0\n1371\t-120.82270600000001\t38.682107\tDiamond Springs CDP\tCA\tCalifornia\tEl Dorado County\t5238\t45.1\t12.1\t16.0\t23975\t192100\t0.3961\t95619\tObama\t95619\t0.008335443\t95619.0\n1372\t-120.942027\t38.670336\tShingle Springs CDP\tCA\tCalifornia\tEl Dorado County\t2911\t42.4\t32.6\t11.6\t34797\t358929\t0.3961\t95682\tObama\t95682\t0.004632393\t95682.0\n1373\t-120.99023899999999\t38.682157000000004\tCameron Park CDP\tCA\tCalifornia\tEl Dorado County\t16102\t40.1\t31.9\t11.9\t32311\t276333\t0.3961\t95672\tObama\t95672\t0.025623768999999998\t95672.0\n1374\t-121.07494799999999\t38.683749\tEl Dorado Hills CDP\tCA\tCalifornia\tEl Dorado County\t28544\t38.5\t51.2\t10.1\t47135\t413399\t0.3961\t95762\tObama\t95762\t0.04542323\t95762.0\n1375\t-120.829977\t38.906534\tGeorgetown CDP\tCA\tCalifornia\tEl Dorado County\t1041\t46.6\t17.9\t12.1\t22898\t225685\t0.3961\t95634\tObama\t95634\t0.001656586\t95634.0\n1376\t-120.572423\t38.753818\tPollock Pines CDP\tCA\tCalifornia\tEl Dorado County\t5001\t44.9\t20.0\t14.8\t23830\t201733\t0.3961\t95726\tObama\t95726\t0.007958295\t95726.0\n1377\t-119.86684\t36.429358\tRiverdale CDP\tCA\tCalifornia\tFresno County\t2825\t29.9\t11.9\t20.0\t14125\t124010\t0.4989\t93656\tObama\t93656\t0.004495538\t93656.0\n1378\t-120.44995700000001\t36.849628\tFirebaugh city\tCA\tCalifornia\tFresno County\t7151\t24.9\t3.9\t22.8\t11041\t125351\t0.4989\t93622\tObama\t93622\t0.011379678\t93622.0\n1379\t-120.0611\t36.72438\tKerman city\tCA\tCalifornia\tFresno County\t10843\t28.4\t9.2\t17.9\t13453\t156635\t0.4989\t93630\tObama\t93630\t0.017254908\t93630.0\n1380\t-120.25240500000001\t36.647931\tTranquillity CDP\tCA\tCalifornia\tFresno County\t937\t31.1\t12.2\t16.7\t16570\t112500\t0.4989\t93668\tObama\t93668\t0.001491086\t93668.0\n1381\t-120.02096499999999\t36.79992\tBiola CDP\tCA\tCalifornia\tFresno County\t1197\t27.8\t0.3\t15.7\t9865\t108684\t0.4989\t93606\tObama\t93606\t0.001904835\t93606.0\n1382\t-119.909152\t36.603221000000005\tRaisin City CDP\tCA\tCalifornia\tFresno County\t171\t28.9\t9.2\t20.5\t15932\t193750\t0.4989\t93652\tObama\t93652\t0.00027211900000000003\t93652.0\n1383\t-119.731843\t36.681629\tCalwa CDP\tCA\tCalifornia\tFresno County\t887\t32.5\t3.1\t19.2\t10913\t117105\t0.4989\t93725\tObama\t93725\t0.001411519\t93725.0\n1384\t-119.71213200000001\t36.983746000000004\tFriant CDP\tCA\tCalifornia\tFresno County\t610\t50.8\t16.1\t19.3\t19221\t117593\t0.4989\t936HH\tObama\t936HH\t0.0009707180000000001\t0.0\n1385\t-119.693372\t36.822883000000004\tClovis city\tCA\tCalifornia\tFresno County\t83262\t34.5\t25.1\t10.1\t22770\t201110\t0.4989\t93612\tObama\t93612\t0.132498213\t93612.0\n1386\t-120.35425\t36.143363\tCoalinga city\tCA\tCalifornia\tFresno County\t18315\t30.3\t16.4\t15.1\t18859\t131182\t0.4989\t93210\tObama\t93210\t0.029145406000000002\t93210.0\n1387\t-119.490637\t37.075728000000005\tAuberry CDP\tCA\tCalifornia\tFresno County\t2373\t46.7\t13.1\t11.0\t19576\t187879\t0.4989\t93602\tObama\t93602\t0.003776252\t93602.0\n1388\t-119.324367\t37.097001\tShaver Lake CDP\tCA\tCalifornia\tFresno County\t808\t51.6\t21.6\t8.0\t26734\t339623\t0.4989\t93664\tObama\t93664\t0.001285803\t93664.0\n1389\t-119.61655900000001\t36.576347\tSelma city\tCA\tCalifornia\tFresno County\t22716\t29.6\t9.9\t17.7\t14760\t141464\t0.4989\t93662\tObama\t93662\t0.036148896\t93662.0\n1390\t-120.188414\t36.607836\tSan Joaquin city\tCA\tCalifornia\tFresno County\t4153\t23.4\t3.1\t29.8\t7810\t127462\t0.4989\t93660\tObama\t93660\t0.0066088380000000006\t93660.0\n1391\t-119.55482099999999\t36.519822\tKingsburg city\tCA\tCalifornia\tFresno County\t9919\t34.6\t23.0\t12.9\t19575\t181825\t0.4989\t93631\tObama\t93631\t0.015784509\t93631.0\n1392\t-119.599318\t36.656249\tDel Rey CDP\tCA\tCalifornia\tFresno County\t1078\t28.1\t0.0\t27.3\t9276\t115833\t0.4989\t93616\tObama\t93616\t0.001715465\t93616.0\n1393\t-119.31624199999999\t36.623273\tOrange Cove city\tCA\tCalifornia\tFresno County\t9767\t24.5\t3.7\t25.0\t8959\t124787\t0.4989\t93646\tObama\t93646\t0.015542625\t93646.0\n1394\t-120.100182\t36.20387\tHuron city\tCA\tCalifornia\tFresno County\t7726\t26.3\t1.2\t14.7\t9544\t116667\t0.4989\t93234\tObama\t93234\t0.012294699\t93234.0\n1395\t-119.78948999999999\t36.785579\tFresno city\tCA\tCalifornia\tFresno County\t486823\t29.2\t20.8\t13.6\t18044\t153381\t0.4989\t93704\tObama\t93704\t0.7747012759999999\t93704.0\n1396\t-119.19983500000001\t36.69413\tSquaw Valley CDP\tCA\tCalifornia\tFresno County\t3144\t46.8\t12.2\t14.6\t19269\t140041\t0.4989\t93675\tObama\t93675\t0.005003175\t93675.0\n1397\t-119.555596\t36.699681\tSanger city\tCA\tCalifornia\tFresno County\t21818\t29.2\t9.2\t20.1\t13388\t141521\t0.4989\t93657\tObama\t93657\t0.034719872\t93657.0\n1398\t-119.752597\t36.60888\tBowles CDP\tCA\tCalifornia\tFresno County\t191\t36.8\t16.5\t12.3\t18308\t216667\t0.4989\t93725\tObama\t93725\t0.000303946\t93725.0\n1399\t-119.672742\t36.623282\tFowler city\tCA\tCalifornia\tFresno County\t4210\t31.6\t12.8\t15.6\t16588\t145291\t0.4989\t93625\tObama\t93625\t0.006699545\t93625.0\n1400\t-119.79085900000001\t36.652464\tEaston CDP\tCA\tCalifornia\tFresno County\t2039\t37.9\t8.4\t12.5\t15484\t140996\t0.4989\t93725\tObama\t93725\t0.0032447440000000004\t93725.0\n1401\t-119.84508500000001\t36.539840000000005\tCaruthers CDP\tCA\tCalifornia\tFresno County\t2365\t29.1\t4.2\t12.7\t15067\t140785\t0.4989\t93609\tObama\t93609\t0.0037635209999999997\t93609.0\n1402\t-120.315099\t36.500351\tCantua Creek CDP\tCA\tCalifornia\tFresno County\t771\t25.9\t2.2\t17.4\t8720\t85833\t0.4989\t93608\tObama\t93608\t0.001226924\t93608.0\n1403\t-119.53673400000001\t36.610488000000004\tParlier city\tCA\tCalifornia\tFresno County\t13204\t25.3\t3.9\t26.8\t9044\t129520\t0.4989\t93648\tObama\t93648\t0.021012062999999997\t93648.0\n1404\t-120.379398\t36.757258\tMendota city\tCA\tCalifornia\tFresno County\t11101\t27.1\t2.7\t29.4\t8056\t124339\t0.4989\t93640\tObama\t93640\t0.017665474\t93640.0\n1405\t-119.69152700000001\t36.433656\tLaton CDP\tCA\tCalifornia\tFresno County\t1500\t27.2\t8.5\t25.1\t12375\t110677\t0.4989\t93242\tObama\t93242\t0.002387011\t93242.0\n1406\t-119.44904299999999\t36.597019\tReedley city\tCA\tCalifornia\tFresno County\t22927\t29.5\t15.4\t24.1\t14683\t163834\t0.4989\t93654\tObama\t93654\t0.036484669\t93654.0\n1407\t-119.931895\t36.43764\tLanare CDP\tCA\tCalifornia\tFresno County\t579\t30.3\t0.6\t22.6\t8100\t108333\t0.4989\t93656\tObama\t93656\t0.0009213860000000001\t93656.0\n1408\t-122.187381\t39.746076\tOrland city\tCA\tCalifornia\tGlenn County\t7302\t32.9\t12.0\t15.5\t15241\t167518\t0.3584\t95963\tObama\t95963\t0.01161997\t95963.0\n1409\t-122.199157\t39.514685\tWillows city\tCA\tCalifornia\tGlenn County\t6616\t32.8\t12.7\t14.8\t16788\t174801\t0.3584\t95988\tObama\t95988\t0.01052831\t95988.0\n1410\t-122.01252099999999\t39.74224\tHamilton City CDP\tCA\tCalifornia\tGlenn County\t2245\t28.9\t6.1\t21.4\t11616\t156354\t0.3584\t95951\tObama\t95951\t0.00357256\t95951.0\n1411\t-124.107897\t40.500283\tRio Dell city\tCA\tCalifornia\tHumboldt County\t3057\t38.0\t7.9\t16.6\t14869\t169007\t0.5996\t95562\tObama\t95562\t0.004864729\t95562.0\n1412\t-124.07718600000001\t40.871893\tArcata city\tCA\tCalifornia\tHumboldt County\t16899\t27.2\t45.1\t12.6\t20379\t232740\t0.5996\t95521\tObama\t95521\t0.026892067000000002\t95521.0\n1413\t-124.14156899999999\t40.585431\tFortuna city\tCA\tCalifornia\tHumboldt County\t11352\t40.6\t16.7\t11.6\t19548\t218087\t0.5996\t95540\tObama\t95540\t0.018064900000000002\t95540.0\n1414\t-124.178999\t40.765459\tBayview CDP\tCA\tCalifornia\tHumboldt County\t2356\t40.1\t14.3\t11.9\t18924\t161047\t0.5996\t95503\tObama\t95503\t0.0037491990000000004\t95503.0\n1415\t-124.14473100000001\t40.765662\tCutten CDP\tCA\tCalifornia\tHumboldt County\t3064\t39.0\t24.5\t14.8\t25912\t237629\t0.5996\t95503\tObama\t95503\t0.004875868\t95503.0\n1416\t-123.822189\t40.120721\tRedway CDP\tCA\tCalifornia\tHumboldt County\t1223\t43.8\t31.5\t7.7\t21762\t215244\t0.5996\t95542\tObama\t95542\t0.00194621\t95542.0\n1417\t-124.15496599999999\t40.731269\tPine Hills CDP\tCA\tCalifornia\tHumboldt County\t3119\t44.7\t29.2\t8.6\t25636\t268027\t0.5996\t95503\tObama\t95503\t0.0049633920000000005\t95503.0\n1418\t-124.159675\t40.785488\tEureka city\tCA\tCalifornia\tHumboldt County\t26198\t37.1\t19.6\t14.0\t20323\t198576\t0.5996\t95501\tObama\t95501\t0.041689945\t95501.0\n1419\t-124.19875800000001\t40.722121\tHumboldt Hill CDP\tCA\tCalifornia\tHumboldt County\t3304\t43.5\t20.1\t13.2\t22076\t192153\t0.5996\t95537\tObama\t95537\t0.00525779\t95537.0\n1420\t-124.08473899999998\t40.94801\tMcKinleyville CDP\tCA\tCalifornia\tHumboldt County\t14845\t36.3\t28.8\t13.2\t22249\t225604\t0.5996\t95519\tObama\t95519\t0.023623453\t95519.0\n1421\t-124.26190700000001\t40.579882\tFerndale city\tCA\tCalifornia\tHumboldt County\t1391\t43.6\t28.9\t7.5\t24881\t295522\t0.5996\t95536\tObama\t95536\t0.002213555\t95536.0\n1422\t-124.128727\t40.788745\tMyrtletown CDP\tCA\tCalifornia\tHumboldt County\t4612\t42.0\t25.6\t9.6\t24375\t233923\t0.5996\t95501\tObama\t95501\t0.007339264\t95501.0\n1423\t-124.102452\t41.045153000000006\tWesthaven-Moonstone CDP\tCA\tCalifornia\tHumboldt County\t1044\t46.8\t48.0\t10.6\t27358\t323377\t0.5996\t95570\tObama\t95570\t0.00166136\t95570.0\n1424\t-123.65993\t40.874886\tWillow Creek CDP\tCA\tCalifornia\tHumboldt County\t1814\t50.9\t23.7\t10.1\t21093\t173134\t0.5996\t95573\tObama\t95573\t0.002886692\t95573.0\n1425\t-123.9933\t40.881143\tBlue Lake city\tCA\tCalifornia\tHumboldt County\t1159\t44.5\t29.5\t11.7\t22590\t182721\t0.5996\t95521\tObama\t95521\t0.001844364\t95521.0\n1426\t-124.08228500000001\t40.557669\tHydesville CDP\tCA\tCalifornia\tHumboldt County\t1248\t43.2\t24.4\t10.4\t20710\t270098\t0.5996\t95547\tObama\t95547\t0.0019859929999999997\t95547.0\n1427\t-124.14296100000001\t41.059113\tTrinidad city\tCA\tCalifornia\tHumboldt County\t316\t52.6\t45.3\t12.0\t27122\t396667\t0.5996\t95570\tObama\t95570\t0.000502864\t95570.0\n1428\t-115.498952\t32.680723\tCalexico city\tCA\tCalifornia\tImperial County\t35804\t29.6\t12.1\t27.7\t12216\t145732\t0.6518\t92231\tObama\t92231\t0.056976364\t92231.0\n1429\t-115.73083100000001\t33.354952000000004\tBombay Beach CDP\tCA\tCalifornia\tImperial County\t347\t69.1\t15.8\t45.5\t21432\t35455\t0.6518\t92257\tObama\t92257\t0.000552195\t92257.0\n1430\t-115.535449\t32.976657\tBrawley city\tCA\tCalifornia\tImperial County\t25230\t29.7\t12.3\t29.9\t15825\t127216\t0.6518\t92227\tObama\t92227\t0.040149527000000004\t92227.0\n1431\t-115.3782\t32.812856\tHoltville city\tCA\tCalifornia\tImperial County\t5904\t30.9\t10.8\t25.8\t15355\t111951\t0.6518\t92250\tObama\t92250\t0.009395276\t92250.0\n1432\t-116.011447\t33.375568\tSalton Sea Beach CDP\tCA\tCalifornia\tImperial County\t310\t57.4\t0.4\t42.4\t11850\t65667\t0.6518\t92275\tObama\t92275\t0.0004933159999999999\t92275.0\n1433\t-115.68300500000001\t32.789713\tSeeley CDP\tCA\tCalifornia\tImperial County\t2120\t27.7\t3.9\t26.6\t11780\t93981\t0.6518\t92273\tObama\t92273\t0.003373642\t92273.0\n1434\t-114.727309\t33.427977\tPalo Verde CDP\tCA\tCalifornia\tImperial County\t295\t58.3\t5.7\t29.0\t16768\t24500\t0.6518\t92266\tObama\t92266\t0.000469446\t92266.0\n1435\t-115.62260400000001\t33.037166\tWestmorland city\tCA\tCalifornia\tImperial County\t2866\t29.1\t4.9\t33.0\t11942\t108278\t0.6518\t92281\tObama\t92281\t0.004560783\t92281.0\n1436\t-116.00169299999999\t32.743157000000004\tOcotillo CDP\tCA\tCalifornia\tImperial County\t363\t55.3\t17.8\t2.2\t20372\t82222\t0.6518\t92259\tObama\t92259\t0.000577657\t92259.0\n1437\t-115.5558\t32.787139\tEl Centro city\tCA\tCalifornia\tImperial County\t41546\t30.2\t16.1\t25.5\t16474\t132599\t0.6518\t92243\tObama\t92243\t0.06611384299999999\t92243.0\n1438\t-115.514348\t33.238929\tNiland CDP\tCA\tCalifornia\tImperial County\t1439\t37.3\t2.7\t34.9\t13975\t41591\t0.6518\t92233\tObama\t92233\t0.002289939\t92233.0\n1439\t-116.04022900000001\t33.403938000000004\tDesert Shores CDP\tCA\tCalifornia\tImperial County\t858\t38.6\t10.5\t25.9\t10382\t46429\t0.6518\t92274\tObama\t92274\t0.00136537\t92274.0\n1440\t-115.49219599999999\t33.169308\tCalipatria city\tCA\tCalifornia\tImperial County\t8462\t32.8\t3.1\t24.7\t16803\t96092\t0.6518\t92233\tObama\t92233\t0.013465925\t92233.0\n1441\t-115.52031299999999\t32.731805\tHeber CDP\tCA\tCalifornia\tImperial County\t4613\t30.3\t4.9\t33.2\t9879\t111529\t0.6518\t92249\tObama\t92249\t0.007340855\t92249.0\n1442\t-115.571468\t32.837284000000004\tImperial city\tCA\tCalifornia\tImperial County\t9856\t30.9\t19.1\t16.4\t19709\t137300\t0.6518\t92251\tObama\t92251\t0.015684253999999998\t92251.0\n1443\t-114.637615\t32.737348\tWinterhaven CDP\tCA\tCalifornia\tImperial County\t626\t32.1\t2.2\t38.5\t8064\t51923\t0.6518\t92283\tObama\t92283\t0.000996179\t92283.0\n1444\t-115.96083600000001\t33.299707\tSalton City CDP\tCA\tCalifornia\tImperial County\t2296\t49.4\t8.0\t34.2\t15431\t72228\t0.6518\t92275\tObama\t92275\t0.003653718\t92275.0\n1445\t-118.38766399999999\t37.279486\tWilkerson CDP\tCA\tCalifornia\tInyo County\t576\t45.5\t12.2\t8.0\t21711\t222368\t0.4258\t93514\tObama\t93514\t0.0009166119999999999\t93514.0\n1446\t-117.371808\t35.860263\tHomewood Canyon-Valley Wells CDP\tCA\tCalifornia\tInyo County\t69\t53.8\t11.8\t9.1\t18927\t71667\t0.4258\t93562\tObama\t93562\t0.00010980299999999999\t93562.0\n1447\t-118.29676299999998\t37.166002\tBig Pine CDP\tCA\tCalifornia\tInyo County\t1302\t49.5\t11.3\t13.5\t19869\t190948\t0.4258\t93513\tObama\t93513\t0.002071926\t93513.0\n1448\t-117.872156\t36.485539\tKeeler CDP\tCA\tCalifornia\tInyo County\t61\t52.5\t13.3\t7.1\t18845\t71667\t0.4258\t93530\tObama\t93530\t9.71e-05\t93530.0\n1449\t-118.023959\t36.311731\tCartago CDP\tCA\tCalifornia\tInyo County\t101\t52.5\t13.2\t8.5\t18802\t70000\t0.4258\t93549\tObama\t93549\t0.000160725\t93549.0\n1450\t-117.58946100000001\t36.268834000000005\tDarwin CDP\tCA\tCalifornia\tInyo County\t50\t53.3\t13.5\t8.7\t18807\t71667\t0.4258\t93522\tObama\t93522\t7.96e-05\t93522.0\n1451\t-118.397598\t37.367715999999994\tBishop city\tCA\tCalifornia\tInyo County\t3466\t41.7\t13.5\t9.8\t21713\t177041\t0.4258\t93514\tObama\t93514\t0.005515587\t93514.0\n1452\t-116.873226\t36.428364\tFurnace Creek CDP\tCA\tCalifornia\tInyo County\t28\t47.5\t26.1\t11.1\t28678\t30000\t0.4258\t92328\tObama\t92328\t4.46e-05\t92328.0\n1453\t-118.41576200000002\t37.386258000000005\tDixon Lane-Meadow Creek CDP\tCA\tCalifornia\tInyo County\t2660\t48.8\t16.7\t6.8\t25210\t113793\t0.4258\t93514\tObama\t93514\t0.0042329659999999995\t93514.0\n1454\t-116.20751000000001\t35.835147\tTecopa CDP\tCA\tCalifornia\tInyo County\t90\t48.1\t24.0\t13.8\t28492\t38750\t0.4258\t92389\tObama\t92389\t0.00014322100000000002\t92389.0\n1455\t-118.209978\t36.824269\tIndependence CDP\tCA\tCalifornia\tInyo County\t533\t52.2\t16.2\t11.3\t21975\t131250\t0.4258\t93526\tObama\t93526\t0.000848185\t93526.0\n1456\t-118.078001\t36.576882\tLone Pine CDP\tCA\tCalifornia\tInyo County\t1570\t43.6\t14.6\t12.9\t19511\t148929\t0.4258\t93545\tObama\t93545\t0.002498405\t93545.0\n1457\t-118.000899\t36.267858000000004\tOlancha CDP\tCA\tCalifornia\tInyo County\t124\t52.1\t12.1\t8.6\t18820\t71250\t0.4258\t93549\tObama\t93549\t0.00019732599999999997\t93549.0\n1458\t-116.305375\t35.951048\tShoshone CDP\tCA\tCalifornia\tInyo County\t47\t47.9\t23.1\t13.3\t28651\t37500\t0.4258\t92384\tObama\t92384\t7.48e-05\t92384.0\n1459\t-118.542585\t37.419093\tMesa CDP\tCA\tCalifornia\tInyo County\t229\t50.5\t31.4\t11.0\t36455\t335294\t0.4258\t93514\tObama\t93514\t0.00036441699999999996\t93514.0\n1460\t-118.482878\t37.356937\tWest Bishop CDP\tCA\tCalifornia\tInyo County\t2779\t52.7\t30.3\t8.0\t30434\t362679\t0.4258\t93514\tObama\t93514\t0.004422336\t93514.0\n1461\t-118.581984\t37.406542\tRound Valley CDP\tCA\tCalifornia\tInyo County\t298\t50.8\t30.8\t10.9\t36394\t328261\t0.4258\t93514\tObama\t93514\t0.00047422\t93514.0\n1462\t-117.87553899999999\t35.818801\tPearsonville CDP\tCA\tCalifornia\tInyo County\t25\t46.3\t11.1\t8.3\t18807\t60000\t0.4258\t93527\tObama\t93527\t3.98e-05\t93527.0\n1463\t-117.809307\t35.047421\tNorth Edwards CDP\tCA\tCalifornia\tKern County\t1251\t41.9\t9.1\t18.1\t20762\t79483\t0.4041\t93523\tObama\t93523\t0.001990767\t93523.0\n1464\t-119.20033400000001\t35.394876000000004\tRosedale CDP\tCA\tCalifornia\tKern County\t16533\t40.6\t28.2\t8.3\t30774\t259562\t0.4041\t93312\tObama\t93312\t0.026309637\t93312.0\n1465\t-118.90972099999999\t35.237833\tWeedpatch CDP\tCA\tCalifornia\tKern County\t2924\t23.0\t0.7\t33.0\t7280\t95526\t0.4041\t93241\tObama\t93241\t0.00465308\t93241.0\n1466\t-119.67894799999999\t35.625738\tLost Hills CDP\tCA\tCalifornia\tKern County\t2386\t23.1\t3.4\t32.8\t9017\t62500\t0.4041\t93249\tObama\t93249\t0.003796939\t93249.0\n1467\t-119.39060500000001\t35.59535\tWasco city\tCA\tCalifornia\tKern County\t26298\t28.9\t7.1\t29.4\t14794\t123594\t0.4041\t93280\tObama\t93280\t0.041849079\t93280.0\n1468\t-119.423672\t35.126566\tTaft city\tCA\tCalifornia\tKern County\t9311\t34.2\t9.2\t19.6\t19179\t119327\t0.4041\t93268\tObama\t93268\t0.014816973999999998\t93268.0\n1469\t-117.665848\t35.016496999999994\tBoron CDP\tCA\tCalifornia\tKern County\t2035\t41.6\t10.2\t19.3\t19092\t85000\t0.4041\t93516\tObama\t93516\t0.003238378\t93516.0\n1470\t-117.66050200000001\t35.367777000000004\tRandsburg CDP\tCA\tCalifornia\tKern County\t90\t58.1\t10.7\t16.7\t24049\t58889\t0.4041\t93528\tObama\t93528\t0.00014322100000000002\t93528.0\n1471\t-118.646002\t35.177505\tBear Valley Springs CDP\tCA\tCalifornia\tKern County\t4658\t48.0\t31.4\t11.2\t31753\t267980\t0.4041\t93531\tObama\t93531\t0.007412465\t93531.0\n1472\t-118.97288300000001\t35.063576\tMettler CDP\tCA\tCalifornia\tKern County\t165\t38.6\t4.8\t17.7\t18471\t97500\t0.4041\t93313\tObama\t93313\t0.00026257099999999996\t93313.0\n1473\t-118.473072\t35.713158\tWofford Heights CDP\tCA\tCalifornia\tKern County\t2797\t59.8\t10.3\t18.2\t19043\t95211\t0.4041\t93285\tObama\t93285\t0.00445098\t93285.0\n1474\t-119.457733\t35.129284999999996\tSouth Taft CDP\tCA\tCalifornia\tKern County\t2017\t29.4\t2.3\t18.7\t10959\t56296\t0.4041\t93268\tObama\t93268\t0.003209734\t93268.0\n1475\t-119.00255800000001\t34.82264\tLake of the Woods CDP\tCA\tCalifornia\tKern County\t1056\t41.3\t19.5\t15.5\t20398\t138575\t0.4041\t93225\tObama\t93225\t0.001680456\t93225.0\n1476\t-119.47123500000001\t35.13377\tTaft Heights CDP\tCA\tCalifornia\tKern County\t1922\t31.9\t18.0\t15.2\t22022\t104938\t0.4041\t93268\tObama\t93268\t0.003058557\t93268.0\n1477\t-118.40443\t35.640794\tMountain Mesa CDP\tCA\tCalifornia\tKern County\t758\t58.5\t9.0\t15.7\t20232\t123661\t0.4041\t93240\tObama\t93240\t0.001206236\t93240.0\n1478\t-119.02766399999999\t35.424378000000004\tOildale CDP\tCA\tCalifornia\tKern County\t31669\t32.8\t7.2\t20.2\t16314\t112389\t0.4041\t93301\tObama\t93301\t0.05039617\t93301.0\n1479\t-118.50218999999998\t35.151221\tGolden Hills CDP\tCA\tCalifornia\tKern County\t10271\t35.9\t18.9\t13.5\t22500\t190774\t0.4041\t93561\tObama\t93561\t0.016344661\t93561.0\n1480\t-119.409884\t35.049596\tMaricopa city\tCA\tCalifornia\tKern County\t1355\t41.4\t3.4\t19.6\t15179\t63448\t0.4041\t93252\tObama\t93252\t0.002156267\t93252.0\n1481\t-118.432448\t35.753322999999995\tKernville CDP\tCA\tCalifornia\tKern County\t2155\t56.2\t10.0\t12.3\t29862\t160526\t0.4041\t93238\tObama\t93238\t0.0034293390000000004\t93238.0\n1482\t-118.60999299999999\t35.232927000000004\tKeene CDP\tCA\tCalifornia\tKern County\t387\t49.3\t27.1\t11.3\t29915\t243750\t0.4041\t93531\tObama\t93531\t0.000615849\t93531.0\n1483\t-119.257452\t35.766073999999996\tDelano city\tCA\tCalifornia\tKern County\t46717\t28.0\t6.8\t38.0\t12122\t131380\t0.4041\t93216\tObama\t93216\t0.074342666\t93216.0\n1484\t-118.44116399999999\t35.132943\tTehachapi city\tCA\tCalifornia\tKern County\t13026\t33.9\t10.1\t14.4\t19581\t132885\t0.4041\t93561\tObama\t93561\t0.020728805\t93561.0\n1485\t-119.35767\t35.298882\tTupman CDP\tCA\tCalifornia\tKern County\t239\t38.9\t4.4\t17.0\t18441\t104167\t0.4041\t93276\tObama\t93276\t0.00038033\t93276.0\n1486\t-118.407583\t35.622906\tSquirrel Mountain Valley CDP\tCA\tCalifornia\tKern County\t520\t58.4\t9.0\t15.9\t20235\t122619\t0.4041\t93240\tObama\t93240\t0.000827497\t93240.0\n1487\t-118.83046100000001\t35.194203\tArvin city\tCA\tCalifornia\tKern County\t18071\t24.3\t4.4\t35.0\t8727\t113418\t0.4041\t93203\tObama\t93203\t0.028757118999999998\t93203.0\n1488\t-118.189431\t35.013784\tMojave CDP\tCA\tCalifornia\tKern County\t4119\t33.5\t5.6\t22.1\t14684\t83776\t0.4041\t93501\tObama\t93501\t0.006554733\t93501.0\n1489\t-119.44103600000001\t35.409165\tButtonwillow CDP\tCA\tCalifornia\tKern County\t1339\t25.9\t1.7\t23.5\t10670\t105769\t0.4041\t93206\tObama\t93206\t0.002130805\t93206.0\n1490\t-117.661923\t35.630914000000004\tRidgecrest city\tCA\tCalifornia\tKern County\t26305\t36.9\t23.7\t15.0\t24467\t98709\t0.4041\t93555\tObama\t93555\t0.041860218\t93555.0\n1491\t-118.234257\t35.683859999999996\tOnyx CDP\tCA\tCalifornia\tKern County\t573\t54.7\t6.2\t33.2\t13098\t60000\t0.4041\t93283\tObama\t93283\t0.000911838\t93283.0\n1492\t-117.92908200000001\t34.904013\tEdwards AFB CDP\tCA\tCalifornia\tKern County\t4868\t22.7\t26.2\t17.1\t17946\t36875\t0.4041\t93523\tObama\t93523\t0.007746647\t93523.0\n1493\t-119.410665\t35.208559\tValley Acres CDP\tCA\tCalifornia\tKern County\t530\t42.7\t6.3\t14.6\t18293\t99773\t0.4041\t93268\tObama\t93268\t0.0008434110000000001\t93268.0\n1494\t-119.60403500000001\t35.243905\tDerby Acres CDP\tCA\tCalifornia\tKern County\t396\t38.8\t4.3\t17.0\t18432\t100000\t0.4041\t93224\tObama\t93224\t0.000630171\t93224.0\n1495\t-119.25187199999999\t35.485799\tShafter city\tCA\tCalifornia\tKern County\t15610\t27.1\t6.1\t26.5\t12507\t117320\t0.4041\t93263\tObama\t93263\t0.024840829\t93263.0\n1496\t-119.45845700000001\t35.164764\tFord City CDP\tCA\tCalifornia\tKern County\t3716\t32.9\t4.9\t27.6\t12104\t87000\t0.4041\t93268\tObama\t93268\t0.005913422\t93268.0\n1497\t-118.64700500000001\t35.093182\tStallion Springs CDP\tCA\tCalifornia\tKern County\t2215\t46.0\t15.9\t14.9\t21575\t187500\t0.4041\t93561\tObama\t93561\t0.00352482\t93561.0\n1498\t-119.374927\t35.216194\tDustin Acres CDP\tCA\tCalifornia\tKern County\t616\t38.8\t4.3\t17.0\t18431\t102083\t0.4041\t93268\tObama\t93268\t0.000980266\t93268.0\n1499\t-117.822308\t35.654984000000006\tInyokern CDP\tCA\tCalifornia\tKern County\t1185\t47.2\t24.1\t14.4\t27847\t95484\t0.4041\t93527\tObama\t93527\t0.001885739\t93527.0\n1500\t-118.476083\t35.576386\tBodfish CDP\tCA\tCalifornia\tKern County\t2254\t55.1\t9.8\t20.1\t13467\t85804\t0.4041\t93205\tObama\t93205\t0.003586882\t93205.0\n1501\t-119.547513\t35.178159\tFellows CDP\tCA\tCalifornia\tKern County\t167\t45.2\t6.1\t19.1\t20007\t85000\t0.4041\t93224\tObama\t93224\t0.000265754\t93224.0\n1502\t-118.21560600000001\t34.865694\tRosamond CDP\tCA\tCalifornia\tKern County\t18677\t31.8\t11.2\t16.7\t20904\t129499\t0.4041\t93560\tObama\t93560\t0.029721471\t93560.0\n1503\t-117.76501599999999\t35.638496\tChina Lake Acres CDP\tCA\tCalifornia\tKern County\t1866\t45.3\t11.4\t21.2\t18952\t60152\t0.4041\t93555\tObama\t93555\t0.002969442\t93555.0\n1504\t-117.838727\t35.182338\tCalifornia City\tCA\tCalifornia\tKern County\t13755\t32.1\t12.5\t16.1\t22597\t119181\t0.4041\t93505\tObama\t93505\t0.021888892000000004\t93505.0\n1505\t-119.62483300000001\t35.297965000000005\tMcKittrick CDP\tCA\tCalifornia\tKern County\t168\t38.8\t4.7\t17.5\t18482\t102500\t0.4041\t93251\tObama\t93251\t0.000267345\t93251.0\n1506\t-119.01515\t35.359659\tBakersfield city\tCA\tCalifornia\tKern County\t327412\t31.1\t20.3\t15.0\t20880\t156925\t0.4041\t93304\tObama\t93304\t0.521024056\t93304.0\n1507\t-118.915761\t35.265107\tLamont CDP\tCA\tCalifornia\tKern County\t14366\t24.5\t2.5\t29.2\t8747\t108839\t0.4041\t93241\tObama\t93241\t0.022861201\t93241.0\n1508\t-118.310194\t35.643035999999995\tWeldon CDP\tCA\tCalifornia\tKern County\t2940\t56.2\t5.9\t17.4\t16328\t90543\t0.4041\t93283\tObama\t93283\t0.004678542\t93283.0\n1509\t-119.23717099999999\t35.678954\tMcFarland city\tCA\tCalifornia\tKern County\t11204\t26.7\t5.7\t31.5\t10435\t113450\t0.4041\t93250\tObama\t93250\t0.017829382\t93250.0\n1510\t-118.954619\t34.812447\tFrazier Park CDP\tCA\tCalifornia\tKern County\t2903\t39.2\t15.6\t17.3\t22643\t144196\t0.4041\t93225\tObama\t93225\t0.004619662\t93225.0\n1511\t-118.89885100000001\t34.845225\tLebec CDP\tCA\tCalifornia\tKern County\t1577\t39.4\t13.7\t17.1\t18411\t151429\t0.4041\t93243\tObama\t93243\t0.002509544\t93243.0\n1512\t-119.168865\t34.844652\tPine Mountain Club CDP\tCA\tCalifornia\tKern County\t1999\t45.6\t25.9\t16.5\t23003\t216776\t0.4041\t93222\tObama\t93222\t0.00318109\t93222.0\n1513\t-118.482545\t35.637665999999996\tLake Isabella CDP\tCA\tCalifornia\tKern County\t3994\t50.7\t5.2\t23.4\t14225\t87149\t0.4041\t932HH\tObama\t932HH\t0.006355815\t0.0\n1514\t-117.64194599999999\t35.371875\tJohannesburg CDP\tCA\tCalifornia\tKern County\t207\t57.9\t10.0\t17.9\t23906\t58000\t0.4041\t93528\tObama\t93528\t0.00032940800000000006\t93528.0\n1515\t-119.822244\t36.188477\tStratford CDP\tCA\tCalifornia\tKings County\t1712\t26.3\t6.1\t31.7\t10577\t105990\t0.4131\t93266\tObama\t93266\t0.002724375\t93266.0\n1516\t-119.90496100000001\t36.263386\tLemoore Station CDP\tCA\tCalifornia\tKings County\t6737\t22.0\t12.1\t21.9\t13908\t97500\t0.4131\t93245\tObama\t93245\t0.010720863\t93245.0\n1517\t-119.705325\t36.317876\tArmona CDP\tCA\tCalifornia\tKings County\t3957\t28.9\t6.5\t22.2\t14388\t121094\t0.4131\t93202\tObama\t93202\t0.006296935\t93202.0\n1518\t-119.649201\t36.326134\tHanford city\tCA\tCalifornia\tKings County\t48379\t31.8\t14.4\t15.9\t19899\t159378\t0.4131\t93230\tObama\t93230\t0.076987474\t93230.0\n1519\t-120.11665\t36.030381\tAvenal city\tCA\tCalifornia\tKings County\t17907\t30.1\t8.6\t24.8\t15197\t106314\t0.4131\t93204\tObama\t93204\t0.028496139\t93204.0\n1520\t-119.96270700000001\t36.008981\tKettleman City CDP\tCA\tCalifornia\tKings County\t1862\t25.9\t1.7\t27.5\t8853\t94400\t0.4131\t93239\tObama\t93239\t0.002963076\t93239.0\n1521\t-119.55913400000001\t36.078505\tCorcoran city\tCA\tCalifornia\tKings County\t24284\t32.2\t7.3\t18.1\t17209\t115950\t0.4131\t93212\tObama\t93212\t0.038644119\t93212.0\n1522\t-119.638526\t36.303619\tHome Garden CDP\tCA\tCalifornia\tKings County\t1918\t27.9\t2.2\t27.5\t16528\t106144\t0.4131\t93230\tObama\t93230\t0.003052192\t93230.0\n1523\t-119.79845300000001\t36.296001000000004\tLemoore city\tCA\tCalifornia\tKings County\t25800\t28.6\t18.4\t15.0\t19899\t176819\t0.4131\t93245\tObama\t93245\t0.041056591\t93245.0\n1524\t-122.72270900000001\t38.835271\tCobb CDP\tCA\tCalifornia\tLake County\t1846\t43.6\t31.3\t18.5\t28923\t227690\t0.5627\t95426\tObama\t95426\t0.002937615\t95426.0\n1525\t-122.62856299999999\t38.755829\tMiddletown CDP\tCA\tCalifornia\tLake County\t1127\t44.4\t15.7\t19.1\t20484\t235185\t0.5627\t95461\tObama\t95461\t0.001793441\t95461.0\n1526\t-122.85202199999999\t39.124759000000005\tNice CDP\tCA\tCalifornia\tLake County\t2845\t50.1\t6.9\t28.4\t16471\t141375\t0.5627\t95464\tObama\t95464\t0.004527364\t95464.0\n1527\t-122.66522900000001\t39.021797\tClearlake Oaks CDP\tCA\tCalifornia\tLake County\t2624\t55.8\t12.6\t28.9\t16692\t160859\t0.5627\t95423\tObama\t95423\t0.0041756779999999995\t95423.0\n1528\t-122.633126\t38.958991\tClearlake city\tCA\tCalifornia\tLake County\t14500\t45.4\t6.3\t26.3\t14171\t113846\t0.5627\t95422\tObama\t95422\t0.023074441\t95422.0\n1529\t-122.533258\t38.804728999999995\tHidden Valley Lake CDP\tCA\tCalifornia\tLake County\t4978\t42.8\t19.1\t16.3\t21863\t263027\t0.5627\t95461\tObama\t95461\t0.007921694\t95461.0\n1530\t-122.905874\t39.087689000000005\tNorth Lakeport CDP\tCA\tCalifornia\tLake County\t3327\t46.3\t17.6\t18.0\t21192\t189063\t0.5627\t95453\tObama\t95453\t0.005294391\t95453.0\n1531\t-122.921334\t39.044409\tLakeport city\tCA\tCalifornia\tLake County\t5046\t42.5\t17.7\t18.8\t20877\t209641\t0.5627\t95453\tObama\t95453\t0.008029905\t95453.0\n1532\t-122.801616\t39.074326\tLucerne CDP\tCA\tCalifornia\tLake County\t3157\t52.3\t9.1\t22.7\t17829\t138514\t0.5627\t95458\tObama\t95458\t0.005023863\t95458.0\n1533\t-122.899078\t39.145488\tUpper Lake CDP\tCA\tCalifornia\tLake County\t1113\t40.9\t10.5\t18.1\t14960\t172348\t0.5627\t95485\tObama\t95485\t0.0017711620000000002\t95485.0\n1534\t-122.61929599999999\t38.899286\tLower Lake CDP\tCA\tCalifornia\tLake County\t1970\t47.6\t8.0\t17.6\t18615\t171536\t0.5627\t95457\tObama\t95457\t0.0031349409999999996\t95457.0\n1535\t-122.83102\t38.964406\tKelseyville CDP\tCA\tCalifornia\tLake County\t3262\t39.2\t11.1\t20.5\t15700\t183621\t0.5627\t95451\tObama\t95451\t0.005190954\t95451.0\n1536\t-121.003876\t40.304891\tWestwood CDP\tCA\tCalifornia\tLassen County\t1919\t38.5\t9.1\t18.3\t15279\t139583\t0.2858\t96137\tObama\t96137\t0.003053783\t96137.0\n1537\t-120.651374\t40.420787\tSusanville city\tCA\tCalifornia\tLassen County\t18547\t32.7\t11.6\t11.3\t21232\t181954\t0.2858\t96130\tObama\t96130\t0.029514597000000004\t96130.0\n1538\t-118.185882\t34.483123\tActon CDP\tCA\tCalifornia\tLos Angeles County\t2531\t41.4\t23.5\t13.2\t38313\t438942\t0.6969\t93510\tObama\t93510\t0.004027683\t93510.0\n1539\t-117.846457\t34.144455\tGlendora city\tCA\tCalifornia\tLos Angeles County\t51526\t39.2\t29.5\t10.3\t30190\t391293\t0.6969\t91741\tObama\t91741\t0.081995423\t91741.0\n1540\t-118.76096899999999\t34.150504999999995\tAgoura Hills city\tCA\tCalifornia\tLos Angeles County\t22055\t40.6\t53.5\t9.2\t46042\t646690\t0.6969\t91301\tObama\t91301\t0.03509702\t91301.0\n1541\t-118.341696\t33.834658000000005\tTorrance city\tCA\tCalifornia\tLos Angeles County\t145043\t41.5\t40.8\t9.9\t33311\t571687\t0.6969\t90503\tObama\t90503\t0.23081283600000002\t90503.0\n1542\t-118.20179499999999\t33.924065\tLynwood city\tCA\tCalifornia\tLos Angeles County\t73928\t25.1\t6.2\t19.8\t11343\t255035\t0.6969\t90262\tObama\t90262\t0.11764463900000001\t90262.0\n1543\t-118.08856899999999\t33.990488\tPico Rivera city\tCA\tCalifornia\tLos Angeles County\t66266\t30.9\t8.9\t13.7\t16107\t287559\t0.6969\t90660\tObama\t90660\t0.10545178599999999\t90660.0\n1544\t-118.135531\t34.084022\tAlhambra city\tCA\tCalifornia\tLos Angeles County\t89278\t36.7\t32.6\t13.1\t20479\t363787\t0.6969\t91801\tObama\t91801\t0.142071719\t91801.0\n1545\t-117.815929\t33.999515\tDiamond Bar city\tCA\tCalifornia\tLos Angeles County\t60312\t39.4\t48.1\t11.6\t29584\t429185\t0.6969\t91765\tObama\t91765\t0.09597694300000001\t91765.0\n1546\t-118.002123\t34.038197\tAvocado Heights CDP\tCA\tCalifornia\tLos Angeles County\t16045\t31.1\t12.2\t13.6\t17409\t303376\t0.6969\t917HH\tObama\t917HH\t0.025533062000000002\t0.0\n1547\t-118.334942\t33.888508\tAlondra Park CDP\tCA\tCalifornia\tLos Angeles County\t8946\t32.0\t20.9\t15.0\t20979\t349831\t0.6969\t90504\tObama\t90504\t0.014236134\t90504.0\n1548\t-118.11308400000001\t34.122378000000005\tSan Marino city\tCA\tCalifornia\tLos Angeles County\t13367\t45.3\t74.1\t9.3\t61135\t1000001\t0.6969\t91108\tObama\t91108\t0.021271452000000003\t91108.0\n1549\t-117.971942\t34.082919\tBaldwin Park city\tCA\tCalifornia\tLos Angeles County\t80950\t27.6\t12.0\t16.6\t14076\t247598\t0.6969\t91706\tObama\t91706\t0.128819033\t91706.0\n1550\t-117.88757\t33.978458\tRowland Heights CDP\tCA\tCalifornia\tLos Angeles County\t50277\t36.3\t38.2\t11.6\t23229\t383157\t0.6969\t91748\tObama\t91748\t0.080007839\t91748.0\n1551\t-118.135663\t34.193471\tAltadena CDP\tCA\tCalifornia\tLos Angeles County\t44005\t40.1\t44.1\t11.6\t31673\t467409\t0.6969\t91001\tObama\t91001\t0.07002695\t91001.0\n1552\t-118.78408999999999\t34.036817\tMalibu city\tCA\tCalifornia\tLos Angeles County\t13756\t45.2\t60.8\t9.3\t67043\t1000001\t0.6969\t90265\tObama\t90265\t0.021890483\t90265.0\n1553\t-117.987374\t34.522335999999996\tLittlerock CDP\tCA\tCalifornia\tLos Angeles County\t1415\t37.3\t8.2\t20.6\t19967\t188306\t0.6969\t93543\tObama\t93543\t0.002251747\t93543.0\n1554\t-117.894828\t34.116257\tCitrus CDP\tCA\tCalifornia\tLos Angeles County\t11019\t28.8\t13.2\t14.2\t16981\t264077\t0.6969\t91702\tObama\t91702\t0.017534984\t91702.0\n1555\t-117.99209599999999\t34.164833\tMonrovia city\tCA\tCalifornia\tLos Angeles County\t38763\t34.3\t29.4\t13.5\t25941\t395125\t0.6969\t91016\tObama\t91016\t0.061685141\t91016.0\n1556\t-118.122156\t33.847158\tLakewood city\tCA\tCalifornia\tLos Angeles County\t82250\t36.8\t24.4\t11.1\t26249\t361876\t0.6969\t90713\tObama\t90713\t0.13088777599999998\t90713.0\n1557\t-118.50685800000001\t34.412259999999996\tSanta Clarita city\tCA\tCalifornia\tLos Angeles County\t174480\t35.7\t33.6\t10.4\t32380\t389075\t0.6969\t91321\tObama\t91321\t0.277657133\t91321.0\n1558\t-118.009374\t33.902551\tLa Mirada city\tCA\tCalifornia\tLos Angeles County\t48384\t37.4\t29.2\t10.6\t27366\t372009\t0.6969\t90638\tObama\t90638\t0.076995431\t90638.0\n1559\t-118.062591\t33.933184000000004\tSanta Fe Springs city\tCA\tCalifornia\tLos Angeles County\t16968\t33.1\t12.2\t13.7\t18766\t285962\t0.6969\t90670\tObama\t90670\t0.02700187\t90670.0\n1560\t-118.269668\t33.894515000000006\tWest Compton CDP\tCA\tCalifornia\tLos Angeles County\t5607\t31.3\t13.4\t20.4\t15284\t237531\t0.6969\t90247\tObama\t90247\t0.008922648\t90247.0\n1561\t-118.175173\t34.693498\tLancaster city\tCA\tCalifornia\tLos Angeles County\t155313\t32.3\t20.1\t15.7\t21217\t180539\t0.6969\t93534\tObama\t93534\t0.247155905\t93534.0\n1562\t-118.13268899999998\t34.049923\tMonterey Park city\tCA\tCalifornia\tLos Angeles County\t63478\t39.5\t29.7\t12.0\t21850\t377656\t0.6969\t91754\tObama\t91754\t0.10101512800000001\t91754.0\n1563\t-117.76236399999999\t34.058578000000004\tPomona city\tCA\tCalifornia\tLos Angeles County\t163755\t27.3\t16.0\t15.9\t16249\t232762\t0.6969\t91766\tObama\t91766\t0.260590004\t91766.0\n1564\t-117.972172\t33.997171\tHacienda Heights CDP\tCA\tCalifornia\tLos Angeles County\t55324\t37.9\t35.2\t12.0\t25158\t400684\t0.6969\t91745\tObama\t91745\t0.088039335\t91745.0\n1565\t-117.953519\t34.03242\tLa Puente city\tCA\tCalifornia\tLos Angeles County\t43390\t28.5\t10.2\t15.9\t13926\t252892\t0.6969\t91744\tObama\t91744\t0.069048275\t91744.0\n1566\t-118.158677\t33.806608000000004\tLong Beach city\tCA\tCalifornia\tLos Angeles County\t488779\t30.8\t27.4\t15.4\t22741\t349871\t0.6969\t90804\tObama\t90804\t0.777813938\t90804.0\n1567\t-118.03739099999999\t34.134474\tArcadia city\tCA\tCalifornia\tLos Angeles County\t55908\t43.2\t49.4\t10.3\t33373\t658495\t0.6969\t91006\tObama\t91006\t0.08896867800000001\t91006.0\n1568\t-118.25603600000001\t33.837467\tCarson city\tCA\tCalifornia\tLos Angeles County\t97119\t34.6\t22.0\t14.5\t20256\t305712\t0.6969\t90745\tObama\t90745\t0.154549422\t90745.0\n1569\t-118.169226\t34.032494\tEast Los Angeles CDP\tCA\tCalifornia\tLos Angeles County\t129527\t26.7\t4.9\t18.1\t11298\t267528\t0.6969\t90022\tObama\t90022\t0.20612159300000002\t90022.0\n1570\t-118.072934\t33.830301\tHawaiian Gardens city\tCA\tCalifornia\tLos Angeles County\t15308\t25.6\t8.5\t15.5\t11876\t216201\t0.6969\t90716\tObama\t90716\t0.024360244\t90716.0\n1571\t-118.34741899999999\t33.914773\tHawthorne city\tCA\tCalifornia\tLos Angeles County\t90009\t28.2\t16.0\t17.3\t17535\t330733\t0.6969\t90250\tObama\t90250\t0.143234989\t90250.0\n1572\t-118.656477\t34.445514\tVal Verde CDP\tCA\tCalifornia\tLos Angeles County\t1647\t28.9\t12.4\t10.7\t19797\t246014\t0.6969\t91384\tObama\t91384\t0.0026209379999999997\t91384.0\n1573\t-118.40212700000001\t34.078439\tBeverly Hills city\tCA\tCalifornia\tLos Angeles County\t34857\t44.3\t59.5\t11.4\t63417\t1000001\t0.6969\t90210\tObama\t90210\t0.05546936400000001\t90210.0\n1574\t-118.08066299999999\t33.867608000000004\tArtesia city\tCA\tCalifornia\tLos Angeles County\t16896\t34.1\t22.5\t12.5\t19076\t327138\t0.6969\t90701\tObama\t90701\t0.026887293\t90701.0\n1575\t-118.21643200000001\t34.652621999999994\tQuartz Hill CDP\tCA\tCalifornia\tLos Angeles County\t11290\t35.6\t22.2\t13.7\t27318\t239115\t0.6969\t93551\tObama\t93551\t0.017966237\t93551.0\n1576\t-118.347366\t33.759423999999996\tRolling Hills city\tCA\tCalifornia\tLos Angeles County\t1948\t50.0\t69.6\t6.3\t90637\t1000001\t0.6969\t90275\tObama\t90275\t0.003099932\t90275.0\n1577\t-118.34836999999999\t33.995501000000004\tView Park-Windsor Hills CDP\tCA\tCalifornia\tLos Angeles County\t11362\t46.4\t50.1\t12.4\t37879\t540821\t0.6969\t90043\tObama\t90043\t0.018080814\t90043.0\n1578\t-118.396596\t33.865284\tHermosa Beach city\tCA\tCalifornia\tLos Angeles County\t19321\t35.2\t72.1\t9.3\t62399\t829453\t0.6969\t90254\tObama\t90254\t0.030746295\t90254.0\n1579\t-117.923759\t34.098319000000004\tVincent CDP\tCA\tCalifornia\tLos Angeles County\t15684\t30.2\t14.8\t13.1\t17502\t267995\t0.6969\t91722\tObama\t91722\t0.024958587999999997\t91722.0\n1580\t-118.080853\t34.119828999999996\tEast San Gabriel CDP\tCA\tCalifornia\tLos Angeles County\t15032\t39.1\t40.7\t11.0\t26220\t486882\t0.6969\t91775\tObama\t91775\t0.023921034\t91775.0\n1581\t-118.66119199999999\t34.163965000000005\tHidden Hills city\tCA\tCalifornia\tLos Angeles County\t2008\t43.5\t63.6\t7.5\t85745\t1000001\t0.6969\t91302\tObama\t91302\t0.003195412\t91302.0\n1582\t-117.85648400000001\t34.102478999999995\tCharter Oak CDP\tCA\tCalifornia\tLos Angeles County\t9372\t32.9\t20.4\t10.2\t22761\t292978\t0.6969\t91724\tObama\t91724\t0.014914045\t91724.0\n1583\t-118.33094399999999\t33.334861\tAvalon city\tCA\tCalifornia\tLos Angeles County\t3366\t34.6\t24.9\t9.6\t24428\t687030\t0.6969\t90704\tObama\t90704\t0.005356453000000001\t90704.0\n1584\t-118.244527\t33.967846\tFlorence-Graham CDP\tCA\tCalifornia\tLos Angeles County\t64009\t23.9\t3.3\t23.2\t9486\t233759\t0.6969\t90001\tObama\t90001\t0.10186013\t90001.0\n1585\t-118.153488\t34.590045\tDesert View Highlands CDP\tCA\tCalifornia\tLos Angeles County\t2397\t30.2\t19.1\t15.0\t20498\t175847\t0.6969\t93551\tObama\t93551\t0.003814444\t93551.0\n1586\t-118.216714\t33.980015\tHuntington Park city\tCA\tCalifornia\tLos Angeles County\t63838\t26.1\t6.7\t18.8\t11345\t278468\t0.6969\t90255\tObama\t90255\t0.10158801099999999\t90255.0\n1587\t-117.91346100000001\t34.137681\tAzusa city\tCA\tCalifornia\tLos Angeles County\t48268\t28.1\t18.0\t14.9\t17972\t247377\t0.6969\t91702\tObama\t91702\t0.076810835\t91702.0\n1588\t-117.84022900000001\t34.615479\tLake Los Angeles CDP\tCA\tCalifornia\tLos Angeles County\t12240\t28.6\t11.0\t18.2\t15369\t139953\t0.6969\t93591\tObama\t93591\t0.019478011\t93591.0\n1589\t-117.88163899999999\t34.09026\tCovina city\tCA\tCalifornia\tLos Angeles County\t50043\t33.8\t22.0\t11.9\t24079\t329518\t0.6969\t91723\tObama\t91723\t0.079635465\t91723.0\n1590\t-118.221971\t33.968331\tWalnut Park CDP\tCA\tCalifornia\tLos Angeles County\t16467\t27.3\t6.8\t17.4\t11962\t287808\t0.6969\t90255\tObama\t90255\t0.026204607999999997\t90255.0\n1591\t-118.15512700000001\t33.966257\tBell Gardens city\tCA\tCalifornia\tLos Angeles County\t46269\t24.2\t5.6\t19.6\t10455\t290909\t0.6969\t90201\tObama\t90201\t0.073629745\t90201.0\n1592\t-118.200057\t34.209383\tLa Canada Flintridge city\tCA\tCalifornia\tLos Angeles County\t21054\t46.2\t67.7\t9.0\t57552\t900179\t0.6969\t91011\tObama\t91011\t0.033504088\t91011.0\n1593\t-118.23524099999999\t34.232123\tLa Crescenta-Montrose CDP\tCA\tCalifornia\tLos Angeles County\t19368\t41.2\t45.6\t9.6\t35464\t558225\t0.6969\t91214\tObama\t91214\t0.030821087999999996\t91214.0\n1594\t-118.397276\t33.889482\tManhattan Beach city\tCA\tCalifornia\tLos Angeles County\t35316\t40.6\t71.8\t8.1\t69131\t981926\t0.6969\t90266\tObama\t90266\t0.05619979\t90266.0\n1595\t-118.376718\t33.857372999999995\tRedondo Beach city\tCA\tCalifornia\tLos Angeles County\t66360\t39.8\t53.1\t10.1\t46488\t623556\t0.6969\t90278\tObama\t90278\t0.105601372\t90278.0\n1596\t-117.71560500000001\t34.12577\tClaremont city\tCA\tCalifornia\tLos Angeles County\t36618\t37.7\t56.8\t10.2\t36035\t439817\t0.6969\t91711\tObama\t91711\t0.058271715\t91711.0\n1597\t-118.04828400000001\t34.049203999999996\tSouth El Monte city\tCA\tCalifornia\tLos Angeles County\t22284\t28.0\t4.8\t16.0\t12141\t261111\t0.6969\t91733\tObama\t91733\t0.035461437\t91733.0\n1598\t-118.192527\t33.944621000000005\tSouth Gate city\tCA\tCalifornia\tLos Angeles County\t101369\t26.7\t6.5\t16.8\t12835\t278453\t0.6969\t90280\tObama\t90280\t0.16131262\t90280.0\n1599\t-118.151872\t33.996137\tCommerce city\tCA\tCalifornia\tLos Angeles County\t13340\t28.2\t6.0\t22.8\t14074\t270041\t0.6969\t90040\tObama\t90040\t0.021228486\t90040.0\n1600\t-118.454752\t33.976589000000004\tMarina del Rey CDP\tCA\tCalifornia\tLos Angeles County\t8396\t43.2\t67.1\t10.3\t66030\t338281\t0.6969\t90292\tObama\t90292\t0.013360897\t90292.0\n1601\t-118.15731000000001\t34.110259\tSouth Pasadena city\tCA\tCalifornia\tLos Angeles County\t25305\t39.7\t61.4\t9.6\t40750\t643237\t0.6969\t91030\tObama\t91030\t0.040268878\t91030.0\n1602\t-118.179826\t33.979319\tBell city\tCA\tCalifornia\tLos Angeles County\t38229\t26.2\t5.5\t17.5\t11651\t283253\t0.6969\t90201\tObama\t90201\t0.060835365\t90201.0\n1603\t-118.127155\t33.888032\tBellflower city\tCA\tCalifornia\tLos Angeles County\t78255\t29.7\t16.0\t14.4\t18948\t298662\t0.6969\t90706\tObama\t90706\t0.12453037\t90706.0\n1604\t-117.96380500000001\t34.112146\tIrwindale city\tCA\tCalifornia\tLos Angeles County\t1687\t29.2\t9.1\t14.3\t17399\t287500\t0.6969\t91010\tObama\t91010\t0.002684592\t91010.0\n1605\t-118.018786\t33.967507\tWhittier city\tCA\tCalifornia\tLos Angeles County\t87549\t33.9\t25.4\t11.7\t25828\t379030\t0.6969\t90602\tObama\t90602\t0.13932029099999999\t90602.0\n1606\t-118.246788\t34.182008\tGlendale city\tCA\tCalifornia\tLos Angeles County\t203228\t39.2\t37.0\t13.3\t26325\t524021\t0.6969\t91207\tObama\t91207\t0.32340499699999997\t91207.0\n1607\t-118.03119699999999\t33.933727000000005\tSouth Whittier CDP\tCA\tCalifornia\tLos Angeles County\t58211\t29.5\t12.2\t13.8\t17982\t296700\t0.6969\t90605\tObama\t90605\t0.092633536\t90605.0\n1608\t-118.082872\t33.906915999999995\tNorwalk city\tCA\tCalifornia\tLos Angeles County\t110316\t29.9\t13.3\t15.0\t16950\t275143\t0.6969\t90650\tObama\t90650\t0.17555034600000002\t90650.0\n1609\t-117.932999\t34.016863\tIndustry city\tCA\tCalifornia\tLos Angeles County\t818\t33.4\t14.6\t19.4\t14910\t252778\t0.6969\t91744\tObama\t91744\t0.001301717\t91744.0\n1610\t-118.344373\t33.956457\tInglewood city\tCA\tCalifornia\tLos Angeles County\t118001\t29.8\t16.3\t16.7\t17631\t293420\t0.6969\t90301\tObama\t90301\t0.187779799\t90301.0\n1611\t-117.808679\t34.108605\tSan Dimas city\tCA\tCalifornia\tLos Angeles County\t36836\t39.1\t33.4\t10.8\t33344\t394761\t0.6969\t91773\tObama\t91773\t0.058618628\t91773.0\n1612\t-118.18410800000001\t33.963432\tCudahy city\tCA\tCalifornia\tLos Angeles County\t25393\t23.7\t4.3\t17.9\t10179\t239409\t0.6969\t90201\tObama\t90201\t0.040408916\t90201.0\n1613\t-117.96886699999999\t34.051342\tWest Puente Valley CDP\tCA\tCalifornia\tLos Angeles County\t23080\t29.9\t10.2\t14.8\t14422\t261219\t0.6969\t91746\tObama\t91746\t0.036728144\t91746.0\n1614\t-118.069152\t33.976061\tWest Whittier-Los Nietos CDP\tCA\tCalifornia\tLos Angeles County\t26097\t30.4\t10.4\t15.1\t17451\t285855\t0.6969\t90606\tObama\t90606\t0.041529219\t90606.0\n1615\t-117.77035500000001\t34.120267999999996\tLa Verne city\tCA\tCalifornia\tLos Angeles County\t32635\t40.5\t36.0\t10.7\t30070\t387545\t0.6969\t91750\tObama\t91750\t0.051933405\t91750.0\n1616\t-118.32336000000001\t34.187945\tBurbank city\tCA\tCalifornia\tLos Angeles County\t105498\t38.5\t33.7\t12.5\t30801\t455404\t0.6969\t91504\tObama\t91504\t0.167883266\t91504.0\n1617\t-118.105905\t34.594373\tPalmdale city\tCA\tCalifornia\tLos Angeles County\t147575\t29.0\t17.8\t14.8\t20740\t211064\t0.6969\t93550\tObama\t93550\t0.23484211\t93550.0\n1618\t-117.96860500000001\t34.153388\tBradbury city\tCA\tCalifornia\tLos Angeles County\t893\t59.3\t49.8\t9.8\t57799\t846875\t0.6969\t91010\tObama\t91010\t0.001421067\t91010.0\n1619\t-117.93008799999998\t34.039967\tValinda CDP\tCA\tCalifornia\tLos Angeles County\t23092\t29.1\t12.8\t17.4\t15775\t275248\t0.6969\t91744\tObama\t91744\t0.03674724\t91744.0\n1620\t-118.19463600000002\t33.897393\tEast Compton CDP\tCA\tCalifornia\tLos Angeles County\t9710\t23.7\t4.2\t20.0\t10086\t229398\t0.6969\t90221\tObama\t90221\t0.015451919\t90221.0\n1621\t-118.02901899999999\t34.073832\tEl Monte city\tCA\tCalifornia\tLos Angeles County\t124786\t27.4\t9.4\t16.9\t12506\t261752\t0.6969\t91731\tObama\t91731\t0.198577046\t91731.0\n1622\t-118.05793200000001\t34.102288\tTemple City\tCA\tCalifornia\tLos Angeles County\t35153\t40.7\t33.1\t11.1\t24212\t420770\t0.6969\t91780\tObama\t91780\t0.055940400999999994\t91780.0\n1623\t-118.08226200000001\t34.068953\tRosemead city\tCA\tCalifornia\tLos Angeles County\t55573\t33.1\t15.7\t13.8\t15073\t316813\t0.6969\t91770\tObama\t91770\t0.088435579\t91770.0\n1624\t-118.66628\t34.135965\tCalabasas city\tCA\tCalifornia\tLos Angeles County\t24315\t40.8\t62.4\t9.3\t53300\t811474\t0.6969\t91302\tObama\t91302\t0.03869345\t91302.0\n1625\t-118.35863799999998\t33.938164\tLennox CDP\tCA\tCalifornia\tLos Angeles County\t24223\t24.6\t4.1\t17.9\t9897\t272096\t0.6969\t90304\tObama\t90304\t0.038547047\t90304.0\n1626\t-118.396782\t34.005649\tCulver City\tCA\tCalifornia\tLos Angeles County\t40163\t41.8\t46.6\t11.5\t34246\t488836\t0.6969\t90230\tObama\t90230\t0.063913018\t90230.0\n1627\t-118.05032800000001\t34.16887\tSierra Madre city\tCA\tCalifornia\tLos Angeles County\t10896\t46.1\t55.1\t8.2\t48377\t656421\t0.6969\t91024\tObama\t91024\t0.017339248999999998\t91024.0\n1628\t-118.168249\t33.803034999999994\tSignal Hill city\tCA\tCalifornia\tLos Angeles County\t10655\t35.0\t29.7\t12.1\t29828\t291955\t0.6969\t90806\tObama\t90806\t0.016955736000000003\t90806.0\n1629\t-118.36343500000001\t33.7556\tRancho Palos Verdes city\tCA\tCalifornia\tLos Angeles County\t42529\t47.8\t62.8\t8.3\t53214\t886354\t0.6969\t90275\tObama\t90275\t0.067678131\t90275.0\n1630\t-118.353196\t33.888515999999996\tLawndale city\tCA\tCalifornia\tLos Angeles County\t33380\t29.4\t15.8\t14.4\t17149\t297759\t0.6969\t90260\tObama\t90260\t0.053118954\t90260.0\n1631\t-117.95145500000001\t33.960511\tLa Habra Heights city\tCA\tCalifornia\tLos Angeles County\t5973\t45.6\t52.4\t8.1\t53855\t755416\t0.6969\t90631\tObama\t90631\t0.009505078\t90631.0\n1632\t-118.09618999999999\t34.048992\tSouth San Gabriel CDP\tCA\tCalifornia\tLos Angeles County\t7912\t37.4\t24.8\t16.6\t21386\t277679\t0.6969\t91770\tObama\t91770\t0.012590688000000001\t91770.0\n1633\t-118.068605\t33.867853000000004\tCerritos city\tCA\tCalifornia\tLos Angeles County\t53181\t41.1\t48.9\t10.2\t29272\t511428\t0.6969\t90703\tObama\t90703\t0.08462909199999999\t90703.0\n1634\t-118.373923\t33.996891\tLadera Heights CDP\tCA\tCalifornia\tLos Angeles County\t7048\t46.4\t58.5\t9.9\t56064\t770233\t0.6969\t90056\tObama\t90056\t0.01121577\t90056.0\n1635\t-118.187575\t33.988513\tMaywood city\tCA\tCalifornia\tLos Angeles County\t29012\t25.3\t3.3\t18.8\t11233\t272905\t0.6969\t90270\tObama\t90270\t0.046167978\t90270.0\n1636\t-117.98868700000001\t33.92447\tEast La Mirada CDP\tCA\tCalifornia\tLos Angeles County\t9781\t34.3\t17.8\t12.2\t25318\t376180\t0.6969\t90603\tObama\t90603\t0.015564904\t90603.0\n1637\t-118.13110800000001\t33.937776\tDowney city\tCA\tCalifornia\tLos Angeles County\t114778\t32.4\t21.0\t12.9\t21132\t372429\t0.6969\t90241\tObama\t90241\t0.182650908\t90241.0\n1638\t-118.401775\t33.916987\tEl Segundo city\tCA\tCalifornia\tLos Angeles County\t16676\t39.3\t46.2\t10.1\t39753\t646295\t0.6969\t90245\tObama\t90245\t0.026537197999999998\t90245.0\n1639\t-118.4362\t34.288610999999996\tSan Fernando city\tCA\tCalifornia\tLos Angeles County\t25440\t27.5\t7.2\t14.5\t13982\t244715\t0.6969\t91340\tObama\t91340\t0.040483709\t91340.0\n1640\t-118.110895\t34.015378000000005\tMontebello city\tCA\tCalifornia\tLos Angeles County\t65891\t32.8\t17.5\t15.4\t18090\t354826\t0.6969\t90640\tObama\t90640\t0.10485503300000001\t90640.0\n1641\t-118.099069\t34.094776\tSan Gabriel city\tCA\tCalifornia\tLos Angeles County\t41884\t37.6\t29.2\t12.8\t20632\t403615\t0.6969\t91776\tObama\t91776\t0.066651716\t91776.0\n1642\t-117.91138400000001\t34.055504\tWest Covina city\tCA\tCalifornia\tLos Angeles County\t112276\t34.0\t26.6\t12.9\t23252\t339526\t0.6969\t91791\tObama\t91791\t0.178669374\t91791.0\n1643\t-118.009735\t34.115784000000005\tMayflower Village CDP\tCA\tCalifornia\tLos Angeles County\t5507\t40.3\t25.0\t10.2\t25080\t334690\t0.6969\t910HH\tObama\t910HH\t0.008763513\t0.0\n1644\t-118.481784\t34.022909999999996\tSanta Monica city\tCA\tCalifornia\tLos Angeles County\t89472\t41.7\t59.5\t13.0\t51177\t803390\t0.6969\t90404\tObama\t90404\t0.142380439\t90404.0\n1645\t-118.13873500000001\t34.15965\tPasadena city\tCA\tCalifornia\tLos Angeles County\t143741\t35.8\t45.8\t12.8\t33389\t471148\t0.6969\t91101\tObama\t91101\t0.22874091\t91101.0\n1646\t-117.904137\t34.012215999999995\tSouth San Jose Hills CDP\tCA\tCalifornia\tLos Angeles County\t20799\t27.8\t10.1\t16.2\t13016\t231520\t0.6969\t91792\tObama\t91792\t0.033098296\t91792.0\n1647\t-118.40966399999999\t34.120841999999996\tLos Angeles city\tCA\tCalifornia\tLos Angeles County\t3973387\t32.4\t29.4\t15.4\t24313\t381582\t0.6969\t91604\tObama\t91604\t6.32301263\t91604.0\n1648\t-118.82183899999998\t34.137116\tWestlake Village city\tCA\tCalifornia\tLos Angeles County\t8662\t47.6\t57.0\t10.4\t54786\t695393\t0.6969\t913HH\tObama\t913HH\t0.013784194\t0.0\n1649\t-118.37198400000001\t34.088177\tWest Hollywood city\tCA\tCalifornia\tLos Angeles County\t36797\t42.1\t52.0\t12.4\t46187\t473179\t0.6969\t90069\tObama\t90069\t0.058556565\t90069.0\n1650\t-118.301768\t33.941752\tWestmont CDP\tCA\tCalifornia\tLos Angeles County\t32977\t25.6\t7.2\t23.6\t12136\t260303\t0.6969\t90044\tObama\t90044\t0.052477644000000004\t90044.0\n1651\t-118.210283\t34.001919\tVernon city\tCA\tCalifornia\tLos Angeles County\t91\t30.3\t17.3\t5.0\t20604\t433333\t0.6969\t90058\tObama\t90058\t0.000144812\t90058.0\n1652\t-117.950253\t34.160636\tDuarte city\tCA\tCalifornia\tLos Angeles County\t22832\t36.2\t28.1\t11.7\t23715\t287181\t0.6969\t91010\tObama\t91010\t0.036333492\t91010.0\n1653\t-118.165255\t33.897608\tParamount city\tCA\tCalifornia\tLos Angeles County\t58024\t25.7\t9.2\t18.5\t13565\t230005\t0.6969\t90723\tObama\t90723\t0.092335955\t90723.0\n1654\t-118.29326499999999\t33.822964\tWest Carson CDP\tCA\tCalifornia\tLos Angeles County\t22009\t41.3\t28.7\t12.5\t25784\t307935\t0.6969\t90502\tObama\t90502\t0.035023818\t90502.0\n1655\t-118.39771299999998\t33.787082\tPalos Verdes Estates city\tCA\tCalifornia\tLos Angeles County\t13772\t48.5\t74.8\t7.4\t72119\t1000001\t0.6969\t90274\tObama\t90274\t0.021915945\t90274.0\n1656\t-118.349377\t33.781748\tRolling Hills Estates city\tCA\tCalifornia\tLos Angeles County\t8282\t48.3\t65.8\t8.3\t60972\t934928\t0.6969\t90275\tObama\t90275\t0.013179483999999998\t90275.0\n1657\t-118.077298\t34.1379\tEast Pasadena CDP\tCA\tCalifornia\tLos Angeles County\t6306\t38.7\t44.6\t11.2\t35631\t546136\t0.6969\t91107\tObama\t91107\t0.010034995\t91107.0\n1658\t-118.31760600000001\t33.793321999999996\tLomita city\tCA\tCalifornia\tLos Angeles County\t20645\t37.0\t27.3\t11.8\t25897\t446799\t0.6969\t90717\tObama\t90717\t0.03285323\t90717.0\n1659\t-118.307203\t33.894428000000005\tGardena city\tCA\tCalifornia\tLos Angeles County\t61513\t35.6\t20.3\t13.7\t21030\t300665\t0.6969\t90247\tObama\t90247\t0.09788814300000001\t90247.0\n1660\t-117.85973100000001\t34.033749\tWalnut city\tCA\tCalifornia\tLos Angeles County\t31929\t39.5\t47.9\t9.7\t29228\t515193\t0.6969\t91789\tObama\t91789\t0.050809919\t91789.0\n1661\t-118.254888\t33.916438\tWillowbrook CDP\tCA\tCalifornia\tLos Angeles County\t36931\t26.4\t8.0\t19.4\t12486\t228359\t0.6969\t90059\tObama\t90059\t0.058769805\t90059.0\n1662\t-118.369349\t33.916695000000004\tDel Aire CDP\tCA\tCalifornia\tLos Angeles County\t9380\t36.0\t20.1\t10.5\t24694\t338092\t0.6969\t90250\tObama\t90250\t0.014926776000000001\t90250.0\n1663\t-118.303226\t33.923517\tWest Athens CDP\tCA\tCalifornia\tLos Angeles County\t9396\t29.0\t15.4\t16.0\t15398\t279620\t0.6969\t90061\tObama\t90061\t0.014952238\t90061.0\n1664\t-118.023868\t34.102952\tNorth El Monte CDP\tCA\tCalifornia\tLos Angeles County\t4216\t40.2\t26.9\t9.1\t26231\t346921\t0.6969\t910HH\tObama\t910HH\t0.006709093\t0.0\n1665\t-118.227382\t33.892884\tCompton city\tCA\tCalifornia\tLos Angeles County\t100126\t25.4\t7.7\t20.3\t12568\t233611\t0.6969\t90220\tObama\t90220\t0.159334583\t90220.0\n1666\t-120.02183799999999\t36.946259000000005\tParksdale CDP\tCA\tCalifornia\tMadera County\t2762\t25.5\t6.8\t38.9\t8719\t115341\t0.4018\t93638\tObama\t93638\t0.004395283\t93638.0\n1667\t-119.90981200000002\t36.959592\tBonadelle Ranchos-Madera Ranchos CDP\tCA\tCalifornia\tMadera County\t8606\t41.1\t19.4\t10.6\t26603\t206078\t0.4018\t93638\tObama\t93638\t0.013695078000000001\t93638.0\n1668\t-120.078131\t36.966054\tMadera city\tCA\tCalifornia\tMadera County\t55841\t27.3\t12.0\t22.9\t13711\t142902\t0.4018\t93638\tObama\t93638\t0.08886205900000001\t93638.0\n1669\t-120.24901299999999\t37.118382000000004\tChowchilla city\tCA\tCalifornia\tMadera County\t18555\t35.0\t6.9\t19.5\t17799\t128566\t0.4018\t93610\tObama\t93610\t0.029527328\t93610.0\n1670\t-120.080542\t37.011720000000004\tMadera Acres CDP\tCA\tCalifornia\tMadera County\t8619\t32.0\t11.7\t15.9\t17705\t166318\t0.4018\t93638\tObama\t93638\t0.013715766\t93638.0\n1671\t-119.772306\t37.188629\tYosemite Lakes CDP\tCA\tCalifornia\tMadera County\t5209\t46.9\t30.6\t8.8\t29135\t227491\t0.4018\t93614\tObama\t93614\t0.008289294000000001\t93614.0\n1672\t-120.051776\t36.930566\tParkwood CDP\tCA\tCalifornia\tMadera County\t2593\t27.3\t10.8\t21.7\t12647\t121896\t0.4018\t93638\tObama\t93638\t0.004126347\t93638.0\n1673\t-119.64826200000002\t37.333902\tOakhurst CDP\tCA\tCalifornia\tMadera County\t3042\t48.8\t20.9\t11.9\t21895\t202640\t0.4018\t93601\tObama\t93601\t0.004840859\t93601.0\n1674\t-122.595169\t37.988128\tFairfax town\tCA\tCalifornia\tMarin County\t7528\t46.3\t53.0\t11.1\t48495\t624304\t0.7426\t94930\tObama\t94930\t0.011979613\t94930.0\n1675\t-122.523\t37.991101\tSan Rafael city\tCA\tCalifornia\tMarin County\t59203\t41.3\t47.2\t9.5\t44989\t674158\t0.7426\t94901\tObama\t94901\t0.094212146\t94901.0\n1676\t-122.51309199999999\t37.923635\tCorte Madera town\tCA\tCalifornia\tMarin County\t9448\t44.3\t67.7\t7.1\t56257\t784941\t0.7426\t94925\tObama\t94925\t0.015034987\t94925.0\n1677\t-122.558879\t38.089940999999996\tNovato city\tCA\tCalifornia\tMarin County\t51349\t42.3\t41.4\t9.2\t42598\t559763\t0.7426\t94945\tObama\t94945\t0.081713756\t94945.0\n1678\t-122.508781\t37.89505\tStrawberry CDP\tCA\tCalifornia\tMarin County\t5561\t44.3\t71.1\t8.0\t67403\t883602\t0.7426\t94925\tObama\t94925\t0.008849446\t94925.0\n1679\t-122.56087099999999\t37.948028\tKentfield CDP\tCA\tCalifornia\tMarin County\t6522\t46.2\t72.0\t9.3\t82968\t1000001\t0.7426\t94904\tObama\t94904\t0.010378724\t94904.0\n1680\t-122.57528300000001\t38.039998\tLucas Valley-Marinwood CDP\tCA\tCalifornia\tMarin County\t6684\t46.3\t62.6\t8.2\t48875\t655930\t0.7426\t94903\tObama\t94903\t0.010636521999999999\t94903.0\n1681\t-122.494075\t37.8575\tSausalito city\tCA\tCalifornia\tMarin County\t7561\t49.0\t74.4\t7.6\t104116\t821186\t0.7426\t94965\tObama\t94965\t0.012032127\t94965.0\n1682\t-122.66317\t38.006702000000004\tSan Geronimo CDP\tCA\tCalifornia\tMarin County\t463\t49.9\t55.6\t4.1\t38832\t641892\t0.7426\t94963\tObama\t94963\t0.0007367910000000001\t94963.0\n1683\t-122.53656399999998\t37.878301\tTamalpais-Homestead Valley CDP\tCA\tCalifornia\tMarin County\t10932\t47.0\t79.4\t6.5\t73775\t816287\t0.7426\t94941\tObama\t94941\t0.017396537\t94941.0\n1684\t-122.475852\t37.894473\tTiburon town\tCA\tCalifornia\tMarin County\t8808\t48.0\t72.1\t7.1\t90225\t1000001\t0.7426\t94920\tObama\t94920\t0.014016529\t94920.0\n1685\t-122.69791200000002\t37.905516\tBolinas CDP\tCA\tCalifornia\tMarin County\t1313\t46.1\t57.7\t6.0\t46288\t677802\t0.7426\t94924\tObama\t94924\t0.00208943\t94924.0\n1686\t-122.63844499999999\t38.005041\tWoodacre CDP\tCA\tCalifornia\tMarin County\t1487\t47.3\t54.2\t7.3\t47639\t626111\t0.7426\t94973\tObama\t94973\t0.002366324\t94973.0\n1687\t-122.542309\t37.908705\tMill Valley city\tCA\tCalifornia\tMarin County\t13955\t47.4\t74.3\t7.8\t77412\t879568\t0.7426\t94941\tObama\t94941\t0.02220716\t94941.0\n1688\t-122.905933\t38.247113\tTomales CDP\tCA\tCalifornia\tMarin County\t221\t47.9\t43.2\t7.0\t34347\t461111\t0.7426\t94971\tObama\t94971\t0.000351686\t94971.0\n1689\t-122.46631399999998\t37.873796999999996\tBelvedere city\tCA\tCalifornia\tMarin County\t2142\t52.5\t79.4\t8.8\t104953\t1000001\t0.7426\t94920\tObama\t94920\t0.0034086520000000003\t94920.0\n1690\t-122.80923200000001\t38.084624\tPoint Reyes Station CDP\tCA\tCalifornia\tMarin County\t853\t46.7\t47.4\t6.4\t52203\t698864\t0.7426\t94956\tObama\t94956\t0.001357414\t94956.0\n1691\t-122.532404\t37.939052000000004\tLarkspur city\tCA\tCalifornia\tMarin County\t12169\t50.0\t66.7\t7.1\t69608\t779153\t0.7426\t94939\tObama\t94939\t0.019365026\t94939.0\n1692\t-122.691321\t38.017949\tLagunitas-Forest Knolls CDP\tCA\tCalifornia\tMarin County\t2006\t45.7\t49.5\t6.6\t42534\t610825\t0.7426\t94938\tObama\t94938\t0.00319223\t94938.0\n1693\t-122.956296\t38.243427000000004\tDillon Beach CDP\tCA\tCalifornia\tMarin County\t357\t55.8\t50.2\t5.3\t39194\t556818\t0.7426\t94929\tObama\t94929\t0.000568109\t94929.0\n1694\t-122.56980800000001\t37.982292\tSan Anselmo town\tCA\tCalifornia\tMarin County\t12414\t45.6\t64.6\t9.6\t52516\t750381\t0.7426\t94960\tObama\t94960\t0.019754904\t94960.0\n1695\t-122.647177\t37.904081\tStinson Beach CDP\tCA\tCalifornia\tMarin County\t785\t49.6\t63.8\t7.3\t82786\t918561\t0.7426\t94970\tObama\t94970\t0.001249202\t94970.0\n1696\t-122.502633\t38.005292\tSanta Venetia CDP\tCA\tCalifornia\tMarin County\t4425\t45.3\t43.7\t10.3\t43094\t580623\t0.7426\t94901\tObama\t94901\t0.007041683000000001\t94901.0\n1697\t-122.512592\t38.111644\tBlack Point-Green Point CDP\tCA\tCalifornia\tMarin County\t1240\t49.1\t56.7\t5.9\t63775\t732595\t0.7426\t94945\tObama\t94945\t0.001973263\t94945.0\n1698\t-122.58929599999999\t37.865387\tMuir Beach CDP\tCA\tCalifornia\tMarin County\t306\t52.8\t91.3\t7.5\t74581\t946023\t0.7426\t94941\tObama\t94941\t0.00048695\t94941.0\n1699\t-122.847602\t38.082225\tInverness CDP\tCA\tCalifornia\tMarin County\t1582\t53.1\t70.9\t5.8\t47430\t697297\t0.7426\t94956\tObama\t94956\t0.002517501\t94956.0\n1700\t-122.561411\t37.963659\tRoss town\tCA\tCalifornia\tMarin County\t2501\t44.4\t78.1\t5.6\t68395\t1000001\t0.7426\t94960\tObama\t94960\t0.003979943\t94960.0\n1701\t-119.577828\t37.740677000000005\tYosemite Valley CDP\tCA\tCalifornia\tMariposa County\t276\t34.9\t32.8\t3.7\t26207\t162500\t0.3887\t95389\tObama\t95389\t0.00043921\t95389.0\n1702\t-119.965966\t37.485683\tMariposa CDP\tCA\tCalifornia\tMariposa County\t1476\t45.0\t22.3\t11.0\t24398\t188438\t0.3887\t95338\tObama\t95338\t0.002348819\t95338.0\n1703\t-119.88523400000001\t37.469096\tBootjack CDP\tCA\tCalifornia\tMariposa County\t1731\t50.0\t23.1\t9.6\t19986\t259709\t0.3887\t95338\tObama\t95338\t0.0027546109999999997\t95338.0\n1704\t-123.49374399999999\t39.672389\tLaytonville CDP\tCA\tCalifornia\tMendocino County\t1330\t41.3\t12.6\t18.5\t17561\t186500\t0.6623\t95454\tObama\t95454\t0.0021164829999999997\t95454.0\n1705\t-123.210862\t39.146966\tUkiah city\tCA\tCalifornia\tMendocino County\t15610\t35.8\t18.3\t10.2\t20575\t231266\t0.6623\t95482\tObama\t95482\t0.024840829\t95482.0\n1706\t-123.34968799999999\t39.404303999999996\tWillits city\tCA\tCalifornia\tMendocino County\t5070\t36.2\t14.3\t8.7\t18673\t195577\t0.6623\t95490\tObama\t95490\t0.008068098000000001\t95490.0\n1707\t-123.24997900000001\t39.802455\tCovelo CDP\tCA\tCalifornia\tMendocino County\t1149\t37.4\t13.2\t15.8\t17657\t126442\t0.6623\t95428\tObama\t95428\t0.001828451\t95428.0\n1708\t-123.80322\t39.441556\tFort Bragg city\tCA\tCalifornia\tMendocino County\t6331\t37.6\t16.0\t11.0\t20686\t262632\t0.6623\t95437\tObama\t95437\t0.010074778000000001\t95437.0\n1709\t-123.164975\t39.131344\tTalmage CDP\tCA\tCalifornia\tMendocino County\t1178\t31.8\t12.6\t11.9\t19859\t235938\t0.6623\t95481\tObama\t95481\t0.001874599\t95481.0\n1710\t-123.78966299999999\t39.311367\tMendocino CDP\tCA\tCalifornia\tMendocino County\t796\t53.4\t47.1\t6.2\t34324\t582071\t0.6623\t95460\tObama\t95460\t0.001266707\t95460.0\n1711\t-123.695631\t38.91245\tPoint Arena city\tCA\tCalifornia\tMendocino County\t485\t41.4\t25.5\t13.1\t20406\t329630\t0.6623\t95468\tObama\t95468\t0.0007718\t95468.0\n1712\t-120.325011\t37.289163\tPlanada CDP\tCA\tCalifornia\tMerced County\t5406\t26.8\t3.1\t30.9\t10916\t84657\t0.5318\t95365\tObama\t95365\t0.008602788\t95365.0\n1713\t-120.25686699999999\t37.217225\tLe Grand CDP\tCA\tCalifornia\tMerced County\t1962\t25.9\t8.0\t29.2\t11510\t86703\t0.5318\t95333\tObama\t95333\t0.0031222109999999997\t95333.0\n1714\t-120.635015\t36.985648\tDos Palos city\tCA\tCalifornia\tMerced County\t4987\t30.6\t5.4\t24.3\t14616\t91406\t0.5318\t93665\tObama\t93665\t0.007936016\t93665.0\n1715\t-120.599972\t37.354323\tAtwater city\tCA\tCalifornia\tMerced County\t26558\t29.6\t13.6\t18.5\t17100\t106674\t0.5318\t95301\tObama\t95301\t0.042262827999999995\t95301.0\n1716\t-120.99515500000001\t37.254517\tGustine city\tCA\tCalifornia\tMerced County\t5314\t35.2\t11.1\t14.8\t19855\t126726\t0.5318\t95360\tObama\t95360\t0.008456385\t95360.0\n1717\t-120.724231\t37.387732\tLivingston city\tCA\tCalifornia\tMerced County\t13315\t26.3\t7.4\t20.7\t11727\t97874\t0.5318\t95334\tObama\t95334\t0.021188702\t95334.0\n1718\t-120.61799599999999\t37.385931\tWinton CDP\tCA\tCalifornia\tMerced County\t10815\t26.3\t7.7\t25.4\t12398\t86977\t0.5318\t95388\tObama\t95388\t0.01721035\t95388.0\n1719\t-120.772581\t37.432122\tDelhi CDP\tCA\tCalifornia\tMerced County\t9845\t26.7\t7.8\t16.5\t15438\t110965\t0.5318\t95315\tObama\t95315\t0.01566675\t95315.0\n1720\t-120.64699099999999\t36.971090999999994\tSouth Dos Palos CDP\tCA\tCalifornia\tMerced County\t1614\t24.2\t1.2\t32.1\t8937\t82315\t0.5318\t93665\tObama\t93665\t0.002568424\t93665.0\n1721\t-120.838825\t37.063821000000004\tLos Banos city\tCA\tCalifornia\tMerced County\t35105\t29.6\t11.4\t19.0\t18215\t152553\t0.5318\t93635\tObama\t93635\t0.055864017\t93635.0\n1722\t-120.85046499999999\t37.404602000000004\tHilmar-Irwin CDP\tCA\tCalifornia\tMerced County\t5773\t34.9\t11.8\t13.8\t19020\t127817\t0.5318\t95324\tObama\t95324\t0.00918681\t95324.0\n1723\t-120.47842800000001\t37.301099\tMerced city\tCA\tCalifornia\tMerced County\t72560\t28.5\t17.0\t19.3\t16445\t116300\t0.5318\t95340\tObama\t95340\t0.115467684\t95340.0\n1724\t-120.548538\t41.489979999999996\tAlturas city\tCA\tCalifornia\tModoc County\t2907\t41.6\t13.7\t18.2\t20365\t129288\t0.2787\t96101\tObama\t96101\t0.004626028\t96101.0\n1725\t-118.991473\t37.627239\tMammoth Lakes town\tCA\tCalifornia\tMono County\t7246\t35.6\t37.8\t8.3\t33326\t407915\t0.5275\t93546\tObama\t93546\t0.011530855\t93546.0\n1726\t-121.921943\t36.553032\tCarmel-by-the-Sea city\tCA\tCalifornia\tMonterey County\t4028\t59.4\t57.8\t2.5\t58714\t854391\t0.6713\t93921\tObama\t93921\t0.006409921\t93921.0\n1727\t-121.636801\t36.684129999999996\tSalinas city\tCA\tCalifornia\tMonterey County\t155213\t28.2\t13.6\t11.8\t18163\t261107\t0.6713\t93905\tObama\t93905\t0.246996771\t93905.0\n1728\t-121.78731299999998\t36.801334000000004\tMoss Landing CDP\tCA\tCalifornia\tMonterey County\t308\t36.3\t24.9\t13.3\t31151\t285577\t0.6713\t95039\tObama\t95039\t0.000490133\t95039.0\n1729\t-121.51038600000001\t36.571053000000006\tChualar CDP\tCA\tCalifornia\tMonterey County\t1610\t24.7\t5.6\t19.9\t11606\t207328\t0.6713\t93925\tObama\t93925\t0.0025620589999999998\t93925.0\n1730\t-121.24508600000001\t36.322546\tGreenfield city\tCA\tCalifornia\tMonterey County\t13989\t25.9\t4.4\t13.5\t12183\t174855\t0.6713\t93927\tObama\t93927\t0.022261266000000002\t93927.0\n1731\t-121.646476\t36.624656\tSpreckels CDP\tCA\tCalifornia\tMonterey County\t529\t33.2\t17.1\t7.1\t22586\t353333\t0.6713\t93962\tObama\t93962\t0.0008418189999999999\t93962.0\n1732\t-121.818913\t36.622551\tSeaside city\tCA\tCalifornia\tMonterey County\t33824\t29.7\t19.4\t6.3\t19240\t322080\t0.6713\t93955\tObama\t93955\t0.053825509\t93955.0\n1733\t-121.126888\t36.212722\tKing City\tCA\tCalifornia\tMonterey County\t12329\t26.8\t9.1\t14.2\t14922\t177406\t0.6713\t93930\tObama\t93930\t0.01961964\t93930.0\n1734\t-121.719675\t36.482168\tCarmel Valley Village CDP\tCA\tCalifornia\tMonterey County\t4673\t51.3\t51.5\t4.6\t52132\t743687\t0.6713\t93924\tObama\t93924\t0.007436335\t93924.0\n1735\t-120.90727\t36.023675\tSan Ardo CDP\tCA\tCalifornia\tMonterey County\t498\t37.1\t12.2\t9.8\t20298\t197917\t0.6713\t93450\tObama\t93450\t0.000792488\t93450.0\n1736\t-121.43985900000001\t36.509422\tGonzales city\tCA\tCalifornia\tMonterey County\t7957\t26.6\t9.2\t15.4\t15958\t222039\t0.6713\t93926\tObama\t93926\t0.012662298\t93926.0\n1737\t-121.838439\t36.593035\tDel Rey Oaks city\tCA\tCalifornia\tMonterey County\t1628\t47.1\t36.9\t4.0\t33502\t428205\t0.6713\t93955\tObama\t93955\t0.0025907029999999998\t93955.0\n1738\t-121.021565\t36.12846\tSan Lucas CDP\tCA\tCalifornia\tMonterey County\t513\t25.3\t6.9\t15.4\t15087\t170833\t0.6713\t93930\tObama\t93930\t0.000816358\t93930.0\n1739\t-121.78911599999999\t36.680369\tMarina city\tCA\tCalifornia\tMonterey County\t19237\t36.2\t19.1\t6.3\t24665\t331164\t0.6713\t93933\tObama\t93933\t0.030612622000000003\t93933.0\n1740\t-121.943872\t36.585404\tDel Monte Forest CDP\tCA\tCalifornia\tMonterey County\t4394\t61.4\t64.0\t3.2\t68294\t910602\t0.6713\t93953\tObama\t93953\t0.006992351\t93953.0\n1741\t-121.674524\t36.694849\tBoronda CDP\tCA\tCalifornia\tMonterey County\t1356\t29.4\t17.2\t6.8\t23529\t234375\t0.6713\t93901\tObama\t93901\t0.002157858\t93901.0\n1742\t-121.741381\t36.901604\tPajaro CDP\tCA\tCalifornia\tMonterey County\t3521\t25.6\t4.3\t10.9\t14282\t232955\t0.6713\t95076\tObama\t95076\t0.005603111\t95076.0\n1743\t-120.80469\t35.862517\tBradley CDP\tCA\tCalifornia\tMonterey County\t119\t37.5\t11.8\t8.9\t20331\t193750\t0.6713\t93450\tObama\t93450\t0.00018937\t93450.0\n1744\t-121.847746\t36.618552\tSand City\tCA\tCalifornia\tMonterey County\t309\t37.7\t12.4\t7.3\t21361\t535714\t0.6713\t93955\tObama\t93955\t0.000491724\t93955.0\n1745\t-121.753019\t36.764509999999994\tCastroville CDP\tCA\tCalifornia\tMonterey County\t6941\t25.9\t3.4\t15.1\t12123\t230088\t0.6713\t95012\tObama\t95012\t0.011045496\t95012.0\n1746\t-121.730923\t36.869851000000004\tLas Lomas CDP\tCA\tCalifornia\tMonterey County\t3117\t28.1\t8.1\t15.4\t12962\t321552\t0.6713\t95076\tObama\t95076\t0.004960209\t95076.0\n1747\t-121.32188400000001\t36.428768\tSoledad city\tCA\tCalifornia\tMonterey County\t25512\t29.9\t16.5\t11.8\t17482\t211506\t0.6713\t93960\tObama\t93960\t0.040598285\t93960.0\n1748\t-121.721075\t36.810241999999995\tElkhorn CDP\tCA\tCalifornia\tMonterey County\t1656\t40.7\t19.9\t6.2\t27290\t395783\t0.6713\t95012\tObama\t95012\t0.00263526\t95012.0\n1749\t-121.92601100000002\t36.619028\tPacific Grove city\tCA\tCalifornia\tMonterey County\t15228\t48.1\t46.7\t4.5\t38944\t613819\t0.6713\t93950\tObama\t93950\t0.024232937000000003\t93950.0\n1750\t-121.655505\t36.806278999999996\tPrunedale CDP\tCA\tCalifornia\tMonterey County\t17001\t43.0\t24.1\t7.3\t30949\t411187\t0.6713\t93907\tObama\t93907\t0.027054384\t93907.0\n1751\t-121.882894\t36.592486\tMonterey city\tCA\tCalifornia\tMonterey County\t29959\t37.9\t49.0\t5.1\t35400\t584190\t0.6713\t93940\tObama\t93940\t0.047674977\t93940.0\n1752\t-122.467133\t38.504409\tSt. Helena city\tCA\tCalifornia\tNapa County\t6046\t41.6\t45.2\t10.4\t34820\t677857\t0.6297\t94574\tObama\t94574\t0.009621246\t94574.0\n1753\t-122.45064599999999\t38.577355\tAngwin CDP\tCA\tCalifornia\tNapa County\t3302\t26.9\t50.6\t7.9\t30070\t410000\t0.6297\t94508\tObama\t94508\t0.005254607\t94508.0\n1754\t-122.468034\t38.536305\tDeer Park CDP\tCA\tCalifornia\tNapa County\t1505\t45.7\t48.9\t6.0\t47163\t678947\t0.6297\t94576\tObama\t94576\t0.002394968\t94576.0\n1755\t-122.256266\t38.173725\tAmerican Canyon city\tCA\tCalifornia\tNapa County\t14888\t41.3\t20.8\t11.9\t25296\t240700\t0.6297\t94589\tObama\t94589\t0.023691881\t94589.0\n1756\t-122.581341\t38.581790999999996\tCalistoga city\tCA\tCalifornia\tNapa County\t5335\t39.4\t24.9\t9.3\t25417\t364354\t0.6297\t94515\tObama\t94515\t0.008489803\t94515.0\n1757\t-122.366358\t38.39649\tYountville town\tCA\tCalifornia\tNapa County\t3419\t59.3\t34.4\t8.5\t33305\t380137\t0.6297\t94599\tObama\t94599\t0.0054407940000000005\t94599.0\n1758\t-122.301019\t38.297861\tNapa city\tCA\tCalifornia\tNapa County\t78037\t37.9\t27.2\t10.7\t30576\t366137\t0.6297\t94559\tObama\t94559\t0.12418345800000001\t94559.0\n1759\t-120.185336\t39.345167\tTruckee town\tCA\tCalifornia\tNevada County\t15870\t38.4\t36.3\t10.4\t34124\t404262\t0.4773\t96161\tObama\t96161\t0.025254578\t96161.0\n1760\t-121.05242700000001\t39.12368\tAlta Sierra CDP\tCA\tCalifornia\tNevada County\t6898\t52.1\t28.7\t10.4\t35748\t338119\t0.4773\t95949\tObama\t95949\t0.010977068000000001\t95949.0\n1761\t-121.20016899999999\t39.234916\tLake Wildwood CDP\tCA\tCalifornia\tNevada County\t4970\t60.3\t43.7\t11.6\t40400\t389029\t0.4773\t95946\tObama\t95946\t0.007908964000000001\t95946.0\n1762\t-121.057478\t39.221337\tGrass Valley city\tCA\tCalifornia\tNevada County\t11686\t42.0\t20.6\t11.4\t22958\t243178\t0.4773\t95945\tObama\t95945\t0.018596408000000002\t95945.0\n1763\t-121.064251\t39.037847\tLake of the Pines CDP\tCA\tCalifornia\tNevada County\t3969\t53.6\t32.6\t10.9\t33248\t389415\t0.4773\t95722\tObama\t95722\t0.006316031\t95722.0\n1764\t-121.19417800000001\t39.195325\tPenn Valley CDP\tCA\tCalifornia\tNevada County\t1532\t43.3\t12.6\t14.7\t21001\t265138\t0.4773\t95946\tObama\t95946\t0.002437934\t95946.0\n1765\t-121.022028\t39.258794\tNevada City\tCA\tCalifornia\tNevada County\t3054\t46.5\t38.9\t14.5\t27838\t359477\t0.4773\t95945\tObama\t95945\t0.004859955\t95945.0\n1766\t-117.810406\t33.817987\tVilla Park city\tCA\tCalifornia\tOrange County\t6082\t48.0\t62.7\t8.5\t62088\t896808\t0.4565\t92861\tObama\t92861\t0.009678534\t92861.0\n1767\t-117.885869\t33.623172\tNewport Beach city\tCA\tCalifornia\tOrange County\t73625\t44.1\t63.8\t9.0\t76374\t945810\t0.4565\t92660\tObama\t92660\t0.117162462\t92660.0\n1768\t-117.85541299999998\t33.880699\tPlacentia city\tCA\tCalifornia\tOrange County\t49209\t35.6\t36.6\t10.6\t30507\t461843\t0.4565\t92870\tObama\t92870\t0.078308287\t92870.0\n1769\t-117.99386000000001\t33.752268\tWestminster city\tCA\tCalifornia\tOrange County\t90315\t36.1\t21.7\t11.9\t22332\t387632\t0.4565\t92683\tObama\t92683\t0.143721939\t92683.0\n1770\t-117.62371499999999\t33.58307\tLas Flores CDP\tCA\tCalifornia\tOrange County\t5779\t31.0\t59.7\t8.3\t49417\t632700\t0.4565\t92694\tObama\t92694\t0.009196358\t92694.0\n1771\t-117.79431899999999\t33.764417\tTustin Foothills CDP\tCA\tCalifornia\tOrange County\t24322\t44.8\t58.8\t8.9\t52145\t717776\t0.4565\t92705\tObama\t92705\t0.03870459\t92705.0\n1772\t-117.927419\t33.883919\tFullerton city\tCA\tCalifornia\tOrange County\t133441\t34.7\t35.9\t12.0\t30151\t419015\t0.4565\t92832\tObama\t92832\t0.2123501\t92832.0\n1773\t-117.913453\t33.666897999999996\tCosta Mesa city\tCA\tCalifornia\tOrange County\t113372\t33.8\t33.7\t11.0\t29579\t475105\t0.4565\t92626\tObama\t92626\t0.180413483\t92626.0\n1774\t-117.696401\t33.473228999999996\tDana Point city\tCA\tCalifornia\tOrange County\t35561\t43.2\t45.6\t10.4\t47982\t626488\t0.4565\t92629\tObama\t92629\t0.056589667999999996\t92629.0\n1775\t-117.88188999999998\t33.736788\tSanta Ana city\tCA\tCalifornia\tOrange County\t357246\t27.2\t11.7\t14.9\t14992\t310131\t0.4565\t92707\tObama\t92707\t0.568500116\t92707.0\n1776\t-117.655731\t33.692007000000004\tFoothill Ranch CDP\tCA\tCalifornia\tOrange County\t10768\t33.4\t55.6\t7.4\t45009\t583206\t0.4565\t92610\tObama\t92610\t0.017135557\t92610.0\n1777\t-117.99336299999999\t33.800193\tStanton city\tCA\tCalifornia\tOrange County\t40246\t30.4\t14.7\t15.1\t18312\t269820\t0.4565\t90680\tObama\t90680\t0.06404510000000001\t90680.0\n1778\t-117.63193700000001\t33.68477\tPortola Hills CDP\tCA\tCalifornia\tOrange County\t6462\t35.0\t50.9\t8.6\t42872\t460269\t0.4565\t92610\tObama\t92610\t0.010283244\t92610.0\n1779\t-118.059265\t33.797236\tLos Alamitos city\tCA\tCalifornia\tOrange County\t11714\t39.0\t35.4\t8.6\t33370\t519444\t0.4565\t90720\tObama\t90720\t0.018640965\t90720.0\n1780\t-117.792171\t33.666242\tIrvine city\tCA\tCalifornia\tOrange County\t193572\t35.2\t61.9\t9.8\t45109\t568313\t0.4565\t92604\tObama\t92604\t0.30803901100000003\t92604.0\n1781\t-117.83629099999999\t33.614528\tSan Joaquin Hills CDP\tCA\tCalifornia\tOrange County\t3680\t40.2\t77.2\t9.7\t83993\t987634\t0.4565\t92657\tObama\t92657\t0.005856134\t92657.0\n1782\t-117.654677\t33.610359\tMission Viejo city\tCA\tCalifornia\tOrange County\t96240\t40.7\t46.2\t9.3\t40804\t530831\t0.4565\t92691\tObama\t92691\t0.153150633\t92691.0\n1783\t-117.951307\t33.927555\tLa Habra city\tCA\tCalifornia\tOrange County\t61567\t32.7\t22.6\t11.6\t24662\t354538\t0.4565\t90631\tObama\t90631\t0.097974076\t90631.0\n1784\t-117.81080800000001\t33.730917\tTustin city\tCA\tCalifornia\tOrange County\t74467\t32.9\t37.1\t11.0\t32204\t437528\t0.4565\t92780\tObama\t92780\t0.118502371\t92780.0\n1785\t-117.65446100000001\t33.500733000000004\tSan Juan Capistrano city\tCA\tCalifornia\tOrange County\t35836\t38.3\t34.2\t10.0\t36506\t435000\t0.4565\t92675\tObama\t92675\t0.057027287\t92675.0\n1786\t-118.040779\t33.850371\tLa Palma city\tCA\tCalifornia\tOrange County\t15806\t40.9\t42.6\t11.4\t32214\t517398\t0.4565\t90623\tObama\t90623\t0.025152732\t90623.0\n1787\t-118.004594\t33.857233\tBuena Park city\tCA\tCalifornia\tOrange County\t81645\t32.7\t23.3\t12.7\t22906\t357859\t0.4565\t90620\tObama\t90620\t0.129925015\t90620.0\n1788\t-117.73331499999999\t33.567822\tAliso Viejo CDP\tCA\tCalifornia\tOrange County\t45304\t34.3\t53.2\t7.9\t46864\t455101\t0.4565\t92656\tObama\t92656\t0.072094101\t92656.0\n1789\t-118.08036200000001\t33.788691\tRossmoor CDP\tCA\tCalifornia\tOrange County\t10343\t46.9\t55.0\t8.7\t46148\t694687\t0.4565\t90720\tObama\t90720\t0.016459236999999998\t90720.0\n1790\t-117.76121599999999\t33.545029\tLaguna Beach city\tCA\tCalifornia\tOrange County\t23899\t47.9\t61.2\t9.0\t70040\t912291\t0.4565\t92651\tObama\t92651\t0.038031452\t92651.0\n1791\t-117.92278\t33.838879999999996\tAnaheim city\tCA\tCalifornia\tOrange County\t349812\t31.2\t23.4\t12.7\t23283\t373003\t0.4565\t92805\tObama\t92805\t0.556670089\t92805.0\n1792\t-117.771403\t33.88933\tYorba Linda city\tCA\tCalifornia\tOrange County\t65324\t40.5\t46.5\t8.9\t44282\t607448\t0.4565\t92886\tObama\t92886\t0.10395274300000001\t92886.0\n1793\t-118.038551\t33.817088\tCypress city\tCA\tCalifornia\tOrange County\t47080\t39.6\t35.3\t11.4\t32090\t438010\t0.4565\t90630\tObama\t90630\t0.074920322\t90630.0\n1794\t-117.67959099999999\t33.651244\tLake Forest city\tCA\tCalifornia\tOrange County\t59823\t37.6\t39.1\t9.6\t34854\t461726\t0.4565\t92630\tObama\t92630\t0.095198777\t92630.0\n1795\t-117.585825\t33.596468\tCoto de Caza CDP\tCA\tCalifornia\tOrange County\t15002\t35.3\t63.5\t6.8\t68534\t846956\t0.4565\t92679\tObama\t92679\t0.023873294\t92679.0\n1796\t-118.00161899999999\t33.695206\tHuntington Beach city\tCA\tCalifornia\tOrange County\t196294\t38.9\t40.9\t10.2\t40195\t543720\t0.4565\t92648\tObama\t92648\t0.31237064\t92648.0\n1797\t-117.59745\t33.632124\tRancho Santa Margarita city\tCA\tCalifornia\tOrange County\t49988\t32.8\t49.0\t8.7\t40593\t489614\t0.4565\t92688\tObama\t92688\t0.079547941\t92688.0\n1798\t-117.825243\t33.805089\tOrange city\tCA\tCalifornia\tOrange County\t136879\t34.9\t32.6\t10.8\t31137\t451374\t0.4565\t92867\tObama\t92867\t0.21782113\t92867.0\n1799\t-117.705316\t33.527627\tLaguna Niguel city\tCA\tCalifornia\tOrange County\t64817\t40.5\t53.4\t9.8\t48429\t622919\t0.4565\t92677\tObama\t92677\t0.10314593300000001\t92677.0\n1800\t-117.61162900000001\t33.448704\tSan Clemente city\tCA\tCalifornia\tOrange County\t60477\t40.0\t42.4\t9.8\t44808\t639262\t0.4565\t92673\tObama\t92673\t0.096239514\t92673.0\n1801\t-117.72774\t33.608969\tLaguna Woods city\tCA\tCalifornia\tOrange County\t18545\t76.3\t33.2\t11.8\t42163\t194844\t0.4565\t92653\tObama\t92653\t0.029511414\t92653.0\n1802\t-117.959998\t33.778742\tGarden Grove city\tCA\tCalifornia\tOrange County\t173986\t33.3\t18.5\t13.3\t20360\t351672\t0.4565\t92844\tObama\t92844\t0.276871011\t92844.0\n1803\t-118.071573\t33.754331\tSeal Beach city\tCA\tCalifornia\tOrange County\t24379\t56.3\t42.3\t9.7\t44984\t254235\t0.4565\t90740\tObama\t90740\t0.038795296\t90740.0\n1804\t-117.82946299999999\t33.592363\tNewport Coast CDP\tCA\tCalifornia\tOrange County\t5443\t44.0\t73.2\t6.9\t95948\t1000001\t0.4565\t92657\tObama\t92657\t0.008661668\t92657.0\n1805\t-117.698824\t33.591969\tLaguna Hills city\tCA\tCalifornia\tOrange County\t31158\t40.0\t45.7\t10.7\t41960\t573469\t0.4565\t92653\tObama\t92653\t0.049582995\t92653.0\n1806\t-117.951326\t33.710464\tFountain Valley city\tCA\tCalifornia\tOrange County\t57285\t40.8\t39.1\t10.3\t33172\t527139\t0.4565\t92708\tObama\t92708\t0.091159955\t92708.0\n1807\t-117.86756899999999\t33.924126\tBrea city\tCA\tCalifornia\tOrange County\t38995\t38.9\t38.3\t9.2\t33685\t451434\t0.4565\t92821\tObama\t92821\t0.062054332000000004\t92821.0\n1808\t-121.030744\t39.002771\tMeadow Vista CDP\tCA\tCalifornia\tPlacer County\t3535\t47.4\t36.6\t13.9\t36014\t339918\t0.39\t95722\tObama\t95722\t0.00562539\t95722.0\n1809\t-121.076779\t38.891277\tAuburn city\tCA\tCalifornia\tPlacer County\t12414\t44.5\t29.0\t13.3\t32030\t308981\t0.39\t95603\tObama\t95603\t0.019754904\t95603.0\n1810\t-121.170179\t38.759966\tGranite Bay CDP\tCA\tCalifornia\tPlacer County\t20508\t43.1\t52.9\t10.5\t55881\t626849\t0.39\t95746\tObama\t95746\t0.032635216\t95746.0\n1811\t-121.24538799999999\t38.804539\tRocklin city\tCA\tCalifornia\tPlacer County\t51478\t35.0\t39.0\t10.7\t36958\t309305\t0.39\t95677\tObama\t95677\t0.081919039\t95677.0\n1812\t-120.108632\t39.190326\tDollar Point CDP\tCA\tCalifornia\tPlacer County\t1974\t45.1\t51.3\t12.6\t44550\t651685\t0.39\t96145\tObama\t96145\t0.0031413070000000003\t96145.0\n1813\t-121.201507\t38.809732000000004\tLoomis town\tCA\tCalifornia\tPlacer County\t6605\t42.9\t23.3\t10.5\t33785\t260931\t0.39\t95650\tObama\t95650\t0.010510806000000001\t95650.0\n1814\t-120.16150800000001\t39.150331\tSunnyside-Tahoe City CDP\tCA\tCalifornia\tPlacer County\t2267\t39.5\t49.5\t12.2\t49617\t554113\t0.39\t96145\tObama\t96145\t0.003607569\t96145.0\n1815\t-120.95441699999999\t39.093725\tColfax city\tCA\tCalifornia\tPlacer County\t2003\t45.3\t24.0\t13.1\t26967\t284921\t0.39\t95713\tObama\t95713\t0.003187456\t95713.0\n1816\t-120.020091\t39.248633\tKings Beach CDP\tCA\tCalifornia\tPlacer County\t5563\t30.7\t20.0\t12.8\t20164\t280278\t0.39\t96143\tObama\t96143\t0.008852629\t96143.0\n1817\t-120.831166\t39.00547\tForesthill CDP\tCA\tCalifornia\tPlacer County\t2203\t41.7\t15.2\t16.5\t24217\t231211\t0.39\t95631\tObama\t95631\t0.0035057240000000004\t95631.0\n1818\t-120.05338799999998\t39.248382\tTahoe Vista CDP\tCA\tCalifornia\tPlacer County\t2279\t38.9\t31.5\t16.6\t34929\t360556\t0.39\t96148\tObama\t96148\t0.0036266659999999997\t96148.0\n1819\t-121.292399\t38.875455\tLincoln city\tCA\tCalifornia\tPlacer County\t43341\t34.5\t29.1\t11.3\t36385\t276617\t0.39\t95648\tObama\t95648\t0.068970299\t95648.0\n1820\t-121.290906\t38.761246\tRoseville city\tCA\tCalifornia\tPlacer County\t114129\t36.5\t36.5\t11.3\t35742\t293913\t0.39\t95678\tObama\t95678\t0.18161812800000002\t95678.0\n1821\t-121.082006\t38.930685\tNorth Auburn CDP\tCA\tCalifornia\tPlacer County\t11972\t44.5\t23.2\t14.5\t26063\t231361\t0.39\t95603\tObama\t95603\t0.019051531\t95603.0\n1822\t-120.577573\t39.762351\tC-Road CDP\tCA\tCalifornia\tPlumas County\t143\t61.2\t28.1\t11.9\t35654\t280000\t0.4007\t96106\tObama\t96106\t0.000227562\t96106.0\n1823\t-121.20211699999999\t40.233592\tLake Almanor West CDP\tCA\tCalifornia\tPlumas County\t304\t61.7\t23.7\t9.5\t33415\t363636\t0.4007\t96020\tObama\t96020\t0.00048376800000000003\t96020.0\n1824\t-120.55946999999999\t39.745698\tValley Ranch CDP\tCA\tCalifornia\tPlumas County\t87\t61.1\t28.6\t11.1\t35442\t282143\t0.4007\t96106\tObama\t96106\t0.000138447\t96106.0\n1825\t-120.690382\t39.868435\tCromberg CDP\tCA\tCalifornia\tPlumas County\t275\t45.7\t22.9\t10.5\t32049\t229688\t0.4007\t96103\tObama\t96103\t0.00043761900000000004\t96103.0\n1826\t-120.588392\t39.804854\tMohawk Vista CDP\tCA\tCalifornia\tPlumas County\t114\t61.5\t28.2\t12.5\t35620\t280556\t0.4007\t96103\tObama\t96103\t0.000181413\t96103.0\n1827\t-121.12788799999998\t40.279621\tLake Almanor Peninsula CDP\tCA\tCalifornia\tPlumas County\t319\t62.8\t27.6\t18.2\t29039\t317391\t0.4007\t96137\tObama\t96137\t0.000507638\t96137.0\n1828\t-121.041803\t40.035035\tTwain CDP\tCA\tCalifornia\tPlumas County\t82\t46.7\t11.5\t16.3\t22940\t137500\t0.4007\t95984\tObama\t95984\t0.00013049\t95984.0\n1829\t-120.138834\t39.806756\tChilcoot-Vinton CDP\tCA\tCalifornia\tPlumas County\t380\t46.0\t11.2\t10.8\t26928\t255000\t0.4007\t96105\tObama\t96105\t0.000604709\t96105.0\n1830\t-120.921776\t40.100685999999996\tCrescent Mills CDP\tCA\tCalifornia\tPlumas County\t243\t46.5\t11.0\t16.9\t22960\t134615\t0.4007\t95934\tObama\t95934\t0.000386696\t95934.0\n1831\t-121.07585700000001\t40.240466\tEast Shore CDP\tCA\tCalifornia\tPlumas County\t164\t61.5\t23.6\t10.0\t33322\t372727\t0.4007\t96137\tObama\t96137\t0.00026098\t96137.0\n1832\t-120.95846100000001\t39.725821\tLittle Grass Valley CDP\tCA\tCalifornia\tPlumas County\t0\t0.0\t0.0\t0.0\t0\t0\t0.4007\t95981\tObama\t95981\t0.0\t95981.0\n1833\t-120.550127\t39.724311\tWhitehawk CDP\tCA\tCalifornia\tPlumas County\t90\t61.6\t28.0\t10.8\t35744\t278125\t0.4007\t96106\tObama\t96106\t0.00014322100000000002\t96106.0\n1834\t-120.46481499999999\t39.855352\tLake Davis CDP\tCA\tCalifornia\tPlumas County\t23\t42.5\t12.5\t9.1\t26445\t350000\t0.4007\t96122\tObama\t96122\t3.66e-05\t96122.0\n1835\t-121.295899\t39.936019\tTobin CDP\tCA\tCalifornia\tPlumas County\t10\t51.3\t0.0\t16.7\t23804\t137500\t0.4007\t959XX\tObama\t959XX\t1.59e-05\t0.0\n1836\t-120.75898899999999\t39.902902000000005\tGreenhorn CDP\tCA\tCalifornia\tPlumas County\t139\t46.0\t23.3\t10.5\t31922\t231250\t0.4007\t95983\tObama\t95983\t0.00022119599999999997\t95983.0\n1837\t-120.838867\t40.058374\tTaylorsville CDP\tCA\tCalifornia\tPlumas County\t145\t46.6\t10.4\t16.9\t22969\t137500\t0.4007\t95983\tObama\t95983\t0.000230744\t95983.0\n1838\t-121.09576299999999\t40.277190999999995\tHamilton Branch CDP\tCA\tCalifornia\tPlumas County\t543\t61.7\t23.7\t9.5\t33374\t363636\t0.4007\t96137\tObama\t96137\t0.000864098\t96137.0\n1839\t-121.31941499999999\t39.9197\tStorrie CDP\tCA\tCalifornia\tPlumas County\t5\t0.0\t0.0\t0.0\t21675\t0\t0.4007\t959XX\tObama\t959XX\t7.96e-06\t0.0\n1840\t-120.98037099999999\t40.058599\tIndian Falls CDP\tCA\tCalifornia\tPlumas County\t35\t43.3\t11.5\t16.7\t22836\t137500\t0.4007\t95934\tObama\t95934\t5.5700000000000005e-05\t95934.0\n1841\t-120.91871599999999\t39.916579999999996\tEast Quincy CDP\tCA\tCalifornia\tPlumas County\t2292\t40.5\t18.5\t10.5\t25316\t176531\t0.4007\t95971\tObama\t95971\t0.003647353\t95971.0\n1842\t-121.147024\t40.257709000000006\tLake Almanor Country Club CDP\tCA\tCalifornia\tPlumas County\t804\t63.2\t27.8\t18.1\t29047\t317241\t0.4007\t95923\tObama\t95923\t0.001279438\t95923.0\n1843\t-120.46968500000001\t39.804573\tPortola city\tCA\tCalifornia\tPlumas County\t2338\t42.3\t12.6\t10.8\t19795\t164511\t0.4007\t96122\tObama\t96122\t0.003720555\t96122.0\n1844\t-120.793208\t39.903644\tSpring Garden CDP\tCA\tCalifornia\tPlumas County\t52\t45.8\t23.1\t10.3\t32154\t241667\t0.4007\t95983\tObama\t95983\t8.27e-05\t95983.0\n1845\t-120.610735\t39.775201\tBlairsden CDP\tCA\tCalifornia\tPlumas County\t47\t60.9\t28.6\t10.5\t35644\t287500\t0.4007\t96103\tObama\t96103\t7.48e-05\t96103.0\n1846\t-120.590097\t39.748573\tClio CDP\tCA\tCalifornia\tPlumas County\t85\t61.3\t28.9\t11.4\t35490\t283333\t0.4007\t96106\tObama\t96106\t0.00013526399999999998\t96106.0\n1847\t-121.003173\t40.033479\tPaxton CDP\tCA\tCalifornia\tPlumas County\t20\t46.3\t13.3\t18.2\t22739\t150000\t0.4007\t95984\tObama\t95984\t3.18e-05\t95984.0\n1848\t-120.95479099999999\t39.931031\tQuincy CDP\tCA\tCalifornia\tPlumas County\t1756\t44.2\t23.1\t11.0\t22169\t197667\t0.4007\t95971\tObama\t95971\t0.0027943940000000004\t95971.0\n1849\t-120.952897\t40.005871\tKeddie CDP\tCA\tCalifornia\tPlumas County\t91\t45.7\t23.5\t10.0\t32054\t225000\t0.4007\t95971\tObama\t95971\t0.000144812\t95971.0\n1850\t-121.083083\t39.932239\tMeadow Valley CDP\tCA\tCalifornia\tPlumas County\t525\t49.5\t16.9\t18.2\t24247\t212963\t0.4007\t95956\tObama\t95956\t0.0008354539999999999\t95956.0\n1851\t-120.64863799999999\t39.757132\tGraeagle CDP\tCA\tCalifornia\tPlumas County\t784\t61.4\t28.3\t11.7\t35544\t278906\t0.4007\t96103\tObama\t96103\t0.001247611\t96103.0\n1852\t-121.25896599999999\t40.003988\tBelden CDP\tCA\tCalifornia\tPlumas County\t25\t45.0\t11.1\t15.4\t22526\t150000\t0.4007\t95984\tObama\t95984\t3.98e-05\t95984.0\n1853\t-121.16249199999999\t40.076190000000004\tCaribou CDP\tCA\tCalifornia\tPlumas County\t0\t0.0\t0.0\t0.0\t0\t0\t0.4007\t95984\tObama\t95984\t0.0\t95984.0\n1854\t-120.66448100000001\t39.798131\tPlumas Eureka CDP\tCA\tCalifornia\tPlumas County\t302\t61.4\t28.5\t12.0\t35534\t276923\t0.4007\t96103\tObama\t96103\t0.000480585\t96103.0\n1855\t-120.985308\t39.672540000000005\tLa Porte CDP\tCA\tCalifornia\tPlumas County\t39\t46.3\t19.4\t18.2\t24414\t216667\t0.4007\t95981\tObama\t95981\t6.21e-05\t95981.0\n1856\t-121.157424\t40.206027\tPrattville CDP\tCA\tCalifornia\tPlumas County\t26\t64.4\t25.0\t8.3\t33290\t400000\t0.4007\t95923\tObama\t95923\t4.14e-05\t95923.0\n1857\t-121.17621100000001\t40.214515000000006\tAlmanor CDP\tCA\tCalifornia\tPlumas County\t0\t0.0\t0.0\t0.0\t0\t0\t0.4007\t95923\tObama\t95923\t0.0\t95923.0\n1858\t-120.71291299999999\t39.766295\tJohnsville CDP\tCA\tCalifornia\tPlumas County\t20\t64.4\t27.8\t12.5\t35205\t287500\t0.4007\t96103\tObama\t96103\t3.18e-05\t96103.0\n1859\t-120.945378\t40.133471\tGreenville CDP\tCA\tCalifornia\tPlumas County\t1054\t46.1\t12.9\t13.0\t16948\t116786\t0.4007\t95934\tObama\t95934\t0.001677273\t95934.0\n1860\t-120.41105900000001\t39.848599\tBeckwourth CDP\tCA\tCalifornia\tPlumas County\t336\t45.9\t11.4\t10.9\t26909\t256250\t0.4007\t96122\tObama\t96122\t0.00053469\t96122.0\n1861\t-120.485157\t39.778766\tIron Horse CDP\tCA\tCalifornia\tPlumas County\t330\t42.9\t16.1\t11.9\t19833\t153750\t0.4007\t96122\tObama\t96122\t0.0005251419999999999\t96122.0\n1862\t-121.07666\t40.169975\tCanyondam CDP\tCA\tCalifornia\tPlumas County\t34\t62.5\t25.8\t11.8\t33552\t350000\t0.4007\t95923\tObama\t95923\t5.41e-05\t95923.0\n1863\t-121.210572\t39.87979\tBucks Lake CDP\tCA\tCalifornia\tPlumas County\t16\t51.3\t15.4\t22.2\t23520\t225000\t0.4007\t959XX\tObama\t959XX\t2.55e-05\t0.0\n1864\t-121.234187\t40.301557\tChester CDP\tCA\tCalifornia\tPlumas County\t2181\t45.5\t14.8\t8.3\t22276\t198764\t0.4007\t96020\tObama\t96020\t0.003470714\t96020.0\n1865\t-120.497105\t39.810336\tDelleker CDP\tCA\tCalifornia\tPlumas County\t654\t41.4\t10.6\t10.7\t20627\t129464\t0.4007\t96122\tObama\t96122\t0.001040737\t96122.0\n1866\t-117.13750700000001\t33.806371\tNuevo CDP\tCA\tCalifornia\tRiverside County\t5022\t36.8\t10.9\t17.8\t19739\t182071\t0.4971\t92567\tObama\t92567\t0.007991713000000001\t92567.0\n1867\t-117.12801699999999\t33.505226\tTemecula city\tCA\tCalifornia\tRiverside County\t92030\t31.8\t29.5\t13.0\t25591\t266779\t0.4971\t92591\tObama\t92591\t0.146451089\t92591.0\n1868\t-117.123327\t33.828439\tLakeview CDP\tCA\tCalifornia\tRiverside County\t1902\t36.1\t14.5\t15.5\t18326\t176899\t0.4971\t92567\tObama\t92567\t0.00302673\t92567.0\n1869\t-117.32624299999999\t34.01398\tHighgrove CDP\tCA\tCalifornia\tRiverside County\t3643\t28.9\t15.2\t21.3\t16824\t177469\t0.4971\t92313\tObama\t92313\t0.005797254\t92313.0\n1870\t-116.286543\t33.7426\tBermuda Dunes CDP\tCA\tCalifornia\tRiverside County\t9788\t45.4\t35.4\t11.7\t34665\t298007\t0.4971\t92211\tObama\t92211\t0.015576043000000001\t92211.0\n1871\t-117.223207\t33.789654\tPerris city\tCA\tCalifornia\tRiverside County\t61779\t27.6\t11.3\t19.7\t15022\t142671\t0.4971\t92571\tObama\t92571\t0.09831144\t92571.0\n1872\t-116.77606899999999\t33.909895\tCabazon CDP\tCA\tCalifornia\tRiverside County\t2863\t33.8\t6.9\t26.7\t13680\t76923\t0.4971\t92230\tObama\t92230\t0.004556009000000001\t92230.0\n1873\t-116.550474\t33.966822\tDesert Hot Springs city\tCA\tCalifornia\tRiverside County\t24590\t31.7\t10.9\t21.9\t14877\t109965\t0.4971\t92240\tObama\t92240\t0.039131069\t92240.0\n1874\t-116.93926\t33.736531\tEast Hemet CDP\tCA\tCalifornia\tRiverside County\t15977\t33.1\t14.7\t20.2\t18990\t144776\t0.4971\t92543\tObama\t92543\t0.025424851000000002\t92543.0\n1875\t-117.361298\t33.88325\tWoodcrest CDP\tCA\tCalifornia\tRiverside County\t13180\t42.9\t24.8\t11.3\t30693\t316196\t0.4971\t92508\tObama\t92508\t0.020973871\t92508.0\n1876\t-116.341348\t33.703291\tIndian Wells city\tCA\tCalifornia\tRiverside County\t4687\t60.1\t42.5\t10.6\t63886\t457101\t0.4971\t92210\tObama\t92210\t0.0074586140000000006\t92210.0\n1877\t-117.108775\t33.744745\tHomeland CDP\tCA\tCalifornia\tRiverside County\t4090\t49.7\t6.9\t26.6\t15103\t74209\t0.4971\t92548\tObama\t92548\t0.006508584\t92548.0\n1878\t-117.252949\t33.610440999999994\tWildomar CDP\tCA\tCalifornia\tRiverside County\t21532\t37.7\t16.1\t14.2\t23485\t200944\t0.4971\t92595\tObama\t92595\t0.034264749\t92595.0\n1879\t-116.15812\t33.68122\tCoachella city\tCA\tCalifornia\tRiverside County\t38892\t26.7\t9.1\t20.4\t10831\t124441\t0.4971\t92236\tObama\t92236\t0.061890424000000006\t92236.0\n1880\t-116.073219\t33.577409\tMecca CDP\tCA\tCalifornia\tRiverside County\t7636\t24.7\t9.0\t26.9\t9005\t107199\t0.4971\t92254\tObama\t92254\t0.012151478\t92254.0\n1881\t-117.198397\t33.571943\tMurrieta city\tCA\tCalifornia\tRiverside County\t76967\t36.4\t25.9\t12.5\t27255\t263829\t0.4971\t92563\tObama\t92563\t0.12248072300000001\t92563.0\n1882\t-116.89932900000001\t33.946090999999996\tBanning city\tCA\tCalifornia\tRiverside County\t29452\t44.6\t15.5\t21.0\t18868\t147256\t0.4971\t92220\tObama\t92220\t0.046868167999999995\t92220.0\n1883\t-117.347154\t33.638659000000004\tLakeland Village CDP\tCA\tCalifornia\tRiverside County\t6286\t32.7\t10.3\t24.1\t18151\t158199\t0.4971\t92530\tObama\t92530\t0.010003168\t92530.0\n1884\t-117.5142\t33.879851\tHome Gardens CDP\tCA\tCalifornia\tRiverside County\t10209\t29.2\t11.4\t20.6\t15632\t170047\t0.4971\t92879\tObama\t92879\t0.016245998\t92879.0\n1885\t-117.488731\t34.017592\tGlen Avon CDP\tCA\tCalifornia\tRiverside County\t17375\t31.2\t7.5\t21.0\t16617\t171913\t0.4971\t92337\tObama\t92337\t0.027649545\t92337.0\n1886\t-116.895692\t33.751814\tValle Vista CDP\tCA\tCalifornia\tRiverside County\t12257\t46.8\t14.8\t21.0\t21430\t118139\t0.4971\t92544\tObama\t92544\t0.019505064\t92544.0\n1887\t-117.56325700000001\t33.864461999999996\tCorona city\tCA\tCalifornia\tRiverside County\t154471\t30.4\t26.2\t15.7\t25268\t271483\t0.4971\t92879\tObama\t92879\t0.245815996\t92879.0\n1888\t-117.171416\t33.744847\tRomoland CDP\tCA\tCalifornia\tRiverside County\t3923\t42.3\t12.1\t21.3\t17563\t176840\t0.4971\t92585\tObama\t92585\t0.00624283\t92585.0\n1889\t-117.47157299999999\t33.980995\tPedley CDP\tCA\tCalifornia\tRiverside County\t12168\t33.1\t12.0\t16.1\t22656\t210798\t0.4971\t92509\tObama\t92509\t0.019363434\t92509.0\n1890\t-116.283533\t33.656726\tLa Quinta city\tCA\tCalifornia\tRiverside County\t43778\t42.5\t34.5\t13.3\t32562\t230446\t0.4971\t92253\tObama\t92253\t0.069665715\t92253.0\n1891\t-116.96960800000001\t33.97956\tCherry Valley CDP\tCA\tCalifornia\tRiverside County\t6315\t55.4\t17.6\t16.5\t25530\t163485\t0.4971\t92223\tObama\t92223\t0.010049317\t92223.0\n1892\t-117.514715\t33.985743\tMira Loma CDP\tCA\tCalifornia\tRiverside County\t19381\t31.8\t8.5\t18.4\t17550\t211078\t0.4971\t91752\tObama\t91752\t0.030841775\t91752.0\n1893\t-117.073803\t33.716758\tWinchester CDP\tCA\tCalifornia\tRiverside County\t2708\t38.3\t7.6\t23.1\t17914\t129817\t0.4971\t92548\tObama\t92548\t0.0043093509999999995\t92548.0\n1894\t-116.232483\t33.723925\tIndio city\tCA\tCalifornia\tRiverside County\t87371\t29.8\t14.0\t20.2\t16932\t139743\t0.4971\t92201\tObama\t92201\t0.139037032\t92201.0\n1895\t-117.420794\t33.993019\tRubidoux CDP\tCA\tCalifornia\tRiverside County\t33776\t28.2\t9.7\t22.3\t16025\t161060\t0.4971\t92509\tObama\t92509\t0.053749125\t92509.0\n1896\t-114.58083400000001\t33.594351\tEast Blythe CDP\tCA\tCalifornia\tRiverside County\t3\t0.0\t0.0\t0.0\t15996\t0\t0.4971\t92225\tObama\t92225\t4.77e-06\t92225.0\n1897\t-116.725898\t33.744142\tIdyllwild-Pine Cove CDP\tCA\tCalifornia\tRiverside County\t4970\t51.3\t39.3\t18.8\t24898\t222772\t0.4971\t92549\tObama\t92549\t0.007908964000000001\t92549.0\n1898\t-117.522453\t33.838561\tEl Cerrito CDP\tCA\tCalifornia\tRiverside County\t5016\t35.5\t14.5\t20.0\t23618\t232818\t0.4971\t92881\tObama\t92881\t0.007982165\t92881.0\n1899\t-116.991824\t33.795975\tSan Jacinto city\tCA\tCalifornia\tRiverside County\t33035\t36.1\t11.1\t22.8\t16543\t123125\t0.4971\t92582\tObama\t92582\t0.052569942\t92582.0\n1900\t-117.330483\t33.682359000000005\tLake Elsinore city\tCA\tCalifornia\tRiverside County\t44069\t29.5\t12.8\t16.5\t20012\t188114\t0.4971\t92532\tObama\t92532\t0.070128795\t92532.0\n1901\t-117.283041\t33.639229\tSedco Hills CDP\tCA\tCalifornia\tRiverside County\t3397\t36.3\t8.5\t16.8\t16954\t135185\t0.4971\t92595\tObama\t92595\t0.005405785\t92595.0\n1902\t-114.579751\t33.630264000000004\tBlythe city\tCA\tCalifornia\tRiverside County\t21405\t32.3\t7.3\t21.9\t19078\t129777\t0.4971\t92225\tObama\t92225\t0.034062649\t92225.0\n1903\t-117.425494\t34.019940999999996\tSunnyslope CDP\tCA\tCalifornia\tRiverside County\t4747\t29.4\t5.8\t18.0\t16221\t181327\t0.4971\t92509\tObama\t92509\t0.007554095\t92509.0\n1904\t-116.968647\t33.937794\tBeaumont city\tCA\tCalifornia\tRiverside County\t27514\t34.8\t10.2\t20.7\t18083\t134669\t0.4971\t92223\tObama\t92223\t0.043784149\t92223.0\n1905\t-116.366386\t33.739839\tPalm Desert city\tCA\tCalifornia\tRiverside County\t49228\t54.6\t35.8\t15.1\t38437\t240382\t0.4971\t92260\tObama\t92260\t0.07833852200000001\t92260.0\n1906\t-117.26274599999999\t33.891866\tMarch AFB CDP\tCA\tCalifornia\tRiverside County\t466\t76.6\t45.8\t19.1\t43550\t231250\t0.4971\t92518\tObama\t92518\t0.000741565\t92518.0\n1907\t-117.397224\t33.939411\tRiverside city\tCA\tCalifornia\tRiverside County\t296684\t30.6\t22.8\t18.9\t21758\t192514\t0.4971\t92504\tObama\t92504\t0.47212533799999995\t92504.0\n1908\t-116.53878200000001\t33.802401\tPalm Springs city\tCA\tCalifornia\tRiverside County\t49756\t50.9\t30.2\t17.7\t29172\t184815\t0.4971\t92264\tObama\t92264\t0.07917875\t92264.0\n1909\t-116.38766100000001\t33.820073\tThousand Palms CDP\tCA\tCalifornia\tRiverside County\t6604\t41.2\t11.9\t16.4\t17426\t113115\t0.4971\t92276\tObama\t92276\t0.010509214\t92276.0\n1910\t-116.996071\t33.738324\tHemet city\tCA\tCalifornia\tRiverside County\t73312\t47.7\t13.3\t22.5\t18482\t108595\t0.4971\t92543\tObama\t92543\t0.116664373\t92543.0\n1911\t-117.14988500000001\t33.562089\tMurrieta Hot Springs CDP\tCA\tCalifornia\tRiverside County\t5094\t56.1\t15.5\t18.4\t22387\t145240\t0.4971\t92563\tObama\t92563\t0.00810629\t92563.0\n1912\t-117.55191\t33.925804\tNorco city\tCA\tCalifornia\tRiverside County\t26942\t38.2\t14.8\t17.1\t25724\t283674\t0.4971\t92860\tObama\t92860\t0.042873902\t92860.0\n1913\t-117.20266699999999\t33.713746\tSun City CDP\tCA\tCalifornia\tRiverside County\t21230\t65.3\t13.8\t20.8\t22534\t144701\t0.4971\t92586\tObama\t92586\t0.033784164\t92586.0\n1914\t-117.05516999999999\t33.987091\tCalimesa city\tCA\tCalifornia\tRiverside County\t8261\t45.7\t16.9\t18.9\t24438\t148424\t0.4971\t92320\tObama\t92320\t0.013146066000000001\t92320.0\n1915\t-117.205053\t33.924371\tMoreno Valley city\tCA\tCalifornia\tRiverside County\t181538\t28.9\t17.4\t18.8\t18304\t169730\t0.4971\t92555\tObama\t92555\t0.288888816\t92555.0\n1916\t-116.427322\t33.761599\tRancho Mirage city\tCA\tCalifornia\tRiverside County\t16723\t61.9\t39.4\t16.4\t54183\t321791\t0.4971\t92270\tObama\t92270\t0.026611991\t92270.0\n1917\t-116.46416\t33.831527\tCathedral City\tCA\tCalifornia\tRiverside County\t53756\t32.1\t17.4\t18.5\t19144\t166532\t0.4971\t92234\tObama\t92234\t0.085544113\t92234.0\n1918\t-117.261927\t33.68827\tCanyon Lake city\tCA\tCalifornia\tRiverside County\t10990\t42.4\t24.7\t13.1\t32169\t288465\t0.4971\t92587\tObama\t92587\t0.017488835\t92587.0\n1919\t-117.24824199999999\t33.706334000000005\tQuail Valley CDP\tCA\tCalifornia\tRiverside County\t1956\t32.0\t11.8\t21.6\t17829\t142333\t0.4971\t92587\tObama\t92587\t0.003112662\t92587.0\n1920\t-121.28794599999999\t38.574562\tRancho Cordova CDP\tCA\tCalifornia\tSacramento County\t61997\t32.0\t21.3\t15.7\t21795\t166144\t0.5815\t95655\tObama\t95655\t0.09865835199999999\t95655.0\n1921\t-121.33474199999999\t38.467189000000005\tVineyard CDP\tCA\tCalifornia\tSacramento County\t20594\t36.2\t32.5\t9.3\t33204\t238571\t0.5815\t95829\tObama\t95829\t0.032772071\t95829.0\n1922\t-121.24868700000002\t38.626864000000005\tGold River CDP\tCA\tCalifornia\tSacramento County\t8705\t46.0\t61.0\t7.7\t51544\t376455\t0.5815\t95628\tObama\t95628\t0.013852621\t95628.0\n1923\t-121.379291\t38.435978999999996\tElk Grove CDP\tCA\tCalifornia\tSacramento County\t72385\t33.4\t27.3\t12.4\t25847\t215648\t0.5815\t95624\tObama\t95624\t0.1151892\t95624.0\n1924\t-121.14803\t38.675136\tFolsom city\tCA\tCalifornia\tSacramento County\t72665\t36.6\t44.1\t13.8\t38299\t338850\t0.5815\t95630\tObama\t95630\t0.115634775\t95630.0\n1925\t-121.28801299999999\t38.694818\tCitrus Heights city\tCA\tCalifornia\tSacramento County\t87101\t36.1\t20.5\t12.5\t24514\t189088\t0.5815\t95610\tObama\t95610\t0.13860737\t95610.0\n1926\t-121.46766799999999\t38.565739\tSacramento city\tCA\tCalifornia\tSacramento County\t487724\t33.7\t26.4\t16.0\t22964\t188405\t0.5815\t95816\tObama\t95816\t0.776135074\t95816.0\n1927\t-121.069576\t38.509368\tRancho Murieta CDP\tCA\tCalifornia\tSacramento County\t5236\t48.8\t43.6\t9.2\t51295\t349655\t0.5815\t95683\tObama\t95683\t0.00833226\t95683.0\n1928\t-121.45319199999999\t38.509227\tParkway-South Sacramento CDP\tCA\tCalifornia\tSacramento County\t38935\t27.3\t9.1\t22.6\t14152\t134700\t0.5815\t95824\tObama\t95824\t0.061958852\t95824.0\n1929\t-121.355686\t38.5678\tLa Riviera CDP\tCA\tCalifornia\tSacramento County\t10484\t36.6\t39.4\t11.3\t27318\t186204\t0.5815\t95826\tObama\t95826\t0.016683616000000002\t95826.0\n1930\t-121.3007\t38.26419\tGalt city\tCA\tCalifornia\tSacramento County\t23098\t30.9\t16.1\t18.0\t20476\t193551\t0.5815\t95632\tObama\t95632\t0.036756789\t95632.0\n1931\t-121.321274\t38.632456\tCarmichael CDP\tCA\tCalifornia\tSacramento County\t51199\t42.4\t35.2\t12.7\t30710\t235905\t0.5815\t95608\tObama\t95608\t0.081475055\t95608.0\n1932\t-121.47073\t38.416956\tLaguna West-Lakeside CDP\tCA\tCalifornia\tSacramento County\t13592\t34.9\t46.6\t10.0\t36285\t252615\t0.5815\t95758\tObama\t95758\t0.021629502999999998\t95758.0\n1933\t-121.458821\t38.687349\tRio Linda CDP\tCA\tCalifornia\tSacramento County\t10827\t35.1\t8.7\t19.3\t20916\t163105\t0.5815\t95673\tObama\t95673\t0.017229446000000002\t95673.0\n1934\t-121.38144299999999\t38.668631\tNorth Highlands CDP\tCA\tCalifornia\tSacramento County\t45089\t30.8\t10.2\t19.7\t16707\t138105\t0.5815\t95660\tObama\t95660\t0.071751963\t95660.0\n1935\t-121.34867\t38.679486\tFoothill Farms CDP\tCA\tCalifornia\tSacramento County\t17371\t30.8\t14.5\t18.0\t21315\t166480\t0.5815\t95842\tObama\t95842\t0.02764318\t95842.0\n1936\t-121.50824899999999\t38.255989\tWalnut Grove CDP\tCA\tCalifornia\tSacramento County\t787\t37.3\t16.2\t27.2\t16318\t96842\t0.5815\t95690\tObama\t95690\t0.001252385\t95690.0\n1937\t-121.607482\t38.162163\tIsleton city\tCA\tCalifornia\tSacramento County\t841\t50.4\t13.4\t20.5\t24552\t139500\t0.5815\t95641\tObama\t95641\t0.0013383179999999998\t95641.0\n1938\t-121.211906\t38.413853\tWilton CDP\tCA\tCalifornia\tSacramento County\t5889\t45.9\t28.5\t11.0\t35916\t346143\t0.5815\t95693\tObama\t95693\t0.009371406\t95693.0\n1939\t-121.42545\t38.423076\tLaguna CDP\tCA\tCalifornia\tSacramento County\t40359\t32.9\t42.9\t10.1\t30788\t224925\t0.5815\t95758\tObama\t95758\t0.06422492099999999\t95758.0\n1940\t-121.24971599999999\t38.648457\tFair Oaks CDP\tCA\tCalifornia\tSacramento County\t29185\t44.2\t45.6\t11.1\t35869\t299818\t0.5815\t95628\tObama\t95628\t0.04644328\t95628.0\n1941\t-121.37854499999999\t38.60252\tArden-Arcade CDP\tCA\tCalifornia\tSacramento County\t97710\t38.8\t37.0\t15.0\t29873\t230691\t0.5815\t95864\tObama\t95864\t0.155489904\t95864.0\n1942\t-121.355372\t38.547851\tRosemont CDP\tCA\tCalifornia\tSacramento County\t23636\t33.5\t28.1\t12.7\t23411\t178648\t0.5815\t95826\tObama\t95826\t0.03761293\t95826.0\n1943\t-121.404301\t38.491823\tFlorin CDP\tCA\tCalifornia\tSacramento County\t27791\t31.5\t11.5\t19.2\t17160\t141039\t0.5815\t95828\tObama\t95828\t0.044224951\t95828.0\n1944\t-121.216831\t38.688266999999996\tOrangevale CDP\tCA\tCalifornia\tSacramento County\t27731\t40.4\t26.5\t12.7\t29295\t217750\t0.5815\t95662\tObama\t95662\t0.04412947\t95662.0\n1945\t-121.538063\t36.845454\tSan Juan Bautista city\tCA\tCalifornia\tSan Benito County\t1620\t35.7\t13.4\t16.1\t25752\t371341\t0.5921\t95045\tObama\t95045\t0.002577972\t95045.0\n1946\t-121.62984399999999\t36.878778000000004\tAromas CDP\tCA\tCalifornia\tSan Benito County\t2909\t41.2\t28.9\t8.4\t33838\t475828\t0.5921\t95004\tObama\t95004\t0.00462921\t95004.0\n1947\t-121.362066\t36.807881\tRidgemark CDP\tCA\tCalifornia\tSan Benito County\t2851\t48.2\t34.7\t9.7\t51803\t590946\t0.5921\t95023\tObama\t95023\t0.004536912\t95023.0\n1948\t-121.397775\t36.855204\tHollister city\tCA\tCalifornia\tSan Benito County\t36735\t29.2\t17.2\t16.5\t23029\t363689\t0.5921\t95023\tObama\t95023\t0.058457902\t95023.0\n1949\t-117.725448\t33.950838\tChino Hills city\tCA\tCalifornia\tSan Bernardino County\t80094\t33.7\t40.1\t12.9\t31268\t344367\t0.5247\t91709\tObama\t91709\t0.12745684599999998\t91709.0\n1950\t-117.17152\t34.050916\tRedlands city\tCA\tCalifornia\tSan Bernardino County\t70487\t36.7\t38.4\t16.0\t28144\t214093\t0.5247\t92374\tObama\t92374\t0.112168835\t92374.0\n1951\t-117.067125\t34.866139000000004\tBarstow city\tCA\tCalifornia\tSan Bernardino County\t22117\t32.1\t10.6\t21.9\t18581\t97524\t0.5247\t92311\tObama\t92311\t0.035195683\t92311.0\n1952\t-117.188124\t34.117124\tHighland city\tCA\tCalifornia\tSan Bernardino County\t51432\t29.6\t19.5\t20.8\t20039\t179106\t0.5247\t92346\tObama\t92346\t0.081845837\t92346.0\n1953\t-114.618241\t34.812313\tNeedles city\tCA\tCalifornia\tSan Bernardino County\t4941\t42.1\t10.5\t15.9\t16824\t91653\t0.5247\t92363\tObama\t92363\t0.007862815\t92363.0\n1954\t-117.313171\t34.031037\tGrand Terrace city\tCA\tCalifornia\tSan Bernardino County\t12915\t37.1\t27.4\t13.3\t26870\t195729\t0.5247\t92313\tObama\t92313\t0.020552166\t92313.0\n1955\t-117.34707900000001\t34.497565\tMountain View Acres CDP\tCA\tCalifornia\tSan Bernardino County\t3038\t34.8\t10.0\t14.0\t19159\t144041\t0.5247\t92392\tObama\t92392\t0.004834493\t92392.0\n1956\t-117.29501100000002\t34.250248\tCrestline CDP\tCA\tCalifornia\tSan Bernardino County\t12726\t41.2\t21.9\t16.0\t25386\t175301\t0.5247\t92325\tObama\t92325\t0.020251401999999998\t92325.0\n1957\t-117.307101\t34.399028\tHesperia city\tCA\tCalifornia\tSan Bernardino County\t82000\t32.9\t10.2\t18.7\t18743\t141649\t0.5247\t92345\tObama\t92345\t0.130489941\t92345.0\n1958\t-117.11339\t34.210133\tRunning Springs CDP\tCA\tCalifornia\tSan Bernardino County\t6309\t39.9\t28.8\t11.3\t26914\t185376\t0.5247\t92382\tObama\t92382\t0.010039769\t92382.0\n1959\t-117.65873500000001\t34.153733\tSan Antonio Heights CDP\tCA\tCalifornia\tSan Bernardino County\t3365\t45.8\t41.1\t11.0\t43219\t478030\t0.5247\t91784\tObama\t91784\t0.005354861999999999\t91784.0\n1960\t-117.65924299999999\t34.118469\tUpland city\tCA\tCalifornia\tSan Bernardino County\t74965\t35.9\t29.9\t15.3\t25887\t290991\t0.5247\t91786\tObama\t91786\t0.119294859\t91786.0\n1961\t-116.31928500000001\t34.127101\tJoshua Tree CDP\tCA\tCalifornia\tSan Bernardino County\t4980\t41.4\t14.0\t23.1\t17444\t90367\t0.5247\t92252\tObama\t92252\t0.007924877\t92252.0\n1962\t-117.043378\t34.032892\tYucaipa city\tCA\tCalifornia\tSan Bernardino County\t50329\t39.4\t17.1\t15.9\t22582\t165201\t0.5247\t92399\tObama\t92399\t0.080090588\t92399.0\n1963\t-117.67916299999999\t33.99664\tChino city\tCA\tCalifornia\tSan Bernardino County\t76801\t31.6\t15.9\t16.8\t22041\t239924\t0.5247\t91710\tObama\t91710\t0.122216561\t91710.0\n1964\t-117.32543700000001\t34.054302\tColton city\tCA\tCalifornia\tSan Bernardino County\t52834\t27.7\t14.2\t20.0\t16013\t146699\t0.5247\t92324\tObama\t92324\t0.084076897\t92324.0\n1965\t-116.89584599999999\t34.24276\tBig Bear Lake city\tCA\tCalifornia\tSan Bernardino County\t6558\t47.4\t25.9\t14.6\t24062\t245816\t0.5247\t92315\tObama\t92315\t0.010436013000000001\t92315.0\n1966\t-116.95409099999999\t34.872665000000005\tNebo Center CDP\tCA\tCalifornia\tSan Bernardino County\t1000\t22.7\t15.5\t33.6\t18318\t92500\t0.5247\t92311\tObama\t92311\t0.001591341\t92311.0\n1967\t-117.21122199999999\t34.531639\tApple Valley town\tCA\tCalifornia\tSan Bernardino County\t69103\t37.5\t18.5\t18.0\t21237\t156620\t0.5247\t92307\tObama\t92307\t0.10996642\t92307.0\n1968\t-117.29568400000001\t34.139199\tSan Bernardino city\tCA\tCalifornia\tSan Bernardino County\t207593\t27.9\t13.6\t22.5\t14806\t137133\t0.5247\t92405\tObama\t92405\t0.330351199\t92405.0\n1969\t-117.18770500000001\t34.258919\tLake Arrowhead CDP\tCA\tCalifornia\tSan Bernardino County\t11357\t42.5\t38.4\t12.5\t33544\t314513\t0.5247\t92352\tObama\t92352\t0.018072857\t92352.0\n1970\t-114.360772\t34.139262\tBig River CDP\tCA\tCalifornia\tSan Bernardino County\t1647\t57.2\t7.1\t20.4\t17044\t78788\t0.5247\t92242\tObama\t92242\t0.0026209379999999997\t92242.0\n1971\t-117.60636799999999\t34.039282\tOntario city\tCA\tCalifornia\tSan Bernardino County\t173804\t28.7\t12.4\t20.1\t16280\t191295\t0.5247\t91761\tObama\t91761\t0.276581387\t91761.0\n1972\t-114.264074\t34.176043\tBluewater CDP\tCA\tCalifornia\tSan Bernardino County\t334\t57.4\t7.0\t20.2\t17040\t78889\t0.5247\t92242\tObama\t92242\t0.000531508\t92242.0\n1973\t-116.42128000000001\t34.12308\tYucca Valley town\tCA\tCalifornia\tSan Bernardino County\t19654\t44.9\t14.7\t17.1\t19174\t112095\t0.5247\t92284\tObama\t92284\t0.031276211\t92284.0\n1974\t-117.401343\t34.060248\tBloomington CDP\tCA\tCalifornia\tSan Bernardino County\t21325\t27.6\t5.9\t23.5\t13367\t143423\t0.5247\t92316\tObama\t92316\t0.033935341\t92316.0\n1975\t-117.34918200000001\t34.152605\tMuscoy CDP\tCA\tCalifornia\tSan Bernardino County\t10332\t24.3\t5.6\t27.7\t10070\t130985\t0.5247\t92411\tObama\t92411\t0.016441733\t92411.0\n1976\t-117.35373799999999\t34.527509\tVictorville city\tCA\tCalifornia\tSan Bernardino County\t106121\t31.7\t12.7\t16.9\t17684\t141314\t0.5247\t92394\tObama\t92394\t0.168874671\t92394.0\n1977\t-117.25025600000001\t34.0447\tLoma Linda city\tCA\tCalifornia\tSan Bernardino County\t22585\t35.6\t46.6\t14.3\t24843\t216788\t0.5247\t92354\tObama\t92354\t0.035940431\t92354.0\n1978\t-117.45966200000001\t34.098081\tFontana city\tCA\tCalifornia\tSan Bernardino County\t173439\t27.6\t13.4\t17.3\t17005\t186847\t0.5247\t92335\tObama\t92335\t0.276000548\t92335.0\n1979\t-117.63016299999998\t34.359358\tWrightwood CDP\tCA\tCalifornia\tSan Bernardino County\t4820\t41.9\t28.8\t13.6\t26659\t220161\t0.5247\t92397\tObama\t92397\t0.007670262\t92397.0\n1980\t-117.69791299999999\t34.072637\tMontclair city\tCA\tCalifornia\tSan Bernardino County\t37722\t28.9\t10.8\t19.4\t15490\t185013\t0.5247\t91763\tObama\t91763\t0.060028556\t91763.0\n1981\t-116.06630200000001\t34.141907\tTwentynine Palms city\tCA\tCalifornia\tSan Bernardino County\t17849\t28.9\t14.6\t20.4\t18114\t102378\t0.5247\t92277\tObama\t92277\t0.028403841000000003\t92277.0\n1982\t-117.44360900000001\t34.582411\tAdelanto city\tCA\tCalifornia\tSan Bernardino County\t32150\t26.5\t6.9\t19.9\t12627\t113937\t0.5247\t92301\tObama\t92301\t0.051161605\t92301.0\n1983\t-116.593197\t34.058649\tMorongo Valley CDP\tCA\tCalifornia\tSan Bernardino County\t2458\t45.2\t14.1\t13.4\t24686\t95682\t0.5247\t92256\tObama\t92256\t0.003911515999999999\t92256.0\n1984\t-117.38828400000001\t34.113794\tRialto city\tCA\tCalifornia\tSan Bernardino County\t102624\t27.1\t9.9\t21.5\t15150\t161906\t0.5247\t92376\tObama\t92376\t0.163309753\t92376.0\n1985\t-117.110918\t34.06072\tMentone CDP\tCA\tCalifornia\tSan Bernardino County\t8832\t33.5\t23.6\t16.3\t21318\t181375\t0.5247\t92359\tObama\t92359\t0.014054721000000001\t92359.0\n1986\t-116.05258400000001\t34.226677\tTwentynine Palms Base CDP\tCA\tCalifornia\tSan Bernardino County\t9163\t22.8\t27.0\t19.3\t18909\t107500\t0.5247\t92277\tObama\t92277\t0.014581455\t92277.0\n1987\t-117.569322\t34.122433\tRancho Cucamonga city\tCA\tCalifornia\tSan Bernardino County\t161834\t33.7\t26.1\t14.0\t27359\t244894\t0.5247\t91701\tObama\t91701\t0.257533038\t91701.0\n1988\t-117.39946599999999\t35.769697\tSearles Valley CDP\tCA\tCalifornia\tSan Bernardino County\t1967\t39.3\t9.0\t18.4\t20920\t38598\t0.5247\t93562\tObama\t93562\t0.003130167\t93562.0\n1989\t-116.84566000000001\t34.266927\tBig Bear City CDP\tCA\tCalifornia\tSan Bernardino County\t7307\t41.1\t15.7\t13.6\t23905\t165745\t0.5247\t92314\tObama\t92314\t0.011627927\t92314.0\n1990\t-117.106904\t34.885445000000004\tLenwood CDP\tCA\tCalifornia\tSan Bernardino County\t3360\t31.1\t9.7\t24.6\t17005\t91543\t0.5247\t92311\tObama\t92311\t0.005346905\t92311.0\n1991\t-117.19412\t33.276103000000006\tBonsall CDP\tCA\tCalifornia\tSan Diego County\t3729\t46.9\t38.6\t11.6\t38488\t409036\t0.5258\t92003\tObama\t92003\t0.00593411\t92003.0\n1992\t-117.120099\t33.22769\tHidden Meadows CDP\tCA\tCalifornia\tSan Diego County\t4079\t57.7\t41.5\t11.0\t39902\t451094\t0.5258\t92026\tObama\t92026\t0.006491079\t92026.0\n1993\t-117.31621399999999\t33.313884\tCamp Pendleton North CDP\tCA\tCalifornia\tSan Diego County\t8330\t22.0\t20.6\t15.2\t18537\t80000\t0.5258\t92057\tObama\t92057\t0.013255868\t92057.0\n1994\t-117.04528\t32.665255\tBonita CDP\tCA\tCalifornia\tSan Diego County\t13168\t42.2\t43.1\t12.0\t33817\t481946\t0.5258\t92139\tObama\t92139\t0.020954775\t92139.0\n1995\t-117.002058\t32.710772999999996\tLa Presa CDP\tCA\tCalifornia\tSan Diego County\t34169\t32.2\t16.9\t14.1\t20940\t237758\t0.5258\t91977\tObama\t91977\t0.054374522\t91977.0\n1996\t-116.90042\t32.853694\tLakeside CDP\tCA\tCalifornia\tSan Diego County\t20163\t36.2\t15.7\t12.8\t24587\t274545\t0.5258\t92040\tObama\t92040\t0.032086203\t92040.0\n1997\t-116.864956\t33.033702000000005\tRamona CDP\tCA\tCalifornia\tSan Diego County\t16427\t31.5\t19.0\t12.1\t22156\t319491\t0.5258\t92065\tObama\t92065\t0.026140953999999997\t92065.0\n1998\t-117.208229\t33.12027\tLake San Marcos CDP\tCA\tCalifornia\tSan Diego County\t4425\t62.2\t41.0\t13.7\t37504\t349872\t0.5258\t92069\tObama\t92069\t0.007041683000000001\t92069.0\n1999\t-117.175436\t32.678632\tCoronado city\tCA\tCalifornia\tSan Diego County\t25683\t34.1\t54.0\t9.7\t40366\t902746\t0.5258\t92118\tObama\t92118\t0.040870404\t92118.0\n2000\t-117.308453\t33.224371000000005\tOceanside city\tCA\tCalifornia\tSan Diego County\t178579\t34.6\t26.0\t12.3\t24122\t283476\t0.5258\t92057\tObama\t92057\t0.284180039\t92057.0\n2001\t-116.96072099999999\t32.80168\tEl Cajon city\tCA\tCalifornia\tSan Diego County\t97523\t32.2\t17.3\t15.1\t20909\t273385\t0.5258\t92020\tObama\t92020\t0.155192324\t92020.0\n2002\t-117.128427\t32.863753\tSan Diego city\tCA\tCalifornia\tSan Diego County\t1324681\t33.8\t39.6\t12.5\t29145\t353681\t0.5258\t92124\tObama\t92124\t2.10801885\t92124.0\n2003\t-116.976199\t32.732078\tSpring Valley CDP\tCA\tCalifornia\tSan Diego County\t29924\t35.1\t25.5\t12.6\t23348\t263181\t0.5258\t91977\tObama\t91977\t0.04761928\t91977.0\n2004\t-116.83829899999999\t32.827351\tHarbison Canyon CDP\tCA\tCalifornia\tSan Diego County\t3844\t40.8\t26.2\t10.0\t29379\t377165\t0.5258\t92021\tObama\t92021\t0.006117114\t92021.0\n2005\t-117.034416\t32.733066\tLemon Grove city\tCA\tCalifornia\tSan Diego County\t25341\t35.5\t18.6\t13.7\t20906\t250211\t0.5258\t91945\tObama\t91945\t0.040326166000000004\t91945.0\n2006\t-116.86698500000001\t32.799906\tCrest CDP\tCA\tCalifornia\tSan Diego County\t2807\t43.4\t23.2\t12.9\t29042\t289286\t0.5258\t92019\tObama\t92019\t0.0044668929999999996\t92019.0\n2007\t-117.093047\t32.67015\tNational City\tCA\tCalifornia\tSan Diego County\t56583\t29.0\t11.6\t18.4\t15123\t222487\t0.5258\t91950\tObama\t91950\t0.090042833\t91950.0\n2008\t-117.071852\t33.133795\tEscondido city\tCA\tCalifornia\tSan Diego County\t145254\t32.0\t23.7\t13.2\t22013\t277276\t0.5258\t92025\tObama\t92025\t0.23114860899999998\t92025.0\n2009\t-116.870856\t32.718437\tJamul CDP\tCA\tCalifornia\tSan Diego County\t6003\t42.1\t39.8\t10.7\t40135\t542536\t0.5258\t91935\tObama\t91935\t0.009552818000000001\t91935.0\n2010\t-117.15049199999999\t33.407108\tRainbow CDP\tCA\tCalifornia\tSan Diego County\t2027\t43.2\t29.0\t9.8\t24962\t451875\t0.5258\t92028\tObama\t92028\t0.003225648\t92028.0\n2011\t-117.009405\t32.627665\tChula Vista city\tCA\tCalifornia\tSan Diego County\t234601\t34.3\t29.3\t12.9\t23583\t318691\t0.5258\t91913\tObama\t91913\t0.37333013\t91913.0\n2012\t-116.588931\t33.073651\tJulian CDP\tCA\tCalifornia\tSan Diego County\t1765\t46.3\t33.1\t9.2\t23778\t282965\t0.5258\t92036\tObama\t92036\t0.0028087159999999997\t92036.0\n2013\t-116.927126\t32.837784\tWinter Gardens CDP\tCA\tCalifornia\tSan Diego County\t20090\t37.1\t15.1\t11.3\t23838\t263922\t0.5258\t92021\tObama\t92021\t0.031970036\t92021.0\n2014\t-116.91963200000001\t32.76201\tRancho San Diego CDP\tCA\tCalifornia\tSan Diego County\t22168\t40.4\t41.5\t10.7\t36335\t447112\t0.5258\t92019\tObama\t92019\t0.035276842\t92019.0\n2015\t-116.957549\t32.8191\tBostonia CDP\tCA\tCalifornia\tSan Diego County\t15595\t31.7\t13.6\t14.7\t21520\t232057\t0.5258\t92020\tObama\t92020\t0.024816959\t92020.0\n2016\t-116.985426\t32.856322999999996\tSantee city\tCA\tCalifornia\tSan Diego County\t55486\t37.1\t20.6\t11.7\t26017\t263852\t0.5258\t92071\tObama\t92071\t0.08829713300000001\t92071.0\n2017\t-117.26175\t33.048942\tEncinitas city\tCA\tCalifornia\tSan Diego County\t60788\t40.9\t54.5\t10.6\t39790\t577938\t0.5258\t92024\tObama\t92024\t0.096734421\t92024.0\n2018\t-117.283744\t33.124501\tCarlsbad city\tCA\tCalifornia\tSan Diego County\t103712\t41.7\t51.4\t9.9\t41790\t525375\t0.5258\t92009\tObama\t92009\t0.165041131\t92009.0\n2019\t-117.2572\t32.994569\tSolana Beach city\tCA\tCalifornia\tSan Diego County\t12940\t44.4\t63.7\t9.6\t53531\t708616\t0.5258\t92075\tObama\t92075\t0.020591949\t92075.0\n2020\t-116.968833\t32.763995\tCasa de Oro-Mount Helix CDP\tCA\tCalifornia\tSan Diego County\t19028\t44.1\t44.2\t11.9\t37898\t508369\t0.5258\t92020\tObama\t92020\t0.030280032000000002\t92020.0\n2021\t-117.17453200000001\t33.135194\tSan Marcos city\tCA\tCalifornia\tSan Diego County\t77594\t35.8\t26.3\t12.0\t25152\t307502\t0.5258\t92069\tObama\t92069\t0.12347849400000001\t92069.0\n2022\t-116.51080900000001\t32.84148\tPine Valley CDP\tCA\tCalifornia\tSan Diego County\t1602\t47.8\t26.5\t9.0\t31034\t358392\t0.5258\t91931\tObama\t91931\t0.002549328\t91931.0\n2023\t-117.19883999999999\t33.02387\tRancho Santa Fe CDP\tCA\tCalifornia\tSan Diego County\t3443\t49.4\t73.0\t8.3\t94027\t1000001\t0.5258\t92067\tObama\t92067\t0.005478986\t92067.0\n2024\t-117.225831\t33.369327\tFallbrook CDP\tCA\tCalifornia\tSan Diego County\t32260\t32.4\t26.0\t13.6\t23390\t356984\t0.5258\t92028\tObama\t92028\t0.051336652\t92028.0\n2025\t-117.11865800000001\t32.568983\tImperial Beach city\tCA\tCalifornia\tSan Diego County\t27661\t28.8\t14.2\t17.0\t19768\t256566\t0.5258\t91932\tObama\t91932\t0.044018075999999996\t91932.0\n2026\t-116.356141\t33.239048\tBorrego Springs CDP\tCA\tCalifornia\tSan Diego County\t2705\t51.3\t28.7\t10.4\t25335\t185938\t0.5258\t92004\tObama\t92004\t0.004304577\t92004.0\n2027\t-116.758829\t32.843752\tAlpine CDP\tCA\tCalifornia\tSan Diego County\t14406\t41.1\t28.5\t11.4\t37895\t476247\t0.5258\t91901\tObama\t91901\t0.022924855\t91901.0\n2028\t-117.185229\t32.99237\tFairbanks Ranch CDP\tCA\tCalifornia\tSan Diego County\t1995\t47.4\t71.7\t7.5\t85990\t502737\t0.5258\t92091\tObama\t92091\t0.003174725\t92091.0\n2029\t-117.238477\t33.189578000000004\tVista city\tCA\tCalifornia\tSan Diego County\t97611\t31.6\t23.2\t13.2\t22065\t294908\t0.5258\t92083\tObama\t92083\t0.155332361\t92083.0\n2030\t-117.262235\t32.963271\tDel Mar city\tCA\tCalifornia\tSan Diego County\t4305\t46.7\t76.9\t9.5\t64590\t1000001\t0.5258\t92014\tObama\t92014\t0.006850721999999999\t92014.0\n2031\t-116.905826\t32.80339\tGranite Hills CDP\tCA\tCalifornia\tSan Diego County\t3294\t46.2\t30.8\t10.4\t31110\t477340\t0.5258\t92019\tObama\t92019\t0.0052418759999999995\t92019.0\n2032\t-117.378098\t33.229314\tCamp Pendleton South CDP\tCA\tCalifornia\tSan Diego County\t8998\t22.0\t20.6\t15.2\t18538\t82000\t0.5258\t92054\tObama\t92054\t0.014318883999999999\t92054.0\n2033\t-117.01531499999999\t33.229712\tValley Center CDP\tCA\tCalifornia\tSan Diego County\t8324\t41.9\t33.2\t9.0\t33299\t481236\t0.5258\t92082\tObama\t92082\t0.01324632\t92082.0\n2034\t-117.020354\t32.987071\tPoway city\tCA\tCalifornia\tSan Diego County\t49256\t39.7\t43.8\t10.0\t34332\t449150\t0.5258\t92064\tObama\t92064\t0.07838308\t92064.0\n2035\t-117.020362\t32.770373\tLa Mesa city\tCA\tCalifornia\tSan Diego County\t56487\t39.1\t32.3\t11.6\t27896\t296673\t0.5258\t91941\tObama\t91941\t0.089890065\t91941.0\n2036\t-116.78671100000001\t33.009451\tSan Diego Country Estates CDP\tCA\tCalifornia\tSan Diego County\t9804\t41.0\t33.9\t10.2\t34649\t402763\t0.5258\t92065\tObama\t92065\t0.015601505\t92065.0\n2037\t-122.44250600000001\t37.754565\tSan Francisco city\tCA\tCalifornia\tSan Francisco County\t814963\t38.9\t51.1\t11.2\t44441\t636693\t0.8353\t94114\tObama\t94114\t1.296883828\t94114.0\n2038\t-121.43368999999998\t37.735327000000005\tTracy city\tCA\tCalifornia\tSan Joaquin County\t82570\t31.3\t20.7\t13.9\t26360\t267735\t0.5575\t95376\tObama\t95376\t0.131397005\t95376.0\n2039\t-121.283556\t37.913891\tTaft Mosswood CDP\tCA\tCalifornia\tSan Joaquin County\t1596\t26.7\t3.0\t28.1\t10447\t106402\t0.5575\t95206\tObama\t95206\t0.00253978\t95206.0\n2040\t-121.23053600000001\t37.795084\tManteca city\tCA\tCalifornia\tSan Joaquin County\t60734\t34.3\t12.7\t18.3\t21230\t190912\t0.5575\t95337\tObama\t95337\t0.096648489\t95337.0\n2041\t-121.262588\t37.979656\tAugust CDP\tCA\tCalifornia\tSan Joaquin County\t8442\t28.4\t3.2\t26.7\t11402\t89624\t0.5575\t95205\tObama\t95205\t0.013434099\t95205.0\n2042\t-121.245695\t38.038734999999996\tMorada CDP\tCA\tCalifornia\tSan Joaquin County\t4083\t47.1\t37.6\t14.7\t37430\t228831\t0.5575\t95212\tObama\t95212\t0.006497444000000001\t95212.0\n2043\t-121.311753\t38.171170000000004\tNorth Woodbridge CDP\tCA\tCalifornia\tSan Joaquin County\t1544\t43.2\t35.4\t16.0\t32968\t278158\t0.5575\t95258\tObama\t95258\t0.00245703\t95258.0\n2044\t-120.995907\t37.792984999999994\tEscalon city\tCA\tCalifornia\tSan Joaquin County\t6906\t37.2\t14.2\t18.7\t22251\t174430\t0.5575\t95320\tObama\t95320\t0.010989799\t95320.0\n2045\t-121.00434299999999\t37.929982\tFarmington CDP\tCA\tCalifornia\tSan Joaquin County\t273\t41.0\t14.2\t18.7\t19567\t237500\t0.5575\t95236\tObama\t95236\t0.00043443599999999996\t95236.0\n2046\t-121.12813799999999\t37.741413\tRipon city\tCA\tCalifornia\tSan Joaquin County\t12229\t37.0\t21.6\t15.1\t24620\t195695\t0.5575\t95366\tObama\t95366\t0.019460506000000002\t95366.0\n2047\t-121.307992\t37.972072999999995\tStockton city\tCA\tCalifornia\tSan Joaquin County\t293134\t30.7\t17.5\t21.4\t18585\t151821\t0.5575\t95204\tObama\t95204\t0.46647607799999996\t95204.0\n2048\t-121.307455\t38.153787\tSouth Woodbridge CDP\tCA\tCalifornia\tSan Joaquin County\t3210\t37.5\t24.5\t15.3\t24677\t177083\t0.5575\t95258\tObama\t95258\t0.005108204\t95258.0\n2049\t-121.33394299999999\t38.005396000000005\tLincoln Village CDP\tCA\tCalifornia\tSan Joaquin County\t4292\t36.7\t26.8\t14.3\t22560\t152841\t0.5575\t95207\tObama\t95207\t0.0068300340000000005\t95207.0\n2050\t-121.280252\t38.127501\tLodi city\tCA\tCalifornia\tSan Joaquin County\t62455\t34.9\t17.6\t17.8\t22111\t174624\t0.5575\t95240\tObama\t95240\t0.099387186\t95240.0\n2051\t-121.155442\t38.150882\tLockeford CDP\tCA\tCalifornia\tSan Joaquin County\t3550\t38.4\t16.4\t27.7\t21848\t175172\t0.5575\t95237\tObama\t95237\t0.00564926\t95237.0\n2052\t-121.245925\t37.929352\tKennedy CDP\tCA\tCalifornia\tSan Joaquin County\t3594\t26.6\t6.5\t34.3\t10515\t92090\t0.5575\t95205\tObama\t95205\t0.005719279\t95205.0\n2053\t-121.280266\t37.888744\tFrench Camp CDP\tCA\tCalifornia\tSan Joaquin County\t4515\t30.7\t9.3\t43.1\t18039\t136890\t0.5575\t95231\tObama\t95231\t0.007184903\t95231.0\n2054\t-121.34066599999998\t37.969058000000004\tCountry Club CDP\tCA\tCalifornia\tSan Joaquin County\t9796\t36.5\t13.9\t19.3\t20942\t129481\t0.5575\t95204\tObama\t95204\t0.015588774\t95204.0\n2055\t-121.229724\t37.963744\tGarden Acres CDP\tCA\tCalifornia\tSan Joaquin County\t10313\t28.4\t3.9\t29.6\t11784\t102955\t0.5575\t95205\tObama\t95205\t0.016411497\t95205.0\n2056\t-121.09917800000001\t38.018611\tLinden CDP\tCA\tCalifornia\tSan Joaquin County\t1776\t38.8\t25.3\t20.6\t26189\t217769\t0.5575\t95236\tObama\t95236\t0.002826221\t95236.0\n2057\t-121.316179\t37.808578000000004\tLathrop city\tCA\tCalifornia\tSan Joaquin County\t13464\t29.4\t11.7\t17.6\t19675\t179787\t0.5575\t95330\tObama\t95330\t0.021425812000000002\t95330.0\n2058\t-120.68560500000001\t35.482324\tAtascadero city\tCA\tCalifornia\tSan Luis Obispo County\t28882\t40.3\t23.0\t10.3\t26763\t328775\t0.4876\t93422\tObama\t93422\t0.045961102999999996\t93422.0\n2059\t-120.84050900000001\t35.314161999999996\tBaywood-Los Osos CDP\tCA\tCalifornia\tSan Luis Obispo County\t14504\t47.8\t40.8\t10.1\t31322\t343730\t0.4876\t93402\tObama\t93402\t0.023080806000000002\t93402.0\n2060\t-120.38313500000001\t35.653621\tShandon CDP\tCA\tCalifornia\tSan Luis Obispo County\t1201\t28.2\t10.1\t9.2\t13590\t188480\t0.4876\t93461\tObama\t93461\t0.0019112000000000003\t93461.0\n2061\t-120.65927099999999\t35.640335\tEl Paso de Robles (Paso Robles) city\tCA\tCalifornia\tSan Luis Obispo County\t30207\t34.4\t21.2\t12.1\t24021\t278485\t0.4876\t93447\tObama\t93447\t0.04806963\t93447.0\n2062\t-120.884134\t35.437552000000004\tCayucos CDP\tCA\tCalifornia\tSan Luis Obispo County\t2844\t51.9\t33.6\t8.0\t32162\t501111\t0.4876\t93430\tObama\t93430\t0.004525773\t93430.0\n2063\t-121.084721\t35.552448999999996\tCambria CDP\tCA\tCalifornia\tSan Luis Obispo County\t6394\t56.6\t39.6\t9.4\t36147\t547526\t0.4876\t93428\tObama\t93428\t0.010175033\t93428.0\n2064\t-120.609444\t35.101836999999996\tOceano CDP\tCA\tCalifornia\tSan Luis Obispo County\t7840\t32.7\t14.8\t17.9\t19391\t224175\t0.4876\t93445\tObama\t93445\t0.012476111000000002\t93445.0\n2065\t-120.87377\t35.737203\tLake Nacimiento CDP\tCA\tCalifornia\tSan Luis Obispo County\t2479\t49.2\t19.0\t10.8\t26369\t221606\t0.4876\t93426\tObama\t93426\t0.003944934000000001\t93426.0\n2066\t-120.669734\t35.270790000000005\tSan Luis Obispo city\tCA\tCalifornia\tSan Luis Obispo County\t46124\t28.4\t44.5\t12.2\t26511\t439264\t0.4876\t93401\tObama\t93401\t0.07339900099999999\t93401.0\n2067\t-120.846876\t35.371023\tMorro Bay city\tCA\tCalifornia\tSan Luis Obispo County\t10542\t50.5\t30.8\t10.3\t27649\t381901\t0.4876\t93442\tObama\t93442\t0.016775914\t93442.0\n2068\t-120.650632\t35.14898\tPismo Beach city\tCA\tCalifornia\tSan Luis Obispo County\t9312\t49.8\t39.8\t11.7\t38936\t449332\t0.4876\t93449\tObama\t93449\t0.014818565\t93449.0\n2069\t-120.716705\t35.556336\tTempleton CDP\tCA\tCalifornia\tSan Luis Obispo County\t5761\t38.2\t27.2\t9.1\t24849\t326250\t0.4876\t93465\tObama\t93465\t0.009167714\t93465.0\n2070\t-120.69292800000001\t35.752964\tSan Miguel CDP\tCA\tCalifornia\tSan Luis Obispo County\t1686\t30.2\t11.5\t12.4\t17077\t202895\t0.4876\t93451\tObama\t93451\t0.0026829999999999996\t93451.0\n2071\t-120.490052\t35.030089000000004\tNipomo CDP\tCA\tCalifornia\tSan Luis Obispo County\t16137\t36.5\t19.3\t12.6\t23807\t311000\t0.4876\t93444\tObama\t93444\t0.025679466\t93444.0\n2072\t-120.62016100000001\t35.120461999999996\tGrover Beach city\tCA\tCalifornia\tSan Luis Obispo County\t13760\t35.7\t22.4\t12.3\t23928\t289838\t0.4876\t93433\tObama\t93433\t0.021896849\t93433.0\n2073\t-120.585171\t35.124238\tArroyo Grande city\tCA\tCalifornia\tSan Luis Obispo County\t17598\t44.8\t32.4\t11.4\t32098\t374781\t0.4876\t93420\tObama\t93420\t0.028004414\t93420.0\n2074\t-122.26791899999999\t37.498267999999996\tSan Carlos city\tCA\tCalifornia\tSan Mateo County\t28212\t43.4\t55.6\t8.5\t64560\t823648\t0.7213\t94070\tObama\t94070\t0.044894905\t94070.0\n2075\t-122.431723\t37.625491\tSan Bruno city\tCA\tCalifornia\tSan Mateo County\t42518\t38.5\t31.4\t9.3\t35532\t545858\t0.7213\t94066\tObama\t94066\t0.067660626\t94066.0\n2076\t-122.295575\t37.515487\tBelmont city\tCA\tCalifornia\tSan Mateo County\t25267\t42.2\t58.5\t9.7\t58396\t815016\t0.7213\t94002\tObama\t94002\t0.040208407\t94002.0\n2077\t-122.221295\t37.49558\tRedwood City\tCA\tCalifornia\tSan Mateo County\t77532\t36.2\t41.3\t10.1\t44746\t713041\t0.7213\t94063\tObama\t94063\t0.123379831\t94063.0\n2078\t-122.452326\t37.676615999999996\tColma town\tCA\tCalifornia\tSan Mateo County\t1453\t40.0\t17.1\t8.5\t26362\t464151\t0.7213\t94014\tObama\t94014\t0.002312218\t94014.0\n2079\t-122.43841499999999\t37.467808000000005\tHalf Moon Bay city\tCA\tCalifornia\tSan Mateo County\t12420\t39.6\t41.9\t11.2\t49919\t686393\t0.7213\t94019\tObama\t94019\t0.019764452\t94019.0\n2080\t-122.13530800000001\t37.467118\tEast Palo Alto city\tCA\tCalifornia\tSan Mateo County\t33322\t27.0\t14.8\t16.5\t17145\t457017\t0.7213\t94303\tObama\t94303\t0.053026656\t94303.0\n2081\t-122.402348\t37.599408000000004\tMillbrae city\tCA\tCalifornia\tSan Mateo County\t21562\t45.1\t39.4\t7.5\t43429\t784644\t0.7213\t94030\tObama\t94030\t0.034312489\t94030.0\n2082\t-122.36742199999999\t37.585909\tBurlingame city\tCA\tCalifornia\tSan Mateo County\t28596\t41.3\t54.8\t8.3\t59412\t863167\t0.7213\t94010\tObama\t94010\t0.04550598\t94010.0\n2083\t-122.266691\t37.555417999999996\tFoster City\tCA\tCalifornia\tSan Mateo County\t29724\t40.6\t66.3\t8.7\t62873\t768988\t0.7213\t94404\tObama\t94404\t0.047301012\t94404.0\n2084\t-122.46944599999999\t37.510563\tEl Granada CDP\tCA\tCalifornia\tSan Mateo County\t6088\t41.8\t55.6\t9.1\t65174\t744482\t0.7213\t94038\tObama\t94038\t0.009688081999999999\t94038.0\n2085\t-122.48133999999999\t37.691575\tBroadmoor CDP\tCA\tCalifornia\tSan Mateo County\t4277\t39.7\t36.2\t13.0\t30486\t471689\t0.7213\t94015\tObama\t94015\t0.006806164\t94015.0\n2086\t-122.51165900000001\t37.522215\tMoss Beach CDP\tCA\tCalifornia\tSan Mateo County\t2082\t45.2\t66.0\t8.1\t58530\t768555\t0.7213\t94038\tObama\t94038\t0.0033131709999999997\t94038.0\n2087\t-122.203174\t37.453835\tAtherton town\tCA\tCalifornia\tSan Mateo County\t7244\t45.8\t80.9\t8.2\t102067\t1000001\t0.7213\t94027\tObama\t94027\t0.011527672\t94027.0\n2088\t-122.162676\t37.473908\tMenlo Park city\tCA\tCalifornia\tSan Mateo County\t32263\t39.4\t64.3\t9.1\t68662\t874263\t0.7213\t94025\tObama\t94025\t0.051341425999999996\t94025.0\n2089\t-122.203479\t37.433931\tWest Menlo Park CDP\tCA\tCalifornia\tSan Mateo County\t3681\t43.1\t76.7\t10.6\t85819\t937378\t0.7213\t94027\tObama\t94027\t0.005857725\t94027.0\n2090\t-122.31237800000001\t37.551857\tSan Mateo city\tCA\tCalifornia\tSan Mateo County\t96738\t40.0\t44.3\t9.1\t47186\t668846\t0.7213\t94402\tObama\t94402\t0.153943121\t94402.0\n2091\t-122.203333\t37.475415999999996\tNorth Fair Oaks CDP\tCA\tCalifornia\tSan Mateo County\t15712\t30.0\t20.4\t15.2\t23399\t519654\t0.7213\t94063\tObama\t94063\t0.025003146\t94063.0\n2092\t-122.259616\t37.421977000000005\tWoodside town\tCA\tCalifornia\tSan Mateo County\t5406\t46.4\t72.8\t5.0\t101336\t1000001\t0.7213\t94062\tObama\t94062\t0.008602788\t94062.0\n2093\t-122.35866000000001\t37.557238\tHillsborough town\tCA\tCalifornia\tSan Mateo County\t10919\t46.8\t75.7\t7.2\t97488\t1000001\t0.7213\t94010\tObama\t94010\t0.01737585\t94010.0\n2094\t-122.344559\t37.522852\tHighlands-Baywood Park CDP\tCA\tCalifornia\tSan Mateo County\t4218\t46.2\t64.7\t8.9\t68730\t856588\t0.7213\t94402\tObama\t94402\t0.006712275\t94402.0\n2095\t-122.42251999999999\t37.654693\tSouth San Francisco city\tCA\tCalifornia\tSan Mateo County\t64193\t37.9\t31.1\t10.1\t31059\t525526\t0.7213\t94080\tObama\t94080\t0.102152936\t94080.0\n2096\t-122.220197\t37.371272999999995\tPortola Valley town\tCA\tCalifornia\tSan Mateo County\t4642\t49.7\t82.3\t6.4\t103371\t1000001\t0.7213\t94028\tObama\t94028\t0.007387004\t94028.0\n2097\t-122.40221799999999\t37.689565\tBrisbane city\tCA\tCalifornia\tSan Mateo County\t3670\t44.8\t44.8\t13.2\t46637\t564507\t0.7213\t94005\tObama\t94005\t0.005840221\t94005.0\n2098\t-122.49296799999999\t37.547938\tMontara CDP\tCA\tCalifornia\tSan Mateo County\t3066\t44.0\t56.8\t8.8\t64384\t677387\t0.7213\t94037\tObama\t94037\t0.004879051\t94037.0\n2099\t-122.478016\t37.611019\tPacifica city\tCA\tCalifornia\tSan Mateo County\t39240\t40.8\t39.5\t10.5\t38390\t560467\t0.7213\t94044\tObama\t94044\t0.062444211\t94044.0\n2100\t-122.47246899999999\t37.686265\tDaly City\tCA\tCalifornia\tSan Mateo County\t107289\t37.8\t34.9\t10.8\t28490\t484415\t0.7213\t94015\tObama\t94015\t0.170733357\t94015.0\n2101\t-122.267648\t37.466077\tEmerald Lake Hills CDP\tCA\tCalifornia\tSan Mateo County\t4094\t46.0\t63.5\t5.9\t84920\t904269\t0.7213\t94062\tObama\t94062\t0.006514949\t94062.0\n2102\t-119.801204\t34.446498999999996\tGoleta CDP\tCA\tCalifornia\tSanta Barbara County\t56810\t40.0\t42.4\t6.6\t35732\t640190\t0.5763\t93111\tObama\t93111\t0.090404068\t93111.0\n2103\t-120.47211000000001\t34.660773\tLompoc city\tCA\tCalifornia\tSanta Barbara County\t42505\t32.8\t16.1\t13.5\t20897\t223787\t0.5763\t93436\tObama\t93436\t0.067639938\t93436.0\n2104\t-119.589359\t34.425398\tSummerland CDP\tCA\tCalifornia\tSanta Barbara County\t1660\t45.2\t59.5\t7.9\t52396\t772727\t0.5763\t93067\tObama\t93067\t0.002641626\t93067.0\n2105\t-119.51226299999999\t34.396476\tCarpinteria city\tCA\tCalifornia\tSanta Barbara County\t14509\t36.7\t31.1\t6.9\t28672\t526240\t0.5763\t93013\tObama\t93013\t0.023088762999999998\t93013.0\n2106\t-119.556886\t34.423459\tToro Canyon CDP\tCA\tCalifornia\tSanta Barbara County\t1717\t47.1\t50.2\t4.9\t51070\t739130\t0.5763\t93013\tObama\t93013\t0.002732332\t93013.0\n2107\t-120.462502\t34.711276\tVandenberg Village CDP\tCA\tCalifornia\tSanta Barbara County\t6252\t49.7\t33.7\t8.2\t35680\t281168\t0.5763\t93436\tObama\t93436\t0.009949062\t93436.0\n2108\t-120.440694\t34.685928000000004\tMission Hills CDP\tCA\tCalifornia\tSanta Barbara County\t3320\t42.3\t32.1\t10.6\t33100\t233910\t0.5763\t93436\tObama\t93436\t0.005283251\t93436.0\n2109\t-120.19423300000001\t34.615521\tBuellton city\tCA\tCalifornia\tSanta Barbara County\t4958\t39.0\t22.5\t7.5\t29637\t431481\t0.5763\t93427\tObama\t93427\t0.007889867\t93427.0\n2110\t-119.859426\t34.416284000000005\tIsla Vista CDP\tCA\tCalifornia\tSanta Barbara County\t22243\t22.4\t41.8\t12.2\t14326\t573529\t0.5763\t931HH\tObama\t931HH\t0.035396192\t0.0\n2111\t-120.10136499999999\t34.611999\tSanta Ynez CDP\tCA\tCalifornia\tSanta Barbara County\t4763\t46.3\t41.8\t7.0\t42779\t673726\t0.5763\t93463\tObama\t93463\t0.0075795559999999994\t93463.0\n2112\t-119.628583\t34.438307\tMontecito CDP\tCA\tCalifornia\tSanta Barbara County\t9964\t48.0\t66.1\t7.1\t72213\t1000001\t0.5763\t93108\tObama\t93108\t0.015856119\t93108.0\n2113\t-120.27259\t34.735904999999995\tLos Alamos CDP\tCA\tCalifornia\tSanta Barbara County\t1543\t35.0\t26.4\t9.8\t28790\t430488\t0.5763\t93440\tObama\t93440\t0.002455439\t93440.0\n2114\t-120.437569\t34.934334\tSanta Maria city\tCA\tCalifornia\tSanta Barbara County\t84307\t30.0\t12.2\t12.1\t17062\t217353\t0.5763\t93458\tObama\t93458\t0.134161164\t93458.0\n2115\t-119.70913\t34.42877\tSanta Barbara city\tCA\tCalifornia\tSanta Barbara County\t90440\t37.2\t42.8\t7.7\t33721\t707506\t0.5763\t93101\tObama\t93101\t0.14392085699999999\t93101.0\n2116\t-120.518451\t34.748331\tVandenberg AFB CDP\tCA\tCalifornia\tSanta Barbara County\t5450\t23.5\t29.9\t12.3\t20223\t32308\t0.5763\t93437\tObama\t93437\t0.008672807\t93437.0\n2117\t-120.573191\t34.960004\tGuadalupe city\tCA\tCalifornia\tSanta Barbara County\t6354\t27.4\t5.2\t12.5\t15512\t184619\t0.5763\t93434\tObama\t93434\t0.010111379\t93434.0\n2118\t-119.712965\t34.453223\tMission Canyon CDP\tCA\tCalifornia\tSanta Barbara County\t2566\t48.0\t58.8\t8.6\t50553\t810909\t0.5763\t93101\tObama\t93101\t0.00408338\t93101.0\n2119\t-120.14074\t34.593059999999994\tSolvang city\tCA\tCalifornia\tSanta Barbara County\t5169\t44.2\t31.8\t5.9\t33504\t569773\t0.5763\t93463\tObama\t93463\t0.00822564\t93463.0\n2120\t-120.42737\t34.865618\tOrcutt CDP\tCA\tCalifornia\tSanta Barbara County\t29398\t43.0\t28.2\t9.9\t30696\t297329\t0.5763\t93455\tObama\t93455\t0.046782235\t93455.0\n2121\t-121.954507\t37.280738\tCampbell city\tCA\tCalifornia\tSanta Clara County\t39518\t38.2\t46.3\t11.4\t48437\t624298\t0.701\t95008\tObama\t95008\t0.062886604\t95008.0\n2122\t-122.09698\t37.369032000000004\tLos Altos city\tCA\tCalifornia\tSanta Clara County\t28491\t47.2\t76.2\t8.2\t93176\t1000001\t0.701\t94040\tObama\t94040\t0.045338889\t94040.0\n2123\t-122.17578200000001\t37.388697\tPalo Alto city\tCA\tCalifornia\tSanta Clara County\t61247\t43.0\t79.2\t8.2\t79043\t889371\t0.701\t94304\tObama\t94304\t0.097464847\t94304.0\n2124\t-121.86479399999999\t37.311421\tSan Jose city\tCA\tCalifornia\tSanta Clara County\t973001\t34.6\t35.8\t12.5\t35995\t538259\t0.701\t95113\tObama\t95113\t1.548376137\t95113.0\n2125\t-121.891829\t37.434044\tMilpitas city\tCA\tCalifornia\tSanta Clara County\t69114\t35.5\t40.6\t11.9\t37656\t524906\t0.701\t95035\tObama\t95035\t0.109983924\t95035.0\n2126\t-121.92876299999999\t37.256322999999995\tCambrian Park CDP\tCA\tCalifornia\tSanta Clara County\t3323\t41.0\t35.8\t14.6\t46443\t613703\t0.701\t95124\tObama\t95124\t0.005288025\t95124.0\n2127\t-121.824623\t37.369836\tAlum Rock CDP\tCA\tCalifornia\tSanta Clara County\t14459\t29.9\t11.9\t13.1\t21180\t402402\t0.701\t95127\tObama\t95127\t0.023009196000000003\t95127.0\n2128\t-121.837651\t37.285855\tSeven Trees CDP\tCA\tCalifornia\tSanta Clara County\t1843\t30.9\t17.8\t16.7\t17922\t419048\t0.701\t95111\tObama\t95111\t0.002932841\t95111.0\n2129\t-122.16736000000002\t37.425251\tStanford CDP\tCA\tCalifornia\tSanta Clara County\t15035\t23.1\t95.6\t11.4\t36448\t827360\t0.701\t94305\tObama\t94305\t0.023925808\t94305.0\n2130\t-122.079549\t37.400217\tMountain View city\tCA\tCalifornia\tSanta Clara County\t74727\t36.6\t61.4\t10.2\t55251\t681692\t0.701\t94043\tObama\t94043\t0.11891612\t94043.0\n2131\t-121.81353\t37.382413\tEast Foothills CDP\tCA\tCalifornia\tSanta Clara County\t8523\t41.7\t42.4\t14.6\t50088\t624537\t0.701\t95127\tObama\t95127\t0.013562997\t95127.0\n2132\t-121.987902\t37.240722\tMonte Sereno city\tCA\tCalifornia\tSanta Clara County\t3599\t46.8\t74.4\t9.6\t87474\t1000001\t0.701\t95030\tObama\t95030\t0.005727235\t95030.0\n2133\t-121.90871100000001\t37.324718\tSunol-Midtown CDP\tCA\tCalifornia\tSanta Clara County\t798\t29.4\t22.1\t11.6\t18963\t422727\t0.701\t95126\tObama\t95126\t0.00126989\t95126.0\n2134\t-122.04610100000001\t37.316684\tCupertino city\tCA\tCalifornia\tSanta Clara County\t53711\t41.0\t70.7\t9.5\t63107\t840741\t0.701\t95014\tObama\t95014\t0.085472503\t95014.0\n2135\t-121.594434\t37.089117\tSan Martin CDP\tCA\tCalifornia\tSanta Clara County\t4527\t39.0\t23.0\t21.7\t39944\t748299\t0.701\t95046\tObama\t95046\t0.007204\t95046.0\n2136\t-121.93569199999999\t37.311887\tFruitdale CDP\tCA\tCalifornia\tSanta Clara County\t920\t36.8\t49.8\t13.4\t39652\t578390\t0.701\t95128\tObama\t95128\t0.0014640329999999998\t95128.0\n2137\t-121.930476\t37.321145\tBurbank CDP\tCA\tCalifornia\tSanta Clara County\t5489\t34.7\t26.0\t9.9\t30405\t436100\t0.701\t95128\tObama\t95128\t0.008734869000000001\t95128.0\n2138\t-121.583896\t37.004695\tGilroy city\tCA\tCalifornia\tSanta Clara County\t48584\t30.9\t23.0\t14.5\t29613\t478964\t0.701\t95020\tObama\t95020\t0.077313699\t95020.0\n2139\t-121.988932\t37.161726\tLexington Hills CDP\tCA\tCalifornia\tSanta Clara County\t2527\t44.5\t64.5\t7.9\t80707\t651820\t0.701\t95033\tObama\t95033\t0.004021318\t95033.0\n2140\t-122.09893600000001\t37.349207\tLoyola CDP\tCA\tCalifornia\tSanta Clara County\t3585\t46.9\t76.7\t8.3\t93802\t1000001\t0.701\t94024\tObama\t94024\t0.005704956999999999\t94024.0\n2141\t-122.024827\t37.268195\tSaratoga city\tCA\tCalifornia\tSanta Clara County\t31374\t47.3\t73.6\t8.4\t85046\t1000001\t0.701\t95070\tObama\t95070\t0.049926725\t95070.0\n2142\t-121.96795900000001\t37.364628\tSanta Clara city\tCA\tCalifornia\tSanta Clara County\t114812\t35.7\t48.7\t11.3\t43898\t563851\t0.701\t95050\tObama\t95050\t0.182705014\t95050.0\n2143\t-121.642774\t37.131510999999996\tMorgan Hill city\tCA\tCalifornia\tSanta Clara County\t38483\t35.1\t36.8\t12.8\t47079\t613802\t0.701\t95037\tObama\t95037\t0.061239565999999995\t95037.0\n2144\t-121.96126799999999\t37.230985\tLos Gatos town\tCA\tCalifornia\tSanta Clara County\t30028\t44.4\t64.3\t9.2\t81394\t864827\t0.701\t95032\tObama\t95032\t0.04778478\t95032.0\n2145\t-122.14013700000001\t37.367977\tLos Altos Hills town\tCA\tCalifornia\tSanta Clara County\t8071\t49.0\t81.7\t8.9\t102711\t1000001\t0.701\t94022\tObama\t94022\t0.012843711\t94022.0\n2146\t-121.91655\t37.321372\tBuena Vista CDP\tCA\tCalifornia\tSanta Clara County\t1697\t28.5\t14.1\t15.3\t17662\t382692\t0.701\t95126\tObama\t95126\t0.002700505\t95126.0\n2147\t-122.02554199999999\t37.383437\tSunnyvale city\tCA\tCalifornia\tSanta Clara County\t140660\t36.6\t56.5\t10.6\t50003\t638480\t0.701\t94086\tObama\t94086\t0.223837989\t94086.0\n2148\t-121.98035700000001\t36.986767\tLive Oak CDP\tCA\tCalifornia\tSanta Cruz County\t16524\t38.4\t35.1\t7.4\t29618\t468674\t0.7561\t95062\tObama\t95062\t0.026295314\t95062.0\n2149\t-121.95488999999999\t36.988803000000004\tSoquel CDP\tCA\tCalifornia\tSanta Cruz County\t4931\t40.3\t39.6\t7.2\t36487\t447011\t0.7561\t95010\tObama\t95010\t0.007846901\t95010.0\n2150\t-121.89543300000001\t36.989101\tAptos CDP\tCA\tCalifornia\tSanta Cruz County\t9046\t44.9\t49.4\t5.4\t42785\t593674\t0.7561\t95003\tObama\t95003\t0.014395268000000001\t95003.0\n2151\t-122.084974\t37.079845\tBen Lomond CDP\tCA\tCalifornia\tSanta Cruz County\t2323\t39.5\t39.4\t5.7\t34555\t454545\t0.7561\t95005\tObama\t95005\t0.003696685\t95005.0\n2152\t-121.85720400000001\t37.025318\tDay Valley CDP\tCA\tCalifornia\tSanta Cruz County\t3702\t44.4\t48.2\t6.8\t40863\t667208\t0.7561\t95003\tObama\t95003\t0.005891143000000001\t95003.0\n2153\t-122.011976\t37.055493\tScotts Valley city\tCA\tCalifornia\tSanta Cruz County\t11377\t42.4\t49.2\t6.3\t45554\t603729\t0.7561\t95066\tObama\t95066\t0.018104684\t95066.0\n2154\t-121.736276\t36.950414\tInterlaken CDP\tCA\tCalifornia\tSanta Cruz County\t7754\t29.9\t12.4\t15.0\t18690\t396316\t0.7561\t95076\tObama\t95076\t0.012339256000000002\t95076.0\n2155\t-122.05116699999999\t37.050345\tFelton CDP\tCA\tCalifornia\tSanta Cruz County\t1031\t36.9\t58.4\t3.4\t28637\t481481\t0.7561\t95041\tObama\t95041\t0.0016406720000000001\t95041.0\n2156\t-121.833898\t36.960741999999996\tAptos Hills-Larkin Valley CDP\tCA\tCalifornia\tSanta Cruz County\t2543\t46.8\t45.6\t5.4\t44098\t739516\t0.7561\t95019\tObama\t95019\t0.00404678\t95019.0\n2157\t-121.80197700000001\t36.939566\tFreedom CDP\tCA\tCalifornia\tSanta Cruz County\t6453\t30.0\t9.5\t13.6\t18177\t351287\t0.7561\t95019\tObama\t95019\t0.010268922\t95019.0\n2158\t-121.789194\t36.994025\tCorralitos CDP\tCA\tCalifornia\tSanta Cruz County\t2455\t44.1\t42.6\t4.2\t38250\t574198\t0.7561\t95019\tObama\t95019\t0.003906742\t95019.0\n2159\t-122.03421499999999\t36.978730999999996\tSanta Cruz city\tCA\tCalifornia\tSanta Cruz County\t54790\t33.4\t50.7\t8.1\t35884\t622918\t0.7561\t95060\tObama\t95060\t0.087189559\t95060.0\n2160\t-121.88089199999999\t36.960944\tRio del Mar CDP\tCA\tCalifornia\tSanta Cruz County\t9029\t46.8\t60.8\t6.4\t54424\t690943\t0.7561\t95003\tObama\t95003\t0.014368216000000001\t95003.0\n2161\t-121.95397\t36.977304\tCapitola city\tCA\tCalifornia\tSanta Cruz County\t9937\t41.0\t41.3\t5.9\t36623\t491830\t0.7561\t95010\tObama\t95010\t0.015813153\t95010.0\n2162\t-121.78057199999999\t36.958395\tAmesti CDP\tCA\tCalifornia\tSanta Cruz County\t2477\t35.8\t23.4\t13.8\t25921\t396639\t0.7561\t95019\tObama\t95019\t0.003941750999999999\t95019.0\n2163\t-121.76994099999999\t36.920111\tWatsonville city\tCA\tCalifornia\tSanta Cruz County\t49277\t28.1\t11.5\t15.8\t16390\t316926\t0.7561\t95076\tObama\t95076\t0.078416498\t95076.0\n2164\t-122.123737\t37.138487\tBoulder Creek CDP\tCA\tCalifornia\tSanta Cruz County\t4053\t42.8\t37.9\t10.0\t46544\t436889\t0.7561\t95006\tObama\t95006\t0.0064497040000000005\t95006.0\n2165\t-121.98937099999999\t36.964937\tTwin Lakes CDP\tCA\tCalifornia\tSanta Cruz County\t5595\t34.6\t37.8\t7.2\t36326\t548206\t0.7561\t95062\tObama\t95062\t0.008903550999999999\t95062.0\n2166\t-121.97136100000002\t36.961894\tOpal Cliffs CDP\tCA\tCalifornia\tSanta Cruz County\t6433\t40.4\t38.3\t7.5\t34477\t516575\t0.7561\t95062\tObama\t95062\t0.010237095\t95062.0\n2167\t-122.286302\t40.390049\tCottonwood CDP\tCA\tCalifornia\tShasta County\t3412\t34.8\t12.1\t18.0\t16252\t162171\t0.3382\t96022\tObama\t96022\t0.005429655\t96022.0\n2168\t-122.169643\t40.557503999999994\tMillville CDP\tCA\tCalifornia\tShasta County\t666\t49.3\t23.7\t16.0\t24214\t290217\t0.3382\t96073\tObama\t96073\t0.001059833\t96073.0\n2169\t-121.669926\t40.884914\tBurney CDP\tCA\tCalifornia\tShasta County\t3495\t44.5\t12.9\t20.2\t17983\t143483\t0.3382\t96013\tObama\t96013\t0.005561735999999999\t96013.0\n2170\t-122.23629299999999\t40.551207\tPalo Cedro CDP\tCA\tCalifornia\tShasta County\t1385\t46.5\t34.5\t16.6\t27824\t263187\t0.3382\t96073\tObama\t96073\t0.002204007\t96073.0\n2171\t-121.92151799999999\t40.841536\tMontgomery Creek CDP\tCA\tCalifornia\tShasta County\t113\t45.5\t15.9\t25.5\t17495\t187500\t0.3382\t96065\tObama\t96065\t0.000179822\t96065.0\n2172\t-121.859844\t40.503428\tShingletown CDP\tCA\tCalifornia\tShasta County\t2583\t52.2\t16.3\t19.9\t21158\t208429\t0.3382\t96088\tObama\t96088\t0.004110433\t96088.0\n2173\t-121.92404199999999\t41.010767\tBig Bend CDP\tCA\tCalifornia\tShasta County\t175\t45.8\t16.5\t26.4\t17153\t200000\t0.3382\t96011\tObama\t96011\t0.000278485\t96011.0\n2174\t-122.406598\t40.901143\tLakehead-Lakeshore CDP\tCA\tCalifornia\tShasta County\t682\t55.9\t15.5\t18.8\t25572\t234028\t0.3382\t96051\tObama\t96051\t0.0010852939999999999\t96051.0\n2175\t-121.40669\t41.041644\tMcArthur CDP\tCA\tCalifornia\tShasta County\t424\t46.9\t13.7\t29.0\t18046\t169318\t0.3382\t96028\tObama\t96028\t0.000674728\t96028.0\n2176\t-122.295596\t40.450716\tAnderson city\tCA\tCalifornia\tShasta County\t10254\t34.8\t9.1\t20.4\t15380\t145387\t0.3382\t96007\tObama\t96007\t0.016317608\t96007.0\n2177\t-122.37743300000001\t40.67893\tShasta Lake city\tCA\tCalifornia\tShasta County\t10733\t37.6\t8.1\t20.6\t16250\t148016\t0.3382\t96019\tObama\t96019\t0.01707986\t96019.0\n2178\t-122.36760500000001\t40.570824\tRedding city\tCA\tCalifornia\tShasta County\t89828\t38.3\t22.4\t16.7\t22273\t196564\t0.3382\t96002\tObama\t96002\t0.142946956\t96002.0\n2179\t-122.631199\t40.71615\tFrench Gulch CDP\tCA\tCalifornia\tShasta County\t282\t48.9\t20.3\t17.9\t19380\t169643\t0.3382\t96033\tObama\t96033\t0.00044875800000000006\t96033.0\n2180\t-121.439959\t41.007115\tFall River Mills CDP\tCA\tCalifornia\tShasta County\t761\t38.4\t15.7\t15.8\t21917\t140196\t0.3382\t96028\tObama\t96028\t0.00121101\t96028.0\n2181\t-121.93756499999999\t40.800457\tRound Mountain CDP\tCA\tCalifornia\tShasta County\t143\t45.5\t16.5\t24.6\t18050\t193750\t0.3382\t96084\tObama\t96084\t0.000227562\t96084.0\n2182\t-120.244952\t39.676924\tLoyalton city\tCA\tCalifornia\tSierra County\t793\t44.9\t14.2\t11.0\t21357\t153906\t0.3638\t96118\tObama\t96118\t0.001261933\t96118.0\n2183\t-122.918599\t41.546975\tGreenview CDP\tCA\tCalifornia\tSiskiyou County\t214\t47.5\t26.3\t13.5\t22473\t221875\t0.4041\t96037\tObama\t96037\t0.00034054699999999996\t96037.0\n2184\t-122.55982900000001\t41.908033\tHornbrook CDP\tCA\tCalifornia\tSiskiyou County\t291\t54.8\t15.0\t21.4\t22978\t162500\t0.4041\t96044\tObama\t96044\t0.00046308\t96044.0\n2185\t-121.92054499999999\t41.964349\tDorris city\tCA\tCalifornia\tSiskiyou County\t905\t39.6\t8.5\t14.7\t13815\t109926\t0.4041\t96023\tObama\t96023\t0.001440163\t96023.0\n2186\t-122.52152199999999\t41.513774\tGazelle CDP\tCA\tCalifornia\tSiskiyou County\t140\t44.4\t13.4\t12.1\t16328\t160417\t0.4041\t96038\tObama\t96038\t0.000222788\t96038.0\n2187\t-122.38181399999999\t41.413283\tWeed city\tCA\tCalifornia\tSiskiyou County\t3106\t36.2\t9.2\t17.9\t17524\t132004\t0.4041\t96094\tObama\t96094\t0.004942704\t96094.0\n2188\t-122.52608000000001\t41.640409000000005\tGrenada CDP\tCA\tCalifornia\tSiskiyou County\t361\t44.8\t12.7\t11.9\t16340\t156667\t0.4041\t96038\tObama\t96038\t0.0005744740000000001\t96038.0\n2189\t-122.323213\t41.323307\tMount Shasta city\tCA\tCalifornia\tSiskiyou County\t3540\t45.4\t30.5\t10.3\t23786\t228416\t0.4041\t96067\tObama\t96067\t0.005633346\t96067.0\n2190\t-122.136104\t41.254107\tMcCloud CDP\tCA\tCalifornia\tSiskiyou County\t1338\t51.0\t15.9\t18.1\t19269\t167330\t0.4041\t96057\tObama\t96057\t0.002129214\t96057.0\n2191\t-122.894373\t41.458451000000004\tEtna city\tCA\tCalifornia\tSiskiyou County\t780\t47.8\t19.3\t12.1\t19729\t167230\t0.4041\t96027\tObama\t96027\t0.001241246\t96027.0\n2192\t-122.36355400000001\t41.446719\tCarrick CDP\tCA\tCalifornia\tSiskiyou County\t150\t49.6\t28.9\t11.6\t21834\t195000\t0.4041\t96094\tObama\t96094\t0.000238701\t96094.0\n2193\t-122.27826\t41.232015999999994\tDunsmuir city\tCA\tCalifornia\tSiskiyou County\t1688\t47.0\t12.1\t15.3\t18348\t154087\t0.4041\t96025\tObama\t96025\t0.002686183\t96025.0\n2194\t-122.008154\t41.785377000000004\tMount Hebron CDP\tCA\tCalifornia\tSiskiyou County\t94\t40.4\t8.1\t15.0\t13802\t108333\t0.4041\t96058\tObama\t96058\t0.000149586\t96058.0\n2195\t-122.841284\t41.607951\tFort Jones city\tCA\tCalifornia\tSiskiyou County\t679\t49.8\t19.9\t15.5\t20346\t195000\t0.4041\t96032\tObama\t96032\t0.00108052\t96032.0\n2196\t-122.530892\t41.727616999999995\tMontague city\tCA\tCalifornia\tSiskiyou County\t1541\t48.2\t12.8\t12.9\t16570\t154286\t0.4041\t96097\tObama\t96097\t0.002452256\t96097.0\n2197\t-122.426526\t41.462064\tEdgewood CDP\tCA\tCalifornia\tSiskiyou County\t84\t54.7\t37.3\t12.5\t28386\t325000\t0.4041\t96094\tObama\t96094\t0.000133673\t96094.0\n2198\t-122.005807\t41.825571000000004\tMacdoel CDP\tCA\tCalifornia\tSiskiyou County\t143\t39.2\t8.4\t15.0\t13813\t112500\t0.4041\t96058\tObama\t96058\t0.000227562\t96058.0\n2199\t-121.914778\t41.582021000000005\tTennant CDP\tCA\tCalifornia\tSiskiyou County\t63\t51.3\t16.7\t18.5\t19220\t170000\t0.4041\t96058\tObama\t96058\t0.00010025399999999999\t96058.0\n2200\t-121.47506499999999\t41.953162\tTulelake city\tCA\tCalifornia\tSiskiyou County\t906\t34.6\t13.4\t19.7\t15150\t88529\t0.4041\t96134\tObama\t96134\t0.001441755\t96134.0\n2201\t-122.63128300000001\t41.729149\tYreka city\tCA\tCalifornia\tSiskiyou County\t7492\t43.2\t20.1\t13.1\t20872\t164974\t0.4041\t96097\tObama\t96097\t0.011922325\t96097.0\n2202\t-122.23366499999999\t38.113248\tVallejo city\tCA\tCalifornia\tSolano County\t120381\t35.6\t23.3\t15.2\t25154\t202868\t0.6349\t94590\tObama\t94590\t0.19156719\t94590.0\n2203\t-122.161988\t38.259859999999996\tGreen Valley CDP\tCA\tCalifornia\tSolano County\t1916\t43.2\t47.1\t12.0\t54676\t565476\t0.6349\t94585\tObama\t94585\t0.003049009\t94585.0\n2204\t-122.01001299999999\t38.246733\tSuisun City\tCA\tCalifornia\tSolano County\t28025\t33.7\t18.7\t13.7\t25422\t200155\t0.6349\t94533\tObama\t94533\t0.044597324\t94533.0\n2205\t-122.04159299999999\t38.254159\tFairfield city\tCA\tCalifornia\tSolano County\t104162\t32.6\t23.1\t13.7\t27371\t221967\t0.6349\t94533\tObama\t94533\t0.165757235\t94533.0\n2206\t-121.90759399999999\t38.352084999999995\tElmira CDP\tCA\tCalifornia\tSolano County\t233\t43.5\t12.1\t13.5\t23242\t162500\t0.6349\t95625\tObama\t95625\t0.00037078199999999995\t95625.0\n2207\t-121.970425\t38.359746\tVacaville city\tCA\tCalifornia\tSolano County\t95747\t35.0\t21.5\t11.3\t28636\t219518\t0.6349\t95687\tObama\t95687\t0.152366102\t95687.0\n2208\t-122.15427\t38.070347\tBenicia city\tCA\tCalifornia\tSolano County\t27231\t41.4\t39.5\t10.7\t37723\t332477\t0.6349\t94510\tObama\t94510\t0.043333800000000006\t94510.0\n2209\t-121.8282\t38.453101000000004\tDixon city\tCA\tCalifornia\tSolano County\t17380\t32.1\t19.6\t11.8\t24816\t213067\t0.6349\t95620\tObama\t95620\t0.027657502\t95620.0\n2210\t-121.70300800000001\t38.176479\tRio Vista city\tCA\tCalifornia\tSolano County\t6493\t41.7\t18.1\t11.9\t27865\t198576\t0.6349\t94571\tObama\t94571\t0.010332575\t94571.0\n2211\t-122.629878\t38.244126\tPetaluma city\tCA\tCalifornia\tSonoma County\t57659\t39.6\t33.0\t11.2\t37096\t414998\t0.711\t94954\tObama\t94954\t0.091755116\t94954.0\n2212\t-122.46010700000001\t38.290853999999996\tSonoma city\tCA\tCalifornia\tSonoma County\t9438\t49.7\t40.2\t10.2\t43059\t465915\t0.711\t95476\tObama\t95476\t0.015019073999999999\t95476.0\n2213\t-122.73350400000001\t38.422360999999995\tRoseland CDP\tCA\tCalifornia\tSonoma County\t6624\t28.7\t9.9\t15.0\t18070\t254867\t0.711\t95407\tObama\t95407\t0.010541041000000001\t95407.0\n2214\t-122.541486\t38.356237\tGlen Ellen CDP\tCA\tCalifornia\tSonoma County\t921\t41.6\t49.0\t14.0\t32318\t547619\t0.711\t95442\tObama\t95442\t0.001465625\t95442.0\n2215\t-122.486623\t38.321504\tFetters Hot Springs-Agua Caliente CDP\tCA\tCalifornia\tSonoma County\t2508\t36.3\t22.8\t13.5\t23474\t291176\t0.711\t95431\tObama\t95431\t0.003991083\t95431.0\n2216\t-123.01366000000002\t38.467121999999996\tMonte Rio CDP\tCA\tCalifornia\tSonoma County\t1094\t46.4\t33.7\t17.3\t37225\t242819\t0.711\t95462\tObama\t95462\t0.0017409270000000002\t95462.0\n2217\t-122.901946\t38.481021999999996\tForestville CDP\tCA\tCalifornia\tSonoma County\t2408\t46.2\t44.0\t8.6\t38792\t328750\t0.711\t95436\tObama\t95436\t0.0038319490000000003\t95436.0\n2218\t-123.02731100000001\t38.325524\tBodega Bay CDP\tCA\tCalifornia\tSonoma County\t1420\t58.0\t50.0\t9.8\t50487\t640027\t0.711\t94923\tObama\t94923\t0.002259704\t94923.0\n2219\t-122.491533\t38.297472\tEl Verano CDP\tCA\tCalifornia\tSonoma County\t3705\t37.7\t26.4\t13.8\t31018\t393169\t0.711\t95476\tObama\t95476\t0.005895917\t95476.0\n2220\t-122.804703\t38.543941\tWindsor town\tCA\tCalifornia\tSonoma County\t24623\t36.9\t28.0\t10.3\t32634\t367091\t0.711\t95492\tObama\t95492\t0.039183583\t95492.0\n2221\t-122.93496999999999\t38.400446\tOccidental CDP\tCA\tCalifornia\tSonoma County\t1255\t44.2\t48.8\t13.1\t38548\t488636\t0.711\t95419\tObama\t95419\t0.001997133\t95419.0\n2222\t-122.48875\t38.312669\tBoyes Hot Springs CDP\tCA\tCalifornia\tSonoma County\t6547\t32.8\t24.0\t11.0\t24847\t338576\t0.711\t95476\tObama\t95476\t0.010418508\t95476.0\n2223\t-122.50645\t38.333737\tEldridge CDP\tCA\tCalifornia\tSonoma County\t1500\t39.3\t27.6\t9.2\t39295\t478205\t0.711\t95431\tObama\t95431\t0.002387011\t95431.0\n2224\t-122.751126\t38.51357\tLarkfield-Wikiup CDP\tCA\tCalifornia\tSonoma County\t8047\t42.1\t36.9\t10.1\t36755\t424499\t0.711\t95439\tObama\t95439\t0.012805519\t95439.0\n2225\t-122.698025\t38.347921\tRohnert Park city\tCA\tCalifornia\tSonoma County\t42353\t32.6\t28.1\t11.6\t29293\t313179\t0.711\t94928\tObama\t94928\t0.067398055\t94928.0\n2226\t-122.866042\t38.437463\tGraton CDP\tCA\tCalifornia\tSonoma County\t1856\t41.7\t37.8\t11.5\t35201\t444253\t0.711\t95444\tObama\t95444\t0.002953528\t95444.0\n2227\t-122.827818\t38.399919\tSebastopol city\tCA\tCalifornia\tSonoma County\t7552\t44.5\t38.9\t10.4\t32376\t445667\t0.711\t95472\tObama\t95472\t0.012017805\t95472.0\n2228\t-123.01829099999999\t38.798705\tCloverdale city\tCA\tCalifornia\tSonoma County\t8128\t40.0\t18.0\t13.7\t23996\t284509\t0.711\t95425\tObama\t95425\t0.012934418\t95425.0\n2229\t-122.70907199999999\t38.327822999999995\tCotati city\tCA\tCalifornia\tSonoma County\t6471\t35.6\t25.3\t11.7\t31629\t313565\t0.711\t94931\tObama\t94931\t0.010297566\t94931.0\n2230\t-122.698776\t38.44958\tSanta Rosa city\tCA\tCalifornia\tSonoma County\t157826\t37.8\t29.9\t11.8\t32508\t340493\t0.711\t95404\tObama\t95404\t0.251154944\t95404.0\n2231\t-122.49956\t38.257236999999996\tTemelec CDP\tCA\tCalifornia\tSonoma County\t1454\t71.0\t38.3\t17.5\t40696\t325420\t0.711\t95476\tObama\t95476\t0.002313809\t95476.0\n2232\t-122.98566799999999\t38.509932\tGuerneville CDP\tCA\tCalifornia\tSonoma County\t2603\t44.1\t30.7\t13.8\t29671\t292623\t0.711\t95471\tObama\t95471\t0.00414226\t95471.0\n2233\t-122.864364\t38.620237\tHealdsburg city\tCA\tCalifornia\tSonoma County\t10923\t38.3\t31.0\t12.8\t28508\t379277\t0.711\t95448\tObama\t95448\t0.017382215\t95448.0\n2234\t-121.086079\t37.714488\tSalida CDP\tCA\tCalifornia\tStanislaus County\t14289\t29.6\t15.1\t16.3\t22291\t191651\t0.5003\t95368\tObama\t95368\t0.022738667999999997\t95368.0\n2235\t-120.982353\t37.619575\tBystrom CDP\tCA\tCalifornia\tStanislaus County\t4712\t29.5\t4.8\t35.0\t13136\t110116\t0.5003\t95351\tObama\t95351\t0.007498398000000001\t95351.0\n2236\t-120.98848600000001\t37.612663\tShackelford CDP\tCA\tCalifornia\tStanislaus County\t5361\t27.3\t3.6\t34.9\t10807\t100629\t0.5003\t95351\tObama\t95351\t0.008531178\t95351.0\n2237\t-121.210853\t37.552879\tWestley CDP\tCA\tCalifornia\tStanislaus County\t755\t28.4\t4.1\t26.7\t11759\t129167\t0.5003\t95387\tObama\t95387\t0.001201462\t95387.0\n2238\t-121.022444\t37.314671000000004\tNewman city\tCA\tCalifornia\tStanislaus County\t8258\t28.9\t10.6\t22.6\t17315\t142259\t0.5003\t95360\tObama\t95360\t0.013141291999999999\t95360.0\n2239\t-121.042278\t37.602807\tRiverdale Park CDP\tCA\tCalifornia\tStanislaus County\t1165\t33.1\t3.4\t32.7\t13845\t113000\t0.5003\t95358\tObama\t95358\t0.001853912\t95358.0\n2240\t-120.79936299999999\t37.526064\tDenair CDP\tCA\tCalifornia\tStanislaus County\t4212\t37.7\t15.6\t13.5\t23479\t163681\t0.5003\t95316\tObama\t95316\t0.0067027269999999995\t95316.0\n2241\t-120.850866\t37.763202\tOakdale city\tCA\tCalifornia\tStanislaus County\t18659\t35.6\t12.6\t18.0\t20762\t160622\t0.5003\t95361\tObama\t95361\t0.029692827\t95361.0\n2242\t-120.751323\t37.626453000000005\tHickman CDP\tCA\tCalifornia\tStanislaus County\t542\t40.5\t16.5\t17.2\t18334\t206818\t0.5003\t95386\tObama\t95386\t0.000862507\t95386.0\n2243\t-121.010646\t37.743059\tDel Rio CDP\tCA\tCalifornia\tStanislaus County\t1279\t47.3\t50.7\t8.2\t61802\t766204\t0.5003\t95356\tObama\t95356\t0.002035325\t95356.0\n2244\t-120.95907\t37.595729\tCeres city\tCA\tCalifornia\tStanislaus County\t40552\t29.6\t8.6\t22.9\t17090\t151939\t0.5003\t95307\tObama\t95307\t0.06453205\t95307.0\n2245\t-120.804355\t37.783743\tEast Oakdale CDP\tCA\tCalifornia\tStanislaus County\t3279\t45.2\t25.7\t13.6\t42729\t377293\t0.5003\t95361\tObama\t95361\t0.005218006\t95361.0\n2246\t-120.864804\t37.600451\tHughson city\tCA\tCalifornia\tStanislaus County\t6035\t31.4\t8.6\t17.8\t18422\t155379\t0.5003\t95326\tObama\t95326\t0.009603740999999999\t95326.0\n2247\t-120.90884199999999\t37.561844\tKeyes CDP\tCA\tCalifornia\tStanislaus County\t5525\t28.6\t4.0\t25.4\t14545\t108375\t0.5003\t95328\tObama\t95328\t0.008792158000000001\t95328.0\n2248\t-120.94203300000001\t37.727371999999995\tRiverbank city\tCA\tCalifornia\tStanislaus County\t18759\t31.6\t14.9\t23.8\t19277\t156837\t0.5003\t95367\tObama\t95367\t0.029851961\t95367.0\n2249\t-120.988629\t37.661419\tModesto city\tCA\tCalifornia\tStanislaus County\t209129\t33.3\t18.5\t18.0\t21344\t167355\t0.5003\t95354\tObama\t95354\t0.332795499\t95354.0\n2250\t-120.855066\t37.504944\tTurlock city\tCA\tCalifornia\tStanislaus County\t63848\t31.7\t21.5\t16.6\t20198\t169280\t0.5003\t95380\tObama\t95380\t0.101603924\t95380.0\n2251\t-120.76146399999999\t37.64079\tWaterford city\tCA\tCalifornia\tStanislaus County\t8904\t29.3\t10.9\t18.8\t16257\t134862\t0.5003\t95386\tObama\t95386\t0.014169298\t95386.0\n2252\t-121.18288899999999\t37.579802\tGrayson CDP\tCA\tCalifornia\tStanislaus County\t1169\t28.5\t8.2\t33.3\t15723\t113603\t0.5003\t95387\tObama\t95387\t0.001860277\t95387.0\n2253\t-121.015397\t37.602315000000004\tBret Harte CDP\tCA\tCalifornia\tStanislaus County\t5448\t24.8\t3.3\t26.6\t10177\t107456\t0.5003\t95351\tObama\t95351\t0.008669624\t95351.0\n2254\t-121.037323\t37.616918\tWest Modesto CDP\tCA\tCalifornia\tStanislaus County\t6375\t28.0\t5.3\t29.4\t12577\t109077\t0.5003\t95358\tObama\t95358\t0.010144796999999999\t95358.0\n2255\t-120.904619\t37.643173\tEmpire CDP\tCA\tCalifornia\tStanislaus County\t4159\t32.3\t6.6\t26.9\t14802\t113889\t0.5003\t953HH\tObama\t953HH\t0.0066183859999999995\t0.0\n2256\t-121.137922\t37.471692\tPatterson city\tCA\tCalifornia\tStanislaus County\t20586\t29.8\t10.4\t17.5\t18050\t174482\t0.5003\t95363\tObama\t95363\t0.032759341000000004\t95363.0\n2257\t-121.625598\t39.135296000000004\tYuba City\tCA\tCalifornia\tSutter County\t44246\t32.9\t17.2\t15.8\t19631\t170364\t0.39299999999999996\t95991\tObama\t95991\t0.07041046299999999\t95991.0\n2258\t-121.672926\t39.156055\tTierra Buena CDP\tCA\tCalifornia\tSutter County\t6197\t40.7\t20.7\t11.9\t25851\t207584\t0.39299999999999996\t95993\tObama\t95993\t0.009861539\t95993.0\n2259\t-121.749265\t39.155636\tSutter CDP\tCA\tCalifornia\tSutter County\t3320\t36.3\t19.5\t15.6\t18277\t169643\t0.39299999999999996\t95982\tObama\t95982\t0.005283251\t95982.0\n2260\t-121.64272\t39.11261\tSouth Yuba City CDP\tCA\tCalifornia\tSutter County\t15631\t35.7\t22.0\t12.4\t24272\t189568\t0.39299999999999996\t95991\tObama\t95991\t0.024874247000000002\t95991.0\n2261\t-121.66493999999999\t39.273994\tLive Oak city\tCA\tCalifornia\tSutter County\t8040\t31.0\t6.7\t23.9\t12201\t128718\t0.39299999999999996\t95953\tObama\t95953\t0.01279438\t95953.0\n2262\t-121.853893\t40.420246\tManton CDP\tCA\tCalifornia\tTehama County\t421\t48.4\t14.1\t26.3\t18410\t166406\t0.3453\t96059\tObama\t96059\t0.000669954\t96059.0\n2263\t-122.12687199999999\t40.021786\tTehama city\tCA\tCalifornia\tTehama County\t526\t41.3\t8.0\t19.6\t17748\t178261\t0.3453\t96090\tObama\t96090\t0.000837045\t96090.0\n2264\t-121.56934299999999\t40.37547\tMineral CDP\tCA\tCalifornia\tTehama County\t162\t48.3\t14.3\t26.7\t18393\t167857\t0.3453\t96063\tObama\t96063\t0.000257797\t96063.0\n2265\t-122.15071599999999\t40.06443\tGerber-Las Flores CDP\tCA\tCalifornia\tTehama County\t1730\t31.3\t2.3\t24.9\t12953\t125112\t0.3453\t96035\tObama\t96035\t0.002753019\t96035.0\n2266\t-122.24113899999999\t40.173652000000004\tRed Bluff city\tCA\tCalifornia\tTehama County\t14298\t35.9\t11.9\t19.2\t19375\t162666\t0.3453\t96080\tObama\t96080\t0.02275299\t96080.0\n2267\t-122.097939\t40.026737\tLos Molinos CDP\tCA\tCalifornia\tTehama County\t2223\t39.0\t9.3\t17.8\t15699\t147991\t0.3453\t96055\tObama\t96055\t0.00353755\t96055.0\n2268\t-122.47136100000002\t39.995711\tRancho Tehama Reserve CDP\tCA\tCalifornia\tTehama County\t1573\t44.6\t8.0\t25.4\t13934\t129167\t0.3453\t96029\tObama\t96029\t0.002503179\t96029.0\n2269\t-122.18256000000001\t39.926171999999994\tCorning city\tCA\tCalifornia\tTehama County\t7731\t31.2\t8.5\t20.3\t15395\t144782\t0.3453\t96021\tObama\t96021\t0.012302655\t96021.0\n2270\t-122.80098100000001\t40.697909\tLewiston CDP\tCA\tCalifornia\tTrinity County\t1450\t48.0\t15.5\t14.9\t17758\t176875\t0.4713\t96052\tObama\t96052\t0.002307444\t96052.0\n2271\t-123.133917\t40.572852000000005\tHayfork CDP\tCA\tCalifornia\tTrinity County\t2484\t46.1\t12.6\t21.0\t15657\t148026\t0.4713\t96041\tObama\t96041\t0.00395289\t96041.0\n2272\t-122.94512399999999\t40.766006\tWeaverville CDP\tCA\tCalifornia\tTrinity County\t3849\t45.9\t19.6\t10.8\t23183\t211530\t0.4713\t96093\tObama\t96093\t0.006125071\t96093.0\n2273\t-119.32086899999999\t36.324762\tVisalia city\tCA\tCalifornia\tTulare County\t109123\t33.2\t20.5\t12.9\t21344\t167652\t0.413\t93277\tObama\t93277\t0.173651876\t93277.0\n2274\t-119.14923799999998\t36.056389\tPoplar-Cotton Center CDP\tCA\tCalifornia\tTulare County\t1731\t25.5\t2.4\t20.1\t9092\t112132\t0.413\t93267\tObama\t93267\t0.0027546109999999997\t93267.0\n2275\t-119.031361\t36.378867\tLemon Cove CDP\tCA\tCalifornia\tTulare County\t358\t45.6\t19.4\t10.7\t22438\t185938\t0.413\t93244\tObama\t93244\t0.0005697\t93244.0\n2276\t-119.09901599999999\t36.413402000000005\tWoodlake city\tCA\tCalifornia\tTulare County\t7769\t27.4\t5.4\t19.9\t10715\t120321\t0.413\t93286\tObama\t93286\t0.012363126\t93286.0\n2277\t-119.029474\t36.065659000000004\tPorterville city\tCA\tCalifornia\tTulare County\t46098\t29.2\t11.9\t16.8\t14944\t135673\t0.413\t93257\tObama\t93257\t0.073357626\t93257.0\n2278\t-119.22016799999999\t36.388546000000005\tIvanhoe CDP\tCA\tCalifornia\tTulare County\t4731\t26.2\t5.8\t24.6\t10927\t112273\t0.413\t93235\tObama\t93235\t0.007528633000000001\t93235.0\n2279\t-119.31298000000001\t36.058529\tTipton CDP\tCA\tCalifornia\tTulare County\t2276\t25.8\t0.9\t13.0\t10310\t112815\t0.413\t93272\tObama\t93272\t0.0036218920000000003\t93272.0\n2280\t-119.06123799999999\t36.143761\tStrathmore CDP\tCA\tCalifornia\tTulare County\t2971\t26.1\t2.6\t22.2\t8945\t92500\t0.413\t93267\tObama\t93267\t0.004727873\t93267.0\n2281\t-119.390248\t36.545266\tDinuba city\tCA\tCalifornia\tTulare County\t19756\t27.5\t7.3\t22.5\t12508\t142913\t0.413\t93618\tObama\t93618\t0.031438528\t93618.0\n2282\t-119.487328\t35.887652\tAlpaugh CDP\tCA\tCalifornia\tTulare County\t966\t26.5\t3.2\t29.6\t9865\t83824\t0.413\t93201\tObama\t93201\t0.001537235\t93201.0\n2283\t-119.444076\t36.480981\tLondon CDP\tCA\tCalifornia\tTulare County\t1921\t25.4\t0.6\t30.4\t7024\t89474\t0.413\t93673\tObama\t93673\t0.003056966\t93673.0\n2284\t-119.04561299999999\t35.894263\tDucor CDP\tCA\tCalifornia\tTulare County\t575\t28.3\t7.1\t25.5\t13273\t135577\t0.413\t93270\tObama\t93270\t0.000915021\t93270.0\n2285\t-119.09034299999999\t36.207494\tLindsay city\tCA\tCalifornia\tTulare County\t11979\t25.3\t6.2\t18.8\t10823\t118793\t0.413\t93247\tObama\t93247\t0.019062671\t93247.0\n2286\t-119.290121\t36.543040999999995\tOrosi CDP\tCA\tCalifornia\tTulare County\t8494\t26.3\t2.4\t26.7\t10104\t128623\t0.413\t93615\tObama\t93615\t0.013516848\t93615.0\n2287\t-119.14478600000001\t36.295199\tExeter city\tCA\tCalifornia\tTulare County\t10170\t30.7\t15.2\t12.6\t16883\t146585\t0.413\t93221\tObama\t93221\t0.016183935\t93221.0\n2288\t-119.106931\t35.796581\tRichgrove CDP\tCA\tCalifornia\tTulare County\t3486\t23.2\t1.4\t37.3\t6520\t105714\t0.413\t93261\tObama\t93261\t0.0055474140000000005\t93261.0\n2289\t-119.341923\t36.198485999999995\tTulare city\tCA\tCalifornia\tTulare County\t55618\t29.7\t9.0\t15.4\t15256\t140277\t0.413\t93274\tObama\t93274\t0.08850719\t93274.0\n2290\t-119.271476\t35.881832\tEarlimart CDP\tCA\tCalifornia\tTulare County\t8109\t23.4\t2.2\t35.1\t7123\t103915\t0.413\t93219\tObama\t93219\t0.012904182\t93219.0\n2291\t-119.03899799999999\t35.959523\tTerra Bella CDP\tCA\tCalifornia\tTulare County\t4271\t25.6\t4.6\t33.0\t9314\t117035\t0.413\t93270\tObama\t93270\t0.006796616\t93270.0\n2292\t-119.482424\t36.452673\tTraver CDP\tCA\tCalifornia\tTulare County\t797\t27.9\t1.4\t23.2\t10031\t102273\t0.413\t93673\tObama\t93673\t0.0012682989999999999\t93673.0\n2293\t-118.83496299999999\t36.116453\tSpringville CDP\tCA\tCalifornia\tTulare County\t1322\t48.6\t16.6\t14.2\t22130\t175000\t0.413\t93265\tObama\t93265\t0.002103752\t93265.0\n2294\t-119.42085800000001\t36.351525\tGoshen CDP\tCA\tCalifornia\tTulare County\t2850\t27.3\t2.7\t20.4\t10622\t109176\t0.413\t93291\tObama\t93291\t0.004535321\t93291.0\n2295\t-119.288977\t35.97692\tPixley CDP\tCA\tCalifornia\tTulare County\t3210\t25.4\t2.8\t20.6\t9762\t112977\t0.413\t93256\tObama\t93256\t0.005108204\t93256.0\n2296\t-119.287866\t36.525764\tCutler CDP\tCA\tCalifornia\tTulare County\t5437\t24.8\t1.6\t33.3\t7278\t126488\t0.413\t93615\tObama\t93615\t0.00865212\t93615.0\n2297\t-119.25984199999999\t36.548010999999995\tEast Orosi CDP\tCA\tCalifornia\tTulare County\t526\t28.3\t12.1\t26.0\t11675\t146875\t0.413\t93647\tObama\t93647\t0.000837045\t93647.0\n2298\t-119.20500200000001\t36.089859000000004\tWoodville CDP\tCA\tCalifornia\tTulare County\t2082\t23.6\t2.9\t18.5\t8405\t98226\t0.413\t93272\tObama\t93272\t0.0033131709999999997\t93272.0\n2299\t-119.207399\t36.30573\tFarmersville city\tCA\tCalifornia\tTulare County\t9912\t26.3\t4.1\t20.9\t10466\t115738\t0.413\t93223\tObama\t93223\t0.015773369\t93223.0\n2300\t-118.87931999999999\t36.431864000000004\tThree Rivers CDP\tCA\tCalifornia\tTulare County\t2503\t49.8\t30.7\t10.1\t28771\t260484\t0.413\t93271\tObama\t93271\t0.003983126\t93271.0\n2301\t-118.971253\t36.057233000000004\tEast Porterville CDP\tCA\tCalifornia\tTulare County\t7197\t25.9\t6.5\t21.3\t9919\t108962\t0.413\t93257\tObama\t93257\t0.011452879\t93257.0\n2302\t-120.38201299999999\t37.98134\tSonora city\tCA\tCalifornia\tTuolumne County\t4301\t43.3\t18.3\t14.9\t24658\t237435\t0.405\t95370\tObama\t95370\t0.006844357\t95370.0\n2303\t-120.30096499999999\t38.038129\tPhoenix Lake-Cedar Ridge CDP\tCA\tCalifornia\tTuolumne County\t5187\t50.9\t21.6\t12.8\t27468\t280870\t0.405\t95370\tObama\t95370\t0.008254284\t95370.0\n2304\t-120.20102299999999\t37.853654999999996\tGroveland-Big Oak Flat CDP\tCA\tCalifornia\tTuolumne County\t3317\t59.7\t23.7\t14.6\t29025\t282487\t0.405\t95305\tObama\t95305\t0.005278476999999999\t95305.0\n2305\t-120.242667\t37.961415\tTuolumne City CDP\tCA\tCalifornia\tTuolumne County\t1863\t39.5\t9.6\t18.2\t19907\t198707\t0.405\t95379\tObama\t95379\t0.0029646679999999997\t95379.0\n2306\t-120.23373500000001\t38.038545\tTwain Harte CDP\tCA\tCalifornia\tTuolumne County\t2774\t50.0\t22.4\t9.1\t26581\t277297\t0.405\t95383\tObama\t95383\t0.004414379\t95383.0\n2307\t-120.27094699999999\t38.010991\tMono Vista CDP\tCA\tCalifornia\tTuolumne County\t3194\t44.2\t19.8\t8.8\t25979\t228922\t0.405\t95372\tObama\t95372\t0.005082742\t95372.0\n2308\t-120.41135200000001\t37.957085\tJamestown CDP\tCA\tCalifornia\tTuolumne County\t3150\t42.6\t14.6\t16.5\t22076\t204762\t0.405\t95370\tObama\t95370\t0.005012723\t95370.0\n2309\t-120.261023\t37.99215\tSoulsbyville CDP\tCA\tCalifornia\tTuolumne County\t1887\t43.1\t13.7\t21.3\t25740\t232102\t0.405\t95372\tObama\t95372\t0.00300286\t95372.0\n2310\t-120.410537\t38.033398\tColumbia CDP\tCA\tCalifornia\tTuolumne County\t2541\t48.6\t18.2\t17.4\t24166\t159926\t0.405\t95310\tObama\t95310\t0.004043597\t95310.0\n2311\t-120.44433300000001\t37.870253000000005\tChinese Camp CDP\tCA\tCalifornia\tTuolumne County\t147\t39.4\t13.1\t9.3\t19259\t250000\t0.405\t95327\tObama\t95327\t0.000233927\t95327.0\n2312\t-120.177945\t38.059246\tMi-Wuk Village CDP\tCA\tCalifornia\tTuolumne County\t1489\t46.7\t24.5\t9.8\t26198\t239764\t0.405\t95346\tObama\t95346\t0.002369506\t95346.0\n2313\t-120.340548\t37.97767\tEast Sonora CDP\tCA\tCalifornia\tTuolumne County\t2016\t60.9\t26.9\t10.7\t27187\t217969\t0.405\t95370\tObama\t95370\t0.0032081429999999997\t95370.0\n2314\t-118.862066\t34.297764\tMoorpark city\tCA\tCalifornia\tVentura County\t36993\t33.5\t35.9\t10.8\t29449\t435978\t0.5228\t93021\tObama\t93021\t0.058868468\t93021.0\n2315\t-119.24673999999999\t34.448533000000005\tOjai city\tCA\tCalifornia\tVentura County\t8094\t44.1\t36.9\t13.8\t35139\t458733\t0.5228\t93023\tObama\t93023\t0.012880312\t93023.0\n2316\t-119.297572\t34.39905\tOak View CDP\tCA\tCalifornia\tVentura County\t4358\t39.2\t24.4\t15.1\t34023\t350891\t0.5228\t93022\tObama\t93022\t0.006935063000000001\t93022.0\n2317\t-119.181149\t34.193552000000004\tOxnard city\tCA\tCalifornia\tVentura County\t189412\t29.8\t16.2\t15.0\t18923\t290573\t0.5228\t93030\tObama\t93030\t0.301419033\t93030.0\n2318\t-118.801612\t34.404401\tPiru CDP\tCA\tCalifornia\tVentura County\t1420\t28.6\t9.0\t14.8\t18339\t277459\t0.5228\t93040\tObama\t93040\t0.002259704\t93040.0\n2319\t-118.87487800000001\t34.191855\tThousand Oaks city\tCA\tCalifornia\tVentura County\t125413\t40.5\t47.3\t10.4\t42755\t527257\t0.5228\t91360\tObama\t91360\t0.199574817\t91360.0\n2320\t-119.285573\t34.427968\tMira Monte CDP\tCA\tCalifornia\tVentura County\t7524\t41.5\t27.3\t12.1\t32066\t382828\t0.5228\t93022\tObama\t93022\t0.011973248\t93022.0\n2321\t-119.232607\t34.273758\tSan Buenaventura (Ventura) city\tCA\tCalifornia\tVentura County\t106316\t38.5\t33.3\t11.6\t31668\t371291\t0.5228\t93003\tObama\t93003\t0.169184983\t93003.0\n2322\t-119.219303\t34.154340000000005\tChannel Islands Beach CDP\tCA\tCalifornia\tVentura County\t3156\t43.2\t42.3\t14.2\t40107\t463235\t0.5228\t93035\tObama\t93035\t0.005022271\t93035.0\n2323\t-118.75743600000001\t34.171859000000005\tOak Park CDP\tCA\tCalifornia\tVentura County\t2341\t42.0\t47.6\t10.2\t44200\t575397\t0.5228\t91377\tObama\t91377\t0.0037253290000000003\t91377.0\n2324\t-119.06952\t34.352965000000005\tSanta Paula city\tCA\tCalifornia\tVentura County\t30079\t30.2\t11.0\t16.8\t19010\t261825\t0.5228\t93060\tObama\t93060\t0.047865938\t93060.0\n2325\t-119.203526\t34.161662\tPort Hueneme city\tCA\tCalifornia\tVentura County\t22439\t30.8\t18.9\t13.5\t21440\t256627\t0.5228\t93041\tObama\t93041\t0.035708095\t93041.0\n2326\t-119.27315300000001\t34.450737\tMeiners Oaks CDP\tCA\tCalifornia\tVentura County\t3838\t41.0\t26.0\t14.7\t29516\t350855\t0.5228\t93023\tObama\t93023\t0.006107566\t93023.0\n2327\t-119.03125\t34.22291\tCamarillo city\tCA\tCalifornia\tVentura County\t63545\t41.1\t38.1\t10.1\t37561\t399621\t0.5228\t93010\tObama\t93010\t0.10112174800000001\t93010.0\n2328\t-118.75001999999999\t34.267899\tSimi Valley city\tCA\tCalifornia\tVentura County\t122665\t37.3\t29.4\t11.1\t35123\t379761\t0.5228\t93065\tObama\t93065\t0.195201813\t93065.0\n2329\t-118.918107\t34.401016\tFillmore city\tCA\tCalifornia\tVentura County\t14880\t31.0\t15.5\t15.4\t18617\t261611\t0.5228\t93015\tObama\t93015\t0.02367915\t93015.0\n2330\t-119.15756699999999\t34.242496\tEl Rio CDP\tCA\tCalifornia\tVentura County\t6360\t27.4\t9.2\t9.7\t15197\t261732\t0.5228\t93030\tObama\t93030\t0.010120927\t93030.0\n2331\t-118.944319\t34.184537\tCasa Conejo CDP\tCA\tCalifornia\tVentura County\t3188\t38.1\t28.1\t10.5\t30057\t389255\t0.5228\t91320\tObama\t91320\t0.0050731940000000005\t91320.0\n2332\t-121.765105\t38.67646\tWoodland city\tCA\tCalifornia\tYolo County\t56604\t32.4\t22.7\t14.9\t21542\t222156\t0.6541\t95776\tObama\t95776\t0.090076252\t95776.0\n2333\t-122.02292800000001\t38.693734\tEsparto CDP\tCA\tCalifornia\tYolo County\t2097\t33.8\t12.1\t14.7\t19038\t185215\t0.6541\t95627\tObama\t95627\t0.003337042\t95627.0\n2334\t-121.735575\t38.555776\tDavis city\tCA\tCalifornia\tYolo County\t66554\t26.6\t73.3\t11.6\t30439\t362992\t0.6541\t95616\tObama\t95616\t0.105910092\t95616.0\n2335\t-121.550478\t38.555844\tWest Sacramento city\tCA\tCalifornia\tYolo County\t47302\t36.8\t19.5\t15.5\t21700\t184998\t0.6541\t95691\tObama\t95691\t0.07527360000000001\t95691.0\n2336\t-121.974374\t38.527815999999994\tWinters city\tCA\tCalifornia\tYolo County\t6754\t30.0\t22.7\t14.6\t22697\t216430\t0.6541\t95694\tObama\t95694\t0.010747915\t95694.0\n2337\t-121.58389\t39.151718\tMarysville city\tCA\tCalifornia\tYuba County\t12471\t31.8\t13.2\t18.0\t18936\t138378\t0.3914\t95901\tObama\t95901\t0.01984561\t95901.0\n2338\t-121.556026\t39.121093\tLinda CDP\tCA\tCalifornia\tYuba County\t17834\t26.2\t5.2\t21.4\t11740\t121512\t0.3914\t95961\tObama\t95961\t0.028379971\t95961.0\n2339\t-121.263196\t39.464677\tChallenge-Brownsville CDP\tCA\tCalifornia\tYuba County\t1257\t53.4\t16.6\t24.0\t18424\t154032\t0.3914\t95919\tObama\t95919\t0.002000315\t95919.0\n2340\t-121.54749699999999\t39.078593\tOlivehurst CDP\tCA\tCalifornia\tYuba County\t13065\t30.3\t6.5\t22.0\t14342\t111241\t0.3914\t95961\tObama\t95961\t0.020790867\t95961.0\n2341\t-121.403995\t39.320186\tLoma Rica CDP\tCA\tCalifornia\tYuba County\t2182\t47.5\t15.6\t13.4\t21383\t233532\t0.3914\t95918\tObama\t95918\t0.0034723059999999997\t95918.0\n2342\t-121.354248\t39.109466999999995\tBeale AFB CDP\tCA\tCalifornia\tYuba County\t4510\t22.6\t26.2\t23.0\t13590\t194643\t0.3914\t95903\tObama\t95903\t0.0071769469999999995\t95903.0\n2343\t-121.42773000000001\t39.012947\tWheatland city\tCA\tCalifornia\tYuba County\t2466\t35.6\t15.1\t17.0\t18407\t177257\t0.3914\t95692\tObama\t95692\t0.003924246\t95692.0\n2344\t-105.028406\t39.804679\tBerkley CDP\tCO\tColorado\tAdams County\t11508\t32.9\t10.8\t14.1\t21554\t154329\t0.5711\t80221\tObama\t80221\t0.024829472999999998\t80221.0\n2345\t-105.01569199999999\t39.865185\tFederal Heights city\tCO\tColorado\tAdams County\t13510\t31.9\t10.9\t10.3\t21829\t60658\t0.5711\t80260\tObama\t80260\t0.029148956\t80260.0\n2346\t-104.407318\t39.752021\tBennett town\tCO\tColorado\tAdams County\t2924\t32.5\t14.2\t9.1\t22374\t166807\t0.5711\t80102\tObama\t80102\t0.006308775\t80102.0\n2347\t-104.878973\t39.859625\tCommerce City\tCO\tColorado\tAdams County\t32706\t33.0\t9.7\t12.3\t19795\t161435\t0.5711\t80640\tObama\t80640\t0.070565932\t80640.0\n2348\t-104.952032\t40.007585\tNorthglenn city\tCO\tColorado\tAdams County\t37023\t34.4\t22.7\t11.6\t25867\t211380\t0.5711\t80514\tObama\t80514\t0.079880221\t80514.0\n2349\t-104.763476\t40.007534\tBrighton city\tCO\tColorado\tAdams County\t32557\t32.2\t20.1\t10.6\t22530\t205879\t0.5711\t80601\tObama\t80601\t0.070244452\t80601.0\n2350\t-104.875593\t39.977432\tTodd Creek CDP\tCO\tColorado\tAdams County\t4227\t35.2\t23.8\t5.6\t38554\t202241\t0.5711\t80601\tObama\t80601\t0.009120106\t80601.0\n2351\t-105.00138600000001\t39.83892\tSherrelwood CDP\tCO\tColorado\tAdams County\t18600\t33.4\t12.5\t11.9\t20624\t190432\t0.5711\t80221\tObama\t80221\t0.040131056\t80221.0\n2352\t-104.917612\t39.844969\tDerby CDP\tCO\tColorado\tAdams County\t7322\t31.6\t6.2\t14.6\t17193\t133449\t0.5711\t80024\tObama\t80024\t0.015797828\t80024.0\n2353\t-104.97944299999999\t39.808479\tNorth Washington CDP\tCO\tColorado\tAdams County\t513\t40.1\t0.8\t6.6\t17122\t155208\t0.5711\t80216\tObama\t80216\t0.00110684\t80216.0\n2354\t-104.93972\t40.000582\tThornton city\tCO\tColorado\tAdams County\t110502\t32.8\t23.3\t9.6\t27804\t224031\t0.5711\t80241\tObama\t80241\t0.238417312\t80241.0\n2355\t-104.965507\t39.840224\tWelby CDP\tCO\tColorado\tAdams County\t14318\t32.3\t11.3\t11.3\t20803\t161695\t0.5711\t80229\tObama\t80229\t0.030892283\t80229.0\n2356\t-105.003619\t39.822807\tTwin Lakes CDP\tCO\tColorado\tAdams County\t6959\t34.3\t8.1\t13.8\t19736\t205236\t0.5711\t80221\tObama\t80221\t0.015014625\t80221.0\n2357\t-105.84259499999999\t37.477470000000004\tAlamosa East CDP\tCO\tColorado\tAlamosa County\t1640\t34.3\t26.6\t9.6\t14249\t123505\t0.5675\t81101\tObama\t81101\t0.003538437\t81101.0\n2358\t-105.874785\t37.469069\tAlamosa city\tCO\tColorado\tAlamosa County\t8012\t29.1\t32.3\t10.9\t18563\t125748\t0.5675\t81101\tObama\t81101\t0.01728656\t81101.0\n2359\t-105.87786799999999\t37.745953\tHooper town\tCO\tColorado\tAlamosa County\t134\t36.0\t24.4\t10.1\t17647\t121875\t0.5675\t81136\tObama\t81136\t0.00028911599999999996\t81136.0\n2360\t-104.221644\t39.706198\tByers CDP\tCO\tColorado\tArapahoe County\t1381\t35.8\t8.6\t9.4\t21682\t153348\t0.539\t80103\tObama\t80103\t0.002979623\t80103.0\n2361\t-104.94806200000001\t39.637581\tCherry Hills Village city\tCO\tColorado\tArapahoe County\t6463\t47.1\t77.4\t4.9\t83236\t1000001\t0.539\t80121\tObama\t80121\t0.013944463\t80121.0\n2362\t-104.95361000000001\t39.588687\tSouthglenn CDP\tCO\tColorado\tArapahoe County\t43829\t44.4\t51.7\t7.6\t38967\t262914\t0.539\t80122\tObama\t80122\t0.094564735\t80122.0\n2363\t-104.78572199999999\t39.588149\tFoxfield town\tCO\tColorado\tArapahoe County\t631\t46.7\t67.2\t4.4\t65647\t561441\t0.539\t80015\tObama\t80015\t0.001361435\t80015.0\n2364\t-105.018006\t39.64702\tSheridan city\tCO\tColorado\tArapahoe County\t5755\t34.9\t8.0\t11.1\t20996\t142407\t0.539\t80236\tObama\t80236\t0.012416894\t80236.0\n2365\t-104.99410800000001\t39.646784999999994\tEnglewood city\tCO\tColorado\tArapahoe County\t32159\t38.7\t23.5\t9.9\t28606\t194812\t0.539\t80110\tObama\t80110\t0.069385734\t80110.0\n2366\t-104.935873\t39.704526\tGlendale city\tCO\tColorado\tArapahoe County\t4408\t30.5\t41.3\t12.6\t27919\t135662\t0.539\t80246\tObama\t80246\t0.009510629\t80246.0\n2367\t-104.90222800000001\t39.584114\tCastlewood CDP\tCO\tColorado\tArapahoe County\t26244\t42.0\t62.3\t8.2\t43598\t300552\t0.539\t80112\tObama\t80112\t0.056623625999999996\t80112.0\n2368\t-105.04886200000001\t39.634943\tBow Mar town\tCO\tColorado\tArapahoe County\t798\t46.3\t62.8\t9.1\t51653\t506579\t0.539\t80236\tObama\t80236\t0.0017217520000000002\t80236.0\n2369\t-104.680809\t39.773007\tAurora city\tCO\tColorado\tArapahoe County\t324084\t33.7\t26.5\t10.1\t27606\t194169\t0.539\t80019\tObama\t80019\t0.699238349\t80019.0\n2370\t-104.042106\t39.614876\tDeer Trail town\tCO\tColorado\tArapahoe County\t680\t38.1\t9.6\t9.8\t20886\t124390\t0.539\t80105\tObama\t80105\t0.0014671570000000002\t80105.0\n2371\t-104.321378\t39.745461\tStrasburg CDP\tCO\tColorado\tArapahoe County\t1902\t39.8\t22.4\t8.2\t23631\t181750\t0.539\t80136\tObama\t80136\t0.0041037240000000004\t80136.0\n2372\t-105.00413700000001\t39.594235\tLittleton city\tCO\tColorado\tArapahoe County\t42529\t42.0\t41.3\t8.4\t37352\t244116\t0.539\t80120\tObama\t80120\t0.09175987599999999\t80120.0\n2373\t-104.913601\t39.615518\tGreenwood Village city\tCO\tColorado\tArapahoe County\t14107\t43.3\t66.7\t7.1\t65914\t640678\t0.539\t80237\tObama\t80237\t0.030437033\t80237.0\n2374\t-105.034879\t39.599314\tColumbine Valley town\tCO\tColorado\tArapahoe County\t1403\t44.1\t66.0\t8.6\t66376\t513542\t0.539\t80120\tObama\t80120\t0.00302709\t80120.0\n2375\t-107.040451\t37.266976\tPagosa Springs town\tCO\tColorado\tArchuleta County\t2023\t44.2\t30.7\t8.7\t22606\t306322\t0.3978\t81147\tObama\t81147\t0.004364792\t81147.0\n2376\t-107.424949\t37.021279\tArboles CDP\tCO\tColorado\tArchuleta County\t315\t45.8\t23.7\t7.2\t17762\t244643\t0.3978\t81121\tObama\t81121\t0.0006796389999999999\t81121.0\n2377\t-102.617549\t37.406473999999996\tSpringfield town\tCO\tColorado\tBaca County\t1391\t46.1\t13.5\t4.8\t18675\t61707\t0.2217\t81073\tObama\t81073\t0.0030011990000000004\t81073.0\n2378\t-102.447467\t37.373697\tVilas town\tCO\tColorado\tBaca County\t101\t45.0\t22.2\t1.5\t20441\t83333\t0.2217\t81087\tObama\t81087\t0.000217916\t81087.0\n2379\t-102.85866\t37.37004\tPritchett town\tCO\tColorado\tBaca County\t122\t45.3\t12.6\t0.0\t13869\t46667\t0.2217\t81064\tObama\t81064\t0.000263225\t81064.0\n2380\t-102.279898\t37.386101000000004\tWalsh town\tCO\tColorado\tBaca County\t568\t39.4\t18.9\t4.5\t15124\t48438\t0.2217\t81090\tObama\t81090\t0.001225508\t81090.0\n2381\t-102.578687\t37.10467\tCampo town\tCO\tColorado\tBaca County\t133\t45.3\t12.6\t0.0\t13925\t48333\t0.2217\t81029\tObama\t81029\t0.000286959\t81029.0\n2382\t-102.396415\t37.560621000000005\tTwo Buttes town\tCO\tColorado\tBaca County\t64\t50.8\t18.4\t2.1\t19518\t95000\t0.2217\t81084\tObama\t81084\t0.000138085\t81084.0\n2383\t-103.22614300000001\t38.06707\tLas Animas city\tCO\tColorado\tBent County\t2628\t36.9\t11.9\t12.3\t16820\t67538\t0.4197\t81054\tObama\t81054\t0.00567013\t81054.0\n2384\t-105.419372\t40.059475\tGold Hill CDP\tCO\tColorado\tBoulder County\t218\t42.5\t54.4\t4.5\t36904\t279545\t0.6969\t80455\tObama\t80455\t0.000470353\t80455.0\n2385\t-105.100191\t39.994421\tLafayette city\tCO\tColorado\tBoulder County\t25688\t36.0\t48.4\t5.9\t35770\t233590\t0.6969\t80026\tObama\t80026\t0.05542401\t80026.0\n2386\t-105.260401\t40.0153\tBoulder city\tCO\tColorado\tBoulder County\t98761\t30.5\t70.1\t7.6\t34883\t355080\t0.6969\t80304\tObama\t80304\t0.213085122\t80304.0\n2387\t-105.577606\t39.95312\tEldora CDP\tCO\tColorado\tBoulder County\t173\t42.6\t56.8\t2.7\t32793\t220455\t0.6969\t80474\tObama\t80474\t0.00037326199999999996\t80474.0\n2388\t-105.14132\t39.969625\tLouisville city\tCO\tColorado\tBoulder County\t19341\t38.4\t64.0\t5.1\t40006\t299544\t0.6969\t80027\tObama\t80027\t0.041729826\t80027.0\n2389\t-105.159201\t39.935821999999995\tSuperior town\tCO\tColorado\tBoulder County\t11185\t33.4\t70.0\t6.1\t43023\t376122\t0.6969\t80027\tObama\t80027\t0.024132572999999997\t80027.0\n2390\t-105.51395900000001\t40.182548\tAllenspark CDP\tCO\tColorado\tBoulder County\t546\t50.8\t41.1\t6.9\t31502\t300000\t0.6969\t80510\tObama\t80510\t0.0011780410000000001\t80510.0\n2391\t-104.993233\t40.007726\tBroomfield city\tCO\tColorado\tBoulder County\t54329\t35.5\t40.9\t8.2\t34584\t267815\t0.6969\t80516\tObama\t80516\t0.117219364\t80516.0\n2392\t-105.155249\t40.097974\tNiwot CDP\tCO\tColorado\tBoulder County\t4363\t43.6\t61.3\t9.2\t49787\t447608\t0.6969\t80503\tObama\t80503\t0.009413538\t80503.0\n2393\t-105.26098400000001\t39.93748\tEldorado Springs CDP\tCO\tColorado\tBoulder County\t555\t46.1\t68.5\t5.5\t45113\t383929\t0.6969\t80025\tObama\t80025\t0.001197459\t80025.0\n2394\t-105.270022\t40.223331\tLyons town\tCO\tColorado\tBoulder County\t1717\t45.0\t39.0\t6.9\t38187\t275000\t0.6969\t80540\tObama\t80540\t0.003704571\t80540.0\n2395\t-105.513171\t40.072485\tWard town\tCO\tColorado\tBoulder County\t176\t43.2\t54.3\t4.8\t36762\t280556\t0.6969\t80481\tObama\t80481\t0.000379735\t80481.0\n2396\t-105.044918\t40.169884\tLongmont city\tCO\tColorado\tBoulder County\t82470\t35.5\t35.9\t6.9\t30950\t229516\t0.6969\t80504\tObama\t80504\t0.17793592600000002\t80504.0\n2397\t-105.506382\t39.962934000000004\tNederland town\tCO\tColorado\tBoulder County\t1486\t35.4\t63.1\t7.3\t36669\t279688\t0.6969\t80466\tObama\t80466\t0.003206169\t80466.0\n2398\t-105.030189\t40.03423\tErie town\tCO\tColorado\tBoulder County\t11702\t35.8\t51.7\t7.5\t37841\t324796\t0.6969\t80516\tObama\t80516\t0.025248044\t80516.0\n2399\t-105.40063\t40.118997\tJamestown town\tCO\tColorado\tBoulder County\t252\t43.2\t54.6\t4.5\t36786\t278571\t0.6969\t80455\tObama\t80455\t0.000543711\t80455.0\n2400\t-105.170992\t40.063266\tGunbarrel CDP\tCO\tColorado\tBoulder County\t9470\t42.3\t67.2\t5.1\t43186\t342350\t0.6969\t80301\tObama\t80301\t0.020432317\t80301.0\n2401\t-106.07472800000001\t38.514417\tPoncha Springs town\tCO\tColorado\tChaffee County\t521\t45.3\t24.1\t8.3\t19963\t233871\t0.4861\t81201\tObama\t81201\t0.001124101\t81201.0\n2402\t-106.000579\t38.532265\tSalida city\tCO\tColorado\tChaffee County\t5593\t44.9\t23.2\t7.6\t20374\t202337\t0.4861\t81201\tObama\t81201\t0.012067366000000001\t81201.0\n2403\t-106.13894599999999\t38.831726\tBuena Vista town\tCO\tColorado\tChaffee County\t2293\t40.6\t24.6\t6.8\t19794\t198505\t0.4861\t81211\tObama\t81211\t0.004947339\t81211.0\n2404\t-102.79560500000001\t38.762926\tKit Carson town\tCO\tColorado\tCheyenne County\t216\t48.1\t17.0\t2.3\t19814\t65000\t0.1574\t80825\tObama\t80825\t0.00046603800000000005\t80825.0\n2405\t-102.35163\t38.819278000000004\tCheyenne Wells town\tCO\tColorado\tCheyenne County\t895\t40.6\t14.0\t1.3\t20000\t88824\t0.1574\t80810\tObama\t80810\t0.001931037\t80810.0\n2406\t-105.51283400000001\t39.741184999999994\tIdaho Springs city\tCO\tColorado\tClear Creek County\t1767\t40.1\t22.9\t6.8\t25143\t179873\t0.5431\t80452\tObama\t80452\t0.00381245\t80452.0\n2407\t-105.695176\t39.717946000000005\tGeorgetown town\tCO\tColorado\tClear Creek County\t1021\t41.4\t31.6\t5.3\t27751\t195673\t0.5431\t80444\tObama\t80444\t0.002202893\t80444.0\n2408\t-105.726951\t39.695767\tSilver Plume town\tCO\tColorado\tClear Creek County\t191\t40.2\t27.4\t6.3\t25456\t140625\t0.5431\t80444\tObama\t80444\t0.000412098\t80444.0\n2409\t-105.657045\t39.820176000000004\tSt. Mary's CDP\tCO\tColorado\tClear Creek County\t254\t43.6\t43.3\t6.2\t32643\t190000\t0.5431\t80436\tObama\t80436\t0.000548026\t80436.0\n2410\t-105.68313500000001\t39.759463000000004\tEmpire town\tCO\tColorado\tClear Creek County\t335\t39.5\t26.6\t6.7\t24814\t141667\t0.5431\t80438\tObama\t80438\t0.0007227910000000001\t80438.0\n2411\t-105.616149\t39.764803\tDownieville-Lawson-Dumont CDP\tCO\tColorado\tClear Creek County\t347\t41.9\t22.0\t2.5\t25125\t177500\t0.5431\t80436\tObama\t80436\t0.000748682\t80436.0\n2412\t-105.93736200000001\t37.173858\tManassa town\tCO\tColorado\tConejos County\t1017\t31.7\t15.7\t11.3\t12108\t85882\t0.5396\t81141\tObama\t81141\t0.0021942629999999997\t81141.0\n2413\t-106.010337\t37.076335\tAntonito town\tCO\tColorado\tConejos County\t846\t38.1\t13.7\t9.9\t12074\t77368\t0.5396\t81120\tObama\t81120\t0.001825316\t81120.0\n2414\t-105.90090500000001\t37.257494\tSanford town\tCO\tColorado\tConejos County\t795\t29.6\t19.1\t8.4\t13625\t74762\t0.5396\t81141\tObama\t81141\t0.001715279\t81141.0\n2415\t-105.960633\t37.273852000000005\tLa Jara town\tCO\tColorado\tConejos County\t855\t36.3\t17.7\t9.8\t14453\t100272\t0.5396\t81140\tObama\t81140\t0.001844734\t81140.0\n2416\t-105.98561000000001\t37.171788\tRomeo town\tCO\tColorado\tConejos County\t366\t31.6\t15.3\t11.1\t12109\t85000\t0.5396\t81148\tObama\t81148\t0.000789676\t81148.0\n2417\t-105.436375\t37.428143\tFort Garland CDP\tCO\tColorado\tCostilla County\t385\t44.9\t23.0\t13.9\t14298\t110000\t0.7295\t81133\tObama\t81133\t0.00083067\t81133.0\n2418\t-105.42412\t37.200732\tSan Luis town\tCO\tColorado\tCostilla County\t624\t46.1\t12.1\t22.5\t11928\t68750\t0.7295\t81126\tObama\t81126\t0.0013463320000000002\t81126.0\n2419\t-105.51373600000001\t37.439446999999994\tBlanca town\tCO\tColorado\tCostilla County\t356\t41.5\t11.7\t8.9\t11452\t63000\t0.7295\t81123\tObama\t81123\t0.0007681\t81123.0\n2420\t-103.66333399999999\t38.23271\tSugar City town\tCO\tColorado\tCrowley County\t344\t36.2\t14.7\t8.5\t17364\t115278\t0.3562\t81076\tObama\t81076\t0.000742209\t81076.0\n2421\t-103.859332\t38.19336\tCrowley town\tCO\tColorado\tCrowley County\t248\t37.5\t16.2\t13.2\t17132\t85000\t0.3562\t81033\tObama\t81033\t0.000535081\t81033.0\n2422\t-103.94483000000001\t38.166354\tOlney Springs town\tCO\tColorado\tCrowley County\t479\t35.9\t14.6\t8.7\t17382\t112500\t0.3562\t81062\tObama\t81062\t0.001033483\t81062.0\n2423\t-103.756621\t38.22094\tOrdway town\tCO\tColorado\tCrowley County\t1332\t38.3\t9.9\t9.6\t17164\t77200\t0.3562\t81063\tObama\t81063\t0.002873901\t81063.0\n2424\t-105.465846\t38.132397999999995\tWestcliffe town\tCO\tColorado\tCuster County\t514\t51.9\t32.4\t5.1\t19951\t257500\t0.3197\t81252\tObama\t81252\t0.001108998\t81252.0\n2425\t-105.40961599999999\t38.120166999999995\tSilver Cliff town\tCO\tColorado\tCuster County\t635\t47.6\t27.1\t7.3\t20176\t202778\t0.3197\t81252\tObama\t81252\t0.001370066\t81252.0\n2426\t-107.590856\t38.869741\tPaonia town\tCO\tColorado\tDelta County\t1721\t45.6\t21.3\t8.0\t20417\t181629\t0.2902\t81428\tObama\t81428\t0.003713202\t81428.0\n2427\t-107.715475\t38.799557\tHotchkiss town\tCO\tColorado\tDelta County\t1091\t44.8\t17.3\t10.5\t18598\t152703\t0.2902\t81419\tObama\t81419\t0.002353924\t81419.0\n2428\t-107.97044\t38.814386\tOrchard City town\tCO\tColorado\tDelta County\t3243\t50.6\t16.2\t12.5\t18428\t198304\t0.2902\t81410\tObama\t81410\t0.006997044\t81410.0\n2429\t-107.60996100000001\t38.704996\tCrawford town\tCO\tColorado\tDelta County\t459\t48.1\t22.8\t7.6\t21229\t227941\t0.2902\t81415\tObama\t81415\t0.0009903310000000001\t81415.0\n2430\t-107.925423\t38.894376\tCedaredge town\tCO\tColorado\tDelta County\t2055\t52.8\t21.6\t10.2\t19092\t178667\t0.2902\t81413\tObama\t81413\t0.004433834\t81413.0\n2431\t-108.06135400000001\t38.742771000000005\tDelta city\tCO\tColorado\tDelta County\t6997\t40.6\t15.0\t7.8\t18428\t154382\t0.2902\t81416\tObama\t81416\t0.015096613\t81416.0\n2432\t-104.87611100000001\t39.762218\tDenver city\tCO\tColorado\tDenver County\t620908\t34.9\t38.8\t10.3\t29652\t214739\t0.7359\t80010\tObama\t80010\t1.339660967\t80010.0\n2433\t-108.031549\t37.688457\tRico town\tCO\tColorado\tDolores County\t234\t38.2\t30.9\t12.3\t31035\t198438\t0.2683\t81332\tObama\t81332\t0.000504875\t81332.0\n2434\t-108.906227\t37.766542\tDove Creek town\tCO\tColorado\tDolores County\t758\t41.9\t13.5\t17.6\t15900\t83947\t0.2683\t81324\tObama\t81324\t0.0016354479999999998\t81324.0\n2435\t-104.895674\t39.555814\tAcres Green CDP\tCO\tColorado\tDouglas County\t3245\t35.8\t42.8\t7.5\t33994\t243895\t0.3635\t80124\tObama\t80124\t0.007001359\t80124.0\n2436\t-105.073929\t39.449191\tRoxborough Park CDP\tCO\tColorado\tDouglas County\t8640\t35.6\t48.0\t5.2\t56848\t290610\t0.3635\t80125\tObama\t80125\t0.018641523\t80125.0\n2437\t-104.98575\t39.25954\tPerry Park CDP\tCO\tColorado\tDouglas County\t1580\t49.7\t55.5\t4.1\t58471\t420139\t0.3635\t801XX\tObama\t801XX\t0.003408982\t0.0\n2438\t-104.797884\t39.510802000000005\tParker town\tCO\tColorado\tDouglas County\t49766\t32.9\t48.6\t5.2\t43166\t308646\t0.3635\t80134\tObama\t80134\t0.107374309\t80134.0\n2439\t-104.803721\t39.535907\tStonegate CDP\tCO\tColorado\tDouglas County\t10677\t32.7\t60.4\t4.0\t50683\t384420\t0.3635\t80134\tObama\t80134\t0.023036521\t80134.0\n2440\t-104.89356699999999\t39.549996\tLone Tree city\tCO\tColorado\tDouglas County\t4996\t40.2\t66.3\t5.0\t62557\t420370\t0.3635\t80124\tObama\t80124\t0.010779288\t80124.0\n2441\t-104.96973600000001\t39.43963\tSedalia CDP\tCO\tColorado\tDouglas County\t204\t40.7\t48.1\t7.4\t54146\t384375\t0.3635\t80126\tObama\t80126\t0.00044014699999999994\t80126.0\n2442\t-104.748161\t39.388549\tFranktown CDP\tCO\tColorado\tDouglas County\t106\t48.8\t46.8\t5.6\t54254\t492857\t0.3635\t80116\tObama\t80116\t0.000228704\t80116.0\n2443\t-105.000635\t39.481435\tLouviers CDP\tCO\tColorado\tDouglas County\t270\t43.7\t56.6\t7.9\t44016\t407143\t0.3635\t80125\tObama\t80125\t0.000582548\t80125.0\n2444\t-104.89776200000001\t39.461504\tCastle Pines CDP\tCO\tColorado\tDouglas County\t15014\t42.2\t65.0\t5.6\t77774\t505168\t0.3635\t80124\tObama\t80124\t0.032393961\t80124.0\n2445\t-104.848506\t39.384675\tCastle Rock town\tCO\tColorado\tDouglas County\t49340\t35.0\t47.8\t6.4\t43070\t290909\t0.3635\t80104\tObama\t80104\t0.106455179\t80104.0\n2446\t-104.89540600000001\t39.527938\tCarriage Club CDP\tCO\tColorado\tDouglas County\t1217\t33.3\t61.9\t8.3\t50940\t435926\t0.3635\t80124\tObama\t80124\t0.0026257790000000004\t80124.0\n2447\t-104.89336499999999\t39.226682000000004\tLarkspur town\tCO\tColorado\tDouglas County\t227\t43.8\t41.7\t6.2\t51397\t414706\t0.3635\t80118\tObama\t80118\t0.000489771\t80118.0\n2448\t-104.80496\t39.55773\tCottonwood CDP\tCO\tColorado\tDouglas County\t2345\t31.1\t47.9\t4.6\t49137\t234718\t0.3635\t80134\tObama\t80134\t0.005059534\t80134.0\n2449\t-104.84732199999999\t39.543651000000004\tMeridian CDP\tCO\tColorado\tDouglas County\t3508\t31.4\t57.4\t8.3\t59293\t413158\t0.3635\t80124\tObama\t80124\t0.007568804\t80124.0\n2450\t-104.820216\t39.545646999999995\tGrand View Estates CDP\tCO\tColorado\tDouglas County\t791\t42.7\t23.9\t2.5\t42189\t367241\t0.3635\t80134\tObama\t80134\t0.001706649\t80134.0\n2451\t-104.970402\t39.542314000000005\tHighlands Ranch CDP\tCO\tColorado\tDouglas County\t97217\t33.5\t59.2\t5.8\t48333\t354350\t0.3635\t80126\tObama\t80126\t0.209753813\t80126.0\n2452\t-105.14083799999999\t39.140163\tWestcreek CDP\tCO\tColorado\tDouglas County\t104\t45.9\t22.5\t15.2\t27705\t296429\t0.3635\t80866\tObama\t80866\t0.00022438900000000002\t80866.0\n2453\t-104.87694199999999\t39.543946999999996\tHeritage Hills CDP\tCO\tColorado\tDouglas County\t6654\t34.6\t57.8\t5.6\t61101\t381938\t0.3635\t80124\tObama\t80124\t0.014356562\t80124.0\n2454\t-104.744743\t39.448974\tThe Pinery CDP\tCO\tColorado\tDouglas County\t9912\t44.9\t53.2\t5.8\t57927\t438326\t0.3635\t80134\tObama\t80134\t0.021385968999999998\t80134.0\n2455\t-106.42558899999999\t39.584829\tMinturn town\tCO\tColorado\tEagle County\t1305\t32.0\t31.7\t8.4\t31798\t433721\t0.5643\t81657\tObama\t81657\t0.002815647\t81657.0\n2456\t-106.532853\t39.644276\tAvon town\tCO\tColorado\tEagle County\t7796\t31.7\t51.0\t10.8\t38007\t515546\t0.5643\t81620\tObama\t81620\t0.016820522\t81620.0\n2457\t-106.357684\t39.639796000000004\tVail town\tCO\tColorado\tEagle County\t5561\t32.5\t64.5\t8.6\t47761\t559685\t0.5643\t81657\tObama\t81657\t0.011998323\t81657.0\n2458\t-106.487375\t39.61895\tEagle-Vail CDP\tCO\tColorado\tEagle County\t3754\t29.4\t59.0\t10.6\t43129\t517785\t0.5643\t81620\tObama\t81620\t0.008099569000000001\t81620.0\n2459\t-107.023719\t39.378268\tBasalt town\tCO\tColorado\tEagle County\t3720\t36.2\t41.3\t8.1\t33934\t580085\t0.5643\t81621\tObama\t81621\t0.008026211\t81621.0\n2460\t-106.61355\t39.628074\tEdwards CDP\tCO\tColorado\tEagle County\t12019\t31.9\t50.9\t7.0\t39325\t631903\t0.5643\t81632\tObama\t81632\t0.025931997999999998\t81632.0\n2461\t-106.82291799999999\t39.644496000000004\tEagle town\tCO\tColorado\tEagle County\t4019\t33.7\t34.9\t7.3\t30861\t486294\t0.5643\t81631\tObama\t81631\t0.008671329\t81631.0\n2462\t-107.085682\t39.39898\tEl Jebel CDP\tCO\tColorado\tEagle County\t4548\t34.7\t36.5\t8.9\t32532\t508798\t0.5643\t81621\tObama\t81621\t0.009812691\t81621.0\n2463\t-106.94944299999999\t39.640245\tGypsum town\tCO\tColorado\tEagle County\t5065\t31.9\t21.2\t7.8\t29580\t397109\t0.5643\t81637\tObama\t81637\t0.010928161\t81637.0\n2464\t-106.37001699999999\t39.508738\tRed Cliff town\tCO\tColorado\tEagle County\t353\t32.1\t31.6\t8.2\t31807\t429167\t0.5643\t81645\tObama\t81645\t0.000761627\t81645.0\n2465\t-104.63516800000001\t39.398158\tPonderosa Park CDP\tCO\tColorado\tElbert County\t3520\t42.0\t30.9\t5.9\t33307\t305043\t0.2541\t80107\tObama\t80107\t0.007594695\t80107.0\n2466\t-104.462549\t39.345583000000005\tKiowa town\tCO\tColorado\tElbert County\t762\t38.8\t21.7\t8.5\t26036\t276923\t0.2541\t80117\tObama\t80117\t0.001644079\t80117.0\n2467\t-104.081585\t39.141071999999994\tSimla town\tCO\tColorado\tElbert County\t759\t42.0\t18.7\t8.7\t19911\t127273\t0.2541\t80835\tObama\t80835\t0.001637606\t80835.0\n2468\t-104.601445\t39.362576000000004\tElizabeth town\tCO\tColorado\tElbert County\t1572\t39.6\t31.8\t6.8\t31051\t338372\t0.2541\t80107\tObama\t80107\t0.0033917220000000002\t80107.0\n2469\t-104.905553\t39.115427000000004\tPalmer Lake town\tCO\tColorado\tEl Paso County\t2394\t41.0\t43.9\t6.2\t33279\t253211\t0.3854\t80133\tObama\t80133\t0.005165255\t80133.0\n2470\t-104.300666\t39.034176\tCalhan town\tCO\tColorado\tEl Paso County\t945\t38.0\t16.7\t7.6\t21417\t156250\t0.3854\t80808\tObama\t80808\t0.002038917\t80808.0\n2471\t-104.66739100000001\t39.045586\tBlack Forest CDP\tCO\tColorado\tEl Paso County\t20354\t42.8\t47.8\t7.9\t36238\t312549\t0.3854\t80908\tObama\t80908\t0.043915458\t80908.0\n2472\t-104.712347\t38.747789000000004\tSecurity-Widefield CDP\tCO\tColorado\tEl Paso County\t32599\t35.2\t16.0\t10.1\t22995\t163715\t0.3854\t80911\tObama\t80911\t0.07033507\t80911.0\n2473\t-104.69954\t38.859381\tCimarron Hills CDP\tCO\tColorado\tEl Paso County\t16367\t29.5\t26.8\t11.6\t24704\t172334\t0.3854\t80915\tObama\t80915\t0.035313172000000004\t80915.0\n2474\t-104.699733\t38.683061\tFountain city\tCO\tColorado\tEl Paso County\t22680\t30.7\t15.3\t10.2\t22203\t162199\t0.3854\t80817\tObama\t80817\t0.048933998\t80817.0\n2475\t-104.863948\t38.994184999999995\tAir Force Academy CDP\tCO\tColorado\tEl Paso County\t7569\t21.4\t44.6\t19.2\t16526\t187500\t0.3854\t80840\tObama\t80840\t0.016330751\t80840.0\n2476\t-104.845939\t39.105705\tWoodmoor CDP\tCO\tColorado\tEl Paso County\t8866\t44.9\t61.4\t8.1\t45999\t402732\t0.3854\t80132\tObama\t80132\t0.019129137\t80132.0\n2477\t-104.760723\t38.86375\tColorado Springs city\tCO\tColorado\tEl Paso County\t415065\t34.9\t36.8\t9.8\t28161\t199138\t0.3854\t80909\tObama\t80909\t0.89553747\t80909.0\n2478\t-104.855459\t39.076484\tMonument town\tCO\tColorado\tEl Paso County\t3838\t36.6\t51.3\t6.0\t32293\t339759\t0.3854\t80132\tObama\t80132\t0.008280806\t80132.0\n2479\t-104.77895500000001\t38.773689000000005\tStratmoor CDP\tCO\tColorado\tEl Paso County\t6679\t29.3\t14.2\t16.1\t19887\t139391\t0.3854\t80913\tObama\t80913\t0.014410501000000001\t80913.0\n2480\t-104.167465\t39.122217\tRamah town\tCO\tColorado\tEl Paso County\t124\t37.9\t17.1\t8.1\t21333\t156250\t0.3854\t80835\tObama\t80835\t0.00026754\t80835.0\n2481\t-104.828702\t39.045736\tGleneagle CDP\tCO\tColorado\tEl Paso County\t5788\t45.7\t58.4\t6.7\t39142\t349260\t0.3854\t80921\tObama\t80921\t0.012488094\t80921.0\n2482\t-105.01850300000001\t38.934321000000004\tGreen Mountain Falls town\tCO\tColorado\tEl Paso County\t851\t45.2\t39.8\t11.3\t30107\t215000\t0.3854\t80819\tObama\t80819\t0.0018361039999999999\t80819.0\n2483\t-104.783365\t38.741681\tFort Carson CDP\tCO\tColorado\tEl Paso County\t14672\t22.4\t17.4\t17.4\t15947\t148611\t0.3854\t80913\tObama\t80913\t0.031656067999999996\t80913.0\n2484\t-105.002697\t38.943399\tCascade-Chipita Park CDP\tCO\tColorado\tEl Paso County\t1835\t46.9\t44.8\t9.9\t38430\t233594\t0.3854\t80819\tObama\t80819\t0.003959166\t80819.0\n2485\t-104.91229799999999\t38.857807\tManitou Springs city\tCO\tColorado\tEl Paso County\t4994\t44.5\t48.0\t10.0\t32721\t223130\t0.3854\t80829\tObama\t80829\t0.010774973\t80829.0\n2486\t-105.19120600000001\t38.41414\tBrookside town\tCO\tColorado\tFremont County\t224\t46.1\t8.2\t7.4\t19059\t176786\t0.3284\t81244\tObama\t81244\t0.000483299\t81244.0\n2487\t-105.218796\t38.444278000000004\tCanon City\tCO\tColorado\tFremont County\t16128\t41.9\t19.4\t8.1\t20752\t147775\t0.3284\t81212\tObama\t81212\t0.03479751\t81212.0\n2488\t-105.11214199999999\t38.382275\tFlorence city\tCO\tColorado\tFremont County\t3674\t39.5\t16.4\t7.2\t17573\t130521\t0.3284\t81226\tObama\t81226\t0.007926962\t81226.0\n2489\t-105.168348\t38.382971000000005\tWilliamsburg town\tCO\tColorado\tFremont County\t796\t40.8\t10.5\t10.9\t16333\t136029\t0.3284\t81221\tObama\t81221\t0.001717437\t81221.0\n2490\t-105.143103\t38.359517\tCoal Creek town\tCO\tColorado\tFremont County\t338\t40.4\t10.4\t11.0\t16322\t137500\t0.3284\t81221\tObama\t81221\t0.0007292630000000001\t81221.0\n2491\t-105.16658999999999\t38.36946\tRockvale town\tCO\tColorado\tFremont County\t475\t40.6\t10.8\t10.9\t16328\t136458\t0.3284\t81221\tObama\t81221\t0.001024852\t81221.0\n2492\t-105.213043\t38.42549\tLincoln Park CDP\tCO\tColorado\tFremont County\t3844\t47.7\t16.2\t9.1\t20703\t162582\t0.3284\t81212\tObama\t81212\t0.008293752\t81212.0\n2493\t-105.00159599999999\t38.421167\tPenrose CDP\tCO\tColorado\tFremont County\t4125\t41.2\t13.8\t9.0\t18042\t177500\t0.3284\t81240\tObama\t81240\t0.008900033\t81240.0\n2494\t-108.019772\t39.445718\tBattlement Mesa CDP\tCO\tColorado\tGarfield County\t4970\t43.4\t24.6\t12.1\t20979\t263028\t0.4632\t81635\tObama\t81635\t0.010723191000000002\t81635.0\n2495\t-107.331179\t39.544031\tGlenwood Springs city\tCO\tColorado\tGarfield County\t9134\t38.0\t35.3\t7.6\t27120\t387698\t0.4632\t81601\tObama\t81601\t0.019707369\t81601.0\n2496\t-107.774902\t39.538363000000004\tRifle city\tCO\tColorado\tGarfield County\t8354\t30.7\t15.0\t9.9\t23072\t241582\t0.4632\t816HH\tObama\t816HH\t0.018024454\t0.0\n2497\t-108.05369499999999\t39.44755\tParachute town\tCO\tColorado\tGarfield County\t1419\t31.5\t13.0\t8.3\t21904\t177381\t0.4632\t81635\tObama\t81635\t0.0030616109999999997\t81635.0\n2498\t-107.21830600000001\t39.394442\tCarbondale town\tCO\tColorado\tGarfield County\t6797\t32.3\t29.0\t5.6\t24588\t393544\t0.4632\t81623\tObama\t81623\t0.014665096\t81623.0\n2499\t-107.527606\t39.576643\tNew Castle town\tCO\tColorado\tGarfield County\t4252\t33.2\t31.0\t7.8\t27717\t346827\t0.4632\t81647\tObama\t81647\t0.009174046\t81647.0\n2500\t-107.63913400000001\t39.532303999999996\tSilt town\tCO\tColorado\tGarfield County\t2626\t37.4\t18.2\t10.5\t21591\t270611\t0.4632\t81652\tObama\t81652\t0.005665815\t81652.0\n2501\t-105.491561\t39.799985\tBlack Hawk city\tCO\tColorado\tGilpin County\t124\t45.0\t23.7\t9.8\t29247\t260000\t0.5668\t80422\tObama\t80422\t0.00026754\t80422.0\n2502\t-105.54869199999999\t39.802861\tCentral City\tCO\tColorado\tGilpin County\t516\t43.9\t15.2\t8.4\t25554\t187500\t0.5668\t80427\tObama\t80427\t0.001113313\t80427.0\n2503\t-105.778434\t39.88808\tWinter Park town\tCO\tColorado\tGrand County\t791\t36.2\t54.1\t6.7\t34802\t370833\t0.45\t80482\tObama\t80482\t0.001706649\t80482.0\n2504\t-105.83211399999999\t40.249738\tGrand Lake town\tCO\tColorado\tGrand County\t554\t48.3\t35.0\t5.5\t32783\t387500\t0.45\t80447\tObama\t80447\t0.001195301\t80447.0\n2505\t-105.841269\t39.976888\tTabernash CDP\tCO\tColorado\tGrand County\t198\t40.4\t43.1\t7.1\t28645\t434615\t0.45\t80442\tObama\t80442\t0.00042720199999999995\t80442.0\n2506\t-106.37668400000001\t40.055935\tKremmling town\tCO\tColorado\tGrand County\t1848\t34.8\t21.9\t10.1\t22179\t221569\t0.45\t80459\tObama\t80459\t0.003987215\t80459.0\n2507\t-105.936029\t40.071923999999996\tGranby town\tCO\tColorado\tGrand County\t1801\t38.2\t24.8\t7.2\t24325\t236905\t0.45\t80446\tObama\t80446\t0.0038858079999999997\t80446.0\n2508\t-105.79904599999999\t39.937108\tFraser town\tCO\tColorado\tGrand County\t1094\t36.0\t54.0\t6.7\t34791\t370161\t0.45\t80482\tObama\t80482\t0.002360397\t80482.0\n2509\t-106.101526\t40.074727\tHot Sulphur Springs town\tCO\tColorado\tGrand County\t625\t40.6\t43.0\t7.2\t28624\t418571\t0.45\t80451\tObama\t80451\t0.00134849\t80451.0\n2510\t-106.51655\t38.608514\tPitkin town\tCO\tColorado\tGunnison County\t171\t43.7\t33.1\t3.7\t26104\t320833\t0.5820000000000001\t81241\tObama\t81241\t0.00036894699999999995\t81241.0\n2511\t-106.964591\t38.907476\tMount Crested Butte town\tCO\tColorado\tGunnison County\t814\t36.9\t61.8\t6.5\t35114\t450000\t0.5820000000000001\t81225\tObama\t81225\t0.0017562729999999998\t81225.0\n2512\t-106.928321\t38.544512\tGunnison city\tCO\tColorado\tGunnison County\t5794\t26.3\t42.3\t9.3\t21786\t232591\t0.5820000000000001\t81230\tObama\t81230\t0.01250104\t81230.0\n2513\t-107.1902\t39.071847\tMarble town\tCO\tColorado\tGunnison County\t130\t50.7\t35.6\t10.7\t26180\t312500\t0.5820000000000001\t81434\tObama\t81434\t0.000280486\t81434.0\n2514\t-106.97771499999999\t38.867221\tCrested Butte town\tCO\tColorado\tGunnison County\t1726\t33.7\t63.1\t6.2\t33252\t447059\t0.5820000000000001\t81224\tObama\t81224\t0.003723989\t81224.0\n2515\t-107.310301\t38.030271\tLake City town\tCO\tColorado\tHinsdale County\t407\t46.7\t35.6\t2.5\t27266\t341379\t0.3817\t81235\tObama\t81235\t0.000878137\t81235.0\n2516\t-104.778596\t37.626548\tWalsenburg city\tCO\tColorado\tHuerfano County\t4051\t38.0\t11.4\t16.3\t16743\t86869\t0.5258\t81089\tObama\t81089\t0.008740371\t81089.0\n2517\t-105.008853\t37.508774\tLa Veta town\tCO\tColorado\tHuerfano County\t895\t46.0\t28.8\t9.9\t19927\t154044\t0.5258\t81055\tObama\t81055\t0.001931037\t81055.0\n2518\t-106.28130800000001\t40.731544\tWalden town\tCO\tColorado\tJackson County\t642\t43.0\t11.1\t9.6\t20225\t78571\t0.2547\t80480\tObama\t80480\t0.001385169\t80480.0\n2519\t-105.26869199999999\t39.686656\tGenesee CDP\tCO\tColorado\tJefferson County\t3562\t49.0\t76.9\t9.2\t82500\t546465\t0.5121\t80457\tObama\t80457\t0.007685313\t80457.0\n2520\t-105.11366100000001\t39.577021\tKen Caryl CDP\tCO\tColorado\tJefferson County\t33608\t36.9\t40.8\t7.0\t35967\t248189\t0.5121\t80127\tObama\t80127\t0.072512072\t80127.0\n2521\t-105.06256499999999\t39.750822\tEdgewater city\tCO\tColorado\tJefferson County\t5405\t35.3\t17.0\t10.2\t24793\t176286\t0.5121\t80214\tObama\t80214\t0.01166174\t80214.0\n2522\t-105.372821\t39.922839\tCoal Creek CDP\tCO\tColorado\tJefferson County\t2369\t42.2\t45.3\t8.5\t44092\t279708\t0.5121\t80025\tObama\t80025\t0.005111315999999999\t80025.0\n2523\t-105.297795\t39.542607000000004\tAspen Park CDP\tCO\tColorado\tJefferson County\t850\t44.7\t51.2\t7.3\t42369\t360215\t0.5121\t80433\tObama\t80433\t0.0018339460000000001\t80433.0\n2524\t-105.048359\t39.595211\tColumbine CDP\tCO\tColorado\tJefferson County\t24996\t42.2\t45.5\t7.0\t38629\t270171\t0.5121\t80123\tObama\t80123\t0.053930962\t80123.0\n2525\t-105.05673\t39.774745\tMountain View town\tCO\tColorado\tJefferson County\t543\t41.6\t19.8\t7.9\t25435\t166776\t0.5121\t80212\tObama\t80212\t0.001171568\t80212.0\n2526\t-105.304803\t39.659371\tKittredge CDP\tCO\tColorado\tJefferson County\t1043\t40.2\t39.2\t11.4\t41047\t269048\t0.5121\t80457\tObama\t80457\t0.00225036\t80457.0\n2527\t-105.160137\t39.753199\tApplewood CDP\tCO\tColorado\tJefferson County\t7033\t48.0\t45.2\t8.6\t40848\t312704\t0.5121\t80401\tObama\t80401\t0.015174286\t80401.0\n2528\t-105.193026\t39.644342\tMorrison town\tCO\tColorado\tJefferson County\t422\t53.3\t43.9\t5.6\t31976\t283333\t0.5121\t80465\tObama\t80465\t0.0009105000000000001\t80465.0\n2529\t-105.213802\t39.737353000000006\tGolden city\tCO\tColorado\tJefferson County\t17880\t34.9\t46.5\t7.7\t35463\t249160\t0.5121\t80401\tObama\t80401\t0.038577596\t80401.0\n2530\t-105.100733\t39.772776\tWheat Ridge city\tCO\tColorado\tJefferson County\t32184\t41.7\t27.0\t9.9\t28934\t219507\t0.5121\t80033\tObama\t80033\t0.069439673\t80033.0\n2531\t-105.179593\t39.733197\tWest Pleasant View CDP\tCO\tColorado\tJefferson County\t3771\t36.0\t18.1\t10.0\t31857\t129386\t0.5121\t80401\tObama\t80401\t0.008136248\t80401.0\n2532\t-105.048924\t39.83027\tArvada city\tCO\tColorado\tJefferson County\t104530\t39.7\t30.7\t8.8\t33008\t237877\t0.5121\t80030\tObama\t80030\t0.225532222\t80030.0\n2533\t-105.05798700000001\t39.780183\tLakeside town\tCO\tColorado\tJefferson County\t20\t32.5\t21.4\t9.1\t32890\t175000\t0.5121\t80212\tObama\t80212\t4.3200000000000007e-05\t80212.0\n2534\t-105.335825\t39.634811\tEvergreen CDP\tCO\tColorado\tJefferson County\t9252\t44.3\t64.6\t9.2\t46697\t390763\t0.5121\t80439\tObama\t80439\t0.019961964\t80439.0\n2535\t-105.157675\t39.727688\tEast Pleasant View CDP\tCO\tColorado\tJefferson County\t349\t44.8\t23.7\t7.2\t26514\t223913\t0.5121\t80401\tObama\t80401\t0.0007529969999999999\t80401.0\n2536\t-105.024819\t39.889378\tWestminster city\tCO\tColorado\tJefferson County\t110871\t35.3\t34.1\t9.1\t32024\t230457\t0.5121\t80234\tObama\t80234\t0.23921346\t80234.0\n2537\t-105.252587\t39.629646\tIndian Hills CDP\tCO\tColorado\tJefferson County\t1176\t46.4\t42.5\t6.7\t39544\t314368\t0.5121\t80454\tObama\t80454\t0.0025373179999999998\t80454.0\n2538\t-105.117148\t39.697552\tLakewood city\tCO\tColorado\tJefferson County\t145803\t38.3\t34.9\t8.5\t33426\t226763\t0.5121\t80232\tObama\t80232\t0.314582173\t80232.0\n2539\t-102.294158\t38.466758\tSheridan Lake town\tCO\tColorado\tKiowa County\t61\t43.8\t20.0\t5.4\t21055\t65000\t0.1437\t81071\tObama\t81071\t0.000131613\t81071.0\n2540\t-103.165036\t38.452545\tHaswell town\tCO\tColorado\tKiowa County\t78\t42.5\t20.0\t6.3\t20954\t65000\t0.1437\t81045\tObama\t81045\t0.000168292\t81045.0\n2541\t-102.77982\t38.481328000000005\tEads town\tCO\tColorado\tKiowa County\t574\t43.2\t16.9\t5.1\t18723\t58125\t0.1437\t81036\tObama\t81036\t0.001238453\t81036.0\n2542\t-102.86903199999999\t39.298341\tSeibert town\tCO\tColorado\tKit Carson County\t161\t47.3\t16.0\t4.5\t18488\t85000\t0.2264\t80834\tObama\t80834\t0.00034737099999999996\t80834.0\n2543\t-102.604274\t39.302911\tStratton town\tCO\tColorado\tKit Carson County\t655\t41.8\t16.6\t3.4\t18590\t100000\t0.2264\t80836\tObama\t80836\t0.001413217\t80836.0\n2544\t-103.066174\t39.294465\tFlagler town\tCO\tColorado\tKit Carson County\t517\t46.4\t26.2\t3.7\t21606\t88235\t0.2264\t80815\tObama\t80815\t0.001115471\t80815.0\n2545\t-102.743358\t39.302113\tVona town\tCO\tColorado\tKit Carson County\t95\t44.6\t16.7\t3.1\t19985\t87500\t0.2264\t80861\tObama\t80861\t0.00020497\t80861.0\n2546\t-102.27164\t39.304675\tBurlington city\tCO\tColorado\tKit Carson County\t3728\t37.2\t15.8\t3.0\t19706\t102029\t0.2264\t80807\tObama\t80807\t0.008043472\t80807.0\n2547\t-102.423402\t39.303928000000006\tBethune town\tCO\tColorado\tKit Carson County\t206\t39.6\t21.6\t3.1\t22719\t154167\t0.2264\t80805\tObama\t80805\t0.00044446199999999996\t80805.0\n2548\t-106.310928\t39.260439\tLeadville North CDP\tCO\tColorado\tLake County\t2099\t31.6\t18.4\t15.2\t24533\t177778\t0.6049\t80461\tObama\t80461\t0.004528768\t80461.0\n2549\t-106.29352800000001\t39.24692\tLeadville city\tCO\tColorado\tLake County\t2760\t35.4\t30.1\t11.7\t25066\t148769\t0.6049\t80461\tObama\t80461\t0.005954931\t80461.0\n2550\t-107.595701\t37.233988000000004\tBayfield town\tCO\tColorado\tLa Plata County\t1812\t41.0\t29.2\t7.8\t20967\t225617\t0.5307\t81122\tObama\t81122\t0.003909542\t81122.0\n2551\t-107.63549599999999\t37.116791\tIgnacio town\tCO\tColorado\tLa Plata County\t881\t29.9\t15.7\t14.1\t19306\t138750\t0.5307\t81137\tObama\t81137\t0.001900831\t81137.0\n2552\t-107.870094\t37.281376\tDurango city\tCO\tColorado\tLa Plata County\t16202\t31.1\t47.3\t7.9\t25308\t296549\t0.5307\t81301\tObama\t81301\t0.034957171\t81301.0\n2553\t-105.066727\t40.555351\tFort Collins city\tCO\tColorado\tLarimer County\t137974\t29.8\t50.7\t8.8\t28196\t218347\t0.5147\t80525\tObama\t80525\t0.297690451\t80525.0\n2554\t-104.9833\t40.529790000000006\tTimnath town\tCO\tColorado\tLarimer County\t205\t43.4\t47.5\t5.4\t45759\t336364\t0.5147\t80547\tObama\t80547\t0.000442305\t80547.0\n2555\t-105.092702\t40.409948\tLoveland city\tCO\tColorado\tLarimer County\t59154\t37.8\t30.6\t6.9\t27541\t207399\t0.5147\t80538\tObama\t80538\t0.127629705\t80538.0\n2556\t-105.09699499999999\t40.342956\tCampion CDP\tCO\tColorado\tLarimer County\t1991\t41.6\t28.1\t4.0\t29206\t264453\t0.5147\t80537\tObama\t80537\t0.004295749000000001\t80537.0\n2557\t-105.519659\t40.370438\tEstes Park town\tCO\tColorado\tLarimer County\t6467\t50.4\t47.5\t6.3\t32506\t307961\t0.5147\t80517\tObama\t80517\t0.013953094\t80517.0\n2558\t-105.14431299999998\t40.63832\tLaporte CDP\tCO\tColorado\tLarimer County\t2811\t39.5\t26.8\t5.7\t27183\t189029\t0.5147\t80535\tObama\t80535\t0.0060649680000000004\t80535.0\n2559\t-104.991565\t40.307904\tBerthoud town\tCO\tColorado\tLarimer County\t5624\t37.0\t32.3\t5.4\t29570\t217717\t0.5147\t80542\tObama\t80542\t0.012134251\t80542.0\n2560\t-105.55426899999999\t40.811679\tRed Feather Lakes CDP\tCO\tColorado\tLarimer County\t439\t58.3\t36.6\t11.6\t24981\t222917\t0.5147\t80545\tObama\t80545\t0.0009471789999999999\t80545.0\n2561\t-105.003239\t40.699634\tWellington town\tCO\tColorado\tLarimer County\t3320\t33.6\t25.8\t7.7\t23953\t175000\t0.5147\t80549\tObama\t80549\t0.007163178\t80549.0\n2562\t-104.52350799999999\t37.116842999999996\tStarkville town\tCO\tColorado\tLas Animas County\t191\t46.2\t17.6\t9.6\t20529\t155000\t0.502\t81082\tObama\t81082\t0.000412098\t81082.0\n2563\t-103.883974\t37.015535\tBranson town\tCO\tColorado\tLas Animas County\t86\t42.1\t23.0\t9.1\t17719\t130000\t0.502\t81027\tObama\t81027\t0.00018555200000000002\t81027.0\n2564\t-104.654927\t37.403627\tAguilar town\tCO\tColorado\tLas Animas County\t647\t51.8\t16.3\t10.7\t14544\t105515\t0.502\t81020\tObama\t81020\t0.0013959570000000002\t81020.0\n2565\t-104.621571\t37.144159\tCokedale town\tCO\tColorado\tLas Animas County\t153\t48.7\t13.7\t9.7\t19654\t137500\t0.502\t81024\tObama\t81024\t0.00033011\t81024.0\n2566\t-104.504368\t37.169111\tTrinidad city\tCO\tColorado\tLas Animas County\t9729\t40.6\t18.9\t10.3\t18895\t139636\t0.502\t81082\tObama\t81082\t0.020991132000000003\t81082.0\n2567\t-103.35292199999999\t37.246644\tKim town\tCO\tColorado\tLas Animas County\t60\t49.2\t19.6\t7.5\t19014\t112500\t0.502\t81049\tObama\t81049\t0.000129455\t81049.0\n2568\t-103.47218000000001\t39.135096000000004\tHugo town\tCO\tColorado\tLincoln County\t767\t44.3\t16.3\t3.7\t17684\t89000\t0.2414\t80821\tObama\t80821\t0.0016548670000000002\t80821.0\n2569\t-103.692208\t39.267022\tLimon town\tCO\tColorado\tLincoln County\t1760\t37.5\t16.9\t3.7\t20338\t106707\t0.2414\t80828\tObama\t80828\t0.003797347\t80828.0\n2570\t-103.499841\t39.27803\tGenoa town\tCO\tColorado\tLincoln County\t190\t36.3\t8.6\t8.2\t18377\t88750\t0.2414\t80818\tObama\t80818\t0.000409941\t80818.0\n2571\t-103.274045\t39.283991\tArriba town\tCO\tColorado\tLincoln County\t239\t45.3\t16.2\t1.9\t20571\t111364\t0.2414\t80804\tObama\t80804\t0.000515662\t80804.0\n2572\t-103.194556\t40.622479\tSterling city\tCO\tColorado\tLogan County\t13201\t34.7\t14.5\t7.4\t19116\t123771\t0.2972\t80751\tObama\t80751\t0.028482262\t80751.0\n2573\t-103.066147\t40.758359999999996\tIliff town\tCO\tColorado\tLogan County\t213\t39.8\t24.8\t4.8\t18473\t154167\t0.2972\t80736\tObama\t80736\t0.000459565\t80736.0\n2574\t-103.173425\t40.781771\tPadroni CDP\tCO\tColorado\tLogan County\t97\t40.5\t24.6\t4.5\t18485\t168750\t0.2972\t80745\tObama\t80745\t0.000209286\t80745.0\n2575\t-103.35374399999999\t40.484808\tMerino town\tCO\tColorado\tLogan County\t243\t39.3\t15.9\t2.6\t20123\t150000\t0.2972\t807HH\tObama\t807HH\t0.000524293\t0.0\n2576\t-102.839526\t40.681728\tFleming town\tCO\tColorado\tLogan County\t418\t44.2\t15.0\t3.2\t16856\t135625\t0.2972\t80728\tObama\t80728\t0.00090187\t80728.0\n2577\t-103.279033\t40.550167\tAtwood CDP\tCO\tColorado\tLogan County\t193\t39.2\t16.1\t3.3\t20085\t150000\t0.2972\t80722\tObama\t80722\t0.000416414\t80722.0\n2578\t-103.114992\t40.961932\tPeetz town\tCO\tColorado\tLogan County\t217\t42.7\t12.7\t4.7\t17713\t104167\t0.2972\t80747\tObama\t80747\t0.000468196\t80747.0\n2579\t-102.801245\t40.858827000000005\tCrook town\tCO\tColorado\tLogan County\t122\t42.1\t12.9\t4.8\t17768\t103125\t0.2972\t80726\tObama\t80726\t0.000263225\t80726.0\n2580\t-108.358006\t39.107687\tPalisade town\tCO\tColorado\tMesa County\t3145\t42.2\t21.5\t14.9\t16817\t159710\t0.3269\t81526\tObama\t81526\t0.006785601\t81526.0\n2581\t-108.461974\t39.075603\tClifton CDP\tCO\tColorado\tMesa County\t21576\t30.8\t13.0\t14.0\t18200\t148074\t0.3269\t81520\tObama\t81520\t0.046552025\t81520.0\n2582\t-108.679378\t39.10197\tRedlands CDP\tCO\tColorado\tMesa County\t10173\t48.5\t41.7\t9.4\t31840\t289330\t0.3269\t81521\tObama\t81521\t0.021949099\t81521.0\n2583\t-108.56017\t39.093801\tGrand Junction city\tCO\tColorado\tMesa County\t52845\t41.8\t29.0\t12.2\t23421\t195581\t0.3269\t81506\tObama\t81506\t0.11401751\t81506.0\n2584\t-108.72537700000001\t39.151361\tFruita city\tCO\tColorado\tMesa County\t10383\t38.2\t18.5\t8.7\t18941\t175757\t0.3269\t81521\tObama\t81521\t0.022402191000000002\t81521.0\n2585\t-108.47941200000001\t39.093283\tFruitvale CDP\tCO\tColorado\tMesa County\t8258\t42.6\t22.1\t9.9\t21275\t197804\t0.3269\t81504\tObama\t81504\t0.017817326\t81504.0\n2586\t-108.52355800000001\t39.036293\tOrchard Mesa CDP\tCO\tColorado\tMesa County\t7900\t38.6\t19.1\t15.4\t20916\t182894\t0.3269\t815HH\tObama\t815HH\t0.017044911\t0.0\n2587\t-107.96549099999999\t39.240357\tCollbran town\tCO\tColorado\tMesa County\t534\t40.2\t15.9\t12.6\t18930\t232955\t0.3269\t81624\tObama\t81624\t0.00115215\t81624.0\n2588\t-108.2141\t39.332638\tDe Beque town\tCO\tColorado\tMesa County\t591\t45.5\t20.0\t9.3\t18861\t213462\t0.3269\t81630\tObama\t81630\t0.001275132\t81630.0\n2589\t-106.92675200000001\t37.853907\tCreede town\tCO\tColorado\tMineral County\t446\t51.0\t34.8\t1.7\t24097\t193750\t0.4477\t81130\tObama\t81130\t0.000962282\t81130.0\n2590\t-107.554304\t40.517284000000004\tCraig city\tCO\tColorado\tMoffat County\t9741\t35.6\t15.2\t7.8\t22072\t149239\t0.2156\t81625\tObama\t81625\t0.021017023\t81625.0\n2591\t-109.008389\t40.240764\tDinosaur town\tCO\tColorado\tMoffat County\t330\t40.7\t3.9\t12.8\t15428\t70714\t0.2156\t81610\tObama\t81610\t0.000712003\t81610.0\n2592\t-108.577141\t37.350573\tCortez city\tCO\tColorado\tMontezuma County\t8120\t38.0\t20.7\t9.5\t19777\t142244\t0.3687\t81321\tObama\t81321\t0.017519579\t81321.0\n2593\t-108.293725\t37.346517999999996\tMancos town\tCO\tColorado\tMontezuma County\t1268\t45.1\t30.5\t6.4\t20947\t197426\t0.3687\t81328\tObama\t81328\t0.002735816\t81328.0\n2594\t-108.72638500000001\t37.211999999999996\tTowaoc CDP\tCO\tColorado\tMontezuma County\t1240\t26.2\t3.9\t15.6\t10655\t70833\t0.3687\t81334\tObama\t81334\t0.002675404\t81334.0\n2595\t-108.498911\t37.473896\tDolores town\tCO\tColorado\tMontezuma County\t973\t47.2\t31.8\t10.5\t19747\t190761\t0.3687\t81323\tObama\t81323\t0.002099329\t81323.0\n2596\t-108.5685\t38.218382\tNaturita town\tCO\tColorado\tMontrose County\t906\t41.7\t8.8\t14.3\t14323\t101220\t0.3049\t81424\tObama\t81424\t0.001954771\t81424.0\n2597\t-107.86519399999999\t38.476424\tMontrose city\tCO\tColorado\tMontrose County\t16573\t42.0\t24.3\t10.3\t21518\t199858\t0.3049\t81401\tObama\t81401\t0.035757633999999996\t81401.0\n2598\t-107.983092\t38.608256\tOlathe town\tCO\tColorado\tMontrose County\t2096\t33.0\t8.3\t12.4\t12809\t140472\t0.3049\t81425\tObama\t81425\t0.004522295\t81425.0\n2599\t-108.54948200000001\t38.265957\tNucla town\tCO\tColorado\tMontrose County\t1016\t45.8\t17.3\t9.4\t18983\t155556\t0.3049\t81424\tObama\t81424\t0.002192105\t81424.0\n2600\t-104.07650500000001\t40.224554\tWiggins town\tCO\tColorado\tMorgan County\t881\t30.9\t9.7\t9.3\t14775\t136458\t0.363\t80654\tObama\t80654\t0.001900831\t80654.0\n2601\t-103.522614\t40.324203000000004\tHillrose town\tCO\tColorado\tMorgan County\t266\t41.1\t12.2\t8.8\t18306\t153125\t0.363\t80733\tObama\t80733\t0.000573917\t80733.0\n2602\t-103.79149699999999\t40.254339\tFort Morgan city\tCO\tColorado\tMorgan County\t11470\t32.9\t15.6\t8.2\t17485\t141429\t0.363\t80701\tObama\t80701\t0.024747485\t80701.0\n2603\t-103.633009\t40.258384\tBrush city\tCO\tColorado\tMorgan County\t5317\t35.9\t17.7\t6.1\t18296\t133771\t0.363\t80723\tObama\t80723\t0.011471872\t80723.0\n2604\t-103.829237\t40.270314\tLog Lane Village town\tCO\tColorado\tMorgan County\t1020\t31.9\t5.6\t10.2\t15417\t126351\t0.363\t80705\tObama\t80705\t0.002200735\t80705.0\n2605\t-103.722382\t38.050125\tRocky Ford city\tCO\tColorado\tOtero County\t3930\t39.2\t14.1\t15.8\t16647\t77217\t0.4452\t81067\tObama\t81067\t0.008479304\t81067.0\n2606\t-103.866388\t38.108990999999996\tManzanola town\tCO\tColorado\tOtero County\t479\t40.9\t12.2\t9.6\t13829\t80556\t0.4452\t81058\tObama\t81058\t0.001033483\t81058.0\n2607\t-103.546799\t37.980455\tLa Junta city\tCO\tColorado\tOtero County\t7038\t36.4\t18.0\t10.5\t18901\t86871\t0.4452\t81050\tObama\t81050\t0.015185074\t81050.0\n2608\t-103.510944\t38.107763\tCheraw town\tCO\tColorado\tOtero County\t199\t43.0\t21.4\t5.5\t17165\t116250\t0.4452\t81030\tObama\t81030\t0.00042935900000000003\t81030.0\n2609\t-104.025529\t38.129315000000005\tFowler town\tCO\tColorado\tOtero County\t1166\t44.4\t18.2\t9.2\t19032\t95645\t0.4452\t81062\tObama\t81062\t0.002515743\t81062.0\n2610\t-103.62946600000001\t38.013768\tSwink town\tCO\tColorado\tOtero County\t648\t42.6\t24.0\t5.2\t19301\t115938\t0.4452\t81077\tObama\t81077\t0.001398114\t81077.0\n2611\t-107.753656\t38.156999\tRidgway town\tCO\tColorado\tOuray County\t964\t45.3\t40.8\t6.0\t26511\t417021\t0.5141\t81432\tObama\t81432\t0.0020799110000000003\t81432.0\n2612\t-107.67321299999999\t38.02669\tOuray city\tCO\tColorado\tOuray County\t918\t44.8\t40.1\t6.1\t27175\t372368\t0.5141\t81427\tObama\t81427\t0.0019806620000000002\t81427.0\n2613\t-107.778798\t38.196335\tLoghill Village CDP\tCO\tColorado\tOuray County\t425\t48.9\t37.5\t6.8\t27697\t520270\t0.5141\t81432\tObama\t81432\t0.0009169730000000001\t81432.0\n2614\t-106.065192\t39.285271\tAlma town\tCO\tColorado\tPark County\t251\t39.0\t28.8\t7.6\t30884\t225000\t0.4123\t80420\tObama\t80420\t0.000541554\t80420.0\n2615\t-105.99683700000001\t39.225120000000004\tFairplay town\tCO\tColorado\tPark County\t838\t39.3\t29.0\t7.4\t30880\t223881\t0.4123\t80440\tObama\t80440\t0.001808055\t80440.0\n2616\t-102.628887\t40.641915000000004\tHaxtun town\tCO\tColorado\tPhillips County\t997\t45.1\t19.9\t2.2\t18897\t109328\t0.2596\t80731\tObama\t80731\t0.0021511110000000003\t80731.0\n2617\t-102.472045\t40.612843\tPaoli town\tCO\tColorado\tPhillips County\t42\t45.0\t24.1\t4.2\t18721\t120833\t0.2596\t80731\tObama\t80731\t9.059999999999999e-05\t80731.0\n2618\t-102.304501\t40.58473\tHolyoke city\tCO\tColorado\tPhillips County\t2309\t41.0\t20.9\t7.0\t18669\t109958\t0.2596\t80734\tObama\t80734\t0.004981861\t80734.0\n2619\t-106.941731\t39.217582\tSnowmass Village town\tCO\tColorado\tPitkin County\t1825\t42.7\t64.6\t4.5\t44054\t1000001\t0.6798\t81615\tObama\t81615\t0.00393759\t81615.0\n2620\t-106.835493\t39.195209999999996\tAspen city\tCO\tColorado\tPitkin County\t6529\t40.3\t65.5\t4.3\t51232\t1000001\t0.6798\t81611\tObama\t81611\t0.014086864\t81611.0\n2621\t-102.218705\t38.121023\tHartman town\tCO\tColorado\tProwers County\t103\t40.6\t13.6\t6.8\t15733\t72500\t0.3124\t81043\tObama\t81043\t0.00022223099999999998\t81043.0\n2622\t-102.71919799999999\t38.155986\tWiley town\tCO\tColorado\tProwers County\t451\t34.5\t19.2\t5.6\t16157\t98333\t0.3124\t81092\tObama\t81092\t0.00097307\t81092.0\n2623\t-102.311829\t38.063187\tGranada town\tCO\tColorado\tProwers County\t538\t29.6\t8.9\t5.3\t11673\t58889\t0.3124\t81041\tObama\t81041\t0.00116078\t81041.0\n2624\t-102.124773\t38.055465999999996\tHolly town\tCO\tColorado\tProwers County\t885\t31.6\t17.1\t4.0\t14692\t59048\t0.3124\t81047\tObama\t81047\t0.001909462\t81047.0\n2625\t-102.617704\t38.080238\tLamar city\tCO\tColorado\tProwers County\t8086\t32.4\t13.5\t6.9\t17539\t84479\t0.3124\t81052\tObama\t81052\t0.017446222\t81052.0\n2626\t-104.932175\t37.921073\tRye town\tCO\tColorado\tPueblo County\t242\t46.8\t33.9\t6.6\t24904\t138971\t0.5585\t81069\tObama\t81069\t0.000522135\t81069.0\n2627\t-104.257641\t38.249741\tBoone town\tCO\tColorado\tPueblo County\t327\t46.3\t16.0\t8.3\t19108\t88182\t0.5585\t81025\tObama\t81025\t0.00070553\t81025.0\n2628\t-104.84555300000001\t37.944123\tColorado City CDP\tCO\tColorado\tPueblo County\t2368\t42.2\t26.2\t7.9\t21141\t142058\t0.5585\t81069\tObama\t81069\t0.005109158\t81069.0\n2629\t-104.72608100000001\t38.352919\tPueblo West CDP\tCO\tColorado\tPueblo County\t27473\t35.3\t25.1\t7.6\t24566\t170442\t0.5585\t81007\tObama\t81007\t0.059275296\t81007.0\n2630\t-104.362011\t38.235044\tAvondale CDP\tCO\tColorado\tPueblo County\t801\t40.4\t16.0\t16.0\t15346\t105183\t0.5585\t81025\tObama\t81025\t0.001728225\t81025.0\n2631\t-104.971254\t38.108354999999996\tBeulah Valley CDP\tCO\tColorado\tPueblo County\t970\t47.8\t35.3\t7.7\t25007\t169872\t0.5585\t81023\tObama\t81023\t0.002092856\t81023.0\n2632\t-104.585549\t38.239816999999995\tSalt Creek CDP\tCO\tColorado\tPueblo County\t632\t37.9\t5.3\t13.0\t15675\t87609\t0.5585\t81001\tObama\t81001\t0.001363593\t81001.0\n2633\t-104.612341\t38.270284000000004\tPueblo city\tCO\tColorado\tPueblo County\t107979\t37.8\t19.2\t12.1\t19980\t119237\t0.5585\t81003\tObama\t81003\t0.23297372800000002\t81003.0\n2634\t-107.894328\t40.048958\tMeeker town\tCO\tColorado\tRio Blanco County\t2492\t42.1\t20.1\t7.6\t20047\t169898\t0.1686\t81641\tObama\t81641\t0.005376699\t81641.0\n2635\t-108.801979\t40.085935\tRangely town\tCO\tColorado\tRio Blanco County\t2303\t33.4\t26.8\t9.4\t23033\t117351\t0.1686\t81648\tObama\t81648\t0.004968915\t81648.0\n2636\t-106.14568700000001\t37.578552\tMonte Vista city\tCO\tColorado\tRio Grande County\t4184\t37.0\t17.3\t11.7\t15804\t103739\t0.4479\t81144\tObama\t81144\t0.00902733\t81144.0\n2637\t-106.352501\t37.678298999999996\tDel Norte town\tCO\tColorado\tRio Grande County\t1606\t37.3\t14.3\t12.6\t14064\t82143\t0.4479\t81132\tObama\t81132\t0.0034650790000000002\t81132.0\n2638\t-106.64473100000001\t37.668323\tSouth Fork town\tCO\tColorado\tRio Grande County\t676\t49.6\t31.2\t7.6\t27662\t163690\t0.4479\t81154\tObama\t81154\t0.001458527\t81154.0\n2639\t-106.956924\t40.274645\tOak Creek town\tCO\tColorado\tRoutt County\t1071\t38.5\t20.0\t9.7\t23083\t176613\t0.5667\t80467\tObama\t80467\t0.002310772\t80467.0\n2640\t-107.263144\t40.483565999999996\tHayden town\tCO\tColorado\tRoutt County\t2019\t34.5\t19.5\t8.9\t24405\t212321\t0.5667\t81639\tObama\t81639\t0.004356161\t81639.0\n2641\t-106.827876\t40.480634\tSteamboat Springs city\tCO\tColorado\tRoutt County\t11613\t36.0\t55.8\t8.6\t35102\t468417\t0.5667\t80487\tObama\t80487\t0.025056019\t80487.0\n2642\t-106.90848100000001\t40.152967\tYampa town\tCO\tColorado\tRoutt County\t550\t41.0\t25.8\t7.6\t23456\t275000\t0.5667\t80483\tObama\t80483\t0.001186671\t80483.0\n2643\t-106.14187\t38.296618\tBonanza town\tCO\tColorado\tSaguache County\t15\t50.0\t18.2\t12.5\t18844\t375000\t0.6362\t81155\tObama\t81155\t3.24e-05\t81155.0\n2644\t-106.14108999999999\t38.086408\tSaguache town\tCO\tColorado\tSaguache County\t721\t45.7\t23.6\t12.8\t15671\t113672\t0.6362\t81149\tObama\t81149\t0.001555618\t81149.0\n2645\t-105.69761899999999\t37.99521\tCrestone town\tCO\tColorado\tSaguache County\t111\t50.6\t55.6\t13.7\t21118\t187500\t0.6362\t81131\tObama\t81131\t0.000239492\t81131.0\n2646\t-106.10608300000001\t37.752583\tCenter town\tCO\tColorado\tSaguache County\t3067\t28.4\t6.1\t16.9\t12230\t92174\t0.6362\t81125\tObama\t81125\t0.006617309\t81125.0\n2647\t-105.90543799999999\t38.001939\tMoffat town\tCO\tColorado\tSaguache County\t146\t46.9\t20.6\t6.9\t17434\t115625\t0.6362\t81143\tObama\t81143\t0.000315007\t81143.0\n2648\t-107.66458899999999\t37.810728000000005\tSilverton town\tCO\tColorado\tSan Juan County\t534\t46.6\t44.2\t1.8\t20357\t176875\t0.5257\t81433\tObama\t81433\t0.00115215\t81433.0\n2649\t-108.001245\t37.994576\tSawpit town\tCO\tColorado\tSan Miguel County\t29\t40.8\t56.5\t5.0\t39803\t583333\t0.703\t81430\tObama\t81430\t6.26e-05\t81430.0\n2650\t-107.830615\t37.856867\tOphir town\tCO\tColorado\tSan Miguel County\t130\t39.8\t55.4\t2.3\t40063\t500000\t0.703\t81426\tObama\t81426\t0.000280486\t81426.0\n2651\t-107.857836\t37.932199\tMountain Village town\tCO\tColorado\tSan Miguel County\t1450\t34.6\t57.9\t4.3\t42820\t601563\t0.703\t81435\tObama\t81435\t0.0031284959999999997\t81435.0\n2652\t-108.291568\t38.129387\tNorwood town\tCO\tColorado\tSan Miguel County\t476\t43.7\t24.8\t3.1\t23367\t214000\t0.703\t81423\tObama\t81423\t0.00102701\t81423.0\n2653\t-107.813023\t37.938815000000005\tTelluride town\tCO\tColorado\tSan Miguel County\t2583\t31.6\t59.6\t3.0\t39070\t812500\t0.703\t81435\tObama\t81435\t0.005573039\t81435.0\n2654\t-102.388471\t40.960516\tOvid town\tCO\tColorado\tSedgwick County\t258\t50.1\t8.0\t0.0\t16827\t57273\t0.3132\t80744\tObama\t80744\t0.000556657\t80744.0\n2655\t-102.525653\t40.935046\tSedgwick town\tCO\tColorado\tSedgwick County\t175\t46.8\t21.1\t3.1\t20982\t80000\t0.3132\t80749\tObama\t80749\t0.000377577\t80749.0\n2656\t-102.26478900000001\t40.987072999999995\tJulesburg town\tCO\tColorado\tSedgwick County\t1353\t43.4\t14.5\t2.8\t18268\t80125\t0.3132\t80737\tObama\t80737\t0.0029192109999999997\t80737.0\n2657\t-106.09211599999999\t39.579539000000004\tFrisco town\tCO\tColorado\tSummit County\t2972\t36.1\t65.3\t6.8\t39538\t489224\t0.6104\t80443\tObama\t80443\t0.006412339\t80443.0\n2658\t-105.86771100000001\t39.581548\tMontezuma town\tCO\tColorado\tSummit County\t48\t30.8\t50.0\t10.3\t35221\t475000\t0.6104\t80435\tObama\t80435\t0.000103564\t80435.0\n2659\t-106.042229\t39.499828\tBreckenridge town\tCO\tColorado\tSummit County\t2764\t32.9\t58.1\t5.6\t36260\t530488\t0.6104\t80424\tObama\t80424\t0.005963561\t80424.0\n2660\t-106.082334\t39.651028000000004\tSilverthorne town\tCO\tColorado\tSummit County\t3753\t30.6\t40.7\t10.4\t31613\t447368\t0.6104\t804HH\tObama\t804HH\t0.008097412\t0.0\n2661\t-106.04128100000001\t39.434414000000004\tBlue River town\tCO\tColorado\tSummit County\t808\t33.1\t60.3\t3.8\t39506\t534722\t0.6104\t80424\tObama\t80424\t0.001743328\t80424.0\n2662\t-105.937226\t39.590278000000005\tKeystone CDP\tCO\tColorado\tSummit County\t954\t28.9\t48.8\t5.0\t31392\t584016\t0.6104\t80435\tObama\t80435\t0.002058335\t80435.0\n2663\t-106.03819299999999\t39.620977\tDillon town\tCO\tColorado\tSummit County\t924\t41.0\t51.6\t6.5\t37736\t422794\t0.6104\t804HH\tObama\t804HH\t0.001993607\t0.0\n2664\t-105.179794\t38.74649\tCripple Creek city\tCO\tColorado\tTeller County\t1215\t44.1\t20.4\t9.4\t23553\t157188\t0.3232\t80813\tObama\t80813\t0.0026214640000000004\t80813.0\n2665\t-105.05891299999999\t39.000057\tWoodland Park city\tCO\tColorado\tTeller County\t7079\t41.0\t39.4\t7.6\t28056\t219798\t0.3232\t80863\tObama\t80863\t0.015273535\t80863.0\n2666\t-105.14202399999999\t38.70877\tVictor city\tCO\tColorado\tTeller County\t471\t40.8\t16.2\t14.3\t19832\t106081\t0.3232\t80860\tObama\t80860\t0.001016222\t80860.0\n2667\t-102.962082\t40.150161\tOtis town\tCO\tColorado\tWashington County\t434\t41.7\t16.7\t2.9\t21231\t85000\t0.1806\t80743\tObama\t80743\t0.0009363910000000001\t80743.0\n2668\t-103.213073\t40.160887\tAkron town\tCO\tColorado\tWashington County\t1693\t41.5\t15.1\t4.8\t19437\t90441\t0.1806\t80720\tObama\t80720\t0.003652789\t80720.0\n2669\t-104.965682\t40.07216\tDacono city\tCO\tColorado\tWeld County\t3941\t34.9\t10.1\t15.6\t21028\t120926\t0.4233\t80514\tObama\t80514\t0.008503037\t80514.0\n2670\t-104.73360500000001\t40.583997\tAult town\tCO\tColorado\tWeld County\t2140\t34.9\t21.3\t12.1\t17478\t127474\t0.4233\t80650\tObama\t80650\t0.0046172290000000005\t80650.0\n2671\t-104.562125\t40.387723\tKersey town\tCO\tColorado\tWeld County\t1973\t37.2\t20.4\t12.3\t19476\t147953\t0.4233\t80644\tObama\t80644\t0.004256913\t80644.0\n2672\t-104.86533500000002\t40.323137\tMilliken town\tCO\tColorado\tWeld County\t4944\t30.0\t21.9\t10.7\t21306\t171250\t0.4233\t80543\tObama\t80543\t0.010667093999999998\t80543.0\n2673\t-104.70353100000001\t40.348819\tLa Salle town\tCO\tColorado\tWeld County\t2101\t37.3\t13.3\t11.4\t20340\t145708\t0.4233\t80645\tObama\t80645\t0.004533083\t80645.0\n2674\t-104.96248999999999\t40.110071000000005\tFrederick town\tCO\tColorado\tWeld County\t7243\t36.1\t21.3\t8.6\t24953\t184232\t0.4233\t80520\tObama\t80520\t0.015627379\t80520.0\n2675\t-104.75595200000001\t40.109759000000004\tAristocrat Ranchettes CDP\tCO\tColorado\tWeld County\t1475\t37.8\t16.3\t8.2\t19068\t166071\t0.4233\t80621\tObama\t80621\t0.003182436\t80621.0\n2676\t-104.821061\t40.214868\tPlatteville town\tCO\tColorado\tWeld County\t2724\t33.9\t14.2\t16.3\t18730\t160302\t0.4233\t80651\tObama\t80651\t0.005877258000000001\t80651.0\n2677\t-104.627243\t40.077903000000006\tHudson town\tCO\tColorado\tWeld County\t2282\t32.8\t11.1\t10.4\t18779\t144037\t0.4233\t80642\tObama\t80642\t0.004923606\t80642.0\n2678\t-104.520363\t40.108011\tKeenesburg town\tCO\tColorado\tWeld County\t1159\t37.5\t13.4\t11.0\t21643\t170313\t0.4233\t80643\tObama\t80643\t0.002500639\t80643.0\n2679\t-104.798604\t40.086237\tFort Lupton city\tCO\tColorado\tWeld County\t7976\t29.3\t14.9\t12.9\t17645\t154197\t0.4233\t80621\tObama\t80621\t0.017208887\t80621.0\n2680\t-104.226761\t40.869935\tGrover town\tCO\tColorado\tWeld County\t164\t42.5\t19.6\t10.8\t18674\t122222\t0.4233\t80729\tObama\t80729\t0.000353844\t80729.0\n2681\t-104.91266200000001\t40.474779999999996\tWindsor town\tCO\tColorado\tWeld County\t17067\t34.6\t35.5\t7.6\t28015\t198605\t0.4233\t80550\tObama\t80550\t0.036823481\t80550.0\n2682\t-104.781817\t40.283252000000005\tGilcrest town\tCO\tColorado\tWeld County\t1183\t29.5\t10.4\t14.3\t17426\t138291\t0.4233\t80623\tObama\t80623\t0.002552421\t80623.0\n2683\t-104.84376\t40.550178\tSeverance town\tCO\tColorado\tWeld County\t1081\t39.0\t41.1\t5.9\t26581\t187153\t0.4233\t80550\tObama\t80550\t0.0023323479999999997\t80550.0\n2684\t-104.989079\t40.237452000000005\tMead town\tCO\tColorado\tWeld County\t2894\t34.7\t26.6\t7.5\t31332\t227358\t0.4233\t80542\tObama\t80542\t0.006244047\t80542.0\n2685\t-104.747698\t40.419221\tGreeley city\tCO\tColorado\tWeld County\t95810\t30.6\t29.8\t13.3\t21191\t171015\t0.4233\t80634\tObama\t80634\t0.206718092\t80634.0\n2686\t-104.756938\t40.632708\tPierce town\tCO\tColorado\tWeld County\t1258\t40.2\t12.4\t10.6\t18031\t135100\t0.4233\t80650\tObama\t80650\t0.00271424\t80650.0\n2687\t-104.71471899999999\t40.009423\tLochbuie town\tCO\tColorado\tWeld County\t4427\t36.4\t7.4\t11.2\t17838\t136626\t0.4233\t80642\tObama\t80642\t0.009551623\t80642.0\n2688\t-103.84442\t40.607308\tRaymer town\tCO\tColorado\tWeld County\t101\t42.1\t20.3\t10.9\t18675\t129167\t0.4233\t80742\tObama\t80742\t0.000217916\t80742.0\n2689\t-104.94193200000001\t40.139627000000004\tFirestone town\tCO\tColorado\tWeld County\t5756\t38.5\t21.5\t8.5\t23136\t186045\t0.4233\t80520\tObama\t80520\t0.012419052\t80520.0\n2690\t-104.786826\t40.703992\tNunn town\tCO\tColorado\tWeld County\t590\t38.4\t28.7\t10.3\t20256\t123214\t0.4233\t80648\tObama\t80648\t0.0012729739999999999\t80648.0\n2691\t-104.91778000000001\t40.336414000000005\tJohnstown town\tCO\tColorado\tWeld County\t4815\t32.2\t22.7\t9.0\t23629\t182895\t0.4233\t80534\tObama\t80534\t0.010388765\t80534.0\n2692\t-104.689444\t40.394921000000004\tGarden City town\tCO\tColorado\tWeld County\t489\t27.2\t7.1\t19.1\t12942\t124038\t0.4233\t80620\tObama\t80620\t0.001055058\t80620.0\n2693\t-104.712416\t40.527074\tEaton town\tCO\tColorado\tWeld County\t4146\t38.9\t24.9\t11.2\t23392\t175845\t0.4233\t80615\tObama\t80615\t0.008945342\t80615.0\n2694\t-104.709659\t40.378504\tEvans city\tCO\tColorado\tWeld County\t14787\t29.7\t20.8\t12.7\t18658\t154142\t0.4233\t80620\tObama\t80620\t0.03190419\t80620.0\n2695\t-102.723448\t40.123774\tYuma city\tCO\tColorado\tYuma County\t3358\t37.9\t16.1\t4.8\t18750\t127890\t0.2156\t80759\tObama\t80759\t0.007245166\t80759.0\n2696\t-102.488547\t40.112439\tEckley town\tCO\tColorado\tYuma County\t299\t37.1\t3.2\t4.4\t16530\t123864\t0.2156\t80727\tObama\t80727\t0.0006451180000000001\t80727.0\n2697\t-102.227838\t40.080345\tWray city\tCO\tColorado\tYuma County\t2162\t42.1\t15.6\t3.8\t18119\t110520\t0.2156\t80758\tObama\t80758\t0.004664695999999999\t80758.0\n2698\t-73.13829799999999\t41.306006\tShelton city\tCT\tConnecticut\tFairfield County\t40054\t43.2\t34.3\t7.9\t39410\t343774\t0.5485\t6484\tObama\t06484\t0.134788691\t6484.0\n2699\t-73.434282\t41.249351000000004\tGeorgetown CDP\tCT\tConnecticut\tFairfield County\t1748\t42.9\t71.9\t6.5\t67548\t792837\t0.5485\t6897\tObama\t06897\t0.005882325\t6897.0\n2700\t-73.34635\t41.14522\tWestport CDP\tCT\tConnecticut\tFairfield County\t26071\t44.6\t73.4\t8.0\t83837\t888533\t0.5485\t6880\tObama\t06880\t0.087733459\t6880.0\n2701\t-73.411477\t41.372643\tBethel CDP\tCT\tConnecticut\tFairfield County\t9382\t39.2\t35.8\t7.8\t35549\t280117\t0.5485\t6801\tObama\t06801\t0.031572065\t6801.0\n2702\t-73.208221\t41.260078\tTrumbull CDP\tCT\tConnecticut\tFairfield County\t35263\t43.2\t48.9\t6.9\t47548\t435914\t0.5485\t6611\tObama\t06611\t0.118666141\t6611.0\n2703\t-73.49525200000001\t41.271169\tRidgefield CDP\tCT\tConnecticut\tFairfield County\t7225\t44.0\t66.7\t6.9\t66841\t657047\t0.5485\t6877\tObama\t06877\t0.024313384\t6877.0\n2704\t-73.196271\t41.193104\tBridgeport city\tCT\tConnecticut\tFairfield County\t144746\t31.6\t15.0\t17.4\t22192\t189473\t0.5485\t6604\tObama\t06604\t0.48709551799999995\t6604.0\n2705\t-73.559061\t41.104973\tStamford city\tCT\tConnecticut\tFairfield County\t119005\t38.6\t43.6\t9.1\t45560\t495579\t0.5485\t6905\tObama\t06905\t0.40047256700000006\t6905.0\n2706\t-73.482546\t41.080919\tDarien CDP\tCT\tConnecticut\tFairfield County\t20136\t39.8\t74.5\t4.9\t82319\t962355\t0.5485\t6820\tObama\t06820\t0.06776115\t6820.0\n2707\t-73.47104300000001\t41.401602000000004\tDanbury city\tCT\tConnecticut\tFairfield County\t79979\t37.5\t31.5\t8.8\t33958\t283773\t0.5485\t6810\tObama\t06810\t0.269143275\t6810.0\n2708\t-73.42272700000001\t41.118417\tNorwalk city\tCT\tConnecticut\tFairfield County\t83460\t39.3\t38.7\t10.3\t41775\t415005\t0.5485\t6850\tObama\t06850\t0.280857446\t6850.0\n2709\t-73.312066\t41.412007\tNewtown borough\tCT\tConnecticut\tFairfield County\t1902\t42.5\t61.4\t5.7\t47753\t418038\t0.5485\t6470\tObama\t06470\t0.006400561999999999\t6470.0\n2710\t-73.130165\t41.208602\tStratford CDP\tCT\tConnecticut\tFairfield County\t49950\t42.7\t29.8\t9.1\t34600\t260859\t0.5485\t6614\tObama\t06614\t0.16809045600000003\t6614.0\n2711\t-72.542688\t41.909458\tBroad Brook CDP\tCT\tConnecticut\tHartford County\t4100\t40.0\t25.0\t8.6\t29914\t231599\t0.6237\t6016\tObama\t06016\t0.013797215\t6016.0\n2712\t-72.785822\t41.676047\tNew Britain city\tCT\tConnecticut\tHartford County\t71246\t34.6\t19.7\t15.6\t22229\t148612\t0.6237\t6053\tObama\t06053\t0.239755208\t6053.0\n2713\t-72.829088\t41.845815\tWeatogue CDP\tCT\tConnecticut\tHartford County\t2845\t42.7\t67.7\t5.8\t50637\t335354\t0.6237\t6089\tObama\t06089\t0.009573920999999999\t6089.0\n2714\t-72.695411\t41.813194\tBlue Hills CDP\tCT\tConnecticut\tHartford County\t3035\t41.7\t10.5\t18.0\t24205\t155155\t0.6237\t6112\tObama\t06112\t0.010213304\t6112.0\n2715\t-72.844031\t42.015132\tNorth Granby CDP\tCT\tConnecticut\tHartford County\t1917\t44.9\t57.4\t12.7\t45747\t409794\t0.6237\t6060\tObama\t06060\t0.006451039\t6060.0\n2716\t-72.730789\t41.687051000000004\tNewington CDP\tCT\tConnecticut\tHartford County\t29868\t45.2\t33.4\t8.7\t32721\t224570\t0.6237\t6111\tObama\t06111\t0.10051102599999999\t6111.0\n2717\t-72.469208\t41.634468\tTerramuggus CDP\tCT\tConnecticut\tHartford County\t1071\t42.5\t44.4\t5.2\t37207\t260309\t0.6237\t6447\tObama\t06447\t0.003604102\t6447.0\n2718\t-72.599524\t41.701933000000004\tGlastonbury Center CDP\tCT\tConnecticut\tHartford County\t7297\t47.6\t56.4\t7.8\t44436\t296702\t0.6237\t6033\tObama\t06033\t0.024555677\t6033.0\n2719\t-72.683353\t41.766073\tHartford city\tCT\tConnecticut\tHartford County\t126855\t29.6\t16.0\t22.2\t16576\t145411\t0.6237\t6103\tObama\t06103\t0.426889185\t6103.0\n2720\t-72.897676\t41.831619\tCanton Valley CDP\tCT\tConnecticut\tHartford County\t1664\t43.9\t43.4\t6.3\t35663\t237245\t0.6237\t6019\tObama\t06019\t0.00559965\t6019.0\n2721\t-72.64634699999999\t41.983098\tSuffield Depot CDP\tCT\tConnecticut\tHartford County\t1319\t40.6\t40.2\t7.7\t36373\t285556\t0.6237\t6078\tObama\t06078\t0.004438665\t6078.0\n2722\t-72.76786700000001\t41.907512\tTariffville CDP\tCT\tConnecticut\tHartford County\t1465\t41.3\t46.2\t8.4\t37840\t224339\t0.6237\t6081\tObama\t06081\t0.00492998\t6081.0\n2723\t-72.615163\t41.763409\tEast Hartford CDP\tCT\tConnecticut\tHartford County\t49599\t39.6\t15.7\t11.1\t25253\t170866\t0.6237\t6108\tObama\t06108\t0.16690928\t6108.0\n2724\t-72.52555799999999\t41.989869\tHazardville CDP\tCT\tConnecticut\tHartford County\t4891\t41.1\t16.6\t11.3\t25331\t190122\t0.6237\t6082\tObama\t06082\t0.016459067\t6082.0\n2725\t-72.654706\t41.926914000000004\tWindsor Locks CDP\tCT\tConnecticut\tHartford County\t12498\t42.3\t20.0\t8.0\t28501\t189068\t0.6237\t6096\tObama\t06096\t0.042057948\t6096.0\n2726\t-72.811198\t41.881021000000004\tSimsbury Center CDP\tCT\tConnecticut\tHartford County\t5667\t42.6\t62.2\t7.8\t42097\t326132\t0.6237\t6070\tObama\t06070\t0.019070443\t6070.0\n2727\t-72.844799\t41.87487\tWest Simsbury CDP\tCT\tConnecticut\tHartford County\t2449\t46.8\t66.8\t4.6\t50629\t430531\t0.6237\t6092\tObama\t06092\t0.008241311999999999\t6092.0\n2728\t-72.566014\t42.012556\tSherwood Manor CDP\tCT\tConnecticut\tHartford County\t5660\t44.1\t20.9\t7.7\t27926\t199730\t0.6237\t6082\tObama\t06082\t0.019046886000000002\t6082.0\n2729\t-72.77136800000001\t41.629709000000005\tKensington CDP\tCT\tConnecticut\tHartford County\t8609\t43.9\t30.0\t7.6\t31003\t248227\t0.6237\t6037\tObama\t06037\t0.028970785\t6037.0\n2730\t-72.92219899999999\t41.818787\tCollinsville CDP\tCT\tConnecticut\tHartford County\t3416\t42.6\t38.8\t7.0\t35192\t227593\t0.6237\t6022\tObama\t06022\t0.011495435\t6022.0\n2731\t-72.571747\t41.960947999999995\tSouthwood Acres CDP\tCT\tConnecticut\tHartford County\t7999\t43.0\t22.2\t10.8\t27736\t191301\t0.6237\t6082\tObama\t06082\t0.026918029\t6082.0\n2732\t-72.519144\t41.780132\tCentral Manchester CDP\tCT\tConnecticut\tHartford County\t29984\t37.9\t26.2\t10.6\t27406\t175311\t0.6237\t6040\tObama\t06040\t0.100901386\t6040.0\n2733\t-72.670209\t41.701281\tWethersfield CDP\tCT\tConnecticut\tHartford County\t26070\t47.4\t37.7\t7.2\t33048\t249509\t0.6237\t6109\tObama\t06109\t0.08773009400000001\t6109.0\n2734\t-72.596452\t41.991649\tThompsonville CDP\tCT\tConnecticut\tHartford County\t8136\t35.5\t22.1\t9.9\t24720\t182208\t0.6237\t6082\tObama\t06082\t0.027379057999999998\t6082.0\n2735\t-72.793049\t41.956733\tSalmon Brook CDP\tCT\tConnecticut\tHartford County\t2475\t46.5\t47.2\t4.6\t36532\t262842\t0.6237\t6035\tObama\t06035\t0.008328806\t6035.0\n2736\t-72.940713\t41.681166999999995\tBristol city\tCT\tConnecticut\tHartford County\t60441\t40.4\t18.9\t10.5\t28667\t193053\t0.6237\t6010\tObama\t06010\t0.20339449899999998\t6010.0\n2737\t-72.75349399999999\t41.766901000000004\tWest Hartford CDP\tCT\tConnecticut\tHartford County\t61842\t43.4\t56.8\t10.5\t40070\t276559\t0.6237\t6107\tObama\t06107\t0.208109109\t6107.0\n2738\t-73.406353\t41.584108\tNew Milford CDP\tCT\tConnecticut\tLitchfield County\t6722\t38.7\t24.9\t10.1\t32796\t241887\t0.4745\t6776\tObama\t06776\t0.022620702000000003\t6776.0\n2739\t-72.975257\t41.880108\tNew Hartford Center CDP\tCT\tConnecticut\tLitchfield County\t997\t44.5\t34.7\t9.1\t32305\t256329\t0.4745\t6057\tObama\t06057\t0.0033550790000000004\t6057.0\n2740\t-73.07938299999999\t41.776888\tNorthwest Harwinton CDP\tCT\tConnecticut\tLitchfield County\t3350\t45.1\t28.7\t13.7\t34496\t244272\t0.4745\t6791\tObama\t06791\t0.011273334\t6791.0\n2741\t-73.204713\t41.544596000000006\tWoodbury Center CDP\tCT\tConnecticut\tLitchfield County\t1344\t44.7\t40.3\t8.6\t46616\t446739\t0.4745\t6798\tObama\t06798\t0.004522794\t6798.0\n2742\t-73.085657\t41.592203000000005\tOakville CDP\tCT\tConnecticut\tLitchfield County\t8727\t40.5\t18.6\t13.1\t27793\t201338\t0.4745\t6779\tObama\t06779\t0.029367876\t6779.0\n2743\t-73.203016\t41.640115\tBethlehem Village CDP\tCT\tConnecticut\tLitchfield County\t2220\t46.9\t38.0\t6.8\t40013\t362093\t0.4745\t6751\tObama\t06751\t0.007470686999999999\t6751.0\n2744\t-73.006497\t41.678379\tTerryville CDP\tCT\tConnecticut\tLitchfield County\t5532\t38.7\t16.2\t12.6\t31755\t192969\t0.4745\t6786\tObama\t06786\t0.018616143999999998\t6786.0\n2745\t-73.128163\t41.834919\tTorrington city\tCT\tConnecticut\tLitchfield County\t35481\t41.9\t18.2\t11.6\t28091\t177750\t0.4745\t6790\tObama\t06790\t0.119399749\t6790.0\n2746\t-73.189199\t41.745764\tLitchfield borough\tCT\tConnecticut\tLitchfield County\t1391\t47.2\t54.0\t3.5\t45140\t366176\t0.4745\t6759\tObama\t06759\t0.004680957\t6759.0\n2747\t-73.06750500000001\t41.926807000000004\tWinsted CDP\tCT\tConnecticut\tLitchfield County\t7296\t41.0\t17.4\t10.8\t27292\t187094\t0.4745\t6098\tObama\t06098\t0.024552312000000003\t6098.0\n2748\t-73.332241\t42.034746000000005\tCanaan CDP\tCT\tConnecticut\tLitchfield County\t1335\t43.1\t21.1\t15.4\t25266\t180500\t0.4745\t6018\tObama\t06018\t0.004492508\t6018.0\n2749\t-73.242272\t41.724762\tBantam borough\tCT\tConnecticut\tLitchfield County\t816\t46.8\t30.2\t9.6\t32290\t236000\t0.4745\t6750\tObama\t06750\t0.002745982\t6750.0\n2750\t-73.352284\t41.681251\tNew Preston CDP\tCT\tConnecticut\tLitchfield County\t1161\t45.0\t36.8\t10.1\t31609\t392537\t0.4745\t6777\tObama\t06777\t0.003906967\t6777.0\n2751\t-72.556189\t41.489909000000004\tHigganum CDP\tCT\tConnecticut\tMiddlesex County\t1802\t44.9\t39.6\t4.9\t40733\t273020\t0.5729\t6441\tObama\t06441\t0.006064044\t6441.0\n2752\t-72.622682\t41.58278\tPortland CDP\tCT\tConnecticut\tMiddlesex County\t6161\t42.1\t32.0\t9.7\t35107\t223402\t0.5729\t6480\tObama\t06480\t0.020732839\t6480.0\n2753\t-72.452336\t41.401261\tChester Center CDP\tCT\tConnecticut\tMiddlesex County\t1614\t44.7\t39.1\t6.9\t44635\t301531\t0.5729\t6412\tObama\t06412\t0.005431391\t6412.0\n2754\t-72.449055\t41.504277\tMoodus CDP\tCT\tConnecticut\tMiddlesex County\t1576\t42.0\t31.5\t9.6\t37636\t246000\t0.5729\t6469\tObama\t06469\t0.005303515\t6469.0\n2755\t-72.529913\t41.276984000000006\tClinton CDP\tCT\tConnecticut\tMiddlesex County\t3531\t41.3\t31.3\t6.4\t31198\t243723\t0.5729\t6413\tObama\t06413\t0.01188243\t6413.0\n2756\t-72.510785\t41.593564\tLake Pocotopaug CDP\tCT\tConnecticut\tMiddlesex County\t3516\t42.3\t31.0\t7.7\t41896\t224776\t0.5729\t6424\tObama\t06424\t0.011831953000000001\t6424.0\n2757\t-72.491753\t41.573498\tEast Hampton CDP\tCT\tConnecticut\tMiddlesex County\t2567\t40.3\t35.0\t13.9\t35819\t226689\t0.5729\t6424\tObama\t06424\t0.008638402\t6424.0\n2758\t-72.438516\t41.382201\tDeep River Center CDP\tCT\tConnecticut\tMiddlesex County\t2485\t42.7\t35.2\t12.8\t34719\t246801\t0.5729\t6417\tObama\t06417\t0.008362458\t6417.0\n2759\t-72.36919300000001\t41.291934000000005\tOld Saybrook Center CDP\tCT\tConnecticut\tMiddlesex County\t2066\t49.0\t39.8\t11.5\t42082\t307143\t0.5729\t6475\tObama\t06475\t0.00695245\t6475.0\n2760\t-72.406267\t41.282584\tSaybrook Manor CDP\tCT\tConnecticut\tMiddlesex County\t1119\t49.1\t33.4\t11.6\t33633\t269954\t0.5729\t6475\tObama\t06475\t0.00376563\t6475.0\n2761\t-72.354419\t41.271088\tFenwick borough\tCT\tConnecticut\tMiddlesex County\t53\t56.3\t47.6\t0.0\t50456\t390000\t0.5729\t6475\tObama\t06475\t0.000178354\t6475.0\n2762\t-72.681409\t41.473938000000004\tDurham CDP\tCT\tConnecticut\tMiddlesex County\t2990\t43.2\t39.2\t6.0\t36969\t296172\t0.5729\t6422\tObama\t06422\t0.010061871\t6422.0\n2763\t-72.391019\t41.355527\tEssex Village CDP\tCT\tConnecticut\tMiddlesex County\t2626\t52.5\t65.4\t10.2\t66246\t546315\t0.5729\t6426\tObama\t06426\t0.008836948\t6426.0\n2764\t-72.65476899999999\t41.547455\tMiddletown city\tCT\tConnecticut\tMiddlesex County\t48408\t37.6\t34.8\t10.6\t34033\t216444\t0.5729\t6457\tObama\t06457\t0.162901357\t6457.0\n2765\t-72.44209599999999\t41.281164000000004\tWestbrook Center CDP\tCT\tConnecticut\tMiddlesex County\t2476\t46.7\t35.8\t13.6\t38480\t247593\t0.5729\t6498\tObama\t06498\t0.008332171999999999\t6498.0\n2766\t-73.06888599999999\t41.344226\tAnsonia city\tCT\tConnecticut\tNew Haven County\t18720\t38.3\t18.1\t11.4\t25208\t227109\t0.6065\t6401\tObama\t06401\t0.062996063\t6401.0\n2767\t-72.899176\t41.502606\tCheshire Village CDP\tCT\tConnecticut\tNew Haven County\t5851\t43.5\t54.1\t7.1\t40875\t346181\t0.6065\t6410\tObama\t06410\t0.019689635\t6410.0\n2768\t-73.05182099999999\t41.488999\tNaugatuck borough\tCT\tConnecticut\tNew Haven County\t31483\t37.7\t22.5\t11.8\t27687\t207960\t0.6065\t6770\tObama\t06770\t0.10594578199999999\t6770.0\n2769\t-72.60038399999999\t41.279474\tMadison Center CDP\tCT\tConnecticut\tNew Haven County\t2366\t48.9\t60.9\t5.6\t61280\t494538\t0.6065\t6443\tObama\t06443\t0.007962002\t6443.0\n2770\t-72.857886\t41.298281\tEast Haven CDP\tCT\tConnecticut\tNew Haven County\t28833\t41.6\t20.4\t10.0\t27988\t203761\t0.6065\t6512\tObama\t06512\t0.09702807\t6512.0\n2771\t-72.815055\t41.277371\tBranford Center CDP\tCT\tConnecticut\tNew Haven County\t5797\t42.4\t36.8\t7.5\t35543\t241890\t0.6065\t6405\tObama\t06405\t0.019507915\t6405.0\n2772\t-73.234236\t41.484982\tHeritage Village CDP\tCT\tConnecticut\tNew Haven County\t3466\t77.3\t43.2\t15.3\t36511\t181526\t0.6065\t6488\tObama\t06488\t0.011663693999999999\t6488.0\n2773\t-73.06258100000001\t41.225646999999995\tMilford city (balance)\tCT\tConnecticut\tNew Haven County\t51908\t42.4\t33.2\t10.1\t35077\t272225\t0.6065\t6460\tObama\t06460\t0.174679467\t6460.0\n2774\t-73.083219\t41.326442\tDerby city\tCT\tConnecticut\tNew Haven County\t12320\t40.6\t21.8\t9.5\t29346\t213839\t0.6065\t6418\tObama\t06418\t0.041458947\t6418.0\n2775\t-72.794296\t41.536788\tMeriden city\tCT\tConnecticut\tNew Haven County\t60360\t38.4\t19.8\t11.0\t26001\t186308\t0.6065\t6450\tObama\t06450\t0.20312192\t6450.0\n2776\t-72.924759\t41.311501\tNew Haven city\tCT\tConnecticut\tNew Haven County\t127481\t29.6\t30.8\t19.5\t20974\t168056\t0.6065\t6510\tObama\t06510\t0.428995784\t6510.0\n2777\t-72.857218\t41.381832\tNorth Haven CDP\tCT\tConnecticut\tNew Haven County\t24215\t44.2\t36.2\t7.0\t36419\t292384\t0.6065\t6473\tObama\t06473\t0.081487695\t6473.0\n2778\t-72.676136\t41.281538\tGuilford Center CDP\tCT\tConnecticut\tNew Haven County\t2593\t46.4\t51.5\t8.6\t39050\t347908\t0.6065\t6437\tObama\t06437\t0.008725897\t6437.0\n2779\t-73.03607099999999\t41.558254999999996\tWaterbury city\tCT\tConnecticut\tNew Haven County\t108313\t35.7\t17.0\t16.7\t22060\t156400\t0.6065\t6702\tObama\t06702\t0.36449212299999995\t6702.0\n2780\t-73.027244\t41.282740000000004\tOrange CDP\tCT\tConnecticut\tNew Haven County\t14120\t46.6\t49.5\t8.0\t42261\t430337\t0.6065\t6477\tObama\t06477\t0.047516261\t6477.0\n2781\t-72.96664399999999\t41.273713\tWest Haven city\tCT\tConnecticut\tNew Haven County\t52887\t38.4\t22.8\t11.3\t26191\t190012\t0.6065\t6516\tObama\t06516\t0.177973973\t6516.0\n2782\t-72.992299\t41.228497999999995\tWoodmont borough\tCT\tConnecticut\tNew Haven County\t1694\t44.3\t44.4\t9.2\t39441\t285714\t0.6065\t6516\tObama\t06516\t0.005700605\t6516.0\n2783\t-72.81896\t41.450187\tWallingford Center CDP\tCT\tConnecticut\tNew Haven County\t17543\t40.0\t26.7\t10.1\t28598\t233192\t0.6065\t6492\tObama\t06492\t0.059035252999999996\t6492.0\n2784\t-72.017767\t41.338164\tPoquonock Bridge CDP\tCT\tConnecticut\tNew London County\t1613\t35.3\t10.0\t13.3\t20874\t143910\t0.5833\t6340\tObama\t06340\t0.005428026\t6340.0\n2785\t-71.99798100000001\t41.334142\tNoank CDP\tCT\tConnecticut\tNew London County\t1819\t50.1\t52.0\t5.8\t40861\t414118\t0.5833\t6355\tObama\t06355\t0.006121252\t6355.0\n2786\t-71.980783\t41.606826\tJewett City borough\tCT\tConnecticut\tNew London County\t3081\t36.4\t14.0\t13.4\t25628\t153340\t0.5833\t6351\tObama\t06351\t0.010368101999999999\t6351.0\n2787\t-71.954404\t41.35801\tMystic CDP\tCT\tConnecticut\tNew London County\t4440\t46.1\t52.1\t8.4\t43041\t356500\t0.5833\t6355\tObama\t06355\t0.014941373999999999\t6355.0\n2788\t-72.129173\t41.34532\tCentral Waterford CDP\tCT\tConnecticut\tNew London County\t2873\t47.5\t19.9\t10.2\t29253\t185577\t0.5833\t6385\tObama\t06385\t0.009668145999999999\t6385.0\n2789\t-71.851563\t41.37645\tPawcatuck CDP\tCT\tConnecticut\tNew London County\t5402\t40.2\t26.3\t8.0\t27193\t224932\t0.5833\t6379\tObama\t06379\t0.018178672\t6379.0\n2790\t-71.902383\t41.335356\tStonington borough\tCT\tConnecticut\tNew London County\t991\t50.1\t57.0\t12.4\t47115\t540000\t0.5833\t6378\tObama\t06378\t0.003334888\t6378.0\n2791\t-72.051716\t41.353817\tLong Hill CDP\tCT\tConnecticut\tNew London County\t3753\t40.8\t27.1\t8.3\t31352\t147809\t0.5833\t6340\tObama\t06340\t0.012629498999999999\t6340.0\n2792\t-72.19527\t41.326245\tNiantic CDP\tCT\tConnecticut\tNew London County\t3089\t44.8\t41.0\t8.0\t36734\t266353\t0.5833\t6357\tObama\t06357\t0.010395023\t6357.0\n2793\t-72.125063\t41.444121\tOxoboxo River CDP\tCT\tConnecticut\tNew London County\t3230\t43.0\t17.6\t6.9\t29785\t188511\t0.5833\t6382\tObama\t06382\t0.010869513\t6382.0\n2794\t-72.10269699999999\t41.350731\tNew London city\tCT\tConnecticut\tNew London County\t25980\t31.4\t23.5\t13.4\t22861\t162218\t0.5833\t6320\tObama\t06320\t0.08742722800000001\t6320.0\n2795\t-72.00892900000001\t41.314399\tGroton Long Point borough\tCT\tConnecticut\tNew London County\t663\t48.7\t66.2\t8.8\t59308\t625000\t0.5833\t6340\tObama\t06340\t0.002231111\t6340.0\n2796\t-72.06861500000001\t41.385521000000004\tConning Towers-Nautilus Park CDP\tCT\tConnecticut\tNew London County\t10902\t23.1\t16.4\t10.3\t19302\t179104\t0.5833\t063HH\tObama\t063HH\t0.03668713\t0.0\n2797\t-72.088222\t41.549375\tNorwich city\tCT\tConnecticut\tNew London County\t36659\t38.5\t22.1\t11.8\t25671\t166424\t0.5833\t6360\tObama\t06360\t0.123363924\t6360.0\n2798\t-72.07341\t41.340886\tGroton city\tCT\tConnecticut\tNew London County\t9074\t33.1\t20.9\t13.2\t27651\t196229\t0.5833\t6340\tObama\t06340\t0.030535592\t6340.0\n2799\t-71.98484\t41.385514\tOld Mystic CDP\tCT\tConnecticut\tNew London County\t3442\t43.1\t29.4\t6.3\t32652\t211873\t0.5833\t6355\tObama\t06355\t0.01158293\t6355.0\n2800\t-72.442892\t41.991065\tCentral Somers CDP\tCT\tConnecticut\tTolland County\t1768\t43.1\t30.4\t9.9\t38393\t290682\t0.5545\t6071\tObama\t06071\t0.005949628\t6071.0\n2801\t-72.328745\t41.773668\tCoventry Lake CDP\tCT\tConnecticut\tTolland County\t3135\t38.0\t23.9\t14.1\t37764\t189013\t0.5545\t6238\tObama\t06238\t0.010549821000000001\t6238.0\n2802\t-72.255134\t41.804502\tStorrs CDP\tCT\tConnecticut\tTolland County\t13424\t21.3\t68.9\t10.8\t19751\t212064\t0.5545\t6269\tObama\t06269\t0.0451741\t6269.0\n2803\t-72.45313399999999\t41.866690999999996\tRockville CDP\tCT\tConnecticut\tTolland County\t7638\t32.8\t18.1\t10.7\t25749\t164495\t0.5545\t6066\tObama\t06066\t0.025703201000000002\t6066.0\n2804\t-72.306146\t41.777781\tSouth Coventry CDP\tCT\tConnecticut\tTolland County\t1543\t39.9\t28.7\t9.3\t38002\t222945\t0.5545\t6238\tObama\t06238\t0.005192464\t6238.0\n2805\t-72.37522\t41.934101\tCrystal Lake CDP\tCT\tConnecticut\tTolland County\t1693\t42.3\t34.7\t3.8\t40278\t237414\t0.5545\t6084\tObama\t06084\t0.00569724\t6084.0\n2806\t-72.194372\t41.761824\tMansfield Center CDP\tCT\tConnecticut\tTolland County\t989\t42.5\t52.4\t5.5\t33832\t240234\t0.5545\t6250\tObama\t06250\t0.003328157\t6250.0\n2807\t-71.908866\t41.919862\tPutnam District CDP\tCT\tConnecticut\tWindham County\t7100\t37.5\t18.4\t11.5\t24192\t147725\t0.5572\t6260\tObama\t06260\t0.023892737\t6260.0\n2808\t-71.885816\t41.808409999999995\tDanielson borough\tCT\tConnecticut\tWindham County\t4278\t33.2\t14.8\t17.0\t19826\t144204\t0.5572\t6239\tObama\t06239\t0.014396216000000002\t6239.0\n2809\t-71.90902700000001\t41.751086\tWauregan CDP\tCT\tConnecticut\tWindham County\t1189\t32.5\t10.3\t13.4\t20085\t169492\t0.5572\t6354\tObama\t06354\t0.004001192\t6354.0\n2810\t-71.899333\t41.79438\tEast Brooklyn CDP\tCT\tConnecticut\tWindham County\t1529\t40.9\t4.8\t10.6\t18371\t172750\t0.5572\t6239\tObama\t06239\t0.005145350999999999\t6239.0\n2811\t-71.875162\t41.716852\tMoosup CDP\tCT\tConnecticut\tWindham County\t3230\t34.4\t14.4\t16.9\t21461\t160808\t0.5572\t6354\tObama\t06354\t0.010869513\t6354.0\n2812\t-71.9034\t41.986188\tNorth Grosvenor Dale CDP\tCT\tConnecticut\tWindham County\t1557\t37.6\t10.1\t11.2\t23566\t175000\t0.5572\t6255\tObama\t06255\t0.005239576\t6255.0\n2813\t-72.21743199999999\t41.715334999999996\tWillimantic CDP\tCT\tConnecticut\tWindham County\t16757\t29.1\t22.4\t13.8\t19339\t145116\t0.5572\t6226\tObama\t06226\t0.056390225999999995\t6226.0\n2814\t-71.937044\t42.010699\tQuinebaug CDP\tCT\tConnecticut\tWindham County\t1241\t45.0\t13.9\t4.3\t23573\t174265\t0.5572\t6262\tObama\t06262\t0.004176181\t6262.0\n2815\t-72.184673\t41.685047\tSouth Windham CDP\tCT\tConnecticut\tWindham County\t1375\t42.6\t26.7\t8.3\t29725\t165584\t0.5572\t062HH\tObama\t062HH\t0.004627115\t0.0\n2816\t-71.924931\t41.676646000000005\tPlainfield Village CDP\tCT\tConnecticut\tWindham County\t2696\t38.7\t6.4\t12.6\t19431\t142462\t0.5572\t6374\tObama\t06374\t0.00907251\t6374.0\n2817\t-71.96273000000001\t41.927537\tSouth Woodstock CDP\tCT\tConnecticut\tWindham County\t1326\t40.1\t26.7\t8.1\t25982\t202985\t0.5572\t6259\tObama\t06259\t0.004462221\t6259.0\n2818\t-75.48321800000001\t39.117309999999996\tDover Base Housing CDP\tDE\tDelaware\tKent County\t3077\t22.3\t23.8\t13.2\t17738\t124107\t0.5173\t19902\tObama\t19902\t0.024259929\t19902.0\n2819\t-75.571893\t38.92264\tHarrington city\tDE\tDelaware\tKent County\t3586\t34.8\t9.5\t11.2\t19873\t141527\t0.5173\t19952\tObama\t19952\t0.028273027000000003\t19952.0\n2820\t-75.516094\t39.132799\tKent Acres CDP\tDE\tDelaware\tKent County\t1743\t38.9\t33.0\t10.5\t26038\t183750\t0.5173\t19901\tObama\t19901\t0.0137423\t19901.0\n2821\t-75.401308\t39.060642\tBowers town\tDE\tDelaware\tKent County\t441\t40.1\t12.9\t7.9\t24178\t152500\t0.5173\t19946\tObama\t19946\t0.003476967\t19946.0\n2822\t-75.522019\t39.116366\tHighland Acres CDP\tDE\tDelaware\tKent County\t3810\t45.7\t37.3\t10.0\t31799\t255778\t0.5173\t19901\tObama\t19901\t0.030039106\t19901.0\n2823\t-75.504099\t38.91745\tHouston town\tDE\tDelaware\tKent County\t422\t40.4\t19.0\t6.6\t25842\t189423\t0.5173\t19954\tObama\t19954\t0.003327166\t19954.0\n2824\t-75.71241500000001\t39.168174\tHartly town\tDE\tDelaware\tKent County\t86\t35.8\t9.1\t11.4\t20216\t187500\t0.5173\t19953\tObama\t19953\t0.000678048\t19953.0\n2825\t-75.584615\t39.21719\tCheswold town\tDE\tDelaware\tKent County\t803\t32.4\t9.8\t10.9\t18432\t96667\t0.5173\t19904\tObama\t19904\t0.006331076999999999\t19904.0\n2826\t-75.664539\t39.227662\tKenton town\tDE\tDelaware\tKent County\t295\t37.1\t10.7\t6.9\t19327\t173864\t0.5173\t19955\tObama\t19955\t0.002325863\t19955.0\n2827\t-75.476051\t39.071394\tMagnolia town\tDE\tDelaware\tKent County\t240\t32.5\t22.8\t9.9\t22307\t229688\t0.5173\t19962\tObama\t19962\t0.001892227\t19962.0\n2828\t-75.54973199999999\t39.109061\tCamden town\tDE\tDelaware\tKent County\t3038\t40.9\t20.3\t8.7\t23165\t168534\t0.5173\t19934\tObama\t19934\t0.023952442\t19934.0\n2829\t-75.505055\t39.099837\tRising Sun-Lebanon CDP\tDE\tDelaware\tKent County\t3430\t29.2\t27.5\t12.6\t22970\t217199\t0.5173\t19962\tObama\t19962\t0.02704308\t19962.0\n2830\t-75.520087\t39.029340999999995\tRiverview CDP\tDE\tDelaware\tKent County\t2361\t38.4\t19.1\t8.0\t26347\t203860\t0.5173\t19962\tObama\t19962\t0.018614785\t19962.0\n2831\t-75.539369\t39.128459\tRodney Village CDP\tDE\tDelaware\tKent County\t1643\t42.0\t24.6\t13.6\t23543\t172549\t0.5173\t19904\tObama\t19904\t0.012953872\t19904.0\n2832\t-75.51536999999999\t39.243162\tLeipsic town\tDE\tDelaware\tKent County\t225\t38.4\t13.9\t11.6\t21443\t137500\t0.5173\t19901\tObama\t19901\t0.001773963\t19901.0\n2833\t-75.579137\t38.869784\tFarmington town\tDE\tDelaware\tKent County\t76\t38.3\t4.1\t8.3\t22707\t175000\t0.5173\t19942\tObama\t19942\t0.000599205\t19942.0\n2834\t-75.5747\t39.009994\tFelton town\tDE\tDelaware\tKent County\t1018\t38.0\t13.5\t7.1\t18123\t159598\t0.5173\t19943\tObama\t19943\t0.008026196999999999\t19943.0\n2835\t-75.60719300000001\t39.309021\tSmyrna town\tDE\tDelaware\tKent County\t8564\t35.7\t16.8\t8.9\t23994\t166315\t0.5173\t19977\tObama\t19977\t0.067520972\t19977.0\n2836\t-75.517667\t39.159578\tDover city\tDE\tDelaware\tKent County\t37597\t34.5\t31.7\t10.2\t25436\t194430\t0.5173\t19901\tObama\t19901\t0.296425268\t19901.0\n2837\t-75.462856\t39.006655\tFrederica town\tDE\tDelaware\tKent County\t836\t38.1\t16.0\t7.1\t22669\t155921\t0.5173\t19946\tObama\t19946\t0.006591258000000001\t19946.0\n2838\t-75.571425\t39.04292\tViola town\tDE\tDelaware\tKent County\t172\t40.0\t10.5\t8.3\t20957\t150000\t0.5173\t19979\tObama\t19979\t0.001356096\t19979.0\n2839\t-75.448092\t39.165856\tLittle Creek town\tDE\tDelaware\tKent County\t232\t36.3\t13.5\t10.9\t22279\t132143\t0.5173\t19902\tObama\t19902\t0.0018291529999999998\t19902.0\n2840\t-75.635871\t39.300053000000005\tClayton town\tDE\tDelaware\tKent County\t1562\t38.9\t14.4\t7.7\t22321\t160852\t0.5173\t19977\tObama\t19977\t0.012315245\t19977.0\n2841\t-75.566423\t39.071218\tWoodside town\tDE\tDelaware\tKent County\t179\t44.0\t15.4\t10.0\t22702\t211364\t0.5173\t19980\tObama\t19980\t0.001411286\t19980.0\n2842\t-75.537415\t39.067557\tWoodside East CDP\tDE\tDelaware\tKent County\t2573\t32.0\t24.7\t9.6\t18922\t176705\t0.5173\t19980\tObama\t19980\t0.020286252\t19980.0\n2843\t-75.56034100000001\t39.116265999999996\tWyoming town\tDE\tDelaware\tKent County\t1258\t41.2\t28.4\t7.4\t28022\t184322\t0.5173\t19934\tObama\t19934\t0.009918424\t19934.0\n2844\t-75.488556\t39.811265\tArden village\tDE\tDelaware\tNew Castle County\t462\t52.4\t50.5\t8.9\t38587\t292073\t0.6629999999999999\t19810\tObama\t19810\t0.003642537\t19810.0\n2845\t-75.48612299999999\t39.805503\tArdencroft village\tDE\tDelaware\tNew Castle County\t264\t49.0\t52.8\t9.6\t42916\t310000\t0.6629999999999999\t19810\tObama\t19810\t0.00208145\t19810.0\n2846\t-75.481363\t39.808287\tArdentown village\tDE\tDelaware\tNew Castle County\t291\t53.2\t49.8\t8.6\t37575\t286364\t0.6629999999999999\t19703\tObama\t19703\t0.002294325\t19703.0\n2847\t-75.68036500000001\t39.618807000000004\tBear CDP\tDE\tDelaware\tNew Castle County\t20599\t31.5\t22.8\t11.4\t27190\t177771\t0.6629999999999999\t19701\tObama\t19701\t0.16240828\t19701.0\n2848\t-75.49806099999999\t39.766845\tBellefonte town\tDE\tDelaware\tNew Castle County\t1255\t42.0\t29.7\t6.4\t25281\t179950\t0.6629999999999999\t19809\tObama\t19809\t0.009894771\t19809.0\n2849\t-75.69623100000001\t39.736818\tPike Creek CDP\tDE\tDelaware\tNew Castle County\t19915\t38.8\t53.3\t7.9\t41904\t262207\t0.6629999999999999\t19808\tObama\t19808\t0.15701543199999998\t19808.0\n2850\t-75.584848\t39.685675\tWilmington Manor CDP\tDE\tDelaware\tNew Castle County\t8173\t37.2\t12.9\t12.0\t23531\t161183\t0.6629999999999999\t19720\tObama\t19720\t0.064438219\t19720.0\n2851\t-75.712526\t39.449422\tMiddletown town\tDE\tDelaware\tNew Castle County\t12006\t34.6\t18.9\t8.6\t28441\t199426\t0.6629999999999999\t19709\tObama\t19709\t0.094658663\t19709.0\n2852\t-75.50774100000001\t39.755814\tEdgemoor CDP\tDE\tDelaware\tNew Castle County\t6236\t36.2\t32.0\t11.9\t28575\t175930\t0.6629999999999999\t19809\tObama\t19809\t0.049166369\t19809.0\n2853\t-75.460782\t39.803129\tClaymont CDP\tDE\tDelaware\tNew Castle County\t8689\t36.7\t21.1\t10.2\t27061\t187744\t0.6629999999999999\t19703\tObama\t19703\t0.06850650700000001\t19703.0\n2854\t-75.715162\t39.666752\tBrookside CDP\tDE\tDelaware\tNew Castle County\t14876\t35.5\t19.9\t11.7\t27607\t174751\t0.6629999999999999\t19713\tObama\t19713\t0.11728654599999999\t19713.0\n2855\t-75.68145200000001\t39.783718\tHockessin CDP\tDE\tDelaware\tNew Castle County\t13108\t44.8\t62.5\t6.1\t48921\t398547\t0.6629999999999999\t19707\tObama\t19707\t0.10334714\t19707.0\n2856\t-75.757358\t39.677541999999995\tNewark city\tDE\tDelaware\tNew Castle County\t29625\t24.2\t53.7\t10.9\t27246\t247196\t0.6629999999999999\t19711\tObama\t19711\t0.23357178899999997\t19711.0\n2857\t-75.659172\t39.455909999999996\tOdessa town\tDE\tDelaware\tNew Castle County\t286\t39.4\t26.0\t7.3\t34116\t215625\t0.6629999999999999\t19730\tObama\t19730\t0.002254904\t19730.0\n2858\t-75.604421\t39.713691\tNewport town\tDE\tDelaware\tNew Castle County\t1080\t31.9\t17.1\t7.8\t23992\t171875\t0.6629999999999999\t19804\tObama\t19804\t0.008515021999999999\t19804.0\n2859\t-75.733063\t39.755059\tNorth Star CDP\tDE\tDelaware\tNew Castle County\t8404\t42.3\t65.2\t6.2\t48112\t415133\t0.6629999999999999\t19707\tObama\t19707\t0.066259487\t19707.0\n2860\t-75.598481\t39.577213\tDelaware City\tDE\tDelaware\tNew Castle County\t1444\t42.5\t17.2\t9.2\t25975\t162165\t0.6629999999999999\t19706\tObama\t19706\t0.011384899999999998\t19706.0\n2861\t-75.60479699999999\t39.778201\tGreenville CDP\tDE\tDelaware\tNew Castle County\t2540\t50.3\t76.5\t8.3\t91660\t645260\t0.6629999999999999\t19807\tObama\t19807\t0.020026071\t19807.0\n2862\t-75.594714\t39.738372\tElsmere town\tDE\tDelaware\tNew Castle County\t6056\t36.3\t11.5\t12.6\t25094\t143605\t0.6629999999999999\t19805\tObama\t19805\t0.047747198\t19805.0\n2863\t-75.69606\t39.394844\tTownsend town\tDE\tDelaware\tNew Castle County\t747\t42.1\t19.3\t7.0\t32776\t250000\t0.6629999999999999\t19734\tObama\t19734\t0.005889556999999999\t19734.0\n2864\t-75.747378\t39.601616\tGlasgow CDP\tDE\tDelaware\tNew Castle County\t14125\t31.8\t34.2\t9.0\t33046\t247246\t0.6629999999999999\t19702\tObama\t19702\t0.11136545199999999\t19702.0\n2865\t-75.566129\t39.669531\tNew Castle city\tDE\tDelaware\tNew Castle County\t5019\t42.0\t27.7\t10.7\t34210\t185240\t0.6629999999999999\t19720\tObama\t19720\t0.0395712\t19720.0\n2866\t-75.528204\t39.734852000000004\tWilmington city\tDE\tDelaware\tNew Castle County\t74830\t35.3\t24.1\t16.9\t25499\t142431\t0.6629999999999999\t198HH\tObama\t198HH\t0.589980657\t0.0\n2867\t-75.60234200000001\t38.742843\tBridgeville town\tDE\tDelaware\tSussex County\t1619\t36.8\t13.0\t13.2\t18113\t174583\t0.4288\t19933\tObama\t19933\t0.012764649\t19933.0\n2868\t-75.426238\t38.924676\tMilford city\tDE\tDelaware\tSussex County\t7718\t39.3\t22.0\t11.1\t22402\t199831\t0.4288\t19963\tObama\t19963\t0.060850870999999994\t19963.0\n2869\t-75.31388199999999\t38.778622999999996\tMilton town\tDE\tDelaware\tSussex County\t2524\t39.6\t20.1\t9.9\t22813\t185041\t0.4288\t19968\tObama\t19968\t0.019899922\t19968.0\n2870\t-75.308435\t38.914342\tSlaughter Beach town\tDE\tDelaware\tSussex County\t208\t50.0\t20.1\t8.5\t24731\t273438\t0.4288\t19963\tObama\t19963\t0.00163993\t19963.0\n2871\t-75.423846\t38.806796000000006\tEllendale town\tDE\tDelaware\tSussex County\t347\t38.5\t8.7\t8.2\t19068\t153571\t0.4288\t19941\tObama\t19941\t0.002735845\t19941.0\n2872\t-75.085491\t38.719198999999996\tRehoboth Beach city\tDE\tDelaware\tSussex County\t1570\t60.2\t50.9\t6.7\t52549\t585833\t0.4288\t19971\tObama\t19971\t0.012378318999999999\t19971.0\n2873\t-75.386551\t38.689678\tGeorgetown town\tDE\tDelaware\tSussex County\t5851\t30.8\t12.3\t11.4\t17869\t183546\t0.4288\t19947\tObama\t19947\t0.046130921\t19947.0\n2874\t-75.053075\t38.460225\tFenwick Island town\tDE\tDelaware\tSussex County\t726\t63.0\t44.5\t7.1\t51735\t450000\t0.4288\t19944\tObama\t19944\t0.005723987\t19944.0\n2875\t-75.619416\t38.570917\tBethel town\tDE\tDelaware\tSussex County\t225\t37.0\t13.1\t9.6\t20636\t180682\t0.4288\t19931\tObama\t19931\t0.001773963\t19931.0\n2876\t-75.29099699999999\t38.585946\tMillsboro town\tDE\tDelaware\tSussex County\t2461\t43.5\t16.5\t8.8\t19522\t170353\t0.4288\t19966\tObama\t19966\t0.019403213\t19966.0\n2877\t-75.223357\t38.457767\tSelbyville town\tDE\tDelaware\tSussex County\t2082\t35.5\t12.0\t11.9\t18662\t185714\t0.4288\t19945\tObama\t19945\t0.016415071\t19945.0\n2878\t-75.605952\t38.634615000000004\tBlades town\tDE\tDelaware\tSussex County\t993\t37.0\t14.5\t7.4\t22648\t145833\t0.4288\t19973\tObama\t19973\t0.00782909\t19973.0\n2879\t-75.084974\t38.725544\tHenlopen Acres town\tDE\tDelaware\tSussex County\t104\t59.8\t52.1\t6.5\t49503\t694444\t0.4288\t19971\tObama\t19971\t0.000819965\t19971.0\n2880\t-75.234137\t38.521542\tFrankford town\tDE\tDelaware\tSussex County\t818\t41.5\t12.3\t10.8\t21767\t194853\t0.4288\t19939\tObama\t19939\t0.006449341\t19939.0\n2881\t-75.57188000000001\t38.557659\tLaurel town\tDE\tDelaware\tSussex County\t3902\t35.5\t11.9\t10.5\t18893\t161824\t0.4288\t19956\tObama\t19956\t0.03076446\t19956.0\n2882\t-75.245681\t38.546726\tDagsboro town\tDE\tDelaware\tSussex County\t621\t43.2\t14.5\t8.9\t24941\t187500\t0.4288\t19939\tObama\t19939\t0.0048961379999999995\t19939.0\n2883\t-75.146312\t38.77878\tLewes city\tDE\tDelaware\tSussex County\t2905\t58.5\t44.0\t6.7\t38275\t464286\t0.4288\t19958\tObama\t19958\t0.022903833\t19958.0\n2884\t-75.065815\t38.539208\tBethany Beach town\tDE\tDelaware\tSussex County\t1012\t62.9\t44.5\t7.1\t51721\t445370\t0.4288\t19930\tObama\t19930\t0.007978891\t19930.0\n2885\t-75.591394\t38.806983\tGreenwood town\tDE\tDelaware\tSussex County\t1103\t38.6\t13.5\t7.9\t20727\t174275\t0.4288\t19950\tObama\t19950\t0.008696361\t19950.0\n2886\t-75.11250799999999\t38.547336\tMillville town\tDE\tDelaware\tSussex County\t406\t50.4\t22.1\t8.9\t26885\t263889\t0.4288\t19967\tObama\t19967\t0.003201018\t19967.0\n2887\t-75.615503\t38.649001\tSeaford city\tDE\tDelaware\tSussex County\t7003\t40.0\t16.8\t11.2\t21007\t188562\t0.4288\t19973\tObama\t19973\t0.055213610999999996\t19973.0\n2888\t-75.10054699999999\t38.538515999999994\tOcean View town\tDE\tDelaware\tSussex County\t2110\t50.1\t21.9\t9.0\t26747\t261709\t0.4288\t19970\tObama\t19970\t0.01663583\t19970.0\n2889\t-75.56645300000001\t38.460351\tDelmar town\tDE\tDelaware\tSussex County\t1667\t40.7\t16.0\t11.2\t22436\t169712\t0.4288\t19940\tObama\t19940\t0.013143094\t19940.0\n2890\t-75.059169\t38.5162\tSouth Bethany town\tDE\tDelaware\tSussex County\t829\t62.9\t44.5\t7.0\t51697\t448810\t0.4288\t19930\tObama\t19930\t0.006536068000000001\t19930.0\n2891\t-75.07506500000001\t38.69596\tDewey Beach town\tDE\tDelaware\tSussex County\t344\t60.3\t49.7\t6.9\t55658\t478947\t0.4288\t19971\tObama\t19971\t0.002712192\t19971.0\n2892\t-75.152721\t38.621082\tLong Neck CDP\tDE\tDelaware\tSussex County\t2059\t60.1\t7.5\t15.1\t22254\t128682\t0.4288\t19967\tObama\t19967\t0.016233732\t19967.0\n2893\t-77.016267\t38.904784\tWashington city\tDC\tDistrict of Columbia\tDistrict of Columbia\t600671\t35.9\t49.0\t12.5\t34341\t387674\t0.9091\t20001\tObama\t20001\t3.0\t20001.0\n2894\t-82.48077099999999\t29.776771999999998\tAlachua city\tFL\tFlorida\tAlachua County\t7322\t40.2\t34.2\t9.5\t24966\t147079\t0.5788\t32616\tObama\t32616\t0.015523712\t32616.0\n2895\t-82.404374\t29.844299\tLa Crosse town\tFL\tFlorida\tAlachua County\t165\t43.9\t14.7\t9.0\t16302\t92500\t0.5788\t32658\tObama\t32658\t0.000349824\t32658.0\n2896\t-82.603086\t29.630684999999996\tNewberry city\tFL\tFlorida\tAlachua County\t4180\t37.9\t19.5\t8.7\t18798\t106106\t0.5788\t32669\tObama\t32669\t0.008862212\t32669.0\n2897\t-82.594962\t29.810191999999997\tHigh Springs city\tFL\tFlorida\tAlachua County\t4861\t43.8\t20.1\t7.9\t20674\t100486\t0.5788\t32643\tObama\t32643\t0.010306031\t32643.0\n2898\t-82.28059300000001\t29.506028000000004\tMicanopy town\tFL\tFlorida\tAlachua County\t665\t47.0\t46.4\t9.8\t30188\t143125\t0.5788\t32667\tObama\t32667\t0.001409897\t32667.0\n2899\t-82.51774300000001\t29.534543\tArcher city\tFL\tFlorida\tAlachua County\t1437\t35.7\t19.5\t13.6\t16591\t92500\t0.5788\t32618\tObama\t32618\t0.00304665\t32618.0\n2900\t-82.339125\t29.679073\tGainesville city\tFL\tFlorida\tAlachua County\t101602\t27.1\t47.4\t13.4\t20855\t126608\t0.5788\t32603\tObama\t32603\t0.21541111\t32603.0\n2901\t-82.170592\t29.794177\tWaldo city\tFL\tFlorida\tAlachua County\t943\t40.1\t20.2\t11.7\t20312\t91207\t0.5788\t32694\tObama\t32694\t0.001999298\t32694.0\n2902\t-82.08699200000001\t29.595215000000003\tHawthorne city\tFL\tFlorida\tAlachua County\t1610\t41.3\t16.2\t12.6\t15544\t92909\t0.5788\t32640\tObama\t32640\t0.0034134359999999997\t32640.0\n2903\t-82.125244\t30.27992\tMacclenny city\tFL\tFlorida\tBaker County\t5221\t33.0\t13.3\t13.8\t19635\t96331\t0.2033\t32063\tObama\t32063\t0.011069283999999999\t32063.0\n2904\t-82.160004\t30.275223999999998\tGlen St. Mary town\tFL\tFlorida\tBaker County\t558\t33.5\t10.3\t9.4\t17772\t90556\t0.2033\t32063\tObama\t32063\t0.001183042\t32063.0\n2905\t-85.69671\t30.1974\tPretty Bayou CDP\tFL\tFlorida\tBay County\t3533\t49.0\t37.3\t6.3\t33973\t188953\t0.2761\t32405\tObama\t32405\t0.007490477\t32405.0\n2906\t-85.604947\t30.202002\tHiland Park CDP\tFL\tFlorida\tBay County\t1171\t38.5\t16.6\t7.3\t18967\t97692\t0.2761\t32404\tObama\t32404\t0.002482691\t32404.0\n2907\t-85.40565699999999\t29.943075\tMexico Beach city\tFL\tFlorida\tBay County\t1574\t58.8\t23.7\t7.0\t24393\t134375\t0.2761\t32410\tObama\t32410\t0.00333711\t32410.0\n2908\t-85.60036099999999\t30.129939\tParker city\tFL\tFlorida\tBay County\t4735\t41.9\t22.3\t6.3\t24720\t117063\t0.2761\t32401\tObama\t32401\t0.010038893\t32401.0\n2909\t-85.60920300000001\t30.168893\tSpringfield city\tFL\tFlorida\tBay County\t8978\t34.8\t9.9\t11.1\t17421\t82070\t0.2761\t32401\tObama\t32401\t0.019034673999999998\t32401.0\n2910\t-85.625793\t30.181628000000003\tCedar Grove town\tFL\tFlorida\tBay County\t6757\t35.8\t10.6\t10.3\t18198\t87073\t0.2761\t32401\tObama\t32401\t0.014325828999999998\t32401.0\n2911\t-85.851753\t30.20952\tPanama City Beach city\tFL\tFlorida\tBay County\t12652\t47.6\t24.6\t7.5\t26348\t152124\t0.2761\t32407\tObama\t32407\t0.026824092\t32407.0\n2912\t-85.75497800000001\t30.17175\tUpper Grand Lagoon CDP\tFL\tFlorida\tBay County\t12741\t42.1\t28.1\t7.2\t30757\t178565\t0.2761\t32408\tObama\t32408\t0.027012785\t32408.0\n2913\t-85.755604\t30.146009999999997\tLower Grand Lagoon CDP\tFL\tFlorida\tBay County\t6830\t42.2\t24.8\t8.1\t27463\t147389\t0.2761\t32408\tObama\t32408\t0.014480600000000001\t32408.0\n2914\t-85.633499\t30.194387\tPanama City\tFL\tFlorida\tBay County\t36386\t39.8\t23.1\t9.1\t21805\t110645\t0.2761\t32405\tObama\t32405\t0.077143645\t32405.0\n2915\t-85.575473\t30.140959000000002\tCallaway city\tFL\tFlorida\tBay County\t13972\t35.7\t17.6\t9.3\t20151\t124649\t0.2761\t32404\tObama\t32404\t0.029622685\t32404.0\n2916\t-85.64654300000001\t30.233121\tLynn Haven city\tFL\tFlorida\tBay County\t15326\t41.2\t29.0\t5.5\t26144\t145951\t0.2761\t32444\tObama\t32444\t0.032493363\t32444.0\n2917\t-85.951514\t30.25511\tLaguna Beach CDP\tFL\tFlorida\tBay County\t3347\t49.9\t25.9\t5.9\t25179\t134341\t0.2761\t32413\tObama\t32413\t0.00709613\t32413.0\n2918\t-85.607523\t30.084870000000002\tTyndall AFB CDP\tFL\tFlorida\tBay County\t2466\t22.1\t26.2\t8.0\t15650\t241667\t0.2761\t32403\tObama\t32403\t0.0052282809999999996\t32403.0\n2919\t-82.137794\t29.864433000000002\tHampton city\tFL\tFlorida\tBradford County\t523\t38.5\t7.8\t10.1\t18735\t106522\t0.2858\t32044\tObama\t32044\t0.0011088369999999999\t32044.0\n2920\t-82.332872\t29.88777\tBrooker town\tFL\tFlorida\tBradford County\t377\t43.6\t13.1\t9.4\t17942\t108333\t0.2858\t32622\tObama\t32622\t0.000799295\t32622.0\n2921\t-82.072136\t30.046994\tLawtey city\tFL\tFlorida\tBradford County\t785\t36.7\t6.3\t9.2\t16267\t112500\t0.2858\t32058\tObama\t32058\t0.001664315\t32058.0\n2922\t-82.111791\t29.946132000000002\tStarke city\tFL\tFlorida\tBradford County\t6036\t39.0\t11.9\t11.5\t18184\t111320\t0.2858\t32091\tObama\t32091\t0.012797203\t32091.0\n2923\t-80.668018\t28.072026\tWest Melbourne city\tFL\tFlorida\tBrevard County\t15920\t48.6\t28.3\t13.4\t26017\t97301\t0.4307\t32904\tObama\t32904\t0.03375273\t32904.0\n2924\t-80.561312\t28.067296000000002\tMelbourne Beach town\tFL\tFlorida\tBrevard County\t3340\t52.1\t46.2\t11.0\t35628\t206471\t0.4307\t32903\tObama\t32903\t0.007081289\t32903.0\n2925\t-80.852406\t28.686608000000003\tMims CDP\tFL\tFlorida\tBrevard County\t10137\t46.1\t13.4\t13.8\t20084\t80496\t0.4307\t32754\tObama\t32754\t0.021491924\t32754.0\n2926\t-80.787756\t28.477304999999998\tPort St. John CDP\tFL\tFlorida\tBrevard County\t13775\t39.4\t16.7\t10.6\t22660\t101578\t0.4307\t32927\tObama\t32927\t0.029205016\t32927.0\n2927\t-80.596639\t28.152432\tIndian Harbour Beach city\tFL\tFlorida\tBrevard County\t8695\t51.1\t41.8\t12.0\t33266\t142486\t0.4307\t329HH\tObama\t329HH\t0.018434673000000002\t0.0\n2928\t-80.66515799999999\t28.087771999999998\tMelbourne Village town\tFL\tFlorida\tBrevard County\t707\t50.8\t31.9\t16.2\t26991\t144340\t0.4307\t32904\tObama\t32904\t0.001498943\t32904.0\n2929\t-80.605306\t28.20004\tSouth Patrick Shores CDP\tFL\tFlorida\tBrevard County\t8516\t44.5\t34.5\t13.4\t31261\t150066\t0.4307\t32937\tObama\t32937\t0.018055166\t32937.0\n2930\t-80.761843\t28.437697999999997\tSharpes CDP\tFL\tFlorida\tBrevard County\t3615\t45.0\t16.6\t13.0\t20789\t59370\t0.4307\t32927\tObama\t32927\t0.007664329\t32927.0\n2931\t-80.693776\t28.347959000000003\tMerritt Island CDP\tFL\tFlorida\tBrevard County\t37988\t47.1\t32.0\t13.2\t28788\t149534\t0.4307\t32952\tObama\t32952\t0.08054012\t32952.0\n2932\t-80.65888000000001\t28.190586\tPalm Shores town\tFL\tFlorida\tBrevard County\t874\t46.7\t23.2\t13.6\t24832\t108333\t0.4307\t32940\tObama\t32940\t0.001853008\t32940.0\n2933\t-80.584783\t27.987489\tMalabar town\tFL\tFlorida\tBrevard County\t2911\t49.3\t24.9\t10.2\t29831\t172756\t0.4307\t32950\tObama\t32950\t0.006171746\t32950.0\n2934\t-80.82589200000001\t28.583864000000002\tTitusville city\tFL\tFlorida\tBrevard County\t44494\t45.0\t22.0\t14.7\t24691\t96455\t0.4307\t32780\tObama\t32780\t0.09433379199999999\t32780.0\n2935\t-80.570084\t28.087085\tIndialantic town\tFL\tFlorida\tBrevard County\t3095\t50.1\t55.4\t9.6\t47313\t216805\t0.4307\t32903\tObama\t32903\t0.006561853\t32903.0\n2936\t-80.647101\t28.1116\tMelbourne city\tFL\tFlorida\tBrevard County\t77558\t43.4\t24.0\t12.2\t24223\t104279\t0.4307\t32935\tObama\t32935\t0.164434311\t32935.0\n2937\t-80.73093\t28.318102000000003\tRockledge city\tFL\tFlorida\tBrevard County\t24835\t45.2\t28.4\t10.5\t26322\t120550\t0.4307\t32955\tObama\t32955\t0.052653835\t32955.0\n2938\t-80.615103\t28.3331\tCocoa Beach city\tFL\tFlorida\tBrevard County\t12365\t57.8\t38.4\t13.9\t34704\t165804\t0.4307\t32931\tObama\t32931\t0.02621561\t32931.0\n2939\t-80.515918\t27.873252\tMicco CDP\tFL\tFlorida\tBrevard County\t9738\t67.5\t13.1\t14.5\t24013\t73331\t0.4307\t32976\tObama\t32976\t0.020645985\t32976.0\n2940\t-80.599263\t28.174066999999997\tSatellite Beach city\tFL\tFlorida\tBrevard County\t10036\t49.8\t41.4\t10.5\t31190\t162173\t0.4307\t32937\tObama\t32937\t0.021277789\t32937.0\n2941\t-80.686838\t28.071433000000003\tJune Park CDP\tFL\tFlorida\tBrevard County\t4887\t46.0\t26.5\t12.5\t29007\t140476\t0.4307\t32904\tObama\t32904\t0.010361155\t32904.0\n2942\t-80.770178\t28.359147999999998\tCocoa West CDP\tFL\tFlorida\tBrevard County\t6198\t35.7\t9.6\t19.5\t15603\t69080\t0.4307\t32922\tObama\t32922\t0.013140667\t32922.0\n2943\t-80.77744200000001\t28.378326\tCocoa city\tFL\tFlorida\tBrevard County\t16887\t38.5\t16.8\t16.3\t19738\t86962\t0.4307\t32926\tObama\t32926\t0.035802911\t32926.0\n2944\t-80.606059\t28.394026\tCape Canaveral city\tFL\tFlorida\tBrevard County\t10541\t48.8\t29.7\t13.1\t27741\t107368\t0.4307\t32920\tObama\t32920\t0.022348463\t32920.0\n2945\t-80.664383\t27.982599\tPalm Bay city\tFL\tFlorida\tBrevard County\t98253\t38.6\t19.1\t11.1\t21273\t99911\t0.4307\t32908\tObama\t32908\t0.20831074\t32908.0\n2946\t-80.25379699999999\t26.205667000000002\tTamarac city\tFL\tFlorida\tBroward County\t57878\t53.9\t21.2\t11.5\t26439\t112138\t0.672\t33321\tObama\t33321\t0.12270983099999999\t33321.0\n2947\t-80.193368\t26.113598\tMelrose Park CDP\tFL\tFlorida\tBroward County\t7353\t33.8\t10.9\t16.5\t17208\t128054\t0.672\t33312\tObama\t33312\t0.015589436000000002\t33312.0\n2948\t-80.08894699999999\t26.278484999999996\tLighthouse Point city\tFL\tFlorida\tBroward County\t10680\t49.9\t42.1\t8.8\t42652\t259933\t0.672\t33064\tObama\t33064\t0.022643162999999997\t33064.0\n2949\t-80.203492\t26.19427\tVillage Park CDP\tFL\tFlorida\tBroward County\t898\t34.2\t11.4\t22.5\t16627\t14352\t0.672\t33319\tObama\t33319\t0.001903891\t33319.0\n2950\t-80.20308299999999\t25.989019\tUtopia CDP\tFL\tFlorida\tBroward County\t774\t31.9\t9.1\t15.5\t14807\t102435\t0.672\t33023\tObama\t33023\t0.0016409929999999999\t33023.0\n2951\t-80.128473\t26.271864\tLoch Lomond CDP\tFL\tFlorida\tBroward County\t3715\t29.7\t14.9\t17.5\t13134\t45404\t0.672\t33064\tObama\t33064\t0.007876344\t33064.0\n2952\t-80.330898\t26.045607999999998\tSunshine Ranches CDP\tFL\tFlorida\tBroward County\t1663\t39.2\t50.6\t6.6\t43573\t488415\t0.672\t33330\tObama\t33330\t0.003525803\t33330.0\n2953\t-80.294161\t26.055685999999998\tSunshine Acres CDP\tFL\tFlorida\tBroward County\t946\t40.1\t39.2\t7.1\t32508\t221579\t0.672\t33330\tObama\t33330\t0.002005658\t33330.0\n2954\t-80.200478\t26.065146\tEdgewater CDP\tFL\tFlorida\tBroward County\t829\t46.9\t12.5\t21.0\t23368\t159821\t0.672\t33314\tObama\t33314\t0.0017576010000000001\t33314.0\n2955\t-80.178956\t25.984734\tPembroke Park town\tFL\tFlorida\tBroward County\t6641\t31.5\t10.4\t16.1\t16533\t56702\t0.672\t33179\tObama\t33179\t0.014079892\t33179.0\n2956\t-80.19459499999999\t26.325198999999998\tHillsboro Pines CDP\tFL\tFlorida\tBroward County\t420\t40.5\t33.4\t7.9\t30428\t215385\t0.672\t33073\tObama\t33073\t0.000890461\t33073.0\n2957\t-80.34926999999999\t26.053925\tIvanhoe Estates CDP\tFL\tFlorida\tBroward County\t278\t41.4\t44.5\t6.9\t32537\t235000\t0.672\t33331\tObama\t33331\t0.000589401\t33331.0\n2958\t-80.126363\t26.265342999999998\tLeisureville CDP\tFL\tFlorida\tBroward County\t1203\t44.1\t14.6\t13.0\t19740\t80000\t0.672\t33064\tObama\t33064\t0.002550536\t33064.0\n2959\t-80.193526\t26.132598\tSt. George CDP\tFL\tFlorida\tBroward County\t2493\t38.6\t14.3\t16.6\t17280\t101155\t0.672\t33311\tObama\t33311\t0.005285525\t33311.0\n2960\t-80.368463\t26.049647\tGreen Meadow CDP\tFL\tFlorida\tBroward County\t2003\t41.2\t32.6\t6.2\t46549\t334413\t0.672\t33331\tObama\t33331\t0.0042466529999999995\t33331.0\n2961\t-80.18272900000001\t25.978907\tLake Forest CDP\tFL\tFlorida\tBroward County\t4996\t35.1\t13.4\t14.6\t15971\t106263\t0.672\t33179\tObama\t33179\t0.010592251\t33179.0\n2962\t-80.246863\t26.316653999999996\tParkland city\tFL\tFlorida\tBroward County\t19823\t34.3\t59.2\t8.2\t55626\t457953\t0.672\t33067\tObama\t33067\t0.042027660999999994\t33067.0\n2963\t-80.18318599999999\t26.057241\tRavenswood Estates CDP\tFL\tFlorida\tBroward County\t1200\t46.5\t14.3\t10.1\t22976\t83235\t0.672\t33021\tObama\t33021\t0.002544176\t33021.0\n2964\t-80.211721\t26.246613\tMargate city\tFL\tFlorida\tBroward County\t54658\t43.2\t20.9\t10.7\t23501\t96504\t0.672\t33063\tObama\t33063\t0.11588295900000001\t33063.0\n2965\t-80.154226\t26.053632999999998\tDania Beach city\tFL\tFlorida\tBroward County\t20562\t43.3\t22.9\t11.5\t25323\t112132\t0.672\t33004\tObama\t33004\t0.043594449\t33004.0\n2966\t-80.168295\t26.028574\tHollywood city\tFL\tFlorida\tBroward County\t145026\t42.2\t26.2\t11.8\t26056\t131667\t0.672\t33021\tObama\t33021\t0.307476345\t33021.0\n2967\t-80.122462\t26.283172999999998\tTedder CDP\tFL\tFlorida\tBroward County\t2269\t35.4\t12.0\t19.3\t13755\t108482\t0.672\t33064\tObama\t33064\t0.004810612\t33064.0\n2968\t-80.182041\t26.321471000000003\tHillsboro Ranches CDP\tFL\tFlorida\tBroward County\t49\t40.5\t35.3\t6.5\t30267\t233333\t0.672\t33073\tObama\t33073\t0.000103887\t33073.0\n2969\t-80.07952\t26.284260999999997\tHillsboro Beach town\tFL\tFlorida\tBroward County\t2091\t67.0\t45.5\t7.6\t55905\t213854\t0.672\t33441\tObama\t33441\t0.004433226\t33441.0\n2970\t-80.405816\t26.099854\tWeston city\tFL\tFlorida\tBroward County\t61364\t35.0\t58.5\t8.8\t45644\t242285\t0.672\t33327\tObama\t33327\t0.130100661\t33327.0\n2971\t-80.211107\t26.203763000000002\tBroadview-Pompano Park CDP\tFL\tFlorida\tBroward County\t5781\t32.3\t8.8\t18.4\t16038\t91806\t0.672\t33068\tObama\t33068\t0.012256566000000002\t33068.0\n2972\t-80.142397\t25.985417\tHallandale city\tFL\tFlorida\tBroward County\t36190\t56.0\t24.5\t13.6\t25855\t93481\t0.672\t33009\tObama\t33009\t0.076728097\t33009.0\n2973\t-80.24511700000001\t26.281191999999997\tRamblewood East CDP\tFL\tFlorida\tBroward County\t1400\t37.9\t24.5\t12.5\t20828\t67857\t0.672\t33065\tObama\t33065\t0.002968205\t33065.0\n2974\t-80.324752\t26.15462\tSunrise city\tFL\tFlorida\tBroward County\t88357\t39.7\t24.3\t11.7\t22781\t125098\t0.672\t33323\tObama\t33323\t0.187329771\t33323.0\n2975\t-80.15390699999999\t26.175578\tOakland Park city\tFL\tFlorida\tBroward County\t31974\t37.0\t25.0\t12.1\t22734\t118127\t0.672\t33309\tObama\t33309\t0.06778956\t33309.0\n2976\t-80.336934\t26.012076999999998\tPembroke Pines city\tFL\tFlorida\tBroward County\t153170\t38.2\t34.2\t9.5\t29514\t163975\t0.672\t33028\tObama\t33028\t0.324742817\t33028.0\n2977\t-80.139452\t26.159309\tWilton Manors city\tFL\tFlorida\tBroward County\t12704\t44.5\t30.2\t9.8\t27086\t166871\t0.672\t33305\tObama\t33305\t0.026934338999999998\t33305.0\n2978\t-80.18089300000001\t26.140539\tRoosevelt Gardens CDP\tFL\tFlorida\tBroward County\t2103\t32.8\t5.2\t17.5\t12296\t86220\t0.672\t33311\tObama\t33311\t0.004458668\t33311.0\n2979\t-80.10744100000001\t26.267153999999998\tCollier Manor-Cresthaven CDP\tFL\tFlorida\tBroward County\t7501\t39.8\t13.6\t11.0\t21253\t104093\t0.672\t33064\tObama\t33064\t0.015903218\t33064.0\n2980\t-80.134602\t26.237441999999998\tPompano Beach city\tFL\tFlorida\tBroward County\t80239\t46.0\t26.6\t12.6\t26618\t123692\t0.672\t33060\tObama\t33060\t0.17011842300000002\t33060.0\n2981\t-80.193924\t26.125388\tBroward Estates CDP\tFL\tFlorida\tBroward County\t3483\t37.2\t13.1\t16.0\t16997\t102964\t0.672\t33311\tObama\t33311\t0.00738447\t33311.0\n2982\t-80.095019\t26.210936\tTerra Mar CDP\tFL\tFlorida\tBroward County\t2642\t63.5\t44.0\t11.0\t43611\t223750\t0.672\t33308\tObama\t33308\t0.005601426999999999\t33308.0\n2983\t-80.287267\t26.078925\tDavie town\tFL\tFlorida\tBroward County\t82470\t37.6\t31.1\t10.2\t28403\t143341\t0.672\t33328\tObama\t33328\t0.17484847\t33328.0\n2984\t-80.116068\t26.282456\tPompano Estates CDP\tFL\tFlorida\tBroward County\t3610\t34.6\t13.5\t13.3\t14101\t94824\t0.672\t33064\tObama\t33064\t0.007653728\t33064.0\n2985\t-80.12890300000001\t26.281840999999996\tBonnie Lock-Woodsetter North CDP\tFL\tFlorida\tBroward County\t4082\t35.8\t13.9\t11.2\t16529\t92092\t0.672\t33064\tObama\t33064\t0.008654437\t33064.0\n2986\t-80.182739\t26.101256\tChula Vista CDP\tFL\tFlorida\tBroward County\t577\t41.8\t17.0\t8.5\t24972\t144271\t0.672\t33312\tObama\t33312\t0.001223324\t33312.0\n2987\t-80.176226\t26.134056\tFranklin Park CDP\tFL\tFlorida\tBroward County\t887\t28.4\t1.8\t19.5\t11547\t73333\t0.672\t33311\tObama\t33311\t0.00188057\t33311.0\n2988\t-80.335045\t25.977238\tMiramar city\tFL\tFlorida\tBroward County\t117069\t32.6\t28.6\t10.9\t26135\t165822\t0.672\t33027\tObama\t33027\t0.24820341399999998\t33027.0\n2989\t-80.189164\t26.049132999999998\tOak Point CDP\tFL\tFlorida\tBroward County\t144\t55.2\t22.6\t13.6\t31525\t85000\t0.672\t33021\tObama\t33021\t0.000305301\t33021.0\n2990\t-80.098677\t26.190413\tLauderdale-by-the-Sea town\tFL\tFlorida\tBroward County\t3504\t57.2\t41.3\t12.6\t43061\t273677\t0.672\t33308\tObama\t33308\t0.007428993\t33308.0\n2991\t-80.38682\t26.045614999999998\tRolling Oaks CDP\tFL\tFlorida\tBroward County\t1240\t40.4\t35.9\t8.2\t39727\t329518\t0.672\t33332\tObama\t33332\t0.002628981\t33332.0\n2992\t-80.138421\t26.134329\tFort Lauderdale city\tFL\tFlorida\tBroward County\t157069\t42.6\t32.1\t12.8\t30631\t167757\t0.672\t33304\tObama\t33304\t0.333009268\t33304.0\n2993\t-80.23066899999999\t26.166014\tLauderhill city\tFL\tFlorida\tBroward County\t58204\t36.8\t20.2\t12.8\t19711\t86053\t0.672\t33313\tObama\t33313\t0.12340099800000001\t33313.0\n2994\t-80.304343\t26.047114999999998\tCooper City\tFL\tFlorida\tBroward County\t29144\t39.5\t42.9\t8.4\t32156\t212894\t0.672\t33330\tObama\t33330\t0.061789545\t33330.0\n2995\t-80.14371\t26.19245\tNorth Andrews Gardens CDP\tFL\tFlorida\tBroward County\t9577\t38.9\t12.9\t9.2\t21098\t116006\t0.672\t33334\tObama\t33334\t0.020304642\t33334.0\n2996\t-80.098184\t26.200945\tSea Ranch Lakes village\tFL\tFlorida\tBroward County\t738\t61.7\t52.0\t9.6\t55401\t305000\t0.672\t33308\tObama\t33308\t0.001564668\t33308.0\n2997\t-80.145223\t26.156325\tLazy Lake village\tFL\tFlorida\tBroward County\t35\t53.1\t33.3\t8.3\t31535\t95000\t0.672\t33305\tObama\t33305\t7.42e-05\t33305.0\n2998\t-80.179259\t26.052148000000003\tEstates of Fort Lauderdale CDP\tFL\tFlorida\tBroward County\t1777\t55.3\t22.6\t13.5\t31580\t84907\t0.672\t33021\tObama\t33021\t0.0037674999999999996\t33021.0\n2999\t-80.202362\t25.978727\tMiami Gardens CDP\tFL\tFlorida\tBroward County\t2961\t31.6\t9.8\t13.3\t14576\t104468\t0.672\t33023\tObama\t33023\t0.0062777530000000005\t33023.0\n3000\t-80.179884\t26.130226999999998\tWashington Park CDP\tFL\tFlorida\tBroward County\t1265\t37.1\t12.6\t16.3\t13637\t92424\t0.672\t33311\tObama\t33311\t0.002681985\t33311.0\n3001\t-80.189233\t26.097264000000003\tRiverland Village CDP\tFL\tFlorida\tBroward County\t2101\t41.8\t24.5\t8.2\t25033\t145411\t0.672\t33312\tObama\t33312\t0.004454427\t33312.0\n3002\t-80.428926\t26.046482\tCountry Estates CDP\tFL\tFlorida\tBroward County\t1870\t41.4\t33.7\t8.3\t39447\t357519\t0.672\t33332\tObama\t33332\t0.0039646740000000005\t33332.0\n3003\t-80.27400899999999\t26.096099\tPine Island Ridge CDP\tFL\tFlorida\tBroward County\t5246\t62.3\t32.4\t9.7\t27074\t103993\t0.672\t33324\tObama\t33324\t0.011122288000000001\t33324.0\n3004\t-80.184219\t26.279875\tCoconut Creek city\tFL\tFlorida\tBroward County\t48789\t42.7\t33.1\t8.9\t29662\t120458\t0.672\t33073\tObama\t33073\t0.10343982\t33073.0\n3005\t-80.119654\t26.268165000000003\tKendall Green CDP\tFL\tFlorida\tBroward County\t3204\t37.6\t12.9\t13.2\t16979\t93160\t0.672\t33064\tObama\t33064\t0.006792949\t33064.0\n3006\t-80.223586\t26.213584\tNorth Lauderdale city\tFL\tFlorida\tBroward County\t32878\t31.9\t17.4\t11.9\t18613\t114907\t0.672\t33068\tObama\t33068\t0.069706172\t33068.0\n3007\t-80.201396\t26.054381\tChambers Estates CDP\tFL\tFlorida\tBroward County\t3328\t33.9\t20.1\t12.7\t21790\t103571\t0.672\t33314\tObama\t33314\t0.007055847\t33314.0\n3008\t-80.274375\t26.040305\tRoyal Palm Ranches CDP\tFL\tFlorida\tBroward County\t300\t41.1\t60.1\t12.7\t38402\t300000\t0.672\t33328\tObama\t33328\t0.000636044\t33328.0\n3009\t-80.208773\t26.09789\tBroadview Park CDP\tFL\tFlorida\tBroward County\t6901\t31.9\t9.8\t15.2\t16108\t105520\t0.672\t33317\tObama\t33317\t0.01463113\t33317.0\n3010\t-80.259473\t26.269983\tCoral Springs city\tFL\tFlorida\tBroward County\t125622\t35.1\t40.3\t10.8\t30273\t227888\t0.672\t33065\tObama\t33065\t0.266337025\t33065.0\n3011\t-80.132765\t26.282073999999998\tCrystal Lake CDP\tFL\tFlorida\tBroward County\t0\t0.0\t0.0\t0.0\t0\t0\t0.672\t33064\tObama\t33064\t0.0\t33064.0\n3012\t-80.128373\t26.307058\tDeerfield Beach city\tFL\tFlorida\tBroward County\t65909\t47.7\t25.9\t11.3\t26633\t98167\t0.672\t33442\tObama\t33442\t0.139736726\t33442.0\n3013\t-80.261549\t26.125965\tPlantation city\tFL\tFlorida\tBroward County\t85265\t40.7\t42.4\t9.9\t31553\t179311\t0.672\t33388\tObama\t33388\t0.18077427899999998\t33388.0\n3014\t-80.191684\t26.205902\tPalm Aire CDP\tFL\tFlorida\tBroward County\t1547\t38.7\t31.4\t12.1\t31071\t116768\t0.672\t33068\tObama\t33068\t0.0032798659999999998\t33068.0\n3015\t-80.18216899999999\t26.125096\tBoulevard Gardens CDP\tFL\tFlorida\tBroward County\t1401\t35.9\t8.8\t14.4\t11797\t87000\t0.672\t33311\tObama\t33311\t0.002970325\t33311.0\n3016\t-80.176985\t26.154774\tRock Island CDP\tFL\tFlorida\tBroward County\t3359\t38.2\t14.0\t14.3\t17404\t96931\t0.672\t33311\tObama\t33311\t0.007121572\t33311.0\n3017\t-80.159566\t26.181866\tTwin Lakes CDP\tFL\tFlorida\tBroward County\t1898\t40.9\t22.4\t10.8\t25071\t120062\t0.672\t33309\tObama\t33309\t0.004024038\t33309.0\n3018\t-80.20189599999999\t26.168138\tLauderdale Lakes city\tFL\tFlorida\tBroward County\t33672\t37.6\t17.2\t15.3\t16160\t75104\t0.672\t33319\tObama\t33319\t0.071389568\t33319.0\n3019\t-80.221728\t26.29547\tGodfrey Road CDP\tFL\tFlorida\tBroward County\t187\t36.1\t50.4\t8.9\t36870\t579545\t0.672\t33067\tObama\t33067\t0.00039646699999999996\t33067.0\n3020\t-80.19121899999999\t25.990916\tCarver Ranches CDP\tFL\tFlorida\tBroward County\t4651\t34.7\t7.6\t18.9\t14369\t99731\t0.672\t33023\tObama\t33023\t0.009860800999999999\t33023.0\n3021\t-80.103164\t26.285846999999997\tPompano Beach Highlands CDP\tFL\tFlorida\tBroward County\t6181\t36.7\t13.4\t11.2\t19111\t107066\t0.672\t33064\tObama\t33064\t0.013104625\t33064.0\n3022\t-80.177734\t26.146245999999998\tGolden Heights CDP\tFL\tFlorida\tBroward County\t516\t35.9\t20.4\t13.9\t15461\t98824\t0.672\t33311\tObama\t33311\t0.001093996\t33311.0\n3023\t-80.191151\t26.144052\tWest Ken-Lark CDP\tFL\tFlorida\tBroward County\t3956\t30.2\t6.6\t24.0\t11708\t99615\t0.672\t33311\tObama\t33311\t0.008387299\t33311.0\n3024\t-85.045311\t30.443039000000002\tBlountstown city\tFL\tFlorida\tCalhoun County\t2459\t36.9\t15.3\t12.0\t16977\t99636\t0.2705\t32424\tObama\t32424\t0.00521344\t32424.0\n3025\t-85.126163\t30.571310999999998\tAltha town\tFL\tFlorida\tCalhoun County\t585\t42.8\t12.8\t5.8\t16652\t84000\t0.2705\t32421\tObama\t32421\t0.0012402860000000002\t32421.0\n3026\t-82.108797\t26.987565000000004\tPort Charlotte CDP\tFL\tFlorida\tCharlotte County\t47372\t51.4\t18.5\t12.6\t23431\t101211\t0.424\t33952\tObama\t33952\t0.10043557300000001\t33952.0\n3027\t-82.323122\t26.908052\tGrove City CDP\tFL\tFlorida\tCharlotte County\t2080\t62.8\t18.4\t11.2\t24578\t90577\t0.424\t34224\tObama\t34224\t0.004409904\t34224.0\n3028\t-82.007504\t26.99355\tHarbour Heights CDP\tFL\tFlorida\tCharlotte County\t3029\t54.8\t22.2\t12.4\t28658\t134067\t0.424\t33983\tObama\t33983\t0.006421923\t33983.0\n3029\t-82.279174\t26.884235999999998\tRotonda CDP\tFL\tFlorida\tCharlotte County\t8585\t65.8\t25.6\t13.3\t27439\t131572\t0.424\t33947\tObama\t33947\t0.018201456\t33947.0\n3030\t-82.048526\t26.904253000000004\tCharlotte Park CDP\tFL\tFlorida\tCharlotte County\t2254\t67.5\t21.7\t9.0\t30639\t97073\t0.424\t33950\tObama\t33950\t0.00477881\t33950.0\n3031\t-81.991654\t26.953263\tCleveland CDP\tFL\tFlorida\tCharlotte County\t3198\t56.2\t18.2\t13.7\t25196\t73684\t0.424\t33982\tObama\t33982\t0.006780228\t33982.0\n3032\t-82.027978\t26.938664000000003\tSolana CDP\tFL\tFlorida\tCharlotte County\t822\t55.3\t18.9\t18.7\t22600\t76579\t0.424\t33950\tObama\t33950\t0.00174276\t33950.0\n3033\t-82.36019\t26.925152\tManasota Key CDP\tFL\tFlorida\tCharlotte County\t1334\t64.9\t28.6\t10.7\t36255\t187766\t0.424\t34223\tObama\t34223\t0.002828275\t34223.0\n3034\t-82.06224399999999\t26.965649\tCharlotte Harbor CDP\tFL\tFlorida\tCharlotte County\t3705\t72.4\t19.6\t13.1\t24906\t71491\t0.424\t33980\tObama\t33980\t0.007855141999999999\t33980.0\n3035\t-82.067088\t26.896620000000002\tPunta Gorda city\tFL\tFlorida\tCharlotte County\t16530\t65.4\t34.8\t13.4\t39629\t239270\t0.424\t33950\tObama\t33950\t0.035046019\t33950.0\n3036\t-82.607641\t28.784757\tHomosassa CDP\tFL\tFlorida\tCitrus County\t2850\t62.0\t18.8\t13.7\t27831\t195161\t0.3849\t34448\tObama\t34448\t0.006042417\t34448.0\n3037\t-82.49450999999999\t28.906646000000002\tBlack Diamond CDP\tFL\tFlorida\tCitrus County\t1255\t60.4\t26.2\t15.6\t30420\t218478\t0.3849\t34465\tObama\t34465\t0.0026607840000000002\t34465.0\n3038\t-82.377839\t28.945055\tHernando CDP\tFL\tFlorida\tCitrus County\t9022\t57.1\t16.2\t16.0\t20042\t114788\t0.3849\t34442\tObama\t34442\t0.01912796\t34442.0\n3039\t-82.43105600000001\t28.887237\tCitrus Hills CDP\tFL\tFlorida\tCitrus County\t7196\t60.2\t25.4\t15.3\t29884\t230115\t0.3849\t344XX\tObama\t344XX\t0.015256573\t0.0\n3040\t-82.337112\t28.800519\tInverness Highlands South CDP\tFL\tFlorida\tCitrus County\t6568\t52.1\t11.0\t14.1\t21919\t123637\t0.3849\t34452\tObama\t34452\t0.013925121\t34452.0\n3041\t-82.603625\t28.903724\tCrystal River city\tFL\tFlorida\tCitrus County\t4071\t53.6\t24.3\t15.4\t27490\t134309\t0.3849\t344HH\tObama\t344HH\t0.008631116\t0.0\n3042\t-82.498515\t28.731906\tSugarmill Woods CDP\tFL\tFlorida\tCitrus County\t8392\t66.3\t23.4\t16.8\t26013\t189842\t0.3849\t34446\tObama\t34446\t0.017792268\t34446.0\n3043\t-82.48775\t28.835604999999997\tLecanto CDP\tFL\tFlorida\tCitrus County\t5914\t53.0\t18.9\t16.4\t23606\t154401\t0.3849\t34461\tObama\t34461\t0.012538546000000001\t34461.0\n3044\t-82.30922\t28.706157\tFloral City CDP\tFL\tFlorida\tCitrus County\t5695\t54.9\t10.3\t12.4\t18559\t118644\t0.3849\t34436\tObama\t34436\t0.012074233\t34436.0\n3045\t-82.47579300000001\t28.932740000000003\tPine Ridge CDP\tFL\tFlorida\tCitrus County\t8844\t61.0\t24.8\t19.5\t26460\t190302\t0.3849\t34465\tObama\t34465\t0.018750574\t34465.0\n3046\t-82.34294399999999\t28.839235\tInverness city\tFL\tFlorida\tCitrus County\t7378\t55.8\t13.6\t14.9\t19821\t118894\t0.3849\t34453\tObama\t34453\t0.01564244\t34453.0\n3047\t-82.454957\t28.918090000000003\tBeverly Hills CDP\tFL\tFlorida\tCitrus County\t8747\t68.1\t13.3\t16.6\t19258\t100467\t0.3849\t34465\tObama\t34465\t0.01854492\t34465.0\n3048\t-82.37688\t28.864189\tInverness Highlands North CDP\tFL\tFlorida\tCitrus County\t2581\t46.9\t16.6\t12.1\t16731\t93827\t0.3849\t34453\tObama\t34453\t0.005472098000000001\t34453.0\n3049\t-82.459345\t28.993265\tCitrus Springs CDP\tFL\tFlorida\tCitrus County\t7197\t56.6\t15.3\t11.6\t19612\t130870\t0.3849\t34434\tObama\t34434\t0.015258693\t34434.0\n3050\t-82.53981999999999\t28.81267\tHomosassa Springs CDP\tFL\tFlorida\tCitrus County\t15161\t48.1\t7.9\t14.1\t17208\t93199\t0.3849\t34448\tObama\t34448\t0.032143539\t34448.0\n3051\t-81.704328\t30.1706\tOrange Park town\tFL\tFlorida\tClay County\t9466\t45.7\t28.9\t17.8\t28078\t168001\t0.2667\t32073\tObama\t32073\t0.020069305\t32073.0\n3052\t-81.74385\t30.178933\tBellair-Meadowbrook Terrace CDP\tFL\tFlorida\tClay County\t17215\t34.5\t20.9\t12.0\t26336\t129231\t0.2667\t32073\tObama\t32073\t0.036498319\t32073.0\n3053\t-81.82008499999999\t30.051482\tAsbury Lake CDP\tFL\tFlorida\tClay County\t2303\t41.6\t19.5\t9.8\t26138\t170126\t0.2667\t32068\tObama\t32068\t0.004882697\t32068.0\n3054\t-81.900318\t30.051370000000002\tMiddleburg CDP\tFL\tFlorida\tClay County\t13155\t35.7\t10.2\t12.4\t19842\t110707\t0.2667\t32068\tObama\t32068\t0.027890525\t32068.0\n3055\t-81.76844200000001\t30.129488000000002\tLakeside CDP\tFL\tFlorida\tClay County\t34465\t37.7\t25.2\t12.2\t26263\t152073\t0.2667\t32065\tObama\t32065\t0.07307084400000001\t32065.0\n3056\t-81.67800799999999\t29.989784999999998\tGreen Cove Springs city\tFL\tFlorida\tClay County\t6667\t40.0\t14.8\t17.2\t19229\t95536\t0.2667\t32043\tObama\t32043\t0.014135016\t32043.0\n3057\t-82.03925500000001\t29.845173\tKeystone Heights city\tFL\tFlorida\tClay County\t1759\t40.8\t22.7\t10.1\t22264\t108108\t0.2667\t32656\tObama\t32656\t0.003729337\t32656.0\n3058\t-81.811138\t29.980357\tPenney Farms town\tFL\tFlorida\tClay County\t738\t64.0\t43.3\t13.1\t23551\t95357\t0.2667\t32079\tObama\t32079\t0.001564668\t32079.0\n3059\t-81.810526\t26.2324\tPelican Bay CDP\tFL\tFlorida\tCollier County\t7747\t69.0\t64.8\t7.4\t97723\t547577\t0.3467\t34108\tObama\t34108\t0.016424774\t34108.0\n3060\t-81.80945799999999\t26.263354999999997\tNaples Park CDP\tFL\tFlorida\tCollier County\t7016\t42.4\t23.3\t12.6\t25511\t171011\t0.3467\t34108\tObama\t34108\t0.014874947\t34108.0\n3061\t-81.57858900000001\t26.292863\tOrangetree CDP\tFL\tFlorida\tCollier County\t3529\t31.7\t18.6\t7.1\t24333\t162102\t0.3467\t34120\tObama\t34120\t0.0074819959999999994\t34120.0\n3062\t-81.72971700000001\t26.103169\tLely CDP\tFL\tFlorida\tCollier County\t4038\t64.9\t32.0\t17.4\t36951\t146752\t0.3467\t34112\tObama\t34112\t0.008561151\t34112.0\n3063\t-81.360052\t25.814465\tChokoloskee CDP\tFL\tFlorida\tCollier County\t427\t56.7\t16.4\t9.9\t22766\t112500\t0.3467\t34138\tObama\t34138\t0.000905302\t34138.0\n3064\t-81.42159000000001\t26.418021999999997\tImmokalee CDP\tFL\tFlorida\tCollier County\t22112\t26.3\t5.0\t26.0\t10569\t69553\t0.3467\t34142\tObama\t34142\t0.046880675999999996\t34142.0\n3065\t-81.728088\t26.227887\tVineyards CDP\tFL\tFlorida\tCollier County\t3164\t63.8\t55.5\t10.9\t68124\t358880\t0.3467\t34119\tObama\t34119\t0.006708143000000001\t34119.0\n3066\t-81.386088\t25.858611\tEverglades city\tFL\tFlorida\tCollier County\t505\t56.7\t16.4\t9.9\t22746\t111250\t0.3467\t34139\tObama\t34139\t0.001070674\t34139.0\n3067\t-81.793962\t26.148625\tNaples city\tFL\tFlorida\tCollier County\t22394\t62.2\t48.5\t8.7\t58674\t507768\t0.3467\t34102\tObama\t34102\t0.047478557000000005\t34102.0\n3068\t-81.725339\t26.089175\tNaples Manor CDP\tFL\tFlorida\tCollier County\t5835\t27.5\t2.5\t11.8\t11698\t104741\t0.3467\t34113\tObama\t34113\t0.012371054\t34113.0\n3069\t-81.703238\t26.089066\tLely Resort CDP\tFL\tFlorida\tCollier County\t4105\t56.3\t36.5\t12.2\t37794\t158056\t0.3467\t34113\tObama\t34113\t0.008703200999999999\t34113.0\n3070\t-81.703819\t25.937775\tMarco Island city\tFL\tFlorida\tCollier County\t17770\t63.2\t39.6\t8.1\t47831\t387347\t0.3467\t34145\tObama\t34145\t0.037675001\t34145.0\n3071\t-81.7032\t26.184306\tGolden Gate CDP\tFL\tFlorida\tCollier County\t23597\t30.4\t13.1\t10.7\t18371\t123089\t0.3467\t34116\tObama\t34116\t0.050029094\t34116.0\n3072\t-81.64716700000001\t25.923822\tGoodland CDP\tFL\tFlorida\tCollier County\t317\t58.0\t31.9\t6.3\t38263\t377273\t0.3467\t341HH\tObama\t341HH\t0.000672086\t0.0\n3073\t-81.375516\t25.847491\tPlantation Island CDP\tFL\tFlorida\tCollier County\t374\t56.6\t16.4\t9.9\t22765\t111719\t0.3467\t34139\tObama\t34139\t0.000792935\t34139.0\n3074\t-81.795345\t26.232449\tPine Ridge CDP\tFL\tFlorida\tCollier County\t1927\t52.0\t54.0\t10.9\t53508\t493452\t0.3467\t34108\tObama\t34108\t0.004085522\t34108.0\n3075\t-82.713676\t29.92185\tFort White town\tFL\tFlorida\tColumbia County\t569\t42.5\t11.9\t11.2\t16039\t123000\t0.3115\t32038\tObama\t32038\t0.001206363\t32038.0\n3076\t-82.602906\t30.185344\tWatertown CDP\tFL\tFlorida\tColumbia County\t3066\t40.0\t12.7\t17.0\t17228\t98049\t0.3115\t32025\tObama\t32025\t0.006500369000000001\t32025.0\n3077\t-82.646275\t30.222606\tFive Points CDP\tFL\tFlorida\tColumbia County\t1691\t34.1\t3.3\t24.6\t11610\t69286\t0.3115\t32055\tObama\t32055\t0.003585167\t32055.0\n3078\t-82.643847\t30.190191\tLake City\tFL\tFlorida\tColumbia County\t11124\t41.8\t19.3\t13.2\t18665\t116192\t0.3115\t32055\tObama\t32055\t0.023584507999999997\t32055.0\n3079\t-81.859427\t27.220167\tArcadia city\tFL\tFlorida\tDeSoto County\t7008\t32.2\t12.5\t12.1\t15373\t108348\t0.4231\t34266\tObama\t34266\t0.014857986\t34266.0\n3080\t-81.85209499999999\t27.186279\tSoutheast Arcadia CDP\tFL\tFlorida\tDeSoto County\t7271\t30.9\t6.8\t7.9\t14243\t86345\t0.4231\t34266\tObama\t34266\t0.015415584\t34266.0\n3081\t-83.287935\t29.440299\tHorseshoe Beach town\tFL\tFlorida\tDixie County\t213\t47.9\t8.7\t9.6\t22025\t85000\t0.259\t32648\tObama\t32648\t0.000451591\t32648.0\n3082\t-83.12477700000001\t29.639015\tCross City town\tFL\tFlorida\tDixie County\t1967\t34.9\t9.4\t9.0\t13646\t76489\t0.259\t32628\tObama\t32628\t0.004170328\t32628.0\n3083\t-81.41200500000001\t30.316483\tNeptune Beach city\tFL\tFlorida\tDuval County\t7337\t41.7\t44.0\t13.3\t34313\t225189\t0.4777\t32266\tObama\t32266\t0.015555514\t32266.0\n3084\t-81.405058\t30.278063\tJacksonville Beach city\tFL\tFlorida\tDuval County\t22502\t41.6\t33.8\t12.5\t34839\t192515\t0.4777\t32250\tObama\t32250\t0.047707532999999996\t32250.0\n3085\t-81.974595\t30.304981\tBaldwin town\tFL\tFlorida\tDuval County\t1740\t38.7\t6.7\t14.2\t17181\t78404\t0.4777\t32234\tObama\t32234\t0.003689055\t32234.0\n3086\t-81.413157\t30.337356\tAtlantic Beach city\tFL\tFlorida\tDuval County\t13647\t40.6\t40.4\t11.8\t35447\t228846\t0.4777\t32233\tObama\t32233\t0.028933637\t32233.0\n3087\t-81.674829\t30.332114\tJacksonville city\tFL\tFlorida\tDuval County\t859030\t35.0\t24.4\t13.2\t25168\t121559\t0.4777\t32204\tObama\t32204\t1.821269323\t32204.0\n3088\t-87.263134\t30.976963\tCentury town\tFL\tFlorida\tEscambia County\t1816\t37.9\t5.9\t18.6\t13089\t55789\t0.3918\t32535\tObama\t32535\t0.003850186\t32535.0\n3089\t-87.290825\t30.385001000000003\tWarrington CDP\tFL\tFlorida\tEscambia County\t14810\t37.1\t17.5\t14.8\t20318\t87011\t0.3918\t32508\tObama\t32508\t0.031399368\t32508.0\n3090\t-87.29034300000001\t30.582310999999997\tGonzalez CDP\tFL\tFlorida\tEscambia County\t13383\t40.1\t24.5\t10.4\t25128\t147629\t0.3918\t32533\tObama\t32533\t0.028373918999999997\t32533.0\n3091\t-87.311779\t30.462252000000003\tBellview CDP\tFL\tFlorida\tEscambia County\t23535\t38.6\t15.7\t10.8\t21595\t104576\t0.3918\t32526\tObama\t32526\t0.049897644000000005\t32526.0\n3092\t-87.249584\t30.47301\tBrent CDP\tFL\tFlorida\tEscambia County\t22715\t28.0\t15.3\t15.5\t16986\t79665\t0.3918\t32505\tObama\t32505\t0.048159124000000005\t32505.0\n3093\t-87.23021899999999\t30.439058000000003\tGoulding CDP\tFL\tFlorida\tEscambia County\t4362\t39.0\t10.1\t20.8\t14639\t57170\t0.3918\t32501\tObama\t32501\t0.009248078\t32501.0\n3094\t-87.32417199999999\t30.712642\tMolino CDP\tFL\tFlorida\tEscambia County\t1386\t38.0\t10.2\t14.8\t17530\t79146\t0.3918\t32577\tObama\t32577\t0.0029385229999999997\t32577.0\n3095\t-87.267995\t30.426327\tWest Pensacola CDP\tFL\tFlorida\tEscambia County\t21954\t35.0\t9.9\t15.6\t15647\t64412\t0.3918\t32505\tObama\t32505\t0.046545693\t32505.0\n3096\t-87.302741\t30.415834999999998\tMyrtle Grove CDP\tFL\tFlorida\tEscambia County\t17481\t32.7\t20.5\t12.4\t19717\t106394\t0.3918\t32506\tObama\t32506\t0.037062278\t32506.0\n3097\t-87.207317\t30.522115999999997\tFerry Pass CDP\tFL\tFlorida\tEscambia County\t28758\t39.2\t32.9\t11.5\t26529\t131842\t0.3918\t32514\tObama\t32514\t0.060971169000000006\t32514.0\n3098\t-87.201711\t30.452445\tPensacola city\tFL\tFlorida\tEscambia County\t55472\t41.9\t34.8\t12.9\t24070\t124721\t0.3918\t32503\tObama\t32503\t0.11760875900000001\t32503.0\n3099\t-87.273514\t30.526171\tEnsley CDP\tFL\tFlorida\tEscambia County\t21534\t38.0\t18.9\t11.1\t21749\t103271\t0.3918\t32534\tObama\t32534\t0.045655232000000004\t32534.0\n3100\t-81.213442\t29.672845000000002\tMarineland town\tFL\tFlorida\tFlagler County\t79\t59.7\t34.8\t15.8\t32039\t218182\t0.4587\t32137\tObama\t32137\t0.00016749200000000002\t32137.0\n3101\t-81.10545400000001\t29.472033000000003\tFlagler Beach city\tFL\tFlorida\tFlagler County\t5131\t59.9\t36.5\t17.7\t33297\t194238\t0.4587\t32136\tObama\t32136\t0.010878471\t32136.0\n3102\t-81.221563\t29.528528\tPalm Coast city\tFL\tFlorida\tFlagler County\t73984\t51.2\t23.6\t16.4\t26866\t172652\t0.4587\t32164\tObama\t32164\t0.15685690800000002\t32164.0\n3103\t-81.147115\t29.515954999999998\tBeverly Beach town\tFL\tFlorida\tFlagler County\t649\t64.4\t43.0\t16.0\t47254\t280556\t0.4587\t32136\tObama\t32136\t0.001375975\t32136.0\n3104\t-81.25709300000001\t29.476397\tBunnell city\tFL\tFlorida\tFlagler County\t2507\t42.4\t18.7\t14.0\t21359\t148182\t0.4587\t32164\tObama\t32164\t0.005315207\t32164.0\n3105\t-84.994579\t29.728443\tApalachicola city\tFL\tFlorida\tFranklin County\t2733\t45.5\t18.7\t6.4\t17358\t146780\t0.337\t32320\tObama\t32320\t0.00579436\t32320.0\n3106\t-84.671711\t29.853641999999997\tCarrabelle city\tFL\tFlorida\tFranklin County\t1416\t42.9\t11.6\t7.7\t15308\t116435\t0.337\t32322\tObama\t32322\t0.0030021270000000003\t32322.0\n3107\t-84.86961099999999\t29.754638\tEastpoint CDP\tFL\tFlorida\tFranklin County\t2462\t40.2\t14.1\t6.0\t18053\t116094\t0.337\t32328\tObama\t32328\t0.0052198\t32328.0\n3108\t-84.45926\t30.493196\tMidway city\tFL\tFlorida\tGadsden County\t1710\t30.4\t10.8\t12.6\t13951\t91667\t0.7009\t32343\tObama\t32343\t0.00362545\t32343.0\n3109\t-84.834007\t30.697446000000003\tChattahoochee city\tFL\tFlorida\tGadsden County\t3786\t43.1\t18.1\t18.4\t18678\t73000\t0.7009\t32324\tObama\t32324\t0.008026874\t32324.0\n3110\t-84.744732\t30.569992\tGreensboro town\tFL\tFlorida\tGadsden County\t722\t29.4\t11.2\t8.2\t13277\t70667\t0.7009\t32330\tObama\t32330\t0.0015307460000000001\t32330.0\n3111\t-84.583562\t30.579356\tQuincy city\tFL\tFlorida\tGadsden County\t7457\t34.9\t18.0\t10.5\t18715\t89400\t0.7009\t32351\tObama\t32351\t0.015809931\t32351.0\n3112\t-84.661309\t30.612938\tGretna city\tFL\tFlorida\tGadsden County\t1905\t30.4\t10.9\t16.4\t12237\t67083\t0.7009\t32332\tObama\t32332\t0.004038879\t32332.0\n3113\t-84.41540400000001\t30.623905999999998\tHavana town\tFL\tFlorida\tGadsden County\t1883\t42.1\t18.4\t13.1\t17841\t100893\t0.7009\t32333\tObama\t32333\t0.003992236\t32333.0\n3114\t-82.86178000000001\t29.756873\tBell town\tFL\tFlorida\tGilchrist County\t475\t40.2\t9.2\t11.4\t17723\t91250\t0.2383\t32619\tObama\t32619\t0.00100707\t32619.0\n3115\t-82.811305\t29.614639\tTrenton city\tFL\tFlorida\tGilchrist County\t2055\t40.0\t10.8\t11.9\t15743\t79886\t0.2383\t32693\tObama\t32693\t0.004356901\t32693.0\n3116\t-80.886965\t27.133329999999997\tBuckhead Ridge CDP\tFL\tFlorida\tGlades County\t1552\t64.0\t12.7\t10.4\t24230\t109172\t0.4019\t34974\tObama\t34974\t0.003290467\t34974.0\n3117\t-81.097573\t26.834128999999997\tMoore Haven city\tFL\tFlorida\tGlades County\t1656\t33.9\t8.8\t17.1\t14632\t67273\t0.4019\t33471\tObama\t33471\t0.0035109620000000003\t33471.0\n3118\t-85.296502\t29.809096000000004\tPort St. Joe city\tFL\tFlorida\tGulf County\t3565\t44.9\t17.8\t7.5\t19394\t127920\t0.2833\t32456\tObama\t32456\t0.007558321999999999\t32456.0\n3119\t-85.192769\t30.11553\tWewahitchka city\tFL\tFlorida\tGulf County\t1742\t41.9\t11.6\t10.9\t16799\t97766\t0.2833\t32465\tObama\t32465\t0.003693295\t32465.0\n3120\t-82.963003\t30.515089\tJasper city\tFL\tFlorida\tHamilton County\t1813\t35.8\t15.0\t21.9\t14330\t70714\t0.4121\t32052\tObama\t32052\t0.003843825\t32052.0\n3121\t-82.756374\t30.331729\tWhite Springs town\tFL\tFlorida\tHamilton County\t837\t40.2\t9.1\t12.5\t15138\t74737\t0.4121\t32096\tObama\t32096\t0.0017745620000000001\t32096.0\n3122\t-83.109577\t30.609606\tJennings town\tFL\tFlorida\tHamilton County\t834\t35.0\t5.4\t9.1\t11844\t63864\t0.4121\t32053\tObama\t32053\t0.0017682020000000002\t32053.0\n3123\t-81.809291\t27.546597\tWauchula city\tFL\tFlorida\tHardee County\t4651\t33.6\t15.5\t19.5\t14882\t94265\t0.3409\t33873\tObama\t33873\t0.009860800999999999\t33873.0\n3124\t-81.794387\t27.494090999999997\tZolfo Springs town\tFL\tFlorida\tHardee County\t1815\t32.7\t8.3\t16.9\t14435\t76471\t0.3409\t33873\tObama\t33873\t0.003848066\t33873.0\n3125\t-81.823533\t27.637868\tBowling Green city\tFL\tFlorida\tHardee County\t3118\t29.6\t6.2\t15.0\t11586\t73621\t0.3409\t33873\tObama\t33873\t0.006610616\t33873.0\n3126\t-81.38915899999999\t26.749696000000004\tPort La Belle CDP\tFL\tFlorida\tHendry County\t3563\t30.5\t12.1\t14.7\t17203\t106625\t0.4665\t33935\tObama\t33935\t0.007554081\t33935.0\n3127\t-80.939901\t26.753290999999997\tClewiston city\tFL\tFlorida\tHendry County\t6863\t32.8\t18.1\t18.0\t19035\t140521\t0.4665\t33440\tObama\t33440\t0.014550563999999998\t33440.0\n3128\t-80.950788\t26.732126\tHarlem CDP\tFL\tFlorida\tHendry County\t2707\t26.6\t3.6\t35.4\t10291\t94821\t0.4665\t33440\tObama\t33440\t0.005739236\t33440.0\n3129\t-81.437543\t26.755318\tLabelle city\tFL\tFlorida\tHendry County\t4713\t39.3\t16.0\t17.8\t16874\t97130\t0.4665\t33935\tObama\t33935\t0.00999225\t33935.0\n3130\t-82.39303000000001\t28.553463\tBrooksville city\tFL\tFlorida\tHernando County\t8025\t45.8\t17.3\t12.6\t19495\t60168\t0.4521\t34601\tObama\t34601\t0.017014174\t34601.0\n3131\t-82.404028\t28.568949\tNorth Brooksville CDP\tFL\tFlorida\tHernando County\t1591\t40.0\t10.0\t11.4\t17036\t70192\t0.4521\t34601\tObama\t34601\t0.003373153\t34601.0\n3132\t-82.491949\t28.548308000000002\tBrookridge CDP\tFL\tFlorida\tHernando County\t4511\t73.2\t14.0\t32.0\t21381\t69500\t0.4521\t34613\tObama\t34613\t0.00956398\t34613.0\n3133\t-82.275769\t28.661165999999998\tIstachatta CDP\tFL\tFlorida\tHernando County\t79\t48.8\t15.5\t21.9\t20605\t97000\t0.4521\t34661\tObama\t34661\t0.00016749200000000002\t34661.0\n3134\t-82.361959\t28.634189000000003\tLake Lindsey CDP\tFL\tFlorida\tHernando County\t52\t43.8\t18.9\t9.1\t17206\t80000\t0.4521\t34601\tObama\t34601\t0.00011024799999999999\t34601.0\n3135\t-82.29351199999999\t28.52383\tHill 'n Dale CDP\tFL\tFlorida\tHernando County\t1623\t36.4\t12.9\t15.6\t14798\t74603\t0.4521\t34602\tObama\t34602\t0.003440998\t34602.0\n3136\t-82.460945\t28.441684000000002\tMasaryktown CDP\tFL\tFlorida\tHernando County\t809\t45.3\t13.0\t14.8\t17542\t75469\t0.4521\t34609\tObama\t34609\t0.0017151979999999998\t34609.0\n3137\t-82.620657\t28.53746\tWeeki Wachee Gardens CDP\tFL\tFlorida\tHernando County\t1131\t59.4\t21.3\t18.0\t22190\t117952\t0.4521\t34607\tObama\t34607\t0.002397886\t34607.0\n3138\t-82.599947\t28.468861999999998\tTimber Pines CDP\tFL\tFlorida\tHernando County\t6237\t75.9\t27.8\t13.8\t35616\t171120\t0.4521\t34606\tObama\t34606\t0.013223353\t34606.0\n3139\t-82.26220699999999\t28.645157\tNobleton CDP\tFL\tFlorida\tHernando County\t176\t48.0\t20.0\t14.3\t20208\t134722\t0.4521\t34661\tObama\t34661\t0.000373146\t34661.0\n3140\t-82.528988\t28.54715\tHigh Point CDP\tFL\tFlorida\tHernando County\t3869\t65.3\t7.7\t11.4\t19577\t65613\t0.4521\t34613\tObama\t34613\t0.008202846\t34613.0\n3141\t-82.538751\t28.481633000000002\tSpring Hill CDP\tFL\tFlorida\tHernando County\t96285\t51.3\t14.9\t13.9\t21319\t119257\t0.4521\t34608\tObama\t34608\t0.204138292\t34608.0\n3142\t-82.301649\t28.495179999999998\tSpring Lake CDP\tFL\tFlorida\tHernando County\t388\t46.5\t11.3\t15.2\t20191\t104464\t0.4521\t34602\tObama\t34602\t0.000822617\t34602.0\n3143\t-82.183388\t28.498935999999997\tRidge Manor CDP\tFL\tFlorida\tHernando County\t4831\t48.4\t13.5\t17.0\t22246\t94188\t0.4521\t33523\tObama\t33523\t0.010242427\t33523.0\n3144\t-82.645646\t28.5471\tBayport CDP\tFL\tFlorida\tHernando County\t37\t59.4\t21.9\t25.0\t21426\t120833\t0.4521\t34607\tObama\t34607\t7.840000000000001e-05\t34607.0\n3145\t-82.384052\t28.538090999999998\tSouth Brooksville CDP\tFL\tFlorida\tHernando County\t1408\t44.3\t12.2\t15.3\t16192\t52805\t0.4521\t34601\tObama\t34601\t0.0029851659999999996\t34601.0\n3146\t-82.654834\t28.571764\tPine Island CDP\tFL\tFlorida\tHernando County\t66\t57.9\t20.0\t22.2\t21357\t129167\t0.4521\t34607\tObama\t34607\t0.00013993\t34607.0\n3147\t-82.576561\t28.517317\tWeeki Wachee city\tFL\tFlorida\tHernando County\t17\t60.0\t21.4\t16.7\t19774\t100000\t0.4521\t34607\tObama\t34607\t3.6e-05\t34607.0\n3148\t-82.55909100000001\t28.550071000000003\tNorth Weeki Wachee CDP\tFL\tFlorida\tHernando County\t7210\t60.6\t20.6\t15.9\t26192\t136370\t0.4521\t34613\tObama\t34613\t0.015286255\t34613.0\n3149\t-82.660573\t28.474652000000003\tHernando Beach CDP\tFL\tFlorida\tHernando County\t2765\t60.9\t25.5\t13.4\t30691\t197338\t0.4521\t34679\tObama\t34679\t0.005862205\t34679.0\n3150\t-81.50297900000001\t27.593976\tAvon Park city\tFL\tFlorida\tHighlands County\t8985\t36.6\t10.7\t15.5\t15151\t84828\t0.3805\t33825\tObama\t33825\t0.019049515\t33825.0\n3151\t-81.455834\t27.492927\tSebring city\tFL\tFlorida\tHighlands County\t10961\t47.8\t14.6\t13.8\t17000\t89781\t0.3805\t33872\tObama\t33872\t0.023238923999999998\t33872.0\n3152\t-81.406824\t27.240895000000002\tPlacid Lakes CDP\tFL\tFlorida\tHighlands County\t3712\t52.1\t15.1\t2.1\t19377\t153983\t0.3805\t33852\tObama\t33852\t0.007869983\t33852.0\n3153\t-81.371504\t27.29774\tLake Placid town\tFL\tFlorida\tHighlands County\t2025\t41.6\t12.9\t13.6\t17339\t119318\t0.3805\t33852\tObama\t33852\t0.004293295999999999\t33852.0\n3154\t-81.345575\t27.317765\tSylvan Shores CDP\tFL\tFlorida\tHighlands County\t3007\t61.5\t10.8\t7.5\t20961\t103344\t0.3805\t33852\tObama\t33852\t0.00637528\t33852.0\n3155\t-82.526004\t28.105503999999996\tGreater Northdale CDP\tFL\tFlorida\tHillsborough County\t22060\t37.6\t39.6\t12.0\t29320\t157720\t0.5284\t33624\tObama\t33624\t0.046770429\t33624.0\n3156\t-82.40815699999999\t27.773329999999998\tApollo Beach CDP\tFL\tFlorida\tHillsborough County\t9786\t49.7\t25.7\t12.5\t33661\t181181\t0.5284\t33572\tObama\t33572\t0.020747752\t33572.0\n3157\t-82.359239\t27.883090999999997\tProgress Village CDP\tFL\tFlorida\tHillsborough County\t4705\t38.8\t16.9\t16.1\t17205\t81087\t0.5284\t33534\tObama\t33534\t0.009975289\t33534.0\n3158\t-82.282076\t27.837689\tBoyette CDP\tFL\tFlorida\tHillsborough County\t8237\t36.8\t25.7\t8.8\t25723\t163109\t0.5284\t33569\tObama\t33569\t0.017463646\t33569.0\n3159\t-82.37917\t28.044220000000003\tTemple Terrace city\tFL\tFlorida\tHillsborough County\t22645\t35.1\t44.8\t10.9\t28506\t134380\t0.5284\t33617\tObama\t33617\t0.048010714\t33617.0\n3160\t-82.273312\t27.998283\tSeffner CDP\tFL\tFlorida\tHillsborough County\t6685\t40.3\t16.0\t11.1\t24038\t111585\t0.5284\t33584\tObama\t33584\t0.014173178\t33584.0\n3161\t-82.273829\t28.048959999999997\tThonotosassa CDP\tFL\tFlorida\tHillsborough County\t6563\t38.5\t14.2\t12.5\t20886\t97549\t0.5284\t33592\tObama\t33592\t0.013914521000000001\t33592.0\n3162\t-82.31728100000001\t27.872275\tRiverview CDP\tFL\tFlorida\tHillsborough County\t19584\t34.6\t31.9\t7.3\t29138\t157944\t0.5284\t335HH\tObama\t335HH\t0.041520946\t0.0\n3163\t-82.219847\t27.992678\tDover CDP\tFL\tFlorida\tHillsborough County\t3201\t28.9\t5.4\t30.4\t11754\t71867\t0.5284\t33527\tObama\t33527\t0.0067865880000000005\t33527.0\n3164\t-82.37889399999999\t27.98269\tEast Lake-Orient Park CDP\tFL\tFlorida\tHillsborough County\t5819\t35.3\t10.5\t16.0\t16928\t79280\t0.5284\t33610\tObama\t33610\t0.012337131999999999\t33610.0\n3165\t-82.576672\t28.011244\tTown 'n' Country CDP\tFL\tFlorida\tHillsborough County\t77648\t37.0\t28.0\t12.3\t26106\t113931\t0.5284\t33615\tObama\t33615\t0.164625124\t33615.0\n3166\t-82.506171\t28.017678000000004\tEgypt Lake-Leto CDP\tFL\tFlorida\tHillsborough County\t36054\t34.2\t22.3\t13.7\t22332\t105308\t0.5284\t33614\tObama\t33614\t0.076439757\t33614.0\n3167\t-82.374196\t27.826412\tGibsonton CDP\tFL\tFlorida\tHillsborough County\t15287\t32.7\t16.6\t13.8\t19126\t81124\t0.5284\t33534\tObama\t33534\t0.032410677\t33534.0\n3168\t-82.514342\t28.057955\tGreater Carrollwood CDP\tFL\tFlorida\tHillsborough County\t33859\t39.8\t47.3\t10.1\t32926\t149894\t0.5284\t33624\tObama\t33624\t0.071786035\t33624.0\n3169\t-82.360765\t27.708363000000002\tGreater Sun Center CDP\tFL\tFlorida\tHillsborough County\t19441\t76.6\t33.7\t11.4\t33661\t120678\t0.5284\t33573\tObama\t33573\t0.041217765\t33573.0\n3170\t-82.236974\t27.950332\tValrico CDP\tFL\tFlorida\tHillsborough County\t11486\t43.3\t22.9\t10.8\t22357\t93806\t0.5284\t33594\tObama\t33594\t0.024352001\t33594.0\n3171\t-82.216577\t27.851128999999997\tFish Hawk CDP\tFL\tFlorida\tHillsborough County\t11860\t33.1\t33.0\t8.9\t26160\t177091\t0.5284\t33594\tObama\t33594\t0.025144936\t33594.0\n3172\t-82.45130999999999\t27.988771000000003\tTampa city\tFL\tFlorida\tHillsborough County\t334895\t36.0\t29.6\t15.1\t26679\t111481\t0.5284\t33603\tObama\t33603\t0.710026413\t33603.0\n3173\t-82.562365\t28.072465\tCitrus Park CDP\tFL\tFlorida\tHillsborough County\t24848\t36.1\t32.6\t12.4\t27950\t138658\t0.5284\t33625\tObama\t33625\t0.052681397000000005\t33625.0\n3174\t-82.479219\t28.087445000000002\tLake Magdalene CDP\tFL\tFlorida\tHillsborough County\t28788\t42.5\t38.8\t11.7\t30902\t135654\t0.5284\t33618\tObama\t33618\t0.061034773\t33618.0\n3175\t-82.436125\t28.069294\tUniversity CDP\tFL\tFlorida\tHillsborough County\t34298\t27.2\t25.1\t19.0\t15482\t68407\t0.5284\t33613\tObama\t33613\t0.07271678\t33613.0\n3176\t-82.124705\t28.007640999999996\tPlant City\tFL\tFlorida\tHillsborough County\t33327\t34.0\t19.6\t15.3\t21837\t108391\t0.5284\t33566\tObama\t33566\t0.07065811799999999\t33566.0\n3177\t-82.599725\t28.131206\tKeystone CDP\tFL\tFlorida\tHillsborough County\t23056\t39.6\t46.8\t6.7\t43937\t252654\t0.5284\t33556\tObama\t33556\t0.048882094\t33556.0\n3178\t-82.37985\t27.923828000000004\tPalm River-Clair Mel CDP\tFL\tFlorida\tHillsborough County\t19661\t32.0\t14.4\t16.4\t18587\t89521\t0.5284\t33619\tObama\t33619\t0.041684197\t33619.0\n3179\t-82.518624\t28.145840000000003\tCheval CDP\tFL\tFlorida\tHillsborough County\t10430\t36.6\t46.7\t8.9\t34684\t254110\t0.5284\t33549\tObama\t33549\t0.022113126\t33549.0\n3180\t-82.321376\t27.711746999999995\tWimauma CDP\tFL\tFlorida\tHillsborough County\t5700\t24.9\t3.2\t16.9\t11134\t94182\t0.5284\t33598\tObama\t33598\t0.012084834\t33598.0\n3181\t-82.61110699999999\t28.059690999999997\tWestchase CDP\tFL\tFlorida\tHillsborough County\t22547\t36.3\t47.6\t7.5\t46105\t234568\t0.5284\t33626\tObama\t33626\t0.04780294\t33626.0\n3182\t-82.428598\t27.7136\tRuskin CDP\tFL\tFlorida\tHillsborough County\t14740\t37.9\t14.8\t11.6\t17593\t92289\t0.5284\t33570\tObama\t33570\t0.031250957\t33570.0\n3183\t-82.290683\t27.931047999999997\tBrandon CDP\tFL\tFlorida\tHillsborough County\t101532\t35.1\t30.7\t10.6\t27323\t136379\t0.5284\t33511\tObama\t33511\t0.2152627\t33511.0\n3184\t-82.452449\t28.140258000000003\tLutz CDP\tFL\tFlorida\tHillsborough County\t18679\t42.0\t39.1\t13.1\t31763\t165449\t0.5284\t33549\tObama\t33549\t0.039602214\t33549.0\n3185\t-82.260402\t27.878054\tBloomingdale CDP\tFL\tFlorida\tHillsborough County\t22127\t37.8\t43.0\t10.1\t34465\t173583\t0.5284\t33594\tObama\t33594\t0.046912478\t33594.0\n3186\t-82.306962\t27.99135\tMango CDP\tFL\tFlorida\tHillsborough County\t11136\t33.8\t9.6\t13.7\t19730\t85795\t0.5284\t33584\tObama\t33584\t0.02360995\t33584.0\n3187\t-82.340855\t28.158141999999998\tPebble Creek CDP\tFL\tFlorida\tHillsborough County\t7857\t35.9\t53.7\t6.9\t36715\t184534\t0.5284\t33647\tObama\t33647\t0.01665799\t33647.0\n3188\t-85.64275500000001\t30.982003999999996\tEsto town\tFL\tFlorida\tHolmes County\t395\t41.6\t11.3\t10.3\t13558\t79000\t0.1528\t32440\tObama\t32440\t0.000837458\t32440.0\n3189\t-85.62205300000001\t30.980476\tNoma town\tFL\tFlorida\tHolmes County\t236\t41.6\t11.0\t10.5\t13580\t77857\t0.1528\t32440\tObama\t32440\t0.000500355\t32440.0\n3190\t-85.846521\t30.769669\tWestville town\tFL\tFlorida\tHolmes County\t205\t40.5\t10.1\t10.2\t14636\t75000\t0.1528\t32427\tObama\t32427\t0.00043463\t32427.0\n3191\t-85.937907\t30.723645\tPonce de Leon town\tFL\tFlorida\tHolmes County\t446\t45.5\t7.2\t9.2\t14822\t83000\t0.1528\t32455\tObama\t32455\t0.000945585\t32455.0\n3192\t-85.68396800000001\t30.785265000000003\tBonifay city\tFL\tFlorida\tHolmes County\t2599\t36.8\t14.7\t13.7\t17643\t101804\t0.1528\t32425\tObama\t32425\t0.00551026\t32425.0\n3193\t-80.48574599999999\t27.637806\tWest Vero Corridor CDP\tFL\tFlorida\tIndian River County\t8756\t70.6\t23.5\t23.6\t29078\t70201\t0.3847\t32966\tObama\t32966\t0.018564001\t32966.0\n3194\t-80.38000500000001\t27.70853\tIndian River Shores town\tFL\tFlorida\tIndian River County\t3593\t69.3\t59.9\t9.8\t95845\t666543\t0.3847\t32963\tObama\t32963\t0.007617685999999999\t32963.0\n3195\t-80.410782\t27.673869\tGifford CDP\tFL\tFlorida\tIndian River County\t8970\t43.3\t22.1\t27.4\t25626\t161161\t0.3847\t32960\tObama\t32960\t0.019017713000000002\t32960.0\n3196\t-80.33580500000001\t27.588627000000002\tSouth Beach CDP\tFL\tFlorida\tIndian River County\t3490\t63.6\t65.0\t9.9\t89618\t541139\t0.3847\t32962\tObama\t32962\t0.0073993109999999996\t32962.0\n3197\t-80.399203\t27.757035\tWabasso Beach CDP\tFL\tFlorida\tIndian River County\t1824\t64.9\t56.8\t11.4\t72347\t505482\t0.3847\t32970\tObama\t32970\t0.003867147\t32970.0\n3198\t-80.574794\t27.756727\tFellsmere city\tFL\tFlorida\tIndian River County\t5176\t30.8\t7.5\t14.2\t14885\t101260\t0.3847\t32948\tObama\t32948\t0.010973878000000001\t32948.0\n3199\t-80.411547\t27.772\tOrchid town\tFL\tFlorida\tIndian River County\t539\t59.0\t66.8\t10.5\t60642\t546875\t0.3847\t32970\tObama\t32970\t0.001142759\t32970.0\n3200\t-80.409476\t27.646209999999996\tVero Beach city\tFL\tFlorida\tIndian River County\t18345\t51.6\t38.1\t11.9\t37070\t183333\t0.3847\t32960\tObama\t32960\t0.038894085\t32960.0\n3201\t-80.415438\t27.616383000000003\tVero Beach South CDP\tFL\tFlorida\tIndian River County\t23223\t46.9\t28.1\t12.2\t26949\t138064\t0.3847\t32960\tObama\t32960\t0.049236159\t32960.0\n3202\t-80.426948\t27.808889\tNorth Beach CDP\tFL\tFlorida\tIndian River County\t895\t59.1\t66.8\t10.1\t60637\t545455\t0.3847\t32958\tObama\t32958\t0.001897531\t32958.0\n3203\t-80.425317\t27.711921999999998\tWinter Beach CDP\tFL\tFlorida\tIndian River County\t1544\t47.1\t29.9\t10.1\t32423\t227667\t0.3847\t32970\tObama\t32970\t0.003273506\t32970.0\n3204\t-80.492182\t27.833284000000003\tRoseland CDP\tFL\tFlorida\tIndian River County\t2181\t56.4\t16.3\t14.5\t25845\t111563\t0.3847\t32958\tObama\t32958\t0.004624039\t32958.0\n3205\t-80.38950899999999\t27.580271999999997\tFlorida Ridge CDP\tFL\tFlorida\tIndian River County\t20416\t44.1\t23.7\t11.1\t24828\t108344\t0.3847\t32962\tObama\t32962\t0.043284908\t32962.0\n3206\t-80.481555\t27.787846999999996\tSebastian city\tFL\tFlorida\tIndian River County\t21404\t51.6\t19.8\t13.5\t26372\t142318\t0.3847\t32958\tObama\t32958\t0.045379613\t32958.0\n3207\t-80.436162\t27.747557\tWabasso CDP\tFL\tFlorida\tIndian River County\t1024\t52.1\t25.3\t13.8\t29016\t116216\t0.3847\t32970\tObama\t32970\t0.00217103\t32970.0\n3208\t-85.410616\t30.892834999999998\tJacob City\tFL\tFlorida\tJackson County\t311\t41.9\t12.3\t10.1\t15643\t98333\t0.3506\t32426\tObama\t32426\t0.0006593660000000001\t32426.0\n3209\t-85.16150999999999\t30.958690999999998\tMalone town\tFL\tFlorida\tJackson County\t2253\t37.5\t9.2\t9.1\t16063\t120000\t0.3506\t32445\tObama\t32445\t0.00477669\t32445.0\n3210\t-85.016993\t30.715606\tGrand Ridge town\tFL\tFlorida\tJackson County\t873\t40.7\t10.5\t6.8\t18728\t108537\t0.3506\t32442\tObama\t32442\t0.001850888\t32442.0\n3211\t-85.241457\t30.774562\tMarianna city\tFL\tFlorida\tJackson County\t6382\t36.4\t27.3\t12.3\t17401\t108588\t0.3506\t32447\tObama\t32447\t0.013530773999999999\t32447.0\n3212\t-85.396535\t30.69745\tAlford town\tFL\tFlorida\tJackson County\t509\t39.3\t3.6\t10.1\t15315\t91500\t0.3506\t32420\tObama\t32420\t0.001079154\t32420.0\n3213\t-85.161138\t30.872696\tGreenwood town\tFL\tFlorida\tJackson County\t827\t38.4\t14.3\t7.1\t17040\t110677\t0.3506\t32443\tObama\t32443\t0.0017533610000000002\t32443.0\n3214\t-85.39760600000001\t30.951139\tCampbellton town\tFL\tFlorida\tJackson County\t239\t39.8\t12.2\t11.3\t12347\t100000\t0.3506\t32426\tObama\t32426\t0.000506715\t32426.0\n3215\t-85.117979\t30.928057\tBascom town\tFL\tFlorida\tJackson County\t115\t42.9\t6.1\t3.7\t18120\t98333\t0.3506\t32445\tObama\t32445\t0.00024381700000000001\t32445.0\n3216\t-85.512429\t30.961073\tGraceville city\tFL\tFlorida\tJackson County\t2488\t38.8\t24.0\t9.5\t17864\t105288\t0.3506\t32440\tObama\t32440\t0.005274924\t32440.0\n3217\t-84.924756\t30.708578999999997\tSneads town\tFL\tFlorida\tJackson County\t2217\t37.3\t15.2\t9.3\t18343\t95100\t0.3506\t32460\tObama\t32460\t0.004700364\t32460.0\n3218\t-85.374892\t30.798699\tCottondale town\tFL\tFlorida\tJackson County\t958\t38.9\t12.8\t9.0\t15548\t102557\t0.3506\t32431\tObama\t32431\t0.0020311\t32431.0\n3219\t-83.870768\t30.541887\tMonticello city\tFL\tFlorida\tJefferson County\t2965\t40.0\t22.7\t9.9\t19724\t94274\t0.5053\t32344\tObama\t32344\t0.006286234\t32344.0\n3220\t-83.176385\t30.051190000000002\tMayo town\tFL\tFlorida\tLafayette County\t1113\t37.3\t11.3\t8.1\t16072\t100255\t0.2021\t32066\tObama\t32066\t0.0023597229999999998\t32066.0\n3221\t-81.910675\t28.856697999999998\tFruitland Park city\tFL\tFlorida\tLake County\t3902\t41.2\t12.5\t10.5\t21721\t97537\t0.4098\t34731\tObama\t34731\t0.008272811\t34731.0\n3222\t-81.541076\t28.984921000000003\tPaisley CDP\tFL\tFlorida\tLake County\t850\t47.0\t7.6\t11.4\t19655\t93333\t0.4098\t327HH\tObama\t327HH\t0.001802124\t0.0\n3223\t-81.848391\t28.562234999999998\tGroveland city\tFL\tFlorida\tLake County\t3301\t43.9\t18.2\t12.6\t20467\t96339\t0.4098\t34736\tObama\t34736\t0.006998603000000001\t34736.0\n3224\t-81.490592\t29.007203999999998\tLake Kathryn CDP\tFL\tFlorida\tLake County\t1085\t43.6\t5.5\t12.3\t14461\t64355\t0.4098\t32767\tObama\t32767\t0.002300359\t32767.0\n3225\t-81.534829\t28.80193\tMount Plymouth CDP\tFL\tFlorida\tLake County\t4738\t41.4\t15.5\t13.7\t22715\t114246\t0.4098\t32776\tObama\t32776\t0.010045253\t32776.0\n3226\t-81.740377\t28.539913000000002\tClermont city\tFL\tFlorida\tLake County\t26220\t37.6\t27.1\t9.1\t24841\t162040\t0.4098\t34711\tObama\t34711\t0.055590237\t34711.0\n3227\t-81.64755799999999\t28.968232\tAltoona CDP\tFL\tFlorida\tLake County\t101\t42.9\t11.4\t12.2\t19025\t112500\t0.4098\t32784\tObama\t32784\t0.000214135\t32784.0\n3228\t-81.430892\t28.939020000000003\tPine Lakes CDP\tFL\tFlorida\tLake County\t898\t43.8\t13.2\t10.6\t17213\t71607\t0.4098\t32767\tObama\t32767\t0.001903891\t32767.0\n3229\t-81.942863\t28.92732\tLady Lake town\tFL\tFlorida\tLake County\t14227\t70.1\t14.8\t16.4\t24418\t97204\t0.4098\t32159\tObama\t32159\t0.030163322000000003\t32159.0\n3230\t-81.889051\t28.578078\tMascotte city\tFL\tFlorida\tLake County\t4947\t34.9\t11.3\t12.9\t17370\t96111\t0.4098\t34753\tObama\t34753\t0.010488363999999998\t34753.0\n3231\t-81.781453\t28.882689000000003\tLisbon CDP\tFL\tFlorida\tLake County\t331\t53.4\t17.2\t9.9\t19338\t89167\t0.4098\t34788\tObama\t34788\t0.0007017680000000001\t34788.0\n3232\t-81.70150699999999\t28.621586999999998\tFerndale CDP\tFL\tFlorida\tLake County\t291\t42.4\t22.7\t13.2\t26829\t150000\t0.4098\t34756\tObama\t34756\t0.000616963\t34756.0\n3233\t-81.731363\t28.806259999999998\tTavares city\tFL\tFlorida\tLake County\t12970\t57.5\t17.3\t19.5\t25247\t84952\t0.4098\t32778\tObama\t32778\t0.027498297999999997\t32778.0\n3234\t-81.820208\t28.750844\tYalaha CDP\tFL\tFlorida\tLake County\t1314\t60.8\t20.6\t11.0\t22216\t156250\t0.4098\t34797\tObama\t34797\t0.002785872\t34797.0\n3235\t-81.75445699999999\t28.58432\tMinneola city\tFL\tFlorida\tLake County\t10316\t34.0\t28.8\t8.4\t25538\t153724\t0.4098\t34711\tObama\t34711\t0.02187143\t34711.0\n3236\t-81.678554\t28.596844\tMontverde town\tFL\tFlorida\tLake County\t1115\t42.9\t23.1\t13.8\t27132\t145089\t0.4098\t34756\tObama\t34756\t0.0023639629999999997\t34756.0\n3237\t-81.42363\t29.000912\tLake Mack-Forest Hills CDP\tFL\tFlorida\tLake County\t1153\t41.6\t1.9\t14.8\t13220\t48800\t0.4098\t32767\tObama\t32767\t0.002444529\t32767.0\n3238\t-81.896249\t28.745928000000003\tOkahumpka CDP\tFL\tFlorida\tLake County\t262\t71.0\t24.0\t18.7\t29705\t124038\t0.4098\t34762\tObama\t34762\t0.000555478\t34762.0\n3239\t-81.735637\t28.710713000000002\tAstatula town\tFL\tFlorida\tLake County\t1570\t43.4\t9.2\t13.4\t18463\t91087\t0.4098\t34705\tObama\t34705\t0.00332863\t34705.0\n3240\t-81.64204699999999\t28.807578000000003\tMount Dora city\tFL\tFlorida\tLake County\t11088\t48.1\t27.8\t14.7\t26726\t135543\t0.4098\t32757\tObama\t32757\t0.023508183\t32757.0\n3241\t-81.53549699999999\t29.163144\tAstor CDP\tFL\tFlorida\tLake County\t1680\t55.1\t14.0\t9.0\t20163\t83125\t0.4098\t32102\tObama\t32102\t0.0035618459999999996\t32102.0\n3242\t-81.56287900000001\t28.808544\tSorrento CDP\tFL\tFlorida\tLake County\t845\t37.7\t8.8\t21.1\t18066\t86136\t0.4098\t32776\tObama\t32776\t0.0017915239999999999\t32776.0\n3243\t-81.645972\t28.996679999999998\tPittman CDP\tFL\tFlorida\tLake County\t222\t42.7\t8.4\t11.2\t17763\t93125\t0.4098\t32702\tObama\t32702\t0.000470672\t32702.0\n3244\t-81.799523\t28.842197\tSilver Lake CDP\tFL\tFlorida\tLake County\t2100\t50.1\t34.1\t11.5\t34055\t204217\t0.4098\t34788\tObama\t34788\t0.004452307\t34788.0\n3245\t-81.664958\t28.929213\tUmatilla city\tFL\tFlorida\tLake County\t3189\t42.6\t14.5\t9.9\t20124\t94263\t0.4098\t32784\tObama\t32784\t0.0067611469999999995\t32784.0\n3246\t-81.89675600000001\t28.788588\tLeesburg city\tFL\tFlorida\tLake County\t19128\t45.7\t17.3\t16.3\t20174\t88912\t0.4098\t34748\tObama\t34748\t0.040554159\t34748.0\n3247\t-81.683275\t28.854311\tEustis city\tFL\tFlorida\tLake County\t17383\t46.3\t22.0\t17.7\t22606\t99915\t0.4098\t32726\tObama\t32726\t0.036854503999999996\t32726.0\n3248\t-81.776669\t28.715946999999996\tHowey-in-the-Hills town\tFL\tFlorida\tLake County\t1363\t49.5\t32.5\t13.5\t29165\t169521\t0.4098\t34737\tObama\t34737\t0.0028897590000000004\t34737.0\n3249\t-81.73832800000001\t26.713359999999998\tFort Myers Shores CDP\tFL\tFlorida\tLee County\t6144\t40.2\t16.0\t15.1\t21590\t99509\t0.4139\t33905\tObama\t33905\t0.013026178999999999\t33905.0\n3250\t-82.05023100000001\t26.764146000000004\tBurnt Store Marina CDP\tFL\tFlorida\tLee County\t1443\t68.7\t45.3\t17.2\t55933\t254487\t0.4139\t33955\tObama\t33955\t0.003059371\t33955.0\n3251\t-81.911215\t26.645308\tLochmoor Waterway Estates CDP\tFL\tFlorida\tLee County\t4547\t50.4\t29.2\t13.0\t32541\t139495\t0.4139\t33990\tObama\t33990\t0.009640305\t33990.0\n3252\t-81.785387\t26.352459000000003\tBonita Springs city\tFL\tFlorida\tLee County\t42104\t54.8\t28.6\t12.6\t37442\t159804\t0.4139\t34135\tObama\t34135\t0.089266642\t34135.0\n3253\t-81.890304\t26.573403999999996\tWhiskey Creek CDP\tFL\tFlorida\tLee County\t5441\t58.1\t41.0\t10.4\t35837\t162266\t0.4139\t33919\tObama\t33919\t0.011535716000000001\t33919.0\n3254\t-82.190834\t26.520560999999997\tCaptiva CDP\tFL\tFlorida\tLee County\t473\t63.7\t38.6\t6.5\t74002\t730769\t0.4139\t33924\tObama\t33924\t0.001002829\t33924.0\n3255\t-81.86777\t26.550599\tVillas CDP\tFL\tFlorida\tLee County\t12663\t46.9\t32.1\t11.8\t30443\t112625\t0.4139\t33907\tObama\t33907\t0.026847412999999997\t33907.0\n3256\t-81.796265\t26.4742\tThree Oaks CDP\tFL\tFlorida\tLee County\t4378\t35.2\t32.3\t7.7\t29302\t172571\t0.4139\t33912\tObama\t33912\t0.009282001\t33912.0\n3257\t-81.87729499999999\t26.572923\tPine Manor CDP\tFL\tFlorida\tLee County\t3668\t27.9\t10.0\t19.0\t12417\t71250\t0.4139\t33907\tObama\t33907\t0.007776697\t33907.0\n3258\t-81.929323\t26.516046999999997\tHarlem Heights CDP\tFL\tFlorida\tLee County\t2184\t54.4\t22.0\t13.0\t16639\t83676\t0.4139\t33908\tObama\t33908\t0.0046304\t33908.0\n3259\t-81.82673199999999\t26.616219\tFort Myers city\tFL\tFlorida\tLee County\t59766\t35.4\t25.7\t16.4\t23209\t117044\t0.4139\t33916\tObama\t33916\t0.126712667\t33916.0\n3260\t-81.91029499999999\t26.559997999999997\tMcGregor CDP\tFL\tFlorida\tLee County\t7850\t57.3\t53.9\t9.2\t44117\t202688\t0.4139\t33919\tObama\t33919\t0.016643149\t33919.0\n3261\t-82.062655\t26.636418\tMatlacha Isles-Matlacha Shores CDP\tFL\tFlorida\tLee County\t284\t57.0\t32.6\t0.8\t28921\t196667\t0.4139\t33991\tObama\t33991\t0.000602122\t33991.0\n3262\t-82.09780400000001\t26.551917\tSt. James City CDP\tFL\tFlorida\tLee County\t4504\t66.6\t21.1\t21.7\t31417\t122195\t0.4139\t33956\tObama\t33956\t0.009549139\t33956.0\n3263\t-81.626813\t26.719023999999997\tAlva CDP\tFL\tFlorida\tLee County\t2754\t50.4\t20.2\t21.1\t27029\t132908\t0.4139\t33920\tObama\t33920\t0.0058388830000000004\t33920.0\n3264\t-81.63834399999999\t26.611762\tLehigh Acres CDP\tFL\tFlorida\tLee County\t71138\t37.8\t16.4\t11.1\t21811\t102717\t0.4139\t33936\tObama\t33936\t0.150822971\t33936.0\n3265\t-81.74056\t26.661106\tBuckingham CDP\tFL\tFlorida\tLee County\t4672\t43.4\t16.5\t13.2\t25684\t158838\t0.4139\t33905\tObama\t33905\t0.009905324\t33905.0\n3266\t-81.95626700000001\t26.511536\tIona CDP\tFL\tFlorida\tLee County\t14568\t62.4\t28.9\t12.9\t38046\t121806\t0.4139\t33908\tObama\t33908\t0.030886292000000003\t33908.0\n3267\t-81.91754399999999\t26.435230999999998\tFort Myers Beach town\tFL\tFlorida\tLee County\t7891\t63.1\t31.4\t10.1\t40434\t252078\t0.4139\t33931\tObama\t33931\t0.016730075\t33931.0\n3268\t-82.147927\t26.664381\tPineland CDP\tFL\tFlorida\tLee County\t480\t54.1\t28.1\t10.1\t24578\t137500\t0.4139\t33922\tObama\t33922\t0.00101767\t33922.0\n3269\t-81.99878299999999\t26.504184000000002\tPunta Rassa CDP\tFL\tFlorida\tLee County\t1809\t77.3\t57.4\t17.8\t45925\t299342\t0.4139\t33908\tObama\t33908\t0.003835345\t33908.0\n3270\t-81.861509\t26.5782\tPage Park CDP\tFL\tFlorida\tLee County\t519\t45.1\t2.3\t16.1\t16019\t70000\t0.4139\t33907\tObama\t33907\t0.001100356\t33907.0\n3271\t-82.101699\t26.451509\tSanibel city\tFL\tFlorida\tLee County\t7667\t63.6\t58.0\t12.6\t61545\t550306\t0.4139\t33957\tObama\t33957\t0.016255162\t33957.0\n3272\t-82.138837\t26.676890000000004\tBokeelia CDP\tFL\tFlorida\tLee County\t2044\t59.7\t28.4\t8.5\t29001\t151953\t0.4139\t33922\tObama\t33922\t0.004333579000000001\t33922.0\n3273\t-81.90000400000001\t26.539142\tCypress Lake CDP\tFL\tFlorida\tLee County\t12573\t60.1\t30.8\t12.7\t28685\t114007\t0.4139\t33919\tObama\t33919\t0.0266566\t33919.0\n3274\t-81.80261899999999\t26.422612\tEstero CDP\tFL\tFlorida\tLee County\t22691\t63.1\t35.1\t12.3\t37945\t170773\t0.4139\t33928\tObama\t33928\t0.048108240999999996\t33928.0\n3275\t-82.073449\t26.632088\tMatlacha CDP\tFL\tFlorida\tLee County\t858\t62.1\t20.9\t11.6\t33643\t157432\t0.4139\t33991\tObama\t33991\t0.0018190860000000001\t33991.0\n3276\t-81.86847399999999\t26.712266999999997\tSuncoast Estates CDP\tFL\tFlorida\tLee County\t4877\t38.2\t6.3\t17.1\t15415\t45891\t0.4139\t33917\tObama\t33917\t0.010339954\t33917.0\n3277\t-81.745151\t26.578701000000002\tGateway CDP\tFL\tFlorida\tLee County\t7056\t43.5\t53.4\t7.6\t47564\t233903\t0.4139\t33971\tObama\t33971\t0.014959753000000001\t33971.0\n3278\t-81.817131\t26.674373\tTice CDP\tFL\tFlorida\tLee County\t4678\t30.8\t7.0\t23.2\t13522\t74450\t0.4139\t33916\tObama\t33916\t0.009918045\t33916.0\n3279\t-81.84135\t26.634161\tEast Dunbar CDP\tFL\tFlorida\tLee County\t2016\t33.6\t10.0\t26.9\t11760\t50417\t0.4139\t33916\tObama\t33916\t0.004274215\t33916.0\n3280\t-81.695059\t26.711113\tOlga CDP\tFL\tFlorida\tLee County\t1836\t38.3\t19.1\t8.8\t27055\t107534\t0.4139\t33905\tObama\t33905\t0.003892589\t33905.0\n3281\t-81.580671\t26.705592\tCharleston Park CDP\tFL\tFlorida\tLee County\t527\t25.8\t12.2\t16.9\t11912\t64667\t0.4139\t33920\tObama\t33920\t0.001117317\t33920.0\n3282\t-81.84951\t26.72539\tNorth Fort Myers CDP\tFL\tFlorida\tLee County\t43167\t62.1\t17.7\t15.4\t24819\t71119\t0.4139\t33917\tObama\t33917\t0.09152035800000001\t33917.0\n3283\t-81.819363\t26.476512\tSan Carlos Park CDP\tFL\tFlorida\tLee County\t18132\t34.8\t17.3\t12.4\t24468\t128880\t0.4139\t33912\tObama\t33912\t0.038442494\t33912.0\n3284\t-81.894587\t26.689292\tPalmona Park CDP\tFL\tFlorida\tLee County\t1321\t38.2\t3.0\t9.7\t16864\t51250\t0.4139\t33903\tObama\t33903\t0.002800713\t33903.0\n3285\t-81.993721\t26.641034\tCape Coral city\tFL\tFlorida\tLee County\t163095\t43.4\t21.4\t12.4\t26031\t135665\t0.4139\t33991\tObama\t33991\t0.34578527\t33991.0\n3286\t-82.12611600000001\t26.635293\tPine Island Center CDP\tFL\tFlorida\tLee County\t2034\t50.2\t18.7\t10.7\t21991\t101766\t0.4139\t33922\tObama\t33922\t0.0043123779999999995\t33922.0\n3287\t-84.25925500000001\t30.311303000000002\tWoodville CDP\tFL\tFlorida\tLeon County\t3241\t37.1\t22.1\t10.7\t21483\t85333\t0.6126\t32399\tObama\t32399\t0.006871394\t32399.0\n3288\t-84.254312\t30.455605\tTallahassee city\tFL\tFlorida\tLeon County\t172308\t28.0\t45.7\t11.3\t24502\t143771\t0.6126\t32301\tObama\t32301\t0.365318178\t32301.0\n3289\t-82.861216\t29.480388\tChiefland city\tFL\tFlorida\tLevy County\t2385\t39.1\t13.1\t18.2\t12760\t97041\t0.3326\t32626\tObama\t32626\t0.0050565490000000005\t32626.0\n3290\t-82.590373\t29.459321000000003\tEast Bronson CDP\tFL\tFlorida\tLevy County\t1258\t35.2\t9.1\t20.8\t16527\t82895\t0.3326\t32621\tObama\t32621\t0.002667144\t32621.0\n3291\t-82.63947900000001\t29.448859999999996\tBronson town\tFL\tFlorida\tLevy County\t1131\t35.6\t9.1\t22.1\t15794\t88182\t0.3326\t32621\tObama\t32621\t0.002397886\t32621.0\n3292\t-82.728424\t29.035214\tYankeetown town\tFL\tFlorida\tLevy County\t656\t58.0\t14.6\t14.5\t19725\t113971\t0.3326\t34498\tObama\t34498\t0.001390816\t34498.0\n3293\t-82.535718\t29.333724\tWilliston Highlands CDP\tFL\tFlorida\tLevy County\t2173\t46.7\t10.9\t17.2\t17888\t115082\t0.3326\t32696\tObama\t32696\t0.004607078\t32696.0\n3294\t-82.886291\t29.543022999999998\tAndrews CDP\tFL\tFlorida\tLevy County\t792\t43.7\t9.7\t13.2\t17284\t98235\t0.3326\t32693\tObama\t32693\t0.001679156\t32693.0\n3295\t-82.915696\t29.513423\tManattee Road CDP\tFL\tFlorida\tLevy County\t2154\t51.3\t11.4\t13.7\t15803\t90392\t0.3326\t32626\tObama\t32626\t0.004566795\t32626.0\n3296\t-83.042311\t29.143078000000003\tCedar Key city\tFL\tFlorida\tLevy County\t937\t50.5\t27.9\t12.7\t21983\t180405\t0.3326\t32625\tObama\t32625\t0.0019865770000000002\t32625.0\n3297\t-82.459193\t29.370955\tWilliston city\tFL\tFlorida\tLevy County\t2677\t39.7\t14.9\t16.4\t18180\t106588\t0.3326\t32696\tObama\t32696\t0.005675632\t32696.0\n3298\t-82.92437\t29.596062\tFanning Springs city\tFL\tFlorida\tLevy County\t926\t39.3\t9.6\t12.5\t17025\t99286\t0.3326\t32680\tObama\t32680\t0.001963256\t32680.0\n3299\t-82.773657\t29.324001000000003\tOtter Creek town\tFL\tFlorida\tLevy County\t145\t56.5\t12.9\t11.3\t15634\t71667\t0.3326\t32683\tObama\t32683\t0.000307421\t32683.0\n3300\t-82.417326\t29.388957\tEast Williston CDP\tFL\tFlorida\tLevy County\t1046\t35.1\t13.1\t11.6\t15092\t93125\t0.3326\t32696\tObama\t32696\t0.002217673\t32696.0\n3301\t-82.659235\t29.032567999999998\tInglis town\tFL\tFlorida\tLevy County\t1704\t52.3\t12.9\t19.4\t18926\t89512\t0.3326\t34449\tObama\t34449\t0.0036127290000000003\t34449.0\n3302\t-84.977305\t30.425559000000003\tBristol city\tFL\tFlorida\tLiberty County\t976\t37.1\t14.5\t7.6\t17812\t99583\t0.2868\t32321\tObama\t32321\t0.002069263\t32321.0\n3303\t-83.635276\t30.466814000000003\tGreenville town\tFL\tFlorida\tMadison County\t839\t34.2\t14.3\t14.1\t13757\t57586\t0.4792\t32331\tObama\t32331\t0.0017788029999999998\t32331.0\n3304\t-83.301575\t30.419834\tLee town\tFL\tFlorida\tMadison County\t369\t43.0\t10.9\t7.1\t16263\t63000\t0.4792\t32059\tObama\t32059\t0.000782334\t32059.0\n3305\t-83.414237\t30.468840000000004\tMadison city\tFL\tFlorida\tMadison County\t3227\t34.8\t15.6\t17.7\t13433\t91667\t0.4792\t32340\tObama\t32340\t0.006841712\t32340.0\n3306\t-82.558188\t27.540719\tMemphis CDP\tFL\tFlorida\tManatee County\t7433\t33.6\t17.5\t16.2\t17090\t94408\t0.4333\t34221\tObama\t34221\t0.015759048\t34221.0\n3307\t-82.579412\t27.434515\tBayshore Gardens CDP\tFL\tFlorida\tManatee County\t17001\t48.9\t16.0\t16.9\t22414\t79986\t0.4333\t34207\tObama\t34207\t0.036044608\t34207.0\n3308\t-82.668153\t27.465669000000002\tCortez CDP\tFL\tFlorida\tManatee County\t5355\t62.7\t27.2\t15.6\t27579\t116263\t0.4333\t34215\tObama\t34215\t0.011353384\t34215.0\n3309\t-82.71513399999999\t27.510021000000002\tHolmes Beach city\tFL\tFlorida\tManatee County\t4929\t59.0\t35.0\t12.8\t34749\t252381\t0.4333\t34217\tObama\t34217\t0.010450201\t34217.0\n3310\t-82.565938\t27.411623\tWhitfield CDP\tFL\tFlorida\tManatee County\t2940\t46.3\t29.8\t9.3\t27322\t165194\t0.4333\t34207\tObama\t34207\t0.00623323\t34207.0\n3311\t-82.73274\t27.529144\tAnna Maria city\tFL\tFlorida\tManatee County\t2121\t61.4\t44.8\t10.7\t35955\t321515\t0.4333\t34216\tObama\t34216\t0.00449683\t34216.0\n3312\t-82.576984\t27.523258000000002\tPalmetto city\tFL\tFlorida\tManatee County\t13694\t38.2\t14.5\t14.2\t19634\t92061\t0.4333\t34221\tObama\t34221\t0.029033284\t34221.0\n3313\t-82.582169\t27.488339\tBradenton city\tFL\tFlorida\tManatee County\t50547\t45.4\t24.6\t14.9\t23049\t112496\t0.4333\t34205\tObama\t34205\t0.107167038\t34205.0\n3314\t-82.613223\t27.419857\tLongboat Key town\tFL\tFlorida\tManatee County\t7701\t70.1\t56.9\t8.4\t83709\t479751\t0.4333\t34228\tObama\t34228\t0.016327247\t34228.0\n3315\t-82.555212\t27.4705\tWest Samoset CDP\tFL\tFlorida\tManatee County\t6003\t27.6\t8.5\t19.7\t14868\t69958\t0.4333\t34208\tObama\t34208\t0.012727239\t34208.0\n3316\t-82.582115\t27.461112\tSouth Bradenton CDP\tFL\tFlorida\tManatee County\t21659\t48.4\t16.7\t14.8\t20514\t68260\t0.4333\t34207\tObama\t34207\t0.04592025\t34207.0\n3317\t-82.54234\t27.477393\tSamoset CDP\tFL\tFlorida\tManatee County\t3612\t29.2\t5.6\t15.1\t13742\t86702\t0.4333\t34208\tObama\t34208\t0.007657969000000001\t34208.0\n3318\t-82.527683\t27.52598\tEllenton CDP\tFL\tFlorida\tManatee County\t3488\t48.7\t15.1\t12.8\t24017\t88516\t0.4333\t34222\tObama\t34222\t0.00739507\t34222.0\n3319\t-82.69747199999999\t27.465213000000002\tBradenton Beach city\tFL\tFlorida\tManatee County\t1736\t55.5\t30.4\t10.1\t26812\t133036\t0.4333\t34215\tObama\t34215\t0.0036805740000000003\t34215.0\n3320\t-82.613991\t27.501558000000003\tWest Bradenton CDP\tFL\tFlorida\tManatee County\t4361\t45.7\t35.2\t10.7\t29045\t145313\t0.4333\t34209\tObama\t34209\t0.009245958\t34209.0\n3321\t-82.436849\t29.055383000000003\tDunnellon city\tFL\tFlorida\tMarion County\t2097\t59.6\t18.8\t21.1\t25279\t114219\t0.4141\t34434\tObama\t34434\t0.0044459470000000004\t34434.0\n3322\t-82.056242\t29.062403999999997\tBelleview city\tFL\tFlorida\tMarion County\t3807\t46.1\t12.0\t18.9\t18863\t90434\t0.4141\t34420\tObama\t34420\t0.008071397\t34420.0\n3323\t-82.197524\t29.368808\tReddick town\tFL\tFlorida\tMarion County\t735\t38.4\t14.8\t16.7\t19018\t82500\t0.4141\t32686\tObama\t32686\t0.0015583079999999998\t32686.0\n3324\t-82.22094399999999\t29.449298\tMcIntosh town\tFL\tFlorida\tMarion County\t582\t47.3\t22.4\t13.9\t20611\t96875\t0.4141\t32664\tObama\t32664\t0.001233925\t32664.0\n3325\t-82.004878\t29.103181\tSilver Springs Shores CDP\tFL\tFlorida\tMarion County\t7135\t43.2\t12.3\t15.8\t18691\t83406\t0.4141\t34472\tObama\t34472\t0.015127244\t34472.0\n3326\t-82.14556\t29.181452\tOcala city\tFL\tFlorida\tMarion County\t53509\t39.6\t23.1\t17.9\t22215\t110373\t0.4141\t34474\tObama\t34474\t0.113446911\t34474.0\n3327\t-80.287764\t27.171172\tPalm City CDP\tFL\tFlorida\tMartin County\t22909\t51.5\t41.3\t10.4\t42210\t191959\t0.3817\t34990\tObama\t34990\t0.048570432999999996\t34990.0\n3328\t-80.200526\t27.198646999999998\tSewall's Point town\tFL\tFlorida\tMartin County\t2200\t50.0\t59.6\t12.1\t57868\t352475\t0.3817\t34996\tObama\t34996\t0.004664322\t34996.0\n3329\t-80.139296\t27.073264\tHobe Sound CDP\tFL\tFlorida\tMartin County\t12149\t53.2\t29.6\t13.6\t30230\t104963\t0.3817\t33455\tObama\t33455\t0.025757658\t33455.0\n3330\t-80.109184\t27.042972\tJupiter Island town\tFL\tFlorida\tMartin County\t605\t58.1\t41.0\t13.5\t70590\t333333\t0.3817\t33455\tObama\t33455\t0.0012826889999999998\t33455.0\n3331\t-80.244268\t27.243631\tJensen Beach CDP\tFL\tFlorida\tMartin County\t12155\t48.8\t27.8\t13.9\t28046\t98656\t0.3817\t34957\tObama\t34957\t0.025770379\t34957.0\n3332\t-80.190306\t27.144787\tPort Salerno CDP\tFL\tFlorida\tMartin County\t10937\t48.8\t27.8\t13.6\t32025\t112313\t0.3817\t34997\tObama\t34997\t0.023188041\t34997.0\n3333\t-80.241496\t27.217844\tRio CDP\tFL\tFlorida\tMartin County\t1026\t53.5\t42.4\t18.3\t30587\t97951\t0.3817\t34994\tObama\t34994\t0.00217527\t34994.0\n3334\t-80.23839100000001\t27.185198\tStuart city\tFL\tFlorida\tMartin County\t15549\t50.9\t26.4\t13.1\t26085\t76315\t0.3817\t34994\tObama\t34994\t0.032966156\t34994.0\n3335\t-80.46996700000001\t27.038457\tIndiantown CDP\tFL\tFlorida\tMartin County\t6251\t29.8\t10.6\t13.3\t12941\t80753\t0.3817\t34956\tObama\t34956\t0.013253035\t34956.0\n3336\t-80.226656\t27.24059\tOcean Breeze Park town\tFL\tFlorida\tMartin County\t462\t53.7\t15.0\t24.8\t20032\t27500\t0.3817\t34957\tObama\t34957\t0.000979508\t34957.0\n3337\t-80.272681\t27.224922999999997\tNorth River Shores CDP\tFL\tFlorida\tMartin County\t2893\t51.2\t31.2\t8.7\t30713\t105335\t0.3817\t34994\tObama\t34994\t0.006133583000000001\t34994.0\n3338\t-80.25881899999999\t25.966754\tLake Lucerne CDP\tFL\tFlorida\tMiami-Dade County\t9807\t29.3\t12.5\t19.2\t16229\t105318\t0.6165\t33056\tObama\t33056\t0.020792275\t33056.0\n3339\t-80.199955\t25.441729000000002\tIslandia city\tFL\tFlorida\tMiami-Dade County\t7\t17.5\t0.0\t0.0\t1395\t90000\t0.6165\t330XX\tObama\t330XX\t1.4800000000000002e-05\t0.0\n3340\t-80.16839\t25.955864000000002\tOjus CDP\tFL\tFlorida\tMiami-Dade County\t16643\t44.3\t37.0\t13.0\t26077\t79479\t0.6165\t33179\tObama\t33179\t0.035285596\t33179.0\n3341\t-80.226104\t25.784026\tMiami city\tFL\tFlorida\tMiami-Dade County\t394073\t39.5\t21.3\t19.1\t19126\t157078\t0.6165\t33125\tObama\t33125\t0.8354924340000001\t33125.0\n3342\t-80.304986\t25.746454\tCoral Terrace CDP\tFL\tFlorida\tMiami-Dade County\t24153\t43.0\t23.9\t15.0\t18805\t184222\t0.6165\t33155\tObama\t33155\t0.051207895\t33155.0\n3343\t-80.20886899999999\t25.947152\tNorland CDP\tFL\tFlorida\tMiami-Dade County\t22939\t31.9\t17.0\t16.3\t16494\t119231\t0.6165\t33169\tObama\t33169\t0.048634037000000005\t33169.0\n3344\t-80.29758100000001\t25.809473999999998\tVirginia Gardens village\tFL\tFlorida\tMiami-Dade County\t2296\t39.5\t27.8\t12.4\t22093\t172965\t0.6165\t33166\tObama\t33166\t0.004867855999999999\t33166.0\n3345\t-80.437067\t25.4936\tLeisure City CDP\tFL\tFlorida\tMiami-Dade County\t23140\t26.6\t11.3\t19.7\t12207\t104508\t0.6165\t33033\tObama\t33033\t0.049060187000000005\t33033.0\n3346\t-80.310071\t25.940756\tCountry Club CDP\tFL\tFlorida\tMiami-Dade County\t42034\t31.0\t29.1\t15.6\t19743\t141205\t0.6165\t33015\tObama\t33015\t0.08911823199999999\t33015.0\n3347\t-80.391141\t25.493674\tHomestead Base CDP\tFL\tFlorida\tMiami-Dade County\t464\t30.2\t10.0\t7.7\t14363\t0\t0.6165\t330XX\tObama\t330XX\t0.000983748\t0.0\n3348\t-80.347751\t25.878744\tHialeah Gardens city\tFL\tFlorida\tMiami-Dade County\t23299\t34.6\t18.1\t17.0\t18236\t134462\t0.6165\t33016\tObama\t33016\t0.04939729\t33016.0\n3349\t-80.125165\t25.878721\tSurfside town\tFL\tFlorida\tMiami-Dade County\t5943\t47.2\t47.4\t10.2\t46125\t250154\t0.6165\t33154\tObama\t33154\t0.01260003\t33154.0\n3350\t-80.397278\t25.539764\tPrinceton CDP\tFL\tFlorida\tMiami-Dade County\t20964\t28.1\t16.6\t16.8\t15834\t119715\t0.6165\t33032\tObama\t33032\t0.044446748\t33032.0\n3351\t-80.38624200000001\t25.588722\tSouth Miami Heights CDP\tFL\tFlorida\tMiami-Dade County\t35857\t32.7\t12.7\t17.8\t14810\t121740\t0.6165\t33177\tObama\t33177\t0.076022088\t33177.0\n3352\t-80.12093399999999\t25.965854\tGolden Beach town\tFL\tFlorida\tMiami-Dade County\t786\t41.6\t66.1\t6.4\t67839\t806667\t0.6165\t33180\tObama\t33180\t0.001666435\t33180.0\n3353\t-80.333893\t25.93499\tPalm Springs North CDP\tFL\tFlorida\tMiami-Dade County\t5295\t38.3\t21.2\t9.7\t23930\t187546\t0.6165\t33015\tObama\t33015\t0.011226175\t33015.0\n3354\t-80.125182\t25.893165\tBal Harbour village\tFL\tFlorida\tMiami-Dade County\t3391\t57.7\t54.2\t13.7\t61647\t538777\t0.6165\t33154\tObama\t33154\t0.007189416\t33154.0\n3355\t-80.13732900000001\t25.877848999999998\tIndian Creek village\tFL\tFlorida\tMiami-Dade County\t34\t50.0\t40.0\t0.0\t87807\t1000001\t0.6165\t33154\tObama\t33154\t7.209999999999999e-05\t33154.0\n3356\t-80.183014\t25.96332\tIves Estates CDP\tFL\tFlorida\tMiami-Dade County\t17642\t37.7\t30.4\t14.6\t21106\t103361\t0.6165\t33179\tObama\t33179\t0.037403622000000004\t33179.0\n3357\t-80.131436\t25.887309\tBay Harbor Islands town\tFL\tFlorida\tMiami-Dade County\t5001\t45.3\t42.0\t11.4\t30311\t149586\t0.6165\t33154\tObama\t33154\t0.010602852\t33154.0\n3358\t-80.255127\t25.899562\tOpa-locka city\tFL\tFlorida\tMiami-Dade County\t15338\t28.2\t8.4\t25.9\t11923\t94352\t0.6165\t33054\tObama\t33054\t0.032518805\t33054.0\n3359\t-80.42205799999999\t25.516404\tNaranja CDP\tFL\tFlorida\tMiami-Dade County\t6385\t25.0\t8.1\t29.2\t8532\t79778\t0.6165\t33032\tObama\t33032\t0.013537134\t33032.0\n3360\t-80.213368\t25.966228\tAndover CDP\tFL\tFlorida\tMiami-Dade County\t10598\t32.7\t24.3\t12.9\t19423\t107972\t0.6165\t33023\tObama\t33023\t0.022469311000000002\t33023.0\n3361\t-80.37298299999999\t25.765529\tSweetwater city\tFL\tFlorida\tMiami-Dade County\t13936\t37.5\t18.4\t17.4\t14124\t133362\t0.6165\t33174\tObama\t33174\t0.02954636\t33174.0\n3362\t-80.37176099999999\t25.723799\tWestwood Lakes CDP\tFL\tFlorida\tMiami-Dade County\t11656\t40.9\t18.6\t15.1\t19667\t176934\t0.6165\t33165\tObama\t33165\t0.024712426000000003\t33165.0\n3363\t-80.27131999999999\t25.704933999999998\tCoral Gables city\tFL\tFlorida\tMiami-Dade County\t43843\t40.5\t63.2\t9.7\t52669\t451961\t0.6165\t33146\tObama\t33146\t0.092953577\t33146.0\n3364\t-80.19551\t25.855579000000002\tEl Portal village\tFL\tFlorida\tMiami-Dade County\t2686\t38.6\t34.6\t17.2\t20592\t145940\t0.6165\t33138\tObama\t33138\t0.0056947130000000006\t33138.0\n3365\t-80.340055\t25.608514000000003\tEast Perrine CDP\tFL\tFlorida\tMiami-Dade County\t7481\t37.9\t39.8\t11.1\t31106\t241401\t0.6165\t33157\tObama\t33157\t0.015860815\t33157.0\n3366\t-80.44713399999999\t25.464623\tHomestead city\tFL\tFlorida\tMiami-Dade County\t48139\t30.7\t18.8\t16.8\t18176\t104529\t0.6165\t33035\tObama\t33035\t0.102061725\t33035.0\n3367\t-80.401474\t25.755731\tTamiami CDP\tFL\tFlorida\tMiami-Dade County\t54846\t38.8\t27.6\t12.1\t20845\t176267\t0.6165\t33184\tObama\t33184\t0.116281547\t33184.0\n3368\t-80.201054\t25.912554\tGolden Glades CDP\tFL\tFlorida\tMiami-Dade County\t33723\t30.9\t17.4\t19.4\t14981\t129835\t0.6165\t33168\tObama\t33168\t0.071497696\t33168.0\n3369\t-80.321823\t25.912322\tMiami Lakes CDP\tFL\tFlorida\tMiami-Dade County\t26618\t37.3\t42.0\t10.4\t32649\t230865\t0.6165\t33014\tObama\t33014\t0.056434055999999996\t33014.0\n3370\t-80.304326\t25.664967\tPinecrest village\tFL\tFlorida\tMiami-Dade County\t20755\t42.2\t66.7\t8.7\t58194\t583446\t0.6165\t33156\tObama\t33156\t0.044003638\t33156.0\n3371\t-80.36189499999999\t25.621079\tPalmetto Estates CDP\tFL\tFlorida\tMiami-Dade County\t13489\t33.6\t25.4\t15.4\t18939\t143942\t0.6165\t33157\tObama\t33157\t0.028598653999999998\t33157.0\n3372\t-80.353086\t25.706057\tSunset CDP\tFL\tFlorida\tMiami-Dade County\t16771\t40.3\t38.1\t10.5\t25982\t228674\t0.6165\t33173\tObama\t33173\t0.035556975\t33173.0\n3373\t-80.241625\t25.882468\tWestview CDP\tFL\tFlorida\tMiami-Dade County\t10303\t33.4\t11.9\t22.3\t14028\t106999\t0.6165\t33167\tObama\t33167\t0.021843868\t33167.0\n3374\t-80.26909\t25.920084\tOpa-locka North CDP\tFL\tFlorida\tMiami-Dade County\t7203\t27.0\t10.8\t22.6\t15300\t104551\t0.6165\t33054\tObama\t33054\t0.015271413999999999\t33054.0\n3375\t-80.165992\t25.930075\tNorth Miami Beach city\tFL\tFlorida\tMiami-Dade County\t41262\t35.6\t19.4\t17.5\t16714\t115664\t0.6165\t33162\tObama\t33162\t0.087481479\t33162.0\n3376\t-80.17236199999999\t25.901095\tNorth Miami city\tFL\tFlorida\tMiami-Dade County\t61929\t32.4\t19.2\t19.5\t17118\t114868\t0.6165\t33161\tObama\t33161\t0.13129854400000002\t33161.0\n3377\t-80.429699\t25.610485999999998\tRichmond West CDP\tFL\tFlorida\tMiami-Dade County\t33495\t31.5\t27.9\t12.6\t20902\t174908\t0.6165\t33177\tObama\t33177\t0.071014302\t33177.0\n3378\t-80.236346\t25.921191\tBunche Park CDP\tFL\tFlorida\tMiami-Dade County\t3824\t39.1\t12.6\t24.7\t14524\t90698\t0.6165\t33054\tObama\t33054\t0.00810744\t33054.0\n3379\t-80.356123\t25.805792\tDoral CDP\tFL\tFlorida\tMiami-Dade County\t36937\t33.8\t56.3\t9.7\t34047\t206805\t0.6165\t33172\tObama\t33172\t0.07831184599999999\t33172.0\n3380\t-80.236536\t25.857034\tWest Little River CDP\tFL\tFlorida\tMiami-Dade County\t32237\t35.3\t8.5\t22.2\t13662\t99793\t0.6165\t33147\tObama\t33147\t0.068347158\t33147.0\n3381\t-80.141429\t25.760997\tFisher Island CDP\tFL\tFlorida\tMiami-Dade County\t1056\t57.2\t38.9\t15.6\t36834\t500000\t0.6165\t33109\tObama\t33109\t0.002238875\t33109.0\n3382\t-80.181298\t25.881768\tBiscayne Park village\tFL\tFlorida\tMiami-Dade County\t3086\t41.0\t40.4\t16.3\t26717\t174711\t0.6165\t33161\tObama\t33161\t0.006542772\t33161.0\n3383\t-80.296865\t25.757808999999998\tWest Miami city\tFL\tFlorida\tMiami-Dade County\t5772\t45.9\t23.9\t12.9\t20198\t185379\t0.6165\t33144\tObama\t33144\t0.012237485\t33144.0\n3384\t-80.48214399999999\t25.450568\tFlorida City\tFL\tFlorida\tMiami-Dade County\t9197\t27.3\t11.1\t29.9\t9828\t80840\t0.6165\t33030\tObama\t33030\t0.019498986\t33030.0\n3385\t-80.339027\t25.724246\tOlympia Heights CDP\tFL\tFlorida\tMiami-Dade County\t13135\t43.3\t27.4\t12.4\t22477\t200216\t0.6165\t33165\tObama\t33165\t0.027848122000000003\t33165.0\n3386\t-80.34853000000001\t25.862578\tMedley town\tFL\tFlorida\tMiami-Dade County\t1436\t37.4\t11.6\t18.7\t17181\t74474\t0.6165\t33016\tObama\t33016\t0.00304453\t33016.0\n3387\t-80.324331\t25.573531\tLakes by the Bay CDP\tFL\tFlorida\tMiami-Dade County\t14660\t32.9\t32.7\t10.1\t25698\t163690\t0.6165\t33189\tObama\t33189\t0.031081346\t33189.0\n3388\t-80.335826\t25.747495999999998\tWestchester CDP\tFL\tFlorida\tMiami-Dade County\t29485\t45.6\t28.4\t12.2\t19697\t200101\t0.6165\t33165\tObama\t33165\t0.062512515\t33165.0\n3389\t-80.368226\t25.746956\tUniversity Park CDP\tFL\tFlorida\tMiami-Dade County\t26885\t40.9\t29.4\t13.7\t19945\t203490\t0.6165\t33165\tObama\t33165\t0.057000135\t33165.0\n3390\t-80.388013\t25.561478\tGoulds CDP\tFL\tFlorida\tMiami-Dade County\t8425\t29.1\t13.2\t19.0\t12687\t108132\t0.6165\t33170\tObama\t33170\t0.017862233\t33170.0\n3391\t-80.315561\t25.709029\tGlenvar Heights CDP\tFL\tFlorida\tMiami-Dade County\t16369\t39.5\t47.4\t11.7\t29648\t249229\t0.6165\t33143\tObama\t33143\t0.034704676000000004\t33143.0\n3392\t-80.27029300000001\t25.944132\tCarol City CDP\tFL\tFlorida\tMiami-Dade County\t61149\t32.8\t13.3\t18.6\t14821\t114003\t0.6165\t33055\tObama\t33055\t0.12964482900000002\t33055.0\n3393\t-80.401792\t25.670703\tThe Crossings CDP\tFL\tFlorida\tMiami-Dade County\t23338\t38.0\t43.5\t10.6\t27969\t167925\t0.6165\t33186\tObama\t33186\t0.049479975999999995\t33186.0\n3394\t-80.124502\t25.939018\tSunny Isles Beach city\tFL\tFlorida\tMiami-Dade County\t18429\t55.3\t35.0\t11.1\t29997\t146499\t0.6165\t33160\tObama\t33160\t0.039072177\t33160.0\n3395\t-80.21743000000001\t25.869713\tPinewood CDP\tFL\tFlorida\tMiami-Dade County\t16284\t30.8\t8.8\t22.4\t12188\t99564\t0.6165\t33150\tObama\t33150\t0.034524463\t33150.0\n3396\t-80.448199\t25.669885999999998\tThe Hammocks CDP\tFL\tFlorida\tMiami-Dade County\t50235\t32.8\t37.5\t13.2\t22462\t181114\t0.6165\t33196\tObama\t33196\t0.10650555199999999\t33196.0\n3397\t-80.43878000000001\t25.706457999999998\tKendall West CDP\tFL\tFlorida\tMiami-Dade County\t38572\t31.8\t26.3\t15.1\t17654\t141944\t0.6165\t33193\tObama\t33193\t0.081778285\t33193.0\n3398\t-80.355734\t25.669601\tKendall CDP\tFL\tFlorida\tMiami-Dade County\t75950\t39.5\t47.3\t11.1\t31011\t210628\t0.6165\t33176\tObama\t33176\t0.161025116\t33176.0\n3399\t-80.289449\t25.819452\tMiami Springs city\tFL\tFlorida\tMiami-Dade County\t13619\t42.0\t32.6\t11.5\t26989\t214967\t0.6165\t33166\tObama\t33166\t0.028874273\t33166.0\n3400\t-80.363762\t25.606044\tWest Perrine CDP\tFL\tFlorida\tMiami-Dade County\t9376\t31.6\t15.2\t19.3\t14933\t119829\t0.6165\t33157\tObama\t33157\t0.019878492\t33157.0\n3401\t-80.347714\t25.583049\tCutler Ridge CDP\tFL\tFlorida\tMiami-Dade County\t25614\t35.2\t24.9\t13.1\t22458\t151442\t0.6165\t33189\tObama\t33189\t0.054305429\t33189.0\n3402\t-80.13088\t25.81535\tMiami Beach city\tFL\tFlorida\tMiami-Dade County\t91170\t42.4\t40.0\t14.3\t32362\t194425\t0.6165\t33140\tObama\t33140\t0.19329374300000002\t33140.0\n3403\t-80.136996\t25.956749\tAventura city\tFL\tFlorida\tMiami-Dade County\t31870\t54.7\t45.7\t11.1\t46535\t187195\t0.6165\t33180\tObama\t33180\t0.067569064\t33180.0\n3404\t-80.164846\t25.690868\tKey Biscayne village\tFL\tFlorida\tMiami-Dade County\t10680\t42.7\t70.6\t8.8\t61936\t568976\t0.6165\t33149\tObama\t33149\t0.022643162999999997\t33149.0\n3405\t-80.407775\t25.707895999999998\tKendale Lakes CDP\tFL\tFlorida\tMiami-Dade County\t56477\t37.2\t28.6\t13.4\t19879\t142975\t0.6165\t33183\tObama\t33183\t0.119739506\t33183.0\n3406\t-80.187814\t25.86755\tMiami Shores village\tFL\tFlorida\tMiami-Dade County\t10291\t40.9\t46.3\t12.0\t30718\t208879\t0.6165\t33138\tObama\t33138\t0.021818426000000002\t33138.0\n3407\t-80.241764\t25.821675\tBrownsville CDP\tFL\tFlorida\tMiami-Dade County\t14364\t31.0\t7.2\t25.6\t10867\t78966\t0.6165\t33142\tObama\t33142\t0.030453782000000002\t33142.0\n3408\t-80.29587\t25.862938\tHialeah city\tFL\tFlorida\tMiami-Dade County\t227369\t39.4\t14.7\t17.8\t14316\t139249\t0.6165\t33012\tObama\t33012\t0.482055556\t33012.0\n3409\t-80.371726\t25.634465\tRichmond Heights CDP\tFL\tFlorida\tMiami-Dade County\t8410\t37.7\t21.6\t15.8\t19825\t112500\t0.6165\t33176\tObama\t33176\t0.017830431\t33176.0\n3410\t-80.29534100000001\t25.70603\tSouth Miami city\tFL\tFlorida\tMiami-Dade County\t11099\t39.0\t43.6\t10.7\t28589\t228370\t0.6165\t33143\tObama\t33143\t0.023531503999999998\t33143.0\n3411\t-80.31695400000001\t25.625928\tCutler CDP\tFL\tFlorida\tMiami-Dade County\t17209\t41.8\t61.6\t7.8\t49353\t365751\t0.6165\t33158\tObama\t33158\t0.036485599\t33158.0\n3412\t-80.236863\t25.839514\tGladeview CDP\tFL\tFlorida\tMiami-Dade County\t13545\t28.3\t6.1\t31.7\t9646\t66007\t0.6165\t33147\tObama\t33147\t0.028717382000000003\t33147.0\n3413\t-80.349171\t25.772448999999998\tFountainbleau CDP\tFL\tFlorida\tMiami-Dade County\t60913\t37.4\t28.0\t14.4\t17065\t114690\t0.6165\t33174\tObama\t33174\t0.129144475\t33174.0\n3414\t-80.23320600000001\t25.941514\tScott Lake CDP\tFL\tFlorida\tMiami-Dade County\t14123\t34.2\t22.2\t19.7\t18453\t125390\t0.6165\t33056\tObama\t33056\t0.029942827\t33056.0\n3415\t-80.150481\t25.846876\tNorth Bay Village city\tFL\tFlorida\tMiami-Dade County\t7937\t39.4\t35.4\t14.0\t25380\t130959\t0.6165\t33141\tObama\t33141\t0.016827602\t33141.0\n3416\t-80.400136\t25.64153\tThree Lakes CDP\tFL\tFlorida\tMiami-Dade County\t14822\t34.7\t38.2\t10.3\t28383\t161589\t0.6165\t33186\tObama\t33186\t0.031424809\t33186.0\n3417\t-80.435312\t25.633016\tCountry Walk CDP\tFL\tFlorida\tMiami-Dade County\t14799\t31.2\t38.0\t9.6\t25160\t198968\t0.6165\t33196\tObama\t33196\t0.031376046\t33196.0\n3418\t-80.411526\t25.121760000000002\tKey Largo CDP\tFL\tFlorida\tMonroe County\t11346\t46.7\t28.5\t7.0\t28728\t226261\t0.4968\t33037\tObama\t33037\t0.024055181000000002\t33037.0\n3419\t-80.913552\t24.771043\tDuck Key CDP\tFL\tFlorida\tMonroe County\t407\t50.6\t30.9\t3.1\t29132\t235714\t0.4968\t33050\tObama\t33050\t0.0008629\t33050.0\n3420\t-80.32401899999999\t25.257556\tNorth Key Largo CDP\tFL\tFlorida\tMonroe County\t862\t65.5\t63.5\t0.0\t83013\t1000001\t0.4968\t33037\tObama\t33037\t0.001827566\t33037.0\n3421\t-81.021878\t24.72222\tKey Colony Beach city\tFL\tFlorida\tMonroe County\t801\t60.3\t39.3\t9.6\t40689\t436250\t0.4968\t33050\tObama\t33050\t0.001698237\t33050.0\n3422\t-81.368093\t24.689332999999998\tBig Pine Key CDP\tFL\tFlorida\tMonroe County\t4853\t47.3\t29.1\t4.6\t25684\t259738\t0.4968\t33043\tObama\t33043\t0.01028907\t33043.0\n3423\t-81.49639499999999\t24.674707\tCudjoe Key CDP\tFL\tFlorida\tMonroe County\t1768\t54.6\t25.3\t11.9\t31536\t357090\t0.4968\t33042\tObama\t33042\t0.0037484190000000002\t33042.0\n3424\t-81.660156\t24.599653\tBig Coppitt Key CDP\tFL\tFlorida\tMonroe County\t2198\t44.4\t22.9\t5.3\t27291\t281250\t0.4968\t33040\tObama\t33040\t0.004660082\t33040.0\n3425\t-81.778435\t24.560041000000002\tKey West city\tFL\tFlorida\tMonroe County\t22941\t41.8\t32.6\t6.6\t30740\t386034\t0.4968\t33040\tObama\t33040\t0.048638278\t33040.0\n3426\t-80.812496\t24.824296\tLayton city\tFL\tFlorida\tMonroe County\t134\t57.0\t25.7\t29.4\t22512\t250000\t0.4968\t33001\tObama\t33001\t0.0002841\t33001.0\n3427\t-80.513266\t25.021559\tTavernier CDP\tFL\tFlorida\tMonroe County\t2089\t46.7\t24.1\t5.2\t25220\t250000\t0.4968\t33070\tObama\t33070\t0.004428985999999999\t33070.0\n3428\t-80.557053\t24.970585\tIslamorada, Village of Islands village\tFL\tFlorida\tMonroe County\t6760\t49.8\t33.2\t7.7\t35651\t354416\t0.4968\t33070\tObama\t33070\t0.014332188999999999\t33070.0\n3429\t-81.737512\t24.567169\tStock Island CDP\tFL\tFlorida\tMonroe County\t4646\t39.9\t12.2\t6.5\t19565\t125526\t0.4968\t33040\tObama\t33040\t0.009850200000000002\t33040.0\n3430\t-81.071176\t24.716020999999998\tMarathon city\tFL\tFlorida\tMonroe County\t8644\t48.1\t28.1\t6.8\t25972\t245518\t0.4968\t33050\tObama\t33050\t0.018326545\t33050.0\n3431\t-81.568247\t30.634701\tYulee CDP\tFL\tFlorida\tNassau County\t11345\t38.0\t11.5\t12.0\t21341\t117296\t0.2529\t32097\tObama\t32097\t0.02405306\t32097.0\n3432\t-81.833493\t30.561852000000002\tCallahan town\tFL\tFlorida\tNassau County\t1046\t34.9\t12.5\t13.7\t20892\t103750\t0.2529\t32011\tObama\t32011\t0.002217673\t32011.0\n3433\t-81.44935500000001\t30.657545000000002\tFernandina Beach city\tFL\tFlorida\tNassau County\t11203\t45.2\t38.0\t15.9\t27543\t197414\t0.2529\t32034\tObama\t32034\t0.023752000000000002\t32034.0\n3434\t-81.808868\t30.510593\tNassau Village-Ratliff CDP\tFL\tFlorida\tNassau County\t5752\t39.8\t10.7\t9.9\t20997\t110058\t0.2529\t32011\tObama\t32011\t0.012195082\t32011.0\n3435\t-81.920989\t30.686840999999998\tHilliard town\tFL\tFlorida\tNassau County\t3226\t38.2\t10.2\t12.9\t17087\t87315\t0.2529\t32046\tObama\t32046\t0.006839591999999999\t32046.0\n3436\t-86.509035\t30.492189\tValparaiso city\tFL\tFlorida\tOkaloosa County\t5388\t36.3\t24.7\t7.3\t22623\t123425\t0.2471\t32580\tObama\t32580\t0.011423349\t32580.0\n3437\t-86.55015300000001\t30.459028999999997\tEglin AFB CDP\tFL\tFlorida\tOkaloosa County\t5945\t22.0\t23.5\t10.3\t15042\t210714\t0.2471\t32542\tObama\t32542\t0.01260427\t32542.0\n3438\t-86.641544\t30.444497\tWright CDP\tFL\tFlorida\tOkaloosa County\t23047\t34.9\t24.2\t7.8\t25850\t134817\t0.2471\t32547\tObama\t32547\t0.048863013\t32547.0\n3439\t-86.565635\t30.44063\tLake Lorraine CDP\tFL\tFlorida\tOkaloosa County\t6995\t41.5\t34.0\t7.2\t27295\t181649\t0.2471\t32579\tObama\t32579\t0.014830423999999998\t32579.0\n3440\t-86.48354\t30.53091\tNiceville city\tFL\tFlorida\tOkaloosa County\t12166\t43.0\t31.8\t7.4\t28936\t159291\t0.2471\t32580\tObama\t32580\t0.025793701000000002\t32580.0\n3441\t-86.583051\t30.443147999999997\tShalimar town\tFL\tFlorida\tOkaloosa County\t682\t49.5\t49.1\t6.3\t30782\t269531\t0.2471\t32579\tObama\t32579\t0.00144594\t32579.0\n3442\t-86.659244\t30.412723\tMary Esther city\tFL\tFlorida\tOkaloosa County\t3825\t42.3\t25.2\t6.7\t26572\t143277\t0.2471\t32548\tObama\t32548\t0.00810956\t32548.0\n3443\t-86.6234\t30.416303999999997\tFort Walton Beach city\tFL\tFlorida\tOkaloosa County\t19589\t40.9\t23.5\t9.7\t25541\t132772\t0.2471\t32548\tObama\t32548\t0.041531547\t32548.0\n3444\t-86.60845400000001\t30.439788\tOcean City CDP\tFL\tFlorida\tOkaloosa County\t5315\t39.8\t25.0\t6.6\t22762\t120274\t0.2471\t32547\tObama\t32547\t0.011268578000000001\t32547.0\n3445\t-86.578579\t30.748296000000003\tCrestview city\tFL\tFlorida\tOkaloosa County\t18361\t34.0\t17.4\t9.2\t20263\t122890\t0.2471\t32536\tObama\t32536\t0.038928007\t32536.0\n3446\t-86.47058100000001\t30.394594\tDestin city\tFL\tFlorida\tOkaloosa County\t20476\t43.6\t39.6\t7.1\t38969\t246266\t0.2471\t32541\tObama\t32541\t0.043412117\t32541.0\n3447\t-86.609522\t30.422210999999997\tCinco Bayou town\tFL\tFlorida\tOkaloosa County\t367\t48.7\t39.4\t8.3\t35428\t245000\t0.2471\t32548\tObama\t32548\t0.0007780939999999999\t32548.0\n3448\t-86.45693100000001\t30.963138\tLaurel Hill city\tFL\tFlorida\tOkaloosa County\t584\t44.5\t8.0\t10.1\t17498\t87857\t0.2471\t32567\tObama\t32567\t0.001238165\t32567.0\n3449\t-80.829836\t27.241559999999996\tOkeechobee city\tFL\tFlorida\tOkeechobee County\t6422\t38.5\t14.4\t12.9\t17754\t138542\t0.39399999999999996\t34974\tObama\t34974\t0.01361558\t34974.0\n3450\t-80.811291\t27.248069\tCypress Quarters CDP\tFL\tFlorida\tOkeechobee County\t1205\t39.8\t13.2\t8.9\t15903\t111154\t0.39399999999999996\t34974\tObama\t34974\t0.002554776\t34974.0\n3451\t-80.78899200000001\t27.217265\tTaylor Creek CDP\tFL\tFlorida\tOkeechobee County\t4499\t56.9\t8.4\t15.2\t19233\t111215\t0.39399999999999996\t34974\tObama\t34974\t0.009538538000000001\t34974.0\n3452\t-81.081212\t28.484821000000004\tWedgefield CDP\tFL\tFlorida\tOrange County\t4893\t39.5\t23.3\t10.8\t26610\t161549\t0.5868\t32833\tObama\t32833\t0.010373876\t32833.0\n3453\t-81.52728499999999\t28.695473\tApopka city\tFL\tFlorida\tOrange County\t33882\t35.6\t23.8\t12.6\t23135\t131720\t0.5868\t32712\tObama\t32712\t0.071834799\t32712.0\n3454\t-81.295683\t28.546836\tAzalea Park CDP\tFL\tFlorida\tOrange County\t12344\t32.8\t15.6\t14.5\t17414\t108962\t0.5868\t32807\tObama\t32807\t0.026171087000000003\t32807.0\n3455\t-81.532146\t28.389059000000003\tLake Buena Vista city\tFL\tFlorida\tOrange County\t36\t25.4\t23.8\t9.1\t25553\t102500\t0.5868\t32836\tObama\t32836\t7.63e-05\t32836.0\n3456\t-81.545265\t28.487334000000004\tLake Butter CDP\tFL\tFlorida\tOrange County\t15372\t39.4\t57.8\t7.8\t54717\t356773\t0.5868\t347HH\tObama\t347HH\t0.03259089\t0.0\n3457\t-81.371214\t28.628899\tMaitland city\tFL\tFlorida\tOrange County\t12782\t42.3\t53.5\t13.5\t39578\t234389\t0.5868\t32751\tObama\t32751\t0.027099711000000002\t32751.0\n3458\t-81.60126899999999\t28.729215999999997\tZellwood CDP\tFL\tFlorida\tOrange County\t2679\t67.0\t13.8\t11.3\t22016\t86287\t0.5868\t32798\tObama\t32798\t0.005679872\t32798.0\n3459\t-81.435313\t28.627086\tLockhart CDP\tFL\tFlorida\tOrange County\t13557\t33.5\t19.1\t11.1\t21609\t113468\t0.5868\t32810\tObama\t32810\t0.028742824\t32810.0\n3460\t-81.33151099999999\t28.496868\tConway CDP\tFL\tFlorida\tOrange County\t14809\t39.8\t34.5\t10.5\t27170\t154294\t0.5868\t32812\tObama\t32812\t0.031397247\t32812.0\n3461\t-81.434026\t28.479640000000003\tOrlando city\tFL\tFlorida\tOrange County\t225238\t34.6\t29.7\t13.2\t24285\t129721\t0.5868\t32839\tObama\t32839\t0.477537525\t32839.0\n3462\t-81.63404200000001\t28.553562\tOakland city\tFL\tFlorida\tOrange County\t1961\t39.4\t27.6\t9.0\t24363\t215299\t0.5868\t34760\tObama\t34760\t0.004157607\t34760.0\n3463\t-81.491159\t28.44732\tDoctor Phillips CDP\tFL\tFlorida\tOrange County\t11852\t39.3\t56.5\t10.8\t39384\t250826\t0.5868\t32819\tObama\t32819\t0.025127975\t32819.0\n3464\t-81.634468\t28.757281\tTangerine CDP\tFL\tFlorida\tOrange County\t1010\t50.2\t35.3\t6.4\t32205\t193519\t0.5868\t32757\tObama\t32757\t0.002141348\t32757.0\n3465\t-81.106561\t28.564753999999997\tBithlo CDP\tFL\tFlorida\tOrange County\t6796\t34.9\t18.6\t16.3\t18837\t85184\t0.5868\t32820\tObama\t32820\t0.014408515\t32820.0\n3466\t-81.419135\t28.47227\tOak Ridge CDP\tFL\tFlorida\tOrange County\t25930\t29.6\t13.4\t17.4\t14703\t110415\t0.5868\t32839\tObama\t32839\t0.054975395\t32839.0\n3467\t-81.54564599999999\t28.620646\tParadise Heights CDP\tFL\tFlorida\tOrange County\t1085\t40.0\t13.3\t13.0\t18439\t69419\t0.5868\t34761\tObama\t34761\t0.002300359\t34761.0\n3468\t-81.533278\t28.498731\tWindermere town\tFL\tFlorida\tOrange County\t1966\t43.1\t59.2\t8.3\t55735\t406667\t0.5868\t34786\tObama\t34786\t0.004168208\t34786.0\n3469\t-81.60108000000001\t28.53251\tTildenville CDP\tFL\tFlorida\tOrange County\t538\t40.2\t31.4\t8.5\t23478\t268421\t0.5868\t34787\tObama\t34787\t0.001140639\t34787.0\n3470\t-81.36728199999999\t28.428148999999998\tTaft CDP\tFL\tFlorida\tOrange County\t2132\t34.4\t14.2\t20.3\t18070\t105000\t0.5868\t32824\tObama\t32824\t0.004520152\t32824.0\n3471\t-81.381977\t28.390852000000002\tSouthchase CDP\tFL\tFlorida\tOrange County\t4791\t33.4\t25.7\t11.6\t21459\t159581\t0.5868\t32837\tObama\t32837\t0.010157621\t32837.0\n3472\t-81.342762\t28.597831\tWinter Park city\tFL\tFlorida\tOrange County\t23902\t43.9\t52.9\t10.9\t40298\t242259\t0.5868\t32789\tObama\t32789\t0.050675738\t32789.0\n3473\t-81.58436999999999\t28.551938\tWinter Garden city\tFL\tFlorida\tOrange County\t28393\t37.4\t27.7\t10.6\t26524\t172535\t0.5868\t34787\tObama\t34787\t0.060197315\t34787.0\n3474\t-80.99961400000001\t28.523870000000002\tChristmas CDP\tFL\tFlorida\tOrange County\t1224\t42.8\t13.7\t11.2\t21380\t100758\t0.5868\t32709\tObama\t32709\t0.002595059\t32709.0\n3475\t-81.373807\t28.465302\tPine Castle CDP\tFL\tFlorida\tOrange County\t9627\t34.1\t17.8\t15.7\t20117\t114820\t0.5868\t32809\tObama\t32809\t0.020410649\t32809.0\n3476\t-81.233611\t28.385507\tLake Hart CDP\tFL\tFlorida\tOrange County\t604\t44.7\t35.0\t7.9\t42653\t140948\t0.5868\t32832\tObama\t32832\t0.001280568\t32832.0\n3477\t-81.349399\t28.473094\tBelle Isle city\tFL\tFlorida\tOrange County\t5670\t45.6\t41.5\t11.1\t33509\t199776\t0.5868\t32812\tObama\t32812\t0.01202123\t32812.0\n3478\t-81.575417\t28.385678000000002\tBay Lake city\tFL\tFlorida\tOrange County\t20\t27.5\t25.0\t8.3\t25853\t137500\t0.5868\t32836\tObama\t32836\t4.24e-05\t32836.0\n3479\t-81.42356600000001\t28.357266\tHunters Creek CDP\tFL\tFlorida\tOrange County\t11945\t33.9\t48.3\t9.6\t33983\t241163\t0.5868\t32837\tObama\t32837\t0.025325148\t32837.0\n3480\t-81.509591\t28.457248\tBay Hill CDP\tFL\tFlorida\tOrange County\t5197\t43.4\t54.9\t9.0\t55215\t363694\t0.5868\t32819\tObama\t32819\t0.011018401\t32819.0\n3481\t-81.462879\t28.543884999999996\tOrlovista CDP\tFL\tFlorida\tOrange County\t6125\t32.4\t12.6\t20.4\t18330\t95321\t0.5868\t32835\tObama\t32835\t0.012985896\t32835.0\n3482\t-81.446505\t28.456062\tTangelo Park CDP\tFL\tFlorida\tOrange County\t2339\t34.2\t10.5\t28.1\t15698\t91450\t0.5868\t32819\tObama\t32819\t0.004959022\t32819.0\n3483\t-81.387261\t28.501558000000003\tHolden Heights CDP\tFL\tFlorida\tOrange County\t3998\t43.9\t26.8\t14.4\t23247\t139518\t0.5868\t32839\tObama\t32839\t0.008476345\t32839.0\n3484\t-81.39123199999999\t28.461024\tSky Lake CDP\tFL\tFlorida\tOrange County\t6335\t36.5\t14.6\t15.7\t20118\t110980\t0.5868\t32809\tObama\t32809\t0.013431127\t32809.0\n3485\t-81.384985\t28.487989000000002\tEdgewood city\tFL\tFlorida\tOrange County\t2120\t44.7\t37.2\t9.6\t30463\t184052\t0.5868\t32839\tObama\t32839\t0.00449471\t32839.0\n3486\t-81.51214399999999\t28.651927\tSouth Apopka CDP\tFL\tFlorida\tOrange County\t5801\t30.0\t8.4\t19.9\t13491\t88367\t0.5868\t32703\tObama\t32703\t0.012298969\t32703.0\n3487\t-81.459688\t28.579932\tPine Hills CDP\tFL\tFlorida\tOrange County\t42410\t30.4\t13.5\t17.9\t15290\t109021\t0.5868\t32808\tObama\t32808\t0.08991540699999999\t32808.0\n3488\t-81.529353\t28.573409\tOcoee city\tFL\tFlorida\tOrange County\t31194\t34.9\t27.2\t10.6\t27943\t151861\t0.5868\t34761\tObama\t34761\t0.066135845\t34761.0\n3489\t-81.391568\t28.601219\tFairview Shores CDP\tFL\tFlorida\tOrange County\t13557\t38.7\t22.8\t15.5\t22775\t122020\t0.5868\t32804\tObama\t32804\t0.028742824\t32804.0\n3490\t-81.51922900000001\t28.530817\tGotha CDP\tFL\tFlorida\tOrange County\t1441\t37.8\t47.0\t8.6\t39628\t322414\t0.5868\t34734\tObama\t34734\t0.0030551309999999996\t34734.0\n3491\t-81.390364\t28.616709000000004\tEatonville town\tFL\tFlorida\tOrange County\t2476\t33.6\t22.6\t14.9\t18867\t106194\t0.5868\t32751\tObama\t32751\t0.005249482\t32751.0\n3492\t-81.235545\t28.565676\tUnion Park CDP\tFL\tFlorida\tOrange County\t10968\t30.0\t26.8\t13.6\t22934\t132450\t0.5868\t32825\tObama\t32825\t0.023253765\t32825.0\n3493\t-81.346763\t28.369721000000002\tMeadow Woods CDP\tFL\tFlorida\tOrange County\t25801\t33.8\t20.4\t9.4\t20613\t141618\t0.5868\t32824\tObama\t32824\t0.05470189599999999\t32824.0\n3494\t-81.445459\t28.400128000000002\tWilliamsburg CDP\tFL\tFlorida\tOrange County\t6739\t49.2\t34.7\t10.9\t31433\t148351\t0.5868\t32821\tObama\t32821\t0.014287666000000001\t32821.0\n3495\t-81.30581\t28.235957\tSt. Cloud city\tFL\tFlorida\tOsceola County\t26498\t39.2\t14.2\t13.5\t20463\t135637\t0.6186\t34769\tObama\t34769\t0.056179638\t34769.0\n3496\t-81.353934\t28.334943\tBuenaventura Lakes\tFL\tFlorida\tOsceola County\t28918\t33.7\t16.4\t17.0\t17081\t151021\t0.6186\t34743\tObama\t34743\t0.061310392000000005\t34743.0\n3497\t-81.421227\t28.303821000000003\tKissimmee city\tFL\tFlorida\tOsceola County\t65630\t30.5\t18.0\t15.4\t17054\t136557\t0.6186\t34741\tObama\t34741\t0.139145205\t34741.0\n3498\t-81.454027\t28.26049\tCampbell CDP\tFL\tFlorida\tOsceola County\t2997\t62.9\t19.4\t13.4\t20195\t71857\t0.6186\t34746\tObama\t34746\t0.006354079\t34746.0\n3499\t-81.62418100000001\t28.389495\tCitrus Ridge CDP\tFL\tFlorida\tOsceola County\t29808\t44.5\t21.6\t9.0\t24207\t155048\t0.6186\t34747\tObama\t34747\t0.063197323\t34747.0\n3500\t-81.550955\t28.310281\tCelebration CDP\tFL\tFlorida\tOsceola County\t10825\t42.0\t56.6\t8.4\t40387\t292391\t0.6186\t34747\tObama\t34747\t0.022950584\t34747.0\n3501\t-81.475175\t28.159529\tPoinciana CDP\tFL\tFlorida\tOsceola County\t32710\t30.0\t11.0\t11.3\t15686\t139745\t0.6186\t34758\tObama\t34758\t0.069349987\t34758.0\n3502\t-80.126882\t26.46705\tHigh Point CDP\tFL\tFlorida\tPalm Beach County\t2280\t72.5\t23.4\t15.4\t28408\t68385\t0.5821\t33484\tObama\t33484\t0.004833934\t33484.0\n3503\t-80.040974\t26.565085999999997\tManalapan town\tFL\tFlorida\tPalm Beach County\t609\t50.7\t58.0\t7.8\t101999\t670238\t0.5821\t33462\tObama\t33462\t0.001291169\t33462.0\n3504\t-80.141512\t26.943416999999997\tLimestone Creek CDP\tFL\tFlorida\tPalm Beach County\t766\t37.6\t41.8\t9.9\t34612\t267763\t0.5821\t33458\tObama\t33458\t0.001624032\t33458.0\n3505\t-80.094668\t26.699115000000003\tWestgate-Belvedere Homes CDP\tFL\tFlorida\tPalm Beach County\t8982\t30.5\t8.5\t18.1\t14648\t79805\t0.5821\t33409\tObama\t33409\t0.019043155\t33409.0\n3506\t-80.807833\t26.688709999999997\tLake Harbor CDP\tFL\tFlorida\tPalm Beach County\t191\t25.2\t7.3\t26.7\t10135\t45000\t0.5821\t33493\tObama\t33493\t0.000404948\t33493.0\n3507\t-80.099963\t26.616729\tLake Worth Corridor CDP\tFL\tFlorida\tPalm Beach County\t21384\t29.6\t8.7\t16.4\t15554\t93657\t0.5821\t33461\tObama\t33461\t0.04533721\t33461.0\n3508\t-80.122512\t26.729163\tCypress Lakes CDP\tFL\tFlorida\tPalm Beach County\t1869\t66.3\t23.8\t15.5\t29232\t122761\t0.5821\t33417\tObama\t33417\t0.003962554\t33417.0\n3509\t-80.123713\t26.697808000000002\tStacey Street CDP\tFL\tFlorida\tPalm Beach County\t899\t28.4\t10.6\t20.8\t14302\t68750\t0.5821\t33417\tObama\t33417\t0.0019060120000000001\t33417.0\n3510\t-80.050011\t26.526908000000002\tOcean Ridge town\tFL\tFlorida\tPalm Beach County\t1697\t62.1\t51.6\t8.7\t82553\t429661\t0.5821\t33435\tObama\t33435\t0.003597888\t33435.0\n3511\t-80.08196\t26.778564000000003\tRiviera Beach city\tFL\tFlorida\tPalm Beach County\t34433\t36.8\t22.5\t16.1\t24230\t112971\t0.5821\t33404\tObama\t33404\t0.073002999\t33404.0\n3512\t-80.054037\t26.509038\tBriny Breezes town\tFL\tFlorida\tPalm Beach County\t439\t61.8\t49.2\t12.2\t75128\t307407\t0.5821\t33435\tObama\t33435\t0.000930744\t33435.0\n3513\t-80.114838\t26.961651\tTequesta village\tFL\tFlorida\tPalm Beach County\t5398\t50.9\t40.6\t10.9\t40289\t206497\t0.5821\t33469\tObama\t33469\t0.01144455\t33469.0\n3514\t-80.18761500000001\t26.397615000000002\tWhisper Walk CDP\tFL\tFlorida\tPalm Beach County\t5109\t65.6\t29.7\t14.8\t27808\t126902\t0.5821\t33434\tObama\t33434\t0.010831828\t33434.0\n3515\t-80.670994\t26.68688\tBelle Glade city\tFL\tFlorida\tPalm Beach County\t15030\t29.3\t11.7\t25.1\t12604\t81511\t0.5821\t33430\tObama\t33430\t0.0318658\t33430.0\n3516\t-80.126463\t26.681465000000003\tRoyal Palm Estates CDP\tFL\tFlorida\tPalm Beach County\t3590\t30.6\t12.1\t12.6\t19431\t95291\t0.5821\t33415\tObama\t33415\t0.007611325\t33415.0\n3517\t-80.035496\t26.777722999999998\tPalm Beach Shores town\tFL\tFlorida\tPalm Beach County\t1110\t57.1\t37.0\t12.9\t35438\t214394\t0.5821\t33404\tObama\t33404\t0.002353362\t33404.0\n3518\t-80.114273\t26.715339\tSchall Circle CDP\tFL\tFlorida\tPalm Beach County\t1001\t41.9\t18.8\t21.7\t18126\t40909\t0.5821\t33417\tObama\t33417\t0.002122267\t33417.0\n3519\t-80.10529100000001\t26.376067\tBoca Raton city\tFL\tFlorida\tPalm Beach County\t75231\t47.1\t48.5\t11.3\t48987\t264803\t0.5821\t33431\tObama\t33431\t0.15950073\t33431.0\n3520\t-80.057278\t26.488947999999997\tGulf Stream town\tFL\tFlorida\tPalm Beach County\t740\t57.3\t48.2\t14.7\t72524\t243182\t0.5821\t33483\tObama\t33483\t0.001568908\t33483.0\n3521\t-80.109186\t26.504319\tGolf village\tFL\tFlorida\tPalm Beach County\t225\t64.9\t52.6\t6.7\t69777\t317500\t0.5821\t33436\tObama\t33436\t0.000477033\t33436.0\n3522\t-80.08144200000001\t26.527859999999997\tBoynton Beach city\tFL\tFlorida\tPalm Beach County\t65718\t46.3\t23.5\t13.9\t27286\t107907\t0.5821\t33426\tObama\t33426\t0.13933177800000002\t33426.0\n3523\t-80.21149399999999\t26.369284000000004\tMission Bay CDP\tFL\tFlorida\tPalm Beach County\t2874\t41.7\t54.1\t9.9\t44365\t258664\t0.5821\t33428\tObama\t33428\t0.006093301\t33428.0\n3524\t-80.075594\t26.671446999999997\tGlen Ridge town\tFL\tFlorida\tPalm Beach County\t274\t35.6\t12.2\t11.7\t20384\t121094\t0.5821\t33405\tObama\t33405\t0.00058092\t33405.0\n3525\t-80.10311300000001\t26.596069\tAtlantis city\tFL\tFlorida\tPalm Beach County\t1992\t64.2\t45.5\t15.5\t53263\t301701\t0.5821\t33461\tObama\t33461\t0.004223332\t33461.0\n3526\t-80.146465\t26.344851000000002\tBoca Del Mar CDP\tFL\tFlorida\tPalm Beach County\t22276\t49.7\t47.7\t13.6\t39653\t208806\t0.5821\t33433\tObama\t33433\t0.04722838\t33433.0\n3527\t-80.726835\t26.678466999999998\tSouth Bay city\tFL\tFlorida\tPalm Beach County\t4164\t31.9\t8.9\t38.5\t12797\t73889\t0.5821\t33493\tObama\t33493\t0.008828289\t33493.0\n3528\t-80.114137\t26.738951\tLakeside Green CDP\tFL\tFlorida\tPalm Beach County\t3786\t38.2\t34.6\t9.5\t27011\t121737\t0.5821\t33417\tObama\t33417\t0.008026874\t33417.0\n3529\t-80.136861\t26.688788\tLake Belvedere Estates CDP\tFL\tFlorida\tPalm Beach County\t2608\t35.0\t22.0\t10.9\t21824\t122943\t0.5821\t33413\tObama\t33413\t0.005529342\t33413.0\n3530\t-80.056915\t26.88515\tJuno Beach town\tFL\tFlorida\tPalm Beach County\t3202\t59.7\t46.5\t11.4\t52363\t242155\t0.5821\t33408\tObama\t33408\t0.006788709\t33408.0\n3531\t-80.054468\t26.563515999999996\tHypoluxo town\tFL\tFlorida\tPalm Beach County\t2248\t49.6\t38.8\t16.4\t40761\t146964\t0.5821\t33462\tObama\t33462\t0.004766089\t33462.0\n3532\t-80.108992\t26.91915\tJupiter town\tFL\tFlorida\tPalm Beach County\t51042\t44.1\t40.0\t10.8\t37148\t190178\t0.5821\t33458\tObama\t33458\t0.10821651\t33458.0\n3533\t-80.038255\t26.706484999999997\tPalm Beach town\tFL\tFlorida\tPalm Beach County\t10011\t65.2\t59.3\t10.9\t99915\t602093\t0.5821\t33480\tObama\t33480\t0.021224785\t33480.0\n3534\t-80.075051\t26.645939000000002\tLake Clarke Shores town\tFL\tFlorida\tPalm Beach County\t3384\t46.6\t43.3\t14.3\t30761\t177579\t0.5821\t33406\tObama\t33406\t0.007174575\t33406.0\n3535\t-80.108068\t26.675325\tGun Club Estates CDP\tFL\tFlorida\tPalm Beach County\t851\t33.5\t21.6\t11.0\t21381\t91324\t0.5821\t33406\tObama\t33406\t0.001804245\t33406.0\n3536\t-80.127887\t26.714468\tCentury Village CDP\tFL\tFlorida\tPalm Beach County\t7371\t76.5\t16.5\t22.6\t21631\t31727\t0.5821\t33417\tObama\t33417\t0.015627599\t33417.0\n3537\t-80.131794\t26.703564\tPlantation Mobile Home Park CDP\tFL\tFlorida\tPalm Beach County\t1303\t35.3\t12.6\t16.8\t22016\t71250\t0.5821\t33417\tObama\t33417\t0.002762551\t33417.0\n3538\t-80.076131\t26.758719\tMangonia Park town\tFL\tFlorida\tPalm Beach County\t1519\t36.1\t14.7\t15.5\t17545\t85000\t0.5821\t33407\tObama\t33407\t0.003220502\t33407.0\n3539\t-80.066548\t26.406398\tHighland Beach town\tFL\tFlorida\tPalm Beach County\t4502\t65.3\t54.8\t11.0\t74967\t300583\t0.5821\t33487\tObama\t33487\t0.009544899\t33487.0\n3540\t-80.62217\t26.863028000000003\tCanal Point CDP\tFL\tFlorida\tPalm Beach County\t502\t23.2\t9.5\t36.1\t11098\t77692\t0.5821\t33438\tObama\t33438\t0.001064313\t33438.0\n3541\t-80.16035500000001\t26.334984999999996\tBoca Pointe CDP\tFL\tFlorida\tPalm Beach County\t3212\t69.0\t45.4\t8.7\t72031\t313636\t0.5821\t33433\tObama\t33433\t0.00680991\t33433.0\n3542\t-80.065264\t26.822009\tNorth Palm Beach village\tFL\tFlorida\tPalm Beach County\t12441\t53.2\t42.2\t9.1\t47385\t172108\t0.5821\t33408\tObama\t33408\t0.026376741000000002\t33408.0\n3543\t-80.06059\t26.619815999999997\tLake Worth city\tFL\tFlorida\tPalm Beach County\t36101\t36.4\t19.7\t17.7\t18564\t94420\t0.5821\t33460\tObama\t33460\t0.076539404\t33460.0\n3544\t-80.121687\t26.690771\tHaverhill town\tFL\tFlorida\tPalm Beach County\t1341\t30.8\t18.6\t15.0\t19124\t115296\t0.5821\t33417\tObama\t33417\t0.0028431159999999997\t33417.0\n3545\t-80.146346\t26.852090999999998\tPalm Beach Gardens city\tFL\tFlorida\tPalm Beach County\t46303\t49.3\t45.5\t10.5\t43826\t170455\t0.5821\t33418\tObama\t33418\t0.09816913699999999\t33418.0\n3546\t-80.155188\t26.461309999999997\tVillages of Oriole CDP\tFL\tFlorida\tPalm Beach County\t4605\t80.5\t21.6\t19.6\t28613\t96512\t0.5821\t33446\tObama\t33446\t0.009763274\t33446.0\n3547\t-80.256362\t26.641247999999997\tWellington village\tFL\tFlorida\tPalm Beach County\t55522\t40.5\t40.7\t9.8\t36083\t225253\t0.5821\t33414\tObama\t33414\t0.117714766\t33414.0\n3548\t-80.13408199999999\t26.748228000000005\tWest Palm Beach city\tFL\tFlorida\tPalm Beach County\t100111\t39.6\t30.0\t13.6\t27824\t123482\t0.5821\t33417\tObama\t33417\t0.21224997199999998\t33417.0\n3549\t-80.655234\t26.804828999999998\tFremd Village-Padgett Island CDP\tFL\tFlorida\tPalm Beach County\t2153\t23.9\t8.9\t33.8\t11205\t74167\t0.5821\t33476\tObama\t33476\t0.004564675\t33476.0\n3550\t-80.07046700000001\t26.800013\tLake Park town\tFL\tFlorida\tPalm Beach County\t8643\t37.2\t17.9\t18.2\t20460\t110480\t0.5821\t33403\tObama\t33403\t0.018324425\t33403.0\n3551\t-80.6831\t26.656340000000004\tBelle Glade Camp CDP\tFL\tFlorida\tPalm Beach County\t1115\t25.4\t6.7\t26.4\t10155\t44118\t0.5821\t33430\tObama\t33430\t0.0023639629999999997\t33430.0\n3552\t-80.08972800000001\t26.454889\tDelray Beach city\tFL\tFlorida\tPalm Beach County\t63614\t48.0\t32.9\t15.0\t32756\t131622\t0.5821\t33444\tObama\t33444\t0.13487099\t33444.0\n3553\t-80.095917\t26.637569\tPalm Springs village\tFL\tFlorida\tPalm Beach County\t11600\t40.7\t19.3\t13.8\t22271\t83633\t0.5821\t33461\tObama\t33461\t0.024593697999999997\t33461.0\n3554\t-80.061963\t26.849023\tJuno Ridge CDP\tFL\tFlorida\tPalm Beach County\t717\t41.6\t20.0\t12.4\t31307\t161364\t0.5821\t33408\tObama\t33408\t0.001520145\t33408.0\n3555\t-80.18475\t26.383007\tHamptons at Boca Raton CDP\tFL\tFlorida\tPalm Beach County\t11024\t67.2\t23.7\t11.4\t29407\t79160\t0.5821\t33434\tObama\t33434\t0.023372492999999998\t33434.0\n3556\t-80.226721\t26.705161\tRoyal Palm Beach village\tFL\tFlorida\tPalm Beach County\t28285\t40.3\t28.9\t10.1\t27899\t143307\t0.5821\t33411\tObama\t33411\t0.05996834\t33411.0\n3557\t-80.11845799999999\t26.484344\tDunes Road CDP\tFL\tFlorida\tPalm Beach County\t955\t66.2\t25.1\t12.6\t33028\t86061\t0.5821\t33445\tObama\t33445\t0.00202474\t33445.0\n3558\t-80.076153\t26.948262\tJupiter Inlet Colony town\tFL\tFlorida\tPalm Beach County\t442\t63.1\t45.1\t11.5\t60083\t292188\t0.5821\t33477\tObama\t33477\t0.000937105\t33477.0\n3559\t-80.140541\t26.445762\tKings Point CDP\tFL\tFlorida\tPalm Beach County\t12199\t76.5\t18.3\t14.5\t28855\t52711\t0.5821\t33484\tObama\t33484\t0.025863665\t33484.0\n3560\t-80.073199\t26.674333\tCloud Lake town\tFL\tFlorida\tPalm Beach County\t166\t35.6\t11.5\t11.9\t20355\t119318\t0.5821\t33405\tObama\t33405\t0.00035194400000000003\t33405.0\n3561\t-80.03908299999999\t26.589928000000004\tSouth Palm Beach town\tFL\tFlorida\tPalm Beach County\t1527\t71.6\t47.8\t10.9\t64526\t237500\t0.5821\t33460\tObama\t33460\t0.003237463\t33460.0\n3562\t-80.13937\t26.630627\tGreenacres city\tFL\tFlorida\tPalm Beach County\t28994\t43.8\t20.6\t12.1\t25020\t91665\t0.5821\t33463\tObama\t33463\t0.061471523\t33463.0\n3563\t-80.165654\t26.700734999999998\tGolden Lakes CDP\tFL\tFlorida\tPalm Beach County\t8289\t42.6\t20.1\t19.5\t18703\t53799\t0.5821\t33413\tObama\t33413\t0.017573893\t33413.0\n3564\t-80.66119\t26.820794\tPahokee city\tFL\tFlorida\tPalm Beach County\t5631\t25.5\t7.6\t29.8\t11423\t63636\t0.5821\t33476\tObama\t33476\t0.011938543999999999\t33476.0\n3565\t-80.10005799999999\t26.583924\tSeminole Manor CDP\tFL\tFlorida\tPalm Beach County\t2811\t41.6\t11.2\t10.6\t16722\t71429\t0.5821\t33462\tObama\t33462\t0.005959730999999999\t33462.0\n3566\t-80.186911\t26.338656\tSandalfoot Cove CDP\tFL\tFlorida\tPalm Beach County\t17201\t42.6\t23.9\t15.0\t27059\t125535\t0.5821\t33433\tObama\t33433\t0.036468637000000005\t33433.0\n3567\t-80.060098\t26.583378000000003\tLantana town\tFL\tFlorida\tPalm Beach County\t10188\t40.3\t19.4\t12.4\t26677\t107775\t0.5821\t33462\tObama\t33462\t0.021600051000000002\t33462.0\n3568\t-82.658781\t28.180390000000003\tTrinity CDP\tFL\tFlorida\tPasco County\t10224\t42.7\t32.8\t10.5\t31314\t206833\t0.4601\t34655\tObama\t34655\t0.021676376\t34655.0\n3569\t-82.750415\t28.211740000000002\tBeacon Square CDP\tFL\tFlorida\tPasco County\t7160\t55.4\t15.8\t17.3\t20980\t75542\t0.4601\t34691\tObama\t34691\t0.015180248\t34691.0\n3570\t-82.188788\t28.214878999999996\tZephyrhills South CDP\tFL\tFlorida\tPasco County\t5530\t63.0\t9.9\t13.6\t17303\t52298\t0.4601\t33541\tObama\t33541\t0.011724409\t33541.0\n3571\t-82.205513\t28.231112\tZephyrhills West CDP\tFL\tFlorida\tPasco County\t6115\t67.2\t15.1\t17.2\t22261\t70759\t0.4601\t33541\tObama\t33541\t0.012964695\t33541.0\n3572\t-82.689026\t28.359378000000003\tHudson CDP\tFL\tFlorida\tPasco County\t13392\t58.9\t16.5\t15.8\t21101\t106020\t0.4601\t34667\tObama\t34667\t0.028393\t34667.0\n3573\t-82.165465\t28.25163\tZephyrhills North CDP\tFL\tFlorida\tPasco County\t2997\t63.0\t11.6\t18.4\t20988\t66410\t0.4601\t33540\tObama\t33540\t0.006354079\t33540.0\n3574\t-82.725274\t28.275640999999997\tPort Richey city\tFL\tFlorida\tPasco County\t3072\t49.9\t18.4\t18.0\t22032\t98491\t0.4601\t34668\tObama\t34668\t0.00651309\t34668.0\n3575\t-82.552738\t28.18198\tOdessa CDP\tFL\tFlorida\tPasco County\t7918\t40.0\t23.8\t10.1\t25609\t117680\t0.4601\t33556\tObama\t33556\t0.016787319\t33556.0\n3576\t-82.366853\t28.181115000000002\tWesley Chapel CDP\tFL\tFlorida\tPasco County\t9869\t33.6\t47.5\t8.0\t31905\t167191\t0.4601\t33543\tObama\t33543\t0.020923723999999998\t33543.0\n3577\t-82.692622\t28.260176\tNew Port Richey East CDP\tFL\tFlorida\tPasco County\t10175\t48.4\t15.5\t12.7\t17913\t88443\t0.4601\t34653\tObama\t34653\t0.021572489\t34653.0\n3578\t-82.256598\t28.337590999999996\tSt. Leo town\tFL\tFlorida\tPasco County\t950\t33.4\t31.0\t14.1\t23471\t125000\t0.4601\t33576\tObama\t33576\t0.002014139\t33576.0\n3579\t-82.19364200000001\t28.360991\tDade City\tFL\tFlorida\tPasco County\t6491\t37.0\t20.7\t16.6\t17858\t82924\t0.4601\t33525\tObama\t33525\t0.01376187\t33525.0\n3580\t-82.683449\t28.325509000000004\tBayonet Point CDP\tFL\tFlorida\tPasco County\t24656\t60.2\t13.5\t14.9\t19907\t86137\t0.4601\t34668\tObama\t34668\t0.052274329\t34668.0\n3581\t-82.448061\t28.207116\tLand O' Lakes CDP\tFL\tFlorida\tPasco County\t31553\t38.9\t33.2\t11.9\t26953\t155003\t0.4601\t34639\tObama\t34639\t0.066896978\t34639.0\n3582\t-82.15361899999999\t28.183094\tCrystal Springs CDP\tFL\tFlorida\tPasco County\t1243\t42.5\t9.0\t13.5\t19610\t78864\t0.4601\t33540\tObama\t33540\t0.002635342\t33540.0\n3583\t-82.537891\t28.395383000000002\tShady Hills CDP\tFL\tFlorida\tPasco County\t9488\t42.0\t10.3\t16.0\t16820\t98051\t0.4601\t34610\tObama\t34610\t0.020115948999999998\t34610.0\n3584\t-82.17726800000001\t28.238318\tZephyrhills city\tFL\tFlorida\tPasco County\t13555\t53.7\t13.0\t18.2\t18588\t77255\t0.4601\t33540\tObama\t33540\t0.028738583999999998\t33540.0\n3585\t-82.317081\t28.246956\tWesley Chapel South CDP\tFL\tFlorida\tPasco County\t11524\t33.6\t31.9\t8.4\t27160\t150362\t0.4601\t33544\tObama\t33544\t0.024432567000000002\t33544.0\n3586\t-82.278952\t28.338583\tSan Antonio city\tFL\tFlorida\tPasco County\t950\t38.2\t27.2\t15.5\t20325\t100187\t0.4601\t33576\tObama\t33576\t0.002014139\t33576.0\n3587\t-82.716542\t28.246926000000002\tNew Port Richey city\tFL\tFlorida\tPasco County\t16686\t46.6\t12.4\t16.5\t18996\t76965\t0.4601\t34652\tObama\t34652\t0.035376762\t34652.0\n3588\t-82.742742\t28.186446000000004\tHoliday CDP\tFL\tFlorida\tPasco County\t23717\t50.0\t10.5\t14.9\t18608\t75416\t0.4601\t34691\tObama\t34691\t0.050283510999999996\t34691.0\n3589\t-82.16984599999999\t28.465328000000003\tLacoochee CDP\tFL\tFlorida\tPasco County\t1768\t24.2\t6.8\t25.0\t7588\t44848\t0.4601\t33523\tObama\t33523\t0.0037484190000000002\t33523.0\n3590\t-82.72308000000001\t28.213717\tElfers CDP\tFL\tFlorida\tPasco County\t13745\t48.4\t9.6\t16.1\t18106\t76341\t0.4601\t34690\tObama\t34690\t0.029141412000000002\t34690.0\n3591\t-82.19380100000001\t28.383146000000004\tDade City North CDP\tFL\tFlorida\tPasco County\t3551\t27.6\t4.8\t21.8\t11826\t61461\t0.4601\t33525\tObama\t33525\t0.00752864\t33525.0\n3592\t-82.690626\t28.293033\tJasmine Estates CDP\tFL\tFlorida\tPasco County\t17957\t47.9\t11.6\t20.1\t17883\t86143\t0.4601\t34668\tObama\t34668\t0.038071468\t34668.0\n3593\t-82.696568\t28.008126\tSafety Harbor city\tFL\tFlorida\tPinellas County\t16917\t47.9\t38.3\t10.6\t31943\t141319\t0.5224\t34695\tObama\t34695\t0.035866516\t34695.0\n3594\t-82.724725\t27.678895\tTierra Verde CDP\tFL\tFlorida\tPinellas County\t4056\t51.1\t53.9\t14.2\t65057\t305784\t0.5224\t33715\tObama\t33715\t0.008599314\t33715.0\n3595\t-82.713398\t27.904538\tSouth Highpoint CDP\tFL\tFlorida\tPinellas County\t8904\t33.3\t7.1\t14.2\t17069\t76549\t0.5224\t33760\tObama\t33760\t0.018877783000000002\t33760.0\n3596\t-82.671091\t28.040871999999997\tOldsmar city\tFL\tFlorida\tPinellas County\t12358\t40.5\t28.0\t11.3\t27888\t111801\t0.5224\t34677\tObama\t34677\t0.026200769\t34677.0\n3597\t-82.71035400000001\t27.749947\tGulfport city\tFL\tFlorida\tPinellas County\t12385\t51.5\t23.1\t14.0\t27767\t86326\t0.5224\t33707\tObama\t33707\t0.026258012999999997\t33707.0\n3598\t-82.774976\t27.820907000000002\tBay Pines CDP\tFL\tFlorida\tPinellas County\t2848\t57.3\t21.3\t8.2\t23497\t91892\t0.5224\t33708\tObama\t33708\t0.006038177\t33708.0\n3599\t-82.70613\t27.85769\tPinellas Park city\tFL\tFlorida\tPinellas County\t45598\t43.9\t14.9\t11.8\t23285\t87812\t0.5224\t33782\tObama\t33782\t0.096674433\t33782.0\n3600\t-82.771699\t28.026178\tDunedin city\tFL\tFlorida\tPinellas County\t36104\t52.8\t26.6\t10.7\t29147\t107267\t0.5224\t34698\tObama\t34698\t0.076545764\t34698.0\n3601\t-82.76945500000001\t27.770784000000003\tTreasure Island city\tFL\tFlorida\tPinellas County\t7197\t58.4\t36.7\t12.9\t39747\t241266\t0.5224\t33706\tObama\t33706\t0.015258693\t33706.0\n3602\t-82.805932\t27.89541\tRidgecrest CDP\tFL\tFlorida\tPinellas County\t2391\t34.0\t15.3\t14.9\t18421\t83203\t0.5224\t33778\tObama\t33778\t0.00506927\t33778.0\n3603\t-82.61604\t27.866001\tGandy CDP\tFL\tFlorida\tPinellas County\t2064\t42.4\t43.3\t10.9\t42953\t65909\t0.5224\t33716\tObama\t33716\t0.0043759820000000005\t33716.0\n3604\t-82.76082199999999\t28.148532\tTarpon Springs city\tFL\tFlorida\tPinellas County\t22525\t49.3\t24.9\t12.0\t26230\t120280\t0.5224\t34689\tObama\t34689\t0.047756297\t34689.0\n3605\t-82.742104\t27.725663\tSt. Pete Beach city\tFL\tFlorida\tPinellas County\t10072\t58.4\t41.0\t11.2\t41625\t229555\t0.5224\t33706\tObama\t33706\t0.021354114\t33706.0\n3606\t-82.791117\t27.796832000000002\tMadeira Beach city\tFL\tFlorida\tPinellas County\t4523\t55.1\t26.9\t12.4\t35201\t211934\t0.5224\t33708\tObama\t33708\t0.009589422\t33708.0\n3607\t-82.716224\t27.815528000000004\tKenneth City town\tFL\tFlorida\tPinellas County\t4290\t43.5\t13.5\t11.9\t21691\t84444\t0.5224\t33709\tObama\t33709\t0.009095428000000001\t33709.0\n3608\t-82.81168000000001\t27.8125\tRedington Beach town\tFL\tFlorida\tPinellas County\t1543\t59.2\t43.9\t11.4\t43959\t231481\t0.5224\t33708\tObama\t33708\t0.003271386\t33708.0\n3609\t-82.664709\t27.791296999999997\tSt. Petersburg city\tFL\tFlorida\tPinellas County\t244845\t42.8\t27.3\t13.1\t26111\t98204\t0.5224\t33713\tObama\t33713\t0.519107234\t33713.0\n3610\t-82.738198\t27.755857000000002\tSouth Pasadena city\tFL\tFlorida\tPinellas County\t5659\t69.9\t26.4\t11.8\t31221\t112388\t0.5224\t33706\tObama\t33706\t0.011997908\t33706.0\n3611\t-82.83133000000001\t27.828856\tRedington Shores town\tFL\tFlorida\tPinellas County\t2292\t60.4\t34.1\t11.9\t42293\t195216\t0.5224\t33776\tObama\t33776\t0.004859375\t33776.0\n3612\t-82.845848\t27.895196999999996\tIndian Rocks Beach city\tFL\tFlorida\tPinellas County\t4836\t52.5\t44.7\t9.1\t44260\t242708\t0.5224\t33785\tObama\t33785\t0.010253028\t33785.0\n3613\t-82.787308\t27.840732\tSeminole city\tFL\tFlorida\tPinellas County\t10488\t57.8\t22.6\t11.5\t27977\t92528\t0.5224\t33772\tObama\t33772\t0.022236095\t33772.0\n3614\t-82.689625\t27.820071999999996\tWest and East Lealman CDP\tFL\tFlorida\tPinellas County\t22029\t45.2\t12.2\t12.6\t20045\t64107\t0.5224\t33714\tObama\t33714\t0.04670470400000001\t33714.0\n3615\t-82.747744\t27.980708\tClearwater city\tFL\tFlorida\tPinellas County\t109911\t44.9\t28.1\t12.2\t27201\t112942\t0.5224\t33765\tObama\t33765\t0.23302740600000002\t33765.0\n3616\t-82.676076\t27.905721999999997\tFeather Sound CDP\tFL\tFlorida\tPinellas County\t3936\t39.0\t54.4\t10.9\t49751\t144643\t0.5224\t33762\tObama\t33762\t0.008344896\t33762.0\n3617\t-82.825059\t27.907176\tHarbor Bluffs CDP\tFL\tFlorida\tPinellas County\t2803\t51.8\t47.8\t8.0\t45078\t200119\t0.5224\t33774\tObama\t33774\t0.00594277\t33774.0\n3618\t-82.845502\t27.916806\tBelleair Shore town\tFL\tFlorida\tPinellas County\t0\t0.0\t0.0\t0.0\t0\t0\t0.5224\t33786\tObama\t33786\t0.0\t33786.0\n3619\t-82.80823199999999\t27.935837\tBelleair town\tFL\tFlorida\tPinellas County\t3868\t55.4\t54.1\t11.9\t61360\t246061\t0.5224\t33770\tObama\t33770\t0.008200726\t33770.0\n3620\t-82.779146\t27.908635999999998\tLargo city\tFL\tFlorida\tPinellas County\t69072\t49.7\t20.2\t11.4\t24140\t82277\t0.5224\t33770\tObama\t33770\t0.146442749\t33770.0\n3621\t-82.820686\t27.82103\tNorth Redington Beach town\tFL\tFlorida\tPinellas County\t1530\t59.3\t42.1\t12.0\t41365\t270089\t0.5224\t33708\tObama\t33708\t0.003243824\t33708.0\n3622\t-82.841074\t27.924274\tBelleair Beach city\tFL\tFlorida\tPinellas County\t1661\t63.1\t54.4\t11.8\t61561\t273837\t0.5224\t33786\tObama\t33786\t0.0035215629999999997\t33786.0\n3623\t-82.747338\t28.084478000000004\tPalm Harbor CDP\tFL\tFlorida\tPinellas County\t59578\t47.9\t33.5\t11.0\t31695\t143692\t0.5224\t34683\tObama\t34683\t0.12631408\t34683.0\n3624\t-82.686725\t28.119834\tEast Lake CDP\tFL\tFlorida\tPinellas County\t32064\t45.8\t48.3\t11.0\t43557\t240917\t0.5224\t34685\tObama\t34685\t0.067980373\t34685.0\n3625\t-82.84448\t27.85333\tIndian Shores town\tFL\tFlorida\tPinellas County\t1798\t62.3\t37.5\t10.7\t48844\t191992\t0.5224\t33776\tObama\t33776\t0.003812023\t33776.0\n3626\t-82.81715200000001\t27.919938000000002\tBelleair Bluffs city\tFL\tFlorida\tPinellas County\t2265\t56.7\t31.0\t8.2\t33507\t127536\t0.5224\t33770\tObama\t33770\t0.004802130999999999\t33770.0\n3627\t-81.795436\t27.752981\tFort Meade city\tFL\tFlorida\tPolk County\t5869\t38.1\t8.6\t20.7\t18744\t74385\t0.4609\t33841\tObama\t33841\t0.012443138999999999\t33841.0\n3628\t-81.906502\t28.036996999999996\tCrystal Lake CDP\tFL\tFlorida\tPolk County\t5141\t30.2\t16.5\t18.8\t17128\t80977\t0.4609\t33801\tObama\t33801\t0.010899672\t33801.0\n3629\t-81.568558\t28.237876\tLoughman CDP\tFL\tFlorida\tPolk County\t2358\t43.5\t15.5\t9.7\t22531\t110894\t0.4609\t33837\tObama\t33837\t0.004999305\t33837.0\n3630\t-82.012124\t28.038939000000003\tWinston CDP\tFL\tFlorida\tPolk County\t9316\t40.5\t11.1\t17.4\t18216\t57695\t0.4609\t33815\tObama\t33815\t0.019751283\t33815.0\n3631\t-81.620074\t27.979211\tWaverly CDP\tFL\tFlorida\tPolk County\t1990\t54.9\t11.0\t26.8\t20269\t61204\t0.4609\t33877\tObama\t33877\t0.0042190909999999995\t33877.0\n3632\t-81.726128\t28.092696999999998\tLake Alfred city\tFL\tFlorida\tPolk County\t4995\t42.8\t19.5\t15.7\t21378\t91852\t0.4609\t33850\tObama\t33850\t0.010590131000000001\t33850.0\n3633\t-81.605761\t28.161686\tDavenport city\tFL\tFlorida\tPolk County\t2262\t42.9\t15.6\t15.6\t19394\t100625\t0.4609\t33844\tObama\t33844\t0.004795771\t33844.0\n3634\t-81.949089\t27.958686\tLakeland Highlands CDP\tFL\tFlorida\tPolk County\t13408\t43.6\t45.2\t11.2\t37142\t182824\t0.4609\t33813\tObama\t33813\t0.028426922\t33813.0\n3635\t-81.976431\t27.9034\tMulberry city\tFL\tFlorida\tPolk County\t3286\t37.8\t17.2\t16.0\t21787\t91833\t0.4609\t33860\tObama\t33860\t0.006966801\t33860.0\n3636\t-81.729458\t27.957876000000002\tWahneta CDP\tFL\tFlorida\tPolk County\t5117\t29.4\t2.5\t21.7\t10779\t59722\t0.4609\t33839\tObama\t33839\t0.010848789\t33839.0\n3637\t-81.853994\t28.058945\tFussels Corner CDP\tFL\tFlorida\tPolk County\t5467\t44.2\t11.5\t18.1\t17942\t77346\t0.4609\t33823\tObama\t33823\t0.01159084\t33823.0\n3638\t-81.533979\t27.824193\tHillcrest Heights town\tFL\tFlorida\tPolk County\t309\t41.5\t20.1\t13.3\t18903\t101471\t0.4609\t33827\tObama\t33827\t0.000655125\t33827.0\n3639\t-81.618882\t28.017153000000004\tDundee town\tFL\tFlorida\tPolk County\t3616\t42.2\t10.2\t16.2\t17701\t89940\t0.4609\t33838\tObama\t33838\t0.0076664490000000005\t33838.0\n3640\t-81.906051\t28.059184000000002\tCombee Settlement CDP\tFL\tFlorida\tPolk County\t5310\t40.0\t8.6\t17.7\t17280\t72553\t0.4609\t33801\tObama\t33801\t0.011257976999999999\t33801.0\n3641\t-81.76764\t28.038729999999997\tInwood CDP\tFL\tFlorida\tPolk County\t6727\t37.4\t7.7\t18.2\t16010\t71765\t0.4609\t33881\tObama\t33881\t0.014262225\t33881.0\n3642\t-81.825717\t28.18148\tPolk City town\tFL\tFlorida\tPolk County\t1674\t42.0\t12.2\t14.3\t18867\t88152\t0.4609\t33868\tObama\t33868\t0.003549125\t33868.0\n3643\t-81.686284\t28.002682\tCypress Gardens CDP\tFL\tFlorida\tPolk County\t9685\t47.8\t33.6\t10.1\t32261\t134604\t0.4609\t33884\tObama\t33884\t0.020533617\t33884.0\n3644\t-81.9654\t28.043020000000002\tLakeland city\tFL\tFlorida\tPolk County\t85266\t39.8\t23.6\t16.4\t22954\t98711\t0.4609\t33815\tObama\t33815\t0.18077639899999998\t33815.0\n3645\t-82.031548\t28.136616999999998\tKathleen CDP\tFL\tFlorida\tPolk County\t3293\t40.5\t10.6\t12.6\t19333\t95000\t0.4609\t33810\tObama\t33810\t0.006981642\t33810.0\n3646\t-81.527733\t27.833857000000002\tBabson Park CDP\tFL\tFlorida\tPolk County\t1408\t42.4\t19.5\t13.2\t19245\t91667\t0.4609\t33827\tObama\t33827\t0.0029851659999999996\t33827.0\n3647\t-81.794022\t28.078727\tAuburndale city\tFL\tFlorida\tPolk County\t12251\t40.1\t15.2\t16.1\t21827\t100106\t0.4609\t33823\tObama\t33823\t0.025973912999999998\t33823.0\n3648\t-81.879788\t27.959846000000002\tHighland City CDP\tFL\tFlorida\tPolk County\t2328\t35.8\t14.6\t12.9\t21071\t97920\t0.4609\t33813\tObama\t33813\t0.004935701\t33813.0\n3649\t-81.84178399999999\t27.901559999999996\tBartow city\tFL\tFlorida\tPolk County\t15837\t37.6\t20.6\t19.4\t22516\t92652\t0.4609\t33830\tObama\t33830\t0.033576758\t33830.0\n3650\t-81.986645\t27.957007\tMedulla CDP\tFL\tFlorida\tPolk County\t7546\t37.2\t19.6\t11.6\t24446\t127727\t0.4609\t33811\tObama\t33811\t0.015998624\t33811.0\n3651\t-81.627443\t28.107765\tHaines City\tFL\tFlorida\tPolk County\t16708\t35.5\t12.0\t17.0\t15681\t73678\t0.4609\t33844\tObama\t33844\t0.035423405\t33844.0\n3652\t-81.603373\t27.918337\tLake Wales city\tFL\tFlorida\tPolk County\t12215\t41.8\t20.6\t19.0\t19778\t86988\t0.4609\t33877\tObama\t33877\t0.025897588\t33877.0\n3653\t-82.024387\t27.921753000000002\tWillow Oak CDP\tFL\tFlorida\tPolk County\t6645\t31.3\t8.9\t13.6\t18326\t88064\t0.4609\t33811\tObama\t33811\t0.014088373000000001\t33811.0\n3654\t-81.531707\t27.746913\tFrostproof city\tFL\tFlorida\tPolk County\t2993\t35.7\t12.2\t17.9\t17490\t66875\t0.4609\t33843\tObama\t33843\t0.006345598\t33843.0\n3655\t-81.589711\t27.829744\tCrooked Lake Park CDP\tFL\tFlorida\tPolk County\t1875\t49.0\t25.5\t8.1\t21886\t80286\t0.4609\t338HH\tObama\t338HH\t0.003975274\t0.0\n3656\t-81.712622\t28.040046999999998\tWinter Haven city\tFL\tFlorida\tPolk County\t27169\t46.0\t20.8\t16.6\t22769\t93837\t0.4609\t33881\tObama\t33881\t0.057602256\t33881.0\n3657\t-81.968345\t28.11617\tGibsonia CDP\tFL\tFlorida\tPolk County\t6249\t47.5\t24.6\t12.1\t26237\t116199\t0.4609\t33809\tObama\t33809\t0.013248795\t33809.0\n3658\t-81.627482\t28.047441\tLake Hamilton town\tFL\tFlorida\tPolk County\t1304\t50.2\t15.0\t22.4\t17983\t73750\t0.4609\t33851\tObama\t33851\t0.002764671\t33851.0\n3659\t-81.750709\t27.980499\tEagle Lake city\tFL\tFlorida\tPolk County\t2920\t36.2\t9.5\t15.0\t16341\t75563\t0.4609\t33839\tObama\t33839\t0.0061908269999999994\t33839.0\n3660\t-81.561854\t27.864671\tHighland Park village\tFL\tFlorida\tPolk County\t287\t49.0\t19.5\t10.4\t22075\t77333\t0.4609\t33853\tObama\t33853\t0.0006084819999999999\t33853.0\n3661\t-81.793062\t28.019988\tJan Phyl Village CDP\tFL\tFlorida\tPolk County\t5779\t35.1\t15.3\t12.9\t21699\t96983\t0.4609\t33823\tObama\t33823\t0.012252326000000001\t33823.0\n3662\t-81.66425799999999\t29.483494\tWelaka town\tFL\tFlorida\tPutnam County\t590\t57.3\t17.0\t12.9\t18970\t111328\t0.3725\t32193\tObama\t32193\t0.001250886\t32193.0\n3663\t-81.516816\t29.437153000000002\tCrescent City\tFL\tFlorida\tPutnam County\t1735\t42.7\t17.6\t13.9\t15217\t120975\t0.3725\t32112\tObama\t32112\t0.0036784540000000003\t32112.0\n3664\t-81.657268\t29.649293\tPalatka city\tFL\tFlorida\tPutnam County\t10096\t36.2\t13.7\t23.2\t15191\t102083\t0.3725\t32177\tObama\t32177\t0.021404997999999998\t32177.0\n3665\t-81.89616099999999\t29.620348\tInterlachen town\tFL\tFlorida\tPutnam County\t1669\t41.4\t11.1\t14.8\t13708\t80870\t0.3725\t32148\tObama\t32148\t0.0035385240000000004\t32148.0\n3666\t-81.59821099999999\t29.650608000000002\tEast Palatka CDP\tFL\tFlorida\tPutnam County\t1753\t41.7\t15.3\t9.7\t22220\t121833\t0.3725\t32131\tObama\t32131\t0.003716617\t32131.0\n3667\t-81.59366999999999\t29.50105\tPomona Park town\tFL\tFlorida\tPutnam County\t784\t53.0\t11.8\t15.7\t17823\t100000\t0.3725\t32181\tObama\t32181\t0.001662195\t32181.0\n3668\t-81.32073199999999\t29.901304999999997\tSt. Augustine city\tFL\tFlorida\tSt. Johns County\t13270\t44.6\t35.4\t11.7\t28132\t171386\t0.3065\t320HH\tObama\t320HH\t0.028134342000000003\t0.0\n3669\t-81.309251\t29.808315999999998\tSt. Augustine Shores CDP\tFL\tFlorida\tSt. Johns County\t5672\t50.1\t27.5\t12.2\t26311\t144811\t0.3065\t32086\tObama\t32086\t0.01202547\t32086.0\n3670\t-81.370074\t30.189589\tSawgrass CDP\tFL\tFlorida\tSt. Johns County\t5216\t57.7\t67.2\t8.6\t72223\t482460\t0.3065\t32082\tObama\t32082\t0.011058683\t32082.0\n3671\t-81.314708\t29.843782\tSt. Augustine South CDP\tFL\tFlorida\tSt. Johns County\t5689\t44.1\t26.8\t10.3\t28364\t166111\t0.3065\t32086\tObama\t32086\t0.012061513000000001\t32086.0\n3672\t-81.394813\t30.200846999999996\tPalm Valley CDP\tFL\tFlorida\tSt. Johns County\t22156\t42.7\t60.6\t10.1\t50774\t398159\t0.3065\t32082\tObama\t32082\t0.046973963\t32082.0\n3673\t-81.26467\t29.797279\tButler Beach CDP\tFL\tFlorida\tSt. Johns County\t4663\t59.4\t44.9\t10.6\t44374\t267105\t0.3065\t32086\tObama\t32086\t0.009886242\t32086.0\n3674\t-81.508071\t29.715665\tHastings town\tFL\tFlorida\tSt. Johns County\t880\t39.8\t10.9\t17.5\t13902\t74375\t0.3065\t32145\tObama\t32145\t0.001865729\t32145.0\n3675\t-81.27071600000001\t29.841399\tSt. Augustine Beach city\tFL\tFlorida\tSt. Johns County\t6883\t44.7\t46.8\t8.4\t36654\t232403\t0.3065\t32084\tObama\t32084\t0.014592967\t32084.0\n3676\t-81.301574\t29.934898999999998\tVillano Beach CDP\tFL\tFlorida\tSt. Johns County\t2765\t51.1\t55.4\t9.8\t46694\t334395\t0.3065\t32095\tObama\t32095\t0.005862205\t32095.0\n3677\t-81.241453\t29.734687\tCrescent Beach CDP\tFL\tFlorida\tSt. Johns County\t956\t56.6\t31.9\t8.6\t28209\t211413\t0.3065\t32086\tObama\t32086\t0.00202686\t32086.0\n3678\t-81.614395\t30.095874\tFruit Cove CDP\tFL\tFlorida\tSt. Johns County\t30320\t38.4\t48.4\t7.9\t41982\t284148\t0.3065\t32259\tObama\t32259\t0.064282837\t32259.0\n3679\t-80.358698\t27.409270000000003\tFort Pierce South CDP\tFL\tFlorida\tSt. Lucie County\t6090\t35.1\t14.8\t14.4\t18673\t94728\t0.5354\t34981\tObama\t34981\t0.012911691000000001\t34981.0\n3680\t-80.34223100000001\t27.376112\tWhite City CDP\tFL\tFlorida\tSt. Lucie County\t4933\t46.0\t19.6\t12.0\t23451\t118931\t0.5354\t34982\tObama\t34982\t0.010458682\t34982.0\n3681\t-80.330793\t27.321494\tPort St. Lucie-River Park CDP\tFL\tFlorida\tSt. Lucie County\t5765\t51.2\t13.8\t14.8\t22111\t87705\t0.5354\t34983\tObama\t34983\t0.012222644\t34983.0\n3682\t-80.342294\t27.498858000000002\tSt. Lucie village\tFL\tFlorida\tSt. Lucie County\t639\t46.8\t22.2\t12.0\t24616\t120455\t0.5354\t34946\tObama\t34946\t0.001354774\t34946.0\n3683\t-80.35871\t27.473481\tFort Pierce North CDP\tFL\tFlorida\tSt. Lucie County\t7868\t38.3\t12.6\t20.2\t13769\t66716\t0.5354\t34946\tObama\t34946\t0.016681312\t34946.0\n3684\t-80.339641\t27.427172\tFort Pierce city\tFL\tFlorida\tSt. Lucie County\t38053\t36.1\t14.3\t21.7\t15708\t77691\t0.5354\t34950\tObama\t34950\t0.08067792900000001\t34950.0\n3685\t-80.29921\t27.356823\tIndian River Estates CDP\tFL\tFlorida\tSt. Lucie County\t6467\t52.3\t10.5\t14.6\t21118\t107712\t0.5354\t34982\tObama\t34982\t0.013710986000000001\t34982.0\n3686\t-80.35329300000001\t27.282968\tPort St. Lucie city\tFL\tFlorida\tSt. Lucie County\t153634\t44.2\t18.7\t11.4\t23981\t118539\t0.5354\t34984\tObama\t34984\t0.325726565\t34984.0\n3687\t-80.235332\t27.328540000000004\tHutchinson Island South CDP\tFL\tFlorida\tSt. Lucie County\t5183\t71.0\t26.5\t14.2\t39965\t155199\t0.5354\t34952\tObama\t34952\t0.010988719\t34952.0\n3688\t-80.386583\t27.53905\tLakewood Park CDP\tFL\tFlorida\tSt. Lucie County\t11250\t50.2\t13.7\t12.4\t22470\t89577\t0.5354\t34951\tObama\t34951\t0.023851646\t34951.0\n3689\t-87.160151\t30.362909000000002\tGulf Breeze city\tFL\tFlorida\tSanta Rosa County\t5680\t50.4\t53.0\t8.8\t36548\t216456\t0.2312\t32561\tObama\t32561\t0.012042431000000001\t32561.0\n3690\t-87.035387\t30.590365000000002\tBagdad CDP\tFL\tFlorida\tSanta Rosa County\t2061\t41.1\t23.1\t11.7\t21281\t90750\t0.2312\t32583\tObama\t32583\t0.004369622\t32583.0\n3691\t-87.152088\t30.950449\tJay town\tFL\tFlorida\tSanta Rosa County\t660\t44.0\t15.9\t10.9\t16567\t67600\t0.2312\t32565\tObama\t32565\t0.001399297\t32565.0\n3692\t-87.161183\t30.599541\tPace CDP\tFL\tFlorida\tSanta Rosa County\t8643\t37.9\t17.6\t11.1\t21134\t112024\t0.2312\t32571\tObama\t32571\t0.018324425\t32571.0\n3693\t-87.049625\t30.631573\tMilton city\tFL\tFlorida\tSanta Rosa County\t8172\t37.1\t20.4\t14.5\t19290\t96160\t0.2312\t32583\tObama\t32583\t0.017325836\t32583.0\n3694\t-82.47245\t27.365170000000003\tThe Meadows CDP\tFL\tFlorida\tSarasota County\t4026\t71.0\t48.5\t11.3\t44260\t178543\t0.4584\t34235\tObama\t34235\t0.008535709\t34235.0\n3695\t-82.478131\t27.191353999999997\tOsprey CDP\tFL\tFlorida\tSarasota County\t6841\t55.7\t39.3\t9.8\t56086\t300687\t0.4584\t34229\tObama\t34229\t0.014503921000000001\t34229.0\n3696\t-82.461585\t27.332746999999998\tFruitville CDP\tFL\tFlorida\tSarasota County\t13583\t41.9\t32.3\t11.0\t30572\t161924\t0.4584\t34232\tObama\t34232\t0.028797947999999997\t34232.0\n3697\t-82.434984\t27.123818\tNokomis CDP\tFL\tFlorida\tSarasota County\t3313\t55.9\t16.2\t11.9\t27372\t87119\t0.4584\t34275\tObama\t34275\t0.007024045\t34275.0\n3698\t-82.40580899999999\t27.069222999999997\tVenice Gardens CDP\tFL\tFlorida\tSarasota County\t7486\t56.2\t20.9\t9.2\t27954\t122230\t0.4584\t34293\tObama\t34293\t0.015871416\t34293.0\n3699\t-82.517804\t27.370972\tNorth Sarasota CDP\tFL\tFlorida\tSarasota County\t7084\t45.3\t14.8\t12.4\t21594\t82966\t0.4584\t34234\tObama\t34234\t0.015019117\t34234.0\n3700\t-82.461056\t27.145722999999997\tLaurel CDP\tFL\tFlorida\tSarasota County\t8242\t61.1\t29.1\t11.1\t36174\t160714\t0.4584\t34275\tObama\t34275\t0.017474246000000002\t34275.0\n3701\t-82.496989\t27.285589\tSouth Gate Ridge CDP\tFL\tFlorida\tSarasota County\t5618\t46.6\t30.8\t6.6\t28592\t132887\t0.4584\t34233\tObama\t34233\t0.011910981999999999\t34233.0\n3702\t-82.325322\t26.976931\tEnglewood CDP\tFL\tFlorida\tSarasota County\t16681\t65.0\t20.2\t14.3\t29714\t103534\t0.4584\t34223\tObama\t34223\t0.035366161\t34223.0\n3703\t-82.428966\t27.101470000000003\tVenice city\tFL\tFlorida\tSarasota County\t19995\t69.1\t30.4\t9.6\t34540\t127586\t0.4584\t34292\tObama\t34292\t0.042392325999999994\t34292.0\n3704\t-82.506629\t27.258677000000002\tGulf Gate Estates CDP\tFL\tFlorida\tSarasota County\t11166\t54.2\t27.6\t9.9\t28107\t129801\t0.4584\t34231\tObama\t34231\t0.023673554\t34231.0\n3705\t-82.493253\t27.359019\tKensington Park CDP\tFL\tFlorida\tSarasota County\t3792\t43.8\t22.7\t12.9\t26642\t110071\t0.4584\t34235\tObama\t34235\t0.008039595\t34235.0\n3706\t-82.509697\t27.308345000000003\tSouthgate CDP\tFL\tFlorida\tSarasota County\t7098\t51.4\t26.5\t8.2\t30925\t140982\t0.4584\t34239\tObama\t34239\t0.015048799\t34239.0\n3707\t-82.53180400000001\t27.285397999999997\tSouth Sarasota CDP\tFL\tFlorida\tSarasota County\t5337\t54.7\t45.8\t12.4\t50441\t230521\t0.4584\t34242\tObama\t34242\t0.011315221\t34242.0\n3708\t-82.513624\t27.287401000000003\tRidge Wood Heights CDP\tFL\tFlorida\tSarasota County\t4891\t43.8\t24.1\t9.8\t27361\t119869\t0.4584\t34231\tObama\t34231\t0.010369636\t34231.0\n3709\t-82.437022\t27.291551000000002\tLake Sarasota CDP\tFL\tFlorida\tSarasota County\t4822\t38.1\t24.2\t9.6\t25683\t146028\t0.4584\t34241\tObama\t34241\t0.010223346\t34241.0\n3710\t-82.26945500000001\t27.047166999999998\tWarm Mineral Springs CDP\tFL\tFlorida\tSarasota County\t5107\t73.0\t20.8\t18.2\t26301\t90732\t0.4584\t34287\tObama\t34287\t0.010827587\t34287.0\n3711\t-82.473115\t27.285496999999996\tBee Ridge CDP\tFL\tFlorida\tSarasota County\t9670\t54.3\t32.5\t14.7\t33286\t167522\t0.4584\t34233\tObama\t34233\t0.020501815\t34233.0\n3712\t-82.553085\t27.274744000000002\tSiesta Key CDP\tFL\tFlorida\tSarasota County\t7402\t61.9\t54.3\t9.3\t58825\t450000\t0.4584\t34242\tObama\t34242\t0.015693323000000002\t34242.0\n3713\t-82.194335\t27.053688\tNorth Port city\tFL\tFlorida\tSarasota County\t58350\t37.1\t15.5\t10.1\t24953\t118022\t0.4584\t34286\tObama\t34286\t0.12371054\t34286.0\n3714\t-82.526822\t27.34161\tSarasota city\tFL\tFlorida\tSarasota County\t52945\t44.6\t28.5\t14.0\t27850\t125637\t0.4584\t34237\tObama\t34237\t0.11225114900000001\t34237.0\n3715\t-82.478932\t27.309233000000003\tSarasota Springs CDP\tFL\tFlorida\tSarasota County\t15431\t45.3\t21.9\t13.0\t25979\t119984\t0.4584\t34232\tObama\t34232\t0.032715978\t34232.0\n3716\t-82.369007\t27.064885999999998\tPlantation CDP\tFL\tFlorida\tSarasota County\t4204\t70.2\t31.3\t20.4\t36720\t209065\t0.4584\t34293\tObama\t34293\t0.008913095\t34293.0\n3717\t-82.41483199999999\t27.043714\tSouth Venice CDP\tFL\tFlorida\tSarasota County\t13627\t49.2\t16.7\t13.6\t22921\t108359\t0.4584\t34293\tObama\t34293\t0.028891234\t34293.0\n3718\t-82.492295\t27.225925\tVamo CDP\tFL\tFlorida\tSarasota County\t5304\t56.1\t45.2\t11.5\t36458\t169182\t0.4584\t34238\tObama\t34238\t0.011245256\t34238.0\n3719\t-82.496835\t27.373040999999997\tDesoto Lakes CDP\tFL\tFlorida\tSarasota County\t3187\t45.6\t31.6\t13.5\t32011\t147642\t0.4584\t34235\tObama\t34235\t0.006756906\t34235.0\n3720\t-81.39518100000001\t28.661974\tAltamonte Springs city\tFL\tFlorida\tSeminole County\t42839\t36.7\t32.6\t11.2\t27628\t133818\t0.4623\t32714\tObama\t32714\t0.09082495\t32714.0\n3721\t-81.115847\t28.638002\tChuluota CDP\tFL\tFlorida\tSeminole County\t2631\t37.5\t29.0\t9.3\t29136\t173549\t0.4623\t32766\tObama\t32766\t0.005578105\t32766.0\n3722\t-81.444325\t28.661861\tForest City CDP\tFL\tFlorida\tSeminole County\t13299\t37.4\t30.1\t10.5\t29314\t140540\t0.4623\t32714\tObama\t32714\t0.028195826\t32714.0\n3723\t-81.33533299999999\t28.759290000000004\tLake Mary city\tFL\tFlorida\tSeminole County\t13230\t40.0\t37.2\t8.8\t35119\t202957\t0.4623\t32746\tObama\t32746\t0.028049536\t32746.0\n3724\t-81.322337\t28.662369\tCasselberry city\tFL\tFlorida\tSeminole County\t24937\t38.8\t22.4\t12.4\t25020\t115979\t0.4623\t32707\tObama\t32707\t0.05287009\t32707.0\n3725\t-81.227912\t28.794079999999997\tMidway CDP\tFL\tFlorida\tSeminole County\t1919\t38.6\t9.0\t15.3\t15541\t66700\t0.4623\t32773\tObama\t32773\t0.004068561\t32773.0\n3726\t-81.345596\t28.648532\tFern Park CDP\tFL\tFlorida\tSeminole County\t8502\t41.6\t33.2\t9.6\t27672\t143577\t0.4623\t32730\tObama\t32730\t0.018025483999999998\t32730.0\n3727\t-81.277736\t28.789641999999997\tSanford city\tFL\tFlorida\tSeminole County\t47427\t34.6\t16.9\t13.3\t21472\t97275\t0.4623\t32771\tObama\t32771\t0.10055218099999999\t32771.0\n3728\t-81.34798\t28.701331\tLongwood city\tFL\tFlorida\tSeminole County\t13987\t40.5\t26.3\t11.5\t26389\t142670\t0.4623\t32750\tObama\t32750\t0.029654487\t32750.0\n3729\t-81.18616\t28.656940000000002\tOviedo city\tFL\tFlorida\tSeminole County\t35303\t34.0\t42.4\t9.5\t30292\t166597\t0.4623\t32765\tObama\t32765\t0.074847527\t32765.0\n3730\t-81.287683\t28.617679\tGoldenrod CDP\tFL\tFlorida\tSeminole County\t12909\t34.0\t29.6\t13.2\t23943\t130013\t0.4623\t32792\tObama\t32792\t0.027368969\t32792.0\n3731\t-81.271839\t28.688840000000003\tWinter Springs city\tFL\tFlorida\tSeminole County\t34843\t40.4\t36.9\t11.3\t32872\t158516\t0.4623\t32708\tObama\t32708\t0.07387225900000001\t32708.0\n3732\t-81.114255\t28.737692\tGeneva CDP\tFL\tFlorida\tSeminole County\t2939\t43.3\t21.1\t8.4\t27260\t158140\t0.4623\t32732\tObama\t32732\t0.00623111\t32732.0\n3733\t-81.42493499999999\t28.698526\tWekiwa Springs CDP\tFL\tFlorida\tSeminole County\t23210\t46.1\t52.2\t10.5\t40436\t219391\t0.4623\t32779\tObama\t32779\t0.049208597\t32779.0\n3734\t-81.371651\t28.775610999999998\tHeathrow CDP\tFL\tFlorida\tSeminole County\t4846\t44.9\t55.1\t8.8\t68456\t334400\t0.4623\t32746\tObama\t32746\t0.010274229000000001\t32746.0\n3735\t-82.051051\t28.611533\tWebster city\tFL\tFlorida\tSumter County\t1148\t38.4\t9.9\t11.2\t15188\t92857\t0.3228\t33514\tObama\t33514\t0.0024339279999999997\t33514.0\n3736\t-82.04267800000001\t28.845906\tWildwood city\tFL\tFlorida\tSumter County\t3846\t48.1\t12.6\t11.0\t16773\t74098\t0.3228\t34785\tObama\t34785\t0.008154083000000001\t34785.0\n3737\t-81.997387\t28.647747999999996\tCenter Hill city\tFL\tFlorida\tSumter County\t1638\t35.2\t10.9\t11.8\t14894\t87576\t0.3228\t33514\tObama\t33514\t0.0034728000000000003\t33514.0\n3738\t-81.982221\t28.939999\tThe Villages CDP\tFL\tFlorida\tSumter County\t14860\t72.5\t27.2\t12.4\t36015\t246699\t0.3228\t32159\tObama\t32159\t0.031505375\t32159.0\n3739\t-82.115926\t28.66545\tBushnell city\tFL\tFlorida\tSumter County\t2315\t45.1\t12.7\t9.2\t17557\t94886\t0.3228\t33513\tObama\t33513\t0.004908139000000001\t33513.0\n3740\t-82.13186400000001\t28.787453999999997\tLake Panasoffkee CDP\tFL\tFlorida\tSumter County\t5712\t54.8\t9.3\t9.1\t19998\t79300\t0.3228\t33538\tObama\t33538\t0.012110276000000001\t33538.0\n3741\t-82.069148\t28.801458\tColeman city\tFL\tFlorida\tSumter County\t1093\t41.4\t8.5\t10.9\t15980\t81579\t0.3228\t33521\tObama\t33521\t0.00231732\t33521.0\n3742\t-82.927429\t29.962649\tBranford town\tFL\tFlorida\tSuwannee County\t798\t38.9\t16.5\t11.2\t14759\t106977\t0.2695\t32008\tObama\t32008\t0.001691877\t32008.0\n3743\t-82.986359\t30.293239\tLive Oak city\tFL\tFlorida\tSuwannee County\t7254\t38.0\t15.3\t17.8\t15685\t98545\t0.2695\t32060\tObama\t32060\t0.015379542\t32060.0\n3744\t-83.581944\t30.109415000000002\tPerry city\tFL\tFlorida\tTaylor County\t7010\t38.0\t12.0\t12.6\t16879\t91012\t0.3031\t32347\tObama\t32347\t0.014862226000000001\t32347.0\n3745\t-82.23889399999999\t30.063769\tRaiford town\tFL\tFlorida\tUnion County\t213\t39.7\t8.5\t3.1\t18694\t83750\t0.2483\t32083\tObama\t32083\t0.000451591\t32083.0\n3746\t-82.424177\t29.932472999999998\tWorthington Springs town\tFL\tFlorida\tUnion County\t195\t29.1\t14.3\t11.4\t18593\t90833\t0.2483\t32697\tObama\t32697\t0.000413429\t32697.0\n3747\t-82.33915400000001\t30.021212\tLake Butler city\tFL\tFlorida\tUnion County\t2103\t35.0\t10.4\t9.8\t19174\t101326\t0.2483\t32054\tObama\t32054\t0.004458668\t32054.0\n3748\t-81.05888900000001\t29.048367\tSamsula-Spruce Creek CDP\tFL\tFlorida\tVolusia County\t6075\t52.8\t28.7\t9.1\t32868\t183681\t0.4893\t32124\tObama\t32124\t0.012879888999999999\t32124.0\n3749\t-81.28961600000001\t28.933366999999997\tOrange City\tFL\tFlorida\tVolusia County\t8467\t52.8\t16.1\t13.3\t22807\t86049\t0.4893\t32763\tObama\t32763\t0.017951279\t32763.0\n3750\t-81.296447\t29.048357\tNorth De Land CDP\tFL\tFlorida\tVolusia County\t1523\t39.6\t21.5\t11.5\t21609\t91378\t0.4893\t32724\tObama\t32724\t0.003228983\t32724.0\n3751\t-81.00959499999999\t29.165408000000003\tSouth Daytona city\tFL\tFlorida\tVolusia County\t13471\t43.2\t16.6\t15.1\t21901\t105817\t0.4893\t32119\tObama\t32119\t0.028560492000000003\t32119.0\n3752\t-81.102401\t29.286374\tOrmond Beach city\tFL\tFlorida\tVolusia County\t40625\t51.0\t31.8\t11.1\t29266\t139679\t0.4893\t32174\tObama\t32174\t0.086130946\t32174.0\n3753\t-81.231277\t28.983975\tLake Helen city\tFL\tFlorida\tVolusia County\t2838\t46.3\t16.4\t10.2\t21226\t94387\t0.4893\t32744\tObama\t32744\t0.006016975\t32744.0\n3754\t-81.21647800000001\t28.908873999999997\tDeltona city\tFL\tFlorida\tVolusia County\t81543\t39.6\t16.3\t12.5\t21195\t113809\t0.4893\t32738\tObama\t32738\t0.172883094\t32738.0\n3755\t-81.023831\t29.023589\tNew Smyrna Beach city\tFL\tFlorida\tVolusia County\t23631\t56.2\t26.3\t12.5\t27180\t139178\t0.4893\t32168\tObama\t32168\t0.050101179\t32168.0\n3756\t-81.32374\t28.881117\tDe Bary city\tFL\tFlorida\tVolusia County\t18209\t49.4\t20.1\t10.5\t27042\t118483\t0.4893\t32713\tObama\t32713\t0.038605745\t32713.0\n3757\t-81.35175500000001\t29.11722\tDe Leon Springs CDP\tFL\tFlorida\tVolusia County\t3057\t32.0\t9.4\t9.3\t14138\t95190\t0.4893\t32130\tObama\t32130\t0.006481287\t32130.0\n3758\t-80.904971\t28.967295\tEdgewater city\tFL\tFlorida\tVolusia County\t21017\t46.1\t12.6\t12.5\t21275\t106297\t0.4893\t32132\tObama\t32132\t0.044559115999999996\t32132.0\n3759\t-81.28663399999999\t29.025062\tDe Land city\tFL\tFlorida\tVolusia County\t24944\t40.6\t23.2\t15.2\t20718\t98963\t0.4893\t32724\tObama\t32724\t0.052884930999999996\t32724.0\n3760\t-80.957633\t28.991778000000004\tGlencoe CDP\tFL\tFlorida\tVolusia County\t3117\t51.8\t22.2\t11.6\t24624\t111404\t0.4893\t32168\tObama\t32168\t0.006608496\t32168.0\n3761\t-80.939501\t29.097325\tPonce Inlet town\tFL\tFlorida\tVolusia County\t3044\t62.4\t36.4\t9.4\t42707\t229762\t0.4893\t32127\tObama\t32127\t0.006453726\t32127.0\n3762\t-81.311483\t29.007928999999997\tDe Land Southwest CDP\tFL\tFlorida\tVolusia County\t1224\t41.1\t15.5\t23.0\t13284\t71875\t0.4893\t32720\tObama\t32720\t0.002595059\t32720.0\n3763\t-80.84966\t28.867639\tOak Hill city\tFL\tFlorida\tVolusia County\t1706\t56.7\t13.0\t11.8\t19213\t94206\t0.4893\t32759\tObama\t32759\t0.00361697\t32759.0\n3764\t-81.067653\t29.343175\tOrmond-By-The-Sea CDP\tFL\tFlorida\tVolusia County\t8386\t57.4\t25.0\t10.4\t25153\t122911\t0.4893\t32176\tObama\t32176\t0.017779547\t32176.0\n3765\t-80.980859\t29.17166\tDaytona Beach Shores city\tFL\tFlorida\tVolusia County\t4651\t64.4\t29.3\t13.3\t37688\t168051\t0.4893\t32118\tObama\t32118\t0.009860800999999999\t32118.0\n3766\t-81.048118\t29.243508000000002\tHolly Hill city\tFL\tFlorida\tVolusia County\t12539\t45.3\t11.7\t13.0\t20274\t85366\t0.4893\t32117\tObama\t32117\t0.026584515\t32117.0\n3767\t-81.014894\t29.1053\tPort Orange city\tFL\tFlorida\tVolusia County\t57258\t50.6\t22.8\t11.1\t27360\t126626\t0.4893\t32127\tObama\t32127\t0.12139534\t32127.0\n3768\t-81.333862\t29.015482000000002\tWest De Land CDP\tFL\tFlorida\tVolusia County\t3568\t40.7\t19.6\t13.9\t22718\t96650\t0.4893\t32720\tObama\t32720\t0.007564682\t32720.0\n3769\t-81.458952\t29.238112\tPierson town\tFL\tFlorida\tVolusia County\t2926\t34.3\t8.8\t14.5\t15128\t96935\t0.4893\t32180\tObama\t32180\t0.006203548000000001\t32180.0\n3770\t-81.101884\t29.193103999999998\tDaytona Beach city\tFL\tFlorida\tVolusia County\t68128\t38.8\t21.8\t16.2\t20640\t104379\t0.4893\t32117\tObama\t32117\t0.144441331\t32117.0\n3771\t-84.20803000000001\t30.165427\tSt. Marks city\tFL\tFlorida\tWakulla County\t374\t38.2\t6.4\t10.3\t17918\t110577\t0.353\t32355\tObama\t32355\t0.000792935\t32355.0\n3772\t-84.48733\t30.05943\tSopchoppy city\tFL\tFlorida\tWakulla County\t535\t47.2\t24.2\t10.5\t22321\t132639\t0.353\t323HH\tObama\t323HH\t0.001134278\t0.0\n3773\t-86.132622\t30.517215999999998\tFreeport city\tFL\tFlorida\tWalton County\t1475\t41.8\t12.2\t8.6\t16651\t111957\t0.2341\t32439\tObama\t32439\t0.003127216\t32439.0\n3774\t-86.121884\t30.718740000000004\tDe Funiak Springs city\tFL\tFlorida\tWalton County\t5526\t41.7\t15.1\t11.3\t16493\t112903\t0.2341\t32433\tObama\t32433\t0.011715929\t32433.0\n3775\t-86.309488\t30.975194000000002\tPaxton town\tFL\tFlorida\tWalton County\t766\t43.9\t9.2\t12.2\t13495\t89500\t0.2341\t32567\tObama\t32567\t0.001624032\t32567.0\n3776\t-86.35990600000001\t30.381196999999997\tMiramar Beach CDP\tFL\tFlorida\tWalton County\t7838\t58.1\t36.5\t5.3\t33901\t273840\t0.2341\t32541\tObama\t32541\t0.016617707\t32541.0\n3777\t-85.54092\t30.776266999999997\tChipley city\tFL\tFlorida\tWashington County\t3685\t40.8\t18.5\t14.6\t18936\t113487\t0.2564\t32428\tObama\t32428\t0.007812739\t32428.0\n3778\t-85.879112\t30.444698\tEbro town\tFL\tFlorida\tWashington County\t299\t41.4\t1.4\t9.8\t14574\t107407\t0.2564\t32437\tObama\t32437\t0.000633924\t32437.0\n3779\t-85.706158\t30.620015000000002\tVernon city\tFL\tFlorida\tWashington County\t860\t38.2\t9.5\t15.3\t16086\t115938\t0.2564\t32463\tObama\t32463\t0.0018233260000000001\t32463.0\n3780\t-85.812078\t30.775342\tCaryville town\tFL\tFlorida\tWashington County\t226\t40.7\t6.4\t18.6\t15970\t76250\t0.2564\t32427\tObama\t32427\t0.000479153\t32427.0\n3781\t-85.587257\t30.633406\tWausau town\tFL\tFlorida\tWashington County\t455\t44.7\t10.4\t18.6\t14743\t110000\t0.2564\t32463\tObama\t32463\t0.000964667\t32463.0\n3782\t-82.502882\t31.829034000000004\tGraham city\tGA\tGeorgia\tAppling County\t331\t34.0\t9.6\t8.2\t16425\t59545\t0.2481\t31539\tRomney\t31539\t0.0012162219999999999\t31539.0\n3783\t-82.34574599999999\t31.773466\tBaxley city\tGA\tGeorgia\tAppling County\t4160\t36.8\t12.7\t14.2\t17749\t72102\t0.2481\t31513\tRomney\t31513\t0.015285446000000001\t31513.0\n3784\t-82.198741\t31.721567999999998\tSurrency town\tGA\tGeorgia\tAppling County\t264\t41.3\t7.6\t6.3\t16251\t67143\t0.2481\t31563\tRomney\t31563\t0.000970038\t31563.0\n3785\t-83.044698\t31.336142\tWillacoochee city\tGA\tGeorgia\tAtkinson County\t1645\t33.3\t9.2\t20.6\t13593\t47791\t0.3205\t31650\tRomney\t31650\t0.006044365\t31650.0\n3786\t-82.853763\t31.296924\tPearson city\tGA\tGeorgia\tAtkinson County\t1739\t29.2\t10.5\t16.3\t13945\t44681\t0.3205\t31642\tRomney\t31642\t0.006389756999999999\t31642.0\n3787\t-82.474734\t31.542514\tAlma city\tGA\tGeorgia\tBacon County\t3343\t37.9\t7.8\t12.2\t14064\t61475\t0.2012\t31510\tRomney\t31510\t0.012283472\t31510.0\n3788\t-84.337568\t31.317242999999998\tNewton city\tGA\tGeorgia\tBaker County\t836\t37.7\t10.8\t14.9\t17688\t57500\t0.4997\t317HH\tRomney\t317HH\t0.0030717870000000003\t0.0\n3789\t-83.243861\t33.052296000000005\tMidway-Hardwick CDP\tGA\tGeorgia\tBaldwin County\t4991\t35.0\t9.1\t23.1\t15610\t57671\t0.5224\t31034\tRomney\t31034\t0.018338861\t31034.0\n3790\t-83.2406\t33.087089\tMilledgeville city\tGA\tGeorgia\tBaldwin County\t20413\t33.9\t21.6\t18.7\t19475\t113784\t0.5224\t31061\tRomney\t31061\t0.075005242\t31061.0\n3791\t-83.550598\t34.2631\tMaysville town\tGA\tGeorgia\tBanks County\t1696\t37.8\t9.4\t8.6\t19805\t124713\t0.1259\t30558\tRomney\t30558\t0.006231759\t30558.0\n3792\t-83.634288\t34.310987\tGillsville city\tGA\tGeorgia\tBanks County\t230\t38.6\t9.7\t6.2\t21126\t103409\t0.1259\t30543\tRomney\t30543\t0.0008451089999999999\t30543.0\n3793\t-83.570867\t34.469529\tAlto town\tGA\tGeorgia\tBanks County\t1023\t36.3\t10.3\t6.7\t18384\t118182\t0.1259\t30510\tRomney\t30510\t0.003758897\t30510.0\n3794\t-83.498765\t34.334825\tHomer town\tGA\tGeorgia\tBanks County\t1107\t38.3\t12.5\t8.7\t19474\t119388\t0.1259\t30547\tRomney\t30547\t0.004067545\t30547.0\n3795\t-83.70945\t33.937422999999995\tBethlehem town\tGA\tGeorgia\tBarrow County\t965\t31.1\t4.6\t14.0\t22103\t131250\t0.2392\t30620\tRomney\t30620\t0.003545783\t30620.0\n3796\t-83.770669\t34.109745000000004\tBraselton town\tGA\tGeorgia\tBarrow County\t2809\t35.0\t21.8\t7.8\t30240\t172163\t0.2392\t30548\tRomney\t30548\t0.01032135\t30548.0\n3797\t-83.81136500000001\t34.005469\tCarl town\tGA\tGeorgia\tBarrow County\t220\t31.9\t11.9\t12.5\t23067\t131579\t0.2392\t30011\tRomney\t30011\t0.000808365\t30011.0\n3798\t-83.598304\t33.964768\tStatham city\tGA\tGeorgia\tBarrow County\t2537\t38.2\t10.5\t12.0\t19399\t97358\t0.2392\t30666\tRomney\t30666\t0.009321916999999999\t30666.0\n3799\t-83.829339\t34.042382\tAuburn city\tGA\tGeorgia\tBarrow County\t8251\t31.9\t12.7\t11.8\t23275\t131176\t0.2392\t30011\tRomney\t30011\t0.030317359\t30011.0\n3800\t-83.721913\t33.99217\tWinder city\tGA\tGeorgia\tBarrow County\t13404\t35.8\t16.9\t12.2\t21906\t118887\t0.2392\t30680\tRomney\t30680\t0.04925147\t30680.0\n3801\t-84.915178\t34.368912\tAdairsville city\tGA\tGeorgia\tBartow County\t3611\t35.0\t13.8\t11.3\t18528\t79040\t0.2345\t30103\tRomney\t30103\t0.013268208\t30103.0\n3802\t-84.803508\t34.167372\tCartersville city\tGA\tGeorgia\tBartow County\t20236\t37.3\t25.1\t13.8\t23135\t109265\t0.2345\t30120\tRomney\t30120\t0.074354875\t30120.0\n3803\t-84.945944\t34.236646\tKingston city\tGA\tGeorgia\tBartow County\t698\t37.2\t12.6\t9.3\t20350\t96071\t0.2345\t30145\tRomney\t30145\t0.0025647210000000003\t30145.0\n3804\t-84.746972\t34.282321\tWhite city\tGA\tGeorgia\tBartow County\t743\t37.3\t18.6\t9.1\t22516\t135268\t0.2345\t30184\tRomney\t30184\t0.0027300690000000003\t30184.0\n3805\t-84.742767\t34.128625\tEmerson city\tGA\tGeorgia\tBartow County\t1544\t38.4\t13.5\t10.7\t20761\t87708\t0.2345\t30137\tRomney\t30137\t0.005673251999999999\t30137.0\n3806\t-84.986873\t34.088775\tTaylorsville town\tGA\tGeorgia\tBartow County\t274\t38.7\t10.3\t10.3\t20153\t98500\t0.2345\t30178\tRomney\t30178\t0.001006782\t30178.0\n3807\t-84.933593\t34.143785\tEuharlee city\tGA\tGeorgia\tBartow County\t4335\t30.8\t17.9\t11.9\t23843\t112070\t0.2345\t301HH\tRomney\t301HH\t0.015928463\t0.0\n3808\t-83.253169\t31.713208\tFitzgerald city\tGA\tGeorgia\tBen Hill County\t8654\t37.4\t11.9\t15.1\t16670\t67150\t0.4218\t31750\tRomney\t31750\t0.031798137000000004\t31750.0\n3809\t-83.329003\t31.407737\tEnigma town\tGA\tGeorgia\tBerrien County\t977\t32.9\t7.9\t12.6\t15184\t65000\t0.2053\t31749\tRomney\t31749\t0.003589875\t31749.0\n3810\t-83.22337399999999\t31.382842\tAlapaha town\tGA\tGeorgia\tBerrien County\t620\t38.5\t8.4\t12.3\t16180\t53947\t0.2053\t31622\tRomney\t31622\t0.002278119\t31622.0\n3811\t-83.248437\t31.204925\tNashville city\tGA\tGeorgia\tBerrien County\t5037\t38.4\t13.6\t12.3\t16936\t73947\t0.2053\t31639\tRomney\t31639\t0.018507882\t31639.0\n3812\t-83.19702\t31.075032\tRay City\tGA\tGeorgia\tBerrien County\t784\t33.1\t9.9\t11.1\t14952\t82500\t0.2053\t31645\tRomney\t31645\t0.0028807190000000003\t31645.0\n3813\t-83.679404\t32.851828000000005\tPayne city\tGA\tGeorgia\tBibb County\t176\t41.5\t12.4\t15.2\t14754\t46250\t0.5962\t31204\tRomney\t31204\t0.0006466919999999999\t31204.0\n3814\t-83.565706\t32.882152000000005\tMacon city\tGA\tGeorgia\tBibb County\t93790\t35.0\t21.6\t15.3\t18230\t76115\t0.5962\t31211\tRomney\t31211\t0.34462066399999997\t31211.0\n3815\t-83.353792\t32.386790999999995\tCochran city\tGA\tGeorgia\tBleckley County\t5069\t27.9\t18.6\t13.3\t17908\t73973\t0.2586\t31014\tRomney\t31014\t0.018625463000000002\t31014.0\n3816\t-82.131752\t31.18153\tHoboken city\tGA\tGeorgia\tBrantley County\t467\t36.8\t8.3\t11.7\t15181\t53889\t0.1564\t31542\tRomney\t31542\t0.001715938\t31542.0\n3817\t-81.98119200000001\t31.20696\tNahunta city\tGA\tGeorgia\tBrantley County\t1137\t38.2\t11.7\t12.3\t16353\t55303\t0.1564\t31553\tRomney\t31553\t0.004177777\t31553.0\n3818\t-83.500313\t30.943341999999998\tMorven city\tGA\tGeorgia\tBrooks County\t679\t40.2\t9.5\t5.4\t15081\t52500\t0.4654\t31638\tRomney\t31638\t0.0024949079999999997\t31638.0\n3819\t-83.560621\t30.785312\tQuitman city\tGA\tGeorgia\tBrooks County\t4645\t36.1\t16.3\t11.9\t15149\t68264\t0.4654\t31643\tRomney\t31643\t0.017067523\t31643.0\n3820\t-83.735925\t30.893013\tBarwick town\tGA\tGeorgia\tBrooks County\t444\t39.8\t11.0\t11.3\t16100\t84167\t0.4654\t31720\tRomney\t31720\t0.0016314270000000002\t31720.0\n3821\t-81.30755699999999\t31.937828000000003\tRichmond Hill city\tGA\tGeorgia\tBryan County\t9961\t31.1\t24.4\t8.5\t24560\t102835\t0.2756\t31324\tRomney\t31324\t0.036600559\t31324.0\n3822\t-81.618509\t32.144255\tPembroke city\tGA\tGeorgia\tBryan County\t3030\t32.5\t12.4\t11.7\t17195\t55882\t0.2756\t31321\tRomney\t31321\t0.01113339\t31321.0\n3823\t-81.668134\t32.390347999999996\tBrooklet town\tGA\tGeorgia\tBulloch County\t1243\t37.8\t24.7\t9.2\t18272\t100543\t0.3983\t30415\tRomney\t30415\t0.004567262\t30415.0\n3824\t-81.776106\t32.440371999999996\tStatesboro city\tGA\tGeorgia\tBulloch County\t24735\t23.0\t38.1\t16.2\t16337\t122473\t0.3983\t30458\tRomney\t30458\t0.09088593800000001\t30458.0\n3825\t-81.93027099999999\t32.536389\tPortal town\tGA\tGeorgia\tBulloch County\t780\t34.7\t16.9\t9.5\t14251\t72500\t0.3983\t30450\tRomney\t30450\t0.002866021\t30450.0\n3826\t-81.88480200000001\t32.365939000000004\tRegister town\tGA\tGeorgia\tBulloch County\t181\t30.0\t10.5\t13.5\t13618\t80000\t0.3983\t30452\tRomney\t30452\t0.0006650639999999999\t30452.0\n3827\t-82.234588\t32.821727\tMidville city\tGA\tGeorgia\tBurke County\t422\t43.2\t6.6\t16.7\t11980\t29792\t0.5527\t304XX\tRomney\t304XX\t0.001550591\t0.0\n3828\t-81.712136\t33.040126\tGirard town\tGA\tGeorgia\tBurke County\t210\t36.8\t7.5\t12.6\t14325\t55000\t0.5527\t30426\tRomney\t30426\t0.0007716210000000001\t30426.0\n3829\t-82.233212\t33.24113\tKeysville town\tGA\tGeorgia\tBurke County\t228\t33.9\t5.5\t13.3\t16054\t73333\t0.5527\t30805\tRomney\t30805\t0.00083776\t30805.0\n3830\t-82.247419\t33.037603999999995\tVidette city\tGA\tGeorgia\tBurke County\t122\t39.7\t11.4\t4.5\t14200\t49643\t0.5527\t30434\tRomney\t30434\t0.000448275\t30434.0\n3831\t-82.014575\t33.090767\tWaynesboro city\tGA\tGeorgia\tBurke County\t5989\t32.4\t15.2\t17.6\t15687\t79228\t0.5527\t30830\tRomney\t30830\t0.022005898\t30830.0\n3832\t-81.76285899999999\t32.975570000000005\tSardis town\tGA\tGeorgia\tBurke County\t1150\t34.2\t10.0\t16.5\t14511\t55806\t0.5527\t30456\tRomney\t30456\t0.004225544\t30456.0\n3833\t-83.902891\t33.252484\tFlovilla city\tGA\tGeorgia\tButts County\t765\t38.8\t11.4\t11.8\t18257\t97045\t0.3164\t30216\tRomney\t30216\t0.002810905\t30216.0\n3834\t-84.03433299999999\t33.324168\tJenkinsburg town\tGA\tGeorgia\tButts County\t240\t38.3\t6.9\t11.0\t19117\t94000\t0.3164\t30234\tRomney\t30234\t0.000881853\t30234.0\n3835\t-83.963717\t33.291308\tJackson city\tGA\tGeorgia\tButts County\t4754\t37.4\t14.8\t13.6\t18429\t94952\t0.3164\t30233\tRomney\t30233\t0.017468031000000002\t30233.0\n3836\t-84.602956\t31.538507\tMorgan city\tGA\tGeorgia\tCalhoun County\t1598\t35.6\t16.8\t7.2\t15310\t63500\t0.5932\t31766\tRomney\t31766\t0.005871669\t31766.0\n3837\t-84.737378\t31.560940000000002\tEdison city\tGA\tGeorgia\tCalhoun County\t1256\t39.3\t16.6\t13.3\t14574\t59348\t0.5932\t31746\tRomney\t31746\t0.0046150290000000005\t31746.0\n3838\t-84.512861\t31.484865999999997\tLeary city\tGA\tGeorgia\tCalhoun County\t597\t40.2\t9.7\t14.8\t16670\t63333\t0.5932\t31762\tRomney\t31762\t0.0021936079999999997\t31762.0\n3839\t-84.724005\t31.443675\tArlington city\tGA\tGeorgia\tCalhoun County\t1523\t35.5\t12.8\t14.1\t14998\t48370\t0.5932\t31713\tRomney\t31713\t0.00559609\t31713.0\n3840\t-81.653806\t30.799773\tKingsland city\tGA\tGeorgia\tCamden County\t14682\t31.1\t18.1\t10.7\t20669\t112671\t0.3546\t31548\tRomney\t31548\t0.053947335\t31548.0\n3841\t-81.719258\t30.95866\tWoodbine city\tGA\tGeorgia\tCamden County\t1205\t40.1\t17.8\t9.1\t18464\t93333\t0.3546\t31569\tRomney\t31569\t0.004427635\t31569.0\n3842\t-81.582334\t30.758752\tSt. Marys city\tGA\tGeorgia\tCamden County\t15924\t31.1\t23.4\t11.6\t23081\t125000\t0.3546\t31558\tRomney\t31558\t0.058510923\t31558.0\n3843\t-81.56491899999999\t30.798914\tKings Bay Base CDP\tGA\tGeorgia\tCamden County\t1556\t21.8\t11.0\t22.1\t14522\t150000\t0.3546\t31558\tRomney\t31558\t0.005717345\t31558.0\n3844\t-82.061773\t32.395747\tMetter city\tGA\tGeorgia\tCandler County\t4264\t39.3\t16.4\t11.6\t14549\t75773\t0.3279\t30439\tRomney\t30439\t0.015667582\t30439.0\n3845\t-81.956549\t32.390386\tPulaski town\tGA\tGeorgia\tCandler County\t310\t40.2\t18.2\t12.0\t16987\t72500\t0.3279\t30452\tRomney\t30452\t0.00113906\t30452.0\n3846\t-85.028746\t33.740396000000004\tTemple city\tGA\tGeorgia\tCarroll County\t4124\t35.6\t11.2\t7.7\t19458\t90520\t0.3054\t30179\tRomney\t30179\t0.015153168\t30179.0\n3847\t-84.913676\t33.492765000000006\tWhitesburg town\tGA\tGeorgia\tCarroll County\t669\t38.1\t11.0\t9.1\t20627\t76944\t0.3054\t30185\tRomney\t30185\t0.002458164\t30185.0\n3848\t-84.886084\t33.738878\tVilla Rica city\tGA\tGeorgia\tCarroll County\t10612\t35.7\t12.2\t11.7\t19959\t95021\t0.3054\t30180\tRomney\t30180\t0.038992584\t30180.0\n3849\t-85.083474\t33.580975\tCarrollton city\tGA\tGeorgia\tCarroll County\t25543\t28.6\t29.9\t14.4\t19892\t103740\t0.3054\t30117\tRomney\t30117\t0.093854842\t30117.0\n3850\t-85.180022\t33.640643\tMount Zion city\tGA\tGeorgia\tCarroll County\t1512\t34.1\t10.6\t10.1\t18490\t81667\t0.3054\t30182\tRomney\t30182\t0.005555671999999999\t30182.0\n3851\t-85.130409\t33.456638\tRoopville town\tGA\tGeorgia\tCarroll County\t211\t35.7\t14.9\t12.5\t19557\t88333\t0.3054\t30170\tRomney\t30170\t0.000775295\t30170.0\n3852\t-85.253991\t33.537819\tBowdon city\tGA\tGeorgia\tCarroll County\t2221\t40.1\t16.0\t15.2\t18246\t79577\t0.3054\t30108\tRomney\t30108\t0.008160811\t30108.0\n3853\t-85.25024300000001\t34.978388\tLakeview CDP\tGA\tGeorgia\tCatoosa County\t4938\t42.8\t9.4\t11.2\t21107\t79111\t0.2266\t30741\tRomney\t30741\t0.018144118\t30741.0\n3854\t-85.24209300000001\t34.931559\tFort Oglethorpe city\tGA\tGeorgia\tCatoosa County\t9675\t41.3\t13.7\t11.0\t20640\t90219\t0.2266\t30742\tRomney\t30742\t0.035549685\t30742.0\n3855\t-85.15908\t34.960525\tIndian Springs CDP\tGA\tGeorgia\tCatoosa County\t2233\t38.4\t23.0\t7.8\t25072\t112370\t0.2266\t30726\tRomney\t30726\t0.008204904\t30726.0\n3856\t-85.115808\t34.912581\tRinggold city\tGA\tGeorgia\tCatoosa County\t2869\t38.0\t17.7\t8.8\t20424\t108588\t0.2266\t30736\tRomney\t30736\t0.010541813\t30736.0\n3857\t-82.008124\t30.836563\tFolkston city\tGA\tGeorgia\tCharlton County\t3502\t35.1\t9.3\t10.0\t15185\t69167\t0.318\t31537\tRomney\t31537\t0.012867700000000003\t31537.0\n3858\t-82.020555\t30.860812\tHomeland city\tGA\tGeorgia\tCharlton County\t786\t36.8\t9.4\t16.7\t13253\t47750\t0.318\t31537\tRomney\t31537\t0.0028880670000000002\t31537.0\n3859\t-80.852378\t32.010394\tTybee Island city\tGA\tGeorgia\tChatham County\t3728\t53.5\t40.8\t9.2\t32194\t225130\t0.5546\t31328\tRomney\t31328\t0.013698111\t31328.0\n3860\t-81.052943\t31.984911\tIsle of Hope CDP\tGA\tGeorgia\tChatham County\t2540\t45.4\t55.9\t4.4\t38210\t199202\t0.5546\t314HH\tRomney\t314HH\t0.00933294\t0.0\n3861\t-81.049438\t32.03331\tThunderbolt town\tGA\tGeorgia\tChatham County\t2598\t44.0\t26.5\t8.5\t24321\t81200\t0.5546\t31404\tRomney\t31404\t0.009546055\t31404.0\n3862\t-81.12595300000001\t31.963858000000002\tVernonburg town\tGA\tGeorgia\tChatham County\t148\t42.8\t36.8\t6.7\t33091\t150000\t0.5546\t31406\tRomney\t31406\t0.000543809\t31406.0\n3863\t-81.170936\t32.097004\tGarden City\tGA\tGeorgia\tChatham County\t9929\t33.3\t12.8\t9.0\t18709\t70304\t0.5546\t31408\tRomney\t31408\t0.036482979\t31408.0\n3864\t-81.253188\t32.106893\tPooler city\tGA\tGeorgia\tChatham County\t15081\t35.7\t21.2\t7.1\t23320\t102160\t0.5546\t31322\tRomney\t31322\t0.05541341599999999\t31322.0\n3865\t-81.044725\t31.937424\tSkidaway Island CDP\tGA\tGeorgia\tChatham County\t8088\t65.4\t71.6\t6.1\t67823\t411688\t0.5546\t31411\tRomney\t31411\t0.029718434\t31411.0\n3866\t-81.144307\t32.043611999999996\tSavannah city\tGA\tGeorgia\tChatham County\t137399\t33.7\t25.1\t13.5\t19304\t96427\t0.5546\t31405\tRomney\t31405\t0.504856964\t31405.0\n3867\t-81.23034399999999\t31.980078999999996\tGeorgetown CDP\tGA\tGeorgia\tChatham County\t13065\t31.0\t41.2\t6.4\t25595\t135061\t0.5546\t31419\tRomney\t31419\t0.048005853\t31419.0\n3868\t-81.30781999999999\t32.123829\tBloomingdale city\tGA\tGeorgia\tChatham County\t2815\t38.0\t7.9\t6.2\t22796\t96647\t0.5546\t31302\tRomney\t31302\t0.010343396999999999\t31302.0\n3869\t-81.10828000000001\t31.944021000000003\tMontgomery CDP\tGA\tGeorgia\tChatham County\t4020\t41.3\t29.7\t7.1\t27972\t131014\t0.5546\t31406\tRomney\t31406\t0.014771032\t31406.0\n3870\t-81.197508\t32.194932\tPort Wentworth city\tGA\tGeorgia\tChatham County\t3587\t39.8\t18.6\t7.4\t24186\t78736\t0.5546\t31407\tRomney\t31407\t0.013180023\t31407.0\n3871\t-80.975018\t32.003626000000004\tWilmington Island CDP\tGA\tGeorgia\tChatham County\t14523\t39.4\t46.2\t6.3\t32088\t163343\t0.5546\t31410\tRomney\t31410\t0.053363108\t31410.0\n3872\t-81.011176\t32.030339\tWhitemarsh Island CDP\tGA\tGeorgia\tChatham County\t6813\t38.4\t49.5\t6.9\t35854\t171284\t0.5546\t31410\tRomney\t31410\t0.025033592\t31410.0\n3873\t-84.775118\t32.301986\tCusseta city\tGA\tGeorgia\tChattahoochee County\t1178\t33.2\t10.0\t11.1\t16107\t72727\t0.4893\t31805\tRomney\t31805\t0.004328427\t31805.0\n3874\t-84.948614\t32.363997999999995\tFort Benning South CDP\tGA\tGeorgia\tChattahoochee County\t13809\t22.7\t34.3\t21.2\t15670\t85625\t0.4893\t31905\tRomney\t31905\t0.050739596\t31905.0\n3875\t-85.404133\t34.403409\tLyerly town\tGA\tGeorgia\tChattooga County\t488\t39.3\t10.9\t12.5\t19597\t99444\t0.2853\t30730\tRomney\t30730\t0.0017930999999999997\t30730.0\n3876\t-85.348972\t34.478654\tSummerville city\tGA\tGeorgia\tChattooga County\t4540\t39.8\t9.1\t18.1\t16215\t72419\t0.2853\t30747\tRomney\t30747\t0.016681713\t30747.0\n3877\t-85.311272\t34.547761\tTrion town\tGA\tGeorgia\tChattooga County\t1962\t39.0\t11.9\t9.0\t18496\t75268\t0.2853\t30753\tRomney\t30753\t0.007209145\t30753.0\n3878\t-85.477601\t34.483523999999996\tMenlo city\tGA\tGeorgia\tChattooga County\t485\t41.8\t12.8\t12.3\t19574\t87222\t0.2853\t30731\tRomney\t30731\t0.0017820770000000002\t30731.0\n3879\t-84.517439\t34.105691\tWoodstock city\tGA\tGeorgia\tCherokee County\t17332\t34.0\t34.7\t7.9\t38029\t181835\t0.20199999999999999\t30188\tRomney\t30188\t0.063684458\t30188.0\n3880\t-84.375574\t34.335896999999996\tBall Ground city\tGA\tGeorgia\tCherokee County\t1037\t38.9\t13.5\t8.9\t23297\t123707\t0.20199999999999999\t30107\tRomney\t30107\t0.003810338\t30107.0\n3881\t-84.550692\t34.317144\tWaleska city\tGA\tGeorgia\tCherokee County\t836\t33.8\t27.7\t11.1\t23742\t171875\t0.20199999999999999\t30183\tRomney\t30183\t0.0030717870000000003\t30183.0\n3882\t-84.489497\t34.246185\tCanton city\tGA\tGeorgia\tCherokee County\t19718\t35.1\t24.0\t9.9\t27456\t152597\t0.20199999999999999\t30114\tRomney\t30114\t0.072451543\t30114.0\n3883\t-84.497964\t34.169237\tHolly Springs city\tGA\tGeorgia\tCherokee County\t5110\t34.2\t19.2\t7.8\t30861\t140373\t0.20199999999999999\t30114\tRomney\t30114\t0.018776113\t30114.0\n3884\t-83.369055\t33.950959999999995\tAthens-Clarke County (balance)\tGA\tGeorgia\tClarke County\t116436\t26.5\t46.3\t10.9\t19730\t120820\t0.63\t30602\tRomney\t30602\t0.42783081\t30602.0\n3885\t-83.28146600000001\t33.966635\tWinterville city\tGA\tGeorgia\tClarke County\t1325\t33.2\t36.9\t6.4\t20491\t101585\t0.63\t30683\tRomney\t30683\t0.0048685609999999995\t30683.0\n3886\t-85.053079\t31.624011\tFort Gaines city\tGA\tGeorgia\tClay County\t1100\t41.7\t13.1\t16.0\t14050\t55789\t0.6148\t31751\tRomney\t31751\t0.004041825\t31751.0\n3887\t-84.86896800000001\t31.519890000000004\tBluffton town\tGA\tGeorgia\tClay County\t109\t47.0\t12.5\t3.2\t18153\t56667\t0.6148\t31724\tRomney\t31724\t0.00040050800000000005\t31724.0\n3888\t-84.340994\t33.606536\tLake City\tGA\tGeorgia\tClayton County\t3005\t35.5\t8.5\t13.7\t21049\t95102\t0.8481\t30260\tRomney\t30260\t0.01104153\t30260.0\n3889\t-84.337673\t33.639953999999996\tConley CDP\tGA\tGeorgia\tClayton County\t6676\t30.7\t8.9\t16.5\t14648\t82511\t0.8481\t30288\tRomney\t30288\t0.024530201\t30288.0\n3890\t-84.409604\t33.563813\tRiverdale city\tGA\tGeorgia\tClayton County\t15023\t28.9\t15.6\t15.2\t19017\t102765\t0.8481\t30274\tRomney\t30274\t0.05520030099999999\t30274.0\n3891\t-84.44803\t33.643188\tCollege Park city\tGA\tGeorgia\tClayton County\t21737\t29.5\t23.9\t16.0\t19832\t89533\t0.8481\t30337\tRomney\t30337\t0.079870129\t30337.0\n3892\t-84.336578\t33.458137\tBonanza CDP\tGA\tGeorgia\tClayton County\t4654\t31.2\t20.4\t9.0\t24148\t116217\t0.8481\t30250\tRomney\t30250\t0.017100593\t30250.0\n3893\t-84.315495\t33.440324\tLovejoy city\tGA\tGeorgia\tClayton County\t4359\t33.1\t17.2\t11.3\t21672\t129562\t0.8481\t30250\tRomney\t30250\t0.016016648999999997\t30250.0\n3894\t-84.35919\t33.621163\tForest Park city\tGA\tGeorgia\tClayton County\t23031\t30.3\t7.3\t15.1\t16626\t79661\t0.8481\t30297\tRomney\t30297\t0.08462478400000001\t30297.0\n3895\t-84.34034399999999\t33.581546\tMorrow city\tGA\tGeorgia\tClayton County\t4888\t31.6\t13.7\t15.4\t20447\t105527\t0.8481\t30260\tRomney\t30260\t0.017960399\t30260.0\n3896\t-84.360047\t33.477265\tIrondale CDP\tGA\tGeorgia\tClayton County\t8524\t31.4\t20.8\t10.5\t22414\t97448\t0.8481\t30238\tRomney\t30238\t0.031320466\t30238.0\n3897\t-84.354067\t33.521032\tJonesboro city\tGA\tGeorgia\tClayton County\t4163\t34.6\t17.9\t9.5\t22880\t103696\t0.8481\t30236\tRomney\t30236\t0.015296468999999998\t30236.0\n3898\t-82.648877\t31.073214\tArgyle town\tGA\tGeorgia\tClinch County\t152\t37.5\t12.9\t13.1\t14182\t59000\t0.3447\t31623\tRomney\t31623\t0.000558507\t31623.0\n3899\t-82.753411\t31.036883000000003\tHomerville city\tGA\tGeorgia\tClinch County\t2848\t37.5\t15.0\t12.4\t14785\t60820\t0.3447\t31634\tRomney\t31634\t0.010464651\t31634.0\n3900\t-82.869225\t30.989105\tDu Pont town\tGA\tGeorgia\tClinch County\t135\t34.4\t10.8\t11.5\t17543\t61250\t0.3447\t31630\tRomney\t31630\t0.0004960419999999999\t31630.0\n3901\t-82.570288\t30.683653000000003\tFargo city\tGA\tGeorgia\tClinch County\t373\t40.8\t2.8\t4.0\t16215\t33750\t0.3447\t31631\tRomney\t31631\t0.001370546\t31631.0\n3902\t-84.640312\t33.820904999999996\tAustell city\tGA\tGeorgia\tCobb County\t6731\t32.9\t16.5\t15.3\t24059\t93991\t0.4293\t30106\tRomney\t30106\t0.024732292000000003\t30106.0\n3903\t-84.669294\t34.057897\tAcworth city\tGA\tGeorgia\tCobb County\t17343\t33.0\t35.6\t9.5\t31467\t145444\t0.4293\t30101\tRomney\t30101\t0.063724877\t30101.0\n3904\t-84.61824200000001\t34.027155\tKennesaw city\tGA\tGeorgia\tCobb County\t26865\t33.5\t40.8\t8.5\t34862\t146492\t0.4293\t30144\tRomney\t30144\t0.09871238\t30144.0\n3905\t-84.516737\t33.86564\tSmyrna city\tGA\tGeorgia\tCobb County\t46619\t33.8\t42.5\t12.1\t34066\t120058\t0.4293\t30080\tRomney\t30080\t0.17129620199999998\t30080.0\n3906\t-84.544608\t33.919268\tFair Oaks CDP\tGA\tGeorgia\tCobb County\t10331\t29.3\t10.8\t15.4\t17970\t72148\t0.4293\t30060\tRomney\t30060\t0.037960082\t30060.0\n3907\t-84.538076\t33.951842\tMarietta city\tGA\tGeorgia\tCobb County\t67433\t31.1\t36.4\t11.8\t28148\t130272\t0.4293\t30060\tRomney\t30060\t0.24777487199999998\t30060.0\n3908\t-84.468662\t33.860785\tVinings CDP\tGA\tGeorgia\tCobb County\t11058\t31.1\t67.6\t8.4\t57363\t351946\t0.4293\t303HH\tRomney\t303HH\t0.040631361\t0.0\n3909\t-84.69273299999999\t33.865955\tPowder Springs city\tGA\tGeorgia\tCobb County\t15485\t33.5\t31.7\t9.5\t27034\t118942\t0.4293\t30127\tRomney\t30127\t0.056897867000000005\t30127.0\n3910\t-84.565151\t33.813295000000004\tMableton CDP\tGA\tGeorgia\tCobb County\t36087\t36.6\t26.4\t10.9\t28135\t101325\t0.4293\t30126\tRomney\t30126\t0.132597568\t30126.0\n3911\t-82.63681899999999\t31.519459\tNicholls city\tGA\tGeorgia\tCoffee County\t2650\t34.6\t6.0\t23.5\t14228\t53171\t0.3499\t31554\tRomney\t31554\t0.009737123\t31554.0\n3912\t-82.853871\t31.505376000000002\tDouglas city\tGA\tGeorgia\tCoffee County\t11228\t34.0\t15.1\t20.0\t17324\t79452\t0.3499\t31533\tRomney\t31533\t0.041256006\t31533.0\n3913\t-83.013712\t31.594478000000002\tAmbrose city\tGA\tGeorgia\tCoffee County\t350\t36.3\t10.9\t15.6\t15137\t55417\t0.3499\t31512\tRomney\t31512\t0.001286035\t31512.0\n3914\t-82.88767299999999\t31.624821999999998\tBroxton city\tGA\tGeorgia\tCoffee County\t1650\t35.5\t12.9\t19.1\t16423\t73846\t0.3499\t31519\tRomney\t31519\t0.0060627369999999995\t31519.0\n3915\t-83.795563\t31.161151\tMoultrie city\tGA\tGeorgia\tColquitt County\t15226\t35.9\t15.0\t13.6\t16411\t83719\t0.2981\t31768\tRomney\t31768\t0.055946200999999994\t31768.0\n3916\t-83.805521\t31.178128000000005\tRiverside town\tGA\tGeorgia\tColquitt County\t53\t33.1\t0.0\t4.3\t11216\t45000\t0.2981\t31768\tRomney\t31768\t0.000194742\t31768.0\n3917\t-83.684259\t31.269242\tNorman Park city\tGA\tGeorgia\tColquitt County\t827\t35.7\t13.1\t11.4\t15372\t61500\t0.2981\t31771\tRomney\t31771\t0.0030387170000000002\t31771.0\n3918\t-83.876612\t31.198789\tFunston town\tGA\tGeorgia\tColquitt County\t469\t35.5\t11.7\t6.4\t14437\t78500\t0.2981\t31756\tRomney\t31756\t0.0017232870000000002\t31756.0\n3919\t-83.62397\t31.067777000000003\tBerlin town\tGA\tGeorgia\tColquitt County\t676\t35.2\t4.1\t7.4\t16278\t61667\t0.2981\t31722\tRomney\t31722\t0.002483885\t31722.0\n3920\t-83.58761899999999\t31.175985999999998\tEllenton town\tGA\tGeorgia\tColquitt County\t367\t34.0\t12.2\t7.8\t15925\t75000\t0.2981\t31747\tRomney\t31747\t0.0013484999999999999\t31747.0\n3921\t-83.916896\t31.321877\tDoerun city\tGA\tGeorgia\tColquitt County\t898\t41.0\t11.6\t9.0\t16307\t80238\t0.2981\t31744\tRomney\t31744\t0.0032995990000000003\t31744.0\n3922\t-82.14499\t33.51359\tEvans CDP\tGA\tGeorgia\tColumbia County\t22268\t37.2\t34.4\t8.1\t28649\t131897\t0.2792\t30809\tRomney\t30809\t0.081821228\t30809.0\n3923\t-82.09442800000001\t33.521691\tMartinez CDP\tGA\tGeorgia\tColumbia County\t29892\t38.0\t42.7\t7.5\t33818\t135647\t0.2792\t30907\tRomney\t30907\t0.109834747\t30907.0\n3924\t-82.198444\t33.447839\tGrovetown city\tGA\tGeorgia\tColumbia County\t7297\t33.1\t16.5\t9.9\t19309\t90327\t0.2792\t30813\tRomney\t30813\t0.026811995\t30813.0\n3925\t-82.31721999999999\t33.413827000000005\tHarlem city\tGA\tGeorgia\tColumbia County\t2111\t35.8\t16.1\t8.7\t18199\t79694\t0.2792\t30814\tRomney\t30814\t0.007756629\t30814.0\n3926\t-83.393637\t31.046542\tCecil town\tGA\tGeorgia\tCook County\t263\t35.0\t7.4\t12.0\t15149\t85714\t0.3386\t31627\tRomney\t31627\t0.0009663639999999999\t31627.0\n3927\t-83.427266\t31.133684000000002\tAdel city\tGA\tGeorgia\tCook County\t5496\t35.8\t10.1\t16.8\t14796\t76000\t0.3386\t31620\tRomney\t31620\t0.020194426\t31620.0\n3928\t-83.440441\t31.168647999999997\tSparks town\tGA\tGeorgia\tCook County\t1995\t34.7\t8.8\t14.7\t15356\t76047\t0.3386\t31647\tRomney\t31647\t0.0073304\t31647.0\n3929\t-83.466449\t31.270388\tLenox town\tGA\tGeorgia\tCook County\t945\t40.0\t12.9\t9.6\t16215\t69211\t0.3386\t31637\tRomney\t31637\t0.003472295\t31637.0\n3930\t-84.77693599999999\t33.377138\tNewnan city\tGA\tGeorgia\tCoweta County\t33320\t33.3\t25.5\t13.5\t25484\t126300\t0.273\t30263\tRomney\t30263\t0.12243054199999999\t30263.0\n3931\t-84.56952700000001\t33.229155\tHaralson town\tGA\tGeorgia\tCoweta County\t244\t34.9\t13.2\t10.9\t24074\t115972\t0.273\t30276\tRomney\t30276\t0.00089655\t30276.0\n3932\t-84.635814\t33.326665000000006\tTurin town\tGA\tGeorgia\tCoweta County\t180\t33.5\t19.1\t11.1\t27219\t126786\t0.273\t30277\tRomney\t30277\t0.000661389\t30277.0\n3933\t-84.77642900000001\t33.346196\tEast Newnan CDP\tGA\tGeorgia\tCoweta County\t1454\t31.4\t7.0\t17.5\t16395\t80926\t0.273\t30263\tRomney\t30263\t0.0053425569999999995\t30263.0\n3934\t-84.552869\t33.311009000000006\tSenoia city\tGA\tGeorgia\tCoweta County\t2763\t35.8\t21.6\t10.4\t23665\t127892\t0.273\t30276\tRomney\t30276\t0.010152329\t30276.0\n3935\t-84.64863000000001\t33.341176000000004\tSharpsburg town\tGA\tGeorgia\tCoweta County\t384\t33.7\t24.2\t10.7\t31571\t137037\t0.273\t30277\tRomney\t30277\t0.001410964\t30277.0\n3936\t-84.770081\t33.286347\tMoreland town\tGA\tGeorgia\tCoweta County\t443\t38.6\t18.0\t12.1\t23258\t160294\t0.273\t30259\tRomney\t30259\t0.0016277529999999998\t30259.0\n3937\t-84.828405\t33.238141\tGrantville city\tGA\tGeorgia\tCoweta County\t2080\t37.5\t8.0\t12.7\t17782\t71349\t0.273\t30220\tRomney\t30220\t0.007642723000000001\t30220.0\n3938\t-84.010449\t32.719628\tRoberta city\tGA\tGeorgia\tCrawford County\t871\t44.2\t10.6\t9.0\t18322\t70385\t0.3324\t31078\tRomney\t31078\t0.00320039\t31078.0\n3939\t-83.730935\t31.833146999999997\tArabi town\tGA\tGeorgia\tCrisp County\t443\t41.3\t10.8\t10.5\t16337\t61136\t0.4282\t31712\tRomney\t31712\t0.0016277529999999998\t31712.0\n3940\t-83.77374499999999\t31.960959000000003\tCordele city\tGA\tGeorgia\tCrisp County\t11625\t33.5\t15.3\t18.5\t14680\t81402\t0.4282\t31015\tRomney\t31015\t0.042714737\t31015.0\n3941\t-85.509668\t34.874507\tTrenton city\tGA\tGeorgia\tDade County\t2034\t39.8\t15.3\t8.6\t18671\t78784\t0.2344\t30752\tRomney\t30752\t0.007473701\t30752.0\n3942\t-84.11358299999999\t34.433587\tDawsonville city\tGA\tGeorgia\tDawson County\t1403\t36.4\t16.9\t12.2\t22542\t128989\t0.1211\t30534\tRomney\t30534\t0.005155164\t30534.0\n3943\t-84.431275\t30.875562\tClimax city\tGA\tGeorgia\tDecatur County\t312\t35.5\t16.0\t10.7\t14427\t72000\t0.4379\t31734\tRomney\t31734\t0.001146408\t31734.0\n3944\t-84.48393\t30.749484000000002\tAttapulgus city\tGA\tGeorgia\tDecatur County\t531\t36.2\t8.9\t17.2\t14275\t60714\t0.4379\t31715\tRomney\t31715\t0.001951099\t31715.0\n3945\t-84.574849\t30.9056\tBainbridge city\tGA\tGeorgia\tDecatur County\t12252\t36.3\t22.2\t16.0\t18296\t94151\t0.4379\t31717\tRomney\t31717\t0.045018577000000004\t31717.0\n3946\t-84.73815400000001\t30.979384000000003\tBrinson town\tGA\tGeorgia\tDecatur County\t233\t39.7\t8.1\t15.0\t16377\t76667\t0.4379\t31725\tRomney\t31725\t0.000856132\t31725.0\n3947\t-84.240689\t33.8107\tClarkston city\tGA\tGeorgia\tDeKalb County\t7299\t26.9\t24.1\t15.8\t17576\t90377\t0.7778\t30021\tRomney\t30021\t0.026819344\t30021.0\n3948\t-84.326051\t33.819083\tNorth Druid Hills CDP\tGA\tGeorgia\tDeKalb County\t20886\t34.7\t69.1\t10.4\t43257\t222509\t0.7778\t30329\tRomney\t30329\t0.076743226\t30329.0\n3949\t-84.158877\t33.73758\tRedan CDP\tGA\tGeorgia\tDeKalb County\t36917\t31.8\t32.3\t12.5\t26159\t105600\t0.7778\t30088\tRomney\t30088\t0.135647309\t30088.0\n3950\t-84.288601\t33.806729\tNorth Decatur CDP\tGA\tGeorgia\tDeKalb County\t16239\t41.8\t62.0\t8.7\t42290\t187556\t0.7778\t30033\tRomney\t30033\t0.059668355\t30033.0\n3951\t-84.275082\t33.90678\tDoraville city\tGA\tGeorgia\tDeKalb County\t10893\t32.4\t27.0\t11.6\t21719\t116998\t0.7778\t30340\tRomney\t30340\t0.040025087\t30340.0\n3952\t-84.260189\t33.748958\tBelvedere Park CDP\tGA\tGeorgia\tDeKalb County\t19449\t32.0\t17.9\t14.7\t20005\t80658\t0.7778\t30032\tRomney\t30032\t0.071463134\t30032.0\n3953\t-84.205788\t33.791201\tPine Lake city\tGA\tGeorgia\tDeKalb County\t682\t28.1\t25.8\t15.5\t22358\t93333\t0.7778\t30072\tRomney\t30072\t0.002505931\t30072.0\n3954\t-84.303608\t33.888822\tChamblee city\tGA\tGeorgia\tDeKalb County\t11633\t29.2\t27.3\t11.8\t20132\t179167\t0.7778\t30341\tRomney\t30341\t0.042744133\t30341.0\n3955\t-84.297198\t33.771198999999996\tDecatur city\tGA\tGeorgia\tDeKalb County\t19111\t38.8\t58.9\t9.8\t36500\t221904\t0.7778\t30030\tRomney\t30030\t0.070221191\t30030.0\n3956\t-84.276362\t33.705896\tPanthersville CDP\tGA\tGeorgia\tDeKalb County\t12382\t29.3\t19.9\t14.2\t22826\t98601\t0.7778\t30034\tRomney\t30034\t0.045496247999999996\t30034.0\n3957\t-84.262743\t33.795288\tScottdale CDP\tGA\tGeorgia\tDeKalb County\t11081\t34.5\t35.7\t16.3\t25455\t121069\t0.7778\t30079\tRomney\t30079\t0.040715871\t30079.0\n3958\t-84.315067\t33.942811\tDunwoody CDP\tGA\tGeorgia\tDeKalb County\t40041\t39.6\t68.7\t8.9\t54969\t270749\t0.7778\t30338\tRomney\t30338\t0.14712609\t30338.0\n3959\t-84.332479\t33.862176\tNorth Atlanta CDP\tGA\tGeorgia\tDeKalb County\t43669\t32.2\t47.1\t11.1\t37231\t262979\t0.7778\t30319\tRomney\t30319\t0.160456763\t30319.0\n3960\t-84.272438\t33.726727000000004\tCandler-McAfee CDP\tGA\tGeorgia\tDeKalb County\t28796\t36.6\t13.8\t19.9\t19637\t87737\t0.7778\t30032\tRomney\t30032\t0.10580762\t30032.0\n3961\t-84.222606\t33.853457\tTucker CDP\tGA\tGeorgia\tDeKalb County\t28294\t42.9\t46.6\t8.7\t36921\t161980\t0.7778\t30084\tRomney\t30084\t0.10396307800000001\t30084.0\n3962\t-84.172673\t33.802963\tStone Mountain city\tGA\tGeorgia\tDeKalb County\t7160\t31.6\t24.4\t12.8\t22618\t99083\t0.7778\t30083\tRomney\t30083\t0.026308604\t30083.0\n3963\t-84.315508\t33.705293\tGresham Park CDP\tGA\tGeorgia\tDeKalb County\t9215\t31.4\t10.1\t18.8\t17520\t79783\t0.7778\t30316\tRomney\t30316\t0.033859467000000004\t30316.0\n3964\t-84.326102\t33.787643\tDruid Hills CDP\tGA\tGeorgia\tDeKalb County\t13352\t29.8\t80.4\t6.4\t44434\t334511\t0.7778\t30322\tRomney\t30322\t0.049060402\t30322.0\n3965\t-84.10592199999999\t33.712799\tLithonia city\tGA\tGeorgia\tDeKalb County\t2087\t33.6\t12.5\t12.9\t18455\t79688\t0.7778\t30058\tRomney\t30058\t0.007668444\t30058.0\n3966\t-84.264473\t33.769422999999996\tAvondale Estates city\tGA\tGeorgia\tDeKalb County\t2780\t40.6\t58.5\t9.0\t41046\t185957\t0.7778\t30002\tRomney\t30002\t0.010214793\t30002.0\n3967\t-83.20042\t31.988993\tRhine town\tGA\tGeorgia\tDodge County\t411\t43.2\t14.5\t9.2\t17798\t55417\t0.3158\t31077\tRomney\t31077\t0.0015101729999999999\t31077.0\n3968\t-83.178589\t32.195331\tEastman city\tGA\tGeorgia\tDodge County\t5679\t37.1\t18.5\t13.6\t18109\t74267\t0.3158\t31023\tRomney\t31023\t0.020866838000000002\t31023.0\n3969\t-83.064821\t32.105399\tChauncey town\tGA\tGeorgia\tDodge County\t280\t37.5\t7.1\t7.4\t13989\t52692\t0.3158\t31011\tRomney\t31011\t0.001028828\t31011.0\n3970\t-83.154364\t32.394462\tChester town\tGA\tGeorgia\tDodge County\t1397\t36.8\t14.3\t8.0\t15531\t64615\t0.3158\t31012\tRomney\t31012\t0.005133117\t31012.0\n3971\t-83.87746700000001\t32.146522999999995\tLilly city\tGA\tGeorgia\tDooly County\t215\t30.6\t13.8\t9.1\t19274\t103750\t0.5316\t31051\tRomney\t31051\t0.000789993\t31051.0\n3972\t-83.928852\t32.229904\tDooling town\tGA\tGeorgia\tDooly County\t169\t40.6\t7.0\t7.1\t18075\t65000\t0.5316\t31007\tRomney\t31007\t0.000620971\t31007.0\n3973\t-83.75961600000001\t32.195568\tPinehurst city\tGA\tGeorgia\tDooly County\t287\t43.8\t17.4\t6.8\t18377\t65625\t0.5316\t31070\tRomney\t31070\t0.001054549\t31070.0\n3974\t-83.907319\t32.201662\tByromville town\tGA\tGeorgia\tDooly County\t430\t40.5\t7.3\t7.3\t18084\t66000\t0.5316\t31007\tRomney\t31007\t0.001579986\t31007.0\n3975\t-83.787695\t32.092613\tVienna city\tGA\tGeorgia\tDooly County\t2905\t35.0\t20.7\t11.9\t16938\t68583\t0.5316\t31092\tRomney\t31092\t0.010674091\t31092.0\n3976\t-83.734974\t32.258556\tUnadilla city\tGA\tGeorgia\tDooly County\t2857\t36.8\t5.7\t12.2\t14917\t61905\t0.5316\t31091\tRomney\t31091\t0.010497721000000002\t31091.0\n3977\t-84.176392\t31.577429\tAlbany city\tGA\tGeorgia\tDougherty County\t76877\t33.2\t22.4\t16.9\t19387\t82608\t0.6935\t31701\tRomney\t31701\t0.282475774\t31701.0\n3978\t-84.101099\t31.475219\tPutney CDP\tGA\tGeorgia\tDougherty County\t2807\t41.3\t7.6\t9.7\t20041\t73009\t0.6935\t31705\tRomney\t31705\t0.010314002\t31705.0\n3979\t-84.74106\t33.740671999999996\tDouglasville city\tGA\tGeorgia\tDouglas County\t30866\t33.4\t25.7\t12.9\t23908\t123948\t0.5146\t30134\tRomney\t30134\t0.113413599\t30134.0\n3980\t-84.655152\t33.795733\tLithia Springs city\tGA\tGeorgia\tDouglas County\t2628\t38.0\t18.5\t15.5\t25524\t104464\t0.5146\t30122\tRomney\t30122\t0.009656286\t30122.0\n3981\t-84.922739\t31.382644\tBlakely city\tGA\tGeorgia\tEarly County\t5395\t37.4\t16.9\t13.3\t15820\t62414\t0.5165\t31723\tRomney\t31723\t0.019823313000000002\t31723.0\n3982\t-84.982287\t31.090065999999997\tJakin city\tGA\tGeorgia\tEarly County\t153\t42.9\t13.8\t8.2\t19907\t63750\t0.5165\t31761\tRomney\t31761\t0.000562181\t31761.0\n3983\t-84.716981\t31.298841999999997\tDamascus town\tGA\tGeorgia\tEarly County\t252\t40.0\t12.5\t9.8\t17569\t60000\t0.5165\t31741\tRomney\t31741\t0.000925945\t31741.0\n3984\t-81.231107\t32.29055\tRincon city\tGA\tGeorgia\tEffingham County\t8143\t33.2\t20.5\t9.1\t25860\t132170\t0.2377\t31326\tRomney\t31326\t0.029920525\t31326.0\n3985\t-81.394244\t32.333494\tGuyton city\tGA\tGeorgia\tEffingham County\t1387\t34.2\t13.8\t10.2\t19689\t97791\t0.2377\t31312\tRomney\t31312\t0.0050963729999999995\t31312.0\n3986\t-81.30936\t32.366677\tSpringfield city\tGA\tGeorgia\tEffingham County\t2473\t35.3\t18.6\t9.2\t22509\t100158\t0.2377\t31329\tRomney\t31329\t0.009086756999999999\t31329.0\n3987\t-83.02859699999999\t34.203656\tBowman city\tGA\tGeorgia\tElbert County\t956\t39.1\t9.8\t11.5\t17482\t77969\t0.3906\t30624\tRomney\t30624\t0.0035127129999999998\t30624.0\n3988\t-82.866928\t34.108775\tElberton city\tGA\tGeorgia\tElbert County\t4562\t37.8\t19.7\t14.6\t16438\t86479\t0.3906\t30635\tRomney\t30635\t0.016762548999999998\t30635.0\n3989\t-82.09620799999999\t32.649564\tGarfield town\tGA\tGeorgia\tEmanuel County\t161\t38.5\t13.3\t12.3\t14061\t73750\t0.3621\t30425\tRomney\t30425\t0.000591576\t30425.0\n3990\t-82.276413\t32.745821\tSummertown town\tGA\tGeorgia\tEmanuel County\t144\t38.9\t6.5\t13.8\t14569\t65000\t0.3621\t30441\tRomney\t30441\t0.000529112\t30441.0\n3991\t-82.214472\t32.441028\tStillmore town\tGA\tGeorgia\tEmanuel County\t650\t35.7\t8.6\t12.0\t13542\t62647\t0.3621\t30464\tRomney\t30464\t0.002388351\t30464.0\n3992\t-82.157473\t32.583006\tTwin City\tGA\tGeorgia\tEmanuel County\t1874\t37.7\t12.3\t10.7\t14621\t60000\t0.3621\t30471\tRomney\t30471\t0.006885799000000001\t30471.0\n3993\t-82.325723\t32.381785\tOak Park town\tGA\tGeorgia\tEmanuel County\t356\t36.0\t15.3\t9.4\t15160\t65333\t0.3621\t304HH\tRomney\t304HH\t0.001308081\t0.0\n3994\t-82.33521400000001\t32.586426\tSwainsboro city\tGA\tGeorgia\tEmanuel County\t7440\t36.3\t14.0\t9.3\t15039\t71867\t0.3621\t30401\tRomney\t30401\t0.027337432000000002\t30401.0\n3995\t-82.34699599999999\t32.491692\tNunez town\tGA\tGeorgia\tEmanuel County\t138\t35.6\t20.6\t7.2\t16457\t65833\t0.3621\t30448\tRomney\t30448\t0.000507065\t30448.0\n3996\t-81.930595\t32.15368\tHagan city\tGA\tGeorgia\tEvans County\t1036\t38.2\t18.0\t10.5\t17988\t92857\t0.3559\t30429\tRomney\t30429\t0.0038066640000000004\t30429.0\n3997\t-81.974313\t32.152671999999995\tBellville city\tGA\tGeorgia\tEvans County\t161\t37.0\t12.5\t12.7\t16711\t90000\t0.3559\t30414\tRomney\t30414\t0.000591576\t30414.0\n3998\t-81.908074\t32.161235999999995\tClaxton city\tGA\tGeorgia\tEvans County\t2620\t36.4\t17.2\t12.9\t15006\t85732\t0.3559\t30417\tRomney\t30417\t0.009626891\t30417.0\n3999\t-81.836223\t32.150957\tDaisy city\tGA\tGeorgia\tEvans County\t150\t39.5\t6.1\t13.3\t13875\t65000\t0.3559\t30423\tRomney\t30423\t0.000551158\t30423.0\n4000\t-84.370698\t34.981128000000005\tMcCaysville city\tGA\tGeorgia\tFannin County\t1299\t45.1\t9.3\t13.9\t18408\t92031\t0.2025\t30555\tRomney\t30555\t0.004773027\t30555.0\n4001\t-84.244226\t34.875533000000004\tMorganton town\tGA\tGeorgia\tFannin County\t318\t45.2\t18.9\t10.5\t19633\t123611\t0.2025\t30560\tRomney\t30560\t0.001168455\t30560.0\n4002\t-84.325047\t34.865344\tBlue Ridge city\tGA\tGeorgia\tFannin County\t1624\t42.8\t8.8\t10.5\t17261\t97727\t0.2025\t30513\tRomney\t30513\t0.005967203000000001\t30513.0\n4003\t-84.594561\t33.4746\tTyrone town\tGA\tGeorgia\tFayette County\t5724\t41.1\t37.5\t8.6\t36311\t174516\t0.337\t30290\tRomney\t30290\t0.021032186\t30290.0\n4004\t-84.411579\t33.362507\tWoolsey town\tGA\tGeorgia\tFayette County\t213\t42.6\t33.8\t7.2\t41674\t231818\t0.337\t30215\tRomney\t30215\t0.000782644\t30215.0\n4005\t-84.45898299999999\t33.292751\tBrooks town\tGA\tGeorgia\tFayette County\t633\t37.3\t24.0\t5.2\t29775\t155682\t0.337\t30205\tRomney\t30205\t0.002325886\t30205.0\n4006\t-84.568736\t33.392689000000004\tPeachtree City\tGA\tGeorgia\tFayette County\t35855\t38.5\t48.6\t8.3\t42889\t212918\t0.337\t30269\tRomney\t30269\t0.131745111\t30269.0\n4007\t-84.45983100000001\t33.449196\tFayetteville city\tGA\tGeorgia\tFayette County\t14923\t41.0\t34.3\t8.1\t36133\t161287\t0.337\t30214\tRomney\t30214\t0.054832862999999996\t30214.0\n4008\t-85.187991\t34.267903999999994\tRome city\tGA\tGeorgia\tFloyd County\t36597\t36.3\t20.3\t13.2\t18636\t92530\t0.2936\t30161\tRomney\t30161\t0.134471505\t30161.0\n4009\t-85.338575\t34.106601\tCave Spring city\tGA\tGeorgia\tFloyd County\t1059\t44.5\t19.2\t8.0\t19739\t94219\t0.2936\t30124\tRomney\t30124\t0.003891175\t30124.0\n4010\t-85.180788\t34.188171000000004\tLindale CDP\tGA\tGeorgia\tFloyd County\t4274\t40.3\t22.7\t10.5\t20554\t87690\t0.2936\t30147\tRomney\t30147\t0.015704326\t30147.0\n4011\t-85.085298\t34.340565999999995\tShannon CDP\tGA\tGeorgia\tFloyd County\t1771\t40.0\t9.8\t9.8\t19053\t79779\t0.2936\t30733\tRomney\t30733\t0.0065073380000000005\t30733.0\n4012\t-84.13574100000001\t34.20735\tCumming city\tGA\tGeorgia\tForsyth County\t5264\t36.7\t27.1\t9.0\t27197\t167053\t0.1783\t30041\tRomney\t30041\t0.019341968\t30041.0\n4013\t-83.100278\t34.287831\tRoyston city\tGA\tGeorgia\tFranklin County\t2579\t39.5\t14.1\t11.9\t16988\t87143\t0.1931\t30662\tRomney\t30662\t0.009476242\t30662.0\n4014\t-83.145262\t34.284086\tFranklin Springs city\tGA\tGeorgia\tFranklin County\t885\t36.5\t25.4\t6.4\t20997\t110795\t0.1931\t30639\tRomney\t30639\t0.003251832\t30639.0\n4015\t-83.100188\t34.349987\tCanon city\tGA\tGeorgia\tFranklin County\t895\t39.3\t12.3\t13.5\t15248\t78913\t0.1931\t30520\tRomney\t30520\t0.003288575\t30520.0\n4016\t-83.097925\t34.494648\tGumlog CDP\tGA\tGeorgia\tFranklin County\t2212\t48.0\t18.6\t16.0\t23912\t150605\t0.1931\t30553\tRomney\t30553\t0.008127742\t30553.0\n4017\t-83.233034\t34.371913\tCarnesville city\tGA\tGeorgia\tFranklin County\t623\t41.4\t17.1\t8.8\t17792\t108333\t0.1931\t30521\tRomney\t30521\t0.002289142\t30521.0\n4018\t-83.107738\t34.435587\tLavonia city\tGA\tGeorgia\tFranklin County\t1780\t42.1\t11.5\t18.7\t16318\t96129\t0.1931\t30553\tRomney\t30553\t0.006540407\t30553.0\n4019\t-84.409314\t33.660926\tHapeville city\tGA\tGeorgia\tFulton County\t7187\t35.6\t17.5\t13.0\t20222\t73577\t0.6428\t30354\tRomney\t30354\t0.026407812000000003\t30354.0\n4020\t-84.467557\t33.671563\tEast Point city\tGA\tGeorgia\tFulton County\t45108\t31.6\t24.4\t15.7\t18914\t84122\t0.6428\t30344\tRomney\t30344\t0.165744204\t30344.0\n4021\t-84.349118\t34.036196000000004\tRoswell city\tGA\tGeorgia\tFulton County\t96464\t37.0\t59.1\t8.7\t43286\t199430\t0.6428\t30076\tRomney\t30076\t0.35444597299999997\t30076.0\n4022\t-84.329122\t33.764105\tAtlanta city\tGA\tGeorgia\tFulton County\t505580\t33.5\t40.6\t16.8\t31389\t122907\t0.6428\t30307\tRomney\t30307\t1.857696082\t30307.0\n4023\t-84.370019\t33.937663\tSandy Springs CDP\tGA\tGeorgia\tFulton County\t101390\t34.8\t66.8\t8.9\t51372\t328624\t0.6428\t30328\tRomney\t30328\t0.372545998\t30328.0\n4024\t-84.412687\t34.086736\tMountain Park city\tGA\tGeorgia\tFulton County\t664\t36.8\t69.8\t8.5\t59690\t292373\t0.6428\t30075\tRomney\t30075\t0.002439792\t30075.0\n4025\t-84.544201\t33.579029\tUnion City\tGA\tGeorgia\tFulton County\t17626\t31.5\t25.8\t12.3\t22778\t81115\t0.6428\t30291\tRomney\t30291\t0.064764728\t30291.0\n4026\t-84.585942\t33.564608\tFairburn city\tGA\tGeorgia\tFulton County\t8810\t36.8\t21.2\t9.7\t23278\t87563\t0.6428\t30213\tRomney\t30213\t0.032371341\t30213.0\n4027\t-84.274374\t34.071345\tAlpharetta city\tGA\tGeorgia\tFulton County\t49548\t34.8\t62.8\t8.9\t46356\t202608\t0.6428\t30022\tRomney\t30022\t0.182058478\t30022.0\n4028\t-84.659538\t33.528568\tPalmetto city\tGA\tGeorgia\tFulton County\t5044\t35.5\t12.4\t8.6\t21128\t81190\t0.6428\t30268\tRomney\t30268\t0.018533603\t30268.0\n4029\t-84.486633\t34.692107\tEllijay city\tGA\tGeorgia\tGilmer County\t1973\t37.3\t14.8\t11.6\t17477\t128526\t0.1777\t30539\tRomney\t30539\t0.007249564\t30539.0\n4030\t-84.471539\t34.68472\tEast Ellijay city\tGA\tGeorgia\tGilmer County\t831\t39.3\t14.0\t11.8\t18055\t138942\t0.1777\t30539\tRomney\t30539\t0.003053415\t30539.0\n4031\t-82.625051\t33.153352000000005\tEdge Hill city\tGA\tGeorgia\tGlascock County\t29\t40.0\t9.1\t8.3\t19012\t55000\t0.132\t30810\tRomney\t30810\t0.000106557\t30810.0\n4032\t-82.596742\t33.233327\tGibson city\tGA\tGeorgia\tGlascock County\t788\t44.7\t10.6\t14.6\t17510\t72941\t0.132\t30810\tRomney\t30810\t0.0028954159999999996\t30810.0\n4033\t-82.703263\t33.219827\tMitchell town\tGA\tGeorgia\tGlascock County\t170\t44.2\t6.4\t8.5\t18683\t67000\t0.132\t30820\tRomney\t30820\t0.000624646\t30820.0\n4034\t-81.46224699999999\t31.211305\tCountry Club Estates CDP\tGA\tGeorgia\tGlynn County\t8027\t34.3\t22.0\t10.2\t22507\t81038\t0.3607\t31520\tRomney\t31520\t0.029494297000000003\t31520.0\n4035\t-81.481197\t31.149243\tBrunswick city\tGA\tGeorgia\tGlynn County\t15266\t35.6\t15.4\t15.2\t15593\t66529\t0.3607\t31520\tRomney\t31520\t0.056093177\t31520.0\n4036\t-81.385403\t31.175086\tSt. Simons CDP\tGA\tGeorgia\tGlynn County\t14943\t50.0\t57.0\t7.1\t40767\t248122\t0.3607\t31522\tRomney\t31522\t0.05490635\t31522.0\n4037\t-81.515653\t31.203059000000003\tDock Junction CDP\tGA\tGeorgia\tGlynn County\t7473\t37.1\t11.2\t10.4\t18576\t70205\t0.3607\t31520\tRomney\t31520\t0.027458687000000002\t31520.0\n4038\t-85.03339799999999\t34.405813\tPlainville city\tGA\tGeorgia\tGordon County\t316\t38.8\t7.9\t9.4\t18030\t105500\t0.2036\t30733\tRomney\t30733\t0.001161106\t30733.0\n4039\t-84.711078\t34.501265000000004\tRanger town\tGA\tGeorgia\tGordon County\t124\t39.7\t23.5\t16.4\t22036\t102083\t0.2036\t30734\tRomney\t30734\t0.000455624\t30734.0\n4040\t-84.94422800000001\t34.493111999999996\tCalhoun city\tGA\tGeorgia\tGordon County\t13261\t36.6\t15.9\t14.3\t20129\t123698\t0.2036\t30701\tRomney\t30701\t0.048726032999999995\t30701.0\n4041\t-84.944298\t34.578697\tResaca city\tGA\tGeorgia\tGordon County\t970\t36.4\t5.2\t12.5\t17847\t114205\t0.2036\t307HH\tRomney\t307HH\t0.0035641540000000004\t0.0\n4042\t-84.700746\t34.439873999999996\tFairmount city\tGA\tGeorgia\tGordon County\t933\t40.5\t9.7\t12.9\t19344\t104722\t0.2036\t30139\tRomney\t30139\t0.003428202\t30139.0\n4043\t-84.32472\t30.884559999999997\tWhigham city\tGA\tGeorgia\tGrady County\t656\t40.3\t9.4\t8.4\t15019\t84167\t0.3639\t31797\tRomney\t31797\t0.0024103970000000003\t31797.0\n4044\t-84.204972\t30.879514\tCairo city\tGA\tGeorgia\tGrady County\t9426\t35.0\t12.5\t17.4\t13953\t73827\t0.3639\t31728\tRomney\t31728\t0.034634763\t31728.0\n4045\t-83.07527900000001\t33.618083\tUnion Point city\tGA\tGeorgia\tGreene County\t1574\t40.9\t9.0\t16.1\t15603\t67333\t0.3846\t30669\tRomney\t30669\t0.005783484\t30669.0\n4046\t-83.037486\t33.480659\tWhite Plains city\tGA\tGeorgia\tGreene County\t299\t47.1\t17.8\t12.1\t20840\t93571\t0.3846\t30678\tRomney\t30678\t0.001098641\t30678.0\n4047\t-83.10622\t33.671403999999995\tWoodville city\tGA\tGeorgia\tGreene County\t383\t38.6\t7.2\t18.9\t13766\t63333\t0.3846\t30669\tRomney\t30669\t0.00140729\t30669.0\n4048\t-83.182698\t33.574925\tGreensboro city\tGA\tGeorgia\tGreene County\t3414\t35.0\t16.5\t12.2\t14833\t89211\t0.3846\t30642\tRomney\t30642\t0.012544353999999999\t30642.0\n4049\t-83.08171\t33.536801000000004\tSiloam town\tGA\tGeorgia\tGreene County\t322\t38.4\t3.8\t10.1\t14293\t68889\t0.3846\t30665\tRomney\t30665\t0.001183152\t30665.0\n4050\t-83.95613399999999\t33.890128999999995\tGrayson city\tGA\tGeorgia\tGwinnett County\t2040\t33.4\t31.6\t6.1\t32873\t179517\t0.4466\t30017\tRomney\t30017\t0.007495747\t30017.0\n4051\t-84.184154\t33.982646\tBerkeley Lake city\tGA\tGeorgia\tGwinnett County\t1912\t38.2\t70.0\t9.0\t56877\t328571\t0.4466\t30096\tRomney\t30096\t0.0070254259999999995\t30096.0\n4052\t-84.004621\t33.856082\tSnellville city\tGA\tGeorgia\tGwinnett County\t18301\t38.5\t30.7\t9.9\t32800\t161678\t0.4466\t30078\tRomney\t30078\t0.067244938\t30078.0\n4053\t-83.972391\t34.137196\tRest Haven town\tGA\tGeorgia\tGwinnett County\t185\t37.3\t10.7\t14.1\t20926\t91000\t0.4466\t30518\tRomney\t30518\t0.0006797610000000001\t30518.0\n4054\t-84.15168299999999\t34.006327\tDuluth city\tGA\tGeorgia\tGwinnett County\t25157\t35.3\t47.6\t8.4\t37969\t179415\t0.4466\t30097\tRomney\t30097\t0.092436529\t30097.0\n4055\t-84.07051\t34.051689\tSuwanee city\tGA\tGeorgia\tGwinnett County\t15725\t34.4\t50.6\t6.3\t40345\t235356\t0.4466\t30024\tRomney\t30024\t0.05777972\t30024.0\n4056\t-83.88796500000001\t33.983184\tDacula city\tGA\tGeorgia\tGwinnett County\t4451\t33.4\t22.1\t9.1\t29852\t147537\t0.4466\t30019\tRomney\t30019\t0.016354692\t30019.0\n4057\t-84.13808399999999\t33.888714\tLilburn city\tGA\tGeorgia\tGwinnett County\t12510\t37.0\t34.9\t10.8\t30298\t156583\t0.4466\t30047\tRomney\t30047\t0.045966569000000006\t30047.0\n4058\t-84.042502\t34.100006\tSugar Hill city\tGA\tGeorgia\tGwinnett County\t17216\t34.4\t32.9\t8.8\t32215\t159189\t0.4466\t30518\tRomney\t30518\t0.06325823\t30518.0\n4059\t-84.130901\t33.845481\tMountain Park CDP\tGA\tGeorgia\tGwinnett County\t12818\t45.6\t39.4\t11.0\t35772\t165958\t0.4466\t300HH\tRomney\t300HH\t0.04709828\t0.0\n4060\t-84.208027\t33.94031\tNorcross city\tGA\tGeorgia\tGwinnett County\t9860\t30.3\t24.1\t17.2\t22843\t135170\t0.4466\t30071\tRomney\t30071\t0.036229446\t30071.0\n4061\t-83.992891\t33.951678\tLawrenceville city\tGA\tGeorgia\tGwinnett County\t26196\t33.3\t23.3\t11.5\t28350\t146362\t0.4466\t30045\tRomney\t30045\t0.09625421599999999\t30045.0\n4062\t-83.974634\t34.149436\tBuford city\tGA\tGeorgia\tGwinnett County\t12757\t34.1\t14.8\t12.8\t24077\t103984\t0.4466\t30518\tRomney\t30518\t0.046874142\t30518.0\n4063\t-83.52334599999999\t34.609128000000005\tClarkesville city\tGA\tGeorgia\tHabersham County\t1807\t39.5\t25.1\t11.9\t19331\t141896\t0.1572\t30535\tRomney\t30535\t0.006639616\t30535.0\n4064\t-83.502659\t34.517834\tMount Airy town\tGA\tGeorgia\tHabersham County\t810\t39.2\t30.1\t11.1\t21866\t128000\t0.1572\t30531\tRomney\t30531\t0.002976253\t30531.0\n4065\t-83.537604\t34.494440999999995\tBaldwin city\tGA\tGeorgia\tHabersham County\t2860\t34.1\t13.9\t9.9\t15958\t106701\t0.1572\t30531\tRomney\t30531\t0.010508743999999999\t30531.0\n4066\t-83.542138\t34.564928\tDemorest city\tGA\tGeorgia\tHabersham County\t1781\t38.2\t21.6\t9.9\t20293\t118284\t0.1572\t30535\tRomney\t30535\t0.006544080999999999\t30535.0\n4067\t-83.600324\t34.454591\tRaoul CDP\tGA\tGeorgia\tHabersham County\t2249\t27.9\t17.7\t15.7\t16307\t107566\t0.1572\t30510\tRomney\t30510\t0.008263694\t30510.0\n4068\t-83.53018399999999\t34.514578\tCornelia city\tGA\tGeorgia\tHabersham County\t4266\t38.0\t22.9\t13.4\t19172\t122266\t0.1572\t30531\tRomney\t30531\t0.015674931\t30531.0\n4069\t-83.375557\t34.740582\tTallulah Falls town\tGA\tGeorgia\tHabersham County\t177\t41.9\t21.0\t8.7\t21109\t123438\t0.1572\t30552\tRomney\t30552\t0.000650366\t30552.0\n4070\t-83.886162\t34.227889000000005\tOakwood city\tGA\tGeorgia\tHall County\t4095\t31.0\t15.2\t11.5\t19915\t112109\t0.2118\t30566\tRomney\t30566\t0.015046611000000001\t30566.0\n4071\t-83.774523\t34.477563\tClermont town\tGA\tGeorgia\tHall County\t649\t39.5\t25.0\t7.5\t22012\t144271\t0.2118\t30527\tRomney\t30527\t0.002384677\t30527.0\n4072\t-83.834921\t34.304121\tGainesville city\tGA\tGeorgia\tHall County\t33409\t31.2\t26.4\t11.9\t20546\t136213\t0.2118\t30501\tRomney\t30501\t0.12275756199999999\t30501.0\n4073\t-83.922688\t34.181176\tFlowery Branch town\tGA\tGeorgia\tHall County\t3981\t37.3\t19.2\t7.9\t23366\t118697\t0.2118\t30542\tRomney\t30542\t0.014627731000000001\t30542.0\n4074\t-83.653587\t34.394021\tLula city\tGA\tGeorgia\tHall County\t1929\t37.5\t10.7\t10.8\t19915\t89571\t0.2118\t30554\tRomney\t30554\t0.007087891\t30554.0\n4075\t-82.97046999999999\t33.276694\tSparta city\tGA\tGeorgia\tHancock County\t1376\t36.6\t11.7\t21.1\t12419\t53750\t0.8092\t31087\tRomney\t31087\t0.005055955\t31087.0\n4076\t-85.18798199999999\t33.800618\tBuchanan city\tGA\tGeorgia\tHaralson County\t1104\t40.4\t9.7\t10.7\t16955\t72500\t0.1724\t30113\tRomney\t30113\t0.004056522\t30113.0\n4077\t-85.286433\t33.745540999999996\tTallapoosa city\tGA\tGeorgia\tHaralson County\t2961\t39.1\t13.6\t9.8\t18876\t74096\t0.1724\t30176\tRomney\t30176\t0.010879857\t30176.0\n4078\t-85.18638100000001\t33.702219\tWaco city\tGA\tGeorgia\tHaralson County\t522\t37.0\t13.6\t11.3\t17251\t76250\t0.1724\t30110\tRomney\t30110\t0.00191803\t30110.0\n4079\t-85.146389\t33.716372\tBremen city\tGA\tGeorgia\tHaralson County\t5501\t38.0\t15.9\t10.4\t18319\t91024\t0.1724\t30110\tRomney\t30110\t0.020212797\t30110.0\n4080\t-84.698921\t32.812011\tShiloh city\tGA\tGeorgia\tHarris County\t488\t38.6\t12.6\t8.4\t18986\t64318\t0.2676\t31826\tRomney\t31826\t0.0017930999999999997\t31826.0\n4081\t-84.73789000000001\t32.683787\tWaverly Hall town\tGA\tGeorgia\tHarris County\t810\t45.2\t10.4\t11.8\t19647\t66923\t0.2676\t31831\tRomney\t31831\t0.002976253\t31831.0\n4082\t-84.850974\t32.878639\tPine Mountain town\tGA\tGeorgia\tHarris County\t1557\t40.7\t28.7\t11.1\t22068\t86042\t0.2676\t31822\tRomney\t31822\t0.005721019\t31822.0\n4083\t-84.87827\t32.758376\tHamilton city\tGA\tGeorgia\tHarris County\t390\t43.3\t18.5\t8.6\t20734\t80000\t0.2676\t31823\tRomney\t31823\t0.001433011\t31823.0\n4084\t-83.083\t34.372572999999996\tBowersville town\tGA\tGeorgia\tHart County\t347\t37.0\t7.3\t14.5\t17028\t103846\t0.3018\t30516\tRomney\t30516\t0.001275012\t30516.0\n4085\t-82.92966899999999\t34.349985\tHartwell city\tGA\tGeorgia\tHart County\t4426\t41.8\t16.4\t21.4\t17595\t87333\t0.3018\t30643\tRomney\t30643\t0.016262833\t30643.0\n4086\t-82.90947\t34.438924\tReed Creek CDP\tGA\tGeorgia\tHart County\t2371\t49.6\t22.8\t12.5\t23361\t154087\t0.3018\t30643\tRomney\t30643\t0.008711969\t30643.0\n4087\t-85.103873\t33.368973\tCentralhatchee town\tGA\tGeorgia\tHeard County\t373\t37.6\t13.6\t10.7\t19638\t69333\t0.2272\t30217\tRomney\t30217\t0.001370546\t30217.0\n4088\t-85.260524\t33.40681\tEphesus town\tGA\tGeorgia\tHeard County\t389\t35.2\t10.7\t16.8\t14721\t68333\t0.2272\t30170\tRomney\t30170\t0.001429336\t30170.0\n4089\t-85.099406\t33.279703999999995\tFranklin city\tGA\tGeorgia\tHeard County\t932\t42.3\t9.8\t13.7\t14645\t81923\t0.2272\t30217\tRomney\t30217\t0.003424528\t30217.0\n4090\t-84.937424\t33.230512\tCorinth town\tGA\tGeorgia\tHeard County\t317\t36.4\t5.5\t14.6\t18074\t70714\t0.2272\t30230\tRomney\t30230\t0.00116478\t30230.0\n4091\t-84.11457\t33.34711\tLocust Grove city\tGA\tGeorgia\tHenry County\t3033\t35.1\t10.1\t10.7\t23357\t90000\t0.4789\t30248\tRomney\t30248\t0.011144413\t30248.0\n4092\t-84.15059000000001\t33.441948\tMcDonough city\tGA\tGeorgia\tHenry County\t17680\t33.8\t20.6\t14.0\t23520\t123341\t0.4789\t30253\tRomney\t30253\t0.064963145\t30253.0\n4093\t-84.285884\t33.384602\tHampton city\tGA\tGeorgia\tHenry County\t5396\t34.5\t14.9\t12.4\t25456\t109697\t0.4789\t30228\tRomney\t30228\t0.019826987\t30228.0\n4094\t-84.23401199999999\t33.532092999999996\tStockbridge city\tGA\tGeorgia\tHenry County\t21105\t33.0\t32.8\t10.9\t30914\t161364\t0.4789\t30281\tRomney\t30281\t0.07754791700000001\t30281.0\n4095\t-84.150684\t33.42173\tBlacksville CDP\tGA\tGeorgia\tHenry County\t5\t0.0\t0.0\t0.0\t26765\t0\t0.4789\t30253\tRomney\t30253\t1.84e-05\t30253.0\n4096\t-83.683923\t32.631832\tCenterville city\tGA\tGeorgia\tHouston County\t6416\t34.8\t18.7\t9.0\t22909\t91923\t0.391\t31028\tRomney\t31028\t0.023574861000000003\t31028.0\n4097\t-83.58442\t32.609133\tRobins AFB CDP\tGA\tGeorgia\tHouston County\t3517\t21.7\t22.8\t14.4\t14771\t72500\t0.391\t31098\tRomney\t31098\t0.012922816\t31098.0\n4098\t-83.7339\t32.512824\tPerry city\tGA\tGeorgia\tHouston County\t10283\t37.8\t19.2\t10.3\t19070\t91416\t0.391\t31069\tRomney\t31069\t0.037783711\t31069.0\n4099\t-83.636498\t32.611511\tWarner Robins city\tGA\tGeorgia\tHouston County\t53140\t34.6\t20.0\t10.8\t22394\t90836\t0.391\t31088\tRomney\t31088\t0.195256873\t31088.0\n4100\t-83.250023\t31.598803000000004\tOcilla city\tGA\tGeorgia\tIrwin County\t3430\t33.7\t12.4\t20.7\t14672\t58827\t0.3076\t31774\tRomney\t31774\t0.012603143999999998\t31774.0\n4101\t-83.76261\t34.093266\tHoschton city\tGA\tGeorgia\tJackson County\t1596\t37.4\t15.8\t10.0\t23023\t174813\t0.1788\t30548\tRomney\t30548\t0.00586432\t30548.0\n4102\t-83.717435\t34.183968\tTalmo town\tGA\tGeorgia\tJackson County\t560\t35.9\t11.7\t10.3\t20368\t169444\t0.1788\t30575\tRomney\t30575\t0.002057656\t30575.0\n4103\t-83.602335\t34.134858\tJefferson city\tGA\tGeorgia\tJackson County\t7669\t37.2\t20.4\t11.5\t20854\t163125\t0.1788\t30549\tRomney\t30549\t0.028178866\t30549.0\n4104\t-83.46346\t34.211053\tCommerce city\tGA\tGeorgia\tJackson County\t6801\t40.1\t14.7\t12.2\t20944\t121250\t0.1788\t30529\tRomney\t30529\t0.024989499\t30529.0\n4105\t-83.430109\t34.115433\tNicholson city\tGA\tGeorgia\tJackson County\t1619\t35.4\t10.7\t11.1\t19968\t122588\t0.1788\t30565\tRomney\t30565\t0.005948831\t30565.0\n4106\t-83.679888\t34.160337\tPendergrass city\tGA\tGeorgia\tJackson County\t440\t35.9\t11.7\t10.1\t20347\t165625\t0.1788\t30567\tRomney\t30567\t0.00161673\t30567.0\n4107\t-83.543874\t34.076553999999994\tArcade city\tGA\tGeorgia\tJackson County\t2417\t37.6\t13.2\t10.8\t18471\t132125\t0.1788\t30549\tRomney\t30549\t0.008880991\t30549.0\n4108\t-83.686762\t33.306744\tMonticello city\tGA\tGeorgia\tJasper County\t2868\t38.9\t20.8\t15.3\t19548\t84878\t0.3059\t31064\tRomney\t31064\t0.010538138999999998\t31064.0\n4109\t-83.588133\t33.40055\tShady Dale town\tGA\tGeorgia\tJasper County\t249\t34.6\t5.8\t11.0\t15553\t90455\t0.3059\t31085\tRomney\t31085\t0.000914922\t31085.0\n4110\t-82.597685\t31.865539000000002\tHazlehurst city\tGA\tGeorgia\tJeff Davis County\t3971\t38.7\t11.0\t14.9\t16231\t75200\t0.2389\t31539\tRomney\t31539\t0.014590987\t31539.0\n4111\t-82.695893\t31.723002\tDenton city\tGA\tGeorgia\tJeff Davis County\t276\t39.6\t8.2\t18.3\t16483\t56000\t0.2389\t31532\tRomney\t31532\t0.0010141310000000001\t31532.0\n4112\t-82.467539\t33.216786\tStapleton city\tGA\tGeorgia\tJefferson County\t332\t39.2\t11.3\t18.7\t15909\t67222\t0.5839\t30823\tRomney\t30823\t0.001219896\t30823.0\n4113\t-82.399879\t32.995487\tLouisville city\tGA\tGeorgia\tJefferson County\t2516\t36.3\t15.1\t18.5\t15176\t46615\t0.5839\t30434\tRomney\t30434\t0.009244755\t30434.0\n4114\t-82.529084\t33.19325\tAvera city\tGA\tGeorgia\tJefferson County\t203\t43.0\t2.7\t8.7\t17294\t64286\t0.5839\t30803\tRomney\t30803\t0.0007459\t30803.0\n4115\t-82.401402\t32.866419\tWadley city\tGA\tGeorgia\tJefferson County\t1844\t37.3\t6.5\t19.1\t12141\t43924\t0.5839\t30477\tRomney\t30477\t0.006775568\t30477.0\n4116\t-82.387835\t33.20722\tWrens city\tGA\tGeorgia\tJefferson County\t2119\t37.3\t8.2\t22.0\t16075\t73229\t0.5839\t30833\tRomney\t30833\t0.007786024\t30833.0\n4117\t-82.47154599999999\t32.882515999999995\tBartow town\tGA\tGeorgia\tJefferson County\t292\t38.1\t10.6\t23.1\t13341\t52500\t0.5839\t30413\tRomney\t30413\t0.0010729210000000001\t30413.0\n4118\t-81.942264\t32.806929\tMillen city\tGA\tGeorgia\tJenkins County\t3378\t38.2\t13.5\t27.0\t14910\t56679\t0.4389\t30442\tRomney\t30442\t0.012412076000000001\t30442.0\n4119\t-82.513915\t32.692488\tKite town\tGA\tGeorgia\tJohnson County\t226\t39.2\t7.9\t6.6\t16081\t51111\t0.34600000000000003\t31049\tRomney\t31049\t0.0008304110000000001\t31049.0\n4120\t-82.592218\t32.532453000000004\tAdrian city\tGA\tGeorgia\tJohnson County\t635\t40.5\t9.1\t15.8\t14500\t54333\t0.34600000000000003\t31002\tRomney\t31002\t0.002333235\t31002.0\n4121\t-82.720582\t32.726538\tWrightsville city\tGA\tGeorgia\tJohnson County\t2388\t35.3\t13.0\t15.3\t13800\t48947\t0.34600000000000003\t31096\tRomney\t31096\t0.008774434000000001\t31096.0\n4122\t-83.535951\t33.007878000000005\tGray city\tGA\tGeorgia\tJones County\t2688\t41.1\t21.4\t14.1\t22580\t105655\t0.3531\t31032\tRomney\t31032\t0.00987675\t31032.0\n4123\t-84.17627399999999\t33.050754\tAldora town\tGA\tGeorgia\tLamar County\t106\t41.8\t19.5\t9.1\t21705\t101786\t0.3427\t30204\tRomney\t30204\t0.000389485\t30204.0\n4124\t-84.19489\t33.116254999999995\tMilner city\tGA\tGeorgia\tLamar County\t584\t39.1\t12.4\t10.9\t19662\t81429\t0.3427\t30257\tRomney\t30257\t0.002145841\t30257.0\n4125\t-84.150894\t33.050841999999996\tBarnesville city\tGA\tGeorgia\tLamar County\t6131\t36.0\t16.2\t13.8\t18862\t79253\t0.3427\t30204\tRomney\t30204\t0.022527661\t30204.0\n4126\t-83.074802\t31.041025\tLakeland city\tGA\tGeorgia\tLanier County\t2816\t33.8\t14.5\t14.0\t14567\t60147\t0.3748\t31635\tRomney\t31635\t0.010347071\t31635.0\n4127\t-83.05946899999999\t32.432821000000004\tDexter town\tGA\tGeorgia\tLaurens County\t539\t38.9\t17.4\t9.7\t20473\t77308\t0.3832\t31019\tRomney\t31019\t0.0019804939999999997\t31019.0\n4128\t-82.922622\t32.538631\tDublin city\tGA\tGeorgia\tLaurens County\t16493\t39.0\t23.7\t15.9\t19216\t97651\t0.3832\t31021\tRomney\t31021\t0.060601649\t31021.0\n4129\t-83.153565\t32.559475\tMontrose town\tGA\tGeorgia\tLaurens County\t155\t41.6\t4.6\t15.6\t17950\t67000\t0.3832\t31065\tRomney\t31065\t0.00056953\t31065.0\n4130\t-82.868981\t32.549723\tEast Dublin city\tGA\tGeorgia\tLaurens County\t2555\t36.4\t5.5\t12.3\t14449\t64552\t0.3832\t31027\tRomney\t31027\t0.009388056\t31027.0\n4131\t-83.081639\t32.531105\tDudley city\tGA\tGeorgia\tLaurens County\t435\t40.5\t24.8\t8.7\t20967\t103571\t0.3832\t31022\tRomney\t31022\t0.0015983579999999998\t31022.0\n4132\t-82.991804\t32.383515\tRentz town\tGA\tGeorgia\tLaurens County\t311\t41.7\t14.8\t9.7\t19123\t77308\t0.3832\t31075\tRomney\t31075\t0.0011427339999999999\t31075.0\n4133\t-83.041892\t32.339461\tCadwell town\tGA\tGeorgia\tLaurens County\t350\t40.7\t16.9\t9.4\t18259\t71667\t0.3832\t31009\tRomney\t31009\t0.001286035\t31009.0\n4134\t-84.169431\t31.733\tLeesburg city\tGA\tGeorgia\tLee County\t2805\t34.2\t12.1\t11.7\t19257\t72453\t0.2345\t31763\tRomney\t31763\t0.010306653\t31763.0\n4135\t-84.255162\t31.901093\tSmithville city\tGA\tGeorgia\tLee County\t1113\t34.4\t7.9\t11.7\t15013\t60000\t0.2345\t31787\tRomney\t31787\t0.004089592\t31787.0\n4136\t-81.443832\t31.726408000000003\tRiceboro city\tGA\tGeorgia\tLiberty County\t735\t38.9\t5.9\t11.6\t13093\t51875\t0.6467\t31323\tRomney\t31323\t0.002700674\t31323.0\n4137\t-81.684764\t31.836333000000003\tGumbranch city\tGA\tGeorgia\tLiberty County\t291\t27.5\t11.3\t10.1\t18041\t103571\t0.6467\t31313\tRomney\t31313\t0.001069246\t31313.0\n4138\t-81.622135\t31.772078999999998\tWalthourville city\tGA\tGeorgia\tLiberty County\t3902\t25.3\t14.3\t13.8\t14998\t93625\t0.6467\t31301\tRomney\t31301\t0.014337454\t31301.0\n4139\t-81.609251\t31.823586\tHinesville city\tGA\tGeorgia\tLiberty County\t30530\t26.7\t19.6\t12.6\t18070\t109285\t0.6467\t31313\tRomney\t31313\t0.112179005\t31313.0\n4140\t-81.560165\t31.850077000000002\tFlemington city\tGA\tGeorgia\tLiberty County\t402\t30.1\t15.6\t9.9\t16847\t111250\t0.6467\t31314\tRomney\t31314\t0.0014771029999999998\t31314.0\n4141\t-81.609916\t31.872283000000003\tFort Stewart CDP\tGA\tGeorgia\tLiberty County\t9124\t21.9\t12.9\t18.5\t13468\t42778\t0.6467\t31314\tRomney\t31314\t0.033525097999999996\t31314.0\n4142\t-81.43087\t31.804047999999998\tMidway city\tGA\tGeorgia\tLiberty County\t1185\t35.7\t12.0\t9.3\t16409\t76579\t0.6467\t31320\tRomney\t31320\t0.004354147\t31320.0\n4143\t-81.607682\t31.783728999999997\tAllenhurst town\tGA\tGeorgia\tLiberty County\t709\t25.8\t14.7\t14.6\t14649\t97000\t0.6467\t31301\tRomney\t31301\t0.00260514\t31301.0\n4144\t-82.47933\t33.792743\tLincolnton city\tGA\tGeorgia\tLincoln County\t1479\t41.5\t15.7\t12.0\t16584\t91964\t0.3583\t30817\tRomney\t30817\t0.0054344169999999995\t30817.0\n4145\t-81.746376\t31.710162\tLudowici city\tGA\tGeorgia\tLong County\t1704\t30.1\t10.9\t10.6\t13240\t50294\t0.3793\t313HH\tRomney\t313HH\t0.0062611540000000005\t0.0\n4146\t-83.21379\t30.979349\tMoody AFB CDP\tGA\tGeorgia\tLowndes County\t991\t27.9\t15.9\t6.4\t17937\t90000\t0.4464\t31699\tRomney\t31699\t0.0036413170000000003\t31699.0\n4147\t-83.22578399999999\t30.746216999999998\tDasher town\tGA\tGeorgia\tLowndes County\t954\t39.5\t18.6\t7.0\t18960\t88333\t0.4464\t31606\tRomney\t31606\t0.0035053640000000004\t31606.0\n4148\t-83.308949\t30.844246000000002\tRemerton city\tGA\tGeorgia\tLowndes County\t981\t23.6\t43.6\t10.3\t18948\t88974\t0.4464\t31602\tRomney\t31602\t0.003604573\t31602.0\n4149\t-83.278867\t30.848937\tValdosta city\tGA\tGeorgia\tLowndes County\t46699\t29.6\t28.8\t10.6\t19993\t97259\t0.4464\t31602\tRomney\t31602\t0.171590153\t31602.0\n4150\t-83.18780500000001\t30.685071\tLake Park city\tGA\tGeorgia\tLowndes County\t675\t41.8\t29.2\t7.3\t25745\t125000\t0.4464\t31636\tRomney\t31636\t0.002480211\t31636.0\n4151\t-83.376635\t30.992019\tHahira city\tGA\tGeorgia\tLowndes County\t2146\t33.5\t13.0\t8.7\t17627\t71455\t0.4464\t31632\tRomney\t31632\t0.007885231999999999\t31632.0\n4152\t-83.98061700000001\t34.530193\tDahlonega city\tGA\tGeorgia\tLumpkin County\t4597\t31.9\t30.6\t11.3\t20735\t193269\t0.1884\t30533\tRomney\t30533\t0.016891153\t30533.0\n4153\t-82.499122\t33.466586\tThomson city\tGA\tGeorgia\tMcDuffie County\t6772\t36.6\t16.8\t17.3\t17357\t88832\t0.4216\t30824\tRomney\t30824\t0.024882942\t30824.0\n4154\t-82.385143\t33.414784000000004\tDearing town\tGA\tGeorgia\tMcDuffie County\t543\t40.4\t10.2\t9.0\t18470\t84583\t0.4216\t30808\tRomney\t30808\t0.0019951920000000002\t30808.0\n4155\t-81.429018\t31.372009999999996\tDarien city\tGA\tGeorgia\tMcIntosh County\t1815\t35.4\t19.1\t7.4\t15423\t56373\t0.4517\t31305\tRomney\t31305\t0.006669011\t31305.0\n4156\t-84.18953499999999\t32.372699\tIdeal city\tGA\tGeorgia\tMacon County\t449\t44.1\t7.8\t9.0\t14174\t42381\t0.6716\t31041\tRomney\t31041\t0.001649799\t31041.0\n4157\t-84.025143\t32.299519000000004\tMontezuma city\tGA\tGeorgia\tMacon County\t3813\t37.0\t16.5\t19.4\t14162\t66852\t0.6716\t31063\tRomney\t31063\t0.014010433999999999\t31063.0\n4158\t-83.94080799999999\t32.456413\tMarshallville city\tGA\tGeorgia\tMacon County\t1270\t39.9\t15.5\t12.8\t14935\t63452\t0.6716\t31057\tRomney\t31057\t0.00466647\t31057.0\n4159\t-84.061992\t32.293898999999996\tOglethorpe city\tGA\tGeorgia\tMacon County\t1034\t38.9\t12.0\t18.9\t15739\t47581\t0.6716\t31068\tRomney\t31068\t0.003799315\t31068.0\n4160\t-83.29290999999999\t34.172445\tIla city\tGA\tGeorgia\tMadison County\t369\t40.8\t17.7\t6.6\t20740\t103750\t0.2246\t30633\tRomney\t30633\t0.0013558479999999998\t30633.0\n4161\t-83.12579699999999\t34.061712\tComer city\tGA\tGeorgia\tMadison County\t1283\t41.1\t14.5\t7.1\t18090\t81042\t0.2246\t30629\tRomney\t30629\t0.0047142370000000005\t30629.0\n4162\t-83.03805799999999\t34.043401\tCarlton city\tGA\tGeorgia\tMadison County\t248\t41.0\t14.4\t6.7\t18087\t80000\t0.2246\t306HH\tRomney\t306HH\t0.000911248\t0.0\n4163\t-83.294093\t34.015426\tHull city\tGA\tGeorgia\tMadison County\t165\t37.5\t8.1\t7.4\t20821\t85000\t0.2246\t30646\tRomney\t30646\t0.000606274\t30646.0\n4164\t-83.21924399999999\t34.125455\tDanielsville city\tGA\tGeorgia\tMadison County\t531\t39.3\t16.5\t5.8\t17994\t91429\t0.2246\t30633\tRomney\t30633\t0.001951099\t30633.0\n4165\t-83.212766\t34.037653999999996\tColbert city\tGA\tGeorgia\tMadison County\t541\t36.0\t15.0\t6.7\t18489\t96818\t0.2246\t30628\tRomney\t30628\t0.001987843\t30628.0\n4166\t-84.517739\t32.318813\tBuena Vista city\tGA\tGeorgia\tMarion County\t1604\t37.0\t13.9\t10.6\t14818\t67000\t0.4454\t31803\tRomney\t31803\t0.005893715\t31803.0\n4167\t-84.817392\t33.172402000000005\tLone Oak town\tGA\tGeorgia\tMeriwether County\t111\t35.3\t9.9\t11.6\t16215\t69000\t0.4675\t30220\tRomney\t30220\t0.00040785699999999997\t30220.0\n4168\t-84.67715799999999\t32.883790000000005\tWarm Springs city\tGA\tGeorgia\tMeriwether County\t456\t41.9\t19.0\t14.0\t20649\t66000\t0.4675\t31830\tRomney\t31830\t0.00167552\t31830.0\n4169\t-84.715851\t33.027910999999996\tGreenville city\tGA\tGeorgia\tMeriwether County\t930\t38.8\t13.7\t20.4\t14736\t59500\t0.4675\t30222\tRomney\t30222\t0.0034171790000000002\t30222.0\n4170\t-84.617049\t32.856652000000004\tManchester city\tGA\tGeorgia\tMeriwether County\t3974\t38.3\t14.6\t22.2\t18061\t57381\t0.4675\t31816\tRomney\t31816\t0.01460201\t31816.0\n4171\t-84.744744\t33.209835999999996\tLuthersville city\tGA\tGeorgia\tMeriwether County\t776\t36.9\t5.8\t19.4\t16828\t74118\t0.4675\t30251\tRomney\t30251\t0.002851324\t30251.0\n4172\t-84.581947\t32.984772\tWoodbury city\tGA\tGeorgia\tMeriwether County\t1115\t38.6\t11.4\t26.5\t14595\t53167\t0.4675\t30293\tRomney\t30293\t0.00409694\t30293.0\n4173\t-84.57549200000001\t33.093536\tGay town\tGA\tGeorgia\tMeriwether County\t150\t37.0\t9.9\t7.7\t21835\t101042\t0.4675\t30218\tRomney\t30218\t0.000551158\t30218.0\n4174\t-84.731059\t31.175084000000002\tColquitt city\tGA\tGeorgia\tMiller County\t1852\t41.4\t12.4\t9.0\t16763\t62614\t0.307\t31737\tRomney\t31737\t0.006804963000000001\t31737.0\n4175\t-84.021407\t31.262546\tSale City town\tGA\tGeorgia\tMitchell County\t320\t40.4\t11.4\t7.7\t19201\t88750\t0.4932\t31784\tRomney\t31784\t0.001175804\t31784.0\n4176\t-84.161784\t31.376535999999998\tBaconton city\tGA\tGeorgia\tMitchell County\t842\t34.8\t6.9\t13.9\t15263\t76538\t0.4932\t31716\tRomney\t31716\t0.003093833\t31716.0\n4177\t-84.207089\t31.236068\tCamilla city\tGA\tGeorgia\tMitchell County\t5568\t32.0\t15.4\t13.7\t14539\t74600\t0.4932\t31730\tRomney\t31730\t0.020458981\t31730.0\n4178\t-84.151565\t31.126571999999996\tPelham city\tGA\tGeorgia\tMitchell County\t4129\t33.9\t11.0\t9.8\t14156\t77188\t0.4932\t31779\tRomney\t31779\t0.01517154\t31779.0\n4179\t-84.093492\t32.863401\tCulloden city\tGA\tGeorgia\tMonroe County\t251\t44.2\t16.8\t7.1\t22809\t78571\t0.3083\t31016\tRomney\t31016\t0.000922271\t31016.0\n4180\t-83.942396\t33.033903\tForsyth city\tGA\tGeorgia\tMonroe County\t4395\t36.6\t19.6\t9.2\t19401\t80183\t0.3083\t31029\tRomney\t31029\t0.016148927\t31029.0\n4181\t-82.595403\t32.183439\tMount Vernon city\tGA\tGeorgia\tMontgomery County\t1970\t31.0\t18.8\t9.0\t15986\t65000\t0.2962\t30445\tRomney\t30445\t0.00723854\t30445.0\n4182\t-82.559963\t32.31864\tTarrytown village\tGA\tGeorgia\tMontgomery County\t97\t40.0\t13.8\t12.2\t16972\t60000\t0.2962\t30470\tRomney\t30470\t0.000356415\t30470.0\n4183\t-82.478977\t32.080886\tAlston town\tGA\tGeorgia\tMontgomery County\t154\t41.5\t15.9\t8.6\t19425\t63750\t0.2962\t30412\tRomney\t30412\t0.000565855\t30412.0\n4184\t-82.507977\t32.037031\tUvalda city\tGA\tGeorgia\tMontgomery County\t517\t40.3\t15.5\t9.0\t18353\t59167\t0.2962\t30473\tRomney\t30473\t0.0018996579999999998\t30473.0\n4185\t-82.466899\t32.216506\tHiggston town\tGA\tGeorgia\tMontgomery County\t392\t33.6\t16.9\t7.0\t15931\t66667\t0.2962\t30410\tRomney\t30410\t0.001440359\t30410.0\n4186\t-82.569491\t32.187805\tAiley city\tGA\tGeorgia\tMontgomery County\t522\t34.0\t15.6\t8.6\t15163\t58000\t0.2962\t30445\tRomney\t30445\t0.00191803\t30445.0\n4187\t-83.47590699999999\t33.578976000000004\tMadison city\tGA\tGeorgia\tMorgan County\t4650\t39.8\t25.8\t14.0\t20919\t128811\t0.305\t30650\tRomney\t30650\t0.017085895\t30650.0\n4188\t-83.514764\t33.737617\tBostwick town\tGA\tGeorgia\tMorgan County\t325\t39.1\t19.9\t12.1\t20884\t129808\t0.305\t30641\tRomney\t30641\t0.001194175\t30641.0\n4189\t-83.611417\t33.626318\tRutledge city\tGA\tGeorgia\tMorgan County\t817\t39.1\t19.4\t9.9\t21082\t144444\t0.305\t30663\tRomney\t30663\t0.003001973\t30663.0\n4190\t-83.36242\t33.568275\tBuckhead town\tGA\tGeorgia\tMorgan County\t213\t42.7\t26.3\t9.7\t23180\t142500\t0.305\t30625\tRomney\t30625\t0.000782644\t30625.0\n4191\t-84.763048\t34.822344\tEton city\tGA\tGeorgia\tMurray County\t370\t36.7\t7.8\t9.8\t18582\t57143\t0.2266\t30724\tRomney\t30724\t0.0013595229999999999\t30724.0\n4192\t-84.783936\t34.779590999999996\tChatsworth city\tGA\tGeorgia\tMurray County\t3780\t38.3\t17.4\t12.7\t19029\t97834\t0.2266\t30705\tRomney\t30705\t0.013889179\t30705.0\n4193\t-84.99224\t32.500558000000005\tBibb City town\tGA\tGeorgia\tMuscogee County\t467\t39.5\t5.9\t13.5\t16032\t57692\t0.603\t31904\tRomney\t31904\t0.001715938\t31904.0\n4194\t-84.876992\t32.509919000000004\tColumbus city (balance)\tGA\tGeorgia\tMuscogee County\t186939\t34.1\t24.4\t11.8\t21858\t104443\t0.603\t31907\tRomney\t31907\t0.686886047\t31907.0\n4195\t-83.872096\t33.62938\tOxford city\tGA\tGeorgia\tNewton County\t2235\t30.7\t20.3\t17.3\t20169\t103956\t0.5054\t30054\tRomney\t30054\t0.008212253000000001\t30054.0\n4196\t-83.848991\t33.604359\tCovington city\tGA\tGeorgia\tNewton County\t14859\t35.5\t16.2\t18.5\t19963\t108390\t0.5054\t30014\tRomney\t30014\t0.054597702000000005\t30014.0\n4197\t-83.695881\t33.516452\tNewborn town\tGA\tGeorgia\tNewton County\t791\t38.1\t12.4\t18.6\t20656\t116875\t0.5054\t30056\tRomney\t30056\t0.0029064390000000002\t30056.0\n4198\t-83.735178\t33.517938\tMansfield city\tGA\tGeorgia\tNewton County\t502\t39.5\t10.9\t18.7\t21618\t116071\t0.5054\t30055\tRomney\t30055\t0.001844542\t30055.0\n4199\t-83.89610400000001\t33.571123\tPorterdale town\tGA\tGeorgia\tNewton County\t1708\t35.1\t14.9\t12.8\t22934\t106959\t0.5054\t30070\tRomney\t30070\t0.006275851\t30070.0\n4200\t-83.501737\t33.827319\tNorth High Shoals town\tGA\tGeorgia\tOconee County\t534\t40.8\t36.6\t4.6\t25192\t138125\t0.2481\t30621\tRomney\t30621\t0.001962122\t30621.0\n4201\t-83.43717600000001\t33.817246000000004\tBishop town\tGA\tGeorgia\tOconee County\t179\t38.5\t26.4\t8.7\t22602\t114063\t0.2481\t30677\tRomney\t30677\t0.000657715\t30677.0\n4202\t-83.526677\t33.952569\tBogart town\tGA\tGeorgia\tOconee County\t1243\t36.7\t35.5\t6.2\t24555\t129779\t0.2481\t30622\tRomney\t30622\t0.004567262\t30622.0\n4203\t-83.407484\t33.861174\tWatkinsville town\tGA\tGeorgia\tOconee County\t2787\t40.1\t52.2\t4.9\t28957\t163483\t0.2481\t30677\tRomney\t30677\t0.010240514000000001\t30677.0\n4204\t-83.110541\t33.87041\tLexington city\tGA\tGeorgia\tOglethorpe County\t282\t41.0\t20.1\t6.3\t18154\t79000\t0.3051\t30630\tRomney\t30630\t0.0010361769999999999\t30630.0\n4205\t-83.173941\t33.755505\tMaxeys town\tGA\tGeorgia\tOglethorpe County\t231\t40.5\t11.3\t9.4\t18076\t80000\t0.3051\t30671\tRomney\t30671\t0.000848783\t30671.0\n4206\t-83.154839\t33.883004\tCrawford city\tGA\tGeorgia\tOglethorpe County\t944\t42.9\t23.9\t6.4\t18372\t91111\t0.3051\t30630\tRomney\t30630\t0.00346862\t30630.0\n4207\t-83.217941\t33.910256\tArnoldsville city\tGA\tGeorgia\tOglethorpe County\t345\t37.3\t15.3\t9.1\t18856\t106250\t0.3051\t30619\tRomney\t30619\t0.001267663\t30619.0\n4208\t-84.758264\t33.874868\tHiram city\tGA\tGeorgia\tPaulding County\t3245\t34.7\t11.9\t10.6\t28858\t124387\t0.2757\t30141\tRomney\t30141\t0.011923383000000001\t30141.0\n4209\t-84.954041\t33.986059999999995\tBraswell city\tGA\tGeorgia\tPaulding County\t214\t37.7\t10.0\t11.4\t22797\t137500\t0.2757\t30153\tRomney\t30153\t0.000786319\t30153.0\n4210\t-84.83888\t33.916451\tDallas city\tGA\tGeorgia\tPaulding County\t9646\t34.7\t14.2\t15.7\t23091\t117412\t0.2757\t30157\tRomney\t30157\t0.035443128\t30157.0\n4211\t-83.887867\t32.554772\tFort Valley city\tGA\tGeorgia\tPeach County\t8136\t32.0\t20.1\t24.6\t15249\t87599\t0.5339\t31030\tRomney\t31030\t0.029894805\t31030.0\n4212\t-83.754285\t32.650542\tByron city\tGA\tGeorgia\tPeach County\t3859\t38.0\t19.0\t10.6\t22904\t114497\t0.5339\t31008\tRomney\t31008\t0.014179456000000002\t31008.0\n4213\t-84.370609\t34.384772\tNelson city\tGA\tGeorgia\tPickens County\t758\t38.7\t19.7\t9.9\t23298\t128533\t0.1558\t30177\tRomney\t30177\t0.002785185\t30177.0\n4214\t-84.505255\t34.509757\tTalking Rock town\tGA\tGeorgia\tPickens County\t120\t37.5\t15.9\t10.5\t20614\t85000\t0.1558\t30175\tRomney\t30175\t0.00044092599999999996\t30175.0\n4215\t-84.428434\t34.470804\tJasper city\tGA\tGeorgia\tPickens County\t3123\t40.0\t15.6\t9.3\t23231\t101630\t0.1558\t30143\tRomney\t30143\t0.011475108000000001\t30143.0\n4216\t-82.243084\t31.299613\tBlackshear city\tGA\tGeorgia\tPierce County\t3707\t41.2\t17.7\t11.9\t16974\t88421\t0.1642\t31516\tRomney\t31516\t0.013620948999999999\t31516.0\n4217\t-82.11336899999999\t31.408678000000002\tOfferman city\tGA\tGeorgia\tPierce County\t400\t38.1\t12.7\t11.1\t15842\t80556\t0.1642\t31557\tRomney\t31557\t0.001469754\t31557.0\n4218\t-82.136012\t31.384578\tPatterson city\tGA\tGeorgia\tPierce County\t719\t38.1\t12.3\t11.8\t15095\t76176\t0.1642\t31557\tRomney\t31557\t0.002641884\t31557.0\n4219\t-84.341996\t33.100301\tZebulon city\tGA\tGeorgia\tPike County\t1569\t37.4\t19.4\t12.5\t18358\t97407\t0.1672\t30295\tRomney\t30295\t0.005765111999999999\t30295.0\n4220\t-84.43831800000001\t33.106423\tHilltop CDP\tGA\tGeorgia\tPike County\t458\t36.6\t19.5\t13.3\t17708\t95000\t0.1672\t30206\tRomney\t30206\t0.001682869\t30206.0\n4221\t-84.362564\t33.181063\tWilliamson town\tGA\tGeorgia\tPike County\t411\t36.8\t12.7\t10.3\t23308\t137500\t0.1672\t30292\tRomney\t30292\t0.0015101729999999999\t30292.0\n4222\t-84.30875400000001\t33.051111999999996\tMeansville city\tGA\tGeorgia\tPike County\t185\t41.6\t16.4\t10.7\t17547\t72500\t0.1672\t30256\tRomney\t30256\t0.0006797610000000001\t30256.0\n4223\t-84.438714\t33.091793\tConcord town\tGA\tGeorgia\tPike County\t388\t36.5\t19.8\t13.2\t17707\t95000\t0.1672\t30206\tRomney\t30206\t0.001425662\t30206.0\n4224\t-84.500211\t33.011953999999996\tMolena city\tGA\tGeorgia\tPike County\t547\t38.5\t14.2\t10.5\t20302\t95714\t0.1672\t30258\tRomney\t30258\t0.002009889\t30258.0\n4225\t-85.256591\t34.019566\tCedartown city\tGA\tGeorgia\tPolk County\t10205\t35.2\t13.8\t11.6\t16548\t107238\t0.2657\t30125\tRomney\t30125\t0.037497109\t30125.0\n4226\t-85.056634\t34.045607000000004\tAragon city\tGA\tGeorgia\tPolk County\t1263\t35.7\t10.4\t13.6\t15946\t82188\t0.2657\t30104\tRomney\t30104\t0.00464075\t30104.0\n4227\t-85.048651\t34.00934\tRockmart city\tGA\tGeorgia\tPolk County\t4237\t36.9\t11.0\t15.6\t19383\t107515\t0.2657\t30153\tRomney\t30153\t0.015568374\t30153.0\n4228\t-83.485055\t32.295702\tHawkinsville city\tGA\tGeorgia\tPulaski County\t4416\t37.0\t15.9\t15.5\t16910\t86053\t0.3311\t31036\tRomney\t31036\t0.016226089\t31036.0\n4229\t-83.388705\t33.325687\tEatonton city\tGA\tGeorgia\tPutnam County\t6599\t35.2\t11.7\t13.6\t15730\t72630\t0.3173\t31024\tRomney\t31024\t0.024247273\t31024.0\n4230\t-85.10502199999999\t31.885645\tGeorgetown city\tGA\tGeorgia\tQuitman County\t979\t42.3\t4.8\t14.2\t14573\t56087\t0.5426\t31754\tRomney\t31754\t0.0035972240000000004\t31754.0\n4231\t-83.432899\t34.846136\tTiger town\tGA\tGeorgia\tRabun County\t335\t48.7\t21.9\t13.1\t19232\t121739\t0.2089\t30525\tRomney\t30525\t0.001230919\t30525.0\n4232\t-83.383443\t34.972913\tDillard city\tGA\tGeorgia\tRabun County\t246\t38.1\t32.5\t8.5\t19345\t132143\t0.2089\t30568\tRomney\t30568\t0.0009038989999999999\t30568.0\n4233\t-83.400763\t34.878679\tClayton city\tGA\tGeorgia\tRabun County\t2243\t42.8\t17.5\t16.4\t21440\t125463\t0.2089\t30525\tRomney\t30525\t0.008241648\t30525.0\n4234\t-83.331501\t34.983993\tSky Valley city\tGA\tGeorgia\tRabun County\t799\t50.6\t20.6\t10.6\t22334\t140244\t0.2089\t30537\tRomney\t30537\t0.0029358340000000004\t30537.0\n4235\t-83.385511\t34.919695000000004\tMountain City town\tGA\tGeorgia\tRabun County\t848\t46.4\t19.6\t9.3\t18729\t125610\t0.2089\t30562\tRomney\t30562\t0.0031158790000000002\t30562.0\n4236\t-84.616363\t31.756933\tShellman city\tGA\tGeorgia\tRandolph County\t1058\t38.2\t13.3\t15.3\t13813\t46471\t0.5788\t31786\tRomney\t31786\t0.0038875\t31786.0\n4237\t-84.793772\t31.771828999999997\tCuthbert city\tGA\tGeorgia\tRandolph County\t3470\t38.1\t12.6\t16.9\t14948\t56643\t0.5788\t31740\tRomney\t31740\t0.012750118999999999\t31740.0\n4238\t-84.890872\t31.671407000000002\tColeman city\tGA\tGeorgia\tRandolph County\t133\t40.3\t10.2\t15.1\t14395\t51000\t0.5788\t31736\tRomney\t31736\t0.000488693\t31736.0\n4239\t-82.198949\t33.302795\tBlythe city\tGA\tGeorgia\tRichmond County\t769\t36.2\t16.9\t15.7\t19005\t92381\t0.6651\t30805\tRomney\t30805\t0.002825603\t30805.0\n4240\t-82.09939200000001\t33.290696000000004\tHephzibah city\tGA\tGeorgia\tRichmond County\t4194\t35.5\t11.8\t16.6\t17379\t87714\t0.6651\t30815\tRomney\t30815\t0.015410375\t30815.0\n4241\t-82.070913\t33.364559\tAugusta-Richmond County (balance)\tGA\tGeorgia\tRichmond County\t194748\t33.7\t22.7\t13.6\t19728\t97576\t0.6651\t30815\tRomney\t30815\t0.715579328\t30815.0\n4242\t-84.036867\t33.705022\tLakeview Estates CDP\tGA\tGeorgia\tRockdale County\t2927\t31.8\t18.4\t24.4\t16200\t90122\t0.5783\t30012\tRomney\t30012\t0.010754928\t30012.0\n4243\t-84.00811999999999\t33.661778000000005\tConyers city\tGA\tGeorgia\tRockdale County\t13618\t32.4\t19.3\t12.8\t19923\t91039\t0.5783\t30012\tRomney\t30012\t0.050037789000000006\t30012.0\n4244\t-84.308943\t32.238189\tEllaville city\tGA\tGeorgia\tSchley County\t1763\t35.2\t14.2\t14.8\t16765\t78068\t0.2563\t31806\tRomney\t31806\t0.006477943000000001\t31806.0\n4245\t-81.82974200000001\t32.66363\tRocky Ford town\tGA\tGeorgia\tScreven County\t194\t40.6\t11.9\t15.1\t17876\t55000\t0.4548\t30455\tRomney\t30455\t0.000712831\t30455.0\n4246\t-81.662164\t32.882954\tHiltonia city\tGA\tGeorgia\tScreven County\t409\t38.5\t6.8\t21.7\t13871\t57273\t0.4548\t30467\tRomney\t30467\t0.001502824\t30467.0\n4247\t-81.506361\t32.588745\tNewington town\tGA\tGeorgia\tScreven County\t327\t38.1\t9.0\t17.6\t14919\t63500\t0.4548\t30446\tRomney\t30446\t0.001201524\t30446.0\n4248\t-81.638284\t32.750398\tSylvania city\tGA\tGeorgia\tScreven County\t2696\t38.8\t17.0\t18.0\t17148\t67500\t0.4548\t30467\tRomney\t30467\t0.009906145\t30467.0\n4249\t-81.533062\t32.521405\tOliver city\tGA\tGeorgia\tScreven County\t257\t38.5\t9.6\t17.6\t14913\t62857\t0.4548\t30446\tRomney\t30446\t0.000944317\t30446.0\n4250\t-84.813252\t31.013555\tIron City town\tGA\tGeorgia\tSeminole County\t318\t37.5\t10.8\t9.8\t17346\t49211\t0.3921\t31759\tRomney\t31759\t0.001168455\t31759.0\n4251\t-84.879214\t31.040488\tDonalsonville city\tGA\tGeorgia\tSeminole County\t2697\t37.6\t12.2\t12.1\t15998\t62530\t0.3921\t31745\tRomney\t31745\t0.009909819\t31745.0\n4252\t-84.27736\t33.242073\tGriffin city\tGA\tGeorgia\tSpalding County\t24424\t35.0\t19.4\t19.2\t19602\t98757\t0.3945\t30223\tRomney\t30223\t0.08974320400000001\t30223.0\n4253\t-84.290983\t33.342081\tSunny Side city\tGA\tGeorgia\tSpalding County\t153\t35.2\t7.4\t10.3\t18041\t71667\t0.3945\t30228\tRomney\t30228\t0.000562181\t30228.0\n4254\t-84.21292199999999\t33.184717\tOrchard Hill town\tGA\tGeorgia\tSpalding County\t258\t37.4\t10.9\t11.2\t22873\t103333\t0.3945\t30224\tRomney\t30224\t0.0009479919999999999\t30224.0\n4255\t-84.27579899999999\t33.278542\tExperiment CDP\tGA\tGeorgia\tSpalding County\t3291\t32.7\t4.0\t28.2\t13520\t69057\t0.3945\t30223\tRomney\t30223\t0.012092404\t30223.0\n4256\t-84.231356\t33.242946999999994\tEast Griffin CDP\tGA\tGeorgia\tSpalding County\t1583\t36.6\t2.0\t23.4\t16555\t62833\t0.3945\t30224\tRomney\t30224\t0.005816553\t30224.0\n4257\t-83.179689\t34.485907\tMartin town\tGA\tGeorgia\tStephens County\t297\t39.3\t16.8\t6.3\t16285\t97143\t0.2244\t30557\tRomney\t30557\t0.0010912930000000001\t30557.0\n4258\t-83.325632\t34.581477\tToccoa city\tGA\tGeorgia\tStephens County\t9320\t39.7\t19.4\t12.6\t18059\t94528\t0.2244\t30577\tRomney\t30577\t0.034245278\t30577.0\n4259\t-83.196446\t34.50275\tAvalon town\tGA\tGeorgia\tStephens County\t265\t39.2\t16.0\t6.4\t16319\t98333\t0.2244\t30557\tRomney\t30557\t0.000973712\t30557.0\n4260\t-84.676675\t32.082811\tRichland city\tGA\tGeorgia\tStewart County\t1701\t43.4\t13.1\t13.9\t17975\t50161\t0.6373\t31825\tRomney\t31825\t0.006250131\t31825.0\n4261\t-84.79777\t32.048794\tLumpkin city\tGA\tGeorgia\tStewart County\t1172\t39.3\t12.8\t14.6\t15431\t43784\t0.6373\t31815\tRomney\t31815\t0.00430638\t31815.0\n4262\t-84.086409\t31.954509\tLeslie city\tGA\tGeorgia\tSumter County\t426\t39.1\t20.9\t18.6\t15961\t70667\t0.5388\t31764\tRomney\t31764\t0.001565288\t31764.0\n4263\t-84.225488\t32.073516999999995\tAmericus city\tGA\tGeorgia\tSumter County\t16383\t31.9\t28.2\t16.8\t17422\t78714\t0.5388\t31709\tRomney\t31709\t0.060197466\t31709.0\n4264\t-84.145224\t32.197201\tAndersonville city\tGA\tGeorgia\tSumter County\t324\t36.4\t18.1\t12.7\t20624\t79500\t0.5388\t31711\tRomney\t31711\t0.001190501\t31711.0\n4265\t-84.394382\t32.033444\tPlains city\tGA\tGeorgia\tSumter County\t597\t43.1\t13.8\t14.9\t14367\t56000\t0.5388\t31780\tRomney\t31780\t0.0021936079999999997\t31780.0\n4266\t-84.063639\t31.954788\tDe Soto city\tGA\tGeorgia\tSumter County\t203\t40.2\t19.0\t21.2\t16494\t66000\t0.5388\t31764\tRomney\t31764\t0.0007459\t31764.0\n4267\t-84.54059699999999\t32.677265999999996\tTalbotton city\tGA\tGeorgia\tTalbot County\t1024\t42.6\t11.0\t10.3\t16063\t59474\t0.6488\t31827\tRomney\t31827\t0.0037625709999999997\t31827.0\n4268\t-84.560621\t32.787664\tWoodland city\tGA\tGeorgia\tTalbot County\t433\t42.6\t7.3\t12.0\t16202\t58947\t0.6488\t31836\tRomney\t31836\t0.001591009\t31836.0\n4269\t-84.55161600000001\t32.578956\tGeneva town\tGA\tGeorgia\tTalbot County\t110\t44.6\t14.3\t7.8\t15887\t42500\t0.6488\t31810\tRomney\t31810\t0.00040418199999999995\t31810.0\n4270\t-84.457701\t32.603078000000004\tJunction City town\tGA\tGeorgia\tTalbot County\t172\t45.0\t14.0\t7.5\t15952\t40000\t0.6488\t31812\tRomney\t31812\t0.000631994\t31812.0\n4271\t-82.896463\t33.554355\tCrawfordville city\tGA\tGeorgia\tTaliaferro County\t499\t43.3\t10.3\t14.0\t18763\t56905\t0.6604\t30631\tRomney\t30631\t0.001833519\t30631.0\n4272\t-82.79504\t33.560466\tSharon city\tGA\tGeorgia\tTaliaferro County\t102\t42.2\t12.7\t22.5\t15651\t55000\t0.6604\t30664\tRomney\t30664\t0.00037478699999999996\t30664.0\n4273\t-82.118523\t32.085813\tReidsville city\tGA\tGeorgia\tTattnall County\t2202\t36.7\t12.5\t11.9\t15731\t78696\t0.2845\t30453\tRomney\t30453\t0.008090998\t30453.0\n4274\t-82.01996\t32.160345\tManassas city\tGA\tGeorgia\tTattnall County\t98\t37.5\t7.4\t12.5\t15505\t67500\t0.2845\t30438\tRomney\t30438\t0.00036009\t30438.0\n4275\t-82.110332\t32.179334000000004\tCollins city\tGA\tGeorgia\tTattnall County\t509\t37.8\t9.1\t17.0\t12291\t48929\t0.2845\t30421\tRomney\t30421\t0.0018702620000000001\t30421.0\n4276\t-82.138751\t32.280573\tCobbtown city\tGA\tGeorgia\tTattnall County\t304\t37.8\t6.9\t9.1\t11460\t51500\t0.2845\t30420\tRomney\t30420\t0.001117013\t30420.0\n4277\t-81.930426\t31.939487\tGlennville city\tGA\tGeorgia\tTattnall County\t5675\t36.7\t13.8\t11.3\t18079\t91118\t0.2845\t30427\tRomney\t30427\t0.020852141\t30427.0\n4278\t-84.09531199999999\t32.558684\tReynolds town\tGA\tGeorgia\tTaylor County\t1075\t40.5\t14.6\t14.4\t16035\t68214\t0.4443\t31076\tRomney\t31076\t0.003949965\t31076.0\n4279\t-84.237398\t32.557247\tButler city\tGA\tGeorgia\tTaylor County\t1756\t37.9\t11.3\t18.7\t14655\t61596\t0.4443\t31006\tRomney\t31006\t0.006452222\t31006.0\n4280\t-82.817774\t32.055482\tScotland city\tGA\tGeorgia\tTelfair County\t294\t40.0\t9.5\t12.5\t13995\t45000\t0.4163\t31083\tRomney\t31083\t0.001080269\t31083.0\n4281\t-82.682813\t31.933001\tLumber City\tGA\tGeorgia\tTelfair County\t1183\t42.3\t5.1\t21.3\t15963\t49423\t0.4163\t31549\tRomney\t31549\t0.004346799\t31549.0\n4282\t-83.058435\t32.024664\tMilan town\tGA\tGeorgia\tTelfair County\t1006\t38.8\t12.4\t11.3\t14243\t60238\t0.4163\t31060\tRomney\t31060\t0.003696432\t31060.0\n4283\t-82.97899699999999\t31.812593\tJacksonville town\tGA\tGeorgia\tTelfair County\t111\t39.4\t5.3\t10.2\t18691\t45000\t0.4163\t31544\tRomney\t31544\t0.00040785699999999997\t31544.0\n4284\t-82.899385\t32.06066\tMcRae city\tGA\tGeorgia\tTelfair County\t3074\t38.5\t17.7\t16.5\t17391\t63469\t0.4163\t31055\tRomney\t31055\t0.011295063000000001\t31055.0\n4285\t-82.887197\t32.082871000000004\tHelena city\tGA\tGeorgia\tTelfair County\t2649\t33.7\t7.1\t16.2\t15168\t53152\t0.4163\t31037\tRomney\t31037\t0.009733449\t31037.0\n4286\t-84.443883\t31.771982\tDawson city\tGA\tGeorgia\tTerrell County\t4951\t34.5\t9.3\t16.4\t13999\t62240\t0.5784\t31742\tRomney\t31742\t0.018191885\t31742.0\n4287\t-84.51167\t31.894532\tParrott town\tGA\tGeorgia\tTerrell County\t137\t43.3\t12.4\t4.5\t26193\t98333\t0.5784\t31777\tRomney\t31777\t0.000503391\t31777.0\n4288\t-84.36426999999999\t31.830353000000002\tBronwood town\tGA\tGeorgia\tTerrell County\t464\t39.5\t9.5\t12.3\t12885\t61071\t0.5784\t31726\tRomney\t31726\t0.001704915\t31726.0\n4289\t-84.348016\t31.720052000000003\tSasser town\tGA\tGeorgia\tTerrell County\t366\t37.2\t18.2\t8.8\t17024\t88000\t0.5784\t31742\tRomney\t31742\t0.001344825\t31742.0\n4290\t-83.97848499999999\t30.840189000000002\tThomasville city\tGA\tGeorgia\tThomas County\t18799\t38.3\t26.5\t12.6\t18818\t94697\t0.4038\t31792\tRomney\t31792\t0.069074783\t31792.0\n4291\t-83.79001600000001\t30.792101000000002\tBoston city\tGA\tGeorgia\tThomas County\t1489\t39.7\t10.5\t18.0\t14676\t75333\t0.4038\t31626\tRomney\t31626\t0.0054711609999999996\t31626.0\n4292\t-84.051939\t30.975068\tOchlocknee town\tGA\tGeorgia\tThomas County\t658\t40.7\t13.1\t8.8\t19068\t100000\t0.4038\t31773\tRomney\t31773\t0.002417746\t31773.0\n4293\t-84.09165300000001\t31.079678\tMeigs city\tGA\tGeorgia\tThomas County\t1129\t33.7\t9.7\t26.2\t11890\t56364\t0.4038\t31765\tRomney\t31765\t0.004148382\t31765.0\n4294\t-83.73266600000001\t30.959744\tPavo city\tGA\tGeorgia\tThomas County\t725\t44.4\t13.6\t12.1\t16447\t73654\t0.4038\t31778\tRomney\t31778\t0.00266393\t31778.0\n4295\t-83.866507\t31.011375\tCoolidge city\tGA\tGeorgia\tThomas County\t575\t41.2\t9.0\t13.8\t16174\t69444\t0.4038\t31738\tRomney\t31738\t0.002112772\t31738.0\n4296\t-83.520375\t31.439004999999998\tPhillipsburg CDP\tGA\tGeorgia\tTift County\t810\t35.6\t7.9\t15.7\t11683\t50682\t0.3346\t31794\tRomney\t31794\t0.002976253\t31794.0\n4297\t-83.594936\t31.339263\tOmega city\tGA\tGeorgia\tTift County\t1695\t30.6\t6.3\t16.2\t11975\t61900\t0.3346\t31775\tRomney\t31775\t0.006228084\t31775.0\n4298\t-83.50987099999999\t31.466452\tTifton city\tGA\tGeorgia\tTift County\t16459\t33.1\t23.7\t13.1\t19677\t107435\t0.3346\t31794\tRomney\t31794\t0.060476719000000005\t31794.0\n4299\t-83.508422\t31.436215\tUnionville CDP\tGA\tGeorgia\tTift County\t2077\t36.9\t9.2\t15.2\t12671\t45571\t0.3346\t31794\tRomney\t31794\t0.007631699999999999\t31794.0\n4300\t-83.64984100000001\t31.472315999999996\tTy Ty city\tGA\tGeorgia\tTift County\t836\t36.6\t15.7\t16.4\t19573\t79737\t0.3346\t31795\tRomney\t31795\t0.0030717870000000003\t31795.0\n4301\t-82.33024\t32.170939000000004\tSanta Claus city\tGA\tGeorgia\tToombs County\t252\t31.7\t12.8\t10.1\t14971\t61000\t0.2939\t30436\tRomney\t30436\t0.000925945\t30436.0\n4302\t-82.401211\t32.227624\tVidalia city\tGA\tGeorgia\tToombs County\t11025\t37.7\t21.9\t10.5\t18035\t99450\t0.2939\t30474\tRomney\t30474\t0.040510106000000004\t30474.0\n4303\t-82.320518\t32.20433\tLyons city\tGA\tGeorgia\tToombs County\t4473\t32.1\t12.1\t10.7\t14605\t66037\t0.2939\t30436\tRomney\t30436\t0.016435528999999997\t30436.0\n4304\t-83.847527\t34.935565000000004\tYoung Harris city\tGA\tGeorgia\tTowns County\t705\t24.8\t23.9\t3.5\t17599\t156250\t0.205\t30582\tRomney\t30582\t0.002590442\t30582.0\n4305\t-83.753479\t34.949995\tHiawassee town\tGA\tGeorgia\tTowns County\t1014\t52.8\t21.3\t9.0\t22693\t173828\t0.205\t30546\tRomney\t30546\t0.003725827\t30546.0\n4306\t-82.591945\t32.37786\tSoperton city\tGA\tGeorgia\tTreutlen County\t2720\t35.6\t7.6\t14.9\t13975\t47182\t0.3905\t30457\tRomney\t30457\t0.00999433\t30457.0\n4307\t-85.031456\t33.039575\tLaGrange city\tGA\tGeorgia\tTroup County\t28267\t34.1\t23.9\t13.9\t19321\t106725\t0.4059\t30241\tRomney\t30241\t0.10386387\t30241.0\n4308\t-84.90480500000001\t33.166698\tHogansville city\tGA\tGeorgia\tTroup County\t2902\t38.3\t12.2\t19.7\t16894\t72917\t0.4059\t30230\tRomney\t30230\t0.010663068000000001\t30230.0\n4309\t-85.165309\t32.880998999999996\tWest Point city\tGA\tGeorgia\tTroup County\t3413\t40.5\t28.9\t14.0\t19961\t95833\t0.4059\t31833\tRomney\t31833\t0.012540678999999999\t31833.0\n4310\t-83.486695\t31.807096\tRebecca city\tGA\tGeorgia\tTurner County\t268\t39.2\t6.1\t13.9\t15859\t58333\t0.4243\t31783\tRomney\t31783\t0.000984735\t31783.0\n4311\t-83.635899\t31.670896000000003\tSycamore city\tGA\tGeorgia\tTurner County\t487\t34.9\t6.8\t17.1\t11628\t59333\t0.4243\t31714\tRomney\t31714\t0.001789426\t31714.0\n4312\t-83.652979\t31.708333000000003\tAshburn city\tGA\tGeorgia\tTurner County\t4057\t32.6\t9.2\t17.8\t13361\t53816\t0.4243\t31714\tRomney\t31714\t0.014906984\t31714.0\n4313\t-83.240751\t32.60836\tDanville town\tGA\tGeorgia\tTwiggs County\t339\t38.3\t7.7\t18.3\t16693\t65909\t0.5402\t31017\tRomney\t31017\t0.001245617\t31017.0\n4314\t-83.343014\t32.686431\tJeffersonville city\tGA\tGeorgia\tTwiggs County\t1139\t40.8\t7.2\t16.8\t16664\t63281\t0.5402\t31044\tRomney\t31044\t0.004185126\t31044.0\n4315\t-83.954412\t34.876016\tBlairsville city\tGA\tGeorgia\tUnion County\t696\t43.7\t13.2\t5.4\t18438\t160417\t0.1931\t30512\tRomney\t30512\t0.002557373\t30512.0\n4316\t-84.34065\t32.937014000000005\tHannahs Mill CDP\tGA\tGeorgia\tUpson County\t3172\t39.6\t12.2\t10.5\t19345\t94156\t0.3515\t30286\tRomney\t30286\t0.011655152\t30286.0\n4317\t-84.405888\t32.894308\tSunset Village CDP\tGA\tGeorgia\tUpson County\t905\t40.7\t13.6\t9.1\t21230\t90800\t0.3515\t30286\tRomney\t30286\t0.003325319\t30286.0\n4318\t-84.326824\t32.891917\tThomaston city\tGA\tGeorgia\tUpson County\t9331\t39.7\t19.6\t16.0\t18835\t86528\t0.3515\t30286\tRomney\t30286\t0.034285696000000004\t30286.0\n4319\t-84.19165600000001\t32.759202\tSalem CDP\tGA\tGeorgia\tUpson County\t344\t42.5\t4.9\t15.6\t14696\t78000\t0.3515\t31016\tRomney\t31016\t0.0012639889999999999\t31016.0\n4320\t-84.142401\t32.913368\tYatesville town\tGA\tGeorgia\tUpson County\t434\t41.5\t10.4\t7.1\t19352\t96000\t0.3515\t31097\tRomney\t31097\t0.0015946839999999999\t31097.0\n4321\t-84.335718\t32.867340000000006\tLincoln Park CDP\tGA\tGeorgia\tUpson County\t1109\t41.1\t8.6\t17.6\t14202\t53286\t0.3515\t30286\tRomney\t30286\t0.004074894\t30286.0\n4322\t-85.29408199999999\t34.929538\tFairview CDP\tGA\tGeorgia\tWalker County\t6683\t40.7\t10.0\t8.9\t18817\t83089\t0.2409\t30741\tRomney\t30741\t0.024555922\t30741.0\n4323\t-85.289807\t34.974571999999995\tRossville city\tGA\tGeorgia\tWalker County\t3501\t39.0\t10.5\t7.9\t16037\t66074\t0.2409\t30741\tRomney\t30741\t0.012864025\t30741.0\n4324\t-85.343726\t34.924358000000005\tChattanooga Valley CDP\tGA\tGeorgia\tWalker County\t4395\t39.9\t15.1\t8.2\t19639\t99836\t0.2409\t30725\tRomney\t30725\t0.016148927\t30725.0\n4325\t-85.281989\t34.707383\tLa Fayette city\tGA\tGeorgia\tWalker County\t6831\t39.0\t12.1\t9.7\t16931\t75313\t0.2409\t30728\tRomney\t30728\t0.025099731\t30728.0\n4326\t-85.291646\t34.873079\tChickamauga city\tGA\tGeorgia\tWalker County\t2493\t38.8\t12.3\t9.2\t20554\t97101\t0.2409\t30707\tRomney\t30707\t0.009160244\t30707.0\n4327\t-85.36258000000001\t34.966081\tLookout Mountain city\tGA\tGeorgia\tWalker County\t1631\t40.9\t74.9\t6.2\t34562\t253247\t0.2409\t30750\tRomney\t30750\t0.005992924\t30750.0\n4328\t-83.79979399999999\t33.717453000000006\tJersey town\tGA\tGeorgia\tWalton County\t201\t36.4\t10.0\t10.3\t20690\t99167\t0.2166\t30054\tRomney\t30054\t0.000738552\t30054.0\n4329\t-83.89291700000001\t33.844568\tLoganville city\tGA\tGeorgia\tWalton County\t9414\t35.4\t18.6\t9.1\t25385\t143281\t0.2166\t30052\tRomney\t30052\t0.03459067\t30052.0\n4330\t-83.60912900000001\t33.784652\tGood Hope town\tGA\tGeorgia\tWalton County\t237\t41.7\t9.0\t9.4\t22260\t137500\t0.2166\t30641\tRomney\t30641\t0.0008708289999999999\t30641.0\n4331\t-83.855734\t33.74553\tWalnut Grove town\tGA\tGeorgia\tWalton County\t1553\t34.1\t17.5\t8.3\t23932\t126809\t0.2166\t30052\tRomney\t30052\t0.0057063209999999994\t30052.0\n4332\t-83.71162199999999\t33.793771\tMonroe city\tGA\tGeorgia\tWalton County\t14475\t34.9\t12.2\t15.6\t18277\t89295\t0.2166\t30655\tRomney\t30655\t0.053186738\t30655.0\n4333\t-83.716987\t33.658984999999994\tSocial Circle city\tGA\tGeorgia\tWalton County\t4050\t37.0\t17.3\t11.9\t20705\t104133\t0.2166\t30025\tRomney\t30025\t0.014881263\t30025.0\n4334\t-83.807084\t33.817201000000004\tBetween town\tGA\tGeorgia\tWalton County\t200\t38.1\t25.0\t6.9\t29816\t148750\t0.2166\t30052\tRomney\t30052\t0.000734877\t30052.0\n4335\t-82.323584\t31.242068\tWaycross city\tGA\tGeorgia\tWare County\t15028\t39.2\t16.2\t14.2\t16441\t67336\t0.3267\t31501\tRomney\t31501\t0.055218672999999996\t31501.0\n4336\t-82.36769100000001\t31.247618\tDeenwood CDP\tGA\tGeorgia\tWare County\t1917\t43.3\t19.5\t12.0\t19527\t98387\t0.3267\t31501\tRomney\t31501\t0.007043798\t31501.0\n4337\t-82.341102\t31.240489\tSunnyside CDP\tGA\tGeorgia\tWare County\t1370\t43.9\t19.2\t11.4\t20607\t95227\t0.3267\t31501\tRomney\t31501\t0.0050339090000000005\t31501.0\n4338\t-82.7055\t33.462474\tNorwood city\tGA\tGeorgia\tWarren County\t295\t41.4\t9.4\t26.1\t15823\t44474\t0.6053\t30821\tRomney\t30821\t0.0010839439999999999\t30821.0\n4339\t-82.664857\t33.406634000000004\tWarrenton city\tGA\tGeorgia\tWarren County\t1957\t38.2\t16.2\t24.4\t15101\t65732\t0.6053\t30828\tRomney\t30828\t0.007190773\t30828.0\n4340\t-82.646305\t33.452662\tCamak town\tGA\tGeorgia\tWarren County\t125\t41.3\t4.8\t19.4\t16067\t62500\t0.6053\t30807\tRomney\t30807\t0.000459298\t30807.0\n4341\t-82.813484\t32.935203\tTennille city\tGA\tGeorgia\tWashington County\t1463\t35.5\t18.2\t19.7\t13860\t68947\t0.5352\t31089\tRomney\t31089\t0.005375626999999999\t31089.0\n4342\t-82.810222\t32.983378\tSandersville city\tGA\tGeorgia\tWashington County\t6079\t40.1\t18.5\t20.1\t18253\t77301\t0.5352\t31082\tRomney\t31082\t0.022336593\t31082.0\n4343\t-82.72583\t32.826322999999995\tHarrison town\tGA\tGeorgia\tWashington County\t489\t39.5\t8.2\t12.9\t17585\t61364\t0.5352\t31035\tRomney\t31035\t0.001796775\t31035.0\n4344\t-82.603254\t32.982459999999996\tDavisboro city\tGA\tGeorgia\tWashington County\t1666\t34.8\t4.2\t23.0\t14360\t71667\t0.5352\t31018\tRomney\t31018\t0.006121527\t31018.0\n4345\t-82.96713100000001\t33.017755\tDeepstep town\tGA\tGeorgia\tWashington County\t120\t43.6\t11.2\t7.8\t22297\t76000\t0.5352\t31082\tRomney\t31082\t0.00044092599999999996\t31082.0\n4346\t-82.666074\t32.906917\tRiddleville town\tGA\tGeorgia\tWashington County\t122\t40.6\t9.8\t18.2\t14957\t72500\t0.5352\t31035\tRomney\t31035\t0.000448275\t31035.0\n4347\t-82.95929100000001\t32.853664\tOconee city\tGA\tGeorgia\tWashington County\t271\t37.9\t9.1\t32.5\t17931\t46667\t0.5352\t31067\tRomney\t31067\t0.000995759\t31067.0\n4348\t-81.889485\t31.599138\tJesup city\tGA\tGeorgia\tWayne County\t10184\t38.1\t16.6\t14.8\t18163\t92578\t0.2528\t31546\tRomney\t31546\t0.037419947\t31546.0\n4349\t-82.027327\t31.666052\tOdum town\tGA\tGeorgia\tWayne County\t436\t39.3\t15.6\t6.6\t19223\t82500\t0.2528\t31555\tRomney\t31555\t0.0016020320000000002\t31555.0\n4350\t-82.016898\t31.483868\tScreven city\tGA\tGeorgia\tWayne County\t768\t39.8\t8.7\t11.7\t16076\t80441\t0.2528\t31560\tRomney\t31560\t0.002821928\t31560.0\n4351\t-84.611604\t31.976934000000004\tWeston town\tGA\tGeorgia\tWebster County\t69\t41.5\t6.3\t11.4\t17233\t45000\t0.4903\t31832\tRomney\t31832\t0.000253533\t31832.0\n4352\t-84.539867\t32.059754999999996\tPreston town\tGA\tGeorgia\tWebster County\t422\t40.5\t11.9\t14.2\t16925\t56500\t0.4903\t31824\tRomney\t31824\t0.001550591\t31824.0\n4353\t-82.783546\t32.144511\tAlamo city\tGA\tGeorgia\tWheeler County\t2423\t35.2\t6.8\t11.4\t14605\t55952\t0.3574\t30411\tRomney\t30411\t0.008903036999999999\t30411.0\n4354\t-82.671163\t32.180539\tGlenwood city\tGA\tGeorgia\tWheeler County\t945\t40.5\t9.8\t9.0\t14690\t57500\t0.3574\t30428\tRomney\t30428\t0.003472295\t30428.0\n4355\t-83.763172\t34.596619\tCleveland city\tGA\tGeorgia\tWhite County\t2377\t37.2\t19.6\t8.2\t19008\t148933\t0.1593\t30528\tRomney\t30528\t0.008734015999999999\t30528.0\n4356\t-83.721463\t34.703665\tHelen city\tGA\tGeorgia\tWhite County\t570\t49.2\t24.8\t7.6\t23147\t185227\t0.1593\t30545\tRomney\t30545\t0.0020944\t30545.0\n4357\t-84.975835\t34.903411\tVarnell city\tGA\tGeorgia\tWhitfield County\t1881\t36.0\t22.5\t8.9\t22181\t107333\t0.2683\t30710\tRomney\t30710\t0.00691152\t30710.0\n4358\t-84.976167\t34.76891\tDalton city\tGA\tGeorgia\tWhitfield County\t31478\t32.6\t21.4\t12.7\t20572\t107234\t0.2683\t30720\tRomney\t30720\t0.11566232300000001\t30720.0\n4359\t-85.040821\t34.848136\tTunnel Hill city\tGA\tGeorgia\tWhitfield County\t1382\t40.2\t18.7\t13.1\t21951\t89024\t0.2683\t30755\tRomney\t30755\t0.0050780009999999995\t30755.0\n4360\t-84.955336\t34.953965999999994\tCohutta town\tGA\tGeorgia\tWhitfield County\t754\t36.4\t13.3\t15.7\t20116\t91667\t0.2683\t30710\tRomney\t30710\t0.0027704870000000003\t30710.0\n4361\t-83.306776\t31.992503999999997\tAbbeville city\tGA\tGeorgia\tWilcox County\t2642\t37.3\t7.2\t10.8\t15737\t54091\t0.3388\t31001\tRomney\t31001\t0.009707728\t31001.0\n4362\t-83.54175699999999\t31.94619\tPitts city\tGA\tGeorgia\tWilcox County\t284\t41.7\t10.8\t13.0\t17327\t53636\t0.3388\t31072\tRomney\t31072\t0.0010435260000000001\t31072.0\n4363\t-83.456753\t31.948656\tRochelle city\tGA\tGeorgia\tWilcox County\t1298\t35.8\t8.8\t13.3\t15520\t48621\t0.3388\t31079\tRomney\t31079\t0.004769353\t31079.0\n4364\t-83.50303199999999\t32.108493\tPineview town\tGA\tGeorgia\tWilcox County\t505\t42.0\t11.7\t10.2\t16403\t71667\t0.3388\t31071\tRomney\t31071\t0.001855565\t31071.0\n4365\t-82.90305\t33.790091\tRayle town\tGA\tGeorgia\tWilkes County\t138\t43.6\t17.2\t19.3\t16842\t75000\t0.4384\t30660\tRomney\t30660\t0.000507065\t30660.0\n4366\t-82.743326\t33.735455\tWashington city\tGA\tGeorgia\tWilkes County\t3975\t42.4\t18.4\t11.0\t17855\t74268\t0.4384\t30673\tRomney\t30673\t0.014605683999999999\t30673.0\n4367\t-82.741809\t33.867619\tTignall town\tGA\tGeorgia\tWilkes County\t623\t42.3\t7.7\t10.7\t16595\t57647\t0.4384\t30668\tRomney\t30668\t0.002289142\t30668.0\n4368\t-83.29841400000001\t32.909118\tIvey town\tGA\tGeorgia\tWilkinson County\t1161\t35.9\t16.2\t14.7\t20548\t63548\t0.4901\t31031\tRomney\t31031\t0.004265962\t31031.0\n4369\t-83.173702\t32.810725\tIrwinton city\tGA\tGeorgia\tWilkinson County\t548\t37.7\t12.0\t19.5\t15824\t57308\t0.4901\t31042\tRomney\t31042\t0.002013564\t31042.0\n4370\t-83.217334\t32.597107\tAllentown town\tGA\tGeorgia\tWilkinson County\t273\t41.7\t10.4\t10.5\t20678\t70000\t0.4901\t31003\tRomney\t31003\t0.001003107\t31003.0\n4371\t-83.082675\t32.822387\tToomsboro town\tGA\tGeorgia\tWilkinson County\t594\t43.4\t3.8\t14.8\t14808\t60000\t0.4901\t31090\tRomney\t31090\t0.002182585\t31090.0\n4372\t-83.334991\t32.886668\tGordon city\tGA\tGeorgia\tWilkinson County\t2101\t39.0\t13.3\t13.3\t18230\t69746\t0.4901\t31031\tRomney\t31031\t0.007719885\t31031.0\n4373\t-83.201126\t32.846635\tMcIntyre town\tGA\tGeorgia\tWilkinson County\t718\t36.4\t10.6\t14.9\t15427\t70000\t0.4901\t31054\tRomney\t31054\t0.0026382090000000003\t31054.0\n4374\t-83.789879\t31.51448\tPoulan city\tGA\tGeorgia\tWorth County\t975\t36.5\t6.9\t12.8\t16016\t67292\t0.2954\t31781\tRomney\t31781\t0.003582526\t31781.0\n4375\t-83.738923\t31.514246999999997\tSumner town\tGA\tGeorgia\tWorth County\t319\t36.3\t6.7\t12.8\t15991\t67143\t0.2954\t31789\tRomney\t31789\t0.0011721289999999998\t31789.0\n4376\t-83.920675\t31.829905\tWarwick city\tGA\tGeorgia\tWorth County\t404\t43.9\t9.7\t14.1\t20400\t81500\t0.2954\t31796\tRomney\t31796\t0.001484452\t31796.0\n4377\t-83.835706\t31.530139000000002\tSylvester city\tGA\tGeorgia\tWorth County\t5767\t34.9\t12.1\t16.4\t17253\t71354\t0.2954\t31791\tRomney\t31791\t0.021190184\t31791.0\n4378\t-116.280376\t43.652640000000005\tGarden City\tID\tIdaho\tAda County\t12617\t34.1\t24.9\t11.2\t28490\t153206\t0.4272\t83714\tRomney\t83714\t0.050999052999999996\t83714.0\n4379\t-116.39506999999999\t43.611612\tMeridian city\tID\tIdaho\tAda County\t46865\t31.5\t30.0\t7.8\t27703\t176917\t0.4272\t83642\tRomney\t83642\t0.18943256100000003\t83642.0\n4380\t-116.490228\t43.693032\tStar city\tID\tIdaho\tAda County\t2461\t32.5\t33.7\t7.9\t26482\t194048\t0.4272\t83669\tRomney\t83669\t0.009947584\t83669.0\n4381\t-116.23425\t43.606929\tBoise City\tID\tIdaho\tAda County\t205324\t34.5\t37.2\t9.7\t30515\t168250\t0.4272\t83705\tRomney\t83705\t0.8299381459999999\t83705.0\n4382\t-116.420023\t43.493021999999996\tKuna city\tID\tIdaho\tAda County\t8243\t29.8\t21.3\t8.4\t23251\t145218\t0.4272\t83634\tRomney\t83634\t0.03331895\t83634.0\n4383\t-116.35122\t43.691522\tEagle city\tID\tIdaho\tAda County\t16811\t36.4\t43.6\t8.6\t34559\t238578\t0.4272\t83616\tRomney\t83616\t0.06795158\t83616.0\n4384\t-116.285697\t44.970769\tNew Meadows city\tID\tIdaho\tAdams County\t580\t39.4\t7.6\t5.7\t15087\t110054\t0.28\t83654\tRomney\t83654\t0.002344412\t83654.0\n4385\t-116.4367\t44.729369\tCouncil city\tID\tIdaho\tAdams County\t885\t48.4\t11.3\t6.6\t16538\t97973\t0.28\t83643\tRomney\t83643\t0.00357725\t83643.0\n4386\t-112.24882099999999\t42.797274\tInkom city\tID\tIdaho\tBannock County\t795\t37.7\t19.1\t7.2\t18998\t129245\t0.3747\t83245\tRomney\t83245\t0.0032134620000000003\t83245.0\n4387\t-112.12342\t42.428836\tDowney city\tID\tIdaho\tBannock County\t664\t39.5\t17.7\t8.5\t16973\t118092\t0.3747\t83234\tRomney\t83234\t0.002683948\t83234.0\n4388\t-112.19325400000001\t42.647379\tMcCammon city\tID\tIdaho\tBannock County\t892\t40.7\t22.5\t10.4\t20473\t138816\t0.3747\t83250\tRomney\t83250\t0.003605545\t83250.0\n4389\t-112.43789699999999\t42.910776\tPocatello city\tID\tIdaho\tBannock County\t53038\t30.8\t32.0\t8.0\t22889\t123848\t0.3747\t83201\tRomney\t83201\t0.214384385\t83201.0\n4390\t-112.46625900000001\t42.922709000000005\tChubbuck city\tID\tIdaho\tBannock County\t12133\t30.5\t21.4\t11.7\t21709\t140634\t0.3747\t83201\tRomney\t83201\t0.049042681\t83201.0\n4391\t-112.17254199999999\t42.559746000000004\tArimo city\tID\tIdaho\tBannock County\t410\t33.5\t25.8\t4.1\t19910\t130000\t0.3747\t83214\tRomney\t83214\t0.001657257\t83214.0\n4392\t-112.01\t42.619924\tLava Hot Springs city\tID\tIdaho\tBannock County\t578\t45.4\t15.5\t13.7\t18575\t133929\t0.3747\t83246\tRomney\t83246\t0.002336328\t83246.0\n4393\t-112.44845900000001\t43.043587\tFort Hall CDP\tID\tIdaho\tBannock County\t3486\t30.5\t7.3\t20.6\t14426\t105147\t0.3747\t83203\tRomney\t83203\t0.014090726999999999\t83203.0\n4394\t-111.40501299999998\t42.19095\tBloomington city\tID\tIdaho\tBear Lake County\t254\t45.3\t17.9\t6.7\t18007\t128125\t0.107\t83223\tRomney\t83223\t0.0010266910000000001\t83223.0\n4395\t-111.301321\t42.322464000000004\tMontpelier city\tID\tIdaho\tBear Lake County\t2594\t35.9\t13.2\t7.7\t17349\t103024\t0.107\t83254\tRomney\t83254\t0.010485182\t83254.0\n4396\t-111.390184\t42.112252000000005\tSt. Charles city\tID\tIdaho\tBear Lake County\t158\t45.2\t18.1\t6.8\t17990\t133333\t0.107\t83272\tRomney\t83272\t0.00063865\t83272.0\n4397\t-111.40321200000001\t42.227267\tParis city\tID\tIdaho\tBear Lake County\t568\t36.7\t9.2\t5.3\t16555\t105208\t0.107\t83261\tRomney\t83261\t0.0022959070000000002\t83261.0\n4398\t-111.36390700000001\t42.478839\tGeorgetown city\tID\tIdaho\tBear Lake County\t529\t36.2\t15.0\t7.6\t18765\t110606\t0.107\t83239\tRomney\t83239\t0.002138266\t83239.0\n4399\t-116.57146000000002\t47.314631\tSt. Maries city\tID\tIdaho\tBenewah County\t2474\t41.9\t14.8\t5.4\t20206\t108120\t0.2996\t83861\tRomney\t83861\t0.010000130999999999\t83861.0\n4400\t-116.884598\t47.329912\tPlummer city\tID\tIdaho\tBenewah County\t1080\t33.3\t12.1\t5.8\t15207\t114167\t0.2996\t83851\tRomney\t83851\t0.004365458\t83851.0\n4401\t-116.686472\t47.337789\tParkline city\tID\tIdaho\tBenewah County\t81\t45.9\t20.3\t15.8\t22201\t216667\t0.2996\t83861\tRomney\t83861\t0.000327409\t83861.0\n4402\t-116.92376200000001\t47.159399\tTensed city\tID\tIdaho\tBenewah County\t135\t38.8\t11.8\t5.9\t15394\t115000\t0.2996\t83870\tRomney\t83870\t0.000545682\t83870.0\n4403\t-112.838415\t42.94406\tAberdeen city\tID\tIdaho\tBingham County\t2085\t30.8\t12.5\t7.2\t13469\t86818\t0.2171\t83210\tRomney\t83210\t0.008427758\t83210.0\n4404\t-112.3453\t43.193571\tBlackfoot city\tID\tIdaho\tBingham County\t11030\t31.9\t19.8\t5.3\t19297\t118350\t0.2171\t83221\tRomney\t83221\t0.044584255999999996\t83221.0\n4405\t-112.18419899999999\t43.305611999999996\tFirth city\tID\tIdaho\tBingham County\t435\t35.3\t16.4\t3.4\t16832\t119531\t0.2171\t83218\tRomney\t83218\t0.001758309\t83218.0\n4406\t-112.164975\t43.314352\tBasalt city\tID\tIdaho\tBingham County\t447\t35.0\t16.3\t3.8\t16825\t121429\t0.2171\t83218\tRomney\t83218\t0.001806814\t83218.0\n4407\t-112.124626\t43.380128000000006\tShelley city\tID\tIdaho\tBingham County\t4205\t29.2\t17.7\t7.1\t17872\t126449\t0.2171\t83274\tRomney\t83274\t0.01699699\t83274.0\n4408\t-112.813447\t43.443864000000005\tAtomic City\tID\tIdaho\tBingham County\t27\t33.8\t18.8\t0.0\t14083\t143750\t0.2171\t83215\tRomney\t83215\t0.000109136\t83215.0\n4409\t-114.300556\t43.512522\tHailey city\tID\tIdaho\tBlaine County\t7515\t36.7\t44.4\t6.8\t31015\t312500\t0.5878\t83333\tRomney\t83333\t0.030376309\t83333.0\n4410\t-114.33275400000001\t43.684346999999995\tSun Valley city\tID\tIdaho\tBlaine County\t1648\t48.8\t60.1\t4.6\t58826\t753409\t0.5878\t83354\tRomney\t83354\t0.006661365\t83354.0\n4411\t-113.944869\t43.310545\tCarey city\tID\tIdaho\tBlaine County\t596\t34.3\t18.9\t8.1\t17608\t114516\t0.5878\t83320\tRomney\t83320\t0.002409086\t83320.0\n4412\t-114.37336\t43.687822\tKetchum city\tID\tIdaho\tBlaine County\t3434\t41.7\t58.1\t6.3\t51455\t650000\t0.5878\t83354\tRomney\t83354\t0.013880538000000001\t83354.0\n4413\t-114.25866699999999\t43.465964\tBellevue city\tID\tIdaho\tBlaine County\t2345\t36.7\t29.6\t6.1\t28224\t231762\t0.5878\t83313\tRomney\t83313\t0.009478702\t83313.0\n4414\t-115.973215\t44.116274\tCrouch city\tID\tIdaho\tBoise County\t167\t48.1\t24.4\t6.2\t22556\t170000\t0.3056\t83622\tRomney\t83622\t0.000675029\t83622.0\n4415\t-116.19682900000001\t43.911353000000005\tHorseshoe Bend city\tID\tIdaho\tBoise County\t834\t40.9\t15.5\t14.1\t18272\t106818\t0.3056\t83629\tRomney\t83629\t0.003371103\t83629.0\n4416\t-115.83468\t43.828668\tIdaho City\tID\tIdaho\tBoise County\t550\t42.9\t20.2\t10.0\t18796\t118750\t0.3056\t83631\tRomney\t83631\t0.00222315\t83631.0\n4417\t-115.945668\t43.942895\tPlacerville city\tID\tIdaho\tBoise County\t86\t42.5\t16.9\t13.9\t18260\t107500\t0.3056\t83666\tRomney\t83666\t0.00034762\t83666.0\n4418\t-117.038528\t48.181754\tOldtown city\tID\tIdaho\tBonner County\t236\t41.2\t7.5\t7.3\t16181\t126250\t0.3507\t83822\tRomney\t83822\t0.000953933\t83822.0\n4419\t-116.518451\t48.311219\tKootenai city\tID\tIdaho\tBonner County\t500\t34.9\t15.7\t5.5\t17015\t130357\t0.3507\t83852\tRomney\t83852\t0.002021045\t83852.0\n4420\t-116.60210900000001\t48.254929\tDover city\tID\tIdaho\tBonner County\t369\t51.5\t36.9\t5.0\t26251\t250000\t0.3507\t83860\tRomney\t83860\t0.0014915310000000002\t83860.0\n4421\t-116.307138\t48.249543\tHope city\tID\tIdaho\tBonner County\t87\t54.1\t28.6\t6.8\t21114\t256250\t0.3507\t83836\tRomney\t83836\t0.000351662\t83836.0\n4422\t-116.1768\t48.147335\tClark Fork city\tID\tIdaho\tBonner County\t655\t50.2\t7.4\t6.2\t16477\t108784\t0.3507\t83811\tRomney\t83811\t0.0026475690000000002\t83811.0\n4423\t-116.559626\t48.2803\tSandpoint city\tID\tIdaho\tBonner County\t7379\t39.4\t26.9\t7.2\t23331\t153362\t0.3507\t83852\tRomney\t83852\t0.029826584\t83852.0\n4424\t-116.291347\t48.24107\tEast Hope city\tID\tIdaho\tBonner County\t221\t53.9\t27.4\t7.1\t21039\t256250\t0.3507\t83836\tRomney\t83836\t0.000893302\t83836.0\n4425\t-116.539429\t48.309855999999996\tPonderay city\tID\tIdaho\tBonner County\t754\t39.4\t13.3\t7.1\t18294\t145500\t0.3507\t83852\tRomney\t83852\t0.0030477359999999997\t83852.0\n4426\t-116.91091999999999\t48.184179\tPriest River city\tID\tIdaho\tBonner County\t2095\t38.9\t8.2\t8.1\t15767\t112302\t0.3507\t83822\tRomney\t83822\t0.008468179000000001\t83822.0\n4427\t-112.035798\t43.490557\tIdaho Falls city\tID\tIdaho\tBonneville County\t55479\t33.8\t31.4\t8.1\t25888\t137768\t0.2291\t83404\tRomney\t83404\t0.224251127\t83404.0\n4428\t-111.95861599999999\t43.593837\tUcon city\tID\tIdaho\tBonneville County\t1184\t33.7\t18.9\t7.0\t17463\t133824\t0.2291\t83401\tRomney\t83401\t0.004785835\t83401.0\n4429\t-111.315569\t43.442249\tSwan Valley city\tID\tIdaho\tBonneville County\t243\t51.1\t15.1\t7.1\t25160\t150000\t0.2291\t83449\tRomney\t83449\t0.0009822280000000001\t83449.0\n4430\t-111.280197\t43.399545\tIrwin city\tID\tIdaho\tBonneville County\t178\t51.6\t15.3\t7.2\t25681\t150000\t0.2291\t83428\tRomney\t83428\t0.000719492\t83428.0\n4431\t-111.969353\t43.478683000000004\tAmmon city\tID\tIdaho\tBonneville County\t8438\t29.8\t31.6\t7.4\t23235\t141959\t0.2291\t83406\tRomney\t83406\t0.034107158\t83406.0\n4432\t-111.93099099999999\t43.526462\tIona city\tID\tIdaho\tBonneville County\t1369\t36.0\t20.0\t6.2\t19285\t147321\t0.2291\t83401\tRomney\t83401\t0.005533621999999999\t83401.0\n4433\t-116.316985\t48.691184\tBonners Ferry city\tID\tIdaho\tBoundary County\t3122\t41.0\t17.6\t12.3\t16470\t142145\t0.2696\t83805\tRomney\t83805\t0.012619406000000001\t83805.0\n4434\t-116.19516599999999\t48.724928999999996\tMoyie Springs city\tID\tIdaho\tBoundary County\t762\t37.5\t13.0\t15.5\t19455\t167969\t0.2696\t83845\tRomney\t83845\t0.003080073\t83845.0\n4435\t-113.241459\t43.606966\tButte City\tID\tIdaho\tButte County\t69\t51.7\t9.6\t11.4\t17810\t92500\t0.2006\t83213\tRomney\t83213\t0.000278904\t83213.0\n4436\t-113.36721999999999\t43.734438\tMoore city\tID\tIdaho\tButte County\t194\t43.3\t10.5\t5.3\t17575\t108750\t0.2006\t83255\tRomney\t83255\t0.0007841660000000001\t83255.0\n4437\t-113.30133400000001\t43.634008\tArco city\tID\tIdaho\tButte County\t1003\t42.4\t15.6\t6.8\t18322\t88448\t0.2006\t83213\tRomney\t83213\t0.004054217\t83213.0\n4438\t-114.79328799999999\t43.346457\tFairfield city\tID\tIdaho\tCamas County\t467\t43.0\t25.6\t10.0\t22153\t136667\t0.2751\t83327\tRomney\t83327\t0.0018876560000000001\t83327.0\n4439\t-116.800352\t43.726603000000004\tNotus city\tID\tIdaho\tCanyon County\t535\t27.1\t9.4\t14.9\t12660\t144318\t0.3005\t83656\tRomney\t83656\t0.002162518\t83656.0\n4440\t-116.56045300000001\t43.581371999999995\tNampa city\tID\tIdaho\tCanyon County\t67823\t30.5\t19.3\t12.1\t20183\t140119\t0.3005\t83687\tRomney\t83687\t0.274146689\t83687.0\n4441\t-116.62263100000001\t43.706158\tMiddleton city\tID\tIdaho\tCanyon County\t4651\t31.0\t11.9\t11.1\t18267\t124145\t0.3005\t83644\tRomney\t83644\t0.018799762\t83644.0\n4442\t-116.908979\t43.676082\tWilder city\tID\tIdaho\tCanyon County\t2245\t26.0\t4.8\t25.5\t9336\t92051\t0.3005\t83676\tRomney\t83676\t0.009074493000000001\t83676.0\n4443\t-116.94133500000001\t43.785445\tParma city\tID\tIdaho\tCanyon County\t2480\t36.4\t12.0\t13.5\t15664\t104745\t0.3005\t83660\tRomney\t83660\t0.010024384\t83660.0\n4444\t-116.530173\t43.372491\tMelba city\tID\tIdaho\tCanyon County\t506\t33.5\t13.2\t12.5\t17132\t151786\t0.3005\t83641\tRomney\t83641\t0.002045298\t83641.0\n4445\t-116.67574499999999\t43.653822\tCaldwell city\tID\tIdaho\tCanyon County\t34823\t31.8\t14.8\t12.0\t18316\t122111\t0.3005\t83605\tRomney\t83605\t0.14075771\t83605.0\n4446\t-116.821775\t43.673688\tGreenleaf city\tID\tIdaho\tCanyon County\t997\t35.5\t18.5\t15.0\t17956\t137162\t0.3005\t83626\tRomney\t83626\t0.0040299640000000005\t83626.0\n4447\t-111.587294\t42.658962\tSoda Springs city\tID\tIdaho\tCaribou County\t3166\t36.0\t16.4\t6.3\t20186\t114613\t0.1265\t83276\tRomney\t83276\t0.012797258\t83276.0\n4448\t-111.73060600000001\t42.575371000000004\tGrace city\tID\tIdaho\tCaribou County\t984\t36.7\t14.8\t5.5\t16611\t104911\t0.1265\t832HH\tRomney\t832HH\t0.0039774170000000005\t0.0\n4449\t-111.88258799999998\t42.720028000000006\tBancroft city\tID\tIdaho\tCaribou County\t357\t35.0\t15.8\t8.9\t16353\t87500\t0.1265\t83217\tRomney\t83217\t0.001443026\t83217.0\n4450\t-113.7885\t42.560437\tBurley city\tID\tIdaho\tCassia County\t9380\t31.9\t14.6\t8.0\t16068\t111402\t0.1308\t83336\tRomney\t83336\t0.037914807\t83336.0\n4451\t-113.629236\t42.518735\tDeclo city\tID\tIdaho\tCassia County\t362\t32.8\t16.0\t6.3\t15288\t126389\t0.1308\t83311\tRomney\t83311\t0.001463237\t83311.0\n4452\t-113.36941200000001\t42.307563\tMalta city\tID\tIdaho\tCassia County\t190\t34.4\t26.3\t2.3\t17993\t131250\t0.1308\t83342\tRomney\t83342\t0.000767997\t83342.0\n4453\t-113.580926\t42.41061\tAlbion city\tID\tIdaho\tCassia County\t260\t38.1\t16.1\t8.8\t16229\t134722\t0.1308\t83311\tRomney\t83311\t0.001050943\t83311.0\n4454\t-113.88216399999999\t42.243072\tOakley city\tID\tIdaho\tCassia County\t710\t32.7\t20.9\t2.5\t15386\t119286\t0.1308\t83346\tRomney\t83346\t0.002869884\t83346.0\n4455\t-112.230024\t44.173808\tDubois city\tID\tIdaho\tClark County\t662\t29.9\t12.6\t6.5\t12607\t93125\t0.2012\t834XX\tRomney\t834XX\t0.002675864\t0.0\n4456\t-112.19027700000001\t44.389237\tSpencer city\tID\tIdaho\tClark County\t35\t50.8\t18.5\t8.0\t20932\t90000\t0.2012\t83446\tRomney\t83446\t0.000141473\t83446.0\n4457\t-115.93968600000001\t46.378782\tWeippe city\tID\tIdaho\tClearwater County\t373\t37.8\t6.6\t9.6\t16074\t60000\t0.2792\t83553\tRomney\t83553\t0.0015077\t83553.0\n4458\t-115.799379\t46.493235999999996\tPierce city\tID\tIdaho\tClearwater County\t539\t45.8\t6.8\t10.3\t16940\t64516\t0.2792\t83546\tRomney\t83546\t0.0021786870000000003\t83546.0\n4459\t-116.25917700000001\t46.486894\tOrofino city\tID\tIdaho\tClearwater County\t3205\t42.5\t14.6\t6.2\t20009\t112926\t0.2792\t83544\tRomney\t83544\t0.012954898999999999\t83544.0\n4460\t-116.18133\t46.783281\tElk River city\tID\tIdaho\tClearwater County\t152\t56.3\t12.2\t8.8\t19165\t118750\t0.2792\t83827\tRomney\t83827\t0.000614398\t83827.0\n4461\t-114.39961100000001\t44.259240000000005\tClayton city\tID\tIdaho\tCuster County\t27\t42.5\t19.0\t5.9\t23052\t212500\t0.2251\t83227\tRomney\t83227\t0.000109136\t83227.0\n4462\t-113.61243999999999\t43.911684\tMackay city\tID\tIdaho\tCuster County\t575\t47.4\t23.5\t3.5\t20612\t116776\t0.2251\t83251\tRomney\t83251\t0.002324202\t83251.0\n4463\t-113.619662\t43.692518\tLost River city\tID\tIdaho\tCuster County\t26\t38.8\t25.0\t6.7\t20981\t137500\t0.2251\t83255\tRomney\t83255\t0.000105094\t83255.0\n4464\t-114.22844199999999\t44.505281\tChallis city\tID\tIdaho\tCuster County\t912\t46.3\t19.5\t3.6\t17621\t121976\t0.2251\t83226\tRomney\t83226\t0.003686386\t83226.0\n4465\t-114.93648200000001\t44.21501\tStanley city\tID\tIdaho\tCuster County\t102\t46.3\t18.4\t4.8\t22616\t156250\t0.2251\t83278\tRomney\t83278\t0.00041229300000000005\t83278.0\n4466\t-115.866129\t43.049778\tMountain Home AFB CDP\tID\tIdaho\tElmore County\t8094\t25.3\t21.5\t12.5\t16173\t214286\t0.314\t83648\tRomney\t83648\t0.032716679\t83648.0\n4467\t-115.697645\t43.135690000000004\tMountain Home city\tID\tIdaho\tElmore County\t11782\t32.7\t20.9\t8.2\t21509\t131695\t0.314\t83647\tRomney\t83647\t0.047623908\t83647.0\n4468\t-115.304477\t42.95074\tGlenns Ferry city\tID\tIdaho\tElmore County\t1660\t37.8\t15.8\t13.6\t15175\t100500\t0.314\t83623\tRomney\t83623\t0.00670987\t83623.0\n4469\t-111.978174\t42.111838\tDayton city\tID\tIdaho\tFranklin County\t516\t28.6\t20.5\t4.3\t15309\t133696\t0.057999999999999996\t83232\tRomney\t83232\t0.0020857189999999998\t83232.0\n4470\t-111.879608\t42.099257\tPreston city\tID\tIdaho\tFranklin County\t5142\t30.1\t13.0\t9.3\t17395\t134498\t0.057999999999999996\t83263\tRomney\t83263\t0.020784428\t83263.0\n4471\t-112.00430300000001\t42.187112\tClifton city\tID\tIdaho\tFranklin County\t236\t29.8\t23.5\t4.5\t15421\t131818\t0.057999999999999996\t83228\tRomney\t83228\t0.000953933\t83228.0\n4472\t-111.803569\t42.0179\tFranklin city\tID\tIdaho\tFranklin County\t813\t27.2\t10.7\t12.9\t14745\t141532\t0.057999999999999996\t83237\tRomney\t83237\t0.0032862190000000004\t83237.0\n4473\t-111.978128\t42.037141999999996\tWeston city\tID\tIdaho\tFranklin County\t530\t27.6\t15.8\t4.1\t15148\t139130\t0.057999999999999996\t83286\tRomney\t83286\t0.002142308\t83286.0\n4474\t-112.017858\t42.259943\tOxford city\tID\tIdaho\tFranklin County\t59\t28.8\t24.2\t3.7\t15351\t137500\t0.057999999999999996\t83228\tRomney\t83228\t0.000238483\t83228.0\n4475\t-111.758323\t43.958383000000005\tParker city\tID\tIdaho\tFremont County\t325\t32.8\t9.2\t7.1\t15973\t122500\t0.1396\t83445\tRomney\t83445\t0.0013136789999999999\t83445.0\n4476\t-111.359652\t44.62997\tIsland Park city\tID\tIdaho\tFremont County\t263\t51.2\t16.1\t10.1\t22734\t168182\t0.1396\t83433\tRomney\t83433\t0.00106307\t83433.0\n4477\t-111.68491999999999\t43.96629\tSt. Anthony city\tID\tIdaho\tFremont County\t3483\t30.1\t15.1\t10.6\t16877\t107090\t0.1396\t83445\tRomney\t83445\t0.0140786\t83445.0\n4478\t-111.668094\t43.887181\tTeton city\tID\tIdaho\tFremont County\t616\t30.9\t12.4\t9.7\t14883\t106731\t0.1396\t83451\tRomney\t83451\t0.0024899279999999998\t83451.0\n4479\t-111.34338500000001\t43.999544\tDrummond city\tID\tIdaho\tFremont County\t16\t46.3\t18.2\t11.1\t17571\t137500\t0.1396\t83420\tRomney\t83420\t6.47e-05\t83420.0\n4480\t-111.60465400000001\t43.886464000000004\tNewdale city\tID\tIdaho\tFremont County\t387\t30.8\t12.4\t9.8\t14905\t105769\t0.1396\t83451\tRomney\t83451\t0.001564289\t83451.0\n4481\t-111.320393\t44.118784000000005\tWarm River city\tID\tIdaho\tFremont County\t10\t52.5\t12.5\t0.0\t22596\t0\t0.1396\t83420\tRomney\t83420\t4.04e-05\t83420.0\n4482\t-111.449409\t44.072643\tAshton city\tID\tIdaho\tFremont County\t1230\t36.1\t16.4\t10.2\t16414\t100926\t0.1396\t83420\tRomney\t83420\t0.004971771\t83420.0\n4483\t-116.49341299999999\t43.871722999999996\tEmmett city\tID\tIdaho\tGem County\t6365\t35.6\t10.9\t9.2\t17787\t112140\t0.2612\t83617\tRomney\t83617\t0.025727905\t83617.0\n4484\t-114.71322099999999\t42.937844\tGooding city\tID\tIdaho\tGooding County\t3262\t39.0\t15.9\t7.3\t18846\t103344\t0.2515\t83330\tRomney\t83330\t0.013185299\t83330.0\n4485\t-114.94946599999999\t42.92584\tBliss city\tID\tIdaho\tGooding County\t276\t34.3\t17.1\t4.9\t15201\t143750\t0.2515\t83314\tRomney\t83314\t0.001115617\t83314.0\n4486\t-114.703521\t42.775511\tWendell city\tID\tIdaho\tGooding County\t2671\t34.1\t14.2\t4.8\t15166\t115492\t0.2515\t83355\tRomney\t83355\t0.010796423000000001\t83355.0\n4487\t-114.897535\t42.816718\tHagerman city\tID\tIdaho\tGooding County\t732\t46.3\t19.1\t6.6\t19067\t145565\t0.2515\t83332\tRomney\t83332\t0.00295881\t83332.0\n4488\t-116.317485\t45.420792\tRiggins city\tID\tIdaho\tIdaho County\t401\t52.2\t18.6\t6.2\t17125\t119079\t0.2179\t83549\tRomney\t83549\t0.0016208779999999999\t83549.0\n4489\t-116.30015900000001\t45.762875\tWhite Bird city\tID\tIdaho\tIdaho County\t105\t47.2\t17.1\t8.5\t18850\t126786\t0.2179\t83554\tRomney\t83554\t0.000424419\t83554.0\n4490\t-115.97628\t46.092256\tStites city\tID\tIdaho\tIdaho County\t243\t50.8\t12.2\t10.6\t16489\t113542\t0.2179\t83552\tRomney\t83552\t0.0009822280000000001\t83552.0\n4491\t-116.349166\t46.050834\tCottonwood city\tID\tIdaho\tIdaho County\t943\t42.0\t19.1\t5.1\t18406\t115767\t0.2179\t83522\tRomney\t83522\t0.003811691\t83522.0\n4492\t-116.12126\t45.925686\tGrangeville city\tID\tIdaho\tIdaho County\t3334\t46.1\t18.7\t6.4\t19291\t113963\t0.2179\t83530\tRomney\t83530\t0.013476328999999999\t83530.0\n4493\t-115.975945\t46.141152000000005\tKooskia city\tID\tIdaho\tIdaho County\t657\t42.9\t7.9\t8.8\t17012\t84722\t0.2179\t83552\tRomney\t83552\t0.002655653\t83552.0\n4494\t-116.389733\t46.152326\tFerdinand city\tID\tIdaho\tIdaho County\t141\t42.5\t17.7\t3.8\t17143\t145313\t0.2179\t83526\tRomney\t83526\t0.000569935\t83526.0\n4495\t-112.211997\t43.921188\tHamer city\tID\tIdaho\tJefferson County\t11\t11.3\t0.0\t0.0\t12564\t0\t0.1145\t83425\tRomney\t83425\t4.45e-05\t83425.0\n4496\t-112.484656\t43.843127\tMud Lake city\tID\tIdaho\tJefferson County\t266\t25.9\t13.9\t5.7\t12919\t101786\t0.1145\t83450\tRomney\t83450\t0.001075196\t83450.0\n4497\t-112.12829599999999\t43.720639\tRoberts city\tID\tIdaho\tJefferson County\t733\t28.6\t13.2\t9.5\t15588\t117391\t0.1145\t83444\tRomney\t83444\t0.002962852\t83444.0\n4498\t-111.99356999999999\t43.721897999999996\tMenan city\tID\tIdaho\tJefferson County\t762\t29.6\t11.9\t4.1\t15956\t133696\t0.1145\t83431\tRomney\t83431\t0.003080073\t83431.0\n4499\t-111.916572\t43.675015\tRigby city\tID\tIdaho\tJefferson County\t3334\t32.3\t19.0\t8.0\t18505\t122733\t0.1145\t83442\tRomney\t83442\t0.013476328999999999\t83442.0\n4500\t-111.76943200000001\t43.631608\tRirie city\tID\tIdaho\tJefferson County\t580\t28.8\t15.3\t10.6\t15198\t121000\t0.1145\t83442\tRomney\t83442\t0.002344412\t83442.0\n4501\t-112.01351000000001\t43.695246000000004\tLewisville city\tID\tIdaho\tJefferson County\t533\t34.6\t18.8\t10.7\t15694\t127778\t0.1145\t83431\tRomney\t83431\t0.0021544339999999998\t83431.0\n4502\t-114.208949\t42.605296\tEden city\tID\tIdaho\tJerome County\t447\t37.5\t16.6\t6.8\t16786\t138750\t0.2543\t83325\tRomney\t83325\t0.001806814\t83325.0\n4503\t-114.13654299999999\t42.595321999999996\tHazelton city\tID\tIdaho\tJerome County\t773\t34.7\t17.2\t6.5\t12852\t119583\t0.2543\t833HH\tRomney\t833HH\t0.003124536\t0.0\n4504\t-114.51789199999999\t42.720303\tJerome city\tID\tIdaho\tJerome County\t9306\t32.6\t15.1\t8.4\t18412\t109139\t0.2543\t83338\tRomney\t83338\t0.037615692\t83338.0\n4505\t-116.86569899999999\t47.96583\tSpirit Lake city\tID\tIdaho\tKootenai County\t2068\t41.1\t17.6\t15.7\t18225\t209483\t0.3151\t83869\tRomney\t83869\t0.008359043\t83869.0\n4506\t-116.74721799999999\t47.672565999999996\tFernan Lake Village city\tID\tIdaho\tKootenai County\t183\t51.0\t36.7\t7.2\t28456\t400000\t0.3151\t83814\tRomney\t83814\t0.000739703\t83814.0\n4507\t-117.012049\t47.770334000000005\tHauser city\tID\tIdaho\tKootenai County\t722\t40.8\t18.2\t13.5\t19592\t218750\t0.3151\t83854\tRomney\t83854\t0.0029183890000000004\t83854.0\n4508\t-116.94828700000001\t47.713570000000004\tPost Falls city\tID\tIdaho\tKootenai County\t22314\t33.6\t17.7\t12.3\t21722\t174305\t0.3151\t83854\tRomney\t83854\t0.090195203\t83854.0\n4509\t-116.76924\t47.732746999999996\tDalton Gardens city\tID\tIdaho\tKootenai County\t2539\t47.9\t26.7\t7.7\t26918\t307547\t0.3151\t83815\tRomney\t83815\t0.010262867\t83815.0\n4510\t-116.75438799999999\t47.764934999999994\tHayden Lake city\tID\tIdaho\tKootenai County\t573\t47.2\t42.5\t6.8\t33294\t342500\t0.3151\t83835\tRomney\t83835\t0.002316118\t83835.0\n4511\t-116.78013500000002\t47.453793\tHarrison city\tID\tIdaho\tKootenai County\t313\t54.3\t34.7\t9.2\t23391\t347917\t0.3151\t83833\tRomney\t83833\t0.001265174\t83833.0\n4512\t-116.892944\t47.799007\tRathdrum city\tID\tIdaho\tKootenai County\t7479\t33.9\t15.6\t10.1\t19378\t169306\t0.3151\t83858\tRomney\t83858\t0.030230793\t83858.0\n4513\t-116.91918799999999\t47.400622\tWorley city\tID\tIdaho\tKootenai County\t254\t31.7\t23.8\t12.1\t14662\t150000\t0.3151\t83876\tRomney\t83876\t0.0010266910000000001\t83876.0\n4514\t-116.80473\t47.765405\tHayden city\tID\tIdaho\tKootenai County\t12286\t37.8\t23.1\t9.2\t20514\t191281\t0.3151\t83815\tRomney\t83815\t0.049661120999999996\t83815.0\n4515\t-117.038421\t47.705169\tState Line city\tID\tIdaho\tKootenai County\t44\t33.1\t18.5\t13.6\t16463\t168750\t0.3151\t83854\tRomney\t83854\t0.00017785200000000002\t83854.0\n4516\t-116.707862\t47.944589\tAthol city\tID\tIdaho\tKootenai County\t925\t39.4\t12.1\t13.1\t16844\t145058\t0.3151\t83801\tRomney\t83801\t0.003738934\t83801.0\n4517\t-116.788987\t47.702078\tCoeur d'Alene city\tID\tIdaho\tKootenai County\t40788\t37.0\t23.3\t10.1\t21988\t174863\t0.3151\t83815\tRomney\t83815\t0.164868779\t83815.0\n4518\t-116.84925600000001\t47.703806\tHuetter city\tID\tIdaho\tKootenai County\t166\t39.2\t11.2\t11.4\t23204\t42500\t0.3151\t83815\tRomney\t83815\t0.000670987\t83815.0\n4519\t-116.654298\t46.614078000000006\tKendrick city\tID\tIdaho\tLatah County\t365\t43.7\t16.7\t5.9\t20043\t144792\t0.4954\t83535\tRomney\t83535\t0.001475363\t83535.0\n4520\t-117.00048100000001\t46.730990999999996\tMoscow city\tID\tIdaho\tLatah County\t22643\t25.9\t56.5\t8.0\t23125\t189260\t0.4954\t83843\tRomney\t83843\t0.09152505\t83843.0\n4521\t-116.393662\t46.858909000000004\tBovill city\tID\tIdaho\tLatah County\t311\t42.6\t18.9\t19.1\t18289\t78333\t0.4954\t83806\tRomney\t83806\t0.00125709\t83806.0\n4522\t-116.788402\t46.73786\tTroy city\tID\tIdaho\tLatah County\t778\t41.2\t27.5\t4.7\t24070\t182813\t0.4954\t83871\tRomney\t83871\t0.003144746\t83871.0\n4523\t-116.70908999999999\t46.574784\tJuliaetta city\tID\tIdaho\tLatah County\t603\t45.1\t14.0\t11.6\t19036\t99000\t0.4954\t83535\tRomney\t83535\t0.00243738\t83535.0\n4524\t-116.92877299999999\t46.551587\tGenesee city\tID\tIdaho\tLatah County\t915\t38.3\t40.0\t2.1\t22230\t144688\t0.4954\t83832\tRomney\t83832\t0.003698513\t83832.0\n4525\t-116.89828700000001\t46.923176\tPotlatch city\tID\tIdaho\tLatah County\t746\t40.6\t25.2\t10.7\t17690\t97600\t0.4954\t83855\tRomney\t83855\t0.003015399\t83855.0\n4526\t-116.88959399999999\t46.928103\tOnaway city\tID\tIdaho\tLatah County\t217\t40.7\t25.3\t10.3\t17685\t97500\t0.4954\t83855\tRomney\t83855\t0.0008771339999999999\t83855.0\n4527\t-116.55618899999999\t46.800699\tDeary city\tID\tIdaho\tLatah County\t520\t41.0\t15.6\t12.7\t18957\t129167\t0.4954\t83823\tRomney\t83823\t0.002101887\t83823.0\n4528\t-113.899781\t45.177448999999996\tSalmon city\tID\tIdaho\tLemhi County\t3372\t46.6\t21.4\t6.1\t19568\t125248\t0.2336\t83467\tRomney\t83467\t0.013629928000000001\t83467.0\n4529\t-113.358694\t44.679743\tLeadore city\tID\tIdaho\tLemhi County\t89\t43.5\t22.6\t2.1\t14215\t125000\t0.2336\t83464\tRomney\t83464\t0.000359746\t83464.0\n4530\t-116.24006100000001\t46.233825\tNezperce city\tID\tIdaho\tLewis County\t534\t46.0\t27.4\t3.6\t19258\t107639\t0.2452\t83543\tRomney\t83543\t0.002158476\t83543.0\n4531\t-116.014086\t46.22719\tKamiah city\tID\tIdaho\tLewis County\t1151\t45.3\t11.1\t8.7\t19873\t119512\t0.2452\t83536\tRomney\t83536\t0.004652446\t83536.0\n4532\t-116.623912\t46.240646999999996\tWinchester city\tID\tIdaho\tLewis County\t312\t52.0\t16.7\t5.2\t23284\t112500\t0.2452\t83555\tRomney\t83555\t0.0012611319999999999\t83555.0\n4533\t-116.47206200000001\t46.241739\tCraigmont city\tID\tIdaho\tLewis County\t556\t44.2\t21.1\t5.2\t19694\t110870\t0.2452\t83523\tRomney\t83523\t0.002247402\t83523.0\n4534\t-116.541574\t46.321958\tReubens city\tID\tIdaho\tLewis County\t73\t52.1\t15.8\t5.6\t23259\t112500\t0.2452\t83548\tRomney\t83548\t0.00029507299999999997\t83548.0\n4535\t-114.264275\t42.91312\tDietrich city\tID\tIdaho\tLincoln County\t174\t32.7\t13.1\t12.5\t16331\t119318\t0.282\t83324\tRomney\t83324\t0.000703324\t83324.0\n4536\t-114.15575\t43.052074\tRichfield city\tID\tIdaho\tLincoln County\t507\t35.2\t11.0\t10.5\t15867\t122222\t0.282\t83349\tRomney\t83349\t0.00204934\t83349.0\n4537\t-114.406341\t42.935363\tShoshone city\tID\tIdaho\tLincoln County\t1617\t37.2\t17.6\t14.0\t17135\t120283\t0.282\t83352\tRomney\t83352\t0.00653606\t83352.0\n4538\t-111.74803700000001\t43.870527\tSugar City\tID\tIdaho\tMadison County\t2038\t24.3\t28.4\t6.7\t17114\t179225\t0.0577\t83448\tRomney\t83448\t0.00823778\t83448.0\n4539\t-111.78759299999999\t43.823307\tRexburg city\tID\tIdaho\tMadison County\t22495\t21.2\t29.6\t10.1\t12702\t187587\t0.0577\t83440\tRomney\t83440\t0.09092682099999999\t83440.0\n4540\t-113.673546\t42.618898\tRupert city\tID\tIdaho\tMinidoka County\t5338\t32.9\t7.5\t9.0\t16423\t93550\t0.1993\t83350\tRomney\t83350\t0.021576678\t83350.0\n4541\t-113.48945\t42.753863\tMinidoka city\tID\tIdaho\tMinidoka County\t119\t25.0\t3.4\t1.7\t13740\t116667\t0.1993\t83350\tRomney\t83350\t0.000481009\t83350.0\n4542\t-113.78493200000001\t42.605230999999996\tPaul city\tID\tIdaho\tMinidoka County\t832\t38.1\t11.1\t5.8\t15724\t103814\t0.1993\t83336\tRomney\t83336\t0.003363019\t83336.0\n4543\t-113.76349599999999\t42.557711\tHeyburn city\tID\tIdaho\tMinidoka County\t2987\t31.7\t10.9\t7.3\t17584\t101269\t0.1993\t83336\tRomney\t83336\t0.012073724\t83336.0\n4544\t-113.59463600000001\t42.66787\tAcequia city\tID\tIdaho\tMinidoka County\t139\t38.9\t14.4\t5.4\t16118\t131250\t0.1993\t83350\tRomney\t83350\t0.000561851\t83350.0\n4545\t-116.994977\t46.393817999999996\tLewiston city\tID\tIdaho\tNez Perce County\t32126\t39.9\t22.7\t5.1\t24782\t171273\t0.3828\t83501\tRomney\t83501\t0.129856193\t83501.0\n4546\t-116.42593500000001\t46.474502\tPeck city\tID\tIdaho\tNez Perce County\t199\t47.2\t12.7\t7.9\t19780\t135417\t0.3828\t83545\tRomney\t83545\t0.0008043760000000001\t83545.0\n4547\t-116.804373\t46.403882\tLapwai city\tID\tIdaho\tNez Perce County\t1210\t31.5\t17.3\t8.2\t16579\t135081\t0.3828\t83540\tRomney\t83540\t0.0048909290000000005\t83540.0\n4548\t-116.67025\t46.375026\tCuldesac city\tID\tIdaho\tNez Perce County\t383\t44.7\t16.8\t10.6\t16202\t133750\t0.3828\t83524\tRomney\t83524\t0.001548121\t83524.0\n4549\t-112.249963\t42.190315000000005\tMalad City\tID\tIdaho\tOneida County\t2191\t37.7\t20.5\t5.0\t16997\t118497\t0.1039\t83252\tRomney\t83252\t0.00885622\t83252.0\n4550\t-116.09168999999999\t42.983872\tGrand View city\tID\tIdaho\tOwyhee County\t463\t33.9\t9.0\t5.9\t15820\t98000\t0.2237\t83624\tRomney\t83624\t0.001871488\t83624.0\n4551\t-116.80939599999999\t43.547273\tMarsing city\tID\tIdaho\tOwyhee County\t925\t31.6\t12.1\t4.9\t14717\t99762\t0.2237\t83639\tRomney\t83639\t0.003738934\t83639.0\n4552\t-116.93624799999999\t43.617810999999996\tHomedale city\tID\tIdaho\tOwyhee County\t2791\t30.7\t7.1\t8.8\t13524\t93540\t0.2237\t83628\tRomney\t83628\t0.011281474\t83628.0\n4553\t-116.930801\t44.076237\tPayette city\tID\tIdaho\tPayette County\t7653\t33.8\t9.2\t9.6\t17663\t133512\t0.2673\t83661\tRomney\t83661\t0.030934117\t83661.0\n4554\t-116.818964\t43.970074\tNew Plymouth city\tID\tIdaho\tPayette County\t1658\t37.1\t11.5\t12.1\t15257\t122674\t0.2673\t83655\tRomney\t83655\t0.0067017859999999995\t83655.0\n4555\t-116.921124\t44.017421999999996\tFruitland city\tID\tIdaho\tPayette County\t4605\t35.2\t13.9\t9.1\t17384\t135417\t0.2673\t83619\tRomney\t83619\t0.018613826\t83619.0\n4556\t-112.594315\t42.884665000000005\tArbon Valley CDP\tID\tIdaho\tPower County\t647\t35.9\t11.5\t10.7\t17189\t126136\t0.3382\t83204\tRomney\t83204\t0.0026152320000000003\t83204.0\n4557\t-112.874503\t42.57328\tRockland city\tID\tIdaho\tPower County\t333\t36.0\t23.5\t5.9\t16300\t102344\t0.3382\t83271\tRomney\t83271\t0.001346016\t83271.0\n4558\t-112.854546\t42.782813\tAmerican Falls city\tID\tIdaho\tPower County\t4273\t31.8\t15.0\t5.9\t17369\t103989\t0.3382\t83211\tRomney\t83211\t0.017271852\t83211.0\n4559\t-116.13547700000001\t47.53952\tKellogg city\tID\tIdaho\tShoshone County\t2300\t41.4\t10.3\t9.0\t19810\t102333\t0.4423\t83837\tRomney\t83837\t0.009296808\t83837.0\n4560\t-115.796375\t47.468872\tMullan city\tID\tIdaho\tShoshone County\t787\t46.2\t9.8\t8.6\t22997\t86200\t0.4423\t83846\tRomney\t83846\t0.003181125\t83846.0\n4561\t-115.99999\t47.505281\tOsburn city\tID\tIdaho\tShoshone County\t1424\t50.6\t11.2\t7.3\t22635\t97556\t0.4423\t83849\tRomney\t83849\t0.005755936999999999\t83849.0\n4562\t-115.92243700000002\t47.473388\tWallace city\tID\tIdaho\tShoshone County\t928\t45.5\t15.9\t8.1\t17640\t98056\t0.4423\t83867\tRomney\t83867\t0.00375106\t83867.0\n4563\t-116.17778600000001\t47.542476\tSmelterville city\tID\tIdaho\tShoshone County\t641\t43.1\t4.4\t11.4\t17147\t66389\t0.4423\t83868\tRomney\t83868\t0.00259098\t83868.0\n4564\t-116.135053\t47.518909\tWardner city\tID\tIdaho\tShoshone County\t210\t40.0\t10.6\t9.1\t18478\t105682\t0.4423\t83837\tRomney\t83837\t0.000848839\t83837.0\n4565\t-116.23268600000002\t47.5362\tPinehurst city\tID\tIdaho\tShoshone County\t1575\t44.0\t7.7\t6.7\t22062\t107870\t0.4423\t83850\tRomney\t83850\t0.006366292\t83850.0\n4566\t-111.107754\t43.725041999999995\tDriggs city\tID\tIdaho\tTeton County\t1465\t30.4\t33.0\t5.3\t19344\t231604\t0.4258\t83422\tRomney\t83422\t0.005921661999999999\t83422.0\n4567\t-111.113777\t43.602152000000004\tVictor city\tID\tIdaho\tTeton County\t1207\t32.8\t33.3\t4.5\t26989\t290909\t0.4258\t83455\tRomney\t83455\t0.004878803\t83455.0\n4568\t-111.159419\t43.815456\tTetonia city\tID\tIdaho\tTeton County\t342\t32.3\t22.9\t3.7\t21825\t245833\t0.4258\t83452\tRomney\t83452\t0.001382395\t83452.0\n4569\t-114.87169399999999\t42.520502\tCastleford city\tID\tIdaho\tTwin Falls County\t296\t40.0\t16.8\t6.0\t17364\t150000\t0.2679\t83316\tRomney\t83316\t0.001196459\t83316.0\n4570\t-114.61162900000001\t42.568868\tFiler city\tID\tIdaho\tTwin Falls County\t2200\t34.8\t11.6\t6.7\t20044\t114688\t0.2679\t83328\tRomney\t83328\t0.008892599000000001\t83328.0\n4571\t-114.301152\t42.531265999999995\tHansen city\tID\tIdaho\tTwin Falls County\t1153\t34.5\t5.9\t8.1\t18561\t94355\t0.2679\t83334\tRomney\t83334\t0.00466053\t83334.0\n4572\t-114.461271\t42.56228\tTwin Falls city\tID\tIdaho\tTwin Falls County\t37123\t33.9\t19.0\t8.5\t21345\t146292\t0.2679\t83301\tRomney\t83301\t0.150054518\t83301.0\n4573\t-114.584525\t42.353182000000004\tHollister city\tID\tIdaho\tTwin Falls County\t268\t37.9\t6.4\t8.7\t16420\t129688\t0.2679\t83301\tRomney\t83301\t0.00108328\t83301.0\n4574\t-114.76004499999999\t42.598143\tBuhl city\tID\tIdaho\tTwin Falls County\t4144\t36.6\t15.1\t11.1\t17150\t110915\t0.2679\t83316\tRomney\t83316\t0.016750422\t83316.0\n4575\t-114.159847\t42.492076000000004\tMurtaugh city\tID\tIdaho\tTwin Falls County\t159\t32.7\t10.6\t8.2\t12718\t120000\t0.2679\t83344\tRomney\t83344\t0.0006426919999999999\t83344.0\n4576\t-114.36549199999999\t42.53367\tKimberly city\tID\tIdaho\tTwin Falls County\t3144\t35.7\t14.8\t6.8\t18153\t131568\t0.2679\t83341\tRomney\t83341\t0.012708332\t83341.0\n4577\t-116.10389199999999\t44.91275\tMcCall city\tID\tIdaho\tValley County\t2425\t46.1\t38.6\t6.8\t23762\t238843\t0.4259\t83638\tRomney\t83638\t0.009802069\t83638.0\n4578\t-116.042345\t44.510298999999996\tCascade city\tID\tIdaho\tValley County\t1110\t51.0\t21.2\t9.2\t22045\t149671\t0.4259\t83611\tRomney\t83611\t0.00448672\t83611.0\n4579\t-116.07748799999999\t44.729879\tDonnelly city\tID\tIdaho\tValley County\t145\t45.9\t27.8\t8.8\t22630\t225000\t0.4259\t83615\tRomney\t83615\t0.000586103\t83615.0\n4580\t-116.733351\t44.469597\tMidvale city\tID\tIdaho\tWashington County\t212\t47.1\t17.2\t5.6\t20361\t151786\t0.2549\t83645\tRomney\t83645\t0.000856923\t83645.0\n4581\t-116.96812\t44.250958000000004\tWeiser city\tID\tIdaho\tWashington County\t5407\t36.3\t14.9\t11.9\t16771\t119387\t0.2549\t83672\tRomney\t83672\t0.021855582000000002\t83672.0\n4582\t-116.676974\t44.573161999999996\tCambridge city\tID\tIdaho\tWashington County\t403\t45.7\t12.4\t10.2\t16565\t128125\t0.2549\t83610\tRomney\t83610\t0.001628962\t83610.0\n4583\t-91.002477\t40.146874\tLa Prairie village\tIL\tIllinois\tAdams County\t59\t41.9\t5.1\t5.7\t18625\t77500\t0.3152\t62339\tObama\t62339\t0.000105835\t62339.0\n4584\t-91.24472800000001\t39.817245\tPayson village\tIL\tIllinois\tAdams County\t1033\t34.5\t12.1\t8.2\t19605\t81286\t0.3152\t62360\tObama\t62360\t0.001853002\t62360.0\n4585\t-91.375781\t40.176588\tLima village\tIL\tIllinois\tAdams County\t152\t42.3\t13.5\t8.6\t18799\t95000\t0.3152\t62348\tObama\t62348\t0.000272659\t62348.0\n4586\t-91.286282\t40.088959\tMendon village\tIL\tIllinois\tAdams County\t860\t40.7\t15.8\t4.0\t18386\t92024\t0.3152\t62351\tObama\t62351\t0.0015426729999999998\t62351.0\n4587\t-91.145239\t39.988123\tColumbus village\tIL\tIllinois\tAdams County\t107\t40.3\t18.1\t10.0\t17555\t108333\t0.3152\t62325\tObama\t62325\t0.00019193700000000002\t62325.0\n4588\t-91.16029300000001\t40.0324\tCoatsburg village\tIL\tIllinois\tAdams County\t212\t40.9\t12.6\t4.8\t18093\t107143\t0.3152\t62325\tObama\t62325\t0.000380287\t62325.0\n4589\t-91.108349\t39.890134\tLiberty village\tIL\tIllinois\tAdams County\t509\t40.4\t15.6\t2.7\t19042\t110625\t0.3152\t62347\tObama\t62347\t0.000913047\t62347.0\n4590\t-91.382552\t39.934055\tQuincy city\tIL\tIllinois\tAdams County\t39694\t40.2\t22.6\t9.7\t21745\t98385\t0.3152\t62301\tObama\t62301\t0.07120334\t62301.0\n4591\t-91.019009\t40.110135\tGolden village\tIL\tIllinois\tAdams County\t631\t41.4\t14.4\t4.6\t19752\t87857\t0.3152\t62339\tObama\t62339\t0.001131892\t62339.0\n4592\t-91.18258399999999\t39.785625\tPlainville village\tIL\tIllinois\tAdams County\t260\t40.8\t7.9\t8.2\t19641\t100000\t0.3152\t62365\tObama\t62365\t0.00046639\t62365.0\n4593\t-91.066726\t40.038740999999995\tCamp Point village\tIL\tIllinois\tAdams County\t1153\t41.0\t12.2\t10.6\t16945\t82381\t0.3152\t62320\tObama\t62320\t0.002068258\t62320.0\n4594\t-91.372174\t40.074090999999996\tUrsa village\tIL\tIllinois\tAdams County\t559\t40.5\t15.2\t7.0\t18157\t94167\t0.3152\t62376\tObama\t62376\t0.001002738\t62376.0\n4595\t-91.221583\t40.152504\tLoraine village\tIL\tIllinois\tAdams County\t401\t40.6\t12.1\t13.6\t21898\t73125\t0.3152\t62349\tObama\t62349\t0.000719316\t62349.0\n4596\t-90.957752\t40.029993\tClayton village\tIL\tIllinois\tAdams County\t897\t39.4\t6.4\t10.4\t15577\t51944\t0.3152\t62324\tObama\t62324\t0.001609044\t62324.0\n4597\t-89.486889\t37.295745000000004\tEast Cape Girardeau village\tIL\tIllinois\tAlexander County\t404\t44.6\t13.9\t8.1\t19223\t54231\t0.5613\t62957\tObama\t62957\t0.0007246980000000001\t62957.0\n4598\t-89.27135799999999\t37.241538\tTamms village\tIL\tIllinois\tAlexander County\t1022\t36.7\t1.6\t19.4\t14810\t56500\t0.5613\t62988\tObama\t62988\t0.00183327\t62988.0\n4599\t-89.45438399999999\t37.213974\tThebes village\tIL\tIllinois\tAlexander County\t399\t37.3\t6.8\t14.0\t13160\t51111\t0.5613\t62990\tObama\t62990\t0.0007157289999999999\t62990.0\n4600\t-89.181911\t37.006335\tCairo city\tIL\tIllinois\tAlexander County\t2963\t36.2\t9.5\t20.8\t17175\t37923\t0.5613\t62914\tObama\t62914\t0.005315048\t62914.0\n4601\t-89.266116\t38.924417\tMulberry Grove village\tIL\tIllinois\tBond County\t724\t41.1\t10.0\t11.4\t18906\t67250\t0.4117\t62262\tObama\t62262\t0.001298716\t62262.0\n4602\t-89.57201500000001\t38.892745\tOld Ripley village\tIL\tIllinois\tBond County\t127\t45.7\t16.0\t9.1\t24911\t135417\t0.4117\t62275\tObama\t62275\t0.000227813\t62275.0\n4603\t-89.539211\t38.823809999999995\tPocahontas village\tIL\tIllinois\tBond County\t681\t39.7\t8.7\t12.9\t17447\t75938\t0.4117\t62275\tObama\t62275\t0.001221582\t62275.0\n4604\t-89.390979\t38.886734000000004\tGreenville city\tIL\tIllinois\tBond County\t7302\t34.4\t23.4\t15.3\t20833\t100000\t0.4117\t62246\tObama\t62246\t0.013098371999999999\t62246.0\n4605\t-89.57270799999999\t39.000096\tSorento village\tIL\tIllinois\tBond County\t637\t41.4\t11.3\t12.5\t18300\t66250\t0.4117\t62086\tObama\t62086\t0.001142654\t62086.0\n4606\t-89.594389\t38.777373\tPierron village\tIL\tIllinois\tBond County\t685\t36.7\t11.2\t7.7\t19823\t104808\t0.4117\t62273\tObama\t62273\t0.001228757\t62273.0\n4607\t-89.342264\t38.895317\tSmithboro village\tIL\tIllinois\tBond County\t193\t41.2\t41.2\t8.4\t26297\t183333\t0.4117\t62284\tObama\t62284\t0.000346205\t62284.0\n4608\t-88.89047\t42.366903\tCaledonia village\tIL\tIllinois\tBoone County\t201\t32.3\t15.8\t15.4\t24881\t193750\t0.4626\t61011\tObama\t61011\t0.000360555\t61011.0\n4609\t-88.739648\t42.398421\tCapron village\tIL\tIllinois\tBoone County\t1284\t35.3\t8.9\t15.4\t23252\t166512\t0.4626\t61012\tObama\t61012\t0.002303247\t61012.0\n4610\t-88.844096\t42.35203\tPoplar Grove village\tIL\tIllinois\tBoone County\t2548\t37.3\t12.9\t15.9\t24105\t200772\t0.4626\t61065\tObama\t61065\t0.004570618\t61065.0\n4611\t-88.856678\t42.253479999999996\tBelvidere city\tIL\tIllinois\tBoone County\t25185\t34.4\t10.7\t21.3\t21663\t143249\t0.4626\t61008\tObama\t61008\t0.045177007000000005\t61008.0\n4612\t-88.862299\t42.334974\tTimberlane village\tIL\tIllinois\tBoone County\t515\t32.5\t15.9\t15.7\t24886\t193000\t0.4626\t61065\tObama\t61065\t0.00092381\t61065.0\n4613\t-90.637959\t40.025263\tRipley village\tIL\tIllinois\tBrown County\t101\t46.9\t18.2\t1.2\t22744\t88333\t0.3329\t62353\tObama\t62353\t0.000181174\t62353.0\n4614\t-90.763993\t39.985453\tMount Sterling city\tIL\tIllinois\tBrown County\t1877\t36.4\t12.0\t5.2\t18083\t67870\t0.3329\t62353\tObama\t62353\t0.0033669740000000004\t62353.0\n4615\t-90.658762\t39.884192\tVersailles village\tIL\tIllinois\tBrown County\t491\t43.4\t10.9\t10.5\t21686\t61786\t0.3329\t62378\tObama\t62378\t0.000880759\t62378.0\n4616\t-90.873801\t40.006434000000006\tMound Station village\tIL\tIllinois\tBrown County\t108\t42.5\t10.4\t2.3\t18474\t76000\t0.3329\t62375\tObama\t62375\t0.000193731\t62375.0\n4617\t-89.214303\t41.38205\tLadd village\tIL\tIllinois\tBureau County\t1248\t40.4\t15.9\t10.7\t24243\t109459\t0.4891\t61329\tObama\t61329\t0.00223867\t61329.0\n4618\t-89.737114\t41.357428000000006\tSheffield village\tIL\tIllinois\tBureau County\t999\t43.6\t19.3\t15.5\t23075\t78378\t0.4891\t61361\tObama\t61361\t0.0017920120000000002\t61361.0\n4619\t-89.248159\t41.471907\tArlington village\tIL\tIllinois\tBureau County\t208\t41.6\t11.3\t15.2\t19521\t108929\t0.4891\t61312\tObama\t61312\t0.000373112\t61312.0\n4620\t-89.29633100000001\t41.364889\tHollowayville village\tIL\tIllinois\tBureau County\t88\t42.1\t10.2\t15.1\t19672\t100000\t0.4891\t61359\tObama\t61359\t0.000157855\t61359.0\n4621\t-89.295345\t41.327253999999996\tDe Pue village\tIL\tIllinois\tBureau County\t1762\t33.2\t9.0\t16.9\t17372\t63909\t0.4891\t61322\tObama\t61322\t0.003160686\t61322.0\n4622\t-89.679106\t41.329106\tBuda village\tIL\tIllinois\tBureau County\t679\t37.0\t9.7\t14.3\t20687\t82143\t0.4891\t61314\tObama\t61314\t0.001217994\t61314.0\n4623\t-89.468455\t41.378097\tPrinceton city\tIL\tIllinois\tBureau County\t7350\t45.1\t25.3\t11.8\t27523\t133786\t0.4891\t61356\tObama\t61356\t0.013184475\t61356.0\n4624\t-89.836256\t41.382059999999996\tMineral village\tIL\tIllinois\tBureau County\t265\t43.5\t16.8\t13.8\t25805\t100000\t0.4891\t61344\tObama\t61344\t0.000475359\t61344.0\n4625\t-89.459878\t41.556236\tOhio village\tIL\tIllinois\tBureau County\t534\t42.0\t15.2\t9.3\t26750\t101563\t0.4891\t61349\tObama\t61349\t0.000957892\t61349.0\n4626\t-89.19931600000001\t41.326236\tSpring Valley city\tIL\tIllinois\tBureau County\t5291\t40.7\t21.2\t13.4\t24513\t109733\t0.4891\t61362\tObama\t61362\t0.009491028\t61362.0\n4627\t-89.159406\t41.356227000000004\tDalzell village\tIL\tIllinois\tBureau County\t690\t41.9\t17.1\t14.1\t24164\t130833\t0.4891\t61320\tObama\t61320\t0.001237726\t61320.0\n4628\t-89.273523\t41.364309000000006\tSeatonville village\tIL\tIllinois\tBureau County\t289\t45.9\t13.7\t16.4\t22747\t102976\t0.4891\t61359\tObama\t61359\t0.00051841\t61359.0\n4629\t-89.283173\t41.530125\tLa Moille village\tIL\tIllinois\tBureau County\t740\t39.7\t11.0\t11.4\t20714\t122768\t0.4891\t61330\tObama\t61330\t0.0013274170000000002\t61330.0\n4630\t-89.507824\t41.292561\tTiskilwa village\tIL\tIllinois\tBureau County\t742\t40.8\t11.9\t13.1\t19747\t104620\t0.4891\t61368\tObama\t61368\t0.001331004\t61368.0\n4631\t-89.718379\t41.511113\tNew Bedford village\tIL\tIllinois\tBureau County\t96\t40.7\t17.5\t10.4\t23828\t105357\t0.4891\t61346\tObama\t61346\t0.000172205\t61346.0\n4632\t-89.213652\t41.428303\tCherry village\tIL\tIllinois\tBureau County\t486\t42.6\t10.9\t14.2\t26217\t106250\t0.4891\t61317\tObama\t61317\t0.00087179\t61317.0\n4633\t-89.36985200000001\t41.424902\tMalden village\tIL\tIllinois\tBureau County\t323\t40.5\t23.9\t11.1\t22272\t116176\t0.4891\t61337\tObama\t61337\t0.000579399\t61337.0\n4634\t-89.395969\t41.434032\tDover village\tIL\tIllinois\tBureau County\t162\t40.5\t23.6\t10.6\t22263\t117188\t0.4891\t61323\tObama\t61323\t0.000290597\t61323.0\n4635\t-89.78948299999999\t41.296820000000004\tNeponset village\tIL\tIllinois\tBureau County\t496\t47.3\t17.4\t15.0\t21201\t82692\t0.4891\t61345\tObama\t61345\t0.000889728\t61345.0\n4636\t-89.583282\t41.360754\tWyanet village\tIL\tIllinois\tBureau County\t1084\t36.5\t8.6\t8.8\t22031\t98333\t0.4891\t61379\tObama\t61379\t0.001944486\t61379.0\n4637\t-89.364162\t41.287729999999996\tBureau Junction village\tIL\tIllinois\tBureau County\t348\t35.4\t11.5\t13.1\t20203\t82222\t0.4891\t61315\tObama\t61315\t0.000624245\t61315.0\n4638\t-89.668514\t41.455295\tManlius village\tIL\tIllinois\tBureau County\t334\t42.7\t10.4\t9.4\t24405\t102206\t0.4891\t61338\tObama\t61338\t0.000599131\t61338.0\n4639\t-89.590727\t41.556996999999996\tWalnut village\tIL\tIllinois\tBureau County\t1419\t42.0\t17.1\t9.7\t22973\t99808\t0.4891\t61376\tObama\t61376\t0.002545411\t61376.0\n4640\t-90.715249\t39.232748\tHamburg village\tIL\tIllinois\tCalhoun County\t123\t48.9\t12.6\t3.4\t20080\t101786\t0.4193\t62045\tObama\t62045\t0.000220638\t62045.0\n4641\t-90.624897\t39.158997\tHardin village\tIL\tIllinois\tCalhoun County\t940\t42.7\t13.2\t6.2\t17064\t86053\t0.4193\t62047\tObama\t62047\t0.001686178\t62047.0\n4642\t-90.612679\t39.297114\tKampsville village\tIL\tIllinois\tCalhoun County\t315\t44.3\t12.6\t23.0\t18270\t90769\t0.4193\t62053\tObama\t62053\t0.000565049\t62053.0\n4643\t-90.653339\t39.033109\tBatchtown village\tIL\tIllinois\tCalhoun County\t242\t40.3\t11.0\t10.9\t18909\t120536\t0.4193\t62006\tObama\t62006\t0.000434101\t62006.0\n4644\t-90.58868199999999\t38.948085\tBrussels village\tIL\tIllinois\tCalhoun County\t138\t44.8\t8.7\t11.1\t20876\t125000\t0.4193\t62013\tObama\t62013\t0.000247545\t62013.0\n4645\t-89.977301\t42.095546\tMount Carroll city\tIL\tIllinois\tCarroll County\t1692\t41.6\t13.7\t15.4\t19841\t98778\t0.4962\t61053\tObama\t61053\t0.00303512\t61053.0\n4646\t-89.88846600000001\t42.014303000000005\tChadwick village\tIL\tIllinois\tCarroll County\t459\t41.1\t15.8\t8.9\t23180\t88333\t0.4962\t61014\tObama\t61014\t0.0008233569999999999\t61014.0\n4647\t-90.13963100000001\t42.090531\tSavanna city\tIL\tIllinois\tCarroll County\t3250\t43.9\t14.1\t20.0\t20015\t64279\t0.4962\t61074\tObama\t61074\t0.00582987\t61074.0\n4648\t-89.7403\t42.15233\tShannon village\tIL\tIllinois\tCarroll County\t789\t46.5\t21.5\t7.5\t24920\t99844\t0.4962\t61078\tObama\t61078\t0.0014153129999999999\t61078.0\n4649\t-90.111237\t41.971506\tThomson village\tIL\tIllinois\tCarroll County\t576\t39.9\t13.8\t8.3\t24833\t98889\t0.4962\t61285\tObama\t61285\t0.001033232\t61285.0\n4650\t-89.832364\t42.102663\tLanark city\tIL\tIllinois\tCarroll County\t1502\t42.3\t14.3\t11.9\t20104\t92692\t0.4962\t61046\tObama\t61046\t0.002694297\t61046.0\n4651\t-89.77615300000001\t41.964509\tMilledgeville village\tIL\tIllinois\tCarroll County\t900\t41.6\t14.6\t6.8\t21846\t96944\t0.4962\t61051\tObama\t61051\t0.001614426\t61051.0\n4652\t-90.370503\t39.880392\tArenzville village\tIL\tIllinois\tCass County\t431\t43.7\t26.7\t3.7\t21999\t93750\t0.4223\t62611\tObama\t62611\t0.00077313\t62611.0\n4653\t-90.21148199999999\t39.949875\tVirginia city\tIL\tIllinois\tCass County\t1643\t44.6\t17.6\t5.8\t20415\t81818\t0.4223\t62691\tObama\t62691\t0.0029472229999999997\t62691.0\n4654\t-90.425448\t39.999235999999996\tBeardstown city\tIL\tIllinois\tCass County\t5732\t36.1\t11.1\t13.0\t16811\t60515\t0.4223\t62618\tObama\t62618\t0.010282096999999999\t62618.0\n4655\t-90.008016\t39.888518\tAshland village\tIL\tIllinois\tCass County\t1381\t40.7\t21.5\t7.4\t20950\t101355\t0.4223\t62612\tObama\t62612\t0.0024772460000000002\t62612.0\n4656\t-90.151324\t40.047179\tChandlerville village\tIL\tIllinois\tCass County\t703\t41.4\t13.7\t6.4\t19313\t64643\t0.4223\t62627\tObama\t62627\t0.001261046\t62627.0\n4657\t-88.037085\t40.113833\tSt. Joseph village\tIL\tIllinois\tChampaign County\t3022\t35.6\t31.8\t8.6\t28302\t157263\t0.5211\t61873\tObama\t61873\t0.005420881999999999\t61873.0\n4658\t-88.198792\t40.108655999999996\tUrbana city\tIL\tIllinois\tChampaign County\t40500\t24.6\t57.9\t10.2\t21000\t135684\t0.5211\t61801\tObama\t61801\t0.072649148\t61801.0\n4659\t-87.973478\t40.192509\tRoyal village\tIL\tIllinois\tChampaign County\t279\t45.6\t21.4\t7.5\t25169\t144318\t0.5211\t61871\tObama\t61871\t0.000500472\t61871.0\n4660\t-88.187392\t40.244023\tThomasboro village\tIL\tIllinois\tChampaign County\t1333\t36.9\t11.5\t11.7\t25017\t101310\t0.5211\t61878\tObama\t61878\t0.002391144\t61878.0\n4661\t-88.348488\t40.315595\tFisher village\tIL\tIllinois\tChampaign County\t1663\t27.1\t22.4\t7.2\t23385\t120427\t0.5211\t61843\tObama\t61843\t0.0029831\t61843.0\n4662\t-87.958516\t40.032289\tHomer village\tIL\tIllinois\tChampaign County\t1164\t41.3\t17.9\t11.1\t22670\t95500\t0.5211\t61849\tObama\t61849\t0.00208799\t61849.0\n4663\t-88.39299999999999\t40.186071000000005\tMahomet village\tIL\tIllinois\tChampaign County\t5774\t34.6\t41.9\t6.9\t28876\t177698\t0.5211\t61853\tObama\t61853\t0.010357436\t61853.0\n4664\t-88.1538\t40.302702000000004\tRantoul village\tIL\tIllinois\tChampaign County\t12015\t32.5\t19.3\t11.2\t23421\t104905\t0.5211\t61866\tObama\t61866\t0.02155258\t61866.0\n4665\t-88.072379\t40.024638\tSidney village\tIL\tIllinois\tChampaign County\t1082\t39.3\t23.3\t8.5\t27438\t131250\t0.5211\t61877\tObama\t61877\t0.001940898\t61877.0\n4666\t-88.274551\t39.912776\tPesotum village\tIL\tIllinois\tChampaign County\t542\t44.1\t22.1\t5.0\t28761\t112234\t0.5211\t61863\tObama\t61863\t0.000972243\t61863.0\n4667\t-88.126659\t40.386123\tLudlow village\tIL\tIllinois\tChampaign County\t328\t37.2\t12.0\t15.9\t21036\t59167\t0.5211\t60949\tObama\t60949\t0.000588368\t60949.0\n4668\t-88.266398\t40.115671999999996\tChampaign city\tIL\tIllinois\tChampaign County\t73325\t25.2\t48.3\t12.5\t23675\t134025\t0.5211\t61821\tObama\t61821\t0.131530833\t61821.0\n4669\t-87.956413\t40.115255\tOgden village\tIL\tIllinois\tChampaign County\t766\t34.8\t20.7\t6.2\t25675\t126190\t0.5211\t61859\tObama\t61859\t0.001374055\t61859.0\n4670\t-87.995871\t39.908383\tBroadlands village\tIL\tIllinois\tChampaign County\t306\t44.7\t23.0\t10.3\t20143\t97000\t0.5211\t61816\tObama\t61816\t0.000548905\t61816.0\n4671\t-88.367947\t40.112343\tBondville village\tIL\tIllinois\tChampaign County\t461\t36.0\t24.9\t5.7\t22827\t117083\t0.5211\t61815\tObama\t61815\t0.000826945\t61815.0\n4672\t-88.344627\t39.966626\tSadorus village\tIL\tIllinois\tChampaign County\t418\t40.4\t18.2\t5.9\t28165\t103000\t0.5211\t61872\tObama\t61872\t0.0007498110000000001\t61872.0\n4673\t-88.251928\t40.062217\tSavoy village\tIL\tIllinois\tChampaign County\t4920\t37.5\t62.0\t5.6\t38639\t227855\t0.5211\t61874\tObama\t61874\t0.008825526\t61874.0\n4674\t-88.428474\t40.360451\tFoosland village\tIL\tIllinois\tChampaign County\t90\t23.5\t18.4\t8.9\t21042\t110714\t0.5211\t61845\tObama\t61845\t0.000161443\t61845.0\n4675\t-88.45586\t39.945169\tIvesdale village\tIL\tIllinois\tChampaign County\t282\t41.0\t14.6\t6.2\t26761\t99615\t0.5211\t61851\tObama\t61851\t0.000505853\t61851.0\n4676\t-88.37174499999999\t40.206185999999995\tLake of the Woods CDP\tIL\tIllinois\tChampaign County\t3365\t32.6\t31.6\t6.0\t25916\t102155\t0.5211\t61853\tObama\t61853\t0.006036158000000001\t61853.0\n4677\t-88.263198\t39.988819\tTolono village\tIL\tIllinois\tChampaign County\t2935\t37.2\t23.8\t6.7\t26452\t121739\t0.5211\t61880\tObama\t61880\t0.005264820999999999\t61880.0\n4678\t-88.023537\t40.309248\tGifford village\tIL\tIllinois\tChampaign County\t859\t45.4\t18.2\t6.3\t25815\t127612\t0.5211\t61847\tObama\t61847\t0.001540879\t61847.0\n4679\t-88.157422\t40.003192\tPhilo village\tIL\tIllinois\tChampaign County\t1350\t39.5\t30.1\t6.8\t28731\t149265\t0.5211\t61864\tObama\t61864\t0.002421638\t61864.0\n4680\t-88.066136\t39.885873\tLongview village\tIL\tIllinois\tChampaign County\t147\t40.0\t27.4\t8.3\t23194\t129167\t0.5211\t61852\tObama\t61852\t0.000263689\t61852.0\n4681\t-89.449556\t39.588014\tTovey village\tIL\tIllinois\tChristian County\t479\t41.7\t9.2\t11.6\t19764\t92222\t0.3737\t62570\tObama\t62570\t0.000859233\t62570.0\n4682\t-89.080051\t39.387163\tPana city\tIL\tIllinois\tChristian County\t5341\t41.8\t7.5\t10.0\t18172\t67111\t0.3737\t62557\tObama\t62557\t0.009580718\t62557.0\n4683\t-89.415999\t39.587647\tKincaid village\tIL\tIllinois\tChristian County\t1362\t40.8\t6.0\t13.3\t18974\t69107\t0.3737\t62540\tObama\t62540\t0.002443164\t62540.0\n4684\t-89.192066\t39.638574\tStonington village\tIL\tIllinois\tChristian County\t911\t38.7\t11.7\t10.4\t18799\t75227\t0.3737\t62567\tObama\t62567\t0.001634157\t62567.0\n4685\t-89.389313\t39.657911999999996\tEdinburg village\tIL\tIllinois\tChristian County\t1204\t41.7\t11.7\t7.3\t23424\t102724\t0.3737\t62531\tObama\t62531\t0.002159743\t62531.0\n4686\t-89.407899\t39.458709000000006\tPalmer village\tIL\tIllinois\tChristian County\t240\t40.8\t6.3\t8.5\t22970\t100000\t0.3737\t62556\tObama\t62556\t0.00043051300000000004\t62556.0\n4687\t-89.26083\t39.764894\tMount Auburn village\tIL\tIllinois\tChristian County\t495\t45.4\t10.1\t7.4\t24605\t82500\t0.3737\t62547\tObama\t62547\t0.0008879339999999999\t62547.0\n4688\t-89.45834\t39.421319\tMorrisonville village\tIL\tIllinois\tChristian County\t989\t43.3\t11.9\t10.7\t20482\t89286\t0.3737\t62546\tObama\t62546\t0.0017740739999999998\t62546.0\n4689\t-89.048488\t39.517768\tAssumption city\tIL\tIllinois\tChristian County\t1206\t38.6\t10.1\t10.0\t20713\t66750\t0.3737\t62510\tObama\t62510\t0.00216333\t62510.0\n4690\t-89.194911\t39.481405\tOwaneco village\tIL\tIllinois\tChristian County\t251\t36.9\t7.6\t7.9\t19745\t105357\t0.3737\t62555\tObama\t62555\t0.000450245\t62555.0\n4691\t-89.425698\t39.591819\tBulpitt village\tIL\tIllinois\tChristian County\t194\t40.9\t6.3\t17.4\t20082\t76429\t0.3737\t62517\tObama\t62517\t0.000347998\t62517.0\n4692\t-89.407229\t39.576959\tJeisyville village\tIL\tIllinois\tChristian County\t136\t39.5\t5.6\t15.3\t20673\t86250\t0.3737\t62540\tObama\t62540\t0.00024395799999999998\t62540.0\n4693\t-89.278816\t39.55141\tTaylorville city\tIL\tIllinois\tChristian County\t11033\t41.1\t13.1\t10.7\t22004\t87660\t0.3737\t62568\tObama\t62568\t0.019791063\t62568.0\n4694\t-87.996634\t39.4554\tWestfield village\tIL\tIllinois\tClark County\t631\t41.4\t10.3\t11.5\t18597\t59324\t0.3296\t62474\tObama\t62474\t0.001131892\t62474.0\n4695\t-87.881046\t39.338621\tMartinsville city\tIL\tIllinois\tClark County\t1238\t42.2\t10.6\t13.2\t16999\t68333\t0.3296\t62442\tObama\t62442\t0.002220732\t62442.0\n4696\t-87.988625\t39.302873\tCasey city\tIL\tIllinois\tClark County\t2702\t41.6\t15.6\t13.1\t19782\t72616\t0.3296\t62420\tObama\t62420\t0.004846864\t62420.0\n4697\t-87.689704\t39.397452\tMarshall city\tIL\tIllinois\tClark County\t3660\t42.0\t18.7\t16.6\t23085\t97792\t0.3296\t62441\tObama\t62441\t0.00656533\t62441.0\n4698\t-88.35995\t38.764421999999996\tSailor Springs village\tIL\tIllinois\tClay County\t113\t41.6\t7.4\t18.5\t17524\t52500\t0.2681\t62879\tObama\t62879\t0.00020269999999999997\t62879.0\n4699\t-88.34796999999999\t38.685633\tClay City village\tIL\tIllinois\tClay County\t944\t42.4\t8.4\t13.4\t16118\t62115\t0.2681\t62824\tObama\t62824\t0.0016933529999999999\t62824.0\n4700\t-88.47637900000001\t38.668733\tFlora city\tIL\tIllinois\tClay County\t4800\t41.5\t13.1\t14.9\t18708\t70090\t0.2681\t62839\tObama\t62839\t0.008610269\t62839.0\n4701\t-88.63797\t38.636573999999996\tXenia village\tIL\tIllinois\tClay County\t498\t43.2\t15.1\t9.5\t20192\t81818\t0.2681\t62899\tObama\t62899\t0.000893315\t62899.0\n4702\t-88.627894\t38.834070000000004\tIola village\tIL\tIllinois\tClay County\t154\t36.5\t8.8\t15.2\t17226\t67500\t0.2681\t62426\tObama\t62426\t0.000276246\t62426.0\n4703\t-88.506725\t38.769662\tLouisville village\tIL\tIllinois\tClay County\t1000\t40.8\t12.9\t11.2\t16315\t65000\t0.2681\t62858\tObama\t62858\t0.001793806\t62858.0\n4704\t-89.291432\t38.605205\tHuey village\tIL\tIllinois\tClinton County\t226\t42.5\t9.4\t2.4\t22874\t83636\t0.3402\t62250\tObama\t62250\t0.00040539999999999993\t62250.0\n4705\t-89.609183\t38.614869\tAviston village\tIL\tIllinois\tClinton County\t1477\t39.7\t20.9\t6.3\t26402\t141159\t0.3402\t62216\tObama\t62216\t0.002649452\t62216.0\n4706\t-89.468034\t38.536842\tBartelso village\tIL\tIllinois\tClinton County\t639\t36.3\t13.4\t6.8\t24672\t149554\t0.3402\t62218\tObama\t62218\t0.001146242\t62218.0\n4707\t-89.523543\t38.612421000000005\tBreese city\tIL\tIllinois\tClinton County\t4018\t37.0\t22.9\t6.3\t26413\t140034\t0.3402\t62230\tObama\t62230\t0.0072075130000000005\t62230.0\n4708\t-89.541007\t38.554972\tGermantown village\tIL\tIllinois\tClinton County\t1061\t41.1\t10.6\t5.7\t23025\t125481\t0.3402\t62245\tObama\t62245\t0.0019032279999999999\t62245.0\n4709\t-89.276273\t38.745008\tKeyesport village\tIL\tIllinois\tClinton County\t506\t44.9\t12.2\t8.9\t20546\t90000\t0.3402\t62253\tObama\t62253\t0.000907666\t62253.0\n4710\t-89.370674\t38.621783\tCarlyle city\tIL\tIllinois\tClinton County\t3300\t41.5\t14.3\t12.4\t23844\t106250\t0.3402\t62231\tObama\t62231\t0.00591956\t62231.0\n4711\t-89.43417600000001\t38.605432\tBeckemeyer village\tIL\tIllinois\tClinton County\t1115\t33.4\t6.4\t11.6\t21064\t77742\t0.3402\t62219\tObama\t62219\t0.002000094\t62219.0\n4712\t-89.61658\t38.545574\tAlbers village\tIL\tIllinois\tClinton County\t957\t33.9\t16.7\t13.5\t22229\t149138\t0.3402\t62215\tObama\t62215\t0.001716672\t62215.0\n4713\t-89.696347\t38.536947\tNew Baden village\tIL\tIllinois\tClinton County\t3122\t39.2\t21.4\t9.2\t25259\t122258\t0.3402\t62265\tObama\t62265\t0.005600263\t62265.0\n4714\t-89.26359599999999\t38.539749\tHoffman village\tIL\tIllinois\tClinton County\t488\t39.4\t8.6\t7.1\t21603\t88571\t0.3402\t62250\tObama\t62250\t0.000875377\t62250.0\n4715\t-89.62469\t38.509415999999995\tDamiansville village\tIL\tIllinois\tClinton County\t382\t38.8\t14.2\t11.4\t25185\t128750\t0.3402\t62215\tObama\t62215\t0.000685234\t62215.0\n4716\t-89.680949\t38.606390000000005\tTrenton city\tIL\tIllinois\tClinton County\t2594\t41.6\t28.0\t6.7\t27625\t135211\t0.3402\t62293\tObama\t62293\t0.004653133\t62293.0\n4717\t-88.027152\t39.657663\tOakland city\tIL\tIllinois\tColes County\t900\t43.5\t16.6\t9.4\t19308\t77656\t0.4337\t61943\tObama\t61943\t0.001614426\t61943.0\n4718\t-88.31953399999999\t39.604564\tHumboldt village\tIL\tIllinois\tColes County\t505\t37.4\t15.9\t13.3\t22856\t91429\t0.4337\t61931\tObama\t61931\t0.000905872\t61931.0\n4719\t-88.365532\t39.476206\tMattoon city\tIL\tIllinois\tColes County\t17283\t39.8\t16.2\t12.5\t23296\t91262\t0.4337\t61938\tObama\t61938\t0.031002351\t61938.0\n4720\t-88.288761\t39.417794\tLerna village\tIL\tIllinois\tColes County\t379\t39.1\t26.0\t13.0\t29161\t146324\t0.4337\t62440\tObama\t62440\t0.000679853\t62440.0\n4721\t-88.176261\t39.484603\tCharleston city\tIL\tIllinois\tColes County\t21229\t25.2\t38.2\t13.4\t19133\t110524\t0.4337\t61920\tObama\t61920\t0.03808071\t61920.0\n4722\t-88.020267\t39.530508000000005\tAshmore village\tIL\tIllinois\tColes County\t755\t36.6\t18.7\t12.0\t20194\t83542\t0.4337\t61912\tObama\t61912\t0.0013543239999999998\t61912.0\n4723\t-87.547219\t41.567971\tLansing village\tIL\tIllinois\tCook County\t26832\t39.9\t22.2\t10.1\t27358\t143792\t0.74\t60438\tObama\t60438\t0.048131405999999995\t60438.0\n4724\t-87.772859\t41.818232\tStickney village\tIL\tIllinois\tCook County\t5966\t38.0\t11.3\t10.2\t24178\t171157\t0.74\t60402\tObama\t60402\t0.010701846999999999\t60402.0\n4725\t-87.970478\t42.007274\tElk Grove Village village\tIL\tIllinois\tCook County\t33497\t40.6\t36.7\t8.0\t32369\t238724\t0.74\t60007\tObama\t60007\t0.060087123\t60007.0\n4726\t-87.806648\t41.739866\tBridgeview village\tIL\tIllinois\tCook County\t15197\t39.2\t12.1\t9.1\t22459\t160744\t0.74\t60455\tObama\t60455\t0.027260472\t60455.0\n4727\t-87.54469\t41.637533000000005\tBurnham village\tIL\tIllinois\tCook County\t3990\t38.8\t15.8\t18.1\t19742\t108788\t0.74\t60633\tObama\t60633\t0.007157286\t60633.0\n4728\t-87.724363\t41.625431\tMidlothian village\tIL\tIllinois\tCook County\t13421\t36.2\t17.0\t12.1\t25017\t143606\t0.74\t60445\tObama\t60445\t0.024074672000000002\t60445.0\n4729\t-87.805419\t41.966251\tHarwood Heights village\tIL\tIllinois\tCook County\t8334\t45.4\t21.1\t8.0\t27400\t247582\t0.74\t60706\tObama\t60706\t0.01494958\t60706.0\n4730\t-87.63665300000001\t41.644110999999995\tRiverdale village\tIL\tIllinois\tCook County\t14623\t27.9\t14.8\t20.6\t17630\t104813\t0.74\t60827\tObama\t60827\t0.026230827\t60827.0\n4731\t-87.651901\t41.607558000000004\tHarvey city\tIL\tIllinois\tCook County\t26060\t29.3\t10.6\t23.8\t14986\t87024\t0.74\t60426\tObama\t60426\t0.046746587\t60426.0\n4732\t-87.79159200000001\t41.766939\tBedford Park village\tIL\tIllinois\tCook County\t515\t39.9\t16.5\t6.4\t25957\t168750\t0.74\t60501\tObama\t60501\t0.00092381\t60501.0\n4733\t-88.17549\t42.020794\tStreamwood village\tIL\tIllinois\tCook County\t35695\t35.0\t31.7\t8.9\t30622\t185746\t0.74\t60107\tObama\t60107\t0.06402990900000001\t60107.0\n4734\t-87.901211\t42.033695\tDes Plaines city\tIL\tIllinois\tCook County\t57350\t42.1\t30.1\t8.9\t28684\t225439\t0.74\t60016\tObama\t60016\t0.102874781\t60016.0\n4735\t-87.844073\t41.879762\tMaywood village\tIL\tIllinois\tCook County\t24967\t32.4\t13.4\t19.6\t18866\t135619\t0.74\t60153\tObama\t60153\t0.044785957\t60153.0\n4736\t-87.61543499999999\t41.543827\tGlenwood village\tIL\tIllinois\tCook County\t8603\t41.4\t31.5\t9.8\t29082\t144983\t0.74\t60425\tObama\t60425\t0.015432113999999999\t60425.0\n4737\t-87.742005\t42.106494\tWinnetka village\tIL\tIllinois\tCook County\t11947\t42.0\t87.4\t4.8\t81302\t923886\t0.74\t60093\tObama\t60093\t0.021430602000000003\t60093.0\n4738\t-88.180847\t42.170775\tBarrington Hills village\tIL\tIllinois\tCook County\t3749\t44.3\t65.0\t8.7\t69809\t768229\t0.74\t60010\tObama\t60010\t0.006724979\t60010.0\n4739\t-87.73290300000001\t42.005303000000005\tLincolnwood village\tIL\tIllinois\tCook County\t11762\t46.6\t54.7\t6.0\t41674\t384796\t0.74\t60712\tObama\t60712\t0.021098747999999997\t60712.0\n4740\t-87.780988\t41.807241\tForest View village\tIL\tIllinois\tCook County\t741\t44.4\t11.3\t9.7\t25939\t177296\t0.74\t60638\tObama\t60638\t0.00132921\t60638.0\n4741\t-87.982301\t42.153735\tArlington Heights village\tIL\tIllinois\tCook County\t74017\t42.2\t51.3\t6.8\t36807\t296656\t0.74\t60089\tObama\t60089\t0.13277214699999998\t60089.0\n4742\t-87.887454\t41.850853\tWestchester village\tIL\tIllinois\tCook County\t15988\t46.6\t36.7\t9.6\t34316\t225654\t0.74\t60154\tObama\t60154\t0.028679372\t60154.0\n4743\t-87.66712\t41.632954999999995\tDixmoor village\tIL\tIllinois\tCook County\t3636\t32.0\t10.6\t24.5\t16548\t29659\t0.74\t60469\tObama\t60469\t0.006522279000000001\t60469.0\n4744\t-87.864162\t41.902924\tMelrose Park village\tIL\tIllinois\tCook County\t23230\t31.7\t12.7\t12.1\t20495\t201430\t0.74\t60160\tObama\t60160\t0.041670116\t60160.0\n4745\t-87.728038\t42.077002\tWilmette village\tIL\tIllinois\tCook County\t26560\t45.0\t76.8\t6.7\t60333\t587672\t0.74\t60091\tObama\t60091\t0.04764349\t60091.0\n4746\t-87.752756\t41.713834999999996\tOak Lawn village\tIL\tIllinois\tCook County\t53474\t44.1\t25.3\t9.0\t28209\t188721\t0.74\t60453\tObama\t60453\t0.09592198800000001\t60453.0\n4747\t-87.76843000000001\t41.744493\tBurbank city\tIL\tIllinois\tCook County\t26802\t38.6\t12.1\t11.7\t23053\t174494\t0.74\t60459\tObama\t60459\t0.048077590999999996\t60459.0\n4748\t-87.936717\t42.065484999999995\tMount Prospect village\tIL\tIllinois\tCook County\t55720\t39.0\t40.6\t8.7\t29904\t269234\t0.74\t60056\tObama\t60056\t0.099950877\t60056.0\n4749\t-87.878804\t41.935789\tFranklin Park village\tIL\tIllinois\tCook County\t18814\t36.0\t14.5\t13.0\t21516\t186555\t0.74\t60131\tObama\t60131\t0.033748667999999996\t60131.0\n4750\t-87.608767\t41.475626\tSteger village\tIL\tIllinois\tCook County\t10106\t35.9\t12.5\t17.1\t25270\t135623\t0.74\t60475\tObama\t60475\t0.018128205\t60475.0\n4751\t-88.12711999999999\t42.160513\tBarrington village\tIL\tIllinois\tCook County\t10404\t42.1\t62.8\t8.4\t56775\t474377\t0.74\t60010\tObama\t60010\t0.018662758999999998\t60010.0\n4752\t-87.778797\t42.102224\tNorthfield village\tIL\tIllinois\tCook County\t5227\t46.7\t75.1\t6.4\t74629\t613270\t0.74\t60093\tObama\t60093\t0.009376225\t60093.0\n4753\t-87.83548499999999\t41.665078\tPalos Park village\tIL\tIllinois\tCook County\t5107\t51.3\t48.3\t6.2\t44628\t365217\t0.74\t60464\tObama\t60464\t0.009160968\t60464.0\n4754\t-87.860809\t41.608854\tOrland Park village\tIL\tIllinois\tCook County\t53030\t43.8\t36.8\t7.1\t35716\t261749\t0.74\t60462\tObama\t60462\t0.09512553800000001\t60462.0\n4755\t-87.871586\t41.988960999999996\tRosemont village\tIL\tIllinois\tCook County\t4041\t34.8\t20.9\t7.5\t22619\t304839\t0.74\t60018\tObama\t60018\t0.007248770999999999\t60018.0\n4756\t-87.693957\t42.046243\tEvanston city\tIL\tIllinois\tCook County\t74241\t33.2\t67.1\t10.4\t40087\t312228\t0.74\t60201\tObama\t60201\t0.13317396\t60201.0\n4757\t-87.597893\t41.628282\tDolton village\tIL\tIllinois\tCook County\t24414\t34.4\t19.2\t13.8\t21727\t117197\t0.74\t60419\tObama\t60419\t0.043793982\t60419.0\n4758\t-87.701203\t41.681058\tMerrionette Park village\tIL\tIllinois\tCook County\t1901\t39.3\t20.4\t9.8\t24475\t126274\t0.74\t60655\tObama\t60655\t0.003410025\t60655.0\n4759\t-87.707833\t41.643162\tRobbins village\tIL\tIllinois\tCook County\t6481\t33.4\t11.4\t29.1\t14054\t69868\t0.74\t60472\tObama\t60472\t0.011625657\t60472.0\n4760\t-87.81554200000001\t41.868299\tForest Park village\tIL\tIllinois\tCook County\t15324\t38.9\t42.1\t8.6\t31585\t161601\t0.74\t60130\tObama\t60130\t0.027488285\t60130.0\n4761\t-87.69104399999999\t41.600024\tMarkham city\tIL\tIllinois\tCook County\t12130\t34.1\t13.1\t21.3\t18303\t93468\t0.74\t60469\tObama\t60469\t0.021758867999999997\t60469.0\n4762\t-87.80988599999999\t42.027688\tNiles village\tIL\tIllinois\tCook County\t29381\t49.1\t30.3\t8.7\t28167\t260372\t0.74\t60714\tObama\t60714\t0.052703817\t60714.0\n4763\t-87.87410200000001\t41.807078000000004\tLa Grange village\tIL\tIllinois\tCook County\t15055\t40.1\t59.4\t9.8\t39974\t336252\t0.74\t60525\tObama\t60525\t0.027005751\t60525.0\n4764\t-87.55827\t41.613338\tCalumet City\tIL\tIllinois\tCook County\t37094\t34.4\t17.3\t14.9\t22805\t113215\t0.74\t60409\tObama\t60409\t0.066539444\t60409.0\n4765\t-87.779411\t41.703384\tChicago Ridge village\tIL\tIllinois\tCook County\t13589\t35.3\t16.6\t9.4\t26422\t152138\t0.74\t60415\tObama\t60415\t0.024376031\t60415.0\n4766\t-87.905253\t41.913781\tNorthlake city\tIL\tIllinois\tCook County\t11377\t36.8\t10.2\t9.4\t21609\t173121\t0.74\t60164\tObama\t60164\t0.020408132\t60164.0\n4767\t-87.759197\t41.844454\tCicero town\tIL\tIllinois\tCook County\t86702\t26.6\t8.4\t17.1\t14431\t150099\t0.74\t60804\tObama\t60804\t0.155526578\t60804.0\n4768\t-87.819144\t41.811963\tLyons village\tIL\tIllinois\tCook County\t9883\t36.7\t19.5\t14.6\t25848\t168516\t0.74\t60534\tObama\t60534\t0.017728186\t60534.0\n4769\t-87.739153\t41.645491\tCrestwood village\tIL\tIllinois\tCook County\t11406\t42.6\t19.1\t11.4\t28690\t159382\t0.74\t60445\tObama\t60445\t0.020460153000000002\t60445.0\n4770\t-87.819204\t41.894911\tRiver Forest village\tIL\tIllinois\tCook County\t11239\t39.0\t74.6\t5.2\t51560\t462227\t0.74\t60305\tObama\t60305\t0.020160587\t60305.0\n4771\t-88.153474\t42.068874\tHoffman Estates village\tIL\tIllinois\tCook County\t49971\t36.3\t41.7\t8.1\t32896\t227342\t0.74\t60195\tObama\t60195\t0.089638285\t60195.0\n4772\t-87.79084399999999\t41.843253999999995\tBerwyn city\tIL\tIllinois\tCook County\t52905\t34.7\t21.4\t12.1\t22949\t175429\t0.74\t60402\tObama\t60402\t0.09490131199999999\t60402.0\n4773\t-87.683525\t41.976787\tChicago city\tIL\tIllinois\tCook County\t2896795\t32.6\t30.0\t16.9\t25083\t187450\t0.74\t60640\tObama\t60640\t5.196288579\t60640.0\n4774\t-87.73110799999999\t41.731209\tHometown city\tIL\tIllinois\tCook County\t4234\t41.4\t10.7\t11.1\t25620\t123443\t0.74\t60456\tObama\t60456\t0.007594975\t60456.0\n4775\t-87.583457\t41.509439\tFord Heights village\tIL\tIllinois\tCook County\t2887\t21.3\t5.5\t41.0\t9897\t56310\t0.74\t60411\tObama\t60411\t0.005178718\t60411.0\n4776\t-87.739961\t42.035909000000004\tSkokie village\tIL\tIllinois\tCook County\t64056\t43.7\t48.3\t8.9\t31385\t277334\t0.74\t60076\tObama\t60076\t0.114904044\t60076.0\n4777\t-87.875119\t41.775316\tCountryside city\tIL\tIllinois\tCook County\t5813\t45.5\t28.6\t8.6\t29971\t208026\t0.74\t60525\tObama\t60525\t0.010427395\t60525.0\n4778\t-88.025124\t42.074843\tRolling Meadows city\tIL\tIllinois\tCook County\t24230\t37.2\t35.3\t7.3\t30499\t212037\t0.74\t60008\tObama\t60008\t0.043463922\t60008.0\n4779\t-87.826356\t41.698479\tPalos Hills city\tIL\tIllinois\tCook County\t16997\t44.5\t28.6\t8.2\t28848\t199022\t0.74\t60465\tObama\t60465\t0.030489323\t60465.0\n4780\t-87.85619399999999\t41.858268\tBroadview village\tIL\tIllinois\tCook County\t7720\t39.7\t20.2\t14.5\t25453\t151856\t0.74\t60155\tObama\t60155\t0.013848183\t60155.0\n4781\t-87.87231899999999\t41.830838\tLa Grange Park village\tIL\tIllinois\tCook County\t13206\t43.0\t47.5\t7.5\t34343\t276202\t0.74\t60526\tObama\t60526\t0.023689004\t60526.0\n4782\t-87.823095\t41.963642\tNorridge village\tIL\tIllinois\tCook County\t14300\t48.2\t19.5\t10.2\t27172\t263597\t0.74\t60706\tObama\t60706\t0.025651427\t60706.0\n4783\t-87.68549499999999\t41.539027000000004\tFlossmoor village\tIL\tIllinois\tCook County\t9102\t45.9\t62.8\t8.6\t47596\t264000\t0.74\t60422\tObama\t60422\t0.016327223000000002\t60422.0\n4784\t-87.837918\t41.924248999999996\tRiver Grove village\tIL\tIllinois\tCook County\t10179\t39.4\t17.9\t10.8\t23048\t184359\t0.74\t60171\tObama\t60171\t0.018259152\t60171.0\n4785\t-87.816928\t41.830919\tRiverside village\tIL\tIllinois\tCook County\t8485\t42.9\t56.4\t7.5\t39063\t339777\t0.74\t60546\tObama\t60546\t0.015220445\t60546.0\n4786\t-87.680886\t41.658225\tBlue Island city\tIL\tIllinois\tCook County\t22594\t31.1\t15.1\t15.0\t20254\t127752\t0.74\t60406\tObama\t60406\t0.040529255\t60406.0\n4787\t-87.843552\t42.012491\tPark Ridge city\tIL\tIllinois\tCook County\t36621\t45.5\t51.5\t6.5\t40779\t380788\t0.74\t60068\tObama\t60068\t0.065690974\t60068.0\n4788\t-87.795525\t41.66362\tPalos Heights city\tIL\tIllinois\tCook County\t11624\t50.2\t44.5\t7.1\t37704\t284308\t0.74\t60463\tObama\t60463\t0.020851202\t60463.0\n4789\t-87.636545\t41.510344\tChicago Heights city\tIL\tIllinois\tCook County\t30623\t31.8\t16.4\t18.8\t19084\t118742\t0.74\t60411\tObama\t60411\t0.054931725\t60411.0\n4790\t-87.835102\t42.129515000000005\tNorthbrook village\tIL\tIllinois\tCook County\t34445\t47.9\t66.3\t6.0\t55473\t465993\t0.74\t60062\tObama\t60062\t0.061787652\t60062.0\n4791\t-87.60217800000001\t41.597504\tSouth Holland village\tIL\tIllinois\tCook County\t21266\t43.0\t30.4\t12.1\t27678\t168545\t0.74\t60473\tObama\t60473\t0.038147081\t60473.0\n4792\t-87.714287\t42.088743\tKenilworth village\tIL\tIllinois\tCook County\t2372\t41.9\t91.2\t4.9\t90606\t1000001\t0.74\t60043\tObama\t60043\t0.004254908\t60043.0\n4793\t-87.789812\t41.887083000000004\tOak Park village\tIL\tIllinois\tCook County\t50371\t37.9\t67.4\t7.9\t42412\t274073\t0.74\t60301\tObama\t60301\t0.09035580800000001\t60301.0\n4794\t-87.898389\t41.872083\tHillside village\tIL\tIllinois\tCook County\t7831\t39.0\t23.1\t13.5\t25226\t174893\t0.74\t60162\tObama\t60162\t0.014047296\t60162.0\n4795\t-87.841245\t41.795815000000005\tMcCook village\tIL\tIllinois\tCook County\t235\t33.8\t8.6\t7.6\t19006\t24286\t0.74\t60534\tObama\t60534\t0.000421544\t60534.0\n4796\t-87.819473\t42.082041\tGlenview village\tIL\tIllinois\tCook County\t43712\t41.0\t59.2\t7.2\t45564\t387154\t0.74\t60025\tObama\t60025\t0.078410853\t60025.0\n4797\t-87.816209\t41.922384\tElmwood Park village\tIL\tIllinois\tCook County\t24703\t40.7\t23.8\t9.0\t26571\t224134\t0.74\t60707\tObama\t60707\t0.044312392\t60707.0\n4798\t-87.846932\t41.824526\tBrookfield village\tIL\tIllinois\tCook County\t18257\t40.6\t30.8\t9.0\t28972\t201558\t0.74\t60513\tObama\t60513\t0.032749518\t60513.0\n4799\t-87.91141800000001\t41.88916\tBerkeley village\tIL\tIllinois\tCook County\t4997\t41.4\t23.2\t13.0\t26874\t176996\t0.74\t60163\tObama\t60163\t0.008963649\t60163.0\n4800\t-87.90042700000001\t41.803834\tWestern Springs village\tIL\tIllinois\tCook County\t12506\t42.5\t70.7\t5.5\t51336\t435819\t0.74\t60558\tObama\t60558\t0.022433339\t60558.0\n4801\t-87.68565799999999\t41.628928\tPosen village\tIL\tIllinois\tCook County\t4856\t32.9\t11.0\t16.5\t22995\t117366\t0.74\t60469\tObama\t60469\t0.008710721999999999\t60469.0\n4802\t-87.685502\t41.486948\tPark Forest village\tIL\tIllinois\tCook County\t22633\t37.9\t31.1\t12.1\t26181\t106558\t0.74\t60466\tObama\t60466\t0.040599214\t60466.0\n4803\t-87.72384699999999\t41.563696\tCountry Club Hills city\tIL\tIllinois\tCook County\t15984\t37.7\t27.6\t14.7\t26618\t135613\t0.74\t60478\tObama\t60478\t0.028672197000000003\t60478.0\n4804\t-87.731043\t41.482384\tRichton Park village\tIL\tIllinois\tCook County\t12402\t34.8\t29.4\t12.0\t25039\t145112\t0.74\t60471\tObama\t60471\t0.022246783\t60471.0\n4805\t-87.701272\t41.721262\tEvergreen Park village\tIL\tIllinois\tCook County\t19747\t39.2\t33.0\t9.2\t27394\t171496\t0.74\t60805\tObama\t60805\t0.035422288999999996\t60805.0\n4806\t-87.657515\t41.664803000000006\tCalumet Park village\tIL\tIllinois\tCook County\t8201\t35.2\t16.7\t16.0\t22311\t114314\t0.74\t608HH\tObama\t608HH\t0.014711004\t0.0\n4807\t-87.788937\t42.042211\tMorton Grove village\tIL\tIllinois\tCook County\t22546\t46.1\t39.7\t6.5\t29780\t274541\t0.74\t60053\tObama\t60053\t0.040443152999999996\t60053.0\n4808\t-87.87615600000001\t41.882996999999996\tBellwood village\tIL\tIllinois\tCook County\t19180\t35.0\t15.2\t16.0\t21942\t146654\t0.74\t60104\tObama\t60104\t0.034405201\t60104.0\n4809\t-87.618454\t41.571005\tThornton village\tIL\tIllinois\tCook County\t2413\t46.3\t18.3\t8.1\t26487\t132136\t0.74\t60476\tObama\t60476\t0.004328454\t60476.0\n4810\t-87.883041\t41.734453\tWillow Springs village\tIL\tIllinois\tCook County\t5776\t43.7\t32.1\t9.3\t38669\t290931\t0.74\t60480\tObama\t60480\t0.010361024\t60480.0\n4811\t-87.926551\t42.103821\tProspect Heights city\tIL\tIllinois\tCook County\t16534\t38.1\t37.4\t8.4\t29941\t216260\t0.74\t60070\tObama\t60070\t0.02965879\t60070.0\n4812\t-88.100564\t42.115685\tInverness village\tIL\tIllinois\tCook County\t6779\t44.6\t62.1\t7.3\t65124\t488735\t0.74\t60195\tObama\t60195\t0.012160212\t60195.0\n4813\t-87.735843\t41.670257\tAlsip village\tIL\tIllinois\tCook County\t19124\t35.9\t16.7\t11.8\t26253\t170932\t0.74\t60803\tObama\t60803\t0.034304747999999996\t60803.0\n4814\t-87.880712\t41.903218\tStone Park village\tIL\tIllinois\tCook County\t5044\t27.1\t5.9\t15.4\t13613\t153977\t0.74\t60165\tObama\t60165\t0.009047958\t60165.0\n4815\t-87.753232\t41.60623\tOak Forest city\tIL\tIllinois\tCook County\t27802\t38.3\t26.6\t8.9\t27466\t189273\t0.74\t60452\tObama\t60452\t0.049871398\t60452.0\n4816\t-87.924359\t42.154118\tWheeling village\tIL\tIllinois\tCook County\t34925\t36.9\t37.2\t7.9\t29547\t198678\t0.74\t60090\tObama\t60090\t0.062648678\t60090.0\n4817\t-87.661079\t41.559157\tHomewood village\tIL\tIllinois\tCook County\t18840\t43.9\t45.7\t9.0\t30479\t162934\t0.74\t60430\tObama\t60430\t0.033795307000000004\t60430.0\n4818\t-87.738303\t41.508081\tMatteson village\tIL\tIllinois\tCook County\t14951\t39.6\t31.2\t10.1\t30783\t164745\t0.74\t60443\tObama\t60443\t0.026819195\t60443.0\n4819\t-87.7847\t42.058512\tGolf village\tIL\tIllinois\tCook County\t431\t44.3\t71.5\t4.9\t57842\t511364\t0.74\t60029\tObama\t60029\t0.00077313\t60029.0\n4820\t-87.764123\t42.134935\tGlencoe village\tIL\tIllinois\tCook County\t8497\t44.3\t83.5\t6.3\t84895\t844770\t0.74\t60022\tObama\t60022\t0.015241971000000002\t60022.0\n4821\t-87.814526\t41.787775\tSummit village\tIL\tIllinois\tCook County\t10467\t30.8\t10.0\t15.5\t17653\t143650\t0.74\t60501\tObama\t60501\t0.018775768999999998\t60501.0\n4822\t-87.825601\t41.84585\tNorth Riverside village\tIL\tIllinois\tCook County\t6534\t48.5\t29.1\t9.9\t28889\t194302\t0.74\t60546\tObama\t60546\t0.011720729\t60546.0\n4823\t-87.897743\t41.769001\tIndian Head Park village\tIL\tIllinois\tCook County\t3405\t57.4\t46.1\t7.0\t46435\t300442\t0.74\t60525\tObama\t60525\t0.00610791\t60525.0\n4824\t-87.637107\t41.483096\tSouth Chicago Heights village\tIL\tIllinois\tCook County\t3893\t39.7\t8.7\t11.7\t26365\t117829\t0.74\t60475\tObama\t60475\t0.0069832869999999995\t60475.0\n4825\t-87.63063199999999\t41.611686999999996\tPhoenix village\tIL\tIllinois\tCook County\t2014\t34.9\t10.1\t17.3\t17014\t84366\t0.74\t60426\tObama\t60426\t0.0036127259999999997\t60426.0\n4826\t-87.690081\t41.573049\tHazel Crest village\tIL\tIllinois\tCook County\t13969\t36.7\t28.1\t14.7\t24563\t123913\t0.74\t60429\tObama\t60429\t0.025057677999999996\t60429.0\n4827\t-88.08364399999999\t42.030928\tSchaumburg village\tIL\tIllinois\tCook County\t72047\t38.2\t43.1\t8.0\t34291\t215456\t0.74\t60193\tObama\t60193\t0.129238349\t60193.0\n4828\t-87.83458399999999\t41.749359999999996\tJustice village\tIL\tIllinois\tCook County\t12359\t32.6\t15.8\t11.1\t24796\t164324\t0.74\t60458\tObama\t60458\t0.02216965\t60458.0\n4829\t-87.650479\t41.575769\tEast Hazel Crest village\tIL\tIllinois\tCook County\t1499\t36.6\t17.1\t13.3\t22355\t124510\t0.74\t60430\tObama\t60430\t0.002688915\t60430.0\n4830\t-87.96218\t41.69325\tLemont village\tIL\tIllinois\tCook County\t14968\t41.2\t36.6\t9.6\t34949\t311508\t0.74\t60439\tObama\t60439\t0.02684969\t60439.0\n4831\t-87.791362\t41.687641\tWorth village\tIL\tIllinois\tCook County\t10495\t37.9\t14.7\t10.4\t25478\t162890\t0.74\t60482\tObama\t60482\t0.018825995\t60482.0\n4832\t-87.55784\t41.524473\tLynwood village\tIL\tIllinois\tCook County\t7425\t36.3\t24.4\t11.7\t29324\t142019\t0.74\t60438\tObama\t60438\t0.01331901\t60438.0\n4833\t-87.840562\t41.590537\tOrland Hills village\tIL\tIllinois\tCook County\t6637\t31.1\t21.6\t9.1\t24016\t210337\t0.74\t60462\tObama\t60462\t0.011905491\t60462.0\n4834\t-87.692389\t41.517436\tOlympia Fields village\tIL\tIllinois\tCook County\t4901\t47.5\t57.7\t12.5\t45186\t291667\t0.74\t60461\tObama\t60461\t0.008791444\t60461.0\n4835\t-88.04202\t42.117093\tPalatine village\tIL\tIllinois\tCook County\t66017\t36.9\t46.6\t8.0\t35652\t243725\t0.74\t60067\tObama\t60067\t0.118421698\t60067.0\n4836\t-87.802058\t41.573048\tTinley Park village\tIL\tIllinois\tCook County\t56439\t37.9\t29.3\t7.9\t30474\t216677\t0.74\t60477\tObama\t60477\t0.101240623\t60477.0\n4837\t-87.869223\t41.958362\tSchiller Park village\tIL\tIllinois\tCook County\t11449\t35.6\t18.5\t11.3\t22361\t210978\t0.74\t60176\tObama\t60176\t0.020537286000000002\t60176.0\n4838\t-87.86024300000001\t41.766597\tHodgkins village\tIL\tIllinois\tCook County\t1992\t35.1\t11.6\t8.0\t20059\t39038\t0.74\t60525\tObama\t60525\t0.0035732620000000002\t60525.0\n4839\t-88.154895\t42.087373\tSouth Barrington village\tIL\tIllinois\tCook County\t4170\t43.9\t66.1\t6.4\t78107\t834766\t0.74\t60195\tObama\t60195\t0.007480171\t60195.0\n4840\t-87.82803\t41.724837\tHickory Hills city\tIL\tIllinois\tCook County\t13828\t37.8\t25.0\t8.5\t27584\t211333\t0.74\t60457\tObama\t60457\t0.024804751\t60457.0\n4841\t-87.568694\t41.491145\tSauk Village village\tIL\tIllinois\tCook County\t9825\t31.8\t11.7\t14.8\t21289\t95978\t0.74\t60411\tObama\t60411\t0.017624145\t60411.0\n4842\t-87.83329599999999\t38.996717\tStoy village\tIL\tIllinois\tCrawford County\t115\t45.4\t14.0\t6.2\t21127\t95000\t0.332\t62449\tObama\t62449\t0.000206288\t62449.0\n4843\t-87.740604\t39.007321999999995\tRobinson city\tIL\tIllinois\tCrawford County\t6490\t41.0\t15.1\t9.4\t19902\t75607\t0.332\t62454\tObama\t62454\t0.011641802\t62454.0\n4844\t-87.611981\t39.001635\tPalestine village\tIL\tIllinois\tCrawford County\t1269\t41.3\t10.8\t10.5\t18898\t62444\t0.332\t62451\tObama\t62451\t0.00227634\t62451.0\n4845\t-87.908845\t39.001977000000004\tOblong village\tIL\tIllinois\tCrawford County\t1467\t43.3\t13.1\t8.9\t18143\t68725\t0.332\t62449\tObama\t62449\t0.002631514\t62449.0\n4846\t-87.6609\t39.108518\tHutsonville village\tIL\tIllinois\tCrawford County\t555\t45.6\t7.5\t8.4\t18479\t60385\t0.332\t62433\tObama\t62433\t0.000995562\t62433.0\n4847\t-87.673365\t38.903689\tFlat Rock village\tIL\tIllinois\tCrawford County\t421\t40.8\t7.5\t17.6\t15017\t58750\t0.332\t62427\tObama\t62427\t0.000755192\t62427.0\n4848\t-88.243075\t39.207753000000004\tJewett village\tIL\tIllinois\tCumberland County\t238\t37.8\t9.8\t15.3\t18174\t87500\t0.3099\t62436\tObama\t62436\t0.000426926\t62436.0\n4849\t-88.450987\t39.321887\tNeoga city\tIL\tIllinois\tCumberland County\t1674\t36.6\t16.6\t12.8\t19823\t100142\t0.3099\t62447\tObama\t62447\t0.0030028309999999996\t62447.0\n4850\t-88.159974\t39.248276000000004\tGreenup village\tIL\tIllinois\tCumberland County\t1496\t43.8\t10.4\t12.1\t19490\t84904\t0.3099\t62428\tObama\t62428\t0.0026835340000000004\t62428.0\n4851\t-88.242899\t39.273004\tToledo village\tIL\tIllinois\tCumberland County\t1192\t40.2\t12.0\t17.9\t20428\t92879\t0.3099\t62468\tObama\t62468\t0.002138217\t62468.0\n4852\t-88.64016\t41.771809000000005\tHinckley village\tIL\tIllinois\tDeKalb County\t2315\t39.3\t23.8\t6.8\t26021\t219250\t0.5161\t60520\tObama\t60520\t0.004152661\t60520.0\n4853\t-88.692369\t41.987398\tSycamore city\tIL\tIllinois\tDeKalb County\t15628\t37.0\t32.3\t8.0\t28575\t196124\t0.5161\t60178\tObama\t60178\t0.028033602\t60178.0\n4854\t-88.696483\t42.094244\tGenoa city\tIL\tIllinois\tDeKalb County\t4327\t32.9\t13.8\t12.1\t26571\t174143\t0.5161\t60135\tObama\t60135\t0.007761799000000001\t60135.0\n4855\t-88.93875799999999\t41.795491999999996\tLee village\tIL\tIllinois\tDeKalb County\t344\t38.3\t25.1\t6.5\t25278\t200000\t0.5161\t60530\tObama\t60530\t0.000617069\t60530.0\n4856\t-88.68031500000001\t41.63442\tSomonauk village\tIL\tIllinois\tDeKalb County\t1498\t34.3\t15.9\t11.3\t24344\t186218\t0.5161\t60552\tObama\t60552\t0.002687122\t60552.0\n4857\t-88.77159\t41.768828000000006\tWaterman village\tIL\tIllinois\tDeKalb County\t1469\t36.7\t21.5\t12.8\t24111\t185417\t0.5161\t60556\tObama\t60556\t0.002635101\t60556.0\n4858\t-88.704898\t41.930912\tCortland town\tIL\tIllinois\tDeKalb County\t3044\t32.9\t22.2\t7.1\t24878\t169048\t0.5161\t60112\tObama\t60112\t0.005460346\t60112.0\n4859\t-88.87651600000001\t41.765232\tShabbona village\tIL\tIllinois\tDeKalb County\t1074\t42.5\t15.1\t5.9\t25793\t168636\t0.5161\t60550\tObama\t60550\t0.001926548\t60550.0\n4860\t-88.582768\t41.64891\tSandwich city\tIL\tIllinois\tDeKalb County\t7180\t38.2\t14.0\t9.7\t25158\t184047\t0.5161\t60548\tObama\t60548\t0.012879528000000001\t60548.0\n4861\t-88.752432\t41.929564\tDeKalb city\tIL\tIllinois\tDeKalb County\t46401\t24.7\t42.5\t12.6\t21160\t191274\t0.5161\t60115\tObama\t60115\t0.083234397\t60115.0\n4862\t-88.754186\t42.098259000000006\tKingston village\tIL\tIllinois\tDeKalb County\t1014\t31.9\t18.2\t11.3\t25473\t185976\t0.5161\t60145\tObama\t60145\t0.001818919\t60145.0\n4863\t-88.853613\t42.090983\tKirkland village\tIL\tIllinois\tDeKalb County\t1322\t34.1\t19.8\t16.5\t22380\t158636\t0.5161\t60146\tObama\t60146\t0.0023714120000000003\t60146.0\n4864\t-88.862391\t41.930274\tMalta village\tIL\tIllinois\tDeKalb County\t1114\t40.2\t25.7\t9.2\t28391\t178409\t0.5161\t60150\tObama\t60150\t0.0019983\t60150.0\n4865\t-88.961999\t40.1497\tClinton city\tIL\tIllinois\tDe Witt County\t7051\t39.1\t12.7\t10.0\t25626\t98891\t0.3541\t61727\tObama\t61727\t0.012648127\t61727.0\n4866\t-88.64201899999999\t40.247088\tFarmer City\tIL\tIllinois\tDe Witt County\t2078\t42.1\t15.5\t8.9\t25927\t106071\t0.3541\t61842\tObama\t61842\t0.0037275290000000003\t61842.0\n4867\t-89.12464200000001\t40.241246000000004\tWaynesville village\tIL\tIllinois\tDe Witt County\t427\t40.0\t7.1\t10.6\t19864\t88571\t0.3541\t61778\tObama\t61778\t0.000765955\t61778.0\n4868\t-88.78570400000001\t40.184619\tDe Witt village\tIL\tIllinois\tDe Witt County\t186\t40.6\t26.0\t4.2\t26930\t162500\t0.3541\t61735\tObama\t61735\t0.00033364800000000003\t61735.0\n4869\t-89.085987\t40.097853\tKenney village\tIL\tIllinois\tDe Witt County\t363\t45.7\t11.6\t10.0\t26588\t88333\t0.3541\t61749\tObama\t61749\t0.000651152\t61749.0\n4870\t-88.750135\t40.121368\tWeldon village\tIL\tIllinois\tDe Witt County\t424\t42.2\t18.9\t13.2\t25329\t95667\t0.3541\t61882\tObama\t61882\t0.000760574\t61882.0\n4871\t-88.961484\t40.221957\tWapella village\tIL\tIllinois\tDe Witt County\t660\t39.6\t10.1\t8.3\t28667\t98704\t0.3541\t61777\tObama\t61777\t0.001183912\t61777.0\n4872\t-88.465272\t39.716468\tArthur village\tIL\tIllinois\tDouglas County\t2153\t38.6\t17.9\t3.9\t21823\t102446\t0.3077\t61911\tObama\t61911\t0.003862065\t61911.0\n4873\t-87.987779\t39.79721\tNewman city\tIL\tIllinois\tDouglas County\t1046\t45.5\t18.5\t8.9\t20726\t65147\t0.3077\t61942\tObama\t61942\t0.001876321\t61942.0\n4874\t-88.278626\t39.799427\tTuscola city\tIL\tIllinois\tDouglas County\t4399\t40.4\t21.5\t8.8\t24913\t112100\t0.3077\t61953\tObama\t61953\t0.007890953000000001\t61953.0\n4875\t-88.424611\t39.796926\tGarrett village\tIL\tIllinois\tDouglas County\t191\t34.5\t10.8\t7.1\t19884\t114286\t0.3077\t61913\tObama\t61913\t0.000342617\t61913.0\n4876\t-88.15995500000001\t39.864490999999994\tVilla Grove city\tIL\tIllinois\tDouglas County\t2390\t38.5\t13.2\t9.1\t21201\t90353\t0.3077\t61956\tObama\t61956\t0.004287197\t61956.0\n4877\t-88.134693\t39.684789\tHindsboro village\tIL\tIllinois\tDouglas County\t334\t42.8\t29.9\t7.5\t18122\t83333\t0.3077\t61930\tObama\t61930\t0.000599131\t61930.0\n4878\t-88.303336\t39.684862\tArcola city\tIL\tIllinois\tDouglas County\t2523\t39.2\t18.4\t7.9\t20237\t103017\t0.3077\t61910\tObama\t61910\t0.004525773\t61910.0\n4879\t-88.167079\t39.799013\tCamargo village\tIL\tIllinois\tDouglas County\t501\t43.2\t17.0\t5.4\t25174\t135096\t0.3077\t61919\tObama\t61919\t0.000898697\t61919.0\n4880\t-88.108213\t41.856093\tWheaton city\tIL\tIllinois\tDuPage County\t55966\t37.7\t60.6\t8.0\t42253\t280680\t0.4973\t60187\tObama\t60187\t0.10039215300000001\t60187.0\n4881\t-87.974063\t41.795483000000004\tWestmont village\tIL\tIllinois\tDuPage County\t25576\t38.4\t43.0\t11.9\t37231\t236069\t0.4973\t60559\tObama\t60559\t0.045878385\t60559.0\n4882\t-88.07839399999999\t41.919795\tGlendale Heights village\tIL\tIllinois\tDuPage County\t32394\t32.7\t29.7\t11.7\t27691\t187057\t0.4973\t60139\tObama\t60139\t0.058108555\t60139.0\n4883\t-87.90803000000001\t41.756417\tBurr Ridge village\tIL\tIllinois\tDuPage County\t10913\t47.6\t56.7\t6.2\t64920\t525308\t0.4973\t60521\tObama\t60521\t0.019575806\t60521.0\n4884\t-88.01126500000001\t41.743207\tWoodridge village\tIL\tIllinois\tDuPage County\t33859\t35.1\t44.0\t8.8\t36397\t219094\t0.4973\t60516\tObama\t60516\t0.060736480999999995\t60516.0\n4885\t-88.186159\t41.821172999999995\tWarrenville city\tIL\tIllinois\tDuPage County\t13552\t36.0\t44.6\t7.5\t33580\t191774\t0.4973\t60555\tObama\t60555\t0.02430966\t60555.0\n4886\t-88.143637\t42.001294\tHanover Park village\tIL\tIllinois\tDuPage County\t39075\t32.1\t26.7\t10.1\t25578\t187224\t0.4973\t60103\tObama\t60103\t0.070092974\t60103.0\n4887\t-87.94528000000001\t41.76388\tWillowbrook village\tIL\tIllinois\tDuPage County\t9031\t45.8\t49.8\t8.8\t48934\t213539\t0.4973\t60521\tObama\t60521\t0.016199863000000002\t60521.0\n4888\t-88.01492900000001\t41.874613000000004\tLombard village\tIL\tIllinois\tDuPage County\t43337\t39.5\t39.1\t10.3\t35011\t216187\t0.4973\t60148\tObama\t60148\t0.07773817599999999\t60148.0\n4889\t-88.13085600000001\t41.918713000000004\tCarol Stream village\tIL\tIllinois\tDuPage County\t41828\t32.9\t35.5\t9.5\t30921\t218500\t0.4973\t60188\tObama\t60188\t0.075031322\t60188.0\n4890\t-88.017186\t41.79518\tDowners Grove village\tIL\tIllinois\tDuPage County\t48380\t41.7\t49.1\t7.6\t37855\t251161\t0.4973\t60515\tObama\t60515\t0.08678434\t60515.0\n4891\t-87.919282\t41.958608\tBensenville village\tIL\tIllinois\tDuPage County\t20414\t34.0\t21.6\t11.8\t25046\t200669\t0.4973\t60106\tObama\t60106\t0.036618758\t60106.0\n4892\t-88.156847\t41.771281\tNaperville city\tIL\tIllinois\tDuPage County\t142658\t36.0\t62.4\t8.1\t44593\t337141\t0.4973\t60540\tObama\t60540\t0.255900792\t60540.0\n4893\t-87.977979\t41.886437\tVilla Park village\tIL\tIllinois\tDuPage County\t22532\t37.5\t27.4\t10.5\t29000\t204378\t0.4973\t60181\tObama\t60181\t0.040418038999999996\t60181.0\n4894\t-88.00837\t41.931403\tAddison village\tIL\tIllinois\tDuPage County\t37530\t34.2\t21.4\t11.4\t27130\t221472\t0.4973\t60101\tObama\t60101\t0.067321543\t60101.0\n4895\t-87.919685\t41.859902000000005\tOak Brook village\tIL\tIllinois\tDuPage County\t8701\t54.1\t56.8\t8.3\t70023\t709685\t0.4973\t60162\tObama\t60162\t0.015607906999999999\t60162.0\n4896\t-87.98243000000001\t41.744915999999996\tDarien city\tIL\tIllinois\tDuPage County\t23018\t43.9\t45.4\t8.3\t41480\t274495\t0.4973\t60561\tObama\t60561\t0.041289829\t60561.0\n4897\t-88.151984\t41.875932\tWinfield village\tIL\tIllinois\tDuPage County\t8931\t39.3\t46.0\t7.0\t40559\t264826\t0.4973\t60190\tObama\t60190\t0.016020482\t60190.0\n4898\t-88.239189\t41.954543\tWayne village\tIL\tIllinois\tDuPage County\t2689\t39.0\t57.0\t6.5\t56300\t429268\t0.4973\t60184\tObama\t60184\t0.004823545\t60184.0\n4899\t-87.956913\t41.798660999999996\tClarendon Hills village\tIL\tIllinois\tDuPage County\t7964\t38.0\t66.5\t5.0\t50412\t413728\t0.4973\t60514\tObama\t60514\t0.014285872\t60514.0\n4900\t-88.197164\t41.998469\tBartlett village\tIL\tIllinois\tDuPage County\t38430\t34.5\t42.1\t7.3\t38523\t254820\t0.4973\t60103\tObama\t60103\t0.068935969\t60103.0\n4901\t-88.0634\t41.866886\tGlen Ellyn village\tIL\tIllinois\tDuPage County\t27912\t39.3\t60.8\t7.3\t45120\t330789\t0.4973\t60137\tObama\t60137\t0.050068716\t60137.0\n4902\t-87.919467\t41.897822\tElmhurst city\tIL\tIllinois\tDuPage County\t42648\t41.0\t49.0\t8.4\t39027\t280658\t0.4973\t60163\tObama\t60163\t0.076502243\t60163.0\n4903\t-88.074247\t41.994668\tRoselle village\tIL\tIllinois\tDuPage County\t23298\t38.2\t36.1\t8.1\t34282\t221503\t0.4973\t60172\tObama\t60172\t0.041792095\t60172.0\n4904\t-88.089031\t41.949476000000004\tBloomingdale village\tIL\tIllinois\tDuPage County\t22189\t40.1\t37.8\t10.7\t36829\t268681\t0.4973\t60108\tObama\t60108\t0.039802764\t60108.0\n4905\t-87.981042\t41.96678\tWood Dale city\tIL\tIllinois\tDuPage County\t13917\t41.6\t22.8\t11.3\t31999\t222663\t0.4973\t60191\tObama\t60191\t0.0249644\t60191.0\n4906\t-87.974027\t41.853743\tOakbrook Terrace city\tIL\tIllinois\tDuPage County\t2360\t45.8\t39.9\t11.4\t45784\t219242\t0.4973\t60523\tObama\t60523\t0.004233382\t60523.0\n4907\t-88.08779799999999\t41.792604\tLisle village\tIL\tIllinois\tDuPage County\t22927\t35.1\t52.8\t7.6\t43260\t262432\t0.4973\t60532\tObama\t60532\t0.041126592999999996\t60532.0\n4908\t-88.231061\t41.894745\tWest Chicago city\tIL\tIllinois\tDuPage County\t27374\t30.8\t27.3\t10.1\t28480\t227098\t0.4973\t60185\tObama\t60185\t0.049103649000000006\t60185.0\n4909\t-87.913246\t41.801706\tHinsdale village\tIL\tIllinois\tDuPage County\t17386\t40.6\t73.2\t7.8\t66982\t688251\t0.4973\t60558\tObama\t60558\t0.031187113\t60558.0\n4910\t-88.018098\t41.977313\tItasca village\tIL\tIllinois\tDuPage County\t8570\t40.9\t35.4\t12.7\t42011\t266000\t0.4973\t60143\tObama\t60143\t0.015372918000000001\t60143.0\n4911\t-87.939442\t39.554445\tKansas village\tIL\tIllinois\tEdgar County\t749\t41.4\t16.9\t14.5\t15495\t68636\t0.32799999999999996\t61933\tObama\t61933\t0.001343561\t61933.0\n4912\t-87.675156\t39.804726\tChrisman city\tIL\tIllinois\tEdgar County\t1230\t44.6\t17.5\t7.9\t20263\t75897\t0.32799999999999996\t61924\tObama\t61924\t0.0022063820000000002\t61924.0\n4913\t-87.808015\t39.799945\tMetcalf village\tIL\tIllinois\tEdgar County\t227\t43.3\t19.6\t10.1\t22446\t66250\t0.32799999999999996\t61940\tObama\t61940\t0.000407194\t61940.0\n4914\t-87.933479\t39.715471\tBrocton village\tIL\tIllinois\tEdgar County\t315\t45.6\t12.7\t13.7\t19228\t60000\t0.32799999999999996\t61917\tObama\t61917\t0.000565049\t61917.0\n4915\t-87.587749\t39.580027\tVermilion village\tIL\tIllinois\tEdgar County\t226\t44.2\t17.3\t12.6\t23668\t96250\t0.32799999999999996\t61944\tObama\t61944\t0.00040539999999999993\t61944.0\n4916\t-87.869127\t39.798579\tHume village\tIL\tIllinois\tEdgar County\t407\t43.8\t19.7\t10.1\t22449\t69444\t0.32799999999999996\t61932\tObama\t61932\t0.0007300789999999999\t61932.0\n4917\t-87.861467\t39.644843\tRedmon village\tIL\tIllinois\tEdgar County\t195\t45.4\t12.8\t13.6\t19198\t60000\t0.32799999999999996\t61949\tObama\t61949\t0.000349792\t61949.0\n4918\t-87.691835\t39.61505\tParis city\tIL\tIllinois\tEdgar County\t8525\t39.8\t15.1\t9.8\t21313\t70611\t0.32799999999999996\t61944\tObama\t61944\t0.015292196999999999\t61944.0\n4919\t-88.00897900000001\t38.519681\tWest Salem village\tIL\tIllinois\tEdwards County\t975\t42.7\t9.3\t9.2\t19361\t60645\t0.2336\t62476\tObama\t62476\t0.001748961\t62476.0\n4920\t-87.983153\t38.377562\tBrowns village\tIL\tIllinois\tEdwards County\t180\t45.2\t13.1\t7.0\t23293\t81250\t0.2336\t62818\tObama\t62818\t0.000322885\t62818.0\n4921\t-87.997473\t38.444798\tBone Gap village\tIL\tIllinois\tEdwards County\t260\t38.6\t15.9\t7.5\t19108\t66250\t0.2336\t62815\tObama\t62815\t0.00046639\t62815.0\n4922\t-88.05811800000001\t38.376778\tAlbion city\tIL\tIllinois\tEdwards County\t1807\t44.2\t9.3\t7.5\t17881\t57734\t0.2336\t62806\tObama\t62806\t0.003241408\t62806.0\n4923\t-88.37465\t39.173037\tMontrose village\tIL\tIllinois\tEffingham County\t296\t34.6\t14.5\t7.4\t19080\t128125\t0.2324\t62445\tObama\t62445\t0.0005309669999999999\t62445.0\n4924\t-88.652991\t39.183527000000005\tShumway village\tIL\tIllinois\tEffingham County\t240\t39.1\t17.8\t14.2\t21591\t139063\t0.2324\t62461\tObama\t62461\t0.00043051300000000004\t62461.0\n4925\t-88.66412\t38.92215\tEdgewood village\tIL\tIllinois\tEffingham County\t531\t37.6\t6.0\t12.0\t17185\t58824\t0.2324\t62426\tObama\t62426\t0.0009525110000000001\t62426.0\n4926\t-88.62598299999999\t38.952688\tMason town\tIL\tIllinois\tEffingham County\t399\t37.6\t5.7\t12.3\t17182\t58182\t0.2324\t62443\tObama\t62443\t0.0007157289999999999\t62443.0\n4927\t-88.787591\t39.186554\tBeecher City village\tIL\tIllinois\tEffingham County\t535\t36.0\t13.4\t14.0\t15988\t79091\t0.2324\t62414\tObama\t62414\t0.0009596860000000001\t62414.0\n4928\t-88.74759\t39.057109000000004\tAltamont city\tIL\tIllinois\tEffingham County\t2264\t38.8\t15.2\t9.5\t20495\t90682\t0.2324\t62411\tObama\t62411\t0.004061177\t62411.0\n4929\t-88.55089100000001\t39.119396\tEffingham city\tIL\tIllinois\tEffingham County\t11708\t38.3\t20.4\t11.4\t23505\t122989\t0.2324\t62401\tObama\t62401\t0.021001882000000003\t62401.0\n4930\t-88.568223\t39.025490999999995\tWatson village\tIL\tIllinois\tEffingham County\t732\t36.0\t8.2\t9.7\t19121\t101838\t0.2324\t62473\tObama\t62473\t0.001313066\t62473.0\n4931\t-88.38283\t39.059549\tDieterich village\tIL\tIllinois\tEffingham County\t602\t31.6\t12.8\t3.6\t20013\t113306\t0.2324\t62424\tObama\t62424\t0.001079871\t62424.0\n4932\t-88.481358\t39.131503\tTeutopolis village\tIL\tIllinois\tEffingham County\t1613\t36.2\t23.9\t4.1\t25561\t141667\t0.2324\t62467\tObama\t62467\t0.0028934090000000004\t62467.0\n4933\t-89.213728\t39.112221999999996\tBingham village\tIL\tIllinois\tFayette County\t111\t39.6\t17.6\t10.2\t19255\t96667\t0.318\t62011\tObama\t62011\t0.00019911200000000001\t62011.0\n4934\t-88.850887\t39.022758\tSt. Elmo city\tIL\tIllinois\tFayette County\t1378\t39.6\t11.0\t14.7\t16585\t69625\t0.318\t62458\tObama\t62458\t0.002471865\t62458.0\n4935\t-88.776579\t38.833383000000005\tFarina village\tIL\tIllinois\tFayette County\t521\t45.7\t11.0\t20.7\t19870\t57647\t0.318\t62838\tObama\t62838\t0.0009345730000000001\t62838.0\n4936\t-88.850821\t38.867425\tSt. Peter village\tIL\tIllinois\tFayette County\t358\t44.0\t11.2\t5.0\t18640\t72727\t0.318\t62880\tObama\t62880\t0.0006421830000000001\t62880.0\n4937\t-88.953982\t38.995948999999996\tBrownstown village\tIL\tIllinois\tFayette County\t778\t39.9\t14.2\t16.2\t16788\t69032\t0.318\t62418\tObama\t62418\t0.0013955810000000001\t62418.0\n4938\t-89.110488\t39.144259999999996\tRamsey village\tIL\tIllinois\tFayette County\t1038\t39.5\t9.8\t12.9\t15221\t63571\t0.318\t62080\tObama\t62080\t0.001861971\t62080.0\n4939\t-89.101448\t38.979349\tVandalia city\tIL\tIllinois\tFayette County\t6532\t37.2\t13.3\t11.4\t19216\t85543\t0.318\t62471\tObama\t62471\t0.011717142\t62471.0\n4940\t-88.379125\t40.5878\tSibley village\tIL\tIllinois\tFord County\t322\t38.8\t8.8\t7.1\t21330\t68125\t0.2757\t61773\tObama\t61773\t0.000577606\t61773.0\n4941\t-88.276662\t40.466384999999995\tElliott village\tIL\tIllinois\tFord County\t321\t41.0\t17.6\t6.0\t22758\t117763\t0.2757\t60933\tObama\t60933\t0.000575812\t60933.0\n4942\t-88.378709\t40.466046\tGibson city\tIL\tIllinois\tFord County\t3296\t44.5\t15.1\t13.0\t22906\t109375\t0.2757\t60936\tObama\t60936\t0.005912385\t60936.0\n4943\t-88.246876\t40.57119\tMelvin village\tIL\tIllinois\tFord County\t477\t38.0\t17.3\t6.5\t21446\t72500\t0.2757\t60952\tObama\t60952\t0.000855646\t60952.0\n4944\t-88.09950699999999\t40.457693\tPaxton city\tIL\tIllinois\tFord County\t4460\t40.4\t13.7\t10.1\t22259\t107639\t0.2757\t60957\tObama\t60957\t0.008000375\t60957.0\n4945\t-88.20411899999999\t40.997398\tCabery village\tIL\tIllinois\tFord County\t265\t35.8\t19.9\t12.5\t22075\t123077\t0.2757\t60919\tObama\t60919\t0.000475359\t60919.0\n4946\t-88.18425699999999\t40.614706\tRoberts village\tIL\tIllinois\tFord County\t409\t43.0\t14.2\t7.7\t21777\t96875\t0.2757\t60962\tObama\t60962\t0.000733667\t60962.0\n4947\t-88.235416\t40.935365999999995\tKempton village\tIL\tIllinois\tFord County\t230\t33.9\t24.5\t11.5\t19775\t118056\t0.2757\t60946\tObama\t60946\t0.000412575\t60946.0\n4948\t-88.188734\t40.755947\tPiper City village\tIL\tIllinois\tFord County\t760\t46.2\t13.0\t11.2\t18558\t109000\t0.2757\t60959\tObama\t60959\t0.0013632929999999998\t60959.0\n4949\t-89.01517\t37.980751\tBuckner village\tIL\tIllinois\tFranklin County\t554\t44.1\t7.9\t16.3\t17026\t39318\t0.4049\t62819\tObama\t62819\t0.000993769\t62819.0\n4950\t-89.050889\t38.090432\tSesser city\tIL\tIllinois\tFranklin County\t2155\t39.9\t12.2\t16.5\t17635\t65735\t0.4049\t62884\tObama\t62884\t0.0038656520000000002\t62884.0\n4951\t-89.114205\t37.877520000000004\tRoyalton village\tIL\tIllinois\tFranklin County\t1129\t43.0\t10.9\t19.3\t14890\t54811\t0.4049\t62983\tObama\t62983\t0.0020252070000000002\t62983.0\n4952\t-88.762194\t37.914642\tThompsonville village\tIL\tIllinois\tFranklin County\t588\t42.2\t10.7\t19.1\t18073\t84688\t0.4049\t62890\tObama\t62890\t0.001054758\t62890.0\n4953\t-89.06345400000001\t37.99175\tNorth City village\tIL\tIllinois\tFranklin County\t635\t43.7\t14.1\t12.5\t18130\t61071\t0.4049\t62825\tObama\t62825\t0.001139067\t62825.0\n4954\t-88.835658\t37.957945\tHanaford village\tIL\tIllinois\tFranklin County\t228\t35.0\t16.9\t12.0\t16960\t88000\t0.4049\t62890\tObama\t62890\t0.00040898800000000005\t62890.0\n4955\t-88.977362\t37.917638000000004\tOrient city\tIL\tIllinois\tFranklin County\t297\t42.0\t9.8\t17.8\t14655\t48000\t0.4049\t62874\tObama\t62874\t0.00053276\t62874.0\n4956\t-88.92943100000001\t37.900358000000004\tWest Frankfort city\tIL\tIllinois\tFranklin County\t7881\t42.4\t13.9\t15.3\t17293\t61323\t0.4049\t62896\tObama\t62896\t0.014136986\t62896.0\n4957\t-88.852834\t38.088874\tEwing village\tIL\tIllinois\tFranklin County\t347\t39.0\t11.9\t11.5\t16678\t86111\t0.4049\t62836\tObama\t62836\t0.000622451\t62836.0\n4958\t-89.051864\t37.970455\tChristopher city\tIL\tIllinois\tFranklin County\t2758\t43.9\t14.0\t15.1\t17866\t54024\t0.4049\t62822\tObama\t62822\t0.004947317\t62822.0\n4959\t-88.947176\t37.996192\tWest City village\tIL\tIllinois\tFranklin County\t709\t43.1\t10.0\t17.0\t13100\t52143\t0.4049\t62812\tObama\t62812\t0.001271809\t62812.0\n4960\t-88.91982900000001\t38.002001\tBenton city\tIL\tIllinois\tFranklin County\t6969\t44.4\t16.7\t14.5\t18243\t71763\t0.4049\t62812\tObama\t62812\t0.012501035\t62812.0\n4961\t-89.04383399999999\t38.017565000000005\tValier village\tIL\tIllinois\tFranklin County\t668\t43.0\t12.6\t18.8\t17031\t76154\t0.4049\t62891\tObama\t62891\t0.001198262\t62891.0\n4962\t-89.052367\t37.900478\tZeigler city\tIL\tIllinois\tFranklin County\t1700\t41.6\t11.3\t21.5\t16060\t48043\t0.4049\t62999\tObama\t62999\t0.00304947\t62999.0\n4963\t-90.356578\t40.227992\tAstoria village\tIL\tIllinois\tFulton County\t1236\t43.4\t12.5\t14.2\t16299\t53980\t0.5423\t61501\tObama\t61501\t0.002217144\t61501.0\n4964\t-90.2947\t40.474447999999995\tSmithfield village\tIL\tIllinois\tFulton County\t226\t42.9\t11.6\t9.1\t21319\t92000\t0.5423\t61477\tObama\t61477\t0.00040539999999999993\t61477.0\n4965\t-90.258813\t40.715508\tLondon Mills village\tIL\tIllinois\tFulton County\t414\t40.9\t15.4\t16.2\t18882\t79333\t0.5423\t61544\tObama\t61544\t0.0007426360000000001\t61544.0\n4966\t-89.90955500000001\t40.513852\tBanner village\tIL\tIllinois\tFulton County\t140\t46.1\t7.5\t17.4\t19811\t76250\t0.5423\t61533\tObama\t61533\t0.000251133\t61533.0\n4967\t-90.184437\t40.648588000000004\tFairview village\tIL\tIllinois\tFulton County\t517\t44.0\t17.6\t12.5\t18291\t81818\t0.5423\t61432\tObama\t61432\t0.0009273980000000001\t61432.0\n4968\t-90.03209100000001\t40.491458\tDunfermline village\tIL\tIllinois\tFulton County\t245\t42.4\t4.6\t12.1\t19484\t70000\t0.5423\t61524\tObama\t61524\t0.000439482\t61524.0\n4969\t-90.434988\t40.661695\tAvon village\tIL\tIllinois\tFulton County\t867\t42.3\t12.6\t9.8\t21013\t65781\t0.5423\t61415\tObama\t61415\t0.00155523\t61415.0\n4970\t-90.09493\t40.465602000000004\tBryant village\tIL\tIllinois\tFulton County\t242\t40.8\t5.3\t15.3\t19800\t81000\t0.5423\t61519\tObama\t61519\t0.000434101\t61519.0\n4971\t-90.42517600000001\t40.365102\tTable Grove village\tIL\tIllinois\tFulton County\t396\t45.1\t15.3\t8.7\t23212\t60313\t0.5423\t61482\tObama\t61482\t0.000710347\t61482.0\n4972\t-90.05187099999999\t40.492117\tSt. David village\tIL\tIllinois\tFulton County\t548\t42.1\t4.4\t11.9\t19513\t70333\t0.5423\t61563\tObama\t61563\t0.000983006\t61563.0\n4973\t-90.005781\t40.697744\tFarmington city\tIL\tIllinois\tFulton County\t2453\t41.8\t14.6\t11.7\t22683\t93235\t0.5423\t61531\tObama\t61531\t0.004400205999999999\t61531.0\n4974\t-90.193342\t40.493581\tCuba city\tIL\tIllinois\tFulton County\t1336\t41.9\t10.1\t16.4\t17351\t68571\t0.5423\t61427\tObama\t61427\t0.002396525\t61427.0\n4975\t-90.306043\t40.627309000000004\tEllisville village\tIL\tIllinois\tFulton County\t85\t46.1\t15.9\t5.9\t21050\t77500\t0.5423\t61431\tObama\t61431\t0.000152474\t61431.0\n4976\t-90.393123\t40.499491\tMarietta village\tIL\tIllinois\tFulton County\t165\t42.7\t10.9\t7.9\t22824\t94000\t0.5423\t61459\tObama\t61459\t0.000295978\t61459.0\n4977\t-90.323325\t40.352554999999995\tIpava village\tIL\tIllinois\tFulton County\t479\t43.7\t7.9\t8.2\t20137\t57321\t0.5423\t61441\tObama\t61441\t0.000859233\t61441.0\n4978\t-90.041196\t40.562923\tCanton city\tIL\tIllinois\tFulton County\t14653\t37.3\t15.6\t16.1\t20632\t84809\t0.5423\t61520\tObama\t61520\t0.026284641\t61520.0\n4979\t-90.429027\t40.295721\tVermont village\tIL\tIllinois\tFulton County\t741\t40.3\t7.9\t15.1\t14357\t46154\t0.5423\t61484\tObama\t61484\t0.00132921\t61484.0\n4980\t-90.001672\t40.390341\tLiverpool village\tIL\tIllinois\tFulton County\t112\t45.6\t7.1\t17.6\t19778\t78333\t0.5423\t61543\tObama\t61543\t0.000200906\t61543.0\n4981\t-90.032089\t40.625774\tNorris village\tIL\tIllinois\tFulton County\t204\t41.9\t14.9\t10.2\t23494\t106250\t0.5423\t61531\tObama\t61531\t0.000365936\t61531.0\n4982\t-90.155353\t40.396643\tLewistown city\tIL\tIllinois\tFulton County\t2364\t44.2\t14.6\t12.9\t21346\t80597\t0.5423\t61542\tObama\t61542\t0.004240558\t61542.0\n4983\t-88.138914\t37.69719\tOld Shawneetown village\tIL\tIllinois\tGallatin County\t247\t41.0\t4.0\t19.5\t14681\t30000\t0.3999\t62984\tObama\t62984\t0.00044307\t62984.0\n4984\t-88.238474\t37.723261\tJunction village\tIL\tIllinois\tGallatin County\t126\t41.7\t4.4\t5.2\t15917\t45000\t0.3999\t62954\tObama\t62954\t0.00022602\t62954.0\n4985\t-88.127848\t37.902529\tNew Haven village\tIL\tIllinois\tGallatin County\t436\t44.6\t8.2\t10.8\t20011\t65714\t0.3999\t62867\tObama\t62867\t0.000782099\t62867.0\n4986\t-88.30543399999999\t37.890019\tOmaha village\tIL\tIllinois\tGallatin County\t244\t44.1\t13.3\t13.7\t17687\t80625\t0.3999\t62871\tObama\t62871\t0.000437689\t62871.0\n4987\t-88.18843000000001\t37.710618\tShawneetown city\tIL\tIllinois\tGallatin County\t1316\t43.8\t5.7\t10.9\t18293\t57300\t0.3999\t62984\tObama\t62984\t0.002360649\t62984.0\n4988\t-88.342044\t37.737122\tEquality village\tIL\tIllinois\tGallatin County\t743\t44.2\t6.1\t10.2\t14021\t57105\t0.3999\t62934\tObama\t62934\t0.0013327979999999998\t62934.0\n4989\t-88.260369\t37.797740999999995\tRidgway village\tIL\tIllinois\tGallatin County\t846\t45.5\t10.6\t10.8\t20261\t64583\t0.3999\t62979\tObama\t62979\t0.00151756\t62979.0\n4990\t-90.486754\t39.480709999999995\tWilmington village\tIL\tIllinois\tGreene County\t114\t43.8\t10.1\t12.9\t16489\t51667\t0.3598\t62078\tObama\t62078\t0.00020449400000000002\t62078.0\n4991\t-90.553988\t39.286181\tEldred village\tIL\tIllinois\tGreene County\t184\t50.1\t7.1\t15.9\t19361\t76667\t0.3598\t62027\tObama\t62027\t0.00033006\t62027.0\n4992\t-90.20645400000001\t39.269288\tRockbridge village\tIL\tIllinois\tGreene County\t173\t40.2\t11.1\t7.5\t17408\t71667\t0.3598\t62081\tObama\t62081\t0.000310328\t62081.0\n4993\t-90.37383100000001\t39.484041999999995\tRoodhouse city\tIL\tIllinois\tGreene County\t2003\t34.4\t9.2\t18.3\t16262\t52588\t0.3598\t62082\tObama\t62082\t0.0035929940000000004\t62082.0\n4994\t-90.20786700000001\t39.344253\tGreenfield city\tIL\tIllinois\tGreene County\t1110\t40.1\t8.6\t3.3\t17036\t70686\t0.3598\t62044\tObama\t62044\t0.001991125\t62044.0\n4995\t-90.538138\t39.449549\tHillview village\tIL\tIllinois\tGreene County\t170\t42.9\t9.4\t12.0\t16495\t52500\t0.3598\t62050\tObama\t62050\t0.000304947\t62050.0\n4996\t-90.406951\t39.296303\tCarrollton city\tIL\tIllinois\tGreene County\t2478\t40.5\t20.1\t6.7\t20432\t91316\t0.3598\t62016\tObama\t62016\t0.004445052\t62016.0\n4997\t-90.401922\t39.438788\tWhite Hall city\tIL\tIllinois\tGreene County\t2385\t42.8\t11.6\t15.1\t16851\t52875\t0.3598\t62092\tObama\t62092\t0.004278228\t62092.0\n4998\t-90.351178\t39.190459000000004\tKane village\tIL\tIllinois\tGreene County\t421\t40.2\t10.9\t7.6\t17370\t71538\t0.3598\t62054\tObama\t62054\t0.000755192\t62054.0\n4999\t-88.29983\t41.297004\tCarbon Hill village\tIL\tIllinois\tGrundy County\t406\t43.9\t16.7\t15.0\t31623\t351515\t0.4449\t60416\tObama\t60416\t0.000728285\t60416.0\n5000\t-88.241562\t41.286458\tDiamond village\tIL\tIllinois\tGrundy County\t2041\t37.6\t11.2\t14.3\t26928\t152315\t0.4449\t60408\tObama\t60408\t0.003661158\t60408.0\n5001\t-88.245286\t41.293735999999996\tCoal City village\tIL\tIllinois\tGrundy County\t5309\t36.5\t17.0\t13.8\t29128\t179270\t0.4449\t60416\tObama\t60416\t0.009523317\t60416.0\n5002\t-88.24586500000001\t41.478092\tMinooka village\tIL\tIllinois\tGrundy County\t8509\t36.5\t20.7\t10.1\t27280\t219699\t0.4449\t60447\tObama\t60447\t0.015263496000000001\t60447.0\n5003\t-88.423893\t41.24108\tMazon village\tIL\tIllinois\tGrundy County\t1094\t38.3\t14.9\t14.9\t25987\t163246\t0.4449\t60444\tObama\t60444\t0.001962424\t60444.0\n5004\t-88.425859\t41.37225\tMorris city\tIL\tIllinois\tGrundy County\t13209\t37.9\t23.7\t15.1\t28529\t199052\t0.4449\t60450\tObama\t60450\t0.023694385\t60450.0\n5005\t-88.569946\t41.190272\tKinsman village\tIL\tIllinois\tGrundy County\t115\t40.0\t27.3\t10.5\t25877\t215000\t0.4449\t60437\tObama\t60437\t0.000206288\t60437.0\n5006\t-88.28111\t41.174607\tSouth Wilmington village\tIL\tIllinois\tGrundy County\t714\t43.5\t9.2\t16.9\t27074\t142061\t0.4449\t60474\tObama\t60474\t0.001280778\t60474.0\n5007\t-88.265956\t41.224109000000006\tBraceville village\tIL\tIllinois\tGrundy County\t942\t34.1\t8.4\t25.1\t24487\t150208\t0.4449\t60407\tObama\t60407\t0.001689765\t60407.0\n5008\t-88.311465\t41.187611\tGardner village\tIL\tIllinois\tGrundy County\t1540\t36.3\t11.1\t11.5\t24592\t143531\t0.4449\t60424\tObama\t60424\t0.002762461\t60424.0\n5009\t-88.26594300000001\t41.172922\tEast Brooklyn village\tIL\tIllinois\tGrundy County\t142\t44.0\t9.6\t17.6\t27069\t143269\t0.4449\t60474\tObama\t60474\t0.00025472\t60474.0\n5010\t-88.505285\t41.215681\tVerona village\tIL\tIllinois\tGrundy County\t298\t39.3\t11.4\t8.1\t23859\t179688\t0.4449\t60479\tObama\t60479\t0.000534554\t60479.0\n5011\t-88.684563\t38.198122\tDahlgren village\tIL\tIllinois\tHamilton County\t476\t42.9\t10.8\t10.9\t18893\t66250\t0.322\t62810\tObama\t62810\t0.000853852\t62810.0\n5012\t-88.532948\t38.09073\tMcLeansboro city\tIL\tIllinois\tHamilton County\t3012\t43.1\t12.7\t11.1\t17018\t59416\t0.322\t62859\tObama\t62859\t0.005402944\t62859.0\n5013\t-88.555824\t38.223439\tBelle Prairie City town\tIL\tIllinois\tHamilton County\t60\t42.0\t9.5\t8.8\t20212\t80000\t0.322\t62828\tObama\t62828\t0.000107628\t62828.0\n5014\t-88.703144\t38.052527000000005\tMacedonia village\tIL\tIllinois\tHamilton County\t46\t42.5\t6.7\t4.3\t18918\t85000\t0.322\t62860\tObama\t62860\t8.25e-05\t62860.0\n5015\t-88.462211\t37.934587\tBroughton village\tIL\tIllinois\tHamilton County\t189\t44.2\t2.2\t13.2\t13154\t55000\t0.322\t62817\tObama\t62817\t0.000339029\t62817.0\n5016\t-91.1683\t40.469642\tFerris village\tIL\tIllinois\tHancock County\t155\t41.4\t17.8\t9.9\t22184\t65000\t0.4006\t62336\tObama\t62336\t0.00027804\t62336.0\n5017\t-90.96952399999999\t40.584813\tLa Harpe city\tIL\tIllinois\tHancock County\t1224\t45.1\t15.8\t14.1\t17558\t69722\t0.4006\t61450\tObama\t61450\t0.0021956189999999998\t61450.0\n5018\t-91.427689\t40.350912\tWarsaw city\tIL\tIllinois\tHancock County\t1634\t43.0\t19.2\t13.6\t20478\t81250\t0.4006\t62379\tObama\t62379\t0.002931079\t62379.0\n5019\t-91.362277\t40.390015000000005\tHamilton city\tIL\tIllinois\tHancock County\t2839\t43.4\t15.8\t15.9\t22796\t87708\t0.4006\t62341\tObama\t62341\t0.0050926159999999995\t62341.0\n5020\t-91.135191\t40.414246999999996\tCarthage city\tIL\tIllinois\tHancock County\t2495\t42.4\t25.1\t12.5\t23858\t91712\t0.4006\t62321\tObama\t62321\t0.0044755459999999995\t62321.0\n5021\t-90.949722\t40.230955\tAugusta village\tIL\tIllinois\tHancock County\t633\t45.1\t19.2\t10.2\t17864\t49000\t0.4006\t62311\tObama\t62311\t0.001135479\t62311.0\n5022\t-91.199435\t40.327782\tBasco village\tIL\tIllinois\tHancock County\t109\t43.3\t27.3\t8.5\t20855\t63750\t0.4006\t62313\tObama\t62313\t0.000195525\t62313.0\n5023\t-90.908251\t40.291829\tPlymouth village\tIL\tIllinois\tHancock County\t550\t38.5\t11.1\t14.1\t17757\t38571\t0.4006\t62367\tObama\t62367\t0.000986593\t62367.0\n5024\t-91.18312399999999\t40.255514\tWest Point village\tIL\tIllinois\tHancock County\t188\t38.3\t12.9\t14.7\t18461\t62500\t0.4006\t62380\tObama\t62380\t0.000337236\t62380.0\n5025\t-91.160475\t40.642986\tDallas City\tIL\tIllinois\tHancock County\t1043\t45.3\t13.9\t15.5\t18781\t74318\t0.4006\t62330\tObama\t62330\t0.00187094\t62330.0\n5026\t-91.211201\t40.628395000000005\tPontoosuc village\tIL\tIllinois\tHancock County\t172\t45.6\t13.5\t17.6\t18659\t75000\t0.4006\t62330\tObama\t62330\t0.000308535\t62330.0\n5027\t-91.382868\t40.545657\tNauvoo city\tIL\tIllinois\tHancock County\t958\t45.7\t26.7\t14.7\t23995\t102660\t0.4006\t62354\tObama\t62354\t0.001718466\t62354.0\n5028\t-91.24934\t40.395472\tElvaston village\tIL\tIllinois\tHancock County\t142\t44.0\t18.9\t12.8\t20850\t104167\t0.4006\t62334\tObama\t62334\t0.00025472\t62334.0\n5029\t-91.063251\t40.232018\tBowen village\tIL\tIllinois\tHancock County\t520\t38.3\t12.2\t14.3\t18102\t53611\t0.4006\t62316\tObama\t62316\t0.0009327789999999999\t62316.0\n5030\t-91.111797\t40.344013000000004\tBentley town\tIL\tIllinois\tHancock County\t44\t44.4\t28.1\t8.3\t20761\t62500\t0.4006\t62321\tObama\t62321\t7.890000000000001e-05\t62321.0\n5031\t-88.166004\t37.470936\tCave-In-Rock village\tIL\tIllinois\tHardin County\t317\t46.0\t8.7\t21.5\t16976\t57500\t0.3185\t62919\tObama\t62919\t0.000568637\t62919.0\n5032\t-88.350491\t37.424521999999996\tRosiclare city\tIL\tIllinois\tHardin County\t1098\t45.4\t10.9\t9.1\t16202\t52975\t0.3185\t62982\tObama\t62982\t0.001969599\t62982.0\n5033\t-88.305222\t37.449915000000004\tElizabethtown village\tIL\tIllinois\tHardin County\t320\t51.4\t17.0\t8.8\t17371\t57333\t0.3185\t62982\tObama\t62982\t0.000574018\t62982.0\n5034\t-90.909336\t40.746363\tStronghurst village\tIL\tIllinois\tHenderson County\t817\t43.5\t14.2\t5.9\t19450\t73095\t0.5544\t61480\tObama\t61480\t0.00146554\t61480.0\n5035\t-90.832649\t40.769451000000004\tMedia village\tIL\tIllinois\tHenderson County\t117\t43.9\t12.0\t4.8\t20658\t86250\t0.5544\t61460\tObama\t61460\t0.000209875\t61460.0\n5036\t-91.076196\t40.678896\tLomax village\tIL\tIllinois\tHenderson County\t435\t42.6\t15.2\t7.1\t19125\t68333\t0.5544\t61454\tObama\t61454\t0.000780306\t61454.0\n5037\t-90.956781\t40.863963\tGladstone village\tIL\tIllinois\tHenderson County\t254\t46.3\t11.2\t12.1\t20293\t82273\t0.5544\t61437\tObama\t61437\t0.00045562699999999995\t61437.0\n5038\t-90.94989100000001\t40.937784\tOquawka village\tIL\tIllinois\tHenderson County\t1412\t44.6\t7.6\t17.3\t20407\t73276\t0.5544\t61469\tObama\t61469\t0.0025328539999999997\t61469.0\n5039\t-90.862143\t40.853946\tBiggsville village\tIL\tIllinois\tHenderson County\t380\t45.2\t13.0\t7.3\t21543\t62000\t0.5544\t61418\tObama\t61418\t0.000681646\t61418.0\n5040\t-90.824969\t40.695819\tRaritan village\tIL\tIllinois\tHenderson County\t127\t43.8\t12.1\t6.0\t20499\t87500\t0.5544\t61471\tObama\t61471\t0.000227813\t61471.0\n5041\t-91.084464\t40.807666\tGulf Port village\tIL\tIllinois\tHenderson County\t181\t49.7\t14.6\t12.3\t24863\t53750\t0.5544\t61425\tObama\t61425\t0.000324679\t61425.0\n5042\t-90.11745400000001\t41.199503\tBishop Hill village\tIL\tIllinois\tHenry County\t118\t43.0\t26.8\t8.6\t21046\t125000\t0.507\t61419\tObama\t61419\t0.00021166900000000002\t61419.0\n5043\t-89.924125\t41.240638\tKewanee city\tIL\tIllinois\tHenry County\t12703\t39.8\t13.2\t13.9\t19381\t66517\t0.507\t61443\tObama\t61443\t0.022786719\t61443.0\n5044\t-90.322063\t41.178551\tWoodhull village\tIL\tIllinois\tHenry County\t760\t44.4\t12.9\t8.9\t18957\t88889\t0.507\t61490\tObama\t61490\t0.0013632929999999998\t61490.0\n5045\t-90.376201\t41.351449\tOrion village\tIL\tIllinois\tHenry County\t1686\t43.0\t21.5\t7.8\t26232\t135417\t0.507\t61273\tObama\t61273\t0.003024357\t61273.0\n5046\t-89.91398000000001\t41.521621\tHooppole village\tIL\tIllinois\tHenry County\t154\t43.9\t15.6\t5.0\t22465\t112500\t0.507\t61277\tObama\t61277\t0.000276246\t61277.0\n5047\t-90.290722\t41.294911\tAndover village\tIL\tIllinois\tHenry County\t559\t42.8\t16.1\t7.1\t24977\t114205\t0.507\t61233\tObama\t61233\t0.001002738\t61233.0\n5048\t-90.38055\t41.191708\tAlpha village\tIL\tIllinois\tHenry County\t682\t43.4\t15.1\t11.2\t19139\t87292\t0.507\t61413\tObama\t61413\t0.001223376\t61413.0\n5049\t-90.010334\t41.415867\tAtkinson town\tIL\tIllinois\tHenry County\t960\t43.2\t16.3\t14.7\t19303\t91964\t0.507\t61235\tObama\t61235\t0.001722054\t61235.0\n5050\t-90.192852\t41.299002\tCambridge village\tIL\tIllinois\tHenry County\t2062\t38.3\t18.0\t8.6\t22882\t101829\t0.507\t61238\tObama\t61238\t0.003698828\t61238.0\n5051\t-90.31773000000001\t41.503164\tCleveland village\tIL\tIllinois\tHenry County\t246\t39.2\t10.8\t10.8\t23880\t123611\t0.507\t61241\tObama\t61241\t0.000441276\t61241.0\n5052\t-90.15355500000001\t41.44852\tGeneseo city\tIL\tIllinois\tHenry County\t6405\t44.0\t28.7\t6.2\t24962\t141299\t0.507\t61254\tObama\t61254\t0.011489328\t61254.0\n5053\t-90.04002\t41.166441\tGalva city\tIL\tIllinois\tHenry County\t2631\t42.4\t20.3\t7.9\t20439\t80563\t0.507\t61434\tObama\t61434\t0.004719504\t61434.0\n5054\t-89.907679\t41.398221\tAnnawan town\tIL\tIllinois\tHenry County\t825\t41.9\t16.8\t6.0\t20211\t101705\t0.507\t61234\tObama\t61234\t0.00147989\t61234.0\n5055\t-90.358373\t41.464721999999995\tColona city\tIL\tIllinois\tHenry County\t5005\t37.7\t11.0\t11.0\t23088\t98288\t0.507\t61241\tObama\t61241\t0.008978\t61241.0\n5056\t-87.85629499999999\t40.771871000000004\tCrescent City village\tIL\tIllinois\tIroquois County\t592\t40.9\t12.2\t8.6\t21342\t116406\t0.267\t60928\tObama\t60928\t0.001061933\t60928.0\n5057\t-87.584652\t40.828672999999995\tIroquois village\tIL\tIllinois\tIroquois County\t193\t43.5\t14.9\t6.4\t22441\t95000\t0.267\t60945\tObama\t60945\t0.000346205\t60945.0\n5058\t-87.565985\t40.770856\tSheldon village\tIL\tIllinois\tIroquois County\t1167\t39.3\t10.8\t11.9\t19865\t94444\t0.267\t60966\tObama\t60966\t0.002093372\t60966.0\n5059\t-87.614081\t40.885127000000004\tDonovan village\tIL\tIllinois\tIroquois County\t327\t43.0\t14.7\t6.4\t22456\t95000\t0.267\t60931\tObama\t60931\t0.000586575\t60931.0\n5060\t-87.72634599999999\t40.915597\tMartinton village\tIL\tIllinois\tIroquois County\t369\t35.9\t7.5\t7.4\t17580\t113816\t0.267\t60951\tObama\t60951\t0.000661914\t60951.0\n5061\t-88.037378\t40.597404\tBuckley village\tIL\tIllinois\tIroquois County\t569\t43.2\t14.6\t6.2\t21916\t106597\t0.267\t60918\tObama\t60918\t0.001020676\t60918.0\n5062\t-87.93405\t40.934464\tClifton village\tIL\tIllinois\tIroquois County\t1222\t38.8\t14.8\t8.4\t23432\t135174\t0.267\t60927\tObama\t60927\t0.002192031\t60927.0\n5063\t-87.716104\t40.967338\tPapineau village\tIL\tIllinois\tIroquois County\t193\t36.0\t6.8\t7.1\t17566\t115625\t0.267\t60951\tObama\t60951\t0.000346205\t60951.0\n5064\t-87.65462600000001\t40.953615\tBeaverville village\tIL\tIllinois\tIroquois County\t375\t39.3\t7.3\t10.1\t21024\t102632\t0.267\t60912\tObama\t60912\t0.000672677\t60912.0\n5065\t-87.67967800000001\t40.540445\tWellington village\tIL\tIllinois\tIroquois County\t257\t42.7\t12.4\t8.7\t24000\t78125\t0.267\t60973\tObama\t60973\t0.00046100800000000006\t60973.0\n5066\t-87.977991\t40.821884000000004\tDanforth village\tIL\tIllinois\tIroquois County\t600\t45.8\t12.3\t8.0\t21113\t122596\t0.267\t60930\tObama\t60930\t0.0010762839999999998\t60930.0\n5067\t-87.732113\t40.775707000000004\tWatseka city\tIL\tIllinois\tIroquois County\t5536\t42.4\t12.6\t8.7\t20603\t94172\t0.267\t60970\tObama\t60970\t0.009930511\t60970.0\n5068\t-87.89272700000001\t40.566623\tCissna Park village\tIL\tIllinois\tIroquois County\t775\t43.6\t15.2\t7.3\t21629\t111198\t0.267\t60924\tObama\t60924\t0.0013902\t60924.0\n5069\t-88.007824\t40.714901\tOnarga village\tIL\tIllinois\tIroquois County\t1366\t33.4\t5.7\t15.0\t18165\t88036\t0.267\t60955\tObama\t60955\t0.0024503389999999997\t60955.0\n5070\t-87.953264\t40.878355\tAshkum village\tIL\tIllinois\tIroquois County\t686\t43.1\t12.8\t6.7\t23340\t132172\t0.267\t60911\tObama\t60911\t0.001230551\t60911.0\n5071\t-87.730644\t40.713916999999995\tWoodland village\tIL\tIllinois\tIroquois County\t317\t45.6\t13.2\t9.3\t27182\t111029\t0.267\t60974\tObama\t60974\t0.000568637\t60974.0\n5072\t-88.075701\t40.5163\tLoda village\tIL\tIllinois\tIroquois County\t392\t48.1\t14.3\t13.8\t24499\t101667\t0.267\t60948\tObama\t60948\t0.000703172\t60948.0\n5073\t-88.112999\t40.673373\tThawville village\tIL\tIllinois\tIroquois County\t247\t43.3\t14.5\t6.4\t21968\t105357\t0.267\t60968\tObama\t60968\t0.00044307\t60968.0\n5074\t-88.00734\t40.762763\tGilman city\tIL\tIllinois\tIroquois County\t1717\t42.6\t10.4\t9.4\t20879\t112903\t0.267\t60938\tObama\t60938\t0.003079965\t60938.0\n5075\t-87.696465\t40.62769\tMilford village\tIL\tIllinois\tIroquois County\t1234\t46.1\t10.3\t10.8\t21371\t77778\t0.267\t60953\tObama\t60953\t0.002213557\t60953.0\n5076\t-87.912559\t41.004721\tChebanse village\tIL\tIllinois\tIroquois County\t1205\t40.9\t9.8\t12.1\t23003\t138487\t0.267\t60922\tObama\t60922\t0.002161536\t60922.0\n5077\t-89.48305699999999\t37.715143\tGorham village\tIL\tIllinois\tJackson County\t249\t39.4\t14.7\t8.6\t17076\t46667\t0.5547\t62940\tObama\t62940\t0.000446658\t62940.0\n5078\t-89.22704300000001\t37.816364\tDe Soto village\tIL\tIllinois\tJackson County\t1754\t36.5\t20.3\t9.9\t18812\t77541\t0.5547\t62924\tObama\t62924\t0.0031463359999999996\t62924.0\n5079\t-89.23673000000001\t37.910036\tElkville village\tIL\tIllinois\tJackson County\t916\t38.8\t13.1\t9.6\t16031\t62174\t0.5547\t62932\tObama\t62932\t0.001643126\t62932.0\n5080\t-89.217945\t37.727846\tCarbondale city\tIL\tIllinois\tJackson County\t24074\t25.1\t52.2\t10.0\t16945\t100334\t0.5547\t62901\tObama\t62901\t0.043184087999999995\t62901.0\n5081\t-89.334858\t37.768240999999996\tMurphysboro city\tIL\tIllinois\tJackson County\t8207\t37.4\t21.5\t12.0\t20318\t67332\t0.5547\t62966\tObama\t62966\t0.014721767\t62966.0\n5082\t-89.235612\t37.618111999999996\tMakanda village\tIL\tIllinois\tJackson County\t408\t44.1\t49.8\t4.6\t27346\t130000\t0.5547\t62958\tObama\t62958\t0.0007318730000000001\t62958.0\n5083\t-89.50564\t37.634144\tGrand Tower city\tIL\tIllinois\tJackson County\t678\t39.7\t9.4\t14.4\t18228\t44655\t0.5547\t62942\tObama\t62942\t0.001216201\t62942.0\n5084\t-89.339799\t37.901663\tVergennes village\tIL\tIllinois\tJackson County\t353\t28.8\t14.0\t8.9\t18580\t67222\t0.5547\t62994\tObama\t62994\t0.000633214\t62994.0\n5085\t-89.496565\t37.888613\tAva city\tIL\tIllinois\tJackson County\t622\t41.5\t12.5\t11.3\t17739\t94667\t0.5547\t62907\tObama\t62907\t0.001115747\t62907.0\n5086\t-89.550934\t37.929835\tCampbell Hill village\tIL\tIllinois\tJackson County\t362\t40.0\t17.7\t6.4\t18892\t74500\t0.5547\t62916\tObama\t62916\t0.000649358\t62916.0\n5087\t-89.23915799999999\t37.939733000000004\tDowell village\tIL\tIllinois\tJackson County\t406\t44.6\t10.5\t13.4\t17217\t54000\t0.5547\t62927\tObama\t62927\t0.000728285\t62927.0\n5088\t-88.021838\t38.995793\tWillow Hill village\tIL\tIllinois\tJasper County\t242\t39.8\t11.9\t11.1\t16776\t96000\t0.2848\t62480\tObama\t62480\t0.000434101\t62480.0\n5089\t-88.02457\t39.120288\tYale village\tIL\tIllinois\tJasper County\t91\t40.3\t9.8\t8.3\t16449\t78333\t0.2848\t62481\tObama\t62481\t0.000163236\t62481.0\n5090\t-88.027757\t38.930021999999994\tSte. Marie village\tIL\tIllinois\tJasper County\t267\t41.4\t19.8\t6.1\t18054\t79500\t0.2848\t62459\tObama\t62459\t0.000478946\t62459.0\n5091\t-88.149916\t39.104296000000005\tRose Hill village\tIL\tIllinois\tJasper County\t78\t45.0\t12.1\t17.5\t19871\t80000\t0.2848\t62432\tObama\t62432\t0.000139917\t62432.0\n5092\t-88.318805\t39.042493\tWheeler village\tIL\tIllinois\tJasper County\t117\t39.4\t9.9\t8.8\t20063\t110000\t0.2848\t62479\tObama\t62479\t0.000209875\t62479.0\n5093\t-88.149107\t39.155908000000004\tHidalgo village\tIL\tIllinois\tJasper County\t122\t44.3\t12.2\t17.5\t19785\t82500\t0.2848\t62432\tObama\t62432\t0.00021884400000000002\t62432.0\n5094\t-88.164651\t38.988067\tNewton city\tIL\tIllinois\tJasper County\t2817\t41.7\t15.0\t11.3\t19727\t76966\t0.2848\t62448\tObama\t62448\t0.005053152\t62448.0\n5095\t-88.906924\t38.202771000000006\tBonnie village\tIL\tIllinois\tJefferson County\t413\t41.6\t6.6\t9.5\t19265\t63571\t0.3731\t62816\tObama\t62816\t0.000740842\t62816.0\n5096\t-88.942459\t38.442634999999996\tDix village\tIL\tIllinois\tJefferson County\t549\t45.7\t12.6\t9.2\t16627\t99063\t0.3731\t62830\tObama\t62830\t0.0009847999999999999\t62830.0\n5097\t-88.735524\t38.325611\tBluford village\tIL\tIllinois\tJefferson County\t755\t37.8\t9.5\t14.3\t17720\t65263\t0.3731\t62814\tObama\t62814\t0.0013543239999999998\t62814.0\n5098\t-88.966196\t38.175964\tNason city\tIL\tIllinois\tJefferson County\t219\t44.6\t13.6\t8.9\t20486\t79375\t0.3731\t62816\tObama\t62816\t0.000392844\t62816.0\n5099\t-88.910567\t38.316195\tMount Vernon city\tIL\tIllinois\tJefferson County\t15663\t40.2\t20.7\t12.7\t19804\t75941\t0.3731\t62864\tObama\t62864\t0.028096385\t62864.0\n5100\t-89.0399\t38.21366\tWaltonville village\tIL\tIllinois\tJefferson County\t416\t38.9\t11.2\t15.4\t19136\t72727\t0.3731\t62894\tObama\t62894\t0.0007462230000000001\t62894.0\n5101\t-88.904036\t38.149328999999994\tIna village\tIL\tIllinois\tJefferson County\t2435\t34.0\t2.6\t12.0\t15893\t68333\t0.3731\t62846\tObama\t62846\t0.004367918\t62846.0\n5102\t-89.035119\t38.329454999999996\tWoodlawn village\tIL\tIllinois\tJefferson County\t695\t37.7\t21.3\t10.5\t19918\t94565\t0.3731\t62898\tObama\t62898\t0.001246695\t62898.0\n5103\t-88.740496\t38.231757\tBelle Rive village\tIL\tIllinois\tJefferson County\t404\t43.6\t14.8\t15.9\t15793\t76333\t0.3731\t62810\tObama\t62810\t0.0007246980000000001\t62810.0\n5104\t-90.49958000000001\t39.108703999999996\tFieldon village\tIL\tIllinois\tJersey County\t298\t41.0\t14.6\t12.2\t23009\t145000\t0.3682\t62031\tObama\t62031\t0.000534554\t62031.0\n5105\t-90.327802\t39.11914\tJerseyville city\tIL\tIllinois\tJersey County\t8358\t40.8\t13.5\t11.2\t23200\t118750\t0.3682\t62052\tObama\t62052\t0.014992631000000001\t62052.0\n5106\t-90.42605\t38.976624\tGrafton city\tIL\tIllinois\tJersey County\t601\t42.2\t17.2\t15.7\t26826\t120833\t0.3682\t62037\tObama\t62037\t0.001078077\t62037.0\n5107\t-90.355419\t38.954037\tElsah village\tIL\tIllinois\tJersey County\t649\t28.1\t26.6\t7.8\t22067\t137500\t0.3682\t62028\tObama\t62028\t0.00116418\t62028.0\n5108\t-90.398426\t39.050796999999996\tOtterville town\tIL\tIllinois\tJersey County\t136\t38.9\t8.6\t12.9\t20012\t122222\t0.3682\t62022\tObama\t62022\t0.00024395799999999998\t62022.0\n5109\t-90.164345\t39.154522\tFidelity village\tIL\tIllinois\tJersey County\t116\t39.7\t16.7\t3.8\t18305\t166667\t0.3682\t62030\tObama\t62030\t0.000208082\t62030.0\n5110\t-90.27794499999999\t42.254447\tHanover village\tIL\tIllinois\tJo Daviess County\t821\t45.5\t14.0\t12.3\t23179\t97292\t0.4958\t61041\tObama\t61041\t0.001472715\t61041.0\n5111\t-89.990709\t42.494617\tWarren village\tIL\tIllinois\tJo Daviess County\t1377\t43.1\t12.7\t8.5\t21403\t101847\t0.4958\t61087\tObama\t61087\t0.002470071\t61087.0\n5112\t-90.224529\t42.316575\tElizabeth village\tIL\tIllinois\tJo Daviess County\t618\t48.2\t13.8\t10.2\t21098\t109840\t0.4958\t61028\tObama\t61028\t0.001108572\t61028.0\n5113\t-90.430647\t42.42194\tGalena city\tIL\tIllinois\tJo Daviess County\t3418\t47.0\t20.4\t7.8\t25194\t137744\t0.4958\t61036\tObama\t61036\t0.006131229\t61036.0\n5114\t-90.006424\t42.351785\tStockton village\tIL\tIllinois\tJo Daviess County\t1800\t43.1\t11.5\t9.5\t19427\t102616\t0.4958\t61085\tObama\t61085\t0.0032288509999999996\t61085.0\n5115\t-89.945499\t42.456359\tNora village\tIL\tIllinois\tJo Daviess County\t110\t44.7\t7.5\t11.4\t28745\t137500\t0.4958\t61059\tObama\t61059\t0.00019731900000000003\t61059.0\n5116\t-90.25130300000001\t42.477799\tScales Mound village\tIL\tIllinois\tJo Daviess County\t417\t48.0\t19.7\t7.9\t24088\t172727\t0.4958\t61075\tObama\t61075\t0.000748017\t61075.0\n5117\t-90.094633\t42.50197\tApple River village\tIL\tIllinois\tJo Daviess County\t355\t42.1\t11.2\t8.2\t21989\t80000\t0.4958\t61001\tObama\t61001\t0.000636801\t61001.0\n5118\t-90.631821\t42.49027\tEast Dubuque city\tIL\tIllinois\tJo Daviess County\t1836\t40.8\t11.9\t8.6\t22815\t121354\t0.4958\t61025\tObama\t61025\t0.0032934279999999997\t61025.0\n5119\t-90.542445\t42.472458\tMenominee village\tIL\tIllinois\tJo Daviess County\t234\t38.8\t8.6\t7.6\t19331\t146875\t0.4958\t61025\tObama\t61025\t0.000419751\t61025.0\n5120\t-88.772786\t37.57863\tNew Burnside village\tIL\tIllinois\tJohnson County\t242\t42.0\t10.7\t15.3\t17855\t82500\t0.2772\t62967\tObama\t62967\t0.000434101\t62967.0\n5121\t-88.940866\t37.322565999999995\tBelknap village\tIL\tIllinois\tJohnson County\t139\t40.2\t9.7\t11.3\t15906\t48750\t0.2772\t62956\tObama\t62956\t0.000249339\t62956.0\n5122\t-88.97453399999999\t37.471425\tBuncombe village\tIL\tIllinois\tJohnson County\t197\t39.7\t8.8\t10.3\t18474\t80000\t0.2772\t62912\tObama\t62912\t0.00035338\t62912.0\n5123\t-88.89246999999999\t37.41455\tVienna city\tIL\tIllinois\tJohnson County\t1292\t41.2\t14.4\t15.7\t18514\t80800\t0.2772\t62995\tObama\t62995\t0.0023175970000000002\t62995.0\n5124\t-88.97507900000001\t37.553906\tGoreville village\tIL\tIllinois\tJohnson County\t1000\t41.0\t18.3\t8.3\t19774\t103354\t0.2772\t62939\tObama\t62939\t0.001793806\t62939.0\n5125\t-88.75573399999999\t37.46723\tSimpson village\tIL\tIllinois\tJohnson County\t61\t32.0\t6.7\t14.3\t16684\t100000\t0.2772\t62985\tObama\t62985\t0.00010942200000000001\t62985.0\n5126\t-89.018828\t37.365448\tCypress village\tIL\tIllinois\tJohnson County\t283\t40.4\t9.4\t11.7\t15922\t51250\t0.2772\t62923\tObama\t62923\t0.000507647\t62923.0\n5127\t-88.318973\t41.883309000000004\tGeneva city\tIL\tIllinois\tKane County\t23780\t36.9\t55.8\t7.9\t36614\t325956\t0.4973\t60134\tObama\t60134\t0.042656709\t60134.0\n5128\t-88.46095\t41.884634999999996\tElburn village\tIL\tIllinois\tKane County\t4812\t34.8\t44.6\t8.5\t36611\t307665\t0.4973\t60119\tObama\t60119\t0.008631795\t60119.0\n5129\t-88.48667900000001\t41.769733\tSugar Grove village\tIL\tIllinois\tKane County\t8146\t38.3\t42.4\t8.4\t38131\t299048\t0.4973\t60554\tObama\t60554\t0.014612345\t60554.0\n5130\t-88.54939399999999\t42.050816999999995\tBurlington village\tIL\tIllinois\tKane County\t559\t36.9\t15.5\t8.0\t27422\t228788\t0.4973\t60109\tObama\t60109\t0.001002738\t60109.0\n5131\t-88.25576600000001\t41.921828999999995\tSt. Charles city\tIL\tIllinois\tKane County\t35003\t39.4\t48.0\t8.3\t40440\t295125\t0.4973\t60184\tObama\t60184\t0.062788595\t60184.0\n5132\t-88.313824\t42.091738\tSleepy Hollow village\tIL\tIllinois\tKane County\t3992\t40.5\t46.2\t8.1\t36102\t364520\t0.4973\t60118\tObama\t60118\t0.007160874\t60118.0\n5133\t-88.475013\t41.949977000000004\tLily Lake village\tIL\tIllinois\tKane County\t939\t41.8\t43.4\t7.6\t38518\t380159\t0.4973\t60119\tObama\t60119\t0.001684384\t60119.0\n5134\t-88.26151999999999\t41.863558000000005\tBatavia city\tIL\tIllinois\tKane County\t28046\t37.1\t47.7\t8.9\t33410\t292691\t0.4973\t60510\tObama\t60510\t0.050309085999999996\t60510.0\n5135\t-88.348842\t41.731516\tMontgomery village\tIL\tIllinois\tKane County\t9924\t37.8\t20.8\t9.8\t28638\t241405\t0.4973\t60538\tObama\t60538\t0.017801732\t60538.0\n5136\t-88.594381\t41.908381\tMaple Park village\tIL\tIllinois\tKane County\t1327\t37.7\t19.6\t11.3\t26413\t192213\t0.4973\t60151\tObama\t60151\t0.002380381\t60151.0\n5137\t-88.29053\t42.092649\tWest Dundee village\tIL\tIllinois\tKane County\t6752\t37.5\t40.9\t8.0\t35328\t298202\t0.4973\t60118\tObama\t60118\t0.012111779\t60118.0\n5138\t-88.330499\t41.80623\tNorth Aurora village\tIL\tIllinois\tKane County\t14066\t36.2\t38.9\t9.8\t31391\t230584\t0.4973\t60542\tObama\t60542\t0.025231677\t60542.0\n5139\t-88.309016\t41.992166999999995\tSouth Elgin village\tIL\tIllinois\tKane County\t21257\t33.3\t31.8\t11.5\t33593\t240436\t0.4973\t60177\tObama\t60177\t0.038130937000000004\t60177.0\n5140\t-88.2475\t42.041069\tElgin city\tIL\tIllinois\tKane County\t100319\t32.4\t24.2\t14.8\t24618\t194369\t0.4973\t60120\tObama\t60120\t0.179952835\t60120.0\n5141\t-88.28572199999999\t42.122141\tCarpentersville village\tIL\tIllinois\tKane County\t37680\t29.0\t17.2\t14.1\t22015\t182894\t0.4973\t60110\tObama\t60110\t0.06759061400000001\t60110.0\n5142\t-88.41779\t42.067267\tPingree Grove village\tIL\tIllinois\tKane County\t157\t38.6\t31.4\t5.9\t32576\t366667\t0.4973\t60136\tObama\t60136\t0.00028162799999999997\t60136.0\n5143\t-88.37445699999999\t42.095695\tGilberts village\tIL\tIllinois\tKane County\t6065\t38.5\t32.6\t5.5\t34052\t364579\t0.4973\t60136\tObama\t60136\t0.010879433999999999\t60136.0\n5144\t-88.249223\t41.769125\tAurora city\tIL\tIllinois\tKane County\t175889\t30.9\t34.2\t13.5\t28430\t191989\t0.4973\t60504\tObama\t60504\t0.315510763\t60504.0\n5145\t-88.515235\t42.104558000000004\tHampshire village\tIL\tIllinois\tKane County\t4977\t38.1\t24.1\t8.7\t26940\t243876\t0.4973\t60140\tObama\t60140\t0.008927773\t60140.0\n5146\t-88.528733\t41.956621000000005\tVirgil village\tIL\tIllinois\tKane County\t283\t40.3\t24.1\t6.7\t29920\t285714\t0.4973\t60151\tObama\t60151\t0.000507647\t60151.0\n5147\t-88.235917\t42.097207\tEast Dundee village\tIL\tIllinois\tKane County\t3336\t43.7\t35.4\t11.0\t35239\t240959\t0.4973\t60192\tObama\t60192\t0.005984137\t60192.0\n5148\t-87.806416\t41.079562\tAroma Park village\tIL\tIllinois\tKankakee County\t846\t44.4\t13.4\t16.9\t21188\t129942\t0.4745\t60910\tObama\t60910\t0.00151756\t60910.0\n5149\t-87.98444\t41.052853000000006\tIrwin village\tIL\tIllinois\tKankakee County\t95\t44.2\t13.0\t16.4\t25234\t159375\t0.4745\t60922\tObama\t60922\t0.000170412\t60922.0\n5150\t-88.146153\t41.108847999999995\tUnion Hill village\tIL\tIllinois\tKankakee County\t70\t38.0\t13.0\t13.2\t25719\t134375\t0.4745\t60969\tObama\t60969\t0.000125566\t60969.0\n5151\t-87.611723\t41.068389\tHopkins Park village\tIL\tIllinois\tKankakee County\t681\t32.4\t6.5\t42.0\t10210\t55000\t0.4745\t60964\tObama\t60964\t0.001221582\t60964.0\n5152\t-87.71657900000001\t41.023632\tSt. Anne village\tIL\tIllinois\tKankakee County\t1314\t34.2\t14.0\t10.6\t19575\t114118\t0.4745\t60964\tObama\t60964\t0.002357061\t60964.0\n5153\t-87.857799\t41.152514000000004\tBradley village\tIL\tIllinois\tKankakee County\t13742\t34.8\t14.7\t11.6\t25171\t135731\t0.4745\t60915\tObama\t60915\t0.024650484\t60915.0\n5154\t-88.175729\t41.046996\tBuckingham village\tIL\tIllinois\tKankakee County\t251\t38.3\t13.9\t14.0\t25736\t133333\t0.4745\t60917\tObama\t60917\t0.000450245\t60917.0\n5155\t-88.055396\t41.147798\tBonfield village\tIL\tIllinois\tKankakee County\t426\t40.1\t12.4\t6.6\t24289\t194444\t0.4745\t60913\tObama\t60913\t0.0007641610000000001\t60913.0\n5156\t-87.643059\t41.239294\tGrant Park village\tIL\tIllinois\tKankakee County\t1613\t39.5\t11.1\t9.9\t24308\t186824\t0.4745\t60940\tObama\t60940\t0.0028934090000000004\t60940.0\n5157\t-87.860713\t41.109384000000006\tKankakee city\tIL\tIllinois\tKankakee County\t28398\t33.8\t15.9\t20.4\t18053\t103987\t0.4745\t60901\tObama\t60901\t0.050940505999999997\t60901.0\n5158\t-88.248052\t41.098671\tReddick village\tIL\tIllinois\tKankakee County\t231\t39.0\t13.6\t14.3\t25837\t133333\t0.4745\t60961\tObama\t60961\t0.000414369\t60961.0\n5159\t-88.100442\t41.048752\tHerscher village\tIL\tIllinois\tKankakee County\t1624\t36.7\t24.0\t12.2\t21890\t161638\t0.4745\t60941\tObama\t60941\t0.0029131409999999997\t60941.0\n5160\t-87.87793\t41.165434999999995\tBourbonnais village\tIL\tIllinois\tKankakee County\t16821\t31.9\t30.8\t11.3\t26756\t178955\t0.4745\t60914\tObama\t60914\t0.030173613\t60914.0\n5161\t-87.735399\t41.125941\tSun River Terrace village\tIL\tIllinois\tKankakee County\t397\t38.3\t6.7\t17.1\t18353\t108523\t0.4745\t60910\tObama\t60910\t0.000712141\t60910.0\n5162\t-87.66407099999999\t41.163916\tMomence city\tIL\tIllinois\tKankakee County\t3288\t39.3\t15.7\t13.0\t22593\t141535\t0.4745\t60954\tObama\t60954\t0.005898034\t60954.0\n5163\t-87.842373\t41.248432\tManteno village\tIL\tIllinois\tKankakee County\t7755\t38.3\t18.6\t9.7\t26438\t160256\t0.4745\t60950\tObama\t60950\t0.013910966\t60950.0\n5164\t-88.19436400000001\t41.181125\tEssex village\tIL\tIllinois\tKankakee County\t621\t40.4\t7.6\t19.0\t23652\t134722\t0.4745\t60935\tObama\t60935\t0.001113954\t60935.0\n5165\t-88.335246\t41.711293\tBoulder Hill CDP\tIL\tIllinois\tKendall County\t8539\t36.0\t26.7\t23.9\t29237\t246120\t0.4751\t60538\tObama\t60538\t0.01531731\t60538.0\n5166\t-88.483104\t41.47886\tLisbon village\tIL\tIllinois\tKendall County\t295\t39.0\t19.2\t16.8\t25695\t289286\t0.4751\t60541\tObama\t60541\t0.0005291730000000001\t60541.0\n5167\t-88.448252\t41.646531\tYorkville city\tIL\tIllinois\tKendall County\t11296\t35.8\t27.0\t9.6\t30881\t317294\t0.4751\t60560\tObama\t60560\t0.020262834\t60560.0\n5168\t-88.333078\t41.692792\tOswego village\tIL\tIllinois\tKendall County\t21113\t35.0\t35.6\t11.3\t33774\t329101\t0.4751\t60543\tObama\t60543\t0.037872628\t60543.0\n5169\t-88.579912\t41.536229\tNewark village\tIL\tIllinois\tKendall County\t1505\t39.5\t17.0\t8.9\t26648\t246842\t0.4751\t60537\tObama\t60537\t0.002699678\t60537.0\n5170\t-88.521096\t41.667398\tPlano city\tIL\tIllinois\tKendall County\t7650\t34.4\t17.1\t11.2\t23186\t228789\t0.4751\t60545\tObama\t60545\t0.013722617\t60545.0\n5171\t-88.59729499999999\t41.562057\tMillington village\tIL\tIllinois\tKendall County\t524\t35.5\t15.7\t11.3\t24060\t212500\t0.4751\t60537\tObama\t60537\t0.0009399539999999999\t60537.0\n5172\t-90.400943\t40.803614\tAbingdon city\tIL\tIllinois\tKnox County\t3312\t40.1\t10.3\t14.4\t20213\t70000\t0.5778\t61410\tObama\t61410\t0.005941086\t61410.0\n5173\t-90.09531\t41.033319\tVictoria village\tIL\tIllinois\tKnox County\t305\t42.7\t8.5\t10.4\t17990\t103846\t0.5778\t61485\tObama\t61485\t0.000547111\t61485.0\n5174\t-90.013817\t40.777449\tYates City village\tIL\tIllinois\tKnox County\t738\t41.3\t10.9\t4.9\t20500\t92424\t0.5778\t61572\tObama\t61572\t0.0013238289999999999\t61572.0\n5175\t-90.22470200000001\t41.072326000000004\tOneida city\tIL\tIllinois\tKnox County\t632\t41.1\t25.3\t6.0\t23496\t86000\t0.5778\t61467\tObama\t61467\t0.001133685\t61467.0\n5176\t-90.28495\t40.906723\tKnoxville city\tIL\tIllinois\tKnox County\t3002\t44.0\t16.8\t9.6\t24847\t98882\t0.5778\t61448\tObama\t61448\t0.0053850059999999995\t61448.0\n5177\t-90.018179\t40.926635\tWilliamsfield village\tIL\tIllinois\tKnox County\t509\t40.9\t13.4\t7.9\t19639\t85667\t0.5778\t61489\tObama\t61489\t0.000913047\t61489.0\n5178\t-90.398993\t41.109257\tRio village\tIL\tIllinois\tKnox County\t233\t43.3\t26.8\t2.9\t19113\t108523\t0.5778\t61472\tObama\t61472\t0.000417957\t61472.0\n5179\t-90.353835\t41.023753\tHenderson village\tIL\tIllinois\tKnox County\t305\t49.3\t23.4\t15.1\t27592\t118421\t0.5778\t61439\tObama\t61439\t0.000547111\t61439.0\n5180\t-90.16493\t41.115521\tAltona village\tIL\tIllinois\tKnox County\t470\t41.5\t15.7\t4.0\t18705\t75769\t0.5778\t61414\tObama\t61414\t0.000843089\t61414.0\n5181\t-90.163119\t40.798014\tMaquon village\tIL\tIllinois\tKnox County\t264\t40.4\t12.4\t5.7\t21476\t68571\t0.5778\t61458\tObama\t61458\t0.000473565\t61458.0\n5182\t-90.311099\t40.943069\tEast Galesburg village\tIL\tIllinois\tKnox County\t932\t45.7\t26.9\t7.2\t32162\t96429\t0.5778\t61430\tObama\t61430\t0.001671827\t61430.0\n5183\t-90.275441\t41.025399\tWataga village\tIL\tIllinois\tKnox County\t722\t36.9\t14.0\t12.9\t23880\t83571\t0.5778\t61488\tObama\t61488\t0.001295128\t61488.0\n5184\t-90.40679899999999\t40.721134\tSt. Augustine village\tIL\tIllinois\tKnox County\t141\t40.0\t5.3\t6.8\t19903\t60000\t0.5778\t61474\tObama\t61474\t0.000252927\t61474.0\n5185\t-90.378642\t40.951352\tGalesburg city\tIL\tIllinois\tKnox County\t31852\t39.1\t18.0\t11.4\t21708\t81162\t0.5778\t61401\tObama\t61401\t0.057136312\t61401.0\n5186\t-87.82712\t42.480243\tWinthrop Harbor village\tIL\tIllinois\tLake County\t7041\t38.7\t22.2\t10.8\t29979\t188721\t0.5348\t60096\tObama\t60096\t0.012630188999999998\t60096.0\n5187\t-88.16317099999999\t42.331713\tVolo village\tIL\tIllinois\tLake County\t1981\t38.2\t37.1\t6.7\t36977\t250633\t0.5348\t60041\tObama\t60041\t0.00355353\t60041.0\n5188\t-87.978114\t42.430828000000005\tOld Mill Creek village\tIL\tIllinois\tLake County\t275\t37.4\t49.4\t11.5\t49436\t371429\t0.5348\t60083\tObama\t60083\t0.000493297\t60083.0\n5189\t-87.983013\t42.352074\tGages Lake CDP\tIL\tIllinois\tLake County\t10958\t36.0\t44.5\t7.7\t34198\t229570\t0.5348\t60030\tObama\t60030\t0.019656527\t60030.0\n5190\t-87.859368\t42.317575\tNorth Chicago city\tIL\tIllinois\tLake County\t33626\t22.9\t15.7\t19.3\t17976\t138526\t0.5348\t60088\tObama\t60088\t0.060318524000000005\t60088.0\n5191\t-87.810362\t42.182590999999995\tHighland Park city\tIL\tIllinois\tLake County\t31777\t42.2\t67.1\t7.9\t60990\t525622\t0.5348\t60035\tObama\t60035\t0.057001777000000003\t60035.0\n5192\t-88.08796600000001\t42.195060999999995\tLake Zurich village\tIL\tIllinois\tLake County\t20692\t38.0\t48.8\t7.2\t42219\t331901\t0.5348\t60047\tObama\t60047\t0.037117436000000004\t60047.0\n5193\t-87.93904599999999\t42.371093\tGurnee village\tIL\tIllinois\tLake County\t31665\t35.6\t49.7\t8.0\t38094\t263882\t0.5348\t60031\tObama\t60031\t0.056800870999999996\t60031.0\n5194\t-88.052647\t42.207338\tForest Lake CDP\tIL\tIllinois\tLake County\t1784\t38.6\t49.8\t5.6\t41763\t281696\t0.5348\t60047\tObama\t60047\t0.00320015\t60047.0\n5195\t-87.879369\t42.425119\tBeach Park village\tIL\tIllinois\tLake County\t11164\t39.5\t19.9\t10.9\t28988\t165192\t0.5348\t60087\tObama\t60087\t0.020026051\t60087.0\n5196\t-88.081649\t42.324303\tRound Lake Park village\tIL\tIllinois\tLake County\t7022\t36.0\t21.5\t15.4\t27530\t182088\t0.5348\t60073\tObama\t60073\t0.012596106999999999\t60073.0\n5197\t-87.92574300000001\t42.442161999999996\tWadsworth village\tIL\tIllinois\tLake County\t3750\t44.5\t38.9\t6.4\t40417\t331420\t0.5348\t60083\tObama\t60083\t0.006726773\t60083.0\n5198\t-87.914377\t42.298063\tGreen Oaks village\tIL\tIllinois\tLake County\t3715\t38.8\t66.4\t8.1\t60138\t504727\t0.5348\t60048\tObama\t60048\t0.00666399\t60048.0\n5199\t-87.869878\t42.193431\tBannockburn village\tIL\tIllinois\tLake County\t1349\t24.4\t74.0\t12.3\t44963\t772436\t0.5348\t60015\tObama\t60015\t0.002419844\t60015.0\n5200\t-88.083288\t42.417642\tLake Villa village\tIL\tIllinois\tLake County\t7383\t33.3\t37.0\t9.1\t31650\t232150\t0.5348\t60046\tObama\t60046\t0.013243671\t60046.0\n5201\t-88.042461\t42.3987\tVenetian Village CDP\tIL\tIllinois\tLake County\t3168\t34.0\t33.3\t10.4\t31118\t203802\t0.5348\t60046\tObama\t60046\t0.005682778\t60046.0\n5202\t-87.960893\t42.174675\tBuffalo Grove village\tIL\tIllinois\tLake County\t43850\t40.5\t60.1\t7.3\t42933\t296248\t0.5348\t60089\tObama\t60089\t0.078658398\t60089.0\n5203\t-88.103886\t42.385757\tRound Lake Heights village\tIL\tIllinois\tLake County\t2073\t31.9\t20.5\t10.1\t26109\t144201\t0.5348\t60073\tObama\t60073\t0.00371856\t60073.0\n5204\t-88.08116\t42.379047\tRound Lake Beach village\tIL\tIllinois\tLake County\t28288\t29.8\t17.7\t11.4\t22414\t158587\t0.5348\t60073\tObama\t60073\t0.050743187\t60073.0\n5205\t-88.050821\t42.179520000000004\tKildeer village\tIL\tIllinois\tLake County\t4044\t41.0\t63.8\t6.8\t62396\t602126\t0.5348\t60047\tObama\t60047\t0.007254152\t60047.0\n5206\t-88.167407\t42.214315\tLake Barrington village\tIL\tIllinois\tLake County\t5505\t54.9\t60.1\t9.8\t64982\t400287\t0.5348\t60021\tObama\t60021\t0.009874903\t60021.0\n5207\t-88.15028000000001\t42.484441\tChannel Lake CDP\tIL\tIllinois\tLake County\t1864\t43.1\t20.9\t6.2\t31410\t187329\t0.5348\t60002\tObama\t60002\t0.003343655\t60002.0\n5208\t-87.851012\t42.282464000000004\tLake Bluff village\tIL\tIllinois\tLake County\t6203\t39.1\t72.6\t7.7\t55541\t625791\t0.5348\t60044\tObama\t60044\t0.011126978999999999\t60044.0\n5209\t-87.89154599999999\t42.352064\tPark City\tIL\tIllinois\tLake County\t6901\t30.3\t19.3\t14.4\t22285\t27857\t0.5348\t60085\tObama\t60085\t0.012379056000000001\t60085.0\n5210\t-88.126977\t42.487322\tLake Catherine CDP\tIL\tIllinois\tLake County\t1501\t37.3\t21.1\t7.2\t30544\t215244\t0.5348\t60002\tObama\t60002\t0.0026925029999999997\t60002.0\n5211\t-88.033153\t42.34452\tGrayslake village\tIL\tIllinois\tLake County\t23020\t32.4\t51.6\t8.1\t35707\t248536\t0.5348\t60030\tObama\t60030\t0.041293417\t60030.0\n5212\t-87.961292\t42.234453\tVernon Hills village\tIL\tIllinois\tLake County\t24851\t36.0\t59.0\t9.1\t41529\t280762\t0.5348\t60061\tObama\t60061\t0.044577875999999995\t60061.0\n5213\t-88.078062\t42.474792\tAntioch village\tIL\tIllinois\tLake County\t13063\t36.4\t28.7\t8.6\t32054\t225921\t0.5348\t60002\tObama\t60002\t0.023432489\t60002.0\n5214\t-88.14986400000001\t42.269161\tWauconda village\tIL\tIllinois\tLake County\t10796\t39.6\t27.6\t9.9\t32468\t204894\t0.5348\t60084\tObama\t60084\t0.019365931\t60084.0\n5215\t-87.81354499999999\t42.205721999999994\tHighwood city\tIL\tIllinois\tLake County\t6097\t31.3\t37.0\t7.3\t24110\t355844\t0.5348\t60040\tObama\t60040\t0.010936836\t60040.0\n5216\t-88.06076\t42.226257000000004\tHawthorn Woods village\tIL\tIllinois\tLake County\t6917\t41.6\t58.6\t5.8\t62769\t534012\t0.5348\t60047\tObama\t60047\t0.012407757\t60047.0\n5217\t-88.081804\t42.165858\tDeer Park village\tIL\tIllinois\tLake County\t3133\t41.1\t58.9\t7.9\t51518\t435514\t0.5348\t60047\tObama\t60047\t0.005619995\t60047.0\n5218\t-88.13136999999999\t42.207819\tNorth Barrington village\tIL\tIllinois\tLake County\t3143\t45.4\t66.4\t10.7\t69873\t635702\t0.5348\t60010\tObama\t60010\t0.005637933\t60010.0\n5219\t-88.005984\t42.195606\tLong Grove village\tIL\tIllinois\tLake County\t7622\t42.9\t64.0\t6.5\t62758\t624420\t0.5348\t60089\tObama\t60089\t0.01367239\t60089.0\n5220\t-88.027856\t42.419657\tLindenhurst village\tIL\tIllinois\tLake County\t14994\t35.0\t42.4\t8.8\t34171\t231527\t0.5348\t60046\tObama\t60046\t0.026896329\t60046.0\n5221\t-87.91797\t42.19587\tLincolnshire village\tIL\tIllinois\tLake County\t7491\t45.7\t70.9\t9.5\t68302\t591191\t0.5348\t60069\tObama\t60069\t0.013437402\t60069.0\n5222\t-88.126345\t42.376571000000006\tLong Lake CDP\tIL\tIllinois\tLake County\t3438\t36.3\t16.1\t14.3\t26862\t164729\t0.5348\t600HH\tObama\t600HH\t0.006167105\t0.0\n5223\t-88.186423\t42.245859\tFox River Valley Gardens village\tIL\tIllinois\tLake County\t1393\t36.8\t32.0\t7.9\t44379\t285088\t0.5348\t60042\tObama\t60042\t0.0024987720000000002\t60042.0\n5224\t-88.15519\t42.230866999999996\tTower Lakes village\tIL\tIllinois\tLake County\t1343\t45.6\t66.3\t10.5\t61264\t525763\t0.5348\t60084\tObama\t60084\t0.0024090820000000003\t60084.0\n5225\t-88.008142\t42.36804\tThird Lake village\tIL\tIllinois\tLake County\t1495\t32.7\t58.2\t6.9\t40111\t287946\t0.5348\t60030\tObama\t60030\t0.00268174\t60030.0\n5226\t-88.004799\t42.268931\tMundelein village\tIL\tIllinois\tLake County\t33235\t33.7\t43.0\t9.8\t32752\t218631\t0.5348\t60060\tObama\t60060\t0.059617145999999996\t60060.0\n5227\t-88.129861\t42.352765999999995\tRound Lake village\tIL\tIllinois\tLake County\t11557\t35.0\t27.6\t10.3\t32569\t181683\t0.5348\t600HH\tObama\t600HH\t0.020731017\t0.0\n5228\t-87.986665\t42.392509999999994\tGrandwood Park CDP\tIL\tIllinois\tLake County\t4951\t35.0\t49.5\t13.0\t46459\t242604\t0.5348\t60031\tObama\t60031\t0.008881134\t60031.0\n5229\t-87.844339\t42.456244\tZion city\tIL\tIllinois\tLake County\t24518\t31.2\t19.5\t14.6\t23038\t155702\t0.5348\t60099\tObama\t60099\t0.043980538\t60099.0\n5230\t-87.91942\t42.244748\tMettawa village\tIL\tIllinois\tLake County\t420\t46.2\t58.6\t8.6\t70724\t629310\t0.5348\t60061\tObama\t60061\t0.000753399\t60061.0\n5231\t-87.850732\t42.167273\tDeerfield village\tIL\tIllinois\tLake County\t18923\t42.0\t72.8\t7.5\t58226\t462975\t0.5348\t60015\tObama\t60015\t0.033944193\t60015.0\n5232\t-88.176046\t42.469157\tFox Lake village\tIL\tIllinois\tLake County\t10787\t39.1\t17.6\t9.6\t29719\t163248\t0.5348\t60081\tObama\t60081\t0.019349787\t60081.0\n5233\t-88.068939\t42.341671999999996\tHainesville village\tIL\tIllinois\tLake County\t3105\t30.5\t41.5\t10.4\t30166\t219655\t0.5348\t60030\tObama\t60030\t0.005569768\t60030.0\n5234\t-87.869411\t42.371311999999996\tWaukegan city\tIL\tIllinois\tLake County\t94402\t30.1\t18.5\t17.4\t20214\t150867\t0.5348\t60085\tObama\t60085\t0.169338885\t60085.0\n5235\t-87.966813\t42.286858\tLibertyville village\tIL\tIllinois\tLake County\t21688\t41.9\t61.5\t7.4\t50060\t372396\t0.5348\t60048\tObama\t60048\t0.038904067\t60048.0\n5236\t-87.89517\t42.172413\tRiverwoods village\tIL\tIllinois\tLake County\t3889\t43.7\t73.5\t8.2\t63473\t647577\t0.5348\t60015\tObama\t60015\t0.006976112\t60015.0\n5237\t-87.977987\t42.227289\tIndian Creek village\tIL\tIllinois\tLake County\t190\t31.4\t52.5\t5.3\t28071\t283333\t0.5348\t60061\tObama\t60061\t0.000340823\t60061.0\n5238\t-88.126692\t42.412214\tFox Lake Hills CDP\tIL\tIllinois\tLake County\t2678\t40.1\t27.9\t15.6\t33454\t181621\t0.5348\t600HH\tObama\t600HH\t0.004803813\t0.0\n5239\t-87.859658\t42.238121\tLake Forest city\tIL\tIllinois\tLake County\t20594\t43.7\t76.9\t7.7\t73859\t845115\t0.5348\t60045\tObama\t60045\t0.036941642999999996\t60045.0\n5240\t-89.12603\t41.265132\tCedar Point village\tIL\tIllinois\tLa Salle County\t264\t44.6\t21.7\t13.0\t28213\t119318\t0.4882\t61316\tObama\t61316\t0.000473565\t61316.0\n5241\t-88.831213\t41.2361\tGrand Ridge village\tIL\tIllinois\tLa Salle County\t537\t39.5\t17.2\t13.1\t21173\t124167\t0.4882\t61325\tObama\t61325\t0.000963274\t61325.0\n5242\t-89.068851\t41.346196\tLa Salle city\tIL\tIllinois\tLa Salle County\t9773\t38.1\t16.1\t12.7\t23045\t107547\t0.4882\t61301\tObama\t61301\t0.017530867\t61301.0\n5243\t-88.685257\t41.523726\tSheridan village\tIL\tIllinois\tLa Salle County\t2181\t31.1\t5.7\t10.3\t18411\t144542\t0.4882\t60551\tObama\t60551\t0.003912291\t60551.0\n5244\t-88.81938199999999\t41.12627\tStreator city\tIL\tIllinois\tLa Salle County\t13667\t39.9\t11.5\t15.6\t21955\t82175\t0.4882\t61364\tObama\t61364\t0.024515948\t61364.0\n5245\t-88.92334\t41.587990999999995\tEarlville city\tIL\tIllinois\tLa Salle County\t1879\t37.6\t14.8\t13.3\t19705\t136184\t0.4882\t60518\tObama\t60518\t0.003370562\t60518.0\n5246\t-88.654147\t41.158214\tRansom village\tIL\tIllinois\tLa Salle County\t425\t43.8\t14.3\t8.3\t23369\t122024\t0.4882\t60470\tObama\t60470\t0.000762368\t60470.0\n5247\t-89.13023100000001\t41.343301000000004\tPeru city\tIL\tIllinois\tLa Salle County\t10163\t43.2\t19.5\t12.8\t26269\t129316\t0.4882\t61354\tObama\t61354\t0.018230452\t61354.0\n5248\t-89.114448\t41.552083\tMendota city\tIL\tIllinois\tLa Salle County\t7325\t38.1\t15.7\t13.8\t23615\t131667\t0.4882\t61342\tObama\t61342\t0.01313963\t61342.0\n5249\t-88.57740799999999\t41.309855999999996\tSeneca village\tIL\tIllinois\tLa Salle County\t2112\t40.2\t14.7\t12.4\t25457\t150164\t0.4882\t61360\tObama\t61360\t0.003788519\t61360.0\n5250\t-88.87419399999999\t41.146551\tKangley village\tIL\tIllinois\tLa Salle County\t276\t44.7\t13.1\t9.3\t24089\t111905\t0.4882\t61364\tObama\t61364\t0.00049509\t61364.0\n5251\t-88.79832900000001\t41.615902\tLeland village\tIL\tIllinois\tLa Salle County\t992\t40.1\t18.1\t10.7\t21669\t173171\t0.4882\t60531\tObama\t60531\t0.001779456\t60531.0\n5252\t-88.878773\t41.331773999999996\tNaplate village\tIL\tIllinois\tLa Salle County\t524\t39.4\t10.5\t16.6\t24791\t121371\t0.4882\t61350\tObama\t61350\t0.0009399539999999999\t61350.0\n5253\t-88.838205\t41.35187\tOttawa city\tIL\tIllinois\tLa Salle County\t18333\t40.7\t19.3\t14.7\t23923\t132821\t0.4882\t61350\tObama\t61350\t0.032885847\t61350.0\n5254\t-89.069608\t41.214914\tTonica village\tIL\tIllinois\tLa Salle County\t674\t43.6\t14.8\t7.5\t23256\t120739\t0.4882\t61370\tObama\t61370\t0.001209025\t61370.0\n5255\t-88.950048\t40.956486\tDana village\tIL\tIllinois\tLa Salle County\t168\t39.4\t12.2\t12.5\t18351\t70000\t0.4882\t61321\tObama\t61321\t0.000301359\t61321.0\n5256\t-89.081562\t41.465711999999996\tTroy Grove village\tIL\tIllinois\tLa Salle County\t342\t39.1\t17.4\t10.1\t25107\t142788\t0.4882\t61372\tObama\t61372\t0.0006134819999999999\t61372.0\n5257\t-89.06940300000001\t41.296009000000005\tOglesby city\tIL\tIllinois\tLa Salle County\t3622\t42.4\t13.4\t11.8\t24196\t109232\t0.4882\t61348\tObama\t61348\t0.0064971659999999995\t61348.0\n5258\t-89.06125899999999\t41.140183\tLostant village\tIL\tIllinois\tLa Salle County\t478\t41.0\t15.2\t6.1\t25687\t113068\t0.4882\t61334\tObama\t61334\t0.000857439\t61334.0\n5259\t-88.683999\t41.321177\tMarseilles city\tIL\tIllinois\tLa Salle County\t4874\t39.1\t11.5\t12.5\t23273\t118889\t0.4882\t61341\tObama\t61341\t0.008743011\t61341.0\n5260\t-89.03962\t40.984575\tRutland village\tIL\tIllinois\tLa Salle County\t347\t39.4\t12.7\t12.1\t18391\t76250\t0.4882\t61358\tObama\t61358\t0.000622451\t61358.0\n5261\t-89.01309\t41.342129\tNorth Utica village\tIL\tIllinois\tLa Salle County\t1046\t42.4\t16.6\t10.1\t26235\t143590\t0.4882\t61373\tObama\t61373\t0.001876321\t61373.0\n5262\t-88.982176\t41.188893\tLeonore village\tIL\tIllinois\tLa Salle County\t109\t45.0\t11.3\t12.3\t22203\t98750\t0.4882\t61332\tObama\t61332\t0.000195525\t61332.0\n5263\t-87.86196600000001\t38.717486\tSumner city\tIL\tIllinois\tLawrence County\t1377\t37.7\t7.0\t11.1\t16146\t54457\t0.3358\t62466\tObama\t62466\t0.002470071\t62466.0\n5264\t-87.688916\t38.728096\tLawrenceville city\tIL\tIllinois\tLawrence County\t5324\t40.8\t15.6\t11.7\t19444\t56867\t0.3358\t62439\tObama\t62439\t0.009550224\t62439.0\n5265\t-87.529946\t38.819819\tRussellville village\tIL\tIllinois\tLawrence County\t108\t44.2\t16.9\t6.1\t24889\t90000\t0.3358\t62427\tObama\t62427\t0.000193731\t62427.0\n5266\t-87.64745699999999\t38.591852\tSt. Francisville city\tIL\tIllinois\tLawrence County\t705\t41.8\t6.8\t11.4\t15768\t44074\t0.3358\t62460\tObama\t62460\t0.001264633\t62460.0\n5267\t-87.670103\t38.837565000000005\tBirds village\tIL\tIllinois\tLawrence County\t49\t44.2\t11.4\t11.1\t17136\t80000\t0.3358\t62427\tObama\t62427\t8.79e-05\t62427.0\n5268\t-87.758934\t38.70947\tBridgeport city\tIL\tIllinois\tLawrence County\t2300\t40.3\t6.0\t10.5\t16730\t58214\t0.3358\t62417\tObama\t62417\t0.004125754000000001\t62417.0\n5269\t-89.147305\t41.692802\tWest Brooklyn village\tIL\tIllinois\tLee County\t178\t41.3\t7.6\t5.0\t21396\t123438\t0.4534\t61378\tObama\t61378\t0.000319297\t61378.0\n5270\t-88.980528\t41.687501\tPaw Paw village\tIL\tIllinois\tLee County\t828\t42.4\t9.4\t8.0\t20231\t142548\t0.4534\t61353\tObama\t61353\t0.001485271\t61353.0\n5271\t-89.222435\t41.868207\tAshton village\tIL\tIllinois\tLee County\t1106\t36.9\t12.0\t13.3\t20982\t120139\t0.4534\t61006\tObama\t61006\t0.00198395\t61006.0\n5272\t-89.300584\t41.84138\tFranklin Grove village\tIL\tIllinois\tLee County\t988\t40.3\t15.5\t11.4\t24576\t118077\t0.4534\t61031\tObama\t61031\t0.00177228\t61031.0\n5273\t-89.478616\t41.846752\tDixon city\tIL\tIllinois\tLee County\t15220\t38.8\t13.0\t13.3\t23300\t110392\t0.4534\t61021\tObama\t61021\t0.027301729\t61021.0\n5274\t-89.556151\t41.719396\tHarmon village\tIL\tIllinois\tLee County\t143\t46.2\t15.1\t9.1\t25550\t129167\t0.4534\t61042\tObama\t61042\t0.000256514\t61042.0\n5275\t-89.020255\t41.848399\tSteward village\tIL\tIllinois\tLee County\t297\t38.2\t18.8\t7.9\t25836\t176563\t0.4534\t60553\tObama\t60553\t0.00053276\t60553.0\n5276\t-89.603523\t41.795944\tNelson village\tIL\tIllinois\tLee County\t156\t47.5\t10.1\t11.9\t21886\t95000\t0.4534\t61071\tObama\t61071\t0.000279834\t61071.0\n5277\t-89.333433\t41.716522\tAmboy city\tIL\tIllinois\tLee County\t2437\t37.3\t8.8\t19.5\t19673\t109932\t0.4534\t61310\tObama\t61310\t0.004371505\t61310.0\n5278\t-89.086242\t41.694012\tCompton village\tIL\tIllinois\tLee County\t328\t39.7\t9.2\t8.0\t22798\t149107\t0.4534\t61318\tObama\t61318\t0.000588368\t61318.0\n5279\t-89.231199\t41.643719\tSublette village\tIL\tIllinois\tLee County\t430\t41.1\t7.7\t9.7\t26169\t135870\t0.4534\t61367\tObama\t61367\t0.000771337\t61367.0\n5280\t-88.52234399999999\t41.002064000000004\tOdell village\tIL\tIllinois\tLivingston County\t1091\t37.2\t14.6\t12.8\t23974\t113462\t0.3338\t60460\tObama\t60460\t0.001957042\t60460.0\n5281\t-88.86000899999999\t40.877190999999996\tFlanagan village\tIL\tIllinois\tLivingston County\t979\t46.4\t24.0\t11.5\t26541\t111232\t0.3338\t61740\tObama\t61740\t0.0017561360000000002\t61740.0\n5282\t-88.357761\t40.970154\tEmington village\tIL\tIllinois\tLivingston County\t122\t40.4\t13.1\t8.6\t23368\t137500\t0.3338\t60934\tObama\t60934\t0.00021884400000000002\t60934.0\n5283\t-88.39896800000001\t40.652496\tStrawn village\tIL\tIllinois\tLivingston County\t102\t36.4\t20.3\t4.7\t23766\t128571\t0.3338\t61775\tObama\t61775\t0.000182968\t61775.0\n5284\t-88.64259\t40.876279\tPontiac city\tIL\tIllinois\tLivingston County\t11112\t36.7\t17.6\t12.4\t23199\t101453\t0.3338\t61764\tObama\t61764\t0.019932774\t61764.0\n5285\t-88.294499\t40.752624\tChatsworth town\tIL\tIllinois\tLivingston County\t1145\t41.6\t10.1\t11.7\t21042\t79405\t0.3338\t60921\tObama\t60921\t0.0020539079999999997\t60921.0\n5286\t-88.729391\t40.992246\tCornell village\tIL\tIllinois\tLivingston County\t627\t39.2\t10.8\t10.5\t25046\t77647\t0.3338\t61319\tObama\t61319\t0.001124716\t61319.0\n5287\t-88.406049\t40.893167\tSaunemin village\tIL\tIllinois\tLivingston County\t420\t38.2\t11.5\t17.0\t20565\t95500\t0.3338\t61769\tObama\t61769\t0.000753399\t61769.0\n5288\t-88.893399\t41.005043\tLong Point village\tIL\tIllinois\tLivingston County\t243\t44.9\t20.0\t9.2\t22734\t116667\t0.3338\t61333\tObama\t61333\t0.000435895\t61333.0\n5289\t-88.26993900000001\t40.87816\tCullom village\tIL\tIllinois\tLivingston County\t497\t41.8\t12.3\t10.2\t18877\t94091\t0.3338\t60929\tObama\t60929\t0.000891522\t60929.0\n5290\t-88.409492\t40.749827\tForrest village\tIL\tIllinois\tLivingston County\t1115\t36.9\t17.8\t11.6\t21613\t103734\t0.3338\t61741\tObama\t61741\t0.002000094\t61741.0\n5291\t-88.416764\t41.114177000000005\tDwight village\tIL\tIllinois\tLivingston County\t4340\t36.8\t13.3\t13.0\t24399\t130663\t0.3338\t60420\tObama\t60420\t0.007785119\t60420.0\n5292\t-88.307286\t41.024777\tCampus village\tIL\tIllinois\tLivingston County\t148\t40.3\t12.9\t8.3\t23280\t137500\t0.3338\t60920\tObama\t60920\t0.000265483\t60920.0\n5293\t-88.512396\t40.746421999999995\tFairbury city\tIL\tIllinois\tLivingston County\t3698\t39.2\t18.9\t7.4\t23403\t124252\t0.3338\t61739\tObama\t61739\t0.006633495\t61739.0\n5294\t-89.485116\t40.297988000000004\tEmden village\tIL\tIllinois\tLogan County\t475\t41.3\t17.7\t5.0\t21502\t96750\t0.33\t62635\tObama\t62635\t0.000852058\t62635.0\n5295\t-89.591164\t40.100798\tMiddletown village\tIL\tIllinois\tLogan County\t424\t41.0\t14.9\t12.2\t23788\t89286\t0.33\t62666\tObama\t62666\t0.000760574\t62666.0\n5296\t-89.441321\t40.250728\tHartsburg village\tIL\tIllinois\tLogan County\t342\t38.3\t20.5\t7.1\t21811\t119792\t0.33\t62643\tObama\t62643\t0.0006134819999999999\t62643.0\n5297\t-89.231256\t40.263806\tAtlanta city\tIL\tIllinois\tLogan County\t1507\t38.9\t17.2\t7.8\t23570\t109231\t0.33\t61723\tObama\t61723\t0.0027032659999999997\t61723.0\n5298\t-89.480026\t40.017439\tElkhart village\tIL\tIllinois\tLogan County\t396\t41.2\t21.0\t3.7\t22695\t108929\t0.33\t62634\tObama\t62634\t0.000710347\t62634.0\n5299\t-89.58312099999999\t40.183304\tNew Holland village\tIL\tIllinois\tLogan County\t287\t38.1\t17.5\t7.1\t21313\t101786\t0.33\t62671\tObama\t62671\t0.000514822\t62671.0\n5300\t-89.44305899999999\t40.066974\tBroadwell village\tIL\tIllinois\tLogan County\t165\t33.1\t3.9\t10.7\t18008\t107500\t0.33\t62634\tObama\t62634\t0.000295978\t62634.0\n5301\t-89.369161\t40.1506\tLincoln city\tIL\tIllinois\tLogan County\t14914\t39.0\t18.7\t11.1\t24197\t102572\t0.33\t62656\tObama\t62656\t0.026752823999999998\t62656.0\n5302\t-89.283783\t40.010162\tMount Pulaski city\tIL\tIllinois\tLogan County\t1641\t44.1\t19.8\t5.0\t21659\t104479\t0.33\t62548\tObama\t62548\t0.002943636\t62548.0\n5303\t-89.162052\t39.966995000000004\tLatham village\tIL\tIllinois\tLogan County\t355\t43.8\t17.4\t5.1\t28131\t97647\t0.33\t62543\tObama\t62543\t0.000636801\t62543.0\n5304\t-90.675472\t40.557463\tGood Hope village\tIL\tIllinois\tMcDonough County\t382\t42.7\t23.7\t5.6\t21051\t85000\t0.4791\t61438\tObama\t61438\t0.000685234\t61438.0\n5305\t-90.792244\t40.427331\tColchester city\tIL\tIllinois\tMcDonough County\t1416\t43.9\t12.2\t7.5\t18766\t60283\t0.4791\t62326\tObama\t62326\t0.002540029\t62326.0\n5306\t-90.868091\t40.554159000000006\tBlandinsville village\tIL\tIllinois\tMcDonough County\t591\t44.1\t12.3\t7.5\t19945\t62857\t0.4791\t61420\tObama\t61420\t0.0010601389999999999\t61420.0\n5307\t-90.674521\t40.464991\tMacomb city\tIL\tIllinois\tMcDonough County\t19582\t24.6\t41.8\t10.9\t19053\t92939\t0.4791\t61455\tObama\t61455\t0.035126311\t61455.0\n5308\t-90.747946\t40.562401\tSciota village\tIL\tIllinois\tMcDonough County\t58\t45.0\t23.1\t5.4\t18763\t90000\t0.4791\t61475\tObama\t61475\t0.000104041\t61475.0\n5309\t-90.563469\t40.496278000000004\tBardolph village\tIL\tIllinois\tMcDonough County\t229\t42.9\t12.3\t9.2\t17890\t85000\t0.4791\t61416\tObama\t61416\t0.00041078199999999994\t61416.0\n5310\t-90.836039\t40.411259\tTennessee village\tIL\tIllinois\tMcDonough County\t107\t46.5\t17.3\t10.2\t19640\t59167\t0.4791\t62326\tObama\t62326\t0.00019193700000000002\t62326.0\n5311\t-90.503713\t40.551448\tBushnell city\tIL\tIllinois\tMcDonough County\t2867\t38.6\t12.0\t15.1\t19024\t54880\t0.4791\t61422\tObama\t61422\t0.005142842\t61422.0\n5312\t-90.464952\t40.620909000000005\tPrairie City village\tIL\tIllinois\tMcDonough County\t454\t43.9\t19.6\t9.7\t18468\t49500\t0.4791\t61470\tObama\t61470\t0.000814388\t61470.0\n5313\t-90.608432\t40.326962\tIndustry village\tIL\tIllinois\tMcDonough County\t488\t43.7\t21.3\t5.9\t20781\t80000\t0.4791\t61440\tObama\t61440\t0.000875377\t61440.0\n5314\t-88.619887\t42.42419\tHarvard city\tIL\tIllinois\tMcHenry County\t9309\t32.0\t18.2\t17.0\t22178\t174541\t0.4468\t60033\tObama\t60033\t0.016698541\t60033.0\n5315\t-88.428392\t42.176328999999996\tHuntley village\tIL\tIllinois\tMcHenry County\t21753\t41.9\t29.0\t9.1\t33711\t288184\t0.4468\t60142\tObama\t60142\t0.039020664\t60142.0\n5316\t-88.312128\t42.168476\tAlgonquin village\tIL\tIllinois\tMcHenry County\t29636\t35.2\t40.5\t9.5\t37570\t287269\t0.4468\t60102\tObama\t60102\t0.053161238\t60102.0\n5317\t-88.543723\t42.234252000000005\tUnion village\tIL\tIllinois\tMcHenry County\t689\t40.0\t14.5\t6.8\t29802\t219681\t0.4468\t60180\tObama\t60180\t0.001235932\t60180.0\n5318\t-88.188626\t42.275259999999996\tIsland Lake village\tIL\tIllinois\tMcHenry County\t8931\t34.7\t27.6\t11.3\t32756\t199785\t0.4468\t60042\tObama\t60042\t0.016020482\t60042.0\n5319\t-88.27040699999999\t42.278935\tPrairie Grove village\tIL\tIllinois\tMcHenry County\t1858\t39.4\t34.8\t9.6\t39536\t291549\t0.4468\t60012\tObama\t60012\t0.003332892\t60012.0\n5320\t-88.305966\t42.395691\tRingwood village\tIL\tIllinois\tMcHenry County\t810\t38.7\t28.7\t9.4\t32052\t293182\t0.4468\t60072\tObama\t60072\t0.001452983\t60072.0\n5321\t-88.437775\t42.307997\tWoodstock city\tIL\tIllinois\tMcHenry County\t23774\t34.6\t27.3\t12.5\t30294\t220397\t0.4468\t60098\tObama\t60098\t0.042645947000000003\t60098.0\n5322\t-88.228126\t42.296695\tHoliday Hills village\tIL\tIllinois\tMcHenry County\t1009\t38.5\t16.4\t11.9\t31238\t186706\t0.4468\t60042\tObama\t60042\t0.00180995\t60042.0\n5323\t-88.29095799999999\t42.340428\tMcHenry city\tIL\tIllinois\tMcHenry County\t25410\t36.3\t24.8\t10.5\t31033\t214514\t0.4468\t60050\tObama\t60050\t0.045580613\t60050.0\n5324\t-88.36488299999999\t42.314458\tBull Valley village\tIL\tIllinois\tMcHenry County\t730\t38.3\t37.7\t9.5\t43508\t308333\t0.4468\t60012\tObama\t60012\t0.001309478\t60012.0\n5325\t-88.245427\t42.382358\tJohnsburg village\tIL\tIllinois\tMcHenry County\t7054\t40.5\t27.0\t9.4\t33735\t262115\t0.4468\t60050\tObama\t60050\t0.012653508\t60050.0\n5326\t-88.306742\t42.479141999999996\tRichmond village\tIL\tIllinois\tMcHenry County\t1686\t37.9\t30.9\t7.7\t36751\t246277\t0.4468\t60071\tObama\t60071\t0.003024357\t60071.0\n5327\t-88.240302\t42.247918\tOakwood Hills village\tIL\tIllinois\tMcHenry County\t2354\t38.4\t36.6\t9.1\t36250\t267689\t0.4468\t60013\tObama\t60013\t0.00422262\t60013.0\n5328\t-88.294732\t42.36755\tMcCullom Lake village\tIL\tIllinois\tMcHenry County\t1190\t35.3\t14.6\t11.8\t26155\t186429\t0.4468\t60072\tObama\t60072\t0.002134629\t60072.0\n5329\t-88.251266\t42.210966\tCary village\tIL\tIllinois\tMcHenry County\t18488\t35.9\t41.9\t10.8\t34319\t269655\t0.4468\t60013\tObama\t60013\t0.033163887\t60013.0\n5330\t-88.371939\t42.381817\tWonder Lake village\tIL\tIllinois\tMcHenry County\t1863\t38.0\t19.0\t8.6\t26549\t224008\t0.4468\t60097\tObama\t60097\t0.003341861\t60097.0\n5331\t-88.330717\t42.231551\tCrystal Lake city\tIL\tIllinois\tMcHenry County\t42516\t35.1\t40.6\t11.0\t34573\t243756\t0.4468\t60014\tObama\t60014\t0.07626546099999999\t60014.0\n5332\t-88.358533\t42.37833\tWonder Lake CDP\tIL\tIllinois\tMcHenry County\t8213\t35.2\t14.2\t12.9\t28023\t187026\t0.4468\t60097\tObama\t60097\t0.01473253\t60097.0\n5333\t-88.18404\t42.345621\tLakemoor village\tIL\tIllinois\tMcHenry County\t5568\t37.4\t19.8\t10.2\t31405\t216147\t0.4468\t60041\tObama\t60041\t0.009987912\t60041.0\n5334\t-88.382655\t42.221944\tLakewood village\tIL\tIllinois\tMcHenry County\t3635\t37.7\t49.7\t8.6\t46024\t314468\t0.4468\t60014\tObama\t60014\t0.006520485\t60014.0\n5335\t-88.194547\t42.19613\tFox River Grove village\tIL\tIllinois\tMcHenry County\t5092\t39.6\t35.2\t8.6\t37263\t265711\t0.4468\t60021\tObama\t60021\t0.009134061\t60021.0\n5336\t-88.431386\t42.470237\tHebron village\tIL\tIllinois\tMcHenry County\t1403\t34.8\t14.2\t10.4\t25086\t196212\t0.4468\t60034\tObama\t60034\t0.00251671\t60034.0\n5337\t-88.240113\t42.453563\tSpring Grove village\tIL\tIllinois\tMcHenry County\t5229\t35.4\t29.4\t7.7\t37839\t352113\t0.4468\t60081\tObama\t60081\t0.009379812\t60081.0\n5338\t-88.3867\t42.390665999999996\tGreenwood village\tIL\tIllinois\tMcHenry County\t291\t40.7\t20.6\t8.3\t26146\t232955\t0.4468\t60097\tObama\t60097\t0.0005219980000000001\t60097.0\n5339\t-88.383684\t42.191182\tLake in the Hills village\tIL\tIllinois\tMcHenry County\t30227\t31.4\t38.8\t9.2\t36407\t259991\t0.4468\t60142\tObama\t60142\t0.054221377\t60142.0\n5340\t-88.600639\t42.248128\tMarengo city\tIL\tIllinois\tMcHenry County\t7379\t35.5\t17.2\t12.0\t29415\t209506\t0.4468\t60152\tObama\t60152\t0.013236495\t60152.0\n5341\t-88.211653\t42.403186\tPistakee Highlands CDP\tIL\tIllinois\tMcHenry County\t4709\t38.9\t12.5\t10.7\t29721\t186913\t0.4468\t60020\tObama\t60020\t0.008447033\t60020.0\n5342\t-88.253676\t42.197722999999996\tTrout Valley village\tIL\tIllinois\tMcHenry County\t642\t44.6\t45.6\t8.0\t49041\t343902\t0.4468\t60013\tObama\t60013\t0.001151624\t60013.0\n5343\t-88.998269\t40.516655\tNormal town\tIL\tIllinois\tMcLean County\t50401\t24.3\t47.7\t9.8\t23111\t155854\t0.4345\t61761\tObama\t61761\t0.090409622\t61761.0\n5344\t-88.52619200000001\t40.340659\tBellflower village\tIL\tIllinois\tMcLean County\t420\t42.1\t20.1\t3.0\t24165\t85769\t0.4345\t61724\tObama\t61724\t0.000753399\t61724.0\n5345\t-89.170214\t40.315598\tMcLean village\tIL\tIllinois\tMcLean County\t841\t38.6\t13.0\t3.9\t27262\t102083\t0.4345\t61754\tObama\t61754\t0.001508591\t61754.0\n5346\t-88.78599100000001\t40.643840000000004\tLexington city\tIL\tIllinois\tMcLean County\t1799\t41.3\t25.1\t7.8\t24335\t126693\t0.4345\t61753\tObama\t61753\t0.003227057\t61753.0\n5347\t-88.988284\t40.607632\tHudson village\tIL\tIllinois\tMcLean County\t1551\t33.6\t35.2\t7.9\t27306\t155592\t0.4345\t61748\tObama\t61748\t0.002782193\t61748.0\n5348\t-88.763153\t40.339674\tLe Roy city\tIL\tIllinois\tMcLean County\t3294\t38.7\t24.7\t6.6\t25493\t131758\t0.4345\t61752\tObama\t61752\t0.0059087969999999995\t61752.0\n5349\t-88.89046\t40.398902\tDowns village\tIL\tIllinois\tMcLean County\t1198\t39.8\t35.3\t7.5\t26423\t149038\t0.4345\t61736\tObama\t61736\t0.00214898\t61736.0\n5350\t-89.175364\t40.52968\tDanvers village\tIL\tIllinois\tMcLean County\t1173\t34.9\t27.2\t9.2\t22112\t132218\t0.4345\t61732\tObama\t61732\t0.002104135\t61732.0\n5351\t-89.22055999999999\t40.434914\tStanford village\tIL\tIllinois\tMcLean County\t665\t33.5\t19.5\t14.9\t21238\t105357\t0.4345\t61774\tObama\t61774\t0.001192881\t61774.0\n5352\t-88.526388\t40.428171999999996\tSaybrook village\tIL\tIllinois\tMcLean County\t861\t42.8\t10.0\t2.9\t21559\t90909\t0.4345\t61770\tObama\t61770\t0.001544467\t61770.0\n5353\t-88.880139\t40.744141\tGridley village\tIL\tIllinois\tMcLean County\t1511\t38.0\t28.9\t13.0\t22578\t119176\t0.4345\t61744\tObama\t61744\t0.0027104409999999996\t61744.0\n5354\t-88.538315\t40.568228000000005\tAnchor village\tIL\tIllinois\tMcLean County\t176\t43.9\t21.0\t10.9\t25844\t125000\t0.4345\t61720\tObama\t61720\t0.00031571\t61720.0\n5355\t-88.96866\t40.478504\tBloomington city\tIL\tIllinois\tMcLean County\t70048\t33.7\t42.7\t8.1\t30458\t149155\t0.4345\t61704\tObama\t61704\t0.12565253099999998\t61704.0\n5356\t-88.97912099999999\t40.313486\tHeyworth village\tIL\tIllinois\tMcLean County\t2534\t34.8\t23.1\t4.3\t24491\t127800\t0.4345\t61745\tObama\t61745\t0.004545505\t61745.0\n5357\t-88.720287\t40.74407\tChenoa city\tIL\tIllinois\tMcLean County\t1711\t36.3\t18.7\t7.1\t20871\t95392\t0.4345\t61726\tObama\t61726\t0.003069202\t61726.0\n5358\t-88.616201\t40.56655\tColfax village\tIL\tIllinois\tMcLean County\t1029\t40.8\t19.5\t6.4\t24042\t90370\t0.4345\t61728\tObama\t61728\t0.001845826\t61728.0\n5359\t-89.132136\t40.58355\tCarlock village\tIL\tIllinois\tMcLean County\t546\t41.4\t34.8\t9.3\t25243\t156818\t0.4345\t61725\tObama\t61725\t0.0009794180000000001\t61725.0\n5360\t-88.63209599999999\t40.449357\tArrowsmith village\tIL\tIllinois\tMcLean County\t309\t39.3\t27.8\t8.7\t26263\t122222\t0.4345\t61722\tObama\t61722\t0.000554286\t61722.0\n5361\t-88.71449399999999\t40.542468\tCooksville village\tIL\tIllinois\tMcLean County\t214\t44.3\t21.6\t10.6\t25865\t118750\t0.4345\t61730\tObama\t61730\t0.000383875\t61730.0\n5362\t-88.716247\t40.449577000000005\tEllsworth village\tIL\tIllinois\tMcLean County\t281\t38.7\t28.1\t8.9\t26259\t121094\t0.4345\t61737\tObama\t61737\t0.00050406\t61737.0\n5363\t-88.900841\t40.563317\tTowanda village\tIL\tIllinois\tMcLean County\t513\t42.4\t29.0\t5.4\t28087\t134722\t0.4345\t61776\tObama\t61776\t0.0009202230000000001\t61776.0\n5364\t-88.996089\t39.707137\tMacon city\tIL\tIllinois\tMacon County\t1183\t42.6\t9.6\t13.3\t25466\t84868\t0.4659\t62544\tObama\t62544\t0.002122073\t62544.0\n5365\t-89.06125899999999\t39.842974\tHarristown village\tIL\tIllinois\tMacon County\t1281\t43.5\t14.0\t10.2\t23252\t93723\t0.4659\t62522\tObama\t62522\t0.002297866\t62522.0\n5366\t-88.96165699999999\t39.923685\tForsyth village\tIL\tIllinois\tMacon County\t3031\t45.1\t40.4\t6.7\t43393\t199808\t0.4659\t62535\tObama\t62535\t0.005437026\t62535.0\n5367\t-89.06166800000001\t39.93162\tWarrensburg village\tIL\tIllinois\tMacon County\t1282\t40.4\t23.5\t13.3\t26723\t110000\t0.4659\t62573\tObama\t62573\t0.002299659\t62573.0\n5368\t-88.932855\t39.85583\tDecatur city\tIL\tIllinois\tMacon County\t75837\t38.6\t20.1\t16.7\t23060\t80485\t0.4659\t62523\tObama\t62523\t0.136036874\t62523.0\n5369\t-88.818658\t39.985356\tArgenta village\tIL\tIllinois\tMacon County\t873\t39.3\t12.4\t13.0\t25883\t97738\t0.4659\t62501\tObama\t62501\t0.001565993\t62501.0\n5370\t-88.869445\t39.936928\tOreana village\tIL\tIllinois\tMacon County\t805\t42.7\t13.8\t11.6\t23274\t100174\t0.4659\t62554\tObama\t62554\t0.001444014\t62554.0\n5371\t-88.84626\t39.805035\tLong Creek village\tIL\tIllinois\tMacon County\t1370\t45.2\t17.4\t13.2\t26117\t116311\t0.4659\t62549\tObama\t62549\t0.002457514\t62549.0\n5372\t-88.89496700000001\t39.780348\tMount Zion village\tIL\tIllinois\tMacon County\t4793\t41.8\t24.5\t9.2\t27853\t124256\t0.4659\t62549\tObama\t62549\t0.008597713\t62549.0\n5373\t-89.118672\t39.700453\tBlue Mound village\tIL\tIllinois\tMacon County\t1158\t40.3\t16.9\t8.2\t24241\t84079\t0.4659\t62513\tObama\t62513\t0.002077227\t62513.0\n5374\t-88.955313\t40.037712\tMaroa city\tIL\tIllinois\tMacon County\t1590\t40.7\t14.5\t10.6\t25505\t85882\t0.4659\t61756\tObama\t61756\t0.002852152\t61756.0\n5375\t-89.16488100000001\t39.854369\tNiantic village\tIL\tIllinois\tMacon County\t700\t38.4\t14.5\t9.2\t21318\t92778\t0.4659\t62551\tObama\t62551\t0.0012556639999999999\t62551.0\n5376\t-90.0453\t39.120335\tShipman town\tIL\tIllinois\tMacoupin County\t690\t41.6\t16.4\t14.6\t20935\t96364\t0.4505\t62685\tObama\t62685\t0.001237726\t62685.0\n5377\t-89.881551\t39.27982\tCarlinville city\tIL\tIllinois\tMacoupin County\t5556\t41.2\t21.0\t9.7\t21479\t99954\t0.4505\t62626\tObama\t62626\t0.009966387\t62626.0\n5378\t-90.141867\t39.176328999999996\tMedora village\tIL\tIllinois\tMacoupin County\t490\t38.5\t8.6\t10.6\t17901\t85000\t0.4505\t62063\tObama\t62063\t0.000878965\t62063.0\n5379\t-89.801902\t39.078425\tSawyerville village\tIL\tIllinois\tMacoupin County\t299\t42.0\t13.9\t8.7\t18086\t80714\t0.4505\t62085\tObama\t62085\t0.0005363480000000001\t62085.0\n5380\t-89.728047\t39.072265\tMount Olive city\tIL\tIllinois\tMacoupin County\t2090\t40.7\t10.6\t15.3\t19467\t72835\t0.4505\t62069\tObama\t62069\t0.003749055\t62069.0\n5381\t-89.887684\t39.085836\tDorchester village\tIL\tIllinois\tMacoupin County\t137\t46.6\t13.3\t15.3\t20232\t82500\t0.4505\t62093\tObama\t62093\t0.000245751\t62093.0\n5382\t-90.03737\t39.355284999999995\tHettick village\tIL\tIllinois\tMacoupin County\t182\t43.3\t5.3\t14.0\t22747\t112500\t0.4505\t62649\tObama\t62649\t0.000326473\t62649.0\n5383\t-90.136222\t39.041117\tBrighton village\tIL\tIllinois\tMacoupin County\t2179\t38.9\t11.6\t10.6\t22159\t118707\t0.4505\t62012\tObama\t62012\t0.003908704\t62012.0\n5384\t-89.78921700000001\t39.011974\tStaunton city\tIL\tIllinois\tMacoupin County\t4955\t39.0\t15.8\t9.2\t22969\t102019\t0.4505\t62088\tObama\t62088\t0.008888309\t62088.0\n5385\t-89.770178\t39.524683\tVirden city\tIL\tIllinois\tMacoupin County\t3483\t41.4\t12.3\t12.6\t21711\t95192\t0.4505\t62689\tObama\t62689\t0.006247826999999999\t62689.0\n5386\t-89.960634\t39.111709999999995\tRoyal Lakes village\tIL\tIllinois\tMacoupin County\t203\t41.7\t9.1\t14.0\t18250\t119231\t0.4505\t62685\tObama\t62685\t0.00036414300000000004\t62685.0\n5387\t-89.807776\t39.399555\tNilwood town\tIL\tIllinois\tMacoupin County\t265\t42.9\t8.0\t7.7\t19850\t90000\t0.4505\t62672\tObama\t62672\t0.000475359\t62672.0\n5388\t-89.782044\t39.446664\tGirard city\tIL\tIllinois\tMacoupin County\t2162\t38.0\t13.7\t13.4\t20461\t92545\t0.4505\t62640\tObama\t62640\t0.003878209\t62640.0\n5389\t-89.81719100000001\t39.125857\tGillespie city\tIL\tIllinois\tMacoupin County\t3254\t40.3\t9.2\t12.1\t20964\t80899\t0.4505\t62033\tObama\t62033\t0.005837045\t62033.0\n5390\t-89.783624\t39.350369\tStandard City village\tIL\tIllinois\tMacoupin County\t152\t39.3\t8.8\t10.8\t17743\t78000\t0.4505\t62686\tObama\t62686\t0.000272659\t62686.0\n5391\t-89.995918\t39.434509999999996\tPalmyra village\tIL\tIllinois\tMacoupin County\t699\t45.5\t9.1\t18.4\t18979\t56607\t0.4505\t62674\tObama\t62674\t0.00125387\t62674.0\n5392\t-89.80229399999999\t39.093013\tBenld city\tIL\tIllinois\tMacoupin County\t1455\t39.7\t12.1\t15.4\t19315\t68534\t0.4505\t62009\tObama\t62009\t0.0026099879999999997\t62009.0\n5393\t-89.783186\t39.1123\tEagarville village\tIL\tIllinois\tMacoupin County\t131\t42.5\t15.2\t9.5\t18810\t97500\t0.4505\t62023\tObama\t62023\t0.000234989\t62023.0\n5394\t-90.066766\t39.256611\tChesterfield village\tIL\tIllinois\tMacoupin County\t218\t38.7\t8.6\t10.5\t17910\t86250\t0.4505\t62630\tObama\t62630\t0.00039105\t62630.0\n5395\t-89.98034200000001\t39.478858\tModesto village\tIL\tIllinois\tMacoupin County\t238\t43.8\t15.2\t10.9\t20570\t110938\t0.4505\t62667\tObama\t62667\t0.000426926\t62667.0\n5396\t-89.763295\t39.071548\tWhite City village\tIL\tIllinois\tMacoupin County\t227\t43.3\t8.0\t17.3\t19238\t98333\t0.4505\t62069\tObama\t62069\t0.000407194\t62069.0\n5397\t-89.812713\t39.137839\tEast Gillespie village\tIL\tIllinois\tMacoupin County\t226\t40.8\t8.5\t13.8\t19569\t76500\t0.4505\t62033\tObama\t62033\t0.00040539999999999993\t62033.0\n5398\t-90.103765\t39.477740000000004\tScottville village\tIL\tIllinois\tMacoupin County\t128\t42.5\t18.0\t11.4\t18261\t75000\t0.4505\t62674\tObama\t62674\t0.000229607\t62674.0\n5399\t-89.951412\t39.040865999999994\tBunker Hill city\tIL\tIllinois\tMacoupin County\t1682\t39.0\t15.1\t7.5\t19495\t99590\t0.4505\t62014\tObama\t62014\t0.003017182\t62014.0\n5400\t-89.825289\t39.100232\tMount Clare village\tIL\tIllinois\tMacoupin County\t434\t47.5\t10.2\t16.1\t20580\t70000\t0.4505\t62009\tObama\t62009\t0.000778512\t62009.0\n5401\t-89.855164\t39.069523\tWilsonville village\tIL\tIllinois\tMacoupin County\t610\t46.6\t12.8\t13.9\t20613\t81923\t0.4505\t62093\tObama\t62093\t0.001094222\t62093.0\n5402\t-90.15273\t38.903613\tAlton city\tIL\tIllinois\tMadison County\t29961\t37.0\t19.9\t15.6\t20415\t81290\t0.4811\t62002\tObama\t62002\t0.053744225\t62002.0\n5403\t-89.735855\t38.887622\tAlhambra village\tIL\tIllinois\tMadison County\t681\t47.3\t14.3\t7.3\t23227\t141667\t0.4811\t62001\tObama\t62001\t0.001221582\t62001.0\n5404\t-89.843651\t38.889195\tHamel village\tIL\tIllinois\tMadison County\t596\t41.6\t21.3\t8.6\t23968\t132500\t0.4811\t62046\tObama\t62046\t0.001069108\t62046.0\n5405\t-89.96333800000001\t38.726704999999995\tMaryville village\tIL\tIllinois\tMadison County\t6697\t39.1\t33.2\t8.4\t32017\t172054\t0.4811\t62062\tObama\t62062\t0.01201312\t62062.0\n5406\t-90.141564\t38.675827000000005\tMadison city\tIL\tIllinois\tMadison County\t4353\t35.0\t8.1\t24.3\t16552\t57733\t0.4811\t62060\tObama\t62060\t0.007808438000000001\t62060.0\n5407\t-89.997881\t38.681478000000006\tCollinsville city\tIL\tIllinois\tMadison County\t25413\t38.9\t24.8\t10.5\t26847\t121714\t0.4811\t62234\tObama\t62234\t0.045585995\t62234.0\n5408\t-90.060015\t38.822708\tSouth Roxana village\tIL\tIllinois\tMadison County\t1929\t36.3\t5.1\t16.4\t19593\t68659\t0.4811\t62087\tObama\t62087\t0.003460252\t62087.0\n5409\t-89.965962\t38.796803000000004\tEdwardsville city\tIL\tIllinois\tMadison County\t23407\t35.0\t45.3\t9.6\t29310\t148076\t0.4811\t62025\tObama\t62025\t0.04198762\t62025.0\n5410\t-90.092095\t38.824071\tHartford village\tIL\tIllinois\tMadison County\t1484\t41.7\t4.4\t15.5\t22038\t66311\t0.4811\t62048\tObama\t62048\t0.002662008\t62048.0\n5411\t-89.973788\t38.760789\tGlen Carbon village\tIL\tIllinois\tMadison County\t11792\t36.9\t49.5\t8.4\t31935\t198924\t0.4811\t62034\tObama\t62034\t0.021152562000000003\t62034.0\n5412\t-89.83935600000001\t38.931787\tWorden village\tIL\tIllinois\tMadison County\t938\t39.9\t10.1\t11.9\t20211\t77424\t0.4811\t62097\tObama\t62097\t0.00168259\t62097.0\n5413\t-90.047584\t38.900022\tBethalto village\tIL\tIllinois\tMadison County\t9646\t39.2\t15.8\t11.5\t24190\t117352\t0.4811\t62010\tObama\t62010\t0.017303054\t62010.0\n5414\t-89.66634599999999\t38.969551\tNew Douglas village\tIL\tIllinois\tMadison County\t416\t43.7\t13.4\t9.3\t22365\t109375\t0.4811\t62074\tObama\t62074\t0.0007462230000000001\t62074.0\n5415\t-90.108129\t38.883775\tEast Alton village\tIL\tIllinois\tMadison County\t6541\t37.6\t8.5\t17.2\t19962\t79947\t0.4811\t62095\tObama\t62095\t0.011733286\t62095.0\n5416\t-90.168846\t38.67187\tVenice city\tIL\tIllinois\tMadison County\t2013\t31.3\t7.1\t36.6\t12873\t48968\t0.4811\t62090\tObama\t62090\t0.0036109320000000003\t62090.0\n5417\t-90.123746\t38.726816\tGranite City\tIL\tIllinois\tMadison County\t29529\t39.8\t12.2\t16.3\t22105\t83734\t0.4811\t62040\tObama\t62040\t0.052969300999999996\t62040.0\n5418\t-89.764333\t38.987194\tWilliamson village\tIL\tIllinois\tMadison County\t269\t45.0\t16.8\t12.8\t23896\t103125\t0.4811\t62058\tObama\t62058\t0.000482534\t62058.0\n5419\t-89.764212\t38.968173\tLivingston village\tIL\tIllinois\tMadison County\t835\t42.8\t8.4\t14.7\t21786\t72361\t0.4811\t62058\tObama\t62058\t0.0014978279999999999\t62058.0\n5420\t-90.068966\t38.7293\tPontoon Beach village\tIL\tIllinois\tMadison County\t5480\t36.2\t12.7\t12.8\t23466\t93281\t0.4811\t62040\tObama\t62040\t0.009830057\t62040.0\n5421\t-90.047613\t38.830768\tRoxana village\tIL\tIllinois\tMadison County\t1488\t38.8\t11.5\t11.6\t23858\t78571\t0.4811\t62087\tObama\t62087\t0.002669183\t62087.0\n5422\t-90.08165\t38.862373\tWood River city\tIL\tIllinois\tMadison County\t11192\t39.0\t14.2\t12.9\t23419\t90531\t0.4811\t62024\tObama\t62024\t0.020076278\t62024.0\n5423\t-89.893726\t38.72899\tTroy city\tIL\tIllinois\tMadison County\t9529\t34.3\t29.5\t8.4\t26979\t154877\t0.4811\t62294\tObama\t62294\t0.017093178\t62294.0\n5424\t-90.07169300000001\t38.886082\tRosewood Heights CDP\tIL\tIllinois\tMadison County\t4148\t44.5\t19.1\t12.4\t27745\t115495\t0.4811\t62024\tObama\t62024\t0.007440708000000001\t62024.0\n5425\t-89.77895500000001\t38.786555\tMarine village\tIL\tIllinois\tMadison County\t934\t36.9\t15.0\t9.8\t25681\t117941\t0.4811\t62061\tObama\t62061\t0.001675415\t62061.0\n5426\t-89.668482\t38.831004\tGrantfork village\tIL\tIllinois\tMadison County\t282\t41.9\t16.5\t8.9\t24843\t137500\t0.4811\t62249\tObama\t62249\t0.000505853\t62249.0\n5427\t-89.682272\t38.760707000000004\tHighland city\tIL\tIllinois\tMadison County\t9215\t39.2\t26.2\t9.3\t26208\t142549\t0.4811\t62249\tObama\t62249\t0.016529923000000002\t62249.0\n5428\t-90.217004\t38.958369\tGodfrey village\tIL\tIllinois\tMadison County\t16900\t45.2\t29.4\t11.9\t29613\t139896\t0.4811\t62035\tObama\t62035\t0.030315322999999998\t62035.0\n5429\t-89.769612\t38.718171000000005\tSt. Jacob village\tIL\tIllinois\tMadison County\t840\t40.8\t18.2\t7.2\t23306\t128779\t0.4811\t62281\tObama\t62281\t0.001506797\t62281.0\n5430\t-89.095771\t38.753935\tPatoka village\tIL\tIllinois\tMarion County\t611\t43.5\t5.1\t13.9\t19928\t64706\t0.3949\t62875\tObama\t62875\t0.001096016\t62875.0\n5431\t-88.911936\t38.723099\tAlma village\tIL\tIllinois\tMarion County\t387\t42.7\t7.2\t14.1\t21885\t83000\t0.3949\t62807\tObama\t62807\t0.000694203\t62807.0\n5432\t-88.849941\t38.773472999999996\tKinmundy city\tIL\tIllinois\tMarion County\t821\t40.5\t9.4\t17.4\t18468\t50192\t0.3949\t62854\tObama\t62854\t0.001472715\t62854.0\n5433\t-89.054027\t38.615885999999996\tOdin village\tIL\tIllinois\tMarion County\t1201\t41.5\t10.9\t9.2\t19428\t58796\t0.3949\t62870\tObama\t62870\t0.002154361\t62870.0\n5434\t-88.787667\t38.618272\tIuka village\tIL\tIllinois\tMarion County\t675\t37.9\t6.7\t12.0\t15660\t68824\t0.3949\t62849\tObama\t62849\t0.001210819\t62849.0\n5435\t-89.119699\t38.611814\tSandoval village\tIL\tIllinois\tMarion County\t1260\t37.5\t7.5\t20.6\t16429\t49595\t0.3949\t62882\tObama\t62882\t0.002260196\t62882.0\n5436\t-89.120349\t38.528048999999996\tCentralia city\tIL\tIllinois\tMarion County\t13202\t40.2\t17.2\t15.5\t21975\t67410\t0.3949\t62801\tObama\t62801\t0.023681828\t62801.0\n5437\t-88.90329399999999\t38.491310999999996\tKell village\tIL\tIllinois\tMarion County\t239\t40.0\t10.9\t10.7\t17087\t82500\t0.3949\t62853\tObama\t62853\t0.00042872\t62853.0\n5438\t-89.044602\t38.477729\tWalnut Hill village\tIL\tIllinois\tMarion County\t113\t42.5\t17.5\t15.4\t26858\t108333\t0.3949\t62893\tObama\t62893\t0.00020269999999999997\t62893.0\n5439\t-89.089579\t38.801388\tVernon village\tIL\tIllinois\tMarion County\t175\t42.8\t10.9\t10.9\t18484\t76000\t0.3949\t62892\tObama\t62892\t0.00031391599999999997\t62892.0\n5440\t-89.125752\t38.57727\tJunction City village\tIL\tIllinois\tMarion County\t523\t37.4\t7.2\t13.9\t17521\t64091\t0.3949\t62882\tObama\t62882\t0.0009381610000000001\t62882.0\n5441\t-88.953834\t38.627734999999994\tSalem city\tIL\tIllinois\tMarion County\t7304\t39.9\t16.1\t13.3\t21266\t78782\t0.3949\t62881\tObama\t62881\t0.01310196\t62881.0\n5442\t-89.128303\t38.548355\tCentral City village\tIL\tIllinois\tMarion County\t1272\t33.6\t12.0\t16.8\t19222\t51977\t0.3949\t62801\tObama\t62801\t0.002281721\t62801.0\n5443\t-89.457215\t40.984168\tHopewell village\tIL\tIllinois\tMarshall County\t446\t42.4\t17.5\t6.7\t22971\t129688\t0.4197\t61565\tObama\t61565\t0.000800038\t61565.0\n5444\t-89.36157299999999\t41.113685\tHenry city\tIL\tIllinois\tMarshall County\t2486\t43.9\t20.1\t9.7\t22475\t101574\t0.4197\t61537\tObama\t61537\t0.004459402\t61537.0\n5445\t-89.224352\t41.035243\tVarna village\tIL\tIllinois\tMarshall County\t416\t41.8\t9.0\t12.0\t23028\t109028\t0.4197\t61375\tObama\t61375\t0.0007462230000000001\t61375.0\n5446\t-89.052319\t41.05097\tWenona city\tIL\tIllinois\tMarshall County\t1064\t42.1\t14.8\t8.1\t20205\t93256\t0.4197\t61377\tObama\t61377\t0.00190861\t61377.0\n5447\t-89.133905\t41.004353\tToluca city\tIL\tIllinois\tMarshall County\t1340\t46.5\t14.5\t7.6\t22857\t84583\t0.4197\t61369\tObama\t61369\t0.0024037\t61369.0\n5448\t-89.40653\t41.022545\tLacon city\tIL\tIllinois\tMarshall County\t1917\t45.7\t17.1\t10.5\t23596\t109722\t0.4197\t61540\tObama\t61540\t0.0034387259999999996\t61540.0\n5449\t-89.235159\t40.978776\tLa Rose village\tIL\tIllinois\tMarshall County\t145\t42.7\t15.1\t10.0\t20266\t116667\t0.4197\t61541\tObama\t61541\t0.000260102\t61541.0\n5450\t-89.44120600000001\t41.029711999999996\tSparland village\tIL\tIllinois\tMarshall County\t568\t42.4\t17.4\t6.5\t22956\t130952\t0.4197\t61565\tObama\t61565\t0.001018882\t61565.0\n5451\t-90.142542\t40.190517\tBath village\tIL\tIllinois\tMason County\t284\t42.2\t10.2\t28.6\t19235\t60000\t0.4571\t62617\tObama\t62617\t0.000509441\t62617.0\n5452\t-89.781318\t40.421014\tManito village\tIL\tIllinois\tMason County\t1804\t39.8\t12.6\t15.6\t23639\t105430\t0.4571\t61546\tObama\t61546\t0.003236026\t61546.0\n5453\t-89.930607\t40.330366\tTopeka village\tIL\tIllinois\tMason County\t88\t43.2\t4.6\t17.0\t19634\t93333\t0.4571\t61567\tObama\t61567\t0.000157855\t61567.0\n5454\t-89.600776\t40.306096000000004\tSan Jose village\tIL\tIllinois\tMason County\t628\t38.3\t12.3\t13.6\t21668\t83333\t0.4571\t62682\tObama\t62682\t0.00112651\t62682.0\n5455\t-90.009919\t40.151917\tKilbourne village\tIL\tIllinois\tMason County\t334\t41.7\t8.1\t16.4\t21459\t63750\t0.4571\t62655\tObama\t62655\t0.000599131\t62655.0\n5456\t-90.05611\t40.295688\tHavana city\tIL\tIllinois\tMason County\t3334\t42.0\t15.1\t18.9\t20564\t71301\t0.4571\t62644\tObama\t62644\t0.00598055\t62644.0\n5457\t-89.832557\t40.372167\tForest City village\tIL\tIllinois\tMason County\t278\t39.2\t12.0\t13.0\t16968\t96000\t0.4571\t61532\tObama\t61532\t0.000498678\t61532.0\n5458\t-89.841831\t40.232105\tEaston village\tIL\tIllinois\tMason County\t327\t47.2\t19.8\t8.1\t18862\t87500\t0.4571\t62633\tObama\t62633\t0.000586575\t62633.0\n5459\t-89.696611\t40.202096000000004\tMason City\tIL\tIllinois\tMason County\t2360\t43.4\t14.0\t13.0\t21850\t79076\t0.4571\t62664\tObama\t62664\t0.004233382\t62664.0\n5460\t-88.84473299999999\t37.206998\tJoppa village\tIL\tIllinois\tMassac County\t393\t38.0\t6.9\t15.2\t16907\t59474\t0.3221\t62953\tObama\t62953\t0.000704966\t62953.0\n5461\t-88.713107\t37.153786\tMetropolis city\tIL\tIllinois\tMassac County\t6088\t44.5\t12.6\t13.7\t17516\t72485\t0.3221\t62960\tObama\t62960\t0.010920692\t62960.0\n5462\t-88.626605\t37.126615\tBrookport city\tIL\tIllinois\tMassac County\t1119\t39.5\t9.0\t11.7\t17608\t70833\t0.3221\t62910\tObama\t62910\t0.002007269\t62910.0\n5463\t-89.936661\t39.945709\tTallula village\tIL\tIllinois\tMenard County\t595\t42.0\t14.0\t14.5\t23306\t79444\t0.3414\t62688\tObama\t62688\t0.001067315\t62688.0\n5464\t-89.740647\t40.084876\tGreenview village\tIL\tIllinois\tMenard County\t868\t37.1\t20.4\t6.6\t24196\t87826\t0.3414\t62642\tObama\t62642\t0.001557024\t62642.0\n5465\t-89.72450699999999\t39.960333\tAthens city\tIL\tIllinois\tMenard County\t1773\t37.6\t19.0\t5.4\t23764\t127874\t0.3414\t62613\tObama\t62613\t0.003180418\t62613.0\n5466\t-89.84909499999999\t40.013455\tPetersburg city\tIL\tIllinois\tMenard County\t2362\t42.2\t23.8\t16.4\t25070\t106028\t0.3414\t62675\tObama\t62675\t0.00423697\t62675.0\n5467\t-89.965264\t40.100947999999995\tOakford village\tIL\tIllinois\tMenard County\t298\t39.1\t13.2\t15.3\t22563\t72647\t0.3414\t62673\tObama\t62673\t0.000534554\t62673.0\n5468\t-90.79924799999999\t41.102334\tSeaton village\tIL\tIllinois\tMercer County\t239\t42.5\t13.5\t11.8\t20407\t89286\t0.5281\t61476\tObama\t61476\t0.00042872\t61476.0\n5469\t-90.586519\t41.205077\tViola village\tIL\tIllinois\tMercer County\t1003\t39.5\t16.2\t12.7\t21250\t88077\t0.5281\t61486\tObama\t61486\t0.001799188\t61486.0\n5470\t-90.505137\t41.318962\tSherrard village\tIL\tIllinois\tMercer County\t668\t37.7\t12.2\t6.8\t22147\t100000\t0.5281\t61281\tObama\t61281\t0.001198262\t61281.0\n5471\t-90.47484399999999\t41.090391\tNorth Henderson village\tIL\tIllinois\tMercer County\t178\t43.5\t12.3\t8.6\t23823\t81250\t0.5281\t61466\tObama\t61466\t0.000319297\t61466.0\n5472\t-90.746466\t41.198485999999995\tAledo city\tIL\tIllinois\tMercer County\t3540\t45.7\t21.3\t11.8\t22447\t99386\t0.5281\t61231\tObama\t61231\t0.006350074\t61231.0\n5473\t-90.999915\t41.169745\tNew Boston city\tIL\tIllinois\tMercer County\t605\t46.0\t3.5\t16.9\t18850\t76111\t0.5281\t61272\tObama\t61272\t0.001085253\t61272.0\n5474\t-90.935353\t41.100291999999996\tKeithsburg city\tIL\tIllinois\tMercer County\t690\t38.9\t10.3\t18.8\t16232\t52800\t0.5281\t61442\tObama\t61442\t0.001237726\t61442.0\n5475\t-90.444412\t41.201821\tWindsor village\tIL\tIllinois\tMercer County\t689\t45.4\t11.8\t13.1\t20366\t90417\t0.5281\t61465\tObama\t61465\t0.001235932\t61465.0\n5476\t-90.605676\t41.259483\tMatherville village\tIL\tIllinois\tMercer County\t750\t34.7\t8.0\t9.3\t17653\t89286\t0.5281\t61263\tObama\t61263\t0.001345355\t61263.0\n5477\t-90.878793\t41.196847\tJoy village\tIL\tIllinois\tMercer County\t353\t38.9\t9.1\t12.8\t22021\t66842\t0.5281\t61260\tObama\t61260\t0.000633214\t61260.0\n5478\t-90.15639399999999\t38.336867\tWaterloo city\tIL\tIllinois\tMonroe County\t8882\t39.1\t22.9\t10.1\t27493\t196512\t0.3565\t62298\tObama\t62298\t0.015932586000000002\t62298.0\n5479\t-90.23294\t38.226658\tMaeystown village\tIL\tIllinois\tMonroe County\t164\t42.3\t10.1\t14.8\t22253\t160000\t0.3565\t62244\tObama\t62244\t0.000294184\t62244.0\n5480\t-90.205377\t38.480788000000004\tColumbia city\tIL\tIllinois\tMonroe County\t9141\t41.3\t32.8\t8.3\t32156\t200475\t0.3565\t62236\tObama\t62236\t0.016397182\t62236.0\n5481\t-90.21284399999999\t38.164146\tFults village\tIL\tIllinois\tMonroe County\t29\t32.5\t5.6\t17.6\t21887\t187500\t0.3565\t62244\tObama\t62244\t5.2000000000000004e-05\t62244.0\n5482\t-89.994085\t38.309249\tHecker village\tIL\tIllinois\tMonroe County\t530\t39.2\t11.7\t8.9\t27409\t176190\t0.3565\t62285\tObama\t62285\t0.000950717\t62285.0\n5483\t-90.298018\t38.306971000000004\tValmeyer village\tIL\tIllinois\tMonroe County\t1009\t38.1\t16.4\t8.3\t23782\t183796\t0.3565\t62295\tObama\t62295\t0.00180995\t62295.0\n5484\t-89.302897\t39.284714\tCoalton village\tIL\tIllinois\tMontgomery County\t305\t41.7\t13.1\t8.3\t19944\t67500\t0.4169\t62075\tObama\t62075\t0.000547111\t62075.0\n5485\t-89.40571\t39.205155\tIrving village\tIL\tIllinois\tMontgomery County\t475\t31.4\t2.9\t17.4\t18154\t80000\t0.4169\t62051\tObama\t62051\t0.000852058\t62051.0\n5486\t-89.523682\t39.031678\tPanama village\tIL\tIllinois\tMontgomery County\t322\t43.3\t11.8\t14.2\t18364\t62500\t0.4169\t62077\tObama\t62077\t0.000577606\t62077.0\n5487\t-89.28793399999999\t39.319981\tWenonah village\tIL\tIllinois\tMontgomery County\t44\t38.8\t14.3\t10.5\t18207\t77500\t0.4169\t62075\tObama\t62075\t7.890000000000001e-05\t62075.0\n5488\t-89.64941800000001\t39.176945\tLitchfield city\tIL\tIllinois\tMontgomery County\t6463\t40.9\t14.0\t15.4\t18272\t73892\t0.4169\t62056\tObama\t62056\t0.011593369\t62056.0\n5489\t-89.349203\t39.254472\tWitt city\tIL\tIllinois\tMontgomery County\t956\t42.2\t11.2\t14.3\t15871\t55833\t0.4169\t62094\tObama\t62094\t0.0017148789999999999\t62094.0\n5490\t-89.654297\t39.443301\tFarmersville village\tIL\tIllinois\tMontgomery County\t846\t38.3\t14.2\t10.5\t24243\t88966\t0.4169\t62533\tObama\t62533\t0.00151756\t62533.0\n5491\t-89.285206\t39.300035\tNokomis city\tIL\tIllinois\tMontgomery County\t2225\t43.8\t12.5\t15.6\t19346\t63395\t0.4169\t62075\tObama\t62075\t0.003991219\t62075.0\n5492\t-89.574859\t39.320057\tRaymond village\tIL\tIllinois\tMontgomery County\t880\t41.2\t18.9\t8.9\t22676\t81429\t0.4169\t62560\tObama\t62560\t0.0015785489999999998\t62560.0\n5493\t-89.473576\t39.031118\tDonnellson village\tIL\tIllinois\tMontgomery County\t236\t36.5\t12.0\t14.9\t17781\t66000\t0.4169\t62019\tObama\t62019\t0.00042333800000000005\t62019.0\n5494\t-89.218789\t39.344967\tOhlman village\tIL\tIllinois\tMontgomery County\t74\t40.0\t14.9\t9.4\t18039\t78333\t0.4169\t62083\tObama\t62083\t0.000132742\t62083.0\n5495\t-89.531819\t39.197553000000006\tButler village\tIL\tIllinois\tMontgomery County\t201\t45.8\t18.5\t6.1\t21397\t88000\t0.4169\t62015\tObama\t62015\t0.000360555\t62015.0\n5496\t-89.65274699999999\t39.377613000000004\tWaggoner village\tIL\tIllinois\tMontgomery County\t240\t35.0\t3.9\t11.7\t18288\t62000\t0.4169\t62572\tObama\t62572\t0.00043051300000000004\t62572.0\n5497\t-89.27874\t39.115134000000005\tFillmore village\tIL\tIllinois\tMontgomery County\t390\t41.3\t8.6\t10.5\t16660\t69615\t0.4169\t62032\tObama\t62032\t0.000699584\t62032.0\n5498\t-89.526427\t39.359057\tHarvel village\tIL\tIllinois\tMontgomery County\t227\t44.8\t15.1\t8.3\t20070\t112500\t0.4169\t62538\tObama\t62538\t0.000407194\t62538.0\n5499\t-89.390541\t39.089542\tCoffeen city\tIL\tIllinois\tMontgomery County\t657\t44.4\t8.5\t14.9\t18891\t60938\t0.4169\t62017\tObama\t62017\t0.001178531\t62017.0\n5500\t-89.468871\t39.200513\tHillsboro city\tIL\tIllinois\tMontgomery County\t4138\t39.2\t18.5\t10.4\t20623\t86769\t0.4169\t62049\tObama\t62049\t0.00742277\t62049.0\n5501\t-89.618936\t39.069047999999995\tWalshville village\tIL\tIllinois\tMontgomery County\t93\t40.8\t18.5\t15.4\t21714\t100000\t0.4169\t62091\tObama\t62091\t0.00016682400000000001\t62091.0\n5502\t-89.460814\t39.163284999999995\tSchram City village\tIL\tIllinois\tMontgomery County\t649\t43.4\t6.0\t20.1\t17515\t65185\t0.4169\t62049\tObama\t62049\t0.00116418\t62049.0\n5503\t-89.495716\t39.131489\tTaylor Springs village\tIL\tIllinois\tMontgomery County\t582\t47.3\t14.1\t13.1\t19552\t71167\t0.4169\t62089\tObama\t62089\t0.001043995\t62089.0\n5504\t-90.34595999999999\t39.685736\tLynnville village\tIL\tIllinois\tMorgan County\t145\t43.4\t26.7\t6.3\t24025\t155000\t0.4119\t62628\tObama\t62628\t0.000260102\t62628.0\n5505\t-90.230871\t39.705225\tSouth Jacksonville village\tIL\tIllinois\tMorgan County\t3277\t42.3\t28.9\t4.7\t25084\t120318\t0.4119\t62650\tObama\t62650\t0.0058783030000000005\t62650.0\n5506\t-89.952345\t39.592572\tWaverly city\tIL\tIllinois\tMorgan County\t1220\t42.2\t15.2\t11.4\t21854\t80405\t0.4119\t62692\tObama\t62692\t0.002188443\t62692.0\n5507\t-90.225261\t39.627428\tWoodson village\tIL\tIllinois\tMorgan County\t587\t40.9\t20.5\t4.0\t23408\t117308\t0.4119\t62695\tObama\t62695\t0.001052964\t62695.0\n5508\t-90.232056\t39.729541\tJacksonville city\tIL\tIllinois\tMorgan County\t19195\t36.6\t27.6\t11.9\t22632\t100254\t0.4119\t62650\tObama\t62650\t0.034432107999999996\t62650.0\n5509\t-90.04831899999999\t39.621285\tFranklin village\tIL\tIllinois\tMorgan County\t600\t40.8\t17.2\t9.1\t22100\t110000\t0.4119\t62638\tObama\t62638\t0.0010762839999999998\t62638.0\n5510\t-90.402749\t39.767025\tChapin village\tIL\tIllinois\tMorgan County\t520\t39.6\t16.4\t12.3\t19447\t86429\t0.4119\t62628\tObama\t62628\t0.0009327789999999999\t62628.0\n5511\t-90.371137\t39.816099\tConcord village\tIL\tIllinois\tMorgan County\t180\t43.8\t19.1\t9.4\t22712\t107500\t0.4119\t62631\tObama\t62631\t0.000322885\t62631.0\n5512\t-90.558204\t39.83166\tMeredosia village\tIL\tIllinois\tMorgan County\t978\t43.7\t6.2\t13.3\t19790\t62683\t0.4119\t62665\tObama\t62665\t0.001754342\t62665.0\n5513\t-90.25161700000001\t39.581949\tMurrayville village\tIL\tIllinois\tMorgan County\t622\t41.4\t18.7\t8.5\t18289\t87188\t0.4119\t62668\tObama\t62668\t0.001115747\t62668.0\n5514\t-88.80660999999999\t39.717123\tDalton City village\tIL\tIllinois\tMoultrie County\t563\t39.2\t7.8\t7.0\t24510\t107622\t0.354\t61925\tObama\t61925\t0.001009913\t61925.0\n5515\t-88.63172800000001\t39.714343\tLovington village\tIL\tIllinois\tMoultrie County\t1229\t40.7\t13.5\t10.1\t22263\t93571\t0.354\t61937\tObama\t61937\t0.002204588\t61937.0\n5516\t-88.53891\t39.558661\tAllenville village\tIL\tIllinois\tMoultrie County\t161\t47.0\t28.0\t8.3\t23728\t151563\t0.354\t61951\tObama\t61951\t0.000288803\t61951.0\n5517\t-88.496344\t39.458152\tGays village\tIL\tIllinois\tMoultrie County\t312\t44.3\t20.5\t9.2\t23758\t97500\t0.354\t61928\tObama\t61928\t0.000559668\t61928.0\n5518\t-88.74147099999999\t39.644406\tBethany village\tIL\tIllinois\tMoultrie County\t1285\t44.3\t12.8\t9.9\t21961\t103500\t0.354\t61914\tObama\t61914\t0.002305041\t61914.0\n5519\t-88.607262\t39.596654\tSullivan city\tIL\tIllinois\tMoultrie County\t4426\t40.9\t19.6\t10.6\t23110\t101323\t0.354\t61951\tObama\t61951\t0.007939386\t61951.0\n5520\t-89.33755699999999\t42.013439\tOregon city\tIL\tIllinois\tOgle County\t4157\t41.0\t21.2\t13.2\t23560\t140853\t0.4072\t61061\tObama\t61061\t0.007456852\t61061.0\n5521\t-89.43238000000001\t42.04852\tMount Morris village\tIL\tIllinois\tOgle County\t3023\t40.8\t20.4\t16.0\t25595\t130328\t0.4072\t61054\tObama\t61054\t0.0054226759999999995\t61054.0\n5522\t-89.49185200000001\t42.140390999999994\tAdeline village\tIL\tIllinois\tOgle County\t146\t42.5\t23.0\t10.0\t24208\t212500\t0.4072\t61039\tObama\t61039\t0.00026189599999999996\t61039.0\n5523\t-89.578816\t42.126445000000004\tForreston village\tIL\tIllinois\tOgle County\t1684\t39.6\t18.6\t14.0\t20586\t123020\t0.4072\t61030\tObama\t61030\t0.0030207690000000004\t61030.0\n5524\t-89.070048\t41.955672\tHillcrest village\tIL\tIllinois\tOgle County\t1252\t34.4\t13.0\t15.0\t21454\t147246\t0.4072\t61068\tObama\t61068\t0.002245845\t61068.0\n5525\t-88.971065\t41.931335\tCreston village\tIL\tIllinois\tOgle County\t587\t34.5\t13.0\t14.9\t21462\t146324\t0.4072\t60113\tObama\t60113\t0.001052964\t60113.0\n5526\t-89.088909\t42.118565999999994\tDavis Junction village\tIL\tIllinois\tOgle County\t1166\t37.7\t20.2\t11.4\t24308\t183984\t0.4072\t61020\tObama\t61020\t0.0020915779999999998\t61020.0\n5527\t-89.054351\t41.920508\tRochelle city\tIL\tIllinois\tOgle County\t9623\t34.9\t18.9\t16.1\t22538\t149917\t0.4072\t61068\tObama\t61068\t0.017261796\t61068.0\n5528\t-89.262579\t42.124231\tByron city\tIL\tIllinois\tOgle County\t3657\t33.9\t16.9\t12.5\t22867\t165903\t0.4072\t61010\tObama\t61010\t0.006559949\t61010.0\n5529\t-89.40405200000001\t42.123618\tLeaf River village\tIL\tIllinois\tOgle County\t606\t42.3\t10.7\t14.8\t23835\t151136\t0.4072\t61047\tObama\t61047\t0.001087047\t61047.0\n5530\t-89.17996\t42.104106\tStillman Valley village\tIL\tIllinois\tOgle County\t1223\t37.5\t19.7\t15.2\t24481\t184856\t0.4072\t61084\tObama\t61084\t0.002193825\t61084.0\n5531\t-89.57880899999999\t41.984728000000004\tPolo city\tIL\tIllinois\tOgle County\t2486\t39.6\t15.6\t13.9\t25720\t119905\t0.4072\t61064\tObama\t61064\t0.004459402\t61064.0\n5532\t-89.514016\t40.877494\tRome CDP\tIL\tIllinois\tPeoria County\t1757\t43.5\t19.0\t5.3\t25803\t121905\t0.5128\t61523\tObama\t61523\t0.003151717\t61523.0\n5533\t-89.883627\t40.838365\tBrimfield village\tIL\tIllinois\tPeoria County\t886\t40.0\t19.2\t8.5\t22192\t112500\t0.5128\t61517\tObama\t61517\t0.001589312\t61517.0\n5534\t-89.755876\t40.931591999999995\tPrinceville village\tIL\tIllinois\tPeoria County\t1806\t38.8\t16.2\t10.9\t24022\t127857\t0.5128\t61559\tObama\t61559\t0.003239614\t61559.0\n5535\t-89.723151\t40.571913\tMapleton village\tIL\tIllinois\tPeoria County\t239\t44.4\t10.5\t6.9\t29276\t135000\t0.5128\t61547\tObama\t61547\t0.00042872\t61547.0\n5536\t-89.677677\t40.859658\tDunlap village\tIL\tIllinois\tPeoria County\t1153\t40.2\t30.7\t7.8\t26862\t164583\t0.5128\t61525\tObama\t61525\t0.002068258\t61525.0\n5537\t-89.966122\t40.779214\tElmwood city\tIL\tIllinois\tPeoria County\t2024\t38.1\t20.7\t10.9\t25177\t109282\t0.5128\t61529\tObama\t61529\t0.003630664\t61529.0\n5538\t-89.501143\t40.915040000000005\tChillicothe city\tIL\tIllinois\tPeoria County\t5724\t39.4\t15.9\t13.6\t26267\t111732\t0.5128\t61523\tObama\t61523\t0.010267746\t61523.0\n5539\t-89.813174\t40.572764\tGlasford village\tIL\tIllinois\tPeoria County\t999\t38.5\t11.2\t12.3\t21747\t91286\t0.5128\t61533\tObama\t61533\t0.0017920120000000002\t61533.0\n5540\t-89.793973\t40.692724\tHanna City village\tIL\tIllinois\tPeoria County\t1251\t39.3\t8.8\t7.4\t23123\t127115\t0.5128\t61536\tObama\t61536\t0.002244051\t61536.0\n5541\t-89.612195\t40.747786\tPeoria city\tIL\tIllinois\tPeoria County\t112043\t36.0\t32.2\t15.6\t25024\t118752\t0.5128\t61614\tObama\t61614\t0.200983418\t61614.0\n5542\t-89.632853\t40.698982\tWest Peoria city\tIL\tIllinois\tPeoria County\t4523\t39.4\t22.7\t10.9\t24605\t102481\t0.5128\t61604\tObama\t61604\t0.008113385\t61604.0\n5543\t-89.54838199999999\t40.774322999999995\tPeoria Heights village\tIL\tIllinois\tPeoria County\t6268\t40.1\t18.3\t8.1\t23938\t84167\t0.5128\t61552\tObama\t61552\t0.011243577\t61552.0\n5544\t-89.65948\t40.639378\tBartonville village\tIL\tIllinois\tPeoria County\t6036\t42.1\t12.8\t14.0\t23003\t106794\t0.5128\t61607\tObama\t61607\t0.010827413999999999\t61607.0\n5545\t-89.67465899999999\t40.687560999999995\tBellevue village\tIL\tIllinois\tPeoria County\t1922\t42.0\t12.0\t10.9\t23771\t104079\t0.5128\t61604\tObama\t61604\t0.003447695\t61604.0\n5546\t-89.77034599999999\t40.55896\tKingston Mines village\tIL\tIllinois\tPeoria County\t239\t37.3\t10.1\t11.8\t23784\t94375\t0.5128\t61539\tObama\t61539\t0.00042872\t61539.0\n5547\t-89.699837\t40.707487\tNorwood village\tIL\tIllinois\tPeoria County\t486\t41.4\t10.2\t8.0\t20414\t127083\t0.5128\t61604\tObama\t61604\t0.00087179\t61604.0\n5548\t-89.590104\t37.982581\tWillisville village\tIL\tIllinois\tPerry County\t676\t36.4\t3.4\t12.0\t16652\t57353\t0.3999\t62997\tObama\t62997\t0.001212613\t62997.0\n5549\t-89.373168\t38.07902\tPinckneyville city\tIL\tIllinois\tPerry County\t5276\t37.3\t11.4\t13.3\t18508\t81198\t0.3999\t62274\tObama\t62274\t0.009464120999999999\t62274.0\n5550\t-89.229225\t38.136478000000004\tTamaroa village\tIL\tIllinois\tPerry County\t733\t40.3\t8.2\t19.3\t17357\t60313\t0.3999\t62888\tObama\t62888\t0.00131486\t62888.0\n5551\t-89.239889\t38.033390999999995\tSt. Johns village\tIL\tIllinois\tPerry County\t206\t40.9\t14.4\t21.0\t16445\t58889\t0.3999\t62832\tObama\t62832\t0.00036952400000000004\t62832.0\n5552\t-89.567607\t38.032333\tCutler village\tIL\tIllinois\tPerry County\t514\t34.1\t8.0\t25.9\t18609\t46714\t0.3999\t62238\tObama\t62238\t0.0009220160000000001\t62238.0\n5553\t-89.232557\t38.001706\tDu Quoin city\tIL\tIllinois\tPerry County\t6259\t40.7\t17.0\t17.7\t18505\t67409\t0.3999\t62832\tObama\t62832\t0.011227431999999999\t62832.0\n5554\t-88.643569\t40.121782\tDe Land village\tIL\tIllinois\tPiatt County\t472\t41.5\t16.6\t11.3\t22805\t121429\t0.3549\t61839\tObama\t61839\t0.0008466760000000001\t61839.0\n5555\t-88.459307\t39.80189\tAtwood village\tIL\tIllinois\tPiatt County\t1257\t41.1\t12.9\t7.8\t20212\t96125\t0.3549\t61913\tObama\t61913\t0.002254814\t61913.0\n5556\t-88.723676\t40.014742\tCisco village\tIL\tIllinois\tPiatt County\t282\t41.3\t18.7\t3.6\t24643\t123438\t0.3549\t61830\tObama\t61830\t0.000505853\t61830.0\n5557\t-88.50921\t40.211427\tMansfield village\tIL\tIllinois\tPiatt County\t927\t40.0\t16.8\t11.5\t23337\t105385\t0.3549\t61854\tObama\t61854\t0.001662858\t61854.0\n5558\t-88.735108\t39.889959999999995\tCerro Gordo village\tIL\tIllinois\tPiatt County\t1426\t36.5\t12.5\t13.7\t23786\t105147\t0.3549\t61818\tObama\t61818\t0.002557968\t61818.0\n5559\t-88.59227800000001\t39.799296999999996\tHammond village\tIL\tIllinois\tPiatt County\t489\t42.9\t14.0\t11.2\t26622\t103846\t0.3549\t61929\tObama\t61929\t0.000877171\t61929.0\n5560\t-88.572354\t40.032872\tMonticello city\tIL\tIllinois\tPiatt County\t5439\t45.0\t35.6\t8.4\t30457\t144839\t0.3549\t61856\tObama\t61856\t0.009756510999999999\t61856.0\n5561\t-88.571966\t39.922908\tBement village\tIL\tIllinois\tPiatt County\t1675\t40.5\t14.2\t9.6\t20217\t94390\t0.3549\t61813\tObama\t61813\t0.003004625\t61813.0\n5562\t-90.991236\t39.622669\tEl Dara village\tIL\tIllinois\tPike County\t85\t43.6\t15.3\t8.7\t17375\t90000\t0.3127\t62312\tObama\t62312\t0.000152474\t62312.0\n5563\t-90.67592900000001\t39.620144\tDetroit village\tIL\tIllinois\tPike County\t90\t42.1\t3.1\t17.9\t17508\t85000\t0.3127\t62352\tObama\t62352\t0.000161443\t62352.0\n5564\t-91.151713\t39.703625\tKinderhook village\tIL\tIllinois\tPike County\t233\t42.0\t16.2\t7.1\t18318\t61000\t0.3127\t62345\tObama\t62345\t0.000417957\t62345.0\n5565\t-91.203151\t39.708601\tHull village\tIL\tIllinois\tPike County\t430\t42.9\t19.2\t10.9\t18319\t65357\t0.3127\t62343\tObama\t62343\t0.000771337\t62343.0\n5566\t-90.74706\t39.782329\tPerry village\tIL\tIllinois\tPike County\t409\t41.8\t8.4\t9.2\t18083\t63750\t0.3127\t62362\tObama\t62362\t0.000733667\t62362.0\n5567\t-91.039185\t39.696114\tBarry city\tIL\tIllinois\tPike County\t1367\t44.4\t10.6\t7.4\t16998\t72619\t0.3127\t62312\tObama\t62312\t0.002452133\t62312.0\n5568\t-91.098241\t39.637439\tNew Canton town\tIL\tIllinois\tPike County\t433\t43.8\t11.5\t8.3\t16126\t52059\t0.3127\t62356\tObama\t62356\t0.000776718\t62356.0\n5569\t-90.909524\t39.729574\tBaylis village\tIL\tIllinois\tPike County\t256\t38.3\t11.3\t15.8\t16339\t65000\t0.3127\t62314\tObama\t62314\t0.000459214\t62314.0\n5570\t-90.810612\t39.609997\tPittsfield city\tIL\tIllinois\tPike County\t4299\t43.7\t17.5\t6.4\t19980\t92282\t0.3127\t62363\tObama\t62363\t0.007711572\t62363.0\n5571\t-90.623772\t39.459711\tPearl village\tIL\tIllinois\tPike County\t192\t42.5\t6.1\t20.0\t17734\t51000\t0.3127\t62361\tObama\t62361\t0.000344411\t62361.0\n5572\t-90.723388\t39.561135\tTime village\tIL\tIllinois\tPike County\t28\t36.3\t0.0\t12.5\t16840\t75000\t0.3127\t62352\tObama\t62352\t5.02e-05\t62352.0\n5573\t-90.87294200000001\t39.443231\tPleasant Hill village\tIL\tIllinois\tPike County\t987\t41.3\t10.6\t10.3\t16260\t66471\t0.3127\t62366\tObama\t62366\t0.001770487\t62366.0\n5574\t-90.61108399999999\t39.628514\tFlorence village\tIL\tIllinois\tPike County\t68\t42.9\t2.1\t18.6\t17701\t92500\t0.3127\t62352\tObama\t62352\t0.00012197899999999999\t62352.0\n5575\t-90.650109\t39.564565\tMilton village\tIL\tIllinois\tPike County\t262\t38.0\t3.0\t11.2\t16312\t84375\t0.3127\t62352\tObama\t62352\t0.00046997699999999995\t62352.0\n5576\t-90.847775\t39.707578000000005\tNew Salem village\tIL\tIllinois\tPike County\t130\t39.4\t11.8\t14.9\t16953\t65000\t0.3127\t62357\tObama\t62357\t0.000233195\t62357.0\n5577\t-90.727294\t39.708123\tGriggsville city\tIL\tIllinois\tPike County\t1162\t40.5\t12.3\t10.9\t19050\t72500\t0.3127\t62340\tObama\t62340\t0.002084403\t62340.0\n5578\t-90.788099\t39.442122\tNebo village\tIL\tIllinois\tPike County\t376\t40.9\t9.3\t12.3\t15676\t50714\t0.3127\t62355\tObama\t62355\t0.0006744710000000001\t62355.0\n5579\t-90.65154\t39.707213\tValley City village\tIL\tIllinois\tPike County\t13\t17.5\t12.5\t12.5\t16774\t0\t0.3127\t62340\tObama\t62340\t2.33e-05\t62340.0\n5580\t-88.584526\t37.500409000000005\tEddyville village\tIL\tIllinois\tPope County\t139\t46.7\t10.5\t9.7\t18623\t88750\t0.2925\t62928\tObama\t62928\t0.000249339\t62928.0\n5581\t-88.487236\t37.362675\tGolconda city\tIL\tIllinois\tPope County\t664\t46.1\t11.6\t12.0\t16440\t60769\t0.2925\t62938\tObama\t62938\t0.001191087\t62938.0\n5582\t-89.163012\t37.085142\tMound City\tIL\tIllinois\tPulaski County\t558\t34.4\t7.0\t21.1\t12685\t38214\t0.4625\t62963\tObama\t62963\t0.001000944\t62963.0\n5583\t-89.016547\t37.255203\tNew Grand Chain village\tIL\tIllinois\tPulaski County\t208\t44.8\t10.1\t10.1\t17594\t56667\t0.4625\t62941\tObama\t62941\t0.000373112\t62941.0\n5584\t-88.975789\t37.29417\tKarnak village\tIL\tIllinois\tPulaski County\t521\t37.8\t9.8\t16.2\t15147\t54423\t0.4625\t62956\tObama\t62956\t0.0009345730000000001\t62956.0\n5585\t-89.208016\t37.215981\tPulaski village\tIL\tIllinois\tPulaski County\t265\t39.2\t15.3\t30.4\t14676\t47500\t0.4625\t62976\tObama\t62976\t0.000475359\t62976.0\n5586\t-89.084276\t37.181635\tOlmsted village\tIL\tIllinois\tPulaski County\t304\t43.9\t3.7\t11.7\t16999\t55882\t0.4625\t62970\tObama\t62970\t0.000545317\t62970.0\n5587\t-89.175145\t37.277618\tUllin village\tIL\tIllinois\tPulaski County\t677\t40.8\t11.9\t18.0\t15729\t46538\t0.4625\t62992\tObama\t62992\t0.001214407\t62992.0\n5588\t-89.202298\t37.114409\tMounds city\tIL\tIllinois\tPulaski County\t927\t39.0\t8.0\t21.9\t13123\t33824\t0.4625\t62964\tObama\t62964\t0.001662858\t62964.0\n5589\t-89.195987\t41.113948\tMagnolia village\tIL\tIllinois\tPutnam County\t253\t40.6\t17.2\t7.1\t21437\t113889\t0.4973\t61336\tObama\t61336\t0.000453833\t61336.0\n5590\t-89.209845\t41.177387\tMcNabb village\tIL\tIllinois\tPutnam County\t281\t40.4\t17.5\t7.0\t21448\t113636\t0.4973\t61335\tObama\t61335\t0.00050406\t61335.0\n5591\t-89.344175\t41.258734999999994\tHennepin village\tIL\tIllinois\tPutnam County\t714\t44.1\t13.3\t8.1\t25337\t144477\t0.4973\t61327\tObama\t61327\t0.001280778\t61327.0\n5592\t-89.179979\t41.255796000000004\tStandard village\tIL\tIllinois\tPutnam County\t252\t42.3\t13.6\t14.1\t24044\t103125\t0.4973\t61363\tObama\t61363\t0.000452039\t61363.0\n5593\t-89.230239\t41.263695\tGranville village\tIL\tIllinois\tPutnam County\t1417\t40.3\t11.7\t14.3\t24412\t114474\t0.4973\t61326\tObama\t61326\t0.002541823\t61326.0\n5594\t-89.249625\t41.263896\tMark village\tIL\tIllinois\tPutnam County\t498\t41.4\t11.0\t10.5\t22937\t128846\t0.4973\t61340\tObama\t61340\t0.000893315\t61340.0\n5595\t-89.73504799999999\t38.147788\tSparta city\tIL\tIllinois\tRandolph County\t4191\t41.3\t13.5\t12.3\t19883\t76089\t0.4002\t62286\tObama\t62286\t0.007517841\t62286.0\n5596\t-89.701338\t37.840862\tRockwood village\tIL\tIllinois\tRandolph County\t40\t40.0\t13.8\t4.5\t21738\t125000\t0.4002\t62280\tObama\t62280\t7.18e-05\t62280.0\n5597\t-89.661609\t38.007562\tSteeleville village\tIL\tIllinois\tRandolph County\t1990\t43.0\t10.0\t9.3\t22087\t95000\t0.4002\t62288\tObama\t62288\t0.003569674\t62288.0\n5598\t-89.683922\t38.212456\tTilden village\tIL\tIllinois\tRandolph County\t814\t37.3\t4.9\t15.1\t18277\t53049\t0.4002\t62292\tObama\t62292\t0.0014601579999999998\t62292.0\n5599\t-89.916351\t37.921396\tKaskaskia village\tIL\tIllinois\tRandolph County\t9\t20.0\t0.0\t0.0\t17247\t162500\t0.4002\t62233\tObama\t62233\t1.6100000000000002e-05\t62233.0\n5600\t-89.825618\t37.919965999999995\tChester city\tIL\tIllinois\tRandolph County\t7998\t35.1\t13.8\t11.4\t21415\t84706\t0.4002\t62233\tObama\t62233\t0.014346861\t62233.0\n5601\t-89.996939\t38.209015\tRed Bud city\tIL\tIllinois\tRandolph County\t3396\t41.1\t14.0\t7.6\t22436\t131181\t0.4002\t62278\tObama\t62278\t0.006091766\t62278.0\n5602\t-90.097329\t38.081747\tPrairie du Rocher village\tIL\tIllinois\tRandolph County\t584\t35.8\t10.3\t11.1\t19741\t84722\t0.4002\t62277\tObama\t62277\t0.001047583\t62277.0\n5603\t-89.933943\t38.088443\tEvansville village\tIL\tIllinois\tRandolph County\t786\t41.3\t5.4\t16.1\t17816\t70862\t0.4002\t62242\tObama\t62242\t0.001409932\t62242.0\n5604\t-89.910223\t38.009291999999995\tEllis Grove village\tIL\tIllinois\tRandolph County\t383\t38.6\t13.2\t9.0\t24253\t95833\t0.4002\t62241\tObama\t62241\t0.000687028\t62241.0\n5605\t-89.6046\t38.184853000000004\tCoulterville village\tIL\tIllinois\tRandolph County\t1220\t41.1\t7.4\t14.3\t16639\t63421\t0.4002\t62237\tObama\t62237\t0.002188443\t62237.0\n5606\t-89.845192\t38.183799\tBaldwin village\tIL\tIllinois\tRandolph County\t426\t30.0\t2.7\t17.2\t16244\t74000\t0.4002\t62217\tObama\t62217\t0.0007641610000000001\t62217.0\n5607\t-89.99900600000001\t38.134165\tRuma village\tIL\tIllinois\tRandolph County\t253\t44.5\t9.3\t10.7\t22414\t115909\t0.4002\t62242\tObama\t62242\t0.000453833\t62242.0\n5608\t-89.617825\t38.015345\tPercy village\tIL\tIllinois\tRandolph County\t881\t39.0\t8.6\t7.6\t17075\t65000\t0.4002\t62272\tObama\t62272\t0.001580343\t62272.0\n5609\t-88.223302\t38.69747\tNoble village\tIL\tIllinois\tRichland County\t729\t37.9\t15.6\t13.9\t19219\t63864\t0.3244\t62868\tObama\t62868\t0.001307685\t62868.0\n5610\t-88.04254399999999\t38.651123999999996\tCalhoun village\tIL\tIllinois\tRichland County\t219\t41.1\t9.9\t25.8\t17214\t61250\t0.3244\t62419\tObama\t62419\t0.000392844\t62419.0\n5611\t-88.083713\t38.731077\tOlney city\tIL\tIllinois\tRichland County\t8159\t41.0\t16.8\t15.0\t19641\t76000\t0.3244\t62450\tObama\t62450\t0.014635664\t62450.0\n5612\t-88.056519\t38.589295\tParkersburg village\tIL\tIllinois\tRichland County\t231\t40.6\t10.6\t25.4\t17204\t63000\t0.3244\t62452\tObama\t62452\t0.000414369\t62452.0\n5613\t-87.97478199999999\t38.718447999999995\tClaremont village\tIL\tIllinois\tRichland County\t208\t41.3\t9.8\t11.7\t17464\t106944\t0.3244\t62421\tObama\t62421\t0.000373112\t62421.0\n5614\t-90.561132\t41.443378\tMilan village\tIL\tIllinois\tRock Island County\t5128\t38.2\t9.6\t14.0\t22350\t93089\t0.6023\t61264\tObama\t61264\t0.009198638\t61264.0\n5615\t-90.572739\t41.412698999999996\tOak Grove village\tIL\tIllinois\tRock Island County\t712\t39.8\t17.3\t13.4\t26168\t118382\t0.6023\t61264\tObama\t61264\t0.00127719\t61264.0\n5616\t-90.339646\t41.578043\tRapids City village\tIL\tIllinois\tRock Island County\t1005\t43.4\t24.2\t9.4\t29391\t143952\t0.6023\t61275\tObama\t61275\t0.001802775\t61275.0\n5617\t-90.392078\t41.498252\tCarbon Cliff village\tIL\tIllinois\tRock Island County\t1669\t35.9\t12.3\t13.6\t22555\t100893\t0.6023\t61239\tObama\t61239\t0.002993862\t61239.0\n5618\t-90.56303299999999\t41.400211999999996\tCoyne Center CDP\tIL\tIllinois\tRock Island County\t885\t44.7\t19.8\t11.8\t25017\t123125\t0.6023\t61264\tObama\t61264\t0.0015875179999999998\t61264.0\n5619\t-90.41090600000001\t41.499241999999995\tSilvis city\tIL\tIllinois\tRock Island County\t7326\t38.8\t11.7\t11.1\t22913\t104777\t0.6023\t61282\tObama\t61282\t0.013141423999999999\t61282.0\n5620\t-90.321738\t41.677284\tCordova village\tIL\tIllinois\tRock Island County\t691\t45.2\t21.9\t7.5\t28457\t143910\t0.6023\t61242\tObama\t61242\t0.00123952\t61242.0\n5621\t-90.67150699999999\t41.332381\tReynolds village\tIL\tIllinois\tRock Island County\t483\t41.8\t19.1\t6.3\t23598\t121324\t0.6023\t61279\tObama\t61279\t0.000866408\t61279.0\n5622\t-90.427033\t41.514522\tEast Moline city\tIL\tIllinois\tRock Island County\t20915\t38.1\t19.1\t12.9\t22822\t109272\t0.6023\t61244\tObama\t61244\t0.037517455\t61244.0\n5623\t-90.722398\t41.439341999999996\tAndalusia village\tIL\tIllinois\tRock Island County\t1005\t44.2\t16.9\t12.0\t24108\t128125\t0.6023\t61232\tObama\t61232\t0.001802775\t61232.0\n5624\t-90.416276\t41.446034000000004\tCoal Valley village\tIL\tIllinois\tRock Island County\t3702\t40.2\t21.0\t9.5\t26987\t128077\t0.6023\t61240\tObama\t61240\t0.00664067\t61240.0\n5625\t-90.175042\t41.610859999999995\tHillsdale village\tIL\tIllinois\tRock Island County\t631\t38.3\t5.4\t9.0\t22680\t97143\t0.6023\t61257\tObama\t61257\t0.001131892\t61257.0\n5626\t-90.327555\t41.615817\tPort Byron village\tIL\tIllinois\tRock Island County\t1619\t43.4\t24.2\t9.4\t29392\t143693\t0.6023\t61275\tObama\t61275\t0.002904172\t61275.0\n5627\t-90.581518\t41.472291\tRock Island city\tIL\tIllinois\tRock Island County\t37793\t38.1\t22.1\t14.5\t23219\t99125\t0.6023\t61201\tObama\t61201\t0.06779331400000001\t61201.0\n5628\t-90.490796\t41.484859\tMoline city\tIL\tIllinois\tRock Island County\t43280\t39.9\t24.8\t12.4\t25642\t114899\t0.6023\t61265\tObama\t61265\t0.077635929\t61265.0\n5629\t-90.40357900000001\t41.556149\tHampton village\tIL\tIllinois\tRock Island County\t1725\t38.8\t20.3\t8.0\t26658\t130191\t0.6023\t61256\tObama\t61256\t0.0030943159999999997\t61256.0\n5630\t-90.53981999999999\t41.517237\tRock Island Arsenal CDP\tIL\tIllinois\tRock Island County\t129\t26.3\t10.4\t5.3\t21047\t0\t0.6023\t61201\tObama\t61201\t0.00023140099999999998\t61201.0\n5631\t-90.032767\t38.62966\tCaseyville village\tIL\tIllinois\tSt. Clair County\t4239\t42.1\t14.3\t12.8\t20993\t89540\t0.5632\t62232\tObama\t62232\t0.0076039440000000005\t62232.0\n5632\t-89.989138\t38.516706\tBelleville city\tIL\tIllinois\tSt. Clair County\t41074\t38.6\t21.1\t12.8\t23823\t104984\t0.5632\t62220\tObama\t62220\t0.073678792\t62220.0\n5633\t-90.092286\t38.458826\tMillstadt village\tIL\tIllinois\tSt. Clair County\t3315\t41.4\t22.2\t7.5\t27544\t164701\t0.5632\t62260\tObama\t62260\t0.0059464669999999996\t62260.0\n5634\t-89.757853\t38.254589\tMarissa village\tIL\tIllinois\tSt. Clair County\t1962\t41.0\t12.7\t18.5\t20784\t70565\t0.5632\t62257\tObama\t62257\t0.0035194479999999997\t62257.0\n5635\t-90.130847\t38.615637\tEast St. Louis city\tIL\tIllinois\tSt. Clair County\t28591\t32.6\t11.6\t30.5\t13099\t59641\t0.5632\t62205\tObama\t62205\t0.051286711\t62205.0\n5636\t-90.092866\t38.628701\tWashington Park village\tIL\tIllinois\tSt. Clair County\t4379\t28.8\t4.9\t35.4\t10830\t48520\t0.5632\t62204\tObama\t62204\t0.007855077\t62204.0\n5637\t-90.096085\t38.66146\tFairmont City village\tIL\tIllinois\tSt. Clair County\t2580\t34.2\t7.3\t19.6\t13709\t59737\t0.5632\t62204\tObama\t62204\t0.00462802\t62204.0\n5638\t-89.818313\t38.285107\tLenzburg village\tIL\tIllinois\tSt. Clair County\t609\t38.6\t5.4\t17.9\t19058\t79583\t0.5632\t62255\tObama\t62255\t0.001092428\t62255.0\n5639\t-90.006035\t38.596849\tFairview Heights city\tIL\tIllinois\tSt. Clair County\t15617\t42.8\t29.8\t8.7\t27815\t125287\t0.5632\t62208\tObama\t62208\t0.02801387\t62208.0\n5640\t-89.915056\t38.553662\tShiloh village\tIL\tIllinois\tSt. Clair County\t10021\t34.2\t36.8\t9.0\t28367\t170694\t0.5632\t62221\tObama\t62221\t0.017975731000000002\t62221.0\n5641\t-90.167953\t38.654395\tBrooklyn village\tIL\tIllinois\tSt. Clair County\t624\t33.6\t5.1\t16.4\t10234\t59583\t0.5632\t62059\tObama\t62059\t0.001119335\t62059.0\n5642\t-90.20828\t38.517602000000004\tDupo village\tIL\tIllinois\tSt. Clair County\t3884\t36.7\t13.0\t12.6\t24824\t92688\t0.5632\t62239\tObama\t62239\t0.006967143\t62239.0\n5643\t-90.243187\t38.536909\tEast Carondelet village\tIL\tIllinois\tSt. Clair County\t307\t32.0\t3.1\t17.9\t16577\t57188\t0.5632\t62240\tObama\t62240\t0.0005506980000000001\t62240.0\n5644\t-89.920374\t38.430687\tFreeburg village\tIL\tIllinois\tSt. Clair County\t4131\t42.2\t21.7\t12.8\t25617\t146977\t0.5632\t62243\tObama\t62243\t0.0074102130000000006\t62243.0\n5645\t-89.995628\t38.394729\tSmithton village\tIL\tIllinois\tSt. Clair County\t2856\t39.6\t18.1\t13.1\t22793\t143007\t0.5632\t62285\tObama\t62285\t0.00512311\t62285.0\n5646\t-90.177195\t38.56511\tCahokia village\tIL\tIllinois\tSt. Clair County\t15412\t31.4\t7.5\t20.7\t16905\t56516\t0.5632\t62206\tObama\t62206\t0.02764614\t62206.0\n5647\t-89.712655\t38.36338\tSt. Libory village\tIL\tIllinois\tSt. Clair County\t584\t39.6\t8.7\t9.7\t21685\t125781\t0.5632\t62255\tObama\t62255\t0.001047583\t62255.0\n5648\t-89.912576\t38.592426\tO'Fallon city\tIL\tIllinois\tSt. Clair County\t24842\t37.7\t42.8\t9.7\t29967\t158673\t0.5632\t62269\tObama\t62269\t0.04456173099999999\t62269.0\n5649\t-89.803361\t38.520776\tMascoutah city\tIL\tIllinois\tSt. Clair County\t5913\t39.9\t22.2\t12.8\t26313\t122764\t0.5632\t62258\tObama\t62258\t0.010606776000000002\t62258.0\n5650\t-89.850639\t38.542516\tScott AFB CDP\tIL\tIllinois\tSt. Clair County\t2675\t21.7\t48.4\t7.0\t16051\t40667\t0.5632\t62225\tObama\t62225\t0.004798431\t62225.0\n5651\t-89.87751899999999\t38.318372\tNew Athens village\tIL\tIllinois\tSt. Clair County\t1946\t40.3\t14.0\t10.0\t24243\t105426\t0.5632\t62264\tObama\t62264\t0.003490747\t62264.0\n5652\t-89.751875\t38.596509999999995\tSummerfield village\tIL\tIllinois\tSt. Clair County\t525\t37.8\t13.9\t13.1\t20616\t106081\t0.5632\t62289\tObama\t62289\t0.0009417480000000001\t62289.0\n5653\t-90.113729\t38.584901\tAlorton village\tIL\tIllinois\tSt. Clair County\t2434\t27.5\t6.1\t35.8\t11448\t54035\t0.5632\t62207\tObama\t62207\t0.004366124\t62207.0\n5654\t-90.165239\t38.587913\tSauget village\tIL\tIllinois\tSt. Clair County\t225\t38.1\t11.0\t21.4\t20002\t61429\t0.5632\t62206\tObama\t62206\t0.000403606\t62206.0\n5655\t-90.12823\t38.579524\tCentreville city\tIL\tIllinois\tSt. Clair County\t5292\t33.0\t12.7\t25.8\t13620\t60580\t0.5632\t62207\tObama\t62207\t0.009492822\t62207.0\n5656\t-89.795795\t38.377589\tFayetteville village\tIL\tIllinois\tSt. Clair County\t430\t42.1\t18.9\t8.6\t26361\t133333\t0.5632\t62255\tObama\t62255\t0.000771337\t62255.0\n5657\t-89.813621\t38.604878\tLebanon city\tIL\tIllinois\tSt. Clair County\t3768\t36.2\t31.2\t10.9\t21755\t125625\t0.5632\t62254\tObama\t62254\t0.006759060999999999\t62254.0\n5658\t-89.98653900000001\t38.547748\tSwansea village\tIL\tIllinois\tSt. Clair County\t11255\t41.1\t31.1\t10.9\t27853\t145066\t0.5632\t62226\tObama\t62226\t0.020189288\t62226.0\n5659\t-88.441666\t37.811831\tEldorado city\tIL\tIllinois\tSaline County\t4282\t44.7\t11.2\t14.0\t15468\t50848\t0.3452\t62930\tObama\t62930\t0.007681078\t62930.0\n5660\t-88.62929799999999\t37.688486\tCarrier Mills village\tIL\tIllinois\tSaline County\t1808\t43.7\t10.8\t7.3\t17197\t56250\t0.3452\t62917\tObama\t62917\t0.003243201\t62917.0\n5661\t-88.61485\t37.841429\tGalatia village\tIL\tIllinois\tSaline County\t1144\t42.2\t8.9\t12.2\t16857\t70000\t0.3452\t62935\tObama\t62935\t0.002052114\t62935.0\n5662\t-88.54595\t37.737671999999996\tHarrisburg city\tIL\tIllinois\tSaline County\t9419\t40.4\t14.8\t12.4\t17992\t58880\t0.3452\t62946\tObama\t62946\t0.01689586\t62946.0\n5663\t-88.530434\t37.826242\tRaleigh village\tIL\tIllinois\tSaline County\t340\t43.0\t20.2\t10.3\t18723\t77000\t0.3452\t62977\tObama\t62977\t0.000609894\t62977.0\n5664\t-88.514292\t37.765819\tMuddy village\tIL\tIllinois\tSaline County\t78\t46.3\t19.6\t11.4\t25742\t118750\t0.3452\t62946\tObama\t62946\t0.000139917\t62946.0\n5665\t-88.699784\t37.618590999999995\tStonefort village\tIL\tIllinois\tSaline County\t343\t42.9\t12.1\t14.1\t18559\t76429\t0.3452\t62987\tObama\t62987\t0.000615275\t62987.0\n5666\t-89.607225\t39.887\tSherman village\tIL\tIllinois\tSangamon County\t3636\t43.3\t39.2\t5.6\t32781\t167247\t0.4465\t62684\tObama\t62684\t0.006522279000000001\t62684.0\n5667\t-89.247075\t39.851504999999996\tIlliopolis village\tIL\tIllinois\tSangamon County\t909\t38.0\t17.2\t2.4\t25733\t83333\t0.4465\t62539\tObama\t62539\t0.00163057\t62539.0\n5668\t-89.398627\t39.810027000000005\tMechanicsburg village\tIL\tIllinois\tSangamon County\t434\t36.9\t8.0\t5.4\t21686\t79643\t0.4465\t62545\tObama\t62545\t0.000778512\t62545.0\n5669\t-89.5509\t39.951602\tWilliamsville village\tIL\tIllinois\tSangamon County\t1466\t40.8\t25.7\t5.8\t25299\t133059\t0.4465\t62693\tObama\t62693\t0.00262972\t62693.0\n5670\t-89.653897\t39.569832\tDivernon village\tIL\tIllinois\tSangamon County\t1216\t39.4\t21.4\t3.5\t27731\t108333\t0.4465\t62530\tObama\t62530\t0.002181268\t62530.0\n5671\t-89.920117\t39.874164\tPleasant Plains village\tIL\tIllinois\tSangamon County\t783\t39.0\t21.3\t5.1\t24980\t124734\t0.4465\t62677\tObama\t62677\t0.00140455\t62677.0\n5672\t-89.555714\t39.749003\tRochester village\tIL\tIllinois\tSangamon County\t3026\t45.8\t45.5\t6.3\t32828\t173148\t0.4465\t62563\tObama\t62563\t0.005428056999999999\t62563.0\n5673\t-89.462878\t39.853245\tDawson village\tIL\tIllinois\tSangamon County\t459\t44.0\t18.0\t6.7\t29440\t97692\t0.4465\t62520\tObama\t62520\t0.0008233569999999999\t62520.0\n5674\t-89.68372600000001\t39.778683\tLeland Grove city\tIL\tIllinois\tSangamon County\t1586\t50.0\t70.6\t3.6\t52895\t244590\t0.4465\t62704\tObama\t62704\t0.002844976\t62704.0\n5675\t-89.758174\t39.540388\tThayer village\tIL\tIllinois\tSangamon County\t789\t37.0\t15.0\t3.8\t22063\t104398\t0.4465\t62689\tObama\t62689\t0.0014153129999999999\t62689.0\n5676\t-89.67898000000001\t39.935292\tCantrall village\tIL\tIllinois\tSangamon County\t151\t43.4\t41.3\t3.3\t24835\t185000\t0.4465\t62625\tObama\t62625\t0.000270865\t62625.0\n5677\t-89.651205\t39.756008\tSouthern View village\tIL\tIllinois\tSangamon County\t1703\t42.3\t23.8\t9.7\t26587\t94588\t0.4465\t62707\tObama\t62707\t0.0030548520000000003\t62707.0\n5678\t-89.541598\t39.846182\tRiverton village\tIL\tIllinois\tSangamon County\t3179\t37.6\t24.0\t8.2\t26429\t105170\t0.4465\t62561\tObama\t62561\t0.00570251\t62561.0\n5679\t-89.53779899999999\t39.867441\tSpaulding village\tIL\tIllinois\tSangamon County\t627\t40.6\t25.9\t4.6\t29195\t136310\t0.4465\t62561\tObama\t62561\t0.001124716\t62561.0\n5680\t-89.409015\t39.85004\tBuffalo village\tIL\tIllinois\tSangamon County\t510\t42.2\t19.6\t8.0\t26389\t118056\t0.4465\t62515\tObama\t62515\t0.000914841\t62515.0\n5681\t-89.650943\t39.772172\tSpringfield city\tIL\tIllinois\tSangamon County\t111603\t39.1\t35.1\t10.0\t27901\t115350\t0.4465\t62703\tObama\t62703\t0.200194144\t62703.0\n5682\t-89.902633\t39.75772\tBerlin village\tIL\tIllinois\tSangamon County\t154\t44.8\t25.9\t11.7\t25878\t147500\t0.4465\t62670\tObama\t62670\t0.000276246\t62670.0\n5683\t-89.56859200000001\t39.813691999999996\tClear Lake village\tIL\tIllinois\tSangamon County\t243\t35.4\t18.8\t21.1\t19075\t22500\t0.4465\t62561\tObama\t62561\t0.000435895\t62561.0\n5684\t-89.914399\t39.72615\tNew Berlin village\tIL\tIllinois\tSangamon County\t1056\t37.3\t26.6\t5.7\t25363\t110505\t0.4465\t62670\tObama\t62670\t0.001894259\t62670.0\n5685\t-89.679901\t39.767639\tJerome village\tIL\tIllinois\tSangamon County\t1388\t41.2\t28.5\t15.5\t24288\t106432\t0.4465\t62704\tObama\t62704\t0.002489803\t62704.0\n5686\t-89.580703\t39.592883\tPawnee village\tIL\tIllinois\tSangamon County\t2836\t38.3\t23.6\t7.2\t25670\t102875\t0.4465\t62558\tObama\t62558\t0.005087234\t62558.0\n5687\t-89.617925\t39.817446999999994\tGrandview village\tIL\tIllinois\tSangamon County\t1465\t39.2\t10.4\t12.5\t18857\t75448\t0.4465\t62702\tObama\t62702\t0.0026279259999999996\t62702.0\n5688\t-89.84738399999999\t39.674977\tLoami village\tIL\tIllinois\tSangamon County\t800\t39.5\t17.6\t7.7\t21392\t79167\t0.4465\t62661\tObama\t62661\t0.001435045\t62661.0\n5689\t-89.69704\t39.670732\tChatham village\tIL\tIllinois\tSangamon County\t10753\t35.2\t41.7\t6.1\t30018\t146677\t0.4465\t62629\tObama\t62629\t0.019288797\t62629.0\n5690\t-89.745976\t39.577067\tAuburn city\tIL\tIllinois\tSangamon County\t4420\t34.5\t24.1\t7.6\t23523\t107026\t0.4465\t62615\tObama\t62615\t0.007928623000000001\t62615.0\n5691\t-90.773325\t40.152821\tCamden village\tIL\tIllinois\tSchuyler County\t86\t41.5\t11.7\t6.3\t16981\t65000\t0.444\t62319\tObama\t62319\t0.000154267\t62319.0\n5692\t-90.565334\t40.120306\tRushville city\tIL\tIllinois\tSchuyler County\t3259\t44.3\t12.8\t8.0\t19441\t68274\t0.444\t62681\tObama\t62681\t0.005846014\t62681.0\n5693\t-90.373005\t40.127037\tBrowning village\tIL\tIllinois\tSchuyler County\t114\t45.7\t1.2\t13.0\t16823\t47500\t0.444\t62624\tObama\t62624\t0.00020449400000000002\t62624.0\n5694\t-90.622313\t40.234028\tLittleton village\tIL\tIllinois\tSchuyler County\t183\t43.5\t14.0\t5.8\t22637\t102500\t0.444\t61452\tObama\t61452\t0.000328267\t61452.0\n5695\t-90.456408\t39.629484999999995\tWinchester city\tIL\tIllinois\tScott County\t1554\t45.0\t16.5\t8.1\t18617\t79569\t0.3562\t62694\tObama\t62694\t0.002787575\t62694.0\n5696\t-90.535239\t39.75014\tBluffs village\tIL\tIllinois\tScott County\t656\t40.0\t16.2\t10.7\t21840\t75556\t0.3562\t62621\tObama\t62621\t0.001176737\t62621.0\n5697\t-90.606913\t39.753479\tNaples town\tIL\tIllinois\tScott County\t129\t37.8\t13.3\t3.9\t20481\t77500\t0.3562\t62621\tObama\t62621\t0.00023140099999999998\t62621.0\n5698\t-90.432684\t39.559283\tAlsey village\tIL\tIllinois\tScott County\t251\t39.7\t11.1\t12.5\t21868\t76667\t0.3562\t62610\tObama\t62610\t0.000450245\t62610.0\n5699\t-90.33004100000001\t39.542318\tManchester village\tIL\tIllinois\tScott County\t316\t41.7\t11.4\t4.6\t17824\t73636\t0.3562\t62663\tObama\t62663\t0.000566843\t62663.0\n5700\t-90.496033\t39.719069\tExeter village\tIL\tIllinois\tScott County\t67\t38.1\t12.8\t5.0\t20589\t75000\t0.3562\t62621\tObama\t62621\t0.000120185\t62621.0\n5701\t-90.47999300000001\t39.548716\tGlasgow village\tIL\tIllinois\tScott County\t160\t44.7\t16.7\t8.4\t18630\t79000\t0.3562\t62610\tObama\t62610\t0.000287009\t62610.0\n5702\t-89.106605\t39.286328000000005\tOconee village\tIL\tIllinois\tShelby County\t189\t41.5\t3.1\t9.7\t20411\t96667\t0.3215\t62553\tObama\t62553\t0.000339029\t62553.0\n5703\t-88.95926\t39.386774\tTower Hill village\tIL\tIllinois\tShelby County\t551\t37.6\t6.9\t13.8\t16739\t49348\t0.3215\t62571\tObama\t62571\t0.000988387\t62571.0\n5704\t-88.622052\t39.349925\tStrasburg village\tIL\tIllinois\tShelby County\t561\t48.4\t15.5\t9.0\t18213\t102907\t0.3215\t62465\tObama\t62465\t0.001006325\t62465.0\n5705\t-88.754641\t39.522382\tFindlay village\tIL\tIllinois\tShelby County\t667\t43.8\t13.0\t12.8\t19533\t76579\t0.3215\t62534\tObama\t62534\t0.001196469\t62534.0\n5706\t-89.017236\t39.625554\tMoweaqua village\tIL\tIllinois\tShelby County\t1867\t42.9\t14.9\t6.0\t23011\t95648\t0.3215\t62550\tObama\t62550\t0.0033490359999999997\t62550.0\n5707\t-88.595386\t39.438699\tWindsor city\tIL\tIllinois\tShelby County\t1079\t41.6\t9.7\t6.7\t20766\t84032\t0.3215\t61957\tObama\t61957\t0.001935517\t61957.0\n5708\t-88.49461099999999\t39.225629999999995\tSigel town\tIL\tIllinois\tShelby County\t363\t37.2\t15.4\t6.2\t18552\t119643\t0.3215\t62462\tObama\t62462\t0.000651152\t62462.0\n5709\t-88.798337\t39.409781\tShelbyville city\tIL\tIllinois\tShelby County\t4880\t41.8\t14.0\t10.4\t22278\t93367\t0.3215\t62565\tObama\t62565\t0.008753774\t62565.0\n5710\t-88.984804\t39.219577\tHerrick village\tIL\tIllinois\tShelby County\t567\t33.3\t3.0\t20.2\t15805\t59737\t0.3215\t62431\tObama\t62431\t0.001017088\t62431.0\n5711\t-88.859364\t39.249168\tCowden village\tIL\tIllinois\tShelby County\t565\t35.4\t6.2\t18.3\t15843\t54750\t0.3215\t62422\tObama\t62422\t0.0010135\t62422.0\n5712\t-88.630229\t39.263965\tStewardson village\tIL\tIllinois\tShelby County\t731\t37.5\t10.6\t10.1\t18197\t77667\t0.3215\t62463\tObama\t62463\t0.001311272\t62463.0\n5713\t-89.973659\t41.1096\tLa Fayette village\tIL\tIllinois\tStark County\t223\t43.8\t10.4\t13.1\t20555\t77500\t0.4113\t61449\tObama\t61449\t0.000400019\t61449.0\n5714\t-89.657892\t41.177324\tBradford village\tIL\tIllinois\tStark County\t786\t41.3\t10.7\t9.9\t20124\t92188\t0.4113\t61421\tObama\t61421\t0.001409932\t61421.0\n5715\t-89.863796\t41.094797\tToulon city\tIL\tIllinois\tStark County\t1371\t43.9\t15.5\t10.0\t21453\t85882\t0.4113\t61483\tObama\t61483\t0.002459308\t61483.0\n5716\t-89.773165\t41.06415\tWyoming city\tIL\tIllinois\tStark County\t1373\t41.9\t13.9\t11.1\t18646\t95702\t0.4113\t61491\tObama\t61491\t0.002462896\t61491.0\n5717\t-89.484758\t42.214240999999994\tGerman Valley village\tIL\tIllinois\tStephenson County\t441\t39.8\t14.1\t7.6\t22049\t124038\t0.4828\t61039\tObama\t61039\t0.000791068\t61039.0\n5718\t-89.826613\t42.267026\tPearl City village\tIL\tIllinois\tStephenson County\t762\t40.3\t16.0\t10.3\t20989\t126471\t0.4828\t61062\tObama\t61062\t0.00136688\t61062.0\n5719\t-89.470721\t42.413196\tRock City village\tIL\tIllinois\tStephenson County\t319\t38.6\t15.9\t11.2\t23390\t135714\t0.4828\t61070\tObama\t61070\t0.000572224\t61070.0\n5720\t-89.794599\t42.493148\tWinslow village\tIL\tIllinois\tStephenson County\t334\t37.1\t9.2\t9.4\t20208\t102344\t0.4828\t61089\tObama\t61089\t0.000599131\t61089.0\n5721\t-89.82340400000001\t42.381169\tLena village\tIL\tIllinois\tStephenson County\t2782\t41.4\t15.9\t14.1\t22297\t122032\t0.4828\t61048\tObama\t61048\t0.004990369000000001\t61048.0\n5722\t-89.64641999999999\t42.466404\tOrangeville village\tIL\tIllinois\tStephenson County\t778\t37.1\t13.6\t8.7\t19471\t110169\t0.4828\t61060\tObama\t61060\t0.0013955810000000001\t61060.0\n5723\t-89.52687900000001\t42.387436\tDakota village\tIL\tIllinois\tStephenson County\t493\t41.1\t7.3\t8.6\t25024\t110484\t0.4828\t61018\tObama\t61018\t0.000884346\t61018.0\n5724\t-89.636174\t42.375567\tCedarville village\tIL\tIllinois\tStephenson County\t630\t46.4\t24.2\t10.9\t25600\t125000\t0.4828\t61013\tObama\t61013\t0.001130098\t61013.0\n5725\t-89.415611\t42.421671\tDavis village\tIL\tIllinois\tStephenson County\t699\t44.2\t25.0\t12.6\t28343\t163793\t0.4828\t61019\tObama\t61019\t0.00125387\t61019.0\n5726\t-89.47716\t42.297342\tRidott village\tIL\tIllinois\tStephenson County\t146\t44.4\t18.1\t9.1\t25508\t146875\t0.4828\t61067\tObama\t61067\t0.00026189599999999996\t61067.0\n5727\t-89.63561\t42.289734\tFreeport city\tIL\tIllinois\tStephenson County\t24376\t40.0\t20.8\t15.3\t24090\t91792\t0.4828\t61032\tObama\t61032\t0.043725818\t61032.0\n5728\t-89.422314\t40.422278999999996\tHopedale village\tIL\tIllinois\tTazewell County\t970\t41.0\t21.8\t12.1\t24183\t149740\t0.4003\t61747\tObama\t61747\t0.001739992\t61747.0\n5729\t-89.314205\t40.339651\tArmington village\tIL\tIllinois\tTazewell County\t372\t41.5\t28.0\t9.4\t20898\t122115\t0.4003\t61721\tObama\t61721\t0.0006672960000000001\t61721.0\n5730\t-89.467045\t40.612207\tMorton village\tIL\tIllinois\tTazewell County\t15715\t43.4\t38.2\t7.9\t31728\t186109\t0.4003\t61550\tObama\t61550\t0.028189662999999997\t61550.0\n5731\t-89.604015\t40.621284\tMarquette Heights city\tIL\tIllinois\tTazewell County\t2932\t39.9\t11.4\t13.8\t23574\t106982\t0.4003\t61610\tObama\t61610\t0.00525944\t61610.0\n5732\t-89.313896\t40.433189\tMinier village\tIL\tIllinois\tTazewell County\t1299\t41.2\t16.4\t7.7\t21864\t122674\t0.4003\t61759\tObama\t61759\t0.002330154\t61759.0\n5733\t-89.621953\t40.612376\tNorth Pekin village\tIL\tIllinois\tTazewell County\t1676\t38.1\t5.9\t17.6\t24075\t92786\t0.4003\t61610\tObama\t61610\t0.003006419\t61610.0\n5734\t-89.490165\t40.525359\tTremont village\tIL\tIllinois\tTazewell County\t2096\t39.0\t26.0\t6.2\t27142\t156571\t0.4003\t61568\tObama\t61568\t0.003759818\t61568.0\n5735\t-89.54352\t40.673266999999996\tEast Peoria city\tIL\tIllinois\tTazewell County\t22586\t42.9\t17.9\t12.1\t25533\t131891\t0.4003\t61611\tObama\t61611\t0.040514905\t61611.0\n5736\t-89.358937\t40.533844\tMackinaw village\tIL\tIllinois\tTazewell County\t1515\t35.8\t17.2\t14.6\t23576\t130808\t0.4003\t61755\tObama\t61755\t0.002717616\t61755.0\n5737\t-89.435193\t40.703015\tWashington city\tIL\tIllinois\tTazewell County\t12502\t39.9\t32.2\t12.0\t30112\t146963\t0.4003\t61571\tObama\t61571\t0.022426164\t61571.0\n5738\t-89.652986\t40.495271\tSouth Pekin village\tIL\tIllinois\tTazewell County\t1188\t33.0\t3.2\t12.1\t19180\t86132\t0.4003\t61564\tObama\t61564\t0.002131042\t61564.0\n5739\t-89.59899399999999\t40.642819\tCreve Coeur village\tIL\tIllinois\tTazewell County\t5285\t37.6\t6.3\t9.3\t22162\t86113\t0.4003\t61610\tObama\t61610\t0.009480265\t61610.0\n5740\t-89.643845\t40.407258\tGreen Valley village\tIL\tIllinois\tTazewell County\t744\t35.2\t14.7\t20.8\t23484\t104070\t0.4003\t61534\tObama\t61534\t0.0013345920000000001\t61534.0\n5741\t-89.544768\t40.371365000000004\tDelavan city\tIL\tIllinois\tTazewell County\t1950\t37.4\t18.3\t13.5\t24171\t106058\t0.4003\t61734\tObama\t61734\t0.003497922\t61734.0\n5742\t-89.32496400000001\t40.629696\tDeer Creek village\tIL\tIllinois\tTazewell County\t694\t41.1\t22.4\t12.0\t27214\t155556\t0.4003\t61733\tObama\t61733\t0.001244901\t61733.0\n5743\t-89.626827\t40.573327\tPekin city\tIL\tIllinois\tTazewell County\t34000\t38.7\t16.2\t14.2\t24498\t112093\t0.4003\t61554\tObama\t61554\t0.060989407999999995\t61554.0\n5744\t-89.26880600000001\t37.452171\tJonesboro city\tIL\tIllinois\tUnion County\t1887\t42.8\t17.8\t18.4\t17524\t69783\t0.3788\t62952\tObama\t62952\t0.003384912\t62952.0\n5745\t-89.239296\t37.461009999999995\tAnna city\tIL\tIllinois\tUnion County\t4929\t45.2\t19.2\t17.4\t18307\t77784\t0.3788\t62906\tObama\t62906\t0.00884167\t62906.0\n5746\t-89.253575\t37.34106\tMill Creek village\tIL\tIllinois\tUnion County\t81\t40.0\t16.1\t9.1\t16998\t100000\t0.3788\t62926\tObama\t62926\t0.000145298\t62926.0\n5747\t-89.165503\t37.359899\tDongola village\tIL\tIllinois\tUnion County\t777\t37.8\t10.1\t15.2\t15992\t60152\t0.3788\t62926\tObama\t62926\t0.001393787\t62926.0\n5748\t-89.254563\t37.533572\tCobden village\tIL\tIllinois\tUnion County\t1088\t42.4\t21.9\t14.9\t17265\t68036\t0.3788\t62920\tObama\t62920\t0.0019516610000000002\t62920.0\n5749\t-89.319152\t37.573692\tAlto Pass village\tIL\tIllinois\tUnion County\t372\t44.9\t30.2\t12.0\t18226\t88333\t0.3788\t62905\tObama\t62905\t0.0006672960000000001\t62905.0\n5750\t-87.776753\t40.109818\tOakwood village\tIL\tIllinois\tVermilion County\t1486\t37.1\t13.7\t11.3\t23251\t77667\t0.4248\t61858\tObama\t61858\t0.0026655959999999997\t61858.0\n5751\t-87.666259\t40.461449\tHoopeston city\tIL\tIllinois\tVermilion County\t5553\t42.0\t10.8\t17.0\t19114\t71433\t0.4248\t60942\tObama\t60942\t0.009961005\t60942.0\n5752\t-87.606953\t40.307173999999996\tAlvin village\tIL\tIllinois\tVermilion County\t316\t40.2\t11.6\t12.5\t17091\t78571\t0.4248\t61811\tObama\t61811\t0.000566843\t61811.0\n5753\t-87.611333\t40.259465000000006\tBismarck village\tIL\tIllinois\tVermilion County\t570\t40.7\t15.0\t10.0\t24055\t98462\t0.4248\t61811\tObama\t61811\t0.001022469\t61811.0\n5754\t-87.89607099999999\t40.464602\tRankin village\tIL\tIllinois\tVermilion County\t566\t39.8\t8.4\t14.8\t14939\t61333\t0.4248\t60960\tObama\t60960\t0.001015294\t60960.0\n5755\t-87.875136\t40.114389\tFithian village\tIL\tIllinois\tVermilion County\t467\t38.5\t11.9\t10.1\t24883\t83636\t0.4248\t61844\tObama\t61844\t0.0008377069999999999\t61844.0\n5756\t-87.843109\t40.116068\tMuncie village\tIL\tIllinois\tVermilion County\t162\t42.3\t22.8\t8.9\t23259\t121429\t0.4248\t61857\tObama\t61857\t0.000290597\t61857.0\n5757\t-87.707773\t40.067347\tCatlin village\tIL\tIllinois\tVermilion County\t2003\t39.0\t20.6\t12.1\t21289\t100540\t0.4248\t61817\tObama\t61817\t0.0035929940000000004\t61817.0\n5758\t-87.65199\t39.895492\tRidge Farm village\tIL\tIllinois\tVermilion County\t846\t40.8\t14.4\t12.6\t19398\t63095\t0.4248\t61870\tObama\t61870\t0.00151756\t61870.0\n5759\t-87.700969\t40.306881\tHenning village\tIL\tIllinois\tVermilion County\t241\t40.1\t11.5\t12.3\t17129\t78333\t0.4248\t61848\tObama\t61848\t0.000432307\t61848.0\n5760\t-87.670335\t40.381994\tRossville village\tIL\tIllinois\tVermilion County\t1174\t43.9\t16.2\t15.3\t18582\t82414\t0.4248\t60963\tObama\t60963\t0.002105928\t60963.0\n5761\t-87.63531\t39.977463\tGeorgetown city\tIL\tIllinois\tVermilion County\t3484\t37.5\t9.1\t14.1\t18963\t68729\t0.4248\t61846\tObama\t61846\t0.00624962\t61846.0\n5762\t-87.638476\t40.044604\tWestville village\tIL\tIllinois\tVermilion County\t2995\t42.1\t10.5\t14.0\t18695\t76492\t0.4248\t61883\tObama\t61883\t0.0053724490000000005\t61883.0\n5763\t-87.797617\t40.30672\tPotomac village\tIL\tIllinois\tVermilion County\t701\t38.7\t12.5\t10.9\t20313\t69524\t0.4248\t61865\tObama\t61865\t0.001257458\t61865.0\n5764\t-87.823621\t39.909739\tSidell village\tIL\tIllinois\tVermilion County\t590\t42.2\t10.4\t7.8\t15987\t67500\t0.4248\t61876\tObama\t61876\t0.0010583460000000002\t61876.0\n5765\t-87.933495\t39.91786\tAllerton village\tIL\tIllinois\tVermilion County\t297\t45.3\t23.0\t11.0\t23159\t97000\t0.4248\t61810\tObama\t61810\t0.00053276\t61810.0\n5766\t-87.740207\t39.927058\tIndianola village\tIL\tIllinois\tVermilion County\t227\t44.1\t8.6\t11.6\t20415\t85000\t0.4248\t61850\tObama\t61850\t0.000407194\t61850.0\n5767\t-87.613853\t40.142511999999996\tDanville city\tIL\tIllinois\tVermilion County\t32154\t37.7\t17.8\t16.5\t19951\t76720\t0.4248\t61832\tObama\t61832\t0.057678042\t61832.0\n5768\t-87.63984\t40.093784\tTilton village\tIL\tIllinois\tVermilion County\t2809\t44.5\t6.8\t14.4\t18499\t68302\t0.4248\t61833\tObama\t61833\t0.005038801\t61833.0\n5769\t-87.829433\t40.045579\tFairmount village\tIL\tIllinois\tVermilion County\t586\t41.1\t7.3\t10.5\t21093\t76250\t0.4248\t61841\tObama\t61841\t0.00105117\t61841.0\n5770\t-87.632747\t40.060769\tBelgium village\tIL\tIllinois\tVermilion County\t440\t39.4\t10.3\t15.3\t17303\t79286\t0.4248\t61883\tObama\t61883\t0.000789275\t61883.0\n5771\t-87.909878\t38.38288\tBellmont village\tIL\tIllinois\tWabash County\t303\t42.0\t12.1\t14.7\t18364\t69545\t0.3097\t62811\tObama\t62811\t0.0005435230000000001\t62811.0\n5772\t-87.868309\t38.351936\tKeensburg village\tIL\tIllinois\tWabash County\t240\t45.7\t15.1\t10.3\t21896\t62222\t0.3097\t62852\tObama\t62852\t0.00043051300000000004\t62852.0\n5773\t-87.769123\t38.417928\tMount Carmel city\tIL\tIllinois\tWabash County\t7370\t40.5\t13.5\t13.5\t20718\t69108\t0.3097\t62863\tObama\t62863\t0.013220351000000002\t62863.0\n5774\t-87.71037700000001\t38.527777\tAllendale village\tIL\tIllinois\tWabash County\t480\t42.4\t12.5\t14.5\t15770\t72632\t0.3097\t62410\tObama\t62410\t0.000861027\t62410.0\n5775\t-90.554076\t41.066276\tAlexis village\tIL\tIllinois\tWarren County\t785\t45.4\t13.4\t10.1\t21305\t77679\t0.5189\t61412\tObama\t61412\t0.001408138\t61412.0\n5776\t-90.7464\t41.010825\tLittle York village\tIL\tIllinois\tWarren County\t289\t40.8\t14.4\t10.9\t19729\t72500\t0.5189\t61453\tObama\t61453\t0.00051841\t61453.0\n5777\t-90.663899\t40.730573\tRoseville village\tIL\tIllinois\tWarren County\t976\t47.5\t20.7\t16.0\t21439\t75778\t0.5189\t61473\tObama\t61473\t0.001750755\t61473.0\n5778\t-90.748737\t40.867659\tKirkwood village\tIL\tIllinois\tWarren County\t697\t42.4\t10.5\t6.1\t17708\t68438\t0.5189\t61447\tObama\t61447\t0.001250283\t61447.0\n5779\t-90.64263299999999\t40.913624\tMonmouth city\tIL\tIllinois\tWarren County\t9530\t33.2\t20.8\t9.8\t20990\t70440\t0.5189\t61462\tObama\t61462\t0.017094972\t61462.0\n5780\t-89.50368\t38.26478\tOakdale village\tIL\tIllinois\tWashington County\t209\t41.0\t19.1\t10.1\t24483\t129545\t0.3309\t62268\tObama\t62268\t0.000374905\t62268.0\n5781\t-89.18164\t38.37437\tRichview village\tIL\tIllinois\tWashington County\t330\t40.3\t14.5\t11.3\t18881\t65455\t0.3309\t62877\tObama\t62877\t0.000591956\t62877.0\n5782\t-89.48676800000001\t38.391289\tAddieville village\tIL\tIllinois\tWashington County\t267\t44.0\t21.1\t5.5\t23027\t93000\t0.3309\t62271\tObama\t62271\t0.000478946\t62271.0\n5783\t-89.16176800000001\t38.436285999999996\tIrvington village\tIL\tIllinois\tWashington County\t679\t35.4\t15.5\t13.8\t21047\t85263\t0.3309\t62848\tObama\t62848\t0.001217994\t62848.0\n5784\t-89.645809\t38.3966\tVenedy village\tIL\tIllinois\tWashington County\t139\t41.5\t11.7\t6.2\t20187\t132813\t0.3309\t62266\tObama\t62266\t0.000249339\t62266.0\n5785\t-89.212802\t38.221381\tDu Bois village\tIL\tIllinois\tWashington County\t216\t50.0\t3.1\t12.4\t17230\t74444\t0.3309\t62831\tObama\t62831\t0.000387462\t62831.0\n5786\t-89.189137\t38.328897999999995\tAshley city\tIL\tIllinois\tWashington County\t577\t40.1\t7.3\t17.7\t18922\t53864\t0.3309\t62808\tObama\t62808\t0.001035026\t62808.0\n5787\t-89.370389\t38.437917\tNew Minden village\tIL\tIllinois\tWashington County\t195\t42.3\t16.2\t5.3\t20079\t92500\t0.3309\t62803\tObama\t62803\t0.000349792\t62803.0\n5788\t-89.19209599999999\t38.27981\tRadom village\tIL\tIllinois\tWashington County\t385\t49.8\t3.1\t12.6\t17196\t74375\t0.3309\t62876\tObama\t62876\t0.000690615\t62876.0\n5789\t-89.272162\t38.445854\tHoyleton village\tIL\tIllinois\tWashington County\t496\t37.6\t17.6\t7.5\t20434\t85833\t0.3309\t62803\tObama\t62803\t0.000889728\t62803.0\n5790\t-89.37945500000001\t38.352369\tNashville city\tIL\tIllinois\tWashington County\t3014\t41.1\t25.7\t7.0\t27369\t112617\t0.3309\t62263\tObama\t62263\t0.0054065319999999995\t62263.0\n5791\t-89.547925\t38.43439\tOkawville village\tIL\tIllinois\tWashington County\t1494\t39.5\t19.4\t7.7\t23805\t103571\t0.3309\t62271\tObama\t62271\t0.002679946\t62271.0\n5792\t-89.140562\t38.509493\tWamac city\tIL\tIllinois\tWashington County\t1283\t37.2\t5.0\t18.5\t18330\t41923\t0.3309\t62801\tObama\t62801\t0.0023014529999999997\t62801.0\n5793\t-88.20479399999999\t38.358768\tGolden Gate village\tIL\tIllinois\tWayne County\t91\t42.1\t7.7\t20.4\t15884\t50000\t0.1971\t62843\tObama\t62843\t0.000163236\t62843.0\n5794\t-88.641903\t38.338629\tKeenes village\tIL\tIllinois\tWayne County\t92\t40.8\t10.2\t9.5\t14813\t57500\t0.1971\t62895\tObama\t62895\t0.00016503\t62895.0\n5795\t-88.437031\t38.513758\tCisne village\tIL\tIllinois\tWayne County\t629\t42.3\t12.5\t13.5\t15626\t55857\t0.1971\t62823\tObama\t62823\t0.001128304\t62823.0\n5796\t-88.586905\t38.34884\tWayne City village\tIL\tIllinois\tWayne County\t996\t41.6\t11.2\t12.7\t18092\t62941\t0.1971\t62895\tObama\t62895\t0.0017866310000000001\t62895.0\n5797\t-88.538263\t38.520762\tJohnsonville village\tIL\tIllinois\tWayne County\t63\t44.4\t13.3\t9.7\t19650\t71667\t0.1971\t62850\tObama\t62850\t0.00011301\t62850.0\n5798\t-88.403973\t38.442398\tJeffersonville village\tIL\tIllinois\tWayne County\t415\t38.0\t10.2\t11.1\t17133\t54286\t0.1971\t62842\tObama\t62842\t0.00074443\t62842.0\n5799\t-88.232292\t38.514466\tMount Erie village\tIL\tIllinois\tWayne County\t103\t43.8\t13.3\t11.5\t17860\t80000\t0.1971\t62446\tObama\t62446\t0.00018476200000000002\t62446.0\n5800\t-88.53533900000001\t38.3615\tSims village\tIL\tIllinois\tWayne County\t247\t40.4\t5.8\t12.8\t17285\t57500\t0.1971\t62886\tObama\t62886\t0.00044307\t62886.0\n5801\t-88.371055\t38.378934\tFairfield city\tIL\tIllinois\tWayne County\t5331\t44.8\t14.7\t10.8\t19549\t66758\t0.1971\t62837\tObama\t62837\t0.00956278\t62837.0\n5802\t-88.354713\t38.178726\tSpringerton village\tIL\tIllinois\tWhite County\t140\t46.8\t7.8\t15.7\t16865\t56667\t0.3097\t62887\tObama\t62887\t0.000251133\t62887.0\n5803\t-88.327926\t37.979656\tNorris City village\tIL\tIllinois\tWhite County\t1086\t43.7\t7.7\t8.2\t15584\t46797\t0.3097\t62869\tObama\t62869\t0.0019480729999999998\t62869.0\n5804\t-88.04579100000001\t38.035349\tMaunie village\tIL\tIllinois\tWhite County\t175\t47.1\t8.6\t4.7\t18374\t34722\t0.3097\t62861\tObama\t62861\t0.00031391599999999997\t62861.0\n5805\t-88.01815\t38.142846\tPhillipstown village\tIL\tIllinois\tWhite County\t30\t41.3\t9.1\t5.3\t21301\t65000\t0.3097\t62827\tObama\t62827\t5.379999999999999e-05\t62827.0\n5806\t-88.064338\t38.162482000000004\tCrossville village\tIL\tIllinois\tWhite County\t808\t45.3\t9.8\t8.0\t19214\t59828\t0.3097\t62827\tObama\t62827\t0.001449395\t62827.0\n5807\t-87.996851\t38.269341\tGrayville city\tIL\tIllinois\tWhite County\t1600\t46.7\t7.5\t10.1\t18730\t54286\t0.3097\t62844\tObama\t62844\t0.00287009\t62844.0\n5808\t-88.337947\t38.101795\tEnfield village\tIL\tIllinois\tWhite County\t620\t45.9\t9.8\t11.1\t17444\t63000\t0.3097\t62835\tObama\t62835\t0.00111216\t62835.0\n5809\t-88.258454\t38.250833\tBurnt Prairie village\tIL\tIllinois\tWhite County\t55\t46.3\t7.1\t12.9\t19827\t55000\t0.3097\t62820\tObama\t62820\t9.87e-05\t62820.0\n5810\t-88.16953000000001\t38.08676\tCarmi city\tIL\tIllinois\tWhite County\t4988\t45.6\t10.8\t11.1\t18640\t59261\t0.3097\t62821\tObama\t62821\t0.008947505\t62821.0\n5811\t-88.345066\t38.260231\tMill Shoals village\tIL\tIllinois\tWhite County\t224\t46.1\t6.0\t12.8\t19723\t53750\t0.3097\t62809\tObama\t62809\t0.00040181300000000005\t62809.0\n5812\t-89.785253\t41.630531\tTampico village\tIL\tIllinois\tWhiteside County\t705\t38.9\t11.1\t6.2\t22143\t91458\t0.5756\t61283\tObama\t61283\t0.001264633\t61283.0\n5813\t-89.96429\t41.807711\tMorrison city\tIL\tIllinois\tWhiteside County\t4313\t42.0\t17.5\t11.2\t25836\t115097\t0.5756\t61270\tObama\t61270\t0.0077366859999999996\t61270.0\n5814\t-89.925251\t41.716615999999995\tLyndon village\tIL\tIllinois\tWhiteside County\t631\t43.3\t7.5\t8.0\t22083\t89063\t0.5756\t61261\tObama\t61261\t0.001131892\t61261.0\n5815\t-89.68745899999999\t41.609783\tDeer Grove village\tIL\tIllinois\tWhiteside County\t47\t34.2\t14.8\t13.0\t22033\t120833\t0.5756\t61243\tObama\t61243\t8.43e-05\t61243.0\n5816\t-90.081647\t41.658455\tErie village\tIL\tIllinois\tWhiteside County\t1706\t41.4\t16.2\t9.6\t23825\t122423\t0.5756\t61250\tObama\t61250\t0.003060233\t61250.0\n5817\t-90.157931\t41.864631\tFulton city\tIL\tIllinois\tWhiteside County\t3746\t42.9\t15.7\t8.5\t26132\t112651\t0.5756\t61252\tObama\t61252\t0.006719598\t61252.0\n5818\t-89.801932\t41.902962\tColeta village\tIL\tIllinois\tWhiteside County\t152\t41.5\t11.1\t12.6\t21617\t140000\t0.5756\t61051\tObama\t61051\t0.000272659\t61051.0\n5819\t-90.21812299999999\t41.785853\tAlbany village\tIL\tIllinois\tWhiteside County\t890\t41.6\t14.8\t11.2\t22526\t110634\t0.5756\t61230\tObama\t61230\t0.0015964870000000002\t61230.0\n5820\t-89.689818\t41.773284999999994\tRock Falls city\tIL\tIllinois\tWhiteside County\t9129\t37.6\t7.9\t14.8\t22342\t89392\t0.5756\t61071\tObama\t61071\t0.016375656000000002\t61071.0\n5821\t-89.68898100000001\t41.800807\tSterling city\tIL\tIllinois\tWhiteside County\t15001\t36.5\t15.1\t14.7\t23479\t103700\t0.5756\t61081\tObama\t61081\t0.026908886\t61081.0\n5822\t-89.934911\t41.670263\tProphetstown city\tIL\tIllinois\tWhiteside County\t1935\t46.7\t17.4\t12.0\t24575\t108165\t0.5756\t61261\tObama\t61261\t0.003471015\t61261.0\n5823\t-88.11797800000001\t41.505812\tRockdale village\tIL\tIllinois\tWill County\t1932\t36.2\t9.6\t21.3\t23521\t137601\t0.52\t60436\tObama\t60436\t0.003465633\t60436.0\n5824\t-87.973821\t41.516656\tNew Lenox village\tIL\tIllinois\tWill County\t23396\t35.3\t27.8\t9.0\t30369\t269405\t0.52\t60451\tObama\t60451\t0.041967887999999995\t60451.0\n5825\t-88.043428\t41.731023\tBolingbrook village\tIL\tIllinois\tWill County\t70262\t32.8\t34.9\t14.2\t30164\t223681\t0.52\t60517\tObama\t60517\t0.126036405\t60517.0\n5826\t-87.938848\t41.620058\tGoodings Grove CDP\tIL\tIllinois\tWill County\t20237\t38.9\t34.5\t10.3\t34765\t350141\t0.52\t60467\tObama\t60467\t0.036301254\t60467.0\n5827\t-88.054156\t41.327917\tSymerton village\tIL\tIllinois\tWill County\t132\t42.5\t22.0\t8.7\t31772\t180000\t0.52\t60481\tObama\t60481\t0.000236782\t60481.0\n5828\t-88.059639\t41.561852\tFairmont CDP\tIL\tIllinois\tWill County\t2830\t36.1\t8.4\t27.8\t21080\t131718\t0.52\t604HH\tObama\t604HH\t0.005076471\t0.0\n5829\t-87.616185\t41.346594\tBeecher village\tIL\tIllinois\tWill County\t2846\t45.8\t18.6\t10.9\t28759\t230802\t0.52\t60401\tObama\t60401\t0.005105172\t60401.0\n5830\t-88.045631\t41.588744\tLockport city\tIL\tIllinois\tWill County\t20770\t35.5\t25.5\t10.6\t29768\t236716\t0.52\t60441\tObama\t60441\t0.037257353\t60441.0\n5831\t-88.22010300000001\t41.270691\tBraidwood city\tIL\tIllinois\tWill County\t6563\t35.5\t10.9\t12.5\t24510\t161085\t0.52\t60408\tObama\t60408\t0.01177275\t60408.0\n5832\t-87.540012\t41.454774\tWillowbrook CDP\tIL\tIllinois\tWill County\t2395\t48.3\t36.3\t10.8\t41306\t368687\t0.52\t60417\tObama\t60417\t0.004296166\t60417.0\n5833\t-88.216036\t41.434343\tChannahon village\tIL\tIllinois\tWill County\t11556\t35.2\t20.1\t12.7\t28354\t227319\t0.52\t60410\tObama\t60410\t0.020729223\t60410.0\n5834\t-88.208323\t41.519335\tShorewood village\tIL\tIllinois\tWill County\t13230\t37.9\t36.4\t6.8\t36850\t244584\t0.52\t60431\tObama\t60431\t0.023732055\t60431.0\n5835\t-87.796779\t41.330762\tPeotone village\tIL\tIllinois\tWill County\t4866\t39.2\t22.9\t12.1\t29207\t233703\t0.52\t60468\tObama\t60468\t0.008728661\t60468.0\n5836\t-88.122421\t41.556888\tJoliet city\tIL\tIllinois\tWill County\t140449\t32.2\t23.1\t16.0\t24717\t194120\t0.52\t60435\tObama\t60435\t0.251938275\t60435.0\n5837\t-87.713942\t41.471225\tUniversity Park village\tIL\tIllinois\tWill County\t8006\t29.3\t29.4\t19.1\t24161\t135933\t0.52\t60471\tObama\t60471\t0.014361212\t60471.0\n5838\t-88.07252\t41.491201000000004\tPreston Heights CDP\tIL\tIllinois\tWill County\t2682\t32.0\t10.8\t25.4\t20214\t117159\t0.52\t60433\tObama\t60433\t0.0048109879999999995\t60433.0\n5839\t-88.098473\t41.633303000000005\tRomeoville village\tIL\tIllinois\tWill County\t32213\t35.1\t23.2\t10.6\t28554\t192214\t0.52\t60446\tObama\t60446\t0.057783876\t60446.0\n5840\t-88.14994399999999\t41.571352000000005\tCrystal Lawns CDP\tIL\tIllinois\tWill County\t3164\t36.3\t23.1\t10.3\t27471\t211364\t0.52\t60435\tObama\t60435\t0.005675603\t60435.0\n5841\t-88.10834\t41.570252\tCrest Hill city\tIL\tIllinois\tWill County\t17857\t34.7\t15.5\t12.3\t26152\t166667\t0.52\t60435\tObama\t60435\t0.032031996\t60435.0\n5842\t-88.109054\t41.441313\tElwood village\tIL\tIllinois\tWill County\t2076\t39.2\t13.3\t10.8\t28284\t197147\t0.52\t60421\tObama\t60421\t0.0037239409999999997\t60421.0\n5843\t-88.13691\t41.271248\tLakewood Shores CDP\tIL\tIllinois\tWill County\t1595\t42.1\t9.0\t17.3\t24862\t162292\t0.52\t60481\tObama\t60481\t0.002861121\t60481.0\n5844\t-87.87375300000001\t41.532255\tMokena village\tIL\tIllinois\tWill County\t18320\t36.9\t36.6\t10.2\t32651\t312091\t0.52\t60448\tObama\t60448\t0.032862527999999995\t60448.0\n5845\t-87.783733\t41.497471000000004\tFrankfort village\tIL\tIllinois\tWill County\t16367\t42.8\t41.7\t9.5\t38494\t356693\t0.52\t60443\tObama\t60443\t0.029359225\t60443.0\n5846\t-88.03375\t41.520549\tIngalls Park CDP\tIL\tIllinois\tWill County\t3190\t35.8\t7.7\t17.9\t23781\t125084\t0.52\t60433\tObama\t60433\t0.005722242\t60433.0\n5847\t-88.206524\t41.61645\tPlainfield village\tIL\tIllinois\tWill County\t26801\t33.4\t40.3\t7.5\t33573\t302173\t0.52\t60544\tObama\t60544\t0.048075797999999996\t60544.0\n5848\t-88.240775\t41.238699\tGodley village\tIL\tIllinois\tWill County\t597\t36.1\t9.4\t13.8\t23064\t143548\t0.52\t60407\tObama\t60407\t0.0010709019999999999\t60407.0\n5849\t-87.752177\t41.416892\tMonee village\tIL\tIllinois\tWill County\t4064\t40.1\t23.0\t10.5\t31500\t208750\t0.52\t60449\tObama\t60449\t0.0072900280000000005\t60449.0\n5850\t-87.61899100000001\t41.449595\tCrete village\tIL\tIllinois\tWill County\t8719\t43.7\t30.2\t11.0\t33047\t224123\t0.52\t60417\tObama\t60417\t0.015640195\t60417.0\n5851\t-87.80336700000001\t41.518206\tFrankfort Square CDP\tIL\tIllinois\tWill County\t8758\t30.7\t27.2\t10.3\t27174\t256801\t0.52\t60423\tObama\t60423\t0.015710154\t60423.0\n5852\t-87.99096999999999\t41.43584\tManhattan village\tIL\tIllinois\tWill County\t4911\t33.3\t21.6\t7.8\t27344\t243160\t0.52\t60442\tObama\t60442\t0.008809382\t60442.0\n5853\t-88.150345\t41.305738\tWilmington city\tIL\tIllinois\tWill County\t6023\t37.7\t11.3\t19.4\t26564\t154147\t0.52\t60481\tObama\t60481\t0.010804093999999998\t60481.0\n5854\t-88.920422\t37.765017\tSpillertown village\tIL\tIllinois\tWilliamson County\t244\t38.1\t10.9\t11.3\t18006\t85833\t0.3653\t62959\tObama\t62959\t0.000437689\t62959.0\n5855\t-89.03026700000001\t37.800755\tHerrin city\tIL\tIllinois\tWilliamson County\t11648\t41.8\t20.6\t10.5\t20175\t74429\t0.3653\t62948\tObama\t62948\t0.020894253999999998\t62948.0\n5856\t-89.081579\t37.759977\tCarterville city\tIL\tIllinois\tWilliamson County\t4652\t36.7\t34.0\t10.7\t20619\t100595\t0.3653\t62918\tObama\t62918\t0.008344786\t62918.0\n5857\t-88.927839\t37.821244\tJohnston City\tIL\tIllinois\tWilliamson County\t3530\t42.3\t9.2\t12.1\t15600\t55047\t0.3653\t62951\tObama\t62951\t0.0063321359999999995\t62951.0\n5858\t-89.117655\t37.779897999999996\tCambria village\tIL\tIllinois\tWilliamson County\t1379\t36.2\t23.9\t10.8\t19610\t85345\t0.3653\t62915\tObama\t62915\t0.002473659\t62915.0\n5859\t-89.144261\t37.835128000000005\tHurst city\tIL\tIllinois\tWilliamson County\t820\t41.5\t9.1\t14.7\t15110\t44886\t0.3653\t62949\tObama\t62949\t0.001470921\t62949.0\n5860\t-88.850053\t37.777038\tPittsburg village\tIL\tIllinois\tWilliamson County\t716\t41.5\t16.2\t7.3\t22530\t76563\t0.3653\t62974\tObama\t62974\t0.001284365\t62974.0\n5861\t-88.99875899999999\t37.863983000000005\tFreeman Spur village\tIL\tIllinois\tWilliamson County\t291\t45.1\t9.5\t14.3\t16997\t75500\t0.3653\t62874\tObama\t62874\t0.0005219980000000001\t62874.0\n5862\t-88.83747\t37.619782\tCreal Springs city\tIL\tIllinois\tWilliamson County\t745\t44.3\t14.9\t17.5\t16885\t75333\t0.3653\t62922\tObama\t62922\t0.001336386\t62922.0\n5863\t-88.93634200000001\t37.724987\tMarion city\tIL\tIllinois\tWilliamson County\t17068\t42.0\t20.3\t11.2\t22507\t96977\t0.3653\t62959\tObama\t62959\t0.030616683\t62959.0\n5864\t-89.12956\t37.842657\tBush village\tIL\tIllinois\tWilliamson County\t262\t41.9\t9.3\t14.3\t15101\t44615\t0.3653\t62949\tObama\t62949\t0.00046997699999999995\t62949.0\n5865\t-89.061131\t37.751262\tCrainville village\tIL\tIllinois\tWilliamson County\t1055\t39.1\t31.0\t6.6\t22707\t95185\t0.3653\t62918\tObama\t62918\t0.001892465\t62918.0\n5866\t-88.929392\t37.785394000000004\tWhiteash village\tIL\tIllinois\tWilliamson County\t289\t40.4\t11.9\t12.1\t17767\t92500\t0.3653\t62951\tObama\t62951\t0.00051841\t62951.0\n5867\t-89.024438\t37.774397\tEnergy village\tIL\tIllinois\tWilliamson County\t1306\t45.3\t29.3\t5.3\t23677\t132904\t0.3653\t62933\tObama\t62933\t0.002342711\t62933.0\n5868\t-89.078492\t37.807460999999996\tColp village\tIL\tIllinois\tWilliamson County\t244\t44.0\t13.7\t8.1\t17221\t78333\t0.3653\t62921\tObama\t62921\t0.000437689\t62921.0\n5869\t-89.32634499999999\t42.43482\tDurand village\tIL\tIllinois\tWinnebago County\t1163\t38.9\t17.9\t20.5\t23182\t122523\t0.5188\t61024\tObama\t61024\t0.002086197\t61024.0\n5870\t-88.96866800000001\t42.235805\tCherry Valley village\tIL\tIllinois\tWinnebago County\t2762\t42.6\t25.6\t13.0\t29879\t158616\t0.5188\t61112\tObama\t61112\t0.0049544920000000004\t61112.0\n5871\t-88.935546\t42.336176\tLoves Park city\tIL\tIllinois\tWinnebago County\t23397\t35.9\t19.4\t15.8\t26531\t126402\t0.5188\t61011\tObama\t61011\t0.041969682\t61011.0\n5872\t-89.06164799999999\t42.45136\tRockton village\tIL\tIllinois\tWinnebago County\t7253\t37.3\t29.8\t10.3\t25840\t158682\t0.5188\t61072\tObama\t61072\t0.013010476000000002\t61072.0\n5873\t-89.061936\t42.262941999999995\tRockford city\tIL\tIllinois\tWinnebago County\t154860\t36.4\t20.9\t20.9\t24036\t112274\t0.5188\t61104\tObama\t61104\t0.277788815\t61104.0\n5874\t-89.010551\t42.424171\tRoscoe village\tIL\tIllinois\tWinnebago County\t9495\t37.3\t23.0\t13.7\t28422\t174489\t0.5188\t61073\tObama\t61073\t0.017032189\t61073.0\n5875\t-89.062652\t42.179482\tNew Millford village\tIL\tIllinois\tWinnebago County\t583\t44.6\t14.6\t13.5\t24069\t102734\t0.5188\t61109\tObama\t61109\t0.0010457889999999999\t61109.0\n5876\t-89.238771\t42.26627\tWinnebago village\tIL\tIllinois\tWinnebago County\t3294\t37.1\t19.7\t14.6\t24585\t149949\t0.5188\t61088\tObama\t61088\t0.0059087969999999995\t61088.0\n5877\t-89.030263\t42.484203\tSouth Beloit city\tIL\tIllinois\tWinnebago County\t6113\t35.6\t12.2\t15.7\t22529\t118202\t0.5188\t61080\tObama\t61080\t0.010965537\t61080.0\n5878\t-89.390437\t42.45341\tLake Summerset CDP\tIL\tIllinois\tWinnebago County\t2215\t47.2\t30.1\t12.6\t29510\t165346\t0.5188\t61019\tObama\t61019\t0.0039732809999999995\t61019.0\n5879\t-89.357661\t42.308946\tPecatonica village\tIL\tIllinois\tWinnebago County\t2171\t39.0\t14.5\t14.5\t25222\t127815\t0.5188\t61063\tObama\t61063\t0.0038943529999999997\t61063.0\n5880\t-89.02926\t42.365660999999996\tMachesney Park village\tIL\tIllinois\tWinnebago County\t22966\t38.2\t12.3\t16.6\t25253\t127522\t0.5188\t61115\tObama\t61115\t0.041196551\t61115.0\n5881\t-89.135472\t40.740901\tSecor village\tIL\tIllinois\tWoodford County\t426\t39.6\t10.8\t16.3\t23340\t124219\t0.2952\t61771\tObama\t61771\t0.0007641610000000001\t61771.0\n5882\t-89.29239100000001\t40.925777000000004\tWashburn village\tIL\tIllinois\tWoodford County\t1265\t36.3\t14.9\t19.9\t22511\t106019\t0.2952\t61570\tObama\t61570\t0.002269165\t61570.0\n5883\t-89.530743\t40.820116999999996\tSpring Bay village\tIL\tIllinois\tWoodford County\t436\t44.4\t20.6\t12.4\t27529\t138068\t0.2952\t615HH\tObama\t615HH\t0.000782099\t0.0\n5884\t-89.00849699999999\t40.675664000000005\tKappa village\tIL\tIllinois\tWoodford County\t178\t44.0\t21.1\t13.0\t23605\t142045\t0.2952\t61748\tObama\t61748\t0.000319297\t61748.0\n5885\t-89.201522\t40.796665999999995\tRoanoke village\tIL\tIllinois\tWoodford County\t2229\t39.5\t17.3\t9.6\t24136\t132425\t0.2952\t61561\tObama\t61561\t0.003998394000000001\t61561.0\n5886\t-89.46609699999999\t40.771231\tGermantown Hills village\tIL\tIllinois\tWoodford County\t2458\t37.7\t43.8\t6.8\t32357\t232519\t0.2952\t61548\tObama\t61548\t0.004409175\t61548.0\n5887\t-88.979388\t40.738582\tEl Paso city\tIL\tIllinois\tWoodford County\t2776\t37.2\t23.6\t9.3\t25407\t131643\t0.2952\t61738\tObama\t61738\t0.004979606\t61738.0\n5888\t-89.020282\t40.784634999999994\tPanola village\tIL\tIllinois\tWoodford County\t36\t41.3\t19.2\t13.6\t22913\t137500\t0.2952\t61738\tObama\t61738\t6.459999999999998e-05\t61738.0\n5889\t-89.51864599999999\t40.80995\tBay View Gardens village\tIL\tIllinois\tWoodford County\t377\t38.0\t8.4\t10.8\t21482\t116319\t0.2952\t615HH\tObama\t615HH\t0.000676265\t0.0\n5890\t-89.277857\t40.713843\tEureka city\tIL\tIllinois\tWoodford County\t5073\t36.0\t25.2\t5.9\t25465\t138341\t0.2952\t61530\tObama\t61530\t0.009099978\t61530.0\n5891\t-89.208288\t40.616122999999995\tCongerville village\tIL\tIllinois\tWoodford County\t540\t37.5\t18.5\t4.8\t25229\t219048\t0.2952\t61729\tObama\t61729\t0.000968655\t61729.0\n5892\t-89.121003\t40.850372\tBenson village\tIL\tIllinois\tWoodford County\t456\t38.8\t18.6\t13.5\t23976\t118981\t0.2952\t61516\tObama\t61516\t0.0008179760000000001\t61516.0\n5893\t-89.0385\t40.90426\tMinonk city\tIL\tIllinois\tWoodford County\t2162\t41.3\t16.8\t13.6\t23122\t109962\t0.2952\t61760\tObama\t61760\t0.003878209\t61760.0\n5894\t-89.364021\t40.792868\tMetamora village\tIL\tIllinois\tWoodford County\t2877\t45.9\t27.5\t8.2\t25700\t142718\t0.2952\t61548\tObama\t61548\t0.00516078\t61548.0\n5895\t-89.268198\t40.630041999999996\tGoodfield village\tIL\tIllinois\tWoodford County\t797\t32.7\t24.1\t9.4\t22500\t159524\t0.2952\t61742\tObama\t61742\t0.0014296629999999999\t61742.0\n5896\t-84.928598\t40.82986\tDecatur city\tIN\tIndiana\tAdams County\t9263\t37.1\t12.3\t13.9\t25098\t95977\t0.2925\t46733\tRomney\t46733\t0.024530918999999998\t46733.0\n5897\t-84.955471\t40.656884000000005\tBerne city\tIN\tIndiana\tAdams County\t4056\t37.3\t19.3\t11.3\t20050\t94388\t0.2925\t46711\tRomney\t46711\t0.010741381000000001\t46711.0\n5898\t-84.941612\t40.744847\tMonroe town\tIN\tIndiana\tAdams County\t745\t32.2\t14.5\t10.6\t23480\t105000\t0.2925\t46772\tRomney\t46772\t0.001972961\t46772.0\n5899\t-84.956462\t40.597423\tGeneva town\tIN\tIndiana\tAdams County\t1448\t38.0\t11.7\t11.0\t18257\t77969\t0.2925\t46740\tRomney\t46740\t0.003834694\t46740.0\n5900\t-85.165768\t41.230692\tHuntertown town\tIN\tIndiana\tAllen County\t2713\t37.7\t26.3\t4.5\t29210\t114338\t0.4086\t46748\tRomney\t46748\t0.007184755\t46748.0\n5901\t-84.86815\t40.973167\tMonroeville town\tIN\tIndiana\tAllen County\t1244\t36.9\t13.0\t7.9\t19595\t80667\t0.4086\t46773\tRomney\t46773\t0.0032944470000000003\t46773.0\n5902\t-85.129349\t41.079553000000004\tFort Wayne city\tIN\tIndiana\tAllen County\t205395\t34.3\t21.4\t13.8\t23002\t82011\t0.4086\t46805\tRomney\t46805\t0.5439412889999999\t46805.0\n5903\t-84.968603\t41.209685\tGrabill town\tIN\tIndiana\tAllen County\t1259\t30.3\t18.8\t7.5\t18849\t97212\t0.4086\t46741\tRomney\t46741\t0.003334171\t46741.0\n5904\t-85.032022\t41.064563\tNew Haven city\tIN\tIndiana\tAllen County\t12042\t37.8\t14.4\t10.4\t25771\t81305\t0.4086\t46774\tRomney\t46774\t0.03189046\t46774.0\n5905\t-85.019288\t41.219479\tLeo-Cedarville town\tIN\tIndiana\tAllen County\t3417\t37.9\t30.5\t8.3\t28323\t134083\t0.4086\t46765\tRomney\t46765\t0.009049136\t46765.0\n5906\t-84.85726899999999\t41.128796\tWoodburn city\tIN\tIndiana\tAllen County\t1586\t31.3\t11.7\t12.5\t21605\t75476\t0.4086\t46797\tRomney\t46797\t0.004200155\t46797.0\n5907\t-85.95039\t39.296527000000005\tTaylorsville CDP\tIN\tIndiana\tBartholomew County\t969\t37.7\t7.3\t7.9\t18623\t102232\t0.3623\t47280\tRomney\t47280\t0.0025661729999999997\t47280.0\n5908\t-85.766144\t39.29965\tHope town\tIN\tIndiana\tBartholomew County\t2115\t35.6\t13.3\t14.2\t18775\t82547\t0.3623\t47246\tRomney\t47246\t0.00560109\t47246.0\n5909\t-85.918029\t39.211161\tColumbus city\tIN\tIndiana\tBartholomew County\t41565\t38.4\t31.1\t10.0\t27702\t128980\t0.3623\t47201\tRomney\t47201\t0.11007531699999999\t47201.0\n5910\t-85.869457\t39.282444\tClifford town\tIN\tIndiana\tBartholomew County\t298\t36.6\t12.4\t12.8\t22911\t114844\t0.3623\t47226\tRomney\t47226\t0.000789184\t47226.0\n5911\t-85.887744\t39.059921\tJonesville town\tIN\tIndiana\tBartholomew County\t222\t39.5\t19.3\t9.2\t26266\t114773\t0.3623\t47247\tRomney\t47247\t0.000587916\t47247.0\n5912\t-85.699206\t39.266709000000006\tHartsville town\tIN\tIndiana\tBartholomew County\t392\t40.6\t22.8\t7.8\t23437\t113333\t0.3623\t47244\tRomney\t47244\t0.001038122\t47244.0\n5913\t-85.81254\t39.13521\tElizabethtown town\tIN\tIndiana\tBartholomew County\t418\t41.1\t11.3\t8.0\t21540\t59375\t0.3623\t47232\tRomney\t47232\t0.0011069769999999999\t47232.0\n5914\t-87.248476\t40.521454\tOxford town\tIN\tIndiana\tBenton County\t1311\t41.1\t16.9\t10.2\t21381\t90111\t0.3239\t47971\tRomney\t47971\t0.0034718809999999996\t47971.0\n5915\t-87.090621\t40.488817\tOtterbein town\tIN\tIndiana\tBenton County\t1210\t34.8\t21.9\t8.4\t24270\t103086\t0.3239\t47970\tRomney\t47970\t0.003204406\t47970.0\n5916\t-87.382931\t40.518924\tBoswell town\tIN\tIndiana\tBenton County\t800\t38.2\t12.4\t11.7\t20537\t76857\t0.3239\t47921\tRomney\t47921\t0.0021186160000000002\t47921.0\n5917\t-87.318844\t40.617358\tFowler town\tIN\tIndiana\tBenton County\t2230\t37.2\t18.2\t11.7\t25593\t94551\t0.3239\t47944\tRomney\t47944\t0.005905641\t47944.0\n5918\t-87.516346\t40.489599\tAmbia town\tIN\tIndiana\tBenton County\t183\t43.8\t10.9\t8.8\t19680\t72500\t0.3239\t47917\tRomney\t47917\t0.00048463300000000005\t47917.0\n5919\t-87.419925\t40.685534000000004\tEarl Park town\tIN\tIndiana\tBenton County\t437\t41.2\t8.9\t9.5\t17803\t87143\t0.3239\t47942\tRomney\t47942\t0.001157294\t47942.0\n5920\t-85.372777\t40.453410999999996\tHartford City\tIN\tIndiana\tBlackford County\t6419\t39.7\t14.0\t12.8\t20569\t74444\t0.4063\t47348\tRomney\t47348\t0.016999241000000002\t47348.0\n5921\t-85.426367\t40.411784000000004\tShamrock Lakes town\tIN\tIndiana\tBlackford County\t172\t47.0\t18.0\t17.0\t25683\t96429\t0.4063\t47348\tRomney\t47348\t0.000455502\t47348.0\n5922\t-85.28353\t40.551806\tMontpelier city\tIN\tIndiana\tBlackford County\t1808\t37.4\t8.5\t12.2\t20559\t69776\t0.4063\t47359\tRomney\t47359\t0.004788071\t47359.0\n5923\t-86.620499\t39.995745\tAdvance town\tIN\tIndiana\tBoone County\t564\t39.8\t15.2\t10.5\t24906\t115625\t0.3002\t46102\tRomney\t46102\t0.001493624\t46102.0\n5924\t-86.463305\t40.064403999999996\tUlen town\tIN\tIndiana\tBoone County\t135\t48.4\t29.0\t10.2\t28927\t137500\t0.3002\t46052\tRomney\t46052\t0.000357516\t46052.0\n5925\t-86.61004\t40.129507000000004\tThorntown town\tIN\tIndiana\tBoone County\t1566\t40.8\t7.0\t9.3\t20955\t106673\t0.3002\t46071\tRomney\t46071\t0.00414719\t46071.0\n5926\t-86.62290300000001\t39.926969\tJamestown town\tIN\tIndiana\tBoone County\t957\t40.6\t14.8\t11.9\t27572\t108814\t0.3002\t46147\tRomney\t46147\t0.002534394\t46147.0\n5927\t-86.474627\t40.051691\tLebanon city\tIN\tIndiana\tBoone County\t15530\t36.1\t18.4\t11.1\t24369\t104294\t0.3002\t46052\tRomney\t46052\t0.041127622999999995\t46052.0\n5928\t-86.267718\t39.956736\tZionsville town\tIN\tIndiana\tBoone County\t10120\t41.8\t54.5\t7.0\t40020\t234091\t0.3002\t46077\tRomney\t46077\t0.026800486000000002\t46077.0\n5929\t-86.346463\t39.996021\tWhitestown town\tIN\tIndiana\tBoone County\t565\t41.8\t14.1\t9.2\t23100\t138306\t0.3002\t46075\tRomney\t46075\t0.001496272\t46075.0\n5930\t-86.246175\t39.206175\tNashville town\tIN\tIndiana\tBrown County\t818\t49.0\t28.0\t11.7\t25735\t139216\t0.4024\t47448\tRomney\t47448\t0.002166284\t47448.0\n5931\t-86.53903199999999\t40.609811\tCamden town\tIN\tIndiana\tCarroll County\t586\t36.5\t12.9\t9.7\t18386\t83571\t0.3374\t46917\tRomney\t46917\t0.0015518860000000002\t46917.0\n5932\t-86.394514\t40.480979\tBurlington town\tIN\tIndiana\tCarroll County\t473\t41.5\t15.9\t8.4\t25416\t102222\t0.3374\t46920\tRomney\t46920\t0.0012526310000000001\t46920.0\n5933\t-86.66788100000001\t40.584511\tDelphi city\tIN\tIndiana\tCarroll County\t3139\t36.7\t17.6\t12.4\t22044\t95580\t0.3374\t46923\tRomney\t46923\t0.008312918\t46923.0\n5934\t-86.723601\t40.667693\tYeoman town\tIN\tIndiana\tCarroll County\t94\t37.9\t14.3\t13.6\t21543\t110938\t0.3374\t47997\tRomney\t47997\t0.000248937\t47997.0\n5935\t-86.523288\t40.545082\tFlora town\tIN\tIndiana\tCarroll County\t2184\t38.9\t14.0\t8.2\t21325\t92000\t0.3374\t46929\tRomney\t46929\t0.00578382\t46929.0\n5936\t-86.19553499999999\t40.694469\tOnward town\tIN\tIndiana\tCass County\t78\t39.5\t17.3\t12.2\t24715\t130000\t0.3793\t469HH\tRomney\t469HH\t0.000206565\t0.0\n5937\t-86.19147199999999\t40.577011\tGalveston town\tIN\tIndiana\tCass County\t1522\t39.5\t14.4\t8.4\t27711\t107303\t0.3793\t46932\tRomney\t46932\t0.004030666\t46932.0\n5938\t-86.244292\t40.662288000000004\tWalton town\tIN\tIndiana\tCass County\t1005\t41.2\t20.3\t10.3\t21924\t96000\t0.3793\t46994\tRomney\t46994\t0.0026615109999999997\t46994.0\n5939\t-86.500465\t40.864733\tRoyal Center town\tIN\tIndiana\tCass County\t830\t40.4\t13.1\t10.1\t28097\t76053\t0.3793\t46978\tRomney\t46978\t0.002198064\t46978.0\n5940\t-86.354715\t40.75223\tLogansport city\tIN\tIndiana\tCass County\t18777\t36.0\t12.9\t12.5\t21896\t79693\t0.3793\t46947\tRomney\t46947\t0.049726554000000006\t46947.0\n5941\t-85.721153\t38.308877\tJeffersonville city\tIN\tIndiana\tClark County\t28921\t38.3\t17.2\t11.2\t26084\t112075\t0.4413\t47130\tRomney\t47130\t0.07659059900000001\t47130.0\n5942\t-85.6668\t38.452193\tCharlestown city\tIN\tIndiana\tClark County\t6396\t35.9\t12.5\t11.6\t19968\t96439\t0.4413\t47111\tRomney\t47111\t0.016938331\t47111.0\n5943\t-85.76836899999999\t38.489976\tMemphis CDP\tIN\tIndiana\tClark County\t508\t45.5\t11.1\t5.4\t25101\t137054\t0.4413\t47143\tRomney\t47143\t0.001345321\t47143.0\n5944\t-85.760143\t38.389416\tSellersburg town\tIN\tIndiana\tClark County\t6580\t39.8\t18.4\t8.6\t26099\t113611\t0.4413\t47172\tRomney\t47172\t0.017425613\t47172.0\n5945\t-85.68975999999999\t38.305937\tOak Park CDP\tIN\tIndiana\tClark County\t5798\t38.3\t24.5\t6.8\t29763\t130919\t0.4413\t47130\tRomney\t47130\t0.015354666000000001\t47130.0\n5946\t-85.656064\t38.333987\tUtica town\tIN\tIndiana\tClark County\t771\t49.5\t13.1\t9.2\t27041\t110577\t0.4413\t47130\tRomney\t47130\t0.002041816\t47130.0\n5947\t-85.948739\t38.471332000000004\tBorden town\tIN\tIndiana\tClark County\t914\t39.4\t13.5\t10.8\t21000\t103770\t0.4413\t47106\tRomney\t47106\t0.002420518\t47106.0\n5948\t-85.546018\t38.565665\tNew Washington CDP\tIN\tIndiana\tClark County\t592\t41.4\t18.4\t13.7\t23897\t87500\t0.4413\t47147\tRomney\t47147\t0.001567775\t47147.0\n5949\t-85.765681\t38.539248\tHenryville CDP\tIN\tIndiana\tClark County\t1819\t36.9\t15.8\t6.1\t23101\t108183\t0.4413\t47126\tRomney\t47126\t0.0048172020000000005\t47126.0\n5950\t-85.76740600000001\t38.322674\tClarksville town\tIN\tIndiana\tClark County\t22212\t38.9\t15.3\t10.1\t23554\t112177\t0.4413\t47129\tRomney\t47129\t0.058823359000000006\t47129.0\n5951\t-87.075186\t39.415368\tCenter Point town\tIN\tIndiana\tClay County\t291\t39.4\t16.0\t14.9\t20798\t102381\t0.3208\t47840\tRomney\t47840\t0.000770646\t47840.0\n5952\t-87.07354000000001\t39.533586\tHarmony town\tIN\tIndiana\tClay County\t596\t41.4\t16.7\t8.8\t19420\t90476\t0.3208\t47853\tRomney\t47853\t0.001578369\t47853.0\n5953\t-87.188951\t39.486351\tStaunton town\tIN\tIndiana\tClay County\t593\t40.6\t22.7\t8.4\t21220\t107738\t0.3208\t47881\tRomney\t47881\t0.001570424\t47881.0\n5954\t-87.123991\t39.522448\tBrazil city\tIN\tIndiana\tClay County\t8215\t37.9\t12.9\t11.7\t20512\t73443\t0.3208\t47834\tRomney\t47834\t0.021755532999999997\t47834.0\n5955\t-87.112636\t39.276934999999995\tClay City town\tIN\tIndiana\tClay County\t941\t39.1\t13.5\t11.6\t20402\t68194\t0.3208\t47841\tRomney\t47841\t0.002492021\t47841.0\n5956\t-87.107832\t39.599090999999994\tCarbon town\tIN\tIndiana\tClay County\t328\t38.3\t13.8\t9.0\t18804\t88500\t0.3208\t47837\tRomney\t47837\t0.0008686319999999999\t47837.0\n5957\t-87.089057\t39.525275\tKnightsville town\tIN\tIndiana\tClay County\t616\t44.0\t14.8\t7.6\t20377\t85833\t0.3208\t47853\tRomney\t47853\t0.001631334\t47853.0\n5958\t-86.506561\t40.281117\tFrankfort city\tIN\tIndiana\tClinton County\t16432\t35.3\t10.2\t14.6\t20054\t95055\t0.3347\t46041\tRomney\t46041\t0.043516362\t46041.0\n5959\t-86.667479\t40.345803000000004\tMulberry town\tIN\tIndiana\tClinton County\t1397\t42.1\t12.9\t9.2\t25994\t121514\t0.3347\t46058\tRomney\t46058\t0.003699632\t46058.0\n5960\t-86.391609\t40.327973\tMichigantown town\tIN\tIndiana\tClinton County\t395\t38.9\t9.8\t10.0\t21185\t97353\t0.3347\t46057\tRomney\t46057\t0.001046066\t46057.0\n5961\t-86.667118\t40.194377\tColfax town\tIN\tIndiana\tClinton County\t766\t36.5\t8.4\t13.2\t20397\t90000\t0.3347\t46035\tRomney\t46035\t0.002028574\t46035.0\n5962\t-86.595641\t40.419983\tRossville town\tIN\tIndiana\tClinton County\t1656\t39.3\t14.7\t7.8\t21167\t124605\t0.3347\t46065\tRomney\t46065\t0.004385534\t46065.0\n5963\t-86.359219\t40.192972\tKirklin town\tIN\tIndiana\tClinton County\t847\t38.1\t11.3\t9.1\t23521\t95172\t0.3347\t46050\tRomney\t46050\t0.002243084\t46050.0\n5964\t-86.41954799999999\t38.121186\tAlton town\tIN\tIndiana\tCrawford County\t48\t41.3\t15.2\t4.5\t16858\t70000\t0.4447\t47137\tRomney\t47137\t0.000127117\t47137.0\n5965\t-86.458985\t38.34094\tEnglish town\tIN\tIndiana\tCrawford County\t714\t41.3\t10.7\t12.2\t16694\t64107\t0.4447\t47118\tRomney\t47118\t0.001890864\t47118.0\n5966\t-86.34439300000001\t38.3713\tMarengo town\tIN\tIndiana\tCrawford County\t859\t38.5\t6.1\t10.7\t15734\t68250\t0.4447\t47140\tRomney\t47140\t0.002274863\t47140.0\n5967\t-86.268332\t38.342616\tMilltown town\tIN\tIndiana\tCrawford County\t983\t40.6\t13.4\t9.8\t21156\t92656\t0.4447\t47145\tRomney\t47145\t0.0026032489999999998\t47145.0\n5968\t-86.345098\t38.199393\tLeavenworth town\tIN\tIndiana\tCrawford County\t341\t41.9\t7.5\t7.5\t18671\t81111\t0.4447\t47137\tRomney\t47137\t0.00090306\t47137.0\n5969\t-86.948231\t38.560527\tAlfordsville town\tIN\tIndiana\tDaviess County\t117\t36.5\t16.4\t7.6\t17885\t73333\t0.2378\t47519\tRomney\t47519\t0.000309848\t47519.0\n5970\t-87.04719399999999\t38.664975\tMontgomery town\tIN\tIndiana\tDaviess County\t389\t33.1\t7.7\t4.8\t17951\t105405\t0.2378\t47558\tRomney\t47558\t0.001030177\t47558.0\n5971\t-86.99740600000001\t38.667621000000004\tCannelburg town\tIN\tIndiana\tDaviess County\t143\t31.3\t6.3\t3.2\t14013\t97500\t0.2378\t47519\tRomney\t47519\t0.00037870300000000004\t47519.0\n5972\t-87.085054\t38.876296999999994\tElnora town\tIN\tIndiana\tDaviess County\t733\t43.5\t8.6\t10.9\t16273\t48056\t0.2378\t47529\tRomney\t47529\t0.0019411810000000002\t47529.0\n5973\t-87.172012\t38.659151\tWashington city\tIN\tIndiana\tDaviess County\t11478\t40.0\t11.9\t8.3\t20139\t78809\t0.2378\t47501\tRomney\t47501\t0.030396836\t47501.0\n5974\t-86.989226\t38.842543\tOdon town\tIN\tIndiana\tDaviess County\t1510\t43.2\t14.4\t5.4\t20228\t75543\t0.2378\t47562\tRomney\t47562\t0.0039988870000000004\t47562.0\n5975\t-87.151444\t38.804764\tPlainville town\tIN\tIndiana\tDaviess County\t525\t39.0\t12.5\t12.0\t20961\t75682\t0.2378\t47568\tRomney\t47568\t0.001390341\t47568.0\n5976\t-84.858728\t39.209641999999995\tBright CDP\tIN\tIndiana\tDearborn County\t6268\t38.6\t23.4\t9.1\t27006\t161709\t0.292\t47025\tRomney\t47025\t0.016599352\t47025.0\n5977\t-84.82127\t39.261829999999996\tWest Harrison town\tIN\tIndiana\tDearborn County\t295\t39.4\t16.3\t11.5\t25891\t110417\t0.292\t47060\tRomney\t47060\t0.000781239\t47060.0\n5978\t-84.904315\t39.065238\tAurora city\tIN\tIndiana\tDearborn County\t3842\t36.3\t15.7\t17.1\t21697\t88362\t0.292\t470HH\tRomney\t470HH\t0.010174651\t0.0\n5979\t-84.85013599999999\t39.13113\tGreendale city\tIN\tIndiana\tDearborn County\t4496\t41.7\t24.6\t10.9\t28382\t118464\t0.292\t47025\tRomney\t47025\t0.011906618999999998\t47025.0\n5980\t-85.05837199999999\t39.018143\tDillsboro town\tIN\tIndiana\tDearborn County\t1588\t42.5\t8.6\t9.3\t23256\t109211\t0.292\t47018\tRomney\t47018\t0.004205452\t47018.0\n5981\t-85.088674\t39.113796\tMoores Hill town\tIN\tIndiana\tDearborn County\t707\t35.1\t7.8\t10.4\t18326\t90217\t0.292\t47032\tRomney\t47032\t0.0018723260000000001\t47032.0\n5982\t-84.870227\t39.098896\tLawrenceburg city\tIN\tIndiana\tDearborn County\t4948\t36.7\t11.0\t17.4\t20524\t97847\t0.292\t47025\tRomney\t47025\t0.013103637\t47025.0\n5983\t-84.84448499999999\t39.167320000000004\tHidden Valley CDP\tIN\tIndiana\tDearborn County\t5754\t38.1\t31.5\t7.5\t31788\t160764\t0.292\t47025\tRomney\t47025\t0.015238142\t47025.0\n5984\t-84.963842\t39.29309\tSt. Leon town\tIN\tIndiana\tDearborn County\t544\t40.6\t19.3\t6.5\t23263\t157237\t0.292\t47035\tRomney\t47035\t0.001440659\t47035.0\n5985\t-85.482017\t39.342381\tGreensburg city\tIN\tIndiana\tDecatur County\t10577\t37.1\t15.6\t13.5\t24751\t108549\t0.2853\t47240\tRomney\t47240\t0.028010745\t47240.0\n5986\t-85.627134\t39.42899\tSt. Paul town\tIN\tIndiana\tDecatur County\t1106\t34.1\t8.7\t13.7\t19650\t92432\t0.2853\t47272\tRomney\t47272\t0.0029289859999999997\t47272.0\n5987\t-85.330286\t39.309032\tNewpoint town\tIN\tIndiana\tDecatur County\t294\t40.8\t9.5\t13.6\t20869\t120833\t0.2853\t47263\tRomney\t47263\t0.000778591\t47263.0\n5988\t-85.435048\t39.211467999999996\tMillhousen town\tIN\tIndiana\tDecatur County\t144\t41.8\t10.9\t9.1\t23686\t130682\t0.2853\t47034\tRomney\t47034\t0.000381351\t47034.0\n5989\t-85.61981899999999\t39.350291\tMilford town\tIN\tIndiana\tDecatur County\t130\t39.8\t9.1\t10.7\t21558\t83000\t0.2853\t47272\tRomney\t47272\t0.000344275\t47272.0\n5990\t-85.575211\t39.177094\tWestport town\tIN\tIndiana\tDecatur County\t1467\t35.1\t12.8\t14.7\t19545\t101465\t0.2853\t47283\tRomney\t47283\t0.003885011\t47283.0\n5991\t-85.14398299999999\t41.435902\tCorunna town\tIN\tIndiana\tDeKalb County\t271\t39.9\t19.1\t15.4\t23772\t113125\t0.3319\t46730\tRomney\t46730\t0.0007176810000000001\t46730.0\n5992\t-84.903442\t41.31498\tSt. Joe town\tIN\tIndiana\tDeKalb County\t507\t36.1\t6.9\t9.7\t21617\t100833\t0.3319\t46785\tRomney\t46785\t0.001342673\t46785.0\n5993\t-85.026409\t41.431971000000004\tWaterloo town\tIN\tIndiana\tDeKalb County\t2381\t33.3\t7.8\t11.7\t23560\t82024\t0.3319\t46793\tRomney\t46793\t0.006305529\t46793.0\n5994\t-84.87269\t41.428525\tButler city\tIN\tIndiana\tDeKalb County\t2627\t33.5\t8.1\t17.4\t20894\t73304\t0.3319\t46721\tRomney\t46721\t0.006957004\t46721.0\n5995\t-85.12405600000001\t41.351845000000004\tGarrett city\tIN\tIndiana\tDeKalb County\t5877\t34.7\t8.5\t12.6\t22158\t89212\t0.3319\t46738\tRomney\t46738\t0.015563879\t46738.0\n5996\t-85.153181\t41.351834999999994\tAltona town\tIN\tIndiana\tDeKalb County\t209\t36.7\t11.8\t9.1\t23806\t95000\t0.3319\t46738\tRomney\t46738\t0.000553488\t46738.0\n5997\t-85.05376700000001\t41.367127\tAuburn city\tIN\tIndiana\tDeKalb County\t12740\t36.2\t20.0\t11.3\t27720\t108781\t0.3319\t46706\tRomney\t46706\t0.033738952\t46706.0\n5998\t-85.064391\t41.529435\tAshley town\tIN\tIndiana\tDeKalb County\t1070\t35.0\t5.5\t20.1\t22125\t84167\t0.3319\t46705\tRomney\t46705\t0.002833648\t46705.0\n5999\t-85.477549\t40.178725\tYorktown town\tIN\tIndiana\tDelaware County\t4575\t41.3\t26.9\t9.4\t29747\t93953\t0.5038\t47396\tRomney\t47396\t0.012115832\t47396.0\n6000\t-85.55846700000001\t40.118531\tDaleville town\tIN\tIndiana\tDelaware County\t1708\t41.4\t22.2\t6.6\t26267\t96111\t0.5038\t47334\tRomney\t47334\t0.004523244\t47334.0\n6001\t-85.21678\t40.306011\tAlbany town\tIN\tIndiana\tDelaware County\t2152\t40.8\t11.8\t8.1\t23616\t82480\t0.5038\t47320\tRomney\t47320\t0.005699076\t47320.0\n6002\t-85.389889\t40.197515\tMuncie city\tIN\tIndiana\tDelaware County\t65552\t30.3\t23.3\t15.4\t20645\t70434\t0.5038\t47305\tRomney\t47305\t0.17359935399999998\t47305.0\n6003\t-85.500873\t40.313779\tGaston town\tIN\tIndiana\tDelaware County\t900\t36.4\t12.8\t9.4\t18409\t72500\t0.5038\t47342\tRomney\t47342\t0.002383442\t47342.0\n6004\t-85.282639\t40.188978000000006\tSelma town\tIN\tIndiana\tDelaware County\t852\t37.9\t13.9\t9.4\t27982\t87093\t0.5038\t47383\tRomney\t47383\t0.002256326\t47383.0\n6005\t-85.354977\t40.341133\tEaton town\tIN\tIndiana\tDelaware County\t1490\t37.4\t12.4\t12.1\t18457\t68396\t0.5038\t47338\tRomney\t47338\t0.003945921\t47338.0\n6006\t-86.69706\t38.314334\tBirdseye town\tIN\tIndiana\tDubois County\t455\t36.5\t4.2\t13.7\t19880\t74231\t0.3517\t47513\tRomney\t47513\t0.001204963\t47513.0\n6007\t-87.038487\t38.246095000000004\tHolland town\tIN\tIndiana\tDubois County\t735\t38.8\t12.9\t6.3\t20989\t80500\t0.3517\t47541\tRomney\t47541\t0.001946478\t47541.0\n6008\t-86.936503\t38.394566999999995\tJasper city\tIN\tIndiana\tDubois County\t12704\t38.6\t22.3\t7.1\t27212\t114189\t0.3517\t47546\tRomney\t47546\t0.033643614\t47546.0\n6009\t-86.862686\t38.226119\tFerdinand town\tIN\tIndiana\tDubois County\t2259\t39.7\t23.1\t6.8\t22367\t110966\t0.3517\t47532\tRomney\t47532\t0.005982441\t47532.0\n6010\t-86.959076\t38.299619\tHuntingburg city\tIN\tIndiana\tDubois County\t5741\t38.1\t13.7\t9.3\t19507\t82628\t0.3517\t47542\tRomney\t47542\t0.015203715\t47542.0\n6011\t-85.695887\t41.526428\tMillersburg town\tIN\tIndiana\tElkhart County\t1027\t31.0\t8.9\t14.3\t20551\t91000\t0.3596\t46543\tRomney\t46543\t0.002719773\t46543.0\n6012\t-85.919512\t41.636175\tDunlap CDP\tIN\tIndiana\tElkhart County\t6326\t39.6\t17.9\t12.6\t23108\t113522\t0.3596\t46517\tRomney\t46517\t0.016752951999999998\t46517.0\n6013\t-85.96614\t41.749012\tSimonton Lake CDP\tIN\tIndiana\tElkhart County\t4386\t39.8\t23.9\t13.4\t30264\t127480\t0.3596\t46514\tRomney\t46514\t0.01161531\t46514.0\n6014\t-85.708212\t41.671033\tMiddlebury town\tIN\tIndiana\tElkhart County\t3328\t36.8\t21.1\t12.5\t25623\t138789\t0.3596\t46540\tRomney\t46540\t0.00881344\t46540.0\n6015\t-85.826667\t41.503781\tNew Paris CDP\tIN\tIndiana\tElkhart County\t1216\t36.3\t15.1\t13.2\t25787\t94934\t0.3596\t46553\tRomney\t46553\t0.0032202959999999997\t46553.0\n6016\t-86.01145\t41.533469000000004\tWakarusa town\tIN\tIndiana\tElkhart County\t1907\t39.8\t16.1\t12.1\t22572\t112590\t0.3596\t46573\tRomney\t46573\t0.00505025\t46573.0\n6017\t-85.978427\t41.445811\tNappanee city\tIN\tIndiana\tElkhart County\t7106\t33.0\t14.3\t13.7\t24098\t96483\t0.3596\t46550\tRomney\t46550\t0.018818602\t46550.0\n6018\t-85.83845699999999\t41.581308\tGoshen city\tIN\tIndiana\tElkhart County\t31079\t34.0\t23.4\t16.0\t22139\t99387\t0.3596\t46526\tRomney\t46526\t0.082305564\t46526.0\n6019\t-85.819303\t41.720055\tBristol town\tIN\tIndiana\tElkhart County\t1436\t32.8\t16.7\t14.6\t24652\t111815\t0.3596\t46507\tRomney\t46507\t0.003802915\t46507.0\n6020\t-85.96764300000001\t41.688751\tElkhart city\tIN\tIndiana\tElkhart County\t54335\t33.3\t17.6\t18.3\t22118\t91428\t0.3596\t46516\tRomney\t46516\t0.143893717\t46516.0\n6021\t-85.13935699999999\t39.656186\tConnersville city\tIN\tIndiana\tFayette County\t14517\t38.9\t8.2\t15.9\t22770\t85606\t0.4023\t47331\tRomney\t47331\t0.038444927000000004\t47331.0\n6022\t-85.985539\t38.372443\tGreenville town\tIN\tIndiana\tFloyd County\t639\t39.4\t22.7\t6.5\t28881\t152206\t0.4195\t47124\tRomney\t47124\t0.0016922439999999999\t47124.0\n6023\t-85.824341\t38.306121000000005\tNew Albany city\tIN\tIndiana\tFloyd County\t37080\t39.2\t19.5\t9.3\t23686\t104378\t0.4195\t47150\tRomney\t47150\t0.098197829\t47150.0\n6024\t-85.96645600000001\t38.297317\tGeorgetown town\tIN\tIndiana\tFloyd County\t2479\t37.9\t17.8\t7.0\t25505\t117045\t0.4195\t47122\tRomney\t47122\t0.00656506\t47122.0\n6025\t-85.937283\t38.35135\tGalena CDP\tIN\tIndiana\tFloyd County\t1897\t37.8\t31.3\t8.3\t31575\t166843\t0.4195\t47119\tRomney\t47119\t0.005023767\t47119.0\n6026\t-87.256694\t40.112895\tVeedersburg town\tIN\tIndiana\tFountain County\t2176\t38.4\t8.5\t12.7\t21833\t82917\t0.3146\t47987\tRomney\t47987\t0.005762634\t47987.0\n6027\t-87.246796\t40.287583000000005\tAttica city\tIN\tIndiana\tFountain County\t3188\t39.5\t10.0\t10.7\t22410\t88929\t0.3146\t47918\tRomney\t47918\t0.008442683000000001\t47918.0\n6028\t-87.391053\t40.14042\tCovington city\tIN\tIndiana\tFountain County\t2485\t42.8\t16.4\t11.4\t24543\t93482\t0.3146\t47932\tRomney\t47932\t0.006580949\t47932.0\n6029\t-87.148942\t40.16373\tMellott town\tIN\tIndiana\tFountain County\t179\t39.5\t11.2\t7.2\t19117\t72500\t0.3146\t47958\tRomney\t47958\t0.00047404\t47958.0\n6030\t-87.14824300000001\t40.204408\tNewtown town\tIN\tIndiana\tFountain County\t153\t37.2\t19.6\t5.4\t22184\t100000\t0.3146\t47969\tRomney\t47969\t0.000405185\t47969.0\n6031\t-87.157753\t40.108865\tHillsboro town\tIN\tIndiana\tFountain County\t436\t40.1\t19.9\t10.3\t20002\t86346\t0.3146\t47949\tRomney\t47949\t0.001154645\t47949.0\n6032\t-87.27851899999999\t39.966537\tKingman town\tIN\tIndiana\tFountain County\t527\t36.0\t7.6\t11.0\t15002\t61750\t0.3146\t47952\tRomney\t47952\t0.0013956379999999998\t47952.0\n6033\t-87.147989\t39.987525\tWallace town\tIN\tIndiana\tFountain County\t95\t39.5\t5.0\t8.5\t15499\t82500\t0.3146\t47949\tRomney\t47949\t0.000251586\t47949.0\n6034\t-84.937187\t39.356027000000005\tCedar Grove town\tIN\tIndiana\tFranklin County\t198\t40.6\t11.3\t9.0\t22978\t114583\t0.2755\t47016\tRomney\t47016\t0.0005243569999999999\t47016.0\n6035\t-85.18709\t39.500463\tLaurel town\tIN\tIndiana\tFranklin County\t607\t33.2\t5.7\t13.6\t15591\t67333\t0.2755\t47024\tRomney\t47024\t0.0016075\t47024.0\n6036\t-84.875351\t39.407373\tMount Carmel town\tIN\tIndiana\tFranklin County\t114\t37.2\t2.6\t8.5\t19483\t107500\t0.2755\t47016\tRomney\t47016\t0.000301903\t47016.0\n6037\t-85.204039\t39.338834000000006\tOldenburg town\tIN\tIndiana\tFranklin County\t686\t44.5\t34.3\t4.1\t25393\t140714\t0.2755\t47006\tRomney\t47006\t0.001816713\t47006.0\n6038\t-85.006599\t39.420119\tBrookville town\tIN\tIndiana\tFranklin County\t2533\t39.7\t11.4\t14.9\t20319\t80982\t0.2755\t47012\tRomney\t47012\t0.0067080659999999995\t47012.0\n6039\t-86.195864\t41.059031\tRochester city\tIN\tIndiana\tFulton County\t6353\t41.2\t12.4\t9.8\t22790\t87652\t0.3225\t46975\tRomney\t46975\t0.016824455\t46975.0\n6040\t-86.412626\t41.019199\tKewanna town\tIN\tIndiana\tFulton County\t589\t42.5\t8.0\t7.8\t15683\t59167\t0.3225\t46939\tRomney\t46939\t0.001559831\t46939.0\n6041\t-86.024876\t41.038737\tAkron town\tIN\tIndiana\tFulton County\t1090\t35.1\t11.0\t8.9\t17313\t84063\t0.3225\t46910\tRomney\t46910\t0.002886614\t46910.0\n6042\t-86.264199\t40.946133\tFulton town\tIN\tIndiana\tFulton County\t319\t39.0\t9.3\t8.6\t22734\t70556\t0.3225\t46931\tRomney\t46931\t0.000844798\t46931.0\n6043\t-87.44847800000001\t38.333303\tFrancisco town\tIN\tIndiana\tGibson County\t546\t43.0\t9.8\t5.6\t23370\t84324\t0.3348\t47649\tRomney\t47649\t0.001445955\t47649.0\n6044\t-87.39121800000001\t38.25096\tMackey town\tIN\tIndiana\tGibson County\t139\t40.4\t9.7\t10.9\t20786\t78750\t0.3348\t47654\tRomney\t47654\t0.00036810900000000004\t47654.0\n6045\t-87.575477\t38.203568\tHaubstadt town\tIN\tIndiana\tGibson County\t1726\t38.4\t20.4\t6.2\t24637\t115766\t0.3348\t47639\tRomney\t47639\t0.004570913\t47639.0\n6046\t-87.377361\t38.277825\tSomerville town\tIN\tIndiana\tGibson County\t311\t41.1\t13.6\t10.1\t20911\t78636\t0.3348\t47683\tRomney\t47683\t0.0008236119999999999\t47683.0\n6047\t-87.57812\t38.355434\tPrinceton city\tIN\tIndiana\tGibson County\t7860\t39.9\t11.0\t9.6\t20187\t70173\t0.3348\t47670\tRomney\t47670\t0.020815397\t47670.0\n6048\t-87.54069100000001\t38.48925\tHazleton town\tIN\tIndiana\tGibson County\t295\t41.2\t2.0\t7.9\t16574\t45000\t0.3348\t47524\tRomney\t47524\t0.000781239\t47524.0\n6049\t-87.347476\t38.339763\tOakland City\tIN\tIndiana\tGibson County\t2737\t39.8\t18.3\t9.0\t20681\t67727\t0.3348\t47660\tRomney\t47660\t0.007248313\t47660.0\n6050\t-87.575343\t38.246685\tFort Branch town\tIN\tIndiana\tGibson County\t2296\t40.2\t13.6\t6.7\t23833\t88223\t0.3348\t47648\tRomney\t47648\t0.006080426\t47648.0\n6051\t-87.588112\t38.405586\tPatoka town\tIN\tIndiana\tGibson County\t744\t42.1\t14.9\t7.0\t20138\t66875\t0.3348\t47666\tRomney\t47666\t0.001970312\t47666.0\n6052\t-87.690955\t38.272076\tOwensville town\tIN\tIndiana\tGibson County\t1358\t41.1\t17.1\t6.8\t20843\t74375\t0.3348\t47665\tRomney\t47665\t0.00359635\t47665.0\n6053\t-85.629527\t40.479422\tJonesboro city\tIN\tIndiana\tGrant County\t1663\t40.4\t11.3\t11.8\t24987\t75548\t0.3792\t46938\tRomney\t46938\t0.004404072\t46938.0\n6054\t-85.60771\t40.494136\tGas City\tIN\tIndiana\tGrant County\t5480\t38.3\t12.7\t13.3\t20800\t84342\t0.3792\t46933\tRomney\t46933\t0.014512516000000001\t46933.0\n6055\t-85.572608\t40.409425\tFowlerton town\tIN\tIndiana\tGrant County\t271\t41.9\t10.2\t13.8\t19097\t79500\t0.3792\t46930\tRomney\t46930\t0.0007176810000000001\t46930.0\n6056\t-85.504389\t40.616194\tVan Buren town\tIN\tIndiana\tGrant County\t815\t36.6\t10.5\t9.0\t24535\t75938\t0.3792\t46991\tRomney\t46991\t0.00215834\t46991.0\n6057\t-85.66804\t40.553421\tMarion city\tIN\tIndiana\tGrant County\t28905\t37.4\t16.5\t14.8\t22079\t74938\t0.3792\t46953\tRomney\t46953\t0.076548226\t46953.0\n6058\t-85.647581\t40.418228000000006\tFairmount town\tIN\tIndiana\tGrant County\t2739\t40.2\t9.2\t11.3\t22017\t76534\t0.3792\t46928\tRomney\t46928\t0.00725361\t46928.0\n6059\t-85.497752\t40.387457\tMatthews town\tIN\tIndiana\tGrant County\t515\t43.4\t10.7\t7.5\t21843\t85926\t0.3792\t46957\tRomney\t46957\t0.001363859\t46957.0\n6060\t-85.824275\t40.507037\tSwayzee town\tIN\tIndiana\tGrant County\t973\t42.9\t14.7\t8.8\t24479\t90581\t0.3792\t46986\tRomney\t46986\t0.002576766\t46986.0\n6061\t-85.50859200000001\t40.463621\tUpland town\tIN\tIndiana\tGrant County\t3846\t22.5\t37.5\t9.8\t16896\t94412\t0.3792\t46989\tRomney\t46989\t0.010185244\t46989.0\n6062\t-85.7689\t40.568948999999996\tSweetser town\tIN\tIndiana\tGrant County\t857\t45.1\t17.4\t8.1\t25918\t98333\t0.3792\t46987\tRomney\t46987\t0.002269567\t46987.0\n6063\t-87.081179\t38.988543\tLyons town\tIN\tIndiana\tGreene County\t698\t40.6\t6.6\t11.3\t17030\t48750\t0.3318\t47443\tRomney\t47443\t0.0018484920000000002\t47443.0\n6064\t-87.019061\t38.923693\tNewberry town\tIN\tIndiana\tGreene County\t192\t42.1\t11.4\t5.3\t20359\t85833\t0.3318\t47449\tRomney\t47449\t0.000508468\t47449.0\n6065\t-87.199647\t39.162137\tJasonville city\tIN\tIndiana\tGreene County\t2260\t36.8\t7.2\t17.2\t15052\t55899\t0.3318\t47438\tRomney\t47438\t0.005985089\t47438.0\n6066\t-87.053395\t39.034913\tSwitz City town\tIN\tIndiana\tGreene County\t262\t39.7\t11.4\t4.7\t20522\t77500\t0.3318\t47465\tRomney\t47465\t0.0006938469999999999\t47465.0\n6067\t-86.937301\t39.026234\tBloomfield town\tIN\tIndiana\tGreene County\t2491\t41.5\t18.6\t9.9\t22597\t82303\t0.3318\t47424\tRomney\t47424\t0.006596839\t47424.0\n6068\t-87.158759\t39.035828\tLinton city\tIN\tIndiana\tGreene County\t5934\t43.1\t10.9\t8.3\t21231\t71274\t0.3318\t47441\tRomney\t47441\t0.015714831000000002\t47441.0\n6069\t-86.979323\t39.118544\tWorthington town\tIN\tIndiana\tGreene County\t1337\t44.4\t14.4\t10.7\t17944\t61986\t0.3318\t47471\tRomney\t47471\t0.0035407359999999996\t47471.0\n6070\t-86.02453\t40.049357\tNoblesville city\tIN\tIndiana\tHamilton County\t43280\t34.5\t44.3\t8.6\t35401\t167830\t0.32\t46060\tRomney\t46060\t0.114617099\t46060.0\n6071\t-86.026567\t40.213495\tAtlanta town\tIN\tIndiana\tHamilton County\t870\t35.7\t10.1\t11.4\t21212\t85484\t0.32\t46031\tRomney\t46031\t0.0023039939999999997\t46031.0\n6072\t-86.024309\t40.125962\tCicero town\tIN\tIndiana\tHamilton County\t5276\t39.8\t32.9\t9.6\t30751\t127117\t0.32\t46034\tRomney\t46034\t0.013972268999999999\t46034.0\n6073\t-86.106553\t39.968810999999995\tCarmel city\tIN\tIndiana\tHamilton County\t45837\t39.7\t62.8\t8.7\t49017\t252323\t0.32\t46033\tRomney\t46033\t0.121388724\t46033.0\n6074\t-85.99654100000001\t39.958708\tFishers town\tIN\tIndiana\tHamilton County\t60993\t32.7\t64.0\t5.9\t42143\t207655\t0.32\t46038\tRomney\t46038\t0.161525894\t46038.0\n6075\t-86.021197\t40.174054999999996\tArcadia town\tIN\tIndiana\tHamilton County\t2475\t37.0\t13.2\t12.3\t26650\t90672\t0.32\t46030\tRomney\t46030\t0.006554467\t46030.0\n6076\t-86.22159599999999\t40.13317\tSheridan town\tIN\tIndiana\tHamilton County\t2787\t37.0\t19.4\t13.1\t23360\t103401\t0.32\t46069\tRomney\t46069\t0.007380726999999999\t46069.0\n6077\t-86.129227\t40.036516\tWestfield town\tIN\tIndiana\tHamilton County\t14554\t32.4\t40.6\t7.3\t33048\t169224\t0.32\t46074\tRomney\t46074\t0.038542913\t46074.0\n6078\t-85.94414300000001\t39.78665\tCumberland town\tIN\tIndiana\tHancock County\t5796\t39.3\t30.1\t8.1\t30053\t152632\t0.2837\t46229\tRomney\t46229\t0.015349369\t46229.0\n6079\t-85.771628\t39.792992\tGreenfield city\tIN\tIndiana\tHancock County\t17840\t37.1\t22.4\t11.9\t27798\t128104\t0.2837\t46140\tRomney\t46140\t0.047245126\t46140.0\n6080\t-85.845402\t39.935829999999996\tFortville town\tIN\tIndiana\tHancock County\t3618\t36.4\t21.0\t10.6\t28052\t114858\t0.2837\t46040\tRomney\t46040\t0.009581439\t46040.0\n6081\t-85.89163\t39.724639\tNew Palestine town\tIN\tIndiana\tHancock County\t1921\t41.9\t20.1\t9.3\t28007\t167135\t0.2837\t46163\tRomney\t46163\t0.005087325\t46163.0\n6082\t-85.92660500000001\t39.908601000000004\tMcCordsville town\tIN\tIndiana\tHancock County\t2458\t41.6\t35.0\t6.4\t31700\t146212\t0.2837\t46055\tRomney\t46055\t0.0065094459999999995\t46055.0\n6083\t-85.853702\t39.776689000000005\tSpring Lake town\tIN\tIndiana\tHancock County\t283\t43.1\t19.2\t16.5\t32629\t200000\t0.2837\t46163\tRomney\t46163\t0.00074946\t46163.0\n6084\t-85.574715\t39.891534\tShirley town\tIN\tIndiana\tHancock County\t790\t35.8\t11.2\t10.7\t22826\t95897\t0.2837\t47384\tRomney\t47384\t0.002092133\t47384.0\n6085\t-85.60860799999999\t39.885134\tWilkinson town\tIN\tIndiana\tHancock County\t364\t40.9\t7.0\t6.1\t23993\t111667\t0.2837\t46186\tRomney\t46186\t0.00096397\t46186.0\n6086\t-86.085565\t38.031734\tLaconia town\tIN\tIndiana\tHarrison County\t30\t36.3\t10.0\t13.3\t19754\t95000\t0.3739\t47135\tRomney\t47135\t7.94e-05\t47135.0\n6087\t-86.108837\t38.409038\tPalmyra town\tIN\tIndiana\tHarrison County\t706\t37.7\t11.7\t11.7\t20119\t108511\t0.3739\t47164\tRomney\t47164\t0.0018696779999999998\t47164.0\n6088\t-86.275788\t38.102352\tNew Amsterdam town\tIN\tIndiana\tHarrison County\t1\t0.0\t0.0\t0.0\t23025\t0\t0.3739\t47142\tRomney\t47142\t2.65e-06\t47142.0\n6089\t-86.05112199999999\t38.164665\tNew Middletown town\tIN\tIndiana\tHarrison County\t90\t40.4\t16.4\t12.2\t22124\t100000\t0.3739\t47160\tRomney\t47160\t0.000238344\t47160.0\n6090\t-86.201872\t38.024256\tMauckport town\tIN\tIndiana\tHarrison County\t92\t37.5\t11.5\t13.6\t20129\t83333\t0.3739\t47142\tRomney\t47142\t0.00024364099999999998\t47142.0\n6091\t-85.985899\t38.237759999999994\tLanesville town\tIN\tIndiana\tHarrison County\t687\t39.9\t17.8\t5.7\t24611\t129487\t0.3739\t47136\tRomney\t47136\t0.001819361\t47136.0\n6092\t-86.065866\t38.287929\tCrandall town\tIN\tIndiana\tHarrison County\t142\t42.5\t17.0\t9.2\t24457\t110938\t0.3739\t47114\tRomney\t47114\t0.000376054\t47114.0\n6093\t-85.973906\t38.1255\tElizabeth town\tIN\tIndiana\tHarrison County\t149\t39.8\t7.8\t6.9\t21588\t116071\t0.3739\t47117\tRomney\t47117\t0.000394592\t47117.0\n6094\t-86.12597\t38.213037\tCorydon town\tIN\tIndiana\tHarrison County\t2942\t43.6\t23.6\t12.8\t25808\t107609\t0.3739\t47112\tRomney\t47112\t0.007791209\t47112.0\n6095\t-86.394296\t39.8424\tBrownsburg town\tIN\tIndiana\tHendricks County\t17833\t36.6\t32.9\t8.3\t32744\t165826\t0.3168\t46112\tRomney\t46112\t0.047226588\t46112.0\n6096\t-86.54184000000001\t39.885411\tLizton town\tIN\tIndiana\tHendricks County\t399\t37.8\t19.5\t7.7\t26868\t154688\t0.3168\t46149\tRomney\t46149\t0.001056659\t46149.0\n6097\t-86.37505999999999\t39.695347\tPlainfield town\tIN\tIndiana\tHendricks County\t22369\t37.6\t21.2\t10.3\t29350\t158577\t0.3168\t46168\tRomney\t46168\t0.059239138\t46168.0\n6098\t-86.644382\t39.859451\tNorth Salem town\tIN\tIndiana\tHendricks County\t612\t34.6\t12.9\t8.0\t22720\t83333\t0.3168\t46165\tRomney\t46165\t0.001620741\t46165.0\n6099\t-86.612549\t39.688437\tAmo town\tIN\tIndiana\tHendricks County\t444\t38.8\t13.1\t13.1\t24152\t128571\t0.3168\t46103\tRomney\t46103\t0.001175832\t46103.0\n6100\t-86.669696\t39.68835\tCoatesville town\tIN\tIndiana\tHendricks County\t577\t36.7\t14.0\t7.0\t23412\t119853\t0.3168\t46121\tRomney\t46121\t0.001528051\t46121.0\n6101\t-86.511782\t39.759619\tDanville town\tIN\tIndiana\tHendricks County\t8799\t37.3\t24.1\t7.5\t29019\t160710\t0.3168\t46122\tRomney\t46122\t0.023302122\t46122.0\n6102\t-86.46473399999999\t39.866868\tPittsboro town\tIN\tIndiana\tHendricks County\t2426\t33.3\t25.5\t7.1\t33311\t161822\t0.3168\t46167\tRomney\t46167\t0.006424701999999999\t46167.0\n6103\t-86.524068\t39.689931\tClayton town\tIN\tIndiana\tHendricks County\t716\t39.7\t6.5\t9.1\t23470\t104514\t0.3168\t46118\tRomney\t46118\t0.0018961610000000002\t46118.0\n6104\t-86.382861\t39.758711\tAvon town\tIN\tIndiana\tHendricks County\t9113\t34.4\t30.5\t8.0\t31423\t194690\t0.3168\t46123\tRomney\t46123\t0.024133678999999998\t46123.0\n6105\t-86.633095\t39.638513\tStilesville town\tIN\tIndiana\tHendricks County\t284\t42.9\t14.4\t8.3\t26301\t128125\t0.3168\t46180\tRomney\t46180\t0.0007521089999999999\t46180.0\n6106\t-85.520169\t39.904648\tKennard town\tIN\tIndiana\tHenry County\t438\t39.1\t12.4\t11.7\t18266\t102841\t0.4005\t47351\tRomney\t47351\t0.001159942\t47351.0\n6107\t-85.238334\t40.059917999999996\tBlountsville town\tIN\tIndiana\tHenry County\t161\t40.5\t8.8\t14.0\t19596\t91000\t0.4005\t47354\tRomney\t47354\t0.000426371\t47354.0\n6108\t-85.251333\t39.997758000000005\tMooreland town\tIN\tIndiana\tHenry County\t407\t38.5\t11.9\t13.3\t21282\t98571\t0.4005\t47360\tRomney\t47360\t0.0010778460000000001\t47360.0\n6109\t-85.38638399999999\t40.002947\tMount Summit town\tIN\tIndiana\tHenry County\t298\t45.2\t19.7\t16.1\t24391\t125543\t0.4005\t47361\tRomney\t47361\t0.000789184\t47361.0\n6110\t-85.528405\t39.796074\tKnightstown town\tIN\tIndiana\tHenry County\t2056\t40.2\t12.0\t13.7\t22574\t99817\t0.4005\t46148\tRomney\t46148\t0.005444841999999999\t46148.0\n6111\t-85.44314\t40.004987\tSulphur Springs town\tIN\tIndiana\tHenry County\t342\t41.3\t12.9\t12.8\t25309\t121875\t0.4005\t47361\tRomney\t47361\t0.0009057080000000001\t47361.0\n6112\t-85.365285\t39.921103\tNew Castle city\tIN\tIndiana\tHenry County\t17459\t39.6\t13.3\t15.1\t22093\t81098\t0.4005\t47362\tRomney\t47362\t0.046236135\t47362.0\n6113\t-85.353151\t39.806026\tLewisville town\tIN\tIndiana\tHenry County\t382\t45.0\t16.5\t16.3\t28226\t98056\t0.4005\t47352\tRomney\t47352\t0.001011639\t47352.0\n6114\t-85.437899\t39.838049\tSpiceland town\tIN\tIndiana\tHenry County\t746\t39.8\t14.9\t11.1\t24484\t98462\t0.4005\t47385\tRomney\t47385\t0.001975609\t47385.0\n6115\t-85.436332\t39.802872\tDunreith town\tIN\tIndiana\tHenry County\t185\t47.5\t9.7\t7.7\t26024\t105682\t0.4005\t47337\tRomney\t47337\t0.00048993\t47337.0\n6116\t-85.290726\t39.8088\tStraughn town\tIN\tIndiana\tHenry County\t254\t42.6\t10.3\t10.2\t22515\t85625\t0.4005\t47387\tRomney\t47387\t0.00067266\t47387.0\n6117\t-85.541511\t40.058972\tMiddletown town\tIN\tIndiana\tHenry County\t2485\t39.8\t14.6\t16.3\t23253\t98941\t0.4005\t47356\tRomney\t47356\t0.006580949\t47356.0\n6118\t-85.46423100000001\t39.878741999999995\tGreensboro town\tIN\tIndiana\tHenry County\t171\t41.9\t14.3\t8.9\t23822\t111607\t0.4005\t47344\tRomney\t47344\t0.00045285400000000004\t47344.0\n6119\t-85.39251800000001\t40.047292999999996\tSpringport town\tIN\tIndiana\tHenry County\t170\t44.8\t19.0\t17.6\t26992\t119231\t0.4005\t47386\tRomney\t47386\t0.000450206\t47386.0\n6120\t-85.48698\t39.950871\tCadiz town\tIN\tIndiana\tHenry County\t158\t41.0\t13.3\t14.9\t19715\t116250\t0.4005\t47351\tRomney\t47351\t0.00041842699999999997\t47351.0\n6121\t-85.96377199999999\t40.477702\tGreentown town\tIN\tIndiana\tHoward County\t2433\t40.6\t15.1\t12.7\t26368\t91346\t0.4171\t46936\tRomney\t46936\t0.006443239\t46936.0\n6122\t-86.133078\t40.473414\tKokomo city\tIN\tIndiana\tHoward County\t43821\t37.2\t18.9\t18.2\t25408\t80447\t0.4171\t46902\tRomney\t46902\t0.116049813\t46902.0\n6123\t-86.117776\t40.424653\tIndian Heights CDP\tIN\tIndiana\tHoward County\t3457\t35.2\t9.8\t17.8\t27053\t69707\t0.4171\t46902\tRomney\t46902\t0.009155067\t46902.0\n6124\t-86.27531\t40.417503\tRussiaville town\tIN\tIndiana\tHoward County\t1162\t35.3\t12.7\t11.6\t25890\t88629\t0.4171\t46979\tRomney\t46979\t0.0030772890000000004\t46979.0\n6125\t-85.422475\t40.686274\tWarren town\tIN\tIndiana\tHuntington County\t1274\t41.7\t14.9\t8.0\t21902\t90192\t0.2915\t46792\tRomney\t46792\t0.003373895\t46792.0\n6126\t-85.60125\t40.859746\tAndrews town\tIN\tIndiana\tHuntington County\t1242\t40.3\t11.2\t14.8\t22245\t105921\t0.2915\t46702\tRomney\t46702\t0.0032891509999999997\t46702.0\n6127\t-85.562075\t40.741611\tMount Etna town\tIN\tIndiana\tHuntington County\t108\t40.4\t15.5\t15.3\t22210\t114583\t0.2915\t46702\tRomney\t46702\t0.000286013\t46702.0\n6128\t-85.376487\t40.964531\tRoanoke town\tIN\tIndiana\tHuntington County\t1534\t40.7\t21.8\t9.9\t24495\t115434\t0.2915\t46783\tRomney\t46783\t0.004062445\t46783.0\n6129\t-85.506872\t40.880538\tHuntington city\tIN\tIndiana\tHuntington County\t17017\t34.4\t15.6\t13.3\t22987\t88887\t0.2915\t46750\tRomney\t46750\t0.0450656\t46750.0\n6130\t-85.32997900000001\t40.826366\tMarkle town\tIN\tIndiana\tHuntington County\t1068\t37.0\t14.1\t6.9\t21947\t94419\t0.2915\t46770\tRomney\t46770\t0.002828352\t46770.0\n6131\t-85.840014\t38.794862\tCrothersville town\tIN\tIndiana\tJackson County\t1478\t39.4\t7.1\t11.9\t20252\t78553\t0.3493\t47229\tRomney\t47229\t0.003914142\t47229.0\n6132\t-85.891947\t38.946265999999994\tSeymour city\tIN\tIndiana\tJackson County\t18151\t36.1\t14.3\t10.2\t23129\t90100\t0.3493\t47274\tRomney\t47274\t0.048068738\t47274.0\n6133\t-86.170834\t38.824892999999996\tMedora town\tIN\tIndiana\tJackson County\t562\t37.4\t5.3\t13.0\t16575\t51364\t0.3493\t47260\tRomney\t47260\t0.001488327\t47260.0\n6134\t-86.046157\t38.879509999999996\tBrownstown town\tIN\tIndiana\tJackson County\t2997\t39.2\t15.0\t10.4\t20494\t94677\t0.3493\t47220\tRomney\t47220\t0.007936863\t47220.0\n6135\t-87.16105999999999\t40.906337\tCollegeville CDP\tIN\tIndiana\tJasper County\t898\t23.4\t17.2\t13.1\t20340\t151250\t0.3623\t47978\tRomney\t47978\t0.0023781460000000003\t47978.0\n6136\t-87.197735\t41.198747\tDe Motte town\tIN\tIndiana\tJasper County\t3725\t39.7\t18.4\t11.6\t24518\t147822\t0.3623\t46310\tRomney\t46310\t0.009864803\t46310.0\n6137\t-87.152484\t40.765414\tRemington town\tIN\tIndiana\tJasper County\t1353\t35.1\t17.1\t9.0\t23045\t98452\t0.3623\t47977\tRomney\t47977\t0.0035831079999999998\t47977.0\n6138\t-87.052976\t41.191483000000005\tWheatfield town\tIN\tIndiana\tJasper County\t888\t32.0\t13.0\t12.6\t20182\t103320\t0.3623\t46392\tRomney\t46392\t0.002351663\t46392.0\n6139\t-87.149156\t40.938023\tRensselaer city\tIN\tIndiana\tJasper County\t5405\t36.8\t20.2\t12.7\t22482\t97010\t0.3623\t47978\tRomney\t47978\t0.014313896000000001\t47978.0\n6140\t-84.96313\t40.535396\tBryant town\tIN\tIndiana\tJay County\t274\t34.8\t6.2\t5.8\t15041\t93333\t0.3877\t47326\tRomney\t47326\t0.000725626\t47326.0\n6141\t-85.147603\t40.492917\tPennville town\tIN\tIndiana\tJay County\t711\t37.7\t6.3\t14.4\t18875\t57188\t0.3877\t47369\tRomney\t47369\t0.00188292\t47369.0\n6142\t-84.981413\t40.437277\tPortland city\tIN\tIndiana\tJay County\t6286\t39.8\t11.5\t12.7\t20684\t82977\t0.3877\t47371\tRomney\t47371\t0.016647021\t47371.0\n6143\t-85.208237\t40.380977\tDunkirk city\tIN\tIndiana\tJay County\t2512\t40.8\t4.9\t11.3\t21463\t64907\t0.3877\t47336\tRomney\t47336\t0.006652453000000001\t47336.0\n6144\t-84.86617199999999\t40.381698\tSalamonia town\tIN\tIndiana\tJay County\t165\t36.7\t12.4\t12.4\t18056\t83125\t0.3877\t47381\tRomney\t47381\t0.000436964\t47381.0\n6145\t-85.152405\t40.348133000000004\tRedkey town\tIN\tIndiana\tJay County\t1409\t38.4\t6.9\t16.2\t19638\t63500\t0.3877\t47373\tRomney\t47373\t0.003731412\t47373.0\n6146\t-85.51687700000001\t38.89143\tDupont town\tIN\tIndiana\tJefferson County\t410\t37.0\t5.7\t17.6\t18172\t76111\t0.4364\t47231\tRomney\t47231\t0.00108579\t47231.0\n6147\t-85.471528\t38.71458\tHanover town\tIN\tIndiana\tJefferson County\t4024\t26.9\t21.2\t7.3\t20053\t84333\t0.4364\t47243\tRomney\t47243\t0.010656636\t47243.0\n6148\t-85.397405\t38.757609\tMadison city\tIN\tIndiana\tJefferson County\t12310\t42.8\t26.4\t10.4\t24995\t106510\t0.4364\t47250\tRomney\t47250\t0.032600196\t47250.0\n6149\t-85.24449200000001\t38.735079999999996\tBrooksburg town\tIN\tIndiana\tJefferson County\t75\t40.8\t9.4\t12.5\t20067\t103125\t0.4364\t47250\tRomney\t47250\t0.00019862\t47250.0\n6150\t-85.610549\t38.985240999999995\tVernon town\tIN\tIndiana\tJennings County\t336\t38.9\t13.5\t12.7\t22547\t102381\t0.3728\t47282\tRomney\t47282\t0.0008898189999999999\t47282.0\n6151\t-85.63242199999999\t39.006002\tNorth Vernon city\tIN\tIndiana\tJennings County\t6640\t34.8\t13.7\t14.8\t21748\t84278\t0.3728\t47265\tRomney\t47265\t0.017584508999999998\t47265.0\n6152\t-86.149449\t39.414551\tTrafalgar town\tIN\tIndiana\tJohnson County\t979\t33.3\t17.8\t9.0\t26722\t128571\t0.2978\t46181\tRomney\t46181\t0.002592656\t46181.0\n6153\t-86.109399\t39.351797\tPrinces Lakes town\tIN\tIndiana\tJohnson County\t1613\t41.6\t17.7\t7.1\t27611\t134146\t0.2978\t46164\tRomney\t46164\t0.004271659000000001\t46164.0\n6154\t-86.111145\t39.611554\tGreenwood city\tIN\tIndiana\tJohnson County\t45614\t35.0\t28.1\t8.6\t30625\t137698\t0.2978\t46143\tRomney\t46143\t0.12079816\t46143.0\n6155\t-86.163839\t39.518306\tBargersville town\tIN\tIndiana\tJohnson County\t2340\t34.8\t15.7\t9.6\t26660\t115078\t0.2978\t46106\tRomney\t46106\t0.00619695\t46106.0\n6156\t-86.05648599999999\t39.494149\tFranklin city\tIN\tIndiana\tJohnson County\t22351\t34.8\t21.4\t10.4\t26023\t114004\t0.2978\t46131\tRomney\t46131\t0.059191469000000003\t46131.0\n6157\t-86.09775\t39.562149\tNew Whiteland town\tIN\tIndiana\tJohnson County\t5225\t34.9\t12.9\t10.1\t27757\t115055\t0.2978\t46184\tRomney\t46184\t0.013837208\t46184.0\n6158\t-86.088261\t39.548085\tWhiteland town\tIN\tIndiana\tJohnson County\t4502\t31.7\t20.4\t12.7\t31643\t138074\t0.2978\t46184\tRomney\t46184\t0.011922509\t46184.0\n6159\t-85.947287\t39.355288\tEdinburgh town\tIN\tIndiana\tJohnson County\t4606\t36.4\t4.3\t15.0\t21617\t97059\t0.2978\t46124\tRomney\t46124\t0.012197929\t46124.0\n6160\t-87.44118900000001\t38.871198\tOaktown town\tIN\tIndiana\tKnox County\t635\t41.3\t7.1\t5.6\t16784\t67195\t0.3452\t47561\tRomney\t47561\t0.0016816510000000002\t47561.0\n6161\t-87.52389000000001\t38.51858\tDecker town\tIN\tIndiana\tKnox County\t284\t39.1\t7.6\t8.7\t17100\t52222\t0.3452\t47524\tRomney\t47524\t0.0007521089999999999\t47524.0\n6162\t-87.306577\t38.663325\tWheatland town\tIN\tIndiana\tKnox County\t493\t43.5\t7.1\t6.6\t23938\t76000\t0.3452\t47597\tRomney\t47597\t0.001305597\t47597.0\n6163\t-87.184761\t38.896709\tSandborn town\tIN\tIndiana\tKnox County\t450\t46.6\t8.9\t6.7\t19594\t60303\t0.3452\t47578\tRomney\t47578\t0.001191721\t47578.0\n6164\t-87.414966\t38.757842\tBruceville town\tIN\tIndiana\tKnox County\t476\t41.9\t10.5\t7.1\t16174\t71600\t0.3452\t47516\tRomney\t47516\t0.001260576\t47516.0\n6165\t-87.353177\t38.614429\tMonroe City town\tIN\tIndiana\tKnox County\t536\t43.2\t11.6\t4.9\t21486\t75208\t0.3452\t47557\tRomney\t47557\t0.0014194720000000002\t47557.0\n6166\t-87.306616\t38.774489\tBicknell city\tIN\tIndiana\tKnox County\t3020\t38.6\t4.1\t15.9\t17413\t54663\t0.3452\t47512\tRomney\t47512\t0.007997774000000001\t47512.0\n6167\t-87.51088399999999\t38.675689\tVincennes city\tIN\tIndiana\tKnox County\t17800\t34.6\t15.0\t11.0\t20248\t76898\t0.3452\t47591\tRomney\t47591\t0.047139195\t47591.0\n6168\t-87.252088\t38.811972999999995\tEdwardsport town\tIN\tIndiana\tKnox County\t335\t40.6\t8.3\t6.0\t20971\t65000\t0.3452\t47528\tRomney\t47528\t0.00088717\t47528.0\n6169\t-86.045001\t41.275954\tEtna Green town\tIN\tIndiana\tKosciusko County\t651\t31.0\t10.9\t7.9\t16102\t85870\t0.2283\t46524\tRomney\t46524\t0.0017240229999999999\t46524.0\n6170\t-85.84913900000001\t41.330325\tLeesburg town\tIN\tIndiana\tKosciusko County\t613\t42.0\t25.8\t11.6\t29107\t119712\t0.2283\t46582\tRomney\t46582\t0.001623389\t46582.0\n6171\t-85.968737\t41.154874\tBurket town\tIN\tIndiana\tKosciusko County\t197\t37.5\t7.0\t8.6\t20246\t104688\t0.2283\t46508\tRomney\t46508\t0.000521709\t46508.0\n6172\t-85.80921\t41.216530999999996\tWinona Lake town\tIN\tIndiana\tKosciusko County\t4098\t33.5\t34.4\t6.0\t24190\t108144\t0.2283\t46590\tRomney\t46590\t0.010852608\t46590.0\n6173\t-85.697006\t41.32498\tNorth Webster town\tIN\tIndiana\tKosciusko County\t1086\t40.6\t18.4\t8.4\t24704\t106884\t0.2283\t46555\tRomney\t46555\t0.002876021\t46555.0\n6174\t-85.705845\t41.200734000000004\tPierceton town\tIN\tIndiana\tKosciusko County\t753\t34.9\t6.6\t13.2\t21930\t77037\t0.2283\t46562\tRomney\t46562\t0.001994147\t46562.0\n6175\t-85.748677\t41.423204\tSyracuse town\tIN\tIndiana\tKosciusko County\t2945\t40.8\t20.4\t11.4\t28381\t118209\t0.2283\t46567\tRomney\t46567\t0.0077991530000000005\t46567.0\n6176\t-85.89104\t41.072002000000005\tSilver Lake town\tIN\tIndiana\tKosciusko County\t563\t37.5\t8.6\t10.3\t19800\t77000\t0.2283\t46982\tRomney\t46982\t0.001490976\t46982.0\n6177\t-85.880308\t41.128319\tClaypool town\tIN\tIndiana\tKosciusko County\t301\t37.5\t10.4\t6.4\t23446\t98667\t0.2283\t46510\tRomney\t46510\t0.0007971289999999999\t46510.0\n6178\t-85.84790500000001\t41.411127\tMilford town\tIN\tIndiana\tKosciusko County\t1681\t37.1\t12.6\t11.4\t22291\t92288\t0.2283\t46542\tRomney\t46542\t0.0044517409999999995\t46542.0\n6179\t-86.03815300000001\t41.174217999999996\tMentone town\tIN\tIndiana\tKosciusko County\t1018\t31.8\t11.3\t8.7\t20070\t76364\t0.2283\t46539\tRomney\t46539\t0.0026959379999999997\t46539.0\n6180\t-85.742944\t41.105126\tSidney town\tIN\tIndiana\tKosciusko County\t187\t39.0\t8.0\t7.8\t21793\t93000\t0.2283\t46566\tRomney\t46566\t0.000495226\t46566.0\n6181\t-85.847537\t41.242020000000004\tWarsaw city\tIN\tIndiana\tKosciusko County\t12707\t36.1\t19.2\t10.9\t23285\t94832\t0.2283\t46580\tRomney\t46580\t0.033651559\t46580.0\n6182\t-85.576411\t41.677625\tShipshewana town\tIN\tIndiana\tLaGrange County\t625\t25.0\t7.3\t9.9\t18854\t155556\t0.3111\t46565\tRomney\t46565\t0.0016551679999999998\t46565.0\n6183\t-85.41792\t41.649107\tLagrange town\tIN\tIndiana\tLaGrange County\t3035\t35.0\t16.6\t13.4\t20602\t89468\t0.3111\t46761\tRomney\t46761\t0.008037498\t46761.0\n6184\t-85.542753\t41.539361\tTopeka town\tIN\tIndiana\tLaGrange County\t1434\t29.2\t9.2\t9.4\t18057\t100893\t0.3111\t46571\tRomney\t46571\t0.003797618\t46571.0\n6185\t-87.50835699999999\t41.499143\tDyer town\tIN\tIndiana\tLake County\t15659\t41.2\t27.8\t8.6\t31039\t151451\t0.6488\t46311\tRomney\t46311\t0.04146925\t46311.0\n6186\t-87.319681\t41.472741\tMerrillville town\tIN\tIndiana\tLake County\t34615\t37.9\t23.5\t10.1\t27431\t115796\t0.6488\t46410\tRomney\t46410\t0.091669845\t46410.0\n6187\t-87.438338\t41.372663\tCedar Lake town\tIN\tIndiana\tLake County\t11158\t36.4\t11.4\t10.8\t24590\t115720\t0.6488\t46303\tRomney\t46303\t0.02954939\t46303.0\n6188\t-87.42524\t41.529447999999995\tGriffith town\tIN\tIndiana\tLake County\t17131\t37.7\t16.7\t10.9\t26678\t122835\t0.6488\t46319\tRomney\t46319\t0.045367502999999997\t46319.0\n6189\t-87.272673\t41.513839000000004\tHobart city\tIN\tIndiana\tLake County\t28549\t40.1\t16.7\t10.3\t27039\t113032\t0.6488\t46342\tRomney\t46342\t0.075605443\t46342.0\n6190\t-87.490967\t41.617103\tHammond city\tIN\tIndiana\tLake County\t79343\t34.8\t13.1\t15.6\t21000\t84820\t0.6488\t46320\tRomney\t46320\t0.210121637\t46320.0\n6191\t-87.458692\t41.5484\tHighland town\tIN\tIndiana\tLake County\t23435\t42.6\t24.3\t8.5\t29143\t135098\t0.6488\t46322\tRomney\t46322\t0.062062192999999995\t46322.0\n6192\t-87.262628\t41.409356\tWinfield town\tIN\tIndiana\tLake County\t4625\t38.4\t27.0\t7.3\t29658\t195323\t0.6488\t46307\tRomney\t46307\t0.012248246\t46307.0\n6193\t-87.404095\t41.338351\tLake Dalecarlia CDP\tIN\tIndiana\tLake County\t1392\t42.9\t23.0\t5.9\t29012\t127146\t0.6488\t46303\tRomney\t46303\t0.003686391\t46303.0\n6194\t-87.414371\t41.294743\tLowell town\tIN\tIndiana\tLake County\t8207\t35.8\t16.1\t9.9\t26323\t127784\t0.6488\t46356\tRomney\t46356\t0.021734347\t46356.0\n6195\t-87.446228\t41.19296\tSchneider town\tIN\tIndiana\tLake County\t347\t41.5\t9.7\t9.8\t23724\t125962\t0.6488\t46376\tRomney\t46376\t0.000918949\t46376.0\n6196\t-87.44635799999999\t41.490008\tSchererville town\tIN\tIndiana\tLake County\t28192\t37.7\t30.8\t7.8\t33169\t169667\t0.6488\t46375\tRomney\t46375\t0.07466001\t46375.0\n6197\t-87.454484\t41.646440000000005\tEast Chicago city\tIN\tIndiana\tLake County\t30588\t31.5\t8.5\t23.7\t15784\t75526\t0.6488\t46312\tRomney\t46312\t0.08100526400000001\t46312.0\n6198\t-87.477285\t41.448245\tSt. John town\tIN\tIndiana\tLake County\t10311\t41.8\t23.3\t7.8\t30052\t190242\t0.6488\t46373\tRomney\t46373\t0.027306306000000002\t46373.0\n6199\t-87.347241\t41.590461\tGary city\tIN\tIndiana\tLake County\t95057\t34.4\t11.7\t22.9\t17181\t57522\t0.6488\t46407\tRomney\t46407\t0.251736542\t46407.0\n6200\t-87.25971899999999\t41.573299\tLake Station city\tIN\tIndiana\tLake County\t13408\t35.1\t5.5\t16.1\t19705\t74114\t0.6488\t46405\tRomney\t46405\t0.035507996\t46405.0\n6201\t-87.484723\t41.672944\tWhiting city\tIN\tIndiana\tLake County\t4957\t37.4\t17.8\t13.3\t22354\t98307\t0.6488\t46394\tRomney\t46394\t0.013127471000000002\t46394.0\n6202\t-87.27152099999999\t41.559011\tNew Chicago town\tIN\tIndiana\tLake County\t1984\t34.5\t4.5\t19.0\t18176\t44750\t0.6488\t46405\tRomney\t46405\t0.005254165999999999\t46405.0\n6203\t-87.503858\t41.546791\tMunster town\tIN\tIndiana\tLake County\t22696\t46.5\t42.7\t7.8\t34915\t184579\t0.6488\t46321\tRomney\t46321\t0.060105122000000004\t46321.0\n6204\t-87.341539\t41.416505\tCrown Point city\tIN\tIndiana\tLake County\t23875\t41.6\t27.2\t10.0\t30307\t139915\t0.6488\t46307\tRomney\t46307\t0.063227431\t46307.0\n6205\t-86.867144\t41.723237\tPottawattamie Park town\tIN\tIndiana\tLaPorte County\t331\t50.9\t48.1\t5.6\t39909\t198958\t0.5519\t46360\tRomney\t46360\t0.000876577\t46360.0\n6206\t-86.714333\t41.607109\tLa Porte city\tIN\tIndiana\tLaPorte County\t21402\t38.1\t16.0\t14.0\t23386\t104044\t0.5519\t46350\tRomney\t46350\t0.056678260999999994\t46350.0\n6207\t-86.692702\t41.478671000000006\tKingsford Heights town\tIN\tIndiana\tLaPorte County\t1441\t34.8\t7.2\t14.7\t15232\t68868\t0.5519\t46346\tRomney\t46346\t0.003816156\t46346.0\n6208\t-86.870621\t41.709841\tMichigan City\tIN\tIndiana\tLaPorte County\t32940\t36.7\t15.2\t13.7\t22079\t95770\t0.5519\t46360\tRomney\t46360\t0.08723399300000001\t46360.0\n6209\t-86.697354\t41.530194\tKingsbury town\tIN\tIndiana\tLaPorte County\t224\t37.5\t17.4\t9.8\t20947\t130263\t0.5519\t46345\tRomney\t46345\t0.000593212\t46345.0\n6210\t-86.89201899999999\t41.4304\tWanatah town\tIN\tIndiana\tLaPorte County\t1032\t38.3\t13.0\t11.4\t22997\t121700\t0.5519\t46390\tRomney\t46390\t0.002733014\t46390.0\n6211\t-86.889847\t41.317848\tLa Crosse town\tIN\tIndiana\tLaPorte County\t607\t42.2\t11.8\t9.2\t19945\t96923\t0.5519\t46348\tRomney\t46348\t0.0016075\t46348.0\n6212\t-86.90527900000001\t41.537446\tWestville town\tIN\tIndiana\tLaPorte County\t5458\t32.8\t14.5\t10.4\t17597\t92065\t0.5519\t46391\tRomney\t46391\t0.014454254\t46391.0\n6213\t-86.818015\t41.756316999999996\tMichiana Shores town\tIN\tIndiana\tLaPorte County\t347\t49.7\t45.7\t8.7\t30494\t150694\t0.5519\t46360\tRomney\t46360\t0.000918949\t46360.0\n6214\t-86.855461\t41.696217\tTrail Creek town\tIN\tIndiana\tLaPorte County\t2272\t42.0\t17.7\t11.3\t23805\t117979\t0.5519\t46360\tRomney\t46360\t0.006016868000000001\t46360.0\n6215\t-86.852436\t41.743118\tLong Beach town\tIN\tIndiana\tLaPorte County\t1681\t53.4\t52.9\t7.5\t46989\t231098\t0.5519\t46360\tRomney\t46360\t0.0044517409999999995\t46360.0\n6216\t-86.490275\t38.860377\tBedford city\tIN\tIndiana\tLawrence County\t13450\t43.7\t16.0\t13.7\t22770\t83720\t0.3243\t47421\tRomney\t47421\t0.035619223\t47421.0\n6217\t-86.525336\t38.892627000000005\tOolitic town\tIN\tIndiana\tLawrence County\t1174\t41.8\t12.2\t11.8\t23028\t85556\t0.3243\t47451\tRomney\t47451\t0.003109068\t47451.0\n6218\t-86.47484399999999\t38.737063\tMitchell city\tIN\tIndiana\tLawrence County\t4492\t40.7\t8.2\t15.7\t18402\t68889\t0.3243\t47446\tRomney\t47446\t0.011896026\t47446.0\n6219\t-85.57311899999999\t40.113757\tChesterfield town\tIN\tIndiana\tMadison County\t2835\t38.0\t18.3\t12.1\t24913\t76824\t0.466\t47334\tRomney\t47334\t0.0075078440000000005\t47334.0\n6220\t-85.687798\t40.090979\tAnderson city\tIN\tIndiana\tMadison County\t57799\t38.2\t16.4\t15.7\t22640\t77641\t0.466\t46016\tRomney\t46016\t0.153067322\t46016.0\n6221\t-85.68775500000001\t40.124525\tCountry Club Heights town\tIN\tIndiana\tMadison County\t88\t41.3\t14.1\t14.3\t20213\t71429\t0.466\t46016\tRomney\t46016\t0.000233048\t46016.0\n6222\t-85.847313\t40.0656\tLapel town\tIN\tIndiana\tMadison County\t1725\t36.8\t12.5\t8.4\t23369\t92828\t0.466\t46051\tRomney\t46051\t0.004568265\t46051.0\n6223\t-85.79933\t39.960358\tIngalls town\tIN\tIndiana\tMadison County\t1374\t35.6\t4.5\t9.2\t20924\t89177\t0.466\t46048\tRomney\t46048\t0.003638722\t46048.0\n6224\t-85.72495\t40.271435\tOrestes town\tIN\tIndiana\tMadison County\t305\t39.8\t5.5\t13.0\t23009\t77778\t0.466\t46063\tRomney\t46063\t0.000807722\t46063.0\n6225\t-85.67586700000001\t40.258165000000005\tAlexandria city\tIN\tIndiana\tMadison County\t5882\t35.5\t11.4\t12.0\t22615\t82619\t0.466\t46001\tRomney\t46001\t0.01557712\t46001.0\n6226\t-85.69691\t40.11847\tWoodlawn Heights town\tIN\tIndiana\tMadison County\t70\t41.9\t22.0\t12.5\t27567\t89000\t0.466\t46016\tRomney\t46016\t0.000185379\t46016.0\n6227\t-85.642972\t40.33781\tSummitville town\tIN\tIndiana\tMadison County\t1085\t38.3\t11.0\t13.9\t18875\t67935\t0.466\t46070\tRomney\t46070\t0.002873372\t46070.0\n6228\t-85.737636\t40.103291\tEdgewood town\tIN\tIndiana\tMadison County\t1903\t46.1\t38.2\t8.0\t34637\t115226\t0.466\t46011\tRomney\t46011\t0.005039657\t46011.0\n6229\t-85.752054\t40.006921999999996\tPendleton town\tIN\tIndiana\tMadison County\t3946\t39.4\t29.9\t8.5\t30652\t122379\t0.466\t46064\tRomney\t46064\t0.010450071\t46064.0\n6230\t-85.771813\t40.221303000000006\tFrankton town\tIN\tIndiana\tMadison County\t1919\t38.1\t9.4\t10.7\t23384\t85795\t0.466\t46044\tRomney\t46044\t0.005082029\t46044.0\n6231\t-85.837384\t40.277701\tElwood city\tIN\tIndiana\tMadison County\t8984\t37.9\t8.2\t14.6\t21941\t75241\t0.466\t46036\tRomney\t46036\t0.023792052\t46036.0\n6232\t-85.729102\t40.110572\tRiver Forest town\tIN\tIndiana\tMadison County\t26\t41.3\t27.8\t7.7\t30327\t106250\t0.466\t46011\tRomney\t46011\t6.890000000000001e-05\t46011.0\n6233\t-85.61579\t39.977239000000004\tMarkleville town\tIN\tIndiana\tMadison County\t388\t38.3\t24.4\t7.0\t23420\t96176\t0.466\t46056\tRomney\t46056\t0.001027529\t46056.0\n6234\t-86.131231\t39.669588\tHomecroft town\tIN\tIndiana\tMarion County\t763\t44.5\t33.9\t6.9\t31441\t121622\t0.6026\t46227\tRomney\t46227\t0.00202063\t46227.0\n6235\t-86.051648\t39.783223\tWarren Park town\tIN\tIndiana\tMarion County\t1549\t54.5\t16.9\t9.8\t24060\t99894\t0.6026\t46219\tRomney\t46219\t0.004102169\t46219.0\n6236\t-86.16258499999999\t39.865946\tNorth Crows Nest town\tIN\tIndiana\tMarion County\t41\t46.7\t58.6\t5.0\t37278\t187500\t0.6026\t46260\tRomney\t46260\t0.00010857899999999999\t46260.0\n6237\t-86.16918000000001\t39.856472\tCrows Nest town\tIN\tIndiana\tMarion County\t88\t43.1\t59.7\t5.0\t35851\t183333\t0.6026\t46208\tRomney\t46208\t0.000233048\t46208.0\n6238\t-86.24795300000001\t39.793773\tSpeedway town\tIN\tIndiana\tMarion County\t12043\t37.8\t24.6\t8.9\t28254\t99523\t0.6026\t46224\tRomney\t46224\t0.031893107999999996\t46224.0\n6239\t-86.117202\t39.659894\tSouthport city\tIN\tIndiana\tMarion County\t1797\t37.1\t22.4\t12.0\t26167\t109056\t0.6026\t46227\tRomney\t46227\t0.00475894\t46227.0\n6240\t-85.990342\t39.867449\tLawrence city\tIN\tIndiana\tMarion County\t44388\t32.7\t29.4\t10.8\t27710\t117245\t0.6026\t46216\tRomney\t46216\t0.117551381\t46216.0\n6241\t-86.14575\t39.777119\tIndianapolis city (balance)\tIN\tIndiana\tMarion County\t809989\t35.0\t27.5\t11.6\t26657\t103557\t0.6026\t46204\tRomney\t46204\t2.1450690669999997\t46204.0\n6242\t-86.20015699999999\t39.832463\tWynnedale town\tIN\tIndiana\tMarion County\t257\t39.6\t49.8\t5.1\t31664\t145833\t0.6026\t46228\tRomney\t46228\t0.000680605\t46228.0\n6243\t-86.08697099999999\t39.715209\tBeech Grove city\tIN\tIndiana\tMarion County\t14280\t37.7\t19.5\t8.1\t26494\t96887\t0.6026\t46107\tRomney\t46107\t0.037817287000000005\t46107.0\n6244\t-86.320583\t39.816624\tClermont town\tIN\tIndiana\tMarion County\t1550\t38.1\t35.7\t8.3\t36040\t134005\t0.6026\t46234\tRomney\t46234\t0.004104818\t46234.0\n6245\t-86.150238\t39.900156\tWilliams Creek town\tIN\tIndiana\tMarion County\t398\t47.6\t77.6\t5.3\t76288\t400000\t0.6026\t46240\tRomney\t46240\t0.001054011\t46240.0\n6246\t-86.173248\t39.848418\tRocky Ripple town\tIN\tIndiana\tMarion County\t687\t44.6\t36.1\t9.8\t26778\t86538\t0.6026\t46208\tRomney\t46208\t0.001819361\t46208.0\n6247\t-86.192481\t39.834483\tSpring Hill town\tIN\tIndiana\tMarion County\t91\t38.6\t50.7\t4.2\t31529\t143750\t0.6026\t46228\tRomney\t46228\t0.000240993\t46228.0\n6248\t-86.156687\t39.887449\tMeridian Hills town\tIN\tIndiana\tMarion County\t1710\t48.6\t80.3\t1.6\t67378\t283667\t0.6026\t46260\tRomney\t46260\t0.004528541\t46260.0\n6249\t-86.315375\t41.347794\tPlymouth city\tIN\tIndiana\tMarshall County\t10145\t34.0\t17.0\t13.6\t22099\t90455\t0.3455\t46563\tRomney\t46563\t0.026866692999999997\t46563.0\n6250\t-86.151818\t41.446844\tBremen town\tIN\tIndiana\tMarshall County\t4641\t35.4\t15.9\t11.2\t23033\t108032\t0.3455\t46506\tRomney\t46506\t0.012290618\t46506.0\n6251\t-86.117504\t41.298056\tBourbon town\tIN\tIndiana\tMarshall County\t1733\t32.0\t14.6\t10.2\t23808\t91477\t0.3455\t46504\tRomney\t46504\t0.004589451\t46504.0\n6252\t-86.309797\t41.456864\tLa Paz town\tIN\tIndiana\tMarshall County\t528\t35.1\t4.7\t9.8\t23874\t78846\t0.3455\t46537\tRomney\t46537\t0.001398286\t46537.0\n6253\t-86.421813\t41.217949\tCulver town\tIN\tIndiana\tMarshall County\t1561\t44.0\t29.2\t11.7\t21649\t96210\t0.3455\t46511\tRomney\t46511\t0.0041339490000000005\t46511.0\n6254\t-86.24758299999999\t41.238315\tArgos town\tIN\tIndiana\tMarshall County\t1622\t32.8\t15.5\t12.6\t19732\t86311\t0.3455\t46501\tRomney\t46501\t0.004295493\t46501.0\n6255\t-86.901276\t38.89433\tCrane town\tIN\tIndiana\tMartin County\t188\t43.4\t9.9\t5.8\t23603\t82000\t0.2848\t47522\tRomney\t47522\t0.000497875\t47522.0\n6256\t-86.793918\t38.666742\tShoals town\tIN\tIndiana\tMartin County\t842\t44.8\t5.9\t7.6\t22403\t65517\t0.2848\t47581\tRomney\t47581\t0.002229843\t47581.0\n6257\t-86.914168\t38.675901\tLoogootee city\tIN\tIndiana\tMartin County\t2681\t43.5\t13.9\t8.4\t22280\t81741\t0.2848\t47553\tRomney\t47553\t0.00710001\t47553.0\n6258\t-86.067965\t40.756943\tPeru city\tIN\tIndiana\tMiami County\t11957\t37.7\t11.8\t13.6\t21348\t67510\t0.3303\t46970\tRomney\t46970\t0.031665357000000005\t46970.0\n6259\t-85.856988\t40.579783\tConverse town\tIN\tIndiana\tMiami County\t1017\t39.6\t18.0\t9.7\t25152\t82000\t0.3303\t46919\tRomney\t46919\t0.00269329\t46919.0\n6260\t-86.129947\t40.958284\tMacy town\tIN\tIndiana\tMiami County\t241\t38.8\t9.4\t15.3\t17858\t85625\t0.3303\t46951\tRomney\t46951\t0.000638233\t46951.0\n6261\t-86.11138000000001\t40.814314\tMexico CDP\tIN\tIndiana\tMiami County\t901\t43.7\t9.5\t16.5\t23601\t107115\t0.3303\t46958\tRomney\t46958\t0.002386091\t46958.0\n6262\t-86.07707099999999\t40.864506\tDenver town\tIN\tIndiana\tMiami County\t538\t38.1\t8.0\t10.7\t16828\t84250\t0.3303\t46926\tRomney\t46926\t0.001424769\t46926.0\n6263\t-86.101134\t40.660659\tBunker Hill town\tIN\tIndiana\tMiami County\t894\t35.8\t18.0\t15.8\t19866\t81552\t0.3303\t46914\tRomney\t46914\t0.0023675529999999997\t46914.0\n6264\t-86.146316\t40.658699\tGrissom AFB CDP\tIN\tIndiana\tMiami County\t2064\t26.3\t19.8\t8.5\t24341\t106159\t0.3303\t46914\tRomney\t46914\t0.005466028\t46914.0\n6265\t-85.92732600000001\t40.601673\tAmboy town\tIN\tIndiana\tMiami County\t325\t42.7\t11.2\t9.8\t25050\t82308\t0.3303\t46911\tRomney\t46911\t0.0008606880000000001\t46911.0\n6266\t-86.62419200000001\t39.228758\tEllettsville town\tIN\tIndiana\tMonroe County\t5468\t36.0\t23.4\t6.1\t22631\t116846\t0.5843\t47429\tRomney\t47429\t0.014480736999999999\t47429.0\n6267\t-86.523416\t39.165779\tBloomington city\tIN\tIndiana\tMonroe County\t72930\t24.5\t58.4\t8.9\t21796\t146752\t0.5843\t47406\tRomney\t47406\t0.19313828600000002\t47406.0\n6268\t-86.65010699999999\t39.299709\tStinesville town\tIN\tIndiana\tMonroe County\t186\t40.3\t14.2\t7.5\t21798\t108929\t0.5843\t47464\tRomney\t47464\t0.000492578\t47464.0\n6269\t-86.77758100000001\t40.107561\tDarlington town\tIN\tIndiana\tMontgomery County\t850\t37.8\t17.9\t11.3\t18609\t97917\t0.2958\t47940\tRomney\t47940\t0.002251029\t47940.0\n6270\t-86.714151\t39.964433\tNew Ross town\tIN\tIndiana\tMontgomery County\t320\t39.5\t11.9\t8.4\t24484\t88056\t0.2958\t47968\tRomney\t47968\t0.0008474460000000001\t47968.0\n6271\t-86.89586800000001\t40.043477\tCrawfordsville city\tIN\tIndiana\tMontgomery County\t15080\t36.1\t18.1\t12.4\t22254\t93744\t0.2958\t47933\tRomney\t47933\t0.039935902\t47933.0\n6272\t-86.978154\t40.194148999999996\tNew Richmond town\tIN\tIndiana\tMontgomery County\t337\t38.4\t12.9\t12.0\t23738\t100000\t0.2958\t47967\tRomney\t47967\t0.000892467\t47967.0\n6273\t-86.902428\t40.190421\tLinden town\tIN\tIndiana\tMontgomery County\t675\t39.9\t11.4\t11.4\t26357\t90208\t0.2958\t47955\tRomney\t47955\t0.001787582\t47955.0\n6274\t-87.065313\t40.087887\tWaynetown town\tIN\tIndiana\tMontgomery County\t886\t36.3\t11.8\t15.3\t24862\t89891\t0.2958\t47990\tRomney\t47990\t0.0023463670000000002\t47990.0\n6275\t-86.92214799999999\t39.953076\tNew Market town\tIN\tIndiana\tMontgomery County\t658\t40.1\t17.7\t5.5\t22897\t116667\t0.2958\t47965\tRomney\t47965\t0.0017425610000000001\t47965.0\n6276\t-87.072978\t40.170887\tWingate town\tIN\tIndiana\tMontgomery County\t291\t40.7\t6.7\t7.5\t20696\t100000\t0.2958\t47994\tRomney\t47994\t0.000770646\t47994.0\n6277\t-87.055239\t39.983684000000004\tAlamo town\tIN\tIndiana\tMontgomery County\t149\t37.5\t9.1\t10.7\t19997\t100000\t0.2958\t47916\tRomney\t47916\t0.000394592\t47916.0\n6278\t-86.798559\t39.91673\tLadoga town\tIN\tIndiana\tMontgomery County\t1010\t40.3\t15.4\t7.8\t21183\t110560\t0.2958\t47954\tRomney\t47954\t0.0026747520000000003\t47954.0\n6279\t-87.046054\t39.877829999999996\tWaveland town\tIN\tIndiana\tMontgomery County\t429\t39.2\t13.7\t8.8\t22602\t84444\t0.2958\t47989\tRomney\t47989\t0.001136108\t47989.0\n6280\t-86.368312\t39.604591\tMooresville town\tIN\tIndiana\tMorgan County\t10021\t35.6\t19.0\t10.2\t27224\t122873\t0.2819\t46158\tRomney\t46158\t0.026538307\t46158.0\n6281\t-86.258604\t39.372964\tMorgantown town\tIN\tIndiana\tMorgan County\t1039\t36.6\t7.6\t14.3\t20173\t84394\t0.2819\t46160\tRomney\t46160\t0.002751552\t46160.0\n6282\t-86.368057\t39.543944\tBrooklyn town\tIN\tIndiana\tMorgan County\t1516\t34.5\t11.5\t11.8\t20192\t111176\t0.2819\t46111\tRomney\t46111\t0.004014775999999999\t46111.0\n6283\t-86.42080899999999\t39.423162\tMartinsville city\tIN\tIndiana\tMorgan County\t11336\t37.0\t14.4\t11.3\t21874\t100461\t0.2819\t46151\tRomney\t46151\t0.030020782000000003\t46151.0\n6284\t-86.37786\t39.533679\tBethany town\tIN\tIndiana\tMorgan County\t91\t34.0\t10.7\t12.8\t18549\t98333\t0.2819\t46111\tRomney\t46111\t0.000240993\t46111.0\n6285\t-86.563311\t39.395193\tParagon town\tIN\tIndiana\tMorgan County\t717\t34.8\t2.1\t13.4\t17354\t70333\t0.2819\t46166\tRomney\t46166\t0.001898809\t46166.0\n6286\t-86.478208\t39.580101\tMonrovia town\tIN\tIndiana\tMorgan County\t601\t38.9\t13.1\t12.6\t23225\t111968\t0.2819\t46157\tRomney\t46157\t0.00159161\t46157.0\n6287\t-87.438986\t41.130823\tLake Village CDP\tIN\tIndiana\tNewton County\t867\t39.2\t8.5\t12.3\t20124\t117689\t0.3912\t46349\tRomney\t46349\t0.00229605\t46349.0\n6288\t-87.298636\t40.952118\tMount Ayr town\tIN\tIndiana\tNewton County\t138\t40.7\t18.6\t5.5\t26433\t100000\t0.3912\t47964\tRomney\t47964\t0.000365461\t47964.0\n6289\t-87.295438\t40.763764\tGoodland town\tIN\tIndiana\tNewton County\t1107\t38.0\t10.7\t12.4\t18482\t75306\t0.3912\t47948\tRomney\t47948\t0.0029316340000000002\t47948.0\n6290\t-87.447912\t40.775\tKentland town\tIN\tIndiana\tNewton County\t1660\t41.7\t19.5\t10.4\t20901\t86222\t0.3912\t47951\tRomney\t47951\t0.0043961270000000005\t47951.0\n6291\t-87.452844\t40.946034999999995\tMorocco town\tIN\tIndiana\tNewton County\t1055\t40.7\t15.2\t10.4\t20605\t88906\t0.3912\t47963\tRomney\t47963\t0.002793924\t47963.0\n6292\t-87.266183\t41.158976\tRoselawn CDP\tIN\tIndiana\tNewton County\t3886\t38.1\t6.7\t11.6\t21668\t120886\t0.3912\t46310\tRomney\t46310\t0.010291175\t46310.0\n6293\t-87.365476\t40.866513\tBrook town\tIN\tIndiana\tNewton County\t1035\t41.6\t15.7\t10.0\t17044\t89118\t0.3912\t47922\tRomney\t47922\t0.0027409590000000003\t47922.0\n6294\t-85.595057\t41.465115000000004\tLigonier city\tIN\tIndiana\tNoble County\t4693\t29.3\t11.2\t17.0\t18076\t90067\t0.3219\t46767\tRomney\t46767\t0.012428328\t46767.0\n6295\t-85.36654399999999\t41.529579999999996\tWolcottville town\tIN\tIndiana\tNoble County\t962\t39.6\t10.1\t13.6\t22837\t106731\t0.3219\t46795\tRomney\t46795\t0.002547635\t46795.0\n6296\t-85.256284\t41.442001\tKendallville city\tIN\tIndiana\tNoble County\t9745\t35.0\t16.6\t14.5\t22327\t97006\t0.3219\t46755\tRomney\t46755\t0.025807385\t46755.0\n6297\t-85.23360799999999\t41.36322\tAvilla town\tIN\tIndiana\tNoble County\t2352\t35.8\t11.7\t11.3\t23053\t111951\t0.3219\t46710\tRomney\t46710\t0.00622873\t46710.0\n6298\t-85.361212\t41.489478000000005\tRome City town\tIN\tIndiana\tNoble County\t1645\t37.5\t11.5\t13.5\t21758\t96667\t0.3219\t46784\tRomney\t46784\t0.004356403\t46784.0\n6299\t-85.419687\t41.395771\tAlbion town\tIN\tIndiana\tNoble County\t2341\t32.5\t12.4\t12.9\t20689\t87429\t0.3219\t46701\tRomney\t46701\t0.006199599\t46701.0\n6300\t-85.614468\t41.40323\tCromwell town\tIN\tIndiana\tNoble County\t467\t29.3\t9.7\t17.5\t16908\t65833\t0.3219\t46732\tRomney\t46732\t0.0012367419999999999\t46732.0\n6301\t-84.853255\t38.953599\tRising Sun city\tIN\tIndiana\tOhio County\t2403\t40.4\t15.8\t12.2\t23485\t100171\t0.3526\t47040\tRomney\t47040\t0.006363791\t47040.0\n6302\t-86.469998\t38.557140000000004\tPaoli town\tIN\tIndiana\tOrange County\t3801\t40.9\t15.5\t10.8\t18206\t69094\t0.37799999999999995\t47454\tRomney\t47454\t0.010066071999999999\t47454.0\n6303\t-86.612205\t38.567686\tWest Baden Springs town\tIN\tIndiana\tOrange County\t626\t43.2\t12.1\t9.4\t19139\t65000\t0.37799999999999995\t47469\tRomney\t47469\t0.001657817\t47469.0\n6304\t-86.452401\t38.661592999999996\tOrleans town\tIN\tIndiana\tOrange County\t2225\t37.1\t9.9\t6.7\t17230\t80588\t0.37799999999999995\t47452\tRomney\t47452\t0.005892399\t47452.0\n6305\t-86.619961\t38.546541999999995\tFrench Lick town\tIN\tIndiana\tOrange County\t1810\t42.8\t13.9\t9.0\t19515\t68500\t0.37799999999999995\t47469\tRomney\t47469\t0.004793368\t47469.0\n6306\t-86.769627\t39.286285\tSpencer town\tIN\tIndiana\tOwen County\t2390\t37.3\t12.3\t12.4\t21030\t94176\t0.348\t47460\tRomney\t47460\t0.0063293640000000005\t47460.0\n6307\t-86.66556\t39.350701\tGosport town\tIN\tIndiana\tOwen County\t766\t41.5\t8.4\t11.6\t18908\t82391\t0.348\t47433\tRomney\t47433\t0.002028574\t47433.0\n6308\t-87.331594\t39.726966\tMecca town\tIN\tIndiana\tParke County\t337\t42.7\t9.5\t8.5\t17526\t66429\t0.3239\t47860\tRomney\t47860\t0.000892467\t47860.0\n6309\t-87.369393\t39.791216999999996\tMontezuma town\tIN\tIndiana\tParke County\t1096\t38.8\t6.4\t10.3\t20171\t56848\t0.3239\t47862\tRomney\t47862\t0.002902503\t47862.0\n6310\t-87.28156899999999\t39.622476\tRosedale town\tIN\tIndiana\tParke County\t765\t35.0\t11.4\t8.2\t24785\t70000\t0.3239\t47874\tRomney\t47874\t0.002025926\t47874.0\n6311\t-87.229462\t39.765919\tRockville town\tIN\tIndiana\tParke County\t3127\t43.3\t18.5\t9.7\t20343\t79474\t0.3239\t47872\tRomney\t47872\t0.008281138\t47872.0\n6312\t-87.25007099999999\t39.830582\tBloomingdale town\tIN\tIndiana\tParke County\t299\t35.6\t13.1\t7.1\t21218\t68667\t0.3239\t47832\tRomney\t47832\t0.000791833\t47832.0\n6313\t-87.186661\t39.847614\tMarshall town\tIN\tIndiana\tParke County\t338\t35.6\t13.3\t7.3\t21180\t68929\t0.3239\t47859\tRomney\t47859\t0.000895115\t47859.0\n6314\t-86.759685\t37.952834\tTell City\tIN\tIndiana\tPerry County\t7372\t44.2\t14.0\t9.5\t21936\t85221\t0.5481\t47586\tRomney\t47586\t0.019523042\t47586.0\n6315\t-86.800606\t37.995954\tTroy town\tIN\tIndiana\tPerry County\t370\t40.2\t11.8\t9.9\t21250\t81667\t0.5481\t47588\tRomney\t47588\t0.00097986\t47588.0\n6316\t-86.737251\t37.910495000000004\tCannelton city\tIN\tIndiana\tPerry County\t1133\t38.7\t6.7\t10.9\t19655\t74651\t0.5481\t47586\tRomney\t47586\t0.0030004890000000003\t47586.0\n6317\t-87.212918\t38.382744\tWinslow town\tIN\tIndiana\tPike County\t875\t40.3\t9.1\t8.7\t19668\t63519\t0.3586\t47598\tRomney\t47598\t0.002317236\t47598.0\n6318\t-87.28097\t38.491896999999994\tPetersburg city\tIN\tIndiana\tPike County\t2428\t44.6\t10.0\t7.7\t20522\t67208\t0.3586\t47567\tRomney\t47567\t0.006429998\t47567.0\n6319\t-87.25874\t38.255259\tSpurgeon town\tIN\tIndiana\tPike County\t286\t40.9\t9.0\t8.5\t21889\t87222\t0.3586\t47584\tRomney\t47584\t0.000757405\t47584.0\n6320\t-87.202318\t41.323704\tHebron town\tIN\tIndiana\tPorter County\t3824\t34.0\t14.2\t11.1\t26003\t122171\t0.51\t46341\tRomney\t46341\t0.010126982\t46341.0\n6321\t-87.080214\t41.625858\tPorter town\tIN\tIndiana\tPorter County\t5264\t37.6\t31.3\t9.2\t30713\t135788\t0.51\t46304\tRomney\t46304\t0.01394049\t46304.0\n6322\t-86.95212099999999\t41.688208\tTown of Pines town\tIN\tIndiana\tPorter County\t879\t45.3\t9.5\t11.5\t23774\t74211\t0.51\t46301\tRomney\t46301\t0.002327829\t46301.0\n6323\t-87.026449\t41.317287\tKouts town\tIN\tIndiana\tPorter County\t1986\t36.2\t19.6\t6.7\t24178\t137500\t0.51\t46347\tRomney\t46347\t0.005259463000000001\t46347.0\n6324\t-87.136577\t41.543746\tSouth Haven CDP\tIN\tIndiana\tPorter County\t5803\t34.6\t8.8\t8.6\t25617\t99257\t0.51\t46393\tRomney\t46393\t0.015367907\t46393.0\n6325\t-87.096164\t41.644844\tDune Acres town\tIN\tIndiana\tPorter County\t293\t40.1\t32.3\t9.2\t30530\t121154\t0.51\t46304\tRomney\t46304\t0.0007759430000000001\t46304.0\n6326\t-87.179715\t41.585969\tPortage city\tIN\tIndiana\tPorter County\t39062\t36.8\t13.1\t9.9\t26723\t121793\t0.51\t46368\tRomney\t46368\t0.103446699\t46368.0\n6327\t-86.980101\t41.685190999999996\tBeverly Shores town\tIN\tIndiana\tPorter County\t843\t53.3\t63.6\t5.2\t48452\t291837\t0.51\t46301\tRomney\t46301\t0.002232491\t46301.0\n6328\t-87.21250500000001\t41.407468\tLakes of the Four Seasons CDP\tIN\tIndiana\tPorter County\t7813\t42.4\t33.6\t6.9\t31411\t167996\t0.51\t46341\tRomney\t46341\t0.020690929\t46341.0\n6329\t-87.125716\t41.619421\tBurns Harbor town\tIN\tIndiana\tPorter County\t983\t38.6\t23.9\t9.8\t27485\t101190\t0.51\t46368\tRomney\t46368\t0.0026032489999999998\t46368.0\n6330\t-87.05035600000001\t41.477181\tValparaiso city\tIN\tIndiana\tPorter County\t29169\t34.8\t40.0\t9.1\t29292\t149017\t0.51\t46383\tRomney\t46383\t0.07724737\t46383.0\n6331\t-87.050975\t41.601689\tChesterton town\tIN\tIndiana\tPorter County\t12168\t38.8\t30.0\t8.0\t31124\t150988\t0.51\t46304\tRomney\t46304\t0.032224142000000004\t46304.0\n6332\t-87.193235\t41.623149\tOgden Dunes town\tIN\tIndiana\tPorter County\t1359\t54.2\t59.4\t5.9\t52306\t265988\t0.51\t463HH\tRomney\t463HH\t0.003598998\t0.0\n6333\t-87.899117\t37.935733\tMount Vernon city\tIN\tIndiana\tPosey County\t6922\t39.0\t15.7\t9.9\t23113\t83455\t0.3708\t47620\tRomney\t47620\t0.018331321\t47620.0\n6334\t-87.93245\t38.128926\tNew Harmony town\tIN\tIndiana\tPosey County\t884\t49.8\t22.5\t7.5\t20870\t76250\t0.3708\t47631\tRomney\t47631\t0.00234107\t47631.0\n6335\t-87.708546\t38.187336\tCynthiana town\tIN\tIndiana\tPosey County\t724\t37.9\t11.3\t8.9\t17893\t71786\t0.3708\t47612\tRomney\t47612\t0.001917347\t47612.0\n6336\t-87.783227\t38.169953\tPoseyville town\tIN\tIndiana\tPosey County\t1192\t40.6\t12.9\t4.1\t21130\t79464\t0.3708\t47633\tRomney\t47633\t0.003156737\t47633.0\n6337\t-87.91494200000001\t38.204347\tGriffin town\tIN\tIndiana\tPosey County\t163\t46.8\t8.5\t5.3\t21978\t67222\t0.3708\t47616\tRomney\t47616\t0.000431668\t47616.0\n6338\t-86.883666\t40.985248999999996\tFrancesville town\tIN\tIndiana\tPulaski County\t970\t40.4\t13.5\t5.5\t20260\t92361\t0.3517\t47946\tRomney\t47946\t0.002568821\t47946.0\n6339\t-86.60342800000001\t41.052246999999994\tWinamac town\tIN\tIndiana\tPulaski County\t2376\t42.9\t18.5\t7.9\t22964\t88900\t0.3517\t46996\tRomney\t46996\t0.006292288\t46996.0\n6340\t-86.561325\t40.974577000000004\tStar City CDP\tIN\tIndiana\tPulaski County\t367\t40.0\t10.4\t6.2\t18355\t80833\t0.3517\t46985\tRomney\t46985\t0.000971915\t46985.0\n6341\t-86.482652\t41.156069\tMonterey town\tIN\tIndiana\tPulaski County\t232\t39.6\t9.4\t5.3\t20890\t77143\t0.3517\t46960\tRomney\t46960\t0.000614398\t46960.0\n6342\t-86.89045\t41.080276\tMedaryville town\tIN\tIndiana\tPulaski County\t548\t37.1\t3.2\t10.0\t16617\t75357\t0.3517\t47957\tRomney\t47957\t0.001451252\t47957.0\n6343\t-86.799565\t39.521232\tCloverdale town\tIN\tIndiana\tPutnam County\t2338\t38.9\t11.5\t14.9\t20857\t92846\t0.3259\t46120\tRomney\t46120\t0.006191654\t46120.0\n6344\t-86.98323\t39.857001000000004\tRussellville town\tIN\tIndiana\tPutnam County\t289\t39.3\t7.6\t17.8\t17851\t70000\t0.3259\t46175\tRomney\t46175\t0.00076535\t46175.0\n6345\t-86.80055\t39.84913\tRoachdale town\tIN\tIndiana\tPutnam County\t1037\t38.0\t13.4\t11.5\t18241\t90114\t0.3259\t46172\tRomney\t46172\t0.002746255\t46172.0\n6346\t-86.75330500000001\t39.669957000000004\tFillmore town\tIN\tIndiana\tPutnam County\t602\t39.5\t7.0\t7.0\t18843\t104412\t0.3259\t46128\tRomney\t46128\t0.0015942579999999999\t46128.0\n6347\t-86.841626\t39.643161\tGreencastle city\tIN\tIndiana\tPutnam County\t10112\t27.9\t24.7\t12.5\t20082\t103230\t0.3259\t46135\tRomney\t46135\t0.0267793\t46135.0\n6348\t-86.811194\t39.761063\tBainbridge town\tIN\tIndiana\tPutnam County\t782\t38.1\t12.5\t12.5\t19427\t102930\t0.3259\t46105\tRomney\t46105\t0.002070947\t46105.0\n6349\t-84.97629599999999\t40.172491\tWinchester city\tIN\tIndiana\tRandolph County\t4773\t41.6\t12.7\t13.6\t21972\t78706\t0.3699\t47394\tRomney\t47394\t0.01264019\t47394.0\n6350\t-84.942541\t40.048696\tLynn town\tIN\tIndiana\tRandolph County\t1034\t38.9\t7.6\t8.6\t22185\t87188\t0.3699\t47355\tRomney\t47355\t0.002738311\t47355.0\n6351\t-85.183213\t40.023515\tLosantville town\tIN\tIndiana\tRandolph County\t258\t40.6\t8.0\t11.3\t18940\t81364\t0.3699\t47354\tRomney\t47354\t0.0006832539999999999\t47354.0\n6352\t-85.126728\t40.189478\tFarmland town\tIN\tIndiana\tRandolph County\t1407\t36.5\t12.1\t12.9\t19658\t81184\t0.3699\t47340\tRomney\t47340\t0.003726115\t47340.0\n6353\t-85.125977\t40.045319\tModoc town\tIN\tIndiana\tRandolph County\t207\t40.7\t7.7\t11.8\t18970\t81875\t0.3699\t47358\tRomney\t47358\t0.000548192\t47358.0\n6354\t-85.028749\t40.291578\tRidgeville town\tIN\tIndiana\tRandolph County\t783\t37.1\t8.3\t11.3\t20275\t59375\t0.3699\t47380\tRomney\t47380\t0.002073595\t47380.0\n6355\t-84.817947\t40.202063\tUnion City\tIN\tIndiana\tRandolph County\t3355\t38.6\t9.5\t14.5\t18370\t70909\t0.3699\t47390\tRomney\t47390\t0.008884944\t47390.0\n6356\t-84.91585400000001\t40.236815\tSaratoga town\tIN\tIndiana\tRandolph County\t275\t38.4\t9.4\t11.7\t20043\t92917\t0.3699\t47382\tRomney\t47382\t0.0007282739999999999\t47382.0\n6357\t-85.203811\t40.189842999999996\tParker City town\tIN\tIndiana\tRandolph County\t1385\t42.9\t15.2\t14.4\t23281\t83966\t0.3699\t47368\tRomney\t47368\t0.003667853\t47368.0\n6358\t-85.09140699999999\t39.238912\tSunman town\tIN\tIndiana\tRipley County\t934\t33.7\t10.1\t10.7\t20976\t103354\t0.2951\t47041\tRomney\t47041\t0.0024734839999999998\t47041.0\n6359\t-85.209698\t39.308834999999995\tBatesville city\tIN\tIndiana\tRipley County\t6596\t38.6\t26.5\t8.5\t25585\t131043\t0.2951\t47006\tRomney\t47006\t0.017467985\t47006.0\n6360\t-85.29180699999999\t39.129056\tOsgood town\tIN\tIndiana\tRipley County\t1678\t36.2\t8.0\t13.0\t18189\t82604\t0.2951\t47037\tRomney\t47037\t0.004443796\t47037.0\n6361\t-85.256504\t39.063662\tVersailles town\tIN\tIndiana\tRipley County\t1928\t38.2\t16.9\t13.9\t21493\t92745\t0.2951\t47042\tRomney\t47042\t0.0051058629999999995\t47042.0\n6362\t-85.327081\t39.204615999999994\tNapoleon town\tIN\tIndiana\tRipley County\t239\t39.2\t3.3\t6.1\t21548\t117361\t0.2951\t47034\tRomney\t47034\t0.000632936\t47034.0\n6363\t-85.12803199999999\t39.125683\tMilan town\tIN\tIndiana\tRipley County\t1938\t36.2\t12.0\t14.1\t21306\t93830\t0.2951\t47031\tRomney\t47031\t0.0051323459999999994\t47031.0\n6364\t-85.38462700000001\t39.075194\tHolton town\tIN\tIndiana\tRipley County\t436\t39.4\t13.8\t11.1\t20876\t103500\t0.2951\t47023\tRomney\t47023\t0.001154645\t47023.0\n6365\t-85.447779\t39.617096999999994\tRushville city\tIN\tIndiana\tRush County\t5694\t39.4\t11.7\t11.6\t20434\t97097\t0.3161\t46173\tRomney\t46173\t0.015079246000000001\t46173.0\n6366\t-85.29942700000001\t39.626642\tGlenwood town\tIN\tIndiana\tRush County\t304\t41.8\t10.6\t13.5\t18799\t100000\t0.3161\t46133\tRomney\t46133\t0.0008050739999999999\t46133.0\n6367\t-85.571414\t39.736778\tCarthage town\tIN\tIndiana\tRush County\t892\t39.1\t7.5\t10.6\t22177\t98214\t0.3161\t46115\tRomney\t46115\t0.002362256\t46115.0\n6368\t-86.136089\t41.736499\tGranger CDP\tIN\tIndiana\tSt. Joseph County\t30718\t40.3\t51.9\t8.2\t36864\t170775\t0.51\t46530\tRomney\t46530\t0.081349539\t46530.0\n6369\t-86.267439\t41.676866\tSouth Bend city\tIN\tIndiana\tSt. Joseph County\t105635\t34.3\t22.0\t17.3\t21000\t81214\t0.51\t46629\tRomney\t46629\t0.27974993600000003\t46629.0\n6370\t-86.482838\t41.464906\tWalkerton town\tIN\tIndiana\tSt. Joseph County\t2199\t34.4\t16.6\t11.7\t19784\t91103\t0.51\t46574\tRomney\t46574\t0.005823544\t46574.0\n6371\t-86.250738\t41.717684000000006\tRoseland town\tIN\tIndiana\tSt. Joseph County\t652\t22.7\t18.6\t12.2\t21373\t83108\t0.51\t46637\tRomney\t46637\t0.001726672\t46637.0\n6372\t-86.226467\t41.730859\tGeorgetown CDP\tIN\tIndiana\tSt. Joseph County\t4559\t35.7\t43.6\t10.1\t28759\t130524\t0.51\t46637\tRomney\t46637\t0.01207346\t46637.0\n6373\t-86.429507\t41.531442999999996\tNorth Liberty town\tIN\tIndiana\tSt. Joseph County\t1359\t33.4\t13.0\t16.0\t24239\t92054\t0.51\t46554\tRomney\t46554\t0.003598998\t46554.0\n6374\t-86.51079200000001\t41.701833\tNew Carlisle town\tIN\tIndiana\tSt. Joseph County\t1501\t39.7\t15.0\t10.4\t21571\t97698\t0.51\t46552\tRomney\t46552\t0.003975052\t46552.0\n6375\t-86.245399\t41.611936\tGulivoire Park CDP\tIN\tIndiana\tSt. Joseph County\t3171\t44.0\t23.0\t9.6\t28209\t112117\t0.51\t46614\tRomney\t46614\t0.008397662\t46614.0\n6376\t-86.167826\t41.669789\tMishawaka city\tIN\tIndiana\tSt. Joseph County\t47580\t35.3\t19.9\t11.7\t24184\t88938\t0.51\t46545\tRomney\t46545\t0.126004657\t46545.0\n6377\t-86.232288\t41.71396\tIndian Village town\tIN\tIndiana\tSt. Joseph County\t169\t38.8\t26.4\t9.9\t28284\t94000\t0.51\t46556\tRomney\t46556\t0.000447558\t46556.0\n6378\t-86.078406\t41.664736\tOsceola town\tIN\tIndiana\tSt. Joseph County\t1929\t39.3\t15.0\t8.7\t24156\t97241\t0.51\t46561\tRomney\t46561\t0.005108512\t46561.0\n6379\t-86.273547\t41.527982\tLakeville town\tIN\tIndiana\tSt. Joseph County\t543\t41.8\t11.0\t11.2\t24628\t83571\t0.51\t46536\tRomney\t46536\t0.00143801\t46536.0\n6380\t-85.78304399999999\t38.686294000000004\tScottsburg city\tIN\tIndiana\tScott County\t6208\t37.3\t14.1\t14.1\t21035\t92440\t0.4585\t47170\tRomney\t47170\t0.016440456000000003\t47170.0\n6381\t-85.811295\t38.742318\tAustin town\tIN\tIndiana\tScott County\t4712\t33.7\t5.8\t14.8\t17303\t72083\t0.4585\t47102\tRomney\t47102\t0.012478645\t47102.0\n6382\t-85.85785600000001\t39.594923\tFairland CDP\tIN\tIndiana\tShelby County\t1253\t37.0\t13.3\t12.5\t20337\t97843\t0.3197\t46126\tRomney\t46126\t0.003318282\t46126.0\n6383\t-85.773264\t39.521072\tShelbyville city\tIN\tIndiana\tShelby County\t18408\t36.2\t13.6\t12.6\t24775\t100013\t0.3197\t46176\tRomney\t46176\t0.048749343\t46176.0\n6384\t-85.69767\t39.673460999999996\tMorristown town\tIN\tIndiana\tShelby County\t1150\t34.3\t8.8\t12.8\t23740\t88824\t0.3197\t46161\tRomney\t46161\t0.00304551\t46161.0\n6385\t-87.031388\t38.109035\tGentryville town\tIN\tIndiana\tSpencer County\t255\t44.4\t12.0\t7.1\t19650\t88636\t0.4139\t47537\tRomney\t47537\t0.0006753089999999999\t47537.0\n6386\t-87.034441\t38.012563\tChrisney town\tIN\tIndiana\tSpencer County\t562\t38.5\t8.4\t7.3\t19961\t80667\t0.4139\t47611\tRomney\t47611\t0.001488327\t47611.0\n6387\t-87.054304\t37.885490000000004\tRockport city\tIN\tIndiana\tSpencer County\t2028\t41.0\t14.1\t9.7\t19540\t80260\t0.4139\t47635\tRomney\t47635\t0.00537069\t47635.0\n6388\t-86.92526\t38.116954\tSanta Claus town\tIN\tIndiana\tSpencer County\t2293\t38.1\t31.9\t5.5\t24728\t131869\t0.4139\t47579\tRomney\t47579\t0.006072482\t47579.0\n6389\t-86.98397800000001\t37.937090000000005\tGrandview town\tIN\tIndiana\tSpencer County\t777\t40.1\t4.5\t8.4\t18990\t71905\t0.4139\t47615\tRomney\t47615\t0.002057705\t47615.0\n6390\t-86.985919\t38.17328\tDale town\tIN\tIndiana\tSpencer County\t1494\t38.1\t12.0\t8.3\t18001\t82807\t0.4139\t47523\tRomney\t47523\t0.003956514\t47523.0\n6391\t-86.583124\t41.379062\tHamlet town\tIN\tIndiana\tStarke County\t823\t36.4\t4.6\t12.2\t18430\t75750\t0.4351\t46532\tRomney\t46532\t0.002179526\t46532.0\n6392\t-86.62120999999999\t41.291057\tKnox city\tIN\tIndiana\tStarke County\t3650\t38.1\t12.5\t15.8\t18995\t82407\t0.4351\t46534\tRomney\t46534\t0.009666183\t46534.0\n6393\t-86.462913\t41.417528000000004\tKoontz Lake CDP\tIN\tIndiana\tStarke County\t1606\t44.5\t7.8\t11.7\t25123\t98043\t0.4351\t46513\tRomney\t46513\t0.0042531209999999995\t46513.0\n6394\t-86.77574200000001\t41.216892\tNorth Judson town\tIN\tIndiana\tStarke County\t1650\t35.1\t12.4\t12.0\t18417\t93444\t0.4351\t46366\tRomney\t46366\t0.004369644000000001\t46366.0\n6395\t-86.584556\t41.230509000000005\tBass Lake CDP\tIN\tIndiana\tStarke County\t1288\t42.3\t9.8\t14.1\t20922\t103889\t0.4351\t46534\tRomney\t46534\t0.0034109709999999996\t46534.0\n6396\t-86.892276\t41.198852\tSan Pierre CDP\tIN\tIndiana\tStarke County\t161\t48.8\t15.2\t12.2\t20876\t89286\t0.4351\t46374\tRomney\t46374\t0.000426371\t46374.0\n6397\t-84.998235\t41.641667\tAngola city\tIN\tIndiana\tSteuben County\t7740\t32.4\t23.9\t11.9\t23893\t98962\t0.3544\t46703\tRomney\t46703\t0.020497605\t46703.0\n6398\t-84.934404\t41.730921\tFremont town\tIN\tIndiana\tSteuben County\t1984\t35.4\t19.1\t9.2\t22123\t91600\t0.3544\t46737\tRomney\t46737\t0.005254165999999999\t46737.0\n6399\t-85.172425\t41.730574\tOrland town\tIN\tIndiana\tSteuben County\t331\t41.7\t13.0\t12.6\t23524\t98889\t0.3544\t46776\tRomney\t46776\t0.000876577\t46776.0\n6400\t-84.912977\t41.536794\tHamilton town\tIN\tIndiana\tSteuben County\t1311\t42.2\t13.7\t13.1\t24913\t106831\t0.3544\t46742\tRomney\t46742\t0.0034718809999999996\t46742.0\n6401\t-85.083405\t41.532242\tHudson town\tIN\tIndiana\tSteuben County\t697\t34.1\t8.5\t21.9\t22627\t69000\t0.3544\t46705\tRomney\t46705\t0.001845844\t46705.0\n6402\t-84.839105\t41.737997\tClear Lake town\tIN\tIndiana\tSteuben County\t474\t44.5\t16.6\t8.5\t22344\t146528\t0.3544\t46737\tRomney\t46737\t0.00125528\t46737.0\n6403\t-87.401077\t38.962396999999996\tCarlisle town\tIN\tIndiana\tSullivan County\t709\t35.2\t5.7\t8.6\t16613\t68529\t0.3849\t47838\tRomney\t47838\t0.001877623\t47838.0\n6404\t-87.29905600000001\t39.18584\tHymera town\tIN\tIndiana\tSullivan County\t804\t38.9\t14.2\t11.6\t17963\t74032\t0.3849\t47855\tRomney\t47855\t0.002129209\t47855.0\n6405\t-87.56735400000001\t39.055834000000004\tMerom town\tIN\tIndiana\tSullivan County\t309\t41.6\t9.9\t11.2\t18736\t80333\t0.3849\t47861\tRomney\t47861\t0.000818315\t47861.0\n6406\t-87.407555\t39.097311\tSullivan city\tIN\tIndiana\tSullivan County\t4424\t42.6\t12.5\t10.2\t20114\t77516\t0.3849\t47882\tRomney\t47882\t0.011715943999999999\t47882.0\n6407\t-87.397534\t39.179371\tShelburn town\tIN\tIndiana\tSullivan County\t1196\t37.5\t7.5\t10.6\t18815\t65125\t0.3849\t47879\tRomney\t47879\t0.00316733\t47879.0\n6408\t-87.38074399999999\t39.252527\tFarmersburg town\tIN\tIndiana\tSullivan County\t1109\t40.6\t14.5\t8.3\t20667\t75238\t0.3849\t47850\tRomney\t47850\t0.002936931\t47850.0\n6409\t-87.259003\t39.070356\tDugger town\tIN\tIndiana\tSullivan County\t978\t43.8\t7.6\t11.9\t18994\t69778\t0.3849\t47848\tRomney\t47848\t0.002590007\t47848.0\n6410\t-85.078448\t38.742901\tVevay town\tIN\tIndiana\tSwitzerland County\t1693\t43.5\t12.3\t8.4\t17469\t98472\t0.423\t47043\tRomney\t47043\t0.00448352\t47043.0\n6411\t-84.83019399999999\t38.835716\tPatriot town\tIN\tIndiana\tSwitzerland County\t203\t38.2\t6.6\t8.7\t19155\t93750\t0.423\t47038\tRomney\t47038\t0.000537599\t47038.0\n6412\t-86.77481800000001\t40.376001\tDayton town\tIN\tIndiana\tTippecanoe County\t1264\t35.2\t20.3\t10.8\t21518\t120346\t0.4695\t47941\tRomney\t47941\t0.003347412\t47941.0\n6413\t-86.915412\t40.447507\tWest Lafayette city\tIN\tIndiana\tTippecanoe County\t31716\t23.5\t71.0\t11.7\t22337\t157984\t0.4695\t47906\tRomney\t47906\t0.08399251199999999\t47906.0\n6414\t-86.867655\t40.404496\tLafayette city\tIN\tIndiana\tTippecanoe County\t59576\t33.4\t28.4\t11.2\t24287\t105589\t0.4695\t47904\tRomney\t47904\t0.15777329699999998\t47904.0\n6415\t-86.962231\t40.351043\tShadeland town\tIN\tIndiana\tTippecanoe County\t1715\t41.4\t20.6\t9.2\t23038\t132341\t0.4695\t479HH\tRomney\t479HH\t0.004541782\t0.0\n6416\t-86.724184\t40.247181\tClarks Hill town\tIN\tIndiana\tTippecanoe County\t740\t33.3\t3.8\t14.5\t17513\t65417\t0.4695\t47930\tRomney\t47930\t0.001959719\t47930.0\n6417\t-86.853364\t40.506702000000004\tBattle Ground town\tIN\tIndiana\tTippecanoe County\t1547\t40.0\t23.3\t8.0\t23741\t122194\t0.4695\t47920\tRomney\t47920\t0.004096873\t47920.0\n6418\t-86.229711\t40.287709\tKempton town\tIN\tIndiana\tTipton County\t377\t41.2\t11.2\t11.8\t21835\t83235\t0.3302\t46049\tRomney\t46049\t0.000998398\t46049.0\n6419\t-86.040275\t40.282856\tTipton city\tIN\tIndiana\tTipton County\t4882\t40.8\t12.2\t13.2\t26228\t82459\t0.3302\t46072\tRomney\t46072\t0.012928851000000002\t46072.0\n6420\t-85.957388\t40.362551\tWindfall City town\tIN\tIndiana\tTipton County\t692\t39.5\t4.1\t12.7\t20640\t72593\t0.3302\t46076\tRomney\t46076\t0.001832602\t46076.0\n6421\t-86.08706600000001\t40.379596\tSharpsville town\tIN\tIndiana\tTipton County\t583\t37.8\t11.1\t8.4\t27389\t95263\t0.3302\t46068\tRomney\t46068\t0.001543941\t46068.0\n6422\t-84.81899399999999\t39.569404\tWest College Corner town\tIN\tIndiana\tUnion County\t602\t32.1\t5.7\t7.5\t18015\t79643\t0.3284\t47003\tRomney\t47003\t0.0015942579999999999\t47003.0\n6423\t-84.926472\t39.634799\tLiberty town\tIN\tIndiana\tUnion County\t1955\t38.6\t9.7\t11.7\t21427\t85164\t0.3284\t47353\tRomney\t47353\t0.005177367\t47353.0\n6424\t-87.54336500000001\t37.984807\tEvansville city\tIN\tIndiana\tVanderburgh County\t116871\t38.3\t19.2\t10.8\t22818\t83889\t0.4382\t47711\tRomney\t47711\t0.30950589100000003\t47711.0\n6425\t-87.51210400000001\t38.024122999999996\tMelody Hill CDP\tIN\tIndiana\tVanderburgh County\t3287\t43.6\t30.6\t6.1\t29648\t121007\t0.4382\t47711\tRomney\t47711\t0.008704861\t47711.0\n6426\t-87.561453\t38.047389\tHighland CDP\tIN\tIndiana\tVanderburgh County\t4198\t43.2\t33.3\t4.7\t33625\t145294\t0.4382\t47710\tRomney\t47710\t0.011117435\t47710.0\n6427\t-87.579627\t38.093810999999995\tDarmstadt town\tIN\tIndiana\tVanderburgh County\t1290\t46.9\t31.4\t5.5\t34139\t137987\t0.4382\t47725\tRomney\t47725\t0.003416268\t47725.0\n6428\t-87.464692\t39.947385\tCayuga town\tIN\tIndiana\tVermillion County\t1056\t41.2\t6.2\t12.4\t19342\t73191\t0.4527\t47928\tRomney\t47928\t0.002796572\t47928.0\n6429\t-87.436024\t40.053267\tPerrysville town\tIN\tIndiana\tVermillion County\t503\t43.1\t6.7\t9.9\t20939\t75833\t0.4527\t47974\tRomney\t47974\t0.001332079\t47974.0\n6430\t-87.404398\t39.660752\tClinton city\tIN\tIndiana\tVermillion County\t4954\t40.2\t10.4\t14.0\t20095\t69918\t0.4527\t47842\tRomney\t47842\t0.013119526999999999\t47842.0\n6431\t-87.453448\t39.621958\tUniversal town\tIN\tIndiana\tVermillion County\t400\t40.3\t13.0\t14.4\t21970\t80769\t0.4527\t47884\tRomney\t47884\t0.0010593080000000001\t47884.0\n6432\t-87.49454399999999\t39.807262\tDana town\tIN\tIndiana\tVermillion County\t627\t37.6\t6.3\t9.3\t17729\t69167\t0.4527\t47847\tRomney\t47847\t0.001660465\t47847.0\n6433\t-87.4141\t39.682269\tFairview Park town\tIN\tIndiana\tVermillion County\t1434\t42.8\t11.6\t13.8\t24610\t94583\t0.4527\t47842\tRomney\t47842\t0.003797618\t47842.0\n6434\t-87.406207\t39.883687\tNewport town\tIN\tIndiana\tVermillion County\t555\t43.1\t12.4\t12.4\t20446\t75000\t0.4527\t47966\tRomney\t47966\t0.00146979\t47966.0\n6435\t-87.450561\t39.463681\tWest Terre Haute town\tIN\tIndiana\tVigo County\t2132\t34.5\t6.7\t15.9\t15272\t52849\t0.4943\t478HH\tRomney\t478HH\t0.00564611\t0.0\n6436\t-87.266953\t39.493615999999996\tSeelyville town\tIN\tIndiana\tVigo County\t1180\t38.8\t26.6\t9.9\t25118\t101136\t0.4943\t47881\tRomney\t47881\t0.0031249579999999997\t47881.0\n6437\t-87.300172\t39.389706\tRiley town\tIN\tIndiana\tVigo County\t164\t41.3\t35.4\t14.0\t26213\t126389\t0.4943\t47803\tRomney\t47803\t0.00043431599999999997\t47803.0\n6438\t-87.38075500000001\t39.467801\tTerre Haute city\tIN\tIndiana\tVigo County\t60244\t33.9\t23.5\t12.8\t20343\t75907\t0.4943\t47807\tRomney\t47807\t0.159542341\t47807.0\n6439\t-87.360605\t39.539770000000004\tNorth Terre Haute CDP\tIN\tIndiana\tVigo County\t4545\t36.9\t16.3\t10.3\t22834\t85619\t0.4943\t47805\tRomney\t47805\t0.012036383999999999\t47805.0\n6440\t-85.72223100000001\t40.673815999999995\tLa Fontaine town\tIN\tIndiana\tWabash County\t840\t41.9\t10.5\t14.1\t21992\t75833\t0.3086\t46940\tRomney\t46940\t0.002224546\t46940.0\n6441\t-85.831952\t40.802921000000005\tWabash city\tIN\tIndiana\tWabash County\t10873\t39.1\t14.1\t13.3\t24155\t84620\t0.3086\t46992\tRomney\t46992\t0.028794632999999997\t46992.0\n6442\t-85.92350400000001\t40.910968\tRoann town\tIN\tIndiana\tWabash County\t374\t40.5\t9.1\t7.8\t19695\t84167\t0.3086\t46974\tRomney\t46974\t0.000990453\t46974.0\n6443\t-85.775358\t41.004006\tNorth Manchester town\tIN\tIndiana\tWabash County\t5837\t35.7\t30.0\t10.0\t22455\t95821\t0.3086\t46962\tRomney\t46962\t0.015457948000000001\t46962.0\n6444\t-85.727588\t40.839003999999996\tLagro town\tIN\tIndiana\tWabash County\t441\t39.2\t13.3\t12.7\t20037\t85714\t0.3086\t46941\tRomney\t46941\t0.001167887\t46941.0\n6445\t-87.25362700000001\t40.44956\tPine Village town\tIN\tIndiana\tWarren County\t268\t42.6\t18.0\t11.7\t22659\t96429\t0.3484\t47975\tRomney\t47975\t0.0007097360000000001\t47975.0\n6446\t-87.386146\t40.272511\tWest Lebanon town\tIN\tIndiana\tWarren County\t867\t41.4\t17.1\t9.4\t21895\t88182\t0.3484\t47991\tRomney\t47991\t0.00229605\t47991.0\n6447\t-87.52712700000001\t40.197371000000004\tState Line City town\tIN\tIndiana\tWarren County\t143\t45.8\t22.9\t6.7\t24900\t97000\t0.3484\t47982\tRomney\t47982\t0.00037870300000000004\t47982.0\n6448\t-87.293447\t40.286831\tWilliamsport town\tIN\tIndiana\tWarren County\t1958\t40.6\t9.4\t6.3\t24401\t89667\t0.3484\t47918\tRomney\t47918\t0.005185311\t47918.0\n6449\t-87.118678\t38.082712\tTennyson town\tIN\tIndiana\tWarrick County\t350\t38.5\t6.7\t8.5\t19911\t78125\t0.35700000000000004\t47637\tRomney\t47637\t0.0009268939999999999\t47637.0\n6450\t-87.447859\t38.161509\tElberfeld town\tIN\tIndiana\tWarrick County\t675\t42.9\t12.5\t7.1\t21998\t90000\t0.35700000000000004\t47613\tRomney\t47613\t0.001787582\t47613.0\n6451\t-87.406616\t37.949094\tNewburgh town\tIN\tIndiana\tWarrick County\t3337\t40.9\t38.7\t6.3\t32425\t118657\t0.35700000000000004\t47630\tRomney\t47630\t0.008837275\t47630.0\n6452\t-87.373885\t38.038897999999996\tChandler town\tIN\tIndiana\tWarrick County\t3154\t37.4\t6.6\t10.1\t21029\t70352\t0.35700000000000004\t47610\tRomney\t47610\t0.008352642\t47610.0\n6453\t-87.314627\t38.198709\tLynnville town\tIN\tIndiana\tWarrick County\t876\t42.6\t11.3\t6.7\t22328\t74773\t0.35700000000000004\t47619\tRomney\t47619\t0.002319884\t47619.0\n6454\t-87.273841\t38.04582\tBoonville city\tIN\tIndiana\tWarrick County\t6868\t38.3\t14.8\t12.9\t21902\t77621\t0.35700000000000004\t47601\tRomney\t47601\t0.018188314\t47601.0\n6455\t-86.188441\t38.42868\tFredericksburg town\tIN\tIndiana\tWashington County\t103\t40.4\t9.9\t14.8\t15840\t93333\t0.3641\t47120\tRomney\t47120\t0.000272772\t47120.0\n6456\t-86.015294\t38.502986\tNew Pekin town\tIN\tIndiana\tWashington County\t1403\t37.3\t7.4\t16.2\t16622\t76848\t0.3641\t47165\tRomney\t47165\t0.003715522\t47165.0\n6457\t-86.273274\t38.462036\tHardinsburg town\tIN\tIndiana\tWashington County\t260\t38.9\t10.3\t11.1\t20530\t90000\t0.3641\t47125\tRomney\t47125\t0.00068855\t47125.0\n6458\t-86.29746999999999\t38.666175\tSaltillo town\tIN\tIndiana\tWashington County\t112\t35.6\t9.6\t12.0\t16528\t70000\t0.3641\t47108\tRomney\t47108\t0.000296606\t47108.0\n6459\t-86.27763\t38.554821000000004\tLivonia town\tIN\tIndiana\tWashington County\t114\t37.9\t14.7\t12.3\t19699\t95000\t0.3641\t47108\tRomney\t47108\t0.000301903\t47108.0\n6460\t-85.90456\t38.699276\tLittle York town\tIN\tIndiana\tWashington County\t179\t36.4\t8.8\t11.4\t18196\t89375\t0.3641\t47139\tRomney\t47139\t0.00047404\t47139.0\n6461\t-86.261252\t38.651384\tCampbellsburg town\tIN\tIndiana\tWashington County\t606\t35.2\t9.4\t12.4\t16503\t70833\t0.3641\t47108\tRomney\t47108\t0.001604851\t47108.0\n6462\t-86.09833\t38.604333000000004\tSalem city\tIN\tIndiana\tWashington County\t6218\t40.1\t13.8\t13.6\t19646\t84741\t0.3641\t47167\tRomney\t47167\t0.016466939\t47167.0\n6463\t-85.205586\t39.812638\tDublin town\tIN\tIndiana\tWayne County\t636\t34.2\t9.9\t12.4\t20014\t77353\t0.4157\t47327\tRomney\t47327\t0.001684299\t47327.0\n6464\t-84.851805\t39.741115\tBoston town\tIN\tIndiana\tWayne County\t171\t44.2\t27.0\t10.2\t28379\t132500\t0.4157\t47374\tRomney\t47374\t0.00045285400000000004\t47374.0\n6465\t-85.155968\t39.911558\tHagerstown town\tIN\tIndiana\tWayne County\t1699\t39.3\t18.3\t8.6\t23357\t97333\t0.4157\t47346\tRomney\t47346\t0.00449941\t47346.0\n6466\t-85.19062\t39.812346999999995\tMount Auburn town\tIN\tIndiana\tWayne County\t72\t40.0\t16.7\t8.8\t24074\t100000\t0.4157\t47327\tRomney\t47327\t0.000190675\t47327.0\n6467\t-84.831138\t39.944706\tWhitewater town\tIN\tIndiana\tWayne County\t75\t42.1\t11.8\t11.9\t22459\t115000\t0.4157\t47341\tRomney\t47341\t0.00019862\t47341.0\n6468\t-85.170137\t39.812381\tCambridge City town\tIN\tIndiana\tWayne County\t2015\t41.9\t15.6\t10.5\t22035\t90242\t0.4157\t47327\tRomney\t47327\t0.005336263000000001\t47327.0\n6469\t-84.91911999999999\t39.954838\tFountain City town\tIN\tIndiana\tWayne County\t646\t38.5\t12.1\t9.5\t24886\t87097\t0.4157\t47341\tRomney\t47341\t0.001710782\t47341.0\n6470\t-84.891273\t39.847182000000004\tSpring Grove town\tIN\tIndiana\tWayne County\t372\t49.9\t24.8\t7.9\t23599\t120833\t0.4157\t47374\tRomney\t47374\t0.000985156\t47374.0\n6471\t-84.996078\t39.817130999999996\tCenterville town\tIN\tIndiana\tWayne County\t2306\t37.8\t12.5\t14.3\t21907\t93698\t0.4157\t47330\tRomney\t47330\t0.006106909000000001\t47330.0\n6472\t-85.041438\t39.891515999999996\tGreens Fork town\tIN\tIndiana\tWayne County\t360\t41.7\t17.0\t8.7\t21800\t95385\t0.4157\t47345\tRomney\t47345\t0.0009533769999999999\t47345.0\n6473\t-85.13676\t39.813122\tEast Germantown town\tIN\tIndiana\tWayne County\t230\t41.5\t12.2\t12.9\t22044\t91250\t0.4157\t47357\tRomney\t47357\t0.0006091019999999999\t47357.0\n6474\t-85.086712\t39.977536\tEconomy town\tIN\tIndiana\tWayne County\t199\t42.8\t24.6\t8.7\t18870\t116667\t0.4157\t47339\tRomney\t47339\t0.000527006\t47339.0\n6475\t-85.156125\t39.786465\tMilton town\tIN\tIndiana\tWayne County\t552\t41.0\t10.1\t13.1\t19724\t79231\t0.4157\t47357\tRomney\t47357\t0.001461845\t47357.0\n6476\t-84.891452\t39.83435\tRichmond city\tIN\tIndiana\tWayne County\t37443\t38.0\t16.4\t14.9\t21801\t84372\t0.4157\t47374\tRomney\t47374\t0.09915915\t47374.0\n6477\t-85.278657\t40.918964\tZanesville town\tIN\tIndiana\tWells County\t620\t41.0\t17.9\t9.1\t25190\t118056\t0.2656\t46799\tRomney\t46799\t0.001641927\t46799.0\n6478\t-85.168097\t40.878168\tOssian town\tIN\tIndiana\tWells County\t3154\t34.7\t18.4\t10.4\t26244\t99880\t0.2656\t46777\tRomney\t46777\t0.008352642\t46777.0\n6479\t-85.242177\t40.829888000000004\tUniondale town\tIN\tIndiana\tWells County\t306\t40.4\t17.3\t6.6\t22966\t92273\t0.2656\t46791\tRomney\t46791\t0.00081037\t46791.0\n6480\t-85.222402\t40.656759\tPoneto town\tIN\tIndiana\tWells County\t237\t40.8\t14.1\t9.4\t20173\t106250\t0.2656\t46781\tRomney\t46781\t0.00062764\t46781.0\n6481\t-85.079856\t40.701198\tVera Cruz town\tIN\tIndiana\tWells County\t59\t37.5\t20.5\t10.0\t22918\t141667\t0.2656\t46714\tRomney\t46714\t0.000156248\t46714.0\n6482\t-85.170781\t40.741859000000005\tBluffton city\tIN\tIndiana\tWells County\t9651\t37.5\t16.5\t11.5\t23292\t84582\t0.2656\t46714\tRomney\t46714\t0.025558447999999998\t46714.0\n6483\t-86.867627\t40.662605\tChalmers town\tIN\tIndiana\tWhite County\t557\t39.9\t13.4\t10.7\t22229\t101220\t0.3673\t47929\tRomney\t47929\t0.001475086\t47929.0\n6484\t-86.87894200000001\t40.864108\tMonon town\tIN\tIndiana\tWhite County\t1577\t37.1\t5.8\t10.7\t16289\t69118\t0.3673\t47959\tRomney\t47959\t0.004176321\t47959.0\n6485\t-86.594765\t40.761265\tBurnettsville town\tIN\tIndiana\tWhite County\t357\t41.8\t7.1\t9.3\t20872\t84091\t0.3673\t47926\tRomney\t47926\t0.000945432\t47926.0\n6486\t-86.737448\t40.888094\tBuffalo CDP\tIN\tIndiana\tWhite County\t643\t40.0\t3.4\t6.3\t19812\t94000\t0.3673\t47925\tRomney\t47925\t0.001702837\t47925.0\n6487\t-86.771857\t40.779647\tNorway CDP\tIN\tIndiana\tWhite County\t428\t44.9\t11.9\t10.3\t23215\t111574\t0.3673\t47960\tRomney\t47960\t0.0011334589999999999\t47960.0\n6488\t-86.866238\t40.600235\tBrookston town\tIN\tIndiana\tWhite County\t1704\t38.2\t13.0\t7.6\t22727\t102879\t0.3673\t47923\tRomney\t47923\t0.0045126509999999995\t47923.0\n6489\t-87.042061\t40.758587\tWolcott town\tIN\tIndiana\tWhite County\t948\t37.5\t14.6\t12.0\t22073\t85857\t0.3673\t47995\tRomney\t47995\t0.002510559\t47995.0\n6490\t-86.87388\t40.749136\tReynolds town\tIN\tIndiana\tWhite County\t590\t36.5\t9.9\t9.6\t19221\t88125\t0.3673\t47980\tRomney\t47980\t0.0015624789999999999\t47980.0\n6491\t-86.764677\t40.747221\tMonticello city\tIN\tIndiana\tWhite County\t5388\t38.4\t10.4\t10.8\t22381\t93477\t0.3673\t47960\tRomney\t47960\t0.014268875\t47960.0\n6492\t-85.623981\t41.179206\tLarwill town\tIN\tIndiana\tWhitley County\t305\t38.0\t7.6\t15.8\t22751\t98333\t0.2945\t46764\tRomney\t46764\t0.000807722\t46764.0\n6493\t-85.628311\t41.08548\tSouth Whitley town\tIN\tIndiana\tWhitley County\t1733\t34.9\t13.6\t11.6\t21143\t81145\t0.2945\t46787\tRomney\t46787\t0.004589451\t46787.0\n6494\t-85.321087\t41.232137\tChurubusco town\tIN\tIndiana\tWhitley County\t1732\t37.6\t12.6\t11.0\t24303\t88258\t0.2945\t46723\tRomney\t46723\t0.0045868029999999995\t46723.0\n6495\t-85.485027\t41.160336\tColumbia City\tIN\tIndiana\tWhitley County\t7994\t36.7\t14.8\t13.1\t24162\t93604\t0.2945\t46725\tRomney\t46725\t0.021170265\t46725.0\n6496\t-85.481759\t41.221678999999995\tTri-Lakes CDP\tIN\tIndiana\tWhitley County\t4421\t42.5\t20.6\t9.5\t26601\t132846\t0.2945\t46725\tRomney\t46725\t0.011707998999999998\t46725.0\n6497\t-94.45914300000001\t41.305515\tGreenfield city\tIA\tIowa\tAdair County\t1929\t45.4\t10.4\t8.5\t21841\t79444\t0.4479\t50849\tObama\t50849\t0.004871278\t50849.0\n6498\t-94.41783000000001\t41.203295000000004\tOrient city\tIA\tIowa\tAdair County\t369\t43.5\t14.9\t3.1\t20664\t65500\t0.4479\t50858\tObama\t50858\t0.000931831\t50858.0\n6499\t-94.560648\t41.289328000000005\tFontanelle city\tIA\tIowa\tAdair County\t650\t47.1\t9.3\t4.3\t22544\t72500\t0.4479\t50846\tObama\t50846\t0.001641436\t50846.0\n6500\t-94.668973\t41.247078\tBridgewater city\tIA\tIowa\tAdair County\t158\t45.7\t19.3\t5.3\t17345\t47000\t0.4479\t50837\tObama\t50837\t0.000398995\t50837.0\n6501\t-94.643335\t41.507554\tAdair city\tIA\tIowa\tAdair County\t766\t44.0\t16.8\t4.5\t23128\t70484\t0.4479\t50002\tObama\t50002\t0.001934369\t50002.0\n6502\t-94.318057\t41.508953000000005\tStuart city\tIA\tIowa\tAdair County\t1801\t40.3\t15.0\t10.5\t22613\t102158\t0.4479\t50250\tObama\t50250\t0.004548041\t50250.0\n6503\t-94.740055\t40.993124\tCorning city\tIA\tIowa\tAdams County\t1599\t43.4\t14.7\t5.6\t20405\t66633\t0.4705\t50841\tObama\t50841\t0.004037933\t50841.0\n6504\t-94.89554\t40.936507\tNodaway city\tIA\tIowa\tAdams County\t118\t49.2\t15.7\t11.5\t18706\t71250\t0.4705\t50857\tObama\t50857\t0.000297984\t50857.0\n6505\t-94.823966\t41.049668\tCarbon city\tIA\tIowa\tAdams County\t26\t38.8\t15.8\t13.3\t17703\t55000\t0.4705\t50841\tObama\t50841\t6.57e-05\t50841.0\n6506\t-94.613\t41.023771\tPrescott city\tIA\tIowa\tAdams County\t245\t45.6\t13.6\t12.7\t17874\t63125\t0.4705\t50859\tObama\t50859\t0.000618695\t50859.0\n6507\t-91.152235\t43.200802\tHarpers Ferry city\tIA\tIowa\tAllamakee County\t328\t47.1\t13.0\t9.3\t19816\t97273\t0.5124\t52146\tObama\t52146\t0.0008282939999999999\t52146.0\n6508\t-91.296\t43.208255\tWaterville city\tIA\tIowa\tAllamakee County\t144\t37.8\t15.2\t5.3\t19232\t98333\t0.5124\t52170\tObama\t52170\t0.000363641\t52170.0\n6509\t-91.22558599999999\t43.360831\tLansing city\tIA\tIowa\tAllamakee County\t1058\t45.0\t14.0\t8.0\t20383\t94200\t0.5124\t52151\tObama\t52151\t0.002671753\t52151.0\n6510\t-91.565694\t43.087192\tPostville city\tIA\tIowa\tAllamakee County\t2361\t38.6\t19.1\t7.0\t16994\t89918\t0.5124\t52162\tObama\t52162\t0.005962202\t52162.0\n6511\t-91.288421\t43.497142\tNew Albin city\tIA\tIowa\tAllamakee County\t517\t41.0\t14.6\t10.6\t21381\t68750\t0.5124\t52160\tObama\t52160\t0.001305573\t52160.0\n6512\t-91.478439\t43.267678000000004\tWaukon city\tIA\tIowa\tAllamakee County\t3977\t45.0\t20.5\t9.4\t20652\t92333\t0.5124\t52172\tObama\t52172\t0.010043065\t52172.0\n6513\t-92.695779\t40.818197\tUnionville city\tIA\tIowa\tAppanoose County\t132\t46.4\t16.7\t1.6\t19501\t105000\t0.4725\t52594\tObama\t52594\t0.000333338\t52594.0\n6514\t-92.872691\t40.729874\tCenterville city\tIA\tIowa\tAppanoose County\t5405\t41.0\t17.8\t12.5\t20329\t66457\t0.4725\t52544\tObama\t52544\t0.013649173999999998\t52544.0\n6515\t-92.84314\t40.649066\tExline city\tIA\tIowa\tAppanoose County\t178\t46.3\t9.9\t6.0\t15985\t80000\t0.4725\t52555\tObama\t52555\t0.000449501\t52555.0\n6516\t-92.944634\t40.779191\tMystic city\tIA\tIowa\tAppanoose County\t566\t40.6\t5.1\t17.5\t14196\t49091\t0.4725\t52574\tObama\t52574\t0.001429312\t52574.0\n6517\t-92.74268599999999\t40.780141\tUdell city\tIA\tIowa\tAppanoose County\t61\t46.5\t17.4\t3.4\t19289\t106250\t0.4725\t52593\tObama\t52593\t0.000154042\t52593.0\n6518\t-92.887175\t40.801671\tRathbun city\tIA\tIowa\tAppanoose County\t90\t47.1\t13.2\t4.5\t20473\t95000\t0.4725\t52544\tObama\t52544\t0.000227276\t52544.0\n6519\t-92.81848000000001\t40.891756\tMoravia city\tIA\tIowa\tAppanoose County\t717\t45.0\t11.2\t4.1\t15376\t64091\t0.4725\t52571\tObama\t52571\t0.00181063\t52571.0\n6520\t-92.979988\t40.685388\tNuma city\tIA\tIowa\tAppanoose County\t105\t43.0\t13.5\t8.0\t15966\t90000\t0.4725\t52549\tObama\t52549\t0.000265155\t52549.0\n6521\t-92.92223299999999\t40.630959999999995\tCincinnati city\tIA\tIowa\tAppanoose County\t415\t42.1\t12.8\t2.9\t18907\t56250\t0.4725\t52549\tObama\t52549\t0.001047994\t52549.0\n6522\t-92.67651500000001\t40.685408\tMoulton city\tIA\tIowa\tAppanoose County\t631\t42.8\t11.4\t8.4\t14659\t47759\t0.4725\t52572\tObama\t52572\t0.001593456\t52572.0\n6523\t-93.04698\t40.755458000000004\tPlano city\tIA\tIowa\tAppanoose County\t59\t48.1\t13.3\t3.4\t20578\t95000\t0.4725\t52581\tObama\t52581\t0.000148992\t52581.0\n6524\t-94.928958\t41.718293\tAudubon city\tIA\tIowa\tAudubon County\t2191\t48.4\t16.6\t8.3\t23946\t72532\t0.466\t50025\tObama\t50025\t0.0055329030000000005\t50025.0\n6525\t-94.88116\t41.592029\tExira city\tIA\tIowa\tAudubon County\t778\t51.0\t11.4\t4.0\t18267\t58056\t0.466\t50076\tObama\t50076\t0.0019646729999999997\t50076.0\n6526\t-94.930304\t41.544816\tBrayton city\tIA\tIowa\tAudubon County\t138\t42.2\t11.1\t3.0\t17629\t80000\t0.466\t50042\tObama\t50042\t0.00034849\t50042.0\n6527\t-94.98598100000001\t41.841966\tGray city\tIA\tIowa\tAudubon County\t76\t44.4\t19.6\t8.2\t19222\t102500\t0.466\t50110\tObama\t50110\t0.000191922\t50110.0\n6528\t-95.074911\t41.627112\tKimballton city\tIA\tIowa\tAudubon County\t341\t42.3\t14.3\t7.1\t18117\t80769\t0.466\t51543\tObama\t51543\t0.000861123\t51543.0\n6529\t-92.14315\t42.144016\tGarrison city\tIA\tIowa\tBenton County\t437\t44.5\t9.3\t5.1\t22057\t112500\t0.4893\t52229\tObama\t52229\t0.00110355\t52229.0\n6530\t-92.094225\t42.257629\tMount Auburn city\tIA\tIowa\tBenton County\t170\t42.0\t20.2\t6.4\t20675\t123438\t0.4893\t52313\tObama\t52313\t0.000429299\t52313.0\n6531\t-92.19828299999999\t41.999774\tKeystone city\tIA\tIowa\tBenton County\t742\t44.4\t15.5\t8.8\t25411\t91053\t0.4893\t52249\tObama\t52249\t0.0018737629999999999\t52249.0\n6532\t-92.02764599999999\t42.163992\tVinton city\tIA\tIowa\tBenton County\t5205\t41.6\t18.2\t10.9\t22744\t93519\t0.4893\t52349\tObama\t52349\t0.013144116\t52349.0\n6533\t-91.905916\t42.222377\tUrbana city\tIA\tIowa\tBenton County\t1009\t36.3\t13.5\t5.4\t21349\t120709\t0.4893\t52345\tObama\t52345\t0.002548014\t52345.0\n6534\t-91.922849\t41.902246999999996\tNorway city\tIA\tIowa\tBenton County\t705\t33.8\t22.4\t5.0\t25676\t163068\t0.4893\t52318\tObama\t52318\t0.0017803270000000002\t52318.0\n6535\t-92.08283399999999\t41.905951\tBlairstown city\tIA\tIowa\tBenton County\t738\t40.9\t10.8\t5.3\t24064\t108250\t0.4893\t52209\tObama\t52209\t0.001863661\t52209.0\n6536\t-91.828226\t41.880946\tWalford city\tIA\tIowa\tBenton County\t1506\t34.4\t22.1\t5.4\t25543\t165972\t0.4893\t52351\tObama\t52351\t0.003803082\t52351.0\n6537\t-92.27533000000001\t41.895224\tBelle Plaine city\tIA\tIowa\tBenton County\t2871\t41.3\t16.8\t7.5\t23617\t76436\t0.4893\t52208\tObama\t52208\t0.007250098000000001\t52208.0\n6538\t-91.967412\t41.993342\tNewhall city\tIA\tIowa\tBenton County\t1011\t40.8\t15.0\t3.0\t23603\t120657\t0.4893\t52315\tObama\t52315\t0.002553065\t52315.0\n6539\t-91.870457\t42.092984\tShellsburg city\tIA\tIowa\tBenton County\t1034\t42.6\t12.9\t5.6\t22160\t121212\t0.4893\t52332\tObama\t52332\t0.002611146\t52332.0\n6540\t-92.180239\t41.905639\tLuzerne city\tIA\tIowa\tBenton County\t106\t45.3\t12.8\t4.8\t22167\t114063\t0.4893\t52257\tObama\t52257\t0.00026768\t52257.0\n6541\t-91.85727299999999\t41.995076\tAtkins city\tIA\tIowa\tBenton County\t978\t36.8\t19.8\t6.7\t21639\t150000\t0.4893\t52206\tObama\t52206\t0.00246973\t52206.0\n6542\t-92.089483\t42.009144\tVan Horne city\tIA\tIowa\tBenton County\t739\t40.5\t15.2\t4.4\t22288\t114500\t0.4893\t52346\tObama\t52346\t0.001866187\t52346.0\n6543\t-92.19119\t42.313685\tLa Porte City\tIA\tIowa\tBlack Hawk County\t2264\t37.9\t13.9\t3.2\t21122\t101661\t0.5931\t50651\tObama\t50651\t0.005717249000000001\t50651.0\n6544\t-92.22890699999999\t42.469444\tRaymond city\tIA\tIowa\tBlack Hawk County\t523\t38.7\t9.1\t5.1\t21419\t110174\t0.5931\t50667\tObama\t50667\t0.001320725\t50667.0\n6545\t-92.16066500000001\t42.567346\tDunkerton city\tIA\tIowa\tBlack Hawk County\t750\t35.2\t13.6\t5.2\t18885\t100000\t0.5931\t50626\tObama\t50626\t0.001893965\t50626.0\n6546\t-92.24999\t42.466272\tElk Run Heights city\tIA\tIowa\tBlack Hawk County\t1057\t42.2\t10.9\t6.3\t21117\t94730\t0.5931\t50667\tObama\t50667\t0.002669228\t50667.0\n6547\t-92.45208000000001\t42.431428000000004\tHudson city\tIA\tIowa\tBlack Hawk County\t2196\t42.3\t29.0\t1.8\t27897\t151316\t0.5931\t50643\tObama\t50643\t0.005545529\t50643.0\n6548\t-92.35154200000001\t42.4912\tWaterloo city\tIA\tIowa\tBlack Hawk County\t68115\t37.4\t22.3\t9.3\t24162\t87273\t0.5931\t507HH\tObama\t507HH\t0.172009892\t0.0\n6549\t-92.27637299999999\t42.463394\tEvansdale city\tIA\tIowa\tBlack Hawk County\t4566\t38.5\t7.4\t9.0\t19281\t83053\t0.5931\t50707\tObama\t50707\t0.011530458\t50707.0\n6550\t-92.21436700000001\t42.418851000000004\tGilbertville city\tIA\tIowa\tBlack Hawk County\t737\t43.5\t13.6\t6.1\t21539\t133871\t0.5931\t50634\tObama\t50634\t0.001861136\t50634.0\n6551\t-92.45284699999999\t42.51995\tCedar Falls city\tIA\tIowa\tBlack Hawk County\t38369\t30.7\t43.9\t6.4\t25299\t138325\t0.5931\t50613\tObama\t50613\t0.096892719\t50613.0\n6552\t-94.10618199999999\t42.173396000000004\tBoxholm city\tIA\tIowa\tBoone County\t218\t46.6\t16.1\t3.1\t21407\t91250\t0.5221\t50040\tObama\t50040\t0.000550512\t50040.0\n6553\t-94.139995\t42.038169\tBeaver city\tIA\tIowa\tBoone County\t55\t44.2\t25.0\t3.1\t22615\t162500\t0.5221\t50107\tObama\t50107\t0.000138891\t50107.0\n6554\t-93.82023000000001\t41.875335\tMadrid city\tIA\tIowa\tBoone County\t2435\t39.2\t18.6\t6.7\t25811\t98000\t0.5221\t50156\tObama\t50156\t0.0061490730000000006\t50156.0\n6555\t-93.82005500000001\t41.966936\tLuther city\tIA\tIowa\tBoone County\t168\t43.8\t36.4\t3.6\t27624\t150000\t0.5221\t50152\tObama\t50152\t0.000424248\t50152.0\n6556\t-93.877673\t42.052795\tBoone city\tIA\tIowa\tBoone County\t12746\t38.8\t20.2\t8.4\t24012\t89646\t0.5221\t50036\tObama\t50036\t0.032187302\t50036.0\n6557\t-93.973496\t42.125046999999995\tFraser city\tIA\tIowa\tBoone County\t149\t46.6\t18.2\t2.0\t27197\t121429\t0.5221\t50223\tObama\t50223\t0.000376268\t50223.0\n6558\t-94.018349\t42.159045\tPilot Mound city\tIA\tIowa\tBoone County\t217\t46.4\t16.1\t3.1\t21404\t88000\t0.5221\t50223\tObama\t50223\t0.000547987\t50223.0\n6559\t-94.113629\t41.946464\tBerkley city\tIA\tIowa\tBoone County\t23\t40.0\t25.0\t8.3\t22916\t150000\t0.5221\t50235\tObama\t50235\t5.8099999999999996e-05\t50235.0\n6560\t-94.028428\t42.039415000000005\tOgden city\tIA\tIowa\tBoone County\t2119\t41.6\t13.8\t3.3\t25035\t101643\t0.5221\t50212\tObama\t50212\t0.005351081999999999\t50212.0\n6561\t-92.22514699999999\t42.703787\tReadlyn city\tIA\tIowa\tBremer County\t772\t42.0\t15.3\t2.6\t25813\t109052\t0.5067\t50668\tObama\t50668\t0.001949521\t50668.0\n6562\t-92.535965\t42.84458\tPlainfield city\tIA\tIowa\tBremer County\t475\t40.8\t9.8\t4.8\t22898\t103922\t0.5067\t50666\tObama\t50666\t0.0011995110000000001\t50666.0\n6563\t-92.33501\t42.670962\tDenver city\tIA\tIowa\tBremer County\t1808\t42.6\t27.9\t2.1\t26375\t149816\t0.5067\t50622\tObama\t50622\t0.004565718\t50622.0\n6564\t-92.30629499999999\t42.883478000000004\tFrederika city\tIA\tIowa\tBremer County\t196\t43.5\t14.5\t17.6\t23953\t120000\t0.5067\t50631\tObama\t50631\t0.000494956\t50631.0\n6565\t-92.47004\t42.725195\tWaverly city\tIA\tIowa\tBremer County\t9267\t35.9\t35.6\t5.1\t25027\t132891\t0.5067\t50677\tObama\t50677\t0.02340183\t50677.0\n6566\t-92.07665\t42.849523\tSumner city\tIA\tIowa\tBremer County\t2076\t43.3\t17.5\t4.0\t22698\t93868\t0.5067\t50674\tObama\t50674\t0.005242495\t50674.0\n6567\t-92.461463\t42.648503000000005\tJanesville city\tIA\tIowa\tBremer County\t881\t44.6\t18.5\t5.9\t24517\t146094\t0.5067\t50647\tObama\t50647\t0.0022247770000000003\t50647.0\n6568\t-92.258083\t42.808516999999995\tTripoli city\tIA\tIowa\tBremer County\t1411\t40.2\t13.8\t5.7\t20332\t98000\t0.5067\t50676\tObama\t50676\t0.003563179\t50676.0\n6569\t-92.00314499999999\t42.315049\tBrandon city\tIA\tIowa\tBuchanan County\t333\t39.4\t10.3\t14.0\t24959\t106944\t0.5611\t52210\tObama\t52210\t0.00084092\t52210.0\n6570\t-91.734548\t42.4721\tWinthrop city\tIA\tIowa\tBuchanan County\t747\t41.3\t20.1\t5.4\t20153\t97941\t0.5611\t50682\tObama\t50682\t0.001886389\t50682.0\n6571\t-91.729465\t42.620094\tAurora city\tIA\tIowa\tBuchanan County\t209\t40.5\t19.0\t9.3\t19810\t71667\t0.5611\t50607\tObama\t50607\t0.000527785\t50607.0\n6572\t-91.756644\t42.395358\tQuasqueton city\tIA\tIowa\tBuchanan County\t618\t40.7\t11.1\t11.2\t22468\t109028\t0.5611\t52326\tObama\t52326\t0.0015606270000000002\t52326.0\n6573\t-91.891419\t42.468202000000005\tIndependence city\tIA\tIowa\tBuchanan County\t5828\t41.4\t21.6\t5.4\t23900\t105429\t0.5611\t50644\tObama\t50644\t0.01471737\t50644.0\n6574\t-91.90584\t42.61777\tHazleton city\tIA\tIowa\tBuchanan County\t1002\t33.7\t9.1\t7.2\t17253\t64118\t0.5611\t50641\tObama\t50641\t0.002530337\t50641.0\n6575\t-92.045734\t42.64414\tFairbank city\tIA\tIowa\tBuchanan County\t1052\t30.4\t13.9\t5.6\t15804\t102462\t0.5611\t50629\tObama\t50629\t0.0026566009999999998\t50629.0\n6576\t-91.844573\t42.368448\tRowley city\tIA\tIowa\tBuchanan County\t306\t41.5\t14.2\t10.4\t20757\t116964\t0.5611\t52329\tObama\t52329\t0.000772738\t52329.0\n6577\t-92.06659599999999\t42.475527\tJesup city\tIA\tIowa\tBuchanan County\t2321\t39.0\t9.3\t3.9\t22800\t103790\t0.5611\t50648\tObama\t50648\t0.00586119\t50648.0\n6578\t-91.812224\t42.644836\tStanley city\tIA\tIowa\tBuchanan County\t138\t39.4\t18.7\t9.0\t19792\t70000\t0.5611\t50671\tObama\t50671\t0.00034849\t50671.0\n6579\t-91.640474\t42.598503\tLamont city\tIA\tIowa\tBuchanan County\t473\t39.2\t12.6\t9.4\t17752\t76176\t0.5611\t50650\tObama\t50650\t0.001194461\t50650.0\n6580\t-95.24245400000001\t42.89264\tLinn Grove city\tIA\tIowa\tBuena Vista County\t206\t45.4\t20.8\t5.0\t18707\t58000\t0.4414\t51033\tObama\t51033\t0.000520209\t51033.0\n6581\t-94.98313900000001\t42.86023\tMarathon city\tIA\tIowa\tBuena Vista County\t288\t46.8\t15.6\t5.7\t17841\t54286\t0.4414\t50565\tObama\t50565\t0.000727283\t50565.0\n6582\t-95.183099\t42.729334\tTruesdale city\tIA\tIowa\tBuena Vista County\t83\t41.4\t24.6\t2.4\t22315\t100000\t0.4414\t50592\tObama\t50592\t0.000209599\t50592.0\n6583\t-94.949242\t42.7816\tAlbert City\tIA\tIowa\tBuena Vista County\t679\t45.4\t16.8\t3.7\t18248\t51774\t0.4414\t50510\tObama\t50510\t0.00171467\t50510.0\n6584\t-95.199647\t42.644403000000004\tStorm Lake city\tIA\tIowa\tBuena Vista County\t9928\t34.9\t23.9\t7.2\t20457\t97399\t0.4414\t50588\tObama\t50588\t0.025071045\t50588.0\n6585\t-95.148618\t42.891566999999995\tSioux Rapids city\tIA\tIowa\tBuena Vista County\t658\t45.8\t14.8\t5.2\t23312\t52963\t0.4414\t50585\tObama\t50585\t0.001661639\t50585.0\n6586\t-95.174152\t42.619346\tLakeside city\tIA\tIowa\tBuena Vista County\t524\t35.3\t15.5\t11.9\t18048\t81842\t0.4414\t50588\tObama\t50588\t0.00132325\t50588.0\n6587\t-95.16637800000001\t42.825738\tRembrandt city\tIA\tIowa\tBuena Vista County\t223\t45.5\t21.0\t4.7\t18671\t58000\t0.4414\t50576\tObama\t50576\t0.000563139\t50576.0\n6588\t-95.304612\t42.671894\tAlta city\tIA\tIowa\tBuena Vista County\t1819\t37.1\t20.7\t7.2\t17235\t91809\t0.4414\t51002\tObama\t51002\t0.004593496\t51002.0\n6589\t-95.00395400000001\t42.609753000000005\tNewell city\tIA\tIowa\tBuena Vista County\t877\t43.2\t19.4\t7.3\t20968\t69286\t0.4414\t50568\tObama\t50568\t0.002214676\t50568.0\n6590\t-92.66805\t42.780088\tClarksville city\tIA\tIowa\tButler County\t1355\t40.7\t9.0\t6.8\t21010\t75119\t0.4412\t50619\tObama\t50619\t0.003421763\t50619.0\n6591\t-92.581771\t42.712471\tShell Rock city\tIA\tIowa\tButler County\t1208\t43.4\t14.3\t6.4\t24661\t100750\t0.4412\t50670\tObama\t50670\t0.003050546\t50670.0\n6592\t-92.880746\t42.581920000000004\tAplington city\tIA\tIowa\tButler County\t1059\t46.3\t16.5\t9.3\t20497\t89054\t0.4412\t50604\tObama\t50604\t0.002674278\t50604.0\n6593\t-93.005363\t42.833231\tAredale city\tIA\tIowa\tButler County\t97\t35.5\t0.0\t7.4\t16935\t58333\t0.4412\t50605\tObama\t50605\t0.000244953\t50605.0\n6594\t-92.795827\t42.751754\tAllison city\tIA\tIowa\tButler County\t935\t45.2\t11.8\t3.9\t23816\t74712\t0.4412\t50602\tObama\t50602\t0.002361143\t50602.0\n6595\t-92.782187\t42.574176\tParkersburg city\tIA\tIowa\tButler County\t1807\t42.1\t12.8\t5.3\t19110\t98333\t0.4412\t50665\tObama\t50665\t0.004563193\t50665.0\n6596\t-92.973543\t42.75222\tDumont city\tIA\tIowa\tButler County\t635\t47.3\t6.7\t6.5\t17463\t49821\t0.4412\t50625\tObama\t50625\t0.001603557\t50625.0\n6597\t-92.90791800000001\t42.773842\tBristow city\tIA\tIowa\tButler County\t220\t37.0\t0.7\t6.7\t16950\t69000\t0.4412\t50611\tObama\t50611\t0.000555563\t50611.0\n6598\t-92.623195\t42.566518\tNew Hartford city\tIA\tIowa\tButler County\t615\t42.3\t11.3\t7.2\t20636\t74400\t0.4412\t50660\tObama\t50660\t0.001553051\t50660.0\n6599\t-92.804154\t42.896496\tGreene city\tIA\tIowa\tButler County\t1040\t49.0\t15.6\t4.2\t25484\t76774\t0.4412\t50636\tObama\t50636\t0.002626298\t50636.0\n6600\t-94.485126\t42.339597999999995\tRinard city\tIA\tIowa\tCalhoun County\t71\t40.6\t17.0\t5.0\t19144\t55000\t0.4279\t50586\tObama\t50586\t0.000179295\t50586.0\n6601\t-94.731169\t42.267654\tLake City\tIA\tIowa\tCalhoun County\t1747\t47.3\t16.5\t8.3\t21839\t73788\t0.4279\t51449\tObama\t51449\t0.004411676\t51449.0\n6602\t-94.54024799999999\t42.528324\tManson city\tIA\tIowa\tCalhoun County\t1696\t45.4\t26.5\t4.0\t20199\t83841\t0.4279\t50563\tObama\t50563\t0.004282886\t50563.0\n6603\t-94.677891\t42.551919\tPomeroy city\tIA\tIowa\tCalhoun County\t656\t46.3\t17.5\t9.2\t21313\t61364\t0.4279\t50575\tObama\t50575\t0.0016565879999999999\t50575.0\n6604\t-94.62901\t42.398189\tRockwell City\tIA\tIowa\tCalhoun County\t1984\t44.6\t14.6\t3.5\t22088\t74741\t0.4279\t50579\tObama\t50579\t0.005010168\t50579.0\n6605\t-94.431014\t42.378692\tSomers city\tIA\tIowa\tCalhoun County\t163\t40.8\t16.4\t5.4\t19103\t54000\t0.4279\t50586\tObama\t50586\t0.000411622\t50586.0\n6606\t-94.395358\t42.279816\tFarnhamville city\tIA\tIowa\tCalhoun County\t362\t45.5\t16.4\t4.1\t22334\t65667\t0.4279\t50538\tObama\t50538\t0.0009141539999999999\t50538.0\n6607\t-94.843163\t42.316134999999996\tYetter city\tIA\tIowa\tCalhoun County\t33\t42.5\t18.2\t6.3\t22235\t100000\t0.4279\t51433\tObama\t51433\t8.329999999999999e-05\t51433.0\n6608\t-94.718248\t42.479439\tJolley city\tIA\tIowa\tCalhoun County\t48\t45.8\t22.9\t6.9\t21201\t95000\t0.4279\t50551\tObama\t50551\t0.000121214\t50551.0\n6609\t-94.552175\t42.267146999999994\tLohrville city\tIA\tIowa\tCalhoun County\t426\t40.2\t16.7\t5.4\t19087\t54118\t0.4279\t51453\tObama\t51453\t0.001075772\t51453.0\n6610\t-94.455947\t42.456144\tKnierim city\tIA\tIowa\tCalhoun County\t72\t36.7\t3.4\t0.0\t14958\t85000\t0.4279\t50552\tObama\t50552\t0.00018182099999999998\t50552.0\n6611\t-94.978247\t42.182556\tBreda city\tIA\tIowa\tCarroll County\t443\t41.3\t12.9\t6.9\t21871\t97857\t0.4635\t51436\tObama\t51436\t0.001118702\t51436.0\n6612\t-94.941723\t41.918231\tTempleton city\tIA\tIowa\tCarroll County\t320\t41.0\t9.4\t2.1\t21628\t96111\t0.4635\t51463\tObama\t51463\t0.000808092\t51463.0\n6613\t-95.043222\t42.086183\tArcadia city\tIA\tIowa\tCarroll County\t444\t37.6\t11.6\t4.1\t20017\t94375\t0.4635\t51430\tObama\t51430\t0.001121227\t51430.0\n6614\t-94.822376\t41.978770000000004\tWilley city\tIA\tIowa\tCarroll County\t109\t39.2\t11.9\t4.5\t20719\t103571\t0.4635\t51440\tObama\t51440\t0.000275256\t51440.0\n6615\t-94.675641\t41.874994\tCoon Rapids city\tIA\tIowa\tCarroll County\t1275\t46.4\t17.0\t5.1\t20909\t75135\t0.4635\t50058\tObama\t50058\t0.00321974\t50058.0\n6616\t-94.864165\t42.069851\tCarroll city\tIA\tIowa\tCarroll County\t9992\t41.6\t23.9\t3.1\t25880\t116492\t0.4635\t51401\tObama\t51401\t0.025232663\t51401.0\n6617\t-94.78371700000001\t42.122509\tLidderdale city\tIA\tIowa\tCarroll County\t177\t37.5\t14.4\t8.3\t19038\t85000\t0.4635\t51452\tObama\t51452\t0.00044697599999999997\t51452.0\n6618\t-94.692185\t42.182641\tLanesboro city\tIA\tIowa\tCarroll County\t144\t37.5\t14.3\t7.9\t19124\t83750\t0.4635\t51451\tObama\t51451\t0.000363641\t51451.0\n6619\t-94.72616\t42.05689\tGlidden city\tIA\tIowa\tCarroll County\t1243\t43.9\t15.9\t3.6\t19930\t85571\t0.4635\t51443\tObama\t51443\t0.0031389309999999998\t51443.0\n6620\t-94.619749\t42.041746\tRalston city\tIA\tIowa\tCarroll County\t94\t43.4\t15.4\t3.3\t23057\t85000\t0.4635\t51459\tObama\t51459\t0.00023737700000000001\t51459.0\n6621\t-94.97215600000001\t42.005093\tHalbur city\tIA\tIowa\tCarroll County\t205\t36.7\t12.0\t0.8\t21667\t100000\t0.4635\t51444\tObama\t51444\t0.000517684\t51444.0\n6622\t-95.064776\t41.909427\tManning city\tIA\tIowa\tCarroll County\t1413\t46.2\t17.4\t2.6\t23729\t71594\t0.4635\t51455\tObama\t51455\t0.00356823\t51455.0\n6623\t-94.823261\t41.908743\tDedham city\tIA\tIowa\tCarroll County\t263\t38.7\t12.6\t2.5\t18087\t77857\t0.4635\t51440\tObama\t51440\t0.00066415\t51440.0\n6624\t-95.084298\t41.306494\tLewis city\tIA\tIowa\tCass County\t432\t46.5\t13.3\t4.4\t19451\t71563\t0.3967\t51544\tObama\t51544\t0.0010909239999999998\t51544.0\n6625\t-94.765682\t41.443844\tAnita city\tIA\tIowa\tCass County\t981\t46.6\t10.1\t8.5\t21111\t70119\t0.3967\t50020\tObama\t50020\t0.002477306\t50020.0\n6626\t-95.13930500000001\t41.234353999999996\tGriswold city\tIA\tIowa\tCass County\t1062\t45.0\t14.9\t4.0\t20795\t78375\t0.3967\t51535\tObama\t51535\t0.0026818540000000004\t51535.0\n6627\t-94.887508\t41.401132000000004\tWiota city\tIA\tIowa\tCass County\t140\t46.3\t8.9\t4.3\t17662\t92500\t0.3967\t50274\tObama\t50274\t0.00035354\t50274.0\n6628\t-94.769855\t41.250640999999995\tMassena city\tIA\tIowa\tCass County\t374\t46.4\t12.5\t4.9\t17552\t65000\t0.3967\t50853\tObama\t50853\t0.000944457\t50853.0\n6629\t-95.11075600000001\t41.448902000000004\tMarne city\tIA\tIowa\tCass County\t149\t46.6\t15.5\t2.9\t22193\t106731\t0.3967\t51552\tObama\t51552\t0.000376268\t51552.0\n6630\t-95.01456800000001\t41.395514\tAtlantic city\tIA\tIowa\tCass County\t6889\t44.9\t20.9\t9.3\t22852\t93895\t0.3967\t50022\tObama\t50022\t0.017396698999999998\t50022.0\n6631\t-94.87066\t41.273105\tCumberland city\tIA\tIowa\tCass County\t268\t44.9\t9.7\t2.5\t16648\t82778\t0.3967\t50843\tObama\t50843\t0.0006767769999999999\t50843.0\n6632\t-91.350173\t41.68015\tWest Branch city\tIA\tIowa\tCedar County\t2388\t39.2\t27.6\t6.0\t23579\t115357\t0.5153\t52358\tObama\t52358\t0.006030384000000001\t52358.0\n6633\t-90.89857099999999\t41.601563\tDurant city\tIA\tIowa\tCedar County\t1766\t38.7\t14.4\t5.0\t24691\t121510\t0.5153\t52747\tObama\t52747\t0.004459655999999999\t52747.0\n6634\t-91.12865500000001\t41.770902\tTipton city\tIA\tIowa\tCedar County\t3095\t41.7\t18.8\t7.1\t21605\t112150\t0.5153\t52772\tObama\t52772\t0.007815761999999999\t52772.0\n6635\t-91.25281\t41.905539000000005\tMechanicsville city\tIA\tIowa\tCedar County\t1209\t39.8\t15.4\t8.0\t22460\t104875\t0.5153\t52306\tObama\t52306\t0.0030530709999999996\t52306.0\n6636\t-90.923641\t41.859026\tLowden city\tIA\tIowa\tCedar County\t807\t44.4\t14.4\t2.5\t20087\t92609\t0.5153\t52255\tObama\t52255\t0.002037906\t52255.0\n6637\t-90.973848\t41.739954\tBennett city\tIA\tIowa\tCedar County\t384\t42.3\t9.2\t6.5\t21280\t114815\t0.5153\t52721\tObama\t52721\t0.00096971\t52721.0\n6638\t-91.148258\t41.893421000000004\tStanwood city\tIA\tIowa\tCedar County\t674\t42.1\t20.7\t6.1\t22995\t103269\t0.5153\t52337\tObama\t52337\t0.0017020429999999999\t52337.0\n6639\t-91.057888\t41.885967\tClarence city\tIA\tIowa\tCedar County\t1040\t44.5\t15.7\t2.7\t22293\t88778\t0.5153\t52216\tObama\t52216\t0.002626298\t52216.0\n6640\t-93.19894599999999\t43.1514\tMason City\tIA\tIowa\tCerro Gordo County\t27699\t39.4\t23.4\t9.7\t25500\t99049\t0.5589\t50401\tObama\t50401\t0.069947912\t50401.0\n6641\t-93.087223\t43.207029999999996\tRock Falls city\tIA\tIowa\tCerro Gordo County\t174\t45.9\t7.8\t11.2\t21236\t87000\t0.5589\t50464\tObama\t50464\t0.0004394\t50464.0\n6642\t-93.123245\t43.246434\tPlymouth city\tIA\tIowa\tCerro Gordo County\t439\t45.8\t8.0\t10.9\t21236\t89091\t0.5589\t50464\tObama\t50464\t0.001108601\t50464.0\n6643\t-93.187003\t42.980022999999996\tRockwell city\tIA\tIowa\tCerro Gordo County\t930\t44.5\t11.3\t4.7\t24464\t86786\t0.5589\t50469\tObama\t50469\t0.002348516\t50469.0\n6644\t-93.374236\t43.134268\tClear Lake city\tIA\tIowa\tCerro Gordo County\t7716\t43.3\t26.8\t8.1\t23424\t110795\t0.5589\t50428\tObama\t50428\t0.019485111\t50428.0\n6645\t-93.461354\t43.128407\tVentura city\tIA\tIowa\tCerro Gordo County\t661\t50.1\t32.6\t8.6\t26347\t136111\t0.5589\t50482\tObama\t50482\t0.001669214\t50482.0\n6646\t-93.315223\t42.976551\tSwaledale city\tIA\tIowa\tCerro Gordo County\t173\t40.2\t17.5\t3.9\t20670\t68333\t0.5589\t50477\tObama\t50477\t0.000436875\t50477.0\n6647\t-93.473387\t42.915648\tMeservey city\tIA\tIowa\tCerro Gordo County\t240\t47.1\t18.6\t8.3\t20776\t64444\t0.5589\t50457\tObama\t50457\t0.000606069\t50457.0\n6648\t-93.38709200000001\t42.944224\tThornton city\tIA\tIowa\tCerro Gordo County\t402\t46.9\t18.4\t8.1\t20768\t63462\t0.5589\t50479\tObama\t50479\t0.001015165\t50479.0\n6649\t-93.035803\t42.921969\tDougherty city\tIA\tIowa\tCerro Gordo County\t80\t39.6\t17.3\t4.3\t20558\t65000\t0.5589\t50433\tObama\t50433\t0.000202023\t50433.0\n6650\t-95.807661\t42.824729999999995\tMarcus city\tIA\tIowa\tCherokee County\t943\t47.3\t20.3\t3.7\t22401\t81795\t0.4106\t51035\tObama\t51035\t0.002381345\t51035.0\n6651\t-95.63347399999999\t42.794329\tMeriden city\tIA\tIowa\tCherokee County\t153\t46.3\t12.5\t4.3\t22335\t75000\t0.4106\t51037\tObama\t51037\t0.000386369\t51037.0\n6652\t-95.544673\t42.86163\tLarrabee city\tIA\tIowa\tCherokee County\t138\t47.1\t23.0\t3.3\t23932\t97500\t0.4106\t51029\tObama\t51029\t0.00034849\t51029.0\n6653\t-95.55225300000001\t42.75121\tCherokee city\tIA\tIowa\tCherokee County\t4892\t44.1\t17.3\t6.6\t24009\t76175\t0.4106\t51012\tObama\t51012\t0.012353702\t51012.0\n6654\t-95.719588\t42.575464000000004\tWashta city\tIA\tIowa\tCherokee County\t252\t44.5\t17.1\t4.7\t20756\t83750\t0.4106\t51061\tObama\t51061\t0.000636372\t51061.0\n6655\t-95.436644\t42.713126\tAurelia city\tIA\tIowa\tCherokee County\t901\t47.0\t22.7\t2.4\t20399\t84167\t0.4106\t51005\tObama\t51005\t0.002275283\t51005.0\n6656\t-95.64378599999999\t42.629166999999995\tQuimby city\tIA\tIowa\tCherokee County\t307\t40.5\t18.8\t3.0\t19681\t66667\t0.4106\t51049\tObama\t51049\t0.000775263\t51049.0\n6657\t-95.71422\t42.81183\tCleghorn city\tIA\tIowa\tCherokee County\t207\t45.9\t12.3\t4.7\t22425\t78333\t0.4106\t51014\tObama\t51014\t0.0005227340000000001\t51014.0\n6658\t-92.41535999999999\t43.117293\tNorth Washington city\tIA\tIowa\tChickasaw County\t109\t40.6\t6.9\t4.8\t19964\t77500\t0.5481\t50603\tObama\t50603\t0.000275256\t50603.0\n6659\t-92.458439\t43.035962\tIonia city\tIA\tIowa\tChickasaw County\t261\t42.6\t4.5\t5.7\t21244\t95000\t0.5481\t50645\tObama\t50645\t0.0006591\t50645.0\n6660\t-92.538703\t42.950375\tNashua city\tIA\tIowa\tChickasaw County\t1781\t44.0\t16.4\t4.4\t21046\t83000\t0.5481\t50658\tObama\t50658\t0.004497535\t50658.0\n6661\t-92.51571899999999\t43.062007\tBassett city\tIA\tIowa\tChickasaw County\t69\t41.7\t14.6\t2.6\t17604\t115000\t0.5481\t50645\tObama\t50645\t0.000174245\t50645.0\n6662\t-92.417014\t43.19677\tAlta Vista city\tIA\tIowa\tChickasaw County\t264\t39.8\t7.3\t4.7\t19973\t80000\t0.5481\t50603\tObama\t50603\t0.000666676\t50603.0\n6663\t-92.15348\t43.071728\tLawler city\tIA\tIowa\tChickasaw County\t428\t47.2\t14.1\t6.6\t20195\t90000\t0.5481\t52154\tObama\t52154\t0.001080823\t52154.0\n6664\t-92.316637\t43.059252\tNew Hampton city\tIA\tIowa\tChickasaw County\t3332\t44.2\t20.2\t6.4\t24571\t106552\t0.5481\t50659\tObama\t50659\t0.008414255\t50659.0\n6665\t-92.19629\t42.964655\tFredericksburg city\tIA\tIowa\tChickasaw County\t955\t42.9\t13.0\t1.7\t22042\t90435\t0.5481\t50630\tObama\t50630\t0.002411649\t50630.0\n6666\t-93.77783199999999\t41.032765000000005\tOsceola city\tIA\tIowa\tClarke County\t4570\t40.6\t17.7\t9.4\t21940\t86381\t0.4941\t50213\tObama\t50213\t0.011540558999999999\t50213.0\n6667\t-93.596293\t41.010847\tWoodburn city\tIA\tIowa\tClarke County\t253\t41.6\t5.3\t10.1\t19392\t100000\t0.4941\t50275\tObama\t50275\t0.0006388969999999999\t50275.0\n6668\t-93.94880500000001\t41.041274\tMurray city\tIA\tIowa\tClarke County\t809\t39.9\t6.8\t7.8\t18287\t73667\t0.4941\t50174\tObama\t50174\t0.002042957\t50174.0\n6669\t-95.14624599999999\t43.016932000000004\tGreenville city\tIA\tIowa\tClay County\t100\t43.4\t22.9\t3.8\t25495\t65000\t0.3981\t51343\tObama\t51343\t0.00025252900000000003\t51343.0\n6670\t-95.151767\t43.146198999999996\tSpencer city\tIA\tIowa\tClay County\t11087\t39.9\t19.9\t7.4\t24116\t107399\t0.3981\t51301\tObama\t51301\t0.027997852\t51301.0\n6671\t-95.28393\t43.064353999999994\tRoyal city\tIA\tIowa\tClay County\t444\t40.6\t13.2\t4.2\t22562\t75263\t0.3981\t51357\tObama\t51357\t0.001121227\t51357.0\n6672\t-95.188467\t43.013502\tRossie city\tIA\tIowa\tClay County\t54\t40.6\t13.5\t3.2\t22448\t75000\t0.3981\t51343\tObama\t51343\t0.000136365\t51343.0\n6673\t-95.02226\t43.133905\tDickens city\tIA\tIowa\tClay County\t184\t42.9\t11.2\t8.2\t18943\t60000\t0.3981\t51333\tObama\t51333\t0.00046465300000000004\t51333.0\n6674\t-95.036337\t43.015724\tGillett Grove city\tIA\tIowa\tClay County\t59\t45.0\t21.4\t3.2\t25550\t60000\t0.3981\t51341\tObama\t51341\t0.000148992\t51341.0\n6675\t-95.15586400000001\t43.241819\tFostoria city\tIA\tIowa\tClay County\t224\t40.0\t17.0\t9.0\t21641\t97857\t0.3981\t51351\tObama\t51351\t0.000565664\t51351.0\n6676\t-95.32000500000001\t43.161792999999996\tEverly city\tIA\tIowa\tClay County\t596\t42.6\t21.0\t5.1\t22728\t81667\t0.3981\t51338\tObama\t51338\t0.001505071\t51338.0\n6677\t-95.013111\t42.949807\tWebb city\tIA\tIowa\tClay County\t151\t43.0\t11.7\t7.9\t18850\t60000\t0.3981\t51366\tObama\t51366\t0.000381318\t51366.0\n6678\t-95.34114\t42.918851000000004\tPeterson city\tIA\tIowa\tClay County\t358\t48.4\t18.0\t5.9\t20249\t63333\t0.3981\t51047\tObama\t51047\t0.000904053\t51047.0\n6679\t-91.261931\t42.744434999999996\tGarber city\tIA\tIowa\tClayton County\t110\t40.5\t6.8\t8.9\t24416\t85000\t0.5259\t52048\tObama\t52048\t0.000277782\t52048.0\n6680\t-91.367075\t42.958875\tFarmersburg city\tIA\tIowa\tClayton County\t308\t40.4\t7.2\t4.8\t19532\t86333\t0.5259\t52047\tObama\t52047\t0.0007777880000000001\t52047.0\n6681\t-91.275318\t42.740403\tElkport city\tIA\tIowa\tClayton County\t94\t41.1\t7.9\t10.4\t24415\t87500\t0.5259\t52048\tObama\t52048\t0.00023737700000000001\t52048.0\n6682\t-91.387897\t42.926815999999995\tSt. Olaf city\tIA\tIowa\tClayton County\t135\t40.6\t12.5\t6.3\t19756\t104688\t0.5259\t52072\tObama\t52072\t0.000340914\t52072.0\n6683\t-90.957288\t42.680327\tNorth Buena Vista city\tIA\tIowa\tClayton County\t120\t40.6\t4.9\t11.3\t19329\t101042\t0.5259\t52066\tObama\t52066\t0.00030303400000000004\t52066.0\n6684\t-91.149939\t42.902798\tClayton city\tIA\tIowa\tClayton County\t51\t48.8\t16.2\t6.9\t19398\t90000\t0.5259\t52049\tObama\t52049\t0.00012879\t52049.0\n6685\t-91.10588299999999\t42.788958\tGuttenberg city\tIA\tIowa\tClayton County\t1849\t47.0\t14.0\t7.9\t20457\t107914\t0.5259\t52052\tObama\t52052\t0.004669255\t52052.0\n6686\t-91.369274\t42.753496000000005\tLittleport city\tIA\tIowa\tClayton County\t26\t35.0\t22.2\t7.1\t16077\t106250\t0.5259\t52044\tObama\t52044\t6.57e-05\t52044.0\n6687\t-91.186637\t43.042840999999996\tMarquette city\tIA\tIowa\tClayton County\t459\t41.0\t12.9\t10.5\t20882\t85714\t0.5259\t52158\tObama\t52158\t0.001159107\t52158.0\n6688\t-91.455732\t43.05948\tLuana city\tIA\tIowa\tClayton County\t247\t39.6\t11.1\t8.7\t17697\t111719\t0.5259\t52156\tObama\t52156\t0.000623746\t52156.0\n6689\t-91.391154\t43.051435999999995\tMonona city\tIA\tIowa\tClayton County\t1479\t42.8\t14.2\t7.3\t20809\t88879\t0.5259\t52159\tObama\t52159\t0.0037348990000000003\t52159.0\n6690\t-91.542283\t42.802631\tVolga city\tIA\tIowa\tClayton County\t246\t41.0\t18.8\t6.7\t16133\t103571\t0.5259\t52077\tObama\t52077\t0.00062122\t52077.0\n6691\t-91.40171600000001\t42.648143\tEdgewood city\tIA\tIowa\tClayton County\t934\t43.6\t7.1\t4.1\t20331\t100794\t0.5259\t52042\tObama\t52042\t0.002358618\t52042.0\n6692\t-91.182337\t43.024409000000006\tMcGregor city\tIA\tIowa\tClayton County\t817\t45.4\t15.3\t7.4\t20134\t90000\t0.5259\t52158\tObama\t52158\t0.0020631589999999997\t52158.0\n6693\t-91.23616700000001\t42.867421\tGarnavillo city\tIA\tIowa\tClayton County\t709\t48.5\t14.8\t6.0\t22480\t87857\t0.5259\t52049\tObama\t52049\t0.001790428\t52049.0\n6694\t-91.15815400000001\t42.731567\tOsterdock city\tIA\tIowa\tClayton County\t46\t35.8\t6.5\t7.7\t17682\t100000\t0.5259\t52052\tObama\t52052\t0.00011616299999999999\t52052.0\n6695\t-91.076427\t42.703632\tMillville city\tIA\tIowa\tClayton County\t22\t37.5\t0.0\t7.7\t19557\t106250\t0.5259\t52052\tObama\t52052\t5.56e-05\t52052.0\n6696\t-91.402375\t42.85759\tElkader city\tIA\tIowa\tClayton County\t1379\t49.3\t19.8\t4.3\t23621\t92174\t0.5259\t52043\tObama\t52043\t0.00348237\t52043.0\n6697\t-91.535133\t42.681205\tStrawberry Point city\tIA\tIowa\tClayton County\t1366\t41.3\t14.5\t3.3\t19448\t92051\t0.5259\t52076\tObama\t52076\t0.003449541\t52076.0\n6698\t-90.354254\t41.80234\tLow Moor city\tIA\tIowa\tClinton County\t233\t46.0\t12.1\t6.7\t26363\t100000\t0.6056\t52757\tObama\t52757\t0.000588392\t52757.0\n6699\t-90.46820500000001\t41.962145\tCharlotte city\tIA\tIowa\tClinton County\t424\t41.8\t12.8\t4.4\t19669\t110526\t0.6056\t52731\tObama\t52731\t0.001070721\t52731.0\n6700\t-90.597931\t41.912245\tWelton city\tIA\tIowa\tClinton County\t161\t42.7\t18.8\t10.2\t18111\t107813\t0.6056\t52774\tObama\t52774\t0.000406571\t52774.0\n6701\t-90.38161099999999\t41.967855\tGoose Lake city\tIA\tIowa\tClinton County\t249\t37.2\t10.8\t3.9\t20295\t119792\t0.6056\t52750\tObama\t52750\t0.0006287959999999999\t52750.0\n6702\t-90.862861\t41.9029\tToronto city\tIA\tIowa\tClinton County\t132\t43.9\t8.6\t3.5\t20227\t98333\t0.6056\t52777\tObama\t52777\t0.000333338\t52777.0\n6703\t-90.240961\t41.843488\tClinton city\tIA\tIowa\tClinton County\t26769\t40.1\t17.7\t10.0\t22114\t82516\t0.6056\t52732\tObama\t52732\t0.067599395\t52732.0\n6704\t-90.81685\t41.966502\tLost Nation city\tIA\tIowa\tClinton County\t503\t38.8\t7.5\t9.4\t17830\t78846\t0.6056\t52254\tObama\t52254\t0.001270219\t52254.0\n6705\t-90.252937\t41.979895\tAndover city\tIA\tIowa\tClinton County\t85\t45.7\t16.4\t6.4\t20450\t140000\t0.6056\t52701\tObama\t52701\t0.00021464900000000002\t52701.0\n6706\t-90.76004300000001\t41.826577\tCalamus city\tIA\tIowa\tClinton County\t389\t41.2\t17.1\t7.5\t19218\t104268\t0.6056\t52729\tObama\t52729\t0.000982336\t52729.0\n6707\t-90.276646\t41.792806\tCamanche city\tIA\tIowa\tClinton County\t4207\t43.5\t12.4\t10.2\t26504\t105578\t0.6056\t52730\tObama\t52730\t0.01062388\t52730.0\n6708\t-90.608003\t41.998681\tDelmar city\tIA\tIowa\tClinton County\t555\t39.5\t15.0\t7.1\t19615\t102557\t0.6056\t52037\tObama\t52037\t0.0014015339999999999\t52037.0\n6709\t-90.837711\t41.833279\tWheatland city\tIA\tIowa\tClinton County\t787\t41.5\t12.2\t5.7\t19480\t87188\t0.6056\t52777\tObama\t52777\t0.001987401\t52777.0\n6710\t-90.545969\t41.822051\tDe Witt city\tIA\tIowa\tClinton County\t5052\t38.4\t24.0\t4.8\t26513\t123779\t0.6056\t52742\tObama\t52742\t0.012757748000000001\t52742.0\n6711\t-90.650184\t41.823184999999995\tGrand Mound city\tIA\tIowa\tClinton County\t700\t39.2\t13.7\t5.8\t20669\t117241\t0.6056\t52751\tObama\t52751\t0.001767701\t52751.0\n6712\t-95.58918800000001\t42.068265999999994\tCharter Oak city\tIA\tIowa\tCrawford County\t512\t44.2\t16.0\t3.5\t17970\t55000\t0.4541\t51439\tObama\t51439\t0.001292947\t51439.0\n6713\t-95.46231800000001\t41.948153000000005\tArion city\tIA\tIowa\tCrawford County\t140\t42.5\t8.5\t7.0\t16414\t98333\t0.4541\t51520\tObama\t51520\t0.00035354\t51520.0\n6714\t-95.101535\t42.075728000000005\tWestside city\tIA\tIowa\tCrawford County\t312\t44.0\t12.7\t2.7\t17151\t80769\t0.4541\t51467\tObama\t51467\t0.000787889\t51467.0\n6715\t-95.352204\t42.015144\tDenison city\tIA\tIowa\tCrawford County\t7316\t36.9\t18.1\t5.6\t20427\t101852\t0.4541\t51442\tObama\t51442\t0.018474996\t51442.0\n6716\t-95.435229\t42.160699\tSchleswig city\tIA\tIowa\tCrawford County\t822\t45.7\t9.5\t4.3\t21332\t66765\t0.4541\t51461\tObama\t51461\t0.002075786\t51461.0\n6717\t-95.574914\t42.128103\tRicketts city\tIA\tIowa\tCrawford County\t135\t39.8\t13.0\t1.3\t20319\t73333\t0.4541\t51439\tObama\t51439\t0.000340914\t51439.0\n6718\t-95.13505\t41.91194\tAspinwall city\tIA\tIowa\tCrawford County\t55\t42.5\t17.1\t6.1\t17811\t85000\t0.4541\t51455\tObama\t51455\t0.000138891\t51455.0\n6719\t-95.317562\t42.097202\tDeloit city\tIA\tIowa\tCrawford County\t279\t42.1\t8.5\t4.0\t18562\t79000\t0.4541\t51441\tObama\t51441\t0.000704555\t51441.0\n6720\t-95.494361\t41.927995\tDow City\tIA\tIowa\tCrawford County\t496\t45.6\t13.2\t6.1\t16918\t61750\t0.4541\t51528\tObama\t51528\t0.001252542\t51528.0\n6721\t-95.395129\t41.917856\tBuck Grove city\tIA\tIowa\tCrawford County\t46\t41.3\t16.1\t3.7\t18005\t85000\t0.4541\t51520\tObama\t51520\t0.00011616299999999999\t51520.0\n6722\t-95.235031\t41.889259\tManilla city\tIA\tIowa\tCrawford County\t813\t44.7\t11.4\t4.6\t19369\t52750\t0.4541\t51454\tObama\t51454\t0.002053058\t51454.0\n6723\t-95.32735\t42.194181\tKiron city\tIA\tIowa\tCrawford County\t271\t44.2\t13.6\t2.7\t16857\t75625\t0.4541\t51448\tObama\t51448\t0.0006843530000000001\t51448.0\n6724\t-95.20040300000001\t42.059823\tVail city\tIA\tIowa\tCrawford County\t431\t43.7\t12.3\t2.3\t17161\t79167\t0.4541\t51465\tObama\t51465\t0.001088398\t51465.0\n6725\t-93.980498\t41.685788\tDallas Center city\tIA\tIowa\tDallas County\t1805\t43.2\t23.1\t5.9\t24551\t156132\t0.4349\t50063\tObama\t50063\t0.004558142\t50063.0\n6726\t-94.010414\t41.851309\tBouton city\tIA\tIowa\tDallas County\t147\t45.0\t12.4\t7.7\t22668\t103571\t0.4349\t50039\tObama\t50039\t0.00037121699999999997\t50039.0\n6727\t-94.269903\t41.642623\tLinden city\tIA\tIowa\tDallas County\t238\t41.4\t12.9\t2.3\t21742\t105000\t0.4349\t50146\tObama\t50146\t0.000601018\t50146.0\n6728\t-94.099519\t41.841488\tPerry city\tIA\tIowa\tDallas County\t7774\t37.3\t11.9\t11.1\t20678\t101354\t0.4349\t50220\tObama\t50220\t0.019631578\t50220.0\n6729\t-94.220874\t41.842377\tDawson city\tIA\tIowa\tDallas County\t206\t45.7\t10.1\t3.6\t26681\t101786\t0.4349\t50066\tObama\t50066\t0.000520209\t50066.0\n6730\t-94.196087\t41.590483\tRedfield city\tIA\tIowa\tDallas County\t1088\t42.8\t11.0\t9.4\t19609\t76333\t0.4349\t50233\tObama\t50233\t0.002747512\t50233.0\n6731\t-93.82248100000001\t41.760181\tGranger city\tIA\tIowa\tDallas County\t691\t42.8\t19.4\t5.1\t24802\t142361\t0.4349\t50109\tObama\t50109\t0.001744973\t50109.0\n6732\t-94.009366\t41.536192\tDe Soto city\tIA\tIowa\tDallas County\t1334\t36.8\t16.3\t5.4\t23875\t80833\t0.4349\t50069\tObama\t50069\t0.003368732\t50069.0\n6733\t-93.865391\t41.614376\tWaukee city\tIA\tIowa\tDallas County\t9645\t33.0\t37.2\t6.5\t32307\t193185\t0.4349\t50263\tObama\t50263\t0.024356389\t50263.0\n6734\t-94.2277\t41.515453\tDexter city\tIA\tIowa\tDallas County\t912\t36.7\t16.6\t8.6\t21092\t94375\t0.4349\t50070\tObama\t50070\t0.002303061\t50070.0\n6735\t-94.02591600000001\t41.611548\tAdel city\tIA\tIowa\tDallas County\t3791\t39.5\t21.7\t8.2\t24116\t126637\t0.4349\t50003\tObama\t50003\t0.009573360999999999\t50003.0\n6736\t-93.921846\t41.856628\tWoodward city\tIA\tIowa\tDallas County\t1188\t38.7\t16.8\t9.8\t21118\t97069\t0.4349\t50276\tObama\t50276\t0.00300004\t50276.0\n6737\t-94.028207\t41.757976\tMinburn city\tIA\tIowa\tDallas County\t436\t43.2\t16.4\t6.4\t22987\t122115\t0.4349\t50167\tObama\t50167\t0.001101025\t50167.0\n6738\t-93.956731\t41.530179\tVan Meter city\tIA\tIowa\tDallas County\t1013\t39.0\t20.9\t8.6\t24611\t94583\t0.4349\t50261\tObama\t50261\t0.002558115\t50261.0\n6739\t-92.332274\t40.863935\tFloris city\tIA\tIowa\tDavis County\t155\t43.9\t10.9\t5.6\t19631\t100000\t0.4029\t52560\tObama\t52560\t0.000391419\t52560.0\n6740\t-92.481385\t40.798404\tDrakesville city\tIA\tIowa\tDavis County\t188\t42.1\t15.1\t8.6\t17920\t85000\t0.4029\t52537\tObama\t52537\t0.00047475400000000003\t52537.0\n6741\t-92.417441\t40.748956\tBloomfield city\tIA\tIowa\tDavis County\t2583\t41.6\t16.8\t10.3\t19534\t81268\t0.4029\t52537\tObama\t52537\t0.006522815\t52537.0\n6742\t-92.27405\t40.694743\tPulaski city\tIA\tIowa\tDavis County\t247\t40.6\t13.2\t6.0\t16436\t89000\t0.4029\t52584\tObama\t52584\t0.000623746\t52584.0\n6743\t-93.963089\t40.818751\tGrand River city\tIA\tIowa\tDecatur County\t228\t40.5\t8.6\t11.8\t15799\t65833\t0.4673\t50108\tObama\t50108\t0.000575765\t50108.0\n6744\t-93.735463\t40.89736\tWeldon city\tIA\tIowa\tDecatur County\t146\t43.6\t5.8\t5.8\t21363\t57500\t0.4673\t50264\tObama\t50264\t0.00036869199999999995\t50264.0\n6745\t-93.832684\t40.742323\tDecatur City\tIA\tIowa\tDecatur County\t202\t40.0\t9.0\t11.2\t15768\t61000\t0.4673\t50067\tObama\t50067\t0.000510108\t50067.0\n6746\t-93.812585\t40.640192\tDavis City\tIA\tIowa\tDecatur County\t277\t41.3\t7.6\t9.4\t14183\t60833\t0.4673\t50065\tObama\t50065\t0.000699504\t50065.0\n6747\t-93.935571\t40.620135999999995\tLamoni city\tIA\tIowa\tDecatur County\t2462\t25.8\t31.8\t5.5\t19981\t94615\t0.4673\t50140\tObama\t50140\t0.006217255\t50140.0\n6748\t-93.592471\t40.878363\tLe Roy city\tIA\tIowa\tDecatur County\t12\t46.3\t10.0\t0.0\t17404\t112500\t0.4673\t50103\tObama\t50103\t3.0299999999999998e-05\t50103.0\n6749\t-93.60728399999999\t40.826609000000005\tGarden Grove city\tIA\tIowa\tDecatur County\t232\t42.9\t9.4\t9.0\t17325\t76250\t0.4673\t50103\tObama\t50103\t0.000585866\t50103.0\n6750\t-93.75444300000001\t40.740683000000004\tLeon city\tIA\tIowa\tDecatur County\t1754\t41.6\t13.6\t7.8\t17033\t61176\t0.4673\t50144\tObama\t50144\t0.004429353\t50144.0\n6751\t-93.74299\t40.582454\tPleasanton city\tIA\tIowa\tDecatur County\t37\t40.0\t8.3\t12.5\t14291\t60000\t0.4673\t50065\tObama\t50065\t9.340000000000001e-05\t50065.0\n6752\t-93.791848\t40.871025\tVan Wert city\tIA\tIowa\tDecatur County\t232\t43.0\t6.1\t6.3\t21413\t60000\t0.4673\t50262\tObama\t50262\t0.000585866\t50262.0\n6753\t-91.330623\t42.430258\tDelhi city\tIA\tIowa\tDelaware County\t445\t45.1\t13.0\t5.2\t20948\t114375\t0.4922\t52223\tObama\t52223\t0.0011237530000000001\t52223.0\n6754\t-91.339108\t42.471272\tDelaware city\tIA\tIowa\tDelaware County\t168\t38.6\t8.8\t4.9\t16565\t92500\t0.4922\t52036\tObama\t52036\t0.000424248\t52036.0\n6755\t-91.484936\t42.352574\tRyan city\tIA\tIowa\tDelaware County\t387\t38.2\t10.8\t4.4\t16758\t112838\t0.4922\t52330\tObama\t52330\t0.000977286\t52330.0\n6756\t-91.270143\t42.482734\tEarlville city\tIA\tIowa\tDelaware County\t803\t38.8\t8.7\t5.3\t16589\t94063\t0.4922\t52041\tObama\t52041\t0.002027805\t52041.0\n6757\t-91.45642\t42.485948\tManchester city\tIA\tIowa\tDelaware County\t4957\t39.4\t18.7\t8.3\t22476\t98667\t0.4922\t52057\tObama\t52057\t0.012517845\t52057.0\n6758\t-91.201022\t42.638796\tColesburg city\tIA\tIowa\tDelaware County\t377\t41.6\t9.8\t5.4\t19580\t91667\t0.4922\t52035\tObama\t52035\t0.000952033\t52035.0\n6759\t-91.24887199999999\t42.343111\tHopkinton city\tIA\tIowa\tDelaware County\t674\t38.3\t6.0\t6.5\t18770\t92381\t0.4922\t52237\tObama\t52237\t0.0017020429999999999\t52237.0\n6760\t-91.341488\t42.585063\tGreeley city\tIA\tIowa\tDelaware County\t251\t39.9\t8.1\t6.8\t17426\t84167\t0.4922\t52050\tObama\t52050\t0.000633847\t52050.0\n6761\t-91.591472\t42.479811\tMasonville city\tIA\tIowa\tDelaware County\t106\t41.3\t9.6\t5.7\t20894\t112500\t0.4922\t50654\tObama\t50654\t0.00026768\t50654.0\n6762\t-91.54665899999999\t42.579807\tDundee city\tIA\tIowa\tDelaware County\t183\t40.8\t8.9\t5.0\t20835\t114423\t0.4922\t52038\tObama\t52038\t0.00046212699999999995\t52038.0\n6763\t-91.12398\t40.807308\tBurlington city\tIA\tIowa\tDes Moines County\t25456\t39.4\t18.6\t10.1\t23301\t85727\t0.5832\t52601\tObama\t52601\t0.064283694\t52601.0\n6764\t-91.16378\t41.0079\tMediapolis city\tIA\tIowa\tDes Moines County\t1579\t42.8\t17.2\t8.7\t21459\t100917\t0.5832\t52637\tObama\t52637\t0.003987427\t52637.0\n6765\t-91.31459\t40.860058\tDanville city\tIA\tIowa\tDes Moines County\t869\t42.5\t18.6\t5.9\t23267\t105263\t0.5832\t52623\tObama\t52623\t0.002194474\t52623.0\n6766\t-91.26219\t40.827353\tMiddletown city\tIA\tIowa\tDes Moines County\t541\t40.0\t12.6\t8.0\t20793\t97778\t0.5832\t52638\tObama\t52638\t0.00136618\t52638.0\n6767\t-91.17645999999999\t40.822025\tWest Burlington city\tIA\tIowa\tDes Moines County\t3174\t42.4\t19.1\t7.8\t28486\t87568\t0.5832\t52655\tObama\t52655\t0.008015259\t52655.0\n6768\t-94.968978\t43.305896999999995\tTerril city\tIA\tIowa\tDickinson County\t455\t42.7\t18.7\t5.6\t22301\t76667\t0.4031\t51364\tObama\t51364\t0.001149005\t51364.0\n6769\t-95.154862\t43.334131\tMilford city\tIA\tIowa\tDickinson County\t2548\t40.9\t18.8\t5.8\t22765\t97389\t0.4031\t51351\tObama\t51351\t0.00643443\t51351.0\n6770\t-95.131763\t43.360859999999995\tArnolds Park city\tIA\tIowa\tDickinson County\t1271\t43.4\t20.1\t8.1\t25185\t106985\t0.4031\t51331\tObama\t51331\t0.0032096390000000002\t51331.0\n6771\t-94.946945\t43.433510999999996\tSuperior city\tIA\tIowa\tDickinson County\t154\t53.2\t25.8\t8.0\t27401\t145833\t0.4031\t51363\tObama\t51363\t0.00038889400000000003\t51363.0\n6772\t-95.16323299999999\t43.349455\tWest Okoboji city\tIA\tIowa\tDickinson County\t489\t54.1\t23.7\t6.1\t34663\t150833\t0.4031\t51351\tObama\t51351\t0.001234865\t51351.0\n6773\t-95.140261\t43.390701\tOkoboji city\tIA\tIowa\tDickinson County\t529\t52.4\t40.0\t2.7\t31448\t176389\t0.4031\t51355\tObama\t51355\t0.001335877\t51355.0\n6774\t-95.323488\t43.447993\tLake Park city\tIA\tIowa\tDickinson County\t1071\t46.3\t20.5\t7.1\t24439\t79697\t0.4031\t51347\tObama\t51347\t0.002704582\t51347.0\n6775\t-95.109718\t43.421095\tSpirit Lake city\tIA\tIowa\tDickinson County\t4811\t42.1\t24.5\t5.6\t24190\t116482\t0.4031\t51360\tObama\t51360\t0.012149153999999999\t51360.0\n6776\t-95.11699399999999\t43.453028\tOrleans city\tIA\tIowa\tDickinson County\t629\t53.1\t25.8\t7.9\t27450\t146983\t0.4031\t51360\tObama\t51360\t0.001588405\t51360.0\n6777\t-95.174181\t43.374158\tWahpeton city\tIA\tIowa\tDickinson County\t529\t61.1\t28.9\t3.8\t44904\t213636\t0.4031\t51355\tObama\t51355\t0.001335877\t51355.0\n6778\t-90.933183\t42.446583000000004\tEpworth city\tIA\tIowa\tDubuque County\t1813\t36.1\t20.1\t4.6\t20107\t120431\t0.5653\t52045\tObama\t52045\t0.004578344\t52045.0\n6779\t-90.77467\t42.560977\tDurango city\tIA\tIowa\tDubuque County\t26\t36.3\t16.7\t0.0\t23401\t187500\t0.5653\t52002\tObama\t52002\t6.57e-05\t52002.0\n6780\t-91.007127\t42.301189\tCascade city\tIA\tIowa\tDubuque County\t2120\t37.0\t18.2\t5.9\t20794\t116875\t0.5653\t52033\tObama\t52033\t0.005353607\t52033.0\n6781\t-90.836203\t42.471736\tCentralia city\tIA\tIowa\tDubuque County\t123\t36.9\t35.5\t3.1\t26652\t200000\t0.5653\t52068\tObama\t52068\t0.00031061\t52068.0\n6782\t-91.113571\t42.482087\tDyersville city\tIA\tIowa\tDubuque County\t4155\t37.3\t16.4\t4.9\t23013\t135426\t0.5653\t52040\tObama\t52040\t0.010492566000000002\t52040.0\n6783\t-90.849024\t42.447345\tPeosta city\tIA\tIowa\tDubuque County\t991\t37.3\t35.6\t2.7\t26642\t198547\t0.5653\t52068\tObama\t52068\t0.002502559\t52068.0\n6784\t-90.96214\t42.509188\tBankston city\tIA\tIowa\tDubuque County\t31\t35.0\t20.0\t5.6\t25796\t212500\t0.5653\t52045\tObama\t52045\t7.829999999999999e-05\t52045.0\n6785\t-90.87461\t42.58117\tRickardsville city\tIA\tIowa\tDubuque County\t210\t39.4\t18.9\t3.4\t26747\t144643\t0.5653\t52039\tObama\t52039\t0.00053031\t52039.0\n6786\t-91.118955\t42.396905\tWorthington city\tIA\tIowa\tDubuque County\t427\t39.8\t7.8\t3.0\t17981\t119792\t0.5653\t52078\tObama\t52078\t0.001078297\t52078.0\n6787\t-90.86940600000001\t42.637778000000004\tBalltown city\tIA\tIowa\tDubuque County\t80\t39.4\t19.2\t2.3\t26840\t150000\t0.5653\t52073\tObama\t52073\t0.000202023\t52073.0\n6788\t-90.831225\t42.312798\tBernard city\tIA\tIowa\tDubuque County\t109\t40.4\t8.3\t3.3\t24616\t141667\t0.5653\t52032\tObama\t52032\t0.000275256\t52032.0\n6789\t-90.697787\t42.502447\tDubuque city\tIA\tIowa\tDubuque County\t57686\t38.8\t27.8\t6.9\t24865\t122288\t0.5653\t52001\tObama\t52001\t0.145673679\t52001.0\n6790\t-91.113896\t42.547717\tNew Vienna city\tIA\tIowa\tDubuque County\t405\t39.6\t9.1\t7.1\t21337\t133333\t0.5653\t52065\tObama\t52065\t0.001022741\t52065.0\n6791\t-90.78403\t42.603464\tSherrill city\tIA\tIowa\tDubuque County\t202\t40.6\t16.9\t1.9\t22578\t154167\t0.5653\t52073\tObama\t52073\t0.000510108\t52073.0\n6792\t-91.007187\t42.44328\tFarley city\tIA\tIowa\tDubuque County\t1417\t35.8\t11.3\t5.1\t20530\t122959\t0.5653\t52046\tObama\t52046\t0.0035783309999999997\t52046.0\n6793\t-90.687347\t42.297653000000004\tZwingle city\tIA\tIowa\tDubuque County\t106\t40.0\t10.1\t3.6\t22139\t137500\t0.5653\t52079\tObama\t52079\t0.00026768\t52079.0\n6794\t-90.77460400000001\t42.511790000000005\tAsbury city\tIA\tIowa\tDubuque County\t3584\t37.2\t32.2\t3.7\t25645\t180060\t0.5653\t52002\tObama\t52002\t0.009050627\t52002.0\n6795\t-90.995853\t42.600395\tHoly Cross city\tIA\tIowa\tDubuque County\t352\t38.6\t14.4\t6.6\t17932\t144643\t0.5653\t52053\tObama\t52053\t0.0008889010000000001\t52053.0\n6796\t-90.702047\t42.548281\tSageville city\tIA\tIowa\tDubuque County\t214\t39.2\t23.0\t3.5\t25341\t165833\t0.5653\t52001\tObama\t52001\t0.000540411\t52001.0\n6797\t-90.872961\t42.494316999999995\tGraf city\tIA\tIowa\tDubuque County\t76\t36.3\t24.0\t7.0\t25523\t193750\t0.5653\t52039\tObama\t52039\t0.000191922\t52039.0\n6798\t-91.072445\t42.603895\tLuxemburg city\tIA\tIowa\tDubuque County\t255\t38.6\t15.0\t6.9\t17969\t148750\t0.5653\t52056\tObama\t52056\t0.000643948\t52056.0\n6799\t-94.83334599999999\t43.399499\tEstherville city\tIA\tIowa\tEmmet County\t6334\t39.6\t13.2\t9.2\t22106\t80422\t0.4478\t51334\tObama\t51334\t0.015995165\t51334.0\n6800\t-94.703594\t43.393137\tGruver city\tIA\tIowa\tEmmet County\t108\t38.3\t13.0\t8.6\t21574\t97500\t0.4478\t51344\tObama\t51344\t0.00027273099999999996\t51344.0\n6801\t-94.506747\t43.294940000000004\tRingsted city\tIA\tIowa\tEmmet County\t422\t46.4\t13.3\t10.9\t19013\t70500\t0.4478\t50578\tObama\t50578\t0.001065671\t50578.0\n6802\t-94.61426800000001\t43.463809999999995\tDolliver city\tIA\tIowa\tEmmet County\t78\t39.0\t14.3\t9.3\t21699\t95000\t0.4478\t50531\tObama\t50531\t0.000196972\t50531.0\n6803\t-94.482475\t43.394224\tArmstrong city\tIA\tIowa\tEmmet County\t894\t48.4\t11.4\t8.9\t23784\t67045\t0.4478\t50514\tObama\t50514\t0.002257606\t50514.0\n6804\t-94.792441\t43.32014\tWallingford city\tIA\tIowa\tEmmet County\t199\t43.2\t11.6\t8.7\t20650\t96250\t0.4478\t51365\tObama\t51365\t0.000502532\t51365.0\n6805\t-91.63514599999999\t42.955421\tElgin city\tIA\tIowa\tFayette County\t679\t45.3\t15.8\t7.6\t19426\t84286\t0.5529999999999999\t52141\tObama\t52141\t0.00171467\t52141.0\n6806\t-91.950459\t42.937729\tHawkeye city\tIA\tIowa\tFayette County\t455\t42.6\t9.7\t6.6\t18398\t82647\t0.5529999999999999\t52147\tObama\t52147\t0.001149005\t52147.0\n6807\t-91.671048\t42.748787\tArlington city\tIA\tIowa\tFayette County\t434\t44.8\t22.4\t5.3\t20938\t55588\t0.5529999999999999\t50606\tObama\t50606\t0.001095974\t50606.0\n6808\t-91.653942\t43.000681\tClermont city\tIA\tIowa\tFayette County\t652\t42.7\t18.0\t7.2\t17667\t97308\t0.5529999999999999\t52135\tObama\t52135\t0.001646487\t52135.0\n6809\t-91.813353\t42.95876\tWest Union city\tIA\tIowa\tFayette County\t2302\t42.3\t20.8\t5.9\t24637\t91143\t0.5529999999999999\t52175\tObama\t52175\t0.00581321\t52175.0\n6810\t-92.034463\t43.056006\tWaucoma city\tIA\tIowa\tFayette County\t265\t42.3\t6.4\t8.3\t20763\t75714\t0.5529999999999999\t52171\tObama\t52171\t0.000669201\t52171.0\n6811\t-91.659515\t42.839463\tWadena city\tIA\tIowa\tFayette County\t221\t42.3\t12.3\t6.6\t20180\t88333\t0.5529999999999999\t52169\tObama\t52169\t0.000558088\t52169.0\n6812\t-91.80386999999999\t42.84156\tFayette city\tIA\tIowa\tFayette County\t1150\t28.0\t24.9\t5.8\t17522\t86053\t0.5529999999999999\t52142\tObama\t52142\t0.00290408\t52142.0\n6813\t-91.88645600000001\t42.863582\tRandalia city\tIA\tIowa\tFayette County\t78\t42.5\t20.0\t8.9\t18973\t90000\t0.5529999999999999\t52164\tObama\t52164\t0.000196972\t52164.0\n6814\t-91.87751\t42.773895\tMaynard city\tIA\tIowa\tFayette County\t462\t42.6\t19.1\t10.3\t23083\t88056\t0.5529999999999999\t50655\tObama\t50655\t0.001166682\t50655.0\n6815\t-91.913229\t42.671458\tOelwein city\tIA\tIowa\tFayette County\t6098\t41.9\t15.1\t12.5\t19451\t74459\t0.5529999999999999\t50662\tObama\t50662\t0.015399197\t50662.0\n6816\t-91.93435500000001\t43.066491\tSt. Lucas city\tIA\tIowa\tFayette County\t159\t45.5\t14.5\t4.8\t21171\t108929\t0.5529999999999999\t52166\tObama\t52166\t0.000401521\t52166.0\n6817\t-91.995644\t42.768251\tWestgate city\tIA\tIowa\tFayette County\t265\t42.2\t15.1\t6.3\t22384\t96429\t0.5529999999999999\t50681\tObama\t50681\t0.000669201\t50681.0\n6818\t-93.00919499999999\t43.148088\tNora Springs city\tIA\tIowa\tFloyd County\t1555\t41.3\t17.2\t6.9\t21540\t93333\t0.5668\t50458\tObama\t50458\t0.003926821\t50458.0\n6819\t-92.90459399999999\t43.126585999999996\tRudd city\tIA\tIowa\tFloyd County\t434\t41.8\t12.6\t0.4\t19938\t72778\t0.5668\t50471\tObama\t50471\t0.001095974\t50471.0\n6820\t-92.591036\t43.157713\tColwell city\tIA\tIowa\tFloyd County\t77\t37.5\t6.3\t12.8\t16456\t92500\t0.5668\t50616\tObama\t50616\t0.00019444700000000002\t50616.0\n6821\t-92.740266\t43.128334\tFloyd city\tIA\tIowa\tFloyd County\t356\t43.9\t20.4\t7.4\t21251\t107500\t0.5668\t50435\tObama\t50435\t0.000899002\t50435.0\n6822\t-92.674461\t43.064614\tCharles City\tIA\tIowa\tFloyd County\t7353\t43.4\t19.5\t7.0\t22425\t89326\t0.5668\t50616\tObama\t50616\t0.018568432\t50616.0\n6823\t-92.868323\t42.964776\tMarble Rock city\tIA\tIowa\tFloyd County\t315\t43.3\t15.4\t7.1\t21435\t101563\t0.5668\t50653\tObama\t50653\t0.000795465\t50653.0\n6824\t-92.94783000000001\t43.052417999999996\tRockford city\tIA\tIowa\tFloyd County\t894\t38.8\t13.9\t7.8\t22904\t81081\t0.5668\t50468\tObama\t50468\t0.002257606\t50468.0\n6825\t-93.427883\t42.593759999999996\tPopejoy city\tIA\tIowa\tFranklin County\t75\t43.8\t25.9\t6.7\t23231\t73333\t0.4369\t50227\tObama\t50227\t0.000189396\t50227.0\n6826\t-93.129818\t42.674843\tGeneva city\tIA\tIowa\tFranklin County\t167\t41.4\t17.1\t4.2\t24234\t56429\t0.4369\t50633\tObama\t50633\t0.00042172300000000004\t50633.0\n6827\t-93.20865699999999\t42.89286\tSheffield city\tIA\tIowa\tFranklin County\t993\t44.7\t13.2\t4.8\t24494\t83372\t0.4369\t50475\tObama\t50475\t0.00250761\t50475.0\n6828\t-93.103925\t42.757732\tHansell city\tIA\tIowa\tFranklin County\t94\t42.1\t16.1\t3.8\t24162\t57500\t0.4369\t50633\tObama\t50633\t0.00023737700000000001\t50633.0\n6829\t-93.370064\t42.733119\tCoulter city\tIA\tIowa\tFranklin County\t253\t42.7\t24.6\t6.0\t23130\t78125\t0.4369\t50431\tObama\t50431\t0.0006388969999999999\t50431.0\n6830\t-93.36569300000001\t42.76372\tLatimer city\tIA\tIowa\tFranklin County\t542\t40.7\t19.8\t8.5\t18821\t83333\t0.4369\t50452\tObama\t50452\t0.001368705\t50452.0\n6831\t-93.204084\t42.742839000000004\tHampton city\tIA\tIowa\tFranklin County\t4114\t43.2\t15.1\t9.8\t22227\t81250\t0.4369\t50441\tObama\t50441\t0.010389029000000001\t50441.0\n6832\t-93.478661\t42.80434\tAlexander city\tIA\tIowa\tFranklin County\t154\t46.0\t17.7\t6.5\t22734\t74000\t0.4369\t50420\tObama\t50420\t0.00038889400000000003\t50420.0\n6833\t-95.644702\t40.746653\tSidney city\tIA\tIowa\tFremont County\t1220\t43.1\t18.4\t9.9\t20866\t90600\t0.4463\t51652\tObama\t51652\t0.00308085\t51652.0\n6834\t-95.67224399999999\t40.902368\tTabor city\tIA\tIowa\tFremont County\t930\t45.6\t16.9\t7.7\t20171\t106860\t0.4463\t51653\tObama\t51653\t0.002348516\t51653.0\n6835\t-95.427563\t40.879011\tImogene city\tIA\tIowa\tFremont County\t64\t43.1\t20.0\t3.1\t25221\t104167\t0.4463\t51645\tObama\t51645\t0.00016161799999999998\t51645.0\n6836\t-95.748816\t40.820221999999994\tThurman city\tIA\tIowa\tFremont County\t224\t42.8\t15.0\t4.3\t22403\t97857\t0.4463\t51654\tObama\t51654\t0.000565664\t51654.0\n6837\t-95.568632\t40.686820000000004\tRiverton city\tIA\tIowa\tFremont County\t280\t44.5\t9.1\t4.3\t19835\t52857\t0.4463\t51650\tObama\t51650\t0.00070708\t51650.0\n6838\t-95.56450600000001\t40.873236\tRandolph city\tIA\tIowa\tFremont County\t204\t43.3\t22.0\t2.9\t25075\t92500\t0.4463\t51649\tObama\t51649\t0.000515158\t51649.0\n6839\t-95.65477800000001\t40.605882\tHamburg city\tIA\tIowa\tFremont County\t1190\t42.6\t14.2\t6.8\t21030\t85000\t0.4463\t51640\tObama\t51640\t0.0030050909999999997\t51640.0\n6840\t-95.48010699999999\t40.719971\tFarragut city\tIA\tIowa\tFremont County\t516\t46.7\t18.8\t8.9\t22611\t80313\t0.4463\t51639\tObama\t51639\t0.001303048\t51639.0\n6841\t-94.237059\t42.03294\tGrand Junction city\tIA\tIowa\tGreene County\t884\t36.9\t10.3\t7.1\t17945\t51167\t0.4901\t50107\tObama\t50107\t0.002232353\t50107.0\n6842\t-94.255095\t42.164183\tPaton city\tIA\tIowa\tGreene County\t232\t40.2\t11.7\t9.2\t21733\t56250\t0.4901\t50217\tObama\t50217\t0.000585866\t50217.0\n6843\t-94.549047\t42.019046\tScranton city\tIA\tIowa\tGreene County\t562\t44.7\t16.9\t10.4\t16982\t72273\t0.4901\t51462\tObama\t51462\t0.001419211\t51462.0\n6844\t-94.200836\t41.934207\tRippey city\tIA\tIowa\tGreene County\t304\t40.7\t21.2\t6.0\t21470\t60714\t0.4901\t50235\tObama\t50235\t0.000767687\t50235.0\n6845\t-94.379074\t42.017251\tJefferson city\tIA\tIowa\tGreene County\t4281\t46.5\t19.2\t4.1\t22948\t84783\t0.4901\t50129\tObama\t50129\t0.010810752\t50129.0\n6846\t-94.238384\t42.107096999999996\tDana city\tIA\tIowa\tGreene County\t74\t40.5\t10.4\t10.5\t21595\t52500\t0.4901\t50064\tObama\t50064\t0.000186871\t50064.0\n6847\t-94.478503\t42.153896\tChurdan city\tIA\tIowa\tGreene County\t387\t48.8\t14.5\t2.3\t20097\t44200\t0.4901\t50050\tObama\t50050\t0.000977286\t50050.0\n6848\t-92.798807\t42.399956\tHolland city\tIA\tIowa\tGrundy County\t240\t43.3\t9.9\t7.8\t20296\t86429\t0.3785\t50642\tObama\t50642\t0.000606069\t50642.0\n6849\t-92.774661\t42.363397\tGrundy Center city\tIA\tIowa\tGrundy County\t2530\t45.3\t20.7\t8.1\t24439\t106137\t0.3785\t50638\tObama\t50638\t0.006388975\t50638.0\n6850\t-92.925137\t42.434073\tWellsburg city\tIA\tIowa\tGrundy County\t741\t47.0\t13.1\t3.5\t18882\t55568\t0.3785\t50680\tObama\t50680\t0.0018712370000000002\t50680.0\n6851\t-92.67318399999999\t42.343202000000005\tMorrison city\tIA\tIowa\tGrundy County\t94\t47.5\t23.5\t7.7\t24720\t100000\t0.3785\t50669\tObama\t50669\t0.00023737700000000001\t50669.0\n6852\t-92.822722\t42.220079999999996\tBeaman city\tIA\tIowa\tGrundy County\t201\t45.6\t17.3\t5.0\t21090\t111458\t0.3785\t50609\tObama\t50609\t0.000507583\t50609.0\n6853\t-92.625792\t42.464104\tDike city\tIA\tIowa\tGrundy County\t1065\t40.6\t25.1\t5.8\t24452\t127394\t0.3785\t50624\tObama\t50624\t0.00268943\t50624.0\n6854\t-92.597669\t42.321619\tReinbeck city\tIA\tIowa\tGrundy County\t1718\t45.3\t22.0\t8.0\t23258\t102778\t0.3785\t50669\tObama\t50669\t0.0043384420000000005\t50669.0\n6855\t-92.874586\t42.223494\tConrad city\tIA\tIowa\tGrundy County\t1104\t42.1\t29.6\t9.0\t26750\t109946\t0.3785\t50621\tObama\t50621\t0.0027879159999999997\t50621.0\n6856\t-92.71176\t42.526811\tStout city\tIA\tIowa\tGrundy County\t216\t40.3\t17.0\t9.2\t21516\t116912\t0.3785\t50673\tObama\t50673\t0.0005454619999999999\t50673.0\n6857\t-94.306976\t41.845237\tJamaica city\tIA\tIowa\tGuthrie County\t228\t45.6\t19.1\t7.0\t24210\t103125\t0.4363\t50128\tObama\t50128\t0.000575765\t50128.0\n6858\t-94.35735\t41.775597999999995\tYale city\tIA\tIowa\tGuthrie County\t279\t49.9\t22.0\t3.6\t26508\t125000\t0.4363\t50277\tObama\t50277\t0.000704555\t50277.0\n6859\t-94.498885\t41.678090000000005\tGuthrie Center city\tIA\tIowa\tGuthrie County\t1579\t46.0\t13.9\t4.0\t23335\t71111\t0.4363\t50115\tObama\t50115\t0.003987427\t50115.0\n6860\t-94.404364\t41.522381\tMenlo city\tIA\tIowa\tGuthrie County\t378\t43.8\t11.2\t12.1\t19691\t80000\t0.4363\t50164\tObama\t50164\t0.000954558\t50164.0\n6861\t-94.430254\t41.846381\tBagley city\tIA\tIowa\tGuthrie County\t341\t45.0\t19.0\t7.0\t24180\t105469\t0.4363\t50026\tObama\t50026\t0.000861123\t50026.0\n6862\t-94.52122800000001\t41.50913\tCasey city\tIA\tIowa\tGuthrie County\t431\t46.0\t11.4\t6.4\t24411\t73000\t0.4363\t50048\tObama\t50048\t0.001088398\t50048.0\n6863\t-94.364003\t41.690995\tPanora city\tIA\tIowa\tGuthrie County\t1232\t43.7\t11.7\t5.8\t21026\t95227\t0.4363\t50216\tObama\t50216\t0.0031111529999999997\t50216.0\n6864\t-94.558024\t41.851932\tBayard city\tIA\tIowa\tGuthrie County\t507\t45.4\t12.2\t7.1\t24204\t71250\t0.4363\t50029\tObama\t50029\t0.00128032\t50029.0\n6865\t-93.603272\t42.237243\tRandall city\tIA\tIowa\tHamilton County\t144\t44.8\t22.8\t7.0\t25055\t118750\t0.4771\t50231\tObama\t50231\t0.000363641\t50231.0\n6866\t-93.81695\t42.463277000000005\tWebster City\tIA\tIowa\tHamilton County\t7692\t40.5\t20.8\t4.8\t25489\t89625\t0.4771\t50595\tObama\t50595\t0.019424504\t50595.0\n6867\t-93.642957\t42.478363\tBlairsburg city\tIA\tIowa\tHamilton County\t224\t45.1\t15.2\t4.1\t20015\t85833\t0.4771\t50034\tObama\t50034\t0.000565664\t50034.0\n6868\t-93.79589399999999\t42.288932\tStanhope city\tIA\tIowa\tHamilton County\t451\t45.6\t20.1\t12.0\t21935\t89643\t0.4771\t50246\tObama\t50246\t0.001138904\t50246.0\n6869\t-93.922431\t42.269144\tStratford city\tIA\tIowa\tHamilton County\t688\t47.5\t13.3\t10.0\t22792\t80385\t0.4771\t50249\tObama\t50249\t0.0017373970000000001\t50249.0\n6870\t-93.581704\t42.310116\tEllsworth city\tIA\tIowa\tHamilton County\t489\t39.1\t24.6\t12.7\t21477\t98000\t0.4771\t50075\tObama\t50075\t0.001234865\t50075.0\n6871\t-93.640068\t42.310507\tJewell Junction city\tIA\tIowa\tHamilton County\t1234\t36.9\t22.0\t8.2\t20276\t106078\t0.4771\t50130\tObama\t50130\t0.003116204\t50130.0\n6872\t-93.72776800000001\t42.389571999999994\tKamrar city\tIA\tIowa\tHamilton County\t218\t45.1\t15.7\t3.4\t20050\t85000\t0.4771\t50132\tObama\t50132\t0.000550512\t50132.0\n6873\t-93.54118299999999\t42.489218\tWilliams city\tIA\tIowa\tHamilton County\t407\t45.1\t15.4\t3.7\t20014\t85714\t0.4771\t50271\tObama\t50271\t0.001027792\t50271.0\n6874\t-93.601323\t43.00975\tKlemme city\tIA\tIowa\tHancock County\t574\t36.5\t12.1\t6.9\t17838\t54722\t0.4255\t50449\tObama\t50449\t0.0014495139999999998\t50449.0\n6875\t-93.793385\t42.934146999999996\tKanawha city\tIA\tIowa\tHancock County\t714\t44.0\t20.7\t4.9\t19192\t52632\t0.4255\t50447\tObama\t50447\t0.001803055\t50447.0\n6876\t-93.91138000000001\t43.230743\tWoden city\tIA\tIowa\tHancock County\t231\t40.9\t18.2\t7.5\t20991\t61250\t0.4255\t50484\tObama\t50484\t0.000583341\t50484.0\n6877\t-93.958761\t42.989317\tCorwith city\tIA\tIowa\tHancock County\t327\t41.8\t12.6\t7.6\t21411\t63000\t0.4255\t50430\tObama\t50430\t0.000825769\t50430.0\n6878\t-93.80323299999999\t43.097021999999996\tBritt city\tIA\tIowa\tHancock County\t1976\t44.0\t13.5\t7.7\t21601\t80183\t0.4255\t50423\tObama\t50423\t0.004989966\t50423.0\n6879\t-93.614068\t42.923738\tGoodell city\tIA\tIowa\tHancock County\t159\t41.7\t16.8\t6.5\t20503\t83750\t0.4255\t50439\tObama\t50439\t0.000401521\t50439.0\n6880\t-93.792711\t43.222978000000005\tCrystal Lake city\tIA\tIowa\tHancock County\t269\t45.3\t17.2\t4.8\t22312\t78889\t0.4255\t50432\tObama\t50432\t0.000679302\t50432.0\n6881\t-93.603186\t43.099375\tGarner city\tIA\tIowa\tHancock County\t2862\t41.6\t21.5\t7.8\t22198\t101735\t0.4255\t50438\tObama\t50438\t0.00722737\t50438.0\n6882\t-93.049604\t42.560829\tAckley city\tIA\tIowa\tHardin County\t1696\t46.5\t18.9\t6.0\t21386\t73393\t0.45799999999999996\t50601\tObama\t50601\t0.004282886\t50601.0\n6883\t-93.06251800000001\t42.243371\tUnion city\tIA\tIowa\tHardin County\t392\t42.2\t18.2\t6.6\t19897\t61111\t0.45799999999999996\t50258\tObama\t50258\t0.000989912\t50258.0\n6884\t-93.009613\t42.262597\tWhitten city\tIA\tIowa\tHardin County\t147\t42.3\t18.4\t6.3\t19880\t61667\t0.45799999999999996\t50269\tObama\t50269\t0.00037121699999999997\t50269.0\n6885\t-93.0665\t42.408144\tSteamboat Rock city\tIA\tIowa\tHardin County\t328\t43.5\t17.8\t6.4\t16637\t73333\t0.45799999999999996\t50672\tObama\t50672\t0.0008282939999999999\t50672.0\n6886\t-93.101339\t42.360622\tEldora city\tIA\tIowa\tHardin County\t2868\t40.9\t18.6\t7.9\t21700\t75676\t0.45799999999999996\t50627\tObama\t50627\t0.0072425219999999995\t50627.0\n6887\t-93.205015\t42.431711\tOwasa city\tIA\tIowa\tHardin County\t37\t45.0\t16.0\t5.3\t16680\t65000\t0.45799999999999996\t50126\tObama\t50126\t9.340000000000001e-05\t50126.0\n6888\t-93.171882\t42.281268\tNew Providence city\tIA\tIowa\tHardin County\t213\t42.2\t23.3\t1.7\t22473\t88889\t0.45799999999999996\t50206\tObama\t50206\t0.000537886\t50206.0\n6889\t-93.26557199999999\t42.520484\tIowa Falls city\tIA\tIowa\tHardin County\t4797\t42.7\t22.7\t8.4\t25105\t88516\t0.45799999999999996\t50126\tObama\t50126\t0.0121138\t50126.0\n6890\t-93.380688\t42.510496\tAlden city\tIA\tIowa\tHardin County\t865\t40.8\t15.3\t5.3\t18928\t79667\t0.45799999999999996\t50006\tObama\t50006\t0.002184373\t50006.0\n6891\t-93.30134\t42.306135999999995\tHubbard city\tIA\tIowa\tHardin County\t821\t46.2\t17.4\t4.3\t22823\t84839\t0.45799999999999996\t50122\tObama\t50122\t0.00207326\t50122.0\n6892\t-93.434433\t42.317692\tRadcliffe city\tIA\tIowa\tHardin County\t596\t43.1\t17.7\t12.1\t25259\t89048\t0.45799999999999996\t50230\tObama\t50230\t0.001505071\t50230.0\n6893\t-93.375902\t42.419472999999996\tBuckeye city\tIA\tIowa\tHardin County\t106\t38.4\t31.0\t4.8\t19012\t87500\t0.45799999999999996\t50006\tObama\t50006\t0.00026768\t50006.0\n6894\t-95.570357\t41.57864\tPersia city\tIA\tIowa\tHarrison County\t361\t40.7\t10.0\t7.6\t21229\t116129\t0.4283\t51563\tObama\t51563\t0.000911628\t51563.0\n6895\t-96.026664\t41.808301\tLittle Sioux city\tIA\tIowa\tHarrison County\t227\t43.6\t7.1\t11.9\t14720\t54444\t0.4283\t51545\tObama\t51545\t0.00057324\t51545.0\n6896\t-95.60051700000001\t41.852453000000004\tDunlap city\tIA\tIowa\tHarrison County\t1075\t46.4\t14.2\t4.2\t20961\t71406\t0.4283\t51529\tObama\t51529\t0.002714683\t51529.0\n6897\t-95.706765\t41.736351\tWoodbine city\tIA\tIowa\tHarrison County\t1478\t42.2\t13.4\t7.2\t20956\t90000\t0.4283\t51579\tObama\t51579\t0.0037323729999999998\t51579.0\n6898\t-96.021338\t41.710060999999996\tMondamin city\tIA\tIowa\tHarrison County\t461\t45.1\t12.3\t7.3\t23724\t90556\t0.4283\t51557\tObama\t51557\t0.0011641569999999999\t51557.0\n6899\t-96.012095\t41.618337\tModale city\tIA\tIowa\tHarrison County\t308\t42.6\t9.4\t6.3\t21845\t110625\t0.4283\t51556\tObama\t51556\t0.0007777880000000001\t51556.0\n6900\t-95.79101800000001\t41.645189\tLogan city\tIA\tIowa\tHarrison County\t1484\t40.8\t13.5\t4.6\t19965\t102152\t0.4283\t51546\tObama\t51546\t0.003747525\t51546.0\n6901\t-95.874388\t41.691711\tMagnolia city\tIA\tIowa\tHarrison County\t214\t42.5\t12.2\t7.3\t22623\t103333\t0.4283\t51550\tObama\t51550\t0.000540411\t51550.0\n6902\t-95.92648100000001\t41.830374\tPisgah city\tIA\tIowa\tHarrison County\t330\t43.7\t7.0\t12.2\t14743\t53462\t0.4283\t51564\tObama\t51564\t0.000833345\t51564.0\n6903\t-95.901798\t41.558440000000004\tMissouri Valley city\tIA\tIowa\tHarrison County\t2801\t38.5\t13.3\t6.5\t24871\t93333\t0.4283\t51555\tObama\t51555\t0.007073328\t51555.0\n6904\t-91.545075\t41.13418\tOlds city\tIA\tIowa\tHenry County\t245\t41.9\t23.8\t13.1\t21756\t114583\t0.4599\t52647\tObama\t52647\t0.000618695\t52647.0\n6905\t-91.712604\t40.837338\tHillsboro city\tIA\tIowa\tHenry County\t205\t40.7\t16.2\t8.3\t20036\t90000\t0.4599\t52630\tObama\t52630\t0.000517684\t52630.0\n6906\t-91.620667\t40.851965\tSalem city\tIA\tIowa\tHenry County\t452\t43.5\t12.2\t7.4\t18681\t86923\t0.4599\t52649\tObama\t52649\t0.00114143\t52649.0\n6907\t-91.390816\t41.057632\tMount Union city\tIA\tIowa\tHenry County\t130\t40.5\t15.7\t8.6\t21741\t107500\t0.4599\t52644\tObama\t52644\t0.00032828699999999997\t52644.0\n6908\t-91.545564\t40.962491\tMount Pleasant city\tIA\tIowa\tHenry County\t8933\t36.4\t21.5\t8.2\t23278\t107430\t0.4599\t52641\tObama\t52641\t0.022558385\t52641.0\n6909\t-91.65881\t41.14806\tWayland city\tIA\tIowa\tHenry County\t930\t42.7\t13.6\t10.9\t17291\t90789\t0.4599\t52654\tObama\t52654\t0.002348516\t52654.0\n6910\t-91.40091899999999\t40.923453\tNew London city\tIA\tIowa\tHenry County\t1805\t40.2\t19.1\t6.5\t21443\t82941\t0.4599\t52645\tObama\t52645\t0.004558142\t52645.0\n6911\t-91.43817800000001\t41.125926\tWinfield city\tIA\tIowa\tHenry County\t1210\t41.1\t15.0\t9.4\t19139\t82093\t0.4599\t52659\tObama\t52659\t0.003055597\t52659.0\n6912\t-91.681797\t40.982071999999995\tRome city\tIA\tIowa\tHenry County\t113\t40.8\t16.0\t8.3\t20042\t80000\t0.4599\t52635\tObama\t52635\t0.000285357\t52635.0\n6913\t-91.626638\t40.96477\tWestwood city\tIA\tIowa\tHenry County\t127\t45.5\t22.8\t10.3\t26543\t167500\t0.4599\t52641\tObama\t52641\t0.000320711\t52641.0\n6914\t-92.28403399999999\t43.44986\tLime Springs city\tIA\tIowa\tHoward County\t481\t39.7\t11.8\t5.2\t19513\t86304\t0.5959\t52155\tObama\t52155\t0.001214663\t52155.0\n6915\t-92.116652\t43.371686\tCresco city\tIA\tIowa\tHoward County\t3735\t40.5\t17.0\t5.5\t21381\t89019\t0.5959\t52136\tObama\t52136\t0.009431945\t52136.0\n6916\t-92.36393699999999\t43.491834000000004\tChester city\tIA\tIowa\tHoward County\t141\t44.3\t9.6\t6.3\t18998\t81250\t0.5959\t52134\tObama\t52134\t0.000356065\t52134.0\n6917\t-92.43934499999999\t43.245872999999996\tElma city\tIA\tIowa\tHoward County\t628\t44.7\t8.5\t8.6\t19511\t59750\t0.5959\t50628\tObama\t50628\t0.00158588\t50628.0\n6918\t-92.088881\t43.217079\tProtivin city\tIA\tIowa\tHoward County\t307\t44.1\t10.6\t6.8\t23360\t105288\t0.5959\t52163\tObama\t52163\t0.000775263\t52163.0\n6919\t-92.549899\t43.362184\tRiceville city\tIA\tIowa\tHoward County\t812\t46.2\t15.4\t7.6\t19053\t77619\t0.5959\t50466\tObama\t50466\t0.0020505329999999998\t50466.0\n6920\t-94.433876\t42.730534000000006\tGilmore City\tIA\tIowa\tHumboldt County\t513\t43.6\t10.9\t7.4\t21090\t60000\t0.3823\t50541\tObama\t50541\t0.001295472\t50541.0\n6921\t-94.295036\t42.761371000000004\tRutland city\tIA\tIowa\tHumboldt County\t118\t46.6\t4.7\t1.5\t19623\t60000\t0.3823\t50582\tObama\t50582\t0.000297984\t50582.0\n6922\t-94.184112\t42.868054\tLivermore city\tIA\tIowa\tHumboldt County\t411\t44.0\t10.9\t4.8\t18492\t61176\t0.3823\t50558\tObama\t50558\t0.001037893\t50558.0\n6923\t-94.051165\t42.810154\tHardy city\tIA\tIowa\tHumboldt County\t53\t41.9\t22.9\t3.7\t21084\t65000\t0.3823\t50545\tObama\t50545\t0.00013384\t50545.0\n6924\t-94.37554499999999\t42.898044\tOttosen city\tIA\tIowa\tHumboldt County\t57\t41.3\t17.1\t6.9\t22271\t50000\t0.3823\t50570\tObama\t50570\t0.000143941\t50570.0\n6925\t-94.049576\t42.688128999999996\tThor city\tIA\tIowa\tHumboldt County\t167\t42.7\t19.1\t3.7\t22092\t62500\t0.3823\t50591\tObama\t50591\t0.00042172300000000004\t50591.0\n6926\t-94.19773199999999\t42.722894000000004\tDakota City\tIA\tIowa\tHumboldt County\t794\t35.9\t13.9\t7.0\t24457\t81364\t0.3823\t50529\tObama\t50529\t0.002005078\t50529.0\n6927\t-94.22448399999999\t42.723116\tHumboldt city\tIA\tIowa\tHumboldt County\t4224\t46.3\t22.1\t4.7\t25953\t108702\t0.3823\t50548\tObama\t50548\t0.01066681\t50548.0\n6928\t-94.41963\t42.802871\tBradgate city\tIA\tIowa\tHumboldt County\t82\t46.7\t5.1\t2.2\t19670\t56667\t0.3823\t50520\tObama\t50520\t0.000207073\t50520.0\n6929\t-93.981602\t42.826805\tRenwick city\tIA\tIowa\tHumboldt County\t286\t40.9\t21.5\t3.5\t20697\t67500\t0.3823\t50577\tObama\t50577\t0.000722232\t50577.0\n6930\t-94.390488\t42.653434000000004\tPioneer city\tIA\tIowa\tHumboldt County\t20\t30.0\t7.1\t8.3\t21802\t60000\t0.3823\t50524\tObama\t50524\t5.05e-05\t50524.0\n6931\t-94.28621600000001\t42.867989\tBode city\tIA\tIowa\tHumboldt County\t308\t40.9\t16.7\t7.6\t22099\t53077\t0.3823\t50519\tObama\t50519\t0.0007777880000000001\t50519.0\n6932\t-95.47350300000001\t42.344143\tIda Grove city\tIA\tIowa\tIda County\t2047\t46.0\t19.7\t7.1\t23420\t81429\t0.3606\t51445\tObama\t51445\t0.005169262\t51445.0\n6933\t-95.417259\t42.50646\tGalva city\tIA\tIowa\tIda County\t278\t45.3\t10.4\t2.0\t23518\t53846\t0.3606\t51020\tObama\t51020\t0.00070203\t51020.0\n6934\t-95.346912\t42.335358\tArthur city\tIA\tIowa\tIda County\t224\t42.7\t12.9\t5.0\t21715\t69500\t0.3606\t51431\tObama\t51431\t0.000565664\t51431.0\n6935\t-95.600258\t42.316865\tBattle Creek city\tIA\tIowa\tIda County\t634\t51.5\t12.4\t9.4\t25722\t54259\t0.3606\t51006\tObama\t51006\t0.001601032\t51006.0\n6936\t-95.54301\t42.487212\tHolstein city\tIA\tIowa\tIda County\t1386\t43.8\t18.7\t6.1\t21837\t74889\t0.3606\t51025\tObama\t51025\t0.003500047\t51025.0\n6937\t-92.067737\t41.796475\tMarengo city\tIA\tIowa\tIowa County\t2454\t38.8\t10.7\t7.3\t21913\t92463\t0.4674\t52301\tObama\t52301\t0.006197053\t52301.0\n6938\t-92.18585300000001\t41.755506\tLadora city\tIA\tIowa\tIowa County\t308\t42.0\t13.1\t9.1\t23149\t81429\t0.4674\t52251\tObama\t52251\t0.0007777880000000001\t52251.0\n6939\t-92.294239\t41.730634\tVictor city\tIA\tIowa\tIowa County\t914\t45.4\t18.3\t7.8\t21350\t87969\t0.4674\t52347\tObama\t52347\t0.002308112\t52347.0\n6940\t-92.159501\t41.573262\tMillersburg city\tIA\tIowa\tIowa County\t191\t42.5\t12.1\t5.5\t19228\t103409\t0.4674\t52308\tObama\t52308\t0.00048233\t52308.0\n6941\t-92.077658\t41.516455\tNorth English city\tIA\tIowa\tIowa County\t1116\t41.8\t16.2\t6.8\t19841\t77250\t0.4674\t52316\tObama\t52316\t0.00281822\t52316.0\n6942\t-92.004598\t41.583647\tParnell city\tIA\tIowa\tIowa County\t241\t41.4\t19.1\t5.0\t22898\t137500\t0.4674\t52361\tObama\t52361\t0.0006085940000000001\t52361.0\n6943\t-92.00975600000001\t41.668572\tWilliamsburg city\tIA\tIowa\tIowa County\t2637\t38.8\t26.9\t6.6\t24366\t128381\t0.4674\t52361\tObama\t52361\t0.006659181\t52361.0\n6944\t-90.66634300000001\t42.064718\tMaquoketa city\tIA\tIowa\tJackson County\t5985\t41.2\t17.7\t8.3\t20707\t88352\t0.5767\t52060\tObama\t52060\t0.01511384\t52060.0\n6945\t-90.176408\t42.066472999999995\tSabula city\tIA\tIowa\tJackson County\t636\t45.3\t10.5\t13.5\t19593\t89000\t0.5767\t52070\tObama\t52070\t0.0016060820000000002\t52070.0\n6946\t-90.54195\t42.36237\tSt. Donatus city\tIA\tIowa\tJackson County\t143\t43.4\t13.3\t6.0\t22282\t125000\t0.5767\t52071\tObama\t52071\t0.000361116\t52071.0\n6947\t-90.882115\t42.07509\tMonmouth city\tIA\tIowa\tJackson County\t174\t40.4\t10.0\t11.6\t20682\t43333\t0.5767\t52309\tObama\t52309\t0.0004394\t52309.0\n6948\t-90.479501\t42.165690999999995\tSpringbrook city\tIA\tIowa\tJackson County\t185\t39.2\t9.2\t4.6\t18989\t125000\t0.5767\t52075\tObama\t52075\t0.000467178\t52075.0\n6949\t-90.39749499999999\t42.049051\tPreston city\tIA\tIowa\tJackson County\t924\t40.1\t12.1\t5.6\t20019\t97321\t0.5767\t52069\tObama\t52069\t0.002333365\t52069.0\n6950\t-90.432053\t42.071740999999996\tSpragueville city\tIA\tIowa\tJackson County\t85\t42.9\t10.2\t3.9\t17951\t125000\t0.5767\t52069\tObama\t52069\t0.00021464900000000002\t52069.0\n6951\t-90.83856899999999\t42.073182\tBaldwin city\tIA\tIowa\tJackson County\t123\t40.9\t10.5\t11.9\t20641\t45000\t0.5767\t52207\tObama\t52207\t0.00031061\t52207.0\n6952\t-90.591931\t42.153224\tAndrew city\tIA\tIowa\tJackson County\t469\t40.8\t11.0\t5.9\t20993\t118243\t0.5767\t52030\tObama\t52030\t0.0011843589999999998\t52030.0\n6953\t-90.429624\t42.259091\tBellevue city\tIA\tIowa\tJackson County\t2215\t42.5\t17.9\t6.2\t20358\t114891\t0.5767\t52031\tObama\t52031\t0.00559351\t52031.0\n6954\t-90.31564300000001\t42.048765\tMiles city\tIA\tIowa\tJackson County\t449\t43.2\t11.6\t5.9\t17883\t90833\t0.5767\t52064\tObama\t52064\t0.001133854\t52064.0\n6955\t-90.623369\t42.295666\tLa Motte city\tIA\tIowa\tJackson County\t280\t41.0\t11.1\t3.9\t20235\t126667\t0.5767\t52054\tObama\t52054\t0.00070708\t52054.0\n6956\t-92.78629000000001\t41.576945\tLynnville city\tIA\tIowa\tJasper County\t368\t40.3\t14.6\t5.5\t23914\t112143\t0.5256\t50153\tObama\t50153\t0.000929305\t50153.0\n6957\t-93.23911899999999\t41.595636\tPrairie City\tIA\tIowa\tJasper County\t1356\t41.9\t20.5\t7.0\t25332\t122400\t0.5256\t50228\tObama\t50228\t0.003424289\t50228.0\n6958\t-93.042325\t41.69675\tNewton city\tIA\tIowa\tJasper County\t15121\t40.5\t22.3\t9.5\t26457\t107290\t0.5256\t50208\tObama\t50208\t0.038184857999999995\t50208.0\n6959\t-93.24037\t41.676688\tColfax city\tIA\tIowa\tJasper County\t2152\t39.5\t14.0\t12.0\t22394\t100578\t0.5256\t50054\tObama\t50054\t0.0054344169999999995\t50054.0\n6960\t-93.103702\t41.518915\tMonroe city\tIA\tIowa\tJasper County\t1783\t38.6\t15.8\t7.1\t24205\t103801\t0.5256\t50170\tObama\t50170\t0.004502585999999999\t50170.0\n6961\t-93.022865\t41.578798\tReasnor city\tIA\tIowa\tJasper County\t200\t37.3\t11.0\t4.1\t20609\t150000\t0.5256\t50232\tObama\t50232\t0.0005050569999999999\t50232.0\n6962\t-92.907039\t41.717706\tKellogg city\tIA\tIowa\tJasper County\t603\t45.1\t13.4\t7.8\t21717\t108772\t0.5256\t50135\tObama\t50135\t0.001522748\t50135.0\n6963\t-93.32558900000001\t41.729889\tValeria city\tIA\tIowa\tJasper County\t69\t41.7\t21.7\t5.1\t24222\t120833\t0.5256\t50169\tObama\t50169\t0.000174245\t50169.0\n6964\t-93.283845\t41.766749\tMingo city\tIA\tIowa\tJasper County\t298\t41.3\t22.1\t4.2\t24336\t120089\t0.5256\t50168\tObama\t50168\t0.000752535\t50168.0\n6965\t-92.845996\t41.577789\tSully city\tIA\tIowa\tJasper County\t869\t40.8\t18.1\t5.9\t21662\t114448\t0.5256\t50251\tObama\t50251\t0.002194474\t50251.0\n6966\t-93.152372\t41.82527\tBaxter city\tIA\tIowa\tJasper County\t1073\t36.9\t14.2\t10.8\t22908\t106863\t0.5256\t50028\tObama\t50028\t0.002709632\t50028.0\n6967\t-93.079364\t41.700717\tLambs Grove city\tIA\tIowa\tJasper County\t220\t43.8\t25.8\t13.7\t22874\t123333\t0.5256\t50208\tObama\t50208\t0.000555563\t50208.0\n6968\t-92.82118299999999\t41.720191\tOakland Acres city\tIA\tIowa\tJasper County\t177\t47.0\t19.8\t12.2\t24412\t131250\t0.5256\t50135\tObama\t50135\t0.00044697599999999997\t50135.0\n6969\t-91.859593\t41.147208\tPleasant Plain city\tIA\tIowa\tJefferson County\t127\t44.2\t27.5\t3.2\t17420\t95000\t0.5625\t52540\tObama\t52540\t0.000320711\t52540.0\n6970\t-91.712962\t41.164869\tCoppock city\tIA\tIowa\tJefferson County\t57\t41.3\t15.0\t10.0\t18779\t112500\t0.5625\t52654\tObama\t52654\t0.000143941\t52654.0\n6971\t-92.082489\t41.13264\tPackwood city\tIA\tIowa\tJefferson County\t212\t41.3\t17.7\t4.7\t24029\t77000\t0.5625\t52580\tObama\t52580\t0.0005353609999999999\t52580.0\n6972\t-92.167248\t40.995065999999994\tBatavia city\tIA\tIowa\tJefferson County\t486\t45.0\t28.5\t10.7\t27093\t66667\t0.5625\t52533\tObama\t52533\t0.001227289\t52533.0\n6973\t-91.749107\t40.993718\tLockridge city\tIA\tIowa\tJefferson County\t257\t42.4\t13.4\t10.1\t19402\t86250\t0.5625\t52635\tObama\t52635\t0.000648999\t52635.0\n6974\t-91.96742900000001\t41.007836\tFairfield city\tIA\tIowa\tJefferson County\t9355\t45.0\t44.2\t9.8\t24318\t93705\t0.5625\t52556\tObama\t52556\t0.023624056\t52556.0\n6975\t-92.050197\t40.958239\tLibertyville city\tIA\tIowa\tJefferson County\t310\t43.3\t12.6\t5.8\t19238\t102381\t0.5625\t52567\tObama\t52567\t0.0007828389999999999\t52567.0\n6976\t-91.61419000000001\t41.741049\tNorth Liberty city\tIA\tIowa\tJohnson County\t12023\t31.8\t43.1\t3.5\t31677\t146087\t0.6669\t52317\tObama\t52317\t0.03036152\t52317.0\n6977\t-91.497671\t41.807241999999995\tSolon city\tIA\tIowa\tJohnson County\t1463\t37.1\t32.1\t3.6\t26471\t159896\t0.6669\t52333\tObama\t52333\t0.0036944940000000004\t52333.0\n6978\t-91.788572\t41.724169\tOxford city\tIA\tIowa\tJohnson County\t849\t40.8\t21.2\t8.8\t22271\t108929\t0.6669\t52322\tObama\t52322\t0.002143968\t52322.0\n6979\t-91.558777\t41.65506\tUniversity Heights city\tIA\tIowa\tJohnson County\t1275\t37.8\t77.1\t6.3\t40098\t228521\t0.6669\t52246\tObama\t52246\t0.00321974\t52246.0\n6980\t-91.65264599999999\t41.847846000000004\tShueyville city\tIA\tIowa\tJohnson County\t286\t42.0\t42.7\t5.7\t34278\t247500\t0.6669\t52338\tObama\t52338\t0.000722232\t52338.0\n6981\t-91.595467\t41.6984\tCoralville city\tIA\tIowa\tJohnson County\t18832\t31.2\t53.3\t4.0\t30101\t165205\t0.6669\t52241\tObama\t52241\t0.047556195999999995\t52241.0\n6982\t-91.533175\t41.656690999999995\tIowa City\tIA\tIowa\tJohnson County\t68764\t27.0\t60.9\t6.4\t25250\t170401\t0.6669\t52242\tObama\t52242\t0.17364880300000002\t52242.0\n6983\t-91.424849\t41.485572999999995\tLone Tree city\tIA\tIowa\tJohnson County\t1334\t37.8\t19.4\t6.5\t23169\t114516\t0.6669\t52755\tObama\t52755\t0.003368732\t52755.0\n6984\t-91.536964\t41.564376\tHills city\tIA\tIowa\tJohnson County\t651\t34.5\t28.6\t4.5\t19707\t47222\t0.6669\t52235\tObama\t52235\t0.0016439620000000001\t52235.0\n6985\t-91.694014\t41.842486\tSwisher city\tIA\tIowa\tJohnson County\t1008\t38.3\t30.3\t1.2\t28091\t189000\t0.6669\t52338\tObama\t52338\t0.0025454889999999997\t52338.0\n6986\t-91.66242700000001\t41.711302\tTiffin city\tIA\tIowa\tJohnson County\t1213\t30.8\t42.3\t3.5\t29796\t130556\t0.6669\t52340\tObama\t52340\t0.0030631729999999998\t52340.0\n6987\t-91.00519\t42.05973\tWyoming city\tIA\tIowa\tJones County\t609\t45.5\t10.5\t13.3\t23345\t69000\t0.5296\t52362\tObama\t52362\t0.0015379\t52362.0\n6988\t-91.015126\t42.107462\tOnslow city\tIA\tIowa\tJones County\t220\t43.7\t12.2\t9.8\t19246\t79000\t0.5296\t52321\tObama\t52321\t0.000555563\t52321.0\n6989\t-91.357885\t42.020351\tMartelle city\tIA\tIowa\tJones County\t277\t41.8\t21.3\t4.1\t21488\t117857\t0.5296\t52305\tObama\t52305\t0.000699504\t52305.0\n6990\t-90.954155\t41.983596\tOxford Junction city\tIA\tIowa\tJones County\t544\t44.0\t7.1\t14.7\t19117\t65714\t0.5296\t52323\tObama\t52323\t0.001373756\t52323.0\n6991\t-91.190761\t42.237384000000006\tMonticello city\tIA\tIowa\tJones County\t3561\t42.5\t20.0\t8.1\t23219\t99000\t0.5296\t52310\tObama\t52310\t0.008992545\t52310.0\n6992\t-91.277979\t42.109716999999996\tAnamosa city\tIA\tIowa\tJones County\t5596\t37.3\t12.3\t7.6\t22289\t98291\t0.5296\t52205\tObama\t52205\t0.014131503\t52205.0\n6993\t-91.24631600000001\t42.006248\tMorley city\tIA\tIowa\tJones County\t87\t41.4\t22.6\t3.8\t21514\t129167\t0.5296\t52312\tObama\t52312\t0.0002197\t52312.0\n6994\t-91.14189\t41.997631\tOlin city\tIA\tIowa\tJones County\t762\t37.8\t9.1\t8.0\t21014\t88478\t0.5296\t52320\tObama\t52320\t0.0019242679999999998\t52320.0\n6995\t-91.090486\t42.114373\tCenter Junction city\tIA\tIowa\tJones County\t129\t44.4\t12.0\t10.3\t19280\t81667\t0.5296\t52212\tObama\t52212\t0.000325762\t52212.0\n6996\t-92.20437700000001\t41.334127\tSigourney city\tIA\tIowa\tKeokuk County\t2012\t43.3\t16.7\t9.8\t20065\t81346\t0.4373\t52591\tObama\t52591\t0.005080877\t52591.0\n6997\t-92.39205\t41.48021\tGibson city\tIA\tIowa\tKeokuk County\t84\t44.4\t18.5\t9.6\t22232\t70000\t0.4373\t50104\tObama\t50104\t0.000212124\t50104.0\n6998\t-92.332287\t41.455934\tThornburg city\tIA\tIowa\tKeokuk County\t77\t45.4\t17.5\t8.5\t22143\t80000\t0.4373\t50104\tObama\t50104\t0.00019444700000000002\t50104.0\n6999\t-92.050962\t41.363617\tHarper city\tIA\tIowa\tKeokuk County\t151\t41.9\t13.7\t6.3\t20145\t92000\t0.4373\t52231\tObama\t52231\t0.000381318\t52231.0\n7000\t-91.99600699999999\t41.185719\tRichland city\tIA\tIowa\tKeokuk County\t565\t43.2\t13.4\t5.6\t21499\t86591\t0.4373\t52585\tObama\t52585\t0.001426787\t52585.0\n7001\t-92.330292\t41.322536\tDelta city\tIA\tIowa\tKeokuk County\t368\t40.3\t14.9\t13.4\t18911\t39750\t0.4373\t52550\tObama\t52550\t0.000929305\t52550.0\n7002\t-92.171584\t41.438036\tWebster city\tIA\tIowa\tKeokuk County\t108\t42.1\t5.6\t5.1\t21201\t76667\t0.4373\t52355\tObama\t52355\t0.00027273099999999996\t52355.0\n7003\t-92.090496\t41.452107\tSouth English city\tIA\tIowa\tKeokuk County\t208\t42.7\t7.0\t6.0\t21310\t74286\t0.4373\t52335\tObama\t52335\t0.00052526\t52335.0\n7004\t-92.24773499999999\t41.264687\tHayesville city\tIA\tIowa\tKeokuk County\t62\t43.5\t9.3\t6.5\t21231\t75000\t0.4373\t52562\tObama\t52562\t0.000156568\t52562.0\n7005\t-91.95551999999999\t41.36554\tKeota city\tIA\tIowa\tKeokuk County\t1032\t42.9\t20.3\t6.4\t21276\t86346\t0.4373\t52248\tObama\t52248\t0.002606096\t52248.0\n7006\t-92.307952\t41.171110999999996\tHedrick city\tIA\tIowa\tKeokuk County\t727\t38.4\t12.8\t7.0\t18571\t63409\t0.4373\t52563\tObama\t52563\t0.001835883\t52563.0\n7007\t-92.238201\t41.454656\tKeswick city\tIA\tIowa\tKeokuk County\t278\t40.7\t11.6\t5.5\t20086\t81667\t0.4373\t50136\tObama\t50136\t0.00070203\t50136.0\n7008\t-92.092376\t41.199174\tOllie city\tIA\tIowa\tKeokuk County\t216\t43.4\t13.2\t5.2\t21462\t87222\t0.4373\t52576\tObama\t52576\t0.0005454619999999999\t52576.0\n7009\t-91.987404\t41.458903\tKinross city\tIA\tIowa\tKeokuk County\t90\t42.0\t13.6\t6.3\t20179\t91667\t0.4373\t52335\tObama\t52335\t0.000227276\t52335.0\n7010\t-92.252057\t41.179266\tMartinsburg city\tIA\tIowa\tKeokuk County\t122\t41.7\t8.5\t6.6\t21242\t73750\t0.4373\t52568\tObama\t52568\t0.000308085\t52568.0\n7011\t-92.354574\t41.399723\tWhat Cheer city\tIA\tIowa\tKeokuk County\t646\t43.1\t9.5\t10.7\t19167\t41515\t0.4373\t50268\tObama\t50268\t0.001631335\t50268.0\n7012\t-94.220997\t43.198908\tBurt city\tIA\tIowa\tKossuth County\t468\t42.3\t10.5\t3.9\t16725\t47879\t0.4315\t50522\tObama\t50522\t0.0011818339999999999\t50522.0\n7013\t-94.04143499999999\t43.236922\tTitonka city\tIA\tIowa\tKossuth County\t521\t45.1\t18.6\t2.9\t19896\t59375\t0.4315\t50480\tObama\t50480\t0.001315674\t50480.0\n7014\t-94.31093800000001\t43.383299\tSwea City\tIA\tIowa\tKossuth County\t544\t44.4\t17.6\t4.9\t20415\t43750\t0.4315\t50590\tObama\t50590\t0.001373756\t50590.0\n7015\t-93.993371\t43.088503\tWesley city\tIA\tIowa\tKossuth County\t443\t41.1\t14.3\t5.9\t20904\t77619\t0.4315\t50483\tObama\t50483\t0.001118702\t50483.0\n7016\t-94.078925\t42.915286\tLu Verne city\tIA\tIowa\tKossuth County\t276\t44.2\t9.8\t3.7\t19060\t50000\t0.4315\t50560\tObama\t50560\t0.0006969789999999999\t50560.0\n7017\t-94.09365\t43.377576\tLakota city\tIA\tIowa\tKossuth County\t208\t45.9\t10.1\t4.3\t20026\t39583\t0.4315\t50451\tObama\t50451\t0.00052526\t50451.0\n7018\t-94.42791899999999\t43.218132000000004\tFenton city\tIA\tIowa\tKossuth County\t284\t45.1\t16.3\t5.2\t21115\t44167\t0.4315\t50539\tObama\t50539\t0.0007171810000000001\t50539.0\n7019\t-94.424963\t43.063476\tWhittemore city\tIA\tIowa\tKossuth County\t489\t41.4\t16.2\t4.9\t19416\t61071\t0.4315\t50598\tObama\t50598\t0.001234865\t50598.0\n7020\t-94.226683\t43.073952\tAlgona city\tIA\tIowa\tKossuth County\t5391\t44.7\t19.3\t6.5\t21908\t90287\t0.4315\t50511\tObama\t50511\t0.01361382\t50511.0\n7021\t-94.15858100000001\t43.420653\tLedyard city\tIA\tIowa\tKossuth County\t120\t45.8\t10.3\t4.4\t20022\t38125\t0.4315\t50556\tObama\t50556\t0.00030303400000000004\t50556.0\n7022\t-94.217343\t43.292569\tBancroft city\tIA\tIowa\tKossuth County\t785\t40.5\t8.2\t4.3\t22000\t63571\t0.4315\t50517\tObama\t50517\t0.00198235\t50517.0\n7023\t-94.325507\t43.220751\tLone Rock city\tIA\tIowa\tKossuth County\t139\t45.0\t15.6\t3.8\t20477\t56000\t0.4315\t50559\tObama\t50559\t0.000351015\t50559.0\n7024\t-91.61142\t40.783332\tHoughton city\tIA\tIowa\tLee County\t131\t41.8\t17.2\t5.8\t24775\t111458\t0.5665\t52631\tObama\t52631\t0.000330813\t52631.0\n7025\t-91.565061\t40.643768\tDonnellson city\tIA\tIowa\tLee County\t955\t41.6\t12.7\t8.6\t20935\t95179\t0.5665\t52625\tObama\t52625\t0.002411649\t52625.0\n7026\t-91.511749\t40.666668\tFranklin city\tIA\tIowa\tLee County\t128\t45.9\t10.4\t11.3\t21166\t93750\t0.5665\t52625\tObama\t52625\t0.000323237\t52625.0\n7027\t-91.51641500000001\t40.76783\tSt. Paul city\tIA\tIowa\tLee County\t119\t41.3\t17.3\t6.3\t24746\t111364\t0.5665\t52656\tObama\t52656\t0.000300509\t52656.0\n7028\t-91.45234\t40.715253999999995\tWest Point city\tIA\tIowa\tLee County\t979\t47.1\t16.3\t6.0\t30739\t105750\t0.5665\t52656\tObama\t52656\t0.002472256\t52656.0\n7029\t-91.416448\t40.526071\tMontrose city\tIA\tIowa\tLee County\t907\t46.7\t10.2\t11.4\t21619\t80278\t0.5665\t52639\tObama\t52639\t0.002290435\t52639.0\n7030\t-91.352277\t40.619642\tFort Madison city\tIA\tIowa\tLee County\t10823\t41.7\t16.7\t10.6\t23555\t73837\t0.5665\t52627\tObama\t52627\t0.027331176000000002\t52627.0\n7031\t-91.402895\t40.409649\tKeokuk city\tIA\tIowa\tLee County\t10394\t39.4\t16.4\t12.9\t22311\t68123\t0.5665\t52632\tObama\t52632\t0.026247827999999997\t52632.0\n7032\t-91.674736\t41.966089000000004\tCedar Rapids city\tIA\tIowa\tLinn County\t127747\t36.7\t31.3\t7.6\t28634\t125390\t0.579\t524HH\tObama\t524HH\t0.322597779\t0.0\n7033\t-91.53028499999999\t42.278464\tCoggon city\tIA\tIowa\tLinn County\t817\t37.7\t16.5\t4.5\t23146\t106368\t0.579\t52218\tObama\t52218\t0.0020631589999999997\t52218.0\n7034\t-91.425737\t42.237762\tPrairieburg city\tIA\tIowa\tLinn County\t209\t41.6\t13.6\t5.9\t23626\t121154\t0.579\t52219\tObama\t52219\t0.000527785\t52219.0\n7035\t-91.77899599999999\t41.922213\tFairfax city\tIA\tIowa\tLinn County\t1297\t37.8\t22.7\t5.6\t29947\t134309\t0.579\t52228\tObama\t52228\t0.003275297\t52228.0\n7036\t-91.588367\t42.03815\tMarion city\tIA\tIowa\tLinn County\t31376\t36.5\t33.8\t6.0\t31379\t137315\t0.579\t52302\tObama\t52302\t0.07923339\t52302.0\n7037\t-91.52398199999999\t42.203927\tCentral City\tIA\tIowa\tLinn County\t1262\t37.2\t13.4\t8.4\t24199\t105022\t0.579\t52214\tObama\t52214\t0.003186912\t52214.0\n7038\t-91.536034\t41.952571\tBertram city\tIA\tIowa\tLinn County\t288\t41.7\t31.8\t6.1\t32358\t192308\t0.579\t52227\tObama\t52227\t0.000727283\t52227.0\n7039\t-91.618303\t42.148296\tAlburnett city\tIA\tIowa\tLinn County\t629\t38.2\t20.7\t5.5\t24926\t156818\t0.579\t52202\tObama\t52202\t0.001588405\t52202.0\n7040\t-91.445451\t42.053033\tSpringville city\tIA\tIowa\tLinn County\t1147\t36.2\t17.9\t3.5\t26464\t118510\t0.579\t52336\tObama\t52336\t0.0028965040000000003\t52336.0\n7041\t-91.685838\t42.04721\tHiawatha city\tIA\tIowa\tLinn County\t7074\t34.6\t32.2\t7.0\t29991\t133117\t0.579\t52233\tObama\t52233\t0.017863877\t52233.0\n7042\t-91.779501\t42.184236999999996\tCenter Point city\tIA\tIowa\tLinn County\t2028\t38.2\t19.2\t5.2\t22765\t136790\t0.579\t52213\tObama\t52213\t0.005121281\t52213.0\n7043\t-91.67241800000001\t42.077337\tRobins city\tIA\tIowa\tLinn County\t2695\t34.8\t44.7\t4.3\t32727\t203194\t0.579\t52328\tObama\t52328\t0.006805647\t52328.0\n7044\t-91.79616700000001\t42.063652000000005\tPalo city\tIA\tIowa\tLinn County\t869\t40.0\t36.0\t4.3\t30492\t193919\t0.579\t52324\tObama\t52324\t0.002194474\t52324.0\n7045\t-91.42419\t41.922918\tMount Vernon city\tIA\tIowa\tLinn County\t4417\t29.5\t46.9\t7.7\t25297\t156250\t0.579\t52314\tObama\t52314\t0.011154191\t52314.0\n7046\t-91.780615\t42.287566\tWalker city\tIA\tIowa\tLinn County\t786\t38.8\t21.1\t5.0\t21602\t119420\t0.579\t52352\tObama\t52352\t0.001984875\t52352.0\n7047\t-91.586224\t41.875391\tEly city\tIA\tIowa\tLinn County\t1597\t38.1\t30.7\t4.6\t26682\t173162\t0.579\t52227\tObama\t52227\t0.004032883\t52227.0\n7048\t-91.391482\t41.920257\tLisbon city\tIA\tIowa\tLinn County\t2182\t35.7\t24.6\t4.9\t23439\t122967\t0.579\t52253\tObama\t52253\t0.005510175\t52253.0\n7049\t-91.187442\t41.277353000000005\tGrandview city\tIA\tIowa\tLouisa County\t576\t39.5\t7.4\t7.5\t19758\t101103\t0.4936\t52752\tObama\t52752\t0.001454565\t52752.0\n7050\t-91.18853\t41.177265999999996\tWapello city\tIA\tIowa\tLouisa County\t2047\t36.6\t14.1\t3.7\t21036\t88934\t0.4936\t52653\tObama\t52653\t0.005169262\t52653.0\n7051\t-91.250573\t41.094169\tMorning Sun city\tIA\tIowa\tLouisa County\t803\t38.8\t13.0\t10.7\t20393\t55385\t0.4936\t52640\tObama\t52640\t0.002027805\t52640.0\n7052\t-91.37491700000001\t41.259189\tColumbus City\tIA\tIowa\tLouisa County\t377\t36.3\t19.0\t9.7\t20506\t92778\t0.4936\t52737\tObama\t52737\t0.000952033\t52737.0\n7053\t-91.043622\t41.098077\tOakville city\tIA\tIowa\tLouisa County\t402\t37.0\t11.4\t11.4\t19424\t49348\t0.4936\t52646\tObama\t52646\t0.001015165\t52646.0\n7054\t-91.235629\t41.330248\tLetts city\tIA\tIowa\tLouisa County\t376\t39.5\t7.4\t7.5\t19772\t100521\t0.4936\t52754\tObama\t52754\t0.0009495080000000001\t52754.0\n7055\t-91.339264\t41.284437\tFredonia city\tIA\tIowa\tLouisa County\t245\t35.0\t8.7\t10.4\t18560\t66000\t0.4936\t52738\tObama\t52738\t0.000618695\t52738.0\n7056\t-91.365105\t41.27884\tColumbus Junction city\tIA\tIowa\tLouisa County\t1894\t33.8\t15.3\t9.4\t20072\t84762\t0.4936\t52738\tObama\t52738\t0.004782893\t52738.0\n7057\t-91.466399\t41.293842\tCotter city\tIA\tIowa\tLouisa County\t46\t36.3\t13.3\t12.0\t23504\t115625\t0.4936\t52201\tObama\t52201\t0.00011616299999999999\t52201.0\n7058\t-93.25670500000001\t41.088223\tWilliamson city\tIA\tIowa\tLucas County\t158\t45.4\t6.3\t7.1\t17995\t96250\t0.4596\t50272\tObama\t50272\t0.000398995\t50272.0\n7059\t-93.460991\t41.03223\tLucas city\tIA\tIowa\tLucas County\t232\t44.0\t9.2\t1.6\t20285\t88333\t0.4596\t50151\tObama\t50151\t0.000585866\t50151.0\n7060\t-93.200484\t40.980132\tRussell city\tIA\tIowa\tLucas County\t551\t40.5\t7.5\t7.1\t20939\t55417\t0.4596\t50238\tObama\t50238\t0.0013914329999999999\t50238.0\n7061\t-93.30941999999999\t41.017031\tChariton city\tIA\tIowa\tLucas County\t4443\t42.2\t12.2\t6.4\t19181\t67566\t0.4596\t50049\tObama\t50049\t0.011219848000000001\t50049.0\n7062\t-93.45652700000001\t40.930289\tDerby city\tIA\tIowa\tLucas County\t132\t38.5\t15.3\t4.8\t16241\t104688\t0.4596\t50068\tObama\t50068\t0.000333338\t50068.0\n7063\t-96.302596\t43.341758\tAlvord city\tIA\tIowa\tLyon County\t173\t34.3\t7.6\t2.8\t18436\t85000\t0.2186\t51230\tObama\t51230\t0.000436875\t51230.0\n7064\t-96.002652\t43.341982\tGeorge city\tIA\tIowa\tLyon County\t1027\t50.8\t16.2\t4.1\t21446\t68649\t0.2186\t51237\tObama\t51237\t0.002593469\t51237.0\n7065\t-95.880542\t43.445284\tLittle Rock city\tIA\tIowa\tLyon County\t457\t42.3\t10.5\t6.6\t15963\t56111\t0.2186\t51243\tObama\t51243\t0.001154056\t51243.0\n7066\t-96.231661\t43.278763\tDoon city\tIA\tIowa\tLyon County\t493\t34.8\t8.0\t2.9\t18434\t82143\t0.2186\t51235\tObama\t51235\t0.0012449660000000001\t51235.0\n7067\t-96.43505400000001\t43.309290999999995\tInwood city\tIA\tIowa\tLyon County\t845\t41.5\t16.5\t3.2\t19067\t93750\t0.2186\t51240\tObama\t51240\t0.0021338670000000002\t51240.0\n7068\t-96.331399\t43.440374\tLester city\tIA\tIowa\tLyon County\t242\t40.6\t9.9\t1.2\t19687\t107813\t0.2186\t51242\tObama\t51242\t0.000611119\t51242.0\n7069\t-96.436992\t43.454459\tLarchwood city\tIA\tIowa\tLyon County\t772\t39.0\t11.3\t6.2\t23305\t104669\t0.2186\t51241\tObama\t51241\t0.001949521\t51241.0\n7070\t-96.165723\t43.425906\tRock Rapids city\tIA\tIowa\tLyon County\t2414\t43.9\t19.4\t5.8\t23706\t86322\t0.2186\t51246\tObama\t51246\t0.006096041999999999\t51246.0\n7071\t-94.185181\t41.214584\tMacksburg city\tIA\tIowa\tMadison County\t148\t41.3\t5.9\t7.3\t17826\t80000\t0.4292\t50155\tObama\t50155\t0.000373742\t50155.0\n7072\t-93.88038399999999\t41.348324\tPatterson city\tIA\tIowa\tMadison County\t138\t41.5\t20.0\t6.4\t24825\t175000\t0.4292\t50218\tObama\t50218\t0.00034849\t50218.0\n7073\t-93.78749499999999\t41.359147\tBevington city\tIA\tIowa\tMadison County\t63\t40.5\t20.5\t5.7\t25201\t168750\t0.4292\t50033\tObama\t50033\t0.000159093\t50033.0\n7074\t-93.929503\t41.227037\tEast Peru city\tIA\tIowa\tMadison County\t159\t40.5\t5.5\t7.9\t17880\t77500\t0.4292\t50222\tObama\t50222\t0.000401521\t50222.0\n7075\t-94.122153\t41.494521999999996\tEarlham city\tIA\tIowa\tMadison County\t1428\t35.5\t20.1\t5.9\t21517\t124333\t0.4292\t50072\tObama\t50072\t0.003606109\t50072.0\n7076\t-94.017496\t41.338428\tWinterset city\tIA\tIowa\tMadison County\t5425\t38.4\t14.6\t11.0\t22157\t112572\t0.4292\t50273\tObama\t50273\t0.013699679\t50273.0\n7077\t-93.80729000000001\t41.286999\tSt. Charles city\tIA\tIowa\tMadison County\t697\t40.7\t16.3\t6.1\t25557\t145000\t0.4292\t50240\tObama\t50240\t0.001760125\t50240.0\n7078\t-93.84666999999999\t41.209695\tTruro city\tIA\tIowa\tMadison County\t469\t39.1\t17.4\t5.4\t21210\t92500\t0.4292\t50257\tObama\t50257\t0.0011843589999999998\t50257.0\n7079\t-92.434209\t41.212674\tFremont city\tIA\tIowa\tMahaska County\t853\t37.2\t14.5\t7.1\t22099\t78684\t0.3871\t52561\tObama\t52561\t0.0021540689999999998\t52561.0\n7080\t-92.614985\t41.285657\tUniversity Park city\tIA\tIowa\tMahaska County\t536\t35.3\t25.7\t5.0\t20826\t90000\t0.3871\t52595\tObama\t52595\t0.0013535539999999999\t52595.0\n7081\t-92.68136\t41.274671000000005\tBeacon city\tIA\tIowa\tMahaska County\t525\t40.8\t14.2\t8.5\t22256\t89412\t0.3871\t52534\tObama\t52534\t0.001325775\t52534.0\n7082\t-92.65091\t41.470102000000004\tNew Sharon city\tIA\tIowa\tMahaska County\t1295\t40.7\t15.4\t5.9\t20611\t104708\t0.3871\t50207\tObama\t50207\t0.0032702459999999997\t50207.0\n7083\t-92.638878\t41.290381\tOskaloosa city\tIA\tIowa\tMahaska County\t10825\t37.4\t23.7\t9.5\t23494\t91706\t0.3871\t52577\tObama\t52577\t0.027336227\t52577.0\n7084\t-92.46870200000001\t41.510799\tBarnes City\tIA\tIowa\tMahaska County\t195\t44.4\t10.1\t6.3\t22256\t88333\t0.3871\t50027\tObama\t50027\t0.000492431\t50027.0\n7085\t-92.53684799999999\t41.288605\tKeomah Village city\tIA\tIowa\tMahaska County\t102\t40.3\t17.6\t7.7\t21938\t107143\t0.3871\t52543\tObama\t52543\t0.000257579\t52543.0\n7086\t-92.786958\t41.33855\tLeighton city\tIA\tIowa\tMahaska County\t163\t37.8\t15.5\t4.2\t19329\t124107\t0.3871\t50143\tObama\t50143\t0.000411622\t50143.0\n7087\t-92.463516\t41.320364\tRose Hill city\tIA\tIowa\tMahaska County\t216\t40.6\t18.4\t7.3\t21883\t108036\t0.3871\t52586\tObama\t52586\t0.0005454619999999999\t52586.0\n7088\t-92.922673\t41.317904\tHarvey city\tIA\tIowa\tMarion County\t293\t39.4\t9.2\t9.6\t20014\t66429\t0.4244\t50119\tObama\t50119\t0.000739909\t50119.0\n7089\t-92.904099\t41.170212\tHamilton city\tIA\tIowa\tMarion County\t137\t39.1\t7.5\t12.7\t17183\t63333\t0.4244\t50044\tObama\t50044\t0.00034596400000000004\t50044.0\n7090\t-92.884247\t41.205759\tBussey city\tIA\tIowa\tMarion County\t429\t39.3\t7.3\t13.1\t17143\t59583\t0.4244\t50044\tObama\t50044\t0.001083348\t50044.0\n7091\t-93.267916\t41.389408\tPleasantville city\tIA\tIowa\tMarion County\t1641\t38.2\t20.8\t7.4\t21957\t99359\t0.4244\t50225\tObama\t50225\t0.004143995\t50225.0\n7092\t-92.953638\t41.182609\tMarysville city\tIA\tIowa\tMarion County\t51\t41.7\t6.1\t12.5\t17297\t50000\t0.4244\t50116\tObama\t50116\t0.00012879\t50116.0\n7093\t-93.309531\t41.467484999999996\tSwan city\tIA\tIowa\tMarion County\t125\t40.7\t15.7\t5.1\t23244\t132500\t0.4244\t50252\tObama\t50252\t0.000315661\t50252.0\n7094\t-93.101239\t41.318549\tKnoxville city\tIA\tIowa\tMarion County\t7728\t41.7\t15.3\t9.0\t22801\t90291\t0.4244\t50138\tObama\t50138\t0.019515414\t50138.0\n7095\t-93.241128\t41.227503999999996\tMelcher-Dallas city\tIA\tIowa\tMarion County\t1345\t41.7\t7.3\t9.2\t17929\t67778\t0.4244\t50062\tObama\t50062\t0.00339651\t50062.0\n7096\t-92.925054\t41.404828\tPella city\tIA\tIowa\tMarion County\t10479\t34.7\t35.6\t6.6\t25794\t152286\t0.4244\t50219\tObama\t50219\t0.026462477999999998\t50219.0\n7097\t-93.10247700000001\t41.941749\tMelbourne city\tIA\tIowa\tMarshall County\t805\t35.5\t16.9\t4.1\t27677\t89565\t0.5379999999999999\t50162\tObama\t50162\t0.002032856\t50162.0\n7098\t-93.16526\t42.014813000000004\tState Center city\tIA\tIowa\tMarshall County\t1389\t42.1\t19.0\t6.5\t24978\t111598\t0.5379999999999999\t50247\tObama\t50247\t0.003507623\t50247.0\n7099\t-92.862946\t41.9386\tFerguson city\tIA\tIowa\tMarshall County\t122\t39.7\t20.2\t8.1\t22990\t95000\t0.5379999999999999\t50078\tObama\t50078\t0.000308085\t50078.0\n7100\t-92.960717\t41.944086999999996\tHaverhill city\tIA\tIowa\tMarshall County\t173\t41.5\t22.4\t5.2\t21306\t102778\t0.5379999999999999\t50120\tObama\t50120\t0.000436875\t50120.0\n7101\t-93.006174\t42.191031\tLiscomb city\tIA\tIowa\tMarshall County\t269\t43.9\t15.4\t13.2\t21569\t125893\t0.5379999999999999\t50148\tObama\t50148\t0.000679302\t50148.0\n7102\t-92.763577\t42.008062\tLe Grand city\tIA\tIowa\tMarshall County\t930\t37.9\t17.3\t4.6\t23884\t89250\t0.5379999999999999\t50142\tObama\t50142\t0.002348516\t50142.0\n7103\t-93.158526\t42.113901\tClemons city\tIA\tIowa\tMarshall County\t149\t44.2\t18.9\t6.1\t22002\t70000\t0.5379999999999999\t50051\tObama\t50051\t0.000376268\t50051.0\n7104\t-93.183705\t41.927808\tRhodes city\tIA\tIowa\tMarshall County\t329\t42.7\t16.2\t3.5\t24823\t108065\t0.5379999999999999\t50234\tObama\t50234\t0.0008308189999999999\t50234.0\n7105\t-93.19778199999999\t42.123903999999996\tSt. Anthony city\tIA\tIowa\tMarshall County\t110\t43.1\t19.2\t5.1\t21941\t67500\t0.5379999999999999\t50239\tObama\t50239\t0.000277782\t50239.0\n7106\t-92.78823\t41.878813\tGilman city\tIA\tIowa\tMarshall County\t637\t39.2\t14.3\t8.2\t22562\t80455\t0.5379999999999999\t50106\tObama\t50106\t0.0016086079999999999\t50106.0\n7107\t-92.922145\t41.88406\tLaurel city\tIA\tIowa\tMarshall County\t270\t41.9\t22.7\t4.7\t21358\t100833\t0.5379999999999999\t50141\tObama\t50141\t0.000681827\t50141.0\n7108\t-92.90958499999999\t42.034095\tMarshalltown city\tIA\tIowa\tMarshall County\t26336\t39.8\t21.4\t9.5\t22459\t93405\t0.5379999999999999\t50158\tObama\t50158\t0.066505946\t50158.0\n7109\t-92.98867299999999\t42.112465\tAlbion city\tIA\tIowa\tMarshall County\t589\t40.4\t15.9\t6.8\t21046\t86750\t0.5379999999999999\t50005\tObama\t50005\t0.001487394\t50005.0\n7110\t-95.63788000000001\t41.111337\tSilver City\tIA\tIowa\tMills County\t266\t39.7\t24.4\t4.0\t24118\t145833\t0.3949\t51571\tObama\t51571\t0.0006717260000000001\t51571.0\n7111\t-95.799479\t41.018008\tPacific Junction city\tIA\tIowa\tMills County\t505\t40.7\t6.2\t5.8\t19298\t84375\t0.3949\t51561\tObama\t51561\t0.00127527\t51561.0\n7112\t-95.585675\t41.00757\tMalvern city\tIA\tIowa\tMills County\t1231\t43.9\t21.0\t10.2\t23141\t83438\t0.3949\t51551\tObama\t51551\t0.003108628\t51551.0\n7113\t-95.494844\t41.025076\tHastings city\tIA\tIowa\tMills County\t226\t43.2\t7.1\t4.4\t18595\t70000\t0.3949\t51540\tObama\t51540\t0.000570715\t51540.0\n7114\t-95.739884\t41.044737\tGlenwood city\tIA\tIowa\tMills County\t5392\t37.3\t17.8\t11.4\t22640\t116759\t0.3949\t51534\tObama\t51534\t0.013616345\t51534.0\n7115\t-95.431251\t41.138943\tHenderson city\tIA\tIowa\tMills County\t264\t45.9\t18.8\t5.7\t22683\t98333\t0.3949\t51541\tObama\t51541\t0.000666676\t51541.0\n7116\t-95.402804\t41.017987\tEmerson city\tIA\tIowa\tMills County\t471\t44.2\t17.2\t10.8\t22159\t61667\t0.3949\t51533\tObama\t51533\t0.00118941\t51533.0\n7117\t-92.811841\t43.283066999999996\tOsage city\tIA\tIowa\tMitchell County\t3289\t44.4\t15.4\t4.6\t21347\t93777\t0.5068\t50461\tObama\t50461\t0.008305667\t50461.0\n7118\t-92.783537\t43.438125\tStacyville city\tIA\tIowa\tMitchell County\t459\t46.5\t7.6\t3.9\t17765\t72750\t0.5068\t50476\tObama\t50476\t0.001159107\t50476.0\n7119\t-92.593696\t43.436067\tMcIntire city\tIA\tIowa\tMitchell County\t170\t32.5\t1.0\t8.7\t16431\t70000\t0.5068\t50455\tObama\t50455\t0.000429299\t50455.0\n7120\t-93.01727199999999\t43.414997\tCarpenter city\tIA\tIowa\tMitchell County\t143\t40.8\t10.9\t3.7\t18921\t105556\t0.5068\t50426\tObama\t50426\t0.000361116\t50426.0\n7121\t-92.775314\t43.227422\tOrchard city\tIA\tIowa\tMitchell County\t86\t40.8\t12.5\t2.0\t20803\t108333\t0.5068\t50460\tObama\t50460\t0.000217175\t50460.0\n7122\t-92.871087\t43.320372\tMitchell city\tIA\tIowa\tMitchell County\t149\t42.5\t5.0\t1.1\t19857\t103906\t0.5068\t50461\tObama\t50461\t0.000376268\t50461.0\n7123\t-92.919747\t43.379132\tSt. Ansgar city\tIA\tIowa\tMitchell County\t1091\t50.2\t18.7\t7.0\t23326\t97763\t0.5068\t50472\tObama\t50472\t0.0027550879999999997\t50472.0\n7124\t-95.950763\t42.204737\tRodney city\tIA\tIowa\tMonona County\t70\t41.3\t14.6\t10.8\t19313\t52500\t0.4431\t51051\tObama\t51051\t0.00017677\t51051.0\n7125\t-95.910398\t42.0731\tCastana city\tIA\tIowa\tMonona County\t167\t42.3\t14.4\t11.1\t19479\t59000\t0.4431\t51010\tObama\t51010\t0.00042172300000000004\t51010.0\n7126\t-95.706099\t42.049964\tUte city\tIA\tIowa\tMonona County\t339\t50.8\t11.0\t6.6\t20070\t62500\t0.4431\t51060\tObama\t51060\t0.0008560719999999999\t51060.0\n7127\t-96.081967\t41.930344\tBlencoe city\tIA\tIowa\tMonona County\t232\t47.8\t12.7\t5.2\t25579\t92000\t0.4431\t51523\tObama\t51523\t0.000585866\t51523.0\n7128\t-96.150772\t42.127194\tWhiting city\tIA\tIowa\tMonona County\t651\t37.6\t21.6\t14.2\t18917\t71500\t0.4431\t51063\tObama\t51063\t0.0016439620000000001\t51063.0\n7129\t-95.780116\t41.984242\tSoldier city\tIA\tIowa\tMonona County\t187\t47.2\t16.8\t6.5\t18297\t61250\t0.4431\t51572\tObama\t51572\t0.000472229\t51572.0\n7130\t-96.089345\t42.027468\tOnawa city\tIA\tIowa\tMonona County\t2836\t44.5\t18.0\t5.4\t22498\t80402\t0.4431\t51040\tObama\t51040\t0.007161713\t51040.0\n7131\t-95.966211\t42.020771999999994\tTurin city\tIA\tIowa\tMonona County\t70\t41.3\t14.6\t10.5\t19573\t52500\t0.4431\t51059\tObama\t51059\t0.00017677\t51059.0\n7132\t-95.850511\t41.924354\tMoorhead city\tIA\tIowa\tMonona County\t209\t45.6\t18.7\t8.8\t24910\t63000\t0.4431\t51558\tObama\t51558\t0.000527785\t51558.0\n7133\t-95.79051700000001\t42.167138\tMapleton city\tIA\tIowa\tMonona County\t1148\t48.5\t15.8\t9.1\t19430\t77179\t0.4431\t51034\tObama\t51034\t0.0028990290000000004\t51034.0\n7134\t-93.050809\t40.980332000000004\tMelrose city\tIA\tIowa\tMonroe County\t126\t46.1\t17.6\t5.6\t20338\t73750\t0.452\t52569\tObama\t52569\t0.000318186\t52569.0\n7135\t-92.908123\t41.134925\tLovilia city\tIA\tIowa\tMonroe County\t549\t36.5\t5.6\t5.2\t17187\t63333\t0.452\t50150\tObama\t50150\t0.001386382\t50150.0\n7136\t-92.80359200000001\t41.027099\tAlbia city\tIA\tIowa\tMonroe County\t3480\t40.3\t17.2\t8.4\t21447\t77260\t0.452\t52531\tObama\t52531\t0.008787996999999999\t52531.0\n7137\t-94.984998\t41.142659\tGrant city\tIA\tIowa\tMontgomery County\t91\t47.5\t17.4\t6.7\t22065\t77500\t0.3825\t50847\tObama\t50847\t0.000229801\t50847.0\n7138\t-94.981992\t40.9298\tVillisca city\tIA\tIowa\tMontgomery County\t1222\t45.5\t14.0\t6.6\t16956\t54868\t0.3825\t50864\tObama\t50864\t0.0030859000000000004\t50864.0\n7139\t-95.225023\t41.012753000000004\tRed Oak city\tIA\tIowa\tMontgomery County\t5769\t41.2\t16.0\t12.6\t21203\t75034\t0.3825\t51566\tObama\t51566\t0.014568378\t51566.0\n7140\t-95.265561\t40.918786\tCoburg city\tIA\tIowa\tMontgomery County\t28\t38.8\t15.8\t5.9\t21033\t100000\t0.3825\t51638\tObama\t51638\t7.070000000000001e-05\t51638.0\n7141\t-95.103161\t40.981196000000004\tStanton city\tIA\tIowa\tMontgomery County\t619\t43.0\t15.6\t8.9\t20213\t84444\t0.3825\t51573\tObama\t51573\t0.0015631520000000002\t51573.0\n7142\t-95.162802\t41.149460999999995\tElliott city\tIA\tIowa\tMontgomery County\t371\t40.6\t9.8\t9.5\t18258\t67000\t0.3825\t51532\tObama\t51532\t0.0009368810000000001\t51532.0\n7143\t-91.071748\t41.416046\tMuscatine city\tIA\tIowa\tMuscatine County\t23085\t37.2\t20.0\t10.6\t24913\t103611\t0.57\t52761\tObama\t52761\t0.05829624\t52761.0\n7144\t-91.348642\t41.379718\tConesville city\tIA\tIowa\tMuscatine County\t418\t44.1\t26.4\t9.2\t23195\t123529\t0.57\t52739\tObama\t52739\t0.00105557\t52739.0\n7145\t-91.166428\t41.571554\tAtalissa city\tIA\tIowa\tMuscatine County\t304\t41.7\t9.3\t6.3\t21774\t106250\t0.57\t52720\tObama\t52720\t0.000767687\t52720.0\n7146\t-91.018694\t41.598259999999996\tWilton city\tIA\tIowa\tMuscatine County\t3021\t35.6\t20.1\t7.2\t25803\t109890\t0.57\t52778\tObama\t52778\t0.007628891\t52778.0\n7147\t-91.128478\t41.347184000000006\tFruitland city\tIA\tIowa\tMuscatine County\t782\t40.6\t13.2\t7.8\t24154\t125284\t0.57\t52749\tObama\t52749\t0.001974774\t52749.0\n7148\t-91.263224\t41.572695\tWest Liberty city\tIA\tIowa\tMuscatine County\t3509\t33.6\t20.0\t9.3\t20270\t115036\t0.57\t52776\tObama\t52776\t0.00886123\t52776.0\n7149\t-91.306876\t41.481747\tNichols city\tIA\tIowa\tMuscatine County\t363\t40.8\t19.3\t9.6\t18517\t100521\t0.57\t52766\tObama\t52766\t0.0009166789999999999\t52766.0\n7150\t-90.85667\t41.591233\tStockton city\tIA\tIowa\tMuscatine County\t187\t39.7\t11.0\t10.1\t22404\t127083\t0.57\t52769\tObama\t52769\t0.000472229\t52769.0\n7151\t-95.65606\t43.181339\tSanborn city\tIA\tIowa\tO'Brien County\t1351\t48.6\t15.3\t6.0\t20271\t81889\t0.2682\t51248\tObama\t51248\t0.003411662\t51248.0\n7152\t-95.477013\t43.178989\tHartley city\tIA\tIowa\tO'Brien County\t1578\t42.5\t15.3\t2.9\t19843\t66500\t0.2682\t51346\tObama\t51346\t0.003984902\t51346.0\n7153\t-95.744123\t43.11505\tArcher city\tIA\tIowa\tO'Brien County\t122\t37.1\t10.1\t6.9\t19353\t67857\t0.2682\t51231\tObama\t51231\t0.000308085\t51231.0\n7154\t-95.620901\t43.086382\tPrimghar city\tIA\tIowa\tO'Brien County\t743\t48.6\t19.8\t5.4\t20257\t55800\t0.2682\t51245\tObama\t51245\t0.0018762879999999998\t51245.0\n7155\t-95.551524\t42.945013\tCalumet city\tIA\tIowa\tO'Brien County\t164\t45.0\t17.2\t4.3\t20341\t80000\t0.2682\t51029\tObama\t51029\t0.00041414699999999996\t51029.0\n7156\t-95.494961\t42.972825\tSutherland city\tIA\tIowa\tO'Brien County\t595\t49.5\t12.3\t6.9\t22678\t49167\t0.2682\t51058\tObama\t51058\t0.001502545\t51058.0\n7157\t-95.687466\t42.979746999999996\tPaullina city\tIA\tIowa\tO'Brien County\t939\t50.9\t19.3\t6.9\t20548\t70652\t0.2682\t51046\tObama\t51046\t0.0023712439999999998\t51046.0\n7158\t-95.841585\t43.180061\tSheldon city\tIA\tIowa\tO'Brien County\t4718\t39.1\t19.5\t7.1\t22882\t100720\t0.2682\t51201\tObama\t51201\t0.011914302\t51201.0\n7159\t-95.43675999999999\t43.444901\tHarris city\tIA\tIowa\tOsceola County\t180\t39.8\t14.4\t7.3\t19065\t70000\t0.2855\t51345\tObama\t51345\t0.000454552\t51345.0\n7160\t-95.608885\t43.286749\tMelvin city\tIA\tIowa\tOsceola County\t232\t47.9\t13.2\t3.8\t23551\t48333\t0.2855\t51350\tObama\t51350\t0.000585866\t51350.0\n7161\t-95.792612\t43.308706\tAshton city\tIA\tIowa\tOsceola County\t430\t40.2\t18.0\t7.4\t20029\t72083\t0.2855\t51232\tObama\t51232\t0.001085873\t51232.0\n7162\t-95.74436\t43.400888\tSibley city\tIA\tIowa\tOsceola County\t2610\t43.6\t18.2\t6.1\t22144\t84020\t0.2855\t51249\tObama\t51249\t0.006590998000000001\t51249.0\n7163\t-95.536551\t43.418137\tOcheyedan city\tIA\tIowa\tOsceola County\t476\t39.3\t11.4\t5.0\t15769\t60000\t0.2855\t51354\tObama\t51354\t0.001202036\t51354.0\n7164\t-95.29362900000001\t40.607991\tNorthboro city\tIA\tIowa\tPage County\t53\t43.3\t17.5\t6.7\t22008\t82500\t0.3691\t51647\tObama\t51647\t0.00013384\t51647.0\n7165\t-95.22138100000001\t40.580774\tBlanchard city\tIA\tIowa\tPage County\t54\t43.3\t17.5\t6.5\t21964\t86667\t0.3691\t51630\tObama\t51630\t0.000136365\t51630.0\n7166\t-95.154402\t40.735318\tYorktown city\tIA\tIowa\tPage County\t79\t47.1\t19.7\t12.5\t19611\t62500\t0.3691\t51636\tObama\t51636\t0.000199498\t51636.0\n7167\t-95.031212\t40.580671\tBraddyville city\tIA\tIowa\tPage County\t157\t41.1\t18.1\t5.9\t21216\t68000\t0.3691\t51631\tObama\t51631\t0.00039647\t51631.0\n7168\t-95.23486700000001\t40.656061\tCoin city\tIA\tIowa\tPage County\t243\t46.2\t19.5\t12.9\t19600\t61429\t0.3691\t51636\tObama\t51636\t0.000613645\t51636.0\n7169\t-95.034013\t40.738007\tClarinda city\tIA\tIowa\tPage County\t5550\t38.4\t17.8\t15.0\t21092\t88786\t0.3691\t51632\tObama\t51632\t0.01401534\t51632.0\n7170\t-95.035263\t40.657352\tShambaugh city\tIA\tIowa\tPage County\t187\t41.3\t14.8\t10.0\t23163\t88000\t0.3691\t51631\tObama\t51631\t0.000472229\t51631.0\n7171\t-95.01659699999999\t40.848110999999996\tHepburn city\tIA\tIowa\tPage County\t37\t48.3\t21.4\t4.3\t30835\t108333\t0.3691\t51632\tObama\t51632\t9.340000000000001e-05\t51632.0\n7172\t-95.121116\t40.621184\tCollege Springs city\tIA\tIowa\tPage County\t219\t41.0\t17.7\t5.9\t21262\t65000\t0.3691\t51637\tObama\t51637\t0.000553038\t51637.0\n7173\t-95.368936\t40.758983\tShenandoah city\tIA\tIowa\tPage County\t5108\t42.4\t20.8\t7.8\t21785\t72292\t0.3691\t51601\tObama\t51601\t0.012899164\t51601.0\n7174\t-95.303789\t40.832678\tEssex city\tIA\tIowa\tPage County\t767\t40.6\t16.3\t8.5\t21579\t64516\t0.3691\t51638\tObama\t51638\t0.001936895\t51638.0\n7175\t-94.737778\t42.97953\tCurlew city\tIA\tIowa\tPalo Alto County\t54\t45.6\t7.7\t3.8\t18856\t47000\t0.4377\t50527\tObama\t50527\t0.000136365\t50527.0\n7176\t-94.55148100000001\t43.089813\tCylinder city\tIA\tIowa\tPalo Alto County\t106\t38.5\t13.2\t4.5\t20587\t55000\t0.4377\t50528\tObama\t50528\t0.00026768\t50528.0\n7177\t-94.680145\t43.114614\tEmmetsburg city\tIA\tIowa\tPalo Alto County\t3746\t44.1\t18.8\t5.3\t23064\t85104\t0.4377\t50536\tObama\t50536\t0.009459723\t50536.0\n7178\t-94.526912\t43.026590999999996\tRodman city\tIA\tIowa\tPalo Alto County\t54\t39.2\t14.3\t5.9\t20581\t80000\t0.4377\t50597\tObama\t50597\t0.000136365\t50597.0\n7179\t-94.83354\t43.039569\tAyrshire city\tIA\tIowa\tPalo Alto County\t186\t44.3\t14.1\t5.3\t20275\t77143\t0.4377\t50515\tObama\t50515\t0.000469703\t50515.0\n7180\t-94.440169\t42.9604\tWest Bend city\tIA\tIowa\tPalo Alto County\t741\t49.2\t13.6\t5.6\t22522\t70000\t0.4377\t50597\tObama\t50597\t0.0018712370000000002\t50597.0\n7181\t-94.898516\t43.130051\tRuthven city\tIA\tIowa\tPalo Alto County\t690\t44.1\t15.0\t10.0\t19763\t61905\t0.4377\t51358\tObama\t51358\t0.001742448\t51358.0\n7182\t-94.683542\t42.939526\tMallard city\tIA\tIowa\tPalo Alto County\t258\t46.8\t8.9\t3.3\t18973\t47500\t0.4377\t50562\tObama\t50562\t0.000651524\t50562.0\n7183\t-94.750575\t43.236731\tGraettinger city\tIA\tIowa\tPalo Alto County\t818\t39.2\t16.7\t6.3\t18525\t64412\t0.4377\t51342\tObama\t51342\t0.002065684\t51342.0\n7184\t-95.96810699999999\t42.586498\tKingsley city\tIA\tIowa\tPlymouth County\t1287\t43.2\t18.6\t1.1\t25107\t103149\t0.3215\t51028\tObama\t51028\t0.003250044\t51028.0\n7185\t-96.194594\t42.894472\tStruble city\tIA\tIowa\tPlymouth County\t81\t40.0\t25.0\t3.8\t20995\t115625\t0.3215\t51036\tObama\t51036\t0.00020454799999999998\t51036.0\n7186\t-96.29635\t42.621939000000005\tHinton city\tIA\tIowa\tPlymouth County\t920\t41.5\t26.8\t8.3\t26920\t142021\t0.3215\t51024\tObama\t51024\t0.002323264\t51024.0\n7187\t-96.266787\t42.810984999999995\tBrunsville city\tIA\tIowa\tPlymouth County\t138\t43.6\t15.0\t4.3\t25643\t121154\t0.3215\t51008\tObama\t51008\t0.00034849\t51008.0\n7188\t-96.168364\t42.78494\tLe Mars city\tIA\tIowa\tPlymouth County\t9028\t37.0\t25.3\t3.8\t23440\t116765\t0.3215\t51031\tObama\t51031\t0.022798287\t51031.0\n7189\t-95.973536\t42.812653000000005\tRemsen city\tIA\tIowa\tPlymouth County\t1716\t39.0\t17.3\t2.0\t20169\t106531\t0.3215\t51050\tObama\t51050\t0.004333392\t51050.0\n7190\t-96.55710400000001\t42.826923\tAkron city\tIA\tIowa\tPlymouth County\t1462\t42.1\t15.3\t5.6\t21670\t101460\t0.3215\t51001\tObama\t51001\t0.0036919690000000002\t51001.0\n7191\t-96.05806700000001\t42.819804\tOyens city\tIA\tIowa\tPlymouth County\t126\t39.6\t18.1\t0.0\t19159\t104167\t0.3215\t51045\tObama\t51045\t0.000318186\t51045.0\n7192\t-96.250217\t42.721016999999996\tMerrill city\tIA\tIowa\tPlymouth County\t727\t39.4\t19.7\t5.2\t20514\t106690\t0.3215\t51038\tObama\t51038\t0.001835883\t51038.0\n7193\t-96.309671\t42.895571000000004\tCraig city\tIA\tIowa\tPlymouth County\t99\t39.2\t17.2\t1.6\t22767\t100000\t0.3215\t51027\tObama\t51027\t0.000250003\t51027.0\n7194\t-96.60587\t42.756147\tWestfield city\tIA\tIowa\tPlymouth County\t181\t44.6\t27.3\t3.3\t26768\t143750\t0.3215\t51062\tObama\t51062\t0.00045707699999999996\t51062.0\n7195\t-94.62256500000001\t42.876473\tPlover city\tIA\tIowa\tPocahontas County\t80\t47.5\t8.5\t3.8\t20785\t47500\t0.3777\t50573\tObama\t50573\t0.000202023\t50573.0\n7196\t-94.848316\t42.847735\tLaurens city\tIA\tIowa\tPocahontas County\t1322\t45.9\t16.3\t6.3\t20823\t69556\t0.3777\t50554\tObama\t50554\t0.0033384290000000004\t50554.0\n7197\t-94.897614\t42.658438000000004\tVarina city\tIA\tIowa\tPocahontas County\t82\t45.8\t20.7\t2.4\t20053\t71667\t0.3777\t50593\tObama\t50593\t0.000207073\t50593.0\n7198\t-94.666226\t42.736638\tPocahontas city\tIA\tIowa\tPocahontas County\t1788\t47.5\t24.9\t6.1\t22056\t69437\t0.3777\t50574\tObama\t50574\t0.004515212\t50574.0\n7199\t-94.598535\t42.629812\tPalmer city\tIA\tIowa\tPocahontas County\t185\t46.9\t11.9\t8.3\t21169\t52500\t0.3777\t50571\tObama\t50571\t0.000467178\t50571.0\n7200\t-94.531346\t42.812806\tRolfe city\tIA\tIowa\tPocahontas County\t599\t44.5\t14.0\t5.2\t20419\t45465\t0.3777\t50581\tObama\t50581\t0.0015126470000000002\t50581.0\n7201\t-94.8461\t42.581625\tFonda city\tIA\tIowa\tPocahontas County\t515\t47.9\t15.3\t6.2\t17911\t43125\t0.3777\t50540\tObama\t50540\t0.001300523\t50540.0\n7202\t-94.700829\t42.833073\tHavelock city\tIA\tIowa\tPocahontas County\t150\t47.1\t9.0\t4.1\t20659\t51667\t0.3777\t50546\tObama\t50546\t0.00037879300000000004\t50546.0\n7203\t-93.47894699999999\t41.648823\tAltoona city\tIA\tIowa\tPolk County\t13976\t32.9\t25.7\t5.9\t27802\t146282\t0.5613\t50009\tObama\t50009\t0.035293405\t50009.0\n7204\t-93.752461\t41.645575\tUrbandale city\tIA\tIowa\tPolk County\t40714\t37.9\t42.9\t4.9\t32881\t178865\t0.5613\t50322\tObama\t50322\t0.102814516\t50322.0\n7205\t-93.790548\t41.669376\tGrimes city\tIA\tIowa\tPolk County\t7030\t31.2\t37.5\t5.0\t29476\t146594\t0.5613\t50111\tObama\t50111\t0.017752764\t50111.0\n7206\t-93.52025400000001\t41.789972\tElkhart city\tIA\tIowa\tPolk County\t450\t39.6\t27.1\t5.3\t25511\t127679\t0.5613\t50073\tObama\t50073\t0.0011363789999999999\t50073.0\n7207\t-93.618453\t41.577289\tDes Moines city\tIA\tIowa\tPolk County\t208883\t35.5\t24.0\t11.5\t24623\t103369\t0.5613\t50309\tObama\t50309\t0.527489427\t50309.0\n7208\t-93.717528\t41.774077\tPolk City\tIA\tIowa\tPolk County\t3090\t39.1\t31.1\t3.7\t30565\t156025\t0.5613\t50226\tObama\t50226\t0.007803135\t50226.0\n7209\t-93.768036\t41.624703000000004\tClive city\tIA\tIowa\tPolk County\t15505\t36.4\t53.1\t4.7\t43951\t257682\t0.5613\t50325\tObama\t50325\t0.039154568\t50325.0\n7210\t-93.359887\t41.513889\tRunnells city\tIA\tIowa\tPolk County\t414\t41.1\t21.9\t2.5\t24583\t197115\t0.5613\t50237\tObama\t50237\t0.001045469\t50237.0\n7211\t-93.503819\t41.586447\tPleasant Hill city\tIA\tIowa\tPolk County\t8466\t38.5\t26.5\t6.9\t30369\t152159\t0.5613\t50317\tObama\t50317\t0.021379076\t50317.0\n7212\t-93.62383299999999\t41.682404999999996\tSaylorville CDP\tIA\tIowa\tPolk County\t4575\t40.4\t34.6\t3.7\t35164\t198618\t0.5613\t50313\tObama\t50313\t0.011553186000000002\t50313.0\n7213\t-93.712828\t41.604203999999996\tWindsor Heights city\tIA\tIowa\tPolk County\t4985\t44.3\t44.2\t5.9\t34923\t158684\t0.5613\t50322\tObama\t50322\t0.012588553\t50322.0\n7214\t-93.346019\t41.675339\tMitchellville city\tIA\tIowa\tPolk County\t2087\t34.8\t14.0\t7.9\t21685\t117224\t0.5613\t50169\tObama\t50169\t0.005270273000000001\t50169.0\n7215\t-93.462289\t41.689825\tBondurant city\tIA\tIowa\tPolk County\t3278\t34.3\t22.7\t4.7\t24329\t121106\t0.5613\t50035\tObama\t50035\t0.008277889\t50035.0\n7216\t-93.710851\t41.684286\tJohnston city\tIA\tIowa\tPolk County\t15775\t37.1\t53.4\t3.5\t41998\t240192\t0.5613\t50131\tObama\t50131\t0.039836395\t50131.0\n7217\t-93.608358\t41.815452\tAlleman city\tIA\tIowa\tPolk County\t535\t39.1\t31.2\t5.2\t23991\t161458\t0.5613\t50007\tObama\t50007\t0.0013510279999999998\t50007.0\n7218\t-93.745285\t41.584908\tWest Des Moines city\tIA\tIowa\tPolk County\t55571\t34.2\t50.6\t4.5\t37295\t194989\t0.5613\t50265\tObama\t50265\t0.140332698\t50265.0\n7219\t-93.603222\t41.722307\tAnkeny city\tIA\tIowa\tPolk County\t37873\t33.9\t42.6\t4.8\t32075\t176732\t0.5613\t50021\tObama\t50021\t0.09564017699999999\t50021.0\n7220\t-95.607065\t41.230577000000004\tTreynor city\tIA\tIowa\tPottawattamie County\t968\t41.7\t28.0\t4.7\t28182\t140169\t0.4644\t51575\tObama\t51575\t0.002444477\t51575.0\n7221\t-95.426854\t41.191649\tMacedonia city\tIA\tIowa\tPottawattamie County\t328\t44.9\t21.3\t8.3\t20298\t108824\t0.4644\t51549\tObama\t51549\t0.0008282939999999999\t51549.0\n7222\t-95.417263\t41.236546999999995\tCarson city\tIA\tIowa\tPottawattamie County\t668\t42.4\t17.5\t12.3\t24694\t107108\t0.4644\t51525\tObama\t51525\t0.001686891\t51525.0\n7223\t-95.684197\t41.328075\tMcClelland city\tIA\tIowa\tPottawattamie County\t135\t40.6\t19.3\t4.0\t25236\t166667\t0.4644\t51576\tObama\t51576\t0.000340914\t51576.0\n7224\t-95.363725\t41.392034\tHancock city\tIA\tIowa\tPottawattamie County\t188\t45.2\t19.0\t7.4\t23278\t100781\t0.4644\t51536\tObama\t51536\t0.00047475400000000003\t51536.0\n7225\t-95.917067\t41.288294\tCarter Lake city\tIA\tIowa\tPottawattamie County\t3314\t38.9\t10.3\t10.1\t22132\t84872\t0.4644\t51510\tObama\t51510\t0.0083688\t51510.0\n7226\t-95.541593\t41.467371\tMinden city\tIA\tIowa\tPottawattamie County\t590\t41.0\t18.9\t1.5\t24560\t126389\t0.4644\t51553\tObama\t51553\t0.001489919\t51553.0\n7227\t-95.857148\t41.364728\tCrescent city\tIA\tIowa\tPottawattamie County\t589\t44.7\t21.0\t3.2\t29722\t162500\t0.4644\t51526\tObama\t51526\t0.001487394\t51526.0\n7228\t-95.22064\t41.488555\tWalnut city\tIA\tIowa\tPottawattamie County\t901\t40.6\t15.7\t2.4\t21162\t94194\t0.4644\t51577\tObama\t51577\t0.002275283\t51577.0\n7229\t-95.85973800000001\t41.239913\tCouncil Bluffs city\tIA\tIowa\tPottawattamie County\t60288\t36.4\t16.6\t7.9\t24178\t102972\t0.4644\t51501\tObama\t51501\t0.152244475\t51501.0\n7230\t-95.3359\t41.483646\tAvoca city\tIA\tIowa\tPottawattamie County\t1659\t43.2\t18.5\t6.4\t23209\t102539\t0.4644\t51521\tObama\t51521\t0.00418945\t51521.0\n7231\t-95.396561\t41.307860999999995\tOakland city\tIA\tIowa\tPottawattamie County\t1435\t41.2\t15.9\t4.5\t22297\t104876\t0.4644\t51560\tObama\t51560\t0.003623786\t51560.0\n7232\t-95.616954\t41.451622\tNeola city\tIA\tIowa\tPottawattamie County\t877\t39.0\t17.7\t6.7\t24404\t117361\t0.4644\t51559\tObama\t51559\t0.002214676\t51559.0\n7233\t-95.680802\t41.385484000000005\tUnderwood city\tIA\tIowa\tPottawattamie County\t720\t37.4\t18.0\t3.2\t23112\t124231\t0.4644\t51576\tObama\t51576\t0.0018182060000000002\t51576.0\n7234\t-92.37321800000001\t41.581238\tDeep River city\tIA\tIowa\tPoweshiek County\t275\t42.9\t7.9\t8.3\t21318\t86429\t0.537\t52222\tObama\t52222\t0.000694454\t52222.0\n7235\t-92.343085\t41.649153999999996\tGuernsey city\tIA\tIowa\tPoweshiek County\t67\t43.0\t8.7\t7.9\t21260\t90000\t0.537\t52221\tObama\t52221\t0.000169194\t52221.0\n7236\t-92.527672\t41.583257\tMontezuma city\tIA\tIowa\tPoweshiek County\t1408\t42.1\t16.7\t5.1\t24114\t94107\t0.537\t50171\tObama\t50171\t0.003555603\t50171.0\n7237\t-92.70506999999999\t41.579658\tSearsboro city\tIA\tIowa\tPoweshiek County\t145\t43.6\t15.0\t7.6\t21127\t103571\t0.537\t50242\tObama\t50242\t0.000366167\t50242.0\n7238\t-92.445413\t41.731184000000006\tBrooklyn city\tIA\tIowa\tPoweshiek County\t1341\t43.1\t16.6\t6.2\t21422\t93750\t0.537\t52211\tObama\t52211\t0.0033864090000000004\t52211.0\n7239\t-92.557466\t41.707595\tMalcom city\tIA\tIowa\tPoweshiek County\t342\t43.6\t12.9\t7.7\t22625\t109524\t0.537\t50157\tObama\t50157\t0.0008636480000000001\t50157.0\n7240\t-92.724532\t41.740177\tGrinnell city\tIA\tIowa\tPoweshiek County\t8995\t35.8\t28.2\t6.4\t23751\t111172\t0.537\t50112\tObama\t50112\t0.022714952000000004\t50112.0\n7241\t-92.345396\t41.786175\tHartwick city\tIA\tIowa\tPoweshiek County\t88\t44.6\t22.2\t10.7\t23572\t89000\t0.537\t52232\tObama\t52232\t0.000222225\t52232.0\n7242\t-94.108755\t40.840495000000004\tEllston city\tIA\tIowa\tRinggold County\t53\t52.5\t19.0\t4.2\t21462\t75000\t0.4563\t50074\tObama\t50074\t0.00013384\t50074.0\n7243\t-94.340276\t40.663173\tDelphos city\tIA\tIowa\tRinggold County\t23\t38.8\t11.1\t7.1\t20290\t106250\t0.4563\t50835\tObama\t50835\t5.8099999999999996e-05\t50835.0\n7244\t-94.36124000000001\t40.703943\tBenton city\tIA\tIowa\tRinggold County\t37\t48.3\t14.3\t8.7\t20186\t85000\t0.4563\t50835\tObama\t50835\t9.340000000000001e-05\t50835.0\n7245\t-94.34213100000001\t40.810472\tDiagonal city\tIA\tIowa\tRinggold County\t299\t40.3\t9.1\t6.7\t16390\t51875\t0.4563\t50845\tObama\t50845\t0.000755061\t50845.0\n7246\t-94.238069\t40.713848\tMount Ayr city\tIA\tIowa\tRinggold County\t1781\t46.4\t17.0\t6.0\t18805\t73026\t0.4563\t50854\tObama\t50854\t0.004497535\t50854.0\n7247\t-94.19582199999999\t40.852740999999995\tTingley city\tIA\tIowa\tRinggold County\t160\t51.9\t18.7\t4.1\t21340\t78000\t0.4563\t50863\tObama\t50863\t0.000404046\t50863.0\n7248\t-94.38629\t40.606821000000004\tRedding city\tIA\tIowa\tRinggold County\t73\t40.5\t6.3\t3.3\t15513\t70000\t0.4563\t50860\tObama\t50860\t0.00018434599999999997\t50860.0\n7249\t-94.050188\t40.710248\tKellerton city\tIA\tIowa\tRinggold County\t354\t36.2\t7.4\t5.3\t15352\t49231\t0.4563\t50133\tObama\t50133\t0.000893951\t50133.0\n7250\t-94.411902\t40.673144\tMaloy city\tIA\tIowa\tRinggold County\t26\t40.0\t10.0\t6.3\t20113\t80000\t0.4563\t50836\tObama\t50836\t6.57e-05\t50836.0\n7251\t-94.050651\t40.807563\tBeaconsfield city\tIA\tIowa\tRinggold County\t10\t66.3\t22.2\t0.0\t22023\t112500\t0.4563\t50074\tObama\t50074\t2.5300000000000002e-05\t50074.0\n7252\t-95.044652\t42.305857\tLake View city\tIA\tIowa\tSac County\t1174\t52.5\t13.8\t7.1\t20863\t86979\t0.4011\t51450\tObama\t51450\t0.002964686\t51450.0\n7253\t-95.09235\t42.267225\tWall Lake city\tIA\tIowa\tSac County\t757\t41.6\t12.4\t3.5\t20821\t75278\t0.4011\t51466\tObama\t51466\t0.001911642\t51466.0\n7254\t-95.296273\t42.496496\tSchaller city\tIA\tIowa\tSac County\t698\t38.4\t17.6\t5.8\t20602\t63600\t0.4011\t51053\tObama\t51053\t0.00176265\t51053.0\n7255\t-95.254271\t42.311714\tOdebolt city\tIA\tIowa\tSac County\t1032\t45.5\t17.6\t5.3\t18696\t64559\t0.4011\t51458\tObama\t51458\t0.002606096\t51458.0\n7256\t-95.152324\t42.461428999999995\tEarly city\tIA\tIowa\tSac County\t532\t41.9\t14.2\t3.8\t18692\t66250\t0.4011\t50535\tObama\t50535\t0.0013434520000000002\t50535.0\n7257\t-94.877728\t42.24944\tAuburn city\tIA\tIowa\tSac County\t264\t39.0\t8.8\t5.0\t25053\t66000\t0.4011\t51433\tObama\t51433\t0.000666676\t51433.0\n7258\t-95.08712299999999\t42.515198\tNemaha city\tIA\tIowa\tSac County\t96\t43.3\t15.2\t3.6\t21472\t90000\t0.4011\t50567\tObama\t50567\t0.000242428\t50567.0\n7259\t-94.998003\t42.421681\tSac City\tIA\tIowa\tSac County\t2186\t47.3\t19.1\t6.8\t22160\t63630\t0.4011\t50583\tObama\t50583\t0.005520276\t50583.0\n7260\t-94.856453\t42.423404999999995\tLytton city\tIA\tIowa\tSac County\t280\t47.3\t22.4\t4.0\t18605\t61429\t0.4011\t50561\tObama\t50561\t0.00070708\t50561.0\n7261\t-90.780722\t41.599806\tWalcott city\tIA\tIowa\tScott County\t1571\t38.4\t19.8\t6.1\t24488\t110995\t0.5612\t52773\tObama\t52773\t0.003967225\t52773.0\n7262\t-90.67436500000001\t41.691202000000004\tDonahue city\tIA\tIowa\tScott County\t320\t41.4\t25.7\t5.5\t25960\t165179\t0.5612\t52746\tObama\t52746\t0.000808092\t52746.0\n7263\t-90.57996899999999\t41.639016999999996\tEldridge city\tIA\tIowa\tScott County\t5528\t37.4\t37.3\t6.6\t27502\t159916\t0.5612\t52748\tObama\t52748\t0.013959784\t52748.0\n7264\t-90.357384\t41.673351000000004\tPrinceton city\tIA\tIowa\tScott County\t960\t41.5\t16.1\t7.4\t22789\t108962\t0.5612\t52768\tObama\t52768\t0.002424275\t52768.0\n7265\t-90.782257\t41.742098999999996\tDixon city\tIA\tIowa\tScott County\t264\t43.1\t15.1\t6.6\t22114\t141667\t0.5612\t52745\tObama\t52745\t0.000666676\t52745.0\n7266\t-90.446001\t41.7434\tMcCausland city\tIA\tIowa\tScott County\t352\t38.9\t19.7\t5.5\t24248\t130921\t0.5612\t52758\tObama\t52758\t0.0008889010000000001\t52758.0\n7267\t-90.463474\t41.536751\tRiverdale city\tIA\tIowa\tScott County\t674\t38.0\t56.2\t6.6\t35498\t241026\t0.5612\t52722\tObama\t52722\t0.0017020429999999999\t52722.0\n7268\t-90.718193\t41.649539000000004\tMaysville city\tIA\tIowa\tScott County\t155\t42.3\t15.7\t7.9\t22295\t135714\t0.5612\t52773\tObama\t52773\t0.000391419\t52773.0\n7269\t-90.878101\t41.715896\tNew Liberty city\tIA\tIowa\tScott County\t117\t42.9\t15.0\t6.0\t21818\t162500\t0.5612\t52765\tObama\t52765\t0.00029545900000000003\t52765.0\n7270\t-90.765125\t41.509561\tBlue Grass city\tIA\tIowa\tScott County\t1236\t41.9\t15.6\t8.4\t25274\t119318\t0.5612\t52726\tObama\t52726\t0.0031212540000000004\t52726.0\n7271\t-90.581333\t41.693897\tLong Grove city\tIA\tIowa\tScott County\t685\t40.8\t29.2\t5.2\t27204\t172581\t0.5612\t52748\tObama\t52748\t0.001729821\t52748.0\n7272\t-90.605207\t41.555689\tDavenport city\tIA\tIowa\tScott County\t100981\t35.2\t25.1\t9.7\t23867\t105787\t0.5612\t52804\tObama\t52804\t0.25500596\t52804.0\n7273\t-90.72898\t41.466033\tBuffalo city\tIA\tIowa\tScott County\t1371\t43.3\t24.9\t5.2\t29959\t160511\t0.5612\t52728\tObama\t52728\t0.003462168\t52728.0\n7274\t-90.539423\t41.692302000000005\tPark View CDP\tIA\tIowa\tScott County\t2357\t32.8\t25.9\t11.7\t26271\t149843\t0.5612\t52756\tObama\t52756\t0.0059521\t52756.0\n7275\t-90.365537\t41.597065\tLe Claire city\tIA\tIowa\tScott County\t3822\t39.0\t24.6\t4.3\t26866\t117124\t0.5612\t52753\tObama\t52753\t0.009651645\t52753.0\n7276\t-90.45368\t41.555501\tPanorama Park city\tIA\tIowa\tScott County\t133\t46.5\t49.0\t6.2\t43407\t225000\t0.5612\t52722\tObama\t52722\t0.00033586300000000005\t52722.0\n7277\t-90.476404\t41.565401\tBettendorf city\tIA\tIowa\tScott County\t33279\t41.1\t42.4\t6.3\t32803\t147928\t0.5612\t52722\tObama\t52722\t0.084039011\t52722.0\n7278\t-95.395177\t41.719885999999995\tWestphalia city\tIA\tIowa\tShelby County\t140\t39.8\t9.5\t2.5\t18631\t93333\t0.3808\t51578\tObama\t51578\t0.00035354\t51578.0\n7279\t-95.206793\t41.79015\tIrwin city\tIA\tIowa\tShelby County\t387\t43.0\t21.6\t5.9\t19055\t77143\t0.3808\t51446\tObama\t51446\t0.000977286\t51446.0\n7280\t-95.450604\t41.513194\tShelby city\tIA\tIowa\tShelby County\t690\t42.4\t14.7\t3.0\t19720\t99000\t0.3808\t51570\tObama\t51570\t0.001742448\t51570.0\n7281\t-95.418904\t41.776119\tEarling city\tIA\tIowa\tShelby County\t415\t45.1\t12.3\t3.3\t19502\t97692\t0.3808\t51530\tObama\t51530\t0.001047994\t51530.0\n7282\t-95.326894\t41.649457\tHarlan city\tIA\tIowa\tShelby County\t4931\t44.4\t23.1\t4.1\t23884\t103454\t0.3808\t51537\tObama\t51537\t0.012452188000000001\t51537.0\n7283\t-95.34031800000001\t41.825653\tDefiance city\tIA\tIowa\tShelby County\t391\t42.6\t9.0\t3.3\t18451\t87000\t0.3808\t51527\tObama\t51527\t0.000987387\t51527.0\n7284\t-95.51937099999999\t41.65045\tPortsmouth city\tIA\tIowa\tShelby County\t187\t40.0\t14.9\t0.9\t20176\t100000\t0.3808\t51565\tObama\t51565\t0.000472229\t51565.0\n7285\t-95.44493299999999\t41.594074\tTennant city\tIA\tIowa\tShelby County\t72\t42.5\t15.7\t2.2\t19555\t105000\t0.3808\t51574\tObama\t51574\t0.00018182099999999998\t51574.0\n7286\t-95.061565\t41.592912\tElk Horn city\tIA\tIowa\tShelby County\t643\t50.4\t15.9\t2.7\t23220\t90167\t0.3808\t51531\tObama\t51531\t0.001623759\t51531.0\n7287\t-95.47543\t41.726357\tPanama city\tIA\tIowa\tShelby County\t185\t40.0\t9.5\t1.9\t18678\t96250\t0.3808\t51562\tObama\t51562\t0.000467178\t51562.0\n7288\t-95.267381\t41.728043\tKirkman city\tIA\tIowa\tShelby County\t86\t43.5\t8.6\t3.8\t18424\t85000\t0.3808\t51447\tObama\t51447\t0.000217175\t51447.0\n7289\t-96.321831\t42.974833000000004\tIreton city\tIA\tIowa\tSioux County\t610\t39.4\t15.0\t1.4\t17320\t105556\t0.156\t51027\tObama\t51027\t0.001540425\t51027.0\n7290\t-96.00765899999999\t42.986414\tAlton city\tIA\tIowa\tSioux County\t1211\t38.9\t19.4\t3.1\t19668\t99394\t0.156\t51003\tObama\t51003\t0.003058122\t51003.0\n7291\t-96.48314\t43.001883\tHawarden city\tIA\tIowa\tSioux County\t2404\t42.3\t17.9\t9.3\t22105\t81549\t0.156\t51023\tObama\t51023\t0.006070789\t51023.0\n7292\t-96.51450200000001\t42.916343\tChatsworth city\tIA\tIowa\tSioux County\t93\t43.3\t15.2\t7.3\t21882\t97500\t0.156\t51011\tObama\t51011\t0.00023485200000000002\t51011.0\n7293\t-96.182858\t42.966046\tMaurice city\tIA\tIowa\tSioux County\t245\t37.5\t19.3\t1.8\t21979\t108088\t0.156\t51036\tObama\t51036\t0.000618695\t51036.0\n7294\t-96.171922\t43.075404\tSioux Center city\tIA\tIowa\tSioux County\t6664\t28.7\t33.8\t4.0\t21660\t146406\t0.156\t51250\tObama\t51250\t0.016828509\t51250.0\n7295\t-95.90331\t43.073772\tHospers city\tIA\tIowa\tSioux County\t652\t39.8\t16.2\t2.2\t19153\t89375\t0.156\t51238\tObama\t51238\t0.001646487\t51238.0\n7296\t-96.297827\t43.203328000000006\tRock Valley city\tIA\tIowa\tSioux County\t2702\t40.8\t20.6\t3.0\t21668\t108757\t0.156\t51247\tObama\t51247\t0.006823324\t51247.0\n7297\t-96.057236\t43.002601\tOrange City\tIA\tIowa\tSioux County\t5644\t28.3\t36.4\t5.0\t20350\t128728\t0.156\t51041\tObama\t51041\t0.014252717\t51041.0\n7298\t-96.132601\t43.189794\tHull city\tIA\tIowa\tSioux County\t2042\t34.6\t17.4\t4.0\t18360\t105134\t0.156\t51239\tObama\t51239\t0.005156635\t51239.0\n7299\t-95.93454100000001\t43.244372\tMatlock city\tIA\tIowa\tSioux County\t95\t37.9\t13.1\t5.4\t16434\t102083\t0.156\t51244\tObama\t51244\t0.000239902\t51244.0\n7300\t-95.874981\t42.985246000000004\tGranville city\tIA\tIowa\tSioux County\t315\t40.6\t18.7\t6.5\t19115\t95000\t0.156\t51022\tObama\t51022\t0.000795465\t51022.0\n7301\t-96.003074\t43.190171\tBoyden city\tIA\tIowa\tSioux County\t714\t37.7\t14.4\t3.4\t21499\t95294\t0.156\t51234\tObama\t51234\t0.001803055\t51234.0\n7302\t-93.531741\t41.899505\tCambridge city\tIA\tIowa\tStory County\t824\t37.4\t23.2\t4.0\t21442\t103241\t0.5555\t50046\tObama\t50046\t0.002080836\t50046.0\n7303\t-93.319887\t42.016534\tColo city\tIA\tIowa\tStory County\t846\t36.3\t24.0\t4.5\t20965\t81538\t0.5555\t50056\tObama\t50056\t0.002136392\t50056.0\n7304\t-93.66415400000001\t41.950547\tKelley city\tIA\tIowa\tStory County\t299\t35.1\t26.3\t2.7\t22652\t120109\t0.5555\t50134\tObama\t50134\t0.000755061\t50134.0\n7305\t-93.503452\t42.166304\tRoland city\tIA\tIowa\tStory County\t1336\t37.9\t31.9\t1.5\t23321\t122739\t0.5555\t50236\tObama\t50236\t0.003373783\t50236.0\n7306\t-93.395482\t41.891239\tMaxwell city\tIA\tIowa\tStory County\t833\t38.0\t16.0\t4.4\t21309\t93333\t0.5555\t50161\tObama\t50161\t0.002103564\t50161.0\n7307\t-93.30658000000001\t41.902146\tCollins city\tIA\tIowa\tStory County\t490\t41.3\t15.5\t3.4\t19526\t95000\t0.5555\t50055\tObama\t50055\t0.00123739\t50055.0\n7308\t-93.648064\t42.107793\tGilbert city\tIA\tIowa\tStory County\t1000\t36.4\t36.2\t1.4\t22471\t108681\t0.5555\t50105\tObama\t50105\t0.002525287\t50105.0\n7309\t-93.390823\t42.165275\tMcCallsburg city\tIA\tIowa\tStory County\t312\t45.3\t16.8\t3.7\t20222\t90000\t0.5555\t50154\tObama\t50154\t0.000787889\t50154.0\n7310\t-93.29722199999999\t42.158883\tZearing city\tIA\tIowa\tStory County\t562\t38.1\t12.4\t4.2\t22964\t73462\t0.5555\t50278\tObama\t50278\t0.001419211\t50278.0\n7311\t-93.627403\t42.023796000000004\tAmes city\tIA\tIowa\tStory County\t58009\t24.6\t61.4\t7.6\t24271\t161494\t0.5555\t50010\tObama\t50010\t0.146489347\t50010.0\n7312\t-93.693056\t41.866978\tSheldahl city\tIA\tIowa\tStory County\t366\t40.1\t29.5\t4.7\t25594\t124000\t0.5555\t50243\tObama\t50243\t0.000924255\t50243.0\n7313\t-93.68609000000001\t41.879405\tSlater city\tIA\tIowa\tStory County\t1300\t39.7\t26.5\t4.1\t26251\t107400\t0.5555\t50244\tObama\t50244\t0.003282872\t50244.0\n7314\t-93.59145699999999\t42.186549\tStory City\tIA\tIowa\tStory County\t3436\t43.6\t31.6\t5.4\t24437\t118060\t0.5555\t50248\tObama\t50248\t0.008676885\t50248.0\n7315\t-93.453684\t42.017213\tNevada city\tIA\tIowa\tStory County\t6525\t37.8\t25.6\t5.5\t23592\t103204\t0.5555\t50201\tObama\t50201\t0.016477495\t50201.0\n7316\t-93.60176700000001\t41.896975\tHuxley city\tIA\tIowa\tStory County\t2392\t35.0\t36.5\t4.9\t24332\t113636\t0.5555\t50124\tObama\t50124\t0.006040485\t50124.0\n7317\t-92.715086\t42.18608\tGladbrook city\tIA\tIowa\tTama County\t996\t45.7\t21.0\t6.0\t20965\t91458\t0.5288\t50635\tObama\t50635\t0.002515185\t50635.0\n7318\t-92.31610500000001\t42.005472999999995\tElberon city\tIA\tIowa\tTama County\t240\t38.4\t3.0\t5.8\t20614\t88750\t0.5288\t52225\tObama\t52225\t0.000606069\t52225.0\n7319\t-92.580388\t41.990208\tToledo city\tIA\tIowa\tTama County\t2497\t40.9\t15.9\t8.6\t23417\t93190\t0.5288\t52342\tObama\t52342\t0.00630564\t52342.0\n7320\t-92.575974\t41.963894\tTama city\tIA\tIowa\tTama County\t2709\t37.3\t10.4\t9.9\t18809\t83514\t0.5288\t52339\tObama\t52339\t0.006841001\t52339.0\n7321\t-92.714987\t41.980271\tMontour city\tIA\tIowa\tTama County\t312\t36.1\t7.7\t7.7\t16793\t82778\t0.5288\t50173\tObama\t50173\t0.000787889\t50173.0\n7322\t-92.40357900000001\t42.079215999999995\tClutier city\tIA\tIowa\tTama County\t231\t43.2\t16.8\t6.4\t21557\t86875\t0.5288\t52217\tObama\t52217\t0.000583341\t52217.0\n7323\t-92.691399\t42.263467\tLincoln city\tIA\tIowa\tTama County\t170\t44.8\t18.5\t7.4\t19902\t89000\t0.5288\t50652\tObama\t50652\t0.000429299\t50652.0\n7324\t-92.38748000000001\t41.990981\tVining city\tIA\tIowa\tTama County\t69\t41.3\t2.1\t5.1\t20486\t90000\t0.5288\t52348\tObama\t52348\t0.000174245\t52348.0\n7325\t-92.308989\t42.172015\tDysart city\tIA\tIowa\tTama County\t1283\t42.8\t25.1\t4.6\t22558\t111314\t0.5288\t52224\tObama\t52224\t0.003239943\t52224.0\n7326\t-92.679161\t42.093465\tGarwin city\tIA\tIowa\tTama County\t569\t37.1\t12.0\t5.8\t24162\t74545\t0.5288\t50632\tObama\t50632\t0.0014368879999999999\t50632.0\n7327\t-92.465389\t42.191243\tTraer city\tIA\tIowa\tTama County\t1546\t44.6\t18.5\t7.0\t24006\t99634\t0.5288\t50675\tObama\t50675\t0.003904093\t50675.0\n7328\t-92.39453\t41.920445\tChelsea city\tIA\tIowa\tTama County\t305\t38.8\t10.5\t7.9\t19150\t65714\t0.5288\t52215\tObama\t52215\t0.0007702119999999999\t52215.0\n7329\t-94.900504\t40.73237\tNew Market city\tIA\tIowa\tTaylor County\t434\t42.3\t12.6\t5.4\t18037\t68125\t0.4214\t51646\tObama\t51646\t0.001095974\t51646.0\n7330\t-94.640497\t40.802977\tSharpsburg city\tIA\tIowa\tTaylor County\t90\t42.0\t12.9\t6.4\t16783\t63750\t0.4214\t50862\tObama\t50862\t0.000227276\t50862.0\n7331\t-94.471007\t40.803826\tClearfield city\tIA\tIowa\tTaylor County\t324\t50.1\t16.9\t3.9\t20016\t42500\t0.4214\t50840\tObama\t50840\t0.000818193\t50840.0\n7332\t-94.620103\t40.749268\tConway city\tIA\tIowa\tTaylor County\t55\t50.8\t18.6\t3.8\t19993\t42500\t0.4214\t50862\tObama\t50862\t0.000138891\t50862.0\n7333\t-94.551568\t40.901187\tLenox city\tIA\tIowa\tTaylor County\t1255\t43.5\t13.9\t7.2\t19204\t65526\t0.4214\t50851\tObama\t50851\t0.003169235\t50851.0\n7334\t-94.724098\t40.67112\tBedford city\tIA\tIowa\tTaylor County\t1494\t43.3\t14.6\t9.8\t20520\t59741\t0.4214\t50833\tObama\t50833\t0.003772778\t50833.0\n7335\t-94.743489\t40.760155\tGravity city\tIA\tIowa\tTaylor County\t207\t44.6\t17.7\t5.9\t18252\t54444\t0.4214\t50848\tObama\t50848\t0.0005227340000000001\t50848.0\n7336\t-94.477986\t40.616747\tBlockton city\tIA\tIowa\tTaylor County\t174\t44.8\t4.8\t7.0\t19651\t75625\t0.4214\t50836\tObama\t50836\t0.0004394\t50836.0\n7337\t-94.542949\t40.572631\tAthelstan city\tIA\tIowa\tTaylor County\t16\t46.3\t8.3\t11.1\t20003\t75000\t0.4214\t50836\tObama\t50836\t4.04e-05\t50836.0\n7338\t-94.264296\t40.901138\tShannon City\tIA\tIowa\tUnion County\t69\t46.7\t11.8\t2.6\t19385\t71250\t0.5108\t50861\tObama\t50861\t0.000174245\t50861.0\n7339\t-94.461718\t41.040286\tCromwell city\tIA\tIowa\tUnion County\t147\t45.5\t16.5\t6.1\t18706\t98750\t0.5108\t50801\tObama\t50801\t0.00037121699999999997\t50801.0\n7340\t-94.19535\t41.027662\tAfton city\tIA\tIowa\tUnion County\t908\t41.0\t8.8\t6.8\t17755\t63382\t0.5108\t50830\tObama\t50830\t0.00229296\t50830.0\n7341\t-94.364896\t41.059306\tCreston city\tIA\tIowa\tUnion County\t7326\t40.1\t14.9\t5.9\t22617\t80213\t0.5108\t50801\tObama\t50801\t0.018500249\t50801.0\n7342\t-94.219151\t40.948029999999996\tArispe city\tIA\tIowa\tUnion County\t88\t47.2\t10.6\t4.1\t19763\t75000\t0.5108\t50861\tObama\t50861\t0.000222225\t50861.0\n7343\t-94.056794\t41.127346\tLorimor city\tIA\tIowa\tUnion County\t402\t40.3\t3.6\t13.3\t17102\t58182\t0.5108\t50149\tObama\t50149\t0.001015165\t50149.0\n7344\t-94.04990500000001\t41.028965\tThayer city\tIA\tIowa\tUnion County\t68\t46.3\t16.0\t9.3\t22500\t106250\t0.5108\t50254\tObama\t50254\t0.00017171900000000003\t50254.0\n7345\t-94.456901\t40.953663\tKent city\tIA\tIowa\tUnion County\t64\t46.3\t18.2\t5.7\t18611\t100000\t0.5108\t50851\tObama\t50851\t0.00016161799999999998\t50851.0\n7346\t-91.936684\t40.618111\tMount Sterling city\tIA\tIowa\tVan Buren County\t40\t42.5\t14.8\t10.0\t19727\t80000\t0.3928\t52573\tObama\t52573\t0.000101011\t52573.0\n7347\t-92.162172\t40.671189\tMilton city\tIA\tIowa\tVan Buren County\t567\t37.6\t9.8\t7.8\t13568\t48519\t0.3928\t52570\tObama\t52570\t0.001431837\t52570.0\n7348\t-91.739024\t40.638855\tFarmington city\tIA\tIowa\tVan Buren County\t715\t44.8\t11.7\t10.1\t19142\t59397\t0.3928\t52626\tObama\t52626\t0.00180558\t52626.0\n7349\t-92.076346\t40.843872999999995\tDouds CDP\tIA\tIowa\tVan Buren County\t164\t46.8\t15.6\t10.5\t18654\t75000\t0.3928\t52588\tObama\t52588\t0.00041414699999999996\t52588.0\n7350\t-91.83334\t40.857246\tStockport city\tIA\tIowa\tVan Buren County\t285\t42.8\t15.0\t8.3\t18606\t68333\t0.3928\t52651\tObama\t52651\t0.000719707\t52651.0\n7351\t-91.96055\t40.734637\tKeosauqua city\tIA\tIowa\tVan Buren County\t1079\t49.2\t19.0\t6.7\t22138\t79615\t0.3928\t52565\tObama\t52565\t0.002724784\t52565.0\n7352\t-91.947296\t40.877687\tBirmingham city\tIA\tIowa\tVan Buren County\t453\t45.2\t10.5\t10.3\t18693\t71250\t0.3928\t52535\tObama\t52535\t0.001143955\t52535.0\n7353\t-92.068481\t40.642821999999995\tCantril city\tIA\tIowa\tVan Buren County\t258\t44.1\t15.9\t7.9\t19654\t78333\t0.3928\t52542\tObama\t52542\t0.000651524\t52542.0\n7354\t-92.080524\t40.822157000000004\tLeando CDP\tIA\tIowa\tVan Buren County\t135\t39.2\t15.4\t2.9\t16104\t78750\t0.3928\t52551\tObama\t52551\t0.000340914\t52551.0\n7355\t-91.800563\t40.701306\tBonaparte city\tIA\tIowa\tVan Buren County\t458\t37.5\t11.5\t7.9\t16616\t66429\t0.3928\t52620\tObama\t52620\t0.001156581\t52620.0\n7356\t-92.307203\t40.996803\tAgency city\tIA\tIowa\tWapello County\t642\t46.6\t13.5\t6.9\t23414\t98000\t0.5493\t52530\tObama\t52530\t0.001621234\t52530.0\n7357\t-92.503596\t41.142158\tKirkville city\tIA\tIowa\tWapello County\t232\t44.9\t17.8\t5.1\t21732\t87000\t0.5493\t52566\tObama\t52566\t0.000585866\t52566.0\n7358\t-92.627285\t41.166568\tEddyville city\tIA\tIowa\tWapello County\t1082\t36.5\t10.6\t6.6\t19930\t78387\t0.5493\t52553\tObama\t52553\t0.00273236\t52553.0\n7359\t-92.530454\t41.085949\tChillicothe city\tIA\tIowa\tWapello County\t98\t46.4\t18.1\t5.3\t21632\t85000\t0.5493\t52548\tObama\t52548\t0.000247478\t52548.0\n7360\t-92.418491\t41.019582\tOttumwa city\tIA\tIowa\tWapello County\t24549\t39.4\t18.8\t10.4\t20988\t71948\t0.5493\t52501\tObama\t52501\t0.061993259\t52501.0\n7361\t-92.634815\t40.961997\tBlakesburg city\tIA\tIowa\tWapello County\t384\t41.8\t16.5\t7.8\t22842\t76923\t0.5493\t52536\tObama\t52536\t0.00096971\t52536.0\n7362\t-92.217875\t40.917765\tEldon city\tIA\tIowa\tWapello County\t1044\t41.6\t7.1\t10.5\t15858\t49135\t0.5493\t52554\tObama\t52554\t0.002636399\t52554.0\n7363\t-93.738635\t41.373763000000004\tMartensdale city\tIA\tIowa\tWarren County\t530\t41.4\t15.7\t4.0\t24891\t154891\t0.4814\t50160\tObama\t50160\t0.001338402\t50160.0\n7364\t-93.474838\t41.366240999999995\tAckworth city\tIA\tIowa\tWarren County\t83\t42.5\t24.6\t10.0\t22805\t196875\t0.4814\t50001\tObama\t50001\t0.000209599\t50001.0\n7365\t-93.731059\t41.181598\tNew Virginia city\tIA\tIowa\tWarren County\t518\t44.2\t10.6\t14.3\t23558\t114130\t0.4814\t50210\tObama\t50210\t0.001308098\t50210.0\n7366\t-93.384896\t41.189926\tLacona city\tIA\tIowa\tWarren County\t324\t43.4\t13.8\t5.2\t20492\t90000\t0.4814\t50139\tObama\t50139\t0.000818193\t50139.0\n7367\t-93.566226\t41.361277\tIndianola city\tIA\tIowa\tWarren County\t14341\t35.8\t30.6\t7.0\t25328\t143886\t0.4814\t50125\tObama\t50125\t0.036215133999999996\t50125.0\n7368\t-93.405208\t41.457685999999995\tHartford city\tIA\tIowa\tWarren County\t903\t40.7\t19.3\t5.8\t23058\t106840\t0.4814\t50118\tObama\t50118\t0.0022803339999999997\t50118.0\n7369\t-93.43925300000001\t41.288672999999996\tMilo city\tIA\tIowa\tWarren County\t847\t38.8\t14.5\t8.6\t21282\t117453\t0.4814\t50166\tObama\t50166\t0.002138918\t50166.0\n7370\t-93.765484\t41.486356\tCumming city\tIA\tIowa\tWarren County\t185\t39.1\t34.5\t4.5\t31848\t171429\t0.4814\t50061\tObama\t50061\t0.000467178\t50061.0\n7371\t-93.649879\t41.412205\tSpring Hill city\tIA\tIowa\tWarren County\t113\t46.3\t20.7\t5.9\t29745\t205000\t0.4814\t50211\tObama\t50211\t0.000285357\t50211.0\n7372\t-93.488858\t41.522244\tCarlisle city\tIA\tIowa\tWarren County\t3749\t37.7\t26.0\t5.4\t25290\t130357\t0.4814\t50047\tObama\t50047\t0.009467299\t50047.0\n7373\t-93.38630400000001\t41.37066\tSandyville city\tIA\tIowa\tWarren County\t87\t41.5\t22.0\t4.3\t23266\t162500\t0.4814\t50001\tObama\t50001\t0.0002197\t50001.0\n7374\t-93.681597\t41.489672999999996\tNorwalk city\tIA\tIowa\tWarren County\t7722\t34.6\t27.4\t7.8\t28148\t154960\t0.4814\t50211\tObama\t50211\t0.019500263\t50211.0\n7375\t-93.733876\t41.307643\tSt. Marys city\tIA\tIowa\tWarren County\t135\t41.4\t16.5\t4.0\t29823\t160417\t0.4814\t50241\tObama\t50241\t0.000340914\t50241.0\n7376\t-91.701475\t41.487226\tKalona city\tIA\tIowa\tWashington County\t2462\t39.5\t17.3\t4.1\t20304\t127679\t0.4648\t52247\tObama\t52247\t0.006217255\t52247.0\n7377\t-91.81688100000001\t41.339999\tWest Chester city\tIA\tIowa\tWashington County\t165\t41.9\t18.6\t4.1\t20151\t117500\t0.4648\t52359\tObama\t52359\t0.000416672\t52359.0\n7378\t-91.57973\t41.48131\tRiverside city\tIA\tIowa\tWashington County\t982\t37.3\t22.6\t5.5\t22958\t128320\t0.4648\t52327\tObama\t52327\t0.002479831\t52327.0\n7379\t-91.536755\t41.213846999999994\tCrawfordsville city\tIA\tIowa\tWashington County\t316\t42.6\t27.7\t6.3\t22423\t107237\t0.4648\t52621\tObama\t52621\t0.0007979910000000001\t52621.0\n7380\t-91.554611\t41.290093\tAinsworth city\tIA\tIowa\tWashington County\t551\t38.4\t17.2\t5.2\t20928\t121591\t0.4648\t52201\tObama\t52201\t0.0013914329999999999\t52201.0\n7381\t-91.821239\t41.174132\tBrighton city\tIA\tIowa\tWashington County\t710\t38.9\t10.4\t10.8\t19367\t62632\t0.4648\t52540\tObama\t52540\t0.001792953\t52540.0\n7382\t-91.692419\t41.29866\tWashington city\tIA\tIowa\tWashington County\t7027\t42.2\t20.9\t7.2\t23303\t106309\t0.4648\t52353\tObama\t52353\t0.017745188000000002\t52353.0\n7383\t-91.835921\t41.469109\tWellman city\tIA\tIowa\tWashington County\t1463\t42.6\t24.3\t6.7\t19577\t100147\t0.4648\t52356\tObama\t52356\t0.0036944940000000004\t52356.0\n7384\t-93.49705\t40.86083\tHumeston city\tIA\tIowa\tWayne County\t500\t44.5\t13.5\t7.9\t16325\t62895\t0.4314\t50123\tObama\t50123\t0.001262643\t50123.0\n7385\t-93.451487\t40.63597\tClio city\tIA\tIowa\tWayne County\t91\t48.0\t14.7\t4.7\t22512\t35000\t0.4314\t50052\tObama\t50052\t0.000229801\t50052.0\n7386\t-93.150086\t40.74735\tPromise City\tIA\tIowa\tWayne County\t102\t46.1\t9.2\t6.0\t17162\t85000\t0.4314\t52583\tObama\t52583\t0.000257579\t52583.0\n7387\t-93.317479\t40.757549\tCorydon city\tIA\tIowa\tWayne County\t1458\t48.3\t19.6\t6.1\t20223\t72941\t0.4314\t50060\tObama\t50060\t0.003681868\t50060.0\n7388\t-93.368912\t40.70772\tAllerton city\tIA\tIowa\tWayne County\t499\t42.7\t9.0\t5.0\t19385\t38906\t0.4314\t50008\tObama\t50008\t0.001260118\t50008.0\n7389\t-93.523322\t40.586985999999996\tLineville city\tIA\tIowa\tWayne County\t272\t47.7\t13.9\t4.6\t22599\t41429\t0.4314\t50147\tObama\t50147\t0.000686878\t50147.0\n7390\t-93.305686\t40.849281\tMillerton city\tIA\tIowa\tWayne County\t47\t46.9\t8.6\t8.3\t17039\t70000\t0.4314\t50165\tObama\t50165\t0.000118688\t50165.0\n7391\t-93.12145799999999\t40.682423\tSeymour city\tIA\tIowa\tWayne County\t708\t46.2\t17.9\t1.5\t20632\t38684\t0.4314\t52590\tObama\t52590\t0.001787903\t52590.0\n7392\t-93.99662099999999\t42.469446999999995\tDuncombe city\tIA\tIowa\tWebster County\t482\t39.9\t12.9\t7.9\t22182\t83125\t0.5214\t50532\tObama\t50532\t0.0012171880000000001\t50532.0\n7393\t-94.071126\t42.262087\tDayton city\tIA\tIowa\tWebster County\t825\t43.2\t11.8\t9.5\t17288\t69444\t0.5214\t50530\tObama\t50530\t0.002083361\t50530.0\n7394\t-94.01800899999999\t42.59211\tVincent city\tIA\tIowa\tWebster County\t144\t46.6\t9.4\t1.3\t24574\t110417\t0.5214\t50594\tObama\t50594\t0.000363641\t50594.0\n7395\t-94.176925\t42.507165\tFort Dodge city\tIA\tIowa\tWebster County\t25305\t37.8\t22.5\t8.5\t23344\t91264\t0.5214\t50501\tObama\t50501\t0.063902376\t50501.0\n7396\t-94.14321\t42.612417\tBadger city\tIA\tIowa\tWebster County\t583\t38.0\t14.3\t0.7\t23312\t117453\t0.5214\t50516\tObama\t50516\t0.0014722420000000001\t50516.0\n7397\t-94.14935\t42.422052\tOtho city\tIA\tIowa\tWebster County\t637\t39.5\t9.6\t11.3\t22168\t71818\t0.5214\t50569\tObama\t50569\t0.0016086079999999999\t50569.0\n7398\t-94.36478000000001\t42.506238\tBarnum city\tIA\tIowa\tWebster County\t194\t41.3\t17.6\t6.4\t18613\t97500\t0.5214\t50518\tObama\t50518\t0.000489906\t50518.0\n7399\t-94.29553299999999\t42.361506\tCallender city\tIA\tIowa\tWebster County\t419\t43.8\t14.7\t10.8\t21276\t93846\t0.5214\t50523\tObama\t50523\t0.001058095\t50523.0\n7400\t-94.289647\t42.277831\tGowrie city\tIA\tIowa\tWebster County\t957\t45.0\t19.5\t7.8\t18386\t90577\t0.5214\t50543\tObama\t50543\t0.002416699\t50543.0\n7401\t-94.05341899999999\t42.357446\tLehigh city\tIA\tIowa\tWebster County\t485\t48.9\t15.2\t8.5\t21966\t59688\t0.5214\t50557\tObama\t50557\t0.001224764\t50557.0\n7402\t-94.344678\t42.587447\tClare city\tIA\tIowa\tWebster County\t189\t41.1\t17.5\t6.6\t18609\t97857\t0.5214\t50524\tObama\t50524\t0.000477279\t50524.0\n7403\t-94.119286\t42.440264\tCoalville CDP\tIA\tIowa\tWebster County\t579\t41.3\t6.8\t6.1\t22005\t74167\t0.5214\t50569\tObama\t50569\t0.0014621410000000001\t50569.0\n7404\t-94.17564499999999\t42.263047\tHarcourt city\tIA\tIowa\tWebster County\t316\t44.6\t16.6\t8.5\t23498\t80000\t0.5214\t50544\tObama\t50544\t0.0007979910000000001\t50544.0\n7405\t-94.294415\t42.441354\tMoorland city\tIA\tIowa\tWebster County\t187\t45.3\t17.4\t1.1\t25958\t98333\t0.5214\t50566\tObama\t50566\t0.000472229\t50566.0\n7406\t-93.636312\t43.331899\tLeland city\tIA\tIowa\tWinnebago County\t243\t42.8\t12.3\t2.8\t25038\t111364\t0.4905\t50453\tObama\t50453\t0.000613645\t50453.0\n7407\t-93.943001\t43.389509000000004\tBuffalo Center city\tIA\tIowa\tWinnebago County\t944\t47.1\t15.5\t4.5\t24271\t55152\t0.4905\t50424\tObama\t50424\t0.00238387\t50424.0\n7408\t-93.615997\t43.470475\tScarville city\tIA\tIowa\tWinnebago County\t90\t45.0\t13.8\t4.2\t19968\t83333\t0.4905\t50473\tObama\t50473\t0.000227276\t50473.0\n7409\t-93.774713\t43.369746\tThompson city\tIA\tIowa\tWinnebago County\t590\t40.4\t14.8\t8.7\t19151\t60714\t0.4905\t50478\tObama\t50478\t0.001489919\t50478.0\n7410\t-93.92231600000001\t43.480525\tRake city\tIA\tIowa\tWinnebago County\t202\t43.6\t10.5\t9.0\t20527\t45556\t0.4905\t50465\tObama\t50465\t0.000510108\t50465.0\n7411\t-93.532659\t43.416985\tLake Mills city\tIA\tIowa\tWinnebago County\t2011\t45.6\t17.7\t8.6\t27363\t104698\t0.4905\t50450\tObama\t50450\t0.005078351\t50450.0\n7412\t-93.636147\t43.266246\tForest City\tIA\tIowa\tWinnebago County\t4064\t36.2\t26.7\t8.4\t24268\t88282\t0.4905\t50436\tObama\t50436\t0.010262764\t50436.0\n7413\t-91.934657\t43.144094\tFort Atkinson city\tIA\tIowa\tWinneshiek County\t369\t42.5\t14.3\t5.1\t18154\t99375\t0.5644\t52144\tObama\t52144\t0.000931831\t52144.0\n7414\t-91.764578\t43.146789\tOssian city\tIA\tIowa\tWinneshiek County\t886\t40.4\t12.3\t1.6\t19103\t105357\t0.5644\t52161\tObama\t52161\t0.002237404\t52161.0\n7415\t-91.99263499999999\t43.298918\tRidgeway city\tIA\tIowa\tWinneshiek County\t289\t46.3\t17.4\t2.5\t23514\t106250\t0.5644\t52165\tObama\t52165\t0.000729808\t52165.0\n7416\t-91.95219399999999\t43.202732\tSpillville city\tIA\tIowa\tWinneshiek County\t354\t39.7\t7.8\t2.3\t21595\t91667\t0.5644\t52168\tObama\t52168\t0.000893951\t52168.0\n7417\t-91.675213\t43.112767\tCastalia city\tIA\tIowa\tWinneshiek County\t166\t44.1\t16.1\t9.7\t20752\t85000\t0.5644\t52133\tObama\t52133\t0.000419198\t52133.0\n7418\t-92.046152\t43.10133\tJackson Junction city\tIA\tIowa\tWinneshiek County\t57\t41.9\t15.4\t3.7\t18131\t100000\t0.5644\t52171\tObama\t52171\t0.000143941\t52171.0\n7419\t-91.789449\t43.304318\tDecorah city\tIA\tIowa\tWinneshiek County\t8107\t34.3\t36.0\t5.9\t22455\t121456\t0.5644\t52101\tObama\t52101\t0.020472498000000002\t52101.0\n7420\t-91.86746099999999\t43.180343\tCalmar city\tIA\tIowa\tWinneshiek County\t1006\t37.9\t14.1\t6.1\t19637\t98600\t0.5644\t52132\tObama\t52132\t0.002540438\t52132.0\n7421\t-96.067991\t42.489631\tMoville city\tIA\tIowa\tWoodbury County\t1593\t35.2\t22.7\t3.0\t22584\t104554\t0.4954\t51039\tObama\t51039\t0.004022781\t51039.0\n7422\t-95.867266\t42.544078999999996\tPierson city\tIA\tIowa\tWoodbury County\t359\t40.2\t16.8\t6.0\t23059\t73571\t0.4954\t51048\tObama\t51048\t0.000906578\t51048.0\n7423\t-95.894593\t42.282056\tOto city\tIA\tIowa\tWoodbury County\t141\t45.4\t12.9\t2.8\t22478\t78333\t0.4954\t51044\tObama\t51044\t0.000356065\t51044.0\n7424\t-96.211145\t42.409183\tBronson city\tIA\tIowa\tWoodbury County\t319\t40.4\t20.7\t6.8\t23177\t125000\t0.4954\t51007\tObama\t51007\t0.0008055660000000001\t51007.0\n7425\t-96.287479\t42.308889\tSalix city\tIA\tIowa\tWoodbury County\t371\t38.5\t19.8\t11.7\t24825\t109028\t0.4954\t51052\tObama\t51052\t0.0009368810000000001\t51052.0\n7426\t-96.39336899999999\t42.562502\tSioux City\tIA\tIowa\tWoodbury County\t83427\t34.7\t22.6\t8.0\t23737\t98347\t0.4954\t51108\tObama\t51108\t0.21067708\t51108.0\n7427\t-96.183644\t42.478628\tLawton city\tIA\tIowa\tWoodbury County\t704\t37.0\t30.2\t7.2\t24547\t121078\t0.4954\t51030\tObama\t51030\t0.0017778020000000002\t51030.0\n7428\t-95.676061\t42.465024\tCushing city\tIA\tIowa\tWoodbury County\t234\t41.3\t23.5\t4.6\t19708\t49286\t0.4954\t51018\tObama\t51018\t0.0005909169999999999\t51018.0\n7429\t-96.22438000000001\t42.234134999999995\tSloan city\tIA\tIowa\tWoodbury County\t1014\t40.7\t21.5\t4.2\t26712\t105082\t0.4954\t51055\tObama\t51055\t0.0025606410000000002\t51055.0\n7430\t-95.93116500000001\t42.229048999999996\tSmithland city\tIA\tIowa\tWoodbury County\t215\t45.0\t13.7\t2.8\t22471\t77500\t0.4954\t51056\tObama\t51056\t0.000542937\t51056.0\n7431\t-95.865655\t42.38821\tAnthon city\tIA\tIowa\tWoodbury County\t642\t45.2\t17.0\t6.4\t19898\t67143\t0.4954\t51004\tObama\t51004\t0.001621234\t51004.0\n7432\t-96.35584200000001\t42.400662\tSergeant Bluff city\tIA\tIowa\tWoodbury County\t3333\t33.4\t25.6\t8.5\t23961\t112717\t0.4954\t51054\tObama\t51054\t0.00841678\t51054.0\n7433\t-95.72225\t42.236424\tDanbury city\tIA\tIowa\tWoodbury County\t352\t42.6\t14.8\t4.3\t18979\t93125\t0.4954\t51019\tObama\t51019\t0.0008889010000000001\t51019.0\n7434\t-95.783273\t42.47707\tCorrectionville city\tIA\tIowa\tWoodbury County\t830\t42.5\t17.0\t7.3\t18808\t65217\t0.4954\t51016\tObama\t51016\t0.002095988\t51016.0\n7435\t-96.097107\t42.230515999999994\tHornick city\tIA\tIowa\tWoodbury County\t242\t42.7\t22.8\t5.3\t21532\t104412\t0.4954\t51026\tObama\t51026\t0.000611119\t51026.0\n7436\t-93.423199\t43.26232\tFertile city\tIA\tIowa\tWorth County\t355\t43.2\t10.8\t5.1\t17916\t76000\t0.5633\t50434\tObama\t50434\t0.000896477\t50434.0\n7437\t-93.458099\t43.364779999999996\tJoice city\tIA\tIowa\tWorth County\t221\t44.7\t11.4\t5.2\t21433\t83750\t0.5633\t50446\tObama\t50446\t0.000558088\t50446.0\n7438\t-93.37888000000001\t43.280892\tHanlontown city\tIA\tIowa\tWorth County\t226\t42.7\t10.3\t4.8\t17901\t77778\t0.5633\t50444\tObama\t50444\t0.000570715\t50444.0\n7439\t-93.200934\t43.288222999999995\tManly city\tIA\tIowa\tWorth County\t1318\t38.1\t16.7\t12.5\t20683\t74500\t0.5633\t50456\tObama\t50456\t0.0033283279999999998\t50456.0\n7440\t-93.210623\t43.353322999999996\tKensett city\tIA\tIowa\tWorth County\t270\t46.1\t12.9\t6.7\t19882\t70556\t0.5633\t50448\tObama\t50448\t0.000681827\t50448.0\n7441\t-93.068708\t43.330439\tGrafton city\tIA\tIowa\tWorth County\t285\t41.4\t8.1\t3.0\t20306\t90000\t0.5633\t50440\tObama\t50440\t0.000719707\t50440.0\n7442\t-93.216626\t43.444117\tNorthwood city\tIA\tIowa\tWorth County\t1978\t45.3\t13.0\t3.9\t23264\t89474\t0.5633\t50459\tObama\t50459\t0.004995017\t50459.0\n7443\t-93.605187\t42.692941\tGalt city\tIA\tIowa\tWright County\t28\t38.8\t17.4\t6.3\t21196\t60000\t0.4517\t50101\tObama\t50101\t7.070000000000001e-05\t50101.0\n7444\t-93.843398\t42.564679\tWoolstock city\tIA\tIowa\tWright County\t175\t48.4\t12.2\t7.3\t22629\t72500\t0.4517\t50599\tObama\t50599\t0.000441925\t50599.0\n7445\t-93.496284\t42.659259000000006\tDows city\tIA\tIowa\tWright County\t592\t46.1\t15.3\t7.2\t21205\t60000\t0.4517\t50071\tObama\t50071\t0.00149497\t50071.0\n7446\t-93.921088\t42.736017\tGoldfield city\tIA\tIowa\tWright County\t659\t44.2\t11.3\t9.5\t18333\t63529\t0.4517\t50542\tObama\t50542\t0.0016641639999999999\t50542.0\n7447\t-93.55040100000001\t42.739819\tRowan city\tIA\tIowa\tWright County\t206\t46.6\t15.3\t7.6\t20941\t62000\t0.4517\t50470\tObama\t50470\t0.000520209\t50470.0\n7448\t-93.608595\t42.846554\tBelmond city\tIA\tIowa\tWright County\t2261\t45.3\t15.0\t8.6\t25009\t84655\t0.4517\t50421\tObama\t50421\t0.005709673\t50421.0\n7449\t-93.73299899999999\t42.732234999999996\tClarion city\tIA\tIowa\tWright County\t2651\t43.6\t19.6\t5.9\t23367\t78730\t0.4517\t50525\tObama\t50525\t0.006694535\t50525.0\n7450\t-93.902575\t42.666365\tEagle Grove city\tIA\tIowa\tWright County\t3381\t41.6\t16.6\t9.4\t23576\t58934\t0.4517\t50533\tObama\t50533\t0.008537994\t50533.0\n7451\t-95.142589\t37.749103000000005\tSavonburg city\tKS\tKansas\tAllen County\t86\t47.5\t12.5\t6.4\t15917\t70000\t0.35200000000000004\t66772\tRomney\t66772\t0.00022416799999999999\t66772.0\n7452\t-95.17460799999999\t38.024537\tMildred city\tKS\tKansas\tAllen County\t34\t46.7\t11.5\t5.3\t15934\t75000\t0.35200000000000004\t66039\tRomney\t66039\t8.859999999999999e-05\t66039.0\n7453\t-95.407616\t37.906245\tBassett city\tKS\tKansas\tAllen County\t20\t37.5\t7.1\t8.3\t18099\t75000\t0.35200000000000004\t66749\tRomney\t66749\t5.21e-05\t66749.0\n7454\t-95.150081\t37.794182\tElsmore city\tKS\tKansas\tAllen County\t69\t45.0\t11.8\t5.3\t15936\t70000\t0.35200000000000004\t66732\tRomney\t66732\t0.000179855\t66732.0\n7455\t-95.302521\t37.916745\tLa Harpe city\tKS\tKansas\tAllen County\t671\t38.4\t8.8\t8.0\t17973\t68667\t0.35200000000000004\t66751\tRomney\t66751\t0.001749029\t66751.0\n7456\t-95.401193\t37.930031\tIola city\tKS\tKansas\tAllen County\t5822\t36.6\t19.4\t9.5\t19549\t61635\t0.35200000000000004\t66749\tRomney\t66749\t0.015175626000000001\t66749.0\n7457\t-95.43730699999999\t37.811319\tHumboldt city\tKS\tKansas\tAllen County\t1907\t43.8\t14.2\t4.9\t18476\t53161\t0.35200000000000004\t66748\tRomney\t66748\t0.004970787\t66748.0\n7458\t-95.171447\t37.916525\tMoran city\tKS\tKansas\tAllen County\t531\t46.7\t12.5\t6.2\t15932\t74545\t0.35200000000000004\t66755\tRomney\t66755\t0.001384105\t66755.0\n7459\t-95.345325\t37.922952\tGas city\tKS\tKansas\tAllen County\t529\t45.4\t14.2\t7.5\t19983\t91111\t0.35200000000000004\t66751\tRomney\t66751\t0.0013788910000000001\t66751.0\n7460\t-95.49078100000001\t38.181899\tWestphalia city\tKS\tKansas\tAnderson County\t168\t33.1\t8.2\t8.0\t15755\t97500\t0.2848\t66093\tRomney\t66093\t0.000437909\t66093.0\n7461\t-95.438841\t38.319615999999996\tHarris city\tKS\tKansas\tAnderson County\t54\t34.2\t9.4\t7.1\t15755\t90000\t0.2848\t66093\tRomney\t66093\t0.000140756\t66093.0\n7462\t-95.155248\t38.081255\tKincaid city\tKS\tKansas\tAnderson County\t176\t46.3\t6.9\t10.2\t17791\t71250\t0.2848\t66039\tRomney\t66039\t0.000458762\t66039.0\n7463\t-95.127065\t38.368064000000004\tGreeley city\tKS\tKansas\tAnderson County\t357\t43.8\t15.9\t3.7\t20354\t104167\t0.2848\t66033\tRomney\t66033\t0.000930556\t66033.0\n7464\t-95.36250600000001\t38.071165\tColony city\tKS\tKansas\tAnderson County\t390\t44.9\t9.4\t10.3\t15615\t75455\t0.2848\t66015\tRomney\t66015\t0.001016574\t66015.0\n7465\t-95.24316\t38.07965\tLone Elm city\tKS\tKansas\tAnderson County\t27\t37.5\t5.6\t12.5\t15340\t80000\t0.2848\t66039\tRomney\t66039\t7.04e-05\t66039.0\n7466\t-95.242595\t38.285012\tGarnett city\tKS\tKansas\tAnderson County\t3149\t41.5\t13.4\t5.0\t20605\t91077\t0.2848\t66032\tRomney\t66032\t0.008208184\t66032.0\n7467\t-95.397631\t39.522391999999996\tEffingham city\tKS\tKansas\tAtchison County\t613\t41.3\t15.1\t4.8\t17677\t83400\t0.3846\t66023\tRomney\t66023\t0.001597846\t66023.0\n7468\t-95.347751\t39.645757\tHuron city\tKS\tKansas\tAtchison County\t84\t42.1\t17.2\t4.8\t19538\t55000\t0.3846\t66041\tRomney\t66041\t0.00021895400000000002\t66041.0\n7469\t-95.3037\t39.571321000000005\tLancaster city\tKS\tKansas\tAtchison County\t303\t41.5\t9.5\t5.5\t20041\t86429\t0.3846\t66041\tRomney\t66041\t0.0007898\t66041.0\n7470\t-95.12799999999999\t39.563002000000004\tAtchison city\tKS\tKansas\tAtchison County\t9940\t34.5\t24.0\t11.7\t18518\t78138\t0.3846\t66002\tRomney\t66002\t0.025909606\t66002.0\n7471\t-95.52037800000001\t39.553496\tMuscotah city\tKS\tKansas\tAtchison County\t192\t41.7\t17.4\t4.1\t19641\t56875\t0.3846\t66058\tRomney\t66058\t0.000500467\t66058.0\n7472\t-98.401329\t37.089311\tHazelton city\tKS\tKansas\tBarber County\t133\t46.5\t24.7\t5.3\t15589\t31667\t0.2083\t67061\tRomney\t67061\t0.000346678\t67061.0\n7473\t-98.551755\t37.467308\tIsabel city\tKS\tKansas\tBarber County\t97\t49.6\t28.8\t1.9\t22510\t75000\t0.2083\t67065\tRomney\t67065\t0.00025284\t67065.0\n7474\t-98.916721\t37.378586999999996\tSun City\tKS\tKansas\tBarber County\t73\t49.5\t29.1\t2.6\t22437\t81667\t0.2083\t67143\tRomney\t67143\t0.000190282\t67143.0\n7475\t-98.484657\t37.017661\tKiowa city\tKS\tKansas\tBarber County\t974\t47.9\t26.7\t5.6\t18635\t44545\t0.2083\t67070\tRomney\t67070\t0.002538829\t67070.0\n7476\t-98.582049\t37.284982\tMedicine Lodge city\tKS\tKansas\tBarber County\t1950\t45.8\t22.6\t2.5\t20804\t53043\t0.2083\t67104\tRomney\t67104\t0.00508287\t67104.0\n7477\t-98.649322\t37.014728000000005\tHardtner city\tKS\tKansas\tBarber County\t184\t49.6\t28.1\t5.5\t21687\t55000\t0.2083\t67057\tRomney\t67057\t0.000479614\t67057.0\n7478\t-98.41844499999999\t37.250018\tSharon city\tKS\tKansas\tBarber County\t188\t41.5\t22.2\t5.7\t19635\t46875\t0.2083\t67138\tRomney\t67138\t0.000490041\t67138.0\n7479\t-98.778227\t38.365421000000005\tGreat Bend city\tKS\tKansas\tBarton County\t15075\t39.1\t20.5\t5.9\t20484\t85881\t0.2221\t67530\tRomney\t67530\t0.039294498\t67530.0\n7480\t-98.93714200000001\t38.51664\tOlmitz city\tKS\tKansas\tBarton County\t131\t42.3\t15.4\t5.4\t19459\t65000\t0.2221\t67564\tRomney\t67564\t0.000341465\t67564.0\n7481\t-98.77453100000001\t38.640571\tSusank city\tKS\tKansas\tBarton County\t54\t42.5\t13.9\t6.5\t19507\t60000\t0.2221\t67544\tRomney\t67544\t0.000140756\t67544.0\n7482\t-98.581861\t38.355616999999995\tEllinwood city\tKS\tKansas\tBarton County\t2117\t45.0\t19.3\t4.5\t19895\t70862\t0.2221\t67526\tRomney\t67526\t0.005518173\t67526.0\n7483\t-98.957954\t38.641137\tGalatia city\tKS\tKansas\tBarton County\t58\t41.5\t15.4\t6.1\t19429\t65000\t0.2221\t67565\tRomney\t67565\t0.000151183\t67565.0\n7484\t-98.53714699999999\t38.524331\tClaflin city\tKS\tKansas\tBarton County\t663\t41.5\t21.9\t1.4\t17683\t91667\t0.2221\t67525\tRomney\t67525\t0.001728176\t67525.0\n7485\t-98.982383\t38.265049\tPawnee Rock city\tKS\tKansas\tBarton County\t336\t41.8\t18.8\t4.7\t16904\t65000\t0.2221\t67567\tRomney\t67567\t0.000875818\t67567.0\n7486\t-98.77844499999999\t38.518689\tHoisington city\tKS\tKansas\tBarton County\t2914\t43.0\t16.5\t6.1\t18468\t59882\t0.2221\t67544\tRomney\t67544\t0.007595633\t67544.0\n7487\t-99.011092\t38.453993\tAlbert city\tKS\tKansas\tBarton County\t171\t42.5\t19.3\t4.7\t16889\t63750\t0.2221\t67511\tRomney\t67511\t0.000445729\t67511.0\n7488\t-94.881955\t37.836506\tRedfield city\tKS\tKansas\tBourbon County\t138\t43.1\t24.2\t3.6\t19188\t68750\t0.3192\t66769\tRomney\t66769\t0.00035971099999999997\t66769.0\n7489\t-95.073207\t37.895695\tBronson city\tKS\tKansas\tBourbon County\t386\t44.4\t16.9\t9.8\t16155\t62000\t0.3192\t66716\tRomney\t66716\t0.0010061480000000001\t66716.0\n7490\t-94.975764\t37.847289\tUniontown city\tKS\tKansas\tBourbon County\t284\t42.2\t24.1\t3.5\t19188\t72857\t0.3192\t66779\tRomney\t66779\t0.000740274\t66779.0\n7491\t-94.703985\t37.829512\tFort Scott city\tKS\tKansas\tBourbon County\t7724\t38.4\t20.6\t8.4\t18244\t69171\t0.3192\t66701\tRomney\t66701\t0.02013338\t66701.0\n7492\t-94.719868\t38.009761\tFulton city\tKS\tKansas\tBourbon County\t166\t45.0\t27.4\t7.4\t16681\t61667\t0.3192\t66738\tRomney\t66738\t0.000432696\t66738.0\n7493\t-94.88340600000001\t38.01542\tMapleton city\tKS\tKansas\tBourbon County\t88\t44.0\t27.0\t8.0\t16764\t62500\t0.3192\t66754\tRomney\t66754\t0.000229381\t66754.0\n7494\t-95.633861\t39.761763\tPowhattan city\tKS\tKansas\tBrown County\t79\t34.3\t22.4\t7.1\t15168\t70000\t0.2695\t66527\tRomney\t66527\t0.000205921\t66527.0\n7495\t-95.62740500000001\t39.915593\tHamlin city\tKS\tKansas\tBrown County\t48\t43.1\t26.5\t3.0\t18239\t95000\t0.2695\t66515\tRomney\t66515\t0.000125117\t66515.0\n7496\t-95.565129\t39.977026\tReserve city\tKS\tKansas\tBrown County\t91\t42.1\t25.4\t4.7\t18144\t91667\t0.2695\t66434\tRomney\t66434\t0.00023720099999999998\t66434.0\n7497\t-95.536276\t39.852703999999996\tHiawatha city\tKS\tKansas\tBrown County\t3247\t43.1\t28.6\t7.1\t22111\t83333\t0.2695\t66434\tRomney\t66434\t0.008463631\t66434.0\n7498\t-95.42490500000001\t39.676714000000004\tEverest city\tKS\tKansas\tBrown County\t310\t41.3\t18.8\t8.8\t18150\t74286\t0.2695\t66424\tRomney\t66424\t0.0008080460000000001\t66424.0\n7499\t-95.52560799999999\t39.663920000000005\tHorton city\tKS\tKansas\tBrown County\t1856\t39.4\t15.5\t7.1\t14258\t52500\t0.2695\t66439\tRomney\t66439\t0.00483785\t66439.0\n7500\t-95.505668\t39.722736\tWillis city\tKS\tKansas\tBrown County\t68\t43.5\t18.8\t8.9\t18185\t80000\t0.2695\t66439\tRomney\t66439\t0.000177249\t66439.0\n7501\t-95.41150400000001\t39.815289\tRobinson city\tKS\tKansas\tBrown County\t211\t43.8\t29.9\t5.0\t17820\t81429\t0.2695\t66532\tRomney\t66532\t0.000549993\t66532.0\n7502\t-95.694355\t39.929199\tMorrill city\tKS\tKansas\tBrown County\t267\t45.6\t15.0\t3.3\t18326\t81250\t0.2695\t66515\tRomney\t66515\t0.000695962\t66515.0\n7503\t-95.72693199999999\t39.840051\tFairview city\tKS\tKansas\tBrown County\t261\t45.1\t14.9\t3.4\t18346\t80000\t0.2695\t66425\tRomney\t66425\t0.000680323\t66425.0\n7504\t-96.64278399999999\t37.536753999999995\tLatham city\tKS\tKansas\tButler County\t169\t37.0\t17.0\t5.8\t20363\t75000\t0.2792\t67072\tRomney\t67072\t0.000440515\t67072.0\n7505\t-97.131852\t37.564802\tRose Hill city\tKS\tKansas\tButler County\t3589\t30.0\t29.7\t7.0\t25587\t120941\t0.2792\t67133\tRomney\t67133\t0.009355088000000001\t67133.0\n7506\t-96.783452\t37.688054\tLeon city\tKS\tKansas\tButler County\t667\t37.6\t17.0\t5.9\t20364\t72647\t0.2792\t67074\tRomney\t67074\t0.0017386020000000001\t67074.0\n7507\t-97.109905\t37.791071\tBenton city\tKS\tKansas\tButler County\t908\t40.8\t20.9\t4.6\t25321\t112228\t0.2792\t67017\tRomney\t67017\t0.002366793\t67017.0\n7508\t-96.99640500000001\t37.796432\tTowanda city\tKS\tKansas\tButler County\t1408\t36.7\t22.8\t6.6\t22036\t87973\t0.2792\t67144\tRomney\t67144\t0.0036700929999999997\t67144.0\n7509\t-96.859601\t37.823103\tEl Dorado city\tKS\tKansas\tButler County\t12096\t37.1\t18.5\t9.0\t23216\t76111\t0.2792\t67042\tRomney\t67042\t0.031529436\t67042.0\n7510\t-97.147008\t37.963448\tWhitewater city\tKS\tKansas\tButler County\t748\t43.2\t20.9\t8.5\t22724\t104444\t0.2792\t67154\tRomney\t67154\t0.0019497370000000002\t67154.0\n7511\t-97.139545\t37.690566\tAndover city\tKS\tKansas\tButler County\t9872\t36.2\t37.5\t6.4\t27531\t141761\t0.2792\t67002\tRomney\t67002\t0.025732357\t67002.0\n7512\t-96.973536\t37.694146999999994\tAugusta city\tKS\tKansas\tButler County\t8581\t36.6\t22.3\t10.2\t24080\t87227\t0.2792\t67010\tRomney\t67010\t0.022367236000000002\t67010.0\n7513\t-97.12710899999999\t38.054221000000005\tElbing city\tKS\tKansas\tButler County\t216\t40.0\t23.7\t3.3\t19116\t90000\t0.2792\t67041\tRomney\t67041\t0.000563026\t67041.0\n7514\t-96.637116\t38.038598\tCassoday city\tKS\tKansas\tButler County\t129\t40.0\t23.8\t3.6\t19091\t90000\t0.2792\t66842\tRomney\t66842\t0.000336251\t66842.0\n7515\t-97.011553\t37.517019\tDouglass city\tKS\tKansas\tButler County\t2051\t34.6\t13.1\t9.2\t21913\t80246\t0.2792\t67039\tRomney\t67039\t0.005346137\t67039.0\n7516\t-97.018513\t37.938669\tPotwin city\tKS\tKansas\tButler County\t487\t36.3\t21.5\t7.2\t25070\t66000\t0.2792\t67123\tRomney\t67123\t0.001269414\t67123.0\n7517\t-96.563529\t38.159285\tMatfield Green city\tKS\tKansas\tChase County\t57\t48.0\t25.0\t3.4\t20674\t104167\t0.2817\t66862\tRomney\t66862\t0.000148576\t66862.0\n7518\t-96.82167700000001\t38.260329999999996\tCedar Point city\tKS\tKansas\tChase County\t50\t46.3\t25.7\t3.8\t20815\t95000\t0.2817\t66843\tRomney\t66843\t0.00013033\t66843.0\n7519\t-96.64574300000001\t38.373144\tElmdale city\tKS\tKansas\tChase County\t49\t46.3\t27.8\t3.8\t24769\t137500\t0.2817\t66850\tRomney\t66850\t0.000127723\t66850.0\n7520\t-96.542666\t38.368959000000004\tCottonwood Falls city\tKS\tKansas\tChase County\t996\t42.3\t14.3\t6.0\t17132\t70000\t0.2817\t66845\tRomney\t66845\t0.002596174\t66845.0\n7521\t-96.536878\t38.395497\tStrong City\tKS\tKansas\tChase County\t565\t40.9\t14.0\t5.6\t20258\t45556\t0.2817\t66869\tRomney\t66869\t0.0014727289999999999\t66869.0\n7522\t-96.177511\t37.024021000000005\tChautauqua city\tKS\tKansas\tChautauqua County\t112\t47.7\t12.0\t14.5\t18820\t46667\t0.1718\t67334\tRomney\t67334\t0.000291939\t67334.0\n7523\t-96.184185\t37.127865\tSedan city\tKS\tKansas\tChautauqua County\t1312\t45.9\t15.4\t7.2\t17539\t51375\t0.1718\t67361\tRomney\t67361\t0.0034198590000000004\t67361.0\n7524\t-96.095672\t37.081268\tPeru city\tKS\tKansas\tChautauqua County\t161\t46.8\t8.3\t12.7\t17730\t38750\t0.1718\t67360\tRomney\t67360\t0.000419663\t67360.0\n7525\t-96.01473399999999\t37.067796\tNiotaze city\tKS\tKansas\tChautauqua County\t107\t46.8\t7.5\t12.8\t17785\t40000\t0.1718\t67355\tRomney\t67355\t0.000278906\t67355.0\n7526\t-96.501421\t37.105544\tCedar Vale city\tKS\tKansas\tChautauqua County\t661\t46.8\t14.3\t6.3\t16246\t38125\t0.1718\t67024\tRomney\t67024\t0.0017229629999999999\t67024.0\n7527\t-96.27902399999999\t37.002241\tElgin city\tKS\tKansas\tChautauqua County\t81\t47.5\t11.7\t15.0\t18886\t48333\t0.1718\t67334\tRomney\t67334\t0.000211135\t67334.0\n7528\t-94.925652\t37.284766999999995\tWest Mineral city\tKS\tKansas\tCherokee County\t225\t42.8\t17.6\t6.9\t18576\t60000\t0.3419\t66782\tRomney\t66782\t0.000586485\t66782.0\n7529\t-94.63501\t37.075551000000004\tGalena city\tKS\tKansas\tCherokee County\t3102\t38.5\t6.7\t14.9\t15802\t54295\t0.3419\t66739\tRomney\t66739\t0.008085674000000001\t66739.0\n7530\t-94.844243\t37.280609000000005\tRoseland city\tKS\tKansas\tCherokee County\t81\t40.8\t11.1\t12.5\t14212\t50000\t0.3419\t66773\tRomney\t66773\t0.000211135\t66773.0\n7531\t-94.844363\t37.172312\tColumbus city\tKS\tKansas\tCherokee County\t3148\t39.0\t19.7\t8.0\t18363\t66584\t0.3419\t66725\tRomney\t66725\t0.008205577\t66725.0\n7532\t-94.77499399999999\t37.30845\tWeir city\tKS\tKansas\tCherokee County\t623\t37.7\t12.9\t7.7\t15147\t52826\t0.3419\t66781\tRomney\t66781\t0.0016239120000000001\t66781.0\n7533\t-94.843853\t37.000364000000005\tTreece city\tKS\tKansas\tCherokee County\t144\t39.8\t10.1\t7.4\t15290\t80000\t0.3419\t66778\tRomney\t66778\t0.00037535\t66778.0\n7534\t-94.734923\t37.019694\tBaxter Springs city\tKS\tKansas\tCherokee County\t4164\t38.3\t13.0\t11.7\t16638\t73986\t0.3419\t66713\tRomney\t66713\t0.010853883\t66713.0\n7535\t-94.822913\t37.278215\tScammon city\tKS\tKansas\tCherokee County\t399\t40.2\t11.2\t13.0\t14168\t53333\t0.3419\t66773\tRomney\t66773\t0.001040033\t66773.0\n7536\t-101.532635\t39.749607\tBird City\tKS\tKansas\tCheyenne County\t441\t47.0\t11.6\t2.1\t19583\t70000\t0.1634\t67731\tRomney\t67731\t0.001149511\t67731.0\n7537\t-101.80145300000001\t39.771387\tSt. Francis city\tKS\tKansas\tCheyenne County\t1444\t47.3\t20.4\t3.2\t20071\t71607\t0.1634\t67756\tRomney\t67756\t0.003763931\t67756.0\n7538\t-100.012941\t37.442161\tMinneola city\tKS\tKansas\tClark County\t687\t44.3\t21.3\t3.2\t20611\t85000\t0.1711\t67865\tRomney\t67865\t0.001790734\t67865.0\n7539\t-99.769777\t37.186763\tAshland city\tKS\tKansas\tClark County\t945\t44.0\t23.4\t3.6\t20814\t58929\t0.1711\t67831\tRomney\t67831\t0.002463237\t67831.0\n7540\t-99.98680300000001\t37.040032000000004\tEnglewood city\tKS\tKansas\tClark County\t106\t44.3\t23.6\t3.4\t20795\t56667\t0.1711\t67840\tRomney\t67840\t0.0002763\t67840.0\n7541\t-97.016428\t39.216709\tWakefield city\tKS\tKansas\tClay County\t831\t40.0\t18.8\t4.3\t19032\t110294\t0.2263\t67487\tRomney\t67487\t0.002166085\t67487.0\n7542\t-97.343087\t39.246487\tOak Hill city\tKS\tKansas\tClay County\t34\t36.3\t12.0\t0.0\t18002\t80000\t0.2263\t67458\tRomney\t67458\t8.859999999999999e-05\t67458.0\n7543\t-97.32901899999999\t39.172222\tLongford city\tKS\tKansas\tClay County\t92\t43.3\t12.5\t1.7\t17848\t73333\t0.2263\t67458\tRomney\t67458\t0.000239807\t67458.0\n7544\t-97.000354\t39.430081\tGreen city\tKS\tKansas\tClay County\t154\t45.7\t19.6\t2.9\t19224\t95000\t0.2263\t67447\tRomney\t67447\t0.000401416\t67447.0\n7545\t-97.203707\t39.466539000000004\tMorganville city\tKS\tKansas\tClay County\t207\t44.5\t19.7\t2.9\t19256\t101389\t0.2263\t67468\tRomney\t67468\t0.000539566\t67468.0\n7546\t-97.124122\t39.380029\tClay Center city\tKS\tKansas\tClay County\t4502\t44.9\t21.9\t5.5\t21580\t82079\t0.2263\t67432\tRomney\t67432\t0.011734913999999999\t67432.0\n7547\t-97.45307700000001\t39.350048\tMiltonvale city\tKS\tKansas\tCloud County\t451\t47.1\t16.6\t5.8\t16897\t40000\t0.24\t67466\tRomney\t67466\t0.001175577\t67466.0\n7548\t-97.861265\t39.599488\tJamestown city\tKS\tKansas\tCloud County\t367\t44.5\t19.1\t1.4\t20836\t52000\t0.24\t66948\tRomney\t66948\t0.000956622\t66948.0\n7549\t-97.40029399999999\t39.591884\tClyde city\tKS\tKansas\tCloud County\t687\t46.8\t17.6\t1.3\t18873\t54318\t0.24\t66938\tRomney\t66938\t0.001790734\t66938.0\n7550\t-97.837362\t39.360948\tGlasco city\tKS\tKansas\tCloud County\t443\t51.3\t19.3\t1.2\t19590\t41765\t0.24\t67445\tRomney\t67445\t0.001154724\t67445.0\n7551\t-97.530023\t39.452013\tAurora city\tKS\tKansas\tCloud County\t66\t47.1\t12.5\t2.1\t18954\t80000\t0.24\t67417\tRomney\t67417\t0.00017203599999999998\t67417.0\n7552\t-97.656283\t39.563854\tConcordia city\tKS\tKansas\tCloud County\t5374\t42.2\t25.5\t5.5\t21224\t71319\t0.24\t66901\tRomney\t66901\t0.014007869\t66901.0\n7553\t-95.85698599999999\t38.413757000000004\tLebo city\tKS\tKansas\tCoffey County\t982\t40.5\t20.7\t7.8\t19971\t103024\t0.2299\t66856\tRomney\t66856\t0.002559681\t66856.0\n7554\t-95.744926\t38.19512\tBurlington city\tKS\tKansas\tCoffey County\t2681\t40.6\t20.6\t7.5\t21076\t88810\t0.2299\t66839\tRomney\t66839\t0.006988295\t66839.0\n7555\t-95.883924\t38.0978\tGridley city\tKS\tKansas\tCoffey County\t374\t45.1\t17.8\t3.6\t20713\t52000\t0.2299\t66852\tRomney\t66852\t0.000974868\t66852.0\n7556\t-95.605161\t38.3964\tWaverly city\tKS\tKansas\tCoffey County\t555\t42.4\t20.5\t5.7\t20342\t85000\t0.2299\t66871\tRomney\t66871\t0.001446663\t66871.0\n7557\t-95.63322099999999\t38.086240000000004\tLe Roy city\tKS\tKansas\tCoffey County\t531\t45.1\t16.4\t4.5\t19081\t84000\t0.2299\t66857\tRomney\t66857\t0.001384105\t66857.0\n7558\t-95.742518\t38.262051\tNew Strawn city\tKS\tKansas\tCoffey County\t428\t43.4\t27.2\t6.1\t22735\t101136\t0.2299\t66839\tRomney\t66839\t0.001115625\t66839.0\n7559\t-99.209352\t37.335423999999996\tWilmore city\tKS\tKansas\tComanche County\t56\t45.0\t15.4\t0.0\t18709\t57500\t0.1541\t67155\tRomney\t67155\t0.00014597\t67155.0\n7560\t-99.349518\t37.258709\tColdwater city\tKS\tKansas\tComanche County\t774\t48.6\t17.4\t0.0\t19897\t52353\t0.1541\t67029\tRomney\t67029\t0.002017509\t67029.0\n7561\t-99.481138\t37.20025\tProtection city\tKS\tKansas\tComanche County\t544\t50.1\t12.1\t6.9\t20711\t43750\t0.1541\t67127\tRomney\t67127\t0.00141799\t67127.0\n7562\t-96.716002\t37.179494\tDexter city\tKS\tKansas\tCowley County\t351\t41.8\t14.6\t8.1\t16392\t65833\t0.3398\t67038\tRomney\t67038\t0.000914917\t67038.0\n7563\t-96.986553\t37.23788\tWinfield city\tKS\tKansas\tCowley County\t11448\t37.2\t28.2\t11.7\t21236\t85069\t0.3398\t67156\tRomney\t67156\t0.029840359\t67156.0\n7564\t-96.66699799999999\t37.317336\tCambridge city\tKS\tKansas\tCowley County\t97\t40.0\t16.9\t6.0\t16502\t56667\t0.3398\t67023\tRomney\t67023\t0.00025284\t67023.0\n7565\t-96.767288\t37.435709\tAtlanta city\tKS\tKansas\tCowley County\t239\t40.6\t16.6\t5.7\t16673\t59167\t0.3398\t67008\tRomney\t67008\t0.0006229769999999999\t67008.0\n7566\t-96.755361\t37.314491\tBurden city\tKS\tKansas\tCowley County\t530\t40.3\t16.2\t5.6\t16532\t59167\t0.3398\t67019\tRomney\t67019\t0.0013814979999999999\t67019.0\n7567\t-97.117581\t37.388601\tUdall city\tKS\tKansas\tCowley County\t834\t36.5\t17.5\t8.0\t21523\t102778\t0.3398\t67146\tRomney\t67146\t0.002173905\t67146.0\n7568\t-97.040521\t37.068882\tArkansas City\tKS\tKansas\tCowley County\t11195\t36.7\t16.7\t10.6\t18758\t61154\t0.3398\t67005\tRomney\t67005\t0.029180888999999998\t67005.0\n7569\t-94.843473\t37.510187\tGirard city\tKS\tKansas\tCrawford County\t2688\t41.3\t23.9\t5.5\t19255\t84828\t0.4567\t66743\tRomney\t66743\t0.007006541\t66743.0\n7570\t-94.62408\t37.64121\tArcadia city\tKS\tKansas\tCrawford County\t414\t41.1\t25.0\t6.5\t15839\t66000\t0.4567\t66711\tRomney\t66711\t0.001079132\t66711.0\n7571\t-94.821517\t37.344915\tCherokee city\tKS\tKansas\tCrawford County\t736\t42.7\t13.5\t12.3\t15822\t48537\t0.4567\t66724\tRomney\t66724\t0.0019184579999999998\t66724.0\n7572\t-94.69985799999999\t37.543079\tArma city\tKS\tKansas\tCrawford County\t1556\t43.3\t18.5\t10.6\t18979\t75957\t0.4567\t66712\tRomney\t66712\t0.00405587\t66712.0\n7573\t-94.698204\t37.415115\tPittsburg city\tKS\tKansas\tCrawford County\t19022\t30.0\t33.4\t9.1\t19409\t84800\t0.4567\t66762\tRomney\t66762\t0.049582747999999996\t66762.0\n7574\t-94.699506\t37.458486\tFrontenac city\tKS\tKansas\tCrawford County\t3074\t41.4\t27.2\t9.8\t18387\t93611\t0.4567\t66763\tRomney\t66763\t0.008012689\t66763.0\n7575\t-95.07473\t37.600169\tWalnut city\tKS\tKansas\tCrawford County\t211\t41.3\t18.8\t7.0\t20340\t80833\t0.4567\t66780\tRomney\t66780\t0.000549993\t66780.0\n7576\t-95.019357\t37.353801000000004\tMcCune city\tKS\tKansas\tCrawford County\t489\t42.3\t19.7\t7.9\t18979\t63500\t0.4567\t66753\tRomney\t66753\t0.001274627\t66753.0\n7577\t-94.623621\t37.555766999999996\tMulberry city\tKS\tKansas\tCrawford County\t664\t43.1\t12.7\t7.2\t16472\t56563\t0.4567\t66756\tRomney\t66756\t0.0017307829999999998\t66756.0\n7578\t-94.969633\t37.662014\tHepler city\tKS\tKansas\tCrawford County\t147\t40.6\t19.0\t7.5\t20349\t80000\t0.4567\t66746\tRomney\t66746\t0.00038317\t66746.0\n7579\t-100.53144499999999\t39.823601000000004\tOberlin city\tKS\tKansas\tDecatur County\t1890\t48.1\t18.6\t1.8\t18116\t67719\t0.1736\t67749\tRomney\t67749\t0.004926474\t67749.0\n7580\t-100.293265\t39.680425\tJennings city\tKS\tKansas\tDecatur County\t110\t47.8\t17.3\t4.3\t19617\t48750\t0.1736\t67643\tRomney\t67643\t0.000286726\t67643.0\n7581\t-100.418949\t39.62165\tDresden city\tKS\tKansas\tDecatur County\t38\t50.0\t16.7\t4.2\t19819\t50000\t0.1736\t67635\tRomney\t67635\t9.91e-05\t67635.0\n7582\t-100.188824\t39.834759999999996\tNorcatur city\tKS\tKansas\tDecatur County\t127\t49.1\t17.9\t3.7\t19661\t51250\t0.1736\t67653\tRomney\t67653\t0.000331038\t67653.0\n7583\t-97.116314\t38.902319\tEnterprise city\tKS\tKansas\tDickinson County\t801\t43.9\t18.4\t6.5\t18375\t75526\t0.2512\t67441\tRomney\t67441\t0.002087887\t67441.0\n7584\t-97.29326800000001\t38.68655\tCarlton city\tKS\tKansas\tDickinson County\t37\t45.0\t18.5\t4.5\t17705\t112500\t0.2512\t67448\tRomney\t67448\t9.640000000000001e-05\t67448.0\n7585\t-96.959799\t38.795943\tWoodbine city\tKS\tKansas\tDickinson County\t208\t44.7\t16.4\t6.6\t21487\t98750\t0.2512\t67492\tRomney\t67492\t0.0005421730000000001\t67492.0\n7586\t-97.221744\t38.923178\tAbilene city\tKS\tKansas\tDickinson County\t6543\t42.2\t19.2\t5.8\t22132\t99128\t0.2512\t67410\tRomney\t67410\t0.017054985\t67410.0\n7587\t-97.023473\t38.972946\tChapman city\tKS\tKansas\tDickinson County\t1201\t43.9\t22.2\t3.8\t22425\t94853\t0.2512\t67431\tRomney\t67431\t0.003130527\t67431.0\n7588\t-97.075999\t38.691113\tHope city\tKS\tKansas\tDickinson County\t357\t48.3\t16.2\t7.7\t18769\t87500\t0.2512\t67451\tRomney\t67451\t0.000930556\t67451.0\n7589\t-97.321279\t39.092009000000004\tManchester city\tKS\tKansas\tDickinson County\t100\t46.8\t17.8\t5.3\t19836\t86667\t0.2512\t67458\tRomney\t67458\t0.00026066\t67458.0\n7590\t-96.928343\t38.679193\tHerington city\tKS\tKansas\tDickinson County\t2457\t45.3\t11.3\t6.7\t18494\t61456\t0.2512\t67449\tRomney\t67449\t0.006404417\t67449.0\n7591\t-97.370819\t38.920027000000005\tSolomon city\tKS\tKansas\tDickinson County\t1151\t40.2\t13.8\t6.1\t19568\t92000\t0.2512\t674HH\tRomney\t674HH\t0.003000197\t0.0\n7592\t-95.29910600000001\t39.97455\tWhite Cloud city\tKS\tKansas\tDoniphan County\t222\t41.3\t15.9\t5.8\t22408\t55000\t0.2651\t66094\tRomney\t66094\t0.000578665\t66094.0\n7593\t-94.944987\t39.76207\tWathena city\tKS\tKansas\tDoniphan County\t1298\t40.1\t14.2\t7.9\t17452\t75645\t0.2651\t66090\tRomney\t66090\t0.003383367\t66090.0\n7594\t-95.249477\t39.767176\tSeverance city\tKS\tKansas\tDoniphan County\t97\t39.3\t10.6\t7.5\t18224\t48333\t0.2651\t66017\tRomney\t66017\t0.00025284\t66017.0\n7595\t-95.321549\t39.786149\tLeona city\tKS\tKansas\tDoniphan County\t79\t39.2\t9.6\t7.0\t18228\t45000\t0.2651\t66532\tRomney\t66532\t0.000205921\t66532.0\n7596\t-94.880086\t39.754877\tElwood city\tKS\tKansas\tDoniphan County\t1047\t31.4\t5.7\t8.2\t15964\t42167\t0.2651\t66024\tRomney\t66024\t0.00272911\t66024.0\n7597\t-95.088853\t39.786674\tTroy city\tKS\tKansas\tDoniphan County\t1033\t38.2\t15.2\t7.4\t18968\t67727\t0.2651\t66087\tRomney\t66087\t0.002692618\t66087.0\n7598\t-95.265067\t39.860327000000005\tHighland city\tKS\tKansas\tDoniphan County\t962\t31.5\t22.5\t7.6\t19436\t64524\t0.2651\t66035\tRomney\t66035\t0.002507549\t66035.0\n7599\t-95.26951600000001\t39.731707\tDenton city\tKS\tKansas\tDoniphan County\t168\t39.0\t9.8\t6.7\t18114\t46000\t0.2651\t66017\tRomney\t66017\t0.000437909\t66017.0\n7600\t-95.098326\t38.938433\tEudora city\tKS\tKansas\tDouglas County\t6005\t32.7\t22.2\t5.6\t24373\t130762\t0.6079\t66025\tRomney\t66025\t0.015652634\t66025.0\n7601\t-95.264736\t38.959523\tLawrence city\tKS\tKansas\tDouglas County\t89377\t26.7\t52.9\t7.9\t24109\t149946\t0.6079\t66044\tRomney\t66044\t0.23297010399999998\t66044.0\n7602\t-95.39243499999999\t39.044136\tLecompton city\tKS\tKansas\tDouglas County\t706\t35.9\t18.4\t4.5\t19882\t91087\t0.6079\t66050\tRomney\t66050\t0.00184026\t66050.0\n7603\t-95.187348\t38.779744\tBaldwin City\tKS\tKansas\tDouglas County\t4437\t34.8\t35.5\t3.5\t24875\t134140\t0.6079\t66006\tRomney\t66006\t0.011565485\t66006.0\n7604\t-99.099888\t37.950476\tBelpre city\tKS\tKansas\tEdwards County\t89\t40.4\t21.7\t7.5\t17707\t47500\t0.2152\t67519\tRomney\t67519\t0.000231987\t67519.0\n7605\t-99.411175\t37.922473\tKinsley city\tKS\tKansas\tEdwards County\t1552\t45.9\t15.4\t5.5\t19837\t52016\t0.2152\t67547\tRomney\t67547\t0.004045443\t67547.0\n7606\t-99.560456\t37.890768\tOfferle city\tKS\tKansas\tEdwards County\t192\t44.1\t27.1\t1.6\t20424\t73333\t0.2152\t67563\tRomney\t67563\t0.000500467\t67563.0\n7607\t-99.254435\t37.937\tLewis city\tKS\tKansas\tEdwards County\t416\t40.6\t22.1\t6.9\t17706\t50000\t0.2152\t67552\tRomney\t67552\t0.0010843460000000001\t67552.0\n7608\t-96.449184\t37.350808\tGrenola city\tKS\tKansas\tElk County\t207\t50.4\t17.5\t7.1\t18390\t75000\t0.2053\t67346\tRomney\t67346\t0.000539566\t67346.0\n7609\t-96.082197\t37.377691\tLongton city\tKS\tKansas\tElk County\t364\t39.9\t8.5\t4.8\t15321\t49444\t0.2053\t67352\tRomney\t67352\t0.000948802\t67352.0\n7610\t-96.2631\t37.469481\tHoward city\tKS\tKansas\tElk County\t865\t48.2\t8.1\t6.1\t17714\t44597\t0.2053\t67349\tRomney\t67349\t0.002254709\t67349.0\n7611\t-96.30249599999999\t37.363608\tMoline city\tKS\tKansas\tElk County\t409\t51.2\t9.4\t18.2\t21116\t32292\t0.2053\t67353\tRomney\t67353\t0.001066099\t67353.0\n7612\t-96.192351\t37.373844\tElk Falls city\tKS\tKansas\tElk County\t99\t53.1\t14.1\t3.8\t20731\t98750\t0.2053\t67345\tRomney\t67345\t0.000258053\t67345.0\n7613\t-99.320442\t38.879049\tHays city\tKS\tKansas\tEllis County\t20099\t31.6\t37.7\t4.5\t24107\t124627\t0.261\t67601\tRomney\t67601\t0.052390057000000004\t67601.0\n7614\t-99.33174100000001\t38.712861\tSchoenchen city\tKS\tKansas\tEllis County\t217\t42.7\t33.8\t1.7\t22468\t112500\t0.261\t67667\tRomney\t67667\t0.0005656319999999999\t67667.0\n7615\t-99.559201\t38.936796\tEllis city\tKS\tKansas\tEllis County\t1824\t42.7\t23.8\t3.5\t17457\t75455\t0.261\t67637\tRomney\t67637\t0.004754439\t67637.0\n7616\t-99.147345\t38.853627\tVictoria city\tKS\tKansas\tEllis County\t1143\t45.5\t18.4\t3.7\t18311\t94333\t0.261\t67671\tRomney\t67671\t0.002979344\t67671.0\n7617\t-98.157984\t38.708151\tKanopolis city\tKS\tKansas\tEllsworth County\t507\t48.7\t10.6\t7.2\t20973\t47727\t0.2588\t67454\tRomney\t67454\t0.001321546\t67454.0\n7618\t-98.475522\t38.825683000000005\tWilson city\tKS\tKansas\tEllsworth County\t746\t47.0\t16.8\t2.0\t20296\t55806\t0.2588\t67490\tRomney\t67490\t0.001944524\t67490.0\n7619\t-98.31716999999999\t38.569109999999995\tLorraine city\tKS\tKansas\tEllsworth County\t127\t47.3\t21.1\t5.4\t20462\t51667\t0.2588\t67459\tRomney\t67459\t0.000331038\t67459.0\n7620\t-98.22745400000001\t38.735782\tEllsworth city\tKS\tKansas\tEllsworth County\t2938\t40.5\t16.0\t5.0\t20399\t71452\t0.2588\t67439\tRomney\t67439\t0.007658191\t67439.0\n7621\t-98.41259699999999\t38.587148\tHolyrood city\tKS\tKansas\tEllsworth County\t434\t46.8\t20.3\t5.0\t20427\t53636\t0.2588\t67450\tRomney\t67450\t0.0011312639999999999\t67450.0\n7622\t-100.860804\t37.977740000000004\tGarden City\tKS\tKansas\tFinney County\t27978\t29.2\t15.0\t6.3\t19931\t106917\t0.2952\t67846\tRomney\t67846\t0.07292746\t67846.0\n7623\t-100.986695\t37.990196000000005\tHolcomb city\tKS\tKansas\tFinney County\t1919\t27.8\t14.2\t3.8\t17257\t107460\t0.2952\t67851\tRomney\t67851\t0.0050020659999999995\t67851.0\n7624\t-99.754796\t37.848024\tSpearville city\tKS\tKansas\tFord County\t887\t42.2\t23.4\t1.5\t20226\t101862\t0.3109\t67876\tRomney\t67876\t0.002312054\t67876.0\n7625\t-100.020459\t37.759033\tDodge City\tKS\tKansas\tFord County\t26247\t29.9\t20.7\t5.9\t19522\t98657\t0.3109\t67801\tRomney\t67801\t0.068415435\t67801.0\n7626\t-99.63509\t37.549284\tBucklin city\tKS\tKansas\tFord County\t728\t42.8\t24.1\t2.9\t19186\t78000\t0.3109\t67834\tRomney\t67834\t0.001897605\t67834.0\n7627\t-99.753895\t37.636706\tFord city\tKS\tKansas\tFord County\t306\t39.9\t20.7\t2.6\t20995\t82500\t0.3109\t67842\tRomney\t67842\t0.00079762\t67842.0\n7628\t-95.100975\t38.547844\tRantoul city\tKS\tKansas\tFranklin County\t264\t41.1\t16.2\t9.0\t21290\t115000\t0.3361\t66079\tRomney\t66079\t0.000688142\t66079.0\n7629\t-95.45290200000001\t38.610415\tPomona city\tKS\tKansas\tFranklin County\t1049\t39.5\t11.5\t9.2\t16261\t85000\t0.3361\t66076\tRomney\t66076\t0.002734324\t66076.0\n7630\t-95.081304\t38.440131\tLane city\tKS\tKansas\tFranklin County\t283\t41.9\t18.7\t4.6\t20328\t94000\t0.3361\t66042\tRomney\t66042\t0.000737668\t66042.0\n7631\t-95.27148299999999\t38.488606\tPrinceton city\tKS\tKansas\tFranklin County\t350\t42.5\t14.6\t6.7\t21480\t112500\t0.3361\t66078\tRomney\t66078\t0.00091231\t66078.0\n7632\t-95.253519\t38.401315000000004\tRichmond city\tKS\tKansas\tFranklin County\t578\t36.6\t10.8\t11.3\t16917\t58158\t0.3361\t66080\tRomney\t66080\t0.001506615\t66080.0\n7633\t-95.267301\t38.608785\tOttawa city\tKS\tKansas\tFranklin County\t12407\t35.0\t24.5\t7.6\t22068\t86522\t0.3361\t66067\tRomney\t66067\t0.032340087999999996\t66067.0\n7634\t-95.08128599999999\t38.718095\tWellsville city\tKS\tKansas\tFranklin County\t1836\t36.5\t15.5\t5.0\t22921\t104583\t0.3361\t66092\tRomney\t66092\t0.004785718\t66092.0\n7635\t-95.466217\t38.479765\tWilliamsburg city\tKS\tKansas\tFranklin County\t382\t40.6\t17.9\t12.8\t21916\t94500\t0.3361\t66095\tRomney\t66095\t0.000995721\t66095.0\n7636\t-96.841148\t39.028773\tJunction City\tKS\tKansas\tGeary County\t20792\t32.6\t19.6\t7.9\t20641\t89267\t0.4247\t66441\tRomney\t66441\t0.054196430999999996\t66441.0\n7637\t-96.91291899999999\t39.174494\tMilford city\tKS\tKansas\tGeary County\t581\t38.9\t20.1\t9.5\t22527\t140441\t0.4247\t66514\tRomney\t66514\t0.001514435\t66514.0\n7638\t-96.773257\t39.083622\tFort Riley-Camp Whiteside CDP\tKS\tKansas\tGeary County\t95\t21.7\t33.3\t22.2\t16103\t0\t0.4247\t664HH\tRomney\t664HH\t0.000247627\t0.0\n7639\t-96.792457\t39.032173\tGrandview Plaza city\tKS\tKansas\tGeary County\t2631\t32.4\t6.8\t6.5\t21349\t45789\t0.4247\t66442\tRomney\t66442\t0.006857965\t66442.0\n7640\t-100.490155\t38.960058000000004\tGove City\tKS\tKansas\tGove County\t91\t46.1\t23.4\t1.8\t22819\t53333\t0.1273\t67736\tRomney\t67736\t0.00023720099999999998\t67736.0\n7641\t-100.46843199999999\t39.11412\tGrainfield city\tKS\tKansas\tGove County\t284\t46.5\t23.5\t1.8\t22780\t55000\t0.1273\t67737\tRomney\t67737\t0.000740274\t67737.0\n7642\t-100.631229\t39.12656\tGrinnell city\tKS\tKansas\tGove County\t286\t46.4\t23.4\t1.7\t22759\t56000\t0.1273\t67738\tRomney\t67738\t0.000745488\t67738.0\n7643\t-100.36135999999999\t39.111816\tPark city\tKS\tKansas\tGove County\t130\t42.1\t18.0\t1.4\t18738\t81000\t0.1273\t67751\tRomney\t67751\t0.00033885800000000004\t67751.0\n7644\t-100.234677\t39.066825\tQuinter city\tKS\tKansas\tGove County\t953\t47.0\t22.9\t5.1\t19554\t82273\t0.1273\t67752\tRomney\t67752\t0.00248409\t67752.0\n7645\t-99.846304\t39.366611999999996\tHill City\tKS\tKansas\tGraham County\t1531\t50.1\t20.7\t4.9\t20993\t63558\t0.191\t67642\tRomney\t67642\t0.003990705\t67642.0\n7646\t-99.687719\t39.359569\tBogue city\tKS\tKansas\tGraham County\t152\t47.9\t15.5\t3.6\t18201\t62500\t0.191\t67625\tRomney\t67625\t0.00039620300000000003\t67625.0\n7647\t-100.074279\t39.348982\tMorland city\tKS\tKansas\tGraham County\t134\t45.9\t26.6\t2.7\t20599\t52500\t0.191\t67650\tRomney\t67650\t0.000349284\t67650.0\n7648\t-101.35539200000001\t37.578505\tUlysses city\tKS\tKansas\tGrant County\t5707\t33.3\t17.9\t6.6\t21510\t98958\t0.1977\t67880\tRomney\t67880\t0.014875867\t67880.0\n7649\t-100.442587\t37.595818\tMontezuma city\tKS\tKansas\tGray County\t981\t38.4\t17.2\t4.4\t21745\t100000\t0.1655\t67867\tRomney\t67867\t0.002557075\t67867.0\n7650\t-100.629139\t37.540512\tCopeland city\tKS\tKansas\tGray County\t343\t33.5\t12.0\t2.4\t19209\t95000\t0.1655\t67837\tRomney\t67837\t0.000894064\t67837.0\n7651\t-100.453475\t37.82853\tIngalls city\tKS\tKansas\tGray County\t322\t33.9\t23.3\t1.5\t19836\t91250\t0.1655\t67853\tRomney\t67853\t0.000839325\t67853.0\n7652\t-100.346335\t37.809051000000004\tCimarron city\tKS\tKansas\tGray County\t1959\t35.2\t26.8\t3.7\t21790\t106931\t0.1655\t67835\tRomney\t67835\t0.00510633\t67835.0\n7653\t-100.233089\t37.653089\tEnsign city\tKS\tKansas\tGray County\t191\t32.3\t17.1\t3.4\t16900\t82500\t0.1655\t67841\tRomney\t67841\t0.0004978609999999999\t67841.0\n7654\t-101.75440400000001\t38.47183\tTribune city\tKS\tKansas\tGreeley County\t807\t46.3\t19.8\t0.9\t22491\t75000\t0.1687\t67879\tRomney\t67879\t0.002103526\t67879.0\n7655\t-101.790412\t38.476944\tHorace city\tKS\tKansas\tGreeley County\t113\t35.0\t14.7\t6.5\t22358\t80000\t0.1687\t67879\tRomney\t67879\t0.00029454599999999997\t67879.0\n7656\t-96.224079\t37.719245\tClimax city\tKS\tKansas\tGreenwood County\t53\t45.6\t17.9\t0.0\t18448\t85000\t0.2252\t67137\tRomney\t67137\t0.00013815\t67137.0\n7657\t-96.028572\t37.607785\tFall River city\tKS\tKansas\tGreenwood County\t152\t53.8\t13.9\t6.5\t21865\t56250\t0.2252\t67047\tRomney\t67047\t0.00039620300000000003\t67047.0\n7658\t-96.28866500000001\t37.823202\tEureka city\tKS\tKansas\tGreenwood County\t2829\t44.0\t16.1\t9.3\t18331\t54227\t0.2252\t67045\tRomney\t67045\t0.007374072\t67045.0\n7659\t-96.227553\t37.621959000000004\tSevery city\tKS\tKansas\tGreenwood County\t300\t45.3\t17.0\t1.8\t18278\t67500\t0.2252\t67137\tRomney\t67137\t0.00078198\t67137.0\n7660\t-96.011652\t37.980808\tVirgil city\tKS\tKansas\tGreenwood County\t91\t41.7\t23.1\t2.2\t17723\t35000\t0.2252\t66870\tRomney\t66870\t0.00023720099999999998\t66870.0\n7661\t-96.163832\t37.980618\tHamilton city\tKS\tKansas\tGreenwood County\t270\t42.3\t22.3\t2.9\t17656\t35000\t0.2252\t66853\tRomney\t66853\t0.000703782\t66853.0\n7662\t-96.137221\t38.133949\tMadison city\tKS\tKansas\tGreenwood County\t703\t44.9\t19.2\t5.5\t18140\t52500\t0.2252\t66860\tRomney\t66860\t0.00183244\t66860.0\n7663\t-102.007754\t38.041416\tCoolidge city\tKS\tKansas\tHamilton County\t87\t36.8\t14.0\t4.5\t15775\t70000\t0.1859\t67836\tRomney\t67836\t0.000226774\t67836.0\n7664\t-101.751068\t37.980131\tSyracuse city\tKS\tKansas\tHamilton County\t1840\t39.5\t17.7\t3.2\t18944\t85326\t0.1859\t67878\tRomney\t67878\t0.0047961440000000004\t67878.0\n7665\t-98.226925\t37.242864000000004\tAttica city\tKS\tKansas\tHarper County\t668\t50.1\t19.6\t7.5\t18905\t47778\t0.2302\t67009\tRomney\t67009\t0.0017412089999999999\t67009.0\n7666\t-98.029758\t37.154425\tAnthony city\tKS\tKansas\tHarper County\t2220\t42.0\t18.0\t5.4\t18256\t61978\t0.2302\t67003\tRomney\t67003\t0.005786652\t67003.0\n7667\t-98.026649\t37.285494\tHarper city\tKS\tKansas\tHarper County\t1399\t44.5\t14.6\t6.9\t18687\t58293\t0.2302\t67058\tRomney\t67058\t0.003646634\t67058.0\n7668\t-98.182519\t37.001796\tWaldron city\tKS\tKansas\tHarper County\t13\t55.0\t20.0\t0.0\t19176\t125000\t0.2302\t67150\tRomney\t67150\t3.39e-05\t67150.0\n7669\t-97.874897\t37.076039\tBluff City\tKS\tKansas\tHarper County\t62\t48.0\t17.0\t4.9\t18885\t85000\t0.2302\t67018\tRomney\t67018\t0.000161609\t67018.0\n7670\t-97.854108\t37.198858\tFreeport city\tKS\tKansas\tHarper County\t5\t0.0\t0.0\t0.0\t21850\t0\t0.2302\t67049\tRomney\t67049\t1.3000000000000001e-05\t67049.0\n7671\t-97.892185\t37.286029\tDanville city\tKS\tKansas\tHarper County\t50\t48.8\t13.5\t6.9\t21577\t112500\t0.2302\t67036\tRomney\t67036\t0.00013033\t67036.0\n7672\t-97.423536\t37.918099\tSedgwick city\tKS\tKansas\tHarvey County\t1572\t38.3\t17.0\t6.5\t24410\t86538\t0.3759\t67135\tRomney\t67135\t0.004097575\t67135.0\n7673\t-97.256213\t38.1183\tWalton city\tKS\tKansas\tHarvey County\t286\t36.4\t14.6\t8.5\t21982\t91667\t0.3759\t67151\tRomney\t67151\t0.000745488\t67151.0\n7674\t-97.67205799999999\t38.023716\tBurrton city\tKS\tKansas\tHarvey County\t936\t33.3\t12.3\t9.5\t16880\t65926\t0.3759\t67020\tRomney\t67020\t0.002439778\t67020.0\n7675\t-97.343191\t38.042121\tNewton city\tKS\tKansas\tHarvey County\t17441\t38.2\t25.8\t8.8\t22954\t87802\t0.3759\t67114\tRomney\t67114\t0.045461714\t67114.0\n7676\t-97.42763199999999\t38.140429\tHesston city\tKS\tKansas\tHarvey County\t3720\t39.2\t35.5\t9.0\t24446\t122115\t0.3759\t67062\tRomney\t67062\t0.009696553\t67062.0\n7677\t-97.347398\t38.076749\tNorth Newton city\tKS\tKansas\tHarvey County\t1564\t50.2\t52.9\t8.7\t27992\t119072\t0.3759\t67117\tRomney\t67117\t0.004076723\t67117.0\n7678\t-97.509364\t37.999848\tHalstead city\tKS\tKansas\tHarvey County\t1933\t38.7\t22.0\t11.1\t25450\t91016\t0.3759\t67056\tRomney\t67056\t0.005038558\t67056.0\n7679\t-100.84633000000001\t37.480662\tSublette city\tKS\tKansas\tHaskell County\t1481\t34.6\t21.2\t3.3\t20510\t98636\t0.154\t67877\tRomney\t67877\t0.003860375\t67877.0\n7680\t-100.98841800000001\t37.436551\tSatanta city\tKS\tKansas\tHaskell County\t1190\t35.0\t15.2\t7.5\t17512\t74231\t0.154\t67870\tRomney\t67870\t0.0031018540000000002\t67870.0\n7681\t-99.71263\t38.122935\tHanston city\tKS\tKansas\tHodgeman County\t263\t47.1\t27.9\t1.5\t20729\t63333\t0.1689\t67849\tRomney\t67849\t0.000685536\t67849.0\n7682\t-99.893865\t38.083163\tJetmore city\tKS\tKansas\tHodgeman County\t956\t42.3\t21.2\t3.7\t17284\t67931\t0.1689\t67854\tRomney\t67854\t0.00249191\t67854.0\n7683\t-95.611168\t39.587855\tWhiting city\tKS\tKansas\tJackson County\t220\t45.2\t15.8\t5.6\t20384\t101136\t0.3418\t66552\tRomney\t66552\t0.000573452\t66552.0\n7684\t-95.706377\t39.25\tHoyt city\tKS\tKansas\tJackson County\t700\t39.4\t19.2\t4.6\t20870\t110500\t0.3418\t66440\tRomney\t66440\t0.00182462\t66440.0\n7685\t-95.740965\t39.463986\tHolton city\tKS\tKansas\tJackson County\t3299\t41.5\t22.7\t4.5\t23009\t90929\t0.3418\t66436\tRomney\t66436\t0.008599174000000001\t66436.0\n7686\t-95.965564\t39.537358000000005\tSoldier city\tKS\tKansas\tJackson County\t122\t40.6\t22.2\t6.8\t18392\t102500\t0.3418\t66540\tRomney\t66540\t0.000318005\t66540.0\n7687\t-95.718858\t39.602946\tNetawaka city\tKS\tKansas\tJackson County\t159\t39.0\t21.0\t4.9\t20165\t103125\t0.3418\t66516\tRomney\t66516\t0.000414449\t66516.0\n7688\t-95.856047\t39.508863\tCircleville city\tKS\tKansas\tJackson County\t184\t40.6\t22.8\t6.7\t18495\t101563\t0.3418\t66416\tRomney\t66416\t0.000479614\t66416.0\n7689\t-95.964697\t39.239349\tDelia city\tKS\tKansas\tJackson County\t212\t36.0\t10.9\t6.1\t18768\t88750\t0.3418\t66418\tRomney\t66418\t0.000552599\t66418.0\n7690\t-95.628598\t39.393803000000005\tDenison city\tKS\tKansas\tJackson County\t238\t40.8\t17.9\t9.4\t20776\t106731\t0.3418\t66419\tRomney\t66419\t0.000620371\t66419.0\n7691\t-95.721866\t39.338889\tMayetta city\tKS\tKansas\tJackson County\t342\t38.5\t14.9\t2.9\t20414\t110294\t0.3418\t66509\tRomney\t66509\t0.000891457\t66509.0\n7692\t-95.314432\t39.216164\tOskaloosa city\tKS\tKansas\tJefferson County\t1241\t41.8\t20.3\t9.0\t21233\t87742\t0.3715\t66066\tRomney\t66066\t0.003234791\t66066.0\n7693\t-95.567329\t39.189262\tMeriden city\tKS\tKansas\tJefferson County\t731\t36.4\t16.7\t6.1\t21645\t95000\t0.3715\t66512\tRomney\t66512\t0.001905425\t66512.0\n7694\t-95.268777\t39.322523\tWinchester city\tKS\tKansas\tJefferson County\t588\t40.5\t17.0\t7.7\t20334\t80000\t0.3715\t66097\tRomney\t66097\t0.0015326810000000001\t66097.0\n7695\t-95.460881\t39.340839\tValley Falls city\tKS\tKansas\tJefferson County\t1188\t39.6\t22.7\t5.3\t18300\t89400\t0.3715\t66088\tRomney\t66088\t0.003096641\t66088.0\n7696\t-95.208523\t39.195671000000004\tMcLouth city\tKS\tKansas\tJefferson County\t925\t39.9\t12.8\t5.7\t21638\t111779\t0.3715\t66054\tRomney\t66054\t0.002411105\t66054.0\n7697\t-95.46572900000001\t39.235586\tOzawkie city\tKS\tKansas\tJefferson County\t602\t41.5\t30.9\t8.5\t24635\t113235\t0.3715\t66070\tRomney\t66070\t0.0015691729999999999\t66070.0\n7698\t-95.386661\t39.072866999999995\tPerry city\tKS\tKansas\tJefferson County\t917\t38.6\t21.2\t5.7\t21148\t104592\t0.3715\t66073\tRomney\t66073\t0.0023902520000000003\t66073.0\n7699\t-95.33044\t39.415856\tNortonville city\tKS\tKansas\tJefferson County\t676\t42.4\t18.0\t6.6\t21700\t72903\t0.3715\t66060\tRomney\t66060\t0.0017620620000000002\t66060.0\n7700\t-98.434033\t39.822004\tEsbon city\tKS\tKansas\tJewell County\t130\t47.0\t14.9\t4.8\t17727\t32500\t0.153\t66941\tRomney\t66941\t0.00033885800000000004\t66941.0\n7701\t-98.045484\t39.641560999999996\tRandall city\tKS\tKansas\tJewell County\t69\t48.3\t13.7\t0.0\t20236\t66667\t0.153\t66963\tRomney\t66963\t0.000179855\t66963.0\n7702\t-97.993227\t39.779075\tFormoso city\tKS\tKansas\tJewell County\t100\t53.6\t12.8\t3.0\t20609\t40000\t0.153\t66942\tRomney\t66942\t0.00026066\t66942.0\n7703\t-98.035176\t39.934459999999994\tWebber city\tKS\tKansas\tJewell County\t29\t51.3\t13.6\t5.0\t20384\t35000\t0.153\t66970\tRomney\t66970\t7.56e-05\t66970.0\n7704\t-98.208277\t39.787426\tMankato city\tKS\tKansas\tJewell County\t881\t51.2\t20.7\t4.3\t21705\t53750\t0.153\t66956\tRomney\t66956\t0.002296415\t66956.0\n7705\t-98.152226\t39.671671\tJewell city\tKS\tKansas\tJewell County\t447\t44.5\t16.0\t6.2\t19435\t37500\t0.153\t66949\tRomney\t66949\t0.00116515\t66949.0\n7706\t-98.305637\t39.870058\tBurr Oak city\tKS\tKansas\tJewell County\t232\t46.7\t14.7\t5.3\t17787\t30417\t0.153\t66936\tRomney\t66936\t0.000604731\t66936.0\n7707\t-94.61084699999999\t39.033712\tMission Woods city\tKS\tKansas\tJohnson County\t166\t42.1\t78.6\t5.6\t62738\t296875\t0.4028\t66205\tRomney\t66205\t0.000432696\t66205.0\n7708\t-94.656881\t39.02729\tMission city\tKS\tKansas\tJohnson County\t10157\t37.0\t48.9\t7.9\t36279\t144622\t0.4028\t66202\tRomney\t66202\t0.026475237999999998\t66202.0\n7709\t-94.684984\t38.915038\tOverland Park city\tKS\tKansas\tJohnson County\t179709\t37.8\t56.6\t5.6\t41756\t210893\t0.4028\t66210\tRomney\t66210\t0.46842951\t66210.0\n7710\t-94.807624\t39.015718\tShawnee city\tKS\tKansas\tJohnson County\t60879\t36.9\t43.6\t5.0\t36482\t184225\t0.4028\t66218\tRomney\t66218\t0.158687212\t66218.0\n7711\t-94.917683\t38.809626\tGardner city\tKS\tKansas\tJohnson County\t14157\t30.7\t24.2\t7.2\t26374\t133464\t0.4028\t66030\tRomney\t66030\t0.036901639\t66030.0\n7712\t-94.61712800000001\t39.013867\tMission Hills city\tKS\tKansas\tJohnson County\t3704\t47.9\t84.8\t3.5\t90535\t707766\t0.4028\t66208\tRomney\t66208\t0.009654847\t66208.0\n7713\t-94.653925\t39.016865\tCountryside city\tKS\tKansas\tJohnson County\t300\t41.8\t47.1\t2.9\t40836\t148214\t0.4028\t66202\tRomney\t66202\t0.00078198\t66202.0\n7714\t-94.95241899999999\t38.969978000000005\tDe Soto city\tKS\tKansas\tJohnson County\t6053\t34.4\t28.7\t5.1\t27583\t158638\t0.4028\t66018\tRomney\t66018\t0.015777751\t66018.0\n7715\t-94.637396\t39.035839\tRoeland Park city\tKS\tKansas\tJohnson County\t7230\t39.2\t45.5\t7.7\t34608\t136627\t0.4028\t66205\tRomney\t66205\t0.018845719\t66205.0\n7716\t-94.609661\t39.038951000000004\tWestwood Hills city\tKS\tKansas\tJohnson County\t381\t40.9\t71.2\t6.2\t50804\t232143\t0.4028\t66205\tRomney\t66205\t0.000993115\t66205.0\n7717\t-94.823513\t38.747438\tSpring Hill city\tKS\tKansas\tJohnson County\t3825\t33.7\t18.5\t4.8\t26382\t137557\t0.4028\t66083\tRomney\t66083\t0.009970246\t66083.0\n7718\t-94.768325\t39.04647\tLake Quivira city\tKS\tKansas\tJohnson County\t955\t43.9\t62.4\t5.4\t58719\t358712\t0.4028\t66217\tRomney\t66217\t0.002489303\t66217.0\n7719\t-94.625716\t38.907534000000005\tLeawood city\tKS\tKansas\tJohnson County\t32054\t43.8\t70.2\t4.4\t57674\t343379\t0.4028\t66209\tRomney\t66209\t0.08355196200000001\t66209.0\n7720\t-94.62866700000001\t39.024370000000005\tFairway city\tKS\tKansas\tJohnson County\t3993\t42.7\t73.8\t4.5\t57414\t245954\t0.4028\t66205\tRomney\t66205\t0.010408154000000001\t66205.0\n7721\t-95.012504\t38.762089\tEdgerton city\tKS\tKansas\tJohnson County\t1854\t31.6\t12.2\t4.8\t22524\t105759\t0.4028\t66021\tRomney\t66021\t0.004832637\t66021.0\n7722\t-94.801833\t38.960881\tLenexa city\tKS\tKansas\tJohnson County\t47628\t37.4\t53.3\t6.1\t37976\t205083\t0.4028\t66220\tRomney\t66220\t0.12414715300000001\t66220.0\n7723\t-94.636112\t38.987392\tPrairie Village city\tKS\tKansas\tJohnson County\t22276\t44.1\t62.0\t6.0\t43167\t180007\t0.4028\t66208\tRomney\t66208\t0.058064625\t66208.0\n7724\t-94.81854\t38.888964\tOlathe city\tKS\tKansas\tJohnson County\t121262\t32.5\t43.9\t5.7\t32832\t183094\t0.4028\t66061\tRomney\t66061\t0.31608155\t66061.0\n7725\t-94.69335\t39.018627\tMerriam city\tKS\tKansas\tJohnson County\t10999\t39.4\t36.9\t7.5\t31681\t145263\t0.4028\t66203\tRomney\t66203\t0.028669995\t66203.0\n7726\t-94.615627\t39.039344\tWestwood city\tKS\tKansas\tJohnson County\t1551\t42.3\t56.7\t4.9\t42852\t173037\t0.4028\t66205\tRomney\t66205\t0.0040428370000000005\t66205.0\n7727\t-101.13301899999999\t37.98186\tDeerfield city\tKS\tKansas\tKearny County\t876\t32.1\t10.4\t4.5\t16281\t71500\t0.1934\t67838\tRomney\t67838\t0.002283382\t67838.0\n7728\t-101.258707\t37.939983000000005\tLakin city\tKS\tKansas\tKearny County\t2239\t32.8\t19.0\t4.6\t19058\t102909\t0.1934\t67860\tRomney\t67860\t0.005836178000000001\t67860.0\n7729\t-98.16572\t37.448377\tSpivey city\tKS\tKansas\tKingman County\t72\t46.1\t10.0\t4.3\t21813\t63333\t0.2269\t67142\tRomney\t67142\t0.000187675\t67142.0\n7730\t-98.319903\t37.716162\tPenalosa city\tKS\tKansas\tKingman County\t24\t45.0\t12.5\t6.3\t22106\t65000\t0.2269\t67035\tRomney\t67035\t6.26e-05\t67035.0\n7731\t-98.42271600000001\t37.438164\tNashville city\tKS\tKansas\tKingman County\t95\t43.5\t22.4\t1.8\t16086\t40000\t0.2269\t67112\tRomney\t67112\t0.000247627\t67112.0\n7732\t-98.432508\t37.645123999999996\tCunningham city\tKS\tKansas\tKingman County\t396\t51.4\t15.2\t3.8\t20609\t57273\t0.2269\t67035\tRomney\t67035\t0.001032214\t67035.0\n7733\t-98.115688\t37.647121999999996\tKingman city\tKS\tKansas\tKingman County\t3086\t39.9\t24.0\t3.6\t21848\t77000\t0.2269\t67068\tRomney\t67068\t0.008043968\t67068.0\n7734\t-98.281657\t37.444705\tZenda city\tKS\tKansas\tKingman County\t105\t45.0\t21.6\t3.2\t16132\t40000\t0.2269\t67159\tRomney\t67159\t0.000273693\t67159.0\n7735\t-97.847852\t37.457405\tNorwich city\tKS\tKansas\tKingman County\t508\t43.9\t14.1\t6.9\t19602\t93750\t0.2269\t67118\tRomney\t67118\t0.0013241529999999998\t67118.0\n7736\t-99.292957\t37.604755\tGreensburg city\tKS\tKansas\tKiowa County\t1234\t47.0\t21.1\t8.2\t19394\t65441\t0.1425\t67054\tRomney\t67054\t0.003216545\t67054.0\n7737\t-99.104913\t37.617513\tHaviland city\tKS\tKansas\tKiowa County\t616\t35.9\t28.6\t1.3\t17962\t47500\t0.1425\t67059\tRomney\t67059\t0.001605666\t67059.0\n7738\t-99.475512\t37.588871999999995\tMullinville city\tKS\tKansas\tKiowa County\t274\t43.3\t19.8\t3.0\t22636\t66875\t0.1425\t67109\tRomney\t67109\t0.000714208\t67109.0\n7739\t-95.404705\t37.207133\tMound Valley city\tKS\tKansas\tLabette County\t394\t35.7\t8.9\t9.7\t12851\t47353\t0.3878\t67354\tRomney\t67354\t0.001027\t67354.0\n7740\t-95.26729\t37.340293\tParsons city\tKS\tKansas\tLabette County\t11036\t38.1\t19.6\t8.4\t19653\t59698\t0.3878\t67357\tRomney\t67357\t0.02876644\t67357.0\n7741\t-95.358878\t37.058712\tEdna city\tKS\tKansas\tLabette County\t460\t44.1\t16.1\t8.8\t19232\t70000\t0.3878\t67342\tRomney\t67342\t0.0011990360000000001\t67342.0\n7742\t-95.295851\t37.190045\tAltamont city\tKS\tKansas\tLabette County\t1050\t41.1\t22.0\t4.1\t18648\t78065\t0.3878\t67330\tRomney\t67330\t0.00273693\t67330.0\n7743\t-95.09248000000001\t37.037456\tChetopa city\tKS\tKansas\tLabette County\t1198\t46.5\t10.2\t6.4\t14268\t46863\t0.3878\t67336\tRomney\t67336\t0.003122707\t67336.0\n7744\t-95.21113000000001\t37.054946\tBartlett city\tKS\tKansas\tLabette County\t130\t41.8\t21.3\t5.8\t17291\t103571\t0.3878\t67332\tRomney\t67332\t0.00033885800000000004\t67332.0\n7745\t-95.11223100000001\t37.167609000000006\tOswego city\tKS\tKansas\tLabette County\t1973\t36.2\t18.0\t8.0\t17239\t54417\t0.3878\t67356\tRomney\t67356\t0.005142822\t67356.0\n7746\t-95.183571\t37.230234\tLabette city\tKS\tKansas\tLabette County\t70\t46.3\t12.0\t13.2\t20155\t80000\t0.3878\t67356\tRomney\t67356\t0.00018246200000000002\t67356.0\n7747\t-100.466388\t38.481119\tDighton city\tKS\tKansas\tLane County\t1108\t45.8\t21.0\t2.6\t22796\t61250\t0.1853\t67839\tRomney\t67839\t0.002888113\t67839.0\n7748\t-95.083339\t39.110028\tTonganoxie city\tKS\tKansas\tLeavenworth County\t3619\t35.8\t21.2\t6.3\t22915\t116981\t0.3905\t66086\tRomney\t66086\t0.009433285999999999\t66086.0\n7749\t-94.923949\t39.323875\tLeavenworth city\tKS\tKansas\tLeavenworth County\t37677\t34.0\t31.1\t8.8\t22597\t89458\t0.3905\t66027\tRomney\t66027\t0.098208875\t66027.0\n7750\t-94.888797\t39.250107\tLansing city\tKS\tKansas\tLeavenworth County\t10451\t37.6\t26.1\t5.0\t25995\t135653\t0.3905\t66043\tRomney\t66043\t0.027241578\t66043.0\n7751\t-94.931715\t39.129678999999996\tBasehor city\tKS\tKansas\tLeavenworth County\t2694\t41.2\t17.5\t4.0\t25657\t139201\t0.3905\t66007\tRomney\t66007\t0.007022181\t66007.0\n7752\t-95.116547\t39.344934\tEaston city\tKS\tKansas\tLeavenworth County\t378\t41.2\t18.5\t7.3\t19975\t102273\t0.3905\t66020\tRomney\t66020\t0.000985295\t66020.0\n7753\t-95.034818\t39.000205\tLinwood city\tKS\tKansas\tLeavenworth County\t413\t39.2\t19.8\t5.6\t22209\t116667\t0.3905\t66052\tRomney\t66052\t0.001076526\t66052.0\n7754\t-97.975438\t39.01386\tBeverly city\tKS\tKansas\tLincoln County\t157\t43.6\t13.9\t7.1\t17703\t67500\t0.1949\t67423\tRomney\t67423\t0.000409236\t67423.0\n7755\t-98.39451700000001\t39.012198\tSylvan Grove city\tKS\tKansas\tLincoln County\t332\t48.2\t20.6\t3.2\t17991\t59063\t0.1949\t67481\tRomney\t67481\t0.0008653910000000001\t67481.0\n7756\t-98.044256\t39.189234\tBarnard city\tKS\tKansas\tLincoln County\t111\t49.4\t23.3\t0.0\t18958\t53333\t0.1949\t67418\tRomney\t67418\t0.000289333\t67418.0\n7757\t-98.14698299999999\t39.042407\tLincoln Center city\tKS\tKansas\tLincoln County\t1284\t47.6\t21.8\t7.2\t19365\t59773\t0.1949\t67455\tRomney\t67455\t0.003346875\t67455.0\n7758\t-94.989738\t38.328573\tParker city\tKS\tKansas\tLinn County\t313\t39.8\t16.5\t16.9\t19113\t86429\t0.2619\t66072\tRomney\t66072\t0.000815866\t66072.0\n7759\t-94.695871\t38.063521\tPrescott city\tKS\tKansas\tLinn County\t295\t49.8\t10.4\t15.4\t19456\t68750\t0.2619\t66767\tRomney\t66767\t0.000768947\t66767.0\n7760\t-94.711376\t38.377755\tLinn Valley city\tKS\tKansas\tLinn County\t782\t42.6\t16.2\t9.1\t22607\t85455\t0.2619\t66040\tRomney\t66040\t0.0020383610000000003\t66040.0\n7761\t-94.892593\t38.121987\tMound City\tKS\tKansas\tLinn County\t797\t44.9\t17.2\t10.2\t18170\t56304\t0.2619\t66056\tRomney\t66056\t0.00207746\t66056.0\n7762\t-94.761179\t38.346781\tLa Cygne city\tKS\tKansas\tLinn County\t1039\t40.1\t16.3\t8.4\t20778\t80882\t0.2619\t66040\tRomney\t66040\t0.002708258\t66040.0\n7763\t-94.715455\t38.175352000000004\tPleasanton city\tKS\tKansas\tLinn County\t1516\t39.1\t11.9\t9.1\t16965\t64444\t0.2619\t66075\tRomney\t66075\t0.003951606\t66075.0\n7764\t-95.009812\t38.088871000000005\tBlue Mound city\tKS\tKansas\tLinn County\t304\t45.2\t27.3\t8.5\t22450\t86250\t0.2619\t66010\tRomney\t66010\t0.0007924060000000001\t66010.0\n7765\t-101.245181\t39.061723\tWinona city\tKS\tKansas\tLogan County\t183\t38.3\t20.5\t3.4\t20467\t55000\t0.1459\t67764\tRomney\t67764\t0.000477008\t67764.0\n7766\t-101.17586999999999\t38.912774\tRussell Springs city\tKS\tKansas\tLogan County\t26\t38.8\t18.8\t5.9\t20222\t47500\t0.1459\t67764\tRomney\t67764\t6.78e-05\t67764.0\n7767\t-100.810796\t39.133736999999996\tOakley city\tKS\tKansas\tLogan County\t1983\t45.0\t21.1\t3.7\t19971\t73019\t0.1459\t67748\tRomney\t67748\t0.005168888\t67748.0\n7768\t-96.167463\t38.262445\tOlpe city\tKS\tKansas\tLyon County\t472\t40.0\t18.4\t1.3\t18706\t109524\t0.4304\t66865\tRomney\t66865\t0.001230315\t66865.0\n7769\t-95.991905\t38.368586\tNeosho Rapids city\tKS\tKansas\tLyon County\t280\t45.2\t24.0\t6.1\t21935\t109559\t0.4304\t66864\tRomney\t66864\t0.0007298480000000001\t66864.0\n7770\t-96.16972\t38.655221999999995\tAllen city\tKS\tKansas\tLyon County\t212\t41.4\t29.9\t5.8\t19700\t72000\t0.4304\t66833\tRomney\t66833\t0.000552599\t66833.0\n7771\t-96.19230400000001\t38.40978\tEmporia city\tKS\tKansas\tLyon County\t26499\t29.6\t28.2\t9.5\t19945\t95265\t0.4304\t66801\tRomney\t66801\t0.069072298\t66801.0\n7772\t-95.957539\t38.519216\tReading city\tKS\tKansas\tLyon County\t245\t41.5\t22.2\t3.8\t21079\t105357\t0.4304\t66868\tRomney\t66868\t0.000638617\t66868.0\n7773\t-96.101973\t38.641414000000005\tAdmire city\tKS\tKansas\tLyon County\t178\t41.7\t30.1\t5.7\t19681\t72500\t0.4304\t66830\tRomney\t66830\t0.000463975\t66830.0\n7774\t-95.956811\t38.308236\tHartford city\tKS\tKansas\tLyon County\t474\t44.5\t24.3\t13.4\t19977\t83125\t0.4304\t66854\tRomney\t66854\t0.001235528\t66854.0\n7775\t-96.256674\t38.643009\tBushong city\tKS\tKansas\tLyon County\t55\t40.6\t31.6\t3.7\t19776\t75000\t0.4304\t66833\tRomney\t66833\t0.000143363\t66833.0\n7776\t-96.26160899999999\t38.50696\tAmericus city\tKS\tKansas\tLyon County\t889\t40.7\t20.9\t5.2\t19784\t92500\t0.4304\t66835\tRomney\t66835\t0.002317268\t66835.0\n7777\t-97.833913\t38.554788\tMarquette city\tKS\tKansas\tMcPherson County\t580\t46.5\t18.9\t6.8\t22015\t70625\t0.2805\t67464\tRomney\t67464\t0.0015118279999999998\t67464.0\n7778\t-97.538433\t38.383924\tGalva city\tKS\tKansas\tMcPherson County\t690\t38.5\t14.1\t3.3\t20885\t113438\t0.2805\t67443\tRomney\t67443\t0.001798554\t67443.0\n7779\t-97.664477\t38.371334000000004\tMcPherson city\tKS\tKansas\tMcPherson County\t13969\t36.7\t27.5\t3.2\t24369\t115644\t0.2805\t67460\tRomney\t67460\t0.036411597999999996\t67460.0\n7780\t-97.43003399999999\t38.385884999999995\tCanton city\tKS\tKansas\tMcPherson County\t823\t41.0\t10.2\t5.5\t21282\t88947\t0.2805\t67428\tRomney\t67428\t0.002145232\t67428.0\n7781\t-97.911023\t38.384187\tWindom city\tKS\tKansas\tMcPherson County\t134\t45.8\t21.2\t6.6\t23436\t114583\t0.2805\t67491\tRomney\t67491\t0.000349284\t67491.0\n7782\t-97.674122\t38.575479\tLindsborg city\tKS\tKansas\tMcPherson County\t3343\t36.5\t42.2\t7.5\t24484\t114962\t0.2805\t67456\tRomney\t67456\t0.008713864\t67456.0\n7783\t-97.517652\t38.204213\tMoundridge city\tKS\tKansas\tMcPherson County\t1566\t44.1\t21.8\t6.5\t22883\t106649\t0.2805\t67107\tRomney\t67107\t0.0040819359999999996\t67107.0\n7784\t-97.772942\t38.230515000000004\tInman city\tKS\tKansas\tMcPherson County\t1233\t44.7\t19.1\t6.9\t18673\t109021\t0.2805\t67546\tRomney\t67546\t0.003213938\t67546.0\n7785\t-97.30240400000001\t38.37422\tLehigh city\tKS\tKansas\tMarion County\t203\t42.5\t18.8\t2.5\t16376\t110417\t0.2561\t67073\tRomney\t67073\t0.00052914\t67073.0\n7786\t-97.227255\t38.484817\tDurham city\tKS\tKansas\tMarion County\t95\t40.8\t20.6\t2.0\t17876\t82500\t0.2561\t67438\tRomney\t67438\t0.000247627\t67438.0\n7787\t-97.205648\t38.349996999999995\tHillsboro city\tKS\tKansas\tMarion County\t2724\t40.7\t31.8\t7.6\t20862\t88571\t0.2561\t67063\tRomney\t67063\t0.007100379\t67063.0\n7788\t-97.063694\t38.597587\tRamona city\tKS\tKansas\tMarion County\t90\t46.1\t12.7\t4.4\t16907\t48750\t0.2561\t67475\tRomney\t67475\t0.00023459400000000002\t67475.0\n7789\t-96.92936999999999\t38.243175\tFlorence city\tKS\tKansas\tMarion County\t612\t47.8\t14.0\t11.0\t16351\t47143\t0.2561\t66851\tRomney\t66851\t0.001595239\t66851.0\n7790\t-96.888042\t38.089513000000004\tBurns city\tKS\tKansas\tMarion County\t270\t44.0\t17.6\t1.4\t18423\t70000\t0.2561\t66840\tRomney\t66840\t0.000703782\t66840.0\n7791\t-97.15433900000001\t38.547296\tTampa city\tKS\tKansas\tMarion County\t120\t39.2\t19.2\t1.6\t17880\t75000\t0.2561\t67483\tRomney\t67483\t0.000312792\t67483.0\n7792\t-97.34611899999999\t38.246961999999996\tGoessel city\tKS\tKansas\tMarion County\t526\t47.3\t21.5\t4.1\t19877\t111786\t0.2561\t67053\tRomney\t67053\t0.001371072\t67053.0\n7793\t-96.96564599999999\t38.566594\tLost Springs city\tKS\tKansas\tMarion County\t68\t43.8\t12.5\t5.7\t16904\t53333\t0.2561\t66859\tRomney\t66859\t0.000177249\t66859.0\n7794\t-97.016603\t38.3493\tMarion city\tKS\tKansas\tMarion County\t1975\t46.9\t21.3\t6.0\t20602\t83571\t0.2561\t66861\tRomney\t66861\t0.005148035\t66861.0\n7795\t-97.106516\t38.168796\tPeabody city\tKS\tKansas\tMarion County\t1265\t44.7\t14.6\t4.6\t18654\t69419\t0.2561\t66866\tRomney\t66866\t0.003297349\t66866.0\n7796\t-96.96166\t38.494411\tLincolnville city\tKS\tKansas\tMarion County\t209\t42.9\t19.0\t3.7\t17889\t54375\t0.2561\t66858\tRomney\t66858\t0.000544779\t66858.0\n7797\t-96.41779\t39.862348\tBeattie city\tKS\tKansas\tMarshall County\t277\t44.1\t7.6\t9.4\t17062\t55909\t0.3078\t66406\tRomney\t66406\t0.000722028\t66406.0\n7798\t-96.633648\t39.845596\tMarysville city\tKS\tKansas\tMarshall County\t3028\t46.0\t20.1\t5.0\t21711\t89762\t0.3078\t66508\tRomney\t66508\t0.007892785\t66508.0\n7799\t-96.417014\t39.703907\tFrankfort city\tKS\tKansas\tMarshall County\t786\t47.7\t19.1\t2.7\t18878\t50179\t0.3078\t66427\tRomney\t66427\t0.0020487879999999997\t66427.0\n7800\t-96.748749\t39.69193\tWaterville city\tKS\tKansas\tMarshall County\t575\t43.0\t25.5\t3.4\t21505\t67941\t0.3078\t66548\tRomney\t66548\t0.001498795\t66548.0\n7801\t-96.256599\t39.871253\tAxtell city\tKS\tKansas\tMarshall County\t445\t43.7\t11.6\t3.1\t15103\t58333\t0.3078\t66403\tRomney\t66403\t0.001159937\t66403.0\n7802\t-96.349262\t39.996922\tSummerfield city\tKS\tKansas\tMarshall County\t211\t43.9\t11.6\t3.3\t15100\t58000\t0.3078\t66541\tRomney\t66541\t0.000549993\t66541.0\n7803\t-96.26548000000001\t39.718066\tVermillion city\tKS\tKansas\tMarshall County\t101\t45.6\t14.3\t4.9\t19456\t105357\t0.3078\t66544\tRomney\t66544\t0.000263267\t66544.0\n7804\t-96.659702\t39.679407\tBlue Rapids city\tKS\tKansas\tMarshall County\t1030\t44.4\t14.6\t5.1\t18874\t43163\t0.3078\t66411\tRomney\t66411\t0.002684798\t66411.0\n7805\t-96.598871\t39.963101\tOketo city\tKS\tKansas\tMarshall County\t83\t47.1\t6.2\t4.8\t18684\t80000\t0.3078\t66518\tRomney\t66518\t0.000216348\t66518.0\n7806\t-100.589694\t37.264219\tPlains city\tKS\tKansas\tMeade County\t1177\t31.0\t23.2\t3.9\t18055\t84500\t0.151\t67869\tRomney\t67869\t0.003067968\t67869.0\n7807\t-100.337733\t37.285457\tMeade city\tKS\tKansas\tMeade County\t1647\t41.7\t20.5\t4.1\t20921\t69255\t0.151\t67864\tRomney\t67864\t0.00429307\t67864.0\n7808\t-100.195644\t37.382838\tFowler city\tKS\tKansas\tMeade County\t559\t42.6\t17.9\t6.3\t19596\t75714\t0.151\t67844\tRomney\t67844\t0.001457089\t67844.0\n7809\t-94.677679\t38.618679\tLouisburg city\tKS\tKansas\tMiami County\t3585\t38.0\t21.6\t3.8\t26517\t109082\t0.3172\t66053\tRomney\t66053\t0.009344662\t66053.0\n7810\t-94.86459\t38.579127\tPaola city\tKS\tKansas\tMiami County\t5429\t35.9\t22.9\t8.3\t25442\t96765\t0.3172\t66071\tRomney\t66071\t0.014151232\t66071.0\n7811\t-94.83892800000001\t38.426145\tFontana city\tKS\tKansas\tMiami County\t134\t43.9\t22.1\t4.3\t21905\t116667\t0.3172\t66026\tRomney\t66026\t0.000349284\t66026.0\n7812\t-94.949783\t38.503462\tOsawatomie city\tKS\tKansas\tMiami County\t4656\t35.2\t14.7\t7.6\t19878\t48241\t0.3172\t66064\tRomney\t66064\t0.01213633\t66064.0\n7813\t-98.47081800000001\t39.339566999999995\tTipton city\tKS\tKansas\tMitchell County\t181\t48.4\t18.0\t0.0\t18406\t72500\t0.19699999999999998\t67485\tRomney\t67485\t0.000471795\t67485.0\n7814\t-97.928993\t39.386159\tSimpson city\tKS\tKansas\tMitchell County\t108\t44.3\t13.9\t2.8\t22622\t50000\t0.19699999999999998\t67478\tRomney\t67478\t0.000281513\t67478.0\n7815\t-98.433139\t39.509598\tCawker City\tKS\tKansas\tMitchell County\t481\t48.3\t10.4\t5.7\t19807\t58235\t0.19699999999999998\t67430\tRomney\t67430\t0.001253775\t67430.0\n7816\t-98.305999\t39.500463\tGlen Elder city\tKS\tKansas\tMitchell County\t405\t48.4\t10.3\t5.6\t19822\t58077\t0.19699999999999998\t67446\tRomney\t67446\t0.001055673\t67446.0\n7817\t-98.39627800000001\t39.235002\tHunter city\tKS\tKansas\tMitchell County\t57\t47.5\t18.6\t0.0\t18517\t75000\t0.19699999999999998\t67452\tRomney\t67452\t0.000148576\t67452.0\n7818\t-98.108163\t39.464408\tBeloit city\tKS\tKansas\tMitchell County\t3712\t43.1\t24.2\t8.5\t22527\t86053\t0.19699999999999998\t67420\tRomney\t67420\t0.0096757\t67420.0\n7819\t-97.952426\t39.542636\tScottsville city\tKS\tKansas\tMitchell County\t20\t41.3\t13.3\t0.0\t22503\t0\t0.19699999999999998\t66963\tRomney\t66963\t5.21e-05\t66963.0\n7820\t-95.597877\t37.156560999999996\tLiberty city\tKS\tKansas\tMontgomery County\t88\t49.6\t28.4\t6.5\t23180\t112500\t0.282\t67351\tRomney\t67351\t0.000229381\t67351.0\n7821\t-95.55139399999999\t37.267779\tCherryvale city\tKS\tKansas\tMontgomery County\t2340\t39.1\t15.6\t15.9\t17796\t50774\t0.282\t67335\tRomney\t67335\t0.006099444\t67335.0\n7822\t-95.821229\t37.037248\tTyro city\tKS\tKansas\tMontgomery County\t215\t43.9\t25.6\t7.1\t18913\t91250\t0.282\t67364\tRomney\t67364\t0.000560419\t67364.0\n7823\t-95.909965\t37.289766\tElk City\tKS\tKansas\tMontgomery County\t363\t47.1\t17.5\t6.7\t19128\t41000\t0.282\t67344\tRomney\t67344\t0.0009461960000000001\t67344.0\n7824\t-95.942258\t37.092108\tHavana city\tKS\tKansas\tMontgomery County\t82\t49.2\t13.8\t13.8\t20154\t75000\t0.282\t67347\tRomney\t67347\t0.00021374099999999999\t67347.0\n7825\t-95.711626\t37.058716\tDearing city\tKS\tKansas\tMontgomery County\t381\t43.1\t14.5\t15.7\t19706\t68182\t0.282\t67340\tRomney\t67340\t0.000993115\t67340.0\n7826\t-95.93324399999999\t37.013228999999995\tCaney city\tKS\tKansas\tMontgomery County\t2001\t39.3\t16.5\t11.2\t18535\t64712\t0.282\t67333\tRomney\t67333\t0.005215807\t67333.0\n7827\t-95.632176\t37.040713000000004\tCoffeyville city\tKS\tKansas\tMontgomery County\t10126\t41.1\t16.6\t10.9\t18190\t56114\t0.282\t67337\tRomney\t67337\t0.026394433\t67337.0\n7828\t-95.714798\t37.232243\tIndependence city\tKS\tKansas\tMontgomery County\t9221\t38.4\t22.0\t11.2\t20000\t72382\t0.282\t67301\tRomney\t67301\t0.02403546\t67301.0\n7829\t-96.845801\t38.738642999999996\tLatimer city\tKS\tKansas\tMorris County\t21\t46.3\t20.0\t0.0\t21263\t100000\t0.2802\t67449\tRomney\t67449\t5.47e-05\t67449.0\n7830\t-96.735123\t38.793896999999994\tWhite City\tKS\tKansas\tMorris County\t539\t41.5\t11.4\t9.7\t19744\t60000\t0.2802\t66872\tRomney\t66872\t0.001404957\t66872.0\n7831\t-96.676632\t38.635781\tWilsey city\tKS\tKansas\tMorris County\t183\t45.5\t15.0\t1.2\t18210\t60000\t0.2802\t66838\tRomney\t66838\t0.000477008\t66838.0\n7832\t-96.36738199999999\t38.576214\tDunlap city\tKS\tKansas\tMorris County\t78\t46.3\t23.2\t8.0\t19100\t106250\t0.2802\t66835\tRomney\t66835\t0.000203315\t66835.0\n7833\t-96.59227800000001\t38.844964000000004\tDwight city\tKS\tKansas\tMorris County\t297\t46.2\t9.8\t6.4\t17611\t61250\t0.2802\t66849\tRomney\t66849\t0.00077416\t66849.0\n7834\t-96.661978\t38.763647999999996\tParkerville city\tKS\tKansas\tMorris County\t71\t48.8\t17.3\t0.0\t21857\t100000\t0.2802\t66872\tRomney\t66872\t0.00018506900000000003\t66872.0\n7835\t-96.490459\t38.660996000000004\tCouncil Grove city\tKS\tKansas\tMorris County\t2299\t44.4\t16.9\t6.2\t21982\t76471\t0.2802\t66846\tRomney\t66846\t0.0059925740000000005\t66846.0\n7836\t-101.631928\t37.117801\tRolla city\tKS\tKansas\tMorton County\t438\t37.6\t19.2\t4.3\t18131\t76500\t0.1479\t67954\tRomney\t67954\t0.001141691\t67954.0\n7837\t-101.782925\t37.265265\tRichfield city\tKS\tKansas\tMorton County\t44\t35.0\t20.0\t4.3\t17953\t85000\t0.1479\t67953\tRomney\t67953\t0.00011469\t67953.0\n7838\t-101.893795\t37.003197\tElkhart city\tKS\tKansas\tMorton County\t1989\t35.7\t22.0\t5.4\t21403\t84621\t0.1479\t67950\tRomney\t67950\t0.005184528\t67950.0\n7839\t-95.93184000000001\t39.66421\tGoff city\tKS\tKansas\tNemaha County\t166\t37.0\t16.8\t2.2\t16886\t62500\t0.19899999999999998\t66428\tRomney\t66428\t0.000432696\t66428.0\n7840\t-95.811472\t39.635614000000004\tWetmore city\tKS\tKansas\tNemaha County\t331\t36.0\t16.5\t2.1\t16932\t61250\t0.19899999999999998\t66550\tRomney\t66550\t0.000862785\t66550.0\n7841\t-95.779505\t39.942797999999996\tSabetha city\tKS\tKansas\tNemaha County\t2542\t43.2\t22.9\t1.5\t20494\t80926\t0.19899999999999998\t66534\tRomney\t66534\t0.006625978\t66534.0\n7842\t-96.028914\t39.656502\tCorning city\tKS\tKansas\tNemaha County\t151\t37.1\t7.3\t8.9\t16609\t96667\t0.19899999999999998\t66417\tRomney\t66417\t0.000393597\t66417.0\n7843\t-95.939808\t39.866913000000004\tOneida city\tKS\tKansas\tNemaha County\t61\t37.5\t10.5\t7.9\t14919\t100000\t0.19899999999999998\t66522\tRomney\t66522\t0.00015900299999999998\t66522.0\n7844\t-96.068986\t39.837322\tSeneca city\tKS\tKansas\tNemaha County\t2034\t43.2\t17.6\t3.1\t19895\t105246\t0.19899999999999998\t66538\tRomney\t66538\t0.005301825\t66538.0\n7845\t-95.971368\t39.961591\tBern city\tKS\tKansas\tNemaha County\t182\t39.4\t18.4\t0.9\t16307\t74000\t0.19899999999999998\t66408\tRomney\t66408\t0.000474401\t66408.0\n7846\t-96.130321\t39.724413\tCentralia city\tKS\tKansas\tNemaha County\t594\t43.6\t10.8\t6.1\t15457\t70000\t0.19899999999999998\t66415\tRomney\t66415\t0.001548321\t66415.0\n7847\t-95.175475\t37.517573999999996\tSt. Paul city\tKS\tKansas\tNeosho County\t681\t41.3\t10.2\t6.7\t18067\t68056\t0.3164\t66771\tRomney\t66771\t0.001775095\t66771.0\n7848\t-95.46999\t37.587178\tEarlton city\tKS\tKansas\tNeosho County\t77\t42.5\t25.0\t5.4\t19618\t75000\t0.3164\t66720\tRomney\t66720\t0.000200708\t66720.0\n7849\t-95.243089\t37.569205\tErie city\tKS\tKansas\tNeosho County\t1081\t43.5\t15.4\t9.7\t18607\t61622\t0.3164\t66733\tRomney\t66733\t0.002817735\t66733.0\n7850\t-95.143722\t37.689659999999996\tStark city\tKS\tKansas\tNeosho County\t101\t46.8\t16.7\t0.0\t20030\t87500\t0.3164\t66775\tRomney\t66775\t0.000263267\t66775.0\n7851\t-95.356347\t37.472371\tGalesburg city\tKS\tKansas\tNeosho County\t144\t39.7\t24.2\t5.7\t19678\t67500\t0.3164\t66740\tRomney\t66740\t0.00037535\t66740.0\n7852\t-95.462122\t37.671665000000004\tChanute city\tKS\tKansas\tNeosho County\t8973\t38.8\t14.9\t11.0\t20358\t66534\t0.3164\t66720\tRomney\t66720\t0.023389023\t66720.0\n7853\t-95.47406099999999\t37.488046999999995\tThayer city\tKS\tKansas\tNeosho County\t492\t36.3\t14.1\t9.0\t18904\t86667\t0.3164\t66776\tRomney\t66776\t0.001282447\t66776.0\n7854\t-99.692753\t38.446065999999995\tBazine city\tKS\tKansas\tNess County\t256\t49.7\t24.1\t1.2\t22263\t51111\t0.151\t67516\tRomney\t67516\t0.00066729\t67516.0\n7855\t-99.932822\t38.63613\tRansom city\tKS\tKansas\tNess County\t284\t47.4\t17.5\t2.4\t19833\t53571\t0.151\t67572\tRomney\t67572\t0.000740274\t67572.0\n7856\t-99.744353\t38.640578000000005\tBrownell city\tKS\tKansas\tNess County\t39\t48.8\t23.3\t0.0\t22558\t45000\t0.151\t67521\tRomney\t67521\t0.000101657\t67521.0\n7857\t-100.169942\t38.64258\tUtica city\tKS\tKansas\tNess County\t187\t47.7\t17.5\t2.7\t19868\t51250\t0.151\t67584\tRomney\t67584\t0.000487434\t67584.0\n7858\t-99.906289\t38.453726\tNess City\tKS\tKansas\tNess County\t1414\t46.3\t21.8\t3.5\t22735\t63095\t0.151\t67560\tRomney\t67560\t0.003685733\t67560.0\n7859\t-99.819958\t39.62689\tEdmond city\tKS\tKansas\tNorton County\t37\t47.5\t15.4\t0.0\t18940\t55000\t0.1712\t67645\tRomney\t67645\t9.640000000000001e-05\t67645.0\n7860\t-99.709676\t39.89131\tAlmena city\tKS\tKansas\tNorton County\t448\t35.8\t9.2\t0.0\t15659\t53125\t0.1712\t67622\tRomney\t67622\t0.001167757\t67622.0\n7861\t-100.00146099999999\t39.610661\tLenora city\tKS\tKansas\tNorton County\t242\t44.6\t15.6\t0.7\t18849\t50000\t0.1712\t67645\tRomney\t67645\t0.000630797\t67645.0\n7862\t-100.175647\t39.737231\tClayton city\tKS\tKansas\tNorton County\t52\t45.6\t15.8\t0.0\t18896\t45000\t0.1712\t67629\tRomney\t67629\t0.00013554299999999999\t67629.0\n7863\t-99.891583\t39.836342\tNorton city\tKS\tKansas\tNorton County\t2821\t46.4\t23.9\t6.9\t20009\t75460\t0.1712\t67654\tRomney\t67654\t0.007353219\t67654.0\n7864\t-95.82199399999999\t38.633208\tOsage City\tKS\tKansas\tOsage County\t3009\t39.7\t18.7\t7.4\t17803\t88158\t0.3284\t66523\tRomney\t66523\t0.00784326\t66523.0\n7865\t-95.74019200000001\t38.777846999999994\tScranton city\tKS\tKansas\tOsage County\t736\t37.7\t10.4\t11.8\t17849\t64643\t0.3284\t66537\tRomney\t66537\t0.0019184579999999998\t66537.0\n7866\t-95.6846\t38.61092\tLyndon city\tKS\tKansas\tOsage County\t1101\t41.9\t17.5\t3.9\t21101\t75610\t0.3284\t66451\tRomney\t66451\t0.002869867\t66451.0\n7867\t-95.83444899999999\t38.751465\tBurlingame city\tKS\tKansas\tOsage County\t953\t45.3\t12.3\t7.5\t18958\t69688\t0.3284\t66413\tRomney\t66413\t0.00248409\t66413.0\n7868\t-95.751989\t38.481226\tOlivet city\tKS\tKansas\tOsage County\t63\t46.0\t24.4\t5.7\t23664\t106250\t0.3284\t66856\tRomney\t66856\t0.000164216\t66856.0\n7869\t-95.526834\t38.580384\tQuenemo city\tKS\tKansas\tOsage County\t541\t37.3\t14.9\t9.9\t17264\t48182\t0.3284\t66528\tRomney\t66528\t0.001410171\t66528.0\n7870\t-95.69324399999999\t38.819263\tCarbondale city\tKS\tKansas\tOsage County\t1369\t35.8\t10.2\t7.1\t16858\t77535\t0.3284\t66414\tRomney\t66414\t0.003568436\t66414.0\n7871\t-95.556961\t38.779331\tOverbrook city\tKS\tKansas\tOsage County\t903\t43.2\t22.3\t2.5\t20722\t94375\t0.3284\t66524\tRomney\t66524\t0.00235376\t66524.0\n7872\t-95.63793299999999\t38.507752\tMelvern city\tKS\tKansas\tOsage County\t422\t39.8\t12.2\t10.9\t20302\t93929\t0.3284\t66510\tRomney\t66510\t0.001099985\t66510.0\n7873\t-98.69170600000001\t39.563635999999995\tPortis city\tKS\tKansas\tOsborne County\t108\t48.1\t24.7\t1.5\t22223\t46667\t0.1763\t67474\tRomney\t67474\t0.000281513\t67474.0\n7874\t-99.02462\t39.18866\tNatoma city\tKS\tKansas\tOsborne County\t311\t46.5\t11.6\t8.3\t16983\t58125\t0.1763\t67651\tRomney\t67651\t0.000810653\t67651.0\n7875\t-98.948621\t39.467989\tAlton city\tKS\tKansas\tOsborne County\t99\t46.1\t11.1\t8.2\t17017\t65000\t0.1763\t67623\tRomney\t67623\t0.000258053\t67623.0\n7876\t-98.699039\t39.440540999999996\tOsborne city\tKS\tKansas\tOsborne County\t1396\t47.5\t22.2\t3.7\t20911\t52794\t0.1763\t67473\tRomney\t67473\t0.003638814\t67473.0\n7877\t-98.546132\t39.502567\tDowns city\tKS\tKansas\tOsborne County\t926\t48.4\t18.7\t6.1\t18128\t47381\t0.1763\t67437\tRomney\t67437\t0.002413712\t67437.0\n7878\t-97.765904\t39.275154\tDelphos city\tKS\tKansas\tOttawa County\t438\t45.6\t15.2\t3.3\t18408\t58214\t0.1902\t67436\tRomney\t67436\t0.001141691\t67436.0\n7879\t-97.699372\t39.124351000000004\tMinneapolis city\tKS\tKansas\tOttawa County\t1988\t45.2\t19.0\t9.9\t20563\t90119\t0.1902\t67467\tRomney\t67467\t0.005181921\t67467.0\n7880\t-97.878235\t39.012076\tTescott city\tKS\tKansas\tOttawa County\t328\t42.6\t18.4\t8.8\t18007\t72778\t0.1902\t67484\tRomney\t67484\t0.000854965\t67484.0\n7881\t-97.759159\t38.968588000000004\tCulver city\tKS\tKansas\tOttawa County\t158\t43.0\t18.3\t9.1\t18079\t72500\t0.1902\t67484\tRomney\t67484\t0.000411843\t67484.0\n7882\t-97.59303299999999\t39.033328000000004\tBennington city\tKS\tKansas\tOttawa County\t640\t42.4\t22.2\t4.1\t21509\t114744\t0.1902\t67422\tRomney\t67422\t0.0016682239999999998\t67422.0\n7883\t-99.526131\t38.193490999999995\tBurdett city\tKS\tKansas\tPawnee County\t191\t43.8\t29.5\t1.5\t20519\t49167\t0.2753\t67523\tRomney\t67523\t0.0004978609999999999\t67523.0\n7884\t-99.244428\t38.077028999999996\tGarfield city\tKS\tKansas\tPawnee County\t147\t43.4\t30.0\t1.0\t20616\t48000\t0.2753\t67529\tRomney\t67529\t0.00038317\t67529.0\n7885\t-99.40247600000001\t38.195229\tRozel city\tKS\tKansas\tPawnee County\t135\t43.8\t29.8\t1.1\t20634\t47500\t0.2753\t67574\tRomney\t67574\t0.000351891\t67574.0\n7886\t-99.10118299999999\t38.183094\tLarned city\tKS\tKansas\tPawnee County\t3901\t41.2\t23.5\t12.8\t22136\t67455\t0.2753\t67550\tRomney\t67550\t0.010168347\t67550.0\n7887\t-99.119558\t39.761327\tAgra city\tKS\tKansas\tPhillips County\t293\t42.8\t14.4\t2.5\t18576\t57000\t0.1489\t67621\tRomney\t67621\t0.000763734\t67621.0\n7888\t-99.122435\t39.669304\tKirwin city\tKS\tKansas\tPhillips County\t219\t44.8\t18.7\t4.4\t18155\t43571\t0.1489\t67644\tRomney\t67644\t0.000570845\t67644.0\n7889\t-99.56711\t39.661640000000006\tLogan city\tKS\tKansas\tPhillips County\t476\t48.8\t16.5\t2.9\t20767\t51471\t0.1489\t67646\tRomney\t67646\t0.001240742\t67646.0\n7890\t-99.573227\t39.832094\tPrairie View city\tKS\tKansas\tPhillips County\t132\t46.4\t22.9\t2.8\t22239\t75000\t0.1489\t67664\tRomney\t67664\t0.000344071\t67664.0\n7891\t-99.321412\t39.754407\tPhillipsburg city\tKS\tKansas\tPhillips County\t2437\t45.4\t20.0\t4.1\t20873\t81231\t0.1489\t67661\tRomney\t67661\t0.006352285\t67661.0\n7892\t-99.42110799999999\t39.676544\tSpeed city\tKS\tKansas\tPhillips County\t35\t47.5\t15.4\t5.6\t20623\t37500\t0.1489\t67639\tRomney\t67639\t9.120000000000001e-05\t67639.0\n7893\t-99.311868\t39.682992\tGlade city\tKS\tKansas\tPhillips County\t109\t45.3\t18.9\t5.3\t18166\t45000\t0.1489\t67639\tRomney\t67639\t0.000284119\t67639.0\n7894\t-99.534003\t39.946207\tLong Island city\tKS\tKansas\tPhillips County\t145\t46.3\t22.9\t2.6\t22249\t71250\t0.1489\t67647\tRomney\t67647\t0.00037795699999999995\t67647.0\n7895\t-96.30827\t39.204428\tWamego city\tKS\tKansas\tPottawatomie County\t4589\t36.3\t30.1\t3.1\t21818\t120659\t0.2463\t66547\tRomney\t66547\t0.011961688\t66547.0\n7896\t-96.16989000000001\t39.489393\tOnaga city\tKS\tKansas\tPottawatomie County\t787\t44.1\t14.3\t4.5\t16539\t63804\t0.2463\t66521\tRomney\t66521\t0.002051394\t66521.0\n7897\t-96.413651\t39.394459999999995\tWestmoreland city\tKS\tKansas\tPottawatomie County\t658\t43.7\t24.0\t5.3\t18253\t88125\t0.2463\t66549\tRomney\t66549\t0.001715143\t66549.0\n7898\t-96.3189\t39.502155\tWheaton city\tKS\tKansas\tPottawatomie County\t88\t44.2\t21.3\t3.9\t20379\t70000\t0.2463\t66521\tRomney\t66521\t0.000229381\t66521.0\n7899\t-96.064985\t39.194174\tSt. Marys city\tKS\tKansas\tPottawatomie County\t2299\t30.9\t23.4\t5.0\t18378\t123087\t0.2463\t66536\tRomney\t66536\t0.0059925740000000005\t66536.0\n7900\t-96.057114\t39.307363\tEmmett city\tKS\tKansas\tPottawatomie County\t330\t34.0\t12.7\t5.4\t17037\t86000\t0.2463\t66422\tRomney\t66422\t0.0008601780000000001\t66422.0\n7901\t-96.418165\t39.191685\tSt. George city\tKS\tKansas\tPottawatomie County\t481\t36.2\t17.8\t8.1\t19449\t98750\t0.2463\t66535\tRomney\t66535\t0.001253775\t66535.0\n7902\t-96.615495\t39.431678000000005\tOlsburg city\tKS\tKansas\tPottawatomie County\t184\t45.6\t28.6\t3.5\t22221\t86250\t0.2463\t66520\tRomney\t66520\t0.000479614\t66520.0\n7903\t-96.314566\t39.249915\tLouisville city\tKS\tKansas\tPottawatomie County\t239\t42.4\t29.3\t2.2\t20340\t135938\t0.2463\t66450\tRomney\t66450\t0.0006229769999999999\t66450.0\n7904\t-96.178726\t39.216396\tBelvue city\tKS\tKansas\tPottawatomie County\t272\t33.7\t13.0\t5.8\t17015\t85000\t0.2463\t66407\tRomney\t66407\t0.000708995\t66407.0\n7905\t-96.07659\t39.511029\tHavensville city\tKS\tKansas\tPottawatomie County\t140\t43.5\t21.6\t3.7\t20331\t73333\t0.2463\t66432\tRomney\t66432\t0.00036492400000000003\t66432.0\n7906\t-98.757428\t37.704734\tPratt city\tKS\tKansas\tPratt County\t6537\t41.4\t24.6\t5.6\t21974\t82980\t0.2578\t67066\tRomney\t67066\t0.017039345\t67066.0\n7907\t-98.55544499999999\t37.75829\tPreston city\tKS\tKansas\tPratt County\t156\t46.0\t23.9\t2.7\t21917\t91667\t0.2578\t67583\tRomney\t67583\t0.00040663\t67583.0\n7908\t-98.866968\t37.787821\tByers city\tKS\tKansas\tPratt County\t46\t44.2\t15.6\t3.7\t18049\t50000\t0.2578\t67021\tRomney\t67021\t0.000119904\t67021.0\n7909\t-98.82514300000001\t37.511254\tCoats city\tKS\tKansas\tPratt County\t103\t41.8\t18.3\t4.8\t18064\t46250\t0.2578\t67028\tRomney\t67028\t0.00026848\t67028.0\n7910\t-98.68203000000001\t37.497764000000004\tSawyer city\tKS\tKansas\tPratt County\t114\t42.5\t17.7\t5.8\t18059\t50000\t0.2578\t67134\tRomney\t67134\t0.000297152\t67134.0\n7911\t-98.905343\t37.630269\tCullison city\tKS\tKansas\tPratt County\t90\t42.0\t17.5\t5.6\t18076\t48333\t0.2578\t67124\tRomney\t67124\t0.00023459400000000002\t67124.0\n7912\t-98.732497\t37.729656\tIuka city\tKS\tKansas\tPratt County\t175\t45.7\t24.4\t2.4\t22038\t94167\t0.2578\t67066\tRomney\t67066\t0.000456155\t67066.0\n7913\t-101.37019699999999\t39.785201\tMcDonald city\tKS\tKansas\tRawlins County\t115\t47.5\t22.4\t0.0\t20762\t51667\t0.1316\t67745\tRomney\t67745\t0.00029975900000000003\t67745.0\n7914\t-100.78605400000001\t39.908771\tHerndon city\tKS\tKansas\tRawlins County\t109\t50.5\t18.8\t7.0\t18309\t45000\t0.1316\t67739\tRomney\t67739\t0.000284119\t67739.0\n7915\t-101.04199799999999\t39.810239\tAtwood city\tKS\tKansas\tRawlins County\t1319\t48.6\t17.5\t1.7\t20583\t64487\t0.1316\t67730\tRomney\t67730\t0.003438106\t67730.0\n7916\t-98.20404599999999\t37.970453000000006\tAbbyville city\tKS\tKansas\tReno County\t120\t46.6\t16.7\t2.9\t19663\t64167\t0.3311\t67510\tRomney\t67510\t0.000312792\t67510.0\n7917\t-97.78093199999999\t37.902583\tHaven city\tKS\tKansas\tReno County\t1290\t38.9\t21.9\t3.6\t19579\t98548\t0.3311\t67543\tRomney\t67543\t0.003362514\t67543.0\n7918\t-98.088001\t38.148815\tNickerson city\tKS\tKansas\tReno County\t1119\t39.7\t11.4\t7.1\t19428\t72500\t0.3311\t67561\tRomney\t67561\t0.0029167859999999998\t67561.0\n7919\t-98.093594\t37.966838\tPartridge city\tKS\tKansas\tReno County\t265\t36.4\t9.1\t3.1\t14934\t91429\t0.3311\t67566\tRomney\t67566\t0.0006907489999999999\t67566.0\n7920\t-97.99207\t38.101163\tWillowbrook city\tKS\tKansas\tReno County\t90\t49.2\t33.8\t7.8\t37464\t140000\t0.3311\t675HH\tRomney\t675HH\t0.00023459400000000002\t0.0\n7921\t-98.427963\t37.807629999999996\tTuron city\tKS\tKansas\tReno County\t406\t42.7\t10.9\t3.9\t14398\t44375\t0.3311\t67583\tRomney\t67583\t0.00105828\t67583.0\n7922\t-97.913761\t38.066988\tHutchinson city\tKS\tKansas\tReno County\t39712\t37.9\t20.3\t7.8\t21840\t90505\t0.3311\t67502\tRomney\t67502\t0.103513306\t67502.0\n7923\t-97.943066\t38.028034999999996\tSouth Hutchinson city\tKS\tKansas\tReno County\t2438\t46.4\t16.5\t5.1\t19788\t92500\t0.3311\t67505\tRomney\t67505\t0.006354891\t67505.0\n7924\t-97.771854\t38.138011\tBuhler city\tKS\tKansas\tReno County\t1276\t41.1\t31.2\t1.7\t20232\t96167\t0.3311\t67522\tRomney\t67522\t0.003326022\t67522.0\n7925\t-98.023338\t37.780173\tPretty Prairie city\tKS\tKansas\tReno County\t665\t45.1\t23.8\t3.8\t19532\t83421\t0.3311\t67570\tRomney\t67570\t0.001733389\t67570.0\n7926\t-98.177861\t37.896434\tArlington city\tKS\tKansas\tReno County\t426\t43.7\t14.2\t2.3\t18843\t60556\t0.3311\t67514\tRomney\t67514\t0.001110412\t67514.0\n7927\t-98.324274\t37.853052000000005\tLangdon city\tKS\tKansas\tReno County\t63\t45.8\t18.2\t8.3\t16114\t47500\t0.3311\t67514\tRomney\t67514\t0.000164216\t67514.0\n7928\t-98.309555\t37.971773\tPlevna city\tKS\tKansas\tReno County\t93\t45.4\t15.4\t3.8\t19621\t63333\t0.3311\t67568\tRomney\t67568\t0.00024241400000000001\t67568.0\n7929\t-98.408799\t37.959331\tSylvia city\tKS\tKansas\tReno County\t260\t45.8\t17.9\t7.5\t16112\t50714\t0.3311\t67581\tRomney\t67581\t0.0006777160000000001\t67581.0\n7930\t-97.457335\t39.802124\tCuba city\tKS\tKansas\tRepublic County\t204\t49.5\t13.4\t2.6\t18543\t31071\t0.1776\t66940\tRomney\t66940\t0.0005317459999999999\t66940.0\n7931\t-97.82468399999999\t39.924032000000004\tRepublic city\tKS\tKansas\tRepublic County\t113\t49.4\t20.0\t2.6\t20161\t63333\t0.1776\t66964\tRomney\t66964\t0.00029454599999999997\t66964.0\n7932\t-97.43221700000001\t39.707014\tAgenda city\tKS\tKansas\tRepublic County\t72\t50.4\t12.7\t2.5\t18422\t31250\t0.1776\t66930\tRomney\t66930\t0.000187675\t66930.0\n7933\t-97.896249\t39.783124\tCourtland city\tKS\tKansas\tRepublic County\t259\t45.5\t23.6\t2.4\t18025\t53333\t0.1776\t66939\tRomney\t66939\t0.0006751089999999999\t66939.0\n7934\t-97.538382\t39.912731\tMunden city\tKS\tKansas\tRepublic County\t116\t44.6\t19.8\t1.5\t19081\t50000\t0.1776\t66959\tRomney\t66959\t0.000302366\t66959.0\n7935\t-97.629935\t39.824135\tBelleville city\tKS\tKansas\tRepublic County\t2065\t52.1\t15.5\t4.9\t21108\t61136\t0.1776\t66935\tRomney\t66935\t0.005382629\t66935.0\n7936\t-97.783804\t39.796841\tScandia city\tKS\tKansas\tRepublic County\t306\t49.5\t19.4\t2.8\t20164\t62857\t0.1776\t66966\tRomney\t66966\t0.00079762\t66966.0\n7937\t-97.426703\t39.959975\tNarka city\tKS\tKansas\tRepublic County\t88\t45.0\t19.7\t2.0\t19168\t50000\t0.1776\t66960\tRomney\t66960\t0.000229381\t66960.0\n7938\t-98.414558\t38.278109\tRaymond city\tKS\tKansas\tRice County\t92\t40.0\t21.9\t3.9\t17647\t53750\t0.2475\t67573\tRomney\t67573\t0.000239807\t67573.0\n7939\t-98.267655\t38.512543\tFrederick city\tKS\tKansas\tRice County\t11\t56.3\t14.3\t0.0\t20420\t30000\t0.2475\t67459\tRomney\t67459\t2.8699999999999996e-05\t67459.0\n7940\t-98.395459\t38.512461\tBushton city\tKS\tKansas\tRice County\t303\t49.9\t17.6\t2.2\t21188\t45769\t0.2475\t67427\tRomney\t67427\t0.0007898\t67427.0\n7941\t-98.348668\t38.355252\tChase city\tKS\tKansas\tRice County\t409\t38.2\t12.9\t8.4\t18177\t37167\t0.2475\t67524\tRomney\t67524\t0.001066099\t67524.0\n7942\t-98.20700699999999\t38.210164\tSterling city\tKS\tKansas\tRice County\t2513\t25.2\t28.4\t4.2\t19604\t84583\t0.2475\t67579\tRomney\t67579\t0.006550386\t67579.0\n7943\t-98.31199699999999\t38.243893\tAlden city\tKS\tKansas\tRice County\t163\t42.8\t22.3\t3.3\t17618\t52500\t0.2475\t67512\tRomney\t67512\t0.000424876\t67512.0\n7944\t-98.154473\t38.516943\tGeneseo city\tKS\tKansas\tRice County\t262\t49.9\t17.7\t1.9\t21223\t45769\t0.2475\t67444\tRomney\t67444\t0.000682929\t67444.0\n7945\t-98.20228900000001\t38.345909999999996\tLyons city\tKS\tKansas\tRice County\t3540\t40.9\t17.9\t4.9\t19828\t65078\t0.2475\t67554\tRomney\t67554\t0.009227365\t67554.0\n7946\t-98.012063\t38.397855\tLittle River city\tKS\tKansas\tRice County\t471\t41.7\t21.1\t4.2\t19706\t64000\t0.2475\t67457\tRomney\t67457\t0.001227709\t67457.0\n7947\t-96.551535\t39.193284000000006\tManhattan city\tKS\tKansas\tRiley County\t50149\t24.7\t52.1\t7.9\t21557\t146085\t0.4254\t66502\tRomney\t66502\t0.130718392\t66502.0\n7948\t-96.813924\t39.111283\tFort Riley North CDP\tKS\tKansas\tRiley County\t8777\t22.3\t12.9\t19.7\t13622\t115278\t0.4254\t664XX\tRomney\t664XX\t0.02287813\t0.0\n7949\t-96.859146\t39.363252\tLeonardville city\tKS\tKansas\tRiley County\t408\t47.2\t25.8\t3.7\t20430\t71667\t0.4254\t66449\tRomney\t66449\t0.001063493\t66449.0\n7950\t-96.828322\t39.299033\tRiley city\tKS\tKansas\tRiley County\t933\t37.7\t17.2\t4.1\t19522\t95714\t0.4254\t66531\tRomney\t66531\t0.0024319579999999997\t66531.0\n7951\t-96.709154\t39.113484\tOgden city\tKS\tKansas\tRiley County\t1903\t28.2\t17.6\t7.7\t19507\t73684\t0.4254\t66517\tRomney\t66517\t0.00496036\t66517.0\n7952\t-96.759817\t39.428740999999995\tRandolph city\tKS\tKansas\tRiley County\t185\t43.3\t43.7\t3.3\t28053\t150000\t0.4254\t66554\tRomney\t66554\t0.00048222099999999996\t66554.0\n7953\t-99.30115\t39.233459\tPlainville city\tKS\tKansas\tRooks County\t1863\t42.0\t17.5\t8.1\t18380\t65714\t0.1467\t67663\tRomney\t67663\t0.004856096\t67663.0\n7954\t-99.272143\t39.436838\tStockton city\tKS\tKansas\tRooks County\t1430\t43.0\t20.2\t7.6\t19314\t54853\t0.1467\t67669\tRomney\t67669\t0.003727438\t67669.0\n7955\t-99.563748\t39.253285\tPalco city\tKS\tKansas\tRooks County\t231\t42.1\t17.4\t4.7\t17418\t40833\t0.1467\t67657\tRomney\t67657\t0.000602125\t67657.0\n7956\t-99.43478\t39.232065999999996\tZurich city\tKS\tKansas\tRooks County\t117\t42.5\t17.7\t4.6\t17469\t44000\t0.1467\t67663\tRomney\t67663\t0.00030497200000000003\t67663.0\n7957\t-99.58474\t39.319259\tDamar city\tKS\tKansas\tRooks County\t144\t43.4\t17.3\t5.0\t17456\t42500\t0.1467\t67632\tRomney\t67632\t0.00037535\t67632.0\n7958\t-99.098547\t39.454128000000004\tWoodston city\tKS\tKansas\tRooks County\t102\t43.8\t16.4\t6.8\t18342\t73333\t0.1467\t67675\tRomney\t67675\t0.00026587299999999997\t67675.0\n7959\t-99.177557\t38.473088\tTimken city\tKS\tKansas\tRush County\t66\t48.8\t20.0\t2.9\t21321\t60000\t0.2338\t67575\tRomney\t67575\t0.00017203599999999998\t67575.0\n7960\t-99.320176\t38.654483\tLiebenthal city\tKS\tKansas\tRush County\t88\t49.7\t19.4\t6.7\t21221\t30000\t0.2338\t67553\tRomney\t67553\t0.000229381\t67553.0\n7961\t-99.569073\t38.582013\tMcCracken city\tKS\tKansas\tRush County\t167\t50.8\t20.2\t7.1\t21259\t34375\t0.2338\t67556\tRomney\t67556\t0.000435302\t67556.0\n7962\t-99.19783699999999\t38.519788\tBison city\tKS\tKansas\tRush County\t241\t43.1\t17.1\t3.3\t18914\t52000\t0.2338\t67520\tRomney\t67520\t0.000628191\t67520.0\n7963\t-99.552978\t38.469283000000004\tAlexander city\tKS\tKansas\tRush County\t59\t51.8\t19.6\t6.7\t21396\t30000\t0.2338\t67513\tRomney\t67513\t0.000153789\t67513.0\n7964\t-99.309567\t38.531682\tLa Crosse city\tKS\tKansas\tRush County\t1394\t47.1\t20.2\t4.5\t19787\t57589\t0.2338\t67548\tRomney\t67548\t0.0036336009999999998\t67548.0\n7965\t-99.310767\t38.464845000000004\tRush Center city\tKS\tKansas\tRush County\t139\t49.0\t20.6\t2.8\t21463\t58333\t0.2338\t67575\tRomney\t67575\t0.00036231699999999997\t67575.0\n7966\t-99.053516\t38.53484\tOtis city\tKS\tKansas\tRush County\t334\t43.3\t16.7\t3.0\t18878\t52333\t0.2338\t67565\tRomney\t67565\t0.000870604\t67565.0\n7967\t-98.590311\t38.847027000000004\tDorrance city\tKS\tKansas\tRussell County\t178\t49.6\t16.1\t5.3\t22541\t41875\t0.1853\t67634\tRomney\t67634\t0.000463975\t67634.0\n7968\t-98.854727\t38.888675\tRussell city\tKS\tKansas\tRussell County\t4285\t45.8\t19.8\t5.6\t19566\t65786\t0.1853\t67665\tRomney\t67665\t0.011169281999999999\t67665.0\n7969\t-98.691773\t39.114365\tLuray city\tKS\tKansas\tRussell County\t175\t48.8\t35.3\t3.2\t16479\t28929\t0.1853\t67649\tRomney\t67649\t0.000456155\t67649.0\n7970\t-98.79825100000001\t39.119901\tWaldo city\tKS\tKansas\tRussell County\t41\t48.1\t35.5\t4.5\t16635\t28750\t0.1853\t67673\tRomney\t67673\t0.000106871\t67673.0\n7971\t-98.918356\t39.114638\tParadise city\tKS\tKansas\tRussell County\t55\t48.8\t35.0\t3.4\t16530\t28750\t0.1853\t67658\tRomney\t67658\t0.000143363\t67658.0\n7972\t-98.698998\t38.87535\tBunker Hill city\tKS\tKansas\tRussell County\t88\t49.8\t15.2\t5.4\t22457\t41250\t0.1853\t67626\tRomney\t67626\t0.000229381\t67626.0\n7973\t-98.53889000000001\t39.058126\tLucas city\tKS\tKansas\tRussell County\t430\t52.6\t16.6\t1.6\t20287\t38125\t0.1853\t67648\tRomney\t67648\t0.001120838\t67648.0\n7974\t-99.02356400000001\t38.880888\tGorham city\tKS\tKansas\tRussell County\t319\t44.4\t16.5\t1.6\t19063\t82857\t0.1853\t67640\tRomney\t67640\t0.000831505\t67640.0\n7975\t-97.604293\t38.680240999999995\tAssaria city\tKS\tKansas\tSaline County\t449\t34.9\t21.6\t2.7\t18249\t118750\t0.3275\t67416\tRomney\t67416\t0.001170363\t67416.0\n7976\t-97.425788\t38.706114\tGypsum city\tKS\tKansas\tSaline County\t446\t43.4\t13.3\t4.3\t18127\t87778\t0.3275\t67448\tRomney\t67448\t0.001162544\t67448.0\n7977\t-97.506431\t38.878958000000004\tNew Cambria city\tKS\tKansas\tSaline County\t161\t45.5\t37.4\t3.3\t30720\t206250\t0.3275\t67470\tRomney\t67470\t0.000419663\t67470.0\n7978\t-97.86500799999999\t38.773471\tBrookville city\tKS\tKansas\tSaline County\t290\t39.8\t13.9\t5.1\t22022\t100000\t0.3275\t67425\tRomney\t67425\t0.0007559139999999999\t67425.0\n7979\t-97.68409799999999\t38.737688\tSmolan city\tKS\tKansas\tSaline County\t237\t40.9\t14.2\t4.2\t18743\t97857\t0.3275\t67442\tRomney\t67442\t0.000617764\t67442.0\n7980\t-97.61471\t38.817176\tSalina city\tKS\tKansas\tSaline County\t46251\t36.8\t23.9\t6.3\t23404\t115480\t0.3275\t67401\tRomney\t67401\t0.120557865\t67401.0\n7981\t-100.903818\t38.478481\tScott City\tKS\tKansas\tScott County\t3561\t43.3\t26.3\t3.3\t24884\t91867\t0.135\t67871\tRomney\t67871\t0.009282103\t67871.0\n7982\t-97.298469\t37.608467\tOaklawn-Sunview CDP\tKS\tKansas\tSedgwick County\t3135\t28.9\t5.1\t14.6\t16617\t28576\t0.3935\t67216\tRomney\t67216\t0.008171692\t67216.0\n7983\t-97.66089699999999\t37.870801\tMount Hope city\tKS\tKansas\tSedgwick County\t844\t40.1\t14.2\t7.5\t22891\t85313\t0.3935\t67108\tRomney\t67108\t0.0021999710000000002\t67108.0\n7984\t-97.781244\t37.628834999999995\tCheney city\tKS\tKansas\tSedgwick County\t1881\t39.6\t22.5\t5.6\t21945\t85441\t0.3935\t67025\tRomney\t67025\t0.004903015\t67025.0\n7985\t-97.515905\t37.886617\tBentley city\tKS\tKansas\tSedgwick County\t351\t37.2\t10.3\t4.7\t19486\t76667\t0.3935\t67016\tRomney\t67016\t0.000914917\t67016.0\n7986\t-97.64468000000001\t37.482965\tViola city\tKS\tKansas\tSedgwick County\t245\t36.7\t23.0\t5.5\t20562\t99286\t0.3935\t67149\tRomney\t67149\t0.000638617\t67149.0\n7987\t-97.240962\t37.488172\tMulvane city\tKS\tKansas\tSedgwick County\t5324\t34.5\t21.7\t7.8\t25325\t99416\t0.3935\t67110\tRomney\t67110\t0.013877539\t67110.0\n7988\t-97.27587700000001\t37.796353\tKechi city\tKS\tKansas\tSedgwick County\t1105\t37.0\t46.4\t6.0\t28968\t157227\t0.3935\t67067\tRomney\t67067\t0.002880293\t67067.0\n7989\t-97.627619\t37.791221\tAndale city\tKS\tKansas\tSedgwick County\t792\t29.7\t17.9\t7.9\t20776\t124265\t0.3935\t67001\tRomney\t67001\t0.002064427\t67001.0\n7990\t-97.5003\t37.50562\tClearwater city\tKS\tKansas\tSedgwick County\t2507\t37.1\t21.5\t5.2\t24545\t110417\t0.3935\t67026\tRomney\t67026\t0.006534747\t67026.0\n7991\t-97.259045\t37.685412\tEastborough city\tKS\tKansas\tSedgwick County\t804\t48.6\t69.8\t4.2\t67054\t271429\t0.3935\t67218\tRomney\t67218\t0.002095707\t67218.0\n7992\t-97.680989\t37.660055\tGarden Plain city\tKS\tKansas\tSedgwick County\t839\t33.2\t15.6\t7.4\t23888\t99032\t0.3935\t67050\tRomney\t67050\t0.002186938\t67050.0\n7993\t-97.539778\t37.780784000000004\tColwich city\tKS\tKansas\tSedgwick County\t1285\t31.8\t25.0\t3.8\t22570\t126111\t0.3935\t67030\tRomney\t67030\t0.0033494809999999996\t67030.0\n7994\t-97.268456\t37.764809\tBel Aire city\tKS\tKansas\tSedgwick County\t6634\t34.6\t52.5\t5.8\t30337\t136085\t0.3935\t67220\tRomney\t67220\t0.017292186\t67220.0\n7995\t-97.257716\t37.554284\tDerby city\tKS\tKansas\tSedgwick County\t20669\t37.0\t35.9\t6.7\t28817\t133671\t0.3935\t67037\tRomney\t67037\t0.053875819000000005\t67037.0\n7996\t-97.464318\t37.772393\tMaize city\tKS\tKansas\tSedgwick County\t2480\t36.3\t23.7\t5.5\t26674\t98380\t0.3935\t67101\tRomney\t67101\t0.006464368000000001\t67101.0\n7997\t-97.35145\t37.56622\tHaysville city\tKS\tKansas\tSedgwick County\t9279\t35.4\t13.8\t9.5\t23227\t85443\t0.3935\t67060\tRomney\t67060\t0.024186642999999997\t67060.0\n7998\t-97.325745\t37.802667\tPark City\tKS\tKansas\tSedgwick County\t6655\t32.6\t17.5\t9.4\t21424\t74059\t0.3935\t67219\tRomney\t67219\t0.017346924\t67219.0\n7999\t-97.56971800000001\t37.663425\tGoddard city\tKS\tKansas\tSedgwick County\t2784\t34.1\t21.2\t7.8\t23003\t104134\t0.3935\t67052\tRomney\t67052\t0.007256775\t67052.0\n8000\t-97.36998\t37.826944\tValley Center city\tKS\tKansas\tSedgwick County\t5646\t35.5\t27.5\t5.2\t25266\t104698\t0.3935\t67147\tRomney\t67147\t0.014716865\t67147.0\n8001\t-97.345005\t37.690492\tWichita city\tKS\tKansas\tSedgwick County\t357608\t34.7\t26.7\t9.9\t25096\t92355\t0.3935\t67202\tRomney\t67202\t0.932141074\t67202.0\n8002\t-100.93025\t37.045674\tLiberal city\tKS\tKansas\tSeward County\t20372\t29.3\t17.3\t6.4\t18834\t96398\t0.2879\t67901\tRomney\t67901\t0.053101659\t67901.0\n8003\t-100.701802\t37.204627\tKismet city\tKS\tKansas\tSeward County\t505\t31.4\t15.4\t1.1\t17110\t85833\t0.2879\t67859\tRomney\t67859\t0.0013163329999999998\t67859.0\n8004\t-95.95052199999999\t39.13635\tRossville city\tKS\tKansas\tShawnee County\t1100\t39.2\t20.6\t3.7\t22608\t105482\t0.4833\t66533\tRomney\t66533\t0.00286726\t66533.0\n8005\t-95.94321\t39.094633\tWillard city\tKS\tKansas\tShawnee County\t95\t40.0\t23.0\t2.3\t24801\t143750\t0.4833\t66533\tRomney\t66533\t0.000247627\t66533.0\n8006\t-95.81636999999999\t38.906384\tAuburn city\tKS\tKansas\tShawnee County\t1325\t33.1\t23.6\t3.9\t23308\t94226\t0.4833\t66402\tRomney\t66402\t0.003453745\t66402.0\n8007\t-95.856261\t39.099778\tSilver Lake city\tKS\tKansas\tShawnee County\t1524\t39.9\t23.2\t4.7\t24101\t122680\t0.4833\t66539\tRomney\t66539\t0.003972459\t66539.0\n8008\t-95.69326\t39.040265000000005\tTopeka city\tKS\tKansas\tShawnee County\t123206\t37.8\t29.3\t7.5\t24863\t80190\t0.4833\t66612\tRomney\t66612\t0.321148781\t66612.0\n8009\t-100.43975\t39.35584\tHoxie city\tKS\tKansas\tSheridan County\t1169\t49.0\t16.5\t2.6\t20409\t81795\t0.1252\t67740\tRomney\t67740\t0.003047116\t67740.0\n8010\t-100.56716999999999\t39.541456\tSelden city\tKS\tKansas\tSheridan County\t184\t44.1\t10.8\t0.0\t18388\t63333\t0.1252\t67757\tRomney\t67757\t0.000479614\t67757.0\n8011\t-101.710038\t39.349340999999995\tGoodland city\tKS\tKansas\tSherman County\t4446\t38.1\t16.5\t4.7\t20896\t84865\t0.22\t67735\tRomney\t67735\t0.011588943999999999\t67735.0\n8012\t-102.037219\t39.336574\tKanorado city\tKS\tKansas\tSherman County\t239\t42.7\t12.0\t1.7\t14404\t66250\t0.22\t67741\tRomney\t67741\t0.0006229769999999999\t67741.0\n8013\t-98.557356\t39.81028\tLebanon city\tKS\tKansas\tSmith County\t241\t48.6\t14.4\t4.1\t17558\t46000\t0.177\t66952\tRomney\t66952\t0.000628191\t66952.0\n8014\t-99.03278900000001\t39.767044\tKensington city\tKS\tKansas\tSmith County\t429\t48.9\t21.4\t4.6\t18340\t54762\t0.177\t66951\tRomney\t66951\t0.0011182310000000001\t66951.0\n8015\t-98.847404\t39.646248\tGaylord city\tKS\tKansas\tSmith County\t117\t49.1\t21.6\t4.2\t18424\t54286\t0.177\t67638\tRomney\t67638\t0.00030497200000000003\t67638.0\n8016\t-98.783293\t39.779368\tSmith Center city\tKS\tKansas\tSmith County\t1859\t50.3\t20.9\t3.4\t17655\t62609\t0.177\t66967\tRomney\t66967\t0.00484567\t66967.0\n8017\t-98.94032800000001\t39.657102\tCedar city\tKS\tKansas\tSmith County\t21\t47.5\t23.5\t7.7\t18413\t30000\t0.177\t67628\tRomney\t67628\t5.47e-05\t67628.0\n8018\t-98.91979599999999\t39.766334\tAthol city\tKS\tKansas\tSmith County\t41\t49.4\t19.4\t4.0\t18523\t50000\t0.177\t66932\tRomney\t66932\t0.000106871\t66932.0\n8019\t-98.599356\t37.962664000000004\tStafford city\tKS\tKansas\tStafford County\t1089\t48.1\t15.8\t6.1\t19902\t37895\t0.2197\t67578\tRomney\t67578\t0.002838588\t67578.0\n8020\t-98.894473\t38.173828\tRadium city\tKS\tKansas\tStafford County\t37\t45.8\t20.0\t5.6\t19781\t65000\t0.2197\t67567\tRomney\t67567\t9.640000000000001e-05\t67567.0\n8021\t-98.968838\t37.957211\tMacksville city\tKS\tKansas\tStafford County\t474\t41.9\t22.0\t5.1\t19851\t66667\t0.2197\t67557\tRomney\t67557\t0.001235528\t67557.0\n8022\t-98.761335\t38.00103\tSt. John city\tKS\tKansas\tStafford County\t1208\t43.5\t25.6\t3.0\t18401\t59479\t0.2197\t67576\tRomney\t67576\t0.0031487729999999997\t67576.0\n8023\t-98.660399\t38.104606\tHudson city\tKS\tKansas\tStafford County\t121\t45.6\t24.4\t9.0\t16868\t73333\t0.2197\t67545\tRomney\t67545\t0.000315399\t67545.0\n8024\t-98.794107\t38.177713\tSeward city\tKS\tKansas\tStafford County\t57\t45.0\t24.4\t9.4\t16953\t75000\t0.2197\t67545\tRomney\t67545\t0.000148576\t67545.0\n8025\t-101.883705\t37.52432\tManter city\tKS\tKansas\tStanton County\t167\t39.3\t16.8\t3.0\t22127\t101563\t0.1884\t67862\tRomney\t67862\t0.000435302\t67862.0\n8026\t-101.75291899999999\t37.569598\tJohnson City\tKS\tKansas\tStanton County\t1358\t34.9\t17.9\t4.1\t20682\t81552\t0.1884\t67855\tRomney\t67855\t0.003539763\t67855.0\n8027\t-101.206689\t37.325171999999995\tMoscow city\tKS\tKansas\tStevens County\t221\t36.3\t20.9\t5.0\t22077\t95000\t0.1239\t67952\tRomney\t67952\t0.000576059\t67952.0\n8028\t-101.346908\t37.175573\tHugoton city\tKS\tKansas\tStevens County\t3571\t34.3\t16.8\t5.4\t21024\t94679\t0.1239\t67951\tRomney\t67951\t0.009308169\t67951.0\n8029\t-97.608685\t37.035022999999995\tCaldwell city\tKS\tKansas\tSumner County\t1086\t47.2\t19.8\t9.9\t20047\t40875\t0.2908\t67022\tRomney\t67022\t0.002830768\t67022.0\n8030\t-97.763263\t37.267934000000004\tArgonia city\tKS\tKansas\tSumner County\t456\t43.1\t21.2\t9.0\t17166\t47857\t0.2908\t67004\tRomney\t67004\t0.00118861\t67004.0\n8031\t-97.27931\t37.395282\tBelle Plaine city\tKS\tKansas\tSumner County\t1733\t38.4\t20.6\t8.6\t23811\t71190\t0.2908\t67013\tRomney\t67013\t0.004517238\t67013.0\n8032\t-97.407595\t37.004647\tHunnewell city\tKS\tKansas\tSumner County\t76\t40.4\t16.0\t11.8\t17991\t47500\t0.2908\t67140\tRomney\t67140\t0.000198102\t67140.0\n8033\t-97.169794\t37.274735\tOxford city\tKS\tKansas\tSumner County\t1006\t45.4\t21.5\t7.1\t20521\t74559\t0.2908\t67119\tRomney\t67119\t0.00262224\t67119.0\n8034\t-97.54616800000001\t37.262543\tMayfield city\tKS\tKansas\tSumner County\t115\t40.7\t16.7\t5.7\t20511\t91000\t0.2908\t67103\tRomney\t67103\t0.00029975900000000003\t67103.0\n8035\t-97.397598\t37.271495\tWellington city\tKS\tKansas\tSumner County\t8158\t37.7\t19.0\t9.2\t21350\t70379\t0.2908\t67152\tRomney\t67152\t0.021264644\t67152.0\n8036\t-97.673955\t37.257549\tMilan city\tKS\tKansas\tSumner County\t128\t34.6\t22.8\t6.5\t18982\t100000\t0.2908\t67105\tRomney\t67105\t0.000333645\t67105.0\n8037\t-97.64341\t37.389448\tConway Springs city\tKS\tKansas\tSumner County\t1141\t34.1\t17.5\t7.7\t19889\t70341\t0.2908\t67031\tRomney\t67031\t0.0029741309999999996\t67031.0\n8038\t-97.146029\t37.111360999999995\tGeuda Springs city\tKS\tKansas\tSumner County\t188\t43.9\t13.0\t8.7\t20306\t83571\t0.2908\t67051\tRomney\t67051\t0.000490041\t67051.0\n8039\t-97.40091\t37.049576\tSouth Haven city\tKS\tKansas\tSumner County\t355\t39.6\t15.1\t13.0\t18090\t48667\t0.2908\t67140\tRomney\t67140\t0.000925343\t67140.0\n8040\t-101.048192\t39.38687\tColby city\tKS\tKansas\tThomas County\t4936\t34.9\t25.1\t6.6\t23630\t99840\t0.1721\t67701\tRomney\t67701\t0.012866178\t67701.0\n8041\t-100.744007\t39.470551\tRexford city\tKS\tKansas\tThomas County\t131\t37.5\t27.1\t1.4\t21347\t70000\t0.1721\t67753\tRomney\t67753\t0.000341465\t67753.0\n8042\t-100.724197\t39.356123\tMenlo city\tKS\tKansas\tThomas County\t48\t36.9\t29.0\t0.0\t21166\t55000\t0.1721\t67753\tRomney\t67753\t0.000125117\t67753.0\n8043\t-100.89738100000001\t39.426024\tGem city\tKS\tKansas\tThomas County\t80\t38.3\t26.4\t2.3\t21366\t80000\t0.1721\t67734\tRomney\t67734\t0.00020852799999999998\t67734.0\n8044\t-101.37725999999999\t39.363045\tBrewster city\tKS\tKansas\tThomas County\t262\t42.9\t19.9\t0.0\t22238\t68000\t0.1721\t67732\tRomney\t67732\t0.000682929\t67732.0\n8045\t-100.11850799999999\t39.037159\tCollyer city\tKS\tKansas\tTrego County\t106\t47.2\t14.1\t1.6\t18965\t67500\t0.1843\t67631\tRomney\t67631\t0.0002763\t67631.0\n8046\t-99.882002\t39.023559000000006\tWaKeeney city\tKS\tKansas\tTrego County\t1802\t47.5\t19.4\t3.7\t20681\t70851\t0.1843\t67672\tRomney\t67672\t0.004697094000000001\t67672.0\n8047\t-95.962734\t38.789552\tHarveyville city\tKS\tKansas\tWabaunsee County\t283\t43.5\t18.8\t4.6\t19488\t84444\t0.281\t66431\tRomney\t66431\t0.000737668\t66431.0\n8048\t-96.238025\t39.054525\tMcFarland city\tKS\tKansas\tWabaunsee County\t285\t36.4\t19.9\t2.9\t18311\t76667\t0.281\t66501\tRomney\t66501\t0.000742881\t66501.0\n8049\t-96.16704200000001\t39.068875\tPaxico city\tKS\tKansas\tWabaunsee County\t222\t35.8\t19.6\t2.8\t18300\t77000\t0.281\t66526\tRomney\t66526\t0.000578665\t66526.0\n8050\t-96.028063\t39.085363\tMaple Hill city\tKS\tKansas\tWabaunsee County\t493\t38.7\t18.2\t3.7\t21776\t113362\t0.281\t66507\tRomney\t66507\t0.0012850539999999999\t66507.0\n8051\t-96.28842399999999\t39.014904\tAlma city\tKS\tKansas\tWabaunsee County\t698\t43.1\t25.8\t6.9\t21295\t82647\t0.281\t66401\tRomney\t66401\t0.001819407\t66401.0\n8052\t-96.1048\t38.859392\tEskridge city\tKS\tKansas\tWabaunsee County\t596\t45.5\t7.9\t2.4\t19219\t66458\t0.281\t66423\tRomney\t66423\t0.0015535339999999999\t66423.0\n8053\t-96.489042\t38.863052\tAlta Vista city\tKS\tKansas\tWabaunsee County\t436\t47.3\t23.0\t2.2\t21559\t67222\t0.281\t66834\tRomney\t66834\t0.001136478\t66834.0\n8054\t-101.593009\t38.912672\tWallace city\tKS\tKansas\tWallace County\t62\t45.0\t17.5\t2.9\t19999\t62500\t0.0852\t67761\tRomney\t67761\t0.000161609\t67761.0\n8055\t-101.751273\t38.894705\tSharon Springs city\tKS\tKansas\tWallace County\t771\t45.1\t17.2\t7.0\t20274\t62759\t0.0852\t67758\tRomney\t67758\t0.002009689\t67758.0\n8056\t-97.304523\t39.855308\tHaddam city\tKS\tKansas\tWashington County\t113\t44.3\t14.5\t4.5\t16675\t33750\t0.1814\t66944\tRomney\t66944\t0.00029454599999999997\t66944.0\n8057\t-97.279961\t39.569555\tClifton city\tKS\tKansas\tWashington County\t460\t42.8\t16.8\t5.4\t16221\t49286\t0.1814\t66937\tRomney\t66937\t0.0011990360000000001\t66937.0\n8058\t-96.980232\t39.727257\tGreenleaf city\tKS\tKansas\tWashington County\t336\t48.1\t17.6\t3.6\t18476\t47188\t0.1814\t66943\tRomney\t66943\t0.000875818\t66943.0\n8059\t-96.873021\t39.711831\tBarnes city\tKS\tKansas\tWashington County\t145\t45.0\t12.2\t1.2\t16332\t47000\t0.1814\t66933\tRomney\t66933\t0.00037795699999999995\t66933.0\n8060\t-97.086623\t39.67941\tLinn city\tKS\tKansas\tWashington County\t445\t53.3\t20.0\t1.9\t19709\t55789\t0.1814\t66953\tRomney\t66953\t0.001159937\t66953.0\n8061\t-97.353769\t39.987722\tMahaska city\tKS\tKansas\tWashington County\t71\t45.0\t14.6\t4.7\t16803\t27500\t0.1814\t66955\tRomney\t66955\t0.00018506900000000003\t66955.0\n8062\t-97.293624\t39.568739\tVining city\tKS\tKansas\tWashington County\t51\t45.0\t13.9\t6.1\t16169\t45000\t0.1814\t66937\tRomney\t66937\t0.00013293700000000002\t66937.0\n8063\t-97.052557\t39.817040000000006\tWashington city\tKS\tKansas\tWashington County\t1104\t46.9\t24.0\t7.4\t17723\t57451\t0.1814\t66968\tRomney\t66968\t0.0028776870000000003\t66968.0\n8064\t-97.140058\t39.633423\tPalmer city\tKS\tKansas\tWashington County\t113\t53.0\t20.7\t1.5\t19717\t57000\t0.1814\t66962\tRomney\t66962\t0.00029454599999999997\t66962.0\n8065\t-96.876426\t39.892604999999996\tHanover city\tKS\tKansas\tWashington County\t691\t43.6\t16.0\t3.3\t19630\t62391\t0.1814\t66945\tRomney\t66945\t0.0018011610000000001\t66945.0\n8066\t-96.99179000000001\t39.980902\tHollenberg city\tKS\tKansas\tWashington County\t27\t45.0\t15.8\t5.9\t17256\t90000\t0.1814\t66946\tRomney\t66946\t7.04e-05\t66946.0\n8067\t-97.172784\t39.844983\tMorrowville city\tKS\tKansas\tWashington County\t112\t44.3\t14.5\t4.5\t16724\t33750\t0.1814\t66958\tRomney\t66958\t0.000291939\t66958.0\n8068\t-101.357812\t38.483340000000005\tLeoti city\tKS\tKansas\tWichita County\t1432\t37.0\t17.6\t3.9\t18812\t64250\t0.1591\t67861\tRomney\t67861\t0.0037326509999999996\t67861.0\n8069\t-95.661695\t37.525040999999995\tAltoona city\tKS\tKansas\tWilson County\t442\t40.9\t7.2\t17.5\t15215\t36071\t0.2201\t66710\tRomney\t66710\t0.001152117\t66710.0\n8070\t-95.935857\t37.56739\tNew Albany city\tKS\tKansas\tWilson County\t66\t50.4\t20.4\t13.2\t18694\t75000\t0.2201\t66759\tRomney\t66759\t0.00017203599999999998\t66759.0\n8071\t-95.82265100000001\t37.533059\tFredonia city\tKS\tKansas\tWilson County\t2435\t42.9\t13.4\t9.6\t17808\t59398\t0.2201\t66736\tRomney\t66736\t0.006347071\t66736.0\n8072\t-95.68194\t37.424824\tNeodesha city\tKS\tKansas\tWilson County\t2653\t39.9\t11.7\t9.9\t17762\t58143\t0.2201\t66757\tRomney\t66757\t0.00691531\t66757.0\n8073\t-95.69745999999999\t37.708954\tBuffalo city\tKS\tKansas\tWilson County\t295\t44.8\t15.0\t12.5\t16938\t50000\t0.2201\t66717\tRomney\t66717\t0.000768947\t66717.0\n8074\t-95.743597\t37.626875\tBenedict city\tKS\tKansas\tWilson County\t107\t44.6\t14.9\t12.7\t16943\t46250\t0.2201\t66714\tRomney\t66714\t0.000278906\t66714.0\n8075\t-95.89578900000001\t37.687137\tCoyville city\tKS\tKansas\tWilson County\t64\t50.0\t20.4\t13.2\t18735\t70000\t0.2201\t66777\tRomney\t66777\t0.000166822\t66777.0\n8076\t-95.737201\t37.876981\tYates Center city\tKS\tKansas\tWoodson County\t1520\t45.3\t14.9\t6.8\t17037\t58889\t0.2626\t66783\tRomney\t66783\t0.003962032\t66783.0\n8077\t-95.949493\t37.798462\tToronto city\tKS\tKansas\tWoodson County\t284\t54.3\t7.5\t4.3\t20877\t59286\t0.2626\t66777\tRomney\t66777\t0.000740274\t66777.0\n8078\t-95.555687\t38.005531\tNeosho Falls city\tKS\tKansas\tWoodson County\t173\t41.3\t5.3\t8.4\t15523\t58000\t0.2626\t66758\tRomney\t66758\t0.00045094199999999997\t66758.0\n8079\t-94.743874\t39.123373\tKansas City\tKS\tKansas\tWyandotte County\t143008\t33.5\t14.5\t11.5\t19884\t69317\t0.6761\t66112\tRomney\t66112\t0.37276467700000004\t66112.0\n8080\t-94.816556\t39.077154\tEdwardsville city\tKS\tKansas\tWyandotte County\t4307\t38.5\t16.2\t8.8\t22800\t79762\t0.6761\t66111\tRomney\t66111\t0.011226627\t66111.0\n8081\t-94.862755\t39.082606\tBonner Springs city\tKS\tKansas\tWyandotte County\t7005\t35.8\t22.2\t8.0\t24489\t101078\t0.6761\t662HH\tRomney\t662HH\t0.018259234\t0.0\n8082\t-85.307142\t37.097664\tColumbia city\tKY\tKentucky\tAdair County\t3751\t36.9\t22.1\t10.4\t18948\t84105\t0.2184\t42728\tRomney\t42728\t0.013387458\t42728.0\n8083\t-86.196832\t36.749194\tScottsville city\tKY\tKentucky\tAllen County\t4354\t40.2\t10.0\t13.6\t16673\t69519\t0.2546\t42164\tRomney\t42164\t0.015539586999999999\t42164.0\n8084\t-84.89449599999999\t38.034440000000004\tLawrenceburg city\tKY\tKentucky\tAnderson County\t10251\t37.0\t14.6\t11.8\t22792\t121327\t0.3212\t40342\tRomney\t40342\t0.036586198\t40342.0\n8085\t-88.964974\t36.943827\tBlandville city\tKY\tKentucky\tBallard County\t102\t41.8\t16.7\t7.3\t20579\t65000\t0.3053\t42023\tRomney\t42023\t0.00036404199999999997\t42023.0\n8086\t-88.97759599999999\t37.074145\tLa Center city\tKY\tKentucky\tBallard County\t1019\t44.0\t10.4\t9.6\t17568\t60250\t0.3053\t42056\tRomney\t42056\t0.003636849\t42056.0\n8087\t-89.044915\t37.051086\tBarlow city\tKY\tKentucky\tBallard County\t698\t41.2\t11.0\t5.9\t16780\t60952\t0.3053\t42024\tRomney\t42024\t0.002491188\t42024.0\n8088\t-88.883606\t37.084610999999995\tKevil city\tKY\tKentucky\tBallard County\t638\t42.2\t14.4\t5.6\t23056\t76579\t0.3053\t42053\tRomney\t42053\t0.002277046\t42053.0\n8089\t-89.083085\t36.965848\tWickliffe city\tKY\tKentucky\tBallard County\t774\t45.2\t14.4\t6.2\t20375\t65227\t0.3053\t42087\tRomney\t42087\t0.002762435\t42087.0\n8090\t-85.92448900000001\t37.003686\tGlasgow city\tKY\tKentucky\tBarren County\t13828\t41.0\t16.6\t13.8\t21466\t97131\t0.3259\t42141\tRomney\t42141\t0.049352644\t42141.0\n8091\t-86.048772\t37.094122999999996\tPark City\tKY\tKentucky\tBarren County\t629\t41.0\t13.3\t14.3\t17731\t74762\t0.3259\t42160\tRomney\t42160\t0.002244924\t42160.0\n8092\t-85.963976\t37.140374\tCave City\tKY\tKentucky\tBarren County\t2056\t43.9\t14.1\t15.6\t17667\t79151\t0.3259\t42127\tRomney\t42127\t0.00733794\t42127.0\n8093\t-85.81568100000001\t37.101737\tHiseville city\tKY\tKentucky\tBarren County\t235\t40.1\t9.3\t9.6\t15718\t93750\t0.3259\t42154\tRomney\t42154\t0.0008387239999999999\t42154.0\n8094\t-83.61563100000001\t38.119337\tSalt Lick city\tKY\tKentucky\tBath County\t373\t40.7\t11.6\t10.9\t15858\t60625\t0.4294\t40371\tRomney\t40371\t0.001331251\t40371.0\n8095\t-83.761923\t38.137565\tOwingsville city\tKY\tKentucky\tBath County\t1526\t42.6\t18.8\t15.0\t18310\t85132\t0.4294\t40360\tRomney\t40360\t0.00544635\t40360.0\n8096\t-83.928659\t38.202334\tSharpsburg city\tKY\tKentucky\tBath County\t286\t45.4\t11.0\t9.2\t19311\t72083\t0.4294\t40374\tRomney\t40374\t0.001020745\t40374.0\n8097\t-83.72231500000001\t36.613293\tMiddlesborough city\tKY\tKentucky\tBell County\t9977\t41.6\t15.2\t18.0\t15593\t70606\t0.2345\t40965\tRomney\t40965\t0.035608282000000005\t40965.0\n8098\t-83.699471\t36.759986\tPineville city\tKY\tKentucky\tBell County\t2293\t43.8\t19.0\t14.4\t15927\t66711\t0.2345\t40977\tRomney\t40977\t0.008183801999999999\t40977.0\n8099\t-84.67926800000001\t38.999393\tOakbrook CDP\tKY\tKentucky\tBoone County\t9856\t35.7\t38.5\t9.3\t36067\t185307\t0.2976\t41042\tRomney\t41042\t0.035176429\t41042.0\n8100\t-84.721513\t39.022836\tBurlington CDP\tKY\tKentucky\tBoone County\t16239\t31.6\t24.6\t8.7\t30237\t171239\t0.2976\t41005\tRomney\t41005\t0.057957592\t41005.0\n8101\t-84.602542\t38.863502000000004\tWalton city\tKY\tKentucky\tBoone County\t3249\t36.0\t13.5\t11.1\t26669\t121284\t0.2976\t41094\tRomney\t41094\t0.011595801000000001\t41094.0\n8102\t-84.674077\t38.945799\tUnion city\tKY\tKentucky\tBoone County\t4432\t32.6\t41.4\t7.0\t33614\t214177\t0.2976\t41091\tRomney\t41091\t0.015817972\t41091.0\n8103\t-84.646585\t38.98805\tFlorence city\tKY\tKentucky\tBoone County\t31165\t34.1\t23.1\t10.3\t28381\t151616\t0.2976\t41042\tRomney\t41042\t0.111229038\t41042.0\n8104\t-84.269749\t38.201538\tParis city\tKY\tKentucky\tBourbon County\t9569\t37.7\t13.1\t11.5\t22035\t107130\t0.3881\t40361\tRomney\t40361\t0.034152115\t40361.0\n8105\t-84.110079\t38.142491\tNorth Middletown city\tKY\tKentucky\tBourbon County\t567\t41.6\t10.1\t5.3\t21424\t99333\t0.3881\t40361\tRomney\t40361\t0.002023644\t40361.0\n8106\t-84.145877\t38.303329999999995\tMillersburg city\tKY\tKentucky\tBourbon County\t856\t39.8\t14.3\t10.0\t18629\t91786\t0.3881\t40348\tRomney\t40348\t0.0030550959999999998\t40348.0\n8107\t-82.602263\t38.419646\tCatlettsburg city\tKY\tKentucky\tBoyd County\t1846\t41.7\t8.7\t11.1\t18047\t66552\t0.4082\t41129\tRomney\t41129\t0.006588442\t41129.0\n8108\t-82.64274499999999\t38.459379\tAshland city\tKY\tKentucky\tBoyd County\t21080\t43.8\t21.9\t9.0\t22754\t93833\t0.4082\t41101\tRomney\t41101\t0.0752353\t41101.0\n8109\t-82.679038\t38.481013\tWestwood CDP\tKY\tKentucky\tBoyd County\t4774\t44.3\t11.6\t9.5\t19831\t70323\t0.4082\t41101\tRomney\t41101\t0.017038583\t41101.0\n8110\t-84.95106899999999\t37.649577\tPerryville city\tKY\tKentucky\tBoyle County\t852\t42.3\t17.8\t10.1\t22641\t111890\t0.3614\t40468\tRomney\t40468\t0.00304082\t40468.0\n8111\t-84.777509\t37.643442\tDanville city\tKY\tKentucky\tBoyle County\t15899\t39.3\t28.2\t12.0\t23891\t112748\t0.3614\t40422\tRomney\t40422\t0.056744119\t40422.0\n8112\t-84.781745\t37.585542\tJunction City\tKY\tKentucky\tBoyle County\t2336\t37.1\t6.7\t12.7\t17475\t70732\t0.3614\t40440\tRomney\t40440\t0.00833727\t40440.0\n8113\t-84.067882\t38.682118\tBrooksville city\tKY\tKentucky\tBracken County\t607\t38.5\t12.4\t11.7\t20218\t78438\t0.3549\t41004\tRomney\t41004\t0.002166405\t41004.0\n8114\t-84.000086\t38.772199\tAugusta city\tKY\tKentucky\tBracken County\t1167\t42.2\t12.6\t14.2\t17156\t77656\t0.3549\t41002\tRomney\t41002\t0.004165065999999999\t41002.0\n8115\t-83.9612\t38.653884000000005\tGermantown city\tKY\tKentucky\tBracken County\t209\t39.4\t19.7\t11.0\t20547\t81250\t0.3549\t41044\tRomney\t41044\t0.000745929\t41044.0\n8116\t-83.37959599999999\t37.558890000000005\tJackson city\tKY\tKentucky\tBreathitt County\t2414\t41.8\t24.2\t15.6\t15334\t66447\t0.3119\t41339\tRomney\t41339\t0.008615655\t41339.0\n8117\t-86.628815\t37.8312\tCloverport city\tKY\tKentucky\tBreckinridge County\t1202\t42.0\t6.0\t18.2\t17102\t56000\t0.3545\t40111\tRomney\t40111\t0.004289982\t40111.0\n8118\t-86.28401600000001\t37.878640000000004\tIrvington city\tKY\tKentucky\tBreckinridge County\t1237\t39.6\t9.9\t18.7\t16158\t75882\t0.3545\t40146\tRomney\t40146\t0.004414899\t40146.0\n8119\t-86.453633\t37.775504\tHardinsburg city\tKY\tKentucky\tBreckinridge County\t2582\t41.4\t10.2\t12.2\t18895\t84155\t0.3545\t40143\tRomney\t40143\t0.009215254\t40143.0\n8120\t-85.691703\t38.045761999999996\tFox Chase city\tKY\tKentucky\tBullitt County\t464\t47.1\t17.0\t9.8\t28831\t204310\t0.3138\t40229\tRomney\t40229\t0.001656033\t40229.0\n8121\t-85.679451\t38.060182\tPioneer Village city\tKY\tKentucky\tBullitt County\t3011\t39.4\t13.0\t10.8\t25907\t166604\t0.3138\t40229\tRomney\t40229\t0.01074637\t40229.0\n8122\t-85.709691\t37.988883\tShepherdsville city\tKY\tKentucky\tBullitt County\t11433\t32.0\t10.4\t12.3\t21265\t129977\t0.3138\t40165\tRomney\t40165\t0.0408048\t40165.0\n8123\t-85.724806\t37.835399\tLebanon Junction city\tKY\tKentucky\tBullitt County\t1921\t39.4\t9.8\t17.6\t19184\t99359\t0.3138\t40150\tRomney\t40150\t0.00685612\t40150.0\n8124\t-85.55188000000001\t38.048378\tMount Washington city\tKY\tKentucky\tBullitt County\t11654\t37.1\t14.7\t11.2\t22500\t160577\t0.3138\t40047\tRomney\t40047\t0.041593557\t40047.0\n8125\t-85.689172\t38.06563\tHillview city\tKY\tKentucky\tBullitt County\t7714\t35.1\t6.8\t11.8\t21797\t129566\t0.3138\t40229\tRomney\t40229\t0.027531551\t40229.0\n8126\t-85.716702\t38.067121\tBrooks CDP\tKY\tKentucky\tBullitt County\t3144\t38.3\t6.5\t9.4\t25483\t55278\t0.3138\t40109\tRomney\t40109\t0.011221051999999999\t40109.0\n8127\t-85.667811\t38.04965\tHebron Estates city\tKY\tKentucky\tBullitt County\t1254\t44.6\t15.0\t7.9\t26655\t196076\t0.3138\t40229\tRomney\t40229\t0.004475572\t40229.0\n8128\t-85.692499\t38.078107\tHunters Hollow city\tKY\tKentucky\tBullitt County\t431\t36.1\t3.5\t7.2\t21253\t137500\t0.3138\t40229\tRomney\t40229\t0.001538255\t40229.0\n8129\t-86.89151600000001\t37.209761\tRochester city\tKY\tKentucky\tButler County\t171\t44.4\t11.0\t14.1\t18760\t69000\t0.2555\t42273\tRomney\t42273\t0.000610305\t42273.0\n8130\t-86.635397\t37.183365\tWoodbury city\tKY\tKentucky\tButler County\t94\t45.4\t8.6\t16.7\t18422\t70000\t0.2555\t42261\tRomney\t42261\t0.000335489\t42261.0\n8131\t-86.700185\t37.217713\tMorgantown city\tKY\tKentucky\tButler County\t2522\t39.1\t9.2\t13.4\t18125\t71961\t0.2555\t42261\tRomney\t42261\t0.009001111\t42261.0\n8132\t-88.060185\t37.208526\tFredonia city\tKY\tKentucky\tCaldwell County\t423\t43.7\t13.1\t13.5\t20268\t69000\t0.316\t42411\tRomney\t42411\t0.0015097029999999998\t42411.0\n8133\t-87.88545500000001\t37.106702\tPrinceton city\tKY\tKentucky\tCaldwell County\t6337\t44.6\t13.7\t11.1\t19121\t67568\t0.316\t42445\tRomney\t42445\t0.022616987\t42445.0\n8134\t-88.325342\t36.5056\tHazel city\tKY\tKentucky\tCalloway County\t478\t44.8\t24.9\t5.9\t20928\t84412\t0.3528\t42049\tRomney\t42049\t0.0017059999999999998\t42049.0\n8135\t-88.316333\t36.616178999999995\tMurray city\tKY\tKentucky\tCalloway County\t15078\t28.0\t40.9\t11.1\t21613\t106180\t0.3528\t42071\tRomney\t42071\t0.05381394\t42071.0\n8136\t-84.481436\t39.040152\tWilder city\tKY\tKentucky\tCampbell County\t2449\t33.0\t38.1\t11.0\t29448\t97910\t0.3753\t41015\tRomney\t41015\t0.008740572\t41015.0\n8137\t-84.384351\t38.963629\tAlexandria city\tKY\tKentucky\tCampbell County\t7686\t34.4\t23.1\t7.8\t29578\t138189\t0.3753\t41001\tRomney\t41001\t0.027431617999999998\t41001.0\n8138\t-84.472563\t39.091091999999996\tWoodlawn city\tKY\tKentucky\tCampbell County\t246\t35.5\t39.2\t8.9\t31532\t147222\t0.3753\t41073\tRomney\t41073\t0.000877983\t41073.0\n8139\t-84.471618\t39.063347\tSouthgate city\tKY\tKentucky\tCampbell County\t3274\t34.8\t30.8\t10.5\t29469\t107143\t0.3753\t41075\tRomney\t41075\t0.011685026999999999\t41075.0\n8140\t-84.486693\t39.085791\tNewport city\tKY\tKentucky\tCampbell County\t16044\t34.2\t15.4\t15.5\t21506\t85110\t0.3753\t41071\tRomney\t41071\t0.05726163\t41071.0\n8141\t-84.434484\t39.013238\tCold Spring city\tKY\tKentucky\tCampbell County\t5384\t41.8\t31.5\t7.9\t32475\t149826\t0.3753\t41076\tRomney\t41076\t0.019215695\t41076.0\n8142\t-84.398684\t39.041265\tSilver Grove city\tKY\tKentucky\tCampbell County\t1195\t34.8\t12.3\t16.6\t22770\t81786\t0.3753\t41085\tRomney\t41085\t0.004264999\t41085.0\n8143\t-84.477528\t39.101163\tBellevue city\tKY\tKentucky\tCampbell County\t5908\t36.2\t15.5\t15.3\t25044\t87490\t0.3753\t41073\tRomney\t41073\t0.021085871000000003\t41073.0\n8144\t-84.37195600000001\t39.030358\tMelbourne city\tKY\tKentucky\tCampbell County\t438\t35.9\t25.1\t10.7\t22663\t122500\t0.3753\t41059\tRomney\t41059\t0.0015632379999999998\t41059.0\n8145\t-84.245981\t38.889734000000004\tMentor city\tKY\tKentucky\tCampbell County\t179\t39.3\t16.8\t5.1\t24164\t116667\t0.3753\t41007\tRomney\t41007\t0.0006388580000000001\t41007.0\n8146\t-84.462593\t39.112009\tDayton city\tKY\tKentucky\tCampbell County\t5517\t33.4\t9.2\t18.0\t20320\t74589\t0.3753\t41074\tRomney\t41074\t0.019690377\t41074.0\n8147\t-84.406972\t38.921746999999996\tClaryville CDP\tKY\tKentucky\tCampbell County\t2713\t36.3\t15.4\t8.4\t27553\t125521\t0.3753\t41001\tRomney\t41001\t0.009682797\t41001.0\n8148\t-84.261524\t38.920555\tCalifornia city\tKY\tKentucky\tCampbell County\t85\t38.5\t16.4\t5.3\t24185\t112500\t0.3753\t41007\tRomney\t41007\t0.000303368\t41007.0\n8149\t-84.416205\t39.024213\tCrestview city\tKY\tKentucky\tCampbell County\t537\t41.6\t22.8\t6.9\t30834\t118462\t0.3753\t41076\tRomney\t41076\t0.001916573\t41076.0\n8150\t-84.449587\t39.080588\tFort Thomas city\tKY\tKentucky\tCampbell County\t15559\t40.6\t40.0\t8.7\t32094\t149215\t0.3753\t41075\tRomney\t41075\t0.055530647\t41075.0\n8151\t-84.454863\t39.035687\tHighland Heights city\tKY\tKentucky\tCampbell County\t6215\t39.7\t30.7\t11.0\t29858\t100343\t0.3753\t41076\tRomney\t41076\t0.022181565\t41076.0\n8152\t-89.011972\t36.790415\tArlington city\tKY\tKentucky\tCarlisle County\t392\t45.0\t4.2\t5.1\t19397\t53611\t0.2864\t42021\tRomney\t42021\t0.0013990629999999999\t42021.0\n8153\t-89.009204\t36.872780999999996\tBardwell city\tKY\tKentucky\tCarlisle County\t816\t44.2\t14.0\t7.8\t18098\t61296\t0.2864\t42023\tRomney\t42023\t0.0029123340000000004\t42023.0\n8154\t-85.193381\t38.679732\tPrestonville city\tKY\tKentucky\tCarroll County\t178\t38.8\t8.9\t15.0\t24574\t116667\t0.4427\t41008\tRomney\t41008\t0.000635289\t41008.0\n8155\t-85.164061\t38.679237\tCarrollton city\tKY\tKentucky\tCarroll County\t3920\t38.7\t11.1\t17.2\t19908\t100468\t0.4427\t41008\tRomney\t41008\t0.013990625\t41008.0\n8156\t-85.061398\t38.733987\tGhent city\tKY\tKentucky\tCarroll County\t372\t34.7\t14.7\t13.0\t18966\t96875\t0.4427\t41045\tRomney\t41045\t0.0013276820000000002\t41045.0\n8157\t-85.06818100000001\t38.609698\tWorthville city\tKY\tKentucky\tCarroll County\t217\t38.4\t6.8\t11.4\t18215\t52500\t0.4427\t41098\tRomney\t41098\t0.000774481\t41098.0\n8158\t-84.946744\t38.654839\tSanders city\tKY\tKentucky\tCarroll County\t257\t38.1\t7.9\t15.8\t19862\t63571\t0.4427\t41083\tRomney\t41083\t0.000917243\t41083.0\n8159\t-82.951289\t38.33485\tGrayson city\tKY\tKentucky\tCarter County\t3758\t34.5\t18.1\t10.5\t17770\t81810\t0.3798\t41143\tRomney\t41143\t0.013412441\t41143.0\n8160\t-83.168768\t38.303533\tOlive Hill city\tKY\tKentucky\tCarter County\t1818\t40.5\t13.2\t15.6\t14451\t64237\t0.3798\t41164\tRomney\t41164\t0.006488509\t41164.0\n8161\t-84.929401\t37.319183\tLiberty city\tKY\tKentucky\tCasey County\t1955\t45.4\t11.5\t14.7\t15380\t72283\t0.1783\t42539\tRomney\t42539\t0.006977466999999999\t42539.0\n8162\t-87.483494\t36.843709999999994\tHopkinsville city\tKY\tKentucky\tChristian County\t32468\t37.3\t19.4\t12.7\t20384\t110193\t0.3759\t42240\tRomney\t42240\t0.11587949300000001\t42240.0\n8163\t-87.42408\t36.668935\tOak Grove city\tKY\tKentucky\tChristian County\t8714\t23.6\t11.6\t19.8\t15675\t97954\t0.3759\t42262\tRomney\t42262\t0.031100588\t42262.0\n8164\t-87.484183\t37.047832\tCrofton city\tKY\tKentucky\tChristian County\t939\t39.2\t9.4\t13.2\t15816\t70833\t0.3759\t42217\tRomney\t42217\t0.003351326\t42217.0\n8165\t-87.46056899999999\t36.654289\tFort Campbell North CDP\tKY\tKentucky\tChristian County\t14685\t21.8\t6.1\t30.6\t11911\t141667\t0.3759\t42223\tRomney\t42223\t0.052411308\t42223.0\n8166\t-87.658935\t36.660154999999996\tLaFayette city\tKY\tKentucky\tChristian County\t217\t36.3\t13.0\t10.0\t21300\t100000\t0.3759\t42254\tRomney\t42254\t0.000774481\t42254.0\n8167\t-87.356783\t36.775419\tPembroke city\tKY\tKentucky\tChristian County\t923\t39.9\t16.3\t10.8\t16075\t111250\t0.3759\t42266\tRomney\t42266\t0.003294221\t42266.0\n8168\t-84.189246\t37.999798999999996\tWinchester city\tKY\tKentucky\tClark County\t18138\t38.0\t16.5\t13.2\t21510\t102780\t0.3391\t40391\tRomney\t40391\t0.064735193\t40391.0\n8169\t-83.771725\t37.151264000000005\tManchester city\tKY\tKentucky\tClay County\t2017\t39.8\t20.1\t11.8\t14956\t65000\t0.1505\t40962\tRomney\t40962\t0.0071987480000000005\t40962.0\n8170\t-85.133026\t36.693389\tAlbany city\tKY\tKentucky\tClinton County\t2228\t41.9\t8.4\t9.7\t14436\t54808\t0.1712\t42602\tRomney\t42602\t0.007951814\t42602.0\n8171\t-88.184588\t37.160214\tDycusburg city\tKY\tKentucky\tCrittenden County\t39\t49.2\t13.8\t16.7\t15968\t50000\t0.2491\t42083\tRomney\t42083\t0.000139192\t42083.0\n8172\t-88.07987\t37.331298\tMarion city\tKY\tKentucky\tCrittenden County\t3071\t44.5\t12.0\t12.5\t17662\t63252\t0.2491\t42064\tRomney\t42064\t0.010960513\t42064.0\n8173\t-85.370278\t36.794309000000005\tBurkesville city\tKY\tKentucky\tCumberland County\t1757\t44.3\t8.8\t12.9\t14730\t55341\t0.2099\t42717\tRomney\t42717\t0.006270798\t42717.0\n8174\t-87.046182\t37.671772999999995\tMasonville CDP\tKY\tKentucky\tDaviess County\t1084\t36.7\t13.3\t7.9\t21185\t97286\t0.3851\t42376\tRomney\t42376\t0.0038688359999999996\t42376.0\n8175\t-86.869488\t37.683782\tWhitesville city\tKY\tKentucky\tDaviess County\t687\t36.4\t11.8\t9.3\t16652\t89600\t0.3851\t42378\tRomney\t42378\t0.002451928\t42378.0\n8176\t-87.117906\t37.758557\tOwensboro city\tKY\tKentucky\tDaviess County\t55550\t38.4\t21.4\t10.8\t23684\t97205\t0.3851\t42303\tRomney\t42303\t0.198260005\t42303.0\n8177\t-86.262059\t37.188276\tBrownsville city\tKY\tKentucky\tEdmonson County\t941\t43.9\t9.3\t12.7\t14614\t73158\t0.2943\t42210\tRomney\t42210\t0.0033584640000000002\t42210.0\n8178\t-83.124077\t38.092883\tSandy Hook city\tKY\tKentucky\tElliott County\t729\t40.1\t9.6\t19.5\t12704\t68571\t0.4944\t41171\tRomney\t41171\t0.002601828\t41171.0\n8179\t-83.9495\t37.687631\tRavenna city\tKY\tKentucky\tEstill County\t620\t42.6\t14.3\t10.2\t16568\t58452\t0.2616\t40336\tRomney\t40336\t0.0022128029999999997\t40336.0\n8180\t-83.968225\t37.698428\tIrvine city\tKY\tKentucky\tEstill County\t2723\t41.9\t9.4\t11.6\t14082\t54115\t0.2616\t40336\tRomney\t40336\t0.009718488\t40336.0\n8181\t-84.458713\t38.042295\tLexington-Fayette\tKY\tKentucky\tFayette County\t287934\t35.0\t39.7\t8.9\t29786\t149265\t0.4932\t40505\tRomney\t40505\t1.027647099\t40505.0\n8182\t-83.73899899999999\t38.422069\tFlemingsburg city\tKY\tKentucky\tFleming County\t2942\t40.6\t13.7\t14.9\t18905\t80431\t0.3305\t41041\tRomney\t41041\t0.010500107\t41041.0\n8183\t-83.863489\t38.427565\tEwing city\tKY\tKentucky\tFleming County\t250\t39.2\t10.2\t20.2\t13991\t83333\t0.3305\t41039\tRomney\t41039\t0.000892259\t41039.0\n8184\t-82.72865\t37.611208000000005\tAllen city\tKY\tKentucky\tFloyd County\t148\t42.5\t15.9\t12.1\t17861\t60000\t0.3179\t41601\tRomney\t41601\t0.000528217\t41601.0\n8185\t-82.757559\t37.570027\tMartin city\tKY\tKentucky\tFloyd County\t636\t42.5\t14.8\t20.5\t14310\t61000\t0.3179\t41649\tRomney\t41649\t0.0022699079999999997\t41649.0\n8186\t-82.799252\t37.447390999999996\tWayland city\tKY\tKentucky\tFloyd County\t292\t39.7\t8.0\t13.6\t14075\t46563\t0.3179\t41666\tRomney\t41666\t0.001042159\t41666.0\n8187\t-82.7187\t37.33887\tWheelwright city\tKY\tKentucky\tFloyd County\t1023\t34.1\t5.3\t12.6\t11606\t41429\t0.3179\t41669\tRomney\t41669\t0.003651125\t41669.0\n8188\t-82.751989\t37.688373999999996\tPrestonsburg city\tKY\tKentucky\tFloyd County\t3447\t45.3\t23.2\t13.6\t19839\t87857\t0.3179\t41653\tRomney\t41653\t0.012302471\t41653.0\n8189\t-84.865565\t38.191853\tFrankfort city\tKY\tKentucky\tFranklin County\t27525\t38.6\t30.5\t11.1\t27136\t115301\t0.4943\t40601\tRomney\t40601\t0.098237743\t40601.0\n8190\t-88.881384\t36.513356\tFulton city\tKY\tKentucky\tFulton County\t2435\t41.7\t16.9\t18.9\t21988\t55278\t0.4119\t42041\tRomney\t42041\t0.008690605\t42041.0\n8191\t-89.182887\t36.564859000000006\tHickman city\tKY\tKentucky\tFulton County\t2262\t38.7\t11.0\t20.5\t14425\t50000\t0.4119\t42050\tRomney\t42050\t0.008073162\t42050.0\n8192\t-84.822261\t38.71119\tGlencoe city\tKY\tKentucky\tGallatin County\t238\t35.6\t4.7\t14.2\t18660\t97857\t0.4044\t41046\tRomney\t41046\t0.0008494310000000001\t41046.0\n8193\t-84.895679\t38.784789\tWarsaw city\tKY\tKentucky\tGallatin County\t1849\t39.4\t10.1\t10.5\t18815\t105873\t0.4044\t41095\tRomney\t41095\t0.006599149\t41095.0\n8194\t-84.901025\t38.701254999999996\tSparta city\tKY\tKentucky\tGallatin County\t222\t37.0\t7.1\t12.9\t19068\t100000\t0.4044\t41086\tRomney\t41086\t0.0007923260000000001\t41086.0\n8195\t-84.580586\t37.616561\tLancaster city\tKY\tKentucky\tGarrard County\t3703\t41.5\t14.9\t14.6\t21475\t108761\t0.2347\t40444\tRomney\t40444\t0.013216143999999999\t40444.0\n8196\t-84.55671099999999\t38.49588\tCorinth city\tKY\tKentucky\tGrant County\t237\t33.4\t2.1\t13.8\t16665\t72143\t0.3264\t41010\tRomney\t41010\t0.000845862\t41010.0\n8197\t-84.600249\t38.677169\tDry Ridge city\tKY\tKentucky\tGrant County\t2297\t33.0\t16.1\t12.8\t22622\t113056\t0.3264\t41035\tRomney\t41035\t0.008198078000000001\t41035.0\n8198\t-84.606054\t38.782072\tCrittenden city\tKY\tKentucky\tGrant County\t3029\t31.1\t14.0\t10.0\t21425\t108043\t0.3264\t41030\tRomney\t41030\t0.010810613\t41030.0\n8199\t-84.504468\t38.668464\tWilliamstown city\tKY\tKentucky\tGrant County\t3411\t36.9\t14.4\t10.4\t20716\t100550\t0.3264\t41097\tRomney\t41097\t0.012173985\t41097.0\n8200\t-88.738077\t36.641548\tWingo city\tKY\tKentucky\tGraves County\t602\t39.4\t12.3\t9.8\t20521\t78846\t0.2933\t42088\tRomney\t42088\t0.00214856\t42088.0\n8201\t-88.64576\t36.736502\tMayfield city\tKY\tKentucky\tGraves County\t10265\t39.5\t20.4\t14.1\t17979\t75023\t0.2933\t42066\tRomney\t42066\t0.036636165\t42066.0\n8202\t-88.810746\t36.568922\tWater Valley city\tKY\tKentucky\tGraves County\t314\t42.0\t7.7\t13.1\t14274\t62308\t0.2933\t42085\tRomney\t42085\t0.001120678\t42085.0\n8203\t-86.285501\t37.484294\tLeitchfield city\tKY\tKentucky\tGrayson County\t6270\t37.7\t12.9\t18.1\t17847\t90597\t0.29600000000000004\t42754\tRomney\t42754\t0.022377862000000002\t42754.0\n8204\t-86.490066\t37.424299\tCaneyville city\tKY\tKentucky\tGrayson County\t661\t38.9\t8.7\t19.5\t14955\t72917\t0.29600000000000004\t42721\tRomney\t42721\t0.002359133\t42721.0\n8205\t-86.220867\t37.494525\tClarkson city\tKY\tKentucky\tGrayson County\t828\t38.2\t8.8\t11.2\t19748\t78250\t0.29600000000000004\t42726\tRomney\t42726\t0.002955163\t42726.0\n8206\t-85.495437\t37.257844\tGreensburg city\tKY\tKentucky\tGreen County\t2219\t45.0\t17.2\t12.2\t15582\t68305\t0.2399\t42743\tRomney\t42743\t0.007919693\t42743.0\n8207\t-82.829915\t38.572804999999995\tGreenup city\tKY\tKentucky\tGreenup County\t1136\t41.1\t22.1\t9.7\t20987\t85385\t0.3973\t41144\tRomney\t41144\t0.004054426\t41144.0\n8208\t-82.735365\t38.550928000000006\tWorthington city\tKY\tKentucky\tGreenup County\t1717\t44.5\t11.7\t8.4\t19090\t80000\t0.3973\t41183\tRomney\t41183\t0.006128036999999999\t41183.0\n8209\t-82.734259\t38.537136\tRaceland city\tKY\tKentucky\tGreenup County\t2296\t40.6\t15.2\t7.9\t20036\t89016\t0.3973\t41183\tRomney\t41183\t0.008194509\t41183.0\n8210\t-82.689468\t38.496798999999996\tBellefonte city\tKY\tKentucky\tGreenup County\t1092\t51.4\t41.7\t6.9\t42012\t198093\t0.3973\t41139\tRomney\t41139\t0.003897388\t41139.0\n8211\t-82.963882\t38.722297999999995\tSouth Shore city\tKY\tKentucky\tGreenup County\t1272\t41.9\t8.2\t11.2\t16297\t65000\t0.3973\t41175\tRomney\t41175\t0.004539815\t41175.0\n8212\t-82.701257\t38.509119\tRussell city\tKY\tKentucky\tGreenup County\t3890\t46.9\t28.0\t6.3\t30161\t128943\t0.3973\t41139\tRomney\t41139\t0.013883554\t41139.0\n8213\t-82.729197\t38.521138\tFlatwoods city\tKY\tKentucky\tGreenup County\t7430\t43.6\t12.7\t8.9\t20214\t86102\t0.3973\t41139\tRomney\t41139\t0.026517945\t41139.0\n8214\t-82.775044\t38.549887\tWurtland city\tKY\tKentucky\tGreenup County\t1019\t48.1\t14.7\t9.9\t19075\t80294\t0.3973\t41183\tRomney\t41183\t0.003636849\t41183.0\n8215\t-86.75468199999999\t37.897461\tHawesville city\tKY\tKentucky\tHancock County\t1008\t39.5\t10.4\t7.5\t20899\t92000\t0.4434\t42348\tRomney\t42348\t0.0035975890000000004\t42348.0\n8216\t-86.902935\t37.930828999999996\tLewisport city\tKY\tKentucky\tHancock County\t1645\t36.2\t10.4\t14.3\t21582\t79340\t0.4434\t42351\tRomney\t42351\t0.0058710659999999994\t42351.0\n8217\t-85.890529\t37.462843\tUpton city\tKY\tKentucky\tHardin County\t696\t38.8\t15.0\t11.4\t16506\t82500\t0.3879\t42784\tRomney\t42784\t0.00248405\t42784.0\n8218\t-85.94852\t37.893262\tFort Knox CDP\tKY\tKentucky\tHardin County\t11383\t22.0\t24.0\t24.1\t12709\t105556\t0.3879\t40121\tRomney\t40121\t0.040626348\t40121.0\n8219\t-85.937768\t37.822649\tRadcliff city\tKY\tKentucky\tHardin County\t22928\t34.1\t16.3\t13.5\t24051\t111587\t0.3879\t40160\tRomney\t40160\t0.08183088\t40160.0\n8220\t-85.955937\t37.985005\tWest Point city\tKY\tKentucky\tHardin County\t934\t35.8\t7.2\t14.9\t15029\t59130\t0.3879\t40177\tRomney\t40177\t0.0033334809999999997\t40177.0\n8221\t-85.89303000000001\t37.525923\tSonora city\tKY\tKentucky\tHardin County\t454\t35.9\t12.8\t9.8\t17494\t93125\t0.3879\t42776\tRomney\t42776\t0.0016203429999999998\t42776.0\n8222\t-85.98101700000001\t37.812987\tVine Grove city\tKY\tKentucky\tHardin County\t4799\t40.5\t17.0\t8.5\t25110\t114433\t0.3879\t40175\tRomney\t40175\t0.017127809\t40175.0\n8223\t-85.87403\t37.702886\tElizabethtown city\tKY\tKentucky\tHardin County\t24462\t37.8\t24.2\t10.3\t25071\t139409\t0.3879\t42701\tRomney\t42701\t0.08730578300000001\t42701.0\n8224\t-83.32628299999999\t36.838608\tHarlan city\tKY\tKentucky\tHarlan County\t1934\t47.1\t24.3\t16.6\t17391\t85833\t0.1717\t40831\tRomney\t40831\t0.006902518000000001\t40831.0\n8225\t-83.350893\t36.852808\tLoyall city\tKY\tKentucky\tHarlan County\t673\t43.1\t21.7\t13.5\t16879\t65000\t0.1717\t40854\tRomney\t40854\t0.002401962\t40854.0\n8226\t-82.913048\t36.965333\tLynch city\tKY\tKentucky\tHarlan County\t803\t46.5\t12.4\t19.3\t14108\t40000\t0.1717\t40855\tRomney\t40855\t0.0028659370000000003\t40855.0\n8227\t-83.404462\t36.815348\tSouth Wallins CDP\tKY\tKentucky\tHarlan County\t925\t39.0\t7.3\t13.0\t13632\t51912\t0.1717\t40873\tRomney\t40873\t0.0033013590000000002\t40873.0\n8228\t-83.197124\t36.863935\tEvarts city\tKY\tKentucky\tHarlan County\t1017\t40.4\t10.0\t22.0\t13844\t44394\t0.1717\t40828\tRomney\t40828\t0.003629711\t40828.0\n8229\t-82.956502\t36.965036\tBenham city\tKY\tKentucky\tHarlan County\t533\t46.5\t17.3\t16.6\t14741\t50800\t0.1717\t40807\tRomney\t40807\t0.001902297\t40807.0\n8230\t-83.414302\t36.827383000000005\tWallins Creek city\tKY\tKentucky\tHarlan County\t239\t39.3\t6.8\t16.5\t13148\t50000\t0.1717\t40873\tRomney\t40873\t0.0008529999999999999\t40873.0\n8231\t-82.986372\t36.983959999999996\tCumberland city\tKY\tKentucky\tHarlan County\t2360\t40.7\t12.0\t17.1\t13639\t52643\t0.1717\t40823\tRomney\t40823\t0.008422927\t40823.0\n8232\t-84.384226\t38.520787\tBerry city\tKY\tKentucky\tHarrison County\t316\t37.4\t2.9\t11.8\t17164\t85625\t0.345\t41003\tRomney\t41003\t0.001127816\t41003.0\n8233\t-84.300076\t38.385141\tCynthiana city\tKY\tKentucky\tHarrison County\t6035\t40.4\t14.4\t10.0\t20275\t98053\t0.345\t41031\tRomney\t41031\t0.021539138\t41031.0\n8234\t-85.900936\t37.377314\tBonnieville city\tKY\tKentucky\tHart County\t407\t41.2\t7.7\t12.1\t16155\t76667\t0.3448\t42713\tRomney\t42713\t0.0014525979999999998\t42713.0\n8235\t-85.912974\t37.169803\tHorse Cave city\tKY\tKentucky\tHart County\t2291\t41.3\t16.4\t15.5\t17865\t82639\t0.3448\t42749\tRomney\t42749\t0.008176664\t42749.0\n8236\t-85.89957\t37.279936\tMunfordville city\tKY\tKentucky\tHart County\t1655\t43.1\t11.0\t13.1\t16208\t80889\t0.3448\t42765\tRomney\t42765\t0.005906756\t42765.0\n8237\t-87.533089\t37.676987\tRobards city\tKY\tKentucky\tHenderson County\t611\t41.8\t10.2\t7.6\t21932\t97727\t0.4345\t42452\tRomney\t42452\t0.002180682\t42452.0\n8238\t-87.580426\t37.839436\tHenderson city\tKY\tKentucky\tHenderson County\t27743\t39.3\t17.4\t12.9\t22350\t90572\t0.4345\t42420\tRomney\t42420\t0.099015793\t42420.0\n8239\t-87.706322\t37.740231\tCorydon city\tKY\tKentucky\tHenderson County\t744\t38.1\t5.5\t16.3\t19710\t63571\t0.4345\t42406\tRomney\t42406\t0.0026553640000000003\t42406.0\n8240\t-85.177554\t38.36458\tEminence city\tKY\tKentucky\tHenry County\t2353\t37.4\t14.4\t14.5\t19764\t99052\t0.3839\t40019\tRomney\t40019\t0.008397944000000001\t40019.0\n8241\t-85.256801\t38.386697\tSmithfield city\tKY\tKentucky\tHenry County\t123\t40.0\t9.6\t8.2\t22326\t98333\t0.3839\t40068\tRomney\t40068\t0.000438992\t40068.0\n8242\t-85.206784\t38.526418\tCampbellsburg city\tKY\tKentucky\tHenry County\t794\t38.9\t14.4\t11.4\t19229\t105398\t0.3839\t40011\tRomney\t40011\t0.002833815\t40011.0\n8243\t-85.168233\t38.433265999999996\tNew Castle city\tKY\tKentucky\tHenry County\t1055\t44.1\t16.6\t12.4\t19437\t98523\t0.3839\t40058\tRomney\t40058\t0.0037653340000000004\t40058.0\n8244\t-85.112066\t38.352765999999995\tPleasureville city\tKY\tKentucky\tHenry County\t911\t39.4\t12.0\t8.4\t20645\t97258\t0.3839\t40057\tRomney\t40057\t0.003251393\t40057.0\n8245\t-88.993787\t36.666475\tClinton city\tKY\tKentucky\tHickman County\t1297\t45.0\t11.5\t11.6\t18779\t59342\t0.3207\t42031\tRomney\t42031\t0.0046290409999999995\t42031.0\n8246\t-89.101566\t36.759074\tColumbus city\tKY\tKentucky\tHickman County\t225\t40.4\t3.3\t6.4\t18680\t41250\t0.3207\t42032\tRomney\t42032\t0.000803033\t42032.0\n8247\t-87.55518000000001\t37.187616999999996\tSt. Charles city\tKY\tKentucky\tHopkins County\t321\t41.8\t4.9\t12.2\t12718\t45455\t0.2929\t42453\tRomney\t42453\t0.001145661\t42453.0\n8248\t-87.68781\t37.174058\tDawson Springs city\tKY\tKentucky\tHopkins County\t2893\t43.0\t9.0\t16.3\t15745\t52658\t0.2929\t42408\tRomney\t42408\t0.010325224000000001\t42408.0\n8249\t-87.476392\t37.417609999999996\tHanson city\tKY\tKentucky\tHopkins County\t677\t40.2\t20.4\t9.0\t22889\t89737\t0.2929\t42413\tRomney\t42413\t0.002416238\t42413.0\n8250\t-87.51495600000001\t37.273223\tEarlington city\tKY\tKentucky\tHopkins County\t1506\t41.6\t6.1\t17.1\t16152\t48298\t0.2929\t42410\tRomney\t42410\t0.00537497\t42410.0\n8251\t-87.471692\t37.237161\tMortons Gap city\tKY\tKentucky\tHopkins County\t938\t41.1\t8.8\t11.2\t15616\t49125\t0.2929\t42440\tRomney\t42440\t0.0033477570000000002\t42440.0\n8252\t-87.50345\t37.341539000000004\tMadisonville city\tKY\tKentucky\tHopkins County\t18938\t41.4\t15.9\t11.0\t22375\t78033\t0.2929\t42431\tRomney\t42431\t0.067590423\t42431.0\n8253\t-87.45636400000001\t37.186044\tNortonville city\tKY\tKentucky\tHopkins County\t1297\t40.1\t5.7\t14.2\t16508\t55545\t0.2929\t42442\tRomney\t42442\t0.0046290409999999995\t42442.0\n8254\t-87.382571\t37.171572999999995\tWhite Plains city\tKY\tKentucky\tHopkins County\t875\t38.1\t7.1\t13.4\t16314\t52143\t0.2929\t42464\tRomney\t42464\t0.0031229070000000003\t42464.0\n8255\t-87.641719\t37.383309999999994\tNebo city\tKY\tKentucky\tHopkins County\t216\t41.5\t8.7\t6.8\t14950\t65000\t0.2929\t42441\tRomney\t42441\t0.000770912\t42441.0\n8256\t-83.98796800000001\t37.430723\tMcKee city\tKY\tKentucky\tJackson County\t865\t36.4\t10.8\t14.8\t12502\t59524\t0.1209\t40447\tRomney\t40447\t0.003087217\t40447.0\n8257\t-83.96218499999999\t37.323147\tAnnville city\tKY\tKentucky\tJackson County\t684\t36.9\t10.6\t20.7\t12410\t65385\t0.1209\t40402\tRomney\t40402\t0.002441221\t40402.0\n8258\t-85.726849\t38.205057000000004\tAudubon Park city\tKY\tKentucky\tJefferson County\t1458\t43.7\t42.2\t9.7\t30656\t185119\t0.5483\t40217\tRomney\t40217\t0.005203656\t40217.0\n8259\t-85.610972\t38.252145\tNorwood city\tKY\tKentucky\tJefferson County\t394\t34.7\t49.3\t9.5\t29805\t150000\t0.5483\t40222\tRomney\t40222\t0.0014062010000000002\t40222.0\n8260\t-85.590938\t38.251078\tBellemeade city\tKY\tKentucky\tJefferson County\t1023\t51.0\t43.6\t10.7\t37018\t187065\t0.5483\t40222\tRomney\t40222\t0.003651125\t40222.0\n8261\t-85.600811\t38.298747999999996\tBarbourmeade city\tKY\tKentucky\tJefferson County\t1273\t48.5\t59.4\t8.9\t39225\t211161\t0.5483\t40241\tRomney\t40241\t0.004543384\t40241.0\n8262\t-85.5646\t38.243627000000004\tBlue Ridge Manor city\tKY\tKentucky\tJefferson County\t661\t49.7\t51.8\t11.8\t39872\t166981\t0.5483\t40223\tRomney\t40223\t0.002359133\t40223.0\n8263\t-85.642287\t38.241434000000005\tSpringlee city\tKY\tKentucky\tJefferson County\t425\t39.6\t65.4\t7.7\t33713\t166667\t0.5483\t40207\tRomney\t40207\t0.0015168410000000001\t40207.0\n8264\t-85.741682\t38.225355\tLouisville city\tKY\tKentucky\tJefferson County\t250754\t37.8\t24.4\t14.7\t22954\t100105\t0.5483\t40217\tRomney\t40217\t0.894950303\t40217.0\n8265\t-85.580761\t38.297591\tTen Broeck city\tKY\tKentucky\tJefferson County\t121\t39.3\t65.1\t6.8\t47700\t245455\t0.5483\t40241\tRomney\t40241\t0.00043185300000000005\t40241.0\n8266\t-85.659186\t38.260838\tBellewood city\tKY\tKentucky\tJefferson County\t290\t46.4\t46.9\t11.9\t39325\t164286\t0.5483\t40207\tRomney\t40207\t0.0010350210000000001\t40207.0\n8267\t-85.5766\t38.274485\tWhipps Millgate city\tKY\tKentucky\tJefferson County\t401\t40.2\t33.8\t9.4\t25955\t127696\t0.5483\t40242\tRomney\t40242\t0.0014311839999999998\t40242.0\n8268\t-85.631295\t38.143759\tSpring Mill city\tKY\tKentucky\tJefferson County\t459\t46.7\t28.4\t9.0\t30379\t151645\t0.5483\t40228\tRomney\t40228\t0.0016381879999999998\t40228.0\n8269\t-85.61273299999999\t38.28347\tBancroft city\tKY\tKentucky\tJefferson County\t530\t50.0\t63.4\t6.1\t43069\t220946\t0.5483\t40222\tRomney\t40222\t0.00189159\t40222.0\n8270\t-85.592013\t38.277978000000004\tBriarwood city\tKY\tKentucky\tJefferson County\t550\t42.1\t30.9\t8.1\t31184\t137981\t0.5483\t40242\tRomney\t40242\t0.00196297\t40242.0\n8271\t-85.541373\t38.308381\tFincastle city\tKY\tKentucky\tJefferson County\t828\t33.9\t35.4\t10.4\t31191\t160547\t0.5483\t40241\tRomney\t40241\t0.002955163\t40241.0\n8272\t-85.640647\t38.188906\tBuechel CDP\tKY\tKentucky\tJefferson County\t7678\t37.5\t23.6\t12.3\t25240\t110755\t0.5483\t40218\tRomney\t40218\t0.027403066\t40218.0\n8273\t-85.520299\t38.241594\tMiddletown city\tKY\tKentucky\tJefferson County\t7044\t42.1\t40.6\t7.0\t38088\t176963\t0.5483\t40243\tRomney\t40243\t0.025140297000000002\t40243.0\n8274\t-85.615612\t38.228983\tSt. Regis Park city\tKY\tKentucky\tJefferson County\t1535\t43.0\t48.1\t7.4\t34763\t177738\t0.5483\t40220\tRomney\t40220\t0.005478472\t40220.0\n8275\t-85.52580400000001\t38.314259\tColdstream city\tKY\tKentucky\tJefferson County\t1134\t32.9\t37.4\t9.2\t29963\t144301\t0.5483\t40056\tRomney\t40056\t0.004047288\t40056.0\n8276\t-85.669055\t38.28085\tIndian Hills city\tKY\tKentucky\tJefferson County\t2799\t50.8\t73.6\t7.5\t63085\t367038\t0.5483\t40207\tRomney\t40207\t0.009989735\t40207.0\n8277\t-85.59562199999999\t38.304258000000004\tBrownsboro Farm city\tKY\tKentucky\tJefferson County\t614\t50.4\t58.9\t10.3\t38384\t207353\t0.5483\t40241\tRomney\t40241\t0.0021913889999999998\t40241.0\n8278\t-85.66570300000001\t38.262851\tBrownsboro Village city\tKY\tKentucky\tJefferson County\t300\t45.1\t67.0\t10.9\t44583\t191379\t0.5483\t40207\tRomney\t40207\t0.001070711\t40207.0\n8279\t-85.68169300000001\t38.270263\tMockingbird Valley city\tKY\tKentucky\tJefferson County\t188\t49.2\t72.3\t8.5\t75129\t356250\t0.5483\t40206\tRomney\t40206\t0.0006709789999999999\t40206.0\n8280\t-85.613842\t38.316425\tGreen Spring city\tKY\tKentucky\tJefferson County\t894\t42.2\t68.3\t6.8\t50575\t263298\t0.5483\t40241\tRomney\t40241\t0.0031907190000000003\t40241.0\n8281\t-85.586923\t38.290731\tMurray Hill city\tKY\tKentucky\tJefferson County\t589\t45.7\t51.4\t8.6\t32056\t205224\t0.5483\t40242\tRomney\t40242\t0.0021021629999999998\t40242.0\n8282\t-85.579982\t38.272724\tMoorland city\tKY\tKentucky\tJefferson County\t452\t39.0\t34.4\t8.6\t25415\t122794\t0.5483\t40242\tRomney\t40242\t0.001613205\t40242.0\n8283\t-85.67707\t38.227424\tSeneca Gardens city\tKY\tKentucky\tJefferson County\t691\t47.2\t67.3\t8.0\t38308\t287500\t0.5483\t40205\tRomney\t40205\t0.002466205\t40205.0\n8284\t-85.651349\t38.241764\tBroad Fields city\tKY\tKentucky\tJefferson County\t241\t43.8\t53.9\t7.9\t31135\t187500\t0.5483\t40207\tRomney\t40207\t0.000860138\t40207.0\n8285\t-85.53645\t38.269032\tAnchorage city\tKY\tKentucky\tJefferson County\t2536\t42.7\t57.6\t7.6\t48433\t254221\t0.5483\t40223\tRomney\t40223\t0.009051078\t40223.0\n8286\t-85.624645\t38.300189\tHills and Dales city\tKY\tKentucky\tJefferson County\t180\t42.3\t68.4\t7.3\t50583\t261364\t0.5483\t40222\tRomney\t40222\t0.000642427\t40222.0\n8287\t-85.813689\t38.196825\tShively city\tKY\tKentucky\tJefferson County\t14811\t44.3\t10.0\t13.7\t23658\t104288\t0.5483\t40216\tRomney\t40216\t0.052861007\t40216.0\n8288\t-85.64663\t38.246674\tNorbourne Estates city\tKY\tKentucky\tJefferson County\t437\t42.7\t52.2\t6.2\t37632\t179464\t0.5483\t40207\tRomney\t40207\t0.0015596689999999999\t40207.0\n8289\t-85.630578\t38.261377\tWoodlawn Park city\tKY\tKentucky\tJefferson County\t994\t45.3\t44.9\t10.9\t30970\t171934\t0.5483\t40222\tRomney\t40222\t0.0035476229999999997\t40222.0\n8290\t-85.653177\t38.266628000000004\tMaryhill Estates city\tKY\tKentucky\tJefferson County\t165\t48.9\t72.8\t4.8\t46307\t229545\t0.5483\t40207\tRomney\t40207\t0.000588891\t40207.0\n8291\t-85.629356\t38.279517999999996\tCrossgate city\tKY\tKentucky\tJefferson County\t234\t46.8\t58.7\t8.2\t35501\t192708\t0.5483\t40222\tRomney\t40222\t0.000835155\t40222.0\n8292\t-85.58971700000001\t38.263963000000004\tLyndon city\tKY\tKentucky\tJefferson County\t9625\t37.0\t42.9\t6.6\t32617\t161200\t0.5483\t40242\tRomney\t40242\t0.034351981000000004\t40242.0\n8293\t-85.616793\t38.221623\tCambridge city\tKY\tKentucky\tJefferson County\t186\t54.8\t34.9\t10.5\t28368\t152206\t0.5483\t40220\tRomney\t40220\t0.0006638410000000001\t40220.0\n8294\t-85.74686700000001\t38.092596\tHollyvilla city\tKY\tKentucky\tJefferson County\t465\t43.0\t4.5\t13.1\t18612\t99500\t0.5483\t40118\tRomney\t40118\t0.001659602\t40118.0\n8295\t-85.711051\t38.179229\tLynnview city\tKY\tKentucky\tJefferson County\t917\t43.3\t9.4\t7.3\t24826\t93926\t0.5483\t40213\tRomney\t40213\t0.003272807\t40213.0\n8296\t-85.572603\t38.2833\tMeadow Vale city\tKY\tKentucky\tJefferson County\t718\t44.6\t44.9\t8.4\t27971\t165882\t0.5483\t40242\tRomney\t40242\t0.002562569\t40242.0\n8297\t-85.598618\t38.158131\tFern Creek CDP\tKY\tKentucky\tJefferson County\t19464\t36.4\t24.4\t8.8\t28583\t141639\t0.5483\t40291\tRomney\t40291\t0.069467736\t40291.0\n8298\t-85.69288\t38.177808\tPoplar Hills city\tKY\tKentucky\tJefferson County\t378\t34.6\t16.8\t13.6\t26880\t103750\t0.5483\t40213\tRomney\t40213\t0.0013490960000000001\t40213.0\n8299\t-85.585728\t38.295491999999996\tBroeck Pointe city\tKY\tKentucky\tJefferson County\t380\t39.7\t65.5\t7.4\t47736\t247500\t0.5483\t40241\tRomney\t40241\t0.001356234\t40241.0\n8300\t-85.6611\t38.282837\tRiverwood city\tKY\tKentucky\tJefferson County\t450\t50.8\t75.8\t7.7\t66383\t400000\t0.5483\t40207\tRomney\t40207\t0.001606067\t40207.0\n8301\t-85.661771\t38.264922999999996\tDruid Hills city\tKY\tKentucky\tJefferson County\t300\t45.1\t67.0\t10.9\t44583\t191848\t0.5483\t40207\tRomney\t40207\t0.001070711\t40207.0\n8302\t-85.527064\t38.309160999999996\tWorthington Hills city\tKY\tKentucky\tJefferson County\t1573\t32.9\t37.3\t9.1\t29970\t144678\t0.5483\t40056\tRomney\t40056\t0.005614095\t40056.0\n8303\t-85.583911\t38.279627000000005\tWestwood city\tKY\tKentucky\tJefferson County\t607\t42.8\t43.3\t8.7\t29196\t163141\t0.5483\t40242\tRomney\t40242\t0.002166405\t40242.0\n8304\t-85.670862\t38.268951\tRolling Fields city\tKY\tKentucky\tJefferson County\t642\t46.8\t76.3\t7.9\t74632\t520833\t0.5483\t40207\tRomney\t40207\t0.002291322\t40207.0\n8305\t-85.583261\t38.215579\tForest Hills city\tKY\tKentucky\tJefferson County\t451\t43.1\t27.4\t7.8\t26463\t148958\t0.5483\t40220\tRomney\t40220\t0.001609636\t40220.0\n8306\t-85.654593\t38.26166\tCherrywood Village city\tKY\tKentucky\tJefferson County\t316\t40.2\t47.6\t12.5\t30372\t160577\t0.5483\t40207\tRomney\t40207\t0.001127816\t40207.0\n8307\t-85.593506\t38.283716999999996\tPlantation city\tKY\tKentucky\tJefferson County\t876\t42.9\t45.3\t7.2\t32497\t180682\t0.5483\t40242\tRomney\t40242\t0.0031264759999999996\t40242.0\n8308\t-85.686501\t38.195335\tWatterson Park city\tKY\tKentucky\tJefferson County\t941\t47.7\t11.8\t13.7\t19365\t97000\t0.5483\t40205\tRomney\t40205\t0.0033584640000000002\t40205.0\n8309\t-85.614242\t38.214985999999996\tHouston Acres city\tKY\tKentucky\tJefferson County\t527\t34.4\t34.2\t8.6\t26984\t158712\t0.5483\t40220\tRomney\t40220\t0.0018808820000000002\t40220.0\n8310\t-85.737886\t38.211134\tParkway Village city\tKY\tKentucky\tJefferson County\t682\t44.0\t20.9\t8.2\t23473\t119331\t0.5483\t40217\tRomney\t40217\t0.002434083\t40217.0\n8311\t-85.589185\t38.23792\tHurstbourne city\tKY\tKentucky\tJefferson County\t3712\t52.4\t53.9\t7.2\t53727\t306762\t0.5483\t40222\tRomney\t40222\t0.013248265\t40222.0\n8312\t-85.667247\t38.195343\tWest Buechel city\tKY\tKentucky\tJefferson County\t1343\t30.0\t17.8\t9.5\t18884\t76400\t0.5483\t40218\tRomney\t40218\t0.004793217\t40218.0\n8313\t-85.57417099999999\t38.248899\tWildwood city\tKY\tKentucky\tJefferson County\t244\t46.8\t61.2\t6.3\t42699\t216071\t0.5483\t40223\tRomney\t40223\t0.000870845\t40223.0\n8314\t-85.561022\t38.246777\tSycamore city\tKY\tKentucky\tJefferson County\t159\t47.3\t48.4\t10.3\t38318\t144643\t0.5483\t40223\tRomney\t40223\t0.0005674769999999999\t40223.0\n8315\t-85.63768\t38.249689000000004\tSt. Matthews city\tKY\tKentucky\tJefferson County\t15851\t38.4\t49.7\t9.4\t33193\t166278\t0.5483\t40207\tRomney\t40207\t0.056572805\t40207.0\n8316\t-85.587159\t38.298264\tManor Creek city\tKY\tKentucky\tJefferson County\t191\t39.2\t65.2\t7.4\t47726\t247059\t0.5483\t40241\tRomney\t40241\t0.000681686\t40241.0\n8317\t-85.672545\t38.221687\tKingsley city\tKY\tKentucky\tJefferson County\t417\t43.3\t60.8\t7.9\t32541\t194079\t0.5483\t40205\tRomney\t40205\t0.001488288\t40205.0\n8318\t-85.617171\t38.273344\tGraymoor-Devondale city\tKY\tKentucky\tJefferson County\t2862\t46.8\t51.0\t7.6\t32229\t183979\t0.5483\t40222\tRomney\t40222\t0.010214584\t40222.0\n8319\t-85.637787\t38.270258\tWindy Hills city\tKY\tKentucky\tJefferson County\t2363\t50.1\t53.7\t7.6\t36232\t187967\t0.5483\t40207\tRomney\t40207\t0.008433634\t40207.0\n8320\t-85.728615\t38.123971000000004\tMinor Lane Heights city\tKY\tKentucky\tJefferson County\t1791\t40.2\t16.1\t11.6\t24598\t94118\t0.5483\t40118\tRomney\t40118\t0.006392145\t40118.0\n8321\t-85.855071\t38.151969\tPleasure Ridge Park CDP\tKY\tKentucky\tJefferson County\t26770\t39.9\t10.7\t11.4\t25322\t112254\t0.5483\t40258\tRomney\t40258\t0.09554312\t40258.0\n8322\t-85.634586\t38.249118\tFairmeade city\tKY\tKentucky\tJefferson County\t317\t34.2\t55.1\t7.7\t36890\t171875\t0.5483\t40207\tRomney\t40207\t0.001131385\t40207.0\n8323\t-85.528459\t38.239559\tWoodland Hills city\tKY\tKentucky\tJefferson County\t669\t42.7\t35.5\t7.5\t34761\t155000\t0.5483\t40243\tRomney\t40243\t0.002387686\t40243.0\n8324\t-85.85897\t38.105024\tValley Station CDP\tKY\tKentucky\tJefferson County\t23093\t38.8\t11.3\t11.2\t24597\t108739\t0.5483\t40272\tRomney\t40272\t0.082419771\t40272.0\n8325\t-85.649695\t38.240479\tPlymouth Village city\tKY\tKentucky\tJefferson County\t195\t44.5\t54.5\t6.9\t31066\t187500\t0.5483\t40207\tRomney\t40207\t0.000695962\t40207.0\n8326\t-85.569304\t38.291632\tCreekside city\tKY\tKentucky\tJefferson County\t320\t39.7\t65.5\t7.6\t47740\t249138\t0.5483\t40241\tRomney\t40241\t0.001142092\t40241.0\n8327\t-85.638548\t38.141444\tHighview CDP\tKY\tKentucky\tJefferson County\t17160\t40.8\t18.8\t9.7\t28983\t137637\t0.5483\t40228\tRomney\t40228\t0.061244675\t40228.0\n8328\t-85.612939\t38.289678\tOld Brownsboro Place city\tKY\tKentucky\tJefferson County\t398\t50.1\t67.3\t5.0\t50941\t244776\t0.5483\t40222\tRomney\t40222\t0.001420477\t40222.0\n8329\t-85.590655\t38.293328\tGoose Creek city\tKY\tKentucky\tJefferson County\t262\t50.0\t57.0\t7.2\t34420\t211735\t0.5483\t40241\tRomney\t40241\t0.000935088\t40241.0\n8330\t-85.567493\t38.275719\tKeeneland city\tKY\tKentucky\tJefferson County\t366\t38.3\t33.1\t9.4\t24391\t130952\t0.5483\t40223\tRomney\t40223\t0.001306268\t40223.0\n8331\t-85.636143\t38.285743\tNorthfield city\tKY\tKentucky\tJefferson County\t950\t51.7\t62.8\t6.3\t45572\t296875\t0.5483\t40222\tRomney\t40222\t0.003390585\t40222.0\n8332\t-85.61097\t38.297076000000004\tSpring Valley city\tKY\tKentucky\tJefferson County\t650\t43.9\t62.5\t7.6\t44291\t225714\t0.5483\t40242\tRomney\t40242\t0.002319874\t40242.0\n8333\t-85.758818\t38.110473999999996\tFairdale CDP\tKY\tKentucky\tJefferson County\t7940\t34.7\t6.0\t10.3\t21297\t78243\t0.5483\t40118\tRomney\t40118\t0.028338153999999997\t40118.0\n8334\t-85.624581\t38.152552\tHollow Creek city\tKY\tKentucky\tJefferson County\t852\t45.2\t29.5\t9.1\t30779\t156329\t0.5483\t40228\tRomney\t40228\t0.00304082\t40228.0\n8335\t-85.578262\t38.282340000000005\tRolling Hills city\tKY\tKentucky\tJefferson County\t884\t43.5\t46.0\t8.7\t28470\t167385\t0.5483\t40242\tRomney\t40242\t0.003155029\t40242.0\n8336\t-85.57484699999999\t38.278251000000004\tMeadowbrook Farm city\tKY\tKentucky\tJefferson County\t140\t38.5\t33.0\t9.4\t24305\t131250\t0.5483\t40242\tRomney\t40242\t0.000499665\t40242.0\n8337\t-85.641113\t38.254743\tRichlawn city\tKY\tKentucky\tJefferson County\t433\t40.0\t49.8\t9.8\t32600\t158333\t0.5483\t40207\tRomney\t40207\t0.001545393\t40207.0\n8338\t-85.550062\t38.236877\tDouglass Hills city\tKY\tKentucky\tJefferson County\t5809\t46.0\t49.1\t7.0\t38294\t196012\t0.5483\t40243\tRomney\t40243\t0.020732536\t40243.0\n8339\t-85.720148\t38.118237\tSouth Park View city\tKY\tKentucky\tJefferson County\t146\t33.4\t5.5\t14.3\t15374\t70000\t0.5483\t40118\tRomney\t40118\t0.000521079\t40118.0\n8340\t-85.844525\t38.188749\tSt. Dennis CDP\tKY\tKentucky\tJefferson County\t8875\t38.8\t6.9\t16.5\t21779\t97293\t0.5483\t40216\tRomney\t40216\t0.031675203\t40216.0\n8341\t-85.67768000000001\t38.220695\tStrathmoor Village city\tKY\tKentucky\tJefferson County\t609\t43.1\t60.7\t7.8\t32536\t194091\t0.5483\t40205\tRomney\t40205\t0.002173544\t40205.0\n8342\t-85.59089\t38.220022\tHurstbourne Acres city\tKY\tKentucky\tJefferson County\t1471\t38.8\t50.6\t9.0\t40085\t175426\t0.5483\t40220\tRomney\t40220\t0.005250053\t40220.0\n8343\t-85.68383299999999\t38.218971\tStrathmoor Manor city\tKY\tKentucky\tJefferson County\t324\t43.4\t61.0\t7.0\t33081\t191500\t0.5483\t40205\tRomney\t40205\t0.001156368\t40205.0\n8344\t-85.629715\t38.255384\tBeechwood Village city\tKY\tKentucky\tJefferson County\t1133\t47.9\t49.8\t9.6\t31329\t158764\t0.5483\t40222\tRomney\t40222\t0.004043719\t40222.0\n8345\t-85.587115\t38.355140000000006\tProspect city\tKY\tKentucky\tJefferson County\t4956\t47.5\t68.4\t7.2\t61012\t323684\t0.5483\t40059\tRomney\t40059\t0.017688146999999998\t40059.0\n8346\t-85.585034\t38.286649\tLangdon Place city\tKY\tKentucky\tJefferson County\t933\t37.2\t41.5\t8.5\t30027\t178125\t0.5483\t40242\tRomney\t40242\t0.003329912\t40242.0\n8347\t-85.625671\t38.28824\tThornhill city\tKY\tKentucky\tJefferson County\t170\t43.1\t63.0\t7.1\t44376\t229545\t0.5483\t40222\tRomney\t40222\t0.000606736\t40222.0\n8348\t-85.63322099999999\t38.29075\tGlenview Manor city\tKY\tKentucky\tJefferson County\t187\t53.0\t62.4\t6.6\t45827\t303125\t0.5483\t40222\tRomney\t40222\t0.00066741\t40222.0\n8349\t-85.621501\t38.223653999999996\tLincolnshire city\tKY\tKentucky\tJefferson County\t149\t54.8\t34.7\t9.8\t28391\t154167\t0.5483\t40220\tRomney\t40220\t0.0005317869999999999\t40220.0\n8350\t-85.638339\t38.295198\tGlenview Hills city\tKY\tKentucky\tJefferson County\t326\t51.3\t80.7\t16.3\t65072\t393333\t0.5483\t40222\tRomney\t40222\t0.0011635060000000001\t40222.0\n8351\t-85.651735\t38.302291\tGlenview city\tKY\tKentucky\tJefferson County\t591\t54.7\t65.3\t12.5\t83065\t322727\t0.5483\t40207\tRomney\t40207\t0.002109301\t40207.0\n8352\t-85.570051\t38.205304\tJeffersontown city\tKY\tKentucky\tJefferson County\t26979\t38.5\t35.9\t8.6\t30455\t154740\t0.5483\t40299\tRomney\t40299\t0.096289049\t40299.0\n8353\t-85.670326\t38.216633\tWellington city\tKY\tKentucky\tJefferson County\t540\t44.4\t52.8\t8.2\t36838\t179423\t0.5483\t40205\tRomney\t40205\t0.00192728\t40205.0\n8354\t-85.635795\t38.223237\tMeadowview Estates city\tKY\tKentucky\tJefferson County\t408\t43.7\t31.4\t7.5\t27340\t149479\t0.5483\t40220\tRomney\t40220\t0.0014561670000000002\t40220.0\n8355\t-85.685058\t38.139076\tOkolona CDP\tKY\tKentucky\tJefferson County\t19047\t38.0\t11.3\t12.0\t23471\t115966\t0.5483\t40219\tRomney\t40219\t0.067979448\t40219.0\n8356\t-85.69882199999999\t38.173176\tNewburg CDP\tKY\tKentucky\tJefferson County\t20959\t33.9\t10.3\t19.4\t19817\t92948\t0.5483\t40213\tRomney\t40213\t0.074803446\t40213.0\n8357\t-85.567723\t38.28733\tHickory Hill city\tKY\tKentucky\tJefferson County\t151\t51.9\t47.1\t10.5\t40518\t166667\t0.5483\t40242\tRomney\t40242\t0.000538925\t40242.0\n8358\t-84.575694\t37.882974\tNicholasville city\tKY\tKentucky\tJessamine County\t26066\t32.9\t18.3\t10.3\t22935\t140541\t0.2908\t40356\tRomney\t40356\t0.093030518\t40356.0\n8359\t-84.656841\t37.86873\tWilmore city\tKY\tKentucky\tJessamine County\t6150\t29.3\t51.1\t7.5\t19747\t172375\t0.2908\t40390\tRomney\t40390\t0.021949577999999997\t40390.0\n8360\t-82.81034\t37.81621\tPaintsville city\tKY\tKentucky\tJohnson County\t3914\t43.5\t19.6\t12.7\t18993\t89462\t0.1907\t41240\tRomney\t41240\t0.013969211\t41240.0\n8361\t-84.56962800000001\t39.024965\tCrestview Hills city\tKY\tKentucky\tKenton County\t3123\t41.9\t39.9\t12.6\t43331\t192293\t0.3681\t41017\tRomney\t41017\t0.011146103000000001\t41017.0\n8362\t-84.549544\t39.090516\tLudlow city\tKY\tKentucky\tKenton County\t4685\t35.0\t15.5\t9.6\t24725\t92000\t0.3681\t41016\tRomney\t41016\t0.016720938\t41016.0\n8363\t-84.45203199999999\t38.915822999999996\tVisalia city\tKY\tKentucky\tKenton County\t112\t40.6\t10.4\t6.0\t24711\t117857\t0.3681\t410HH\tRomney\t410HH\t0.000399732\t0.0\n8364\t-84.56703399999999\t39.034065000000005\tLakeside Park city\tKY\tKentucky\tKenton County\t2826\t37.2\t40.3\t11.6\t35027\t156250\t0.3681\t41017\tRomney\t41017\t0.010086099\t41017.0\n8365\t-84.592612\t39.010619\tErlanger city\tKY\tKentucky\tKenton County\t17536\t35.6\t23.3\t9.9\t28337\t120094\t0.3681\t41018\tRomney\t41018\t0.062586633\t41018.0\n8366\t-84.547608\t38.952259999999995\tIndependence city\tKY\tKentucky\tKenton County\t20020\t32.6\t22.9\t9.0\t26295\t134317\t0.3681\t41051\tRomney\t41051\t0.071452121\t41051.0\n8367\t-84.51986099999999\t39.051394\tKenton Vale city\tKY\tKentucky\tKenton County\t153\t43.1\t44.3\t12.1\t32072\t185000\t0.3681\t41014\tRomney\t41014\t0.0005460630000000001\t41014.0\n8368\t-84.560273\t39.008971\tEdgewood city\tKY\tKentucky\tKenton County\t9296\t40.8\t44.4\t7.8\t37566\t183269\t0.3681\t41017\tRomney\t41017\t0.033177767999999996\t41017.0\n8369\t-84.555927\t39.045863\tFort Mitchell city\tKY\tKentucky\tKenton County\t8157\t38.6\t45.0\t8.2\t38044\t179852\t0.3681\t41017\tRomney\t41017\t0.029112635\t41017.0\n8370\t-84.473959\t38.969015999999996\tRyland Heights city\tKY\tKentucky\tKenton County\t789\t43.9\t13.1\t9.4\t24340\t111786\t0.3681\t41015\tRomney\t41015\t0.00281597\t41015.0\n8371\t-84.561959\t39.080782\tBromley city\tKY\tKentucky\tKenton County\t831\t36.5\t12.6\t16.4\t19631\t72619\t0.3681\t41016\tRomney\t41016\t0.00296587\t41016.0\n8372\t-84.536028\t39.046341999999996\tFort Wright city\tKY\tKentucky\tKenton County\t5651\t42.4\t40.1\t7.4\t35215\t165588\t0.3681\t41011\tRomney\t41011\t0.020168628\t41011.0\n8373\t-84.60158100000001\t38.995123\tElsmere city\tKY\tKentucky\tKenton County\t8073\t33.8\t14.9\t8.7\t25113\t100389\t0.3681\t41018\tRomney\t41018\t0.028812836\t41018.0\n8374\t-84.51655600000001\t39.033266\tCovington city\tKY\tKentucky\tKenton County\t42744\t35.0\t18.0\t15.6\t23698\t90701\t0.3681\t41015\tRomney\t41015\t0.15255491699999998\t41015.0\n8375\t-84.531265\t39.069278999999995\tPark Hills city\tKY\tKentucky\tKenton County\t3142\t40.9\t49.2\t7.4\t38239\t166720\t0.3681\t41011\tRomney\t41011\t0.011213913999999998\t41011.0\n8376\t-84.579376\t39.054739\tCrescent Springs city\tKY\tKentucky\tKenton County\t4060\t36.8\t43.1\t9.2\t41321\t193926\t0.3681\t41017\tRomney\t41017\t0.01449029\t41017.0\n8377\t-84.59427099999999\t39.065764\tVilla Hills city\tKY\tKentucky\tKenton County\t8146\t39.7\t45.1\t8.8\t40115\t179818\t0.3681\t41017\tRomney\t41017\t0.029073375\t41017.0\n8378\t-84.49747099999999\t38.967967\tLatonia Lakes city\tKY\tKentucky\tKenton County\t363\t43.1\t2.3\t13.6\t20962\t94286\t0.3681\t41015\tRomney\t41015\t0.00129556\t41015.0\n8379\t-84.48526600000001\t38.997428\tFairview city\tKY\tKentucky\tKenton County\t157\t41.3\t17.9\t8.8\t24730\t116176\t0.3681\t41015\tRomney\t41015\t0.000560339\t41015.0\n8380\t-84.498426\t39.00911\tTaylor Mill city\tKY\tKentucky\tKenton County\t7393\t36.7\t31.6\t12.9\t30541\t137144\t0.3681\t41015\tRomney\t41015\t0.026385891\t41015.0\n8381\t-82.872586\t37.334564\tPippa Passes city\tKY\tKentucky\tKnott County\t290\t25.2\t30.3\t15.8\t14309\t55000\t0.2494\t41844\tRomney\t41844\t0.0010350210000000001\t41844.0\n8382\t-82.982915\t37.334853\tHindman city\tKY\tKentucky\tKnott County\t777\t41.8\t19.6\t18.1\t15206\t61667\t0.2494\t41822\tRomney\t41822\t0.002773142\t41822.0\n8383\t-83.882927\t36.86521\tBarbourville city\tKY\tKentucky\tKnox County\t4286\t36.7\t21.7\t12.2\t14340\t82500\t0.2238\t40906\tRomney\t40906\t0.015296893\t40906.0\n8384\t-85.734994\t37.567052000000004\tHodgenville city\tKY\tKentucky\tLarue County\t2822\t42.2\t13.9\t13.9\t20121\t83793\t0.3007\t42748\tRomney\t42748\t0.010071822\t42748.0\n8385\t-84.121184\t37.19233\tEast Bernstadt CDP\tKY\tKentucky\tLaurel County\t811\t40.8\t8.0\t13.4\t13792\t56818\t0.1743\t40729\tRomney\t40729\t0.002894489\t40729.0\n8386\t-84.083789\t36.965778\tNorth Corbin CDP\tKY\tKentucky\tLaurel County\t1628\t39.1\t8.4\t13.0\t16062\t62283\t0.1743\t40701\tRomney\t40701\t0.005810391999999999\t40701.0\n8387\t-84.081854\t37.127186\tLondon city\tKY\tKentucky\tLaurel County\t5653\t42.0\t20.0\t12.1\t19310\t95677\t0.1743\t40741\tRomney\t40741\t0.020175766\t40741.0\n8388\t-82.853851\t38.026094\tBlaine city\tKY\tKentucky\tLawrence County\t235\t36.9\t6.4\t20.5\t10523\t51667\t0.2718\t41124\tRomney\t41124\t0.0008387239999999999\t41124.0\n8389\t-82.60669\t38.115177\tLouisa city\tKY\tKentucky\tLawrence County\t2110\t42.7\t15.7\t13.8\t15459\t66410\t0.2718\t41230\tRomney\t41230\t0.007530668000000001\t41230.0\n8390\t-83.70689499999999\t37.582859\tBeattyville city\tKY\tKentucky\tLee County\t1083\t36.5\t7.5\t17.5\t14370\t63958\t0.2268\t41311\tRomney\t41311\t0.003865267\t41311.0\n8391\t-83.373525\t37.162037\tHyden city\tKY\tKentucky\tLeslie County\t189\t44.0\t10.9\t15.2\t13041\t53000\t0.0875\t41749\tRomney\t41749\t0.0006745480000000001\t41749.0\n8392\t-82.703834\t37.195046000000005\tFleming-Neon city\tKY\tKentucky\tLetcher County\t730\t41.5\t10.5\t10.3\t13273\t42833\t0.1943\t41840\tRomney\t41840\t0.002605397\t41840.0\n8393\t-82.668537\t37.213743\tMcRoberts CDP\tKY\tKentucky\tLetcher County\t799\t43.1\t4.1\t8.0\t12187\t45921\t0.1943\t41835\tRomney\t41835\t0.0028516609999999997\t41835.0\n8394\t-82.981525\t37.139168\tBlackey city\tKY\tKentucky\tLetcher County\t150\t40.9\t16.2\t10.5\t12831\t55000\t0.1943\t41804\tRomney\t41804\t0.000535356\t41804.0\n8395\t-82.642339\t37.183193\tJenkins city\tKY\tKentucky\tLetcher County\t2214\t43.3\t12.9\t12.0\t14316\t53817\t0.1943\t41537\tRomney\t41537\t0.007901848000000001\t41537.0\n8396\t-82.82509399999999\t37.118253\tWhitesburg city\tKY\tKentucky\tLetcher County\t1557\t46.6\t18.1\t9.4\t19462\t61731\t0.1943\t41858\tRomney\t41858\t0.005556991\t41858.0\n8397\t-83.320412\t38.593314\tVanceburg city\tKY\tKentucky\tLewis County\t1951\t39.4\t9.2\t21.6\t13344\t48226\t0.2814\t41179\tRomney\t41179\t0.006963191\t41179.0\n8398\t-83.491389\t38.687551\tConcord city\tKY\tKentucky\tLewis County\t26\t36.3\t5.6\t8.3\t13342\t50000\t0.2814\t41189\tRomney\t41189\t9.279999999999999e-05\t41189.0\n8399\t-84.81610400000001\t37.474245\tHustonville city\tKY\tKentucky\tLincoln County\t390\t44.4\t8.8\t14.1\t19409\t84167\t0.2821\t40437\tRomney\t40437\t0.001391924\t40437.0\n8400\t-84.661248\t37.534438\tStanford city\tKY\tKentucky\tLincoln County\t3608\t39.7\t21.8\t12.9\t19734\t95229\t0.2821\t40484\tRomney\t40484\t0.012877085\t40484.0\n8401\t-84.506671\t37.463015999999996\tCrab Orchard city\tKY\tKentucky\tLincoln County\t958\t37.8\t9.9\t11.6\t15014\t80208\t0.2821\t40419\tRomney\t40419\t0.003419137\t40419.0\n8402\t-88.403914\t37.137821\tSmithland city\tKY\tKentucky\tLivingston County\t427\t43.6\t10.4\t2.8\t18780\t78182\t0.2984\t42081\tRomney\t42081\t0.001523979\t42081.0\n8403\t-88.232314\t37.004908\tGrand Rivers city\tKY\tKentucky\tLivingston County\t356\t47.6\t9.9\t4.8\t20033\t66667\t0.2984\t42045\tRomney\t42045\t0.001270577\t42045.0\n8404\t-88.497506\t37.052108000000004\tLedbetter CDP\tKY\tKentucky\tLivingston County\t1627\t38.7\t6.5\t6.5\t20957\t83133\t0.2984\t42058\tRomney\t42058\t0.005806823000000001\t42058.0\n8405\t-88.37338299999999\t37.397734\tCarrsville city\tKY\tKentucky\tLivingston County\t60\t45.0\t6.8\t7.7\t18011\t50000\t0.2984\t42047\tRomney\t42047\t0.000214142\t42047.0\n8406\t-88.23962\t37.265681\tSalem city\tKY\tKentucky\tLivingston County\t750\t49.2\t8.0\t6.1\t20101\t63000\t0.2984\t42078\tRomney\t42078\t0.002676778\t42078.0\n8407\t-86.856803\t36.671375\tAdairville city\tKY\tKentucky\tLogan County\t1054\t39.5\t13.1\t8.9\t21412\t76724\t0.3301\t42202\tRomney\t42202\t0.003761765\t42202.0\n8408\t-86.89564\t36.839808000000005\tRussellville city\tKY\tKentucky\tLogan County\t7031\t40.5\t11.8\t11.9\t18836\t84541\t0.3301\t42276\tRomney\t42276\t0.025093899\t42276.0\n8409\t-86.950298\t36.986618\tLewisburg city\tKY\tKentucky\tLogan County\t898\t39.3\t6.3\t10.2\t16738\t69655\t0.3301\t42256\tRomney\t42256\t0.003204995\t42256.0\n8410\t-86.717413\t36.864584\tAuburn city\tKY\tKentucky\tLogan County\t1488\t37.1\t14.6\t8.6\t16898\t87500\t0.3301\t42206\tRomney\t42206\t0.0053107269999999995\t42206.0\n8411\t-88.077823\t37.075345\tEddyville city\tKY\tKentucky\tLyon County\t2502\t39.0\t9.9\t12.4\t17859\t88810\t0.3576\t42038\tRomney\t42038\t0.008929731\t42038.0\n8412\t-88.110664\t37.063428\tKuttawa city\tKY\tKentucky\tLyon County\t577\t55.5\t24.4\t10.3\t21201\t111574\t0.3576\t42055\tRomney\t42055\t0.002059334\t42055.0\n8413\t-88.643303\t37.071366999999995\tPaducah city\tKY\tKentucky\tMcCracken County\t25763\t42.2\t21.6\t11.7\t22466\t74122\t0.3294\t42001\tRomney\t42001\t0.0919491\t42001.0\n8414\t-88.687086\t37.034138\tMassac CDP\tKY\tKentucky\tMcCracken County\t3974\t42.1\t34.1\t7.9\t27173\t129191\t0.3294\t42001\tRomney\t42001\t0.014183353000000001\t42001.0\n8415\t-88.665511\t37.036112\tLone Oak city\tKY\tKentucky\tMcCracken County\t451\t41.3\t26.6\t11.3\t22816\t99375\t0.3294\t42001\tRomney\t42001\t0.001609636\t42001.0\n8416\t-88.642993\t37.034557\tHendron CDP\tKY\tKentucky\tMcCracken County\t4356\t43.2\t25.8\t9.7\t25355\t110740\t0.3294\t42001\tRomney\t42001\t0.015546725\t42001.0\n8417\t-88.52622\t37.008583\tReidland CDP\tKY\tKentucky\tMcCracken County\t4358\t46.7\t21.2\t6.7\t27467\t119266\t0.3294\t42058\tRomney\t42058\t0.015553863000000001\t42058.0\n8418\t-88.573741\t37.040099\tWoodlawn-Oakdale CDP\tKY\tKentucky\tMcCracken County\t4749\t39.0\t5.4\t13.8\t15487\t49427\t0.3294\t42003\tRomney\t42003\t0.016949356999999998\t42003.0\n8419\t-84.47695999999999\t36.69573\tStearns CDP\tKY\tKentucky\tMcCreary County\t1646\t41.3\t14.3\t14.1\t12399\t58229\t0.1873\t42638\tRomney\t42638\t0.005874635\t42638.0\n8420\t-84.47314399999999\t36.723816\tWhitley City CDP\tKY\tKentucky\tMcCreary County\t1156\t38.8\t18.4\t25.0\t14053\t62632\t0.1873\t42653\tRomney\t42653\t0.004125807\t42653.0\n8421\t-84.43947299999999\t36.664512\tPine Knot CDP\tKY\tKentucky\tMcCreary County\t1500\t34.4\t8.0\t17.7\t11317\t49778\t0.1873\t42635\tRomney\t42635\t0.005353555\t42635.0\n8422\t-87.14742700000001\t37.44325\tIsland city\tKY\tKentucky\tMcLean County\t411\t41.4\t6.3\t9.3\t16426\t48750\t0.341\t42350\tRomney\t42350\t0.001466874\t42350.0\n8423\t-87.259694\t37.541144\tCalhoun city\tKY\tKentucky\tMcLean County\t833\t45.0\t11.5\t11.8\t17603\t71667\t0.341\t42371\tRomney\t42371\t0.002973008\t42371.0\n8424\t-87.26710899999999\t37.416778\tSacramento city\tKY\tKentucky\tMcLean County\t539\t39.1\t10.7\t11.8\t17838\t63182\t0.341\t42372\tRomney\t42372\t0.001923711\t42372.0\n8425\t-87.133997\t37.491820000000004\tLivermore city\tKY\tKentucky\tMcLean County\t1450\t40.0\t11.1\t14.4\t18282\t64464\t0.341\t423HH\tRomney\t423HH\t0.005175104\t0.0\n8426\t-84.297311\t37.579921999999996\tBerea city\tKY\tKentucky\tMadison County\t11966\t33.2\t28.6\t9.2\t20256\t99590\t0.3455\t40403\tRomney\t40403\t0.042707097\t40403.0\n8427\t-84.291061\t37.730579\tRichmond city\tKY\tKentucky\tMadison County\t30020\t27.8\t31.3\t11.1\t19986\t113891\t0.3455\t40475\tRomney\t40475\t0.10714249099999999\t40475.0\n8428\t-83.063978\t37.746784999999996\tSalyersville city\tKY\tKentucky\tMagoffin County\t1604\t42.1\t11.6\t21.6\t13369\t57586\t0.2921\t41465\tRomney\t41465\t0.005724735\t41465.0\n8429\t-85.253911\t37.56825\tLebanon city\tKY\tKentucky\tMarion County\t5684\t39.5\t13.0\t15.6\t18219\t90866\t0.4671\t40033\tRomney\t40033\t0.020286406\t40033.0\n8430\t-85.39869499999999\t37.634957\tLoretto city\tKY\tKentucky\tMarion County\t703\t36.5\t11.6\t11.6\t18042\t91154\t0.4671\t40037\tRomney\t40037\t0.002509033\t40037.0\n8431\t-85.148262\t37.494603999999995\tBradfordsville city\tKY\tKentucky\tMarion County\t302\t39.2\t8.5\t14.3\t16906\t59000\t0.4671\t40009\tRomney\t40009\t0.0010778489999999999\t40009.0\n8432\t-85.431414\t37.560345\tRaywick city\tKY\tKentucky\tMarion County\t158\t37.3\t9.3\t6.7\t18994\t96000\t0.4671\t40060\tRomney\t40060\t0.000563908\t40060.0\n8433\t-88.358358\t36.852732\tBenton city\tKY\tKentucky\tMarshall County\t4277\t43.7\t23.1\t10.0\t23983\t93609\t0.3195\t42025\tRomney\t42025\t0.015264771000000002\t42025.0\n8434\t-88.301683\t36.764725\tHardin city\tKY\tKentucky\tMarshall County\t601\t40.5\t11.0\t11.1\t16098\t60000\t0.3195\t42048\tRomney\t42048\t0.002144991\t42048.0\n8435\t-88.356883\t37.032596000000005\tCalvert City\tKY\tKentucky\tMarshall County\t2689\t44.7\t15.1\t13.9\t22384\t84236\t0.3195\t42029\tRomney\t42029\t0.00959714\t42029.0\n8436\t-82.422028\t37.841485\tWarfield city\tKY\tKentucky\tMartin County\t261\t34.1\t12.9\t13.4\t12320\t59000\t0.1501\t41267\tRomney\t41267\t0.0009315189999999999\t41267.0\n8437\t-82.536441\t37.867072\tInez city\tKY\tKentucky\tMartin County\t606\t35.2\t17.1\t19.4\t13344\t50909\t0.1501\t41224\tRomney\t41224\t0.002162836\t41224.0\n8438\t-83.955893\t38.535002\tSardis city\tKY\tKentucky\tMason County\t157\t42.0\t8.0\t14.5\t16360\t92143\t0.3767\t41055\tRomney\t41055\t0.000560339\t41055.0\n8439\t-83.792209\t38.645746\tMaysville city\tKY\tKentucky\tMason County\t9105\t42.2\t20.2\t15.3\t20486\t92646\t0.3767\t41056\tRomney\t41056\t0.032496082\t41056.0\n8440\t-83.88533699999999\t38.756721\tDover city\tKY\tKentucky\tMason County\t339\t42.4\t10.5\t10.7\t21543\t93182\t0.3767\t41034\tRomney\t41034\t0.001209904\t41034.0\n8441\t-86.177531\t37.930516\tEkron city\tKY\tKentucky\tMeade County\t172\t38.6\t10.4\t12.3\t18152\t70000\t0.3776\t40117\tRomney\t40117\t0.000613874\t40117.0\n8442\t-86.177882\t37.995996000000005\tBrandenburg city\tKY\tKentucky\tMeade County\t2078\t38.4\t19.5\t12.3\t22768\t87778\t0.3776\t40108\tRomney\t40108\t0.007416459\t40108.0\n8443\t-85.983109\t37.936938\tMuldraugh city\tKY\tKentucky\tMeade County\t1216\t31.8\t7.6\t24.4\t18057\t49118\t0.3776\t40155\tRomney\t40155\t0.004339949\t40155.0\n8444\t-83.651972\t37.955312\tFrenchburg city\tKY\tKentucky\tMenifee County\t575\t41.0\t9.8\t16.7\t13655\t61842\t0.4034\t40322\tRomney\t40322\t0.002052196\t40322.0\n8445\t-84.76395\t37.754208\tBurgin city\tKY\tKentucky\tMercer County\t949\t44.3\t10.9\t14.0\t18987\t100195\t0.2984\t40310\tRomney\t40310\t0.0033870159999999996\t40310.0\n8446\t-84.848086\t37.767538\tHarrodsburg city\tKY\tKentucky\tMercer County\t8315\t39.1\t17.7\t12.5\t19626\t104157\t0.2984\t40330\tRomney\t40330\t0.029676543\t40330.0\n8447\t-85.61850799999999\t36.984758\tEdmonton city\tKY\tKentucky\tMetcalfe County\t1617\t41.7\t15.1\t17.5\t15697\t75667\t0.3406\t42129\tRomney\t42129\t0.005771133\t42129.0\n8448\t-85.792753\t36.639652000000005\tGamaliel city\tKY\tKentucky\tMonroe County\t450\t41.3\t12.5\t13.0\t15566\t67037\t0.1972\t42140\tRomney\t42140\t0.001606067\t42140.0\n8449\t-85.69211800000001\t36.701146\tTompkinsville city\tKY\tKentucky\tMonroe County\t2547\t42.7\t13.6\t15.8\t15710\t74811\t0.1972\t42167\tRomney\t42167\t0.009090336999999999\t42167.0\n8450\t-85.960187\t36.723454\tFountain Run city\tKY\tKentucky\tMonroe County\t227\t40.7\t5.6\t11.7\t15036\t53889\t0.1972\t42133\tRomney\t42133\t0.000810171\t42133.0\n8451\t-83.82856600000001\t37.965488\tJeffersonville city\tKY\tKentucky\tMontgomery County\t2174\t36.4\t6.4\t15.0\t16329\t72889\t0.3611\t40337\tRomney\t40337\t0.007759086\t40337.0\n8452\t-83.94764599999999\t38.06264\tMount Sterling city\tKY\tKentucky\tMontgomery County\t6067\t38.3\t21.8\t14.1\t20935\t101313\t0.3611\t40353\tRomney\t40353\t0.021653347000000003\t40353.0\n8453\t-83.892275\t37.997194\tCamargo city\tKY\tKentucky\tMontgomery County\t1036\t38.6\t11.0\t13.3\t17462\t89750\t0.3611\t40337\tRomney\t40337\t0.003697522\t40337.0\n8454\t-83.267072\t37.913669\tWest Liberty city\tKY\tKentucky\tMorgan County\t3274\t36.9\t11.1\t12.2\t15938\t90345\t0.3061\t41472\tRomney\t41472\t0.011685026999999999\t41472.0\n8455\t-87.14030799999999\t37.335836\tSouth Carrollton city\tKY\tKentucky\tMuhlenberg County\t194\t41.1\t4.4\t12.7\t17220\t70000\t0.3745\t42374\tRomney\t42374\t0.000692393\t42374.0\n8456\t-87.050143\t37.217096000000005\tDrakesboro city\tKY\tKentucky\tMuhlenberg County\t600\t37.9\t8.9\t13.4\t12432\t39333\t0.3745\t42337\tRomney\t42337\t0.002141422\t42337.0\n8457\t-87.220221\t37.362251\tBremen city\tKY\tKentucky\tMuhlenberg County\t387\t41.0\t5.5\t11.9\t17343\t72647\t0.3745\t42325\tRomney\t42325\t0.0013812170000000001\t42325.0\n8458\t-87.17712\t37.213206\tGreenville city\tKY\tKentucky\tMuhlenberg County\t4155\t46.3\t16.1\t12.1\t21106\t80138\t0.3745\t42345\tRomney\t42345\t0.014829348999999999\t42345.0\n8459\t-87.159231\t37.236836\tPowderly city\tKY\tKentucky\tMuhlenberg County\t843\t40.4\t4.9\t12.1\t14254\t45313\t0.3745\t423XX\tRomney\t423XX\t0.0030086979999999998\t0.0\n8460\t-87.12735699999999\t37.296496000000005\tCentral City\tKY\tKentucky\tMuhlenberg County\t5668\t40.3\t13.4\t12.0\t16713\t68093\t0.3745\t42330\tRomney\t42330\t0.020229302\t42330.0\n8461\t-85.38356\t37.932414\tFairfield city\tKY\tKentucky\tNelson County\t69\t34.5\t8.9\t10.5\t19467\t132500\t0.4107\t40020\tRomney\t40020\t0.000246264\t40020.0\n8462\t-85.589016\t37.658964000000005\tNew Haven city\tKY\tKentucky\tNelson County\t928\t37.1\t8.5\t11.9\t19408\t106061\t0.4107\t40051\tRomney\t40051\t0.003312066\t40051.0\n8463\t-85.315207\t37.911633\tBloomfield city\tKY\tKentucky\tNelson County\t922\t39.2\t13.8\t10.1\t19145\t107843\t0.4107\t40008\tRomney\t40008\t0.0032906520000000002\t40008.0\n8464\t-85.462535\t37.818059999999996\tBardstown city\tKY\tKentucky\tNelson County\t11753\t33.8\t19.4\t14.5\t22195\t110190\t0.4107\t40004\tRomney\t40004\t0.041946892\t40004.0\n8465\t-84.063004\t38.318421\tCarlisle city\tKY\tKentucky\tNicholas County\t1841\t42.9\t12.9\t11.6\t19894\t81047\t0.3673\t40311\tRomney\t40311\t0.006570596999999999\t40311.0\n8466\t-86.922979\t37.379727\tMcHenry city\tKY\tKentucky\tOhio County\t453\t37.4\t4.6\t9.8\t13351\t51053\t0.3097\t42354\tRomney\t42354\t0.0016167739999999999\t42354.0\n8467\t-86.716786\t37.635795\tFordsville city\tKY\tKentucky\tOhio County\t550\t41.6\t9.6\t10.9\t15677\t56389\t0.3097\t42343\tRomney\t42343\t0.00196297\t42343.0\n8468\t-86.995834\t37.417851\tCentertown city\tKY\tKentucky\tOhio County\t453\t37.6\t6.9\t8.2\t18495\t59318\t0.3097\t42328\tRomney\t42328\t0.0016167739999999999\t42328.0\n8469\t-86.87678199999999\t37.409451000000004\tBeaver Dam city\tKY\tKentucky\tOhio County\t3141\t40.8\t14.1\t10.3\t19777\t89296\t0.3097\t42320\tRomney\t42320\t0.011210345\t42320.0\n8470\t-86.991332\t37.336178000000004\tRockport city\tKY\tKentucky\tOhio County\t350\t40.4\t6.5\t12.5\t18133\t65000\t0.3097\t42369\tRomney\t42369\t0.001249163\t42369.0\n8471\t-86.89296800000001\t37.450685\tHartford city\tKY\tKentucky\tOhio County\t2462\t40.5\t18.3\t8.7\t18080\t74310\t0.3097\t42347\tRomney\t42347\t0.008786969\t42347.0\n8472\t-85.503388\t38.334827000000004\tCrestwood city\tKY\tKentucky\tOldham County\t3167\t39.3\t35.6\t11.5\t35295\t206127\t0.3092\t40056\tRomney\t40056\t0.01130314\t40056.0\n8473\t-85.58245699999999\t38.402401\tGoshen city\tKY\tKentucky\tOldham County\t1074\t36.3\t45.2\t9.2\t33716\t193932\t0.3092\t40026\tRomney\t40026\t0.003833146\t40026.0\n8474\t-85.450797\t38.386589\tBuckner CDP\tKY\tKentucky\tOldham County\t5121\t38.2\t23.9\t8.6\t30874\t256481\t0.3092\t40010\tRomney\t40010\t0.018277038\t40010.0\n8475\t-85.381179\t38.401343\tLa Grange city\tKY\tKentucky\tOldham County\t7706\t36.7\t22.3\t9.4\t26408\t134443\t0.3092\t40031\tRomney\t40031\t0.027502999\t40031.0\n8476\t-85.48991099999999\t38.310501\tPewee Valley city\tKY\tKentucky\tOldham County\t1664\t48.2\t38.9\t16.0\t40753\t244048\t0.3092\t40056\tRomney\t40056\t0.005938878000000001\t40056.0\n8477\t-85.473378\t38.345558000000004\tPark Lake city\tKY\tKentucky\tOldham County\t619\t36.6\t29.1\t9.0\t32986\t161607\t0.3092\t40014\tRomney\t40014\t0.002209234\t40014.0\n8478\t-85.52318299999999\t38.323367\tOrchard Grass Hills city\tKY\tKentucky\tOldham County\t1562\t33.3\t24.0\t10.0\t28837\t138462\t0.3092\t40056\tRomney\t40056\t0.005574836\t40056.0\n8479\t-85.602979\t38.372045\tRiver Bluff city\tKY\tKentucky\tOldham County\t347\t41.4\t60.9\t5.5\t46562\t264167\t0.3092\t40059\tRomney\t40059\t0.001238456\t40059.0\n8480\t-84.872925\t38.423815000000005\tMonterey city\tKY\tKentucky\tOwen County\t181\t39.6\t10.5\t9.6\t18331\t70000\t0.3294\t40359\tRomney\t40359\t0.000645996\t40359.0\n8481\t-84.946942\t38.472134999999994\tGratz city\tKY\tKentucky\tOwen County\t96\t42.9\t8.8\t12.8\t20454\t98333\t0.3294\t40036\tRomney\t40036\t0.00034262800000000004\t40036.0\n8482\t-84.844399\t38.544022\tOwenton city\tKY\tKentucky\tOwen County\t1477\t43.1\t15.5\t9.8\t18356\t98966\t0.3294\t40355\tRomney\t40355\t0.0052714680000000005\t40355.0\n8483\t-83.680286\t37.474151\tBooneville city\tKY\tKentucky\tOwsley County\t109\t47.2\t22.2\t11.9\t13575\t62000\t0.1791\t41314\tRomney\t41314\t0.000389025\t41314.0\n8484\t-84.371876\t38.787727000000004\tButler city\tKY\tKentucky\tPendleton County\t610\t35.1\t7.6\t15.2\t18560\t82222\t0.3359\t41006\tRomney\t41006\t0.002177113\t41006.0\n8485\t-84.333338\t38.673635\tFalmouth city\tKY\tKentucky\tPendleton County\t1946\t37.1\t10.3\t16.6\t17595\t85089\t0.3359\t41040\tRomney\t41040\t0.006945346\t41040.0\n8486\t-83.197536\t37.255571999999994\tHazard city\tKY\tKentucky\tPerry County\t4887\t41.9\t17.2\t12.5\t17204\t77222\t0.1999\t41729\tRomney\t41729\t0.017441883999999998\t41729.0\n8487\t-83.06133100000001\t37.215884\tVicco city\tKY\tKentucky\tPerry County\t306\t38.0\t3.4\t14.3\t10919\t45000\t0.1999\t41773\tRomney\t41773\t0.001092125\t41773.0\n8488\t-83.471814\t37.346114\tBuckhorn city\tKY\tKentucky\tPerry County\t142\t37.5\t11.8\t22.2\t11695\t45833\t0.1999\t41721\tRomney\t41721\t0.000506803\t41721.0\n8489\t-82.159875\t37.511224\tPhelps CDP\tKY\tKentucky\tPike County\t974\t42.0\t10.0\t17.1\t13745\t49063\t0.2389\t41553\tRomney\t41553\t0.003476242\t41553.0\n8490\t-82.346058\t37.300943\tElkhorn City\tKY\tKentucky\tPike County\t972\t49.1\t15.4\t15.0\t18522\t59600\t0.2389\t41522\tRomney\t41522\t0.003469104\t41522.0\n8491\t-82.358754\t37.313966\tCedarville city\tKY\tKentucky\tPike County\t47\t48.1\t5.6\t15.0\t18835\t75000\t0.2389\t41522\tRomney\t41522\t0.000167745\t41522.0\n8492\t-82.556912\t37.524366\tCoal Run Village city\tKY\tKentucky\tPike County\t582\t40.1\t22.8\t11.4\t23390\t72500\t0.2389\t41501\tRomney\t41501\t0.00207718\t41501.0\n8493\t-82.515428\t37.474608\tPikeville city\tKY\tKentucky\tPike County\t6106\t37.8\t26.0\t10.2\t20413\t103537\t0.2389\t41501\tRomney\t41501\t0.02179254\t41501.0\n8494\t-83.927426\t37.861998\tClay City\tKY\tKentucky\tPowell County\t1413\t35.9\t7.2\t14.9\t14546\t67826\t0.3615\t40312\tRomney\t40312\t0.005043049\t40312.0\n8495\t-83.857525\t37.848335\tStanton city\tKY\tKentucky\tPowell County\t3184\t37.2\t11.7\t18.3\t16541\t84144\t0.3615\t40380\tRomney\t40380\t0.011363814\t40380.0\n8496\t-84.61014300000001\t37.081579\tSomerset city\tKY\tKentucky\tPulaski County\t11256\t43.5\t16.4\t8.3\t18398\t86285\t0.1914\t42533\tRomney\t42533\t0.04017308\t42533.0\n8497\t-84.60129599999999\t36.98708\tBurnside city\tKY\tKentucky\tPulaski County\t674\t42.7\t12.0\t8.4\t16439\t69091\t0.1914\t425HH\tRomney\t425HH\t0.0024055310000000002\t0.0\n8498\t-84.60191800000001\t37.065451\tFerguson city\tKY\tKentucky\tPulaski County\t877\t39.4\t15.5\t5.4\t19567\t70625\t0.1914\t42533\tRomney\t42533\t0.003130045\t42533.0\n8499\t-84.634063\t37.176293\tScience Hill city\tKY\tKentucky\tPulaski County\t658\t43.5\t10.0\t8.0\t17030\t81136\t0.1914\t42553\tRomney\t42553\t0.0023484260000000002\t42553.0\n8500\t-84.653335\t37.284847\tEubank city\tKY\tKentucky\tPulaski County\t377\t38.7\t8.1\t10.1\t13565\t59615\t0.1914\t42567\tRomney\t42567\t0.0013455270000000002\t42567.0\n8501\t-84.037112\t38.531940000000006\tMount Olivet city\tKY\tKentucky\tRobertson County\t292\t44.2\t9.0\t9.9\t16678\t76667\t0.3636\t41064\tRomney\t41064\t0.001042159\t41064.0\n8502\t-84.215649\t37.297961\tLivingston city\tKY\tKentucky\tRockcastle County\t226\t44.1\t3.4\t25.5\t15431\t36000\t0.1765\t40445\tRomney\t40445\t0.000806602\t40445.0\n8503\t-84.41605600000001\t37.403803\tBrodhead city\tKY\tKentucky\tRockcastle County\t1252\t39.8\t14.2\t16.4\t14350\t64375\t0.1765\t40409\tRomney\t40409\t0.004468434\t40409.0\n8504\t-84.365344\t37.369753\tMount Vernon city\tKY\tKentucky\tRockcastle County\t2572\t41.4\t11.8\t14.7\t14996\t61781\t0.1765\t40456\tRomney\t40456\t0.009179563\t40456.0\n8505\t-83.50429\t38.152206\tLakeview Heights city\tKY\tKentucky\tRowan County\t307\t41.8\t34.5\t8.6\t24565\t113542\t0.4485\t40351\tRomney\t40351\t0.001095694\t40351.0\n8506\t-83.445264\t38.190106\tMorehead city\tKY\tKentucky\tRowan County\t7421\t27.9\t42.5\t12.8\t17248\t102640\t0.4485\t40351\tRomney\t40351\t0.026485823999999998\t40351.0\n8507\t-85.077158\t37.051193\tRussell Springs city\tKY\tKentucky\tRussell County\t2521\t43.7\t13.3\t9.7\t16103\t71184\t0.1827\t42642\tRomney\t42642\t0.008997541999999999\t42642.0\n8508\t-85.07015600000001\t36.992367\tJamestown city\tKY\tKentucky\tRussell County\t1772\t44.7\t13.2\t12.3\t15161\t81111\t0.1827\t42629\tRomney\t42629\t0.006324334\t42629.0\n8509\t-84.683087\t38.269524\tStamping Ground city\tKY\tKentucky\tScott County\t599\t36.8\t15.3\t17.5\t19954\t129412\t0.3661\t40379\tRomney\t40379\t0.002137853\t40379.0\n8510\t-84.537949\t38.393112\tSadieville city\tKY\tKentucky\tScott County\t276\t37.7\t10.1\t8.3\t23051\t126136\t0.3661\t40370\tRomney\t40370\t0.000985054\t40370.0\n8511\t-84.548082\t38.224846\tGeorgetown city\tKY\tKentucky\tScott County\t26603\t31.9\t24.1\t10.0\t27950\t162952\t0.3661\t40324\tRomney\t40324\t0.094947091\t40324.0\n8512\t-85.227646\t38.205816\tShelbyville city\tKY\tKentucky\tShelby County\t14226\t35.3\t21.5\t11.9\t23664\t152055\t0.3555\t40065\tRomney\t40065\t0.05077312\t40065.0\n8513\t-85.354366\t38.217584\tSimpsonville city\tKY\tKentucky\tShelby County\t2276\t31.5\t26.6\t8.6\t27345\t161653\t0.3555\t40067\tRomney\t40067\t0.008123128\t40067.0\n8514\t-86.574949\t36.728172\tFranklin city\tKY\tKentucky\tSimpson County\t8348\t37.3\t13.2\t12.6\t20327\t97700\t0.3736\t42134\tRomney\t42134\t0.029794321000000002\t42134.0\n8515\t-85.343276\t38.035505\tTaylorsville city\tKY\tKentucky\tSpencer County\t1723\t36.4\t12.1\t15.2\t18298\t114919\t0.3023\t40071\tRomney\t40071\t0.006149450999999999\t40071.0\n8516\t-85.34849200000001\t37.349812\tCampbellsville city\tKY\tKentucky\tTaylor County\t10485\t39.9\t16.4\t13.2\t18252\t87696\t0.3\t42718\tRomney\t42718\t0.037421353\t42718.0\n8517\t-87.26316700000001\t36.722657\tTrenton city\tKY\tKentucky\tTodd County\t432\t38.1\t19.4\t6.6\t19303\t99091\t0.2974\t42286\tRomney\t42286\t0.001541824\t42286.0\n8518\t-87.17057199999999\t36.6478\tGuthrie city\tKY\tKentucky\tTodd County\t1495\t34.0\t16.2\t21.3\t14880\t58750\t0.2974\t42234\tRomney\t42234\t0.00533571\t42234.0\n8519\t-87.157164\t36.810859\tElkton city\tKY\tKentucky\tTodd County\t2062\t40.2\t14.3\t11.1\t18506\t78258\t0.2974\t42220\tRomney\t42220\t0.007359354\t42220.0\n8520\t-87.068138\t36.717490999999995\tAllensville city\tKY\tKentucky\tTodd County\t192\t34.6\t9.5\t19.3\t17246\t95000\t0.2974\t42204\tRomney\t42204\t0.000685255\t42204.0\n8521\t-87.808502\t36.866817\tCadiz city\tKY\tKentucky\tTrigg County\t2671\t41.2\t11.7\t14.2\t18018\t97625\t0.3137\t42211\tRomney\t42211\t0.009532898\t42211.0\n8522\t-85.37758199999999\t38.713799\tMilton city\tKY\tKentucky\tTrimble County\t624\t40.1\t9.8\t14.8\t19124\t86818\t0.3824\t40045\tRomney\t40045\t0.002227079\t40045.0\n8523\t-85.31798\t38.596426\tBedford city\tKY\tKentucky\tTrimble County\t779\t38.8\t10.3\t14.4\t19482\t95500\t0.3824\t40006\tRomney\t40006\t0.00278028\t40006.0\n8524\t-87.931758\t37.77357\tUniontown city\tKY\tKentucky\tUnion County\t1006\t38.1\t4.1\t12.5\t17464\t49444\t0.3248\t42461\tRomney\t42461\t0.0035904509999999997\t42461.0\n8525\t-87.905824\t37.684723\tMorganfield city\tKY\tKentucky\tUnion County\t3261\t38.4\t16.5\t13.7\t25323\t79949\t0.3248\t42437\tRomney\t42437\t0.01163863\t42437.0\n8526\t-87.814684\t37.709259\tWaverly city\tKY\tKentucky\tUnion County\t300\t36.9\t7.4\t11.5\t20479\t82222\t0.3248\t42462\tRomney\t42462\t0.001070711\t42462.0\n8527\t-87.855802\t37.677275\tBreckinridge Center CDP\tKY\tKentucky\tUnion County\t1971\t20.3\t0.0\t18.3\t14059\t37778\t0.3248\t42437\tRomney\t42437\t0.007034571999999999\t42437.0\n8528\t-87.987427\t37.546675\tSturgis city\tKY\tKentucky\tUnion County\t1934\t42.5\t9.9\t13.8\t19122\t55473\t0.3248\t42459\tRomney\t42459\t0.006902518000000001\t42459.0\n8529\t-86.25055400000001\t37.04728\tOakland city\tKY\tKentucky\tWarren County\t286\t40.8\t16.5\t9.4\t21578\t113636\t0.3828\t42159\tRomney\t42159\t0.001020745\t42159.0\n8530\t-86.44551899999999\t36.971274\tBowling Green city\tKY\tKentucky\tWarren County\t57449\t31.4\t31.6\t10.4\t23037\t137226\t0.3828\t42104\tRomney\t42104\t0.205037606\t42104.0\n8531\t-86.530262\t36.842044\tWoodburn city\tKY\tKentucky\tWarren County\t344\t44.9\t30.3\t5.6\t23778\t149038\t0.3828\t42170\tRomney\t42170\t0.001227749\t42170.0\n8532\t-86.382254\t37.019484999999996\tPlum Springs city\tKY\tKentucky\tWarren County\t443\t31.5\t20.8\t13.3\t19867\t100000\t0.3828\t42103\tRomney\t42103\t0.0015810829999999998\t42103.0\n8533\t-86.208084\t37.05025\tSmiths Grove city\tKY\tKentucky\tWarren County\t862\t40.4\t18.5\t8.9\t21792\t115351\t0.3828\t42171\tRomney\t42171\t0.00307651\t42171.0\n8534\t-85.224121\t37.687579\tSpringfield city\tKY\tKentucky\tWashington County\t2714\t43.5\t18.3\t15.0\t20132\t97130\t0.3198\t40069\tRomney\t40069\t0.009686366\t40069.0\n8535\t-85.069733\t37.734988\tMackville city\tKY\tKentucky\tWashington County\t230\t41.5\t9.9\t11.3\t19733\t84167\t0.3198\t40040\tRomney\t40040\t0.0008208789999999999\t40040.0\n8536\t-85.122938\t37.811591\tWillisburg city\tKY\tKentucky\tWashington County\t314\t38.8\t12.9\t17.7\t16725\t85833\t0.3198\t40078\tRomney\t40078\t0.001120678\t40078.0\n8537\t-84.85108000000001\t36.840433000000004\tMonticello city\tKY\tKentucky\tWayne County\t6105\t38.1\t12.9\t14.2\t14719\t62500\t0.2573\t42633\tRomney\t42633\t0.021788971\t42633.0\n8538\t-87.501847\t37.490623\tSlaughters city\tKY\tKentucky\tWebster County\t250\t40.7\t13.8\t8.2\t21645\t78000\t0.3227\t42456\tRomney\t42456\t0.000892259\t42456.0\n8539\t-87.750525\t37.399544\tProvidence city\tKY\tKentucky\tWebster County\t3200\t40.0\t10.4\t14.5\t18342\t44366\t0.3227\t42450\tRomney\t42450\t0.011420918\t42450.0\n8540\t-87.861159\t37.489306\tWheatcroft city\tKY\tKentucky\tWebster County\t170\t42.3\t4.9\t10.7\t18053\t51429\t0.3227\t42463\tRomney\t42463\t0.000606736\t42463.0\n8541\t-87.527658\t37.604723\tSebree city\tKY\tKentucky\tWebster County\t1627\t38.5\t12.1\t12.4\t18361\t71410\t0.3227\t42455\tRomney\t42455\t0.005806823000000001\t42455.0\n8542\t-87.691948\t37.516668\tDixon city\tKY\tKentucky\tWebster County\t617\t41.3\t7.1\t10.9\t18489\t70000\t0.3227\t42409\tRomney\t42409\t0.002202096\t42409.0\n8543\t-87.820725\t37.476295\tClay city\tKY\tKentucky\tWebster County\t1156\t40.5\t6.0\t11.1\t17447\t54909\t0.3227\t42404\tRomney\t42404\t0.004125807\t42404.0\n8544\t-84.074139\t36.934179\tCorbin city\tKY\tKentucky\tWhitley County\t7763\t41.8\t22.9\t12.2\t18287\t83317\t0.2052\t40701\tRomney\t40701\t0.027706434\t40701.0\n8545\t-84.167737\t36.739022999999996\tWilliamsburg city\tKY\tKentucky\tWhitley County\t5339\t32.7\t31.6\t10.3\t16067\t84500\t0.2052\t40769\tRomney\t40769\t0.019055089\t40769.0\n8546\t-83.547045\t37.736036\tCampton city\tKY\tKentucky\tWolfe County\t352\t41.3\t11.2\t13.5\t10760\t49167\t0.3814\t41301\tRomney\t41301\t0.001256301\t41301.0\n8547\t-84.682326\t38.150058\tMidway city\tKY\tKentucky\tWoodford County\t1713\t38.7\t36.4\t9.4\t27474\t140574\t0.396\t40347\tRomney\t40347\t0.00611376\t40347.0\n8548\t-84.72927\t38.054173999999996\tVersailles city\tKY\tKentucky\tWoodford County\t7830\t38.7\t27.6\t10.9\t26795\t147868\t0.396\t40383\tRomney\t40383\t0.02794556\t40383.0\n8549\t-92.375623\t30.214496999999998\tCrowley city\tLA\tLouisiana\tAcadia Parish\t14142\t35.3\t14.0\t10.0\t15251\t87053\t0.2445\t70526\tRomney\t70526\t0.039753585\t70526.0\n8550\t-92.583969\t30.187415\tMermentau village\tLA\tLouisiana\tAcadia Parish\t706\t35.9\t6.4\t8.9\t14383\t59444\t0.2445\t70556\tRomney\t70556\t0.0019845870000000003\t70556.0\n8551\t-92.495622\t30.326043\tIota town\tLA\tLouisiana\tAcadia Parish\t1377\t35.4\t10.3\t7.6\t14339\t64808\t0.2445\t70543\tRomney\t70543\t0.003870788\t70543.0\n8552\t-92.49844499999999\t30.122097999999998\tMorse village\tLA\tLouisiana\tAcadia Parish\t737\t34.3\t3.5\t11.2\t14200\t53621\t0.2445\t70559\tRomney\t70559\t0.002071729\t70559.0\n8553\t-92.463313\t30.181533\tEstherwood village\tLA\tLouisiana\tAcadia Parish\t797\t34.6\t13.6\t6.8\t13003\t62381\t0.2445\t70534\tRomney\t70534\t0.002240391\t70534.0\n8554\t-92.267768\t30.239501\tRayne city\tLA\tLouisiana\tAcadia Parish\t8432\t35.7\t9.2\t8.6\t13621\t83237\t0.2445\t70578\tRomney\t70578\t0.023702604\t70578.0\n8555\t-92.214822\t30.403764000000002\tChurch Point town\tLA\tLouisiana\tAcadia Parish\t4670\t35.4\t8.3\t11.0\t12747\t72013\t0.2445\t70525\tRomney\t70525\t0.01312751\t70525.0\n8556\t-92.798536\t30.8666\tElizabeth town\tLA\tLouisiana\tAllen Parish\t588\t37.7\t16.2\t10.5\t15186\t84000\t0.2812\t70638\tRomney\t70638\t0.0016528860000000001\t70638.0\n8557\t-93.042401\t30.52163\tReeves village\tLA\tLouisiana\tAllen Parish\t228\t37.6\t5.3\t12.1\t15341\t73333\t0.2812\t70658\tRomney\t70658\t0.000640915\t70658.0\n8558\t-92.654313\t30.816381\tOakdale city\tLA\tLouisiana\tAllen Parish\t8013\t35.0\t11.6\t15.5\t13760\t68452\t0.2812\t71463\tRomney\t71463\t0.022524783\t71463.0\n8559\t-92.764986\t30.618775\tOberlin town\tLA\tLouisiana\tAllen Parish\t1844\t38.8\t9.5\t10.3\t15209\t67568\t0.2812\t70655\tRomney\t70655\t0.005183539\t70655.0\n8560\t-92.848923\t30.486883000000002\tKinder town\tLA\tLouisiana\tAllen Parish\t2117\t37.6\t15.3\t10.0\t16790\t80692\t0.2812\t70648\tRomney\t70648\t0.00595095\t70648.0\n8561\t-90.997128\t30.099333\tDonaldsonville city\tLA\tLouisiana\tAscension Parish\t7934\t32.3\t11.4\t14.0\t14217\t119355\t0.3201\t70346\tRomney\t70346\t0.022302711\t70346.0\n8562\t-90.865505\t30.18559\tSorrento town\tLA\tLouisiana\tAscension Parish\t1634\t33.9\t7.9\t7.0\t17265\t118421\t0.3201\t70778\tRomney\t70778\t0.004593223\t70778.0\n8563\t-90.923955\t30.215087\tGonzales city\tLA\tLouisiana\tAscension Parish\t9864\t34.7\t13.3\t9.3\t18026\t144678\t0.3201\t70737\tRomney\t70737\t0.027727999\t70737.0\n8564\t-91.211713\t29.955534999999998\tPierre Part CDP\tLA\tLouisiana\tAssumption Parish\t3044\t38.0\t4.4\t7.8\t17446\t93298\t0.4325\t70339\tRomney\t70339\t0.008556775\t70339.0\n8565\t-91.04977199999999\t30.04205\tBelle Rose CDP\tLA\tLouisiana\tAssumption Parish\t1876\t38.8\t9.2\t15.9\t17539\t93636\t0.4325\t70341\tRomney\t70341\t0.005273491999999999\t70341.0\n8566\t-90.995674\t29.860433\tSupreme CDP\tLA\tLouisiana\tAssumption Parish\t1110\t33.2\t5.3\t6.2\t13378\t61000\t0.4325\t70372\tRomney\t70372\t0.003120243\t70372.0\n8567\t-91.026451\t29.938175\tNapoleonville village\tLA\tLouisiana\tAssumption Parish\t606\t38.9\t14.0\t21.2\t12056\t61923\t0.4325\t70390\tRomney\t70390\t0.001703484\t70390.0\n8568\t-91.056857\t29.98875\tPaincourtville CDP\tLA\tLouisiana\tAssumption Parish\t806\t40.7\t15.8\t7.6\t19409\t101563\t0.4325\t70391\tRomney\t70391\t0.00226569\t70391.0\n8569\t-90.952432\t29.824628999999998\tLabadieville CDP\tLA\tLouisiana\tAssumption Parish\t1857\t38.6\t9.8\t5.3\t18620\t89459\t0.4325\t70372\tRomney\t70372\t0.0052200829999999995\t70372.0\n8570\t-91.983452\t30.965787\tPlaucheville village\tLA\tLouisiana\tAvoyelles Parish\t306\t41.9\t6.0\t3.7\t16811\t84000\t0.3568\t71362\tRomney\t71362\t0.000860175\t71362.0\n8571\t-91.81410100000001\t30.980468\tSimmesport town\tLA\tLouisiana\tAvoyelles Parish\t2155\t34.9\t5.7\t12.6\t11542\t56184\t0.3568\t71369\tRomney\t71369\t0.006057769\t71369.0\n8572\t-91.981685\t31.0342\tMoreauville village\tLA\tLouisiana\tAvoyelles Parish\t887\t39.2\t11.8\t3.0\t14918\t91000\t0.3568\t71339\tRomney\t71339\t0.002493384\t71339.0\n8573\t-92.051412\t30.989109000000003\tCottonport town\tLA\tLouisiana\tAvoyelles Parish\t2457\t33.9\t9.5\t7.0\t13355\t86846\t0.3568\t71327\tRomney\t71327\t0.0069067009999999995\t71327.0\n8574\t-92.185699\t30.954615000000004\tBunkie city\tLA\tLouisiana\tAvoyelles Parish\t4740\t37.0\t12.4\t11.3\t13080\t68456\t0.3568\t71322\tRomney\t71322\t0.013324282\t71322.0\n8575\t-92.050475\t31.058215999999998\tMansura town\tLA\tLouisiana\tAvoyelles Parish\t1533\t38.2\t10.0\t14.8\t11992\t79167\t0.3568\t71350\tRomney\t71350\t0.004309309\t71350.0\n8576\t-92.064566\t31.128865\tMarksville city\tLA\tLouisiana\tAvoyelles Parish\t5332\t36.5\t13.1\t12.6\t12635\t80602\t0.3568\t71351\tRomney\t71351\t0.014988412\t71351.0\n8577\t-92.105166\t30.952757000000002\tEvergreen town\tLA\tLouisiana\tAvoyelles Parish\t325\t40.8\t14.2\t8.4\t15499\t76875\t0.3568\t71333\tRomney\t71333\t0.000913585\t71333.0\n8578\t-92.12159\t31.053622999999998\tHessmer village\tLA\tLouisiana\tAvoyelles Parish\t674\t38.4\t6.2\t4.5\t13353\t88438\t0.3568\t71341\tRomney\t71341\t0.0018946339999999999\t71341.0\n8579\t-93.291854\t30.884538\tDe Ridder city\tLA\tLouisiana\tBeauregard Parish\t9746\t39.3\t24.1\t10.6\t20215\t105413\t0.1988\t70659\tRomney\t70659\t0.027396298\t70659.0\n8580\t-93.52599000000001\t30.753797\tMerryville town\tLA\tLouisiana\tBeauregard Parish\t1125\t39.5\t7.8\t12.4\t14684\t60263\t0.1988\t70653\tRomney\t70653\t0.003162409\t70653.0\n8581\t-93.015755\t32.272175\tLucky village\tLA\tLouisiana\tBienville Parish\t370\t36.5\t14.8\t13.7\t13573\t46250\t0.4845\t71008\tRomney\t71008\t0.001040081\t71008.0\n8582\t-93.20635\t32.339688\tJamestown village\tLA\tLouisiana\tBienville Parish\t148\t40.5\t11.0\t8.3\t15662\t58000\t0.4845\t71045\tRomney\t71045\t0.000416032\t71045.0\n8583\t-93.04991600000001\t32.50524\tMount Lebanon town\tLA\tLouisiana\tBienville Parish\t66\t41.7\t13.0\t12.9\t15008\t60000\t0.4845\t71028\tRomney\t71028\t0.000185528\t71028.0\n8584\t-93.165947\t32.254821\tCastor village\tLA\tLouisiana\tBienville Parish\t178\t38.1\t12.2\t6.3\t13170\t55000\t0.4845\t71016\tRomney\t71016\t0.000500363\t71016.0\n8585\t-93.054048\t32.539549\tGibsland town\tLA\tLouisiana\tBienville Parish\t961\t39.7\t15.3\t11.7\t14224\t43000\t0.4845\t71028\tRomney\t71028\t0.0027014\t71028.0\n8586\t-92.978769\t32.361651\tBienville village\tLA\tLouisiana\tBienville Parish\t256\t46.4\t12.1\t9.6\t14036\t50000\t0.4845\t71008\tRomney\t71008\t0.000719624\t71008.0\n8587\t-92.924426\t32.550548\tArcadia town\tLA\tLouisiana\tBienville Parish\t2928\t38.1\t15.4\t10.8\t12490\t58716\t0.4845\t71001\tRomney\t71001\t0.008230696\t71001.0\n8588\t-93.284003\t32.326122\tRinggold town\tLA\tLouisiana\tBienville Parish\t1476\t40.9\t9.8\t13.1\t13395\t57059\t0.4845\t71068\tRomney\t71068\t0.00414908\t71068.0\n8589\t-92.992417\t32.448547999999995\tBryceland village\tLA\tLouisiana\tBienville Parish\t108\t40.7\t13.7\t12.5\t14928\t57500\t0.4845\t71028\tRomney\t71028\t0.000303591\t71028.0\n8590\t-92.976789\t32.163057\tSaline village\tLA\tLouisiana\tBienville Parish\t309\t36.6\t14.6\t13.4\t13551\t45000\t0.4845\t71070\tRomney\t71070\t0.000868608\t71070.0\n8591\t-93.740237\t32.691749\tBenton town\tLA\tLouisiana\tBossier Parish\t2334\t33.1\t9.6\t7.7\t14407\t91311\t0.2668\t71006\tRomney\t71006\t0.006560944\t71006.0\n8592\t-93.5625\t32.560765\tEastwood CDP\tLA\tLouisiana\tBossier Parish\t4266\t35.4\t18.4\t4.5\t19060\t118377\t0.2668\t71037\tRomney\t71037\t0.011991854\t71037.0\n8593\t-93.665961\t32.520959000000005\tBossier City\tLA\tLouisiana\tBossier Parish\t59539\t33.3\t19.5\t5.7\t20117\t129094\t0.2668\t71112\tRomney\t71112\t0.16736591\t71112.0\n8594\t-93.605948\t32.572821999999995\tRed Chute CDP\tLA\tLouisiana\tBossier Parish\t6525\t37.2\t25.4\t3.3\t24785\t156201\t0.2668\t71037\tRomney\t71037\t0.01834197\t71037.0\n8595\t-93.50849000000001\t32.525991\tHaughton town\tLA\tLouisiana\tBossier Parish\t3463\t32.1\t11.3\t8.2\t15411\t82712\t0.2668\t71037\tRomney\t71037\t0.009734597\t71037.0\n8596\t-93.69913100000001\t32.907475\tPlain Dealing town\tLA\tLouisiana\tBossier Parish\t1233\t37.3\t11.9\t12.4\t12315\t61600\t0.2668\t71064\tRomney\t71064\t0.0034659999999999995\t71064.0\n8597\t-93.837137\t32.752002000000005\tBelcher village\tLA\tLouisiana\tCaddo Parish\t246\t41.9\t18.8\t5.0\t16241\t52500\t0.5193\t71004\tRomney\t71004\t0.000691513\t71004.0\n8598\t-93.965272\t32.437821\tGreenwood town\tLA\tLouisiana\tCaddo Parish\t2740\t40.3\t16.1\t6.7\t20509\t117018\t0.5193\t71033\tRomney\t71033\t0.007702222\t71033.0\n8599\t-93.986933\t32.873602000000005\tVivian town\tLA\tLouisiana\tCaddo Parish\t3784\t38.1\t10.6\t7.1\t14587\t57736\t0.5193\t71082\tRomney\t71082\t0.010636936999999999\t71082.0\n8600\t-93.843553\t32.82913\tGilliam village\tLA\tLouisiana\tCaddo Parish\t159\t42.7\t16.7\t9.3\t15575\t52500\t0.5193\t71029\tRomney\t71029\t0.000446954\t71029.0\n8601\t-93.894573\t32.999788\tIda village\tLA\tLouisiana\tCaddo Parish\t287\t45.0\t7.3\t10.9\t12885\t51304\t0.5193\t71044\tRomney\t71044\t0.0008067660000000001\t71044.0\n8602\t-93.960567\t32.683741\tMooringsport town\tLA\tLouisiana\tCaddo Parish\t771\t37.8\t9.4\t5.7\t18390\t69048\t0.5193\t71060\tRomney\t71060\t0.002167304\t71060.0\n8603\t-93.881355\t32.592063\tBlanchard town\tLA\tLouisiana\tCaddo Parish\t2350\t40.8\t20.5\t5.0\t22456\t133384\t0.5193\t71009\tRomney\t71009\t0.00660592\t71009.0\n8604\t-93.750226\t32.537028\tShreveport city\tLA\tLouisiana\tCaddo Parish\t196828\t35.9\t23.9\t10.4\t19393\t109605\t0.5193\t711HH\tRomney\t711HH\t0.553289397\t0.0\n8605\t-93.992798\t32.973295\tRodessa village\tLA\tLouisiana\tCaddo Parish\t279\t41.8\t3.7\t14.1\t12926\t47273\t0.5193\t71069\tRomney\t71069\t0.000784277\t71069.0\n8606\t-93.97584300000001\t32.745345\tOil City town\tLA\tLouisiana\tCaddo Parish\t1113\t38.2\t6.0\t10.2\t13296\t62105\t0.5193\t71061\tRomney\t71061\t0.003128676\t71061.0\n8607\t-93.88239399999999\t32.885286\tHosston village\tLA\tLouisiana\tCaddo Parish\t348\t41.9\t16.0\t10.3\t15536\t58333\t0.5193\t71043\tRomney\t71043\t0.000978238\t71043.0\n8608\t-93.01299399999999\t30.238794\tIowa town\tLA\tLouisiana\tCalcasieu Parish\t2569\t36.6\t12.8\t7.1\t16160\t95488\t0.34700000000000003\t70647\tRomney\t70647\t0.007221536\t70647.0\n8609\t-93.205422\t30.303776\tMoss Bluff CDP\tLA\tLouisiana\tCalcasieu Parish\t10747\t36.2\t22.9\t7.3\t22348\t140480\t0.34700000000000003\t70611\tRomney\t70611\t0.030210139\t70611.0\n8610\t-93.370535\t30.178110999999998\tCarlyss CDP\tLA\tLouisiana\tCalcasieu Parish\t3999\t34.3\t11.2\t7.1\t21621\t103096\t0.34700000000000003\t70665\tRomney\t70665\t0.011241309\t70665.0\n8611\t-93.21431199999999\t30.20393\tLake Charles city\tLA\tLouisiana\tCalcasieu Parish\t71514\t36.5\t22.1\t8.5\t20207\t112420\t0.34700000000000003\t70601\tRomney\t70601\t0.201027994\t70601.0\n8612\t-93.581797\t30.196137\tVinton town\tLA\tLouisiana\tCalcasieu Parish\t3394\t35.3\t8.3\t9.0\t14588\t73934\t0.34700000000000003\t70668\tRomney\t70668\t0.009540636\t70668.0\n8613\t-93.355367\t30.230590000000003\tSulphur city\tLA\tLouisiana\tCalcasieu Parish\t19882\t37.0\t20.3\t5.5\t20768\t112548\t0.34700000000000003\t70663\tRomney\t70663\t0.055888897\t70663.0\n8614\t-93.26002199999999\t30.251542999999998\tWestlake city\tLA\tLouisiana\tCalcasieu Parish\t4468\t38.1\t10.2\t8.1\t19249\t103839\t0.34700000000000003\t70669\tRomney\t70669\t0.012559681999999999\t70669.0\n8615\t-93.25765600000001\t30.152638\tPrien CDP\tLA\tLouisiana\tCalcasieu Parish\t8400\t35.0\t31.9\t6.5\t30114\t174935\t0.34700000000000003\t70605\tRomney\t70605\t0.023612651000000002\t70605.0\n8616\t-93.446383\t30.448529999999998\tDeQuincy city\tLA\tLouisiana\tCalcasieu Parish\t3326\t36.5\t12.7\t9.7\t15062\t71776\t0.34700000000000003\t70633\tRomney\t70633\t0.009349486\t70633.0\n8617\t-92.07690799999999\t32.102503999999996\tColumbia town\tLA\tLouisiana\tCaldwell Parish\t424\t38.7\t9.2\t7.2\t11315\t69167\t0.2154\t71418\tRomney\t71418\t0.001191877\t71418.0\n8618\t-92.111515\t32.049104\tGrayson village\tLA\tLouisiana\tCaldwell Parish\t512\t40.2\t10.9\t8.4\t16088\t75625\t0.2154\t71415\tRomney\t71415\t0.001439247\t71415.0\n8619\t-92.14081800000001\t32.028822\tClarks village\tLA\tLouisiana\tCaldwell Parish\t985\t34.9\t6.9\t7.0\t14817\t46154\t0.2154\t71415\tRomney\t71415\t0.0027688640000000002\t71415.0\n8620\t-93.42501\t29.953271\tHackberry CDP\tLA\tLouisiana\tCameron Parish\t1716\t41.4\t13.7\t3.7\t18904\t59000\t0.109\t70645\tRomney\t70645\t0.004823727\t70645.0\n8621\t-93.290035\t29.806376\tCameron CDP\tLA\tLouisiana\tCameron Parish\t804\t37.6\t5.6\t4.7\t16499\t50833\t0.109\t70631\tRomney\t70631\t0.002260068\t70631.0\n8622\t-91.659806\t31.849369\tSicily Island village\tLA\tLouisiana\tCatahoula Parish\t437\t35.4\t11.9\t9.9\t11138\t45926\t0.3358\t71368\tRomney\t71368\t0.00122842\t71368.0\n8623\t-91.82982700000001\t31.623866999999997\tJonesville town\tLA\tLouisiana\tCatahoula Parish\t2351\t38.2\t13.6\t12.8\t14290\t47109\t0.3358\t71377\tRomney\t71377\t0.006608731\t71377.0\n8624\t-91.82509\t31.768014\tHarrisonburg village\tLA\tLouisiana\tCatahoula Parish\t748\t34.2\t12.0\t10.6\t16346\t83500\t0.3358\t71340\tRomney\t71340\t0.00210265\t71340.0\n8625\t-93.025633\t32.651352\tAthens village\tLA\tLouisiana\tClaiborne Parish\t259\t41.7\t9.0\t8.5\t15810\t75000\t0.4477\t71003\tRomney\t71003\t0.0007280569999999999\t71003.0\n8626\t-93.137276\t32.967095\tHaynesville town\tLA\tLouisiana\tClaiborne Parish\t2440\t40.1\t12.7\t11.6\t16816\t50833\t0.4477\t71038\tRomney\t71038\t0.006858913\t71038.0\n8627\t-92.867269\t32.789357\tLisbon village\tLA\tLouisiana\tClaiborne Parish\t156\t40.2\t13.3\t3.0\t15660\t51667\t0.4477\t71048\tRomney\t71048\t0.000438521\t71048.0\n8628\t-93.058242\t32.792957\tHomer town\tLA\tLouisiana\tClaiborne Parish\t3360\t37.4\t16.3\t12.4\t12699\t72857\t0.4477\t71040\tRomney\t71040\t0.009445061\t71040.0\n8629\t-91.556051\t31.63458\tFerriday town\tLA\tLouisiana\tConcordia Parish\t3592\t36.7\t10.1\t16.3\t10338\t52596\t0.4086\t71334\tRomney\t71334\t0.010097219000000001\t71334.0\n8630\t-91.537192\t31.722682\tClayton town\tLA\tLouisiana\tConcordia Parish\t779\t33.5\t6.5\t12.9\t9638\t38750\t0.4086\t71326\tRomney\t71326\t0.0021897920000000003\t71326.0\n8631\t-91.58799599999999\t31.621644\tWest Ferriday CDP\tLA\tLouisiana\tConcordia Parish\t1407\t37.8\t12.2\t11.8\t11422\t55238\t0.4086\t71334\tRomney\t71334\t0.003955119\t71334.0\n8632\t-91.530367\t31.601831\tRidgecrest town\tLA\tLouisiana\tConcordia Parish\t759\t40.5\t9.8\t8.5\t12554\t54306\t0.4086\t71334\tRomney\t71334\t0.0021335720000000002\t71334.0\n8633\t-91.440038\t31.567954999999998\tVidalia town\tLA\tLouisiana\tConcordia Parish\t4068\t39.4\t14.2\t8.7\t16943\t83926\t0.4086\t71373\tRomney\t71373\t0.01143527\t71373.0\n8634\t-93.899523\t31.960856\tStanley village\tLA\tLouisiana\tDe Soto Parish\t153\t38.8\t9.9\t10.0\t16212\t77500\t0.4255\t71049\tRomney\t71049\t0.000430088\t71049.0\n8635\t-93.723672\t32.023537\tSouth Mansfield village\tLA\tLouisiana\tDe Soto Parish\t371\t35.7\t6.0\t11.3\t10869\t50000\t0.4255\t71052\tRomney\t71052\t0.001042892\t71052.0\n8636\t-93.99343\t31.975501\tLogansport town\tLA\tLouisiana\tDe Soto Parish\t1619\t37.9\t14.3\t6.9\t14696\t76500\t0.4255\t71049\tRomney\t71049\t0.004551057\t71049.0\n8637\t-93.70045\t32.035647\tMansfield city\tLA\tLouisiana\tDe Soto Parish\t5250\t35.9\t14.7\t12.2\t13007\t76170\t0.4255\t71052\tRomney\t71052\t0.014757906999999999\t71052.0\n8638\t-93.81642099999999\t32.270583\tStonewall town\tLA\tLouisiana\tDe Soto Parish\t1897\t41.1\t13.0\t5.4\t19592\t127778\t0.4255\t71078\tRomney\t71078\t0.005332524\t71078.0\n8639\t-93.91579\t32.171857\tKeachi town\tLA\tLouisiana\tDe Soto Parish\t313\t43.4\t9.6\t6.5\t15333\t98333\t0.4255\t71046\tRomney\t71046\t0.000879852\t71046.0\n8640\t-93.95059\t32.096872999999995\tLongstreet village\tLA\tLouisiana\tDe Soto Parish\t157\t44.8\t9.0\t5.8\t15150\t92500\t0.4255\t71046\tRomney\t71046\t0.00044133199999999995\t71046.0\n8641\t-93.809519\t32.084683\tGrand Cane village\tLA\tLouisiana\tDe Soto Parish\t234\t44.5\t16.2\t4.8\t17695\t100000\t0.4255\t71032\tRomney\t71032\t0.0006577810000000001\t71032.0\n8642\t-91.00609\t30.377609999999997\tOld Jefferson CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t6465\t33.6\t30.2\t5.3\t24144\t145320\t0.518\t70817\tRomney\t70817\t0.018173308\t70817.0\n8643\t-91.157686\t30.583149\tBaker city\tLA\tLouisiana\tEast Baton Rouge Parish\t13293\t33.6\t17.0\t6.6\t17286\t105574\t0.518\t70714\tRomney\t70714\t0.037367021\t70714.0\n8644\t-91.044764\t30.488189000000002\tMonticello CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t5378\t33.9\t28.7\t5.2\t20848\t130919\t0.518\t70814\tRomney\t70814\t0.015117718999999998\t70814.0\n8645\t-91.126548\t30.450699\tBaton Rouge city\tLA\tLouisiana\tEast Baton Rouge Parish\t225493\t31.8\t33.3\t9.0\t20455\t138218\t0.518\t70806\tRomney\t70806\t0.63386757\t70806.0\n8646\t-91.070949\t30.398353999999998\tInniswold CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t6368\t32.7\t42.7\t5.3\t25560\t195804\t0.518\t70809\tRomney\t70809\t0.017900639\t70809.0\n8647\t-91.088698\t30.368979\tOak Hills Place CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t7970\t40.5\t63.1\t4.7\t40928\t272210\t0.518\t70810\tRomney\t70810\t0.022403907999999997\t70810.0\n8648\t-91.160641\t30.665164\tZachary city\tLA\tLouisiana\tEast Baton Rouge Parish\t14281\t36.0\t24.8\t5.7\t22818\t149620\t0.518\t70791\tRomney\t70791\t0.040144318\t70791.0\n8649\t-91.067074\t30.359816\tVillage St. George CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t7566\t36.2\t45.9\t4.8\t30688\t148621\t0.518\t70810\tRomney\t70810\t0.021268252\t70810.0\n8650\t-91.134948\t30.358468\tGardere CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t10489\t25.7\t32.0\t8.3\t16096\t135337\t0.518\t70820\tRomney\t70820\t0.029484892999999998\t70820.0\n8651\t-91.002126\t30.401956\tShenandoah CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t19178\t38.9\t47.4\t4.2\t32772\t218911\t0.518\t70817\tRomney\t70817\t0.053909932\t70817.0\n8652\t-91.09052700000001\t30.408078999999997\tWestminster CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t2389\t46.8\t46.8\t3.6\t30912\t179058\t0.518\t70809\tRomney\t70809\t0.00671555\t70809.0\n8653\t-91.122438\t30.546653999999997\tBrownfields CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t5237\t40.1\t17.7\t4.7\t19714\t116825\t0.518\t70811\tRomney\t70811\t0.014721363999999999\t70811.0\n8654\t-91.108112\t30.499771000000003\tMerrydale CDP\tLA\tLouisiana\tEast Baton Rouge Parish\t9983\t29.7\t15.2\t12.1\t12273\t92220\t0.518\t70812\tRomney\t70812\t0.028062512\t70812.0\n8655\t-91.182487\t32.823899\tLake Providence town\tLA\tLouisiana\tEast Carroll Parish\t4383\t29.8\t17.8\t17.6\t10129\t49783\t0.6183\t71254\tRomney\t71254\t0.012320744\t71254.0\n8656\t-91.11191099999999\t30.968242\tNorwood village\tLA\tLouisiana\tEast Feliciana Parish\t292\t36.8\t14.7\t7.1\t13668\t97500\t0.4553\t70761\tRomney\t70761\t0.000820821\t70761.0\n8657\t-91.1393\t30.721906\tSlaughter village\tLA\tLouisiana\tEast Feliciana Parish\t1071\t36.0\t18.3\t3.0\t22903\t120714\t0.4553\t70777\tRomney\t70777\t0.003010613\t70777.0\n8658\t-91.01498199999999\t30.861341999999997\tClinton town\tLA\tLouisiana\tEast Feliciana Parish\t1793\t37.5\t17.7\t10.6\t15998\t99722\t0.4553\t70722\tRomney\t70722\t0.005040177\t70722.0\n8659\t-91.108995\t30.923519\tWilson village\tLA\tLouisiana\tEast Feliciana Parish\t596\t37.0\t14.8\t7.2\t14850\t103676\t0.4553\t70789\tRomney\t70789\t0.0016753739999999999\t70789.0\n8660\t-91.208186\t30.834836\tJackson town\tLA\tLouisiana\tEast Feliciana Parish\t3808\t36.5\t5.9\t26.2\t14372\t71613\t0.4553\t70748\tRomney\t70748\t0.010704402\t70748.0\n8661\t-92.280213\t30.689878000000004\tVille Platte city\tLA\tLouisiana\tEvangeline Parish\t7747\t34.9\t13.4\t15.4\t10641\t69965\t0.33799999999999997\t70586\tRomney\t70586\t0.021777049\t70586.0\n8662\t-92.591411\t30.485684999999997\tBasile town\tLA\tLouisiana\tEvangeline Parish\t2349\t33.5\t5.5\t7.3\t12209\t52174\t0.33799999999999997\t70515\tRomney\t70515\t0.006603109\t70515.0\n8663\t-92.417888\t30.634840999999998\tMamou town\tLA\tLouisiana\tEvangeline Parish\t3614\t37.8\t9.5\t12.4\t11207\t55493\t0.33799999999999997\t70554\tRomney\t70554\t0.010159062\t70554.0\n8664\t-92.422392\t30.783414\tPine Prairie village\tLA\tLouisiana\tEvangeline Parish\t1071\t36.0\t5.2\t4.4\t14343\t67500\t0.33799999999999997\t70576\tRomney\t70576\t0.003010613\t70576.0\n8665\t-92.41694100000001\t30.873296000000003\tTurkey Creek village\tLA\tLouisiana\tEvangeline Parish\t376\t35.2\t6.3\t5.2\t14296\t72143\t0.33799999999999997\t70585\tRomney\t70585\t0.001056947\t70585.0\n8666\t-92.31687600000001\t30.569563\tChataignier village\tLA\tLouisiana\tEvangeline Parish\t419\t34.6\t5.9\t7.6\t10544\t73333\t0.33799999999999997\t70524\tRomney\t70524\t0.001177822\t70524.0\n8667\t-91.655075\t31.980383000000003\tWisner town\tLA\tLouisiana\tFranklin Parish\t961\t40.0\t11.3\t11.3\t12807\t57857\t0.3129\t71336\tRomney\t71336\t0.0027014\t71336.0\n8668\t-91.655976\t32.05048\tGilbert village\tLA\tLouisiana\tFranklin Parish\t554\t40.3\t11.4\t13.1\t15034\t55625\t0.3129\t71336\tRomney\t71336\t0.001557311\t71336.0\n8669\t-91.721338\t32.164716\tWinnsboro city\tLA\tLouisiana\tFranklin Parish\t4662\t35.1\t13.3\t11.1\t10808\t57705\t0.3129\t71295\tRomney\t71295\t0.013105021000000001\t71295.0\n8670\t-91.74730600000001\t32.259131\tBaskin village\tLA\tLouisiana\tFranklin Parish\t172\t39.8\t9.6\t10.3\t14004\t62143\t0.3129\t71219\tRomney\t71219\t0.000483497\t71219.0\n8671\t-92.887276\t31.667778000000002\tMontgomery town\tLA\tLouisiana\tGrant Parish\t751\t40.2\t6.0\t13.0\t14290\t60333\t0.1641\t71454\tRomney\t71454\t0.0021110829999999997\t71454.0\n8672\t-92.382049\t31.759574\tGeorgetown village\tLA\tLouisiana\tGrant Parish\t367\t38.0\t7.0\t3.8\t17665\t61250\t0.1641\t71432\tRomney\t71432\t0.001031648\t71432.0\n8673\t-92.70026999999999\t31.520757\tColfax town\tLA\tLouisiana\tGrant Parish\t1665\t38.4\t10.9\t9.2\t11764\t66625\t0.1641\t71417\tRomney\t71417\t0.004680365\t71417.0\n8674\t-92.53084399999999\t31.580708\tDry Prong village\tLA\tLouisiana\tGrant Parish\t472\t40.7\t13.4\t11.0\t18757\t92273\t0.1641\t71423\tRomney\t71423\t0.001326806\t71423.0\n8675\t-92.408355\t31.525052000000002\tPollock town\tLA\tLouisiana\tGrant Parish\t390\t38.4\t14.4\t8.5\t16144\t93333\t0.1641\t71467\tRomney\t71467\t0.001096302\t71467.0\n8676\t-91.737775\t30.059358000000003\tLoreauville village\tLA\tLouisiana\tIberia Parish\t977\t34.5\t8.7\t8.3\t15375\t86905\t0.3633\t70552\tRomney\t70552\t0.0027463759999999996\t70552.0\n8677\t-91.818671\t30.004440999999996\tNew Iberia city\tLA\tLouisiana\tIberia Parish\t32845\t35.3\t13.9\t11.2\t15022\t96881\t0.3633\t70560\tRomney\t70560\t0.09232827800000001\t70560.0\n8678\t-91.675124\t29.915757\tJeanerette city\tLA\tLouisiana\tIberia Parish\t5674\t33.5\t9.9\t18.0\t13112\t63109\t0.3633\t70544\tRomney\t70544\t0.015949783999999998\t70544.0\n8679\t-91.781361\t29.926095\tLydia CDP\tLA\tLouisiana\tIberia Parish\t1089\t38.2\t4.4\t5.0\t17874\t87000\t0.3633\t70560\tRomney\t70560\t0.0030612120000000002\t70560.0\n8680\t-91.242713\t30.283719\tPlaquemine city\tLA\tLouisiana\tIberville Parish\t6825\t39.0\t11.9\t10.3\t16300\t108443\t0.5612\t70764\tRomney\t70764\t0.019185279\t70764.0\n8681\t-91.10213900000001\t30.252679999999998\tSt. Gabriel town\tLA\tLouisiana\tIberville Parish\t5510\t34.2\t8.9\t6.3\t15116\t102140\t0.5612\t70776\tRomney\t70776\t0.015488775\t70776.0\n8682\t-91.460113\t30.442894\tRosedale village\tLA\tLouisiana\tIberville Parish\t690\t37.2\t12.7\t4.8\t16751\t105114\t0.5612\t70772\tRomney\t70772\t0.0019396110000000002\t70772.0\n8683\t-91.149529\t30.160937\tWhite Castle town\tLA\tLouisiana\tIberville Parish\t1880\t37.4\t7.1\t9.2\t14010\t95870\t0.5612\t70788\tRomney\t70788\t0.005284736\t70788.0\n8684\t-91.518671\t30.490728000000004\tMaringouin town\tLA\tLouisiana\tIberville Parish\t1160\t34.5\t11.0\t9.7\t10760\t85192\t0.5612\t70757\tRomney\t70757\t0.003260795\t70757.0\n8685\t-91.43733\t30.415838\tGrosse Tete village\tLA\tLouisiana\tIberville Parish\t696\t39.2\t7.5\t6.8\t16900\t85000\t0.5612\t70740\tRomney\t70740\t0.0019564770000000003\t70740.0\n8686\t-92.714157\t32.277547999999996\tEast Hodge village\tLA\tLouisiana\tJackson Parish\t324\t35.8\t10.2\t11.3\t13315\t58750\t0.3061\t71247\tRomney\t71247\t0.0009107739999999999\t71247.0\n8687\t-92.717214\t32.284549\tNorth Hodge village\tLA\tLouisiana\tJackson Parish\t385\t36.0\t9.8\t10.9\t13317\t58000\t0.3061\t71247\tRomney\t71247\t0.001082247\t71247.0\n8688\t-92.708054\t32.237327\tJonesboro town\tLA\tLouisiana\tJackson Parish\t3650\t39.7\t12.6\t9.4\t14420\t67617\t0.3061\t71251\tRomney\t71251\t0.010260259\t71251.0\n8689\t-92.423936\t32.392559000000006\tEros town\tLA\tLouisiana\tJackson Parish\t213\t42.3\t8.0\t2.4\t14988\t63333\t0.3061\t71238\tRomney\t71238\t0.000598749\t71238.0\n8690\t-92.723547\t32.350707\tQuitman village\tLA\tLouisiana\tJackson Parish\t179\t39.8\t16.4\t4.8\t21758\t97500\t0.3061\t71268\tRomney\t71268\t0.000503174\t71268.0\n8691\t-92.45203599999999\t32.309373\tChatham town\tLA\tLouisiana\tJackson Parish\t571\t36.9\t15.5\t11.1\t12948\t46579\t0.3061\t71226\tRomney\t71226\t0.001605098\t71226.0\n8692\t-92.730411\t32.271932\tHodge village\tLA\tLouisiana\tJackson Parish\t477\t41.5\t17.4\t9.7\t17949\t81429\t0.3061\t71247\tRomney\t71247\t0.001340861\t71247.0\n8693\t-90.113991\t29.885539\tMarrero CDP\tLA\tLouisiana\tJefferson Parish\t34738\t35.9\t8.9\t7.7\t15858\t102708\t0.3991\t70072\tRomney\t70072\t0.097649557\t70072.0\n8694\t-90.053321\t29.914551\tGretna city\tLA\tLouisiana\tJefferson Parish\t16003\t36.8\t13.3\t7.8\t17453\t105801\t0.3991\t70053\tRomney\t70053\t0.044984912\t70053.0\n8695\t-90.235438\t29.937306\tWaggaman CDP\tLA\tLouisiana\tJefferson Parish\t10349\t34.6\t8.2\t7.9\t15525\t89177\t0.3991\t70123\tRomney\t70123\t0.029091349\t70123.0\n8696\t-90.033375\t29.879210999999998\tTimberlane CDP\tLA\tLouisiana\tJefferson Parish\t11499\t37.4\t20.8\t5.4\t23676\t135319\t0.3991\t70056\tRomney\t70056\t0.032324032999999995\t70056.0\n8697\t-90.25508\t30.010612\tKenner city\tLA\tLouisiana\tJefferson Parish\t66411\t36.3\t22.8\t6.8\t21442\t147818\t0.3991\t70065\tRomney\t70065\t0.18668330800000002\t70065.0\n8698\t-90.10285999999999\t29.715495\tLafitte CDP\tLA\tLouisiana\tJefferson Parish\t1442\t40.2\t7.6\t5.8\t16971\t101202\t0.3991\t70036\tRomney\t70036\t0.004053505\t70036.0\n8699\t-90.194251\t29.907244\tAvondale CDP\tLA\tLouisiana\tJefferson Parish\t5183\t33.9\t4.0\t6.5\t15365\t81156\t0.3991\t70094\tRomney\t70094\t0.014569568\t70094.0\n8700\t-90.159377\t29.931946999999997\tBridge City CDP\tLA\tLouisiana\tJefferson Parish\t8226\t32.2\t4.3\t11.7\t11616\t71983\t0.3991\t70094\tRomney\t70094\t0.023123532000000002\t70094.0\n8701\t-90.187839\t29.955078999999998\tElmwood CDP\tLA\tLouisiana\tJefferson Parish\t3877\t31.2\t57.5\t5.3\t35074\t146552\t0.3991\t70123\tRomney\t70123\t0.010898363000000001\t70123.0\n8702\t-89.992401\t29.237607\tGrand Isle town\tLA\tLouisiana\tJefferson Parish\t1243\t43.4\t14.6\t5.3\t19188\t86351\t0.3991\t70358\tRomney\t70358\t0.00349411\t70358.0\n8703\t-90.17808199999999\t29.997642\tMetairie CDP\tLA\tLouisiana\tJefferson Parish\t136527\t42.2\t32.1\t5.9\t26213\t188085\t0.3991\t70001\tRomney\t70001\t0.383781482\t70001.0\n8704\t-90.027975\t29.901621999999996\tTerrytown CDP\tLA\tLouisiana\tJefferson Parish\t23047\t32.7\t20.0\t6.9\t18551\t132264\t0.3991\t70056\tRomney\t70056\t0.064785807\t70056.0\n8705\t-90.07514499999999\t29.849282000000002\tWoodmere CDP\tLA\tLouisiana\tJefferson Parish\t12794\t30.9\t18.8\t6.7\t16321\t118375\t0.3991\t70058\tRomney\t70058\t0.035964317\t70058.0\n8706\t-90.203342\t29.937547\tHarahan city\tLA\tLouisiana\tJefferson Parish\t9194\t45.2\t26.2\t4.0\t24778\t184051\t0.3991\t70123\tRomney\t70123\t0.025844608999999998\t70123.0\n8707\t-90.100473\t29.843445000000003\tEstelle CDP\tLA\tLouisiana\tJefferson Parish\t16487\t34.0\t13.6\t4.7\t20080\t116387\t0.3991\t70072\tRomney\t70072\t0.04634545\t70072.0\n8708\t-90.12178\t29.708797999999998\tBarataria CDP\tLA\tLouisiana\tJefferson Parish\t1632\t43.9\t12.4\t5.3\t15274\t118667\t0.3991\t70036\tRomney\t70036\t0.004587601\t70036.0\n8709\t-90.066645\t29.887487\tHarvey CDP\tLA\tLouisiana\tJefferson Parish\t20354\t34.0\t16.0\t8.7\t16898\t119934\t0.3991\t70058\tRomney\t70058\t0.057215703\t70058.0\n8710\t-90.220279\t29.959422999999997\tRiver Ridge CDP\tLA\tLouisiana\tJefferson Parish\t13678\t44.5\t33.5\t5.4\t28636\t210484\t0.3991\t70123\tRomney\t70123\t0.038449267\t70123.0\n8711\t-90.103521\t29.749552\tJean Lafitte town\tLA\tLouisiana\tJefferson Parish\t2535\t37.1\t5.9\t5.6\t16380\t102423\t0.3991\t70036\tRomney\t70036\t0.007125961\t70036.0\n8712\t-90.14331800000001\t29.905860999999998\tWestwego city\tLA\tLouisiana\tJefferson Parish\t10379\t36.5\t6.0\t7.1\t14885\t90084\t0.3991\t70094\tRomney\t70094\t0.02917568\t70094.0\n8713\t-90.155969\t29.961058\tJefferson CDP\tLA\tLouisiana\tJefferson Parish\t11190\t41.7\t22.6\t5.8\t22145\t138215\t0.3991\t70121\tRomney\t70121\t0.031455425\t70121.0\n8714\t-92.677285\t30.079506\tLake Arthur town\tLA\tLouisiana\tJefferson Davis Parish\t2792\t37.4\t8.0\t8.6\t14993\t67208\t0.2537\t70549\tRomney\t70549\t0.007848396\t70549.0\n8715\t-92.658702\t30.223146999999997\tJennings city\tLA\tLouisiana\tJefferson Davis Parish\t10595\t36.1\t12.8\t8.7\t14329\t83843\t0.2537\t70546\tRomney\t70546\t0.029782862\t70546.0\n8716\t-92.916474\t30.363757\tFenton village\tLA\tLouisiana\tJefferson Davis Parish\t351\t37.0\t8.6\t4.0\t14427\t88333\t0.2537\t70640\tRomney\t70640\t0.000986672\t70640.0\n8717\t-92.81318\t30.235646999999997\tWelsh town\tLA\tLouisiana\tJefferson Davis Parish\t3194\t37.3\t12.3\t6.1\t15064\t77500\t0.2537\t70591\tRomney\t70591\t0.00897843\t70591.0\n8718\t-92.697599\t30.481187\tElton town\tLA\tLouisiana\tJefferson Davis Parish\t1161\t35.8\t10.4\t7.0\t12842\t55444\t0.2537\t70532\tRomney\t70532\t0.0032636059999999996\t70532.0\n8719\t-92.090396\t30.239490999999997\tScott city\tLA\tLouisiana\tLafayette Parish\t8702\t32.5\t19.3\t6.1\t18984\t115521\t0.3221\t70583\tRomney\t70583\t0.024461582000000003\t70583.0\n8720\t-92.04009\t30.309241999999998\tCarencro city\tLA\tLouisiana\tLafayette Parish\t6765\t32.2\t11.7\t7.7\t14822\t107388\t0.3221\t70520\tRomney\t70520\t0.019016617\t70520.0\n8721\t-91.993579\t30.097458000000003\tYoungsville town\tLA\tLouisiana\tLafayette Parish\t5682\t32.3\t28.1\t4.8\t26297\t163568\t0.3221\t70592\tRomney\t70592\t0.015972272\t70592.0\n8722\t-91.926994\t30.135371000000003\tBroussard town\tLA\tLouisiana\tLafayette Parish\t6931\t33.3\t22.9\t6.5\t21166\t137910\t0.3221\t70518\tRomney\t70518\t0.019483248\t70518.0\n8723\t-92.18235\t30.244465\tDuson town\tLA\tLouisiana\tLafayette Parish\t1825\t35.4\t7.9\t8.3\t13600\t69318\t0.3221\t70529\tRomney\t70529\t0.00513013\t70529.0\n8724\t-92.031615\t30.213189\tLafayette city\tLA\tLouisiana\tLafayette Parish\t115453\t34.4\t33.8\t6.1\t23234\t149862\t0.3221\t70506\tRomney\t70506\t0.324541837\t70506.0\n8725\t-90.375986\t29.567094\tLarose CDP\tLA\tLouisiana\tLafourche Parish\t7341\t38.0\t11.3\t4.3\t17257\t119379\t0.2463\t70345\tRomney\t70345\t0.020635771\t70345.0\n8726\t-90.817279\t29.794369\tThibodaux city\tLA\tLouisiana\tLafourche Parish\t14312\t33.7\t24.5\t7.0\t19163\t120434\t0.2463\t70301\tRomney\t70301\t0.04023146\t70301.0\n8727\t-90.53795600000001\t29.641732\tLockport town\tLA\tLouisiana\tLafourche Parish\t2474\t38.4\t12.9\t4.9\t16574\t99556\t0.2463\t70374\tRomney\t70374\t0.006954488000000001\t70374.0\n8728\t-90.63631600000001\t29.7283\tRaceland CDP\tLA\tLouisiana\tLafourche Parish\t10437\t38.2\t11.8\t5.4\t16810\t112785\t0.2463\t70394\tRomney\t70394\t0.029338719\t70394.0\n8729\t-90.30906800000001\t29.446787\tGalliano CDP\tLA\tLouisiana\tLafourche Parish\t7770\t37.0\t7.7\t6.7\t15348\t107123\t0.2463\t70354\tRomney\t70354\t0.021841702\t70354.0\n8730\t-90.329051\t29.516037\tCut Off CDP\tLA\tLouisiana\tLafourche Parish\t5368\t38.8\t10.8\t3.4\t18355\t129229\t0.2463\t70345\tRomney\t70345\t0.015089608999999999\t70345.0\n8731\t-90.555948\t29.682184999999997\tMathews CDP\tLA\tLouisiana\tLafourche Parish\t1939\t38.0\t15.3\t4.1\t20704\t132673\t0.2463\t70375\tRomney\t70375\t0.005450587\t70375.0\n8732\t-90.806657\t29.881667999999998\tChackbay CDP\tLA\tLouisiana\tLafourche Parish\t4510\t35.8\t5.8\t6.4\t17130\t118199\t0.2463\t70301\tRomney\t70301\t0.012677745\t70301.0\n8733\t-90.273847\t29.387649\tGolden Meadow town\tLA\tLouisiana\tLafourche Parish\t2116\t38.6\t9.2\t5.1\t14722\t87895\t0.2463\t70354\tRomney\t70354\t0.005948139\t70354.0\n8734\t-92.290818\t31.862796000000003\tUrania town\tLA\tLouisiana\tLa Salle Parish\t674\t34.1\t7.9\t6.7\t13823\t38077\t0.1163\t71480\tRomney\t71480\t0.0018946339999999999\t71480.0\n8735\t-92.23830600000001\t31.900332000000002\tOlla town\tLA\tLouisiana\tLa Salle Parish\t1357\t37.9\t12.9\t6.6\t14862\t57500\t0.1163\t71465\tRomney\t71465\t0.003814568\t71465.0\n8736\t-92.15094\t31.680138\tMidway CDP\tLA\tLouisiana\tLa Salle Parish\t1427\t35.8\t11.1\t7.2\t12384\t60000\t0.1163\t71342\tRomney\t71342\t0.00401134\t71342.0\n8737\t-92.328501\t31.823805\tTullos town\tLA\tLouisiana\tLa Salle Parish\t399\t42.4\t8.0\t5.3\t17060\t37500\t0.1163\t71479\tRomney\t71479\t0.001121601\t71479.0\n8738\t-92.129713\t31.691337\tJena town\tLA\tLouisiana\tLa Salle Parish\t2841\t42.5\t18.3\t5.1\t17750\t82197\t0.1163\t71342\tRomney\t71342\t0.007986136\t71342.0\n8739\t-92.514247\t32.531921999999994\tChoudrant village\tLA\tLouisiana\tLincoln Parish\t573\t37.3\t20.4\t4.1\t19912\t83462\t0.4189\t71227\tRomney\t71227\t0.00161072\t71227.0\n8740\t-92.784033\t32.532495000000004\tSimsboro village\tLA\tLouisiana\tLincoln Parish\t695\t35.0\t21.3\t6.0\t16678\t78333\t0.4189\t71275\tRomney\t71275\t0.001953666\t71275.0\n8741\t-92.656315\t32.698747\tDubach town\tLA\tLouisiana\tLincoln Parish\t810\t35.7\t16.7\t7.5\t14163\t66429\t0.4189\t71235\tRomney\t71235\t0.002276934\t71235.0\n8742\t-92.63862900000001\t32.532\tRuston city\tLA\tLouisiana\tLincoln Parish\t20460\t25.0\t39.3\t9.3\t16778\t115293\t0.4189\t71270\tRomney\t71270\t0.057513672\t71270.0\n8743\t-92.64813199999999\t32.609057\tVienna town\tLA\tLouisiana\tLincoln Parish\t448\t39.2\t32.8\t3.8\t22099\t132955\t0.4189\t71235\tRomney\t71235\t0.001259341\t71235.0\n8744\t-92.712119\t32.52796\tGrambling town\tLA\tLouisiana\tLincoln Parish\t4429\t26.8\t44.4\t12.5\t14372\t112326\t0.4189\t71245\tRomney\t71245\t0.012450052\t71245.0\n8745\t-90.584827\t30.502494\tAlbany village\tLA\tLouisiana\tLivingston Parish\t1120\t33.6\t12.8\t7.3\t15910\t120192\t0.1378\t70711\tRomney\t70711\t0.0031483540000000003\t70711.0\n8746\t-90.81014\t30.315822999999998\tFrench Settlement village\tLA\tLouisiana\tLivingston Parish\t1163\t38.3\t6.9\t7.1\t18733\t139474\t0.1378\t70733\tRomney\t70733\t0.003269228\t70733.0\n8747\t-90.841966\t30.337922\tPort Vincent village\tLA\tLouisiana\tLivingston Parish\t646\t35.9\t8.6\t6.1\t19069\t129464\t0.1378\t70733\tRomney\t70733\t0.001815925\t70733.0\n8748\t-90.959351\t30.477113\tDenham Springs city\tLA\tLouisiana\tLivingston Parish\t9976\t37.0\t15.7\t5.4\t19977\t144233\t0.1378\t70726\tRomney\t70726\t0.028042834\t70726.0\n8749\t-90.544193\t30.425428000000004\tSpringfield town\tLA\tLouisiana\tLivingston Parish\t451\t41.5\t14.9\t6.9\t16062\t121591\t0.1378\t70462\tRomney\t70462\t0.001267774\t70462.0\n8750\t-90.746399\t30.495411999999998\tLivingston town\tLA\tLouisiana\tLivingston Parish\t1450\t35.5\t10.5\t7.4\t15563\t128125\t0.1378\t70754\tRomney\t70754\t0.004075993\t70754.0\n8751\t-90.578271\t30.352889\tKillian village\tLA\tLouisiana\tLivingston Parish\t1388\t43.2\t12.5\t5.1\t18233\t143452\t0.1378\t70462\tRomney\t70462\t0.00390171\t70462.0\n8752\t-90.868122\t30.485733000000003\tWalker town\tLA\tLouisiana\tLivingston Parish\t6489\t33.1\t10.8\t4.5\t18826\t147260\t0.1378\t70785\tRomney\t70785\t0.018240773000000002\t70785.0\n8753\t-90.931942\t32.324199\tDelta village\tLA\tLouisiana\tMadison Parish\t204\t38.8\t8.9\t10.1\t17342\t64000\t0.6081\t71282\tRomney\t71282\t0.00057345\t71282.0\n8754\t-91.191423\t32.406894\tTallulah city\tLA\tLouisiana\tMadison Parish\t8331\t29.6\t13.2\t11.6\t10594\t56880\t0.6081\t71282\tRomney\t71282\t0.02341869\t71282.0\n8755\t-91.18119399999999\t32.388932000000004\tRichmond village\tLA\tLouisiana\tMadison Parish\t478\t43.2\t27.4\t9.2\t20260\t105357\t0.6081\t71282\tRomney\t71282\t0.0013436720000000002\t71282.0\n8756\t-91.022666\t32.336728\tMound village\tLA\tLouisiana\tMadison Parish\t10\t0.0\t0.0\t16.7\t17836\t0\t0.6081\t71282\tRomney\t71282\t2.8100000000000002e-05\t71282.0\n8757\t-91.871812\t32.689293\tCollinston village\tLA\tLouisiana\tMorehouse Parish\t325\t36.6\t11.3\t10.2\t15309\t42941\t0.4668\t71229\tRomney\t71229\t0.000913585\t71229.0\n8758\t-91.90839\t32.774868\tBastrop city\tLA\tLouisiana\tMorehouse Parish\t11731\t35.1\t11.8\t20.3\t12680\t53884\t0.4668\t71220\tRomney\t71220\t0.032976192\t71220.0\n8759\t-91.795723\t32.777063\tMer Rouge village\tLA\tLouisiana\tMorehouse Parish\t588\t38.6\t19.3\t19.1\t16210\t58611\t0.4668\t71261\tRomney\t71261\t0.0016528860000000001\t71261.0\n8760\t-91.675014\t32.920526\tBonita village\tLA\tLouisiana\tMorehouse Parish\t325\t42.8\t4.8\t23.7\t14715\t36250\t0.4668\t71223\tRomney\t71223\t0.000913585\t71223.0\n8761\t-91.773116\t32.624427000000004\tOak Ridge village\tLA\tLouisiana\tMorehouse Parish\t113\t43.3\t18.5\t21.7\t14960\t81667\t0.4668\t71264\tRomney\t71264\t0.000317646\t71264.0\n8762\t-93.02932\t31.819767\tClarence village\tLA\tLouisiana\tNatchitoches Parish\t462\t36.9\t12.1\t8.1\t14220\t78000\t0.4602\t71414\tRomney\t71414\t0.001298696\t71414.0\n8763\t-93.30320999999999\t31.692225\tRobeline village\tLA\tLouisiana\tNatchitoches Parish\t188\t42.1\t15.8\t7.8\t14344\t51667\t0.4602\t71469\tRomney\t71469\t0.000528474\t71469.0\n8764\t-93.115705\t31.897883\tCampti town\tLA\tLouisiana\tNatchitoches Parish\t1064\t32.3\t8.5\t11.4\t11963\t56304\t0.4602\t71411\tRomney\t71411\t0.0029909359999999996\t71411.0\n8765\t-93.117113\t32.116234000000006\tAshland village\tLA\tLouisiana\tNatchitoches Parish\t268\t44.6\t17.4\t3.3\t16331\t48571\t0.4602\t71002\tRomney\t71002\t0.0007533560000000001\t71002.0\n8766\t-93.20313900000001\t31.873723\tPowhatan village\tLA\tLouisiana\tNatchitoches Parish\t148\t34.8\t9.5\t7.2\t16709\t85000\t0.4602\t71066\tRomney\t71066\t0.000416032\t71066.0\n8767\t-92.916226\t32.019513\tGoldonna village\tLA\tLouisiana\tNatchitoches Parish\t484\t39.8\t9.3\t12.0\t15388\t48571\t0.4602\t71031\tRomney\t71031\t0.001360538\t71031.0\n8768\t-93.045576\t31.674293\tNatchez village\tLA\tLouisiana\tNatchitoches Parish\t574\t36.4\t18.5\t7.8\t15424\t107031\t0.4602\t71456\tRomney\t71456\t0.001613531\t71456.0\n8769\t-93.19991800000001\t31.654728000000002\tProvencal village\tLA\tLouisiana\tNatchitoches Parish\t665\t35.1\t22.8\t7.4\t16891\t77083\t0.4602\t71469\tRomney\t71469\t0.001869335\t71469.0\n8770\t-93.097954\t31.729853000000002\tNatchitoches city\tLA\tLouisiana\tNatchitoches Parish\t18530\t26.1\t25.6\t11.9\t15678\t112032\t0.4602\t71457\tRomney\t71457\t0.052088384\t71457.0\n8771\t-89.931472\t30.068615\tNew Orleans city\tLA\tLouisiana\tOrleans Parish\t351222\t34.7\t29.3\t10.0\t17705\t128103\t0.8029999999999999\t70128\tRomney\t70128\t0.98729555\t70128.0\n8772\t-92.076665\t32.520346\tMonroe city\tLA\tLouisiana\tOuachita Parish\t51417\t30.8\t29.6\t11.5\t17493\t98240\t0.3891\t71201\tRomney\t71201\t0.144534725\t71201.0\n8773\t-92.07548\t32.449702\tRichwood town\tLA\tLouisiana\tOuachita Parish\t2114\t28.5\t9.0\t19.0\t9522\t54545\t0.3891\t71202\tRomney\t71202\t0.005942517\t71202.0\n8774\t-92.063366\t32.693034999999995\tSterlington town\tLA\tLouisiana\tOuachita Parish\t1205\t33.4\t22.7\t10.0\t18654\t73571\t0.3891\t71280\tRomney\t71280\t0.0033872909999999997\t71280.0\n8775\t-91.986632\t32.602531\tSwartz CDP\tLA\tLouisiana\tOuachita Parish\t4480\t35.5\t27.3\t4.0\t19417\t120991\t0.3891\t712HH\tRomney\t712HH\t0.012593413999999999\t0.0\n8776\t-92.164986\t32.479773\tBrownsville-Bawcomville CDP\tLA\tLouisiana\tOuachita Parish\t7760\t36.7\t5.5\t9.9\t13380\t59355\t0.3891\t71292\tRomney\t71292\t0.021813592000000003\t71292.0\n8777\t-92.19770600000001\t32.53753\tClaiborne CDP\tLA\tLouisiana\tOuachita Parish\t11213\t35.8\t27.8\t6.9\t23700\t124799\t0.3891\t71291\tRomney\t71291\t0.031520078\t71291.0\n8778\t-92.150503\t32.512213\tWest Monroe city\tLA\tLouisiana\tOuachita Parish\t12846\t36.4\t23.5\t10.0\t17931\t96650\t0.3891\t71291\tRomney\t71291\t0.03611049\t71291.0\n8779\t-90.00712\t29.847108000000002\tBelle Chasse CDP\tLA\tLouisiana\tPlaquemines Parish\t12027\t33.3\t16.6\t5.3\t22565\t188310\t0.3515\t70037\tRomney\t70037\t0.033808257\t70037.0\n8780\t-89.719999\t29.504099\tPort Sulphur CDP\tLA\tLouisiana\tPlaquemines Parish\t2202\t36.6\t5.5\t7.2\t15474\t67719\t0.3515\t70083\tRomney\t70083\t0.006189888\t70083.0\n8781\t-89.610396\t29.413213\tEmpire CDP\tLA\tLouisiana\tPlaquemines Parish\t961\t37.3\t13.5\t9.8\t13200\t56296\t0.3515\t70050\tRomney\t70050\t0.0027014\t70050.0\n8782\t-89.512937\t29.348287\tBuras-Triumph CDP\tLA\tLouisiana\tPlaquemines Parish\t2828\t32.9\t4.0\t9.6\t15923\t41979\t0.3515\t70041\tRomney\t70041\t0.007949593000000001\t70041.0\n8783\t-89.393788\t29.320673\tBoothville-Venice CDP\tLA\tLouisiana\tPlaquemines Parish\t1197\t32.3\t3.5\t6.2\t17035\t53158\t0.3515\t70038\tRomney\t70038\t0.003364803\t70038.0\n8784\t-91.617767\t30.593971999999997\tFordoche town\tLA\tLouisiana\tPointe Coupee Parish\t896\t38.6\t6.3\t5.7\t18294\t109756\t0.4475\t70732\tRomney\t70732\t0.002518683\t70732.0\n8785\t-91.59196800000001\t30.738286\tMorganza village\tLA\tLouisiana\tPointe Coupee Parish\t656\t41.6\t20.4\t5.3\t18318\t125000\t0.4475\t70759\tRomney\t70759\t0.001844036\t70759.0\n8786\t-91.453858\t30.695801\tNew Roads city\tLA\tLouisiana\tPointe Coupee Parish\t4887\t40.5\t21.7\t12.4\t15974\t106362\t0.4475\t70760\tRomney\t70760\t0.013737503\t70760.0\n8787\t-91.55096400000001\t30.562487\tLivonia town\tLA\tLouisiana\tPointe Coupee Parish\t1296\t37.3\t8.2\t5.7\t18015\t100791\t0.4475\t70755\tRomney\t70755\t0.003643095\t70755.0\n8788\t-92.289524\t31.011155\tCheneyville town\tLA\tLouisiana\tRapides Parish\t895\t39.5\t15.2\t15.2\t11978\t49286\t0.3455\t71325\tRomney\t71325\t0.002515872\t71325.0\n8789\t-92.398649\t31.089664000000003\tLecompte town\tLA\tLouisiana\tRapides Parish\t1377\t36.0\t12.6\t11.5\t10930\t65263\t0.3455\t71346\tRomney\t71346\t0.003870788\t71346.0\n8790\t-92.151852\t31.349048\tDeville CDP\tLA\tLouisiana\tRapides Parish\t1152\t38.1\t11.6\t3.8\t16562\t103030\t0.3455\t71328\tRomney\t71328\t0.003238306\t71328.0\n8791\t-92.49965999999999\t31.154922999999997\tWoodworth town\tLA\tLouisiana\tRapides Parish\t1202\t34.9\t17.2\t5.5\t19245\t111607\t0.3455\t71485\tRomney\t71485\t0.0033788579999999998\t71485.0\n8792\t-92.411735\t31.340949\tPineville city\tLA\tLouisiana\tRapides Parish\t14215\t37.5\t22.9\t7.1\t19867\t105336\t0.3455\t71360\tRomney\t71360\t0.03995879\t71360.0\n8793\t-92.66988\t31.390897\tBoyce town\tLA\tLouisiana\tRapides Parish\t1198\t30.6\t8.7\t8.4\t10300\t54310\t0.3455\t71409\tRomney\t71409\t0.003367614\t71409.0\n8794\t-92.468102\t31.294024\tAlexandria city\tLA\tLouisiana\tRapides Parish\t46603\t37.4\t20.5\t8.2\t17408\t107282\t0.3455\t71301\tRomney\t71301\t0.131002427\t71301.0\n8795\t-92.52492\t31.047884000000003\tForest Hill village\tLA\tLouisiana\tRapides Parish\t479\t39.0\t18.6\t2.9\t16893\t99583\t0.3455\t71430\tRomney\t71430\t0.0013464829999999999\t71430.0\n8796\t-92.579114\t30.989051\tMcNary village\tLA\tLouisiana\tRapides Parish\t222\t39.5\t9.6\t5.4\t14748\t63000\t0.3455\t71433\tRomney\t71433\t0.000624049\t71433.0\n8797\t-92.407924\t31.418951\tBall town\tLA\tLouisiana\tRapides Parish\t3689\t35.8\t12.4\t4.4\t16777\t101677\t0.3455\t71360\tRomney\t71360\t0.010369889\t71360.0\n8798\t-92.58243399999999\t30.973235\tGlenmora town\tLA\tLouisiana\tRapides Parish\t1599\t36.2\t11.4\t7.4\t12752\t60000\t0.3455\t71433\tRomney\t71433\t0.004494837\t71433.0\n8799\t-93.219375\t32.098174\tMartin village\tLA\tLouisiana\tRed River Parish\t550\t34.6\t6.4\t6.1\t14977\t64444\t0.4687\t71019\tRomney\t71019\t0.001546066\t71019.0\n8800\t-93.33605899999999\t32.050062\tEdgefield village\tLA\tLouisiana\tRed River Parish\t255\t41.2\t14.7\t12.5\t17535\t83125\t0.4687\t71019\tRomney\t71019\t0.0007168130000000001\t71019.0\n8801\t-93.305529\t32.176764\tHall Summit village\tLA\tLouisiana\tRed River Parish\t228\t41.1\t10.8\t8.3\t15103\t70000\t0.4687\t71034\tRomney\t71034\t0.000640915\t71034.0\n8802\t-93.34065\t32.025667\tCoushatta town\tLA\tLouisiana\tRed River Parish\t2372\t32.6\t10.4\t18.1\t12027\t68548\t0.4687\t71019\tRomney\t71019\t0.006667763\t71019.0\n8803\t-91.49069200000001\t32.454017\tDelhi town\tLA\tLouisiana\tRichland Parish\t2891\t38.7\t12.7\t10.8\t13920\t66867\t0.3631\t71232\tRomney\t71232\t0.008126686999999999\t71232.0\n8804\t-91.756036\t32.470644\tRayville town\tLA\tLouisiana\tRichland Parish\t4260\t33.8\t15.8\t14.6\t11515\t72400\t0.3631\t71269\tRomney\t71269\t0.011974987\t71269.0\n8805\t-91.779404\t32.308547999999995\tMangham town\tLA\tLouisiana\tRichland Parish\t570\t40.0\t13.8\t5.4\t15486\t66765\t0.3631\t71259\tRomney\t71259\t0.0016022870000000002\t71259.0\n8806\t-93.45837399999999\t31.44775\tFlorien village\tLA\tLouisiana\tSabine Parish\t699\t37.7\t13.8\t8.6\t14142\t75000\t0.2182\t71426\tRomney\t71426\t0.00196491\t71426.0\n8807\t-93.643341\t31.636084000000004\tZwolle town\tLA\tLouisiana\tSabine Parish\t1751\t31.5\t10.3\t9.1\t12321\t45200\t0.2182\t71486\tRomney\t71486\t0.004922113\t71486.0\n8808\t-93.70044200000001\t31.779587\tConverse village\tLA\tLouisiana\tSabine Parish\t386\t38.5\t11.4\t6.3\t15005\t49444\t0.2182\t71419\tRomney\t71419\t0.001085058\t71419.0\n8809\t-93.515971\t31.815724\tPleasant Hill village\tLA\tLouisiana\tSabine Parish\t820\t40.3\t8.6\t7.9\t14771\t60500\t0.2182\t71065\tRomney\t71065\t0.002305045\t71065.0\n8810\t-93.45979\t31.493427\tFisher village\tLA\tLouisiana\tSabine Parish\t257\t42.5\t7.2\t10.5\t15736\t58333\t0.2182\t71426\tRomney\t71426\t0.000722435\t71426.0\n8811\t-93.475879\t31.565407\tMany town\tLA\tLouisiana\tSabine Parish\t2704\t38.1\t16.4\t11.7\t13157\t75000\t0.2182\t71426\tRomney\t71426\t0.007601025\t71426.0\n8812\t-93.68325300000001\t31.689875\tNoble village\tLA\tLouisiana\tSabine Parish\t287\t36.3\t9.9\t10.2\t17115\t54000\t0.2182\t71462\tRomney\t71462\t0.0008067660000000001\t71462.0\n8813\t-89.89193900000001\t29.896215\tViolet CDP\tLA\tLouisiana\tSt. Bernard Parish\t5272\t34.2\t7.1\t7.2\t13952\t72883\t0.3625\t70092\tRomney\t70092\t0.01481975\t70092.0\n8814\t-89.91807299999999\t29.92835\tMeraux CDP\tLA\tLouisiana\tSt. Bernard Parish\t5637\t38.1\t11.6\t5.8\t19772\t92780\t0.3625\t70075\tRomney\t70075\t0.015845776000000002\t70075.0\n8815\t-89.96573000000001\t29.943857\tChalmette CDP\tLA\tLouisiana\tSt. Bernard Parish\t17350\t39.8\t11.4\t6.3\t18681\t87863\t0.3625\t70043\tRomney\t70043\t0.048771369\t70043.0\n8816\t-89.998428\t29.95512\tArabi CDP\tLA\tLouisiana\tSt. Bernard Parish\t3862\t45.5\t14.0\t5.5\t20518\t78821\t0.3625\t70032\tRomney\t70032\t0.010856198000000001\t70032.0\n8817\t-89.88758100000001\t29.862454\tPoydras CDP\tLA\tLouisiana\tSt. Bernard Parish\t2764\t33.9\t4.7\t5.9\t13460\t63158\t0.3625\t70092\tRomney\t70092\t0.007769687\t70092.0\n8818\t-90.406414\t30.000922999999997\tNorco CDP\tLA\tLouisiana\tSt. Charles Parish\t3691\t39.4\t6.4\t6.0\t18710\t124216\t0.3512\t70079\tRomney\t70079\t0.010375511\t70079.0\n8819\t-90.423629\t29.818959999999997\tBayou Gauche CDP\tLA\tLouisiana\tSt. Charles Parish\t1914\t35.8\t9.4\t5.7\t21600\t150500\t0.3512\t70030\tRomney\t70030\t0.005380311\t70030.0\n8820\t-90.349579\t29.903701\tLuling CDP\tLA\tLouisiana\tSt. Charles Parish\t12215\t36.5\t23.0\t5.4\t24405\t187033\t0.3512\t70070\tRomney\t70070\t0.03433673\t70070.0\n8821\t-90.41406500000001\t29.961299\tHahnville CDP\tLA\tLouisiana\tSt. Charles Parish\t2271\t36.4\t13.0\t9.5\t18875\t138917\t0.3512\t70057\tRomney\t70057\t0.0063838490000000005\t70057.0\n8822\t-90.364184\t29.962903999999998\tDestrehan CDP\tLA\tLouisiana\tSt. Charles Parish\t13263\t37.4\t37.7\t3.9\t28030\t207059\t0.3512\t70047\tRomney\t70047\t0.03728269\t70047.0\n8823\t-90.46269699999999\t29.833112\tDes Allemands CDP\tLA\tLouisiana\tSt. Charles Parish\t2004\t39.0\t7.8\t7.9\t14686\t93462\t0.3512\t70030\tRomney\t70030\t0.0056333040000000004\t70030.0\n8824\t-90.385083\t29.983303000000003\tNew Sarpy CDP\tLA\tLouisiana\tSt. Charles Parish\t1702\t37.6\t6.2\t8.5\t12347\t86667\t0.3512\t70047\tRomney\t70047\t0.004784373\t70047.0\n8825\t-90.31187800000001\t29.958060999999997\tSt. Rose CDP\tLA\tLouisiana\tSt. Charles Parish\t7943\t34.2\t10.0\t6.4\t16056\t126421\t0.3512\t70087\tRomney\t70087\t0.022328011000000002\t70087.0\n8826\t-90.396585\t29.892542\tBoutte CDP\tLA\tLouisiana\tSt. Charles Parish\t2655\t30.9\t6.4\t12.0\t12432\t83364\t0.3512\t70039\tRomney\t70039\t0.007463284000000001\t70039.0\n8827\t-90.437395\t29.872085\tParadis CDP\tLA\tLouisiana\tSt. Charles Parish\t1545\t32.2\t6.5\t5.0\t16884\t96154\t0.3512\t70080\tRomney\t70080\t0.004343041\t70080.0\n8828\t-90.45961700000001\t30.019706\tMontz CDP\tLA\tLouisiana\tSt. Charles Parish\t1631\t35.2\t10.3\t5.2\t18075\t114535\t0.3512\t70066\tRomney\t70066\t0.00458479\t70066.0\n8829\t-90.48995500000001\t30.004718\tKillona CDP\tLA\tLouisiana\tSt. Charles Parish\t1000\t28.5\t1.4\t13.9\t8498\t50000\t0.3512\t70066\tRomney\t70066\t0.00281103\t70066.0\n8830\t-90.296994\t29.943740000000002\tAma CDP\tLA\tLouisiana\tSt. Charles Parish\t950\t36.5\t12.9\t5.5\t17883\t114527\t0.3512\t70031\tRomney\t70031\t0.002670478\t70031.0\n8831\t-90.442448\t29.984326\tTaft CDP\tLA\tLouisiana\tSt. Charles Parish\t0\t0.0\t0.0\t0.0\t0\t0\t0.3512\t70079\tRomney\t70079\t0.0\t70079.0\n8832\t-90.654523\t30.682236\tMontpelier village\tLA\tLouisiana\tSt. Helena Parish\t217\t37.3\t7.0\t7.6\t14298\t73000\t0.5912\t70453\tRomney\t70453\t0.0006099930000000001\t70453.0\n8833\t-90.66966\t30.829939000000003\tGreensburg town\tLA\tLouisiana\tSt. Helena Parish\t624\t39.0\t13.8\t16.9\t14055\t91818\t0.5912\t70441\tRomney\t70441\t0.0017540829999999998\t70441.0\n8834\t-90.705925\t29.997014\tNorth Vacherie CDP\tLA\tLouisiana\tSt. James Parish\t2426\t34.5\t17.7\t12.4\t14658\t112262\t0.5695\t70090\tRomney\t70090\t0.006819559\t70090.0\n8835\t-90.71243\t30.064759999999996\tLutcher town\tLA\tLouisiana\tSt. James Parish\t3800\t40.4\t13.4\t8.8\t17569\t116176\t0.5695\t70071\tRomney\t70071\t0.010681913999999999\t70071.0\n8836\t-90.692705\t30.060821\tGramercy town\tLA\tLouisiana\tSt. James Parish\t3055\t37.9\t10.5\t9.7\t16181\t102983\t0.5695\t70052\tRomney\t70052\t0.008587696\t70052.0\n8837\t-90.69720699999999\t29.926139000000003\tSouth Vacherie CDP\tLA\tLouisiana\tSt. James Parish\t3579\t38.7\t9.7\t10.7\t19060\t110506\t0.5695\t70090\tRomney\t70090\t0.010060676\t70090.0\n8838\t-90.556549\t30.031373\tEdgard CDP\tLA\tLouisiana\tSt. John the Baptist Parish\t2442\t37.3\t6.5\t10.9\t11604\t60156\t0.6239\t70049\tRomney\t70049\t0.006864535\t70049.0\n8839\t-90.656609\t30.030052\tWallace CDP\tLA\tLouisiana\tSt. John the Baptist Parish\t585\t34.7\t10.4\t26.7\t8496\t59091\t0.6239\t70076\tRomney\t70076\t0.001644453\t70076.0\n8840\t-90.625064\t30.079646999999998\tGaryville CDP\tLA\tLouisiana\tSt. John the Baptist Parish\t2864\t35.5\t11.7\t13.2\t13232\t75968\t0.6239\t70051\tRomney\t70051\t0.00805079\t70051.0\n8841\t-90.476322\t30.073207\tLaplace CDP\tLA\tLouisiana\tSt. John the Baptist Parish\t31626\t33.8\t17.2\t7.0\t19589\t134237\t0.6239\t70068\tRomney\t70068\t0.088901632\t70068.0\n8842\t-90.556262\t30.076877000000003\tReserve CDP\tLA\tLouisiana\tSt. John the Baptist Parish\t9941\t32.7\t9.0\t11.7\t14750\t99667\t0.6239\t70084\tRomney\t70084\t0.027944447999999997\t70084.0\n8843\t-92.113074\t30.345709999999997\tCankton village\tLA\tLouisiana\tSt. Landry Parish\t467\t38.9\t9.5\t4.3\t16620\t80000\t0.4723\t70584\tRomney\t70584\t0.001312751\t70584.0\n8844\t-92.043719\t30.420004\tGrand Coteau town\tLA\tLouisiana\tSt. Landry Parish\t1051\t35.6\t15.1\t12.2\t12284\t84167\t0.4723\t70541\tRomney\t70541\t0.002954392\t70541.0\n8845\t-91.74842199999999\t30.691723\tMelville town\tLA\tLouisiana\tSt. Landry Parish\t1348\t34.6\t8.0\t11.2\t9761\t52000\t0.4723\t71353\tRomney\t71353\t0.0037892679999999997\t71353.0\n8846\t-92.083496\t30.524820000000002\tOpelousas city\tLA\tLouisiana\tSt. Landry Parish\t23296\t35.4\t12.6\t15.3\t11445\t78272\t0.4723\t70570\tRomney\t70570\t0.065485753\t70570.0\n8847\t-91.931859\t30.402822999999998\tArnaudville town\tLA\tLouisiana\tSt. Landry Parish\t1560\t39.0\t8.3\t7.4\t12982\t88182\t0.4723\t70512\tRomney\t70512\t0.004385207\t70512.0\n8848\t-92.064266\t30.408458000000003\tSunset town\tLA\tLouisiana\tSt. Landry Parish\t2564\t34.2\t17.1\t9.5\t13969\t103929\t0.4723\t70584\tRomney\t70584\t0.007207481\t70584.0\n8849\t-91.956288\t30.556526\tPort Barre town\tLA\tLouisiana\tSt. Landry Parish\t2320\t36.1\t9.7\t8.8\t12875\t66290\t0.4723\t70577\tRomney\t70577\t0.006521589\t70577.0\n8850\t-91.90816\t30.717688\tPalmetto village\tLA\tLouisiana\tSt. Landry Parish\t197\t41.3\t13.7\t10.5\t12454\t70000\t0.4723\t71358\tRomney\t71358\t0.000553773\t71358.0\n8851\t-92.059387\t30.615246999999997\tWashington town\tLA\tLouisiana\tSt. Landry Parish\t1078\t36.9\t12.6\t9.7\t11299\t82000\t0.4723\t70589\tRomney\t70589\t0.00303029\t70589.0\n8852\t-92.418102\t30.492791999999998\tEunice city\tLA\tLouisiana\tSt. Landry Parish\t11756\t34.8\t12.4\t13.3\t13212\t80628\t0.4723\t70535\tRomney\t70535\t0.033046467999999996\t70535.0\n8853\t-91.751693\t30.532183000000003\tKrotz Springs town\tLA\tLouisiana\tSt. Landry Parish\t1203\t36.6\t4.6\t5.1\t13656\t63043\t0.4723\t70750\tRomney\t70750\t0.0033816690000000003\t70750.0\n8854\t-91.980992\t30.466382\tLeonville town\tLA\tLouisiana\tSt. Landry Parish\t1013\t38.8\t8.8\t7.2\t14008\t83421\t0.4723\t70541\tRomney\t70541\t0.002847573\t70541.0\n8855\t-91.827929\t30.217265\tParks village\tLA\tLouisiana\tSt. Martin Parish\t562\t35.3\t11.7\t5.2\t17767\t97308\t0.3705\t70582\tRomney\t70582\t0.001579799\t70582.0\n8856\t-91.83176\t30.126496999999997\tSt. Martinville city\tLA\tLouisiana\tSt. Martin Parish\t6564\t36.8\t10.9\t13.8\t13146\t87748\t0.3705\t70582\tRomney\t70582\t0.0184516\t70582.0\n8857\t-91.847753\t30.337366999999997\tCecilia CDP\tLA\tLouisiana\tSt. Martin Parish\t1542\t33.1\t9.6\t8.2\t14395\t91667\t0.3705\t70521\tRomney\t70521\t0.004334608\t70521.0\n8858\t-91.902266\t30.279226\tBreaux Bridge city\tLA\tLouisiana\tSt. Martin Parish\t7416\t32.8\t14.0\t9.4\t15917\t106601\t0.3705\t70517\tRomney\t70517\t0.020846598\t70517.0\n8859\t-91.797974\t30.31584\tHenderson town\tLA\tLouisiana\tSt. Martin Parish\t1807\t34.1\t6.1\t8.7\t13818\t73276\t0.3705\t70521\tRomney\t70521\t0.005079531\t70521.0\n8860\t-91.553892\t29.834044\tBaldwin town\tLA\tLouisiana\tSt. Mary Parish\t2197\t33.6\t10.0\t17.1\t11452\t49375\t0.3997\t70514\tRomney\t70514\t0.006175833\t70514.0\n8861\t-91.509766\t29.785068\tFranklin city\tLA\tLouisiana\tSt. Mary Parish\t7710\t36.8\t12.7\t12.4\t14168\t82285\t0.3997\t70538\tRomney\t70538\t0.021673041\t70538.0\n8862\t-91.30959\t29.691106\tPatterson city\tLA\tLouisiana\tSt. Mary Parish\t4997\t34.8\t8.6\t7.6\t14458\t91410\t0.3997\t70392\tRomney\t70392\t0.014046717\t70392.0\n8863\t-91.192379\t29.703138\tMorgan City\tLA\tLouisiana\tSt. Mary Parish\t12147\t38.9\t14.3\t8.7\t17293\t104276\t0.3997\t70380\tRomney\t70380\t0.03414558\t70380.0\n8864\t-91.540622\t29.866546999999997\tCharenton CDP\tLA\tLouisiana\tSt. Mary Parish\t1701\t35.2\t5.9\t11.1\t13995\t80385\t0.3997\t70523\tRomney\t70523\t0.0047815620000000005\t70523.0\n8865\t-91.107265\t29.664446999999996\tAmelia CDP\tLA\tLouisiana\tSt. Mary Parish\t2101\t33.1\t4.5\t9.0\t12543\t35833\t0.3997\t70380\tRomney\t70380\t0.0059059740000000005\t70380.0\n8866\t-91.267276\t29.691243\tBayou Vista CDP\tLA\tLouisiana\tSt. Mary Parish\t4444\t36.0\t10.5\t5.2\t16729\t102000\t0.3997\t70342\tRomney\t70342\t0.012492217\t70342.0\n8867\t-91.23777700000001\t29.701231\tBerwick town\tLA\tLouisiana\tSt. Mary Parish\t4398\t35.8\t16.6\t5.4\t17881\t101949\t0.3997\t70342\tRomney\t70342\t0.01236291\t70342.0\n8868\t-89.74987800000001\t30.371496\tPearl River town\tLA\tLouisiana\tSt. Tammany Parish\t2021\t41.3\t9.9\t5.3\t16442\t118118\t0.2279\t70452\tRomney\t70452\t0.005681091\t70452.0\n8869\t-90.09166\t30.375314000000003\tMandeville city\tLA\tLouisiana\tSt. Tammany Parish\t11682\t40.0\t46.2\t4.5\t32472\t248508\t0.2279\t70471\tRomney\t70471\t0.032838452000000004\t70471.0\n8870\t-90.194499\t30.630751\tFolsom village\tLA\tLouisiana\tSt. Tammany Parish\t578\t40.6\t24.7\t5.8\t20200\t215217\t0.2279\t70437\tRomney\t70437\t0.001624775\t70437.0\n8871\t-90.165008\t30.399534000000003\tMadisonville town\tLA\tLouisiana\tSt. Tammany Parish\t740\t40.3\t27.9\t4.3\t24523\t186029\t0.2279\t70447\tRomney\t70447\t0.002080162\t70447.0\n8872\t-90.02950200000001\t30.476715999999996\tAbita Springs town\tLA\tLouisiana\tSt. Tammany Parish\t2620\t35.9\t29.2\t4.0\t21854\t168516\t0.2279\t70420\tRomney\t70420\t0.007364898000000001\t70420.0\n8873\t-89.931023\t30.314195\tLacombe CDP\tLA\tLouisiana\tSt. Tammany Parish\t9865\t41.3\t20.1\t6.7\t20758\t149797\t0.2279\t70445\tRomney\t70445\t0.02773081\t70445.0\n8874\t-89.798395\t30.227942\tEden Isle CDP\tLA\tLouisiana\tSt. Tammany Parish\t7451\t46.8\t34.8\t4.5\t38724\t272756\t0.2279\t70458\tRomney\t70458\t0.020944984\t70458.0\n8875\t-89.781699\t30.287186\tSlidell city\tLA\tLouisiana\tSt. Tammany Parish\t28898\t39.1\t25.2\t5.3\t23551\t142468\t0.2279\t70458\tRomney\t70458\t0.081233143\t70458.0\n8876\t-89.90593100000001\t30.650022999999997\tSun village\tLA\tLouisiana\tSt. Tammany Parish\t528\t39.4\t16.8\t2.8\t19525\t142708\t0.2279\t70463\tRomney\t70463\t0.001484224\t70463.0\n8877\t-90.11240500000001\t30.478070000000002\tCovington city\tLA\tLouisiana\tSt. Tammany Parish\t9250\t39.1\t35.1\t5.9\t25076\t185417\t0.2279\t70433\tRomney\t70433\t0.026002027\t70433.0\n8878\t-90.444467\t30.440015000000002\tPonchatoula city\tLA\tLouisiana\tTangipahoa Parish\t6607\t35.8\t18.3\t7.2\t15801\t131694\t0.3537\t70454\tRomney\t70454\t0.018572475\t70454.0\n8879\t-90.51495600000001\t30.934466999999998\tKentwood town\tLA\tLouisiana\tTangipahoa Parish\t2161\t36.1\t9.2\t11.1\t11477\t80667\t0.3537\t70444\tRomney\t70444\t0.006074636\t70444.0\n8880\t-90.504949\t30.635651\tIndependence town\tLA\tLouisiana\tTangipahoa Parish\t2062\t37.7\t11.7\t10.3\t13310\t106753\t0.3537\t70443\tRomney\t70443\t0.005796344\t70443.0\n8881\t-90.486887\t30.577346999999996\tTickfaw village\tLA\tLouisiana\tTangipahoa Parish\t677\t37.6\t11.6\t7.7\t14889\t113000\t0.3537\t70466\tRomney\t70466\t0.001903067\t70466.0\n8882\t-90.5114\t30.764578999999998\tRoseland town\tLA\tLouisiana\tTangipahoa Parish\t1350\t36.0\t10.8\t12.1\t12161\t71071\t0.3537\t70456\tRomney\t70456\t0.00379489\t70456.0\n8883\t-90.513614\t30.875331\tTangipahoa village\tLA\tLouisiana\tTangipahoa Parish\t699\t30.5\t10.4\t13.2\t9331\t67308\t0.3537\t70465\tRomney\t70465\t0.00196491\t70465.0\n8884\t-90.51320600000001\t30.732367\tAmite City town\tLA\tLouisiana\tTangipahoa Parish\t4215\t34.4\t18.8\t9.2\t14637\t96184\t0.3537\t70422\tRomney\t70422\t0.011848491000000001\t70422.0\n8885\t-90.459489\t30.507248999999998\tHammond city\tLA\tLouisiana\tTangipahoa Parish\t19436\t28.3\t26.9\t8.6\t15939\t125431\t0.3537\t70401\tRomney\t70401\t0.054635178\t70401.0\n8886\t-90.484657\t30.548437\tNatalbany CDP\tLA\tLouisiana\tTangipahoa Parish\t2155\t29.5\t18.9\t6.8\t16664\t119104\t0.3537\t70451\tRomney\t70451\t0.006057769\t70451.0\n8887\t-91.24005600000001\t31.920322\tSt. Joseph town\tLA\tLouisiana\tTensas Parish\t1108\t33.3\t15.7\t22.1\t11791\t43553\t0.5562\t71366\tRomney\t71366\t0.0031146209999999997\t71366.0\n8888\t-91.38613000000001\t31.807158\tWaterproof town\tLA\tLouisiana\tTensas Parish\t673\t44.7\t8.4\t14.7\t13321\t34615\t0.5562\t71375\tRomney\t71375\t0.001891823\t71375.0\n8889\t-91.238682\t32.072815000000006\tNewellton town\tLA\tLouisiana\tTensas Parish\t1302\t34.0\t11.7\t13.4\t14297\t56538\t0.5562\t71357\tRomney\t71357\t0.0036599609999999998\t71357.0\n8890\t-90.830876\t29.733457\tSchriever CDP\tLA\tLouisiana\tTerrebonne Parish\t6874\t34.0\t15.1\t4.8\t16702\t115470\t0.2852\t70395\tRomney\t70395\t0.01932302\t70395.0\n8891\t-90.750984\t29.624354999999998\tBayou Cane CDP\tLA\tLouisiana\tTerrebonne Parish\t18147\t35.4\t17.5\t4.9\t19276\t131477\t0.2852\t70364\tRomney\t70364\t0.05101176\t70364.0\n8892\t-90.705782\t29.369519\tDulac CDP\tLA\tLouisiana\tTerrebonne Parish\t2152\t33.6\t6.9\t7.2\t11109\t81200\t0.2852\t70353\tRomney\t70353\t0.006049336\t70353.0\n8893\t-90.710802\t29.579435999999998\tHouma city\tLA\tLouisiana\tTerrebonne Parish\t33137\t35.4\t16.3\t6.6\t19977\t131788\t0.2852\t70363\tRomney\t70363\t0.09314909800000001\t70363.0\n8894\t-90.783263\t29.677640999999998\tGray CDP\tLA\tLouisiana\tTerrebonne Parish\t5610\t30.1\t12.5\t6.7\t15372\t97027\t0.2852\t70359\tRomney\t70359\t0.015769878\t70359.0\n8895\t-90.561708\t29.465740000000004\tMontegut CDP\tLA\tLouisiana\tTerrebonne Parish\t1705\t33.8\t4.7\t5.2\t13585\t94762\t0.2852\t70377\tRomney\t70377\t0.004792806\t70377.0\n8896\t-90.593809\t29.446082\tChauvin CDP\tLA\tLouisiana\tTerrebonne Parish\t3046\t37.8\t4.6\t4.6\t12862\t88929\t0.2852\t70344\tRomney\t70344\t0.008562397\t70344.0\n8897\t-92.66135200000001\t32.922053000000005\tLillie village\tLA\tLouisiana\tUnion Parish\t126\t35.6\t8.9\t10.4\t17069\t56250\t0.2856\t71256\tRomney\t71256\t0.00035419\t71256.0\n8898\t-92.410815\t32.626468\tDownsville village\tLA\tLouisiana\tUnion Parish\t121\t40.0\t16.7\t6.9\t16917\t80000\t0.2856\t71234\tRomney\t71234\t0.000340135\t71234.0\n8899\t-92.65848199999999\t32.8272\tBernice town\tLA\tLouisiana\tUnion Parish\t1871\t37.6\t13.8\t11.1\t13853\t72500\t0.2856\t71222\tRomney\t71222\t0.005259437\t71222.0\n8900\t-92.40081500000001\t32.773825\tFarmerville town\tLA\tLouisiana\tUnion Parish\t3552\t36.9\t16.1\t10.9\t14013\t63673\t0.2856\t71241\tRomney\t71241\t0.009984778\t71241.0\n8901\t-92.718202\t33.007258\tJunction City village\tLA\tLouisiana\tUnion Parish\t601\t36.3\t9.2\t11.1\t16547\t58438\t0.2856\t71749\tRomney\t71749\t0.0016894289999999999\t71749.0\n8902\t-92.602009\t32.933283\tSpearsville village\tLA\tLouisiana\tUnion Parish\t154\t38.4\t11.1\t4.4\t15597\t80000\t0.2856\t71277\tRomney\t71277\t0.000432899\t71277.0\n8903\t-92.24047\t32.899817999999996\tMarion town\tLA\tLouisiana\tUnion Parish\t820\t39.3\t12.7\t12.3\t14552\t63636\t0.2856\t71260\tRomney\t71260\t0.002305045\t71260.0\n8904\t-92.12656199999999\t29.974144\tAbbeville city\tLA\tLouisiana\tVermilion Parish\t12170\t36.5\t11.6\t10.4\t12633\t85972\t0.2289\t70510\tRomney\t70510\t0.034210234\t70510.0\n8905\t-92.28379699999999\t30.006263\tKaplan city\tLA\tLouisiana\tVermilion Parish\t5141\t38.9\t14.1\t10.7\t14522\t65888\t0.2289\t70548\tRomney\t70548\t0.014451505\t70548.0\n8906\t-92.038521\t29.958376\tErath town\tLA\tLouisiana\tVermilion Parish\t2165\t35.9\t12.7\t5.9\t16028\t93485\t0.2289\t70533\tRomney\t70533\t0.00608588\t70533.0\n8907\t-91.98509200000001\t29.950001\tDelcambre town\tLA\tLouisiana\tVermilion Parish\t2164\t35.1\t12.2\t5.7\t16181\t84872\t0.2289\t70528\tRomney\t70528\t0.006083069\t70528.0\n8908\t-92.122378\t30.106969\tMaurice village\tLA\tLouisiana\tVermilion Parish\t641\t37.2\t16.2\t7.5\t16674\t105769\t0.2289\t70555\tRomney\t70555\t0.00180187\t70555.0\n8909\t-92.507683\t30.029195\tGueydan town\tLA\tLouisiana\tVermilion Parish\t1498\t41.5\t9.7\t7.6\t14942\t71444\t0.2289\t70542\tRomney\t70542\t0.004210923\t70542.0\n8910\t-93.39610400000001\t31.326586\tHornbeck town\tLA\tLouisiana\tVernon Parish\t429\t38.7\t13.7\t6.3\t14539\t65000\t0.2033\t71439\tRomney\t71439\t0.001205932\t71439.0\n8911\t-93.285899\t30.918590999999996\tRosepine town\tLA\tLouisiana\tVernon Parish\t1058\t33.9\t14.7\t6.2\t15263\t82857\t0.2033\t70659\tRomney\t70659\t0.00297407\t70659.0\n8912\t-93.280876\t31.113372\tNew Llano town\tLA\tLouisiana\tVernon Parish\t2047\t30.5\t15.2\t10.0\t19514\t75263\t0.2033\t71461\tRomney\t71461\t0.005754178\t71461.0\n8913\t-93.343976\t31.254416\tAnacoco village\tLA\tLouisiana\tVernon Parish\t726\t40.3\t14.1\t6.5\t16025\t75556\t0.2033\t71439\tRomney\t71439\t0.002040808\t71439.0\n8914\t-93.215699\t31.05102\tFort Polk South CDP\tLA\tLouisiana\tVernon Parish\t9347\t22.3\t18.0\t17.7\t13347\t56667\t0.2033\t71459\tRomney\t71459\t0.026274697000000003\t71459.0\n8915\t-93.27444399999999\t31.138820000000003\tLeesville city\tLA\tLouisiana\tVernon Parish\t5753\t34.9\t15.6\t8.6\t16980\t78972\t0.2033\t71461\tRomney\t71461\t0.016171855\t71461.0\n8916\t-93.019533\t31.258265\tSimpson village\tLA\tLouisiana\tVernon Parish\t429\t41.2\t14.6\t8.4\t20176\t85769\t0.2033\t71474\tRomney\t71474\t0.001205932\t71474.0\n8917\t-93.178699\t31.102669\tFort Polk North CDP\tLA\tLouisiana\tVernon Parish\t2525\t22.9\t30.5\t11.7\t15513\t7143\t0.2033\t71459\tRomney\t71459\t0.007097851\t71459.0\n8918\t-89.817716\t30.963264000000002\tAngie village\tLA\tLouisiana\tWashington Parish\t240\t35.0\t8.6\t12.2\t13102\t56000\t0.348\t70426\tRomney\t70426\t0.000674647\t70426.0\n8919\t-89.86332800000001\t30.781215999999997\tBogalusa city\tLA\tLouisiana\tWashington Parish\t12359\t38.3\t12.8\t15.3\t13537\t71111\t0.348\t70427\tRomney\t70427\t0.034741519\t70427.0\n8920\t-89.831879\t30.895308\tVarnado village\tLA\tLouisiana\tWashington Parish\t323\t32.2\t13.3\t5.0\t13330\t63571\t0.348\t70426\tRomney\t70426\t0.000907963\t70426.0\n8921\t-90.146893\t30.848115000000004\tFranklinton town\tLA\tLouisiana\tWashington Parish\t3628\t38.4\t13.3\t13.3\t12676\t76494\t0.348\t70438\tRomney\t70438\t0.010198417\t70438.0\n8922\t-93.461281\t33.001985999999995\tSpringhill city\tLA\tLouisiana\tWebster Parish\t5498\t42.3\t15.0\t8.6\t18381\t72614\t0.3694\t71075\tRomney\t71075\t0.015455041999999999\t71075.0\n8923\t-93.41194\t32.524976\tDoyline village\tLA\tLouisiana\tWebster Parish\t750\t38.1\t10.4\t9.3\t16018\t73824\t0.3694\t71023\tRomney\t71023\t0.002108272\t71023.0\n8924\t-93.29470500000001\t32.542241\tSibley town\tLA\tLouisiana\tWebster Parish\t1155\t38.9\t11.1\t11.2\t16150\t75000\t0.3694\t71073\tRomney\t71073\t0.00324674\t71073.0\n8925\t-93.280837\t32.618584000000006\tMinden city\tLA\tLouisiana\tWebster Parish\t12140\t38.6\t17.9\t9.2\t15707\t79976\t0.3694\t71055\tRomney\t71055\t0.034125903\t71055.0\n8926\t-93.29544399999999\t32.941506\tShongaloo village\tLA\tLouisiana\tWebster Parish\t163\t43.1\t6.8\t7.9\t17564\t65000\t0.3694\t71072\tRomney\t71072\t0.00045819800000000005\t71072.0\n8927\t-93.335553\t32.593773\tDixie Inn village\tLA\tLouisiana\tWebster Parish\t349\t41.4\t12.1\t6.2\t18036\t58000\t0.3694\t71055\tRomney\t71055\t0.000981049\t71055.0\n8928\t-93.446472\t32.969892\tCullen town\tLA\tLouisiana\tWebster Parish\t1098\t37.4\t6.0\t16.8\t9697\t52679\t0.3694\t71021\tRomney\t71021\t0.0030865109999999997\t71021.0\n8929\t-93.267939\t32.456511\tHeflin village\tLA\tLouisiana\tWebster Parish\t235\t40.9\t12.7\t9.2\t13751\t82500\t0.3694\t71039\tRomney\t71039\t0.000660592\t71039.0\n8930\t-93.42276\t32.813476\tCotton Valley town\tLA\tLouisiana\tWebster Parish\t1125\t37.8\t11.1\t11.9\t15237\t50000\t0.3694\t71018\tRomney\t71018\t0.003162409\t71018.0\n8931\t-93.451302\t32.896288\tSarepta town\tLA\tLouisiana\tWebster Parish\t959\t39.3\t13.2\t6.9\t18757\t75278\t0.3694\t71071\tRomney\t71071\t0.002695778\t71071.0\n8932\t-93.237369\t32.541218\tDubberly village\tLA\tLouisiana\tWebster Parish\t292\t43.0\t10.5\t6.7\t17782\t85000\t0.3694\t71024\tRomney\t71024\t0.000820821\t71024.0\n8933\t-91.209404\t30.451786\tPort Allen city\tLA\tLouisiana\tWest Baton Rouge Parish\t5186\t38.4\t14.5\t10.3\t17129\t105806\t0.4456\t708HH\tRomney\t708HH\t0.014578001\t0.0\n8934\t-91.25228299999999\t30.394541999999998\tBrusly town\tLA\tLouisiana\tWest Baton Rouge Parish\t2351\t38.2\t16.4\t4.9\t22766\t167679\t0.4456\t70719\tRomney\t70719\t0.006608731\t70719.0\n8935\t-91.267282\t30.355428000000003\tAddis town\tLA\tLouisiana\tWest Baton Rouge Parish\t2302\t33.8\t9.0\t7.0\t17458\t107537\t0.4456\t70710\tRomney\t70710\t0.006470991\t70710.0\n8936\t-91.48134\t32.603764\tEpps village\tLA\tLouisiana\tWest Carroll Parish\t1012\t32.0\t5.1\t22.6\t12067\t52692\t0.1876\t71237\tRomney\t71237\t0.0028447620000000002\t71237.0\n8937\t-91.313907\t32.997149\tKilbourne village\tLA\tLouisiana\tWest Carroll Parish\t447\t39.9\t11.7\t20.4\t17004\t66250\t0.1876\t71253\tRomney\t71253\t0.00125653\t71253.0\n8938\t-91.41256800000001\t32.792383\tForest village\tLA\tLouisiana\tWest Carroll Parish\t227\t39.8\t16.4\t13.1\t15048\t66250\t0.1876\t71266\tRomney\t71266\t0.000638104\t71266.0\n8939\t-91.391029\t32.861940999999995\tOak Grove town\tLA\tLouisiana\tWest Carroll Parish\t1897\t41.2\t13.5\t18.0\t13722\t54737\t0.1876\t71263\tRomney\t71263\t0.005332524\t71263.0\n8940\t-91.437965\t32.738094\tPioneer village\tLA\tLouisiana\tWest Carroll Parish\t148\t36.6\t8.3\t11.3\t12404\t45000\t0.1876\t71266\tRomney\t71266\t0.000416032\t71266.0\n8941\t-91.378559\t30.785109999999996\tSt. Francisville town\tLA\tLouisiana\tWest Feliciana Parish\t1675\t37.0\t32.9\t5.3\t25971\t173864\t0.4225\t70775\tRomney\t70775\t0.004708475\t70775.0\n8942\t-92.641077\t31.922375\tWinnfield city\tLA\tLouisiana\tWinn Parish\t4988\t37.2\t14.0\t10.6\t12296\t54600\t0.2937\t71483\tRomney\t71483\t0.014021417\t71483.0\n8943\t-92.738825\t31.806409000000002\tAtlanta village\tLA\tLouisiana\tWinn Parish\t134\t40.0\t10.0\t10.3\t13152\t40000\t0.2937\t71404\tRomney\t71404\t0.00037667800000000003\t71404.0\n8944\t-92.48629100000001\t32.078978\tSikes village\tLA\tLouisiana\tWinn Parish\t123\t38.1\t7.1\t7.4\t15977\t42500\t0.2937\t71473\tRomney\t71473\t0.000345757\t71473.0\n8945\t-92.65872\t32.080754\tDodson village\tLA\tLouisiana\tWinn Parish\t343\t39.1\t10.0\t4.9\t15714\t46875\t0.2937\t71422\tRomney\t71422\t0.0009641830000000001\t71422.0\n8946\t-92.77579\t31.961724\tCalvin village\tLA\tLouisiana\tWinn Parish\t208\t43.8\t8.2\t10.1\t14349\t33750\t0.2937\t71410\tRomney\t71410\t0.000584694\t71410.0\n8947\t-70.057142\t44.008596999999995\tLisbon Falls CDP\tME\tMaine\tAndroscoggin County\t4464\t36.7\t13.7\t7.2\t23848\t138823\t0.5484\t4252\tObama\t04252\t0.014475835\t4252.0\n8948\t-70.394129\t44.112173\tMechanic Falls CDP\tME\tMaine\tAndroscoggin County\t2573\t37.5\t12.3\t9.0\t18607\t119952\t0.5484\t4256\tObama\t04256\t0.00834371\t4256.0\n8949\t-70.249131\t44.084551\tAuburn city\tME\tMaine\tAndroscoggin County\t23760\t42.2\t22.6\t7.9\t23427\t141255\t0.5484\t4210\tObama\t04210\t0.077048798\t4210.0\n8950\t-70.180766\t44.472262\tLivermore Falls CDP\tME\tMaine\tAndroscoggin County\t1589\t36.6\t10.5\t15.3\t16645\t96364\t0.5484\t4254\tObama\t04254\t0.0051528\t4254.0\n8951\t-70.16835400000001\t44.092135999999996\tLewiston city\tME\tMaine\tAndroscoggin County\t35427\t40.2\t15.8\t9.4\t21127\t139641\t0.5484\t4240\tObama\t04240\t0.114882481\t4240.0\n8952\t-68.331128\t47.342884000000005\tMadawaska CDP\tME\tMaine\tAroostook County\t3228\t50.6\t16.1\t7.3\t21802\t119281\t0.525\t4756\tObama\t04756\t0.010467741\t4756.0\n8953\t-67.991907\t46.866215000000004\tCaribou city\tME\tMaine\tAroostook County\t8240\t44.8\t21.8\t7.6\t19588\t106658\t0.525\t4736\tObama\t04736\t0.026720627\t4736.0\n8954\t-67.952964\t47.166078000000006\tVan Buren CDP\tME\tMaine\tAroostook County\t2226\t49.1\t12.6\t9.8\t16147\t76393\t0.525\t4785\tObama\t04785\t0.007218461\t4785.0\n8955\t-67.83830400000001\t46.766963\tFort Fairfield CDP\tME\tMaine\tAroostook County\t1555\t46.6\t22.4\t7.4\t17869\t92763\t0.525\t4742\tObama\t04742\t0.005042545\t4742.0\n8956\t-67.833854\t46.115758\tHoulton CDP\tME\tMaine\tAroostook County\t4947\t42.4\t21.7\t10.9\t16729\t102344\t0.525\t4730\tObama\t04730\t0.016042103999999998\t4730.0\n8957\t-67.870097\t46.508935\tMars Hill-Blaine CDP\tME\tMaine\tAroostook County\t1380\t43.0\t12.2\t6.2\t15693\t83676\t0.525\t4758\tObama\t04758\t0.004475056\t4758.0\n8958\t-67.830849\t46.911146\tLimestone CDP\tME\tMaine\tAroostook County\t1527\t34.8\t22.0\t7.9\t21099\t78500\t0.525\t4750\tObama\t04750\t0.004951747\t4750.0\n8959\t-67.89359\t46.938854\tLoring AFB CDP\tME\tMaine\tAroostook County\t245\t28.1\t26.7\t5.9\t21320\t75000\t0.525\t4750\tObama\t04750\t0.000794485\t4750.0\n8960\t-67.987374\t46.686756\tPresque Isle city\tME\tMaine\tAroostook County\t9365\t40.1\t24.9\t7.1\t19614\t111402\t0.525\t4769\tObama\t04769\t0.030368771\t4769.0\n8961\t-68.580958\t47.264818\tFort Kent CDP\tME\tMaine\tAroostook County\t1947\t42.3\t20.7\t7.5\t18495\t115909\t0.525\t4743\tObama\t04743\t0.006313721\t4743.0\n8962\t-70.29417\t43.679094\tPortland city\tME\tMaine\tCumberland County\t65073\t37.8\t41.9\t7.8\t28272\t210958\t0.6225\t4103\tObama\t04103\t0.21101836699999998\t4103.0\n8963\t-70.42861500000001\t43.823541999999996\tNorth Windham CDP\tME\tMaine\tCumberland County\t5159\t39.4\t25.1\t5.1\t27473\t194309\t0.6225\t4062\tObama\t04062\t0.016729577\t4062.0\n8964\t-69.93429\t43.891615\tBrunswick Station CDP\tME\tMaine\tCumberland County\t1612\t23.2\t32.7\t6.1\t16500\t175000\t0.6225\t4011\tObama\t04011\t0.005227385\t4011.0\n8965\t-69.940815\t43.911497999999995\tBrunswick CDP\tME\tMaine\tCumberland County\t15168\t37.9\t40.2\t6.9\t26224\t194787\t0.6225\t4011\tObama\t04011\t0.049186707\t4011.0\n8966\t-70.219562\t43.730664000000004\tFalmouth Foreside CDP\tME\tMaine\tCumberland County\t2024\t50.1\t57.9\t7.5\t42417\t407303\t0.6225\t4110\tObama\t04110\t0.006563416\t4110.0\n8967\t-70.254051\t43.798031\tCumberland Center CDP\tME\tMaine\tCumberland County\t2681\t40.7\t59.2\t6.6\t40453\t297759\t0.6225\t4021\tObama\t04021\t0.008693932\t4021.0\n8968\t-70.099273\t43.853974\tFreeport CDP\tME\tMaine\tCumberland County\t1816\t40.3\t41.7\t7.6\t29505\t203125\t0.6225\t4032\tObama\t04032\t0.005888915\t4032.0\n8969\t-70.445649\t43.682659\tGorham CDP\tME\tMaine\tCumberland County\t4602\t28.3\t43.3\t9.8\t25107\t228404\t0.6225\t4038\tObama\t04038\t0.01492334\t4038.0\n8970\t-70.335185\t43.598079999999996\tScarborough CDP\tME\tMaine\tCumberland County\t4530\t42.0\t35.0\t6.5\t30653\t228160\t0.6225\t4074\tObama\t04074\t0.014689859\t4074.0\n8971\t-70.291425\t43.629086\tSouth Portland city\tME\tMaine\tCumberland County\t24693\t40.6\t32.3\t5.7\t28789\t189295\t0.6225\t4106\tObama\t04106\t0.080074325\t4106.0\n8972\t-70.353943\t43.694571\tWestbrook city\tME\tMaine\tCumberland County\t16959\t41.0\t22.3\t5.5\t26150\t184112\t0.6225\t4092\tObama\t04092\t0.054994552\t4092.0\n8973\t-70.731669\t44.069484\tBridgton CDP\tME\tMaine\tCumberland County\t2652\t41.4\t25.6\t8.1\t21335\t145906\t0.6225\t4009\tObama\t04009\t0.008599891\t4009.0\n8974\t-70.199005\t43.79742\tYarmouth CDP\tME\tMaine\tCumberland County\t3547\t42.9\t64.3\t4.9\t34258\t320079\t0.6225\t4096\tObama\t04096\t0.011502192\t4096.0\n8975\t-70.42684399999999\t43.734631\tLittle Falls-South Windham CDP\tME\tMaine\tCumberland County\t1955\t35.8\t23.5\t6.7\t25373\t188281\t0.6225\t4038\tObama\t04038\t0.006339663000000001\t4038.0\n8976\t-70.237057\t44.596151\tWilton CDP\tME\tMaine\tFranklin County\t2274\t42.4\t27.3\t12.7\t22611\t118082\t0.5753\t4294\tObama\t04294\t0.007374115\t4294.0\n8977\t-70.145614\t44.668054999999995\tFarmington CDP\tME\tMaine\tFranklin County\t4234\t28.6\t34.1\t13.7\t18012\t145833\t0.5753\t4938\tObama\t04938\t0.013729992\t4938.0\n8978\t-70.191828\t44.491649\tChisholm CDP\tME\tMaine\tFranklin County\t1376\t45.6\t19.8\t7.0\t24642\t144575\t0.5753\t4254\tObama\t04254\t0.004462085\t4254.0\n8979\t-68.211062\t44.381316\tBar Harbor CDP\tME\tMaine\tHancock County\t2669\t41.1\t48.7\t10.7\t32296\t279832\t0.5704\t4609\tObama\t04609\t0.008655019\t4609.0\n8980\t-68.794472\t44.600603\tBucksport CDP\tME\tMaine\tHancock County\t3044\t40.9\t19.9\t9.4\t24082\t167287\t0.5704\t4416\tObama\t04416\t0.009871066\t4416.0\n8981\t-68.487877\t44.585064\tEllsworth city\tME\tMaine\tHancock County\t6904\t43.8\t29.1\t5.0\t25601\t195640\t0.5704\t4605\tObama\t04605\t0.022388252999999997\t4605.0\n8982\t-69.66261999999999\t44.544046\tWaterville city\tME\tMaine\tKennebec County\t15814\t36.9\t25.0\t7.6\t19518\t134988\t0.5523\t4901\tObama\t04901\t0.051281552\t4901.0\n8983\t-69.78236\t44.250622\tFarmingdale CDP\tME\tMaine\tKennebec County\t1985\t41.7\t33.4\t8.5\t22834\t155100\t0.5523\t4344\tObama\t04344\t0.006436946999999999\t4344.0\n8984\t-69.576801\t44.527729\tWinslow CDP\tME\tMaine\tKennebec County\t7930\t43.5\t24.1\t6.6\t23249\t146587\t0.5523\t4901\tObama\t04901\t0.02571536\t4901.0\n8985\t-69.813683\t44.290077000000004\tHallowell city\tME\tMaine\tKennebec County\t2446\t45.1\t39.6\t6.6\t26578\t175000\t0.5523\t4347\tObama\t04347\t0.007931875\t4347.0\n8986\t-69.964897\t44.312836\tWinthrop CDP\tME\tMaine\tKennebec County\t3021\t45.2\t35.4\t5.7\t23020\t174488\t0.5523\t4364\tObama\t04364\t0.009796481999999999\t4364.0\n8987\t-69.485793\t44.650087\tClinton CDP\tME\tMaine\tKennebec County\t1406\t39.9\t12.0\t16.4\t16928\t114407\t0.5523\t4927\tObama\t04927\t0.004559369000000001\t4927.0\n8988\t-69.732229\t44.334157\tAugusta city\tME\tMaine\tKennebec County\t18953\t43.6\t23.3\t7.2\t21960\t137742\t0.5523\t4330\tObama\t04330\t0.061460684\t4330.0\n8989\t-69.707859\t44.549884999999996\tOakland CDP\tME\tMaine\tKennebec County\t2943\t39.4\t22.4\t8.0\t23111\t132692\t0.5523\t4963\tObama\t04963\t0.009543544000000001\t4963.0\n8990\t-69.792109\t44.191064000000004\tGardiner city\tME\tMaine\tKennebec County\t6594\t42.2\t20.7\t7.9\t22179\t127400\t0.5523\t4345\tObama\t04345\t0.021382987000000003\t4345.0\n8991\t-69.750639\t44.234596\tRandolph CDP\tME\tMaine\tKennebec County\t1928\t42.0\t14.4\t5.3\t20480\t127923\t0.5523\t4346\tObama\t04346\t0.006252108\t4346.0\n8992\t-69.13731800000001\t44.127658000000004\tRockland city\tME\tMaine\tKnox County\t7218\t42.5\t24.6\t7.5\t21688\t143554\t0.5992\t4841\tObama\t04841\t0.023406491\t4841.0\n8993\t-69.06750100000001\t44.213262\tCamden CDP\tME\tMaine\tKnox County\t3958\t51.7\t49.0\t4.2\t32933\t305841\t0.5992\t4843\tObama\t04843\t0.012834981\t4843.0\n8994\t-69.180161\t44.079919\tThomaston CDP\tME\tMaine\tKnox County\t2893\t41.0\t26.3\t8.7\t22331\t180172\t0.5992\t4861\tObama\t04861\t0.009381405\t4861.0\n8995\t-69.53064499999999\t44.024815000000004\tDamariscotta-Newcastle CDP\tME\tMaine\tLincoln County\t1761\t52.8\t41.3\t4.7\t29973\t261620\t0.5451\t4553\tObama\t04553\t0.005710560999999999\t4553.0\n8996\t-69.38323199999999\t44.090839\tWaldoboro CDP\tME\tMaine\tLincoln County\t1259\t45.5\t22.8\t6.2\t21433\t164437\t0.5451\t4572\tObama\t04572\t0.004082678\t4572.0\n8997\t-69.673363\t44.011511\tWiscasset CDP\tME\tMaine\tLincoln County\t1262\t44.1\t24.7\t5.8\t25117\t211828\t0.5451\t4578\tObama\t04578\t0.004092407\t4578.0\n8998\t-69.62331400000001\t43.855607\tBoothbay Harbor CDP\tME\tMaine\tLincoln County\t1334\t50.3\t34.6\t12.4\t28188\t232308\t0.5451\t4538\tObama\t04538\t0.004325888\t4538.0\n8999\t-70.551097\t44.216815000000004\tNorway CDP\tME\tMaine\tOxford County\t2751\t44.5\t18.6\t14.5\t18953\t123118\t0.5551\t4268\tObama\t04268\t0.008920928\t4268.0\n9000\t-70.97327\t44.02008\tFryeburg CDP\tME\tMaine\tOxford County\t1499\t44.7\t25.2\t11.4\t20149\t190152\t0.5551\t4037\tObama\t04037\t0.004860949\t4037.0\n9001\t-70.511274\t44.218999\tSouth Paris CDP\tME\tMaine\tOxford County\t2392\t43.7\t16.6\t8.1\t21471\t155131\t0.5551\t4281\tObama\t04281\t0.007756764\t4281.0\n9002\t-70.56779499999999\t44.550065999999994\tRumford CDP\tME\tMaine\tOxford County\t4620\t43.9\t15.1\t13.6\t19721\t121563\t0.5551\t4276\tObama\t04276\t0.014981711000000002\t4276.0\n9003\t-70.5091\t44.138443\tOxford CDP\tME\tMaine\tOxford County\t1395\t41.0\t17.7\t8.5\t20820\t140074\t0.5551\t4270\tObama\t04270\t0.004523698\t4270.0\n9004\t-70.45582399999999\t44.536955999999996\tDixfield CDP\tME\tMaine\tOxford County\t1161\t43.8\t15.4\t8.1\t21255\t116715\t0.5551\t4224\tObama\t04224\t0.003764884\t4224.0\n9005\t-70.536266\t44.554978000000006\tMexico CDP\tME\tMaine\tOxford County\t1983\t45.7\t13.4\t10.6\t20297\t102637\t0.5551\t4257\tObama\t04257\t0.006430462\t4257.0\n9006\t-68.79047\t44.832582\tBangor city\tME\tMaine\tPenobscot County\t31825\t37.7\t31.0\t6.9\t23282\t148941\t0.502\t4401\tObama\t04401\t0.103201935\t4401.0\n9007\t-68.664448\t45.254389\tHowland CDP\tME\tMaine\tPenobscot County\t1189\t45.2\t7.7\t11.4\t16002\t101282\t0.502\t4448\tObama\t04448\t0.003855683\t4448.0\n9008\t-69.26131099999999\t44.837826\tNewport CDP\tME\tMaine\tPenobscot County\t1717\t40.2\t18.5\t12.2\t18035\t122270\t0.502\t4953\tObama\t04953\t0.005567878\t4953.0\n9009\t-68.498953\t45.362814\tLincoln CDP\tME\tMaine\tPenobscot County\t3205\t43.7\t21.0\t12.4\t17170\t111307\t0.502\t4457\tObama\t04457\t0.010393156\t4457.0\n9010\t-68.573879\t45.625552\tEast Millinocket CDP\tME\tMaine\tPenobscot County\t1681\t46.1\t17.4\t8.5\t22969\t95597\t0.502\t4430\tObama\t04430\t0.005451138\t4430.0\n9011\t-68.734742\t44.783614\tBrewer city\tME\tMaine\tPenobscot County\t9235\t42.1\t29.4\t6.2\t24900\t159395\t0.502\t4412\tObama\t04412\t0.029947207000000003\t4412.0\n9012\t-68.633314\t44.951266\tMilford CDP\tME\tMaine\tPenobscot County\t2185\t38.9\t21.9\t8.0\t21885\t128854\t0.502\t4461\tObama\t04461\t0.007085506\t4461.0\n9013\t-68.724623\t44.949249\tOld Town city\tME\tMaine\tPenobscot County\t8583\t36.3\t27.5\t8.0\t21609\t130478\t0.502\t4468\tObama\t04468\t0.027832905\t4468.0\n9014\t-68.679351\t44.881125\tOrono CDP\tME\tMaine\tPenobscot County\t8813\t23.1\t56.7\t5.6\t20134\t205849\t0.502\t4473\tObama\t04473\t0.028578747999999998\t4473.0\n9015\t-68.83596800000001\t44.747954\tHampden CDP\tME\tMaine\tPenobscot County\t4567\t42.6\t39.7\t6.0\t30924\t188579\t0.502\t4474\tObama\t04474\t0.014809843\t4474.0\n9016\t-68.699088\t45.659327000000005\tMillinocket CDP\tME\tMaine\tPenobscot County\t5126\t48.7\t14.0\t9.2\t21909\t87612\t0.502\t4462\tObama\t04462\t0.016622565\t4462.0\n9017\t-69.294598\t45.016401\tDexter CDP\tME\tMaine\tPenobscot County\t2091\t44.5\t13.5\t6.0\t17709\t102431\t0.502\t4930\tObama\t04930\t0.006780683000000001\t4930.0\n9018\t-69.39259799999999\t45.173401\tGuilford CDP\tME\tMaine\tPiscataquis County\t889\t42.8\t10.7\t12.2\t17718\t104348\t0.4633\t4443\tObama\t04443\t0.0028828440000000003\t4443.0\n9019\t-68.974846\t45.246029\tMilo CDP\tME\tMaine\tPiscataquis County\t1797\t43.9\t12.9\t12.8\t16249\t75179\t0.4633\t4463\tObama\t04463\t0.0058273019999999995\t4463.0\n9020\t-69.58893499999999\t45.466724\tGreenville CDP\tME\tMaine\tPiscataquis County\t1226\t47.3\t19.7\t10.3\t18990\t141274\t0.4633\t4442\tObama\t04442\t0.003975666\t4442.0\n9021\t-69.220777\t45.193664\tDover-Foxcroft CDP\tME\tMaine\tPiscataquis County\t2448\t44.9\t22.9\t12.1\t19663\t115125\t0.4633\t4426\tObama\t04426\t0.007938361\t4426.0\n9022\t-69.81185699999999\t44.105582\tRichmond CDP\tME\tMaine\tSagadahoc County\t1837\t41.3\t26.8\t8.4\t21961\t145202\t0.5685\t4357\tObama\t04357\t0.005957014\t4357.0\n9023\t-69.834644\t43.934535\tBath city\tME\tMaine\tSagadahoc County\t9508\t38.9\t26.2\t5.9\t25179\t168750\t0.5685\t4530\tObama\t04530\t0.03083249\t4530.0\n9024\t-69.935255\t43.941076\tTopsham CDP\tME\tMaine\tSagadahoc County\t6596\t38.2\t36.9\t5.8\t25561\t204324\t0.5685\t4086\tObama\t04086\t0.021389473\t4086.0\n9025\t-69.895981\t44.798116\tAnson CDP\tME\tMaine\tSomerset County\t796\t40.0\t8.6\t14.6\t16026\t101750\t0.4928\t4911\tObama\t04911\t0.0025812639999999998\t4911.0\n9026\t-69.873488\t45.058934\tBingham CDP\tME\tMaine\tSomerset County\t824\t43.9\t16.3\t6.7\t18314\t108654\t0.4928\t4920\tObama\t04920\t0.0026720629999999997\t4920.0\n9027\t-69.712288\t44.773518\tSkowhegan CDP\tME\tMaine\tSomerset County\t6879\t43.0\t16.1\t10.8\t19019\t116655\t0.4928\t049HH\tObama\t049HH\t0.022307182999999998\t0.0\n9028\t-69.783816\t44.712051\tNorridgewock CDP\tME\tMaine\tSomerset County\t1660\t41.6\t14.4\t8.1\t20605\t132528\t0.4928\t4957\tObama\t04957\t0.005383039\t4957.0\n9029\t-69.458772\t44.881628000000006\tHartland CDP\tME\tMaine\tSomerset County\t885\t42.3\t8.7\t10.9\t16178\t103947\t0.4928\t4943\tObama\t04943\t0.0028698729999999998\t4943.0\n9030\t-69.606813\t44.589303\tFairfield CDP\tME\tMaine\tSomerset County\t2516\t39.0\t17.8\t7.1\t21754\t118471\t0.4928\t4937\tObama\t04937\t0.008158871\t4937.0\n9031\t-69.865413\t44.800093\tMadison CDP\tME\tMaine\tSomerset County\t2680\t45.2\t9.1\t11.7\t18214\t109242\t0.4928\t4950\tObama\t04950\t0.008690689\t4950.0\n9032\t-69.379949\t44.771734\tPittsfield CDP\tME\tMaine\tSomerset County\t3206\t39.8\t19.5\t9.1\t20944\t114800\t0.4928\t4967\tObama\t04967\t0.010396399\t4967.0\n9033\t-68.920777\t44.468469\tSearsport CDP\tME\tMaine\tWaldo County\t1184\t49.5\t25.0\t8.0\t20879\t178646\t0.5363\t4974\tObama\t04974\t0.0038394690000000003\t4974.0\n9034\t-69.032629\t44.427908\tBelfast city\tME\tMaine\tWaldo County\t6898\t46.7\t34.5\t8.1\t24405\t186179\t0.5363\t4915\tObama\t04915\t0.022368797000000003\t4915.0\n9035\t-69.334404\t44.61542\tUnity CDP\tME\tMaine\tWaldo County\t539\t36.7\t24.1\t9.6\t17607\t155978\t0.5363\t4988\tObama\t04988\t0.001747866\t4988.0\n9036\t-68.856113\t44.64533\tWinterport CDP\tME\tMaine\tWaldo County\t1413\t41.3\t35.1\t6.4\t23622\t164583\t0.5363\t4496\tObama\t04496\t0.004582069\t4496.0\n9037\t-67.01000400000001\t44.916374\tEastport city\tME\tMaine\tWashington County\t1436\t48.8\t18.9\t15.9\t18086\t87500\t0.4927\t4631\tObama\t04631\t0.004656653\t4631.0\n9038\t-67.22878399999999\t45.132531\tCalais city\tME\tMaine\tWashington County\t3269\t44.7\t11.6\t8.9\t20270\t116284\t0.4927\t4619\tObama\t04619\t0.010600695\t4619.0\n9039\t-67.477184\t44.707435\tMachias CDP\tME\tMaine\tWashington County\t1331\t41.2\t23.7\t13.7\t17666\t137295\t0.4927\t4630\tObama\t04630\t0.004316159\t4630.0\n9040\t-67.410167\t45.159292\tWoodland CDP\tME\tMaine\tWashington County\t958\t46.8\t13.3\t8.4\t21217\t103750\t0.4927\t4694\tObama\t04694\t0.003106597\t4694.0\n9041\t-70.390539\t43.523824\tOld Orchard Beach CDP\tME\tMaine\tYork County\t9803\t43.3\t25.7\t8.6\t26145\t154639\t0.5696\t4064\tObama\t04064\t0.031789115\t4064.0\n9042\t-70.462337\t43.538999\tSaco city\tME\tMaine\tYork County\t18568\t39.6\t27.7\t5.6\t25821\t207530\t0.5696\t4072\tObama\t04072\t0.060212207999999996\t4072.0\n9043\t-70.79522\t43.128599\tSouth Eliot CDP\tME\tMaine\tYork County\t3601\t44.8\t35.1\t3.8\t31285\t256193\t0.5696\t3903\tObama\t03903\t0.011677303\t3903.0\n9044\t-70.861875\t43.268345000000004\tBerwick CDP\tME\tMaine\tYork County\t2114\t38.2\t16.2\t7.6\t22224\t173558\t0.5696\t3901\tObama\t03901\t0.006855268\t3901.0\n9045\t-70.622642\t43.170455\tCape Neddick CDP\tME\tMaine\tYork County\t3339\t50.6\t39.1\t10.3\t36776\t361297\t0.5696\t3909\tObama\t03909\t0.010827691\t3909.0\n9046\t-70.649389\t43.143815000000004\tYork Harbor CDP\tME\tMaine\tYork County\t3588\t51.6\t45.5\t6.4\t33485\t381673\t0.5696\t3909\tObama\t03909\t0.011635147\t3909.0\n9047\t-70.739323\t43.095168\tKittery CDP\tME\tMaine\tYork County\t5265\t36.3\t30.1\t9.2\t27051\t224893\t0.5696\t3904\tObama\t03904\t0.017073313\t3904.0\n9048\t-70.580977\t43.414264\tWest Kennebunk CDP\tME\tMaine\tYork County\t1024\t38.2\t35.0\t7.1\t25698\t235750\t0.5696\t4043\tObama\t04043\t0.003320622\t4043.0\n9049\t-70.69636700000001\t43.090340000000005\tKittery Point CDP\tME\tMaine\tYork County\t1186\t52.1\t49.3\t5.0\t41097\t396528\t0.5696\t3905\tObama\t03905\t0.0038459540000000004\t3905.0\n9050\t-70.801314\t43.466806\tSpringvale CDP\tME\tMaine\tYork County\t3660\t37.7\t18.2\t5.9\t24009\t152395\t0.5696\t4083\tObama\t04083\t0.011868628\t4083.0\n9051\t-70.5442\t43.384107\tKennebunk CDP\tME\tMaine\tYork County\t5849\t46.1\t46.6\t7.4\t33070\t244602\t0.5696\t4043\tObama\t04043\t0.018967105\t4043.0\n9052\t-70.713638\t43.399209\tSouth Sanford CDP\tME\tMaine\tYork County\t4459\t40.7\t14.0\t8.3\t20910\t159071\t0.5696\t4073\tObama\t04073\t0.014459621\t4073.0\n9053\t-70.732422\t43.302\tNorth Berwick CDP\tME\tMaine\tYork County\t1799\t40.8\t19.6\t6.9\t22429\t179577\t0.5696\t3906\tObama\t03906\t0.005833786999999999\t3906.0\n9054\t-70.46323000000001\t43.360034999999996\tKennebunkport CDP\tME\tMaine\tYork County\t1530\t53.2\t58.7\t12.5\t43382\t461594\t0.5696\t4046\tObama\t04046\t0.004961475999999999\t4046.0\n9055\t-70.780142\t43.440068\tSanford CDP\tME\tMaine\tYork County\t10835\t36.9\t13.5\t11.1\t21512\t156874\t0.5696\t4073\tObama\t04073\t0.035135678999999996\t4073.0\n9056\t-70.456908\t43.46917\tBiddeford city\tME\tMaine\tYork County\t22445\t38.6\t20.5\t9.8\t23178\t201920\t0.5696\t4005\tObama\t04005\t0.072784523\t4005.0\n9057\t-70.738085\t43.663375\tLake Arrowhead CDP\tME\tMaine\tYork County\t2744\t31.3\t22.3\t9.3\t20232\t158285\t0.5696\t4061\tObama\t04061\t0.008898228000000001\t4061.0\n9058\t-78.948311\t39.589605\tMidland town\tMD\tMaryland\tAllegany County\t435\t42.1\t13.5\t8.1\t19482\t91000\t0.3285\t21542\tObama\t21542\t0.000963262\t21542.0\n9059\t-79.04285899999999\t39.488363\tWesternport town\tMD\tMaryland\tAllegany County\t1969\t46.2\t6.4\t13.3\t16381\t89118\t0.3285\t21562\tObama\t21562\t0.0043601429999999995\t21562.0\n9060\t-78.856262\t39.589432\tCresaptown-Bel Air CDP\tMD\tMaryland\tAllegany County\t5754\t40.5\t19.2\t6.9\t22973\t141754\t0.3285\t21528\tObama\t21528\t0.012741626\t21528.0\n9061\t-78.927215\t39.650869\tFrostburg city\tMD\tMaryland\tAllegany County\t7950\t25.3\t32.5\t8.6\t18940\t119247\t0.3285\t21532\tObama\t21532\t0.017604437\t21532.0\n9062\t-78.978948\t39.565009\tLonaconing town\tMD\tMaryland\tAllegany County\t1147\t42.8\t11.4\t9.8\t15576\t82639\t0.3285\t21539\tObama\t21539\t0.002539911\t21539.0\n9063\t-79.017195\t39.532241\tBarton town\tMD\tMaryland\tAllegany County\t444\t45.7\t11.6\t8.7\t16959\t88571\t0.3285\t21521\tObama\t21521\t0.000983191\t21521.0\n9064\t-78.761907\t39.65072\tCumberland city\tMD\tMaryland\tAllegany County\t20322\t42.5\t15.8\t9.6\t18875\t94791\t0.3285\t21502\tObama\t21502\t0.045000927\t21502.0\n9065\t-79.059249\t39.476791999999996\tLuke town\tMD\tMaryland\tAllegany County\t77\t48.8\t6.7\t11.1\t17116\t87500\t0.3285\t21540\tObama\t21540\t0.000170508\t21540.0\n9066\t-78.819784\t39.664789\tLa Vale CDP\tMD\tMaryland\tAllegany County\t4430\t46.6\t30.4\t5.7\t25385\t144141\t0.3285\t21524\tObama\t21524\t0.009809768\t21524.0\n9067\t-76.516414\t39.156762\tRiviera Beach CDP\tMD\tMaryland\tAnne Arundel County\t12661\t38.1\t20.7\t7.8\t30119\t221569\t0.4868\t211HH\tObama\t211HH\t0.02803645\t0.0\n9068\t-76.483914\t38.981958\tNaval Academy CDP\tMD\tMaryland\tAnne Arundel County\t4019\t21.5\t72.7\t5.0\t19757\t440909\t0.4868\t21402\tObama\t21402\t0.008899652\t21402.0\n9069\t-76.466298\t38.931451\tHighland Beach town\tMD\tMaryland\tAnne Arundel County\t109\t42.0\t69.0\t9.3\t49720\t557692\t0.4868\t21403\tObama\t21403\t0.000241369\t21403.0\n9070\t-76.53993\t39.137135\tGreen Haven CDP\tMD\tMaryland\tAnne Arundel County\t18060\t35.6\t19.4\t7.1\t29009\t218077\t0.4868\t21122\tObama\t21122\t0.039991966000000004\t21122.0\n9071\t-76.540763\t38.794502\tDeale CDP\tMD\tMaryland\tAnne Arundel County\t5074\t41.4\t23.7\t6.3\t34245\t294515\t0.4868\t20751\tObama\t20751\t0.011235838\t20751.0\n9072\t-76.59480699999999\t39.022679\tCrownsville CDP\tMD\tMaryland\tAnne Arundel County\t1821\t43.5\t49.9\t17.1\t52011\t491304\t0.4868\t21032\tObama\t21032\t0.004032413\t21032.0\n9073\t-76.553145\t38.986072\tParole CDP\tMD\tMaryland\tAnne Arundel County\t15378\t51.9\t52.7\t8.6\t51106\t392190\t0.4868\t21405\tObama\t21405\t0.03405296\t21405.0\n9074\t-76.695448\t39.0628\tOdenton CDP\tMD\tMaryland\tAnne Arundel County\t26224\t36.0\t37.3\t6.6\t34488\t258963\t0.4868\t21113\tObama\t21113\t0.05807028400000001\t21113.0\n9075\t-76.55914399999999\t38.936021000000004\tLondontowne CDP\tMD\tMaryland\tAnne Arundel County\t8754\t42.0\t26.7\t6.8\t38144\t262556\t0.4868\t21037\tObama\t21037\t0.01938481\t21037.0\n9076\t-76.602374\t39.165661\tGlen Burnie CDP\tMD\tMaryland\tAnne Arundel County\t40014\t38.8\t14.1\t8.4\t26228\t207447\t0.4868\t21060\tObama\t21060\t0.088606785\t21060.0\n9077\t-76.64192299999999\t39.217988\tPumphrey CDP\tMD\tMaryland\tAnne Arundel County\t5283\t44.5\t14.0\t10.6\t25747\t206875\t0.4868\t21090\tObama\t21090\t0.011698647\t21090.0\n9078\t-76.554076\t39.112988\tPasadena CDP\tMD\tMaryland\tAnne Arundel County\t12654\t40.6\t36.6\t6.9\t36147\t324544\t0.4868\t21146\tObama\t21146\t0.028020949\t21146.0\n9079\t-76.496487\t38.935891\tHillsmere Shores CDP\tMD\tMaryland\tAnne Arundel County\t2958\t45.3\t54.7\t3.3\t41386\t359911\t0.4868\t21403\tObama\t21403\t0.006550179000000001\t21403.0\n9080\t-76.497321\t39.042442\tArnold CDP\tMD\tMaryland\tAnne Arundel County\t23473\t41.0\t55.3\t6.8\t38455\t338003\t0.4868\t21012\tObama\t21012\t0.051978484000000005\t21012.0\n9081\t-76.823697\t39.091933000000004\tMaryland City CDP\tMD\tMaryland\tAnne Arundel County\t6841\t35.2\t26.8\t10.6\t28858\t223343\t0.4868\t20724\tObama\t20724\t0.015148673\t20724.0\n9082\t-76.57857299999999\t39.051162\tHerald Harbor CDP\tMD\tMaryland\tAnne Arundel County\t2513\t44.0\t47.1\t7.5\t45828\t343143\t0.4868\t21032\tObama\t21032\t0.005564774000000001\t21032.0\n9083\t-76.518265\t38.970257000000004\tAnnapolis city\tMD\tMaryland\tAnne Arundel County\t37572\t39.5\t46.7\t7.7\t35615\t310549\t0.4868\t214HH\tObama\t214HH\t0.083199233\t0.0\n9084\t-76.77114300000001\t39.164128000000005\tJessup CDP\tMD\tMaryland\tAnne Arundel County\t7827\t34.6\t12.0\t12.5\t19588\t284420\t0.4868\t20794\tObama\t20794\t0.017332066\t20794.0\n9085\t-76.6329\t39.186737\tFerndale CDP\tMD\tMaryland\tAnne Arundel County\t15979\t37.7\t21.2\t7.2\t26438\t216179\t0.4868\t21061\tObama\t21061\t0.035383811\t21061.0\n9086\t-76.69257900000001\t39.1331\tSevern CDP\tMD\tMaryland\tAnne Arundel County\t41106\t34.6\t32.7\t7.3\t31418\t277617\t0.4868\t21144\tObama\t21144\t0.091024904\t21144.0\n9087\t-76.588574\t38.944648\tRiva CDP\tMD\tMaryland\tAnne Arundel County\t4046\t43.2\t46.3\t4.8\t52418\t423874\t0.4868\t21140\tObama\t21140\t0.00895944\t21140.0\n9088\t-76.626681\t39.131617\tSouth Gate CDP\tMD\tMaryland\tAnne Arundel County\t28938\t34.3\t27.2\t7.0\t27847\t229130\t0.4868\t21108\tObama\t21108\t0.06408015\t21108.0\n9089\t-76.52233299999999\t38.827631\tShady Side CDP\tMD\tMaryland\tAnne Arundel County\t5877\t41.1\t30.4\t7.2\t37874\t282288\t0.4868\t20764\tObama\t20764\t0.013013997\t20764.0\n9090\t-76.575303\t39.087412\tSeverna Park CDP\tMD\tMaryland\tAnne Arundel County\t29128\t44.0\t56.7\t6.8\t43520\t450211\t0.4868\t21146\tObama\t21146\t0.064500885\t21146.0\n9091\t-76.59810300000001\t39.067365\tArden-on-the-Severn CDP\tMD\tMaryland\tAnne Arundel County\t1959\t45.8\t46.1\t4.1\t44055\t356522\t0.4868\t21032\tObama\t21032\t0.004337999\t21032.0\n9092\t-76.610372\t39.217927\tBrooklyn Park CDP\tMD\tMaryland\tAnne Arundel County\t11098\t40.0\t11.2\t7.6\t23529\t173049\t0.4868\t21225\tObama\t21225\t0.024575351000000002\t21225.0\n9093\t-76.743177\t39.107721999999995\tFort Meade CDP\tMD\tMaryland\tAnne Arundel County\t10094\t22.4\t34.0\t13.4\t17503\t326786\t0.4868\t20755\tObama\t20755\t0.022352099\t20755.0\n9094\t-76.487217\t39.103029\tLake Shore CDP\tMD\tMaryland\tAnne Arundel County\t13120\t45.2\t25.8\t6.6\t33484\t337456\t0.4868\t21122\tObama\t21122\t0.029052857\t21122.0\n9095\t-76.665876\t39.205168\tLinthicum CDP\tMD\tMaryland\tAnne Arundel County\t7435\t48.0\t32.7\t6.6\t33347\t269751\t0.4868\t21090\tObama\t21090\t0.016464024\t21090.0\n9096\t-76.506294\t38.888082\tMayo CDP\tMD\tMaryland\tAnne Arundel County\t3481\t42.2\t31.8\t4.8\t43039\t433146\t0.4868\t21037\tObama\t21037\t0.0077083080000000005\t21037.0\n9097\t-76.68440600000001\t39.008876\tCrofton CDP\tMD\tMaryland\tAnne Arundel County\t20312\t36.6\t57.0\t6.5\t39702\t333557\t0.4868\t21114\tObama\t21114\t0.044978783\t21114.0\n9098\t-76.446854\t39.04206\tCape St. Claire CDP\tMD\tMaryland\tAnne Arundel County\t8129\t38.4\t46.8\t5.9\t35580\t285154\t0.4868\t21056\tObama\t21056\t0.018000814\t21056.0\n9099\t-76.528486\t38.914359999999995\tSelby-on-the-Bay CDP\tMD\tMaryland\tAnne Arundel County\t4353\t42.2\t27.5\t5.5\t38949\t325314\t0.4868\t21037\tObama\t21037\t0.00963926\t21037.0\n9100\t-76.43292\t39.335683\tMiddle River CDP\tMD\tMaryland\tBaltimore County\t25566\t37.1\t12.2\t9.4\t21855\t145251\t0.5726\t21220\tObama\t21220\t0.056613212\t21220.0\n9101\t-76.742336\t39.264519\tCatonsville CDP\tMD\tMaryland\tBaltimore County\t40502\t41.9\t43.1\t7.4\t30671\t250244\t0.5726\t21228\tObama\t21228\t0.08968740900000001\t21228.0\n9102\t-76.748857\t39.305395000000004\tWoodlawn CDP\tMD\tMaryland\tBaltimore County\t37053\t36.4\t32.2\t8.8\t26026\t192193\t0.5726\t21228\tObama\t21228\t0.082049962\t21228.0\n9103\t-76.551985\t39.38323\tParkville CDP\tMD\tMaryland\tBaltimore County\t30622\t40.3\t24.9\t8.0\t24887\t178894\t0.5726\t21234\tObama\t21234\t0.06780919099999999\t21234.0\n9104\t-76.629701\t39.479243\tCockeysville CDP\tMD\tMaryland\tBaltimore County\t20088\t34.2\t52.8\t7.7\t33304\t324734\t0.5726\t21030\tObama\t21030\t0.044482758\t21030.0\n9105\t-76.47714\t39.22732\tEdgemere CDP\tMD\tMaryland\tBaltimore County\t9350\t45.8\t12.4\t7.2\t25575\t213622\t0.5726\t21219\tObama\t21219\t0.020704589\t21219.0\n9106\t-76.791239\t39.411594\tOwings Mills CDP\tMD\tMaryland\tBaltimore County\t27071\t33.2\t48.6\t8.0\t33304\t243182\t0.5726\t21117\tObama\t21117\t0.059945875999999995\t21117.0\n9107\t-76.610753\t39.439907\tLutherville-Timonium CDP\tMD\tMaryland\tBaltimore County\t16571\t49.0\t52.7\t5.3\t35404\t334968\t0.5726\t21093\tObama\t21093\t0.036694733\t21093.0\n9108\t-76.523651\t39.404934000000004\tCarney CDP\tMD\tMaryland\tBaltimore County\t31772\t41.1\t35.8\t7.9\t27892\t210042\t0.5726\t21234\tObama\t21234\t0.070355745\t21234.0\n9109\t-76.651459\t39.434348\tMays Chapel CDP\tMD\tMaryland\tBaltimore County\t11354\t44.3\t66.5\t5.2\t43481\t378013\t0.5726\t21093\tObama\t21093\t0.025142236000000002\t21093.0\n9110\t-76.386386\t39.320405\tBowleys Quarters CDP\tMD\tMaryland\tBaltimore County\t6697\t37.7\t16.1\t6.5\t28701\t245948\t0.5726\t21220\tObama\t21220\t0.014829801\t21220.0\n9111\t-76.44540500000001\t39.30338\tEssex CDP\tMD\tMaryland\tBaltimore County\t39396\t37.1\t10.2\t11.3\t21555\t171639\t0.5726\t21221\tObama\t21221\t0.08723828900000001\t21221.0\n9112\t-76.766737\t39.344384000000005\tMilford Mill CDP\tMD\tMaryland\tBaltimore County\t27732\t34.1\t29.6\t9.4\t25101\t197106\t0.5726\t21244\tObama\t21244\t0.061409591\t21244.0\n9113\t-76.75153\t39.40235\tGarrison CDP\tMD\tMaryland\tBaltimore County\t9086\t37.0\t62.7\t7.4\t42838\t254972\t0.5726\t21208\tObama\t21208\t0.020119988999999998\t21208.0\n9114\t-76.653479\t39.236058\tLansdowne-Baltimore Highlands CDP\tMD\tMaryland\tBaltimore County\t15610\t32.2\t7.6\t12.0\t19514\t168590\t0.5726\t21227\tObama\t21227\t0.034566699\t21227.0\n9115\t-76.508946\t39.327095\tRosedale CDP\tMD\tMaryland\tBaltimore County\t18945\t42.5\t13.9\t8.0\t24354\t195491\t0.5726\t21237\tObama\t21237\t0.041951705\t21237.0\n9116\t-76.619031\t39.394414000000005\tTowson CDP\tMD\tMaryland\tBaltimore County\t52683\t39.4\t59.1\t8.2\t35307\t293073\t0.5726\t21204\tObama\t21204\t0.11666095\t21204.0\n9117\t-76.478024\t39.406827\tPerry Hall CDP\tMD\tMaryland\tBaltimore County\t28480\t41.4\t35.7\t6.3\t30669\t243069\t0.5726\t21236\tObama\t21236\t0.06306595799999999\t21236.0\n9118\t-76.420375\t39.449639000000005\tKingsville CDP\tMD\tMaryland\tBaltimore County\t4280\t47.0\t41.4\t6.6\t38723\t480376\t0.5726\t21087\tObama\t21087\t0.009477609\t21087.0\n9119\t-76.70195799999999\t39.389269\tPikesville CDP\tMD\tMaryland\tBaltimore County\t30763\t48.1\t60.8\t7.8\t43921\t280918\t0.5726\t21208\tObama\t21208\t0.068121421\t21208.0\n9120\t-76.49894\t39.270893\tDundalk CDP\tMD\tMaryland\tBaltimore County\t61598\t42.0\t8.3\t10.7\t22749\t142597\t0.5726\t212HH\tObama\t212HH\t0.13640227800000002\t0.0\n9121\t-76.517636\t39.364273\tOverlea CDP\tMD\tMaryland\tBaltimore County\t12211\t40.3\t23.2\t7.8\t25507\t192235\t0.5726\t21234\tObama\t21234\t0.027039972000000002\t21234.0\n9122\t-76.814605\t39.455434000000004\tReisterstown CDP\tMD\tMaryland\tBaltimore County\t24089\t36.1\t40.8\t7.7\t27598\t215682\t0.5726\t21136\tObama\t21136\t0.053342550999999995\t21136.0\n9123\t-76.802356\t39.372353000000004\tRandallstown CDP\tMD\tMaryland\tBaltimore County\t33068\t39.9\t39.9\t8.6\t29736\t228762\t0.5726\t21133\tObama\t21133\t0.0732256\t21133.0\n9124\t-76.476778\t39.357145\tRossville CDP\tMD\tMaryland\tBaltimore County\t13184\t34.7\t28.9\t6.8\t28026\t197405\t0.5726\t21236\tObama\t21236\t0.029194578\t21236.0\n9125\t-76.457413\t39.381879999999995\tWhite Marsh CDP\tMD\tMaryland\tBaltimore County\t9170\t39.9\t36.6\t6.1\t32674\t253591\t0.5726\t21128\tObama\t21128\t0.020305998000000002\t21128.0\n9126\t-76.569699\t39.422174\tHampton CDP\tMD\tMaryland\tBaltimore County\t4936\t50.2\t64.7\t6.5\t47618\t493582\t0.5726\t21286\tObama\t21286\t0.010930252\t21286.0\n9127\t-76.692203\t39.242791\tArbutus CDP\tMD\tMaryland\tBaltimore County\t19923\t39.9\t27.9\t8.3\t26250\t197997\t0.5726\t21227\tObama\t21227\t0.044117382999999996\t21227.0\n9128\t-76.730623\t39.346082\tLochearn CDP\tMD\tMaryland\tBaltimore County\t25387\t40.4\t28.6\t9.3\t26235\t184978\t0.5726\t21207\tObama\t21207\t0.056216835\t21207.0\n9129\t-76.41847\t38.350615999999995\tChesapeake Ranch Estates-Drum Point CDP\tMD\tMaryland\tCalvert County\t13533\t31.7\t25.5\t8.7\t26670\t253394\t0.451\t20657\tObama\t20657\t0.029967402\t20657.0\n9130\t-76.544663\t38.687907\tChesapeake Beach town\tMD\tMaryland\tCalvert County\t5582\t35.3\t24.0\t5.2\t30943\t328582\t0.451\t20732\tObama\t20732\t0.012360751000000001\t20732.0\n9131\t-76.605536\t38.711688\tOwings CDP\tMD\tMaryland\tCalvert County\t2310\t42.3\t35.3\t4.2\t34594\t462778\t0.451\t20736\tObama\t20736\t0.0051152509999999995\t20736.0\n9132\t-76.50178100000001\t38.467738\tSt. Leonard CDP\tMD\tMaryland\tCalvert County\t745\t38.3\t26.1\t5.3\t30759\t343103\t0.451\t20685\tObama\t20685\t0.001649724\t20685.0\n9133\t-76.53484499999999\t38.707956\tNorth Beach town\tMD\tMaryland\tCalvert County\t2426\t34.4\t20.5\t7.4\t29959\t263121\t0.451\t20714\tObama\t20714\t0.005372121\t20714.0\n9134\t-76.618833\t38.611967\tHuntingtown CDP\tMD\tMaryland\tCalvert County\t3100\t40.9\t27.7\t6.1\t39540\t483766\t0.451\t20639\tObama\t20639\t0.006864623\t20639.0\n9135\t-76.46894300000001\t38.338184999999996\tSolomons CDP\tMD\tMaryland\tCalvert County\t2309\t49.2\t39.4\t10.1\t40240\t386824\t0.451\t20688\tObama\t20688\t0.005113037\t20688.0\n9136\t-76.479108\t38.462065\tCalvert Beach-Long Beach CDP\tMD\tMaryland\tCalvert County\t3215\t38.1\t27.1\t6.6\t30973\t277685\t0.451\t20685\tObama\t20685\t0.007119279\t20685.0\n9137\t-76.437603\t38.362432\tLusby CDP\tMD\tMaryland\tCalvert County\t1967\t35.0\t24.9\t7.4\t26964\t277846\t0.451\t20657\tObama\t20657\t0.004355714\t20657.0\n9138\t-76.67293599999999\t38.715878000000004\tDunkirk CDP\tMD\tMaryland\tCalvert County\t2588\t42.4\t36.9\t5.4\t41508\t497297\t0.451\t20754\tObama\t20754\t0.005730853\t20754.0\n9139\t-76.58950899999999\t38.54603\tPrince Frederick CDP\tMD\tMaryland\tCalvert County\t1954\t35.7\t19.5\t5.8\t28498\t350442\t0.451\t20678\tObama\t20678\t0.004326927\t20678.0\n9140\t-75.787536\t39.036099\tGoldsboro town\tMD\tMaryland\tCaroline County\t241\t36.0\t7.0\t10.8\t15338\t138542\t0.3721\t21636\tObama\t21636\t0.000533669\t21636.0\n9141\t-75.822216\t38.882217\tDenton town\tMD\tMaryland\tCaroline County\t3711\t41.5\t20.1\t8.6\t21692\t188122\t0.3721\t21629\tObama\t21629\t0.008217618000000001\t21629.0\n9142\t-75.766879\t39.074488\tHenderson town\tMD\tMaryland\tCaroline County\t133\t33.9\t7.1\t10.9\t14789\t141667\t0.3721\t21640\tObama\t21640\t0.000294514\t21640.0\n9143\t-75.806842\t38.976344\tGreensboro town\tMD\tMaryland\tCaroline County\t2113\t35.3\t13.7\t10.0\t19317\t173762\t0.3721\t21639\tObama\t21639\t0.004679015999999999\t21639.0\n9144\t-75.884109\t38.947584\tRidgely town\tMD\tMaryland\tCaroline County\t1802\t34.8\t14.5\t11.4\t20561\t174219\t0.3721\t21660\tObama\t21660\t0.003990339\t21660.0\n9145\t-75.747862\t39.113181\tMarydel town\tMD\tMaryland\tCaroline County\t168\t30.6\t9.1\t11.5\t13890\t162500\t0.3721\t21649\tObama\t21649\t0.00037201800000000006\t21649.0\n9146\t-75.908869\t38.711298\tPreston town\tMD\tMaryland\tCaroline County\t610\t42.1\t13.6\t9.5\t19811\t179630\t0.3721\t21655\tObama\t21655\t0.0013507810000000001\t21655.0\n9147\t-75.941383\t38.916871\tHillsboro town\tMD\tMaryland\tCaroline County\t192\t41.3\t20.7\t13.2\t23691\t262500\t0.3721\t21641\tObama\t21641\t0.000425164\t21641.0\n9148\t-75.772429\t38.692173\tFederalsburg town\tMD\tMaryland\tCaroline County\t2687\t34.8\t6.9\t8.7\t16172\t161149\t0.3721\t21632\tObama\t21632\t0.005950078\t21632.0\n9149\t-77.007343\t39.579155\tWestminster city\tMD\tMaryland\tCarroll County\t19125\t34.1\t29.7\t7.7\t26396\t225741\t0.3192\t21157\tObama\t21157\t0.042350295999999996\t21157.0\n9150\t-77.146325\t39.374781\tMount Airy town\tMD\tMaryland\tCarroll County\t9148\t35.6\t33.8\t4.9\t36536\t328748\t0.3192\t21771\tObama\t21771\t0.020257281999999998\t21771.0\n9151\t-76.972258\t39.371233000000004\tSykesville town\tMD\tMaryland\tCarroll County\t4709\t37.5\t39.7\t5.7\t31334\t294783\t0.3192\t21784\tObama\t21784\t0.010427584\t21784.0\n9152\t-77.16729699999999\t39.655733000000005\tTaneytown city\tMD\tMaryland\tCarroll County\t6997\t34.3\t16.5\t7.6\t24214\t228763\t0.3192\t21787\tObama\t21787\t0.015494118999999999\t21787.0\n9153\t-76.953325\t39.404216\tEldersburg CDP\tMD\tMaryland\tCarroll County\t31635\t38.7\t39.0\t6.0\t33921\t326425\t0.3192\t21784\tObama\t21784\t0.070052373\t21784.0\n9154\t-76.888065\t39.656791999999996\tManchester town\tMD\tMaryland\tCarroll County\t4367\t39.9\t21.7\t5.5\t29652\t265836\t0.3192\t21102\tObama\t21102\t0.009670261\t21102.0\n9155\t-77.17405600000001\t39.570325\tUnion Bridge town\tMD\tMaryland\tCarroll County\t1194\t39.8\t9.2\t4.4\t22648\t206071\t0.3192\t21791\tObama\t21791\t0.002643987\t21791.0\n9156\t-76.83398299999999\t39.615126000000004\tHampstead town\tMD\tMaryland\tCarroll County\t6516\t34.6\t27.8\t4.7\t29912\t242837\t0.3192\t21074\tObama\t21074\t0.014428995\t21074.0\n9157\t-77.103103\t39.544214000000004\tNew Windsor town\tMD\tMaryland\tCarroll County\t1417\t36.2\t29.6\t6.9\t26087\t266582\t0.3192\t21776\tObama\t21776\t0.0031377970000000003\t21776.0\n9158\t-75.948922\t39.607745\tNorth East town\tMD\tMaryland\tCecil County\t3248\t31.4\t11.7\t12.3\t20887\t160677\t0.3898\t21901\tObama\t21901\t0.007192354000000001\t21901.0\n9159\t-76.069855\t39.573271999999996\tPerryville town\tMD\tMaryland\tCecil County\t4795\t40.6\t14.6\t8.8\t24436\t194848\t0.3898\t21903\tObama\t21903\t0.010618022\t21903.0\n9160\t-75.86831600000001\t39.404429\tCecilton town\tMD\tMaryland\tCecil County\t570\t42.8\t15.0\t10.8\t21797\t225000\t0.3898\t21913\tObama\t21913\t0.001262205\t21913.0\n9161\t-75.822694\t39.605647999999995\tElkton town\tMD\tMaryland\tCecil County\t14986\t33.3\t21.0\t10.4\t22771\t187291\t0.3898\t21921\tObama\t21921\t0.033184917\t21921.0\n9162\t-76.06088199999999\t39.699684000000005\tRising Sun town\tMD\tMaryland\tCecil County\t2185\t37.5\t18.2\t10.3\t23460\t225591\t0.3898\t21911\tObama\t21911\t0.004838452\t21911.0\n9163\t-75.980032\t39.578039000000004\tCharlestown town\tMD\tMaryland\tCecil County\t1208\t42.1\t16.7\t8.5\t26111\t200439\t0.3898\t21914\tObama\t21914\t0.0026749890000000004\t21914.0\n9164\t-75.809426\t39.528918\tChesapeake City town\tMD\tMaryland\tCecil County\t882\t41.0\t23.9\t8.3\t26122\t246875\t0.3898\t21915\tObama\t21915\t0.001953096\t21915.0\n9165\t-76.103277\t39.609190999999996\tPort Deposit town\tMD\tMaryland\tCecil County\t698\t35.2\t12.4\t15.5\t22908\t195833\t0.3898\t21904\tObama\t21904\t0.001545647\t21904.0\n9166\t-77.019701\t38.510003999999995\tPort Tobacco Village town\tMD\tMaryland\tCharles County\t19\t38.8\t33.3\t10.0\t36112\t400000\t0.6484\t20677\tObama\t20677\t4.210000000000001e-05\t20677.0\n9167\t-77.007625\t38.617651\tBennsville CDP\tMD\tMaryland\tCharles County\t11143\t39.7\t32.0\t5.7\t39811\t389012\t0.6484\t20675\tObama\t20675\t0.024674999\t20675.0\n9168\t-76.90935999999999\t38.641354\tWaldorf CDP\tMD\tMaryland\tCharles County\t25118\t34.7\t27.6\t6.4\t32304\t324525\t0.6484\t20602\tObama\t20602\t0.055621163\t20602.0\n9169\t-77.137212\t38.598338\tPotomac Heights CDP\tMD\tMaryland\tCharles County\t1156\t42.0\t9.8\t4.6\t25366\t117172\t0.6484\t20640\tObama\t20640\t0.00255984\t20640.0\n9170\t-77.09047199999999\t38.626282\tBryans Road CDP\tMD\tMaryland\tCharles County\t6194\t37.0\t22.7\t6.7\t32846\t269220\t0.6484\t20616\tObama\t20616\t0.01371596\t20616.0\n9171\t-76.77460699999999\t38.537843\tHughesville CDP\tMD\tMaryland\tCharles County\t1884\t41.1\t20.8\t5.2\t36509\t354459\t0.6484\t20637\tObama\t20637\t0.0041719190000000005\t20637.0\n9172\t-76.924726\t38.607553\tSt. Charles CDP\tMD\tMaryland\tCharles County\t40490\t32.5\t24.7\t7.0\t27562\t276986\t0.6484\t20602\tObama\t20602\t0.089660837\t20602.0\n9173\t-77.15592600000001\t38.598409000000004\tIndian Head town\tMD\tMaryland\tCharles County\t3784\t32.4\t17.6\t9.6\t24448\t213494\t0.6484\t20640\tObama\t20640\t0.008379269\t20640.0\n9174\t-76.969943\t38.534653999999996\tLa Plata town\tMD\tMaryland\tCharles County\t8314\t40.5\t26.2\t7.5\t31886\t337888\t0.6484\t20646\tObama\t20646\t0.018410476999999998\t20646.0\n9175\t-75.82700200000001\t38.484964\tVienna town\tMD\tMaryland\tDorchester County\t268\t46.8\t10.3\t8.0\t17769\t134722\t0.4699\t21869\tObama\t21869\t0.000593458\t21869.0\n9176\t-75.793253\t38.573959\tBrookview town\tMD\tMaryland\tDorchester County\t61\t44.4\t11.4\t2.9\t21616\t143750\t0.4699\t21659\tObama\t21659\t0.00013507799999999998\t21659.0\n9177\t-76.096365\t38.583296999999995\tAlgonquin CDP\tMD\tMaryland\tDorchester County\t1439\t50.2\t34.4\t3.5\t35031\t252381\t0.4699\t21613\tObama\t21613\t0.003186514\t21613.0\n9178\t-75.78945999999999\t38.584016\tEldorado town\tMD\tMaryland\tDorchester County\t57\t43.8\t10.0\t3.1\t21354\t143750\t0.4699\t21659\tObama\t21659\t0.00012622\t21659.0\n9179\t-75.92493499999999\t38.597636\tEast New Market town\tMD\tMaryland\tDorchester County\t186\t43.1\t15.7\t6.3\t21554\t176136\t0.4699\t21631\tObama\t21631\t0.00041187699999999995\t21631.0\n9180\t-75.71555500000001\t38.563858\tGalestown town\tMD\tMaryland\tDorchester County\t95\t45.0\t11.6\t3.6\t21572\t125000\t0.4699\t21861\tObama\t21861\t0.00021036700000000001\t21861.0\n9181\t-75.947402\t38.608455\tSecretary town\tMD\tMaryland\tDorchester County\t503\t44.7\t18.8\t5.0\t23198\t147222\t0.4699\t21664\tObama\t21664\t0.00111384\t21664.0\n9182\t-76.07938\t38.559282\tCambridge city\tMD\tMaryland\tDorchester County\t11602\t40.5\t14.6\t10.1\t19126\t155542\t0.4699\t21613\tObama\t21613\t0.025691406\t21613.0\n9183\t-75.867525\t38.627216\tHurlock town\tMD\tMaryland\tDorchester County\t1970\t38.5\t11.3\t11.3\t19145\t146171\t0.4699\t21643\tObama\t21643\t0.004362357\t21643.0\n9184\t-76.153172\t38.503986\tChurch Creek town\tMD\tMaryland\tDorchester County\t93\t50.3\t18.3\t6.1\t25607\t246875\t0.4699\t21677\tObama\t21677\t0.000205939\t21677.0\n9185\t-77.407624\t39.623059999999995\tThurmont town\tMD\tMaryland\tFrederick County\t6124\t35.5\t23.0\t5.3\t27897\t248313\t0.4709\t21788\tObama\t21788\t0.013560952\t21788.0\n9186\t-77.429682\t39.457544\tClover Hill CDP\tMD\tMaryland\tFrederick County\t3291\t44.3\t55.3\t5.6\t44415\t416125\t0.4709\t21702\tObama\t21702\t0.007287573\t21702.0\n9187\t-77.245209\t39.342975\tGreen Valley CDP\tMD\tMaryland\tFrederick County\t13793\t41.5\t43.9\t6.8\t36868\t386201\t0.4709\t21770\tObama\t21770\t0.030543143999999998\t21770.0\n9188\t-77.353347\t39.484981\tWalkersville town\tMD\tMaryland\tFrederick County\t6195\t40.2\t32.7\t6.8\t33001\t291293\t0.4709\t21793\tObama\t21793\t0.013718174\t21793.0\n9189\t-77.621339\t39.331784000000006\tRosemont village\tMD\tMaryland\tFrederick County\t324\t42.6\t24.2\t6.8\t34700\t339655\t0.4709\t21716\tObama\t21716\t0.0007174639999999999\t21716.0\n9190\t-77.567758\t39.506126\tMyersville town\tMD\tMaryland\tFrederick County\t1579\t36.6\t43.5\t5.4\t31479\t346000\t0.4709\t21773\tObama\t21773\t0.0034965290000000004\t21773.0\n9191\t-77.326872\t39.406299\tLinganore-Bartonsville CDP\tMD\tMaryland\tFrederick County\t16891\t34.3\t45.0\t5.8\t35862\t311434\t0.4709\t21774\tObama\t21774\t0.037403339\t21774.0\n9192\t-77.627701\t39.39229\tBurkittsville town\tMD\tMaryland\tFrederick County\t186\t44.0\t37.0\t4.0\t28828\t338889\t0.4709\t21718\tObama\t21718\t0.00041187699999999995\t21718.0\n9193\t-77.415963\t39.430005\tFrederick city\tMD\tMaryland\tFrederick County\t63559\t35.7\t37.0\t8.9\t29783\t242736\t0.4709\t21701\tObama\t21701\t0.140744705\t21701.0\n9194\t-77.359177\t39.461484999999996\tDiscovery-Spring Garden CDP\tMD\tMaryland\tFrederick County\t2248\t37.6\t17.8\t4.6\t24668\t198016\t0.4709\t21793\tObama\t21793\t0.0049779590000000006\t21793.0\n9195\t-77.434639\t39.377056\tBallenger Creek CDP\tMD\tMaryland\tFrederick County\t16482\t33.0\t37.0\t6.2\t31577\t243428\t0.4709\t21703\tObama\t21703\t0.036497652\t21703.0\n9196\t-77.53549699999999\t39.440414000000004\tMiddletown town\tMD\tMaryland\tFrederick County\t4769\t40.0\t46.3\t5.9\t35604\t354239\t0.4709\t21769\tObama\t21769\t0.010560448\t21769.0\n9197\t-77.27435\t39.387938\tNew Market town\tMD\tMaryland\tFrederick County\t555\t34.0\t46.3\t5.1\t34326\t339362\t0.4709\t21774\tObama\t21774\t0.001228989\t21774.0\n9198\t-77.309487\t39.533307\tWoodsboro town\tMD\tMaryland\tFrederick County\t1032\t40.8\t32.7\t5.6\t31316\t335119\t0.4709\t21798\tObama\t21798\t0.002285255\t21798.0\n9199\t-77.32493000000001\t39.704721\tEmmitsburg town\tMD\tMaryland\tFrederick County\t2894\t39.7\t24.7\t9.0\t22376\t199462\t0.4709\t21727\tObama\t21727\t0.0064084580000000006\t21727.0\n9200\t-77.623707\t39.315843\tBrunswick city\tMD\tMaryland\tFrederick County\t4992\t37.5\t14.5\t7.9\t26412\t196510\t0.4709\t21716\tObama\t21716\t0.011054258\t21716.0\n9201\t-77.506217\t39.414268\tBraddock Heights CDP\tMD\tMaryland\tFrederick County\t4762\t45.4\t44.5\t6.1\t38354\t347192\t0.4709\t21769\tObama\t21769\t0.010544946999999999\t21769.0\n9202\t-79.155119\t39.695139000000005\tGrantsville town\tMD\tMaryland\tGarrett County\t613\t42.1\t20.0\t7.9\t15779\t156845\t0.2374\t21536\tObama\t21536\t0.0013574239999999999\t21536.0\n9203\t-79.406552\t39.416034\tOakland town\tMD\tMaryland\tGarrett County\t1811\t42.7\t25.6\t10.8\t19763\t162097\t0.2374\t21550\tObama\t21550\t0.004010269\t21550.0\n9204\t-79.37314599999999\t39.391837\tLoch Lynn Heights town\tMD\tMaryland\tGarrett County\t446\t38.2\t14.6\t10.6\t14933\t121875\t0.2374\t21550\tObama\t21550\t0.00098762\t21550.0\n9205\t-79.40499399999999\t39.662698999999996\tFriendsville town\tMD\tMaryland\tGarrett County\t532\t42.4\t14.9\t8.4\t14557\t132065\t0.2374\t21531\tObama\t21531\t0.001178058\t21531.0\n9206\t-79.183615\t39.389236\tKitzmiller town\tMD\tMaryland\tGarrett County\t319\t39.9\t6.1\t5.3\t15209\t95000\t0.2374\t21538\tObama\t21538\t0.000706392\t21538.0\n9207\t-79.379225\t39.403704\tMountain Lake Park town\tMD\tMaryland\tGarrett County\t2182\t41.3\t22.1\t9.6\t19294\t151654\t0.2374\t21550\tObama\t21550\t0.004831809\t21550.0\n9208\t-79.319923\t39.625759\tAccident town\tMD\tMaryland\tGarrett County\t377\t41.3\t14.6\t8.7\t17584\t167262\t0.2374\t21520\tObama\t21520\t0.000834827\t21520.0\n9209\t-79.32601\t39.423953999999995\tDeer Park town\tMD\tMaryland\tGarrett County\t414\t43.0\t16.2\t12.1\t16593\t143750\t0.2374\t21550\tObama\t21550\t0.000916759\t21550.0\n9210\t-76.172139\t39.513267\tAberdeen city\tMD\tMaryland\tHarford County\t14653\t38.5\t18.3\t9.4\t23558\t185908\t0.3948\t21001\tObama\t21001\t0.032447524\t21001.0\n9211\t-76.130921\t39.467143\tAberdeen Proving Ground CDP\tMD\tMaryland\tHarford County\t2496\t24.2\t22.8\t7.7\t17402\t65000\t0.3948\t21005\tObama\t21005\t0.005527129\t21005.0\n9212\t-76.445219\t39.533175\tFallston CDP\tMD\tMaryland\tHarford County\t8981\t47.2\t43.1\t6.9\t41961\t391223\t0.3948\t21047\tObama\t21047\t0.019887478\t21047.0\n9213\t-76.103876\t39.549091\tHavre de Grace city\tMD\tMaryland\tHarford County\t12397\t37.5\t26.1\t10.6\t26618\t234242\t0.3948\t21078\tObama\t21078\t0.02745185\t21078.0\n9214\t-76.23849200000001\t39.477990999999996\tRiverside CDP\tMD\tMaryland\tHarford County\t6661\t34.2\t33.8\t6.9\t31936\t190220\t0.3948\t21017\tObama\t21017\t0.014750082\t21017.0\n9215\t-76.346936\t39.534585\tBel Air town\tMD\tMaryland\tHarford County\t10211\t42.9\t36.5\t7.5\t31445\t234763\t0.3948\t21014\tObama\t21014\t0.022611182999999997\t21014.0\n9216\t-76.372927\t39.554289000000004\tBel Air North CDP\tMD\tMaryland\tHarford County\t30920\t38.1\t40.2\t6.4\t34070\t322425\t0.3948\t21050\tObama\t21050\t0.068469081\t21050.0\n9217\t-76.35127800000001\t39.419665\tJoppatowne CDP\tMD\tMaryland\tHarford County\t12236\t40.8\t22.1\t7.5\t31229\t232540\t0.3948\t21085\tObama\t21085\t0.027095332000000003\t21085.0\n9218\t-76.31976800000001\t39.505294\tBel Air South CDP\tMD\tMaryland\tHarford County\t47191\t36.5\t37.9\t6.5\t33579\t261356\t0.3948\t21015\tObama\t21015\t0.104499495\t21015.0\n9219\t-76.47529399999999\t39.603122\tJarrettsville CDP\tMD\tMaryland\tHarford County\t2937\t42.1\t30.4\t7.0\t37048\t420775\t0.3948\t21084\tObama\t21084\t0.006503676999999999\t21084.0\n9220\t-76.29677\t39.421127\tEdgewood CDP\tMD\tMaryland\tHarford County\t25855\t32.2\t15.6\t11.1\t24491\t175255\t0.3948\t21040\tObama\t21040\t0.057253172000000005\t21040.0\n9221\t-76.211352\t39.463314000000004\tPerryman CDP\tMD\tMaryland\tHarford County\t2672\t38.6\t20.2\t12.2\t21638\t166189\t0.3948\t21130\tObama\t21130\t0.005916861999999999\t21130.0\n9222\t-76.390741\t39.486098\tPleasant Hills CDP\tMD\tMaryland\tHarford County\t3157\t46.9\t35.7\t6.8\t34743\t372346\t0.3948\t21087\tObama\t21087\t0.006990844\t21087.0\n9223\t-76.751995\t39.203047\tElkridge CDP\tMD\tMaryland\tHoward County\t25303\t34.5\t48.8\t5.4\t36745\t262534\t0.5969\t21075\tObama\t21075\t0.056030826\t21075.0\n9224\t-76.826498\t39.148007\tSavage-Guilford CDP\tMD\tMaryland\tHoward County\t14313\t33.4\t46.8\t6.1\t34444\t273173\t0.5969\t20763\tObama\t20763\t0.03169463\t20763.0\n9225\t-76.83315400000001\t39.271087\tEllicott City CDP\tMD\tMaryland\tHoward County\t64612\t39.7\t62.1\t5.7\t44844\t425120\t0.5969\t21042\tObama\t21042\t0.14307646300000001\t21042.0\n9226\t-76.86698299999999\t39.202241\tColumbia CDP\tMD\tMaryland\tHoward County\t94059\t37.8\t65.2\t6.3\t42855\t322002\t0.5969\t21044\tObama\t21044\t0.20828374\t21044.0\n9227\t-76.867491\t39.134821\tNorth Laurel CDP\tMD\tMaryland\tHoward County\t24107\t35.7\t47.2\t5.3\t40434\t330772\t0.5969\t20723\tObama\t20723\t0.05338241\t20723.0\n9228\t-76.241792\t39.139216999999995\tRock Hall town\tMD\tMaryland\tKent County\t1421\t49.9\t18.2\t7.3\t22063\t177049\t0.4889\t21661\tObama\t21661\t0.003146655\t21661.0\n9229\t-75.878366\t39.342489\tGalena town\tMD\tMaryland\tKent County\t540\t46.5\t28.3\t6.8\t26369\t251744\t0.4889\t21930\tObama\t21930\t0.001195773\t21930.0\n9230\t-75.83922700000001\t39.259797\tMillington town\tMD\tMaryland\tKent County\t494\t42.2\t12.9\t7.5\t20428\t184167\t0.4889\t21651\tObama\t21651\t0.0010939110000000001\t21651.0\n9231\t-76.071601\t39.219989\tChestertown town\tMD\tMaryland\tKent County\t5012\t35.8\t36.9\t7.5\t25759\t257710\t0.4889\t21620\tObama\t21620\t0.011098546\t21620.0\n9232\t-76.069409\t39.365651\tBetterton town\tMD\tMaryland\tKent County\t436\t50.4\t36.1\t6.8\t27604\t252500\t0.4889\t21610\tObama\t21610\t0.000965476\t21610.0\n9233\t-77.074177\t38.979221\tChevy Chase Section Three village\tMD\tMaryland\tMontgomery County\t789\t43.4\t88.6\t5.3\t79965\t835000\t0.7092\t20815\tObama\t20815\t0.001747157\t20815.0\n9234\t-77.07355600000001\t39.149341\tOlney CDP\tMD\tMaryland\tMontgomery County\t33638\t39.9\t59.6\t4.4\t44097\t448113\t0.7092\t20832\tObama\t20832\t0.074487805\t20832.0\n9235\t-77.23736\t39.095535\tNorth Potomac CDP\tMD\tMaryland\tMontgomery County\t26552\t38.2\t78.4\t5.2\t48521\t585634\t0.7092\t20878\tObama\t20878\t0.058796605\t20878.0\n9236\t-76.95949399999999\t39.026089\tHillandale CDP\tMD\tMaryland\tMontgomery County\t2999\t44.5\t45.3\t7.2\t33806\t361491\t0.7092\t20903\tObama\t20903\t0.006640969\t20903.0\n9237\t-77.37997\t39.221427\tBarnesville town\tMD\tMaryland\tMontgomery County\t175\t47.1\t52.0\t3.3\t62179\t641667\t0.7092\t20838\tObama\t20838\t0.000387519\t20838.0\n9238\t-76.934539\t39.115907\tBurtonsville CDP\tMD\tMaryland\tMontgomery County\t7974\t37.9\t56.2\t4.7\t35530\t325574\t0.7092\t20866\tObama\t20866\t0.017657581999999998\t20866.0\n9239\t-77.30310300000001\t39.096171000000005\tDarnestown CDP\tMD\tMaryland\tMontgomery County\t6917\t43.6\t75.3\t4.8\t66548\t691922\t0.7092\t20878\tObama\t20878\t0.015316966999999999\t20878.0\n9240\t-77.089966\t38.963287\tFriendship Village CDP\tMD\tMaryland\tMontgomery County\t4642\t54.8\t77.2\t4.2\t71940\t377374\t0.7092\t20815\tObama\t20815\t0.01027922\t20815.0\n9241\t-77.07386899999999\t38.994561\tChevy Chase CDP\tMD\tMaryland\tMontgomery County\t9807\t45.7\t78.5\t4.5\t67356\t656489\t0.7092\t20815\tObama\t20815\t0.021716568\t20815.0\n9242\t-76.952626\t39.080453000000006\tFairland CDP\tMD\tMaryland\tMontgomery County\t22690\t33.2\t55.6\t6.5\t34395\t277128\t0.7092\t20866\tObama\t20866\t0.050244613\t20866.0\n9243\t-77.141024\t38.968157\tGlen Echo town\tMD\tMaryland\tMontgomery County\t254\t43.1\t84.5\t0.0\t59010\t741935\t0.7092\t20812\tObama\t20812\t0.000562456\t20812.0\n9244\t-77.141276\t39.209187\tLaytonsville town\tMD\tMaryland\tMontgomery County\t290\t44.0\t55.1\t5.6\t53580\t621795\t0.7092\t20882\tObama\t20882\t0.000642174\t20882.0\n9245\t-77.155462\t39.083467999999996\tRockville city\tMD\tMaryland\tMontgomery County\t56012\t41.0\t57.4\t6.2\t39272\t365742\t0.7092\t20850\tObama\t20850\t0.124032669\t20850.0\n9246\t-77.008484\t39.087626\tColesville CDP\tMD\tMaryland\tMontgomery County\t20472\t45.8\t63.2\t6.0\t42505\t459735\t0.7092\t20905\tObama\t20905\t0.045333085999999995\t20905.0\n9247\t-76.97457800000001\t39.102641999999996\tCloverly CDP\tMD\tMaryland\tMontgomery County\t8014\t41.7\t54.0\t5.2\t38634\t391037\t0.7092\t20905\tObama\t20905\t0.017746158\t20905.0\n9248\t-77.201756\t39.277151\tDamascus CDP\tMD\tMaryland\tMontgomery County\t12655\t35.0\t46.2\t4.7\t33310\t331974\t0.7092\t20872\tObama\t20872\t0.028023162999999997\t20872.0\n9249\t-77.00269399999999\t38.98107\tTakoma Park city\tMD\tMaryland\tMontgomery County\t17632\t37.5\t53.8\t8.4\t30868\t357503\t0.7092\t20912\tObama\t20912\t0.039044205\t20912.0\n9250\t-77.073985\t38.983963\tChevy Chase Section Five village\tMD\tMaryland\tMontgomery County\t658\t44.4\t89.9\t4.0\t80326\t866228\t0.7092\t20815\tObama\t20815\t0.001457072\t20815.0\n9251\t-77.07372\t39.026359\tKensington town\tMD\tMaryland\tMontgomery County\t1950\t43.0\t63.1\t5.9\t42654\t548653\t0.7092\t20895\tObama\t20895\t0.004318069\t20895.0\n9252\t-77.16194\t38.973688\tCabin John CDP\tMD\tMaryland\tMontgomery County\t1797\t48.4\t82.5\t7.0\t68239\t708333\t0.7092\t20818\tObama\t20818\t0.003979267\t20818.0\n9253\t-76.989734\t39.041667\tWhite Oak CDP\tMD\tMaryland\tMontgomery County\t22173\t34.8\t51.3\t8.3\t32060\t366513\t0.7092\t20903\tObama\t20903\t0.04909977099999999\t20903.0\n9254\t-77.079386\t38.969782\tChevy Chase Village town\tMD\tMaryland\tMontgomery County\t2074\t48.1\t88.5\t4.0\t99537\t1000001\t0.7092\t20815\tObama\t20815\t0.004592654\t20815.0\n9255\t-77.069128\t39.102185\tRossmoor CDP\tMD\tMaryland\tMontgomery County\t9180\t73.6\t40.8\t5.0\t44035\t251601\t0.7092\t20906\tObama\t20906\t0.020328142\t20906.0\n9256\t-77.248147\t39.055153999999995\tTravilah CDP\tMD\tMaryland\tMontgomery County\t8808\t44.6\t77.5\t4.7\t78650\t895299\t0.7092\t208HH\tObama\t208HH\t0.019504386999999998\t0.0\n9257\t-77.081075\t39.019222\tChevy Chase View town\tMD\tMaryland\tMontgomery County\t871\t47.0\t81.2\t6.1\t66957\t782946\t0.7092\t20895\tObama\t20895\t0.001928738\t20895.0\n9258\t-77.074253\t39.00207\tNorth Chevy Chase village\tMD\tMaryland\tMontgomery County\t473\t48.7\t80.2\t5.9\t52724\t717857\t0.7092\t20815\tObama\t20815\t0.001047409\t20815.0\n9259\t-77.129203\t38.954731\tBrookmont CDP\tMD\tMaryland\tMontgomery County\t3304\t45.5\t82.0\t4.8\t78012\t782323\t0.7092\t20816\tObama\t20816\t0.00731636\t20816.0\n9260\t-77.28765200000001\t39.223366999999996\tClarksburg CDP\tMD\tMaryland\tMontgomery County\t7468\t43.1\t53.2\t4.0\t43020\t462057\t0.7092\t20871\tObama\t20871\t0.016537099\t20871.0\n9261\t-77.01894200000001\t39.006147999999996\tSilver Spring CDP\tMD\tMaryland\tMontgomery County\t79870\t35.6\t51.8\t7.1\t31498\t338239\t0.7092\t20901\tObama\t20901\t0.176863695\t20901.0\n9262\t-77.07874\t39.092585\tAspen Hill CDP\tMD\tMaryland\tMontgomery County\t52353\t39.7\t47.3\t7.7\t32460\t339989\t0.7092\t20853\tObama\t20853\t0.1159302\t20853.0\n9263\t-77.119344\t38.986898\tBethesda CDP\tMD\tMaryland\tMontgomery County\t58381\t43.6\t81.7\t4.9\t67443\t682789\t0.7092\t20817\tObama\t20817\t0.12927857\t20817.0\n9264\t-77.02114399999999\t39.041404\tKemp Mill CDP\tMD\tMaryland\tMontgomery County\t10142\t42.6\t58.3\t6.2\t37737\t350351\t0.7092\t20901\tObama\t20901\t0.02245839\t20901.0\n9265\t-77.260355\t39.177761\tGermantown CDP\tMD\tMaryland\tMontgomery County\t61733\t32.8\t47.6\t6.2\t34570\t233717\t0.7092\t20874\tObama\t20874\t0.13670122099999998\t20874.0\n9266\t-77.23374\t39.135433\tGaithersburg city\tMD\tMaryland\tMontgomery County\t62057\t35.6\t52.1\t6.9\t36721\t292105\t0.7092\t20878\tObama\t20878\t0.137418685\t20878.0\n9267\t-77.17488900000001\t39.140858\tWashington Grove town\tMD\tMaryland\tMontgomery County\t540\t34.6\t58.9\t10.7\t28121\t387500\t0.7092\t20880\tObama\t20880\t0.001195773\t20880.0\n9268\t-77.045773\t39.020233000000005\tForest Glen CDP\tMD\tMaryland\tMontgomery County\t7586\t41.1\t53.5\t7.1\t33593\t310036\t0.7092\t20902\tObama\t20902\t0.016798397\t20902.0\n9269\t-77.145635\t39.133903000000004\tRedland CDP\tMD\tMaryland\tMontgomery County\t17942\t38.1\t53.1\t6.5\t34001\t355122\t0.7092\t20855\tObama\t20855\t0.039730668\t20855.0\n9270\t-77.005034\t39.14993\tAshton-Sandy Spring CDP\tMD\tMaryland\tMontgomery County\t3986\t46.3\t56.7\t4.7\t47404\t515385\t0.7092\t20861\tObama\t20861\t0.008826577\t20861.0\n9271\t-77.052599\t39.05751\tWheaton-Glenmont CDP\tMD\tMaryland\tMontgomery County\t61076\t37.8\t38.3\t7.8\t28744\t287162\t0.7092\t20902\tObama\t20902\t0.135246364\t20902.0\n9272\t-77.409842\t39.142731\tPoolesville town\tMD\tMaryland\tMontgomery County\t5341\t39.2\t44.8\t4.9\t40395\t375867\t0.7092\t20837\tObama\t20837\t0.011827081000000001\t20837.0\n9273\t-77.093437\t39.036021999999996\tGarrett Park town\tMD\tMaryland\tMontgomery County\t928\t47.7\t77.0\t4.2\t50932\t593066\t0.7092\t20896\tObama\t20896\t0.002054958\t20896.0\n9274\t-77.06929000000001\t38.979496999999995\tMartin's Additions village\tMD\tMaryland\tMontgomery County\t900\t45.3\t87.5\t6.6\t87504\t819656\t0.7092\t20815\tObama\t20815\t0.001992955\t20815.0\n9275\t-77.083176\t38.981903\tChevy Chase town\tMD\tMaryland\tMontgomery County\t2812\t44.5\t90.4\t5.8\t82478\t858351\t0.7092\t20815\tObama\t20815\t0.006226878000000001\t20815.0\n9276\t-77.19444200000001\t39.014092\tPotomac CDP\tMD\tMaryland\tMontgomery County\t46942\t47.0\t79.0\t5.0\t70211\t770327\t0.7092\t20854\tObama\t20854\t0.103948111\t20854.0\n9277\t-77.096176\t38.966475\tSomerset town\tMD\tMaryland\tMontgomery County\t1180\t50.7\t85.2\t4.6\t78562\t687500\t0.7092\t20816\tObama\t20816\t0.002612986\t20816.0\n9278\t-77.11911500000001\t39.039611\tNorth Bethesda CDP\tMD\tMaryland\tMontgomery County\t43366\t42.5\t67.4\t6.3\t54510\t430157\t0.7092\t20852\tObama\t20852\t0.096029436\t20852.0\n9279\t-76.931003\t39.0625\tCalverton CDP\tMD\tMaryland\tMontgomery County\t16876\t38.6\t51.9\t5.9\t33990\t305850\t0.7092\t20705\tObama\t20705\t0.037370123\t20705.0\n9280\t-77.19275999999999\t39.179572\tMontgomery Village CDP\tMD\tMaryland\tMontgomery County\t40095\t36.9\t53.3\t6.0\t36587\t240574\t0.7092\t20886\tObama\t20886\t0.088786151\t20886.0\n9281\t-77.059102\t39.18074\tBrookeville town\tMD\tMaryland\tMontgomery County\t136\t40.7\t65.1\t4.2\t49686\t598684\t0.7092\t20833\tObama\t20833\t0.000301158\t20833.0\n9282\t-77.09265699999999\t39.01871\tSouth Kensington CDP\tMD\tMaryland\tMontgomery County\t7985\t44.0\t72.4\t4.4\t51408\t549273\t0.7092\t20896\tObama\t20896\t0.017681941\t20896.0\n9283\t-77.07233599999999\t39.039201\tNorth Kensington CDP\tMD\tMaryland\tMontgomery County\t9218\t42.1\t50.0\t8.2\t33263\t317138\t0.7092\t20895\tObama\t20895\t0.020412289\t20895.0\n9284\t-76.804674\t38.983542\tGlenn Dale CDP\tMD\tMaryland\tPrince George's County\t13972\t38.0\t46.7\t7.4\t35136\t371383\t0.8973\t20769\tObama\t20769\t0.030939521\t20769.0\n9285\t-76.96893\t38.754478000000006\tFriendly CDP\tMD\tMaryland\tPrince George's County\t11472\t41.8\t31.8\t8.9\t35113\t311684\t0.8973\t20744\tObama\t20744\t0.025403535\t20744.0\n9286\t-76.944539\t38.971954\tUniversity Park town\tMD\tMaryland\tPrince George's County\t2387\t42.1\t76.0\t4.8\t40240\t385577\t0.8973\t20782\tObama\t20782\t0.00528576\t20782.0\n9287\t-76.964248\t39.000252\tAdelphi CDP\tMD\tMaryland\tPrince George's County\t14780\t33.6\t40.7\t10.0\t24766\t274616\t0.8973\t20783\tObama\t20783\t0.032728752\t20783.0\n9288\t-76.951073\t38.94493\tNorth Brentwood town\tMD\tMaryland\tPrince George's County\t440\t33.3\t13.7\t9.6\t18550\t200862\t0.8973\t20722\tObama\t20722\t0.000974334\t20722.0\n9289\t-76.913925\t38.925427\tCheverly town\tMD\tMaryland\tPrince George's County\t5954\t36.8\t42.5\t8.2\t28752\t273580\t0.8973\t20710\tObama\t20710\t0.013184505\t20710.0\n9290\t-76.926149\t38.942501\tBladensburg town\tMD\tMaryland\tPrince George's County\t7642\t31.1\t14.5\t8.9\t19931\t218571\t0.8973\t20710\tObama\t20710\t0.016922403\t20710.0\n9291\t-76.926802\t38.964464\tRiverdale Park town\tMD\tMaryland\tPrince George's County\t6519\t30.6\t24.0\t10.5\t18446\t230963\t0.8973\t20737\tObama\t20737\t0.014435638\t20737.0\n9292\t-76.68696\t38.566537\tEagle Harbor town\tMD\tMaryland\tPrince George's County\t58\t45.0\t23.3\t6.3\t31569\t287500\t0.8973\t20608\tObama\t20608\t0.000128435\t20608.0\n9293\t-77.015417\t38.67322\tAccokeek CDP\tMD\tMaryland\tPrince George's County\t9544\t40.9\t33.1\t7.8\t36498\t350000\t0.8973\t20607\tObama\t20607\t0.021134182\t20607.0\n9294\t-76.923265\t38.871028\tCoral Hills CDP\tMD\tMaryland\tPrince George's County\t9813\t33.8\t12.1\t15.7\t21077\t195699\t0.8973\t20743\tObama\t20743\t0.021729854\t20743.0\n9295\t-76.94939699999999\t38.810528000000005\tTemple Hills CDP\tMD\tMaryland\tPrince George's County\t7536\t30.5\t21.2\t7.8\t26782\t249550\t0.8973\t20748\tObama\t20748\t0.016687678\t20748.0\n9296\t-76.74244300000001\t38.956694\tBowie city\tMD\tMaryland\tPrince George's County\t51771\t38.1\t46.8\t5.9\t36334\t302780\t0.8973\t20715\tObama\t20715\t0.11464142199999999\t20715.0\n9297\t-76.924624\t39.037296999999995\tBeltsville CDP\tMD\tMaryland\tPrince George's County\t15061\t35.1\t37.2\t7.5\t26636\t279023\t0.8973\t20705\tObama\t20705\t0.033350997\t20705.0\n9298\t-76.90767\t38.876783\tCapitol Heights town\tMD\tMaryland\tPrince George's County\t3908\t36.6\t15.1\t13.1\t21644\t194700\t0.8973\t20743\tObama\t20743\t0.008653854\t20743.0\n9299\t-76.887532\t38.924603999999995\tGreater Landover CDP\tMD\tMaryland\tPrince George's County\t24358\t30.2\t11.3\t14.6\t19028\t180262\t0.8973\t20785\tObama\t20785\t0.053938223\t20785.0\n9300\t-76.748144\t38.831407\tGreater Upper Marlboro CDP\tMD\tMaryland\tPrince George's County\t23264\t35.6\t38.0\t6.5\t36710\t299693\t0.8973\t207HH\tObama\t207HH\t0.051515675999999996\t0.0\n9301\t-76.887105\t38.99492\tGreenbelt city\tMD\tMaryland\tPrince George's County\t21059\t33.9\t49.8\t8.1\t28816\t165894\t0.8973\t20770\tObama\t20770\t0.04663293599999999\t20770.0\n9302\t-76.964417\t38.942342\tMount Rainier city\tMD\tMaryland\tPrince George's County\t8299\t31.7\t22.7\t11.5\t20119\t208503\t0.8973\t20712\tObama\t20712\t0.018377261000000002\t20712.0\n9303\t-76.82881400000001\t38.880025\tLargo CDP\tMD\tMaryland\tPrince George's County\t8868\t36.4\t37.6\t8.9\t33297\t243971\t0.8973\t20774\tObama\t20774\t0.019637251\t20774.0\n9304\t-76.86020699999999\t39.096555\tLaurel city\tMD\tMaryland\tPrince George's County\t21900\t34.8\t40.5\t7.4\t31870\t228033\t0.8973\t20707\tObama\t20707\t0.048495240999999994\t20707.0\n9305\t-76.933611\t38.99556\tCollege Park city\tMD\tMaryland\tPrince George's County\t26651\t23.0\t45.8\t9.8\t23392\t266065\t0.8973\t20740\tObama\t20740\t0.05901583\t20740.0\n9306\t-76.788875\t38.888889\tKettering CDP\tMD\tMaryland\tPrince George's County\t13644\t40.7\t39.2\t7.5\t36386\t291105\t0.8973\t20774\tObama\t20774\t0.0302132\t20774.0\n9307\t-76.77565600000001\t38.93436\tWoodmore CDP\tMD\tMaryland\tPrince George's County\t8889\t41.3\t57.6\t6.2\t46227\t461573\t0.8973\t20721\tObama\t20721\t0.019683753000000002\t20721.0\n9308\t-76.874669\t38.805528\tAndrews AFB CDP\tMD\tMaryland\tPrince George's County\t7080\t24.2\t35.6\t8.3\t19784\t215385\t0.8973\t20762\tObama\t20762\t0.015677913999999998\t20762.0\n9309\t-76.956923\t38.943709000000005\tBrentwood town\tMD\tMaryland\tPrince George's County\t2741\t33.0\t16.1\t9.9\t19331\t201935\t0.8973\t20722\tObama\t20722\t0.006069656\t20722.0\n9310\t-76.870987\t38.851572999999995\tForestville CDP\tMD\tMaryland\tPrince George's County\t12497\t36.9\t18.4\t13.1\t27147\t225620\t0.8973\t20747\tObama\t20747\t0.027673289\t20747.0\n9311\t-76.919454\t38.805181\tCamp Springs CDP\tMD\tMaryland\tPrince George's County\t18703\t41.4\t25.5\t9.6\t30300\t290421\t0.8973\t20748\tObama\t20748\t0.041415822000000005\t20748.0\n9312\t-76.974975\t38.796170000000004\tOxon Hill-Glassmanor CDP\tMD\tMaryland\tPrince George's County\t34212\t33.7\t20.6\t11.9\t25729\t241125\t0.8973\t20745\tObama\t20745\t0.07575886700000001\t20745.0\n9313\t-77.00647\t38.738269\tFort Washington CDP\tMD\tMaryland\tPrince George's County\t24727\t43.3\t40.9\t8.6\t38046\t340788\t0.8973\t20744\tObama\t20744\t0.054755335\t20744.0\n9314\t-76.925744\t38.846853\tSuitland-Silver Hill CDP\tMD\tMaryland\tPrince George's County\t31985\t29.5\t16.2\t12.9\t22758\t234161\t0.8973\t20746\tObama\t20746\t0.07082741099999999\t20746.0\n9315\t-76.754687\t38.817165\tUpper Marlboro town\tMD\tMaryland\tPrince George's County\t757\t42.5\t39.8\t5.6\t39661\t291000\t0.8973\t20772\tObama\t20772\t0.0016762970000000002\t20772.0\n9316\t-76.845337\t38.966956\tLanham-Seabrook CDP\tMD\tMaryland\tPrince George's County\t18188\t37.7\t35.5\t8.5\t27881\t279098\t0.8973\t20706\tObama\t20706\t0.040275409\t20706.0\n9317\t-76.96428900000001\t38.837385\tHillcrest Heights CDP\tMD\tMaryland\tPrince George's County\t15784\t37.8\t19.7\t10.4\t26772\t226767\t0.8973\t20748\tObama\t20748\t0.034952004\t20748.0\n9318\t-76.911212\t38.959881\tEast Riverdale CDP\tMD\tMaryland\tPrince George's County\t14755\t29.8\t18.1\t12.4\t18641\t214621\t0.8973\t20737\tObama\t20737\t0.032673392\t20737.0\n9319\t-76.915276\t38.901551\tFairmount Heights town\tMD\tMaryland\tPrince George's County\t1420\t38.6\t12.9\t11.0\t19820\t206701\t0.8973\t20743\tObama\t20743\t0.00314444\t20743.0\n9320\t-76.90144000000001\t38.895193\tSeat Pleasant city\tMD\tMaryland\tPrince George's County\t4547\t37.2\t11.9\t13.4\t19981\t190385\t0.8973\t20743\tObama\t20743\t0.010068852\t20743.0\n9321\t-76.899636\t38.950447\tWoodlawn CDP\tMD\tMaryland\tPrince George's County\t6328\t34.7\t18.3\t12.1\t24143\t217122\t0.8973\t20784\tObama\t20784\t0.014012688999999998\t20784.0\n9322\t-76.85213900000001\t39.06876\tSouth Laurel CDP\tMD\tMaryland\tPrince George's County\t19752\t31.6\t37.3\t8.2\t29598\t317431\t0.8973\t20708\tObama\t20708\t0.043738722\t20708.0\n9323\t-76.953509\t38.957974\tHyattsville city\tMD\tMaryland\tPrince George's County\t14875\t35.3\t30.0\t10.1\t23205\t227765\t0.8973\t20782\tObama\t20782\t0.032939118999999996\t20782.0\n9324\t-76.949857\t38.938\tCottage City town\tMD\tMaryland\tPrince George's County\t1075\t40.8\t10.4\t10.0\t23391\t194494\t0.8973\t20722\tObama\t20722\t0.002380474\t20722.0\n9325\t-76.892133\t38.942822\tLandover Hills town\tMD\tMaryland\tPrince George's County\t1433\t37.6\t15.7\t9.3\t23862\t208586\t0.8973\t20784\tObama\t20784\t0.0031732270000000003\t20784.0\n9326\t-76.980262\t38.99151\tLangley Park CDP\tMD\tMaryland\tPrince George's County\t16830\t29.9\t14.1\t12.4\t14794\t224328\t0.8973\t20783\tObama\t20783\t0.037268261000000004\t20783.0\n9327\t-76.912805\t38.992662\tBerwyn Heights town\tMD\tMaryland\tPrince George's County\t2749\t39.1\t42.1\t7.3\t28548\t268638\t0.8973\t20740\tObama\t20740\t0.006087370999999999\t20740.0\n9328\t-76.857638\t38.929395\tGlenarden city\tMD\tMaryland\tPrince George's County\t6182\t31.4\t22.3\t14.6\t23494\t244469\t0.8973\t20785\tObama\t20785\t0.013689386999999999\t20785.0\n9329\t-76.94391800000001\t38.93033\tColmar Manor town\tMD\tMaryland\tPrince George's County\t1127\t40.2\t12.6\t13.8\t17502\t188580\t0.8973\t20722\tObama\t20722\t0.0024956229999999998\t20722.0\n9330\t-76.88614399999999\t38.875437\tWalker Mill CDP\tMD\tMaryland\tPrince George's County\t11273\t32.3\t16.1\t12.5\t23585\t235490\t0.8973\t20747\tObama\t20747\t0.02496287\t20747.0\n9331\t-76.78571\t38.761927\tMarlton CDP\tMD\tMaryland\tPrince George's County\t8445\t36.6\t38.5\t6.7\t35855\t295732\t0.8973\t20772\tObama\t20772\t0.018700562\t20772.0\n9332\t-76.829543\t38.907070000000004\tLake Arbor CDP\tMD\tMaryland\tPrince George's County\t9449\t37.6\t54.5\t7.2\t39725\t322956\t0.8973\t20774\tObama\t20774\t0.020923814\t20774.0\n9333\t-76.889873\t38.826768\tMorningside town\tMD\tMaryland\tPrince George's County\t1427\t40.0\t13.5\t12.3\t27933\t211972\t0.8973\t20762\tObama\t20762\t0.003159941\t20762.0\n9334\t-76.853557\t38.994401\tGoddard CDP\tMD\tMaryland\tPrince George's County\t5315\t38.1\t38.8\t6.8\t29569\t267791\t0.8973\t20770\tObama\t20770\t0.011769507\t20770.0\n9335\t-76.88678\t38.860103\tDistrict Heights city\tMD\tMaryland\tPrince George's County\t5688\t35.8\t17.1\t10.0\t24641\t237664\t0.8973\t20747\tObama\t20747\t0.012595476000000001\t20747.0\n9336\t-76.898042\t38.759949\tClinton CDP\tMD\tMaryland\tPrince George's County\t26836\t40.6\t25.1\t8.0\t31223\t295249\t0.8973\t20735\tObama\t20735\t0.059425492999999996\t20735.0\n9337\t-76.94864799999999\t38.823686\tMarlow Heights CDP\tMD\tMaryland\tPrince George's County\t5761\t36.3\t16.7\t10.0\t25487\t227824\t0.8973\t20748\tObama\t20748\t0.012757127\t20748.0\n9338\t-76.842197\t38.938476\tSpringdale CDP\tMD\tMaryland\tPrince George's County\t2814\t41.0\t39.5\t6.6\t37696\t337132\t0.8973\t20706\tObama\t20706\t0.006231306\t20706.0\n9339\t-76.87694300000001\t38.966275\tNew Carrollton city\tMD\tMaryland\tPrince George's County\t12369\t33.4\t28.3\t9.4\t23657\t261122\t0.8973\t20784\tObama\t20784\t0.027389847000000002\t20784.0\n9340\t-76.833499\t38.776373\tRosaryville CDP\tMD\tMaryland\tPrince George's County\t15502\t39.7\t31.8\t6.8\t36058\t319934\t0.8973\t20623\tObama\t20623\t0.034327545\t20623.0\n9341\t-76.887648\t38.893963\tCarmody Hills-Pepper Mill Village CDP\tMD\tMaryland\tPrince George's County\t4620\t38.1\t15.1\t11.0\t22055\t225385\t0.8973\t20743\tObama\t20743\t0.010230503\t20743.0\n9342\t-76.814613\t38.936271000000005\tMitchellville CDP\tMD\tMaryland\tPrince George's County\t10483\t39.9\t45.7\t7.7\t40294\t352327\t0.8973\t20721\tObama\t20721\t0.023213498\t20721.0\n9343\t-76.9996\t38.810373\tForest Heights town\tMD\tMaryland\tPrince George's County\t2653\t41.2\t18.2\t13.6\t26730\t210994\t0.8973\t20745\tObama\t20745\t0.005874789\t20745.0\n9344\t-76.977427\t38.96757\tChillum CDP\tMD\tMaryland\tPrince George's County\t34071\t33.2\t23.0\t11.4\t21015\t249313\t0.8973\t20782\tObama\t20782\t0.075446638\t20782.0\n9345\t-76.933406\t38.950165999999996\tEdmonston town\tMD\tMaryland\tPrince George's County\t1389\t31.8\t18.8\t7.8\t24026\t221951\t0.8973\t20781\tObama\t20781\t0.003075794\t20781.0\n9346\t-76.854339\t38.697148\tBrandywine CDP\tMD\tMaryland\tPrince George's County\t1451\t44.9\t18.1\t11.0\t28007\t256667\t0.8973\t20613\tObama\t20613\t0.0032130870000000003\t20613.0\n9347\t-76.899262\t39.102722\tWest Laurel CDP\tMD\tMaryland\tPrince George's County\t3921\t45.7\t40.8\t5.3\t35740\t348224\t0.8973\t20707\tObama\t20707\t0.008682641\t20707.0\n9348\t-76.156318\t38.988902\tQueenstown town\tMD\tMaryland\tQueen Anne's County\t726\t42.7\t27.0\t6.7\t27644\t253846\t0.3438\t21658\tObama\t21658\t0.00160765\t21658.0\n9349\t-76.282333\t38.968796999999995\tChester CDP\tMD\tMaryland\tQueen Anne's County\t4447\t43.0\t31.6\t6.3\t34698\t290190\t0.3438\t21619\tObama\t21619\t0.009847413000000001\t21619.0\n9350\t-75.95302\t38.920299\tQueen Anne town\tMD\tMaryland\tQueen Anne's County\t183\t41.8\t28.0\t4.0\t25121\t285714\t0.3438\t21641\tObama\t21641\t0.00040523400000000003\t21641.0\n9351\t-75.767337\t39.136705\tTempleville town\tMD\tMaryland\tQueen Anne's County\t116\t38.4\t10.5\t8.6\t20291\t220833\t0.3438\t21649\tObama\t21649\t0.00025687\t21649.0\n9352\t-76.234165\t38.969114000000005\tKent Narrows CDP\tMD\tMaryland\tQueen Anne's County\t584\t49.7\t34.7\t6.1\t33905\t401316\t0.3438\t21638\tObama\t21638\t0.001293206\t21638.0\n9353\t-76.063281\t39.045126\tCentreville town\tMD\tMaryland\tQueen Anne's County\t2979\t41.2\t31.7\t6.5\t29608\t331360\t0.3438\t21617\tObama\t21617\t0.006596681\t21617.0\n9354\t-75.98280799999999\t39.144206\tChurch Hill town\tMD\tMaryland\tQueen Anne's County\t559\t40.4\t25.6\t8.6\t27860\t228448\t0.3438\t21623\tObama\t21623\t0.001237847\t21623.0\n9355\t-76.317024\t38.975149\tStevensville CDP\tMD\tMaryland\tQueen Anne's County\t6939\t36.1\t33.2\t5.2\t31720\t306006\t0.3438\t21666\tObama\t21666\t0.015365684\t21666.0\n9356\t-76.046623\t39.20371\tKingstown CDP\tMD\tMaryland\tQueen Anne's County\t1904\t43.5\t33.3\t8.4\t27040\t230400\t0.3438\t21620\tObama\t21620\t0.0042162070000000005\t21620.0\n9357\t-76.194411\t38.953838\tGrasonville CDP\tMD\tMaryland\tQueen Anne's County\t2664\t44.6\t19.6\t10.4\t26024\t218519\t0.3438\t21638\tObama\t21638\t0.0058991469999999996\t21638.0\n9358\t-75.862975\t39.143543\tBarclay town\tMD\tMaryland\tQueen Anne's County\t159\t40.6\t11.9\t7.6\t22501\t246875\t0.3438\t21607\tObama\t21607\t0.00035208900000000004\t21607.0\n9359\t-75.857561\t39.186792\tSudlersville town\tMD\tMaryland\tQueen Anne's County\t489\t41.6\t14.4\t7.2\t20490\t183125\t0.3438\t21668\tObama\t21668\t0.001082839\t21668.0\n9360\t-76.49554\t38.294345\tCalifornia CDP\tMD\tMaryland\tSt. Mary's County\t11417\t35.0\t35.9\t6.8\t31170\t258246\t0.4122\t20619\tObama\t20619\t0.025281743\t20619.0\n9361\t-76.703288\t38.487187\tGolden Beach CDP\tMD\tMaryland\tSt. Mary's County\t2921\t40.1\t15.0\t5.8\t28846\t274082\t0.4122\t20612\tObama\t20612\t0.006468247\t20612.0\n9362\t-76.443859\t38.260994000000004\tLexington Park CDP\tMD\tMaryland\tSt. Mary's County\t13573\t27.8\t27.9\t9.7\t23649\t220440\t0.4122\t20670\tObama\t20670\t0.030055977999999997\t20670.0\n9363\t-76.641646\t38.302253\tLeonardtown town\tMD\tMaryland\tSt. Mary's County\t2765\t45.1\t30.3\t9.3\t29158\t327322\t0.4122\t20650\tObama\t20650\t0.006122801\t20650.0\n9364\t-76.784786\t38.46673\tCharlotte Hall CDP\tMD\tMaryland\tSt. Mary's County\t1397\t52.3\t15.3\t7.2\t22812\t276316\t0.4122\t20622\tObama\t20622\t0.0030935090000000004\t20622.0\n9365\t-75.696072\t38.206615\tPrincess Anne town\tMD\tMaryland\tSomerset County\t2425\t30.8\t19.2\t9.8\t14225\t123580\t0.5039\t21853\tObama\t21853\t0.005369906999999999\t21853.0\n9366\t-75.85108699999999\t37.983573\tCrisfield city\tMD\tMaryland\tSomerset County\t2577\t42.1\t11.2\t13.3\t16266\t118145\t0.5039\t21817\tObama\t21817\t0.005706495\t21817.0\n9367\t-75.94219100000001\t38.144205\tDeal Island CDP\tMD\tMaryland\tSomerset County\t558\t50.7\t6.8\t0.7\t18353\t112209\t0.5039\t21821\tObama\t21821\t0.001235632\t21821.0\n9368\t-75.93646\t38.178338000000004\tChance CDP\tMD\tMaryland\tSomerset County\t361\t48.5\t18.8\t7.3\t20130\t133750\t0.5039\t21821\tObama\t21821\t0.0007993960000000001\t21821.0\n9369\t-75.889702\t38.170243\tDames Quarter CDP\tMD\tMaryland\tSomerset County\t180\t49.0\t19.3\t7.4\t20138\t137500\t0.5039\t21821\tObama\t21821\t0.000398591\t21821.0\n9370\t-75.85165699999999\t38.082903\tFrenchtown-Rumbly CDP\tMD\tMaryland\tSomerset County\t102\t44.2\t9.9\t6.1\t18497\t106250\t0.5039\t21867\tObama\t21867\t0.000225868\t21867.0\n9371\t-76.036828\t37.984553999999996\tSmith Island CDP\tMD\tMaryland\tSomerset County\t352\t50.6\t6.5\t1.1\t18321\t112083\t0.5039\t21824\tObama\t21824\t0.0007794669999999999\t21824.0\n9372\t-75.583996\t38.095542\tWest Pocomoke CDP\tMD\tMaryland\tSomerset County\t511\t47.6\t14.1\t8.8\t27928\t172321\t0.5039\t21851\tObama\t21851\t0.0011315560000000001\t21851.0\n9373\t-75.653122\t38.27926\tEden CDP\tMD\tMaryland\tSomerset County\t939\t33.9\t19.3\t6.6\t20358\t122256\t0.5039\t21822\tObama\t21822\t0.0020793170000000002\t21822.0\n9374\t-75.782475\t38.244582\tMount Vernon CDP\tMD\tMaryland\tSomerset County\t875\t46.1\t26.4\t7.6\t21386\t170924\t0.5039\t21856\tObama\t21856\t0.001937595\t21856.0\n9375\t-75.807249\t38.101754\tFairmount CDP\tMD\tMaryland\tSomerset County\t573\t44.8\t9.6\t6.8\t18424\t99643\t0.5039\t21867\tObama\t21867\t0.001268848\t21867.0\n9376\t-76.17085\t38.684186\tOxford town\tMD\tMaryland\tTalbot County\t841\t61.4\t58.1\t5.0\t50889\t532500\t0.4305\t21654\tObama\t21654\t0.001862306\t21654.0\n9377\t-75.99880999999999\t38.868206\tCordova CDP\tMD\tMaryland\tTalbot County\t639\t42.4\t24.1\t4.9\t22680\t258654\t0.4305\t21625\tObama\t21625\t0.0014149979999999998\t21625.0\n9378\t-76.222332\t38.787099\tSt. Michaels town\tMD\tMaryland\tTalbot County\t1266\t47.8\t30.5\t6.8\t25819\t254444\t0.4305\t21663\tObama\t21663\t0.002803424\t21663.0\n9379\t-76.059649\t38.660641\tTrappe town\tMD\tMaryland\tTalbot County\t1256\t36.4\t21.7\t7.9\t21371\t170556\t0.4305\t21673\tObama\t21673\t0.00278128\t21673.0\n9380\t-76.070649\t38.773148\tEaston town\tMD\tMaryland\tTalbot County\t13809\t43.2\t30.4\t7.7\t26146\t235269\t0.4305\t21601\tObama\t21601\t0.030578575\t21601.0\n9381\t-76.335972\t38.70064\tTilghman Island CDP\tMD\tMaryland\tTalbot County\t920\t50.8\t12.0\t6.2\t17614\t221377\t0.4305\t21671\tObama\t21671\t0.0020372429999999998\t21671.0\n9382\t-77.707611\t39.608312\tFunkstown town\tMD\tMaryland\tWashington County\t1031\t40.7\t15.6\t9.6\t23549\t163915\t0.39899999999999997\t21734\tObama\t21734\t0.002283041\t21734.0\n9383\t-77.93074399999999\t39.656169\tClear Spring town\tMD\tMaryland\tWashington County\t519\t41.8\t9.9\t9.8\t22243\t196875\t0.39899999999999997\t21722\tObama\t21722\t0.001149271\t21722.0\n9384\t-77.620357\t39.692906\tLeitersburg CDP\tMD\tMaryland\tWashington County\t573\t42.3\t18.5\t5.8\t21324\t214286\t0.39899999999999997\t21783\tObama\t21783\t0.001268848\t21783.0\n9385\t-77.662818\t39.626065999999994\tRobinwood CDP\tMD\tMaryland\tWashington County\t7129\t37.6\t29.8\t10.0\t28208\t228561\t0.39899999999999997\t21742\tObama\t21742\t0.015786419\t21742.0\n9386\t-77.501949\t39.702244\tFort Ritchie CDP\tMD\tMaryland\tWashington County\t327\t34.2\t6.3\t9.7\t22487\t161364\t0.39899999999999997\t21719\tObama\t21719\t0.000724107\t21719.0\n9387\t-77.831509\t39.653571\tWilson-Conococheague CDP\tMD\tMaryland\tWashington County\t2331\t39.0\t8.1\t9.0\t19476\t161446\t0.39899999999999997\t21795\tObama\t21795\t0.005161754\t21795.0\n9388\t-77.76839100000001\t39.617055\tHalfway CDP\tMD\tMaryland\tWashington County\t10836\t43.7\t17.3\t6.8\t24015\t186889\t0.39899999999999997\t21740\tObama\t21740\t0.02399518\t21740.0\n9389\t-77.504818\t39.713432\tHighfield-Cascade CDP\tMD\tMaryland\tWashington County\t1346\t35.9\t8.3\t9.2\t22719\t166435\t0.39899999999999997\t21719\tObama\t21719\t0.002980575\t21719.0\n9390\t-77.72175\t39.639536\tHagerstown city\tMD\tMaryland\tWashington County\t39324\t36.7\t14.7\t10.4\t20047\t158203\t0.39899999999999997\t21740\tObama\t21740\t0.08707885300000001\t21740.0\n9391\t-77.613263\t39.600891\tMount Aetna CDP\tMD\tMaryland\tWashington County\t929\t43.5\t24.8\t8.2\t22981\t231944\t0.39899999999999997\t21783\tObama\t21783\t0.002057173\t21783.0\n9392\t-77.658737\t39.510837\tBoonsboro town\tMD\tMaryland\tWashington County\t3452\t43.3\t17.4\t11.9\t23501\t225401\t0.39899999999999997\t21713\tObama\t21713\t0.00764409\t21713.0\n9393\t-77.747794\t39.573572\tSt. James CDP\tMD\tMaryland\tWashington County\t2584\t39.5\t30.7\t7.0\t23929\t250365\t0.39899999999999997\t21733\tObama\t21733\t0.005721996\t21733.0\n9394\t-77.668454\t39.431872999999996\tRohrersville CDP\tMD\tMaryland\tWashington County\t170\t43.0\t24.0\t8.9\t24219\t265000\t0.39899999999999997\t21779\tObama\t21779\t0.00037644699999999997\t21779.0\n9395\t-78.17511800000001\t39.704957\tHancock town\tMD\tMaryland\tWashington County\t1764\t41.2\t8.3\t11.3\t16036\t129664\t0.39899999999999997\t21750\tObama\t21750\t0.003906192\t21750.0\n9396\t-77.69314\t39.67887\tParamount-Long Meadow CDP\tMD\tMaryland\tWashington County\t3898\t45.4\t37.2\t6.7\t31260\t271535\t0.39899999999999997\t21742\tObama\t21742\t0.00863171\t21742.0\n9397\t-77.592972\t39.642891\tCavetown CDP\tMD\tMaryland\tWashington County\t1571\t41.0\t21.2\t8.6\t24267\t222692\t0.39899999999999997\t21783\tObama\t21783\t0.003478814\t21783.0\n9398\t-77.631483\t39.648446\tChewsville CDP\tMD\tMaryland\tWashington County\t319\t42.1\t9.1\t11.1\t23578\t226563\t0.39899999999999997\t21742\tObama\t21742\t0.000706392\t21742.0\n9399\t-77.698809\t39.485934\tKeedysville town\tMD\tMaryland\tWashington County\t781\t38.5\t29.4\t6.3\t27469\t262264\t0.39899999999999997\t21756\tObama\t21756\t0.001729442\t21756.0\n9400\t-77.641677\t39.548372\tSan Mar CDP\tMD\tMaryland\tWashington County\t535\t46.3\t19.8\t7.9\t26285\t262500\t0.39899999999999997\t21713\tObama\t21713\t0.001184701\t21713.0\n9401\t-77.621804\t39.554071\tMount Lena CDP\tMD\tMaryland\tWashington County\t582\t44.7\t12.6\t11.0\t23459\t275000\t0.39899999999999997\t21713\tObama\t21713\t0.001288778\t21713.0\n9402\t-77.817673\t39.597555\tWilliamsport town\tMD\tMaryland\tWashington County\t2058\t46.5\t10.4\t6.7\t21897\t168892\t0.39899999999999997\t21795\tObama\t21795\t0.004557224\t21795.0\n9403\t-77.719351\t39.686177\tFountainhead-Orchard Hills CDP\tMD\tMaryland\tWashington County\t4940\t47.4\t34.7\t6.6\t30854\t243536\t0.39899999999999997\t21767\tObama\t21767\t0.010939108999999999\t21767.0\n9404\t-77.576739\t39.656753\tSmithsburg town\tMD\tMaryland\tWashington County\t2962\t33.8\t22.7\t9.1\t22047\t221250\t0.39899999999999997\t21783\tObama\t21783\t0.006559036999999999\t21783.0\n9405\t-77.74945600000001\t39.457643\tSharpsburg town\tMD\tMaryland\tWashington County\t809\t43.1\t23.4\t6.1\t24017\t210909\t0.39899999999999997\t21782\tObama\t21782\t0.001791445\t21782.0\n9406\t-77.747998\t39.692496999999996\tMaugansville CDP\tMD\tMaryland\tWashington County\t2871\t41.6\t14.4\t8.1\t23559\t200676\t0.39899999999999997\t21767\tObama\t21767\t0.006357526999999999\t21767.0\n9407\t-75.557799\t38.443661\tDelmar town\tMD\tMaryland\tWicomico County\t1989\t34.4\t16.3\t9.4\t19721\t130747\t0.4646\t21875\tObama\t21875\t0.0044044309999999995\t21875.0\n9408\t-75.587884\t38.373304\tSalisbury city\tMD\tMaryland\tWicomico County\t27711\t33.0\t26.8\t10.7\t19749\t150036\t0.4646\t21804\tObama\t21804\t0.061363087999999996\t21804.0\n9409\t-75.687488\t38.418325\tHebron town\tMD\tMaryland\tWicomico County\t969\t36.2\t24.8\t8.4\t23040\t167222\t0.4646\t21830\tObama\t21830\t0.002145748\t21830.0\n9410\t-75.62518100000001\t38.321985999999995\tFruitland city\tMD\tMaryland\tWicomico County\t4605\t38.9\t27.9\t10.5\t22388\t144216\t0.4646\t21826\tObama\t21826\t0.010197287\t21826.0\n9411\t-75.40766500000001\t38.394344\tPittsville town\tMD\tMaryland\tWicomico County\t1339\t36.6\t7.8\t9.8\t17454\t126480\t0.4646\t21850\tObama\t21850\t0.0029650740000000003\t21850.0\n9412\t-75.349888\t38.392308\tWillards town\tMD\tMaryland\tWicomico County\t975\t35.8\t4.3\t7.7\t17330\t145427\t0.4646\t21874\tObama\t21874\t0.002159035\t21874.0\n9413\t-75.756621\t38.458957\tMardela Springs town\tMD\tMaryland\tWicomico County\t423\t40.5\t13.6\t6.9\t21223\t146429\t0.4646\t21837\tObama\t21837\t0.000936689\t21837.0\n9414\t-75.719269\t38.538967\tSharptown town\tMD\tMaryland\tWicomico County\t751\t42.7\t18.8\t7.2\t18566\t133333\t0.4646\t21861\tObama\t21861\t0.00166301\t21861.0\n9415\t-75.41344000000001\t38.065884000000004\tStockton CDP\tMD\tMaryland\tWorcester County\t157\t40.5\t10.2\t9.7\t17502\t164286\t0.4017\t21864\tObama\t21864\t0.00034766\t21864.0\n9416\t-75.561038\t38.06714\tPocomoke City\tMD\tMaryland\tWorcester County\t4193\t38.4\t20.0\t6.1\t19980\t144108\t0.4017\t21851\tObama\t21851\t0.009284956\t21851.0\n9417\t-75.273554\t38.274837\tNewark CDP\tMD\tMaryland\tWorcester County\t367\t44.8\t24.4\t4.9\t21986\t173750\t0.4017\t21841\tObama\t21841\t0.000812683\t21841.0\n9418\t-75.066668\t38.39846\tOcean City town\tMD\tMaryland\tWorcester County\t7476\t51.9\t34.6\t6.7\t30234\t244089\t0.4017\t21842\tObama\t21842\t0.016554813999999998\t21842.0\n9419\t-75.300099\t38.391037\tWhaleyville CDP\tMD\tMaryland\tWorcester County\t130\t46.6\t13.3\t8.9\t21703\t137500\t0.4017\t21872\tObama\t21872\t0.000287871\t21872.0\n9420\t-75.11301\t38.33951\tWest Ocean City CDP\tMD\tMaryland\tWorcester County\t3638\t46.8\t25.6\t7.4\t28755\t282516\t0.4017\t21842\tObama\t21842\t0.008055966999999999\t21842.0\n9421\t-75.152898\t38.380621999999995\tOcean Pines CDP\tMD\tMaryland\tWorcester County\t12447\t55.6\t34.8\t5.4\t31947\t261389\t0.4017\t21811\tObama\t21811\t0.027562569\t21811.0\n9422\t-75.400389\t38.098775\tGirdletree CDP\tMD\tMaryland\tWorcester County\t128\t40.8\t10.2\t9.3\t17572\t164286\t0.4017\t21829\tObama\t21829\t0.000283443\t21829.0\n9423\t-75.214554\t38.327057\tBerlin town\tMD\tMaryland\tWorcester County\t3782\t40.4\t17.8\t6.2\t19260\t170687\t0.4017\t21811\tObama\t21811\t0.00837484\t21811.0\n9424\t-75.390456\t38.174013\tSnow Hill town\tMD\tMaryland\tWorcester County\t2348\t42.0\t18.2\t4.8\t20655\t152885\t0.4017\t21863\tObama\t21863\t0.005199398\t21863.0\n9425\t-76.617532\t39.310965\tBaltimore city\tMD\tMaryland\tBaltimore city\t633635\t36.3\t25.2\t14.2\t19216\t122806\t0.8719\t21201\tObama\t21201\t1.403117912\t21201.0\n9426\t-70.617198\t41.689375\tPocasset CDP\tMA\tMassachusetts\tBarnstable County\t2368\t53.5\t45.5\t3.9\t38628\t328713\t0.5319\t2559\tObama\t02559\t0.005639743000000001\t2559.0\n9427\t-70.199348\t41.733259999999994\tDennis CDP\tMA\tMassachusetts\tBarnstable County\t2573\t56.5\t47.4\t3.7\t37230\t420882\t0.5319\t2638\tObama\t02638\t0.006127980999999999\t2638.0\n9428\t-70.48140699999999\t41.568313\tNew Seabury CDP\tMA\tMassachusetts\tBarnstable County\t842\t63.2\t58.2\t3.7\t63609\t507479\t0.5319\t2649\tObama\t02649\t0.0020053479999999997\t2649.0\n9429\t-70.499076\t41.582997\tSeabrook CDP\tMA\tMassachusetts\tBarnstable County\t504\t52.1\t45.0\t7.7\t51497\t381250\t0.5319\t2649\tObama\t02649\t0.0012003510000000001\t2649.0\n9430\t-70.360407\t41.672755\tBarnstable Town city\tMA\tMassachusetts\tBarnstable County\t45865\t46.3\t39.0\t6.7\t32084\t302576\t0.5319\t2632\tObama\t02632\t0.1092343\t2632.0\n9431\t-70.001501\t41.789757\tOrleans CDP\tMA\tMassachusetts\tBarnstable County\t1635\t56.5\t40.9\t3.3\t29927\t294932\t0.5319\t2653\tObama\t02653\t0.003893995\t2653.0\n9432\t-70.46750899999999\t41.61228\tMashpee Neck CDP\tMA\tMassachusetts\tBarnstable County\t992\t41.7\t44.4\t5.4\t34405\t250481\t0.5319\t2649\tObama\t02649\t0.002362595\t2649.0\n9433\t-70.186545\t42.053119\tProvincetown CDP\tMA\tMassachusetts\tBarnstable County\t3449\t48.9\t46.6\t21.2\t40188\t612294\t0.5319\t2657\tObama\t02657\t0.008214305\t2657.0\n9434\t-70.504239\t41.571008\tMonomoscoy Island CDP\tMA\tMassachusetts\tBarnstable County\t161\t52.3\t44.5\t7.5\t51347\t388235\t0.5319\t2649\tObama\t02649\t0.000383445\t2649.0\n9435\t-70.608172\t41.73448\tBourne CDP\tMA\tMassachusetts\tBarnstable County\t1428\t54.4\t39.3\t7.9\t35546\t380769\t0.5319\t2532\tObama\t02532\t0.003400994\t2532.0\n9436\t-70.13592\t41.66789\tDennis Port CDP\tMA\tMassachusetts\tBarnstable County\t3757\t49.4\t25.7\t10.6\t31971\t228169\t0.5319\t2639\tObama\t02639\t0.008947853\t2639.0\n9437\t-70.63550500000001\t41.600836\tWest Falmouth CDP\tMA\tMassachusetts\tBarnstable County\t1949\t49.0\t56.2\t6.1\t47453\t506696\t0.5319\t2556\tObama\t02556\t0.004641833\t2556.0\n9438\t-69.99692900000001\t41.854215\tNorth Eastham CDP\tMA\tMassachusetts\tBarnstable County\t1689\t52.3\t32.3\t8.9\t29111\t343466\t0.5319\t2642\tObama\t02642\t0.004022604\t2642.0\n9439\t-70.081071\t41.761845\tBrewster CDP\tMA\tMassachusetts\tBarnstable County\t2183\t55.0\t52.6\t6.3\t32110\t439130\t0.5319\t2631\tObama\t02631\t0.005199138\t2631.0\n9440\t-69.991753\t41.680551\tWest Chatham CDP\tMA\tMassachusetts\tBarnstable County\t1506\t55.1\t48.8\t7.4\t40624\t508234\t0.5319\t2669\tObama\t02669\t0.0035867620000000003\t2669.0\n9441\t-70.604102\t41.719353999999996\tMonument Beach CDP\tMA\tMassachusetts\tBarnstable County\t2300\t46.3\t35.3\t5.0\t32327\t246959\t0.5319\t2559\tObama\t02559\t0.005477791\t2559.0\n9442\t-70.16562900000001\t41.666472\tWest Dennis CDP\tMA\tMassachusetts\tBarnstable County\t2632\t56.9\t39.6\t7.7\t36528\t369531\t0.5319\t2670\tObama\t02670\t0.006268498000000001\t2670.0\n9443\t-70.24714399999999\t41.652175\tWest Yarmouth CDP\tMA\tMassachusetts\tBarnstable County\t5961\t46.5\t28.8\t7.4\t29127\t233667\t0.5319\t2673\tObama\t02673\t0.014197006000000002\t2673.0\n9444\t-70.53323499999999\t41.790289\tSagamore CDP\tMA\tMassachusetts\tBarnstable County\t3435\t41.6\t30.0\t8.1\t29039\t305450\t0.5319\t2563\tObama\t02563\t0.008180962\t2563.0\n9445\t-70.608775\t41.551737\tFalmouth CDP\tMA\tMassachusetts\tBarnstable County\t4049\t57.7\t47.4\t8.9\t37302\t404126\t0.5319\t2540\tObama\t02540\t0.009643294\t2540.0\n9446\t-70.225571\t41.710039\tYarmouth Port CDP\tMA\tMassachusetts\tBarnstable County\t5236\t56.7\t42.9\t8.4\t36808\t342616\t0.5319\t2675\tObama\t02675\t0.012470311000000001\t2675.0\n9447\t-70.459916\t41.583318\tPopponesset Island CDP\tMA\tMassachusetts\tBarnstable County\t45\t64.6\t60.0\t4.2\t64381\t553571\t0.5319\t2649\tObama\t02649\t0.000107174\t2649.0\n9448\t-70.43397900000001\t41.73657\tEast Sandwich CDP\tMA\tMassachusetts\tBarnstable County\t3834\t49.0\t59.6\t6.3\t43569\t481604\t0.5319\t2537\tObama\t02537\t0.00913124\t2537.0\n9449\t-70.463724\t41.573784\tPopponesset CDP\tMA\tMassachusetts\tBarnstable County\t344\t63.7\t59.2\t3.3\t64450\t519231\t0.5319\t2649\tObama\t02649\t0.0008192869999999999\t2649.0\n9450\t-70.499588\t41.757090000000005\tSandwich CDP\tMA\tMassachusetts\tBarnstable County\t3223\t54.1\t47.4\t4.7\t43519\t324082\t0.5319\t2563\tObama\t02563\t0.007676053\t2563.0\n9451\t-70.200365\t41.669426\tSouth Yarmouth CDP\tMA\tMassachusetts\tBarnstable County\t11008\t52.3\t29.2\t8.3\t31411\t248272\t0.5319\t2664\tObama\t02664\t0.026217185\t2664.0\n9452\t-70.555865\t41.571201\tEast Falmouth CDP\tMA\tMassachusetts\tBarnstable County\t7169\t49.5\t33.0\t8.0\t33784\t289452\t0.5319\t2536\tObama\t02536\t0.017074037\t2536.0\n9453\t-70.625062\t41.639323\tNorth Falmouth CDP\tMA\tMassachusetts\tBarnstable County\t3123\t51.7\t53.4\t5.8\t41094\t472811\t0.5319\t2556\tObama\t02556\t0.007437888\t2556.0\n9454\t-70.585615\t41.562628000000004\tTeaticket CDP\tMA\tMassachusetts\tBarnstable County\t1864\t50.4\t29.0\t6.8\t28908\t268519\t0.5319\t025HH\tObama\t025HH\t0.004439392\t0.0\n9455\t-70.064103\t41.672348\tHarwich Port CDP\tMA\tMassachusetts\tBarnstable County\t1821\t59.5\t42.9\t5.8\t39218\t448936\t0.5319\t2646\tObama\t02646\t0.0043369820000000005\t2646.0\n9456\t-70.512428\t41.566178\tSeconsett Island CDP\tMA\tMassachusetts\tBarnstable County\t86\t51.6\t44.1\t7.0\t51253\t377778\t0.5319\t2536\tObama\t02536\t0.000204822\t2536.0\n9457\t-70.102726\t41.691935\tNorthwest Harwich CDP\tMA\tMassachusetts\tBarnstable County\t4167\t52.0\t37.1\t7.0\t31541\t324390\t0.5319\t2671\tObama\t02671\t0.009924329\t2671.0\n9458\t-70.153824\t41.70517\tSouth Dennis CDP\tMA\tMassachusetts\tBarnstable County\t3703\t47.9\t30.0\t5.4\t31253\t237211\t0.5319\t2660\tObama\t02660\t0.008819244\t2660.0\n9459\t-70.035004\t41.707759\tEast Harwich CDP\tMA\tMassachusetts\tBarnstable County\t4753\t52.0\t39.4\t6.3\t32070\t317263\t0.5319\t2645\tObama\t02645\t0.011319973999999998\t2645.0\n9460\t-70.157865\t41.739503000000006\tEast Dennis CDP\tMA\tMassachusetts\tBarnstable County\t3185\t59.8\t47.5\t6.1\t37701\t407377\t0.5319\t2660\tObama\t02660\t0.00758555\t2660.0\n9461\t-70.50791\t41.684340999999996\tForestdale CDP\tMA\tMassachusetts\tBarnstable County\t4233\t37.8\t33.4\t7.7\t31640\t289248\t0.5319\t2644\tObama\t02644\t0.010081517\t2644.0\n9462\t-70.611389\t41.754207\tBuzzards Bay CDP\tMA\tMassachusetts\tBarnstable County\t3492\t37.1\t22.3\t9.6\t26256\t235345\t0.5319\t2532\tObama\t02532\t0.008316716\t2532.0\n9463\t-69.964109\t41.677865000000004\tChatham CDP\tMA\tMassachusetts\tBarnstable County\t1765\t57.5\t54.8\t5.4\t46478\t620915\t0.5319\t2633\tObama\t02633\t0.0042036090000000005\t2633.0\n9464\t-70.659453\t41.530390999999995\tWoods Hole CDP\tMA\tMassachusetts\tBarnstable County\t904\t56.2\t69.1\t6.1\t53889\t712500\t0.5319\t2543\tObama\t02543\t0.00215301\t2543.0\n9465\t-70.069575\t41.692344\tHarwich Center CDP\tMA\tMassachusetts\tBarnstable County\t2045\t52.8\t37.8\t5.2\t32609\t335714\t0.5319\t2645\tObama\t02645\t0.0048704709999999995\t2645.0\n9466\t-73.116618\t42.684360999999996\tNorth Adams city\tMA\tMassachusetts\tBerkshire County\t13556\t40.2\t17.8\t10.0\t21557\t141592\t0.7584\t1247\tObama\t01247\t0.032285625\t1247.0\n9467\t-73.260406\t42.45149\tPittsfield city\tMA\tMassachusetts\tBerkshire County\t43226\t42.6\t24.9\t10.7\t26692\t168511\t0.7584\t1201\tObama\t01201\t0.10294913\t1201.0\n9468\t-73.285279\t42.358434\tLenox CDP\tMA\tMassachusetts\tBerkshire County\t1513\t53.8\t53.1\t3.6\t27865\t324336\t0.7584\t1240\tObama\t01240\t0.0036034340000000004\t1240.0\n9469\t-73.362647\t42.248736\tHousatonic CDP\tMA\tMassachusetts\tBerkshire County\t1246\t42.8\t29.7\t7.3\t27931\t243119\t0.7584\t1236\tObama\t01236\t0.0029675340000000004\t1236.0\n9470\t-73.362138\t42.193628000000004\tGreat Barrington CDP\tMA\tMassachusetts\tBerkshire County\t2213\t43.3\t44.5\t5.6\t29823\t328623\t0.7584\t1230\tObama\t01230\t0.0052705880000000005\t1230.0\n9471\t-73.118615\t42.627795\tAdams CDP\tMA\tMassachusetts\tBerkshire County\t5250\t44.3\t18.9\t12.7\t24238\t149188\t0.7584\t1220\tObama\t01220\t0.012503654\t1220.0\n9472\t-73.250414\t42.306841999999996\tLee CDP\tMA\tMassachusetts\tBerkshire County\t1939\t41.6\t27.9\t5.4\t28074\t216992\t0.7584\t1238\tObama\t01238\t0.004618016\t1238.0\n9473\t-73.201252\t42.708734\tWilliamstown CDP\tMA\tMassachusetts\tBerkshire County\t4730\t23.6\t66.6\t8.6\t28159\t310241\t0.7584\t1267\tObama\t01267\t0.011265197\t1267.0\n9474\t-71.295282\t41.930545\tAttleboro city\tMA\tMassachusetts\tBristol County\t42597\t38.8\t28.7\t11.0\t28479\t241455\t0.5947\t2703\tObama\t02703\t0.101451073\t2703.0\n9475\t-70.94211\t41.605455\tBliss Corner CDP\tMA\tMassachusetts\tBristol County\t5451\t49.7\t20.7\t13.2\t25116\t225000\t0.5947\t2748\tObama\t02748\t0.012982365\t2748.0\n9476\t-70.94574899999999\t41.673252000000005\tNew Bedford city\tMA\tMassachusetts\tBristol County\t96516\t36.6\t14.3\t17.5\t19495\t181190\t0.5947\t2746\tObama\t02746\t0.22986716899999998\t2746.0\n9477\t-71.329833\t41.888042999999996\tNorth Seekonk CDP\tMA\tMassachusetts\tBristol County\t2610\t41.7\t19.6\t12.9\t26675\t235928\t0.5947\t2703\tObama\t02703\t0.006216101999999999\t2703.0\n9478\t-70.906384\t41.685061\tAcushnet Center CDP\tMA\tMassachusetts\tBristol County\t3125\t43.0\t13.5\t8.7\t25022\t204553\t0.5947\t2743\tObama\t02743\t0.007442651\t2743.0\n9479\t-71.21806600000001\t42.022625\tMansfield Center CDP\tMA\tMassachusetts\tBristol County\t7605\t36.2\t35.8\t10.9\t32411\t308961\t0.5947\t2048\tObama\t02048\t0.018112435\t2048.0\n9480\t-71.324929\t41.972833\tNorth Attleborough Center CDP\tMA\tMassachusetts\tBristol County\t17178\t38.4\t37.3\t12.3\t31769\t260487\t0.5947\t2760\tObama\t02760\t0.040911955\t2760.0\n9481\t-71.185396\t41.972524\tNorton Center CDP\tMA\tMassachusetts\tBristol County\t2991\t22.4\t49.4\t12.5\t23401\t323626\t0.5947\t2766\tObama\t02766\t0.00712351\t2766.0\n9482\t-70.99204300000001\t41.643355\tSmith Mills CDP\tMA\tMassachusetts\tBristol County\t4687\t46.4\t26.1\t10.9\t29275\t231805\t0.5947\t2747\tObama\t02747\t0.011162786000000001\t2747.0\n9483\t-71.0431\t41.932751\tRaynham Center CDP\tMA\tMassachusetts\tBristol County\t4060\t40.8\t26.0\t8.6\t30418\t278916\t0.5947\t2767\tObama\t02767\t0.009669492\t2767.0\n9484\t-71.209239\t41.728281\tOcean Grove CDP\tMA\tMassachusetts\tBristol County\t2917\t45.1\t16.3\t11.8\t25945\t204768\t0.5947\t2777\tObama\t02777\t0.006947268\t2777.0\n9485\t-71.112109\t41.653884000000005\tNorth Westport CDP\tMA\tMassachusetts\tBristol County\t4840\t43.5\t18.9\t10.3\t28698\t247901\t0.5947\t2723\tObama\t02723\t0.011527178\t2723.0\n9486\t-71.093906\t41.903364\tTaunton city\tMA\tMassachusetts\tBristol County\t56896\t37.5\t19.3\t11.7\t25344\t230175\t0.5947\t2780\tObama\t02780\t0.13550626300000002\t2780.0\n9487\t-71.10184699999999\t41.712526000000004\tFall River city\tMA\tMassachusetts\tBristol County\t92339\t37.2\t14.3\t15.0\t21061\t219199\t0.5947\t2723\tObama\t02723\t0.219919024\t2723.0\n9488\t-71.17393100000001\t41.740712\tSomerset CDP\tMA\tMassachusetts\tBristol County\t18251\t45.6\t24.7\t12.2\t27953\t240287\t0.5947\t2725\tObama\t02725\t0.043467463\t2725.0\n9489\t-70.607475\t41.456656\tVineyard Haven CDP\tMA\tMassachusetts\tDukes County\t2017\t44.4\t39.3\t1.0\t32448\t487912\t0.7289\t2568\tObama\t02568\t0.004803785\t2568.0\n9490\t-70.955138\t42.639375\tTopsfield CDP\tMA\tMassachusetts\tEssex County\t2753\t44.8\t58.2\t8.6\t43619\t528819\t0.5746\t1983\tObama\t01983\t0.006556678000000001\t1983.0\n9491\t-70.925604\t42.428422999999995\tNahant CDP\tMA\tMassachusetts\tEssex County\t3584\t48.8\t54.2\t6.5\t47673\t470168\t0.5746\t1908\tObama\t01908\t0.008535828\t1908.0\n9492\t-71.014978\t42.46847\tSaugus CDP\tMA\tMassachusetts\tEssex County\t26535\t44.1\t24.1\t8.9\t33966\t340819\t0.5746\t1906\tObama\t01906\t0.063197038\t1906.0\n9493\t-71.087058\t42.783889\tHaverhill city\tMA\tMassachusetts\tEssex County\t61125\t37.6\t28.7\t9.8\t30359\t246927\t0.5746\t1830\tObama\t01830\t0.14557825300000002\t1830.0\n9494\t-70.77428\t42.633485\tEssex CDP\tMA\tMassachusetts\tEssex County\t1471\t42.2\t39.9\t8.3\t38209\t427941\t0.5746\t1929\tObama\t01929\t0.003503405\t1929.0\n9495\t-71.142139\t42.655041\tAndover CDP\tMA\tMassachusetts\tEssex County\t7978\t44.4\t66.1\t7.4\t47889\t506034\t0.5746\t1810\tObama\t01810\t0.01900079\t1810.0\n9496\t-70.983334\t42.669495\tBoxford CDP\tMA\tMassachusetts\tEssex County\t2304\t43.5\t67.8\t7.9\t50584\t608262\t0.5746\t1921\tObama\t01921\t0.005487318000000001\t1921.0\n9497\t-70.83076700000001\t42.679198\tIpswich CDP\tMA\tMassachusetts\tEssex County\t4154\t41.1\t44.7\t7.9\t32020\t360862\t0.5746\t1938\tObama\t01938\t0.009893367\t1938.0\n9498\t-71.03824300000001\t42.535598\tLynnfield CDP\tMA\tMassachusetts\tEssex County\t11398\t45.5\t55.9\t9.0\t45391\t528882\t0.5746\t1940\tObama\t01940\t0.027146028\t1940.0\n9499\t-70.966363\t42.478201\tLynn city\tMA\tMassachusetts\tEssex County\t89721\t34.9\t20.6\t13.4\t23887\t235058\t0.5746\t1904\tObama\t01904\t0.213683869\t1904.0\n9500\t-70.61627299999999\t42.64499\tRockport CDP\tMA\tMassachusetts\tEssex County\t5606\t49.1\t50.0\t10.0\t36175\t445727\t0.5746\t1966\tObama\t01966\t0.01335152\t1966.0\n9501\t-70.90717099999999\t42.510484999999996\tSalem city\tMA\tMassachusetts\tEssex County\t41124\t38.5\t36.8\t10.7\t32427\t309620\t0.5746\t1970\tObama\t01970\t0.097942905\t1970.0\n9502\t-70.928343\t42.856544\tAmesbury CDP\tMA\tMassachusetts\tEssex County\t12666\t38.6\t29.1\t10.5\t30746\t275079\t0.5746\t1913\tObama\t01913\t0.030165958\t1913.0\n9503\t-70.875022\t42.718577\tRowley CDP\tMA\tMassachusetts\tEssex County\t1626\t44.0\t48.0\t5.3\t36457\t446903\t0.5746\t1969\tObama\t01969\t0.00387256\t1969.0\n9504\t-70.94999399999999\t42.574604\tDanvers CDP\tMA\tMassachusetts\tEssex County\t28190\t43.9\t39.5\t8.5\t36058\t367911\t0.5746\t1923\tObama\t01923\t0.067138666\t1923.0\n9505\t-70.972521\t42.533623\tPeabody city\tMA\tMassachusetts\tEssex County\t50252\t43.3\t28.3\t9.7\t32448\t341135\t0.5746\t1960\tObama\t01960\t0.11968259099999999\t1960.0\n9506\t-71.18907\t42.733965999999995\tMethuen city\tMA\tMassachusetts\tEssex County\t45234\t39.9\t28.4\t10.5\t29724\t253519\t0.5746\t1844\tObama\t01844\t0.10773148\t1844.0\n9507\t-70.902107\t42.813395\tNewburyport city\tMA\tMassachusetts\tEssex County\t17670\t44.6\t49.1\t8.4\t41677\t395081\t0.5746\t1950\tObama\t01950\t0.042083725999999995\t1950.0\n9508\t-70.906662\t42.475805\tSwampscott CDP\tMA\tMassachusetts\tEssex County\t14101\t45.2\t56.3\t6.9\t42728\t435297\t0.5746\t1907\tObama\t01907\t0.033583623\t1907.0\n9509\t-70.84191\t42.836208\tSalisbury CDP\tMA\tMassachusetts\tEssex County\t5590\t40.8\t23.6\t7.9\t32709\t291537\t0.5746\t1952\tObama\t01952\t0.013313413999999999\t1952.0\n9510\t-70.861891\t42.568608000000005\tBeverly city\tMA\tMassachusetts\tEssex County\t39911\t40.5\t42.5\t8.4\t35233\t362679\t0.5746\t1915\tObama\t01915\t0.09505396599999999\t1915.0\n9511\t-70.863798\t42.499041\tMarblehead CDP\tMA\tMassachusetts\tEssex County\t19932\t45.2\t67.3\t7.4\t52792\t565732\t0.5746\t1945\tObama\t01945\t0.047471014000000006\t1945.0\n9512\t-70.689346\t42.625653\tGloucester city\tMA\tMassachusetts\tEssex County\t30287\t43.1\t32.8\t11.7\t31654\t337943\t0.5746\t1930\tObama\t01930\t0.072132983\t1930.0\n9513\t-71.162704\t42.700173\tLawrence city\tMA\tMassachusetts\tEssex County\t75853\t29.0\t13.4\t16.3\t17421\t189974\t0.5746\t1840\tObama\t01840\t0.18065517\t1840.0\n9514\t-72.435563\t42.706749\tNorthfield CDP\tMA\tMassachusetts\tFranklin County\t1185\t42.9\t38.3\t6.9\t26433\t221605\t0.7187\t1360\tObama\t01360\t0.002822253\t1360.0\n9515\t-72.74335500000001\t42.606274\tShelburne Falls CDP\tMA\tMassachusetts\tFranklin County\t1998\t44.4\t36.9\t9.9\t25677\t185516\t0.7187\t1370\tObama\t01370\t0.004758533\t1370.0\n9516\t-72.557293\t42.597646999999995\tTurners Falls CDP\tMA\tMassachusetts\tFranklin County\t4389\t41.4\t17.1\t15.1\t20746\t170235\t0.7187\t1376\tObama\t01376\t0.010453054\t1376.0\n9517\t-72.492405\t42.579074\tMillers Falls CDP\tMA\tMassachusetts\tFranklin County\t1091\t38.9\t21.4\t6.2\t23973\t158388\t0.7187\t1349\tObama\t01349\t0.0025983779999999997\t1349.0\n9518\t-72.598412\t42.589876000000004\tGreenfield CDP\tMA\tMassachusetts\tFranklin County\t13583\t40.8\t28.0\t11.6\t23242\t162772\t0.7187\t1301\tObama\t01301\t0.032349929\t1301.0\n9519\t-72.59469\t42.479548\tSouth Deerfield CDP\tMA\tMassachusetts\tFranklin County\t1891\t43.2\t40.4\t7.9\t35566\t272083\t0.7187\t1373\tObama\t01373\t0.004503697\t1373.0\n9520\t-72.303226\t42.597207\tOrange CDP\tMA\tMassachusetts\tFranklin County\t4078\t38.8\t20.5\t11.0\t23664\t141637\t0.7187\t1364\tObama\t01364\t0.009712361999999999\t1364.0\n9521\t-72.153006\t42.054464\tHolland CDP\tMA\tMassachusetts\tHampden County\t1537\t39.8\t24.6\t10.8\t25434\t193966\t0.6196\t1521\tObama\t01521\t0.0036605929999999997\t1521.0\n9522\t-72.571708\t42.047437\tLongmeadow CDP\tMA\tMassachusetts\tHampden County\t15667\t46.2\t65.5\t9.8\t41177\t376414\t0.6196\t1106\tObama\t01106\t0.037313284\t1106.0\n9523\t-72.5719\t42.176241999999995\tChicopee city\tMA\tMassachusetts\tHampden County\t55042\t41.0\t15.3\t11.7\t22932\t164404\t0.6196\t1020\tObama\t01020\t0.13109068699999998\t1020.0\n9524\t-72.539358\t42.115456\tSpringfield city\tMA\tMassachusetts\tHampden County\t152512\t32.5\t18.6\t16.9\t18897\t138549\t0.6196\t1109\tObama\t01109\t0.36322994799999997\t1109.0\n9525\t-72.652326\t42.065552000000004\tAgawam city\tMA\tMassachusetts\tHampden County\t28304\t43.7\t25.5\t11.1\t28838\t218933\t0.6196\t1030\tObama\t01030\t0.067410174\t1030.0\n9526\t-72.36894000000001\t42.177869\tThree Rivers CDP\tMA\tMassachusetts\tHampden County\t3111\t37.8\t11.2\t11.8\t24388\t175984\t0.6196\t1080\tObama\t01080\t0.007409308000000001\t1080.0\n9527\t-72.755976\t42.138084\tWestfield city\tMA\tMassachusetts\tHampden County\t41651\t37.9\t28.4\t12.3\t24953\t215843\t0.6196\t1085\tObama\t01085\t0.099198034\t1085.0\n9528\t-72.341615\t42.213640000000005\tBondsville CDP\tMA\tMassachusetts\tHampden County\t1866\t40.8\t22.3\t8.0\t28080\t204116\t0.6196\t1069\tObama\t01069\t0.0044441559999999995\t1069.0\n9529\t-72.641042\t42.212499\tHolyoke city\tMA\tMassachusetts\tHampden County\t40198\t34.8\t20.1\t15.2\t18919\t166503\t0.6196\t1040\tObama\t01040\t0.095737499\t1040.0\n9530\t-72.304819\t42.098975\tMonson Center CDP\tMA\tMassachusetts\tHampden County\t2163\t40.0\t23.6\t10.8\t25939\t222238\t0.6196\t1057\tObama\t01057\t0.005151505\t1057.0\n9531\t-72.650162\t42.125333000000005\tWest Springfield CDP\tMA\tMassachusetts\tHampden County\t28067\t41.0\t25.5\t11.1\t25426\t200883\t0.6196\t1089\tObama\t01089\t0.066845723\t1089.0\n9532\t-72.318636\t42.161322999999996\tPalmer CDP\tMA\tMassachusetts\tHampden County\t3880\t41.9\t12.5\t11.4\t24795\t178285\t0.6196\t1069\tObama\t01069\t0.009240795\t1069.0\n9533\t-72.434497\t42.134077000000005\tWilbraham CDP\tMA\tMassachusetts\tHampden County\t3799\t48.0\t44.6\t12.2\t36820\t296279\t0.6196\t1095\tObama\t01095\t0.009047882\t1095.0\n9534\t-72.606886\t42.371931\tHatfield CDP\tMA\tMassachusetts\tHampshire County\t1413\t47.5\t38.2\t5.1\t36854\t338095\t0.7033\t1038\tObama\t01038\t0.003365269\t1038.0\n9535\t-72.51945400000001\t42.33887\tSouth Amherst CDP\tMA\tMassachusetts\tHampshire County\t4907\t24.4\t65.4\t10.2\t26060\t250676\t0.7033\t1002\tObama\t01002\t0.011686748\t1002.0\n9536\t-72.24599\t42.25485\tWare CDP\tMA\tMassachusetts\tHampshire County\t5981\t36.8\t14.3\t11.3\t24791\t157669\t0.7033\t1082\tObama\t01082\t0.014244639\t1082.0\n9537\t-72.52438199999999\t42.263225\tGranby CDP\tMA\tMassachusetts\tHampshire County\t1318\t44.9\t34.5\t16.3\t28957\t226027\t0.7033\t1033\tObama\t01033\t0.003139012\t1033.0\n9538\t-72.674518\t42.32659\tNorthampton city\tMA\tMassachusetts\tHampshire County\t29005\t38.8\t53.6\t8.5\t32709\t243587\t0.7033\t1062\tObama\t01062\t0.069079709\t1062.0\n9539\t-72.67191700000001\t42.265006\tEasthampton city\tMA\tMassachusetts\tHampshire County\t16083\t41.1\t29.2\t9.2\t31031\t198153\t0.7033\t1027\tObama\t01027\t0.03830405\t1027.0\n9540\t-72.51879699999999\t42.375541\tAmherst Center CDP\tMA\tMassachusetts\tHampshire County\t17886\t21.7\t78.7\t10.6\t23099\t294592\t0.7033\t1002\tObama\t01002\t0.042598162\t1002.0\n9541\t-72.405103\t42.274006\tBelchertown CDP\tMA\tMassachusetts\tHampshire County\t2785\t35.4\t35.9\t10.8\t28548\t221935\t0.7033\t1007\tObama\t01007\t0.006632891\t1007.0\n9542\t-72.522739\t42.407323\tNorth Amherst CDP\tMA\tMassachusetts\tHampshire County\t6052\t23.3\t71.1\t9.3\t21826\t329570\t0.7033\t1002\tObama\t01002\t0.014413736000000002\t1002.0\n9543\t-71.105631\t42.534895\tReading CDP\tMA\tMassachusetts\tMiddlesex County\t24816\t42.3\t54.5\t6.3\t45858\t412275\t0.6255\t1867\tObama\t01867\t0.059102985\t1867.0\n9544\t-71.570665\t42.608365\tGroton CDP\tMA\tMassachusetts\tMiddlesex County\t1186\t37.4\t61.7\t4.3\t49726\t419492\t0.6255\t1450\tObama\t01450\t0.002824635\t1450.0\n9545\t-71.230848\t42.445665999999996\tLexington CDP\tMA\tMassachusetts\tMiddlesex County\t30757\t47.0\t74.6\t6.7\t65095\t651543\t0.6255\t2421\tObama\t02421\t0.073252357\t2421.0\n9546\t-71.523173\t42.223116999999995\tHopkinton CDP\tMA\tMassachusetts\tMiddlesex County\t2675\t40.1\t48.1\t5.2\t43209\t351031\t0.6255\t1748\tObama\t01748\t0.006370909\t1748.0\n9547\t-71.584567\t42.561521\tAyer CDP\tMA\tMassachusetts\tMiddlesex County\t2980\t39.9\t30.0\t6.2\t32017\t240196\t0.6255\t1432\tObama\t01432\t0.007097312\t1432.0\n9548\t-71.10904599999999\t42.424217999999996\tMedford city\tMA\tMassachusetts\tMiddlesex County\t56615\t39.8\t38.4\t8.2\t34714\t344534\t0.6255\t2155\tObama\t02155\t0.134837019\t2155.0\n9549\t-71.456067\t42.426320000000004\tMaynard CDP\tMA\tMassachusetts\tMiddlesex County\t10329\t41.3\t44.6\t8.2\t37322\t283353\t0.6255\t1754\tObama\t01754\t0.024600045\t1754.0\n9550\t-71.472497\t42.535275\tLittleton Common CDP\tMA\tMassachusetts\tMiddlesex County\t3056\t41.6\t48.2\t4.7\t42509\t309375\t0.6255\t1460\tObama\t01460\t0.007278316999999999\t1460.0\n9551\t-71.321472\t42.638785999999996\tLowell city\tMA\tMassachusetts\tMiddlesex County\t108049\t32.5\t22.6\t11.9\t24396\t202069\t0.6255\t1851\tObama\t01851\t0.257334719\t1851.0\n9552\t-71.590682\t42.669847999999995\tPepperell CDP\tMA\tMassachusetts\tMiddlesex County\t2774\t36.6\t33.2\t11.7\t28612\t257143\t0.6255\t1463\tObama\t01463\t0.006606692\t1463.0\n9553\t-71.17746600000001\t42.369911\tWatertown city\tMA\tMassachusetts\tMiddlesex County\t33350\t39.3\t54.5\t6.6\t47038\t423847\t0.6255\t2472\tObama\t02472\t0.079427971\t2472.0\n9554\t-71.154377\t42.486571000000005\tWoburn city\tMA\tMassachusetts\tMiddlesex County\t37748\t40.4\t35.4\t7.4\t36047\t330509\t0.6255\t1801\tObama\t01801\t0.089902461\t1801.0\n9555\t-71.053658\t42.40712\tEverett city\tMA\tMassachusetts\tMiddlesex County\t37708\t38.0\t18.5\t10.0\t27404\t272715\t0.6255\t2149\tObama\t02149\t0.089807195\t2149.0\n9556\t-71.563349\t42.665274\tEast Pepperell CDP\tMA\tMassachusetts\tMiddlesex County\t2118\t36.2\t31.2\t6.0\t28593\t241667\t0.6255\t1463\tObama\t01463\t0.005044331\t1463.0\n9557\t-71.403328\t42.451831\tWest Concord CDP\tMA\tMassachusetts\tMiddlesex County\t5881\t41.1\t61.2\t7.4\t59980\t550833\t0.6255\t1742\tObama\t01742\t0.014006474\t1742.0\n9558\t-71.165207\t42.560897\tWilmington CDP\tMA\tMassachusetts\tMiddlesex County\t22065\t39.7\t37.0\t5.7\t36047\t339442\t0.6255\t1887\tObama\t01887\t0.05255107\t1887.0\n9559\t-71.058814\t42.45565\tMelrose city\tMA\tMassachusetts\tMiddlesex County\t27242\t43.0\t46.7\t6.2\t42045\t385286\t0.6255\t2176\tObama\t02176\t0.064880863\t2176.0\n9560\t-71.233925\t42.533635\tPinehurst CDP\tMA\tMassachusetts\tMiddlesex County\t7152\t38.8\t25.8\t7.2\t37049\t292905\t0.6255\t1821\tObama\t01821\t0.017033549\t1821.0\n9561\t-71.118341\t42.375784\tCambridge city\tMA\tMassachusetts\tMiddlesex County\t105200\t31.8\t70.5\t8.6\t44877\t488230\t0.6255\t2163\tObama\t02163\t0.250549403\t2163.0\n9562\t-71.20263800000001\t42.502154\tBurlington CDP\tMA\tMassachusetts\tMiddlesex County\t23909\t41.8\t48.1\t6.9\t39804\t375182\t0.6255\t1803\tObama\t01803\t0.05694283\t1803.0\n9563\t-71.208556\t42.331399\tNewton city\tMA\tMassachusetts\tMiddlesex County\t85140\t40.9\t74.0\t6.6\t63851\t648252\t0.6255\t2461\tObama\t02461\t0.202773538\t2461.0\n9564\t-71.704092\t42.671715\tTownsend CDP\tMA\tMassachusetts\tMiddlesex County\t1055\t35.0\t40.9\t9.1\t32819\t215625\t0.6255\t1469\tObama\t01469\t0.002512639\t1469.0\n9565\t-71.357892\t42.328915\tCochituate CDP\tMA\tMassachusetts\tMiddlesex County\t6663\t45.4\t67.4\t6.7\t55194\t542701\t0.6255\t1778\tObama\t01778\t0.015868923\t1778.0\n9566\t-71.16365\t42.418698\tArlington CDP\tMA\tMassachusetts\tMiddlesex County\t41908\t42.3\t60.1\t6.2\t46250\t434968\t0.6255\t2474\tObama\t02474\t0.099810118\t2474.0\n9567\t-71.06557\t42.503389\tWakefield CDP\tMA\tMassachusetts\tMiddlesex County\t24983\t41.6\t46.3\t7.6\t40511\t369405\t0.6255\t1880\tObama\t01880\t0.05950072\t1880.0\n9568\t-71.56451\t42.391776\tHudson CDP\tMA\tMassachusetts\tMiddlesex County\t14673\t40.2\t32.1\t7.2\t35441\t267335\t0.6255\t1749\tObama\t01749\t0.034945926\t1749.0\n9569\t-71.658328\t42.540074\tShirley CDP\tMA\tMassachusetts\tMiddlesex County\t1586\t38.4\t15.2\t10.1\t30865\t211875\t0.6255\t1464\tObama\t01464\t0.003777294\t1464.0\n9570\t-71.43664100000001\t42.30835\tFramingham CDP\tMA\tMassachusetts\tMiddlesex County\t67389\t38.6\t48.1\t8.1\t37651\t318680\t0.6255\t1701\tObama\t01701\t0.160496898\t1701.0\n9571\t-71.546661\t42.349418\tMarlborough city\tMA\tMassachusetts\tMiddlesex County\t37748\t39.6\t42.1\t8.0\t39164\t278985\t0.6255\t1752\tObama\t01752\t0.089902461\t1752.0\n9572\t-71.179441\t42.39607\tBelmont CDP\tMA\tMassachusetts\tMiddlesex County\t24062\t43.1\t69.5\t6.1\t58878\t646672\t0.6255\t2478\tObama\t02478\t0.057307222000000005\t2478.0\n9573\t-71.242081\t42.388992\tWaltham city\tMA\tMassachusetts\tMiddlesex County\t60328\t36.6\t45.4\t8.2\t38076\t377594\t0.6255\t2451\tObama\t02451\t0.14368008\t2451.0\n9574\t-71.057556\t42.430543\tMalden city\tMA\tMassachusetts\tMiddlesex County\t57595\t38.5\t31.8\t8.7\t31550\t279776\t0.6255\t2148\tObama\t02148\t0.137171035\t2148.0\n9575\t-71.10183599999999\t42.390632000000004\tSomerville city\tMA\tMassachusetts\tMiddlesex County\t78498\t33.2\t47.4\t7.9\t33603\t398477\t0.6255\t2143\tObama\t02143\t0.18695463\t2143.0\n9576\t-71.097002\t42.474522\tStoneham CDP\tMA\tMassachusetts\tMiddlesex County\t22088\t43.5\t37.9\t6.4\t36705\t347333\t0.6255\t2180\tObama\t02180\t0.052605848\t2180.0\n9577\t-71.14637900000001\t42.451734\tWinchester CDP\tMA\tMassachusetts\tMiddlesex County\t20794\t43.3\t70.5\t6.8\t66831\t638316\t0.6255\t1890\tObama\t01890\t0.049523995\t1890.0\n9578\t-70.101664\t41.282457\tNantucket CDP\tMA\tMassachusetts\tNantucket County\t3869\t38.9\t41.4\t7.3\t37074\t981514\t0.6278\t2554\tObama\t02554\t0.009214597\t2554.0\n9579\t-71.24384599999999\t42.137087\tWalpole CDP\tMA\tMassachusetts\tNorfolk County\t5884\t42.6\t43.2\t8.4\t38559\t379712\t0.5737\t2081\tObama\t02081\t0.014013619\t2081.0\n9580\t-71.194762\t42.185986\tNorwood CDP\tMA\tMassachusetts\tNorfolk County\t28491\t41.1\t44.6\t7.6\t36143\t355645\t0.5737\t2062\tObama\t02062\t0.067855542\t2062.0\n9581\t-71.05390200000001\t42.17803\tRandolph CDP\tMA\tMassachusetts\tNorfolk County\t30651\t40.7\t31.8\t9.2\t32510\t245980\t0.5737\t2368\tObama\t02368\t0.072999903\t2368.0\n9582\t-71.475952\t42.093948\tBellingham CDP\tMA\tMassachusetts\tNorfolk County\t5564\t39.4\t21.8\t7.8\t37652\t241511\t0.5737\t2019\tObama\t02019\t0.013251491\t2019.0\n9583\t-71.17750699999999\t42.246519\tDedham CDP\tMA\tMassachusetts\tNorfolk County\t24356\t42.0\t38.9\t7.6\t41007\t367623\t0.5737\t2026\tObama\t02026\t0.058007425999999994\t2026.0\n9584\t-71.411365\t42.08579\tFranklin city\tMA\tMassachusetts\tNorfolk County\t31590\t36.0\t48.9\t7.7\t39796\t363178\t0.5737\t2038\tObama\t02038\t0.07523627\t2038.0\n9585\t-71.021592\t42.249402\tQuincy city\tMA\tMassachusetts\tNorfolk County\t90640\t40.6\t37.4\t8.2\t37565\t284324\t0.5737\t2170\tObama\t02170\t0.215872603\t2170.0\n9586\t-71.274237\t42.247318\tDover CDP\tMA\tMassachusetts\tNorfolk County\t2292\t43.3\t80.1\t5.7\t80547\t912088\t0.5737\t2030\tObama\t02030\t0.005458738\t2030.0\n9587\t-71.303134\t42.186799\tMedfield CDP\tMA\tMassachusetts\tNorfolk County\t6713\t41.0\t64.3\t8.5\t52153\t508000\t0.5737\t2052\tObama\t02052\t0.015988005\t2052.0\n9588\t-71.24134000000001\t42.281178000000004\tNeedham CDP\tMA\tMassachusetts\tNorfolk County\t28802\t43.5\t70.3\t8.0\t57997\t644295\t0.5737\t2492\tObama\t02492\t0.068596235\t2492.0\n9589\t-71.00559\t42.146983\tHolbrook CDP\tMA\tMassachusetts\tNorfolk County\t10826\t41.1\t22.5\t9.7\t32589\t232607\t0.5737\t2343\tObama\t02343\t0.025783725\t2343.0\n9590\t-71.001409\t42.203353\tBraintree CDP\tMA\tMassachusetts\tNorfolk County\t35365\t42.6\t37.4\t7.3\t40470\t345539\t0.5737\t2184\tObama\t02184\t0.08422699300000001\t2184.0\n9591\t-71.084551\t42.24102\tMilton CDP\tMA\tMassachusetts\tNorfolk County\t26328\t41.9\t58.1\t7.2\t49139\t471584\t0.5737\t2186\tObama\t02186\t0.062704037\t2186.0\n9592\t-71.248434\t42.064396\tFoxborough CDP\tMA\tMassachusetts\tNorfolk County\t5580\t41.9\t34.0\t7.5\t40397\t281250\t0.5737\t2035\tObama\t02035\t0.013289598\t2035.0\n9593\t-71.354293\t42.164774\tMillis-Clicquot CDP\tMA\tMassachusetts\tNorfolk County\t4634\t40.2\t40.3\t7.4\t38403\t300000\t0.5737\t2054\tObama\t02054\t0.011036558\t2054.0\n9594\t-70.947351\t42.19427\tWeymouth CDP\tMA\tMassachusetts\tNorfolk County\t54117\t41.7\t30.6\t9.1\t33613\t279394\t0.5737\t2188\tObama\t02188\t0.128887662\t2188.0\n9595\t-71.183885\t42.117093\tSharon CDP\tMA\tMassachusetts\tNorfolk County\t5892\t43.0\t60.5\t7.9\t44075\t341575\t0.5737\t2067\tObama\t02067\t0.014032672\t2067.0\n9596\t-71.140751\t42.324292\tBrookline CDP\tMA\tMassachusetts\tNorfolk County\t57979\t35.7\t81.4\t8.4\t63198\t654612\t0.5737\t2445\tObama\t02445\t0.138085588\t2445.0\n9597\t-71.285505\t42.304239\tWellesley CDP\tMA\tMassachusetts\tNorfolk County\t27018\t37.8\t80.3\t6.2\t68731\t874497\t0.5737\t2481\tObama\t02481\t0.064347374\t2481.0\n9598\t-70.959026\t42.118076\tAbington CDP\tMA\tMassachusetts\tPlymouth County\t16571\t39.9\t26.2\t8.0\t32503\t305257\t0.5134\t2351\tObama\t02351\t0.039466294\t2351.0\n9599\t-70.782423\t42.09885\tNorth Pembroke CDP\tMA\tMassachusetts\tPlymouth County\t3009\t38.0\t36.7\t6.8\t40130\t362629\t0.5134\t2359\tObama\t02359\t0.00716638\t2359.0\n9600\t-70.676463\t42.043409000000004\tDuxbury CDP\tMA\tMassachusetts\tPlymouth County\t1573\t45.4\t74.5\t4.8\t56980\t856183\t0.5134\t2332\tObama\t02332\t0.0037463329999999997\t2332.0\n9601\t-70.76505999999999\t42.212114\tNorth Scituate CDP\tMA\tMassachusetts\tPlymouth County\t5084\t42.9\t57.7\t10.3\t39835\t502483\t0.5134\t2066\tObama\t02066\t0.0121083\t2066.0\n9602\t-70.73141600000001\t41.99647\tKingston CDP\tMA\tMassachusetts\tPlymouth County\t5485\t39.2\t34.7\t11.0\t30020\t303571\t0.5134\t2364\tObama\t02364\t0.013063341000000001\t2364.0\n9603\t-70.72064300000001\t41.752182\tWareham Center CDP\tMA\tMassachusetts\tPlymouth County\t2926\t39.0\t22.8\t9.9\t31280\t193492\t0.5134\t2571\tObama\t02571\t0.006968703000000001\t2571.0\n9604\t-70.763436\t41.704661\tMarion Center CDP\tMA\tMassachusetts\tPlymouth County\t1270\t45.9\t69.9\t9.0\t51361\t525391\t0.5134\t2738\tObama\t02738\t0.0030246929999999997\t2738.0\n9605\t-70.73575100000001\t41.740124\tWeweantic CDP\tMA\tMassachusetts\tPlymouth County\t2104\t42.7\t23.4\t7.4\t30356\t190813\t0.5134\t2571\tObama\t02571\t0.005010988\t2571.0\n9606\t-70.704711\t42.094060999999996\tMarshfield CDP\tMA\tMassachusetts\tPlymouth County\t4352\t40.8\t35.4\t9.6\t33862\t365217\t0.5134\t2050\tObama\t02050\t0.010364933\t2050.0\n9607\t-70.66216800000001\t42.100214\tOcean Bluff-Brant Rock CDP\tMA\tMassachusetts\tPlymouth County\t5325\t40.5\t34.0\t8.5\t33391\t302009\t0.5134\t2050\tObama\t02050\t0.012682276999999999\t2050.0\n9608\t-70.639039\t41.793514\tWhite Island Shores CDP\tMA\tMassachusetts\tPlymouth County\t2539\t35.5\t14.5\t17.2\t29464\t172981\t0.5134\t2538\tObama\t02538\t0.006047005\t2538.0\n9609\t-70.736624\t42.186834000000005\tScituate CDP\tMA\tMassachusetts\tPlymouth County\t5231\t45.8\t46.5\t6.4\t40254\t464865\t0.5134\t2066\tObama\t02066\t0.012458402\t2066.0\n9610\t-70.971972\t41.988692\tBridgewater CDP\tMA\tMassachusetts\tPlymouth County\t6645\t29.0\t33.5\t13.4\t27075\t243350\t0.5134\t2324\tObama\t02324\t0.015826053\t2324.0\n9611\t-70.940991\t41.862068\tNorth Lakeville CDP\tMA\tMassachusetts\tPlymouth County\t2417\t41.9\t34.7\t7.4\t35054\t311694\t0.5134\t2347\tObama\t02347\t0.005756444\t2347.0\n9612\t-70.65921\t42.074587\tGreen Harbor-Cedar Crest CDP\tMA\tMassachusetts\tPlymouth County\t2589\t40.9\t47.2\t6.0\t40962\t370420\t0.5134\t2050\tObama\t02050\t0.006166087\t2050.0\n9613\t-70.68880300000001\t41.972832000000004\tNorth Plymouth CDP\tMA\tMassachusetts\tPlymouth County\t3741\t38.0\t17.6\t15.6\t24152\t257212\t0.5134\t023HH\tObama\t023HH\t0.008909746\t0.0\n9614\t-70.85214\t42.065012\tHanson CDP\tMA\tMassachusetts\tPlymouth County\t2118\t38.8\t30.1\t9.8\t31727\t322406\t0.5134\t2341\tObama\t02341\t0.005044331\t2341.0\n9615\t-70.92625\t41.894622\tMiddleborough Center CDP\tMA\tMassachusetts\tPlymouth County\t7305\t35.8\t20.9\t10.0\t27078\t236697\t0.5134\t2346\tObama\t02346\t0.017397941\t2346.0\n9616\t-70.75496\t41.789997\tWest Wareham CDP\tMA\tMassachusetts\tPlymouth County\t2091\t49.1\t11.0\t11.6\t22505\t159436\t0.5134\t2576\tObama\t02576\t0.004980027\t2576.0\n9617\t-70.732209\t42.148215\tMarshfield Hills CDP\tMA\tMassachusetts\tPlymouth County\t2497\t43.2\t48.8\t10.0\t43847\t528146\t0.5134\t020HH\tObama\t020HH\t0.005946976\t0.0\n9618\t-70.670049\t41.953157\tPlymouth CDP\tMA\tMassachusetts\tPlymouth County\t8283\t40.4\t29.0\t11.6\t32112\t251730\t0.5134\t023HH\tObama\t023HH\t0.019727193\t0.0\n9619\t-70.887889\t42.236456\tHingham CDP\tMA\tMassachusetts\tPlymouth County\t5576\t42.9\t66.2\t9.9\t51645\t612076\t0.5134\t2043\tObama\t02043\t0.013280071000000001\t2043.0\n9620\t-71.024147\t42.082035\tBrockton city\tMA\tMassachusetts\tPlymouth County\t97350\t34.9\t17.4\t13.8\t23580\t205105\t0.5134\t2301\tObama\t02301\t0.23185346399999998\t2301.0\n9621\t-70.69216\t42.020277\tSouth Duxbury CDP\tMA\tMassachusetts\tPlymouth County\t3323\t44.1\t73.2\t6.0\t52561\t707454\t0.5134\t2332\tObama\t02332\t0.007914217\t2332.0\n9622\t-70.667425\t41.748978\tOnset CDP\tMA\tMassachusetts\tPlymouth County\t1293\t46.0\t15.2\t16.8\t21029\t179514\t0.5134\t2558\tObama\t02558\t0.003079471\t2558.0\n9623\t-70.806744\t41.665883\tMattapoisett Center CDP\tMA\tMassachusetts\tPlymouth County\t3058\t45.9\t47.0\t9.3\t39298\t350851\t0.5134\t2739\tObama\t02739\t0.007283080999999999\t2739.0\n9624\t-70.871679\t42.281978\tHull CDP\tMA\tMassachusetts\tPlymouth County\t10824\t43.7\t35.5\t10.6\t33427\t300841\t0.5134\t2045\tObama\t02045\t0.025778961\t2045.0\n9625\t-70.98085400000001\t42.377198\tWinthrop CDP\tMA\tMassachusetts\tSuffolk County\t18316\t43.4\t35.9\t8.8\t33858\t343636\t0.7755\t2152\tObama\t02152\t0.043622271\t2152.0\n9626\t-71.004508\t42.418752000000005\tRevere city\tMA\tMassachusetts\tSuffolk County\t50318\t39.4\t17.8\t10.9\t26383\t271359\t0.7755\t2151\tObama\t02151\t0.11983978\t2151.0\n9627\t-71.103881\t42.306684000000004\tBoston city\tMA\tMassachusetts\tSuffolk County\t620392\t32.1\t41.8\t10.9\t30448\t338277\t0.7755\t2130\tObama\t02130\t1.4775555630000001\t2130.0\n9628\t-71.03250799999999\t42.396458\tChelsea city\tMA\tMassachusetts\tSuffolk County\t37849\t32.1\t13.3\t12.2\t19215\t257518\t0.7755\t2150\tObama\t02150\t0.090143007\t2150.0\n9629\t-71.541012\t42.127990000000004\tHopedale CDP\tMA\tMassachusetts\tWorcester County\t4281\t43.4\t33.3\t7.6\t32579\t297167\t0.5374\t1747\tObama\t01747\t0.010195836\t1747.0\n9630\t-71.52193299999999\t42.272669\tCordaville CDP\tMA\tMassachusetts\tWorcester County\t2689\t37.1\t62.1\t6.9\t49786\t465842\t0.5374\t1772\tObama\t01772\t0.006404251999999999\t1772.0\n9631\t-71.64500100000001\t42.311026\tNorthborough CDP\tMA\tMassachusetts\tWorcester County\t6411\t41.2\t52.4\t6.8\t35889\t352549\t0.5374\t1532\tObama\t01532\t0.015268747\t1532.0\n9632\t-71.61692\t42.267134000000006\tWestborough CDP\tMA\tMassachusetts\tWorcester County\t3970\t40.4\t42.5\t9.5\t30867\t335149\t0.5374\t1581\tObama\t01581\t0.009455144\t1581.0\n9633\t-72.106448\t42.423199\tBarre CDP\tMA\tMassachusetts\tWorcester County\t1166\t39.0\t37.3\t12.9\t30582\t208621\t0.5374\t1005\tObama\t01005\t0.002777002\t1005.0\n9634\t-71.87034399999999\t42.116240999999995\tOxford CDP\tMA\tMassachusetts\tWorcester County\t6078\t42.2\t20.2\t10.4\t28381\t185895\t0.5374\t1540\tObama\t01540\t0.014475658\t1540.0\n9635\t-71.61395999999999\t42.176728999999995\tUpton-West Upton CDP\tMA\tMassachusetts\tWorcester County\t2554\t40.6\t43.6\t13.0\t35150\t347277\t0.5374\t1568\tObama\t01568\t0.00608273\t1568.0\n9636\t-72.076989\t42.605451\tBaldwinville CDP\tMA\tMassachusetts\tWorcester County\t1954\t37.8\t12.3\t13.2\t27010\t159936\t0.5374\t1436\tObama\t01436\t0.004653740999999999\t1436.0\n9637\t-71.987015\t42.584540999999994\tGardner city\tMA\tMassachusetts\tWorcester County\t21162\t39.4\t19.7\t11.6\t24379\t157403\t0.5374\t1440\tObama\t01440\t0.050400442000000004\t1440.0\n9638\t-71.938337\t42.61367\tSouth Ashburnham CDP\tMA\tMassachusetts\tWorcester County\t1180\t40.4\t24.7\t10.2\t24053\t169583\t0.5374\t1430\tObama\t01430\t0.002810345\t1430.0\n9639\t-71.68553100000001\t42.418236\tClinton CDP\tMA\tMassachusetts\tWorcester County\t7967\t39.1\t24.3\t12.5\t27546\t212636\t0.5374\t1510\tObama\t01510\t0.018974592\t1510.0\n9640\t-71.727109\t42.593656\tLunenburg CDP\tMA\tMassachusetts\tWorcester County\t1802\t44.8\t43.1\t8.4\t34634\t295625\t0.5374\t1462\tObama\t01462\t0.00429173\t1462.0\n9641\t-71.668944\t42.114592\tWhitinsville CDP\tMA\tMassachusetts\tWorcester County\t6545\t35.5\t29.9\t10.4\t23722\t286917\t0.5374\t1588\tObama\t01588\t0.015587888000000001\t1588.0\n9642\t-72.145707\t42.23873\tWest Brookfield CDP\tMA\tMassachusetts\tWorcester County\t1676\t48.4\t25.6\t6.7\t28522\t226613\t0.5374\t1585\tObama\t01585\t0.003991643\t1585.0\n9643\t-72.034554\t42.086983000000004\tSouthbridge CDP\tMA\tMassachusetts\tWorcester County\t12677\t36.3\t14.3\t13.7\t20888\t163354\t0.5374\t1550\tObama\t01550\t0.030192156\t1550.0\n9644\t-72.230365\t42.593502\tAthol CDP\tMA\tMassachusetts\tWorcester County\t8493\t39.0\t16.2\t12.0\t21107\t130897\t0.5374\t1331\tObama\t01331\t0.020227339\t1331.0\n9645\t-72.108623\t42.122763\tFiskdale CDP\tMA\tMassachusetts\tWorcester County\t2341\t38.7\t31.1\t8.5\t33118\t210000\t0.5374\t1518\tObama\t01518\t0.005575439000000001\t1518.0\n9646\t-72.043719\t42.680921000000005\tWinchendon CDP\tMA\tMassachusetts\tWorcester County\t4324\t37.0\t17.3\t14.4\t22769\t159054\t0.5374\t1475\tObama\t01475\t0.010298247\t1475.0\n9647\t-71.956238\t42.364436\tRutland CDP\tMA\tMassachusetts\tWorcester County\t2348\t39.6\t25.8\t10.7\t30283\t206977\t0.5374\t1543\tObama\t01543\t0.00559211\t1543.0\n9648\t-72.188702\t42.215412\tWarren CDP\tMA\tMassachusetts\tWorcester County\t1485\t36.8\t13.2\t14.2\t22717\t161145\t0.5374\t1083\tObama\t01083\t0.0035367479999999997\t1083.0\n9649\t-72.084296\t42.271228\tNorth Brookfield CDP\tMA\tMassachusetts\tWorcester County\t2500\t37.5\t19.1\t12.8\t26162\t175128\t0.5374\t1535\tObama\t01535\t0.005954121\t1535.0\n9650\t-71.874814\t42.044658\tWebster CDP\tMA\tMassachusetts\tWorcester County\t11559\t38.8\t17.9\t12.4\t22444\t170098\t0.5374\t1570\tObama\t01570\t0.027529473\t1570.0\n9651\t-71.712001\t42.077789\tEast Douglas CDP\tMA\tMassachusetts\tWorcester County\t2567\t36.4\t23.6\t10.8\t28333\t237380\t0.5374\t1516\tObama\t01516\t0.006113691\t1516.0\n9652\t-71.606954\t42.561186\tFort Devens CDP\tMA\tMassachusetts\tWorcester County\t1599\t34.1\t15.5\t28.0\t13994\t230357\t0.5374\t1432\tObama\t01432\t0.003808256\t1432.0\n9653\t-71.691978\t42.437356\tSouth Lancaster CDP\tMA\tMassachusetts\tWorcester County\t1899\t41.5\t48.7\t6.4\t28973\t263056\t0.5374\t1510\tObama\t01510\t0.00452275\t1510.0\n9654\t-71.80788299999999\t42.270524\tWorcester city\tMA\tMassachusetts\tWorcester County\t179524\t34.8\t29.0\t13.2\t23997\t182252\t0.5374\t1609\tObama\t01609\t0.427563032\t1609.0\n9655\t-71.771519\t42.520886\tLeominster city\tMA\tMassachusetts\tWorcester County\t42043\t38.2\t27.7\t10.7\t27964\t212328\t0.5374\t1453\tObama\t01453\t0.10013164\t1453.0\n9656\t-71.516518\t42.147791\tMilford CDP\tMA\tMassachusetts\tWorcester County\t24476\t39.5\t31.0\t10.9\t28992\t275039\t0.5374\t1757\tObama\t01757\t0.058293224000000005\t1757.0\n9657\t-72.061336\t42.230422999999995\tEast Brookfield CDP\tMA\tMassachusetts\tWorcester County\t1453\t42.8\t18.3\t8.1\t27195\t190323\t0.5374\t1515\tObama\t01515\t0.003460535\t1515.0\n9658\t-71.815812\t42.591507\tFitchburg city\tMA\tMassachusetts\tWorcester County\t39952\t35.1\t20.2\t14.5\t22772\t164086\t0.5374\t1420\tObama\t01420\t0.09515161400000001\t1420.0\n9659\t-72.063316\t42.099905\tSturbridge CDP\tMA\tMassachusetts\tWorcester County\t2280\t41.6\t41.6\t7.7\t31665\t235648\t0.5374\t1566\tObama\t01566\t0.005430158\t1566.0\n9660\t-71.99234100000001\t42.24498\tSpencer CDP\tMA\tMassachusetts\tWorcester County\t5992\t35.9\t19.0\t11.8\t25530\t188951\t0.5374\t1562\tObama\t01562\t0.014270837\t1562.0\n9661\t-83.294958\t44.657078999999996\tHarrisville city\tMI\tMichigan\tAlcona County\t508\t55.2\t15.9\t31.2\t19915\t93913\t0.405\t48740\tObama\t48740\t0.001289199\t48740.0\n9662\t-83.42220999999999\t44.792671\tLost Lake Woods CDP\tMI\tMichigan\tAlcona County\t321\t66.4\t22.5\t15.8\t26655\t106250\t0.405\t48742\tObama\t48742\t0.0008146319999999999\t48742.0\n9663\t-83.413436\t44.684732000000004\tLincoln village\tMI\tMichigan\tAlcona County\t346\t46.9\t9.1\t19.4\t20062\t75500\t0.405\t48742\tObama\t48742\t0.0008780760000000001\t48742.0\n9664\t-83.560512\t44.810864\tHubbard Lake CDP\tMI\tMichigan\tAlcona County\t930\t63.3\t19.1\t16.9\t24418\t98429\t0.405\t49747\tObama\t49747\t0.002360148\t49747.0\n9665\t-86.931799\t46.343728000000006\tChatham village\tMI\tMichigan\tAlger County\t219\t46.8\t19.6\t14.7\t21339\t87143\t0.479\t49816\tObama\t49816\t0.0005557769999999999\t49816.0\n9666\t-86.669905\t46.416876\tMunising city\tMI\tMichigan\tAlger County\t2400\t46.3\t17.3\t14.0\t20543\t76690\t0.479\t49862\tObama\t49862\t0.006090704000000001\t49862.0\n9667\t-85.69674\t42.457136\tOtsego city\tMI\tMichigan\tAllegan County\t3991\t37.3\t12.7\t19.0\t22326\t109592\t0.3954\t49078\tObama\t49078\t0.010128333\t49078.0\n9668\t-86.20525\t42.657089\tSaugatuck city\tMI\tMichigan\tAllegan County\t1237\t48.1\t45.3\t10.6\t36315\t237356\t0.3954\t49406\tObama\t49406\t0.00313925\t49406.0\n9669\t-85.76387700000001\t42.625169\tHopkins village\tMI\tMichigan\tAllegan County\t612\t35.2\t13.2\t12.5\t19894\t119345\t0.3954\t49328\tObama\t49328\t0.0015531289999999999\t49328.0\n9670\t-86.105242\t42.594722\tFennville city\tMI\tMichigan\tAllegan County\t1622\t33.1\t15.1\t14.6\t18893\t113654\t0.3954\t49408\tObama\t49408\t0.004116301\t49408.0\n9671\t-85.643608\t42.445889\tPlainwell city\tMI\tMichigan\tAllegan County\t4031\t37.6\t22.4\t18.5\t22525\t119583\t0.3954\t49080\tObama\t49080\t0.010229845\t49080.0\n9672\t-86.209005\t42.641016\tDouglas village\tMI\tMichigan\tAllegan County\t1324\t51.7\t31.0\t14.7\t33232\t171169\t0.3954\t49406\tObama\t49406\t0.003360038\t49406.0\n9673\t-85.846533\t42.530087\tAllegan city\tMI\tMichigan\tAllegan County\t4982\t36.9\t17.7\t21.1\t22048\t108868\t0.3954\t49010\tObama\t49010\t0.012643286\t49010.0\n9674\t-85.640525\t42.672786\tWayland city\tMI\tMichigan\tAllegan County\t4255\t32.1\t13.7\t16.5\t20249\t100362\t0.3954\t49348\tObama\t49348\t0.01079831\t49348.0\n9675\t-85.638745\t42.537476\tMartin village\tMI\tMichigan\tAllegan County\t468\t35.3\t12.3\t18.1\t20233\t118452\t0.3954\t49070\tObama\t49070\t0.001187687\t49070.0\n9676\t-83.428872\t44.907266\tOssineke CDP\tMI\tMichigan\tAlpena County\t978\t45.0\t11.4\t17.7\t19923\t79318\t0.4673\t49766\tObama\t49766\t0.0024819620000000003\t49766.0\n9677\t-83.43802600000001\t45.073895\tAlpena city\tMI\tMichigan\tAlpena County\t10570\t40.8\t17.2\t14.7\t21126\t78081\t0.4673\t49707\tObama\t49707\t0.026824475\t49707.0\n9678\t-85.205146\t44.973882\tBellaire village\tMI\tMichigan\tAntrim County\t1136\t46.1\t26.2\t15.9\t22218\t124833\t0.387\t49615\tObama\t49615\t0.002882933\t49615.0\n9679\t-85.243516\t45.16636\tEllsworth village\tMI\tMichigan\tAntrim County\t504\t37.1\t19.2\t25.3\t18637\t102315\t0.387\t49729\tObama\t49729\t0.001279048\t49729.0\n9680\t-85.405341\t44.895005\tElk Rapids village\tMI\tMichigan\tAntrim County\t1734\t48.9\t34.5\t14.1\t24933\t171976\t0.387\t49629\tObama\t49629\t0.004400534\t49629.0\n9681\t-85.261387\t45.069617\tCentral Lake village\tMI\tMichigan\tAntrim County\t1020\t44.7\t15.2\t16.9\t19913\t96481\t0.387\t49622\tObama\t49622\t0.002588549\t49622.0\n9682\t-85.061432\t44.902423\tMancelona village\tMI\tMichigan\tAntrim County\t1390\t33.8\t6.9\t18.4\t15758\t66604\t0.387\t49659\tObama\t49659\t0.003527533\t49659.0\n9683\t-83.787677\t44.142086\tTurner village\tMI\tMichigan\tArenac County\t140\t41.5\t4.3\t15.8\t17290\t66667\t0.4679\t48765\tObama\t48765\t0.000355291\t48765.0\n9684\t-83.963307\t43.97933\tStandish city\tMI\tMichigan\tArenac County\t2117\t37.1\t13.9\t18.8\t16608\t75192\t0.4679\t48658\tObama\t48658\t0.005372508000000001\t48658.0\n9685\t-83.85701800000001\t44.048504\tOmer city\tMI\tMichigan\tArenac County\t337\t45.1\t7.8\t16.8\t20135\t75217\t0.4679\t48749\tObama\t48749\t0.0008552360000000001\t48749.0\n9686\t-84.019607\t44.032468\tSterling village\tMI\tMichigan\tArenac County\t524\t41.2\t13.1\t18.4\t19306\t86071\t0.4679\t48659\tObama\t48659\t0.001329804\t48659.0\n9687\t-83.693685\t44.043076\tAu Gres city\tMI\tMichigan\tArenac County\t1020\t47.6\t9.8\t17.1\t17845\t91316\t0.4679\t48703\tObama\t48703\t0.002588549\t48703.0\n9688\t-83.80761700000001\t44.113040000000005\tTwining village\tMI\tMichigan\tArenac County\t193\t41.0\t4.6\t15.4\t17327\t67500\t0.4679\t48766\tObama\t48766\t0.000489794\t48766.0\n9689\t-88.495489\t46.776889000000004\tBaraga village\tMI\tMichigan\tBaraga County\t1413\t35.7\t6.7\t28.1\t15149\t66951\t0.451\t49908\tObama\t49908\t0.003585902\t49908.0\n9690\t-88.447687\t46.75244\tL'Anse village\tMI\tMichigan\tBaraga County\t2060\t44.5\t10.7\t25.2\t19968\t67313\t0.451\t49946\tObama\t49946\t0.0052278540000000005\t49946.0\n9691\t-85.31581\t42.764157\tFreeport village\tMI\tMichigan\tBarry County\t516\t37.4\t11.9\t12.6\t20529\t139224\t0.40299999999999997\t49325\tObama\t49325\t0.001309501\t49325.0\n9692\t-85.094099\t42.603021000000005\tNashville village\tMI\tMichigan\tBarry County\t1840\t36.2\t13.4\t14.3\t20741\t84217\t0.40299999999999997\t49073\tObama\t49073\t0.00466954\t49073.0\n9693\t-85.467759\t42.713846999999994\tMiddleville village\tMI\tMichigan\tBarry County\t3130\t33.1\t15.8\t11.2\t21736\t110767\t0.40299999999999997\t49333\tObama\t49333\t0.007943293\t49333.0\n9694\t-85.134276\t42.726804\tWoodland village\tMI\tMichigan\tBarry County\t501\t40.3\t15.2\t12.3\t20494\t123438\t0.40299999999999997\t48897\tObama\t48897\t0.0012714339999999999\t48897.0\n9695\t-85.288669\t42.649821\tHastings city\tMI\tMichigan\tBarry County\t7238\t36.1\t22.8\t15.6\t21991\t108876\t0.40299999999999997\t49058\tObama\t49058\t0.018368548000000002\t49058.0\n9696\t-83.888423\t43.590516\tBay City\tMI\tMichigan\tBay County\t34988\t37.2\t15.1\t15.6\t20667\t73843\t0.5222\t48708\tObama\t48708\t0.088792312\t48708.0\n9697\t-83.842473\t43.611917\tEssexville city\tMI\tMichigan\tBay County\t3574\t43.9\t25.1\t15.7\t26118\t97262\t0.5222\t48732\tObama\t48732\t0.009070073\t48732.0\n9698\t-83.96401999999999\t43.857344\tPinconning city\tMI\tMichigan\tBay County\t1397\t40.6\t9.6\t23.6\t20439\t81400\t0.5222\t48650\tObama\t48650\t0.003545297\t48650.0\n9699\t-84.075983\t43.602191999999995\tAuburn city\tMI\tMichigan\tBay County\t2024\t40.7\t25.7\t9.1\t25741\t115750\t0.5222\t48611\tObama\t48611\t0.005136494\t48611.0\n9700\t-86.019874\t44.666638\tHonor village\tMI\tMichigan\tBenzie County\t327\t49.4\t22.5\t15.0\t22724\t146875\t0.4732\t49617\tObama\t49617\t0.000829858\t49617.0\n9701\t-85.938702\t44.520573999999996\tThompsonville village\tMI\tMichigan\tBenzie County\t552\t40.5\t11.6\t12.6\t18469\t97308\t0.4732\t49683\tObama\t49683\t0.0014008620000000001\t49683.0\n9702\t-85.844789\t44.725293\tLake Ann village\tMI\tMichigan\tBenzie County\t334\t34.6\t22.8\t10.6\t24706\t143182\t0.4732\t49650\tObama\t49650\t0.000847623\t49650.0\n9703\t-86.232904\t44.635973\tFrankfort city\tMI\tMichigan\tBenzie County\t1750\t52.0\t33.8\t19.7\t26048\t136364\t0.4732\t49635\tObama\t49635\t0.004441138\t49635.0\n9704\t-86.095946\t44.629431\tBeulah village\tMI\tMichigan\tBenzie County\t410\t49.9\t24.6\t18.7\t20294\t121023\t0.4732\t49616\tObama\t49616\t0.001040495\t49616.0\n9705\t-86.230936\t44.620798\tElberta village\tMI\tMichigan\tBenzie County\t446\t42.7\t13.7\t20.6\t20259\t101923\t0.4732\t49628\tObama\t49628\t0.001131856\t49628.0\n9706\t-86.09882900000001\t44.616359\tBenzonia village\tMI\tMichigan\tBenzie County\t490\t49.9\t24.1\t18.6\t20016\t118500\t0.4732\t49616\tObama\t49616\t0.001243519\t49616.0\n9707\t-86.49982\t41.801435\tGalien village\tMI\tMichigan\tBerrien County\t571\t37.4\t9.4\t13.7\t20748\t90455\t0.4616\t49113\tObama\t49113\t0.00144908\t49113.0\n9708\t-86.48818100000001\t41.954726\tBaroda village\tMI\tMichigan\tBerrien County\t834\t40.3\t14.7\t12.5\t20993\t127455\t0.4616\t49101\tObama\t49101\t0.00211652\t49101.0\n9709\t-86.25784\t42.188447\tWatervliet city\tMI\tMichigan\tBerrien County\t1787\t35.8\t11.0\t15.9\t20173\t90238\t0.4616\t49098\tObama\t49098\t0.0045350370000000004\t49098.0\n9710\t-86.61229399999999\t41.798902000000005\tThree Oaks village\tMI\tMichigan\tBerrien County\t1719\t39.4\t11.8\t13.1\t20399\t117237\t0.4616\t49128\tObama\t49128\t0.004362467\t49128.0\n9711\t-86.524238\t42.013712\tStevensville village\tMI\tMichigan\tBerrien County\t1152\t42.3\t26.1\t12.6\t24100\t132790\t0.4616\t49127\tObama\t49127\t0.002923538\t49127.0\n9712\t-86.56506999999999\t41.939787\tBridgman city\tMI\tMichigan\tBerrien County\t2427\t46.2\t24.2\t15.8\t25777\t152465\t0.4616\t49106\tObama\t49106\t0.0061592240000000005\t49106.0\n9713\t-86.613972\t41.881669\tShorewood-Tower Hills-Harbert CDP\tMI\tMichigan\tBerrien County\t1528\t50.2\t31.6\t12.2\t30764\t217582\t0.4616\t49125\tObama\t49125\t0.003877748\t49125.0\n9714\t-86.275886\t42.211361\tPaw Paw Lake CDP\tMI\tMichigan\tBerrien County\t3660\t41.8\t13.7\t19.2\t23622\t107708\t0.4616\t49098\tObama\t49098\t0.009288323000000001\t49098.0\n9715\t-86.484235\t42.097871999999995\tSt. Joseph city\tMI\tMichigan\tBerrien County\t8481\t41.1\t37.4\t10.5\t27548\t143023\t0.4616\t49085\tObama\t49085\t0.021523025\t49085.0\n9716\t-86.211863\t41.871459\tNiles city\tMI\tMichigan\tBerrien County\t11568\t36.7\t16.6\t21.6\t20525\t87815\t0.4616\t49120\tObama\t49120\t0.029357192999999997\t49120.0\n9717\t-86.74221700000001\t41.792004999999996\tNew Buffalo city\tMI\tMichigan\tBerrien County\t2261\t47.4\t23.5\t13.5\t30317\t151875\t0.4616\t49117\tObama\t49117\t0.005737951\t49117.0\n9718\t-86.303687\t41.984256\tEau Claire village\tMI\tMichigan\tBerrien County\t679\t38.2\t15.7\t17.6\t16641\t91111\t0.4616\t49111\tObama\t49111\t0.001723162\t49111.0\n9719\t-86.37581899999999\t42.212585\tLake Michigan Beach CDP\tMI\tMichigan\tBerrien County\t1445\t38.8\t16.0\t14.3\t21952\t114063\t0.4616\t49038\tObama\t49038\t0.003667111\t49038.0\n9720\t-86.78864399999999\t41.773937\tGrand Beach village\tMI\tMichigan\tBerrien County\t229\t59.2\t47.2\t11.1\t50007\t276786\t0.4616\t49117\tObama\t49117\t0.000581155\t49117.0\n9721\t-86.511236\t42.060190000000006\tShoreham village\tMI\tMichigan\tBerrien County\t798\t50.1\t44.0\t8.7\t36425\t184375\t0.4616\t49085\tObama\t49085\t0.002025159\t49085.0\n9722\t-86.447191\t42.116037\tBenton Harbor city\tMI\tMichigan\tBerrien County\t10843\t26.3\t5.9\t33.4\t11293\t51675\t0.4616\t49022\tObama\t49022\t0.027517292999999998\t49022.0\n9723\t-86.365944\t41.828434\tBuchanan city\tMI\tMichigan\tBerrien County\t4443\t37.4\t17.4\t16.5\t21808\t89853\t0.4616\t49107\tObama\t49107\t0.011275416000000002\t49107.0\n9724\t-86.413733\t42.121062\tBenton Heights CDP\tMI\tMichigan\tBerrien County\t4927\t27.6\t5.8\t26.8\t12841\t48177\t0.4616\t49022\tObama\t49022\t0.012503708\t49022.0\n9725\t-86.308311\t42.186572999999996\tColoma city\tMI\tMichigan\tBerrien County\t1504\t40.2\t17.5\t14.9\t19161\t96696\t0.4616\t49038\tObama\t49038\t0.0038168409999999996\t49038.0\n9726\t-86.810934\t41.763748\tMichiana village\tMI\tMichigan\tBerrien County\t207\t59.9\t47.1\t11.1\t50073\t276786\t0.4616\t49117\tObama\t49117\t0.0005253230000000001\t49117.0\n9727\t-86.340298\t41.947464000000004\tBerrien Springs village\tMI\tMichigan\tBerrien County\t1765\t34.8\t38.1\t15.8\t18586\t116667\t0.4616\t49103\tObama\t49103\t0.004479205\t49103.0\n9728\t-86.451955\t42.082606\tFair Plain CDP\tMI\tMichigan\tBerrien County\t7486\t40.1\t21.0\t18.2\t22680\t104422\t0.4616\t49085\tObama\t49085\t0.018997921\t49085.0\n9729\t-84.883721\t41.943259999999995\tQuincy village\tMI\tMichigan\tBranch County\t1626\t33.8\t10.2\t13.0\t18773\t95426\t0.4032\t49082\tObama\t49082\t0.004126452\t49082.0\n9730\t-85.23931999999999\t41.999592\tSherwood village\tMI\tMichigan\tBranch County\t329\t37.1\t3.8\t17.4\t18402\t76667\t0.4032\t49089\tObama\t49089\t0.000834934\t49089.0\n9731\t-85.191714\t41.872975\tBronson city\tMI\tMichigan\tBranch County\t2404\t33.2\t8.3\t17.6\t17049\t78696\t0.4032\t49028\tObama\t49028\t0.006100855\t49028.0\n9732\t-85.133611\t42.074502\tUnion City village\tMI\tMichigan\tBranch County\t1700\t33.9\t11.9\t21.7\t19075\t80294\t0.4032\t49094\tObama\t49094\t0.004314249\t49094.0\n9733\t-85.00310999999999\t41.9424\tColdwater city\tMI\tMichigan\tBranch County\t13208\t36.5\t14.6\t17.2\t19491\t88146\t0.4032\t49036\tObama\t49036\t0.033519174\t49036.0\n9734\t-85.236799\t42.324483\tSpringfield city\tMI\tMichigan\tCalhoun County\t5320\t39.0\t9.9\t16.0\t20498\t66077\t0.5018\t49015\tObama\t49015\t0.01350106\t49015.0\n9735\t-85.230285\t42.297773\tBattle Creek city\tMI\tMichigan\tCalhoun County\t52510\t36.4\t20.0\t15.9\t21672\t81538\t0.5018\t49015\tObama\t49015\t0.133259526\t49015.0\n9736\t-84.757293\t42.247788\tAlbion city\tMI\tMichigan\tCalhoun County\t8880\t29.2\t17.8\t16.8\t18494\t70340\t0.5018\t49224\tObama\t49224\t0.022535604\t49224.0\n9737\t-85.134725\t42.325511\tBrownlee Park CDP\tMI\tMichigan\tCalhoun County\t2523\t34.8\t3.7\t18.1\t16356\t47736\t0.5018\t49014\tObama\t49014\t0.006402852\t49014.0\n9738\t-84.988387\t42.094449\tTekonsha village\tMI\tMichigan\tCalhoun County\t738\t41.4\t9.9\t14.7\t20951\t85909\t0.5018\t49092\tObama\t49092\t0.001872891\t49092.0\n9739\t-84.81004\t42.145959999999995\tHomer village\tMI\tMichigan\tCalhoun County\t1892\t33.9\t8.6\t16.1\t19082\t73413\t0.5018\t49245\tObama\t49245\t0.004801505\t49245.0\n9740\t-84.960199\t42.262468\tMarshall city\tMI\tMichigan\tCalhoun County\t7383\t40.8\t33.6\t8.6\t24938\t115507\t0.5018\t49068\tObama\t49068\t0.018736528\t49068.0\n9741\t-85.235752\t42.086593\tAthens village\tMI\tMichigan\tCalhoun County\t1118\t36.1\t11.9\t15.0\t21635\t88091\t0.5018\t49011\tObama\t49011\t0.002837253\t49011.0\n9742\t-85.080125\t42.105127\tBurlington village\tMI\tMichigan\tCalhoun County\t413\t41.0\t5.2\t13.1\t18225\t75833\t0.5018\t49029\tObama\t49029\t0.001048109\t49029.0\n9743\t-85.26600400000001\t42.364045000000004\tLevel Park-Oak Park CDP\tMI\tMichigan\tCalhoun County\t3393\t40.4\t15.0\t14.6\t22830\t85362\t0.5018\t49016\tObama\t49016\t0.008610733\t49016.0\n9744\t-85.914401\t41.918894\tVandalia village\tMI\tMichigan\tCass County\t448\t26.9\t4.2\t20.7\t13276\t61842\t0.4265\t49095\tObama\t49095\t0.001136931\t49095.0\n9745\t-86.08297900000001\t41.796483\tEdwardsburg village\tMI\tMichigan\tCass County\t1401\t39.2\t13.0\t11.8\t20751\t80909\t0.4265\t49112\tObama\t49112\t0.0035554479999999997\t49112.0\n9746\t-85.81333199999999\t42.025672\tMarcellus village\tMI\tMichigan\tCass County\t1119\t33.0\t10.6\t13.6\t17887\t78889\t0.4265\t49067\tObama\t49067\t0.002839791\t49067.0\n9747\t-86.11098\t41.984553000000005\tDowagiac city\tMI\tMichigan\tCass County\t5722\t34.0\t14.6\t18.9\t20578\t79843\t0.4265\t49047\tObama\t49047\t0.014521253000000001\t49047.0\n9748\t-86.007662\t41.912184\tCassopolis village\tMI\tMichigan\tCass County\t1868\t32.9\t13.4\t16.9\t16108\t73409\t0.4265\t49031\tObama\t49031\t0.0047405979999999995\t49031.0\n9749\t-85.13079300000001\t45.155831\tEast Jordan city\tMI\tMichigan\tCharlevoix County\t2484\t36.6\t12.1\t17.2\t18582\t88526\t0.4215\t49727\tObama\t49727\t0.006303879\t49727.0\n9750\t-85.25574499999999\t45.313891999999996\tCharlevoix city\tMI\tMichigan\tCharlevoix County\t2844\t42.4\t26.2\t12.8\t23190\t133105\t0.4215\t49720\tObama\t49720\t0.007217484000000001\t49720.0\n9751\t-85.014535\t45.213874\tBoyne City\tMI\tMichigan\tCharlevoix County\t3307\t39.9\t21.5\t15.5\t22092\t105806\t0.4215\t49712\tObama\t49712\t0.008392482\t49712.0\n9752\t-84.912547\t45.167681\tBoyne Falls village\tMI\tMichigan\tCharlevoix County\t397\t41.5\t12.3\t20.8\t20433\t94000\t0.4215\t49713\tObama\t49713\t0.001007504\t49713.0\n9753\t-84.46854300000001\t45.641329999999996\tCheboygan city\tMI\tMichigan\tCheboygan County\t5148\t40.5\t13.0\t14.2\t18148\t85000\t0.4381\t497HH\tObama\t497HH\t0.01306456\t0.0\n9754\t-84.604951\t45.273207\tWolverine village\tMI\tMichigan\tCheboygan County\t338\t39.2\t6.8\t10.6\t16776\t91667\t0.4381\t49799\tObama\t49799\t0.000857774\t49799.0\n9755\t-84.623387\t45.423682\tIndian River CDP\tMI\tMichigan\tCheboygan County\t2051\t50.2\t18.1\t10.9\t23210\t139384\t0.4381\t49749\tObama\t49749\t0.005205014\t49749.0\n9756\t-84.369099\t46.477028999999995\tSault Ste. Marie city\tMI\tMichigan\tChippewa County\t13843\t33.1\t21.6\t13.2\t20205\t76019\t0.4562\t49783\tObama\t49783\t0.035130673\t49783.0\n9757\t-83.914902\t45.990321\tDe Tour Village village\tMI\tMichigan\tChippewa County\t491\t54.7\t21.2\t21.5\t24460\t135714\t0.4562\t49725\tObama\t49725\t0.001246057\t49725.0\n9758\t-84.76340400000001\t43.826448\tClare city\tMI\tMichigan\tClare County\t2965\t38.1\t20.4\t16.4\t19589\t89485\t0.4693\t48617\tObama\t48617\t0.007524556999999999\t48617.0\n9759\t-84.807958\t44.016935\tHarrison city\tMI\tMichigan\tClare County\t2170\t41.7\t15.5\t24.2\t18144\t89457\t0.4693\t48625\tObama\t48625\t0.005507011\t48625.0\n9760\t-84.867799\t43.836259000000005\tFarwell village\tMI\tMichigan\tClare County\t844\t43.0\t7.7\t22.0\t18429\t83913\t0.4693\t48622\tObama\t48622\t0.0021418979999999997\t48622.0\n9761\t-84.575035\t42.836217\tDe Witt city\tMI\tMichigan\tClinton County\t5068\t35.3\t44.1\t8.1\t32041\t197589\t0.4636\t48820\tObama\t48820\t0.012861536000000002\t48820.0\n9762\t-84.790113\t42.808933\tEagle village\tMI\tMichigan\tClinton County\t143\t41.1\t24.2\t13.0\t27937\t173438\t0.4636\t48822\tObama\t48822\t0.000362904\t48822.0\n9763\t-84.79780500000001\t42.930407\tWestphalia village\tMI\tMichigan\tClinton County\t945\t35.4\t13.3\t7.3\t25337\t149375\t0.4636\t48894\tObama\t48894\t0.002398215\t48894.0\n9764\t-84.36633\t43.007598\tOvid village\tMI\tMichigan\tClinton County\t1686\t35.3\t10.1\t13.0\t19825\t90385\t0.4636\t48866\tObama\t48866\t0.004278719\t48866.0\n9765\t-84.556294\t42.999695\tSt. Johns city\tMI\tMichigan\tClinton County\t8173\t36.7\t22.4\t12.2\t25937\t119914\t0.4636\t48879\tObama\t48879\t0.020741385\t48879.0\n9766\t-84.740886\t43.004165\tFowler village\tMI\tMichigan\tClinton County\t1219\t34.8\t12.6\t12.5\t21047\t132197\t0.4636\t48835\tObama\t48835\t0.00309357\t48835.0\n9767\t-84.388359\t43.089707000000004\tElsie village\tMI\tMichigan\tClinton County\t1146\t36.7\t10.7\t18.7\t23023\t88469\t0.4636\t48831\tObama\t48831\t0.002908311\t48831.0\n9768\t-84.689734\t43.107673\tMaple Rapids village\tMI\tMichigan\tClinton County\t697\t36.1\t9.9\t11.8\t19915\t97826\t0.4636\t48853\tObama\t48853\t0.001768842\t48853.0\n9769\t-84.708703\t44.656727000000004\tGrayling city\tMI\tMichigan\tCrawford County\t1859\t41.7\t17.9\t14.4\t18021\t80185\t0.4394\t49738\tObama\t49738\t0.004717758\t49738.0\n9770\t-86.552451\t45.773207\tGarden village\tMI\tMichigan\tDelta County\t146\t50.8\t11.3\t19.4\t19252\t83333\t0.4615\t49835\tObama\t49835\t0.000370518\t49835.0\n9771\t-87.091747\t45.749957\tEscanaba city\tMI\tMichigan\tDelta County\t12483\t42.4\t22.7\t16.1\t21034\t86022\t0.4615\t49829\tObama\t49829\t0.031679274\t49829.0\n9772\t-87.035957\t45.851974\tGladstone city\tMI\tMichigan\tDelta County\t4781\t43.2\t24.1\t15.5\t21410\t82414\t0.4615\t49837\tObama\t49837\t0.01213319\t49837.0\n9773\t-87.913364\t45.801671999999996\tNorway city\tMI\tMichigan\tDickinson County\t2813\t41.3\t13.3\t15.8\t19229\t63770\t0.3866\t49870\tObama\t49870\t0.007138813000000001\t49870.0\n9774\t-88.061441\t45.827563\tIron Mountain city\tMI\tMichigan\tDickinson County\t7851\t42.7\t18.8\t13.1\t22138\t68339\t0.3866\t49802\tObama\t49802\t0.019924215\t49802.0\n9775\t-87.998402\t45.800629\tQuinnesec CDP\tMI\tMichigan\tDickinson County\t1154\t40.9\t10.0\t16.8\t19787\t72634\t0.3866\t49876\tObama\t49876\t0.002928613\t49876.0\n9776\t-88.099328\t45.806008\tKingsford city\tMI\tMichigan\tDickinson County\t5417\t42.3\t18.4\t14.2\t21306\t67527\t0.3866\t49802\tObama\t49802\t0.013747226000000001\t49802.0\n9777\t-84.646961\t42.648463\tDimondale village\tMI\tMichigan\tEaton County\t1388\t48.1\t26.3\t9.8\t28197\t130603\t0.5095\t48821\tObama\t48821\t0.003522457\t48821.0\n9778\t-84.623464\t42.740775\tWaverly CDP\tMI\tMichigan\tEaton County\t16297\t38.9\t38.7\t11.2\t30842\t143794\t0.5095\t48917\tObama\t48917\t0.041358417\t48917.0\n9779\t-85.018275\t42.444192\tBellevue village\tMI\tMichigan\tEaton County\t1397\t40.4\t10.4\t13.7\t21464\t95811\t0.5095\t49021\tObama\t49021\t0.003545297\t49021.0\n9780\t-84.83208499999999\t42.565615\tCharlotte city\tMI\tMichigan\tEaton County\t8526\t35.6\t20.0\t10.5\t23346\t91907\t0.5095\t48813\tObama\t48813\t0.021637226000000002\t48813.0\n9781\t-84.72929\t42.77442\tGrand Ledge city\tMI\tMichigan\tEaton County\t8070\t38.2\t27.5\t10.0\t26714\t116765\t0.5095\t48837\tObama\t48837\t0.020479992\t48837.0\n9782\t-84.925119\t42.443922\tOlivet city\tMI\tMichigan\tEaton County\t1852\t24.3\t23.7\t10.9\t19151\t107627\t0.5095\t49076\tObama\t49076\t0.0046999929999999995\t49076.0\n9783\t-84.74459\t42.629758\tPotterville city\tMI\tMichigan\tEaton County\t2288\t32.6\t12.9\t15.6\t20603\t81293\t0.5095\t48876\tObama\t48876\t0.005806471\t48876.0\n9784\t-84.99361400000001\t42.761466999999996\tSunfield village\tMI\tMichigan\tEaton County\t616\t38.8\t13.1\t15.8\t22702\t106419\t0.5095\t48890\tObama\t48890\t0.0015632810000000001\t48890.0\n9785\t-85.025182\t42.627454\tVermontville village\tMI\tMichigan\tEaton County\t797\t39.6\t12.6\t16.8\t20264\t91389\t0.5095\t49096\tObama\t49096\t0.002022621\t49096.0\n9786\t-84.65260500000001\t42.509478\tEaton Rapids city\tMI\tMichigan\tEaton County\t5249\t33.8\t18.2\t15.5\t23276\t101535\t0.5095\t48827\tObama\t48827\t0.013320877\t48827.0\n9787\t-84.89635899999999\t42.762985\tMulliken village\tMI\tMichigan\tEaton County\t618\t41.4\t10.6\t16.5\t24055\t99138\t0.5095\t48861\tObama\t48861\t0.0015683560000000001\t48861.0\n9788\t-84.988887\t45.432520000000004\tHarbor Springs city\tMI\tMichigan\tEmmet County\t1656\t48.3\t38.6\t14.8\t27026\t189362\t0.408\t49740\tObama\t49740\t0.0042025859999999995\t49740.0\n9789\t-84.727845\t45.777289\tMackinaw City village\tMI\tMichigan\tEmmet County\t878\t48.6\t23.6\t35.3\t23080\t128125\t0.408\t49701\tObama\t49701\t0.002228183\t49701.0\n9790\t-84.782999\t45.551603\tPellston village\tMI\tMichigan\tEmmet County\t848\t33.9\t12.0\t17.4\t15810\t88529\t0.408\t49769\tObama\t49769\t0.002152049\t49769.0\n9791\t-84.786956\t45.442526\tAlanson village\tMI\tMichigan\tEmmet County\t802\t39.3\t14.7\t12.7\t19441\t110784\t0.408\t49706\tObama\t49706\t0.00203531\t49706.0\n9792\t-84.955802\t45.366265000000006\tPetoskey city\tMI\tMichigan\tEmmet County\t6007\t40.4\t37.1\t11.1\t24890\t150340\t0.408\t49770\tObama\t49770\t0.015244523999999999\t49770.0\n9793\t-83.714736\t42.799521\tFenton city\tMI\tMichigan\tGenesee County\t11181\t36.0\t24.2\t14.7\t26470\t107016\t0.6356\t48430\tObama\t48430\t0.028375067\t48430.0\n9794\t-83.699047\t43.117328\tMount Morris city\tMI\tMichigan\tGenesee County\t3101\t33.2\t7.4\t16.0\t20847\t62790\t0.6356\t48458\tObama\t48458\t0.007869697\t48458.0\n9795\t-83.894102\t43.177144\tMontrose city\tMI\tMichigan\tGenesee County\t1590\t35.4\t9.8\t14.4\t21777\t76089\t0.6356\t48457\tObama\t48457\t0.004035091\t48457.0\n9796\t-83.617441\t42.997355999999996\tBurton city\tMI\tMichigan\tGenesee County\t29462\t37.2\t13.3\t16.4\t22493\t74236\t0.6356\t48519\tObama\t48519\t0.07476846599999999\t48519.0\n9797\t-83.708588\t42.845118\tLake Fenton CDP\tMI\tMichigan\tGenesee County\t5334\t42.7\t42.0\t11.1\t36625\t172235\t0.6356\t48430\tObama\t48430\t0.013536589\t48430.0\n9798\t-83.508996\t42.915509\tGoodrich village\tMI\tMichigan\tGenesee County\t1570\t34.4\t30.2\t14.7\t32626\t147222\t0.6356\t48438\tObama\t48438\t0.003984335\t48438.0\n9799\t-83.910969\t42.871876\tGaines village\tMI\tMichigan\tGenesee County\t336\t34.0\t6.6\t12.7\t23080\t76667\t0.6356\t48436\tObama\t48436\t0.000852699\t48436.0\n9800\t-83.735865\t43.17738\tClio city\tMI\tMichigan\tGenesee County\t2578\t33.0\t17.1\t13.3\t21253\t77250\t0.6356\t48420\tObama\t48420\t0.006542431\t48420.0\n9801\t-83.61873100000001\t42.925975\tGrand Blanc city\tMI\tMichigan\tGenesee County\t7810\t39.7\t44.7\t12.6\t33301\t145335\t0.6356\t48439\tObama\t48439\t0.019820166\t48439.0\n9802\t-83.703918\t43.090243\tBeecher CDP\tMI\tMichigan\tGenesee County\t11524\t29.9\t5.2\t33.2\t15240\t38711\t0.6356\t48505\tObama\t48505\t0.02924553\t48505.0\n9803\t-83.841171\t43.063606\tFlushing city\tMI\tMichigan\tGenesee County\t8169\t45.9\t31.5\t11.1\t28926\t115335\t0.6356\t48433\tObama\t48433\t0.020731233\t48433.0\n9804\t-83.835761\t42.790431\tArgentine CDP\tMI\tMichigan\tGenesee County\t2346\t40.1\t22.8\t9.7\t26834\t152568\t0.6356\t48451\tObama\t48451\t0.0059536630000000005\t48451.0\n9805\t-83.524693\t43.166021\tOtisville village\tMI\tMichigan\tGenesee County\t844\t34.0\t8.8\t19.5\t20989\t64146\t0.6356\t48463\tObama\t48463\t0.0021418979999999997\t48463.0\n9806\t-83.518114\t43.031514\tDavison city\tMI\tMichigan\tGenesee County\t5204\t39.6\t25.8\t15.2\t25588\t94082\t0.6356\t48423\tObama\t48423\t0.013206676\t48423.0\n9807\t-83.780961\t42.819301\tLinden city\tMI\tMichigan\tGenesee County\t3519\t40.3\t22.9\t11.9\t28358\t106757\t0.6356\t48451\tObama\t48451\t0.008930495\t48451.0\n9808\t-83.82526999999999\t42.963086\tSwartz Creek city\tMI\tMichigan\tGenesee County\t5281\t41.6\t17.6\t10.7\t27262\t100503\t0.6356\t48473\tObama\t48473\t0.013402086\t48473.0\n9809\t-83.692173\t43.023532\tFlint city\tMI\tMichigan\tGenesee County\t111879\t32.5\t13.2\t29.4\t18088\t48456\t0.6356\t48502\tObama\t48502\t0.283925776\t48502.0\n9810\t-84.48788499999999\t43.983706\tGladwin city\tMI\tMichigan\tGladwin County\t3014\t40.7\t15.9\t17.7\t17876\t87324\t0.4578\t48624\tObama\t48624\t0.007648909000000001\t48624.0\n9811\t-84.488496\t43.881007000000004\tBeaverton city\tMI\tMichigan\tGladwin County\t1062\t41.6\t10.6\t17.5\t17220\t90345\t0.4578\t48612\tObama\t48612\t0.002695136\t48612.0\n9812\t-90.15030300000001\t46.452141\tIronwood city\tMI\tMichigan\tGogebic County\t5685\t45.4\t19.6\t13.1\t16851\t39788\t0.5356\t49938\tObama\t49938\t0.014427355\t49938.0\n9813\t-90.04991\t46.477512\tBessemer city\tMI\tMichigan\tGogebic County\t1867\t45.6\t19.2\t14.3\t20063\t45000\t0.5356\t49911\tObama\t49911\t0.00473806\t49911.0\n9814\t-89.933766\t46.476579\tWakefield city\tMI\tMichigan\tGogebic County\t1950\t51.2\t15.5\t18.4\t19198\t41296\t0.5356\t49968\tObama\t49968\t0.004948697\t49968.0\n9815\t-85.601543\t44.778290999999996\tTraverse City\tMI\tMichigan\tGrand Traverse County\t15716\t40.8\t36.2\t14.7\t26705\t161184\t0.4349\t49686\tObama\t49686\t0.039883959\t49686.0\n9816\t-85.35104100000001\t44.573138\tFife Lake village\tMI\tMichigan\tGrand Traverse County\t531\t38.6\t17.1\t12.6\t20405\t114583\t0.4349\t49680\tObama\t49680\t0.001347568\t49680.0\n9817\t-85.537019\t44.584427000000005\tKingsley village\tMI\tMichigan\tGrand Traverse County\t1796\t32.9\t14.1\t11.6\t18465\t126389\t0.4349\t49649\tObama\t49649\t0.004557877\t49649.0\n9818\t-84.476341\t43.187870000000004\tAshley village\tMI\tMichigan\tGratiot County\t552\t41.2\t9.0\t20.8\t19608\t75357\t0.4746\t48806\tObama\t48806\t0.0014008620000000001\t48806.0\n9819\t-84.655419\t43.379938\tAlma city\tMI\tMichigan\tGratiot County\t9241\t33.5\t23.0\t18.8\t20016\t79357\t0.4746\t48801\tObama\t48801\t0.023451747999999998\t48801.0\n9820\t-84.478275\t43.407511\tBreckenridge village\tMI\tMichigan\tGratiot County\t1334\t34.3\t16.8\t10.4\t20984\t81304\t0.4746\t48615\tObama\t48615\t0.0033854159999999996\t48615.0\n9821\t-84.615788\t43.408621999999994\tSt. Louis city\tMI\tMichigan\tGratiot County\t5639\t34.9\t13.3\t14.6\t18112\t71458\t0.4746\t48880\tObama\t48880\t0.014310616000000002\t48880.0\n9822\t-84.679158\t43.180679\tPerrinton village\tMI\tMichigan\tGratiot County\t411\t34.5\t6.9\t21.9\t17326\t75000\t0.4746\t48871\tObama\t48871\t0.001043033\t48871.0\n9823\t-84.60481999999999\t43.290440999999994\tIthaca city\tMI\tMichigan\tGratiot County\t2996\t36.0\t14.2\t15.4\t19056\t78790\t0.4746\t48847\tObama\t48847\t0.007603229\t48847.0\n9824\t-84.666184\t41.978801000000004\tJonesville village\tMI\tMichigan\tHillsdale County\t2284\t38.5\t14.1\t20.5\t18983\t93810\t0.37200000000000005\t49250\tObama\t49250\t0.00579632\t49250.0\n9825\t-84.747698\t41.839634999999994\tReading city\tMI\tMichigan\tHillsdale County\t1171\t36.7\t11.1\t24.7\t17438\t80405\t0.37200000000000005\t49274\tObama\t49274\t0.002971756\t49274.0\n9826\t-84.525267\t41.970729\tNorth Adams village\tMI\tMichigan\tHillsdale County\t527\t38.9\t14.0\t15.1\t20282\t90500\t0.37200000000000005\t49262\tObama\t49262\t0.001337417\t49262.0\n9827\t-84.418825\t41.724197\tWaldron village\tMI\tMichigan\tHillsdale County\t573\t36.1\t9.2\t20.8\t15783\t78750\t0.37200000000000005\t49288\tObama\t49288\t0.001454156\t49288.0\n9828\t-84.768208\t41.958194\tAllen village\tMI\tMichigan\tHillsdale County\t233\t38.8\t12.7\t15.9\t20639\t105000\t0.37200000000000005\t49227\tObama\t49227\t0.000591306\t49227.0\n9829\t-84.757175\t42.041946\tLitchfield city\tMI\tMichigan\tHillsdale County\t1526\t40.0\t11.1\t17.4\t20954\t93333\t0.37200000000000005\t49252\tObama\t49252\t0.003872673\t49252.0\n9830\t-84.635738\t41.926142999999996\tHillsdale city\tMI\tMichigan\tHillsdale County\t7792\t32.1\t18.4\t26.2\t20412\t89561\t0.37200000000000005\t49242\tObama\t49242\t0.019774485\t49242.0\n9831\t-84.75626199999999\t41.755081\tCamden village\tMI\tMichigan\tHillsdale County\t576\t28.5\t10.2\t16.8\t15376\t89000\t0.37200000000000005\t49255\tObama\t49255\t0.001461769\t49255.0\n9832\t-84.806466\t41.777578999999996\tMontgomery village\tMI\tMichigan\tHillsdale County\t365\t37.4\t7.2\t20.0\t17750\t101875\t0.37200000000000005\t49255\tObama\t49255\t0.000926295\t49255.0\n9833\t-88.568933\t47.112064000000004\tHoughton city\tMI\tMichigan\tHoughton County\t6883\t22.9\t46.9\t13.8\t16397\t92410\t0.445\t49931\tObama\t49931\t0.017467631\t49931.0\n9834\t-88.387512\t47.284171\tCopper City village\tMI\tMichigan\tHoughton County\t186\t37.5\t28.0\t4.4\t15250\t48571\t0.445\t49917\tObama\t49917\t0.00047203\t49917.0\n9835\t-88.404239\t47.193203000000004\tLake Linden village\tMI\tMichigan\tHoughton County\t952\t43.3\t15.8\t9.5\t17162\t45577\t0.445\t49934\tObama\t49934\t0.002415979\t49934.0\n9836\t-88.43810699999999\t47.235333000000004\tLaurium village\tMI\tMichigan\tHoughton County\t1938\t40.6\t24.3\t11.1\t18801\t56901\t0.445\t49913\tObama\t49913\t0.004918243\t49913.0\n9837\t-88.43605600000001\t47.177113\tHubbell CDP\tMI\tMichigan\tHoughton County\t994\t42.8\t15.7\t13.3\t15428\t45615\t0.445\t49934\tObama\t49934\t0.0025225670000000003\t49934.0\n9838\t-88.600023\t47.134122\tHancock city\tMI\tMichigan\tHoughton County\t4091\t38.4\t31.6\t11.5\t18891\t68319\t0.445\t49930\tObama\t49930\t0.010382111999999999\t49930.0\n9839\t-88.644911\t47.070403999999996\tSouth Range village\tMI\tMichigan\tHoughton County\t653\t41.8\t15.5\t12.5\t18579\t46750\t0.445\t49963\tObama\t49963\t0.001657179\t49963.0\n9840\t-88.45356\t47.247727000000005\tCalumet village\tMI\tMichigan\tHoughton County\t761\t37.1\t17.2\t15.5\t17305\t46667\t0.445\t49913\tObama\t49913\t0.001931261\t49913.0\n9841\t-82.71488599999999\t43.939601\tPort Hope village\tMI\tMichigan\tHuron County\t299\t53.2\t11.9\t18.5\t19667\t75000\t0.42100000000000004\t48468\tObama\t48468\t0.0007587999999999999\t48468.0\n9842\t-82.995458\t43.939060999999995\tKinde village\tMI\tMichigan\tHuron County\t436\t33.5\t7.8\t34.1\t17967\t47105\t0.42100000000000004\t48445\tObama\t48445\t0.001106478\t48445.0\n9843\t-83.27418399999999\t43.941416\tCaseville village\tMI\tMichigan\tHuron County\t883\t56.5\t14.5\t19.3\t22443\t90395\t0.42100000000000004\t48725\tObama\t48725\t0.002240871\t48725.0\n9844\t-83.26729399999999\t43.727317\tOwendale village\tMI\tMichigan\tHuron County\t266\t43.5\t5.3\t25.4\t19548\t65714\t0.42100000000000004\t48754\tObama\t48754\t0.000675053\t48754.0\n9845\t-83.450544\t43.732147\tSebewaing village\tMI\tMichigan\tHuron County\t1733\t42.9\t12.6\t18.0\t20968\t70354\t0.42100000000000004\t48759\tObama\t48759\t0.0043979959999999995\t48759.0\n9846\t-82.656098\t43.845433\tHarbor Beach city\tMI\tMichigan\tHuron County\t1578\t46.2\t14.6\t19.2\t18516\t73592\t0.42100000000000004\t48441\tObama\t48441\t0.004004638\t48441.0\n9847\t-82.99809499999999\t43.803089\tBad Axe city\tMI\tMichigan\tHuron County\t3071\t40.3\t19.8\t16.3\t21392\t73321\t0.42100000000000004\t48413\tObama\t48413\t0.007793563000000001\t48413.0\n9848\t-82.933784\t43.709957\tUbly village\tMI\tMichigan\tHuron County\t885\t42.1\t10.4\t22.2\t19707\t77564\t0.42100000000000004\t48475\tObama\t48475\t0.0022459470000000003\t48475.0\n9849\t-82.994502\t44.043037\tPort Austin village\tMI\tMichigan\tHuron County\t703\t55.8\t19.8\t22.8\t25230\t95000\t0.42100000000000004\t48467\tObama\t48467\t0.0017840689999999999\t48467.0\n9850\t-83.180973\t43.818323\tElkton village\tMI\tMichigan\tHuron County\t687\t37.6\t7.0\t13.6\t18893\t66200\t0.42100000000000004\t48731\tObama\t48731\t0.001743464\t48731.0\n9851\t-83.26965799999999\t43.829663000000004\tPigeon village\tMI\tMichigan\tHuron County\t986\t46.7\t15.3\t11.4\t20896\t69297\t0.42100000000000004\t48755\tObama\t48755\t0.002502264\t48755.0\n9852\t-84.444675\t42.581258\tMason city\tMI\tMichigan\tIngham County\t7469\t38.6\t28.3\t10.2\t24725\t111372\t0.6321\t48854\tObama\t48854\t0.018954778000000002\t48854.0\n9853\t-84.401471\t42.752206\tHaslett CDP\tMI\tMichigan\tIngham County\t11108\t39.2\t52.0\t10.4\t32798\t152606\t0.6321\t48840\tObama\t48840\t0.028189807999999997\t48840.0\n9854\t-84.414419\t42.71123\tOkemos CDP\tMI\tMichigan\tIngham County\t22709\t36.5\t69.7\t9.4\t37718\t189080\t0.6321\t48864\tObama\t48864\t0.057630747999999996\t48864.0\n9855\t-84.55315300000001\t42.711354\tLansing city\tMI\tMichigan\tIngham County\t115037\t32.8\t23.0\t16.9\t21191\t80031\t0.6321\t48910\tObama\t48910\t0.291940127\t48910.0\n9856\t-84.179677\t42.666233\tWebberville village\tMI\tMichigan\tIngham County\t1368\t35.3\t13.2\t13.8\t21510\t103523\t0.6321\t48892\tObama\t48892\t0.0034717009999999998\t48892.0\n9857\t-84.283551\t42.683503\tWilliamston city\tMI\tMichigan\tIngham County\t3504\t36.2\t39.4\t11.9\t27879\t128770\t0.6321\t48895\tObama\t48895\t0.008892428\t48895.0\n9858\t-84.48398\t42.784438\tEast Lansing city\tMI\tMichigan\tIngham County\t47978\t23.2\t69.1\t17.6\t21080\t152826\t0.6321\t48823\tObama\t48823\t0.12175824699999999\t48823.0\n9859\t-84.433527\t42.450567\tLeslie city\tMI\tMichigan\tIngham County\t2082\t33.9\t11.2\t13.0\t21420\t92157\t0.6321\t49251\tObama\t49251\t0.005283686\t49251.0\n9860\t-84.17555300000001\t42.448453\tStockbridge village\tMI\tMichigan\tIngham County\t1312\t37.1\t19.2\t12.3\t24851\t138281\t0.6321\t49285\tObama\t49285\t0.003329585\t49285.0\n9861\t-84.30279300000001\t42.555727000000005\tDansville village\tMI\tMichigan\tIngham County\t453\t40.3\t13.9\t14.3\t22126\t121552\t0.6321\t48819\tObama\t48819\t0.00114962\t48819.0\n9862\t-84.52525899999999\t42.6375\tHolt CDP\tMI\tMichigan\tIngham County\t11289\t36.2\t25.5\t9.9\t25476\t108973\t0.6321\t48842\tObama\t48842\t0.028649148\t48842.0\n9863\t-84.592535\t42.746857\tEdgemont Park CDP\tMI\tMichigan\tIngham County\t2319\t39.8\t31.0\t9.8\t28010\t104869\t0.6321\t48915\tObama\t48915\t0.005885143000000001\t48915.0\n9864\t-84.833649\t43.094282\tHubbardston village\tMI\tMichigan\tIonia County\t409\t37.3\t6.5\t22.8\t17922\t97500\t0.4277\t48845\tObama\t48845\t0.001037957\t48845.0\n9865\t-84.945624\t42.983445\tLyons village\tMI\tMichigan\tIonia County\t717\t41.8\t7.3\t19.4\t21178\t91905\t0.4277\t48851\tObama\t48851\t0.001819598\t48851.0\n9866\t-85.24253\t42.842083\tClarksville village\tMI\tMichigan\tIonia County\t348\t42.2\t20.4\t9.8\t24371\t152381\t0.4277\t48815\tObama\t48815\t0.000883152\t48815.0\n9867\t-85.073658\t42.979357\tIonia city\tMI\tMichigan\tIonia County\t12323\t27.5\t9.8\t18.7\t17692\t85690\t0.4277\t48846\tObama\t48846\t0.031273227\t48846.0\n9868\t-85.136961\t42.782631\tLake Odessa village\tMI\tMichigan\tIonia County\t2256\t34.3\t15.9\t22.8\t19664\t98559\t0.4277\t48849\tObama\t48849\t0.005725261999999999\t48849.0\n9869\t-85.23299\t43.096938\tBelding city\tMI\tMichigan\tIonia County\t5818\t33.2\t10.9\t19.1\t18246\t98070\t0.4277\t48809\tObama\t48809\t0.014764881\t48809.0\n9870\t-84.847347\t43.001905\tPewamo village\tMI\tMichigan\tIonia County\t563\t32.9\t8.2\t23.9\t17664\t100417\t0.4277\t48873\tObama\t48873\t0.001428778\t48873.0\n9871\t-84.9359\t42.997195\tMuir village\tMI\tMichigan\tIonia County\t668\t35.9\t6.5\t16.6\t18271\t88864\t0.4277\t48860\tObama\t48860\t0.001695246\t48860.0\n9872\t-84.901816\t42.8721\tPortland city\tMI\tMichigan\tIonia County\t3826\t36.6\t20.3\t11.1\t25147\t123121\t0.4277\t48875\tObama\t48875\t0.009709597\t48875.0\n9873\t-85.210482\t42.929303999999995\tSaranac village\tMI\tMichigan\tIonia County\t1431\t37.8\t13.7\t15.3\t20076\t115231\t0.4277\t48881\tObama\t48881\t0.003631582\t48881.0\n9874\t-83.48480699999999\t44.288423\tEast Tawas city\tMI\tMichigan\tIosco County\t2674\t47.3\t22.3\t19.0\t21271\t80526\t0.4678\t48730\tObama\t48730\t0.0067860590000000005\t48730.0\n9875\t-83.342282\t44.410455999999996\tAu Sable CDP\tMI\tMichigan\tIosco County\t1374\t48.4\t12.6\t21.6\t19969\t73559\t0.4678\t48750\tObama\t48750\t0.003486928\t48750.0\n9876\t-83.80323100000001\t44.233740000000004\tWhittemore city\tMI\tMichigan\tIosco County\t463\t42.7\t9.3\t21.7\t18074\t66111\t0.4678\t48770\tObama\t48770\t0.001174998\t48770.0\n9877\t-83.334066\t44.425115999999996\tOscoda CDP\tMI\tMichigan\tIosco County\t878\t47.9\t15.3\t26.7\t22025\t83421\t0.4678\t48750\tObama\t48750\t0.002228183\t48750.0\n9878\t-83.52481\t44.267942\tTawas City\tMI\tMichigan\tIosco County\t1890\t48.5\t13.4\t23.8\t20507\t77299\t0.4678\t48763\tObama\t48763\t0.0047964290000000005\t48763.0\n9879\t-88.326812\t46.097242\tCrystal Falls city\tMI\tMichigan\tIron County\t1596\t50.6\t17.5\t13.2\t19383\t54805\t0.4487\t49920\tObama\t49920\t0.004050318\t49920.0\n9880\t-88.633308\t46.07932\tStambaugh city\tMI\tMichigan\tIron County\t1035\t44.9\t15.2\t13.7\t16174\t44545\t0.4487\t49964\tObama\t49964\t0.0026266159999999996\t49964.0\n9881\t-88.626599\t46.065379\tCaspian city\tMI\tMichigan\tIron County\t817\t48.1\t12.6\t12.8\t17555\t43636\t0.4487\t49915\tObama\t49915\t0.002073377\t49915.0\n9882\t-88.63829399999999\t46.098622\tIron River city\tMI\tMichigan\tIron County\t1770\t46.1\t16.2\t16.7\t18789\t47473\t0.4487\t49964\tObama\t49964\t0.004491894000000001\t49964.0\n9883\t-88.605181\t46.055748\tGaastra city\tMI\tMichigan\tIron County\t281\t49.0\t20.2\t13.4\t17098\t45909\t0.4487\t49927\tObama\t49927\t0.00071312\t49927.0\n9884\t-88.37760899999999\t46.043977000000005\tAlpha village\tMI\tMichigan\tIron County\t183\t47.7\t13.3\t14.1\t20816\t44375\t0.4487\t49902\tObama\t49902\t0.000464416\t49902.0\n9885\t-88.646955\t46.113431\tMineral Hills village\tMI\tMichigan\tIron County\t198\t42.7\t12.4\t16.5\t17333\t44545\t0.4487\t49964\tObama\t49964\t0.0005024830000000001\t49964.0\n9886\t-85.003828\t43.641852\tVillage of Lake Isabella village\tMI\tMichigan\tIsabella County\t1521\t46.6\t21.5\t9.1\t23254\t111236\t0.5406\t48893\tObama\t48893\t0.0038599840000000003\t48893.0\n9887\t-84.692638\t43.523416999999995\tShepherd village\tMI\tMichigan\tIsabella County\t1641\t37.2\t28.7\t8.7\t24464\t106628\t0.5406\t48883\tObama\t48883\t0.004164519\t48883.0\n9888\t-84.765875\t43.699709999999996\tRosebush village\tMI\tMichigan\tIsabella County\t393\t35.6\t12.7\t12.7\t19530\t105172\t0.5406\t48878\tObama\t48878\t0.000997353\t48878.0\n9889\t-84.775865\t43.596574\tMount Pleasant city\tMI\tMichigan\tIsabella County\t27285\t22.8\t44.4\t15.8\t17215\t119007\t0.5406\t48858\tObama\t48858\t0.06924369\t48858.0\n9890\t-84.97403\t43.701361999999996\tWeidman CDP\tMI\tMichigan\tIsabella County\t897\t39.5\t12.0\t13.8\t19751\t98000\t0.5406\t48893\tObama\t48893\t0.002276401\t48893.0\n9891\t-84.908857\t43.669215\tBeal City CDP\tMI\tMichigan\tIsabella County\t354\t37.8\t13.6\t9.6\t19589\t114286\t0.5406\t48893\tObama\t48893\t0.0008983789999999999\t48893.0\n9892\t-84.20727099999999\t42.25096\tGrass Lake village\tMI\tMichigan\tJackson County\t1204\t39.6\t26.4\t15.4\t27528\t158523\t0.4651\t49240\tObama\t49240\t0.0030555029999999998\t49240.0\n9893\t-84.248456\t42.105767\tBrooklyn village\tMI\tMichigan\tJackson County\t1259\t43.6\t17.5\t14.9\t23773\t114754\t0.4651\t49230\tObama\t49230\t0.003195082\t49230.0\n9894\t-84.553506\t42.100133\tHanover village\tMI\tMichigan\tJackson County\t463\t39.4\t10.9\t11.6\t20353\t82333\t0.4651\t49241\tObama\t49241\t0.001174998\t49241.0\n9895\t-84.40381500000001\t42.243014\tJackson city\tMI\tMichigan\tJackson County\t34952\t32.8\t15.5\t22.6\t18795\t68777\t0.4651\t49203\tObama\t49203\t0.088700951\t49203.0\n9896\t-84.696332\t42.378423\tSpringport village\tMI\tMichigan\tJackson County\t707\t37.3\t12.4\t16.9\t17471\t77391\t0.4651\t49284\tObama\t49284\t0.00179422\t49284.0\n9897\t-84.38555500000001\t42.191462\tVandercook Lake CDP\tMI\tMichigan\tJackson County\t4746\t37.9\t13.0\t17.9\t23516\t80147\t0.4651\t49203\tObama\t49203\t0.012044367\t49203.0\n9898\t-84.598021\t42.256992\tParma village\tMI\tMichigan\tJackson County\t896\t39.1\t23.1\t11.8\t21254\t106563\t0.4651\t49269\tObama\t49269\t0.002273863\t49269.0\n9899\t-84.24149200000001\t42.165791999999996\tNapoleon CDP\tMI\tMichigan\tJackson County\t1377\t39.5\t14.8\t15.4\t21924\t103750\t0.4651\t49263\tObama\t49263\t0.003494541\t49263.0\n9900\t-84.555551\t42.205515000000005\tSpring Arbor CDP\tMI\tMichigan\tJackson County\t2281\t31.9\t46.5\t17.5\t21194\t133333\t0.4651\t49283\tObama\t49283\t0.005788707\t49283.0\n9901\t-84.645263\t42.175751\tConcord village\tMI\tMichigan\tJackson County\t1172\t40.8\t20.6\t14.8\t22371\t105682\t0.4651\t49237\tObama\t49237\t0.002974294\t49237.0\n9902\t-84.323026\t42.226532\tMichigan Center CDP\tMI\tMichigan\tJackson County\t4649\t43.0\t10.9\t17.4\t22672\t96093\t0.4651\t49254\tObama\t49254\t0.011798201000000001\t49254.0\n9903\t-85.336042\t42.238321\tClimax village\tMI\tMichigan\tKalamazoo County\t818\t40.7\t19.2\t13.6\t21134\t102744\t0.5606\t49034\tObama\t49034\t0.002075915\t49034.0\n9904\t-85.566511\t42.327642\tParchment city\tMI\tMichigan\tKalamazoo County\t1893\t38.3\t30.9\t17.5\t24119\t114470\t0.5606\t49004\tObama\t49004\t0.004804043\t49004.0\n9905\t-85.43628299999999\t42.290253\tGreater Galesburg CDP\tMI\tMichigan\tKalamazoo County\t1696\t40.7\t24.7\t14.6\t24766\t139648\t0.5606\t49053\tObama\t49053\t0.004304097\t49053.0\n9906\t-85.628811\t42.302972\tWestwood CDP\tMI\tMichigan\tKalamazoo County\t8807\t35.2\t45.0\t9.5\t24496\t115938\t0.5606\t49006\tObama\t49006\t0.022350346\t49006.0\n9907\t-85.455011\t42.376228000000005\tRichland village\tMI\tMichigan\tKalamazoo County\t666\t44.0\t40.9\t7.2\t29793\t163514\t0.5606\t49083\tObama\t49083\t0.00169017\t49083.0\n9908\t-85.544304\t42.30277\tEastwood CDP\tMI\tMichigan\tKalamazoo County\t6455\t34.6\t17.2\t18.5\t21233\t80687\t0.5606\t49001\tObama\t49001\t0.016381456000000003\t49001.0\n9909\t-85.51759100000001\t42.321815\tComstock Northwest CDP\tMI\tMichigan\tKalamazoo County\t5275\t34.9\t27.6\t8.7\t27436\t147394\t0.5606\t49004\tObama\t49004\t0.01338686\t49004.0\n9910\t-85.351382\t42.337733\tAugusta village\tMI\tMichigan\tKalamazoo County\t956\t38.8\t18.8\t14.1\t24178\t107843\t0.5606\t49012\tObama\t49012\t0.00242613\t49012.0\n9911\t-85.400752\t42.389974\tSouth Gull Lake CDP\tMI\tMichigan\tKalamazoo County\t1471\t47.8\t45.6\t12.9\t36739\t289151\t0.5606\t49060\tObama\t49060\t0.003733094\t49060.0\n9912\t-85.418373\t42.290941\tGalesburg city\tMI\tMichigan\tKalamazoo County\t2114\t34.3\t14.1\t19.6\t21318\t67353\t0.5606\t49053\tObama\t49053\t0.005364895\t49053.0\n9913\t-85.63374499999999\t42.116471000000004\tSchoolcraft village\tMI\tMichigan\tKalamazoo County\t1635\t38.0\t25.2\t9.6\t22488\t125275\t0.5606\t49087\tObama\t49087\t0.004149292\t49087.0\n9914\t-85.588036\t42.274888\tKalamazoo city\tMI\tMichigan\tKalamazoo County\t77091\t27.2\t36.9\t18.1\t20971\t94930\t0.5606\t49007\tObama\t49007\t0.195641023\t49007.0\n9915\t-85.59052700000001\t42.200012\tPortage city\tMI\tMichigan\tKalamazoo County\t45228\t37.7\t39.8\t12.1\t27969\t148176\t0.5606\t49024\tObama\t49024\t0.114779315\t49024.0\n9916\t-85.537596\t42.123526\tVicksburg village\tMI\tMichigan\tKalamazoo County\t2421\t34.8\t21.0\t14.2\t23436\t109500\t0.5606\t49097\tObama\t49097\t0.006143998\t49097.0\n9917\t-85.18308499999999\t44.732240000000004\tKalkaska village\tMI\tMichigan\tKalkaska County\t2350\t36.1\t14.2\t13.3\t20336\t96094\t0.3943\t49646\tObama\t49646\t0.0059638140000000004\t49646.0\n9918\t-85.766035\t42.985825\tWalker city\tMI\tMichigan\tKent County\t24456\t33.9\t27.1\t10.1\t24979\t136946\t0.4553\t49544\tObama\t49544\t0.062064272999999996\t49544.0\n9919\t-85.519083\t43.290290999999996\tSand Lake village\tMI\tMichigan\tKent County\t544\t37.0\t11.9\t19.3\t20787\t98824\t0.4553\t49343\tObama\t49343\t0.00138056\t49343.0\n9920\t-85.756338\t42.900428000000005\tGrandville city\tMI\tMichigan\tKent County\t16965\t35.3\t25.9\t11.1\t25687\t137398\t0.4553\t49418\tObama\t49418\t0.043053663\t49418.0\n9921\t-85.65578199999999\t42.961441\tGrand Rapids city\tMI\tMichigan\tKent County\t202395\t31.9\t27.2\t17.5\t20902\t102731\t0.4553\t49503\tObama\t49503\t0.513636674\t49503.0\n9922\t-85.754228\t43.218999999999994\tKent City village\tMI\tMichigan\tKent County\t1162\t29.4\t7.9\t21.1\t20411\t80000\t0.4553\t49330\tObama\t49330\t0.0029489159999999998\t49330.0\n9923\t-85.59261\t42.885259000000005\tKentwood city\tMI\tMichigan\tKent County\t48134\t33.1\t36.6\t13.5\t26314\t133536\t0.4553\t49512\tObama\t49512\t0.122154142\t49512.0\n9924\t-85.515546\t42.794416\tCaledonia village\tMI\tMichigan\tKent County\t1493\t34.1\t37.3\t9.4\t28938\t138246\t0.4553\t49316\tObama\t49316\t0.003788925\t49316.0\n9925\t-85.67390400000001\t42.840676\tCutlerville CDP\tMI\tMichigan\tKent County\t15167\t33.5\t15.9\t12.0\t23220\t86734\t0.4553\t49548\tObama\t49548\t0.038490711000000004\t49548.0\n9926\t-85.706342\t42.891521999999995\tWyoming city\tMI\tMichigan\tKent County\t73139\t32.7\t21.2\t14.1\t23370\t105884\t0.4553\t49509\tObama\t49509\t0.18561166399999998\t49509.0\n9927\t-85.34592099999999\t42.934999\tLowell city\tMI\tMichigan\tKent County\t4171\t34.7\t19.3\t15.8\t22758\t113927\t0.4553\t49331\tObama\t49331\t0.010585136\t49331.0\n9928\t-85.60155\t43.042764\tNorthview CDP\tMI\tMichigan\tKent County\t15318\t36.1\t30.2\t10.8\t24636\t134530\t0.4553\t49525\tObama\t49525\t0.038873918\t49525.0\n9929\t-85.60856700000001\t42.946351\tEast Grand Rapids city\tMI\tMichigan\tKent County\t10787\t39.3\t74.7\t8.6\t42733\t233940\t0.4553\t49506\tObama\t49506\t0.027375176\t49506.0\n9930\t-85.72792\t42.81214\tByron Center CDP\tMI\tMichigan\tKent County\t5246\t37.0\t38.2\t10.7\t30644\t179414\t0.4553\t49315\tObama\t49315\t0.013313263999999998\t49315.0\n9931\t-85.784098\t43.23427\tCasnovia village\tMI\tMichigan\tKent County\t329\t37.8\t11.1\t19.0\t22392\t125000\t0.4553\t49318\tObama\t49318\t0.000834934\t49318.0\n9932\t-85.552388\t43.221022\tCedar Springs city\tMI\tMichigan\tKent County\t3455\t30.9\t14.7\t20.9\t19227\t85253\t0.4553\t49319\tObama\t49319\t0.008768076\t49319.0\n9933\t-85.556329\t43.127047\tRockford city\tMI\tMichigan\tKent County\t5310\t32.2\t32.4\t10.8\t24118\t132699\t0.4553\t49341\tObama\t49341\t0.013475682\t49341.0\n9934\t-85.709063\t43.157788000000004\tSparta village\tMI\tMichigan\tKent County\t4229\t33.5\t18.8\t12.4\t22801\t98065\t0.4553\t49345\tObama\t49345\t0.010732328000000001\t49345.0\n9935\t-85.489398\t42.957644\tForest Hills CDP\tMI\tMichigan\tKent County\t23799\t41.9\t58.3\t8.8\t43522\t251153\t0.4553\t49301\tObama\t49301\t0.060396943\t49301.0\n9936\t-85.677862\t43.043784\tComstock Park CDP\tMI\tMichigan\tKent County\t11110\t29.9\t22.7\t15.1\t24756\t130854\t0.4553\t49321\tObama\t49321\t0.028194882999999997\t49321.0\n9937\t-88.39712800000001\t47.298601\tAhmeek village\tMI\tMichigan\tKeweenaw County\t154\t49.0\t15.7\t15.8\t16687\t44167\t0.4181\t49901\tObama\t49901\t0.00039082\t49901.0\n9938\t-85.85311999999999\t43.897152\tBaldwin village\tMI\tMichigan\tLake County\t969\t47.3\t9.7\t23.3\t16290\t61818\t0.5205\t49304\tObama\t49304\t0.0024591220000000002\t49304.0\n9939\t-85.682612\t44.03866\tLuther village\tMI\tMichigan\tLake County\t367\t44.1\t7.7\t13.2\t18913\t62500\t0.5205\t49656\tObama\t49656\t0.00093137\t49656.0\n9940\t-83.312298\t43.179546\tBarnes Lake-Millers Lake CDP\tMI\tMichigan\tLapeer County\t1262\t41.4\t15.7\t20.9\t24665\t112500\t0.436\t48435\tObama\t48435\t0.003202695\t48435.0\n9941\t-83.407353\t43.157345\tColumbiaville village\tMI\tMichigan\tLapeer County\t871\t38.5\t9.4\t20.1\t22154\t97969\t0.436\t48421\tObama\t48421\t0.002210418\t48421.0\n9942\t-83.325204\t43.048375\tLapeer city\tMI\tMichigan\tLapeer County\t9143\t34.2\t10.8\t21.1\t20914\t88333\t0.436\t48446\tObama\t48446\t0.023203044\t48446.0\n9943\t-83.07655799999999\t43.016890000000004\tImlay City\tMI\tMichigan\tLapeer County\t3812\t33.7\t12.0\t21.3\t19355\t85853\t0.436\t48444\tObama\t48444\t0.009674068000000001\t48444.0\n9944\t-83.179293\t43.314849\tClifford village\tMI\tMichigan\tLapeer County\t352\t38.2\t7.3\t27.2\t18915\t75909\t0.436\t48727\tObama\t48727\t0.000893303\t48727.0\n9945\t-83.455541\t43.214484000000006\tOtter Lake village\tMI\tMichigan\tLapeer County\t459\t39.6\t9.0\t22.3\t19510\t88400\t0.436\t48464\tObama\t48464\t0.0011648469999999999\t48464.0\n9946\t-83.190859\t43.229296999999995\tNorth Branch village\tMI\tMichigan\tLapeer County\t1073\t33.3\t8.2\t16.5\t20494\t94697\t0.436\t48461\tObama\t48461\t0.002723052\t48461.0\n9947\t-83.043363\t42.920534\tAlmont village\tMI\tMichigan\tLapeer County\t2831\t35.3\t17.5\t12.1\t26056\t110928\t0.436\t48003\tObama\t48003\t0.007184493\t48003.0\n9948\t-83.123636\t42.945551\tDryden village\tMI\tMichigan\tLapeer County\t816\t38.5\t20.4\t13.1\t31719\t137981\t0.436\t48428\tObama\t48428\t0.002070839\t48428.0\n9949\t-83.28993\t42.941731\tMetamora village\tMI\tMichigan\tLapeer County\t551\t40.5\t28.9\t27.5\t28317\t157143\t0.436\t48455\tObama\t48455\t0.0013983239999999998\t48455.0\n9950\t-85.663143\t44.804914000000004\tGreilickville CDP\tMI\tMichigan\tLeelanau County\t1402\t46.8\t31.4\t10.0\t26061\t147685\t0.4639\t49684\tObama\t49684\t0.003557986\t49684.0\n9951\t-86.059089\t44.81178\tEmpire village\tMI\tMichigan\tLeelanau County\t407\t49.1\t35.9\t11.2\t25641\t155000\t0.4639\t49630\tObama\t49630\t0.001032882\t49630.0\n9952\t-85.651617\t44.977861\tSuttons Bay village\tMI\tMichigan\tLeelanau County\t576\t43.3\t33.4\t10.0\t24034\t170000\t0.4639\t49682\tObama\t49682\t0.001461769\t49682.0\n9953\t-85.617195\t45.130199\tNorthport village\tMI\tMichigan\tLeelanau County\t713\t55.8\t39.1\t16.2\t28586\t194886\t0.4639\t49670\tObama\t49670\t0.001809447\t49670.0\n9954\t-84.349275\t41.986277\tAddison village\tMI\tMichigan\tLenawee County\t668\t38.4\t16.7\t25.8\t22039\t111364\t0.4869\t49220\tObama\t49220\t0.001695246\t49220.0\n9955\t-84.04301600000001\t41.898758\tAdrian city\tMI\tMichigan\tLenawee County\t22171\t33.2\t24.2\t18.7\t20576\t98606\t0.4869\t49221\tObama\t49221\t0.056265415\t49221.0\n9956\t-84.216693\t41.72275\tMorenci city\tMI\tMichigan\tLenawee County\t2412\t37.7\t14.9\t22.8\t20001\t95287\t0.4869\t49256\tObama\t49256\t0.0061211569999999995\t49256.0\n9957\t-84.286153\t41.975643\tManitou Beach-Devils Lake CDP\tMI\tMichigan\tLenawee County\t2063\t45.3\t23.5\t22.5\t26482\t167659\t0.4869\t49253\tObama\t49253\t0.005235468\t49253.0\n9958\t-84.327805\t42.075179999999996\tCement City village\tMI\tMichigan\tLenawee County\t490\t42.7\t8.4\t32.4\t20138\t116810\t0.4869\t49233\tObama\t49233\t0.001243519\t49233.0\n9959\t-83.831307\t41.987527\tBritton village\tMI\tMichigan\tLenawee County\t706\t37.7\t12.4\t19.9\t23664\t121591\t0.4869\t49229\tObama\t49229\t0.0017916820000000002\t49229.0\n9960\t-83.778834\t41.890155\tDeerfield village\tMI\tMichigan\tLenawee County\t1003\t35.9\t15.0\t16.3\t20179\t127830\t0.4869\t49238\tObama\t49238\t0.002545407\t49238.0\n9961\t-83.863943\t41.831317999999996\tBlissfield village\tMI\tMichigan\tLenawee County\t3130\t38.8\t19.8\t20.0\t21723\t114295\t0.4869\t49228\tObama\t49228\t0.007943293\t49228.0\n9962\t-84.189048\t42.007015\tOnsted village\tMI\tMichigan\tLenawee County\t880\t41.2\t22.1\t15.5\t27400\t181731\t0.4869\t49265\tObama\t49265\t0.0022332579999999997\t49265.0\n9963\t-83.94464\t42.007023\tTecumseh city\tMI\tMichigan\tLenawee County\t8592\t38.7\t24.5\t19.2\t26758\t141084\t0.4869\t49286\tObama\t49286\t0.02180472\t49286.0\n9964\t-84.34615600000001\t41.857238\tHudson city\tMI\tMichigan\tLenawee County\t2389\t36.7\t13.1\t17.0\t20429\t94114\t0.4869\t49247\tObama\t49247\t0.006062788\t49247.0\n9965\t-84.23488499999999\t41.864551\tClayton village\tMI\tMichigan\tLenawee County\t341\t42.2\t13.2\t15.7\t20374\t117361\t0.4869\t49235\tObama\t49235\t0.000865388\t49235.0\n9966\t-83.969769\t42.068728\tClinton village\tMI\tMichigan\tLenawee County\t2405\t39.8\t20.1\t19.6\t24866\t133365\t0.4869\t49236\tObama\t49236\t0.006103393\t49236.0\n9967\t-83.785174\t42.530051\tBrighton city\tMI\tMichigan\tLivingston County\t7868\t39.7\t35.7\t14.0\t36929\t150296\t0.3785\t48116\tObama\t48116\t0.019967358\t48116.0\n9968\t-84.073628\t42.659403000000005\tFowlerville village\tMI\tMichigan\tLivingston County\t3673\t32.3\t13.5\t17.0\t25740\t77925\t0.3785\t48836\tObama\t48836\t0.009321315\t48836.0\n9969\t-83.93681600000001\t42.611173\tHowell city\tMI\tMichigan\tLivingston County\t10364\t35.1\t29.0\t16.7\t29964\t117130\t0.3785\t48843\tObama\t48843\t0.02630169\t48843.0\n9970\t-83.945465\t42.454726\tPinckney village\tMI\tMichigan\tLivingston County\t2366\t31.7\t27.6\t14.9\t29066\t146063\t0.3785\t48169\tObama\t48169\t0.006004419\t48169.0\n9971\t-85.509807\t46.353813\tNewberry village\tMI\tMichigan\tLuce County\t1529\t34.4\t12.7\t14.4\t16664\t56475\t0.3817\t49868\tObama\t49868\t0.0038802859999999997\t49868.0\n9972\t-84.629374\t45.864367\tMackinac Island city\tMI\tMichigan\tMackinac County\t404\t44.3\t35.8\t11.2\t32241\t182500\t0.4348\t49757\tObama\t49757\t0.001025268\t49757.0\n9973\t-84.734589\t45.869292\tSt. Ignace city\tMI\tMichigan\tMackinac County\t2513\t43.3\t21.0\t8.9\t21528\t96280\t0.4348\t49781\tObama\t49781\t0.006377475\t49781.0\n9974\t-83.026962\t42.493615000000005\tWarren city\tMI\tMichigan\tMacomb County\t135036\t40.8\t16.1\t18.4\t25957\t102169\t0.5148\t48015\tObama\t48015\t0.342693455\t48015.0\n9975\t-83.030406\t42.580878999999996\tSterling Heights city\tMI\tMichigan\tMacomb County\t131730\t39.3\t28.1\t14.3\t30245\t145672\t0.5148\t48314\tObama\t48314\t0.334303511\t48314.0\n9976\t-82.881815\t42.597671000000005\tMount Clemens city\tMI\tMichigan\tMacomb County\t16864\t38.5\t16.6\t22.1\t24353\t85932\t0.5148\t48043\tObama\t48043\t0.04279734599999999\t48043.0\n9977\t-82.91901899999999\t42.585972999999996\tClinton CDP\tMI\tMichigan\tMacomb County\t97658\t40.0\t21.9\t17.9\t30500\t117983\t0.5148\t48036\tObama\t48036\t0.24783581699999999\t48036.0\n9978\t-82.94595600000001\t42.465798\tEastpointe city\tMI\tMichigan\tMacomb County\t33636\t39.5\t14.1\t17.2\t26276\t90104\t0.5148\t48021\tObama\t48021\t0.085361215\t48021.0\n9979\t-82.883411\t42.842352000000005\tArmada village\tMI\tMichigan\tMacomb County\t1581\t38.8\t19.2\t18.6\t29138\t123459\t0.5148\t48005\tObama\t48005\t0.004012251\t48005.0\n9980\t-83.03494599999999\t42.671419\tShelby CDP\tMI\tMichigan\tMacomb County\t72629\t39.4\t31.4\t13.5\t37219\t155366\t0.5148\t48316\tObama\t48316\t0.184317389\t48316.0\n9981\t-82.795059\t42.73012\tNew Haven village\tMI\tMichigan\tMacomb County\t4001\t33.2\t8.5\t20.9\t20243\t48704\t0.5148\t48048\tObama\t48048\t0.010153711\t48048.0\n9982\t-83.02770699999999\t42.480303\tCenter Line city\tMI\tMichigan\tMacomb County\t8336\t42.3\t8.0\t18.8\t25267\t93777\t0.5148\t48015\tObama\t48015\t0.021155045\t48015.0\n9983\t-82.739859\t42.690504\tNew Baltimore city\tMI\tMichigan\tMacomb County\t11407\t35.9\t27.6\t13.1\t35345\t135053\t0.5148\t48047\tObama\t48047\t0.028948607999999997\t48047.0\n9984\t-82.730651\t42.809293\tRichmond city\tMI\tMichigan\tMacomb County\t5335\t38.4\t17.2\t16.8\t27494\t100833\t0.5148\t48062\tObama\t48062\t0.013539127\t48062.0\n9985\t-83.003691\t42.80502\tRomeo village\tMI\tMichigan\tMacomb County\t3712\t38.1\t27.9\t18.7\t28926\t112455\t0.5148\t48065\tObama\t48065\t0.009420289\t48065.0\n9986\t-82.94963\t42.538788000000004\tFraser city\tMI\tMichigan\tMacomb County\t15340\t41.4\t17.9\t15.5\t28531\t123338\t0.5148\t48026\tObama\t48026\t0.038929749\t48026.0\n9987\t-82.936877\t42.507443\tRoseville city\tMI\tMichigan\tMacomb County\t46706\t39.3\t9.2\t20.8\t25307\t88213\t0.5148\t48066\tObama\t48066\t0.118530174\t48066.0\n9988\t-82.89615400000001\t42.49237\tSt. Clair Shores city\tMI\tMichigan\tMacomb County\t61858\t45.5\t21.9\t17.9\t29663\t108469\t0.5148\t48081\tObama\t48081\t0.156982818\t48081.0\n9989\t-82.768803\t42.900155\tMemphis city\tMI\tMichigan\tMacomb County\t1216\t39.1\t17.0\t16.3\t25694\t126059\t0.5148\t48041\tObama\t48041\t0.0030859570000000003\t48041.0\n9990\t-83.02221899999999\t42.628864\tUtica city\tMI\tMichigan\tMacomb County\t4877\t39.6\t22.2\t16.9\t27936\t122514\t0.5148\t48317\tObama\t48317\t0.012376818000000001\t48317.0\n9991\t-82.830486\t42.591336\tHarrison CDP\tMI\tMichigan\tMacomb County\t25152\t40.8\t23.5\t15.8\t35139\t123445\t0.5148\t48045\tObama\t48045\t0.063830577\t48045.0\n9992\t-86.324511\t44.244144\tManistee city\tMI\tMichigan\tManistee County\t6345\t42.4\t21.2\t12.8\t20087\t76319\t0.5219\t49626\tObama\t49626\t0.016102298\t49626.0\n9993\t-86.29372099999999\t44.244836\tEastlake village\tMI\tMichigan\tManistee County\t438\t45.1\t9.0\t12.6\t19961\t73214\t0.5219\t49626\tObama\t49626\t0.001111553\t49626.0\n9994\t-85.923986\t44.480602000000005\tCopemish village\tMI\tMichigan\tManistee County\t241\t39.8\t7.9\t13.6\t17329\t79444\t0.5219\t49625\tObama\t49625\t0.000611608\t49625.0\n9995\t-86.14551800000001\t44.420224\tBear Lake village\tMI\tMichigan\tManistee County\t339\t48.2\t21.0\t12.1\t21309\t100568\t0.5219\t49614\tObama\t49614\t0.000860312\t49614.0\n9996\t-86.013636\t44.372246999999994\tKaleva village\tMI\tMichigan\tManistee County\t481\t41.0\t10.1\t13.8\t19411\t68542\t0.5219\t49645\tObama\t49645\t0.001220679\t49645.0\n9997\t-86.20241899999999\t44.365621000000004\tOnekama village\tMI\tMichigan\tManistee County\t687\t47.5\t33.0\t17.3\t26025\t116016\t0.5219\t49675\tObama\t49675\t0.001743464\t49675.0\n9998\t-87.441498\t46.556624\tTrowbridge Park CDP\tMI\tMichigan\tMarquette County\t2063\t43.1\t26.9\t8.7\t22786\t103646\t0.5627\t49855\tObama\t49855\t0.005235468\t49855.0\n9999\t-87.717252\t46.488318\tWest Ishpeming CDP\tMI\tMichigan\tMarquette County\t2801\t45.7\t21.6\t10.6\t22057\t86343\t0.5627\t49849\tObama\t49849\t0.007108359\t49849.0\n10000\t-87.992806\t46.395672999999995\tRepublic CDP\tMI\tMichigan\tMarquette County\t572\t52.2\t9.7\t12.7\t16748\t60000\t0.5627\t49879\tObama\t49879\t0.0014516179999999998\t49879.0\n10001\t-87.436874\t46.291323\tGwinn CDP\tMI\tMichigan\tMarquette County\t1842\t46.6\t16.6\t14.3\t20660\t67113\t0.5627\t49841\tObama\t49841\t0.004674615\t49841.0\n10002\t-87.386354\t46.346599\tK. I. Sawyer AFB CDP\tMI\tMichigan\tMarquette County\t2556\t23.5\t15.9\t14.4\t13731\t0\t0.5627\t49841\tObama\t49841\t0.0064866\t49841.0\n10003\t-87.66581500000001\t46.48611\tIshpeming city\tMI\tMichigan\tMarquette County\t6183\t41.0\t18.9\t13.5\t20517\t63734\t0.5627\t49849\tObama\t49849\t0.015691176\t49849.0\n10004\t-87.351167\t46.488284\tHarvey CDP\tMI\tMichigan\tMarquette County\t1396\t41.9\t31.6\t11.0\t22817\t115647\t0.5627\t49855\tObama\t49855\t0.0035427590000000004\t49855.0\n10005\t-87.596577\t46.496604\tNegaunee city\tMI\tMichigan\tMarquette County\t4414\t42.9\t22.0\t6.9\t20387\t76954\t0.5627\t49866\tObama\t49866\t0.01120182\t49866.0\n10006\t-87.69953100000001\t46.814823\tBig Bay CDP\tMI\tMichigan\tMarquette County\t255\t48.0\t26.2\t18.8\t22921\t95000\t0.5627\t49808\tObama\t49808\t0.000647137\t49808.0\n10007\t-87.40788\t46.543863\tMarquette city\tMI\tMichigan\tMarquette County\t21162\t32.0\t39.1\t11.8\t21428\t105076\t0.5627\t49855\tObama\t49855\t0.053704782\t49855.0\n10008\t-88.062601\t46.533499\tMichigamme CDP\tMI\tMichigan\tMarquette County\t270\t51.9\t18.1\t8.1\t20503\t53333\t0.5627\t49861\tObama\t49861\t0.0006852039999999999\t49861.0\n10009\t-87.581653\t46.443557\tPalmer CDP\tMI\tMichigan\tMarquette County\t436\t48.1\t8.9\t12.9\t17145\t52727\t0.5627\t49871\tObama\t49871\t0.001106478\t49871.0\n10010\t-86.280141\t43.950382\tScottville city\tMI\tMichigan\tMason County\t1265\t40.3\t17.1\t15.9\t18583\t92571\t0.4695\t49454\tObama\t49454\t0.003210309\t49454.0\n10011\t-86.443218\t43.956711\tLudington city\tMI\tMichigan\tMason County\t8174\t40.1\t20.6\t15.5\t20151\t89407\t0.4695\t49431\tObama\t49431\t0.020743921999999998\t49431.0\n10012\t-86.218089\t43.950497999999996\tCuster village\tMI\tMichigan\tMason County\t329\t44.3\t13.9\t13.5\t18388\t95625\t0.4695\t49405\tObama\t49405\t0.000834934\t49405.0\n10013\t-86.18116500000001\t44.048181\tFountain village\tMI\tMichigan\tMason County\t176\t47.8\t10.0\t12.6\t20068\t100000\t0.4695\t49410\tObama\t49410\t0.00044665199999999996\t49410.0\n10014\t-86.211261\t44.107082\tFree Soil village\tMI\tMichigan\tMason County\t180\t43.6\t12.5\t18.2\t17980\t94167\t0.4695\t49411\tObama\t49411\t0.00045680300000000004\t49411.0\n10015\t-85.143618\t43.750609999999995\tBarryton village\tMI\tMichigan\tMecosta County\t372\t42.1\t11.6\t18.6\t17157\t73750\t0.4443\t49305\tObama\t49305\t0.0009440589999999999\t49305.0\n10016\t-85.446282\t43.491085\tMorley village\tMI\tMichigan\tMecosta County\t524\t33.2\t7.6\t13.7\t16174\t80000\t0.4443\t49336\tObama\t49336\t0.001329804\t49336.0\n10017\t-85.447962\t43.580331\tStanwood village\tMI\tMichigan\tMecosta County\t227\t32.9\t15.4\t19.4\t18075\t93571\t0.4443\t49346\tObama\t49346\t0.0005760790000000001\t49346.0\n10018\t-85.29725400000001\t43.579021000000004\tCanadian Lakes CDP\tMI\tMichigan\tMecosta County\t2451\t59.1\t29.3\t14.6\t31086\t150852\t0.4443\t49332\tObama\t49332\t0.006220130999999999\t49332.0\n10019\t-85.230463\t43.62103\tMecosta village\tMI\tMichigan\tMecosta County\t444\t36.4\t10.6\t17.7\t14807\t77222\t0.4443\t49332\tObama\t49332\t0.00112678\t49332.0\n10020\t-85.47999\t43.699478000000006\tBig Rapids city\tMI\tMichigan\tMecosta County\t10573\t23.7\t35.7\t23.0\t16060\t94336\t0.4443\t49307\tObama\t49307\t0.026832087999999997\t49307.0\n10021\t-87.60906999999999\t45.413652\tStephenson city\tMI\tMichigan\tMenominee County\t874\t47.6\t10.2\t13.5\t18672\t75658\t0.4799\t49887\tObama\t49887\t0.002218031\t49887.0\n10022\t-87.623235\t45.122169\tMenominee city\tMI\tMichigan\tMenominee County\t8430\t41.5\t13.3\t11.3\t20589\t59894\t0.4799\t49858\tObama\t49858\t0.021393597\t49858.0\n10023\t-87.526715\t45.687585999999996\tPowers village\tMI\tMichigan\tMenominee County\t432\t47.4\t7.2\t11.3\t16956\t65000\t0.4799\t49874\tObama\t49874\t0.001096327\t49874.0\n10024\t-87.60429599999999\t45.461895\tDaggett village\tMI\tMichigan\tMenominee County\t260\t44.8\t9.7\t9.2\t19002\t73750\t0.4799\t49887\tObama\t49887\t0.0006598260000000001\t49887.0\n10025\t-87.55099200000001\t45.590752\tCarney village\tMI\tMichigan\tMenominee County\t226\t43.9\t10.6\t12.6\t18891\t72143\t0.4799\t49863\tObama\t49863\t0.000573541\t49863.0\n10026\t-84.587396\t43.757991\tColeman city\tMI\tMichigan\tMidland County\t1359\t35.2\t10.2\t18.5\t19088\t74750\t0.4179\t48618\tObama\t48618\t0.0034488609999999997\t48618.0\n10027\t-84.380179\t43.677477\tSanford village\tMI\tMichigan\tMidland County\t931\t41.9\t26.2\t18.1\t21092\t109964\t0.4179\t48657\tObama\t48657\t0.002362686\t48657.0\n10028\t-84.161489\t43.622702000000004\tMidland city\tMI\tMichigan\tMidland County\t41112\t38.5\t46.8\t10.1\t31422\t129607\t0.4179\t48642\tObama\t48642\t0.10433375800000001\t48642.0\n10029\t-85.208489\t44.329715\tLake City\tMI\tMichigan\tMissaukee County\t894\t41.4\t21.7\t22.9\t19023\t86538\t0.3236\t49651\tObama\t49651\t0.002268787\t49651.0\n10030\t-85.219761\t44.195919\tMcBain city\tMI\tMichigan\tMissaukee County\t591\t40.1\t14.5\t16.3\t18633\t97895\t0.3236\t49657\tObama\t49657\t0.001499836\t49657.0\n10031\t-83.328981\t41.931754\tDetroit Beach CDP\tMI\tMichigan\tMonroe County\t2302\t37.3\t7.1\t12.9\t25773\t106250\t0.4984\t48162\tObama\t48162\t0.005842\t48162.0\n10032\t-83.41789399999999\t41.893034\tSouth Monroe CDP\tMI\tMichigan\tMonroe County\t6530\t38.4\t15.7\t13.0\t26412\t88393\t0.4984\t48161\tObama\t48161\t0.01657179\t48161.0\n10033\t-83.273247\t41.945039\tStony Point CDP\tMI\tMichigan\tMonroe County\t1923\t36.4\t11.3\t18.8\t25527\t118750\t0.4984\t48166\tObama\t48166\t0.004880177\t48166.0\n10034\t-83.575455\t41.765303\tTemperance CDP\tMI\tMichigan\tMonroe County\t9033\t41.8\t25.4\t14.5\t29722\t145975\t0.4984\t48182\tObama\t48182\t0.022923887\t48182.0\n10035\t-83.313967\t41.941926\tWoodland Beach CDP\tMI\tMichigan\tMonroe County\t2118\t37.1\t10.7\t13.5\t23251\t105357\t0.4984\t48166\tObama\t48166\t0.005375046\t48166.0\n10036\t-83.446345\t41.808324\tLuna Pier city\tMI\tMichigan\tMonroe County\t1591\t37.9\t10.0\t24.6\t22663\t95769\t0.4984\t48157\tObama\t48157\t0.004037629\t48157.0\n10037\t-83.625015\t41.750271999999995\tLambertville CDP\tMI\tMichigan\tMonroe County\t10028\t41.8\t26.6\t13.1\t28784\t142159\t0.4984\t48144\tObama\t48144\t0.025448991\t48144.0\n10038\t-83.2356\t41.987038\tEstral Beach village\tMI\tMichigan\tMonroe County\t540\t43.1\t9.9\t21.7\t29951\t118103\t0.4984\t48166\tObama\t48166\t0.0013704079999999998\t48166.0\n10039\t-83.431732\t41.914311\tWest Monroe CDP\tMI\tMichigan\tMonroe County\t3819\t34.2\t11.1\t21.6\t22627\t30000\t0.4984\t48161\tObama\t48161\t0.009691833\t48161.0\n10040\t-83.25955400000001\t42.061437\tSouth Rockwood village\tMI\tMichigan\tMonroe County\t1771\t38.1\t9.1\t14.6\t25653\t118207\t0.4984\t48179\tObama\t48179\t0.0044944320000000005\t48179.0\n10041\t-83.662345\t41.962672\tDundee village\tMI\tMichigan\tMonroe County\t3680\t32.6\t19.6\t16.5\t22664\t94400\t0.4984\t48131\tObama\t48131\t0.009339079\t48131.0\n10042\t-83.713422\t41.899133\tPetersburg city\tMI\tMichigan\tMonroe County\t1321\t34.3\t14.4\t19.5\t25770\t99068\t0.4984\t49270\tObama\t49270\t0.003352425\t49270.0\n10043\t-83.386034\t41.916179\tMonroe city\tMI\tMichigan\tMonroe County\t21894\t36.3\t19.4\t16.7\t23255\t109381\t0.4984\t48162\tObama\t48162\t0.055562445999999995\t48162.0\n10044\t-83.389779\t42.056996000000005\tCarleton village\tMI\tMichigan\tMonroe County\t2626\t35.4\t7.7\t17.0\t24877\t40385\t0.4984\t48117\tObama\t48117\t0.006664245\t48117.0\n10045\t-83.51657900000001\t42.00647\tMaybee village\tMI\tMichigan\tMonroe County\t569\t36.6\t5.9\t24.1\t23428\t115000\t0.4984\t48159\tObama\t48159\t0.001444004\t48159.0\n10046\t-85.04431\t43.352087\tMcBride village\tMI\tMichigan\tMontcalm County\t228\t39.7\t10.9\t20.4\t16377\t88125\t0.4495\t48852\tObama\t48852\t0.000578617\t48852.0\n10047\t-85.254201\t43.178470000000004\tGreenville city\tMI\tMichigan\tMontcalm County\t7982\t36.5\t16.4\t21.5\t19674\t101098\t0.4495\t48838\tObama\t48838\t0.020256666\t48838.0\n10048\t-85.273327\t43.443382\tLakeview village\tMI\tMichigan\tMontcalm County\t1118\t36.3\t13.5\t24.2\t16416\t92600\t0.4495\t48850\tObama\t48850\t0.002837253\t48850.0\n10049\t-84.84693100000001\t43.178934000000005\tCarson City\tMI\tMichigan\tMontcalm County\t1227\t34.5\t12.1\t18.1\t18153\t90833\t0.4495\t48811\tObama\t48811\t0.003113872\t48811.0\n10050\t-85.073837\t43.209996000000004\tSheridan village\tMI\tMichigan\tMontcalm County\t696\t38.5\t11.6\t18.1\t17810\t98158\t0.4495\t48884\tObama\t48884\t0.001766304\t48884.0\n10051\t-85.078665\t43.292842\tStanton city\tMI\tMichigan\tMontcalm County\t1502\t34.7\t11.5\t28.3\t18302\t84483\t0.4495\t48888\tObama\t48888\t0.003811766\t48888.0\n10052\t-85.467023\t43.394781\tHoward City village\tMI\tMichigan\tMontcalm County\t1839\t33.5\t12.6\t12.6\t18675\t101625\t0.4495\t49329\tObama\t49329\t0.004667002\t49329.0\n10053\t-85.037828\t43.407365000000006\tEdmore village\tMI\tMichigan\tMontcalm County\t1328\t37.6\t14.6\t22.0\t16127\t90732\t0.4495\t48829\tObama\t48829\t0.0033701890000000004\t48829.0\n10054\t-85.497523\t43.319863\tPierson village\tMI\tMichigan\tMontcalm County\t197\t35.3\t13.0\t21.6\t19671\t127083\t0.4495\t49339\tObama\t49339\t0.000499945\t49339.0\n10055\t-83.898801\t45.064299\tHillman village\tMI\tMichigan\tMontmorency County\t678\t48.3\t7.6\t21.6\t17238\t73889\t0.4057\t49746\tObama\t49746\t0.001720624\t49746.0\n10056\t-84.19979599999999\t45.155918\tCanada Creek Ranch CDP\tMI\tMichigan\tMontmorency County\t399\t62.9\t22.2\t24.5\t22534\t98043\t0.4057\t49709\tObama\t49709\t0.00101258\t49709.0\n10057\t-84.330975\t44.871717\tLewiston CDP\tMI\tMichigan\tMontmorency County\t942\t57.4\t8.9\t19.1\t21238\t75660\t0.4057\t49756\tObama\t49756\t0.002390601\t49756.0\n10058\t-84.156894\t45.002212\tAtlanta CDP\tMI\tMichigan\tMontmorency County\t739\t46.5\t8.4\t21.4\t18066\t67292\t0.4057\t49709\tObama\t49709\t0.0018754289999999999\t49709.0\n10059\t-86.24205500000001\t43.202022\tMuskegon Heights city\tMI\tMichigan\tMuskegon County\t11846\t29.5\t5.8\t31.4\t14042\t49356\t0.5834\t49444\tObama\t49444\t0.030062699\t49444.0\n10060\t-86.256398\t43.375972999999995\tLakewood Club village\tMI\tMichigan\tMuskegon County\t1254\t35.4\t8.5\t16.6\t19805\t73750\t0.5834\t49457\tObama\t49457\t0.003182393\t49457.0\n10061\t-86.180378\t43.36935\tTwin Lake CDP\tMI\tMichigan\tMuskegon County\t1719\t40.7\t16.6\t10.2\t21588\t140407\t0.5834\t49457\tObama\t49457\t0.004362467\t49457.0\n10062\t-86.341476\t43.400609\tWhitehall city\tMI\tMichigan\tMuskegon County\t2919\t41.7\t22.0\t14.1\t23740\t115313\t0.5834\t49461\tObama\t49461\t0.007407819\t49461.0\n10063\t-86.107206\t43.244960999999996\tWolf Lake CDP\tMI\tMichigan\tMuskegon County\t4422\t34.7\t10.2\t14.1\t19540\t70201\t0.5834\t49442\tObama\t49442\t0.011222122\t49442.0\n10064\t-86.271524\t43.250852\tNorth Muskegon city\tMI\tMichigan\tMuskegon County\t4110\t46.7\t39.5\t11.4\t28513\t150229\t0.5834\t49440\tObama\t49440\t0.01043033\t49440.0\n10065\t-86.256139\t43.227569\tMuskegon city\tMI\tMichigan\tMuskegon County\t40194\t33.7\t10.6\t21.6\t17479\t69754\t0.5834\t49440\tObama\t49440\t0.102004064\t49440.0\n10066\t-86.363192\t43.412844\tMontague city\tMI\tMichigan\tMuskegon County\t2482\t40.2\t21.7\t18.7\t24293\t110443\t0.5834\t49437\tObama\t49437\t0.006298803\t49437.0\n10067\t-86.251799\t43.161788\tNorton Shores city\tMI\tMichigan\tMuskegon County\t23970\t43.4\t27.8\t16.1\t25356\t118079\t0.5834\t49441\tObama\t49441\t0.060830905\t49441.0\n10068\t-85.941588\t43.188906\tRavenna village\tMI\tMichigan\tMuskegon County\t1216\t37.2\t17.5\t12.7\t19670\t113474\t0.5834\t49451\tObama\t49451\t0.0030859570000000003\t49451.0\n10069\t-86.273138\t43.197552\tRoosevelt Park city\tMI\tMichigan\tMuskegon County\t3876\t44.3\t29.9\t10.6\t22819\t114746\t0.5834\t49441\tObama\t49441\t0.009836487\t49441.0\n10070\t-86.15606700000001\t43.12494\tFruitport village\tMI\tMichigan\tMuskegon County\t1257\t41.9\t23.2\t11.8\t26044\t139407\t0.5834\t49415\tObama\t49415\t0.0031900059999999996\t49415.0\n10071\t-85.809569\t43.33467\tGrant city\tMI\tMichigan\tNewaygo County\t941\t33.3\t12.7\t15.2\t16831\t100872\t0.4064\t49327\tObama\t49327\t0.0023880629999999997\t49327.0\n10072\t-85.772149\t43.553934999999996\tWhite Cloud city\tMI\tMichigan\tNewaygo County\t1490\t35.1\t11.2\t22.5\t16161\t73750\t0.4064\t49349\tObama\t49349\t0.003781312\t49349.0\n10073\t-85.801627\t43.417307\tNewaygo city\tMI\tMichigan\tNewaygo County\t1893\t36.0\t12.9\t13.6\t20139\t86733\t0.4064\t49337\tObama\t49337\t0.004804043\t49337.0\n10074\t-85.953391\t43.463395\tFremont city\tMI\tMichigan\tNewaygo County\t4228\t37.4\t27.2\t16.6\t20697\t93972\t0.4064\t49412\tObama\t49412\t0.01072979\t49412.0\n10075\t-83.37710600000001\t42.486036999999996\tFarmington Hills city\tMI\tMichigan\tOakland County\t81382\t41.3\t52.9\t12.5\t44117\t187757\t0.5356\t48335\tObama\t48335\t0.206530694\t48335.0\n10076\t-83.38698199999999\t42.660256\tWaterford CDP\tMI\tMichigan\tOakland County\t72499\t37.9\t27.7\t15.2\t33626\t116719\t0.5356\t48327\tObama\t48327\t0.183987476\t48327.0\n10077\t-83.277754\t42.517501\tBingham Farms village\tMI\tMichigan\tOakland County\t1006\t55.0\t74.4\t13.0\t91149\t363265\t0.5356\t48025\tObama\t48025\t0.00255302\t48025.0\n10078\t-83.142981\t42.864988000000004\tLeonard village\tMI\tMichigan\tOakland County\t330\t41.4\t28.9\t10.1\t36809\t150000\t0.5356\t48367\tObama\t48367\t0.000837472\t48367.0\n10079\t-83.242316\t42.522033\tBeverly Hills village\tMI\tMichigan\tOakland County\t10279\t46.1\t67.6\t7.8\t50070\t235249\t0.5356\t48025\tObama\t48025\t0.026085977000000003\t48025.0\n10080\t-83.273816\t42.576173\tBloomfield Township CDP\tMI\tMichigan\tOakland County\t42138\t48.6\t70.2\t11.9\t69648\t290736\t0.5356\t48302\tObama\t48302\t0.106937534\t48302.0\n10081\t-83.119629\t42.686612\tRochester city\tMI\tMichigan\tOakland County\t11965\t37.8\t58.4\t12.7\t51167\t161150\t0.5356\t48307\tObama\t48307\t0.030364697000000003\t48307.0\n10082\t-83.37558100000001\t42.585769\tOrchard Lake Village city\tMI\tMichigan\tOakland County\t2285\t46.4\t66.9\t6.2\t88203\t467308\t0.5356\t48323\tObama\t48323\t0.0057988580000000005\t48323.0\n10083\t-83.216212\t42.544784\tBirmingham city\tMI\tMichigan\tOakland County\t19144\t42.2\t71.0\t10.7\t68458\t232650\t0.5356\t48009\tObama\t48009\t0.048583515\t48009.0\n10084\t-83.131345\t42.459291\tFerndale city\tMI\tMichigan\tOakland County\t21564\t36.4\t30.6\t13.9\t30747\t88851\t0.5356\t48220\tObama\t48220\t0.054724975\t48220.0\n10085\t-83.478626\t42.537836999999996\tWalled Lake city\tMI\tMichigan\tOakland County\t7437\t40.2\t31.6\t16.1\t30036\t96264\t0.5356\t48390\tObama\t48390\t0.018873569\t48390.0\n10086\t-83.601016\t42.587246\tMilford village\tMI\tMichigan\tOakland County\t6793\t37.6\t34.0\t12.2\t34702\t127495\t0.5356\t48381\tObama\t48381\t0.01723923\t48381.0\n10087\t-83.168559\t42.481551\tHuntington Woods city\tMI\tMichigan\tOakland County\t6011\t43.4\t76.4\t8.0\t51929\t220009\t0.5356\t48070\tObama\t48070\t0.015254675\t48070.0\n10088\t-83.442495\t42.850828\tOrtonville village\tMI\tMichigan\tOakland County\t1526\t38.2\t24.7\t17.1\t29374\t140086\t0.5356\t48462\tObama\t48462\t0.003872673\t48462.0\n10089\t-83.489163\t42.478532\tNovi city\tMI\tMichigan\tOakland County\t54138\t36.9\t53.3\t10.3\t47910\t174823\t0.5356\t48374\tObama\t48374\t0.137391053\t48374.0\n10090\t-83.421013\t42.7343\tVillage of Clarkston city\tMI\tMichigan\tOakland County\t927\t41.8\t43.9\t12.8\t38868\t151974\t0.5356\t48346\tObama\t48346\t0.002352534\t48346.0\n10091\t-83.150418\t42.536674\tClawson city\tMI\tMichigan\tOakland County\t12297\t40.9\t30.0\t11.1\t30233\t125597\t0.5356\t48017\tObama\t48017\t0.031207244\t48017.0\n10092\t-83.14441500000001\t42.471340999999995\tPleasant Ridge city\tMI\tMichigan\tOakland County\t2528\t44.2\t71.0\t8.9\t48676\t192876\t0.5356\t48069\tObama\t48069\t0.006415540999999999\t48069.0\n10093\t-83.14574\t42.581742999999996\tTroy city\tMI\tMichigan\tOakland County\t80876\t41.2\t54.9\t13.1\t44867\t185418\t0.5356\t48098\tObama\t48098\t0.20524657\t48098.0\n10094\t-83.344338\t42.608651\tKeego Harbor city\tMI\tMichigan\tOakland County\t2755\t36.0\t27.7\t13.1\t32202\t90909\t0.5356\t48320\tObama\t48320\t0.006991621\t48320.0\n10095\t-83.245202\t42.782744\tLake Orion village\tMI\tMichigan\tOakland County\t2834\t41.0\t33.9\t16.5\t37550\t123529\t0.5356\t48362\tObama\t48362\t0.007192106\t48362.0\n10096\t-83.321528\t42.692099\tLake Angelus city\tMI\tMichigan\tOakland County\t420\t51.8\t67.1\t10.1\t118654\t679688\t0.5356\t48340\tObama\t48340\t0.001065873\t48340.0\n10097\t-83.488247\t42.555104\tWolverine Lake village\tMI\tMichigan\tOakland County\t4267\t42.0\t27.2\t8.0\t35230\t135705\t0.5356\t48390\tObama\t48390\t0.010828764\t48390.0\n10098\t-83.302938\t42.518783\tFranklin village\tMI\tMichigan\tOakland County\t2986\t45.6\t75.5\t8.5\t82783\t350289\t0.5356\t48301\tObama\t48301\t0.007577851\t48301.0\n10099\t-83.245613\t42.578028\tBloomfield Hills city\tMI\tMichigan\tOakland County\t3765\t55.6\t71.8\t9.4\t106611\t669643\t0.5356\t48304\tObama\t48304\t0.009554792\t48304.0\n10100\t-83.22734399999999\t42.492094\tLathrup Village city\tMI\tMichigan\tOakland County\t4159\t44.4\t57.1\t13.2\t43155\t170602\t0.5356\t48076\tObama\t48076\t0.010554682\t48076.0\n10101\t-83.097711\t42.461988\tHazel Park city\tMI\tMichigan\tOakland County\t18192\t35.4\t10.0\t24.7\t23214\t72795\t0.5356\t48030\tObama\t48030\t0.046167535999999995\t48030.0\n10102\t-83.287809\t42.649451\tPontiac city\tMI\tMichigan\tOakland County\t66925\t31.6\t12.9\t25.7\t20008\t67776\t0.5356\t48342\tObama\t48342\t0.169841816\t48342.0\n10103\t-83.383447\t42.568825\tWest Bloomfield Township CDP\tMI\tMichigan\tOakland County\t66003\t43.0\t60.4\t11.0\t54273\t214639\t0.5356\t48323\tObama\t48323\t0.167501971\t48323.0\n10104\t-83.244915\t42.673666\tAuburn Hills city\tMI\tMichigan\tOakland County\t20896\t32.6\t38.9\t12.7\t33353\t87925\t0.5356\t48326\tObama\t48326\t0.053029729000000005\t48326.0\n10105\t-83.534566\t42.524091\tWixom city\tMI\tMichigan\tOakland County\t13932\t31.1\t42.4\t11.1\t34063\t164087\t0.5356\t48393\tObama\t48393\t0.035356536\t48393.0\n10106\t-83.378299\t42.461275\tFarmington city\tMI\tMichigan\tOakland County\t10748\t43.5\t53.5\t9.2\t40531\t151577\t0.5356\t48335\tObama\t48335\t0.027276202000000003\t48335.0\n10107\t-83.156447\t42.66441\tRochester Hills city\tMI\tMichigan\tOakland County\t70978\t40.7\t51.5\t10.0\t43237\t174692\t0.5356\t48309\tObama\t48309\t0.180127492\t48309.0\n10108\t-83.153938\t42.508305\tRoyal Oak city\tMI\tMichigan\tOakland County\t58815\t40.3\t44.6\t10.8\t37773\t127124\t0.5356\t48073\tObama\t48073\t0.149260313\t48073.0\n10109\t-83.33299699999999\t42.616908\tSylvan Lake city\tMI\tMichigan\tOakland County\t1710\t44.2\t59.0\t10.3\t56095\t151290\t0.5356\t48320\tObama\t48320\t0.004339627\t48320.0\n10110\t-83.256961\t42.822157000000004\tOxford village\tMI\tMichigan\tOakland County\t3499\t34.8\t33.4\t10.2\t31113\t143864\t0.5356\t48371\tObama\t48371\t0.008879739000000001\t48371.0\n10111\t-83.65204\t42.462621999999996\tSouth Lyon city\tMI\tMichigan\tOakland County\t10555\t36.7\t36.1\t13.2\t34135\t108145\t0.5356\t48178\tObama\t48178\t0.026786407999999998\t48178.0\n10112\t-83.26057\t42.476563\tSouthfield city\tMI\tMichigan\tOakland County\t78382\t40.9\t41.8\t16.1\t33695\t123873\t0.5356\t48034\tObama\t48034\t0.19891731399999998\t48034.0\n10113\t-83.18196800000001\t42.464546999999996\tOak Park city\tMI\tMichigan\tOakland County\t29134\t37.8\t32.0\t17.9\t26031\t98128\t0.5356\t48237\tObama\t48237\t0.07393607\t48237.0\n10114\t-83.103381\t42.507315999999996\tMadison Heights city\tMI\tMichigan\tOakland County\t30691\t39.3\t22.3\t14.8\t27909\t92280\t0.5356\t48071\tObama\t48071\t0.077887414\t48071.0\n10115\t-83.185455\t42.498564\tBerkley city\tMI\tMichigan\tOakland County\t15167\t38.3\t40.3\t11.0\t33256\t125742\t0.5356\t48072\tObama\t48072\t0.038490711000000004\t48072.0\n10116\t-83.623325\t42.799217999999996\tHolly village\tMI\tMichigan\tOakland County\t5918\t35.1\t14.4\t16.2\t26659\t83285\t0.5356\t48442\tObama\t48442\t0.015018661\t48442.0\n10117\t-86.126294\t43.714007\tWalkerville village\tMI\tMichigan\tOceana County\t258\t32.9\t5.1\t19.4\t14907\t77500\t0.4422\t49459\tObama\t49459\t0.000654751\t49459.0\n10118\t-86.347523\t43.507459000000004\tRothbury village\tMI\tMichigan\tOceana County\t419\t34.8\t7.7\t17.8\t16792\t90500\t0.4422\t49446\tObama\t49446\t0.001063335\t49446.0\n10119\t-86.364991\t43.611579\tShelby village\tMI\tMichigan\tOceana County\t1890\t35.8\t16.2\t14.3\t18333\t83137\t0.4422\t49455\tObama\t49455\t0.0047964290000000005\t49455.0\n10120\t-86.03535500000001\t43.569613000000004\tHesperia village\tMI\tMichigan\tOceana County\t955\t37.3\t11.7\t18.3\t17739\t87833\t0.4422\t49421\tObama\t49421\t0.002423593\t49421.0\n10121\t-86.36926899999999\t43.694994\tHart city\tMI\tMichigan\tOceana County\t1966\t35.7\t14.8\t18.0\t15830\t83365\t0.4422\t49420\tObama\t49420\t0.004989302\t49420.0\n10122\t-86.43025\t43.779913\tPentwater village\tMI\tMichigan\tOceana County\t923\t58.9\t35.7\t15.1\t25196\t154348\t0.4422\t49449\tObama\t49449\t0.002342383\t49449.0\n10123\t-86.34768000000001\t43.559294\tNew Era village\tMI\tMichigan\tOceana County\t490\t39.1\t18.1\t14.1\t19699\t93000\t0.4422\t49455\tObama\t49455\t0.001243519\t49455.0\n10124\t-84.23563299999999\t44.274285\tWest Branch city\tMI\tMichigan\tOgemaw County\t1931\t39.4\t21.2\t16.3\t21032\t71883\t0.4624\t48661\tObama\t48661\t0.004900479\t48661.0\n10125\t-83.932281\t44.191503999999995\tPrescott village\tMI\tMichigan\tOgemaw County\t268\t46.0\t5.7\t18.1\t16576\t57500\t0.4624\t48756\tObama\t48756\t0.0006801289999999999\t48756.0\n10126\t-84.046746\t44.191895\tSkidway Lake CDP\tMI\tMichigan\tOgemaw County\t2870\t46.3\t3.0\t21.2\t15563\t49292\t0.4624\t48756\tObama\t48756\t0.007283466999999999\t48756.0\n10127\t-84.115945\t44.420891\tRose City\tMI\tMichigan\tOgemaw County\t692\t43.4\t8.0\t12.3\t15377\t66316\t0.4624\t48654\tObama\t48654\t0.0017561529999999999\t48654.0\n10128\t-89.31224499999999\t46.866501\tOntonagon village\tMI\tMichigan\tOntonagon County\t1497\t50.6\t19.7\t14.0\t19682\t48841\t0.4481\t49953\tObama\t49953\t0.003799077\t49953.0\n10129\t-85.442013\t43.851335\tHersey village\tMI\tMichigan\tOsceola County\t376\t39.6\t15.2\t15.8\t21118\t79000\t0.3873\t49639\tObama\t49639\t0.00095421\t49639.0\n10130\t-85.453597\t44.038115999999995\tLe Roy village\tMI\tMichigan\tOsceola County\t267\t37.8\t13.5\t15.7\t17376\t76923\t0.3873\t49655\tObama\t49655\t0.0006775910000000001\t49655.0\n10131\t-85.458786\t44.100733\tTustin village\tMI\tMichigan\tOsceola County\t229\t38.5\t12.4\t21.2\t17942\t77857\t0.3873\t49688\tObama\t49688\t0.000581155\t49688.0\n10132\t-85.507581\t43.871491\tReed City\tMI\tMichigan\tOsceola County\t2300\t37.9\t21.0\t20.8\t19476\t77214\t0.3873\t49677\tObama\t49677\t0.005836925\t49677.0\n10133\t-85.14309399999999\t44.10055\tMarion village\tMI\tMichigan\tOsceola County\t847\t41.9\t10.9\t18.4\t17828\t70667\t0.3873\t49665\tObama\t49665\t0.002149511\t49665.0\n10134\t-85.273873\t43.901146000000004\tEvart city\tMI\tMichigan\tOsceola County\t1701\t36.6\t11.0\t19.6\t16364\t69151\t0.3873\t49631\tObama\t49631\t0.0043167859999999995\t49631.0\n10135\t-84.14228299999999\t44.663445\tMio CDP\tMI\tMichigan\tOscoda County\t1794\t45.9\t10.9\t20.8\t18230\t64855\t0.4099\t48647\tObama\t48647\t0.0045528009999999995\t48647.0\n10136\t-84.664014\t45.143263\tVanderbilt village\tMI\tMichigan\tOtsego County\t616\t40.7\t9.5\t21.1\t17567\t98000\t0.3956\t49795\tObama\t49795\t0.0015632810000000001\t49795.0\n10137\t-84.67641400000001\t45.021108\tGaylord city\tMI\tMichigan\tOtsego County\t3687\t39.0\t21.2\t17.0\t22814\t111228\t0.3956\t49735\tObama\t49735\t0.009356844\t49735.0\n10138\t-86.22193\t43.085071\tFerrysburg city\tMI\tMichigan\tOttawa County\t3350\t44.5\t43.1\t16.7\t37951\t167788\t0.32299999999999995\t494HH\tObama\t494HH\t0.008501608\t0.0\n10139\t-86.01294\t42.813871\tZeeland city\tMI\tMichigan\tOttawa County\t5966\t35.0\t24.6\t10.1\t25218\t139274\t0.32299999999999995\t49464\tObama\t49464\t0.015140475\t49464.0\n10140\t-85.93435799999999\t43.065698\tCoopersville city\tMI\tMichigan\tOttawa County\t4147\t32.2\t17.7\t16.7\t22693\t120992\t0.32299999999999995\t49404\tObama\t49404\t0.010524229\t49404.0\n10141\t-85.826971\t42.906388\tJenison CDP\tMI\tMichigan\tOttawa County\t17317\t39.0\t25.8\t10.3\t26817\t149856\t0.32299999999999995\t49428\tObama\t49428\t0.043946966\t49428.0\n10142\t-85.950942\t42.985118\tAllendale CDP\tMI\tMichigan\tOttawa County\t14435\t23.1\t18.6\t14.6\t21584\t140259\t0.32299999999999995\t49401\tObama\t49401\t0.036633046\t49401.0\n10143\t-86.127738\t42.796085999999995\tBeechwood CDP\tMI\tMichigan\tOttawa County\t3000\t36.1\t26.4\t11.7\t27457\t144563\t0.32299999999999995\t49424\tObama\t49424\t0.00761338\t49424.0\n10144\t-85.862477\t42.864042\tHudsonville city\tMI\tMichigan\tOttawa County\t7725\t31.6\t24.4\t11.5\t23872\t133011\t0.32299999999999995\t49426\tObama\t49426\t0.019604453\t49426.0\n10145\t-86.09621800000001\t42.7823\tHolland city\tMI\tMichigan\tOttawa County\t36564\t29.8\t30.4\t16.8\t23108\t128416\t0.32299999999999995\t49423\tObama\t49423\t0.09279187400000001\t49423.0\n10146\t-86.219631\t43.055523\tGrand Haven city\tMI\tMichigan\tOttawa County\t11707\t41.5\t29.4\t17.6\t28424\t129834\t0.32299999999999995\t49417\tObama\t49417\t0.029709946\t49417.0\n10147\t-86.190914\t43.074631\tSpring Lake village\tMI\tMichigan\tOttawa County\t2476\t44.5\t34.6\t15.3\t28141\t135384\t0.32299999999999995\t49456\tObama\t49456\t0.006283576\t49456.0\n10148\t-84.060215\t45.334218\tMillersburg village\tMI\tMichigan\tPresque Isle County\t271\t49.8\t11.2\t23.6\t19078\t80556\t0.4508\t49759\tObama\t49759\t0.000687742\t49759.0\n10149\t-84.228008\t45.358752\tOnaway city\tMI\tMichigan\tPresque Isle County\t965\t36.2\t8.5\t23.8\t13879\t51500\t0.4508\t49765\tObama\t49765\t0.002448971\t49765.0\n10150\t-83.698829\t45.262190000000004\tPosen village\tMI\tMichigan\tPresque Isle County\t270\t44.7\t8.2\t18.2\t19269\t79167\t0.4508\t49776\tObama\t49776\t0.0006852039999999999\t49776.0\n10151\t-83.817975\t45.415039\tRogers City\tMI\tMichigan\tPresque Isle County\t3141\t47.1\t14.5\t16.2\t19380\t69841\t0.4508\t49779\tObama\t49779\t0.007971209\t49779.0\n10152\t-84.41346300000001\t44.357863\tSt. Helen CDP\tMI\tMichigan\tRoscommon County\t2831\t52.4\t7.3\t23.4\t19057\t61276\t0.4756\t48656\tObama\t48656\t0.007184493\t48656.0\n10153\t-84.591688\t44.491156\tRoscommon village\tMI\tMichigan\tRoscommon County\t1099\t45.0\t18.1\t15.9\t18460\t77353\t0.4756\t48653\tObama\t48653\t0.002789035\t48653.0\n10154\t-84.665211\t44.301512\tPrudenville CDP\tMI\tMichigan\tRoscommon County\t1776\t58.1\t12.3\t20.2\t22652\t97778\t0.4756\t48651\tObama\t48651\t0.004507120999999999\t48651.0\n10155\t-84.762375\t44.312406\tHoughton Lake CDP\tMI\tMichigan\tRoscommon County\t3698\t49.5\t9.6\t19.0\t19540\t80094\t0.4756\t48629\tObama\t48629\t0.00938476\t48629.0\n10156\t-84.112453\t43.519760999999995\tFreeland CDP\tMI\tMichigan\tSaginaw County\t5894\t36.8\t25.9\t12.2\t24133\t122630\t0.5546\t486HH\tObama\t486HH\t0.014957753999999998\t0.0\n10157\t-84.120023\t43.184733\tChesaning village\tMI\tMichigan\tSaginaw County\t2428\t41.7\t17.3\t13.4\t21138\t95227\t0.5546\t48616\tObama\t48616\t0.0061617619999999994\t48616.0\n10158\t-83.740726\t43.33214\tFrankenmuth city\tMI\tMichigan\tSaginaw County\t4730\t49.7\t34.0\t8.5\t29251\t153765\t0.5546\t48734\tObama\t48734\t0.012003762\t48734.0\n10159\t-84.23254200000001\t43.41791\tHemlock CDP\tMI\tMichigan\tSaginaw County\t1633\t36.5\t18.5\t11.8\t23287\t87672\t0.5546\t48626\tObama\t48626\t0.004144216\t48626.0\n10160\t-84.006408\t43.460072\tSaginaw Township North CDP\tMI\tMichigan\tSaginaw County\t25646\t43.4\t32.0\t12.5\t27814\t118690\t0.5546\t48603\tObama\t48603\t0.065084247\t48603.0\n10161\t-84.168033\t43.143176000000004\tOakley village\tMI\tMichigan\tSaginaw County\t323\t39.7\t7.2\t14.9\t18445\t87500\t0.5546\t48649\tObama\t48649\t0.0008197069999999999\t48649.0\n10162\t-83.837067\t43.461768\tRobin Glen-Indiantown CDP\tMI\tMichigan\tSaginaw County\t991\t33.8\t7.5\t11.8\t18913\t19912\t0.5546\t48724\tObama\t48724\t0.002514953\t48724.0\n10163\t-83.940241\t43.461665\tCarrollton CDP\tMI\tMichigan\tSaginaw County\t6514\t34.6\t13.2\t16.2\t21045\t69479\t0.5546\t48604\tObama\t48604\t0.016531186\t48604.0\n10164\t-83.882938\t43.370676\tBridgeport CDP\tMI\tMichigan\tSaginaw County\t7585\t39.4\t13.9\t15.6\t21390\t69898\t0.5546\t48722\tObama\t48722\t0.019249162\t48722.0\n10165\t-83.790752\t43.250234999999996\tBirch Run village\tMI\tMichigan\tSaginaw County\t1584\t37.4\t16.0\t14.9\t22386\t92407\t0.5546\t48415\tObama\t48415\t0.004019865\t48415.0\n10166\t-84.33469699999999\t43.409011\tMerrill village\tMI\tMichigan\tSaginaw County\t801\t42.0\t10.9\t12.3\t21323\t79000\t0.5546\t48637\tObama\t48637\t0.002032772\t48637.0\n10167\t-84.018741\t43.417125\tSaginaw Township South CDP\tMI\tMichigan\tSaginaw County\t12960\t45.0\t33.8\t12.2\t28980\t128625\t0.5546\t48603\tObama\t48603\t0.032889801\t48603.0\n10168\t-84.149199\t43.299224\tSt. Charles village\tMI\tMichigan\tSaginaw County\t2108\t36.0\t11.1\t17.3\t21029\t79643\t0.5546\t48655\tObama\t48655\t0.005349668\t48655.0\n10169\t-83.950019\t43.419315999999995\tSaginaw city\tMI\tMichigan\tSaginaw County\t56383\t32.0\t12.6\t25.0\t16468\t49620\t0.5546\t48607\tObama\t48607\t0.143088399\t48607.0\n10170\t-83.89924599999999\t43.419356\tBuena Vista CDP\tMI\tMichigan\tSaginaw County\t7417\t33.8\t9.4\t27.4\t17277\t38431\t0.5546\t48601\tObama\t48601\t0.018822813\t48601.0\n10171\t-83.922259\t43.480803\tZilwaukee city\tMI\tMichigan\tSaginaw County\t1762\t41.3\t10.9\t12.4\t23810\t73587\t0.5546\t48724\tObama\t48724\t0.004471592\t48724.0\n10172\t-84.07301899999999\t43.417527\tShields CDP\tMI\tMichigan\tSaginaw County\t6616\t44.4\t23.1\t12.6\t27477\t109216\t0.5546\t48609\tObama\t48609\t0.01679004\t48609.0\n10173\t-83.91017\t43.234770000000005\tBurt CDP\tMI\tMichigan\tSaginaw County\t1083\t36.4\t9.5\t15.3\t19983\t103697\t0.5546\t48417\tObama\t48417\t0.00274843\t48417.0\n10174\t-82.765249\t42.993432\tEmmett village\tMI\tMichigan\tSt. Clair County\t275\t35.4\t7.7\t23.4\t20832\t101250\t0.4581\t48022\tObama\t48022\t0.000697893\t48022.0\n10175\t-82.797388\t43.128114000000004\tYale city\tMI\tMichigan\tSt. Clair County\t2148\t34.4\t10.0\t21.7\t20547\t78732\t0.4581\t48097\tObama\t48097\t0.00545118\t48097.0\n10176\t-82.534438\t42.621716\tAlgonac city\tMI\tMichigan\tSt. Clair County\t4738\t39.1\t12.3\t20.0\t25838\t96757\t0.4581\t48001\tObama\t48001\t0.012024065\t48001.0\n10177\t-82.92674699999999\t43.009223\tCapac village\tMI\tMichigan\tSt. Clair County\t2044\t30.9\t12.7\t20.1\t20190\t93621\t0.4581\t48014\tObama\t48014\t0.0051872490000000005\t48014.0\n10178\t-82.594254\t42.627474\tPearl Beach CDP\tMI\tMichigan\tSt. Clair County\t3315\t48.9\t14.9\t16.7\t35575\t171839\t0.4581\t48001\tObama\t48001\t0.008412785\t48001.0\n10179\t-82.440021\t42.983981\tPort Huron city\tMI\tMichigan\tSt. Clair County\t33283\t35.3\t13.7\t22.8\t20459\t78941\t0.4581\t48060\tObama\t48060\t0.08446537400000001\t48060.0\n10180\t-82.50424699999999\t42.713749\tMarine City\tMI\tMichigan\tSt. Clair County\t4730\t36.7\t11.3\t18.0\t22416\t92262\t0.4581\t48039\tObama\t48039\t0.012003762\t48039.0\n10181\t-82.48249799999999\t42.910522\tMarysville city\tMI\tMichigan\tSt. Clair County\t10236\t42.7\t22.8\t14.8\t27289\t105282\t0.4581\t48040\tObama\t48040\t0.025976852\t48040.0\n10182\t-82.49573000000001\t42.824584\tSt. Clair city\tMI\tMichigan\tSt. Clair County\t6073\t38.2\t23.5\t17.3\t29637\t119846\t0.4581\t48079\tObama\t48079\t0.015412018999999999\t48079.0\n10183\t-85.527428\t41.922531\tCentreville village\tMI\tMichigan\tSt. Joseph County\t1572\t34.7\t11.8\t12.2\t18742\t97436\t0.4332\t49032\tObama\t49032\t0.003989411\t49032.0\n10184\t-85.321201\t41.84721\tBurr Oak village\tMI\tMichigan\tSt. Joseph County\t796\t36.4\t9.1\t14.1\t17452\t78864\t0.4332\t49030\tObama\t49030\t0.0020200829999999998\t49030.0\n10185\t-85.419352\t41.801505999999996\tSturgis city\tMI\tMichigan\tSt. Joseph County\t11098\t33.7\t16.6\t18.7\t19506\t93711\t0.4332\t49091\tObama\t49091\t0.02816443\t49091.0\n10186\t-85.64858100000001\t41.797876\tWhite Pigeon village\tMI\tMichigan\tSt. Joseph County\t1718\t39.7\t11.2\t14.1\t20801\t90349\t0.4332\t49099\tObama\t49099\t0.004359929\t49099.0\n10187\t-85.632059\t41.944390999999996\tThree Rivers city\tMI\tMichigan\tSt. Joseph County\t7466\t33.1\t13.6\t22.8\t19654\t76636\t0.4332\t49093\tObama\t49093\t0.018947165\t49093.0\n10188\t-85.664647\t41.837928000000005\tConstantine village\tMI\tMichigan\tSt. Joseph County\t2037\t34.1\t11.9\t17.6\t20254\t97381\t0.4332\t49042\tObama\t49042\t0.005169485\t49042.0\n10189\t-85.322818\t41.959134000000006\tColon village\tMI\tMichigan\tSt. Joseph County\t1137\t38.7\t11.8\t13.7\t18875\t89531\t0.4332\t49040\tObama\t49040\t0.0028854709999999997\t49040.0\n10190\t-85.453709\t42.008043\tMendon village\tMI\tMichigan\tSt. Joseph County\t982\t37.8\t12.4\t12.2\t19809\t102049\t0.4332\t49072\tObama\t49072\t0.002492113\t49072.0\n10191\t-82.618157\t43.273857\tCroswell city\tMI\tMichigan\tSanilac County\t2404\t34.1\t11.0\t19.4\t16048\t94452\t0.3926\t48422\tObama\t48422\t0.006100855\t48422.0\n10192\t-82.81675600000001\t43.25869\tPeck village\tMI\tMichigan\tSanilac County\t630\t39.4\t7.9\t18.9\t18685\t103779\t0.3926\t48466\tObama\t48466\t0.00159881\t48466.0\n10193\t-82.832915\t43.421617\tSandusky city\tMI\tMichigan\tSanilac County\t2748\t40.9\t16.9\t18.0\t21152\t103087\t0.3926\t48471\tObama\t48471\t0.006973856\t48471.0\n10194\t-82.861653\t43.186475\tMelvin village\tMI\tMichigan\tSanilac County\t166\t37.7\t7.5\t19.5\t20142\t128125\t0.3926\t48454\tObama\t48454\t0.000421274\t48454.0\n10195\t-83.081257\t43.326743\tMarlette city\tMI\tMichigan\tSanilac County\t1962\t37.1\t16.0\t19.5\t17633\t103431\t0.3926\t48453\tObama\t48453\t0.00497915\t48453.0\n10196\t-82.53438100000001\t43.270173\tLexington village\tMI\tMichigan\tSanilac County\t1123\t46.8\t19.3\t16.6\t25340\t112199\t0.3926\t48450\tObama\t48450\t0.0028499420000000003\t48450.0\n10197\t-82.74205500000001\t43.526522\tDeckerville village\tMI\tMichigan\tSanilac County\t889\t44.5\t12.6\t16.9\t18099\t85962\t0.3926\t48427\tObama\t48427\t0.002256098\t48427.0\n10198\t-82.637135\t43.355459\tApplegate village\tMI\tMichigan\tSanilac County\t290\t40.8\t9.5\t18.6\t18107\t92500\t0.3926\t48401\tObama\t48401\t0.00073596\t48401.0\n10199\t-82.54508299999999\t43.429846000000005\tPort Sanilac village\tMI\tMichigan\tSanilac County\t616\t48.6\t19.8\t16.9\t21833\t111765\t0.3926\t48469\tObama\t48469\t0.0015632810000000001\t48469.0\n10200\t-82.61278\t43.660140000000006\tForestville village\tMI\tMichigan\tSanilac County\t125\t41.6\t9.4\t19.3\t17408\t105357\t0.3926\t48434\tObama\t48434\t0.000317224\t48434.0\n10201\t-82.67305\t43.425854\tCarsonville village\tMI\tMichigan\tSanilac County\t456\t39.6\t8.8\t26.5\t16509\t72609\t0.3926\t48419\tObama\t48419\t0.001157234\t48419.0\n10202\t-82.776798\t43.671298\tMinden City village\tMI\tMichigan\tSanilac County\t228\t40.3\t9.0\t19.1\t18938\t86429\t0.3926\t48456\tObama\t48456\t0.000578617\t48456.0\n10203\t-82.98759100000001\t43.214085\tBrown City\tMI\tMichigan\tSanilac County\t1241\t35.2\t12.7\t18.8\t17575\t106915\t0.3926\t48416\tObama\t48416\t0.0031494009999999996\t48416.0\n10204\t-86.251021\t45.959031\tManistique city\tMI\tMichigan\tSchoolcraft County\t3194\t40.3\t10.8\t15.5\t17613\t52833\t0.4607\t49854\tObama\t49854\t0.008105712\t49854.0\n10205\t-83.968674\t43.116054\tNew Lothrop village\tMI\tMichigan\tShiawassee County\t573\t40.6\t17.0\t12.1\t24068\t129630\t0.5106\t48460\tObama\t48460\t0.001454156\t48460.0\n10206\t-84.066301\t42.876621\tBancroft village\tMI\tMichigan\tShiawassee County\t627\t41.9\t8.6\t18.7\t20102\t112500\t0.5106\t48414\tObama\t48414\t0.001591196\t48414.0\n10207\t-84.144638\t42.986882\tMiddletown CDP\tMI\tMichigan\tShiawassee County\t943\t37.3\t15.3\t23.3\t23533\t82045\t0.5106\t48867\tObama\t48867\t0.002393139\t48867.0\n10208\t-84.11659499999999\t42.984223\tCorunna city\tMI\tMichigan\tShiawassee County\t3180\t38.8\t13.1\t22.1\t20901\t105677\t0.5106\t48817\tObama\t48817\t0.008070183\t48817.0\n10209\t-84.179609\t42.838257\tMorrice village\tMI\tMichigan\tShiawassee County\t1033\t34.3\t16.4\t19.2\t19628\t103728\t0.5106\t48857\tObama\t48857\t0.00262154\t48857.0\n10210\t-84.030547\t42.940101\tVernon village\tMI\tMichigan\tShiawassee County\t821\t39.9\t11.9\t18.2\t22062\t95345\t0.5106\t48476\tObama\t48476\t0.002083528\t48476.0\n10211\t-83.946861\t42.823768\tByron village\tMI\tMichigan\tShiawassee County\t644\t37.3\t11.9\t12.1\t21676\t135185\t0.5106\t48418\tObama\t48418\t0.0016343389999999998\t48418.0\n10212\t-84.23091\t42.833783000000004\tPerry city\tMI\tMichigan\tShiawassee County\t2227\t35.9\t20.6\t16.4\t23054\t122003\t0.5106\t48872\tObama\t48872\t0.005651666\t48872.0\n10213\t-83.926379\t42.98573\tLennon village\tMI\tMichigan\tShiawassee County\t476\t41.5\t11.5\t21.2\t22888\t117742\t0.5106\t48449\tObama\t48449\t0.00120799\t48449.0\n10214\t-84.176484\t42.995915000000004\tOwosso city\tMI\tMichigan\tShiawassee County\t15036\t35.0\t14.6\t21.9\t20274\t96163\t0.5106\t48867\tObama\t48867\t0.03815826\t48867.0\n10215\t-83.98755899999999\t42.91414\tDurand city\tMI\tMichigan\tShiawassee County\t3634\t36.5\t14.5\t17.2\t21723\t98700\t0.5106\t48429\tObama\t48429\t0.009222341\t48429.0\n10216\t-84.350134\t42.890637\tLaingsburg city\tMI\tMichigan\tShiawassee County\t1261\t38.1\t16.9\t19.4\t21268\t129924\t0.5106\t48848\tObama\t48848\t0.003200157\t48848.0\n10217\t-83.352817\t43.336973\tMayville village\tMI\tMichigan\tTuscola County\t1002\t34.6\t10.3\t18.1\t18346\t104303\t0.4394\t48744\tObama\t48744\t0.002542869\t48744.0\n10218\t-83.577136\t43.372066\tVassar city\tMI\tMichigan\tTuscola County\t2809\t36.4\t15.3\t18.2\t21820\t95000\t0.4394\t48768\tObama\t48768\t0.007128661\t48768.0\n10219\t-83.186832\t43.41258\tKingston village\tMI\tMichigan\tTuscola County\t451\t38.6\t10.4\t17.4\t18522\t100000\t0.4394\t48741\tObama\t48741\t0.001144545\t48741.0\n10220\t-83.176317\t43.600491\tCass City village\tMI\tMichigan\tTuscola County\t2463\t42.8\t17.0\t19.4\t22070\t93904\t0.4394\t48726\tObama\t48726\t0.006250585\t48726.0\n10221\t-83.24489100000001\t43.657083\tGagetown village\tMI\tMichigan\tTuscola County\t357\t41.2\t8.9\t14.4\t21075\t76111\t0.4394\t48735\tObama\t48735\t0.000905992\t48735.0\n10222\t-83.688812\t43.451745\tReese village\tMI\tMichigan\tTuscola County\t1377\t40.3\t16.6\t15.0\t24519\t101042\t0.4394\t48757\tObama\t48757\t0.003494541\t48757.0\n10223\t-83.514284\t43.566696\tAkron village\tMI\tMichigan\tTuscola County\t454\t36.8\t6.6\t16.8\t20596\t73000\t0.4394\t48701\tObama\t48701\t0.0011521580000000001\t48701.0\n10224\t-83.529085\t43.280736\tMillington village\tMI\tMichigan\tTuscola County\t1168\t36.8\t17.6\t20.3\t21931\t102744\t0.4394\t48746\tObama\t48746\t0.002964143\t48746.0\n10225\t-83.543453\t43.524407000000004\tFairgrove village\tMI\tMichigan\tTuscola County\t614\t42.0\t11.5\t18.5\t19375\t79828\t0.4394\t48701\tObama\t48701\t0.001558205\t48701.0\n10226\t-83.46722\t43.653543\tUnionville village\tMI\tMichigan\tTuscola County\t592\t41.3\t15.5\t19.8\t20091\t85000\t0.4394\t48767\tObama\t48767\t0.001502374\t48767.0\n10227\t-83.401186\t43.488667\tCaro village\tMI\tMichigan\tTuscola County\t3959\t40.7\t19.5\t17.6\t21862\t97723\t0.4394\t48723\tObama\t48723\t0.010047124000000001\t48723.0\n10228\t-85.89175999999999\t42.214325\tPaw Paw village\tMI\tMichigan\tVan Buren County\t3428\t39.0\t21.6\t16.5\t23503\t114888\t0.4961\t49079\tObama\t49079\t0.008699555\t49079.0\n10229\t-86.071907\t42.348882\tBreedsville village\tMI\tMichigan\tVan Buren County\t226\t36.5\t15.9\t26.5\t17831\t77500\t0.4961\t49027\tObama\t49027\t0.000573541\t49027.0\n10230\t-85.785595\t42.215032\tMattawan village\tMI\tMichigan\tVan Buren County\t2434\t32.9\t18.7\t12.6\t22734\t93250\t0.4961\t49071\tObama\t49071\t0.006176989\t49071.0\n10231\t-86.113871\t42.311989000000004\tBangor city\tMI\tMichigan\tVan Buren County\t1881\t33.7\t10.4\t22.1\t14825\t68796\t0.4961\t49013\tObama\t49013\t0.004773589\t49013.0\n10232\t-85.97375799999999\t42.109320000000004\tDecatur village\tMI\tMichigan\tVan Buren County\t1835\t35.2\t10.9\t20.7\t19266\t81923\t0.4961\t49045\tObama\t49045\t0.004656851\t49045.0\n10233\t-86.260018\t42.421458\tSouth Haven city\tMI\tMichigan\tVan Buren County\t5114\t44.6\t26.2\t12.0\t22042\t158530\t0.4961\t49090\tObama\t49090\t0.012978275\t49090.0\n10234\t-85.84644300000001\t42.167584999999995\tLawton village\tMI\tMichigan\tVan Buren County\t2028\t37.6\t13.7\t13.7\t20585\t116725\t0.4961\t49065\tObama\t49065\t0.005146645\t49065.0\n10235\t-85.877418\t42.36155\tGobles city\tMI\tMichigan\tVan Buren County\t859\t33.5\t7.8\t17.3\t16102\t84400\t0.4961\t49055\tObama\t49055\t0.002179964\t49055.0\n10236\t-86.16606800000001\t42.204541\tHartford city\tMI\tMichigan\tVan Buren County\t2407\t33.1\t8.0\t17.4\t17927\t66250\t0.4961\t49057\tObama\t49057\t0.006108468000000001\t49057.0\n10237\t-86.053588\t42.215661\tLawrence village\tMI\tMichigan\tVan Buren County\t1075\t35.3\t12.9\t18.7\t15921\t88148\t0.4961\t49064\tObama\t49064\t0.002728128\t49064.0\n10238\t-85.95869300000001\t42.383181\tBloomingdale village\tMI\tMichigan\tVan Buren County\t501\t39.6\t8.3\t12.6\t18360\t100000\t0.4961\t49026\tObama\t49026\t0.0012714339999999999\t49026.0\n10239\t-83.682591\t42.089562\tMilan city\tMI\tMichigan\tWashtenaw County\t5133\t34.8\t23.4\t12.9\t27464\t114991\t0.6731\t48160\tObama\t48160\t0.013026493\t48160.0\n10240\t-83.77799399999999\t42.173766\tSaline city\tMI\tMichigan\tWashtenaw County\t8405\t37.2\t44.5\t10.8\t31441\t171481\t0.6731\t48176\tObama\t48176\t0.021330152999999998\t48176.0\n10241\t-83.879227\t42.33233\tDexter village\tMI\tMichigan\tWashtenaw County\t3552\t38.8\t49.0\t5.7\t37210\t200360\t0.6731\t48130\tObama\t48130\t0.009014241999999999\t48130.0\n10242\t-84.035558\t42.148919\tManchester village\tMI\tMichigan\tWashtenaw County\t2362\t37.0\t27.6\t12.4\t31948\t133984\t0.6731\t48158\tObama\t48158\t0.0059942680000000005\t48158.0\n10243\t-83.620574\t42.243811\tYpsilanti city\tMI\tMichigan\tWashtenaw County\t22679\t26.9\t44.0\t14.3\t20840\t112812\t0.6731\t48197\tObama\t48197\t0.057554614000000004\t48197.0\n10244\t-83.75565999999999\t42.316917\tBarton Hills village\tMI\tMichigan\tWashtenaw County\t359\t42.0\t81.0\t10.4\t54936\t337500\t0.6731\t48109\tObama\t48109\t0.000911068\t48109.0\n10245\t-84.018825\t42.312835\tChelsea village\tMI\tMichigan\tWashtenaw County\t5003\t46.1\t44.9\t9.3\t32873\t166258\t0.6731\t48118\tObama\t48118\t0.01269658\t48118.0\n10246\t-83.74577\t42.440748\tWhitmore Lake CDP\tMI\tMichigan\tWashtenaw County\t7005\t37.5\t32.8\t12.1\t31158\t127813\t0.6731\t48189\tObama\t48189\t0.017777242\t48189.0\n10247\t-83.73092199999999\t42.275226\tAnn Arbor city\tMI\tMichigan\tWashtenaw County\t119638\t28.3\t73.4\t11.9\t32394\t188754\t0.6731\t48104\tObama\t48104\t0.303616514\t48104.0\n10248\t-83.162277\t42.208458\tWyandotte city\tMI\tMichigan\tWayne County\t25950\t40.5\t14.9\t16.8\t24882\t89246\t0.7304\t48192\tObama\t48192\t0.065855736\t48192.0\n10249\t-83.10658000000001\t42.385258\tDetroit city\tMI\tMichigan\tWayne County\t857436\t33.0\t13.3\t28.4\t16491\t59380\t0.7304\t48206\tObama\t48206\t2.17599533\t48206.0\n10250\t-83.314824\t42.293481\tInkster city\tMI\tMichigan\tWayne County\t27820\t33.5\t14.3\t23.7\t18815\t63891\t0.7304\t48141\tObama\t48141\t0.070601409\t48141.0\n10251\t-83.467986\t42.371763\tPlymouth city\tMI\tMichigan\tWayne County\t8780\t41.0\t44.6\t9.9\t35329\t147248\t0.7304\t48170\tObama\t48170\t0.022281825\t48170.0\n10252\t-83.055908\t42.395388\tHamtramck city\tMI\tMichigan\tWayne County\t22689\t32.7\t14.3\t17.7\t14667\t65843\t0.7304\t48212\tObama\t48212\t0.057579992\t48212.0\n10253\t-83.484957\t42.440677\tNorthville city\tMI\tMichigan\tWayne County\t6218\t44.7\t58.9\t9.6\t49403\t187952\t0.7304\t48167\tObama\t48167\t0.015779999\t48167.0\n10254\t-83.193763\t42.172835\tRiverview city\tMI\tMichigan\tWayne County\t12635\t44.2\t20.6\t13.9\t27579\t116530\t0.7304\t48195\tObama\t48195\t0.032065018\t48195.0\n10255\t-83.387699\t42.27745\tWayne city\tMI\tMichigan\tWayne County\t17837\t37.0\t14.1\t17.7\t24237\t86596\t0.7304\t48184\tObama\t48184\t0.045266619\t48184.0\n10256\t-83.48389\t42.201882\tBelleville city\tMI\tMichigan\tWayne County\t3705\t39.6\t27.8\t13.9\t29059\t60227\t0.7304\t48111\tObama\t48111\t0.009402524\t48111.0\n10257\t-83.178149\t42.279959999999996\tMelvindale city\tMI\tMichigan\tWayne County\t9926\t38.3\t7.0\t18.8\t21660\t72707\t0.7304\t48122\tObama\t48122\t0.025190136000000002\t48122.0\n10258\t-83.373301\t42.397164000000004\tLivonia city\tMI\tMichigan\tWayne County\t97092\t43.8\t33.3\t12.2\t29642\t144410\t0.7304\t48154\tObama\t48154\t0.246399426\t48154.0\n10259\t-83.14347\t42.250983000000005\tEcorse city\tMI\tMichigan\tWayne County\t10260\t35.0\t5.9\t27.0\t16941\t41415\t0.7304\t48229\tObama\t48229\t0.026037759\t48229.0\n10260\t-83.380652\t42.319205\tWestland city\tMI\tMichigan\tWayne County\t84168\t38.0\t18.7\t14.6\t25651\t99949\t0.7304\t48185\tObama\t48185\t0.21360098600000002\t48185.0\n10261\t-83.180988\t42.243302\tLincoln Park city\tMI\tMichigan\tWayne County\t37497\t38.1\t8.4\t17.4\t23396\t79100\t0.7304\t48146\tObama\t48146\t0.095159635\t48146.0\n10262\t-82.89891899999999\t42.436586\tGrosse Pointe Woods city\tMI\tMichigan\tWayne County\t16131\t44.7\t54.9\t10.5\t39135\t194643\t0.7304\t48236\tObama\t48236\t0.040937144\t48236.0\n10263\t-83.20586\t42.204698\tSouthgate city\tMI\tMichigan\tWayne County\t29764\t41.1\t15.2\t15.2\t26385\t95357\t0.7304\t48195\tObama\t48195\t0.07553488\t48195.0\n10264\t-83.341207\t42.324384\tGarden City\tMI\tMichigan\tWayne County\t28427\t40.1\t10.6\t15.0\t24736\t98490\t0.7304\t48135\tObama\t48135\t0.07214185\t48135.0\n10265\t-83.23732700000001\t42.131963\tWoodhaven city\tMI\tMichigan\tWayne County\t13643\t38.0\t22.7\t11.8\t30933\t137068\t0.7304\t48183\tObama\t48183\t0.034623113999999997\t48183.0\n10266\t-82.872462\t42.453986\tGrosse Pointe Shores village\tMI\tMichigan\tWayne County\t2650\t51.5\t65.6\t10.0\t62356\t502520\t0.7304\t48080\tObama\t48080\t0.006725152\t48080.0\n10267\t-83.486864\t42.307497999999995\tCanton CDP\tMI\tMichigan\tWayne County\t84204\t34.3\t42.6\t10.9\t33075\t173165\t0.7304\t48188\tObama\t48188\t0.213692346\t48188.0\n10268\t-82.92942099999999\t42.439067\tHarper Woods city\tMI\tMichigan\tWayne County\t13195\t40.9\t31.5\t14.6\t26440\t92774\t0.7304\t48225\tObama\t48225\t0.033486182999999996\t48225.0\n10269\t-83.126975\t42.273227\tRiver Rouge city\tMI\tMichigan\tWayne County\t8753\t32.1\t7.0\t28.4\t16538\t44290\t0.7304\t48218\tObama\t48218\t0.022213305\t48218.0\n10270\t-83.492661\t42.373055\tPlymouth Township CDP\tMI\tMichigan\tWayne County\t27883\t43.1\t46.4\t10.0\t40585\t166059\t0.7304\t48170\tObama\t48170\t0.07076129\t48170.0\n10271\t-83.271472\t42.099112\tFlat Rock city\tMI\tMichigan\tWayne County\t9124\t33.8\t14.1\t13.5\t23737\t95801\t0.7304\t48134\tObama\t48134\t0.023154826\t48134.0\n10272\t-83.26880600000001\t42.22605\tTaylor city\tMI\tMichigan\tWayne County\t63884\t35.9\t8.5\t17.7\t22371\t82960\t0.7304\t48180\tObama\t48180\t0.16212438699999998\t48180.0\n10273\t-83.210621\t42.25954\tAllen Park city\tMI\tMichigan\tWayne County\t27994\t44.2\t22.5\t13.0\t27302\t104836\t0.7304\t48101\tObama\t48101\t0.071042985\t48101.0\n10274\t-82.928737\t42.379321999999995\tGrosse Pointe Park city\tMI\tMichigan\tWayne County\t11674\t39.7\t63.1\t11.3\t44095\t275562\t0.7304\t48230\tObama\t48230\t0.029626199\t48230.0\n10275\t-83.298847\t42.316404\tDearborn Heights city\tMI\tMichigan\tWayne County\t55900\t41.1\t19.3\t15.3\t25573\t93216\t0.7304\t48127\tObama\t48127\t0.141862645\t48127.0\n10276\t-82.899393\t42.406669\tGrosse Pointe Farms city\tMI\tMichigan\tWayne County\t9226\t45.4\t71.5\t10.9\t53841\t259289\t0.7304\t48236\tObama\t48236\t0.023413681000000002\t48236.0\n10277\t-83.29555500000001\t42.394853999999995\tRedford CDP\tMI\tMichigan\tWayne County\t49340\t39.2\t18.5\t13.4\t24427\t94634\t0.7304\t48239\tObama\t48239\t0.125214721\t48239.0\n10278\t-83.242912\t42.07039\tRockwood city\tMI\tMichigan\tWayne County\t3206\t39.0\t12.4\t16.2\t26221\t103787\t0.7304\t48173\tObama\t48173\t0.008136165\t48173.0\n10279\t-83.212899\t42.312606\tDearborn city\tMI\tMichigan\tWayne County\t94230\t35.9\t29.6\t15.7\t23063\t111342\t0.7304\t48126\tObama\t48126\t0.239136262\t48126.0\n10280\t-83.15522299999999\t42.135063\tGrosse Ile CDP\tMI\tMichigan\tWayne County\t10535\t47.2\t48.9\t11.5\t42276\t195096\t0.7304\t48138\tObama\t48138\t0.026735652000000002\t48138.0\n10281\t-83.205146\t42.096476\tGibraltar city\tMI\tMichigan\tWayne County\t4709\t40.5\t22.9\t14.6\t39579\t120356\t0.7304\t48173\tObama\t48173\t0.011950468999999998\t48173.0\n10282\t-83.09761\t42.405183\tHighland Park city\tMI\tMichigan\tWayne County\t14549\t37.2\t7.5\t36.8\t13221\t45755\t0.7304\t48203\tObama\t48203\t0.036922355\t48203.0\n10283\t-82.911795\t42.391442\tGrosse Pointe city\tMI\tMichigan\tWayne County\t5350\t44.1\t71.8\t9.1\t50678\t216667\t0.7304\t48230\tObama\t48230\t0.013577193999999999\t48230.0\n10284\t-83.36596999999999\t42.223693\tRomulus city\tMI\tMichigan\tWayne County\t24068\t35.1\t9.7\t17.3\t22124\t83008\t0.7304\t48174\tObama\t48174\t0.06107960900000001\t48174.0\n10285\t-83.193299\t42.139796999999994\tTrenton city\tMI\tMichigan\tWayne County\t19153\t45.1\t22.4\t13.9\t27529\t108129\t0.7304\t48183\tObama\t48183\t0.048606355\t48183.0\n10286\t-85.67182199999999\t44.503413\tBuckley village\tMI\tMichigan\tWexford County\t623\t36.6\t10.7\t17.4\t17794\t103378\t0.4163\t49620\tObama\t49620\t0.001581045\t49620.0\n10287\t-85.400982\t44.41145\tManton city\tMI\tMichigan\tWexford County\t1295\t38.7\t13.1\t19.5\t17207\t78646\t0.4163\t49663\tObama\t49663\t0.003286442\t49663.0\n10288\t-85.416728\t44.250529\tCadillac city\tMI\tMichigan\tWexford County\t10059\t37.7\t21.6\t22.7\t20488\t85877\t0.4163\t49601\tObama\t49601\t0.025527663\t49601.0\n10289\t-85.700867\t44.309465\tHarrietta village\tMI\tMichigan\tWexford County\t171\t45.6\t8.2\t18.3\t17779\t75000\t0.4163\t49638\tObama\t49638\t0.00043396300000000005\t49638.0\n10290\t-85.71820699999999\t44.403782\tMesick village\tMI\tMichigan\tWexford County\t481\t41.7\t12.0\t17.0\t16701\t89091\t0.4163\t49668\tObama\t49668\t0.001220679\t49668.0\n10291\t-93.595863\t46.991794\tHill City\tMN\tMinnesota\tAitkin County\t503\t44.2\t13.2\t11.9\t22261\t68235\t0.4826\t55748\tObama\t55748\t0.001179223\t55748.0\n10292\t-93.4912\t46.711797\tPalisade city\tMN\tMinnesota\tAitkin County\t121\t50.6\t12.9\t11.1\t20424\t120833\t0.4826\t56469\tObama\t56469\t0.00028367\t56469.0\n10293\t-93.708396\t46.529912\tAitkin city\tMN\tMinnesota\tAitkin County\t2194\t46.4\t19.3\t10.2\t21146\t103074\t0.4826\t56431\tObama\t56431\t0.0051435709999999996\t56431.0\n10294\t-93.12500899999999\t46.652927000000005\tTamarack city\tMN\tMinnesota\tAitkin County\t60\t55.5\t16.7\t9.1\t21309\t129167\t0.4826\t55787\tObama\t55787\t0.000140663\t55787.0\n10295\t-93.275183\t46.242290000000004\tMcGrath city\tMN\tMinnesota\tAitkin County\t74\t44.5\t9.8\t9.4\t21086\t116667\t0.4826\t56350\tObama\t56350\t0.000173484\t56350.0\n10296\t-93.30638\t46.610377\tMcGregor city\tMN\tMinnesota\tAitkin County\t417\t42.7\t9.3\t9.9\t19381\t89000\t0.4826\t55760\tObama\t55760\t0.000977607\t55760.0\n10297\t-93.326587\t45.257196\tAndover city\tMN\tMinnesota\tAnoka County\t30739\t32.8\t32.0\t7.2\t36122\t224921\t0.4752\t55304\tObama\t55304\t0.072063915\t55304.0\n10298\t-93.150514\t45.140890999999996\tCircle Pines city\tMN\tMinnesota\tAnoka County\t5448\t40.6\t36.8\t9.0\t35485\t155564\t0.4752\t55014\tObama\t55014\t0.012772186000000001\t55014.0\n10299\t-93.270328\t45.401394\tBethel city\tMN\tMinnesota\tAnoka County\t535\t31.5\t10.5\t7.6\t27715\t172414\t0.4752\t55005\tObama\t55005\t0.0012542439999999998\t55005.0\n10300\t-93.309561\t45.175599\tCoon Rapids city\tMN\tMinnesota\tAnoka County\t64382\t35.4\t25.4\t9.5\t30536\t165266\t0.4752\t55433\tObama\t55433\t0.150935912\t55433.0\n10301\t-93.389358\t45.21015\tAnoka city\tMN\tMinnesota\tAnoka County\t17866\t35.6\t21.4\t9.6\t27671\t157935\t0.4752\t55316\tObama\t55316\t0.041884704\t55316.0\n10302\t-93.203755\t45.355647\tEast Bethel city\tMN\tMinnesota\tAnoka County\t12015\t34.5\t16.3\t9.8\t28916\t174493\t0.4752\t55005\tObama\t55005\t0.028167732999999997\t55005.0\n10303\t-93.247157\t45.048424\tColumbia Heights city\tMN\tMinnesota\tAnoka County\t18776\t42.2\t21.3\t9.6\t29230\t138853\t0.4752\t55421\tObama\t55421\t0.04401809\t55421.0\n10304\t-93.054326\t45.164155\tCenterville city\tMN\tMinnesota\tAnoka County\t3912\t32.3\t34.6\t6.5\t31631\t200501\t0.4752\t55038\tObama\t55038\t0.009171216999999999\t55038.0\n10305\t-93.326572\t45.340641\tOak Grove city\tMN\tMinnesota\tAnoka County\t8154\t38.1\t19.1\t8.4\t33247\t214768\t0.4752\t55011\tObama\t55011\t0.019116078999999998\t55011.0\n10306\t-93.082964\t45.167858\tLino Lakes city\tMN\tMinnesota\tAnoka County\t20327\t33.1\t38.7\t7.8\t34979\t228680\t0.4752\t55014\tObama\t55014\t0.047654224\t55014.0\n10307\t-93.225928\t45.116236\tSpring Lake Park city\tMN\tMinnesota\tAnoka County\t6771\t40.0\t20.3\t8.5\t30410\t155083\t0.4752\t55432\tObama\t55432\t0.015873801\t55432.0\n10308\t-93.171258\t45.137715\tLexington city\tMN\tMinnesota\tAnoka County\t2167\t33.4\t13.4\t11.5\t25418\t115064\t0.4752\t55014\tObama\t55014\t0.005080273\t55014.0\n10309\t-93.449381\t45.261855\tRamsey city\tMN\tMinnesota\tAnoka County\t23134\t35.1\t24.6\t7.8\t34366\t199082\t0.4752\t55303\tObama\t55303\t0.054234900999999995\t55303.0\n10310\t-93.193696\t45.169843\tBlaine city\tMN\tMinnesota\tAnoka County\t57374\t34.6\t25.3\t8.1\t32544\t158550\t0.4752\t55449\tObama\t55449\t0.134506493\t55449.0\n10311\t-93.259489\t45.084255999999996\tFridley city\tMN\tMinnesota\tAnoka County\t27505\t37.4\t29.3\t8.3\t31349\t155515\t0.4752\t55432\tObama\t55432\t0.064482188\t55432.0\n10312\t-93.390043\t45.398713\tSt. Francis city\tMN\tMinnesota\tAnoka County\t7272\t30.0\t12.3\t7.8\t26399\t155566\t0.4752\t55070\tObama\t55070\t0.017048336\t55070.0\n10313\t-93.250074\t45.053681\tHilltop city\tMN\tMinnesota\tAnoka County\t792\t37.9\t10.0\t19.3\t24726\t13235\t0.4752\t55421\tObama\t55421\t0.001856749\t55421.0\n10314\t-93.204045\t45.254503\tHam Lake city\tMN\tMinnesota\tAnoka County\t15662\t37.4\t25.0\t6.9\t33949\t211790\t0.4752\t55304\tObama\t55304\t0.036717689\t55304.0\n10315\t-95.981533\t46.863208\tAudubon city\tMN\tMinnesota\tBecker County\t504\t44.4\t15.8\t9.4\t19724\t122283\t0.4169\t56511\tObama\t56511\t0.001181568\t56511.0\n10316\t-95.528362\t47.151879\tElbow Lake CDP\tMN\tMinnesota\tBecker County\t106\t42.5\t16.2\t17.1\t13946\t100000\t0.4169\t56566\tObama\t56566\t0.00024850400000000003\t56566.0\n10317\t-95.91196500000001\t46.981978999999995\tCallaway city\tMN\tMinnesota\tBecker County\t234\t37.8\t8.6\t8.1\t17719\t81667\t0.4169\t56521\tObama\t56521\t0.000548585\t56521.0\n10318\t-95.700358\t46.726820000000004\tFrazee city\tMN\tMinnesota\tBecker County\t1489\t40.8\t11.2\t8.9\t16622\t86613\t0.4169\t56544\tObama\t56544\t0.003490783\t56544.0\n10319\t-95.83820899999999\t46.801786\tDetroit Lakes city\tMN\tMinnesota\tBecker County\t7534\t42.0\t28.2\t8.6\t23083\t111526\t0.4169\t56501\tObama\t56501\t0.017662563\t56501.0\n10320\t-96.09836899999999\t46.883778\tLake Park city\tMN\tMinnesota\tBecker County\t871\t32.7\t11.5\t10.7\t17640\t83235\t0.4169\t56554\tObama\t56554\t0.002041956\t56554.0\n10321\t-95.39518699999999\t47.004549\tPine Point CDP\tMN\tMinnesota\tBecker County\t342\t41.4\t16.3\t16.5\t13998\t95000\t0.4169\t56575\tObama\t56575\t0.0008017780000000001\t56575.0\n10322\t-95.84379399999999\t47.099682\tWhite Earth CDP\tMN\tMinnesota\tBecker County\t443\t32.1\t11.1\t11.0\t14977\t77222\t0.4169\t56569\tObama\t56569\t0.0010385610000000001\t56569.0\n10323\t-95.355682\t46.804316\tWolf Lake city\tMN\tMinnesota\tBecker County\t32\t38.8\t15.0\t10.5\t17386\t85000\t0.4169\t56570\tObama\t56570\t7.5e-05\t56570.0\n10324\t-95.92257\t47.101638\tOgema city\tMN\tMinnesota\tBecker County\t149\t30.6\t10.3\t10.9\t14784\t73750\t0.4169\t56569\tObama\t56569\t0.000349313\t56569.0\n10325\t-94.99580300000001\t47.505725\tWilton city\tMN\tMinnesota\tBeltrami County\t207\t32.2\t18.3\t10.1\t17276\t106944\t0.5359\t56687\tObama\t56687\t0.000485287\t56687.0\n10326\t-94.428839\t47.786882\tFunkley city\tMN\tMinnesota\tBeltrami County\t17\t43.8\t23.1\t12.5\t18394\t125000\t0.5359\t56630\tObama\t56630\t3.9899999999999994e-05\t56630.0\n10327\t-94.444684\t47.943853000000004\tKelliher city\tMN\tMinnesota\tBeltrami County\t328\t47.7\t13.9\t9.3\t17063\t77500\t0.5359\t56650\tObama\t56650\t0.000768957\t56650.0\n10328\t-95.130241\t47.521028\tSolway city\tMN\tMinnesota\tBeltrami County\t84\t38.0\t21.8\t10.0\t21229\t112500\t0.5359\t56678\tObama\t56678\t0.000196928\t56678.0\n10329\t-94.92890600000001\t47.850653\tRedby CDP\tMN\tMinnesota\tBeltrami County\t1149\t20.2\t2.3\t24.8\t10343\t73333\t0.5359\t56670\tObama\t56670\t0.002693693\t56670.0\n10330\t-94.68441\t47.660264\tTenstrike city\tMN\tMinnesota\tBeltrami County\t203\t43.4\t21.7\t8.2\t21516\t129412\t0.5359\t56683\tObama\t56683\t0.000475909\t56683.0\n10331\t-95.109273\t47.859981\tLittle Rock CDP\tMN\tMinnesota\tBeltrami County\t1258\t23.9\t5.8\t21.4\t12598\t81724\t0.5359\t56671\tObama\t56671\t0.0029492309999999996\t56671.0\n10332\t-94.91108299999999\t48.040999\tPonemah CDP\tMN\tMinnesota\tBeltrami County\t1049\t20.2\t2.3\t24.7\t10346\t72000\t0.5359\t56666\tObama\t56666\t0.002459255\t56666.0\n10333\t-94.891972\t47.475659\tBemidji city\tMN\tMinnesota\tBeltrami County\t12541\t29.5\t36.6\t9.8\t21050\t98333\t0.5359\t56601\tObama\t56601\t0.029400877000000002\t56601.0\n10334\t-94.757304\t47.58708\tTurtle River city\tMN\tMinnesota\tBeltrami County\t118\t42.5\t47.6\t6.7\t25342\t164583\t0.5359\t56683\tObama\t56683\t0.000276637\t56683.0\n10335\t-94.54769399999999\t47.726194\tBlackduck city\tMN\tMinnesota\tBeltrami County\t801\t43.1\t20.8\t7.4\t18155\t81000\t0.5359\t56630\tObama\t56630\t0.001877849\t56630.0\n10336\t-95.003398\t47.854464\tRed Lake CDP\tMN\tMinnesota\tBeltrami County\t1711\t21.9\t3.9\t23.2\t11357\t78000\t0.5359\t56670\tObama\t56670\t0.004011235\t56670.0\n10337\t-94.162697\t45.595141\tSauk Rapids city\tMN\tMinnesota\tBenton County\t12488\t32.9\t25.5\t7.0\t27566\t154957\t0.4166\t56379\tObama\t56379\t0.029276625\t56379.0\n10338\t-94.233742\t45.75268\tRice city\tMN\tMinnesota\tBenton County\t1240\t31.6\t17.9\t6.3\t20661\t150236\t0.4166\t56367\tObama\t56367\t0.002907032\t56367.0\n10339\t-93.866192\t45.682353000000006\tRonneby city\tMN\tMinnesota\tBenton County\t19\t35.0\t16.7\t9.1\t20510\t150000\t0.4166\t56329\tObama\t56329\t4.45e-05\t56329.0\n10340\t-93.94844499999999\t45.735495\tGilman city\tMN\tMinnesota\tBenton County\t225\t37.0\t10.3\t6.9\t18616\t172222\t0.4166\t56329\tObama\t56329\t0.000527486\t56329.0\n10341\t-93.907565\t45.661941\tFoley city\tMN\tMinnesota\tBenton County\t2633\t33.9\t21.0\t5.6\t21771\t117188\t0.4166\t56329\tObama\t56329\t0.006172754\t56329.0\n10342\t-96.714053\t45.557718\tBeardsley city\tMN\tMinnesota\tBig Stone County\t209\t45.9\t12.7\t4.5\t17127\t46875\t0.4823\t56211\tObama\t56211\t0.0004899759999999999\t56211.0\n10343\t-96.441485\t45.463196999999994\tClinton city\tMN\tMinnesota\tBig Stone County\t358\t43.4\t23.3\t5.6\t18208\t49000\t0.4823\t56225\tObama\t56225\t0.000839288\t56225.0\n10344\t-96.162746\t45.232065999999996\tCorrell city\tMN\tMinnesota\tBig Stone County\t37\t49.2\t10.3\t4.3\t19489\t55000\t0.4823\t56227\tObama\t56227\t8.669999999999999e-05\t56227.0\n10345\t-96.33104\t45.261707\tOdessa city\tMN\tMinnesota\tBig Stone County\t89\t48.8\t10.3\t5.4\t19479\t65000\t0.4823\t56276\tObama\t56276\t0.00020865\t56276.0\n10346\t-96.560682\t45.558137\tBarry city\tMN\tMinnesota\tBig Stone County\t26\t42.5\t11.1\t0.0\t18443\t70000\t0.4823\t56240\tObama\t56240\t6.1e-05\t56240.0\n10347\t-96.437062\t45.569018\tGraceville city\tMN\tMinnesota\tBig Stone County\t641\t47.3\t12.7\t2.9\t18524\t64048\t0.4823\t56240\tObama\t56240\t0.001502748\t56240.0\n10348\t-96.294265\t45.572517\tJohnson city\tMN\tMinnesota\tBig Stone County\t24\t42.5\t5.9\t6.7\t17496\t90000\t0.4823\t56221\tObama\t56221\t5.629999999999999e-05\t56221.0\n10349\t-96.441123\t45.304186\tOrtonville city\tMN\tMinnesota\tBig Stone County\t2250\t48.3\t17.1\t6.4\t18840\t63235\t0.4823\t562XX\tObama\t562XX\t0.005274856\t0.0\n10350\t-94.157989\t43.887816\tAmboy city\tMN\tMinnesota\tBlue Earth County\t584\t45.4\t17.8\t5.7\t20476\t95357\t0.53\t56010\tObama\t56010\t0.001369118\t56010.0\n10351\t-94.07056899999999\t44.006493\tGood Thunder city\tMN\tMinnesota\tBlue Earth County\t640\t36.1\t10.3\t7.4\t18752\t117647\t0.53\t56037\tObama\t56037\t0.0015004039999999999\t56037.0\n10352\t-93.783764\t44.008418\tPemberton city\tMN\tMinnesota\tBlue Earth County\t245\t39.0\t20.2\t5.7\t20129\t136538\t0.53\t56078\tObama\t56078\t0.000574373\t56078.0\n10353\t-94.166584\t43.962755\tVernon Center city\tMN\tMinnesota\tBlue Earth County\t348\t41.2\t16.0\t5.8\t22548\t116477\t0.53\t56090\tObama\t56090\t0.0008158439999999999\t56090.0\n10354\t-93.926994\t44.240504\tMankato city\tMN\tMinnesota\tBlue Earth County\t35255\t27.4\t38.1\t7.2\t23415\t138766\t0.53\t56050\tObama\t56050\t0.082651138\t56050.0\n10355\t-94.03396500000001\t44.140788\tSkyline city\tMN\tMinnesota\tBlue Earth County\t318\t42.2\t49.8\t5.4\t28940\t170652\t0.53\t56001\tObama\t56001\t0.0007455130000000001\t56001.0\n10356\t-94.21632199999999\t44.106466999999995\tLake Crystal city\tMN\tMinnesota\tBlue Earth County\t2701\t36.4\t23.1\t8.6\t25618\t116029\t0.53\t56055\tObama\t56055\t0.006332172\t56055.0\n10357\t-93.857739\t44.082035999999995\tSt. Clair city\tMN\tMinnesota\tBlue Earth County\t921\t36.9\t20.5\t5.1\t22226\t144167\t0.53\t56080\tObama\t56080\t0.002159175\t56080.0\n10358\t-93.95402800000001\t43.925124\tMapleton city\tMN\tMinnesota\tBlue Earth County\t1775\t40.6\t21.1\t7.1\t22652\t122188\t0.53\t56065\tObama\t56065\t0.004161275999999999\t56065.0\n10359\t-93.883298\t44.162459999999996\tEagle Lake city\tMN\tMinnesota\tBlue Earth County\t2565\t32.9\t30.5\t4.9\t26589\t142653\t0.53\t56024\tObama\t56024\t0.006013335999999999\t56024.0\n10360\t-93.814588\t44.202178\tMadison Lake city\tMN\tMinnesota\tBlue Earth County\t848\t39.2\t24.2\t6.0\t23869\t175481\t0.53\t56063\tObama\t56063\t0.001988035\t56063.0\n10361\t-94.72379699999999\t44.299162\tSleepy Eye city\tMN\tMinnesota\tBrown County\t3415\t41.0\t12.5\t7.3\t23404\t111348\t0.4042\t56085\tObama\t56085\t0.00800606\t56085.0\n10362\t-94.902415\t44.111431\tComfrey city\tMN\tMinnesota\tBrown County\t358\t42.4\t10.0\t8.4\t18779\t90556\t0.4042\t56019\tObama\t56019\t0.000839288\t56019.0\n10363\t-94.835763\t44.354782\tEvan city\tMN\tMinnesota\tBrown County\t86\t41.7\t11.9\t8.5\t21480\t104167\t0.4042\t56266\tObama\t56266\t0.00020161700000000002\t56266.0\n10364\t-94.846582\t44.28253\tCobden city\tMN\tMinnesota\tBrown County\t57\t40.0\t10.3\t6.5\t21729\t95000\t0.4042\t56085\tObama\t56085\t0.00013363\t56085.0\n10365\t-94.98183399999999\t44.237283000000005\tSpringfield city\tMN\tMinnesota\tBrown County\t2131\t44.1\t14.3\t8.2\t20793\t75439\t0.4042\t56087\tObama\t56087\t0.004995875\t56087.0\n10366\t-94.49445899999999\t44.148718\tHanska city\tMN\tMinnesota\tBrown County\t440\t38.8\t14.9\t6.9\t25382\t95909\t0.4042\t56041\tObama\t56041\t0.001031527\t56041.0\n10367\t-94.465724\t44.312718\tNew Ulm city\tMN\tMinnesota\tBrown County\t13105\t39.8\t22.1\t5.6\t25655\t117811\t0.4042\t56073\tObama\t56073\t0.030723108\t56073.0\n10368\t-92.492324\t46.722113\tCloquet city\tMN\tMinnesota\tCarlton County\t12031\t40.0\t18.1\t9.4\t24762\t133850\t0.6178\t55720\tObama\t55720\t0.028205242999999998\t55720.0\n10369\t-92.429897\t46.706748\tScanlon city\tMN\tMinnesota\tCarlton County\t916\t43.9\t22.4\t5.1\t28959\t131181\t0.6178\t55720\tObama\t55720\t0.0021474529999999997\t55720.0\n10370\t-92.688546\t46.505293\tBarnum city\tMN\tMinnesota\tCarlton County\t534\t42.2\t18.4\t11.5\t23657\t126705\t0.6178\t55707\tObama\t55707\t0.001251899\t55707.0\n10371\t-92.422724\t46.6595\tCarlton city\tMN\tMinnesota\tCarlton County\t913\t40.8\t17.4\t10.0\t21403\t142568\t0.6178\t55718\tObama\t55718\t0.0021404189999999997\t55718.0\n10372\t-92.87755200000001\t46.486109\tKettle River city\tMN\tMinnesota\tCarlton County\t168\t44.7\t11.6\t10.1\t18300\t111111\t0.6178\t55757\tObama\t55757\t0.000393856\t55757.0\n10373\t-92.390063\t46.667592\tThomson city\tMN\tMinnesota\tCarlton County\t167\t43.0\t17.9\t8.2\t25458\t147727\t0.6178\t55733\tObama\t55733\t0.00039151199999999995\t55733.0\n10374\t-92.872823\t46.679317\tCromwell city\tMN\tMinnesota\tCarlton County\t214\t45.2\t12.7\t8.2\t19206\t121429\t0.6178\t55726\tObama\t55726\t0.000501697\t55726.0\n10375\t-93.006866\t46.672502\tWright city\tMN\tMinnesota\tCarlton County\t103\t45.6\t13.7\t6.7\t19346\t137500\t0.6178\t55798\tObama\t55798\t0.000241471\t55798.0\n10376\t-92.765663\t46.444503999999995\tMoose Lake city\tMN\tMinnesota\tCarlton County\t2336\t36.2\t15.5\t9.1\t20246\t132078\t0.6178\t55767\tObama\t55767\t0.005476473000000001\t55767.0\n10377\t-92.384294\t46.621635\tWrenshall city\tMN\tMinnesota\tCarlton County\t348\t42.7\t14.9\t7.4\t20360\t148214\t0.6178\t55733\tObama\t55733\t0.0008158439999999999\t55733.0\n10378\t-93.65530799999999\t44.868927\tVictoria city\tMN\tMinnesota\tCarver County\t6109\t37.8\t49.5\t5.8\t48908\t316106\t0.3922\t55386\tObama\t55386\t0.014321821\t55386.0\n10379\t-93.844321\t44.960485999999996\tWatertown city\tMN\tMinnesota\tCarver County\t4599\t36.9\t24.2\t8.0\t27338\t172907\t0.3922\t55388\tObama\t55388\t0.010781806000000001\t55388.0\n10380\t-93.923651\t44.773866\tNorwood Young America city\tMN\tMinnesota\tCarver County\t3471\t34.7\t15.4\t9.4\t25720\t159738\t0.3922\t55368\tObama\t55368\t0.008137345\t55368.0\n10381\t-93.78595200000001\t44.773784\tCologne city\tMN\tMinnesota\tCarver County\t1205\t32.2\t15.6\t7.9\t34163\t185075\t0.3922\t55322\tObama\t55322\t0.002824979\t55322.0\n10382\t-93.515659\t44.862251\tChanhassen city\tMN\tMinnesota\tCarver County\t25146\t35.1\t60.1\t6.8\t49334\t310392\t0.3922\t55317\tObama\t55317\t0.058951795\t55317.0\n10383\t-93.62759799999999\t44.759313\tCarver city\tMN\tMinnesota\tCarver County\t2498\t38.2\t31.7\t5.9\t35912\t246371\t0.3922\t55315\tObama\t55315\t0.0058562630000000004\t55315.0\n10384\t-93.964285\t44.732514\tHamburg city\tMN\tMinnesota\tCarver County\t495\t37.8\t19.2\t7.9\t26608\t178750\t0.3922\t55339\tObama\t55339\t0.001160468\t55339.0\n10385\t-93.894819\t44.885261\tMayer city\tMN\tMinnesota\tCarver County\t1295\t40.0\t16.4\t7.1\t27441\t210069\t0.3922\t55360\tObama\t55360\t0.003035973\t55360.0\n10386\t-93.603981\t44.820741999999996\tChaska city\tMN\tMinnesota\tCarver County\t24204\t32.6\t36.5\t8.7\t34094\t208346\t0.3922\t55318\tObama\t55318\t0.056743388\t55318.0\n10387\t-93.97139\t44.883589\tNew Germany city\tMN\tMinnesota\tCarver County\t379\t39.7\t16.9\t6.3\t27905\t211842\t0.3922\t55367\tObama\t55367\t0.00088852\t55367.0\n10388\t-93.797475\t44.843977\tWaconia city\tMN\tMinnesota\tCarver County\t8358\t35.1\t35.3\t6.6\t36870\t233694\t0.3922\t55387\tObama\t55387\t0.019594333000000002\t55387.0\n10389\t-94.20584699999999\t47.340422\tBena city\tMN\tMinnesota\tCass County\t106\t39.6\t8.6\t14.0\t17682\t82500\t0.4249\t56626\tObama\t56626\t0.00024850400000000003\t56626.0\n10390\t-94.355808\t46.40592\tEast Gull Lake city\tMN\tMinnesota\tCass County\t1095\t44.8\t39.8\t8.8\t30387\t290323\t0.4249\t56425\tObama\t56425\t0.002567097\t56425.0\n10391\t-94.216763\t46.987043\tLongville city\tMN\tMinnesota\tCass County\t192\t59.9\t24.5\t11.4\t26593\t182143\t0.4249\t56655\tObama\t56655\t0.000450121\t56655.0\n10392\t-93.913359\t47.056573\tRemer city\tMN\tMinnesota\tCass County\t361\t51.1\t17.0\t13.1\t17203\t98182\t0.4249\t56672\tObama\t56672\t0.000846321\t56672.0\n10393\t-94.514943\t46.820567\tBackus city\tMN\tMinnesota\tCass County\t320\t48.1\t17.9\t11.8\t18750\t110833\t0.4249\t56435\tObama\t56435\t0.0007502019999999999\t56435.0\n10394\t-94.397741\t46.722172\tPine River city\tMN\tMinnesota\tCass County\t950\t45.1\t21.2\t9.0\t17478\t96500\t0.4249\t56474\tObama\t56474\t0.002227162\t56474.0\n10395\t-94.51945400000001\t46.927217\tHackensack city\tMN\tMinnesota\tCass County\t297\t49.5\t17.9\t9.8\t21172\t139773\t0.4249\t56452\tObama\t56452\t0.0006962810000000001\t56452.0\n10396\t-94.476977\t46.327708\tPillager city\tMN\tMinnesota\tCass County\t491\t37.0\t11.0\t10.6\t18980\t105208\t0.4249\t56473\tObama\t56473\t0.0011510910000000001\t56473.0\n10397\t-94.582112\t47.093015\tWalker city\tMN\tMinnesota\tCass County\t1206\t46.9\t33.6\t8.8\t24342\t144464\t0.4249\t56484\tObama\t56484\t0.002827323\t56484.0\n10398\t-94.383562\t46.744873\tChickamaw Beach city\tMN\tMinnesota\tCass County\t151\t44.7\t21.5\t9.0\t17487\t95000\t0.4249\t56474\tObama\t56474\t0.000354001\t56474.0\n10399\t-94.598445\t47.378879\tCass Lake city\tMN\tMinnesota\tCass County\t839\t30.0\t10.6\t17.2\t13696\t65435\t0.4249\t56633\tObama\t56633\t0.001966935\t56633.0\n10400\t-94.360834\t46.500025\tLake Shore city\tMN\tMinnesota\tCass County\t974\t54.0\t31.6\t6.6\t32282\t297368\t0.4249\t56468\tObama\t56468\t0.002283427\t56468.0\n10401\t-94.219075\t47.240715\tFederal Dam city\tMN\tMinnesota\tCass County\t102\t48.9\t10.8\t10.2\t20199\t114583\t0.4249\t56641\tObama\t56641\t0.000239127\t56641.0\n10402\t-94.12313\t47.166596999999996\tBoy River city\tMN\tMinnesota\tCass County\t38\t45.8\t10.3\t11.1\t20093\t112500\t0.4249\t56641\tObama\t56641\t8.909999999999998e-05\t56641.0\n10403\t-95.716836\t44.950447\tMontevideo city\tMN\tMinnesota\tChippewa County\t5138\t40.1\t21.5\t6.7\t24240\t89052\t0.4972\t56265\tObama\t56265\t0.012045428\t56265.0\n10404\t-95.913884\t45.11308\tMilan city\tMN\tMinnesota\tChippewa County\t308\t45.2\t23.4\t5.1\t24053\t58846\t0.4972\t56262\tObama\t56262\t0.000722069\t56262.0\n10405\t-95.468243\t44.905559999999994\tMaynard city\tMN\tMinnesota\tChippewa County\t373\t47.7\t10.2\t4.5\t21808\t96429\t0.4972\t56260\tObama\t56260\t0.000874454\t56260.0\n10406\t-95.367139\t44.957664\tClara City\tMN\tMinnesota\tChippewa County\t1322\t47.3\t12.5\t6.2\t22089\t81000\t0.4972\t56222\tObama\t56222\t0.003099271\t56222.0\n10407\t-95.799704\t45.010109\tWatson city\tMN\tMinnesota\tChippewa County\t196\t44.6\t12.9\t6.2\t21573\t81667\t0.4972\t56295\tObama\t56295\t0.00045949900000000004\t56295.0\n10408\t-92.747559\t45.388952\tShafer city\tMN\tMinnesota\tChisago County\t704\t35.4\t20.0\t12.3\t24086\t160776\t0.4254\t55074\tObama\t55074\t0.001650444\t55074.0\n10409\t-92.98660100000001\t45.395715\tStacy city\tMN\tMinnesota\tChisago County\t1397\t32.0\t13.3\t10.4\t27855\t164250\t0.4254\t55079\tObama\t55079\t0.0032751\t55079.0\n10410\t-92.995661\t45.332301\tWyoming city\tMN\tMinnesota\tChisago County\t3761\t33.6\t18.4\t9.5\t27589\t199199\t0.4254\t55025\tObama\t55025\t0.008817215\t55025.0\n10411\t-92.843374\t45.381744\tLindstrom city\tMN\tMinnesota\tChisago County\t3883\t40.5\t23.0\t7.8\t27299\t167610\t0.4254\t55045\tObama\t55045\t0.00910323\t55045.0\n10412\t-92.960145\t45.513708\tNorth Branch city\tMN\tMinnesota\tChisago County\t10934\t31.6\t15.7\t8.7\t26591\t172558\t0.4254\t55056\tObama\t55056\t0.025633457000000002\t55056.0\n10413\t-92.817121\t45.396516999999996\tCenter City\tMN\tMinnesota\tChisago County\t790\t33.6\t22.4\t7.9\t26072\t185119\t0.4254\t55045\tObama\t55045\t0.0018520610000000001\t55045.0\n10414\t-92.98720300000001\t45.597739000000004\tHarris city\tMN\tMinnesota\tChisago County\t1246\t35.8\t11.2\t11.6\t22633\t161623\t0.4254\t55032\tObama\t55032\t0.002921098\t55032.0\n10415\t-92.88895600000001\t45.369793\tChisago City\tMN\tMinnesota\tChisago County\t3147\t40.7\t23.0\t9.6\t27358\t193019\t0.4254\t55013\tObama\t55013\t0.007377766\t55013.0\n10416\t-92.963415\t45.688922\tRush City\tMN\tMinnesota\tChisago County\t2796\t33.9\t12.4\t9.3\t20486\t123201\t0.4254\t55069\tObama\t55069\t0.006554888\t55069.0\n10417\t-92.663214\t45.412836999999996\tTaylors Falls city\tMN\tMinnesota\tChisago County\t1091\t35.4\t20.0\t12.2\t24089\t161932\t0.4254\t55084\tObama\t55084\t0.002557719\t55084.0\n10418\t-96.50579499999999\t47.074919\tFelton city\tMN\tMinnesota\tClay County\t230\t41.1\t17.6\t5.2\t23493\t134167\t0.5265\t56536\tObama\t56536\t0.000539208\t56536.0\n10419\t-96.31754000000001\t46.876940000000005\tHawley city\tMN\tMinnesota\tClay County\t2131\t39.6\t28.7\t6.0\t21805\t113793\t0.5265\t56549\tObama\t56549\t0.004995875\t56549.0\n10420\t-96.70190799999999\t46.876098999999996\tDilworth city\tMN\tMinnesota\tClay County\t3638\t33.5\t19.6\t5.7\t21164\t107564\t0.5265\t56529\tObama\t56529\t0.008528856999999999\t56529.0\n10421\t-96.258237\t47.078747\tUlen city\tMN\tMinnesota\tClay County\t530\t46.1\t11.7\t6.5\t19370\t83333\t0.5265\t56585\tObama\t56585\t0.001242522\t56585.0\n10422\t-96.41776\t46.649184000000005\tBarnesville city\tMN\tMinnesota\tClay County\t2279\t39.0\t25.3\t7.1\t22423\t122516\t0.5265\t56514\tObama\t56514\t0.005342843000000001\t56514.0\n10423\t-96.77040799999999\t46.936155\tOakport CDP\tMN\tMinnesota\tClay County\t1428\t40.6\t34.5\t4.7\t26316\t179500\t0.5265\t56560\tObama\t56560\t0.003347775\t56560.0\n10424\t-96.749866\t46.867369000000004\tMoorhead city\tMN\tMinnesota\tClay County\t34035\t31.0\t35.2\t5.1\t23324\t139832\t0.5265\t56560\tObama\t56560\t0.079790994\t56560.0\n10425\t-96.652766\t46.779768\tSabin city\tMN\tMinnesota\tClay County\t412\t33.5\t24.9\t3.9\t25611\t162069\t0.5265\t56580\tObama\t56580\t0.000965885\t56580.0\n10426\t-96.258162\t46.978353999999996\tHitterdal city\tMN\tMinnesota\tClay County\t214\t42.5\t17.8\t4.8\t18795\t103571\t0.5265\t56552\tObama\t56552\t0.000501697\t56552.0\n10427\t-96.79587\t47.0784\tGeorgetown city\tMN\tMinnesota\tClay County\t128\t42.5\t23.6\t5.6\t24095\t142857\t0.5265\t56546\tObama\t56546\t0.000300081\t56546.0\n10428\t-96.57967\t46.871724\tGlyndon city\tMN\tMinnesota\tClay County\t1402\t32.3\t20.2\t5.3\t20725\t120991\t0.5265\t56547\tObama\t56547\t0.003286822\t56547.0\n10429\t-96.74610799999999\t46.659563\tComstock city\tMN\tMinnesota\tClay County\t127\t47.1\t18.1\t5.6\t22928\t142500\t0.5265\t56525\tObama\t56525\t0.000297736\t56525.0\n10430\t-95.512467\t47.739145\tGonvick city\tMN\tMinnesota\tClearwater County\t268\t47.5\t20.0\t10.3\t18407\t67692\t0.4177\t56644\tObama\t56644\t0.000628294\t56644.0\n10431\t-95.267085\t47.651283\tLeonard city\tMN\tMinnesota\tClearwater County\t27\t41.3\t16.7\t7.7\t16638\t85000\t0.4177\t56652\tObama\t56652\t6.330000000000001e-05\t56652.0\n10432\t-95.403926\t47.523363\tBagley city\tMN\tMinnesota\tClearwater County\t1477\t40.8\t24.0\t7.8\t20544\t84375\t0.4177\t56621\tObama\t56621\t0.00346265\t56621.0\n10433\t-95.25958299999999\t47.530151000000004\tShevlin city\tMN\tMinnesota\tClearwater County\t159\t44.2\t15.2\t8.0\t18287\t87500\t0.4177\t56676\tObama\t56676\t0.000372757\t56676.0\n10434\t-95.427576\t47.695855\tClearbrook city\tMN\tMinnesota\tClearwater County\t555\t45.7\t15.4\t8.2\t17444\t67500\t0.4177\t56634\tObama\t56634\t0.001301131\t56634.0\n10435\t-95.50765\t47.385671\tRice Lake CDP\tMN\tMinnesota\tClearwater County\t202\t32.9\t11.3\t13.6\t11950\t76667\t0.4177\t56621\tObama\t56621\t0.000473565\t56621.0\n10436\t-90.346242\t47.759601\tGrand Marais city\tMN\tMinnesota\tCook County\t1521\t47.2\t36.4\t4.4\t25191\t146516\t0.5999\t556HH\tObama\t556HH\t0.0035658029999999998\t0.0\n10437\t-94.927088\t43.941516\tMountain Lake city\tMN\tMinnesota\tCottonwood County\t2030\t39.7\t20.1\t6.6\t16659\t59518\t0.415\t56159\tObama\t56159\t0.004759093\t56159.0\n10438\t-95.04611\t43.909529\tBingham Lake city\tMN\tMinnesota\tCottonwood County\t159\t37.8\t13.5\t8.4\t14774\t63750\t0.415\t56118\tObama\t56118\t0.000372757\t56118.0\n10439\t-95.19533299999999\t44.055871999999994\tJeffers city\tMN\tMinnesota\tCottonwood County\t333\t47.4\t13.0\t6.7\t20829\t50000\t0.415\t56145\tObama\t56145\t0.0007806789999999999\t56145.0\n10440\t-95.436575\t44.042863\tWestbrook city\tMN\tMinnesota\tCottonwood County\t694\t53.7\t18.2\t5.0\t20085\t50000\t0.415\t56183\tObama\t56183\t0.001627\t56183.0\n10441\t-95.12162\t43.871313\tWindom city\tMN\tMinnesota\tCottonwood County\t4157\t44.2\t18.8\t7.4\t21570\t86120\t0.415\t56101\tObama\t56101\t0.00974559\t56101.0\n10442\t-95.319363\t44.039602\tStorden city\tMN\tMinnesota\tCottonwood County\t239\t45.6\t12.7\t5.9\t22425\t55000\t0.415\t56174\tObama\t56174\t0.000560307\t56174.0\n10443\t-94.04909\t46.458113\tRiverton city\tMN\tMinnesota\tCrow Wing County\t111\t42.5\t22.5\t7.8\t22122\t118750\t0.4227\t56455\tObama\t56455\t0.000260226\t56455.0\n10444\t-94.095384\t46.675565999999996\tCrosslake city\tMN\tMinnesota\tCrow Wing County\t2042\t57.8\t29.6\t9.5\t31594\t271495\t0.4227\t56442\tObama\t56442\t0.004787225\t56442.0\n10445\t-93.998068\t46.481057\tIronton city\tMN\tMinnesota\tCrow Wing County\t511\t42.4\t10.9\t11.9\t19127\t87250\t0.4227\t56455\tObama\t56455\t0.001197978\t56455.0\n10446\t-94.192349\t46.352877\tBrainerd city\tMN\tMinnesota\tCrow Wing County\t13471\t34.4\t18.5\t10.9\t20712\t105364\t0.4227\t56401\tObama\t56401\t0.031581151\t56401.0\n10447\t-94.218183\t46.606149\tBreezy Point city\tMN\tMinnesota\tCrow Wing County\t2023\t48.1\t26.5\t9.2\t25815\t223077\t0.4227\t56472\tObama\t56472\t0.004742682\t56472.0\n10448\t-94.281315\t46.340243\tBaxter city\tMN\tMinnesota\tCrow Wing County\t6845\t38.5\t34.1\t8.6\t26758\t170425\t0.4227\t56425\tObama\t56425\t0.016047285\t56425.0\n10449\t-93.925736\t46.511003\tCuyuna city\tMN\tMinnesota\tCrow Wing County\t230\t44.6\t16.8\t11.7\t19604\t137500\t0.4227\t56441\tObama\t56441\t0.000539208\t56441.0\n10450\t-94.297827\t46.500355\tNisswa city\tMN\tMinnesota\tCrow Wing County\t1956\t47.8\t33.5\t9.1\t27705\t244500\t0.4227\t56468\tObama\t56468\t0.004585608\t56468.0\n10451\t-94.01533\t46.505639\tTrommald city\tMN\tMinnesota\tCrow Wing County\t131\t42.9\t12.0\t11.5\t19506\t90000\t0.4227\t56455\tObama\t56455\t0.00030711400000000004\t56455.0\n10452\t-93.957149\t46.489133\tCrosby city\tMN\tMinnesota\tCrow Wing County\t2336\t41.9\t13.7\t12.3\t18838\t92927\t0.4227\t56455\tObama\t56455\t0.005476473000000001\t56455.0\n10453\t-94.088195\t46.762813\tFifty Lakes city\tMN\tMinnesota\tCrow Wing County\t378\t54.5\t20.4\t12.1\t24396\t198750\t0.4227\t56448\tObama\t56448\t0.000886176\t56448.0\n10454\t-93.900063\t46.472239\tDeerwood city\tMN\tMinnesota\tCrow Wing County\t573\t47.9\t21.3\t10.5\t22412\t197500\t0.4227\t56444\tObama\t56444\t0.00134333\t56444.0\n10455\t-93.966634\t46.760335999999995\tEmily city\tMN\tMinnesota\tCrow Wing County\t801\t52.7\t16.2\t12.4\t22562\t166797\t0.4227\t56447\tObama\t56447\t0.001877849\t56447.0\n10456\t-94.33068\t46.653365\tJenkins city\tMN\tMinnesota\tCrow Wing County\t346\t47.2\t12.9\t8.9\t23926\t150000\t0.4227\t56456\tObama\t56456\t0.000811156\t56456.0\n10457\t-93.82630400000001\t46.299519000000004\tGarrison city\tMN\tMinnesota\tCrow Wing County\t246\t50.6\t18.3\t9.5\t24453\t154167\t0.4227\t56450\tObama\t56450\t0.000576718\t56450.0\n10458\t-94.362999\t46.169039\tFort Ripley city\tMN\tMinnesota\tCrow Wing County\t77\t43.8\t10.7\t7.5\t21848\t150000\t0.4227\t56449\tObama\t56449\t0.00018051700000000002\t56449.0\n10459\t-94.138954\t46.734873\tManhattan Beach city\tMN\tMinnesota\tCrow Wing County\t56\t57.0\t28.3\t12.5\t29455\t275000\t0.4227\t56448\tObama\t56448\t0.000131285\t56448.0\n10460\t-94.315849\t46.59938\tPequot Lakes city\tMN\tMinnesota\tCrow Wing County\t1116\t40.3\t21.6\t9.2\t20480\t131944\t0.4227\t56472\tObama\t56472\t0.002616329\t56472.0\n10461\t-93.05958100000001\t44.824544\tInver Grove Heights city\tMN\tMinnesota\tDakota County\t33977\t35.5\t34.1\t6.9\t36780\t185744\t0.5037\t55077\tObama\t55077\t0.07965502\t55077.0\n10462\t-93.279325\t44.764745\tBurnsville city\tMN\tMinnesota\tDakota County\t62594\t33.9\t41.8\t7.6\t36672\t204780\t0.5037\t55337\tObama\t55337\t0.146744159\t55337.0\n10463\t-92.82003399999999\t44.598890999999995\tMiesville city\tMN\tMinnesota\tDakota County\t154\t39.2\t18.6\t5.9\t28758\t225000\t0.5037\t55089\tObama\t55089\t0.000361035\t55089.0\n10464\t-92.932868\t44.604048\tNew Trier city\tMN\tMinnesota\tDakota County\t132\t38.1\t18.4\t5.5\t28816\t230000\t0.5037\t55031\tObama\t55031\t0.000309458\t55031.0\n10465\t-93.16375699999999\t44.816905\tEagan city\tMN\tMinnesota\tDakota County\t68040\t34.7\t52.6\t6.4\t40343\t222682\t0.5037\t55123\tObama\t55123\t0.159511656\t55123.0\n10466\t-93.06620500000001\t44.746617\tRosemount city\tMN\tMinnesota\tDakota County\t20505\t32.2\t33.8\t6.1\t34311\t215172\t0.5037\t55068\tObama\t55068\t0.048071524000000004\t55068.0\n10467\t-93.002184\t44.608711\tHampton city\tMN\tMinnesota\tDakota County\t494\t38.8\t18.7\t5.9\t28814\t220192\t0.5037\t55031\tObama\t55031\t0.001158124\t55031.0\n10468\t-93.09429\t44.872261\tSunfish Lake city\tMN\tMinnesota\tDakota County\t509\t46.9\t67.0\t11.2\t70949\t767500\t0.5037\t55118\tObama\t55118\t0.00119329\t55118.0\n10469\t-93.031624\t44.715548999999996\tCoates city\tMN\tMinnesota\tDakota County\t174\t37.3\t21.2\t4.0\t34725\t239286\t0.5037\t55085\tObama\t55085\t0.00040792199999999996\t55085.0\n10470\t-93.140525\t44.881555\tMendota Heights city\tMN\tMinnesota\tDakota County\t11788\t46.0\t59.5\t5.1\t50898\t276821\t0.5037\t55120\tObama\t55120\t0.027635559\t55120.0\n10471\t-92.96423\t44.673495\tVermillion city\tMN\tMinnesota\tDakota County\t463\t38.1\t17.0\t5.2\t32821\t221622\t0.5037\t55085\tObama\t55085\t0.001085448\t55085.0\n10472\t-92.853257\t44.752381\tHastings city\tMN\tMinnesota\tDakota County\t21549\t36.1\t23.8\t7.2\t29502\t169908\t0.5037\t55033\tObama\t55033\t0.050519058\t55033.0\n10473\t-93.174283\t44.655637\tFarmington city\tMN\tMinnesota\tDakota County\t18096\t30.3\t28.2\t6.9\t31397\t205104\t0.5037\t55024\tObama\t55024\t0.042423910999999995\t55024.0\n10474\t-93.252062\t44.677867\tLakeville city\tMN\tMinnesota\tDakota County\t55297\t31.9\t40.6\t6.3\t36745\t230195\t0.5037\t55044\tObama\t55044\t0.129637214\t55044.0\n10475\t-93.161498\t44.886227000000005\tMendota city\tMN\tMinnesota\tDakota County\t216\t55.3\t52.6\t5.3\t52975\t246875\t0.5037\t55150\tObama\t55150\t0.0005063859999999999\t55150.0\n10476\t-93.01974799999999\t44.525929999999995\tRandolph city\tMN\tMinnesota\tDakota County\t362\t39.3\t18.8\t6.0\t28814\t220000\t0.5037\t55065\tObama\t55065\t0.0008486660000000001\t55065.0\n10477\t-93.08570999999999\t44.901846\tWest St. Paul city\tMN\tMinnesota\tDakota County\t19818\t41.2\t27.9\t9.9\t31708\t161749\t0.5037\t55118\tObama\t55118\t0.046460935\t55118.0\n10478\t-93.20071300000001\t44.745356\tApple Valley city\tMN\tMinnesota\tDakota County\t51702\t36.9\t45.4\t7.1\t39914\t207054\t0.5037\t55124\tObama\t55124\t0.121209166\t55124.0\n10479\t-93.040644\t44.887363\tSouth St. Paul city\tMN\tMinnesota\tDakota County\t20723\t36.8\t19.6\t9.8\t29577\t146265\t0.5037\t55075\tObama\t55075\t0.048582599000000004\t55075.0\n10480\t-93.13134000000001\t44.908786\tLilydale city\tMN\tMinnesota\tDakota County\t601\t54.6\t53.1\t5.2\t53424\t252885\t0.5037\t55102\tObama\t55102\t0.0014089729999999998\t55102.0\n10481\t-92.753592\t44.065461\tMantorville city\tMN\tMinnesota\tDodge County\t1184\t33.4\t34.5\t5.3\t26793\t211607\t0.4345\t55955\tObama\t55955\t0.0027757470000000003\t55955.0\n10482\t-92.89957700000001\t44.152881\tWest Concord city\tMN\tMinnesota\tDodge County\t863\t34.3\t14.2\t8.8\t24136\t97500\t0.4345\t55985\tObama\t55985\t0.0020231999999999997\t55985.0\n10483\t-92.75119000000001\t44.032740000000004\tKasson city\tMN\tMinnesota\tDodge County\t5622\t35.1\t23.4\t7.2\t26866\t139773\t0.4345\t55944\tObama\t55944\t0.013180108000000001\t55944.0\n10484\t-92.850235\t44.028254\tDodge Center city\tMN\tMinnesota\tDodge County\t2653\t35.7\t15.5\t8.2\t20851\t109821\t0.4345\t55927\tObama\t55927\t0.006219641999999999\t55927.0\n10485\t-92.847103\t43.890491\tHayfield city\tMN\tMinnesota\tDodge County\t1606\t35.3\t17.7\t8.0\t21222\t111178\t0.4345\t55940\tObama\t55940\t0.003765075\t55940.0\n10486\t-92.998077\t44.045272\tClaremont city\tMN\tMinnesota\tDodge County\t631\t35.3\t12.7\t9.1\t19189\t105592\t0.4345\t55924\tObama\t55924\t0.0014793039999999999\t55924.0\n10487\t-95.292644\t45.975065\tCarlos city\tMN\tMinnesota\tDouglas County\t418\t41.0\t12.0\t6.3\t21156\t102604\t0.413\t56319\tObama\t56319\t0.000979951\t56319.0\n10488\t-95.696288\t45.778069\tKensington city\tMN\tMinnesota\tDouglas County\t304\t46.0\t17.6\t6.7\t22007\t156731\t0.413\t56343\tObama\t56343\t0.000712692\t56343.0\n10489\t-95.266568\t45.885775\tNelson city\tMN\tMinnesota\tDouglas County\t193\t40.0\t8.5\t5.8\t21534\t145192\t0.413\t56355\tObama\t56355\t0.000452465\t56355.0\n10490\t-95.686228\t46.006646\tEvansville city\tMN\tMinnesota\tDouglas County\t647\t45.1\t14.4\t6.0\t20820\t99231\t0.413\t56326\tObama\t56326\t0.001516814\t56326.0\n10491\t-95.356702\t45.788298\tForada city\tMN\tMinnesota\tDouglas County\t226\t44.3\t15.4\t6.1\t24131\t144792\t0.413\t56308\tObama\t56308\t0.00052983\t56308.0\n10492\t-95.595729\t45.966043\tBrandon city\tMN\tMinnesota\tDouglas County\t503\t44.9\t15.3\t6.6\t22009\t131667\t0.413\t56315\tObama\t56315\t0.001179223\t56315.0\n10493\t-95.494618\t45.938688\tGarfield city\tMN\tMinnesota\tDouglas County\t294\t39.3\t13.8\t6.3\t19851\t145833\t0.413\t56332\tObama\t56332\t0.000689248\t56332.0\n10494\t-95.375226\t45.875125\tAlexandria city\tMN\tMinnesota\tDouglas County\t9714\t38.0\t22.7\t6.6\t23078\t136216\t0.413\t56308\tObama\t56308\t0.022773312999999996\t56308.0\n10495\t-95.29206500000001\t46.04522\tMiltona city\tMN\tMinnesota\tDouglas County\t287\t46.1\t14.4\t5.8\t20683\t166667\t0.413\t56354\tObama\t56354\t0.000672837\t56354.0\n10496\t-95.132178\t45.86679\tOsakis city\tMN\tMinnesota\tDouglas County\t1467\t44.0\t12.6\t5.6\t20419\t110795\t0.413\t56360\tObama\t56360\t0.0034392059999999998\t56360.0\n10497\t-95.555863\t46.06903\tMillerville city\tMN\tMinnesota\tDouglas County\t113\t40.5\t10.0\t9.2\t16970\t131250\t0.413\t56315\tObama\t56315\t0.000264915\t56315.0\n10498\t-94.017391\t43.767616\tDelavan city\tMN\tMinnesota\tFaribault County\t204\t47.3\t18.2\t6.3\t21799\t63333\t0.4417\t56023\tObama\t56023\t0.000478254\t56023.0\n10499\t-94.099941\t43.639571999999994\tBlue Earth city\tMN\tMinnesota\tFaribault County\t3222\t45.9\t19.6\t6.3\t22613\t80645\t0.4417\t56013\tObama\t56013\t0.007553594\t56013.0\n10500\t-93.727396\t43.744867\tWells city\tMN\tMinnesota\tFaribault County\t2285\t42.7\t15.0\t10.2\t19125\t65000\t0.4417\t56097\tObama\t56097\t0.00535691\t56097.0\n10501\t-93.92614499999999\t43.584644\tFrost city\tMN\tMinnesota\tFaribault County\t221\t42.7\t19.4\t8.5\t19099\t61000\t0.4417\t56033\tObama\t56033\t0.000518108\t56033.0\n10502\t-93.817492\t43.848603000000004\tMinnesota Lake city\tMN\tMinnesota\tFaribault County\t631\t44.9\t17.5\t4.8\t21264\t72500\t0.4417\t56068\tObama\t56068\t0.0014793039999999999\t56068.0\n10503\t-94.088766\t43.506814\tElmore city\tMN\tMinnesota\tFaribault County\t683\t45.5\t12.7\t8.3\t17893\t38462\t0.4417\t56027\tObama\t56027\t0.001601212\t56027.0\n10504\t-94.168542\t43.765617999999996\tWinnebago city\tMN\tMinnesota\tFaribault County\t1207\t47.2\t13.0\t10.9\t18517\t56532\t0.4417\t56098\tObama\t56098\t0.002829667\t56098.0\n10505\t-93.89999\t43.766073\tEaston city\tMN\tMinnesota\tFaribault County\t195\t45.0\t18.8\t6.3\t21506\t85000\t0.4417\t56025\tObama\t56025\t0.00045715400000000003\t56025.0\n10506\t-93.813128\t43.560708\tBricelyn city\tMN\tMinnesota\tFaribault County\t321\t49.2\t16.5\t8.5\t18921\t50278\t0.4417\t56014\tObama\t56014\t0.0007525460000000001\t56014.0\n10507\t-93.71119\t43.53655\tKiester city\tMN\tMinnesota\tFaribault County\t468\t46.1\t16.9\t6.6\t21477\t52727\t0.4417\t56051\tObama\t56051\t0.00109717\t56051.0\n10508\t-93.674317\t43.604979\tWalters city\tMN\tMinnesota\tFaribault County\t81\t40.0\t13.2\t7.9\t18807\t95000\t0.4417\t56051\tObama\t56051\t0.000189895\t56051.0\n10509\t-92.38991999999999\t43.686534\tSpring Valley city\tMN\tMinnesota\tFillmore County\t2615\t39.7\t22.0\t9.4\t22357\t108905\t0.5245\t55975\tObama\t55975\t0.006130555\t55975.0\n10510\t-91.768023\t43.519919\tMabel city\tMN\tMinnesota\tFillmore County\t831\t48.9\t18.3\t11.0\t19820\t76800\t0.5245\t55954\tObama\t55954\t0.00194818\t55954.0\n10511\t-92.082092\t43.672045000000004\tPreston city\tMN\tMinnesota\tFillmore County\t1345\t43.6\t19.8\t7.4\t21772\t113235\t0.5245\t55965\tObama\t55965\t0.003153192\t55965.0\n10512\t-91.791636\t43.803259000000004\tRushford Village city\tMN\tMinnesota\tFillmore County\t671\t41.9\t18.6\t8.0\t21718\t107917\t0.5245\t55971\tObama\t55971\t0.001573079\t55971.0\n10513\t-92.18346899999999\t43.853537\tChatfield city\tMN\tMinnesota\tFillmore County\t2415\t40.6\t21.6\t6.5\t24327\t132500\t0.5245\t55923\tObama\t55923\t0.005661679\t55923.0\n10514\t-92.00744\t43.553990999999996\tHarmony city\tMN\tMinnesota\tFillmore County\t1099\t46.4\t22.4\t8.8\t21177\t91406\t0.5245\t55939\tObama\t55939\t0.002576474\t55939.0\n10515\t-91.929721\t43.529699\tCanton city\tMN\tMinnesota\tFillmore County\t347\t31.4\t12.6\t7.6\t16403\t90000\t0.5245\t55922\tObama\t55922\t0.0008135\t55922.0\n10516\t-91.753237\t43.812981\tRushford city\tMN\tMinnesota\tFillmore County\t1602\t44.5\t21.6\t6.6\t23887\t111203\t0.5245\t55971\tObama\t55971\t0.003755698\t55971.0\n10517\t-92.134217\t43.741414\tFountain city\tMN\tMinnesota\tFillmore County\t372\t38.5\t16.8\t7.9\t23938\t150000\t0.5245\t55935\tObama\t55935\t0.00087211\t55935.0\n10518\t-91.833277\t43.78683\tPeterson city\tMN\tMinnesota\tFillmore County\t271\t47.1\t23.2\t8.3\t22375\t139773\t0.5245\t55962\tObama\t55962\t0.000635327\t55962.0\n10519\t-92.424798\t43.613391\tOstrander city\tMN\tMinnesota\tFillmore County\t199\t42.6\t13.8\t9.3\t21779\t117708\t0.5245\t55961\tObama\t55961\t0.00046653199999999997\t55961.0\n10520\t-91.927235\t43.733133\tWhalan city\tMN\tMinnesota\tFillmore County\t60\t43.8\t18.6\t5.6\t21438\t150000\t0.5245\t55949\tObama\t55949\t0.000140663\t55949.0\n10521\t-91.971694\t43.717995\tLanesboro city\tMN\tMinnesota\tFillmore County\t735\t48.0\t25.4\t6.0\t28440\t114315\t0.5245\t55949\tObama\t55949\t0.00172312\t55949.0\n10522\t-92.266733\t43.708948\tWykoff city\tMN\tMinnesota\tFillmore County\t445\t44.8\t12.0\t8.0\t20729\t107870\t0.5245\t55990\tObama\t55990\t0.001043249\t55990.0\n10523\t-93.42350400000001\t43.560944\tTwin Lakes city\tMN\tMinnesota\tFreeborn County\t153\t46.9\t22.0\t6.5\t25380\t132813\t0.5582\t56089\tObama\t56089\t0.00035869\t56089.0\n10524\t-93.27607900000001\t43.570417\tGlenville city\tMN\tMinnesota\tFreeborn County\t670\t42.8\t12.5\t6.1\t22829\t87800\t0.5582\t56036\tObama\t56036\t0.001570735\t56036.0\n10525\t-93.528352\t43.615184\tConger city\tMN\tMinnesota\tFreeborn County\t116\t46.9\t21.6\t5.8\t25382\t137500\t0.5582\t56020\tObama\t56020\t0.000271948\t56020.0\n10526\t-93.485171\t43.506718\tEmmons city\tMN\tMinnesota\tFreeborn County\t434\t45.4\t9.1\t6.7\t24098\t94643\t0.5582\t56029\tObama\t56029\t0.001017461\t56029.0\n10527\t-93.564136\t43.766139\tFreeborn city\tMN\tMinnesota\tFreeborn County\t269\t41.4\t16.0\t7.0\t21236\t106250\t0.5582\t56032\tObama\t56032\t0.000630638\t56032.0\n10528\t-93.451077\t43.725458\tManchester city\tMN\tMinnesota\tFreeborn County\t81\t43.8\t11.9\t6.5\t22408\t112500\t0.5582\t56064\tObama\t56064\t0.000189895\t56064.0\n10529\t-93.485947\t43.804482\tHartland city\tMN\tMinnesota\tFreeborn County\t289\t44.2\t11.5\t6.7\t22329\t114583\t0.5582\t56042\tObama\t56042\t0.000677526\t56042.0\n10530\t-93.365789\t43.6559\tAlbert Lea city\tMN\tMinnesota\tFreeborn County\t17504\t42.4\t17.8\t9.4\t23423\t95396\t0.5582\t56007\tObama\t56007\t0.041036038\t56007.0\n10531\t-93.573748\t43.669458\tAlden city\tMN\tMinnesota\tFreeborn County\t631\t40.3\t15.0\t6.5\t20124\t100658\t0.5582\t56009\tObama\t56009\t0.0014793039999999999\t56009.0\n10532\t-93.204514\t43.759985\tHollandale city\tMN\tMinnesota\tFreeborn County\t272\t42.9\t12.0\t4.9\t20817\t116667\t0.5582\t56045\tObama\t56045\t0.0006376719999999999\t56045.0\n10533\t-93.245991\t43.649766\tHayward city\tMN\tMinnesota\tFreeborn County\t289\t43.8\t13.0\t5.5\t24002\t139423\t0.5582\t56043\tObama\t56043\t0.000677526\t56043.0\n10534\t-93.268749\t43.823528\tGeneva city\tMN\tMinnesota\tFreeborn County\t392\t40.7\t11.2\t5.7\t22356\t112500\t0.5582\t56035\tObama\t56035\t0.000918997\t56035.0\n10535\t-93.163186\t43.563169\tMyrtle city\tMN\tMinnesota\tFreeborn County\t55\t43.3\t9.8\t10.0\t22156\t112500\t0.5582\t56036\tObama\t56036\t0.000128941\t56036.0\n10536\t-93.32819599999999\t43.763366999999995\tClarks Grove city\tMN\tMinnesota\tFreeborn County\t668\t42.9\t15.0\t6.6\t22436\t110714\t0.5582\t56016\tObama\t56016\t0.001566046\t56016.0\n10537\t-92.635101\t44.203953000000006\tPine Island city\tMN\tMinnesota\tGoodhue County\t2503\t40.2\t24.0\t6.8\t24870\t144369\t0.4733\t55963\tObama\t55963\t0.005867985\t55963.0\n10538\t-92.90391899999999\t44.513752000000004\tCannon Falls city\tMN\tMinnesota\tGoodhue County\t3900\t37.9\t18.0\t6.2\t27543\t171652\t0.4733\t55009\tObama\t55009\t0.009143084000000001\t55009.0\n10539\t-92.625486\t44.400725\tGoodhue city\tMN\tMinnesota\tGoodhue County\t817\t40.3\t16.7\t6.1\t23074\t178125\t0.4733\t55027\tObama\t55027\t0.001915359\t55027.0\n10540\t-93.02991\t44.409126\tDennison city\tMN\tMinnesota\tGoodhue County\t184\t41.7\t22.4\t6.9\t28489\t254167\t0.4733\t55018\tObama\t55018\t0.000431366\t55018.0\n10541\t-92.790664\t44.303793\tWanamingo city\tMN\tMinnesota\tGoodhue County\t1080\t38.9\t19.9\t11.2\t22768\t130945\t0.4733\t55983\tObama\t55983\t0.002531931\t55983.0\n10542\t-92.985541\t44.273087\tKenyon city\tMN\tMinnesota\tGoodhue County\t1622\t38.8\t21.2\t10.0\t21747\t121932\t0.4733\t55946\tObama\t55946\t0.003802585\t55946.0\n10543\t-92.673035\t44.294179\tZumbrota city\tMN\tMinnesota\tGoodhue County\t2868\t38.9\t31.0\t7.8\t26066\t146107\t0.4733\t55992\tObama\t55992\t0.006723684000000001\t55992.0\n10544\t-92.60408199999999\t44.581728000000005\tRed Wing city\tMN\tMinnesota\tGoodhue County\t16892\t40.2\t24.6\t8.2\t28060\t153388\t0.4733\t55066\tObama\t55066\t0.039601277000000004\t55066.0\n10545\t-92.511134\t44.371922\tBellechester city\tMN\tMinnesota\tGoodhue County\t183\t39.0\t22.3\t7.0\t23788\t190000\t0.4733\t55956\tObama\t55956\t0.000429022\t55956.0\n10546\t-95.978041\t45.990482\tElbow Lake city\tMN\tMinnesota\tGrant County\t1314\t40.8\t18.3\t7.4\t19689\t71224\t0.4723\t56531\tObama\t56531\t0.0030805159999999997\t56531.0\n10547\t-96.19641700000001\t45.868717\tNorcross city\tMN\tMinnesota\tGrant County\t52\t46.3\t21.6\t6.9\t20821\t82500\t0.4723\t56274\tObama\t56274\t0.000121908\t56274.0\n10548\t-95.78763199999999\t45.83398\tHoffman city\tMN\tMinnesota\tGrant County\t608\t46.2\t12.1\t6.5\t18593\t72391\t0.4723\t56339\tObama\t56339\t0.001425383\t56339.0\n10549\t-96.100747\t46.035851\tWendell city\tMN\tMinnesota\tGrant County\t158\t48.1\t14.3\t7.1\t20941\t97500\t0.4723\t56590\tObama\t56590\t0.000370412\t56590.0\n10550\t-95.89455699999999\t45.912423\tBarrett city\tMN\tMinnesota\tGrant County\t315\t45.9\t17.0\t5.0\t19668\t95833\t0.4723\t56311\tObama\t56311\t0.00073848\t56311.0\n10551\t-96.14035799999999\t45.810182\tHerman city\tMN\tMinnesota\tGrant County\t516\t44.2\t18.5\t9.6\t22643\t57917\t0.4723\t56248\tObama\t56248\t0.0012097000000000002\t56248.0\n10552\t-95.816632\t46.09322\tAshby city\tMN\tMinnesota\tGrant County\t422\t48.2\t14.5\t7.5\t20923\t98750\t0.4723\t56309\tObama\t56309\t0.000989329\t56309.0\n10553\t-93.316231\t45.068078\tBrooklyn Center city\tMN\tMinnesota\tHennepin County\t28580\t37.2\t20.1\t9.7\t27498\t134804\t0.6234\t55430\tObama\t55430\t0.067002398\t55430.0\n10554\t-93.364889\t44.948821\tSt. Louis Park city\tMN\tMinnesota\tHennepin County\t45451\t39.0\t48.5\t7.1\t38775\t166962\t0.6234\t55426\tObama\t55426\t0.10655444300000001\t55426.0\n10555\t-93.566675\t44.901379\tExcelsior city\tMN\tMinnesota\tHennepin County\t2346\t38.9\t49.3\t6.7\t40987\t295588\t0.6234\t55331\tObama\t55331\t0.005499916999999999\t55331.0\n10556\t-93.568957\t44.984081\tLong Lake city\tMN\tMinnesota\tHennepin County\t1839\t42.0\t41.9\t8.3\t36077\t197647\t0.6234\t55356\tObama\t55356\t0.004311316\t55356.0\n10557\t-93.46172800000001\t45.022492\tPlymouth city\tMN\tMinnesota\tHennepin County\t73154\t37.7\t55.9\t6.2\t47822\t261019\t0.6234\t55446\tObama\t55446\t0.171500819\t55446.0\n10558\t-93.661555\t45.008860999999996\tMaple Plain city\tMN\tMinnesota\tHennepin County\t2075\t39.6\t34.3\t6.8\t37979\t234951\t0.6234\t55359\tObama\t55359\t0.00486459\t55359.0\n10559\t-93.660074\t44.932731\tMound city\tMN\tMinnesota\tHennepin County\t9413\t40.6\t35.0\t6.8\t38058\t179293\t0.6234\t55364\tObama\t55364\t0.022067655\t55364.0\n10560\t-93.634189\t45.054986\tLoretto city\tMN\tMinnesota\tHennepin County\t633\t34.6\t41.2\t4.3\t48607\t300000\t0.6234\t55357\tObama\t55357\t0.0014839929999999999\t55357.0\n10561\t-93.74744799999999\t44.905605\tSt. Bonifacius city\tMN\tMinnesota\tHennepin County\t2285\t33.1\t32.3\t6.0\t33812\t201455\t0.6234\t55375\tObama\t55375\t0.00535691\t55375.0\n10562\t-93.350602\t45.111129\tBrooklyn Park city\tMN\tMinnesota\tHennepin County\t71307\t34.4\t32.1\t7.5\t31480\t166726\t0.6234\t55443\tObama\t55443\t0.167170748\t55443.0\n10563\t-93.31509\t44.830628999999995\tBloomington city\tMN\tMinnesota\tHennepin County\t85481\t43.2\t40.3\t6.8\t37794\t187519\t0.6234\t55431\tObama\t55431\t0.200399998\t55431.0\n10564\t-93.59056899999999\t44.964895\tOrono city\tMN\tMinnesota\tHennepin County\t7579\t45.0\t57.3\t7.6\t71580\t467161\t0.6234\t55356\tObama\t55356\t0.017768061\t55356.0\n10565\t-93.58332\t45.032625\tMedina city\tMN\tMinnesota\tHennepin County\t4839\t38.9\t46.4\t8.3\t55507\t297881\t0.6234\t55340\tObama\t55340\t0.011344458\t55340.0\n10566\t-93.57423399999999\t44.916195\tShorewood city\tMN\tMinnesota\tHennepin County\t7582\t42.7\t62.9\t6.1\t53796\t341492\t0.6234\t55331\tObama\t55331\t0.017775093999999998\t55331.0\n10567\t-93.552033\t44.909507\tGreenwood city\tMN\tMinnesota\tHennepin County\t723\t38.2\t45.8\t7.1\t44167\t494444\t0.6234\t55331\tObama\t55331\t0.001694987\t55331.0\n10568\t-93.39945999999999\t45.117732000000004\tOsseo city\tMN\tMinnesota\tHennepin County\t2522\t40.7\t19.2\t7.2\t29189\t145188\t0.6234\t55445\tObama\t55445\t0.005912528\t55445.0\n10569\t-93.58953199999999\t44.915199\tTonka Bay city\tMN\tMinnesota\tHennepin County\t1512\t45.5\t58.6\t5.1\t57215\t413462\t0.6234\t55331\tObama\t55331\t0.0035447029999999997\t55331.0\n10570\t-93.707739\t45.021815000000004\tIndependence city\tMN\tMinnesota\tHennepin County\t3420\t41.2\t37.6\t5.2\t45725\t300278\t0.6234\t55359\tObama\t55359\t0.008017782\t55359.0\n10571\t-93.359176\t44.990068\tGolden Valley city\tMN\tMinnesota\tHennepin County\t20947\t46.5\t52.2\t6.2\t43067\t207716\t0.6234\t55427\tObama\t55427\t0.04910774\t55427.0\n10572\t-93.688378\t45.099757000000004\tGreenfield city\tMN\tMinnesota\tHennepin County\t3089\t35.5\t31.5\t6.3\t39096\t274432\t0.6234\t55357\tObama\t55357\t0.0072417919999999995\t55357.0\n10573\t-93.42048100000001\t44.99923\tMedicine Lake city\tMN\tMinnesota\tHennepin County\t394\t45.7\t47.5\t7.0\t50656\t318750\t0.6234\t55441\tObama\t55441\t0.0009236860000000001\t55441.0\n10574\t-93.386957\t45.037546999999996\tNew Hope city\tMN\tMinnesota\tHennepin County\t21231\t41.5\t34.7\t6.9\t30503\t174393\t0.6234\t55428\tObama\t55428\t0.049773545\t55428.0\n10575\t-93.360228\t44.891428999999995\tEdina city\tMN\tMinnesota\tHennepin County\t47446\t48.1\t63.6\t5.5\t53055\t292059\t0.6234\t55436\tObama\t55436\t0.11123148199999999\t55436.0\n10576\t-93.405811\t44.926177\tHopkins city\tMN\tMinnesota\tHennepin County\t17568\t35.0\t40.6\t8.3\t34087\t156162\t0.6234\t55343\tObama\t55343\t0.041186078\t55343.0\n10577\t-93.33305899999999\t45.026036\tRobbinsdale city\tMN\tMinnesota\tHennepin County\t14044\t40.7\t31.8\t7.3\t31699\t141873\t0.6234\t55422\tObama\t55422\t0.032924481\t55422.0\n10578\t-93.598913\t44.939389\tMinnetonka Beach city\tMN\tMinnesota\tHennepin County\t665\t44.4\t47.7\t9.5\t61976\t298077\t0.6234\t55384\tObama\t55384\t0.001559013\t55384.0\n10579\t-93.51395\t44.970788\tWayzata city\tMN\tMinnesota\tHennepin County\t4011\t46.0\t53.9\t9.5\t66027\t350000\t0.6234\t55391\tObama\t55391\t0.009403311\t55391.0\n10580\t-93.523794\t44.929426\tDeephaven city\tMN\tMinnesota\tHennepin County\t3837\t44.5\t71.7\t6.3\t61089\t383696\t0.6234\t55391\tObama\t55391\t0.008995388\t55391.0\n10581\t-93.71045500000001\t44.935543\tMinnetrista city\tMN\tMinnesota\tHennepin County\t5822\t41.1\t47.0\t6.2\t47058\t337604\t0.6234\t55375\tObama\t55375\t0.013648984\t55375.0\n10582\t-93.459561\t44.848694\tEden Prairie city\tMN\tMinnesota\tHennepin County\t60040\t36.0\t62.4\t5.9\t49768\t263512\t0.6234\t55347\tObama\t55347\t0.140756611\t55347.0\n10583\t-93.55494399999999\t45.195172\tRogers city\tMN\tMinnesota\tHennepin County\t6705\t33.1\t35.7\t5.6\t36970\t252195\t0.6234\t55374\tObama\t55374\t0.015719072\t55374.0\n10584\t-93.267261\t44.962489\tMinneapolis city\tMN\tMinnesota\tHennepin County\t398978\t32.4\t41.7\t10.0\t29881\t143423\t0.6234\t55404\tObama\t55404\t0.935356284\t55404.0\n10585\t-93.462627\t45.10892\tMaple Grove city\tMN\tMinnesota\tHennepin County\t59323\t36.5\t45.8\t5.7\t40942\t213567\t0.6234\t55311\tObama\t55311\t0.13907569\t55311.0\n10586\t-93.51379399999999\t44.9503\tWoodland city\tMN\tMinnesota\tHennepin County\t482\t47.4\t79.1\t9.9\t97606\t804487\t0.6234\t55391\tObama\t55391\t0.0011299910000000001\t55391.0\n10587\t-93.359587\t45.037647\tCrystal city\tMN\tMinnesota\tHennepin County\t22662\t40.3\t26.3\t7.7\t31343\t143766\t0.6234\t55428\tObama\t55428\t0.053128352999999996\t55428.0\n10588\t-93.216686\t45.041565999999996\tSt. Anthony city\tMN\tMinnesota\tHennepin County\t8188\t43.1\t40.6\t5.9\t34144\t177517\t0.6234\t55418\tObama\t55418\t0.019195788000000002\t55418.0\n10589\t-93.390606\t45.170382000000004\tChamplin city\tMN\tMinnesota\tHennepin County\t23547\t33.2\t30.4\t7.3\t34081\t176670\t0.6234\t55316\tObama\t55316\t0.05520313\t55316.0\n10590\t-93.63193100000001\t44.936478\tSpring Park city\tMN\tMinnesota\tHennepin County\t1782\t50.6\t37.9\t8.6\t45300\t335106\t0.6234\t55384\tObama\t55384\t0.004177686\t55384.0\n10591\t-93.58369300000001\t45.108872\tCorcoran city\tMN\tMinnesota\tHennepin County\t5894\t37.9\t29.9\t5.8\t39530\t248598\t0.6234\t55340\tObama\t55340\t0.013817778999999999\t55340.0\n10592\t-93.46006\t44.932379\tMinnetonka city\tMN\tMinnesota\tHennepin County\t51041\t44.0\t57.3\t6.0\t49074\t247309\t0.6234\t55345\tObama\t55345\t0.11965953\t55345.0\n10593\t-93.282261\t44.876449\tRichfield city\tMN\tMinnesota\tHennepin County\t34144\t39.4\t31.8\t7.0\t31634\t161084\t0.6234\t55423\tObama\t55423\t0.08004653099999999\t55423.0\n10594\t-93.475615\t45.240233\tDayton city\tMN\tMinnesota\tHennepin County\t4779\t37.8\t24.0\t5.3\t33965\t184931\t0.6234\t55327\tObama\t55327\t0.011203795\t55327.0\n10595\t-91.280901\t43.700406\tBrownsville city\tMN\tMinnesota\tHouston County\t485\t40.3\t21.1\t8.1\t22776\t125000\t0.5056\t55919\tObama\t55919\t0.001137025\t55919.0\n10596\t-91.500805\t43.634342\tCaledonia city\tMN\tMinnesota\tHouston County\t2794\t39.4\t19.8\t10.0\t21879\t103997\t0.5056\t55921\tObama\t55921\t0.0065501990000000005\t55921.0\n10597\t-91.463677\t43.508368\tEitzen city\tMN\tMinnesota\tHouston County\t249\t41.9\t13.9\t5.9\t22474\t123214\t0.5056\t55931\tObama\t55931\t0.000583751\t55931.0\n10598\t-91.638784\t43.560724\tSpring Grove city\tMN\tMinnesota\tHouston County\t1407\t43.8\t21.9\t7.4\t22272\t99697\t0.5056\t55974\tObama\t55974\t0.003298544\t55974.0\n10599\t-91.57131\t43.76052\tHouston city\tMN\tMinnesota\tHouston County\t951\t44.8\t20.3\t8.5\t22660\t116912\t0.5056\t55943\tObama\t55943\t0.002229506\t55943.0\n10600\t-91.301167\t43.849344\tLa Crescent city\tMN\tMinnesota\tHouston County\t4619\t39.4\t34.9\t5.7\t26089\t149695\t0.5056\t55947\tObama\t55947\t0.010828694\t55947.0\n10601\t-91.348671\t43.759769\tHokah city\tMN\tMinnesota\tHouston County\t563\t40.6\t21.6\t7.8\t23260\t146371\t0.5056\t55941\tObama\t55941\t0.0013198860000000001\t55941.0\n10602\t-94.727967\t47.000425\tAkeley city\tMN\tMinnesota\tHubbard County\t423\t46.8\t15.6\t13.9\t20314\t85455\t0.4059\t56433\tObama\t56433\t0.000991673\t56433.0\n10603\t-94.75711\t47.214833\tLaporte city\tMN\tMinnesota\tHubbard County\t150\t39.5\t21.9\t10.1\t18680\t100000\t0.4059\t56461\tObama\t56461\t0.00035165699999999996\t56461.0\n10604\t-95.061918\t46.915594\tPark Rapids city\tMN\tMinnesota\tHubbard County\t3196\t46.2\t20.3\t9.3\t21101\t93983\t0.4059\t56470\tObama\t56470\t0.00749264\t56470.0\n10605\t-94.842049\t46.964954\tNevis city\tMN\tMinnesota\tHubbard County\t372\t51.8\t29.9\t11.2\t23069\t146875\t0.4059\t56467\tObama\t56467\t0.00087211\t56467.0\n10606\t-93.170354\t45.732368\tBraham city\tMN\tMinnesota\tIsanti County\t1598\t35.5\t14.8\t10.5\t22598\t114927\t0.3969\t55006\tObama\t55006\t0.00374632\t55006.0\n10607\t-93.226586\t45.562319\tCambridge city\tMN\tMinnesota\tIsanti County\t7078\t35.9\t24.7\t10.2\t26100\t148084\t0.3969\t55008\tObama\t55008\t0.016593526\t55008.0\n10608\t-93.25016600000001\t45.492778\tIsanti city\tMN\tMinnesota\tIsanti County\t4264\t27.9\t11.4\t8.4\t21816\t154670\t0.3969\t55040\tObama\t55040\t0.009996439000000001\t55040.0\n10609\t-93.491617\t47.227290999999994\tLa Prairie city\tMN\tMinnesota\tItasca County\t607\t44.6\t15.6\t9.9\t20613\t126302\t0.5373\t55744\tObama\t55744\t0.0014230389999999999\t55744.0\n10610\t-93.268958\t47.319984999999996\tCalumet city\tMN\tMinnesota\tItasca County\t373\t43.2\t14.3\t14.0\t19791\t79091\t0.5373\t55716\tObama\t55716\t0.000874454\t55716.0\n10611\t-93.29413199999999\t47.328012\tMarble city\tMN\tMinnesota\tItasca County\t694\t41.4\t11.2\t14.5\t17076\t68913\t0.5373\t55764\tObama\t55764\t0.001627\t55764.0\n10612\t-93.63959399999999\t47.239081\tCohasset city\tMN\tMinnesota\tItasca County\t2633\t45.9\t29.8\t9.4\t25140\t145859\t0.5373\t55721\tObama\t55721\t0.006172754\t55721.0\n10613\t-93.159152\t47.382931\tNashwauk city\tMN\tMinnesota\tItasca County\t891\t45.8\t16.1\t11.5\t20223\t64833\t0.5373\t55769\tObama\t55769\t0.002088843\t55769.0\n10614\t-93.638559\t47.840519\tEffie city\tMN\tMinnesota\tItasca County\t87\t49.6\t20.6\t15.4\t18961\t97500\t0.5373\t56639\tObama\t56639\t0.00020396099999999998\t56639.0\n10615\t-93.265726\t47.136652000000005\tWarba city\tMN\tMinnesota\tItasca County\t174\t43.6\t10.7\t14.4\t21603\t91429\t0.5373\t55793\tObama\t55793\t0.00040792199999999996\t55793.0\n10616\t-93.794187\t47.340234\tDeer River city\tMN\tMinnesota\tItasca County\t935\t39.8\t16.5\t11.5\t16675\t72097\t0.5373\t56636\tObama\t56636\t0.002191996\t56636.0\n10617\t-93.35705\t47.322065\tTaconite city\tMN\tMinnesota\tItasca County\t316\t42.0\t12.8\t12.1\t18818\t70000\t0.5373\t55786\tObama\t55786\t0.000740824\t55786.0\n10618\t-93.42904200000001\t47.30236\tColeraine city\tMN\tMinnesota\tItasca County\t1134\t38.0\t23.8\t8.2\t24710\t103906\t0.5373\t55722\tObama\t55722\t0.002658528\t55722.0\n10619\t-94.13821800000001\t47.627468\tSquaw Lake city\tMN\tMinnesota\tItasca County\t106\t42.1\t19.4\t19.5\t13658\t77500\t0.5373\t56659\tObama\t56659\t0.00024850400000000003\t56659.0\n10620\t-93.525415\t47.226442999999996\tGrand Rapids city\tMN\tMinnesota\tItasca County\t7860\t42.5\t21.8\t9.1\t23172\t105783\t0.5373\t55744\tObama\t55744\t0.018426832\t55744.0\n10621\t-93.78536700000001\t47.32063\tZemple city\tMN\tMinnesota\tItasca County\t78\t41.3\t15.7\t11.1\t16598\t65000\t0.5373\t56636\tObama\t56636\t0.000182862\t56636.0\n10622\t-93.08266\t47.400409\tKeewatin city\tMN\tMinnesota\tItasca County\t1142\t41.2\t10.9\t11.2\t19599\t55182\t0.5373\t55753\tObama\t55753\t0.002677283\t55753.0\n10623\t-93.40332\t47.296175\tBovey city\tMN\tMinnesota\tItasca County\t661\t42.5\t11.4\t12.5\t17862\t64750\t0.5373\t55786\tObama\t55786\t0.001549636\t55786.0\n10624\t-93.65235899999999\t47.747616\tBigfork city\tMN\tMinnesota\tItasca County\t479\t50.5\t21.5\t12.5\t20445\t103750\t0.5373\t56628\tObama\t56628\t0.001122958\t56628.0\n10625\t-95.171836\t43.677735999999996\tLakefield city\tMN\tMinnesota\tJackson County\t1551\t45.6\t13.2\t8.2\t20124\t62451\t0.4177\t56150\tObama\t56150\t0.003636134\t56150.0\n10626\t-95.205815\t43.828004\tWilder city\tMN\tMinnesota\tJackson County\t73\t43.3\t12.0\t6.7\t20848\t116667\t0.4177\t56101\tObama\t56101\t0.00017114\t56101.0\n10627\t-94.989694\t43.627285\tJackson city\tMN\tMinnesota\tJackson County\t3307\t42.2\t17.2\t6.5\t21759\t82421\t0.4177\t56143\tObama\t56143\t0.007752866999999999\t56143.0\n10628\t-95.31669699999999\t43.739407\tOkabena city\tMN\tMinnesota\tJackson County\t173\t41.6\t11.9\t4.6\t19463\t78750\t0.4177\t56161\tObama\t56161\t0.000405578\t56161.0\n10629\t-95.324119\t43.796919\tHeron Lake city\tMN\tMinnesota\tJackson County\t752\t42.8\t15.1\t5.9\t19166\t52037\t0.4177\t56137\tObama\t56137\t0.0017629739999999998\t56137.0\n10630\t-94.872465\t43.639071\tAlpha city\tMN\tMinnesota\tJackson County\t119\t45.0\t14.0\t5.0\t23250\t81667\t0.4177\t56111\tObama\t56111\t0.000278981\t56111.0\n10631\t-93.152856\t45.795828\tGrasston city\tMN\tMinnesota\tKanabec County\t110\t42.2\t10.3\t14.0\t21662\t137500\t0.4409\t55030\tObama\t55030\t0.000257882\t55030.0\n10632\t-93.17528\t45.915576\tQuamba city\tMN\tMinnesota\tKanabec County\t98\t40.8\t11.8\t13.7\t21120\t137500\t0.4409\t55036\tObama\t55036\t0.000229749\t55036.0\n10633\t-93.29240899999999\t45.877634\tMora city\tMN\tMinnesota\tKanabec County\t3339\t40.7\t18.6\t14.5\t22912\t115599\t0.4409\t55051\tObama\t55051\t0.007827887\t55051.0\n10634\t-93.42267199999999\t45.829431\tOgilvie city\tMN\tMinnesota\tKanabec County\t553\t37.6\t8.4\t13.7\t17929\t83889\t0.4409\t56358\tObama\t56358\t0.0012964419999999999\t56358.0\n10635\t-94.93967099999999\t45.23346\tSpicer city\tMN\tMinnesota\tKandiyohi County\t1136\t44.4\t33.5\t6.0\t31487\t160156\t0.4568\t56288\tObama\t56288\t0.002663216\t56288.0\n10636\t-95.023485\t44.942794\tBlomkest city\tMN\tMinnesota\tKandiyohi County\t180\t36.8\t14.0\t6.0\t19614\t105357\t0.4568\t56216\tObama\t56216\t0.000421989\t56216.0\n10637\t-95.048811\t45.12512\tWillmar city\tMN\tMinnesota\tKandiyohi County\t18517\t35.2\t22.0\t6.7\t22814\t119373\t0.4568\t56201\tObama\t56201\t0.043410896\t56201.0\n10638\t-94.880023\t44.945904\tLake Lillian city\tMN\tMinnesota\tKandiyohi County\t236\t43.1\t13.6\t5.9\t20010\t116346\t0.4568\t56253\tObama\t56253\t0.000553274\t56253.0\n10639\t-94.95107900000001\t45.2982\tNew London city\tMN\tMinnesota\tKandiyohi County\t1117\t41.4\t23.5\t5.6\t23434\t134375\t0.4568\t56273\tObama\t56273\t0.0026186729999999997\t56273.0\n10640\t-94.93237099999999\t45.131833\tKandiyohi city\tMN\tMinnesota\tKandiyohi County\t614\t37.8\t22.6\t5.2\t23814\t128804\t0.4568\t56251\tObama\t56251\t0.00143945\t56251.0\n10641\t-95.236337\t45.017447\tRaymond city\tMN\tMinnesota\tKandiyohi County\t794\t38.2\t12.5\t5.8\t18044\t98462\t0.4568\t56282\tObama\t56282\t0.001861438\t56282.0\n10642\t-94.777027\t45.135891\tAtwater city\tMN\tMinnesota\tKandiyohi County\t1048\t41.8\t17.3\t8.1\t22755\t95625\t0.4568\t56209\tObama\t56209\t0.002456911\t56209.0\n10643\t-94.839718\t45.405376000000004\tRegal city\tMN\tMinnesota\tKandiyohi County\t41\t33.8\t19.2\t4.2\t20428\t141667\t0.4568\t56246\tObama\t56246\t9.609999999999999e-05\t56246.0\n10644\t-95.187511\t44.935114\tPrinsburg city\tMN\tMinnesota\tKandiyohi County\t508\t41.8\t15.6\t5.3\t23686\t98636\t0.4568\t56281\tObama\t56281\t0.001190945\t56281.0\n10645\t-95.17560999999999\t45.145714\tPennock city\tMN\tMinnesota\tKandiyohi County\t505\t37.5\t17.1\t7.0\t21758\t138194\t0.4568\t56279\tObama\t56279\t0.001183912\t56279.0\n10646\t-95.240064\t45.347609999999996\tSunburg city\tMN\tMinnesota\tKandiyohi County\t98\t42.2\t10.1\t10.3\t18502\t125000\t0.4568\t56289\tObama\t56289\t0.000229749\t56289.0\n10647\t-97.094785\t48.921483\tHumboldt city\tMN\tMinnesota\tKittson County\t50\t45.0\t20.0\t6.9\t21132\t57500\t0.5128\t56731\tObama\t56731\t0.00011721899999999999\t56731.0\n10648\t-96.516513\t48.577729\tKarlstad city\tMN\tMinnesota\tKittson County\t755\t44.0\t16.5\t7.5\t18186\t58056\t0.5128\t56732\tObama\t56732\t0.001770007\t56732.0\n10649\t-96.91059200000001\t48.642755\tKennedy city\tMN\tMinnesota\tKittson County\t203\t45.0\t27.0\t5.2\t20665\t50000\t0.5128\t56733\tObama\t56733\t0.000475909\t56733.0\n10650\t-97.226378\t48.969595\tSt. Vincent city\tMN\tMinnesota\tKittson County\t97\t43.3\t20.6\t5.6\t20907\t58571\t0.5128\t56755\tObama\t56755\t0.000227405\t56755.0\n10651\t-96.597216\t48.659985\tHalma city\tMN\tMinnesota\tKittson County\t65\t44.4\t14.9\t8.6\t18326\t65000\t0.5128\t56729\tObama\t56729\t0.000152385\t56729.0\n10652\t-96.663671\t48.732161\tLake Bronson city\tMN\tMinnesota\tKittson County\t203\t47.6\t6.9\t6.5\t17390\t40000\t0.5128\t56734\tObama\t56734\t0.000475909\t56734.0\n10653\t-96.802032\t48.857681\tLancaster city\tMN\tMinnesota\tKittson County\t354\t42.8\t17.1\t8.5\t21610\t54643\t0.5128\t56735\tObama\t56735\t0.000829911\t56735.0\n10654\t-96.94309399999999\t48.766256\tHallock city\tMN\tMinnesota\tKittson County\t987\t47.4\t23.5\t3.9\t20664\t65200\t0.5128\t56728\tObama\t56728\t0.002313904\t56728.0\n10655\t-96.89816\t48.575494\tDonaldson city\tMN\tMinnesota\tKittson County\t33\t45.0\t26.1\t5.3\t20429\t50000\t0.5128\t56720\tObama\t56720\t7.74e-05\t56720.0\n10656\t-93.55788000000001\t48.39642\tLittlefork city\tMN\tMinnesota\tKoochiching County\t535\t48.4\t16.2\t7.8\t21248\t78333\t0.5344\t56653\tObama\t56653\t0.0012542439999999998\t56653.0\n10657\t-94.213206\t47.920813\tMizpah city\tMN\tMinnesota\tKoochiching County\t76\t44.5\t15.7\t6.7\t14703\t62500\t0.5344\t56660\tObama\t56660\t0.000178173\t56660.0\n10658\t-93.40679200000001\t48.588435\tInternational Falls city\tMN\tMinnesota\tKoochiching County\t6218\t42.1\t15.8\t9.2\t22729\t73516\t0.5344\t56649\tObama\t56649\t0.014577359\t56649.0\n10659\t-93.809191\t48.179517\tBig Falls city\tMN\tMinnesota\tKoochiching County\t230\t51.7\t11.5\t8.0\t18841\t47333\t0.5344\t56627\tObama\t56627\t0.000539208\t56627.0\n10660\t-94.267174\t47.874882\tNorthome city\tMN\tMinnesota\tKoochiching County\t223\t45.0\t15.2\t6.7\t14782\t60000\t0.5344\t566HH\tObama\t566HH\t0.000522797\t0.0\n10661\t-93.347166\t48.612546\tRanier city\tMN\tMinnesota\tKoochiching County\t189\t51.2\t34.5\t4.0\t26854\t132292\t0.5344\t56649\tObama\t56649\t0.000443088\t56649.0\n10662\t-96.18939\t45.01299\tMadison city\tMN\tMinnesota\tLac qui Parle County\t1641\t51.6\t15.6\t3.2\t20438\t55215\t0.4955\t56256\tObama\t56256\t0.0038471290000000003\t56256.0\n10663\t-96.171077\t45.163924\tLouisburg city\tMN\tMinnesota\tLac qui Parle County\t21\t37.5\t21.4\t7.1\t20400\t85000\t0.4955\t562HH\tObama\t562HH\t4.92e-05\t0.0\n10664\t-95.901167\t44.851174\tBoyd city\tMN\tMinnesota\tLac qui Parle County\t173\t43.3\t13.4\t5.4\t20832\t62000\t0.4955\t56218\tObama\t56218\t0.000405578\t56218.0\n10665\t-96.44183000000001\t45.067783\tNassau city\tMN\tMinnesota\tLac qui Parle County\t71\t47.5\t7.7\t6.8\t20325\t45000\t0.4955\t56257\tObama\t56257\t0.000166451\t56257.0\n10666\t-96.284461\t45.136351\tBellingham city\tMN\tMinnesota\tLac qui Parle County\t168\t44.6\t13.6\t4.2\t17844\t70000\t0.4955\t56212\tObama\t56212\t0.000393856\t56212.0\n10667\t-96.04905699999999\t44.92889\tDawson city\tMN\tMinnesota\tLac qui Parle County\t1568\t46.7\t17.7\t4.6\t21109\t70897\t0.4955\t56232\tObama\t56232\t0.003675989\t56232.0\n10668\t-96.418938\t45.010402\tMarietta city\tMN\tMinnesota\tLac qui Parle County\t148\t48.1\t8.3\t6.5\t20440\t37000\t0.4955\t56257\tObama\t56257\t0.000346968\t56257.0\n10669\t-91.278201\t47.294009\tSilver Bay city\tMN\tMinnesota\tLake County\t1959\t48.6\t16.8\t9.1\t25855\t65778\t0.5928\t55614\tObama\t55614\t0.004592642\t55614.0\n10670\t-91.674885\t47.030066\tTwo Harbors city\tMN\tMinnesota\tLake County\t3492\t43.1\t20.0\t7.2\t25565\t94790\t0.5928\t55616\tObama\t55616\t0.008186576999999999\t55616.0\n10671\t-91.300106\t47.259555999999996\tBeaver Bay city\tMN\tMinnesota\tLake County\t164\t45.7\t24.8\t8.0\t26702\t95833\t0.5928\t55601\tObama\t55601\t0.00038447800000000005\t55601.0\n10672\t-94.587958\t48.713828\tBaudette city\tMN\tMinnesota\tLake of the Woods County\t1096\t44.8\t27.1\t6.0\t24325\t79074\t0.3845\t56623\tObama\t56623\t0.002569441\t56623.0\n10673\t-94.953387\t48.767932\tWilliams city\tMN\tMinnesota\tLake of the Woods County\t138\t44.3\t14.4\t7.3\t20332\t76667\t0.3845\t56686\tObama\t56686\t0.000323525\t56686.0\n10674\t-93.581536\t44.439213\tMontgomery city\tMN\tMinnesota\tLe Sueur County\t2891\t35.6\t19.8\t9.6\t21511\t134536\t0.4564\t56069\tObama\t56069\t0.0067776040000000004\t56069.0\n10675\t-93.67579\t44.203477\tElysian city\tMN\tMinnesota\tLe Sueur County\t694\t42.5\t21.2\t9.7\t24397\t162903\t0.4564\t56028\tObama\t56028\t0.001627\t56028.0\n10676\t-93.732106\t44.386093\tLe Center city\tMN\tMinnesota\tLe Sueur County\t2235\t36.8\t17.2\t12.3\t20040\t131081\t0.4564\t56057\tObama\t56057\t0.0052396909999999994\t56057.0\n10677\t-93.905105\t44.48308\tLe Sueur city\tMN\tMinnesota\tLe Sueur County\t4152\t38.8\t22.5\t7.8\t26053\t138466\t0.4564\t56058\tObama\t56058\t0.009733868\t56058.0\n10678\t-93.62637099999999\t44.493383\tHeidelberg city\tMN\tMinnesota\tLe Sueur County\t107\t39.6\t14.1\t8.5\t25197\t233333\t0.4564\t56071\tObama\t56071\t0.00025084900000000004\t56071.0\n10679\t-93.574657\t44.223771\tWaterville city\tMN\tMinnesota\tLe Sueur County\t1894\t45.6\t17.8\t9.6\t23851\t133864\t0.4564\t56096\tObama\t56096\t0.004440257\t56096.0\n10680\t-93.835235\t44.323658\tCleveland city\tMN\tMinnesota\tLe Sueur County\t902\t39.3\t17.0\t7.3\t22428\t136111\t0.4564\t56017\tObama\t56017\t0.002114631\t56017.0\n10681\t-93.968875\t44.290321999999996\tKasota city\tMN\tMinnesota\tLe Sueur County\t803\t41.3\t19.7\t7.9\t22816\t130000\t0.4564\t56050\tObama\t56050\t0.0018825379999999998\t56050.0\n10682\t-93.574875\t44.313207\tKilkenny city\tMN\tMinnesota\tLe Sueur County\t165\t43.7\t12.6\t10.6\t22738\t187500\t0.4564\t56052\tObama\t56052\t0.000386823\t56052.0\n10683\t-96.134988\t44.278568\tTyler city\tMN\tMinnesota\tLincoln County\t1165\t44.8\t18.1\t4.7\t18680\t71429\t0.45799999999999996\t56178\tObama\t56178\t0.0027312029999999998\t56178.0\n10684\t-96.292179\t44.26453\tLake Benton city\tMN\tMinnesota\tLincoln County\t696\t45.4\t15.7\t5.3\t20058\t55806\t0.45799999999999996\t56149\tObama\t56149\t0.001631689\t56149.0\n10685\t-96.427738\t44.508773\tHendricks city\tMN\tMinnesota\tLincoln County\t707\t60.6\t23.3\t1.0\t17751\t57667\t0.45799999999999996\t56136\tObama\t56136\t0.001657477\t56136.0\n10686\t-96.25222600000001\t44.465338\tIvanhoe city\tMN\tMinnesota\tLincoln County\t593\t45.5\t22.0\t2.9\t20723\t57759\t0.45799999999999996\t56142\tObama\t56142\t0.001390218\t56142.0\n10687\t-96.181555\t44.381102\tArco city\tMN\tMinnesota\tLincoln County\t83\t43.1\t11.7\t7.8\t18714\t106250\t0.45799999999999996\t56113\tObama\t56113\t0.000194584\t56113.0\n10688\t-95.892471\t44.512394\tGhent city\tMN\tMinnesota\tLyon County\t312\t36.4\t16.6\t6.5\t21489\t105147\t0.4412\t56239\tObama\t56239\t0.000731447\t56239.0\n10689\t-95.672575\t44.608721\tCottonwood city\tMN\tMinnesota\tLyon County\t1071\t37.9\t25.0\t4.2\t23321\t110539\t0.4412\t56229\tObama\t56229\t0.002510832\t56229.0\n10690\t-95.894388\t44.386457\tLynd city\tMN\tMinnesota\tLyon County\t333\t39.1\t24.7\t4.2\t22969\t143750\t0.4412\t56157\tObama\t56157\t0.0007806789999999999\t56157.0\n10691\t-95.760604\t44.214082\tGarvin city\tMN\tMinnesota\tLyon County\t155\t44.0\t18.2\t4.5\t19315\t97500\t0.4412\t56132\tObama\t56132\t0.000363379\t56132.0\n10692\t-95.98247099999999\t44.562562\tMinneota city\tMN\tMinnesota\tLyon County\t1340\t44.1\t19.5\t5.2\t21003\t83387\t0.4412\t56264\tObama\t56264\t0.00314147\t56264.0\n10693\t-95.789703\t44.450026\tMarshall city\tMN\tMinnesota\tLyon County\t12546\t30.8\t34.6\t5.4\t23005\t125615\t0.4412\t56258\tObama\t56258\t0.029412598999999998\t56258.0\n10694\t-95.947242\t44.320014\tRussell city\tMN\tMinnesota\tLyon County\t401\t41.9\t12.4\t3.6\t21189\t91818\t0.4412\t56169\tObama\t56169\t0.000940097\t56169.0\n10695\t-95.87084499999999\t44.232552\tBalaton city\tMN\tMinnesota\tLyon County\t581\t36.5\t17.6\t5.0\t21308\t56857\t0.4412\t56115\tObama\t56115\t0.001362085\t56115.0\n10696\t-96.063029\t44.594307\tTaunton city\tMN\tMinnesota\tLyon County\t195\t39.5\t15.5\t5.6\t19099\t103125\t0.4412\t56291\tObama\t56291\t0.00045715400000000003\t56291.0\n10697\t-96.053473\t44.236831\tFlorence city\tMN\tMinnesota\tLyon County\t59\t46.0\t14.6\t5.7\t19231\t112500\t0.4412\t56170\tObama\t56170\t0.00013831799999999999\t56170.0\n10698\t-95.616066\t44.237567\tTracy city\tMN\tMinnesota\tLyon County\t2194\t43.3\t19.0\t5.6\t19892\t61452\t0.4412\t56175\tObama\t56175\t0.0051435709999999996\t56175.0\n10699\t-94.486857\t44.723357\tStewart city\tMN\tMinnesota\tMcLeod County\t604\t36.0\t11.9\t12.7\t26177\t90000\t0.3756\t55385\tObama\t55385\t0.001416006\t55385.0\n10700\t-94.03925500000001\t44.772386\tPlato city\tMN\tMinnesota\tMcLeod County\t358\t40.8\t16.0\t6.4\t26687\t194318\t0.3756\t55370\tObama\t55370\t0.000839288\t55370.0\n10701\t-94.350923\t44.732485\tBrownton city\tMN\tMinnesota\tMcLeod County\t900\t37.5\t18.3\t15.7\t20964\t109000\t0.3756\t55312\tObama\t55312\t0.002109943\t55312.0\n10702\t-94.039979\t44.881876\tLester Prairie city\tMN\tMinnesota\tMcLeod County\t1572\t38.0\t15.5\t7.4\t23425\t139634\t0.3756\t55354\tObama\t55354\t0.003685366\t55354.0\n10703\t-94.37950699999999\t44.886412\tHutchinson city\tMN\tMinnesota\tMcLeod County\t13741\t34.5\t25.3\t9.5\t26387\t155269\t0.3756\t55350\tObama\t55350\t0.032214134\t55350.0\n10704\t-94.19905899999999\t44.903765\tSilver Lake city\tMN\tMinnesota\tMcLeod County\t849\t38.5\t12.5\t7.0\t22585\t128036\t0.3756\t55381\tObama\t55381\t0.001990379\t55381.0\n10705\t-94.274182\t44.82629\tBiscay city\tMN\tMinnesota\tMcLeod County\t117\t43.5\t8.5\t6.2\t23979\t203571\t0.3756\t55336\tObama\t55336\t0.000274293\t55336.0\n10706\t-94.047057\t44.965203\tWinsted city\tMN\tMinnesota\tMcLeod County\t2396\t37.0\t14.5\t9.4\t25057\t158547\t0.3756\t55395\tObama\t55395\t0.005617136\t55395.0\n10707\t-94.150304\t44.769953\tGlencoe city\tMN\tMinnesota\tMcLeod County\t5745\t36.7\t16.0\t8.1\t24136\t141355\t0.3756\t55336\tObama\t55336\t0.013468467\t55336.0\n10708\t-95.623088\t47.28733\tNaytahwaush CDP\tMN\tMinnesota\tMahnomen County\t527\t28.6\t7.0\t12.9\t11314\t82000\t0.5848\t56566\tObama\t56566\t0.001235489\t56566.0\n10709\t-95.967725\t47.315034999999995\tMahnomen city\tMN\tMinnesota\tMahnomen County\t1146\t45.7\t16.6\t7.1\t18817\t68605\t0.5848\t56557\tObama\t56557\t0.00268666\t56557.0\n10710\t-95.940899\t47.184754999999996\tWaubun city\tMN\tMinnesota\tMahnomen County\t645\t41.7\t17.9\t6.2\t19040\t84167\t0.5848\t56569\tObama\t56569\t0.001512125\t56569.0\n10711\t-95.971965\t47.442975\tBejou city\tMN\tMinnesota\tMahnomen County\t80\t40.0\t11.5\t7.9\t17092\t129167\t0.5848\t56516\tObama\t56516\t0.00018755\t56516.0\n10712\t-96.406828\t48.218171000000005\tViking city\tMN\tMinnesota\tMarshall County\t85\t43.3\t12.1\t9.8\t18102\t82500\t0.4253\t56760\tObama\t56760\t0.000199272\t56760.0\n10713\t-96.32944499999999\t48.355783\tNewfolden city\tMN\tMinnesota\tMarshall County\t329\t42.3\t7.8\t7.2\t19803\t74545\t0.4253\t56738\tObama\t56738\t0.0007713010000000001\t56738.0\n10714\t-96.878206\t48.450913\tStephen city\tMN\tMinnesota\tMarshall County\t652\t44.7\t19.0\t7.4\t18556\t58243\t0.4253\t56757\tObama\t56757\t0.001528536\t56757.0\n10715\t-96.162102\t48.434554\tMiddle River city\tMN\tMinnesota\tMarshall County\t314\t44.5\t11.2\t7.8\t19520\t69286\t0.4253\t56737\tObama\t56737\t0.0007361360000000001\t56737.0\n10716\t-96.998591\t48.192916\tAlvarado city\tMN\tMinnesota\tMarshall County\t346\t40.2\t17.5\t4.8\t20925\t82308\t0.4253\t56710\tObama\t56710\t0.000811156\t56710.0\n10717\t-96.81633599999999\t48.336694\tArgyle city\tMN\tMinnesota\tMarshall County\t603\t43.9\t21.8\t4.8\t20846\t62619\t0.4253\t56713\tObama\t56713\t0.0014136620000000002\t56713.0\n10718\t-97.132424\t48.195001\tOslo city\tMN\tMinnesota\tMarshall County\t309\t42.5\t15.0\t7.8\t18696\t71667\t0.4253\t56744\tObama\t56744\t0.0007244139999999999\t56744.0\n10719\t-95.62398\t48.300137\tGrygla city\tMN\tMinnesota\tMarshall County\t206\t45.9\t11.4\t7.5\t17573\t72000\t0.4253\t56727\tObama\t56727\t0.000482942\t56727.0\n10720\t-96.76889\t48.193969\tWarren city\tMN\tMinnesota\tMarshall County\t1675\t45.7\t20.8\t6.1\t24569\t76304\t0.4253\t56762\tObama\t56762\t0.003926838\t56762.0\n10721\t-96.447841\t48.489399\tStrandquist city\tMN\tMinnesota\tMarshall County\t79\t42.5\t9.3\t7.0\t17943\t53750\t0.4253\t56758\tObama\t56758\t0.000185206\t56758.0\n10722\t-96.195123\t48.293009000000005\tHolt city\tMN\tMinnesota\tMarshall County\t81\t44.0\t10.2\t10.0\t21067\t95000\t0.4253\t56738\tObama\t56738\t0.000189895\t56738.0\n10723\t-94.619736\t43.668093\tWelcome city\tMN\tMinnesota\tMartin County\t597\t44.1\t8.8\t6.0\t22082\t63103\t0.3696\t56181\tObama\t56181\t0.001399595\t56181.0\n10724\t-94.774266\t43.561244\tDunnell city\tMN\tMinnesota\tMartin County\t151\t45.8\t14.3\t7.0\t17915\t47500\t0.3696\t56127\tObama\t56127\t0.000354001\t56127.0\n10725\t-94.631664\t43.532185999999996\tCeylon city\tMN\tMinnesota\tMartin County\t316\t46.0\t14.5\t6.7\t17949\t48333\t0.3696\t56121\tObama\t56121\t0.000740824\t56121.0\n10726\t-94.34953399999999\t43.693111\tGranada city\tMN\tMinnesota\tMartin County\t304\t43.6\t10.7\t7.5\t16505\t57692\t0.3696\t56039\tObama\t56039\t0.000712692\t56039.0\n10727\t-94.716025\t43.761236\tTrimont city\tMN\tMinnesota\tMartin County\t710\t48.8\t19.2\t7.5\t19256\t53462\t0.3696\t56176\tObama\t56176\t0.00166451\t56176.0\n10728\t-94.43637700000001\t43.735867\tNorthrop city\tMN\tMinnesota\tMartin County\t271\t42.4\t12.3\t5.3\t26339\t95833\t0.3696\t56075\tObama\t56075\t0.000635327\t56075.0\n10729\t-94.436679\t43.827849\tTruman city\tMN\tMinnesota\tMartin County\t1207\t49.6\t19.6\t10.6\t23348\t69423\t0.3696\t56088\tObama\t56088\t0.002829667\t56088.0\n10730\t-94.46076500000001\t43.643615999999994\tFairmont city\tMN\tMinnesota\tMartin County\t10348\t43.9\t22.1\t8.4\t23336\t87713\t0.3696\t56031\tObama\t56031\t0.02425965\t56031.0\n10731\t-94.72732099999999\t43.654756\tSherburn city\tMN\tMinnesota\tMartin County\t935\t43.0\t18.9\t7.5\t21155\t71471\t0.3696\t56171\tObama\t56171\t0.002191996\t56171.0\n10732\t-94.54499200000001\t45.330653000000005\tEden Valley city\tMN\tMinnesota\tMeeker County\t911\t37.0\t9.2\t8.6\t18931\t113393\t0.4068\t55329\tObama\t55329\t0.002135731\t55329.0\n10733\t-94.5199\t44.946496\tCedar Mills city\tMN\tMinnesota\tMeeker County\t52\t41.9\t10.5\t6.9\t25394\t156250\t0.4068\t55350\tObama\t55350\t0.000121908\t55350.0\n10734\t-94.40883199999999\t45.314685\tWatkins city\tMN\tMinnesota\tMeeker County\t906\t40.8\t6.7\t16.2\t20438\t91852\t0.4068\t55389\tObama\t55389\t0.002124009\t55389.0\n10735\t-94.695337\t44.935453\tCosmos city\tMN\tMinnesota\tMeeker County\t567\t41.8\t11.7\t6.2\t21958\t95000\t0.4068\t56228\tObama\t56228\t0.001329264\t56228.0\n10736\t-94.311737\t45.196119\tKingston city\tMN\tMinnesota\tMeeker County\t122\t36.1\t15.6\t8.5\t18099\t150000\t0.4068\t55325\tObama\t55325\t0.000286014\t55325.0\n10737\t-94.681611\t45.147695\tGrove City\tMN\tMinnesota\tMeeker County\t617\t40.8\t15.0\t7.5\t20664\t104730\t0.4068\t56243\tObama\t56243\t0.001446483\t56243.0\n10738\t-94.52727900000001\t45.12012\tLitchfield city\tMN\tMinnesota\tMeeker County\t6571\t40.4\t21.6\t8.0\t22955\t121146\t0.4068\t55355\tObama\t55355\t0.015404925\t55355.0\n10739\t-94.405252\t45.09628\tDarwin city\tMN\tMinnesota\tMeeker County\t285\t46.2\t19.2\t7.3\t24425\t183333\t0.4068\t55324\tObama\t55324\t0.000668148\t55324.0\n10740\t-94.313812\t45.082745\tDassel city\tMN\tMinnesota\tMeeker County\t1361\t38.9\t19.3\t7.6\t25980\t133816\t0.4068\t55325\tObama\t55325\t0.003190702\t55325.0\n10741\t-93.70940999999999\t45.732192\tForeston city\tMN\tMinnesota\tMille Lacs County\t506\t37.8\t9.4\t11.2\t19623\t156875\t0.4453\t56330\tObama\t56330\t0.001186257\t56330.0\n10742\t-93.649204\t45.69866\tPease city\tMN\tMinnesota\tMille Lacs County\t158\t39.5\t14.3\t8.9\t19325\t160938\t0.4453\t56353\tObama\t56353\t0.000370412\t56353.0\n10743\t-93.774538\t46.178301\tVineland CDP\tMN\tMinnesota\tMille Lacs County\t599\t39.9\t13.7\t23.9\t16856\t136667\t0.4453\t56450\tObama\t56450\t0.001404284\t56450.0\n10744\t-93.552748\t45.784364000000004\tBock city\tMN\tMinnesota\tMille Lacs County\t101\t40.6\t13.2\t7.7\t19213\t160938\t0.4453\t56313\tObama\t56313\t0.000236782\t56313.0\n10745\t-93.460238\t46.142045\tIsle city\tMN\tMinnesota\tMille Lacs County\t990\t46.8\t21.1\t12.6\t22552\t120982\t0.4453\t56386\tObama\t56386\t0.002320937\t56386.0\n10746\t-93.65264300000001\t45.757236999999996\tMilaca city\tMN\tMinnesota\tMille Lacs County\t3087\t41.7\t20.8\t12.3\t20999\t121282\t0.4453\t56353\tObama\t56353\t0.007237103000000001\t56353.0\n10747\t-93.665933\t46.070129\tOnamia city\tMN\tMinnesota\tMille Lacs County\t993\t41.8\t20.3\t16.5\t17967\t105966\t0.4453\t56359\tObama\t56359\t0.00232797\t56359.0\n10748\t-93.522367\t46.120670000000004\tWahkon city\tMN\tMinnesota\tMille Lacs County\t326\t51.7\t14.3\t18.6\t23143\t148958\t0.4453\t56386\tObama\t56386\t0.000764268\t56386.0\n10749\t-93.58537199999999\t45.573192\tPrinceton city\tMN\tMinnesota\tMille Lacs County\t5006\t37.7\t15.9\t9.5\t23561\t145556\t0.4453\t55371\tObama\t55371\t0.011735968999999999\t55371.0\n10750\t-94.500647\t46.088555\tRandall city\tMN\tMinnesota\tMorrison County\t584\t40.5\t10.7\t7.7\t20386\t94231\t0.3681\t56475\tObama\t56475\t0.001369118\t56475.0\n10751\t-94.362176\t45.978475\tLittle Falls city\tMN\tMinnesota\tMorrison County\t7686\t39.8\t21.7\t11.2\t20989\t105313\t0.3681\t56345\tObama\t56345\t0.018018909\t56345.0\n10752\t-94.63285400000001\t46.341721\tMotley city\tMN\tMinnesota\tMorrison County\t587\t38.1\t14.5\t15.1\t18067\t82143\t0.3681\t56466\tObama\t56466\t0.0013761510000000002\t56466.0\n10753\t-94.112163\t45.966065\tGenola city\tMN\tMinnesota\tMorrison County\t72\t34.4\t15.6\t7.5\t19020\t170833\t0.3681\t56364\tObama\t56364\t0.000168795\t56364.0\n10754\t-94.63807\t45.916979\tSwanville city\tMN\tMinnesota\tMorrison County\t357\t35.7\t10.8\t4.8\t18250\t113000\t0.3681\t56382\tObama\t56382\t0.000836944\t56382.0\n10755\t-94.290879\t45.832476\tRoyalton city\tMN\tMinnesota\tMorrison County\t1149\t34.9\t12.4\t10.8\t19361\t120290\t0.3681\t56373\tObama\t56373\t0.002693693\t56373.0\n10756\t-94.093997\t45.897356\tBuckman city\tMN\tMinnesota\tMorrison County\t231\t30.8\t11.9\t8.2\t18519\t143750\t0.3681\t56364\tObama\t56364\t0.0005415519999999999\t56364.0\n10757\t-94.06240799999999\t46.038823\tLastrup city\tMN\tMinnesota\tMorrison County\t102\t40.0\t5.8\t16.1\t18698\t142188\t0.3681\t56364\tObama\t56364\t0.000239127\t56364.0\n10758\t-94.494217\t45.833999999999996\tElmdale city\tMN\tMinnesota\tMorrison County\t122\t37.8\t13.4\t2.9\t19143\t129167\t0.3681\t56314\tObama\t56314\t0.000286014\t56314.0\n10759\t-94.567427\t45.809903999999996\tUpsala city\tMN\tMinnesota\tMorrison County\t430\t40.1\t20.0\t6.0\t20213\t137054\t0.3681\t56384\tObama\t56384\t0.001008084\t56384.0\n10760\t-94.482332\t45.922238\tSobieski city\tMN\tMinnesota\tMorrison County\t206\t38.0\t9.8\t5.5\t17646\t126136\t0.3681\t56328\tObama\t56328\t0.000482942\t56328.0\n10761\t-93.888456\t46.006981\tHillman city\tMN\tMinnesota\tMorrison County\t32\t45.0\t0.0\t5.9\t20487\t141667\t0.3681\t56338\tObama\t56338\t7.5e-05\t56338.0\n10762\t-94.529894\t45.947984000000005\tFlensburg city\tMN\tMinnesota\tMorrison County\t244\t40.3\t10.1\t5.9\t18741\t117045\t0.3681\t56328\tObama\t56328\t0.000572029\t56328.0\n10763\t-94.407145\t45.819253\tBowlus city\tMN\tMinnesota\tMorrison County\t296\t38.2\t13.1\t3.0\t19167\t124167\t0.3681\t56314\tObama\t56314\t0.0006939369999999999\t56314.0\n10764\t-94.037716\t46.119351\tHarding city\tMN\tMinnesota\tMorrison County\t104\t38.9\t7.0\t19.7\t18002\t141667\t0.3681\t56364\tObama\t56364\t0.000243816\t56364.0\n10765\t-94.101665\t45.977919\tPierz city\tMN\tMinnesota\tMorrison County\t1328\t41.2\t7.7\t10.7\t16491\t114041\t0.3681\t56364\tObama\t56364\t0.0031133370000000003\t56364.0\n10766\t-92.874459\t43.819553000000006\tWaltham city\tMN\tMinnesota\tMower County\t190\t40.8\t8.9\t2.7\t19014\t127500\t0.6003\t55982\tObama\t55982\t0.00044543199999999995\t55982.0\n10767\t-92.640399\t43.557649\tTaopi city\tMN\tMinnesota\tMower County\t78\t38.1\t11.8\t4.2\t18460\t145833\t0.6003\t55977\tObama\t55977\t0.000182862\t55977.0\n10768\t-92.702347\t43.720156\tDexter city\tMN\tMinnesota\tMower County\t341\t39.0\t11.5\t13.5\t21924\t122619\t0.6003\t55926\tObama\t55926\t0.0007994339999999999\t55926.0\n10769\t-92.829553\t43.60467\tRose Creek city\tMN\tMinnesota\tMower County\t334\t42.0\t16.9\t5.3\t23083\t123295\t0.6003\t55970\tObama\t55970\t0.000783023\t55970.0\n10770\t-92.973997\t43.689999\tMapleview city\tMN\tMinnesota\tMower County\t205\t44.8\t11.8\t10.8\t23005\t88333\t0.6003\t55912\tObama\t55912\t0.00048059800000000005\t55912.0\n10771\t-92.569199\t43.705496999999994\tGrand Meadow city\tMN\tMinnesota\tMower County\t875\t40.4\t15.1\t5.0\t21710\t104596\t0.6003\t55936\tObama\t55936\t0.002051333\t55936.0\n10772\t-92.481971\t43.776973\tRacine city\tMN\tMinnesota\tMower County\t399\t40.1\t13.7\t6.3\t23720\t149479\t0.6003\t55967\tObama\t55967\t0.000935408\t55967.0\n10773\t-92.867623\t43.740188\tBrownsdale city\tMN\tMinnesota\tMower County\t642\t42.0\t10.9\t7.5\t24714\t100000\t0.6003\t55918\tObama\t55918\t0.0015050920000000002\t55918.0\n10774\t-92.507427\t43.51307\tLe Roy city\tMN\tMinnesota\tMower County\t862\t42.5\t15.1\t4.6\t19856\t85968\t0.6003\t55951\tObama\t55951\t0.002020856\t55951.0\n10775\t-92.800653\t43.805784\tSargeant city\tMN\tMinnesota\tMower County\t78\t39.0\t11.8\t13.6\t21866\t128125\t0.6003\t55973\tObama\t55973\t0.000182862\t55973.0\n10776\t-92.706342\t43.660156\tElkton city\tMN\tMinnesota\tMower County\t164\t42.7\t15.5\t4.7\t20370\t106944\t0.6003\t55933\tObama\t55933\t0.00038447800000000005\t55933.0\n10777\t-92.941164\t43.505853\tLyle city\tMN\tMinnesota\tMower County\t538\t39.2\t13.0\t5.7\t23319\t98056\t0.6003\t55953\tObama\t55953\t0.0012612769999999999\t55953.0\n10778\t-92.97424699999999\t43.670449\tAustin city\tMN\tMinnesota\tMower County\t22709\t40.7\t20.7\t7.1\t24831\t96264\t0.6003\t55912\tObama\t55912\t0.053238539\t55912.0\n10779\t-92.71911999999999\t43.565379\tAdams city\tMN\tMinnesota\tMower County\t881\t43.1\t15.4\t5.0\t20351\t103664\t0.6003\t55909\tObama\t55909\t0.002065399\t55909.0\n10780\t-95.645696\t43.949362\tAvoca city\tMN\tMinnesota\tMurray County\t133\t43.8\t9.5\t6.4\t21411\t91667\t0.4531\t56114\tObama\t56114\t0.000311803\t56114.0\n10781\t-95.95042600000001\t43.930279999999996\tChandler city\tMN\tMinnesota\tMurray County\t268\t41.1\t13.9\t2.4\t17439\t84500\t0.4531\t56122\tObama\t56122\t0.000628294\t56122.0\n10782\t-95.755912\t43.990319\tSlayton city\tMN\tMinnesota\tMurray County\t1860\t47.9\t15.1\t5.1\t23484\t73700\t0.4531\t56172\tObama\t56172\t0.004360548\t56172.0\n10783\t-95.953356\t43.995313\tLake Wilson city\tMN\tMinnesota\tMurray County\t237\t43.1\t12.0\t4.6\t19165\t59375\t0.4531\t56151\tObama\t56151\t0.000555618\t56151.0\n10784\t-95.547657\t44.054481\tDovray city\tMN\tMinnesota\tMurray County\t58\t46.9\t19.5\t5.4\t20753\t75000\t0.4531\t56123\tObama\t56123\t0.000135974\t56123.0\n10785\t-95.785718\t43.915017\tIona city\tMN\tMinnesota\tMurray County\t160\t42.0\t14.5\t3.6\t17844\t77500\t0.4531\t56141\tObama\t56141\t0.00037510099999999997\t56141.0\n10786\t-95.705443\t44.166925\tThe Lakes CDP\tMN\tMinnesota\tMurray County\t552\t50.0\t17.7\t5.4\t23839\t100893\t0.4531\t56132\tObama\t56132\t0.001294098\t56132.0\n10787\t-95.667034\t44.070492\tCurrie city\tMN\tMinnesota\tMurray County\t201\t50.3\t17.9\t5.3\t23796\t102273\t0.4531\t56123\tObama\t56123\t0.00047122099999999997\t56123.0\n10788\t-95.602255\t43.86975\tFulda city\tMN\tMinnesota\tMurray County\t1279\t46.7\t16.2\t3.4\t18266\t65233\t0.4531\t56131\tObama\t56131\t0.002998463\t56131.0\n10789\t-95.857556\t43.998583\tHadley city\tMN\tMinnesota\tMurray County\t71\t43.1\t12.0\t4.4\t19184\t62500\t0.4531\t56151\tObama\t56151\t0.000166451\t56151.0\n10790\t-94.015834\t44.184484999999995\tNorth Mankato city\tMN\tMinnesota\tNicollet County\t12070\t34.6\t41.5\t6.3\t30801\t161158\t0.5258\t56003\tObama\t56003\t0.028296673999999997\t56003.0\n10791\t-94.393561\t44.447084000000004\tLafayette city\tMN\tMinnesota\tNicollet County\t568\t40.8\t9.0\t9.2\t20415\t106048\t0.5258\t56054\tObama\t56054\t0.001331608\t56054.0\n10792\t-94.187685\t44.273821000000005\tNicollet city\tMN\tMinnesota\tNicollet County\t1007\t39.0\t24.7\t4.0\t22727\t143351\t0.5258\t56074\tObama\t56074\t0.002360791\t56074.0\n10793\t-93.964246\t44.3287\tSt. Peter city\tMN\tMinnesota\tNicollet County\t10422\t27.1\t34.5\t5.9\t21961\t142143\t0.5258\t56082\tObama\t56082\t0.024433135\t56082.0\n10794\t-94.34645400000001\t44.270012\tCourtland city\tMN\tMinnesota\tNicollet County\t615\t38.6\t23.6\t5.2\t23853\t160938\t0.5258\t56021\tObama\t56021\t0.001441794\t56021.0\n10795\t-95.947806\t43.748917\tLismore city\tMN\tMinnesota\tNobles County\t222\t39.8\t13.2\t6.8\t18943\t77500\t0.4452\t56155\tObama\t56155\t0.000520452\t56155.0\n10796\t-96.023136\t43.8291\tLeota CDP\tMN\tMinnesota\tNobles County\t209\t46.7\t12.8\t3.8\t18768\t93571\t0.4452\t56153\tObama\t56153\t0.0004899759999999999\t56153.0\n10797\t-95.827483\t43.764959999999995\tWilmont city\tMN\tMinnesota\tNobles County\t321\t39.5\t8.0\t3.8\t16392\t76875\t0.4452\t56185\tObama\t56185\t0.0007525460000000001\t56185.0\n10798\t-96.018252\t43.520337\tEllsworth city\tMN\tMinnesota\tNobles County\t525\t44.0\t10.1\t3.6\t20784\t47000\t0.4452\t56129\tObama\t56129\t0.0012308\t56129.0\n10799\t-95.5978\t43.627749\tWorthington city\tMN\tMinnesota\tNobles County\t11169\t36.4\t17.1\t6.0\t21842\t94665\t0.4452\t56187\tObama\t56187\t0.026184387000000003\t56187.0\n10800\t-95.482298\t43.826543\tKinbrae city\tMN\tMinnesota\tNobles County\t20\t42.5\t8.3\t0.0\t21119\t75000\t0.4452\t561HH\tObama\t561HH\t4.6899999999999995e-05\t0.0\n10801\t-95.933024\t43.633536\tAdrian city\tMN\tMinnesota\tNobles County\t1293\t42.1\t10.0\t6.2\t22170\t78553\t0.4452\t56110\tObama\t56110\t0.0030312840000000004\t56110.0\n10802\t-95.465137\t43.696486\tBrewster city\tMN\tMinnesota\tNobles County\t488\t39.6\t9.5\t3.9\t22140\t66579\t0.4452\t56119\tObama\t56119\t0.001144058\t56119.0\n10803\t-95.47069499999999\t43.537872\tRound Lake city\tMN\tMinnesota\tNobles County\t402\t44.2\t11.6\t5.5\t21797\t91154\t0.4452\t56167\tObama\t56167\t0.000942441\t56167.0\n10804\t-95.466747\t43.844153000000006\tDundee city\tMN\tMinnesota\tNobles County\t95\t40.8\t8.1\t3.3\t21600\t95000\t0.4452\t561HH\tObama\t561HH\t0.00022271599999999997\t0.0\n10805\t-95.79904499999999\t43.619726\tRushmore city\tMN\tMinnesota\tNobles County\t346\t45.0\t14.6\t6.1\t19014\t78667\t0.4452\t56168\tObama\t56168\t0.000811156\t56168.0\n10806\t-95.689059\t43.505509\tBigelow city\tMN\tMinnesota\tNobles County\t214\t37.3\t9.6\t4.5\t16199\t74444\t0.4452\t56117\tObama\t56117\t0.000501697\t56117.0\n10807\t-96.51605\t47.299289\tAda city\tMN\tMinnesota\tNorman County\t1553\t43.4\t23.4\t6.5\t21315\t70804\t0.5394\t56510\tObama\t56510\t0.003640823\t56510.0\n10808\t-96.505938\t47.180276\tBorup city\tMN\tMinnesota\tNorman County\t84\t43.0\t16.9\t4.3\t21171\t91250\t0.5394\t56519\tObama\t56519\t0.000196928\t56519.0\n10809\t-96.811002\t47.263873\tHendrum city\tMN\tMinnesota\tNorman County\t274\t40.6\t17.2\t6.1\t19806\t68000\t0.5394\t56550\tObama\t56550\t0.00064236\t56550.0\n10810\t-96.265576\t47.372454\tGary city\tMN\tMinnesota\tNorman County\t173\t41.5\t13.2\t9.3\t17997\t61250\t0.5394\t56545\tObama\t56545\t0.000405578\t56545.0\n10811\t-96.824114\t47.35049\tHalstad city\tMN\tMinnesota\tNorman County\t566\t45.7\t16.6\t8.4\t19503\t67059\t0.5394\t56548\tObama\t56548\t0.001326919\t56548.0\n10812\t-96.80155400000001\t47.176114\tPerley city\tMN\tMinnesota\tNorman County\t105\t41.1\t17.4\t5.4\t19854\t65000\t0.5394\t56574\tObama\t56574\t0.00024616\t56574.0\n10813\t-96.258838\t47.258803\tTwin Valley city\tMN\tMinnesota\tNorman County\t855\t48.0\t8.9\t5.8\t16663\t44559\t0.5394\t56584\tObama\t56584\t0.002004445\t56584.0\n10814\t-96.81959300000001\t47.458295\tShelly city\tMN\tMinnesota\tNorman County\t242\t45.9\t16.6\t8.2\t19506\t66250\t0.5394\t56581\tObama\t56581\t0.00056734\t56581.0\n10815\t-92.13382\t43.969932\tDover city\tMN\tMinnesota\tOlmsted County\t467\t38.5\t14.6\t6.0\t21935\t149167\t0.5023\t55929\tObama\t55929\t0.0010948260000000001\t55929.0\n10816\t-92.231944\t43.98872\tEyota city\tMN\tMinnesota\tOlmsted County\t1927\t33.0\t19.8\t5.7\t27735\t126087\t0.5023\t55934\tObama\t55934\t0.0045176209999999994\t55934.0\n10817\t-92.486579\t43.858345\tStewartville city\tMN\tMinnesota\tOlmsted County\t5695\t33.6\t21.1\t5.5\t26583\t127114\t0.5023\t55976\tObama\t55976\t0.013351248000000001\t55976.0\n10818\t-92.478657\t44.013015\tRochester city\tMN\tMinnesota\tOlmsted County\t97731\t36.4\t43.3\t6.1\t33142\t153314\t0.5023\t55902\tObama\t55902\t0.229118661\t55902.0\n10819\t-92.646423\t44.033865000000006\tByron city\tMN\tMinnesota\tOlmsted County\t4076\t31.1\t30.1\t4.4\t26327\t151677\t0.5023\t55920\tObama\t55920\t0.009555695\t55920.0\n10820\t-92.540722\t44.163839\tOronoco city\tMN\tMinnesota\tOlmsted County\t1045\t43.8\t35.5\t4.5\t32913\t192905\t0.5023\t55960\tObama\t55960\t0.002449878\t55960.0\n10821\t-95.55934599999999\t46.426618\tOttertail city\tMN\tMinnesota\tOtter Tail County\t431\t52.8\t19.2\t7.7\t21636\t133333\t0.3841\t56571\tObama\t56571\t0.001010428\t56571.0\n10822\t-95.534126\t46.261206\tVining city\tMN\tMinnesota\tOtter Tail County\t63\t47.0\t15.2\t9.1\t18587\t108333\t0.3841\t56588\tObama\t56588\t0.000147696\t56588.0\n10823\t-95.869954\t46.284791999999996\tUnderwood city\tMN\tMinnesota\tOtter Tail County\t322\t46.9\t19.0\t8.6\t23805\t107143\t0.3841\t56586\tObama\t56586\t0.000754891\t56586.0\n10824\t-95.511021\t46.12451\tUrbank city\tMN\tMinnesota\tOtter Tail County\t61\t44.4\t15.9\t8.3\t20914\t120000\t0.3841\t56588\tObama\t56588\t0.000143007\t56588.0\n10825\t-96.130813\t46.379767\tElizabeth city\tMN\tMinnesota\tOtter Tail County\t146\t40.4\t19.4\t7.1\t20350\t87500\t0.3841\t56533\tObama\t56533\t0.00034228\t56533.0\n10826\t-95.718327\t46.288065\tBattle Lake city\tMN\tMinnesota\tOtter Tail County\t724\t54.9\t27.2\t6.5\t22997\t126429\t0.3841\t56515\tObama\t56515\t0.0016973320000000002\t56515.0\n10827\t-95.572216\t46.599803\tPerham city\tMN\tMinnesota\tOtter Tail County\t2528\t41.5\t19.7\t7.3\t20781\t98913\t0.3841\t56573\tObama\t56573\t0.005926594\t56573.0\n10828\t-95.80399799999999\t46.654725\tVergas city\tMN\tMinnesota\tOtter Tail County\t314\t46.5\t21.1\t6.9\t22087\t121591\t0.3841\t56587\tObama\t56587\t0.0007361360000000001\t56587.0\n10829\t-95.321606\t46.390903\tDeer Creek city\tMN\tMinnesota\tOtter Tail County\t303\t39.3\t10.4\t8.9\t17769\t86000\t0.3841\t56527\tObama\t56527\t0.000710347\t56527.0\n10830\t-95.44225899999999\t46.32524\tHenning city\tMN\tMinnesota\tOtter Tail County\t756\t54.9\t12.5\t9.8\t16380\t67667\t0.3841\t56551\tObama\t56551\t0.001772352\t56551.0\n10831\t-95.372359\t46.520534000000005\tNew York Mills city\tMN\tMinnesota\tOtter Tail County\t1138\t43.6\t24.0\t6.0\t18429\t96250\t0.3841\t56567\tObama\t56567\t0.002667905\t56567.0\n10832\t-95.329661\t46.153234999999995\tParkers Prairie city\tMN\tMinnesota\tOtter Tail County\t926\t46.7\t11.5\t6.3\t19046\t80152\t0.3841\t56361\tObama\t56361\t0.002170896\t56361.0\n10833\t-96.270133\t46.471909000000004\tRothsay city\tMN\tMinnesota\tOtter Tail County\t473\t40.9\t18.9\t8.5\t20093\t78846\t0.3841\t56579\tObama\t56579\t0.001108892\t56579.0\n10834\t-95.23368599999999\t46.469598\tBluffton city\tMN\tMinnesota\tOtter Tail County\t190\t41.9\t11.6\t6.4\t21021\t120833\t0.3841\t56518\tObama\t56518\t0.00044543199999999995\t56518.0\n10835\t-96.08586899999999\t46.570218\tPelican Rapids city\tMN\tMinnesota\tOtter Tail County\t2276\t36.0\t24.5\t8.5\t16868\t91667\t0.3841\t56572\tObama\t56572\t0.00533581\t56572.0\n10836\t-95.63113299999999\t46.27451\tClitherall city\tMN\tMinnesota\tOtter Tail County\t108\t46.9\t16.5\t7.1\t18808\t110000\t0.3841\t56524\tObama\t56524\t0.00025319299999999997\t56524.0\n10837\t-96.076769\t46.283943\tFergus Falls city\tMN\tMinnesota\tOtter Tail County\t13039\t41.6\t24.2\t6.9\t23604\t105410\t0.3841\t56537\tObama\t56537\t0.030568379\t56537.0\n10838\t-95.915599\t46.173901\tDalton city\tMN\tMinnesota\tOtter Tail County\t308\t46.7\t19.2\t8.5\t24385\t127632\t0.3841\t56324\tObama\t56324\t0.000722069\t56324.0\n10839\t-95.626337\t46.505853\tRichville city\tMN\tMinnesota\tOtter Tail County\t116\t44.8\t20.7\t6.1\t21176\t133333\t0.3841\t56576\tObama\t56576\t0.000271948\t56576.0\n10840\t-95.718487\t46.552609999999994\tDent city\tMN\tMinnesota\tOtter Tail County\t180\t50.0\t16.2\t9.0\t19336\t112500\t0.3841\t56528\tObama\t56528\t0.000421989\t56528.0\n10841\t-96.096588\t46.483569\tErhard city\tMN\tMinnesota\tOtter Tail County\t141\t42.2\t21.2\t7.2\t20071\t97500\t0.3841\t56534\tObama\t56534\t0.000330558\t56534.0\n10842\t-95.80386\t48.144144\tGoodridge city\tMN\tMinnesota\tPennington County\t92\t42.1\t19.0\t6.6\t19097\t120833\t0.46399999999999997\t56725\tObama\t56725\t0.000215683\t56725.0\n10843\t-96.176374\t48.113877\tThief River Falls city\tMN\tMinnesota\tPennington County\t8654\t38.2\t19.6\t6.6\t22845\t84022\t0.46399999999999997\t56701\tObama\t56701\t0.02028827\t56701.0\n10844\t-96.213729\t48.013546999999996\tSt. Hilaire city\tMN\tMinnesota\tPennington County\t272\t44.3\t16.2\t5.9\t21498\t100000\t0.46399999999999997\t56754\tObama\t56754\t0.0006376719999999999\t56754.0\n10845\t-93.072749\t45.948312\tBrook Park city\tMN\tMinnesota\tPine County\t168\t39.7\t8.8\t12.0\t21251\t128125\t0.4834\t55007\tObama\t55007\t0.000393856\t55007.0\n10846\t-92.836845\t46.319697999999995\tWillow River city\tMN\tMinnesota\tPine County\t363\t39.4\t13.3\t13.3\t19634\t101667\t0.4834\t55795\tObama\t55795\t0.00085101\t55795.0\n10847\t-93.11964300000001\t45.871854\tHenriette city\tMN\tMinnesota\tPine County\t110\t42.2\t7.7\t11.5\t22143\t143750\t0.4834\t55036\tObama\t55036\t0.000257882\t55036.0\n10848\t-92.864648\t46.129021\tSandstone city\tMN\tMinnesota\tPine County\t2951\t35.7\t14.5\t9.1\t19227\t96071\t0.4834\t55704\tObama\t55704\t0.006918267\t55704.0\n10849\t-92.86958\t46.256564000000004\tRutledge city\tMN\tMinnesota\tPine County\t191\t43.9\t8.1\t11.5\t18522\t111250\t0.4834\t55795\tObama\t55795\t0.00044777699999999995\t55795.0\n10850\t-92.668056\t46.281151\tBruno city\tMN\tMinnesota\tPine County\t110\t51.6\t16.7\t10.7\t24295\t127083\t0.4834\t55712\tObama\t55712\t0.000257882\t55712.0\n10851\t-92.941427\t46.361674\tDenham city\tMN\tMinnesota\tPine County\t39\t43.8\t7.1\t10.5\t17746\t95000\t0.4834\t55795\tObama\t55795\t9.14e-05\t55795.0\n10852\t-92.908692\t45.760475\tRock Creek city\tMN\tMinnesota\tPine County\t1093\t39.2\t9.6\t7.5\t20113\t146691\t0.4834\t55063\tObama\t55063\t0.002562408\t55063.0\n10853\t-92.782622\t46.188562\tAskov city\tMN\tMinnesota\tPine County\t356\t42.9\t14.0\t10.4\t21140\t112500\t0.4834\t55704\tObama\t55704\t0.0008345989999999999\t55704.0\n10854\t-92.825808\t46.386794\tSturgeon Lake city\tMN\tMinnesota\tPine County\t408\t39.1\t13.2\t13.4\t19618\t100000\t0.4834\t55783\tObama\t55783\t0.000956507\t55783.0\n10855\t-92.925151\t46.205205\tFinlayson city\tMN\tMinnesota\tPine County\t303\t42.6\t10.0\t9.5\t19491\t125658\t0.4834\t55735\tObama\t55735\t0.000710347\t55735.0\n10856\t-92.928216\t46.012992\tHinckley city\tMN\tMinnesota\tPine County\t1334\t36.3\t22.1\t9.1\t23524\t114453\t0.4834\t55037\tObama\t55037\t0.0031274040000000003\t55037.0\n10857\t-92.970023\t45.83082\tPine City\tMN\tMinnesota\tPine County\t3028\t38.9\t15.1\t8.8\t21273\t123768\t0.4834\t55063\tObama\t55063\t0.007098784\t55063.0\n10858\t-92.584284\t46.338607\tKerrick city\tMN\tMinnesota\tPine County\t76\t51.4\t16.4\t10.3\t24479\t131250\t0.4834\t55756\tObama\t55756\t0.000178173\t55756.0\n10859\t-96.194276\t44.089558000000004\tHolland city\tMN\tMinnesota\tPipestone County\t167\t43.8\t13.9\t8.7\t18198\t81667\t0.3713\t56139\tObama\t56139\t0.00039151199999999995\t56139.0\n10860\t-96.31150699999999\t43.996251\tPipestone city\tMN\tMinnesota\tPipestone County\t4096\t40.6\t21.4\t3.8\t21591\t68676\t0.3713\t56164\tObama\t56164\t0.009602583\t56164.0\n10861\t-96.25774399999999\t43.891483\tTrosky city\tMN\tMinnesota\tPipestone County\t105\t40.3\t19.1\t7.1\t19867\t108929\t0.3713\t56177\tObama\t56177\t0.00024616\t56177.0\n10862\t-96.190427\t43.954596\tHatfield city\tMN\tMinnesota\tPipestone County\t48\t43.3\t14.3\t6.3\t18832\t85000\t0.3713\t56128\tObama\t56128\t0.00011253\t56128.0\n10863\t-96.09671800000001\t44.010984\tWoodstock city\tMN\tMinnesota\tPipestone County\t136\t44.4\t14.6\t5.6\t18671\t86667\t0.3713\t56186\tObama\t56186\t0.00031883599999999997\t56186.0\n10864\t-96.13054100000001\t43.875167\tEdgerton city\tMN\tMinnesota\tPipestone County\t1016\t48.9\t16.9\t2.4\t19267\t82031\t0.3713\t56128\tObama\t56128\t0.002381891\t56128.0\n10865\t-96.104615\t44.177826\tRuthton city\tMN\tMinnesota\tPipestone County\t266\t38.1\t11.2\t4.0\t17508\t66000\t0.3713\t56170\tObama\t56170\t0.000623605\t56170.0\n10866\t-96.397419\t43.852877\tJasper city\tMN\tMinnesota\tPipestone County\t598\t43.3\t13.7\t6.2\t20005\t57885\t0.3713\t56144\tObama\t56144\t0.00140194\t56144.0\n10867\t-96.37168100000001\t43.911611\tIhlen city\tMN\tMinnesota\tPipestone County\t108\t43.9\t13.5\t6.2\t20151\t52500\t0.3713\t56140\tObama\t56140\t0.00025319299999999997\t56140.0\n10868\t-95.88561999999999\t47.636749\tMcIntosh city\tMN\tMinnesota\tPolk County\t593\t53.0\t19.7\t6.3\t19941\t74000\t0.461\t56556\tObama\t56556\t0.001390218\t56556.0\n10869\t-96.607136\t47.773701\tCrookston city\tMN\tMinnesota\tPolk County\t7904\t37.3\t25.8\t6.5\t23036\t90909\t0.461\t56716\tObama\t56716\t0.018529984\t56716.0\n10870\t-95.69806\t47.783291999999996\tTrail city\tMN\tMinnesota\tPolk County\t57\t46.3\t12.2\t12.1\t16308\t70000\t0.461\t56646\tObama\t56646\t0.00013363\t56646.0\n10871\t-96.800166\t47.799683\tFisher city\tMN\tMinnesota\tPolk County\t400\t42.4\t17.2\t8.4\t21640\t128977\t0.461\t56723\tObama\t56723\t0.0009377519999999999\t56723.0\n10872\t-95.986482\t47.536404\tWinger city\tMN\tMinnesota\tPolk County\t190\t42.5\t13.5\t5.7\t17343\t64286\t0.461\t56592\tObama\t56592\t0.00044543199999999995\t56592.0\n10873\t-95.623099\t47.76828\tGully city\tMN\tMinnesota\tPolk County\t97\t45.7\t11.6\t12.5\t16371\t72500\t0.461\t56646\tObama\t56646\t0.000227405\t56646.0\n10874\t-96.291013\t47.532309000000005\tFertile city\tMN\tMinnesota\tPolk County\t893\t53.4\t17.8\t8.1\t16183\t71833\t0.461\t56540\tObama\t56540\t0.002093532\t56540.0\n10875\t-97.013919\t47.928346000000005\tEast Grand Forks city\tMN\tMinnesota\tPolk County\t7821\t36.5\t23.9\t7.3\t23327\t147336\t0.461\t56721\tObama\t56721\t0.018335401\t56721.0\n10876\t-95.63463399999999\t47.514533\tLengby city\tMN\tMinnesota\tPolk County\t73\t43.8\t19.6\t8.1\t20271\t90000\t0.461\t56651\tObama\t56651\t0.00017114\t56651.0\n10877\t-96.812916\t47.608614\tClimax city\tMN\tMinnesota\tPolk County\t218\t46.3\t14.7\t7.8\t21798\t68333\t0.461\t56523\tObama\t56523\t0.000511075\t56523.0\n10878\t-96.527061\t47.542543\tBeltrami city\tMN\tMinnesota\tPolk County\t91\t45.0\t14.7\t8.3\t21691\t67500\t0.461\t56517\tObama\t56517\t0.00021333900000000003\t56517.0\n10879\t-95.757122\t47.583653999999996\tFosston city\tMN\tMinnesota\tPolk County\t1618\t42.5\t17.9\t9.4\t18752\t81818\t0.461\t56542\tObama\t56542\t0.0037932079999999997\t56542.0\n10880\t-96.816861\t47.529575\tNielsville city\tMN\tMinnesota\tPolk County\t82\t45.8\t14.8\t7.0\t21698\t70000\t0.461\t56568\tObama\t56568\t0.00019223900000000003\t56568.0\n10881\t-96.014648\t47.665559\tErskine city\tMN\tMinnesota\tPolk County\t458\t44.3\t16.7\t5.9\t18801\t64545\t0.461\t56535\tObama\t56535\t0.001073726\t56535.0\n10882\t-96.144062\t47.696926\tMentor city\tMN\tMinnesota\tPolk County\t155\t49.8\t22.8\t8.1\t21998\t132813\t0.461\t56736\tObama\t56736\t0.000363379\t56736.0\n10883\t-95.429648\t45.648238\tLong Beach city\tMN\tMinnesota\tPope County\t252\t50.3\t28.6\t4.4\t28673\t144318\t0.4773\t56334\tObama\t56334\t0.000590784\t56334.0\n10884\t-95.517558\t45.70519\tLowry city\tMN\tMinnesota\tPope County\t289\t43.1\t17.0\t5.6\t22101\t123295\t0.4773\t56349\tObama\t56349\t0.000677526\t56349.0\n10885\t-95.61845799999999\t45.752741\tFarwell city\tMN\tMinnesota\tPope County\t58\t41.9\t9.5\t8.8\t22400\t97500\t0.4773\t56327\tObama\t56327\t0.000135974\t56327.0\n10886\t-95.245109\t45.578105\tSedan city\tMN\tMinnesota\tPope County\t61\t47.5\t17.8\t10.3\t19045\t100000\t0.4773\t56334\tObama\t56334\t0.000143007\t56334.0\n10887\t-95.269673\t45.714064\tVillard city\tMN\tMinnesota\tPope County\t248\t41.4\t7.0\t5.0\t19918\t108036\t0.4773\t56385\tObama\t56385\t0.000581406\t56385.0\n10888\t-95.385708\t45.652667\tGlenwood city\tMN\tMinnesota\tPope County\t2430\t46.9\t20.5\t6.5\t23363\t98735\t0.4773\t56334\tObama\t56334\t0.005696845\t56334.0\n10889\t-95.737782\t45.614781\tCyrus city\tMN\tMinnesota\tPope County\t306\t42.2\t10.0\t7.3\t22564\t91111\t0.4773\t56323\tObama\t56323\t0.00071738\t56323.0\n10890\t-95.168033\t45.714323\tWestport city\tMN\tMinnesota\tPope County\t73\t43.1\t8.0\t4.9\t19966\t104167\t0.4773\t56385\tObama\t56385\t0.00017114\t56385.0\n10891\t-95.533583\t45.612171000000004\tStarbuck city\tMN\tMinnesota\tPope County\t1428\t46.0\t18.9\t8.4\t22241\t97821\t0.4773\t56381\tObama\t56381\t0.003347775\t56381.0\n10892\t-93.088149\t45.100321\tNorth Oaks city\tMN\tMinnesota\tRamsey County\t4366\t49.0\t78.7\t6.1\t87623\t555869\t0.6633\t55127\tObama\t55127\t0.010235566\t55127.0\n10893\t-93.154436\t45.015527\tRoseville city\tMN\tMinnesota\tRamsey County\t32843\t43.6\t48.9\t6.6\t34689\t179665\t0.6633\t55113\tObama\t55113\t0.076996492\t55113.0\n10894\t-93.16709300000001\t45.072247\tArden Hills city\tMN\tMinnesota\tRamsey County\t9539\t38.5\t57.2\t5.9\t37750\t220585\t0.6633\t55112\tObama\t55112\t0.022363047\t55112.0\n10895\t-93.074874\t45.056946999999994\tVadnais Heights city\tMN\tMinnesota\tRamsey County\t12691\t36.9\t42.3\t7.3\t39163\t173663\t0.6633\t55127\tObama\t55127\t0.029752534\t55127.0\n10896\t-92.999492\t45.013699\tNorth St. Paul city\tMN\tMinnesota\tRamsey County\t11613\t37.8\t24.3\t7.3\t31132\t153923\t0.6633\t55109\tObama\t55109\t0.027225292\t55109.0\n10897\t-93.04039499999999\t45.058034\tGem Lake city\tMN\tMinnesota\tRamsey County\t403\t37.0\t28.9\t7.7\t29903\t176250\t0.6633\t55110\tObama\t55110\t0.000944785\t55110.0\n10898\t-93.20770999999999\t45.107166\tMounds View city\tMN\tMinnesota\tRamsey County\t12568\t34.3\t28.5\t8.1\t29575\t150500\t0.6633\t55112\tObama\t55112\t0.029464175\t55112.0\n10899\t-93.206051\t45.065781\tNew Brighton city\tMN\tMinnesota\tRamsey County\t21618\t39.1\t46.3\t6.1\t34121\t181315\t0.6633\t55112\tObama\t55112\t0.05068082\t55112.0\n10900\t-93.08618\t45.024246000000005\tLittle Canada city\tMN\tMinnesota\tRamsey County\t9714\t38.2\t33.4\t7.4\t33404\t152662\t0.6633\t55117\tObama\t55117\t0.022773312999999996\t55117.0\n10901\t-93.104101\t44.947842\tSt. Paul city\tMN\tMinnesota\tRamsey County\t287444\t31.8\t37.0\t9.9\t26895\t136795\t0.6633\t551HH\tObama\t551HH\t0.673878138\t0.0\n10902\t-92.982446\t45.06562\tWhite Bear Lake city\tMN\tMinnesota\tRamsey County\t24236\t40.2\t36.4\t7.7\t32799\t165592\t0.6633\t55115\tObama\t55115\t0.056818408\t55115.0\n10903\t-93.02459300000001\t45.014228\tMaplewood city\tMN\tMinnesota\tRamsey County\t36462\t40.0\t30.7\t7.3\t32382\t162743\t0.6633\t55109\tObama\t55109\t0.08548080599999999\t55109.0\n10904\t-93.202626\t44.994182\tLauderdale city\tMN\tMinnesota\tRamsey County\t2258\t33.4\t63.4\t5.8\t27808\t138816\t0.6633\t55108\tObama\t55108\t0.005293611\t55108.0\n10905\t-93.177027\t44.989955\tFalcon Heights city\tMN\tMinnesota\tRamsey County\t5532\t29.8\t75.7\t6.5\t31315\t213436\t0.6633\t55108\tObama\t55108\t0.012969113\t55108.0\n10906\t-93.135807\t45.084193\tShoreview city\tMN\tMinnesota\tRamsey County\t25641\t41.9\t52.3\t5.6\t41351\t204587\t0.6633\t55126\tObama\t55126\t0.060112263\t55126.0\n10907\t-96.27405999999999\t47.884693\tRed Lake Falls city\tMN\tMinnesota\tRed Lake County\t1549\t43.8\t13.2\t10.3\t18744\t70476\t0.4699\t56750\tObama\t56750\t0.003631446\t56750.0\n10908\t-96.003525\t47.816691\tBrooks city\tMN\tMinnesota\tRed Lake County\t126\t46.4\t8.7\t12.5\t18743\t57500\t0.4699\t56715\tObama\t56715\t0.000295392\t56715.0\n10909\t-95.84992199999999\t47.839285\tOklee city\tMN\tMinnesota\tRed Lake County\t355\t46.1\t8.5\t12.4\t18683\t55385\t0.4699\t56742\tObama\t56742\t0.000832255\t56742.0\n10910\t-96.041876\t47.915096999999996\tPlummer city\tMN\tMinnesota\tRed Lake County\t245\t40.0\t7.8\t12.5\t19260\t82143\t0.4699\t56748\tObama\t56748\t0.000574373\t56748.0\n10911\t-95.55351800000001\t44.417561\tMilroy city\tMN\tMinnesota\tRedwood County\t256\t42.0\t14.4\t8.6\t18766\t75000\t0.3861\t56263\tObama\t56263\t0.000600161\t56263.0\n10912\t-95.05475799999999\t44.380077\tClements city\tMN\tMinnesota\tRedwood County\t180\t42.5\t11.2\t11.1\t19934\t91250\t0.3861\t56224\tObama\t56224\t0.000421989\t56224.0\n10913\t-95.413938\t44.506949\tVesta city\tMN\tMinnesota\tRedwood County\t317\t34.7\t15.4\t4.5\t21058\t65000\t0.3861\t56292\tObama\t56292\t0.0007431689999999999\t56292.0\n10914\t-95.256093\t44.402491999999995\tWabasso city\tMN\tMinnesota\tRedwood County\t708\t41.0\t23.7\t3.7\t20352\t61364\t0.3861\t56293\tObama\t56293\t0.0016598210000000001\t56293.0\n10915\t-95.129626\t44.209697999999996\tSanborn city\tMN\tMinnesota\tRedwood County\t363\t42.1\t12.6\t5.4\t20506\t52083\t0.3861\t56083\tObama\t56083\t0.00085101\t56083.0\n10916\t-95.265149\t44.230776\tLamberton city\tMN\tMinnesota\tRedwood County\t738\t55.2\t17.7\t7.8\t19477\t48023\t0.3861\t56152\tObama\t56152\t0.001730153\t56152.0\n10917\t-95.328715\t44.606632\tBelview city\tMN\tMinnesota\tRedwood County\t380\t43.7\t12.8\t3.8\t19535\t93125\t0.3861\t56214\tObama\t56214\t0.000890865\t56214.0\n10918\t-95.361225\t44.221525\tRevere city\tMN\tMinnesota\tRedwood County\t90\t45.0\t21.9\t25.5\t19837\t71667\t0.3861\t56166\tObama\t56166\t0.00021099400000000002\t56166.0\n10919\t-95.33102099999999\t44.476302000000004\tSeaforth city\tMN\tMinnesota\tRedwood County\t71\t45.0\t12.0\t2.6\t19557\t90000\t0.3861\t56287\tObama\t56287\t0.000166451\t56287.0\n10920\t-95.082949\t44.570074\tRedwood Falls city\tMN\tMinnesota\tRedwood County\t5122\t41.7\t20.3\t5.7\t25774\t97911\t0.3861\t56283\tObama\t56283\t0.012007917\t56283.0\n10921\t-95.213062\t44.314921000000005\tWanda city\tMN\tMinnesota\tRedwood County\t95\t41.7\t14.1\t5.7\t19800\t80000\t0.3861\t56294\tObama\t56294\t0.00022271599999999997\t56294.0\n10922\t-95.46924399999999\t44.225084\tWalnut Grove city\tMN\tMinnesota\tRedwood County\t449\t46.9\t14.4\t5.0\t20796\t40526\t0.3861\t56180\tObama\t56180\t0.001052627\t56180.0\n10923\t-94.925038\t44.415914\tMorgan city\tMN\tMinnesota\tRedwood County\t820\t44.0\t12.6\t6.2\t20889\t65781\t0.3861\t56266\tObama\t56266\t0.0019223920000000002\t56266.0\n10924\t-95.21325\t44.598024\tDelhi city\tMN\tMinnesota\tRedwood County\t64\t43.8\t13.3\t2.9\t19418\t90000\t0.3861\t56283\tObama\t56283\t0.00015004\t56283.0\n10925\t-95.413371\t44.410061999999996\tLucan city\tMN\tMinnesota\tRedwood County\t214\t42.5\t14.6\t8.7\t18724\t77000\t0.3861\t56255\tObama\t56255\t0.000501697\t56255.0\n10926\t-94.722627\t44.528887\tFairfax city\tMN\tMinnesota\tRenville County\t1186\t39.5\t13.6\t7.8\t20194\t69487\t0.4402\t55332\tObama\t55332\t0.002780435\t55332.0\n10927\t-95.207605\t44.789871000000005\tRenville city\tMN\tMinnesota\tRenville County\t1158\t40.2\t16.6\t7.8\t19802\t72500\t0.4402\t56284\tObama\t56284\t0.002714793\t56284.0\n10928\t-95.102886\t44.791106\tDanube city\tMN\tMinnesota\tRenville County\t459\t40.4\t13.0\t9.2\t24815\t81333\t0.4402\t56230\tObama\t56230\t0.001076071\t56230.0\n10929\t-94.61775300000001\t44.736573\tBuffalo Lake city\tMN\tMinnesota\tRenville County\t710\t42.8\t9.8\t4.2\t20306\t77885\t0.4402\t55314\tObama\t55314\t0.00166451\t55314.0\n10930\t-94.713379\t44.742215\tHector city\tMN\tMinnesota\tRenville County\t1160\t42.2\t17.3\t6.1\t20738\t75857\t0.4402\t55342\tObama\t55342\t0.0027194809999999997\t55342.0\n10931\t-94.984911\t44.553247\tMorton city\tMN\tMinnesota\tRenville County\t471\t38.2\t11.8\t9.1\t22013\t67083\t0.4402\t56270\tObama\t56270\t0.001104203\t56270.0\n10932\t-94.894163\t44.765042\tBird Island city\tMN\tMinnesota\tRenville County\t1020\t44.9\t16.1\t11.0\t22473\t74074\t0.4402\t55310\tObama\t55310\t0.0023912679999999998\t55310.0\n10933\t-95.35079499999999\t44.781731\tSacred Heart city\tMN\tMinnesota\tRenville County\t467\t43.0\t10.6\t12.4\t20273\t47333\t0.4402\t56285\tObama\t56285\t0.0010948260000000001\t56285.0\n10934\t-94.884971\t44.531459000000005\tFranklin city\tMN\tMinnesota\tRenville County\t457\t45.3\t15.4\t11.8\t22923\t61250\t0.4402\t55333\tObama\t55333\t0.001071382\t55333.0\n10935\t-94.998067\t44.777321\tOlivia city\tMN\tMinnesota\tRenville County\t2349\t42.2\t24.4\t6.4\t22132\t87123\t0.4402\t56277\tObama\t56277\t0.00550695\t56277.0\n10936\t-93.428784\t44.477429\tLonsdale city\tMN\tMinnesota\tRice County\t2062\t36.9\t12.4\t7.6\t24440\t179012\t0.5285\t55046\tObama\t55046\t0.004834113\t55046.0\n10937\t-93.164541\t44.474221\tNorthfield city\tMN\tMinnesota\tRice County\t19423\t26.0\t48.3\t7.6\t25498\t223526\t0.5285\t55057\tObama\t55057\t0.045534904\t55057.0\n10938\t-93.063927\t44.342966\tNerstrand city\tMN\tMinnesota\tRice County\t248\t37.4\t23.1\t8.7\t22028\t228846\t0.5285\t55053\tObama\t55053\t0.000581406\t55053.0\n10939\t-93.206011\t44.428135\tDundas city\tMN\tMinnesota\tRice County\t812\t36.6\t21.1\t7.2\t27178\t194712\t0.5285\t55019\tObama\t55019\t0.0019036370000000001\t55019.0\n10940\t-93.44495400000001\t44.224999\tMorristown city\tMN\tMinnesota\tRice County\t1179\t36.1\t15.3\t8.6\t20119\t107813\t0.5285\t55052\tObama\t55052\t0.002764025\t55052.0\n10941\t-93.275785\t44.297112\tFaribault city\tMN\tMinnesota\tRice County\t22756\t36.4\t18.8\t9.2\t22985\t150380\t0.5285\t55021\tObama\t55021\t0.053348725\t55021.0\n10942\t-96.197526\t43.774116\tHardwick city\tMN\tMinnesota\tRock County\t211\t41.3\t8.5\t4.6\t19877\t76250\t0.4016\t56134\tObama\t56134\t0.000494664\t56134.0\n10943\t-96.35931\t43.525845000000004\tHills city\tMN\tMinnesota\tRock County\t568\t41.1\t14.9\t2.3\t20579\t87586\t0.4016\t56138\tObama\t56138\t0.001331608\t56138.0\n10944\t-96.362338\t43.612596999999994\tBeaver Creek city\tMN\tMinnesota\tRock County\t240\t41.4\t14.3\t3.8\t20258\t111458\t0.4016\t56116\tObama\t56116\t0.000562651\t56116.0\n10945\t-96.073226\t43.645897\tMagnolia city\tMN\tMinnesota\tRock County\t212\t40.2\t10.5\t4.4\t20606\t107500\t0.4016\t56158\tObama\t56158\t0.000497009\t56158.0\n10946\t-96.263141\t43.513863\tSteen city\tMN\tMinnesota\tRock County\t183\t41.1\t14.8\t2.1\t20578\t86111\t0.4016\t56173\tObama\t56173\t0.000429022\t56173.0\n10947\t-96.072927\t43.754191\tKenneth city\tMN\tMinnesota\tRock County\t58\t41.3\t7.7\t3.4\t19865\t75000\t0.4016\t56147\tObama\t56147\t0.000135974\t56147.0\n10948\t-96.21426\t43.653560999999996\tLuverne city\tMN\tMinnesota\tRock County\t4478\t44.7\t20.2\t4.8\t23962\t102039\t0.4016\t56156\tObama\t56156\t0.010498136000000002\t56156.0\n10949\t-96.167759\t48.553794\tStrathcona city\tMN\tMinnesota\tRoseau County\t28\t42.5\t11.1\t6.7\t20202\t75000\t0.377\t56759\tObama\t56759\t6.56e-05\t56759.0\n10950\t-95.08811899999999\t48.807187\tRoosevelt city\tMN\tMinnesota\tRoseau County\t168\t35.8\t11.7\t4.9\t18526\t92000\t0.377\t56673\tObama\t56673\t0.000393856\t56673.0\n10951\t-95.321067\t48.908122\tWarroad city\tMN\tMinnesota\tRoseau County\t1742\t35.3\t20.8\t5.6\t21703\t108801\t0.377\t56763\tObama\t56763\t0.004083911\t56763.0\n10952\t-96.021266\t48.776727\tBadger city\tMN\tMinnesota\tRoseau County\t445\t36.6\t10.0\t3.8\t19665\t84444\t0.377\t56714\tObama\t56714\t0.001043249\t56714.0\n10953\t-95.760269\t48.844782\tRoseau city\tMN\tMinnesota\tRoseau County\t2704\t40.2\t23.0\t5.1\t22135\t99830\t0.377\t56751\tObama\t56751\t0.006339205\t56751.0\n10954\t-96.183325\t48.701297\tGreenbush city\tMN\tMinnesota\tRoseau County\t753\t41.7\t11.7\t5.9\t20282\t78077\t0.377\t56726\tObama\t56726\t0.001765319\t56726.0\n10955\t-92.240751\t46.805686\tHermantown city\tMN\tMinnesota\tSt. Louis County\t9197\t41.4\t28.5\t8.3\t27367\t166390\t0.6348\t55810\tObama\t55810\t0.021561267999999998\t55810.0\n10956\t-92.227571\t46.742436\tProctor city\tMN\tMinnesota\tSt. Louis County\t2809\t40.4\t19.2\t9.7\t26605\t116839\t0.6348\t55810\tObama\t55810\t0.006585365\t55810.0\n10957\t-92.824505\t48.059802000000005\tOrr city\tMN\tMinnesota\tSt. Louis County\t246\t45.0\t14.9\t7.1\t20788\t95833\t0.6348\t55771\tObama\t55771\t0.000576718\t55771.0\n10958\t-92.35062099999999\t47.535284000000004\tBiwabik city\tMN\tMinnesota\tSt. Louis County\t840\t46.0\t12.7\t10.3\t21860\t66200\t0.6348\t55708\tObama\t55708\t0.00196928\t55708.0\n10959\t-92.40755899999999\t47.514893\tMcKinley city\tMN\tMinnesota\tSt. Louis County\t70\t45.4\t11.8\t10.0\t21990\t63750\t0.6348\t55741\tObama\t55741\t0.000164107\t55741.0\n10960\t-92.608828\t47.418642999999996\tIron Junction city\tMN\tMinnesota\tSt. Louis County\t88\t43.5\t14.5\t10.6\t24396\t85000\t0.6348\t55751\tObama\t55751\t0.000206305\t55751.0\n10961\t-92.512664\t47.516878999999996\tVirginia city\tMN\tMinnesota\tSt. Louis County\t8894\t45.9\t21.1\t8.8\t24817\t84571\t0.6348\t55792\tObama\t55792\t0.020850921\t55792.0\n10962\t-92.544178\t47.464209999999994\tEveleth city\tMN\tMinnesota\tSt. Louis County\t3521\t43.3\t16.1\t10.2\t20899\t73969\t0.6348\t55734\tObama\t55734\t0.008254564\t55734.0\n10963\t-92.769532\t47.499098\tBuhl city\tMN\tMinnesota\tSt. Louis County\t898\t42.9\t13.3\t13.4\t21446\t63286\t0.6348\t55713\tObama\t55713\t0.002105254\t55713.0\n10964\t-92.24004000000001\t47.531344\tAurora city\tMN\tMinnesota\tSt. Louis County\t1737\t48.3\t23.5\t11.2\t23668\t70429\t0.6348\t55705\tObama\t55705\t0.004072189\t55705.0\n10965\t-92.687844\t47.852413\tCook city\tMN\tMinnesota\tSt. Louis County\t589\t47.0\t20.5\t10.4\t18655\t93462\t0.6348\t55723\tObama\t55723\t0.00138084\t55723.0\n10966\t-92.461253\t47.491195000000005\tGilbert city\tMN\tMinnesota\tSt. Louis County\t1708\t45.7\t18.0\t8.4\t24084\t71181\t0.6348\t55741\tObama\t55741\t0.004004202\t55741.0\n10967\t-92.94856999999999\t47.397869\tHibbing city\tMN\tMinnesota\tSt. Louis County\t16277\t43.7\t21.2\t8.2\t24225\t94062\t0.6348\t55746\tObama\t55746\t0.038159483\t55746.0\n10968\t-92.13699799999999\t46.782543\tDuluth city\tMN\tMinnesota\tSt. Louis County\t85039\t36.5\t33.4\t8.6\t24124\t129572\t0.6348\t55806\tObama\t55806\t0.199363782\t55806.0\n10969\t-92.602915\t46.865438\tBrookston city\tMN\tMinnesota\tSt. Louis County\t92\t33.5\t12.7\t14.0\t19234\t145833\t0.6348\t55711\tObama\t55711\t0.000215683\t55711.0\n10970\t-92.731183\t47.073002\tMeadowlands city\tMN\tMinnesota\tSt. Louis County\t106\t42.5\t14.5\t7.7\t17235\t72500\t0.6348\t55765\tObama\t55765\t0.00024850400000000003\t55765.0\n10971\t-92.110723\t46.874703000000004\tArnold CDP\tMN\tMinnesota\tSt. Louis County\t3059\t42.0\t22.7\t10.5\t25131\t142289\t0.6348\t55812\tObama\t55812\t0.00717146\t55812.0\n10972\t-91.80051800000001\t47.928444\tWinton city\tMN\tMinnesota\tSt. Louis County\t186\t48.0\t26.4\t7.8\t24943\t157813\t0.6348\t55796\tObama\t55796\t0.000436055\t55796.0\n10973\t-91.94578299999999\t47.644442\tBabbitt city\tMN\tMinnesota\tSt. Louis County\t1552\t48.9\t10.3\t10.0\t22870\t69440\t0.6348\t55706\tObama\t55706\t0.003638479\t55706.0\n10974\t-92.283611\t47.811226\tTower city\tMN\tMinnesota\tSt. Louis County\t391\t53.6\t21.0\t7.0\t23208\t107292\t0.6348\t55790\tObama\t55790\t0.000916653\t55790.0\n10975\t-91.851607\t47.905305\tEly city\tMN\tMinnesota\tSt. Louis County\t3402\t41.6\t26.8\t8.7\t20659\t90357\t0.6348\t55796\tObama\t55796\t0.007975583\t55796.0\n10976\t-92.625164\t47.525110999999995\tMountain Iron city\tMN\tMinnesota\tSt. Louis County\t2768\t45.0\t21.1\t7.1\t24841\t114759\t0.6348\t55768\tObama\t55768\t0.006489246\t55768.0\n10977\t-92.879272\t47.487826\tChisholm city\tMN\tMinnesota\tSt. Louis County\t4771\t43.0\t15.7\t8.9\t22528\t72313\t0.6348\t55719\tObama\t55719\t0.01118504\t55719.0\n10978\t-92.56784\t47.467915999999995\tLeonidas city\tMN\tMinnesota\tSt. Louis County\t59\t46.9\t22.2\t5.4\t28230\t115625\t0.6348\t55792\tObama\t55792\t0.00013831799999999999\t55792.0\n10979\t-92.718539\t47.516581\tKinney city\tMN\tMinnesota\tSt. Louis County\t200\t41.7\t19.0\t9.3\t21974\t105000\t0.6348\t55758\tObama\t55758\t0.00046887599999999996\t55758.0\n10980\t-92.115836\t47.559538\tHoyt Lakes city\tMN\tMinnesota\tSt. Louis County\t1924\t49.1\t22.4\t9.9\t29250\t63425\t0.6348\t55750\tObama\t55750\t0.004510588\t55750.0\n10981\t-92.915951\t46.927343\tFloodwood city\tMN\tMinnesota\tSt. Louis County\t465\t42.3\t9.8\t13.2\t17481\t71786\t0.6348\t55736\tObama\t55736\t0.001090137\t55736.0\n10982\t-93.572073\t44.550872\tNew Prague city\tMN\tMinnesota\tScott County\t5965\t35.6\t26.3\t7.6\t23543\t192844\t0.4147\t56071\tObama\t56071\t0.01398423\t56071.0\n10983\t-93.474346\t44.774592999999996\tShakopee city\tMN\tMinnesota\tScott County\t37259\t33.5\t33.8\t6.3\t35691\t224604\t0.4147\t55379\tObama\t55379\t0.08734927699999999\t55379.0\n10984\t-93.3485\t44.572025\tNew Market city\tMN\tMinnesota\tScott County\t1152\t37.4\t30.7\t7.6\t39092\t321429\t0.4147\t55020\tObama\t55020\t0.0027007259999999996\t55020.0\n10985\t-93.36296999999999\t44.754421\tSavage city\tMN\tMinnesota\tScott County\t28982\t31.5\t45.1\t6.7\t36212\t259752\t0.4147\t55378\tObama\t55378\t0.067944839\t55378.0\n10986\t-93.634443\t44.668440999999994\tJordan city\tMN\tMinnesota\tScott County\t4826\t34.6\t22.5\t8.1\t25358\t169731\t0.4147\t55352\tObama\t55352\t0.011313981\t55352.0\n10987\t-93.765139\t44.62301\tBelle Plaine city\tMN\tMinnesota\tScott County\t6721\t36.9\t21.0\t7.5\t28789\t192073\t0.4147\t56011\tObama\t56011\t0.015756581999999998\t56011.0\n10988\t-93.435878\t44.728935\tPrior Lake city\tMN\tMinnesota\tScott County\t22369\t33.3\t37.0\t7.7\t41141\t264048\t0.4147\t55372\tObama\t55372\t0.05244145\t55372.0\n10989\t-93.319733\t44.566153\tElko city\tMN\tMinnesota\tScott County\t1291\t37.4\t30.8\t7.6\t39075\t322527\t0.4147\t55020\tObama\t55020\t0.003026595\t55020.0\n10990\t-93.595731\t45.442842999999996\tZimmerman city\tMN\tMinnesota\tSherburne County\t4550\t29.6\t15.0\t8.5\t25379\t170849\t0.3784\t55398\tObama\t55398\t0.010666931999999999\t55398.0\n10991\t-93.875\t45.377325\tBecker city\tMN\tMinnesota\tSherburne County\t3580\t29.9\t21.7\t8.3\t28202\t212326\t0.3784\t55308\tObama\t55308\t0.008392883\t55308.0\n10992\t-93.998124\t45.447297999999996\tClear Lake city\tMN\tMinnesota\tSherburne County\t299\t40.0\t35.4\t8.2\t35485\t231250\t0.3784\t55319\tObama\t55319\t0.00070097\t55319.0\n10993\t-93.752509\t45.342658\tBig Lake city\tMN\tMinnesota\tSherburne County\t8923\t31.8\t16.8\t7.7\t27814\t194482\t0.3784\t55309\tObama\t55309\t0.020918908\t55309.0\n10994\t-93.566906\t45.331319\tElk River city\tMN\tMinnesota\tSherburne County\t24155\t33.3\t27.0\t8.1\t31057\t225835\t0.3784\t55330\tObama\t55330\t0.056628513\t55330.0\n10995\t-94.52358100000001\t44.535288\tGibbon city\tMN\tMinnesota\tSibley County\t804\t41.7\t11.8\t10.1\t20847\t75000\t0.3731\t55335\tObama\t55335\t0.001884882\t55335.0\n10996\t-94.22842299999999\t44.673086\tNew Auburn city\tMN\tMinnesota\tSibley County\t472\t34.4\t13.8\t9.0\t19042\t118000\t0.3731\t55336\tObama\t55336\t0.001106548\t55336.0\n10997\t-93.909062\t44.528624\tHenderson city\tMN\tMinnesota\tSibley County\t915\t39.8\t14.3\t10.0\t22789\t107552\t0.3731\t56044\tObama\t56044\t0.0021451079999999997\t56044.0\n10998\t-94.002285\t44.679738\tGreen Isle city\tMN\tMinnesota\tSibley County\t333\t42.0\t10.0\t6.3\t23759\t177500\t0.3731\t55338\tObama\t55338\t0.0007806789999999999\t55338.0\n10999\t-94.213738\t44.555729\tGaylord city\tMN\tMinnesota\tSibley County\t2267\t39.5\t15.6\t4.2\t22124\t102869\t0.3731\t55334\tObama\t55334\t0.005314711\t55334.0\n11000\t-94.075988\t44.608912\tArlington city\tMN\tMinnesota\tSibley County\t2022\t37.5\t18.0\t7.2\t22124\t105534\t0.3731\t55307\tObama\t55307\t0.004740338\t55307.0\n11001\t-94.36026\t44.543267\tWinthrop city\tMN\tMinnesota\tSibley County\t1398\t43.0\t19.1\t3.6\t22502\t95385\t0.3731\t55396\tObama\t55396\t0.003277444\t55396.0\n11002\t-94.953314\t45.736546000000004\tSauk Centre city\tMN\tMinnesota\tStearns County\t3957\t40.3\t23.1\t8.2\t22926\t110523\t0.4275\t56378\tObama\t56378\t0.009276714\t56378.0\n11003\t-95.117149\t45.509153999999995\tBrooten city\tMN\tMinnesota\tStearns County\t739\t39.7\t18.3\t7.6\t20997\t76563\t0.4275\t56316\tObama\t56316\t0.0017324970000000002\t56316.0\n11004\t-94.27420500000001\t45.700859\tSt. Stephen city\tMN\tMinnesota\tStearns County\t916\t34.5\t22.5\t7.8\t26936\t170343\t0.4275\t56375\tObama\t56375\t0.0021474529999999997\t56375.0\n11005\t-94.664298\t45.502186\tSt. Martin city\tMN\tMinnesota\tStearns County\t279\t35.1\t9.0\t4.7\t19282\t150000\t0.4275\t56376\tObama\t56376\t0.000654082\t56376.0\n11006\t-94.611708\t45.688934\tSt. Anthony city\tMN\tMinnesota\tStearns County\t100\t38.9\t7.5\t5.4\t18844\t150000\t0.4275\t56331\tObama\t56331\t0.00023443799999999998\t56331.0\n11007\t-94.522288\t45.455657\tRichmond city\tMN\tMinnesota\tStearns County\t1436\t40.5\t9.3\t7.5\t20252\t137165\t0.4275\t56368\tObama\t56368\t0.003366531\t56368.0\n11008\t-94.99961400000001\t45.450482\tBelgrade city\tMN\tMinnesota\tStearns County\t876\t45.6\t19.5\t8.0\t17263\t67000\t0.4275\t56312\tObama\t56312\t0.0020536770000000003\t56312.0\n11009\t-94.63659399999999\t45.432448\tRoscoe city\tMN\tMinnesota\tStearns County\t125\t42.7\t18.7\t6.0\t23770\t170833\t0.4275\t56371\tObama\t56371\t0.000293048\t56371.0\n11010\t-94.12955799999999\t45.567648999999996\tSt. Cloud city\tMN\tMinnesota\tStearns County\t64962\t30.5\t34.9\t8.7\t25595\t142345\t0.4275\t56304\tObama\t56304\t0.152295653\t56304.0\n11011\t-94.44957099999999\t45.609019\tAvon city\tMN\tMinnesota\tStearns County\t1342\t37.4\t25.8\t5.7\t24923\t163322\t0.4275\t56310\tObama\t56310\t0.0031461590000000004\t56310.0\n11012\t-94.300719\t45.313865\tKimball city\tMN\tMinnesota\tStearns County\t724\t37.0\t14.6\t9.8\t21810\t125321\t0.4275\t55353\tObama\t55353\t0.0016973320000000002\t55353.0\n11013\t-94.339907\t45.472101\tRockville city\tMN\tMinnesota\tStearns County\t777\t37.4\t23.2\t6.7\t23969\t200909\t0.4275\t56369\tObama\t56369\t0.001821584\t56369.0\n11014\t-94.752499\t45.630604\tNew Munich city\tMN\tMinnesota\tStearns County\t345\t40.5\t10.0\t6.5\t21000\t123438\t0.4275\t56356\tObama\t56356\t0.0008088110000000001\t56356.0\n11015\t-94.94760699999999\t45.562999\tElrosa city\tMN\tMinnesota\tStearns County\t164\t35.6\t6.9\t8.8\t16693\t122917\t0.4275\t56325\tObama\t56325\t0.00038447800000000005\t56325.0\n11016\t-94.796374\t45.460471999999996\tLake Henry city\tMN\tMinnesota\tStearns County\t83\t37.9\t9.4\t8.5\t19019\t115625\t0.4275\t56362\tObama\t56362\t0.000194584\t56362.0\n11017\t-94.19054100000001\t45.619676\tSartell city\tMN\tMinnesota\tStearns County\t13815\t32.5\t31.5\t6.1\t26931\t173474\t0.4275\t56377\tObama\t56377\t0.032387618\t56377.0\n11018\t-94.473016\t45.731553999999996\tHoldingford city\tMN\tMinnesota\tStearns County\t796\t38.7\t12.7\t8.1\t19066\t131713\t0.4275\t56340\tObama\t56340\t0.0018661270000000002\t56340.0\n11019\t-94.716238\t45.728575\tSt. Rosa city\tMN\tMinnesota\tStearns County\t45\t35.6\t14.3\t8.7\t21977\t200000\t0.4275\t56331\tObama\t56331\t0.00010549700000000001\t56331.0\n11020\t-94.56875\t45.630623\tAlbany city\tMN\tMinnesota\tStearns County\t2004\t36.3\t20.4\t7.9\t21622\t127288\t0.4275\t56307\tObama\t56307\t0.0046981390000000005\t56307.0\n11021\t-94.870886\t45.628492\tMeire Grove city\tMN\tMinnesota\tStearns County\t163\t40.4\t11.4\t5.1\t20877\t144444\t0.4275\t56335\tObama\t56335\t0.000382134\t56335.0\n11022\t-94.686552\t45.664253\tFreeport city\tMN\tMinnesota\tStearns County\t637\t41.0\t9.9\t6.7\t21004\t123370\t0.4275\t56331\tObama\t56331\t0.00149337\t56331.0\n11023\t-94.811846\t45.675292999999996\tMelrose city\tMN\tMinnesota\tStearns County\t3244\t37.3\t15.5\t6.6\t18892\t112648\t0.4275\t56352\tObama\t56352\t0.007605171\t56352.0\n11024\t-94.83165699999999\t45.523235\tSpring Hill city\tMN\tMinnesota\tStearns County\t54\t34.2\t6.1\t7.7\t16799\t131250\t0.4275\t56335\tObama\t56335\t0.000126597\t56335.0\n11025\t-94.295926\t45.495863\tPleasant Lake city\tMN\tMinnesota\tStearns County\t523\t37.4\t23.2\t6.8\t23968\t201389\t0.4275\t56369\tObama\t56369\t0.001226111\t56369.0\n11026\t-94.310884\t45.565255\tSt. Joseph city\tMN\tMinnesota\tStearns County\t5127\t24.1\t32.7\t9.3\t21702\t139388\t0.4275\t56374\tObama\t56374\t0.012019638999999999\t56374.0\n11027\t-94.71987299999999\t45.377499\tPaynesville city\tMN\tMinnesota\tStearns County\t2543\t42.1\t18.5\t7.9\t22801\t116223\t0.4275\t56362\tObama\t56362\t0.00596176\t56362.0\n11028\t-94.85983399999999\t45.601677\tGreenwald city\tMN\tMinnesota\tStearns County\t220\t40.2\t11.9\t4.7\t20870\t142708\t0.4275\t56335\tObama\t56335\t0.000515764\t56335.0\n11029\t-94.238404\t45.533590999999994\tWaite Park city\tMN\tMinnesota\tStearns County\t6669\t29.8\t21.4\t9.3\t24532\t137799\t0.4275\t56387\tObama\t56387\t0.015634673999999998\t56387.0\n11030\t-94.428781\t45.459188\tCold Spring city\tMN\tMinnesota\tStearns County\t3572\t38.5\t20.7\t7.2\t21783\t145407\t0.4275\t56320\tObama\t56320\t0.008374128\t56320.0\n11031\t-93.297534\t43.872572\tEllendale city\tMN\tMinnesota\tSteele County\t666\t42.1\t18.0\t14.8\t20513\t116768\t0.4552\t56026\tObama\t56026\t0.0015613570000000002\t56026.0\n11032\t-93.2449\t44.172665\tMedford city\tMN\tMinnesota\tSteele County\t1270\t35.3\t14.8\t8.7\t22524\t149020\t0.4552\t55049\tObama\t55049\t0.002977363\t55049.0\n11033\t-93.04305\t43.868657\tBlooming Prairie city\tMN\tMinnesota\tSteele County\t1929\t41.9\t20.6\t9.9\t22723\t121686\t0.4552\t55917\tObama\t55917\t0.00452231\t55917.0\n11034\t-93.230375\t44.090457\tOwatonna city\tMN\tMinnesota\tSteele County\t24478\t36.3\t27.5\t8.6\t26027\t159949\t0.4552\t55060\tObama\t55060\t0.057385748\t55060.0\n11035\t-95.905662\t45.584832\tMorris city\tMN\tMinnesota\tStevens County\t4969\t29.0\t31.7\t4.9\t22369\t100120\t0.4851\t56267\tObama\t56267\t0.011649227\t56267.0\n11036\t-95.795829\t45.497192\tHancock city\tMN\tMinnesota\tStevens County\t695\t39.3\t10.9\t10.4\t19450\t58594\t0.4851\t56244\tObama\t56244\t0.001629345\t56244.0\n11037\t-96.050494\t45.575227000000005\tAlberta city\tMN\tMinnesota\tStevens County\t132\t43.0\t20.0\t2.9\t21660\t90000\t0.4851\t56207\tObama\t56207\t0.000309458\t56207.0\n11038\t-96.174704\t45.573159999999994\tChokio city\tMN\tMinnesota\tStevens County\t409\t59.9\t20.9\t4.5\t24370\t69231\t0.4851\t56221\tObama\t56221\t0.000958852\t56221.0\n11039\t-96.007867\t45.689368\tDonnelly city\tMN\tMinnesota\tStevens County\t238\t46.9\t14.6\t3.0\t23372\t83571\t0.4851\t56235\tObama\t56235\t0.0005579630000000001\t56235.0\n11040\t-95.676849\t45.376909000000005\tClontarf city\tMN\tMinnesota\tSwift County\t163\t42.7\t8.1\t6.7\t21773\t98750\t0.5374\t56226\tObama\t56226\t0.000382134\t56226.0\n11041\t-96.023308\t45.199269\tAppleton city\tMN\tMinnesota\tSwift County\t2833\t39.8\t13.6\t8.8\t17544\t59364\t0.5374\t56208\tObama\t56208\t0.00664163\t56208.0\n11042\t-95.608187\t45.316659\tBenson city\tMN\tMinnesota\tSwift County\t3242\t43.6\t25.3\t8.0\t21756\t84957\t0.5374\t56215\tObama\t56215\t0.0076004819999999996\t56215.0\n11043\t-95.756047\t45.28134\tDanvers city\tMN\tMinnesota\tSwift County\t97\t44.2\t17.6\t4.6\t22911\t90000\t0.5374\t56231\tObama\t56231\t0.000227405\t56231.0\n11044\t-95.39288499999999\t45.222934\tMurdock city\tMN\tMinnesota\tSwift County\t218\t39.4\t14.5\t9.5\t19110\t77143\t0.5374\t56271\tObama\t56271\t0.000511075\t56271.0\n11045\t-95.911245\t45.244051\tHolloway city\tMN\tMinnesota\tSwift County\t96\t43.4\t13.4\t7.3\t19209\t78750\t0.5374\t56249\tObama\t56249\t0.00022506099999999998\t56249.0\n11046\t-95.468508\t45.259741999999996\tDe Graff city\tMN\tMinnesota\tSwift County\t122\t38.6\t14.3\t9.9\t19111\t78750\t0.5374\t56271\tObama\t56271\t0.000286014\t56271.0\n11047\t-95.31965500000001\t45.191790999999995\tKerkhoven city\tMN\tMinnesota\tSwift County\t633\t38.9\t15.4\t9.2\t19093\t82813\t0.5374\t56252\tObama\t56252\t0.0014839929999999999\t56252.0\n11048\t-95.090262\t46.323948\tHewitt city\tMN\tMinnesota\tTodd County\t265\t38.8\t9.5\t6.9\t16339\t75000\t0.4083\t56453\tObama\t56453\t0.000621261\t56453.0\n11049\t-95.062865\t46.266529999999996\tBertha city\tMN\tMinnesota\tTodd County\t455\t44.3\t16.4\t8.7\t16968\t58800\t0.4083\t56437\tObama\t56437\t0.001066693\t56437.0\n11050\t-94.949054\t46.128448999999996\tClarissa city\tMN\tMinnesota\tTodd County\t597\t47.2\t14.4\t9.9\t18604\t79318\t0.4083\t56440\tObama\t56440\t0.001399595\t56440.0\n11051\t-94.863998\t45.976669\tLong Prairie city\tMN\tMinnesota\tTodd County\t2998\t41.7\t19.1\t10.6\t18732\t91649\t0.4083\t56347\tObama\t56347\t0.0070284530000000005\t56347.0\n11052\t-94.867651\t46.085547\tBrowerville city\tMN\tMinnesota\tTodd County\t717\t40.2\t16.9\t7.3\t19804\t86316\t0.4083\t56438\tObama\t56438\t0.0016809210000000002\t56438.0\n11053\t-94.801358\t46.377882\tStaples city\tMN\tMinnesota\tTodd County\t2804\t37.7\t12.1\t9.3\t19596\t73455\t0.4083\t56479\tObama\t56479\t0.0065736430000000005\t56479.0\n11054\t-95.033744\t46.164805\tEagle Bend city\tMN\tMinnesota\tTodd County\t563\t42.8\t10.1\t8.8\t15782\t65357\t0.4083\t56446\tObama\t56446\t0.0013198860000000001\t56446.0\n11055\t-95.08346999999999\t45.800894\tWest Union city\tMN\tMinnesota\tTodd County\t85\t40.4\t13.0\t6.3\t18807\t143750\t0.4083\t56360\tObama\t56360\t0.000199272\t56360.0\n11056\t-94.74926500000001\t45.824312\tGrey Eagle city\tMN\tMinnesota\tTodd County\t347\t45.0\t15.8\t11.3\t22985\t105469\t0.4083\t56336\tObama\t56336\t0.0008135\t56336.0\n11057\t-94.68736\t45.865815999999995\tBurtrum city\tMN\tMinnesota\tTodd County\t143\t40.3\t10.0\t9.5\t21619\t101042\t0.4083\t56318\tObama\t56318\t0.000335246\t56318.0\n11058\t-96.42308100000001\t45.717263\tDumont city\tMN\tMinnesota\tTraverse County\t103\t43.3\t12.9\t4.1\t18453\t71667\t0.5106\t56236\tObama\t56236\t0.000241471\t56236.0\n11059\t-96.83270300000001\t45.594572\tBrowns Valley city\tMN\tMinnesota\tTraverse County\t711\t48.0\t14.3\t6.0\t18082\t31964\t0.5106\t56219\tObama\t56219\t0.001666855\t56219.0\n11060\t-96.498115\t45.805694\tWheaton city\tMN\tMinnesota\tTraverse County\t1376\t50.1\t12.8\t5.7\t21174\t55889\t0.5106\t56296\tObama\t56296\t0.003225868\t56296.0\n11061\t-96.32005799999999\t46.010745\tTintah city\tMN\tMinnesota\tTraverse County\t66\t46.0\t15.2\t5.7\t18347\t75000\t0.5106\t56565\tObama\t56565\t0.000154729\t56565.0\n11062\t-92.37368000000001\t44.221993\tHammond city\tMN\tMinnesota\tWabasha County\t202\t38.3\t15.9\t9.8\t25183\t131250\t0.4603\t55991\tObama\t55991\t0.000473565\t55991.0\n11063\t-92.16865\t44.164505\tPlainview city\tMN\tMinnesota\tWabasha County\t3450\t34.2\t23.2\t4.3\t20677\t117234\t0.4603\t55964\tObama\t55964\t0.008088113000000001\t55964.0\n11064\t-92.29645699999999\t44.24416\tMillville city\tMN\tMinnesota\tWabasha County\t190\t34.2\t14.9\t7.3\t18890\t148611\t0.4603\t55957\tObama\t55957\t0.00044543199999999995\t55957.0\n11065\t-92.042161\t44.370652\tWabasha city\tMN\tMinnesota\tWabasha County\t2554\t46.3\t23.2\t8.8\t23050\t113368\t0.4603\t55981\tObama\t55981\t0.0059875480000000005\t55981.0\n11066\t-92.275435\t44.46555\tLake City\tMN\tMinnesota\tWabasha County\t5441\t45.1\t25.1\t4.9\t27344\t138657\t0.4603\t55041\tObama\t55041\t0.012755775\t55041.0\n11067\t-92.541303\t44.274133\tMazeppa city\tMN\tMinnesota\tWabasha County\t803\t38.9\t15.1\t4.6\t20262\t114167\t0.4603\t55956\tObama\t55956\t0.0018825379999999998\t55956.0\n11068\t-91.998909\t44.307373999999996\tKellogg city\tMN\tMinnesota\tWabasha County\t473\t49.7\t20.6\t6.6\t25154\t128241\t0.4603\t55945\tObama\t55945\t0.001108892\t55945.0\n11069\t-92.254162\t44.130855\tElgin city\tMN\tMinnesota\tWabasha County\t854\t32.5\t20.7\t6.6\t25718\t128869\t0.4603\t55932\tObama\t55932\t0.002002101\t55932.0\n11070\t-92.42616600000001\t44.286384000000005\tZumbro Falls city\tMN\tMinnesota\tWabasha County\t181\t39.1\t16.1\t9.1\t25341\t135938\t0.4603\t55991\tObama\t55991\t0.00042433300000000005\t55991.0\n11071\t-95.101271\t46.74712\tMenahga city\tMN\tMinnesota\tWadena County\t1300\t44.8\t10.3\t10.8\t17959\t78919\t0.36700000000000005\t56464\tObama\t56464\t0.003047695\t56464.0\n11072\t-95.08783000000001\t46.629041\tSebeka city\tMN\tMinnesota\tWadena County\t703\t40.2\t13.6\t8.4\t16761\t58793\t0.36700000000000005\t56477\tObama\t56477\t0.0016480999999999998\t56477.0\n11073\t-95.011162\t46.397077\tVerndale city\tMN\tMinnesota\tWadena County\t574\t37.8\t10.7\t10.3\t17369\t68611\t0.36700000000000005\t56481\tObama\t56481\t0.001345674\t56481.0\n11074\t-94.93946700000001\t46.374757\tAldrich city\tMN\tMinnesota\tWadena County\t53\t38.8\t11.8\t11.1\t17350\t65000\t0.36700000000000005\t56434\tObama\t56434\t0.00012425200000000002\t56434.0\n11075\t-94.880477\t46.637419\tNimrod city\tMN\tMinnesota\tWadena County\t71\t42.5\t8.0\t11.8\t18782\t90000\t0.36700000000000005\t56477\tObama\t56477\t0.000166451\t56477.0\n11076\t-95.12666800000001\t46.44583\tWadena city\tMN\tMinnesota\tWadena County\t4128\t43.9\t16.3\t8.0\t19874\t75478\t0.36700000000000005\t56482\tObama\t56482\t0.009677603\t56482.0\n11077\t-93.709328\t44.119473\tJanesville city\tMN\tMinnesota\tWaseca County\t2540\t36.2\t21.6\t7.9\t22215\t117640\t0.4483\t56048\tObama\t56048\t0.005954727\t56048.0\n11078\t-93.493578\t43.893485\tNew Richland city\tMN\tMinnesota\tWaseca County\t1151\t41.9\t19.3\t7.5\t20078\t94000\t0.4483\t56072\tObama\t56072\t0.002698382\t56072.0\n11079\t-93.697549\t43.933141\tWaldorf city\tMN\tMinnesota\tWaseca County\t223\t40.6\t14.6\t5.2\t20312\t113636\t0.4483\t56091\tObama\t56091\t0.000522797\t56091.0\n11080\t-93.50267\t44.082086\tWaseca city\tMN\tMinnesota\tWaseca County\t9171\t35.4\t20.5\t7.6\t22715\t121162\t0.4483\t56093\tObama\t56093\t0.021500314\t56093.0\n11081\t-92.964341\t45.058685\tMahtomedi city\tMN\tMinnesota\tWashington County\t8557\t39.3\t50.4\t7.8\t37239\t255381\t0.4939\t55115\tObama\t55115\t0.020060865\t55115.0\n11082\t-92.994051\t44.841004\tSt. Paul Park city\tMN\tMinnesota\tWashington County\t5447\t36.8\t16.5\t7.7\t27924\t141291\t0.4939\t55071\tObama\t55071\t0.012769841\t55071.0\n11083\t-92.902975\t44.994172999999996\tLake Elmo city\tMN\tMinnesota\tWashington County\t8038\t41.0\t38.9\t10.1\t40112\t282748\t0.4939\t55042\tObama\t55042\t0.018844131\t55042.0\n11084\t-92.927533\t44.815683\tCottage Grove city\tMN\tMinnesota\tWashington County\t34706\t34.7\t29.2\t7.1\t32607\t192219\t0.4939\t55016\tObama\t55016\t0.081364073\t55016.0\n11085\t-92.923129\t44.905479\tWoodbury city\tMN\tMinnesota\tWashington County\t62442\t34.2\t56.8\t6.2\t43536\t240352\t0.4939\t55129\tObama\t55129\t0.146387814\t55129.0\n11086\t-92.967409\t45.097957\tDellwood city\tMN\tMinnesota\tWashington County\t1114\t50.2\t65.2\t6.8\t62852\t502976\t0.4939\t55115\tObama\t55115\t0.00261164\t55115.0\n11087\t-92.761116\t44.947747\tLakeland Shores city\tMN\tMinnesota\tWashington County\t370\t46.4\t40.4\t7.2\t40327\t219565\t0.4939\t55043\tObama\t55043\t0.0008674210000000001\t55043.0\n11088\t-92.81733\t44.904194\tAfton city\tMN\tMinnesota\tWashington County\t2974\t45.4\t57.3\t5.5\t47742\t349784\t0.4939\t55001\tObama\t55001\t0.006972188000000001\t55001.0\n11089\t-92.956889\t45.05405\tWillernie city\tMN\tMinnesota\tWashington County\t700\t36.5\t21.4\t5.7\t30586\t157622\t0.4939\t55090\tObama\t55090\t0.001641066\t55090.0\n11090\t-92.778172\t45.198634999999996\tMarine on St. Croix city\tMN\tMinnesota\tWashington County\t673\t48.5\t56.8\t4.8\t44733\t289024\t0.4939\t55047\tObama\t55047\t0.0015777679999999998\t55047.0\n11091\t-92.994897\t45.277878\tForest Lake city\tMN\tMinnesota\tWashington County\t7893\t36.6\t23.0\t9.2\t29089\t165016\t0.4939\t55025\tObama\t55025\t0.018504196\t55025.0\n11092\t-92.765556\t44.924475\tLake St. Croix Beach city\tMN\tMinnesota\tWashington County\t1201\t43.3\t35.7\t6.1\t34212\t171121\t0.4939\t55043\tObama\t55043\t0.0028156009999999996\t55043.0\n11093\t-92.77034599999999\t44.912942\tSt. Marys Point city\tMN\tMinnesota\tWashington County\t356\t41.6\t37.2\t8.8\t35546\t171429\t0.4939\t55043\tObama\t55043\t0.0008345989999999999\t55043.0\n11094\t-92.954341\t45.036733\tPine Springs city\tMN\tMinnesota\tWashington County\t409\t41.3\t62.5\t5.9\t43059\t347619\t0.4939\t55090\tObama\t55090\t0.000958852\t55090.0\n11095\t-92.783456\t45.016436\tBayport city\tMN\tMinnesota\tWashington County\t3439\t36.1\t19.4\t9.8\t25661\t176563\t0.4939\t55003\tObama\t55003\t0.008062325\t55003.0\n11096\t-92.816168\t45.031888\tOak Park Heights city\tMN\tMinnesota\tWashington County\t4893\t38.4\t35.8\t6.2\t35161\t220530\t0.4939\t55082\tObama\t55082\t0.011471054\t55082.0\n11097\t-92.977634\t45.059853000000004\tBirchwood Village city\tMN\tMinnesota\tWashington County\t1008\t46.7\t61.7\t6.9\t45730\t289919\t0.4939\t55115\tObama\t55115\t0.002363136\t55115.0\n11098\t-92.776198\t44.950319\tLakeland city\tMN\tMinnesota\tWashington County\t1961\t42.5\t33.1\t6.5\t37547\t215734\t0.4939\t55043\tObama\t55043\t0.00459733\t55043.0\n11099\t-92.99759499999999\t44.874136\tNewport city\tMN\tMinnesota\tWashington County\t3679\t35.7\t18.6\t11.8\t28180\t146789\t0.4939\t55055\tObama\t55055\t0.008624976\t55055.0\n11100\t-92.96400799999999\t44.987446000000006\tOakdale city\tMN\tMinnesota\tWashington County\t27961\t35.1\t29.7\t7.0\t32810\t181983\t0.4939\t55128\tObama\t55128\t0.06555122599999999\t55128.0\n11101\t-92.958768\t45.167109\tHugo city\tMN\tMinnesota\tWashington County\t11696\t33.3\t31.5\t5.9\t34713\t225683\t0.4939\t55038\tObama\t55038\t0.027419876\t55038.0\n11102\t-92.977126\t44.950343\tLandfall city\tMN\tMinnesota\tWashington County\t691\t40.5\t16.3\t7.4\t25828\t127045\t0.4939\t55119\tObama\t55119\t0.0016199670000000002\t55119.0\n11103\t-92.908969\t45.082507\tGrant city\tMN\tMinnesota\tWashington County\t4259\t46.1\t50.9\t5.9\t51648\t380055\t0.4939\t55115\tObama\t55115\t0.009984716999999999\t55115.0\n11104\t-92.82619100000001\t45.05525\tStillwater city\tMN\tMinnesota\tWashington County\t17871\t40.1\t45.0\t6.7\t36044\t218325\t0.4939\t55082\tObama\t55082\t0.041896426\t55082.0\n11105\t-94.742772\t43.867292\tOdin city\tMN\tMinnesota\tWatonwan County\t106\t50.5\t16.0\t5.2\t22575\t81667\t0.4848\t56160\tObama\t56160\t0.00024850400000000003\t56160.0\n11106\t-94.835739\t44.053865\tDarfur city\tMN\tMinnesota\tWatonwan County\t118\t46.9\t10.5\t11.9\t22512\t82500\t0.4848\t56022\tObama\t56022\t0.000276637\t56022.0\n11107\t-94.697771\t43.851665999999994\tOrmsby city\tMN\tMinnesota\tWatonwan County\t136\t48.6\t17.8\t5.1\t22078\t100000\t0.4848\t56162\tObama\t56162\t0.00031883599999999997\t56162.0\n11108\t-94.625187\t43.983875\tSt. James city\tMN\tMinnesota\tWatonwan County\t4521\t35.3\t18.0\t6.6\t20356\t72877\t0.4848\t56081\tObama\t56081\t0.010598945\t56081.0\n11109\t-94.571157\t44.070981\tLa Salle city\tMN\tMinnesota\tWatonwan County\t78\t42.9\t22.2\t6.5\t22674\t110417\t0.4848\t56056\tObama\t56056\t0.000182862\t56056.0\n11110\t-94.43544200000001\t43.924085999999996\tLewisville city\tMN\tMinnesota\tWatonwan County\t234\t41.0\t10.7\t7.6\t18637\t80000\t0.4848\t56060\tObama\t56060\t0.000548585\t56060.0\n11111\t-94.41783199999999\t44.049293\tMadelia city\tMN\tMinnesota\tWatonwan County\t2173\t38.1\t22.3\t11.8\t21497\t76831\t0.4848\t56062\tObama\t56062\t0.005094339\t56062.0\n11112\t-94.793311\t43.957588\tButterfield city\tMN\tMinnesota\tWatonwan County\t514\t41.4\t14.5\t7.9\t17227\t55625\t0.4848\t56120\tObama\t56120\t0.0012050119999999999\t56120.0\n11113\t-96.454131\t46.044331\tTenney city\tMN\tMinnesota\tWilkin County\t5\t0.0\t0.0\t0.0\t19799\t0\t0.3904\t56583\tObama\t56583\t1.17e-05\t56583.0\n11114\t-96.31217099999999\t46.276952\tFoxhome city\tMN\tMinnesota\tWilkin County\t122\t43.4\t14.3\t6.2\t19436\t66667\t0.3904\t56543\tObama\t56543\t0.000286014\t56543.0\n11115\t-96.683304\t46.437638\tKent city\tMN\tMinnesota\tWilkin County\t104\t41.8\t20.0\t4.9\t19641\t93333\t0.3904\t56553\tObama\t56553\t0.000243816\t56553.0\n11116\t-96.48559300000001\t46.185138\tDoran city\tMN\tMinnesota\tWilkin County\t51\t41.7\t14.7\t7.4\t19180\t60000\t0.3904\t56522\tObama\t56522\t0.000119563\t56522.0\n11117\t-96.73608\t46.563524\tWolverton city\tMN\tMinnesota\tWilkin County\t104\t42.0\t18.1\t8.9\t21487\t95833\t0.3904\t56594\tObama\t56594\t0.000243816\t56594.0\n11118\t-96.30601\t46.03761\tNashua city\tMN\tMinnesota\tWilkin County\t59\t44.4\t12.8\t6.3\t19416\t65000\t0.3904\t56565\tObama\t56565\t0.00013831799999999999\t56565.0\n11119\t-96.58506\t46.265066999999995\tBreckenridge city\tMN\tMinnesota\tWilkin County\t3298\t39.8\t17.3\t4.9\t23800\t87338\t0.3904\t56520\tObama\t56520\t0.007731767\t56520.0\n11120\t-96.405557\t46.097508000000005\tCampbell city\tMN\tMinnesota\tWilkin County\t206\t42.9\t13.6\t5.5\t19406\t73750\t0.3904\t56522\tObama\t56522\t0.000482942\t56522.0\n11121\t-91.769851\t44.026809\tStockton city\tMN\tMinnesota\tWinona County\t737\t38.2\t27.5\t8.1\t24840\t146250\t0.5501\t55988\tObama\t55988\t0.0017278089999999999\t55988.0\n11122\t-91.74973299999999\t44.092303\tMinnesota City\tMN\tMinnesota\tWinona County\t256\t39.3\t24.3\t8.0\t25300\t139583\t0.5501\t55959\tObama\t55959\t0.000600161\t55959.0\n11123\t-91.94357099999999\t44.064029999999995\tAltura city\tMN\tMinnesota\tWinona County\t380\t38.2\t18.3\t4.9\t19143\t147917\t0.5501\t55910\tObama\t55910\t0.000890865\t55910.0\n11124\t-91.949529\t43.977109999999996\tUtica city\tMN\tMinnesota\tWinona County\t301\t31.8\t21.5\t5.9\t21312\t142045\t0.5501\t55979\tObama\t55979\t0.000705659\t55979.0\n11125\t-92.06137199999999\t43.96942\tSt. Charles city\tMN\tMinnesota\tWinona County\t3431\t35.4\t24.2\t6.5\t22352\t136310\t0.5501\t55972\tObama\t55972\t0.00804357\t55972.0\n11126\t-91.358129\t43.912256\tDakota city\tMN\tMinnesota\tWinona County\t344\t43.0\t27.9\t13.9\t24907\t148333\t0.5501\t55925\tObama\t55925\t0.000806467\t55925.0\n11127\t-91.71168\t44.06622\tGoodview city\tMN\tMinnesota\tWinona County\t3567\t38.7\t27.0\t7.6\t27074\t130864\t0.5501\t55959\tObama\t55959\t0.008362406\t55959.0\n11128\t-91.67023499999999\t44.052431\tWinona city\tMN\tMinnesota\tWinona County\t26864\t30.8\t30.9\t9.3\t23020\t123177\t0.5501\t55987\tObama\t55987\t0.06297944\t55987.0\n11129\t-91.868039\t43.983858000000005\tLewiston city\tMN\tMinnesota\tWinona County\t1349\t35.0\t21.9\t5.8\t20352\t137500\t0.5501\t55952\tObama\t55952\t0.003162569\t55952.0\n11130\t-92.017401\t44.086523\tElba city\tMN\tMinnesota\tWinona County\t195\t38.5\t18.3\t5.2\t19139\t148438\t0.5501\t55910\tObama\t55910\t0.00045715400000000003\t55910.0\n11131\t-91.819532\t44.099276\tRollingstone city\tMN\tMinnesota\tWinona County\t647\t40.0\t20.5\t4.9\t22121\t149306\t0.5501\t55969\tObama\t55969\t0.001516814\t55969.0\n11132\t-91.865771\t44.199233\tMinneiska city\tMN\tMinnesota\tWinona County\t118\t45.3\t20.9\t6.0\t23671\t143750\t0.5501\t55910\tObama\t55910\t0.000276637\t55910.0\n11133\t-94.121003\t45.259873\tAnnandale city\tMN\tMinnesota\tWright County\t3248\t37.8\t18.7\t11.1\t24368\t133714\t0.3796\t55302\tObama\t55302\t0.0076145480000000005\t55302.0\n11134\t-93.69210600000001\t45.201401000000004\tSt. Michael city\tMN\tMinnesota\tWright County\t15926\t32.7\t23.3\t6.8\t31914\t232216\t0.3796\t55376\tObama\t55376\t0.037336605\t55376.0\n11135\t-93.61965500000001\t45.265972\tOtsego city\tMN\tMinnesota\tWright County\t11546\t35.3\t19.6\t6.1\t27898\t187784\t0.3796\t55301\tObama\t55301\t0.027068217999999998\t55301.0\n11136\t-93.863771\t45.180139000000004\tBuffalo city\tMN\tMinnesota\tWright County\t13660\t33.2\t28.1\t8.8\t28988\t185290\t0.3796\t55313\tObama\t55313\t0.032024238999999996\t55313.0\n11137\t-93.80093000000001\t45.302686\tMonticello city\tMN\tMinnesota\tWright County\t10241\t30.7\t24.1\t8.3\t28910\t189663\t0.3796\t55362\tObama\t55362\t0.024008802000000003\t55362.0\n11138\t-93.783244\t45.040393\tDelano city\tMN\tMinnesota\tWright County\t4716\t35.0\t26.7\t6.8\t29659\t217708\t0.3796\t55328\tObama\t55328\t0.011056099\t55328.0\n11139\t-93.647306\t45.162490999999996\tHanover city\tMN\tMinnesota\tWright County\t2726\t34.9\t26.8\t6.8\t32475\t257743\t0.3796\t55341\tObama\t55341\t0.006390781999999999\t55341.0\n11140\t-93.727621\t45.09135\tRockford city\tMN\tMinnesota\tWright County\t4042\t30.5\t18.5\t8.0\t27465\t149500\t0.3796\t553HH\tObama\t553HH\t0.009475986\t0.0\n11141\t-94.00662700000001\t45.231803\tMaple Lake city\tMN\tMinnesota\tWright County\t2487\t34.3\t13.2\t9.2\t29674\t150943\t0.3796\t55358\tObama\t55358\t0.005830475\t55358.0\n11142\t-94.06534\t45.061652\tHoward Lake city\tMN\tMinnesota\tWright County\t2695\t35.7\t12.6\t10.0\t27481\t131838\t0.3796\t55349\tObama\t55349\t0.0063181059999999995\t55349.0\n11143\t-93.910158\t45.064901\tMontrose city\tMN\tMinnesota\tWright County\t1547\t35.7\t15.2\t8.9\t24826\t158553\t0.3796\t55363\tObama\t55363\t0.003626757\t55363.0\n11144\t-94.041708\t45.424636\tClearwater city\tMN\tMinnesota\tWright County\t999\t34.1\t15.4\t8.9\t22950\t146303\t0.3796\t55320\tObama\t55320\t0.002342036\t55320.0\n11145\t-94.189042\t45.075823\tCokato city\tMN\tMinnesota\tWright County\t3862\t35.2\t18.5\t8.6\t23638\t142316\t0.3796\t55321\tObama\t55321\t0.009053998\t55321.0\n11146\t-93.970961\t45.070034\tWaverly city\tMN\tMinnesota\tWright County\t1233\t36.4\t14.9\t8.7\t24904\t141935\t0.3796\t55390\tObama\t55390\t0.002890621\t55390.0\n11147\t-94.217381\t45.29274\tSouth Haven city\tMN\tMinnesota\tWright County\t209\t40.0\t22.1\t9.9\t25025\t185417\t0.3796\t55382\tObama\t55382\t0.0004899759999999999\t55382.0\n11148\t-93.661448\t45.236358\tAlbertville city\tMN\tMinnesota\tWright County\t6640\t29.4\t25.0\t6.7\t30638\t225310\t0.3796\t55301\tObama\t55301\t0.015566687\t55301.0\n11149\t-95.619499\t44.691848\tHanley Falls city\tMN\tMinnesota\tYellow Medicine County\t275\t36.4\t10.2\t6.3\t16605\t86250\t0.4553\t56245\tObama\t56245\t0.000644705\t56245.0\n11150\t-95.523352\t44.811159\tGranite Falls city\tMN\tMinnesota\tYellow Medicine County\t2659\t43.1\t21.6\t8.7\t22075\t84211\t0.4553\t56241\tObama\t56241\t0.006233708\t56241.0\n11151\t-95.411377\t44.621633\tEcho city\tMN\tMinnesota\tYellow Medicine County\t226\t43.3\t16.6\t4.7\t19374\t81667\t0.4553\t56237\tObama\t56237\t0.00052983\t56237.0\n11152\t-95.808319\t44.790873\tClarkfield city\tMN\tMinnesota\tYellow Medicine County\t855\t47.4\t16.2\t4.8\t18218\t53095\t0.4553\t56223\tObama\t56223\t0.002004445\t56223.0\n11153\t-96.16904699999999\t44.641883\tPorter city\tMN\tMinnesota\tYellow Medicine County\t195\t40.7\t13.4\t8.2\t20678\t84000\t0.4553\t56280\tObama\t56280\t0.00045715400000000003\t56280.0\n11154\t-95.716776\t44.748686\tHazel Run city\tMN\tMinnesota\tYellow Medicine County\t62\t43.1\t16.3\t8.1\t20681\t100000\t0.4553\t56245\tObama\t56245\t0.00014535200000000001\t56245.0\n11155\t-96.26932099999999\t44.714762\tCanby city\tMN\tMinnesota\tYellow Medicine County\t1670\t48.0\t20.8\t7.0\t21216\t56747\t0.4553\t56220\tObama\t56220\t0.003915116\t56220.0\n11156\t-95.535842\t44.651314\tWood Lake city\tMN\tMinnesota\tYellow Medicine County\t351\t42.7\t16.9\t5.1\t20286\t58636\t0.4553\t56297\tObama\t56297\t0.000822878\t56297.0\n11157\t-96.052532\t44.717313\tSt. Leo city\tMN\tMinnesota\tYellow Medicine County\t118\t41.3\t13.8\t2.9\t19978\t102500\t0.4553\t56291\tObama\t56291\t0.000276637\t56291.0\n11158\t-91.388017\t31.548606\tNatchez city\tMS\tMississippi\tAdams County\t16404\t40.2\t23.5\t13.0\t17879\t74643\t0.5866\t39120\tRomney\t39120\t0.06331850900000001\t39120.0\n11159\t-88.435895\t34.923916\tFarmington town\tMS\tMississippi\tAlcorn County\t1848\t39.6\t11.4\t12.9\t18722\t83986\t0.2367\t38846\tRomney\t38846\t0.007133175\t38846.0\n11160\t-88.420058\t34.858424\tGlen town\tMS\tMississippi\tAlcorn County\t301\t37.5\t7.6\t9.6\t16015\t58125\t0.2367\t38846\tRomney\t38846\t0.001161843\t38846.0\n11161\t-88.642832\t34.872546\tKossuth village\tMS\tMississippi\tAlcorn County\t174\t41.3\t10.5\t7.0\t17894\t77000\t0.2367\t38865\tRomney\t38865\t0.00067163\t38865.0\n11162\t-88.533934\t34.763286\tRienzi town\tMS\tMississippi\tAlcorn County\t356\t37.4\t7.6\t9.3\t16103\t66429\t0.2367\t38865\tRomney\t38865\t0.00137414\t38865.0\n11163\t-88.514067\t34.947361\tCorinth city\tMS\tMississippi\tAlcorn County\t14233\t40.9\t18.3\t13.5\t18177\t81278\t0.2367\t38834\tRomney\t38834\t0.054938572000000005\t38834.0\n11164\t-91.017691\t31.195056\tGloster town\tMS\tMississippi\tAmite County\t891\t37.3\t13.2\t13.4\t14063\t52051\t0.4207\t39638\tRomney\t39638\t0.0034392090000000004\t39638.0\n11165\t-90.800786\t31.161022999999997\tLiberty town\tMS\tMississippi\tAmite County\t612\t36.4\t22.5\t17.7\t16198\t75313\t0.4207\t39645\tRomney\t39645\t0.002362285\t39645.0\n11166\t-89.58936899999999\t33.058446999999994\tKosciusko city\tMS\tMississippi\tAttala County\t7357\t38.9\t15.8\t16.1\t14710\t66023\t0.4319\t39090\tRomney\t39090\t0.028397602\t39090.0\n11167\t-89.341656\t33.199355\tMcCool town\tMS\tMississippi\tAttala County\t185\t42.5\t8.3\t16.9\t16264\t55000\t0.4319\t39108\tRomney\t39108\t0.00071409\t39108.0\n11168\t-89.764749\t33.021498\tSallis town\tMS\tMississippi\tAttala County\t109\t34.6\t11.8\t13.5\t16358\t49000\t0.4319\t39160\tRomney\t39160\t0.00042073400000000003\t39160.0\n11169\t-89.465147\t33.121916\tEthel town\tMS\tMississippi\tAttala County\t460\t39.2\t12.7\t22.6\t12239\t58846\t0.4319\t39067\tRomney\t39067\t0.001775574\t39067.0\n11170\t-89.19116\t34.615842\tHickory Flat town\tMS\tMississippi\tBenton County\t565\t33.5\t12.2\t16.6\t17217\t80938\t0.4983\t38633\tRomney\t38633\t0.002180868\t38633.0\n11171\t-89.238008\t34.824207\tSnow Lake Shores town\tMS\tMississippi\tBenton County\t293\t43.8\t7.2\t17.0\t12511\t62000\t0.4983\t38603\tRomney\t38603\t0.001130963\t38603.0\n11172\t-89.177724\t34.834113\tAshland town\tMS\tMississippi\tBenton County\t636\t42.0\t7.9\t12.2\t14277\t60833\t0.4983\t38603\tRomney\t38603\t0.002454924\t38603.0\n11173\t-90.76213\t33.601496999999995\tShaw city\tMS\tMississippi\tBolivar County\t2054\t29.8\t12.0\t22.3\t10114\t46588\t0.6859\t38773\tRomney\t38773\t0.007928323000000001\t38773.0\n11174\t-91.03397\t33.852561\tRosedale city\tMS\tMississippi\tBolivar County\t2112\t29.1\t14.4\t27.4\t9483\t49015\t0.6859\t38769\tRomney\t38769\t0.008152199999999998\t38769.0\n11175\t-91.008696\t33.651692\tBenoit town\tMS\tMississippi\tBolivar County\t538\t30.2\t14.8\t31.7\t11341\t51500\t0.6859\t38725\tRomney\t38725\t0.002076649\t38725.0\n11176\t-90.726986\t33.704108000000005\tBoyle town\tMS\tMississippi\tBolivar County\t656\t36.5\t27.6\t12.5\t19051\t100446\t0.6859\t38730\tRomney\t38730\t0.002532123\t38730.0\n11177\t-90.94675500000001\t33.943677\tGunnison town\tMS\tMississippi\tBolivar County\t553\t34.2\t10.7\t20.0\t11185\t36667\t0.6859\t38769\tRomney\t38769\t0.002134549\t38769.0\n11178\t-90.72952099999999\t33.743364\tCleveland city\tMS\tMississippi\tBolivar County\t13548\t31.6\t33.3\t12.7\t17525\t84030\t0.6859\t38732\tRomney\t38732\t0.052294510999999995\t38732.0\n11179\t-90.720607\t34.089960999999995\tAlligator town\tMS\tMississippi\tBolivar County\t199\t38.3\t15.4\t10.4\t12685\t45556\t0.6859\t38720\tRomney\t38720\t0.000768129\t38720.0\n11180\t-90.726391\t33.839151\tMerigold town\tMS\tMississippi\tBolivar County\t591\t42.3\t12.9\t8.6\t14417\t47400\t0.6859\t38759\tRomney\t38759\t0.002281226\t38759.0\n11181\t-90.752849\t33.912221\tWinstonville town\tMS\tMississippi\tBolivar County\t301\t33.4\t8.9\t20.6\t7825\t43500\t0.6859\t38762\tRomney\t38762\t0.001161843\t38762.0\n11182\t-90.745814\t34.041971000000004\tDuncan town\tMS\tMississippi\tBolivar County\t523\t38.2\t16.0\t10.7\t12684\t46667\t0.6859\t38740\tRomney\t38740\t0.00201875\t38740.0\n11183\t-90.723129\t33.780464\tRenova town\tMS\tMississippi\tBolivar County\t603\t32.0\t17.3\t11.2\t13503\t60385\t0.6859\t38732\tRomney\t38732\t0.002327546\t38732.0\n11184\t-90.859266\t33.792201\tPace town\tMS\tMississippi\tBolivar County\t325\t29.6\t9.6\t13.4\t11265\t42778\t0.6859\t38764\tRomney\t38764\t0.001254482\t38764.0\n11185\t-90.72811999999999\t33.880734000000004\tMound Bayou city\tMS\tMississippi\tBolivar County\t2042\t28.8\t23.1\t26.3\t9957\t53231\t0.6859\t38762\tRomney\t38762\t0.007882004\t38762.0\n11186\t-90.765254\t33.950814\tShelby city\tMS\tMississippi\tBolivar County\t2625\t27.9\t12.3\t23.0\t8820\t44714\t0.6859\t38774\tRomney\t38774\t0.010132351\t38774.0\n11187\t-90.980136\t33.790420000000005\tBeulah town\tMS\tMississippi\tBolivar County\t422\t29.9\t10.2\t13.5\t11276\t42222\t0.6859\t38726\tRomney\t38726\t0.0016288960000000001\t38726.0\n11188\t-89.33730200000001\t33.940047\tPittsboro village\tMS\tMississippi\tCalhoun County\t218\t40.4\t6.7\t17.4\t15891\t48571\t0.3659\t38951\tRomney\t38951\t0.0008414680000000001\t38951.0\n11189\t-89.344951\t33.991208\tBruce town\tMS\tMississippi\tCalhoun County\t1790\t37.2\t13.5\t15.4\t16541\t55408\t0.3659\t38915\tRomney\t38915\t0.006909298\t38915.0\n11190\t-89.285426\t33.855507\tDerma town\tMS\tMississippi\tCalhoun County\t874\t35.2\t7.8\t14.0\t13051\t54375\t0.3659\t38916\tRomney\t38916\t0.00337359\t38916.0\n11191\t-89.37527\t33.741749\tSlate Springs village\tMS\tMississippi\tCalhoun County\t117\t43.9\t15.5\t11.5\t18363\t57500\t0.3659\t38916\tRomney\t38916\t0.000451613\t38916.0\n11192\t-89.41591\t33.846392\tBig Creek village\tMS\tMississippi\tCalhoun County\t129\t42.8\t17.2\t8.3\t19649\t69167\t0.3659\t38914\tRomney\t38914\t0.000497933\t38914.0\n11193\t-89.17789599999999\t33.882156\tVardaman town\tMS\tMississippi\tCalhoun County\t1161\t36.9\t5.9\t11.1\t13975\t48085\t0.3659\t38878\tRomney\t38878\t0.0044813940000000005\t38878.0\n11194\t-89.314448\t33.858670000000004\tCalhoun City town\tMS\tMississippi\tCalhoun County\t1631\t40.5\t13.6\t12.8\t15269\t59314\t0.3659\t38916\tRomney\t38916\t0.006295566999999999\t38916.0\n11195\t-89.922084\t33.5061\tCarrollton town\tMS\tMississippi\tCarroll County\t392\t34.5\t16.2\t12.1\t14522\t55833\t0.3349\t38947\tRomney\t38947\t0.0015130979999999998\t38947.0\n11196\t-89.919554\t33.518716999999995\tNorth Carrollton town\tMS\tMississippi\tCarroll County\t480\t35.4\t15.9\t11.9\t14842\t56333\t0.3349\t38947\tRomney\t38947\t0.0018527729999999998\t38947.0\n11197\t-89.76151\t33.33316\tVaiden town\tMS\tMississippi\tCarroll County\t816\t36.7\t10.6\t15.5\t16976\t60417\t0.3349\t39176\tRomney\t39176\t0.003149714\t39176.0\n11198\t-89.021073\t34.036304\tNew Houlka town\tMS\tMississippi\tChickasaw County\t755\t35.7\t5.5\t16.2\t13243\t47656\t0.5149\t38850\tRomney\t38850\t0.002914257\t38850.0\n11199\t-89.004059\t33.896318\tHouston city\tMS\tMississippi\tChickasaw County\t3835\t36.4\t10.8\t16.2\t15235\t64708\t0.5149\t38851\tRomney\t38851\t0.014802882\t38851.0\n11200\t-89.050688\t33.779675\tWoodland village\tMS\tMississippi\tChickasaw County\t152\t36.6\t7.3\t15.4\t12736\t61250\t0.5149\t39776\tRomney\t39776\t0.000586711\t39776.0\n11201\t-88.75057\t34.005134000000005\tOkolona city\tMS\tMississippi\tChickasaw County\t2828\t35.3\t11.1\t23.0\t13117\t58895\t0.5149\t38860\tRomney\t38860\t0.010915919\t38860.0\n11202\t-89.171089\t33.310995\tAckerman town\tMS\tMississippi\tChoctaw County\t1523\t40.2\t14.9\t17.2\t15546\t69787\t0.3342\t39735\tRomney\t39735\t0.005878694\t39735.0\n11203\t-89.39930799999999\t33.29309\tFrench Camp town\tMS\tMississippi\tChoctaw County\t367\t29.8\t14.5\t18.9\t13849\t66250\t0.3342\t39745\tRomney\t39745\t0.001416599\t39745.0\n11204\t-89.29068199999999\t33.263521999999995\tWeir town\tMS\tMississippi\tChoctaw County\t615\t34.7\t10.0\t17.4\t14076\t53400\t0.3342\t39772\tRomney\t39772\t0.002373865\t39772.0\n11205\t-90.983418\t31.955741999999997\tPort Gibson city\tMS\tMississippi\tClaiborne County\t1735\t33.4\t27.4\t19.2\t14655\t59157\t0.8822\t39150\tRomney\t39150\t0.006697002\t39150.0\n11206\t-88.720235\t32.041683\tQuitman city\tMS\tMississippi\tClarke County\t2282\t40.7\t18.8\t12.8\t17287\t70547\t0.377\t39355\tRomney\t39355\t0.00880839\t39355.0\n11207\t-88.815028\t32.173849\tEnterprise town\tMS\tMississippi\tClarke County\t525\t42.4\t9.7\t6.0\t16554\t54000\t0.377\t39330\tRomney\t39330\t0.00202647\t39330.0\n11208\t-88.795785\t32.136445\tStonewall town\tMS\tMississippi\tClarke County\t1042\t35.9\t11.0\t13.0\t14455\t50735\t0.377\t39363\tRomney\t39363\t0.0040220609999999995\t39363.0\n11209\t-88.702005\t31.862089\tShubuta town\tMS\tMississippi\tClarke County\t579\t34.7\t9.2\t23.7\t13173\t47561\t0.377\t39360\tRomney\t39360\t0.002234907\t39360.0\n11210\t-88.883124\t32.043099\tPachuta town\tMS\tMississippi\tClarke County\t248\t40.8\t8.3\t22.1\t11112\t66818\t0.377\t39347\tRomney\t39347\t0.000957266\t39347.0\n11211\t-88.657116\t33.606466999999995\tWest Point city\tMS\tMississippi\tClay County\t11543\t34.3\t19.0\t25.9\t16349\t76464\t0.6062\t39773\tRomney\t39773\t0.044555325\t39773.0\n11212\t-90.57305500000001\t34.197099\tClarksdale city\tMS\tMississippi\tCoahoma County\t18847\t32.1\t20.7\t16.9\t13413\t60687\t0.7386\t38614\tRomney\t38614\t0.07274835\t38614.0\n11213\t-90.47788800000001\t34.454513\tLula town\tMS\tMississippi\tCoahoma County\t336\t43.8\t15.0\t14.8\t17208\t71429\t0.7386\t38644\tRomney\t38644\t0.001296941\t38644.0\n11214\t-90.454224\t34.322238\tJonestown town\tMS\tMississippi\tCoahoma County\t1399\t23.2\t8.3\t16.1\t8472\t38553\t0.7386\t38639\tRomney\t38639\t0.005400060999999999\t38639.0\n11215\t-90.522285\t34.366084\tCoahoma town\tMS\tMississippi\tCoahoma County\t268\t24.0\t9.2\t17.9\t8476\t45000\t0.7386\t38617\tRomney\t38617\t0.001034465\t38617.0\n11216\t-90.542704\t34.216957\tLyon town\tMS\tMississippi\tCoahoma County\t379\t41.6\t24.9\t10.7\t18988\t75909\t0.7386\t38614\tRomney\t38614\t0.001462918\t38614.0\n11217\t-90.638036\t34.368039\tFriars Point town\tMS\tMississippi\tCoahoma County\t1221\t26.5\t9.1\t24.0\t9219\t38095\t0.7386\t38631\tRomney\t38631\t0.004712991\t38631.0\n11218\t-90.354177\t31.990365999999998\tCrystal Springs city\tMS\tMississippi\tCopiah County\t5734\t33.6\t14.3\t15.9\t12883\t63148\t0.5487\t39059\tRomney\t39059\t0.022132915\t39059.0\n11219\t-90.164776\t31.869788\tGeorgetown town\tMS\tMississippi\tCopiah County\t356\t37.5\t6.2\t15.0\t15006\t44000\t0.5487\t39078\tRomney\t39078\t0.00137414\t39078.0\n11220\t-90.392604\t31.86457\tHazlehurst city\tMS\tMississippi\tCopiah County\t4432\t35.7\t16.1\t15.2\t13552\t67436\t0.5487\t39083\tRomney\t39083\t0.017107268000000002\t39083.0\n11221\t-90.395552\t31.69923\tWesson town\tMS\tMississippi\tCopiah County\t1739\t25.2\t19.5\t17.0\t15207\t69130\t0.5487\t39191\tRomney\t39191\t0.0067124409999999995\t39191.0\n11222\t-90.385795\t31.720925\tBeauregard village\tMS\tMississippi\tCopiah County\t272\t25.4\t19.1\t16.8\t15219\t69000\t0.5487\t39191\tRomney\t39191\t0.001049905\t39191.0\n11223\t-89.566349\t31.645933000000003\tCollins city\tMS\tMississippi\tCovington County\t2629\t36.1\t16.5\t21.6\t13896\t73553\t0.4148\t39428\tRomney\t39428\t0.010147791\t39428.0\n11224\t-89.656323\t31.758591\tMount Olive town\tMS\tMississippi\tCovington County\t918\t36.0\t17.2\t16.9\t14338\t62069\t0.4148\t39119\tRomney\t39119\t0.003543428\t39119.0\n11225\t-89.494128\t31.558431\tSeminary town\tMS\tMississippi\tCovington County\t396\t36.6\t13.5\t10.0\t15622\t62917\t0.4148\t39479\tRomney\t39479\t0.0015285379999999999\t39479.0\n11226\t-90.034926\t34.958207\tHorn Lake city\tMS\tMississippi\tDeSoto County\t19602\t30.7\t9.8\t10.3\t19439\t107807\t0.3279\t38637\tRomney\t38637\t0.07566260799999999\t38637.0\n11227\t-89.99303499999999\t34.841555\tHernando city\tMS\tMississippi\tDeSoto County\t11369\t37.7\t19.0\t10.3\t21464\t141264\t0.3279\t38632\tRomney\t38632\t0.043883695\t38632.0\n11228\t-90.096734\t34.965340999999995\tLynchburg CDP\tMS\tMississippi\tDeSoto County\t3759\t36.9\t9.5\t9.2\t21751\t136339\t0.3279\t38680\tRomney\t38680\t0.014509527\t38680.0\n11229\t-89.975308\t34.953876\tSouthaven city\tMS\tMississippi\tDeSoto County\t45840\t36.0\t15.8\t9.6\t24272\t128099\t0.3279\t38671\tRomney\t38671\t0.176939798\t38671.0\n11230\t-90.139542\t34.925360999999995\tMemphis village\tMS\tMississippi\tDeSoto County\t98\t37.8\t4.6\t12.8\t19707\t137500\t0.3279\t38680\tRomney\t38680\t0.000378274\t38680.0\n11231\t-89.84745699999999\t34.961098\tOlive Branch city\tMS\tMississippi\tDeSoto County\t34522\t35.4\t22.2\t8.3\t26277\t166738\t0.3279\t38654\tRomney\t38654\t0.133252961\t38654.0\n11232\t-89.252383\t31.345571999999997\tPetal city\tMS\tMississippi\tForrest County\t7977\t36.2\t20.5\t7.0\t15458\t77860\t0.4389\t39465\tRomney\t39465\t0.030790767\t39465.0\n11233\t-89.308131\t31.318991999999998\tHattiesburg city\tMS\tMississippi\tForrest County\t49004\t28.5\t31.5\t13.2\t16335\t88834\t0.4389\t39401\tRomney\t39401\t0.18915265899999997\t39401.0\n11234\t-90.851011\t31.463101\tBude town\tMS\tMississippi\tFranklin County\t982\t38.0\t15.3\t19.7\t11013\t48429\t0.3842\t39630\tRomney\t39630\t0.0037904640000000003\t39630.0\n11235\t-91.067489\t31.504742999999998\tRoxie town\tMS\tMississippi\tFranklin County\t554\t31.4\t10.3\t17.0\t12626\t45217\t0.3842\t39661\tRomney\t39661\t0.002138409\t39661.0\n11236\t-90.893015\t31.472110999999998\tMeadville town\tMS\tMississippi\tFranklin County\t482\t43.9\t19.0\t15.4\t14357\t64762\t0.3842\t39653\tRomney\t39653\t0.001860493\t39653.0\n11237\t-88.594305\t30.921359999999996\tLucedale city\tMS\tMississippi\tGeorge County\t2613\t36.3\t14.0\t15.8\t14722\t82672\t0.1379\t39452\tRomney\t39452\t0.010086032\t39452.0\n11238\t-88.558205\t31.154477000000004\tLeakesville town\tMS\tMississippi\tGreene County\t954\t43.3\t21.1\t14.7\t15444\t78800\t0.2237\t39451\tRomney\t39451\t0.0036823859999999997\t39451.0\n11239\t-88.82395\t31.103596000000003\tMcLain town\tMS\tMississippi\tGreene County\t547\t29.6\t7.5\t22.9\t12095\t40588\t0.2237\t39456\tRomney\t39456\t0.002111389\t39456.0\n11240\t-89.81313\t33.781538\tGrenada city\tMS\tMississippi\tGrenada County\t14115\t37.7\t17.7\t14.3\t15793\t84969\t0.4665\t38901\tRomney\t38901\t0.05448309900000001\t38901.0\n11241\t-89.345044\t30.317746999999997\tBay St. Louis city\tMS\tMississippi\tHancock County\t6201\t41.7\t27.0\t10.5\t19450\t112463\t0.2282\t39576\tRomney\t39576\t0.023935507999999998\t39576.0\n11242\t-89.384761\t30.287401000000003\tWaveland city\tMS\tMississippi\tHancock County\t5132\t39.6\t19.7\t8.6\t18539\t100354\t0.2282\t39576\tRomney\t39576\t0.019809228999999998\t39576.0\n11243\t-89.369416\t30.382797999999998\tDiamondhead CDP\tMS\tMississippi\tHancock County\t7989\t53.9\t35.6\t9.6\t29519\t158801\t0.2282\t39525\tRomney\t39525\t0.030837087000000003\t39525.0\n11244\t-89.40961\t30.318883000000003\tShoreline Park CDP\tMS\tMississippi\tHancock County\t2850\t42.2\t7.4\t11.5\t13926\t65380\t0.2282\t39520\tRomney\t39520\t0.011000838\t39520.0\n11245\t-89.604775\t30.249201\tPearlington CDP\tMS\tMississippi\tHancock County\t1262\t44.3\t9.7\t11.1\t14498\t62581\t0.2282\t39572\tRomney\t39572\t0.004871248\t39572.0\n11246\t-89.43225600000001\t30.417071999999997\tKiln CDP\tMS\tMississippi\tHancock County\t2060\t37.2\t16.2\t10.8\t17242\t81000\t0.2282\t39556\tRomney\t39556\t0.007951483\t39556.0\n11247\t-88.89914499999999\t30.443642999999998\tD'Iberville city\tMS\tMississippi\tHarrison County\t7329\t35.9\t9.2\t9.6\t17652\t89073\t0.3651\t39532\tRomney\t39532\t0.028289524\t39532.0\n11248\t-89.243297\t30.327123999999998\tPass Christian city\tMS\tMississippi\tHarrison County\t4821\t44.1\t30.2\t9.8\t24086\t119496\t0.3651\t39571\tRomney\t39571\t0.018608786000000002\t39571.0\n11249\t-88.955826\t30.436753999999997\tBiloxi city\tMS\tMississippi\tHarrison County\t42398\t34.2\t22.6\t9.5\t20384\t119917\t0.3651\t39531\tRomney\t39531\t0.163653874\t39531.0\n11250\t-89.143204\t30.623772\tSaucier CDP\tMS\tMississippi\tHarrison County\t1289\t33.6\t11.8\t9.3\t16373\t87273\t0.3651\t39574\tRomney\t39574\t0.004975467\t39574.0\n11251\t-89.164633\t30.360422999999997\tLong Beach city\tMS\tMississippi\tHarrison County\t14687\t37.9\t26.3\t8.4\t20872\t119707\t0.3651\t39560\tRomney\t39560\t0.056690986\t39560.0\n11252\t-89.07015\t30.427417\tGulfport city\tMS\tMississippi\tHarrison County\t69534\t35.1\t21.7\t9.6\t18736\t102699\t0.3651\t39507\tRomney\t39507\t0.268397294\t39507.0\n11253\t-89.134783\t30.504417\tLyman CDP\tMS\tMississippi\tHarrison County\t1411\t35.5\t14.5\t8.3\t19443\t108532\t0.3651\t39503\tRomney\t39503\t0.00544638\t39503.0\n11254\t-90.07504200000001\t32.404283\tJackson city\tMS\tMississippi\tHinds County\t177019\t32.5\t27.5\t13.7\t18365\t77492\t0.7147\t39157\tRomney\t39157\t0.683283293\t39157.0\n11255\t-90.458675\t32.354787\tBolton town\tMS\tMississippi\tHinds County\t571\t38.1\t16.6\t9.3\t18890\t59167\t0.7147\t39041\tRomney\t39041\t0.002204028\t39041.0\n11256\t-90.277466\t32.192253\tByram CDP\tMS\tMississippi\tHinds County\t11658\t35.3\t24.1\t6.2\t24089\t112254\t0.7147\t39212\tRomney\t39212\t0.044999218\t39212.0\n11257\t-90.605561\t32.33265\tEdwards town\tMS\tMississippi\tHinds County\t1275\t31.1\t10.6\t12.3\t13120\t55370\t0.7147\t39066\tRomney\t39066\t0.004921428\t39066.0\n11258\t-90.29700000000001\t32.103623\tTerry town\tMS\tMississippi\tHinds County\t718\t42.0\t12.8\t12.0\t17406\t84318\t0.7147\t39170\tRomney\t39170\t0.002771439\t39170.0\n11259\t-90.549162\t32.197472\tLearned town\tMS\tMississippi\tHinds County\t50\t39.4\t14.7\t13.6\t16415\t70000\t0.7147\t39154\tRomney\t39154\t0.000192997\t39154.0\n11260\t-90.40827\t32.261133\tRaymond city\tMS\tMississippi\tHinds County\t1907\t24.1\t28.0\t22.8\t15146\t90263\t0.7147\t39154\tRomney\t39154\t0.007360912\t39154.0\n11261\t-90.335133\t32.339358000000004\tClinton city\tMS\tMississippi\tHinds County\t24042\t35.0\t40.5\t7.6\t23290\t115198\t0.7147\t39056\tRomney\t39056\t0.092800756\t39056.0\n11262\t-90.62171\t32.105957000000004\tUtica town\tMS\tMississippi\tHinds County\t906\t35.3\t14.7\t18.0\t14023\t60179\t0.7147\t39175\tRomney\t39175\t0.0034971090000000004\t39175.0\n11263\t-90.049437\t33.116143\tLexington city\tMS\tMississippi\tHolmes County\t1862\t35.6\t16.4\t16.4\t14611\t56170\t0.8411\t39095\tRomney\t39095\t0.007187214\t39095.0\n11264\t-89.856603\t33.079896000000005\tDurant city\tMS\tMississippi\tHolmes County\t2981\t36.9\t15.2\t18.0\t12692\t52319\t0.8411\t39063\tRomney\t39063\t0.011506491\t39063.0\n11265\t-89.781801\t33.197912\tWest town\tMS\tMississippi\tHolmes County\t211\t35.2\t11.9\t10.2\t13858\t46000\t0.8411\t39192\tRomney\t39192\t0.0008144480000000001\t39192.0\n11266\t-90.223085\t33.183371\tTchula town\tMS\tMississippi\tHolmes County\t2031\t25.0\t11.0\t24.4\t6665\t39688\t0.8411\t39169\tRomney\t39169\t0.007839545\t39169.0\n11267\t-89.969667\t32.891312\tPickens town\tMS\tMississippi\tHolmes County\t1175\t33.3\t7.7\t28.3\t10903\t55000\t0.8411\t39146\tRomney\t39146\t0.004535433\t39146.0\n11268\t-90.23555400000001\t33.322962\tCruger town\tMS\tMississippi\tHolmes County\t397\t35.1\t17.1\t16.3\t13985\t40333\t0.8411\t38924\tRomney\t38924\t0.001532397\t38924.0\n11269\t-89.91288399999999\t32.967671\tGoodman town\tMS\tMississippi\tHolmes County\t1316\t20.2\t24.5\t25.0\t10432\t35833\t0.8411\t39079\tRomney\t39079\t0.005079685\t39079.0\n11270\t-90.592321\t33.263354\tIsola town\tMS\tMississippi\tHumphreys County\t688\t33.0\t14.5\t9.0\t12795\t51364\t0.7488\t38754\tRomney\t38754\t0.002655641\t38754.0\n11271\t-90.496861\t33.095075\tSilver City town\tMS\tMississippi\tHumphreys County\t288\t37.8\t17.9\t9.7\t13400\t75556\t0.7488\t39166\tRomney\t39166\t0.0011116639999999998\t39166.0\n11272\t-90.485614\t33.180129\tBelzoni city\tMS\tMississippi\tHumphreys County\t2508\t30.5\t19.8\t16.0\t12237\t63800\t0.7488\t39038\tRomney\t39038\t0.009680738000000001\t39038.0\n11273\t-90.59058900000001\t32.981685999999996\tLouise town\tMS\tMississippi\tHumphreys County\t279\t35.2\t10.2\t27.2\t11474\t30000\t0.7488\t39097\tRomney\t39097\t0.001076924\t39097.0\n11274\t-91.046736\t32.896456\tMayersville town\tMS\tMississippi\tIssaquena County\t706\t31.2\t6.5\t20.8\t8715\t32500\t0.6086\t39113\tRomney\t39113\t0.00272512\t39113.0\n11275\t-88.496117\t34.32521\tMantachie town\tMS\tMississippi\tItawamba County\t1211\t38.9\t9.5\t11.0\t15784\t76000\t0.1831\t38855\tRomney\t38855\t0.004674391\t38855.0\n11276\t-88.250785\t34.23254\tTremont town\tMS\tMississippi\tItawamba County\t401\t39.5\t8.6\t11.2\t16479\t62222\t0.1831\t38876\tRomney\t38876\t0.001547837\t38876.0\n11277\t-88.402293\t34.261477\tFulton city\tMS\tMississippi\tItawamba County\t3966\t35.2\t18.7\t11.6\t17663\t82557\t0.1831\t38843\tRomney\t38843\t0.015308535\t38843.0\n11278\t-88.493348\t30.485021999999997\tHelena CDP\tMS\tMississippi\tJackson County\t772\t37.5\t8.1\t15.8\t17166\t71538\t0.3224\t39562\tRomney\t39562\t0.002979876\t39562.0\n11279\t-88.814121\t30.437267\tGulf Hills CDP\tMS\tMississippi\tJackson County\t6830\t40.5\t25.0\t9.9\t24636\t124480\t0.3224\t39564\tRomney\t39564\t0.026363412000000003\t39564.0\n11280\t-88.638111\t30.456964000000003\tHickory Hills CDP\tMS\tMississippi\tJackson County\t4332\t34.4\t20.4\t9.4\t22088\t95900\t0.3224\t39553\tRomney\t39553\t0.016721273999999998\t39553.0\n11281\t-88.499478\t30.663752000000002\tHurley CDP\tMS\tMississippi\tJackson County\t1210\t36.3\t10.0\t7.8\t18506\t102557\t0.3224\t39562\tRomney\t39562\t0.0046705309999999995\t39562.0\n11282\t-88.640815\t30.390386\tGautier city\tMS\tMississippi\tJackson County\t11230\t35.4\t19.1\t10.5\t19421\t105613\t0.3224\t39553\tRomney\t39553\t0.043347163\t39553.0\n11283\t-88.528768\t30.424009\tMoss Point city\tMS\tMississippi\tJackson County\t14865\t39.3\t13.8\t12.4\t16443\t80887\t0.3224\t39563\tRomney\t39563\t0.057378056\t39563.0\n11284\t-88.865278\t30.440374\tSt. Martin CDP\tMS\tMississippi\tJackson County\t7128\t37.9\t16.3\t8.0\t19330\t107150\t0.3224\t39530\tRomney\t39530\t0.027513675\t39530.0\n11285\t-88.758165\t30.380063\tGulf Park Estates CDP\tMS\tMississippi\tJackson County\t5447\t37.0\t24.8\t8.8\t21531\t134495\t0.3224\t39564\tRomney\t39564\t0.021025111000000003\t39564.0\n11286\t-88.667477\t30.548237\tVancleave CDP\tMS\tMississippi\tJackson County\t5505\t36.8\t10.0\t9.3\t16210\t102608\t0.3224\t39565\tRomney\t39565\t0.021248987999999996\t39565.0\n11287\t-88.546679\t30.367739\tPascagoula city\tMS\tMississippi\tJackson County\t22092\t35.0\t17.0\t12.0\t17678\t95293\t0.3224\t39567\tRomney\t39567\t0.08527386599999999\t39567.0\n11288\t-88.78631\t30.407263\tOcean Springs city\tMS\tMississippi\tJackson County\t17003\t40.7\t32.8\t9.0\t24172\t131161\t0.3224\t39564\tRomney\t39564\t0.065630615\t39564.0\n11289\t-88.86075500000001\t30.497449\tLatimer CDP\tMS\tMississippi\tJackson County\t5809\t36.4\t10.2\t8.8\t17283\t98558\t0.3224\t39532\tRomney\t39532\t0.02242241\t39532.0\n11290\t-88.549739\t30.490121999999996\tEscatawpa CDP\tMS\tMississippi\tJackson County\t3556\t38.4\t12.1\t7.1\t18898\t82564\t0.3224\t39562\tRomney\t39562\t0.013725958\t39562.0\n11291\t-88.552924\t30.64017\tWade CDP\tMS\tMississippi\tJackson County\t509\t37.1\t11.6\t11.3\t17225\t97000\t0.3224\t39562\tRomney\t39562\t0.001964711\t39562.0\n11292\t-88.484483\t30.588086999999998\tBig Point CDP\tMS\tMississippi\tJackson County\t119\t36.7\t11.7\t12.3\t16190\t95000\t0.3224\t39562\tRomney\t39562\t0.00045933300000000003\t39562.0\n11293\t-89.262618\t32.072194\tLouin town\tMS\tMississippi\tJasper County\t342\t36.9\t9.5\t15.5\t15567\t48750\t0.5457\t39338\tRomney\t39338\t0.001320101\t39338.0\n11294\t-88.98783\t31.889696\tHeidelberg town\tMS\tMississippi\tJasper County\t778\t35.8\t14.3\t13.2\t11933\t56923\t0.5457\t39439\tRomney\t39439\t0.0030030359999999997\t39439.0\n11295\t-89.234348\t32.125634999999996\tMontrose town\tMS\tMississippi\tJasper County\t141\t39.4\t9.8\t22.4\t12655\t56667\t0.5457\t39338\tRomney\t39338\t0.000544252\t39338.0\n11296\t-89.279042\t31.977290999999997\tBay Springs city\tMS\tMississippi\tJasper County\t1991\t38.5\t19.3\t16.3\t14319\t66000\t0.5457\t39422\tRomney\t39422\t0.007685147\t39422.0\n11297\t-91.062046\t31.712214000000003\tFayette city\tMS\tMississippi\tJefferson County\t2129\t31.7\t10.8\t23.7\t9541\t50625\t0.8913\t39069\tRomney\t39069\t0.008217819\t39069.0\n11298\t-89.745319\t31.496254999999998\tBassfield town\tMS\tMississippi\tJefferson Davis County\t300\t36.3\t14.3\t12.3\t12278\t59444\t0.6216\t39421\tRomney\t39421\t0.001157983\t39421.0\n11299\t-89.871626\t31.596693\tPrentiss town\tMS\tMississippi\tJefferson Davis County\t982\t41.2\t14.4\t16.8\t17560\t65968\t0.6216\t39474\tRomney\t39474\t0.0037904640000000003\t39474.0\n11300\t-89.145328\t31.693890000000003\tLaurel city\tMS\tMississippi\tJones County\t18613\t36.3\t19.3\t11.6\t16466\t63294\t0.3054\t39440\tRomney\t39440\t0.07184512400000001\t39440.0\n11301\t-89.036109\t31.787846999999996\tSandersville town\tMS\tMississippi\tJones County\t776\t41.1\t11.1\t7.9\t15835\t57750\t0.3054\t39477\tRomney\t39477\t0.0029953159999999996\t39477.0\n11302\t-89.275826\t31.753701\tSoso town\tMS\tMississippi\tJones County\t463\t39.6\t11.3\t7.9\t13684\t67059\t0.3054\t39480\tRomney\t39480\t0.001787154\t39480.0\n11303\t-89.206586\t31.598984\tEllisville city\tMS\tMississippi\tJones County\t3605\t36.2\t20.6\t8.1\t15476\t64691\t0.3054\t39437\tRomney\t39437\t0.013915095\t39437.0\n11304\t-88.47720100000001\t32.830220000000004\tScooba town\tMS\tMississippi\tKemper County\t625\t28.5\t20.4\t10.4\t13188\t59524\t0.6411\t39358\tRomney\t39358\t0.002412465\t39358.0\n11305\t-88.656041\t32.770665\tDe Kalb town\tMS\tMississippi\tKemper County\t967\t34.9\t14.2\t18.3\t10970\t58889\t0.6411\t39328\tRomney\t39328\t0.003732565\t39328.0\n11306\t-89.502579\t34.503493\tAbbeville town\tMS\tMississippi\tLafayette County\t436\t34.4\t14.8\t13.7\t12283\t70455\t0.4148\t38601\tRomney\t38601\t0.001682935\t38601.0\n11307\t-89.579311\t34.270162\tTaylor village\tMS\tMississippi\tLafayette County\t244\t26.8\t30.5\t9.5\t16037\t105556\t0.4148\t38673\tRomney\t38673\t0.0009418260000000001\t38673.0\n11308\t-89.524126\t34.360170000000004\tOxford city\tMS\tMississippi\tLafayette County\t12133\t27.9\t48.0\t8.7\t18344\t138167\t0.4148\t38677\tRomney\t38677\t0.046832690999999996\t38677.0\n11309\t-89.546577\t31.418145000000003\tSumrall town\tMS\tMississippi\tLamar County\t1074\t35.0\t20.6\t9.1\t15055\t83871\t0.2207\t39482\tRomney\t39482\t0.004145579\t39482.0\n11310\t-89.42161999999999\t31.006656\tLumberton city\tMS\tMississippi\tLamar County\t2113\t35.9\t12.4\t16.5\t13940\t65260\t0.2207\t39455\tRomney\t39455\t0.00815606\t39455.0\n11311\t-89.404719\t31.143001\tPurvis city\tMS\tMississippi\tLamar County\t2310\t37.9\t16.6\t9.0\t15620\t79035\t0.2207\t39475\tRomney\t39475\t0.008916469\t39475.0\n11312\t-89.377076\t31.319696999999998\tWest Hattiesburg CDP\tMS\tMississippi\tLamar County\t7346\t30.6\t35.3\t8.0\t20391\t111317\t0.2207\t39402\tRomney\t39402\t0.028355143\t39402.0\n11313\t-88.79029399999999\t32.392136\tNellieburg CDP\tMS\tMississippi\tLauderdale County\t1316\t42.9\t19.3\t8.3\t20962\t89063\t0.4215\t39307\tRomney\t39307\t0.005079685\t39307.0\n11314\t-88.61847\t32.550418\tMeridian Station CDP\tMS\tMississippi\tLauderdale County\t1887\t22.4\t27.3\t16.1\t12241\t48333\t0.4215\t39326\tRomney\t39326\t0.007283713000000001\t39326.0\n11315\t-88.650151\t32.427231\tMarion town\tMS\tMississippi\tLauderdale County\t1472\t31.4\t12.7\t13.1\t14049\t76250\t0.4215\t39305\tRomney\t39305\t0.005681836\t39305.0\n11316\t-88.846087\t32.491409000000004\tCollinsville CDP\tMS\tMississippi\tLauderdale County\t1908\t39.4\t16.3\t8.7\t19121\t96795\t0.4215\t39325\tRomney\t39325\t0.0073647719999999995\t39325.0\n11317\t-88.697559\t32.377131\tMeridian city\tMS\tMississippi\tLauderdale County\t38732\t36.4\t20.1\t14.3\t16307\t72292\t0.4215\t39301\tRomney\t39301\t0.149503322\t39301.0\n11318\t-90.113518\t31.550836999999998\tMonticello town\tMS\tMississippi\tLawrence County\t1522\t40.1\t19.4\t11.9\t17483\t84741\t0.3685\t39654\tRomney\t39654\t0.005874834000000001\t39654.0\n11319\t-89.983325\t31.733216\tNew Hebron town\tMS\tMississippi\tLawrence County\t460\t38.9\t17.8\t7.8\t14462\t59286\t0.3685\t39140\tRomney\t39140\t0.001775574\t39140.0\n11320\t-90.005158\t31.60325\tSilver Creek town\tMS\tMississippi\tLawrence County\t208\t36.8\t8.3\t9.5\t14300\t61429\t0.3685\t39663\tRomney\t39663\t0.000802868\t39663.0\n11321\t-89.45269499999999\t32.676901\tStanding Pine CDP\tMS\tMississippi\tLeake County\t505\t38.1\t16.1\t8.3\t17967\t77273\t0.4541\t39189\tRomney\t39189\t0.001949271\t39189.0\n11322\t-89.556129\t32.783885\tRedwater CDP\tMS\tMississippi\tLeake County\t481\t34.0\t15.5\t11.8\t13851\t57143\t0.4541\t39051\tRomney\t39051\t0.001856633\t39051.0\n11323\t-89.458814\t32.598411\tWalnut Grove town\tMS\tMississippi\tLeake County\t456\t39.1\t10.6\t11.4\t14241\t66739\t0.4541\t39189\tRomney\t39189\t0.001760134\t39189.0\n11324\t-89.594853\t32.593845\tLena town\tMS\tMississippi\tLeake County\t183\t41.0\t12.0\t11.6\t14610\t57500\t0.4541\t39094\tRomney\t39094\t0.00070637\t39094.0\n11325\t-89.533702\t32.743313\tCarthage city\tMS\tMississippi\tLeake County\t5430\t33.2\t21.4\t11.4\t13592\t83160\t0.4541\t39051\tRomney\t39051\t0.020959492\t39051.0\n11326\t-88.666099\t34.211012\tPlantersville town\tMS\tMississippi\tLee County\t1170\t33.0\t10.0\t18.2\t16449\t71154\t0.3558\t38862\tRomney\t38862\t0.004516134000000001\t38862.0\n11327\t-88.641987\t34.523094\tBaldwyn city\tMS\tMississippi\tLee County\t3309\t34.6\t12.3\t12.4\t16374\t83274\t0.3558\t38824\tRomney\t38824\t0.012772552\t38824.0\n11328\t-88.729781\t34.263898\tTupelo city\tMS\tMississippi\tLee County\t35966\t37.1\t28.5\t10.9\t23558\t116594\t0.3558\t38801\tRomney\t38801\t0.13882671900000002\t38801.0\n11329\t-88.720488\t34.190834\tVerona city\tMS\tMississippi\tLee County\t3408\t29.5\t11.1\t13.4\t15129\t85476\t0.3558\t38879\tRomney\t38879\t0.013154687\t38879.0\n11330\t-88.692357\t34.377486\tSaltillo town\tMS\tMississippi\tLee County\t3585\t36.4\t20.0\t10.8\t19462\t95317\t0.3558\t38866\tRomney\t38866\t0.013837897\t38866.0\n11331\t-88.663794\t34.444404\tGuntown town\tMS\tMississippi\tLee County\t1390\t37.4\t12.7\t9.4\t17537\t95200\t0.3558\t38849\tRomney\t38849\t0.005365321\t38849.0\n11332\t-88.693146\t34.114353\tShannon town\tMS\tMississippi\tLee County\t1815\t35.9\t7.8\t11.5\t17092\t76607\t0.3558\t38868\tRomney\t38868\t0.007005796999999999\t38868.0\n11333\t-90.19207\t33.518064\tGreenwood city\tMS\tMississippi\tLeflore County\t16968\t33.4\t20.9\t14.5\t15224\t73873\t0.7139\t38930\tRomney\t38930\t0.065495517\t38930.0\n11334\t-90.325717\t33.500393\tItta Bena city\tMS\tMississippi\tLeflore County\t2027\t28.4\t18.8\t17.3\t10987\t57542\t0.7139\t38941\tRomney\t38941\t0.007824105\t38941.0\n11335\t-90.349622\t33.639689000000004\tSchlater town\tMS\tMississippi\tLeflore County\t371\t29.5\t6.7\t18.2\t13250\t43333\t0.7139\t38952\tRomney\t38952\t0.001432039\t38952.0\n11336\t-90.346121\t33.378593\tMorgan City town\tMS\tMississippi\tLeflore County\t269\t36.3\t18.3\t15.6\t19325\t50000\t0.7139\t38946\tRomney\t38946\t0.001038325\t38946.0\n11337\t-90.208077\t33.407928999999996\tSidon town\tMS\tMississippi\tLeflore County\t651\t29.6\t8.3\t16.3\t9556\t43182\t0.7139\t38954\tRomney\t38954\t0.002512823\t38954.0\n11338\t-90.44675\t31.583226\tBrookhaven city\tMS\tMississippi\tLincoln County\t10035\t38.4\t19.5\t16.2\t15421\t78431\t0.3333\t39601\tRomney\t39601\t0.03873453\t39601.0\n11339\t-88.625121\t33.302283\tCrawford town\tMS\tMississippi\tLowndes County\t583\t32.9\t7.0\t18.8\t10945\t41471\t0.493\t39743\tRomney\t39743\t0.002250347\t39743.0\n11340\t-88.326975\t33.448648\tNew Hope CDP\tMS\tMississippi\tLowndes County\t1961\t38.5\t26.4\t7.4\t21321\t111111\t0.493\t39702\tRomney\t39702\t0.007569349\t39702.0\n11341\t-88.32594300000001\t33.683603000000005\tCaledonia town\tMS\tMississippi\tLowndes County\t1112\t36.3\t21.6\t7.8\t19511\t89884\t0.493\t39704\tRomney\t39704\t0.004292257\t39704.0\n11342\t-88.41287700000001\t33.508632\tColumbus city\tMS\tMississippi\tLowndes County\t24334\t34.9\t26.0\t17.0\t17948\t83510\t0.493\t39701\tRomney\t39701\t0.093927859\t39701.0\n11343\t-88.642381\t33.416359\tArtesia town\tMS\tMississippi\tLowndes County\t481\t36.8\t20.9\t15.4\t18523\t86667\t0.493\t39736\tRomney\t39736\t0.001856633\t39736.0\n11344\t-88.450641\t33.641518\tColumbus AFB CDP\tMS\tMississippi\tLowndes County\t1708\t23.3\t53.1\t15.0\t15974\t17500\t0.493\t39705\tRomney\t39705\t0.0065927830000000005\t39705.0\n11345\t-90.313802\t32.541914\tFlora town\tMS\tMississippi\tMadison County\t1662\t37.9\t26.2\t7.2\t22214\t82093\t0.418\t39071\tRomney\t39071\t0.006415226\t39071.0\n11346\t-90.024654\t32.602779999999996\tCanton city\tMS\tMississippi\tMadison County\t13358\t30.3\t16.0\t21.1\t13283\t63635\t0.418\t39046\tRomney\t39046\t0.051561122\t39046.0\n11347\t-90.112902\t32.458262\tMadison city\tMS\tMississippi\tMadison County\t18278\t36.9\t56.8\t3.7\t34788\t173487\t0.418\t39110\tRomney\t39110\t0.070552043\t39110.0\n11348\t-90.1297\t32.423817\tRidgeland city\tMS\tMississippi\tMadison County\t25226\t34.6\t51.9\t5.8\t32595\t147618\t0.418\t39157\tRomney\t39157\t0.09737092800000001\t39157.0\n11349\t-89.825963\t31.257412\tColumbia city\tMS\tMississippi\tMarion County\t6453\t37.2\t18.1\t15.2\t13879\t72467\t0.3451\t39429\tRomney\t39429\t0.024908213999999998\t39429.0\n11350\t-89.68874100000001\t34.865171999999994\tByhalia town\tMS\tMississippi\tMarshall County\t819\t38.6\t15.1\t15.6\t15989\t80263\t0.5942\t38611\tRomney\t38611\t0.0031612940000000003\t38611.0\n11351\t-89.446381\t34.776988\tHolly Springs city\tMS\tMississippi\tMarshall County\t8047\t29.3\t22.8\t25.7\t15363\t76667\t0.5942\t38635\tRomney\t38635\t0.031060962999999997\t38635.0\n11352\t-89.30704\t34.6493\tPotts Camp town\tMS\tMississippi\tMarshall County\t573\t34.4\t12.8\t10.5\t16688\t67333\t0.5942\t38659\tRomney\t38659\t0.002211747\t38659.0\n11353\t-88.551343\t33.828681\tAberdeen city\tMS\tMississippi\tMonroe County\t6123\t35.3\t17.2\t16.3\t13421\t70921\t0.4171\t39730\tRomney\t39730\t0.023634432\t39730.0\n11354\t-88.62033000000001\t34.096338\tNettleton town\tMS\tMississippi\tMonroe County\t1721\t39.9\t9.1\t13.1\t14137\t69643\t0.4171\t38858\tRomney\t38858\t0.006642962\t38858.0\n11355\t-88.236574\t33.88485\tGattman village\tMS\tMississippi\tMonroe County\t112\t38.1\t6.3\t14.0\t14858\t52500\t0.4171\t38844\tRomney\t38844\t0.000432314\t38844.0\n11356\t-88.482226\t33.987945\tAmory city\tMS\tMississippi\tMonroe County\t6509\t38.9\t17.1\t12.7\t16129\t77284\t0.4171\t38821\tRomney\t38821\t0.025124371\t38821.0\n11357\t-88.398125\t34.068008\tSmithville town\tMS\tMississippi\tMonroe County\t918\t38.7\t8.6\t17.0\t18045\t74531\t0.4171\t38870\tRomney\t38870\t0.003543428\t38870.0\n11358\t-88.418807\t33.977337\tHatley town\tMS\tMississippi\tMonroe County\t471\t41.4\t13.9\t10.6\t18384\t93214\t0.4171\t38821\tRomney\t38821\t0.001818033\t38821.0\n11359\t-89.727056\t33.489887\tWinona city\tMS\tMississippi\tMontgomery County\t5272\t39.6\t16.2\t17.9\t14996\t67021\t0.4739\t38967\tRomney\t38967\t0.020349621000000002\t38967.0\n11360\t-89.567371\t33.440387\tKilmichael town\tMS\tMississippi\tMontgomery County\t880\t37.5\t13.5\t19.8\t12411\t59737\t0.4739\t39747\tRomney\t39747\t0.00339675\t39747.0\n11361\t-89.715393\t33.631725\tDuck Hill town\tMS\tMississippi\tMontgomery County\t744\t35.5\t11.4\t16.7\t13842\t64783\t0.4739\t38925\tRomney\t38925\t0.002871798\t38925.0\n11362\t-89.238711\t32.788616\tPearl River CDP\tMS\tMississippi\tNeshoba County\t3272\t26.6\t7.6\t14.9\t10770\t69706\t0.2804\t39350\tRomney\t39350\t0.012629733999999998\t39350.0\n11363\t-88.892214\t32.835141\tBogue Chitto CDP\tMS\tMississippi\tNeshoba County\t533\t29.4\t1.0\t16.4\t9184\t50000\t0.2804\t39354\tRomney\t39354\t0.00205735\t39354.0\n11364\t-89.049514\t32.708476\tTucker CDP\tMS\tMississippi\tNeshoba County\t563\t23.8\t0.4\t28.8\t9673\t57368\t0.2804\t39350\tRomney\t39350\t0.0021731479999999997\t39350.0\n11365\t-89.117069\t32.776340999999995\tPhiladelphia city\tMS\tMississippi\tNeshoba County\t7558\t37.3\t18.6\t12.9\t16559\t73214\t0.2804\t39350\tRomney\t39350\t0.029173451\t39350.0\n11366\t-89.153456\t32.329435\tNewton city\tMS\tMississippi\tNewton County\t3539\t36.6\t17.2\t14.5\t15818\t66867\t0.3395\t39345\tRomney\t39345\t0.013660338999999999\t39345.0\n11367\t-88.930166\t32.327487\tChunky town\tMS\tMississippi\tNewton County\t379\t40.1\t10.7\t11.3\t17491\t62143\t0.3395\t39323\tRomney\t39323\t0.001462918\t39323.0\n11368\t-89.278082\t32.460106\tConehatta CDP\tMS\tMississippi\tNewton County\t1038\t28.5\t4.4\t2.9\t13283\t72917\t0.3395\t39057\tRomney\t39057\t0.004006621\t39057.0\n11369\t-89.113298\t32.581843\tUnion town\tMS\tMississippi\tNewton County\t2095\t40.7\t21.1\t14.0\t14937\t69479\t0.3395\t39365\tRomney\t39365\t0.008086580999999999\t39365.0\n11370\t-89.111079\t32.438621999999995\tDecatur town\tMS\tMississippi\tNewton County\t1458\t26.6\t21.8\t16.1\t15435\t83125\t0.3395\t39327\tRomney\t39327\t0.0056277969999999995\t39327.0\n11371\t-89.0217\t32.316615000000006\tHickory town\tMS\tMississippi\tNewton County\t490\t37.0\t16.3\t13.3\t13800\t58214\t0.3395\t39332\tRomney\t39332\t0.001891372\t39332.0\n11372\t-88.561363\t33.113747\tMacon city\tMS\tMississippi\tNoxubee County\t2313\t34.3\t13.3\t24.3\t14835\t50517\t0.7854\t39341\tRomney\t39341\t0.008928049\t39341.0\n11373\t-88.580816\t33.233659\tBrooksville town\tMS\tMississippi\tNoxubee County\t1144\t30.5\t7.5\t17.7\t10504\t48704\t0.7854\t39739\tRomney\t39739\t0.004415775\t39739.0\n11374\t-88.56930799999999\t32.979343\tShuqualak town\tMS\tMississippi\tNoxubee County\t559\t35.7\t9.0\t24.3\t15551\t46190\t0.7854\t39361\tRomney\t39361\t0.002157708\t39361.0\n11375\t-89.077537\t33.555899\tMaben town\tMS\tMississippi\tOktibbeha County\t706\t34.9\t15.6\t17.6\t14743\t70000\t0.502\t39750\tRomney\t39750\t0.00272512\t39750.0\n11376\t-89.045753\t33.345232\tSturgis town\tMS\tMississippi\tOktibbeha County\t198\t40.8\t14.7\t8.9\t14876\t58125\t0.502\t39769\tRomney\t39769\t0.0007642689999999999\t39769.0\n11377\t-88.829645\t33.461135999999996\tStarkville city\tMS\tMississippi\tOktibbeha County\t22391\t26.2\t48.5\t9.4\t17705\t118113\t0.502\t39759\tRomney\t39759\t0.08642798900000001\t39759.0\n11378\t-89.939228\t34.51375\tComo town\tMS\tMississippi\tPanola County\t1324\t36.3\t19.5\t18.8\t13154\t67963\t0.5396\t38619\tRomney\t38619\t0.005110565\t38619.0\n11379\t-89.911275\t34.43561\tSardis town\tMS\tMississippi\tPanola County\t1985\t37.3\t10.5\t19.3\t13798\t64250\t0.5396\t38666\tRomney\t38666\t0.0076619869999999994\t38666.0\n11380\t-90.193862\t34.504898\tCrenshaw town\tMS\tMississippi\tPanola County\t905\t34.4\t7.0\t16.5\t10797\t49815\t0.5396\t38621\tRomney\t38621\t0.0034932490000000004\t38621.0\n11381\t-89.935126\t34.317244\tBatesville city\tMS\tMississippi\tPanola County\t7445\t35.1\t22.3\t12.4\t19220\t86013\t0.5396\t38606\tRomney\t38606\t0.028737277000000002\t38606.0\n11382\t-89.948121\t34.214718\tPope village\tMS\tMississippi\tPanola County\t270\t36.8\t11.9\t6.9\t15257\t61250\t0.5396\t38620\tRomney\t38620\t0.001042185\t38620.0\n11383\t-89.943339\t34.240871999999996\tCourtland town\tMS\tMississippi\tPanola County\t530\t27.8\t9.5\t17.4\t12194\t55588\t0.5396\t38620\tRomney\t38620\t0.00204577\t38620.0\n11384\t-89.677655\t30.529415000000004\tPicayune city\tMS\tMississippi\tPearl River County\t12322\t38.9\t15.7\t14.5\t17130\t90837\t0.1965\t39466\tRomney\t39466\t0.047562220999999995\t39466.0\n11385\t-89.534773\t30.839470000000002\tPoplarville city\tMS\tMississippi\tPearl River County\t2952\t34.1\t25.6\t17.4\t15289\t102047\t0.1965\t39470\tRomney\t39470\t0.011394551999999999\t39470.0\n11386\t-88.94115500000001\t31.349475\tRichton town\tMS\tMississippi\tPerry County\t924\t40.6\t21.1\t12.0\t14902\t74200\t0.2669\t39476\tRomney\t39476\t0.003566588\t39476.0\n11387\t-88.925139\t31.170697999999998\tBeaumont town\tMS\tMississippi\tPerry County\t871\t32.3\t7.2\t17.5\t11322\t44583\t0.2669\t39423\tRomney\t39423\t0.003362011\t39423.0\n11388\t-89.02758399999999\t31.203605\tNew Augusta town\tMS\tMississippi\tPerry County\t646\t33.6\t12.8\t12.1\t14074\t69500\t0.2669\t39462\tRomney\t39462\t0.002493523\t39462.0\n11389\t-90.47144200000001\t31.244845\tMcComb city\tMS\tMississippi\tPike County\t13205\t36.5\t15.9\t17.0\t15316\t63793\t0.5369\t39648\tRomney\t39648\t0.050970550999999996\t39648.0\n11390\t-90.460647\t31.153327\tMagnolia city\tMS\tMississippi\tPike County\t2026\t37.2\t13.5\t18.3\t12571\t59929\t0.5369\t39635\tRomney\t39635\t0.007820245\t39635.0\n11391\t-90.471537\t31.007271999999997\tOsyka town\tMS\tMississippi\tPike County\t496\t37.8\t22.5\t8.8\t18207\t67083\t0.5369\t39657\tRomney\t39657\t0.001914532\t39657.0\n11392\t-90.466507\t31.284234\tSummit town\tMS\tMississippi\tPike County\t1447\t34.3\t16.5\t15.4\t14815\t67838\t0.5369\t39666\tRomney\t39666\t0.0055853380000000005\t39666.0\n11393\t-89.17485400000001\t34.307085\tThaxton town\tMS\tMississippi\tPontotoc County\t584\t37.5\t12.8\t12.5\t17907\t79444\t0.2259\t38871\tRomney\t38871\t0.0022542070000000003\t38871.0\n11394\t-89.033535\t34.178854\tAlgoma town\tMS\tMississippi\tPontotoc County\t578\t37.4\t7.8\t15.1\t14787\t85333\t0.2259\t38863\tRomney\t38863\t0.0022310470000000003\t38863.0\n11395\t-88.82195899999999\t34.367439000000005\tSherman town\tMS\tMississippi\tPontotoc County\t616\t38.8\t15.6\t20.4\t18761\t86818\t0.2259\t38869\tRomney\t38869\t0.002377725\t38869.0\n11396\t-89.232823\t34.255805\tToccopola town\tMS\tMississippi\tPontotoc County\t212\t38.1\t10.6\t13.7\t17247\t62500\t0.2259\t38874\tRomney\t38874\t0.000818308\t38874.0\n11397\t-89.006337\t34.248056\tPontotoc city\tMS\tMississippi\tPontotoc County\t5686\t38.4\t24.5\t12.2\t19705\t98636\t0.2259\t38863\tRomney\t38863\t0.021947637000000002\t38863.0\n11398\t-89.02489399999999\t34.356378\tEcru town\tMS\tMississippi\tPontotoc County\t959\t37.6\t8.8\t11.0\t17295\t69444\t0.2259\t38841\tRomney\t38841\t0.0037016859999999996\t38841.0\n11399\t-88.662015\t34.707882\tJumpertown town\tMS\tMississippi\tPrentiss County\t409\t39.2\t8.6\t18.5\t14937\t63421\t0.2808\t38865\tRomney\t38865\t0.001578717\t38865.0\n11400\t-88.47258599999999\t34.49995\tMarietta town\tMS\tMississippi\tPrentiss County\t241\t40.5\t12.9\t4.8\t17922\t71250\t0.2808\t38856\tRomney\t38856\t0.000930246\t38856.0\n11401\t-88.56839699999999\t34.664287\tBooneville city\tMS\tMississippi\tPrentiss County\t8617\t36.6\t14.9\t14.0\t16464\t75607\t0.2808\t38829\tRomney\t38829\t0.033261131\t38829.0\n11402\t-90.284082\t34.201104\tLambert town\tMS\tMississippi\tQuitman County\t1880\t30.0\t9.9\t19.4\t10983\t41829\t0.713\t38643\tRomney\t38643\t0.007256693000000001\t38643.0\n11403\t-90.255666\t34.391133\tFalcon town\tMS\tMississippi\tQuitman County\t303\t28.0\t7.8\t22.6\t9687\t36667\t0.713\t38670\tRomney\t38670\t0.001169563\t38670.0\n11404\t-90.27251899999999\t34.25338\tMarks city\tMS\tMississippi\tQuitman County\t1360\t40.0\t19.8\t9.8\t14857\t47632\t0.713\t38646\tRomney\t38646\t0.005249523000000001\t38646.0\n11405\t-90.221288\t34.43274\tSledge town\tMS\tMississippi\tQuitman County\t505\t28.2\t7.9\t22.7\t9699\t37500\t0.713\t38621\tRomney\t38621\t0.001949271\t38621.0\n11406\t-90.132442\t34.173484\tCrowder town\tMS\tMississippi\tQuitman County\t738\t37.8\t13.7\t9.2\t16460\t59722\t0.713\t38622\tRomney\t38622\t0.0028486379999999997\t38622.0\n11407\t-90.099016\t32.271009\tPearl city\tMS\tMississippi\tRankin County\t23469\t35.4\t16.1\t9.4\t20056\t86142\t0.2337\t39208\tRomney\t39208\t0.09058900800000001\t39208.0\n11408\t-90.159542\t32.231097\tRichland city\tMS\tMississippi\tRankin County\t7148\t34.8\t13.9\t6.8\t19346\t79266\t0.2337\t39218\tRomney\t39218\t0.027590873999999998\t39218.0\n11409\t-89.992594\t32.272964\tBrandon city\tMS\tMississippi\tRankin County\t19870\t38.3\t35.7\t5.9\t26934\t142109\t0.2337\t39042\tRomney\t39042\t0.076697072\t39042.0\n11410\t-89.800011\t32.316769\tPelahatchie town\tMS\tMississippi\tRankin County\t1772\t35.9\t11.3\t8.6\t15846\t70326\t0.2337\t39145\tRomney\t39145\t0.0068398190000000005\t39145.0\n11411\t-90.12401899999999\t32.154945\tFlorence town\tMS\tMississippi\tRankin County\t3420\t36.8\t14.5\t7.2\t19830\t106250\t0.2337\t39073\tRomney\t39073\t0.013201006000000001\t39073.0\n11412\t-89.779985\t32.084296\tPuckett village\tMS\tMississippi\tRankin County\t340\t36.1\t9.3\t8.1\t16575\t75000\t0.2337\t39151\tRomney\t39151\t0.001312381\t39151.0\n11413\t-90.105571\t32.320612\tFlowood city\tMS\tMississippi\tRankin County\t7684\t33.4\t44.9\t6.5\t28128\t129513\t0.2337\t39208\tRomney\t39208\t0.029659803999999998\t39208.0\n11414\t-89.321085\t32.343167\tLake town\tMS\tMississippi\tScott County\t391\t35.3\t11.0\t12.0\t12960\t52941\t0.4491\t39092\tRomney\t39092\t0.001509238\t39092.0\n11415\t-89.47591700000001\t32.360224\tForest city\tMS\tMississippi\tScott County\t5698\t35.7\t14.7\t8.2\t17200\t65222\t0.4491\t39074\tRomney\t39074\t0.021993957\t39074.0\n11416\t-89.33335600000001\t32.567815\tSebastopol town\tMS\tMississippi\tScott County\t212\t36.3\t10.1\t2.0\t15570\t47222\t0.4491\t39359\tRomney\t39359\t0.000818308\t39359.0\n11417\t-89.655377\t32.350418\tMorton city\tMS\tMississippi\tScott County\t3463\t35.7\t10.7\t8.7\t14727\t58333\t0.4491\t39117\tRomney\t39117\t0.013366983\t39117.0\n11418\t-90.828272\t32.971940999999994\tAnguilla town\tMS\tMississippi\tSharkey County\t880\t29.9\t24.4\t14.9\t12320\t53800\t0.7038\t38721\tRomney\t38721\t0.00339675\t38721.0\n11419\t-90.876994\t32.907278000000005\tRolling Fork city\tMS\tMississippi\tSharkey County\t2265\t34.3\t18.2\t14.2\t12888\t64426\t0.7038\t38745\tRomney\t38745\t0.008742771\t38745.0\n11420\t-90.924769\t32.805757\tCary town\tMS\tMississippi\tSharkey County\t405\t30.7\t7.8\t19.5\t13800\t46667\t0.7038\t39054\tRomney\t39054\t0.001563277\t39054.0\n11421\t-89.869233\t31.960874\tMendenhall city\tMS\tMississippi\tSimpson County\t2630\t38.8\t19.7\t13.9\t15339\t74250\t0.3856\t39114\tRomney\t39114\t0.010151651\t39114.0\n11422\t-89.733659\t31.872479\tMagee city\tMS\tMississippi\tSimpson County\t4126\t36.9\t15.3\t13.3\t14009\t67289\t0.3856\t39111\tRomney\t39111\t0.015926126000000002\t39111.0\n11423\t-89.971523\t32.026367\tBraxton village\tMS\tMississippi\tSimpson County\t198\t37.5\t10.9\t11.5\t17675\t62500\t0.3856\t39044\tRomney\t39044\t0.0007642689999999999\t39044.0\n11424\t-89.901209\t31.986652000000003\tD'Lo town\tMS\tMississippi\tSimpson County\t383\t39.2\t9.4\t7.5\t15964\t71818\t0.3856\t39062\tRomney\t39062\t0.001478358\t39062.0\n11425\t-89.432618\t31.831578000000004\tTaylorsville town\tMS\tMississippi\tSmith County\t1337\t38.6\t14.5\t9.2\t18835\t72447\t0.2444\t39168\tRomney\t39168\t0.005160744\t39168.0\n11426\t-89.692181\t32.190157\tPolkville village\tMS\tMississippi\tSmith County\t124\t38.5\t7.1\t3.8\t21628\t76000\t0.2444\t39152\tRomney\t39152\t0.000478633\t39152.0\n11427\t-89.554103\t31.867134999999998\tMize town\tMS\tMississippi\tSmith County\t264\t41.6\t8.2\t10.6\t16222\t53182\t0.2444\t39116\tRomney\t39116\t0.001019025\t39116.0\n11428\t-89.381917\t32.014299\tSylvarena village\tMS\tMississippi\tSmith County\t113\t38.8\t9.3\t20.8\t16385\t50000\t0.2444\t39422\tRomney\t39422\t0.000436174\t39422.0\n11429\t-89.524916\t32.032164\tRaleigh town\tMS\tMississippi\tSmith County\t1395\t38.0\t14.3\t13.0\t15544\t65172\t0.2444\t39153\tRomney\t39153\t0.005384621\t39153.0\n11430\t-89.13846\t30.855417\tWiggins city\tMS\tMississippi\tStone County\t4097\t35.6\t18.5\t12.6\t15733\t81875\t0.2659\t39577\tRomney\t39577\t0.015814187\t39577.0\n11431\t-90.50626700000001\t33.449391999999996\tMoorhead city\tMS\tMississippi\tSunflower County\t2287\t24.1\t15.6\t21.5\t10906\t54462\t0.7302\t38761\tRomney\t38761\t0.00882769\t38761.0\n11432\t-90.644674\t33.449065999999995\tIndianola city\tMS\tMississippi\tSunflower County\t11355\t30.8\t17.4\t18.3\t14295\t67306\t0.7302\t38751\tRomney\t38751\t0.043829655999999995\t38751.0\n11433\t-90.591199\t33.354201\tInverness town\tMS\tMississippi\tSunflower County\t1048\t37.1\t18.8\t15.9\t13126\t75769\t0.7302\t38753\tRomney\t38753\t0.004045221\t38753.0\n11434\t-90.538289\t33.546772999999995\tSunflower town\tMS\tMississippi\tSunflower County\t594\t27.8\t7.2\t21.9\t10352\t56176\t0.7302\t38778\tRomney\t38778\t0.002292806\t38778.0\n11435\t-90.530513\t33.810208\tDrew city\tMS\tMississippi\tSunflower County\t2229\t33.4\t12.8\t21.6\t11949\t49000\t0.7302\t38737\tRomney\t38737\t0.008603813\t38737.0\n11436\t-90.549982\t33.724561\tRuleville city\tMS\tMississippi\tSunflower County\t2914\t32.4\t14.6\t23.0\t11850\t49905\t0.7302\t38771\tRomney\t38771\t0.011247875\t38771.0\n11437\t-90.521428\t33.659867\tDoddsville town\tMS\tMississippi\tSunflower County\t103\t32.9\t11.3\t31.6\t11952\t52000\t0.7302\t38736\tRomney\t38736\t0.00039757400000000004\t38736.0\n11438\t-90.292789\t33.827845\tGlendora village\tMS\tMississippi\tTallahatchie County\t200\t28.3\t11.2\t37.1\t9464\t38125\t0.6088\t38928\tRomney\t38928\t0.0007719889999999999\t38928.0\n11439\t-90.055367\t34.00736\tCharleston city\tMS\tMississippi\tTallahatchie County\t1939\t38.0\t15.2\t9.5\t12562\t42468\t0.6088\t38921\tRomney\t38921\t0.00748443\t38921.0\n11440\t-90.34626800000001\t33.947819\tWebb town\tMS\tMississippi\tTallahatchie County\t554\t35.2\t19.1\t17.9\t11333\t41154\t0.6088\t38966\tRomney\t38966\t0.002138409\t38966.0\n11441\t-90.369348\t33.969388\tSumner town\tMS\tMississippi\tTallahatchie County\t380\t35.2\t19.6\t16.9\t11845\t44000\t0.6088\t38957\tRomney\t38957\t0.001466778\t38957.0\n11442\t-90.430102\t34.012091999999996\tTutwiler town\tMS\tMississippi\tTallahatchie County\t1243\t32.4\t8.8\t23.5\t8013\t42885\t0.6088\t38963\tRomney\t38963\t0.004797909\t38963.0\n11443\t-89.975601\t34.690366999999995\tColdwater town\tMS\tMississippi\tTate County\t1798\t31.5\t12.3\t20.1\t13994\t79362\t0.3976\t38618\tRomney\t38618\t0.006940178000000001\t38618.0\n11444\t-89.976171\t34.611784\tSenatobia city\tMS\tMississippi\tTate County\t7081\t30.7\t20.2\t20.4\t18365\t106949\t0.3976\t38668\tRomney\t38668\t0.027332257999999998\t38668.0\n11445\t-88.92385300000001\t34.949733\tWalnut town\tMS\tMississippi\tTippah County\t763\t41.2\t6.3\t12.5\t13850\t62381\t0.2528\t38683\tRomney\t38683\t0.002945137\t38683.0\n11446\t-88.93318199999999\t34.849409\tFalkner town\tMS\tMississippi\tTippah County\t206\t39.2\t11.0\t11.0\t17352\t76667\t0.2528\t38674\tRomney\t38674\t0.0007951480000000001\t38674.0\n11447\t-88.94492\t34.732029\tRipley city\tMS\tMississippi\tTippah County\t5431\t39.4\t12.6\t16.1\t17028\t73741\t0.2528\t38663\tRomney\t38663\t0.020963352\t38663.0\n11448\t-89.027733\t34.670768\tBlue Mountain town\tMS\tMississippi\tTippah County\t742\t32.0\t11.6\t15.7\t14016\t55833\t0.2528\t38610\tRomney\t38610\t0.002864078\t38610.0\n11449\t-88.843133\t34.637994\tDumas town\tMS\tMississippi\tTippah County\t476\t39.6\t9.1\t9.0\t16857\t80000\t0.2528\t38625\tRomney\t38625\t0.0018373329999999998\t38625.0\n11450\t-88.228703\t34.63395\tTishomingo town\tMS\tMississippi\tTishomingo County\t320\t44.0\t12.2\t9.9\t16125\t61250\t0.207\t38873\tRomney\t38873\t0.001235182\t38873.0\n11451\t-88.18625300000001\t34.486672\tGolden town\tMS\tMississippi\tTishomingo County\t180\t37.9\t11.9\t12.7\t15428\t82143\t0.207\t38827\tRomney\t38827\t0.00069479\t38827.0\n11452\t-88.20813100000001\t34.504821\tBelmont town\tMS\tMississippi\tTishomingo County\t1794\t38.2\t9.4\t10.7\t16436\t79151\t0.207\t38827\tRomney\t38827\t0.006924738000000001\t38827.0\n11453\t-88.260437\t34.660544\tPaden village\tMS\tMississippi\tTishomingo County\t103\t41.1\t7.1\t5.6\t15785\t74000\t0.207\t38873\tRomney\t38873\t0.00039757400000000004\t38873.0\n11454\t-88.197717\t34.807686\tIuka city\tMS\tMississippi\tTishomingo County\t3036\t46.4\t16.3\t16.4\t19132\t71059\t0.207\t38852\tRomney\t38852\t0.011718788\t38852.0\n11455\t-88.317702\t34.834787\tBurnsville town\tMS\tMississippi\tTishomingo County\t1102\t34.0\t7.5\t20.2\t14541\t62857\t0.207\t38833\tRomney\t38833\t0.004253657\t38833.0\n11456\t-90.381377\t34.688037\tTunica town\tMS\tMississippi\tTunica County\t1173\t41.1\t17.7\t16.5\t21577\t101346\t0.7929999999999999\t38676\tRomney\t38676\t0.004527713\t38676.0\n11457\t-90.378265\t34.701657\tNorth Tunica CDP\tMS\tMississippi\tTunica County\t1473\t26.6\t8.2\t27.0\t8517\t45882\t0.7929999999999999\t38676\tRomney\t38676\t0.005685696\t38676.0\n11458\t-88.872279\t34.40117\tBlue Springs village\tMS\tMississippi\tUnion County\t181\t39.2\t9.0\t11.4\t16608\t62500\t0.2413\t38828\tRomney\t38828\t0.00069865\t38828.0\n11459\t-89.116961\t34.560145\tMyrtle town\tMS\tMississippi\tUnion County\t412\t35.6\t17.1\t16.6\t16436\t83077\t0.2413\t38650\tRomney\t38650\t0.001590297\t38650.0\n11460\t-89.018188\t34.491966999999995\tNew Albany city\tMS\tMississippi\tUnion County\t8071\t37.4\t22.3\t15.1\t17908\t90333\t0.2413\t38652\tRomney\t38652\t0.031153602000000002\t38652.0\n11461\t-90.144261\t31.117895\tTylertown town\tMS\tMississippi\tWalthall County\t1873\t42.8\t21.0\t10.9\t15424\t73980\t0.4532\t39667\tRomney\t39667\t0.007229674\t39667.0\n11462\t-90.886645\t32.317337\tVicksburg city\tMS\tMississippi\tWarren County\t24805\t36.3\t20.9\t14.8\t17796\t75384\t0.5042\t39180\tRomney\t39180\t0.095745892\t39180.0\n11463\t-90.899422\t33.404925\tLeland city\tMS\tMississippi\tWashington County\t5089\t31.4\t27.1\t18.3\t14111\t67107\t0.7092\t38756\tRomney\t38756\t0.019643251\t38756.0\n11464\t-91.051509\t33.385068\tGreenville city\tMS\tMississippi\tWashington County\t38411\t33.0\t20.3\t20.7\t15684\t65705\t0.7092\t38701\tRomney\t38701\t0.14826428\t38701.0\n11465\t-91.001802\t33.450613\tMetcalfe town\tMS\tMississippi\tWashington County\t974\t24.8\t10.1\t23.3\t9701\t56351\t0.7092\t38760\tRomney\t38760\t0.003759585\t38760.0\n11466\t-90.88006800000001\t33.270534000000005\tArcola town\tMS\tMississippi\tWashington County\t486\t32.6\t11.8\t22.8\t9263\t39545\t0.7092\t38722\tRomney\t38722\t0.001875932\t38722.0\n11467\t-90.852965\t33.176021999999996\tHollandale city\tMS\tMississippi\tWashington County\t3189\t29.3\t13.8\t16.6\t10194\t48785\t0.7092\t38748\tRomney\t38748\t0.012309358999999999\t38748.0\n11468\t-88.47384699999999\t31.44325\tState Line town\tMS\tMississippi\tWayne County\t593\t32.9\t7.6\t13.1\t13242\t51000\t0.4015\t39362\tRomney\t39362\t0.002288946\t39362.0\n11469\t-88.64080899999999\t31.669631\tWaynesboro city\tMS\tMississippi\tWayne County\t4664\t35.2\t17.4\t19.9\t14712\t53667\t0.4015\t39367\tRomney\t39367\t0.018002775\t39367.0\n11470\t-89.127499\t33.541754\tMathiston town\tMS\tMississippi\tWebster County\t692\t37.1\t11.7\t14.4\t15407\t62500\t0.2274\t39752\tRomney\t39752\t0.0026710809999999996\t39752.0\n11471\t-89.27877\t33.606904\tWalthall village\tMS\tMississippi\tWebster County\t176\t41.3\t14.5\t7.8\t15809\t58333\t0.2274\t39771\tRomney\t39771\t0.00067935\t39771.0\n11472\t-89.061138\t33.731204999999996\tMantee village\tMS\tMississippi\tWebster County\t147\t40.2\t10.8\t12.0\t17459\t58750\t0.2274\t39751\tRomney\t39751\t0.000567412\t39751.0\n11473\t-89.276315\t33.543363\tEupora city\tMS\tMississippi\tWebster County\t2422\t40.5\t21.3\t25.7\t15410\t75169\t0.2274\t39744\tRomney\t39744\t0.009348783000000001\t39744.0\n11474\t-91.299275\t31.103177000000002\tWoodville town\tMS\tMississippi\tWilkinson County\t1149\t32.8\t20.8\t15.5\t15528\t61711\t0.7031\t39669\tRomney\t39669\t0.004435075\t39669.0\n11475\t-91.055414\t31.087583000000002\tCentreville town\tMS\tMississippi\tWilkinson County\t1589\t39.9\t11.0\t12.7\t13064\t57604\t0.7031\t39631\tRomney\t39631\t0.00613345\t39631.0\n11476\t-91.059116\t31.282109000000002\tCrosby town\tMS\tMississippi\tWilkinson County\t354\t41.5\t10.7\t15.7\t14916\t42857\t0.7031\t39633\tRomney\t39633\t0.00136642\t39633.0\n11477\t-89.05526400000001\t33.122431\tLouisville city\tMS\tMississippi\tWinston County\t6953\t36.4\t21.7\t20.9\t16768\t75272\t0.4687\t39339\tRomney\t39339\t0.026838185\t39339.0\n11478\t-89.063474\t32.993618\tNoxapater town\tMS\tMississippi\tWinston County\t434\t40.8\t15.0\t18.9\t13602\t66154\t0.4687\t39346\tRomney\t39346\t0.001675215\t39346.0\n11479\t-89.684538\t33.976524\tCoffeeville town\tMS\tMississippi\tYalobusha County\t965\t39.8\t16.3\t14.0\t15909\t61364\t0.4769\t38922\tRomney\t38922\t0.003724845\t38922.0\n11480\t-89.914503\t34.055625\tOakland town\tMS\tMississippi\tYalobusha County\t587\t35.5\t6.9\t30.9\t12349\t49167\t0.4769\t38948\tRomney\t38948\t0.002265787\t38948.0\n11481\t-89.896086\t33.9851\tTillatoba town\tMS\tMississippi\tYalobusha County\t110\t37.1\t13.7\t15.8\t13670\t70000\t0.4769\t38961\tRomney\t38961\t0.00042459400000000003\t38961.0\n11482\t-89.630094\t34.162134\tWater Valley city\tMS\tMississippi\tYalobusha County\t3797\t39.5\t15.7\t13.1\t17058\t71429\t0.4769\t38965\tRomney\t38965\t0.014656205\t38965.0\n11483\t-90.54464399999999\t32.672133\tSatartia village\tMS\tMississippi\tYazoo County\t68\t41.9\t10.9\t8.0\t16764\t55000\t0.5682\t39162\tRomney\t39162\t0.000262476\t39162.0\n11484\t-90.369157\t32.643237\tBentonia town\tMS\tMississippi\tYazoo County\t443\t38.0\t10.7\t8.6\t15654\t62632\t0.5682\t39040\tRomney\t39040\t0.001709955\t39040.0\n11485\t-90.323931\t32.983889000000005\tEden village\tMS\tMississippi\tYazoo County\t181\t35.9\t6.7\t3.6\t12202\t53333\t0.5682\t39169\tRomney\t39169\t0.00069865\t39169.0\n11486\t-90.408753\t32.863963\tYazoo City\tMS\tMississippi\tYazoo County\t14862\t33.3\t15.0\t20.7\t11959\t58373\t0.5682\t39194\tRomney\t39194\t0.057366477\t39194.0\n11487\t-92.54590400000001\t40.107488000000004\tMillard village\tMO\tMissouri\tAdair County\t77\t45.0\t17.0\t8.3\t17403\t75000\t0.4167\t63501\tRomney\t63501\t0.000188499\t63501.0\n11488\t-92.706549\t40.234053\tNovinger city\tMO\tMissouri\tAdair County\t513\t40.8\t12.9\t17.7\t16993\t53125\t0.4167\t63559\tRomney\t63559\t0.001255847\t63559.0\n11489\t-92.378761\t40.148405\tBrashear city\tMO\tMissouri\tAdair County\t286\t43.6\t17.9\t8.1\t17487\t76111\t0.4167\t63533\tRomney\t63533\t0.000700141\t63533.0\n11490\t-92.578965\t40.195095\tKirksville city\tMO\tMissouri\tAdair County\t17030\t27.2\t38.1\t10.1\t19329\t103054\t0.4167\t63501\tRomney\t63501\t0.041690187999999996\t63501.0\n11491\t-92.416614\t40.099027\tGibbs village\tMO\tMissouri\tAdair County\t102\t42.9\t18.6\t8.2\t17512\t75000\t0.4167\t63540\tRomney\t63540\t0.0002497\t63540.0\n11492\t-94.82554\t39.827549\tCountry Club village\tMO\tMissouri\tAndrew County\t1881\t36.8\t31.3\t8.9\t25127\t131052\t0.3189\t64505\tRomney\t64505\t0.004604771\t64505.0\n11493\t-94.821263\t40.115278\tBolckow city\tMO\tMissouri\tAndrew County\t229\t38.5\t14.1\t9.4\t16994\t63571\t0.3189\t64427\tRomney\t64427\t0.000560602\t64427.0\n11494\t-94.82339499999999\t40.040620000000004\tRosendale city\tMO\tMissouri\tAndrew County\t176\t38.2\t14.4\t9.3\t17008\t64000\t0.3189\t64483\tRomney\t64483\t0.00043085599999999997\t64483.0\n11495\t-94.679808\t39.863792\tCosby village\tMO\tMissouri\tAndrew County\t144\t40.3\t18.8\t9.9\t25252\t126563\t0.3189\t64436\tRomney\t64436\t0.000352518\t64436.0\n11496\t-94.82713000000001\t39.939353999999994\tSavannah city\tMO\tMissouri\tAndrew County\t5034\t40.4\t19.7\t5.0\t23815\t113186\t0.3189\t64485\tRomney\t64485\t0.012323453\t64485.0\n11497\t-94.89276600000001\t39.888645000000004\tAmazonia village\tMO\tMissouri\tAndrew County\t299\t43.1\t16.6\t9.7\t21613\t85000\t0.3189\t64421\tRomney\t64421\t0.000731965\t64421.0\n11498\t-94.973116\t40.025239\tFillmore city\tMO\tMissouri\tAndrew County\t210\t37.7\t10.3\t6.6\t19604\t72500\t0.3189\t64449\tRomney\t64449\t0.000514089\t64449.0\n11499\t-94.764475\t40.061616\tRea city\tMO\tMissouri\tAndrew County\t55\t43.5\t17.5\t9.4\t19348\t90000\t0.3189\t64480\tRomney\t64480\t0.000134642\t64480.0\n11500\t-95.39194\t40.339141\tFairfax city\tMO\tMissouri\tAtchison County\t602\t47.6\t23.9\t6.8\t19019\t68684\t0.2791\t64446\tRomney\t64446\t0.001473722\t64446.0\n11501\t-95.623491\t40.479915000000005\tWatson village\tMO\tMissouri\tAtchison County\t141\t45.2\t13.3\t11.5\t22301\t72500\t0.2791\t64496\tRomney\t64496\t0.000345174\t64496.0\n11502\t-95.321899\t40.535461\tWestboro city\tMO\tMissouri\tAtchison County\t137\t47.1\t15.5\t4.0\t20535\t63333\t0.2791\t64498\tRomney\t64498\t0.00033538199999999995\t64498.0\n11503\t-95.38350600000001\t40.44308\tTarkio city\tMO\tMissouri\tAtchison County\t1734\t39.5\t25.1\t11.8\t18185\t72763\t0.2791\t64491\tRomney\t64491\t0.0042449079999999995\t64491.0\n11504\t-95.533612\t40.410762\tRock Port city\tMO\tMissouri\tAtchison County\t1274\t48.3\t18.0\t8.2\t22097\t91316\t0.2791\t64482\tRomney\t64482\t0.003118808\t64482.0\n11505\t-91.642894\t39.241991\tLaddonia city\tMO\tMissouri\tAudrain County\t615\t40.1\t10.1\t13.7\t16635\t54815\t0.3556\t63352\tRomney\t63352\t0.001505547\t63352.0\n11506\t-91.64761999999999\t39.101017\tMartinsburg town\tMO\tMissouri\tAudrain County\t326\t39.5\t11.6\t10.0\t18022\t120833\t0.3556\t65264\tRomney\t65264\t0.000798062\t65264.0\n11507\t-91.72492\t39.210183\tRush Hill village\tMO\tMissouri\tAudrain County\t123\t43.2\t7.0\t8.9\t15892\t75000\t0.3556\t65280\tRomney\t65280\t0.00030110900000000003\t65280.0\n11508\t-91.847245\t39.162224\tVandiver village\tMO\tMissouri\tAudrain County\t82\t42.5\t17.2\t13.2\t24379\t85000\t0.3556\t65265\tRomney\t65265\t0.00020074\t65265.0\n11509\t-91.57615899999999\t39.274571\tFarber city\tMO\tMissouri\tAudrain County\t447\t45.6\t6.5\t15.1\t22271\t61500\t0.3556\t63345\tRomney\t63345\t0.0010942760000000001\t63345.0\n11510\t-91.485045\t39.321102\tVandalia city\tMO\tMissouri\tAudrain County\t4230\t37.8\t10.2\t13.1\t16157\t65347\t0.3556\t63382\tRomney\t63382\t0.010355226\t63382.0\n11511\t-91.872066\t39.163786\tMexico city\tMO\tMissouri\tAudrain County\t11102\t41.8\t18.7\t9.5\t21734\t89962\t0.3556\t65265\tRomney\t65265\t0.027178183999999998\t65265.0\n11512\t-91.764907\t39.134570000000004\tBenton City village\tMO\tMissouri\tAudrain County\t116\t45.2\t7.3\t7.7\t15811\t75000\t0.3556\t65232\tRomney\t65232\t0.00028397299999999997\t65232.0\n11513\t-93.574178\t36.612325\tShell Knob CDP\tMO\tMissouri\tBarry County\t1470\t59.3\t14.4\t8.4\t20460\t129079\t0.2656\t65747\tRomney\t65747\t0.003598625\t65747.0\n11514\t-93.939983\t36.670655\tExeter city\tMO\tMissouri\tBarry County\t719\t37.3\t9.2\t12.6\t15566\t74444\t0.2656\t65647\tRomney\t65647\t0.001760144\t65647.0\n11515\t-93.671214\t36.575516\tEmerald Beach village\tMO\tMissouri\tBarry County\t266\t57.8\t14.9\t12.8\t22836\t115789\t0.2656\t65658\tRomney\t65658\t0.00065118\t65658.0\n11516\t-93.939065\t36.52353\tSeligman city\tMO\tMissouri\tBarry County\t992\t38.0\t8.0\t14.1\t14980\t81000\t0.2656\t65745\tRomney\t65745\t0.00242846\t65745.0\n11517\t-93.96576800000001\t36.589155\tWashburn city\tMO\tMissouri\tBarry County\t326\t37.3\t5.5\t6.2\t17004\t103125\t0.2656\t65745\tRomney\t65745\t0.000798062\t65745.0\n11518\t-93.920511\t36.818731\tPurdy city\tMO\tMissouri\tBarry County\t1056\t34.9\t11.0\t9.3\t14803\t78143\t0.2656\t65734\tRomney\t65734\t0.0025851339999999998\t65734.0\n11519\t-93.619647\t36.545575\tArrow Point village\tMO\tMissouri\tBarry County\t141\t57.7\t14.9\t13.7\t22910\t115000\t0.2656\t65658\tRomney\t65658\t0.000345174\t65658.0\n11520\t-93.90480500000001\t36.747046000000005\tButterfield village\tMO\tMissouri\tBarry County\t410\t34.8\t9.8\t6.9\t17757\t82500\t0.2656\t65623\tRomney\t65623\t0.0010036980000000001\t65623.0\n11521\t-93.724202\t36.534201\tChain-O-Lakes village\tMO\tMissouri\tBarry County\t132\t49.1\t17.5\t8.6\t18442\t98333\t0.2656\t65641\tRomney\t65641\t0.000323142\t65641.0\n11522\t-93.923668\t36.934815\tMonett city\tMO\tMissouri\tBarry County\t7237\t36.6\t18.3\t7.1\t18463\t98709\t0.2656\t65708\tRomney\t65708\t0.017716494\t65708.0\n11523\t-94.056988\t36.761618\tWheaton city\tMO\tMissouri\tBarry County\t736\t33.3\t4.2\t9.7\t14171\t75385\t0.2656\t64874\tRomney\t64874\t0.00180176\t64874.0\n11524\t-93.867104\t36.68036\tCassville city\tMO\tMissouri\tBarry County\t2609\t40.9\t18.1\t13.8\t18520\t97697\t0.2656\t65625\tRomney\t65625\t0.006386947\t65625.0\n11525\t-94.15815\t37.58628\tMilford village\tMO\tMissouri\tBarton County\t48\t37.5\t12.1\t5.6\t17256\t131250\t0.2141\t64784\tRomney\t64784\t0.00011750600000000001\t64784.0\n11526\t-94.27223599999999\t37.49414\tLamar city\tMO\tMissouri\tBarton County\t4466\t38.4\t12.5\t12.2\t17698\t89915\t0.2141\t64759\tRomney\t64759\t0.010932964\t64759.0\n11527\t-94.29585\t37.493988\tLamar Heights village\tMO\tMissouri\tBarton County\t210\t41.8\t15.9\t17.4\t18565\t95000\t0.2141\t64759\tRomney\t64759\t0.000514089\t64759.0\n11528\t-94.094195\t37.393089\tGolden City\tMO\tMissouri\tBarton County\t875\t36.6\t6.4\t16.0\t14748\t57647\t0.2141\t64748\tRomney\t64748\t0.0021420379999999998\t64748.0\n11529\t-94.61513000000001\t37.55622\tBurgess town\tMO\tMissouri\tBarton County\t71\t38.8\t17.8\t15.4\t15804\t75000\t0.2141\t64769\tRomney\t64769\t0.00017381099999999998\t64769.0\n11530\t-94.58887\t37.472763\tMindenmines city\tMO\tMissouri\tBarton County\t414\t38.3\t17.9\t14.6\t15844\t84167\t0.2141\t64769\tRomney\t64769\t0.00101349\t64769.0\n11531\t-94.516024\t37.559098999999996\tLiberal city\tMO\tMissouri\tBarton County\t843\t33.4\t15.1\t11.4\t16340\t55000\t0.2141\t64762\tRomney\t64762\t0.0020637010000000003\t64762.0\n11532\t-94.34953399999999\t38.395257\tAdrian city\tMO\tMissouri\tBates County\t2429\t40.0\t10.3\t12.9\t17729\t82015\t0.32899999999999996\t64720\tRomney\t64720\t0.005946299\t64720.0\n11533\t-94.59079\t38.404103000000006\tMerwin village\tMO\tMissouri\tBates County\t87\t39.2\t15.8\t9.1\t18508\t125000\t0.32899999999999996\t64723\tRomney\t64723\t0.00021298\t64723.0\n11534\t-94.583545\t38.091013000000004\tHume town\tMO\tMissouri\tBates County\t336\t40.5\t8.1\t8.9\t15484\t75000\t0.32899999999999996\t64752\tRomney\t64752\t0.000822543\t64752.0\n11535\t-94.363501\t38.095949\tRich Hill city\tMO\tMissouri\tBates County\t1396\t41.0\t11.3\t15.2\t14600\t39464\t0.32899999999999996\t64779\tRomney\t64779\t0.0034174690000000002\t64779.0\n11536\t-94.58787099999999\t38.2549\tAmoret city\tMO\tMissouri\tBates County\t214\t44.5\t5.8\t10.0\t19938\t106250\t0.32899999999999996\t64722\tRomney\t64722\t0.000523881\t64722.0\n11537\t-94.589053\t38.349409\tAmsterdam city\tMO\tMissouri\tBates County\t295\t38.7\t15.4\t8.0\t18478\t112500\t0.32899999999999996\t64723\tRomney\t64723\t0.000722173\t64723.0\n11538\t-94.080157\t38.071359\tRockville city\tMO\tMissouri\tBates County\t160\t42.5\t11.8\t10.5\t16472\t65000\t0.32899999999999996\t64780\tRomney\t64780\t0.000391687\t64780.0\n11539\t-94.34854399999999\t38.321993\tPassaic town\tMO\tMissouri\tBates County\t41\t43.3\t13.8\t9.5\t21190\t118750\t0.32899999999999996\t64730\tRomney\t64730\t0.00010037\t64730.0\n11540\t-94.339051\t38.258936\tButler city\tMO\tMissouri\tBates County\t4071\t40.7\t15.7\t13.5\t17813\t78738\t0.32899999999999996\t64730\tRomney\t64730\t0.009965986999999999\t64730.0\n11541\t-94.50790400000001\t38.16649\tFoster village\tMO\tMissouri\tBates County\t130\t39.4\t8.1\t9.4\t15431\t75000\t0.32899999999999996\t64745\tRomney\t64745\t0.000318246\t64745.0\n11542\t-93.37155\t38.244565\tWarsaw city\tMO\tMissouri\tBenton County\t2055\t46.0\t12.5\t15.1\t18841\t91604\t0.3194\t65355\tRomney\t65355\t0.00503073\t65355.0\n11543\t-93.331197\t38.393696000000006\tLincoln city\tMO\tMissouri\tBenton County\t1066\t43.1\t11.6\t8.1\t16671\t97973\t0.3194\t65338\tRomney\t65338\t0.002609615\t65338.0\n11544\t-93.206386\t38.459362\tCole Camp city\tMO\tMissouri\tBenton County\t1056\t43.3\t18.0\t5.9\t18830\t96111\t0.3194\t65325\tRomney\t65325\t0.0025851339999999998\t65325.0\n11545\t-93.322703\t38.507694\tIonia town\tMO\tMissouri\tBenton County\t108\t43.2\t4.0\t8.3\t17980\t151786\t0.3194\t65335\tRomney\t65335\t0.000264389\t65335.0\n11546\t-89.90602700000001\t37.514576\tSedgewickville village\tMO\tMissouri\tBollinger County\t237\t39.2\t5.0\t14.3\t17228\t111364\t0.2223\t63781\tRomney\t63781\t0.000580186\t63781.0\n11547\t-90.028244\t37.317051\tGlen Allen town\tMO\tMissouri\tBollinger County\t139\t39.1\t7.7\t8.5\t13859\t93333\t0.2223\t63764\tRomney\t63764\t0.000340278\t63764.0\n11548\t-90.080113\t37.144103\tZalma village\tMO\tMissouri\tBollinger County\t84\t44.5\t5.1\t18.2\t15596\t76667\t0.2223\t63787\tRomney\t63787\t0.00020563599999999998\t63787.0\n11549\t-89.98088299999999\t37.303079\tMarble Hill city\tMO\tMissouri\tBollinger County\t1710\t40.8\t11.5\t14.9\t15185\t69375\t0.2223\t63764\tRomney\t63764\t0.004186155\t63764.0\n11550\t-92.328177\t38.949926\tColumbia city\tMO\tMissouri\tBoone County\t100808\t28.2\t53.6\t9.4\t25407\t147083\t0.5017\t65201\tRomney\t65201\t0.246782413\t65201.0\n11551\t-92.45627900000001\t38.881981\tMcBaine town\tMO\tMissouri\tBoone County\t19\t40.0\t53.8\t0.0\t36205\t225000\t0.5017\t65287\tRomney\t65287\t4.6500000000000005e-05\t65287.0\n11552\t-92.281353\t39.233574\tSturgeon city\tMO\tMissouri\tBoone County\t992\t40.3\t16.7\t16.8\t21332\t78696\t0.5017\t65284\tRomney\t65284\t0.00242846\t65284.0\n11553\t-92.457964\t39.140045\tHarrisburg town\tMO\tMissouri\tBoone County\t189\t39.5\t27.6\t5.1\t20912\t123438\t0.5017\t65256\tRomney\t65256\t0.00046268\t65256.0\n11554\t-92.223961\t39.118926\tHallsville city\tMO\tMissouri\tBoone County\t1107\t37.1\t25.7\t4.8\t20088\t105410\t0.5017\t65255\tRomney\t65255\t0.002709985\t65255.0\n11555\t-92.563386\t38.979264\tRocheport city\tMO\tMissouri\tBoone County\t215\t37.5\t32.4\t9.9\t24558\t126250\t0.5017\t65279\tRomney\t65279\t0.000526329\t65279.0\n11556\t-92.310384\t38.695053\tHartsburg town\tMO\tMissouri\tBoone County\t127\t40.3\t39.3\t4.5\t25885\t187500\t0.5017\t65039\tRomney\t65039\t0.000310902\t65039.0\n11557\t-92.257293\t38.774215000000005\tAshland city\tMO\tMissouri\tBoone County\t2136\t39.1\t34.7\t5.5\t23316\t148864\t0.5017\t65010\tRomney\t65010\t0.005229022\t65010.0\n11558\t-92.10463\t39.217232\tCentralia city\tMO\tMissouri\tBoone County\t3834\t37.6\t15.8\t11.3\t21316\t87963\t0.5017\t65240\tRomney\t65240\t0.0093858\t65240.0\n11559\t-94.640158\t39.722046\tEaston city\tMO\tMissouri\tBuchanan County\t291\t44.2\t20.2\t7.0\t23771\t140385\t0.4442\t64443\tRomney\t64443\t0.0007123810000000001\t64443.0\n11560\t-94.92354300000001\t39.588219\tDe Kalb town\tMO\tMissouri\tBuchanan County\t263\t38.7\t11.4\t9.6\t20611\t89167\t0.4442\t64440\tRomney\t64440\t0.000643836\t64440.0\n11561\t-94.747388\t39.659613\tAgency village\tMO\tMissouri\tBuchanan County\t638\t39.2\t18.8\t5.1\t23269\t145122\t0.4442\t64401\tRomney\t64401\t0.001561852\t64401.0\n11562\t-95.05054399999999\t39.537626\tLewis and Clark Village town\tMO\tMissouri\tBuchanan County\t157\t42.9\t11.4\t11.0\t20877\t100000\t0.4442\t64484\tRomney\t64484\t0.00038434300000000004\t64484.0\n11563\t-94.821251\t39.75922\tSt. Joseph city\tMO\tMissouri\tBuchanan County\t75960\t37.1\t20.6\t9.8\t21665\t95212\t0.4442\t64503\tRomney\t64503\t0.185953418\t64503.0\n11564\t-95.023391\t39.587649\tRushville town\tMO\tMissouri\tBuchanan County\t287\t38.7\t11.5\t9.5\t20574\t85833\t0.4442\t64484\tRomney\t64484\t0.000702589\t64484.0\n11565\t-90.25703100000001\t36.597737\tQulin city\tMO\tMissouri\tButler County\t468\t43.7\t6.7\t14.5\t14443\t55667\t0.2583\t63961\tRomney\t63961\t0.001145685\t63961.0\n11566\t-90.207577\t36.782646\tFisk city\tMO\tMissouri\tButler County\t332\t43.5\t6.0\t14.8\t17269\t62250\t0.2583\t63940\tRomney\t63940\t0.000812751\t63940.0\n11567\t-90.513829\t36.556261\tNeelyville city\tMO\tMissouri\tButler County\t442\t37.6\t2.5\t9.3\t13637\t39167\t0.2583\t63954\tRomney\t63954\t0.001082035\t63954.0\n11568\t-90.410712\t36.762402\tPoplar Bluff city\tMO\tMissouri\tButler County\t15970\t39.4\t14.2\t12.9\t18174\t72557\t0.2583\t63901\tRomney\t63901\t0.039095262\t63901.0\n11569\t-93.796083\t39.590768\tBraymer city\tMO\tMissouri\tCaldwell County\t878\t41.1\t11.7\t19.0\t15464\t58621\t0.3149\t64624\tRomney\t64624\t0.002149383\t64624.0\n11570\t-94.039967\t39.551777\tPolo city\tMO\tMissouri\tCaldwell County\t643\t40.8\t8.4\t14.0\t21052\t78000\t0.3149\t64671\tRomney\t64671\t0.001574092\t64671.0\n11571\t-94.102595\t39.782083\tKidder city\tMO\tMissouri\tCaldwell County\t290\t39.4\t19.4\t10.0\t20175\t112500\t0.3149\t64649\tRomney\t64649\t0.000709933\t64649.0\n11572\t-93.926037\t39.560177\tCowgill city\tMO\tMissouri\tCaldwell County\t259\t42.0\t10.2\t15.3\t16149\t76000\t0.3149\t64637\tRomney\t64637\t0.000634043\t64637.0\n11573\t-93.80467\t39.761518\tBreckenridge city\tMO\tMissouri\tCaldwell County\t442\t40.1\t12.7\t14.6\t17055\t58182\t0.3149\t64625\tRomney\t64625\t0.001082035\t64625.0\n11574\t-94.001238\t39.743153\tHamilton city\tMO\tMissouri\tCaldwell County\t1706\t39.5\t17.1\t9.3\t15958\t74394\t0.3149\t64644\tRomney\t64644\t0.004176363\t64644.0\n11575\t-94.038022\t39.643395\tKingston city\tMO\tMissouri\tCaldwell County\t288\t41.6\t12.1\t10.4\t17328\t78889\t0.3149\t64650\tRomney\t64650\t0.0007050369999999999\t64650.0\n11576\t-92.088634\t38.719885999999995\tNew Bloomfield city\tMO\tMissouri\tCallaway County\t648\t38.9\t14.0\t7.7\t22627\t106818\t0.33299999999999996\t65063\tRomney\t65063\t0.0015863320000000002\t65063.0\n11577\t-91.949828\t38.85373\tFulton city\tMO\tMissouri\tCallaway County\t12103\t32.6\t24.2\t12.9\t20204\t101462\t0.33299999999999996\t65251\tRomney\t65251\t0.029628676\t65251.0\n11578\t-91.872477\t38.674492\tMokane city\tMO\tMissouri\tCallaway County\t221\t38.3\t9.5\t5.7\t21324\t120313\t0.33299999999999996\t65059\tRomney\t65059\t0.000541018\t65059.0\n11579\t-91.893609\t39.017931\tAuxvasse city\tMO\tMissouri\tCallaway County\t980\t40.9\t12.0\t5.0\t17504\t68235\t0.33299999999999996\t65231\tRomney\t65231\t0.0023990829999999998\t65231.0\n11580\t-92.10136999999999\t38.676277\tLake Mykee Town village\tMO\tMissouri\tCallaway County\t346\t40.0\t17.4\t9.6\t23174\t140625\t0.33299999999999996\t65043\tRomney\t65043\t0.000847023\t65043.0\n11581\t-92.11492\t38.644884000000005\tHolts Summit city\tMO\tMissouri\tCallaway County\t3514\t35.2\t23.3\t7.7\t21847\t115144\t0.33299999999999996\t65043\tRomney\t65043\t0.008602426\t65043.0\n11582\t-91.937517\t38.946811\tKingdom City village\tMO\tMissouri\tCallaway County\t131\t38.9\t20.2\t7.1\t25472\t129167\t0.33299999999999996\t65262\tRomney\t65262\t0.000320694\t65262.0\n11583\t-92.717376\t38.047682\tLinn Creek city\tMO\tMissouri\tCamden County\t276\t37.2\t15.4\t9.4\t17885\t98333\t0.2943\t65052\tRomney\t65052\t0.00067566\t65052.0\n11584\t-92.596272\t38.151013\tOsage Beach city\tMO\tMissouri\tCamden County\t3822\t49.1\t27.9\t8.0\t26559\t147321\t0.2943\t65047\tRomney\t65047\t0.009356424\t65047.0\n11585\t-92.971544\t37.965449\tMacks Creek city\tMO\tMissouri\tCamden County\t283\t41.2\t7.2\t15.5\t17193\t76500\t0.2943\t65786\tRomney\t65786\t0.0006927960000000001\t65786.0\n11586\t-92.718828\t38.197794\tVillage of Four Seasons village\tMO\tMissouri\tCamden County\t1897\t51.0\t38.8\t6.1\t40353\t245313\t0.2943\t65049\tRomney\t65049\t0.004643939000000001\t65049.0\n11587\t-92.770881\t38.193354\tSunrise Beach village\tMO\tMissouri\tCamden County\t369\t60.8\t18.4\t12.1\t27667\t144079\t0.2943\t65079\tRomney\t65079\t0.000903328\t65079.0\n11588\t-92.747624\t38.007915999999994\tCamdenton city\tMO\tMissouri\tCamden County\t2867\t39.9\t16.8\t13.1\t20768\t103208\t0.2943\t65020\tRomney\t65020\t0.007018541999999999\t65020.0\n11589\t-93.051109\t38.101594\tClimax Springs village\tMO\tMissouri\tCamden County\t91\t63.2\t7.4\t10.7\t24701\t120000\t0.2943\t65324\tRomney\t65324\t0.00022277200000000001\t65324.0\n11590\t-92.511014\t37.815637\tStoutland village\tMO\tMissouri\tCamden County\t201\t41.7\t12.1\t9.3\t17907\t83000\t0.2943\t65567\tRomney\t65567\t0.000492057\t65567.0\n11591\t-89.65166500000001\t37.379314\tJackson city\tMO\tMissouri\tCape Girardeau County\t13893\t38.4\t27.8\t5.7\t23458\t138780\t0.2724\t63755\tRomney\t63755\t0.034010674\t63755.0\n11592\t-89.710803\t37.594048\tOld Appleton town\tMO\tMissouri\tCape Girardeau County\t92\t39.4\t17.5\t9.3\t19553\t129167\t0.2724\t63770\tRomney\t63770\t0.00022522\t63770.0\n11593\t-89.755533\t37.221683\tAllenville village\tMO\tMissouri\tCape Girardeau County\t116\t43.3\t30.1\t4.9\t23042\t125000\t0.2724\t63785\tRomney\t63785\t0.00028397299999999997\t63785.0\n11594\t-89.79785\t37.236746000000004\tWhitewater town\tMO\tMissouri\tCape Girardeau County\t120\t44.1\t16.5\t8.3\t19239\t88333\t0.2724\t63785\tRomney\t63785\t0.000293765\t63785.0\n11595\t-89.55148100000001\t37.312194\tCape Girardeau city\tMO\tMissouri\tCape Girardeau County\t36415\t35.4\t33.7\t10.8\t23786\t124573\t0.2724\t63701\tRomney\t63701\t0.08914552\t63701.0\n11596\t-89.655336\t37.250628999999996\tDutchtown village\tMO\tMissouri\tCape Girardeau County\t118\t41.4\t31.0\t5.4\t24336\t146875\t0.2724\t63740\tRomney\t63740\t0.00028886900000000003\t63740.0\n11597\t-89.673952\t37.311053\tGordonville village\tMO\tMissouri\tCape Girardeau County\t479\t42.9\t30.9\t5.6\t23166\t130952\t0.2724\t63755\tRomney\t63755\t0.001172613\t63755.0\n11598\t-89.63979599999999\t37.501694\tPocahontas town\tMO\tMissouri\tCape Girardeau County\t142\t40.3\t14.1\t7.4\t21291\t108333\t0.2724\t63755\tRomney\t63755\t0.00034762199999999996\t63755.0\n11599\t-89.729111\t37.499381\tOak Ridge town\tMO\tMissouri\tCape Girardeau County\t226\t40.2\t16.7\t10.4\t19617\t112500\t0.2724\t63769\tRomney\t63769\t0.000553258\t63769.0\n11600\t-89.739762\t37.197358\tDelta city\tMO\tMissouri\tCape Girardeau County\t528\t39.1\t9.5\t13.1\t14658\t66250\t0.2724\t63740\tRomney\t63740\t0.0012925669999999999\t63740.0\n11601\t-93.335551\t39.469916\tBosworth city\tMO\tMissouri\tCarroll County\t375\t43.6\t18.2\t17.3\t19828\t60909\t0.2681\t64623\tRomney\t64623\t0.000918016\t64623.0\n11602\t-93.343265\t39.60503\tHale city\tMO\tMissouri\tCarroll County\t551\t37.5\t7.6\t9.2\t17594\t56765\t0.2681\t64643\tRomney\t64643\t0.001348872\t64643.0\n11603\t-93.523861\t39.457928\tBogard city\tMO\tMissouri\tCarroll County\t235\t39.8\t7.1\t11.0\t13713\t80000\t0.2681\t64622\tRomney\t64622\t0.00057529\t64622.0\n11604\t-93.440989\t39.538064\tTina village\tMO\tMissouri\tCarroll County\t190\t45.9\t10.6\t10.5\t17415\t97500\t0.2681\t64682\tRomney\t64682\t0.00046512800000000004\t64682.0\n11605\t-93.495063\t39.363263\tCarrollton city\tMO\tMissouri\tCarroll County\t3797\t42.9\t16.0\t13.6\t19948\t78603\t0.2681\t64633\tRomney\t64633\t0.009295223\t64633.0\n11606\t-93.219972\t39.384915\tDe Witt city\tMO\tMissouri\tCarroll County\t113\t46.0\t10.5\t5.8\t19431\t103125\t0.2681\t64639\tRomney\t64639\t0.000276629\t64639.0\n11607\t-93.676175\t39.302572999999995\tNorborne city\tMO\tMissouri\tCarroll County\t749\t41.0\t11.0\t12.1\t16113\t64545\t0.2681\t64668\tRomney\t64668\t0.001833585\t64668.0\n11608\t-90.82187900000001\t36.830759\tGrandin city\tMO\tMissouri\tCarter County\t229\t38.7\t7.3\t12.5\t13650\t63000\t0.2694\t63943\tRomney\t63943\t0.000560602\t63943.0\n11609\t-90.746495\t36.933840000000004\tEllsinore city\tMO\tMissouri\tCarter County\t407\t40.8\t11.7\t9.3\t14881\t82000\t0.2694\t63937\tRomney\t63937\t0.0009963539999999999\t63937.0\n11610\t-91.011338\t37.008115999999994\tVan Buren town\tMO\tMissouri\tCarter County\t799\t45.6\t17.2\t7.2\t18339\t85769\t0.2694\t63965\tRomney\t63965\t0.001955987\t63965.0\n11611\t-94.229341\t38.668315\tEast Lynne city\tMO\tMissouri\tCass County\t332\t38.5\t12.0\t16.2\t23453\t148864\t0.3485\t64743\tRomney\t64743\t0.000812751\t64743.0\n11612\t-94.45875600000001\t38.723378000000004\tPeculiar city\tMO\tMissouri\tCass County\t4193\t34.7\t15.1\t11.0\t21709\t135899\t0.3485\t64078\tRomney\t64078\t0.010264648000000001\t64078.0\n11613\t-94.264127\t38.796159\tPleasant Hill city\tMO\tMissouri\tCass County\t7516\t33.2\t22.9\t10.7\t26145\t129058\t0.3485\t64080\tRomney\t64080\t0.018399498\t64080.0\n11614\t-94.349758\t38.483027\tArchie city\tMO\tMissouri\tCass County\t987\t37.4\t12.8\t10.8\t22944\t104531\t0.3485\t64725\tRomney\t64725\t0.002416219\t64725.0\n11615\t-94.071855\t38.495888\tCreighton city\tMO\tMissouri\tCass County\t335\t40.7\t10.2\t12.3\t21573\t98750\t0.3485\t64739\tRomney\t64739\t0.000820095\t64739.0\n11616\t-94.35984499999999\t38.824208\tLake Winnebago city\tMO\tMissouri\tCass County\t1140\t46.5\t39.9\t7.6\t41461\t269718\t0.3485\t64034\tRomney\t64034\t0.00279077\t64034.0\n11617\t-94.53154599999999\t38.818836\tBelton city\tMO\tMissouri\tCass County\t23637\t34.3\t16.3\t15.0\t24269\t109203\t0.3485\t64012\tRomney\t64012\t0.057864415\t64012.0\n11618\t-94.598662\t38.679508\tCleveland city\tMO\tMissouri\tCass County\t636\t44.5\t21.4\t11.2\t28541\t181818\t0.3485\t64734\tRomney\t64734\t0.001556956\t64734.0\n11619\t-94.458762\t38.804557\tRaymore city\tMO\tMissouri\tCass County\t18907\t37.7\t28.4\t7.2\t29641\t164987\t0.3485\t64083\tRomney\t64083\t0.046285167\t64083.0\n11620\t-94.19308000000001\t38.559872999999996\tGarden City\tMO\tMissouri\tCass County\t1979\t34.1\t12.8\t11.0\t21978\t93136\t0.3485\t64747\tRomney\t64747\t0.004844679\t64747.0\n11621\t-94.34697800000001\t38.655102\tHarrisonville city\tMO\tMissouri\tCass County\t9883\t36.7\t14.3\t12.3\t24270\t109800\t0.3485\t64701\tRomney\t64701\t0.024194017999999998\t64701.0\n11622\t-94.50809699999999\t38.654284000000004\tLake Annette city\tMO\tMissouri\tCass County\t211\t40.7\t15.8\t8.0\t24216\t113542\t0.3485\t64746\tRomney\t64746\t0.000516537\t64746.0\n11623\t-94.16467\t38.759852\tStrasburg city\tMO\tMissouri\tCass County\t138\t43.0\t19.1\t7.5\t26553\t202778\t0.3485\t64090\tRomney\t64090\t0.00033783\t64090.0\n11624\t-94.585321\t38.633002000000005\tWest Line village\tMO\tMissouri\tCass County\t97\t43.3\t22.4\t11.6\t27139\t195833\t0.3485\t64734\tRomney\t64734\t0.00023746\t64734.0\n11625\t-94.506619\t38.619521999999996\tFreeman city\tMO\tMissouri\tCass County\t719\t40.7\t16.7\t8.3\t24387\t117000\t0.3485\t64746\tRomney\t64746\t0.001760144\t64746.0\n11626\t-94.163862\t38.666036\tGunn City village\tMO\tMissouri\tCass County\t94\t38.6\t12.9\t15.8\t23476\t158333\t0.3485\t64743\tRomney\t64743\t0.000230116\t64743.0\n11627\t-94.247015\t38.794072\tBaldwin Park village\tMO\tMissouri\tCass County\t118\t33.5\t25.3\t8.6\t27667\t166667\t0.3485\t64080\tRomney\t64080\t0.00028886900000000003\t64080.0\n11628\t-94.606702\t38.484907\tDrexel city\tMO\tMissouri\tCass County\t1401\t38.8\t12.3\t10.2\t23752\t89000\t0.3485\t64742\tRomney\t64742\t0.00342971\t64742.0\n11629\t-93.803539\t37.623560999999995\tUmber View Heights village\tMO\tMissouri\tCedar County\t54\t51.7\t20.9\t3.8\t21089\t137500\t0.2543\t65785\tRomney\t65785\t0.000132194\t65785.0\n11630\t-94.018986\t37.869079\tEl Dorado Springs city\tMO\tMissouri\tCedar County\t3827\t42.9\t11.6\t12.1\t15654\t72973\t0.2543\t64744\tRomney\t64744\t0.009368664\t64744.0\n11631\t-93.79584200000001\t37.697561\tStockton city\tMO\tMissouri\tCedar County\t1935\t44.4\t16.2\t8.6\t18489\t87845\t0.2543\t65785\tRomney\t65785\t0.004736965\t65785.0\n11632\t-94.01120999999999\t37.619640000000004\tJerico Springs village\tMO\tMissouri\tCedar County\t237\t43.5\t5.7\t8.0\t15961\t73889\t0.2543\t64756\tRomney\t64756\t0.000580186\t64756.0\n11633\t-92.93722199999999\t39.432465\tKeytesville city\tMO\tMissouri\tChariton County\t489\t46.0\t13.2\t10.5\t17533\t56923\t0.3504\t65261\tRomney\t65261\t0.001197093\t65261.0\n11634\t-93.12666800000001\t39.425688\tBrunswick city\tMO\tMissouri\tChariton County\t855\t47.2\t13.1\t12.2\t18329\t45455\t0.3504\t65236\tRomney\t65236\t0.002093078\t65236.0\n11635\t-93.061417\t39.653657\tRothville village\tMO\tMissouri\tChariton County\t85\t44.5\t10.2\t14.6\t16476\t80000\t0.3504\t64676\tRomney\t64676\t0.000208084\t64676.0\n11636\t-93.244038\t39.656071999999995\tSumner town\tMO\tMissouri\tChariton County\t129\t43.1\t11.1\t15.9\t16575\t72500\t0.3504\t64681\tRomney\t64681\t0.000315798\t64681.0\n11637\t-92.802313\t39.423462\tSalisbury city\tMO\tMissouri\tChariton County\t1608\t47.1\t14.0\t7.1\t18154\t68962\t0.3504\t65281\tRomney\t65281\t0.003936455\t65281.0\n11638\t-93.193859\t39.498278000000006\tTriplett city\tMO\tMissouri\tChariton County\t58\t46.9\t15.9\t10.0\t18414\t92500\t0.3504\t65286\tRomney\t65286\t0.000141987\t65286.0\n11639\t-93.13399100000001\t39.590657\tMendon city\tMO\tMissouri\tChariton County\t189\t42.7\t10.7\t16.1\t16573\t76667\t0.3504\t64660\tRomney\t64660\t0.00046268\t64660.0\n11640\t-92.992163\t39.397690000000004\tDalton town\tMO\tMissouri\tChariton County\t25\t42.5\t15.0\t9.1\t17405\t55000\t0.3504\t65246\tRomney\t65246\t6.12e-05\t65246.0\n11641\t-93.22612\t37.035288\tOzark city\tMO\tMissouri\tChristian County\t15074\t33.2\t28.4\t9.0\t23637\t157853\t0.2585\t65721\tRomney\t65721\t0.036901814\t65721.0\n11642\t-93.253393\t37.065351\tFremont Hills city\tMO\tMissouri\tChristian County\t878\t31.0\t34.1\t8.2\t27117\t216964\t0.2585\t65714\tRomney\t65714\t0.002149383\t65714.0\n11643\t-93.471586\t37.029725\tClever city\tMO\tMissouri\tChristian County\t1783\t33.9\t13.6\t9.5\t18252\t111310\t0.2585\t65631\tRomney\t65631\t0.004364862\t65631.0\n11644\t-93.28303199999999\t36.94056\tHighlandville city\tMO\tMissouri\tChristian County\t1078\t39.2\t18.6\t8.9\t17322\t146750\t0.2585\t65669\tRomney\t65669\t0.002638991\t65669.0\n11645\t-93.301423\t37.045738\tNixa city\tMO\tMissouri\tChristian County\t17426\t32.9\t25.0\t9.0\t23695\t144648\t0.2585\t65714\tRomney\t65714\t0.042659614000000005\t65714.0\n11646\t-93.30525899999999\t36.863437\tSpokane CDP\tMO\tMissouri\tChristian County\t212\t37.4\t12.1\t11.6\t17116\t159375\t0.2585\t65754\tRomney\t65754\t0.000518985\t65754.0\n11647\t-93.08424699999999\t37.000916\tSparta city\tMO\tMissouri\tChristian County\t1524\t37.9\t8.9\t8.5\t16099\t110938\t0.2585\t65753\tRomney\t65753\t0.0037308190000000002\t65753.0\n11648\t-93.554845\t37.06405\tBillings city\tMO\tMissouri\tChristian County\t1320\t39.5\t16.6\t9.2\t17558\t115451\t0.2585\t65610\tRomney\t65610\t0.003231418\t65610.0\n11649\t-91.581818\t40.394971000000005\tWayland city\tMO\tMissouri\tClark County\t468\t41.3\t7.7\t18.6\t16011\t71944\t0.4335\t63472\tRomney\t63472\t0.001145685\t63472.0\n11650\t-91.676249\t40.494354\tRevere town\tMO\tMissouri\tClark County\t115\t43.3\t8.5\t10.7\t16136\t70000\t0.4335\t63465\tRomney\t63465\t0.000281525\t63465.0\n11651\t-91.459484\t40.359685999999996\tAlexandria city\tMO\tMissouri\tClark County\t159\t39.4\t5.9\t16.9\t16889\t71250\t0.4335\t63430\tRomney\t63430\t0.000389239\t63430.0\n11652\t-91.718859\t40.42372\tKahoka city\tMO\tMissouri\tClark County\t2191\t41.3\t11.1\t15.1\t16720\t71585\t0.4335\t63445\tRomney\t63445\t0.005363664000000001\t63445.0\n11653\t-91.925931\t40.392176\tWyaconda city\tMO\tMissouri\tClark County\t281\t44.2\t14.2\t12.8\t19055\t66875\t0.4335\t63474\tRomney\t63474\t0.0006879\t63474.0\n11654\t-91.884107\t40.45238\tLuray village\tMO\tMissouri\tClark County\t95\t41.9\t11.9\t9.8\t19132\t85000\t0.4335\t63453\tRomney\t63453\t0.00023256400000000002\t63453.0\n11655\t-94.573996\t39.204685\tOakwood Park village\tMO\tMissouri\tClay County\t192\t34.0\t26.3\t7.8\t27924\t132813\t0.4481\t64118\tRomney\t64118\t0.00047002400000000004\t64118.0\n11656\t-94.481312\t39.217307\tPleasant Valley city\tMO\tMissouri\tClay County\t3341\t38.0\t16.9\t11.5\t28401\t130631\t0.4481\t64158\tRomney\t64158\t0.008178915\t64158.0\n11657\t-94.47919300000001\t39.198921999999996\tClaycomo village\tMO\tMissouri\tClay County\t1209\t40.0\t5.8\t12.2\t29299\t101852\t0.4481\t64158\tRomney\t64158\t0.002959685\t64158.0\n11658\t-94.202735\t39.33987\tExcelsior Springs city\tMO\tMissouri\tClay County\t11457\t35.7\t13.8\t12.0\t23151\t107481\t0.4481\t64024\tRomney\t64024\t0.028047238999999998\t64024.0\n11659\t-94.559413\t39.213229999999996\tGladstone city\tMO\tMissouri\tClay County\t26751\t41.5\t28.6\t9.1\t30110\t134106\t0.4481\t64118\tRomney\t64118\t0.065487623\t64118.0\n11660\t-94.576187\t39.38885\tSmithville city\tMO\tMissouri\tClay County\t7435\t35.2\t24.4\t8.2\t29523\t158202\t0.4481\t64089\tRomney\t64089\t0.018201207\t64089.0\n11661\t-94.44973900000001\t39.167481\tBirmingham village\tMO\tMissouri\tClay County\t199\t40.0\t11.8\t17.0\t22471\t95000\t0.4481\t64161\tRomney\t64161\t0.000487161\t64161.0\n11662\t-94.570585\t39.200562\tOakwood village\tMO\tMissouri\tClay County\t199\t39.1\t27.5\t7.4\t27682\t126250\t0.4481\t64118\tRomney\t64118\t0.000487161\t64118.0\n11663\t-94.273522\t39.315528\tPrathersville village\tMO\tMissouri\tClay County\t122\t40.7\t26.8\t9.6\t25716\t154167\t0.4481\t64024\tRomney\t64024\t0.000298661\t64024.0\n11664\t-94.364582\t39.367484999999995\tKearney city\tMO\tMissouri\tClay County\t8070\t31.8\t28.0\t8.6\t31788\t157374\t0.4481\t64060\tRomney\t64060\t0.019755715\t64060.0\n11665\t-94.492474\t39.156096999999995\tRandolph village\tMO\tMissouri\tClay County\t45\t36.9\t7.1\t4.3\t23586\t103125\t0.4481\t64161\tRomney\t64161\t0.000110162\t64161.0\n11666\t-94.54520699999999\t39.154488\tAvondale city\tMO\tMissouri\tClay County\t519\t39.4\t19.8\t10.4\t24947\t106798\t0.4481\t64117\tRomney\t64117\t0.001270535\t64117.0\n11667\t-94.302161\t39.319140999999995\tMosby city\tMO\tMissouri\tClay County\t266\t40.3\t27.1\t9.7\t25705\t160000\t0.4481\t64060\tRomney\t64060\t0.00065118\t64060.0\n11668\t-94.299846\t39.238501\tMissouri City\tMO\tMissouri\tClay County\t352\t33.4\t32.3\t6.1\t34067\t159821\t0.4481\t64072\tRomney\t64072\t0.000861711\t64072.0\n11669\t-94.564386\t39.139644\tNorth Kansas City\tMO\tMissouri\tClay County\t4746\t37.3\t15.7\t15.4\t24144\t100880\t0.4481\t64116\tRomney\t64116\t0.011618416999999999\t64116.0\n11670\t-94.418758\t39.242278999999996\tLiberty city\tMO\tMissouri\tClay County\t28448\t36.6\t34.5\t10.2\t29866\t153615\t0.4481\t64068\tRomney\t64068\t0.069641954\t64068.0\n11671\t-94.57194799999999\t39.197023\tOaks village\tMO\tMissouri\tClay County\t133\t44.2\t28.9\t6.8\t27702\t122500\t0.4481\t64118\tRomney\t64118\t0.00032559\t64118.0\n11672\t-94.4511\t39.219687\tGlenaire city\tMO\tMissouri\tClay County\t596\t41.5\t37.7\t7.6\t28111\t151389\t0.4481\t64158\tRomney\t64158\t0.001459034\t64158.0\n11673\t-94.570441\t39.208535\tOakview village\tMO\tMissouri\tClay County\t395\t37.7\t26.0\t7.7\t27621\t122414\t0.4481\t64118\tRomney\t64118\t0.0009669769999999999\t64118.0\n11674\t-94.320819\t39.637753000000004\tTurney village\tMO\tMissouri\tClinton County\t184\t43.3\t13.1\t9.3\t23683\t125000\t0.374\t64493\tRomney\t64493\t0.00045044\t64493.0\n11675\t-94.59440500000001\t39.612757\tGower city\tMO\tMissouri\tClinton County\t1498\t39.6\t22.9\t12.0\t26112\t108163\t0.374\t64454\tRomney\t64454\t0.00366717\t64454.0\n11676\t-94.323949\t39.460077000000005\tHolt city\tMO\tMissouri\tClinton County\t461\t41.6\t14.0\t26.0\t27628\t151316\t0.374\t64048\tRomney\t64048\t0.001128548\t64048.0\n11677\t-94.328655\t39.550022999999996\tLathrop city\tMO\tMissouri\tClinton County\t2327\t34.5\t13.3\t10.5\t20921\t107246\t0.374\t64465\tRomney\t64465\t0.005696598000000001\t64465.0\n11678\t-94.46148000000001\t39.563862\tPlattsburg city\tMO\tMissouri\tClinton County\t2470\t41.9\t21.3\t13.5\t23278\t115487\t0.374\t64477\tRomney\t64477\t0.006046669\t64477.0\n11679\t-94.561363\t39.476234000000005\tTrimble city\tMO\tMissouri\tClinton County\t678\t41.7\t12.0\t10.1\t26728\t132870\t0.374\t64492\tRomney\t64492\t0.001659774\t64492.0\n11680\t-94.229947\t39.754225\tCameron city\tMO\tMissouri\tClinton County\t9619\t36.2\t14.1\t19.6\t18679\t102091\t0.374\t64429\tRomney\t64429\t0.023547735\t64429.0\n11681\t-92.160647\t38.591865999999996\tJefferson City\tMO\tMissouri\tCole County\t39127\t37.9\t36.1\t9.3\t27367\t133420\t0.3239\t65043\tRomney\t65043\t0.095784615\t65043.0\n11682\t-92.409256\t38.617737\tCentertown town\tMO\tMissouri\tCole County\t284\t43.3\t18.6\t6.7\t24945\t130147\t0.3239\t65023\tRomney\t65023\t0.0006952439999999999\t65023.0\n11683\t-92.36405500000001\t38.543042\tLohman city\tMO\tMissouri\tCole County\t189\t40.7\t24.8\t4.0\t21255\t162500\t0.3239\t65053\tRomney\t65053\t0.00046268\t65053.0\n11684\t-92.07814\t38.499618\tTaos city\tMO\tMissouri\tCole County\t989\t37.9\t18.8\t3.8\t22175\t139474\t0.3239\t65101\tRomney\t65101\t0.002421115\t65101.0\n11685\t-92.21531800000001\t38.366303\tSt. Thomas town\tMO\tMissouri\tCole County\t287\t34.1\t24.0\t5.8\t21423\t133750\t0.3239\t65076\tRomney\t65076\t0.000702589\t65076.0\n11686\t-92.176302\t38.485143\tWardsville village\tMO\tMissouri\tCole County\t1098\t39.1\t21.2\t3.8\t26232\t184000\t0.3239\t651HH\tRomney\t651HH\t0.002687952\t0.0\n11687\t-92.438592\t38.512948\tRussellville city\tMO\tMissouri\tCole County\t837\t36.2\t18.5\t5.3\t22460\t112829\t0.3239\t65074\tRomney\t65074\t0.0020490129999999997\t65074.0\n11688\t-92.33445999999999\t38.595216\tSt. Martins city\tMO\tMissouri\tCole County\t1191\t35.5\t18.8\t6.7\t22130\t119583\t0.3239\t65053\tRomney\t65053\t0.00291562\t65053.0\n11689\t-92.74915899999999\t38.961022\tBoonville city\tMO\tMissouri\tCooper County\t8565\t31.1\t17.7\t10.1\t19357\t107383\t0.3294\t65233\tRomney\t65233\t0.020967496000000002\t65233.0\n11690\t-92.52128499999999\t38.906518\tWooldridge village\tMO\tMissouri\tCooper County\t55\t42.5\t20.0\t9.1\t20900\t137500\t0.3294\t65287\tRomney\t65287\t0.000134642\t65287.0\n11691\t-92.799155\t38.789441\tBunceton city\tMO\tMissouri\tCooper County\t373\t41.7\t9.2\t9.8\t17728\t78333\t0.3294\t65237\tRomney\t65237\t0.00091312\t65237.0\n11692\t-92.991922\t38.979175\tBlackwater city\tMO\tMissouri\tCooper County\t197\t43.5\t11.6\t10.6\t15611\t93750\t0.3294\t65322\tRomney\t65322\t0.000482265\t65322.0\n11693\t-93.002702\t38.70284\tOtterville city\tMO\tMissouri\tCooper County\t488\t39.0\t11.2\t12.2\t17103\t88182\t0.3294\t65348\tRomney\t65348\t0.001194645\t65348.0\n11694\t-92.590558\t38.813567\tPrairie Home city\tMO\tMissouri\tCooper County\t233\t41.2\t19.6\t9.8\t18897\t131818\t0.3294\t65068\tRomney\t65068\t0.000570394\t65068.0\n11695\t-92.912586\t38.873636\tPilot Grove city\tMO\tMissouri\tCooper County\t726\t39.8\t8.3\t5.6\t18711\t87500\t0.3294\t65276\tRomney\t65276\t0.00177728\t65276.0\n11696\t-91.354248\t37.968626\tSteelville city\tMO\tMissouri\tCrawford County\t1442\t43.7\t13.8\t12.6\t14839\t79324\t0.3081\t65565\tRomney\t65565\t0.003530079\t65565.0\n11697\t-91.248714\t38.150797999999995\tBourbon city\tMO\tMissouri\tCrawford County\t1412\t35.6\t13.7\t12.2\t16588\t91250\t0.3081\t65441\tRomney\t65441\t0.0034566379999999997\t65441.0\n11698\t-91.21277099999999\t38.173435\tSt. Cloud village\tMO\tMissouri\tCrawford County\t58\t39.4\t10.3\t10.3\t19153\t116667\t0.3081\t65441\tRomney\t65441\t0.000141987\t65441.0\n11699\t-91.295322\t38.094868\tLeasburg village\tMO\tMissouri\tCrawford County\t370\t39.0\t4.0\t21.7\t16465\t92917\t0.3081\t65535\tRomney\t65535\t0.0009057760000000001\t65535.0\n11700\t-91.404258\t38.066903\tCuba city\tMO\tMissouri\tCrawford County\t3432\t38.6\t11.1\t14.8\t15947\t84576\t0.3081\t65453\tRomney\t65453\t0.008401687\t65453.0\n11701\t-93.95806800000001\t37.387115\tLockwood city\tMO\tMissouri\tDade County\t1074\t40.0\t18.0\t12.4\t16743\t67500\t0.24100000000000002\t65682\tRomney\t65682\t0.002629199\t65682.0\n11702\t-93.875874\t37.549358000000005\tArcola village\tMO\tMissouri\tDade County\t41\t45.6\t6.9\t6.3\t17327\t85000\t0.24100000000000002\t65603\tRomney\t65603\t0.00010037\t65603.0\n11703\t-93.843618\t37.375184000000004\tSouth Greenfield village\tMO\tMissouri\tDade County\t119\t43.3\t17.9\t11.5\t14222\t116667\t0.24100000000000002\t65752\tRomney\t65752\t0.00029131700000000003\t65752.0\n11704\t-93.843172\t37.416418\tGreenfield city\tMO\tMissouri\tDade County\t1295\t46.6\t9.3\t10.6\t15674\t71429\t0.24100000000000002\t65661\tRomney\t65661\t0.003170217\t65661.0\n11705\t-93.70240600000001\t37.342845000000004\tEverton city\tMO\tMissouri\tDade County\t337\t43.1\t7.6\t13.3\t16035\t84375\t0.24100000000000002\t65646\tRomney\t65646\t0.0008249910000000001\t65646.0\n11706\t-93.67394\t37.479324\tDadeville village\tMO\tMissouri\tDade County\t205\t45.8\t12.2\t11.6\t17442\t100000\t0.24100000000000002\t65635\tRomney\t65635\t0.0005018490000000001\t65635.0\n11707\t-93.097495\t37.644317\tBuffalo city\tMO\tMissouri\tDallas County\t3112\t39.0\t12.6\t14.1\t17105\t92000\t0.2915\t65622\tRomney\t65622\t0.007618313000000001\t65622.0\n11708\t-93.167576\t37.84348\tUrbana city\tMO\tMissouri\tDallas County\t436\t43.8\t8.1\t10.0\t17821\t100000\t0.2915\t65767\tRomney\t65767\t0.001067347\t65767.0\n11709\t-93.141047\t37.756389\tLouisburg village\tMO\tMissouri\tDallas County\t159\t40.0\t15.0\t11.1\t14487\t83750\t0.2915\t65685\tRomney\t65685\t0.000389239\t65685.0\n11710\t-94.086747\t39.8884\tAltamont village\tMO\tMissouri\tDaviess County\t226\t45.0\t13.1\t8.4\t19143\t101786\t0.3195\t64620\tRomney\t64620\t0.000553258\t64620.0\n11711\t-94.006528\t40.105524\tCoffey city\tMO\tMissouri\tDaviess County\t133\t40.3\t14.6\t19.6\t17066\t63750\t0.3195\t64636\tRomney\t64636\t0.00032559\t64636.0\n11712\t-93.803014\t39.974891\tJamesport city\tMO\tMissouri\tDaviess County\t501\t40.2\t10.1\t6.4\t13357\t54130\t0.3195\t64648\tRomney\t64648\t0.00122647\t64648.0\n11713\t-93.964412\t39.910737\tGallatin city\tMO\tMissouri\tDaviess County\t1656\t40.9\t20.6\t13.7\t18632\t79412\t0.3195\t64640\tRomney\t64640\t0.004053961\t64640.0\n11714\t-94.138243\t40.047947\tPattonsburg city\tMO\tMissouri\tDaviess County\t248\t39.8\t14.1\t20.0\t17266\t63750\t0.3195\t64670\tRomney\t64670\t0.000607115\t64670.0\n11715\t-93.776185\t39.84882\tLock Springs village\tMO\tMissouri\tDaviess County\t68\t27.5\t2.9\t20.0\t12285\t108333\t0.3195\t64625\tRomney\t64625\t0.000166467\t64625.0\n11716\t-93.987798\t40.005764\tJameson town\tMO\tMissouri\tDaviess County\t126\t39.3\t9.3\t9.3\t20919\t93333\t0.3195\t64647\tRomney\t64647\t0.000308454\t64647.0\n11717\t-94.141542\t39.869871\tWinston village\tMO\tMissouri\tDaviess County\t257\t43.0\t11.7\t8.3\t18008\t93333\t0.3195\t64689\tRomney\t64689\t0.0006291469999999999\t64689.0\n11718\t-94.356392\t39.750613\tOsborn city\tMO\tMissouri\tDeKalb County\t465\t40.5\t13.6\t5.5\t19255\t96875\t0.2745\t64474\tRomney\t64474\t0.00113834\t64474.0\n11719\t-94.24199399999999\t39.90931\tWeatherby town\tMO\tMissouri\tDeKalb County\t124\t36.1\t11.5\t13.2\t15499\t109375\t0.2745\t64497\tRomney\t64497\t0.000303557\t64497.0\n11720\t-94.498751\t39.754923\tStewartsville city\tMO\tMissouri\tDeKalb County\t754\t39.5\t16.9\t15.7\t19865\t85833\t0.2745\t64490\tRomney\t64490\t0.001845825\t64490.0\n11721\t-94.59879000000001\t39.979374\tUnion Star town\tMO\tMissouri\tDeKalb County\t443\t40.5\t20.2\t3.5\t19277\t77917\t0.2745\t64494\tRomney\t64494\t0.001084483\t64494.0\n11722\t-94.550733\t39.813808\tClarksdale city\tMO\tMissouri\tDeKalb County\t348\t44.4\t15.1\t10.3\t19678\t108929\t0.2745\t64430\tRomney\t64430\t0.0008519189999999999\t64430.0\n11723\t-94.36326899999999\t39.885965\tMaysville city\tMO\tMissouri\tDeKalb County\t1193\t39.3\t16.1\t6.5\t17829\t72500\t0.2745\t64469\tRomney\t64469\t0.0029205159999999997\t64469.0\n11724\t-94.43464399999999\t39.868672\tAmity town\tMO\tMissouri\tDeKalb County\t68\t44.5\t14.9\t8.6\t18768\t90000\t0.2745\t64422\tRomney\t64422\t0.000166467\t64422.0\n11725\t-91.53398299999999\t37.639666999999996\tSalem city\tMO\tMissouri\tDent County\t5033\t39.2\t14.5\t11.9\t17360\t84608\t0.2386\t65560\tRomney\t65560\t0.012321005\t65560.0\n11726\t-92.666572\t36.953972\tAva city\tMO\tMissouri\tDouglas County\t3110\t42.4\t15.8\t13.6\t16713\t77143\t0.2608\t65608\tRomney\t65608\t0.007613417\t65608.0\n11727\t-90.161369\t36.134015999999995\tSenath city\tMO\tMissouri\tDunklin County\t1539\t43.9\t11.9\t13.7\t14805\t67547\t0.3414\t63876\tRomney\t63876\t0.00376754\t63876.0\n11728\t-90.115798\t36.040459999999996\tHornersville city\tMO\tMissouri\tDunklin County\t773\t43.1\t9.3\t14.2\t15748\t56463\t0.3414\t63855\tRomney\t63855\t0.001892338\t63855.0\n11729\t-89.978142\t36.584948\tMalden city\tMO\tMissouri\tDunklin County\t4382\t38.9\t10.0\t14.0\t15434\t66306\t0.3414\t63863\tRomney\t63863\t0.010727328999999999\t63863.0\n11730\t-90.025171\t36.400974\tHolcomb city\tMO\tMissouri\tDunklin County\t688\t38.8\t6.7\t16.2\t13356\t63056\t0.3414\t63852\tRomney\t63852\t0.001684254\t63852.0\n11731\t-90.04861899999999\t36.239534\tKennett city\tMO\tMissouri\tDunklin County\t10880\t37.0\t14.7\t14.0\t17735\t95859\t0.3414\t63857\tRomney\t63857\t0.026634717999999998\t63857.0\n11732\t-90.290935\t36.047512\tCardwell city\tMO\tMissouri\tDunklin County\t722\t42.6\t12.4\t14.9\t15783\t49600\t0.3414\t63829\tRomney\t63829\t0.0017674879999999998\t63829.0\n11733\t-89.968073\t36.452015\tClarkton city\tMO\tMissouri\tDunklin County\t1260\t37.9\t6.2\t18.8\t11498\t49000\t0.3414\t63837\tRomney\t63837\t0.003084535\t63837.0\n11734\t-90.074991\t36.4922\tCampbell city\tMO\tMissouri\tDunklin County\t1793\t40.9\t8.0\t11.1\t16152\t53944\t0.3414\t63933\tRomney\t63933\t0.0043893429999999995\t63933.0\n11735\t-90.239574\t36.053762\tArbyrd city\tMO\tMissouri\tDunklin County\t499\t41.1\t6.2\t15.1\t14234\t50000\t0.3414\t63821\tRomney\t63821\t0.001221574\t63821.0\n11736\t-90.01193599999999\t36.094625\tRives town\tMO\tMissouri\tDunklin County\t84\t47.9\t6.5\t2.9\t17600\t52500\t0.3414\t63849\tRomney\t63849\t0.00020563599999999998\t63849.0\n11737\t-90.734122\t38.48341\tPacific city\tMO\tMissouri\tFranklin County\t5999\t37.1\t12.3\t18.9\t21010\t117935\t0.3496\t63069\tRomney\t63069\t0.014685816\t63069.0\n11738\t-91.161925\t38.218885\tSullivan city\tMO\tMissouri\tFranklin County\t6696\t37.3\t12.5\t15.7\t20788\t99703\t0.3496\t63080\tRomney\t63080\t0.016392102\t63080.0\n11739\t-91.017433\t38.553138\tWashington city\tMO\tMissouri\tFranklin County\t14184\t38.0\t23.0\t9.1\t25995\t145916\t0.3496\t63090\tRomney\t63090\t0.034723055\t63090.0\n11740\t-90.98311\t38.349879\tSt. Clair city\tMO\tMissouri\tFranklin County\t4610\t35.1\t10.7\t15.1\t21441\t90952\t0.3496\t63077\tRomney\t63077\t0.011285483\t63077.0\n11741\t-90.99848\t38.441983\tUnion city\tMO\tMissouri\tFranklin County\t9129\t36.4\t14.2\t11.2\t22209\t127557\t0.3496\t63084\tRomney\t63084\t0.022348193\t63084.0\n11742\t-91.230591\t38.417837\tLeslie village\tMO\tMissouri\tFranklin County\t95\t43.3\t10.1\t9.8\t24188\t141667\t0.3496\t63056\tRomney\t63056\t0.00023256400000000002\t63056.0\n11743\t-90.885104\t38.467963\tVilla Ridge CDP\tMO\tMissouri\tFranklin County\t2795\t41.4\t12.7\t12.8\t24915\t118403\t0.3496\t63089\tRomney\t63089\t0.006842283\t63089.0\n11744\t-91.217384\t38.605844\tNew Haven city\tMO\tMissouri\tFranklin County\t2138\t37.3\t12.5\t13.3\t23279\t113821\t0.3496\t63068\tRomney\t63068\t0.005233918\t63068.0\n11745\t-91.068821\t38.238966\tMiramiguoa Park village\tMO\tMissouri\tFranklin County\t146\t41.3\t14.7\t13.8\t23149\t133929\t0.3496\t63080\tRomney\t63080\t0.000357414\t63080.0\n11746\t-90.97204\t38.336673\tParkway village\tMO\tMissouri\tFranklin County\t299\t37.8\t11.4\t14.0\t23721\t97857\t0.3496\t63077\tRomney\t63077\t0.000731965\t63077.0\n11747\t-91.341624\t38.672337\tBerger city\tMO\tMissouri\tFranklin County\t230\t39.4\t13.8\t12.6\t21966\t91250\t0.3496\t63014\tRomney\t63014\t0.00056305\t63014.0\n11748\t-91.15011899999999\t38.22696\tOak Grove village\tMO\tMissouri\tFranklin County\t408\t36.0\t6.9\t18.5\t20492\t86250\t0.3496\t63080\tRomney\t63080\t0.000998802\t63080.0\n11749\t-91.33076700000001\t38.39845\tGerald city\tMO\tMissouri\tFranklin County\t1288\t43.5\t10.9\t11.2\t22653\t112500\t0.3496\t63037\tRomney\t63037\t0.003153081\t63037.0\n11750\t-90.81707800000001\t38.495028999999995\tGray Summit CDP\tMO\tMissouri\tFranklin County\t2979\t37.0\t15.5\t12.6\t23770\t143011\t0.3496\t63039\tRomney\t63039\t0.007292723\t63039.0\n11751\t-91.43529699999999\t38.697798999999996\tHermann city\tMO\tMissouri\tGasconade County\t2551\t46.1\t21.3\t12.1\t23175\t107092\t0.2942\t65041\tRomney\t65041\t0.00624496\t65041.0\n11752\t-91.63334300000001\t38.671523\tMorrison city\tMO\tMissouri\tGasconade County\t120\t46.2\t7.1\t13.8\t18162\t82500\t0.2942\t65036\tRomney\t65036\t0.000293765\t65036.0\n11753\t-91.632494\t38.30153\tBland city\tMO\tMissouri\tGasconade County\t595\t42.8\t9.5\t13.2\t20243\t84583\t0.2942\t65014\tRomney\t65014\t0.0014565860000000002\t65014.0\n11754\t-91.402785\t38.386624\tRosebud city\tMO\tMissouri\tGasconade County\t372\t43.3\t8.5\t8.1\t19464\t131000\t0.2942\t63091\tRomney\t63091\t0.000910672\t63091.0\n11755\t-91.499962\t38.346990999999996\tOwensville city\tMO\tMissouri\tGasconade County\t2494\t39.3\t11.9\t15.3\t17708\t84750\t0.2942\t65066\tRomney\t65066\t0.006105421999999999\t65066.0\n11756\t-91.559951\t38.670256\tGasconade city\tMO\tMissouri\tGasconade County\t259\t45.5\t6.6\t14.2\t18257\t87500\t0.2942\t65036\tRomney\t65036\t0.000634043\t65036.0\n11757\t-94.222247\t40.111596\tMcFall city\tMO\tMissouri\tGentry County\t113\t44.6\t11.3\t9.2\t19072\t100000\t0.3124\t64657\tRomney\t64657\t0.000276629\t64657.0\n11758\t-94.4234\t40.332656\tGentry village\tMO\tMissouri\tGentry County\t101\t38.5\t12.9\t3.7\t15107\t125000\t0.3124\t64453\tRomney\t64453\t0.000247252\t64453.0\n11759\t-94.525133\t40.050554\tKing City\tMO\tMissouri\tGentry County\t996\t39.2\t16.9\t6.0\t15083\t54762\t0.3124\t64463\tRomney\t64463\t0.002438252\t64463.0\n11760\t-94.33351\t40.247982\tAlbany city\tMO\tMissouri\tGentry County\t1735\t45.4\t24.0\t10.2\t19326\t75676\t0.3124\t64402\tRomney\t64402\t0.004247356\t64402.0\n11761\t-94.537586\t40.216846000000004\tStanberry city\tMO\tMissouri\tGentry County\t1170\t43.4\t14.2\t11.4\t17020\t64342\t0.3124\t64489\tRomney\t64489\t0.0028642109999999998\t64489.0\n11762\t-94.399663\t40.197995\tDarlington village\tMO\tMissouri\tGentry County\t94\t42.5\t11.9\t9.3\t19197\t95000\t0.3124\t64438\tRomney\t64438\t0.000230116\t64438.0\n11763\t-93.152243\t37.383579\tFair Grove city\tMO\tMissouri\tGreene County\t1181\t37.1\t17.6\t10.0\t20710\t112842\t0.3673\t65648\tRomney\t65648\t0.00289114\t65648.0\n11764\t-93.273558\t37.195546\tSpringfield city\tMO\tMissouri\tGreene County\t157191\t35.3\t26.6\t10.9\t22663\t112507\t0.3673\t65806\tRomney\t65806\t0.384810475\t65806.0\n11765\t-93.47085\t37.119858\tRepublic city\tMO\tMissouri\tGreene County\t11893\t36.8\t18.1\t8.4\t21294\t111394\t0.3673\t65738\tRomney\t65738\t0.029114587\t65738.0\n11766\t-93.54780600000001\t37.411986\tWalnut Grove city\tMO\tMissouri\tGreene County\t680\t39.9\t13.9\t6.4\t19429\t86765\t0.3673\t65770\tRomney\t65770\t0.00166467\t65770.0\n11767\t-93.36737\t37.118938\tBattlefield city\tMO\tMissouri\tGreene County\t3653\t36.1\t29.3\t7.3\t25840\t133094\t0.3673\t65619\tRomney\t65619\t0.008942705\t65619.0\n11768\t-93.11640899999999\t37.271406\tStrafford city\tMO\tMissouri\tGreene County\t2293\t37.0\t17.5\t8.3\t22395\t114628\t0.3673\t65757\tRomney\t65757\t0.005613365\t65757.0\n11769\t-93.58130200000001\t37.317772999999995\tAsh Grove city\tMO\tMissouri\tGreene County\t1596\t41.7\t17.9\t6.1\t17620\t106875\t0.3673\t65604\tRomney\t65604\t0.003907078\t65604.0\n11770\t-93.409701\t37.175149\tBrookline village\tMO\tMissouri\tGreene County\t390\t40.9\t16.1\t8.7\t22075\t110156\t0.3673\t65619\tRomney\t65619\t0.000954737\t65619.0\n11771\t-93.415126\t37.292733\tWillard city\tMO\tMissouri\tGreene County\t4911\t35.7\t23.0\t8.2\t21591\t123892\t0.3673\t65781\tRomney\t65781\t0.012022343999999999\t65781.0\n11772\t-93.447858\t40.026059000000004\tLaredo city\tMO\tMissouri\tGrundy County\t246\t45.5\t7.3\t12.0\t17241\t59000\t0.2771\t64652\tRomney\t64652\t0.000602219\t64652.0\n11773\t-93.60355\t40.080863\tTrenton city\tMO\tMissouri\tGrundy County\t6087\t43.5\t14.0\t10.6\t18760\t69470\t0.2771\t64683\tRomney\t64683\t0.014901243\t64683.0\n11774\t-93.38786800000001\t40.127168\tGalt city\tMO\tMissouri\tGrundy County\t274\t42.3\t9.2\t19.2\t16326\t57857\t0.2771\t64641\tRomney\t64641\t0.0006707639999999999\t64641.0\n11775\t-93.592267\t40.243155\tSpickard city\tMO\tMissouri\tGrundy County\t311\t44.6\t6.6\t9.4\t15560\t45556\t0.2771\t64679\tRomney\t64679\t0.0007613419999999999\t64679.0\n11776\t-93.609563\t40.160875\tTindall town\tMO\tMissouri\tGrundy County\t62\t46.0\t19.6\t3.6\t20697\t109375\t0.2771\t64679\tRomney\t64679\t0.000151779\t64679.0\n11777\t-93.738415\t40.14504\tBrimson village\tMO\tMissouri\tGrundy County\t62\t44.5\t6.5\t10.7\t15610\t40000\t0.2771\t64642\tRomney\t64642\t0.000151779\t64642.0\n11778\t-93.985954\t40.468328\tEagleville town\tMO\tMissouri\tHarrison County\t335\t42.0\t9.6\t12.6\t14748\t63571\t0.2663\t64442\tRomney\t64442\t0.000820095\t64442.0\n11779\t-93.927934\t40.475142\tBlythedale village\tMO\tMissouri\tHarrison County\t246\t41.8\t9.6\t13.1\t14651\t67000\t0.2663\t64442\tRomney\t64442\t0.000602219\t64442.0\n11780\t-93.872823\t40.139157\tGilman City\tMO\tMissouri\tHarrison County\t395\t39.7\t13.6\t14.1\t16630\t48636\t0.2663\t64642\tRomney\t64642\t0.0009669769999999999\t64642.0\n11781\t-93.937908\t40.378544\tRidgeway city\tMO\tMissouri\tHarrison County\t514\t42.0\t9.0\t8.5\t15471\t56667\t0.2663\t64481\tRomney\t64481\t0.001258295\t64481.0\n11782\t-94.028129\t40.268409000000005\tBethany city\tMO\tMissouri\tHarrison County\t3102\t44.0\t10.3\t4.5\t17937\t84028\t0.2663\t64424\tRomney\t64424\t0.007593831999999999\t64424.0\n11783\t-94.197512\t40.265066999999995\tNew Hampton city\tMO\tMissouri\tHarrison County\t345\t41.5\t5.8\t10.9\t16872\t65000\t0.2663\t64471\tRomney\t64471\t0.000844575\t64471.0\n11784\t-93.797093\t40.329142\tMount Moriah town\tMO\tMissouri\tHarrison County\t142\t42.0\t9.4\t9.5\t15317\t80000\t0.2663\t64481\tRomney\t64481\t0.00034762199999999996\t64481.0\n11785\t-93.774711\t40.439840999999994\tCainsville city\tMO\tMissouri\tHarrison County\t349\t43.0\t8.1\t6.5\t15680\t52500\t0.2663\t64632\tRomney\t64632\t0.000854367\t64632.0\n11786\t-93.54659699999999\t38.309670000000004\tTightwad village\tMO\tMissouri\tHenry County\t73\t46.8\t9.3\t9.7\t22185\t109375\t0.3562\t65323\tRomney\t65323\t0.000178707\t65323.0\n11787\t-93.77466\t38.259207\tDeepwater city\tMO\tMissouri\tHenry County\t543\t46.5\t10.3\t9.8\t21130\t77222\t0.3562\t647HH\tRomney\t647HH\t0.0013292879999999999\t0.0\n11788\t-93.99897\t38.460494\tUrich city\tMO\tMissouri\tHenry County\t537\t42.9\t11.1\t11.7\t20956\t79545\t0.3562\t64788\tRomney\t64788\t0.0013146\t64788.0\n11789\t-93.877686\t38.312521999999994\tLa Due village\tMO\tMissouri\tHenry County\t42\t46.9\t10.0\t10.5\t21028\t85000\t0.3562\t64770\tRomney\t64770\t0.00010281799999999999\t64770.0\n11790\t-93.76782800000001\t38.371344\tClinton city\tMO\tMissouri\tHenry County\t9111\t41.7\t16.0\t10.7\t20325\t96971\t0.3562\t64735\tRomney\t64735\t0.022304128\t64735.0\n11791\t-93.982752\t38.258649\tMontrose city\tMO\tMissouri\tHenry County\t425\t43.9\t11.8\t6.8\t18279\t79091\t0.3562\t64770\tRomney\t64770\t0.001040419\t64770.0\n11792\t-93.95777199999999\t38.557947999999996\tBlairstown city\tMO\tMissouri\tHenry County\t138\t43.5\t16.2\t3.0\t18597\t120833\t0.3562\t64726\tRomney\t64726\t0.00033783\t64726.0\n11793\t-93.625114\t38.468381\tCalhoun city\tMO\tMissouri\tHenry County\t503\t44.6\t13.6\t12.7\t17851\t85000\t0.3562\t65323\tRomney\t65323\t0.001231366\t65323.0\n11794\t-93.722724\t38.245683\tBrownington town\tMO\tMissouri\tHenry County\t121\t51.5\t11.5\t16.7\t18695\t90000\t0.3562\t64740\tRomney\t64740\t0.000296213\t64740.0\n11795\t-93.505953\t38.536837\tWindsor city\tMO\tMissouri\tHenry County\t3044\t38.4\t11.8\t15.6\t18783\t76702\t0.3562\t65360\tRomney\t65360\t0.007451846\t65360.0\n11796\t-93.934232\t38.433138\tHartwell village\tMO\tMissouri\tHenry County\t16\t45.0\t11.1\t0.0\t18236\t0\t0.3562\t64788\tRomney\t64788\t3.9200000000000004e-05\t64788.0\n11797\t-93.229329\t38.024254\tCross Timbers city\tMO\tMissouri\tHickory County\t183\t46.9\t6.1\t20.6\t13758\t86667\t0.3703\t65634\tRomney\t65634\t0.000447992\t65634.0\n11798\t-93.212548\t37.940818\tPreston town\tMO\tMissouri\tHickory County\t130\t43.1\t14.4\t15.7\t18176\t123611\t0.3703\t65732\tRomney\t65732\t0.000318246\t65732.0\n11799\t-93.403821\t37.943315000000005\tWheatland city\tMO\tMissouri\tHickory County\t379\t44.5\t4.5\t15.6\t17451\t80625\t0.3703\t65779\tRomney\t65779\t0.0009278089999999999\t65779.0\n11800\t-93.325135\t37.944371999999994\tHermitage city\tMO\tMissouri\tHickory County\t522\t59.9\t9.3\t16.1\t16022\t85357\t0.3703\t65668\tRomney\t65668\t0.001277879\t65668.0\n11801\t-93.540371\t37.891348\tWeaubleau city\tMO\tMissouri\tHickory County\t489\t40.9\t10.9\t8.4\t13274\t64783\t0.3703\t65774\tRomney\t65774\t0.001197093\t65774.0\n11802\t-95.28945999999999\t40.109999\tBigelow village\tMO\tMissouri\tHolt County\t35\t46.3\t7.4\t10.0\t18881\t75000\t0.2385\t64437\tRomney\t64437\t8.57e-05\t64437.0\n11803\t-95.352032\t40.073514\tBig Lake village\tMO\tMissouri\tHolt County\t118\t49.1\t8.0\t9.0\t18716\t75000\t0.2385\t64437\tRomney\t64437\t0.00028886900000000003\t64437.0\n11804\t-95.188357\t39.982786\tForest City\tMO\tMissouri\tHolt County\t311\t43.5\t10.8\t6.1\t18512\t72500\t0.2385\t64451\tRomney\t64451\t0.0007613419999999999\t64451.0\n11805\t-95.45449599999999\t40.248645\tCorning town\tMO\tMissouri\tHolt County\t20\t43.8\t7.1\t10.0\t15016\t45000\t0.2385\t64446\tRomney\t64446\t4.9e-05\t64446.0\n11806\t-95.374003\t40.192687\tCraig city\tMO\tMissouri\tHolt County\t294\t45.9\t10.3\t9.3\t15021\t50714\t0.2385\t64437\tRomney\t64437\t0.000719725\t64437.0\n11807\t-95.07798299999999\t40.202339\tMaitland city\tMO\tMissouri\tHolt County\t301\t46.8\t16.2\t5.8\t19884\t61667\t0.2385\t64466\tRomney\t64466\t0.000736861\t64466.0\n11808\t-95.31765\t40.051799\tFortescue town\tMO\tMissouri\tHolt County\t47\t40.8\t11.8\t8.0\t18483\t80000\t0.2385\t64437\tRomney\t64437\t0.000115058\t64437.0\n11809\t-95.234088\t40.136503000000005\tMound City\tMO\tMissouri\tHolt County\t1065\t46.5\t14.6\t7.4\t17569\t79286\t0.2385\t64470\tRomney\t64470\t0.002607167\t64470.0\n11810\t-95.14308\t39.985579\tOregon city\tMO\tMissouri\tHolt County\t919\t42.1\t20.9\t4.4\t19931\t85357\t0.2385\t64451\tRomney\t64451\t0.0022497520000000003\t64451.0\n11811\t-92.838406\t39.234282\tGlasgow city\tMO\tMissouri\tHoward County\t1154\t38.2\t19.5\t10.0\t16074\t70000\t0.354\t65254\tRomney\t65254\t0.0028250429999999997\t65254.0\n11812\t-92.75511\t39.010974\tFranklin city\tMO\tMissouri\tHoward County\t115\t38.2\t14.7\t12.5\t15972\t92500\t0.354\t65250\tRomney\t65250\t0.000281525\t65250.0\n11813\t-92.704685\t39.269329\tArmstrong city\tMO\tMissouri\tHoward County\t280\t42.5\t14.4\t14.7\t17882\t89167\t0.354\t65230\tRomney\t65230\t0.000685452\t65230.0\n11814\t-92.740994\t39.017466999999996\tNew Franklin city\tMO\tMissouri\tHoward County\t1207\t42.3\t15.4\t8.8\t19914\t75441\t0.354\t65274\tRomney\t65274\t0.002954789\t65274.0\n11815\t-92.685793\t39.147043\tFayette city\tMO\tMissouri\tHoward County\t2605\t31.6\t30.7\t10.0\t18545\t77600\t0.354\t65248\tRomney\t65248\t0.006377154\t65248.0\n11816\t-91.70186600000001\t36.993477\tMountain View city\tMO\tMissouri\tHowell County\t2519\t42.6\t12.2\t13.0\t15093\t75510\t0.2689\t65548\tRomney\t65548\t0.006166623\t65548.0\n11817\t-91.69691\t36.651071\tBrandsville city\tMO\tMissouri\tHowell County\t171\t39.8\t14.8\t11.0\t17075\t97500\t0.2689\t65692\tRomney\t65692\t0.00041861599999999996\t65692.0\n11818\t-91.868935\t36.739039\tWest Plains city\tMO\tMissouri\tHowell County\t11165\t40.3\t16.3\t9.4\t18709\t102549\t0.2689\t65775\tRomney\t65775\t0.027332411\t65775.0\n11819\t-91.961336\t36.987726\tWillow Springs city\tMO\tMissouri\tHowell County\t2135\t42.5\t14.1\t10.8\t14184\t75303\t0.2689\t65793\tRomney\t65793\t0.005226574\t65793.0\n11820\t-90.69751\t37.360628999999996\tAnnapolis city\tMO\tMissouri\tIron County\t299\t43.3\t6.2\t9.4\t15993\t79167\t0.414\t63675\tRomney\t63675\t0.000731965\t63675.0\n11821\t-90.63995899999999\t37.598544\tIronton city\tMO\tMissouri\tIron County\t1427\t41.5\t10.8\t11.7\t15603\t83400\t0.414\t63650\tRomney\t63650\t0.003493359\t63650.0\n11822\t-90.645117\t37.623657\tPilot Knob city\tMO\tMissouri\tIron County\t648\t40.1\t7.0\t15.6\t14104\t62813\t0.414\t63663\tRomney\t63663\t0.0015863320000000002\t63663.0\n11823\t-90.629315\t37.586327000000004\tArcadia city\tMO\tMissouri\tIron County\t544\t47.1\t9.2\t11.7\t18995\t95417\t0.414\t63650\tRomney\t63650\t0.001331736\t63650.0\n11824\t-90.635112\t37.283769\tDes Arc village\tMO\tMissouri\tIron County\t177\t44.2\t5.6\t9.5\t16388\t72500\t0.414\t63636\tRomney\t63636\t0.000433304\t63636.0\n11825\t-91.129463\t37.714808000000005\tViburnum city\tMO\tMissouri\tIron County\t789\t40.2\t11.9\t7.3\t17258\t71750\t0.414\t65566\tRomney\t65566\t0.001931507\t65566.0\n11826\t-94.25381\t38.927921000000005\tLake Lotawana city\tMO\tMissouri\tJackson County\t2005\t48.9\t41.8\t6.7\t44109\t241085\t0.5904\t64086\tRomney\t64086\t0.004908328\t64086.0\n11827\t-94.398794\t38.950334999999995\tUnity Village village\tMO\tMissouri\tJackson County\t139\t39.1\t28.4\t12.3\t29284\t146875\t0.5904\t64139\tRomney\t64139\t0.000340278\t64139.0\n11828\t-94.208373\t39.012238\tGrain Valley city\tMO\tMissouri\tJackson County\t8796\t31.9\t22.0\t6.2\t28949\t126735\t0.5904\t64029\tRomney\t64029\t0.021532994\t64029.0\n11829\t-94.13807800000001\t39.136905\tLevasy city\tMO\tMissouri\tJackson County\t114\t38.4\t10.7\t10.4\t20865\t97500\t0.5904\t64066\tRomney\t64066\t0.000279077\t64066.0\n11830\t-94.394356\t39.184385999999996\tRiver Bend village\tMO\tMissouri\tJackson County\t10\t0.0\t14.3\t20.0\t24817\t112500\t0.5904\t640HH\tRomney\t640HH\t2.45e-05\t0.0\n11831\t-94.51974399999999\t39.280807\tKansas City\tMO\tMissouri\tJackson County\t472603\t35.8\t29.4\t13.6\t26058\t112775\t0.5904\t64156\tRomney\t64156\t1.15695291\t64156.0\n11832\t-94.200799\t39.176054\tSibley village\tMO\tMissouri\tJackson County\t365\t36.6\t9.4\t11.0\t21277\t97000\t0.5904\t64088\tRomney\t64088\t0.000893536\t64088.0\n11833\t-94.384846\t38.919513\tLee's Summit city\tMO\tMissouri\tJackson County\t88424\t36.3\t41.6\t7.1\t33553\t175263\t0.5904\t64081\tRomney\t64081\t0.216465837\t64081.0\n11834\t-94.412194\t39.138267\tSugar Creek city\tMO\tMissouri\tJackson County\t3599\t41.2\t11.5\t14.2\t25102\t79115\t0.5904\t64050\tRomney\t64050\t0.00881051\t64050.0\n11835\t-94.349588\t39.124711\tIndependence city\tMO\tMissouri\tJackson County\t114264\t39.6\t18.7\t11.8\t24819\t96477\t0.5904\t64056\tRomney\t64056\t0.279723293\t64056.0\n11836\t-94.463998\t38.994437\tRaytown city\tMO\tMissouri\tJackson County\t29889\t42.5\t23.4\t9.6\t26004\t102026\t0.5904\t64133\tRomney\t64133\t0.073169585\t64133.0\n11837\t-94.313047\t39.019242\tLake Tapawingo city\tMO\tMissouri\tJackson County\t902\t35.3\t33.0\t9.1\t28799\t144243\t0.5904\t64015\tRomney\t64015\t0.002208136\t64015.0\n11838\t-94.19332\t39.133418\tBuckner city\tMO\tMissouri\tJackson County\t3024\t35.3\t11.8\t8.6\t23137\t91214\t0.5904\t64016\tRomney\t64016\t0.007402885\t64016.0\n11839\t-94.172593\t38.871681\tLone Jack city\tMO\tMissouri\tJackson County\t882\t41.0\t25.3\t7.0\t26979\t142763\t0.5904\t64070\tRomney\t64070\t0.002159175\t64070.0\n11840\t-94.27336700000001\t39.020976\tBlue Springs city\tMO\tMissouri\tJackson County\t52260\t35.3\t31.9\t8.8\t29637\t142874\t0.5904\t64014\tRomney\t64014\t0.127934776\t64014.0\n11841\t-94.522551\t38.880134999999996\tGrandview city\tMO\tMissouri\tJackson County\t25051\t34.9\t22.7\t12.2\t23850\t98147\t0.5904\t64030\tRomney\t64030\t0.061325949000000005\t64030.0\n11842\t-94.107517\t39.005665\tOak Grove city\tMO\tMissouri\tJackson County\t6670\t33.7\t13.9\t9.1\t23231\t110028\t0.5904\t64075\tRomney\t64075\t0.016328453\t64075.0\n11843\t-94.34266099999999\t38.851515\tGreenwood city\tMO\tMissouri\tJackson County\t4970\t31.4\t32.4\t6.1\t28672\t147343\t0.5904\t64034\tRomney\t64034\t0.012166778\t64034.0\n11844\t-94.302149\t37.335337\tJasper city\tMO\tMissouri\tJasper County\t1077\t37.2\t11.0\t11.1\t16657\t71286\t0.2833\t64755\tRomney\t64755\t0.002636543\t64755.0\n11845\t-94.444013\t37.25674\tNeck City\tMO\tMissouri\tJasper County\t148\t41.0\t12.9\t2.9\t18240\t108333\t0.2833\t64849\tRomney\t64849\t0.000362311\t64849.0\n11846\t-94.385552\t37.169435\tBrooklyn Heights town\tMO\tMissouri\tJasper County\t107\t36.6\t16.7\t10.5\t16213\t123214\t0.2833\t64835\tRomney\t64835\t0.00026194099999999996\t64835.0\n11847\t-94.605113\t37.273106\tAsbury city\tMO\tMissouri\tJasper County\t245\t37.8\t21.9\t7.8\t21575\t113636\t0.2833\t64832\tRomney\t64832\t0.000599771\t64832.0\n11848\t-94.16823000000001\t37.116532\tReeds town\tMO\tMissouri\tJasper County\t122\t38.3\t5.0\t8.2\t17645\t112500\t0.2833\t64859\tRomney\t64859\t0.000298661\t64859.0\n11849\t-94.466528\t37.19024\tOronogo city\tMO\tMissouri\tJasper County\t1291\t35.7\t17.3\t8.7\t17279\t95455\t0.2833\t64870\tRomney\t64870\t0.003160425\t64870.0\n11850\t-94.31805200000001\t37.156658\tCarthage city\tMO\tMissouri\tJasper County\t13629\t35.2\t18.2\t14.4\t17911\t85890\t0.2833\t64836\tRomney\t64836\t0.033364391\t64836.0\n11851\t-94.503562\t37.091737\tJoplin city\tMO\tMissouri\tJasper County\t49541\t36.5\t23.2\t9.8\t21630\t96528\t0.2833\t64801\tRomney\t64801\t0.121278545\t64801.0\n11852\t-94.544137\t37.164352\tCarl Junction city\tMO\tMissouri\tJasper County\t6856\t38.8\t25.3\t8.3\t22405\t113087\t0.2833\t64834\tRomney\t64834\t0.016783789\t64834.0\n11853\t-94.45727099999999\t37.071063\tDuquesne village\tMO\tMissouri\tJasper County\t1971\t45.2\t23.4\t6.4\t22226\t120139\t0.2833\t64841\tRomney\t64841\t0.004825095\t64841.0\n11854\t-94.41247\t37.079609999999995\tDuenweg city\tMO\tMissouri\tJasper County\t1243\t32.7\t10.4\t9.4\t18657\t81625\t0.2833\t64841\tRomney\t64841\t0.0030429190000000003\t64841.0\n11855\t-94.51619699999999\t37.140448\tAirport Drive village\tMO\tMissouri\tJasper County\t709\t45.9\t30.4\t16.7\t24959\t150806\t0.2833\t64870\tRomney\t64870\t0.001735663\t64870.0\n11856\t-94.6003\t37.246924\tWaco town\tMO\tMissouri\tJasper County\t97\t37.8\t22.2\t8.7\t21494\t112500\t0.2833\t64832\tRomney\t64832\t0.00023746\t64832.0\n11857\t-94.129747\t37.193778\tAvilla town\tMO\tMissouri\tJasper County\t154\t39.5\t14.7\t8.7\t17503\t95000\t0.2833\t64833\tRomney\t64833\t0.00037699900000000004\t64833.0\n11858\t-94.06094\t37.140190000000004\tLa Russell city\tMO\tMissouri\tJasper County\t155\t39.3\t14.4\t8.7\t17513\t92500\t0.2833\t64848\tRomney\t64848\t0.000379447\t64848.0\n11859\t-94.41760699999999\t37.237246\tAlba city\tMO\tMissouri\tJasper County\t682\t36.8\t11.3\t4.9\t16386\t82273\t0.2833\t64830\tRomney\t64830\t0.0016695660000000001\t64830.0\n11860\t-94.309269\t37.081913\tFidelity town\tMO\tMissouri\tJasper County\t297\t40.1\t20.7\t7.0\t23645\t121429\t0.2833\t64840\tRomney\t64840\t0.0007270689999999999\t64840.0\n11861\t-94.334251\t37.26163\tCarytown city\tMO\tMissouri\tJasper County\t252\t45.8\t9.7\t7.5\t15502\t112500\t0.2833\t64755\tRomney\t64755\t0.000616907\t64755.0\n11862\t-94.122496\t37.067509\tSarcoxie city\tMO\tMissouri\tJasper County\t1444\t36.4\t13.0\t11.9\t15231\t75179\t0.2833\t64862\tRomney\t64862\t0.003534975\t64862.0\n11863\t-94.471082\t37.14248\tWebb City\tMO\tMissouri\tJasper County\t11197\t31.5\t21.0\t11.2\t18403\t101040\t0.2833\t64870\tRomney\t64870\t0.027410748\t64870.0\n11864\t-94.43934499999999\t37.243256\tPurcell city\tMO\tMissouri\tJasper County\t434\t39.6\t12.7\t4.0\t17659\t94167\t0.2833\t64857\tRomney\t64857\t0.001062451\t64857.0\n11865\t-94.438835\t37.146574\tCarterville city\tMO\tMissouri\tJasper County\t1934\t36.2\t8.5\t11.4\t17148\t64810\t0.2833\t64835\tRomney\t64835\t0.004734517\t64835.0\n11866\t-90.406888\t38.219851\tFestus city\tMO\tMissouri\tJefferson County\t10676\t38.8\t15.4\t13.9\t23734\t129167\t0.4258\t63019\tRomney\t63019\t0.026135317\t63019.0\n11867\t-90.534308\t38.461172999999995\tHigh Ridge CDP\tMO\tMissouri\tJefferson County\t4496\t36.6\t14.9\t13.7\t26522\t131343\t0.4258\t63049\tRomney\t63049\t0.011006406000000002\t63049.0\n11868\t-90.431563\t38.267592\tHorine CDP\tMO\tMissouri\tJefferson County\t897\t38.8\t13.0\t9.5\t25920\t109821\t0.4258\t63070\tRomney\t63070\t0.002195895\t63070.0\n11869\t-90.590908\t38.391801\tScotsdale town\tMO\tMissouri\tJefferson County\t226\t35.8\t17.2\t10.4\t22958\t141964\t0.4258\t63051\tRomney\t63051\t0.000553258\t63051.0\n11870\t-90.371463\t38.429827\tArnold city\tMO\tMissouri\tJefferson County\t20984\t39.4\t14.1\t11.9\t26432\t138418\t0.4258\t63010\tRomney\t63010\t0.051369754000000004\t63010.0\n11871\t-90.565398\t38.236402000000005\tHillsboro city\tMO\tMissouri\tJefferson County\t1886\t38.4\t14.6\t14.9\t25167\t159722\t0.4258\t63050\tRomney\t63050\t0.004617011\t63050.0\n11872\t-90.458201\t38.134665000000005\tOlympian Village city\tMO\tMissouri\tJefferson County\t776\t37.6\t4.6\t12.4\t22713\t96250\t0.4258\t63028\tRomney\t63028\t0.0018996820000000002\t63028.0\n11873\t-90.404593\t38.33605\tBarnhart CDP\tMO\tMissouri\tJefferson County\t6442\t33.4\t20.2\t15.2\t28277\t147953\t0.4258\t63012\tRomney\t63012\t0.015770298999999998\t63012.0\n11874\t-90.370509\t38.367149\tImperial CDP\tMO\tMissouri\tJefferson County\t4712\t35.4\t18.0\t15.2\t24992\t141866\t0.4258\t63052\tRomney\t63052\t0.011535183000000001\t63052.0\n11875\t-90.485399\t38.492125\tMurphy CDP\tMO\tMissouri\tJefferson County\t9943\t36.9\t12.8\t10.9\t25311\t115962\t0.4258\t63026\tRomney\t63026\t0.024340901\t63026.0\n11876\t-90.380818\t38.222356\tCrystal City\tMO\tMissouri\tJefferson County\t4731\t40.8\t22.1\t14.7\t23241\t123130\t0.4258\t63019\tRomney\t63019\t0.011581696\t63019.0\n11877\t-90.561123\t38.140917\tDe Soto city\tMO\tMissouri\tJefferson County\t6753\t37.2\t9.5\t19.8\t21662\t95552\t0.4258\t63020\tRomney\t63020\t0.016531641\t63020.0\n11878\t-90.397965\t38.284903\tPevely city\tMO\tMissouri\tJefferson County\t4770\t34.3\t7.8\t13.4\t21917\t86875\t0.4258\t63070\tRomney\t63070\t0.01167717\t63070.0\n11879\t-90.657609\t38.330145\tCedar Hill Lakes village\tMO\tMissouri\tJefferson County\t233\t38.6\t10.8\t16.7\t22470\t103846\t0.4258\t63016\tRomney\t63016\t0.000570394\t63016.0\n11880\t-90.38941\t38.25819\tHerculaneum city\tMO\tMissouri\tJefferson County\t3333\t37.9\t15.1\t21.1\t21317\t129554\t0.4258\t63048\tRomney\t63048\t0.00815933\t63048.0\n11881\t-90.640886\t38.357733\tCedar Hill CDP\tMO\tMissouri\tJefferson County\t1827\t41.2\t10.3\t19.5\t21937\t135301\t0.4258\t63016\tRomney\t63016\t0.004472576\t63016.0\n11882\t-90.528157\t38.483451\tParkdale village\tMO\tMissouri\tJefferson County\t231\t40.7\t21.1\t14.8\t27325\t146429\t0.4258\t63049\tRomney\t63049\t0.000565498\t63049.0\n11883\t-90.36456700000001\t38.366457000000004\tKimmswick city\tMO\tMissouri\tJefferson County\t102\t37.9\t18.6\t14.8\t25266\t144643\t0.4258\t63052\tRomney\t63052\t0.0002497\t63052.0\n11884\t-90.57401\t38.43992\tByrnes Mill city\tMO\tMissouri\tJefferson County\t2606\t35.0\t12.4\t10.3\t24294\t88148\t0.4258\t63051\tRomney\t63051\t0.006379603\t63051.0\n11885\t-94.101892\t38.634615000000004\tLa Tour village\tMO\tMissouri\tJohnson County\t76\t40.6\t7.5\t8.1\t18774\t120833\t0.3647\t64747\tRomney\t64747\t0.00018605099999999998\t64747.0\n11886\t-93.553448\t38.728938\tWhiteman AFB CDP\tMO\tMissouri\tJohnson County\t3406\t21.5\t18.8\t8.5\t12410\t131250\t0.3647\t65305\tRomney\t65305\t0.008338038\t65305.0\n11887\t-93.989474\t38.713653\tHolden city\tMO\tMissouri\tJohnson County\t2383\t33.8\t15.6\t14.8\t19661\t79154\t0.3647\t64040\tRomney\t64040\t0.005833689\t64040.0\n11888\t-93.695256\t38.583444\tLeeton city\tMO\tMissouri\tJohnson County\t711\t38.8\t16.2\t12.1\t17106\t81429\t0.3647\t64761\tRomney\t64761\t0.001740559\t64761.0\n11889\t-93.855723\t38.588945\tChilhowee town\tMO\tMissouri\tJohnson County\t390\t40.0\t12.0\t12.6\t16765\t92500\t0.3647\t64733\tRomney\t64733\t0.000954737\t64733.0\n11890\t-94.069811\t38.743864\tKingsville city\tMO\tMissouri\tJohnson County\t290\t40.9\t16.9\t9.5\t22561\t101389\t0.3647\t64061\tRomney\t64061\t0.000709933\t64061.0\n11891\t-93.845248\t38.745442\tCenterview city\tMO\tMissouri\tJohnson County\t280\t37.1\t16.7\t15.0\t21530\t122917\t0.3647\t64019\tRomney\t64019\t0.000685452\t64019.0\n11892\t-93.566903\t38.767776\tKnob Noster city\tMO\tMissouri\tJohnson County\t2624\t30.3\t19.2\t11.7\t19885\t90636\t0.3647\t65336\tRomney\t65336\t0.006423666999999999\t65336.0\n11893\t-93.729292\t38.761078000000005\tWarrensburg city\tMO\tMissouri\tJohnson County\t17685\t24.7\t41.3\t12.4\t20741\t130752\t0.3647\t64093\tRomney\t64093\t0.043293657\t64093.0\n11894\t-91.97336700000001\t39.994619\tNewark village\tMO\tMissouri\tKnox County\t86\t45.9\t14.3\t10.2\t14612\t55000\t0.3567\t63458\tRomney\t63458\t0.000210532\t63458.0\n11895\t-92.010396\t40.144184\tKnox City\tMO\tMissouri\tKnox County\t193\t46.6\t14.1\t9.3\t14523\t58333\t0.3567\t63446\tRomney\t63446\t0.000472472\t63446.0\n11896\t-92.205905\t40.244624\tBaring city\tMO\tMissouri\tKnox County\t152\t40.6\t17.0\t3.9\t17467\t63000\t0.3567\t63531\tRomney\t63531\t0.00037210300000000004\t63531.0\n11897\t-92.30325\t40.148952\tHurdland city\tMO\tMissouri\tKnox County\t228\t40.7\t17.4\t4.3\t17508\t63125\t0.3567\t63547\tRomney\t63547\t0.000558154\t63547.0\n11898\t-92.207557\t40.012436\tNovelty village\tMO\tMissouri\tKnox County\t106\t47.7\t6.2\t2.8\t14318\t62500\t0.3567\t63460\tRomney\t63460\t0.000259493\t63460.0\n11899\t-92.173291\t40.168003999999996\tEdina city\tMO\tMissouri\tKnox County\t1155\t45.3\t16.3\t14.5\t15551\t72222\t0.3567\t63537\tRomney\t63537\t0.0028274909999999997\t63537.0\n11900\t-92.59989399999999\t37.550115999999996\tTwin Bridges village\tMO\tMissouri\tLaclede County\t45\t44.2\t9.1\t10.5\t20793\t212500\t0.2664\t65662\tRomney\t65662\t0.000110162\t65662.0\n11901\t-92.831227\t37.505601\tConway city\tMO\tMissouri\tLaclede County\t799\t37.3\t9.4\t11.7\t15496\t71250\t0.2664\t65632\tRomney\t65632\t0.001955987\t65632.0\n11902\t-92.65973000000001\t37.671731\tLebanon city\tMO\tMissouri\tLaclede County\t13529\t36.6\t15.6\t14.4\t19579\t94521\t0.2664\t65536\tRomney\t65536\t0.033119586\t65536.0\n11903\t-92.785209\t37.553883\tPhillipsburg village\tMO\tMissouri\tLaclede County\t216\t37.1\t9.4\t11.7\t15510\t73333\t0.2664\t65722\tRomney\t65722\t0.000528777\t65722.0\n11904\t-93.677789\t39.017681\tAullville village\tMO\tMissouri\tLafayette County\t87\t40.5\t25.9\t10.0\t19114\t125000\t0.358\t64037\tRomney\t64037\t0.00021298\t64037.0\n11905\t-93.875656\t39.182571\tLexington city\tMO\tMissouri\tLafayette County\t4061\t41.1\t19.8\t16.2\t19982\t83000\t0.358\t64067\tRomney\t64067\t0.009941506\t64067.0\n11906\t-93.962126\t38.998968\tOdessa city\tMO\tMissouri\tLafayette County\t4967\t35.9\t15.6\t15.0\t23211\t106316\t0.358\t64076\tRomney\t64076\t0.012159433999999998\t64076.0\n11907\t-93.689777\t39.194186\tDover town\tMO\tMissouri\tLafayette County\t102\t39.2\t16.9\t8.5\t19759\t112500\t0.358\t64022\tRomney\t64022\t0.0002497\t64022.0\n11908\t-94.085762\t39.129312\tNapoleon city\tMO\tMissouri\tLafayette County\t200\t44.7\t15.7\t8.8\t23456\t120000\t0.358\t64074\tRomney\t64074\t0.000489609\t64074.0\n11909\t-93.971408\t38.948705\tLake Lafayette city\tMO\tMissouri\tLafayette County\t383\t39.7\t13.9\t16.8\t22530\t147115\t0.358\t64076\tRomney\t64076\t0.000937601\t64076.0\n11910\t-94.064901\t39.004472\tBates City\tMO\tMissouri\tLafayette County\t273\t39.8\t8.9\t10.1\t25149\t136111\t0.358\t64011\tRomney\t64011\t0.0006683160000000001\t64011.0\n11911\t-93.547772\t39.096444\tAlma city\tMO\tMissouri\tLafayette County\t404\t44.0\t16.7\t3.4\t24455\t94231\t0.358\t64001\tRomney\t64001\t0.00098901\t64001.0\n11912\t-93.52007900000001\t39.207305\tWaverly city\tMO\tMissouri\tLafayette County\t786\t42.9\t11.1\t14.6\t19752\t64048\t0.358\t64096\tRomney\t64096\t0.0019241629999999998\t64096.0\n11913\t-93.638995\t39.099407\tCorder city\tMO\tMissouri\tLafayette County\t516\t44.9\t18.7\t11.0\t18367\t71333\t0.358\t64021\tRomney\t64021\t0.001263191\t64021.0\n11914\t-93.833352\t39.052732\tMayview city\tMO\tMissouri\tLafayette County\t302\t38.9\t6.9\t11.7\t18632\t71000\t0.358\t64071\tRomney\t64071\t0.000739309\t64071.0\n11915\t-93.726916\t39.06409\tHigginsville city\tMO\tMissouri\tLafayette County\t4644\t41.2\t20.0\t10.4\t21258\t87782\t0.358\t64037\tRomney\t64037\t0.011368716000000001\t64037.0\n11916\t-93.568382\t38.986781\tConcordia city\tMO\tMissouri\tLafayette County\t2557\t42.9\t19.6\t10.6\t20572\t94200\t0.358\t64020\tRomney\t64020\t0.0062596480000000005\t64020.0\n11917\t-93.986028\t39.138458\tWellington city\tMO\tMissouri\tLafayette County\t784\t41.4\t14.7\t7.4\t23057\t81765\t0.358\t64097\tRomney\t64097\t0.001919266\t64097.0\n11918\t-93.629161\t37.194558\tHalltown village\tMO\tMissouri\tLawrence County\t189\t42.5\t13.5\t8.1\t19917\t111111\t0.255\t65664\tRomney\t65664\t0.00046268\t65664.0\n11919\t-93.849159\t37.068212\tHoberg village\tMO\tMissouri\tLawrence County\t65\t36.3\t22.5\t7.1\t16551\t131250\t0.255\t65712\tRomney\t65712\t0.000159123\t65712.0\n11920\t-93.897913\t37.02133\tFreistatt village\tMO\tMissouri\tLawrence County\t197\t34.3\t21.0\t6.2\t16001\t115278\t0.255\t65756\tRomney\t65756\t0.000482265\t65756.0\n11921\t-93.948235\t37.101797999999995\tStotts City\tMO\tMissouri\tLawrence County\t264\t35.6\t9.1\t10.3\t15769\t78750\t0.255\t65756\tRomney\t65756\t0.000646284\t65756.0\n11922\t-94.002997\t36.946887\tPierce City\tMO\tMissouri\tLawrence County\t1336\t36.8\t10.9\t11.0\t14622\t71724\t0.255\t65723\tRomney\t65723\t0.003270587\t65723.0\n11923\t-93.79361\t36.96309\tVerona town\tMO\tMissouri\tLawrence County\t805\t33.4\t10.1\t8.3\t14690\t87308\t0.255\t65769\tRomney\t65769\t0.001970675\t65769.0\n11924\t-93.840565\t37.214719\tMiller city\tMO\tMissouri\tLawrence County\t742\t39.9\t10.3\t11.3\t16580\t76607\t0.255\t65707\tRomney\t65707\t0.001816449\t65707.0\n11925\t-93.637084\t37.000361\tMarionville city\tMO\tMissouri\tLawrence County\t2212\t41.3\t10.1\t11.1\t16034\t82963\t0.255\t65705\tRomney\t65705\t0.005415073\t65705.0\n11926\t-93.721277\t36.969688\tAurora city\tMO\tMissouri\tLawrence County\t7098\t36.3\t14.3\t12.0\t16893\t85762\t0.255\t65605\tRomney\t65605\t0.017376216\t65605.0\n11927\t-93.81983199999999\t37.104619\tMount Vernon city\tMO\tMissouri\tLawrence County\t4101\t42.4\t17.1\t11.8\t19261\t102998\t0.255\t65712\tRomney\t65712\t0.010039428000000001\t65712.0\n11928\t-91.71469\t40.008727\tEwing city\tMO\tMissouri\tLewis County\t434\t40.1\t12.5\t8.9\t19013\t90625\t0.3524\t63440\tRomney\t63440\t0.001062451\t63440.0\n11929\t-91.914604\t40.120057\tLa Belle city\tMO\tMissouri\tLewis County\t607\t44.0\t13.2\t6.4\t17875\t42727\t0.3524\t63447\tRomney\t63447\t0.0014859629999999999\t63447.0\n11930\t-91.501306\t40.046510999999995\tLa Grange city\tMO\tMissouri\tLewis County\t1017\t40.9\t8.5\t6.3\t17783\t63788\t0.3524\t63448\tRomney\t63448\t0.0024896610000000002\t63448.0\n11931\t-91.526844\t40.129281\tCanton city\tMO\tMissouri\tLewis County\t2486\t26.0\t29.8\t12.4\t17625\t76286\t0.3524\t63435\tRomney\t63435\t0.006085836999999999\t63435.0\n11932\t-91.713334\t40.118833\tMonticello village\tMO\tMissouri\tLewis County\t117\t45.0\t13.1\t6.2\t18103\t100000\t0.3524\t63457\tRomney\t63457\t0.000286421\t63457.0\n11933\t-91.813172\t40.084737\tLewistown town\tMO\tMissouri\tLewis County\t582\t39.6\t8.6\t11.6\t16529\t57391\t0.3524\t63452\tRomney\t63452\t0.0014247620000000002\t63452.0\n11934\t-91.0167\t39.183847\tWhiteside village\tMO\tMissouri\tLincoln County\t83\t44.4\t11.7\t13.8\t20218\t162500\t0.3414\t63387\tRomney\t63387\t0.00020318799999999998\t63387.0\n11935\t-90.747741\t38.9317\tOld Monroe city\tMO\tMissouri\tLincoln County\t267\t37.9\t10.8\t9.2\t23141\t142188\t0.3414\t63369\tRomney\t63369\t0.0006536280000000001\t63369.0\n11936\t-91.057688\t39.125188\tSilex village\tMO\tMissouri\tLincoln County\t260\t42.8\t12.1\t13.1\t18872\t118750\t0.3414\t63377\tRomney\t63377\t0.000636491\t63377.0\n11937\t-90.923663\t38.946771999999996\tMoscow Mills city\tMO\tMissouri\tLincoln County\t2343\t31.9\t8.7\t14.6\t22257\t104605\t0.3414\t63362\tRomney\t63362\t0.005735766999999999\t63362.0\n11938\t-90.802481\t38.915289\tChain of Rocks village\tMO\tMissouri\tLincoln County\t104\t37.5\t8.8\t10.2\t23385\t142500\t0.3414\t63369\tRomney\t63369\t0.000254597\t63369.0\n11939\t-91.240379\t39.00351\tTruxton village\tMO\tMissouri\tLincoln County\t103\t41.3\t15.1\t10.9\t19523\t120833\t0.3414\t63381\tRomney\t63381\t0.000252149\t63381.0\n11940\t-90.97277\t38.974477\tTroy city\tMO\tMissouri\tLincoln County\t9713\t31.3\t17.7\t14.2\t23963\t145235\t0.3414\t63379\tRomney\t63379\t0.023777851000000003\t63379.0\n11941\t-90.849023\t38.969054\tFountain N' Lakes village\tMO\tMissouri\tLincoln County\t186\t37.3\t14.8\t11.1\t22125\t157500\t0.3414\t63362\tRomney\t63362\t0.000455336\t63362.0\n11942\t-90.743\t38.994923\tWinfield city\tMO\tMissouri\tLincoln County\t1137\t31.6\t10.5\t13.5\t19527\t105114\t0.3414\t63389\tRomney\t63389\t0.002783426\t63389.0\n11943\t-90.741325\t39.045767\tFoley city\tMO\tMissouri\tLincoln County\t189\t34.1\t6.8\t20.2\t17213\t85000\t0.3414\t63347\tRomney\t63347\t0.00046268\t63347.0\n11944\t-91.048419\t39.021537\tCave town\tMO\tMissouri\tLincoln County\t15\t42.5\t18.2\t12.5\t22985\t275000\t0.3414\t63379\tRomney\t63379\t3.6700000000000004e-05\t63379.0\n11945\t-91.133873\t38.971115000000005\tHawk Point city\tMO\tMissouri\tLincoln County\t504\t35.8\t3.4\t16.5\t15836\t129688\t0.3414\t63349\tRomney\t63349\t0.001233814\t63349.0\n11946\t-90.789887\t39.169968\tElsberry city\tMO\tMissouri\tLincoln County\t2223\t37.5\t10.0\t20.3\t17038\t97763\t0.3414\t63343\tRomney\t63343\t0.005442002\t63343.0\n11947\t-93.160053\t40.037628000000005\tBrowning city\tMO\tMissouri\tLinn County\t287\t42.0\t8.4\t11.6\t16036\t50000\t0.3677\t64630\tRomney\t64630\t0.000702589\t64630.0\n11948\t-93.18685699999999\t39.876707\tLinneus city\tMO\tMissouri\tLinn County\t348\t41.1\t13.9\t12.0\t16519\t78333\t0.3677\t64653\tRomney\t64653\t0.0008519189999999999\t64653.0\n11949\t-92.946985\t39.717133000000004\tMarceline city\tMO\tMissouri\tLinn County\t2194\t41.5\t14.1\t11.4\t17415\t65938\t0.3677\t64658\tRomney\t64658\t0.005371008\t64658.0\n11950\t-93.303039\t39.787849\tMeadville city\tMO\tMissouri\tLinn County\t417\t39.6\t18.5\t11.5\t18571\t80556\t0.3677\t64659\tRomney\t64659\t0.001020834\t64659.0\n11951\t-93.169783\t39.787890999999995\tLaclede city\tMO\tMissouri\tLinn County\t384\t43.9\t8.4\t16.4\t14002\t55000\t0.3677\t64651\tRomney\t64651\t0.000940049\t64651.0\n11952\t-93.07717199999999\t39.785221\tBrookfield city\tMO\tMissouri\tLinn County\t4381\t44.0\t12.3\t16.4\t18240\t65684\t0.3677\t64628\tRomney\t64628\t0.01072488\t64628.0\n11953\t-93.166411\t39.950786\tPurdin city\tMO\tMissouri\tLinn County\t202\t40.7\t5.8\t11.3\t14345\t34167\t0.3677\t64674\tRomney\t64674\t0.000494505\t64674.0\n11954\t-92.888013\t39.783582\tBucklin city\tMO\tMissouri\tLinn County\t497\t43.7\t13.7\t16.1\t17052\t44074\t0.3677\t64631\tRomney\t64631\t0.0012166780000000001\t64631.0\n11955\t-93.386055\t39.7861\tWheeling city\tMO\tMissouri\tLivingston County\t259\t41.8\t5.3\t10.4\t19603\t91429\t0.3148\t64688\tRomney\t64688\t0.000634043\t64688.0\n11956\t-93.55074599999999\t39.793253\tChillicothe city\tMO\tMissouri\tLivingston County\t8774\t40.3\t13.8\t8.7\t20735\t81369\t0.3148\t64601\tRomney\t64601\t0.021479138\t64601.0\n11957\t-93.628525\t39.745487\tUtica village\tMO\tMissouri\tLivingston County\t278\t43.5\t9.6\t10.7\t19581\t50500\t0.3148\t64686\tRomney\t64686\t0.000680556\t64686.0\n11958\t-93.70298100000001\t39.653524\tLudlow town\tMO\tMissouri\tLivingston County\t191\t42.2\t11.9\t12.4\t19728\t41250\t0.3148\t64656\tRomney\t64656\t0.000467576\t64656.0\n11959\t-93.477355\t39.9218\tChula city\tMO\tMissouri\tLivingston County\t193\t37.8\t9.5\t10.0\t18379\t65000\t0.3148\t64635\tRomney\t64635\t0.000472472\t64635.0\n11960\t-93.72085600000001\t39.746646999999996\tMooresville village\tMO\tMissouri\tLivingston County\t90\t43.3\t9.4\t11.1\t19640\t47500\t0.3148\t64664\tRomney\t64664\t0.000220324\t64664.0\n11961\t-94.40890300000001\t36.738783000000005\tGoodman town\tMO\tMissouri\tMcDonald County\t1159\t39.0\t5.4\t16.2\t14756\t71429\t0.2456\t64843\tRomney\t64843\t0.002837283\t64843.0\n11962\t-94.488722\t36.543384\tNoel city\tMO\tMissouri\tMcDonald County\t1757\t34.8\t9.3\t9.2\t14659\t85167\t0.2456\t64854\tRomney\t64854\t0.004301213\t64854.0\n11963\t-94.451669\t36.606190000000005\tLanagan town\tMO\tMissouri\tMcDonald County\t418\t40.4\t5.6\t11.2\t14101\t61667\t0.2456\t64847\tRomney\t64847\t0.001023282\t64847.0\n11964\t-94.446585\t36.654785\tAnderson city\tMO\tMissouri\tMcDonald County\t1917\t38.1\t11.5\t12.7\t15233\t86739\t0.2456\t64831\tRomney\t64831\t0.0046929\t64831.0\n11965\t-94.610052\t36.520824\tSouth West City town\tMO\tMissouri\tMcDonald County\t998\t31.6\t5.5\t15.5\t10985\t79500\t0.2456\t64863\tRomney\t64863\t0.002443148\t64863.0\n11966\t-94.384527\t36.592818\tPineville town\tMO\tMissouri\tMcDonald County\t667\t37.7\t13.4\t9.3\t17785\t89500\t0.2456\t64847\tRomney\t64847\t0.001632845\t64847.0\n11967\t-92.6237\t39.762299\tCallao city\tMO\tMissouri\tMacon County\t272\t45.2\t8.7\t15.5\t16716\t44286\t0.3225\t63534\tRomney\t63534\t0.000665868\t63534.0\n11968\t-92.7512\t39.77556\tNew Cambria city\tMO\tMissouri\tMacon County\t204\t48.0\t11.1\t7.7\t17649\t78000\t0.3225\t63558\tRomney\t63558\t0.000499401\t63558.0\n11969\t-92.650017\t39.95704\tElmer city\tMO\tMissouri\tMacon County\t100\t37.2\t11.1\t10.0\t13584\t75000\t0.3225\t63538\tRomney\t63538\t0.000244804\t63538.0\n11970\t-92.480058\t39.898526000000004\tAtlanta city\tMO\tMissouri\tMacon County\t451\t37.6\t14.0\t10.0\t17776\t59667\t0.3225\t63530\tRomney\t63530\t0.001104068\t63530.0\n11971\t-92.49085600000001\t40.024939\tLa Plata city\tMO\tMissouri\tMacon County\t1472\t41.0\t14.7\t7.5\t17048\t71167\t0.3225\t63549\tRomney\t63549\t0.0036035209999999997\t63549.0\n11972\t-92.682886\t40.025746000000005\tSouth Gifford village\tMO\tMissouri\tMacon County\t73\t37.5\t12.5\t10.3\t13665\t80000\t0.3225\t63538\tRomney\t63538\t0.000178707\t63538.0\n11973\t-92.471939\t39.742497\tMacon city\tMO\tMissouri\tMacon County\t5390\t43.3\t15.8\t7.9\t19824\t92647\t0.3225\t63552\tRomney\t63552\t0.013194957\t63552.0\n11974\t-92.564398\t39.749255\tBevier city\tMO\tMissouri\tMacon County\t690\t41.0\t4.9\t16.4\t18315\t50667\t0.3225\t63532\tRomney\t63532\t0.00168915\t63532.0\n11975\t-92.74104399999999\t39.893229999999996\tEthel town\tMO\tMissouri\tMacon County\t102\t37.2\t10.8\t9.8\t13595\t75000\t0.3225\t63539\tRomney\t63539\t0.0002497\t63539.0\n11976\t-90.167027\t37.428613\tMarquand city\tMO\tMissouri\tMadison County\t266\t42.3\t7.5\t10.7\t15450\t86250\t0.3221\t63655\tRomney\t63655\t0.00065118\t63655.0\n11977\t-90.290315\t37.573121\tJunction City village\tMO\tMissouri\tMadison County\t322\t43.2\t6.6\t23.6\t14992\t72500\t0.3221\t63645\tRomney\t63645\t0.00078827\t63645.0\n11978\t-90.298523\t37.564188\tFredericktown city\tMO\tMissouri\tMadison County\t3936\t41.5\t11.1\t17.5\t15989\t73485\t0.3221\t63645\tRomney\t63645\t0.009635501\t63645.0\n11979\t-90.287562\t37.545504\tCobalt village\tMO\tMissouri\tMadison County\t187\t35.7\t4.0\t8.6\t15570\t57500\t0.3221\t63645\tRomney\t63645\t0.00045778400000000003\t63645.0\n11980\t-91.950198\t38.187478000000006\tVienna city\tMO\tMissouri\tMaries County\t662\t43.0\t22.0\t9.3\t17135\t89688\t0.2862\t65582\tRomney\t65582\t0.001620605\t65582.0\n11981\t-91.716403\t38.291864000000004\tBelle city\tMO\tMissouri\tMaries County\t1367\t35.0\t13.1\t11.7\t17850\t67750\t0.2862\t65013\tRomney\t65013\t0.0033464759999999997\t65013.0\n11982\t-91.52548\t39.79671\tPalmyra city\tMO\tMissouri\tMarion County\t3381\t39.3\t16.5\t12.3\t20152\t100453\t0.3316\t63461\tRomney\t63461\t0.008276836999999999\t63461.0\n11983\t-91.388965\t39.709467\tHannibal city\tMO\tMissouri\tMarion County\t17777\t37.1\t18.7\t14.4\t20496\t79739\t0.3316\t63401\tRomney\t63401\t0.043518877000000004\t63401.0\n11984\t-93.524026\t40.578425\tSouth Lineville town\tMO\tMissouri\tMercer County\t35\t45.0\t11.1\t6.3\t16440\t50000\t0.2133\t64661\tRomney\t64661\t8.57e-05\t64661.0\n11985\t-93.530006\t40.510729\tMercer town\tMO\tMissouri\tMercer County\t321\t48.5\t5.8\t7.9\t16406\t49375\t0.2133\t64661\tRomney\t64661\t0.0007858219999999999\t64661.0\n11986\t-93.588475\t40.396547999999996\tPrinceton city\tMO\tMissouri\tMercer County\t1007\t43.6\t15.6\t10.2\t18751\t67400\t0.2133\t64673\tRomney\t64673\t0.00246518\t64673.0\n11987\t-92.529933\t38.410364\tOlean town\tMO\tMissouri\tMiller County\t162\t41.6\t14.5\t10.8\t18431\t110938\t0.2406\t65064\tRomney\t65064\t0.00039658300000000005\t65064.0\n11988\t-92.26605\t38.256634999999996\tSt. Elizabeth village\tMO\tMissouri\tMiller County\t297\t37.9\t11.9\t4.9\t20443\t132692\t0.2406\t65075\tRomney\t65075\t0.0007270689999999999\t65075.0\n11989\t-92.605326\t38.229378000000004\tBagnell town\tMO\tMissouri\tMiller County\t89\t40.0\t11.3\t8.3\t17979\t90000\t0.2406\t65049\tRomney\t65049\t0.00021787599999999999\t65049.0\n11990\t-92.637753\t38.203355\tLake Ozark city\tMO\tMissouri\tMiller County\t1590\t42.3\t20.8\t9.8\t22279\t139167\t0.2406\t65049\tRomney\t65049\t0.00389239\t65049.0\n11991\t-92.295126\t38.087585\tIberia city\tMO\tMissouri\tMiller County\t748\t38.2\t18.1\t15.1\t16621\t70909\t0.2406\t65486\tRomney\t65486\t0.001831137\t65486.0\n11992\t-92.62224499999999\t38.20398\tLakeside city\tMO\tMissouri\tMiller County\t38\t38.8\t15.4\t5.6\t18491\t125000\t0.2406\t65049\tRomney\t65049\t9.300000000000001e-05\t65049.0\n11993\t-92.460074\t38.237219\tTuscumbia town\tMO\tMissouri\tMiller County\t226\t40.6\t11.5\t8.8\t17930\t96667\t0.2406\t65082\tRomney\t65082\t0.000553258\t65082.0\n11994\t-92.484712\t38.088025\tBrumley town\tMO\tMissouri\tMiller County\t105\t38.8\t14.5\t10.0\t18062\t100000\t0.2406\t65017\tRomney\t65017\t0.000257045\t65017.0\n11995\t-92.577215\t38.350503\tEldon city\tMO\tMissouri\tMiller County\t5031\t40.7\t14.1\t12.1\t19529\t80732\t0.2406\t65026\tRomney\t65026\t0.012316108999999999\t65026.0\n11996\t-89.222965\t36.923561\tWilson City village\tMO\tMissouri\tMississippi County\t153\t40.9\t8.7\t16.1\t15922\t62000\t0.3776\t63882\tRomney\t63882\t0.000374551\t63882.0\n11997\t-89.449026\t36.909299\tBertrand city\tMO\tMissouri\tMississippi County\t751\t45.8\t6.1\t11.0\t18671\t72895\t0.3776\t63823\tRomney\t63823\t0.001838481\t63823.0\n11998\t-89.19138000000001\t36.932724\tWyatt city\tMO\tMissouri\tMississippi County\t337\t41.3\t8.4\t16.7\t15946\t62273\t0.3776\t63882\tRomney\t63882\t0.0008249910000000001\t63882.0\n11999\t-89.38423399999999\t36.778868\tEast Prairie city\tMO\tMissouri\tMississippi County\t3197\t36.2\t12.3\t13.4\t15747\t63202\t0.3776\t63845\tRomney\t63845\t0.007826396\t63845.0\n12000\t-89.335219\t36.917704\tCharleston city\tMO\tMissouri\tMississippi County\t4731\t35.9\t17.5\t16.7\t15268\t78952\t0.3776\t63834\tRomney\t63834\t0.011581696\t63834.0\n12001\t-89.269337\t36.737997\tPinhook village\tMO\tMissouri\tMississippi County\t49\t40.6\t12.5\t17.4\t14911\t85000\t0.3776\t63845\tRomney\t63845\t0.000119954\t63845.0\n12002\t-89.326491\t36.824321999999995\tAnniston town\tMO\tMissouri\tMississippi County\t313\t42.1\t7.3\t11.9\t14630\t62500\t0.3776\t63820\tRomney\t63820\t0.000766238\t63820.0\n12003\t-92.453875\t38.84599\tLupus town\tMO\tMissouri\tMoniteau County\t30\t36.3\t19.0\t6.7\t19553\t85000\t0.2496\t65287\tRomney\t65287\t7.340000000000001e-05\t65287.0\n12004\t-92.56312\t38.631356\tCalifornia city\tMO\tMissouri\tMoniteau County\t4088\t38.6\t16.5\t8.6\t19897\t90372\t0.2496\t65018\tRomney\t65018\t0.010007604\t65018.0\n12005\t-92.666037\t38.661141\tClarksburg city\tMO\tMissouri\tMoniteau County\t371\t33.1\t9.2\t9.4\t17507\t82857\t0.2496\t65025\tRomney\t65025\t0.0009082239999999999\t65025.0\n12006\t-92.780214\t38.654897\tTipton city\tMO\tMissouri\tMoniteau County\t3143\t37.2\t9.5\t8.1\t18452\t87245\t0.2496\t65081\tRomney\t65081\t0.007694202\t65081.0\n12007\t-92.480153\t38.766698999999996\tJamestown town\tMO\tMissouri\tMoniteau County\t392\t42.4\t19.9\t9.0\t19696\t83182\t0.2496\t65046\tRomney\t65046\t0.000959633\t65046.0\n12008\t-92.13128499999999\t39.493604\tHolliday village\tMO\tMissouri\tMonroe County\t138\t37.5\t5.7\t19.6\t16916\t65000\t0.3446\t65258\tRomney\t65258\t0.00033783\t65258.0\n12009\t-91.71142900000001\t39.66072\tMonroe City\tMO\tMissouri\tMonroe County\t2462\t40.0\t12.6\t12.8\t19277\t86373\t0.3446\t63456\tRomney\t63456\t0.006027084\t63456.0\n12010\t-91.847368\t39.547778\tStoutsville village\tMO\tMissouri\tMonroe County\t51\t49.4\t7.9\t7.1\t18502\t156250\t0.3446\t65283\tRomney\t65283\t0.00012485\t65283.0\n12011\t-91.79063599999999\t39.493041\tFlorida village\tMO\tMissouri\tMonroe County\t10\t52.5\t0.0\t16.7\t19264\t112500\t0.3446\t65283\tRomney\t65283\t2.45e-05\t65283.0\n12012\t-92.004072\t39.477208000000005\tParis city\tMO\tMissouri\tMonroe County\t1391\t44.2\t11.6\t10.8\t16573\t66944\t0.3446\t65275\tRomney\t65275\t0.003405229\t65275.0\n12013\t-92.211732\t39.473523\tMadison city\tMO\tMissouri\tMonroe County\t625\t36.6\t6.3\t19.5\t16867\t65741\t0.3446\t65263\tRomney\t65263\t0.0015300270000000002\t65263.0\n12014\t-91.451809\t38.908747\tNew Florence city\tMO\tMissouri\tMontgomery County\t858\t43.7\t4.9\t12.8\t15777\t75278\t0.3266\t63363\tRomney\t63363\t0.0021004220000000002\t63363.0\n12015\t-91.51749699999999\t38.720368\tRhineland town\tMO\tMissouri\tMontgomery County\t171\t40.0\t21.8\t12.5\t20552\t131944\t0.3266\t65069\tRomney\t65069\t0.00041861599999999996\t65069.0\n12016\t-91.568265\t39.073574\tWellsville city\tMO\tMissouri\tMontgomery County\t1320\t41.3\t10.0\t16.2\t16180\t56667\t0.3266\t63384\tRomney\t63384\t0.003231418\t63384.0\n12017\t-91.378354\t38.875941999999995\tHigh Hill city\tMO\tMissouri\tMontgomery County\t235\t44.0\t9.4\t13.6\t15955\t86250\t0.3266\t63350\tRomney\t63350\t0.00057529\t63350.0\n12018\t-91.443148\t38.735621\tMcKittrick town\tMO\tMissouri\tMontgomery County\t69\t45.4\t12.0\t8.8\t22939\t100000\t0.3266\t65041\tRomney\t65041\t0.000168915\t65041.0\n12019\t-91.41380600000001\t39.128634999999996\tMiddletown town\tMO\tMissouri\tMontgomery County\t187\t46.3\t9.0\t15.9\t16388\t102083\t0.3266\t63359\tRomney\t63359\t0.00045778400000000003\t63359.0\n12020\t-91.304552\t38.853803000000006\tJonesburg city\tMO\tMissouri\tMontgomery County\t752\t43.6\t9.3\t13.6\t15981\t85833\t0.3266\t63351\tRomney\t63351\t0.001840929\t63351.0\n12021\t-91.352108\t39.003387\tBellflower city\tMO\tMissouri\tMontgomery County\t418\t37.7\t5.2\t12.1\t16438\t65500\t0.3266\t63333\tRomney\t63333\t0.001023282\t63333.0\n12022\t-91.50328499999999\t38.973776\tMontgomery City\tMO\tMissouri\tMontgomery County\t2396\t39.0\t20.1\t16.8\t20691\t89557\t0.3266\t63361\tRomney\t63361\t0.005865513\t63361.0\n12023\t-92.990344\t38.441697\tStover city\tMO\tMissouri\tMorgan County\t1091\t43.6\t10.7\t13.7\t17589\t62414\t0.3192\t65078\tRomney\t65078\t0.002670816\t65078.0\n12024\t-92.876311\t38.669579\tSyracuse city\tMO\tMissouri\tMorgan County\t186\t40.9\t10.9\t9.3\t20781\t98333\t0.3192\t65354\tRomney\t65354\t0.000455336\t65354.0\n12025\t-92.824952\t38.207749\tLaurie village\tMO\tMissouri\tMorgan County\t719\t58.9\t15.5\t7.7\t22655\t139362\t0.3192\t65037\tRomney\t65037\t0.001760144\t65037.0\n12026\t-92.674596\t38.377388\tBarnett city\tMO\tMissouri\tMorgan County\t245\t36.5\t10.7\t9.8\t17281\t92500\t0.3192\t65011\tRomney\t65011\t0.000599771\t65011.0\n12027\t-92.845283\t38.433282\tVersailles city\tMO\tMissouri\tMorgan County\t2552\t43.3\t14.0\t13.3\t18834\t77640\t0.3192\t65084\tRomney\t65084\t0.006247408\t65084.0\n12028\t-92.824311\t38.304491999999996\tGravois Mills town\tMO\tMissouri\tMorgan County\t208\t50.3\t6.3\t22.8\t17880\t75833\t0.3192\t65037\tRomney\t65037\t0.000509193\t65037.0\n12029\t-89.816985\t36.505997\tTallapoosa city\tMO\tMissouri\tNew Madrid County\t192\t41.2\t12.1\t11.7\t16201\t62500\t0.3881\t63878\tRomney\t63878\t0.00047002400000000004\t63878.0\n12030\t-89.597025\t36.568308\tHowardville city\tMO\tMissouri\tNew Madrid County\t352\t36.9\t5.6\t14.4\t13633\t72273\t0.3881\t63862\tRomney\t63862\t0.000861711\t63862.0\n12031\t-89.912778\t36.448873999999996\tGideon city\tMO\tMissouri\tNew Madrid County\t1080\t36.4\t11.7\t9.3\t14648\t49865\t0.3881\t63848\tRomney\t63848\t0.002643887\t63848.0\n12032\t-89.69108299999999\t36.846545\tMorehouse city\tMO\tMissouri\tNew Madrid County\t863\t41.2\t3.9\t9.3\t14630\t37717\t0.3881\t63868\tRomney\t63868\t0.002112662\t63868.0\n12033\t-89.818861\t36.611729\tParma city\tMO\tMissouri\tNew Madrid County\t710\t38.8\t6.1\t17.8\t12306\t34750\t0.3881\t63870\tRomney\t63870\t0.001738111\t63870.0\n12034\t-89.706512\t36.611332\tCatron town\tMO\tMissouri\tNew Madrid County\t62\t40.6\t9.3\t11.5\t16260\t50000\t0.3881\t63833\tRomney\t63833\t0.000151779\t63833.0\n12035\t-89.622028\t36.601682000000004\tNorth Lilbourn village\tMO\tMissouri\tNew Madrid County\t79\t37.9\t13.5\t6.5\t14374\t63333\t0.3881\t63862\tRomney\t63862\t0.000193395\t63862.0\n12036\t-89.583977\t36.758752\tMatthews city\tMO\tMissouri\tNew Madrid County\t509\t40.3\t10.9\t11.6\t16290\t70000\t0.3881\t63867\tRomney\t63867\t0.001246054\t63867.0\n12037\t-89.55024399999999\t36.58788\tNew Madrid city\tMO\tMissouri\tNew Madrid County\t3135\t38.1\t18.5\t7.9\t18157\t84013\t0.3881\t63869\tRomney\t63869\t0.007674618\t63869.0\n12038\t-89.606112\t36.517753000000006\tMarston city\tMO\tMissouri\tNew Madrid County\t516\t37.5\t8.0\t20.8\t14861\t41750\t0.3881\t63866\tRomney\t63866\t0.001263191\t63866.0\n12039\t-89.69885699999999\t36.43042\tPortageville city\tMO\tMissouri\tNew Madrid County\t3062\t39.5\t15.4\t9.7\t17703\t83000\t0.3881\t63873\tRomney\t63873\t0.007495911\t63873.0\n12040\t-89.613413\t36.591037\tLilbourn city\tMO\tMissouri\tNew Madrid County\t1111\t38.8\t8.1\t12.0\t15060\t55417\t0.3881\t63862\tRomney\t63862\t0.002719777\t63862.0\n12041\t-89.818706\t36.551693\tRisco city\tMO\tMissouri\tNew Madrid County\t332\t40.8\t10.8\t7.1\t17895\t56364\t0.3881\t63874\tRomney\t63874\t0.000812751\t63874.0\n12042\t-89.68754100000001\t36.753906\tCanalou city\tMO\tMissouri\tNew Madrid County\t293\t41.0\t7.4\t10.5\t15523\t64000\t0.3881\t63828\tRomney\t63828\t0.000717277\t63828.0\n12043\t-94.08710500000001\t36.8175\tFairview town\tMO\tMissouri\tNewton County\t429\t35.7\t10.2\t8.2\t16530\t89375\t0.2561\t64842\tRomney\t64842\t0.0010502110000000001\t64842.0\n12044\t-94.522789\t37.037046999999994\tShoal Creek Drive village\tMO\tMissouri\tNewton County\t341\t42.9\t33.6\t7.7\t27857\t122222\t0.2561\t64804\tRomney\t64804\t0.0008347830000000001\t64804.0\n12045\t-94.260574\t36.917977\tGranby city\tMO\tMissouri\tNewton County\t2240\t36.8\t8.1\t15.5\t16956\t57333\t0.2561\t64844\tRomney\t64844\t0.005483618000000001\t64844.0\n12046\t-94.608867\t36.839068\tSeneca city\tMO\tMissouri\tNewton County\t2267\t40.0\t14.0\t11.2\t16872\t87593\t0.2561\t64865\tRomney\t64865\t0.005549716\t64865.0\n12047\t-94.51751\t37.019679\tRedings Mill village\tMO\tMissouri\tNewton County\t159\t47.5\t21.0\t14.8\t21926\t96667\t0.2561\t64804\tRomney\t64804\t0.000389239\t64804.0\n12048\t-94.517271\t37.025157\tCliff Village village\tMO\tMissouri\tNewton County\t33\t42.5\t23.1\t15.8\t21933\t95000\t0.2561\t64804\tRomney\t64804\t8.08e-05\t64804.0\n12049\t-94.07533000000001\t36.993358\tWentworth village\tMO\tMissouri\tNewton County\t158\t41.1\t17.6\t5.0\t17190\t106250\t0.2561\t64873\tRomney\t64873\t0.000386791\t64873.0\n12050\t-94.537719\t37.03557\tGrand Falls Plaza town\tMO\tMissouri\tNewton County\t103\t42.9\t33.3\t7.8\t27712\t120000\t0.2561\t64804\tRomney\t64804\t0.000252149\t64804.0\n12051\t-94.188101\t36.86034\tStark City town\tMO\tMissouri\tNewton County\t173\t38.1\t9.6\t9.6\t15597\t65000\t0.2561\t64866\tRomney\t64866\t0.00042351199999999997\t64866.0\n12052\t-94.492952\t37.017179999999996\tShoal Creek Estates town\tMO\tMissouri\tNewton County\t58\t39.4\t44.7\t9.7\t44027\t262500\t0.2561\t64804\tRomney\t64804\t0.000141987\t64804.0\n12053\t-94.19084699999999\t36.762338\tStella town\tMO\tMissouri\tNewton County\t193\t36.3\t10.1\t8.0\t16550\t88750\t0.2561\t64867\tRomney\t64867\t0.000472472\t64867.0\n12054\t-94.18377\t36.879353\tNewtonia town\tMO\tMissouri\tNewton County\t256\t37.9\t9.4\t9.7\t15646\t70000\t0.2561\t64866\tRomney\t64866\t0.000626699\t64866.0\n12055\t-94.47241600000001\t37.026097\tSaginaw village\tMO\tMissouri\tNewton County\t290\t44.4\t27.3\t8.0\t22986\t127344\t0.2561\t64804\tRomney\t64804\t0.000709933\t64804.0\n12056\t-94.504328\t37.046431\tDennis Acres village\tMO\tMissouri\tNewton County\t68\t42.5\t28.3\t9.1\t23313\t131250\t0.2561\t64804\tRomney\t64804\t0.000166467\t64804.0\n12057\t-94.469109\t37.039488\tSilver Creek village\tMO\tMissouri\tNewton County\t638\t44.1\t27.3\t7.6\t23284\t126894\t0.2561\t64804\tRomney\t64804\t0.001561852\t64804.0\n12058\t-94.500229\t37.034917\tLeawood village\tMO\tMissouri\tNewton County\t1030\t40.4\t46.3\t10.4\t44004\t239394\t0.2561\t64804\tRomney\t64804\t0.002521485\t64804.0\n12059\t-94.31481099999999\t36.996101\tDiamond town\tMO\tMissouri\tNewton County\t914\t33.3\t13.6\t13.9\t18221\t80517\t0.2561\t64840\tRomney\t64840\t0.002237512\t64840.0\n12060\t-94.592618\t36.985175\tLoma Linda town\tMO\tMissouri\tNewton County\t757\t40.6\t23.2\t7.0\t23125\t116204\t0.2561\t64804\tRomney\t64804\t0.001853169\t64804.0\n12061\t-94.18568\t36.944238\tRitchey town\tMO\tMissouri\tNewton County\t77\t47.1\t7.3\t10.3\t18036\t75000\t0.2561\t64844\tRomney\t64844\t0.000188499\t64844.0\n12062\t-94.39081999999999\t36.844403\tNeosho city\tMO\tMissouri\tNewton County\t11105\t37.2\t21.7\t11.4\t20215\t94700\t0.2561\t64850\tRomney\t64850\t0.027185527999999997\t64850.0\n12063\t-94.622003\t40.438691\tParnell city\tMO\tMissouri\tNodaway County\t192\t37.3\t11.5\t10.8\t15800\t33750\t0.3534\t64475\tRomney\t64475\t0.00047002400000000004\t64475.0\n12064\t-95.11697099999999\t40.518726\tElmo city\tMO\tMissouri\tNodaway County\t163\t39.8\t13.6\t8.2\t15418\t46250\t0.3534\t64445\tRomney\t64445\t0.000399031\t64445.0\n12065\t-94.669673\t40.265551\tClyde village\tMO\tMissouri\tNodaway County\t74\t39.5\t20.0\t5.7\t16154\t57500\t0.3534\t64432\tRomney\t64432\t0.000181155\t64432.0\n12066\t-95.076498\t40.373431\tQuitman town\tMO\tMissouri\tNodaway County\t43\t45.0\t16.7\t9.1\t20034\t37500\t0.3534\t64428\tRomney\t64428\t0.000105266\t64428.0\n12067\t-95.04046\t40.201338\tGraham town\tMO\tMissouri\tNodaway County\t187\t45.8\t13.8\t4.3\t17658\t77500\t0.3534\t64455\tRomney\t64455\t0.00045778400000000003\t64455.0\n12068\t-94.871963\t40.344964000000004\tMaryville city\tMO\tMissouri\tNodaway County\t10559\t24.7\t40.6\t10.2\t21702\t122625\t0.3534\t64468\tRomney\t64468\t0.025848896\t64468.0\n12069\t-94.817112\t40.551047\tHopkins city\tMO\tMissouri\tNodaway County\t566\t37.2\t11.2\t10.6\t15758\t33906\t0.3534\t64461\tRomney\t64461\t0.0013855929999999999\t64461.0\n12070\t-94.691367\t40.26835\tConception Junction town\tMO\tMissouri\tNodaway County\t201\t39.0\t20.3\t5.3\t16222\t70000\t0.3534\t64432\tRomney\t64432\t0.000492057\t64432.0\n12071\t-94.671711\t40.352569\tRavenwood town\tMO\tMissouri\tNodaway County\t470\t37.3\t13.5\t2.9\t19739\t71667\t0.3534\t64479\tRomney\t64479\t0.0011505810000000001\t64479.0\n12072\t-94.84163199999999\t40.450237\tPickering town\tMO\tMissouri\tNodaway County\t144\t41.0\t22.9\t2.6\t22107\t120833\t0.3534\t64476\tRomney\t64476\t0.000352518\t64476.0\n12073\t-94.829051\t40.259609000000005\tArkoe town\tMO\tMissouri\tNodaway County\t62\t41.5\t20.9\t3.2\t19904\t137500\t0.3534\t64423\tRomney\t64423\t0.000151779\t64423.0\n12074\t-94.822886\t40.1753\tBarnard city\tMO\tMissouri\tNodaway County\t256\t38.7\t20.1\t5.0\t16212\t68000\t0.3534\t64423\tRomney\t64423\t0.000626699\t64423.0\n12075\t-95.032774\t40.507712\tClearmont city\tMO\tMissouri\tNodaway County\t182\t45.2\t13.2\t12.5\t16101\t80625\t0.3534\t64431\tRomney\t64431\t0.00044554400000000003\t64431.0\n12076\t-95.079329\t40.287782\tSkidmore city\tMO\tMissouri\tNodaway County\t320\t44.5\t15.7\t7.1\t20021\t47500\t0.3534\t64487\tRomney\t64487\t0.000783374\t64487.0\n12077\t-95.067712\t40.447233000000004\tBurlington Junction city\tMO\tMissouri\tNodaway County\t622\t38.9\t14.2\t8.3\t15386\t47600\t0.3534\t64428\tRomney\t64428\t0.001522683\t64428.0\n12078\t-94.736237\t40.168502000000004\tGuilford town\tMO\tMissouri\tNodaway County\t87\t37.5\t20.3\t5.0\t16159\t67500\t0.3534\t64457\tRomney\t64457\t0.00021298\t64457.0\n12079\t-91.64583\t36.597272\tKoshkonong town\tMO\tMissouri\tOregon County\t198\t45.8\t12.2\t7.5\t14761\t91250\t0.321\t65692\tRomney\t65692\t0.000484713\t65692.0\n12080\t-91.541232\t36.525069\tThayer city\tMO\tMissouri\tOregon County\t2565\t39.9\t10.0\t12.3\t15439\t67105\t0.321\t65791\tRomney\t65791\t0.006279233\t65791.0\n12081\t-91.39945999999999\t36.693713\tAlton city\tMO\tMissouri\tOregon County\t624\t42.5\t12.0\t19.3\t13122\t54565\t0.321\t65606\tRomney\t65606\t0.001527579\t65606.0\n12082\t-91.770103\t38.676384000000006\tChamois city\tMO\tMissouri\tOsage County\t442\t38.3\t14.7\t14.3\t18226\t49412\t0.2129\t65024\tRomney\t65024\t0.001082035\t65024.0\n12083\t-92.000566\t38.441375\tWestphalia city\tMO\tMissouri\tOsage County\t318\t40.1\t13.8\t6.2\t19986\t130114\t0.2129\t65085\tRomney\t65085\t0.000778478\t65085.0\n12084\t-92.1661\t38.312589\tMeta city\tMO\tMissouri\tOsage County\t243\t37.5\t9.4\t5.7\t19215\t82143\t0.2129\t65058\tRomney\t65058\t0.000594875\t65058.0\n12085\t-91.844891\t38.480332000000004\tLinn city\tMO\tMissouri\tOsage County\t1393\t37.0\t16.6\t12.7\t16330\t101667\t0.2129\t65051\tRomney\t65051\t0.003410125\t65051.0\n12086\t-92.02453100000001\t38.296011\tArgyle town\tMO\tMissouri\tOsage County\t160\t38.3\t9.5\t6.2\t19266\t83750\t0.2129\t65001\tRomney\t65001\t0.000391687\t65001.0\n12087\t-91.922297\t38.316028\tFreeburg village\tMO\tMissouri\tOsage County\t429\t36.1\t10.3\t5.2\t19780\t110096\t0.2129\t65035\tRomney\t65035\t0.0010502110000000001\t65035.0\n12088\t-92.144812\t36.523884\tBakersfield village\tMO\tMissouri\tOzark County\t286\t35.3\t3.3\t10.4\t17531\t76250\t0.2832\t65609\tRomney\t65609\t0.000700141\t65609.0\n12089\t-92.663741\t36.580692\tTheodosia village\tMO\tMissouri\tOzark County\t239\t58.8\t10.2\t14.8\t16333\t85625\t0.2832\t65676\tRomney\t65676\t0.000585083\t65676.0\n12090\t-92.637968\t36.56588\tSundown village\tMO\tMissouri\tOzark County\t38\t55.0\t15.2\t7.7\t23344\t118750\t0.2832\t65676\tRomney\t65676\t9.300000000000001e-05\t65676.0\n12091\t-92.424944\t36.606021000000005\tGainesville city\tMO\tMissouri\tOzark County\t620\t43.1\t16.8\t5.9\t15494\t72667\t0.2832\t65655\tRomney\t65655\t0.001517787\t65655.0\n12092\t-89.747959\t36.232403999999995\tHayti city\tMO\tMissouri\tPemiscot County\t2972\t36.9\t10.8\t13.5\t13132\t54737\t0.4216\t63851\tRomney\t63851\t0.007275586999999999\t63851.0\n12093\t-89.86484200000001\t36.090269\tSteele city\tMO\tMissouri\tPemiscot County\t2077\t35.3\t13.4\t12.9\t15609\t73167\t0.4216\t63877\tRomney\t63877\t0.005084587\t63877.0\n12094\t-89.81610400000001\t36.358759\tNorth Wardell village\tMO\tMissouri\tPemiscot County\t145\t40.6\t7.8\t12.7\t15597\t55000\t0.4216\t63879\tRomney\t63879\t0.00035496599999999996\t63879.0\n12095\t-89.817611\t36.351453\tWardell town\tMO\tMissouri\tPemiscot County\t247\t40.4\t7.6\t11.8\t15328\t53571\t0.4216\t63879\tRomney\t63879\t0.0006046669999999999\t63879.0\n12096\t-89.809407\t36.046432\tCooter city\tMO\tMissouri\tPemiscot County\t408\t36.2\t13.3\t16.5\t18278\t84444\t0.4216\t63839\tRomney\t63839\t0.000998802\t63839.0\n12097\t-89.827733\t36.267434\tPascola village\tMO\tMissouri\tPemiscot County\t129\t39.6\t9.2\t11.5\t15109\t40000\t0.4216\t63827\tRomney\t63827\t0.000315798\t63827.0\n12098\t-89.666535\t36.181515000000005\tCaruthersville city\tMO\tMissouri\tPemiscot County\t6197\t33.0\t10.2\t16.5\t14626\t71818\t0.4216\t63830\tRomney\t63830\t0.015170528\t63830.0\n12099\t-89.870634\t36.057111\tHolland town\tMO\tMissouri\tPemiscot County\t238\t38.4\t19.8\t12.5\t18742\t74167\t0.4216\t63853\tRomney\t63853\t0.0005826340000000001\t63853.0\n12100\t-89.824197\t36.331873\tHomestown city\tMO\tMissouri\tPemiscot County\t170\t39.2\t8.7\t11.4\t15035\t40000\t0.4216\t63879\tRomney\t63879\t0.00041616699999999995\t63879.0\n12101\t-89.768077\t36.231146\tHayti Heights city\tMO\tMissouri\tPemiscot County\t707\t30.4\t3.6\t16.4\t11148\t45500\t0.4216\t63851\tRomney\t63851\t0.001730767\t63851.0\n12102\t-89.911293\t36.268135\tBragg City town\tMO\tMissouri\tPemiscot County\t162\t41.5\t7.8\t11.6\t15517\t56000\t0.4216\t63827\tRomney\t63827\t0.00039658300000000005\t63827.0\n12103\t-89.666722\t36.396198\tHayward town\tMO\tMissouri\tPemiscot County\t116\t40.4\t9.8\t14.5\t13989\t72500\t0.4216\t63873\tRomney\t63873\t0.00028397299999999997\t63873.0\n12104\t-89.584378\t37.630416\tAltenburg city\tMO\tMissouri\tPerry County\t307\t43.0\t12.2\t5.9\t19141\t93182\t0.2734\t63732\tRomney\t63732\t0.0007515489999999999\t63732.0\n12105\t-89.875429\t37.725663\tPerryville city\tMO\tMissouri\tPerry County\t7873\t39.3\t16.7\t8.7\t20030\t110861\t0.2734\t63775\tRomney\t63775\t0.01927345\t63775.0\n12106\t-89.883975\t37.83246\tLithium village\tMO\tMissouri\tPerry County\t0\t0.0\t0.0\t0.0\t0\t0\t0.2734\t63673\tRomney\t63673\t0.0\t63673.0\n12107\t-89.83704200000001\t37.604991\tBiehle village\tMO\tMissouri\tPerry County\t12\t0.0\t0.0\t0.0\t19271\t0\t0.2734\t63747\tRomney\t63747\t2.94e-05\t63747.0\n12108\t-89.620521\t37.636584\tFrohna city\tMO\tMissouri\tPerry County\t191\t42.5\t11.7\t5.7\t19116\t95000\t0.2734\t63748\tRomney\t63748\t0.000467576\t63748.0\n12109\t-89.77399\t37.670241\tLongtown town\tMO\tMissouri\tPerry County\t77\t40.5\t9.4\t9.3\t18826\t117500\t0.2734\t63770\tRomney\t63770\t0.000188499\t63770.0\n12110\t-93.411132\t38.621403\tGreen Ridge city\tMO\tMissouri\tPettis County\t455\t38.3\t13.7\t11.4\t19325\t111184\t0.3438\t65332\tRomney\t65332\t0.00111386\t65332.0\n12111\t-93.359484\t38.899312\tHoustonia city\tMO\tMissouri\tPettis County\t296\t37.5\t15.7\t13.3\t17580\t82500\t0.3438\t65333\tRomney\t65333\t0.000724621\t65333.0\n12112\t-93.235493\t38.703682\tSedalia city\tMO\tMissouri\tPettis County\t20919\t36.7\t17.9\t13.3\t19328\t88660\t0.3438\t65301\tRomney\t65301\t0.051210631\t65301.0\n12113\t-93.423663\t38.771995000000004\tLa Monte city\tMO\tMissouri\tPettis County\t1165\t35.8\t10.1\t17.2\t18752\t80000\t0.3438\t65337\tRomney\t65337\t0.0028519709999999996\t65337.0\n12114\t-93.295273\t38.83695\tHughesville village\tMO\tMissouri\tPettis County\t187\t36.8\t15.8\t12.9\t17610\t83750\t0.3438\t65334\tRomney\t65334\t0.00045778400000000003\t65334.0\n12115\t-93.092906\t38.68119\tSmithton city\tMO\tMissouri\tPettis County\t569\t33.1\t12.7\t8.3\t18363\t84231\t0.3438\t65350\tRomney\t65350\t0.0013929370000000001\t65350.0\n12116\t-91.89997\t37.916982\tNewburg city\tMO\tMissouri\tPhelps County\t519\t43.4\t8.8\t8.1\t16220\t59444\t0.3187\t65550\tRomney\t65550\t0.001270535\t65550.0\n12117\t-91.61485\t38.000766\tSt. James city\tMO\tMissouri\tPhelps County\t3832\t42.9\t16.9\t9.3\t17330\t95270\t0.3187\t65559\tRomney\t65559\t0.009380904\t65559.0\n12118\t-91.888906\t37.942342\tDoolittle city\tMO\tMissouri\tPhelps County\t698\t41.8\t11.4\t7.9\t16651\t67143\t0.3187\t65529\tRomney\t65529\t0.001708735\t65529.0\n12119\t-91.866337\t37.702317\tEdgar Springs city\tMO\tMissouri\tPhelps County\t184\t44.4\t13.0\t11.0\t13657\t69000\t0.3187\t65462\tRomney\t65462\t0.00045044\t65462.0\n12120\t-91.76239\t37.944179\tRolla city\tMO\tMissouri\tPhelps County\t17419\t31.1\t32.3\t10.6\t20050\t112500\t0.3187\t65401\tRomney\t65401\t0.042642477000000005\t65401.0\n12121\t-90.90471099999999\t39.370579\tClarksville city\tMO\tMissouri\tPike County\t479\t39.8\t19.1\t11.1\t17940\t80556\t0.3527\t63336\tRomney\t63336\t0.001172613\t63336.0\n12122\t-90.900299\t39.262479\tPaynesville village\tMO\tMissouri\tPike County\t105\t42.5\t13.7\t15.0\t19055\t95000\t0.3527\t63330\tRomney\t63330\t0.000257045\t63330.0\n12123\t-91.195418\t39.339314\tBowling Green city\tMO\tMissouri\tPike County\t3193\t38.0\t11.2\t17.9\t19078\t84247\t0.3527\t63334\tRomney\t63334\t0.007816604\t63334.0\n12124\t-91.062557\t39.441432\tLouisiana city\tMO\tMissouri\tPike County\t3694\t42.6\t14.9\t11.7\t18876\t78413\t0.3527\t63353\tRomney\t63353\t0.009043074\t63353.0\n12125\t-90.82866899999999\t39.262315\tAnnada village\tMO\tMissouri\tPike County\t53\t45.6\t21.6\t7.7\t21228\t125000\t0.3527\t63330\tRomney\t63330\t0.000129746\t63330.0\n12126\t-91.320825\t39.492898\tFrankford city\tMO\tMissouri\tPike County\t373\t44.7\t5.8\t6.9\t19079\t66786\t0.3527\t63441\tRomney\t63441\t0.00091312\t63441.0\n12127\t-91.171966\t39.545772\tAshburn town\tMO\tMissouri\tPike County\t54\t45.6\t13.2\t9.5\t17161\t80000\t0.3527\t63433\tRomney\t63433\t0.000132194\t63433.0\n12128\t-91.183696\t39.357622\tTarrants village\tMO\tMissouri\tPike County\t31\t37.5\t14.3\t15.8\t19782\t90000\t0.3527\t63334\tRomney\t63334\t7.59e-05\t63334.0\n12129\t-91.341307\t39.345778\tCurryville city\tMO\tMissouri\tPike County\t261\t36.6\t9.2\t8.0\t15627\t106250\t0.3527\t63339\tRomney\t63339\t0.000638939\t63339.0\n12130\t-91.01198199999999\t39.239057\tEolia village\tMO\tMissouri\tPike County\t503\t42.4\t14.1\t14.7\t19008\t93636\t0.3527\t63344\tRomney\t63344\t0.001231366\t63344.0\n12131\t-94.769025\t39.359106\tPlatte City\tMO\tMissouri\tPlatte County\t5169\t34.5\t25.9\t12.9\t27343\t140043\t0.4209\t64079\tRomney\t64079\t0.012653939\t64079.0\n12132\t-94.695916\t39.236488\tWeatherby Lake city\tMO\tMissouri\tPlatte County\t2055\t49.5\t45.3\t4.6\t44378\t249063\t0.4209\t64152\tRomney\t64152\t0.00503073\t64152.0\n12133\t-94.89528299999999\t39.415563\tWeston city\tMO\tMissouri\tPlatte County\t1654\t42.8\t25.6\t7.6\t24506\t122500\t0.4209\t64098\tRomney\t64098\t0.004049065\t64098.0\n12134\t-94.665138\t39.314218\tFerrelview village\tMO\tMissouri\tPlatte County\t669\t37.7\t16.9\t10.3\t27914\t27308\t0.4209\t64163\tRomney\t64163\t0.001637741\t64163.0\n12135\t-94.63916400000001\t39.231074\tLake Waukomis city\tMO\tMissouri\tPlatte County\t973\t51.3\t39.0\t5.6\t37564\t161000\t0.4209\t64151\tRomney\t64151\t0.002381947\t64151.0\n12136\t-94.981637\t39.475198999999996\tIatan village\tMO\tMissouri\tPlatte County\t55\t45.4\t19.5\t7.7\t23190\t125000\t0.4209\t64484\tRomney\t64484\t0.000134642\t64484.0\n12137\t-94.63032\t39.169981\tRiverside city\tMO\tMissouri\tPlatte County\t3086\t35.1\t20.3\t12.3\t22699\t117500\t0.4209\t64150\tRomney\t64150\t0.007554664\t64150.0\n12138\t-94.65214399999999\t39.228821999999994\tPlatte Woods city\tMO\tMissouri\tPlatte County\t539\t35.6\t52.2\t8.3\t40753\t175962\t0.4209\t64151\tRomney\t64151\t0.001319496\t64151.0\n12139\t-94.748423\t39.453159\tCamden Point city\tMO\tMissouri\tPlatte County\t512\t42.1\t29.3\t9.2\t27371\t154891\t0.4209\t64018\tRomney\t64018\t0.001253398\t64018.0\n12140\t-94.79315600000001\t39.378444\tTracy city\tMO\tMissouri\tPlatte County\t232\t40.3\t20.6\t7.5\t28247\t126563\t0.4209\t64079\tRomney\t64079\t0.0005679459999999999\t64079.0\n12141\t-94.60535899999999\t39.184358\tNorthmoor city\tMO\tMissouri\tPlatte County\t365\t41.6\t29.7\t15.7\t28743\t118750\t0.4209\t64150\tRomney\t64150\t0.000893536\t64150.0\n12142\t-94.69021\t39.196341\tParkville city\tMO\tMissouri\tPlatte County\t4673\t35.7\t41.0\t8.2\t35331\t183079\t0.4209\t64152\tRomney\t64152\t0.011439709\t64152.0\n12143\t-94.638115\t39.455815\tRidgely village\tMO\tMissouri\tPlatte County\t70\t43.8\t18.0\t5.9\t22897\t118750\t0.4209\t64444\tRomney\t64444\t0.000171363\t64444.0\n12144\t-94.631343\t39.504903999999996\tEdgerton city\tMO\tMissouri\tPlatte County\t586\t43.1\t17.9\t6.0\t22776\t113851\t0.4209\t64444\tRomney\t64444\t0.001434554\t64444.0\n12145\t-94.76621999999999\t39.533164\tDearborn city\tMO\tMissouri\tPlatte County\t586\t41.3\t19.8\t9.6\t23963\t106786\t0.4209\t64439\tRomney\t64439\t0.001434554\t64439.0\n12146\t-94.82897700000001\t39.285892\tFarley village\tMO\tMissouri\tPlatte County\t258\t47.0\t27.8\t6.9\t33163\t153409\t0.4209\t64079\tRomney\t64079\t0.000631595\t64079.0\n12147\t-94.622276\t39.192364000000005\tHouston Lake city\tMO\tMissouri\tPlatte County\t309\t44.2\t21.8\t11.5\t27766\t114113\t0.4209\t64150\tRomney\t64150\t0.000756446\t64150.0\n12148\t-93.41870899999999\t37.610446\tBolivar city\tMO\tMissouri\tPolk County\t10672\t31.3\t26.0\t10.3\t17809\t116655\t0.2729\t65613\tRomney\t65613\t0.026125525\t65613.0\n12149\t-93.576387\t37.795097\tHumansville city\tMO\tMissouri\tPolk County\t923\t46.1\t8.0\t16.9\t14704\t55595\t0.2729\t65674\tRomney\t65674\t0.002259545\t65674.0\n12150\t-93.501403\t37.80385\tFlemington village\tMO\tMissouri\tPolk County\t131\t45.4\t12.0\t9.4\t14841\t90000\t0.2729\t65650\tRomney\t65650\t0.000320694\t65650.0\n12151\t-93.55136\t37.549089\tAldrich village\tMO\tMissouri\tPolk County\t78\t45.4\t7.3\t6.7\t16983\t116667\t0.2729\t65601\tRomney\t65601\t0.000190947\t65601.0\n12152\t-93.428285\t37.480405\tMorrisville town\tMO\tMissouri\tPolk County\t381\t42.5\t10.3\t22.3\t14964\t83182\t0.2729\t65710\tRomney\t65710\t0.000932705\t65710.0\n12153\t-93.273418\t37.46147\tPleasant Hope city\tMO\tMissouri\tPolk County\t577\t37.4\t16.0\t7.9\t16991\t109028\t0.2729\t65725\tRomney\t65725\t0.0014125210000000001\t65725.0\n12154\t-93.238639\t37.618899\tHalfway village\tMO\tMissouri\tPolk County\t212\t36.5\t11.1\t11.8\t15245\t92500\t0.2729\t65663\tRomney\t65663\t0.000518985\t65663.0\n12155\t-93.576004\t37.633461\tFair Play city\tMO\tMissouri\tPolk County\t462\t41.0\t6.7\t12.2\t13220\t65000\t0.2729\t65649\tRomney\t65649\t0.001130996\t65649.0\n12156\t-92.157059\t37.705251000000004\tFort Leonard Wood CDP\tMO\tMissouri\tPulaski County\t14348\t21.6\t26.8\t15.7\t14391\t98750\t0.3094\t65473\tRomney\t65473\t0.035124534\t65473.0\n12157\t-92.144563\t37.829186\tSt. Robert city\tMO\tMissouri\tPulaski County\t3267\t34.0\t23.1\t8.3\t21537\t111547\t0.3094\t65583\tRomney\t65583\t0.00799776\t65583.0\n12158\t-92.096076\t37.994973\tDixon city\tMO\tMissouri\tPulaski County\t1589\t41.0\t10.5\t13.0\t14485\t77286\t0.3094\t65459\tRomney\t65459\t0.003889942\t65459.0\n12159\t-92.26783499999999\t37.948822\tCrocker city\tMO\tMissouri\tPulaski County\t968\t41.4\t14.5\t6.0\t16469\t70333\t0.3094\t65452\tRomney\t65452\t0.002369707\t65452.0\n12160\t-92.21794\t37.82189\tWaynesville city\tMO\tMissouri\tPulaski County\t3807\t41.5\t32.3\t6.1\t26462\t129018\t0.3094\t65583\tRomney\t65583\t0.009319703\t65583.0\n12161\t-92.398022\t37.863399\tRichland city\tMO\tMissouri\tPulaski County\t1763\t44.4\t19.0\t11.3\t18289\t75313\t0.3094\t65556\tRomney\t65556\t0.004315901\t65556.0\n12162\t-92.68925899999999\t40.408433\tWorthington village\tMO\tMissouri\tPutnam County\t85\t42.0\t10.3\t18.6\t16843\t56250\t0.2542\t63567\tRomney\t63567\t0.000208084\t63567.0\n12163\t-92.700559\t40.492027\tLivonia village\tMO\tMissouri\tPutnam County\t108\t45.0\t6.5\t8.3\t14880\t68333\t0.2542\t63551\tRomney\t63551\t0.000264389\t63551.0\n12164\t-93.291207\t40.463955\tLucerne village\tMO\tMissouri\tPutnam County\t88\t47.5\t17.5\t2.5\t19725\t91667\t0.2542\t64655\tRomney\t64655\t0.00021542799999999998\t64655.0\n12165\t-93.300273\t40.549623\tPowersville village\tMO\tMissouri\tPutnam County\t82\t47.5\t18.3\t2.6\t19784\t93333\t0.2542\t64672\tRomney\t64672\t0.00020074\t64672.0\n12166\t-93.0044\t40.475697\tUnionville city\tMO\tMissouri\tPutnam County\t2022\t45.8\t10.4\t7.8\t15555\t72458\t0.2542\t63565\tRomney\t63565\t0.004949945\t63565.0\n12167\t-91.398584\t39.584619\tNew London city\tMO\tMissouri\tRalls County\t1020\t38.9\t10.7\t14.7\t18713\t75694\t0.3447\t63459\tRomney\t63459\t0.002497005\t63459.0\n12168\t-91.666826\t39.430181\tPerry city\tMO\tMissouri\tRalls County\t649\t47.2\t16.4\t4.1\t18890\t73500\t0.3447\t63462\tRomney\t63462\t0.001588781\t63462.0\n12169\t-91.52914799999999\t39.509582\tCenter city\tMO\tMissouri\tRalls County\t632\t42.6\t6.9\t10.0\t16678\t75833\t0.3447\t63436\tRomney\t63436\t0.001547164\t63436.0\n12170\t-91.538696\t39.669227\tRensselaer village\tMO\tMissouri\tRalls County\t171\t44.5\t15.3\t11.8\t21104\t114583\t0.3447\t63461\tRomney\t63461\t0.00041861599999999996\t63461.0\n12171\t-92.43675\t39.415797\tMoberly city\tMO\tMissouri\tRandolph County\t13697\t37.7\t15.8\t13.2\t19366\t70707\t0.3048\t65270\tRomney\t65270\t0.033530858\t65270.0\n12172\t-92.34200200000001\t39.280408\tClark city\tMO\tMissouri\tRandolph County\t305\t38.0\t11.6\t8.7\t19292\t90000\t0.3048\t65243\tRomney\t65243\t0.000746653\t65243.0\n12173\t-92.411099\t39.341896000000006\tRenick village\tMO\tMissouri\tRandolph County\t229\t39.6\t7.1\t6.4\t16325\t95833\t0.3048\t65278\tRomney\t65278\t0.000560602\t65278.0\n12174\t-92.441313\t39.510663\tCairo village\tMO\tMissouri\tRandolph County\t249\t41.2\t8.7\t12.3\t21154\t83000\t0.3048\t65239\tRomney\t65239\t0.000609563\t65239.0\n12175\t-92.543966\t39.436424\tHuntsville city\tMO\tMissouri\tRandolph County\t1788\t35.3\t11.8\t10.5\t16124\t68065\t0.3048\t65259\tRomney\t65259\t0.004377103\t65259.0\n12176\t-92.512844\t39.306016\tHigbee city\tMO\tMissouri\tRandolph County\t633\t42.8\t8.0\t12.2\t17451\t39605\t0.3048\t65257\tRomney\t65257\t0.0015496120000000001\t65257.0\n12177\t-92.666875\t39.439009000000006\tClifton Hill city\tMO\tMissouri\tRandolph County\t125\t45.8\t11.1\t12.5\t19060\t97500\t0.3048\t65244\tRomney\t65244\t0.000306005\t65244.0\n12178\t-92.473011\t39.587747\tJacksonville village\tMO\tMissouri\tRandolph County\t185\t41.0\t14.1\t7.8\t17439\t127083\t0.3048\t65247\tRomney\t65247\t0.00045288800000000003\t65247.0\n12179\t-94.20311600000001\t39.438058000000005\tLawson city\tMO\tMissouri\tRay County\t2353\t33.7\t17.3\t8.9\t23110\t116011\t0.4124\t64062\tRomney\t64062\t0.005760247\t64062.0\n12180\t-94.052233\t39.195614\tFleming city\tMO\tMissouri\tRay County\t139\t39.0\t8.6\t7.4\t21025\t73333\t0.4124\t64017\tRomney\t64017\t0.000340278\t64017.0\n12181\t-94.125381\t39.21334\tOrrick city\tMO\tMissouri\tRay County\t1017\t38.6\t8.0\t7.7\t20874\t74600\t0.4124\t64077\tRomney\t64077\t0.0024896610000000002\t64077.0\n12182\t-94.15380400000001\t39.508302\tElmira village\tMO\tMissouri\tRay County\t89\t42.9\t13.1\t8.5\t24084\t137500\t0.4124\t64062\tRomney\t64062\t0.00021787599999999999\t64062.0\n12183\t-93.938546\t39.237118\tHenrietta city\tMO\tMissouri\tRay County\t542\t34.9\t8.5\t19.9\t19675\t72632\t0.4124\t64036\tRomney\t64036\t0.00132684\t64036.0\n12184\t-94.163724\t39.341539000000004\tWoods Heights city\tMO\tMissouri\tRay County\t765\t42.7\t12.5\t14.7\t23266\t121429\t0.4124\t64024\tRomney\t64024\t0.001872754\t64024.0\n12185\t-94.019598\t39.200107\tCamden city\tMO\tMissouri\tRay County\t239\t38.4\t8.2\t7.8\t20884\t75000\t0.4124\t64017\tRomney\t64017\t0.000585083\t64017.0\n12186\t-94.06480400000001\t39.347741\tRayville village\tMO\tMissouri\tRay County\t210\t45.6\t9.2\t14.4\t23159\t112500\t0.4124\t64084\tRomney\t64084\t0.000514089\t64084.0\n12187\t-93.97381999999999\t39.276684\tRichmond city\tMO\tMissouri\tRay County\t6124\t37.3\t15.0\t16.1\t23663\t98769\t0.4124\t64085\tRomney\t64085\t0.014991821\t64085.0\n12188\t-94.187401\t39.360756\tCrystal Lakes city\tMO\tMissouri\tRay County\t407\t42.2\t15.5\t15.3\t24407\t119141\t0.4124\t64024\tRomney\t64024\t0.0009963539999999999\t64024.0\n12189\t-94.206717\t39.391558\tExcelsior Estates village\tMO\tMissouri\tRay County\t269\t40.8\t12.9\t12.5\t22815\t159375\t0.4124\t64024\tRomney\t64024\t0.000658524\t64024.0\n12190\t-94.201479\t39.363059\tHomestead village\tMO\tMissouri\tRay County\t192\t42.5\t15.6\t15.6\t24444\t119853\t0.4124\t64024\tRomney\t64024\t0.00047002400000000004\t64024.0\n12191\t-93.831061\t39.267501\tHardin city\tMO\tMissouri\tRay County\t622\t39.8\t10.9\t15.8\t17510\t68148\t0.4124\t64035\tRomney\t64035\t0.001522683\t64035.0\n12192\t-90.960086\t37.436640999999995\tCenterville city\tMO\tMissouri\tReynolds County\t164\t45.8\t7.6\t13.1\t14789\t85000\t0.3613\t63633\tRomney\t63633\t0.000401479\t63633.0\n12193\t-90.972163\t37.236675\tEllington city\tMO\tMissouri\tReynolds County\t1018\t36.9\t9.9\t19.9\t16239\t75000\t0.3613\t63638\tRomney\t63638\t0.0024921089999999997\t63638.0\n12194\t-91.208872\t37.467512\tBunker city\tMO\tMissouri\tReynolds County\t418\t41.3\t5.9\t11.0\t15390\t76500\t0.3613\t63629\tRomney\t63629\t0.001023282\t63629.0\n12195\t-90.82190200000001\t36.623328\tDoniphan city\tMO\tMissouri\tRipley County\t1808\t45.6\t14.7\t15.0\t15595\t86333\t0.2652\t63935\tRomney\t63935\t0.004426063\t63935.0\n12196\t-90.605509\t36.574275\tNaylor city\tMO\tMissouri\tRipley County\t618\t38.8\t5.5\t14.3\t12737\t44412\t0.2652\t63953\tRomney\t63953\t0.0015128910000000001\t63953.0\n12197\t-90.685247\t38.704857000000004\tWeldon Spring Heights town\tMO\tMissouri\tSt. Charles County\t90\t43.5\t37.7\t8.2\t37791\t368750\t0.3869\t63304\tRomney\t63304\t0.000220324\t63304.0\n12198\t-90.34264399999999\t38.927009000000005\tPortage Des Sioux city\tMO\tMissouri\tSt. Charles County\t348\t42.2\t16.3\t20.0\t25235\t133750\t0.3869\t63373\tRomney\t63373\t0.0008519189999999999\t63373.0\n12199\t-90.879536\t38.709763\tNew Melle city\tMO\tMissouri\tSt. Charles County\t136\t42.5\t25.8\t7.6\t31190\t295833\t0.3869\t63341\tRomney\t63341\t0.000332934\t63341.0\n12200\t-90.733136\t38.755435\tDardenne Prairie town\tMO\tMissouri\tSt. Charles County\t10148\t31.3\t38.8\t7.1\t33965\t206742\t0.3869\t63366\tRomney\t63366\t0.02484275\t63366.0\n12201\t-90.64895899999999\t38.708876000000004\tWeldon Spring city\tMO\tMissouri\tSt. Charles County\t5965\t41.2\t45.1\t23.2\t46190\t310044\t0.3869\t63304\tRomney\t63304\t0.014602582\t63304.0\n12202\t-90.70841999999999\t38.785501000000004\tO'Fallon city\tMO\tMissouri\tSt. Charles County\t71281\t32.3\t32.2\t8.1\t30589\t185489\t0.3869\t63366\tRomney\t63366\t0.17449902\t63366.0\n12203\t-90.51804200000001\t38.794853\tSt. Charles city\tMO\tMissouri\tSt. Charles County\t62603\t37.1\t31.4\t11.8\t31875\t158807\t0.3869\t63301\tRomney\t63301\t0.153254895\t63301.0\n12204\t-90.78629000000001\t38.786184000000006\tLake St. Louis city\tMO\tMissouri\tSt. Charles County\t14457\t40.7\t40.9\t9.3\t40101\t233261\t0.3869\t63367\tRomney\t63367\t0.035391371\t63367.0\n12205\t-90.949042\t38.818647999999996\tForistell city\tMO\tMissouri\tSt. Charles County\t579\t40.0\t21.5\t9.6\t29196\t185294\t0.3869\t63348\tRomney\t63348\t0.001417417\t63348.0\n12206\t-90.862549\t38.816072\tWentzville city\tMO\tMissouri\tSt. Charles County\t19849\t36.5\t26.0\t8.1\t26720\t178722\t0.3869\t63385\tRomney\t63385\t0.048591224\t63385.0\n12207\t-90.740229\t38.845893\tSt. Paul city\tMO\tMissouri\tSt. Charles County\t2035\t39.3\t22.4\t6.2\t26703\t204688\t0.3869\t63366\tRomney\t63366\t0.0049817690000000005\t63366.0\n12208\t-90.208391\t38.866581\tWest Alton city\tMO\tMissouri\tSt. Charles County\t624\t42.8\t8.4\t12.0\t22451\t94375\t0.3869\t63386\tRomney\t63386\t0.001527579\t63386.0\n12209\t-90.657374\t38.752946\tCottleville city\tMO\tMissouri\tSt. Charles County\t3164\t30.6\t41.1\t7.5\t36709\t227980\t0.3869\t63304\tRomney\t63304\t0.0077456109999999995\t63304.0\n12210\t-90.883234\t38.57282\tAugusta town\tMO\tMissouri\tSt. Charles County\t269\t49.7\t27.7\t5.8\t30673\t177500\t0.3869\t63332\tRomney\t63332\t0.000658524\t63332.0\n12211\t-90.790948\t38.82878\tJosephville village\tMO\tMissouri\tSt. Charles County\t352\t40.0\t23.8\t4.3\t29410\t234091\t0.3869\t63367\tRomney\t63367\t0.000861711\t63367.0\n12212\t-90.869395\t38.86452\tFlint Hill city\tMO\tMissouri\tSt. Charles County\t464\t24.9\t18.5\t8.0\t19121\t172794\t0.3869\t63385\tRomney\t63385\t0.0011358919999999999\t63385.0\n12213\t-90.604928\t38.783271\tSt. Peters city\tMO\tMissouri\tSt. Charles County\t54364\t36.1\t34.3\t9.2\t32157\t167288\t0.3869\t63376\tRomney\t63376\t0.133085461\t63376.0\n12214\t-93.5768\t37.954646000000004\tGerster town\tMO\tMissouri\tSt. Clair County\t39\t52.5\t6.5\t11.8\t19002\t70000\t0.3156\t65774\tRomney\t65774\t9.549999999999999e-05\t65774.0\n12215\t-93.813745\t37.977399\tRoscoe village\tMO\tMissouri\tSt. Clair County\t106\t46.3\t9.2\t15.2\t13858\t80000\t0.3156\t64781\tRomney\t64781\t0.000259493\t64781.0\n12216\t-93.66369499999999\t37.989062\tVista village\tMO\tMissouri\tSt. Clair County\t62\t51.5\t6.3\t11.1\t18668\t70000\t0.3156\t64776\tRomney\t64776\t0.000151779\t64776.0\n12217\t-94.031006\t38.190540999999996\tAppleton City\tMO\tMissouri\tSt. Clair County\t1078\t44.2\t10.1\t9.1\t15660\t62206\t0.3156\t64724\tRomney\t64724\t0.002638991\t64724.0\n12218\t-93.621078\t37.890223\tCollins village\tMO\tMissouri\tSt. Clair County\t151\t47.3\t4.6\t9.4\t14777\t77500\t0.3156\t64738\tRomney\t64738\t0.000369655\t64738.0\n12219\t-93.698122\t38.046285\tOsceola city\tMO\tMissouri\tSt. Clair County\t914\t40.5\t13.0\t19.9\t16174\t65294\t0.3156\t64776\tRomney\t64776\t0.002237512\t64776.0\n12220\t-93.727463\t38.140193\tLowry City\tMO\tMissouri\tSt. Clair County\t755\t45.5\t7.5\t15.5\t15427\t52419\t0.3156\t64763\tRomney\t64763\t0.0018482729999999999\t64763.0\n12221\t-89.949502\t37.874018\tSt. Mary city\tMO\tMissouri\tSte. Genevieve County\t379\t40.9\t5.0\t10.7\t19782\t80000\t0.4725\t63673\tRomney\t63673\t0.0009278089999999999\t63673.0\n12222\t-90.220228\t38.017641999999995\tBloomsdale city\tMO\tMissouri\tSte. Genevieve County\t394\t40.0\t13.8\t9.5\t23583\t139773\t0.4725\t63627\tRomney\t63627\t0.000964529\t63627.0\n12223\t-90.048058\t37.976982\tSte. Genevieve city\tMO\tMissouri\tSte. Genevieve County\t4260\t43.4\t11.3\t10.9\t22394\t105010\t0.4725\t63670\tRomney\t63670\t0.010428666999999999\t63670.0\n12224\t-90.519195\t37.874107\tDesloge city\tMO\tMissouri\tSt. Francois County\t5271\t38.8\t15.1\t10.5\t20445\t96372\t0.391\t63601\tRomney\t63601\t0.01290364\t63601.0\n12225\t-90.619535\t37.685543\tIron Mountain Lake city\tMO\tMissouri\tSt. Francois County\t734\t41.4\t5.4\t19.1\t14021\t50658\t0.391\t63624\tRomney\t63624\t0.001796864\t63624.0\n12226\t-90.622378\t37.767265\tBismarck city\tMO\tMissouri\tSt. Francois County\t1628\t40.9\t8.4\t16.1\t17096\t72821\t0.391\t63624\tRomney\t63624\t0.0039854159999999994\t63624.0\n12227\t-90.481379\t37.833277\tLeadington city\tMO\tMissouri\tSt. Francois County\t290\t36.8\t12.2\t12.9\t16484\t86875\t0.391\t63601\tRomney\t63601\t0.000709933\t63601.0\n12228\t-90.545121\t37.920621999999995\tBonne Terre city\tMO\tMissouri\tSt. Francois County\t4338\t37.5\t8.6\t16.6\t17161\t85088\t0.391\t63628\tRomney\t63628\t0.010619615\t63628.0\n12229\t-90.505845\t37.821231\tPark Hills city\tMO\tMissouri\tSt. Francois County\t8401\t35.5\t11.7\t14.1\t16790\t80378\t0.391\t63601\tRomney\t63601\t0.020566017\t63601.0\n12230\t-90.589229\t37.861717\tLeadwood city\tMO\tMissouri\tSt. Francois County\t1161\t36.3\t8.6\t17.3\t12670\t55128\t0.391\t63653\tRomney\t63653\t0.0028421790000000002\t63653.0\n12231\t-90.429586\t37.783553999999995\tFarmington city\tMO\tMissouri\tSt. Francois County\t17671\t38.3\t15.4\t12.4\t19563\t119328\t0.391\t63640\tRomney\t63640\t0.043259384000000005\t63640.0\n12232\t-90.43326400000001\t38.643369\tWestwood village\tMO\tMissouri\tSt. Louis County\t277\t51.5\t76.0\t3.4\t82556\t710714\t0.562\t63131\tRomney\t63131\t0.0006781080000000001\t63131.0\n12233\t-90.488252\t38.555386999999996\tValley Park city\tMO\tMissouri\tSt. Louis County\t6565\t34.5\t42.4\t10.5\t29490\t159452\t0.562\t63088\tRomney\t63088\t0.016071408\t63088.0\n12234\t-90.346287\t38.714807\tSt. John city\tMO\tMissouri\tSt. Louis County\t6479\t38.3\t16.8\t13.0\t25067\t74472\t0.562\t63114\tRomney\t63114\t0.015860877\t63114.0\n12235\t-90.326267\t38.549791\tAffton CDP\tMO\tMissouri\tSt. Louis County\t19989\t42.2\t25.9\t7.1\t28802\t123212\t0.562\t63123\tRomney\t63123\t0.04893395\t63123.0\n12236\t-90.294949\t38.749089\tFerguson city\tMO\tMissouri\tSt. Louis County\t21337\t34.5\t20.3\t15.8\t21661\t80983\t0.562\t63135\tRomney\t63135\t0.052233914000000006\t63135.0\n12237\t-90.34898100000001\t38.701297\tSycamore Hills village\tMO\tMissouri\tSt. Louis County\t692\t36.7\t20.4\t9.8\t21929\t83333\t0.562\t63114\tRomney\t63114\t0.001694046\t63114.0\n12238\t-90.40905500000001\t38.613176\tHuntleigh city\tMO\tMissouri\tSt. Louis County\t307\t47.9\t66.4\t7.0\t69862\t562500\t0.562\t63131\tRomney\t63131\t0.0007515489999999999\t63131.0\n12239\t-90.294057\t38.674924\tWellston city\tMO\tMissouri\tSt. Louis County\t2270\t30.1\t8.7\t31.3\t11980\t34875\t0.562\t63133\tRomney\t63133\t0.00555706\t63133.0\n12240\t-90.588043\t38.589626\tEllisville city\tMO\tMissouri\tSt. Louis County\t9451\t40.5\t46.0\t8.4\t36555\t201696\t0.562\t63040\tRomney\t63040\t0.023136463\t63040.0\n12241\t-90.284037\t38.531607\tLemay CDP\tMO\tMissouri\tSt. Louis County\t16562\t42.1\t13.9\t12.3\t24194\t87315\t0.562\t63125\tRomney\t63125\t0.040544504\t63125.0\n12242\t-90.336117\t38.744229\tBerkeley city\tMO\tMissouri\tSt. Louis County\t9458\t32.3\t10.6\t24.4\t18576\t66013\t0.562\t63134\tRomney\t63134\t0.023153599999999996\t63134.0\n12243\t-90.336541\t38.524346\tGreen Park city\tMO\tMissouri\tSt. Louis County\t2622\t46.4\t20.7\t18.8\t23837\t128724\t0.562\t63123\tRomney\t63123\t0.006418771\t63123.0\n12244\t-90.389836\t38.79313\tHazelwood city\tMO\tMissouri\tSt. Louis County\t25168\t37.0\t24.8\t10.2\t28148\t96044\t0.562\t63042\tRomney\t63042\t0.06161237\t63042.0\n12245\t-90.243167\t38.745546000000004\tMoline Acres city\tMO\tMissouri\tSt. Louis County\t2567\t37.2\t11.6\t19.6\t21802\t74565\t0.562\t63136\tRomney\t63136\t0.006284129\t63136.0\n12246\t-90.227756\t38.752568\tBellefontaine Neighbors city\tMO\tMissouri\tSt. Louis County\t10812\t39.3\t16.3\t12.9\t25473\t79391\t0.562\t63137\tRomney\t63137\t0.026468251\t63137.0\n12247\t-90.312049\t38.712317999999996\tBellerive village\tMO\tMissouri\tSt. Louis County\t211\t34.8\t34.6\t6.0\t27394\t100000\t0.562\t63121\tRomney\t63121\t0.000516537\t63121.0\n12248\t-90.24862900000001\t38.757585999999996\tCastle Point CDP\tMO\tMissouri\tSt. Louis County\t4344\t28.6\t8.9\t24.6\t15129\t71546\t0.562\t63136\tRomney\t63136\t0.010634303000000001\t63136.0\n12249\t-90.300988\t38.707112\tNormandy city\tMO\tMissouri\tSt. Louis County\t4823\t33.9\t27.0\t17.3\t21918\t83642\t0.562\t63121\tRomney\t63121\t0.011806916\t63121.0\n12250\t-90.47914499999999\t38.631777\tTown and Country city\tMO\tMissouri\tSt. Louis County\t10430\t49.5\t69.1\t6.2\t70125\t563634\t0.562\t63141\tRomney\t63141\t0.025533097999999997\t63141.0\n12251\t-90.367312\t38.609019\tRock Hill city\tMO\tMissouri\tSt. Louis County\t4548\t41.0\t44.5\t10.9\t31604\t127482\t0.562\t63144\tRomney\t63144\t0.011133704\t63144.0\n12252\t-90.333118\t38.630891999999996\tRichmond Heights city\tMO\tMissouri\tSt. Louis County\t9131\t37.9\t60.2\t7.8\t43994\t171287\t0.562\t63117\tRomney\t63117\t0.022353089\t63117.0\n12253\t-90.35730500000001\t38.511749\tConcord CDP\tMO\tMissouri\tSt. Louis County\t16089\t48.6\t33.1\t7.0\t33192\t162706\t0.562\t63128\tRomney\t63128\t0.039386579\t63128.0\n12254\t-90.331591\t38.665708\tUniversity City\tMO\tMissouri\tSt. Louis County\t36307\t37.7\t48.8\t10.9\t34722\t128787\t0.562\t63130\tRomney\t63130\t0.088881131\t63130.0\n12255\t-90.28688199999999\t38.685631\tHillsdale village\tMO\tMissouri\tSt. Louis County\t1401\t33.1\t2.7\t32.5\t13454\t44186\t0.562\t63133\tRomney\t63133\t0.00342971\t63133.0\n12256\t-90.289658\t38.714535\tNorwood Court town\tMO\tMissouri\tSt. Louis County\t1004\t33.3\t26.3\t14.3\t25907\t137963\t0.562\t63121\tRomney\t63121\t0.002457836\t63121.0\n12257\t-90.26400600000001\t38.799254\tBlack Jack city\tMO\tMissouri\tSt. Louis County\t6506\t40.5\t36.2\t9.0\t28452\t123529\t0.562\t63033\tRomney\t63033\t0.015926974\t63033.0\n12258\t-90.305842\t38.72517\tCool Valley city\tMO\tMissouri\tSt. Louis County\t990\t35.0\t12.1\t15.1\t18548\t71327\t0.562\t63121\tRomney\t63121\t0.002423564\t63121.0\n12259\t-90.29748199999999\t38.71091\tPasadena Park village\tMO\tMissouri\tSt. Louis County\t443\t39.7\t39.7\t16.9\t25683\t107738\t0.562\t63121\tRomney\t63121\t0.001084483\t63121.0\n12260\t-90.290128\t38.697994\tBeverly Hills city\tMO\tMissouri\tSt. Louis County\t575\t41.6\t15.3\t13.1\t20794\t59184\t0.562\t63121\tRomney\t63121\t0.001407625\t63121.0\n12261\t-90.38489100000001\t38.576893\tOakland city\tMO\tMissouri\tSt. Louis County\t1492\t56.1\t42.0\t5.2\t33213\t200455\t0.562\t63126\tRomney\t63126\t0.0036524820000000003\t63126.0\n12262\t-90.40854300000001\t38.531009999999995\tSunset Hills city\tMO\tMissouri\tSt. Louis County\t8337\t52.2\t41.8\t5.3\t45437\t243978\t0.562\t63127\tRomney\t63127\t0.020409342\t63127.0\n12263\t-90.550022\t38.594972\tBallwin city\tMO\tMissouri\tSt. Louis County\t30498\t39.6\t50.9\t6.7\t36050\t198261\t0.562\t63011\tRomney\t63011\t0.074660444\t63011.0\n12264\t-90.387411\t38.726203000000005\tSt. Ann city\tMO\tMissouri\tSt. Louis County\t12940\t39.4\t14.3\t15.4\t25350\t81018\t0.562\t63074\tRomney\t63074\t0.031677689\t63074.0\n12265\t-90.579054\t38.658068\tChesterfield city\tMO\tMissouri\tSt. Louis County\t46710\t45.3\t63.8\t7.2\t51346\t304415\t0.562\t63017\tRomney\t63017\t0.11434813199999999\t63017.0\n12266\t-90.448809\t38.527713\tFenton city\tMO\tMissouri\tSt. Louis County\t4291\t43.3\t35.8\t6.9\t32773\t215313\t0.562\t63026\tRomney\t63026\t0.010504557\t63026.0\n12267\t-90.287498\t38.692060999999995\tVelda Village Hills village\tMO\tMissouri\tSt. Louis County\t1031\t42.5\t11.3\t17.8\t21597\t64359\t0.562\t63121\tRomney\t63121\t0.002523933\t63121.0\n12268\t-90.420314\t38.578737\tKirkwood city\tMO\tMissouri\tSt. Louis County\t26384\t43.6\t54.3\t7.7\t39350\t203633\t0.562\t63122\tRomney\t63122\t0.06458919099999999\t63122.0\n12269\t-90.368482\t38.715765999999995\tBreckenridge Hills city\tMO\tMissouri\tSt. Louis County\t4569\t34.5\t11.5\t18.1\t23527\t70269\t0.562\t63114\tRomney\t63114\t0.011185113\t63114.0\n12270\t-90.28554100000001\t38.543648\tBella Villa city\tMO\tMissouri\tSt. Louis County\t650\t43.7\t16.3\t13.8\t25042\t97059\t0.562\t63125\tRomney\t63125\t0.001591229\t63125.0\n12271\t-90.310519\t38.765606\tCalverton Park village\tMO\tMissouri\tSt. Louis County\t1250\t39.3\t28.1\t13.5\t28335\t87692\t0.562\t63135\tRomney\t63135\t0.003060055\t63135.0\n12272\t-90.313301\t38.537259999999996\tSt. George city\tMO\tMissouri\tSt. Louis County\t1205\t46.7\t23.0\t7.0\t31813\t105984\t0.562\t63123\tRomney\t63123\t0.002949893\t63123.0\n12273\t-90.197914\t38.757965000000006\tGlasgow Village CDP\tMO\tMissouri\tSt. Louis County\t5088\t32.3\t11.1\t17.6\t21652\t67968\t0.562\t63137\tRomney\t63137\t0.012455648\t63137.0\n12274\t-90.275594\t38.695285\tPine Lawn city\tMO\tMissouri\tSt. Louis County\t3868\t33.8\t7.5\t31.1\t13574\t55750\t0.562\t63120\tRomney\t63120\t0.009469034\t63120.0\n12275\t-90.431926\t38.621247\tCrystal Lake Park city\tMO\tMissouri\tSt. Louis County\t434\t49.4\t71.6\t10.3\t72459\t473077\t0.562\t63131\tRomney\t63131\t0.001062451\t63131.0\n12276\t-90.31796\t38.701749\tBel-Nor village\tMO\tMissouri\tSt. Louis County\t1511\t45.4\t47.3\t9.6\t30923\t122213\t0.562\t63121\tRomney\t63121\t0.003698994\t63121.0\n12277\t-90.328416\t38.712963\tBel-Ridge village\tMO\tMissouri\tSt. Louis County\t2819\t32.2\t11.4\t24.8\t19421\t67264\t0.562\t63134\tRomney\t63134\t0.006901036\t63134.0\n12278\t-90.330135\t38.64435\tClayton city\tMO\tMissouri\tSt. Louis County\t15858\t29.9\t72.4\t7.2\t48990\t544140\t0.562\t63105\tRomney\t63105\t0.038821081\t63105.0\n12279\t-90.324914\t38.738347\tKinloch city\tMO\tMissouri\tSt. Louis County\t425\t27.9\t5.2\t36.3\t15752\t55909\t0.562\t63140\tRomney\t63140\t0.001040419\t63140.0\n12280\t-90.648038\t38.501992\tEureka city\tMO\tMissouri\tSt. Louis County\t10186\t35.7\t42.5\t5.7\t41418\t219843\t0.562\t63025\tRomney\t63025\t0.024935776\t63025.0\n12281\t-90.354376\t38.586578\tWebster Groves city\tMO\tMissouri\tSt. Louis County\t22222\t43.0\t61.0\t7.0\t37373\t203230\t0.562\t63119\tRomney\t63119\t0.054400432\t63119.0\n12282\t-90.475251\t38.719182\tMaryland Heights city\tMO\tMissouri\tSt. Louis County\t25013\t36.6\t43.3\t8.0\t30483\t134955\t0.562\t63043\tRomney\t63043\t0.061232923\t63043.0\n12283\t-90.347589\t38.619385\tBrentwood city\tMO\tMissouri\tSt. Louis County\t7980\t37.5\t57.7\t7.1\t40636\t144825\t0.562\t63144\tRomney\t63144\t0.019535391000000003\t63144.0\n12284\t-90.323983\t38.612072\tMaplewood city\tMO\tMissouri\tSt. Louis County\t8645\t35.5\t31.2\t10.5\t25626\t89892\t0.562\t63143\tRomney\t63143\t0.02116334\t63143.0\n12285\t-90.368946\t38.696704\tOverland city\tMO\tMissouri\tSt. Louis County\t15807\t38.1\t17.3\t13.5\t23851\t78529\t0.562\t63114\tRomney\t63114\t0.038696231\t63114.0\n12286\t-90.210932\t38.744151\tRiverview village\tMO\tMissouri\tSt. Louis County\t3015\t35.0\t12.7\t13.4\t23003\t73149\t0.562\t63137\tRomney\t63137\t0.007380851999999999\t63137.0\n12287\t-90.27668299999999\t38.756271000000005\tDellwood city\tMO\tMissouri\tSt. Louis County\t5255\t34.8\t18.3\t14.6\t22034\t82145\t0.562\t63136\tRomney\t63136\t0.012864471\t63136.0\n12288\t-90.339504\t38.568245000000005\tMarlborough village\tMO\tMissouri\tSt. Louis County\t2188\t36.0\t34.8\t7.3\t29793\t125107\t0.562\t63123\tRomney\t63123\t0.00535632\t63123.0\n12289\t-90.381559\t38.637815\tLadue city\tMO\tMissouri\tSt. Louis County\t8180\t49.4\t75.0\t7.6\t85553\t701964\t0.562\t63124\tRomney\t63124\t0.020024998999999998\t63124.0\n12290\t-90.500998\t38.565737\tTwin Oaks village\tMO\tMissouri\tSt. Louis County\t343\t41.9\t52.5\t6.3\t35607\t153125\t0.562\t63088\tRomney\t63088\t0.000839679\t63088.0\n12291\t-90.34274599999999\t38.703007\tCharlack city\tMO\tMissouri\tSt. Louis County\t1397\t28.8\t17.5\t14.9\t21140\t75729\t0.562\t63114\tRomney\t63114\t0.003419917\t63114.0\n12292\t-90.353107\t38.550940000000004\tGrantwood Village town\tMO\tMissouri\tSt. Louis County\t832\t49.7\t41.2\t12.6\t39926\t209000\t0.562\t63126\tRomney\t63126\t0.002036773\t63126.0\n12293\t-90.319947\t38.447054\tOakville CDP\tMO\tMissouri\tSt. Louis County\t36613\t40.9\t36.7\t6.4\t33034\t188958\t0.562\t63129\tRomney\t63129\t0.089630233\t63129.0\n12294\t-90.308588\t38.553272\tWilbur Park village\tMO\tMissouri\tSt. Louis County\t446\t44.5\t26.7\t13.5\t28572\t121121\t0.562\t63123\tRomney\t63123\t0.001091828\t63123.0\n12295\t-90.448031\t38.59742\tDes Peres city\tMO\tMissouri\tSt. Louis County\t8142\t45.5\t69.7\t6.1\t51692\t332885\t0.562\t63131\tRomney\t63131\t0.019931973999999998\t63131.0\n12296\t-90.418858\t38.630092\tFrontenac city\tMO\tMissouri\tSt. Louis County\t3318\t48.8\t69.8\t9.9\t65608\t464557\t0.562\t63131\tRomney\t63131\t0.00812261\t63131.0\n12297\t-90.338269\t38.539853\tLakeshire city\tMO\tMissouri\tSt. Louis County\t1350\t40.3\t29.8\t7.9\t34077\t167250\t0.562\t63123\tRomney\t63123\t0.0033048590000000003\t63123.0\n12298\t-90.443391\t38.662043\tCreve Coeur city\tMO\tMissouri\tSt. Louis County\t16335\t46.0\t66.5\t7.7\t53543\t327431\t0.562\t63141\tRomney\t63141\t0.039988798\t63141.0\n12299\t-90.292141\t38.708319\tPasadena Hills city\tMO\tMissouri\tSt. Louis County\t1092\t40.7\t33.8\t11.4\t27158\t129054\t0.562\t63121\tRomney\t63121\t0.0026732640000000003\t63121.0\n12300\t-90.340065\t38.689161\tVinita Park city\tMO\tMissouri\tSt. Louis County\t1841\t33.0\t20.7\t15.5\t18909\t70615\t0.562\t63114\tRomney\t63114\t0.004506849\t63114.0\n12301\t-90.31497399999999\t38.501806\tMehlville CDP\tMO\tMissouri\tSt. Louis County\t28131\t41.2\t26.7\t9.0\t30181\t135069\t0.562\t63129\tRomney\t63129\t0.06886592400000001\t63129.0\n12302\t-90.453113\t38.745012\tChamp village\tMO\tMissouri\tSt. Louis County\t11\t47.5\t33.3\t0.0\t26848\t125000\t0.562\t63043\tRomney\t63043\t2.6899999999999997e-05\t63043.0\n12303\t-90.328079\t38.58659\tShrewsbury city\tMO\tMissouri\tSt. Louis County\t6385\t45.2\t44.5\t6.2\t33369\t138326\t0.562\t63119\tRomney\t63119\t0.015630761\t63119.0\n12304\t-90.296224\t38.700843\tGlen Echo Park village\tMO\tMissouri\tSt. Louis County\t153\t41.4\t23.5\t27.3\t21263\t81875\t0.562\t63121\tRomney\t63121\t0.000374551\t63121.0\n12305\t-90.455744\t38.620528\tCountry Life Acres village\tMO\tMissouri\tSt. Louis County\t77\t48.3\t78.6\t8.6\t76386\t531250\t0.562\t63131\tRomney\t63131\t0.000188499\t63131.0\n12306\t-90.329696\t38.799495\tFlorissant city\tMO\tMissouri\tSt. Louis County\t48086\t39.8\t21.4\t10.2\t26967\t94577\t0.562\t63031\tRomney\t63031\t0.117716641\t63031.0\n12307\t-90.27489\t38.720890000000004\tCountry Club Hills city\tMO\tMissouri\tSt. Louis County\t1358\t28.0\t10.0\t21.4\t16390\t56531\t0.562\t63136\tRomney\t63136\t0.003324444\t63136.0\n12308\t-90.324905\t38.685544\tHanley Hills village\tMO\tMissouri\tSt. Louis County\t2018\t36.8\t14.8\t16.5\t18897\t59641\t0.562\t63130\tRomney\t63130\t0.004940153\t63130.0\n12309\t-90.526089\t38.589717\tWinchester city\tMO\tMissouri\tSt. Louis County\t1542\t37.5\t29.9\t6.6\t26073\t121541\t0.562\t63021\tRomney\t63021\t0.003774884\t63021.0\n12310\t-90.378211\t38.556911\tCrestwood city\tMO\tMissouri\tSt. Louis County\t11342\t47.0\t39.8\t8.0\t34040\t156949\t0.562\t63126\tRomney\t63126\t0.027765714\t63126.0\n12311\t-90.42788\t38.767532\tBridgeton city\tMO\tMissouri\tSt. Louis County\t14165\t43.9\t28.8\t9.7\t29566\t133868\t0.562\t63044\tRomney\t63044\t0.034676542000000005\t63044.0\n12312\t-90.207927\t38.78835\tSpanish Lake CDP\tMO\tMissouri\tSt. Louis County\t21057\t31.5\t19.8\t14.7\t22853\t99911\t0.562\t63138\tRomney\t63138\t0.051548461\t63138.0\n12313\t-90.375918\t38.524204\tSappington CDP\tMO\tMissouri\tSt. Louis County\t6940\t50.5\t32.5\t9.8\t34880\t168123\t0.562\t63128\tRomney\t63128\t0.016989425\t63128.0\n12314\t-90.594541\t38.625575\tClarkson Valley city\tMO\tMissouri\tSt. Louis County\t2787\t43.6\t67.0\t7.7\t68735\t430065\t0.562\t63005\tRomney\t63005\t0.006822698\t63005.0\n12315\t-90.31633599999999\t38.580984\tMackenzie village\tMO\tMissouri\tSt. Louis County\t128\t39.0\t45.6\t4.3\t28051\t133929\t0.562\t631HH\tRomney\t631HH\t0.00031335\t0.0\n12316\t-90.6706\t38.580013\tWildwood city\tMO\tMissouri\tSt. Louis County\t34603\t37.1\t58.6\t6.8\t51315\t308790\t0.562\t63038\tRomney\t63038\t0.084709664\t63038.0\n12317\t-90.329813\t38.685192\tVinita Terrace village\tMO\tMissouri\tSt. Louis County\t280\t36.1\t19.0\t17.1\t20095\t68000\t0.562\t63130\tRomney\t63130\t0.000685452\t63130.0\n12318\t-90.382485\t38.593563\tGlendale city\tMO\tMissouri\tSt. Louis County\t5535\t41.8\t70.5\t6.2\t42018\t252232\t0.562\t63122\tRomney\t63122\t0.013549923\t63122.0\n12319\t-90.293423\t38.69403\tVelda City\tMO\tMissouri\tSt. Louis County\t1523\t39.5\t10.2\t25.6\t17819\t58913\t0.562\t63121\tRomney\t63121\t0.003728371\t63121.0\n12320\t-90.28285\t38.692625\tUplands Park village\tMO\tMissouri\tSt. Louis County\t427\t42.5\t13.1\t18.3\t19181\t65968\t0.562\t63121\tRomney\t63121\t0.001045315\t63121.0\n12321\t-90.391414\t38.606875\tWarson Woods city\tMO\tMissouri\tSt. Louis County\t1891\t45.6\t77.6\t4.7\t69785\t373041\t0.562\t63122\tRomney\t63122\t0.004629251\t63122.0\n12322\t-90.28235600000001\t38.703522\tNorthwoods city\tMO\tMissouri\tSt. Louis County\t4383\t42.7\t17.1\t9.9\t22617\t70075\t0.562\t63121\tRomney\t63121\t0.010729777\t63121.0\n12323\t-90.506461\t38.583139\tManchester city\tMO\tMissouri\tSt. Louis County\t18214\t39.2\t55.4\t8.1\t32032\t182520\t0.562\t63021\tRomney\t63021\t0.044588672\t63021.0\n12324\t-90.359995\t38.728796\tWoodson Terrace city\tMO\tMissouri\tSt. Louis County\t3923\t35.5\t11.1\t16.5\t23318\t72882\t0.562\t63134\tRomney\t63134\t0.009603676\t63134.0\n12325\t-90.308171\t38.680147999999996\tPagedale city\tMO\tMissouri\tSt. Louis County\t3356\t34.8\t9.8\t27.6\t15672\t51259\t0.562\t63133\tRomney\t63133\t0.008215635\t63133.0\n12326\t-90.378436\t38.672478000000005\tOlivette city\tMO\tMissouri\tSt. Louis County\t7095\t44.4\t58.2\t7.0\t41377\t213785\t0.562\t63132\tRomney\t63132\t0.017368872\t63132.0\n12327\t-90.365759\t38.735023\tEdmundson city\tMO\tMissouri\tSt. Louis County\t798\t32.9\t10.1\t13.9\t23688\t76842\t0.562\t63074\tRomney\t63074\t0.001953539\t63074.0\n12328\t-90.264824\t38.717362\tFlordell Hills city\tMO\tMissouri\tSt. Louis County\t916\t35.4\t8.9\t20.0\t21077\t56667\t0.562\t63136\tRomney\t63136\t0.002242408\t63136.0\n12329\t-90.264342\t38.723053\tJennings city\tMO\tMissouri\tSt. Louis County\t15255\t32.7\t11.5\t22.9\t19742\t65458\t0.562\t63136\tRomney\t63136\t0.03734491\t63136.0\n12330\t-90.312349\t38.693733\tGreendale city\tMO\tMissouri\tSt. Louis County\t693\t27.3\t23.4\t20.9\t17647\t84091\t0.562\t63133\tRomney\t63133\t0.001696494\t63133.0\n12331\t-93.48439499999999\t39.105185\tBlackburn city\tMO\tMissouri\tSaline County\t259\t42.2\t12.6\t12.1\t18040\t62000\t0.4161\t65321\tRomney\t65321\t0.000634043\t65321.0\n12332\t-93.22569\t39.322701\tMiami city\tMO\tMissouri\tSaline County\t161\t42.5\t17.1\t5.2\t19518\t100000\t0.4161\t65344\tRomney\t65344\t0.000394135\t65344.0\n12333\t-93.06495699999999\t39.222676\tSlater city\tMO\tMissouri\tSaline County\t1930\t41.6\t10.7\t11.4\t17810\t46864\t0.4161\t65349\tRomney\t65349\t0.004724725\t65349.0\n12334\t-92.947248\t39.07\tArrow Rock town\tMO\tMissouri\tSaline County\t73\t46.3\t14.8\t2.7\t22387\t121875\t0.4161\t65320\tRomney\t65320\t0.000178707\t65320.0\n12335\t-93.394501\t39.125378999999995\tMount Leonard town\tMO\tMissouri\tSaline County\t113\t42.5\t12.7\t12.0\t18091\t60000\t0.4161\t65339\tRomney\t65339\t0.000276629\t65339.0\n12336\t-93.030885\t38.994526\tNelson city\tMO\tMissouri\tSaline County\t196\t45.3\t9.9\t3.4\t20010\t77500\t0.4161\t65347\tRomney\t65347\t0.00047981699999999995\t65347.0\n12337\t-93.363463\t39.194043\tMalta Bend town\tMO\tMissouri\tSaline County\t228\t43.1\t16.9\t8.6\t19584\t106250\t0.4161\t65339\tRomney\t65339\t0.000558154\t65339.0\n12338\t-93.49346700000001\t38.976671\tEmma city\tMO\tMissouri\tSaline County\t236\t43.8\t13.0\t5.4\t21013\t108333\t0.4161\t65327\tRomney\t65327\t0.0005777380000000001\t65327.0\n12339\t-93.004163\t39.232756\tGilliam town\tMO\tMissouri\tSaline County\t212\t43.9\t10.1\t5.8\t16961\t70000\t0.4161\t65330\tRomney\t65330\t0.000518985\t65330.0\n12340\t-93.415132\t38.964268\tSweet Springs city\tMO\tMissouri\tSaline County\t1567\t42.5\t10.8\t9.5\t16368\t69773\t0.4161\t65351\tRomney\t65351\t0.003836085\t65351.0\n12341\t-93.442758\t39.205040999999994\tGrand Pass village\tMO\tMissouri\tSaline County\t48\t43.8\t17.1\t8.3\t19789\t106250\t0.4161\t65339\tRomney\t65339\t0.00011750600000000001\t65339.0\n12342\t-93.201327\t39.114751\tMarshall city\tMO\tMissouri\tSaline County\t12124\t35.8\t19.2\t11.2\t21535\t94896\t0.4161\t65340\tRomney\t65340\t0.029680085\t65340.0\n12343\t-92.53139\t40.52393\tLancaster city\tMO\tMissouri\tSchuyler County\t701\t39.5\t20.4\t10.3\t18169\t68148\t0.3595\t63548\tRomney\t63548\t0.001716079\t63548.0\n12344\t-92.368844\t40.487295\tDowning city\tMO\tMissouri\tSchuyler County\t375\t41.1\t7.9\t12.2\t16650\t81667\t0.3595\t63536\tRomney\t63536\t0.000918016\t63536.0\n12345\t-92.56627900000001\t40.412534\tQueen City\tMO\tMissouri\tSchuyler County\t594\t47.8\t9.0\t15.1\t15631\t47800\t0.3595\t63561\tRomney\t63561\t0.0014541379999999998\t63561.0\n12346\t-92.565441\t40.351605\tGreentop city\tMO\tMissouri\tSchuyler County\t518\t45.2\t20.9\t8.9\t18519\t85500\t0.3595\t63546\tRomney\t63546\t0.001268087\t63546.0\n12347\t-92.576673\t40.524225\tGlenwood village\tMO\tMissouri\tSchuyler County\t196\t44.3\t13.0\t4.7\t18354\t126389\t0.3595\t63541\tRomney\t63541\t0.00047981699999999995\t63541.0\n12348\t-92.015617\t40.463169\tArbela town\tMO\tMissouri\tScotland County\t39\t40.0\t11.5\t12.5\t15224\t55000\t0.3321\t63432\tRomney\t63432\t9.549999999999999e-05\t63432.0\n12349\t-92.024585\t40.359759999999994\tSouth Gorin town\tMO\tMissouri\tScotland County\t138\t40.0\t11.7\t10.5\t15227\t48333\t0.3321\t63543\tRomney\t63543\t0.00033783\t63543.0\n12350\t-91.973635\t40.466953000000004\tGranger village\tMO\tMissouri\tScotland County\t43\t42.5\t10.3\t11.8\t15191\t45000\t0.3321\t63432\tRomney\t63432\t0.000105266\t63432.0\n12351\t-92.170396\t40.461352000000005\tMemphis city\tMO\tMissouri\tScotland County\t2060\t45.4\t12.5\t10.5\t18568\t63507\t0.3321\t63555\tRomney\t63555\t0.005042970999999999\t63555.0\n12352\t-92.087533\t40.313953999999995\tRutledge town\tMO\tMissouri\tScotland County\t101\t33.6\t8.5\t9.1\t12005\t67500\t0.3321\t63563\tRomney\t63563\t0.000247252\t63563.0\n12353\t-89.661728\t37.18108\tChaffee city\tMO\tMissouri\tScott County\t3001\t37.0\t14.0\t11.7\t18266\t73533\t0.3013\t63740\tRomney\t63740\t0.00734658\t63740.0\n12354\t-89.600279\t37.011672\tHaywood City village\tMO\tMissouri\tScott County\t246\t40.3\t11.7\t10.6\t14781\t50000\t0.3013\t63767\tRomney\t63767\t0.000602219\t63767.0\n12355\t-89.612946\t37.043211\tMorley city\tMO\tMissouri\tScott County\t824\t39.0\t11.4\t9.8\t17264\t67500\t0.3013\t63767\tRomney\t63767\t0.002017188\t63767.0\n12356\t-89.432348\t36.959342\tDiehlstadt village\tMO\tMissouri\tScott County\t181\t39.8\t6.6\t9.0\t16873\t75000\t0.3013\t63823\tRomney\t63823\t0.000443096\t63823.0\n12357\t-89.516894\t36.895348\tMiner city\tMO\tMissouri\tScott County\t1003\t40.0\t7.3\t8.9\t16728\t81515\t0.3013\t63801\tRomney\t63801\t0.0024553879999999998\t63801.0\n12358\t-89.56309499999999\t37.098712\tBenton city\tMO\tMissouri\tScott County\t781\t39.4\t17.7\t7.8\t21043\t119758\t0.3013\t63736\tRomney\t63736\t0.0019119220000000001\t63736.0\n12359\t-89.550512\t37.192621\tKelso village\tMO\tMissouri\tScott County\t631\t41.7\t19.1\t3.9\t22207\t139362\t0.3013\t63758\tRomney\t63758\t0.001544716\t63758.0\n12360\t-89.653424\t37.085446999999995\tOran city\tMO\tMissouri\tScott County\t1314\t36.5\t12.0\t10.1\t17148\t71949\t0.3013\t63771\tRomney\t63771\t0.00321673\t63771.0\n12361\t-89.686501\t36.991124\tVanduser village\tMO\tMissouri\tScott County\t223\t40.7\t10.8\t10.5\t14806\t49500\t0.3013\t63784\tRomney\t63784\t0.000545914\t63784.0\n12362\t-89.589202\t36.893284\tSikeston city\tMO\tMissouri\tScott County\t16850\t38.0\t17.2\t12.1\t19910\t106291\t0.3013\t63801\tRomney\t63801\t0.04124954\t63801.0\n12363\t-89.53394499999999\t37.243709\tScott City\tMO\tMissouri\tScott County\t4515\t37.9\t8.9\t12.6\t19139\t87202\t0.3013\t63780\tRomney\t63780\t0.011052918\t63780.0\n12364\t-89.554897\t37.093716\tLambert village\tMO\tMissouri\tScott County\t52\t38.8\t18.4\t8.3\t21301\t118750\t0.3013\t63736\tRomney\t63736\t0.000127298\t63736.0\n12365\t-89.52635699999999\t37.004822999999995\tBlodgett village\tMO\tMissouri\tScott County\t295\t40.1\t7.0\t8.3\t16841\t75000\t0.3013\t63824\tRomney\t63824\t0.000722173\t63824.0\n12366\t-89.447102\t37.158421000000004\tCommerce village\tMO\tMissouri\tScott County\t126\t34.3\t12.2\t8.8\t17325\t97500\t0.3013\t63742\tRomney\t63742\t0.000308454\t63742.0\n12367\t-91.327175\t37.004129999999996\tWinona city\tMO\tMissouri\tShannon County\t1328\t36.2\t5.5\t12.0\t11088\t66163\t0.3527\t65588\tRomney\t65588\t0.0032510020000000002\t65588.0\n12368\t-91.358694\t37.151009\tEminence city\tMO\tMissouri\tShannon County\t543\t46.6\t14.9\t12.5\t14288\t76000\t0.3527\t65466\tRomney\t65466\t0.0013292879999999999\t65466.0\n12369\t-91.491287\t36.996765\tBirch Tree city\tMO\tMissouri\tShannon County\t672\t41.8\t3.7\t9.7\t10767\t42273\t0.3527\t65438\tRomney\t65438\t0.001645086\t65438.0\n12370\t-92.022697\t39.877614\tBethel village\tMO\tMissouri\tShelby County\t134\t42.5\t13.0\t7.5\t16247\t105000\t0.2989\t63469\tRomney\t63469\t0.000328038\t63469.0\n12371\t-92.260133\t39.743155\tClarence city\tMO\tMissouri\tShelby County\t854\t43.6\t11.6\t10.5\t16970\t73158\t0.2989\t63437\tRomney\t63437\t0.00209063\t63437.0\n12372\t-92.182045\t39.894439\tLeonard village\tMO\tMissouri\tShelby County\t62\t40.5\t9.5\t10.7\t16681\t70000\t0.2989\t63451\tRomney\t63451\t0.000151779\t63451.0\n12373\t-92.040409\t39.807159999999996\tShelbyville city\tMO\tMissouri\tShelby County\t656\t40.1\t13.0\t11.6\t18207\t63696\t0.2989\t63469\tRomney\t63469\t0.001605917\t63469.0\n12374\t-91.858688\t39.667915\tHunnewell city\tMO\tMissouri\tShelby County\t209\t43.1\t12.8\t9.7\t19352\t98333\t0.2989\t63443\tRomney\t63443\t0.000511641\t63443.0\n12375\t-92.039523\t39.693061\tShelbina city\tMO\tMissouri\tShelby County\t1744\t44.2\t13.9\t9.8\t17844\t71250\t0.2989\t63468\tRomney\t63468\t0.004269389\t63468.0\n12376\t-89.96251099999999\t36.792389\tDexter city\tMO\tMissouri\tStoddard County\t7271\t41.1\t14.1\t14.3\t18392\t85645\t0.2451\t63841\tRomney\t63841\t0.017799726999999998\t63841.0\n12377\t-89.819576\t37.023723\tBell City\tMO\tMissouri\tStoddard County\t433\t40.1\t9.6\t9.5\t16810\t49063\t0.2451\t63735\tRomney\t63735\t0.0010600030000000001\t63735.0\n12378\t-89.931223\t36.887865000000005\tBloomfield city\tMO\tMissouri\tStoddard County\t2009\t41.9\t11.6\t10.5\t14490\t63333\t0.2451\t63825\tRomney\t63825\t0.00491812\t63825.0\n12379\t-89.830164\t36.79098\tPenermon village\tMO\tMissouri\tStoddard County\t70\t40.4\t6.3\t7.1\t14837\t53750\t0.2451\t63846\tRomney\t63846\t0.000171363\t63846.0\n12380\t-89.97035\t36.671690000000005\tBernie city\tMO\tMissouri\tStoddard County\t1881\t40.7\t11.3\t11.7\t17097\t61892\t0.2451\t63822\tRomney\t63822\t0.004604771\t63822.0\n12381\t-89.914674\t37.103642\tAdvance city\tMO\tMissouri\tStoddard County\t1237\t46.1\t14.7\t13.3\t16322\t83125\t0.2451\t63730\tRomney\t63730\t0.00302823\t63730.0\n12382\t-90.09145799999999\t36.789674\tDudley city\tMO\tMissouri\tStoddard County\t278\t38.8\t5.7\t14.2\t15630\t87500\t0.2451\t63936\tRomney\t63936\t0.000680556\t63936.0\n12383\t-89.761573\t36.773548\tBaker village\tMO\tMissouri\tStoddard County\t5\t0.0\t0.0\t0.0\t15645\t0\t0.2451\t63850\tRomney\t63850\t1.22e-05\t63850.0\n12384\t-90.159093\t36.950983\tPuxico city\tMO\tMissouri\tStoddard County\t1171\t33.6\t15.7\t20.2\t16042\t68000\t0.2451\t63960\tRomney\t63960\t0.002866659\t63960.0\n12385\t-89.862938\t36.811632\tEssex city\tMO\tMissouri\tStoddard County\t490\t39.1\t6.0\t6.2\t14806\t54200\t0.2451\t63846\tRomney\t63846\t0.001199542\t63846.0\n12386\t-93.572592\t36.901994\tCrane city\tMO\tMissouri\tStone County\t1524\t38.4\t13.6\t11.5\t15396\t83448\t0.2454\t65633\tRomney\t65633\t0.0037308190000000002\t65633.0\n12387\t-93.471019\t36.804909\tGalena city\tMO\tMissouri\tStone County\t480\t43.9\t12.2\t14.4\t18688\t92222\t0.2454\t65656\tRomney\t65656\t0.001175061\t65656.0\n12388\t-93.503603\t36.787012\tMcCord Bend village\tMO\tMissouri\tStone County\t300\t43.6\t12.9\t16.4\t17238\t85000\t0.2454\t65656\tRomney\t65656\t0.0007344130000000001\t65656.0\n12389\t-93.382796\t36.741753\tReeds Spring city\tMO\tMissouri\tStone County\t591\t40.2\t12.0\t13.8\t16954\t91667\t0.2454\t65737\tRomney\t65737\t0.001446794\t65737.0\n12390\t-93.366377\t36.707936\tBranson West city\tMO\tMissouri\tStone County\t498\t42.0\t16.6\t18.9\t20665\t98333\t0.2454\t65737\tRomney\t65737\t0.001219126\t65737.0\n12391\t-93.499774\t36.930981\tHurley city\tMO\tMissouri\tStone County\t166\t39.1\t5.4\t6.1\t14434\t106250\t0.2454\t65675\tRomney\t65675\t0.000406375\t65675.0\n12392\t-93.396362\t36.502567\tBlue Eye town\tMO\tMissouri\tStone County\t136\t56.3\t18.3\t15.9\t19565\t132500\t0.2454\t65611\tRomney\t65611\t0.000332934\t65611.0\n12393\t-93.397322\t36.593208000000004\tConey Island village\tMO\tMissouri\tStone County\t102\t57.8\t21.7\t15.1\t29849\t193750\t0.2454\t65686\tRomney\t65686\t0.0002497\t65686.0\n12394\t-93.42473100000001\t36.643238000000004\tKimberling City\tMO\tMissouri\tStone County\t2517\t57.6\t22.7\t13.4\t24055\t146632\t0.2454\t65686\tRomney\t65686\t0.006161727\t65686.0\n12395\t-93.34430400000001\t36.642612\tIndian Point village\tMO\tMissouri\tStone County\t851\t50.0\t26.0\t16.6\t23804\t173333\t0.2454\t65737\tRomney\t65737\t0.002083285\t65737.0\n12396\t-93.333578\t40.376204\tNewtown town\tMO\tMissouri\tSullivan County\t203\t39.0\t5.9\t9.9\t14420\t44091\t0.3499\t64667\tRomney\t64667\t0.0004969530000000001\t64667.0\n12397\t-93.083744\t40.358357\tPollock village\tMO\tMissouri\tSullivan County\t115\t44.3\t12.3\t7.7\t17730\t103125\t0.3499\t63560\tRomney\t63560\t0.000281525\t63560.0\n12398\t-92.956303\t40.263847999999996\tGreen City\tMO\tMissouri\tSullivan County\t640\t46.3\t16.0\t9.9\t15877\t69000\t0.3499\t63545\tRomney\t63545\t0.001566748\t63545.0\n12399\t-92.878431\t40.260667\tGreencastle city\tMO\tMissouri\tSullivan County\t315\t41.1\t6.5\t6.7\t13688\t60000\t0.3499\t63544\tRomney\t63544\t0.0007711339999999999\t63544.0\n12400\t-93.35040500000001\t40.306129\tHarris town\tMO\tMissouri\tSullivan County\t102\t40.0\t5.8\t9.8\t14424\t44167\t0.3499\t64645\tRomney\t64645\t0.0002497\t64645.0\n12401\t-93.319419\t40.125261\tHumphreys village\tMO\tMissouri\tSullivan County\t158\t40.6\t7.4\t11.1\t15268\t47857\t0.3499\t64646\tRomney\t64646\t0.000386791\t64646.0\n12402\t-93.349915\t40.197219\tOsgood village\tMO\tMissouri\tSullivan County\t50\t39.2\t6.1\t12.0\t14288\t35000\t0.3499\t64641\tRomney\t64641\t0.000122402\t64641.0\n12403\t-93.124424\t40.203196000000005\tMilan city\tMO\tMissouri\tSullivan County\t1820\t36.2\t9.3\t9.7\t14647\t61744\t0.3499\t63556\tRomney\t63556\t0.00445544\t63556.0\n12404\t-93.300069\t36.605126\tTable Rock village\tMO\tMissouri\tTaney County\t231\t44.2\t23.1\t12.0\t27319\t187500\t0.253\t65616\tRomney\t65616\t0.000565498\t65616.0\n12405\t-93.033928\t36.739169\tTaneyville village\tMO\tMissouri\tTaney County\t429\t34.1\t6.9\t7.0\t14265\t82778\t0.253\t65759\tRomney\t65759\t0.0010502110000000001\t65759.0\n12406\t-93.16966500000001\t36.71692\tMerriam Woods village\tMO\tMissouri\tTaney County\t1822\t43.0\t10.3\t12.4\t14741\t64412\t0.253\t65740\tRomney\t65740\t0.004460336\t65740.0\n12407\t-93.20323\t36.715044\tBull Creek village\tMO\tMissouri\tTaney County\t332\t44.7\t13.9\t11.7\t16149\t75833\t0.253\t65740\tRomney\t65740\t0.000812751\t65740.0\n12408\t-93.217872\t36.61939\tHollister city\tMO\tMissouri\tTaney County\t4361\t33.2\t16.5\t9.5\t19127\t96557\t0.253\t65672\tRomney\t65672\t0.01067592\t65672.0\n12409\t-93.160169\t36.702236\tRockaway Beach city\tMO\tMissouri\tTaney County\t738\t44.4\t13.5\t11.6\t15976\t73750\t0.253\t65740\tRomney\t65740\t0.001806656\t65740.0\n12410\t-93.111508\t36.692037\tForsyth city\tMO\tMissouri\tTaney County\t1948\t48.0\t18.3\t7.7\t21102\t123465\t0.253\t65653\tRomney\t65653\t0.00476879\t65653.0\n12411\t-93.259968\t36.678306\tBranson city\tMO\tMissouri\tTaney County\t7417\t44.1\t22.2\t10.2\t24948\t146830\t0.253\t65616\tRomney\t65616\t0.018157142\t65616.0\n12412\t-92.103718\t37.12713\tCabool city\tMO\tMissouri\tTexas County\t2826\t39.0\t15.8\t11.0\t14927\t69583\t0.2667\t65689\tRomney\t65689\t0.006918171999999999\t65689.0\n12413\t-91.65028199999999\t37.178565\tSummersville city\tMO\tMissouri\tTexas County\t621\t37.5\t13.6\t7.9\t12841\t70833\t0.2667\t65571\tRomney\t65571\t0.001520235\t65571.0\n12414\t-91.96073299999999\t37.321637\tHouston city\tMO\tMissouri\tTexas County\t2209\t45.6\t16.1\t8.5\t16910\t92073\t0.2667\t65483\tRomney\t65483\t0.005407729\t65483.0\n12415\t-91.85946700000001\t37.497665999999995\tLicking city\tMO\tMissouri\tTexas County\t1633\t41.4\t9.0\t12.6\t13871\t75870\t0.2667\t65542\tRomney\t65542\t0.003997656\t65542.0\n12416\t-91.83633499999999\t37.339862\tRaymondville town\tMO\tMissouri\tTexas County\t424\t43.2\t8.7\t11.3\t13867\t79375\t0.2667\t65555\tRomney\t65555\t0.0010379710000000002\t65555.0\n12417\t-94.11667800000001\t38.019157\tSchell City\tMO\tMissouri\tVernon County\t271\t44.3\t9.2\t8.8\t12305\t53750\t0.3028\t64783\tRomney\t64783\t0.00066342\t64783.0\n12418\t-94.46814499999999\t37.69415\tBronaugh city\tMO\tMissouri\tVernon County\t235\t42.5\t10.8\t8.9\t19314\t78333\t0.3028\t64728\tRomney\t64728\t0.00057529\t64728.0\n12419\t-94.442932\t37.996466999999996\tMetz town\tMO\tMissouri\tVernon County\t65\t38.1\t19.5\t19.0\t14940\t80000\t0.3028\t64751\tRomney\t64751\t0.000159123\t64751.0\n12420\t-94.350495\t37.846894\tNevada city\tMO\tMissouri\tVernon County\t8496\t36.9\t18.1\t13.9\t18636\t82809\t0.3028\t64772\tRomney\t64772\t0.020798581\t64772.0\n12421\t-94.304938\t37.755165999999996\tMilo village\tMO\tMissouri\tVernon County\t83\t40.0\t14.3\t9.1\t17497\t62500\t0.3028\t64767\tRomney\t64767\t0.00020318799999999998\t64767.0\n12422\t-94.557313\t37.910364\tRichards town\tMO\tMissouri\tVernon County\t92\t37.9\t18.6\t17.2\t14964\t90000\t0.3028\t64778\tRomney\t64778\t0.00022522\t64778.0\n12423\t-94.507625\t37.838632000000004\tDeerfield village\tMO\tMissouri\tVernon County\t72\t43.8\t14.0\t7.7\t18191\t109375\t0.3028\t64741\tRomney\t64741\t0.000176259\t64741.0\n12424\t-94.451025\t37.764645\tMoundville town\tMO\tMissouri\tVernon County\t99\t42.5\t10.1\t9.3\t19276\t77500\t0.3028\t64771\tRomney\t64771\t0.000242356\t64771.0\n12425\t-94.153874\t37.956661\tHarwood village\tMO\tMissouri\tVernon County\t85\t44.2\t9.7\t9.4\t12341\t52500\t0.3028\t64750\tRomney\t64750\t0.000208084\t64750.0\n12426\t-94.564098\t37.974302\tStotesbury town\tMO\tMissouri\tVernon County\t42\t38.8\t17.9\t15.4\t14853\t95000\t0.3028\t64778\tRomney\t64778\t0.00010281799999999999\t64778.0\n12427\t-94.230591\t37.898834\tWalker city\tMO\tMissouri\tVernon County\t280\t35.7\t11.1\t4.5\t15529\t81000\t0.3028\t64790\tRomney\t64790\t0.000685452\t64790.0\n12428\t-94.295855\t37.658215000000006\tSheldon city\tMO\tMissouri\tVernon County\t523\t40.0\t14.1\t8.3\t17493\t69643\t0.3028\t64784\tRomney\t64784\t0.001280327\t64784.0\n12429\t-91.152564\t38.818042\tWarrenton city\tMO\tMissouri\tWarren County\t6472\t37.2\t11.6\t12.6\t20230\t134082\t0.3556\t63383\tRomney\t63383\t0.01584374\t63383.0\n12430\t-91.123953\t38.811696999999995\tTruesdale city\tMO\tMissouri\tWarren County\t401\t37.3\t8.8\t24.5\t19292\t116667\t0.3556\t63383\tRomney\t63383\t0.000981666\t63383.0\n12431\t-91.056741\t38.630944\tMarthasville city\tMO\tMissouri\tWarren County\t992\t36.6\t13.9\t8.2\t21793\t135648\t0.3556\t63357\tRomney\t63357\t0.00242846\t63357.0\n12432\t-91.05420699999999\t38.764912\tInnsbrook village\tMO\tMissouri\tWarren County\t906\t44.9\t20.3\t11.6\t26069\t172500\t0.3556\t63390\tRomney\t63390\t0.002217928\t63390.0\n12433\t-91.02624399999999\t38.828516\tWright City\tMO\tMissouri\tWarren County\t1804\t35.3\t10.8\t11.5\t20138\t115257\t0.3556\t63390\tRomney\t63390\t0.004416270999999999\t63390.0\n12434\t-90.771912\t37.764119\tCaledonia village\tMO\tMissouri\tWashington County\t169\t40.8\t12.5\t17.4\t15910\t82500\t0.39299999999999996\t63631\tRomney\t63631\t0.000413719\t63631.0\n12435\t-90.671715\t37.835449\tIrondale city\tMO\tMissouri\tWashington County\t452\t36.7\t8.1\t13.9\t15910\t53846\t0.39299999999999996\t63648\tRomney\t63648\t0.001106516\t63648.0\n12436\t-90.774761\t37.93418\tPotosi city\tMO\tMissouri\tWashington County\t2697\t37.0\t16.7\t14.9\t15585\t90610\t0.39299999999999996\t63660\tRomney\t63660\t0.006602375\t63660.0\n12437\t-90.724746\t37.94572\tMineral Point town\tMO\tMissouri\tWashington County\t374\t34.7\t2.2\t28.8\t13387\t68750\t0.39299999999999996\t63660\tRomney\t63660\t0.0009155680000000001\t63660.0\n12438\t-90.697525\t37.148396000000005\tPiedmont city\tMO\tMissouri\tWayne County\t1889\t44.9\t7.7\t11.6\t15412\t68986\t0.317\t63957\tRomney\t63957\t0.004624355\t63957.0\n12439\t-90.547872\t36.974016999999996\tWilliamsville city\tMO\tMissouri\tWayne County\t357\t44.6\t8.5\t14.7\t18478\t53889\t0.317\t63967\tRomney\t63967\t0.000873952\t63967.0\n12440\t-90.681062\t37.06505\tMill Spring village\tMO\tMissouri\tWayne County\t207\t38.6\t1.5\t25.7\t12548\t28611\t0.317\t63952\tRomney\t63952\t0.000506745\t63952.0\n12441\t-90.447194\t37.1283\tGreenville city\tMO\tMissouri\tWayne County\t435\t43.8\t5.1\t13.9\t11165\t48158\t0.317\t63944\tRomney\t63944\t0.001064899\t63944.0\n12442\t-93.055001\t37.117937\tRogersville city\tMO\tMissouri\tWebster County\t2146\t35.3\t23.1\t10.9\t17792\t119280\t0.2858\t65742\tRomney\t65742\t0.005253501999999999\t65742.0\n12443\t-92.768817\t37.147979\tSeymour city\tMO\tMissouri\tWebster County\t1882\t38.8\t9.5\t14.7\t14727\t72872\t0.2858\t65746\tRomney\t65746\t0.004607219\t65746.0\n12444\t-92.90960600000001\t37.340868\tMarshfield city\tMO\tMissouri\tWebster County\t6592\t36.9\t13.9\t11.5\t17877\t108934\t0.2858\t65706\tRomney\t65706\t0.016137506\t65706.0\n12445\t-92.942938\t37.156845000000004\tFordland city\tMO\tMissouri\tWebster County\t788\t37.4\t7.9\t13.4\t21347\t94643\t0.2858\t65652\tRomney\t65652\t0.001929059\t65652.0\n12446\t-92.83019399999999\t37.388059999999996\tNiangua city\tMO\tMissouri\tWebster County\t544\t41.5\t16.0\t13.2\t18019\t97857\t0.2858\t65713\tRomney\t65713\t0.001331736\t65713.0\n12447\t-92.850826\t37.174365\tDiggins village\tMO\tMissouri\tWebster County\t320\t32.6\t8.9\t9.6\t14319\t109821\t0.2858\t65746\tRomney\t65746\t0.000783374\t65746.0\n12448\t-94.614541\t40.517179\tSheridan town\tMO\tMissouri\tWorth County\t179\t42.7\t17.9\t3.7\t19305\t63750\t0.3254\t64486\tRomney\t64486\t0.00043819999999999997\t64486.0\n12449\t-94.323297\t40.398925\tDenver village\tMO\tMissouri\tWorth County\t34\t48.3\t16.0\t5.6\t17232\t65000\t0.3254\t64441\tRomney\t64441\t8.32e-05\t64441.0\n12450\t-94.446505\t40.404569\tWorth town\tMO\tMissouri\tWorth County\t79\t49.3\t15.0\t6.8\t17421\t60000\t0.3254\t64499\tRomney\t64499\t0.000193395\t64499.0\n12451\t-94.413934\t40.485745\tGrant City town\tMO\tMissouri\tWorth County\t790\t45.5\t9.5\t14.2\t14810\t48548\t0.3254\t64456\tRomney\t64456\t0.001933955\t64456.0\n12452\t-94.389791\t40.53911\tIrena village\tMO\tMissouri\tWorth County\t28\t47.5\t18.2\t6.7\t17238\t55000\t0.3254\t64456\tRomney\t64456\t6.850000000000001e-05\t64456.0\n12453\t-94.288688\t40.485341999999996\tAllendale town\tMO\tMissouri\tWorth County\t45\t46.9\t14.3\t8.0\t17565\t60000\t0.3254\t64441\tRomney\t64441\t0.000110162\t64441.0\n12454\t-92.583311\t37.108616\tMansfield city\tMO\tMissouri\tWright County\t1336\t37.7\t12.7\t10.5\t17015\t67800\t0.2455\t65704\tRomney\t65704\t0.003270587\t65704.0\n12455\t-92.512353\t37.250442\tHartville city\tMO\tMissouri\tWright County\t586\t42.9\t11.4\t13.1\t14005\t64615\t0.2455\t65667\tRomney\t65667\t0.001434554\t65667.0\n12456\t-92.418968\t37.106972999999996\tNorwood city\tMO\tMissouri\tWright County\t614\t34.8\t11.7\t13.9\t13348\t70500\t0.2455\t65717\tRomney\t65717\t0.001503099\t65717.0\n12457\t-92.248436\t37.139517\tMountain Grove city\tMO\tMissouri\tWright County\t4560\t40.5\t15.0\t16.3\t16847\t82339\t0.2455\t65711\tRomney\t65711\t0.01116308\t65711.0\n12458\t-90.245124\t38.635734\tSt. Louis city\tMO\tMissouri\tSt. Louis city\t349568\t35.4\t25.5\t16.2\t19546\t94788\t0.8271\t63108\tRomney\t63108\t0.8557578240000001\t63108.0\n12459\t-112.635121\t45.216777\tDillon city\tMT\tMontana\tBeaverhead County\t4012\t36.4\t28.7\t4.6\t18697\t107515\t0.2849\t59725\tRomney\t59725\t0.019125313999999997\t59725.0\n12460\t-113.44649\t45.610709\tWisdom CDP\tMT\tMontana\tBeaverhead County\t100\t50.8\t19.5\t4.5\t17301\t131250\t0.2849\t59761\tRomney\t59761\t0.00047670300000000003\t59761.0\n12461\t-112.59196899999999\t44.6384\tLima town\tMT\tMontana\tBeaverhead County\t194\t42.2\t19.7\t3.0\t15727\t90556\t0.2849\t59739\tRomney\t59739\t0.0009248030000000001\t59739.0\n12462\t-107.725131\t45.457193\tSt. Xavier CDP\tMT\tMontana\tBig Horn County\t70\t33.1\t21.4\t11.4\t13116\t143750\t0.623\t59075\tRomney\t59075\t0.00033369199999999996\t59075.0\n12463\t-108.52901899999999\t45.412526\tPryor CDP\tMT\tMontana\tBig Horn County\t653\t30.5\t19.7\t15.0\t10655\t125000\t0.623\t59066\tRomney\t59066\t0.0031128690000000003\t59066.0\n12464\t-107.37383200000001\t45.114981\tWyola CDP\tMT\tMontana\tBig Horn County\t202\t33.2\t17.6\t20.5\t10981\t103571\t0.623\t59089\tRomney\t59089\t0.00096294\t59089.0\n12465\t-107.61381499999999\t45.731783\tHardin city\tMT\tMontana\tBig Horn County\t3230\t37.2\t21.4\t13.0\t16742\t106048\t0.623\t59034\tRomney\t59034\t0.015397498999999999\t59034.0\n12466\t-106.775342\t45.579758\tMuddy CDP\tMT\tMontana\tBig Horn County\t691\t24.9\t10.5\t19.8\t9410\t90000\t0.623\t59043\tRomney\t59043\t0.003294016\t59043.0\n12467\t-106.97491000000001\t45.528498\tBusby CDP\tMT\tMontana\tBig Horn County\t766\t24.5\t10.8\t20.1\t9410\t90714\t0.623\t59016\tRomney\t59016\t0.0036515429999999997\t59016.0\n12468\t-107.36731499999999\t45.314035\tLodge Grass town\tMT\tMontana\tBig Horn County\t512\t23.3\t11.9\t22.5\t9224\t66667\t0.623\t59050\tRomney\t59050\t0.0024407179999999997\t59050.0\n12469\t-107.93028600000001\t45.314639\tFort Smith CDP\tMT\tMontana\tBig Horn County\t127\t34.1\t19.7\t11.1\t13174\t152500\t0.623\t59075\tRomney\t59075\t0.0006054119999999999\t59075.0\n12470\t-107.459083\t45.60266\tCrow Agency CDP\tMT\tMontana\tBig Horn County\t1583\t25.9\t15.6\t22.4\t11806\t78333\t0.623\t59022\tRomney\t59022\t0.007546204\t59022.0\n12471\t-108.73176699999999\t48.457464\tFort Belknap Agency CDP\tMT\tMontana\tBlaine County\t1231\t24.5\t14.7\t22.1\t11049\t82333\t0.5652\t59526\tRomney\t59526\t0.005868211\t59526.0\n12472\t-108.784724\t48.531888\tHarlem city\tMT\tMontana\tBlaine County\t793\t36.0\t28.8\t10.9\t14326\t61944\t0.5652\t59526\tRomney\t59526\t0.003780253\t59526.0\n12473\t-108.551533\t48.027174\tLodge Pole CDP\tMT\tMontana\tBlaine County\t213\t27.5\t11.6\t19.0\t8778\t85000\t0.5652\t59546\tRomney\t59546\t0.001015377\t59546.0\n12474\t-109.23151399999999\t48.590125\tChinook city\tMT\tMontana\tBlaine County\t1271\t45.5\t21.4\t4.9\t20266\t89063\t0.5652\t59523\tRomney\t59523\t0.006058892\t59523.0\n12475\t-108.65887099999999\t47.992373\tHays CDP\tMT\tMontana\tBlaine County\t660\t24.2\t15.4\t18.3\t8986\t62857\t0.5652\t59527\tRomney\t59527\t0.003146238\t59527.0\n12476\t-111.51968000000001\t46.318725\tTownsend city\tMT\tMontana\tBroadwater County\t2022\t45.0\t13.9\t6.5\t15920\t115872\t0.2537\t59644\tRomney\t59644\t0.009638929000000001\t59644.0\n12477\t-111.44741100000002\t46.16602\tToston CDP\tMT\tMontana\tBroadwater County\t121\t45.7\t21.1\t6.2\t21624\t230000\t0.2537\t59643\tRomney\t59643\t0.00057681\t59643.0\n12478\t-111.65908700000001\t46.474983\tWinston CDP\tMT\tMontana\tBroadwater County\t75\t42.1\t17.0\t4.9\t23242\t250000\t0.2537\t596HH\tRomney\t596HH\t0.00035752699999999995\t0.0\n12479\t-111.62231000000001\t46.188590000000005\tRadersburg CDP\tMT\tMontana\tBroadwater County\t72\t43.0\t17.3\t2.6\t23195\t243750\t0.2537\t59643\tRomney\t59643\t0.00034322599999999997\t59643.0\n12480\t-108.97175800000001\t45.484451\tJoliet town\tMT\tMontana\tCarbon County\t583\t45.2\t27.9\t5.1\t16685\t137500\t0.36700000000000005\t59041\tRomney\t59041\t0.0027791770000000003\t59041.0\n12481\t-109.00062\t45.13722\tBelfry CDP\tMT\tMontana\tCarbon County\t229\t44.6\t23.5\t5.1\t17831\t230000\t0.36700000000000005\t59008\tRomney\t59008\t0.0010916489999999999\t59008.0\n12482\t-109.24981399999999\t45.19236\tRed Lodge city\tMT\tMontana\tCarbon County\t2213\t44.9\t26.8\t6.5\t24735\t173598\t0.36700000000000005\t59068\tRomney\t59068\t0.010549432\t59068.0\n12483\t-108.90662900000001\t45.39181\tFromberg town\tMT\tMontana\tCarbon County\t507\t46.3\t19.9\t5.2\t18521\t132407\t0.36700000000000005\t59029\tRomney\t59029\t0.002416883\t59029.0\n12484\t-108.915305\t45.293729\tBridger town\tMT\tMontana\tCarbon County\t767\t43.2\t20.0\t7.2\t15352\t126705\t0.36700000000000005\t59029\tRomney\t59029\t0.00365631\t59029.0\n12485\t-109.15754199999999\t45.160588\tBearcreek town\tMT\tMontana\tCarbon County\t87\t45.0\t23.8\t4.5\t17798\t243750\t0.36700000000000005\t59007\tRomney\t59007\t0.000414731\t59007.0\n12486\t-104.550656\t45.889353\tEkalaka town\tMT\tMontana\tCarter County\t380\t47.6\t15.2\t0.9\t14744\t68333\t0.1206\t59324\tRomney\t59324\t0.00181147\t59324.0\n12487\t-111.267408\t47.527190999999995\tBlack Eagle CDP\tMT\tMontana\tCascade County\t891\t39.5\t12.0\t4.0\t17555\t125455\t0.4405\t59414\tRomney\t59414\t0.0042474209999999995\t59414.0\n12488\t-111.183004\t47.505526\tMalmstrom AFB CDP\tMT\tMontana\tCascade County\t4490\t21.7\t32.8\t7.3\t15531\t185714\t0.4405\t594HH\tRomney\t594HH\t0.021403953\t0.0\n12489\t-110.736061\t46.935221999999996\tNeihart town\tMT\tMontana\tCascade County\t100\t45.3\t25.3\t3.9\t20548\t195833\t0.4405\t59465\tRomney\t59465\t0.00047670300000000003\t59465.0\n12490\t-111.52531200000001\t47.419559\tUlm CDP\tMT\tMontana\tCascade County\t757\t37.5\t18.9\t5.4\t17271\t161458\t0.4405\t59485\tRomney\t59485\t0.00360864\t59485.0\n12491\t-110.92765700000001\t47.387094\tBelt city\tMT\tMontana\tCascade County\t609\t45.7\t17.1\t7.3\t17561\t102500\t0.4405\t59412\tRomney\t59412\t0.00290312\t59412.0\n12492\t-111.482542\t47.537209000000004\tSun Prairie CDP\tMT\tMontana\tCascade County\t1747\t39.2\t14.3\t4.8\t19037\t129620\t0.4405\t59487\tRomney\t59487\t0.008327997\t59487.0\n12493\t-111.72359399999999\t47.530798\tSun River CDP\tMT\tMontana\tCascade County\t127\t38.6\t14.6\t4.6\t15801\t140625\t0.4405\t59483\tRomney\t59483\t0.0006054119999999999\t59483.0\n12494\t-111.818821\t47.496879\tFort Shaw CDP\tMT\tMontana\tCascade County\t264\t46.2\t21.3\t3.1\t15068\t164583\t0.4405\t59483\tRomney\t59483\t0.001258495\t59483.0\n12495\t-111.70368899999998\t47.270036\tCascade town\tMT\tMontana\tCascade County\t790\t42.9\t15.0\t5.6\t14711\t138136\t0.4405\t59421\tRomney\t59421\t0.003765952\t59421.0\n12496\t-111.301732\t47.501523999999996\tGreat Falls city\tMT\tMontana\tCascade County\t57043\t40.1\t24.8\t6.6\t21841\t148977\t0.4405\t59401\tRomney\t59401\t0.271925545\t59401.0\n12497\t-111.94758700000001\t47.493161\tSimms CDP\tMT\tMontana\tCascade County\t359\t46.2\t21.2\t2.9\t15085\t162500\t0.4405\t59477\tRomney\t59477\t0.0017113629999999998\t59477.0\n12498\t-111.561195\t47.552668\tVaughn CDP\tMT\tMontana\tCascade County\t680\t38.1\t14.2\t4.6\t15809\t139189\t0.4405\t59487\tRomney\t59487\t0.003241579\t59487.0\n12499\t-110.940151\t47.781172999999995\tCarter CDP\tMT\tMontana\tChouteau County\t52\t48.0\t25.0\t0.0\t19831\t112500\t0.3467\t59420\tRomney\t59420\t0.000247885\t59420.0\n12500\t-110.266847\t47.602994\tGeraldine town\tMT\tMontana\tChouteau County\t248\t45.1\t25.0\t2.3\t18777\t86000\t0.3467\t59446\tRomney\t59446\t0.001182223\t59446.0\n12501\t-110.665764\t47.821457\tFort Benton city\tMT\tMontana\tChouteau County\t1384\t48.4\t24.1\t3.4\t17237\t92692\t0.3467\t59442\tRomney\t59442\t0.006597566\t59442.0\n12502\t-110.767606\t47.599333\tHighwood CDP\tMT\tMontana\tChouteau County\t168\t43.8\t29.4\t1.1\t19623\t137500\t0.3467\t59450\tRomney\t59450\t0.000800861\t59450.0\n12503\t-109.863896\t48.292291999999996\tBoneau CDP\tMT\tMontana\tChouteau County\t220\t17.8\t7.8\t23.1\t7112\t133333\t0.3467\t59521\tRomney\t59521\t0.0010487460000000001\t59521.0\n12504\t-110.488723\t47.951147999999996\tLoma CDP\tMT\tMontana\tChouteau County\t89\t44.1\t22.6\t6.0\t22096\t90000\t0.3467\t59460\tRomney\t59460\t0.000424265\t59460.0\n12505\t-110.113725\t48.17879\tBig Sandy town\tMT\tMontana\tChouteau County\t606\t50.6\t24.4\t3.6\t16033\t67500\t0.3467\t59520\tRomney\t59520\t0.0028888190000000004\t59520.0\n12506\t-105.83875400000001\t46.40599\tMiles City\tMT\tMontana\tCuster County\t8161\t41.7\t18.9\t4.6\t19186\t89046\t0.3417\t59301\tRomney\t59301\t0.038903711\t59301.0\n12507\t-104.79303399999999\t46.500042\tIsmay town\tMT\tMontana\tCuster County\t25\t38.8\t25.0\t6.7\t16429\t150000\t0.3417\t59336\tRomney\t59336\t0.000119176\t59336.0\n12508\t-105.174327\t48.80396\tFlaxville town\tMT\tMontana\tDaniels County\t70\t47.5\t15.7\t0.0\t17571\t85000\t0.2354\t59222\tRomney\t59222\t0.00033369199999999996\t59222.0\n12509\t-105.42088100000001\t48.790413\tScobey city\tMT\tMontana\tDaniels County\t906\t52.4\t16.7\t2.6\t20967\t69688\t0.2354\t59263\tRomney\t59263\t0.004318927\t59263.0\n12510\t-104.750057\t47.109922999999995\tWest Glendive CDP\tMT\tMontana\tDawson County\t1648\t43.2\t10.0\t6.0\t18329\t90417\t0.2756\t59330\tRomney\t59330\t0.007856061\t59330.0\n12511\t-104.707101\t47.110252\tGlendive city\tMT\tMontana\tDawson County\t4696\t42.5\t16.6\t2.7\t18993\t91944\t0.2756\t59330\tRomney\t59330\t0.022385961\t59330.0\n12512\t-105.06894199999999\t47.644298\tRichey town\tMT\tMontana\tDawson County\t175\t48.3\t18.2\t2.4\t14958\t34500\t0.2756\t59259\tRomney\t59259\t0.00083423\t59259.0\n12513\t-113.067747\t46.060790999999995\tAnaconda-Deer Lodge County\tMT\tMontana\tDeer Lodge County\t8866\t45.8\t16.9\t9.7\t18521\t98471\t0.6413\t59711\tRomney\t59711\t0.042264465\t59711.0\n12514\t-104.518411\t46.416787\tPlevna town\tMT\tMontana\tFallon County\t134\t45.5\t16.3\t2.0\t17423\t162500\t0.1686\t59344\tRomney\t59344\t0.000638782\t59344.0\n12515\t-104.27409200000001\t46.364394\tBaker city\tMT\tMontana\tFallon County\t1649\t45.0\t13.9\t1.6\t18543\t81098\t0.1686\t59313\tRomney\t59313\t0.007860828\t59313.0\n12516\t-109.694347\t46.974569\tMoore town\tMT\tMontana\tFergus County\t179\t48.4\t23.5\t5.8\t21086\t187500\t0.2701\t59464\tRomney\t59464\t0.0008532980000000001\t59464.0\n12517\t-109.47341100000001\t47.078445\tLewistown Heights CDP\tMT\tMontana\tFergus County\t350\t45.6\t15.4\t4.2\t18927\t85833\t0.2701\t59457\tRomney\t59457\t0.00166846\t59457.0\n12518\t-109.948949\t47.321739\tDenton town\tMT\tMontana\tFergus County\t284\t45.2\t16.6\t1.7\t17075\t85000\t0.2701\t59430\tRomney\t59430\t0.001353836\t59430.0\n12519\t-109.429149\t47.063928999999995\tLewistown city\tMT\tMontana\tFergus County\t5616\t45.7\t19.6\t5.2\t19548\t103070\t0.2701\t59457\tRomney\t59457\t0.026771626\t59457.0\n12520\t-109.376947\t47.562258\tWinifred town\tMT\tMontana\tFergus County\t148\t44.3\t14.4\t6.4\t17517\t90000\t0.2701\t59451\tRomney\t59451\t0.00070552\t59451.0\n12521\t-108.803118\t47.026143\tGrass Range town\tMT\tMontana\tFergus County\t141\t44.1\t14.0\t5.4\t17558\t87500\t0.2701\t59032\tRomney\t59032\t0.0006721510000000001\t59032.0\n12522\t-114.31875500000001\t48.202736\tKalispell city\tMT\tMontana\tFlathead County\t16065\t39.9\t24.6\t9.1\t19801\t169859\t0.3195\t59901\tRomney\t59901\t0.076582296\t59901.0\n12523\t-114.045346\t48.420351000000004\tCoram CDP\tMT\tMontana\tFlathead County\t406\t41.5\t10.7\t12.9\t14579\t129464\t0.3195\t59913\tRomney\t59913\t0.001935413\t59913.0\n12524\t-114.232178\t48.087221\tSomers CDP\tMT\tMontana\tFlathead County\t680\t43.2\t24.8\t6.8\t20766\t220000\t0.3195\t59932\tRomney\t59932\t0.003241579\t59932.0\n12525\t-114.484751\t47.880759000000005\tNiarada CDP\tMT\tMontana\tFlathead County\t54\t43.3\t16.2\t4.3\t13942\t179167\t0.3195\t59915\tRomney\t59915\t0.000257419\t59915.0\n12526\t-114.34391399999998\t48.437053000000006\tWhitefish city\tMT\tMontana\tFlathead County\t5653\t39.6\t39.9\t10.8\t22402\t199606\t0.3195\t59937\tRomney\t59937\t0.026948006\t59937.0\n12527\t-114.03693\t48.392804999999996\tMartin City CDP\tMT\tMontana\tFlathead County\t399\t41.3\t10.6\t12.6\t14570\t130833\t0.3195\t59913\tRomney\t59913\t0.0019020439999999999\t59913.0\n12528\t-114.09011299999999\t48.073662\tBigfork CDP\tMT\tMontana\tFlathead County\t1956\t53.1\t38.0\t8.3\t22609\t246341\t0.3195\t59932\tRomney\t59932\t0.009324306\t59932.0\n12529\t-114.190655\t48.370490000000004\tColumbia Falls city\tMT\tMontana\tFlathead County\t4563\t38.4\t13.6\t10.9\t18923\t154113\t0.3195\t59912\tRomney\t59912\t0.021751946\t59912.0\n12530\t-114.058361\t48.383357000000004\tHungry Horse CDP\tMT\tMontana\tFlathead County\t1144\t36.6\t2.1\t21.6\t12928\t131140\t0.3195\t59913\tRomney\t59913\t0.005453479000000001\t59913.0\n12531\t-114.229373\t48.012801\tLakeside CDP\tMT\tMontana\tFlathead County\t2142\t48.9\t34.5\t13.7\t20086\t262500\t0.3195\t59922\tRomney\t59922\t0.010210973\t59922.0\n12532\t-114.267927\t48.231382\tEvergreen CDP\tMT\tMontana\tFlathead County\t7320\t36.9\t13.4\t10.7\t16599\t137939\t0.3195\t59901\tRomney\t59901\t0.034894641000000004\t59901.0\n12533\t-111.63086499999999\t45.8328\tWillow Creek CDP\tMT\tMontana\tGallatin County\t261\t43.2\t30.2\t6.2\t19067\t250000\t0.4584\t59752\tRomney\t59752\t0.001244194\t59752.0\n12534\t-111.31979299999999\t45.744281\tAmsterdam-Churchill CDP\tMT\tMontana\tGallatin County\t853\t39.9\t29.8\t5.4\t19477\t302381\t0.4584\t59741\tRomney\t59741\t0.004066274\t59741.0\n12535\t-111.17881299999999\t45.779044\tBelgrade city\tMT\tMontana\tGallatin County\t7163\t29.4\t30.8\t7.2\t19982\t205748\t0.4584\t59714\tRomney\t59714\t0.034146217\t59714.0\n12536\t-111.554348\t45.889691\tThree Forks city\tMT\tMontana\tGallatin County\t2402\t39.7\t19.7\t8.2\t17597\t165104\t0.4584\t59752\tRomney\t59752\t0.0114504\t59752.0\n12537\t-111.22293300000001\t45.294554999999995\tBig Sky CDP\tMT\tMontana\tGallatin County\t1556\t41.9\t46.0\t6.3\t36663\t377333\t0.4584\t59716\tRomney\t59716\t0.007417495\t59716.0\n12538\t-111.04821299999999\t45.678579\tBozeman city\tMT\tMontana\tGallatin County\t35023\t27.3\t53.2\t5.9\t22129\t261845\t0.4584\t59715\tRomney\t59715\t0.166955601\t59715.0\n12539\t-111.176943\t45.670168\tFour Corners CDP\tMT\tMontana\tGallatin County\t2798\t39.8\t39.5\t5.5\t24077\t288976\t0.4584\t59718\tRomney\t59718\t0.013338143\t59718.0\n12540\t-111.33094299999999\t45.858019\tManhattan town\tMT\tMontana\tGallatin County\t1856\t39.6\t29.8\t6.2\t19104\t208071\t0.4584\t59741\tRomney\t59741\t0.008847603\t59741.0\n12541\t-111.105958\t44.663371999999995\tWest Yellowstone town\tMT\tMontana\tGallatin County\t1584\t39.8\t34.0\t11.4\t23104\t295395\t0.4584\t59758\tRomney\t59758\t0.007550971\t59758.0\n12542\t-106.91013400000001\t47.320826000000004\tJordan town\tMT\tMontana\tGarfield County\t338\t42.9\t16.6\t2.1\t15753\t86667\t0.0942\t59337\tRomney\t59337\t0.001611255\t59337.0\n12543\t-113.012498\t48.546015000000004\tSouth Browning CDP\tMT\tMontana\tGlacier County\t1588\t24.5\t7.6\t44.5\t7097\t75909\t0.6568\t59417\tRomney\t59417\t0.00757004\t59417.0\n12544\t-113.22346999999999\t48.446024\tEast Glacier Park Village CDP\tMT\tMontana\tGlacier County\t392\t38.4\t48.4\t11.7\t18543\t136538\t0.6568\t59434\tRomney\t59434\t0.001868675\t59434.0\n12545\t-113.14386499999999\t48.597364\tStarr School CDP\tMT\tMontana\tGlacier County\t248\t26.0\t11.1\t14.5\t9167\t110417\t0.6568\t59417\tRomney\t59417\t0.001182223\t59417.0\n12546\t-113.01519499999999\t48.556387\tBrowning town\tMT\tMontana\tGlacier County\t1022\t31.9\t15.7\t25.3\t12201\t77500\t0.6568\t59417\tRomney\t59417\t0.004871902\t59417.0\n12547\t-112.33068200000001\t48.63455\tCut Bank city\tMT\tMontana\tGlacier County\t3197\t41.5\t25.8\t3.3\t19862\t94792\t0.6568\t59427\tRomney\t59427\t0.015240186999999999\t59427.0\n12548\t-113.011218\t48.568251000000004\tNorth Browning CDP\tMT\tMontana\tGlacier County\t2192\t27.1\t13.4\t25.4\t10503\t101103\t0.6568\t59417\tRomney\t59417\t0.010449324\t59417.0\n12549\t-108.93876000000002\t46.295801000000004\tLavina town\tMT\tMontana\tGolden Valley County\t215\t45.7\t16.2\t1.8\t16096\t102083\t0.2296\t59046\tRomney\t59046\t0.001024911\t59046.0\n12550\t-109.25333\t46.2986\tRyegate town\tMT\tMontana\tGolden Valley County\t275\t46.7\t16.2\t2.0\t16135\t97500\t0.2296\t59074\tRomney\t59074\t0.0013109329999999998\t59074.0\n12551\t-113.29550400000001\t46.332425\tPhilipsburg town\tMT\tMontana\tGranite County\t884\t50.4\t21.0\t10.0\t19542\t95000\t0.3126\t59858\tRomney\t59858\t0.004214052\t59858.0\n12552\t-113.147236\t46.666476\tDrummond town\tMT\tMontana\tGranite County\t307\t44.8\t17.7\t6.3\t18542\t94375\t0.3126\t59832\tRomney\t59832\t0.0014634770000000001\t59832.0\n12553\t-109.730759\t48.547\tWest Havre CDP\tMT\tMontana\tHill County\t280\t33.0\t20.7\t8.7\t18466\t122500\t0.4986\t59501\tRomney\t59501\t0.0013347679999999998\t59501.0\n12554\t-109.806886\t48.543684999999996\tBeaver Creek CDP\tMT\tMontana\tHill County\t278\t44.2\t22.5\t6.1\t17718\t158333\t0.4986\t59501\tRomney\t59501\t0.001325234\t59501.0\n12555\t-109.764798\t48.258939\tAgency CDP\tMT\tMontana\tHill County\t309\t22.1\t17.0\t29.3\t10678\t36667\t0.4986\t59521\tRomney\t59521\t0.001473011\t59521.0\n12556\t-109.771735\t48.534197\tHerron CDP\tMT\tMontana\tHill County\t96\t45.8\t22.1\t6.5\t17629\t160417\t0.4986\t59501\tRomney\t59501\t0.000457635\t59501.0\n12557\t-109.670971\t48.563035\tHavre North CDP\tMT\tMontana\tHill County\t1024\t38.6\t6.7\t10.3\t14806\t76809\t0.4986\t59501\tRomney\t59501\t0.004881435999999999\t59501.0\n12558\t-110.42126999999999\t48.555478\tHingham town\tMT\tMontana\tHill County\t146\t45.6\t21.7\t3.7\t18203\t82500\t0.4986\t59528\tRomney\t59528\t0.0006959860000000001\t59528.0\n12559\t-109.989832\t48.314357\tBox Elder CDP\tMT\tMontana\tHill County\t866\t20.8\t14.3\t21.7\t8132\t110938\t0.4986\t59521\tRomney\t59521\t0.0041282459999999995\t59521.0\n12560\t-109.807392\t48.30495\tAzure CDP\tMT\tMontana\tHill County\t241\t22.3\t16.4\t28.8\t10681\t36250\t0.4986\t59521\tRomney\t59521\t0.001148854\t59521.0\n12561\t-110.71016599999999\t48.559740000000005\tInverness CDP\tMT\tMontana\tHill County\t93\t45.7\t21.2\t4.3\t19988\t80000\t0.4986\t59530\tRomney\t59530\t0.00044333400000000003\t59530.0\n12562\t-110.27374499999999\t48.573683\tGildford CDP\tMT\tMontana\tHill County\t172\t45.7\t20.8\t3.2\t18211\t82500\t0.4986\t59528\tRomney\t59528\t0.000819929\t59528.0\n12563\t-109.81669699999999\t48.281703\tSangrey CDP\tMT\tMontana\tHill County\t251\t25.3\t13.5\t30.7\t11035\t56000\t0.4986\t59521\tRomney\t59521\t0.001196524\t59521.0\n12564\t-109.646277\t48.523482\tSaddle Butte CDP\tMT\tMontana\tHill County\t132\t44.6\t22.1\t5.9\t17693\t160417\t0.4986\t59501\tRomney\t59501\t0.000629248\t59501.0\n12565\t-109.81622\t48.243957\tSt. Pierre CDP\tMT\tMontana\tHill County\t276\t24.9\t13.0\t30.6\t11026\t56000\t0.4986\t59521\tRomney\t59521\t0.0013157\t59521.0\n12566\t-110.086078\t48.570682\tKremlin CDP\tMT\tMontana\tHill County\t117\t45.0\t20.9\t3.1\t18235\t80000\t0.4986\t59532\tRomney\t59532\t0.000557742\t59532.0\n12567\t-110.550005\t48.559796999999996\tRudyard CDP\tMT\tMontana\tHill County\t248\t46.0\t20.0\t4.1\t20013\t81250\t0.4986\t59540\tRomney\t59540\t0.001182223\t59540.0\n12568\t-109.67168799999999\t48.543908\tHavre city\tMT\tMontana\tHill County\t9648\t34.7\t25.2\t7.0\t20304\t119647\t0.4986\t59501\tRomney\t59501\t0.045992280999999996\t59501.0\n12569\t-109.733503\t48.24685\tParker School CDP\tMT\tMontana\tHill County\t335\t21.8\t17.3\t28.8\t10639\t33750\t0.4986\t59521\tRomney\t59521\t0.001596954\t59521.0\n12570\t-112.006005\t46.450545\tClancy CDP\tMT\tMontana\tJefferson County\t1589\t43.7\t42.1\t3.5\t26035\t240909\t0.3484\t59634\tRomney\t59634\t0.007574806999999999\t59634.0\n12571\t-112.05026299999999\t46.383520000000004\tJefferson City CDP\tMT\tMontana\tJefferson County\t332\t43.2\t26.2\t5.6\t18335\t150000\t0.3484\t59638\tRomney\t59638\t0.0015826529999999998\t59638.0\n12572\t-111.922872\t46.525371\tMontana City CDP\tMT\tMontana\tJefferson County\t2727\t43.8\t40.5\t2.7\t26751\t250139\t0.3484\t59635\tRomney\t59635\t0.012999684\t59635.0\n12573\t-111.95636499999999\t45.863053\tCardwell CDP\tMT\tMontana\tJefferson County\t45\t44.4\t23.3\t8.7\t15187\t162500\t0.3484\t59721\tRomney\t59721\t0.000214516\t59721.0\n12574\t-112.287365\t46.283423\tBasin CDP\tMT\tMontana\tJefferson County\t287\t43.3\t26.1\t5.2\t18293\t150000\t0.3484\t59631\tRomney\t59631\t0.0013681370000000002\t59631.0\n12575\t-112.120326\t46.235571\tBoulder town\tMT\tMontana\tJefferson County\t1405\t38.0\t19.3\t4.2\t17431\t99286\t0.3484\t59632\tRomney\t59632\t0.006697674\t59632.0\n12576\t-112.09753899999998\t45.87108\tWhitehall town\tMT\tMontana\tJefferson County\t1125\t45.6\t19.7\t8.8\t17173\t132500\t0.3484\t59759\tRomney\t59759\t0.005362906\t59759.0\n12577\t-109.874573\t46.999635999999995\tHobson city\tMT\tMontana\tJudith Basin County\t227\t46.3\t27.8\t2.7\t17843\t123438\t0.2774\t59462\tRomney\t59462\t0.001082115\t59462.0\n12578\t-110.21841699999999\t47.151831\tStanford town\tMT\tMontana\tJudith Basin County\t412\t50.2\t21.2\t1.8\t16333\t75000\t0.2774\t59479\tRomney\t59479\t0.001964015\t59479.0\n12579\t-114.27002\t47.793692\tBig Arm CDP\tMT\tMontana\tLake County\t150\t52.5\t23.7\t16.3\t19890\t241667\t0.4363\t59910\tRomney\t59910\t0.0007150539999999999\t59910.0\n12580\t-114.100357\t47.527506\tRonan city\tMT\tMontana\tLake County\t1885\t34.4\t18.4\t12.5\t13440\t122809\t0.4363\t59864\tRomney\t59864\t0.008985847\t59864.0\n12581\t-114.08076299999999\t47.670251\tTurtle Lake CDP\tMT\tMontana\tLake County\t190\t47.1\t26.9\t8.8\t19300\t215000\t0.4363\t59855\tRomney\t59855\t0.000905735\t59855.0\n12582\t-114.16576\t47.279761\tRavalli CDP\tMT\tMontana\tLake County\t137\t38.2\t22.9\t9.5\t16006\t221875\t0.4363\t59865\tRomney\t59865\t0.000653083\t59865.0\n12583\t-114.192894\t47.676043\tKerr CDP\tMT\tMontana\tLake County\t18\t28.8\t25.0\t12.5\t20821\t175000\t0.4363\t59860\tRomney\t59860\t8.58e-05\t59860.0\n12584\t-114.185717\t47.732085\tRocky Point CDP\tMT\tMontana\tLake County\t112\t53.1\t37.8\t13.3\t26887\t231250\t0.4363\t59860\tRomney\t59860\t0.000533907\t59860.0\n12585\t-114.06655900000001\t47.746359999999996\tFinley Point CDP\tMT\tMontana\tLake County\t595\t51.6\t39.1\t7.1\t22135\t273333\t0.4363\t59860\tRomney\t59860\t0.002836381\t59860.0\n12586\t-114.09562\t47.318668\tSt. Ignatius town\tMT\tMontana\tLake County\t787\t32.7\t21.1\t17.3\t12086\t115104\t0.4363\t59865\tRomney\t59865\t0.003751651\t59865.0\n12587\t-114.105792\t47.603571\tPablo CDP\tMT\tMontana\tLake County\t1990\t27.0\t15.4\t16.1\t14368\t114931\t0.4363\t59855\tRomney\t59855\t0.009486385\t59855.0\n12588\t-114.149336\t47.689195\tPolson city\tMT\tMontana\tLake County\t4094\t38.7\t23.1\t8.0\t17408\t152836\t0.4363\t59860\tRomney\t59860\t0.01951621\t59860.0\n12589\t-114.154556\t47.76348\tKings Point CDP\tMT\tMontana\tLake County\t176\t53.3\t36.9\t12.7\t27036\t233929\t0.4363\t59860\tRomney\t59860\t0.000838997\t59860.0\n12590\t-114.275318\t47.8646\tDayton CDP\tMT\tMontana\tLake County\t109\t52.5\t23.5\t16.7\t19844\t237500\t0.4363\t59914\tRomney\t59914\t0.000519606\t59914.0\n12591\t-114.083979\t47.168092\tArlee CDP\tMT\tMontana\tLake County\t694\t36.2\t29.8\t12.9\t16887\t140500\t0.4363\t59821\tRomney\t59821\t0.0033083170000000003\t59821.0\n12592\t-114.19057099999999\t47.716918\tJette CDP\tMT\tMontana\tLake County\t279\t53.5\t37.2\t13.3\t26942\t237500\t0.4363\t59860\tRomney\t59860\t0.0013300010000000001\t59860.0\n12593\t-114.34855800000001\t47.828818\tElmo CDP\tMT\tMontana\tLake County\t164\t51.7\t24.2\t16.7\t19848\t238636\t0.4363\t59915\tRomney\t59915\t0.000781792\t59915.0\n12594\t-114.061741\t48.008245\tWoods Bay CDP\tMT\tMontana\tLake County\t836\t51.0\t28.9\t8.1\t20241\t227381\t0.4363\t59911\tRomney\t59911\t0.003985235\t59911.0\n12595\t-114.17173600000001\t47.442621\tCharlo CDP\tMT\tMontana\tLake County\t474\t33.6\t32.0\t10.3\t14822\t160227\t0.4363\t59824\tRomney\t59824\t0.002259571\t59824.0\n12596\t-114.19511200000001\t47.910494\tRollins CDP\tMT\tMontana\tLake County\t220\t56.1\t29.4\t10.0\t22798\t287500\t0.4363\t59931\tRomney\t59931\t0.0010487460000000001\t59931.0\n12597\t-114.0719\t47.456617\tKicking Horse CDP\tMT\tMontana\tLake County\t84\t20.6\t25.9\t19.0\t13536\t240000\t0.4363\t59864\tRomney\t59864\t0.00040043\t59864.0\n12598\t-111.92168899999999\t46.615046\tHelena Valley Southeast CDP\tMT\tMontana\tLewis and Clark County\t8074\t33.3\t23.4\t4.7\t20189\t144212\t0.4688\t59635\tRomney\t59635\t0.038488979\t59635.0\n12599\t-112.063193\t46.729017\tHelena Valley Northwest CDP\tMT\tMontana\tLewis and Clark County\t3302\t37.9\t26.9\t5.0\t21071\t170313\t0.4688\t59602\tRomney\t59602\t0.015740725\t59602.0\n12600\t-112.112674\t46.596693\tHelena West Side CDP\tMT\tMontana\tLewis and Clark County\t1887\t40.0\t40.5\t5.8\t25577\t183611\t0.4688\t59636\tRomney\t59636\t0.008995381\t59636.0\n12601\t-111.918524\t46.588429\tEast Helena town\tMT\tMontana\tLewis and Clark County\t1695\t37.1\t15.9\t6.5\t20307\t136996\t0.4688\t59635\tRomney\t59635\t0.008080111\t59635.0\n12602\t-112.394226\t47.489645\tAugusta CDP\tMT\tMontana\tLewis and Clark County\t301\t42.7\t16.3\t5.2\t15270\t117500\t0.4688\t59410\tRomney\t59410\t0.001434875\t59410.0\n12603\t-112.66991200000001\t46.9529\tLincoln CDP\tMT\tMontana\tLewis and Clark County\t1202\t47.3\t13.8\t6.0\t16599\t125625\t0.4688\t59639\tRomney\t59639\t0.005729967\t59639.0\n12604\t-112.06005\t46.662684000000006\tHelena Valley West Central CDP\tMT\tMontana\tLewis and Clark County\t7999\t40.5\t33.3\t5.0\t22404\t176403\t0.4688\t59636\tRomney\t59636\t0.038131452\t59636.0\n12605\t-111.952455\t46.698735\tHelena Valley Northeast CDP\tMT\tMontana\tLewis and Clark County\t2473\t42.2\t26.9\t5.8\t22217\t184418\t0.4688\t59602\tRomney\t59602\t0.011788858999999999\t59602.0\n12606\t-112.019825\t46.59681\tHelena city\tMT\tMontana\tLewis and Clark County\t26249\t40.4\t43.7\t5.0\t25278\t168569\t0.4688\t59601\tRomney\t59601\t0.125129703\t59601.0\n12607\t-110.772922\t48.558971\tJoplin CDP\tMT\tMontana\tLiberty County\t194\t40.8\t18.7\t5.5\t16931\t89286\t0.2575\t59530\tRomney\t59530\t0.0009248030000000001\t59530.0\n12608\t-110.967643\t48.510293\tChester town\tMT\tMontana\tLiberty County\t790\t53.3\t19.4\t2.6\t20628\t89688\t0.2575\t59522\tRomney\t59522\t0.003765952\t59522.0\n12609\t-114.90166699999999\t48.769872\tFortine CDP\tMT\tMontana\tLincoln County\t166\t45.4\t21.8\t16.7\t16129\t187500\t0.2871\t59918\tRomney\t59918\t0.000791327\t59918.0\n12610\t-115.047591\t48.876233\tEureka town\tMT\tMontana\tLincoln County\t965\t43.2\t14.7\t16.7\t17806\t110294\t0.2871\t59917\tRomney\t59917\t0.004600181\t59917.0\n12611\t-115.171603\t48.899783\tRexford town\tMT\tMontana\tLincoln County\t155\t45.6\t13.4\t18.0\t13907\t162500\t0.2871\t59930\tRomney\t59930\t0.000738889\t59930.0\n12612\t-115.89050900000001\t48.460377\tTroy city\tMT\tMontana\tLincoln County\t907\t46.1\t16.6\t12.6\t13036\t90370\t0.2871\t59935\tRomney\t59935\t0.004323694\t59935.0\n12613\t-115.556598\t48.387692\tLibby city\tMT\tMontana\tLincoln County\t2521\t46.4\t12.7\t16.8\t15802\t98636\t0.2871\t59923\tRomney\t59923\t0.012017676000000001\t59923.0\n12614\t-105.58706699999999\t47.417644\tCircle town\tMT\tMontana\tMcCone County\t536\t44.0\t22.6\t1.3\t17837\t57000\t0.2246\t59214\tRomney\t59214\t0.002555127\t59214.0\n12615\t-112.33370500000001\t45.542746\tTwin Bridges town\tMT\tMontana\tMadison County\t444\t46.1\t30.5\t4.5\t16982\t130978\t0.2844\t59754\tRomney\t59754\t0.00211656\t59754.0\n12616\t-112.194574\t45.45877\tSheridan town\tMT\tMontana\tMadison County\t706\t51.1\t20.0\t6.3\t17442\t146635\t0.2844\t59749\tRomney\t59749\t0.003365521\t59749.0\n12617\t-111.93546599999999\t45.296528\tVirginia City town\tMT\tMontana\tMadison County\t143\t48.2\t25.5\t4.3\t17855\t215000\t0.2844\t59755\tRomney\t59755\t0.000681685\t59755.0\n12618\t-111.785467\t45.703575\tHarrison CDP\tMT\tMontana\tMadison County\t183\t43.8\t21.7\t5.5\t17305\t181250\t0.2844\t59735\tRomney\t59735\t0.0008723660000000001\t59735.0\n12619\t-112.109499\t45.321822999999995\tAlder CDP\tMT\tMontana\tMadison County\t127\t48.5\t25.5\t4.9\t17939\t216667\t0.2844\t59755\tRomney\t59755\t0.0006054119999999999\t59755.0\n12620\t-111.731321\t45.345349\tEnnis town\tMT\tMontana\tMadison County\t922\t48.3\t34.1\t6.5\t19813\t162857\t0.2844\t59729\tRomney\t59729\t0.004395199\t59729.0\n12621\t-110.90371599999999\t46.545969\tWhite Sulphur Springs city\tMT\tMontana\tMeagher County\t945\t46.8\t16.0\t6.7\t17506\t95000\t0.2767\t59645\tRomney\t59645\t0.004504841\t59645.0\n12622\t-114.48166599999999\t47.003883\tAlberton town\tMT\tMontana\tMineral County\t386\t42.9\t16.2\t11.0\t18175\t150000\t0.3464\t59820\tRomney\t59820\t0.0018400729999999998\t59820.0\n12623\t-114.892494\t47.193518\tSuperior town\tMT\tMontana\tMineral County\t897\t46.8\t14.6\t7.6\t16207\t130515\t0.3464\t59872\tRomney\t59872\t0.004276024000000001\t59872.0\n12624\t-114.83186\t47.147383000000005\tRiverbend CDP\tMT\tMontana\tMineral County\t442\t49.6\t11.1\t6.6\t16762\t133125\t0.3464\t59872\tRomney\t59872\t0.002107026\t59872.0\n12625\t-115.102078\t47.301955\tSt. Regis CDP\tMT\tMontana\tMineral County\t316\t45.8\t12.7\t7.2\t18041\t132692\t0.3464\t59866\tRomney\t59866\t0.001506381\t59866.0\n12626\t-115.31842900000001\t47.379389\tDe Borgia CDP\tMT\tMontana\tMineral County\t69\t45.8\t12.0\t6.1\t18101\t129167\t0.3464\t59867\tRomney\t59867\t0.000328925\t59867.0\n12627\t-114.005902\t46.868233000000004\tMissoula city\tMT\tMontana\tMissoula County\t61674\t31.9\t41.6\t7.4\t21606\t230606\t0.5735\t59801\tRomney\t59801\t0.294001649\t59801.0\n12628\t-113.887126\t46.876952\tBonner-West Riverside CDP\tMT\tMontana\tMissoula County\t1874\t34.4\t16.9\t4.5\t19446\t116532\t0.5735\t59851\tRomney\t59851\t0.008933409\t59851.0\n12629\t-113.941065\t46.87989\tEast Missoula CDP\tMT\tMontana\tMissoula County\t2247\t39.1\t23.7\t5.3\t17434\t188081\t0.5735\t59802\tRomney\t59802\t0.010711511000000002\t59802.0\n12630\t-114.07576399999999\t46.856516\tOrchard Homes CDP\tMT\tMontana\tMissoula County\t5456\t42.4\t30.1\t6.6\t21684\t269759\t0.5735\t59804\tRomney\t59804\t0.026008902\t59804.0\n12631\t-114.25078500000001\t47.025015\tFrenchtown CDP\tMT\tMontana\tMissoula County\t1066\t40.8\t27.1\t6.1\t21813\t257927\t0.5735\t59834\tRomney\t59834\t0.0050816509999999995\t59834.0\n12632\t-114.020742\t47.073834000000005\tEvaro CDP\tMT\tMontana\tMissoula County\t340\t36.5\t22.5\t4.7\t18584\t215909\t0.5735\t59821\tRomney\t59821\t0.0016207889999999999\t59821.0\n12633\t-114.10256299999999\t46.775615\tLolo CDP\tMT\tMontana\tMissoula County\t4049\t35.5\t35.0\t4.0\t20342\t212966\t0.5735\t59804\tRomney\t59804\t0.019301693999999998\t59804.0\n12634\t-113.457822\t47.160841\tSeeley Lake CDP\tMT\tMontana\tMissoula County\t1624\t43.8\t21.1\t7.3\t19406\t197500\t0.5735\t59868\tRomney\t59868\t0.007741653\t59868.0\n12635\t-113.722619\t46.777015999999996\tClinton CDP\tMT\tMontana\tMissoula County\t607\t41.1\t26.1\t5.3\t18952\t234615\t0.5735\t59825\tRomney\t59825\t0.0028935859999999996\t59825.0\n12636\t-114.134868\t46.953232\tWye CDP\tMT\tMontana\tMissoula County\t498\t40.7\t27.2\t6.2\t21817\t253947\t0.5735\t59808\tRomney\t59808\t0.00237398\t59808.0\n12637\t-108.574126\t46.453359999999996\tCamp Three CDP\tMT\tMontana\tMusselshell County\t140\t46.4\t17.6\t7.6\t16640\t85000\t0.2044\t59072\tRomney\t59072\t0.0006673839999999999\t59072.0\n12638\t-108.09760700000001\t46.506418\tMusselshell CDP\tMT\tMontana\tMusselshell County\t54\t50.4\t19.0\t5.9\t17627\t181250\t0.2044\t59059\tRomney\t59059\t0.000257419\t59059.0\n12639\t-108.552746\t46.398321\tKlein CDP\tMT\tMontana\tMusselshell County\t187\t48.0\t20.1\t8.3\t16960\t187500\t0.2044\t59072\tRomney\t59072\t0.000891434\t59072.0\n12640\t-107.86853\t46.598688\tMelstone town\tMT\tMontana\tMusselshell County\t147\t42.7\t22.2\t8.9\t20437\t106250\t0.2044\t59054\tRomney\t59054\t0.000700753\t59054.0\n12641\t-108.54016999999999\t46.44838\tRoundup city\tMT\tMontana\tMusselshell County\t1946\t45.4\t17.5\t6.8\t16630\t82347\t0.2044\t59072\tRomney\t59072\t0.009276635\t59072.0\n12642\t-110.65973400000001\t45.983167\tWilsall CDP\tMT\tMontana\tPark County\t281\t45.8\t26.7\t3.7\t17440\t173214\t0.4315\t59018\tRomney\t59018\t0.001339535\t59018.0\n12643\t-109.915696\t45.017520000000005\tCooke City-Silver Gate CDP\tMT\tMontana\tPark County\t141\t44.5\t38.9\t7.0\t24793\t280000\t0.4315\t59020\tRomney\t59020\t0.0006721510000000001\t59020.0\n12644\t-110.60517800000001\t45.884314\tClyde Park town\tMT\tMontana\tPark County\t341\t45.3\t29.1\t3.7\t19805\t164773\t0.4315\t59018\tRomney\t59018\t0.001625556\t59018.0\n12645\t-110.564838\t45.661355\tLivingston city\tMT\tMontana\tPark County\t6794\t42.1\t23.7\t4.1\t21156\t134561\t0.4315\t59047\tRomney\t59047\t0.032387184\t59047.0\n12646\t-110.72994299999999\t45.048443\tGardiner CDP\tMT\tMontana\tPark County\t902\t44.1\t30.9\t8.3\t26090\t181667\t0.4315\t59030\tRomney\t59030\t0.0042998590000000005\t59030.0\n12647\t-108.34621399999999\t47.004767\tWinnett town\tMT\tMontana\tPetroleum County\t181\t43.1\t17.7\t1.1\t17552\t91250\t0.1644\t59087\tRomney\t59087\t0.000862832\t59087.0\n12648\t-108.24679099999999\t48.395634\tDodson town\tMT\tMontana\tPhillips County\t114\t42.9\t13.8\t1.7\t15559\t56667\t0.2114\t59524\tRomney\t59524\t0.000543441\t59524.0\n12649\t-107.87073999999998\t48.355139\tMalta city\tMT\tMontana\tPhillips County\t1939\t47.5\t18.6\t2.5\t19304\t98043\t0.2114\t59538\tRomney\t59538\t0.009243266\t59538.0\n12650\t-107.340933\t48.456876\tSaco town\tMT\tMontana\tPhillips County\t209\t42.3\t13.8\t1.9\t15587\t53333\t0.2114\t59261\tRomney\t59261\t0.000996309\t59261.0\n12651\t-112.252376\t48.302329\tValier town\tMT\tMontana\tPondera County\t463\t49.3\t16.3\t5.2\t17366\t79412\t0.3586\t59486\tRomney\t59486\t0.002207134\t59486.0\n12652\t-111.947686\t48.173013\tConrad city\tMT\tMontana\tPondera County\t2636\t41.9\t26.8\t4.3\t19814\t89407\t0.3586\t59425\tRomney\t59425\t0.012565884\t59425.0\n12653\t-112.83635100000001\t48.29036\tHeart Butte CDP\tMT\tMontana\tPondera County\t684\t25.0\t19.0\t36.7\t9419\t87500\t0.3586\t59448\tRomney\t59448\t0.003260647\t59448.0\n12654\t-105.40811200000002\t45.443152000000005\tBroadus town\tMT\tMontana\tPowder River County\t420\t45.6\t15.6\t3.5\t15372\t78333\t0.1655\t59317\tRomney\t59317\t0.002002152\t59317.0\n12655\t-113.171577\t47.020738\tOvando CDP\tMT\tMontana\tPowell County\t65\t47.5\t30.6\t6.9\t16452\t225000\t0.3198\t59854\tRomney\t59854\t0.000309857\t59854.0\n12656\t-112.58180300000001\t46.626258\tAvon CDP\tMT\tMontana\tPowell County\t120\t40.8\t16.7\t4.2\t16618\t129167\t0.3198\t59713\tRomney\t59713\t0.000572043\t59713.0\n12657\t-112.733274\t46.397496000000004\tDeer Lodge city\tMT\tMontana\tPowell County\t3128\t44.5\t16.4\t6.4\t17959\t93014\t0.3198\t59722\tRomney\t59722\t0.014911262\t59722.0\n12658\t-112.820117\t46.525887\tGarrison CDP\tMT\tMontana\tPowell County\t147\t48.0\t14.7\t5.9\t17453\t125000\t0.3198\t59731\tRomney\t59731\t0.000700753\t59731.0\n12659\t-112.4572\t46.557336\tElliston CDP\tMT\tMontana\tPowell County\t218\t39.4\t16.8\t3.5\t16599\t130682\t0.3198\t59728\tRomney\t59728\t0.001039212\t59728.0\n12660\t-105.31236299999999\t46.792113\tTerry town\tMT\tMontana\tPrairie County\t557\t59.1\t15.0\t3.2\t18292\t50789\t0.2376\t59349\tRomney\t59349\t0.0026552340000000002\t59349.0\n12661\t-105.12675700000001\t46.836665\tFallon CDP\tMT\tMontana\tPrairie County\t124\t50.0\t16.5\t1.4\t15860\t105000\t0.2376\t59326\tRomney\t59326\t0.000591111\t59326.0\n12662\t-114.16008799999999\t46.251692\tHamilton city\tMT\tMontana\tRavalli County\t4002\t44.7\t26.4\t9.6\t18450\t153833\t0.32799999999999996\t59840\tRomney\t59840\t0.019077643999999998\t59840.0\n12663\t-114.17923400000001\t46.023106\tDarby town\tMT\tMontana\tRavalli County\t814\t38.3\t10.5\t13.1\t13948\t134756\t0.32799999999999996\t59827\tRomney\t59827\t0.00388036\t59827.0\n12664\t-114.222851\t46.333863\tPinesdale town\tMT\tMontana\tRavalli County\t886\t40.2\t26.8\t6.6\t18233\t236000\t0.32799999999999996\t59841\tRomney\t59841\t0.004223586\t59841.0\n12665\t-114.11447700000001\t46.319375\tCorvallis CDP\tMT\tMontana\tRavalli County\t519\t41.1\t12.4\t9.5\t13693\t175000\t0.32799999999999996\t59828\tRomney\t59828\t0.0024740870000000002\t59828.0\n12666\t-114.120047\t46.644991\tFlorence CDP\tMT\tMontana\tRavalli County\t1025\t42.4\t34.6\t9.7\t20461\t205455\t0.32799999999999996\t59833\tRomney\t59833\t0.0048862029999999996\t59833.0\n12667\t-114.15353700000001\t46.414557\tVictor CDP\tMT\tMontana\tRavalli County\t979\t44.2\t18.1\t5.7\t20718\t165000\t0.32799999999999996\t59875\tRomney\t59875\t0.00466692\t59875.0\n12668\t-114.09168899999999\t46.507452\tStevensville town\tMT\tMontana\tRavalli County\t1632\t39.8\t22.4\t9.6\t18137\t152138\t0.32799999999999996\t59870\tRomney\t59870\t0.0077797890000000005\t59870.0\n12669\t-104.632906\t47.6857\tFox Lake CDP\tMT\tMontana\tRichland County\t145\t41.4\t21.2\t2.3\t14525\t85000\t0.2156\t59243\tRomney\t59243\t0.000691219\t59243.0\n12670\t-104.159582\t47.71005\tSidney city\tMT\tMontana\tRichland County\t4751\t41.6\t17.4\t3.5\t20311\t102509\t0.2156\t59270\tRomney\t59270\t0.022648147\t59270.0\n12671\t-104.349018\t47.453777\tKnife River CDP\tMT\tMontana\tRichland County\t274\t42.7\t14.6\t3.7\t16131\t93571\t0.2156\t59262\tRomney\t59262\t0.001306166\t59262.0\n12672\t-104.050752\t47.851055\tFairview town\tMT\tMontana\tRichland County\t645\t42.4\t12.0\t2.6\t18964\t57308\t0.2156\t59221\tRomney\t59221\t0.003074733\t59221.0\n12673\t-105.64157\t48.092962\tWolf Point city\tMT\tMontana\tRoosevelt County\t2582\t32.5\t21.2\t12.3\t14706\t81667\t0.5681\t59201\tRomney\t59201\t0.012308465\t59201.0\n12674\t-104.492016\t48.335178000000006\tFroid town\tMT\tMontana\tRoosevelt County\t181\t51.2\t23.9\t4.7\t19186\t57778\t0.5681\t59226\tRomney\t59226\t0.000862832\t59226.0\n12675\t-104.515394\t48.147153\tCulbertson town\tMT\tMontana\tRoosevelt County\t658\t48.3\t19.7\t5.9\t18300\t67391\t0.5681\t59218\tRomney\t59218\t0.003136704\t59218.0\n12676\t-104.21983900000001\t48.139387\tBainville town\tMT\tMontana\tRoosevelt County\t145\t47.9\t20.0\t4.4\t17115\t63000\t0.5681\t59212\tRomney\t59212\t0.000691219\t59212.0\n12677\t-105.19915900000001\t48.110865999999994\tPoplar city\tMT\tMontana\tRoosevelt County\t852\t28.7\t15.7\t20.6\t12634\t62308\t0.5681\t59255\tRomney\t59255\t0.004061507\t59255.0\n12678\t-104.914298\t48.149454999999996\tBrockton town\tMT\tMontana\tRoosevelt County\t231\t28.8\t11.3\t29.5\t8952\t68000\t0.5681\t592HH\tRomney\t592HH\t0.001101183\t0.0\n12679\t-106.306601\t45.617028000000005\tAshland CDP\tMT\tMontana\tRosebud County\t464\t24.5\t32.5\t15.8\t13053\t38438\t0.4036\t59003\tRomney\t59003\t0.002211901\t59003.0\n12680\t-106.613373\t45.617616\tLame Deer CDP\tMT\tMontana\tRosebud County\t2036\t23.7\t14.3\t29.3\t9471\t76538\t0.4036\t59043\tRomney\t59043\t0.009705668\t59043.0\n12681\t-106.677178\t46.265871999999995\tForsyth city\tMT\tMontana\tRosebud County\t1920\t47.4\t17.3\t5.7\t21350\t89020\t0.4036\t59327\tRomney\t59327\t0.009152693\t59327.0\n12682\t-106.493284\t45.4155\tBirney CDP\tMT\tMontana\tRosebud County\t109\t23.5\t14.0\t28.6\t9460\t70000\t0.4036\t59012\tRomney\t59012\t0.000519606\t59012.0\n12683\t-106.627227\t45.89606\tColstrip city\tMT\tMontana\tRosebud County\t2242\t37.4\t26.9\t5.4\t24418\t101378\t0.4036\t59323\tRomney\t59323\t0.010687675\t59323.0\n12684\t-115.969067\t48.058268\tHeron CDP\tMT\tMontana\tSanders County\t168\t48.9\t16.3\t14.5\t17809\t209375\t0.2915\t59844\tRomney\t59844\t0.000800861\t59844.0\n12685\t-114.884421\t47.46043\tPlains town\tMT\tMontana\tSanders County\t1269\t46.4\t19.4\t15.6\t16327\t144262\t0.2915\t59859\tRomney\t59859\t0.006049358\t59859.0\n12686\t-115.338045\t47.600556\tThompson Falls city\tMT\tMontana\tSanders County\t1449\t46.3\t16.3\t10.2\t19004\t133904\t0.2915\t59873\tRomney\t59873\t0.006907423\t59873.0\n12687\t-115.77073600000001\t47.984815999999995\tNoxon CDP\tMT\tMontana\tSanders County\t259\t48.4\t16.2\t14.3\t17833\t210714\t0.2915\t59853\tRomney\t59853\t0.00123466\t59853.0\n12688\t-114.356971\t47.317228\tDixon CDP\tMT\tMontana\tSanders County\t244\t43.9\t16.5\t6.7\t15278\t104167\t0.2915\t59831\tRomney\t59831\t0.001163155\t59831.0\n12689\t-114.64070600000001\t47.694559000000005\tLonepine CDP\tMT\tMontana\tSanders County\t155\t55.2\t14.8\t9.6\t13223\t132143\t0.2915\t59848\tRomney\t59848\t0.000738889\t59848.0\n12690\t-115.584946\t47.831626\tTrout Creek CDP\tMT\tMontana\tSanders County\t267\t47.5\t19.3\t13.4\t17709\t196875\t0.2915\t59874\tRomney\t59874\t0.001272796\t59874.0\n12691\t-114.298449\t47.322590999999996\tOld Agency CDP\tMT\tMontana\tSanders County\t107\t26.0\t10.5\t21.6\t12071\t70000\t0.2915\t59831\tRomney\t59831\t0.000510072\t59831.0\n12692\t-114.671625\t47.609179\tHot Springs town\tMT\tMontana\tSanders County\t602\t55.0\t15.0\t9.1\t13195\t134926\t0.2915\t59848\tRomney\t59848\t0.002869751\t59848.0\n12693\t-114.798652\t47.38572\tParadise CDP\tMT\tMontana\tSanders County\t193\t48.4\t18.3\t11.4\t16671\t208333\t0.2915\t59859\tRomney\t59859\t0.000920036\t59859.0\n12694\t-104.467201\t48.602818\tReserve CDP\tMT\tMontana\tSheridan County\t32\t52.5\t29.2\t6.3\t20404\t100000\t0.3449\t59247\tRomney\t59247\t0.000152545\t59247.0\n12695\t-104.55642399999999\t48.775048\tPlentywood city\tMT\tMontana\tSheridan County\t1600\t50.1\t20.5\t1.7\t17755\t73553\t0.3449\t59254\tRomney\t59254\t0.007627244\t59254.0\n12696\t-104.055159\t48.870492999999996\tWestby town\tMT\tMontana\tSheridan County\t141\t52.0\t21.3\t1.4\t18912\t37500\t0.3449\t59275\tRomney\t59275\t0.0006721510000000001\t59275.0\n12697\t-104.501673\t48.502190999999996\tMedicine Lake town\tMT\tMontana\tSheridan County\t225\t48.5\t25.3\t2.5\t20426\t36429\t0.3449\t59247\tRomney\t59247\t0.001072581\t59247.0\n12698\t-104.78506\t48.888740000000006\tOutlook town\tMT\tMontana\tSheridan County\t66\t48.5\t14.9\t2.4\t21967\t65000\t0.3449\t59252\tRomney\t59252\t0.000314624\t59252.0\n12699\t-104.457299\t48.689816\tAntelope CDP\tMT\tMontana\tSheridan County\t35\t46.3\t16.0\t0.0\t21731\t65000\t0.3449\t59211\tRomney\t59211\t0.00016684599999999998\t59211.0\n12700\t-112.53943799999999\t46.036584000000005\tWalkerville town\tMT\tMontana\tSilver Bow County\t733\t41.3\t11.4\t10.1\t19915\t58281\t0.6479\t59701\tRomney\t59701\t0.0034942309999999996\t59701.0\n12701\t-112.657087\t45.901952\tButte-Silver Bow (balance)\tMT\tMontana\tSilver Bow County\t32334\t41.1\t21.9\t7.1\t20743\t109284\t0.6479\t59750\tRomney\t59750\t0.154137065\t59750.0\n12702\t-109.44801299999999\t45.523939\tAbsarokee CDP\tMT\tMontana\tStillwater County\t1320\t41.2\t17.4\t3.9\t23054\t167803\t0.2654\t59001\tRomney\t59001\t0.006292476\t59001.0\n12703\t-109.547513\t45.707188\tReed Point CDP\tMT\tMontana\tStillwater County\t221\t43.8\t19.4\t5.1\t15768\t112500\t0.2654\t59069\tRomney\t59069\t0.001053513\t59069.0\n12704\t-109.24826000000002\t45.634752\tColumbus town\tMT\tMontana\tStillwater County\t1871\t41.8\t18.1\t5.8\t19632\t140336\t0.2654\t59019\tRomney\t59019\t0.008919108\t59019.0\n12705\t-108.921879\t45.629212\tPark City CDP\tMT\tMontana\tStillwater County\t945\t42.6\t18.8\t6.0\t19050\t157661\t0.2654\t59063\tRomney\t59063\t0.004504841\t59063.0\n12706\t-109.948448\t45.834562\tBig Timber city\tMT\tMontana\tSweet Grass County\t1741\t43.8\t27.1\t2.3\t19452\t137500\t0.2244\t59011\tRomney\t59011\t0.008299395\t59011.0\n12707\t-109.78114599999999\t45.75863\tGreycliff CDP\tMT\tMontana\tSweet Grass County\t59\t43.8\t25.0\t2.6\t21220\t300000\t0.2244\t59033\tRomney\t59033\t0.000281255\t59033.0\n12708\t-111.71421699999999\t47.847491\tDutton town\tMT\tMontana\tTeton County\t366\t48.0\t20.1\t2.6\t18020\t88750\t0.3298\t59433\tRomney\t59433\t0.0017447320000000001\t59433.0\n12709\t-112.17621000000001\t47.815304\tChoteau city\tMT\tMontana\tTeton County\t1628\t47.6\t20.2\t4.5\t16869\t98194\t0.3298\t59422\tRomney\t59422\t0.007760721\t59422.0\n12710\t-111.98129499999999\t47.615446999999996\tFairfield town\tMT\tMontana\tTeton County\t592\t39.6\t24.2\t4.0\t18789\t111957\t0.3298\t59436\tRomney\t59436\t0.00282208\t59436.0\n12711\t-111.69411200000002\t47.720434999999995\tPower CDP\tMT\tMontana\tTeton County\t184\t45.2\t21.5\t4.0\t19014\t116250\t0.3298\t59468\tRomney\t59468\t0.000877133\t59468.0\n12712\t-111.90631\t48.878007000000004\tSunburst town\tMT\tMontana\tToole County\t372\t41.5\t22.3\t3.0\t16480\t75000\t0.2769\t59482\tRomney\t59482\t0.0017733339999999999\t59482.0\n12713\t-111.965751\t48.745805\tKevin town\tMT\tMontana\tToole County\t167\t37.8\t17.6\t5.4\t14846\t70000\t0.2769\t59454\tRomney\t59454\t0.0007960939999999999\t59454.0\n12714\t-111.856829\t48.508446\tShelby city\tMT\tMontana\tToole County\t3368\t41.1\t17.0\t3.4\t17157\t92222\t0.2769\t59474\tRomney\t59474\t0.016055348\t59474.0\n12715\t-107.23058400000001\t46.29102\tHysham town\tMT\tMontana\tTreasure County\t297\t46.3\t18.2\t4.5\t17103\t75000\t0.2505\t59038\tRomney\t59038\t0.001415807\t59038.0\n12716\t-106.632181\t48.198572\tGlasgow city\tMT\tMontana\tValley County\t3178\t45.4\t18.2\t4.2\t19413\t85613\t0.3589\t59230\tRomney\t59230\t0.015149613000000001\t59230.0\n12717\t-106.454876\t48.007264\tFort Peck town\tMT\tMontana\tValley County\t200\t49.0\t25.8\t3.6\t18571\t133654\t0.3589\t59223\tRomney\t59223\t0.000953405\t59223.0\n12718\t-106.40826399999999\t48.856945\tOpheim town\tMT\tMontana\tValley County\t91\t47.5\t18.2\t4.1\t19302\t70000\t0.3589\t59250\tRomney\t59250\t0.000433799\t59250.0\n12719\t-106.4987\t48.405205\tSt. Marie CDP\tMT\tMontana\tValley County\t164\t49.1\t19.8\t2.5\t25355\t77000\t0.3589\t59231\tRomney\t59231\t0.000781792\t59231.0\n12720\t-106.357523\t48.133781\tNashua town\tMT\tMontana\tValley County\t275\t51.6\t11.2\t5.7\t18795\t59286\t0.3589\t59248\tRomney\t59248\t0.0013109329999999998\t59248.0\n12721\t-106.04831599999999\t48.053467\tFrazer CDP\tMT\tMontana\tValley County\t384\t27.1\t13.3\t17.7\t9402\t41667\t0.3589\t59225\tRomney\t59225\t0.001830539\t59225.0\n12722\t-109.834305\t46.436815\tHarlowton city\tMT\tMontana\tWheatland County\t968\t46.0\t13.7\t4.1\t16351\t78182\t0.2742\t59036\tRomney\t59036\t0.004614483\t59036.0\n12723\t-109.754186\t46.678845\tJudith Gap city\tMT\tMontana\tWheatland County\t153\t40.8\t11.9\t8.6\t13347\t76250\t0.2742\t59453\tRomney\t59453\t0.000729355\t59453.0\n12724\t-104.18995600000001\t46.986599\tWibaux town\tMT\tMontana\tWibaux County\t500\t49.0\t14.9\t4.6\t20441\t46190\t0.1801\t59353\tRomney\t59353\t0.0023835139999999998\t59353.0\n12725\t-107.55708700000001\t46.128684\tCuster CDP\tMT\tMontana\tYellowstone County\t156\t42.5\t22.0\t4.5\t17715\t204167\t0.3837\t59024\tRomney\t59024\t0.0007436560000000001\t59024.0\n12726\t-108.14278\t45.951115\tBallantine CDP\tMT\tMontana\tYellowstone County\t394\t40.3\t13.4\t7.2\t20840\t146875\t0.3837\t59006\tRomney\t59006\t0.001878209\t59006.0\n12727\t-108.878978\t46.09859\tBroadview town\tMT\tMontana\tYellowstone County\t147\t42.0\t36.0\t6.0\t25305\t232500\t0.3837\t59015\tRomney\t59015\t0.000700753\t59015.0\n12728\t-108.162273\t45.962306\tWorden CDP\tMT\tMontana\tYellowstone County\t590\t44.6\t12.7\t7.7\t18046\t164224\t0.3837\t59006\tRomney\t59006\t0.002812546\t59006.0\n12729\t-108.420222\t45.819688\tLockwood CDP\tMT\tMontana\tYellowstone County\t4558\t35.5\t20.0\t8.5\t18076\t116055\t0.3837\t59105\tRomney\t59105\t0.021728111\t59105.0\n12730\t-108.539602\t45.790510999999995\tBillings city\tMT\tMontana\tYellowstone County\t96402\t38.9\t31.4\t4.5\t23555\t173499\t0.3837\t59102\tRomney\t59102\t0.45955097799999994\t59102.0\n12731\t-108.343483\t45.940645\tShepherd CDP\tMT\tMontana\tYellowstone County\t218\t36.0\t22.1\t8.8\t18930\t179167\t0.3837\t59079\tRomney\t59079\t0.001039212\t59079.0\n12732\t-108.769999\t45.673594\tLaurel city\tMT\tMontana\tYellowstone County\t6778\t40.5\t19.8\t5.9\t22308\t155772\t0.3837\t59044\tRomney\t59044\t0.032310912000000004\t59044.0\n12733\t-108.305803\t45.901506\tHuntley CDP\tMT\tMontana\tYellowstone County\t469\t40.8\t13.1\t7.3\t20534\t149554\t0.3837\t59037\tRomney\t59037\t0.002235736\t59037.0\n12734\t-98.44080799999999\t40.438377\tAyr village\tNE\tNebraska\tAdams County\t97\t42.9\t16.9\t2.0\t21120\t118750\t0.3206\t68925\tRomney\t68925\t0.00014119\t68925.0\n12735\t-98.658146\t40.619607\tKenesaw village\tNE\tNebraska\tAdams County\t942\t42.6\t17.3\t2.0\t18377\t98043\t0.3206\t68956\tRomney\t68956\t0.001371148\t68956.0\n12736\t-98.578064\t40.687335\tProsser village\tNE\tNebraska\tAdams County\t101\t43.1\t17.1\t2.0\t18462\t96667\t0.3206\t68955\tRomney\t68955\t0.00014701299999999998\t68955.0\n12737\t-98.650883\t40.464802\tHolstein village\tNE\tNebraska\tAdams County\t247\t42.1\t18.9\t2.4\t20740\t104688\t0.3206\t68950\tRomney\t68950\t0.000359526\t68950.0\n12738\t-98.39377900000001\t40.591546\tHastings city\tNE\tNebraska\tAdams County\t25373\t37.3\t24.2\t6.3\t22807\t108033\t0.3206\t68901\tRomney\t68901\t0.036932209\t68901.0\n12739\t-98.55839399999999\t40.469985\tRoseland village\tNE\tNebraska\tAdams County\t241\t41.2\t17.2\t2.4\t21005\t114773\t0.3206\t68973\tRomney\t68973\t0.000350793\t68973.0\n12740\t-98.50639100000001\t40.589893\tJuniata village\tNE\tNebraska\tAdams County\t844\t36.9\t16.5\t5.6\t18551\t132598\t0.3206\t68955\tRomney\t68955\t0.001228502\t68955.0\n12741\t-97.971752\t42.337709999999994\tBrunswick village\tNE\tNebraska\tAntelope County\t159\t37.5\t19.6\t2.2\t13263\t102083\t0.1767\t68720\tRomney\t68720\t0.00023143599999999998\t68720.0\n12742\t-98.029273\t42.129603\tNeligh city\tNE\tNebraska\tAntelope County\t1585\t46.4\t22.1\t4.8\t18747\t66842\t0.1767\t68756\tRomney\t68756\t0.00230708\t68756.0\n12743\t-98.12514\t42.332808\tRoyal village\tNE\tNebraska\tAntelope County\t67\t39.4\t14.0\t5.3\t14402\t104167\t0.1767\t68773\tRomney\t68773\t9.75e-05\t68773.0\n12744\t-98.189638\t42.170707\tClearwater village\tNE\tNebraska\tAntelope County\t343\t37.8\t14.5\t3.2\t17134\t52000\t0.1767\t68726\tRomney\t68726\t0.000499261\t68726.0\n12745\t-97.96714399999999\t42.070096\tOakdale village\tNE\tNebraska\tAntelope County\t310\t41.8\t7.4\t4.5\t14158\t29643\t0.1767\t68761\tRomney\t68761\t0.00045122699999999995\t68761.0\n12746\t-98.24114200000001\t42.336559\tOrchard village\tNE\tNebraska\tAntelope County\t349\t46.8\t18.3\t1.6\t15092\t34000\t0.1767\t68764\tRomney\t68764\t0.000507994\t68764.0\n12747\t-98.08256800000001\t41.983544\tElgin city\tNE\tNebraska\tAntelope County\t666\t44.6\t16.4\t1.8\t17841\t68958\t0.1767\t68636\tRomney\t68636\t0.00096941\t68636.0\n12748\t-101.692033\t41.571915000000004\tArthur village\tNE\tNebraska\tArthur County\t129\t45.2\t16.0\t8.2\t18555\t60000\t0.1145\t69121\tRomney\t69121\t0.000187769\t69121.0\n12749\t-103.722424\t41.548878\tHarrisburg CDP\tNE\tNebraska\tBanner County\t71\t45.4\t20.0\t2.8\t18481\t95000\t0.1338\t69345\tRomney\t69345\t0.00010334600000000001\t69345.0\n12750\t-99.8651\t41.938283\tBrewster village\tNE\tNebraska\tBlaine County\t26\t45.0\t10.5\t0.0\t14523\t20000\t0.0957\t68821\tRomney\t68821\t3.78e-05\t68821.0\n12751\t-100.10457199999999\t41.827098\tDunning village\tNE\tNebraska\tBlaine County\t99\t45.0\t12.9\t2.0\t14351\t42500\t0.0957\t68833\tRomney\t68833\t0.000144102\t68833.0\n12752\t-98.23738399999999\t41.6238\tPrimrose village\tNE\tNebraska\tBoone County\t59\t44.5\t14.0\t5.9\t17193\t52500\t0.2192\t68655\tRomney\t68655\t8.590000000000001e-05\t68655.0\n12753\t-98.002785\t41.689304\tAlbion city\tNE\tNebraska\tBoone County\t1826\t43.5\t18.1\t4.2\t19282\t83952\t0.2192\t68620\tRomney\t68620\t0.002657873\t68620.0\n12754\t-98.149336\t41.558952000000005\tCedar Rapids village\tNE\tNebraska\tBoone County\t346\t45.3\t14.1\t5.5\t17300\t49722\t0.2192\t68627\tRomney\t68627\t0.000503628\t68627.0\n12755\t-98.080926\t41.853497999999995\tPetersburg village\tNE\tNebraska\tBoone County\t400\t42.9\t11.1\t0.0\t17444\t56154\t0.2192\t68652\tRomney\t68652\t0.0005822280000000001\t68652.0\n12756\t-97.861152\t41.57143\tSt. Edward city\tNE\tNebraska\tBoone County\t693\t46.6\t12.8\t5.2\t15257\t46379\t0.2192\t68660\tRomney\t68660\t0.001008711\t68660.0\n12757\t-102.875436\t42.100215999999996\tAlliance city\tNE\tNebraska\tBox Butte County\t8189\t38.5\t19.1\t6.7\t24540\t88458\t0.3596\t69301\tRomney\t69301\t0.011919673\t69301.0\n12758\t-103.075827\t42.321071999999994\tHemingford village\tNE\tNebraska\tBox Butte County\t918\t43.7\t17.2\t6.2\t18925\t73000\t0.3596\t69348\tRomney\t69348\t0.0013362139999999998\t69348.0\n12759\t-98.569709\t42.946053000000006\tGross village\tNE\tNebraska\tBoyd County\t5\t0.0\t0.0\t0.0\t14476\t0\t0.1755\t68719\tRomney\t68719\t7.28e-06\t68719.0\n12760\t-98.329551\t42.830681\tMonowi village\tNE\tNebraska\tBoyd County\t2\t0.0\t0.0\t0.0\t14902\t0\t0.1755\t68746\tRomney\t68746\t2.91e-06\t68746.0\n12761\t-98.84784599999999\t42.912289\tButte village\tNE\tNebraska\tBoyd County\t324\t49.1\t12.1\t2.3\t15378\t35000\t0.1755\t68722\tRomney\t68722\t0.000471605\t68722.0\n12762\t-98.58317199999999\t42.840785\tBristow village\tNE\tNebraska\tBoyd County\t79\t45.0\t17.5\t4.7\t16060\t50000\t0.1755\t68719\tRomney\t68719\t0.00011499\t68719.0\n12763\t-98.467104\t42.831074\tLynch village\tNE\tNebraska\tBoyd County\t242\t46.6\t18.0\t3.9\t16027\t42143\t0.1755\t68746\tRomney\t68746\t0.00035224800000000005\t68746.0\n12764\t-99.096913\t42.96418\tNaper village\tNE\tNebraska\tBoyd County\t93\t49.2\t11.8\t2.0\t15361\t35000\t0.1755\t68755\tRomney\t68755\t0.000135368\t68755.0\n12765\t-98.828469\t42.946002\tAnoka village\tNE\tNebraska\tBoyd County\t9\t0.0\t16.7\t0.0\t16084\t0\t0.1755\t68722\tRomney\t68722\t1.31e-05\t68722.0\n12766\t-98.70074699999999\t42.874918\tSpencer village\tNE\tNebraska\tBoyd County\t486\t46.6\t17.6\t3.8\t16053\t44231\t0.1755\t68777\tRomney\t68777\t0.0007074080000000001\t68777.0\n12767\t-99.70271600000001\t42.535265\tLong Pine city\tNE\tNebraska\tBrown County\t316\t48.0\t19.1\t1.7\t17518\t60500\t0.1441\t69217\tRomney\t69217\t0.000459961\t69217.0\n12768\t-100.05628399999999\t42.572078999999995\tJohnstown village\tNE\tNebraska\tBrown County\t49\t46.3\t22.2\t3.6\t18694\t65000\t0.1441\t69214\tRomney\t69214\t7.13e-05\t69214.0\n12769\t-99.857301\t42.548517\tAinsworth city\tNE\tNebraska\tBrown County\t1722\t45.5\t21.3\t2.0\t18296\t65545\t0.1441\t69210\tRomney\t69210\t0.0025064939999999997\t69210.0\n12770\t-99.160464\t40.783887\tRiverdale village\tNE\tNebraska\tBuffalo County\t261\t42.6\t35.4\t3.6\t22821\t140278\t0.2758\t68870\tRomney\t68870\t0.00037990400000000003\t68870.0\n12771\t-99.083761\t40.699197\tKearney city\tNE\tNebraska\tBuffalo County\t29286\t29.5\t39.3\t4.5\t22522\t139094\t0.2758\t68847\tRomney\t68847\t0.042627859000000004\t68847.0\n12772\t-98.913679\t41.027184999999996\tRavenna city\tNE\tNebraska\tBuffalo County\t1435\t41.3\t22.4\t5.8\t16823\t75405\t0.2758\t68869\tRomney\t68869\t0.002088745\t68869.0\n12773\t-98.845748\t40.746371\tGibbon city\tNE\tNebraska\tBuffalo County\t1927\t35.9\t17.9\t3.5\t17102\t103095\t0.2758\t68840\tRomney\t68840\t0.002804886\t68840.0\n12774\t-99.389903\t40.927603999999995\tMiller village\tNE\tNebraska\tBuffalo County\t143\t41.1\t24.2\t2.7\t16100\t112500\t0.2758\t68858\tRomney\t68858\t0.000208147\t68858.0\n12775\t-99.37548699999999\t40.720029\tElm Creek village\tNE\tNebraska\tBuffalo County\t961\t37.4\t18.9\t3.5\t17956\t94231\t0.2758\t68836\tRomney\t68836\t0.001398804\t68836.0\n12776\t-98.730705\t40.778835\tShelton village\tNE\tNebraska\tBuffalo County\t1264\t36.1\t20.0\t6.8\t16769\t86207\t0.2758\t68876\tRomney\t68876\t0.0018398420000000002\t68876.0\n12777\t-99.269481\t40.838347999999996\tAmherst village\tNE\tNebraska\tBuffalo County\t292\t40.6\t27.4\t2.6\t19779\t114063\t0.2758\t68812\tRomney\t68812\t0.00042502699999999997\t68812.0\n12778\t-99.087581\t40.969912\tPleasanton village\tNE\tNebraska\tBuffalo County\t378\t41.8\t24.2\t2.9\t19489\t105625\t0.2758\t68866\tRomney\t68866\t0.000550206\t68866.0\n12779\t-96.466572\t41.835466\tOakland city\tNE\tNebraska\tBurt County\t1322\t46.7\t22.1\t2.8\t18475\t73065\t0.3825\t68045\tRomney\t68045\t0.001924265\t68045.0\n12780\t-96.471529\t41.936042\tLyons city\tNE\tNebraska\tBurt County\t844\t46.3\t15.2\t6.0\t17697\t61250\t0.3825\t68038\tRomney\t68038\t0.001228502\t68038.0\n12781\t-96.222424\t41.776097\tTekamah city\tNE\tNebraska\tBurt County\t1746\t45.4\t16.3\t4.0\t19280\t87159\t0.3825\t68061\tRomney\t68061\t0.002541427\t68061.0\n12782\t-96.250848\t42.007152000000005\tDecatur village\tNE\tNebraska\tBurt County\t529\t46.3\t17.2\t6.6\t19473\t67500\t0.3825\t68020\tRomney\t68020\t0.000769997\t68020.0\n12783\t-96.362356\t41.785175\tCraig village\tNE\tNebraska\tBurt County\t223\t43.0\t15.9\t2.5\t18784\t100000\t0.3825\t68019\tRomney\t68019\t0.000324592\t68019.0\n12784\t-96.94953100000001\t41.334077\tAbie village\tNE\tNebraska\tButler County\t94\t39.2\t9.2\t1.7\t17700\t67500\t0.2708\t68001\tRomney\t68001\t0.000136824\t68001.0\n12785\t-97.308617\t41.104659999999996\tSurprise village\tNE\tNebraska\tButler County\t50\t38.8\t14.3\t3.4\t19987\t90000\t0.2708\t68667\tRomney\t68667\t7.28e-05\t68667.0\n12786\t-97.127083\t41.254271\tDavid City\tNE\tNebraska\tButler County\t2556\t42.2\t15.4\t10.7\t19961\t85449\t0.2708\t68632\tRomney\t68632\t0.00372044\t68632.0\n12787\t-96.93233199999999\t41.412273\tLinwood village\tNE\tNebraska\tButler County\t103\t40.4\t8.5\t1.6\t17650\t67500\t0.2708\t68036\tRomney\t68036\t0.00014992399999999998\t68036.0\n12788\t-97.019001\t41.082709\tDwight village\tNE\tNebraska\tButler County\t232\t42.1\t12.9\t2.4\t20415\t91875\t0.2708\t68635\tRomney\t68635\t0.000337693\t68635.0\n12789\t-97.239901\t41.342026000000004\tBellwood village\tNE\tNebraska\tButler County\t414\t40.8\t13.9\t3.4\t17932\t90909\t0.2708\t68624\tRomney\t68624\t0.000602606\t68624.0\n12790\t-97.202945\t41.072105\tUlysses village\tNE\tNebraska\tButler County\t317\t41.0\t14.8\t2.8\t19787\t88000\t0.2708\t68669\tRomney\t68669\t0.000461416\t68669.0\n12791\t-96.960881\t41.283264\tBruno village\tNE\tNebraska\tButler County\t98\t40.0\t9.0\t1.7\t17598\t67500\t0.2708\t68014\tRomney\t68014\t0.00014264600000000002\t68014.0\n12792\t-97.163275\t41.175468\tGarrison village\tNE\tNebraska\tButler County\t77\t41.3\t15.1\t2.3\t19761\t80000\t0.2708\t68632\tRomney\t68632\t0.000112079\t68632.0\n12793\t-97.29739000000001\t41.198215999999995\tRising City village\tNE\tNebraska\tButler County\t358\t41.0\t13.7\t3.5\t17952\t88889\t0.2708\t68658\tRomney\t68658\t0.000521095\t68658.0\n12794\t-97.059031\t41.347407000000004\tOctavia village\tNE\tNebraska\tButler County\t127\t40.4\t8.1\t2.5\t17590\t67500\t0.2708\t68036\tRomney\t68036\t0.00018485799999999998\t68036.0\n12795\t-97.002289\t41.182915\tBrainard village\tNE\tNebraska\tButler County\t315\t42.2\t13.3\t2.4\t20382\t88750\t0.2708\t68626\tRomney\t68626\t0.000458505\t68626.0\n12796\t-96.166081\t40.919437\tManley village\tNE\tNebraska\tCass County\t206\t43.0\t34.0\t3.7\t24657\t170000\t0.3585\t68403\tRomney\t68403\t0.00029984799999999997\t68403.0\n12797\t-96.139237\t40.869062\tWeeping Water city\tNE\tNebraska\tCass County\t1180\t37.7\t17.9\t4.7\t22447\t90156\t0.3585\t68463\tRomney\t68463\t0.001717574\t68463.0\n12798\t-95.990073\t40.829572999999996\tNehawka village\tNE\tNebraska\tCass County\t262\t43.5\t18.3\t6.4\t22121\t105000\t0.3585\t68413\tRomney\t68413\t0.00038136\t68413.0\n12799\t-96.294646\t40.842548\tElmwood village\tNE\tNebraska\tCass County\t723\t40.2\t22.9\t6.1\t20673\t109545\t0.3585\t68349\tRomney\t68349\t0.001052378\t68349.0\n12800\t-96.280919\t40.9261\tMurdock village\tNE\tNebraska\tCass County\t283\t44.2\t24.7\t8.4\t23118\t112500\t0.3585\t68407\tRomney\t68407\t0.000411927\t68407.0\n12801\t-95.92140400000001\t40.814368\tUnion village\tNE\tNebraska\tCass County\t294\t43.5\t18.3\t6.3\t22093\t105147\t0.3585\t68455\tRomney\t68455\t0.00042793800000000005\t68455.0\n12802\t-96.119161\t40.796516\tAvoca village\tNE\tNebraska\tCass County\t269\t41.3\t16.2\t6.1\t22152\t93333\t0.3585\t68307\tRomney\t68307\t0.000391549\t68307.0\n12803\t-96.161262\t40.998084999999996\tLouisville village\tNE\tNebraska\tCass County\t1153\t39.1\t19.3\t4.8\t25104\t103006\t0.3585\t68037\tRomney\t68037\t0.001678274\t68037.0\n12804\t-95.927802\t40.916563000000004\tMurray village\tNE\tNebraska\tCass County\t516\t41.8\t24.8\t6.8\t24636\t100781\t0.3585\t68409\tRomney\t68409\t0.000751075\t68409.0\n12805\t-96.101712\t41.044996999999995\tCedar Creek village\tNE\tNebraska\tCass County\t543\t45.5\t29.5\t5.4\t31418\t166912\t0.3585\t68016\tRomney\t68016\t0.000790375\t68016.0\n12806\t-96.24689000000001\t41.002146\tSouth Bend village\tNE\tNebraska\tCass County\t85\t47.5\t29.7\t4.1\t28516\t133333\t0.3585\t68058\tRomney\t68058\t0.000123724\t68058.0\n12807\t-95.89269200000001\t41.006926\tPlattsmouth city\tNE\tNebraska\tCass County\t6850\t35.2\t18.6\t7.8\t22483\t94053\t0.3585\t68048\tRomney\t68048\t0.009970663000000001\t68048.0\n12808\t-96.386554\t40.872278\tAlvo village\tNE\tNebraska\tCass County\t149\t43.8\t24.8\t8.0\t23179\t114063\t0.3585\t68304\tRomney\t68304\t0.00021688\t68304.0\n12809\t-96.443107\t40.961604\tGreenwood village\tNE\tNebraska\tCass County\t631\t42.4\t16.4\t4.8\t23863\t95357\t0.3585\t68366\tRomney\t68366\t0.000918465\t68366.0\n12810\t-96.433152\t40.816293\tEagle village\tNE\tNebraska\tCass County\t1341\t33.2\t26.5\t2.5\t28129\t107902\t0.3585\t68347\tRomney\t68347\t0.0019519210000000001\t68347.0\n12811\t-97.094565\t42.428063\tLaurel city\tNE\tNebraska\tCedar County\t786\t47.2\t20.6\t4.3\t17537\t71875\t0.221\t68745\tRomney\t68745\t0.0011440789999999999\t68745.0\n12812\t-97.24905600000001\t42.810796999999994\tSt. Helena village\tNE\tNebraska\tCedar County\t77\t40.5\t12.2\t4.3\t16623\t60000\t0.221\t68774\tRomney\t68774\t0.000112079\t68774.0\n12813\t-97.357618\t42.377539\tRandolph city\tNE\tNebraska\tCedar County\t801\t44.4\t13.2\t4.1\t17616\t59310\t0.221\t68771\tRomney\t68771\t0.001165913\t68771.0\n12814\t-97.027191\t42.689491\tObert village\tNE\tNebraska\tCedar County\t44\t40.8\t13.8\t3.8\t16568\t60000\t0.221\t68757\tRomney\t68757\t6.4e-05\t68757.0\n12815\t-97.362626\t42.698291\tFordyce village\tNE\tNebraska\tCedar County\t160\t36.4\t14.6\t4.0\t14688\t75000\t0.221\t68736\tRomney\t68736\t0.000232891\t68736.0\n12816\t-97.266514\t42.620844\tHartington city\tNE\tNebraska\tCedar County\t1629\t39.6\t14.7\t3.0\t18249\t75943\t0.221\t68739\tRomney\t68739\t0.002371126\t68739.0\n12817\t-97.16970699999999\t42.739905\tWynot village\tNE\tNebraska\tCedar County\t170\t40.2\t12.7\t3.9\t16707\t65000\t0.221\t68792\tRomney\t68792\t0.00024744700000000003\t68792.0\n12818\t-97.202715\t42.506514\tColeridge village\tNE\tNebraska\tCedar County\t496\t50.3\t23.0\t3.0\t20397\t51000\t0.221\t68727\tRomney\t68727\t0.000721963\t68727.0\n12819\t-97.207347\t42.411834000000006\tBelden village\tNE\tNebraska\tCedar County\t114\t36.3\t18.8\t4.5\t16780\t86667\t0.221\t68717\tRomney\t68717\t0.000165935\t68717.0\n12820\t-97.469052\t42.456194\tMagnet village\tNE\tNebraska\tCedar County\t70\t41.5\t10.6\t4.7\t16142\t85000\t0.221\t68747\tRomney\t68747\t0.00010189\t68747.0\n12821\t-101.371961\t40.416247999999996\tWauneta village\tNE\tNebraska\tChase County\t571\t48.8\t14.9\t3.2\t18849\t51667\t0.136\t69045\tRomney\t69045\t0.000831131\t69045.0\n12822\t-101.637734\t40.515838\tImperial city\tNE\tNebraska\tChase County\t1837\t43.6\t22.0\t2.8\t21470\t82083\t0.136\t69033\tRomney\t69033\t0.002673884\t69033.0\n12823\t-101.97910300000001\t40.572627000000004\tLamar village\tNE\tNebraska\tChase County\t17\t46.3\t25.0\t0.0\t17925\t80000\t0.136\t69023\tRomney\t69023\t2.47e-05\t69023.0\n12824\t-100.753507\t42.926195\tCrookston village\tNE\tNebraska\tCherry County\t103\t38.8\t17.1\t3.2\t20756\t82500\t0.1423\t69212\tRomney\t69212\t0.00014992399999999998\t69212.0\n12825\t-100.237555\t42.638507000000004\tWood Lake village\tNE\tNebraska\tCherry County\t64\t40.0\t18.6\t2.5\t17162\t120000\t0.1423\t69221\tRomney\t69221\t9.32e-05\t69221.0\n12826\t-100.549701\t42.873563\tValentine city\tNE\tNebraska\tCherry County\t2753\t42.8\t20.8\t1.8\t19528\t87396\t0.1423\t69201\tRomney\t69201\t0.004007188\t69201.0\n12827\t-101.10180600000001\t42.927358\tNenzel village\tNE\tNebraska\tCherry County\t11\t50.0\t12.5\t0.0\t16535\t0\t0.1423\t69216\tRomney\t69216\t1.6e-05\t69216.0\n12828\t-100.95732199999999\t42.939101\tKilgore village\tNE\tNebraska\tCherry County\t86\t45.4\t16.1\t3.5\t16084\t46667\t0.1423\t69216\tRomney\t69216\t0.000125179\t69216.0\n12829\t-101.248875\t42.937769\tCody village\tNE\tNebraska\tCherry County\t130\t46.8\t16.8\t3.5\t16014\t47000\t0.1423\t69211\tRomney\t69211\t0.00018922400000000002\t69211.0\n12830\t-101.69972800000001\t42.923004\tMerriman village\tNE\tNebraska\tCherry County\t103\t46.4\t16.4\t3.0\t16005\t47500\t0.1423\t69218\tRomney\t69218\t0.00014992399999999998\t69218.0\n12831\t-102.638533\t41.148911\tLodgepole village\tNE\tNebraska\tCheyenne County\t335\t46.9\t15.0\t0.0\t18473\t74000\t0.2332\t69149\tRomney\t69149\t0.00048761599999999996\t69149.0\n12832\t-102.970428\t41.408503\tDalton village\tNE\tNebraska\tCheyenne County\t329\t45.3\t24.2\t1.7\t19877\t81667\t0.2332\t69131\tRomney\t69131\t0.00047888300000000004\t69131.0\n12833\t-103.313682\t41.218308\tPotter village\tNE\tNebraska\tCheyenne County\t370\t39.3\t17.5\t2.6\t18117\t70625\t0.2332\t69156\tRomney\t69156\t0.000538561\t69156.0\n12834\t-102.96986700000001\t41.134176000000004\tSidney city\tNE\tNebraska\tCheyenne County\t6514\t38.8\t19.6\t4.8\t22369\t88804\t0.2332\t69162\tRomney\t69162\t0.009481591\t69162.0\n12835\t-102.97448399999999\t41.321449\tGurley village\tNE\tNebraska\tCheyenne County\t226\t45.3\t23.9\t1.7\t19872\t82143\t0.2332\t69141\tRomney\t69141\t0.00032895900000000003\t69141.0\n12836\t-97.858199\t40.607209999999995\tSutton city\tNE\tNebraska\tClay County\t1478\t43.6\t21.3\t5.2\t20153\t91667\t0.2263\t68979\tRomney\t68979\t0.002151334\t68979.0\n12837\t-97.971098\t40.368119\tEdgar city\tNE\tNebraska\tClay County\t518\t45.8\t16.0\t5.1\t20193\t65250\t0.2263\t68935\tRomney\t68935\t0.0007539860000000001\t68935.0\n12838\t-98.273312\t40.680208\tTrumbull village\tNE\tNebraska\tClay County\t207\t42.5\t17.5\t6.7\t17739\t65000\t0.2263\t68980\tRomney\t68980\t0.000301303\t68980.0\n12839\t-97.93885\t40.602907\tSaronville village\tNE\tNebraska\tClay County\t58\t40.8\t10.5\t3.6\t16191\t100000\t0.2263\t68975\tRomney\t68975\t8.44e-05\t68975.0\n12840\t-98.05502800000001\t40.525154\tClay Center city\tNE\tNebraska\tClay County\t841\t42.6\t26.7\t2.7\t20032\t89500\t0.2263\t68933\tRomney\t68933\t0.001224135\t68933.0\n12841\t-98.103175\t40.432368\tFairfield city\tNE\tNebraska\tClay County\t505\t44.1\t21.7\t2.7\t19399\t69412\t0.2263\t68938\tRomney\t68938\t0.000735063\t68938.0\n12842\t-98.139195\t40.354711\tDeweese village\tNE\tNebraska\tClay County\t78\t41.3\t17.0\t5.1\t18185\t70000\t0.2263\t68934\tRomney\t68934\t0.000113535\t68934.0\n12843\t-97.839157\t40.398395\tOng village\tNE\tNebraska\tClay County\t64\t45.0\t15.2\t3.8\t20303\t65000\t0.2263\t68452\tRomney\t68452\t9.32e-05\t68452.0\n12844\t-98.096101\t40.620055\tHarvard city\tNE\tNebraska\tClay County\t973\t42.4\t17.6\t6.8\t17770\t64524\t0.2263\t68944\tRomney\t68944\t0.001416271\t68944.0\n12845\t-98.254573\t40.502739\tGlenvil village\tNE\tNebraska\tClay County\t323\t41.1\t17.4\t4.3\t18228\t76250\t0.2263\t68941\tRomney\t68941\t0.00047015\t68941.0\n12846\t-97.239997\t41.702328\tLeigh village\tNE\tNebraska\tColfax County\t463\t43.3\t7.8\t5.1\t17378\t66316\t0.3157\t68643\tRomney\t68643\t0.000673929\t68643.0\n12847\t-97.004245\t41.724259\tHowells village\tNE\tNebraska\tColfax County\t593\t44.1\t12.9\t1.9\t17350\t71000\t0.3157\t68641\tRomney\t68641\t0.000863154\t68641.0\n12848\t-97.215189\t41.436921000000005\tRichland village\tNE\tNebraska\tColfax County\t87\t38.2\t12.1\t3.4\t19282\t92500\t0.3157\t68624\tRomney\t68624\t0.000126635\t68624.0\n12849\t-97.121897\t41.724213\tClarkson city\tNE\tNebraska\tColfax County\t633\t44.6\t14.9\t1.6\t17454\t59250\t0.3157\t68629\tRomney\t68629\t0.000921377\t68629.0\n12850\t-97.06089\t41.447719\tSchuyler city\tNE\tNebraska\tColfax County\t5542\t32.9\t16.5\t7.6\t16436\t87071\t0.3157\t68661\tRomney\t68661\t0.008066776\t68661.0\n12851\t-96.915873\t41.464329\tRogers village\tNE\tNebraska\tColfax County\t90\t39.6\t12.1\t3.6\t16505\t103125\t0.3157\t68659\tRomney\t68659\t0.000131001\t68659.0\n12852\t-96.573184\t42.010556\tBancroft village\tNE\tNebraska\tCuming County\t496\t43.2\t14.7\t2.4\t17401\t72917\t0.2593\t68004\tRomney\t68004\t0.000721963\t68004.0\n12853\t-96.914086\t41.988065\tWisner city\tNE\tNebraska\tCuming County\t1233\t42.4\t21.3\t2.2\t19046\t73929\t0.2593\t68791\tRomney\t68791\t0.001794719\t68791.0\n12854\t-96.707278\t41.837451\tWest Point city\tNE\tNebraska\tCuming County\t3484\t39.8\t11.9\t5.2\t19475\t96040\t0.2593\t68788\tRomney\t68788\t0.00507121\t68788.0\n12855\t-96.809363\t41.930011\tBeemer village\tNE\tNebraska\tCuming County\t738\t43.3\t14.6\t2.5\t17398\t72500\t0.2593\t68716\tRomney\t68716\t0.001074212\t68716.0\n12856\t-99.298817\t41.222186\tMason City village\tNE\tNebraska\tCuster County\t155\t40.0\t16.7\t2.1\t17370\t80000\t0.19699999999999998\t68855\tRomney\t68855\t0.000225614\t68855.0\n12857\t-100.1943\t41.42383\tArnold village\tNE\tNebraska\tCuster County\t539\t45.4\t14.5\t1.7\t18384\t62667\t0.19699999999999998\t69120\tRomney\t69120\t0.000784553\t69120.0\n12858\t-99.92019300000001\t41.291401\tCallaway village\tNE\tNebraska\tCuster County\t567\t49.2\t15.9\t1.7\t16066\t80652\t0.19699999999999998\t68825\tRomney\t68825\t0.000825309\t68825.0\n12859\t-99.242991\t41.557198\tComstock village\tNE\tNebraska\tCuster County\t91\t40.5\t16.7\t2.1\t16598\t60000\t0.19699999999999998\t68828\tRomney\t68828\t0.000132457\t68828.0\n12860\t-99.864602\t41.618473\tAnselmo village\tNE\tNebraska\tCuster County\t155\t42.5\t20.2\t2.0\t15366\t71667\t0.19699999999999998\t68813\tRomney\t68813\t0.000225614\t68813.0\n12861\t-99.382545\t41.287917\tAnsley village\tNE\tNebraska\tCuster County\t491\t41.7\t15.7\t4.5\t17382\t32333\t0.19699999999999998\t68814\tRomney\t68814\t0.000714685\t68814.0\n12862\t-99.37049\t41.641334\tSargent city\tNE\tNebraska\tCuster County\t668\t48.3\t17.4\t4.2\t16849\t31974\t0.19699999999999998\t68874\tRomney\t68874\t0.000972322\t68874.0\n12863\t-99.761967\t41.141659999999995\tOconto village\tNE\tNebraska\tCuster County\t124\t46.6\t20.2\t3.4\t16513\t92500\t0.19699999999999998\t68860\tRomney\t68860\t0.000180491\t68860.0\n12864\t-99.76100100000001\t41.485191\tMerna village\tNE\tNebraska\tCuster County\t341\t45.1\t22.5\t4.0\t19043\t77000\t0.19699999999999998\t68856\tRomney\t68856\t0.00049635\t68856.0\n12865\t-99.639486\t41.405121\tBroken Bow city\tNE\tNebraska\tCuster County\t3389\t44.4\t21.2\t5.5\t20141\t76099\t0.19699999999999998\t68822\tRomney\t68822\t0.004932931\t68822.0\n12866\t-99.500613\t41.350854999999996\tBerwyn village\tNE\tNebraska\tCuster County\t116\t40.0\t16.9\t2.7\t17481\t70000\t0.19699999999999998\t68819\tRomney\t68819\t0.00016884599999999998\t68819.0\n12867\t-96.413519\t42.464954\tSouth Sioux City\tNE\tNebraska\tDakota County\t12055\t32.1\t16.0\t6.1\t22132\t93505\t0.4762\t68776\tRomney\t68776\t0.017546911000000002\t68776.0\n12868\t-96.491054\t42.322425\tHomer village\tNE\tNebraska\tDakota County\t558\t41.4\t15.4\t3.6\t19152\t93182\t0.4762\t68030\tRomney\t68030\t0.0008122089999999999\t68030.0\n12869\t-96.41754300000001\t42.416191\tDakota City\tNE\tNebraska\tDakota County\t1890\t28.9\t13.1\t2.9\t16577\t70769\t0.4762\t68731\tRomney\t68731\t0.00275103\t68731.0\n12870\t-96.723995\t42.281869\tEmerson village\tNE\tNebraska\tDakota County\t787\t38.9\t14.1\t4.3\t18601\t81389\t0.4762\t68733\tRomney\t68733\t0.001145535\t68733.0\n12871\t-96.591184\t42.38584\tHubbard village\tNE\tNebraska\tDakota County\t230\t41.3\t15.7\t3.7\t21628\t106667\t0.4762\t68741\tRomney\t68741\t0.000334781\t68741.0\n12872\t-96.565875\t42.448797\tJackson village\tNE\tNebraska\tDakota County\t201\t41.4\t15.2\t3.4\t21675\t106667\t0.4762\t68743\tRomney\t68743\t0.00029257\t68743.0\n12873\t-103.256703\t42.783756\tWhitney village\tNE\tNebraska\tDawes County\t87\t37.5\t23.2\t4.4\t18482\t90000\t0.3036\t69367\tRomney\t69367\t0.000126635\t69367.0\n12874\t-103.00160799999999\t42.827215\tChadron city\tNE\tNebraska\tDawes County\t5313\t28.5\t34.1\t4.4\t20982\t80871\t0.3036\t69337\tRomney\t69337\t0.00773345\t69337.0\n12875\t-103.416009\t42.684738\tCrawford city\tNE\tNebraska\tDawes County\t1036\t44.1\t16.4\t8.3\t18151\t45156\t0.3036\t69339\tRomney\t69339\t0.0015079720000000002\t69339.0\n12876\t-99.537465\t40.740598999999996\tOverton village\tNE\tNebraska\tDawson County\t699\t40.8\t17.1\t3.7\t18089\t82105\t0.2798\t68863\tRomney\t68863\t0.001017444\t68863.0\n12877\t-100.21544399999999\t40.706559000000006\tFarnam village\tNE\tNebraska\tDawson County\t203\t45.4\t21.7\t4.1\t20044\t115278\t0.2798\t69029\tRomney\t69029\t0.000295481\t69029.0\n12878\t-99.987104\t40.862739000000005\tCozad city\tNE\tNebraska\tDawson County\t4010\t39.0\t19.2\t5.4\t21732\t76990\t0.2798\t69130\tRomney\t69130\t0.005836841\t69130.0\n12879\t-99.624013\t41.012067\tEddyville village\tNE\tNebraska\tDawson County\t96\t37.9\t15.9\t3.9\t17062\t78333\t0.2798\t68834\tRomney\t68834\t0.000139735\t68834.0\n12880\t-99.74337\t40.779012\tLexington city\tNE\tNebraska\tDawson County\t10584\t30.2\t16.0\t8.7\t16634\t88640\t0.2798\t68850\tRomney\t68850\t0.015405766000000001\t68850.0\n12881\t-100.159531\t40.928177000000005\tGothenburg city\tNE\tNebraska\tDawson County\t3565\t38.8\t21.3\t4.1\t21370\t90389\t0.2798\t69138\tRomney\t69138\t0.005189111\t69138.0\n12882\t-99.508085\t40.949031\tSumner village\tNE\tNebraska\tDawson County\t236\t39.1\t16.1\t4.8\t17130\t78571\t0.2798\t68878\tRomney\t68878\t0.000343515\t68878.0\n12883\t-102.467161\t41.094369\tChappell city\tNE\tNebraska\tDeuel County\t928\t46.7\t20.6\t4.2\t20610\t66081\t0.2114\t69129\tRomney\t69129\t0.00135077\t69129.0\n12884\t-102.07539799999999\t41.063156\tBig Springs village\tNE\tNebraska\tDeuel County\t383\t49.8\t14.0\t2.5\t20116\t79167\t0.2114\t69122\tRomney\t69122\t0.000557484\t69122.0\n12885\t-96.994926\t42.41538\tDixon village\tNE\tNebraska\tDixon County\t104\t42.5\t14.3\t5.9\t17491\t85000\t0.3239\t68732\tRomney\t68732\t0.000151379\t68732.0\n12886\t-96.73557199999999\t42.457240000000006\tWaterbury village\tNE\tNebraska\tDixon County\t94\t40.8\t9.7\t4.3\t18841\t80000\t0.3239\t68785\tRomney\t68785\t0.000136824\t68785.0\n12887\t-96.980901\t42.690478999999996\tMaskell village\tNE\tNebraska\tDixon County\t62\t43.1\t14.0\t6.3\t18085\t70000\t0.3239\t68757\tRomney\t68757\t9.02e-05\t68757.0\n12888\t-96.831549\t42.508359000000006\tMartinsburg village\tNE\tNebraska\tDixon County\t95\t42.9\t13.6\t7.8\t18156\t65000\t0.3239\t68710\tRomney\t68710\t0.000138279\t68710.0\n12889\t-96.84317\t42.41445\tAllen village\tNE\tNebraska\tDixon County\t434\t40.2\t10.0\t3.8\t18845\t80000\t0.3239\t68710\tRomney\t68710\t0.0006317180000000001\t68710.0\n12890\t-96.709158\t42.564658\tPonca city\tNE\tNebraska\tDixon County\t1023\t41.5\t20.9\t3.1\t17921\t96875\t0.3239\t68770\tRomney\t68770\t0.0014890489999999999\t68770.0\n12891\t-96.874484\t42.652539000000004\tNewcastle village\tNE\tNebraska\tDixon County\t281\t43.1\t13.4\t5.4\t16730\t74000\t0.3239\t68757\tRomney\t68757\t0.000409016\t68757.0\n12892\t-96.989111\t42.383795\tConcord village\tNE\tNebraska\tDixon County\t154\t41.8\t14.4\t5.3\t17497\t90833\t0.3239\t68728\tRomney\t68728\t0.000224158\t68728.0\n12893\t-96.86735999999999\t42.268589\tWakefield city\tNE\tNebraska\tDixon County\t1380\t40.7\t13.5\t7.8\t16345\t80806\t0.3239\t68784\tRomney\t68784\t0.002008688\t68784.0\n12894\t-96.78277\t41.464919\tNorth Bend city\tNE\tNebraska\tDodge County\t1177\t45.5\t15.0\t4.4\t20845\t86170\t0.3795\t68649\tRomney\t68649\t0.001713207\t68649.0\n12895\t-96.504325\t41.609035\tWinslow village\tNE\tNebraska\tDodge County\t97\t46.3\t15.5\t3.8\t19591\t95000\t0.3795\t68031\tRomney\t68031\t0.00014119\t68031.0\n12896\t-96.50202900000001\t41.415976\tInglewood village\tNE\tNebraska\tDodge County\t385\t38.4\t13.4\t6.9\t20575\t69167\t0.3795\t68025\tRomney\t68025\t0.000560395\t68025.0\n12897\t-96.505504\t41.734466\tUehling village\tNE\tNebraska\tDodge County\t262\t43.5\t18.8\t6.2\t16586\t108654\t0.3795\t68063\tRomney\t68063\t0.00038136\t68063.0\n12898\t-96.66416\t41.66514\tScribner city\tNE\tNebraska\tDodge County\t975\t43.6\t15.0\t4.5\t16831\t66250\t0.3795\t68057\tRomney\t68057\t0.0014191820000000002\t68057.0\n12899\t-96.548426\t41.611422999999995\tHooper city\tNE\tNebraska\tDodge County\t774\t46.1\t15.1\t3.4\t19527\t93438\t0.3795\t68031\tRomney\t68031\t0.001126612\t68031.0\n12900\t-96.786426\t41.704382\tSnyder village\tNE\tNebraska\tDodge County\t300\t42.4\t14.6\t4.1\t19514\t75714\t0.3795\t68664\tRomney\t68664\t0.00043667099999999997\t68664.0\n12901\t-96.470686\t41.534898\tNickerson village\tNE\tNebraska\tDodge County\t433\t34.9\t14.7\t4.8\t17946\t109375\t0.3795\t68044\tRomney\t68044\t0.0006302619999999999\t68044.0\n12902\t-96.880429\t41.721849\tDodge village\tNE\tNebraska\tDodge County\t662\t42.2\t14.8\t4.3\t19472\t75179\t0.3795\t68633\tRomney\t68633\t0.000963588\t68633.0\n12903\t-96.493075\t41.441342999999996\tFremont city\tNE\tNebraska\tDodge County\t25412\t38.4\t19.6\t5.7\t23676\t118364\t0.3795\t68025\tRomney\t68025\t0.036988976\t68025.0\n12904\t-96.245201\t41.271240999999996\tElkhorn city\tNE\tNebraska\tDouglas County\t6163\t37.7\t38.5\t3.6\t33784\t145710\t0.4754\t68022\tRomney\t68022\t0.008970686\t68022.0\n12905\t-96.02596199999999\t41.26424\tOmaha city\tNE\tNebraska\tDouglas County\t390116\t35.0\t32.5\t7.0\t26527\t99555\t0.4754\t68114\tRomney\t68114\t0.5678416279999999\t68114.0\n12906\t-96.286089\t41.287397999999996\tWaterloo village\tNE\tNebraska\tDouglas County\t469\t41.6\t20.2\t7.1\t28237\t90000\t0.4754\t68069\tRomney\t68069\t0.000682663\t68069.0\n12907\t-96.03535699999999\t41.200457\tRalston city\tNE\tNebraska\tDouglas County\t6929\t37.9\t30.7\t4.7\t27466\t106691\t0.4754\t68127\tRomney\t68127\t0.010085653\t68127.0\n12908\t-96.132858\t41.256838\tBoys Town village\tNE\tNebraska\tDouglas County\t915\t16.4\t50.5\t0.0\t14766\t450000\t0.4754\t68010\tRomney\t68010\t0.0013318479999999998\t68010.0\n12909\t-96.352008\t41.315893\tValley city\tNE\tNebraska\tDouglas County\t1851\t40.3\t20.8\t5.3\t24265\t89074\t0.4754\t68064\tRomney\t68064\t0.0026942620000000002\t68064.0\n12910\t-96.160163\t41.366452\tBennington city\tNE\tNebraska\tDouglas County\t967\t40.6\t27.3\t3.3\t26721\t119444\t0.4754\t68007\tRomney\t68007\t0.0014075370000000002\t68007.0\n12911\t-101.535426\t40.051649\tBenkelman city\tNE\tNebraska\tDundy County\t1018\t49.4\t18.1\t2.8\t19158\t51765\t0.1787\t69021\tRomney\t69021\t0.0014817720000000001\t69021.0\n12912\t-101.938662\t40.01209\tHaigler village\tNE\tNebraska\tDundy County\t185\t42.5\t17.8\t3.1\t16874\t50000\t0.1787\t69030\tRomney\t69030\t0.000269281\t69030.0\n12913\t-97.587103\t40.414918\tStrang village\tNE\tNebraska\tFillmore County\t27\t38.8\t21.1\t0.0\t21110\t70000\t0.2803\t68444\tRomney\t68444\t3.929999999999999e-05\t68444.0\n12914\t-97.388244\t40.500124\tMilligan village\tNE\tNebraska\tFillmore County\t283\t45.3\t14.9\t3.9\t19313\t70000\t0.2803\t68406\tRomney\t68406\t0.000411927\t68406.0\n12915\t-97.60122199999999\t40.527021000000005\tGeneva city\tNE\tNebraska\tFillmore County\t2066\t44.1\t19.3\t3.6\t20313\t75769\t0.2803\t68361\tRomney\t68361\t0.00300721\t68361.0\n12916\t-97.585275\t40.635777000000004\tFairmont village\tNE\tNebraska\tFillmore County\t663\t45.7\t19.4\t4.6\t18016\t54444\t0.2803\t68354\tRomney\t68354\t0.000965044\t68354.0\n12917\t-97.71465500000001\t40.629785\tGrafton village\tNE\tNebraska\tFillmore County\t128\t43.4\t18.0\t1.4\t21110\t80000\t0.2803\t68365\tRomney\t68365\t0.000186313\t68365.0\n12918\t-97.45232800000001\t40.413681\tOhiowa village\tNE\tNebraska\tFillmore County\t128\t45.7\t15.2\t4.3\t19246\t70000\t0.2803\t68416\tRomney\t68416\t0.000186313\t68416.0\n12919\t-97.723924\t40.416381\tShickley village\tNE\tNebraska\tFillmore County\t317\t43.7\t18.7\t1.7\t21094\t79167\t0.2803\t68436\tRomney\t68436\t0.000461416\t68436.0\n12920\t-97.448605\t40.64462\tExeter village\tNE\tNebraska\tFillmore County\t683\t45.6\t19.5\t4.5\t18021\t54722\t0.2803\t68351\tRomney\t68351\t0.000994155\t68351.0\n12921\t-98.759649\t40.089743\tRiverton village\tNE\tNebraska\tFranklin County\t126\t44.7\t12.6\t3.0\t14050\t35000\t0.25\t68972\tRomney\t68972\t0.00018340200000000002\t68972.0\n12922\t-98.951436\t40.096585\tFranklin city\tNE\tNebraska\tFranklin County\t1061\t48.8\t22.8\t5.3\t17578\t56296\t0.25\t68939\tRomney\t68939\t0.001544361\t68939.0\n12923\t-98.73150799999999\t40.296952000000005\tCampbell village\tNE\tNebraska\tFranklin County\t334\t45.7\t19.9\t2.4\t16343\t46250\t0.25\t68932\tRomney\t68932\t0.000486161\t68932.0\n12924\t-99.038311\t40.093855\tBloomington village\tNE\tNebraska\tFranklin County\t108\t44.7\t12.3\t3.5\t14010\t36250\t0.25\t68929\tRomney\t68929\t0.000157202\t68929.0\n12925\t-98.902292\t40.319464\tUpland village\tNE\tNebraska\tFranklin County\t155\t45.3\t18.8\t2.1\t20552\t65000\t0.25\t68981\tRomney\t68981\t0.000225614\t68981.0\n12926\t-99.138564\t40.074738\tNaponee village\tNE\tNebraska\tFranklin County\t115\t44.7\t11.4\t3.3\t14014\t37500\t0.25\t68960\tRomney\t68960\t0.000167391\t68960.0\n12927\t-99.045477\t40.337834\tHildreth village\tNE\tNebraska\tFranklin County\t321\t44.9\t19.1\t2.5\t20513\t66111\t0.25\t68947\tRomney\t68947\t0.00046723800000000003\t68947.0\n12928\t-100.400327\t40.689919\tMoorefield village\tNE\tNebraska\tFrontier County\t48\t33.8\t21.9\t3.6\t15725\t60000\t0.2077\t69039\tRomney\t69039\t6.99e-05\t69039.0\n12929\t-100.51169\t40.633774\tCurtis city\tNE\tNebraska\tFrontier County\t769\t33.8\t21.0\t3.1\t15705\t58696\t0.2077\t69025\tRomney\t69025\t0.001119334\t69025.0\n12930\t-100.029591\t40.664371\tEustis village\tNE\tNebraska\tFrontier County\t411\t44.1\t17.7\t1.9\t19653\t83333\t0.2077\t69028\tRomney\t69028\t0.00059824\t69028.0\n12931\t-100.384426\t40.533609999999996\tStockville village\tNE\tNebraska\tFrontier County\t32\t45.0\t16.7\t4.8\t23123\t95000\t0.2077\t69042\tRomney\t69042\t4.66e-05\t69042.0\n12932\t-100.622159\t40.658\tMaywood village\tNE\tNebraska\tFrontier County\t290\t40.2\t17.3\t5.6\t18679\t73333\t0.2077\t69038\tRomney\t69038\t0.000422116\t69038.0\n12933\t-99.62571700000001\t40.253820000000005\tOxford village\tNE\tNebraska\tFurnas County\t760\t46.0\t14.9\t4.8\t17315\t54833\t0.1888\t68967\tRomney\t68967\t0.001106234\t68967.0\n12934\t-100.170727\t40.283425\tCambridge city\tNE\tNebraska\tFurnas County\t1013\t46.7\t22.8\t3.3\t20994\t58636\t0.1888\t69022\tRomney\t69022\t0.001474494\t69022.0\n12935\t-99.897948\t40.304846000000005\tArapahoe city\tNE\tNebraska\tFurnas County\t1119\t45.5\t21.7\t6.3\t20279\t63810\t0.1888\t68922\tRomney\t68922\t0.0016287839999999999\t68922.0\n12936\t-99.82764300000001\t40.138053\tBeaver City\tNE\tNebraska\tFurnas County\t536\t50.8\t17.9\t4.0\t19055\t45909\t0.1888\t68926\tRomney\t68926\t0.0007801860000000001\t68926.0\n12937\t-99.776303\t40.277572\tEdison village\tNE\tNebraska\tFurnas County\t129\t46.6\t13.3\t5.4\t17359\t49000\t0.1888\t68936\tRomney\t68936\t0.000187769\t68936.0\n12938\t-100.106664\t40.111921\tWilsonville village\tNE\tNebraska\tFurnas County\t110\t41.8\t17.1\t5.1\t17385\t71667\t0.1888\t69046\tRomney\t69046\t0.000160113\t69046.0\n12939\t-99.971174\t40.131259\tHendley village\tNE\tNebraska\tFurnas County\t35\t42.5\t20.0\t5.3\t17603\t65000\t0.1888\t68946\tRomney\t68946\t5.0900000000000004e-05\t68946.0\n12940\t-100.01020799999999\t40.304152\tHolbrook village\tNE\tNebraska\tFurnas County\t231\t43.4\t22.2\t5.1\t20240\t49643\t0.1888\t68948\tRomney\t68948\t0.00033623699999999997\t68948.0\n12941\t-96.572806\t40.048972\tBarneston village\tNE\tNebraska\tGage County\t119\t42.5\t12.2\t10.5\t18327\t60000\t0.40399999999999997\t68309\tRomney\t68309\t0.000173213\t68309.0\n12942\t-96.801578\t40.050378\tOdell village\tNE\tNebraska\tGage County\t360\t43.9\t17.3\t5.7\t18975\t95000\t0.40399999999999997\t68415\tRomney\t68415\t0.000524006\t68415.0\n12943\t-96.664355\t40.121990999999994\tWymore city\tNE\tNebraska\tGage County\t1631\t43.8\t12.9\t8.3\t18501\t60758\t0.40399999999999997\t68318\tRomney\t68318\t0.0023740370000000003\t68318.0\n12944\t-96.522917\t40.45729\tAdams village\tNE\tNebraska\tGage County\t495\t41.6\t19.5\t4.8\t20890\t156250\t0.40399999999999997\t68301\tRomney\t68301\t0.000720508\t68301.0\n12945\t-96.728945\t40.378252\tPickrell village\tNE\tNebraska\tGage County\t196\t42.9\t21.3\t4.4\t21502\t135227\t0.40399999999999997\t68422\tRomney\t68422\t0.00028529200000000003\t68422.0\n12946\t-96.745305\t40.271734\tBeatrice city\tNE\tNebraska\tGage County\t12451\t41.3\t19.4\t6.3\t22099\t98453\t0.40399999999999997\t68310\tRomney\t68310\t0.018123317\t68310.0\n12947\t-96.49855699999999\t40.245795\tVirginia village\tNE\tNebraska\tGage County\t71\t45.8\t19.2\t4.7\t19751\t109375\t0.40399999999999997\t68458\tRomney\t68458\t0.00010334600000000001\t68458.0\n12948\t-96.66302900000001\t40.137491\tBlue Springs city\tNE\tNebraska\tGage County\t382\t43.6\t13.5\t5.9\t18773\t60000\t0.40399999999999997\t68318\tRomney\t68318\t0.0005560280000000001\t68318.0\n12949\t-96.85130500000001\t40.465358\tClatonia village\tNE\tNebraska\tGage County\t259\t41.0\t27.3\t4.1\t20865\t144643\t0.40399999999999997\t68328\tRomney\t68328\t0.00037699300000000005\t68328.0\n12950\t-96.483014\t40.085499\tLiberty village\tNE\tNebraska\tGage County\t84\t43.8\t13.6\t10.0\t18292\t60000\t0.40399999999999997\t68381\tRomney\t68381\t0.000122268\t68381.0\n12951\t-96.53414599999999\t40.284963\tFilley village\tNE\tNebraska\tGage County\t184\t45.4\t19.1\t5.4\t19779\t110000\t0.40399999999999997\t68357\tRomney\t68357\t0.000267825\t68357.0\n12952\t-96.706121\t40.50591\tCortland village\tNE\tNebraska\tGage County\t527\t42.6\t21.1\t4.0\t21448\t135185\t0.40399999999999997\t68331\tRomney\t68331\t0.000767086\t68331.0\n12953\t-102.14350300000001\t41.33047\tLewellen village\tNE\tNebraska\tGarden County\t263\t52.6\t13.3\t5.9\t19156\t62222\t0.2218\t69147\tRomney\t69147\t0.000382815\t69147.0\n12954\t-102.623802\t41.49864\tLisco\tNE\tNebraska\tGarden County\t63\t47.0\t18.2\t3.0\t17058\t65000\t0.2218\t69148\tRomney\t69148\t9.17e-05\t69148.0\n12955\t-102.345158\t41.407953000000006\tOshkosh city\tNE\tNebraska\tGarden County\t827\t52.6\t13.7\t6.1\t19156\t61111\t0.2218\t69154\tRomney\t69154\t0.001203757\t69154.0\n12956\t-99.134123\t41.779993\tBurwell city\tNE\tNebraska\tGarfield County\t1022\t48.9\t19.5\t3.0\t16499\t49556\t0.1585\t68823\tRomney\t68823\t0.0014875939999999999\t68823.0\n12957\t-99.740879\t40.573341\tSmithfield village\tNE\tNebraska\tGosper County\t54\t48.1\t22.5\t3.6\t21346\t100000\t0.2352\t68976\tRomney\t68976\t7.859999999999999e-05\t68976.0\n12958\t-99.861828\t40.589548\tElwood village\tNE\tNebraska\tGosper County\t805\t46.1\t14.0\t3.4\t20424\t88704\t0.2352\t68937\tRomney\t68937\t0.001171735\t68937.0\n12959\t-101.761984\t42.00054\tHyannis village\tNE\tNebraska\tGrant County\t255\t43.1\t24.9\t2.7\t16805\t43000\t0.0826\t69350\tRomney\t69350\t0.000371171\t69350.0\n12960\t-98.394036\t41.401271\tWolbach village\tNE\tNebraska\tGreeley County\t249\t43.6\t17.5\t2.8\t16216\t59286\t0.2869\t68882\tRomney\t68882\t0.00036243699999999996\t68882.0\n12961\t-98.362836\t41.688823\tSpalding village\tNE\tNebraska\tGreeley County\t466\t43.5\t17.4\t3.0\t16214\t58182\t0.2869\t68665\tRomney\t68665\t0.0006782960000000001\t68665.0\n12962\t-98.530601\t41.548369\tGreeley Center village\tNE\tNebraska\tGreeley County\t497\t43.8\t15.4\t3.3\t15807\t53667\t0.2869\t68842\tRomney\t68842\t0.000723419\t68842.0\n12963\t-98.702366\t41.467779\tScotia village\tNE\tNebraska\tGreeley County\t288\t43.9\t15.4\t3.2\t15820\t54500\t0.2869\t68875\tRomney\t68875\t0.000419205\t68875.0\n12964\t-98.606359\t41.003094\tCairo village\tNE\tNebraska\tHall County\t826\t39.7\t21.5\t3.1\t19154\t106452\t0.354\t68824\tRomney\t68824\t0.001202302\t68824.0\n12965\t-98.372063\t40.774025\tDoniphan village\tNE\tNebraska\tHall County\t798\t37.4\t11.1\t5.8\t19329\t108056\t0.354\t68832\tRomney\t68832\t0.001161546\t68832.0\n12966\t-98.471769\t40.866572\tAlda village\tNE\tNebraska\tHall County\t635\t41.4\t22.9\t4.9\t22113\t141447\t0.354\t68810\tRomney\t68810\t0.000924288\t68810.0\n12967\t-98.365668\t40.919751\tGrand Island city\tNE\tNebraska\tHall County\t46043\t36.2\t19.3\t6.7\t21616\t118489\t0.354\t68803\tRomney\t68803\t0.067018866\t68803.0\n12968\t-98.598945\t40.821517\tWood River city\tNE\tNebraska\tHall County\t1246\t41.6\t18.1\t4.1\t19182\t96458\t0.354\t68883\tRomney\t68883\t0.001813642\t68883.0\n12969\t-97.943536\t40.716367\tStockham village\tNE\tNebraska\tHamilton County\t58\t45.0\t20.0\t2.7\t20613\t104167\t0.2353\t68975\tRomney\t68975\t8.44e-05\t68975.0\n12970\t-98.00327800000001\t40.866398\tAurora city\tNE\tNebraska\tHamilton County\t4261\t40.1\t24.0\t5.3\t20961\t107765\t0.2353\t68818\tRomney\t68818\t0.006202189\t68818.0\n12971\t-98.15417\t40.773804\tGiltner village\tNE\tNebraska\tHamilton County\t371\t38.2\t21.7\t4.3\t21367\t106667\t0.2353\t68841\tRomney\t68841\t0.000540017\t68841.0\n12972\t-98.214309\t40.89841\tPhillips village\tNE\tNebraska\tHamilton County\t363\t42.0\t17.3\t1.4\t21224\t90000\t0.2353\t68865\tRomney\t68865\t0.0005283719999999999\t68865.0\n12973\t-97.8904\t41.079341\tHordville village\tNE\tNebraska\tHamilton County\t142\t44.4\t21.4\t2.4\t20833\t121429\t0.2353\t68846\tRomney\t68846\t0.00020669099999999998\t68846.0\n12974\t-97.887467\t40.881258\tHampton village\tNE\tNebraska\tHamilton County\t422\t45.5\t19.7\t4.0\t20730\t104167\t0.2353\t68843\tRomney\t68843\t0.000614251\t68843.0\n12975\t-98.00976800000001\t41.006341\tMarquette village\tNE\tNebraska\tHamilton County\t301\t38.1\t20.8\t3.0\t19929\t102885\t0.2353\t68854\tRomney\t68854\t0.00043812699999999996\t68854.0\n12976\t-99.594433\t40.131240000000005\tStamford village\tNE\tNebraska\tHarlan County\t197\t45.0\t18.8\t3.5\t17122\t66429\t0.1991\t68977\tRomney\t68977\t0.00028674799999999997\t68977.0\n12977\t-99.290521\t40.210438\tHuntley village\tNE\tNebraska\tHarlan County\t65\t43.8\t17.4\t2.7\t17215\t67500\t0.1991\t68920\tRomney\t68920\t9.46e-05\t68920.0\n12978\t-99.363527\t40.101316\tAlma city\tNE\tNebraska\tHarlan County\t1090\t50.5\t17.9\t3.3\t18058\t62115\t0.1991\t68920\tRomney\t68920\t0.001586573\t68920.0\n12979\t-99.289636\t40.310759999999995\tRagan village\tNE\tNebraska\tHarlan County\t45\t48.1\t18.8\t3.8\t17070\t60000\t0.1991\t68982\tRomney\t68982\t6.55e-05\t68982.0\n12980\t-99.222338\t40.098831\tRepublican City village\tNE\tNebraska\tHarlan County\t189\t51.2\t16.7\t3.1\t16460\t62143\t0.1991\t68971\tRomney\t68971\t0.000275103\t68971.0\n12981\t-99.45509200000001\t40.131782\tOrleans village\tNE\tNebraska\tHarlan County\t379\t50.3\t20.1\t3.4\t20251\t60000\t0.1991\t68966\tRomney\t68966\t0.000551661\t68966.0\n12982\t-101.234566\t40.384443\tHamlet village\tNE\tNebraska\tHayes County\t50\t46.9\t11.8\t4.0\t14843\t55000\t0.0946\t69031\tRomney\t69031\t7.28e-05\t69031.0\n12983\t-101.020269\t40.511493\tHayes Center village\tNE\tNebraska\tHayes County\t228\t47.8\t10.5\t3.4\t16468\t58333\t0.0946\t69032\tRomney\t69032\t0.00033187\t69032.0\n12984\t-100.839846\t40.228436\tCulbertson village\tNE\tNebraska\tHitchcock County\t590\t45.1\t11.0\t2.4\t18655\t55800\t0.1833\t69024\tRomney\t69024\t0.000858787\t69024.0\n12985\t-101.22783299999999\t40.150457\tStratton village\tNE\tNebraska\tHitchcock County\t354\t50.2\t18.1\t7.2\t18108\t72500\t0.1833\t69043\tRomney\t69043\t0.000515272\t69043.0\n12986\t-101.013589\t40.17467\tTrenton village\tNE\tNebraska\tHitchcock County\t460\t53.9\t9.7\t3.2\t17407\t46667\t0.1833\t69044\tRomney\t69044\t0.0006695630000000001\t69044.0\n12987\t-101.104466\t40.355907\tPalisade village\tNE\tNebraska\tHitchcock County\t349\t44.6\t15.8\t6.1\t15610\t63750\t0.1833\t69040\tRomney\t69040\t0.000507994\t69040.0\n12988\t-98.529724\t42.381894\tInman village\tNE\tNebraska\tHolt County\t127\t46.3\t14.1\t5.1\t18334\t49000\t0.1786\t68742\tRomney\t68742\t0.00018485799999999998\t68742.0\n12989\t-98.748721\t42.204718\tChambers village\tNE\tNebraska\tHolt County\t282\t43.3\t14.1\t1.3\t14585\t66111\t0.1786\t68725\tRomney\t68725\t0.000410471\t68725.0\n12990\t-98.343097\t42.259127\tEwing village\tNE\tNebraska\tHolt County\t372\t45.9\t14.1\t5.2\t18308\t47857\t0.1786\t68735\tRomney\t68735\t0.000541472\t68735.0\n12991\t-98.645975\t42.460643\tO'Neill city\tNE\tNebraska\tHolt County\t3589\t42.8\t20.9\t3.6\t19808\t93037\t0.1786\t68763\tRomney\t68763\t0.005224045\t68763.0\n12992\t-98.41765699999999\t42.400017\tPage village\tNE\tNebraska\tHolt County\t135\t46.1\t14.3\t4.8\t18291\t48333\t0.1786\t68766\tRomney\t68766\t0.000196502\t68766.0\n12993\t-99.14106\t42.600547\tStuart village\tNE\tNebraska\tHolt County\t551\t42.3\t15.1\t4.1\t15132\t77857\t0.1786\t68780\tRomney\t68780\t0.00080202\t68780.0\n12994\t-98.809283\t42.475731\tEmmet village\tNE\tNebraska\tHolt County\t66\t45.0\t20.4\t4.7\t16568\t70000\t0.1786\t68734\tRomney\t68734\t9.609999999999999e-05\t68734.0\n12995\t-98.976862\t42.532707\tAtkinson city\tNE\tNebraska\tHolt County\t1072\t46.5\t19.0\t3.4\t17100\t72037\t0.1786\t68713\tRomney\t68713\t0.0015603720000000002\t68713.0\n12996\t-101.044422\t42.042514000000004\tMullen village\tNE\tNebraska\tHooker County\t468\t49.1\t15.9\t2.1\t18343\t61154\t0.1494\t69152\tRomney\t69152\t0.000681207\t69152.0\n12997\t-98.71552\t41.075177000000004\tHoward City village\tNE\tNebraska\tHoward County\t243\t43.9\t13.2\t7.3\t15995\t95833\t0.3185\t68820\tRomney\t68820\t0.00035370400000000004\t68820.0\n12998\t-98.633576\t41.357579\tCotesfield village\tNE\tNebraska\tHoward County\t63\t41.9\t15.6\t2.9\t17543\t80000\t0.3185\t68835\tRomney\t68835\t9.17e-05\t68835.0\n12999\t-98.54562800000001\t41.118598\tDannebrog village\tNE\tNebraska\tHoward County\t386\t44.2\t13.0\t7.8\t16040\t96111\t0.3185\t68831\tRomney\t68831\t0.00056185\t68831.0\n13000\t-98.569274\t41.285253000000004\tElba village\tNE\tNebraska\tHoward County\t232\t41.7\t14.8\t3.8\t17551\t82500\t0.3185\t68835\tRomney\t68835\t0.000337693\t68835.0\n13001\t-98.628077\t41.215587\tFarwell village\tNE\tNebraska\tHoward County\t141\t41.9\t15.2\t3.8\t17591\t78333\t0.3185\t68838\tRomney\t68838\t0.000205236\t68838.0\n13002\t-98.369235\t41.294740000000004\tCushing village\tNE\tNebraska\tHoward County\t32\t38.8\t14.3\t5.0\t16680\t200000\t0.3185\t68873\tRomney\t68873\t4.66e-05\t68873.0\n13003\t-98.460154\t41.213856\tSt. Paul city\tNE\tNebraska\tHoward County\t2264\t41.1\t23.8\t3.8\t21087\t95086\t0.3185\t68873\tRomney\t68873\t0.003295413\t68873.0\n13004\t-96.97402199999999\t40.191665\tHarbine village\tNE\tNebraska\tJefferson County\t55\t44.4\t17.5\t5.9\t18503\t77500\t0.3468\t68377\tRomney\t68377\t8.01e-05\t68377.0\n13005\t-97.297923\t40.321665\tDaykin village\tNE\tNebraska\tJefferson County\t153\t48.0\t23.5\t5.0\t19543\t78333\t0.3468\t68338\tRomney\t68338\t0.000222702\t68338.0\n13006\t-96.987953\t40.302988\tPlymouth village\tNE\tNebraska\tJefferson County\t466\t44.8\t19.0\t4.6\t18615\t78667\t0.3468\t68424\tRomney\t68424\t0.0006782960000000001\t68424.0\n13007\t-97.08336899999999\t40.186023\tJansen village\tNE\tNebraska\tJefferson County\t140\t44.2\t19.0\t4.7\t18573\t78000\t0.3468\t68377\tRomney\t68377\t0.00020378\t68377.0\n13008\t-97.33587299999999\t40.059807\tReynolds village\tNE\tNebraska\tJefferson County\t83\t46.3\t17.7\t9.4\t21307\t55000\t0.3468\t68362\tRomney\t68362\t0.00012081200000000001\t68362.0\n13009\t-97.02295500000001\t40.036821\tSteele City village\tNE\tNebraska\tJefferson County\t80\t47.1\t16.1\t8.0\t21098\t55000\t0.3468\t68440\tRomney\t68440\t0.000116446\t68440.0\n13010\t-97.095794\t40.081275\tEndicott village\tNE\tNebraska\tJefferson County\t131\t46.8\t16.3\t8.4\t21305\t54000\t0.3468\t68350\tRomney\t68350\t0.00019068\t68350.0\n13011\t-97.178287\t40.141626\tFairbury city\tNE\tNebraska\tJefferson County\t3987\t45.0\t15.5\t6.4\t19660\t56411\t0.3468\t68352\tRomney\t68352\t0.005803363000000001\t68352.0\n13012\t-96.93733\t40.108926000000004\tDiller village\tNE\tNebraska\tJefferson County\t272\t46.6\t16.5\t8.7\t21189\t53889\t0.3468\t68342\tRomney\t68342\t0.000395915\t68342.0\n13013\t-96.42248199999999\t40.334559999999996\tCrab Orchard village\tNE\tNebraska\tJohnson County\t45\t45.6\t18.8\t0.0\t20153\t75000\t0.3829\t68332\tRomney\t68332\t6.55e-05\t68332.0\n13014\t-96.16161899999999\t40.5106\tCook village\tNE\tNebraska\tJohnson County\t293\t48.8\t17.3\t1.1\t20352\t80000\t0.3829\t68329\tRomney\t68329\t0.00042648199999999995\t68329.0\n13015\t-96.126888\t40.288218\tElk Creek village\tNE\tNebraska\tJohnson County\t142\t41.5\t18.3\t1.3\t17367\t78333\t0.3829\t68348\tRomney\t68348\t0.00020669099999999998\t68348.0\n13016\t-96.188891\t40.371836\tTecumseh city\tNE\tNebraska\tJohnson County\t1936\t42.0\t17.3\t2.0\t17283\t69907\t0.3829\t68450\tRomney\t68450\t0.0028179859999999998\t68450.0\n13017\t-96.37804100000001\t40.461426\tSterling village\tNE\tNebraska\tJohnson County\t464\t45.2\t20.7\t0.9\t20223\t81818\t0.3829\t68443\tRomney\t68443\t0.000675385\t68443.0\n13018\t-98.95058399999999\t40.500259\tMinden city\tNE\tNebraska\tKearney County\t2754\t43.6\t17.7\t6.1\t21360\t94405\t0.2431\t68959\tRomney\t68959\t0.004008643\t68959.0\n13019\t-98.78919\t40.56993\tHeartwell village\tNE\tNebraska\tKearney County\t74\t45.0\t28.3\t2.4\t20254\t112500\t0.2431\t68945\tRomney\t68945\t0.000107712\t68945.0\n13020\t-98.792069\t40.479278\tNorman village\tNE\tNebraska\tKearney County\t45\t42.5\t27.3\t0.0\t20414\t108333\t0.2431\t68945\tRomney\t68945\t6.55e-05\t68945.0\n13021\t-99.169371\t40.364124\tWilcox village\tNE\tNebraska\tKearney County\t361\t39.2\t21.9\t3.1\t19967\t97500\t0.2431\t68982\tRomney\t68982\t0.000525461\t68982.0\n13022\t-99.128313\t40.479403999999995\tAxtell village\tNE\tNebraska\tKearney County\t698\t39.2\t21.9\t3.2\t19966\t99000\t0.2431\t68924\tRomney\t68924\t0.001015989\t68924.0\n13023\t-101.355896\t41.125069\tPaxton village\tNE\tNebraska\tKeith County\t618\t41.1\t18.6\t3.4\t15602\t68500\t0.2287\t69155\tRomney\t69155\t0.000899543\t69155.0\n13024\t-101.720903\t41.130577\tOgallala city\tNE\tNebraska\tKeith County\t4491\t40.3\t19.7\t5.7\t21254\t81557\t0.2287\t691HH\tRomney\t691HH\t0.00653697\t0.0\n13025\t-101.88877099999999\t41.095095\tBrule village\tNE\tNebraska\tKeith County\t338\t54.8\t19.4\t5.1\t23247\t89444\t0.2287\t69127\tRomney\t69127\t0.000491983\t69127.0\n13026\t-99.591823\t42.911933000000005\tBurton village\tNE\tNebraska\tKeya Paha County\t11\t52.5\t11.1\t0.0\t13626\t0\t0.1653\t68753\tRomney\t68753\t1.6e-05\t68753.0\n13027\t-99.748773\t42.824463\tSpringview village\tNE\tNebraska\tKeya Paha County\t233\t43.3\t16.6\t2.9\t14255\t55000\t0.1653\t68778\tRomney\t68778\t0.00033914800000000005\t68778.0\n13028\t-103.891039\t41.232495\tBushnell village\tNE\tNebraska\tKimball County\t142\t46.3\t8.8\t3.9\t17226\t56000\t0.2341\t69128\tRomney\t69128\t0.00020669099999999998\t69128.0\n13029\t-103.65884\t41.233277\tKimball city\tNE\tNebraska\tKimball County\t2449\t46.0\t19.4\t6.1\t20733\t68889\t0.2341\t69145\tRomney\t69145\t0.003564694\t69145.0\n13030\t-103.486672\t41.234283000000005\tDix village\tNE\tNebraska\tKimball County\t235\t46.3\t8.2\t3.9\t17161\t56875\t0.2341\t69133\tRomney\t69133\t0.000342059\t69133.0\n13031\t-97.648133\t42.598405\tBloomfield city\tNE\tNebraska\tKnox County\t1013\t53.0\t14.4\t7.6\t18858\t47182\t0.2624\t68718\tRomney\t68718\t0.001474494\t68718.0\n13032\t-97.90835200000001\t42.512446999999995\tBazile Mills village\tNE\tNebraska\tKnox County\t24\t42.5\t16.7\t0.0\t16300\t50000\t0.2624\t68729\tRomney\t68729\t3.4899999999999995e-05\t68729.0\n13033\t-97.907038\t42.464868\tCreighton city\tNE\tNebraska\tKnox County\t1192\t47.1\t18.0\t3.1\t16023\t56548\t0.2624\t68729\tRomney\t68729\t0.001735041\t68729.0\n13034\t-97.539153\t42.497976\tWausa village\tNE\tNebraska\tKnox County\t561\t44.2\t17.9\t3.8\t18034\t62000\t0.2624\t68786\tRomney\t68786\t0.000816575\t68786.0\n13035\t-97.849423\t42.838709\tSantee village\tNE\tNebraska\tKnox County\t313\t34.1\t17.5\t7.6\t13154\t63000\t0.2624\t68724\tRomney\t68724\t0.00045559400000000003\t68724.0\n13036\t-98.193301\t42.811425\tVerdel village\tNE\tNebraska\tKnox County\t53\t50.0\t15.0\t3.6\t16123\t57500\t0.2624\t68760\tRomney\t68760\t7.709999999999999e-05\t68760.0\n13037\t-98.035452\t42.597248\tVerdigre village\tNE\tNebraska\tKnox County\t475\t49.1\t13.9\t2.8\t16111\t59643\t0.2624\t68789\tRomney\t68789\t0.000691396\t68789.0\n13038\t-97.498512\t42.731652000000004\tCrofton city\tNE\tNebraska\tKnox County\t683\t44.6\t21.6\t3.6\t16731\t88750\t0.2624\t68730\tRomney\t68730\t0.000994155\t68730.0\n13039\t-98.031371\t42.749988\tNiobrara village\tNE\tNebraska\tKnox County\t392\t33.2\t17.3\t7.6\t13178\t64000\t0.2624\t68760\tRomney\t68760\t0.0005705840000000001\t68760.0\n13040\t-97.876178\t42.608883\tCenter village\tNE\tNebraska\tKnox County\t84\t47.5\t18.3\t2.2\t16110\t56667\t0.2624\t68724\tRomney\t68724\t0.000122268\t68724.0\n13041\t-97.96015600000001\t42.513563\tWinnetoon village\tNE\tNebraska\tKnox County\t66\t47.1\t17.0\t2.9\t15937\t50000\t0.2624\t68789\tRomney\t68789\t9.609999999999999e-05\t68789.0\n13042\t-96.84535799999999\t40.738932\tDenton village\tNE\tNebraska\tLancaster County\t190\t44.4\t24.1\t4.4\t26237\t173438\t0.4869\t68339\tRomney\t68339\t0.000276559\t68339.0\n13043\t-96.786412\t40.53763\tHallam village\tNE\tNebraska\tLancaster County\t303\t38.8\t18.7\t2.5\t23424\t98462\t0.4869\t68368\tRomney\t68368\t0.00044103800000000004\t68368.0\n13044\t-96.505718\t40.681451\tBennet village\tNE\tNebraska\tLancaster County\t687\t43.0\t24.3\t2.2\t21956\t95952\t0.4869\t68317\tRomney\t68317\t0.000999977\t68317.0\n13045\t-96.866646\t40.909448\tMalcolm village\tNE\tNebraska\tLancaster County\t417\t40.3\t21.2\t3.9\t23312\t130921\t0.4869\t68402\tRomney\t68402\t0.000606973\t68402.0\n13046\t-96.511157\t40.599235\tPanama village\tNE\tNebraska\tLancaster County\t252\t40.4\t30.5\t3.7\t25716\t144792\t0.4869\t68419\tRomney\t68419\t0.00036680400000000003\t68419.0\n13047\t-96.529191\t40.913462\tWaverly city\tNE\tNebraska\tLancaster County\t3108\t35.1\t22.9\t4.2\t24424\t123085\t0.4869\t68462\tRomney\t68462\t0.004523915\t68462.0\n13048\t-96.66128499999999\t40.658659\tRoca village\tNE\tNebraska\tLancaster County\t219\t40.7\t30.6\t4.3\t25726\t145000\t0.4869\t68430\tRomney\t68430\t0.00031877\t68430.0\n13049\t-96.781614\t40.956716\tRaymond village\tNE\tNebraska\tLancaster County\t222\t41.4\t26.7\t2.4\t26628\t160714\t0.4869\t68428\tRomney\t68428\t0.00032313700000000003\t68428.0\n13050\t-96.68348\t40.811009000000006\tLincoln city\tNE\tNebraska\tLancaster County\t246399\t32.9\t36.4\t6.0\t26511\t128160\t0.4869\t68503\tRomney\t68503\t0.35865129700000004\t68503.0\n13051\t-96.74479000000001\t40.62635\tSprague village\tNE\tNebraska\tLancaster County\t144\t44.0\t19.6\t2.6\t26332\t125000\t0.4869\t68404\tRomney\t68404\t0.000209602\t68404.0\n13052\t-96.604998\t40.534978\tFirth village\tNE\tNebraska\tLancaster County\t650\t37.7\t26.1\t3.5\t21530\t117763\t0.4869\t68358\tRomney\t68358\t0.0009461210000000001\t68358.0\n13053\t-96.63066500000001\t40.622222\tHickman city\tNE\tNebraska\tLancaster County\t1075\t32.4\t19.5\t5.3\t22834\t105218\t0.4869\t68372\tRomney\t68372\t0.0015647389999999999\t68372.0\n13054\t-96.669155\t40.983783\tDavey village\tNE\tNebraska\tLancaster County\t182\t43.0\t31.0\t2.1\t24935\t167857\t0.4869\t68336\tRomney\t68336\t0.000264914\t68336.0\n13055\t-100.731697\t40.753877\tWellfleet village\tNE\tNebraska\tLincoln County\t73\t42.5\t19.6\t2.2\t19418\t75000\t0.2843\t69170\tRomney\t69170\t0.00010625700000000001\t69170.0\n13056\t-101.127354\t41.157971999999994\tSutherland village\tNE\tNebraska\tLincoln County\t1226\t44.2\t16.4\t2.4\t21268\t109231\t0.2843\t69165\tRomney\t69165\t0.00178453\t69165.0\n13057\t-100.770368\t41.131386\tNorth Platte city\tNE\tNebraska\tLincoln County\t24372\t37.5\t19.3\t5.7\t23313\t104323\t0.2843\t69101\tRomney\t69101\t0.035475182\t69101.0\n13058\t-100.367576\t41.022290000000005\tBrady village\tNE\tNebraska\tLincoln County\t410\t40.7\t24.1\t4.0\t18649\t75500\t0.2843\t69123\tRomney\t69123\t0.000596784\t69123.0\n13059\t-101.16450400000001\t40.837547\tWallace village\tNE\tNebraska\tLincoln County\t317\t43.3\t19.4\t1.6\t19345\t77222\t0.2843\t69169\tRomney\t69169\t0.000461416\t69169.0\n13060\t-101.001715\t41.159642\tHershey village\tNE\tNebraska\tLincoln County\t595\t42.3\t13.3\t5.8\t20661\t117917\t0.2843\t69143\tRomney\t69143\t0.000866065\t69143.0\n13061\t-100.525705\t41.078395\tMaxwell village\tNE\tNebraska\tLincoln County\t319\t40.2\t17.7\t2.4\t17394\t92500\t0.2843\t69151\tRomney\t69151\t0.00046432699999999995\t69151.0\n13062\t-100.51259399999999\t41.480171999999996\tStapleton village\tNE\tNebraska\tLogan County\t285\t46.8\t10.6\t2.8\t18067\t79000\t0.1578\t69163\tRomney\t69163\t0.00041483800000000006\t69163.0\n13063\t-100.458462\t41.469735\tGandy village\tNE\tNebraska\tLogan County\t28\t42.5\t9.5\t5.6\t18347\t75000\t0.1578\t69163\tRomney\t69163\t4.0799999999999996e-05\t69163.0\n13064\t-99.381404\t41.769612\tTaylor village\tNE\tNebraska\tLoup County\t209\t45.7\t13.8\t5.0\t14664\t67500\t0.1732\t68879\tRomney\t68879\t0.000304214\t68879.0\n13065\t-97.42072900000001\t42.033992\tNorfolk city\tNE\tNebraska\tMadison County\t23041\t34.6\t22.4\t5.5\t21846\t107547\t0.251\t68701\tRomney\t68701\t0.033537817000000004\t68701.0\n13066\t-97.73629100000001\t42.028984\tMeadow Grove village\tNE\tNebraska\tMadison County\t271\t42.1\t11.0\t3.5\t16608\t59000\t0.251\t68752\tRomney\t68752\t0.00039446\t68752.0\n13067\t-97.829601\t42.043944\tTilden city\tNE\tNebraska\tMadison County\t968\t42.3\t19.5\t4.3\t16388\t68400\t0.251\t68781\tRomney\t68781\t0.0014089929999999999\t68781.0\n13068\t-97.775695\t41.747101\tNewman Grove city\tNE\tNebraska\tMadison County\t830\t43.4\t16.6\t2.8\t16748\t56389\t0.251\t68758\tRomney\t68758\t0.0012081239999999999\t68758.0\n13069\t-97.599111\t41.998289\tBattle Creek city\tNE\tNebraska\tMadison County\t1042\t37.8\t16.9\t3.5\t18436\t98906\t0.251\t68715\tRomney\t68715\t0.001516705\t68715.0\n13070\t-97.456846\t41.828514\tMadison city\tNE\tNebraska\tMadison County\t2170\t34.0\t11.4\t6.2\t16054\t72432\t0.251\t68748\tRomney\t68748\t0.00315859\t68748.0\n13071\t-98.003049\t41.113605\tCentral City\tNE\tNebraska\tMerrick County\t2879\t40.9\t16.3\t6.0\t19898\t83272\t0.2651\t68826\tRomney\t68826\t0.00419059\t68826.0\n13072\t-97.665428\t41.315493\tSilver Creek village\tNE\tNebraska\tMerrick County\t417\t43.6\t9.1\t6.5\t17143\t60000\t0.2651\t68663\tRomney\t68663\t0.000606973\t68663.0\n13073\t-98.158973\t41.023059\tChapman village\tNE\tNebraska\tMerrick County\t335\t40.6\t17.9\t3.7\t17736\t87000\t0.2651\t68827\tRomney\t68827\t0.00048761599999999996\t68827.0\n13074\t-98.25978\t41.222424\tPalmer village\tNE\tNebraska\tMerrick County\t447\t45.1\t11.3\t2.0\t16731\t68571\t0.2651\t68864\tRomney\t68864\t0.00065064\t68864.0\n13075\t-97.839555\t41.216366\tClarks village\tNE\tNebraska\tMerrick County\t342\t43.8\t8.9\t6.9\t17112\t60455\t0.2651\t68628\tRomney\t68628\t0.000497805\t68628.0\n13076\t-102.852448\t41.597927\tBroadwater village\tNE\tNebraska\tMorrill County\t127\t41.4\t13.5\t3.8\t15447\t67500\t0.2078\t69125\tRomney\t69125\t0.00018485799999999998\t69125.0\n13077\t-103.098895\t41.667052000000005\tBridgeport city\tNE\tNebraska\tMorrill County\t1455\t41.2\t13.9\t4.8\t18112\t62000\t0.2078\t69336\tRomney\t69336\t0.002117856\t69336.0\n13078\t-103.322994\t41.757222999999996\tBayard city\tNE\tNebraska\tMorrill County\t1267\t42.7\t14.4\t8.1\t17656\t66757\t0.2078\t69334\tRomney\t69334\t0.0018442089999999999\t69334.0\n13079\t-98.067655\t41.470742\tBelgrade village\tNE\tNebraska\tNance County\t110\t41.7\t11.8\t2.9\t15023\t51667\t0.2967\t68623\tRomney\t68623\t0.000160113\t68623.0\n13080\t-97.97255799999999\t41.36399\tFullerton city\tNE\tNebraska\tNance County\t1296\t45.6\t15.7\t3.8\t20052\t58690\t0.2967\t68638\tRomney\t68638\t0.00188642\t68638.0\n13081\t-97.732221\t41.446196\tGenoa city\tNE\tNebraska\tNance County\t922\t41.1\t13.7\t3.8\t17735\t65161\t0.2967\t68640\tRomney\t68640\t0.0013420370000000001\t68640.0\n13082\t-95.998891\t40.410883\tJohnson village\tNE\tNebraska\tNemaha County\t253\t47.2\t26.3\t9.8\t20505\t95000\t0.35100000000000003\t68378\tRomney\t68378\t0.00036826\t68378.0\n13083\t-95.731282\t40.478478\tPeru city\tNE\tNebraska\tNemaha County\t809\t23.6\t30.4\t9.1\t16289\t52941\t0.35100000000000003\t68421\tRomney\t68421\t0.0011775569999999999\t68421.0\n13084\t-95.675973\t40.338827\tNemaha village\tNE\tNebraska\tNemaha County\t161\t47.3\t19.8\t8.2\t20493\t69000\t0.35100000000000003\t68414\tRomney\t68414\t0.000234347\t68414.0\n13085\t-95.66126\t40.397878000000006\tBrownville village\tNE\tNebraska\tNemaha County\t132\t47.1\t20.8\t8.3\t20507\t70000\t0.35100000000000003\t68321\tRomney\t68321\t0.000192135\t68321.0\n13086\t-95.84229599999999\t40.388726\tAuburn city\tNE\tNebraska\tNemaha County\t3322\t44.2\t22.6\t6.2\t23333\t82532\t0.35100000000000003\t68305\tRomney\t68305\t0.004835408\t68305.0\n13087\t-95.867496\t40.519829\tJulian village\tNE\tNebraska\tNemaha County\t57\t49.0\t26.8\t10.0\t20481\t90000\t0.35100000000000003\t68320\tRomney\t68320\t8.3e-05\t68320.0\n13088\t-95.96008\t40.480489\tBrock village\tNE\tNebraska\tNemaha County\t147\t47.1\t25.5\t9.2\t20428\t90000\t0.35100000000000003\t68320\tRomney\t68320\t0.00021396900000000002\t68320.0\n13089\t-98.06616700000001\t40.022971000000005\tSuperior city\tNE\tNebraska\tNuckolls County\t1918\t48.4\t19.0\t4.3\t19583\t51038\t0.2592\t68978\tRomney\t68978\t0.0027917859999999997\t68978.0\n13090\t-97.923783\t40.011384\tHardy village\tNE\tNebraska\tNuckolls County\t149\t43.9\t14.8\t5.9\t16052\t38750\t0.2592\t68943\tRomney\t68943\t0.00021688\t68943.0\n13091\t-98.259676\t40.290167\tLawrence village\tNE\tNebraska\tNuckolls County\t261\t45.1\t12.0\t2.8\t15855\t48750\t0.2592\t68957\tRomney\t68957\t0.00037990400000000003\t68957.0\n13092\t-98.068752\t40.201246000000005\tNelson city\tNE\tNebraska\tNuckolls County\t493\t48.2\t13.4\t5.6\t19437\t54615\t0.2592\t68961\tRomney\t68961\t0.0007175969999999999\t68961.0\n13093\t-97.903711\t40.238188\tOak village\tNE\tNebraska\tNuckolls County\t50\t49.4\t15.0\t7.1\t19597\t52500\t0.2592\t68964\tRomney\t68964\t7.28e-05\t68964.0\n13094\t-97.867063\t40.143997999999996\tRuskin village\tNE\tNebraska\tNuckolls County\t162\t44.7\t14.5\t6.5\t16084\t37500\t0.2592\t68974\tRomney\t68974\t0.000235803\t68974.0\n13095\t-97.973763\t40.164113\tNora village\tNE\tNebraska\tNuckolls County\t17\t47.5\t8.3\t10.0\t15720\t27500\t0.2592\t68961\tRomney\t68961\t2.47e-05\t68961.0\n13096\t-96.392206\t40.705873\tPalmyra village\tNE\tNebraska\tOtoe County\t615\t40.7\t23.4\t4.1\t24970\t131250\t0.3668\t68418\tRomney\t68418\t0.000895176\t68418.0\n13097\t-96.023729\t40.53165\tTalmage village\tNE\tNebraska\tOtoe County\t275\t40.7\t22.4\t4.6\t19815\t93750\t0.3668\t68448\tRomney\t68448\t0.00040028199999999996\t68448.0\n13098\t-96.18373100000001\t40.660933\tSyracuse city\tNE\tNebraska\tOtoe County\t1761\t50.1\t20.5\t5.5\t22055\t117872\t0.3668\t68446\tRomney\t68446\t0.0025632610000000003\t68446.0\n13099\t-95.861398\t40.675925\tNebraska City\tNE\tNebraska\tOtoe County\t7237\t40.2\t21.0\t8.2\t20312\t98346\t0.3668\t68410\tRomney\t68410\t0.010533968999999999\t68410.0\n13100\t-96.03039799999999\t40.668483\tDunbar village\tNE\tNebraska\tOtoe County\t269\t39.7\t27.6\t4.1\t20096\t171875\t0.3668\t68346\tRomney\t68346\t0.000391549\t68346.0\n13101\t-96.27030500000001\t40.68271\tUnadilla village\tNE\tNebraska\tOtoe County\t385\t40.5\t23.2\t4.3\t24982\t132143\t0.3668\t68454\tRomney\t68454\t0.000560395\t68454.0\n13102\t-96.388265\t40.593185999999996\tDouglas village\tNE\tNebraska\tOtoe County\t212\t43.1\t22.0\t4.7\t20225\t121591\t0.3668\t68344\tRomney\t68344\t0.000308581\t68344.0\n13103\t-96.120623\t40.72413\tOtoe village\tNE\tNebraska\tOtoe County\t222\t42.1\t17.6\t3.7\t20698\t102778\t0.3668\t68417\tRomney\t68417\t0.00032313700000000003\t68417.0\n13104\t-96.29988399999999\t40.535934999999995\tBurr village\tNE\tNebraska\tOtoe County\t61\t45.0\t20.9\t5.4\t20087\t125000\t0.3668\t68324\tRomney\t68324\t8.88e-05\t68324.0\n13105\t-96.023749\t40.597274\tLorton village\tNE\tNebraska\tOtoe County\t40\t41.3\t23.1\t4.5\t19819\t80000\t0.3668\t68448\tRomney\t68448\t5.8200000000000005e-05\t68448.0\n13106\t-96.152261\t40.110164000000005\tPawnee City\tNE\tNebraska\tPawnee County\t1011\t48.3\t15.0\t3.8\t17971\t48077\t0.2983\t68420\tRomney\t68420\t0.0014715829999999998\t68420.0\n13107\t-96.232911\t40.207284\tSteinauer village\tNE\tNebraska\tPawnee County\t72\t48.3\t17.0\t2.6\t18966\t50000\t0.2983\t68441\tRomney\t68441\t0.000104801\t68441.0\n13108\t-96.348786\t40.149306\tBurchard village\tNE\tNebraska\tPawnee County\t83\t48.0\t21.7\t4.0\t18720\t77500\t0.2983\t68323\tRomney\t68323\t0.00012081200000000001\t68323.0\n13109\t-96.047275\t40.034489\tDu Bois village\tNE\tNebraska\tPawnee County\t162\t47.3\t17.5\t3.4\t18893\t50833\t0.2983\t68345\tRomney\t68345\t0.000235803\t68345.0\n13110\t-96.40735600000001\t40.243012\tLewiston village\tNE\tNebraska\tPawnee County\t69\t45.6\t20.4\t4.8\t18805\t75000\t0.2983\t68380\tRomney\t68380\t0.000100434\t68380.0\n13111\t-96.088662\t40.178253999999995\tTable Rock village\tNE\tNebraska\tPawnee County\t258\t47.9\t17.4\t2.8\t18874\t50000\t0.2983\t68447\tRomney\t68447\t0.00037553699999999995\t68447.0\n13112\t-101.542801\t40.849307\tMadrid village\tNE\tNebraska\tPerkins County\t260\t38.6\t16.7\t4.1\t20873\t57778\t0.1707\t69150\tRomney\t69150\t0.000378449\t69150.0\n13113\t-102.041062\t40.761951\tVenango village\tNE\tNebraska\tPerkins County\t167\t42.8\t19.1\t7.1\t17343\t71667\t0.1707\t69168\tRomney\t69168\t0.00024308\t69168.0\n13114\t-101.389155\t40.84715\tElsie village\tNE\tNebraska\tPerkins County\t136\t38.3\t16.5\t3.9\t20931\t57000\t0.1707\t69134\tRomney\t69134\t0.000197958\t69134.0\n13115\t-101.726401\t40.844759\tGrant city\tNE\tNebraska\tPerkins County\t1203\t47.5\t17.7\t2.6\t20194\t90571\t0.1707\t69140\tRomney\t69140\t0.0017510520000000001\t69140.0\n13116\t-99.250765\t40.463141\tFunk village\tNE\tNebraska\tPhelps County\t195\t43.5\t19.1\t5.9\t19699\t93000\t0.2009\t68940\tRomney\t68940\t0.000283836\t68940.0\n13117\t-99.63226\t40.526308\tBertrand village\tNE\tNebraska\tPhelps County\t778\t46.8\t14.5\t4.7\t19414\t78182\t0.2009\t68927\tRomney\t68927\t0.0011324339999999999\t68927.0\n13118\t-99.47324300000001\t40.368379\tAtlanta village\tNE\tNebraska\tPhelps County\t124\t43.8\t18.6\t6.6\t19751\t91667\t0.2009\t68923\tRomney\t68923\t0.000180491\t68923.0\n13119\t-99.37548199999999\t40.439204\tHoldrege city\tNE\tNebraska\tPhelps County\t5266\t41.9\t25.9\t4.6\t23593\t89527\t0.2009\t68949\tRomney\t68949\t0.007665038000000001\t68949.0\n13120\t-99.507724\t40.478353000000006\tLoomis village\tNE\tNebraska\tPhelps County\t379\t43.6\t18.7\t6.0\t19729\t93500\t0.2009\t68958\tRomney\t68958\t0.000551661\t68958.0\n13121\t-97.527986\t42.199047\tPierce city\tNE\tNebraska\tPierce County\t1754\t39.8\t14.7\t4.9\t18394\t84224\t0.1857\t68767\tRomney\t68767\t0.002553072\t68767.0\n13122\t-97.598484\t42.358571000000005\tOsmond city\tNE\tNebraska\tPierce County\t737\t43.3\t16.0\t3.7\t19994\t68800\t0.1857\t68765\tRomney\t68765\t0.001072756\t68765.0\n13123\t-97.787237\t42.353426\tPlainview city\tNE\tNebraska\tPierce County\t1272\t44.0\t13.7\t4.7\t17641\t64886\t0.1857\t68769\tRomney\t68769\t0.0018514870000000002\t68769.0\n13124\t-97.450962\t42.107213\tHadar village\tNE\tNebraska\tPierce County\t298\t36.2\t12.6\t3.5\t18607\t105769\t0.1857\t68701\tRomney\t68701\t0.00043376\t68701.0\n13125\t-97.46813399999999\t42.386162\tMcLean village\tNE\tNebraska\tPierce County\t35\t30.0\t9.5\t5.0\t18371\t118750\t0.1857\t68747\tRomney\t68747\t5.0900000000000004e-05\t68747.0\n13126\t-97.665124\t42.274751\tFoster village\tNE\tNebraska\tPierce County\t58\t36.5\t10.8\t3.3\t17064\t112500\t0.1857\t68737\tRomney\t68737\t8.44e-05\t68737.0\n13127\t-97.566935\t41.680137\tCornlea village\tNE\tNebraska\tPlatte County\t41\t35.0\t12.0\t5.3\t17655\t118750\t0.2337\t68642\tRomney\t68642\t5.9699999999999994e-05\t68642.0\n13128\t-97.599875\t41.474101\tMonroe village\tNE\tNebraska\tPlatte County\t298\t41.4\t7.5\t4.4\t21383\t90000\t0.2337\t68647\tRomney\t68647\t0.00043376\t68647.0\n13129\t-97.50250799999999\t41.614761\tTarnov village\tNE\tNebraska\tPlatte County\t64\t35.0\t15.4\t3.6\t17378\t121875\t0.2337\t68653\tRomney\t68653\t9.32e-05\t68653.0\n13130\t-97.487336\t41.688697999999995\tHumphrey city\tNE\tNebraska\tPlatte County\t794\t35.2\t13.7\t3.7\t17494\t118396\t0.2337\t68642\tRomney\t68642\t0.001155724\t68642.0\n13131\t-97.35624\t41.434857\tColumbus city\tNE\tNebraska\tPlatte County\t21288\t37.0\t21.8\t4.5\t23000\t112131\t0.2337\t68601\tRomney\t68601\t0.030986200000000002\t68601.0\n13132\t-97.493289\t41.389783\tDuncan village\tNE\tNebraska\tPlatte County\t448\t44.8\t21.8\t2.8\t22733\t108796\t0.2337\t68634\tRomney\t68634\t0.000652096\t68634.0\n13133\t-97.488443\t41.537389000000005\tPlatte Center village\tNE\tNebraska\tPlatte County\t358\t38.8\t6.9\t3.2\t18590\t99583\t0.2337\t68653\tRomney\t68653\t0.000521095\t68653.0\n13134\t-97.36269399999999\t41.707919\tCreston village\tNE\tNebraska\tPlatte County\t206\t41.1\t16.7\t3.2\t15022\t99375\t0.2337\t68631\tRomney\t68631\t0.00029984799999999997\t68631.0\n13135\t-97.69417\t41.700499\tLindsay village\tNE\tNebraska\tPlatte County\t259\t44.0\t12.0\t2.8\t17142\t110156\t0.2337\t68644\tRomney\t68644\t0.00037699300000000005\t68644.0\n13136\t-97.783435\t41.07547\tPolk village\tNE\tNebraska\tPolk County\t305\t47.3\t14.4\t3.8\t20199\t57500\t0.2149\t68654\tRomney\t68654\t0.000443949\t68654.0\n13137\t-97.592902\t41.114915\tStromsburg city\tNE\tNebraska\tPolk County\t1186\t46.4\t17.8\t3.8\t19383\t78000\t0.2149\t68666\tRomney\t68666\t0.001726307\t68666.0\n13138\t-97.42663\t41.193836\tShelby village\tNE\tNebraska\tPolk County\t696\t39.2\t11.9\t2.6\t21210\t93333\t0.2149\t68662\tRomney\t68662\t0.001013078\t68662.0\n13139\t-97.54939\t41.178131\tOsceola city\tNE\tNebraska\tPolk County\t884\t45.9\t14.9\t3.0\t21014\t83143\t0.2149\t68651\tRomney\t68651\t0.001286725\t68651.0\n13140\t-100.405259\t40.03763\tDanbury village\tNE\tNebraska\tRed Willow County\t106\t46.4\t12.2\t3.3\t17221\t52500\t0.1929\t69026\tRomney\t69026\t0.000154291\t69026.0\n13141\t-100.27594599999999\t40.048796\tLebanon village\tNE\tNebraska\tRed Willow County\t58\t48.0\t12.5\t3.0\t17346\t50000\t0.1929\t69036\tRomney\t69036\t8.44e-05\t69036.0\n13142\t-100.309765\t40.252404\tBartley village\tNE\tNebraska\tRed Willow County\t330\t42.9\t14.7\t4.4\t15112\t55909\t0.1929\t69020\tRomney\t69020\t0.00048033900000000004\t69020.0\n13143\t-100.41971099999999\t40.234614\tIndianola city\tNE\tNebraska\tRed Willow County\t597\t42.6\t14.8\t4.3\t15105\t55238\t0.1929\t69034\tRomney\t69034\t0.000868976\t69034.0\n13144\t-100.621585\t40.204685999999995\tMcCook city\tNE\tNebraska\tRed Willow County\t7645\t41.3\t18.6\t4.3\t20358\t82592\t0.1929\t69001\tRomney\t69001\t0.011127841999999999\t69001.0\n13145\t-95.773333\t40.232385\tStella village\tNE\tNebraska\tRichardson County\t186\t43.6\t21.1\t8.8\t17947\t45000\t0.3185\t68442\tRomney\t68442\t0.000270736\t68442.0\n13146\t-95.711157\t40.14907\tVerdon village\tNE\tNebraska\tRichardson County\t189\t43.4\t20.8\t8.7\t17903\t44286\t0.3185\t68457\tRomney\t68457\t0.000275103\t68457.0\n13147\t-95.829848\t40.130697999999995\tDawson village\tNE\tNebraska\tRichardson County\t172\t46.3\t14.6\t3.9\t15656\t46000\t0.3185\t68337\tRomney\t68337\t0.000250358\t68337.0\n13148\t-95.577924\t40.218521\tBarada village\tNE\tNebraska\tRichardson County\t23\t38.8\t25.0\t0.0\t17864\t112500\t0.3185\t683HH\tRomney\t683HH\t3.35e-05\t0.0\n13149\t-95.518114\t40.034665000000004\tPreston village\tNE\tNebraska\tRichardson County\t43\t38.8\t10.3\t4.8\t16302\t112500\t0.3185\t68431\tRomney\t68431\t6.26e-05\t68431.0\n13150\t-95.944263\t40.165843\tHumboldt city\tNE\tNebraska\tRichardson County\t911\t48.1\t18.5\t7.5\t17337\t49688\t0.3185\t68376\tRomney\t68376\t0.001326025\t68376.0\n13151\t-95.599476\t40.066133\tFalls City\tNE\tNebraska\tRichardson County\t4422\t44.1\t14.7\t8.4\t18757\t60772\t0.3185\t68355\tRomney\t68355\t0.006436536\t68355.0\n13152\t-95.729231\t40.076816\tSalem village\tNE\tNebraska\tRichardson County\t114\t46.9\t14.3\t4.4\t15601\t45000\t0.3185\t68433\tRomney\t68433\t0.000165935\t68433.0\n13153\t-95.68355799999999\t40.235963\tShubert village\tNE\tNebraska\tRichardson County\t213\t42.8\t20.4\t8.7\t17955\t45000\t0.3185\t68437\tRomney\t68437\t0.000310037\t68437.0\n13154\t-95.430589\t40.051828\tRulo village\tNE\tNebraska\tRichardson County\t187\t44.3\t24.2\t4.0\t17706\t98333\t0.3185\t68431\tRomney\t68431\t0.000272192\t68431.0\n13155\t-99.32829\t42.600072\tNewport village\tNE\tNebraska\tRock County\t85\t46.4\t13.1\t0.0\t14896\t55000\t0.1305\t68759\tRomney\t68759\t0.000123724\t68759.0\n13156\t-99.53669000000001\t42.582515\tBassett city\tNE\tNebraska\tRock County\t671\t49.8\t12.7\t2.6\t18448\t56154\t0.1305\t68714\tRomney\t68714\t0.000976688\t68714.0\n13157\t-97.199168\t40.393487\tWestern village\tNE\tNebraska\tSaline County\t261\t45.0\t15.1\t3.1\t20443\t53750\t0.4617\t68464\tRomney\t68464\t0.00037990400000000003\t68464.0\n13158\t-97.33661\t40.41853\tTobias village\tNE\tNebraska\tSaline County\t144\t45.0\t14.6\t3.4\t20395\t53750\t0.4617\t68453\tRomney\t68453\t0.000209602\t68453.0\n13159\t-97.114796\t40.647574\tDorchester village\tNE\tNebraska\tSaline County\t585\t41.8\t9.9\t6.4\t19325\t95000\t0.4617\t68343\tRomney\t68343\t0.000851509\t68343.0\n13160\t-96.960171\t40.625673\tCrete city\tNE\tNebraska\tSaline County\t6173\t32.4\t20.5\t5.2\t20161\t109514\t0.4617\t68333\tRomney\t68333\t0.008985241\t68333.0\n13161\t-96.962683\t40.481113\tWilber city\tNE\tNebraska\tSaline County\t1827\t40.7\t16.5\t3.1\t21040\t92097\t0.4617\t68465\tRomney\t68465\t0.002659329\t68465.0\n13162\t-97.284098\t40.650643\tFriend city\tNE\tNebraska\tSaline County\t1072\t46.1\t17.5\t4.5\t19496\t98846\t0.4617\t68359\tRomney\t68359\t0.0015603720000000002\t68359.0\n13163\t-96.922214\t40.395337\tDe Witt village\tNE\tNebraska\tSaline County\t544\t42.7\t17.2\t2.7\t20537\t88158\t0.4617\t68341\tRomney\t68341\t0.0007918310000000001\t68341.0\n13164\t-97.079753\t40.379587\tSwanton village\tNE\tNebraska\tSaline County\t120\t45.0\t11.4\t4.9\t18689\t112500\t0.4617\t68445\tRomney\t68445\t0.00017466900000000002\t68445.0\n13165\t-96.132328\t41.083658\tSpringfield city\tNE\tNebraska\tSarpy County\t1854\t35.7\t21.0\t5.5\t24187\t125684\t0.3731\t68059\tRomney\t68059\t0.002698629\t68059.0\n13166\t-96.242069\t41.141129\tGretna city\tNE\tNebraska\tSarpy County\t2557\t36.3\t30.5\t4.8\t26242\t137888\t0.3731\t68028\tRomney\t68028\t0.0037218959999999997\t68028.0\n13167\t-95.937253\t41.159273\tBellevue city\tNE\tNebraska\tSarpy County\t46985\t35.3\t28.7\t7.7\t28048\t132388\t0.3731\t68147\tRomney\t68147\t0.068390014\t68147.0\n13168\t-96.049317\t41.182790000000004\tLa Vista city\tNE\tNebraska\tSarpy County\t13718\t31.4\t24.2\t5.5\t27320\t127306\t0.3731\t68128\tRomney\t68128\t0.019967526\t68128.0\n13169\t-96.041256\t41.156442999999996\tPapillion city\tNE\tNebraska\tSarpy County\t17763\t35.2\t41.8\t5.1\t31814\t180209\t0.3731\t68046\tRomney\t68046\t0.025855312000000002\t68046.0\n13170\t-95.90805999999999\t41.119147999999996\tOffutt AFB CDP\tNE\tNebraska\tSarpy County\t9122\t21.4\t27.3\t10.8\t16375\t117411\t0.3731\t68113\tRomney\t68113\t0.013277721000000001\t68113.0\n13171\t-96.134339\t41.181915000000004\tChalco CDP\tNE\tNebraska\tSarpy County\t12288\t29.2\t39.1\t6.4\t28969\t156338\t0.3731\t68138\tRomney\t68138\t0.017886059\t68138.0\n13172\t-96.80855799999999\t41.310196999999995\tPrague village\tNE\tNebraska\tSaunders County\t340\t44.0\t11.3\t3.8\t15785\t90000\t0.3207\t68050\tRomney\t68050\t0.0004948940000000001\t68050.0\n13173\t-96.645752\t41.057956\tCeresco village\tNE\tNebraska\tSaunders County\t884\t38.6\t22.0\t2.5\t20658\t117819\t0.3207\t68017\tRomney\t68017\t0.001286725\t68017.0\n13174\t-96.371217\t41.040378999999994\tAshland city\tNE\tNebraska\tSaunders County\t2362\t39.6\t17.5\t6.2\t23785\t102109\t0.3207\t68003\tRomney\t68003\t0.0034380590000000003\t68003.0\n13175\t-96.832737\t41.07983\tValparaiso village\tNE\tNebraska\tSaunders County\t598\t41.1\t13.2\t7.7\t20477\t85000\t0.3207\t68065\tRomney\t68065\t0.000870432\t68065.0\n13176\t-96.606948\t41.29801\tColon village\tNE\tNebraska\tSaunders County\t152\t41.1\t22.3\t5.5\t22100\t120833\t0.3207\t68018\tRomney\t68018\t0.00022124700000000002\t68018.0\n13177\t-96.429158\t41.329738\tLeshara village\tNE\tNebraska\tSaunders County\t122\t41.9\t21.7\t5.1\t22154\t120833\t0.3207\t68035\tRomney\t68035\t0.00017758\t68035.0\n13178\t-96.488817\t41.228683000000004\tMead village\tNE\tNebraska\tSaunders County\t648\t39.2\t23.4\t3.1\t20548\t104630\t0.3207\t68041\tRomney\t68041\t0.00094321\t68041.0\n13179\t-96.62091099999999\t41.214603000000004\tWahoo city\tNE\tNebraska\tSaunders County\t4029\t40.4\t24.7\t4.4\t21322\t96992\t0.3207\t68066\tRomney\t68066\t0.005864497\t68066.0\n13180\t-96.741099\t41.191843\tWeston village\tNE\tNebraska\tSaunders County\t329\t40.9\t13.1\t7.3\t20491\t84167\t0.3207\t68070\tRomney\t68070\t0.00047888300000000004\t68070.0\n13181\t-96.539565\t41.159296999999995\tIthaca village\tNE\tNebraska\tSaunders County\t193\t39.6\t23.0\t3.1\t20545\t103125\t0.3207\t68033\tRomney\t68033\t0.000280925\t68033.0\n13182\t-96.433115\t41.094564\tMemphis village\tNE\tNebraska\tSaunders County\t114\t45.8\t16.3\t3.3\t23483\t142500\t0.3207\t68042\tRomney\t68042\t0.000165935\t68042.0\n13183\t-96.396561\t41.243127\tYutan city\tNE\tNebraska\tSaunders County\t1358\t32.5\t16.5\t4.9\t23520\t99389\t0.3207\t68073\tRomney\t68073\t0.001976666\t68073.0\n13184\t-96.720929\t41.266453999999996\tMalmo village\tNE\tNebraska\tSaunders County\t116\t43.1\t9.2\t3.7\t19347\t118750\t0.3207\t68040\tRomney\t68040\t0.00016884599999999998\t68040.0\n13185\t-96.766475\t41.430925\tMorse Bluff village\tNE\tNebraska\tSaunders County\t132\t44.2\t12.2\t3.3\t15752\t88333\t0.3207\t68648\tRomney\t68648\t0.000192135\t68648.0\n13186\t-96.609714\t41.397040000000004\tCedar Bluffs village\tNE\tNebraska\tSaunders County\t578\t44.2\t11.2\t8.1\t18938\t72500\t0.3207\t68015\tRomney\t68015\t0.00084132\t68015.0\n13187\t-103.51700500000001\t41.781996\tMelbeta village\tNE\tNebraska\tScotts Bluff County\t124\t44.7\t23.7\t5.2\t22367\t112500\t0.3029\t69355\tRomney\t69355\t0.000180491\t69355.0\n13188\t-103.667088\t41.828924\tGering city\tNE\tNebraska\tScotts Bluff County\t7835\t42.5\t23.1\t5.4\t23542\t101641\t0.3029\t69341\tRomney\t69341\t0.011404401000000002\t69341.0\n13189\t-103.92440400000001\t41.963885\tMorrill village\tNE\tNebraska\tScotts Bluff County\t906\t48.3\t15.6\t4.8\t19517\t71364\t0.3029\t69358\tRomney\t69358\t0.0013187479999999998\t69358.0\n13190\t-103.661621\t41.866849\tScottsbluff city\tNE\tNebraska\tScotts Bluff County\t14606\t36.5\t19.7\t8.6\t21274\t97061\t0.3029\t69361\tRomney\t69361\t0.021260072999999997\t69361.0\n13191\t-103.502094\t41.811279\tMinatare city\tNE\tNebraska\tScotts Bluff County\t782\t33.0\t9.3\t9.9\t12442\t43269\t0.3029\t69355\tRomney\t69355\t0.001138257\t69355.0\n13192\t-104.04610699999999\t41.997927000000004\tHenry village\tNE\tNebraska\tScotts Bluff County\t168\t40.6\t23.9\t6.4\t20292\t128125\t0.3029\t69349\tRomney\t69349\t0.000244536\t69349.0\n13193\t-103.80995\t41.942685\tMitchell city\tNE\tNebraska\tScotts Bluff County\t1918\t38.6\t18.1\t8.2\t18859\t88462\t0.3029\t69357\tRomney\t69357\t0.0027917859999999997\t69357.0\n13194\t-103.670063\t41.847914\tTerrytown village\tNE\tNebraska\tScotts Bluff County\t629\t29.2\t7.8\t10.8\t11379\t32500\t0.3029\t69361\tRomney\t69361\t0.000915554\t69361.0\n13195\t-103.41748299999999\t41.747724\tMcGrew village\tNE\tNebraska\tScotts Bluff County\t93\t45.0\t22.9\t5.2\t22258\t110000\t0.3029\t69355\tRomney\t69355\t0.000135368\t69355.0\n13196\t-104.037477\t41.917707\tLyman village\tNE\tNebraska\tScotts Bluff County\t391\t37.3\t8.3\t11.2\t14574\t43750\t0.3029\t69349\tRomney\t69349\t0.000569128\t69349.0\n13197\t-97.09458199999999\t40.91301\tSeward city\tNE\tNebraska\tSeward County\t6675\t33.2\t34.0\t4.0\t24029\t112839\t0.3151\t68434\tRomney\t68434\t0.009715938\t68434.0\n13198\t-96.933048\t40.79163\tPleasant Dale village\tNE\tNebraska\tSeward County\t248\t42.8\t21.5\t3.8\t23950\t132143\t0.3151\t68423\tRomney\t68423\t0.000360982\t68423.0\n13199\t-97.28244000000001\t40.778115\tBeaver Crossing village\tNE\tNebraska\tSeward County\t444\t40.8\t18.5\t7.1\t18059\t80588\t0.3151\t68313\tRomney\t68313\t0.0006462740000000001\t68313.0\n13200\t-97.35166\t40.716282\tCordova village\tNE\tNebraska\tSeward County\t123\t40.3\t19.0\t6.5\t18118\t75000\t0.3151\t68330\tRomney\t68330\t0.000179035\t68330.0\n13201\t-97.058238\t41.006409000000005\tBee village\tNE\tNebraska\tSeward County\t217\t40.8\t14.7\t3.5\t19284\t75000\t0.3151\t68314\tRomney\t68314\t0.00031585900000000004\t68314.0\n13202\t-97.219571\t40.832587\tGoehner village\tNE\tNebraska\tSeward County\t185\t44.5\t17.8\t2.2\t21106\t90625\t0.3151\t68364\tRomney\t68364\t0.000269281\t68364.0\n13203\t-97.345271\t40.895654\tUtica village\tNE\tNebraska\tSeward County\t840\t44.0\t18.3\t2.2\t21089\t90676\t0.3151\t68456\tRomney\t68456\t0.00122268\t68456.0\n13204\t-97.172887\t40.974517\tStaplehurst village\tNE\tNebraska\tSeward County\t263\t41.0\t14.4\t3.6\t19261\t80000\t0.3151\t68439\tRomney\t68439\t0.000382815\t68439.0\n13205\t-97.052757\t40.772534\tMilford city\tNE\tNebraska\tSeward County\t2160\t31.2\t21.7\t6.3\t23401\t105288\t0.3151\t68405\tRomney\t68405\t0.0031440340000000004\t68405.0\n13206\t-96.985315\t40.944619\tGarland village\tNE\tNebraska\tSeward County\t261\t43.9\t31.9\t4.7\t26684\t152273\t0.3151\t68360\tRomney\t68360\t0.00037990400000000003\t68360.0\n13207\t-102.466876\t42.713115\tRushville city\tNE\tNebraska\tSheridan County\t839\t42.4\t18.4\t6.4\t16355\t51522\t0.1578\t69360\tRomney\t69360\t0.001221224\t69360.0\n13208\t-102.565281\t42.993442\tPine Ridge CDP\tNE\tNebraska\tSheridan County\t14\t45.0\t0.0\t0.0\t29464\t25000\t0.1578\t69365\tRomney\t69365\t2.0399999999999998e-05\t69365.0\n13209\t-102.20382\t42.806513\tGordon city\tNE\tNebraska\tSheridan County\t1679\t43.5\t22.2\t4.1\t18259\t63974\t0.1578\t69360\tRomney\t69360\t0.0024439039999999998\t69360.0\n13210\t-102.348015\t42.759597\tClinton village\tNE\tNebraska\tSheridan County\t25\t43.8\t21.1\t0.0\t18892\t85000\t0.1578\t69360\tRomney\t69360\t3.64e-05\t69360.0\n13211\t-102.68974399999999\t42.683186\tHay Springs village\tNE\tNebraska\tSheridan County\t562\t50.1\t24.0\t6.0\t17926\t37667\t0.1578\t69347\tRomney\t69347\t0.0008180310000000001\t69347.0\n13212\t-98.83110400000001\t41.118454\tRockville village\tNE\tNebraska\tSherman County\t108\t45.9\t9.1\t2.7\t17584\t65000\t0.3608\t68871\tRomney\t68871\t0.000157202\t68871.0\n13213\t-99.07728900000001\t41.091547999999996\tHazard village\tNE\tNebraska\tSherman County\t62\t45.0\t11.1\t2.4\t15987\t91667\t0.3608\t68844\tRomney\t68844\t9.02e-05\t68844.0\n13214\t-98.967928\t41.277089000000004\tLoup City\tNE\tNebraska\tSherman County\t918\t46.2\t15.7\t5.3\t16179\t54881\t0.3608\t68853\tRomney\t68853\t0.0013362139999999998\t68853.0\n13215\t-98.795309\t41.247739\tAshton village\tNE\tNebraska\tSherman County\t231\t45.6\t9.5\t3.2\t17556\t65000\t0.3608\t68817\tRomney\t68817\t0.00033623699999999997\t68817.0\n13216\t-99.152985\t41.155958\tLitchfield village\tNE\tNebraska\tSherman County\t257\t46.1\t18.6\t1.2\t17008\t55000\t0.3608\t68852\tRomney\t68852\t0.000374082\t68852.0\n13217\t-103.88250699999999\t42.688094\tHarrison village\tNE\tNebraska\tSioux County\t248\t50.0\t22.1\t2.9\t18207\t63333\t0.1367\t69346\tRomney\t69346\t0.000360982\t69346.0\n13218\t-97.054864\t42.007352000000004\tPilger village\tNE\tNebraska\tStanton County\t373\t44.3\t13.8\t3.6\t16981\t86250\t0.2322\t68768\tRomney\t68768\t0.000542928\t68768.0\n13219\t-97.222757\t41.948694\tStanton city\tNE\tNebraska\tStanton County\t1745\t40.7\t16.6\t5.3\t18235\t86528\t0.2322\t68779\tRomney\t68779\t0.002539972\t68779.0\n13220\t-97.72328\t40.139515\tDeshler city\tNE\tNebraska\tThayer County\t744\t44.8\t14.6\t2.9\t17537\t44400\t0.2738\t68340\tRomney\t68340\t0.001082945\t68340.0\n13221\t-97.768592\t40.004866\tByron village\tNE\tNebraska\tThayer County\t122\t44.6\t15.3\t3.2\t17523\t43750\t0.2738\t68325\tRomney\t68325\t0.00017758\t68325.0\n13222\t-97.811483\t40.312213\tDavenport village\tNE\tNebraska\tThayer County\t278\t46.6\t21.1\t5.0\t19744\t51250\t0.2738\t68335\tRomney\t68335\t0.00040464900000000004\t68335.0\n13223\t-97.587743\t40.167809999999996\tHebron city\tNE\tNebraska\tThayer County\t1478\t48.0\t18.4\t4.2\t19915\t69643\t0.2738\t68370\tRomney\t68370\t0.002151334\t68370.0\n13224\t-97.564687\t40.335775\tBruning village\tNE\tNebraska\tThayer County\t248\t43.8\t17.2\t2.4\t19140\t50625\t0.2738\t68322\tRomney\t68322\t0.000360982\t68322.0\n13225\t-97.557686\t40.254636\tBelvidere village\tNE\tNebraska\tThayer County\t80\t46.9\t20.7\t4.3\t19836\t48333\t0.2738\t68315\tRomney\t68315\t0.000116446\t68315.0\n13226\t-97.41506700000001\t40.14609\tGilead village\tNE\tNebraska\tThayer County\t38\t47.5\t18.5\t5.0\t19820\t70000\t0.2738\t68362\tRomney\t68362\t5.5299999999999996e-05\t68362.0\n13227\t-97.387778\t40.247565\tAlexandria village\tNE\tNebraska\tThayer County\t179\t44.2\t17.5\t2.2\t19093\t51000\t0.2738\t68303\tRomney\t68303\t0.000260547\t68303.0\n13228\t-97.496563\t40.008271\tHubbell village\tNE\tNebraska\tThayer County\t61\t51.1\t23.4\t5.9\t19304\t40000\t0.2738\t68375\tRomney\t68375\t8.88e-05\t68375.0\n13229\t-97.674022\t40.302987\tCarleton village\tNE\tNebraska\tThayer County\t112\t44.1\t17.7\t3.4\t19213\t51667\t0.2738\t68326\tRomney\t68326\t0.000163024\t68326.0\n13230\t-97.618315\t40.009696000000005\tChester village\tNE\tNebraska\tThayer County\t244\t49.6\t23.1\t5.2\t19431\t45833\t0.2738\t68327\tRomney\t68327\t0.000355159\t68327.0\n13231\t-100.830962\t42.042027000000004\tSeneca village\tNE\tNebraska\tThomas County\t39\t46.3\t21.4\t0.0\t21704\t47500\t0.1029\t69161\tRomney\t69161\t5.68e-05\t69161.0\n13232\t-100.264638\t41.903514\tHalsey village\tNE\tNebraska\tThomas County\t46\t46.7\t17.6\t3.4\t20664\t42500\t0.1029\t69142\tRomney\t69142\t6.7e-05\t69142.0\n13233\t-100.575115\t41.978778000000005\tThedford village\tNE\tNebraska\tThomas County\t162\t46.3\t20.0\t1.9\t21602\t56000\t0.1029\t69166\tRomney\t69166\t0.000235803\t69166.0\n13234\t-96.71049000000001\t42.110864\tPender village\tNE\tNebraska\tThurston County\t1140\t46.2\t16.0\t3.5\t19399\t93333\t0.563\t68047\tRomney\t68047\t0.001659351\t68047.0\n13235\t-96.512592\t42.057382000000004\tRosalie village\tNE\tNebraska\tThurston County\t193\t37.5\t9.1\t20.7\t13043\t58333\t0.563\t68055\tRomney\t68055\t0.000280925\t68055.0\n13236\t-96.472249\t42.237199\tWinnebago village\tNE\tNebraska\tThurston County\t792\t22.3\t7.1\t24.8\t10944\t41154\t0.563\t68071\tRomney\t68071\t0.001152812\t68071.0\n13237\t-96.49244499999999\t42.148982000000004\tWalthill village\tNE\tNebraska\tThurston County\t924\t26.4\t12.9\t18.9\t13828\t62679\t0.563\t68067\tRomney\t68067\t0.0013449479999999999\t68067.0\n13238\t-96.366656\t42.11607\tMacy CDP\tNE\tNebraska\tThurston County\t930\t19.7\t10.4\t41.2\t6945\t68571\t0.563\t68039\tRomney\t68039\t0.001353681\t68039.0\n13239\t-96.70022800000001\t42.17694\tThurston village\tNE\tNebraska\tThurston County\t125\t40.8\t15.9\t2.9\t16815\t92500\t0.563\t68062\tRomney\t68062\t0.000181946\t68062.0\n13240\t-99.005325\t41.680013\tElyria village\tNE\tNebraska\tValley County\t49\t40.6\t18.2\t3.4\t15321\t52500\t0.2269\t68837\tRomney\t68837\t7.13e-05\t68837.0\n13241\t-98.930242\t41.603404\tOrd city\tNE\tNebraska\tValley County\t2199\t47.7\t20.5\t4.0\t19178\t69262\t0.2269\t68862\tRomney\t68862\t0.0032008009999999996\t68862.0\n13242\t-99.126042\t41.424778\tArcadia village\tNE\tNebraska\tValley County\t328\t40.4\t19.3\t4.2\t15207\t53000\t0.2269\t68815\tRomney\t68815\t0.000477427\t68815.0\n13243\t-98.77243399999999\t41.495546999999995\tNorth Loup village\tNE\tNebraska\tValley County\t314\t45.5\t18.8\t4.7\t14178\t60000\t0.2269\t68859\tRomney\t68859\t0.000457049\t68859.0\n13244\t-96.026926\t41.456725\tFort Calhoun city\tNE\tNebraska\tWashington County\t897\t40.9\t22.8\t6.0\t24463\t120192\t0.3057\t68023\tRomney\t68023\t0.001305647\t68023.0\n13245\t-96.208512\t41.397906\tWashington village\tNE\tNebraska\tWashington County\t134\t40.9\t28.4\t2.9\t25762\t190625\t0.3057\t68068\tRomney\t68068\t0.000195047\t68068.0\n13246\t-96.203551\t41.4745\tKennard village\tNE\tNebraska\tWashington County\t387\t39.4\t15.6\t6.9\t23250\t127083\t0.3057\t68034\tRomney\t68034\t0.000563306\t68034.0\n13247\t-96.216675\t41.673813\tHerman village\tNE\tNebraska\tWashington County\t305\t43.9\t21.2\t12.1\t21609\t98182\t0.3057\t68029\tRomney\t68029\t0.000443949\t68029.0\n13248\t-96.356349\t41.454617\tArlington village\tNE\tNebraska\tWashington County\t1232\t39.8\t26.1\t4.9\t23161\t104808\t0.3057\t68002\tRomney\t68002\t0.001793264\t68002.0\n13249\t-96.13670400000001\t41.54394\tBlair city\tNE\tNebraska\tWashington County\t7921\t35.8\t28.1\t6.0\t24144\t116210\t0.3057\t68008\tRomney\t68008\t0.01152958\t68008.0\n13250\t-97.30431\t42.112581\tHoskins village\tNE\tNebraska\tWayne County\t261\t39.5\t13.6\t4.2\t18476\t101563\t0.2917\t68740\tRomney\t68740\t0.00037990400000000003\t68740.0\n13251\t-97.190904\t42.275760999999996\tCarroll village\tNE\tNebraska\tWayne County\t237\t42.9\t17.0\t3.6\t17603\t86000\t0.2917\t68723\tRomney\t68723\t0.00034497\t68723.0\n13252\t-97.01495600000001\t42.237297\tWayne city\tNE\tNebraska\tWayne County\t5401\t27.3\t44.3\t5.4\t19126\t104823\t0.2917\t68787\tRomney\t68787\t0.00786154\t68787.0\n13253\t-97.17535500000001\t42.177426000000004\tWinside village\tNE\tNebraska\tWayne County\t420\t40.4\t19.4\t4.7\t17458\t80000\t0.2917\t68790\tRomney\t68790\t0.00061134\t68790.0\n13254\t-97.29468299999999\t42.334823\tSholes village\tNE\tNebraska\tWayne County\t24\t36.3\t18.8\t0.0\t17496\t85000\t0.2917\t68771\tRomney\t68771\t3.4899999999999995e-05\t68771.0\n13255\t-98.448347\t40.332991\tBlue Hill city\tNE\tNebraska\tWebster County\t902\t48.1\t14.7\t6.3\t20188\t84355\t0.2537\t68930\tRomney\t68930\t0.001312925\t68930.0\n13256\t-98.595878\t40.323454999999996\tBladen village\tNE\tNebraska\tWebster County\t256\t41.3\t20.4\t3.6\t16052\t69167\t0.2537\t68928\tRomney\t68928\t0.000372626\t68928.0\n13257\t-98.329308\t40.073383\tGuide Rock village\tNE\tNebraska\tWebster County\t214\t50.9\t17.9\t7.5\t17848\t38333\t0.2537\t68942\tRomney\t68942\t0.000311492\t68942.0\n13258\t-98.522359\t40.086421\tRed Cloud city\tNE\tNebraska\tWebster County\t1050\t49.2\t15.8\t6.6\t18865\t51860\t0.2537\t68970\tRomney\t68970\t0.00152835\t68970.0\n13259\t-98.44891199999999\t40.171462\tCowles village\tNE\tNebraska\tWebster County\t42\t40.0\t21.4\t4.3\t16146\t65000\t0.2537\t68970\tRomney\t68970\t6.11e-05\t68970.0\n13260\t-98.678358\t41.780105999999996\tEricson village\tNE\tNebraska\tWheeler County\t96\t39.0\t16.1\t3.6\t16243\t58333\t0.2076\t68637\tRomney\t68637\t0.000139735\t68637.0\n13261\t-98.552541\t41.883928000000004\tBartlett village\tNE\tNebraska\tWheeler County\t118\t41.3\t17.1\t4.4\t16265\t58333\t0.2076\t68622\tRomney\t68622\t0.000171757\t68622.0\n13262\t-97.461603\t40.896868\tWaco village\tNE\tNebraska\tYork County\t252\t43.4\t11.0\t4.5\t18933\t81250\t0.2161\t68460\tRomney\t68460\t0.00036680400000000003\t68460.0\n13263\t-97.607412\t41.006112\tBenedict village\tNE\tNebraska\tYork County\t273\t43.3\t11.1\t4.8\t18977\t78000\t0.2161\t68316\tRomney\t68316\t0.000397371\t68316.0\n13264\t-97.747054\t40.883613000000004\tBradshaw village\tNE\tNebraska\tYork County\t317\t41.4\t12.3\t5.8\t19003\t117188\t0.2161\t68319\tRomney\t68319\t0.000461416\t68319.0\n13265\t-97.401039\t41.028324\tGresham village\tNE\tNebraska\tYork County\t265\t43.4\t11.0\t4.9\t18979\t79167\t0.2161\t68367\tRomney\t68367\t0.00038572599999999997\t68367.0\n13266\t-97.595497\t40.871528000000005\tYork city\tNE\tNebraska\tYork County\t7907\t39.2\t20.4\t5.9\t22554\t100309\t0.2161\t68467\tRomney\t68467\t0.011509202\t68467.0\n13267\t-97.81135\t40.779563\tHenderson city\tNE\tNebraska\tYork County\t969\t49.6\t17.3\t3.8\t21414\t95000\t0.2161\t68371\tRomney\t68371\t0.001410449\t68371.0\n13268\t-97.72364300000001\t40.724089\tLushton village\tNE\tNebraska\tYork County\t33\t37.5\t10.0\t5.6\t19617\t112500\t0.2161\t68371\tRomney\t68371\t4.8e-05\t68371.0\n13269\t-97.496673\t40.970321000000006\tThayer village\tNE\tNebraska\tYork County\t70\t42.5\t12.2\t5.3\t18898\t80000\t0.2161\t68460\tRomney\t68460\t0.00010189\t68460.0\n13270\t-97.595024\t40.744142\tMcCool Junction village\tNE\tNebraska\tYork County\t380\t40.1\t10.9\t4.7\t19895\t110526\t0.2161\t68401\tRomney\t68401\t0.000553117\t68401.0\n13271\t-118.77671699999999\t39.474917\tFallon city\tNV\tNevada\tChurchill County\t8136\t33.8\t18.0\t8.2\t20995\t114871\t0.2885\t89406\tObama\t89406\t0.019614264\t89406.0\n13272\t-118.716572\t39.415988\tFallon Station CDP\tNV\tNevada\tChurchill County\t1297\t22.7\t27.3\t6.3\t18319\t137500\t0.2885\t89406\tObama\t89406\t0.003126807\t89406.0\n13273\t-115.41291399999999\t36.039691\tBlue Diamond CDP\tNV\tNevada\tClark County\t383\t46.8\t42.6\t18.4\t33828\t210556\t0.5642\t89004\tObama\t89004\t0.0009233360000000001\t89004.0\n13274\t-114.928109\t35.837826\tBoulder City\tNV\tNevada\tClark County\t15479\t52.2\t26.1\t16.3\t31583\t176153\t0.5642\t89005\tObama\t89005\t0.037316764\t89005.0\n13275\t-114.877632\t35.298113\tCal-Nev-Ari CDP\tNV\tNevada\tClark County\t296\t51.3\t5.8\t18.9\t24825\t83333\t0.5642\t89039\tObama\t89039\t0.000713597\t89039.0\n13276\t-115.629741\t35.842617\tSandy Valley CDP\tNV\tNevada\tClark County\t2081\t47.7\t21.6\t12.2\t26898\t137723\t0.5642\t89019\tObama\t89019\t0.005016874\t89019.0\n13277\t-115.13649699999999\t36.07947\tParadise CDP\tNV\tNevada\tClark County\t225835\t36.5\t21.8\t16.4\t25401\t148573\t0.5642\t89119\tObama\t89119\t0.544442886\t89119.0\n13278\t-115.01676200000001\t36.028523\tHenderson city\tNV\tNevada\tClark County\t248775\t38.2\t28.6\t13.1\t32494\t169001\t0.5642\t89012\tObama\t89012\t0.599746625\t89012.0\n13279\t-114.647465\t36.770794\tMoapa Town CDP\tNV\tNevada\tClark County\t5527\t30.8\t18.2\t13.3\t20821\t108618\t0.5642\t89025\tObama\t89025\t0.013324488\t89025.0\n13280\t-114.455425\t36.609631\tMoapa Valley CDP\tNV\tNevada\tClark County\t8306\t39.2\t19.9\t17.4\t20273\t122191\t0.5642\t89021\tObama\t89021\t0.0200241\t89021.0\n13281\t-114.91566100000001\t35.484122\tSearchlight CDP\tNV\tNevada\tClark County\t606\t51.3\t5.7\t18.8\t24826\t84722\t0.5642\t89046\tObama\t89046\t0.001460944\t89046.0\n13282\t-115.129995\t36.136677\tWinchester CDP\tNV\tNevada\tClark County\t29943\t41.4\t19.0\t16.7\t21665\t107072\t0.5642\t89109\tObama\t89109\t0.07218656700000001\t89109.0\n13283\t-115.26238400000001\t36.098855\tSpring Valley CDP\tNV\tNevada\tClark County\t172776\t38.1\t25.6\t13.8\t31901\t151041\t0.5642\t89147\tObama\t89147\t0.41652828\t89147.0\n13284\t-115.25376000000001\t36.206926\tLas Vegas city\tNV\tNevada\tClark County\t580369\t35.8\t22.0\t16.8\t25773\t152899\t0.5642\t89128\tObama\t89128\t1.3991532469999999\t89128.0\n13285\t-115.21486999999999\t36.017088\tEnterprise CDP\tNV\tNevada\tClark County\t96907\t44.1\t22.8\t11.7\t28250\t144068\t0.5642\t89139\tObama\t89139\t0.23362333899999999\t89139.0\n13286\t-115.047579\t36.185385\tSunrise Manor CDP\tNV\tNevada\tClark County\t181244\t32.2\t12.7\t17.6\t20520\t116945\t0.5642\t89110\tObama\t89110\t0.43694293\t89110.0\n13287\t-115.057305\t36.246472\tNellis AFB CDP\tNV\tNevada\tClark County\t7813\t24.1\t12.1\t18.2\t16032\t91786\t0.5642\t89115\tObama\t89115\t0.018835576\t89115.0\n13288\t-115.03288400000001\t36.098594\tWhitney CDP\tNV\tNevada\tClark County\t30244\t39.2\t12.6\t16.1\t25859\t104171\t0.5642\t89122\tObama\t89122\t0.072912218\t89122.0\n13289\t-115.12280600000001\t36.271077000000005\tNorth Las Vegas city\tNV\tNevada\tClark County\t213010\t31.8\t13.9\t13.6\t21183\t136104\t0.5642\t89031\tObama\t89031\t0.513524384\t89031.0\n13290\t-114.10641100000001\t36.805209000000005\tMesquite city\tNV\tNevada\tClark County\t13829\t44.4\t17.0\t17.0\t24975\t135071\t0.5642\t89027\tObama\t89027\t0.033338945\t89027.0\n13291\t-114.12196899999999\t36.719854999999995\tBunkerville CDP\tNV\tNevada\tClark County\t1441\t27.4\t13.6\t15.4\t17230\t120313\t0.5642\t89007\tObama\t89007\t0.003473962\t89007.0\n13292\t-115.38068500000001\t36.102231\tSummerlin South CDP\tNV\tNevada\tClark County\t21835\t39.8\t33.4\t11.5\t38601\t146638\t0.5642\t89124\tObama\t89124\t0.052639805\t89124.0\n13293\t-115.71808200000001\t36.572562\tIndian Springs CDP\tNV\tNevada\tClark County\t1818\t35.9\t3.6\t11.1\t27033\t89318\t0.5642\t89018\tObama\t89018\t0.004382833\t89018.0\n13294\t-115.43186999999999\t35.829921999999996\tGoodsprings CDP\tNV\tNevada\tClark County\t240\t47.9\t21.7\t12.3\t26889\t137500\t0.5642\t89019\tObama\t89019\t0.000578592\t89019.0\n13295\t-114.68921999999999\t35.131820000000005\tLaughlin CDP\tNV\tNevada\tClark County\t7564\t51.2\t13.0\t12.2\t25371\t123235\t0.5642\t89029\tObama\t89029\t0.018235287\t89029.0\n13296\t-115.61354299999999\t36.26282\tMount Charleston CDP\tNV\tNevada\tClark County\t380\t48.1\t37.2\t19.1\t29827\t223864\t0.5642\t891XX\tObama\t891XX\t0.0009161039999999999\t0.0\n13297\t-119.736823\t38.938964\tGardnerville CDP\tNV\tNevada\tDouglas County\t5225\t45.4\t25.7\t13.7\t29041\t175078\t0.3565\t89410\tObama\t89410\t0.012596427\t89410.0\n13298\t-119.74210900000001\t38.886697999999996\tGardnerville Ranchos CDP\tNV\tNevada\tDouglas County\t11710\t39.0\t22.9\t15.0\t26599\t164786\t0.3565\t89410\tObama\t89410\t0.028230461000000002\t89410.0\n13299\t-119.76885\t38.960789\tMinden CDP\tNV\tNevada\tDouglas County\t3356\t48.4\t31.5\t15.3\t34572\t228898\t0.3565\t89423\tObama\t89423\t0.008090643\t89423.0\n13300\t-119.883816\t38.99071\tKingsbury CDP\tNV\tNevada\tDouglas County\t3452\t46.4\t44.6\t14.9\t47901\t263947\t0.3565\t89449\tObama\t89449\t0.00832208\t89449.0\n13301\t-119.78366799999999\t39.085374\tIndian Hills CDP\tNV\tNevada\tDouglas County\t5198\t42.4\t25.4\t13.5\t30295\t166608\t0.3565\t89705\tObama\t89705\t0.012531335\t89705.0\n13302\t-119.92543400000001\t38.997477\tZephyr Cove-Round Hill Village CDP\tNV\tNevada\tDouglas County\t2141\t50.5\t42.0\t17.6\t48405\t391379\t0.3565\t89448\tObama\t89448\t0.005161522\t89448.0\n13303\t-119.724944\t39.049825\tJohnson Lane CDP\tNV\tNevada\tDouglas County\t6219\t46.8\t25.2\t15.5\t35010\t229512\t0.3565\t89423\tObama\t89423\t0.014992762\t89423.0\n13304\t-119.94395300000001\t38.967498\tStateline CDP\tNV\tNevada\tDouglas County\t1516\t36.1\t22.3\t14.6\t21310\t34881\t0.3565\t89449\tObama\t89449\t0.003654772\t89449.0\n13305\t-116.11283999999999\t40.71741\tCarlin city\tNV\tNevada\tElko County\t2191\t35.4\t12.1\t9.1\t23217\t93333\t0.2196\t89822\tObama\t89822\t0.005282062\t89822.0\n13306\t-115.766348\t40.838259\tElko city\tNV\tNevada\tElko County\t17426\t32.3\t21.3\t7.9\t25482\t134714\t0.2196\t89803\tObama\t89803\t0.04201059099999999\t89803.0\n13307\t-114.078352\t40.740613\tWest Wendover city\tNV\tNevada\tElko County\t5480\t26.4\t11.2\t6.1\t16655\t69432\t0.2196\t89883\tObama\t89883\t0.013211181\t89883.0\n13308\t-114.95398600000001\t41.113232\tWells city\tNV\tNevada\tElko County\t1383\t38.0\t18.2\t7.8\t21119\t90517\t0.2196\t89835\tObama\t89835\t0.0033341359999999997\t89835.0\n13309\t-115.597076\t40.738558000000005\tSpring Creek CDP\tNV\tNevada\tElko County\t11387\t32.6\t21.9\t7.5\t27758\t133212\t0.2196\t89815\tObama\t89815\t0.027451773\t89815.0\n13310\t-116.18243799999999\t41.916573\tOwyhee CDP\tNV\tNevada\tElko County\t1040\t29.1\t17.2\t21.5\t16352\t50000\t0.2196\t89832\tObama\t89832\t0.002507231\t89832.0\n13311\t-117.609991\t41.973940999999996\tMcDermitt CDP\tNV\tNevada\tHumboldt County\t290\t37.4\t1.6\t44.4\t9674\t20000\t0.3024\t89421\tObama\t89421\t0.000699132\t89421.0\n13312\t-117.725721\t40.967701\tWinnemucca city\tNV\tNevada\tHumboldt County\t7747\t35.6\t25.3\t9.4\t27136\t124705\t0.3024\t89445\tObama\t89445\t0.018676463\t89445.0\n13313\t-116.93920700000001\t40.641553\tBattle Mountain CDP\tNV\tNevada\tLander County\t2646\t30.9\t14.3\t8.6\t21531\t74462\t0.2467\t89820\tObama\t89820\t0.006378975\t89820.0\n13314\t-114.519522\t37.612426\tCaliente city\tNV\tNevada\tLincoln County\t1280\t38.3\t20.3\t18.5\t17894\t81184\t0.1859\t89008\tObama\t89008\t0.0030858229999999997\t89008.0\n13315\t-119.567806\t39.257917\tDayton CDP\tNV\tNevada\tLyon County\t9610\t39.0\t17.4\t15.4\t21336\t155054\t0.3438\t89403\tObama\t89403\t0.023167782\t89403.0\n13316\t-119.19703799999999\t39.587719\tFernley CDP\tNV\tNevada\tLyon County\t19906\t37.8\t13.8\t16.0\t21645\t144185\t0.3438\t89408\tObama\t89408\t0.047989372999999995\t89408.0\n13317\t-119.164755\t38.987654\tYerington city\tNV\tNevada\tLyon County\t3114\t44.9\t17.1\t23.2\t21989\t109348\t0.3438\t89447\tObama\t89447\t0.007507229\t89447.0\n13318\t-119.214707\t39.383387\tSilver Springs CDP\tNV\tNevada\tLyon County\t7333\t43.9\t11.1\t21.7\t19342\t99544\t0.3438\t89429\tObama\t89429\t0.017678392\t89429.0\n13319\t-119.34431799999999\t38.784294\tSmith Valley CDP\tNV\tNevada\tLyon County\t2320\t48.4\t18.6\t16.7\t26223\t281075\t0.3438\t89430\tObama\t89430\t0.005593055\t89430.0\n13320\t-118.627384\t38.525459999999995\tHawthorne CDP\tNV\tNevada\tMineral County\t3015\t46.7\t16.9\t15.3\t22549\t74259\t0.4241\t89415\tObama\t89415\t0.00726856\t89415.0\n13321\t-118.789749\t38.931563\tSchurz CDP\tNV\tNevada\tMineral County\t705\t28.4\t7.3\t17.9\t19763\t80588\t0.4241\t89427\tObama\t89427\t0.001699614\t89427.0\n13322\t-116.70301299999998\t36.934946999999994\tBeatty CDP\tNV\tNevada\tNye County\t1854\t44.1\t10.0\t12.0\t26055\t96735\t0.3607\t89003\tObama\t89003\t0.004469622\t89003.0\n13323\t-116.019117\t36.241958000000004\tPahrump CDP\tNV\tNevada\tNye County\t34335\t49.3\t13.1\t15.9\t22323\t140517\t0.3607\t89048\tObama\t89048\t0.082774798\t89048.0\n13324\t-117.92241000000001\t38.864933\tGabbs city\tNV\tNevada\tNye County\t503\t44.3\t11.9\t24.2\t16952\t35250\t0.3607\t89409\tObama\t89409\t0.001212632\t89409.0\n13325\t-117.248157\t38.099581\tTonopah CDP\tNV\tNevada\tNye County\t4200\t41.3\t11.0\t16.3\t23837\t91399\t0.3607\t89049\tObama\t89049\t0.010125358000000001\t89049.0\n13326\t-118.47737099999999\t40.179024\tLovelock city\tNV\tNevada\tPershing County\t1653\t35.0\t15.0\t12.0\t19344\t83977\t0.3355\t89419\tObama\t89419\t0.003985051\t89419.0\n13327\t-119.37886200000001\t40.580849\tGerlach-Empire CDP\tNV\tNevada\tWashoe County\t674\t42.2\t14.0\t11.3\t21094\t88571\t0.5079\t89405\tObama\t89405\t0.0016248789999999999\t89405.0\n13328\t-119.358759\t39.828177000000004\tNixon CDP\tNV\tNevada\tWashoe County\t495\t33.6\t9.5\t16.7\t18945\t78333\t0.5079\t89424\tObama\t89424\t0.001193346\t89424.0\n13329\t-119.67177099999999\t39.656029\tSpanish Springs CDP\tNV\tNevada\tWashoe County\t18252\t35.4\t22.6\t9.2\t29889\t209679\t0.5079\t89436\tObama\t89436\t0.044001911\t89436.0\n13330\t-119.7766\t39.610504\tSun Valley CDP\tNV\tNevada\tWashoe County\t20549\t32.6\t7.9\t15.2\t18992\t109869\t0.5079\t89433\tObama\t89433\t0.049539517000000005\t89433.0\n13331\t-119.81921799999999\t39.514153\tReno city\tNV\tNevada\tWashoe County\t215180\t35.6\t28.7\t13.4\t27737\t180874\t0.5079\t89501\tObama\t89501\t0.518755819\t89501.0\n13332\t-119.29014699999999\t39.632356\tWadsworth CDP\tNV\tNevada\tWashoe County\t1036\t33.4\t9.7\t16.8\t18943\t77609\t0.5079\t89442\tObama\t89442\t0.002497588\t89442.0\n13333\t-119.96299199999999\t39.68169\tCold Springs CDP\tNV\tNevada\tWashoe County\t7807\t36.1\t12.6\t8.8\t25705\t139432\t0.5079\t89506\tObama\t89506\t0.018821111\t89506.0\n13334\t-119.96127800000001\t39.541466\tVerdi-Mogul CDP\tNV\tNevada\tWashoe County\t4299\t45.9\t48.8\t5.9\t42480\t265244\t0.5079\t89439\tObama\t89439\t0.010364027\t89439.0\n13335\t-119.83776999999999\t39.675313\tLemmon Valley-Golden Valley CDP\tNV\tNevada\tWashoe County\t7847\t41.1\t15.8\t13.4\t26548\t146881\t0.5079\t89506\tObama\t89506\t0.018917543000000002\t89506.0\n13336\t-119.723467\t39.562082000000004\tSparks city\tNV\tNevada\tWashoe County\t84225\t35.8\t22.4\t11.7\t26377\t173798\t0.5079\t89434\tObama\t89434\t0.203049581\t89434.0\n13337\t-119.630647\t39.946078\tSutcliffe CDP\tNV\tNevada\tWashoe County\t534\t33.6\t9.7\t16.7\t18946\t77727\t0.5079\t89510\tObama\t89510\t0.001287367\t89510.0\n13338\t-119.95107\t39.227198\tIncline Village-Crystal Bay CDP\tNV\tNevada\tWashoe County\t13240\t45.3\t48.5\t12.2\t55271\t588938\t0.5079\t89451\tObama\t89451\t0.031918984\t89451.0\n13339\t-114.873796\t39.264686\tEly city\tNV\tNevada\tWhite Pine County\t3985\t40.5\t18.3\t10.3\t22754\t92477\t0.2654\t89301\tObama\t89301\t0.009607036\t89301.0\n13340\t-114.77726299999999\t39.401796999999995\tMcGill CDP\tNV\tNevada\tWhite Pine County\t1018\t44.2\t2.7\t12.1\t18576\t66228\t0.2654\t89318\tObama\t89318\t0.002454194\t89318.0\n13341\t-119.746478\t39.150768\tCarson City\tNV\tNevada\tCarson City\t55291\t40.0\t23.6\t11.9\t26967\t181777\t0.4413\t89701\tObama\t89701\t0.133295511\t89701.0\n13342\t-71.591261\t43.447365999999995\tTilton-Northfield CDP\tNH\tNew Hampshire\tBelknap County\t3377\t38.6\t19.9\t7.5\t22680\t135990\t0.4689\t3276\tObama\t03276\t0.022037147000000003\t3276.0\n13343\t-71.504276\t43.658309\tMeredith CDP\tNH\tNew Hampshire\tBelknap County\t1935\t46.2\t29.8\t7.0\t24899\t162143\t0.4689\t3253\tObama\t03253\t0.012627148000000001\t3253.0\n13344\t-71.477855\t43.572492\tLaconia city\tNH\tNew Hampshire\tBelknap County\t17425\t41.0\t24.0\t7.0\t24958\t151786\t0.4689\t3246\tObama\t03246\t0.113709592\t3246.0\n13345\t-71.12498599999999\t44.052601\tNorth Conway CDP\tNH\tNew Hampshire\tCarroll County\t2220\t39.7\t30.2\t8.8\t26815\t171802\t0.4887\t3860\tObama\t03860\t0.014486961000000001\t3860.0\n13346\t-71.127049\t43.981053\tConway CDP\tNH\tNew Hampshire\tCarroll County\t1816\t44.0\t18.4\t7.6\t25310\t146528\t0.4887\t3818\tObama\t03818\t0.011850595\t3818.0\n13347\t-71.20865500000001\t43.590981\tWolfeboro CDP\tNH\tNew Hampshire\tCarroll County\t3273\t49.8\t38.9\t5.9\t31311\t236631\t0.4887\t3894\tObama\t03894\t0.021358479\t3894.0\n13348\t-72.489034\t42.789072\tHinsdale CDP\tNH\tNew Hampshire\tCheshire County\t1816\t40.2\t13.0\t9.0\t20618\t130310\t0.6136\t3451\tObama\t03451\t0.011850595\t3451.0\n13349\t-72.300033\t42.949199\tKeene city\tNH\tNew Hampshire\tCheshire County\t22733\t36.2\t37.6\t7.2\t25184\t153476\t0.6136\t3431\tObama\t03431\t0.148347785\t3431.0\n13350\t-72.211454\t42.904779\tMarlborough CDP\tNH\tNew Hampshire\tCheshire County\t1127\t44.2\t31.3\t4.3\t24778\t142381\t0.6136\t3455\tObama\t03455\t0.007354416999999999\t3455.0\n13351\t-72.385335\t42.776926\tWinchester CDP\tNH\tNew Hampshire\tCheshire County\t1971\t39.7\t17.5\t13.0\t20134\t128588\t0.6136\t3470\tObama\t03470\t0.012862071999999999\t3470.0\n13352\t-72.322379\t42.870934999999996\tWest Swanzey CDP\tNH\tNew Hampshire\tCheshire County\t1198\t38.3\t20.2\t8.7\t24023\t137987\t0.6136\t3446\tObama\t03446\t0.007817738000000001\t3446.0\n13353\t-72.023689\t42.812698\tJaffrey CDP\tNH\tNew Hampshire\tCheshire County\t2954\t40.2\t26.6\t6.1\t25598\t152400\t0.6136\t3452\tObama\t03452\t0.019276794\t3452.0\n13354\t-71.61038\t44.371528000000005\tWhitefield CDP\tNH\tNew Hampshire\tCoos County\t1066\t42.6\t14.7\t8.2\t21717\t121111\t0.5793\t3598\tObama\t03598\t0.006956352\t3598.0\n13355\t-71.26038\t44.486791\tBerlin city\tNH\tNew Hampshire\tCoos County\t9794\t45.6\t6.9\t8.9\t20286\t73913\t0.5793\t035XX\tObama\t035XX\t0.063912295\t0.0\n13356\t-71.519863\t44.605072\tGroveton CDP\tNH\tNew Hampshire\tCoos County\t1153\t45.1\t4.1\t7.2\t17566\t70667\t0.5793\t3582\tObama\t03582\t0.007524084\t3582.0\n13357\t-71.184978\t44.392138\tGorham CDP\tNH\tNew Hampshire\tCoos County\t1697\t46.0\t14.8\t5.4\t23691\t97105\t0.5793\t3581\tObama\t03581\t0.011074042\t3581.0\n13358\t-71.574792\t44.489525\tLancaster CDP\tNH\tNew Hampshire\tCoos County\t1680\t40.8\t21.0\t6.7\t22803\t103299\t0.5793\t3584\tObama\t03584\t0.010963106\t3584.0\n13359\t-71.763699\t44.321013\tLittleton CDP\tNH\tNew Hampshire\tGrafton County\t4758\t41.1\t28.3\t5.9\t22860\t131867\t0.6085\t3561\tObama\t03561\t0.031049081\t3561.0\n13360\t-71.74696\t43.597852\tBristol CDP\tNH\tNew Hampshire\tGrafton County\t1925\t42.3\t26.4\t9.4\t24065\t144429\t0.6085\t3222\tObama\t03222\t0.012561892\t3222.0\n13361\t-72.277361\t43.707049\tHanover CDP\tNH\tNew Hampshire\tGrafton County\t8606\t23.5\t81.7\t8.2\t29626\t408955\t0.6085\t3755\tObama\t03755\t0.056159812999999996\t3755.0\n13362\t-71.6933\t43.741391\tPlymouth CDP\tNH\tNew Hampshire\tGrafton County\t3660\t22.0\t52.7\t11.4\t19789\t150704\t0.6085\t3264\tObama\t03264\t0.023883909\t3264.0\n13363\t-72.02896899999999\t44.145206\tWoodsville CDP\tNH\tNew Hampshire\tGrafton County\t1141\t42.9\t22.8\t6.2\t26116\t131071\t0.6085\t3785\tObama\t03785\t0.0074457759999999994\t3785.0\n13364\t-72.148674\t43.644658\tEnfield CDP\tNH\tNew Hampshire\tGrafton County\t1814\t42.6\t24.3\t3.5\t28781\t151316\t0.6085\t3748\tObama\t03748\t0.011837543999999998\t3748.0\n13365\t-72.253289\t43.635259999999995\tLebanon city\tNH\tNew Hampshire\tGrafton County\t13631\t37.8\t40.8\t4.8\t29186\t189632\t0.6085\t3766\tObama\t03766\t0.088951245\t3766.0\n13366\t-71.908624\t44.212638\tLisbon CDP\tNH\tNew Hampshire\tGrafton County\t1094\t40.4\t14.8\t5.3\t19338\t119922\t0.6085\t3585\tObama\t03585\t0.00713907\t3585.0\n13367\t-71.946049\t43.037997\tAntrim CDP\tNH\tNew Hampshire\tHillsborough County\t1469\t35.8\t28.3\t9.1\t23338\t138806\t0.4974\t3440\tObama\t03440\t0.009586192\t3440.0\n13368\t-71.801482\t42.772876000000004\tGreenville CDP\tNH\tNew Hampshire\tHillsborough County\t1209\t38.0\t13.5\t9.0\t27327\t122131\t0.4974\t3048\tObama\t03048\t0.007889521\t3048.0\n13369\t-71.89942099999999\t43.1141\tHillsborough CDP\tNH\tNew Hampshire\tHillsborough County\t1927\t37.7\t21.3\t8.6\t26104\t133654\t0.4974\t3244\tObama\t03244\t0.012574943\t3244.0\n13370\t-71.95925600000001\t42.878949\tPeterborough CDP\tNH\tNew Hampshire\tHillsborough County\t3087\t44.5\t44.5\t9.5\t33563\t187397\t0.4974\t3458\tObama\t03458\t0.020144706000000002\t3458.0\n13371\t-71.51686099999999\t43.000757\tPinardville CDP\tNH\tNew Hampshire\tHillsborough County\t6002\t30.3\t21.4\t7.4\t25241\t145769\t0.4974\t3102\tObama\t03102\t0.039167\t3102.0\n13372\t-71.444414\t42.984426\tManchester city\tNH\tNew Hampshire\tHillsborough County\t111335\t36.7\t26.2\t8.4\t27496\t177981\t0.4974\t3103\tObama\t03103\t0.7265341409999999\t3103.0\n13373\t-71.490783\t42.749054\tNashua city\tNH\tNew Hampshire\tHillsborough County\t87846\t38.1\t35.8\t8.4\t31256\t205230\t0.4974\t3062\tObama\t03062\t0.573252959\t3062.0\n13374\t-71.483959\t42.866864\tEast Merrimack CDP\tNH\tNew Hampshire\tHillsborough County\t4145\t39.9\t28.4\t6.8\t36094\t144397\t0.4974\t3054\tObama\t03054\t0.027048852999999998\t3054.0\n13375\t-71.661349\t42.8326\tMilford CDP\tNH\tNew Hampshire\tHillsborough County\t8789\t36.8\t28.1\t7.0\t29569\t187420\t0.4974\t3055\tObama\t03055\t0.057354009000000004\t3055.0\n13376\t-71.431395\t42.76396\tHudson CDP\tNH\tNew Hampshire\tHillsborough County\t7726\t38.3\t21.7\t7.8\t27168\t196466\t0.4974\t3051\tObama\t03051\t0.050417234000000005\t3051.0\n13377\t-71.738014\t42.847039\tWilton CDP\tNH\tNew Hampshire\tHillsborough County\t1315\t38.1\t33.6\t6.2\t28079\t210417\t0.4974\t3086\tObama\t03086\t0.00858124\t3086.0\n13378\t-71.712746\t43.223288000000004\tContoocook CDP\tNH\tNew Hampshire\tMerrimack County\t1544\t46.5\t45.1\t7.1\t35455\t195058\t0.5559\t3229\tObama\t03229\t0.010075615999999999\t3229.0\n13379\t-71.818763\t43.181568\tHenniker CDP\tNH\tNew Hampshire\tMerrimack County\t1754\t25.6\t53.2\t14.6\t26447\t178125\t0.5559\t3242\tObama\t03242\t0.011446004\t3242.0\n13380\t-71.331691\t43.299968\tPittsfield CDP\tNH\tNew Hampshire\tMerrimack County\t1778\t36.3\t16.2\t5.9\t22071\t142445\t0.5559\t3263\tObama\t03263\t0.01160262\t3263.0\n13381\t-71.457143\t43.094023\tHooksett CDP\tNH\tNew Hampshire\tMerrimack County\t4373\t35.7\t37.4\t9.0\t31048\t178617\t0.5559\t3106\tObama\t03106\t0.028536702999999997\t3106.0\n13382\t-71.452607\t43.138006\tSuncook CDP\tNH\tNew Hampshire\tMerrimack County\t5360\t38.4\t17.7\t5.3\t26956\t152652\t0.5559\t3275\tObama\t03275\t0.034977527\t3275.0\n13383\t-71.559383\t43.230609\tConcord city\tNH\tNew Hampshire\tMerrimack County\t43466\t38.6\t35.7\t7.2\t27648\t161702\t0.5559\t033HH\tObama\t033HH\t0.283644254\t0.0\n13384\t-71.42546899999999\t43.033646999999995\tSouth Hooksett CDP\tNH\tNew Hampshire\tMerrimack County\t5809\t36.4\t30.8\t6.9\t30708\t214029\t0.5559\t3106\tObama\t03106\t0.037907548\t3106.0\n13385\t-71.669276\t43.449515000000005\tFranklin city\tNH\tNew Hampshire\tMerrimack County\t8936\t38.8\t17.0\t12.6\t21413\t129317\t0.5559\t3235\tObama\t03235\t0.058313280999999995\t3235.0\n13386\t-71.316934\t42.893947999999995\tDerry CDP\tNH\tNew Hampshire\tRockingham County\t23192\t35.0\t29.0\t8.5\t28501\t185730\t0.4703\t3038\tObama\t03038\t0.151343062\t3038.0\n13387\t-70.938738\t43.075562\tNewmarket CDP\tNH\tNew Hampshire\tRockingham County\t5795\t33.2\t37.4\t6.6\t28976\t190400\t0.4703\t3857\tObama\t03857\t0.037816189\t3857.0\n13388\t-71.090837\t43.034665000000004\tEpping CDP\tNH\tNew Hampshire\tRockingham County\t1934\t37.8\t14.5\t5.0\t29186\t183537\t0.4703\t3042\tObama\t03042\t0.012620623000000001\t3042.0\n13389\t-70.946591\t42.977277\tExeter CDP\tNH\tNew Hampshire\tRockingham County\t9801\t42.4\t41.0\t5.8\t30273\t199794\t0.4703\t3833\tObama\t03833\t0.063957975\t3833.0\n13390\t-71.17135999999999\t43.03328\tRaymond CDP\tNH\tNew Hampshire\tRockingham County\t3132\t36.8\t17.4\t5.3\t25713\t168561\t0.4703\t3077\tObama\t03077\t0.020438361000000002\t3077.0\n13391\t-71.36206\t42.850596\tLondonderry CDP\tNH\tNew Hampshire\tRockingham County\t11754\t37.6\t42.9\t6.9\t35319\t231566\t0.4703\t3053\tObama\t03053\t0.076702585\t3053.0\n13392\t-70.784808\t43.056933\tPortsmouth city\tNH\tNew Hampshire\tRockingham County\t20773\t41.3\t47.9\t6.9\t37564\t259654\t0.4703\t3801\tObama\t03801\t0.135557495\t3801.0\n13393\t-70.82628000000001\t42.942898\tHampton CDP\tNH\tNew Hampshire\tRockingham County\t9601\t43.5\t46.4\t6.8\t40892\t285947\t0.4703\t3842\tObama\t03842\t0.062652843\t3842.0\n13394\t-70.885437\t43.253457\tSomersworth city\tNH\tNew Hampshire\tStrafford County\t12510\t35.9\t23.3\t8.5\t24756\t153025\t0.5632\t3878\tObama\t03878\t0.081635982\t3878.0\n13395\t-70.978835\t43.299217999999996\tRochester city\tNH\tNew Hampshire\tStrafford County\t31451\t39.0\t19.0\t7.8\t23372\t133174\t0.5632\t3867\tObama\t03867\t0.205238472\t3867.0\n13396\t-71.07338100000001\t43.400107\tFarmington CDP\tNH\tNew Hampshire\tStrafford County\t3744\t37.0\t12.8\t9.9\t20676\t119518\t0.5632\t3835\tObama\t03835\t0.024432064\t3835.0\n13397\t-70.88729000000001\t43.191852000000004\tDover city\tNH\tNew Hampshire\tStrafford County\t29346\t36.8\t38.6\t7.1\t29451\t215435\t0.5632\t3820\tObama\t03820\t0.191501962\t3820.0\n13398\t-70.922084\t43.141762\tDurham CDP\tNH\tNew Hampshire\tStrafford County\t9494\t21.7\t78.4\t13.7\t18248\t293667\t0.5632\t3824\tObama\t03824\t0.061954598\t3824.0\n13399\t-72.336383\t43.378846\tClaremont city\tNH\tNew Hampshire\tSullivan County\t13290\t41.1\t16.0\t7.3\t23352\t126216\t0.5571\t3743\tObama\t03743\t0.086725996\t3743.0\n13400\t-72.42342\t43.236683\tCharlestown CDP\tNH\tNew Hampshire\tSullivan County\t1249\t43.1\t13.8\t9.4\t20175\t102692\t0.5571\t036HH\tObama\t036HH\t0.008150547\t0.0\n13401\t-72.174386\t43.371775\tNewport CDP\tNH\tNew Hampshire\tSullivan County\t4165\t37.0\t14.0\t8.8\t21291\t120445\t0.5571\t3773\tObama\t03773\t0.027179366\t3773.0\n13402\t-74.499319\t39.424994\tAbsecon city\tNJ\tNew Jersey\tAtlantic County\t8532\t43.3\t27.2\t13.5\t31654\t238873\t0.5796\t8201\tObama\t08201\t0.019248787\t8201.0\n13403\t-74.714813\t39.572994\tElwood-Magnolia CDP\tNJ\tNew Jersey\tAtlantic County\t1360\t34.1\t7.6\t11.9\t18738\t155572\t0.5796\t8217\tObama\t08217\t0.003068255\t8217.0\n13404\t-74.525705\t39.313703000000004\tLongport borough\tNJ\tNew Jersey\tAtlantic County\t1068\t61.0\t46.3\t10.6\t63862\t623311\t0.5796\t8403\tObama\t08403\t0.002409482\t8403.0\n13405\t-74.555807\t39.372448999999996\tNorthfield city\tNJ\tNew Jersey\tAtlantic County\t8082\t44.4\t27.4\t9.8\t31227\t247446\t0.5796\t8225\tObama\t08225\t0.018233555\t8225.0\n13406\t-74.550214\t39.468786\tPomona CDP\tNJ\tNew Jersey\tAtlantic County\t4436\t32.8\t20.2\t14.8\t26422\t227417\t0.5796\t8201\tObama\t08201\t0.010007925\t8201.0\n13407\t-74.604777\t39.320462\tSomers Point city\tNJ\tNew Jersey\tAtlantic County\t11535\t40.0\t25.1\t13.3\t27098\t233443\t0.5796\t8244\tObama\t08244\t0.026023763999999998\t8244.0\n13408\t-74.944806\t39.528281\tBuena borough\tNJ\tNew Jersey\tAtlantic County\t4241\t36.8\t12.2\t14.9\t22507\t189187\t0.5796\t8326\tObama\t08326\t0.009567991999999999\t8326.0\n13409\t-74.596812\t39.563937\tEgg Harbor City\tNJ\tNew Jersey\tAtlantic County\t4630\t34.7\t13.8\t18.1\t20039\t167527\t0.5796\t8215\tObama\t08215\t0.010445603000000001\t8215.0\n13410\t-74.775513\t39.358339\tEstell Manor city\tNJ\tNew Jersey\tAtlantic County\t1896\t42.1\t20.3\t10.4\t25370\t221528\t0.5796\t8319\tObama\t08319\t0.004277508\t8319.0\n13411\t-74.439858\t39.363809\tAtlantic City\tNJ\tNew Jersey\tAtlantic County\t41621\t36.2\t14.7\t18.9\t18454\t167021\t0.5796\t8401\tObama\t08401\t0.093899878\t8401.0\n13412\t-74.84263399999999\t39.592851\tFolsom borough\tNJ\tNew Jersey\tAtlantic County\t1970\t41.7\t21.0\t9.8\t26548\t198621\t0.5796\t8346\tObama\t08346\t0.004444457\t8346.0\n13413\t-74.72458\t39.452883\tMays Landing CDP\tNJ\tNew Jersey\tAtlantic County\t2314\t36.3\t24.9\t12.5\t26813\t199802\t0.5796\t8330\tObama\t08330\t0.005220545\t8330.0\n13414\t-74.50623900000001\t39.33039\tMargate City\tNJ\tNew Jersey\tAtlantic County\t8001\t53.6\t43.8\t12.2\t40995\t388275\t0.5796\t8402\tObama\t08402\t0.018050814\t8402.0\n13415\t-74.378153\t39.416183000000004\tBrigantine city\tNJ\tNew Jersey\tAtlantic County\t11737\t44.7\t29.6\t11.6\t27800\t295817\t0.5796\t8203\tObama\t08203\t0.02647949\t8203.0\n13416\t-74.482817\t39.343979\tVentnor City\tNJ\tNew Jersey\tAtlantic County\t11964\t43.8\t26.9\t13.9\t26988\t264988\t0.5796\t8406\tObama\t08406\t0.026991618\t8406.0\n13417\t-74.571857\t39.343771000000004\tLinwood city\tNJ\tNew Jersey\tAtlantic County\t7150\t47.6\t43.8\t10.3\t35157\t359344\t0.5796\t8221\tObama\t08221\t0.016130898\t8221.0\n13418\t-74.486621\t39.531946000000005\tPort Republic city\tNJ\tNew Jersey\tAtlantic County\t964\t43.7\t34.9\t9.6\t35113\t282222\t0.5796\t8241\tObama\t08241\t0.002174851\t8241.0\n13419\t-74.51866\t39.395487\tPleasantville city\tNJ\tNew Jersey\tAtlantic County\t19603\t33.2\t13.8\t18.5\t19037\t163655\t0.5796\t8232\tObama\t08232\t0.044225735\t8232.0\n13420\t-74.72365699999999\t39.304915\tCorbin City\tNJ\tNew Jersey\tAtlantic County\t472\t36.0\t20.5\t12.5\t25238\t262500\t0.5796\t8270\tObama\t08270\t0.001064865\t8270.0\n13421\t-74.76801\t39.657119\tHammonton town\tNJ\tNew Jersey\tAtlantic County\t14030\t39.8\t20.9\t15.9\t25956\t248742\t0.5796\t8037\tObama\t08037\t0.031652658\t8037.0\n13422\t-74.882097\t39.593976\tCollings Lakes CDP\tNJ\tNew Jersey\tAtlantic County\t1709\t38.0\t12.7\t11.6\t23494\t171332\t0.5796\t8346\tObama\t08346\t0.003855623\t8346.0\n13423\t-74.02933399999999\t40.875213\tBogota borough\tNJ\tNew Jersey\tBergen County\t8236\t38.2\t35.7\t12.4\t33285\t292867\t0.5518\t7603\tObama\t07603\t0.01858099\t7603.0\n13424\t-74.14093199999999\t40.995169\tMidland Park borough\tNJ\tNew Jersey\tBergen County\t7271\t41.7\t45.2\t5.6\t40550\t470397\t0.5518\t7432\tObama\t07432\t0.016403883\t7432.0\n13425\t-73.997321\t40.962016999999996\tHaworth borough\tNJ\tNew Jersey\tBergen County\t3366\t44.2\t64.3\t8.5\t55551\t692144\t0.5518\t7641\tObama\t07641\t0.007593931\t7641.0\n13426\t-74.014581\t40.831143\tRidgefield borough\tNJ\tNew Jersey\tBergen County\t11303\t41.8\t33.2\t8.2\t33158\t434307\t0.5518\t7657\tObama\t07657\t0.025500356000000002\t7657.0\n13427\t-74.06326700000001\t40.902515\tMaywood borough\tNJ\tNew Jersey\tBergen County\t9558\t42.3\t38.3\t8.4\t36245\t355646\t0.5518\t7607\tObama\t07607\t0.021563514\t7607.0\n13428\t-73.99625\t40.846843\tPalisades Park borough\tNJ\tNew Jersey\tBergen County\t18856\t38.5\t38.1\t9.6\t31472\t454193\t0.5518\t7650\tObama\t07650\t0.04254045099999999\t7650.0\n13429\t-74.097229\t41.000018\tHo-Ho-Kus borough\tNJ\tNew Jersey\tBergen County\t4056\t42.6\t73.7\t2.6\t73341\t817201\t0.5518\t7423\tObama\t07423\t0.009150619\t7423.0\n13430\t-73.95062800000001\t41.010184\tNorthvale borough\tNJ\tNew Jersey\tBergen County\t4480\t43.3\t36.9\t6.8\t35524\t458042\t0.5518\t7647\tObama\t07647\t0.010107192\t7647.0\n13431\t-73.95689499999999\t40.955034999999995\tDemarest borough\tNJ\tNew Jersey\tBergen County\t5111\t45.1\t66.3\t8.8\t62429\t671007\t0.5518\t7627\tObama\t07627\t0.011530772\t7627.0\n13432\t-73.951231\t40.993331\tNorwood borough\tNJ\tNew Jersey\tBergen County\t5998\t45.3\t50.0\t9.1\t49440\t641927\t0.5518\t7648\tObama\t07648\t0.013531906000000002\t7648.0\n13433\t-74.095472\t40.903237\tSaddle Brook CDP\tNJ\tNew Jersey\tBergen County\t13470\t42.1\t31.6\t10.5\t36952\t358001\t0.5518\t7663\tObama\t07663\t0.030389259\t7663.0\n13434\t-74.059423\t40.858011\tTeterboro borough\tNJ\tNew Jersey\tBergen County\t20\t30.0\t21.4\t10.0\t35392\t400000\t0.5518\t7608\tObama\t07608\t4.51e-05\t7608.0\n13435\t-73.933121\t41.002368\tRockleigh borough\tNJ\tNew Jersey\tBergen County\t389\t44.3\t30.3\t5.3\t34771\t468182\t0.5518\t7647\tObama\t07647\t0.000877611\t7647.0\n13436\t-74.108405\t40.879119\tGarfield city\tNJ\tNew Jersey\tBergen County\t30671\t36.5\t19.1\t13.8\t26362\t306145\t0.5518\t7026\tObama\t07026\t0.069195914\t7026.0\n13437\t-74.106865\t40.853564\tWallington borough\tNJ\tNew Jersey\tBergen County\t12136\t39.8\t22.2\t11.4\t32491\t349154\t0.5518\t7057\tObama\t07057\t0.027379662000000003\t7057.0\n13438\t-74.133279\t41.033163\tAllendale borough\tNJ\tNew Jersey\tBergen County\t6847\t44.6\t69.4\t7.5\t59234\t759972\t0.5518\t7401\tObama\t07401\t0.015447309\t7401.0\n13439\t-74.05924\t40.840988\tMoonachie borough\tNJ\tNew Jersey\tBergen County\t2767\t43.7\t17.9\t7.1\t29415\t290748\t0.5518\t7074\tObama\t07074\t0.006242545\t7074.0\n13440\t-74.145606\t41.059488\tRamsey borough\tNJ\tNew Jersey\tBergen County\t14393\t42.2\t61.3\t7.7\t51539\t587768\t0.5518\t7446\tObama\t07446\t0.032471611000000004\t7446.0\n13441\t-74.098569\t41.063244\tUpper Saddle River borough\tNJ\tNew Jersey\tBergen County\t8473\t43.1\t65.7\t8.9\t68983\t924376\t0.5518\t7458\tObama\t07458\t0.019115679\t7458.0\n13442\t-74.019953\t40.854382\tRidgefield Park village\tNJ\tNew Jersey\tBergen County\t13044\t39.0\t32.4\t9.0\t31139\t308564\t0.5518\t7660\tObama\t07660\t0.029428173\t7660.0\n13443\t-73.973946\t40.823523\tEdgewater borough\tNJ\tNew Jersey\tBergen County\t9732\t37.9\t57.7\t8.5\t60076\t365465\t0.5518\t7020\tObama\t07020\t0.02195607\t7020.0\n13444\t-73.985651\t41.016184\tOld Tappan borough\tNJ\tNew Jersey\tBergen County\t5870\t44.9\t56.6\t7.6\t58291\t761594\t0.5518\t7640\tObama\t07640\t0.013243129\t7640.0\n13445\t-74.124996\t40.960001\tGlen Rock borough\tNJ\tNew Jersey\tBergen County\t11557\t42.8\t67.8\t7.5\t55851\t607683\t0.5518\t7452\tObama\t07452\t0.026073397999999998\t7452.0\n13446\t-74.00795699999999\t41.013975\tRiver Vale CDP\tNJ\tNew Jersey\tBergen County\t9529\t44.1\t55.7\t6.9\t52267\t642960\t0.5518\t7675\tObama\t07675\t0.021498088\t7675.0\n13447\t-74.126768\t40.7871\tNorth Arlington borough\tNJ\tNew Jersey\tBergen County\t15276\t42.7\t25.0\t9.0\t33312\t343643\t0.5518\t7031\tObama\t07031\t0.034463721\t7031.0\n13448\t-74.079169\t40.907029\tRochelle Park CDP\tNJ\tNew Jersey\tBergen County\t5800\t44.2\t29.7\t9.0\t36723\t347458\t0.5518\t7662\tObama\t07662\t0.013085204\t7662.0\n13449\t-74.074141\t40.861928999999996\tHasbrouck Heights borough\tNJ\tNew Jersey\tBergen County\t11574\t42.0\t36.9\t8.9\t38251\t382424\t0.5518\t7604\tObama\t07604\t0.026111751000000002\t7604.0\n13450\t-73.987837\t40.822072\tCliffside Park borough\tNJ\tNew Jersey\tBergen County\t23934\t42.9\t39.7\t9.7\t38296\t409769\t0.5518\t7010\tObama\t07010\t0.053996773\t7010.0\n13451\t-74.04604599999999\t40.889012\tHackensack city\tNJ\tNew Jersey\tBergen County\t44524\t38.5\t35.6\t12.0\t35600\t286061\t0.5518\t7601\tObama\t07601\t0.100449248\t7601.0\n13452\t-74.071167\t40.945651\tParamus borough\tNJ\tNew Jersey\tBergen County\t26294\t45.8\t46.5\t6.9\t35956\t553740\t0.5518\t7652\tObama\t07652\t0.059321097\t7652.0\n13453\t-73.960488\t40.973328\tCloster borough\tNJ\tNew Jersey\tBergen County\t8360\t43.6\t57.1\t6.2\t44445\t656900\t0.5518\t7624\tObama\t07624\t0.018860743\t7624.0\n13454\t-73.998126\t40.923404\tBergenfield borough\tNJ\tNew Jersey\tBergen County\t27000\t39.6\t39.4\t8.4\t31825\t326919\t0.5518\t7621\tObama\t07621\t0.060913882\t7621.0\n13455\t-74.063558\t40.988240999999995\tWashington Township CDP\tNJ\tNew Jersey\tBergen County\t9371\t44.4\t51.9\t8.8\t50936\t569008\t0.5518\t7642\tObama\t07642\t0.021141629\t7642.0\n13456\t-73.91989000000001\t40.9618\tAlpine borough\tNJ\tNew Jersey\tBergen County\t2323\t46.2\t69.6\t7.3\t81355\t1000001\t0.5518\t7620\tObama\t07620\t0.00524085\t7620.0\n13457\t-74.03881\t40.846204\tLittle Ferry borough\tNJ\tNew Jersey\tBergen County\t11094\t38.3\t30.7\t9.5\t32314\t338060\t0.5518\t7643\tObama\t07643\t0.025028837\t7643.0\n13458\t-74.038726\t40.926821000000004\tRiver Edge borough\tNJ\tNew Jersey\tBergen County\t10938\t42.5\t52.5\t7.7\t40414\t461181\t0.5518\t7661\tObama\t07661\t0.024676891\t7661.0\n13459\t-74.10582099999999\t40.82039\tRutherford borough\tNJ\tNew Jersey\tBergen County\t18099\t41.7\t48.1\t9.4\t37808\t384957\t0.5518\t7070\tObama\t07070\t0.040832606\t7070.0\n13460\t-74.061297\t40.8249\tCarlstadt borough\tNJ\tNew Jersey\tBergen County\t5950\t41.1\t27.3\t8.1\t34731\t381426\t0.5518\t7074\tObama\t07074\t0.013423615\t7074.0\n13461\t-74.24115\t41.03132\tOakland borough\tNJ\tNew Jersey\tBergen County\t12841\t42.2\t48.6\t7.6\t44046\t459821\t0.5518\t7436\tObama\t07436\t0.028970191\t7436.0\n13462\t-74.095698\t41.02732\tSaddle River borough\tNJ\tNew Jersey\tBergen County\t3447\t47.8\t67.7\t7.8\t85789\t1000001\t0.5518\t7423\tObama\t07423\t0.007776671999999999\t7423.0\n13463\t-73.959221\t40.940417\tCresskill borough\tNJ\tNew Jersey\tBergen County\t8314\t44.1\t56.6\t6.0\t53576\t542849\t0.5518\t7626\tObama\t07626\t0.018756963999999997\t7626.0\n13464\t-74.085249\t40.817787\tEast Rutherford borough\tNJ\tNew Jersey\tBergen County\t9032\t40.1\t32.1\t10.9\t37043\t349155\t0.5518\t7073\tObama\t07073\t0.020376822\t7073.0\n13465\t-74.126036\t41.013209\tWaldwick borough\tNJ\tNew Jersey\tBergen County\t9564\t41.3\t43.5\t6.5\t38351\t414118\t0.5518\t7463\tObama\t07463\t0.021577051\t7463.0\n13466\t-74.049684\t41.052942\tMontvale borough\tNJ\tNew Jersey\tBergen County\t7904\t43.5\t59.3\t7.2\t56281\t647891\t0.5518\t7645\tObama\t07645\t0.017831975\t7645.0\n13467\t-74.04239799999999\t41.035326\tPark Ridge borough\tNJ\tNew Jersey\tBergen County\t8889\t43.7\t52.6\t5.9\t51277\t587838\t0.5518\t7656\tObama\t07656\t0.020054204\t7656.0\n13468\t-73.95302\t40.917412\tTenafly borough\tNJ\tNew Jersey\tBergen County\t14143\t43.7\t68.5\t8.5\t61874\t722735\t0.5518\t7670\tObama\t07670\t0.031907594\t7670.0\n13469\t-74.03144\t40.956241999999996\tOradell borough\tNJ\tNew Jersey\tBergen County\t8000\t44.5\t58.8\t7.6\t47437\t625648\t0.5518\t7649\tObama\t07649\t0.018048558\t7649.0\n13470\t-74.02329399999999\t40.974775\tEmerson borough\tNJ\tNew Jersey\tBergen County\t7252\t44.0\t47.3\t6.3\t39689\t488933\t0.5518\t7630\tObama\t07630\t0.016361018\t7630.0\n13471\t-73.992372\t40.945013\tDumont borough\tNJ\tNew Jersey\tBergen County\t17358\t41.0\t33.6\t7.5\t34303\t354529\t0.5518\t7628\tObama\t07628\t0.039160858\t7628.0\n13472\t-74.120082\t40.904765999999995\tElmwood Park borough\tNJ\tNew Jersey\tBergen County\t19310\t39.8\t26.5\t10.0\t29744\t339219\t0.5518\t7407\tObama\t07407\t0.043564705999999995\t7407.0\n13473\t-74.16770600000001\t40.998703000000006\tWyckoff CDP\tNJ\tNew Jersey\tBergen County\t16563\t44.1\t63.5\t7.3\t61927\t756274\t0.5518\t7481\tObama\t07481\t0.037367283\t7481.0\n13474\t-74.060321\t41.025329\tWoodcliff Lake borough\tNJ\tNew Jersey\tBergen County\t5849\t44.7\t64.9\t5.7\t66543\t785714\t0.5518\t7656\tObama\t07656\t0.013195752\t7656.0\n13475\t-73.946611\t40.882187\tEnglewood Cliffs borough\tNJ\tNew Jersey\tBergen County\t5326\t45.3\t59.3\t8.3\t65313\t861154\t0.5518\t7632\tObama\t07632\t0.012015827\t7632.0\n13476\t-74.208313\t41.0086\tFranklin Lakes borough\tNJ\tNew Jersey\tBergen County\t11008\t43.5\t59.3\t7.1\t69801\t918673\t0.5518\t7417\tObama\t07417\t0.024834815\t7417.0\n13477\t-74.112691\t40.982081\tRidgewood village\tNJ\tNew Jersey\tBergen County\t24879\t41.8\t72.7\t8.0\t59842\t707262\t0.5518\t7450\tObama\t07450\t0.056128758\t7450.0\n13478\t-74.110223\t40.797072\tLyndhurst CDP\tNJ\tNew Jersey\tBergen County\t19990\t41.2\t28.0\t10.7\t34652\t342575\t0.5518\t7071\tObama\t07071\t0.045098834000000004\t7071.0\n13479\t-74.002273\t40.818162\tFairview borough\tNJ\tNew Jersey\tBergen County\t13590\t35.6\t22.1\t12.6\t24858\t332459\t0.5518\t7022\tObama\t07022\t0.030659987000000003\t7022.0\n13480\t-74.030813\t40.987866\tWestwood borough\tNJ\tNew Jersey\tBergen County\t10901\t41.9\t45.0\t6.7\t40333\t437636\t0.5518\t7675\tObama\t07675\t0.024593416\t7675.0\n13481\t-74.019503\t40.933678\tNew Milford borough\tNJ\tNew Jersey\tBergen County\t16417\t42.1\t39.9\t8.7\t37908\t394159\t0.5518\t7646\tObama\t07646\t0.037037896\t7646.0\n13482\t-74.010467\t40.890033\tTeaneck CDP\tNJ\tNew Jersey\tBergen County\t39478\t40.2\t54.7\t9.8\t40260\t371690\t0.5518\t7666\tObama\t07666\t0.08906512\t7666.0\n13483\t-74.044161\t41.007306\tHillsdale borough\tNJ\tNew Jersey\tBergen County\t10074\t42.8\t53.3\t7.5\t41604\t554356\t0.5518\t7642\tObama\t07642\t0.022727646\t7642.0\n13484\t-73.980325\t40.989899\tHarrington Park borough\tNJ\tNew Jersey\tBergen County\t4835\t42.9\t65.2\t7.7\t48876\t638777\t0.5518\t7640\tObama\t07640\t0.010908097\t7640.0\n13485\t-73.973536\t40.891715000000005\tEnglewood city\tNJ\tNew Jersey\tBergen County\t27950\t39.2\t40.7\t11.5\t41199\t346580\t0.5518\t7631\tObama\t07631\t0.063057149\t7631.0\n13486\t-74.087878\t40.850925\tWood-Ridge borough\tNJ\tNew Jersey\tBergen County\t7604\t43.2\t34.7\t8.2\t39516\t348043\t0.5518\t7075\tObama\t07075\t0.017155154\t7075.0\n13487\t-73.99014\t40.863575\tLeonia borough\tNJ\tNew Jersey\tBergen County\t9092\t43.4\t57.3\t7.4\t43946\t529755\t0.5518\t7605\tObama\t07605\t0.020512186\t7605.0\n13488\t-73.971197\t40.850782\tFort Lee borough\tNJ\tNew Jersey\tBergen County\t37249\t45.5\t55.8\t8.2\t47549\t353138\t0.5518\t7024\tObama\t07024\t0.084036341\t7024.0\n13489\t-74.08144899999999\t40.878338\tLodi borough\tNJ\tNew Jersey\tBergen County\t24870\t38.5\t24.5\t10.0\t30075\t325203\t0.5518\t7644\tObama\t07644\t0.056108454\t7644.0\n13490\t-74.117577\t40.935835\tFair Lawn borough\tNJ\tNew Jersey\tBergen County\t33395\t44.5\t52.4\t7.1\t41428\t381328\t0.5518\t7410\tObama\t07410\t0.07534144799999999\t7410.0\n13491\t-74.921862\t40.06498\tBeverly city\tNJ\tNew Jersey\tBurlington County\t2629\t36.9\t15.4\t17.0\t25082\t168243\t0.5853\t8010\tObama\t08010\t0.005931206999999999\t8010.0\n13492\t-75.01469300000001\t40.011409\tRiverton borough\tNJ\tNew Jersey\tBurlington County\t2782\t45.5\t43.1\t7.8\t36884\t299519\t0.5853\t8065\tObama\t08065\t0.006276386\t8065.0\n13493\t-74.70844699999999\t40.149227\tBordentown city\tNJ\tNew Jersey\tBurlington County\t3961\t39.9\t33.0\t8.1\t37130\t202833\t0.5853\t8505\tObama\t08505\t0.008936292\t8505.0\n13494\t-74.72974599999999\t40.135993\tFieldsboro borough\tNJ\tNew Jersey\tBurlington County\t623\t38.4\t33.9\t9.0\t35706\t177083\t0.5853\t8505\tObama\t08505\t0.001405531\t8505.0\n13495\t-74.676575\t39.956383\tPemberton Heights CDP\tNJ\tNew Jersey\tBurlington County\t2472\t39.4\t14.3\t13.2\t29904\t198333\t0.5853\t8068\tObama\t08068\t0.005577004\t8068.0\n13496\t-74.541021\t39.948831\tCountry Lake Estates CDP\tNJ\tNew Jersey\tBurlington County\t4174\t37.1\t15.9\t11.1\t29950\t185656\t0.5853\t8015\tObama\t08015\t0.009416835\t8015.0\n13497\t-74.610438\t40.005281\tFort Dix CDP\tNJ\tNew Jersey\tBurlington County\t8386\t33.1\t11.7\t14.5\t18699\t192969\t0.5853\t8640\tObama\t08640\t0.018919401000000002\t8640.0\n13498\t-75.03507900000001\t40.002401\tPalmyra borough\tNJ\tNew Jersey\tBurlington County\t7182\t41.9\t27.4\t11.4\t33944\t197841\t0.5853\t8065\tObama\t08065\t0.016203093000000002\t8065.0\n13499\t-74.564861\t39.914881\tPresidential Lakes Estates CDP\tNJ\tNew Jersey\tBurlington County\t2540\t37.1\t11.5\t6.4\t31758\t194296\t0.5853\t8015\tObama\t08015\t0.005730417\t8015.0\n13500\t-74.795416\t40.118074\tFlorence-Roebling CDP\tNJ\tNew Jersey\tBurlington County\t8940\t38.5\t20.8\t12.5\t32370\t174038\t0.5853\t8518\tObama\t08518\t0.020169263\t8518.0\n13501\t-74.58192700000001\t40.039901\tMcGuire AFB CDP\tNJ\tNew Jersey\tBurlington County\t6360\t22.5\t22.0\t9.9\t17401\t166964\t0.5853\t8641\tObama\t08641\t0.014348603\t8641.0\n13502\t-74.964263\t39.965895\tMoorestown-Lenola CDP\tNJ\tNew Jersey\tBurlington County\t13903\t44.3\t55.7\t9.0\t43997\t419211\t0.5853\t8057\tObama\t08057\t0.031366137\t8057.0\n13503\t-74.952551\t39.932138\tRamblewood CDP\tNJ\tNew Jersey\tBurlington County\t5898\t42.8\t49.0\t11.5\t40299\t312408\t0.5853\t8057\tObama\t08057\t0.013306298999999999\t8057.0\n13504\t-74.704984\t39.899535\tLeisuretowne CDP\tNJ\tNew Jersey\tBurlington County\t2541\t74.9\t15.4\t15.7\t33831\t144453\t0.5853\t8088\tObama\t08088\t0.005732673000000001\t8088.0\n13505\t-74.852311\t40.078328000000006\tBurlington city\tNJ\tNew Jersey\tBurlington County\t9962\t39.6\t16.0\t12.8\t28381\t172946\t0.5853\t8016\tObama\t08016\t0.022474966000000002\t8016.0\n13506\t-74.685427\t39.971038\tPemberton borough\tNJ\tNew Jersey\tBurlington County\t1411\t36.3\t20.0\t10.9\t25366\t211765\t0.5853\t8068\tObama\t08068\t0.003183314\t8068.0\n13507\t-74.569097\t39.973594\tBrowns Mills CDP\tNJ\tNew Jersey\tBurlington County\t11573\t35.6\t9.7\t14.3\t25424\t164593\t0.5853\t8015\tObama\t08015\t0.026109495\t8015.0\n13508\t-74.9294\t39.901456\tMarlton CDP\tNJ\tNew Jersey\tBurlington County\t10351\t40.7\t37.3\t8.3\t33798\t253012\t0.5853\t8053\tObama\t08053\t0.023352578\t8053.0\n13509\t-74.630925\t40.027134000000004\tWrightstown borough\tNJ\tNew Jersey\tBurlington County\t787\t32.0\t10.4\t14.5\t21535\t178472\t0.5853\t8640\tObama\t08640\t0.001775527\t8640.0\n13510\t-74.812737\t39.858308\tMedford Lakes borough\tNJ\tNew Jersey\tBurlington County\t4146\t43.8\t56.0\t6.9\t38661\t318634\t0.5853\t8055\tObama\t08055\t0.009353665\t8055.0\n13511\t-75.107247\t39.936244\tCamden city\tNJ\tNew Jersey\tCamden County\t82761\t27.9\t7.6\t24.0\t13305\t68136\t0.6817\t8103\tObama\t08103\t0.18671458600000002\t8103.0\n13512\t-75.015568\t39.8289\tStratford borough\tNJ\tNew Jersey\tCamden County\t6984\t40.1\t23.2\t9.7\t28213\t195532\t0.6817\t8084\tObama\t08084\t0.015756391\t8084.0\n13513\t-75.03443\t39.895407\tHaddonfield borough\tNJ\tNew Jersey\tCamden County\t11568\t44.2\t69.3\t8.7\t50701\t517015\t0.6817\t8033\tObama\t08033\t0.026098213999999998\t8033.0\n13514\t-75.01164\t39.938381\tCherry Hill Mall CDP\tNJ\tNew Jersey\tCamden County\t13916\t45.7\t44.0\t10.1\t36087\t258869\t0.6817\t8002\tObama\t08002\t0.031395466000000004\t8002.0\n13515\t-74.996494\t39.908573\tBarclay-Kingston CDP\tNJ\tNew Jersey\tCamden County\t10440\t45.4\t47.8\t9.7\t39505\t283183\t0.6817\t8034\tObama\t08034\t0.023553367999999998\t8034.0\n13516\t-75.07392\t39.85222\tRunnemede borough\tNJ\tNew Jersey\tCamden County\t8235\t40.9\t15.4\t12.9\t25170\t169800\t0.6817\t8078\tObama\t08078\t0.018578734\t8078.0\n13517\t-74.87841999999999\t39.730746999999994\tChesilhurst borough\tNJ\tNew Jersey\tCamden County\t1709\t44.7\t12.3\t15.9\t23853\t147573\t0.6817\t8089\tObama\t08089\t0.003855623\t8089.0\n13518\t-74.965734\t39.833183\tGibbsboro borough\tNJ\tNew Jersey\tCamden County\t2370\t42.4\t27.6\t10.0\t29764\t215160\t0.6817\t8026\tObama\t08026\t0.005346885\t8026.0\n13519\t-74.985911\t39.787919\tPine Hill borough\tNJ\tNew Jersey\tCamden County\t11070\t35.5\t16.7\t12.7\t25380\t150164\t0.6817\t8021\tObama\t08021\t0.024974692000000003\t8021.0\n13520\t-74.972351\t39.876951\tSpringdale CDP\tNJ\tNew Jersey\tCamden County\t13976\t46.8\t67.2\t9.5\t54604\t406233\t0.6817\t8003\tObama\t08003\t0.03153083\t8003.0\n13521\t-75.02869\t39.867244\tLawnside borough\tNJ\tNew Jersey\tCamden County\t2761\t45.7\t22.9\t13.4\t25051\t180395\t0.6817\t8045\tObama\t08045\t0.006229008\t8045.0\n13522\t-75.06793\t39.840458\tGlendora CDP\tNJ\tNew Jersey\tCamden County\t4736\t43.4\t12.1\t9.8\t25534\t181012\t0.6817\t8029\tObama\t08029\t0.010684746\t8029.0\n13523\t-75.021585\t39.845484\tSomerdale borough\tNJ\tNew Jersey\tCamden County\t5042\t43.4\t20.1\t11.2\t26443\t170659\t0.6817\t8083\tObama\t08083\t0.011375103000000001\t8083.0\n13524\t-75.03991500000001\t39.928834\tGolden Triangle CDP\tNJ\tNew Jersey\tCamden County\t3979\t45.1\t25.6\t11.9\t29155\t192320\t0.6817\t8002\tObama\t08002\t0.008976900999999999\t8002.0\n13525\t-74.93736700000001\t39.791404\tBerlin borough\tNJ\tNew Jersey\tCamden County\t7256\t40.8\t28.2\t9.9\t31536\t255818\t0.6817\t8009\tObama\t08009\t0.016370041999999998\t8009.0\n13526\t-75.081342\t39.902343\tOaklyn borough\tNJ\tNew Jersey\tCamden County\t3987\t41.4\t23.1\t9.7\t28709\t173761\t0.6817\t8107\tObama\t08107\t0.00899495\t8107.0\n13527\t-75.064565\t39.879171\tHaddon Heights borough\tNJ\tNew Jersey\tCamden County\t7334\t43.6\t43.4\t8.5\t33051\t270957\t0.6817\t8035\tObama\t08035\t0.016546015\t8035.0\n13528\t-75.03636\t39.856221000000005\tMagnolia borough\tNJ\tNew Jersey\tCamden County\t4297\t38.6\t14.8\t15.1\t24970\t158497\t0.6817\t8049\tObama\t08049\t0.009694332\t8049.0\n13529\t-75.062988\t39.798176\tBlackwood CDP\tNJ\tNew Jersey\tCamden County\t4803\t39.2\t18.6\t12.5\t27734\t178462\t0.6817\t8012\tObama\t08012\t0.010835903000000001\t8012.0\n13530\t-74.99561800000001\t39.848240000000004\tEchelon CDP\tNJ\tNew Jersey\tCamden County\t10612\t38.6\t46.0\t9.4\t36584\t205398\t0.6817\t8084\tObama\t08084\t0.023941412000000002\t8084.0\n13531\t-75.091553\t39.880439\tMount Ephraim borough\tNJ\tNew Jersey\tCamden County\t4743\t42.5\t16.3\t12.1\t29391\t161703\t0.6817\t8059\tObama\t08059\t0.010700538999999998\t8059.0\n13532\t-75.00534300000001\t39.821247\tLaurel Springs borough\tNJ\tNew Jersey\tCamden County\t1880\t40.0\t26.5\t10.2\t27746\t194864\t0.6817\t8084\tObama\t08084\t0.004241411\t8084.0\n13533\t-75.027552\t39.875704999999996\tTavistock borough\tNJ\tNew Jersey\tCamden County\t24\t43.8\t75.0\t7.1\t53449\t666667\t0.6817\t8045\tObama\t08045\t5.41e-05\t8045.0\n13534\t-75.075847\t39.915951\tCollingswood borough\tNJ\tNew Jersey\tCamden County\t13916\t38.9\t34.7\t10.8\t30299\t179952\t0.6817\t8108\tObama\t08108\t0.031395466000000004\t8108.0\n13535\t-74.961534\t39.899131\tGreentree CDP\tNJ\tNew Jersey\tCamden County\t11447\t42.8\t61.3\t9.0\t42677\t355678\t0.6817\t8003\tObama\t08003\t0.02582523\t8003.0\n13536\t-74.98971800000001\t39.817252\tLindenwold borough\tNJ\tNew Jersey\tCamden County\t17655\t35.2\t16.3\t15.1\t24629\t139488\t0.6817\t8021\tObama\t08021\t0.039830911000000004\t8021.0\n13537\t-75.056472\t39.965005\tPennsauken CDP\tNJ\tNew Jersey\tCamden County\t36267\t38.6\t18.6\t12.0\t23752\t163729\t0.6817\t8110\tObama\t08110\t0.08182088\t8110.0\n13538\t-74.98487800000001\t39.804516\tClementon borough\tNJ\tNew Jersey\tCamden County\t5106\t36.6\t13.4\t16.0\t23550\t143969\t0.6817\t8021\tObama\t08021\t0.011519492\t8021.0\n13539\t-74.973925\t39.786913\tPine Valley borough\tNJ\tNew Jersey\tCamden County\t20\t62.5\t0.0\t0.0\t23000\t187500\t0.6817\t8021\tObama\t08021\t4.51e-05\t8021.0\n13540\t-75.120671\t39.87876\tBrooklawn borough\tNJ\tNew Jersey\tCamden County\t2433\t35.3\t10.1\t9.3\t23661\t138844\t0.6817\t8030\tObama\t08030\t0.005489018000000001\t8030.0\n13541\t-75.117435\t39.892371999999995\tGloucester City\tNJ\tNew Jersey\tCamden County\t11480\t37.9\t10.4\t15.7\t23321\t132685\t0.6817\t8030\tObama\t08030\t0.02589968\t8030.0\n13542\t-75.013818\t39.914351\tErlton-Ellisburg CDP\tNJ\tNew Jersey\tCamden County\t7977\t44.8\t38.8\t10.3\t30925\t231686\t0.6817\t8034\tObama\t08034\t0.017996668\t8034.0\n13543\t-75.095575\t39.916649\tWoodlynne borough\tNJ\tNew Jersey\tCamden County\t2880\t32.4\t10.2\t11.9\t19854\t97740\t0.6817\t081HH\tObama\t081HH\t0.006497480999999999\t0.0\n13544\t-75.09435\t39.86659\tBellmawr borough\tNJ\tNew Jersey\tCamden County\t11371\t43.4\t12.7\t10.5\t27498\t165402\t0.6817\t8031\tObama\t08031\t0.025653769\t8031.0\n13545\t-75.088883\t39.896802\tAudubon Park borough\tNJ\tNew Jersey\tCamden County\t1066\t46.8\t4.2\t9.9\t23801\t81250\t0.6817\t8107\tObama\t08107\t0.00240497\t8107.0\n13546\t-75.051348\t39.869043\tBarrington borough\tNJ\tNew Jersey\tCamden County\t6825\t41.2\t29.6\t8.9\t30102\t194885\t0.6817\t8007\tObama\t08007\t0.015397676\t8007.0\n13547\t-75.072165\t39.890578999999995\tAudubon borough\tNJ\tNew Jersey\tCamden County\t8979\t40.8\t29.3\t7.3\t29934\t188189\t0.6817\t8106\tObama\t08106\t0.02025725\t8106.0\n13548\t-75.021924\t39.836432\tHi-Nella borough\tNJ\tNew Jersey\tCamden County\t986\t31.0\t17.0\t15.3\t21436\t167708\t0.6817\t8083\tObama\t08083\t0.002224485\t8083.0\n13549\t-75.05011999999999\t39.950117999999996\tMerchantville borough\tNJ\tNew Jersey\tCamden County\t3752\t38.5\t33.2\t9.3\t31034\t245192\t0.6817\t8109\tObama\t08109\t0.008464774\t8109.0\n13550\t-75.008443\t39.878087\tAshland CDP\tNJ\tNew Jersey\tCamden County\t8148\t44.0\t49.1\t9.7\t33929\t237146\t0.6817\t8045\tObama\t08045\t0.018382456000000002\t8045.0\n13551\t-74.83779799999999\t38.970714\tWildwood Crest borough\tNJ\tNew Jersey\tCape May County\t3666\t51.5\t33.4\t14.0\t29495\t386111\t0.4518\t8260\tObama\t08260\t0.008270752\t8260.0\n13552\t-74.865831\t39.043192\tWhitesboro-Burleigh CDP\tNJ\tNew Jersey\tCape May County\t1940\t45.6\t19.5\t12.6\t23227\t148284\t0.4518\t8252\tObama\t08252\t0.004376775\t8252.0\n13553\t-74.82474\t39.000609999999995\tWest Wildwood borough\tNJ\tNew Jersey\tCape May County\t395\t47.4\t7.1\t11.4\t25494\t202381\t0.4518\t8260\tObama\t08260\t0.000891148\t8260.0\n13554\t-74.818519\t38.987649\tWildwood city\tNJ\tNew Jersey\tCape May County\t4437\t37.6\t9.4\t15.1\t19120\t199500\t0.4518\t8260\tObama\t08260\t0.010010181\t8260.0\n13555\t-74.66235\t39.193158000000004\tStrathmere CDP\tNJ\tNew Jersey\tCape May County\t160\t61.7\t50.0\t0.0\t61234\t795455\t0.4518\t8248\tObama\t08248\t0.00036097099999999997\t8248.0\n13556\t-74.876701\t39.020089\tRio Grande CDP\tNJ\tNew Jersey\tCape May County\t2466\t45.6\t14.2\t7.5\t23425\t157986\t0.4518\t8242\tObama\t08242\t0.005563468\t8242.0\n13557\t-74.809678\t39.228411\tWoodbine borough\tNJ\tNew Jersey\tCape May County\t2613\t38.1\t6.0\t9.1\t18407\t170101\t0.4518\t8270\tObama\t08270\t0.00589511\t8270.0\n13558\t-74.935349\t39.015566\tVillas CDP\tNJ\tNew Jersey\tCape May County\t8480\t41.8\t12.6\t11.6\t21916\t174139\t0.4518\t8251\tObama\t08251\t0.019131471\t8251.0\n13559\t-74.905585\t38.939674\tCape May city\tNJ\tNew Jersey\tCape May County\t3836\t52.4\t36.7\t8.9\t32714\t608986\t0.4518\t8204\tObama\t08204\t0.008654283\t8204.0\n13560\t-74.951636\t38.976599\tNorth Cape May CDP\tNJ\tNew Jersey\tCape May County\t3422\t44.1\t15.4\t8.1\t25408\t221410\t0.4518\t8204\tObama\t08204\t0.007720271\t8204.0\n13561\t-74.728563\t39.090895\tAvalon borough\tNJ\tNew Jersey\tCape May County\t1904\t61.5\t44.4\t4.9\t56344\t904980\t0.4518\t8202\tObama\t08202\t0.004295557\t8202.0\n13562\t-74.937273\t38.942056\tWest Cape May borough\tNJ\tNew Jersey\tCape May County\t1233\t51.5\t38.5\t8.5\t27712\t464189\t0.4518\t8204\tObama\t08204\t0.002781734\t8204.0\n13563\t-74.822296\t39.079723\tCape May Court House CDP\tNJ\tNew Jersey\tCape May County\t5796\t45.9\t27.6\t8.0\t30853\t283386\t0.4518\t8210\tObama\t08210\t0.01307618\t8210.0\n13564\t-74.965117\t38.937134\tCape May Point borough\tNJ\tNew Jersey\tCape May County\t222\t67.4\t61.7\t5.9\t58123\t785714\t0.4518\t8212\tObama\t08212\t0.000500847\t8212.0\n13565\t-74.852008\t38.958712\tDiamond Beach CDP\tNJ\tNew Jersey\tCape May County\t209\t60.6\t9.4\t8.3\t34874\t162500\t0.4518\t8260\tObama\t08260\t0.000471519\t8260.0\n13566\t-74.697242\t39.151276\tSea Isle City\tNJ\tNew Jersey\tCape May County\t2651\t55.7\t34.7\t7.3\t39011\t690871\t0.4518\t8243\tObama\t08243\t0.005980841\t8243.0\n13567\t-74.767256\t39.043359\tStone Harbor borough\tNJ\tNew Jersey\tCape May County\t1056\t61.1\t50.2\t6.2\t52337\t886054\t0.4518\t8247\tObama\t08247\t0.00238241\t8247.0\n13568\t-74.893027\t38.996927\tErma CDP\tNJ\tNew Jersey\tCape May County\t2073\t40.9\t15.0\t10.3\t28544\t266754\t0.4518\t8242\tObama\t08242\t0.004676833\t8242.0\n13569\t-74.607046\t39.255748\tOcean City\tNJ\tNew Jersey\tCape May County\t13940\t52.2\t39.6\t6.9\t37936\t589157\t0.4518\t8226\tObama\t08226\t0.031449612\t8226.0\n13570\t-74.79926999999999\t39.00226\tNorth Wildwood city\tNJ\tNew Jersey\tCape May County\t4749\t51.8\t17.2\t12.8\t26053\t307623\t0.4518\t8260\tObama\t08260\t0.010714075\t8260.0\n13571\t-75.213027\t39.375797999999996\tFairton CDP\tNJ\tNew Jersey\tCumberland County\t1278\t35.7\t6.7\t18.9\t23343\t142137\t0.6159\t8311\tObama\t08311\t0.002883257\t8311.0\n13572\t-75.03013399999999\t39.326159999999994\tLaurel Lake CDP\tNJ\tNew Jersey\tCumberland County\t3224\t34.1\t5.6\t18.6\t17814\t79304\t0.6159\t8329\tObama\t08329\t0.0072735690000000006\t8329.0\n13573\t-75.041201\t39.250038\tPort Norris CDP\tNJ\tNew Jersey\tCumberland County\t1560\t40.7\t10.6\t13.2\t21330\t118269\t0.6159\t8349\tObama\t08349\t0.0035194690000000003\t8349.0\n13574\t-75.297003\t39.459436\tShiloh borough\tNJ\tNew Jersey\tCumberland County\t623\t42.3\t21.9\t10.3\t27564\t225000\t0.6159\t8353\tObama\t08353\t0.001405531\t8353.0\n13575\t-75.056127\t39.390213\tMillville city\tNJ\tNew Jersey\tCumberland County\t28709\t36.6\t15.1\t16.5\t22585\t145963\t0.6159\t8332\tObama\t08332\t0.064769505\t8332.0\n13576\t-75.137901\t39.478693\tRosenhayn CDP\tNJ\tNew Jersey\tCumberland County\t1236\t42.1\t12.8\t13.4\t20856\t190705\t0.6159\t8352\tObama\t08352\t0.002788502\t8352.0\n13577\t-75.218988\t39.5015\tSeabrook Farms CDP\tNJ\tNew Jersey\tCumberland County\t1696\t22.8\t15.1\t32.1\t14379\t160000\t0.6159\t8313\tObama\t08313\t0.003826294\t8313.0\n13578\t-75.228153\t39.428486\tBridgeton city\tNJ\tNew Jersey\tCumberland County\t24727\t32.0\t9.7\t21.5\t15282\t117310\t0.6159\t8302\tObama\t08302\t0.055785836\t8302.0\n13579\t-75.206939\t39.338237\tCedarville CDP\tNJ\tNew Jersey\tCumberland County\t831\t40.8\t16.2\t16.5\t19694\t138372\t0.6159\t8311\tObama\t08311\t0.001874794\t8311.0\n13580\t-74.998193\t39.465232\tVineland city\tNJ\tNew Jersey\tCumberland County\t60080\t38.8\t17.8\t14.3\t23278\t165892\t0.6159\t8361\tObama\t08361\t0.135544668\t8361.0\n13581\t-74.304159\t40.882496\tFairfield CDP\tNJ\tNew Jersey\tEssex County\t7139\t43.9\t43.1\t7.5\t40385\t588411\t0.7784\t7004\tObama\t07004\t0.016106082\t7004.0\n13582\t-74.329051\t40.785614\tLivingston CDP\tNJ\tNew Jersey\tEssex County\t27654\t43.7\t65.6\t6.7\t53193\t619706\t0.7784\t7039\tObama\t07039\t0.062389352\t7039.0\n13583\t-74.204258\t40.804145\tGlen Ridge borough\tNJ\tNew Jersey\tEssex County\t7016\t40.5\t72.5\t7.8\t52993\t532223\t0.7784\t7028\tObama\t07028\t0.015828585\t7028.0\n13584\t-74.234813\t40.768262\tOrange CDP\tNJ\tNew Jersey\tEssex County\t32079\t33.6\t22.5\t17.3\t20253\t235921\t0.7784\t7050\tObama\t07050\t0.07237246\t7050.0\n13585\t-74.308633\t40.820726\tRoseland borough\tNJ\tNew Jersey\tEssex County\t5411\t46.7\t54.4\t7.6\t49092\t606034\t0.7784\t7068\tObama\t07068\t0.012207593000000001\t7068.0\n13586\t-74.32415300000001\t40.739470000000004\tMillburn CDP\tNJ\tNew Jersey\tEssex County\t19083\t41.3\t79.6\t5.9\t74945\t896678\t0.7784\t7078\tObama\t07078\t0.043052578\t7078.0\n13587\t-74.271336\t40.732929\tMaplewood CDP\tNJ\tNew Jersey\tEssex County\t23027\t39.8\t56.7\t8.2\t41122\t406658\t0.7784\t7040\tObama\t07040\t0.051950517\t7040.0\n13588\t-74.211771\t40.765053\tEast Orange city\tNJ\tNew Jersey\tEssex County\t68639\t34.1\t20.8\t19.2\t20388\t225884\t0.7784\t7017\tObama\t07017\t0.154854369\t7017.0\n13589\t-74.279765\t40.826864\tEssex Fells borough\tNJ\tNew Jersey\tEssex County\t2063\t42.6\t78.3\t5.5\t80685\t911036\t0.7784\t7021\tObama\t07021\t0.004654272\t7021.0\n13590\t-74.277742\t40.838817999999996\tCaldwell borough\tNJ\tNew Jersey\tEssex County\t7134\t41.9\t52.7\t7.4\t38241\t416529\t0.7784\t7006\tObama\t07006\t0.016094801000000002\t7006.0\n13591\t-74.210959\t40.825472\tMontclair CDP\tNJ\tNew Jersey\tEssex County\t37788\t40.2\t63.4\t10.0\t50188\t577489\t0.7784\t7042\tObama\t07042\t0.085252362\t7042.0\n13592\t-74.243284\t40.832921999999996\tVerona CDP\tNJ\tNew Jersey\tEssex County\t12877\t44.7\t57.3\t6.8\t45005\t456588\t0.7784\t7044\tObama\t07044\t0.02905141\t7044.0\n13593\t-74.231875\t40.72417\tIrvington CDP\tNJ\tNew Jersey\tEssex County\t59041\t33.3\t16.9\t18.7\t20704\t228735\t0.7784\t7111\tObama\t07111\t0.133200612\t7111.0\n13594\t-74.262661\t40.789444\tWest Orange CDP\tNJ\tNew Jersey\tEssex County\t44746\t41.7\t50.8\t9.2\t39460\t387788\t0.7784\t7052\tObama\t07052\t0.100950095\t7052.0\n13595\t-74.257601\t40.862868\tNorth Caldwell borough\tNJ\tNew Jersey\tEssex County\t7189\t38.4\t65.5\t6.4\t56823\t773094\t0.7784\t7006\tObama\t07006\t0.016218885\t7006.0\n13596\t-74.17494\t40.726145\tNewark city\tNJ\tNew Jersey\tEssex County\t274367\t31.5\t12.8\t21.7\t16895\t237807\t0.7784\t7102\tObama\t07102\t0.6189910789999999\t7102.0\n13597\t-74.16189399999999\t40.79501\tBelleville CDP\tNJ\tNew Jersey\tEssex County\t35359\t38.1\t28.8\t12.1\t26180\t273345\t0.7784\t7109\tObama\t07109\t0.07977236900000001\t7109.0\n13598\t-74.186927\t40.809923\tBloomfield CDP\tNJ\tNew Jersey\tEssex County\t46171\t39.3\t39.0\t10.4\t30769\t312899\t0.7784\t7003\tObama\t07003\t0.104164995\t7003.0\n13599\t-74.228474\t40.856561\tCedar Grove CDP\tNJ\tNew Jersey\tEssex County\t12208\t45.9\t49.7\t5.7\t40796\t454728\t0.7784\t7009\tObama\t07009\t0.027542099\t7009.0\n13600\t-74.157176\t40.819278000000004\tNutley CDP\tNJ\tNew Jersey\tEssex County\t26772\t41.8\t41.1\t8.9\t33462\t355629\t0.7784\t7110\tObama\t07110\t0.060399497999999996\t7110.0\n13601\t-74.29669100000001\t40.848622999999996\tWest Caldwell CDP\tNJ\tNew Jersey\tEssex County\t10945\t43.7\t56.0\t7.7\t43162\t532058\t0.7784\t7006\tObama\t07006\t0.024692682999999997\t7006.0\n13602\t-74.260223\t40.749062\tSouth Orange CDP\tNJ\tNew Jersey\tEssex County\t16823\t35.3\t65.0\t9.3\t48559\t538643\t0.7784\t7079\tObama\t07079\t0.037953861\t7079.0\n13603\t-75.15230799999999\t39.837777\tWoodbury city\tNJ\tNew Jersey\tGloucester County\t10852\t38.5\t25.9\t13.1\t28323\t173807\t0.5474\t8096\tObama\t08096\t0.024482868999999997\t8096.0\n13604\t-75.078058\t39.662962\tClayton borough\tNJ\tNew Jersey\tGloucester County\t8427\t34.7\t23.0\t11.5\t28876\t172538\t0.5474\t8312\tObama\t08312\t0.019011899\t8312.0\n13605\t-74.966139\t39.630427000000005\tVictory Lakes CDP\tNJ\tNew Jersey\tGloucester County\t2335\t38.9\t18.0\t10.2\t26987\t174288\t0.5474\t8094\tObama\t08094\t0.005267923000000001\t8094.0\n13606\t-75.11119599999999\t39.701627\tGlassboro borough\tNJ\tNew Jersey\tGloucester County\t21074\t28.3\t28.2\t15.3\t24799\t202282\t0.5474\t8028\tObama\t08028\t0.047544413\t8028.0\n13607\t-75.22448299999999\t39.736209\tMullica Hill CDP\tNJ\tNew Jersey\tGloucester County\t2407\t38.3\t43.4\t9.7\t29434\t271739\t0.5474\t8062\tObama\t08062\t0.00543036\t8062.0\n13608\t-75.01696\t39.548558\tNewfield borough\tNJ\tNew Jersey\tGloucester County\t1923\t41.7\t19.4\t11.5\t28992\t183929\t0.5474\t8344\tObama\t08344\t0.004338422\t8344.0\n13609\t-75.13045600000001\t39.870538\tWestville borough\tNJ\tNew Jersey\tGloucester County\t4662\t39.1\t11.4\t12.6\t26159\t162591\t0.5474\t8093\tObama\t08093\t0.010517796999999999\t8093.0\n13610\t-75.278193\t39.823366\tGibbstown CDP\tNJ\tNew Jersey\tGloucester County\t4025\t42.1\t20.4\t9.0\t29804\t198291\t0.5474\t8027\tObama\t08027\t0.009080681\t8027.0\n13611\t-75.130957\t39.733188\tPitman borough\tNJ\tNew Jersey\tGloucester County\t9672\t41.0\t37.0\t13.2\t30075\t216114\t0.5474\t8071\tObama\t08071\t0.021820706000000002\t8071.0\n13612\t-75.061402\t39.766576\tTurnersville CDP\tNJ\tNew Jersey\tGloucester County\t4030\t41.6\t39.4\t10.9\t35052\t286364\t0.5474\t8032\tObama\t08032\t0.009091960999999999\t8032.0\n13613\t-75.151268\t39.816016\tWoodbury Heights borough\tNJ\tNew Jersey\tGloucester County\t3116\t41.7\t27.6\t10.9\t30115\t227909\t0.5474\t8097\tObama\t08097\t0.0070299130000000005\t8097.0\n13614\t-75.185373\t39.867528\tNational Park borough\tNJ\tNew Jersey\tGloucester County\t3363\t38.7\t9.2\t12.9\t23658\t163818\t0.5474\t8063\tObama\t08063\t0.007587162\t8063.0\n13615\t-74.983351\t39.686\tWilliamstown CDP\tNJ\tNew Jersey\tGloucester County\t13958\t39.2\t16.8\t11.9\t25983\t202371\t0.5474\t8094\tObama\t08094\t0.031490221\t8094.0\n13616\t-75.311552\t39.746037\tSwedesboro borough\tNJ\tNew Jersey\tGloucester County\t2444\t35.9\t17.1\t12.6\t28260\t174635\t0.5474\t8085\tObama\t08085\t0.0055138340000000004\t8085.0\n13617\t-75.35649699999999\t39.756526\tBeckett CDP\tNJ\tNew Jersey\tGloucester County\t5058\t34.3\t33.9\t8.2\t33256\t214482\t0.5474\t8085\tObama\t08085\t0.011411201000000001\t8085.0\n13618\t-75.239719\t39.840148\tPaulsboro borough\tNJ\tNew Jersey\tGloucester County\t6222\t34.4\t7.8\t20.9\t20925\t138311\t0.5474\t8066\tObama\t08066\t0.014037266000000001\t8066.0\n13619\t-75.148546\t39.791353\tWenonah borough\tNJ\tNew Jersey\tGloucester County\t2415\t44.5\t46.9\t12.1\t40124\t309184\t0.5474\t8090\tObama\t08090\t0.005448408\t8090.0\n13620\t-75.15896500000001\t39.805427\tOak Valley CDP\tNJ\tNew Jersey\tGloucester County\t4000\t39.6\t8.0\t13.2\t26577\t178036\t0.5474\t8090\tObama\t08090\t0.009024279\t8090.0\n13621\t-74.065969\t40.780955\tSecaucus town\tNJ\tNew Jersey\tHudson County\t14721\t42.0\t36.1\t11.3\t36232\t379844\t0.7752\t7094\tObama\t07094\t0.033211602\t7094.0\n13622\t-74.009502\t40.785758\tWest New York town\tNJ\tNew Jersey\tHudson County\t45173\t34.9\t22.6\t15.6\t20528\t310302\t0.7752\t7093\tObama\t07093\t0.101913437\t7093.0\n13623\t-74.120793\t40.754518\tKearny town\tNJ\tNew Jersey\tHudson County\t38770\t35.8\t23.4\t12.3\t24750\t300076\t0.7752\t7032\tObama\t07032\t0.08746782300000001\t7032.0\n13624\t-74.066537\t40.718872\tJersey City\tNJ\tNew Jersey\tHudson County\t245145\t33.4\t35.8\t15.2\t25206\t256611\t0.7752\t7304\tObama\t07304\t0.55306421\t7304.0\n13625\t-74.004029\t40.792384999999996\tGuttenberg town\tNJ\tNew Jersey\tHudson County\t10653\t36.2\t35.3\t12.3\t32802\t299682\t0.7752\t7093\tObama\t07093\t0.024033911\t7093.0\n13626\t-74.153166\t40.743076\tHarrison town\tNJ\tNew Jersey\tHudson County\t14170\t35.1\t28.0\t13.2\t23192\t296965\t0.7752\t7029\tObama\t07029\t0.031968508\t7029.0\n13627\t-74.110591\t40.66499\tBayonne city\tNJ\tNew Jersey\tHudson County\t58577\t39.3\t27.4\t11.9\t27047\t307175\t0.7752\t7002\tObama\t07002\t0.132153796\t7002.0\n13628\t-74.16213499999999\t40.750941\tEast Newark borough\tNJ\tNew Jersey\tHudson County\t2429\t32.5\t18.8\t11.7\t19248\t288679\t0.7752\t7029\tObama\t07029\t0.005479993000000001\t7029.0\n13629\t-74.032315\t40.767453\tUnion City\tNJ\tNew Jersey\tHudson County\t64678\t33.0\t17.8\t17.9\t17341\t290512\t0.7752\t7087\tObama\t07087\t0.14591807699999998\t7087.0\n13630\t-74.02794\t40.745255\tHoboken city\tNJ\tNew Jersey\tHudson County\t43908\t31.3\t67.8\t9.3\t53765\t471723\t0.7752\t7030\tObama\t07030\t0.099059509\t7030.0\n13631\t-74.912524\t40.635812\tClinton town\tNJ\tNew Jersey\tHunterdon County\t2579\t41.0\t55.0\t6.4\t48846\t373670\t0.4042\t8809\tObama\t08809\t0.005818404\t8809.0\n13632\t-74.835089\t40.64317\tLebanon borough\tNJ\tNew Jersey\tHunterdon County\t1188\t42.9\t45.2\t7.6\t47307\t301579\t0.4042\t8833\tObama\t08833\t0.0026802109999999996\t8833.0\n13633\t-74.771886\t40.615894\tWhite House Station CDP\tNJ\tNew Jersey\tHunterdon County\t2025\t42.6\t49.6\t9.3\t52199\t383165\t0.4042\t8889\tObama\t08889\t0.004568541\t8889.0\n13634\t-74.964268\t40.70665\tHampton borough\tNJ\tNew Jersey\tHunterdon County\t1601\t34.0\t26.8\t10.7\t32344\t299648\t0.4042\t8827\tObama\t08827\t0.0036119679999999997\t8827.0\n13635\t-74.97621\t40.406248\tStockton borough\tNJ\tNew Jersey\tHunterdon County\t611\t42.2\t36.9\t5.1\t36600\t342667\t0.4042\t8559\tObama\t08559\t0.0013784589999999998\t8559.0\n13636\t-74.83675799999999\t40.719263\tCalifon borough\tNJ\tNew Jersey\tHunterdon County\t1125\t41.1\t47.7\t4.7\t42961\t369527\t0.4042\t7830\tObama\t07830\t0.002538078\t7830.0\n13637\t-74.93951899999999\t40.700604\tGlen Gardner borough\tNJ\tNew Jersey\tHunterdon County\t1939\t39.4\t40.8\t6.7\t36851\t248361\t0.4042\t8826\tObama\t08826\t0.004374519\t8826.0\n13638\t-74.893813\t40.668496999999995\tHigh Bridge borough\tNJ\tNew Jersey\tHunterdon County\t3757\t39.2\t44.7\t8.0\t41006\t288241\t0.4042\t8829\tObama\t08829\t0.008476054\t8829.0\n13639\t-75.083625\t40.653975\tBloomsbury borough\tNJ\tNew Jersey\tHunterdon County\t999\t38.0\t38.1\t8.6\t36140\t304245\t0.4042\t8804\tObama\t08804\t0.002253814\t8804.0\n13640\t-75.090626\t40.569435\tMilford borough\tNJ\tNew Jersey\tHunterdon County\t1292\t41.9\t31.1\t9.5\t34869\t265524\t0.4042\t8848\tObama\t08848\t0.002914842\t8848.0\n13641\t-74.942823\t40.368531\tLambertville city\tNJ\tNew Jersey\tHunterdon County\t4008\t46.0\t43.1\t7.6\t48223\t305511\t0.4042\t8530\tObama\t08530\t0.009042327\t8530.0\n13642\t-74.888349\t40.647008\tAnnandale CDP\tNJ\tNew Jersey\tHunterdon County\t1638\t40.3\t56.8\t5.3\t45913\t444286\t0.4042\t8829\tObama\t08829\t0.003695442\t8829.0\n13643\t-75.056189\t40.527608\tFrenchtown borough\tNJ\tNew Jersey\tHunterdon County\t1480\t41.8\t38.8\t8.8\t37670\t296262\t0.4042\t8825\tObama\t08825\t0.003338983\t8825.0\n13644\t-74.859948\t40.508532\tFlemington borough\tNJ\tNew Jersey\tHunterdon County\t4274\t36.9\t33.1\t8.1\t33183\t299150\t0.4042\t8822\tObama\t08822\t0.009642442\t8822.0\n13645\t-74.62374200000001\t40.320778000000004\tPrinceton Junction CDP\tNJ\tNew Jersey\tMercer County\t2401\t44.1\t79.3\t3.9\t49868\t622118\t0.6799\t8550\tObama\t08550\t0.005416823\t8550.0\n13646\t-74.73785600000001\t40.301773\tLawrenceville CDP\tNJ\tNew Jersey\tMercer County\t4010\t42.8\t75.3\t5.7\t42176\t349640\t0.6799\t8648\tObama\t08648\t0.00904684\t8648.0\n13647\t-74.659561\t40.350460999999996\tPrinceton borough\tNJ\tNew Jersey\tMercer County\t13697\t27.6\t69.7\t8.4\t39501\t724673\t0.6799\t8542\tObama\t08542\t0.030901387000000002\t8542.0\n13648\t-74.800619\t40.265029999999996\tEwing CDP\tNJ\tNew Jersey\tMercer County\t37932\t39.7\t34.0\t9.4\t31390\t280286\t0.6799\t8628\tObama\t08628\t0.085577236\t8628.0\n13649\t-74.764101\t40.223872\tTrenton city\tNJ\tNew Jersey\tMercer County\t85520\t33.6\t12.0\t16.6\t18954\t130581\t0.6799\t8608\tObama\t08608\t0.19293908199999998\t8608.0\n13650\t-74.790769\t40.326248\tPennington borough\tNJ\tNew Jersey\tMercer County\t2735\t45.2\t73.7\t7.1\t51633\t621403\t0.6799\t8534\tObama\t08534\t0.006170351\t8534.0\n13651\t-74.702742\t40.191462\tWhite Horse CDP\tNJ\tNew Jersey\tMercer County\t9797\t44.9\t20.8\t6.6\t32074\t285844\t0.6799\t8610\tObama\t08610\t0.022102715\t8610.0\n13652\t-74.525033\t40.268458\tHightstown borough\tNJ\tNew Jersey\tMercer County\t5191\t38.6\t45.7\t7.5\t31711\t287791\t0.6799\t8520\tObama\t08520\t0.011711258\t8520.0\n13653\t-74.76405\t40.388935\tHopewell borough\tNJ\tNew Jersey\tMercer County\t2001\t43.0\t59.8\t4.8\t41313\t522512\t0.6799\t8525\tObama\t08525\t0.004514395\t8525.0\n13654\t-74.491514\t40.263020000000004\tTwin Rivers CDP\tNJ\tNew Jersey\tMercer County\t7250\t40.6\t42.1\t6.9\t31159\t213596\t0.6799\t8520\tObama\t08520\t0.016356505\t8520.0\n13655\t-74.672124\t40.231254\tMercerville-Hamilton Square CDP\tNJ\tNew Jersey\tMercer County\t27004\t44.0\t32.8\t7.6\t33322\t342260\t0.6799\t8690\tObama\t08690\t0.060922907000000005\t8690.0\n13656\t-74.668042\t40.180775\tYardville-Groveville CDP\tNJ\tNew Jersey\tMercer County\t10027\t42.1\t26.5\t7.7\t34868\t317333\t0.6799\t8620\tObama\t08620\t0.022621611\t8620.0\n13657\t-74.647887\t40.363869\tPrinceton North CDP\tNJ\tNew Jersey\tMercer County\t4631\t45.9\t76.4\t4.9\t52534\t702410\t0.6799\t8540\tObama\t08540\t0.010447859\t8540.0\n13658\t-74.260497\t40.55105\tSewaren CDP\tNJ\tNew Jersey\tMiddlesex County\t2776\t40.7\t20.0\t7.0\t33304\t275000\t0.6324\t7077\tObama\t07077\t0.00626285\t7077.0\n13659\t-74.317014\t40.570172\tIselin CDP\tNJ\tNew Jersey\tMiddlesex County\t17484\t38.8\t39.3\t11.0\t35454\t270946\t0.6324\t8830\tObama\t08830\t0.039445123\t8830.0\n13660\t-74.500941\t40.574281\tMiddlesex borough\tNJ\tNew Jersey\tMiddlesex County\t13558\t40.7\t28.4\t7.9\t34623\t298534\t0.6324\t8846\tObama\t08846\t0.030587793\t8846.0\n13661\t-74.594415\t40.331142\tPlainsboro Center CDP\tNJ\tNew Jersey\tMiddlesex County\t2711\t31.8\t79.8\t5.5\t53603\t590686\t0.6324\t8536\tObama\t08536\t0.006116205\t8536.0\n13662\t-74.423835\t40.377526\tHelmetta borough\tNJ\tNew Jersey\tMiddlesex County\t2121\t39.2\t20.9\t9.1\t38136\t218403\t0.6324\t8828\tObama\t08828\t0.004785124\t8828.0\n13663\t-74.415032\t40.574539\tSouth Plainfield borough\tNJ\tNew Jersey\tMiddlesex County\t22520\t40.4\t29.7\t8.3\t31852\t304119\t0.6324\t7080\tObama\t07080\t0.05080669\t7080.0\n13664\t-74.56304300000001\t40.332914\tPrinceton Meadows CDP\tNJ\tNew Jersey\tMiddlesex County\t14016\t31.6\t73.3\t7.6\t43978\t295327\t0.6324\t8536\tObama\t08536\t0.031621073\t8536.0\n13665\t-74.31506\t40.592912\tColonia CDP\tNJ\tNew Jersey\tMiddlesex County\t17618\t42.3\t29.9\t8.7\t34706\t339969\t0.6324\t7067\tObama\t07067\t0.039747436000000004\t7067.0\n13666\t-74.3123\t40.541513\tFords CDP\tNJ\tNew Jersey\tMiddlesex County\t14793\t39.6\t33.6\t8.9\t31942\t280349\t0.6324\t8863\tObama\t08863\t0.033374039\t8863.0\n13667\t-74.24746\t40.567147\tPort Reading CDP\tNJ\tNew Jersey\tMiddlesex County\t3865\t40.2\t22.0\t8.8\t34441\t280522\t0.6324\t7064\tObama\t07064\t0.008719709\t7064.0\n13668\t-74.575757\t40.391007\tHeathcote CDP\tNJ\tNew Jersey\tMiddlesex County\t5011\t40.7\t64.2\t9.2\t52541\t343750\t0.6324\t8852\tObama\t08852\t0.011305165\t8852.0\n13669\t-74.36267\t40.542285\tMetuchen borough\tNJ\tNew Jersey\tMiddlesex County\t12925\t43.0\t55.4\t9.8\t47516\t369271\t0.6324\t8840\tObama\t08840\t0.029159701\t8840.0\n13670\t-74.271992\t40.58397\tAvenel CDP\tNJ\tNew Jersey\tMiddlesex County\t18147\t36.4\t30.5\t13.8\t27885\t249075\t0.6324\t7001\tObama\t07001\t0.040940897000000004\t7001.0\n13671\t-74.284718\t40.55506\tWoodbridge CDP\tNJ\tNew Jersey\tMiddlesex County\t18729\t39.5\t33.2\t9.8\t35380\t266947\t0.6324\t7095\tObama\t07095\t0.04225393\t7095.0\n13672\t-74.46544399999999\t40.59013\tDunellen borough\tNJ\tNew Jersey\tMiddlesex County\t6850\t38.8\t27.3\t14.3\t33886\t283550\t0.6324\t8812\tObama\t08812\t0.015454078000000001\t8812.0\n13673\t-74.447705\t40.311681\tConcordia CDP\tNJ\tNew Jersey\tMiddlesex County\t3700\t79.1\t37.3\t8.6\t46618\t289808\t0.6324\t8831\tObama\t08831\t0.008347458\t8831.0\n13674\t-74.47258000000001\t40.335851\tRossmoor CDP\tNJ\tNew Jersey\tMiddlesex County\t3019\t80.0\t30.8\t7.2\t45376\t162149\t0.6324\t8831\tObama\t08831\t0.006811074\t8831.0\n13675\t-74.39116700000001\t40.395154999999995\tSpotswood borough\tNJ\tNew Jersey\tMiddlesex County\t7811\t42.5\t22.8\t8.8\t31433\t266435\t0.6324\t8884\tObama\t08884\t0.017622161\t8884.0\n13676\t-74.513671\t40.381632\tDayton CDP\tNJ\tNew Jersey\tMiddlesex County\t7223\t36.4\t54.2\t6.3\t39825\t303808\t0.6324\t8810\tObama\t08810\t0.016295592\t8810.0\n13677\t-74.428302\t40.500465000000005\tHighland Park borough\tNJ\tNew Jersey\tMiddlesex County\t14231\t34.9\t66.0\t9.1\t37924\t338583\t0.6324\t8904\tObama\t08904\t0.032106128\t8904.0\n13678\t-74.543727\t40.380786\tMonmouth Junction CDP\tNJ\tNew Jersey\tMiddlesex County\t2934\t38.8\t58.9\t6.6\t47234\t372253\t0.6324\t8852\tObama\t08852\t0.006619309\t8852.0\n13679\t-74.295753\t40.400995\tBrownville CDP\tNJ\tNew Jersey\tMiddlesex County\t2679\t45.5\t36.5\t9.7\t36591\t246519\t0.6324\t8857\tObama\t08857\t0.006044011\t8857.0\n13680\t-74.444958\t40.486984\tNew Brunswick city\tNJ\tNew Jersey\tMiddlesex County\t54361\t24.6\t23.4\t13.6\t19821\t227323\t0.6324\t8901\tObama\t08901\t0.12264220599999999\t8901.0\n13681\t-74.457702\t40.534315\tSociety Hill CDP\tNJ\tNew Jersey\tMiddlesex County\t3748\t35.5\t60.2\t10.7\t37614\t338961\t0.6324\t8854\tObama\t08854\t0.008455749\t8854.0\n13682\t-74.60769599999999\t40.373216\tKingston CDP\tNJ\tNew Jersey\tMiddlesex County\t1402\t37.7\t74.0\t6.3\t44821\t453125\t0.6324\t8528\tObama\t08528\t0.00316301\t8528.0\n13683\t-74.445029\t40.329867\tWhittingham CDP\tNJ\tNew Jersey\tMiddlesex County\t2556\t75.2\t43.4\t10.4\t54475\t435852\t0.6324\t8831\tObama\t08831\t0.005766514\t8831.0\n13684\t-74.440158\t40.349477\tJamesburg borough\tNJ\tNew Jersey\tMiddlesex County\t6227\t38.5\t24.1\t9.8\t34697\t250509\t0.6324\t8831\tObama\t08831\t0.014048546\t8831.0\n13685\t-74.418026\t40.428224\tEast Brunswick CDP\tNJ\tNew Jersey\tMiddlesex County\t47731\t41.9\t53.4\t8.5\t43754\t375346\t0.6324\t8816\tObama\t08816\t0.10768446400000001\t8816.0\n13686\t-74.332246\t40.394721000000004\tOld Bridge CDP\tNJ\tNew Jersey\tMiddlesex County\t24523\t40.1\t35.2\t10.3\t34870\t320444\t0.6324\t8857\tObama\t08857\t0.055325598\t8857.0\n13687\t-74.378127\t40.44512\tSouth River borough\tNJ\tNew Jersey\tMiddlesex County\t15832\t38.6\t26.4\t12.1\t34047\t270915\t0.6324\t8882\tObama\t08882\t0.035718096\t8882.0\n13688\t-74.562483\t40.413874\tKendall Park CDP\tNJ\tNew Jersey\tMiddlesex County\t9322\t37.6\t43.8\t9.0\t40720\t350166\t0.6324\t8824\tObama\t08824\t0.021031082000000003\t8824.0\n13689\t-74.323868\t40.465511\tSayreville borough\tNJ\tNew Jersey\tMiddlesex County\t42624\t39.1\t30.9\t9.6\t33629\t280165\t0.6324\t8859\tObama\t08859\t0.096162715\t8859.0\n13690\t-74.51684300000001\t40.310206\tCranbury CDP\tNJ\tNew Jersey\tMiddlesex County\t2080\t41.8\t70.1\t6.7\t69134\t663907\t0.6324\t8512\tObama\t08512\t0.004692625\t8512.0\n13691\t-74.249125\t40.449216\tLaurence Harbor CDP\tNJ\tNew Jersey\tMiddlesex County\t6559\t39.8\t19.5\t10.3\t31669\t223968\t0.6324\t7721\tObama\t07721\t0.014797561\t7721.0\n13692\t-74.228543\t40.585033\tCarteret borough\tNJ\tNew Jersey\tMiddlesex County\t21752\t37.9\t16.4\t13.6\t25796\t243666\t0.6324\t7008\tObama\t07008\t0.049074028\t7008.0\n13693\t-74.394299\t40.535854\tEdison CDP\tNJ\tNew Jersey\tMiddlesex County\t100033\t38.9\t48.7\t9.5\t39460\t340517\t0.6324\t8817\tObama\t08817\t0.225681422\t8817.0\n13694\t-74.295988\t40.446106\tMadison Park CDP\tNJ\tNew Jersey\tMiddlesex County\t7087\t35.1\t32.5\t11.8\t27459\t258016\t0.6324\t8859\tObama\t08859\t0.015988766\t8859.0\n13695\t-74.47986800000001\t40.450503000000005\tNorth Brunswick Township CDP\tNJ\tNew Jersey\tMiddlesex County\t38810\t37.1\t42.9\t8.8\t37046\t304239\t0.6324\t8902\tObama\t08902\t0.08755806599999999\t8902.0\n13696\t-74.434961\t40.450263\tMilltown borough\tNJ\tNew Jersey\tMiddlesex County\t6947\t42.3\t32.3\t8.6\t40243\t325949\t0.6324\t8850\tObama\t08850\t0.015672916000000002\t8850.0\n13697\t-74.464336\t40.309625\tClearbrook Park CDP\tNJ\tNew Jersey\tMiddlesex County\t3196\t79.7\t32.9\t13.6\t40780\t222854\t0.6324\t8831\tObama\t08831\t0.007210399\t8831.0\n13698\t-74.272899\t40.521260999999996\tPerth Amboy city\tNJ\tNew Jersey\tMiddlesex County\t49406\t31.5\t13.6\t17.4\t20322\t238449\t0.6324\t8861\tObama\t08861\t0.11146338\t8861.0\n13699\t-74.284322\t40.483117\tSouth Amboy city\tNJ\tNew Jersey\tMiddlesex County\t8567\t39.2\t14.9\t9.6\t31741\t253422\t0.6324\t8879\tObama\t08879\t0.019327748999999998\t8879.0\n13700\t-73.990483\t40.401225\tHighlands borough\tNJ\tNew Jersey\tMonmouth County\t4972\t42.1\t30.4\t12.0\t36311\t250752\t0.4689\t7732\tObama\t07732\t0.011217178999999999\t7732.0\n13701\t-74.02601\t40.18002\tBelmar borough\tNJ\tNew Jersey\tMonmouth County\t5979\t41.1\t38.1\t10.7\t38727\t340775\t0.4689\t7717\tObama\t07717\t0.013489041\t7717.0\n13702\t-74.02738599999999\t40.153464\tSpring Lake borough\tNJ\tNew Jersey\tMonmouth County\t3451\t48.8\t64.3\t10.3\t69417\t1000001\t0.4689\t7762\tObama\t07762\t0.007785696999999999\t7762.0\n13703\t-74.094954\t40.270682\tTinton Falls borough\tNJ\tNew Jersey\tMonmouth County\t15853\t40.5\t47.2\t9.8\t42283\t352412\t0.4689\t7724\tObama\t07724\t0.035765473\t7724.0\n13704\t-74.001568\t40.232446\tLoch Arbour village\tNJ\tNew Jersey\tMonmouth County\t261\t46.3\t54.3\t14.0\t42477\t602273\t0.4689\t7711\tObama\t07711\t0.000588834\t7711.0\n13705\t-74.042955\t40.152153000000006\tSpring Lake Heights borough\tNJ\tNew Jersey\tMonmouth County\t5405\t52.3\t43.7\t9.4\t44733\t448230\t0.4689\t7762\tObama\t07762\t0.012194057\t7762.0\n13706\t-74.006671\t40.361281\tRumson borough\tNJ\tNew Jersey\tMonmouth County\t7309\t42.0\t67.9\t6.8\t77708\t749203\t0.4689\t7760\tObama\t07760\t0.016489614\t7760.0\n13707\t-74.038263\t40.359753999999995\tFair Haven borough\tNJ\tNew Jersey\tMonmouth County\t6050\t39.4\t65.4\t8.3\t52047\t619972\t0.4689\t7704\tObama\t07704\t0.013649221999999999\t7704.0\n13708\t-74.47258000000001\t40.220893\tRoosevelt borough\tNJ\tNew Jersey\tMonmouth County\t1032\t45.9\t48.9\t10.4\t36667\t259722\t0.4689\t8555\tObama\t08555\t0.002328264\t8555.0\n13709\t-73.974523\t40.378496999999996\tSea Bright borough\tNJ\tNew Jersey\tMonmouth County\t1767\t44.4\t52.9\t11.0\t59074\t382386\t0.4689\t7760\tObama\t07760\t0.003986475\t7760.0\n13710\t-74.05572\t40.291082\tEatontown borough\tNJ\tNew Jersey\tMonmouth County\t14916\t39.9\t37.9\t10.4\t35615\t345871\t0.4689\t7724\tObama\t07724\t0.033651536\t7724.0\n13711\t-74.103078\t40.138432\tAllenwood CDP\tNJ\tNew Jersey\tMonmouth County\t965\t47.0\t36.3\t6.1\t49272\t635174\t0.4689\t8720\tObama\t08720\t0.002177107\t8720.0\n13712\t-74.011711\t40.222569\tAsbury Park city\tNJ\tNew Jersey\tMonmouth County\t18174\t32.1\t13.8\t18.2\t18811\t185724\t0.4689\t7756\tObama\t07756\t0.041001811\t7756.0\n13713\t-74.044725\t40.118285\tManasquan borough\tNJ\tNew Jersey\tMonmouth County\t6142\t41.3\t45.4\t7.7\t44686\t540121\t0.4689\t8736\tObama\t08736\t0.01385678\t8736.0\n13714\t-74.016424\t40.234937\tInterlaken borough\tNJ\tNew Jersey\tMonmouth County\t893\t50.6\t58.2\t8.6\t59912\t593099\t0.4689\t7711\tObama\t07711\t0.00201467\t7711.0\n13715\t-74.06788399999999\t40.346466\tRed Bank borough\tNJ\tNew Jersey\tMonmouth County\t11960\t39.7\t35.5\t12.1\t34351\t312529\t0.4689\t7701\tObama\t07701\t0.026982594\t7701.0\n13716\t-74.03344\t40.200575\tNeptune City borough\tNJ\tNew Jersey\tMonmouth County\t5316\t42.8\t20.3\t9.9\t31410\t243182\t0.4689\t7717\tObama\t07717\t0.011993267\t7717.0\n13717\t-74.217821\t40.442747999999995\tCliffwood Beach CDP\tNJ\tNew Jersey\tMonmouth County\t3516\t39.2\t18.7\t10.8\t29348\t241566\t0.4689\t7721\tObama\t07721\t0.007932340999999999\t7721.0\n13718\t-73.997733\t40.250249\tDeal borough\tNJ\tNew Jersey\tMonmouth County\t1054\t47.3\t31.5\t8.1\t44871\t956395\t0.4689\t7723\tObama\t07723\t0.002377897\t7723.0\n13719\t-74.03568\t40.130688\tSea Girt borough\tNJ\tNew Jersey\tMonmouth County\t1982\t50.8\t63.3\t8.3\t73723\t976103\t0.4689\t8750\tObama\t08750\t0.00447153\t8750.0\n13720\t-74.02177900000001\t40.314287\tOceanport borough\tNJ\tNew Jersey\tMonmouth County\t5943\t44.2\t40.1\t7.5\t43440\t471788\t0.4689\t7757\tObama\t07757\t0.013407822\t7757.0\n13721\t-74.012713\t40.201675\tBradley Beach borough\tNJ\tNew Jersey\tMonmouth County\t4469\t40.8\t30.0\t12.9\t37448\t326966\t0.4689\t7720\tObama\t07720\t0.010082376\t7720.0\n13722\t-74.038663\t40.336262\tLittle Silver borough\tNJ\tNew Jersey\tMonmouth County\t6161\t45.0\t65.2\t8.2\t56944\t610523\t0.4689\t7739\tObama\t07739\t0.013899646000000002\t7739.0\n13723\t-74.236584\t40.412637\tMatawan borough\tNJ\tNew Jersey\tMonmouth County\t9061\t39.3\t35.0\t10.9\t37553\t365837\t0.4689\t7747\tObama\t07747\t0.020442248\t7747.0\n13724\t-74.080893\t40.426043\tBelford CDP\tNJ\tNew Jersey\tMonmouth County\t1409\t38.2\t20.4\t10.6\t36069\t292105\t0.4689\t7718\tObama\t07718\t0.003178802\t7718.0\n13725\t-74.360726\t40.297081\tEnglishtown borough\tNJ\tNew Jersey\tMonmouth County\t1742\t35.8\t22.4\t9.0\t30108\t288095\t0.4689\t7726\tObama\t07726\t0.003930073\t7726.0\n13726\t-74.169779\t40.198335\tFarmingdale borough\tNJ\tNew Jersey\tMonmouth County\t1564\t38.2\t22.8\t8.7\t26355\t305000\t0.4689\t7727\tObama\t07727\t0.0035284929999999997\t7727.0\n13727\t-74.03893599999999\t40.402099\tNavesink CDP\tNJ\tNew Jersey\tMonmouth County\t2110\t44.8\t32.5\t8.0\t38170\t386893\t0.4689\t7716\tObama\t07716\t0.004760307\t7716.0\n13728\t-74.33849000000001\t40.306422999999995\tYorketown CDP\tNJ\tNew Jersey\tMonmouth County\t6826\t40.8\t42.1\t11.3\t41529\t461069\t0.4689\t7726\tObama\t07726\t0.015399932\t7726.0\n13729\t-74.029682\t40.236895000000004\tWanamassa CDP\tNJ\tNew Jersey\tMonmouth County\t4614\t41.6\t41.0\t8.6\t36734\t336775\t0.4689\t7712\tObama\t07712\t0.010409505999999999\t7712.0\n13730\t-74.1187\t40.439289\tNorth Middletown CDP\tNJ\tNew Jersey\tMonmouth County\t3344\t35.6\t12.1\t11.4\t27729\t256369\t0.4689\t7734\tObama\t07734\t0.007544296999999999\t7734.0\n13731\t-74.201121\t40.432549\tKeyport borough\tNJ\tNew Jersey\tMonmouth County\t7554\t41.7\t19.5\t10.6\t31051\t276907\t0.4689\t7735\tObama\t07735\t0.017042351\t7735.0\n13732\t-74.294002\t40.339383000000005\tMorganville CDP\tNJ\tNew Jersey\tMonmouth County\t11460\t43.2\t59.8\t8.2\t50498\t563854\t0.4689\t7751\tObama\t07751\t0.025854559\t7751.0\n13733\t-74.008137\t40.211729\tOcean Grove CDP\tNJ\tNew Jersey\tMonmouth County\t4012\t50.2\t40.7\t14.0\t37036\t289844\t0.4689\t7756\tObama\t07756\t0.009051352\t7756.0\n13734\t-74.063914\t40.104815\tBrielle borough\tNJ\tNew Jersey\tMonmouth County\t4964\t44.8\t49.8\t9.0\t50057\t563119\t0.4689\t8730\tObama\t08730\t0.01119913\t8730.0\n13735\t-74.047942\t40.193694\tShark River Hills CDP\tNJ\tNew Jersey\tMonmouth County\t3896\t43.3\t38.3\t10.6\t38659\t305980\t0.4689\t7753\tObama\t07753\t0.008789648\t7753.0\n13736\t-74.242553\t40.27193\tEast Freehold CDP\tNJ\tNew Jersey\tMonmouth County\t5269\t39.0\t53.2\t7.5\t53068\t540388\t0.4689\t7728\tObama\t07728\t0.011887231000000002\t7728.0\n13737\t-74.02627\t40.260645000000004\tOakhurst CDP\tNJ\tNew Jersey\tMonmouth County\t4166\t41.1\t42.0\t11.3\t34026\t384633\t0.4689\t7755\tObama\t07755\t0.009398786\t7755.0\n13738\t-74.294394\t40.232375\tWest Freehold CDP\tNJ\tNew Jersey\tMonmouth County\t13326\t44.8\t44.9\t7.8\t43053\t424328\t0.4689\t7728\tObama\t07728\t0.030064385\t7728.0\n13739\t-74.275478\t40.259513\tFreehold borough\tNJ\tNew Jersey\tMonmouth County\t11651\t35.7\t23.4\t13.2\t25113\t265209\t0.4689\t7728\tObama\t07728\t0.026285468\t7728.0\n13740\t-74.016504\t40.191262\tAvon-by-the-Sea borough\tNJ\tNew Jersey\tMonmouth County\t2239\t44.9\t53.9\t9.2\t53832\t622674\t0.4689\t7717\tObama\t07717\t0.00505134\t7717.0\n13741\t-74.100939\t40.433887\tPort Monmouth CDP\tNJ\tNew Jersey\tMonmouth County\t3927\t38.3\t17.8\t10.6\t30732\t275090\t0.4689\t7758\tObama\t07758\t0.008859586\t7758.0\n13742\t-74.03756\t40.170659\tWest Belmar CDP\tNJ\tNew Jersey\tMonmouth County\t2600\t39.2\t25.0\t11.2\t31459\t285232\t0.4689\t7719\tObama\t07719\t0.005865781\t7719.0\n13743\t-74.01834000000001\t40.28832\tWest Long Branch borough\tNJ\tNew Jersey\tMonmouth County\t8048\t33.5\t40.2\t12.3\t36232\t420400\t0.4689\t7764\tObama\t07764\t0.018156849\t7764.0\n13744\t-74.587284\t40.177857\tAllentown borough\tNJ\tNew Jersey\tMonmouth County\t2039\t41.4\t46.9\t8.8\t39914\t334673\t0.4689\t8501\tObama\t08501\t0.0046001259999999995\t8501.0\n13745\t-73.991474\t40.295838\tLong Branch city\tNJ\tNew Jersey\tMonmouth County\t31949\t36.7\t24.3\t13.7\t28125\t270469\t0.4689\t7740\tObama\t07740\t0.072079171\t7740.0\n13746\t-74.149191\t40.114518\tRamtown CDP\tNJ\tNew Jersey\tMonmouth County\t6448\t33.8\t32.1\t7.9\t32487\t331835\t0.4689\t8724\tObama\t08724\t0.014547138000000001\t8724.0\n13747\t-74.219054\t40.403023\tStrathmore CDP\tNJ\tNew Jersey\tMonmouth County\t6893\t42.2\t53.3\t8.4\t39833\t381217\t0.4689\t7747\tObama\t07747\t0.015551088999999999\t7747.0\n13748\t-74.170038\t40.445509\tUnion Beach borough\tNJ\tNew Jersey\tMonmouth County\t6641\t36.1\t10.5\t11.6\t29848\t262768\t0.4689\t7730\tObama\t07730\t0.014982559\t7730.0\n13749\t-74.00197800000001\t40.236373\tAllenhurst borough\tNJ\tNew Jersey\tMonmouth County\t721\t43.3\t62.5\t9.1\t54872\t676316\t0.4689\t7711\tObama\t07711\t0.0016266260000000002\t7711.0\n13750\t-74.02619200000001\t40.170495\tSouth Belmar borough\tNJ\tNew Jersey\tMonmouth County\t1719\t39.5\t29.6\t10.0\t32707\t246552\t0.4689\t7762\tObama\t07762\t0.0038781840000000002\t7762.0\n13751\t-74.029872\t40.411392\tAtlantic Highlands borough\tNJ\tNew Jersey\tMonmouth County\t4752\t43.4\t40.4\t12.1\t48573\t380769\t0.4689\t7716\tObama\t07716\t0.010720843\t7716.0\n13752\t-74.060022\t40.419306\tLeonardo CDP\tNJ\tNew Jersey\tMonmouth County\t3918\t33.9\t19.2\t11.3\t28535\t290919\t0.4689\t7737\tObama\t07737\t0.008839281\t7737.0\n13753\t-73.981879\t40.332809000000005\tMonmouth Beach borough\tNJ\tNew Jersey\tMonmouth County\t3626\t47.8\t54.3\t9.3\t65043\t528898\t0.4689\t7750\tObama\t07750\t0.008180509\t7750.0\n13754\t-74.08040799999999\t40.365849\tFairview CDP\tNJ\tNew Jersey\tMonmouth County\t3852\t40.2\t42.2\t6.4\t34717\t405946\t0.4689\t7701\tObama\t07701\t0.008690381\t7701.0\n13755\t-74.12824499999999\t40.339090999999996\tLincroft CDP\tNJ\tNew Jersey\tMonmouth County\t6210\t44.2\t54.3\t8.1\t47199\t585242\t0.4689\t7738\tObama\t07738\t0.014010193\t7738.0\n13756\t-74.131639\t40.447161\tKeansburg borough\tNJ\tNew Jersey\tMonmouth County\t10644\t35.8\t12.3\t14.2\t23751\t204983\t0.4689\t7734\tObama\t07734\t0.024013606\t7734.0\n13757\t-74.060022\t40.324982\tShrewsbury borough\tNJ\tNew Jersey\tMonmouth County\t3967\t41.5\t53.4\t7.3\t49210\t510294\t0.4689\t7702\tObama\t07702\t0.008949829\t7702.0\n13758\t-74.38362099999999\t40.740679\tChatham borough\tNJ\tNew Jersey\tMorris County\t8355\t40.0\t71.1\t6.8\t71859\t667380\t0.4404\t7928\tObama\t07928\t0.018849462\t7928.0\n13759\t-74.6395\t40.919009\tMount Arlington borough\tNJ\tNew Jersey\tMorris County\t5400\t42.3\t40.8\t7.3\t45112\t297782\t0.4404\t7856\tObama\t07856\t0.012182776000000001\t7856.0\n13760\t-74.31214399999999\t40.992209\tRiverdale borough\tNJ\tNew Jersey\tMorris County\t4025\t40.5\t36.4\t9.1\t43880\t340821\t0.4404\t7457\tObama\t07457\t0.009080681\t7457.0\n13761\t-74.58121700000001\t40.899716999999995\tWharton borough\tNJ\tNew Jersey\tMorris County\t6316\t36.8\t27.3\t12.4\t34337\t281899\t0.4404\t7885\tObama\t07885\t0.014249336000000001\t7885.0\n13762\t-74.477285\t40.79654\tMorristown town\tNJ\tNew Jersey\tMorris County\t20360\t37.3\t43.4\t8.4\t41268\t364502\t0.4404\t7960\tObama\t07960\t0.045933579\t7960.0\n13763\t-74.70311600000001\t40.898193\tNetcong borough\tNJ\tNew Jersey\tMorris County\t3220\t37.2\t26.7\t7.6\t38326\t253388\t0.4404\t7857\tObama\t07857\t0.007264544\t7857.0\n13764\t-74.395646\t40.777201\tFlorham Park borough\tNJ\tNew Jersey\tMorris County\t11787\t41.4\t63.4\t7.3\t55378\t566847\t0.4404\t7932\tObama\t07932\t0.026592294\t7932.0\n13765\t-74.559713\t40.885829\tDover town\tNJ\tNew Jersey\tMorris County\t19188\t36.0\t15.6\t13.8\t24796\t262099\t0.4404\t7801\tObama\t07801\t0.043289466\t7801.0\n13766\t-74.777772\t40.782738\tLong Valley CDP\tNJ\tNew Jersey\tMorris County\t1930\t42.2\t49.4\t4.8\t48987\t407724\t0.4404\t7853\tObama\t07853\t0.004354215\t7853.0\n13767\t-74.440752\t40.89059\tMountain Lakes borough\tNJ\tNew Jersey\tMorris County\t4257\t43.1\t79.7\t5.2\t78801\t805497\t0.4404\t7046\tObama\t07046\t0.009604089\t7046.0\n13768\t-74.543592\t40.875981\tVictory Gardens borough\tNJ\tNew Jersey\tMorris County\t1496\t32.6\t12.8\t8.2\t26069\t198694\t0.4404\t7801\tObama\t07801\t0.00337508\t7801.0\n13769\t-74.691539\t40.788113\tChester borough\tNJ\tNew Jersey\tMorris County\t1682\t40.0\t53.8\t10.6\t68506\t512411\t0.4404\t7930\tObama\t07930\t0.0037947090000000003\t7930.0\n13770\t-74.737411\t40.873288\tBudd Lake CDP\tNJ\tNew Jersey\tMorris County\t8351\t36.4\t34.5\t9.1\t33363\t299029\t0.4404\t7828\tObama\t07828\t0.018840438\t7828.0\n13771\t-74.600462\t40.768595\tMendham borough\tNJ\tNew Jersey\tMorris County\t5081\t45.0\t66.9\t5.5\t68595\t680691\t0.4404\t7945\tObama\t07945\t0.01146309\t7945.0\n13772\t-74.30367199999999\t40.924021999999994\tLincoln Park borough\tNJ\tNew Jersey\tMorris County\t11182\t43.7\t37.8\t8.2\t40202\t324619\t0.4404\t7035\tObama\t07035\t0.025227372\t7035.0\n13773\t-74.6521\t40.856286\tSuccasunna-Kenvil CDP\tNJ\tNew Jersey\tMorris County\t12594\t42.1\t43.6\t6.6\t43070\t366890\t0.4404\t7876\tObama\t07876\t0.028412942000000004\t7876.0\n13774\t-74.478576\t40.835683\tMorris Plains borough\tNJ\tNew Jersey\tMorris County\t5220\t43.1\t55.7\t8.2\t46791\t471370\t0.4404\t7950\tObama\t07950\t0.011776683999999999\t7950.0\n13775\t-74.38565799999999\t40.984731\tKinnelon borough\tNJ\tNew Jersey\tMorris County\t10077\t42.3\t62.4\t5.9\t67809\t631959\t0.4404\t7405\tObama\t07405\t0.022734415\t7405.0\n13776\t-74.515334\t40.897061\tRockaway borough\tNJ\tNew Jersey\tMorris County\t6482\t40.6\t33.0\t10.2\t36094\t321102\t0.4404\t7834\tObama\t07834\t0.014623843999999999\t7834.0\n13777\t-74.405438\t40.904747\tBoonton town\tNJ\tNew Jersey\tMorris County\t8501\t39.5\t37.6\t12.1\t38164\t358264\t0.4404\t7005\tObama\t07005\t0.019178848999999998\t7005.0\n13778\t-74.496643\t40.96042\tLake Telemark CDP\tNJ\tNew Jersey\tMorris County\t1279\t39.3\t31.7\t10.7\t39945\t281490\t0.4404\t7842\tObama\t07842\t0.0028855129999999997\t7842.0\n13779\t-74.417351\t40.758377\tMadison borough\tNJ\tNew Jersey\tMorris County\t15622\t36.6\t61.4\t7.7\t54488\t640246\t0.4404\t7940\tObama\t07940\t0.035244321\t7940.0\n13780\t-74.513126\t40.92341\tWhite Meadow Lake CDP\tNJ\tNew Jersey\tMorris County\t9162\t40.3\t46.7\t8.8\t44091\t340016\t0.4404\t7866\tObama\t07866\t0.020670111\t7866.0\n13781\t-74.346888\t40.998847999999995\tButler borough\tNJ\tNew Jersey\tMorris County\t7690\t40.5\t27.8\t7.9\t35268\t322933\t0.4404\t7405\tObama\t07405\t0.017349176\t7405.0\n13782\t-74.211804\t40.094288\tLakewood CDP\tNJ\tNew Jersey\tOcean County\t43435\t23.3\t26.6\t13.6\t14810\t270110\t0.4069\t8701\tObama\t08701\t0.09799238800000001\t8701.0\n13783\t-74.183952\t39.826776\tForked River CDP\tNJ\tNew Jersey\tOcean County\t5428\t42.6\t23.7\t11.7\t32017\t269578\t0.4069\t8731\tObama\t08731\t0.012245946\t8731.0\n13784\t-74.077268\t39.925773\tSeaside Park borough\tNJ\tNew Jersey\tOcean County\t2004\t51.0\t39.9\t12.5\t37071\t484375\t0.4069\t8752\tObama\t08752\t0.004521164\t8752.0\n13785\t-74.064943\t39.990904\tDover Beaches North CDP\tNJ\tNew Jersey\tOcean County\t2179\t61.1\t36.1\t8.6\t43452\t458245\t0.4069\t8735\tObama\t08735\t0.004915976\t8735.0\n13786\t-74.290713\t40.018703\tLeisure Knoll CDP\tNJ\tNew Jersey\tOcean County\t2501\t77.6\t23.8\t6.4\t33027\t219363\t0.4069\t8733\tObama\t08733\t0.00564243\t8733.0\n13787\t-74.278242\t39.964006\tHoliday City-Berkeley CDP\tNJ\tNew Jersey\tOcean County\t13955\t77.1\t10.4\t23.6\t28938\t177226\t0.4069\t8757\tObama\t08757\t0.031483453\t8757.0\n13788\t-74.528458\t40.064302000000005\tNew Egypt CDP\tNJ\tNew Jersey\tOcean County\t2581\t36.4\t18.8\t9.7\t26866\t253000\t0.4069\t8511\tObama\t08511\t0.005822916\t8511.0\n13789\t-74.145613\t39.944276\tIsland Heights borough\tNJ\tNew Jersey\tOcean County\t2094\t43.6\t40.2\t10.0\t37193\t365745\t0.4069\t8732\tObama\t08732\t0.00472421\t8732.0\n13790\t-74.04729300000001\t40.070372\tBay Head borough\tNJ\tNew Jersey\tOcean County\t1273\t56.4\t58.6\t11.6\t56402\t935127\t0.4069\t8742\tObama\t08742\t0.002871977\t8742.0\n13791\t-74.13538299999999\t39.926196999999995\tOcean Gate borough\tNJ\tNew Jersey\tOcean County\t2404\t37.5\t9.7\t11.3\t28071\t208209\t0.4069\t8740\tObama\t08740\t0.005423592\t8740.0\n13792\t-74.180685\t39.646885\tShip Bottom borough\tNJ\tNew Jersey\tOcean County\t1532\t54.4\t31.5\t13.2\t36745\t553279\t0.4069\t8008\tObama\t08008\t0.0034562990000000004\t8008.0\n13793\t-74.04961800000001\t40.043240999999995\tMantoloking borough\tNJ\tNew Jersey\tOcean County\t529\t63.3\t64.2\t0.0\t90268\t1000001\t0.4069\t8738\tObama\t08738\t0.001193461\t8738.0\n13794\t-74.10795300000001\t39.752943\tBarnegat Light borough\tNJ\tNew Jersey\tOcean County\t725\t61.3\t46.2\t8.0\t43796\t784439\t0.4069\t8006\tObama\t08006\t0.0016356510000000001\t8006.0\n13795\t-74.330792\t39.598265000000005\tTuckerton borough\tNJ\tNew Jersey\tOcean County\t3686\t43.6\t17.4\t13.6\t28018\t209728\t0.4069\t8087\tObama\t08087\t0.008315873\t8087.0\n13796\t-74.074104\t39.954471999999996\tDover Beaches South CDP\tNJ\tNew Jersey\tOcean County\t1734\t55.5\t27.2\t8.4\t34762\t359630\t0.4069\t8751\tObama\t08751\t0.003912025\t8751.0\n13797\t-74.185722\t40.044559\tLeisure Village CDP\tNJ\tNew Jersey\tOcean County\t4361\t67.6\t20.7\t16.1\t30410\t137616\t0.4069\t8701\tObama\t08701\t0.00983872\t8701.0\n13798\t-74.168391\t40.038481\tLeisure Village East CDP\tNJ\tNew Jersey\tOcean County\t4939\t75.3\t27.5\t9.6\t35835\t263738\t0.4069\t8723\tObama\t08723\t0.011142728000000001\t8723.0\n13799\t-74.222291\t39.754684999999995\tBarnegat CDP\tNJ\tNew Jersey\tOcean County\t3267\t39.3\t25.5\t11.7\t29711\t287278\t0.4069\t8758\tObama\t08758\t0.00737058\t8758.0\n13800\t-74.399467\t39.952857\tCedar Glen Lakes CDP\tNJ\tNew Jersey\tOcean County\t1562\t76.0\t11.9\t18.6\t24237\t101430\t0.4069\t8759\tObama\t08759\t0.003523981\t8759.0\n13801\t-74.266388\t40.004163\tLeisure Village West-Pine Lake Park CDP\tNJ\tNew Jersey\tOcean County\t12714\t51.7\t20.7\t10.9\t29616\t205156\t0.4069\t8757\tObama\t08757\t0.02868367\t8757.0\n13802\t-74.25735300000001\t39.939585\tHoliday Heights CDP\tNJ\tNew Jersey\tOcean County\t2418\t78.5\t12.4\t17.4\t30205\t282376\t0.4069\t8757\tObama\t08757\t0.005455176999999999\t8757.0\n13803\t-74.074768\t39.942912\tSeaside Heights borough\tNJ\tNew Jersey\tOcean County\t3284\t33.4\t21.2\t15.2\t22669\t235145\t0.4069\t8751\tObama\t08751\t0.007408933\t8751.0\n13804\t-74.235881\t39.962052\tSilver Ridge CDP\tNJ\tNew Jersey\tOcean County\t1222\t74.9\t13.7\t15.7\t30815\t161944\t0.4069\t8757\tObama\t08757\t0.0027569170000000002\t8757.0\n13805\t-74.316202\t39.958397\tPine Ridge at Crestwood CDP\tNJ\tNew Jersey\tOcean County\t2222\t75.1\t6.1\t33.1\t27221\t46360\t0.4069\t8759\tObama\t08759\t0.005012987\t8759.0\n13806\t-74.249218\t39.693078\tManahawkin CDP\tNJ\tNew Jersey\tOcean County\t2179\t44.3\t24.3\t12.1\t34305\t308757\t0.4069\t8050\tObama\t08050\t0.004915976\t8050.0\n13807\t-74.04507\t40.092739\tPoint Pleasant Beach borough\tNJ\tNew Jersey\tOcean County\t5415\t44.8\t41.8\t11.6\t36661\t510022\t0.4069\t8742\tObama\t08742\t0.012216618\t8742.0\n13808\t-74.233662\t39.670188\tBeach Haven West CDP\tNJ\tNew Jersey\tOcean County\t4922\t58.6\t26.2\t11.6\t40645\t332653\t0.4069\t8050\tObama\t08050\t0.011104375\t8050.0\n13809\t-74.186375\t39.993658\tToms River CDP\tNJ\tNew Jersey\tOcean County\t91608\t42.9\t29.8\t11.3\t31504\t307438\t0.4069\t8753\tObama\t08753\t0.20667403399999998\t8753.0\n13810\t-74.201943\t39.928197999999995\tBeachwood borough\tNJ\tNew Jersey\tOcean County\t10738\t38.2\t17.1\t11.7\t28252\t232123\t0.4069\t8722\tObama\t08722\t0.024225677\t8722.0\n13811\t-74.071519\t39.969015\tLavallette borough\tNJ\tNew Jersey\tOcean County\t2961\t59.6\t33.3\t9.0\t37502\t713864\t0.4069\t8735\tObama\t08735\t0.0066802219999999995\t8735.0\n13812\t-74.28520999999999\t40.04168\tCedar Glen West CDP\tNJ\tNew Jersey\tOcean County\t1542\t70.2\t9.9\t20.7\t26090\t64402\t0.4069\t8733\tObama\t08733\t0.0034788590000000004\t8733.0\n13813\t-74.139074\t39.699181\tHarvey Cedars borough\tNJ\tNew Jersey\tOcean County\t421\t56.6\t51.6\t1.3\t44122\t872396\t0.4069\t8006\tObama\t08006\t0.000949805\t8006.0\n13814\t-74.352485\t39.956891\tCrestwood Village CDP\tNJ\tNew Jersey\tOcean County\t9069\t76.9\t13.8\t26.7\t28865\t101595\t0.4069\t8759\tObama\t08759\t0.020460296\t8759.0\n13815\t-74.382761\t39.565911\tMystic Island CDP\tNJ\tNew Jersey\tOcean County\t8804\t46.5\t17.6\t13.3\t26443\t186507\t0.4069\t8087\tObama\t08087\t0.019862438\t8087.0\n13816\t-74.320176\t40.013089\tLakehurst borough\tNJ\tNew Jersey\tOcean County\t2732\t33.1\t10.5\t13.3\t23624\t176010\t0.4069\t8733\tObama\t08733\t0.006163582\t8733.0\n13817\t-74.169821\t39.93585\tPine Beach borough\tNJ\tNew Jersey\tOcean County\t2234\t43.3\t39.3\t10.6\t33578\t320133\t0.4069\t8741\tObama\t08741\t0.00504006\t8741.0\n13818\t-74.070513\t40.077839000000004\tPoint Pleasant borough\tNJ\tNew Jersey\tOcean County\t19738\t42.2\t34.3\t10.5\t34224\t346297\t0.4069\t8742\tObama\t08742\t0.04453030400000001\t8742.0\n13819\t-74.242417\t39.560018\tBeach Haven borough\tNJ\tNew Jersey\tOcean County\t1450\t55.0\t42.8\t14.1\t38994\t680556\t0.4069\t8008\tObama\t08008\t0.003271301\t8008.0\n13820\t-74.237057\t39.953317999999996\tHoliday City South CDP\tNJ\tNew Jersey\tOcean County\t4050\t78.4\t10.7\t12.5\t24946\t211297\t0.4069\t8757\tObama\t08757\t0.009137082\t8757.0\n13821\t-74.280399\t39.742943\tOcean Acres CDP\tNJ\tNew Jersey\tOcean County\t15745\t38.5\t21.9\t9.4\t28661\t261876\t0.4069\t8005\tObama\t08005\t0.035521818\t8005.0\n13822\t-74.1688\t39.661533\tSurf City borough\tNJ\tNew Jersey\tOcean County\t1577\t58.6\t32.6\t12.0\t36026\t543421\t0.4069\t8008\tObama\t08008\t0.003557822\t8008.0\n13823\t-74.322849\t40.158674\tVista Center CDP\tNJ\tNew Jersey\tOcean County\t2087\t40.1\t27.8\t7.7\t32324\t365646\t0.4069\t8527\tObama\t08527\t0.004708417\t8527.0\n13824\t-74.192797\t39.789696\tWaretown CDP\tNJ\tNew Jersey\tOcean County\t2304\t39.7\t21.7\t9.5\t29568\t209836\t0.4069\t8758\tObama\t08758\t0.005197985\t8758.0\n13825\t-74.212129\t39.600128999999995\tNorth Beach Haven CDP\tNJ\tNew Jersey\tOcean County\t2816\t59.2\t42.0\t12.4\t39809\t647080\t0.4069\t8008\tObama\t08008\t0.006353091999999999\t8008.0\n13826\t-74.209693\t39.941266\tSouth Toms River borough\tNJ\tNew Jersey\tOcean County\t3707\t33.3\t7.8\t15.9\t19830\t172602\t0.4069\t8722\tObama\t08722\t0.00836325\t8722.0\n13827\t-74.22148\t40.903826\tTotowa borough\tNJ\tNew Jersey\tPassaic County\t10201\t44.1\t21.8\t9.4\t34158\t365285\t0.637\t7512\tObama\t07512\t0.023014167000000002\t7512.0\n13828\t-74.194594\t40.890306\tWest Paterson borough\tNJ\tNew Jersey\tPassaic County\t11866\t40.4\t28.8\t9.5\t36593\t374602\t0.637\t075HH\tObama\t075HH\t0.026770522999999997\t0.0\n13829\t-74.184573\t40.962783\tNorth Haledon borough\tNJ\tNew Jersey\tPassaic County\t8513\t41.8\t37.5\t9.6\t38013\t436081\t0.637\t7508\tObama\t07508\t0.019205921\t7508.0\n13830\t-74.275237\t41.106328999999995\tRingwood borough\tNJ\tNew Jersey\tPassaic County\t12421\t40.9\t43.7\t9.9\t38889\t356622\t0.637\t7456\tObama\t07456\t0.028022642\t7456.0\n13831\t-74.162377\t40.914629999999995\tPaterson city\tNJ\tNew Jersey\tPassaic County\t150926\t30.5\t10.4\t20.3\t17042\t258582\t0.637\t7501\tObama\t07501\t0.34049957799999997\t7501.0\n13832\t-74.173697\t40.938221\tProspect Park borough\tNJ\tNew Jersey\tPassaic County\t5980\t30.9\t15.6\t13.0\t21221\t266379\t0.637\t7508\tObama\t07508\t0.013491297\t7508.0\n13833\t-74.1582\t40.957752\tHawthorne borough\tNJ\tNew Jersey\tPassaic County\t18591\t40.3\t29.6\t9.0\t33455\t369133\t0.637\t7506\tObama\t07506\t0.041942592\t7506.0\n13834\t-74.218295\t40.876259999999995\tLittle Falls CDP\tNJ\tNew Jersey\tPassaic County\t11581\t41.3\t39.4\t10.7\t38528\t362355\t0.637\t7424\tObama\t07424\t0.026127543\t7424.0\n13835\t-74.188634\t40.936284\tHaledon borough\tNJ\tNew Jersey\tPassaic County\t8569\t35.7\t21.6\t14.1\t24647\t292089\t0.637\t7508\tObama\t07508\t0.019332261\t7508.0\n13836\t-74.390817\t41.105384\tWest Milford CDP\tNJ\tNew Jersey\tPassaic County\t28018\t40.6\t30.4\t10.5\t35000\t292534\t0.637\t7480\tObama\t07480\t0.063210561\t7480.0\n13837\t-74.128128\t40.857452\tPassaic city\tNJ\tNew Jersey\tPassaic County\t70494\t29.1\t16.5\t17.7\t15877\t269324\t0.637\t7055\tObama\t07055\t0.159039378\t7055.0\n13838\t-74.285531\t41.002779\tPompton Lakes borough\tNJ\tNew Jersey\tPassaic County\t10758\t40.2\t32.3\t10.2\t32875\t307011\t0.637\t7442\tObama\t07442\t0.024270798\t7442.0\n13839\t-74.15743\t40.863045\tClifton city\tNJ\tNew Jersey\tPassaic County\t80705\t40.4\t27.5\t11.1\t29211\t326114\t0.637\t7013\tObama\t07013\t0.18207610600000002\t7013.0\n13840\t-74.245203\t40.948015000000005\tWayne CDP\tNJ\tNew Jersey\tPassaic County\t53488\t42.9\t45.9\t9.8\t43267\t530550\t0.637\t7470\tObama\t07470\t0.12067265699999999\t7470.0\n13841\t-74.33188\t41.029746\tBloomingdale borough\tNJ\tNew Jersey\tPassaic County\t7437\t41.8\t29.3\t8.0\t35412\t312574\t0.637\t7403\tObama\t07403\t0.01677839\t7403.0\n13842\t-74.29016899999999\t41.044034\tWanaque borough\tNJ\tNew Jersey\tPassaic County\t10592\t40.8\t25.7\t10.0\t31633\t298275\t0.637\t7465\tObama\t07465\t0.02389629\t7465.0\n13843\t-75.472164\t39.567974\tSalem city\tNJ\tNew Jersey\tSalem County\t5877\t34.3\t10.6\t18.2\t17680\t125202\t0.4925\t8079\tObama\t08079\t0.013258922\t8079.0\n13844\t-75.35094699999999\t39.562068\tAlloway CDP\tNJ\tNew Jersey\tSalem County\t1248\t39.6\t24.5\t5.8\t27491\t279779\t0.4925\t8001\tObama\t08001\t0.002815575\t8001.0\n13845\t-75.46727299999999\t39.707372\tCarneys Point CDP\tNJ\tNew Jersey\tSalem County\t7345\t40.2\t17.0\t15.3\t26214\t147963\t0.4925\t8069\tObama\t08069\t0.016570832\t8069.0\n13846\t-75.324842\t39.650347\tWoodstown borough\tNJ\tNew Jersey\tSalem County\t3421\t39.4\t36.0\t9.1\t31502\t223404\t0.4925\t8098\tObama\t08098\t0.0077180140000000005\t8098.0\n13847\t-75.468975\t39.72784\tPenns Grove borough\tNJ\tNew Jersey\tSalem County\t4929\t31.7\t9.9\t23.6\t18778\t122235\t0.4925\t8069\tObama\t08069\t0.011120168\t8069.0\n13848\t-75.172838\t39.540093\tOlivet CDP\tNJ\tNew Jersey\tSalem County\t1490\t42.4\t37.3\t11.5\t33949\t276471\t0.4925\t8318\tObama\t08318\t0.003361544\t8318.0\n13849\t-75.50751600000001\t39.650733\tPennsville CDP\tNJ\tNew Jersey\tSalem County\t11620\t41.8\t16.1\t10.0\t28520\t184059\t0.4925\t8070\tObama\t08070\t0.02621553\t8070.0\n13850\t-75.17420899999999\t39.591545\tElmer borough\tNJ\tNew Jersey\tSalem County\t1481\t39.6\t18.0\t12.7\t26401\t186523\t0.4925\t8318\tObama\t08318\t0.003341239\t8318.0\n13851\t-74.592058\t40.726748\tBernardsville borough\tNJ\tNew Jersey\tSomerset County\t7815\t42.8\t64.2\t5.6\t75400\t719669\t0.5219\t7924\tObama\t07924\t0.017631185\t7924.0\n13852\t-74.52801\t40.55357\tSouth Bound Brook borough\tNJ\tNew Jersey\tSomerset County\t5050\t38.4\t20.6\t10.7\t28176\t260892\t0.5219\t8880\tObama\t08880\t0.011393152\t8880.0\n13853\t-74.592391\t40.500405\tMillstone borough\tNJ\tNew Jersey\tSomerset County\t418\t47.5\t43.0\t7.1\t40281\t436905\t0.5219\t8835\tObama\t08835\t0.000943037\t8835.0\n13854\t-74.589176\t40.542045\tManville borough\tNJ\tNew Jersey\tSomerset County\t10655\t41.9\t16.0\t8.7\t32090\t290974\t0.5219\t8835\tObama\t08835\t0.024038423\t8835.0\n13855\t-74.538318\t40.567679999999996\tBound Brook borough\tNJ\tNew Jersey\tSomerset County\t10638\t35.9\t26.7\t10.6\t26431\t320782\t0.5219\t8805\tObama\t08805\t0.02400007\t8805.0\n13856\t-74.656592\t40.717002\tPeapack and Gladstone borough\tNJ\tNew Jersey\tSomerset County\t2742\t42.0\t60.7\t11.2\t73734\t745482\t0.5219\t7977\tObama\t07977\t0.006186143000000001\t7977.0\n13857\t-74.438976\t40.643321\tWatchung borough\tNJ\tNew Jersey\tSomerset County\t6813\t45.2\t61.6\t8.4\t72818\t790237\t0.5219\t7060\tObama\t07060\t0.015370603\t7060.0\n13858\t-74.64063900000001\t40.400238\tRocky Hill borough\tNJ\tNew Jersey\tSomerset County\t697\t46.2\t63.6\t7.5\t67617\t555556\t0.5219\t8553\tObama\t08553\t0.0015724810000000001\t8553.0\n13859\t-74.609277\t40.56968\tSomerville borough\tNJ\tNew Jersey\tSomerset County\t12947\t36.5\t36.0\t11.0\t28833\t319076\t0.5219\t8807\tObama\t08807\t0.029209335\t8807.0\n13860\t-74.643293\t40.573144\tRaritan borough\tNJ\tNew Jersey\tSomerset County\t6416\t38.7\t31.2\t10.2\t34861\t377092\t0.5219\t8869\tObama\t08869\t0.014474943\t8869.0\n13861\t-74.488987\t40.498284000000005\tSomerset CDP\tNJ\tNew Jersey\tSomerset County\t24187\t38.1\t39.6\t9.0\t34043\t335298\t0.5219\t8873\tObama\t08873\t0.054567557999999995\t8873.0\n13862\t-74.438484\t40.620928\tNorth Plainfield borough\tNJ\tNew Jersey\tSomerset County\t22793\t35.2\t29.9\t9.8\t27877\t299193\t0.5219\t7060\tObama\t07060\t0.051422597\t7060.0\n13863\t-74.625759\t40.690277\tFar Hills borough\tNJ\tNew Jersey\tSomerset County\t928\t46.5\t62.3\t7.1\t94309\t751603\t0.5219\t7931\tObama\t07931\t0.0020936329999999997\t7931.0\n13864\t-74.663964\t41.014996999999994\tLake Mohawk CDP\tNJ\tNew Jersey\tSussex County\t9716\t41.7\t52.6\t8.0\t47097\t386819\t0.3842\t7871\tObama\t07871\t0.021919973\t7871.0\n13865\t-74.48341500000001\t41.239575\tVernon Valley CDP\tNJ\tNew Jersey\tSussex County\t1881\t40.1\t24.7\t10.8\t31000\t274742\t0.3842\t7418\tObama\t07418\t0.0042436670000000004\t7418.0\n13866\t-74.455993\t41.174229\tHighland Lake CDP\tNJ\tNew Jersey\tSussex County\t5525\t38.7\t27.1\t10.5\t36108\t241901\t0.3842\t7422\tObama\t07422\t0.012464785\t7422.0\n13867\t-74.752928\t41.053810999999996\tNewton town\tNJ\tNew Jersey\tSussex County\t8218\t39.7\t23.4\t10.8\t30031\t235146\t0.3842\t7860\tObama\t07860\t0.018540381\t7860.0\n13868\t-74.597572\t41.077037\tOgdensburg borough\tNJ\tNew Jersey\tSussex County\t2620\t38.2\t24.2\t9.5\t31804\t242584\t0.3842\t7439\tObama\t07439\t0.005910903\t7439.0\n13869\t-74.57338399999999\t41.148253000000004\tHamburg borough\tNJ\tNew Jersey\tSussex County\t3699\t38.3\t24.2\t10.3\t33559\t197194\t0.3842\t7419\tObama\t07419\t0.008345202\t7419.0\n13870\t-74.65923599999999\t40.954295\tHopatcong borough\tNJ\tNew Jersey\tSussex County\t16121\t39.1\t23.5\t12.4\t36757\t245463\t0.3842\t078HH\tObama\t078HH\t0.036370099999999995\t0.0\n13871\t-74.607584\t41.20966\tSussex borough\tNJ\tNew Jersey\tSussex County\t2155\t37.7\t14.4\t10.7\t25594\t210169\t0.3842\t7461\tObama\t07461\t0.00486183\t7461.0\n13872\t-74.743001\t40.986416\tAndover borough\tNJ\tNew Jersey\tSussex County\t688\t42.0\t24.5\t12.3\t35076\t272143\t0.3842\t7821\tObama\t07821\t0.0015521760000000002\t7821.0\n13873\t-74.749752\t41.146324\tBranchville borough\tNJ\tNew Jersey\tSussex County\t896\t42.7\t22.3\t12.4\t32651\t260714\t0.3842\t7826\tObama\t07826\t0.002021438\t7826.0\n13874\t-74.84045400000001\t41.123382\tCrandon Lakes CDP\tNJ\tNew Jersey\tSussex County\t1242\t38.5\t26.9\t9.0\t33096\t231667\t0.3842\t7860\tObama\t07860\t0.002802039\t7860.0\n13875\t-74.702469\t40.91359\tStanhope borough\tNJ\tNew Jersey\tSussex County\t3672\t40.4\t37.7\t10.5\t36376\t229474\t0.3842\t7874\tObama\t07874\t0.008284288\t7874.0\n13876\t-74.58847800000001\t41.110633\tFranklin borough\tNJ\tNew Jersey\tSussex County\t5333\t37.5\t18.9\t10.2\t28946\t198684\t0.3842\t7416\tObama\t07416\t0.01203162\t7416.0\n13877\t-74.313608\t40.620242\tClark CDP\tNJ\tNew Jersey\tUnion County\t14353\t44.7\t32.3\t7.5\t36651\t408492\t0.6659999999999999\t7066\tObama\t07066\t0.032381369\t7066.0\n13878\t-74.266727\t40.665267\tRoselle Park borough\tNJ\tNew Jersey\tUnion County\t13130\t38.9\t30.3\t10.6\t31691\t281284\t0.6659999999999999\t7204\tObama\t07204\t0.029622195\t7204.0\n13879\t-74.26009\t40.652673\tRoselle borough\tNJ\tNew Jersey\tUnion County\t21756\t36.9\t21.2\t12.9\t27420\t225457\t0.6659999999999999\t7203\tObama\t07203\t0.049083053\t7203.0\n13880\t-74.19393000000001\t40.666451\tElizabeth city\tNJ\tNew Jersey\tUnion County\t126156\t32.8\t15.2\t15.6\t20353\t259562\t0.6659999999999999\t7201\tObama\t07201\t0.284616731\t7201.0\n13881\t-74.403498\t40.699478000000006\tNew Providence borough\tNJ\tNew Jersey\tUnion County\t11754\t42.1\t62.4\t9.0\t52708\t634604\t0.6659999999999999\t7974\tObama\t07974\t0.026517843\t7974.0\n13882\t-74.385701\t40.641688\tFanwood borough\tNJ\tNew Jersey\tUnion County\t7110\t42.0\t55.2\t9.2\t43008\t428675\t0.6659999999999999\t7023\tObama\t07023\t0.016040656\t7023.0\n13883\t-74.415758\t40.615314\tPlainfield city\tNJ\tNew Jersey\tUnion County\t48128\t33.5\t22.2\t14.4\t23963\t233308\t0.6659999999999999\t7060\tObama\t07060\t0.108580123\t7060.0\n13884\t-74.280712\t40.607762\tRahway city\tNJ\tNew Jersey\tUnion County\t27162\t39.0\t22.0\t12.9\t29379\t246284\t0.6659999999999999\t7065\tObama\t07065\t0.061279365999999995\t7065.0\n13885\t-74.36032800000001\t40.681048\tMountainside borough\tNJ\tNew Jersey\tUnion County\t6692\t47.6\t53.5\t8.0\t58675\t660626\t0.6659999999999999\t7092\tObama\t07092\t0.015097619\t7092.0\n13886\t-74.30374\t40.656461\tCranford CDP\tNJ\tNew Jersey\tUnion County\t22284\t43.3\t47.4\t8.0\t41094\t450286\t0.6659999999999999\t7016\tObama\t07016\t0.050274257999999995\t7016.0\n13887\t-74.343365\t40.651711\tWestfield town\tNJ\tNew Jersey\tUnion County\t29413\t41.5\t66.4\t7.2\t57101\t666652\t0.6659999999999999\t7090\tObama\t07090\t0.06635777799999999\t7090.0\n13888\t-74.325845\t40.69948\tSpringfield CDP\tNJ\tNew Jersey\tUnion County\t14659\t44.5\t51.9\t6.4\t46539\t476457\t0.6659999999999999\t7081\tObama\t07081\t0.033071726\t7081.0\n13889\t-74.373847\t40.63283\tScotch Plains CDP\tNJ\tNew Jersey\tUnion County\t22661\t41.2\t54.6\t8.0\t50429\t512740\t0.6659999999999999\t7076\tObama\t07076\t0.05112479599999999\t7076.0\n13890\t-74.32324200000001\t40.651302\tGarwood borough\tNJ\tNew Jersey\tUnion County\t4196\t41.2\t32.0\t7.3\t33593\t348178\t0.6659999999999999\t7027\tObama\t07027\t0.009466469\t7027.0\n13891\t-74.238452\t40.625217\tLinden city\tNJ\tNew Jersey\tUnion County\t39663\t39.3\t17.1\t11.8\t28059\t264861\t0.6659999999999999\t7036\tObama\t07036\t0.08948249300000001\t7036.0\n13892\t-74.424286\t40.676393\tBerkeley Heights CDP\tNJ\tNew Jersey\tUnion County\t13245\t42.6\t57.2\t7.6\t54603\t652157\t0.6659999999999999\t7922\tObama\t07922\t0.029881643\t7922.0\n13893\t-74.364639\t40.715529\tSummit city\tNJ\tNew Jersey\tUnion County\t21112\t39.8\t65.9\t7.9\t70749\t784564\t0.6659999999999999\t7901\tObama\t07901\t0.047630144000000006\t7901.0\n13894\t-74.269697\t40.695421\tUnion CDP\tNJ\tNew Jersey\tUnion County\t55526\t40.7\t31.4\t10.3\t31282\t322582\t0.6659999999999999\t7083\tObama\t07083\t0.125270527\t7083.0\n13895\t-74.289264\t40.678328\tKenilworth borough\tNJ\tNew Jersey\tUnion County\t7580\t41.5\t18.4\t10.6\t29690\t336821\t0.6659999999999999\t7033\tObama\t07033\t0.017101008\t7033.0\n13896\t-74.22858599999999\t40.69616\tHillside CDP\tNJ\tNew Jersey\tUnion County\t22164\t37.8\t22.4\t13.0\t28707\t237806\t0.6659999999999999\t7205\tObama\t07205\t0.050003529000000005\t7205.0\n13897\t-74.992754\t40.810269\tOxford CDP\tNJ\tNew Jersey\tWarren County\t2669\t41.1\t24.6\t16.0\t29855\t200175\t0.4141\t7863\tObama\t07863\t0.00602145\t7863.0\n13898\t-74.825688\t40.853912\tHackettstown town\tNJ\tNew Jersey\tWarren County\t10440\t36.9\t28.0\t8.4\t31535\t271157\t0.4141\t7840\tObama\t07840\t0.023553367999999998\t7840.0\n13899\t-75.157147\t40.659847\tAlpha borough\tNJ\tNew Jersey\tWarren County\t2492\t39.6\t15.4\t14.1\t26308\t205556\t0.4141\t8865\tObama\t08865\t0.005622126\t8865.0\n13900\t-74.85019\t40.822181\tBeatyestown CDP\tNJ\tNew Jersey\tWarren County\t5552\t34.1\t34.3\t8.2\t39478\t328395\t0.4141\t7840\tObama\t07840\t0.012525699\t7840.0\n13901\t-75.182053\t40.689316\tPhillipsburg town\tNJ\tNew Jersey\tWarren County\t15507\t37.8\t11.8\t14.4\t24387\t154369\t0.4141\t8865\tObama\t08865\t0.034984873\t8865.0\n13902\t-74.888626\t40.871533\tGreat Meadows-Vienna CDP\tNJ\tNew Jersey\tWarren County\t1348\t37.9\t36.5\t5.7\t34189\t365882\t0.4141\t7838\tObama\t07838\t0.003041182\t7838.0\n13903\t-75.013937\t40.762184000000005\tBrass Castle CDP\tNJ\tNew Jersey\tWarren County\t1525\t42.4\t26.9\t8.7\t37396\t326836\t0.4141\t7882\tObama\t07882\t0.003440506\t7882.0\n13904\t-74.830264\t40.91234\tAllamuchy-Panther Valley CDP\tNJ\tNew Jersey\tWarren County\t3419\t47.6\t51.8\t7.0\t56947\t322183\t0.4141\t7840\tObama\t07840\t0.007713502\t7840.0\n13905\t-75.07265100000001\t40.828668\tBelvidere town\tNJ\tNew Jersey\tWarren County\t2761\t38.3\t32.0\t12.0\t28932\t220854\t0.4141\t7823\tObama\t07823\t0.006229008\t7823.0\n13906\t-74.982726\t40.758664\tWashington borough\tNJ\tNew Jersey\tWarren County\t6806\t37.0\t27.7\t9.2\t32411\t207465\t0.4141\t7882\tObama\t07882\t0.01535481\t7882.0\n13907\t-106.37638700000001\t35.087394\tTijeras village\tNM\tNew Mexico\tBernalillo County\t563\t45.4\t40.4\t8.7\t34059\t274342\t0.5563\t87008\tObama\t87008\t0.0017990979999999998\t87008.0\n13908\t-106.454622\t35.069029\tCarnuel CDP\tNM\tNew Mexico\tBernalillo County\t865\t47.9\t23.8\t12.0\t25253\t178906\t0.5563\t87123\tObama\t87123\t0.002764156\t87123.0\n13909\t-106.64241899999999\t35.10495\tAlbuquerque city\tNM\tNew Mexico\tBernalillo County\t537328\t35.9\t32.5\t9.9\t26817\t190334\t0.5563\t87102\tObama\t87102\t1.717061648\t87102.0\n13910\t-106.38008799999999\t35.109908000000004\tCedar Crest CDP\tNM\tNew Mexico\tBernalillo County\t1423\t49.7\t52.9\t8.9\t39763\t273476\t0.5563\t87008\tObama\t87008\t0.004547275999999999\t87008.0\n13911\t-106.64855800000001\t35.162996\tLos Ranchos de Albuquerque village\tNM\tNew Mexico\tBernalillo County\t5392\t47.7\t45.5\t6.0\t44308\t355867\t0.5563\t87107\tObama\t87107\t0.017230437\t87107.0\n13912\t-106.682052\t35.009111\tSouth Valley CDP\tNM\tNew Mexico\tBernalillo County\t40438\t34.6\t11.8\t14.2\t16730\t136733\t0.5563\t87105\tObama\t87105\t0.129221889\t87105.0\n13913\t-106.233942\t34.899413\tChilili CDP\tNM\tNew Mexico\tBernalillo County\t115\t40.7\t33.3\t6.5\t28929\t210000\t0.5563\t87059\tObama\t87059\t0.00036748900000000003\t87059.0\n13914\t-106.623241\t35.172859\tNorth Valley CDP\tNM\tNew Mexico\tBernalillo County\t13246\t40.8\t21.6\t10.6\t24274\t154131\t0.5563\t87113\tObama\t87113\t0.042328332999999996\t87113.0\n13915\t-106.693294\t34.90652\tIsleta Village Proper CDP\tNM\tNew Mexico\tBernalillo County\t575\t34.5\t5.2\t15.7\t18338\t100521\t0.5563\t87022\tObama\t87022\t0.001837445\t87022.0\n13916\t-108.76141399999999\t33.708921000000004\tReserve village\tNM\tNew Mexico\tCatron County\t378\t51.5\t19.9\t7.9\t16910\t129605\t0.2638\t87830\tObama\t87830\t0.00120792\t87830.0\n13917\t-104.529726\t33.371484\tRoswell city\tNM\tNew Mexico\tChaves County\t46463\t36.2\t18.6\t11.9\t17500\t92052\t0.3254\t88201\tObama\t88201\t0.14847511300000002\t88201.0\n13918\t-104.32844300000001\t33.114496\tHagerman town\tNM\tNew Mexico\tChaves County\t1283\t33.0\t10.6\t11.8\t11882\t62917\t0.3254\t88232\tObama\t88232\t0.004099898\t88232.0\n13919\t-104.364038\t32.999418\tLake Arthur town\tNM\tNew Mexico\tChaves County\t477\t31.5\t13.3\t7.8\t12123\t63333\t0.3254\t88232\tObama\t88232\t0.00152428\t88232.0\n13920\t-104.37322900000001\t33.195510999999996\tDexter town\tNM\tNew Mexico\tChaves County\t1394\t31.2\t13.9\t8.5\t13907\t65625\t0.3254\t88230\tObama\t88230\t0.004454605\t88230.0\n13921\t-107.61716200000001\t35.066006\tAcomita Lake CDP\tNM\tNew Mexico\tCibola County\t331\t28.3\t11.2\t9.8\t13899\t58333\t0.6018\t87049\tObama\t87049\t0.0010577289999999999\t87049.0\n13922\t-108.40806699999999\t35.003235\tPinehill CDP\tNM\tNew Mexico\tCibola County\t129\t30.4\t21.6\t17.3\t8519\t47500\t0.6018\t87321\tObama\t87321\t0.000412227\t87321.0\n13923\t-107.89265800000001\t35.188759999999995\tMilan village\tNM\tNew Mexico\tCibola County\t2029\t31.3\t7.7\t10.6\t14602\t72935\t0.6018\t87020\tObama\t87020\t0.006483783000000001\t87020.0\n13924\t-107.530772\t35.042896\tSeama CDP\tNM\tNew Mexico\tCibola County\t355\t27.7\t6.8\t19.4\t10842\t104605\t0.6018\t87007\tObama\t87007\t0.001134422\t87007.0\n13925\t-107.329806\t35.013445000000004\tMesita CDP\tNM\tNew Mexico\tCibola County\t823\t32.1\t7.5\t18.9\t11019\t92667\t0.6018\t87026\tObama\t87026\t0.002629942\t87026.0\n13926\t-107.41215\t35.040085\tLaguna CDP\tNM\tNew Mexico\tCibola County\t452\t33.3\t7.7\t16.5\t11468\t68571\t0.6018\t87038\tObama\t87038\t0.0014443910000000002\t87038.0\n13927\t-107.83821499999999\t35.154908\tGrants city\tNM\tNew Mexico\tCibola County\t9153\t34.2\t15.2\t11.0\t17373\t99289\t0.6018\t87020\tObama\t87020\t0.029248923\t87020.0\n13928\t-107.364006\t35.135484000000005\tPaguate CDP\tNM\tNew Mexico\tCibola County\t501\t38.3\t8.5\t17.8\t11201\t62143\t0.6018\t87040\tObama\t87040\t0.001600973\t87040.0\n13929\t-107.469016\t35.049194\tParaje CDP\tNM\tNew Mexico\tCibola County\t720\t28.5\t6.8\t16.4\t11511\t92692\t0.6018\t87007\tObama\t87007\t0.0023008000000000004\t87007.0\n13930\t-107.43643200000001\t35.130666999999995\tEncinal CDP\tNM\tNew Mexico\tCibola County\t216\t29.2\t7.4\t15.7\t11775\t83333\t0.6018\t87040\tObama\t87040\t0.00069024\t87040.0\n13931\t-107.613972\t35.032788000000004\tSkyline-Ganipa CDP\tNM\tNew Mexico\tCibola County\t1113\t27.2\t6.1\t17.3\t9512\t69000\t0.6018\t87049\tObama\t87049\t0.0035566540000000002\t87049.0\n13932\t-107.56863\t35.063978000000006\tNorth Acomita Village CDP\tNM\tNew Mexico\tCibola County\t306\t28.4\t11.0\t9.4\t13878\t61250\t0.6018\t87049\tObama\t87049\t0.00097784\t87049.0\n13933\t-104.593154\t36.366124\tSpringer town\tNM\tNew Mexico\tColfax County\t1251\t42.2\t12.3\t6.9\t16987\t77647\t0.4906\t87747\tObama\t87747\t0.00399764\t87747.0\n13934\t-104.912668\t36.509271999999996\tCimarron village\tNM\tNew Mexico\tColfax County\t927\t41.9\t19.2\t7.0\t16637\t107317\t0.4906\t87714\tObama\t87714\t0.00296228\t87714.0\n13935\t-105.27129099999999\t36.382211\tAngel Fire village\tNM\tNew Mexico\tColfax County\t1123\t48.2\t39.0\t10.1\t27305\t250568\t0.4906\t87710\tObama\t87710\t0.0035886090000000004\t87710.0\n13936\t-104.54304599999999\t36.541088\tMaxwell village\tNM\tNew Mexico\tColfax County\t264\t39.6\t21.7\t1.6\t19450\t137500\t0.4906\t87728\tObama\t87728\t0.000843627\t87728.0\n13937\t-104.44054100000001\t36.886041999999996\tRaton city\tNM\tNew Mexico\tColfax County\t7197\t42.1\t13.4\t7.3\t19662\t105053\t0.4906\t87740\tObama\t87740\t0.022998416\t87740.0\n13938\t-105.259229\t36.549551\tEagle Nest village\tNM\tNew Mexico\tColfax County\t328\t48.2\t38.8\t10.0\t27293\t250000\t0.4906\t87718\tObama\t87718\t0.001048142\t87718.0\n13939\t-103.629456\t34.428937\tMelrose village\tNM\tNew Mexico\tCurry County\t845\t43.3\t16.8\t7.0\t16741\t66923\t0.2952\t88124\tObama\t88124\t0.002700245\t88124.0\n13940\t-103.191096\t34.437305\tClovis city\tNM\tNew Mexico\tCurry County\t34640\t34.0\t17.2\t6.9\t18982\t102306\t0.2952\t88101\tObama\t88101\t0.110694056\t88101.0\n13941\t-103.315513\t34.821488\tGrady village\tNM\tNew Mexico\tCurry County\t122\t44.4\t31.0\t1.6\t20827\t121875\t0.2952\t88120\tObama\t88120\t0.00038985800000000003\t88120.0\n13942\t-103.051324\t34.389683000000005\tTexico city\tNM\tNew Mexico\tCurry County\t1236\t38.3\t5.8\t9.5\t13662\t67097\t0.2952\t88135\tObama\t88135\t0.003949707\t88135.0\n13943\t-103.317758\t34.386575\tCannon AFB CDP\tNM\tNew Mexico\tCurry County\t1918\t22.2\t16.4\t15.8\t15154\t55000\t0.2952\t88101\tObama\t88101\t0.006129076\t88101.0\n13944\t-104.244012\t34.472876\tFort Sumner village\tNM\tNew Mexico\tDe Baca County\t1258\t49.4\t13.0\t5.9\t15730\t68000\t0.3182\t88119\tObama\t88119\t0.004020009000000001\t88119.0\n13945\t-104.379867\t34.618611\tLake Sumner CDP\tNM\tNew Mexico\tDe Baca County\t86\t44.0\t26.2\t6.7\t17327\t162500\t0.3182\t88119\tObama\t88119\t0.00027481799999999997\t88119.0\n13946\t-106.67008799999999\t31.870547\tSanta Teresa CDP\tNM\tNew Mexico\tDona Ana County\t3187\t36.6\t33.6\t5.9\t28967\t226613\t0.5591\t88008\tObama\t88008\t0.010184236999999999\t88008.0\n13947\t-106.58417800000001\t31.809323\tSunland Park city\tNM\tNew Mexico\tDona Ana County\t17357\t27.6\t3.4\t15.9\t8751\t72854\t0.5591\t88063\tObama\t88063\t0.055465263\t88063.0\n13948\t-106.65726000000001\t32.127846999999996\tVado CDP\tNM\tNew Mexico\tDona Ana County\t3776\t27.2\t5.2\t11.6\t9882\t58944\t0.5591\t88072\tObama\t88072\t0.012066418999999998\t88072.0\n13949\t-107.205157\t32.712608\tSalem CDP\tNM\tNew Mexico\tDona Ana County\t1031\t26.6\t8.3\t24.1\t9871\t70769\t0.5591\t87941\tObama\t87941\t0.003294618\t87941.0\n13950\t-106.90336299999998\t32.478770000000004\tRadium Springs CDP\tNM\tNew Mexico\tDona Ana County\t1970\t36.3\t18.7\t8.8\t17013\t129474\t0.5591\t88005\tObama\t88005\t0.006295245\t88005.0\n13951\t-106.77953600000001\t32.329251\tLas Cruces city\tNM\tNew Mexico\tDona Ana County\t89297\t32.8\t30.3\t8.1\t19699\t131504\t0.5591\t88001\tObama\t88001\t0.285353553\t88001.0\n13952\t-106.808268\t32.269477\tMesilla town\tNM\tNew Mexico\tDona Ana County\t2325\t40.9\t42.7\t7.6\t25497\t230128\t0.5591\t88003\tObama\t88003\t0.007429666999999999\t88003.0\n13953\t-106.492878\t32.383559999999996\tWhite Sands CDP\tNM\tNew Mexico\tDona Ana County\t2110\t27.3\t42.3\t13.4\t23501\t416667\t0.5591\t88002\tObama\t88002\t0.0067426230000000005\t88002.0\n13954\t-106.43796499999999\t32.045369\tChaparral CDP\tNM\tNew Mexico\tDona Ana County\t7183\t28.9\t11.8\t14.7\t12436\t79572\t0.5591\t88021\tObama\t88021\t0.022953677999999998\t88021.0\n13955\t-106.605006\t32.012916\tAnthony CDP\tNM\tNew Mexico\tDona Ana County\t9732\t25.8\t6.9\t15.3\t9126\t72523\t0.5591\t88024\tObama\t88024\t0.03109915\t88024.0\n13956\t-107.076126\t32.672919\tRincon CDP\tNM\tNew Mexico\tDona Ana County\t297\t26.9\t8.3\t21.6\t9601\t40625\t0.5591\t87941\tObama\t87941\t0.00094908\t87941.0\n13957\t-106.81853500000001\t32.395008000000004\tDona Ana CDP\tNM\tNew Mexico\tDona Ana County\t1556\t35.3\t16.6\t7.8\t13946\t97800\t0.5591\t88005\tObama\t88005\t0.004972285\t88005.0\n13958\t-107.151324\t32.668471000000004\tHatch village\tNM\tNew Mexico\tDona Ana County\t2146\t27.3\t11.2\t18.1\t11932\t73333\t0.5591\t87941\tObama\t87941\t0.006857663000000001\t87941.0\n13959\t-106.746642\t32.276994\tUniversity Park CDP\tNM\tNew Mexico\tDona Ana County\t4642\t20.8\t44.8\t9.6\t12501\t137500\t0.5591\t88003\tObama\t88003\t0.01483377\t88003.0\n13960\t-106.68865900000002\t32.166841\tMesquite CDP\tNM\tNew Mexico\tDona Ana County\t1141\t29.1\t11.9\t21.0\t12153\t42500\t0.5591\t88048\tObama\t88048\t0.003646129\t88048.0\n13961\t-104.222498\t32.448939\tCarlsbad North CDP\tNM\tNew Mexico\tEddy County\t1325\t47.2\t36.3\t2.7\t31433\t173529\t0.3188\t88220\tObama\t88220\t0.004234112\t88220.0\n13962\t-104.238407\t32.406065999999996\tCarlsbad city\tNM\tNew Mexico\tEddy County\t25131\t38.9\t15.9\t7.5\t19765\t95041\t0.3188\t88220\tObama\t88220\t0.080307515\t88220.0\n13963\t-104.430174\t32.846558\tArtesia city\tNM\tNew Mexico\tEddy County\t10883\t36.7\t13.5\t6.8\t17256\t95418\t0.3188\t88210\tObama\t88210\t0.034777235\t88210.0\n13964\t-104.73545\t32.815762\tHope village\tNM\tNew Mexico\tEddy County\t127\t36.9\t12.3\t5.3\t18002\t105000\t0.3188\t88250\tObama\t88250\t0.00040583599999999997\t88250.0\n13965\t-104.096624\t32.286427\tLoving village\tNM\tNew Mexico\tEddy County\t1452\t35.4\t6.5\t11.2\t13125\t69688\t0.3188\t88256\tObama\t88256\t0.004639947\t88256.0\n13966\t-108.13375400000001\t32.759931\tBayard city\tNM\tNew Mexico\tGrant County\t2475\t41.1\t10.4\t16.2\t12677\t91475\t0.5495\t88026\tObama\t88026\t0.007909001\t88026.0\n13967\t-108.132154\t32.698214\tHurley town\tNM\tNew Mexico\tGrant County\t1426\t39.8\t15.3\t13.7\t15424\t87593\t0.5495\t88043\tObama\t88043\t0.0045568629999999995\t88043.0\n13968\t-108.154022\t32.775599\tSanta Clara village\tNM\tNew Mexico\tGrant County\t1927\t34.3\t10.0\t21.2\t12705\t92442\t0.5495\t88026\tObama\t88026\t0.006157836\t88026.0\n13969\t-108.26975900000001\t32.778364\tSilver City town\tNM\tNew Mexico\tGrant County\t10589\t36.1\t26.5\t12.6\t18386\t130783\t0.5495\t88061\tObama\t88061\t0.033837741\t88061.0\n13970\t-105.212593\t34.607208\tVaughn town\tNM\tNew Mexico\tGuadalupe County\t459\t40.8\t10.3\t5.2\t15456\t54130\t0.6970000000000001\t88353\tObama\t88353\t0.00146676\t88353.0\n13971\t-104.680601\t34.935688\tSanta Rosa city\tNM\tNew Mexico\tGuadalupe County\t2763\t38.4\t9.6\t7.6\t14608\t90571\t0.6970000000000001\t88435\tObama\t88435\t0.008829321\t88435.0\n13972\t-104.196251\t35.945028\tRoy village\tNM\tNew Mexico\tHarding County\t285\t50.8\t18.2\t3.5\t20227\t54286\t0.4326\t87730\tObama\t87730\t0.000910733\t87730.0\n13973\t-103.952373\t35.775145\tMosquero village\tNM\tNew Mexico\tHarding County\t113\t51.9\t18.0\t3.6\t20131\t51667\t0.4326\t87733\tObama\t87733\t0.000361098\t87733.0\n13974\t-109.001503\t32.688916\tVirden village\tNM\tNew Mexico\tHidalgo County\t129\t36.3\t14.6\t6.8\t15521\t90000\t0.5142\t85534\tObama\t85534\t0.000412227\t85534.0\n13975\t-108.70255\t32.343832\tLordsburg city\tNM\tNew Mexico\tHidalgo County\t3210\t34.4\t7.4\t9.2\t13770\t65652\t0.5142\t88045\tObama\t88045\t0.010257734000000001\t88045.0\n13976\t-103.160386\t32.740108\tHobbs city\tNM\tNew Mexico\tLea County\t30736\t32.8\t13.8\t12.1\t16946\t80343\t0.2398\t88240\tObama\t88240\t0.098218605\t88240.0\n13977\t-103.3506\t32.945353999999995\tLovington city\tNM\tNew Mexico\tLea County\t9912\t32.6\t11.5\t10.9\t15300\t75204\t0.2398\t88260\tObama\t88260\t0.03167435\t88260.0\n13978\t-103.189964\t32.114875\tJal city\tNM\tNew Mexico\tLea County\t2324\t40.3\t11.4\t8.2\t16616\t45844\t0.2398\t88252\tObama\t88252\t0.007426472\t88252.0\n13979\t-103.315907\t33.255458000000004\tTatum town\tNM\tNew Mexico\tLea County\t786\t41.9\t14.1\t12.2\t16765\t50781\t0.2398\t88267\tObama\t88267\t0.002511707\t88267.0\n13980\t-103.199772\t32.442788\tEunice city\tNM\tNew Mexico\tLea County\t2998\t36.1\t11.0\t11.8\t15977\t63384\t0.2398\t88231\tObama\t88231\t0.009580277\t88231.0\n13981\t-105.60255\t33.330469\tRuidoso Downs village\tNM\tNew Mexico\tLincoln County\t2475\t39.6\t16.9\t5.0\t17397\t115487\t0.3183\t88346\tObama\t88346\t0.007909001\t88346.0\n13982\t-105.883647\t33.644014\tCarrizozo town\tNM\tNew Mexico\tLincoln County\t1183\t45.6\t12.6\t6.1\t16001\t79792\t0.3183\t88301\tObama\t88301\t0.003780343\t88301.0\n13983\t-105.598492\t33.539479\tCapitan village\tNM\tNew Mexico\tLincoln County\t1748\t46.6\t21.3\t6.9\t18858\t127778\t0.3183\t88323\tObama\t88323\t0.005585832\t88323.0\n13984\t-105.59698\t34.250069\tCorona village\tNM\tNew Mexico\tLincoln County\t186\t46.7\t21.6\t3.4\t25680\t96250\t0.3183\t88318\tObama\t88318\t0.000594373\t88318.0\n13985\t-105.66480700000001\t33.342174\tRuidoso village\tNM\tNew Mexico\tLincoln County\t8018\t51.4\t28.4\t6.0\t27153\t166901\t0.3183\t88345\tObama\t88345\t0.025621967000000002\t88345.0\n13986\t-106.28511499999999\t35.892526000000004\tLos Alamos CDP\tNM\tNew Mexico\tLos Alamos County\t12181\t43.4\t61.7\t3.4\t49201\t292311\t0.4872\t87544\tObama\t87544\t0.038925066\t87544.0\n13987\t-106.20657299999999\t35.807403\tWhite Rock CDP\tNM\tNew Mexico\tLos Alamos County\t6177\t46.2\t61.0\t2.1\t50731\t329454\t0.4872\t87544\tObama\t87544\t0.019738949\t87544.0\n13988\t-107.74476499999999\t32.257656\tDeming city\tNM\tNew Mexico\tLuna County\t14877\t37.7\t12.2\t5.9\t13915\t97908\t0.4777\t88030\tObama\t88030\t0.047540285\t88030.0\n13989\t-107.63999799999999\t31.824933\tColumbus village\tNM\tNew Mexico\tLuna County\t2221\t37.3\t12.8\t19.2\t10447\t67708\t0.4777\t88029\tObama\t88029\t0.00709733\t88029.0\n13990\t-108.485615\t35.137394\tRamah CDP\tNM\tNew Mexico\tMcKinley County\t404\t31.1\t15.6\t7.8\t12700\t90000\t0.7224\t873XX\tObama\t873XX\t0.001291005\t0.0\n13991\t-109.032125\t35.902414\tNavajo CDP\tNM\tNew Mexico\tMcKinley County\t2066\t18.4\t6.8\t34.8\t5573\t34500\t0.7224\t86504\tObama\t86504\t0.006602018\t86504.0\n13992\t-109.03487\t35.653607\tTse Bonito CDP\tNM\tNew Mexico\tMcKinley County\t261\t27.4\t5.8\t27.7\t9334\t48000\t0.7224\t86515\tObama\t86515\t0.00083404\t86515.0\n13993\t-107.64258600000001\t35.945161\tPueblo Pintado CDP\tNM\tNew Mexico\tMcKinley County\t253\t24.9\t7.2\t41.5\t5434\t19167\t0.7224\t87013\tObama\t87013\t0.000808476\t87013.0\n13994\t-108.737408\t35.518929\tGallup city\tNM\tNew Mexico\tMcKinley County\t20472\t31.2\t22.6\t10.1\t17719\t137374\t0.7224\t87317\tObama\t87317\t0.06541942\t87317.0\n13995\t-108.62999099999999\t35.526955\tChurch Rock CDP\tNM\tNew Mexico\tMcKinley County\t1133\t25.9\t3.6\t28.6\t7673\t61250\t0.7224\t87322\tObama\t87322\t0.003620565\t87322.0\n13996\t-108.750648\t35.840928999999996\tTohatchi CDP\tNM\tNew Mexico\tMcKinley County\t1045\t28.2\t27.2\t21.9\t10463\t56538\t0.7224\t87320\tObama\t87320\t0.003339356\t87320.0\n13997\t-108.223528\t35.42091\tThoreau CDP\tNM\tNew Mexico\tMcKinley County\t1921\t26.0\t12.3\t25.6\t11822\t47500\t0.7224\t87323\tObama\t87323\t0.006138663000000001\t87323.0\n13998\t-108.803987\t35.782476\tNakaibito CDP\tNM\tNew Mexico\tMcKinley County\t472\t28.1\t3.9\t32.2\t8919\t46667\t0.7224\t87320\tObama\t87320\t0.0015083020000000002\t87320.0\n13999\t-108.77093\t35.683352\tTwin Lakes CDP\tNM\tNew Mexico\tMcKinley County\t1070\t25.9\t3.4\t21.1\t10518\t40294\t0.7224\t87375\tObama\t87375\t0.003419245\t87375.0\n14000\t-108.79191599999999\t35.621668\tYah-ta-hey CDP\tNM\tNew Mexico\tMcKinley County\t614\t27.0\t8.0\t22.8\t11467\t102841\t0.7224\t87317\tObama\t87317\t0.001962071\t87317.0\n14001\t-108.149424\t35.688025\tCrownpoint CDP\tNM\tNew Mexico\tMcKinley County\t2678\t26.4\t23.7\t19.6\t10659\t45270\t0.7224\t87313\tObama\t87313\t0.008557699\t87313.0\n14002\t-108.829577\t35.60947\tRock Springs CDP\tNM\tNew Mexico\tMcKinley County\t591\t27.0\t8.0\t22.7\t11464\t102778\t0.7224\t87317\tObama\t87317\t0.0018885739999999999\t87317.0\n14003\t-108.848376\t35.07069\tZuni Pueblo CDP\tNM\tNew Mexico\tMcKinley County\t6311\t29.3\t6.7\t21.3\t8223\t84692\t0.7224\t87327\tObama\t87327\t0.020167153\t87327.0\n14004\t-108.797877\t35.08341\tBlack Rock CDP\tNM\tNew Mexico\tMcKinley County\t1230\t24.9\t15.8\t19.4\t7833\t93333\t0.7224\t87327\tObama\t87327\t0.003930534\t87327.0\n14005\t-108.632154\t35.778386\tBrimhall Nizhoni CDP\tNM\tNew Mexico\tMcKinley County\t365\t27.4\t4.2\t27.1\t9872\t47000\t0.7224\t87310\tObama\t87310\t0.001166378\t87310.0\n14006\t-104.710044\t36.00415\tWagon Mound village\tNM\tNew Mexico\tMora County\t372\t45.5\t20.8\t13.9\t15571\t91667\t0.7488\t87752\tObama\t87752\t0.001188747\t87752.0\n14007\t-105.73231000000001\t32.953081\tCloudcroft village\tNM\tNew Mexico\tOtero County\t814\t52.5\t35.8\t8.0\t23662\t179435\t0.3412\t88317\tObama\t88317\t0.002601182\t88317.0\n14008\t-105.98061499999999\t32.817642\tBoles Acres CDP\tNM\tNew Mexico\tOtero County\t1348\t37.5\t15.3\t10.4\t17740\t113782\t0.3412\t88310\tObama\t88310\t0.0043076090000000004\t88310.0\n14009\t-105.692452\t32.635942\tTimberon CDP\tNM\tNew Mexico\tOtero County\t327\t54.4\t9.9\t14.0\t16335\t90909\t0.3412\t88350\tObama\t88350\t0.001044947\t88350.0\n14010\t-106.09955900000001\t32.84823\tHolloman AFB CDP\tNM\tNew Mexico\tOtero County\t2529\t22.8\t31.4\t5.9\t16115\t47778\t0.3412\t88330\tObama\t88330\t0.008081561\t88330.0\n14011\t-105.78963\t33.144839000000005\tMescalero CDP\tNM\tNew Mexico\tOtero County\t1247\t26.7\t8.9\t14.3\t10822\t70909\t0.3412\t88340\tObama\t88340\t0.003984858\t88340.0\n14012\t-105.962795\t32.881304\tAlamogordo city\tNM\tNew Mexico\tOtero County\t35499\t35.7\t16.1\t8.5\t19093\t112727\t0.3412\t88310\tObama\t88310\t0.113439038\t88310.0\n14013\t-106.020117\t33.076737\tTularosa village\tNM\tNew Mexico\tOtero County\t2875\t41.6\t12.8\t13.4\t16750\t93623\t0.3412\t88352\tObama\t88352\t0.009187223000000001\t88352.0\n14014\t-105.93875600000001\t32.969892\tLa Luz CDP\tNM\tNew Mexico\tOtero County\t1718\t40.7\t19.6\t7.2\t19389\t112281\t0.3412\t88337\tObama\t88337\t0.005489965\t88337.0\n14015\t-103.443788\t35.361853\tLogan village\tNM\tNew Mexico\tQuay County\t1029\t48.4\t15.1\t6.8\t16787\t79737\t0.3731\t88426\tObama\t88426\t0.003288227\t88426.0\n14016\t-103.337657\t35.10941\tSan Jon village\tNM\tNew Mexico\tQuay County\t288\t48.2\t15.6\t6.9\t16771\t80556\t0.3731\t88434\tObama\t88434\t0.00092032\t88434.0\n14017\t-103.729892\t35.167772\tTucumcari city\tNM\tNew Mexico\tQuay County\t5572\t41.9\t13.6\t11.4\t16157\t71974\t0.3731\t88401\tObama\t88401\t0.017805637\t88401.0\n14018\t-103.903818\t34.674611\tHouse village\tNM\tNew Mexico\tQuay County\t72\t50.0\t21.4\t2.9\t19040\t86667\t0.3731\t88121\tObama\t88121\t0.00023008\t88121.0\n14019\t-106.093763\t35.972396\tSanta Clara Pueblo CDP\tNM\tNew Mexico\tRio Arriba County\t984\t32.6\t11.4\t7.7\t14300\t119712\t0.7472\t87532\tObama\t87532\t0.003144427\t87532.0\n14020\t-107.004799\t36.939785\tDulce CDP\tNM\tNew Mexico\tRio Arriba County\t2618\t26.0\t15.0\t14.0\t12077\t67813\t0.7472\t87528\tObama\t87528\t0.008365965\t87528.0\n14021\t-106.06916100000001\t36.050529\tSan Juan CDP\tNM\tNew Mexico\tRio Arriba County\t604\t29.6\t5.5\t11.0\t15505\t95000\t0.7472\t87566\tObama\t87566\t0.0019301160000000002\t87566.0\n14022\t-105.923377\t36.007954\tChimayo CDP\tNM\tNew Mexico\tRio Arriba County\t2990\t37.7\t15.4\t11.5\t19790\t155704\t0.7472\t87522\tObama\t87522\t0.009554712\t87522.0\n14023\t-106.05723\t36.085414\tAlcalde CDP\tNM\tNew Mexico\tRio Arriba County\t385\t33.1\t9.1\t8.6\t16970\t132353\t0.7472\t87511\tObama\t87511\t0.0012302889999999999\t87511.0\n14024\t-106.58388799999999\t36.893747999999995\tChama village\tNM\tNew Mexico\tRio Arriba County\t1225\t46.1\t19.2\t9.3\t19222\t138920\t0.7472\t87520\tObama\t87520\t0.003914556\t87520.0\n14025\t-103.578734\t34.2291\tFloyd village\tNM\tNew Mexico\tRoosevelt County\t79\t42.5\t18.2\t2.7\t16910\t125000\t0.2893\t88118\tObama\t88118\t0.000252449\t88118.0\n14026\t-103.126284\t33.866273\tCausey village\tNM\tNew Mexico\tRoosevelt County\t52\t35.6\t24.2\t4.0\t17003\t118750\t0.2893\t88113\tObama\t88113\t0.00016616900000000003\t88113.0\n14027\t-103.338994\t34.183049\tPortales city\tNM\tNew Mexico\tRoosevelt County\t11881\t27.7\t27.1\t9.5\t16025\t81273\t0.2893\t88130\tObama\t88130\t0.037966399\t88130.0\n14028\t-103.655462\t33.944301\tElida town\tNM\tNew Mexico\tRoosevelt County\t186\t42.1\t18.3\t3.4\t16850\t110000\t0.2893\t88116\tObama\t88116\t0.000594373\t88116.0\n14029\t-103.336951\t33.932588\tDora village\tNM\tNew Mexico\tRoosevelt County\t131\t36.5\t22.9\t4.8\t16873\t115625\t0.2893\t88115\tObama\t88115\t0.00041861800000000005\t88115.0\n14030\t-106.425082\t35.43379\tSan Felipe Pueblo CDP\tNM\tNew Mexico\tSandoval County\t2966\t28.0\t6.9\t22.2\t11575\t144565\t0.5036\t87001\tObama\t87001\t0.009478019\t87001.0\n14031\t-106.348578\t35.609596\tCochiti CDP\tNM\tNew Mexico\tSandoval County\t765\t36.4\t12.2\t18.0\t17255\t69231\t0.5036\t87072\tObama\t87072\t0.0024446\t87072.0\n14032\t-106.553716\t35.31223\tBernalillo town\tNM\tNew Mexico\tSandoval County\t7799\t31.9\t12.7\t12.7\t17920\t123869\t0.5036\t87004\tObama\t87004\t0.02492214\t87004.0\n14033\t-106.94541299999999\t36.19467\tRegina CDP\tNM\tNew Mexico\tSandoval County\t137\t49.6\t24.3\t10.0\t21294\t113636\t0.5036\t87027\tObama\t87027\t0.000437791\t87027.0\n14034\t-106.47324099999999\t35.379739\tAlgodones CDP\tNM\tNew Mexico\tSandoval County\t1311\t28.0\t7.0\t22.2\t11573\t143750\t0.5036\t87001\tObama\t87001\t0.004189374\t87001.0\n14035\t-106.95221599999999\t36.021306\tCuba village\tNM\tNew Mexico\tSandoval County\t798\t39.1\t16.7\t22.4\t14992\t128629\t0.5036\t87027\tObama\t87027\t0.002550054\t87027.0\n14036\t-106.463704\t35.32208\tPlacitas CDP\tNM\tNew Mexico\tSandoval County\t4706\t50.4\t52.0\t9.6\t43367\t464164\t0.5036\t87043\tObama\t87043\t0.015038286000000001\t87043.0\n14037\t-107.213277\t35.794515999999994\tTorreon CDP\tNM\tNew Mexico\tSandoval County\t448\t22.8\t3.4\t42.6\t8056\t14125\t0.5036\t87013\tObama\t87013\t0.001431609\t87013.0\n14038\t-106.52055800000001\t35.34939\tSanta Ana Pueblo CDP\tNM\tNew Mexico\tSandoval County\t726\t30.7\t3.2\t18.7\t18949\t78077\t0.5036\t87004\tObama\t87004\t0.002319974\t87004.0\n14039\t-106.691032\t35.773092\tJemez Springs village\tNM\tNew Mexico\tSandoval County\t359\t46.8\t36.7\t11.7\t28536\t292857\t0.5036\t87044\tObama\t87044\t0.001147205\t87044.0\n14040\t-106.366684\t35.517444\tSanto Domingo Pueblo CDP\tNM\tNew Mexico\tSandoval County\t3757\t27.2\t3.6\t25.9\t7993\t89694\t0.5036\t87052\tObama\t87052\t0.012005703000000001\t87052.0\n14041\t-106.94212900000001\t36.105277\tLa Jara CDP\tNM\tNew Mexico\tSandoval County\t285\t49.2\t24.1\t9.5\t21292\t112500\t0.5036\t87027\tObama\t87027\t0.000910733\t87027.0\n14042\t-106.33180700000001\t35.570802\tPena Blanca CDP\tNM\tNew Mexico\tSandoval County\t850\t28.2\t18.0\t11.9\t16476\t135142\t0.5036\t87041\tObama\t87041\t0.002716222\t87041.0\n14043\t-106.73347199999999\t35.606320000000004\tJemez Pueblo CDP\tNM\tNew Mexico\tSandoval County\t2890\t30.0\t8.6\t28.4\t11664\t78864\t0.5036\t87024\tObama\t87024\t0.009235156\t87024.0\n14044\t-106.57027\t35.256368\tPueblo of Sandia Village CDP\tNM\tNew Mexico\tSandoval County\t521\t34.1\t18.6\t15.2\t19565\t113793\t0.5036\t87048\tObama\t87048\t0.001664885\t87048.0\n14045\t-106.71463600000001\t35.519719\tZia Pueblo CDP\tNM\tNew Mexico\tSandoval County\t705\t28.3\t9.9\t14.4\t13376\t112500\t0.5036\t87053\tObama\t87053\t0.002252867\t87053.0\n14046\t-106.65163799999999\t35.652653\tPonderosa CDP\tNM\tNew Mexico\tSandoval County\t330\t43.4\t30.9\t22.5\t27710\t256667\t0.5036\t87044\tObama\t87044\t0.001054533\t87044.0\n14047\t-106.61592399999999\t35.241125\tCorrales village\tNM\tNew Mexico\tSandoval County\t9641\t46.5\t52.7\t7.7\t42013\t468349\t0.5036\t87048\tObama\t87048\t0.030808354\t87048.0\n14048\t-106.661061\t35.295795\tRio Rancho city\tNM\tNew Mexico\tSandoval County\t79964\t35.3\t26.2\t8.8\t27445\t184540\t0.5036\t87124\tObama\t87124\t0.25552943\t87124.0\n14049\t-106.7735\t35.560552\tSan Ysidro village\tNM\tNew Mexico\tSandoval County\t207\t46.6\t36.4\t11.7\t28530\t290000\t0.5036\t87053\tObama\t87053\t0.00066148\t87053.0\n14050\t-109.00407\t36.833348\tBeclabito CDP\tNM\tNew Mexico\tSan Juan County\t415\t31.3\t0.0\t35.3\t8944\t42500\t0.3429\t86514\tObama\t86514\t0.001326156\t86514.0\n14051\t-107.980754\t36.824498\tAztec city\tNM\tNew Mexico\tSan Juan County\t6501\t34.0\t16.4\t9.2\t19405\t128579\t0.3429\t87410\tObama\t87410\t0.020774308999999998\t87410.0\n14052\t-108.990248\t36.029214\tCrystal CDP\tNM\tNew Mexico\tSan Juan County\t392\t31.7\t11.1\t34.2\t9383\t50000\t0.3429\t87328\tObama\t87328\t0.001252658\t87328.0\n14053\t-108.68038999999999\t36.063052\tNaschitti CDP\tNM\tNew Mexico\tSan Juan County\t434\t28.6\t5.8\t25.4\t9169\t52143\t0.3429\t87325\tObama\t87325\t0.001386871\t87325.0\n14054\t-108.08051200000001\t36.799375\tFlora Vista CDP\tNM\tNew Mexico\tSan Juan County\t1520\t40.1\t17.1\t4.0\t22032\t188043\t0.3429\t87415\tObama\t87415\t0.004857245\t87415.0\n14055\t-108.217905\t36.651934000000004\tNapi HQ CDP\tNM\tNew Mexico\tSan Juan County\t857\t25.8\t6.6\t21.6\t7575\t71250\t0.3429\t87401\tObama\t87401\t0.002738591\t87401.0\n14056\t-108.69786200000001\t36.791896\tShiprock CDP\tNM\tNew Mexico\tSan Juan County\t9874\t26.4\t7.9\t21.1\t10205\t54623\t0.3429\t87420\tObama\t87420\t0.031552919\t87420.0\n14057\t-108.425053\t36.735115\tNenahnezad CDP\tNM\tNew Mexico\tSan Juan County\t889\t26.4\t2.2\t31.5\t8864\t56731\t0.3429\t87417\tObama\t87417\t0.0028408490000000003\t87417.0\n14058\t-107.97904199999999\t36.712973999999996\tBloomfield city\tNM\tNew Mexico\tSan Juan County\t6937\t32.5\t11.0\t10.8\t18238\t113705\t0.3429\t87410\tObama\t87410\t0.022167571\t87410.0\n14059\t-107.74734199999999\t36.24949\tNageezi CDP\tNM\tNew Mexico\tSan Juan County\t364\t28.0\t2.5\t36.0\t8098\t32500\t0.3429\t87037\tObama\t87037\t0.001163182\t87037.0\n14060\t-108.69044099999999\t36.15618\tSheep Springs CDP\tNM\tNew Mexico\tSan Juan County\t286\t26.5\t3.3\t32.6\t6905\t35000\t0.3429\t87364\tObama\t87364\t0.000913929\t87364.0\n14061\t-108.323196\t36.72038\tUpper Fruitland CDP\tNM\tNew Mexico\tSan Juan County\t2031\t23.6\t5.6\t23.9\t9955\t59091\t0.3429\t87417\tObama\t87417\t0.0064901740000000005\t87417.0\n14062\t-108.37069\t36.694089\tOjo Amarillo CDP\tNM\tNew Mexico\tSan Juan County\t1012\t23.5\t5.8\t24.0\t9955\t59444\t0.3429\t87417\tObama\t87417\t0.0032339029999999998\t87417.0\n14063\t-108.029202\t36.528534\tHuerfano CDP\tNM\tNew Mexico\tSan Juan County\t126\t25.6\t6.3\t21.3\t7581\t80000\t0.3429\t87413\tObama\t87413\t0.00040264\t87413.0\n14064\t-108.87316399999999\t36.432628\tSanostee CDP\tNM\tNew Mexico\tSan Juan County\t510\t29.2\t4.5\t28.0\t7944\t20000\t0.3429\t87461\tObama\t87461\t0.001629733\t87461.0\n14065\t-108.35485700000001\t36.744088\tKirtland CDP\tNM\tNew Mexico\tSan Juan County\t7582\t28.7\t15.1\t11.2\t19702\t118366\t0.3429\t87417\tObama\t87417\t0.024228705\t87417.0\n14066\t-108.70831100000001\t36.28334\tNewcomb CDP\tNM\tNew Mexico\tSan Juan County\t470\t33.3\t14.4\t33.1\t9754\t31000\t0.3429\t87455\tObama\t87455\t0.001501911\t87455.0\n14067\t-108.18125800000001\t36.758272\tFarmington city\tNM\tNew Mexico\tSan Juan County\t41318\t35.2\t20.9\t9.2\t22871\t156163\t0.3429\t874HH\tObama\t874HH\t0.132033978\t0.0\n14068\t-105.220526\t35.600225\tLas Vegas city\tNM\tNew Mexico\tSan Miguel County\t13727\t35.0\t25.2\t12.3\t16929\t123125\t0.769\t87701\tObama\t87701\t0.043865395999999994\t87701.0\n14069\t-105.6787\t35.575452\tPecos village\tNM\tNew Mexico\tSan Miguel County\t1525\t33.4\t15.6\t8.6\t16071\t145336\t0.769\t87552\tObama\t87552\t0.004873223\t87552.0\n14070\t-106.05208799999998\t36.007233\tEspanola city\tNM\tNew Mexico\tSanta Fe County\t9496\t35.4\t18.1\t10.4\t19239\t152537\t0.7347\t87567\tObama\t87567\t0.030344998999999998\t87567.0\n14071\t-106.008721\t35.869013\tCuyamungue CDP\tNM\tNew Mexico\tSanta Fe County\t428\t37.9\t22.3\t4.7\t25487\t270833\t0.7347\t87501\tObama\t87501\t0.0013676979999999999\t87501.0\n14072\t-105.89691599999999\t35.956222\tCundiyo CDP\tNM\tNew Mexico\tSanta Fe County\t104\t39.2\t28.2\t8.3\t24847\t206250\t0.7347\t87522\tObama\t87522\t0.00033233800000000006\t87522.0\n14073\t-106.177912\t35.056855\tEdgewood town\tNM\tNew Mexico\tSanta Fe County\t2620\t36.3\t28.7\t8.1\t28541\t196603\t0.7347\t87015\tObama\t87015\t0.008372356\t87015.0\n14074\t-106.026132\t35.952728\tEl Valle de Arroyo Seco CDP\tNM\tNew Mexico\tSanta Fe County\t1255\t36.8\t25.3\t9.2\t23840\t192857\t0.7347\t87567\tObama\t87567\t0.004010423\t87567.0\n14075\t-106.03530500000001\t35.980373\tSombrillo CDP\tNM\tNew Mexico\tSanta Fe County\t540\t36.5\t21.5\t13.7\t22446\t153409\t0.7347\t87567\tObama\t87567\t0.0017256\t87567.0\n14076\t-105.915195\t35.750506\tTesuque CDP\tNM\tNew Mexico\tSanta Fe County\t912\t51.8\t52.0\t7.0\t49631\t576389\t0.7347\t87501\tObama\t87501\t0.0029143470000000003\t87501.0\n14077\t-106.036106\t35.994075\tSanta Cruz CDP\tNM\tNew Mexico\tSanta Fe County\t442\t36.3\t23.8\t12.6\t22265\t169444\t0.7347\t87567\tObama\t87567\t0.001412436\t87567.0\n14078\t-105.887271\t35.998393\tRio Chiquito CDP\tNM\tNew Mexico\tSanta Fe County\t112\t38.8\t28.6\t7.7\t24995\t216667\t0.7347\t87522\tObama\t87522\t0.00035790199999999995\t87522.0\n14079\t-106.019678\t35.992861\tCuartelez CDP\tNM\tNew Mexico\tSanta Fe County\t495\t33.4\t20.3\t11.2\t21882\t153125\t0.7347\t87567\tObama\t87567\t0.0015818\t87567.0\n14080\t-105.934219\t35.527291999999996\tEldorado at Santa Fe CDP\tNM\tNew Mexico\tSanta Fe County\t6686\t49.3\t62.9\t5.1\t41051\t368489\t0.7347\t87540\tObama\t87540\t0.021365487000000002\t87540.0\n14081\t-106.012672\t35.657485\tAgua Fria CDP\tNM\tNew Mexico\tSanta Fe County\t2412\t33.3\t23.8\t10.4\t19563\t114352\t0.7347\t87505\tObama\t87505\t0.007707681\t87505.0\n14082\t-106.08798600000001\t35.894462\tEl Rancho CDP\tNM\tNew Mexico\tSanta Fe County\t867\t39.2\t26.9\t5.9\t23577\t271000\t0.7347\t87532\tObama\t87532\t0.002770547\t87532.0\n14083\t-105.75223899999999\t35.577531\tGlorieta CDP\tNM\tNew Mexico\tSanta Fe County\t941\t43.5\t41.7\t9.6\t27876\t215086\t0.7347\t87562\tObama\t87562\t0.0030070179999999998\t87562.0\n14084\t-105.956584\t35.676217\tSanta Fe city\tNM\tNew Mexico\tSanta Fe County\t70482\t41.8\t41.6\t7.6\t30879\t282643\t0.7347\t87505\tObama\t87505\t0.22522916899999998\t87505.0\n14085\t-106.10961200000001\t35.584869\tLa Cienega CDP\tNM\tNew Mexico\tSanta Fe County\t3076\t34.8\t29.7\t9.9\t21899\t263400\t0.7347\t87505\tObama\t87505\t0.00982953\t87505.0\n14086\t-105.918714\t35.817057\tChupadero CDP\tNM\tNew Mexico\tSanta Fe County\t366\t50.8\t44.9\t10.6\t34923\t381818\t0.7347\t87501\tObama\t87501\t0.001169573\t87501.0\n14087\t-106.12426\t35.895286\tSan Ildefonso Pueblo CDP\tNM\tNew Mexico\tSanta Fe County\t497\t34.4\t18.8\t16.4\t17828\t117045\t0.7347\t87532\tObama\t87532\t0.001588191\t87532.0\n14088\t-106.165256\t35.168392\tCedar Grove CDP\tNM\tNew Mexico\tSanta Fe County\t700\t44.6\t42.6\t9.8\t29959\t223387\t0.7347\t87015\tObama\t87015\t0.002236889\t87015.0\n14089\t-106.006049\t35.890937\tPojoaque CDP\tNM\tNew Mexico\tSanta Fe County\t1152\t33.3\t19.3\t6.9\t21680\t49483\t0.7347\t87567\tObama\t87567\t0.00368128\t87567.0\n14090\t-106.12956100000001\t35.436638\tLos Cerrillos CDP\tNM\tNew Mexico\tSanta Fe County\t271\t45.1\t45.2\t11.9\t30673\t240000\t0.7347\t87010\tObama\t87010\t0.0008659960000000001\t87010.0\n14091\t-105.903457\t35.821973\tRio en Medio CDP\tNM\tNew Mexico\tSanta Fe County\t151\t51.2\t44.9\t10.6\t34858\t450000\t0.7347\t87501\tObama\t87501\t0.00048252900000000004\t87501.0\n14092\t-106.033624\t35.892763\tJaconita CDP\tNM\tNew Mexico\tSanta Fe County\t320\t41.3\t38.0\t4.6\t31727\t290385\t0.7347\t87567\tObama\t87567\t0.0010225780000000001\t87567.0\n14093\t-106.001604\t35.989995\tLa Puebla CDP\tNM\tNew Mexico\tSanta Fe County\t1420\t33.3\t20.3\t11.1\t21949\t154891\t0.7347\t87567\tObama\t87567\t0.004537689\t87567.0\n14094\t-106.153705\t35.402665999999996\tMadrid CDP\tNM\tNew Mexico\tSanta Fe County\t174\t44.3\t42.5\t10.1\t29969\t227273\t0.7347\t87010\tObama\t87010\t0.000556027\t87010.0\n14095\t-105.88266599999999\t35.485089\tLamy CDP\tNM\tNew Mexico\tSanta Fe County\t151\t48.3\t64.2\t4.7\t46595\t455000\t0.7347\t87540\tObama\t87540\t0.00048252900000000004\t87540.0\n14096\t-105.95671000000002\t35.394996\tGalisteo CDP\tNM\tNew Mexico\tSanta Fe County\t307\t44.4\t41.7\t8.1\t27361\t214706\t0.7347\t87540\tObama\t87540\t0.000981036\t87540.0\n14097\t-105.858296\t35.588051\tCanada de los Alamos CDP\tNM\tNew Mexico\tSanta Fe County\t369\t47.9\t54.8\t6.1\t42787\t492308\t0.7347\t87505\tObama\t87505\t0.00117916\t87505.0\n14098\t-107.295864\t33.115777\tWilliamsburg village\tNM\tNew Mexico\tSierra County\t509\t54.2\t9.3\t7.0\t17781\t70313\t0.3849\t879HH\tObama\t879HH\t0.0016265379999999999\t0.0\n14099\t-107.22341399999999\t33.185544\tElephant Butte city\tNM\tNew Mexico\tSierra County\t1391\t59.3\t17.3\t5.9\t22186\t145508\t0.3849\t87935\tObama\t87935\t0.004445018\t87935.0\n14100\t-107.247918\t33.135513\tTruth or Consequences city\tNM\tNew Mexico\tSierra County\t7215\t53.1\t14.3\t9.5\t17484\t81310\t0.3849\t879HH\tObama\t879HH\t0.023055936000000003\t0.0\n14101\t-106.90661399999999\t34.054404999999996\tSocorro city\tNM\tNew Mexico\tSocorro County\t8782\t31.3\t26.6\t7.8\t17610\t120872\t0.5642\t87823\tObama\t87823\t0.028063372000000003\t87823.0\n14102\t-107.513324\t34.4192\tAlamo CDP\tNM\tNew Mexico\tSocorro County\t1270\t23.5\t5.2\t39.2\t5386\t59167\t0.5642\t87825\tObama\t87825\t0.004058356\t87825.0\n14103\t-107.23181899999999\t34.109531\tMagdalena village\tNM\tNew Mexico\tSocorro County\t955\t44.4\t21.0\t12.8\t13986\t85000\t0.5642\t87825\tObama\t87825\t0.0030517559999999997\t87825.0\n14104\t-105.416569\t36.704086\tRed River town\tNM\tNew Mexico\tTaos County\t551\t46.6\t38.1\t5.5\t27636\t234146\t0.7809\t87558\tObama\t87558\t0.001760751\t87558.0\n14105\t-105.43949599999999\t36.590329\tTaos Ski Valley village\tNM\tNew Mexico\tTaos County\t64\t43.0\t37.0\t9.8\t24684\t358333\t0.7809\t87525\tObama\t87525\t0.000204516\t87525.0\n14106\t-105.713264\t36.19943\tPicuris Pueblo CDP\tNM\tNew Mexico\tTaos County\t93\t40.8\t16.1\t10.0\t13397\t122500\t0.7809\t87553\tObama\t87553\t0.000297187\t87553.0\n14107\t-105.593528\t36.711372\tQuesta village\tNM\tNew Mexico\tTaos County\t2099\t42.6\t16.6\t16.2\t15669\t142385\t0.7809\t87556\tObama\t87556\t0.006707472\t87556.0\n14108\t-105.690817\t36.1703\tPenasco CDP\tNM\tNew Mexico\tTaos County\t615\t38.3\t18.1\t8.4\t12984\t137500\t0.7809\t87553\tObama\t87553\t0.001965267\t87553.0\n14109\t-105.56343400000002\t36.465495000000004\tTaos Pueblo CDP\tNM\tNew Mexico\tTaos County\t1380\t40.8\t9.0\t14.6\t14330\t115086\t0.7809\t87529\tObama\t87529\t0.0044098670000000005\t87529.0\n14110\t-105.57929299999999\t36.387364\tTaos town\tNM\tNew Mexico\tTaos County\t4601\t44.5\t29.8\t9.1\t19556\t228792\t0.7809\t87571\tObama\t87571\t0.014702753\t87571.0\n14111\t-105.60198500000001\t36.363232\tRanchos de Taos CDP\tNM\tNew Mexico\tTaos County\t2482\t42.2\t29.0\t9.3\t20566\t216522\t0.7809\t87571\tObama\t87571\t0.00793137\t87571.0\n14112\t-105.675201\t36.192875\tVadito CDP\tNM\tNew Mexico\tTaos County\t260\t38.0\t18.4\t8.6\t12972\t140000\t0.7809\t87553\tObama\t87553\t0.000830845\t87553.0\n14113\t-105.746113\t36.172652\tChamisal CDP\tNM\tNew Mexico\tTaos County\t329\t43.5\t14.3\t12.4\t13815\t112500\t0.7809\t87553\tObama\t87553\t0.001051338\t87553.0\n14114\t-105.72005700000001\t36.192114000000004\tRio Lucio CDP\tNM\tNew Mexico\tTaos County\t414\t43.1\t14.5\t12.0\t13822\t111310\t0.7809\t87553\tObama\t87553\t0.00132296\t87553.0\n14115\t-106.368338\t34.643491999999995\tManzano CDP\tNM\tNew Mexico\tTorrance County\t54\t42.5\t13.9\t9.5\t18359\t150000\t0.3793\t87061\tObama\t87061\t0.00017256\t87061.0\n14116\t-106.035022\t34.59415\tWillard village\tNM\tNew Mexico\tTorrance County\t224\t43.3\t7.4\t11.0\t14356\t58750\t0.3793\t87063\tObama\t87063\t0.000715805\t87063.0\n14117\t-106.039002\t35.003349\tMoriarty city\tNM\tNew Mexico\tTorrance County\t1682\t35.1\t16.5\t9.2\t16263\t105425\t0.3793\t87035\tObama\t87035\t0.005374925\t87035.0\n14118\t-106.30115500000001\t34.724195\tTorreon CDP\tNM\tNew Mexico\tTorrance County\t243\t41.3\t14.2\t10.6\t18432\t125000\t0.3793\t87061\tObama\t87061\t0.00077652\t87061.0\n14119\t-106.031292\t34.766953\tEstancia town\tNM\tNew Mexico\tTorrance County\t1545\t36.6\t10.8\t13.1\t14996\t83966\t0.3793\t87016\tObama\t87016\t0.004937134\t87016.0\n14120\t-106.301147\t34.760089\tTajique CDP\tNM\tNew Mexico\tTorrance County\t147\t41.7\t14.3\t10.5\t18486\t143750\t0.3793\t87061\tObama\t87061\t0.00046974699999999996\t87061.0\n14121\t-106.242888\t34.519758\tMountainair town\tNM\tNew Mexico\tTorrance County\t998\t35.5\t14.1\t12.8\t13443\t69808\t0.3793\t87036\tObama\t87036\t0.003189165\t87036.0\n14122\t-105.458593\t34.651828\tEncino village\tNM\tNew Mexico\tTorrance County\t81\t50.6\t11.1\t6.5\t14456\t60000\t0.3793\t88321\tObama\t88321\t0.00025884\t88321.0\n14123\t-103.836161\t36.762386\tDes Moines village\tNM\tNew Mexico\tUnion County\t157\t42.2\t13.1\t1.2\t16692\t91667\t0.2683\t88418\tObama\t88418\t0.0005017019999999999\t88418.0\n14124\t-103.918645\t36.848156\tFolsom village\tNM\tNew Mexico\tUnion County\t67\t42.5\t14.9\t0.0\t16587\t87500\t0.2683\t88414\tObama\t88414\t0.000214102\t88414.0\n14125\t-103.175512\t36.449757\tClayton town\tNM\tNew Mexico\tUnion County\t2474\t41.9\t13.1\t6.2\t17584\t76774\t0.2683\t88415\tObama\t88415\t0.007905805\t88415.0\n14126\t-103.613488\t36.593096\tGrenville village\tNM\tNew Mexico\tUnion County\t22\t37.5\t12.5\t0.0\t16805\t75000\t0.2683\t88424\tObama\t88424\t7.03e-05\t88424.0\n14127\t-106.766605\t34.602871\tJarales CDP\tNM\tNew Mexico\tValencia County\t1702\t41.6\t11.7\t11.9\t16679\t126786\t0.4873\t87023\tObama\t87023\t0.005438836\t87023.0\n14128\t-106.72341899999999\t34.733538\tTome-Adelino CDP\tNM\tNew Mexico\tValencia County\t2263\t38.9\t16.9\t13.0\t17837\t154276\t0.4873\t87060\tObama\t87060\t0.007231543000000001\t87060.0\n14129\t-106.74683799999998\t34.582423\tCasa Colorada CDP\tNM\tNew Mexico\tValencia County\t58\t36.9\t10.5\t16.0\t19340\t133333\t0.4873\t87023\tObama\t87023\t0.00018534200000000002\t87023.0\n14130\t-106.781365\t34.658707\tBelen city\tNM\tNew Mexico\tValencia County\t7185\t35.2\t14.4\t12.4\t17202\t113047\t0.4873\t87002\tObama\t87002\t0.022960069\t87002.0\n14131\t-106.64365600000001\t34.762381\tEl Cerro-Monterey Park CDP\tNM\tNew Mexico\tValencia County\t6080\t24.8\t5.0\t17.6\t10773\t86310\t0.4873\t87031\tObama\t87031\t0.01942898\t87031.0\n14132\t-106.688452\t34.827511\tPeralta CDP\tNM\tNew Mexico\tValencia County\t4076\t38.6\t20.7\t9.0\t19415\t149818\t0.4873\t87042\tObama\t87042\t0.013025086000000002\t87042.0\n14133\t-106.58406200000002\t34.801427000000004\tMeadow Lake CDP\tNM\tNew Mexico\tValencia County\t4854\t27.4\t5.1\t14.8\t13451\t83481\t0.4873\t87042\tObama\t87042\t0.015511228\t87042.0\n14134\t-106.70101100000001\t34.853904\tBosque Farms village\tNM\tNew Mexico\tValencia County\t4032\t45.4\t25.6\t9.5\t22569\t197984\t0.4873\t87068\tObama\t87068\t0.012884481000000001\t87068.0\n14135\t-106.755342\t34.659127000000005\tLos Trujillos-Gabaldon CDP\tNM\tNew Mexico\tValencia County\t2188\t38.1\t9.5\t13.9\t17442\t117914\t0.4873\t87002\tObama\t87002\t0.006991876\t87002.0\n14136\t-106.690926\t34.792858\tValencia CDP\tNM\tNew Mexico\tValencia County\t4400\t38.6\t20.6\t11.7\t19733\t166162\t0.4873\t87031\tObama\t87031\t0.014060446\t87031.0\n14137\t-106.756121\t34.810466999999996\tLos Lunas village\tNM\tNew Mexico\tValencia County\t13729\t31.4\t20.0\t8.5\t19517\t146586\t0.4873\t87031\tObama\t87031\t0.043871787\t87031.0\n14138\t-106.716407\t34.641668\tRio Communities CDP\tNM\tNew Mexico\tValencia County\t4459\t46.9\t21.9\t9.3\t22109\t142605\t0.4873\t87002\tObama\t87002\t0.014248984\t87002.0\n14139\t-106.763093\t34.733323\tLos Chaves CDP\tNM\tNew Mexico\tValencia County\t5643\t36.7\t13.0\t11.2\t18817\t145019\t0.4873\t87060\tObama\t87060\t0.018032522\t87060.0\n14140\t-106.687316\t34.73299\tRio Communities North CDP\tNM\tNew Mexico\tValencia County\t1779\t32.2\t22.0\t11.4\t25420\t159951\t0.4873\t87060\tObama\t87060\t0.005684894\t87060.0\n14141\t-73.798512\t42.666409\tAlbany city\tNY\tNew York\tAlbany County\t93580\t32.9\t37.2\t8.8\t24133\t172847\t0.6449\t12208\tObama\t12208\t0.17190134899999998\t12208.0\n14142\t-73.72697099999999\t42.691265\tMenands village\tNY\tNew York\tAlbany County\t3825\t45.8\t48.2\t8.1\t43271\t204762\t0.6449\t12204\tObama\t12204\t0.0070263159999999995\t12204.0\n14143\t-73.935357\t42.651661\tVoorheesville village\tNY\tNew York\tAlbany County\t2773\t45.7\t44.2\t5.5\t32152\t207510\t0.6449\t12186\tObama\t12186\t0.00509385\t12186.0\n14144\t-74.122477\t42.439181\tMedusa CDP\tNY\tNew York\tAlbany County\t344\t48.0\t18.4\t7.7\t22274\t174405\t0.6449\t12120\tObama\t12120\t0.000631909\t12120.0\n14145\t-73.706828\t42.724342\tWatervliet city\tNY\tNew York\tAlbany County\t10248\t36.4\t17.8\t6.9\t24989\t156118\t0.6449\t12189\tObama\t12189\t0.018825016\t12189.0\n14146\t-74.033866\t42.704985\tAltamont village\tNY\tNew York\tAlbany County\t1708\t39.5\t45.1\t5.4\t26848\t228899\t0.6449\t12009\tObama\t12009\t0.003137503\t12009.0\n14147\t-74.22876\t42.433040000000005\tPreston-Potter Hollow CDP\tNY\tNew York\tAlbany County\t341\t47.5\t19.0\t7.7\t22455\t173913\t0.6449\t12469\tObama\t12469\t0.000626398\t12469.0\n14148\t-73.833602\t42.720273\tColonie village\tNY\tNew York\tAlbany County\t7836\t44.4\t30.1\t7.3\t31944\t184175\t0.6449\t12205\tObama\t12205\t0.014394303999999998\t12205.0\n14149\t-73.707713\t42.773185999999995\tCohoes city\tNY\tNew York\tAlbany County\t16233\t39.5\t18.2\t6.7\t25089\t155539\t0.6449\t12047\tObama\t12047\t0.029819134\t12047.0\n14150\t-73.833049\t42.624990999999994\tDelmar CDP\tNY\tNew York\tAlbany County\t8200\t46.1\t63.7\t4.2\t40504\t255895\t0.6449\t12054\tObama\t12054\t0.015062952\t12054.0\n14151\t-73.874475\t42.688340999999994\tWestmere CDP\tNY\tNew York\tAlbany County\t7238\t43.1\t48.5\t4.3\t37597\t210610\t0.6449\t12084\tObama\t12084\t0.013295811000000001\t12084.0\n14152\t-73.812092\t42.476690000000005\tRavena village\tNY\tNew York\tAlbany County\t3248\t37.5\t21.1\t6.8\t29289\t165497\t0.6449\t12045\tObama\t12045\t0.005966399\t12045.0\n14153\t-73.692456\t42.747405\tGreen Island village\tNY\tNew York\tAlbany County\t2573\t38.7\t13.6\t5.7\t24833\t151339\t0.6449\t12183\tObama\t12183\t0.00472646\t12183.0\n14154\t-73.796378\t42.474165\tCoeymans CDP\tNY\tNew York\tAlbany County\t810\t34.5\t17.4\t5.5\t24836\t179545\t0.6449\t12045\tObama\t12045\t0.001487926\t12045.0\n14155\t-78.141665\t42.205658\tFriendship CDP\tNY\tNew York\tAllegany County\t1095\t40.0\t15.6\t11.4\t15722\t74194\t0.3621\t14739\tObama\t14739\t0.002011455\t14739.0\n14156\t-77.945774\t42.12086\tWellsville village\tNY\tNew York\tAllegany County\t4927\t42.7\t25.2\t9.5\t21803\t91132\t0.3621\t14895\tObama\t14895\t0.00905063\t14895.0\n14157\t-78.156538\t42.088932\tRichburg village\tNY\tNew York\tAllegany County\t428\t38.5\t11.1\t13.1\t17438\t70000\t0.3621\t14715\tObama\t14715\t0.000786213\t14715.0\n14158\t-77.73360100000001\t42.321464\tAlmond village\tNY\tNew York\tAllegany County\t450\t42.3\t36.3\t8.2\t22438\t119079\t0.3621\t14803\tObama\t14803\t0.000826625\t14803.0\n14159\t-77.77734699999999\t42.463352\tCanaseraga village\tNY\tNew York\tAllegany County\t564\t41.5\t15.4\t9.8\t17086\t88684\t0.3621\t14822\tObama\t14822\t0.001036037\t14822.0\n14160\t-78.020689\t42.3055\tAngelica village\tNY\tNew York\tAllegany County\t897\t41.7\t17.4\t9.9\t17814\t86731\t0.3621\t14709\tObama\t14709\t0.00164774\t14709.0\n14161\t-77.79553299999999\t42.157499\tAndover village\tNY\tNew York\tAllegany County\t957\t39.5\t21.1\t7.8\t20407\t87679\t0.3621\t14806\tObama\t14806\t0.001757957\t14806.0\n14162\t-77.912599\t42.074334\tStannards CDP\tNY\tNew York\tAllegany County\t841\t42.6\t20.2\t9.3\t17390\t84833\t0.3621\t14895\tObama\t14895\t0.001544871\t14895.0\n14163\t-78.03275500000001\t42.222608\tBelmont village\tNY\tNew York\tAllegany County\t888\t40.7\t15.9\t11.4\t17071\t78571\t0.3621\t14813\tObama\t14813\t0.0016312070000000002\t14813.0\n14164\t-78.161428\t42.427665000000005\tHoughton CDP\tNY\tNew York\tAllegany County\t1843\t23.6\t53.4\t6.4\t17951\t132143\t0.3621\t14744\tObama\t14744\t0.00338549\t14744.0\n14165\t-77.789597\t42.254303\tAlfred village\tNY\tNew York\tAllegany County\t4253\t21.6\t56.7\t7.5\t18871\t151744\t0.3621\t14802\tObama\t14802\t0.007812529\t14802.0\n14166\t-78.16655\t42.068999\tBolivar village\tNY\tNew York\tAllegany County\t1116\t33.4\t13.1\t13.4\t17270\t73485\t0.3621\t14715\tObama\t14715\t0.002050031\t14715.0\n14167\t-78.275316\t42.218309000000005\tCuba village\tNY\tNew York\tAllegany County\t1535\t39.7\t28.2\t9.4\t22919\t91707\t0.3621\t14727\tObama\t14727\t0.002819711\t14727.0\n14168\t-76.021893\t42.118268\tEndwell CDP\tNY\tNew York\tBroome County\t11276\t45.6\t36.5\t8.0\t28230\t150023\t0.5146\t13760\tObama\t13760\t0.020713396000000002\t13760.0\n14169\t-75.967691\t42.330059999999996\tWhitney Point village\tNY\tNew York\tBroome County\t1046\t37.2\t22.0\t6.2\t22088\t105833\t0.5146\t13862\tObama\t13862\t0.001921445\t13862.0\n14170\t-75.415716\t42.063832\tDeposit village\tNY\tNew York\tBroome County\t1666\t40.8\t11.6\t10.7\t20047\t103409\t0.5146\t13754\tObama\t13754\t0.003060351\t13754.0\n14171\t-75.962478\t42.123133\tJohnson City village\tNY\tNew York\tBroome County\t14982\t40.9\t25.3\t8.9\t23259\t116422\t0.5146\t13790\tObama\t13790\t0.027521116\t13790.0\n14172\t-76.064037\t42.097896999999996\tEndicott village\tNY\tNew York\tBroome County\t12158\t39.2\t22.0\t9.6\t20834\t124813\t0.5146\t13760\tObama\t13760\t0.022333582\t13760.0\n14173\t-76.005514\t42.349043\tLisle village\tNY\tNew York\tBroome County\t315\t36.9\t14.5\t11.1\t17011\t97000\t0.5146\t13797\tObama\t13797\t0.000578638\t13797.0\n14174\t-75.909244\t42.101501\tBinghamton city\tNY\tNew York\tBroome County\t45570\t38.0\t26.3\t10.7\t21149\t120900\t0.5146\t139HH\tObama\t139HH\t0.083709601\t0.0\n14175\t-75.893553\t42.136342\tPort Dickinson village\tNY\tNew York\tBroome County\t1604\t39.5\t30.3\t7.1\t21819\t135636\t0.5146\t13901\tObama\t13901\t0.00294646\t13901.0\n14176\t-75.64054200000001\t42.077585\tWindsor village\tNY\tNew York\tBroome County\t901\t39.0\t18.6\t9.0\t23228\t129167\t0.5146\t13865\tObama\t13865\t0.0016550879999999999\t13865.0\n14177\t-79.050999\t42.362838\tSouth Dayton village\tNY\tNew York\tCattaraugus County\t591\t36.6\t17.3\t11.5\t16248\t89333\t0.4249\t14138\tObama\t14138\t0.001085635\t14138.0\n14178\t-78.672178\t42.274605\tEllicottville village\tNY\tNew York\tCattaraugus County\t453\t50.1\t33.6\t7.1\t27892\t186607\t0.4249\t14731\tObama\t14731\t0.000832136\t14731.0\n14179\t-78.632459\t42.022859999999994\tLimestone village\tNY\tNew York\tCattaraugus County\t434\t42.1\t9.5\t11.4\t19562\t75909\t0.4249\t14753\tObama\t14753\t0.000797234\t14753.0\n14180\t-78.479157\t42.491231\tDelevan village\tNY\tNew York\tCattaraugus County\t1062\t37.2\t8.5\t6.7\t19245\t101844\t0.4249\t14042\tObama\t14042\t0.001950836\t14042.0\n14181\t-78.337304\t42.036681\tPortville village\tNY\tNew York\tCattaraugus County\t989\t42.6\t20.1\t7.4\t21503\t98704\t0.4249\t14770\tObama\t14770\t0.001816739\t14770.0\n14182\t-78.93310699999999\t42.469825\tGowanda village\tNY\tNew York\tCattaraugus County\t2679\t43.1\t22.3\t10.8\t20934\t93101\t0.4249\t14070\tObama\t14070\t0.0049211770000000005\t14070.0\n14183\t-78.72332\t42.163113\tSalamanca city\tNY\tNew York\tCattaraugus County\t5743\t37.7\t14.3\t12.1\t16220\t72781\t0.4249\t14779\tObama\t14779\t0.010549577\t14779.0\n14184\t-78.867316\t42.330023\tCattaraugus village\tNY\tNew York\tCattaraugus County\t1016\t37.8\t21.9\t8.6\t18364\t96538\t0.4249\t14719\tObama\t14719\t0.001866337\t14719.0\n14185\t-78.798757\t42.249369\tLittle Valley village\tNY\tNew York\tCattaraugus County\t1065\t39.9\t13.5\t10.0\t19121\t92692\t0.4249\t14755\tObama\t14755\t0.001956347\t14755.0\n14186\t-78.492558\t42.091553000000005\tAllegany village\tNY\tNew York\tCattaraugus County\t1767\t30.1\t37.1\t9.1\t22764\t136702\t0.4249\t14706\tObama\t14706\t0.0032458820000000003\t14706.0\n14187\t-78.45487299999999\t42.334742999999996\tFranklinville village\tNY\tNew York\tCattaraugus County\t1742\t37.1\t14.7\t11.2\t20701\t83980\t0.4249\t14737\tObama\t14737\t0.003199959\t14737.0\n14188\t-78.980181\t42.161155\tRandolph village\tNY\tNew York\tCattaraugus County\t1232\t40.0\t17.9\t7.4\t18965\t99583\t0.4249\t14772\tObama\t14772\t0.0022631170000000003\t14772.0\n14189\t-78.37267299999999\t42.075196999999996\tWeston Mills CDP\tNY\tNew York\tCattaraugus County\t1543\t43.8\t22.1\t8.0\t22803\t114904\t0.4249\t14760\tObama\t14760\t0.002834407\t14760.0\n14190\t-78.48290300000001\t42.427973\tLime Lake-Machias CDP\tNY\tNew York\tCattaraugus County\t1398\t45.0\t14.3\t10.7\t20446\t113874\t0.4249\t14042\tObama\t14042\t0.00256805\t14042.0\n14191\t-79.00080200000001\t42.458973\tPerrysburg village\tNY\tNew York\tCattaraugus County\t395\t42.7\t14.8\t9.2\t20762\t109868\t0.4249\t14129\tObama\t14129\t0.0007255930000000001\t14129.0\n14192\t-78.43216899999999\t42.081896\tOlean city\tNY\tNew York\tCattaraugus County\t14042\t40.1\t25.8\t7.8\t22326\t103351\t0.4249\t14760\tObama\t14760\t0.025794387000000002\t14760.0\n14193\t-78.479232\t42.524176000000004\tYorkshire CDP\tNY\tNew York\tCattaraugus County\t1326\t37.9\t7.5\t6.4\t18966\t87600\t0.4249\t14030\tObama\t14030\t0.00243579\t14030.0\n14194\t-78.952128\t42.169168\tEast Randolph village\tNY\tNew York\tCattaraugus County\t605\t38.3\t16.7\t7.2\t18368\t100417\t0.4249\t14772\tObama\t14772\t0.001111352\t14772.0\n14195\t-78.474936\t42.080559\tSt. Bonaventure CDP\tNY\tNew York\tCattaraugus County\t2027\t21.7\t26.1\t6.8\t18285\t133036\t0.4249\t14706\tObama\t14706\t0.003723488\t14706.0\n14196\t-76.526315\t42.90848\tMelrose Park CDP\tNY\tNew York\tCayuga County\t2389\t43.9\t34.0\t5.8\t28190\t143813\t0.5456\t13021\tObama\t13021\t0.0043884629999999996\t13021.0\n14197\t-76.726442\t42.91899\tCayuga village\tNY\tNew York\tCayuga County\t494\t42.7\t17.2\t7.6\t22041\t121875\t0.5456\t13034\tObama\t13034\t0.0009074510000000001\t13034.0\n14198\t-76.421876\t42.712024\tMoravia village\tNY\tNew York\tCayuga County\t1431\t38.7\t10.9\t9.0\t21071\t115766\t0.5456\t13118\tObama\t13118\t0.002628669\t13118.0\n14199\t-76.626086\t43.036521\tPort Byron village\tNY\tNew York\tCayuga County\t1199\t40.4\t12.7\t8.4\t20553\t102335\t0.5456\t13140\tObama\t13140\t0.0022024979999999998\t13140.0\n14200\t-76.699519\t42.751053999999996\tAurora village\tNY\tNew York\tCayuga County\t705\t39.0\t38.5\t5.4\t22680\t157813\t0.5456\t13026\tObama\t13026\t0.001295046\t13026.0\n14201\t-76.538185\t43.162971\tMeridian village\tNY\tNew York\tCayuga County\t390\t42.2\t12.2\t7.4\t23535\t129167\t0.5456\t13033\tObama\t13033\t0.000716409\t13033.0\n14202\t-76.568545\t42.933814\tAuburn city\tNY\tNew York\tCayuga County\t26450\t38.2\t14.3\t8.8\t22166\t107804\t0.5456\t13021\tObama\t13021\t0.048587205\t13021.0\n14203\t-76.690975\t42.845726\tUnion Springs village\tNY\tNew York\tCayuga County\t962\t42.9\t29.0\t7.0\t24509\t135106\t0.5456\t13160\tObama\t13160\t0.001767141\t13160.0\n14204\t-76.5728\t43.167962\tCato village\tNY\tNew York\tCayuga County\t605\t40.7\t10.5\t7.8\t20796\t124242\t0.5456\t13033\tObama\t13033\t0.001111352\t13033.0\n14205\t-76.563601\t43.048131\tWeedsport village\tNY\tNew York\tCayuga County\t1995\t39.0\t17.0\t6.5\t23244\t115164\t0.5456\t13166\tObama\t13166\t0.0036647059999999998\t13166.0\n14206\t-76.699925\t43.322413\tFair Haven village\tNY\tNew York\tCayuga County\t821\t46.9\t19.9\t8.4\t21606\t118314\t0.5456\t13156\tObama\t13156\t0.0015081320000000001\t13156.0\n14207\t-79.17549\t42.468458\tForestville village\tNY\tNew York\tChautauqua County\t786\t42.4\t20.8\t10.3\t21794\t108511\t0.4505\t14062\tObama\t14062\t0.001443839\t14062.0\n14208\t-79.594425\t42.159306\tSherman village\tNY\tNew York\tChautauqua County\t638\t37.9\t15.6\t8.0\t18951\t84500\t0.4505\t14781\tObama\t14781\t0.001171971\t14781.0\n14209\t-79.442801\t42.389702\tBrocton village\tNY\tNew York\tChautauqua County\t1447\t34.5\t11.3\t9.6\t18595\t94125\t0.4505\t14716\tObama\t14716\t0.00265806\t14716.0\n14210\t-79.318085\t42.342692\tCassadaga village\tNY\tNew York\tChautauqua County\t707\t43.7\t19.4\t9.8\t24986\t113306\t0.4505\t14718\tObama\t14718\t0.00129872\t14718.0\n14211\t-79.259073\t42.26538\tSinclairville village\tNY\tNew York\tChautauqua County\t648\t41.1\t15.3\t10.1\t17323\t95238\t0.4505\t14782\tObama\t14782\t0.0011903410000000001\t14782.0\n14212\t-79.484945\t42.074677\tPanama village\tNY\tNew York\tChautauqua County\t506\t40.4\t21.1\t6.8\t19829\t110081\t0.4505\t14767\tObama\t14767\t0.0009294939999999999\t14767.0\n14213\t-79.574726\t42.321872\tWestfield village\tNY\tNew York\tChautauqua County\t3290\t43.2\t25.4\t11.3\t21959\t115976\t0.4505\t14787\tObama\t14787\t0.00604355\t14787.0\n14214\t-79.712303\t42.265685999999995\tRipley CDP\tNY\tNew York\tChautauqua County\t891\t39.8\t12.5\t7.1\t20197\t64896\t0.4505\t14775\tObama\t14775\t0.001636718\t14775.0\n14215\t-79.320146\t42.099115000000005\tLakewood village\tNY\tNew York\tChautauqua County\t3025\t47.3\t40.3\t7.4\t29741\t126879\t0.4505\t14750\tObama\t14750\t0.00555676\t14750.0\n14216\t-79.332065\t42.440637\tFredonia village\tNY\tNew York\tChautauqua County\t10577\t27.7\t39.0\t7.3\t22172\t144790\t0.4505\t14063\tObama\t14063\t0.019429371\t14063.0\n14217\t-79.236666\t42.097479\tJamestown city\tNY\tNew York\tChautauqua County\t29606\t37.0\t18.4\t11.2\t19396\t86269\t0.4505\t14701\tObama\t14701\t0.054384605\t14701.0\n14218\t-79.281102\t42.088494\tJamestown West CDP\tNY\tNew York\tChautauqua County\t2412\t49.3\t31.3\t5.3\t27752\t127538\t0.4505\t14701\tObama\t14701\t0.004430712\t14701.0\n14219\t-79.19723499999999\t42.118988\tFalconer village\tNY\tNew York\tChautauqua County\t2320\t43.5\t14.0\t8.3\t24635\t91972\t0.4505\t14733\tObama\t14733\t0.004261713\t14733.0\n14220\t-79.10083399999999\t42.29587\tCherry Creek village\tNY\tNew York\tChautauqua County\t538\t36.9\t16.5\t8.3\t18145\t87917\t0.4505\t14723\tObama\t14723\t0.000988277\t14723.0\n14221\t-79.38949699999999\t42.163359\tBemus Point village\tNY\tNew York\tChautauqua County\t302\t48.0\t37.3\t4.9\t27530\t163636\t0.4505\t14712\tObama\t14712\t0.000554758\t14712.0\n14222\t-79.167588\t42.542623\tSilver Creek village\tNY\tNew York\tChautauqua County\t2753\t42.1\t15.2\t7.7\t22802\t110892\t0.4505\t14136\tObama\t14136\t0.0050571109999999996\t14136.0\n14223\t-79.14844599999999\t42.057494\tFrewsburg CDP\tNY\tNew York\tChautauqua County\t1979\t45.4\t17.5\t8.5\t23175\t117653\t0.4505\t14738\tObama\t14738\t0.003635315\t14738.0\n14224\t-79.503173\t42.253147\tMayville village\tNY\tNew York\tChautauqua County\t1661\t41.4\t24.9\t10.0\t23326\t112620\t0.4505\t14757\tObama\t14757\t0.0030511659999999997\t14757.0\n14225\t-79.332239\t42.480258\tDunkirk city\tNY\tNew York\tChautauqua County\t12348\t38.4\t16.6\t10.2\t19843\t87813\t0.4505\t14048\tObama\t14048\t0.022682602000000003\t14048.0\n14226\t-79.277698\t42.105227\tCeloron village\tNY\tNew York\tChautauqua County\t1176\t42.7\t11.7\t10.9\t20379\t80484\t0.4505\t14701\tObama\t14701\t0.002160248\t14701.0\n14227\t-76.729802\t42.012565\tWellsburg village\tNY\tNew York\tChemung County\t574\t43.9\t10.4\t10.4\t19895\t46923\t0.4798\t14894\tObama\t14894\t0.001054407\t14894.0\n14228\t-76.825594\t42.126697\tElmira Heights village\tNY\tNew York\tChemung County\t3979\t39.9\t17.2\t8.9\t21757\t89955\t0.4798\t14903\tObama\t14903\t0.0073092059999999995\t14903.0\n14229\t-76.836164\t42.267974\tMillport village\tNY\tNew York\tChemung County\t283\t46.0\t25.5\t7.2\t23585\t156818\t0.4798\t14864\tObama\t14864\t0.000519856\t14864.0\n14230\t-76.807834\t42.192687\tHorseheads North CDP\tNY\tNew York\tChemung County\t2724\t43.5\t31.6\t8.8\t28000\t169199\t0.4798\t14845\tObama\t14845\t0.005003839\t14845.0\n14231\t-76.55421199999999\t42.197506\tVan Etten village\tNY\tNew York\tChemung County\t549\t37.3\t15.4\t7.8\t15694\t79583\t0.4798\t14889\tObama\t14889\t0.0010084830000000001\t14889.0\n14232\t-76.818616\t42.063968\tSouthport CDP\tNY\tNew York\tChemung County\t6937\t45.2\t15.5\t12.1\t22189\t78378\t0.4798\t14904\tObama\t14904\t0.01274289\t14904.0\n14233\t-76.829806\t42.1689\tHorseheads village\tNY\tNew York\tChemung County\t6257\t43.7\t24.5\t9.1\t24780\t119375\t0.4798\t14845\tObama\t14845\t0.011493767\t14845.0\n14234\t-76.809613\t42.09381\tElmira city\tNY\tNew York\tChemung County\t29197\t33.7\t18.7\t13.2\t19254\t83035\t0.4798\t14901\tObama\t14901\t0.053633294000000005\t14901.0\n14235\t-76.84722\t42.087821999999996\tWest Elmira CDP\tNY\tNew York\tChemung County\t4905\t46.8\t50.7\t6.1\t35033\t162636\t0.4798\t14905\tObama\t14905\t0.009010217\t14905.0\n14236\t-76.931646\t42.143087\tBig Flats CDP\tNY\tNew York\tChemung County\t2377\t44.6\t46.1\t7.1\t27545\t172213\t0.4798\t14814\tObama\t14814\t0.004366419\t14814.0\n14237\t-76.88979599999999\t42.169326\tBig Flats Airport CDP\tNY\tNew York\tChemung County\t2621\t46.2\t33.3\t7.2\t32162\t164453\t0.4798\t14845\tObama\t14845\t0.004814634\t14845.0\n14238\t-75.522626\t42.534161\tNorwich city\tNY\tNew York\tChenango County\t7101\t40.2\t25.6\t9.0\t22177\t107431\t0.47200000000000003\t13815\tObama\t13815\t0.013044149\t13815.0\n14239\t-75.480698\t42.297283\tBainbridge village\tNY\tNew York\tChenango County\t1358\t43.1\t18.6\t10.1\t20807\t109505\t0.47200000000000003\t13733\tObama\t13733\t0.002494572\t13733.0\n14240\t-75.496471\t42.680673\tSherburne village\tNY\tNew York\tChenango County\t1414\t41.3\t27.2\t6.8\t18735\t103977\t0.47200000000000003\t13460\tObama\t13460\t0.0025974410000000002\t13460.0\n14241\t-75.595954\t42.441146999999994\tOxford village\tNY\tNew York\tChenango County\t1561\t42.9\t22.6\t10.1\t22399\t103960\t0.47200000000000003\t13830\tObama\t13830\t0.0028674720000000002\t13830.0\n14242\t-75.52480600000001\t42.229169\tAfton village\tNY\tNew York\tChenango County\t851\t41.7\t15.1\t6.6\t18817\t108255\t0.47200000000000003\t13730\tObama\t13730\t0.0015632410000000002\t13730.0\n14243\t-75.769423\t42.329583\tGreene village\tNY\tNew York\tChenango County\t1645\t42.1\t20.7\t8.2\t22680\t127465\t0.47200000000000003\t13778\tObama\t13778\t0.003021775\t13778.0\n14244\t-75.568753\t42.68692\tSmyrna village\tNY\tNew York\tChenango County\t218\t40.6\t18.2\t13.0\t17332\t89167\t0.47200000000000003\t13464\tObama\t13464\t0.000400454\t13464.0\n14245\t-75.33532\t42.623977000000004\tNew Berlin village\tNY\tNew York\tChenango County\t1095\t45.2\t21.7\t4.9\t20535\t87647\t0.47200000000000003\t13411\tObama\t13411\t0.002011455\t13411.0\n14246\t-73.811038\t44.606305\tRedford CDP\tNY\tNew York\tClinton County\t519\t37.2\t19.3\t10.8\t20002\t113158\t0.6185\t12981\tObama\t12981\t0.000953375\t12981.0\n14247\t-73.587863\t44.963805\tMooers CDP\tNY\tNew York\tClinton County\t465\t43.4\t19.5\t9.6\t21006\t100872\t0.6185\t12958\tObama\t12958\t0.00085418\t12958.0\n14248\t-73.550824\t44.692139000000005\tMorrisonville CDP\tNY\tNew York\tClinton County\t1759\t40.7\t27.0\t12.9\t25836\t150649\t0.6185\t12962\tObama\t12962\t0.003231187\t12962.0\n14249\t-73.71852\t44.719869\tDannemora village\tNY\tNew York\tClinton County\t4156\t34.1\t7.5\t9.7\t17588\t114306\t0.6185\t12918\tObama\t12918\t0.007634345\t12918.0\n14250\t-73.882173\t44.724946\tLyon Mountain CDP\tNY\tNew York\tClinton County\t489\t44.9\t14.5\t6.6\t24983\t77222\t0.6185\t12952\tObama\t12952\t0.0008982660000000001\t12952.0\n14251\t-73.396964\t44.716997\tCumberland Head CDP\tNY\tNew York\tClinton County\t1488\t44.1\t45.8\t5.4\t32436\t147017\t0.6185\t12903\tObama\t12903\t0.002733375\t12903.0\n14252\t-73.440895\t44.988296999999996\tChamplain village\tNY\tNew York\tClinton County\t1197\t43.1\t19.1\t9.7\t21192\t107534\t0.6185\t12919\tObama\t12919\t0.002198824\t12919.0\n14253\t-73.456611\t44.695094\tPlattsburgh city\tNY\tNew York\tClinton County\t19319\t31.8\t33.2\t7.8\t22842\t159726\t0.6185\t12901\tObama\t12901\t0.035487948\t12901.0\n14254\t-73.45263\t44.664542\tParc CDP\tNY\tNew York\tClinton County\t561\t47.3\t49.0\t3.7\t38394\t183036\t0.6185\t12903\tObama\t12903\t0.0010305260000000001\t12903.0\n14255\t-73.534039\t44.578874\tPeru CDP\tNY\tNew York\tClinton County\t1683\t42.7\t34.9\t6.8\t24604\t138663\t0.6185\t12972\tObama\t12972\t0.003091579\t12972.0\n14256\t-73.673213\t44.450965000000004\tAu Sable Forks CDP\tNY\tNew York\tClinton County\t644\t39.3\t9.6\t11.5\t20844\t105978\t0.6185\t12912\tObama\t12912\t0.001182993\t12912.0\n14257\t-73.659423\t44.890176000000004\tAltona CDP\tNY\tNew York\tClinton County\t1117\t35.6\t3.5\t11.7\t16740\t93333\t0.6185\t12910\tObama\t12910\t0.002051868\t12910.0\n14258\t-73.502943\t44.6831\tPlattsburgh West CDP\tNY\tNew York\tClinton County\t1320\t34.4\t11.4\t13.8\t17880\t58611\t0.6185\t12901\tObama\t12901\t0.002424768\t12901.0\n14259\t-73.365252\t44.991147\tRouses Point village\tNY\tNew York\tClinton County\t2250\t40.9\t22.2\t8.6\t21966\t123679\t0.6185\t12979\tObama\t12979\t0.004133127\t12979.0\n14260\t-73.59027900000001\t42.141618\tCopake Lake CDP\tNY\tNew York\tColumbia County\t776\t43.6\t26.0\t8.5\t26158\t180625\t0.5569\t12516\tObama\t12516\t0.00142547\t12516.0\n14261\t-73.617901\t42.325365999999995\tGhent CDP\tNY\tNew York\tColumbia County\t610\t44.2\t33.9\t5.8\t31190\t175595\t0.5569\t12075\tObama\t12075\t0.001120537\t12075.0\n14262\t-73.59774200000001\t42.361592\tChatham village\tNY\tNew York\tColumbia County\t1735\t42.5\t30.9\t6.6\t25078\t153646\t0.5569\t12037\tObama\t12037\t0.0031871\t12037.0\n14263\t-73.886136\t42.136993\tGermantown CDP\tNY\tNew York\tColumbia County\t893\t46.4\t28.2\t6.9\t26630\t187037\t0.5569\t12526\tObama\t12526\t0.001640392\t12526.0\n14264\t-73.77002900000001\t42.267072999999996\tLorenz Park CDP\tNY\tNew York\tColumbia County\t2003\t44.7\t14.4\t5.8\t26349\t129493\t0.5569\t12534\tObama\t12534\t0.003679402\t12534.0\n14265\t-73.646287\t42.247676\tPhilmont village\tNY\tNew York\tColumbia County\t1406\t37.9\t22.2\t10.6\t20046\t130460\t0.5569\t12565\tObama\t12565\t0.002582745\t12565.0\n14266\t-73.703257\t42.395431\tKinderhook village\tNY\tNew York\tColumbia County\t1271\t48.5\t45.6\t7.2\t34033\t202232\t0.5569\t12106\tObama\t12106\t0.0023347579999999997\t12106.0\n14267\t-73.726846\t42.226239\tClaverack-Red Mills CDP\tNY\tNew York\tColumbia County\t1056\t47.7\t21.0\t5.6\t27957\t147426\t0.5569\t12513\tObama\t12513\t0.001939814\t12513.0\n14268\t-73.785898\t42.251523999999996\tHudson city\tNY\tNew York\tColumbia County\t6963\t37.4\t12.1\t11.5\t18355\t112411\t0.5569\t12534\tObama\t12534\t0.012790651\t12534.0\n14269\t-73.67785699999999\t42.413389\tValatie village\tNY\tNew York\tColumbia County\t1667\t44.0\t30.9\t6.1\t27563\t186557\t0.5569\t12184\tObama\t12184\t0.003062188\t12184.0\n14270\t-73.75310400000001\t42.291342\tStottville CDP\tNY\tNew York\tColumbia County\t1301\t39.2\t10.4\t5.1\t22003\t127983\t0.5569\t12534\tObama\t12534\t0.002389866\t12534.0\n14271\t-73.649636\t42.448219\tNiverville CDP\tNY\tNew York\tColumbia County\t1709\t43.3\t24.1\t5.3\t32746\t151944\t0.5569\t12130\tObama\t12130\t0.00313934\t12130.0\n14272\t-76.097522\t42.593841999999995\tMcGraw village\tNY\tNew York\tCortland County\t943\t38.1\t15.9\t10.2\t22636\t112885\t0.5341\t13101\tObama\t13101\t0.001732239\t13101.0\n14273\t-76.205321\t42.57615\tMunsons Corners CDP\tNY\tNew York\tCortland County\t2252\t34.5\t25.0\t14.5\t20009\t131707\t0.5341\t13045\tObama\t13045\t0.004136801\t13045.0\n14274\t-76.183384\t42.637640000000005\tHomer village\tNY\tNew York\tCortland County\t3228\t41.7\t33.1\t7.1\t25846\t131461\t0.5341\t13077\tObama\t13077\t0.00592966\t13077.0\n14275\t-76.178467\t42.600443\tCortland city\tNY\tNew York\tCortland County\t18853\t27.9\t23.5\t9.4\t19333\t115788\t0.5341\t13045\tObama\t13045\t0.034631931\t13045.0\n14276\t-76.035053\t42.443983\tMarathon village\tNY\tNew York\tCortland County\t1010\t34.3\t16.8\t8.7\t20992\t104303\t0.5341\t13803\tObama\t13803\t0.001855315\t13803.0\n14277\t-76.2259\t42.59434\tCortland West CDP\tNY\tNew York\tCortland County\t1308\t47.2\t31.7\t8.2\t26176\t172292\t0.5341\t13045\tObama\t13045\t0.002402725\t13045.0\n14278\t-74.66897\t42.371543\tHobart village\tNY\tNew York\tDelaware County\t366\t44.5\t19.6\t8.7\t21085\t127273\t0.4455\t13788\tObama\t13788\t0.0006723219999999999\t13788.0\n14279\t-74.651329\t42.144542\tMargaretville village\tNY\tNew York\tDelaware County\t581\t53.3\t18.0\t11.6\t21806\t144583\t0.4455\t12455\tObama\t12455\t0.001067265\t12455.0\n14280\t-74.53357\t42.155187\tFleischmanns village\tNY\tNew York\tDelaware County\t330\t46.4\t14.7\t8.6\t21589\t136719\t0.4455\t12430\tObama\t12430\t0.000606192\t12430.0\n14281\t-75.28357\t41.952690000000004\tHancock village\tNY\tNew York\tDelaware County\t1354\t46.6\t12.9\t9.4\t20791\t87778\t0.4455\t13783\tObama\t13783\t0.002487224\t13783.0\n14282\t-75.16597\t42.341708000000004\tFranklin village\tNY\tNew York\tDelaware County\t362\t41.8\t21.7\t6.8\t23413\t120455\t0.4455\t13775\tObama\t13775\t0.0006649739999999999\t13775.0\n14283\t-74.784554\t42.190033\tAndes village\tNY\tNew York\tDelaware County\t264\t51.1\t21.0\t4.9\t26108\t150000\t0.4455\t13731\tObama\t13731\t0.000484954\t13731.0\n14284\t-74.616843\t42.40927\tStamford village\tNY\tNew York\tDelaware County\t1306\t48.3\t20.2\t15.2\t21969\t120471\t0.4455\t12167\tObama\t12167\t0.002399051\t12167.0\n14285\t-75.398315\t42.306587\tSidney village\tNY\tNew York\tDelaware County\t3884\t41.4\t16.5\t9.8\t21007\t92500\t0.4455\t13838\tObama\t13838\t0.007134695999999999\t13838.0\n14286\t-75.130391\t42.168791\tWalton village\tNY\tNew York\tDelaware County\t3094\t45.4\t18.1\t10.4\t20798\t107659\t0.4455\t13856\tObama\t13856\t0.005683509000000001\t13856.0\n14287\t-74.91492099999999\t42.278665999999994\tDelhi village\tNY\tNew York\tDelaware County\t2607\t23.8\t28.3\t7.5\t20959\t139444\t0.4455\t13753\tObama\t13753\t0.004788917\t13753.0\n14288\t-73.965546\t41.503644\tBeacon city\tNY\tNew York\tDutchess County\t15379\t36.9\t21.1\t9.6\t25785\t197720\t0.528\t12508\tObama\t12508\t0.028250382999999997\t12508.0\n14289\t-73.79372099999999\t41.619069\tHillside Lake CDP\tNY\tNew York\tDutchess County\t2132\t36.8\t39.4\t3.9\t32114\t259247\t0.528\t12533\tObama\t12533\t0.003916368\t12533.0\n14290\t-73.66003\t41.977979\tPine Plains CDP\tNY\tNew York\tDutchess County\t1497\t41.8\t25.4\t7.9\t26947\t183114\t0.528\t12567\tObama\t12567\t0.0027499070000000002\t12567.0\n14291\t-73.51116800000001\t41.953142\tMillerton village\tNY\tNew York\tDutchess County\t978\t42.4\t23.8\t9.7\t26949\t203000\t0.528\t12546\tObama\t12546\t0.001796533\t12546.0\n14292\t-73.869427\t41.550562\tBrinckerhoff CDP\tNY\tNew York\tDutchess County\t2726\t41.6\t34.3\t10.4\t33944\t274648\t0.528\t12524\tObama\t12524\t0.005007513\t12524.0\n14293\t-73.913448\t41.657333\tSpackenkill CDP\tNY\tNew York\tDutchess County\t4646\t46.5\t54.0\t7.9\t38856\t284091\t0.528\t126HH\tObama\t126HH\t0.008534448\t0.0\n14294\t-73.917749\t41.598490999999996\tWappingers Falls village\tNY\tNew York\tDutchess County\t5092\t35.1\t23.1\t7.0\t28547\t209590\t0.528\t12590\tObama\t12590\t0.009353726\t12590.0\n14295\t-73.80229399999999\t41.584225\tHopewell Junction CDP\tNY\tNew York\tDutchess County\t3013\t38.9\t40.3\t5.8\t39159\t357065\t0.528\t12533\tObama\t12533\t0.005534715999999999\t12533.0\n14296\t-73.885369\t41.696232\tArlington CDP\tNY\tNew York\tDutchess County\t12624\t29.2\t33.2\t6.4\t25944\t211275\t0.528\t12603\tObama\t12603\t0.023189598\t12603.0\n14297\t-73.577086\t41.743679\tDover Plains CDP\tNY\tNew York\tDutchess County\t2063\t45.1\t12.0\t11.8\t27063\t174074\t0.528\t12522\tObama\t12522\t0.003789618\t12522.0\n14298\t-73.693627\t41.783875\tMillbrook village\tNY\tNew York\tDutchess County\t1408\t40.9\t34.5\t6.9\t31712\t301299\t0.528\t12545\tObama\t12545\t0.002586419\t12545.0\n14299\t-73.598342\t41.563541\tPawling village\tNY\tNew York\tDutchess County\t2290\t42.2\t29.5\t9.2\t30813\t281985\t0.528\t12564\tObama\t12564\t0.004206605\t12564.0\n14300\t-73.55278299999999\t41.848023\tAmenia CDP\tNY\tNew York\tDutchess County\t1141\t38.9\t21.4\t8.9\t28279\t218207\t0.528\t12501\tObama\t12501\t0.002095955\t12501.0\n14301\t-73.900611\t41.7681\tHaviland CDP\tNY\tNew York\tDutchess County\t3733\t38.8\t31.1\t7.4\t31157\t207418\t0.528\t12538\tObama\t12538\t0.006857317\t12538.0\n14302\t-73.919935\t41.852866\tStaatsburg CDP\tNY\tNew York\tDutchess County\t989\t42.8\t30.0\t7.7\t33610\t193038\t0.528\t12580\tObama\t12580\t0.001816739\t12580.0\n14303\t-73.821256\t41.747265000000006\tPleasant Valley CDP\tNY\tNew York\tDutchess County\t2085\t41.2\t32.8\t5.5\t34738\t264967\t0.528\t12569\tObama\t12569\t0.003830031\t12569.0\n14304\t-73.921031\t41.695008\tPoughkeepsie city\tNY\tNew York\tDutchess County\t30333\t33.7\t22.8\t12.3\t21956\t181894\t0.528\t12601\tObama\t12601\t0.05572006400000001\t12601.0\n14305\t-73.913864\t41.732006\tFairview CDP\tNY\tNew York\tDutchess County\t5329\t29.5\t20.7\t7.6\t22314\t180261\t0.528\t12601\tObama\t12601\t0.009789082\t12601.0\n14306\t-73.872641\t41.657127\tRed Oaks Mill CDP\tNY\tNew York\tDutchess County\t4943\t42.2\t40.2\t5.9\t38702\t265476\t0.528\t12603\tObama\t12603\t0.009080021\t12603.0\n14307\t-73.870354\t41.595969000000004\tMyers Corner CDP\tNY\tNew York\tDutchess County\t5655\t42.0\t39.7\t6.9\t33871\t285570\t0.528\t12590\tObama\t12590\t0.010387926\t12590.0\n14308\t-73.87706899999999\t41.996086\tRed Hook village\tNY\tNew York\tDutchess County\t1955\t41.9\t33.7\t7.8\t29980\t219778\t0.528\t12571\tObama\t12571\t0.0035912279999999997\t12571.0\n14309\t-73.911907\t42.058147\tTivoli village\tNY\tNew York\tDutchess County\t1227\t24.3\t47.7\t7.2\t24691\t237766\t0.528\t12583\tObama\t12583\t0.002253932\t12583.0\n14310\t-73.908649\t41.929634\tRhinebeck village\tNY\tNew York\tDutchess County\t3098\t51.3\t41.9\t8.2\t33024\t282833\t0.528\t12572\tObama\t12572\t0.005690857\t12572.0\n14311\t-73.893772\t41.533807\tFishkill village\tNY\tNew York\tDutchess County\t2565\t46.1\t35.4\t8.2\t36530\t240046\t0.528\t12524\tObama\t12524\t0.004711765\t12524.0\n14312\t-73.937782\t41.634477000000004\tCrown Heights CDP\tNY\tNew York\tDutchess County\t2976\t39.5\t24.2\t8.2\t25744\t226231\t0.528\t12547\tObama\t12547\t0.005466749\t12547.0\n14313\t-78.704452\t42.911806\tDepew village\tNY\tNew York\tErie County\t15650\t42.9\t15.6\t7.2\t27040\t139912\t0.5731\t14043\tObama\t14043\t0.028748195\t14043.0\n14314\t-78.67931899999999\t42.972970000000004\tHarris Hill CDP\tNY\tNew York\tErie County\t4775\t45.4\t47.8\t6.3\t34682\t205974\t0.5731\t14026\tObama\t14026\t0.008771414\t14026.0\n14315\t-78.871429\t42.964641\tKenmore village\tNY\tNew York\tErie County\t15534\t41.4\t33.7\t7.3\t28405\t134608\t0.5731\t14217\tObama\t14217\t0.02853511\t14217.0\n14316\t-78.83506899999999\t42.723427\tHamburg village\tNY\tNew York\tErie County\t9739\t41.6\t43.4\t5.9\t30087\t168320\t0.5731\t14075\tObama\t14075\t0.017890011\t14075.0\n14317\t-78.630775\t43.008392\tClarence Center CDP\tNY\tNew York\tErie County\t2210\t40.5\t45.7\t9.2\t34557\t200714\t0.5731\t14032\tObama\t14032\t0.004059649\t14032.0\n14318\t-78.847201\t42.901353\tBuffalo city\tNY\tNew York\tErie County\t265467\t34.9\t22.5\t13.6\t19219\t96062\t0.5731\t14208\tObama\t14208\t0.48764837899999997\t14208.0\n14319\t-78.832542\t42.818244\tLackawanna city\tNY\tNew York\tErie County\t17711\t39.8\t14.8\t10.2\t21393\t115180\t0.5731\t14218\tObama\t14218\t0.03253414\t14218.0\n14320\t-78.832629\t42.796409999999995\tBlasdell village\tNY\tNew York\tErie County\t2496\t39.2\t14.7\t9.6\t26006\t126508\t0.5731\t14219\tObama\t14219\t0.004585016\t14219.0\n14321\t-78.617205\t42.766684000000005\tEast Aurora village\tNY\tNew York\tErie County\t6221\t44.8\t43.0\t6.5\t27676\t187139\t0.5731\t14052\tObama\t14052\t0.011427637\t14052.0\n14322\t-78.749756\t42.908132\tCheektowaga CDP\tNY\tNew York\tErie County\t75652\t43.9\t19.3\t7.7\t25401\t134345\t0.5731\t14225\tObama\t14225\t0.138968592\t14225.0\n14323\t-78.87929100000001\t43.010213\tTonawanda city\tNY\tNew York\tErie County\t15336\t41.5\t16.7\t7.9\t25009\t118754\t0.5731\t14150\tObama\t14150\t0.028171394\t14150.0\n14324\t-78.49746\t43.018128999999995\tAkron village\tNY\tNew York\tErie County\t2974\t41.1\t19.9\t7.2\t23288\t143682\t0.5731\t14001\tObama\t14001\t0.005463076\t14001.0\n14325\t-78.552966\t42.639038\tHolland CDP\tNY\tNew York\tErie County\t1307\t41.5\t23.7\t6.2\t23454\t160742\t0.5731\t14080\tObama\t14080\t0.002400888\t14080.0\n14326\t-78.62353\t42.786353999999996\tBillington Heights CDP\tNY\tNew York\tErie County\t1650\t48.8\t43.0\t2.6\t33564\t236508\t0.5731\t14052\tObama\t14052\t0.00303096\t14052.0\n14327\t-78.560982\t42.88597\tTown Line CDP\tNY\tNew York\tErie County\t2414\t46.3\t20.5\t6.0\t29372\t184335\t0.5731\t14004\tObama\t14004\t0.004434385999999999\t14004.0\n14328\t-78.743771\t42.762756\tOrchard Park village\tNY\tNew York\tErie County\t3165\t44.9\t56.2\t6.5\t33988\t253178\t0.5731\t14127\tObama\t14127\t0.005813932\t14127.0\n14329\t-78.779685\t42.67731\tNorth Boston CDP\tNY\tNew York\tErie County\t2624\t44.2\t22.1\t8.9\t28676\t174716\t0.5731\t14025\tObama\t14025\t0.004820145\t14025.0\n14330\t-78.873533\t42.986515000000004\tTonawanda CDP\tNY\tNew York\tErie County\t58448\t44.6\t30.6\t7.4\t27197\t141826\t0.5731\t14217\tObama\t14217\t0.107365784\t14217.0\n14331\t-78.75091\t42.837404\tWest Seneca CDP\tNY\tNew York\tErie County\t44707\t44.7\t24.0\t7.2\t27798\t158580\t0.5731\t14224\tObama\t14224\t0.082124317\t14224.0\n14332\t-78.90123299999999\t42.652443\tEden CDP\tNY\tNew York\tErie County\t3467\t41.1\t26.6\t5.6\t24415\t177410\t0.5731\t14057\tObama\t14057\t0.00636869\t14057.0\n14333\t-78.494664\t42.898761\tAlden village\tNY\tNew York\tErie County\t2553\t40.2\t19.9\t7.5\t26253\t137309\t0.5731\t14004\tObama\t14004\t0.004689722\t14004.0\n14334\t-79.080834\t42.595135\tFarnham village\tNY\tNew York\tErie County\t271\t38.1\t12.5\t13.2\t21351\t113333\t0.5731\t14081\tObama\t14081\t0.0004978119999999999\t14081.0\n14335\t-79.078351\t42.624235999999996\tLake Erie Beach CDP\tNY\tNew York\tErie County\t4176\t41.6\t21.2\t9.5\t23515\t114265\t0.5731\t14006\tObama\t14006\t0.007671084\t14006.0\n14336\t-78.67009399999999\t42.9008\tLancaster village\tNY\tNew York\tErie County\t10678\t42.3\t21.0\t7.2\t27825\t141611\t0.5731\t14086\tObama\t14086\t0.019614903\t14086.0\n14337\t-79.02956800000001\t42.63791\tAngola village\tNY\tNew York\tErie County\t2100\t37.2\t23.1\t7.9\t20255\t137733\t0.5731\t14006\tObama\t14006\t0.003857585\t14006.0\n14338\t-78.741694\t42.962118\tWilliamsville village\tNY\tNew York\tErie County\t5380\t47.4\t52.2\t5.9\t33408\t175996\t0.5731\t14221\tObama\t14221\t0.009882766\t14221.0\n14339\t-78.936926\t42.594787\tNorth Collins village\tNY\tNew York\tErie County\t1007\t40.2\t17.0\t4.3\t24427\t122470\t0.5731\t14111\tObama\t14111\t0.001849804\t14111.0\n14340\t-79.05216\t42.654990999999995\tAngola on the Lake CDP\tNY\tNew York\tErie County\t1727\t44.7\t20.7\t10.6\t26517\t113462\t0.5731\t14006\tObama\t14006\t0.003172405\t14006.0\n14341\t-78.669475\t42.508522\tSpringville village\tNY\tNew York\tErie County\t4118\t42.5\t25.4\t8.1\t25749\t142595\t0.5731\t14141\tObama\t14141\t0.007564541\t14141.0\n14342\t-78.791829\t42.89212\tSloan village\tNY\tNew York\tErie County\t3482\t44.3\t11.0\t9.7\t22461\t113899\t0.5731\t14206\tObama\t14206\t0.006396244000000001\t14206.0\n14343\t-78.633527\t42.828237\tElma Center CDP\tNY\tNew York\tErie County\t2485\t48.0\t39.7\t7.8\t33672\t236940\t0.5731\t14059\tObama\t14059\t0.004564809\t14059.0\n14344\t-73.47806800000001\t44.506921999999996\tKeeseville village\tNY\tNew York\tEssex County\t1917\t39.2\t21.5\t8.8\t22175\t111742\t0.5853\t12944\tObama\t12944\t0.0035214240000000004\t12944.0\n14345\t-73.52693199999999\t44.09187\tMineville-Witherbee CDP\tNY\tNew York\tEssex County\t1634\t37.5\t8.6\t11.8\t20965\t99167\t0.5853\t12956\tObama\t12956\t0.0030015690000000004\t12956.0\n14346\t-73.98543199999999\t44.283673\tLake Placid village\tNY\tNew York\tEssex County\t2746\t41.9\t35.2\t4.5\t24714\t183255\t0.5853\t12946\tObama\t12946\t0.005044252\t12946.0\n14347\t-73.45999499999999\t44.046415\tPort Henry village\tNY\tNew York\tEssex County\t1140\t42.7\t11.3\t8.9\t21297\t98846\t0.5853\t12974\tObama\t12974\t0.002094118\t12974.0\n14348\t-74.08028399999999\t44.926561\tChateaugay village\tNY\tNew York\tFranklin County\t830\t40.3\t15.1\t7.4\t17538\t83704\t0.6209\t12920\tObama\t12920\t0.001524665\t12920.0\n14349\t-74.288956\t44.849009\tMalone village\tNY\tNew York\tFranklin County\t5673\t41.3\t18.5\t5.2\t20499\t96160\t0.6209\t12953\tObama\t12953\t0.010420991\t12953.0\n14350\t-74.11939699999999\t44.324604\tSaranac Lake village\tNY\tNew York\tFranklin County\t5175\t41.3\t32.9\t4.7\t25121\t139626\t0.6209\t12983\tObama\t12983\t0.009506192\t12983.0\n14351\t-74.468173\t44.23454\tTupper Lake village\tNY\tNew York\tFranklin County\t3782\t40.2\t14.9\t5.5\t21950\t122840\t0.6209\t12986\tObama\t12986\t0.006947327\t12986.0\n14352\t-74.170011\t44.903185\tBurke village\tNY\tNew York\tFranklin County\t223\t40.0\t12.8\t8.0\t16536\t98000\t0.6209\t12917\tObama\t12917\t0.000409639\t12917.0\n14353\t-74.511967\t44.830668\tBrushton village\tNY\tNew York\tFranklin County\t493\t42.2\t10.5\t10.1\t16394\t80357\t0.6209\t12916\tObama\t12916\t0.0009056139999999999\t12916.0\n14354\t-74.265606\t43.102105\tMayfield village\tNY\tNew York\tFulton County\t918\t39.1\t14.4\t6.0\t23314\t108726\t0.4347\t12117\tObama\t12117\t0.001686316\t12117.0\n14355\t-74.196396\t43.0595\tBroadalbin village\tNY\tNew York\tFulton County\t1391\t38.9\t22.2\t7.2\t19988\t126882\t0.4347\t12025\tObama\t12025\t0.002555191\t12025.0\n14356\t-74.34680300000001\t43.050734999999996\tGloversville city\tNY\tNew York\tFulton County\t14858\t38.3\t15.3\t11.3\t19388\t91501\t0.4347\t12078\tObama\t12078\t0.027293334\t12078.0\n14357\t-74.169336\t43.223203000000005\tNorthville village\tNY\tNew York\tFulton County\t1283\t44.3\t22.6\t9.9\t22276\t141176\t0.4347\t12134\tObama\t12134\t0.002356801\t12134.0\n14358\t-74.375221\t43.007737\tJohnstown city\tNY\tNew York\tFulton County\t8526\t40.6\t22.3\t7.6\t22151\t110444\t0.4347\t12095\tObama\t12095\t0.015661796000000002\t12095.0\n14359\t-77.98993\t42.978021999999996\tLe Roy village\tNY\tNew York\tGenesee County\t4293\t38.8\t20.5\t6.5\t23705\t131250\t0.38799999999999996\t14482\tObama\t14482\t0.007886006999999999\t14482.0\n14360\t-78.18014000000001\t42.998744\tBatavia city\tNY\tNew York\tGenesee County\t15335\t39.2\t22.8\t6.6\t22558\t119583\t0.38799999999999996\t14020\tObama\t14020\t0.028169557\t14020.0\n14361\t-78.402937\t42.961092\tCorfu village\tNY\tNew York\tGenesee County\t767\t37.0\t18.2\t5.9\t25254\t141772\t0.38799999999999996\t14036\tObama\t14036\t0.001408937\t14036.0\n14362\t-78.271056\t43.065020000000004\tOakfield village\tNY\tNew York\tGenesee County\t1699\t36.8\t16.4\t7.7\t22502\t109811\t0.38799999999999996\t14125\tObama\t14125\t0.00312097\t14125.0\n14363\t-77.942785\t43.083556\tBergen village\tNY\tNew York\tGenesee County\t1199\t35.5\t26.1\t6.2\t28690\t131442\t0.38799999999999996\t14416\tObama\t14416\t0.0022024979999999998\t14416.0\n14364\t-78.259218\t42.901965999999994\tAlexander village\tNY\tNew York\tGenesee County\t480\t34.5\t19.6\t6.3\t20439\t122813\t0.38799999999999996\t14005\tObama\t14005\t0.0008817339999999999\t14005.0\n14365\t-78.18925899999999\t43.076904\tElba village\tNY\tNew York\tGenesee County\t664\t38.4\t24.7\t4.7\t25289\t129167\t0.38799999999999996\t14058\tObama\t14058\t0.001219732\t14058.0\n14366\t-73.81039\t42.269495\tAthens village\tNY\tNew York\tGreene County\t1769\t44.7\t23.7\t6.2\t26787\t133125\t0.4358\t12015\tObama\t12015\t0.003249556\t12015.0\n14367\t-74.02287199999999\t42.177271000000005\tPalenville CDP\tNY\tNew York\tGreene County\t1116\t39.7\t15.4\t13.6\t23699\t143675\t0.4358\t12463\tObama\t12463\t0.002050031\t12463.0\n14368\t-73.865542\t42.21452\tCatskill village\tNY\tNew York\tGreene County\t4398\t38.8\t16.7\t8.0\t21929\t124467\t0.4358\t12414\tObama\t12414\t0.008078886\t12414.0\n14369\t-73.88223599999999\t42.236074\tJefferson Heights CDP\tNY\tNew York\tGreene County\t1114\t51.2\t17.1\t10.1\t23683\t145652\t0.4358\t12414\tObama\t12414\t0.002046357\t12414.0\n14370\t-74.216378\t42.212864\tHunter village\tNY\tNew York\tGreene County\t501\t48.7\t24.0\t5.8\t26779\t146774\t0.4358\t12442\tObama\t12442\t0.00092031\t12442.0\n14371\t-73.89406899999999\t42.252959000000004\tLeeds CDP\tNY\tNew York\tGreene County\t388\t43.7\t19.9\t9.4\t24694\t144531\t0.4358\t12414\tObama\t12414\t0.000712735\t12414.0\n14372\t-74.021675\t42.413194\tGreenville CDP\tNY\tNew York\tGreene County\t456\t47.5\t29.7\t6.5\t23561\t160185\t0.4358\t12083\tObama\t12083\t0.000837647\t12083.0\n14373\t-73.807956\t42.356095\tCoxsackie village\tNY\tNew York\tGreene County\t2914\t37.1\t20.1\t6.6\t23000\t144284\t0.4358\t12051\tObama\t12051\t0.005352859000000001\t12051.0\n14374\t-74.134692\t42.193527\tTannersville village\tNY\tNew York\tGreene County\t459\t50.1\t24.4\t11.6\t19700\t177206\t0.4358\t12485\tObama\t12485\t0.000843158\t12485.0\n14375\t-74.010036\t42.305331\tCairo CDP\tNY\tNew York\tGreene County\t1403\t42.7\t19.1\t6.8\t20551\t143085\t0.4358\t12413\tObama\t12413\t0.002577234\t12413.0\n14376\t-74.248052\t42.315163\tWindham CDP\tNY\tNew York\tGreene County\t357\t48.1\t30.6\t6.8\t24232\t186607\t0.4358\t12496\tObama\t12496\t0.00065579\t12496.0\n14377\t-74.356657\t43.559438\tSpeculator village\tNY\tNew York\tHamilton County\t323\t48.8\t24.2\t4.4\t24315\t142500\t0.3613\t12164\tObama\t12164\t0.000593333\t12164.0\n14378\t-74.970959\t43.138498\tMiddleville village\tNY\tNew York\tHerkimer County\t560\t42.2\t18.6\t5.7\t19032\t134500\t0.4502\t13406\tObama\t13406\t0.001028689\t13406.0\n14379\t-75.015196\t43.185978000000006\tNewport village\tNY\tNew York\tHerkimer County\t628\t42.7\t22.9\t8.6\t17790\t151923\t0.4502\t13416\tObama\t13416\t0.0011536019999999999\t13416.0\n14380\t-74.99181899999999\t43.028205\tHerkimer village\tNY\tNew York\tHerkimer County\t7318\t41.1\t18.4\t9.1\t20177\t121441\t0.4502\t13350\tObama\t13350\t0.013442766\t13350.0\n14381\t-75.039625\t43.011348999999996\tIlion village\tNY\tNew York\tHerkimer County\t8207\t37.7\t22.6\t7.9\t19820\t116045\t0.4502\t13357\tObama\t13357\t0.015075811000000001\t13357.0\n14382\t-75.038575\t43.240127\tCold Brook village\tNY\tNew York\tHerkimer County\t343\t42.4\t28.0\t7.4\t22534\t144853\t0.4502\t13431\tObama\t13431\t0.000630072\t13431.0\n14383\t-75.007352\t43.010307\tMohawk village\tNY\tNew York\tHerkimer County\t2512\t41.9\t19.9\t5.6\t23186\t117778\t0.4502\t13350\tObama\t13350\t0.004614407\t13350.0\n14384\t-74.85634399999999\t43.045256\tLittle Falls city\tNY\tNew York\tHerkimer County\t4737\t42.9\t21.4\t9.0\t19657\t99423\t0.4502\t13365\tObama\t13365\t0.00870161\t13365.0\n14385\t-74.765333\t43.104172999999996\tDolgeville village\tNY\tNew York\tHerkimer County\t2033\t41.5\t21.4\t9.2\t20833\t90246\t0.4502\t13329\tObama\t13329\t0.00373451\t13329.0\n14386\t-75.060862\t43.2257\tPoland village\tNY\tNew York\tHerkimer County\t465\t42.7\t26.8\t7.6\t21165\t146354\t0.4502\t13431\tObama\t13431\t0.00085418\t13431.0\n14387\t-75.072222\t43.038287\tFrankfort village\tNY\tNew York\tHerkimer County\t2463\t43.3\t12.9\t7.0\t19799\t125189\t0.4502\t13340\tObama\t13340\t0.004524396\t13340.0\n14388\t-75.191578\t42.883951\tWest Winfield village\tNY\tNew York\tHerkimer County\t869\t41.5\t24.7\t7.1\t18233\t132813\t0.4502\t13491\tObama\t13491\t0.001596306\t13491.0\n14389\t-76.33054399999999\t44.126076\tCape Vincent village\tNY\tNew York\tJefferson County\t846\t50.2\t22.3\t6.7\t20953\t129762\t0.4789\t13618\tObama\t13618\t0.001554056\t13618.0\n14390\t-76.045559\t44.007901000000004\tDexter village\tNY\tNew York\tJefferson County\t1239\t40.4\t15.9\t7.2\t18894\t121753\t0.4789\t13634\tObama\t13634\t0.002275975\t13634.0\n14391\t-76.065051\t43.715703000000005\tMannsville village\tNY\tNew York\tJefferson County\t445\t36.3\t18.5\t8.0\t19726\t94545\t0.4789\t13661\tObama\t13661\t0.000817441\t13661.0\n14392\t-75.807912\t44.087216\tEvans Mills village\tNY\tNew York\tJefferson County\t689\t28.9\t15.9\t10.5\t17942\t116544\t0.4789\t13637\tObama\t13637\t0.001265655\t13637.0\n14393\t-76.022017\t43.810193\tAdams village\tNY\tNew York\tJefferson County\t1676\t40.4\t23.9\t5.8\t22688\t123177\t0.4789\t13605\tObama\t13605\t0.00307872\t13605.0\n14394\t-75.954782\t44.001517\tGlen Park village\tNY\tNew York\tJefferson County\t507\t41.5\t17.0\t7.5\t19589\t129924\t0.4789\t13615\tObama\t13615\t0.0009313310000000001\t13615.0\n14395\t-75.709564\t44.154211\tPhiladelphia village\tNY\tNew York\tJefferson County\t1681\t28.7\t19.5\t10.6\t18447\t106346\t0.4789\t13673\tObama\t13673\t0.003087905\t13673.0\n14396\t-76.079912\t44.234095\tClayton village\tNY\tNew York\tJefferson County\t1765\t46.6\t32.0\t8.8\t26278\t133861\t0.4789\t13624\tObama\t13624\t0.0032422090000000002\t13624.0\n14397\t-75.657927\t44.023105\tHerrings village\tNY\tNew York\tJefferson County\t129\t37.8\t8.0\t11.1\t20403\t100000\t0.4789\t13619\tObama\t13619\t0.000236966\t13619.0\n14398\t-75.707778\t44.019794\tGreat Bend CDP\tNY\tNew York\tJefferson County\t826\t39.2\t15.3\t7.3\t18919\t110256\t0.4789\t13602\tObama\t13602\t0.001517317\t13602.0\n14399\t-76.12911899999999\t44.068359\tChaumont village\tNY\tNew York\tJefferson County\t659\t44.2\t20.9\t8.4\t21284\t127703\t0.4789\t13622\tObama\t13622\t0.001210547\t13622.0\n14400\t-75.796413\t44.009237\tBlack River village\tNY\tNew York\tJefferson County\t1458\t38.8\t21.3\t6.5\t23719\t124432\t0.4789\t13612\tObama\t13612\t0.002678266\t13612.0\n14401\t-75.805743\t44.301053\tRedwood CDP\tNY\tNew York\tJefferson County\t639\t38.5\t16.0\t13.0\t17447\t98462\t0.4789\t13679\tObama\t13679\t0.001173808\t13679.0\n14402\t-75.49979599999999\t44.071671\tNatural Bridge CDP\tNY\tNew York\tJefferson County\t389\t37.7\t5.5\t7.0\t16871\t69706\t0.4789\t13665\tObama\t13665\t0.000714572\t13665.0\n14403\t-75.60238100000001\t43.984395\tCarthage village\tNY\tNew York\tJefferson County\t3671\t36.2\t17.8\t12.0\t18985\t113163\t0.4789\t13619\tObama\t13619\t0.006743425999999999\t13619.0\n14404\t-75.679811\t44.034239\tDeferiet village\tNY\tNew York\tJefferson County\t309\t37.1\t7.3\t10.6\t20398\t100521\t0.4789\t13602\tObama\t13602\t0.000567616\t13602.0\n14405\t-75.983469\t44.005753000000006\tBrownville village\tNY\tNew York\tJefferson County\t1084\t42.4\t20.3\t7.5\t21354\t126786\t0.4789\t13615\tObama\t13615\t0.001991249\t13615.0\n14406\t-75.796724\t44.215362\tTheresa village\tNY\tNew York\tJefferson County\t849\t38.0\t13.6\t10.0\t17374\t95556\t0.4789\t13691\tObama\t13691\t0.0015595670000000002\t13691.0\n14407\t-76.134585\t43.734997\tEllisburg village\tNY\tNew York\tJefferson County\t277\t38.6\t15.6\t7.4\t20927\t103676\t0.4789\t13661\tObama\t13661\t0.000508834\t13661.0\n14408\t-76.045168\t44.142435\tDepauville CDP\tNY\tNew York\tJefferson County\t541\t36.9\t12.8\t8.0\t18177\t116667\t0.4789\t13622\tObama\t13622\t0.0009937869999999999\t13622.0\n14409\t-75.911617\t44.335605\tAlexandria Bay village\tNY\tNew York\tJefferson County\t1176\t49.1\t25.8\t14.1\t24688\t122656\t0.4789\t13607\tObama\t13607\t0.002160248\t13607.0\n14410\t-75.607699\t44.199758\tAntwerp village\tNY\tNew York\tJefferson County\t824\t35.5\t11.6\t12.1\t18317\t96667\t0.4789\t13608\tObama\t13608\t0.0015136429999999998\t13608.0\n14411\t-75.846818\t44.040138\tCalcium CDP\tNY\tNew York\tJefferson County\t3738\t26.8\t18.2\t8.6\t17500\t119254\t0.4789\t13616\tObama\t13616\t0.006866501999999999\t13616.0\n14412\t-75.761783\t44.05847\tFort Drum CDP\tNY\tNew York\tJefferson County\t14313\t22.9\t25.3\t15.7\t15767\t77500\t0.4789\t13602\tObama\t13602\t0.026292199\t13602.0\n14413\t-75.909263\t43.973294\tWatertown city\tNY\tNew York\tJefferson County\t26556\t35.2\t21.1\t8.5\t20170\t112478\t0.4789\t13601\tObama\t13601\t0.048781922\t13601.0\n14414\t-76.118065\t43.941990000000004\tSackets Harbor village\tNY\tNew York\tJefferson County\t1612\t37.2\t36.6\t7.5\t27511\t131013\t0.4789\t13685\tObama\t13685\t0.002961156\t13685.0\n14415\t-76.000149\t43.861693\tAdams Center CDP\tNY\tNew York\tJefferson County\t1583\t38.7\t24.4\t4.9\t23990\t130428\t0.4789\t13606\tObama\t13606\t0.002907885\t13606.0\n14416\t-75.96311700000001\t44.195917\tLa Fargeville CDP\tNY\tNew York\tJefferson County\t611\t36.5\t16.6\t8.8\t18430\t120982\t0.4789\t13656\tObama\t13656\t0.001122374\t13656.0\n14417\t-75.621286\t43.973643\tWest Carthage village\tNY\tNew York\tJefferson County\t2088\t34.7\t21.4\t9.2\t18997\t105612\t0.4789\t13619\tObama\t13619\t0.003835542\t13619.0\n14418\t-73.81805899999999\t40.854888\tNew York city\tNY\tNew York\tKings County\t8398347\t35.5\t33.4\t12.3\t27808\t396277\t0.8199\t10461\tObama\t10461\t15.42730472\t10461.0\n14419\t-75.672658\t43.893307\tCopenhagen village\tNY\tNew York\tLewis County\t827\t35.8\t13.6\t7.3\t17988\t110377\t0.449\t13626\tObama\t13626\t0.001519154\t13626.0\n14420\t-75.341225\t43.583814000000004\tPort Leyden village\tNY\tNew York\tLewis County\t627\t39.0\t9.5\t9.0\t17750\t82333\t0.449\t13433\tObama\t13433\t0.001151765\t13433.0\n14421\t-75.361941\t43.617159\tLyons Falls village\tNY\tNew York\tLewis County\t547\t40.3\t17.7\t8.1\t18912\t98214\t0.449\t13368\tObama\t13368\t0.001004809\t13368.0\n14422\t-75.39120799999999\t43.894581\tCroghan village\tNY\tNew York\tLewis County\t634\t39.0\t14.3\t8.4\t17282\t110677\t0.449\t13620\tObama\t13620\t0.001164623\t13620.0\n14423\t-75.42802900000001\t43.564858\tConstableville village\tNY\tNew York\tLewis County\t289\t40.6\t13.6\t7.8\t17505\t102083\t0.449\t13325\tObama\t13325\t0.000530877\t13325.0\n14424\t-75.410659\t43.629151\tTurin village\tNY\tNew York\tLewis County\t245\t41.0\t17.8\t7.8\t18385\t100000\t0.449\t13473\tObama\t13473\t0.000450052\t13473.0\n14425\t-75.517015\t43.88551\tCastorland village\tNY\tNew York\tLewis County\t289\t35.3\t16.0\t6.6\t17706\t116667\t0.449\t13620\tObama\t13620\t0.000530877\t13620.0\n14426\t-75.32073100000001\t44.152877000000004\tHarrisville village\tNY\tNew York\tLewis County\t622\t39.6\t12.0\t10.5\t17312\t86563\t0.449\t13648\tObama\t13648\t0.00114258\t13648.0\n14427\t-75.48744599999999\t43.78666\tLowville village\tNY\tNew York\tLewis County\t3479\t42.3\t21.1\t7.6\t21598\t116126\t0.449\t13367\tObama\t13367\t0.006390733000000001\t13367.0\n14428\t-77.61199\t42.907115000000005\tLima village\tNY\tNew York\tLivingston County\t2367\t32.2\t26.8\t7.2\t24496\t157519\t0.4372\t14485\tObama\t14485\t0.00434805\t14485.0\n14429\t-77.857163\t42.975584000000005\tCaledonia village\tNY\tNew York\tLivingston County\t2235\t40.7\t19.5\t7.1\t22204\t144092\t0.4372\t14423\tObama\t14423\t0.0041055729999999995\t14423.0\n14430\t-77.69566800000001\t42.560709\tDansville village\tNY\tNew York\tLivingston County\t4733\t38.7\t13.1\t8.6\t22132\t102782\t0.4372\t14437\tObama\t14437\t0.008694262\t14437.0\n14431\t-77.875248\t42.72398\tMount Morris village\tNY\tNew York\tLivingston County\t2870\t41.5\t13.8\t13.0\t21584\t98580\t0.4372\t14510\tObama\t14510\t0.005272033000000001\t14510.0\n14432\t-77.809208\t42.798891999999995\tGeneseo village\tNY\tNew York\tLivingston County\t7638\t22.4\t49.2\t6.7\t21067\t176582\t0.4372\t14454\tObama\t14454\t0.014030589\t14454.0\n14433\t-77.668751\t42.821841\tLivonia village\tNY\tNew York\tLivingston County\t1505\t41.3\t27.4\t5.5\t26425\t154310\t0.4372\t14487\tObama\t14487\t0.002764603\t14487.0\n14434\t-77.937749\t42.57989\tNunda village\tNY\tNew York\tLivingston County\t1224\t35.9\t11.7\t11.8\t20112\t93784\t0.4372\t14517\tObama\t14517\t0.002248421\t14517.0\n14435\t-77.746445\t42.91258\tAvon village\tNY\tNew York\tLivingston County\t3052\t41.2\t30.0\t6.0\t26740\t162729\t0.4372\t14414\tObama\t14414\t0.005606356999999999\t14414.0\n14436\t-77.897065\t42.770953999999996\tLeicester village\tNY\tNew York\tLivingston County\t460\t41.4\t16.3\t6.7\t21794\t123276\t0.4372\t14481\tObama\t14481\t0.000844995\t14481.0\n14437\t-75.644808\t42.897833\tMorrisville village\tNY\tNew York\tMadison County\t2192\t26.7\t27.7\t8.2\t19474\t131845\t0.4937\t13408\tObama\t13408\t0.004026584000000001\t13408.0\n14438\t-75.88675400000001\t42.758515\tDeRuyter village\tNY\tNew York\tMadison County\t545\t39.1\t17.1\t6.0\t19306\t107065\t0.4937\t13052\tObama\t13052\t0.001001135\t13052.0\n14439\t-75.550236\t42.829599\tHamilton village\tNY\tNew York\tMadison County\t3647\t21.7\t59.8\t7.5\t22033\t185000\t0.4937\t13346\tObama\t13346\t0.00669934\t13346.0\n14440\t-75.709713\t43.077606\tWampsville village\tNY\tNew York\tMadison County\t558\t41.1\t26.1\t4.1\t22541\t153017\t0.4937\t13032\tObama\t13032\t0.0010250160000000001\t13032.0\n14441\t-75.662041\t43.076929\tOneida city\tNY\tNew York\tMadison County\t10667\t39.8\t23.2\t9.4\t23134\t131815\t0.4937\t13421\tObama\t13421\t0.019594696\t13421.0\n14442\t-75.874773\t43.046428000000006\tChittenango village\tNY\tNew York\tMadison County\t4894\t39.2\t28.6\t5.4\t28049\t141244\t0.4937\t13037\tObama\t13037\t0.008990011\t13037.0\n14443\t-75.512085\t42.897474\tMadison village\tNY\tNew York\tMadison County\t312\t40.9\t10.2\t5.7\t19330\t103333\t0.4937\t13402\tObama\t13402\t0.000573127\t13402.0\n14444\t-75.542149\t42.744609999999994\tEarlville village\tNY\tNew York\tMadison County\t755\t41.8\t21.0\t9.6\t19518\t94737\t0.4937\t13332\tObama\t13332\t0.0013868939999999998\t13332.0\n14445\t-75.586802\t42.976556\tMunnsville village\tNY\tNew York\tMadison County\t432\t37.3\t10.9\t7.2\t19093\t117763\t0.4937\t13409\tObama\t13409\t0.00079356\t13409.0\n14446\t-75.755973\t43.083539\tCanastota village\tNY\tNew York\tMadison County\t4365\t40.2\t22.7\t10.3\t23469\t125518\t0.4937\t13032\tObama\t13032\t0.008018266999999999\t13032.0\n14447\t-75.85155\t42.929293\tCazenovia village\tNY\tNew York\tMadison County\t2621\t33.4\t50.6\t7.1\t28002\t206250\t0.4937\t13035\tObama\t13035\t0.004814634\t13035.0\n14448\t-77.59017\t43.218288\tIrondequoit CDP\tNY\tNew York\tMonroe County\t50770\t45.8\t31.5\t6.8\t29833\t141711\t0.5797\t14617\tObama\t14617\t0.093261717\t14617.0\n14449\t-77.42274\t43.214453000000006\tWebster village\tNY\tNew York\tMonroe County\t5599\t38.2\t31.3\t9.0\t28511\t170933\t0.5797\t14580\tObama\t14580\t0.010285057\t14580.0\n14450\t-77.80578299999999\t43.188612\tSpencerport village\tNY\tNew York\tMonroe County\t3794\t40.5\t40.6\t6.1\t32226\t175712\t0.5797\t14559\tObama\t14559\t0.006969370999999999\t14559.0\n14451\t-77.700659\t43.165490999999996\tGates-North Gates CDP\tNY\tNew York\tMonroe County\t14575\t42.0\t16.1\t6.8\t25750\t135309\t0.5797\t14606\tObama\t14606\t0.026773479\t14606.0\n14452\t-77.755629\t43.022059000000006\tScottsville village\tNY\tNew York\tMonroe County\t2045\t38.0\t41.3\t8.1\t27912\t149907\t0.5797\t14546\tObama\t14546\t0.0037565529999999997\t14546.0\n14453\t-77.4426\t43.098991\tFairport village\tNY\tNew York\tMonroe County\t5480\t41.2\t50.7\t6.0\t34576\t187753\t0.5797\t14450\tObama\t14450\t0.010066461\t14450.0\n14454\t-77.883386\t43.103037\tChurchville village\tNY\tNew York\tMonroe County\t1897\t39.1\t35.6\t6.5\t28864\t156505\t0.5797\t14428\tObama\t14428\t0.003484685\t14428.0\n14455\t-77.70264399999999\t43.209514\tGreece CDP\tNY\tNew York\tMonroe County\t14187\t45.5\t23.9\t7.4\t27957\t151817\t0.5797\t14626\tObama\t14626\t0.026060744\t14626.0\n14456\t-77.486722\t43.11222\tEast Rochester village\tNY\tNew York\tMonroe County\t6383\t38.9\t26.1\t5.7\t25323\t118818\t0.5797\t14445\tObama\t14445\t0.011725221999999999\t14445.0\n14457\t-77.614141\t43.169689\tRochester city\tNY\tNew York\tMonroe County\t211299\t31.5\t23.2\t13.0\t19962\t95090\t0.5797\t146HH\tObama\t146HH\t0.38814472200000005\t0.0\n14458\t-77.590285\t42.955732\tHoneoye Falls village\tNY\tNew York\tMonroe County\t2561\t43.6\t49.7\t5.0\t31518\t188594\t0.5797\t14472\tObama\t14472\t0.004704417\t14472.0\n14459\t-77.792274\t43.290122\tHilton village\tNY\tNew York\tMonroe County\t6004\t35.9\t23.8\t6.5\t25475\t145441\t0.5797\t14468\tObama\t14468\t0.01102902\t14468.0\n14460\t-77.58339000000001\t43.11752\tBrighton CDP\tNY\tNew York\tMonroe County\t34722\t42.5\t62.0\t6.0\t37866\t189794\t0.5797\t14618\tObama\t14618\t0.06378241700000001\t14618.0\n14461\t-77.940556\t43.213539000000004\tBrockport village\tNY\tNew York\tMonroe County\t8242\t23.9\t43.2\t8.1\t21404\t130740\t0.5797\t14420\tObama\t14420\t0.015140104\t14420.0\n14462\t-77.51649\t43.090037\tPittsford village\tNY\tNew York\tMonroe County\t1395\t47.9\t68.8\t5.0\t47327\t261111\t0.5797\t14534\tObama\t14534\t0.002562539\t14534.0\n14463\t-74.60991800000001\t42.931795\tNelliston village\tNY\tNew York\tMontgomery County\t585\t41.1\t9.8\t6.6\t22267\t85000\t0.467\t13339\tObama\t13339\t0.001074613\t13339.0\n14464\t-74.1906\t42.942011\tAmsterdam city\tNY\tNew York\tMontgomery County\t17832\t41.6\t18.9\t7.7\t20680\t102648\t0.467\t12010\tObama\t12010\t0.03275641\t12010.0\n14465\t-74.370511\t42.946312\tFultonville village\tNY\tNew York\tMontgomery County\t661\t40.4\t20.6\t8.9\t19968\t96000\t0.467\t12068\tObama\t12068\t0.0012142210000000001\t12068.0\n14466\t-74.2381\t42.959182\tFort Johnson village\tNY\tNew York\tMontgomery County\t478\t44.2\t14.1\t4.0\t25791\t116429\t0.467\t12070\tObama\t12070\t0.00087806\t12070.0\n14467\t-74.62775\t42.931622\tFort Plain village\tNY\tNew York\tMontgomery County\t2155\t41.4\t15.4\t11.0\t18581\t84811\t0.467\t13339\tObama\t13339\t0.003958617\t13339.0\n14468\t-74.67864\t43.000796\tSt. Johnsville village\tNY\tNew York\tMontgomery County\t1678\t44.1\t15.8\t8.7\t19154\t86463\t0.467\t13452\tObama\t13452\t0.003082394\t13452.0\n14469\t-74.154504\t42.972840999999995\tHagaman village\tNY\tNew York\tMontgomery County\t1469\t45.5\t20.1\t4.5\t26105\t130903\t0.467\t12086\tObama\t12086\t0.002698473\t12086.0\n14470\t-74.574865\t42.914274\tPalatine Bridge village\tNY\tNew York\tMontgomery County\t673\t42.0\t10.9\t8.6\t20688\t87778\t0.467\t13428\tObama\t13428\t0.001236264\t13428.0\n14471\t-74.298796\t42.947949\tTribes Hill CDP\tNY\tNew York\tMontgomery County\t956\t48.0\t12.9\t5.3\t24749\t129082\t0.467\t12070\tObama\t12070\t0.00175612\t12070.0\n14472\t-74.570534\t42.900403999999995\tCanajoharie village\tNY\tNew York\tMontgomery County\t2170\t41.1\t20.4\t9.5\t22042\t102146\t0.467\t13428\tObama\t13428\t0.003986171\t13428.0\n14473\t-74.371943\t42.953573\tFonda village\tNY\tNew York\tMontgomery County\t793\t39.0\t20.6\t7.5\t23124\t100278\t0.467\t12068\tObama\t12068\t0.001456698\t12068.0\n14474\t-74.601708\t42.837465\tAmes village\tNY\tNew York\tMontgomery County\t165\t45.0\t20.2\t4.4\t19126\t107500\t0.467\t13317\tObama\t13317\t0.000303096\t13317.0\n14475\t-73.477096\t40.724045000000004\tPlainedge CDP\tNY\tNew York\tNassau County\t9111\t40.8\t29.2\t5.5\t34465\t372395\t0.5328\t11714\tObama\t11714\t0.016736409\t11714.0\n14476\t-73.685253\t40.720106\tStewart Manor village\tNY\tNew York\tNassau County\t1900\t42.1\t51.2\t5.1\t43354\t522881\t0.5328\t11001\tObama\t11001\t0.0034901959999999997\t11001.0\n14477\t-73.694222\t40.6422\tHewlett CDP\tNY\tNew York\tNassau County\t6974\t43.6\t47.2\t5.5\t52919\t455000\t0.5328\t11557\tObama\t11557\t0.012810857\t11557.0\n14478\t-73.66511899999999\t40.60187\tHarbor Isle CDP\tNY\tNew York\tNassau County\t1331\t45.6\t32.2\t7.7\t43893\t448819\t0.5328\t11558\tObama\t11558\t0.002444974\t11558.0\n14479\t-73.674188\t40.65785\tLynbrook village\tNY\tNew York\tNassau County\t19902\t43.0\t36.2\t7.4\t36270\t384009\t0.5328\t11563\tObama\t11563\t0.036558887000000005\t11563.0\n14480\t-73.638245\t40.664221000000005\tRockville Centre village\tNY\tNew York\tNassau County\t24386\t43.0\t56.4\t6.1\t52074\t617974\t0.5328\t11570\tObama\t11570\t0.04479575\t11570.0\n14481\t-73.612134\t40.750032\tCarle Place CDP\tNY\tNew York\tNassau County\t5186\t41.5\t40.7\t7.1\t37811\t421212\t0.5328\t11514\tObama\t11514\t0.009526399\t11514.0\n14482\t-73.633762\t40.760977000000004\tEast Williston village\tNY\tNew York\tNassau County\t2466\t45.0\t66.3\t4.7\t67715\t803931\t0.5328\t11596\tObama\t11596\t0.004529907\t11596.0\n14483\t-73.49981700000001\t40.884253\tCove Neck village\tNY\tNew York\tNassau County\t304\t46.3\t77.1\t3.5\t95296\t1000001\t0.5328\t11771\tObama\t11771\t0.000558431\t11771.0\n14484\t-73.730317\t40.58814\tAtlantic Beach village\tNY\tNew York\tNassau County\t1923\t47.8\t54.2\t4.6\t57789\t683995\t0.5328\t11509\tObama\t11509\t0.003532446\t11509.0\n14485\t-73.639174\t40.747038\tMineola village\tNY\tNew York\tNassau County\t18990\t40.9\t36.3\t6.7\t38364\t433278\t0.5328\t11501\tObama\t11501\t0.034883593\t11501.0\n14486\t-73.708904\t40.768194\tLake Success village\tNY\tNew York\tNassau County\t2829\t54.0\t63.2\t4.0\t68998\t1000001\t0.5328\t11020\tObama\t11020\t0.0051967179999999995\t11020.0\n14487\t-73.64816400000001\t40.771617\tAlbertson CDP\tNY\tNew York\tNassau County\t5148\t43.4\t46.8\t5.3\t41665\t510081\t0.5328\t11507\tObama\t11507\t0.009456595\t11507.0\n14488\t-73.664287\t40.681622\tMalverne Park Oaks CDP\tNY\tNew York\tNassau County\t466\t42.8\t48.0\t0.0\t38553\t498113\t0.5328\t11565\tObama\t11565\t0.0008560169999999999\t11565.0\n14489\t-73.749162\t40.794765000000005\tSaddle Rock village\tNY\tNew York\tNassau County\t790\t51.0\t66.8\t4.4\t76581\t1000001\t0.5328\t11023\tObama\t11023\t0.001451187\t11023.0\n14490\t-73.71333\t40.840653\tManorhaven village\tNY\tNew York\tNassau County\t6247\t40.3\t48.1\t8.2\t48259\t503594\t0.5328\t110HH\tObama\t110HH\t0.011475398000000001\t0.0\n14491\t-73.470385\t40.817644\tWoodbury CDP\tNY\tNew York\tNassau County\t9619\t46.7\t65.0\t4.7\t71723\t949952\t0.5328\t11797\tObama\t11797\t0.017669578000000002\t11797.0\n14492\t-73.680989\t40.759045\tManhasset Hills CDP\tNY\tNew York\tNassau County\t3680\t47.5\t63.6\t6.4\t64211\t811187\t0.5328\t11042\tObama\t11042\t0.006759959\t11042.0\n14493\t-73.470617\t40.669216\tMassapequa CDP\tNY\tNew York\tNassau County\t22422\t42.3\t40.2\t6.1\t42377\t490795\t0.5328\t11758\tObama\t11758\t0.041187989\t11758.0\n14494\t-73.660438\t40.712165999999996\tGarden City South CDP\tNY\tNew York\tNassau County\t3918\t42.1\t38.6\t6.7\t38533\t487115\t0.5328\t11010\tObama\t11010\t0.007197151999999999\t11010.0\n14495\t-73.704278\t40.66465\tValley Stream village\tNY\tNew York\tNassau County\t36009\t41.1\t30.8\t6.3\t34515\t362143\t0.5328\t11580\tObama\t11580\t0.06614656599999999\t11580.0\n14496\t-73.673683\t40.668611\tNorth Lynbrook CDP\tNY\tNew York\tNassau County\t742\t47.4\t37.0\t8.3\t36065\t424000\t0.5328\t11565\tObama\t11565\t0.001363013\t11565.0\n14497\t-73.677847\t40.776463\tNorth Hills village\tNY\tNew York\tNassau County\t5134\t54.3\t68.5\t4.9\t106059\t1000001\t0.5328\t11042\tObama\t11042\t0.009430878\t11042.0\n14498\t-73.666722\t40.63081\tBay Park CDP\tNY\tNew York\tNassau County\t2296\t41.5\t30.5\t5.3\t39308\t369231\t0.5328\t11518\tObama\t11518\t0.004217627\t11518.0\n14499\t-73.61925\t40.704313\tHempstead village\tNY\tNew York\tNassau County\t54147\t32.7\t20.2\t10.5\t21680\t294469\t0.5328\t11550\tObama\t11550\t0.099465082\t11550.0\n14500\t-73.562574\t40.847621000000004\tUpper Brookville village\tNY\tNew York\tNassau County\t1814\t44.1\t64.5\t5.2\t79380\t1000001\t0.5328\t11732\tObama\t11732\t0.0033322190000000004\t11732.0\n14501\t-73.694749\t40.833767\tBaxter Estates village\tNY\tNew York\tNassau County\t977\t40.4\t61.4\t7.1\t63868\t805743\t0.5328\t11050\tObama\t11050\t0.0017946960000000001\t11050.0\n14502\t-73.706746\t40.621442\tWoodsburgh village\tNY\tNew York\tNassau County\t852\t43.0\t78.6\t5.4\t84865\t1000001\t0.5328\t11598\tObama\t11598\t0.0015650770000000002\t11598.0\n14503\t-73.733486\t40.802878\tGreat Neck village\tNY\tNew York\tNassau County\t9744\t40.6\t57.6\t5.7\t54833\t839365\t0.5328\t11023\tObama\t11023\t0.017899196000000003\t11023.0\n14504\t-73.585099\t40.651866999999996\tFreeport village\tNY\tNew York\tNassau County\t44246\t36.3\t25.7\t8.6\t27248\t318883\t0.5328\t11520\tObama\t11520\t0.081277485\t11520.0\n14505\t-73.663593\t40.756667\tHerricks CDP\tNY\tNew York\tNassau County\t4048\t43.3\t45.3\t4.7\t39778\t553336\t0.5328\t11507\tObama\t11507\t0.007435955\t11507.0\n14506\t-73.626535\t40.811915\tGreenvale CDP\tNY\tNew York\tNassau County\t998\t24.4\t52.6\t4.3\t51353\t607759\t0.5328\t11548\tObama\t11548\t0.001833271\t11548.0\n14507\t-73.583737\t40.679727\tRoosevelt CDP\tNY\tNew York\tNassau County\t15554\t33.4\t18.7\t10.1\t22538\t275670\t0.5328\t11575\tObama\t11575\t0.028571847999999997\t11575.0\n14508\t-73.650754\t40.695852\tWest Hempstead CDP\tNY\tNew York\tNassau County\t18587\t39.9\t41.5\t6.8\t34637\t381587\t0.5328\t11552\tObama\t11552\t0.034143304\t11552.0\n14509\t-73.508797\t40.698341\tNorth Wantagh CDP\tNY\tNew York\tNassau County\t11950\t42.4\t40.0\t7.4\t38400\t377843\t0.5328\t11793\tObama\t11793\t0.021951497\t11793.0\n14510\t-73.58149\t40.863981\tMatinecock village\tNY\tNew York\tNassau County\t845\t42.0\t66.7\t4.7\t81448\t1000001\t0.5328\t11560\tObama\t11560\t0.0015522189999999999\t11560.0\n14511\t-73.59701899999999\t40.892094\tLattingtown village\tNY\tNew York\tNassau County\t1885\t43.7\t67.6\t4.9\t86396\t1000001\t0.5328\t11560\tObama\t11560\t0.003462642\t11560.0\n14512\t-73.725036\t40.722224\tBellerose Terrace CDP\tNY\tNew York\tNassau County\t2133\t38.5\t36.5\t4.4\t30944\t353469\t0.5328\t11426\tObama\t11426\t0.003918204000000001\t11426.0\n14513\t-73.529834\t40.661570000000005\tBellmore CDP\tNY\tNew York\tNassau County\t16286\t42.2\t44.3\t6.4\t42356\t436353\t0.5328\t11710\tObama\t11710\t0.029916492000000003\t11710.0\n14514\t-73.52078900000001\t40.901832\tCentre Island village\tNY\tNew York\tNassau County\t456\t46.9\t63.9\t4.7\t98864\t1000001\t0.5328\t11771\tObama\t11771\t0.000837647\t11771.0\n14515\t-73.748388\t40.789218\tHarbor Hills CDP\tNY\tNew York\tNassau County\t559\t40.2\t70.0\t6.6\t80036\t1000001\t0.5328\t11363\tObama\t11363\t0.001026852\t11363.0\n14516\t-73.717202\t40.604925\tLawrence village\tNY\tNew York\tNassau County\t6511\t39.3\t70.3\t4.2\t64387\t937660\t0.5328\t11559\tObama\t11559\t0.011960351000000001\t11559.0\n14517\t-73.560532\t40.719729\tEast Meadow CDP\tNY\tNew York\tNassau County\t37224\t41.0\t35.3\t6.5\t36149\t368990\t0.5328\t11554\tObama\t11554\t0.068378455\t11554.0\n14518\t-73.542016\t40.787585\tJericho CDP\tNY\tNew York\tNassau County\t12969\t45.5\t66.9\t5.3\t62373\t711616\t0.5328\t11753\tObama\t11753\t0.023823345\t11753.0\n14519\t-73.69424000000001\t40.788528\tManhasset CDP\tNY\tNew York\tNassau County\t8368\t43.1\t56.2\t6.4\t55822\t884211\t0.5328\t11030\tObama\t11030\t0.015371559\t11030.0\n14520\t-73.556551\t40.882565\tMill Neck village\tNY\tNew York\tNassau County\t829\t43.9\t65.8\t5.2\t86121\t1000001\t0.5328\t11765\tObama\t11765\t0.001522828\t11765.0\n14521\t-73.529117\t40.849537\tEast Norwich CDP\tNY\tNew York\tNassau County\t2720\t44.1\t52.3\t5.1\t49377\t616477\t0.5328\t11732\tObama\t11732\t0.004996491\t11732.0\n14522\t-73.71855500000001\t40.655928\tSouth Valley Stream CDP\tNY\tNew York\tNassau County\t5682\t46.2\t56.8\t6.1\t40237\t451289\t0.5328\t11581\tObama\t11581\t0.010437524\t11581.0\n14523\t-73.612278\t40.590013\tLido Beach CDP\tNY\tNew York\tNassau County\t2768\t48.8\t62.1\t5.0\t65141\t657480\t0.5328\t11569\tObama\t11569\t0.005084665\t11569.0\n14524\t-73.74149\t40.793974\tSaddle Rock Estates CDP\tNY\tNew York\tNassau County\t418\t40.3\t87.6\t4.2\t86733\t1000001\t0.5328\t11023\tObama\t11023\t0.000767843\t11023.0\n14525\t-73.704889\t40.802121\tPlandome Heights village\tNY\tNew York\tNassau County\t950\t41.1\t76.2\t6.9\t71830\t1000001\t0.5328\t11030\tObama\t11030\t0.0017450979999999998\t11030.0\n14526\t-73.64462900000001\t40.726664\tGarden City village\tNY\tNew York\tNassau County\t21568\t42.9\t67.1\t6.3\t65400\t822761\t0.5328\t11530\tObama\t11530\t0.039619238\t11530.0\n14527\t-73.68796400000001\t40.746224\tNorth New Hyde Park CDP\tNY\tNew York\tNassau County\t14373\t44.6\t40.7\t5.1\t41562\t486315\t0.5328\t11040\tObama\t11040\t0.026402416\t11040.0\n14528\t-73.67749\t40.700134999999996\tFranklin Square CDP\tNY\tNew York\tNassau County\t29118\t41.4\t27.7\t5.7\t31695\t394274\t0.5328\t11010\tObama\t11010\t0.053488176\t11010.0\n14529\t-73.61795500000001\t40.844958\tGlen Head CDP\tNY\tNew York\tNassau County\t4608\t43.8\t46.4\t6.8\t51020\t635502\t0.5328\t11542\tObama\t11542\t0.008464644\t11542.0\n14530\t-73.646692\t40.758732\tWilliston Park village\tNY\tNew York\tNassau County\t7163\t41.5\t39.7\t6.2\t36818\t464201\t0.5328\t11596\tObama\t11596\t0.01315804\t11596.0\n14531\t-73.741017\t40.816495\tKings Point village\tNY\tNew York\tNassau County\t5152\t36.3\t69.8\t4.4\t70294\t1000001\t0.5328\t11024\tObama\t11024\t0.009463943\t11024.0\n14532\t-73.72784200000001\t40.625189\tCedarhurst village\tNY\tNew York\tNassau County\t6170\t40.9\t52.7\t4.6\t40929\t559397\t0.5328\t11516\tObama\t11516\t0.011333953\t11516.0\n14533\t-73.579939\t40.590387\tPoint Lookout CDP\tNY\tNew York\tNassau County\t1405\t45.3\t56.8\t9.1\t56866\t738057\t0.5328\t11569\tObama\t11569\t0.002580908\t11569.0\n14534\t-73.703813\t40.853099\tSands Point village\tNY\tNew York\tNassau County\t2752\t43.4\t77.8\t5.7\t95521\t1000001\t0.5328\t11050\tObama\t11050\t0.005055274\t11050.0\n14535\t-73.63775600000001\t40.829542\tGlenwood Landing CDP\tNY\tNew York\tNassau County\t3582\t43.7\t50.7\t6.9\t46361\t650412\t0.5328\t11547\tObama\t11547\t0.0065799380000000005\t11547.0\n14536\t-73.695351\t40.634694\tHewlett Bay Park village\tNY\tNew York\tNassau County\t479\t47.7\t73.9\t3.4\t97000\t1000001\t0.5328\t11557\tObama\t11557\t0.0008798969999999999\t11557.0\n14537\t-73.683667\t40.633547\tHewlett Harbor village\tNY\tNew York\tNassau County\t1265\t46.5\t71.0\t4.9\t88721\t1000001\t0.5328\t11557\tObama\t11557\t0.002323736\t11557.0\n14538\t-73.589156\t40.878182\tLocust Valley CDP\tNY\tNew York\tNassau County\t3476\t40.9\t38.8\t6.2\t48663\t572943\t0.5328\t11560\tObama\t11560\t0.006385221999999999\t11560.0\n14539\t-73.50195\t40.815725\tSyosset CDP\tNY\tNew York\tNassau County\t18307\t43.3\t60.7\t6.4\t49983\t615528\t0.5328\t11791\tObama\t11791\t0.033628959\t11791.0\n14540\t-73.664816\t40.587936\tLong Beach city\tNY\tNew York\tNassau County\t35347\t43.0\t43.6\t8.0\t40266\t379155\t0.5328\t11561\tObama\t11561\t0.064930508\t11561.0\n14541\t-73.664006\t40.743644\tGarden City Park CDP\tNY\tNew York\tNassau County\t7487\t43.0\t43.2\t5.9\t36999\t491049\t0.5328\t11040\tObama\t11040\t0.01375321\t11040.0\n14542\t-73.671912\t40.674512\tMalverne village\tNY\tNew York\tNassau County\t8807\t43.7\t43.6\t6.6\t39914\t434135\t0.5328\t11565\tObama\t11565\t0.016177978\t11565.0\n14543\t-73.707612\t40.703252\tElmont CDP\tNY\tNew York\tNassau County\t33193\t37.5\t26.9\t9.3\t28314\t347030\t0.5328\t11003\tObama\t11003\t0.060973728\t11003.0\n14544\t-73.436006\t40.67472\tEast Massapequa CDP\tNY\tNew York\tNassau County\t19815\t40.8\t39.7\t6.9\t37998\t389020\t0.5328\t11762\tObama\t11762\t0.036399073\t11762.0\n14545\t-73.74798\t40.620591\tInwood CDP\tNY\tNew York\tNassau County\t9339\t35.5\t14.0\t10.0\t21686\t337414\t0.5328\t11096\tObama\t11096\t0.017155233\t11096.0\n14546\t-73.64915\t40.677562\tLakeview CDP\tNY\tNew York\tNassau County\t5634\t38.6\t31.7\t9.1\t28310\t322487\t0.5328\t11570\tObama\t11570\t0.01034935\t11570.0\n14547\t-73.59813299999999\t40.73173\tEast Garden City CDP\tNY\tNew York\tNassau County\t5751\t23.1\t54.2\t8.1\t20481\t294415\t0.5328\t11514\tObama\t11514\t0.010564273\t11514.0\n14548\t-73.636776\t40.63369\tOceanside CDP\tNY\tNew York\tNassau County\t32402\t43.5\t43.0\t7.8\t39889\t426183\t0.5328\t11572\tObama\t11572\t0.059520704\t11572.0\n14549\t-73.72171800000001\t40.637532\tWoodmere CDP\tNY\tNew York\tNassau County\t16308\t41.8\t62.6\t3.7\t52666\t654832\t0.5328\t11598\tObama\t11598\t0.029956905\t11598.0\n14550\t-73.67613399999999\t40.825990999999995\tPort Washington CDP\tNY\tNew York\tNassau County\t15549\t42.3\t60.4\t5.6\t60090\t745605\t0.5328\t11050\tObama\t11050\t0.028562663999999998\t11050.0\n14551\t-73.64405\t40.844072\tSea Cliff village\tNY\tNew York\tNassau County\t5087\t45.4\t64.4\t4.7\t54611\t681284\t0.5328\t11579\tObama\t11579\t0.009344541\t11579.0\n14552\t-73.629194\t40.795840999999996\tEast Hills village\tNY\tNew York\tNassau County\t6779\t43.2\t78.6\t6.2\t76709\t1000001\t0.5328\t11577\tObama\t11577\t0.012452653000000001\t11577.0\n14553\t-73.660325\t40.770419\tSearingtown CDP\tNY\tNew York\tNassau County\t4983\t45.2\t63.7\t4.3\t62515\t844737\t0.5328\t11507\tObama\t11507\t0.009153499\t11507.0\n14554\t-73.698045\t40.814847\tPlandome Manor village\tNY\tNew York\tNassau County\t838\t42.3\t74.3\t3.1\t90955\t1000001\t0.5328\t11050\tObama\t11050\t0.00153936\t11050.0\n14555\t-73.628321\t40.870785\tGlen Cove city\tNY\tNew York\tNassau County\t27326\t41.0\t33.8\t9.0\t33999\t480824\t0.5328\t11542\tObama\t11542\t0.050196369000000005\t11542.0\n14556\t-73.564986\t40.76003\tNew Cassel CDP\tNY\tNew York\tNassau County\t14342\t31.4\t14.0\t8.7\t19291\t296255\t0.5328\t11590\tObama\t11590\t0.026345471000000002\t11590.0\n14557\t-73.675836\t40.807571\tFlower Hill village\tNY\tNew York\tNassau County\t4496\t43.1\t68.0\t7.6\t76056\t1000001\t0.5328\t11030\tObama\t11030\t0.008258906\t11030.0\n14558\t-73.725523\t40.78087\tRussell Gardens village\tNY\tNew York\tNassau County\t1088\t42.7\t76.3\t6.9\t72986\t907609\t0.5328\t11021\tObama\t11021\t0.001998597\t11021.0\n14559\t-73.446572\t40.733153\tFarmingdale village\tNY\tNew York\tNassau County\t8372\t41.4\t34.9\t7.1\t37084\t359072\t0.5328\t11735\tObama\t11735\t0.015378906999999999\t11735.0\n14560\t-73.61041999999999\t40.663431\tBaldwin CDP\tNY\tNew York\tNassau County\t23146\t40.0\t42.2\t7.2\t35549\t351847\t0.5328\t11510\tObama\t11510\t0.042517938\t11510.0\n14561\t-73.512569\t40.724206\tLevittown CDP\tNY\tNew York\tNassau County\t52421\t40.4\t27.8\t6.8\t34326\t342863\t0.5328\t11756\tObama\t11756\t0.096294514\t11756.0\n14562\t-73.739299\t40.785955\tGreat Neck Estates village\tNY\tNew York\tNassau County\t2747\t42.3\t74.3\t5.1\t78070\t1000001\t0.5328\t11021\tObama\t11021\t0.005046089\t11021.0\n14563\t-73.524527\t40.763798\tHicksville CDP\tNY\tNew York\tNassau County\t40863\t41.4\t31.6\t6.4\t34909\t369656\t0.5328\t11801\tObama\t11801\t0.07506309900000001\t11801.0\n14564\t-73.44731800000001\t40.717449\tSouth Farmingdale CDP\tNY\tNew York\tNassau County\t14810\t40.8\t28.0\t5.6\t33456\t365835\t0.5328\t11735\tObama\t11735\t0.027205161000000002\t11735.0\n14565\t-73.69958000000001\t40.806978\tPlandome village\tNY\tNew York\tNassau County\t1260\t44.5\t81.9\t7.0\t92217\t1000001\t0.5328\t11030\tObama\t11030\t0.002314551\t11030.0\n14566\t-73.722216\t40.793093\tKensington village\tNY\tNew York\tNassau County\t1217\t46.0\t78.1\t4.1\t72126\t1000001\t0.5328\t11021\tObama\t11021\t0.002235563\t11021.0\n14567\t-73.510175\t40.670883\tWantagh CDP\tNY\tNew York\tNassau County\t18811\t41.1\t44.6\t6.4\t42094\t453727\t0.5328\t11793\tObama\t11793\t0.03455478\t11793.0\n14568\t-73.639585\t40.778726\tRoslyn Heights CDP\tNY\tNew York\tNassau County\t6266\t41.6\t56.8\t7.2\t50578\t695503\t0.5328\t11577\tObama\t11577\t0.0115103\t11577.0\n14569\t-73.597427\t40.786590999999994\tOld Westbury village\tNY\tNew York\tNassau County\t4391\t35.7\t67.4\t7.8\t66881\t1000001\t0.5328\t11568\tObama\t11568\t0.008066027\t11568.0\n14570\t-73.475627\t40.853957\tLaurel Hollow village\tNY\tNew York\tNassau County\t1931\t44.3\t74.2\t4.7\t91711\t1000001\t0.5328\t11724\tObama\t11724\t0.003547142\t11724.0\n14571\t-73.605106\t40.631609000000005\tBaldwin Harbor CDP\tNY\tNew York\tNassau County\t8030\t42.1\t47.9\t5.3\t44150\t409133\t0.5328\t11510\tObama\t11510\t0.014750671000000002\t11510.0\n14572\t-73.503893\t40.856766\tOyster Bay Cove village\tNY\tNew York\tNassau County\t2260\t44.0\t73.9\t4.8\t91208\t1000001\t0.5328\t11771\tObama\t11771\t0.0041514970000000005\t11771.0\n14573\t-73.70772099999999\t40.684055\tNorth Valley Stream CDP\tNY\tNew York\tNassau County\t16026\t39.4\t34.4\t8.7\t33090\t365379\t0.5328\t11580\tObama\t11580\t0.029438887\t11580.0\n14574\t-73.68570600000001\t40.732369\tNew Hyde Park village\tNY\tNew York\tNassau County\t9435\t41.9\t34.2\t6.6\t32911\t450321\t0.5328\t11040\tObama\t11040\t0.01733158\t11040.0\n14575\t-73.58935100000001\t40.759962\tWestbury village\tNY\tNew York\tNassau County\t14805\t39.5\t37.8\t8.6\t35724\t385512\t0.5328\t11590\tObama\t11590\t0.027195976\t11590.0\n14576\t-73.47317\t40.783221999999995\tPlainview CDP\tNY\tNew York\tNassau County\t26548\t44.4\t55.6\t6.3\t47060\t560614\t0.5328\t11803\tObama\t11803\t0.048767226\t11803.0\n14577\t-73.64794499999999\t40.606888\tBarnum Island CDP\tNY\tNew York\tNassau County\t2438\t44.6\t28.3\t9.9\t42636\t437433\t0.5328\t11558\tObama\t11558\t0.004478473\t11558.0\n14578\t-73.716523\t40.724346000000004\tBellerose village\tNY\tNew York\tNassau County\t1157\t41.1\t55.7\t5.1\t44321\t531627\t0.5328\t11426\tObama\t11426\t0.002125346\t11426.0\n14579\t-73.702908\t40.722609999999996\tFloral Park village\tNY\tNew York\tNassau County\t15903\t42.4\t43.5\t5.4\t39387\t485891\t0.5328\t11001\tObama\t11001\t0.029212942000000002\t11001.0\n14580\t-73.727602\t40.775357\tUniversity Gardens CDP\tNY\tNew York\tNassau County\t4131\t44.5\t60.2\t5.6\t49115\t610587\t0.5328\t11020\tObama\t11020\t0.007588421\t11020.0\n14581\t-73.708966\t40.586371\tEast Atlantic Beach CDP\tNY\tNew York\tNassau County\t2237\t44.8\t46.8\t5.3\t49850\t688424\t0.5328\t11509\tObama\t11509\t0.004109247\t11509.0\n14582\t-73.66719599999999\t40.643157\tEast Rockaway village\tNY\tNew York\tNassau County\t10331\t42.1\t40.1\t5.6\t39613\t424067\t0.5328\t11518\tObama\t11518\t0.018977483\t11518.0\n14583\t-73.48508100000001\t40.749486\tBethpage CDP\tNY\tNew York\tNassau County\t16778\t43.2\t31.7\t5.7\t36917\t390146\t0.5328\t11714\tObama\t11714\t0.03082027\t11714.0\n14584\t-73.561971\t40.907637\tBayville village\tNY\tNew York\tNassau County\t7122\t43.2\t41.2\t5.8\t49853\t567428\t0.5328\t11709\tObama\t11709\t0.013082725\t11709.0\n14585\t-73.603874\t40.833187\tOld Brookville village\tNY\tNew York\tNassau County\t2183\t44.8\t63.5\t4.3\t72092\t1000001\t0.5328\t11545\tObama\t11545\t0.004010052\t11545.0\n14586\t-73.726238\t40.78688\tGreat Neck Plaza village\tNY\tNew York\tNassau County\t6536\t49.1\t64.9\t5.3\t63538\t392486\t0.5328\t11021\tObama\t11021\t0.012006275\t11021.0\n14587\t-73.649314\t40.798987\tRoslyn village\tNY\tNew York\tNassau County\t2833\t48.5\t64.6\t6.5\t77214\t759291\t0.5328\t11576\tObama\t11576\t0.005204065999999999\t11576.0\n14588\t-73.700276\t40.713635\tSouth Floral Park village\tNY\tNew York\tNassau County\t1615\t39.1\t29.0\t10.6\t25729\t347953\t0.5328\t11001\tObama\t11001\t0.002966667\t11001.0\n14589\t-73.623326\t40.681494\tSouth Hempstead CDP\tNY\tNew York\tNassau County\t3185\t39.8\t43.1\t5.9\t39870\t358380\t0.5328\t11550\tObama\t11550\t0.005850671\t11550.0\n14590\t-73.661503\t40.793853000000006\tRoslyn Estates village\tNY\tNew York\tNassau County\t1194\t44.1\t81.2\t3.9\t83533\t1000001\t0.5328\t11576\tObama\t11576\t0.0021933129999999997\t11576.0\n14591\t-73.539013\t40.690354\tNorth Bellmore CDP\tNY\tNew York\tNassau County\t20058\t41.5\t37.2\t5.5\t36469\t390484\t0.5328\t11710\tObama\t11710\t0.03684545\t11710.0\n14592\t-73.49215\t40.667961\tSeaford CDP\tNY\tNew York\tNassau County\t15688\t41.3\t37.3\t5.7\t38740\t419143\t0.5328\t11783\tObama\t11783\t0.028817999\t11783.0\n14593\t-73.722732\t40.796911\tGreat Neck Gardens CDP\tNY\tNew York\tNassau County\t1094\t45.7\t83.7\t1.3\t66438\t896774\t0.5328\t11021\tObama\t11021\t0.002009618\t11021.0\n14594\t-73.561512\t40.687090999999995\tNorth Merrick CDP\tNY\tNew York\tNassau County\t11775\t42.3\t39.6\t6.0\t39077\t416433\t0.5328\t11566\tObama\t11566\t0.021630032\t11566.0\n14595\t-73.449533\t40.682325\tMassapequa Park village\tNY\tNew York\tNassau County\t17264\t42.0\t37.9\t4.5\t39652\t421555\t0.5328\t11762\tObama\t11762\t0.031713025\t11762.0\n14596\t-73.560434\t40.745364\tSalisbury CDP\tNY\tNew York\tNassau County\t12185\t42.0\t41.3\t6.6\t36410\t378764\t0.5328\t11590\tObama\t11590\t0.022383179\t11590.0\n14597\t-73.46812299999999\t40.703083\tNorth Massapequa CDP\tNY\tNew York\tNassau County\t18888\t41.6\t29.1\t7.3\t34343\t405203\t0.5328\t11758\tObama\t11758\t0.034696224\t11758.0\n14598\t-73.698358\t40.624779\tHewlett Neck village\tNY\tNew York\tNassau County\t506\t44.3\t79.8\t5.7\t85687\t1000001\t0.5328\t11557\tObama\t11557\t0.0009294939999999999\t11557.0\n14599\t-73.590946\t40.70197\tUniondale CDP\tNY\tNew York\tNassau County\t23470\t35.3\t25.5\t9.4\t24921\t298310\t0.5328\t11553\tObama\t11553\t0.043113108\t11553.0\n14600\t-73.715202\t40.787559\tThomaston village\tNY\tNew York\tNassau County\t2628\t43.8\t67.0\t10.4\t63485\t782738\t0.5328\t11021\tObama\t11021\t0.004827492\t11021.0\n14601\t-73.656052\t40.604164000000004\tIsland Park village\tNY\tNew York\tNassau County\t4691\t40.1\t20.2\t7.4\t30927\t346362\t0.5328\t11558\tObama\t11558\t0.008617111\t11558.0\n14602\t-73.53241899999999\t40.866106\tOyster Bay CDP\tNY\tNew York\tNassau County\t6801\t42.1\t50.0\t6.0\t45005\t555476\t0.5328\t11771\tObama\t11771\t0.012493066\t11771.0\n14603\t-73.63801\t40.815827\tRoslyn Harbor village\tNY\tNew York\tNassau County\t943\t44.9\t63.9\t5.3\t76795\t822222\t0.5328\t11548\tObama\t11548\t0.001732239\t11548.0\n14604\t-73.53621\t40.825261\tMuttontown village\tNY\tNew York\tNassau County\t3422\t43.3\t70.7\t4.8\t85808\t1000001\t0.5328\t11732\tObama\t11732\t0.006286027\t11732.0\n14605\t-73.569843\t40.812395\tBrookville village\tNY\tNew York\tNassau County\t3533\t28.3\t60.9\t5.7\t60600\t1000001\t0.5328\t11545\tObama\t11545\t0.006489928000000001\t11545.0\n14606\t-73.701284\t40.843752\tPort Washington North village\tNY\tNew York\tNassau County\t3020\t43.4\t65.4\t6.2\t69496\t808123\t0.5328\t11050\tObama\t11050\t0.005547575\t11050.0\n14607\t-73.45399499999999\t40.756142\tOld Bethpage CDP\tNY\tNew York\tNassau County\t5362\t44.1\t57.2\t7.3\t44702\t559531\t0.5328\t11804\tObama\t11804\t0.009849700999999999\t11804.0\n14608\t-73.55573100000001\t40.654472999999996\tMerrick CDP\tNY\tNew York\tNassau County\t22528\t42.7\t53.4\t6.5\t48365\t537699\t0.5328\t11566\tObama\t11566\t0.041382706\t11566.0\n14609\t-73.680072\t40.799165\tMunsey Park village\tNY\tNew York\tNassau County\t2590\t41.0\t79.1\t4.9\t75003\t1000001\t0.5328\t11030\tObama\t11030\t0.004757689\t11030.0\n14610\t-78.576387\t43.195028\tGasport CDP\tNY\tNew York\tNiagara County\t1226\t42.6\t19.8\t9.7\t26315\t144922\t0.4942\t14067\tObama\t14067\t0.002252095\t14067.0\n14611\t-78.911378\t43.238785\tRansomville CDP\tNY\tNew York\tNiagara County\t1394\t41.5\t22.8\t6.8\t26522\t137171\t0.4942\t14131\tObama\t14131\t0.002560702\t14131.0\n14612\t-79.03859200000001\t43.171788\tLewiston village\tNY\tNew York\tNiagara County\t2638\t49.8\t29.0\t9.4\t25656\t148711\t0.4942\t14092\tObama\t14092\t0.004845862\t14092.0\n14613\t-78.64410500000001\t43.097628\tRapids CDP\tNY\tNew York\tNiagara County\t1539\t32.4\t24.3\t5.6\t27747\t145673\t0.4942\t14094\tObama\t14094\t0.0028270590000000003\t14094.0\n14614\t-78.710424\t43.330028000000006\tOlcott CDP\tNY\tNew York\tNiagara County\t994\t45.4\t13.2\t12.6\t26682\t117857\t0.4942\t14028\tObama\t14028\t0.001825924\t14028.0\n14615\t-79.042153\t43.249376\tYoungstown village\tNY\tNew York\tNiagara County\t1870\t43.7\t34.0\t6.9\t31420\t172125\t0.4942\t14174\tObama\t14174\t0.0034350879999999998\t14174.0\n14616\t-79.013576\t43.095369\tNiagara Falls city\tNY\tNew York\tNiagara County\t50795\t40.3\t16.0\t13.1\t20929\t94002\t0.4942\t14303\tObama\t14303\t0.093307641\t14303.0\n14617\t-78.696968\t43.169584\tLockport city\tNY\tNew York\tNiagara County\t20527\t37.8\t22.0\t9.4\t23794\t113429\t0.4942\t14094\tObama\t14094\t0.037706977999999995\t14094.0\n14618\t-78.475773\t43.211731\tMiddleport village\tNY\tNew York\tNiagara County\t1811\t36.0\t12.9\t8.4\t19165\t111570\t0.4942\t14105\tObama\t14105\t0.003326708\t14105.0\n14619\t-78.863899\t43.046386\tNorth Tonawanda city\tNY\tNew York\tNiagara County\t31754\t40.7\t23.8\t8.8\t25308\t135246\t0.4942\t14120\tObama\t14120\t0.058330364\t14120.0\n14620\t-78.826025\t43.309515999999995\tWilson village\tNY\tNew York\tNiagara County\t1223\t45.1\t21.4\t12.0\t24935\t130435\t0.4942\t14172\tObama\t14172\t0.002246584\t14172.0\n14621\t-78.553546\t43.328303999999996\tBarker village\tNY\tNew York\tNiagara County\t541\t38.5\t14.4\t12.9\t22671\t130000\t0.4942\t14012\tObama\t14012\t0.0009937869999999999\t14012.0\n14622\t-78.69386\t43.288823\tNewfane CDP\tNY\tNew York\tNiagara County\t2981\t41.2\t14.3\t7.5\t23210\t122991\t0.4942\t14108\tObama\t14108\t0.005475934\t14108.0\n14623\t-78.686314\t43.137627\tSouth Lockport CDP\tNY\tNew York\tNiagara County\t8557\t38.8\t21.6\t7.9\t24522\t103756\t0.4942\t14094\tObama\t14094\t0.015718742\t14094.0\n14624\t-75.463437\t42.938041\tOriskany Falls village\tNY\tNew York\tOneida County\t739\t39.6\t13.5\t9.0\t22876\t130556\t0.4668\t13425\tObama\t13425\t0.001357503\t13425.0\n14625\t-75.288503\t43.070809000000004\tNew Hartford village\tNY\tNew York\tOneida County\t1803\t44.9\t44.4\t4.7\t28992\t172759\t0.4668\t13413\tObama\t13413\t0.003312013\t13413.0\n14626\t-75.49085699999999\t43.225894\tRome city\tNY\tNew York\tOneida County\t33755\t38.3\t19.6\t9.3\t22454\t122395\t0.4668\t13440\tObama\t13440\t0.062006091\t13440.0\n14627\t-75.723272\t43.206113\tSylvan Beach village\tNY\tNew York\tOneida County\t1062\t42.9\t11.7\t9.0\t22206\t98478\t0.4668\t13308\tObama\t13308\t0.001950836\t13308.0\n14628\t-75.37850300000001\t43.049057\tClinton village\tNY\tNew York\tOneida County\t1882\t46.8\t50.2\t3.4\t28634\t191071\t0.4668\t13323\tObama\t13323\t0.0034571309999999996\t13323.0\n14629\t-75.330108\t43.481131\tBoonville village\tNY\tNew York\tOneida County\t2081\t44.2\t16.1\t10.7\t22007\t131589\t0.4668\t13309\tObama\t13309\t0.003822683\t13309.0\n14630\t-75.296548\t43.10114\tNew York Mills village\tNY\tNew York\tOneida County\t3232\t43.6\t18.6\t6.9\t27076\t147696\t0.4668\t13417\tObama\t13417\t0.005937006999999999\t13417.0\n14631\t-75.248548\t42.974164\tClayville village\tNY\tNew York\tOneida County\t497\t42.3\t14.1\t5.1\t20232\t163462\t0.4668\t13322\tObama\t13322\t0.000912962\t13322.0\n14632\t-75.273878\t43.112443\tYorkville village\tNY\tNew York\tOneida County\t2534\t39.1\t14.8\t5.7\t24472\t124454\t0.4668\t13495\tObama\t13495\t0.00465482\t13495.0\n14633\t-75.33339000000001\t43.15701\tOriskany village\tNY\tNew York\tOneida County\t1421\t45.0\t17.2\t6.0\t19885\t144375\t0.4668\t13424\tObama\t13424\t0.002610299\t13424.0\n14634\t-75.256876\t43.241594\tHolland Patent village\tNY\tNew York\tOneida County\t480\t41.7\t26.5\t6.7\t29951\t158929\t0.4668\t13354\tObama\t13354\t0.0008817339999999999\t13354.0\n14635\t-75.151453\t43.304454\tProspect village\tNY\tNew York\tOneida County\t332\t44.3\t31.9\t3.6\t27906\t168750\t0.4668\t134HH\tObama\t134HH\t0.000609866\t0.0\n14636\t-75.189148\t43.273724\tBarneveld village\tNY\tNew York\tOneida County\t334\t44.2\t32.4\t3.6\t27911\t167969\t0.4668\t13304\tObama\t13304\t0.00061354\t13304.0\n14637\t-75.374877\t43.086705\tClark Mills CDP\tNY\tNew York\tOneida County\t1421\t40.5\t13.3\t10.3\t26049\t73816\t0.4668\t13323\tObama\t13323\t0.002610299\t13323.0\n14638\t-75.633229\t43.081408\tOneida Castle village\tNY\tNew York\tOneida County\t587\t42.9\t23.1\t9.4\t22034\t149419\t0.4668\t13421\tObama\t13421\t0.001078287\t13421.0\n14639\t-75.38075500000001\t42.930403000000005\tWaterville village\tNY\tNew York\tOneida County\t1661\t40.2\t22.7\t5.3\t21042\t150169\t0.4668\t13480\tObama\t13480\t0.0030511659999999997\t13480.0\n14640\t-75.296778\t43.123951\tWhitesboro village\tNY\tNew York\tOneida County\t3765\t40.2\t20.7\t6.6\t23783\t127966\t0.4668\t13492\tObama\t13492\t0.006916099\t13492.0\n14641\t-75.537914\t43.079723\tVernon village\tNY\tNew York\tOneida County\t1136\t41.7\t20.0\t8.6\t21495\t147692\t0.4668\t13476\tObama\t13476\t0.00208677\t13476.0\n14642\t-75.74821800000001\t43.336428000000005\tCamden village\tNY\tNew York\tOneida County\t2209\t39.7\t14.9\t6.6\t19859\t132765\t0.4668\t13316\tObama\t13316\t0.004057812\t13316.0\n14643\t-75.601235\t43.070795000000004\tSherrill city\tNY\tNew York\tOneida County\t3067\t42.9\t27.9\t4.1\t24537\t171165\t0.4668\t13461\tObama\t13461\t0.005633911\t13461.0\n14644\t-75.186971\t43.328174\tRemsen village\tNY\tNew York\tOneida County\t599\t37.3\t18.6\t6.9\t20548\t129583\t0.4668\t13438\tObama\t13438\t0.00110033\t13438.0\n14645\t-75.250991\t42.877537\tBridgewater village\tNY\tNew York\tOneida County\t580\t35.8\t12.4\t5.1\t16720\t62500\t0.4668\t13313\tObama\t13313\t0.001065428\t13313.0\n14646\t-75.22708100000001\t43.096414\tUtica city\tNY\tNew York\tOneida County\t58859\t38.8\t18.2\t9.0\t19139\t107939\t0.4668\t13501\tObama\t13501\t0.108120768\t13501.0\n14647\t-76.20926700000001\t43.106138\tLiverpool village\tNY\tNew York\tOnondaga County\t2340\t42.8\t34.7\t5.6\t28692\t140724\t0.5972\t13088\tObama\t13088\t0.004298452\t13088.0\n14648\t-76.47285600000001\t43.067087\tJordan village\tNY\tNew York\tOnondaga County\t1282\t41.1\t20.4\t7.8\t22441\t134539\t0.5972\t13080\tObama\t13080\t0.0023549639999999998\t13080.0\n14649\t-76.109373\t42.797206\tTully village\tNY\tNew York\tOnondaga County\t979\t36.9\t35.8\t6.9\t28571\t168910\t0.5972\t13159\tObama\t13159\t0.00179837\t13159.0\n14650\t-76.33212900000001\t43.15721\tBaldwinsville village\tNY\tNew York\tOnondaga County\t7216\t40.3\t31.9\t7.5\t26356\t145973\t0.5972\t13027\tObama\t13027\t0.013255398\t13027.0\n14651\t-76.130553\t43.13384\tNorth Syracuse village\tNY\tNew York\tOnondaga County\t6578\t41.1\t16.3\t8.2\t25736\t117206\t0.5972\t13212\tObama\t13212\t0.012083426999999999\t13212.0\n14652\t-76.442396\t43.036257\tElbridge village\tNY\tNew York\tOnondaga County\t1111\t41.1\t24.3\t8.0\t23021\t144737\t0.5972\t13060\tObama\t13060\t0.0020408460000000002\t13060.0\n14653\t-76.008189\t43.030747999999996\tFayetteville village\tNY\tNew York\tOnondaga County\t4079\t43.3\t61.7\t7.0\t38821\t198116\t0.5972\t13066\tObama\t13066\t0.0074929\t13066.0\n14654\t-76.287409\t43.120088\tSeneca Knolls CDP\tNY\tNew York\tOnondaga County\t2078\t41.0\t13.2\t9.2\t23614\t105184\t0.5972\t130HH\tObama\t130HH\t0.003817173\t0.0\n14655\t-76.309202\t43.038818\tCamillus village\tNY\tNew York\tOnondaga County\t1282\t35.1\t23.3\t9.5\t25735\t123485\t0.5972\t13031\tObama\t13031\t0.0023549639999999998\t13031.0\n14656\t-76.138824\t43.099212\tMattydale CDP\tNY\tNew York\tOnondaga County\t6080\t39.4\t11.0\t7.5\t23321\t102439\t0.5972\t13211\tObama\t13211\t0.011168628\t13211.0\n14657\t-76.21239\t43.057199\tSolvay village\tNY\tNew York\tOnondaga County\t6533\t40.1\t21.7\t6.7\t23966\t135802\t0.5972\t13219\tObama\t13219\t0.012000763999999999\t13219.0\n14658\t-76.143776\t43.040904\tSyracuse city\tNY\tNew York\tOnondaga County\t141015\t31.1\t26.5\t11.7\t19522\t112347\t0.5972\t13202\tObama\t13202\t0.259036853\t13202.0\n14659\t-76.217517\t43.039916\tWestvale CDP\tNY\tNew York\tOnondaga County\t4925\t47.0\t41.2\t5.3\t29237\t168630\t0.5972\t13219\tObama\t13219\t0.009046956\t13219.0\n14660\t-76.248427\t43.041429\tFairmount CDP\tNY\tNew York\tOnondaga County\t10258\t44.8\t28.1\t6.0\t28367\t143322\t0.5972\t13219\tObama\t13219\t0.018843386\t13219.0\n14661\t-76.428188\t42.945718\tSkaneateles village\tNY\tNew York\tOnondaga County\t2584\t47.7\t55.0\t7.0\t33911\t250205\t0.5972\t13152\tObama\t13152\t0.004746667\t13152.0\n14662\t-76.1262\t43.082015000000006\tLyncourt CDP\tNY\tNew York\tOnondaga County\t3987\t44.8\t14.9\t9.3\t23032\t115169\t0.5972\t13211\tObama\t13211\t0.007323901\t13211.0\n14663\t-76.242594\t43.090864\tLakeland CDP\tNY\tNew York\tOnondaga County\t2774\t43.2\t15.5\t6.8\t27183\t144856\t0.5972\t13209\tObama\t13209\t0.0050956859999999994\t13209.0\n14664\t-76.31083199999999\t43.132503\tVillage Green CDP\tNY\tNew York\tOnondaga County\t3765\t42.3\t25.8\t5.6\t31710\t120582\t0.5972\t130HH\tObama\t130HH\t0.006916099\t0.0\n14665\t-75.966798\t43.157503000000005\tBridgeport CDP\tNY\tNew York\tOnondaga County\t1608\t41.1\t10.7\t8.5\t21082\t100379\t0.5972\t13030\tObama\t13030\t0.002953808\t13030.0\n14666\t-76.008365\t43.07478\tMinoa village\tNY\tNew York\tOnondaga County\t3266\t44.2\t22.2\t7.9\t27960\t135059\t0.5972\t13116\tObama\t13116\t0.005999464\t13116.0\n14667\t-76.141463\t42.977984\tNedrow CDP\tNY\tNew York\tOnondaga County\t2163\t40.4\t18.7\t9.4\t23120\t100240\t0.5972\t13120\tObama\t13120\t0.003973313\t13120.0\n14668\t-75.981302\t43.001659000000004\tManlius village\tNY\tNew York\tOnondaga County\t4758\t43.6\t61.8\t7.5\t39331\t220164\t0.5972\t13104\tObama\t13104\t0.008740186\t13104.0\n14669\t-76.069378\t43.063715\tEast Syracuse village\tNY\tNew York\tOnondaga County\t3003\t37.2\t13.8\t11.1\t20546\t122166\t0.5972\t13057\tObama\t13057\t0.005516347\t13057.0\n14670\t-75.985352\t42.83508\tFabius village\tNY\tNew York\tOnondaga County\t388\t39.3\t24.2\t7.1\t25092\t165179\t0.5972\t13063\tObama\t13063\t0.000712735\t13063.0\n14671\t-76.181527\t43.088836\tGaleville CDP\tNY\tNew York\tOnondaga County\t4230\t45.2\t17.3\t7.9\t27173\t117402\t0.5972\t13290\tObama\t13290\t0.007770279000000001\t13290.0\n14672\t-76.340274\t42.983669\tMarcellus village\tNY\tNew York\tOnondaga County\t1741\t41.1\t37.8\t7.3\t25075\t174348\t0.5972\t13108\tObama\t13108\t0.0031981220000000003\t13108.0\n14673\t-76.13596700000001\t43.245243\tBrewerton CDP\tNY\tNew York\tOnondaga County\t3633\t34.6\t17.8\t10.0\t26080\t143615\t0.5972\t13029\tObama\t13029\t0.006673623\t13029.0\n14674\t-76.971071\t42.867305\tGeneva city\tNY\tNew York\tOntario County\t13250\t32.6\t26.5\t10.2\t21058\t108620\t0.4825\t14456\tObama\t14456\t0.024339526\t14456.0\n14675\t-77.402105\t42.617579\tNaples village\tNY\tNew York\tOntario County\t1050\t42.4\t25.9\t8.1\t23516\t119444\t0.4825\t14512\tObama\t14512\t0.0019287929999999998\t14512.0\n14676\t-77.231237\t42.968319\tManchester village\tNY\tNew York\tOntario County\t1580\t42.8\t15.4\t5.7\t21779\t102576\t0.4825\t14504\tObama\t14504\t0.002902374\t14504.0\n14677\t-77.280503\t42.888518\tCanandaigua city\tNY\tNew York\tOntario County\t10982\t40.6\t29.2\t7.2\t23497\t157161\t0.4825\t14424\tObama\t14424\t0.020173333999999998\t14424.0\n14678\t-77.135062\t42.960877\tClifton Springs village\tNY\tNew York\tOntario County\t2223\t42.8\t22.3\t11.2\t20879\t126937\t0.4825\t14432\tObama\t14432\t0.00408353\t14432.0\n14679\t-77.409779\t42.9819\tVictor village\tNY\tNew York\tOntario County\t2918\t36.8\t46.3\t4.9\t33486\t196154\t0.4825\t14564\tObama\t14564\t0.005360207\t14564.0\n14680\t-77.42346500000001\t42.899333\tBloomfield village\tNY\tNew York\tOntario County\t1342\t39.5\t32.5\t6.4\t26030\t167123\t0.4825\t14469\tObama\t14469\t0.002465181\t14469.0\n14681\t-77.223388\t42.955256\tShortsville village\tNY\tNew York\tOntario County\t1304\t40.6\t21.3\t5.1\t24184\t121941\t0.4825\t14504\tObama\t14504\t0.002395377\t14504.0\n14682\t-77.062235\t42.958134\tPhelps village\tNY\tNew York\tOntario County\t2043\t38.6\t19.3\t4.4\t24872\t118012\t0.4825\t14532\tObama\t14532\t0.003752879\t14532.0\n14683\t-74.035395\t41.440867\tFirthcliffe CDP\tNY\tNew York\tOrange County\t5214\t40.7\t40.0\t7.6\t33524\t249525\t0.5213\t12518\tObama\t12518\t0.009577833000000001\t12518.0\n14684\t-74.116291\t41.441615999999996\tBeaverdam Lake-Salisbury Mills CDP\tNY\tNew York\tOrange County\t2977\t37.9\t31.2\t9.6\t31682\t255929\t0.5213\t12577\tObama\t12577\t0.005468586\t12577.0\n14685\t-74.327151\t41.401101000000004\tGoshen village\tNY\tNew York\tOrange County\t6300\t40.2\t36.8\t7.1\t30378\t268802\t0.5213\t10924\tObama\t10924\t0.011572756000000002\t10924.0\n14686\t-74.05336\t41.459096\tVails Gate CDP\tNY\tNew York\tOrange County\t3430\t39.8\t23.7\t5.2\t27657\t197011\t0.5213\t12553\tObama\t12553\t0.006300723\t12553.0\n14687\t-74.29682\t41.609226\tPine Bush CDP\tNY\tNew York\tOrange County\t1828\t37.1\t22.4\t8.4\t26784\t191573\t0.5213\t12566\tObama\t12566\t0.0033579359999999997\t12566.0\n14688\t-74.157838\t41.429629\tWashingtonville village\tNY\tNew York\tOrange County\t6425\t36.7\t30.3\t6.7\t31595\t256448\t0.5213\t10992\tObama\t10992\t0.011802374\t10992.0\n14689\t-74.01434300000001\t41.436756\tCornwall on Hudson village\tNY\tNew York\tOrange County\t3218\t42.6\t45.2\t6.7\t34292\t268192\t0.5213\t12520\tObama\t12520\t0.00591129\t12520.0\n14690\t-74.690895\t41.378355\tPort Jervis city\tNY\tNew York\tOrange County\t9444\t36.1\t11.7\t13.9\t21267\t150704\t0.5213\t12771\tObama\t12771\t0.017348112\t12771.0\n14691\t-74.42880500000001\t41.469265\tWashington Heights CDP\tNY\tNew York\tOrange County\t1394\t40.1\t23.7\t11.7\t23108\t174583\t0.5213\t10940\tObama\t10940\t0.002560702\t10940.0\n14692\t-74.238925\t41.521696999999996\tMontgomery village\tNY\tNew York\tOrange County\t4079\t37.5\t32.5\t7.7\t30490\t211178\t0.5213\t12549\tObama\t12549\t0.0074929\t12549.0\n14693\t-74.205826\t41.200857\tTuxedo Park village\tNY\tNew York\tOrange County\t791\t47.9\t70.3\t5.3\t62343\t1000001\t0.5213\t10987\tObama\t10987\t0.001453024\t10987.0\n14694\t-74.02732900000001\t41.473128\tNew Windsor CDP\tNY\tNew York\tOrange County\t9304\t40.1\t26.7\t8.6\t29562\t210157\t0.5213\t12520\tObama\t12520\t0.01709094\t12520.0\n14695\t-74.05962\t41.532775\tGardnertown CDP\tNY\tNew York\tOrange County\t4649\t39.7\t21.5\t9.2\t31314\t200837\t0.5213\t12550\tObama\t12550\t0.008539959\t12550.0\n14696\t-74.023266\t41.528182\tBalmville CDP\tNY\tNew York\tOrange County\t3391\t42.5\t38.3\t6.4\t38391\t261207\t0.5213\t12550\tObama\t12550\t0.0062290819999999995\t12550.0\n14697\t-74.355456\t41.255069\tWarwick village\tNY\tNew York\tOrange County\t7109\t42.5\t37.0\t6.9\t32833\t250402\t0.5213\t10990\tObama\t10990\t0.013058845\t10990.0\n14698\t-74.166543\t41.339652\tKiryas Joel village\tNY\tNew York\tOrange County\t17843\t17.3\t16.2\t9.9\t7935\t268627\t0.5213\t10950\tObama\t10950\t0.032776616\t10950.0\n14699\t-74.224848\t41.311811\tWalton Park CDP\tNY\tNew York\tOrange County\t2645\t39.2\t36.8\t8.0\t33549\t280833\t0.5213\t10950\tObama\t10950\t0.004858721\t10950.0\n14700\t-74.127028\t41.352896\tHighland Mills CDP\tNY\tNew York\tOrange County\t3881\t37.8\t44.1\t8.8\t41597\t269123\t0.5213\t10930\tObama\t10930\t0.007129185\t10930.0\n14701\t-74.368217\t41.475833\tScotchtown CDP\tNY\tNew York\tOrange County\t9860\t36.6\t26.1\t7.4\t28512\t227472\t0.5213\t10941\tObama\t10941\t0.018112281\t10941.0\n14702\t-74.02528199999999\t41.36176\tWest Point CDP\tNY\tNew York\tOrange County\t7182\t21.8\t67.4\t7.8\t20381\t1000001\t0.5213\t125XX\tObama\t125XX\t0.013192942\t0.0\n14703\t-74.289151\t41.221322\tGreenwood Lake village\tNY\tNew York\tOrange County\t3931\t38.8\t23.0\t7.6\t33869\t193750\t0.5213\t10925\tObama\t10925\t0.007221032\t10925.0\n14704\t-74.391382\t41.447194\tMechanicstown CDP\tNY\tNew York\tOrange County\t7277\t38.6\t18.3\t7.7\t26828\t168202\t0.5213\t10941\tObama\t10941\t0.013367452\t10941.0\n14705\t-74.213216\t41.487701\tMaybrook village\tNY\tNew York\tOrange County\t3345\t32.7\t20.9\t7.7\t23331\t173758\t0.5213\t12543\tObama\t12543\t0.006144581999999999\t12543.0\n14706\t-74.184877\t41.319846000000005\tMonroe village\tNY\tNew York\tOrange County\t8432\t39.7\t37.0\t8.5\t33453\t282283\t0.5213\t10950\tObama\t10950\t0.015489123\t10950.0\n14707\t-74.187922\t41.56026\tWalden village\tNY\tNew York\tOrange County\t6943\t35.5\t17.4\t8.4\t24336\t173951\t0.5213\t12586\tObama\t12586\t0.012753912\t12586.0\n14708\t-74.277027\t41.356852\tChester village\tNY\tNew York\tOrange County\t3737\t41.0\t26.9\t10.5\t30483\t192224\t0.5213\t10918\tObama\t10918\t0.006864665\t10918.0\n14709\t-74.42273\t41.445851\tMiddletown city\tNY\tNew York\tOrange County\t27611\t34.6\t21.7\t10.7\t24784\t174337\t0.5213\t10940\tObama\t10940\t0.050719899000000006\t10940.0\n14710\t-74.02046899999999\t41.503715\tNewburgh city\tNY\tNew York\tOrange County\t29820\t27.7\t14.9\t16.0\t17361\t163099\t0.5213\t12550\tObama\t12550\t0.05477771099999999\t12550.0\n14711\t-74.094166\t41.532736\tOrange Lake CDP\tNY\tNew York\tOrange County\t7286\t41.8\t31.0\t7.7\t30300\t224345\t0.5213\t12550\tObama\t12550\t0.013383984\t12550.0\n14712\t-73.968625\t41.364738\tHighland Falls village\tNY\tNew York\tOrange County\t4030\t40.7\t25.2\t8.9\t32086\t219386\t0.5213\t10928\tObama\t10928\t0.00740289\t10928.0\n14713\t-74.539355\t41.471534000000005\tOtisville village\tNY\tNew York\tOrange County\t1143\t36.4\t16.4\t8.2\t28811\t183051\t0.5213\t10963\tObama\t10963\t0.002099629\t10963.0\n14714\t-74.126692\t41.329055\tCentral Valley CDP\tNY\tNew York\tOrange County\t2042\t40.5\t47.8\t8.6\t38573\t337430\t0.5213\t10917\tObama\t10917\t0.003751042\t10917.0\n14715\t-74.14424100000001\t41.308932\tHarriman village\tNY\tNew York\tOrange County\t2504\t38.1\t35.5\t7.7\t31159\t236818\t0.5213\t10926\tObama\t10926\t0.004599710999999999\t10926.0\n14716\t-74.354443\t41.331398\tFlorida village\tNY\tNew York\tOrange County\t2877\t41.3\t30.1\t8.3\t29807\t238214\t0.5213\t10921\tObama\t10921\t0.005284891999999999\t10921.0\n14717\t-73.985337\t41.340039000000004\tFort Montgomery CDP\tNY\tNew York\tOrange County\t1628\t41.9\t32.4\t4.3\t39548\t242105\t0.5213\t10928\tObama\t10928\t0.002990547\t10928.0\n14718\t-74.562363\t41.301906\tUnionville village\tNY\tNew York\tOrange County\t633\t38.1\t18.2\t11.6\t22725\t196429\t0.5213\t10998\tObama\t10998\t0.001162786\t10998.0\n14719\t-78.19035500000001\t43.245832\tAlbion village\tNY\tNew York\tOrleans County\t5766\t31.6\t13.3\t13.1\t19436\t81186\t0.3935\t14411\tObama\t14411\t0.010591827\t14411.0\n14720\t-78.38890699999999\t43.219722999999995\tMedina village\tNY\tNew York\tOrleans County\t5966\t36.6\t17.2\t9.0\t19401\t80519\t0.3935\t14103\tObama\t14103\t0.010959216\t14103.0\n14721\t-78.02907900000001\t43.224636\tHolley village\tNY\tNew York\tOrleans County\t1793\t32.4\t18.4\t8.8\t23579\t109167\t0.3935\t14470\tObama\t14470\t0.0032936429999999997\t14470.0\n14722\t-78.388816\t43.321306\tLyndonville village\tNY\tNew York\tOrleans County\t875\t41.0\t17.1\t12.7\t20194\t96970\t0.3935\t14098\tObama\t14098\t0.0016073270000000002\t14098.0\n14723\t-76.086363\t43.643265\tSandy Creek village\tNY\tNew York\tOswego County\t813\t43.2\t16.2\t11.1\t20308\t120833\t0.5273\t13145\tObama\t13145\t0.001493437\t13145.0\n14724\t-76.23163199999999\t43.255883000000004\tSand Ridge CDP\tNY\tNew York\tOswego County\t878\t40.0\t21.8\t6.2\t22435\t131481\t0.5273\t13132\tObama\t13132\t0.001612838\t13132.0\n14725\t-76.500338\t43.451485999999996\tOswego city\tNY\tNew York\tOswego County\t17814\t35.7\t26.4\t10.3\t20763\t120313\t0.5273\t13126\tObama\t13126\t0.032723345\t13126.0\n14726\t-76.002923\t43.255053000000004\tConstantia CDP\tNY\tNew York\tOswego County\t1107\t42.8\t14.0\t7.3\t20673\t134430\t0.5273\t13044\tObama\t13044\t0.002033499\t13044.0\n14727\t-76.06738299999999\t43.643501\tLacona village\tNY\tNew York\tOswego County\t607\t42.4\t15.4\t9.8\t20659\t118981\t0.5273\t13083\tObama\t13083\t0.001115026\t13083.0\n14728\t-76.416168\t43.316804\tFulton city\tNY\tNew York\tOswego County\t11401\t36.8\t14.9\t12.2\t19944\t105645\t0.5273\t13069\tObama\t13069\t0.020943014\t13069.0\n14729\t-76.29597\t43.231365000000004\tPhoenix village\tNY\tNew York\tOswego County\t2229\t36.3\t15.5\t10.1\t19842\t111997\t0.5273\t13135\tObama\t13135\t0.004094551\t13135.0\n14730\t-75.884743\t43.239739\tCleveland village\tNY\tNew York\tOswego County\t739\t40.0\t13.0\t9.2\t19844\t111184\t0.5273\t13042\tObama\t13042\t0.001357503\t13042.0\n14731\t-76.48092199999999\t43.399765\tMinetto CDP\tNY\tNew York\tOswego County\t1077\t45.7\t35.2\t6.3\t29534\t163225\t0.5273\t13126\tObama\t13126\t0.00197839\t13126.0\n14732\t-76.12725999999999\t43.5656\tPulaski village\tNY\tNew York\tOswego County\t2354\t40.1\t19.5\t15.2\t22001\t124728\t0.5273\t13142\tObama\t13142\t0.004324169\t13142.0\n14733\t-76.12752900000001\t43.405091999999996\tParish village\tNY\tNew York\tOswego County\t509\t36.3\t12.6\t11.4\t18742\t114500\t0.5273\t13131\tObama\t13131\t0.000935005\t13131.0\n14734\t-76.141911\t43.285936\tCentral Square village\tNY\tNew York\tOswego County\t1677\t42.4\t16.8\t7.4\t23810\t136179\t0.5273\t13036\tObama\t13036\t0.0030805570000000003\t13036.0\n14735\t-76.23259\t43.465131\tMexico village\tNY\tNew York\tOswego County\t1609\t38.8\t18.2\t11.2\t21020\t125631\t0.5273\t13114\tObama\t13114\t0.002955645\t13114.0\n14736\t-76.57745899999999\t43.319555\tHannibal village\tNY\tNew York\tOswego County\t525\t36.8\t9.8\t13.8\t18987\t96250\t0.5273\t13074\tObama\t13074\t0.0009643960000000001\t13074.0\n14737\t-76.003716\t43.511469\tAltmar village\tNY\tNew York\tOswego County\t346\t34.2\t8.5\t7.3\t18430\t85000\t0.5273\t13302\tObama\t13302\t0.000635583\t13302.0\n14738\t-74.93007\t42.698802\tCooperstown village\tNY\tNew York\tOtsego County\t1931\t48.0\t43.9\t14.1\t26351\t231439\t0.502\t13326\tObama\t13326\t0.003547142\t13326.0\n14739\t-75.066558\t42.455362\tOneonta city\tNY\tNew York\tOtsego County\t13428\t24.4\t37.7\t8.4\t19109\t120056\t0.502\t13820\tObama\t13820\t0.024666503\t13820.0\n14740\t-75.32258900000001\t42.469167\tGilbertsville village\tNY\tNew York\tOtsego County\t390\t45.8\t25.1\t6.9\t22705\t124107\t0.502\t13776\tObama\t13776\t0.000716409\t13776.0\n14741\t-74.986001\t42.853691999999995\tRichfield Springs village\tNY\tNew York\tOtsego County\t1189\t47.9\t18.9\t12.8\t19026\t103811\t0.502\t13439\tObama\t13439\t0.002184128\t13439.0\n14742\t-75.088526\t42.531268\tLaurens village\tNY\tNew York\tOtsego County\t296\t42.6\t25.8\t4.9\t23945\t125000\t0.502\t13861\tObama\t13861\t0.000543736\t13861.0\n14743\t-75.315647\t42.327537\tUnadilla village\tNY\tNew York\tOtsego County\t1139\t38.6\t20.0\t7.1\t21830\t101807\t0.502\t13849\tObama\t13849\t0.002092281\t13849.0\n14744\t-75.180037\t42.392747\tOtego village\tNY\tNew York\tOtsego County\t1122\t41.4\t33.3\t6.2\t22670\t134722\t0.502\t13825\tObama\t13825\t0.0020610529999999998\t13825.0\n14745\t-75.096902\t42.466992\tWest End CDP\tNY\tNew York\tOtsego County\t1821\t40.6\t31.2\t14.0\t23486\t121307\t0.502\t13861\tObama\t13861\t0.003345078\t13861.0\n14746\t-74.94713399999999\t42.590971\tMilford village\tNY\tNew York\tOtsego County\t504\t43.0\t26.0\t12.5\t17665\t112500\t0.502\t13807\tObama\t13807\t0.00092582\t13807.0\n14747\t-74.750876\t42.79777\tCherry Valley village\tNY\tNew York\tOtsego County\t617\t42.5\t25.9\t8.3\t19367\t132422\t0.502\t13320\tObama\t13320\t0.001133395\t13320.0\n14748\t-75.245211\t42.548258000000004\tMorris village\tNY\tNew York\tOtsego County\t639\t42.4\t23.4\t7.4\t18629\t115000\t0.502\t13808\tObama\t13808\t0.001173808\t13808.0\n14749\t-73.954495\t41.419129999999996\tCold Spring village\tNY\tNew York\tPutnam County\t2018\t44.9\t45.3\t4.3\t45828\t352795\t0.44\t10516\tObama\t10516\t0.003706956\t10516.0\n14750\t-73.946415\t41.429105\tNelsonville village\tNY\tNew York\tPutnam County\t643\t42.1\t48.3\t4.6\t37815\t328571\t0.44\t10516\tObama\t10516\t0.001181156\t10516.0\n14751\t-73.685278\t41.414867\tCarmel Hamlet CDP\tNY\tNew York\tPutnam County\t6448\t40.8\t37.9\t6.9\t37576\t374762\t0.44\t10512\tObama\t10512\t0.011844624\t10512.0\n14752\t-73.54831800000001\t41.474813\tPutnam Lake CDP\tNY\tNew York\tPutnam County\t4031\t38.4\t28.2\t4.4\t34749\t264595\t0.44\t12563\tObama\t12563\t0.007404727\t12563.0\n14753\t-73.740165\t41.368438\tMahopac CDP\tNY\tNew York\tPutnam County\t8894\t40.4\t35.5\t6.9\t38255\t392019\t0.44\t10541\tObama\t10541\t0.016337792\t10541.0\n14754\t-73.606859\t41.422709999999995\tBrewster Hill CDP\tNY\tNew York\tPutnam County\t2238\t41.2\t23.7\t7.8\t31691\t355882\t0.44\t10509\tObama\t10509\t0.004111084\t10509.0\n14755\t-73.57623199999999\t41.37202\tPeach Lake CDP\tNY\tNew York\tPutnam County\t1755\t42.2\t47.4\t9.9\t47284\t403646\t0.44\t10509\tObama\t10509\t0.003223839\t10509.0\n14756\t-73.615809\t41.397252\tBrewster village\tNY\tNew York\tPutnam County\t2156\t35.2\t23.8\t8.1\t24640\t306790\t0.44\t10509\tObama\t10509\t0.003960454\t10509.0\n14757\t-73.668132\t41.461256\tLake Carmel CDP\tNY\tNew York\tPutnam County\t8635\t40.1\t28.7\t5.8\t34873\t268560\t0.44\t10512\tObama\t10512\t0.015862023\t10512.0\n14758\t-73.60329\t42.640322999999995\tWest Sand Lake CDP\tNY\tNew York\tRensselaer County\t2629\t43.6\t28.4\t3.8\t31312\t226863\t0.5502\t12196\tObama\t12196\t0.004829329\t12196.0\n14759\t-73.56299399999999\t42.900575\tValley Falls village\tNY\tNew York\tRensselaer County\t469\t38.3\t24.6\t7.7\t27013\t181250\t0.5502\t12185\tObama\t12185\t0.000861527\t12185.0\n14760\t-73.55452199999999\t42.694117999999996\tPoestenkill CDP\tNY\tNew York\tRensselaer County\t1028\t42.9\t26.3\t3.2\t29097\t202315\t0.5502\t12140\tObama\t12140\t0.00188838\t12140.0\n14761\t-73.508303\t42.532018\tEast Nassau village\tNY\tNew York\tRensselaer County\t601\t43.5\t29.2\t6.6\t26615\t184896\t0.5502\t12062\tObama\t12062\t0.001104004\t12062.0\n14762\t-73.73328199999999\t42.646219\tRensselaer city\tNY\tNew York\tRensselaer County\t8488\t38.2\t20.3\t9.0\t25055\t159991\t0.5502\t12144\tObama\t12144\t0.015591991999999999\t12144.0\n14763\t-73.552989\t42.636091\tAverill Park CDP\tNY\tNew York\tRensselaer County\t1694\t43.5\t29.4\t4.5\t31691\t217892\t0.5502\t12018\tObama\t12018\t0.003111785\t12018.0\n14764\t-73.70242900000001\t42.593368\tEast Greenbush CDP\tNY\tNew York\tRensselaer County\t4434\t40.4\t48.6\t5.5\t31268\t235948\t0.5502\t12061\tObama\t12061\t0.008145016\t12061.0\n14765\t-73.74906700000001\t42.532433000000005\tCastleton-on-Hudson village\tNY\tNew York\tRensselaer County\t1548\t38.5\t31.4\t6.9\t22621\t175164\t0.5502\t12033\tObama\t12033\t0.002843591\t12033.0\n14766\t-73.646902\t42.688006\tWynantskill CDP\tNY\tNew York\tRensselaer County\t3104\t42.9\t26.5\t6.3\t29187\t189869\t0.5502\t12198\tObama\t12198\t0.0057018780000000005\t12198.0\n14767\t-73.675079\t42.735547\tTroy city\tNY\tNew York\tRensselaer County\t47983\t32.8\t24.2\t10.4\t21576\t157658\t0.5502\t12180\tObama\t12180\t0.08814215\t12180.0\n14768\t-73.610809\t42.513898\tNassau village\tNY\tNew York\tRensselaer County\t1294\t39.0\t22.6\t7.1\t28454\t165816\t0.5502\t12123\tObama\t12123\t0.002377007\t12123.0\n14769\t-73.58774\t42.899149\tSchaghticoke village\tNY\tNew York\tRensselaer County\t691\t37.6\t23.5\t7.9\t27118\t195833\t0.5502\t12154\tObama\t12154\t0.001269329\t12154.0\n14770\t-73.349785\t42.90017\tHoosick Falls village\tNY\tNew York\tRensselaer County\t3230\t39.6\t23.6\t6.6\t21478\t150125\t0.5502\t12090\tObama\t12090\t0.005933334\t12090.0\n14771\t-73.72796\t42.621425\tHampton Manor CDP\tNY\tNew York\tRensselaer County\t2447\t41.4\t29.1\t5.5\t26289\t158161\t0.5502\t12144\tObama\t12144\t0.004495005\t12144.0\n14772\t-73.914438\t41.091862\tNyack village\tNY\tNew York\tRockland County\t6614\t41.7\t46.9\t5.5\t46721\t416441\t0.5276\t10960\tObama\t10960\t0.012149557\t10960.0\n14773\t-74.169865\t41.126235\tHillburn village\tNY\tNew York\tRockland County\t865\t36.2\t19.9\t4.0\t23983\t283730\t0.5276\t10931\tObama\t10931\t0.001588958\t10931.0\n14774\t-74.034904\t41.129748\tHillcrest CDP\tNY\tNew York\tRockland County\t7065\t38.3\t33.5\t8.9\t25702\t330284\t0.5276\t10977\tObama\t10977\t0.012978018999999999\t10977.0\n14775\t-74.068292\t41.118452000000005\tMonsey CDP\tNY\tNew York\tRockland County\t16266\t21.0\t31.7\t7.1\t20679\t457192\t0.5276\t10952\tObama\t10952\t0.029879753999999998\t10952.0\n14776\t-73.906467\t41.113387\tUpper Nyack village\tNY\tNew York\tRockland County\t1850\t49.1\t66.1\t9.3\t60695\t627941\t0.5276\t10960\tObama\t10960\t0.003398349\t10960.0\n14777\t-73.98831899999999\t41.206476\tWest Haverstraw village\tNY\tNew York\tRockland County\t10161\t37.3\t19.5\t9.1\t27150\t285917\t0.5276\t10993\tObama\t10993\t0.018665202\t10993.0\n14778\t-74.085273\t41.129024\tViola CDP\tNY\tNew York\tRockland County\t6918\t30.7\t54.0\t6.3\t38311\t589874\t0.5276\t10952\tObama\t10952\t0.012707988\t10952.0\n14779\t-73.95183\t41.026955\tTappan CDP\tNY\tNew York\tRockland County\t6638\t43.2\t51.7\t6.5\t41770\t505952\t0.5276\t10983\tObama\t10983\t0.012193643\t10983.0\n14780\t-74.012048\t41.206699\tThiells CDP\tNY\tNew York\tRockland County\t4803\t41.0\t36.5\t8.1\t38707\t395446\t0.5276\t10984\tObama\t10984\t0.008822849\t10984.0\n14781\t-74.055157\t41.082947\tChestnut Ridge village\tNY\tNew York\tRockland County\t7803\t43.9\t48.9\t8.9\t39349\t424318\t0.5276\t10977\tObama\t10977\t0.014333685\t10977.0\n14782\t-73.940954\t41.04866\tOrangeburg CDP\tNY\tNew York\tRockland County\t4084\t45.4\t43.5\t5.8\t40168\t446667\t0.5276\t10962\tObama\t10962\t0.007502085\t10962.0\n14783\t-74.06870500000001\t41.12343\tKaser village\tNY\tNew York\tRockland County\t3614\t18.6\t28.9\t6.3\t15712\t518349\t0.5276\t10952\tObama\t10952\t0.006638720999999999\t10952.0\n14784\t-73.920824\t41.062737\tGrand View-on-Hudson village\tNY\tNew York\tRockland County\t284\t51.3\t64.0\t7.1\t98385\t875000\t0.5276\t10968\tObama\t10968\t0.0005216919999999999\t10968.0\n14785\t-73.990716\t41.154331\tNew City CDP\tNY\tNew York\tRockland County\t33555\t43.4\t57.3\t5.7\t46919\t491776\t0.5276\t10956\tObama\t10956\t0.061638702000000004\t10956.0\n14786\t-74.029411\t41.192568\tMount Ivy CDP\tNY\tNew York\tRockland County\t6868\t39.1\t33.6\t6.2\t34714\t250905\t0.5276\t10970\tObama\t10970\t0.012616141\t10970.0\n14787\t-74.099036\t41.099140000000006\tAirmont village\tNY\tNew York\tRockland County\t8308\t42.3\t47.0\t5.8\t39420\t448703\t0.5276\t10952\tObama\t10952\t0.015261341999999999\t10952.0\n14788\t-74.04854\t41.148834\tNew Hempstead village\tNY\tNew York\tRockland County\t4892\t37.0\t52.0\t6.1\t36774\t439964\t0.5276\t10977\tObama\t10977\t0.008986336999999999\t10977.0\n14789\t-74.113254\t41.131741999999996\tMontebello village\tNY\tNew York\tRockland County\t4247\t40.5\t65.1\t4.7\t59706\t643939\t0.5276\t10901\tObama\t10901\t0.007801506999999999\t10901.0\n14790\t-73.942751\t41.116122999999995\tValley Cottage CDP\tNY\tNew York\tRockland County\t9099\t44.0\t44.9\t6.4\t41158\t373847\t0.5276\t10989\tObama\t10989\t0.016714366\t10989.0\n14791\t-73.914727\t41.042462\tPiermont village\tNY\tNew York\tRockland County\t2770\t44.7\t60.5\t7.3\t60468\t597376\t0.5276\t10968\tObama\t10968\t0.005088339\t10968.0\n14792\t-73.951939\t41.193593\tHaverstraw village\tNY\tNew York\tRockland County\t11228\t32.2\t15.1\t10.1\t22270\t268864\t0.5276\t10927\tObama\t10927\t0.020625223\t10927.0\n14793\t-74.14195699999999\t41.113786\tSuffern village\tNY\tNew York\tRockland County\t11203\t41.8\t41.4\t6.7\t40792\t314358\t0.5276\t10901\tObama\t10901\t0.020579299\t10901.0\n14794\t-74.004597\t41.061596\tPearl River CDP\tNY\tNew York\tRockland County\t15855\t41.3\t43.4\t5.5\t41450\t452051\t0.5276\t10965\tObama\t10965\t0.029124769\t10965.0\n14795\t-74.054261\t41.189165\tPomona village\tNY\tNew York\tRockland County\t2750\t46.5\t63.8\t9.2\t62933\t586238\t0.5276\t10970\tObama\t10970\t0.005051600000000001\t10970.0\n14796\t-74.015556\t41.095714\tNanuet CDP\tNY\tNew York\tRockland County\t16872\t40.2\t42.4\t7.4\t37279\t388601\t0.5276\t10954\tObama\t10954\t0.030992942000000002\t10954.0\n14797\t-73.954328\t41.068912\tBlauvelt CDP\tNY\tNew York\tRockland County\t5196\t40.3\t44.3\t9.7\t45909\t494690\t0.5276\t10913\tObama\t10913\t0.009544768\t10913.0\n14798\t-73.996945\t41.229444\tStony Point CDP\tNY\tNew York\tRockland County\t12171\t40.5\t28.4\t6.7\t36589\t382902\t0.5276\t10980\tObama\t10980\t0.022357462\t10980.0\n14799\t-73.945646\t41.148583\tCongers CDP\tNY\tNew York\tRockland County\t8367\t40.3\t41.0\t6.9\t38052\t442570\t0.5276\t10920\tObama\t10920\t0.015369721999999999\t10920.0\n14800\t-74.189624\t41.161789\tSloatsburg village\tNY\tNew York\tRockland County\t3076\t40.3\t29.2\t7.7\t33803\t330945\t0.5276\t10974\tObama\t10974\t0.005650444\t10974.0\n14801\t-73.91238\t41.079652\tSouth Nyack village\tNY\tNew York\tRockland County\t3445\t33.3\t56.2\t5.6\t39015\t468617\t0.5276\t10960\tObama\t10960\t0.006328276999999999\t10960.0\n14802\t-73.971397\t41.090793\tWest Nyack CDP\tNY\tNew York\tRockland County\t3225\t42.7\t50.9\t3.2\t47799\t469280\t0.5276\t10994\tObama\t10994\t0.005924149\t10994.0\n14803\t-73.98103\t41.112884\tBardonia CDP\tNY\tNew York\tRockland County\t4327\t43.4\t56.0\t4.8\t50307\t547962\t0.5276\t10994\tObama\t10994\t0.007948463000000001\t10994.0\n14804\t-74.076846\t41.157804\tWesley Hills village\tNY\tNew York\tRockland County\t4913\t38.6\t61.0\t8.1\t45432\t541667\t0.5276\t10952\tObama\t10952\t0.009024913\t10952.0\n14805\t-74.04865799999999\t41.114932\tSpring Valley village\tNY\tNew York\tRockland County\t28132\t29.9\t24.3\t11.4\t20861\t249240\t0.5276\t10977\tObama\t10977\t0.051676947\t10977.0\n14806\t-74.02895799999999\t41.140593\tNew Square village\tNY\tNew York\tRockland County\t5093\t16.9\t21.8\t6.0\t9681\t435965\t0.5276\t10977\tObama\t10977\t0.009355563\t10977.0\n14807\t-74.89231\t44.929190000000006\tMassena village\tNY\tNew York\tSt. Lawrence County\t10511\t41.6\t20.7\t8.4\t22195\t122290\t0.5741\t13662\tObama\t13662\t0.019308133\t13662.0\n14808\t-75.404664\t44.616979\tHeuvelton village\tNY\tNew York\tSt. Lawrence County\t844\t38.9\t16.2\t9.0\t16196\t96739\t0.5741\t13680\tObama\t13680\t0.001550382\t13680.0\n14809\t-75.392442\t44.415071999999995\tRichville village\tNY\tNew York\tSt. Lawrence County\t287\t37.2\t13.6\t9.4\t16545\t84167\t0.5741\t13681\tObama\t13681\t0.0005272030000000001\t13681.0\n14810\t-75.471654\t44.708798\tOgdensburg city\tNY\tNew York\tSt. Lawrence County\t11548\t37.4\t13.1\t8.6\t20123\t86731\t0.5741\t13669\tObama\t13669\t0.021213045\t13669.0\n14811\t-75.251862\t44.322767999999996\tEdwards village\tNY\tNew York\tSt. Lawrence County\t466\t38.1\t11.0\t16.0\t14497\t75769\t0.5741\t13635\tObama\t13635\t0.0008560169999999999\t13635.0\n14812\t-75.465731\t44.336815\tGouverneur village\tNY\tNew York\tSt. Lawrence County\t4120\t34.8\t12.3\t10.6\t17174\t84019\t0.5741\t13642\tObama\t13642\t0.007568215\t13642.0\n14813\t-74.996994\t44.748113000000004\tNorwood village\tNY\tNew York\tSt. Lawrence County\t1572\t40.9\t19.8\t6.6\t20020\t103738\t0.5741\t13668\tObama\t13668\t0.002887678\t13668.0\n14814\t-74.98650400000001\t44.792278\tNorfolk CDP\tNY\tNew York\tSt. Lawrence County\t1266\t42.2\t15.0\t5.5\t21532\t97174\t0.5741\t13667\tObama\t13667\t0.002325573\t13667.0\n14815\t-74.985626\t44.668583\tPotsdam village\tNY\tNew York\tSt. Lawrence County\t9234\t22.5\t49.8\t8.1\t19071\t131458\t0.5741\t13676\tObama\t13676\t0.016962354\t13676.0\n14816\t-75.693485\t44.44643\tHammond village\tNY\tNew York\tSt. Lawrence County\t310\t43.7\t18.7\t16.3\t17258\t107353\t0.5741\t13646\tObama\t13646\t0.000569453\t13646.0\n14817\t-75.196894\t44.859165000000004\tWaddington village\tNY\tNew York\tSt. Lawrence County\t864\t45.6\t19.1\t10.3\t23760\t119415\t0.5741\t13694\tObama\t13694\t0.0015871210000000001\t13694.0\n14818\t-75.231117\t44.467039\tHermon village\tNY\tNew York\tSt. Lawrence County\t409\t42.0\t16.0\t13.1\t18358\t90556\t0.5741\t13652\tObama\t13652\t0.0007513110000000001\t13652.0\n14819\t-75.31899200000001\t44.590841\tRensselaer Falls village\tNY\tNew York\tSt. Lawrence County\t347\t36.3\t27.3\t10.3\t19645\t95000\t0.5741\t13680\tObama\t13680\t0.00063742\t13680.0\n14820\t-75.64575699999999\t44.584307\tMorristown village\tNY\tNew York\tSt. Lawrence County\t478\t42.2\t26.7\t12.6\t21574\t107353\t0.5741\t13664\tObama\t13664\t0.00087806\t13664.0\n14821\t-74.792917\t44.804046\tBrasher Falls-Winthrop CDP\tNY\tNew York\tSt. Lawrence County\t1169\t40.7\t16.4\t8.8\t22867\t100463\t0.5741\t13697\tObama\t13697\t0.002147389\t13697.0\n14822\t-75.171508\t44.600463\tCanton village\tNY\tNew York\tSt. Lawrence County\t5680\t24.6\t43.1\t8.7\t23048\t124831\t0.5741\t13617\tObama\t13617\t0.01043385\t13617.0\n14823\t-75.036309\t44.161237\tStar Lake CDP\tNY\tNew York\tSt. Lawrence County\t783\t45.0\t16.9\t13.0\t21414\t72647\t0.5741\t13690\tObama\t13690\t0.0014383279999999998\t13690.0\n14824\t-73.67903299999999\t42.79161\tWaterford village\tNY\tNew York\tSaratoga County\t2312\t36.6\t16.8\t8.0\t27027\t166875\t0.5019\t12188\tObama\t12188\t0.004247018\t12188.0\n14825\t-74.031817\t43.018469\tGalway village\tNY\tNew York\tSaratoga County\t238\t44.7\t27.6\t5.3\t28539\t201786\t0.5019\t12074\tObama\t12074\t0.00043719300000000005\t12074.0\n14826\t-73.849409\t43.034674\tMilton CDP\tNY\tNew York\tSaratoga County\t3049\t33.2\t36.5\t4.2\t29587\t187273\t0.5019\t12020\tObama\t12020\t0.005600846\t12020.0\n14827\t-73.689421\t42.903376\tMechanicville city\tNY\tNew York\tSaratoga County\t5007\t37.9\t16.9\t3.5\t23354\t160437\t0.5019\t12118\tObama\t12118\t0.009197585999999999\t12118.0\n14828\t-73.635054\t43.295142999999996\tSouth Glens Falls village\tNY\tNew York\tSaratoga County\t3479\t42.4\t10.7\t9.5\t25573\t147856\t0.5019\t12803\tObama\t12803\t0.006390733000000001\t12803.0\n14829\t-73.58081800000001\t43.101471999999994\tSchuylerville village\tNY\tNew York\tSaratoga County\t1135\t40.2\t20.9\t9.4\t21056\t143548\t0.5019\t12871\tObama\t12871\t0.0020849329999999998\t12871.0\n14830\t-73.643867\t42.946669\tStillwater village\tNY\tNew York\tSaratoga County\t1982\t35.6\t14.9\t3.6\t27263\t166437\t0.5019\t12170\tObama\t12170\t0.003640826\t12170.0\n14831\t-73.796087\t42.937554\tRound Lake village\tNY\tNew York\tSaratoga County\t606\t39.0\t19.6\t4.4\t26362\t121324\t0.5019\t12151\tObama\t12151\t0.0011131889999999999\t12151.0\n14832\t-73.830976\t43.245553\tCorinth village\tNY\tNew York\tSaratoga County\t2425\t40.1\t12.7\t8.3\t24291\t138027\t0.5019\t12822\tObama\t12822\t0.004454593\t12822.0\n14833\t-73.851\t43.019658\tNorth Ballston Spa CDP\tNY\tNew York\tSaratoga County\t1284\t42.8\t24.9\t9.0\t30413\t182883\t0.5019\t12020\tObama\t12020\t0.0023586379999999997\t12020.0\n14834\t-73.806431\t42.914046\tCountry Knolls CDP\tNY\tNew York\tSaratoga County\t2333\t44.7\t63.0\t7.0\t41093\t260471\t0.5019\t12151\tObama\t12151\t0.004285594\t12151.0\n14835\t-73.852453\t43.006821\tBallston Spa village\tNY\tNew York\tSaratoga County\t5724\t38.0\t30.4\t7.1\t27694\t176601\t0.5019\t12020\tObama\t12020\t0.010514675\t12020.0\n14836\t-73.777727\t43.06738\tSaratoga Springs city\tNY\tNew York\tSaratoga County\t28343\t37.8\t43.1\t5.3\t33900\t226521\t0.5019\t12866\tObama\t12866\t0.052064543\t12866.0\n14837\t-73.59161800000001\t43.091928\tVictory village\tNY\tNew York\tSaratoga County\t521\t36.0\t14.7\t6.3\t20408\t150806\t0.5019\t12871\tObama\t12871\t0.000957049\t12871.0\n14838\t-74.128587\t42.825199\tMariaville Lake CDP\tNY\tNew York\tSchenectady County\t790\t43.4\t18.4\t5.1\t27193\t231481\t0.5674\t12137\tObama\t12137\t0.001451187\t12137.0\n14839\t-74.052499\t42.877836\tPattersonville-Rotterdam Junction CDP\tNY\tNew York\tSchenectady County\t1028\t44.8\t22.5\t7.1\t29136\t184122\t0.5674\t12150\tObama\t12150\t0.00188838\t12150.0\n14840\t-73.95362\t42.778565\tRotterdam CDP\tNY\tNew York\tSchenectady County\t20976\t44.6\t17.6\t6.6\t26353\t170833\t0.5674\t12303\tObama\t12303\t0.038531766\t12303.0\n14841\t-74.18405600000001\t42.747465999999996\tDelanson village\tNY\tNew York\tSchenectady County\t406\t42.9\t30.1\t5.2\t26979\t180882\t0.5674\t12053\tObama\t12053\t0.0007457999999999999\t12053.0\n14842\t-73.897802\t42.816973\tNiskayuna CDP\tNY\tNew York\tSchenectady County\t4971\t42.6\t61.4\t4.7\t33688\t200940\t0.5674\t12308\tObama\t12308\t0.009131455\t12308.0\n14843\t-73.927686\t42.802621\tSchenectady city\tNY\tNew York\tSchenectady County\t61904\t36.2\t24.3\t9.5\t20830\t134105\t0.5674\t12307\tObama\t12307\t0.113714267\t12307.0\n14844\t-74.134388\t42.763769\tDuanesburg CDP\tNY\tNew York\tSchenectady County\t378\t42.8\t30.2\t5.3\t28282\t186161\t0.5674\t12056\tObama\t12056\t0.000694365\t12056.0\n14845\t-73.920547\t42.861398\tEast Glenville CDP\tNY\tNew York\tSchenectady County\t6818\t48.0\t41.2\t9.7\t32013\t203990\t0.5674\t12008\tObama\t12008\t0.012524293999999998\t12008.0\n14846\t-74.10914\t42.75264\tDuane Lake CDP\tNY\tNew York\tSchenectady County\t391\t42.1\t29.7\t5.2\t29063\t191071\t0.5674\t12056\tObama\t12056\t0.0007182460000000001\t12056.0\n14847\t-73.960564\t42.831944\tScotia village\tNY\tNew York\tSchenectady County\t8161\t41.3\t29.8\t7.6\t24987\t154551\t0.5674\t123HH\tObama\t123HH\t0.014991311\t0.0\n14848\t-74.563068\t42.633609\tRichmondville village\tNY\tNew York\tSchoharie County\t785\t35.0\t15.9\t9.5\t23817\t146173\t0.4109\t12149\tObama\t12149\t0.0014420020000000002\t12149.0\n14849\t-74.48585600000001\t42.679973\tCobleskill village\tNY\tNew York\tSchoharie County\t4509\t28.6\t34.9\t8.7\t21661\t173313\t0.4109\t12043\tObama\t12043\t0.008282787\t12043.0\n14850\t-74.3134\t42.666684000000004\tSchoharie village\tNY\tNew York\tSchoharie County\t1037\t43.4\t25.5\t7.7\t26988\t183263\t0.4109\t12157\tObama\t12157\t0.0019049120000000001\t12157.0\n14851\t-74.61376800000001\t42.793146\tSharon Springs village\tNY\tNew York\tSchoharie County\t545\t42.7\t25.9\t10.2\t20640\t136111\t0.4109\t13459\tObama\t13459\t0.001001135\t13459.0\n14852\t-74.329964\t42.598001000000004\tMiddleburgh village\tNY\tNew York\tSchoharie County\t1424\t41.0\t21.9\t7.3\t23598\t155495\t0.4109\t12122\tObama\t12122\t0.00261581\t12122.0\n14853\t-74.25900899999999\t42.764909\tEsperance village\tNY\tNew York\tSchoharie County\t385\t41.6\t14.1\t9.5\t21233\t139205\t0.4109\t12066\tObama\t12066\t0.0007072239999999999\t12066.0\n14854\t-76.84837399999999\t42.349940000000004\tMontour Falls village\tNY\tNew York\tSchuyler County\t1724\t45.4\t18.1\t7.3\t20311\t103169\t0.451\t14865\tObama\t14865\t0.0031668940000000004\t14865.0\n14855\t-76.843918\t42.416859\tBurdett village\tNY\tNew York\tSchuyler County\t383\t45.4\t29.1\t9.4\t23828\t139583\t0.451\t14818\tObama\t14818\t0.00070355\t14818.0\n14856\t-76.86981\t42.378682\tWatkins Glen village\tNY\tNew York\tSchuyler County\t2105\t43.5\t24.3\t11.8\t21354\t121444\t0.451\t148HH\tObama\t148HH\t0.00386677\t0.0\n14857\t-76.788054\t42.335012\tOdessa village\tNY\tNew York\tSchuyler County\t600\t43.0\t22.7\t7.2\t22419\t107813\t0.451\t14869\tObama\t14869\t0.001102167\t14869.0\n14858\t-76.796\t42.909451000000004\tSeneca Falls village\tNY\tNew York\tSeneca County\t6575\t40.4\t27.0\t8.1\t23687\t112891\t0.5348\t13148\tObama\t13148\t0.012077916000000001\t13148.0\n14859\t-76.859094\t42.904937\tWaterloo village\tNY\tNew York\tSeneca County\t5203\t41.6\t16.0\t9.2\t20955\t99490\t0.5348\t13165\tObama\t13165\t0.009557626999999999\t13165.0\n14860\t-76.724829\t42.618401\tInterlaken village\tNY\tNew York\tSeneca County\t660\t45.0\t28.2\t9.2\t22956\t100000\t0.5348\t14847\tObama\t14847\t0.001212384\t14847.0\n14861\t-76.822695\t42.675655\tOvid village\tNY\tNew York\tSeneca County\t779\t32.3\t20.2\t9.8\t18216\t110714\t0.5348\t14521\tObama\t14521\t0.00143098\t14521.0\n14862\t-76.822626\t42.613475\tLodi village\tNY\tNew York\tSeneca County\t368\t42.8\t21.5\t7.0\t19068\t100000\t0.5348\t14860\tObama\t14860\t0.0006759960000000001\t14860.0\n14863\t-77.056163\t42.147017\tCorning city\tNY\tNew York\tSteuben County\t10331\t38.6\t36.2\t10.4\t25975\t122038\t0.4097\t14830\tObama\t14830\t0.018977483\t14830.0\n14864\t-77.69548\t42.392679\tArkport village\tNY\tNew York\tSteuben County\t854\t44.9\t26.1\t8.9\t25527\t106250\t0.4097\t14807\tObama\t14807\t0.001568751\t14807.0\n14865\t-77.42354499999999\t42.409942\tAvoca village\tNY\tNew York\tSteuben County\t1021\t41.2\t17.6\t10.3\t17999\t92600\t0.4097\t14809\tObama\t14809\t0.001875521\t14809.0\n14866\t-77.605937\t42.270455\tCanisteo village\tNY\tNew York\tSteuben County\t2180\t42.4\t22.1\t12.6\t21019\t87833\t0.4097\t14823\tObama\t14823\t0.0040045409999999995\t14823.0\n14867\t-77.232425\t42.106326\tAddison village\tNY\tNew York\tSteuben County\t1680\t37.4\t17.2\t12.0\t19417\t93804\t0.4097\t14801\tObama\t14801\t0.003086068\t14801.0\n14868\t-77.660081\t42.324354\tHornell city\tNY\tNew York\tSteuben County\t8643\t35.2\t16.3\t13.0\t18772\t80562\t0.4097\t14843\tObama\t14843\t0.015876718999999997\t14843.0\n14869\t-77.03557099999999\t42.126183000000005\tSouth Corning village\tNY\tNew York\tSteuben County\t1155\t43.2\t42.2\t9.2\t31231\t138010\t0.4097\t14830\tObama\t14830\t0.0021216720000000002\t14830.0\n14870\t-77.317981\t42.337618\tBath village\tNY\tNew York\tSteuben County\t5534\t44.2\t20.8\t11.4\t22497\t116615\t0.4097\t14810\tObama\t14810\t0.010165656\t14810.0\n14871\t-77.59134499999999\t42.567783\tWayland village\tNY\tNew York\tSteuben County\t1825\t39.2\t15.1\t8.3\t22297\t108967\t0.4097\t14572\tObama\t14572\t0.003352425\t14572.0\n14872\t-77.22345200000001\t42.408553999999995\tHammondsport village\tNY\tNew York\tSteuben County\t697\t50.6\t27.2\t8.3\t21987\t127143\t0.4097\t14840\tObama\t14840\t0.001280351\t14840.0\n14873\t-77.66080500000001\t42.345087\tNorth Hornell village\tNY\tNew York\tSteuben County\t846\t47.6\t26.7\t10.1\t24617\t124643\t0.4097\t14843\tObama\t14843\t0.001554056\t14843.0\n14874\t-77.092189\t42.163489\tPainted Post village\tNY\tNew York\tSteuben County\t1799\t44.9\t38.3\t6.7\t28757\t141707\t0.4097\t14870\tObama\t14870\t0.003304665\t14870.0\n14875\t-77.223626\t42.283093\tSavona village\tNY\tNew York\tSteuben County\t757\t36.6\t11.3\t12.8\t20505\t91522\t0.4097\t14821\tObama\t14821\t0.0013905679999999998\t14821.0\n14876\t-77.140135\t42.158446000000005\tGang Mills CDP\tNY\tNew York\tSteuben County\t3430\t40.4\t48.8\t7.9\t40147\t167637\t0.4097\t14870\tObama\t14870\t0.006300723\t14870.0\n14877\t-77.500062\t42.500042\tCohocton village\tNY\tNew York\tSteuben County\t809\t36.2\t16.1\t11.9\t20410\t97105\t0.4097\t14826\tObama\t14826\t0.001486089\t14826.0\n14878\t-77.080012\t42.155302\tRiverside village\tNY\tNew York\tSteuben County\t573\t38.3\t10.9\t9.8\t18121\t89130\t0.4097\t14830\tObama\t14830\t0.00105257\t14830.0\n14879\t-73.336978\t40.803609\tDix Hills CDP\tNY\tNew York\tSuffolk County\t26095\t41.6\t59.4\t6.1\t52651\t727110\t0.5104\t11746\tObama\t11746\t0.04793509\t11746.0\n14880\t-72.981645\t40.770625\tEast Patchogue CDP\tNY\tNew York\tSuffolk County\t22089\t40.4\t23.2\t7.4\t33272\t273180\t0.5104\t11772\tObama\t11772\t0.040576287\t11772.0\n14881\t-72.882134\t40.907831\tRidge CDP\tNY\tNew York\tSuffolk County\t14378\t46.9\t24.0\t7.9\t32146\t251404\t0.5104\t11961\tObama\t11961\t0.026411601\t11961.0\n14882\t-72.790991\t40.857526\tManorville CDP\tNY\tNew York\tSuffolk County\t13362\t37.5\t31.5\t6.4\t38258\t338999\t0.5104\t11949\tObama\t11949\t0.024545264\t11949.0\n14883\t-73.24833199999999\t40.782066\tBrentwood CDP\tNY\tNew York\tSuffolk County\t56032\t32.1\t14.8\t10.0\t18642\t249864\t0.5104\t11717\tObama\t11717\t0.102927724\t11717.0\n14884\t-73.322328\t40.762205\tDeer Park CDP\tNY\tNew York\tSuffolk County\t28663\t40.0\t24.5\t6.8\t30844\t311245\t0.5104\t11729\tObama\t11729\t0.052652365\t11729.0\n14885\t-72.726221\t40.840053999999995\tEastport CDP\tNY\tNew York\tSuffolk County\t2084\t40.1\t25.9\t7.4\t32096\t268134\t0.5104\t11941\tObama\t11941\t0.003828194\t11941.0\n14886\t-72.940283\t40.708847\tFire Island CDP\tNY\tNew York\tSuffolk County\t318\t46.7\t48.4\t6.7\t54368\t557692\t0.5104\t11713\tObama\t11713\t0.0005841490000000001\t11713.0\n14887\t-72.221601\t41.005303000000005\tNorthwest Harbor CDP\tNY\tNew York\tSuffolk County\t3501\t45.1\t55.7\t7.2\t48657\t617272\t0.5104\t11937\tObama\t11937\t0.0064311459999999996\t11937.0\n14888\t-73.08413399999999\t40.747951\tSayville CDP\tNY\tNew York\tSuffolk County\t17455\t40.8\t40.3\t5.8\t37196\t372349\t0.5104\t11782\tObama\t11782\t0.032063882\t11782.0\n14889\t-72.764567\t40.916272\tCalverton CDP\tNY\tNew York\tSuffolk County\t6738\t46.2\t20.6\t8.4\t33659\t200949\t0.5104\t11933\tObama\t11933\t0.012377338\t11933.0\n14890\t-73.152221\t40.846657\tNesconset CDP\tNY\tNew York\tSuffolk County\t13204\t40.4\t44.6\t7.2\t43416\t449477\t0.5104\t11767\tObama\t11767\t0.024255027000000002\t11767.0\n14891\t-73.37732\t40.746499\tWyandanch CDP\tNY\tNew York\tSuffolk County\t11251\t28.3\t9.8\t12.7\t17815\t216415\t0.5104\t11798\tObama\t11798\t0.020667472\t11798.0\n14892\t-73.395061\t40.933062\tEatons Neck CDP\tNY\tNew York\tSuffolk County\t1382\t45.9\t60.8\t10.2\t55687\t672674\t0.5104\t11721\tObama\t11721\t0.002538659\t11721.0\n14893\t-73.325056\t40.731171999999994\tNorth Babylon CDP\tNY\tNew York\tSuffolk County\t17941\t40.5\t26.1\t9.4\t30041\t301564\t0.5104\t11703\tObama\t11703\t0.032956637000000004\t11703.0\n14894\t-72.98775699999999\t40.936902\tMiller Place CDP\tNY\tNew York\tSuffolk County\t14522\t38.5\t43.3\t5.7\t36235\t361750\t0.5104\t11764\tObama\t11764\t0.026676121\t11764.0\n14895\t-72.759744\t40.809359\tEast Moriches CDP\tNY\tNew York\tSuffolk County\t5742\t40.2\t31.9\t7.2\t35699\t297656\t0.5104\t11940\tObama\t11940\t0.01054774\t11940.0\n14896\t-72.277212\t41.144788\tOrient CDP\tNY\tNew York\tSuffolk County\t719\t59.6\t45.3\t4.0\t38879\t549679\t0.5104\t11957\tObama\t11957\t0.0013207639999999999\t11957.0\n14897\t-72.796406\t40.802112\tCenter Moriches CDP\tNY\tNew York\tSuffolk County\t7355\t38.7\t28.9\t9.3\t33834\t282563\t0.5104\t11934\tObama\t11934\t0.013510733\t11934.0\n14898\t-71.988171\t41.270226\tFishers Island CDP\tNY\tNew York\tSuffolk County\t288\t46.7\t46.6\t0.0\t37830\t526316\t0.5104\t063HH\tObama\t063HH\t0.00052904\t0.0\n14899\t-72.967774\t40.864484000000004\tGordon Heights CDP\tNY\tNew York\tSuffolk County\t3505\t29.9\t23.7\t9.8\t24653\t250336\t0.5104\t11953\tObama\t11953\t0.006438494\t11953.0\n14900\t-73.065071\t40.925948999999996\tPort Jefferson Station CDP\tNY\tNew York\tSuffolk County\t8138\t39.0\t30.5\t9.3\t33405\t280846\t0.5104\t11777\tObama\t11777\t0.014949061999999999\t11777.0\n14901\t-73.21601\t40.859547\tSmithtown CDP\tNY\tNew York\tSuffolk County\t27365\t42.1\t43.4\t6.6\t40566\t489735\t0.5104\t11787\tObama\t11787\t0.05026801\t11787.0\n14902\t-73.338877\t40.846204\tElwood CDP\tNY\tNew York\tSuffolk County\t10958\t41.2\t45.9\t6.7\t41148\t494639\t0.5104\t11740\tObama\t11740\t0.020129247\t11740.0\n14903\t-73.191774\t40.902844\tNissequogue village\tNY\tNew York\tSuffolk County\t1716\t44.5\t63.5\t5.3\t70089\t986702\t0.5104\t11780\tObama\t11780\t0.0031521979999999997\t11780.0\n14904\t-73.054405\t40.746715\tBayport CDP\tNY\tNew York\tSuffolk County\t8957\t41.2\t38.8\t5.8\t42265\t391844\t0.5104\t11705\tObama\t11705\t0.01645352\t11705.0\n14905\t-72.48734300000001\t41.014075\tCutchogue CDP\tNY\tNew York\tSuffolk County\t3055\t48.3\t47.5\t7.3\t46759\t457576\t0.5104\t11935\tObama\t11935\t0.005611868000000001\t11935.0\n14906\t-73.24611\t40.888985999999996\tKings Park CDP\tNY\tNew York\tSuffolk County\t16320\t40.9\t34.4\t5.9\t36147\t395719\t0.5104\t11754\tObama\t11754\t0.029978948999999998\t11754.0\n14907\t-72.912238\t40.779528000000006\tBrookhaven CDP\tNY\tNew York\tSuffolk County\t3756\t40.7\t34.5\t9.5\t36628\t329124\t0.5104\t11719\tObama\t11719\t0.006899567\t11719.0\n14908\t-72.397098\t40.879011\tSouthampton village\tNY\tNew York\tSuffolk County\t4131\t45.8\t41.8\t7.3\t48410\t706250\t0.5104\t11968\tObama\t11968\t0.007588421\t11968.0\n14909\t-73.289909\t40.753515\tBaywood CDP\tNY\tNew York\tSuffolk County\t7537\t38.4\t15.8\t6.6\t25459\t248720\t0.5104\t11703\tObama\t11703\t0.013845057\t11703.0\n14910\t-73.17108499999999\t40.806882\tIslandia village\tNY\tNew York\tSuffolk County\t3110\t39.9\t29.5\t5.7\t32715\t281930\t0.5104\t11722\tObama\t11722\t0.0057129\t11722.0\n14911\t-72.65756\t40.835285\tWesthampton CDP\tNY\tNew York\tSuffolk County\t3608\t41.7\t43.8\t6.1\t44527\t528191\t0.5104\t11977\tObama\t11977\t0.006627699\t11977.0\n14912\t-73.05781800000001\t40.946598\tPort Jefferson village\tNY\tNew York\tSuffolk County\t8106\t43.1\t60.0\t6.7\t43848\t474702\t0.5104\t11777\tObama\t11777\t0.014890279\t11777.0\n14913\t-73.393137\t40.672774\tCopiague CDP\tNY\tNew York\tSuffolk County\t22722\t38.9\t17.5\t9.2\t30050\t274764\t0.5104\t11726\tObama\t11726\t0.041739073\t11726.0\n14914\t-72.67499699999999\t40.946874\tRiverhead CDP\tNY\tNew York\tSuffolk County\t12271\t41.1\t18.0\t9.6\t26035\t233273\t0.5104\t11901\tObama\t11901\t0.022541157000000003\t11901.0\n14915\t-72.661063\t40.898592\tRiverside CDP\tNY\tNew York\tSuffolk County\t2936\t36.0\t7.7\t12.1\t19544\t183396\t0.5104\t11901\tObama\t11901\t0.005393271999999999\t11901.0\n14916\t-73.100844\t40.929078999999994\tSetauket-East Setauket CDP\tNY\tNew York\tSuffolk County\t16574\t39.6\t62.1\t6.2\t52918\t527610\t0.5104\t11733\tObama\t11733\t0.030445532999999997\t11733.0\n14917\t-73.416025\t40.732935\tEast Farmingdale CDP\tNY\tNew York\tSuffolk County\t5424\t36.7\t27.7\t9.7\t30674\t334825\t0.5104\t11735\tObama\t11735\t0.009963592\t11735.0\n14918\t-73.37125\t40.686052000000004\tLindenhurst village\tNY\tNew York\tSuffolk County\t28307\t38.6\t20.6\t7.8\t29614\t296623\t0.5104\t11757\tObama\t11757\t0.051998413\t11757.0\n14919\t-73.32142900000001\t40.88071\tEast Northport CDP\tNY\tNew York\tSuffolk County\t20771\t41.7\t43.0\t6.3\t34493\t430965\t0.5104\t11731\tObama\t11731\t0.038155192000000004\t11731.0\n14920\t-72.31415\t41.058541999999996\tShelter Island CDP\tNY\tNew York\tSuffolk County\t1270\t49.1\t42.9\t8.2\t31124\t488806\t0.5104\t11964\tObama\t11964\t0.002332921\t11964.0\n14921\t-73.41346899999999\t40.886148999999996\tHalesite CDP\tNY\tNew York\tSuffolk County\t2557\t43.5\t59.3\t7.1\t62329\t606654\t0.5104\t11743\tObama\t11743\t0.004697069\t11743.0\n14922\t-73.043235\t40.839895\tFarmingville CDP\tNY\tNew York\tSuffolk County\t16601\t37.4\t26.1\t8.8\t31208\t285775\t0.5104\t11738\tObama\t11738\t0.03049513\t11738.0\n14923\t-73.069898\t40.794354\tHolbrook CDP\tNY\tNew York\tSuffolk County\t28092\t38.5\t27.4\t6.5\t34424\t317194\t0.5104\t11741\tObama\t11741\t0.05160347\t11741.0\n14924\t-73.4137\t40.901588000000004\tHuntington Bay village\tNY\tNew York\tSuffolk County\t1498\t48.8\t73.7\t7.1\t88759\t1000001\t0.5104\t11743\tObama\t11743\t0.0027517440000000004\t11743.0\n14925\t-73.162042\t40.896949\tHead of the Harbor village\tNY\tNew York\tSuffolk County\t1500\t45.6\t64.6\t4.4\t70577\t922872\t0.5104\t11780\tObama\t11780\t0.002755418\t11780.0\n14926\t-73.38597299999999\t40.707218\tNorth Lindenhurst CDP\tNY\tNew York\tSuffolk County\t11851\t38.7\t17.7\t7.5\t27710\t277529\t0.5104\t11757\tObama\t11757\t0.02176964\t11757.0\n14927\t-73.407161\t40.877761\tHuntington CDP\tNY\tNew York\tSuffolk County\t18417\t43.3\t63.7\t6.3\t54435\t592058\t0.5104\t11743\tObama\t11743\t0.033831022999999995\t11743.0\n14928\t-72.629215\t40.823494000000004\tQuioque CDP\tNY\tNew York\tSuffolk County\t967\t38.7\t44.3\t6.1\t40452\t467647\t0.5104\t11978\tObama\t11978\t0.0017763260000000002\t11978.0\n14929\t-72.88008\t40.946565\tEast Shoreham CDP\tNY\tNew York\tSuffolk County\t6303\t39.3\t43.9\t6.9\t39465\t379921\t0.5104\t11786\tObama\t11786\t0.011578267\t11786.0\n14930\t-72.435916\t40.901544\tTuckahoe CDP\tNY\tNew York\tSuffolk County\t1887\t43.0\t40.9\t7.3\t45789\t565689\t0.5104\t11968\tObama\t11968\t0.0034663159999999997\t11968.0\n14931\t-73.195193\t40.638642\tSaltaire village\tNY\tNew York\tSuffolk County\t43\t45.6\t46.9\t3.7\t50272\t625000\t0.5104\t11770\tObama\t11770\t7.900000000000001e-05\t11770.0\n14932\t-73.283381\t40.844198999999996\tCommack CDP\tNY\tNew York\tSuffolk County\t36254\t41.8\t43.5\t6.8\t37875\t475118\t0.5104\t11725\tObama\t11725\t0.066596618\t11725.0\n14933\t-72.841696\t40.762797\tMastic Beach CDP\tNY\tNew York\tSuffolk County\t12330\t32.8\t12.9\t10.9\t24483\t181574\t0.5104\t11951\tObama\t11951\t0.022649537\t11951.0\n14934\t-73.35713\t40.712317\tWest Babylon CDP\tNY\tNew York\tSuffolk County\t43772\t39.6\t21.5\t8.3\t29775\t290896\t0.5104\t11704\tObama\t11704\t0.080406773\t11704.0\n14935\t-72.618421\t40.972203\tNorthville CDP\tNY\tNew York\tSuffolk County\t921\t43.1\t27.4\t7.5\t37714\t412500\t0.5104\t11947\tObama\t11947\t0.0016918270000000001\t11947.0\n14936\t-73.21204300000001\t40.821558\tHauppauge CDP\tNY\tNew York\tSuffolk County\t20380\t41.6\t44.5\t7.3\t38648\t466922\t0.5104\t11788\tObama\t11788\t0.037436947000000005\t11788.0\n14937\t-73.066863\t40.960627\tBelle Terre village\tNY\tNew York\tSuffolk County\t869\t47.4\t73.7\t7.4\t72746\t903646\t0.5104\t11777\tObama\t11777\t0.001596306\t11777.0\n14938\t-73.019039\t40.763124\tPatchogue village\tNY\tNew York\tSuffolk County\t12524\t37.3\t28.7\t9.9\t31082\t250386\t0.5104\t11772\tObama\t11772\t0.023005904\t11772.0\n14939\t-73.404974\t40.844637\tHuntington Station CDP\tNY\tNew York\tSuffolk County\t30458\t36.5\t33.2\t8.0\t29112\t326710\t0.5104\t11743\tObama\t11743\t0.055949682\t11743.0\n14940\t-73.32748000000001\t40.69652\tBabylon village\tNY\tNew York\tSuffolk County\t12604\t41.1\t39.9\t6.3\t38903\t377661\t0.5104\t11702\tObama\t11702\t0.02315286\t11702.0\n14941\t-73.343721\t40.903853999999995\tNorthport village\tNY\tNew York\tSuffolk County\t7564\t44.2\t60.4\t6.2\t55785\t612106\t0.5104\t11768\tObama\t11768\t0.013894655\t11768.0\n14942\t-72.34204100000001\t41.129824\tEast Marion CDP\tNY\tNew York\tSuffolk County\t791\t51.7\t34.7\t10.5\t29295\t377273\t0.5104\t11939\tObama\t11939\t0.001453024\t11939.0\n14943\t-73.133361\t40.739275\tOakdale CDP\tNY\tNew York\tSuffolk County\t8417\t42.8\t39.1\t6.0\t41019\t393556\t0.5104\t11769\tObama\t11769\t0.015461569\t11769.0\n14944\t-72.96542600000001\t40.955515999999996\tSound Beach CDP\tNY\tNew York\tSuffolk County\t10728\t37.6\t29.7\t8.0\t32817\t266078\t0.5104\t11789\tObama\t11789\t0.01970675\t11789.0\n14945\t-72.251008\t40.959323\tWainscott CDP\tNY\tNew York\tSuffolk County\t681\t46.6\t45.8\t14.0\t54549\t833333\t0.5104\t11975\tObama\t11975\t0.00125096\t11975.0\n14946\t-72.82298399999999\t40.946482\tWading River CDP\tNY\tNew York\tSuffolk County\t7671\t40.5\t39.1\t5.9\t36960\t343542\t0.5104\t11792\tObama\t11792\t0.014091208000000001\t11792.0\n14947\t-73.124236\t40.803687\tRonkonkoma CDP\tNY\tNew York\tSuffolk County\t20081\t38.3\t24.7\t7.6\t31919\t285223\t0.5104\t11779\tObama\t11779\t0.036887699999999995\t11779.0\n14948\t-73.41015\t40.781546999999996\tMelville CDP\tNY\tNew York\tSuffolk County\t18120\t42.5\t52.1\t6.8\t54492\t652514\t0.5104\t11747\tObama\t11747\t0.03328545\t11747.0\n14949\t-72.69012\t40.877528000000005\tNorthampton CDP\tNY\tNew York\tSuffolk County\t469\t54.3\t12.9\t12.3\t25273\t99250\t0.5104\t11972\tObama\t11972\t0.000861527\t11972.0\n14950\t-72.82384\t40.807782\tMoriches CDP\tNY\tNew York\tSuffolk County\t2686\t50.9\t37.1\t9.1\t45393\t349774\t0.5104\t11955\tObama\t11955\t0.004934035\t11955.0\n14951\t-73.297933\t40.907383\tFort Salonga CDP\tNY\tNew York\tSuffolk County\t9630\t43.6\t57.7\t6.5\t52447\t700836\t0.5104\t11768\tObama\t11768\t0.017689784\t11768.0\n14952\t-73.12709699999999\t40.771687\tBohemia CDP\tNY\tNew York\tSuffolk County\t10382\t41.2\t25.0\t5.6\t33379\t329461\t0.5104\t11716\tObama\t11716\t0.019071167\t11716.0\n14953\t-72.40136\t40.935982\tNorth Sea CDP\tNY\tNew York\tSuffolk County\t5317\t46.7\t41.1\t6.6\t47366\t564369\t0.5104\t11968\tObama\t11968\t0.009767039\t11968.0\n14954\t-72.58077\t40.955134\tJamesport CDP\tNY\tNew York\tSuffolk County\t1599\t46.8\t38.9\t8.3\t48740\t357018\t0.5104\t11947\tObama\t11947\t0.002937276\t11947.0\n14955\t-73.044946\t40.812856\tHoltsville CDP\tNY\tNew York\tSuffolk County\t18372\t37.7\t24.0\t6.9\t32092\t297340\t0.5104\t11742\tObama\t11742\t0.033748361\t11742.0\n14956\t-73.035213\t40.751708\tBlue Point CDP\tNY\tNew York\tSuffolk County\t4715\t42.0\t44.0\t8.3\t38298\t347052\t0.5104\t11715\tObama\t11715\t0.008661196999999999\t11715.0\n14957\t-72.426536\t41.060196999999995\tSouthold CDP\tNY\tNew York\tSuffolk County\t6442\t49.5\t37.1\t8.6\t39603\t412566\t0.5104\t11971\tObama\t11971\t0.011833602\t11971.0\n14958\t-72.601509\t40.824271\tQuogue village\tNY\tNew York\tSuffolk County\t1030\t49.4\t52.2\t7.1\t68664\t818421\t0.5104\t11959\tObama\t11959\t0.001892054\t11959.0\n14959\t-72.313849\t41.023062\tNorth Haven village\tNY\tNew York\tSuffolk County\t1013\t52.6\t53.4\t4.5\t57455\t747748\t0.5104\t11963\tObama\t11963\t0.001860826\t11963.0\n14960\t-73.167027\t40.759418\tNorth Great River CDP\tNY\tNew York\tSuffolk County\t3887\t38.9\t19.8\t6.6\t26722\t315385\t0.5104\t11752\tObama\t11752\t0.007140206999999999\t11752.0\n14961\t-72.740442\t40.964604\tBaiting Hollow CDP\tNY\tNew York\tSuffolk County\t1647\t46.6\t41.4\t8.7\t60674\t347386\t0.5104\t11933\tObama\t11933\t0.0030254490000000004\t11933.0\n14962\t-73.370411\t40.762639\tWheatley Heights CDP\tNY\tNew York\tSuffolk County\t5050\t37.2\t37.1\t8.8\t32345\t349043\t0.5104\t11798\tObama\t11798\t0.009276574000000001\t11798.0\n14963\t-72.274765\t40.938764\tSagaponack CDP\tNY\tNew York\tSuffolk County\t627\t53.3\t55.6\t7.1\t52708\t882353\t0.5104\t11962\tObama\t11962\t0.001151765\t11962.0\n14964\t-72.158417\t41.021345000000004\tSprings CDP\tNY\tNew York\tSuffolk County\t6106\t42.9\t42.3\t7.5\t41178\t423504\t0.5104\t11937\tObama\t11937\t0.011216388\t11937.0\n14965\t-72.924145\t40.832516\tYaphank CDP\tNY\tNew York\tSuffolk County\t5963\t39.6\t26.6\t7.2\t34848\t248196\t0.5104\t11980\tObama\t11980\t0.010953705\t11980.0\n14966\t-73.005874\t40.881229\tCoram CDP\tNY\tNew York\tSuffolk County\t38501\t37.6\t31.5\t8.3\t32690\t277413\t0.5104\t11727\tObama\t11727\t0.070724234\t11727.0\n14967\t-73.152041\t40.876075\tSt. James CDP\tNY\tNew York\tSuffolk County\t13559\t43.3\t37.0\t6.7\t37706\t412215\t0.5104\t11780\tObama\t11780\t0.024907142\t11780.0\n14968\t-72.946146\t40.787253\tNorth Bellport CDP\tNY\tNew York\tSuffolk County\t10918\t32.2\t18.6\t11.2\t23556\t236304\t0.5104\t11713\tObama\t11713\t0.02005577\t11713.0\n14969\t-72.696736\t40.826608\tRemsenburg-Speonk CDP\tNY\tNew York\tSuffolk County\t2933\t43.7\t41.2\t5.0\t49599\t506281\t0.5104\t11972\tObama\t11972\t0.005387761\t11972.0\n14970\t-73.415654\t40.672073\tAmityville village\tNY\tNew York\tSuffolk County\t10111\t43.8\t31.3\t7.0\t37212\t363828\t0.5104\t11701\tObama\t11701\t0.018573355\t11701.0\n14971\t-73.448516\t40.860648\tCold Spring Harbor CDP\tNY\tNew York\tSuffolk County\t4994\t43.0\t66.0\t5.3\t65081\t773052\t0.5104\t11724\tObama\t11724\t0.009173705\t11724.0\n14972\t-71.94525\t41.046822\tMontauk CDP\tNY\tNew York\tSuffolk County\t4475\t44.3\t30.4\t14.5\t31680\t577121\t0.5104\t11954\tObama\t11954\t0.008220330999999999\t11954.0\n14973\t-73.25156899999999\t40.731503000000004\tBay Shore CDP\tNY\tNew York\tSuffolk County\t24462\t36.7\t25.5\t7.7\t30497\t267734\t0.5104\t11706\tObama\t11706\t0.044935357999999995\t11706.0\n14974\t-73.082032\t40.870629\tCentereach CDP\tNY\tNew York\tSuffolk County\t28993\t38.8\t27.6\t7.9\t30754\t283799\t0.5104\t11720\tObama\t11720\t0.053258557000000005\t11720.0\n14975\t-72.844024\t40.802925\tMastic CDP\tNY\tNew York\tSuffolk County\t16348\t32.9\t11.3\t11.1\t24667\t195808\t0.5104\t11950\tObama\t11950\t0.030030382999999997\t11950.0\n14976\t-72.541558\t41.001841\tMattituck CDP\tNY\tNew York\tSuffolk County\t4552\t45.7\t40.5\t5.8\t36204\t379303\t0.5104\t11952\tObama\t11952\t0.008361775\t11952.0\n14977\t-73.370737\t40.893772\tCenterport CDP\tNY\tNew York\tSuffolk County\t5506\t43.8\t63.4\t5.3\t55017\t615471\t0.5104\t11721\tObama\t11721\t0.010114221\t11721.0\n14978\t-72.477537\t40.997708\tNew Suffolk CDP\tNY\tNew York\tSuffolk County\t346\t58.3\t36.4\t4.1\t49973\t468000\t0.5104\t11956\tObama\t11956\t0.000635583\t11956.0\n14979\t-72.34111700000001\t40.983657\tNoyack CDP\tNY\tNew York\tSuffolk County\t3288\t48.5\t44.3\t8.9\t38850\t573090\t0.5104\t11963\tObama\t11963\t0.006039876\t11963.0\n14980\t-73.116796\t40.85845\tLake Grove village\tNY\tNew York\tSuffolk County\t11258\t38.5\t34.1\t7.0\t36668\t341267\t0.5104\t11755\tObama\t11755\t0.020680331\t11755.0\n14981\t-73.024186\t40.783874\tNorth Patchogue CDP\tNY\tNew York\tSuffolk County\t7966\t39.0\t22.4\t6.8\t31046\t245197\t0.5104\t11772\tObama\t11772\t0.014633107\t11772.0\n14982\t-73.39224499999999\t40.822527\tSouth Huntington CDP\tNY\tNew York\tSuffolk County\t9515\t43.5\t46.5\t7.1\t42356\t412079\t0.5104\t11746\tObama\t11746\t0.017478535\t11746.0\n14983\t-72.074178\t40.994015999999995\tNapeague CDP\tNY\tNew York\tSuffolk County\t240\t53.7\t49.0\t8.7\t49019\t837500\t0.5104\t11930\tObama\t11930\t0.00044086699999999995\t11930.0\n14984\t-73.15655\t40.6464\tOcean Beach village\tNY\tNew York\tSuffolk County\t137\t47.5\t46.6\t5.7\t50665\t618750\t0.5104\t11770\tObama\t11770\t0.000251662\t11770.0\n14985\t-73.161087\t40.718096\tGreat River CDP\tNY\tNew York\tSuffolk County\t1538\t43.0\t45.1\t6.6\t40154\t618750\t0.5104\t11730\tObama\t11730\t0.002825222\t11730.0\n14986\t-73.018641\t40.935052\tMount Sinai CDP\tNY\tNew York\tSuffolk County\t10054\t38.6\t39.3\t6.0\t43395\t407753\t0.5104\t11766\tObama\t11766\t0.018468649\t11766.0\n14987\t-72.712946\t40.777245\tWest Hampton Dunes village\tNY\tNew York\tSuffolk County\t12\t51.3\t50.0\t0.0\t62641\t500000\t0.5104\t11960\tObama\t11960\t2.2e-05\t11960.0\n14988\t-72.468799\t41.036843\tPeconic CDP\tNY\tNew York\tSuffolk County\t1297\t50.2\t31.4\t6.8\t30846\t515244\t0.5104\t11958\tObama\t11958\t0.0023825179999999997\t11958.0\n14989\t-73.412306\t40.700749\tNorth Amityville CDP\tNY\tNew York\tSuffolk County\t17261\t34.8\t18.3\t11.4\t23549\t235947\t0.5104\t11701\tObama\t11701\t0.031707514\t11701.0\n14990\t-73.29728100000001\t40.71137\tWest Islip CDP\tNY\tNew York\tSuffolk County\t28923\t40.5\t31.7\t5.9\t35233\t374793\t0.5104\t11795\tObama\t11795\t0.053129971\t11795.0\n14991\t-72.614488\t40.942614\tAquebogue CDP\tNY\tNew York\tSuffolk County\t2402\t42.3\t34.9\t6.3\t34985\t304054\t0.5104\t11947\tObama\t11947\t0.004412343\t11947.0\n14992\t-72.384238\t41.103102\tGreenport West CDP\tNY\tNew York\tSuffolk County\t2405\t51.2\t33.5\t10.4\t35598\t301471\t0.5104\t11944\tObama\t11944\t0.004417854000000001\t11944.0\n14993\t-72.55595699999999\t40.974176\tLaurel CDP\tNY\tNew York\tSuffolk County\t1250\t42.7\t37.6\t9.6\t40158\t386667\t0.5104\t11948\tObama\t11948\t0.002296182\t11948.0\n14994\t-72.945385\t40.885625\tMiddle Island CDP\tNY\tNew York\tSuffolk County\t10525\t39.6\t23.7\t6.9\t31085\t238575\t0.5104\t11953\tObama\t11953\t0.01933385\t11953.0\n14995\t-72.309889\t40.936451\tBridgehampton CDP\tNY\tNew York\tSuffolk County\t1433\t53.9\t51.2\t8.7\t50980\t972701\t0.5104\t11932\tObama\t11932\t0.002632343\t11932.0\n14996\t-72.907077\t40.957139\tShoreham village\tNY\tNew York\tSuffolk County\t470\t49.0\t70.3\t5.2\t56062\t589015\t0.5104\t11786\tObama\t11786\t0.0008633639999999999\t11786.0\n14997\t-72.341385\t41.092999\tDering Harbor village\tNY\tNew York\tSuffolk County\t13\t62.5\t54.5\t0.0\t47659\t625000\t0.5104\t11965\tObama\t11965\t2.3899999999999998e-05\t11965.0\n14998\t-73.268561\t40.719415999999995\tBrightwaters village\tNY\tNew York\tSuffolk County\t3248\t41.5\t59.4\t9.6\t46266\t457018\t0.5104\t11718\tObama\t11718\t0.005966399\t11718.0\n14999\t-73.105257\t40.729938\tWest Sayville CDP\tNY\tNew York\tSuffolk County\t4997\t40.5\t31.3\t8.1\t34306\t322191\t0.5104\t11796\tObama\t11796\t0.009179216\t11796.0\n15000\t-73.383059\t40.939962\tAsharoken village\tNY\tNew York\tSuffolk County\t619\t49.3\t56.5\t4.4\t62323\t973214\t0.5104\t11721\tObama\t11721\t0.0011370689999999999\t11721.0\n15001\t-73.04914000000001\t40.909027\tTerryville CDP\tNY\tNew York\tSuffolk County\t11870\t37.8\t27.9\t7.8\t32292\t293126\t0.5104\t11776\tObama\t11776\t0.021804542000000003\t11776.0\n15002\t-72.36034000000001\t41.074882\tShelter Island Heights CDP\tNY\tNew York\tSuffolk County\t988\t59.2\t56.7\t3.6\t47243\t621503\t0.5104\t11965\tObama\t11965\t0.0018149020000000002\t11965.0\n15003\t-72.134249\t40.983792\tAmagansett CDP\tNY\tNew York\tSuffolk County\t1150\t53.9\t48.9\t9.0\t48938\t843750\t0.5104\t11930\tObama\t11930\t0.002112487\t11930.0\n15004\t-72.349913\t40.924102000000005\tWatermill CDP\tNY\tNew York\tSuffolk County\t2117\t49.8\t53.4\t4.5\t64574\t987158\t0.5104\t11976\tObama\t11976\t0.003888813\t11976.0\n15005\t-73.266123\t40.649861\tGilgo-Oak Beach-Captree CDP\tNY\tNew York\tSuffolk County\t330\t47.7\t46.0\t5.2\t50750\t617925\t0.5104\t11702\tObama\t11702\t0.000606192\t11702.0\n15006\t-73.194367\t40.783601000000004\tCentral Islip CDP\tNY\tNew York\tSuffolk County\t33031\t32.4\t19.3\t9.2\t22990\t239272\t0.5104\t11722\tObama\t11722\t0.060676142999999995\t11722.0\n15007\t-72.934664\t40.934104\tRocky Point CDP\tNY\tNew York\tSuffolk County\t11103\t34.4\t25.2\t6.6\t30899\t242147\t0.5104\t11778\tObama\t11778\t0.020395605\t11778.0\n15008\t-73.18661999999999\t40.728459\tEast Islip CDP\tNY\tNew York\tSuffolk County\t14120\t40.2\t32.9\t6.4\t33981\t343684\t0.5104\t11730\tObama\t11730\t0.025937669\t11730.0\n15009\t-72.52458399999999\t40.880321\tHampton Bays CDP\tNY\tNew York\tSuffolk County\t13120\t42.1\t31.3\t9.8\t34983\t315772\t0.5104\t11946\tObama\t11946\t0.024100722999999998\t11946.0\n15010\t-73.047347\t40.869935999999996\tSelden CDP\tNY\tNew York\tSuffolk County\t22336\t36.7\t18.0\t7.9\t27434\t264756\t0.5104\t11784\tObama\t11784\t0.041030012000000005\t11784.0\n15011\t-73.184364\t40.852422999999995\tVillage of the Branch village\tNY\tNew York\tSuffolk County\t1902\t44.6\t50.3\t8.7\t39362\t571925\t0.5104\t11787\tObama\t11787\t0.00349387\t11787.0\n15012\t-73.111212\t40.830715000000005\tLake Ronkonkoma CDP\tNY\tNew York\tSuffolk County\t20073\t40.3\t27.0\t7.8\t31607\t294884\t0.5104\t11779\tObama\t11779\t0.036873005\t11779.0\n15013\t-72.644897\t40.811935\tWesthampton Beach village\tNY\tNew York\tSuffolk County\t2074\t47.0\t48.7\t7.3\t53711\t574735\t0.5104\t11978\tObama\t11978\t0.003809825\t11978.0\n15014\t-73.272266\t40.707986\tWest Bay Shore CDP\tNY\tNew York\tSuffolk County\t5091\t45.3\t39.1\t5.7\t41832\t353061\t0.5104\t11718\tObama\t11718\t0.009351889\t11718.0\n15015\t-73.36421899999999\t40.863044\tGreenlawn CDP\tNY\tNew York\tSuffolk County\t13453\t42.2\t38.4\t8.9\t35238\t402422\t0.5104\t11740\tObama\t11740\t0.024712426000000003\t11740.0\n15016\t-73.09022\t40.952901000000004\tPoquott village\tNY\tNew York\tSuffolk County\t985\t42.9\t69.5\t6.6\t65149\t634921\t0.5104\t11733\tObama\t11733\t0.001809391\t11733.0\n15017\t-73.468661\t40.913676\tLloyd Harbor village\tNY\tNew York\tSuffolk County\t3703\t44.3\t76.9\t6.4\t78169\t1000001\t0.5104\t11724\tObama\t11724\t0.006802209\t11724.0\n15018\t-73.26235\t40.759444\tNorth Bay Shore CDP\tNY\tNew York\tSuffolk County\t15278\t31.7\t12.5\t8.7\t19444\t253222\t0.5104\t11717\tObama\t11717\t0.028064852\t11717.0\n15019\t-73.18727700000001\t40.750611\tIslip Terrace CDP\tNY\tNew York\tSuffolk County\t5577\t36.8\t18.9\t8.0\t30469\t305314\t0.5104\t11752\tObama\t11752\t0.010244644\t11752.0\n15020\t-72.18896600000001\t40.972863000000004\tEast Hampton North CDP\tNY\tNew York\tSuffolk County\t4489\t44.4\t33.7\t6.8\t34172\t568059\t0.5104\t11937\tObama\t11937\t0.008246048\t11937.0\n15021\t-72.87371\t40.796622\tShirley CDP\tNY\tNew York\tSuffolk County\t26587\t34.2\t14.1\t9.7\t26789\t218016\t0.5104\t11967\tObama\t11967\t0.048838867\t11967.0\n15022\t-72.196311\t40.952498\tEast Hampton village\tNY\tNew York\tSuffolk County\t1524\t56.2\t53.2\t6.6\t55165\t942434\t0.5104\t11937\tObama\t11937\t0.002799505\t11937.0\n15023\t-73.132083\t40.961251000000004\tOld Field village\tNY\tNew York\tSuffolk County\t982\t43.1\t76.4\t6.3\t76692\t822266\t0.5104\t11733\tObama\t11733\t0.00180388\t11733.0\n15024\t-72.986561\t40.821253000000006\tMedford CDP\tNY\tNew York\tSuffolk County\t23217\t37.5\t22.0\t7.0\t30219\t258639\t0.5104\t11763\tObama\t11763\t0.042648360999999996\t11763.0\n15025\t-72.943039\t40.754859\tBellport village\tNY\tNew York\tSuffolk County\t2312\t49.0\t49.1\t4.6\t47029\t346585\t0.5104\t11713\tObama\t11713\t0.004247018\t11713.0\n15026\t-72.37535\t41.103667\tGreenport village\tNY\tNew York\tSuffolk County\t2386\t43.6\t24.4\t15.5\t24641\t270378\t0.5104\t11944\tObama\t11944\t0.004382952\t11944.0\n15027\t-72.590912\t40.857054999999995\tEast Quogue CDP\tNY\tNew York\tSuffolk County\t5545\t41.6\t34.2\t6.9\t39504\t377608\t0.5104\t11942\tObama\t11942\t0.010185862\t11942.0\n15028\t-72.601923\t40.892365000000005\tFlanders CDP\tNY\tNew York\tSuffolk County\t4130\t36.3\t17.5\t11.0\t26536\t210127\t0.5104\t11942\tObama\t11942\t0.007586584\t11942.0\n15029\t-73.216951\t40.736497\tIslip CDP\tNY\tNew York\tSuffolk County\t20593\t38.2\t28.4\t7.0\t32173\t305962\t0.5104\t11751\tObama\t11751\t0.037828216\t11751.0\n15030\t-72.29310600000001\t40.995111\tSag Harbor village\tNY\tNew York\tSuffolk County\t2677\t49.1\t47.9\t5.7\t53618\t622520\t0.5104\t11963\tObama\t11963\t0.004917503\t11963.0\n15031\t-73.127136\t40.905225\tStony Brook CDP\tNY\tNew York\tSuffolk County\t13850\t41.6\t60.7\t5.6\t43544\t445731\t0.5104\t11790\tObama\t11790\t0.025441693999999997\t11790.0\n15032\t-73.433971\t40.819947\tWest Hills CDP\tNY\tNew York\tSuffolk County\t5607\t43.7\t59.4\t8.3\t53065\t635794\t0.5104\t11797\tObama\t11797\t0.010299753\t11797.0\n15033\t-72.460138\t40.88698\tShinnecock Hills CDP\tNY\tNew York\tSuffolk County\t2007\t28.2\t46.5\t5.0\t46324\t633703\t0.5104\t11968\tObama\t11968\t0.0036867490000000004\t11968.0\n15034\t-74.826418\t41.893622\tLivingston Manor CDP\tNY\tNew York\tSullivan County\t1356\t39.3\t14.1\t12.4\t19695\t130804\t0.5373\t12758\tObama\t12758\t0.002490898\t12758.0\n15035\t-74.745576\t41.79752\tLiberty village\tNY\tNew York\tSullivan County\t3946\t41.0\t21.3\t15.1\t23610\t133191\t0.5373\t12754\tObama\t12754\t0.007248586\t12754.0\n15036\t-75.061173\t41.766601\tCallicoon CDP\tNY\tNew York\tSullivan County\t208\t27.1\t19.4\t9.3\t20593\t147500\t0.5373\t12723\tObama\t12723\t0.000382085\t12723.0\n15037\t-74.68661\t41.651091\tMonticello village\tNY\tNew York\tSullivan County\t6565\t35.7\t18.4\t12.0\t18887\t117704\t0.5373\t12701\tObama\t12701\t0.012059546\t12701.0\n15038\t-74.929991\t41.779902\tJeffersonville village\tNY\tNew York\tSullivan County\t426\t45.5\t24.8\t2.8\t24374\t140517\t0.5373\t12748\tObama\t12748\t0.000782539\t12748.0\n15039\t-74.572313\t41.711672\tWoodridge village\tNY\tNew York\tSullivan County\t886\t42.0\t25.8\t11.2\t25284\t126786\t0.5373\t12789\tObama\t12789\t0.001627534\t12789.0\n15040\t-74.442412\t41.555444\tBloomingburg village\tNY\tNew York\tSullivan County\t361\t34.5\t18.8\t9.8\t19531\t159615\t0.5373\t12721\tObama\t12721\t0.000663137\t12721.0\n15041\t-74.634967\t41.721744\tSouth Fallsburg CDP\tNY\tNew York\tSullivan County\t2162\t30.0\t20.2\t6.1\t18161\t141607\t0.5373\t12779\tObama\t12779\t0.003971476\t12779.0\n15042\t-74.582481\t41.615117\tRock Hill CDP\tNY\tNew York\tSullivan County\t1401\t46.4\t31.4\t7.8\t27618\t192628\t0.5373\t12775\tObama\t12775\t0.00257356\t12775.0\n15043\t-75.057875\t41.600602\tNarrowsburg CDP\tNY\tNew York\tSullivan County\t447\t48.5\t24.2\t8.8\t22016\t147500\t0.5373\t12764\tObama\t12764\t0.000821115\t12764.0\n15044\t-74.916905\t41.940207\tRoscoe CDP\tNY\tNew York\tSullivan County\t581\t45.3\t15.0\t10.4\t20777\t121563\t0.5373\t12776\tObama\t12776\t0.001067265\t12776.0\n15045\t-74.48586999999999\t41.576378999999996\tWurtsboro village\tNY\tNew York\tSullivan County\t1273\t36.6\t15.5\t10.4\t24504\t136738\t0.5373\t12790\tObama\t12790\t0.002338431\t12790.0\n15046\t-74.820103\t41.65953\tSmallwood CDP\tNY\tNew York\tSullivan County\t594\t49.5\t20.8\t8.8\t32657\t131798\t0.5373\t12778\tObama\t12778\t0.001091146\t12778.0\n15047\t-76.16263599999999\t42.070566\tApalachin CDP\tNY\tNew York\tTioga County\t1063\t39.0\t15.5\t9.2\t24283\t129704\t0.4139\t13732\tObama\t13732\t0.0019526729999999998\t13732.0\n15048\t-76.18684499999999\t42.222879999999996\tNewark Valley village\tNY\tNew York\tTioga County\t1092\t39.1\t25.6\t6.5\t23423\t125735\t0.4139\t13811\tObama\t13811\t0.002005944\t13811.0\n15049\t-76.49641700000001\t42.214557\tSpencer village\tNY\tNew York\tTioga County\t778\t38.9\t21.1\t5.9\t20366\t128191\t0.4139\t14883\tObama\t14883\t0.001429144\t14883.0\n15050\t-76.540412\t42.011963\tWaverly village\tNY\tNew York\tTioga County\t4298\t41.0\t20.1\t8.8\t20914\t126056\t0.4139\t14892\tObama\t14892\t0.007895191\t14892.0\n15051\t-76.262884\t42.104723\tOwego village\tNY\tNew York\tTioga County\t3678\t40.0\t28.2\t10.0\t21911\t126442\t0.4139\t13827\tObama\t13827\t0.006756285\t13827.0\n15052\t-76.336736\t42.228309\tCandor village\tNY\tNew York\tTioga County\t874\t39.6\t17.6\t6.3\t23795\t126667\t0.4139\t13743\tObama\t13743\t0.00160549\t13743.0\n15053\t-76.370455\t42.020016999999996\tNichols village\tNY\tNew York\tTioga County\t573\t40.7\t19.0\t9.3\t21220\t127303\t0.4139\t13812\tObama\t13812\t0.00105257\t13812.0\n15054\t-76.659581\t42.540434999999995\tTrumansburg village\tNY\tNew York\tTompkins County\t1703\t44.0\t50.0\t4.7\t29721\t198718\t0.6868\t14886\tObama\t14886\t0.0031283179999999997\t14886.0\n15055\t-76.59224300000001\t42.358263\tNewfield Hamlet CDP\tNY\tNew York\tTompkins County\t652\t40.3\t28.2\t7.9\t21520\t124074\t0.6868\t14867\tObama\t14867\t0.001197688\t14867.0\n15056\t-76.462278\t42.470267\tNortheast Ithaca CDP\tNY\tNew York\tTompkins County\t2810\t32.2\t81.9\t5.1\t31689\t257031\t0.6868\t14850\tObama\t14850\t0.005161817\t14850.0\n15057\t-76.345558\t42.511356\tFreeville village\tNY\tNew York\tTompkins County\t523\t36.0\t39.2\t4.8\t28125\t170109\t0.6868\t13068\tObama\t13068\t0.000960722\t13068.0\n15058\t-76.299562\t42.49018\tDryden village\tNY\tNew York\tTompkins County\t1980\t37.3\t41.9\t7.4\t25502\t169690\t0.6868\t13053\tObama\t13053\t0.0036371520000000003\t13053.0\n15059\t-76.50314399999999\t42.443981\tIthaca city\tNY\tNew York\tTompkins County\t30133\t24.2\t64.8\t6.4\t19655\t180788\t0.6868\t14850\tObama\t14850\t0.055352675\t14850.0\n15060\t-76.462621\t42.426299\tEast Ithaca CDP\tNY\tNew York\tTompkins County\t2684\t31.1\t83.7\t2.7\t34645\t200000\t0.6868\t14850\tObama\t14850\t0.004930360999999999\t14850.0\n15061\t-76.488\t42.41118\tSouth Hill CDP\tNY\tNew York\tTompkins County\t6434\t23.4\t58.8\t5.7\t20535\t188393\t0.6868\t14850\tObama\t14850\t0.011818907\t14850.0\n15062\t-76.363171\t42.587229\tGroton village\tNY\tNew York\tTompkins County\t2465\t40.8\t22.3\t4.4\t21634\t137564\t0.6868\t13073\tObama\t13073\t0.00452807\t13073.0\n15063\t-76.485803\t42.490231\tLansing village\tNY\tNew York\tTompkins County\t3623\t35.9\t80.9\t6.4\t41803\t318561\t0.6868\t14850\tObama\t14850\t0.006655253000000001\t14850.0\n15064\t-76.469895\t42.452841\tForest Home CDP\tNY\tNew York\tTompkins County\t932\t24.9\t92.6\t7.4\t23380\t327273\t0.6868\t14850\tObama\t14850\t0.001712033\t14850.0\n15065\t-76.541403\t42.470473\tNorthwest Ithaca CDP\tNY\tNew York\tTompkins County\t1146\t48.3\t62.6\t11.0\t37183\t227717\t0.6868\t14850\tObama\t14850\t0.002105139\t14850.0\n15066\t-76.48752900000001\t42.467924\tCayuga Heights village\tNY\tNew York\tTompkins County\t4050\t34.3\t88.7\t5.3\t44608\t350467\t0.6868\t14850\tObama\t14850\t0.0074396290000000006\t14850.0\n15067\t-74.231953\t41.797152000000004\tAccord CDP\tNY\tNew York\tUlster County\t645\t38.2\t28.1\t9.7\t23974\t191875\t0.601\t12404\tObama\t12404\t0.00118483\t12404.0\n15068\t-74.045699\t41.692788\tClintondale CDP\tNY\tNew York\tUlster County\t1464\t36.7\t28.0\t7.3\t25113\t240074\t0.601\t12515\tObama\t12515\t0.0026892879999999997\t12515.0\n15069\t-74.377566\t41.638462\tWalker Valley CDP\tNY\tNew York\tUlster County\t870\t41.5\t17.4\t4.4\t24378\t237245\t0.601\t12420\tObama\t12420\t0.001598142\t12420.0\n15070\t-74.164627\t41.608445\tWallkill CDP\tNY\tNew York\tUlster County\t2200\t36.7\t27.3\t8.1\t28389\t250602\t0.601\t12589\tObama\t12589\t0.00404128\t12589.0\n15071\t-74.069733\t41.831499\tTillson CDP\tNY\tNew York\tUlster County\t1838\t40.3\t30.6\t6.0\t28863\t182126\t0.601\t12486\tObama\t12486\t0.003376306\t12486.0\n15072\t-73.936484\t42.093183\tMalden CDP\tNY\tNew York\tUlster County\t421\t31.6\t14.2\t7.7\t23696\t217000\t0.601\t12477\tObama\t12477\t0.000773354\t12477.0\n15073\t-74.372904\t41.751373\tNapanoch CDP\tNY\tNew York\tUlster County\t1299\t41.3\t17.1\t4.7\t24719\t171121\t0.601\t12489\tObama\t12489\t0.002386192\t12489.0\n15074\t-74.309017\t42.079502000000005\tPhoenicia CDP\tNY\tNew York\tUlster County\t394\t50.0\t41.7\t8.7\t28224\t182813\t0.601\t12464\tObama\t12464\t0.0007237560000000001\t12464.0\n15075\t-73.970487\t41.952067\tEast Kingston CDP\tNY\tNew York\tUlster County\t293\t46.0\t20.7\t7.4\t31530\t169079\t0.601\t124HH\tObama\t124HH\t0.000538225\t0.0\n15076\t-74.059003\t41.912265000000005\tHurley CDP\tNY\tNew York\tUlster County\t3627\t47.9\t40.1\t7.7\t35594\t208182\t0.601\t12443\tObama\t12443\t0.006662601\t12443.0\n15077\t-74.14789499999999\t41.679522\tGardiner CDP\tNY\tNew York\tUlster County\t934\t40.4\t40.2\t9.4\t30132\t267000\t0.601\t12548\tObama\t12548\t0.0017157070000000001\t12548.0\n15078\t-73.996821\t41.929488\tKingston city\tNY\tNew York\tUlster County\t23446\t39.7\t25.8\t9.9\t23060\t167362\t0.601\t12401\tObama\t12401\t0.043069021\t12401.0\n15079\t-74.476371\t42.131060999999995\tPine Hill CDP\tNY\tNew York\tUlster County\t325\t50.2\t31.1\t7.9\t27934\t193182\t0.601\t12410\tObama\t12410\t0.000597007\t12410.0\n15080\t-74.15394599999999\t41.841393\tStone Ridge CDP\tNY\tNew York\tUlster County\t1209\t47.3\t38.0\t9.6\t29621\t272881\t0.601\t12484\tObama\t12484\t0.002220867\t12484.0\n15081\t-74.08091999999999\t41.74998\tNew Paltz village\tNY\tNew York\tUlster County\t6140\t23.0\t57.7\t9.5\t18353\t240512\t0.601\t12561\tObama\t12561\t0.011278845\t12561.0\n15082\t-74.1177\t42.041392\tWoodstock CDP\tNY\tNew York\tUlster County\t2229\t51.1\t54.3\t9.6\t37443\t321221\t0.601\t12498\tObama\t12498\t0.004094551\t12498.0\n15083\t-73.966808\t41.660032\tMilton CDP\tNY\tNew York\tUlster County\t1431\t41.0\t25.7\t5.7\t27391\t251389\t0.601\t12547\tObama\t12547\t0.002628669\t12547.0\n15084\t-74.038054\t41.828723\tRifton CDP\tNY\tNew York\tUlster County\t517\t45.0\t38.4\t8.6\t27650\t225000\t0.601\t12471\tObama\t12471\t0.0009497010000000001\t12471.0\n15085\t-73.94819\t42.075081\tSaugerties village\tNY\tNew York\tUlster County\t4100\t38.5\t31.4\t7.2\t24143\t172917\t0.601\t12477\tObama\t12477\t0.007531476\t12477.0\n15086\t-74.21298\t41.980908\tShokan CDP\tNY\tNew York\tUlster County\t1287\t45.5\t39.4\t6.5\t27755\t209951\t0.601\t12481\tObama\t12481\t0.002364149\t12481.0\n15087\t-74.060795\t41.620442\tPlattekill CDP\tNY\tNew York\tUlster County\t1110\t35.4\t16.6\t8.8\t22546\t246491\t0.601\t12515\tObama\t12515\t0.002039009\t12515.0\n15088\t-73.97223000000001\t41.602667\tMarlboro CDP\tNY\tNew York\tUlster County\t2594\t37.8\t28.5\t6.8\t27580\t251154\t0.601\t12542\tObama\t12542\t0.004765035999999999\t12542.0\n15089\t-74.001574\t41.955889\tLincoln Park CDP\tNY\tNew York\tUlster County\t2346\t44.0\t21.7\t8.6\t24126\t159040\t0.601\t124HH\tObama\t124HH\t0.004309474000000001\t0.0\n15090\t-73.948539\t42.046110999999996\tGlasco CDP\tNY\tNew York\tUlster County\t1727\t41.1\t21.3\t4.9\t26425\t180637\t0.601\t12507\tObama\t12507\t0.003172405\t12507.0\n15091\t-73.95084\t42.061602\tSaugerties South CDP\tNY\tNew York\tUlster County\t2380\t43.6\t25.4\t3.7\t28332\t184533\t0.601\t12477\tObama\t12477\t0.00437193\t12477.0\n15092\t-74.360966\t41.700911\tEllenville village\tNY\tNew York\tUlster County\t4146\t35.2\t15.6\t13.3\t19078\t158967\t0.601\t12420\tObama\t12420\t0.007615976\t12420.0\n15093\t-74.085511\t42.021072\tZena CDP\tNY\tNew York\tUlster County\t1140\t52.0\t59.5\t8.6\t38095\t273684\t0.601\t12498\tObama\t12498\t0.002094118\t12498.0\n15094\t-74.390964\t41.665503\tCragsmoor CDP\tNY\tNew York\tUlster County\t493\t44.4\t39.5\t10.7\t29116\t203906\t0.601\t12420\tObama\t12420\t0.0009056139999999999\t12420.0\n15095\t-73.98948299999999\t41.986348\tLake Katrine CDP\tNY\tNew York\tUlster County\t2469\t47.4\t23.5\t7.9\t26709\t168649\t0.601\t12449\tObama\t12449\t0.004535418\t12449.0\n15096\t-73.977609\t41.904879\tPort Ewen CDP\tNY\tNew York\tUlster County\t3809\t42.1\t22.3\t7.1\t28138\t187321\t0.601\t12466\tObama\t12466\t0.006996925\t12466.0\n15097\t-74.07386\t41.850322\tRosendale Village CDP\tNY\tNew York\tUlster County\t1442\t39.4\t37.7\t6.0\t30146\t177049\t0.601\t12472\tObama\t12472\t0.002648875\t12472.0\n15098\t-74.033327\t41.917753000000005\tHillside CDP\tNY\tNew York\tUlster County\t877\t46.9\t59.9\t4.9\t41383\t323810\t0.601\t12401\tObama\t12401\t0.0016110010000000001\t12401.0\n15099\t-73.96431199999999\t41.718149\tHighland CDP\tNY\tNew York\tUlster County\t5258\t41.8\t29.2\t8.9\t29187\t200641\t0.601\t125HH\tObama\t125HH\t0.009658659\t0.0\n15100\t-74.29538199999999\t41.779625\tKerhonkson CDP\tNY\tNew York\tUlster County\t1844\t38.3\t27.6\t11.3\t24628\t172374\t0.601\t12446\tObama\t12446\t0.0033873270000000003\t12446.0\n15101\t-74.112065\t42.008318\tWest Hurley CDP\tNY\tNew York\tUlster County\t2094\t51.7\t43.9\t9.2\t35587\t228723\t0.601\t12491\tObama\t12491\t0.0038465640000000002\t12491.0\n15102\t-74.118473\t41.82756\tHigh Falls CDP\tNY\tNew York\tUlster County\t649\t46.2\t36.6\t5.0\t27621\t186765\t0.601\t12419\tObama\t12419\t0.0011921780000000001\t12419.0\n15103\t-73.834285\t43.323772\tLake Luzerne-Hadley CDP\tNY\tNew York\tWarren County\t2490\t40.4\t14.7\t8.9\t20823\t159059\t0.5006\t12846\tObama\t12846\t0.0045739940000000005\t12846.0\n15104\t-73.776053\t43.514307\tWarrensburg CDP\tNY\tNew York\tWarren County\t3274\t41.2\t19.7\t7.2\t19200\t153305\t0.5006\t12885\tObama\t12885\t0.006014159\t12885.0\n15105\t-73.645531\t43.310821000000004\tGlens Falls city\tNY\tNew York\tWarren County\t14340\t37.5\t21.1\t6.8\t22545\t156141\t0.5006\t12801\tObama\t12801\t0.026341797\t12801.0\n15106\t-73.68251\t43.33512\tGlens Falls North CDP\tNY\tNew York\tWarren County\t8012\t46.5\t41.7\t4.6\t33519\t224590\t0.5006\t12804\tObama\t12804\t0.014717606000000001\t12804.0\n15107\t-73.71534\t43.426051\tLake George village\tNY\tNew York\tWarren County\t943\t45.2\t31.1\t7.8\t21691\t193182\t0.5006\t12845\tObama\t12845\t0.001732239\t12845.0\n15108\t-73.687134\t43.302046999999995\tWest Glens Falls CDP\tNY\tNew York\tWarren County\t6887\t39.7\t20.4\t6.2\t23577\t162626\t0.5006\t12804\tObama\t12804\t0.012651043\t12804.0\n15109\t-73.413522\t43.556835\tWhitehall village\tNY\tNew York\tWashington County\t2606\t38.9\t10.8\t8.2\t22304\t115451\t0.4989\t12887\tObama\t12887\t0.00478708\t12887.0\n15110\t-73.381079\t43.027999\tCambridge village\tNY\tNew York\tWashington County\t1942\t42.1\t24.2\t6.5\t23975\t163938\t0.4989\t12816\tObama\t12816\t0.0035673479999999997\t12816.0\n15111\t-73.58171\t43.304223\tHudson Falls village\tNY\tNew York\tWashington County\t7213\t37.1\t15.2\t8.7\t22378\t145550\t0.4989\t12839\tObama\t12839\t0.013249887\t12839.0\n15112\t-73.49095799999999\t43.414638000000004\tFort Ann village\tNY\tNew York\tWashington County\t492\t31.2\t6.0\t5.6\t17126\t154861\t0.4989\t12827\tObama\t12827\t0.0009037769999999999\t12827.0\n15113\t-73.261564\t43.408266999999995\tGranville village\tNY\tNew York\tWashington County\t2554\t42.5\t16.6\t5.9\t18659\t135086\t0.4989\t12849\tObama\t12849\t0.0046915590000000005\t12849.0\n15114\t-73.49685799999999\t43.086409\tGreenwich village\tNY\tNew York\tWashington County\t1872\t41.2\t24.9\t5.8\t21340\t181250\t0.4989\t12834\tObama\t12834\t0.003438762\t12834.0\n15115\t-73.582894\t43.26818\tFort Edward village\tNY\tNew York\tWashington County\t3123\t39.1\t11.6\t7.6\t21251\t141596\t0.4989\t12828\tObama\t12828\t0.00573678\t12828.0\n15116\t-73.32656300000001\t43.172571999999995\tSalem village\tNY\tNew York\tWashington County\t992\t42.0\t27.9\t4.6\t20335\t149554\t0.4989\t12865\tObama\t12865\t0.00182225\t12865.0\n15117\t-73.490933\t43.236629\tArgyle village\tNY\tNew York\tWashington County\t307\t45.5\t13.3\t9.7\t19824\t160870\t0.4989\t12809\tObama\t12809\t0.000563942\t12809.0\n15118\t-76.99528000000001\t43.263939\tSodus Point village\tNY\tNew York\tWayne County\t1117\t44.2\t20.4\t11.5\t23971\t116604\t0.44299999999999995\t14555\tObama\t14555\t0.002051868\t14555.0\n15119\t-76.87069\t43.083969\tClyde village\tNY\tNew York\tWayne County\t2064\t35.6\t13.1\t9.7\t17936\t83861\t0.44299999999999995\t14433\tObama\t14433\t0.003791455\t14433.0\n15120\t-77.093187\t43.041686999999996\tNewark village\tNY\tNew York\tWayne County\t9232\t40.6\t18.6\t9.4\t22171\t109699\t0.44299999999999995\t14513\tObama\t14513\t0.01695868\t14513.0\n15121\t-77.22967\t43.06087\tPalmyra village\tNY\tNew York\tWayne County\t3348\t39.2\t22.8\t9.0\t27786\t122550\t0.44299999999999995\t14522\tObama\t14522\t0.006150093000000001\t14522.0\n15122\t-76.813468\t43.222493\tWolcott village\tNY\tNew York\tWayne County\t1645\t35.4\t16.8\t11.2\t18477\t83718\t0.44299999999999995\t14590\tObama\t14590\t0.003021775\t14590.0\n15123\t-76.99260799999999\t43.063345\tLyons village\tNY\tNew York\tWayne County\t3440\t38.3\t16.7\t9.6\t24191\t80546\t0.44299999999999995\t14489\tObama\t14489\t0.006319091999999999\t14489.0\n15124\t-77.062708\t43.237145\tSodus village\tNY\tNew York\tWayne County\t1648\t35.1\t13.9\t7.8\t18876\t95408\t0.44299999999999995\t14551\tObama\t14551\t0.0030272859999999997\t14551.0\n15125\t-77.303703\t43.068333\tMacedon village\tNY\tNew York\tWayne County\t1535\t36.8\t25.1\t8.1\t25954\t152700\t0.44299999999999995\t14502\tObama\t14502\t0.002819711\t14502.0\n15126\t-76.722498\t43.248778\tRed Creek village\tNY\tNew York\tWayne County\t505\t35.8\t13.7\t9.9\t19240\t95417\t0.44299999999999995\t13143\tObama\t13143\t0.0009276569999999999\t13143.0\n15127\t-73.80511700000001\t41.024187\tHartsdale CDP\tNY\tNew York\tWestchester County\t9809\t46.2\t63.4\t6.5\t54901\t485040\t0.6199\t10530\tObama\t10530\t0.018018597\t10530.0\n15128\t-73.866063\t41.034805\tIrvington village\tNY\tNew York\tWestchester County\t6639\t41.6\t67.8\t5.3\t68166\t680740\t0.6199\t10533\tObama\t10533\t0.01219548\t10533.0\n15129\t-73.826474\t40.939471000000005\tBronxville village\tNY\tNew York\tWestchester County\t6619\t41.0\t78.2\t5.4\t89782\t983523\t0.6199\t10708\tObama\t10708\t0.012158741\t10708.0\n15130\t-73.674554\t41.285801\tGolden's Bridge CDP\tNY\tNew York\tWestchester County\t1668\t40.7\t72.2\t3.8\t64629\t707661\t0.6199\t10526\tObama\t10526\t0.003064025\t10526.0\n15131\t-73.922732\t41.288388\tPeekskill city\tNY\tNew York\tWestchester County\t23441\t37.7\t26.8\t9.7\t29184\t298940\t0.6199\t10566\tObama\t10566\t0.043059837000000004\t10566.0\n15132\t-73.782779\t41.137715\tPleasantville village\tNY\tNew York\tWestchester County\t7225\t40.9\t61.8\t6.0\t51414\t593513\t0.6199\t10570\tObama\t10570\t0.01327193\t10570.0\n15133\t-73.829107\t40.913589\tMount Vernon city\tNY\tNew York\tWestchester County\t69778\t37.6\t28.7\t10.8\t26895\t439407\t0.6199\t10553\tObama\t10553\t0.128178375\t10553.0\n15134\t-73.768695\t41.092504999999996\tValhalla CDP\tNY\tNew York\tWestchester County\t5594\t44.3\t46.0\t4.2\t44899\t653871\t0.6199\t10595\tObama\t10595\t0.010275872\t10595.0\n15135\t-73.55606800000001\t41.188876\tScotts Corners CDP\tNY\tNew York\tWestchester County\t681\t44.8\t69.7\t7.6\t85651\t917808\t0.6199\t10576\tObama\t10576\t0.00125096\t10576.0\n15136\t-73.740822\t40.948316\tMamaroneck village\tNY\tNew York\tWestchester County\t19367\t40.5\t44.4\t7.1\t44455\t599952\t0.6199\t10543\tObama\t10543\t0.035576121\t10543.0\n15137\t-73.807983\t40.957805\tEastchester CDP\tNY\tNew York\tWestchester County\t18732\t45.0\t56.4\t5.6\t52020\t586365\t0.6199\t10709\tObama\t10709\t0.034409661\t10709.0\n15138\t-73.847502\t41.31694\tLake Mohegan CDP\tNY\tNew York\tWestchester County\t6381\t38.4\t44.2\t7.2\t38160\t374018\t0.6199\t10547\tObama\t10547\t0.011721548\t10547.0\n15139\t-73.958238\t41.255539\tVerplanck CDP\tNY\tNew York\tWestchester County\t765\t40.9\t31.0\t3.7\t30976\t307500\t0.6199\t10548\tObama\t10548\t0.001405263\t10548.0\n15140\t-73.754666\t41.021983\tWhite Plains city\tNY\tNew York\tWestchester County\t57867\t40.6\t45.4\t8.5\t40945\t514288\t0.6199\t10605\tObama\t10605\t0.10629851800000001\t10605.0\n15141\t-73.76190600000001\t41.168347\tChappaqua CDP\tNY\tNew York\tWestchester County\t9585\t41.9\t81.7\t4.4\t82048\t911309\t0.6199\t10514\tObama\t10514\t0.017607121\t10514.0\n15142\t-73.867176\t41.064631\tTarrytown village\tNY\tNew York\tWestchester County\t11222\t39.2\t56.7\t5.5\t51845\t563981\t0.6199\t10591\tObama\t10591\t0.020614201000000002\t10591.0\n15143\t-73.80742099999999\t40.911716999999996\tPelham village\tNY\tNew York\tWestchester County\t6416\t38.7\t60.1\t6.7\t51620\t647005\t0.6199\t10803\tObama\t10803\t0.011785842\t10803.0\n15144\t-73.80604\t40.893212\tPelham Manor village\tNY\tNew York\tWestchester County\t5472\t42.0\t68.2\t6.4\t71405\t805669\t0.6199\t10803\tObama\t10803\t0.010051765\t10803.0\n15145\t-73.81472600000001\t41.053978\tElmsford village\tNY\tNew York\tWestchester County\t4796\t38.3\t35.7\t8.8\t35433\t457792\t0.6199\t10523\tObama\t10523\t0.00880999\t10523.0\n15146\t-73.839551\t41.01363\tArdsley village\tNY\tNew York\tWestchester County\t4589\t45.5\t64.2\t5.9\t64934\t683121\t0.6199\t10502\tObama\t10502\t0.008429741999999999\t10502.0\n15147\t-73.946505\t41.264239\tBuchanan village\tNY\tNew York\tWestchester County\t2265\t39.8\t29.3\t6.5\t38027\t402459\t0.6199\t10511\tObama\t10511\t0.004160680999999999\t10511.0\n15148\t-73.728173\t41.201613\tMount Kisco village\tNY\tNew York\tWestchester County\t10310\t39.0\t43.6\t7.1\t41858\t485577\t0.6199\t10549\tObama\t10549\t0.018938906999999998\t10549.0\n15149\t-73.870768\t41.160559\tOssining village\tNY\tNew York\tWestchester County\t25504\t35.6\t37.2\t6.7\t32186\t380489\t0.6199\t10562\tObama\t10562\t0.046849455\t10562.0\n15150\t-73.818287\t40.999994\tGreenville CDP\tNY\tNew York\tWestchester County\t8730\t44.3\t73.7\t6.4\t76837\t689206\t0.6199\t10583\tObama\t10583\t0.016036533000000002\t10583.0\n15151\t-73.835934\t41.291255\tCrompond CDP\tNY\tNew York\tWestchester County\t2243\t45.3\t47.8\t4.5\t44240\t536355\t0.6199\t10547\tObama\t10547\t0.004120268\t10547.0\n15152\t-73.741463\t41.330961\tShenorock CDP\tNY\tNew York\tWestchester County\t2014\t39.7\t44.1\t3.7\t37336\t388367\t0.6199\t10527\tObama\t10527\t0.003699608\t10527.0\n15153\t-73.82302299999999\t40.953076\tTuckahoe village\tNY\tNew York\tWestchester County\t6332\t39.9\t42.0\t6.1\t39374\t534046\t0.6199\t10707\tObama\t10707\t0.011631538\t10707.0\n15154\t-73.646935\t41.194561\tBedford CDP\tNY\tNew York\tWestchester County\t1830\t42.5\t68.7\t4.4\t78374\t907031\t0.6199\t10506\tObama\t10506\t0.00336161\t10506.0\n15155\t-73.796099\t41.044153\tFairview CDP\tNY\tNew York\tWestchester County\t2888\t35.2\t24.3\t8.4\t29467\t373711\t0.6199\t10607\tObama\t10607\t0.005305098\t10607.0\n15156\t-73.78218199999999\t41.272788\tYorktown Heights CDP\tNY\tNew York\tWestchester County\t7956\t43.0\t49.0\t5.6\t36715\t498069\t0.6199\t10501\tObama\t10501\t0.014614737\t10501.0\n15157\t-73.767639\t41.118142\tThornwood CDP\tNY\tNew York\tWestchester County\t6056\t40.4\t42.9\t6.1\t44650\t650000\t0.6199\t10594\tObama\t10594\t0.011124541000000002\t10594.0\n15158\t-73.925893\t41.227940999999994\tCrugers CDP\tNY\tNew York\tWestchester County\t1783\t66.1\t32.7\t6.3\t36086\t558263\t0.6199\t10548\tObama\t10548\t0.0032752740000000003\t10548.0\n15159\t-73.699978\t41.340384\tHeritage Hills CDP\tNY\tNew York\tWestchester County\t4152\t61.6\t58.6\t5.7\t62368\t468834\t0.6199\t10589\tObama\t10589\t0.007626997\t10589.0\n15160\t-73.77741\t40.990224\tScarsdale village\tNY\tNew York\tWestchester County\t17966\t42.2\t83.8\t4.6\t88914\t1000001\t0.6199\t10583\tObama\t10583\t0.033002561\t10583.0\n15161\t-73.880126\t40.990314\tHastings-on-Hudson village\tNY\tNew York\tWestchester County\t7691\t45.1\t68.1\t7.1\t57791\t684018\t0.6199\t10706\tObama\t10706\t0.014127947\t10706.0\n15162\t-73.869905\t41.012549\tDobbs Ferry village\tNY\tNew York\tWestchester County\t11056\t41.7\t57.0\t6.6\t47198\t616561\t0.6199\t10522\tObama\t10522\t0.020309268000000002\t10522.0\n15163\t-73.784589\t40.933212\tNew Rochelle city\tNY\tNew York\tWestchester County\t76198\t38.5\t42.4\t7.5\t38375\t587299\t0.6199\t10804\tObama\t10804\t0.139971564\t10804.0\n15164\t-73.899913\t41.200340999999995\tCroton-on-Hudson village\tNY\tNew York\tWestchester County\t8017\t43.5\t61.0\t5.7\t50734\t514749\t0.6199\t10520\tObama\t10520\t0.014726791000000001\t10520.0\n15165\t-73.71372099999999\t41.131906\tArmonk CDP\tNY\tNew York\tWestchester County\t3936\t43.4\t60.0\t5.1\t75299\t964777\t0.6199\t10504\tObama\t10504\t0.007230217\t10504.0\n15166\t-73.668009\t41.005381\tPort Chester village\tNY\tNew York\tWestchester County\t29056\t35.4\t24.2\t8.7\t26249\t490241\t0.6199\t10573\tObama\t10573\t0.053374285\t10573.0\n15167\t-73.690351\t40.969516\tRye city\tNY\tNew York\tWestchester County\t15231\t40.5\t73.3\t4.6\t83370\t902073\t0.6199\t10580\tObama\t10580\t0.027978515\t10580.0\n15168\t-73.82951899999999\t41.325819\tShrub Oak CDP\tNY\tNew York\tWestchester County\t2046\t40.5\t40.1\t7.0\t41081\t399372\t0.6199\t10588\tObama\t10588\t0.00375839\t10588.0\n15169\t-73.722962\t41.335458\tLincolndale CDP\tNY\tNew York\tWestchester County\t2192\t43.9\t51.0\t4.2\t48138\t536437\t0.6199\t10589\tObama\t10589\t0.004026584000000001\t10589.0\n15170\t-73.719227\t41.023327\tHarrison village\tNY\tNew York\tWestchester County\t25346\t38.9\t50.6\t6.6\t54338\t864708\t0.6199\t10577\tObama\t10577\t0.046559218\t10577.0\n15171\t-73.792736\t41.103393\tHawthorne CDP\tNY\tNew York\tWestchester County\t5123\t41.4\t40.3\t5.7\t34483\t584934\t0.6199\t10532\tObama\t10532\t0.009410670999999999\t10532.0\n15172\t-73.872007\t41.093461\tSleepy Hollow village\tNY\tNew York\tWestchester County\t10374\t35.4\t36.7\t9.7\t38017\t650386\t0.6199\t10591\tObama\t10591\t0.019056471000000002\t10591.0\n15173\t-73.752983\t40.925722\tLarchmont village\tNY\tNew York\tWestchester County\t6482\t40.2\t78.1\t4.8\t84775\t958919\t0.6199\t10538\tObama\t10538\t0.01190708\t10538.0\n15174\t-73.844213\t41.140051\tBriarcliff Manor village\tNY\tNew York\tWestchester County\t8086\t41.4\t76.6\t6.0\t67045\t853175\t0.6199\t10510\tObama\t10510\t0.01485354\t10510.0\n15175\t-73.68639\t41.030308000000005\tRye Brook village\tNY\tNew York\tWestchester County\t9548\t43.2\t61.2\t5.6\t65539\t789004\t0.6199\t10573\tObama\t10573\t0.017539153999999998\t10573.0\n15176\t-73.80073\t41.317944\tJefferson Valley-Yorktown CDP\tNY\tNew York\tWestchester County\t14832\t43.4\t46.8\t5.5\t41825\t447939\t0.6199\t10535\tObama\t10535\t0.027245573999999998\t10535.0\n15177\t-73.86738100000001\t40.946652\tYonkers city\tNY\tNew York\tWestchester County\t199754\t37.4\t29.4\t10.1\t28684\t413392\t0.6199\t10701\tObama\t10701\t0.36693718700000005\t10701.0\n15178\t-78.084103\t42.824059999999996\tWyoming village\tNY\tNew York\tWyoming County\t508\t37.7\t17.7\t7.3\t20557\t110976\t0.3466\t14591\tObama\t14591\t0.0009331680000000001\t14591.0\n15179\t-78.00716800000001\t42.717295\tPerry village\tNY\tNew York\tWyoming County\t3739\t37.6\t18.7\t7.8\t22227\t96511\t0.3466\t14530\tObama\t14530\t0.006868339\t14530.0\n15180\t-78.085477\t42.660489\tSilver Springs village\tNY\tNew York\tWyoming County\t771\t39.8\t8.2\t6.9\t22837\t87083\t0.3466\t14550\tObama\t14550\t0.001416285\t14550.0\n15181\t-78.277241\t42.877074\tAttica village\tNY\tNew York\tWyoming County\t2454\t39.8\t15.8\t6.5\t23190\t118191\t0.3466\t14011\tObama\t14011\t0.004507864\t14011.0\n15182\t-78.433931\t42.532340000000005\tArcade village\tNY\tNew York\tWyoming County\t1933\t41.1\t16.3\t7.0\t23759\t120229\t0.3466\t14009\tObama\t14009\t0.003550815\t14009.0\n15183\t-78.14123199999999\t42.742853000000004\tWarsaw village\tNY\tNew York\tWyoming County\t3723\t39.2\t20.4\t6.7\t20431\t108235\t0.3466\t14569\tObama\t14569\t0.006838948\t14569.0\n15184\t-78.13463399999999\t42.641490000000005\tGainesville village\tNY\tNew York\tWyoming County\t290\t37.6\t15.1\t7.9\t17539\t98000\t0.3466\t14066\tObama\t14066\t0.000532714\t14066.0\n15185\t-78.052551\t42.631190000000004\tCastile village\tNY\tNew York\tWyoming County\t1016\t40.1\t15.9\t8.0\t18317\t109420\t0.3466\t14427\tObama\t14427\t0.001866337\t14427.0\n15186\t-78.154235\t42.55537\tPike village\tNY\tNew York\tWyoming County\t363\t38.0\t11.1\t8.6\t18079\t90909\t0.3466\t14066\tObama\t14066\t0.000666811\t14066.0\n15187\t-76.95693399999999\t42.683316999999995\tDresden village\tNY\tNew York\tYates County\t297\t42.8\t14.8\t6.5\t18403\t114706\t0.4753\t14441\tObama\t14441\t0.000545573\t14441.0\n15188\t-76.977386\t42.523763\tDundee village\tNY\tNew York\tYates County\t1652\t40.2\t15.7\t6.1\t18294\t98333\t0.4753\t14837\tObama\t14837\t0.003034634\t14837.0\n15189\t-77.053392\t42.661325\tPenn Yan village\tNY\tNew York\tYates County\t5145\t40.6\t17.0\t5.9\t18679\t113085\t0.4753\t14527\tObama\t14527\t0.009451084\t14527.0\n15190\t-77.227351\t42.764471\tRushville village\tNY\tNew York\tYates County\t643\t36.0\t16.4\t6.2\t20232\t120238\t0.4753\t14544\tObama\t14544\t0.001181156\t14544.0\n15191\t-79.509574\t36.097089000000004\tElon College town\tNC\tNorth Carolina\tAlamance County\t7525\t23.9\t42.6\t11.5\t25461\t167308\t0.426\t27215\tRomney\t27215\t0.022547825\t27215.0\n15192\t-79.357568\t36.028488\tSwepsonville town\tNC\tNorth Carolina\tAlamance County\t1070\t40.6\t19.9\t8.5\t22966\t102647\t0.426\t273HH\tRomney\t273HH\t0.0032061359999999996\t0.0\n15193\t-79.258353\t36.098382\tMebane city\tNC\tNorth Carolina\tAlamance County\t8704\t37.5\t27.1\t13.0\t24443\t116571\t0.426\t27302\tRomney\t27302\t0.026080568\t27302.0\n15194\t-79.490447\t36.027881\tAlamance village\tNC\tNorth Carolina\tAlamance County\t532\t44.1\t19.1\t10.8\t24302\t117361\t0.426\t27215\tRomney\t27215\t0.001594079\t27215.0\n15195\t-79.508462\t36.177208\tAltamahaw-Ossipee CDP\tNC\tNorth Carolina\tAlamance County\t1133\t40.9\t16.8\t12.9\t21079\t101176\t0.426\t27202\tRomney\t27202\t0.003394908\t27202.0\n15196\t-79.360579\t36.092929999999996\tHaw River town\tNC\tNorth Carolina\tAlamance County\t2038\t40.8\t9.8\t13.7\t20231\t92800\t0.426\t27258\tRomney\t27258\t0.00610664\t27258.0\n15197\t-79.466114\t36.122477\tGlen Raven CDP\tNC\tNorth Carolina\tAlamance County\t3126\t39.0\t18.7\t17.0\t21862\t104827\t0.426\t27215\tRomney\t27215\t0.009366711\t27215.0\n15198\t-79.346512\t36.12207\tGreen Level town\tNC\tNorth Carolina\tAlamance County\t2031\t38.3\t7.4\t14.1\t16112\t76047\t0.426\t27258\tRomney\t27258\t0.006085666\t27258.0\n15199\t-79.393022\t36.062146000000006\tGraham city\tNC\tNorth Carolina\tAlamance County\t13752\t36.6\t20.3\t14.4\t22151\t109253\t0.426\t27253\tRomney\t27253\t0.041206337999999995\t27253.0\n15200\t-79.448231\t36.085034\tBurlington city\tNC\tNorth Carolina\tAlamance County\t49338\t39.1\t25.3\t14.4\t24126\t108472\t0.426\t27215\tRomney\t27215\t0.147835828\t27215.0\n15201\t-79.320933\t35.948749\tSaxapahaw CDP\tNC\tNorth Carolina\tAlamance County\t1687\t38.6\t22.4\t11.4\t24034\t97778\t0.426\t273HH\tRomney\t273HH\t0.0050549079999999995\t0.0\n15202\t-79.296213\t36.116646\tWoodlawn CDP\tNC\tNorth Carolina\tAlamance County\t1137\t38.7\t29.7\t11.2\t24200\t123611\t0.426\t27302\tRomney\t27302\t0.003406894\t27302.0\n15203\t-81.17617800000001\t35.918632\tTaylorsville town\tNC\tNorth Carolina\tAlexander County\t2213\t39.2\t12.6\t16.8\t17824\t87037\t0.2681\t28681\tRomney\t28681\t0.006631008000000001\t28681.0\n15204\t-81.03329599999999\t35.868134999999995\tStony Point CDP\tNC\tNorth Carolina\tAlexander County\t1580\t39.7\t8.6\t17.2\t20165\t94783\t0.2681\t28678\tRomney\t28678\t0.004734294\t28678.0\n15205\t-81.29611899999999\t35.816276\tBethlehem CDP\tNC\tNorth Carolina\tAlexander County\t4289\t42.9\t24.5\t12.0\t28444\t143909\t0.2681\t286HH\tRomney\t286HH\t0.012851511000000001\t0.0\n15206\t-81.12196\t36.503523\tSparta town\tNC\tNorth Carolina\tAlleghany County\t1930\t45.5\t13.3\t11.6\t20020\t129167\t0.3124\t28675\tRomney\t28675\t0.00578303\t28675.0\n15207\t-79.984542\t34.967492\tLilesville town\tNC\tNorth Carolina\tAnson County\t459\t39.1\t9.2\t16.3\t17063\t71053\t0.6236\t28091\tRomney\t28091\t0.001375342\t28091.0\n15208\t-80.070029\t34.967219\tWadesboro town\tNC\tNorth Carolina\tAnson County\t4192\t41.7\t17.6\t17.8\t18230\t84688\t0.6236\t28170\tRomney\t28170\t0.012560861999999999\t28170.0\n15209\t-79.999907\t34.863721000000005\tMorven town\tNC\tNorth Carolina\tAnson County\t538\t35.2\t8.0\t15.1\t14334\t54375\t0.6236\t28119\tRomney\t28119\t0.001612057\t28119.0\n15210\t-80.109528\t35.104155\tAnsonville town\tNC\tNorth Carolina\tAnson County\t571\t45.3\t8.4\t17.2\t16119\t68182\t0.6236\t28007\tRomney\t28007\t0.001710938\t28007.0\n15211\t-80.26585\t34.993092\tPeachland town\tNC\tNorth Carolina\tAnson County\t486\t38.0\t16.1\t14.3\t21212\t94375\t0.6236\t28133\tRomney\t28133\t0.001456245\t28133.0\n15212\t-79.976539\t34.814757\tMcFarlan town\tNC\tNorth Carolina\tAnson County\t82\t35.5\t10.0\t13.9\t14712\t56250\t0.6236\t28102\tRomney\t28102\t0.000245704\t28102.0\n15213\t-80.19682399999999\t35.005202000000004\tPolkton town\tNC\tNorth Carolina\tAnson County\t2367\t35.8\t6.2\t12.5\t16245\t74583\t0.6236\t28135\tRomney\t28135\t0.007092452\t28135.0\n15214\t-81.49169300000001\t36.397195\tWest Jefferson town\tNC\tNorth Carolina\tAshe County\t1175\t45.5\t14.7\t11.0\t19280\t138149\t0.3264\t28694\tRomney\t28694\t0.0035207570000000002\t28694.0\n15215\t-81.509905\t36.499229\tLansing town\tNC\tNorth Carolina\tAshe County\t176\t44.4\t13.0\t11.0\t19590\t137500\t0.3264\t28693\tRomney\t28693\t0.000527364\t28693.0\n15216\t-81.469799\t36.420415000000006\tJefferson town\tNC\tNorth Carolina\tAshe County\t1652\t46.4\t15.0\t13.0\t18830\t143235\t0.3264\t28694\tRomney\t28694\t0.004950034\t28694.0\n15217\t-81.980753\t36.158221000000005\tElk Park town\tNC\tNorth Carolina\tAvery County\t417\t39.3\t11.2\t10.2\t13890\t82308\t0.2426\t28622\tRomney\t28622\t0.0012494939999999999\t28622.0\n15218\t-81.93082199999999\t36.022196\tCrossnore town\tNC\tNorth Carolina\tAvery County\t219\t42.5\t17.3\t7.0\t17788\t111607\t0.2426\t28616\tRomney\t28616\t0.0006562089999999999\t28616.0\n15219\t-81.926644\t36.086974\tNewland town\tNC\tNorth Carolina\tAvery County\t660\t42.7\t15.0\t10.2\t18152\t106048\t0.2426\t28657\tRomney\t28657\t0.001977617\t28657.0\n15220\t-81.872332\t36.162019\tBanner Elk town\tNC\tNorth Carolina\tAvery County\t974\t35.1\t36.0\t8.5\t19060\t170588\t0.2426\t28604\tRomney\t28604\t0.002918483\t28604.0\n15221\t-81.865936\t36.127237\tSugar Mountain village\tNC\tNorth Carolina\tAvery County\t284\t49.6\t32.9\t9.7\t24560\t190000\t0.2426\t28604\tRomney\t28604\t0.0008509739999999999\t28604.0\n15222\t-81.848376\t36.098196\tGrandfather village\tNC\tNorth Carolina\tAvery County\t91\t50.4\t32.0\t10.2\t24637\t200000\t0.2426\t28646\tRomney\t28646\t0.000272671\t28646.0\n15223\t-76.81303299999999\t35.469201\tBath town\tNC\tNorth Carolina\tBeaufort County\t282\t48.8\t23.1\t7.5\t25453\t127679\t0.3994\t27808\tRomney\t27808\t0.000844982\t27808.0\n15224\t-76.660116\t35.586495\tPantego town\tNC\tNorth Carolina\tBeaufort County\t173\t46.1\t13.6\t7.5\t19601\t82500\t0.3994\t27860\tRomney\t27860\t0.000518375\t27860.0\n15225\t-77.031635\t35.532779999999995\tWashington Park town\tNC\tNorth Carolina\tBeaufort County\t426\t51.1\t46.2\t8.5\t27812\t185156\t0.3994\t27889\tRomney\t27889\t0.001276462\t27889.0\n15226\t-76.989387\t35.510643\tRiver Road CDP\tNC\tNorth Carolina\tBeaufort County\t4171\t41.7\t27.2\t9.0\t24453\t138889\t0.3994\t27889\tRomney\t27889\t0.012497936999999999\t27889.0\n15227\t-76.623722\t35.543083\tBelhaven town\tNC\tNorth Carolina\tBeaufort County\t1887\t43.2\t12.8\t13.8\t14339\t79861\t0.3994\t27810\tRomney\t27810\t0.005654185999999999\t27810.0\n15228\t-77.10157\t35.514595\tChocowinity town\tNC\tNorth Carolina\tBeaufort County\t828\t43.1\t10.7\t8.8\t21191\t100000\t0.3994\t27817\tRomney\t27817\t0.00248101\t27817.0\n15229\t-77.04861600000001\t35.556646\tWashington city\tNC\tNorth Carolina\tBeaufort County\t9239\t41.6\t25.7\t15.5\t18486\t117768\t0.3994\t27889\tRomney\t27889\t0.027683636\t27889.0\n15230\t-76.788556\t35.303432\tAurora town\tNC\tNorth Carolina\tBeaufort County\t595\t47.9\t12.5\t8.1\t18840\t92813\t0.3994\t27806\tRomney\t27806\t0.001782851\t27806.0\n15231\t-76.941064\t35.99573\tWindsor town\tNC\tNorth Carolina\tBertie County\t2777\t41.0\t18.4\t10.3\t17786\t100344\t0.6614\t27983\tRomney\t27983\t0.008320972\t27983.0\n15232\t-77.223946\t36.181039\tKelford town\tNC\tNorth Carolina\tBertie County\t221\t40.6\t8.8\t10.3\t12933\t61667\t0.6614\t27847\tRomney\t27847\t0.000662202\t27847.0\n15233\t-77.181127\t36.114062\tLewiston Woodville town\tNC\tNorth Carolina\tBertie County\t584\t39.7\t9.5\t11.3\t13293\t67857\t0.6614\t27849\tRomney\t27849\t0.0017498910000000002\t27849.0\n15234\t-77.113612\t36.228176\tAulander town\tNC\tNorth Carolina\tBertie County\t875\t41.9\t10.1\t7.6\t15677\t82759\t0.6614\t27805\tRomney\t27805\t0.00262184\t27805.0\n15235\t-76.941275\t36.111519\tAskewville town\tNC\tNorth Carolina\tBertie County\t177\t41.3\t9.8\t8.6\t16136\t79000\t0.6614\t27983\tRomney\t27983\t0.000530361\t27983.0\n15236\t-76.931573\t36.225235999999995\tPowellsville town\tNC\tNorth Carolina\tBertie County\t227\t41.9\t11.0\t9.8\t14424\t78571\t0.6614\t27967\tRomney\t27967\t0.00068018\t27967.0\n15237\t-77.23984\t36.201553999999994\tRoxobel town\tNC\tNorth Carolina\tBertie County\t236\t39.5\t8.2\t9.7\t12816\t59545\t0.6614\t27872\tRomney\t27872\t0.000707148\t27872.0\n15238\t-76.766509\t36.201489\tColerain town\tNC\tNorth Carolina\tBertie County\t235\t41.5\t8.8\t10.0\t16399\t81875\t0.6614\t27924\tRomney\t27924\t0.0007041510000000001\t27924.0\n15239\t-78.789956\t34.732757\tTar Heel town\tNC\tNorth Carolina\tBladen County\t74\t43.8\t16.4\t11.1\t20799\t80000\t0.5052\t28392\tRomney\t28392\t0.000221733\t28392.0\n15240\t-78.497156\t34.642753000000006\tWhite Lake town\tNC\tNorth Carolina\tBladen County\t549\t44.9\t30.6\t9.1\t26047\t128214\t0.5052\t28337\tRomney\t28337\t0.0016450170000000001\t28337.0\n15241\t-78.323909\t34.381663\tEast Arcadia town\tNC\tNorth Carolina\tBladen County\t531\t40.2\t7.8\t16.1\t14546\t84091\t0.5052\t28456\tRomney\t28456\t0.0015910820000000002\t28456.0\n15242\t-78.84786899999999\t34.560459\tButters CDP\tNC\tNorth Carolina\tBladen County\t256\t47.8\t6.1\t14.3\t17768\t79286\t0.5052\t28320\tRomney\t28320\t0.0007670760000000001\t28320.0\n15243\t-78.719613\t34.739005\tWhite Oak CDP\tNC\tNorth Carolina\tBladen County\t309\t37.8\t14.6\t11.3\t13600\t68182\t0.5052\t28399\tRomney\t28399\t0.000925884\t28399.0\n15244\t-78.793762\t34.539603\tBladenboro town\tNC\tNorth Carolina\tBladen County\t1663\t41.7\t10.8\t13.7\t17420\t84200\t0.5052\t28320\tRomney\t28320\t0.004982994\t28320.0\n15245\t-78.60891099999999\t34.622632\tElizabethtown town\tNC\tNorth Carolina\tBladen County\t3810\t43.5\t21.3\t11.4\t18661\t87920\t0.5052\t28337\tRomney\t28337\t0.011416241\t28337.0\n15246\t-78.311053\t34.464034000000005\tKelly CDP\tNC\tNorth Carolina\tBladen County\t487\t45.7\t12.1\t14.4\t20856\t95769\t0.5052\t28448\tRomney\t28448\t0.001459241\t28448.0\n15247\t-78.654872\t34.488991\tClarkton town\tNC\tNorth Carolina\tBladen County\t645\t41.6\t21.2\t10.2\t15907\t106696\t0.5052\t28433\tRomney\t28433\t0.001932671\t28433.0\n15248\t-78.72308000000001\t34.656232\tDublin town\tNC\tNorth Carolina\tBladen County\t278\t37.3\t16.0\t9.6\t18070\t89000\t0.5052\t28332\tRomney\t28332\t0.000832996\t28332.0\n15249\t-78.008524\t34.237525\tLeland town\tNC\tNorth Carolina\tBrunswick County\t4851\t36.8\t15.0\t11.5\t20395\t109135\t0.3842\t284HH\tRomney\t284HH\t0.014535481999999999\t0.0\n15250\t-77.985414\t33.863108000000004\tBald Head Island village\tNC\tNorth Carolina\tBrunswick County\t238\t55.5\t45.8\t13.6\t38934\t377273\t0.3842\t28461\tRomney\t28461\t0.000713141\t28461.0\n15251\t-78.019202\t33.925902\tSouthport city\tNC\tNorth Carolina\tBrunswick County\t2618\t51.9\t31.5\t12.8\t29497\t189107\t0.3842\t28461\tRomney\t28461\t0.007844545999999999\t28461.0\n15252\t-78.13457\t33.916501000000004\tOak Island town\tNC\tNorth Carolina\tBrunswick County\t7665\t55.3\t21.4\t10.8\t28634\t164982\t0.3842\t28465\tRomney\t28465\t0.02296732\t28465.0\n15253\t-78.569987\t33.891791999999995\tCalabash town\tNC\tNorth Carolina\tBrunswick County\t683\t60.4\t21.2\t16.3\t24181\t163021\t0.3842\t28467\tRomney\t28467\t0.002046534\t28467.0\n15254\t-78.311624\t33.911004\tHolden Beach town\tNC\tNorth Carolina\tBrunswick County\t1374\t60.8\t42.3\t10.9\t44122\t309677\t0.3842\t28462\tRomney\t28462\t0.004117038\t28462.0\n15255\t-78.578625\t33.901672\tCarolina Shores town\tNC\tNorth Carolina\tBrunswick County\t1800\t64.0\t21.6\t17.2\t25717\t180132\t0.3842\t28467\tRomney\t28467\t0.0053935\t28467.0\n15256\t-78.11068\t33.938233000000004\tSt. James town\tNC\tNorth Carolina\tBrunswick County\t2584\t60.2\t34.5\t11.5\t37116\t196296\t0.3842\t28465\tRomney\t28465\t0.007742669000000001\t28465.0\n15257\t-78.14751600000001\t34.071115999999996\tBolivia town\tNC\tNorth Carolina\tBrunswick County\t196\t37.7\t6.9\t11.1\t19668\t87500\t0.3842\t28422\tRomney\t28422\t0.000587292\t28422.0\n15258\t-78.51227800000001\t33.893609000000005\tSunset Beach town\tNC\tNorth Carolina\tBrunswick County\t3115\t60.4\t29.4\t12.2\t31756\t173438\t0.3842\t28468\tRomney\t28468\t0.009333751\t28468.0\n15259\t-78.067008\t34.032629\tBoiling Spring Lakes city\tNC\tNorth Carolina\tBrunswick County\t5130\t42.8\t16.2\t11.0\t21564\t130693\t0.3842\t28461\tRomney\t28461\t0.015371474\t28461.0\n15260\t-78.38640799999999\t33.970831\tShallotte town\tNC\tNorth Carolina\tBrunswick County\t2330\t46.7\t24.6\t11.2\t25531\t174228\t0.3842\t28470\tRomney\t28470\t0.006981586\t28470.0\n15261\t-78.157134\t34.285379999999996\tSandy Creek town\tNC\tNorth Carolina\tBrunswick County\t274\t39.3\t7.6\t11.5\t19173\t96250\t0.3842\t28451\tRomney\t28451\t0.0008210110000000001\t28451.0\n15262\t-78.003914\t34.256689\tNavassa town\tNC\tNorth Carolina\tBrunswick County\t716\t33.7\t3.6\t11.1\t20373\t89091\t0.3842\t28451\tRomney\t28451\t0.002145414\t28451.0\n15263\t-78.004738\t34.213343\tBelville town\tNC\tNorth Carolina\tBrunswick County\t3842\t36.7\t21.0\t9.9\t26085\t154454\t0.3842\t284HH\tRomney\t284HH\t0.011512126000000001\t0.0\n15264\t-78.42793\t33.891418\tOcean Isle Beach town\tNC\tNorth Carolina\tBrunswick County\t1048\t60.3\t36.4\t7.2\t38393\t288587\t0.3842\t28469\tRomney\t28469\t0.003140215\t28469.0\n15265\t-78.23674100000001\t33.942882\tVarnamtown town\tNC\tNorth Carolina\tBrunswick County\t564\t53.0\t26.4\t11.6\t27504\t177500\t0.3842\t28422\tRomney\t28422\t0.0016899629999999998\t28422.0\n15266\t-78.053459\t33.905224\tCaswell Beach town\tNC\tNorth Carolina\tBrunswick County\t814\t62.6\t40.1\t12.0\t42460\t263636\t0.3842\t28461\tRomney\t28461\t0.00243906\t28461.0\n15267\t-78.147869\t34.314338\tNorthwest city\tNC\tNorth Carolina\tBrunswick County\t749\t35.1\t8.0\t13.3\t17405\t90789\t0.3842\t28451\tRomney\t28451\t0.002244295\t28451.0\n15268\t-82.505018\t35.478136\tRoyal Pines CDP\tNC\tNorth Carolina\tBuncombe County\t5789\t42.8\t46.4\t6.7\t31177\t203274\t0.5531\t28704\tRomney\t28704\t0.017346094\t28704.0\n15269\t-82.617241\t35.507927\tBent Creek CDP\tNC\tNorth Carolina\tBuncombe County\t1533\t42.4\t20.4\t12.1\t25240\t141848\t0.5531\t28806\tRomney\t28806\t0.004593464\t28806.0\n15270\t-82.299908\t35.647847\tMontreat town\tNC\tNorth Carolina\tBuncombe County\t711\t43.8\t46.7\t9.0\t22899\t175000\t0.5531\t28757\tRomney\t28757\t0.0021304320000000002\t28757.0\n15271\t-82.540672\t35.533431\tBiltmore Forest town\tNC\tNorth Carolina\tBuncombe County\t1425\t51.3\t78.1\t6.4\t76129\t660180\t0.5531\t28803\tRomney\t28803\t0.004269854\t28803.0\n15272\t-82.55325\t35.579865000000005\tAsheville city\tNC\tNorth Carolina\tBuncombe County\t74234\t41.3\t36.9\t10.4\t25790\t146082\t0.5531\t28801\tRomney\t28801\t0.222433923\t28801.0\n15273\t-82.58566400000001\t35.638231\tWoodfin town\tNC\tNorth Carolina\tBuncombe County\t3381\t42.0\t27.5\t10.5\t21678\t94459\t0.5531\t28804\tRomney\t28804\t0.01013079\t28804.0\n15274\t-82.391796\t35.600799\tSwannanoa CDP\tNC\tNorth Carolina\tBuncombe County\t4583\t44.1\t24.5\t8.9\t21120\t103884\t0.5531\t28778\tRomney\t28778\t0.01373245\t28778.0\n15275\t-82.328349\t35.616094\tBlack Mountain town\tNC\tNorth Carolina\tBuncombe County\t8195\t45.5\t38.9\t10.0\t23204\t135944\t0.5531\t28711\tRomney\t28711\t0.024555406000000002\t28711.0\n15276\t-82.565701\t35.698702000000004\tWeaverville town\tNC\tNorth Carolina\tBuncombe County\t2847\t44.4\t35.0\t8.5\t26037\t190234\t0.5531\t28787\tRomney\t28787\t0.008530719\t28787.0\n15277\t-82.571949\t35.464929\tAvery Creek CDP\tNC\tNorth Carolina\tBuncombe County\t1689\t41.7\t31.1\t8.3\t27281\t150926\t0.5531\t28704\tRomney\t28704\t0.005060901\t28704.0\n15278\t-82.401238\t35.522549\tFairview CDP\tNC\tNorth Carolina\tBuncombe County\t3007\t41.6\t34.8\t9.0\t23787\t174559\t0.5531\t28730\tRomney\t28730\t0.009010141\t28730.0\n15279\t-81.783342\t35.728873\tGlen Alpine town\tNC\tNorth Carolina\tBurke County\t1054\t40.6\t10.4\t14.8\t18730\t97027\t0.3749\t28655\tRomney\t28655\t0.003158194\t28655.0\n15280\t-81.700572\t35.699649\tSalem CDP\tNC\tNorth Carolina\tBurke County\t2906\t33.3\t13.2\t13.3\t18687\t102586\t0.3749\t28655\tRomney\t28655\t0.008707506\t28655.0\n15281\t-81.457624\t35.724925\tIcard CDP\tNC\tNorth Carolina\tBurke County\t2562\t40.6\t8.6\t13.6\t19199\t90702\t0.3749\t28666\tRomney\t28666\t0.007676748000000001\t28666.0\n15282\t-81.527168\t35.751447\tRutherford College town\tNC\tNorth Carolina\tBurke County\t1254\t45.7\t22.5\t13.3\t21489\t105250\t0.3749\t28671\tRomney\t28671\t0.0037574709999999996\t28671.0\n15283\t-81.42935200000001\t35.776003\tRhodhiss town\tNC\tNorth Carolina\tBurke County\t379\t38.9\t9.7\t14.4\t18410\t84615\t0.3749\t28630\tRomney\t28630\t0.001135631\t28630.0\n15284\t-81.55502800000001\t35.748899\tValdese town\tNC\tNorth Carolina\tBurke County\t4403\t42.1\t20.9\t12.9\t20548\t97591\t0.3749\t28690\tRomney\t28690\t0.013193100000000001\t28690.0\n15285\t-81.69919399999999\t35.741239\tMorganton city\tNC\tNorth Carolina\tBurke County\t16909\t40.9\t24.4\t14.8\t22928\t106236\t0.3749\t28655\tRomney\t28655\t0.050665937\t28655.0\n15286\t-81.500951\t35.748135999999995\tConnelly Springs town\tNC\tNorth Carolina\tBurke County\t1771\t37.8\t7.9\t17.0\t18194\t82667\t0.3749\t28671\tRomney\t28671\t0.005306604\t28671.0\n15287\t-81.418423\t35.716764000000005\tHildebran town\tNC\tNorth Carolina\tBurke County\t1456\t41.7\t14.9\t16.8\t19189\t95132\t0.3749\t28637\tRomney\t28637\t0.004362742\t28637.0\n15288\t-81.60815500000001\t35.756322\tDrexel town\tNC\tNorth Carolina\tBurke County\t2034\t39.6\t19.2\t15.4\t21373\t98333\t0.3749\t28619\tRomney\t28619\t0.006094655\t28619.0\n15289\t-80.619776\t35.517169\tKannapolis city\tNC\tNorth Carolina\tCabarrus County\t40700\t38.4\t14.3\t14.9\t22196\t104070\t0.3931\t28088\tRomney\t28088\t0.121953022\t28088.0\n15290\t-80.65767\t35.319373999999996\tHarrisburg town\tNC\tNorth Carolina\tCabarrus County\t7951\t41.0\t27.8\t7.5\t30901\t175720\t0.3931\t28075\tRomney\t28075\t0.023824287000000003\t28075.0\n15291\t-80.434499\t35.401340999999995\tMount Pleasant town\tNC\tNorth Carolina\tCabarrus County\t1463\t40.6\t18.6\t12.3\t24586\t122409\t0.3931\t28124\tRomney\t28124\t0.0043837170000000005\t28124.0\n15292\t-80.630359\t35.39583\tConcord city\tNC\tNorth Carolina\tCabarrus County\t72020\t35.1\t26.1\t14.3\t27021\t134134\t0.3931\t28027\tRomney\t28027\t0.215799918\t28027.0\n15293\t-81.531082\t35.902856\tLenoir city\tNC\tNorth Carolina\tCaldwell County\t16596\t40.6\t15.3\t22.4\t19962\t93053\t0.3138\t28645\tRomney\t28645\t0.049728068\t28645.0\n15294\t-81.427532\t35.800752\tGranite Falls town\tNC\tNorth Carolina\tCaldwell County\t4732\t39.5\t14.8\t11.6\t20316\t108498\t0.3138\t28630\tRomney\t28630\t0.014178912\t28630.0\n15295\t-81.36685200000001\t35.775515000000006\tNorthlakes CDP\tNC\tNorth Carolina\tCaldwell County\t1557\t44.8\t45.4\t11.4\t33749\t177885\t0.3138\t28601\tRomney\t28601\t0.004665377\t28601.0\n15296\t-81.536834\t35.849955\tCajah's Mountain town\tNC\tNorth Carolina\tCaldwell County\t2543\t41.8\t11.7\t16.4\t20271\t96292\t0.3138\t28638\tRomney\t28638\t0.007619816999999999\t28638.0\n15297\t-81.486457\t35.847489\tHudson town\tNC\tNorth Carolina\tCaldwell County\t3221\t42.6\t15.2\t11.4\t21069\t98196\t0.3138\t28638\tRomney\t28638\t0.009651368\t28638.0\n15298\t-81.478256\t35.818335\tSawmills town\tNC\tNorth Carolina\tCaldwell County\t5149\t39.0\t11.5\t12.2\t20270\t100460\t0.3138\t28638\tRomney\t28638\t0.015428406\t28638.0\n15299\t-81.59851\t35.863872\tGamewell town\tNC\tNorth Carolina\tCaldwell County\t3761\t41.5\t8.5\t12.9\t19144\t92531\t0.3138\t28645\tRomney\t28645\t0.011269418\t28645.0\n15300\t-81.458737\t35.943312\tCedar Rock village\tNC\tNorth Carolina\tCaldwell County\t317\t47.5\t25.6\t13.5\t24825\t123611\t0.3138\t28645\tRomney\t28645\t0.000949855\t28645.0\n15301\t-77.03094399999999\t34.697989\tBogue town\tNC\tNorth Carolina\tCarteret County\t662\t45.6\t22.1\t7.5\t23258\t176250\t0.29\t28594\tRomney\t28594\t0.001983609\t28594.0\n15302\t-76.87804399999999\t34.770136\tNewport town\tNC\tNorth Carolina\tCarteret County\t3434\t39.0\t11.4\t6.3\t22558\t128200\t0.29\t28570\tRomney\t28570\t0.010289599\t28570.0\n15303\t-76.64959300000001\t34.724651\tBeaufort town\tNC\tNorth Carolina\tCarteret County\t4298\t46.4\t27.2\t8.2\t23575\t174475\t0.29\t28516\tRomney\t28516\t0.012878478999999998\t28516.0\n15304\t-76.741668\t34.700656\tAtlantic Beach town\tNC\tNorth Carolina\tCarteret County\t2064\t54.0\t36.8\t8.0\t35613\t262857\t0.29\t28557\tRomney\t28557\t0.006184546\t28557.0\n15305\t-77.057675\t34.696448\tCape Carteret town\tNC\tNorth Carolina\tCarteret County\t1533\t50.5\t23.8\t7.4\t25772\t181136\t0.29\t28584\tRomney\t28584\t0.004593464\t28584.0\n15306\t-77.08264399999999\t34.687002\tCedar Point town\tNC\tNorth Carolina\tCarteret County\t971\t51.6\t18.4\t5.3\t28547\t174537\t0.29\t28584\tRomney\t28584\t0.002909493\t28584.0\n15307\t-76.898511\t34.686772\tIndian Beach town\tNC\tNorth Carolina\tCarteret County\t87\t56.3\t32.0\t6.5\t27511\t268750\t0.29\t28575\tRomney\t28575\t0.000260686\t28575.0\n15308\t-77.07395799999999\t34.726694\tPeletier town\tNC\tNorth Carolina\tCarteret County\t572\t44.2\t19.3\t4.9\t22056\t151250\t0.29\t28584\tRomney\t28584\t0.0017139339999999999\t28584.0\n15309\t-76.821885\t34.696791999999995\tPine Knoll Shores town\tNC\tNorth Carolina\tCarteret County\t1462\t65.1\t49.3\t6.0\t35194\t311268\t0.29\t28512\tRomney\t28512\t0.00438072\t28512.0\n15310\t-77.030112\t34.664574\tEmerald Isle town\tNC\tNorth Carolina\tCarteret County\t3839\t54.6\t45.1\t6.4\t35966\t283817\t0.29\t28594\tRomney\t28594\t0.011503136\t28594.0\n15311\t-76.5588\t34.69913\tHarkers Island CDP\tNC\tNorth Carolina\tCarteret County\t1633\t53.5\t10.0\t5.3\t23736\t146350\t0.29\t28531\tRomney\t28531\t0.004893103\t28531.0\n15312\t-76.756063\t34.728336\tMorehead City town\tNC\tNorth Carolina\tCarteret County\t7635\t45.7\t28.3\t6.8\t27184\t162189\t0.29\t28557\tRomney\t28557\t0.022877427999999998\t28557.0\n15313\t-79.341303\t36.409933\tYanceyville town\tNC\tNorth Carolina\tCaswell County\t1996\t38.1\t9.4\t16.5\t15969\t88400\t0.4845\t27379\tRomney\t27379\t0.0059807919999999995\t27379.0\n15314\t-79.208146\t36.537304\tMilton town\tNC\tNorth Carolina\tCaswell County\t129\t39.7\t12.2\t18.9\t19494\t98750\t0.4845\t27305\tRomney\t27305\t0.000386534\t27305.0\n15315\t-81.231146\t35.665756\tNewton city\tNC\tNorth Carolina\tCatawba County\t13758\t39.4\t18.8\t14.1\t21701\t106661\t0.3458\t28658\tRomney\t28658\t0.041224316000000004\t28658.0\n15316\t-81.324313\t35.774654\tHickory city\tNC\tNorth Carolina\tCatawba County\t39673\t36.9\t30.0\t15.5\t27007\t127118\t0.3458\t28601\tRomney\t28601\t0.118875731\t28601.0\n15317\t-80.996945\t35.620034000000004\tSherrills Ford CDP\tNC\tNorth Carolina\tCatawba County\t1110\t42.5\t17.3\t12.3\t23717\t132181\t0.3458\t28673\tRomney\t28673\t0.0033259920000000003\t28673.0\n15318\t-81.34637099999999\t35.702785999999996\tBrookford town\tNC\tNorth Carolina\tCatawba County\t531\t39.7\t23.8\t20.3\t19948\t100000\t0.3458\t28602\tRomney\t28602\t0.0015910820000000002\t28602.0\n15319\t-81.192598\t35.582611\tMaiden town\tNC\tNorth Carolina\tCatawba County\t3590\t38.4\t12.3\t12.6\t20573\t98333\t0.3458\t28650\tRomney\t28650\t0.010757036000000001\t28650.0\n15320\t-81.073555\t35.708993\tCatawba town\tNC\tNorth Carolina\tCatawba County\t808\t40.6\t14.4\t13.0\t21701\t97500\t0.3458\t28609\tRomney\t28609\t0.002421082\t28609.0\n15321\t-81.15287\t35.711969\tClaremont city\tNC\tNorth Carolina\tCatawba County\t1222\t41.8\t13.6\t18.8\t20870\t112349\t0.3458\t28610\tRomney\t28610\t0.003661587\t28610.0\n15322\t-81.219072\t35.713839\tConover city\tNC\tNorth Carolina\tCatawba County\t7782\t41.0\t20.3\t14.8\t23698\t116392\t0.3458\t28613\tRomney\t28613\t0.023317897\t28613.0\n15323\t-81.38328299999999\t35.730421\tLong View town\tNC\tNorth Carolina\tCatawba County\t4708\t38.0\t11.0\t19.1\t20512\t86211\t0.3458\t28637\tRomney\t28637\t0.014106998\t28637.0\n15324\t-81.275041\t35.764214\tSt. Stephens CDP\tNC\tNorth Carolina\tCatawba County\t10134\t38.0\t18.1\t13.7\t21555\t115393\t0.3458\t28601\tRomney\t28601\t0.030365404\t28601.0\n15325\t-81.012385\t35.598096999999996\tLake Norman of Catawba CDP\tNC\tNorth Carolina\tCatawba County\t6644\t46.0\t26.7\t9.9\t29023\t168460\t0.3458\t28673\tRomney\t28673\t0.019908007\t28673.0\n15326\t-81.368093\t35.682909\tMountain View CDP\tNC\tNorth Carolina\tCatawba County\t4306\t39.8\t23.1\t11.4\t23082\t120207\t0.3458\t28602\tRomney\t28602\t0.01290245\t28602.0\n15327\t-79.461145\t35.723585\tSiler City town\tNC\tNorth Carolina\tChatham County\t8432\t34.6\t11.5\t10.4\t16395\t95417\t0.5182\t27344\tRomney\t27344\t0.02526555\t27344.0\n15328\t-79.32851600000001\t35.592951\tGoldston town\tNC\tNorth Carolina\tChatham County\t359\t45.9\t14.9\t6.2\t20835\t82500\t0.5182\t27252\tRomney\t27252\t0.001075704\t27252.0\n15329\t-79.17372399999999\t35.720271000000004\tPittsboro town\tNC\tNorth Carolina\tChatham County\t3116\t42.2\t33.1\t8.8\t23855\t161513\t0.5182\t27312\tRomney\t27312\t0.009336747\t27312.0\n15330\t-79.073049\t35.808357\tFearrington CDP\tNC\tNorth Carolina\tChatham County\t872\t57.9\t71.7\t6.5\t42631\t292593\t0.5182\t27510\tRomney\t27510\t0.0026128510000000002\t27510.0\n15331\t-84.027876\t35.092475\tMurphy town\tNC\tNorth Carolina\tCherokee County\t1589\t44.0\t20.6\t14.2\t20686\t123110\t0.2625\t289HH\tRomney\t289HH\t0.0047612620000000005\t0.0\n15332\t-83.82650699999999\t35.199209\tAndrews town\tNC\tNorth Carolina\tCherokee County\t1950\t43.1\t8.3\t14.8\t16040\t82800\t0.2625\t28901\tRomney\t28901\t0.0058429580000000005\t28901.0\n15333\t-76.60821999999999\t36.066539\tEdenton town\tNC\tNorth Carolina\tChowan County\t5071\t41.5\t25.9\t17.3\t18923\t122748\t0.4738\t27932\tRomney\t27932\t0.015194687\t27932.0\n15334\t-83.819884\t35.046921000000005\tHayesville town\tNC\tNorth Carolina\tClay County\t472\t49.7\t19.7\t11.5\t19131\t138194\t0.2799\t28904\tRomney\t28904\t0.001414295\t28904.0\n15335\t-81.51619699999999\t35.233144\tPatterson Springs town\tNC\tNorth Carolina\tCleveland County\t628\t38.2\t11.4\t12.2\t19248\t103409\t0.3937\t28038\tRomney\t28038\t0.0018817320000000001\t28038.0\n15336\t-81.313795\t35.242576\tKings Mountain city\tNC\tNorth Carolina\tCleveland County\t9904\t40.1\t15.0\t13.8\t19350\t118068\t0.3937\t28086\tRomney\t28086\t0.029676234\t28086.0\n15337\t-81.620124\t35.362596\tKingstown town\tNC\tNorth Carolina\tCleveland County\t899\t38.2\t14.0\t16.7\t19265\t109659\t0.3937\t28089\tRomney\t28089\t0.0026937529999999997\t28089.0\n15338\t-81.617008\t35.512685\tCasar town\tNC\tNorth Carolina\tCleveland County\t301\t43.3\t6.3\t14.4\t16689\t97500\t0.3937\t28020\tRomney\t28020\t0.0009019130000000001\t28020.0\n15339\t-81.698566\t35.299167\tMooresboro town\tNC\tNorth Carolina\tCleveland County\t317\t36.0\t9.0\t14.9\t16862\t99333\t0.3937\t28089\tRomney\t28089\t0.000949855\t28089.0\n15340\t-81.54059000000001\t35.288719\tShelby city\tNC\tNorth Carolina\tCleveland County\t18680\t41.3\t22.5\t17.0\t21476\t123020\t0.3937\t28150\tRomney\t28150\t0.055972542\t28150.0\n15341\t-81.451938\t35.173522\tGrover town\tNC\tNorth Carolina\tCleveland County\t753\t34.3\t5.8\t17.4\t17918\t107979\t0.3937\t28073\tRomney\t28073\t0.002256281\t28073.0\n15342\t-81.66471800000001\t35.252227000000005\tBoiling Springs town\tNC\tNorth Carolina\tCleveland County\t4009\t27.9\t35.4\t13.4\t22187\t146684\t0.3937\t28017\tRomney\t28017\t0.012012523\t28017.0\n15343\t-81.53463\t35.195673\tEarl town\tNC\tNorth Carolina\tCleveland County\t277\t37.0\t6.8\t13.7\t17097\t116071\t0.3937\t28038\tRomney\t28038\t0.0008300000000000001\t28038.0\n15344\t-81.502274\t35.428984\tFallston town\tNC\tNorth Carolina\tCleveland County\t655\t40.0\t12.9\t15.1\t18313\t118269\t0.3937\t28090\tRomney\t28090\t0.001962635\t28090.0\n15345\t-81.52283100000001\t35.479468\tBelwood town\tNC\tNorth Carolina\tCleveland County\t1045\t39.0\t13.7\t12.1\t17571\t107273\t0.3937\t28090\tRomney\t28090\t0.003131226\t28090.0\n15346\t-81.477624\t35.286117\tLight Oak CDP\tNC\tNorth Carolina\tCleveland County\t768\t43.1\t23.6\t11.9\t22943\t169792\t0.3937\t28150\tRomney\t28150\t0.0023012270000000003\t28150.0\n15347\t-81.562611\t35.414332\tLawndale town\tNC\tNorth Carolina\tCleveland County\t709\t40.1\t10.9\t13.0\t16236\t79500\t0.3937\t28090\tRomney\t28090\t0.00212444\t28090.0\n15348\t-81.660381\t35.315245000000004\tLattimore town\tNC\tNorth Carolina\tCleveland County\t462\t37.2\t18.0\t17.3\t18599\t113194\t0.3937\t28089\tRomney\t28089\t0.001384332\t28089.0\n15349\t-81.42849\t35.36158\tWaco town\tNC\tNorth Carolina\tCleveland County\t328\t39.1\t5.5\t12.6\t16006\t90833\t0.3937\t28169\tRomney\t28169\t0.000982816\t28169.0\n15350\t-81.643772\t35.416439000000004\tPolkville city\tNC\tNorth Carolina\tCleveland County\t586\t39.1\t14.0\t12.7\t19303\t110484\t0.3937\t28090\tRomney\t28090\t0.0017558839999999999\t28090.0\n15351\t-78.550733\t34.308499\tLake Waccamaw town\tNC\tNorth Carolina\tColumbus County\t1505\t47.2\t25.6\t10.0\t25203\t152574\t0.4558\t28450\tRomney\t28450\t0.004509565\t28450.0\n15352\t-78.871204\t34.151461\tTabor City town\tNC\tNorth Carolina\tColumbus County\t2320\t41.9\t16.1\t12.5\t15955\t91857\t0.4558\t28463\tRomney\t28463\t0.006951621999999999\t28463.0\n15353\t-79.034461\t34.310862\tFair Bluff town\tNC\tNorth Carolina\tColumbus County\t1084\t42.1\t10.5\t18.6\t13844\t65441\t0.4558\t28439\tRomney\t28439\t0.003248085\t28439.0\n15354\t-78.40114399999999\t34.316858\tBolton town\tNC\tNorth Carolina\tColumbus County\t513\t37.1\t5.6\t12.1\t17232\t99000\t0.4558\t28423\tRomney\t28423\t0.0015371470000000002\t28423.0\n15355\t-78.947009\t34.436068\tBoardman town\tNC\tNorth Carolina\tColumbus County\t208\t42.1\t3.4\t13.5\t16031\t80000\t0.4558\t28438\tRomney\t28438\t0.000623249\t28438.0\n15356\t-78.30032\t34.374168\tSandyfield town\tNC\tNorth Carolina\tColumbus County\t324\t39.6\t7.2\t10.2\t20219\t106944\t0.4558\t28456\tRomney\t28456\t0.00097083\t28456.0\n15357\t-78.705753\t34.292114\tBrunswick town\tNC\tNorth Carolina\tColumbus County\t361\t39.4\t7.9\t11.0\t15061\t74375\t0.4558\t28472\tRomney\t28472\t0.001081696\t28472.0\n15358\t-78.825529\t34.324408\tChadbourn town\tNC\tNorth Carolina\tColumbus County\t1996\t38.7\t11.7\t15.3\t16546\t78953\t0.4558\t28431\tRomney\t28431\t0.0059807919999999995\t28431.0\n15359\t-78.92859399999999\t34.322865\tCerro Gordo town\tNC\tNorth Carolina\tColumbus County\t252\t38.1\t15.0\t14.9\t14591\t89000\t0.4558\t28430\tRomney\t28430\t0.00075509\t28430.0\n15360\t-78.70140500000001\t34.330543\tWhiteville city\tNC\tNorth Carolina\tColumbus County\t4984\t43.2\t26.4\t13.1\t20711\t120383\t0.4558\t28472\tRomney\t28472\t0.014934002\t28472.0\n15361\t-77.43348\t35.215687\tDover town\tNC\tNorth Carolina\tCraven County\t478\t45.7\t12.5\t11.1\t16856\t94615\t0.4064\t28526\tRomney\t28526\t0.0014322739999999999\t28526.0\n15362\t-77.320844\t35.188809\tCove City town\tNC\tNorth Carolina\tCraven County\t455\t45.8\t9.6\t10.6\t16123\t91923\t0.4064\t28523\tRomney\t28523\t0.0013633570000000002\t28523.0\n15363\t-77.021939\t35.059746999999994\tJames City CDP\tNC\tNorth Carolina\tCraven County\t6359\t40.3\t22.3\t9.5\t22081\t135616\t0.4064\t28560\tRomney\t28560\t0.019054036\t28560.0\n15364\t-76.959742\t35.070468\tFairfield Harbour CDP\tNC\tNorth Carolina\tCraven County\t2624\t61.3\t33.6\t9.5\t33671\t223171\t0.4064\t28560\tRomney\t28560\t0.007862524000000001\t28560.0\n15365\t-77.089601\t35.118857\tNew Bern city\tNC\tNorth Carolina\tCraven County\t25426\t40.9\t26.0\t11.3\t21907\t128451\t0.4064\t28562\tRomney\t28562\t0.07618618\t28562.0\n15366\t-77.15623599999999\t35.303069\tVanceboro town\tNC\tNorth Carolina\tCraven County\t975\t36.3\t13.6\t12.3\t18416\t110746\t0.4064\t28586\tRomney\t28586\t0.0029214790000000003\t28586.0\n15367\t-77.021226\t35.123176\tBridgeton town\tNC\tNorth Carolina\tCraven County\t389\t60.8\t32.9\t9.7\t33151\t221429\t0.4064\t28519\tRomney\t28519\t0.001165595\t28519.0\n15368\t-77.093337\t35.081315000000004\tTrent Woods town\tNC\tNorth Carolina\tCraven County\t4465\t50.4\t47.2\t7.5\t35518\t231720\t0.4064\t28562\tRomney\t28562\t0.013378876000000001\t28562.0\n15369\t-77.083776\t35.050814\tBrices Creek CDP\tNC\tNorth Carolina\tCraven County\t2404\t45.9\t34.1\t7.8\t28250\t226801\t0.4064\t28562\tRomney\t28562\t0.0072033190000000006\t28562.0\n15370\t-77.150757\t35.072099\tRiver Bend town\tNC\tNorth Carolina\tCraven County\t3189\t59.9\t39.4\t8.5\t34957\t199920\t0.4064\t28562\tRomney\t28562\t0.009555484\t28562.0\n15371\t-76.8976\t34.90733\tHavelock city\tNC\tNorth Carolina\tCraven County\t22013\t24.4\t17.9\t11.6\t18889\t130839\t0.4064\t28532\tRomney\t28532\t0.065959506\t28532.0\n15372\t-76.93928100000001\t34.964958\tNeuse Forest CDP\tNC\tNorth Carolina\tCraven County\t1595\t42.6\t34.1\t9.2\t26311\t202119\t0.4064\t285HH\tRomney\t285HH\t0.00477924\t0.0\n15373\t-78.7491\t35.254897\tLinden town\tNC\tNorth Carolina\tCumberland County\t143\t40.7\t10.2\t9.6\t22403\t100000\t0.5938\t28356\tRomney\t28356\t0.000428484\t28356.0\n15374\t-79.011185\t35.171167\tPope AFB CDP\tNC\tNorth Carolina\tCumberland County\t2510\t23.9\t27.9\t14.3\t14642\t85000\t0.5938\t28307\tRomney\t28307\t0.007520936\t28307.0\n15375\t-78.921909\t35.072969\tFayetteville city\tNC\tNorth Carolina\tCumberland County\t121930\t33.4\t25.9\t13.0\t24371\t116662\t0.5938\t28305\tRomney\t28305\t0.36534968100000004\t28305.0\n15376\t-79.00340200000001\t35.137431\tFort Bragg CDP\tNC\tNorth Carolina\tCumberland County\t28488\t22.5\t19.7\t15.5\t13817\t114474\t0.5938\t28307\tRomney\t28307\t0.08536112300000001\t28307.0\n15377\t-78.680838\t35.2173\tGodwin town\tNC\tNorth Carolina\tCumberland County\t129\t42.8\t8.8\t11.5\t17965\t93333\t0.5938\t28342\tRomney\t28342\t0.000386534\t28342.0\n15378\t-78.641768\t35.195746\tFalcon town\tNC\tNorth Carolina\tCumberland County\t340\t40.2\t16.7\t9.4\t18771\t107813\t0.5938\t28342\tRomney\t28342\t0.001018772\t28342.0\n15379\t-78.955782\t34.973182\tHope Mills town\tNC\tNorth Carolina\tCumberland County\t12464\t32.9\t15.5\t10.0\t21957\t110396\t0.5938\t28348\tRomney\t28348\t0.037346989\t28348.0\n15380\t-78.97855600000001\t35.177409999999995\tSpring Lake town\tNC\tNorth Carolina\tCumberland County\t7755\t27.4\t9.5\t14.4\t17370\t96637\t0.5938\t28390\tRomney\t28390\t0.023236995\t28390.0\n15381\t-78.78841899999999\t35.034541\tVander CDP\tNC\tNorth Carolina\tCumberland County\t1231\t39.7\t15.3\t9.0\t23308\t106926\t0.5938\t28301\tRomney\t28301\t0.003688555\t28301.0\n15382\t-78.69902900000001\t35.011398\tStedman town\tNC\tNorth Carolina\tCumberland County\t945\t41.6\t11.5\t9.5\t21943\t89800\t0.5938\t28391\tRomney\t28391\t0.002831587\t28391.0\n15383\t-78.73479499999999\t35.162726\tWade town\tNC\tNorth Carolina\tCumberland County\t588\t42.9\t8.5\t12.2\t17953\t94167\t0.5938\t28395\tRomney\t28395\t0.001761877\t28395.0\n15384\t-78.77915300000001\t35.108259000000004\tEastover CDP\tNC\tNorth Carolina\tCumberland County\t1310\t45.3\t14.6\t8.0\t22503\t109075\t0.5938\t28395\tRomney\t28395\t0.003925269\t28395.0\n15385\t-75.71799200000001\t36.071737\tKitty Hawk town\tNC\tNorth Carolina\tDare County\t3048\t44.7\t28.7\t7.6\t25600\t214050\t0.4113\t27949\tRomney\t27949\t0.009132993\t27949.0\n15386\t-75.638734\t35.839943\tWanchese CDP\tNC\tNorth Carolina\tDare County\t1726\t41.3\t20.2\t7.5\t22681\t142563\t0.4113\t27981\tRomney\t27981\t0.005171767\t27981.0\n15387\t-75.6274\t35.948513\tNags Head town\tNC\tNorth Carolina\tDare County\t3129\t45.4\t38.3\t8.0\t33788\t219726\t0.4113\t27959\tRomney\t27959\t0.0093757\t27959.0\n15388\t-75.732446\t36.120344\tSouthern Shores town\tNC\tNorth Carolina\tDare County\t2332\t54.2\t55.9\t6.1\t45589\t364655\t0.4113\t27949\tRomney\t27949\t0.006987579\t27949.0\n15389\t-75.650235\t35.897969\tManteo town\tNC\tNorth Carolina\tDare County\t1243\t43.4\t26.0\t8.3\t25268\t193952\t0.4113\t27954\tRomney\t27954\t0.003724511\t27954.0\n15390\t-75.66968299999999\t36.016681\tKill Devil Hills town\tNC\tNorth Carolina\tDare County\t7000\t39.0\t30.6\t8.2\t27310\t158482\t0.4113\t27948\tRomney\t27948\t0.020974721\t27948.0\n15391\t-80.048149\t35.890209999999996\tThomasville city\tNC\tNorth Carolina\tDavidson County\t20528\t36.5\t12.0\t16.2\t19552\t126142\t0.2907\t27360\tRomney\t27360\t0.061509867999999995\t27360.0\n15392\t-80.109821\t35.634437\tDenton town\tNC\tNorth Carolina\tDavidson County\t1577\t41.2\t10.0\t17.3\t18200\t113500\t0.2907\t27239\tRomney\t27239\t0.004725305\t27239.0\n15393\t-80.254802\t35.906577\tWelcome CDP\tNC\tNorth Carolina\tDavidson County\t3678\t42.9\t21.2\t13.8\t23149\t156541\t0.2907\t27295\tRomney\t27295\t0.011020718\t27295.0\n15394\t-80.268477\t35.801190999999996\tLexington city\tNC\tNorth Carolina\tDavidson County\t19798\t37.4\t16.6\t20.4\t17762\t122097\t0.2907\t27292\tRomney\t27292\t0.059322505\t27292.0\n15395\t-80.555111\t35.897853000000005\tMocksville town\tNC\tNorth Carolina\tDavie County\t5028\t38.9\t22.1\t10.7\t23590\t113876\t0.2775\t27028\tRomney\t27028\t0.015065843\t27028.0\n15396\t-80.55613000000001\t35.81269\tCooleemee town\tNC\tNorth Carolina\tDavie County\t1130\t38.7\t10.3\t12.1\t17958\t67500\t0.2775\t27014\tRomney\t27014\t0.0033859190000000003\t27014.0\n15397\t-80.42563299999999\t36.000593\tBermuda Run town\tNC\tNorth Carolina\tDavie County\t1613\t60.1\t54.4\t11.9\t56269\t242857\t0.2775\t27012\tRomney\t27012\t0.004833175\t27012.0\n15398\t-77.77216999999999\t34.922823\tBeulaville town\tNC\tNorth Carolina\tDuplin County\t1164\t40.8\t19.4\t9.3\t18900\t110500\t0.4387\t28518\tRomney\t28518\t0.003487797\t28518.0\n15399\t-78.055126\t34.895061\tMagnolia town\tNC\tNorth Carolina\tDuplin County\t1139\t33.0\t10.1\t11.5\t12934\t111557\t0.4387\t28453\tRomney\t28453\t0.0034128870000000003\t28453.0\n15400\t-77.92492299999999\t34.827296999999994\tGreenevers town\tNC\tNorth Carolina\tDuplin County\t610\t36.8\t14.1\t15.2\t14547\t92222\t0.4387\t28466\tRomney\t28466\t0.0018277970000000001\t28466.0\n15401\t-77.993953\t34.737929\tWallace town\tNC\tNorth Carolina\tDuplin County\t3577\t39.9\t13.6\t9.6\t17292\t123271\t0.4387\t28466\tRomney\t28466\t0.010718083\t28466.0\n15402\t-78.087953\t34.999486\tWarsaw town\tNC\tNorth Carolina\tDuplin County\t3048\t36.6\t16.4\t12.0\t16188\t106043\t0.4387\t28398\tRomney\t28398\t0.009132993\t28398.0\n15403\t-77.963868\t34.960415000000005\tKenansville town\tNC\tNorth Carolina\tDuplin County\t1251\t46.8\t22.4\t10.5\t18705\t134677\t0.4387\t28349\tRomney\t28349\t0.003748482\t28349.0\n15404\t-78.027084\t34.825649\tRose Hill town\tNC\tNorth Carolina\tDuplin County\t1496\t39.8\t14.8\t9.8\t17873\t104119\t0.4387\t28458\tRomney\t28458\t0.004482598\t28458.0\n15405\t-78.104558\t35.154666999999996\tCalypso town\tNC\tNorth Carolina\tDuplin County\t450\t40.2\t13.7\t12.3\t17914\t100000\t0.4387\t28325\tRomney\t28325\t0.001348375\t28325.0\n15406\t-78.007849\t34.767864\tTeachey town\tNC\tNorth Carolina\tDuplin County\t295\t38.8\t11.8\t14.5\t15297\t104545\t0.4387\t28464\tRomney\t28464\t0.000883935\t28464.0\n15407\t-78.136276\t35.11655\tFaison town\tNC\tNorth Carolina\tDuplin County\t807\t41.5\t18.9\t11.0\t17780\t101923\t0.4387\t28341\tRomney\t28341\t0.002418086\t28341.0\n15408\t-78.863164\t36.035613\tDurham city\tNC\tNorth Carolina\tDurham County\t216918\t33.1\t44.0\t9.7\t27478\t159654\t0.758\t27704\tRomney\t27704\t0.649970655\t27704.0\n15409\t-78.809253\t36.041534000000006\tGorman CDP\tNC\tNorth Carolina\tDurham County\t1124\t39.8\t21.7\t7.6\t26831\t132102\t0.758\t27704\tRomney\t27704\t0.0033679409999999997\t27704.0\n15410\t-77.45707\t35.817503\tConetoe town\tNC\tNorth Carolina\tEdgecombe County\t334\t42.3\t3.9\t12.2\t17371\t72222\t0.6789\t27819\tRomney\t27819\t0.001000794\t27819.0\n15411\t-77.44422800000001\t35.968506\tSpeed town\tNC\tNorth Carolina\tEdgecombe County\t64\t38.8\t8.9\t14.3\t19225\t80000\t0.6789\t27843\tRomney\t27843\t0.00019176900000000003\t27843.0\n15412\t-77.637835\t35.791219\tPinetops town\tNC\tNorth Carolina\tEdgecombe County\t1177\t43.2\t10.8\t16.2\t17653\t81932\t0.6789\t27864\tRomney\t27864\t0.00352675\t27864.0\n15413\t-77.529534\t35.885945\tPrinceville town\tNC\tNorth Carolina\tEdgecombe County\t769\t39.6\t5.1\t16.8\t15534\t75294\t0.6789\t27886\tRomney\t27886\t0.0023042229999999998\t27886.0\n15414\t-77.555619\t35.908034\tTarboro town\tNC\tNorth Carolina\tEdgecombe County\t11098\t42.4\t20.1\t15.2\t21283\t89724\t0.6789\t27886\tRomney\t27886\t0.033253922000000005\t27886.0\n15415\t-77.670413\t35.752340999999994\tMacclesfield town\tNC\tNorth Carolina\tEdgecombe County\t430\t43.6\t11.9\t11.3\t20483\t77941\t0.6789\t27852\tRomney\t27852\t0.001288447\t27852.0\n15416\t-77.58009100000001\t35.989647\tLeggett town\tNC\tNorth Carolina\tEdgecombe County\t65\t40.6\t6.8\t16.1\t15416\t48333\t0.6789\t27886\tRomney\t27886\t0.000194765\t27886.0\n15417\t-80.386421\t36.027923\tClemmons village\tNC\tNorth Carolina\tForsyth County\t16890\t41.8\t43.1\t9.7\t33552\t185810\t0.5304\t27012\tRomney\t27012\t0.050609006\t27012.0\n15418\t-80.417968\t36.094072\tLewisville town\tNC\tNorth Carolina\tForsyth County\t9975\t41.6\t40.3\t8.7\t33389\t178995\t0.5304\t27023\tRomney\t27023\t0.029888977999999997\t27023.0\n15419\t-80.3375\t36.18083\tBethania town\tNC\tNorth Carolina\tForsyth County\t371\t45.3\t32.8\t8.5\t28479\t142857\t0.5304\t27040\tRomney\t27040\t0.00111166\t27040.0\n15420\t-80.03734200000001\t36.117226\tKernersville town\tNC\tNorth Carolina\tForsyth County\t20635\t38.8\t28.2\t9.3\t30235\t150927\t0.5304\t27235\tRomney\t27235\t0.061830482\t27235.0\n15421\t-80.166152\t36.158314000000004\tWalkertown town\tNC\tNorth Carolina\tForsyth County\t4408\t42.6\t17.0\t10.4\t24655\t113203\t0.5304\t27051\tRomney\t27051\t0.013208082\t27051.0\n15422\t-80.263918\t36.104742\tWinston-Salem city\tNC\tNorth Carolina\tForsyth County\t208222\t36.6\t32.4\t11.6\t26935\t122859\t0.5304\t27109\tRomney\t27109\t0.623914059\t27109.0\n15423\t-80.36049399999999\t36.262096\tTobaccoville village\tNC\tNorth Carolina\tForsyth County\t2457\t43.3\t25.0\t8.9\t26103\t131473\t0.5304\t27021\tRomney\t27021\t0.0073621269999999996\t27021.0\n15424\t-80.29661999999999\t36.224804\tRural Hall town\tNC\tNorth Carolina\tForsyth County\t2639\t41.6\t18.5\t10.7\t26886\t114009\t0.5304\t27045\tRomney\t27045\t0.00790747\t27045.0\n15425\t-78.451553\t36.103054\tFranklinton town\tNC\tNorth Carolina\tFranklin County\t1944\t41.2\t11.7\t14.6\t17109\t88936\t0.4733\t27525\tRomney\t27525\t0.00582498\t27525.0\n15426\t-78.25194599999999\t35.959094\tBunn town\tNC\tNorth Carolina\tFranklin County\t439\t34.9\t7.7\t13.1\t16595\t85000\t0.4733\t27508\tRomney\t27508\t0.001315415\t27508.0\n15427\t-78.47927\t36.028168\tYoungsville town\tNC\tNorth Carolina\tFranklin County\t891\t36.3\t21.8\t8.9\t24896\t146711\t0.4733\t27596\tRomney\t27596\t0.0026697820000000003\t27596.0\n15428\t-78.108862\t36.185347\tCenterville town\tNC\tNorth Carolina\tFranklin County\t106\t42.2\t14.5\t10.2\t18861\t95000\t0.4733\t27816\tRomney\t27816\t0.000317617\t27816.0\n15429\t-78.300979\t36.098478\tLouisburg town\tNC\tNorth Carolina\tFranklin County\t3411\t38.8\t22.6\t13.6\t20460\t108382\t0.4733\t27549\tRomney\t27549\t0.010220682\t27549.0\n15430\t-81.096914\t35.35756\tStanley town\tNC\tNorth Carolina\tGaston County\t3327\t38.1\t6.7\t13.8\t22039\t103439\t0.3666\t28164\tRomney\t28164\t0.009968985\t28164.0\n15431\t-81.101197\t35.26935\tLowell city\tNC\tNorth Carolina\tGaston County\t3136\t38.1\t7.9\t13.9\t22301\t85421\t0.3666\t28098\tRomney\t28098\t0.009396675\t28098.0\n15432\t-81.13254599999999\t35.289099\tRanlo town\tNC\tNorth Carolina\tGaston County\t2220\t43.4\t6.3\t14.1\t21599\t85179\t0.3666\t28054\tRomney\t28054\t0.006651983\t28054.0\n15433\t-81.017395\t35.298901\tMount Holly city\tNC\tNorth Carolina\tGaston County\t11471\t37.7\t16.5\t14.2\t24371\t103328\t0.3666\t28120\tRomney\t28120\t0.034371575\t28120.0\n15434\t-81.38115\t35.382611\tCherryville city\tNC\tNorth Carolina\tGaston County\t5669\t42.8\t14.4\t10.9\t21946\t98779\t0.3666\t28021\tRomney\t28021\t0.016986528\t28021.0\n15435\t-81.073314\t35.234167\tCramerton town\tNC\tNorth Carolina\tGaston County\t4068\t39.5\t24.1\t11.3\t25975\t100114\t0.3666\t28032\tRomney\t28032\t0.012189308999999999\t28032.0\n15436\t-81.200914\t35.398722\tHigh Shoals town\tNC\tNorth Carolina\tGaston County\t844\t36.4\t8.5\t14.3\t19670\t83000\t0.3666\t28077\tRomney\t28077\t0.002528952\t28077.0\n15437\t-81.186415\t35.250114\tGastonia city\tNC\tNorth Carolina\tGaston County\t70188\t38.0\t23.2\t14.4\t23780\t111025\t0.3666\t28052\tRomney\t28052\t0.210310534\t28052.0\n15438\t-81.040199\t35.236057\tBelmont city\tNC\tNorth Carolina\tGaston County\t9779\t38.7\t25.2\t12.5\t25573\t111734\t0.3666\t28012\tRomney\t28012\t0.029301686\t28012.0\n15439\t-81.109943\t35.307249\tSpencer Mountain town\tNC\tNorth Carolina\tGaston County\t67\t40.6\t8.3\t16.7\t22236\t77500\t0.3666\t28098\tRomney\t28098\t0.000200758\t28098.0\n15440\t-81.080376\t35.265397\tMcAdenville town\tNC\tNorth Carolina\tGaston County\t726\t42.6\t11.9\t16.4\t24095\t106618\t0.3666\t28101\tRomney\t28101\t0.002175378\t28101.0\n15441\t-81.28654499999999\t35.284451000000004\tBessemer City\tNC\tNorth Carolina\tGaston County\t5309\t36.9\t9.9\t15.9\t20109\t90000\t0.3666\t28016\tRomney\t28016\t0.015907828\t28016.0\n15442\t-81.177948\t35.315267\tDallas town\tNC\tNorth Carolina\tGaston County\t3915\t37.4\t12.7\t14.6\t21177\t85877\t0.3666\t28034\tRomney\t28034\t0.011730862\t28034.0\n15443\t-81.208334\t35.208677\tSouth Gastonia CDP\tNC\tNorth Carolina\tGaston County\t5583\t37.9\t9.0\t14.3\t20249\t87925\t0.3666\t28052\tRomney\t28052\t0.016728838\t28052.0\n15444\t-76.756715\t36.407309000000005\tGatesville town\tNC\tNorth Carolina\tGates County\t333\t41.0\t16.1\t8.4\t18407\t119318\t0.5163\t27938\tRomney\t27938\t0.000997797\t27938.0\n15445\t-83.806967\t35.323019\tRobbinsville town\tNC\tNorth Carolina\tGraham County\t739\t37.9\t9.3\t14.8\t13369\t40000\t0.2835\t28771\tRomney\t28771\t0.002214331\t28771.0\n15446\t-83.865946\t35.363678\tLake Santeetlah town\tNC\tNorth Carolina\tGraham County\t72\t46.5\t17.0\t13.8\t18304\t90000\t0.2835\t28771\tRomney\t28771\t0.00021574\t28771.0\n15447\t-78.688257\t36.120909999999995\tCreedmoor city\tNC\tNorth Carolina\tGranville County\t3255\t38.8\t17.6\t9.0\t25325\t158532\t0.5175\t27522\tRomney\t27522\t0.009753245\t27522.0\n15448\t-78.722346\t36.200189\tStem town\tNC\tNorth Carolina\tGranville County\t252\t38.6\t7.7\t9.2\t21273\t156250\t0.5175\t27581\tRomney\t27581\t0.00075509\t27581.0\n15449\t-78.589202\t36.312324\tOxford city\tNC\tNorth Carolina\tGranville County\t8674\t41.0\t21.0\t13.1\t19665\t148011\t0.5175\t27565\tRomney\t27565\t0.025990676\t27565.0\n15450\t-78.769001\t36.134654\tButner CDP\tNC\tNorth Carolina\tGranville County\t6464\t32.2\t10.8\t10.5\t19526\t134028\t0.5175\t27509\tRomney\t27509\t0.019368657\t27509.0\n15451\t-78.568973\t36.447515\tStovall town\tNC\tNorth Carolina\tGranville County\t392\t41.1\t11.7\t9.3\t18388\t119444\t0.5175\t27582\tRomney\t27582\t0.001174584\t27582.0\n15452\t-77.697857\t35.596263\tWalstonburg town\tNC\tNorth Carolina\tGreene County\t266\t31.7\t16.3\t20.3\t16189\t65000\t0.4587\t27888\tRomney\t27888\t0.0007970389999999999\t27888.0\n15453\t-77.58936\t35.423029\tHookerton town\tNC\tNorth Carolina\tGreene County\t488\t37.9\t9.2\t10.3\t14254\t78125\t0.4587\t28538\tRomney\t28538\t0.0014622379999999998\t28538.0\n15454\t-77.676071\t35.450899\tSnow Hill town\tNC\tNorth Carolina\tGreene County\t1831\t45.2\t20.8\t13.5\t18829\t88913\t0.4587\t28580\tRomney\t28580\t0.005486388000000001\t28580.0\n15455\t-79.57175699999999\t36.078115000000004\tWhitsett town\tNC\tNorth Carolina\tGuilford County\t904\t42.0\t17.4\t9.0\t27592\t118856\t0.5766\t27377\tRomney\t27377\t0.002708735\t27377.0\n15456\t-79.833906\t36.093266\tGreensboro city\tNC\tNorth Carolina\tGuilford County\t248122\t34.9\t36.1\t12.8\t28473\t125420\t0.5766\t27408\tRomney\t27408\t0.74346997\t27408.0\n15457\t-79.707965\t35.988834999999995\tForest Oaks CDP\tNC\tNorth Carolina\tGuilford County\t3910\t49.0\t39.8\t10.8\t32499\t182618\t0.5766\t27313\tRomney\t27313\t0.01171588\t27313.0\n15458\t-79.982922\t36.23167\tStokesdale town\tNC\tNorth Carolina\tGuilford County\t4785\t41.2\t27.0\t8.8\t26035\t138832\t0.5766\t27357\tRomney\t27357\t0.01433772\t27357.0\n15459\t-79.993571\t36.012817\tHigh Point city\tNC\tNorth Carolina\tGuilford County\t96408\t36.7\t27.4\t13.2\t26647\t125747\t0.5766\t27265\tRomney\t27265\t0.288875847\t27265.0\n15460\t-79.898379\t36.198085\tSummerfield town\tNC\tNorth Carolina\tGuilford County\t9380\t41.3\t38.7\t8.9\t36990\t205041\t0.5766\t27358\tRomney\t27358\t0.028106126000000002\t27358.0\n15461\t-79.53541\t36.103076\tGibsonville town\tNC\tNorth Carolina\tGuilford County\t5135\t39.8\t26.6\t11.7\t25981\t110432\t0.5766\t27249\tRomney\t27249\t0.015386456000000001\t27249.0\n15462\t-79.75968\t35.959583\tPleasant Garden town\tNC\tNorth Carolina\tGuilford County\t4973\t43.5\t22.7\t10.0\t25226\t134081\t0.5766\t27313\tRomney\t27313\t0.014901041\t27313.0\n15463\t-79.620737\t36.076042\tSedalia town\tNC\tNorth Carolina\tGuilford County\t683\t43.4\t31.0\t8.5\t30446\t153676\t0.5766\t27342\tRomney\t27342\t0.002046534\t27342.0\n15464\t-79.934073\t35.997162\tJamestown town\tNC\tNorth Carolina\tGuilford County\t3580\t41.0\t50.8\t10.3\t38164\t200710\t0.5766\t27282\tRomney\t27282\t0.010727071999999999\t27282.0\n15465\t-79.655762\t36.103989\tMcLeansville CDP\tNC\tNorth Carolina\tGuilford County\t1558\t43.1\t23.6\t10.2\t24123\t130612\t0.5766\t27301\tRomney\t27301\t0.004668374\t27301.0\n15466\t-79.988495\t36.172746000000004\tOak Ridge town\tNC\tNorth Carolina\tGuilford County\t5351\t42.6\t38.1\t9.2\t37202\t217000\t0.5766\t27310\tRomney\t27310\t0.016033676\t27310.0\n15467\t-77.42128199999999\t36.130533\tScotland Neck town\tNC\tNorth Carolina\tHalifax County\t2165\t40.9\t11.7\t18.1\t13872\t73511\t0.6586\t27874\tRomney\t27874\t0.006487181999999999\t27874.0\n15468\t-77.608136\t36.425709999999995\tWeldon town\tNC\tNorth Carolina\tHalifax County\t1289\t41.9\t18.9\t11.5\t15705\t81447\t0.6586\t27890\tRomney\t27890\t0.003862345\t27890.0\n15469\t-77.66781999999999\t36.180115\tEnfield town\tNC\tNorth Carolina\tHalifax County\t2018\t39.7\t11.6\t18.4\t12960\t75806\t0.6586\t27823\tRomney\t27823\t0.0060467130000000004\t27823.0\n15470\t-77.393996\t36.026727\tHobgood town\tNC\tNorth Carolina\tHalifax County\t369\t43.5\t3.9\t27.8\t12505\t66875\t0.6586\t27843\tRomney\t27843\t0.001105667\t27843.0\n15471\t-77.590192\t36.325518\tHalifax town\tNC\tNorth Carolina\tHalifax County\t330\t34.5\t7.4\t16.4\t15433\t69167\t0.6586\t27839\tRomney\t27839\t0.000988808\t27839.0\n15472\t-77.706078\t36.446294\tSouth Rosemary CDP\tNC\tNorth Carolina\tHalifax County\t2861\t40.8\t9.6\t14.8\t15669\t81133\t0.6586\t27870\tRomney\t27870\t0.008572668\t27870.0\n15473\t-77.620228\t36.405485\tSouth Weldon CDP\tNC\tNorth Carolina\tHalifax County\t1318\t40.1\t14.6\t16.0\t14003\t79565\t0.6586\t27890\tRomney\t27890\t0.00394924\t27890.0\n15474\t-77.651732\t36.453963\tRoanoke Rapids city\tNC\tNorth Carolina\tHalifax County\t16063\t39.5\t18.7\t13.4\t20140\t106792\t0.6586\t27870\tRomney\t27870\t0.048130993\t27870.0\n15475\t-77.91103299999999\t36.434226\tLittleton town\tNC\tNorth Carolina\tHalifax County\t665\t46.1\t20.8\t12.2\t21116\t85789\t0.6586\t27850\tRomney\t27850\t0.001992599\t27850.0\n15476\t-78.81039799999999\t35.403337\tLillington town\tNC\tNorth Carolina\tHarnett County\t3628\t37.1\t16.3\t12.0\t20802\t158634\t0.3992\t27546\tRomney\t27546\t0.010870898\t27546.0\n15477\t-78.668575\t35.407183\tCoats town\tNC\tNorth Carolina\tHarnett County\t2196\t37.7\t12.2\t10.4\t19156\t138483\t0.3992\t27521\tRomney\t27521\t0.00658007\t27521.0\n15478\t-78.736198\t35.412948\tBuies Creek CDP\tNC\tNorth Carolina\tHarnett County\t2639\t23.9\t42.4\t13.0\t19868\t178629\t0.3992\t27506\tRomney\t27506\t0.00790747\t27506.0\n15479\t-78.673348\t35.321759\tErwin town\tNC\tNorth Carolina\tHarnett County\t4631\t42.6\t11.4\t16.0\t18355\t113990\t0.3992\t28339\tRomney\t28339\t0.013876276000000002\t28339.0\n15480\t-78.738499\t35.507542\tAngier town\tNC\tNorth Carolina\tHarnett County\t4017\t36.7\t17.4\t11.6\t20667\t160000\t0.3992\t27501\tRomney\t27501\t0.012036493999999998\t27501.0\n15481\t-78.61446600000001\t35.311489\tDunn city\tNC\tNorth Carolina\tHarnett County\t9634\t41.4\t18.1\t15.8\t19591\t133397\t0.3992\t28334\tRomney\t28334\t0.028867208999999998\t28334.0\n15482\t-82.867125\t35.538578\tWest Canton CDP\tNC\tNorth Carolina\tHaywood County\t1200\t45.1\t5.8\t6.9\t18838\t100772\t0.423\t28716\tRomney\t28716\t0.0035956670000000003\t28716.0\n15483\t-82.911028\t35.533473\tClyde town\tNC\tNorth Carolina\tHaywood County\t1482\t42.0\t22.0\t8.5\t23254\t131944\t0.423\t28745\tRomney\t28745\t0.004440648\t28745.0\n15484\t-82.83837199999999\t35.535807\tCanton town\tNC\tNorth Carolina\tHaywood County\t4101\t44.3\t12.2\t9.5\t21716\t104032\t0.423\t28716\tRomney\t28716\t0.01228819\t28716.0\n15485\t-83.10117\t35.519702\tMaggie Valley town\tNC\tNorth Carolina\tHaywood County\t809\t54.9\t20.1\t8.6\t24295\t162234\t0.423\t28751\tRomney\t28751\t0.002424079\t28751.0\n15486\t-82.975541\t35.529957\tLake Junaluska CDP\tNC\tNorth Carolina\tHaywood County\t2820\t51.8\t38.9\t9.0\t29131\t189368\t0.423\t287HH\tRomney\t287HH\t0.008449816\t0.0\n15487\t-82.99992900000001\t35.483340999999996\tWaynesville town\tNC\tNorth Carolina\tHaywood County\t9219\t46.7\t19.9\t11.3\t20937\t114976\t0.423\t28786\tRomney\t28786\t0.027623707999999997\t28786.0\n15488\t-82.417997\t35.285605\tEast Flat Rock CDP\tNC\tNorth Carolina\tHenderson County\t4151\t37.2\t10.9\t17.0\t16619\t85185\t0.3558\t28726\tRomney\t28726\t0.01243801\t28726.0\n15489\t-82.595442\t35.316832\tEtowah CDP\tNC\tNorth Carolina\tHenderson County\t2898\t53.8\t22.6\t10.5\t26009\t142516\t0.3558\t28729\tRomney\t28729\t0.008683535\t28729.0\n15490\t-82.49117199999999\t35.295978999999996\tValley Hill CDP\tNC\tNorth Carolina\tHenderson County\t2347\t49.7\t27.5\t10.9\t25300\t161824\t0.3558\t28739\tRomney\t28739\t0.007032524\t28739.0\n15491\t-82.460657\t35.321057\tHendersonville city\tNC\tNorth Carolina\tHenderson County\t11990\t46.4\t32.6\t11.8\t23381\t142779\t0.3558\t28791\tRomney\t28791\t0.035926701\t28791.0\n15492\t-82.502903\t35.311614\tLaurel Park town\tNC\tNorth Carolina\tHenderson County\t2305\t57.7\t50.1\t11.9\t38415\t251515\t0.3558\t28739\tRomney\t28739\t0.006906676\t28739.0\n15493\t-82.480624\t35.349813\tBalfour CDP\tNC\tNorth Carolina\tHenderson County\t1295\t43.4\t15.5\t10.0\t22526\t125556\t0.3558\t28791\tRomney\t28791\t0.0038803229999999998\t28791.0\n15494\t-82.504675\t35.433277000000004\tFletcher town\tNC\tNorth Carolina\tHenderson County\t5613\t37.6\t32.3\t7.9\t27832\t177463\t0.3558\t28732\tRomney\t28732\t0.01681873\t28732.0\n15495\t-82.45275600000001\t35.267327\tFlat Rock village\tNC\tNorth Carolina\tHenderson County\t3080\t58.8\t53.9\t9.9\t42416\t321163\t0.3558\t28726\tRomney\t28726\t0.009228877\t28726.0\n15496\t-82.50617199999999\t35.374095000000004\tMountain Home CDP\tNC\tNorth Carolina\tHenderson County\t2574\t47.4\t30.0\t8.3\t30152\t178125\t0.3558\t28758\tRomney\t28758\t0.007712705\t28758.0\n15497\t-82.44077800000001\t35.310192\tBarker Heights CDP\tNC\tNorth Carolina\tHenderson County\t1230\t37.3\t13.0\t11.3\t16540\t84405\t0.3558\t28726\tRomney\t28726\t0.003685558\t28726.0\n15498\t-76.79208100000001\t36.301451\tHarrellsville town\tNC\tNorth Carolina\tHertford County\t98\t46.4\t6.8\t20.4\t15319\t71250\t0.7184\t27942\tRomney\t27942\t0.000293646\t27942.0\n15499\t-77.006887\t36.501362\tComo town\tNC\tNorth Carolina\tHertford County\t74\t46.1\t7.7\t7.7\t16391\t67500\t0.7184\t27818\tRomney\t27818\t0.000221733\t27818.0\n15500\t-76.984751\t36.286854\tAhoskie town\tNC\tNorth Carolina\tHertford County\t4323\t41.8\t15.7\t14.6\t18429\t107184\t0.7184\t27910\tRomney\t27910\t0.012953389\t27910.0\n15501\t-76.909982\t36.356431\tCofield village\tNC\tNorth Carolina\tHertford County\t296\t41.0\t10.0\t19.3\t14055\t65714\t0.7184\t27922\tRomney\t27922\t0.0008869310000000001\t27922.0\n15502\t-77.098644\t36.440587\tMurfreesboro town\tNC\tNorth Carolina\tHertford County\t2353\t39.4\t23.0\t8.9\t20737\t93676\t0.7184\t27855\tRomney\t27855\t0.0070505030000000005\t27855.0\n15503\t-76.935529\t36.389551000000004\tWinton town\tNC\tNorth Carolina\tHertford County\t2110\t34.0\t12.5\t13.4\t13852\t72609\t0.7184\t27986\tRomney\t27986\t0.00632238\t27986.0\n15504\t-79.346317\t35.016518\tFive Points CDP\tNC\tNorth Carolina\tHoke County\t343\t36.3\t6.9\t6.3\t17175\t123958\t0.5896\t28396\tRomney\t28396\t0.001027761\t28396.0\n15505\t-79.372639\t35.088965\tAshley Heights CDP\tNC\tNorth Carolina\tHoke County\t373\t35.9\t6.7\t6.1\t17539\t131250\t0.5896\t28315\tRomney\t28315\t0.0011176530000000001\t28315.0\n15506\t-79.156176\t34.923652000000004\tDundarrach CDP\tNC\tNorth Carolina\tHoke County\t62\t36.5\t17.1\t10.0\t17359\t100000\t0.5896\t28357\tRomney\t28357\t0.000185776\t28357.0\n15507\t-79.069499\t34.990291\tRockfish CDP\tNC\tNorth Carolina\tHoke County\t3508\t30.9\t17.4\t7.6\t22384\t132459\t0.5896\t28357\tRomney\t28357\t0.010511332\t28357.0\n15508\t-79.228227\t34.980919\tRaeford city\tNC\tNorth Carolina\tHoke County\t3866\t43.4\t23.6\t8.9\t20072\t106043\t0.5896\t28376\tRomney\t28376\t0.011584038999999999\t28376.0\n15509\t-79.22922700000001\t34.99716\tSilver City CDP\tNC\tNorth Carolina\tHoke County\t1000\t41.7\t8.6\t12.0\t16043\t75625\t0.5896\t28376\tRomney\t28376\t0.0029963890000000003\t28376.0\n15510\t-79.300024\t34.935936\tBowmore CDP\tNC\tNorth Carolina\tHoke County\t174\t29.1\t9.9\t10.1\t14187\t72857\t0.5896\t28376\tRomney\t28376\t0.000521372\t28376.0\n15511\t-75.914889\t35.128122999999995\tOcracoke CDP\tNC\tNorth Carolina\tHyde County\t632\t51.4\t30.7\t3.4\t23287\t271377\t0.488\t27960\tRomney\t27960\t0.001893718\t27960.0\n15512\t-80.986553\t35.989064\tLove Valley town\tNC\tNorth Carolina\tIredell County\t35\t40.0\t4.0\t11.8\t18652\t129167\t0.3415\t28689\tRomney\t28689\t0.000104874\t28689.0\n15513\t-80.773453\t35.959133\tHarmony town\tNC\tNorth Carolina\tIredell County\t603\t38.8\t8.6\t16.3\t18076\t128571\t0.3415\t28634\tRomney\t28634\t0.001806822\t28634.0\n15514\t-80.894711\t35.704639\tTroutman town\tNC\tNorth Carolina\tIredell County\t1928\t41.7\t15.0\t13.8\t23482\t151389\t0.3415\t28166\tRomney\t28166\t0.005777038000000001\t28166.0\n15515\t-80.828804\t35.583768\tMooresville town\tNC\tNorth Carolina\tIredell County\t29577\t35.9\t22.4\t11.8\t25807\t207638\t0.3415\t28115\tRomney\t28115\t0.08862419\t28115.0\n15516\t-80.873305\t35.79197\tStatesville city\tNC\tNorth Carolina\tIredell County\t26338\t38.7\t21.4\t16.0\t22756\t158557\t0.3415\t28677\tRomney\t28677\t0.07891888700000001\t28677.0\n15517\t-83.097372\t35.111564\tCashiers CDP\tNC\tNorth Carolina\tJackson County\t209\t56.6\t43.1\t8.1\t37071\t366667\t0.4847\t28717\tRomney\t28717\t0.000626245\t28717.0\n15518\t-83.215651\t35.351690999999995\tWebster town\tNC\tNorth Carolina\tJackson County\t524\t42.2\t37.6\t10.5\t22465\t154167\t0.4847\t28779\tRomney\t28779\t0.001570108\t28779.0\n15519\t-83.252215\t35.369124\tDillsboro town\tNC\tNorth Carolina\tJackson County\t233\t42.8\t32.9\t11.1\t22543\t146591\t0.4847\t28725\tRomney\t28725\t0.000698159\t28725.0\n15520\t-83.18119399999999\t35.311331\tCullowhee CDP\tNC\tNorth Carolina\tJackson County\t4121\t21.5\t56.1\t10.5\t17840\t183446\t0.4847\t28723\tRomney\t28723\t0.012348118\t28723.0\n15521\t-83.196487\t35.295353000000006\tForest Hills village\tNC\tNorth Carolina\tJackson County\t391\t39.0\t50.0\t11.1\t24069\t182500\t0.4847\t28723\tRomney\t28723\t0.001171588\t28723.0\n15522\t-83.218335\t35.375671000000004\tSylva town\tNC\tNorth Carolina\tJackson County\t2608\t42.9\t32.9\t8.9\t20667\t145330\t0.4847\t28779\tRomney\t28779\t0.007814581999999999\t28779.0\n15523\t-78.374238\t35.544619\tWest Smithfield CDP\tNC\tNorth Carolina\tJohnston County\t65\t38.0\t14.6\t7.1\t18516\t137500\t0.3558\t27577\tRomney\t27577\t0.000194765\t27577.0\n15524\t-78.203739\t35.562544\tMicro town\tNC\tNorth Carolina\tJohnston County\t604\t40.1\t10.4\t11.7\t19491\t74000\t0.3558\t27555\tRomney\t27555\t0.0018098189999999998\t27555.0\n15525\t-78.348175\t35.514308\tSmithfield town\tNC\tNorth Carolina\tJohnston County\t11534\t41.6\t22.1\t14.1\t21621\t120547\t0.3558\t27577\tRomney\t27577\t0.034560348\t27577.0\n15526\t-78.123402\t35.604246\tKenly town\tNC\tNorth Carolina\tJohnston County\t2008\t40.5\t12.4\t12.6\t17801\t87500\t0.3558\t27542\tRomney\t27542\t0.006016749\t27542.0\n15527\t-78.426704\t35.447426\tFour Oaks town\tNC\tNorth Carolina\tJohnston County\t2054\t37.5\t17.4\t11.8\t18568\t89000\t0.3558\t27524\tRomney\t27524\t0.006154582\t27524.0\n15528\t-78.458999\t35.647721999999995\tClayton town\tNC\tNorth Carolina\tJohnston County\t11017\t34.4\t25.3\t11.0\t25869\t146466\t0.3558\t27520\tRomney\t27520\t0.033011215\t27520.0\n15529\t-78.160206\t35.465612\tPrinceton town\tNC\tNorth Carolina\tJohnston County\t1384\t42.3\t12.6\t14.8\t15788\t80833\t0.3558\t27569\tRomney\t27569\t0.004147002\t27569.0\n15530\t-78.245653\t35.509725\tPine Level town\tNC\tNorth Carolina\tJohnston County\t1615\t39.0\t9.6\t12.3\t20627\t93804\t0.3558\t27568\tRomney\t27568\t0.004839168\t27568.0\n15531\t-78.356038\t35.58359\tWilson's Mills town\tNC\tNorth Carolina\tJohnston County\t1623\t35.7\t25.6\t9.5\t25090\t128000\t0.3558\t27577\tRomney\t27577\t0.004863139\t27577.0\n15532\t-78.54595400000001\t35.381318\tBenson town\tNC\tNorth Carolina\tJohnston County\t3418\t39.3\t15.6\t13.8\t17691\t101185\t0.3558\t27504\tRomney\t27504\t0.010241657\t27504.0\n15533\t-78.288887\t35.537312\tSelma town\tNC\tNorth Carolina\tJohnston County\t6326\t35.0\t10.8\t14.9\t15665\t72195\t0.3558\t27576\tRomney\t27576\t0.018955155\t27576.0\n15534\t-77.35516899999999\t35.063509\tTrenton town\tNC\tNorth Carolina\tJones County\t203\t38.8\t15.6\t12.8\t17433\t90833\t0.4497\t28585\tRomney\t28585\t0.000608267\t28585.0\n15535\t-77.22019300000001\t35.006969\tPollocksville town\tNC\tNorth Carolina\tJones County\t282\t49.5\t18.6\t9.2\t23000\t121094\t0.4497\t28573\tRomney\t28573\t0.000844982\t28573.0\n15536\t-77.230407\t34.904825\tMaysville town\tNC\tNorth Carolina\tJones County\t939\t41.3\t8.1\t11.8\t14735\t75625\t0.4497\t28555\tRomney\t28555\t0.0028136090000000003\t28555.0\n15537\t-79.04488\t35.457829\tBroadway town\tNC\tNorth Carolina\tLee County\t1135\t42.4\t18.8\t12.5\t23136\t164509\t0.4456\t27505\tRomney\t27505\t0.0034009009999999996\t27505.0\n15538\t-79.176629\t35.476372\tSanford city\tNC\tNorth Carolina\tLee County\t28289\t36.5\t22.1\t13.9\t21214\t146569\t0.4456\t27330\tRomney\t27330\t0.084764841\t27330.0\n15539\t-77.743794\t35.056247\tPink Hill town\tNC\tNorth Carolina\tLenoir County\t600\t38.4\t13.6\t13.9\t16025\t97500\t0.4966\t28572\tRomney\t28572\t0.001797833\t28572.0\n15540\t-77.590052\t35.27499\tKinston city\tNC\tNorth Carolina\tLenoir County\t21462\t43.8\t20.6\t17.0\t20134\t111933\t0.4966\t28501\tRomney\t28501\t0.064308495\t28501.0\n15541\t-77.789487\t35.305958000000004\tLa Grange town\tNC\tNorth Carolina\tLenoir County\t2766\t39.5\t11.2\t11.7\t18908\t98391\t0.4966\t28551\tRomney\t28551\t0.008288011\t28551.0\n15542\t-81.00020400000001\t35.419585999999995\tLowesville CDP\tNC\tNorth Carolina\tLincoln County\t2544\t37.8\t20.9\t12.5\t24938\t171429\t0.2998\t28037\tRomney\t28037\t0.007622813000000001\t28037.0\n15543\t-80.977564\t35.509992\tWestport CDP\tNC\tNorth Carolina\tLincoln County\t3595\t46.5\t41.3\t12.0\t38840\t365175\t0.2998\t28037\tRomney\t28037\t0.010772018000000001\t28037.0\n15544\t-81.238051\t35.472626\tLincolnton city\tNC\tNorth Carolina\tLincoln County\t10551\t40.7\t19.4\t17.2\t19732\t139779\t0.2998\t28092\tRomney\t28092\t0.031614897999999995\t28092.0\n15545\t-81.199023\t35.478613\tBoger City CDP\tNC\tNorth Carolina\tLincoln County\t628\t44.6\t27.7\t13.7\t24403\t197794\t0.2998\t28092\tRomney\t28092\t0.0018817320000000001\t28092.0\n15546\t-82.021051\t35.653158000000005\tWest Marion CDP\tNC\tNorth Carolina\tMcDowell County\t1509\t41.2\t11.1\t12.7\t20535\t97857\t0.3332\t28752\tRomney\t28752\t0.0045215509999999995\t28752.0\n15547\t-82.178212\t35.630281\tOld Fort town\tNC\tNorth Carolina\tMcDowell County\t993\t42.5\t7.6\t18.0\t20167\t86522\t0.3332\t28762\tRomney\t28762\t0.0029754140000000004\t28762.0\n15548\t-82.008504\t35.683119\tMarion city\tNC\tNorth Carolina\tMcDowell County\t5161\t41.6\t15.9\t16.7\t17548\t95043\t0.3332\t28752\tRomney\t28752\t0.015464361999999999\t28752.0\n15549\t-83.161651\t35.061495\tHighlands town\tNC\tNorth Carolina\tMacon County\t1169\t53.9\t43.3\t6.4\t31179\t378000\t0.3388\t28741\tRomney\t28741\t0.003502778\t28741.0\n15550\t-83.381724\t35.180656\tFranklin town\tNC\tNorth Carolina\tMacon County\t3721\t44.4\t17.2\t11.4\t20715\t141250\t0.3388\t28734\tRomney\t28734\t0.011149563000000001\t28734.0\n15551\t-82.829329\t35.89217\tHot Springs town\tNC\tNorth Carolina\tMadison County\t602\t43.7\t9.2\t14.2\t15948\t76429\t0.4434\t28743\tRomney\t28743\t0.0018038260000000001\t28743.0\n15552\t-82.549665\t35.827631\tMars Hill town\tNC\tNorth Carolina\tMadison County\t1864\t34.6\t35.4\t9.4\t21485\t154337\t0.4434\t28754\tRomney\t28754\t0.005585269\t28754.0\n15553\t-82.683848\t35.796739\tMarshall town\tNC\tNorth Carolina\tMadison County\t913\t45.2\t19.1\t13.3\t18708\t91250\t0.4434\t28753\tRomney\t28753\t0.002735703\t28753.0\n15554\t-77.276377\t35.908387\tHassell town\tNC\tNorth Carolina\tMartin County\t65\t43.1\t12.5\t9.1\t13557\t97000\t0.5203\t27841\tRomney\t27841\t0.000194765\t27841.0\n15555\t-77.206727\t35.944407\tHamilton town\tNC\tNorth Carolina\tMartin County\t431\t45.6\t10.0\t14.6\t17869\t77143\t0.5203\t27840\tRomney\t27840\t0.0012914439999999999\t27840.0\n15556\t-77.31426\t35.818737\tParmele town\tNC\tNorth Carolina\tMartin County\t249\t41.3\t15.0\t13.4\t14413\t73000\t0.5203\t27871\tRomney\t27871\t0.0007461010000000001\t27871.0\n15557\t-77.129005\t35.766054\tBeargrass town\tNC\tNorth Carolina\tMartin County\t66\t41.3\t20.0\t11.4\t18452\t101563\t0.5203\t27892\tRomney\t27892\t0.000197762\t27892.0\n15558\t-77.252941\t35.824356\tRobersonville town\tNC\tNorth Carolina\tMartin County\t1512\t42.0\t13.3\t9.6\t15974\t82000\t0.5203\t27871\tRomney\t27871\t0.00453054\t27871.0\n15559\t-77.303895\t35.961524\tOak City town\tNC\tNorth Carolina\tMartin County\t344\t47.3\t16.0\t9.9\t17083\t91071\t0.5203\t27857\tRomney\t27857\t0.001030758\t27857.0\n15560\t-76.90039300000001\t35.811921000000005\tJamesville town\tNC\tNorth Carolina\tMartin County\t477\t41.7\t10.9\t12.6\t16457\t87273\t0.5203\t27846\tRomney\t27846\t0.001429277\t27846.0\n15561\t-77.17195699999999\t35.834696\tEveretts town\tNC\tNorth Carolina\tMartin County\t169\t38.3\t7.0\t10.3\t20253\t65000\t0.5203\t27871\tRomney\t27871\t0.00050639\t27871.0\n15562\t-77.06519\t35.849599\tWilliamston town\tNC\tNorth Carolina\tMartin County\t5542\t41.6\t17.8\t10.0\t17621\t92353\t0.5203\t27892\tRomney\t27892\t0.016605986\t27892.0\n15563\t-80.885352\t35.478584000000005\tCornelius town\tNC\tNorth Carolina\tMecklenburg County\t17373\t39.0\t53.5\t9.2\t52299\t256719\t0.6065\t28031\tRomney\t28031\t0.052056262\t28031.0\n15564\t-80.870018\t35.406441\tHuntersville town\tNC\tNorth Carolina\tMecklenburg County\t40796\t35.0\t46.7\t9.5\t37845\t217593\t0.6065\t28078\tRomney\t28078\t0.12224067599999999\t28078.0\n15565\t-80.658788\t35.177288\tMint Hill town\tNC\tNorth Carolina\tMecklenburg County\t19235\t42.2\t30.1\t10.8\t33678\t172428\t0.6065\t28227\tRomney\t28227\t0.057635538\t28227.0\n15566\t-80.830159\t35.51254\tDavidson town\tNC\tNorth Carolina\tMecklenburg County\t9508\t33.2\t60.6\t10.3\t39699\t318635\t0.6065\t28036\tRomney\t28036\t0.028489663999999998\t28036.0\n15567\t-80.83130799999999\t35.199575\tCharlotte city\tNC\tNorth Carolina\tMecklenburg County\t646743\t34.4\t38.7\t13.4\t33132\t161671\t0.6065\t28207\tRomney\t28207\t1.9378934509999999\t28207.0\n15568\t-80.884426\t35.087537\tPineville town\tNC\tNorth Carolina\tMecklenburg County\t4007\t35.3\t39.3\t10.2\t32682\t142065\t0.6065\t28134\tRomney\t28134\t0.01200653\t28134.0\n15569\t-80.711986\t35.122025\tMatthews town\tNC\tNorth Carolina\tMecklenburg County\t26887\t37.7\t45.3\t11.5\t35569\t211869\t0.6065\t28105\tRomney\t28105\t0.080563904\t28105.0\n15570\t-82.070619\t35.914802\tSpruce Pine town\tNC\tNorth Carolina\tMitchell County\t1854\t43.5\t16.5\t10.7\t17950\t97583\t0.2367\t28777\tRomney\t28777\t0.005555305\t28777.0\n15571\t-82.158399\t36.015251\tBakersville town\tNC\tNorth Carolina\tMitchell County\t408\t45.1\t10.7\t11.9\t18722\t100000\t0.2367\t28705\tRomney\t28705\t0.001222527\t28705.0\n15572\t-79.74319399999999\t35.291818\tCandor town\tNC\tNorth Carolina\tMontgomery County\t841\t32.4\t13.0\t21.2\t13559\t85294\t0.419\t27229\tRomney\t27229\t0.002519963\t27229.0\n15573\t-80.00269300000001\t35.214784\tMount Gilead town\tNC\tNorth Carolina\tMontgomery County\t1357\t42.4\t12.2\t16.2\t15509\t92879\t0.419\t27306\tRomney\t27306\t0.0040661000000000004\t27306.0\n15574\t-79.783749\t35.399322999999995\tStar town\tNC\tNorth Carolina\tMontgomery County\t756\t37.1\t10.7\t12.3\t17586\t88000\t0.419\t27356\tRomney\t27356\t0.00226527\t27356.0\n15575\t-79.778959\t35.359722\tBiscoe town\tNC\tNorth Carolina\tMontgomery County\t1623\t35.3\t15.9\t15.9\t17473\t94286\t0.419\t27209\tRomney\t27209\t0.004863139\t27209.0\n15576\t-79.893845\t35.363603000000005\tTroy town\tNC\tNorth Carolina\tMontgomery County\t3385\t35.8\t13.5\t13.4\t18004\t103996\t0.419\t27371\tRomney\t27371\t0.010142776\t27371.0\n15577\t-79.450365\t35.141892\tAberdeen town\tNC\tNorth Carolina\tMoore County\t4920\t42.4\t29.2\t11.3\t26232\t159641\t0.3556\t28315\tRomney\t28315\t0.014742233\t28315.0\n15578\t-79.471584\t35.108353\tPinebluff town\tNC\tNorth Carolina\tMoore County\t1096\t37.1\t20.7\t10.3\t18830\t130804\t0.3556\t28373\tRomney\t28373\t0.003284042\t28373.0\n15579\t-79.459783\t35.190571999999996\tPinehurst village\tNC\tNorth Carolina\tMoore County\t11851\t59.4\t53.1\t10.1\t41296\t270786\t0.3556\t28374\tRomney\t28374\t0.035510203\t28374.0\n15580\t-79.569905\t35.172304\tFoxfire village\tNC\tNorth Carolina\tMoore County\t565\t55.8\t45.1\t6.5\t31039\t241860\t0.3556\t27281\tRomney\t27281\t0.00169296\t27281.0\n15581\t-79.405212\t35.188148\tSouthern Pines town\tNC\tNorth Carolina\tMoore County\t12044\t47.7\t41.0\t12.0\t29665\t205353\t0.3556\t28387\tRomney\t28387\t0.036088506\t28387.0\n15582\t-79.585923\t35.265260999999995\tSeven Lakes CDP\tNC\tNorth Carolina\tMoore County\t3652\t59.5\t44.4\t9.9\t35705\t257845\t0.3556\t27376\tRomney\t27376\t0.010942812\t27376.0\n15583\t-79.251809\t35.325998999999996\tCameron town\tNC\tNorth Carolina\tMoore County\t152\t38.8\t15.7\t12.2\t19813\t117857\t0.3556\t28350\tRomney\t28350\t0.000455451\t28350.0\n15584\t-79.281763\t35.255998999999996\tVass town\tNC\tNorth Carolina\tMoore County\t881\t39.7\t15.4\t11.8\t19503\t125000\t0.3556\t28350\tRomney\t28350\t0.002639818\t28350.0\n15585\t-79.586113\t35.432006\tRobbins city\tNC\tNorth Carolina\tMoore County\t1392\t33.2\t11.9\t11.2\t13894\t81667\t0.3556\t27325\tRomney\t27325\t0.004170973\t27325.0\n15586\t-79.37435699999999\t35.254201\tWhispering Pines village\tNC\tNorth Carolina\tMoore County\t2680\t53.0\t45.6\t11.6\t33352\t257237\t0.3556\t28350\tRomney\t28350\t0.008030322\t28350.0\n15587\t-79.49096\t35.21505\tTaylortown town\tNC\tNorth Carolina\tMoore County\t981\t46.4\t24.2\t9.6\t24259\t129741\t0.3556\t28374\tRomney\t28374\t0.002939457\t28374.0\n15588\t-79.417074\t35.344859\tCarthage town\tNC\tNorth Carolina\tMoore County\t2137\t42.9\t18.1\t8.9\t18984\t129000\t0.3556\t28327\tRomney\t28327\t0.006403283\t28327.0\n15589\t-77.857382\t36.010965\tDortches town\tNC\tNorth Carolina\tNash County\t830\t44.3\t21.4\t11.4\t23644\t104237\t0.5014\t27804\tRomney\t27804\t0.002487003\t27804.0\n15590\t-78.051036\t35.959171999999995\tMomeyer town\tNC\tNorth Carolina\tNash County\t333\t40.6\t9.8\t14.0\t17216\t77000\t0.5014\t27882\tRomney\t27882\t0.000997797\t27882.0\n15591\t-77.773004\t35.971121000000004\tRocky Mount city\tNC\tNorth Carolina\tNash County\t56067\t37.4\t24.0\t16.1\t21469\t101682\t0.5014\t27801\tRomney\t27801\t0.167998528\t27801.0\n15592\t-77.906378\t36.041364\tRed Oak town\tNC\tNorth Carolina\tNash County\t3028\t42.3\t21.8\t10.1\t24957\t126607\t0.5014\t27856\tRomney\t27856\t0.009073065\t27856.0\n15593\t-78.05753399999999\t36.082236\tCastalia town\tNC\tNorth Carolina\tNash County\t382\t40.3\t6.1\t13.5\t18057\t46000\t0.5014\t27816\tRomney\t27816\t0.001144621\t27816.0\n15594\t-78.11279\t35.78069\tBailey town\tNC\tNorth Carolina\tNash County\t758\t38.4\t13.6\t9.4\t21803\t85476\t0.5014\t27807\tRomney\t27807\t0.002271263\t27807.0\n15595\t-78.109578\t35.945066\tSpring Hope town\tNC\tNorth Carolina\tNash County\t1366\t42.7\t17.4\t15.6\t19216\t83977\t0.5014\t27882\tRomney\t27882\t0.004093067\t27882.0\n15596\t-77.70922900000001\t36.106911\tWhitakers town\tNC\tNorth Carolina\tNash County\t737\t40.6\t7.5\t17.1\t15318\t68400\t0.5014\t27891\tRomney\t27891\t0.002208339\t27891.0\n15597\t-77.956034\t35.968725\tNashville town\tNC\tNorth Carolina\tNash County\t5201\t40.6\t20.9\t11.5\t26137\t110277\t0.5014\t27856\tRomney\t27856\t0.015584218\t27856.0\n15598\t-78.203456\t35.789782\tMiddlesex town\tNC\tNorth Carolina\tNash County\t952\t35.9\t8.2\t19.0\t17453\t77419\t0.5014\t27557\tRomney\t27557\t0.0028525620000000003\t27557.0\n15599\t-77.824724\t35.868053\tSharpsburg town\tNC\tNorth Carolina\tNash County\t2444\t35.1\t10.8\t13.9\t17448\t87500\t0.5014\t27878\tRomney\t27878\t0.007323174\t27878.0\n15600\t-77.78966199999999\t34.216741\tWrightsville Beach town\tNC\tNorth Carolina\tNew Hanover County\t2818\t41.8\t64.6\t7.4\t43801\t670267\t0.4696\t28480\tRomney\t28480\t0.008443824\t28480.0\n15601\t-77.867942\t34.172422\tMasonboro CDP\tNC\tNorth Carolina\tNew Hanover County\t13640\t43.8\t48.7\t9.4\t31895\t221071\t0.4696\t28409\tRomney\t28409\t0.040870743\t28409.0\n15602\t-77.793886\t34.287468\tBayshore CDP\tNC\tNorth Carolina\tNew Hanover County\t3868\t44.8\t40.4\t9.1\t31996\t256416\t0.4696\t28411\tRomney\t28411\t0.011590032\t28411.0\n15603\t-77.796891\t34.317087\tKirkland CDP\tNC\tNorth Carolina\tNew Hanover County\t1658\t51.2\t43.0\t9.6\t38142\t233607\t0.4696\t28411\tRomney\t28411\t0.004968013\t28411.0\n15604\t-77.865866\t34.266675\tKings Grant CDP\tNC\tNorth Carolina\tNew Hanover County\t8493\t37.8\t25.8\t9.8\t26280\t153507\t0.4696\t28405\tRomney\t28405\t0.02544833\t28405.0\n15605\t-77.843036\t34.201045\tSeagate CDP\tNC\tNorth Carolina\tNew Hanover County\t5161\t42.1\t45.1\t9.1\t33131\t195290\t0.4696\t28409\tRomney\t28409\t0.015464361999999999\t28409.0\n15606\t-77.908573\t33.997413\tKure Beach town\tNC\tNorth Carolina\tNew Hanover County\t1949\t54.0\t32.1\t11.5\t28475\t233226\t0.4696\t28449\tRomney\t28449\t0.005839962\t28449.0\n15607\t-77.915336\t34.146394\tSilver Lake CDP\tNC\tNorth Carolina\tNew Hanover County\t9049\t33.6\t31.8\t11.4\t25713\t141346\t0.4696\t28412\tRomney\t28412\t0.027114322000000003\t28412.0\n15608\t-77.895961\t34.042212\tCarolina Beach town\tNC\tNorth Carolina\tNew Hanover County\t5724\t48.3\t28.0\t9.4\t30034\t214459\t0.4696\t28428\tRomney\t28428\t0.017151329\t28428.0\n15609\t-77.904708\t34.356519\tCastle Hayne CDP\tNC\tNorth Carolina\tNew Hanover County\t1174\t39.7\t16.3\t9.8\t23870\t160081\t0.4696\t28429\tRomney\t28429\t0.00351776\t28429.0\n15610\t-77.884073\t34.123565\tMyrtle Grove CDP\tNC\tNorth Carolina\tNew Hanover County\t9011\t43.9\t35.0\t10.3\t31287\t213585\t0.4696\t28412\tRomney\t28412\t0.027000458999999997\t28412.0\n15611\t-77.920742\t34.287968\tWrightsboro CDP\tNC\tNorth Carolina\tNew Hanover County\t4842\t40.0\t15.9\t10.2\t21317\t117537\t0.4696\t28429\tRomney\t28429\t0.014508513999999998\t28429.0\n15612\t-77.79749699999999\t34.265396\tOgden CDP\tNC\tNorth Carolina\tNew Hanover County\t7030\t43.4\t44.2\t8.3\t33179\t224017\t0.4696\t28411\tRomney\t28411\t0.021064613\t28411.0\n15613\t-77.897188\t34.069431\tSea Breeze CDP\tNC\tNorth Carolina\tNew Hanover County\t1823\t42.5\t29.4\t9.3\t26373\t181500\t0.4696\t28428\tRomney\t28428\t0.005462417\t28428.0\n15614\t-77.933725\t34.265947\tHightsville CDP\tNC\tNorth Carolina\tNew Hanover County\t777\t40.2\t16.6\t8.5\t21605\t137500\t0.4696\t28401\tRomney\t28401\t0.002328194\t28401.0\n15615\t-77.890789\t34.219235999999995\tWilmington city\tNC\tNorth Carolina\tNew Hanover County\t87245\t35.8\t35.2\t12.4\t25760\t172385\t0.4696\t28403\tRomney\t28403\t0.261419937\t28403.0\n15616\t-77.916423\t34.336182\tSkippers Corner CDP\tNC\tNorth Carolina\tNew Hanover County\t1281\t40.0\t16.6\t9.6\t23432\t149583\t0.4696\t28429\tRomney\t28429\t0.0038383740000000003\t28429.0\n15617\t-77.84366\t34.301134999999995\tMurraysville CDP\tNC\tNorth Carolina\tNew Hanover County\t13308\t35.0\t31.7\t9.5\t29980\t161811\t0.4696\t28411\tRomney\t28411\t0.039875942000000004\t28411.0\n15618\t-77.644817\t36.496520000000004\tGaston town\tNC\tNorth Carolina\tNorthampton County\t997\t42.1\t8.2\t14.7\t17531\t62969\t0.6724\t27832\tRomney\t27832\t0.0029874000000000003\t27832.0\n15619\t-77.211602\t36.331845\tWoodland town\tNC\tNorth Carolina\tNorthampton County\t744\t37.6\t20.6\t15.0\t15423\t82143\t0.6724\t27897\tRomney\t27897\t0.0022293129999999997\t27897.0\n15620\t-77.305598\t36.348608\tLasker town\tNC\tNorth Carolina\tNorthampton County\t98\t41.1\t3.0\t14.0\t17257\t72500\t0.6724\t27869\tRomney\t27869\t0.000293646\t27869.0\n15621\t-77.284456\t36.273702\tRich Square town\tNC\tNorth Carolina\tNorthampton County\t867\t46.3\t18.0\t14.1\t17562\t73125\t0.6724\t27869\tRomney\t27869\t0.002597869\t27869.0\n15622\t-77.560174\t36.447911\tGarysburg town\tNC\tNorth Carolina\tNorthampton County\t1167\t42.2\t14.5\t16.9\t16286\t80385\t0.6724\t27831\tRomney\t27831\t0.0034967859999999996\t27831.0\n15623\t-77.189316\t36.514234\tSevern town\tNC\tNorth Carolina\tNorthampton County\t245\t42.5\t13.1\t9.7\t17035\t72500\t0.6724\t27877\tRomney\t27877\t0.000734115\t27877.0\n15624\t-77.441633\t36.49042\tSeaboard town\tNC\tNorth Carolina\tNorthampton County\t682\t40.9\t19.7\t15.9\t17472\t83462\t0.6724\t27876\tRomney\t27876\t0.0020435370000000002\t27876.0\n15625\t-77.41935500000001\t36.390145000000004\tJackson town\tNC\tNorth Carolina\tNorthampton County\t671\t40.4\t13.9\t13.9\t18886\t81429\t0.6724\t27845\tRomney\t27845\t0.002010577\t27845.0\n15626\t-77.22864799999999\t36.437253000000005\tConway town\tNC\tNorth Carolina\tNorthampton County\t697\t43.7\t11.2\t11.6\t18080\t67273\t0.6724\t27820\tRomney\t27820\t0.002088483\t27820.0\n15627\t-77.547409\t34.899229\tRichlands town\tNC\tNorth Carolina\tOnslow County\t818\t44.0\t16.5\t11.3\t18526\t94167\t0.3595\t28574\tRomney\t28574\t0.002451046\t28574.0\n15628\t-77.426606\t34.493930999999996\tNorth Topsail Beach city\tNC\tNorth Carolina\tOnslow County\t1758\t58.3\t40.7\t8.5\t39510\t157622\t0.3595\t28460\tRomney\t28460\t0.005267651\t28460.0\n15629\t-77.365279\t34.786077\tPumpkin Center CDP\tNC\tNorth Carolina\tOnslow County\t2172\t33.6\t14.4\t7.9\t20997\t124411\t0.3595\t28546\tRomney\t28546\t0.006508156\t28546.0\n15630\t-77.556017\t34.491859000000005\tHolly Ridge town\tNC\tNorth Carolina\tOnslow County\t848\t32.9\t9.0\t18.3\t15452\t95833\t0.3595\t28445\tRomney\t28445\t0.002540938\t28445.0\n15631\t-77.132046\t34.69419\tSwansboro town\tNC\tNorth Carolina\tOnslow County\t1754\t39.6\t23.9\t9.2\t22812\t136589\t0.3595\t28584\tRomney\t28584\t0.005255666\t28584.0\n15632\t-77.462172\t34.819223\tHalf Moon CDP\tNC\tNorth Carolina\tOnslow County\t6897\t29.8\t19.4\t7.9\t22672\t119253\t0.3595\t28540\tRomney\t28540\t0.020666093\t28540.0\n15633\t-77.415901\t34.749959000000004\tJacksonville city\tNC\tNorth Carolina\tOnslow County\t73895\t23.2\t20.4\t12.2\t17462\t129453\t0.3595\t28540\tRomney\t28540\t0.22141814699999998\t28540.0\n15634\t-77.32013\t34.750505\tPiney Green CDP\tNC\tNorth Carolina\tOnslow County\t12300\t28.6\t21.6\t10.8\t21686\t117939\t0.3595\t28544\tRomney\t28544\t0.036855582000000005\t28544.0\n15635\t-77.38671\t34.55363\tSneads Ferry CDP\tNC\tNorth Carolina\tOnslow County\t2391\t42.7\t14.5\t6.1\t20126\t129762\t0.3595\t28460\tRomney\t28460\t0.007164366\t28460.0\n15636\t-79.086402\t35.91684\tCarrboro town\tNC\tNorth Carolina\tOrange County\t17483\t30.3\t66.8\t8.5\t26320\t212500\t0.7022\t27510\tRomney\t27510\t0.052385865\t27510.0\n15637\t-79.100937\t36.072403\tHillsborough town\tNC\tNorth Carolina\tOrange County\t6388\t38.6\t32.3\t7.2\t26487\t110815\t0.7022\t27278\tRomney\t27278\t0.019140931\t27278.0\n15638\t-79.002875\t35.928497\tChapel Hill town\tNC\tNorth Carolina\tOrange County\t52250\t26.8\t78.1\t8.4\t32326\t280773\t0.7022\t27514\tRomney\t27514\t0.15656131199999998\t27514.0\n15639\t-76.74251600000001\t35.136231\tStonewall town\tNC\tNorth Carolina\tPamlico County\t267\t44.3\t11.4\t6.6\t22251\t114423\t0.3915\t28515\tRomney\t28515\t0.0008000360000000001\t28515.0\n15640\t-76.826031\t35.021466\tArapahoe town\tNC\tNorth Carolina\tPamlico County\t463\t48.5\t20.1\t8.4\t23788\t130952\t0.3915\t28510\tRomney\t28510\t0.001387328\t28510.0\n15641\t-76.649602\t35.203525\tMesic town\tNC\tNorth Carolina\tPamlico County\t233\t46.3\t8.3\t19.6\t15142\t77000\t0.3915\t28515\tRomney\t28515\t0.000698159\t28515.0\n15642\t-76.768608\t35.144172999999995\tBayboro town\tNC\tNorth Carolina\tPamlico County\t736\t43.1\t17.5\t10.7\t17623\t80789\t0.3915\t28515\tRomney\t28515\t0.0022053420000000003\t28515.0\n15643\t-76.82044\t34.982089\tMinnesott Beach town\tNC\tNorth Carolina\tPamlico County\t349\t51.3\t23.9\t6.9\t26222\t147656\t0.3915\t28510\tRomney\t28510\t0.00104574\t28510.0\n15644\t-76.684564\t35.034228999999996\tOriental town\tNC\tNorth Carolina\tPamlico County\t801\t60.3\t37.2\t15.3\t29806\t219531\t0.3915\t28571\tRomney\t28571\t0.0024001070000000003\t28571.0\n15645\t-76.666258\t35.188041999999996\tVandemere town\tNC\tNorth Carolina\tPamlico County\t262\t45.8\t8.5\t19.8\t15144\t77500\t0.3915\t28515\tRomney\t28515\t0.000785054\t28515.0\n15646\t-76.818105\t35.143456\tAlliance town\tNC\tNorth Carolina\tPamlico County\t747\t38.4\t6.0\t10.5\t14916\t92813\t0.3915\t28529\tRomney\t28529\t0.002238302\t28529.0\n15647\t-76.211729\t36.302105\tElizabeth City\tNC\tNorth Carolina\tPasquotank County\t20048\t34.3\t21.3\t13.4\t16957\t124477\t0.5678\t27909\tRomney\t27909\t0.060071602\t27909.0\n15648\t-77.922951\t34.550835\tBurgaw town\tNC\tNorth Carolina\tPender County\t4336\t42.3\t18.7\t13.6\t20172\t127444\t0.3927\t28425\tRomney\t28425\t0.012992341999999999\t28425.0\n15649\t-77.516994\t34.447485\tSurf City town\tNC\tNorth Carolina\tPender County\t2300\t53.1\t37.7\t10.0\t33955\t215686\t0.3927\t28445\tRomney\t28445\t0.006891694\t28445.0\n15650\t-77.917406\t34.516617\tSt. Helena village\tNC\tNorth Carolina\tPender County\t599\t36.5\t11.9\t13.2\t17111\t113889\t0.3927\t28425\tRomney\t28425\t0.001794837\t28425.0\n15651\t-77.962914\t34.644427\tWatha town\tNC\tNorth Carolina\tPender County\t211\t39.3\t6.9\t15.3\t19496\t100000\t0.3927\t28471\tRomney\t28471\t0.000632238\t28471.0\n15652\t-78.169892\t34.527485999999996\tAtkinson town\tNC\tNorth Carolina\tPender County\t280\t44.4\t8.4\t14.9\t21895\t76875\t0.3927\t28421\tRomney\t28421\t0.0008389889999999999\t28421.0\n15653\t-77.62624699999999\t34.368506\tTopsail Beach town\tNC\tNorth Carolina\tPender County\t654\t52.3\t39.3\t10.5\t33735\t255000\t0.3927\t28443\tRomney\t28443\t0.001959638\t28443.0\n15654\t-76.47354\t36.184867\tHertford town\tNC\tNorth Carolina\tPerquimans County\t2060\t45.3\t15.5\t13.5\t16187\t119512\t0.4148\t27985\tRomney\t27985\t0.006172561\t27985.0\n15655\t-76.454314\t36.210234\tWinfall town\tNC\tNorth Carolina\tPerquimans County\t668\t44.9\t16.6\t13.9\t16704\t130882\t0.4148\t27985\tRomney\t27985\t0.002001588\t27985.0\n15656\t-78.98213100000001\t36.389101000000004\tRoxboro city\tNC\tNorth Carolina\tPerson County\t8514\t40.8\t12.1\t15.3\t18884\t100762\t0.4406\t27573\tRomney\t27573\t0.025511254\t27573.0\n15657\t-77.397676\t35.530998\tWinterville town\tNC\tNorth Carolina\tPitt County\t5214\t35.2\t30.9\t10.8\t23500\t104883\t0.5306\t28590\tRomney\t28590\t0.015623171000000002\t28590.0\n15658\t-77.191539\t35.562032\tGrimesland town\tNC\tNorth Carolina\tPitt County\t520\t40.2\t8.5\t14.5\t17330\t80500\t0.5306\t27837\tRomney\t27837\t0.0015581220000000001\t27837.0\n15659\t-77.376209\t35.807357\tBethel town\tNC\tNorth Carolina\tPitt County\t2118\t40.3\t14.3\t15.2\t16295\t83846\t0.5306\t27812\tRomney\t27812\t0.006346351\t27812.0\n15660\t-77.433181\t35.375941\tGrifton town\tNC\tNorth Carolina\tPitt County\t2495\t42.6\t13.4\t12.3\t16944\t93016\t0.5306\t28530\tRomney\t28530\t0.00747599\t28530.0\n15661\t-77.421316\t35.471769\tAyden town\tNC\tNorth Carolina\tPitt County\t4731\t41.1\t16.1\t13.6\t18731\t97048\t0.5306\t28513\tRomney\t28513\t0.014175915\t28513.0\n15662\t-77.379663\t35.598422\tGreenville city\tNC\tNorth Carolina\tPitt County\t69412\t27.7\t43.0\t12.1\t23269\t118431\t0.5306\t27834\tRomney\t27834\t0.20798533600000002\t27834.0\n15663\t-77.512883\t35.698165\tFalkland town\tNC\tNorth Carolina\tPitt County\t98\t39.3\t7.5\t8.9\t15608\t70000\t0.5306\t27827\tRomney\t27827\t0.000293646\t27827.0\n15664\t-77.630649\t35.672035\tFountain town\tNC\tNorth Carolina\tPitt County\t572\t41.6\t7.2\t11.5\t16741\t78333\t0.5306\t27829\tRomney\t27829\t0.0017139339999999999\t27829.0\n15665\t-77.592353\t35.594702000000005\tFarmville town\tNC\tNorth Carolina\tPitt County\t4791\t41.1\t19.2\t12.7\t18662\t92406\t0.5306\t27828\tRomney\t27828\t0.014355699\t27828.0\n15666\t-77.27884300000001\t35.57527\tSimpson village\tNC\tNorth Carolina\tPitt County\t473\t39.7\t37.1\t10.2\t26558\t128750\t0.5306\t27858\tRomney\t27858\t0.0014172920000000001\t27858.0\n15667\t-82.20315\t35.24776\tColumbus town\tNC\tNorth Carolina\tPolk County\t1023\t56.1\t36.6\t9.9\t29895\t160326\t0.3863\t28722\tRomney\t28722\t0.003065306\t28722.0\n15668\t-82.346914\t35.247406\tSaluda city\tNC\tNorth Carolina\tPolk County\t707\t51.1\t30.2\t10.6\t24128\t175000\t0.3863\t28773\tRomney\t28773\t0.0021184470000000003\t28773.0\n15669\t-82.238169\t35.208096000000005\tTryon town\tNC\tNorth Carolina\tPolk County\t1759\t56.0\t39.0\t12.6\t30833\t194355\t0.3863\t28782\tRomney\t28782\t0.005270648\t28782.0\n15670\t-79.94245\t35.922539\tArchdale city\tNC\tNorth Carolina\tRandolph County\t10318\t40.7\t15.9\t11.5\t24450\t111904\t0.2433\t27263\tRomney\t27263\t0.030916739\t27263.0\n15671\t-79.651814\t35.734189\tRamseur town\tNC\tNorth Carolina\tRandolph County\t1805\t38.5\t12.6\t13.5\t18406\t95536\t0.2433\t27316\tRomney\t27316\t0.005408481999999999\t27316.0\n15672\t-80.009509\t35.87498\tTrinity city\tNC\tNorth Carolina\tRandolph County\t7244\t42.2\t14.0\t11.7\t23241\t110376\t0.2433\t27370\tRomney\t27370\t0.02170584\t27370.0\n15673\t-79.552214\t35.799064\tStaley town\tNC\tNorth Carolina\tRandolph County\t372\t41.5\t7.3\t9.5\t18234\t95000\t0.2433\t27355\tRomney\t27355\t0.001114657\t27355.0\n15674\t-79.808544\t35.816421999999996\tRandleman city\tNC\tNorth Carolina\tRandolph County\t3776\t37.2\t10.8\t10.7\t19580\t87393\t0.2433\t27317\tRomney\t27317\t0.011314363999999999\t27317.0\n15675\t-79.77703699999999\t35.540631\tSeagrove town\tNC\tNorth Carolina\tRandolph County\t272\t36.8\t7.2\t13.9\t17802\t80000\t0.2433\t27341\tRomney\t27341\t0.000815018\t27341.0\n15676\t-79.817915\t35.721934999999995\tAsheboro city\tNC\tNorth Carolina\tRandolph County\t23372\t37.1\t19.2\t13.9\t19579\t100358\t0.2433\t27203\tRomney\t27203\t0.070031598\t27203.0\n15677\t-79.69217900000001\t35.746772\tFranklinville town\tNC\tNorth Carolina\tRandolph County\t1352\t34.9\t7.9\t13.5\t19357\t80882\t0.2433\t27248\tRomney\t27248\t0.004051118\t27248.0\n15678\t-79.570142\t35.854075\tLiberty town\tNC\tNorth Carolina\tRandolph County\t2950\t38.4\t13.2\t14.9\t18517\t98507\t0.2433\t27298\tRomney\t27298\t0.008839347\t27298.0\n15679\t-79.709179\t34.888436\tHamlet city\tNC\tNorth Carolina\tRichmond County\t5835\t41.3\t13.2\t15.5\t18432\t81341\t0.5101\t28345\tRomney\t28345\t0.017483928\t28345.0\n15680\t-79.693248\t34.906827\tDobbins Heights town\tNC\tNorth Carolina\tRichmond County\t953\t32.1\t9.1\t24.1\t10751\t55143\t0.5101\t28345\tRomney\t28345\t0.002855558\t28345.0\n15681\t-79.7596\t35.070322999999995\tEllerbe town\tNC\tNorth Carolina\tRichmond County\t1097\t38.6\t6.2\t14.5\t15758\t76667\t0.5101\t28338\tRomney\t28338\t0.003287038\t28338.0\n15682\t-79.723171\t35.16956\tNorman town\tNC\tNorth Carolina\tRichmond County\t76\t43.8\t11.1\t16.7\t14996\t85000\t0.5101\t28367\tRomney\t28367\t0.00022772599999999998\t28367.0\n15683\t-79.766068\t34.911648\tEast Rockingham CDP\tNC\tNorth Carolina\tRichmond County\t3721\t39.1\t6.2\t15.7\t15855\t53750\t0.5101\t28379\tRomney\t28379\t0.011149563000000001\t28379.0\n15684\t-79.760379\t34.938394\tRockingham city\tNC\tNorth Carolina\tRichmond County\t9270\t38.9\t18.8\t16.4\t18679\t95966\t0.5101\t28379\tRomney\t28379\t0.027776524\t28379.0\n15685\t-79.54930300000001\t35.031271999999994\tHoffman town\tNC\tNorth Carolina\tRichmond County\t693\t29.4\t12.7\t17.2\t17537\t96923\t0.5101\t28347\tRomney\t28347\t0.002076497\t28347.0\n15686\t-79.348977\t34.622933\tRaemon CDP\tNC\tNorth Carolina\tRobeson County\t229\t30.4\t6.6\t13.0\t12245\t81667\t0.5818\t28383\tRomney\t28383\t0.000686173\t28383.0\n15687\t-79.2306\t34.606975\tElrod CDP\tNC\tNorth Carolina\tRobeson County\t496\t35.3\t17.7\t15.0\t15220\t62778\t0.5818\t28383\tRomney\t28383\t0.0014862089999999998\t28383.0\n15688\t-79.115403\t34.496133\tFairmont town\tNC\tNorth Carolina\tRobeson County\t2546\t40.1\t14.1\t20.1\t13259\t76230\t0.5818\t28340\tRomney\t28340\t0.007628806\t28340.0\n15689\t-79.037435\t34.475476\tProctorville town\tNC\tNorth Carolina\tRobeson County\t144\t37.3\t6.4\t13.2\t14190\t54000\t0.5818\t28369\tRomney\t28369\t0.00043148\t28369.0\n15690\t-79.223\t34.729826\tProspect CDP\tNC\tNorth Carolina\tRobeson County\t769\t32.6\t21.7\t11.6\t14234\t93000\t0.5818\t28372\tRomney\t28372\t0.0023042229999999998\t28372.0\n15691\t-78.98875600000001\t34.682489000000004\tBarker Ten Mile CDP\tNC\tNorth Carolina\tRobeson County\t1174\t48.1\t43.4\t9.2\t30538\t169022\t0.5818\t28358\tRomney\t28358\t0.00351776\t28358.0\n15692\t-79.07250400000001\t34.889794\tLumber Bridge town\tNC\tNorth Carolina\tRobeson County\t133\t32.5\t6.3\t12.7\t12490\t77500\t0.5818\t28357\tRomney\t28357\t0.00039852\t28357.0\n15693\t-79.197839\t34.679567\tPembroke town\tNC\tNorth Carolina\tRobeson County\t2775\t27.8\t27.4\t15.1\t14242\t106635\t0.5818\t28372\tRomney\t28372\t0.008314979\t28372.0\n15694\t-78.972791\t34.807303999999995\tSt. Pauls town\tNC\tNorth Carolina\tRobeson County\t2302\t35.9\t8.7\t16.1\t14980\t91633\t0.5818\t28384\tRomney\t28384\t0.006897687\t28384.0\n15695\t-79.292536\t34.537247\tRowland town\tNC\tNorth Carolina\tRobeson County\t1244\t42.4\t14.1\t13.8\t14340\t67700\t0.5818\t28383\tRomney\t28383\t0.003727508\t28383.0\n15696\t-79.182975\t34.838739000000004\tRed Springs town\tNC\tNorth Carolina\tRobeson County\t3556\t35.6\t17.3\t12.1\t14194\t86786\t0.5818\t28377\tRomney\t28377\t0.010655158\t28377.0\n15697\t-79.009858\t34.90272\tParkton town\tNC\tNorth Carolina\tRobeson County\t498\t31.5\t15.0\t10.3\t16161\t102778\t0.5818\t28371\tRomney\t28371\t0.0014922020000000002\t28371.0\n15698\t-79.020623\t34.629163\tLumberton city\tNC\tNorth Carolina\tRobeson County\t21147\t37.5\t24.3\t12.6\t18315\t111354\t0.5818\t28358\tRomney\t28358\t0.063364633\t28358.0\n15699\t-79.176323\t34.554001\tMcDonald town\tNC\tNorth Carolina\tRobeson County\t124\t32.1\t16.7\t11.9\t17605\t98333\t0.5818\t28340\tRomney\t28340\t0.000371552\t28340.0\n15700\t-79.190568\t34.576112\tRaynham town\tNC\tNorth Carolina\tRobeson County\t77\t32.1\t8.5\t11.8\t13642\t85000\t0.5818\t28383\tRomney\t28383\t0.00023072200000000002\t28383.0\n15701\t-79.124895\t34.36824\tMarietta town\tNC\tNorth Carolina\tRobeson County\t184\t38.0\t4.2\t16.9\t13139\t66000\t0.5818\t28362\tRomney\t28362\t0.000551336\t28362.0\n15702\t-79.348652\t34.741781\tMaxton town\tNC\tNorth Carolina\tRobeson County\t2408\t35.2\t10.4\t15.7\t14040\t83729\t0.5818\t28364\tRomney\t28364\t0.0072153040000000005\t28364.0\n15703\t-79.00814\t34.466534\tOrrum town\tNC\tNorth Carolina\tRobeson County\t90\t42.8\t4.5\t9.1\t17717\t92500\t0.5818\t28369\tRomney\t28369\t0.000269675\t28369.0\n15704\t-79.08025699999999\t34.815863\tRennert town\tNC\tNorth Carolina\tRobeson County\t372\t29.1\t6.1\t12.3\t12400\t58750\t0.5818\t28378\tRomney\t28378\t0.001114657\t28378.0\n15705\t-79.046937\t34.850826\tRex CDP\tNC\tNorth Carolina\tRobeson County\t62\t33.1\t5.4\t13.3\t12485\t75000\t0.5818\t28378\tRomney\t28378\t0.000185776\t28378.0\n15706\t-79.139575\t34.847656\tShannon CDP\tNC\tNorth Carolina\tRobeson County\t209\t29.6\t9.9\t10.8\t12616\t65000\t0.5818\t28386\tRomney\t28386\t0.000626245\t28386.0\n15707\t-79.751864\t36.391447\tWentworth town\tNC\tNorth Carolina\tRockingham County\t2765\t42.2\t16.5\t13.0\t21380\t101056\t0.3891\t27320\tRomney\t27320\t0.008285015\t27320.0\n15708\t-79.736798\t36.502324\tEden city\tNC\tNorth Carolina\tRockingham County\t15221\t41.4\t13.4\t17.3\t18849\t75602\t0.3891\t27288\tRomney\t27288\t0.045608033\t27288.0\n15709\t-79.906336\t36.466151\tStoneville town\tNC\tNorth Carolina\tRockingham County\t991\t42.0\t12.2\t15.1\t18575\t87083\t0.3891\t27048\tRomney\t27048\t0.002969421\t27048.0\n15710\t-79.973364\t36.386965000000004\tMadison town\tNC\tNorth Carolina\tRockingham County\t2222\t43.2\t19.0\t10.7\t20580\t95424\t0.3891\t27025\tRomney\t27025\t0.0066579759999999995\t27025.0\n15711\t-79.669601\t36.343253000000004\tReidsville city\tNC\tNorth Carolina\tRockingham County\t14776\t42.3\t18.1\t14.6\t21426\t94454\t0.3891\t27320\tRomney\t27320\t0.04427464\t27320.0\n15712\t-79.97284\t36.413868\tMayodan town\tNC\tNorth Carolina\tRockingham County\t2279\t41.7\t10.8\t13.5\t19681\t71437\t0.3891\t27027\tRomney\t27027\t0.00682877\t27027.0\n15713\t-80.664469\t35.520720000000004\tEnochville CDP\tNC\tNorth Carolina\tRowan County\t2927\t43.9\t4.5\t15.0\t20310\t118909\t0.3635\t28081\tRomney\t28081\t0.00877043\t28081.0\n15714\t-80.445715\t35.613514\tGranite Quarry town\tNC\tNorth Carolina\tRowan County\t2501\t39.6\t21.9\t10.3\t22863\t157670\t0.3635\t28072\tRomney\t28072\t0.007493968\t28072.0\n15715\t-80.47916\t35.669236\tSalisbury city\tNC\tNorth Carolina\tRowan County\t27186\t38.2\t27.8\t20.8\t21264\t139299\t0.3635\t28144\tRomney\t28144\t0.081459825\t28144.0\n15716\t-80.580504\t35.570833\tChina Grove town\tNC\tNorth Carolina\tRowan County\t3904\t37.8\t13.6\t14.0\t20547\t121044\t0.3635\t28023\tRomney\t28023\t0.011697902\t28023.0\n15717\t-80.430646\t35.695552\tSpencer town\tNC\tNorth Carolina\tRowan County\t3296\t40.0\t18.2\t17.2\t21768\t120101\t0.3635\t28159\tRomney\t28159\t0.009876097\t28159.0\n15718\t-80.609329\t35.549054999999996\tLandis town\tNC\tNorth Carolina\tRowan County\t3163\t38.4\t10.6\t11.2\t19878\t128074\t0.3635\t28088\tRomney\t28088\t0.009477578\t28088.0\n15719\t-80.681267\t35.732746\tCleveland town\tNC\tNorth Carolina\tRowan County\t905\t36.4\t11.5\t15.2\t20644\t133482\t0.3635\t27013\tRomney\t27013\t0.002711732\t27013.0\n15720\t-80.427238\t35.682283\tEast Spencer town\tNC\tNorth Carolina\tRowan County\t1817\t34.2\t11.9\t23.5\t14922\t104647\t0.3635\t28159\tRomney\t28159\t0.005444438\t28159.0\n15721\t-80.459237\t35.589215\tFaith town\tNC\tNorth Carolina\tRowan County\t787\t37.6\t18.4\t10.7\t21735\t149020\t0.3635\t28072\tRomney\t28072\t0.002358158\t28072.0\n15722\t-80.406478\t35.554039\tRockwell town\tNC\tNorth Carolina\tRowan County\t2290\t40.6\t14.3\t11.3\t20771\t139238\t0.3635\t28138\tRomney\t28138\t0.00686173\t28138.0\n15723\t-81.835688\t35.362404999999995\tBostic town\tNC\tNorth Carolina\tRutherford County\t333\t40.6\t11.7\t14.6\t18395\t93125\t0.3266\t28043\tRomney\t28043\t0.000997797\t28043.0\n15724\t-82.255634\t35.450176\tChimney Rock village\tNC\tNorth Carolina\tRutherford County\t175\t51.6\t31.4\t13.0\t23565\t237500\t0.3266\t28710\tRomney\t28710\t0.000524368\t28710.0\n15725\t-81.75996500000001\t35.329295\tEllenboro town\tNC\tNorth Carolina\tRutherford County\t478\t38.5\t13.1\t14.9\t18084\t90000\t0.3266\t28040\tRomney\t28040\t0.0014322739999999999\t28040.0\n15726\t-81.945269\t35.382553\tRuth town\tNC\tNorth Carolina\tRutherford County\t327\t40.4\t15.0\t16.1\t18525\t125000\t0.3266\t28160\tRomney\t28160\t0.000979819\t28160.0\n15727\t-81.923474\t35.359919\tSpindale town\tNC\tNorth Carolina\tRutherford County\t3741\t41.9\t12.0\t14.5\t17111\t95965\t0.3266\t28160\tRomney\t28160\t0.01120949\t28160.0\n15728\t-81.960249\t35.363335\tRutherfordton town\tNC\tNorth Carolina\tRutherford County\t4004\t43.1\t31.1\t13.5\t22663\t136175\t0.3266\t28139\tRomney\t28139\t0.011997541\t28139.0\n15729\t-82.205809\t35.441182\tLake Lure town\tNC\tNorth Carolina\tRutherford County\t1673\t51.9\t28.3\t12.6\t23991\t203226\t0.3266\t28746\tRomney\t28746\t0.005012958\t28746.0\n15730\t-81.87111800000001\t35.334578\tForest City town\tNC\tNorth Carolina\tRutherford County\t7016\t39.0\t13.2\t18.7\t18064\t95798\t0.3266\t28043\tRomney\t28043\t0.021022662999999997\t28043.0\n15731\t-78.34978199999999\t34.831078999999995\tIngold CDP\tNC\tNorth Carolina\tSampson County\t500\t31.6\t11.7\t11.9\t16365\t100000\t0.4419\t28441\tRomney\t28441\t0.001498194\t28441.0\n15732\t-78.184111\t34.995096999999994\tTurkey town\tNC\tNorth Carolina\tSampson County\t286\t38.9\t8.0\t10.3\t14502\t89375\t0.4419\t28393\tRomney\t28393\t0.0008569669999999999\t28393.0\n15733\t-78.394785\t34.785755\tGarland town\tNC\tNorth Carolina\tSampson County\t941\t37.2\t8.0\t13.3\t16382\t91667\t0.4419\t28441\tRomney\t28441\t0.002819602\t28441.0\n15734\t-78.64092\t34.996864\tAutryville town\tNC\tNorth Carolina\tSampson County\t220\t37.9\t10.0\t6.9\t17757\t72000\t0.4419\t28318\tRomney\t28318\t0.0006592060000000001\t28318.0\n15735\t-78.482502\t35.198289\tSpiveys Corner CDP\tNC\tNorth Carolina\tSampson County\t518\t36.5\t15.4\t9.4\t18505\t126136\t0.4419\t28366\tRomney\t28366\t0.001552129\t28366.0\n15736\t-78.244618\t34.586861999999996\tIvanhoe CDP\tNC\tNorth Carolina\tSampson County\t336\t41.2\t8.3\t9.0\t13590\t77500\t0.4419\t28447\tRomney\t28447\t0.0010067869999999999\t28447.0\n15737\t-78.402587\t35.169607\tVann Crossroads CDP\tNC\tNorth Carolina\tSampson County\t354\t36.2\t15.9\t8.9\t19665\t108929\t0.4419\t28366\tRomney\t28366\t0.001060722\t28366.0\n15738\t-78.502801\t35.015283000000004\tSalemburg town\tNC\tNorth Carolina\tSampson County\t527\t41.1\t16.6\t9.6\t18033\t99375\t0.4419\t28385\tRomney\t28385\t0.001579097\t28385.0\n15739\t-78.396117\t34.999282\tBonnetsville CDP\tNC\tNorth Carolina\tSampson County\t437\t38.9\t7.8\t17.1\t17929\t103571\t0.4419\t28328\tRomney\t28328\t0.001309422\t28328.0\n15740\t-78.332385\t35.000483\tClinton city\tNC\tNorth Carolina\tSampson County\t8467\t42.7\t21.7\t11.8\t18762\t122867\t0.4419\t28328\tRomney\t28328\t0.025370424\t28328.0\n15741\t-78.563491\t35.245703999999996\tPlain View CDP\tNC\tNorth Carolina\tSampson County\t2077\t35.5\t13.1\t9.9\t17847\t131061\t0.4419\t28334\tRomney\t28334\t0.006223499\t28334.0\n15742\t-78.21661800000001\t34.810213\tDelway CDP\tNC\tNorth Carolina\tSampson County\t298\t37.3\t12.8\t8.9\t17292\t105357\t0.4419\t28444\tRomney\t28444\t0.0008929239999999999\t28444.0\n15743\t-78.354763\t35.25222\tNewton Grove town\tNC\tNorth Carolina\tSampson County\t640\t42.2\t22.8\t10.0\t20361\t128017\t0.4419\t28366\tRomney\t28366\t0.001917689\t28366.0\n15744\t-78.193347\t34.737581\tHarrells town\tNC\tNorth Carolina\tSampson County\t228\t39.6\t11.5\t10.9\t14319\t98750\t0.4419\t28444\tRomney\t28444\t0.000683177\t28444.0\n15745\t-78.51162099999999\t34.953902\tRoseboro town\tNC\tNorth Carolina\tSampson County\t1389\t38.8\t11.1\t12.0\t16383\t93382\t0.4419\t28382\tRomney\t28382\t0.0041619840000000005\t28382.0\n15746\t-78.309496\t35.113015999999995\tKeener CDP\tNC\tNorth Carolina\tSampson County\t554\t37.2\t13.4\t11.4\t18242\t115500\t0.4419\t28328\tRomney\t28328\t0.001659999\t28328.0\n15747\t-79.478026\t34.759559\tLaurinburg city\tNC\tNorth Carolina\tScotland County\t16097\t37.6\t26.0\t21.0\t19482\t114635\t0.5803\t28352\tRomney\t28352\t0.04823287\t28352.0\n15748\t-79.445032\t34.768987\tEast Laurinburg town\tNC\tNorth Carolina\tScotland County\t272\t38.3\t2.7\t22.0\t12027\t56538\t0.5803\t28352\tRomney\t28352\t0.000815018\t28352.0\n15749\t-79.60683\t34.759442\tGibson town\tNC\tNorth Carolina\tScotland County\t652\t38.6\t11.9\t18.4\t13717\t71538\t0.5803\t28343\tRomney\t28343\t0.001953645\t28343.0\n15750\t-79.365227\t34.889134999999996\tWagram town\tNC\tNorth Carolina\tScotland County\t769\t37.1\t15.9\t14.1\t18414\t87667\t0.5803\t28396\tRomney\t28396\t0.0023042229999999998\t28396.0\n15751\t-80.431461\t35.261862\tLocust city\tNC\tNorth Carolina\tStanly County\t2523\t40.7\t13.0\t9.9\t22466\t145224\t0.2936\t28097\tRomney\t28097\t0.007559889\t28097.0\n15752\t-80.256614\t35.470597999999995\tRichfield town\tNC\tNorth Carolina\tStanly County\t545\t35.1\t17.4\t11.1\t18730\t128448\t0.2936\t28137\tRomney\t28137\t0.0016330320000000002\t28137.0\n15753\t-80.116476\t35.225089000000004\tNorwood town\tNC\tNorth Carolina\tStanly County\t2408\t42.6\t13.0\t12.6\t19634\t109280\t0.2936\t28128\tRomney\t28128\t0.0072153040000000005\t28128.0\n15754\t-80.116752\t35.406613\tBadin town\tNC\tNorth Carolina\tStanly County\t1195\t40.8\t17.3\t12.6\t16747\t104356\t0.2936\t28009\tRomney\t28009\t0.003580685\t28009.0\n15755\t-80.429968\t35.233333\tStanfield town\tNC\tNorth Carolina\tStanly County\t1129\t41.5\t13.0\t9.8\t22967\t152500\t0.2936\t28163\tRomney\t28163\t0.003382923\t28163.0\n15756\t-80.33088199999999\t35.227897\tOakboro town\tNC\tNorth Carolina\tStanly County\t1453\t41.1\t12.1\t11.7\t22365\t135980\t0.2936\t28129\tRomney\t28129\t0.004353753\t28129.0\n15757\t-80.192892\t35.362815999999995\tAlbemarle city\tNC\tNorth Carolina\tStanly County\t15865\t38.7\t20.2\t15.3\t20178\t122136\t0.2936\t28001\tRomney\t28001\t0.047537708\t28001.0\n15758\t-80.219171\t35.443151\tNew London town\tNC\tNorth Carolina\tStanly County\t352\t40.3\t28.3\t13.1\t25533\t143500\t0.2936\t28127\tRomney\t28127\t0.001054729\t28127.0\n15759\t-80.212574\t36.409977000000005\tDanbury town\tNC\tNorth Carolina\tStokes County\t117\t43.6\t11.9\t11.9\t20435\t106944\t0.2784\t27016\tRomney\t27016\t0.000350577\t27016.0\n15760\t-80.35583199999999\t36.279475\tKing city\tNC\tNorth Carolina\tStokes County\t6304\t42.1\t19.4\t10.9\t24847\t120670\t0.2784\t27021\tRomney\t27021\t0.018889235\t27021.0\n15761\t-80.140762\t36.294146000000005\tWalnut Cove town\tNC\tNorth Carolina\tStokes County\t1552\t43.5\t11.5\t19.7\t19251\t95488\t0.2784\t27052\tRomney\t27052\t0.004650395\t27052.0\n15762\t-80.720624\t36.393402\tDobson town\tNC\tNorth Carolina\tSurry County\t1489\t39.1\t14.9\t15.5\t18299\t131604\t0.3092\t27017\tRomney\t27017\t0.004461623\t27017.0\n15763\t-80.472083\t36.386026\tPilot Mountain town\tNC\tNorth Carolina\tSurry County\t1338\t45.0\t24.2\t11.0\t23860\t158182\t0.3092\t27041\tRomney\t27041\t0.004009168\t27041.0\n15764\t-80.579686\t36.507552000000004\tFlat Rock CDP\tNC\tNorth Carolina\tSurry County\t1619\t40.3\t1.3\t10.3\t15907\t81585\t0.3092\t27030\tRomney\t27030\t0.0048511529999999995\t27030.0\n15765\t-80.633679\t36.497279\tToast CDP\tNC\tNorth Carolina\tSurry County\t1990\t46.2\t9.2\t11.8\t18001\t95893\t0.3092\t27030\tRomney\t27030\t0.005962814\t27030.0\n15766\t-80.635269\t36.445634000000005\tWhite Plains CDP\tNC\tNorth Carolina\tSurry County\t1037\t38.0\t13.1\t10.5\t19512\t108125\t0.3092\t27030\tRomney\t27030\t0.003107255\t27030.0\n15767\t-80.846815\t36.260238\tElkin town\tNC\tNorth Carolina\tSurry County\t4005\t44.2\t27.5\t10.5\t22952\t128832\t0.3092\t28621\tRomney\t28621\t0.012000537\t28621.0\n15768\t-80.609944\t36.505216\tMount Airy city\tNC\tNorth Carolina\tSurry County\t8317\t44.4\t22.6\t10.8\t20582\t118997\t0.3092\t27030\tRomney\t27030\t0.024920965\t27030.0\n15769\t-83.44711\t35.426056\tBryson City town\tNC\tNorth Carolina\tSwain County\t1533\t47.9\t20.2\t7.9\t18925\t120781\t0.4571\t28713\tRomney\t28713\t0.004593464\t28713.0\n15770\t-82.822078\t35.143822\tRosman town\tNC\tNorth Carolina\tTransylvania County\t529\t40.4\t12.2\t11.7\t20467\t113971\t0.4072\t28772\tRomney\t28772\t0.00158509\t28772.0\n15771\t-82.725186\t35.242946999999994\tBrevard city\tNC\tNorth Carolina\tTransylvania County\t6938\t47.0\t29.8\t10.0\t25014\t156424\t0.4072\t28768\tRomney\t28768\t0.020788945\t28768.0\n15772\t-76.250947\t35.919306\tColumbia town\tNC\tNorth Carolina\tTyrrell County\t804\t40.7\t16.0\t6.7\t13157\t77353\t0.4694\t27925\tRomney\t27925\t0.0024090970000000002\t27925.0\n15773\t-80.45056600000001\t34.984626\tWingate town\tNC\tNorth Carolina\tUnion County\t3803\t31.0\t17.9\t15.0\t19335\t110459\t0.3428\t28174\tRomney\t28174\t0.011395266000000001\t28174.0\n15774\t-80.818499\t35.002316\tMarvin village\tNC\tNorth Carolina\tUnion County\t2782\t32.2\t53.8\t8.3\t40681\t362731\t0.3428\t28277\tRomney\t28277\t0.008335954\t28277.0\n15775\t-80.740619\t35.056312\tWeddington town\tNC\tNorth Carolina\tUnion County\t9066\t40.1\t47.3\t10.5\t39812\t343667\t0.3428\t28104\tRomney\t28104\t0.02716526\t28104.0\n15776\t-80.634248\t35.08505\tLake Park village\tNC\tNorth Carolina\tUnion County\t3521\t33.9\t29.5\t11.2\t28614\t192782\t0.3428\t28079\tRomney\t28079\t0.010550285\t28079.0\n15777\t-80.656059\t35.062348\tIndian Trail town\tNC\tNorth Carolina\tUnion County\t22269\t33.6\t26.3\t9.4\t27126\t163549\t0.3428\t28104\tRomney\t28104\t0.066726581\t28104.0\n15778\t-80.36928\t34.986711\tMarshville town\tNC\tNorth Carolina\tUnion County\t2637\t38.9\t9.8\t15.7\t18843\t92714\t0.3428\t28103\tRomney\t28103\t0.007901476999999999\t28103.0\n15779\t-80.703988\t34.999572\tWesley Chapel village\tNC\tNorth Carolina\tUnion County\t5073\t36.3\t30.6\t9.3\t28083\t197756\t0.3428\t28104\tRomney\t28104\t0.01520068\t28104.0\n15780\t-80.51894\t35.075076\tUnionville town\tNC\tNorth Carolina\tUnion County\t6247\t38.2\t15.2\t10.3\t23545\t155918\t0.3428\t28110\tRomney\t28110\t0.018718441000000002\t28110.0\n15781\t-80.62827\t35.103938\tHemby Bridge town\tNC\tNorth Carolina\tUnion County\t1052\t33.6\t27.0\t9.7\t27733\t175000\t0.3428\t28079\tRomney\t28079\t0.003152201\t28079.0\n15782\t-80.743791\t34.927865000000004\tWaxhaw town\tNC\tNorth Carolina\tUnion County\t4107\t33.9\t30.1\t10.2\t26294\t164074\t0.3428\t28173\tRomney\t28173\t0.012306168999999999\t28173.0\n15783\t-80.74862399999999\t34.863032000000004\tJAARS CDP\tNC\tNorth Carolina\tUnion County\t419\t41.9\t29.5\t10.7\t22460\t164583\t0.3428\t28173\tRomney\t28173\t0.001255487\t28173.0\n15784\t-80.68697399999999\t35.08899\tStallings town\tNC\tNorth Carolina\tUnion County\t6196\t35.6\t22.0\t11.2\t25531\t160615\t0.3428\t28104\tRomney\t28104\t0.018565625\t28104.0\n15785\t-80.563511\t35.003758000000005\tMonroe city\tNC\tNorth Carolina\tUnion County\t33562\t33.9\t19.1\t17.9\t22552\t150730\t0.3428\t28110\tRomney\t28110\t0.10056479900000001\t28110.0\n15786\t-80.680257\t34.940857\tMineral Springs town\tNC\tNorth Carolina\tUnion County\t1964\t40.5\t16.5\t9.1\t24221\t133750\t0.3428\t28173\tRomney\t28173\t0.005884908\t28173.0\n15787\t-78.441311\t36.221814\tKittrell town\tNC\tNorth Carolina\tVance County\t154\t38.8\t7.8\t11.1\t20108\t103125\t0.6389\t27544\tRomney\t27544\t0.00046144400000000004\t27544.0\n15788\t-78.40472\t36.302953\tSouth Henderson CDP\tNC\tNorth Carolina\tVance County\t1269\t36.4\t6.4\t14.9\t14547\t67333\t0.6389\t27536\tRomney\t27536\t0.003802417\t27536.0\n15789\t-78.415851\t36.326115\tHenderson city\tNC\tNorth Carolina\tVance County\t15657\t38.1\t17.0\t13.5\t18504\t113869\t0.6389\t27536\tRomney\t27536\t0.046914459000000006\t27536.0\n15790\t-78.324123\t36.398109999999996\tMiddleburg town\tNC\tNorth Carolina\tVance County\t165\t35.3\t8.4\t14.7\t20282\t85000\t0.6389\t27553\tRomney\t27553\t0.000494404\t27553.0\n15791\t-78.498766\t35.788201\tKnightdale town\tNC\tNorth Carolina\tWake County\t8559\t34.4\t30.1\t8.8\t28204\t161893\t0.5494\t27545\tRomney\t27545\t0.025646091\t27545.0\n15792\t-78.653968\t35.935261\tRaleigh city\tNC\tNorth Carolina\tWake County\t355620\t33.4\t48.0\t10.6\t33088\t208018\t0.5494\t276HH\tRomney\t276HH\t1.065575768\t0.0\n15793\t-78.83573\t35.654790999999996\tHolly Springs town\tNC\tNorth Carolina\tWake County\t16187\t34.1\t48.8\t7.7\t36697\t211578\t0.5494\t27540\tRomney\t27540\t0.048502545\t27540.0\n15794\t-78.461541\t35.918906\tRolesville town\tNC\tNorth Carolina\tWake County\t2091\t36.2\t26.0\t8.6\t25662\t160227\t0.5494\t27571\tRomney\t27571\t0.006265449\t27571.0\n15795\t-78.831626\t35.866675\tMorrisville town\tNC\tNorth Carolina\tWake County\t13969\t32.9\t67.6\t7.2\t48017\t342308\t0.5494\t27560\tRomney\t27560\t0.041856554\t27560.0\n15796\t-78.368095\t35.781859000000004\tWendell town\tNC\tNorth Carolina\tWake County\t5067\t36.8\t21.9\t8.9\t24958\t124121\t0.5494\t27591\tRomney\t27591\t0.015182702\t27591.0\n15797\t-78.628902\t35.696064\tGarner town\tNC\tNorth Carolina\tWake County\t22874\t38.6\t28.2\t10.4\t28315\t149446\t0.5494\t27529\tRomney\t27529\t0.068539396\t27529.0\n15798\t-78.515596\t35.977209\tWake Forest town\tNC\tNorth Carolina\tWake County\t19300\t33.6\t46.3\t8.1\t32258\t192412\t0.5494\t27587\tRomney\t27587\t0.057830303\t27587.0\n15799\t-78.80524399999999\t35.835619\tCary town\tNC\tNorth Carolina\tWake County\t129515\t35.3\t61.9\t8.1\t42091\t252889\t0.5494\t275HH\tRomney\t275HH\t0.388077289\t0.0\n15800\t-78.84874599999999\t35.728177\tApex town\tNC\tNorth Carolina\tWake County\t31895\t34.5\t56.5\t7.5\t36965\t234707\t0.5494\t27502\tRomney\t27502\t0.095569819\t27502.0\n15801\t-78.262383\t35.825452\tZebulon town\tNC\tNorth Carolina\tWake County\t4755\t36.5\t21.0\t13.1\t23502\t121875\t0.5494\t27597\tRomney\t27597\t0.014247828999999998\t27597.0\n15802\t-78.790181\t35.590129\tFuquay-Varina town\tNC\tNorth Carolina\tWake County\t13081\t35.7\t33.2\t8.3\t27873\t165516\t0.5494\t27526\tRomney\t27526\t0.039195761\t27526.0\n15803\t-78.157752\t36.399709\tWarrenton town\tNC\tNorth Carolina\tWarren County\t773\t45.8\t16.5\t15.0\t15898\t90625\t0.6867\t27589\tRomney\t27589\t0.002316209\t27589.0\n15804\t-78.083641\t36.439611\tMacon town\tNC\tNorth Carolina\tWarren County\t112\t54.6\t25.3\t8.5\t23529\t137500\t0.6867\t27551\tRomney\t27551\t0.00033559599999999996\t27551.0\n15805\t-78.195148\t36.445243\tNorlina town\tNC\tNorth Carolina\tWarren County\t1031\t40.7\t12.1\t13.2\t15445\t75938\t0.6867\t27563\tRomney\t27563\t0.003089277\t27563.0\n15806\t-76.748064\t35.860335\tPlymouth town\tNC\tNorth Carolina\tWashington County\t3744\t39.2\t16.5\t16.3\t15892\t79407\t0.5898\t27962\tRomney\t27962\t0.011218478999999998\t27962.0\n15807\t-76.61699200000001\t35.878677\tRoper town\tNC\tNorth Carolina\tWashington County\t579\t41.3\t9.1\t16.4\t15853\t90000\t0.5898\t27970\tRomney\t27970\t0.001734909\t27970.0\n15808\t-76.39296999999999\t35.870228000000004\tCreswell town\tNC\tNorth Carolina\tWashington County\t270\t42.1\t10.1\t8.4\t17565\t71250\t0.5898\t27928\tRomney\t27928\t0.000809025\t27928.0\n15809\t-81.884683\t36.227759000000006\tBeech Mountain town\tNC\tNorth Carolina\tWatauga County\t349\t50.1\t35.0\t10.9\t26446\t184615\t0.4698\t28679\tRomney\t28679\t0.00104574\t28679.0\n15810\t-81.805309\t36.153667999999996\tSeven Devils town\tNC\tNorth Carolina\tWatauga County\t180\t45.1\t30.4\t10.1\t21512\t179167\t0.4698\t28604\tRomney\t28604\t0.00053935\t28604.0\n15811\t-81.668716\t36.210233\tBoone town\tNC\tNorth Carolina\tWatauga County\t14274\t24.3\t49.9\t12.3\t18204\t199522\t0.4698\t28607\tRomney\t28607\t0.042770453\t28607.0\n15812\t-81.66812900000001\t36.130691999999996\tBlowing Rock town\tNC\tNorth Carolina\tWatauga County\t1606\t51.0\t46.6\t8.3\t32045\t281786\t0.4698\t28605\tRomney\t28605\t0.0048122\t28605.0\n15813\t-77.876091\t35.541548999999996\tEureka town\tNC\tNorth Carolina\tWayne County\t241\t39.2\t13.8\t10.1\t20553\t87857\t0.45399999999999996\t27883\tRomney\t27883\t0.00072213\t27883.0\n15814\t-77.92191600000001\t35.330207\tElroy CDP\tNC\tNorth Carolina\tWayne County\t3753\t36.6\t8.3\t12.3\t19802\t84314\t0.45399999999999996\t27534\tRomney\t27534\t0.011245446999999999\t27534.0\n15815\t-78.053736\t35.334024\tMar-Mac CDP\tNC\tNorth Carolina\tWayne County\t2967\t40.2\t10.6\t9.3\t22755\t97898\t0.45399999999999996\t28333\tRomney\t28333\t0.008890285\t28333.0\n15816\t-77.845055\t35.224841999999995\tSeven Springs town\tNC\tNorth Carolina\tWayne County\t109\t38.8\t10.8\t9.7\t21358\t106250\t0.45399999999999996\t28578\tRomney\t28578\t0.000326606\t28578.0\n15817\t-78.025185\t35.295928\tBrogden CDP\tNC\tNorth Carolina\tWayne County\t2743\t36.5\t11.4\t11.3\t17363\t81809\t0.45399999999999996\t28333\tRomney\t28333\t0.008219094\t28333.0\n15818\t-77.984312\t35.498104\tPikeville town\tNC\tNorth Carolina\tWayne County\t872\t36.9\t18.7\t9.6\t21022\t105993\t0.45399999999999996\t27863\tRomney\t27863\t0.0026128510000000002\t27863.0\n15819\t-77.975317\t35.543842\tFremont town\tNC\tNorth Carolina\tWayne County\t1449\t42.6\t11.8\t12.2\t17416\t81538\t0.45399999999999996\t27830\tRomney\t27830\t0.004341767\t27830.0\n15820\t-77.86868100000001\t35.304586\tWalnut Creek village\tNC\tNorth Carolina\tWayne County\t1058\t45.3\t43.4\t8.5\t39430\t182955\t0.45399999999999996\t28551\tRomney\t28551\t0.0031701790000000004\t28551.0\n15821\t-77.969877\t35.375768\tGoldsboro city\tNC\tNorth Carolina\tWayne County\t36405\t36.1\t20.6\t14.5\t20947\t107367\t0.45399999999999996\t27530\tRomney\t27530\t0.10908353300000001\t27530.0\n15822\t-78.059855\t35.197153\tMount Olive town\tNC\tNorth Carolina\tWayne County\t4175\t39.5\t16.9\t10.9\t18134\t89719\t0.45399999999999996\t28365\tRomney\t28365\t0.012509923000000001\t28365.0\n15823\t-81.180891\t36.107108000000004\tMoravian Falls CDP\tNC\tNorth Carolina\tWilkes County\t1460\t44.1\t19.7\t10.3\t24401\t140234\t0.2796\t28697\tRomney\t28697\t0.004374728\t28697.0\n15824\t-80.888249\t36.253448\tPleasant Hill CDP\tNC\tNorth Carolina\tWilkes County\t1091\t43.8\t9.1\t24.3\t19278\t110216\t0.2796\t28621\tRomney\t28621\t0.00326906\t28621.0\n15825\t-80.943311\t36.221707\tRonda town\tNC\tNorth Carolina\tWilkes County\t463\t40.7\t8.2\t12.3\t16610\t108333\t0.2796\t28670\tRomney\t28670\t0.001387328\t28670.0\n15826\t-81.16591899999999\t36.195274\tFairplains CDP\tNC\tNorth Carolina\tWilkes County\t1958\t41.4\t10.6\t18.6\t18420\t108478\t0.2796\t28659\tRomney\t28659\t0.005866929\t28659.0\n15827\t-81.194154\t36.1692\tCricket CDP\tNC\tNorth Carolina\tWilkes County\t2076\t40.3\t11.1\t12.6\t17311\t110085\t0.2796\t28697\tRomney\t28697\t0.0062205030000000005\t28697.0\n15828\t-81.235637\t36.190902\tMillers Creek CDP\tNC\tNorth Carolina\tWilkes County\t2271\t40.5\t15.5\t12.8\t23068\t142472\t0.2796\t28651\tRomney\t28651\t0.006804799\t28651.0\n15829\t-81.170422\t36.140965\tWilkesboro town\tNC\tNorth Carolina\tWilkes County\t3147\t45.5\t28.4\t12.6\t25865\t163068\t0.2796\t28697\tRomney\t28697\t0.009429635\t28697.0\n15830\t-81.16521999999999\t36.225673\tMulberry CDP\tNC\tNorth Carolina\tWilkes County\t2252\t43.1\t18.4\t8.4\t21365\t131090\t0.2796\t28659\tRomney\t28659\t0.006747866999999999\t28659.0\n15831\t-81.11401\t36.247065\tHays CDP\tNC\tNorth Carolina\tWilkes County\t1792\t40.7\t15.3\t12.2\t19749\t115447\t0.2796\t28635\tRomney\t28635\t0.0053695290000000005\t28635.0\n15832\t-81.14232700000001\t36.170691999999995\tNorth Wilkesboro town\tNC\tNorth Carolina\tWilkes County\t3878\t40.9\t20.7\t15.0\t19521\t124589\t0.2796\t28659\tRomney\t28659\t0.011619996\t28659.0\n15833\t-78.007514\t35.644626\tLucama town\tNC\tNorth Carolina\tWilson County\t927\t44.5\t16.3\t10.3\t19709\t98200\t0.5338\t27851\tRomney\t27851\t0.0027776520000000002\t27851.0\n15834\t-77.932946\t35.635616\tBlack Creek town\tNC\tNorth Carolina\tWilson County\t765\t38.8\t12.1\t11.0\t18432\t109152\t0.5338\t27813\tRomney\t27813\t0.002292237\t27813.0\n15835\t-77.9259\t35.732434999999995\tWilson city\tNC\tNorth Carolina\tWilson County\t45749\t37.8\t22.4\t13.5\t21452\t141834\t0.5338\t27893\tRomney\t27893\t0.137081789\t27893.0\n15836\t-78.059169\t35.760706\tSims town\tNC\tNorth Carolina\tWilson County\t145\t39.7\t12.2\t11.9\t19229\t103571\t0.5338\t27880\tRomney\t27880\t0.000434476\t27880.0\n15837\t-77.77554\t35.653553\tSaratoga town\tNC\tNorth Carolina\tWilson County\t394\t43.5\t10.9\t13.4\t15623\t94375\t0.5338\t27873\tRomney\t27873\t0.001180577\t27873.0\n15838\t-77.820824\t35.605669\tStantonsburg town\tNC\tNorth Carolina\tWilson County\t814\t41.4\t11.5\t13.0\t18523\t116331\t0.5338\t27883\tRomney\t27883\t0.00243906\t27883.0\n15839\t-77.86247900000001\t35.807543\tElm City town\tNC\tNorth Carolina\tWilson County\t1404\t43.1\t8.4\t8.3\t19113\t100421\t0.5338\t27822\tRomney\t27822\t0.00420693\t27822.0\n15840\t-80.65991899999999\t36.131083000000004\tYadkinville town\tNC\tNorth Carolina\tYadkin County\t3066\t41.8\t13.9\t11.7\t21502\t102929\t0.2354\t27055\tRomney\t27055\t0.009186928\t27055.0\n15841\t-80.710774\t36.233738\tBoonville town\tNC\tNorth Carolina\tYadkin County\t1244\t41.3\t12.6\t9.7\t20210\t97206\t0.2354\t27011\tRomney\t27011\t0.003727508\t27011.0\n15842\t-80.831405\t36.227539\tArlington town\tNC\tNorth Carolina\tYadkin County\t793\t38.1\t11.0\t10.0\t15911\t87143\t0.2354\t28642\tRomney\t28642\t0.002376136\t28642.0\n15843\t-80.838746\t36.236331\tJonesville town\tNC\tNorth Carolina\tYadkin County\t1411\t42.4\t11.2\t12.9\t18822\t77951\t0.2354\t28642\tRomney\t28642\t0.004227905\t28642.0\n15844\t-80.50843499999999\t36.216454999999996\tEast Bend town\tNC\tNorth Carolina\tYadkin County\t697\t39.0\t11.5\t10.7\t20255\t86389\t0.2354\t27018\tRomney\t27018\t0.002088483\t27018.0\n15845\t-82.29748599999999\t35.91643\tBurnsville town\tNC\tNorth Carolina\tYancey County\t1784\t44.3\t16.9\t14.3\t17770\t136017\t0.4212\t28714\tRomney\t28714\t0.005345558\t28714.0\n15846\t-102.470984\t45.973881\tHaynes city\tND\tNorth Dakota\tAdams County\t19\t50.0\t14.3\t0.0\t20271\t70000\t0.2551\t58639\tRomney\t58639\t0.000116184\t58639.0\n15847\t-102.635059\t46.003425\tHettinger city\tND\tNorth Dakota\tAdams County\t1070\t49.9\t22.3\t1.3\t20780\t68529\t0.2551\t58639\tRomney\t58639\t0.006542981999999999\t58639.0\n15848\t-102.78832299999999\t46.064655\tBucyrus city\tND\tNorth Dakota\tAdams County\t27\t43.8\t18.2\t0.0\t22636\t35000\t0.2551\t58649\tRomney\t58649\t0.000165103\t58649.0\n15849\t-102.94226\t46.107158\tReeder city\tND\tNorth Dakota\tAdams County\t191\t47.9\t17.6\t1.7\t22263\t45833\t0.2551\t58649\tRomney\t58649\t0.001167953\t58649.0\n15850\t-97.795917\t47.207079\tPillsbury city\tND\tNorth Dakota\tBarnes County\t22\t42.5\t29.4\t0.0\t21982\t100000\t0.4335\t58046\tRomney\t58046\t0.00013452899999999999\t58046.0\n15851\t-98.315279\t47.104844\tLeal city\tND\tNorth Dakota\tBarnes County\t32\t42.5\t21.7\t5.6\t17194\t45000\t0.4335\t58479\tRomney\t58479\t0.000195678\t58479.0\n15852\t-98.200723\t47.188365000000005\tDazey city\tND\tNorth Dakota\tBarnes County\t80\t45.0\t21.8\t4.5\t17390\t48333\t0.4335\t58429\tRomney\t58429\t0.000489195\t58429.0\n15853\t-98.004572\t46.922424\tValley City\tND\tNorth Dakota\tBarnes County\t6371\t42.6\t29.2\t3.8\t21847\t90336\t0.4335\t58072\tRomney\t58072\t0.038958259\t58072.0\n15854\t-97.790909\t46.931553\tOriska city\tND\tNorth Dakota\tBarnes County\t126\t42.3\t26.5\t4.1\t20956\t110000\t0.4335\t58063\tRomney\t58063\t0.000770482\t58063.0\n15855\t-97.97084100000001\t46.681764\tKathryn city\tND\tNorth Dakota\tBarnes County\t59\t45.0\t17.1\t3.2\t17181\t51667\t0.4335\t58049\tRomney\t58049\t0.00036078099999999996\t58049.0\n15856\t-98.223955\t46.942087\tSanborn city\tND\tNorth Dakota\tBarnes County\t179\t42.5\t25.2\t6.2\t18512\t75000\t0.4335\t58480\tRomney\t58480\t0.0010945739999999999\t58480.0\n15857\t-97.965325\t47.217889\tSibley city\tND\tNorth Dakota\tBarnes County\t40\t45.0\t21.4\t4.5\t17578\t45000\t0.4335\t58056\tRomney\t58056\t0.000244597\t58056.0\n15858\t-98.191817\t46.657593\tLitchville city\tND\tNorth Dakota\tBarnes County\t174\t46.1\t15.4\t2.4\t19334\t44167\t0.4335\t58461\tRomney\t58461\t0.001063999\t58461.0\n15859\t-97.79289399999999\t46.762578000000005\tFingal city\tND\tNorth Dakota\tBarnes County\t125\t43.3\t16.1\t3.1\t17126\t50000\t0.4335\t58062\tRomney\t58062\t0.000764367\t58062.0\n15860\t-98.45969699999999\t47.170556\tWimbledon city\tND\tNorth Dakota\tBarnes County\t208\t43.8\t22.1\t3.5\t17420\t49444\t0.4335\t58492\tRomney\t58492\t0.001271907\t58492.0\n15861\t-98.202949\t47.073995000000004\tRogers city\tND\tNorth Dakota\tBarnes County\t56\t42.5\t25.6\t6.5\t18613\t75000\t0.4335\t58479\tRomney\t58479\t0.000342436\t58479.0\n15862\t-97.812933\t46.677693\tNome city\tND\tNorth Dakota\tBarnes County\t66\t44.2\t17.4\t2.9\t17077\t53333\t0.4335\t58062\tRomney\t58062\t0.000403586\t58062.0\n15863\t-99.250556\t48.069959999999995\tMinnewaukan city\tND\tNorth Dakota\tBenson County\t321\t46.2\t19.3\t6.2\t18321\t53636\t0.5726\t58351\tRomney\t58351\t0.001962895\t58351.0\n15864\t-99.439639\t48.288846\tLeeds city\tND\tNorth Dakota\tBenson County\t457\t45.5\t16.3\t5.6\t19774\t70833\t0.5726\t58346\tRomney\t58346\t0.002794526\t58346.0\n15865\t-99.765134\t48.03324\tEsmond city\tND\tNorth Dakota\tBenson County\t147\t49.2\t11.1\t4.1\t20571\t51667\t0.5726\t58332\tRomney\t58332\t0.000898896\t58332.0\n15866\t-99.573639\t48.313108\tYork city\tND\tNorth Dakota\tBenson County\t26\t42.5\t11.8\t7.7\t19465\t80000\t0.5726\t58386\tRomney\t58386\t0.000158988\t58386.0\n15867\t-99.691187\t48.344038\tKnox city\tND\tNorth Dakota\tBenson County\t56\t44.0\t12.8\t4.3\t20308\t65000\t0.5726\t58343\tRomney\t58343\t0.000342436\t58343.0\n15868\t-99.205908\t47.924141\tOberon city\tND\tNorth Dakota\tBenson County\t80\t42.5\t14.3\t2.8\t19034\t38333\t0.5726\t58357\tRomney\t58357\t0.000489195\t58357.0\n15869\t-99.529351\t47.962439\tMaddock city\tND\tNorth Dakota\tBenson County\t498\t51.4\t13.0\t6.6\t15793\t49250\t0.5726\t58348\tRomney\t58348\t0.003045238\t58348.0\n15870\t-99.32395600000001\t48.183602\tBrinsmade city\tND\tNorth Dakota\tBenson County\t28\t42.5\t16.7\t0.0\t19994\t55000\t0.5726\t58351\tRomney\t58351\t0.000171218\t58351.0\n15871\t-98.705737\t47.854673\tWarwick city\tND\tNorth Dakota\tBenson County\t77\t24.6\t10.5\t3.6\t10287\t45000\t0.5726\t58381\tRomney\t58381\t0.00047085\t58381.0\n15872\t-98.993358\t47.9717\tFort Totten CDP\tND\tNorth Dakota\tBenson County\t993\t19.8\t4.4\t24.6\t6568\t60833\t0.5726\t58335\tRomney\t58335\t0.006072131999999999\t58335.0\n15873\t-103.524913\t46.912884999999996\tMedora city\tND\tNorth Dakota\tBillings County\t92\t45.3\t18.5\t1.7\t21596\t75000\t0.154\t58645\tRomney\t58645\t0.000562574\t58645.0\n15874\t-101.376121\t48.627086\tLansford city\tND\tNorth Dakota\tBottineau County\t236\t46.2\t17.0\t1.5\t18774\t60833\t0.3328\t58750\tRomney\t58750\t0.001443125\t58750.0\n15875\t-100.91264\t48.714079\tNewburg city\tND\tNorth Dakota\tBottineau County\t82\t45.7\t16.7\t2.1\t18785\t63333\t0.3328\t58762\tRomney\t58762\t0.000501425\t58762.0\n15876\t-100.682592\t48.910061\tSouris city\tND\tNorth Dakota\tBottineau County\t76\t47.5\t10.7\t2.3\t18806\t60000\t0.3328\t58783\tRomney\t58783\t0.000464735\t58783.0\n15877\t-101.28317\t48.97108\tAntler city\tND\tNorth Dakota\tBottineau County\t44\t50.0\t18.2\t0.0\t18679\t50000\t0.3328\t58711\tRomney\t58711\t0.000269057\t58711.0\n15878\t-100.707561\t48.691038\tKramer city\tND\tNorth Dakota\tBottineau County\t40\t46.3\t13.3\t4.3\t18926\t50000\t0.3328\t58748\tRomney\t58748\t0.000244597\t58748.0\n15879\t-101.142442\t48.722531\tMaxbass city\tND\tNorth Dakota\tBottineau County\t85\t46.6\t16.1\t2.1\t18762\t63333\t0.3328\t58760\tRomney\t58760\t0.00051977\t58760.0\n15880\t-101.017627\t48.911004999999996\tWesthope city\tND\tNorth Dakota\tBottineau County\t453\t53.1\t12.3\t2.9\t17987\t38654\t0.3328\t58793\tRomney\t58793\t0.002770066\t58793.0\n15881\t-100.151052\t48.681115999999996\tOverly city\tND\tNorth Dakota\tBottineau County\t17\t50.0\t16.7\t0.0\t17255\t25000\t0.3328\t58384\tRomney\t58384\t0.000103954\t58384.0\n15882\t-100.498511\t48.70127\tGardena city\tND\tNorth Dakota\tBottineau County\t35\t45.6\t8.0\t5.0\t18697\t70000\t0.3328\t58748\tRomney\t58748\t0.00021402299999999998\t58748.0\n15883\t-100.911986\t48.895889000000004\tLanda city\tND\tNorth Dakota\tBottineau County\t25\t41.3\t11.1\t0.0\t19276\t45000\t0.3328\t58793\tRomney\t58793\t0.00015287299999999998\t58793.0\n15884\t-100.444301\t48.825092\tBottineau city\tND\tNorth Dakota\tBottineau County\t2142\t45.3\t24.8\t2.3\t20519\t74275\t0.3328\t58318\tRomney\t58318\t0.013098193999999999\t58318.0\n15885\t-100.293298\t48.604506\tWillow City\tND\tNorth Dakota\tBottineau County\t197\t48.4\t16.0\t2.5\t17318\t30000\t0.3328\t58384\tRomney\t58384\t0.001204642\t58384.0\n15886\t-103.07876\t46.119043\tGascoyne city\tND\tNorth Dakota\tBowman County\t21\t42.5\t7.1\t0.0\t21091\t50000\t0.2383\t58653\tRomney\t58653\t0.000128414\t58653.0\n15887\t-103.40057900000001\t46.183452\tBowman city\tND\tNorth Dakota\tBowman County\t1603\t47.6\t19.7\t2.2\t22542\t95288\t0.2383\t58623\tRomney\t58623\t0.009802243\t58623.0\n15888\t-103.655141\t46.234617\tRhame city\tND\tNorth Dakota\tBowman County\t174\t44.2\t21.5\t1.8\t17229\t80000\t0.2383\t58651\tRomney\t58651\t0.001063999\t58651.0\n15889\t-103.142705\t46.146725\tScranton city\tND\tNorth Dakota\tBowman County\t276\t47.8\t10.8\t2.5\t21233\t57917\t0.2383\t58653\tRomney\t58653\t0.0016877220000000002\t58653.0\n15890\t-102.547431\t48.995687\tPortal city\tND\tNorth Dakota\tBurke County\t124\t53.8\t16.7\t1.4\t17892\t22500\t0.2248\t58772\tRomney\t58772\t0.000758252\t58772.0\n15891\t-102.643383\t48.563167\tPowers Lake city\tND\tNorth Dakota\tBurke County\t293\t47.1\t12.6\t1.3\t19323\t74286\t0.2248\t58773\tRomney\t58773\t0.001791676\t58773.0\n15892\t-102.393253\t48.897434999999994\tFlaxton city\tND\tNorth Dakota\tBurke County\t69\t53.6\t16.1\t2.4\t17918\t25000\t0.2248\t58737\tRomney\t58737\t0.000421931\t58737.0\n15893\t-102.56431500000001\t48.877447\tLignite city\tND\tNorth Dakota\tBurke County\t156\t53.8\t14.4\t1.3\t16765\t40000\t0.2248\t58752\tRomney\t58752\t0.00095393\t58752.0\n15894\t-102.247518\t48.803545\tBowbells city\tND\tNorth Dakota\tBurke County\t376\t46.9\t17.8\t1.9\t16567\t74583\t0.2248\t58721\tRomney\t58721\t0.002299216\t58721.0\n15895\t-102.864098\t48.890797\tLarson city\tND\tNorth Dakota\tBurke County\t15\t55.0\t15.4\t0.0\t17010\t17500\t0.2248\t58727\tRomney\t58727\t9.17e-05\t58727.0\n15896\t-102.781313\t48.904964\tColumbus city\tND\tNorth Dakota\tBurke County\t135\t53.8\t14.5\t1.5\t16810\t41000\t0.2248\t58727\tRomney\t58727\t0.0008255160000000001\t58727.0\n15897\t-100.702709\t46.766766\tLincoln city\tND\tNorth Dakota\tBurleigh County\t2201\t31.2\t18.4\t4.1\t19669\t124402\t0.3255\t58504\tRomney\t58504\t0.013458975\t58504.0\n15898\t-100.527332\t47.156772\tRegan city\tND\tNorth Dakota\tBurleigh County\t45\t43.8\t18.2\t4.0\t19030\t55000\t0.3255\t58477\tRomney\t58477\t0.000275172\t58477.0\n15899\t-100.767822\t46.807414\tBismarck city\tND\tNorth Dakota\tBurleigh County\t59619\t38.1\t34.7\t3.8\t26895\t148815\t0.3255\t58505\tRomney\t58505\t0.36456639\t58505.0\n15900\t-100.283181\t47.142466\tWing city\tND\tNorth Dakota\tBurleigh County\t131\t43.8\t19.4\t4.2\t18863\t52000\t0.3255\t58494\tRomney\t58494\t0.000801057\t58494.0\n15901\t-97.550143\t46.920724\tBuffalo city\tND\tNorth Dakota\tCass County\t231\t45.9\t21.1\t2.3\t22073\t104375\t0.47\t58011\tRomney\t58011\t0.00141255\t58011.0\n15902\t-97.224171\t47.006828000000006\tAmenia city\tND\tNorth Dakota\tCass County\t125\t44.7\t22.7\t3.0\t23608\t145833\t0.47\t58004\tRomney\t58004\t0.000764367\t58004.0\n15903\t-97.490905\t47.041168\tAyr city\tND\tNorth Dakota\tCass County\t22\t41.3\t23.5\t0.0\t19377\t75000\t0.47\t58007\tRomney\t58007\t0.00013452899999999999\t58007.0\n15904\t-96.801713\t46.672022\tOxbow city\tND\tNorth Dakota\tCass County\t290\t42.9\t41.3\t1.7\t31393\t223864\t0.47\t58047\tRomney\t58047\t0.001773332\t58047.0\n15905\t-97.053023\t46.891321999999995\tMapleton city\tND\tNorth Dakota\tCass County\t701\t32.9\t20.5\t4.0\t21454\t126302\t0.47\t58059\tRomney\t58059\t0.00428657\t58059.0\n15906\t-96.968321\t47.144093\tGardner city\tND\tNorth Dakota\tCass County\t83\t45.7\t14.8\t3.9\t23735\t98333\t0.47\t58036\tRomney\t58036\t0.00050754\t58036.0\n15907\t-96.896976\t46.770767\tHorace city\tND\tNorth Dakota\tCass County\t1175\t31.9\t27.6\t3.9\t23925\t148174\t0.47\t58047\tRomney\t58047\t0.00718505\t58047.0\n15908\t-97.21284399999999\t46.897535\tCasselton city\tND\tNorth Dakota\tCass County\t2255\t36.0\t30.2\t2.8\t22945\t135434\t0.47\t58012\tRomney\t58012\t0.013789181000000001\t58012.0\n15909\t-96.801707\t46.950699\tNorth River city\tND\tNorth Dakota\tCass County\t74\t34.4\t62.8\t4.3\t39573\t308333\t0.47\t58102\tRomney\t58102\t0.000452505\t58102.0\n15910\t-97.570561\t47.157947\tPage city\tND\tNorth Dakota\tCass County\t218\t46.3\t21.3\t2.8\t19145\t78000\t0.47\t58064\tRomney\t58064\t0.001333056\t58064.0\n15911\t-97.555649\t46.7603\tAlice city\tND\tNorth Dakota\tCass County\t55\t46.0\t15.8\t3.6\t22542\t60000\t0.47\t58031\tRomney\t58031\t0.000336321\t58031.0\n15912\t-96.866638\t46.926876\tReile's Acres city\tND\tNorth Dakota\tCass County\t453\t40.4\t21.1\t3.0\t23442\t178977\t0.47\t58078\tRomney\t58078\t0.002770066\t58078.0\n15913\t-96.833342\t46.800231\tFrontier city\tND\tNorth Dakota\tCass County\t194\t31.8\t40.5\t6.9\t32670\t203125\t0.47\t58104\tRomney\t58104\t0.0011862980000000001\t58104.0\n15914\t-97.246189\t46.650906\tLeonard city\tND\tNorth Dakota\tCass County\t271\t42.9\t20.9\t2.6\t23381\t113636\t0.47\t58052\tRomney\t58052\t0.0016571479999999998\t58052.0\n15915\t-96.897865\t46.873752\tWest Fargo city\tND\tNorth Dakota\tCass County\t17385\t32.4\t27.0\t3.9\t27246\t150991\t0.47\t58078\tRomney\t58078\t0.10630816800000001\t58078.0\n15916\t-97.218532\t47.104288000000004\tArthur city\tND\tNorth Dakota\tCass County\t407\t45.2\t19.9\t3.1\t21798\t77500\t0.47\t58006\tRomney\t58006\t0.002488779\t58006.0\n15917\t-96.879663\t46.976062\tHarwood city\tND\tNorth Dakota\tCass County\t667\t39.0\t30.3\t3.1\t29060\t165441\t0.47\t58042\tRomney\t58042\t0.004078663\t58042.0\n15918\t-97.021226\t46.651602000000004\tKindred city\tND\tNorth Dakota\tCass County\t698\t35.8\t30.3\t5.5\t22932\t112500\t0.47\t58051\tRomney\t58051\t0.004268226\t58051.0\n15919\t-97.213326\t47.190542\tHunter city\tND\tNorth Dakota\tCass County\t330\t45.2\t19.7\t3.2\t21806\t77143\t0.47\t58048\tRomney\t58048\t0.002017929\t58048.0\n15920\t-97.00274\t47.239261\tGrandin city\tND\tNorth Dakota\tCass County\t187\t45.9\t14.8\t3.5\t23834\t100000\t0.47\t58038\tRomney\t58038\t0.001143493\t58038.0\n15921\t-96.834772\t46.817085\tPrairie Rose city\tND\tNorth Dakota\tCass County\t133\t32.3\t58.2\t1.4\t43867\t283333\t0.47\t58104\tRomney\t58104\t0.000813287\t58104.0\n15922\t-96.79472700000001\t46.786268\tBriarwood city\tND\tNorth Dakota\tCass County\t91\t39.5\t45.0\t3.8\t38376\t217857\t0.47\t58104\tRomney\t58104\t0.000556459\t58104.0\n15923\t-97.387814\t47.115237\tErie CDP\tND\tNorth Dakota\tCass County\t66\t45.0\t19.6\t3.1\t21745\t67500\t0.47\t58029\tRomney\t58029\t0.000403586\t58029.0\n15924\t-97.671595\t46.927102000000005\tTower City\tND\tNorth Dakota\tCass County\t278\t45.6\t21.0\t2.6\t22114\t104348\t0.47\t58071\tRomney\t58071\t0.001699952\t58071.0\n15925\t-97.068448\t46.713789\tDavenport city\tND\tNorth Dakota\tCass County\t277\t43.2\t20.7\t2.5\t23415\t113889\t0.47\t58021\tRomney\t58021\t0.0016938370000000001\t58021.0\n15926\t-97.345375\t46.904999\tWheatland CDP\tND\tNorth Dakota\tCass County\t91\t44.6\t22.2\t2.1\t23610\t134375\t0.47\t58079\tRomney\t58079\t0.000556459\t58079.0\n15927\t-96.94328\t47.050075\tArgusville city\tND\tNorth Dakota\tCass County\t152\t45.2\t15.5\t3.2\t23813\t97000\t0.47\t58005\tRomney\t58005\t0.00092947\t58005.0\n15928\t-96.820736\t46.875302000000005\tFargo city\tND\tNorth Dakota\tCass County\t96750\t31.2\t40.0\t4.1\t27590\t153761\t0.47\t58103\tRomney\t58103\t0.591620091\t58103.0\n15929\t-98.938053\t48.851815\tCalvin city\tND\tNorth Dakota\tCavalier County\t20\t48.8\t25.0\t0.0\t20120\t10000\t0.3954\t58323\tRomney\t58323\t0.000122299\t58323.0\n15930\t-98.148875\t48.669859\tOsnabrock city\tND\tNorth Dakota\tCavalier County\t141\t51.1\t14.5\t3.1\t18462\t45000\t0.3954\t58269\tRomney\t58269\t0.000862206\t58269.0\n15931\t-98.704882\t48.630205\tAlsen city\tND\tNorth Dakota\tCavalier County\t54\t45.0\t16.7\t5.0\t15798\t60000\t0.3954\t58311\tRomney\t58311\t0.00033020699999999995\t58311.0\n15932\t-98.524738\t48.641739\tLoma city\tND\tNorth Dakota\tCavalier County\t17\t27.5\t16.7\t0.0\t15518\t85000\t0.3954\t58311\tRomney\t58311\t0.000103954\t58311.0\n15933\t-98.37543199999999\t48.576294\tNekoma city\tND\tNorth Dakota\tCavalier County\t41\t51.7\t15.6\t0.0\t18604\t37500\t0.3954\t58355\tRomney\t58355\t0.000250712\t58355.0\n15934\t-98.93804899999999\t48.623749\tCalio city\tND\tNorth Dakota\tCavalier County\t19\t45.0\t21.4\t0.0\t15861\t85000\t0.3954\t58352\tRomney\t58352\t0.000116184\t58352.0\n15935\t-98.690278\t48.97291\tHannah city\tND\tNorth Dakota\tCavalier County\t16\t55.0\t25.0\t0.0\t19315\t11250\t0.3954\t58239\tRomney\t58239\t9.779999999999999e-05\t58239.0\n15936\t-98.994968\t48.945158\tSarles city\tND\tNorth Dakota\tCavalier County\t20\t48.8\t25.0\t0.0\t19536\t13750\t0.3954\t58372\tRomney\t58372\t0.000122299\t58372.0\n15937\t-98.832083\t48.66982\tMunich city\tND\tNorth Dakota\tCavalier County\t214\t45.1\t17.9\t3.8\t15708\t50000\t0.3954\t58352\tRomney\t58352\t0.001308596\t58352.0\n15938\t-98.04428\t48.627288\tMilton city\tND\tNorth Dakota\tCavalier County\t69\t50.0\t13.2\t3.2\t18424\t45000\t0.3954\t58260\tRomney\t58260\t0.000421931\t58260.0\n15939\t-98.600757\t48.895152\tWales city\tND\tNorth Dakota\tCavalier County\t24\t50.0\t26.3\t0.0\t19330\t17500\t0.3954\t58281\tRomney\t58281\t0.00014675799999999998\t58281.0\n15940\t-98.23099\t48.582466\tHove Mobile Park city\tND\tNorth Dakota\tCavalier County\t2\t0.0\t0.0\t0.0\t14798\t0\t0.3954\t58229\tRomney\t58229\t1.22e-05\t58229.0\n15941\t-98.373451\t48.761854\tLangdon city\tND\tNorth Dakota\tCavalier County\t1925\t50.2\t15.8\t3.2\t20330\t80000\t0.3954\t58249\tRomney\t58249\t0.011771252\t58249.0\n15942\t-98.125499\t46.008105\tLudden city\tND\tNorth Dakota\tDickey County\t27\t38.8\t11.1\t0.0\t17799\t75000\t0.3365\t58474\tRomney\t58474\t0.000165103\t58474.0\n15943\t-98.595187\t46.173374\tMonango city\tND\tNorth Dakota\tDickey County\t26\t43.8\t21.1\t0.0\t24262\t80000\t0.3365\t58436\tRomney\t58436\t0.000158988\t58436.0\n15944\t-98.087588\t46.13847\tOakes city\tND\tNorth Dakota\tDickey County\t1870\t43.7\t19.5\t4.9\t19035\t85795\t0.3365\t58474\tRomney\t58474\t0.011434931\t58474.0\n15945\t-98.525181\t46.005429\tEllendale city\tND\tNorth Dakota\tDickey County\t1398\t36.6\t28.1\t2.9\t15968\t53590\t0.3365\t58436\tRomney\t58436\t0.008548680999999999\t58436.0\n15946\t-98.78239\t45.942493\tForbes city\tND\tNorth Dakota\tDickey County\t60\t49.4\t18.6\t0.0\t24023\t70000\t0.3365\t58439\tRomney\t58439\t0.00036689599999999996\t58439.0\n15947\t-98.42657700000001\t46.163239000000004\tFullerton city\tND\tNorth Dakota\tDickey County\t77\t41.5\t20.8\t0.0\t18374\t78333\t0.3365\t58441\tRomney\t58441\t0.00047085\t58441.0\n15948\t-103.480999\t48.955991\tAmbrose city\tND\tNorth Dakota\tDivide County\t21\t53.8\t18.8\t0.0\t21840\t75000\t0.3313\t58833\tRomney\t58833\t0.000128414\t58833.0\n15949\t-103.01007800000001\t48.890115\tNoonan city\tND\tNorth Dakota\tDivide County\t140\t53.3\t16.4\t3.4\t18993\t52000\t0.3313\t58765\tRomney\t58765\t0.000856091\t58765.0\n15950\t-103.778406\t48.909883\tFortuna city\tND\tNorth Dakota\tDivide County\t29\t50.8\t13.6\t0.0\t21309\t60000\t0.3313\t58844\tRomney\t58844\t0.000177333\t58844.0\n15951\t-103.296761\t48.916672\tCrosby city\tND\tNorth Dakota\tDivide County\t992\t53.2\t16.8\t3.8\t18956\t54138\t0.3313\t58730\tRomney\t58730\t0.006066017\t58730.0\n15952\t-102.202811\t47.305716\tDodge city\tND\tNorth Dakota\tDunn County\t117\t50.3\t12.6\t3.1\t18428\t53333\t0.2498\t58625\tRomney\t58625\t0.000715448\t58625.0\n15953\t-102.75349399999999\t47.367092\tKilldeer city\tND\tNorth Dakota\tDunn County\t632\t46.4\t21.0\t1.9\t19342\t71000\t0.2498\t58640\tRomney\t58640\t0.00386464\t58640.0\n15954\t-102.338887\t47.35223\tHalliday city\tND\tNorth Dakota\tDunn County\t213\t49.1\t13.2\t3.4\t18382\t52500\t0.2498\t58636\tRomney\t58636\t0.001302481\t58636.0\n15955\t-102.623574\t47.352768\tDunn Center city\tND\tNorth Dakota\tDunn County\t116\t48.6\t11.4\t9.5\t16145\t71667\t0.2498\t58626\tRomney\t58626\t0.000709333\t58626.0\n15956\t-99.13486\t47.679072\tNew Rockford city\tND\tNorth Dakota\tEddy County\t1300\t48.2\t21.3\t3.0\t20686\t54250\t0.4201\t58356\tRomney\t58356\t0.007949417\t58356.0\n15957\t-99.117018\t47.827644\tSheyenne city\tND\tNorth Dakota\tEddy County\t282\t49.6\t16.7\t4.0\t20019\t48571\t0.4201\t58374\tRomney\t58374\t0.001724412\t58374.0\n15958\t-100.161956\t46.133679\tStrasburg city\tND\tNorth Dakota\tEmmons County\t497\t49.1\t17.5\t3.3\t17913\t55000\t0.2033\t58573\tRomney\t58573\t0.003039123\t58573.0\n15959\t-100.08981700000001\t46.563895\tBraddock city\tND\tNorth Dakota\tEmmons County\t39\t48.8\t17.2\t5.9\t17917\t55000\t0.2033\t58524\tRomney\t58524\t0.000238483\t58524.0\n15960\t-100.278706\t46.484303999999995\tHazelton city\tND\tNorth Dakota\tEmmons County\t215\t48.8\t17.5\t3.3\t17882\t55000\t0.2033\t58544\tRomney\t58544\t0.001314711\t58544.0\n15961\t-100.23318499999999\t46.26873\tLinton city\tND\tNorth Dakota\tEmmons County\t1309\t48.1\t20.2\t4.0\t18850\t68243\t0.2033\t58552\tRomney\t58552\t0.008004451999999999\t58552.0\n15962\t-99.998997\t46.028902\tHague city\tND\tNorth Dakota\tEmmons County\t82\t41.5\t11.1\t3.0\t16002\t75000\t0.2033\t58542\tRomney\t58542\t0.000501425\t58542.0\n15963\t-98.59121999999999\t47.576355\tMcHenry city\tND\tNorth Dakota\tFoster County\t66\t47.5\t17.0\t2.9\t21172\t50000\t0.3609\t58464\tRomney\t58464\t0.000403586\t58464.0\n15964\t-99.124064\t47.45027\tCarrington city\tND\tNorth Dakota\tFoster County\t2091\t43.0\t28.7\t2.1\t20197\t91571\t0.3609\t58421\tRomney\t58421\t0.012786332\t58421.0\n15965\t-98.804186\t47.552895\tGrace City\tND\tNorth Dakota\tFoster County\t66\t47.5\t17.0\t2.9\t21172\t45000\t0.3609\t58445\tRomney\t58445\t0.000403586\t58445.0\n15966\t-98.56615\t47.454951\tGlenfield city\tND\tNorth Dakota\tFoster County\t125\t45.0\t18.9\t3.1\t21097\t47500\t0.3609\t58443\tRomney\t58443\t0.000764367\t58443.0\n15967\t-104.0077\t46.914861\tBeach city\tND\tNorth Dakota\tGolden Valley County\t979\t43.4\t25.6\t3.7\t18019\t62647\t0.1746\t58621\tRomney\t58621\t0.0059865230000000005\t58621.0\n15968\t-103.839675\t46.919257\tSentinel Butte city\tND\tNorth Dakota\tGolden Valley County\t59\t45.5\t19.0\t2.6\t17988\t57500\t0.1746\t58654\tRomney\t58654\t0.00036078099999999996\t58654.0\n15969\t-103.983191\t46.734773\tGolva city\tND\tNorth Dakota\tGolden Valley County\t102\t46.4\t19.7\t3.0\t17793\t56667\t0.1746\t58632\tRomney\t58632\t0.000623724\t58632.0\n15970\t-97.10605799999999\t47.775529\tThompson city\tND\tNorth Dakota\tGrand Forks County\t1056\t35.4\t33.8\t3.6\t25675\t156944\t0.4673\t58278\tRomney\t58278\t0.006457373000000001\t58278.0\n15971\t-97.467663\t48.083709999999996\tGilby city\tND\tNorth Dakota\tGrand Forks County\t209\t44.0\t25.2\t4.8\t16052\t68889\t0.4673\t58235\tRomney\t58235\t0.001278022\t58235.0\n15972\t-97.569701\t47.736637\tNorthwood city\tND\tNorth Dakota\tGrand Forks County\t887\t51.7\t25.3\t3.6\t23162\t85577\t0.4673\t58267\tRomney\t58267\t0.005423949\t58267.0\n15973\t-97.644166\t48.151478999999995\tInkster city\tND\tNorth Dakota\tGrand Forks County\t88\t44.2\t24.6\t4.5\t15998\t68750\t0.4673\t58244\tRomney\t58244\t0.000538114\t58244.0\n15974\t-97.87172199999999\t47.998259999999995\tNiagara city\tND\tNorth Dakota\tGrand Forks County\t48\t45.0\t19.4\t0.0\t24964\t100000\t0.4673\t58266\tRomney\t58266\t0.00029351700000000003\t58266.0\n15975\t-97.36534499999999\t47.930258\tEmerado city\tND\tNorth Dakota\tGrand Forks County\t514\t39.5\t24.5\t5.3\t21897\t130435\t0.4673\t58204\tRomney\t58204\t0.003143077\t58204.0\n15976\t-97.386512\t47.954840999999995\tGrand Forks AFB CDP\tND\tNorth Dakota\tGrand Forks County\t3918\t21.9\t25.0\t10.2\t14566\t65000\t0.4673\t58204\tRomney\t58204\t0.023958321\t58204.0\n15977\t-97.075769\t47.913340000000005\tGrand Forks city\tND\tNorth Dakota\tGrand Forks County\t50668\t29.6\t35.6\t4.5\t24097\t141396\t0.4673\t58202\tRomney\t58202\t0.309831595\t58202.0\n15978\t-97.626899\t47.908659\tLarimore city\tND\tNorth Dakota\tGrand Forks County\t1330\t43.8\t21.6\t5.1\t18280\t90714\t0.4673\t58251\tRomney\t58251\t0.008132865\t58251.0\n15979\t-97.177926\t48.072679\tManvel city\tND\tNorth Dakota\tGrand Forks County\t359\t37.9\t20.7\t6.7\t23682\t107955\t0.4673\t58256\tRomney\t58256\t0.002195262\t58256.0\n15980\t-101.638639\t46.362684\tLeith city\tND\tNorth Dakota\tGrant County\t28\t41.3\t20.0\t0.0\t15035\t45000\t0.2364\t58529\tRomney\t58529\t0.000171218\t58529.0\n15981\t-101.951707\t46.375795000000004\tNew Leipzig city\tND\tNorth Dakota\tGrant County\t222\t51.6\t13.3\t0.0\t19149\t41667\t0.2364\t58562\tRomney\t58562\t0.001357516\t58562.0\n15982\t-101.846685\t46.40159\tElgin city\tND\tNorth Dakota\tGrant County\t804\t54.4\t14.8\t3.7\t17425\t46522\t0.2364\t58533\tRomney\t58533\t0.004916409\t58533.0\n15983\t-101.570578\t46.422312\tCarson city\tND\tNorth Dakota\tGrant County\t223\t44.5\t15.1\t1.8\t14738\t45556\t0.2364\t58529\tRomney\t58529\t0.0013636310000000001\t58529.0\n15984\t-98.125417\t47.445188\tCooperstown city\tND\tNorth Dakota\tGriggs County\t909\t48.8\t18.1\t1.7\t19677\t72368\t0.3991\t58425\tRomney\t58425\t0.005558476999999999\t58425.0\n15985\t-98.34563100000001\t47.560373\tBinford city\tND\tNorth Dakota\tGriggs County\t202\t49.6\t22.9\t5.0\t19328\t46111\t0.3991\t58416\tRomney\t58416\t0.001235217\t58416.0\n15986\t-98.18916800000001\t47.314440999999995\tHannaford city\tND\tNorth Dakota\tGriggs County\t167\t47.8\t19.7\t3.3\t21137\t57143\t0.3991\t58448\tRomney\t58448\t0.001021194\t58448.0\n15987\t-102.325463\t46.374078999999995\tMott city\tND\tNorth Dakota\tHettinger County\t858\t54.3\t17.1\t4.3\t18198\t48000\t0.2298\t58646\tRomney\t58646\t0.005246615\t58646.0\n15988\t-102.5581\t46.42221\tRegent city\tND\tNorth Dakota\tHettinger County\t176\t47.3\t13.6\t2.1\t16735\t58000\t0.2298\t58650\tRomney\t58650\t0.001076229\t58650.0\n15989\t-102.866846\t46.540826\tNew England city\tND\tNorth Dakota\tHettinger County\t534\t50.7\t15.9\t5.2\t23014\t61316\t0.2298\t58647\tRomney\t58647\t0.003265376\t58647.0\n15990\t-99.625587\t46.871134999999995\tTappen city\tND\tNorth Dakota\tKidder County\t203\t45.9\t9.0\t3.3\t16211\t51000\t0.2959\t58487\tRomney\t58487\t0.001241332\t58487.0\n15991\t-99.993549\t47.144422\tTuttle city\tND\tNorth Dakota\tKidder County\t86\t55.2\t22.7\t2.4\t21364\t50000\t0.2959\t58488\tRomney\t58488\t0.000525885\t58488.0\n15992\t-99.752517\t46.867781\tDawson city\tND\tNorth Dakota\tKidder County\t72\t45.0\t7.8\t3.1\t16317\t50000\t0.2959\t58428\tRomney\t58428\t0.000440275\t58428.0\n15993\t-99.780282\t47.142257\tRobinson city\tND\tNorth Dakota\tKidder County\t58\t55.6\t22.4\t3.6\t21210\t45000\t0.2959\t58478\tRomney\t58478\t0.000354666\t58478.0\n15994\t-99.917433\t46.856009\tSteele city\tND\tNorth Dakota\tKidder County\t678\t44.8\t20.0\t3.0\t18761\t87059\t0.2959\t58482\tRomney\t58482\t0.004145927\t58482.0\n15995\t-99.52040600000001\t47.119246000000004\tPettibone city\tND\tNorth Dakota\tKidder County\t81\t46.3\t10.3\t2.5\t16677\t81667\t0.2959\t58475\tRomney\t58475\t0.00049531\t58475.0\n15996\t-98.712885\t46.362838\tEdgeley city\tND\tNorth Dakota\tLaMoure County\t613\t50.6\t15.8\t2.5\t23482\t81389\t0.3373\t58433\tRomney\t58433\t0.003748456\t58433.0\n15997\t-98.488412\t46.378364000000005\tBerlin city\tND\tNorth Dakota\tLaMoure County\t34\t40.0\t8.7\t6.3\t15054\t55000\t0.3373\t58415\tRomney\t58415\t0.000207908\t58415.0\n15998\t-98.89775999999999\t46.525789\tJud city\tND\tNorth Dakota\tLaMoure County\t73\t51.1\t12.3\t2.7\t21151\t55000\t0.3373\t58454\tRomney\t58454\t0.00044639\t58454.0\n15999\t-98.296685\t46.357259\tLaMoure city\tND\tNorth Dakota\tLaMoure County\t911\t44.6\t15.5\t2.7\t20329\t75625\t0.3373\t58458\tRomney\t58458\t0.005570706999999999\t58458.0\n16000\t-98.33747199999999\t46.609119\tMarion city\tND\tNorth Dakota\tLaMoure County\t139\t51.3\t12.8\t4.2\t21325\t52500\t0.3373\t58466\tRomney\t58466\t0.000849976\t58466.0\n16001\t-98.948637\t46.301959000000004\tKulm city\tND\tNorth Dakota\tLaMoure County\t396\t49.9\t19.9\t3.0\t21750\t54615\t0.3373\t58456\tRomney\t58456\t0.002421515\t58456.0\n16002\t-98.071351\t46.366046999999995\tVerona city\tND\tNorth Dakota\tLaMoure County\t102\t49.3\t10.3\t0.0\t21612\t104167\t0.3373\t58490\tRomney\t58490\t0.000623724\t58490.0\n16003\t-98.468152\t46.536704\tDickey city\tND\tNorth Dakota\tLaMoure County\t56\t37.5\t7.9\t3.8\t14885\t85000\t0.3373\t58431\tRomney\t58431\t0.000342436\t58431.0\n16004\t-99.095614\t46.329202\tFredonia city\tND\tNorth Dakota\tLogan County\t48\t45.5\t15.6\t4.0\t19613\t40000\t0.2162\t58440\tRomney\t58440\t0.00029351700000000003\t58440.0\n16005\t-99.768302\t46.503933\tNapoleon city\tND\tNorth Dakota\tLogan County\t757\t54.8\t17.2\t2.3\t20649\t52750\t0.2162\t58561\tRomney\t58561\t0.004629007\t58561.0\n16006\t-99.14144300000001\t46.626451\tGackle city\tND\tNorth Dakota\tLogan County\t289\t57.0\t20.6\t3.0\t21129\t57857\t0.2162\t58442\tRomney\t58442\t0.0017672170000000002\t58442.0\n16007\t-100.728577\t48.581257\tUpham city\tND\tNorth Dakota\tMcHenry County\t154\t43.1\t6.4\t5.4\t19022\t67500\t0.3477\t58789\tRomney\t58789\t0.0009417\t58789.0\n16008\t-100.242082\t47.882802000000005\tAnamoose city\tND\tNorth Dakota\tMcHenry County\t261\t51.9\t15.0\t2.8\t20237\t42000\t0.3477\t58710\tRomney\t58710\t0.001595998\t58710.0\n16009\t-100.616256\t48.090989\tKarlsruhe city\tND\tNorth Dakota\tMcHenry County\t107\t44.6\t10.7\t4.5\t16087\t60000\t0.3477\t58744\tRomney\t58744\t0.000654298\t58744.0\n16010\t-100.845253\t48.266075\tGranville city\tND\tNorth Dakota\tMcHenry County\t295\t41.8\t15.2\t0.7\t17808\t79286\t0.3477\t58741\tRomney\t58741\t0.001803906\t58741.0\n16011\t-100.844761\t48.019282000000004\tVoltaire city\tND\tNorth Dakota\tMcHenry County\t49\t48.1\t13.9\t0.0\t20211\t106250\t0.3477\t58792\tRomney\t58792\t0.00029963200000000003\t58792.0\n16012\t-100.510109\t47.862097\tKief city\tND\tNorth Dakota\tMcHenry County\t12\t52.5\t12.5\t0.0\t15686\t67500\t0.3477\t58747\tRomney\t58747\t7.340000000000001e-05\t58747.0\n16013\t-100.374612\t47.922574\tDrake city\tND\tNorth Dakota\tMcHenry County\t298\t52.1\t14.8\t3.3\t20238\t41154\t0.3477\t58736\tRomney\t58736\t0.001822251\t58736.0\n16014\t-100.609645\t48.497427\tBantry city\tND\tNorth Dakota\tMcHenry County\t18\t46.3\t7.1\t0.0\t18268\t85000\t0.3477\t58713\tRomney\t58713\t0.00011006899999999999\t58713.0\n16015\t-100.40725\t48.347219\tTowner city\tND\tNorth Dakota\tMcHenry County\t534\t49.3\t18.8\t6.3\t19905\t54118\t0.3477\t58788\tRomney\t58788\t0.003265376\t58788.0\n16016\t-100.931196\t48.057856\tVelva city\tND\tNorth Dakota\tMcHenry County\t1030\t45.3\t15.0\t1.9\t17454\t95294\t0.3477\t58790\tRomney\t58790\t0.006298384000000001\t58790.0\n16017\t-100.719874\t48.003751\tBergen city\tND\tNorth Dakota\tMcHenry County\t11\t57.5\t14.3\t0.0\t19484\t0\t0.3477\t58792\tRomney\t58792\t6.73e-05\t58792.0\n16018\t-101.051911\t48.395844\tDeering city\tND\tNorth Dakota\tMcHenry County\t117\t42.1\t6.0\t5.4\t19061\t75000\t0.3477\t58731\tRomney\t58731\t0.000715448\t58731.0\n16019\t-100.53414000000001\t47.951741999999996\tBalfour city\tND\tNorth Dakota\tMcHenry County\t18\t45.0\t7.7\t0.0\t16077\t50000\t0.3477\t58712\tRomney\t58712\t0.00011006899999999999\t58712.0\n16020\t-99.37353900000001\t46.034725\tAshley city\tND\tNorth Dakota\tMcIntosh County\t787\t63.4\t8.7\t2.9\t17809\t45000\t0.3\t58413\tRomney\t58413\t0.004812455\t58413.0\n16021\t-99.35223\t46.284915999999996\tLehr city\tND\tNorth Dakota\tMcIntosh County\t111\t46.8\t11.4\t3.8\t18052\t46000\t0.3\t58460\tRomney\t58460\t0.000678758\t58460.0\n16022\t-99.554849\t46.255396000000005\tWishek city\tND\tNorth Dakota\tMcIntosh County\t1067\t57.1\t11.1\t1.8\t21334\t75000\t0.3\t58495\tRomney\t58495\t0.006524637\t58495.0\n16023\t-99.54986600000001\t45.997652\tVenturia city\tND\tNorth Dakota\tMcIntosh County\t23\t45.0\t6.7\t0.0\t17345\t32500\t0.3\t58489\tRomney\t58489\t0.000140644\t58489.0\n16024\t-99.832474\t45.973155\tZeeland city\tND\tNorth Dakota\tMcIntosh County\t139\t47.5\t10.0\t3.1\t17569\t48333\t0.3\t58581\tRomney\t58581\t0.000849976\t58581.0\n16025\t-103.273523\t47.802163\tWatford City\tND\tNorth Dakota\tMcKenzie County\t1417\t47.8\t23.1\t4.0\t19259\t82424\t0.2686\t58854\tRomney\t58854\t0.008664865\t58854.0\n16026\t-102.59403\t47.987044\tFour Bears Village CDP\tND\tNorth Dakota\tMcKenzie County\t396\t23.0\t29.1\t7.6\t11529\t73750\t0.2686\t58763\tRomney\t58763\t0.002421515\t58763.0\n16027\t-102.675308\t47.73583\tMandaree CDP\tND\tNorth Dakota\tMcKenzie County\t616\t21.4\t14.7\t16.3\t11058\t87500\t0.2686\t58757\tRomney\t58757\t0.0037668009999999997\t58757.0\n16028\t-103.641316\t47.838964000000004\tAlexander city\tND\tNorth Dakota\tMcKenzie County\t215\t49.6\t17.3\t4.6\t20914\t100000\t0.2686\t58831\tRomney\t58831\t0.001314711\t58831.0\n16029\t-103.438704\t47.808428\tArnegard city\tND\tNorth Dakota\tMcKenzie County\t103\t47.0\t16.7\t3.7\t17518\t76250\t0.2686\t58835\tRomney\t58835\t0.0006298380000000001\t58835.0\n16030\t-103.540451\t47.819376\tRawson city\tND\tNorth Dakota\tMcKenzie County\t6\t0.0\t20.0\t0.0\t20680\t0\t0.2686\t58835\tRomney\t58835\t3.6700000000000004e-05\t58835.0\n16031\t-101.421497\t47.652999\tGarrison city\tND\tNorth Dakota\tMcLean County\t1153\t53.0\t15.4\t4.6\t20028\t74583\t0.3382\t58540\tRomney\t58540\t0.007050521999999999\t58540.0\n16032\t-100.934359\t47.837259\tRuso city\tND\tNorth Dakota\tMcLean County\t6\t0.0\t20.0\t0.0\t19344\t0\t0.3382\t58778\tRomney\t58778\t3.6700000000000004e-05\t58778.0\n16033\t-100.89066700000001\t47.521629\tTurtle Lake city\tND\tNorth Dakota\tMcLean County\t514\t52.1\t26.0\t4.9\t22763\t55238\t0.3382\t58575\tRomney\t58575\t0.003143077\t58575.0\n16034\t-101.084289\t47.830189000000004\tBenedict city\tND\tNorth Dakota\tMcLean County\t54\t50.0\t15.0\t2.9\t18991\t104167\t0.3382\t58716\tRomney\t58716\t0.00033020699999999995\t58716.0\n16035\t-101.843463\t47.660253000000004\tWhite Shield CDP\tND\tNorth Dakota\tMcLean County\t391\t31.9\t19.5\t10.3\t10479\t92500\t0.3382\t58775\tRomney\t58775\t0.00239094\t58775.0\n16036\t-101.141589\t47.455201\tUnderwood city\tND\tNorth Dakota\tMcLean County\t700\t51.1\t15.2\t4.8\t19730\t68864\t0.3382\t58576\tRomney\t58576\t0.004280455\t58576.0\n16037\t-101.365229\t47.497073\tRiverdale city\tND\tNorth Dakota\tMcLean County\t245\t50.4\t23.0\t4.7\t22265\t84000\t0.3382\t58565\tRomney\t58565\t0.001498159\t58565.0\n16038\t-101.29155\t47.820571\tMax city\tND\tNorth Dakota\tMcLean County\t245\t48.5\t19.2\t1.9\t19265\t73333\t0.3382\t58759\tRomney\t58759\t0.001498159\t58759.0\n16039\t-101.027555\t47.292489\tWashburn city\tND\tNorth Dakota\tMcLean County\t1286\t43.6\t22.5\t2.8\t22214\t104383\t0.3382\t58577\tRomney\t58577\t0.007863808\t58577.0\n16040\t-100.710567\t47.490488\tMercer city\tND\tNorth Dakota\tMcLean County\t98\t47.5\t16.7\t3.3\t20752\t85000\t0.3382\t58559\tRomney\t58559\t0.0005992640000000001\t58559.0\n16041\t-100.780661\t47.160523\tWilton city\tND\tNorth Dakota\tMcLean County\t769\t45.3\t20.0\t3.8\t20527\t94063\t0.3382\t58579\tRomney\t58579\t0.004702385999999999\t58579.0\n16042\t-100.665849\t47.837025\tButte city\tND\tNorth Dakota\tMcLean County\t86\t51.4\t19.1\t3.7\t19813\t82500\t0.3382\t58723\tRomney\t58723\t0.000525885\t58723.0\n16043\t-101.221182\t47.542356\tColeharbor city\tND\tNorth Dakota\tMcLean County\t95\t50.6\t23.6\t5.2\t22299\t80000\t0.3382\t58531\tRomney\t58531\t0.000580919\t58531.0\n16044\t-101.625838\t47.299332\tHazen city\tND\tNorth Dakota\tMercer County\t2497\t43.8\t18.8\t3.7\t23975\t98722\t0.2617\t58545\tRomney\t58545\t0.015268996000000002\t58545.0\n16045\t-101.773553\t47.266185\tBeulah city\tND\tNorth Dakota\tMercer County\t2827\t45.1\t14.7\t5.0\t23351\t98594\t0.2617\t58523\tRomney\t58523\t0.017286925\t58523.0\n16046\t-102.065439\t47.290259999999996\tGolden Valley city\tND\tNorth Dakota\tMercer County\t169\t46.6\t8.7\t3.3\t18580\t57500\t0.2617\t58541\tRomney\t58541\t0.001033424\t58541.0\n16047\t-101.38303499999999\t47.318001\tStanton city\tND\tNorth Dakota\tMercer County\t278\t46.8\t11.9\t8.5\t25702\t58333\t0.2617\t58571\tRomney\t58571\t0.001699952\t58571.0\n16048\t-101.45689499999999\t47.511410999999995\tPick City\tND\tNorth Dakota\tMercer County\t165\t41.7\t11.6\t4.3\t24505\t104545\t0.2617\t58565\tRomney\t58565\t0.001008964\t58565.0\n16049\t-101.923388\t47.284658\tZap city\tND\tNorth Dakota\tMercer County\t191\t44.0\t6.5\t5.6\t20679\t57222\t0.2617\t58580\tRomney\t58580\t0.001167953\t58580.0\n16050\t-101.50187700000001\t46.728424\tAlmont city\tND\tNorth Dakota\tMorton County\t93\t45.3\t17.5\t2.3\t16330\t57500\t0.3283\t58520\tRomney\t58520\t0.000568689\t58520.0\n16051\t-102.044169\t46.90225\tHebron city\tND\tNorth Dakota\tMorton County\t838\t47.4\t15.1\t4.3\t16394\t32197\t0.3283\t58638\tRomney\t58638\t0.005124317\t58638.0\n16052\t-101.23265699999999\t46.45214\tFlasher city\tND\tNorth Dakota\tMorton County\t276\t43.3\t17.2\t3.9\t21347\t71250\t0.3283\t58535\tRomney\t58535\t0.0016877220000000002\t58535.0\n16053\t-101.41729699999999\t46.843733\tNew Salem city\tND\tNorth Dakota\tMorton County\t996\t46.6\t18.7\t5.6\t18261\t64583\t0.3283\t58563\tRomney\t58563\t0.0060904769999999995\t58563.0\n16054\t-101.83309799999999\t46.812146999999996\tGlen Ullin city\tND\tNorth Dakota\tMorton County\t908\t57.5\t14.2\t6.0\t19938\t46061\t0.3283\t58631\tRomney\t58631\t0.005552362\t58631.0\n16055\t-100.88644000000001\t46.828378\tMandan city\tND\tNorth Dakota\tMorton County\t17243\t38.1\t23.0\t4.1\t24092\t119307\t0.3283\t58554\tRomney\t58554\t0.10543984699999999\t58554.0\n16056\t-102.489339\t47.981887\tNew Town city\tND\tNorth Dakota\tMountrail County\t1408\t29.4\t19.5\t6.7\t14753\t71852\t0.4058\t58763\tRomney\t58763\t0.00860983\t58763.0\n16057\t-102.387578\t48.316831\tStanley city\tND\tNorth Dakota\tMountrail County\t1251\t47.3\t20.1\t1.6\t19214\t65000\t0.4058\t58784\tRomney\t58784\t0.007649785\t58784.0\n16058\t-102.229873\t48.338041\tPalermo city\tND\tNorth Dakota\tMountrail County\t73\t51.6\t16.1\t3.8\t18885\t65000\t0.4058\t58769\tRomney\t58769\t0.00044639\t58769.0\n16059\t-102.543622\t48.312862\tRoss city\tND\tNorth Dakota\tMountrail County\t45\t50.6\t29.4\t2.9\t20731\t90000\t0.4058\t58776\tRomney\t58776\t0.000275172\t58776.0\n16060\t-102.134287\t47.955489\tParshall city\tND\tNorth Dakota\tMountrail County\t990\t32.5\t19.5\t3.9\t12994\t64259\t0.4058\t58770\tRomney\t58770\t0.006053787\t58770.0\n16061\t-102.77180600000001\t48.379877\tWhite Earth city\tND\tNorth Dakota\tMountrail County\t73\t45.5\t11.8\t3.5\t16078\t56667\t0.4058\t58794\tRomney\t58794\t0.00044639\t58794.0\n16062\t-101.959266\t48.025863\tPlaza city\tND\tNorth Dakota\tMountrail County\t159\t51.3\t17.1\t3.5\t18811\t63000\t0.4058\t58771\tRomney\t58771\t0.000972275\t58771.0\n16063\t-98.000469\t48.013109\tPetersburg city\tND\tNorth Dakota\tNelson County\t184\t47.5\t14.7\t1.2\t21474\t75000\t0.4571\t58272\tRomney\t58272\t0.001125148\t58272.0\n16064\t-98.17555\t47.765168\tMcVille city\tND\tNorth Dakota\tNelson County\t439\t53.5\t26.5\t0.9\t19361\t59167\t0.4571\t58254\tRomney\t58254\t0.002684457\t58254.0\n16065\t-98.119941\t48.024632000000004\tMichigan City\tND\tNorth Dakota\tNelson County\t329\t49.9\t12.6\t3.3\t19294\t44091\t0.4571\t58259\tRomney\t58259\t0.002011814\t58259.0\n16066\t-98.438548\t47.825786\tTolna city\tND\tNorth Dakota\tNelson County\t182\t51.0\t17.6\t0.0\t17152\t61667\t0.4571\t58380\tRomney\t58380\t0.001112918\t58380.0\n16067\t-98.346852\t48.042571\tLakota city\tND\tNorth Dakota\tNelson County\t738\t52.9\t20.1\t1.8\t21021\t82000\t0.4571\t58344\tRomney\t58344\t0.004512823\t58344.0\n16068\t-97.989733\t47.679441\tAneta city\tND\tNorth Dakota\tNelson County\t271\t49.7\t12.4\t3.2\t19277\t43333\t0.4571\t58212\tRomney\t58212\t0.0016571479999999998\t58212.0\n16069\t-98.327841\t47.791827000000005\tPekin city\tND\tNorth Dakota\tNelson County\t72\t51.4\t16.4\t0.0\t17174\t65000\t0.4571\t58361\tRomney\t58361\t0.000440275\t58361.0\n16070\t-101.29897199999999\t47.114878999999995\tCenter city\tND\tNorth Dakota\tOliver County\t626\t48.8\t15.3\t4.9\t23237\t84348\t0.2774\t58530\tRomney\t58530\t0.00382795\t58530.0\n16071\t-97.86492700000001\t48.684129999999996\tMountain city\tND\tNorth Dakota\tPembina County\t128\t46.4\t18.7\t3.3\t18140\t72500\t0.3849\t58262\tRomney\t58262\t0.000782712\t58262.0\n16072\t-97.246963\t48.966387\tPembina city\tND\tNorth Dakota\tPembina County\t589\t42.0\t17.4\t2.5\t23671\t104276\t0.3849\t58271\tRomney\t58271\t0.003601698\t58271.0\n16073\t-97.551618\t48.983026\tNeche city\tND\tNorth Dakota\tPembina County\t409\t44.5\t13.7\t6.9\t23487\t65556\t0.3849\t58265\tRomney\t58265\t0.002501009\t58265.0\n16074\t-97.624459\t48.79401\tCavalier city\tND\tNorth Dakota\tPembina County\t1531\t44.8\t21.4\t5.7\t23735\t110714\t0.3849\t58220\tRomney\t58220\t0.009361968\t58220.0\n16075\t-97.668941\t48.598231\tCrystal city\tND\tNorth Dakota\tPembina County\t161\t46.5\t18.3\t2.6\t18101\t66667\t0.3849\t58222\tRomney\t58222\t0.000984505\t58222.0\n16076\t-97.17952\t48.563501\tDrayton city\tND\tNorth Dakota\tPembina County\t850\t43.5\t14.7\t2.8\t23835\t83333\t0.3849\t58225\tRomney\t58225\t0.005197696\t58225.0\n16077\t-97.667687\t48.687868\tCanton City\tND\tNorth Dakota\tPembina County\t41\t44.2\t22.6\t4.3\t24484\t115000\t0.3849\t58241\tRomney\t58241\t0.000250712\t58241.0\n16078\t-97.473585\t48.88016\tBathgate city\tND\tNorth Dakota\tPembina County\t62\t43.8\t13.3\t6.5\t23406\t61667\t0.3849\t58216\tRomney\t58216\t0.000379126\t58216.0\n16079\t-97.917784\t48.921134\tWalhalla city\tND\tNorth Dakota\tPembina County\t1027\t47.7\t14.2\t7.8\t20205\t79583\t0.3849\t58282\tRomney\t58282\t0.00628004\t58282.0\n16080\t-97.45194000000001\t48.807889\tHamilton city\tND\tNorth Dakota\tPembina County\t68\t43.1\t14.0\t5.9\t23596\t65000\t0.3849\t58238\tRomney\t58238\t0.000415816\t58238.0\n16081\t-97.44710400000001\t48.619365\tSt. Thomas city\tND\tNorth Dakota\tPembina County\t394\t45.9\t15.1\t5.6\t24942\t77500\t0.3849\t58276\tRomney\t58276\t0.002409285\t58276.0\n16082\t-99.99209499999999\t48.366624\tRugby city\tND\tNorth Dakota\tPierce County\t2628\t46.7\t22.6\t4.0\t19573\t95455\t0.303\t58368\tRomney\t58368\t0.016070053\t58368.0\n16083\t-100.036947\t48.166515000000004\tBalta city\tND\tNorth Dakota\tPierce County\t66\t46.7\t11.1\t3.1\t16358\t57500\t0.303\t58313\tRomney\t58313\t0.000403586\t58313.0\n16084\t-99.704272\t48.497844\tWolford city\tND\tNorth Dakota\tPierce County\t43\t45.6\t12.9\t5.0\t16515\t35000\t0.303\t58385\tRomney\t58385\t0.000262942\t58385.0\n16085\t-98.355761\t48.210535\tBrocket city\tND\tNorth Dakota\tRamsey County\t64\t42.5\t23.9\t2.9\t23220\t95000\t0.4329\t58321\tRomney\t58321\t0.000391356\t58321.0\n16086\t-98.654333\t48.539584999999995\tHampden city\tND\tNorth Dakota\tRamsey County\t52\t52.5\t14.6\t4.5\t19425\t32500\t0.4329\t58338\tRomney\t58338\t0.000317977\t58338.0\n16087\t-98.36842299999999\t48.303492999999996\tLawton city\tND\tNorth Dakota\tRamsey County\t36\t49.2\t17.2\t0.0\t19647\t30000\t0.4329\t58345\tRomney\t58345\t0.00022013799999999999\t58345.0\n16088\t-98.63861999999999\t48.071797\tCrary city\tND\tNorth Dakota\tRamsey County\t148\t43.5\t23.8\t3.7\t23026\t100000\t0.4329\t58327\tRomney\t58327\t0.000905011\t58327.0\n16089\t-98.878879\t48.452246\tStarkweather city\tND\tNorth Dakota\tRamsey County\t136\t47.3\t30.0\t3.9\t22643\t58333\t0.4329\t58377\tRomney\t58377\t0.0008316310000000001\t58377.0\n16090\t-98.45348\t48.412285\tEdmore city\tND\tNorth Dakota\tRamsey County\t221\t52.8\t15.1\t3.2\t19501\t34000\t0.4329\t58330\tRomney\t58330\t0.0013514010000000001\t58330.0\n16091\t-99.19436400000001\t48.268653\tChurchs Ferry city\tND\tNorth Dakota\tRamsey County\t67\t48.5\t30.6\t2.7\t22546\t57500\t0.4329\t58325\tRomney\t58325\t0.000409701\t58325.0\n16092\t-98.87598100000001\t48.112519\tDevils Lake city\tND\tNorth Dakota\tRamsey County\t6647\t39.2\t20.8\t6.5\t23223\t88148\t0.4329\t58301\tRomney\t58301\t0.040645982000000004\t58301.0\n16093\t-97.598733\t46.630607\tEnderlin city\tND\tNorth Dakota\tRansom County\t908\t46.9\t17.0\t7.5\t20882\t61818\t0.5538\t58027\tRomney\t58027\t0.005552362\t58027.0\n16094\t-97.93117099999999\t46.524582\tFort Ransom city\tND\tNorth Dakota\tRansom County\t67\t45.0\t14.9\t5.6\t22792\t114583\t0.5538\t58033\tRomney\t58033\t0.000409701\t58033.0\n16095\t-97.68400600000001\t46.438258000000005\tLisbon city\tND\tNorth Dakota\tRansom County\t2336\t46.4\t17.2\t5.8\t21801\t103759\t0.5538\t58054\tRomney\t58054\t0.014284491000000002\t58054.0\n16096\t-97.814926\t46.402288\tElliott city\tND\tNorth Dakota\tRansom County\t42\t46.9\t16.7\t4.5\t22857\t112500\t0.5538\t58033\tRomney\t58033\t0.000256827\t58033.0\n16097\t-97.492498\t46.587720000000004\tSheldon city\tND\tNorth Dakota\tRansom County\t133\t38.1\t13.3\t10.7\t19698\t100000\t0.5538\t58068\tRomney\t58068\t0.000813287\t58068.0\n16098\t-101.518263\t48.766348\tMohall city\tND\tNorth Dakota\tRenville County\t636\t50.3\t21.7\t1.5\t20171\t57500\t0.3114\t58761\tRomney\t58761\t0.0038891\t58761.0\n16099\t-101.58881099999999\t48.61528\tGrano city\tND\tNorth Dakota\tRenville County\t9\t0.0\t16.7\t0.0\t19160\t0\t0.3114\t587HH\tRomney\t587HH\t5.5e-05\t0.0\n16100\t-101.82713199999999\t48.730318\tTolley city\tND\tNorth Dakota\tRenville County\t58\t48.0\t18.2\t2.9\t18101\t60000\t0.3114\t58787\tRomney\t58787\t0.000354666\t58787.0\n16101\t-101.220518\t48.513053\tGlenburn city\tND\tNorth Dakota\tRenville County\t378\t42.2\t22.3\t1.0\t20866\t86071\t0.3114\t58740\tRomney\t58740\t0.002311446\t58740.0\n16102\t-101.63275\t48.961861999999996\tSherwood city\tND\tNorth Dakota\tRenville County\t233\t48.6\t17.9\t2.9\t18245\t62000\t0.3114\t58782\tRomney\t58782\t0.00142478\t58782.0\n16103\t-101.567934\t48.868349\tLoraine city\tND\tNorth Dakota\tRenville County\t17\t47.5\t15.4\t0.0\t18669\t45000\t0.3114\t58761\tRomney\t58761\t0.000103954\t58761.0\n16104\t-96.72679699999999\t46.446615\tAbercrombie city\tND\tNorth Dakota\tRichland County\t305\t40.5\t20.2\t5.2\t20398\t120833\t0.4201\t58001\tRomney\t58001\t0.0018650560000000001\t58001.0\n16105\t-96.937524\t46.550502\tWalcott city\tND\tNorth Dakota\tRichland County\t214\t38.9\t22.1\t5.8\t25869\t127885\t0.4201\t58077\tRomney\t58077\t0.001308596\t58077.0\n16106\t-96.871974\t46.470108\tColfax city\tND\tNorth Dakota\tRichland County\t94\t40.4\t20.0\t4.3\t20354\t125000\t0.4201\t58018\tRomney\t58018\t0.000574804\t58018.0\n16107\t-96.89559399999999\t46.071871\tHankinson city\tND\tNorth Dakota\tRichland County\t976\t48.0\t12.3\t5.0\t20254\t72778\t0.4201\t58041\tRomney\t58041\t0.005968178\t58041.0\n16108\t-96.97782099999999\t46.165575\tMantador city\tND\tNorth Dakota\tRichland County\t68\t43.1\t6.4\t5.7\t18728\t75000\t0.4201\t58058\tRomney\t58058\t0.000415816\t58058.0\n16109\t-97.131125\t46.264034\tWyndmere city\tND\tNorth Dakota\tRichland County\t489\t41.4\t17.7\t8.1\t19279\t83636\t0.4201\t58081\tRomney\t58081\t0.002990204\t58081.0\n16110\t-96.80623299999999\t46.574983\tChristine city\tND\tNorth Dakota\tRichland County\t173\t38.8\t22.8\t5.2\t25909\t126250\t0.4201\t58015\tRomney\t58015\t0.001057884\t58015.0\n16111\t-96.74000500000001\t46.303779999999996\tDwight city\tND\tNorth Dakota\tRichland County\t74\t42.9\t15.7\t7.1\t25597\t103125\t0.4201\t58075\tRomney\t58075\t0.000452505\t58075.0\n16112\t-96.80107199999999\t46.154692\tGreat Bend city\tND\tNorth Dakota\tRichland County\t111\t38.8\t20.6\t1.6\t21208\t120313\t0.4201\t58039\tRomney\t58039\t0.000678758\t58039.0\n16113\t-96.999352\t46.265884\tBarney city\tND\tNorth Dakota\tRichland County\t64\t40.4\t14.3\t6.9\t21456\t106250\t0.4201\t58008\tRomney\t58008\t0.000391356\t58008.0\n16114\t-97.145084\t46.073714\tLidgerwood city\tND\tNorth Dakota\tRichland County\t789\t45.9\t10.1\t5.8\t19212\t45000\t0.4201\t58053\tRomney\t58053\t0.004824685\t58053.0\n16115\t-96.61065\t46.271031\tWahpeton city\tND\tNorth Dakota\tRichland County\t7557\t30.3\t23.8\t6.7\t22370\t110411\t0.4201\t58075\tRomney\t58075\t0.046210574000000004\t58075.0\n16116\t-96.87593299999999\t46.268832\tMooreton city\tND\tNorth Dakota\tRichland County\t201\t43.1\t16.4\t6.2\t25635\t106250\t0.4201\t58061\tRomney\t58061\t0.001229102\t58061.0\n16117\t-96.603075\t46.054548\tFairmount city\tND\tNorth Dakota\tRichland County\t372\t44.2\t8.0\t4.7\t19750\t76667\t0.4201\t58030\tRomney\t58030\t0.002274756\t58030.0\n16118\t-99.615727\t48.856156\tRolla city\tND\tNorth Dakota\tRolette County\t1436\t39.2\t30.9\t10.1\t17898\t93276\t0.7366\t58367\tRomney\t58367\t0.008781049\t58367.0\n16119\t-99.710941\t48.942883\tSt. John city\tND\tNorth Dakota\tRolette County\t364\t28.5\t15.4\t16.0\t17499\t90833\t0.7366\t58369\tRomney\t58369\t0.002225837\t58369.0\n16120\t-99.865521\t48.798266999999996\tShell Valley CDP\tND\tNorth Dakota\tRolette County\t398\t23.2\t17.9\t25.9\t12394\t87500\t0.7366\t58316\tRomney\t58316\t0.002433745\t58316.0\n16121\t-99.617953\t48.635878999999996\tMylo city\tND\tNorth Dakota\tRolette County\t19\t43.8\t14.3\t11.1\t16617\t112500\t0.7366\t58353\tRomney\t58353\t0.000116184\t58353.0\n16122\t-99.841702\t48.660835\tRolette city\tND\tNorth Dakota\tRolette County\t534\t45.3\t28.1\t16.1\t20160\t82750\t0.7366\t58366\tRomney\t58366\t0.003265376\t58366.0\n16123\t-100.02208900000001\t48.863469\tEast Dunseith CDP\tND\tNorth Dakota\tRolette County\t220\t30.4\t16.7\t20.0\t12475\t90000\t0.7366\t58329\tRomney\t58329\t0.001345286\t58329.0\n16124\t-100.0625\t48.812896\tDunseith city\tND\tNorth Dakota\tRolette County\t740\t25.1\t18.3\t22.5\t11733\t65833\t0.7366\t58329\tRomney\t58329\t0.004525053\t58329.0\n16125\t-99.744985\t48.841669\tBelcourt CDP\tND\tNorth Dakota\tRolette County\t2445\t26.5\t15.8\t23.9\t11440\t95455\t0.7366\t58316\tRomney\t58316\t0.014951019\t58316.0\n16126\t-97.384446\t46.076091999999996\tCayuga city\tND\tNorth Dakota\tSargent County\t58\t45.0\t7.3\t3.7\t20859\t60000\t0.5356\t58013\tRomney\t58013\t0.000354666\t58013.0\n16127\t-97.50679000000001\t46.054248\tRutland city\tND\tNorth Dakota\tSargent County\t215\t46.7\t17.2\t5.3\t19142\t48750\t0.5356\t58067\tRomney\t58067\t0.001314711\t58067.0\n16128\t-97.61839499999999\t45.951696000000005\tHavana city\tND\tNorth Dakota\tSargent County\t92\t48.6\t16.2\t5.0\t19109\t47500\t0.5356\t58043\tRomney\t58043\t0.000562574\t58043.0\n16129\t-97.784504\t46.106804\tCogswell city\tND\tNorth Dakota\tSargent County\t167\t40.9\t10.9\t5.9\t22474\t63333\t0.5356\t58017\tRomney\t58017\t0.001021194\t58017.0\n16130\t-97.457301\t46.260852\tMilnor city\tND\tNorth Dakota\tSargent County\t658\t43.6\t12.0\t5.0\t21875\t75333\t0.5356\t58060\tRomney\t58060\t0.004023628\t58060.0\n16131\t-97.63653599999999\t46.103623\tForman city\tND\tNorth Dakota\tSargent County\t457\t48.3\t15.9\t4.2\t24023\t95000\t0.5356\t58032\tRomney\t58032\t0.002794526\t58032.0\n16132\t-97.66071099999999\t46.224854\tGwinner city\tND\tNorth Dakota\tSargent County\t676\t38.5\t13.0\t3.2\t25832\t100357\t0.5356\t58040\tRomney\t58040\t0.004133697\t58040.0\n16133\t-100.442767\t47.483922\tMcClusky city\tND\tNorth Dakota\tSheridan County\t344\t53.4\t13.3\t4.3\t17526\t39250\t0.1983\t58463\tRomney\t58463\t0.002103538\t58463.0\n16134\t-100.115098\t47.82652\tMartin city\tND\tNorth Dakota\tSheridan County\t91\t49.1\t11.8\t2.3\t14649\t75000\t0.1983\t58758\tRomney\t58758\t0.000556459\t58758.0\n16135\t-100.12480699999999\t47.475926\tGoodrich city\tND\tNorth Dakota\tSheridan County\t163\t51.4\t5.6\t2.9\t18446\t40000\t0.1983\t58444\tRomney\t58444\t0.000996735\t58444.0\n16136\t-100.795739\t46.387904\tSolen city\tND\tNorth Dakota\tSioux County\t94\t22.2\t11.4\t19.4\t7797\t53333\t0.7867\t58570\tRomney\t58570\t0.000574804\t58570.0\n16137\t-100.635777\t46.317219\tCannon Ball CDP\tND\tNorth Dakota\tSioux County\t945\t23.6\t10.0\t19.0\t8018\t57667\t0.7867\t58528\tRomney\t58528\t0.005778615\t58528.0\n16138\t-100.924398\t46.042018\tSelfridge city\tND\tNorth Dakota\tSioux County\t229\t34.1\t12.7\t8.2\t11720\t60000\t0.7867\t58568\tRomney\t58568\t0.00140032\t58568.0\n16139\t-100.63023000000001\t46.086572\tFort Yates city\tND\tNorth Dakota\tSioux County\t244\t23.1\t19.7\t29.5\t10234\t75000\t0.7867\t58538\tRomney\t58538\t0.0014920439999999999\t58538.0\n16140\t-103.319777\t46.48227\tAmidon city\tND\tNorth Dakota\tSlope County\t25\t43.8\t15.0\t0.0\t18265\t32500\t0.1899\t58620\tRomney\t58620\t0.00015287299999999998\t58620.0\n16141\t-103.93305500000001\t46.29606\tMarmarth city\tND\tNorth Dakota\tSlope County\t134\t48.5\t15.8\t1.1\t18345\t42000\t0.1899\t58643\tRomney\t58643\t0.0008194010000000001\t58643.0\n16142\t-102.422154\t46.901778\tTaylor city\tND\tNorth Dakota\tStark County\t148\t46.4\t22.6\t3.2\t18486\t78333\t0.2417\t58656\tRomney\t58656\t0.000905011\t58656.0\n16143\t-102.569547\t46.859207\tGladstone city\tND\tNorth Dakota\tStark County\t263\t43.1\t21.7\t2.6\t21169\t131667\t0.2417\t58630\tRomney\t58630\t0.001608228\t58630.0\n16144\t-102.3157\t46.884283\tRichardton city\tND\tNorth Dakota\tStark County\t621\t47.8\t16.8\t3.1\t17226\t70278\t0.2417\t58652\tRomney\t58652\t0.003797375\t58652.0\n16145\t-102.989559\t46.867577000000004\tSouth Heart city\tND\tNorth Dakota\tStark County\t310\t39.0\t19.7\t2.5\t17615\t104167\t0.2417\t58655\tRomney\t58655\t0.00189563\t58655.0\n16146\t-102.785213\t46.885225\tDickinson city\tND\tNorth Dakota\tStark County\t16447\t36.9\t30.5\t3.4\t21694\t118793\t0.2417\t58601\tRomney\t58601\t0.100572358\t58601.0\n16147\t-103.19816800000001\t46.886241999999996\tBelfield city\tND\tNorth Dakota\tStark County\t851\t41.3\t12.8\t4.7\t16702\t59857\t0.2417\t58622\tRomney\t58622\t0.005203811\t58622.0\n16148\t-97.93490600000001\t47.251394\tLuverne city\tND\tNorth Dakota\tSteele County\t42\t43.8\t17.2\t4.3\t22986\t37500\t0.4971\t58056\tRomney\t58056\t0.000256827\t58056.0\n16149\t-97.899697\t47.597408\tSharon city\tND\tNorth Dakota\tSteele County\t105\t46.8\t19.0\t3.5\t21784\t68750\t0.4971\t58277\tRomney\t58277\t0.000642068\t58277.0\n16150\t-97.83758900000001\t47.512454\tFinley city\tND\tNorth Dakota\tSteele County\t498\t47.1\t19.2\t3.7\t21702\t71000\t0.4971\t58230\tRomney\t58230\t0.003045238\t58230.0\n16151\t-97.719316\t47.324309\tHope city\tND\tNorth Dakota\tSteele County\t291\t43.7\t17.6\t2.6\t22856\t49545\t0.4971\t58046\tRomney\t58046\t0.001779446\t58046.0\n16152\t-98.732185\t47.299956\tKensal city\tND\tNorth Dakota\tStutsman County\t173\t47.0\t11.1\t2.7\t21718\t71667\t0.3751\t58455\tRomney\t58455\t0.001057884\t58455.0\n16153\t-99.304198\t47.142329\tWoodworth city\tND\tNorth Dakota\tStutsman County\t70\t46.9\t15.1\t4.5\t23862\t75000\t0.3751\t58496\tRomney\t58496\t0.00042804599999999996\t58496.0\n16154\t-98.568567\t47.224363000000004\tCourtenay city\tND\tNorth Dakota\tStutsman County\t57\t47.5\t9.8\t2.7\t21687\t65000\t0.3751\t58426\tRomney\t58426\t0.000348551\t58426.0\n16155\t-99.357185\t46.657422\tStreeter city\tND\tNorth Dakota\tStutsman County\t159\t48.3\t12.8\t2.2\t23160\t49375\t0.3751\t58483\tRomney\t58483\t0.000972275\t58483.0\n16156\t-99.299921\t46.895264000000005\tMedina city\tND\tNorth Dakota\tStutsman County\t309\t47.4\t15.5\t4.0\t18657\t60000\t0.3751\t58467\tRomney\t58467\t0.001889515\t58467.0\n16157\t-98.69400999999999\t46.90692\tJamestown city\tND\tNorth Dakota\tStutsman County\t14561\t40.8\t28.0\t3.5\t21822\t96883\t0.3751\t58401\tRomney\t58401\t0.089039588\t58401.0\n16158\t-98.829263\t47.062582\tBuchanan city\tND\tNorth Dakota\tStutsman County\t69\t43.3\t18.4\t2.2\t24480\t118750\t0.3751\t58420\tRomney\t58420\t0.000421931\t58420.0\n16159\t-98.5867\t47.073986\tSpiritwood Lake city\tND\tNorth Dakota\tStutsman County\t67\t42.9\t19.1\t2.1\t19124\t125000\t0.3751\t58426\tRomney\t58426\t0.000409701\t58426.0\n16160\t-98.909109\t47.163888\tPingree city\tND\tNorth Dakota\tStutsman County\t58\t44.0\t15.9\t2.9\t23771\t80000\t0.3751\t58476\tRomney\t58476\t0.000354666\t58476.0\n16161\t-99.119916\t46.890467\tCleveland city\tND\tNorth Dakota\tStutsman County\t103\t47.2\t15.8\t3.4\t18713\t57500\t0.3751\t58424\tRomney\t58424\t0.0006298380000000001\t58424.0\n16162\t-98.587695\t46.698692\tMontpelier city\tND\tNorth Dakota\tStutsman County\t102\t41.9\t18.1\t2.9\t22101\t83333\t0.3751\t58497\tRomney\t58497\t0.000623724\t58497.0\n16163\t-99.380781\t48.952267\tHansboro city\tND\tNorth Dakota\tTowner County\t8\t0.0\t25.0\t0.0\t21669\t5000\t0.4365\t58365\tRomney\t58365\t4.8899999999999996e-05\t58365.0\n16164\t-99.20303100000001\t48.487491999999996\tCando city\tND\tNorth Dakota\tTowner County\t1249\t49.0\t17.4\t0.8\t23041\t84432\t0.4365\t58324\tRomney\t58324\t0.007637555\t58324.0\n16165\t-99.378916\t48.626349\tBisbee city\tND\tNorth Dakota\tTowner County\t173\t46.3\t16.0\t2.9\t20954\t50000\t0.4365\t58317\tRomney\t58317\t0.001057884\t58317.0\n16166\t-99.19951400000001\t48.392389\tMaza city\tND\tNorth Dakota\tTowner County\t5\t0.0\t33.3\t0.0\t19868\t0\t0.4365\t58324\tRomney\t58324\t3.06e-05\t58324.0\n16167\t-99.246112\t48.790102000000005\tRocklake city\tND\tNorth Dakota\tTowner County\t161\t47.9\t13.8\t3.5\t20230\t47000\t0.4365\t58365\tRomney\t58365\t0.000984505\t58365.0\n16168\t-99.458028\t48.71488\tPerth city\tND\tNorth Dakota\tTowner County\t13\t52.5\t10.0\t0.0\t21723\t0\t0.4365\t58363\tRomney\t58363\t7.950000000000001e-05\t58363.0\n16169\t-99.097987\t48.627545\tEgeland city\tND\tNorth Dakota\tTowner County\t41\t49.2\t16.1\t6.7\t20075\t40000\t0.4365\t58331\tRomney\t58331\t0.000250712\t58331.0\n16170\t-97.108856\t47.674878\tReynolds city\tND\tNorth Dakota\tTraill County\t333\t39.2\t20.4\t5.1\t19348\t115132\t0.4619\t58275\tRomney\t58275\t0.002036274\t58275.0\n16171\t-97.063231\t47.402803999999996\tHillsboro city\tND\tNorth Dakota\tTraill County\t1597\t41.8\t16.8\t7.4\t23448\t99444\t0.4619\t58045\tRomney\t58045\t0.009765553\t58045.0\n16172\t-97.369359\t47.499253\tPortland city\tND\tNorth Dakota\tTraill County\t544\t45.5\t24.0\t3.9\t20085\t90500\t0.4619\t58257\tRomney\t58257\t0.003326525\t58257.0\n16173\t-97.410271\t47.348186\tClifford city\tND\tNorth Dakota\tTraill County\t47\t43.8\t24.2\t4.0\t22736\t90000\t0.4619\t58016\tRomney\t58016\t0.000287402\t58016.0\n16174\t-97.40888100000001\t47.270210999999996\tGalesburg city\tND\tNorth Dakota\tTraill County\t143\t44.1\t24.2\t3.9\t23017\t100000\t0.4619\t58035\tRomney\t58035\t0.000874436\t58035.0\n16175\t-97.32925999999999\t47.499190000000006\tMayville city\tND\tNorth Dakota\tTraill County\t2010\t37.3\t32.9\t4.5\t23700\t95106\t0.4619\t58257\tRomney\t58257\t0.012291021999999999\t58257.0\n16176\t-97.09993100000001\t47.602328\tBuxton city\tND\tNorth Dakota\tTraill County\t333\t42.2\t19.2\t4.3\t23939\t102000\t0.4619\t58218\tRomney\t58218\t0.002036274\t58218.0\n16177\t-97.45872800000001\t47.636942\tHatton city\tND\tNorth Dakota\tTraill County\t665\t45.4\t18.4\t6.8\t18087\t87400\t0.4619\t58240\tRomney\t58240\t0.0040664329999999995\t58240.0\n16178\t-97.406515\t48.414719\tGrafton city\tND\tNorth Dakota\tWalsh County\t4103\t41.9\t17.6\t7.4\t22354\t94041\t0.4168\t58237\tRomney\t58237\t0.025089583999999998\t58237.0\n16179\t-97.71091\t48.310978000000006\tPisek city\tND\tNorth Dakota\tWalsh County\t90\t46.9\t13.8\t7.1\t19477\t54167\t0.4168\t58273\tRomney\t58273\t0.000550344\t58273.0\n16180\t-97.79556099999999\t48.216570000000004\tFordville city\tND\tNorth Dakota\tWalsh County\t251\t47.0\t13.8\t6.8\t19352\t55769\t0.4168\t58231\tRomney\t58231\t0.001534849\t58231.0\n16181\t-97.67518299999999\t48.234446000000005\tConway city\tND\tNorth Dakota\tWalsh County\t22\t46.3\t13.3\t10.0\t19063\t55000\t0.4168\t58273\tRomney\t58273\t0.00013452899999999999\t58273.0\n16182\t-97.921329\t48.314510999999996\tLankin city\tND\tNorth Dakota\tWalsh County\t118\t45.8\t17.9\t5.9\t17520\t60000\t0.4168\t58250\tRomney\t58250\t0.0007215619999999999\t58250.0\n16183\t-98.073677\t48.420103000000005\tAdams city\tND\tNorth Dakota\tWalsh County\t171\t48.5\t16.3\t4.4\t21878\t45000\t0.4168\t58210\tRomney\t58210\t0.001045654\t58210.0\n16184\t-97.63779\t48.535027\tHoople city\tND\tNorth Dakota\tWalsh County\t257\t44.3\t24.2\t3.6\t20739\t78000\t0.4168\t58243\tRomney\t58243\t0.0015715389999999998\t58243.0\n16185\t-97.74361400000001\t48.395534999999995\tPark River city\tND\tNorth Dakota\tWalsh County\t1480\t47.0\t18.4\t6.6\t19435\t83690\t0.4168\t58270\tRomney\t58270\t0.009050106\t58270.0\n16186\t-97.470548\t48.216505\tForest River city\tND\tNorth Dakota\tWalsh County\t164\t41.3\t16.8\t8.8\t21948\t70000\t0.4168\t58233\tRomney\t58233\t0.00100285\t58233.0\n16187\t-98.231113\t48.489908\tFairdale city\tND\tNorth Dakota\tWalsh County\t43\t50.6\t15.6\t4.3\t21866\t45000\t0.4168\t58229\tRomney\t58229\t0.000262942\t58229.0\n16188\t-97.37315100000001\t48.292428\tMinto city\tND\tNorth Dakota\tWalsh County\t573\t41.6\t13.7\t7.5\t17833\t81818\t0.4168\t58261\tRomney\t58261\t0.0035038590000000002\t58261.0\n16189\t-97.340739\t48.205490000000005\tArdoch city\tND\tNorth Dakota\tWalsh County\t53\t41.7\t13.9\t7.4\t17885\t95000\t0.4168\t58213\tRomney\t58213\t0.000324092\t58213.0\n16190\t-97.862636\t48.495424\tEdinburg city\tND\tNorth Dakota\tWalsh County\t213\t48.3\t15.7\t4.5\t21801\t48333\t0.4168\t58227\tRomney\t58227\t0.001302481\t58227.0\n16191\t-101.67353299999999\t47.917694\tRyder city\tND\tNorth Dakota\tWard County\t88\t45.4\t15.9\t3.7\t19547\t60000\t0.3315\t58756\tRomney\t58756\t0.000538114\t58756.0\n16192\t-101.887419\t48.507752\tDonnybrook city\tND\tNorth Dakota\tWard County\t89\t46.3\t8.3\t2.3\t18935\t47500\t0.3315\t58734\tRomney\t58734\t0.000544229\t58734.0\n16193\t-102.072212\t48.673065\tKenmare city\tND\tNorth Dakota\tWard County\t974\t48.9\t19.5\t1.1\t20411\t62600\t0.3315\t58746\tRomney\t58746\t0.005955948000000001\t58746.0\n16194\t-101.13370400000001\t48.236470000000004\tSurrey city\tND\tNorth Dakota\tWard County\t834\t34.5\t19.5\t1.2\t18771\t105914\t0.3315\t58785\tRomney\t58785\t0.005099857\t58785.0\n16195\t-101.501549\t47.857948\tDouglas city\tND\tNorth Dakota\tWard County\t61\t46.3\t15.9\t2.7\t19626\t60000\t0.3315\t58735\tRomney\t58735\t0.00037301099999999997\t58735.0\n16196\t-101.424883\t48.276371999999995\tBurlington city\tND\tNorth Dakota\tWard County\t1096\t34.6\t20.6\t3.2\t17912\t100333\t0.3315\t58722\tRomney\t58722\t0.00670197\t58722.0\n16197\t-101.336903\t48.420519\tMinot AFB CDP\tND\tNorth Dakota\tWard County\t5995\t21.9\t26.8\t6.4\t12492\t150000\t0.3315\t58704\tRomney\t58704\t0.036659042999999995\t58704.0\n16198\t-101.56339200000001\t48.256413\tDes Lacs city\tND\tNorth Dakota\tWard County\t209\t35.5\t20.6\t3.0\t17919\t99375\t0.3315\t58722\tRomney\t58722\t0.001278022\t58722.0\n16199\t-101.735835\t48.315309\tBerthold city\tND\tNorth Dakota\tWard County\t470\t38.9\t19.1\t3.7\t15848\t88333\t0.3315\t58718\tRomney\t58718\t0.00287402\t58718.0\n16200\t-101.80448100000001\t47.960563\tMakoti city\tND\tNorth Dakota\tWard County\t139\t46.0\t16.0\t3.5\t19512\t62500\t0.3315\t58756\tRomney\t58756\t0.000849976\t58756.0\n16201\t-101.29603900000001\t48.234553999999996\tMinot city\tND\tNorth Dakota\tWard County\t36031\t35.4\t29.1\t3.8\t24196\t112678\t0.3315\t58701\tRomney\t58701\t0.22032727100000002\t58701.0\n16202\t-101.05319399999999\t48.089462\tSawyer city\tND\tNorth Dakota\tWard County\t361\t37.7\t16.3\t2.3\t18581\t97778\t0.3315\t58781\tRomney\t58781\t0.002207492\t58781.0\n16203\t-101.7153\t48.44304\tCarpio city\tND\tNorth Dakota\tWard County\t146\t45.0\t8.9\t2.8\t18989\t46667\t0.3315\t58725\tRomney\t58725\t0.000892781\t58725.0\n16204\t-99.410974\t47.554132\tCathay city\tND\tNorth Dakota\tWells County\t51\t47.0\t18.4\t4.3\t16705\t52500\t0.2829\t58422\tRomney\t58422\t0.000311862\t58422.0\n16205\t-99.93101999999999\t47.446825\tHurdsfield city\tND\tNorth Dakota\tWells County\t82\t46.6\t18.6\t5.3\t16867\t55000\t0.2829\t58451\tRomney\t58451\t0.000501425\t58451.0\n16206\t-99.51563399999999\t47.76283\tHamberg city\tND\tNorth Dakota\tWells County\t25\t45.0\t16.7\t0.0\t18897\t80000\t0.2829\t58438\tRomney\t58438\t0.00015287299999999998\t58438.0\n16207\t-99.70881899999999\t47.468456\tBowdon city\tND\tNorth Dakota\tWells County\t123\t48.3\t14.4\t4.2\t18473\t33333\t0.2829\t58418\tRomney\t58418\t0.0007521369999999999\t58418.0\n16208\t-99.626952\t47.649268\tFessenden city\tND\tNorth Dakota\tWells County\t509\t48.6\t19.5\t2.1\t20160\t47105\t0.2829\t58438\tRomney\t58438\t0.003112503\t58438.0\n16209\t-99.399249\t47.466245\tSykeston city\tND\tNorth Dakota\tWells County\t136\t47.5\t14.1\t3.8\t18387\t34167\t0.2829\t58486\tRomney\t58486\t0.0008316310000000001\t58486.0\n16210\t-99.931177\t47.775719\tHarvey city\tND\tNorth Dakota\tWells County\t1754\t50.5\t18.9\t2.9\t24906\t74310\t0.2829\t58341\tRomney\t58341\t0.010725598000000001\t58341.0\n16211\t-102.938535\t48.397581\tTioga city\tND\tNorth Dakota\tWilliams County\t1080\t49.2\t18.5\t2.4\t20342\t71607\t0.2367\t58852\tRomney\t58852\t0.006604131\t58852.0\n16212\t-103.163116\t48.342396\tRay city\tND\tNorth Dakota\tWilliams County\t516\t50.8\t15.8\t1.7\t20425\t67778\t0.2367\t58849\tRomney\t58849\t0.003155307\t58849.0\n16213\t-103.357639\t48.281613\tEpping city\tND\tNorth Dakota\tWilliams County\t81\t50.8\t15.6\t1.8\t19785\t87500\t0.2367\t58843\tRomney\t58843\t0.00049531\t58843.0\n16214\t-103.183591\t48.629777000000004\tWildrose city\tND\tNorth Dakota\tWilliams County\t117\t50.2\t20.0\t1.5\t20134\t34167\t0.2367\t58795\tRomney\t58795\t0.000715448\t58795.0\n16215\t-103.936737\t48.620022999999996\tGrenora city\tND\tNorth Dakota\tWilliams County\t198\t49.7\t11.8\t3.2\t21789\t59000\t0.2367\t58845\tRomney\t58845\t0.001210757\t58845.0\n16216\t-103.467685\t48.582491999999995\tAlamo city\tND\tNorth Dakota\tWilliams County\t46\t50.0\t18.9\t0.0\t20245\t37500\t0.2367\t58830\tRomney\t58830\t0.000281287\t58830.0\n16217\t-103.46164\t48.252076\tSpringbrook city\tND\tNorth Dakota\tWilliams County\t27\t50.6\t14.3\t0.0\t19518\t80000\t0.2367\t58843\tRomney\t58843\t0.000165103\t58843.0\n16218\t-103.631789\t48.162704999999995\tWilliston city\tND\tNorth Dakota\tWilliams County\t12796\t40.6\t22.5\t3.2\t21631\t105259\t0.2367\t588HH\tRomney\t588HH\t0.078246725\t0.0\n16219\t-83.544684\t38.790975\tWest Union village\tOH\tOhio\tAdams County\t2878\t42.0\t8.7\t12.8\t19816\t79803\t0.3586\t45693\tObama\t45693\t0.006461708\t45693.0\n16220\t-83.654279\t38.943477\tWinchester village\tOH\tOhio\tAdams County\t1123\t37.2\t9.4\t11.2\t18821\t92347\t0.3586\t45697\tObama\t45697\t0.002521368\t45697.0\n16221\t-83.614552\t38.886194\tCherry Fork village\tOH\tOhio\tAdams County\t132\t37.0\t8.1\t8.6\t18343\t94286\t0.3586\t45697\tObama\t45697\t0.000296367\t45697.0\n16222\t-83.606409\t38.690533\tManchester village\tOH\tOhio\tAdams County\t1963\t40.4\t8.2\t16.5\t16523\t65603\t0.3586\t45144\tObama\t45144\t0.004407343\t45144.0\n16223\t-83.409349\t38.94619\tPeebles village\tOH\tOhio\tAdams County\t1672\t39.8\t11.5\t20.4\t15741\t76351\t0.3586\t45660\tObama\t45660\t0.0037539879999999998\t45660.0\n16224\t-83.378691\t38.665469\tRome village\tOH\tOhio\tAdams County\t110\t43.1\t6.3\t18.2\t15344\t50000\t0.3586\t45684\tObama\t45684\t0.000246973\t45684.0\n16225\t-83.586119\t38.937287\tSeaman village\tOH\tOhio\tAdams County\t1066\t35.9\t11.0\t14.9\t15207\t82813\t0.3586\t45679\tObama\t45679\t0.0023933920000000003\t45679.0\n16226\t-84.084813\t40.830334\tCairo village\tOH\tOhio\tAllen County\t481\t37.4\t7.3\t11.9\t18537\t92500\t0.3714\t45820\tObama\t45820\t0.001079945\t45820.0\n16227\t-83.949085\t40.758629\tLafayette village\tOH\tOhio\tAllen County\t302\t41.0\t17.6\t13.9\t22808\t121875\t0.3714\t45850\tObama\t45850\t0.0006780530000000001\t45850.0\n16228\t-84.20036400000001\t40.786698\tElida village\tOH\tOhio\tAllen County\t1858\t42.7\t24.9\t8.3\t22904\t110448\t0.3714\t45807\tObama\t45807\t0.004171596\t45807.0\n16229\t-83.974141\t40.832759\tBeaverdam village\tOH\tOhio\tAllen County\t380\t41.9\t6.0\t8.6\t19396\t95000\t0.3714\t45808\tObama\t45808\t0.0008531789999999999\t45808.0\n16230\t-83.871209\t40.892809\tBluffton village\tOH\tOhio\tAllen County\t3633\t37.4\t33.1\t12.7\t23708\t121257\t0.3714\t45817\tObama\t45817\t0.00815684\t45817.0\n16231\t-84.11193399999999\t40.742754\tLima city\tOH\tOhio\tAllen County\t38514\t34.3\t11.4\t18.3\t17997\t64780\t0.3714\t45804\tObama\t45804\t0.086471936\t45804.0\n16232\t-83.920846\t40.707762\tHarrod village\tOH\tOhio\tAllen County\t541\t37.3\t3.1\t7.7\t19060\t95000\t0.3714\t45850\tObama\t45850\t0.001214657\t45850.0\n16233\t-84.131109\t40.681095\tFort Shawnee village\tOH\tOhio\tAllen County\t3771\t43.2\t13.6\t10.5\t26577\t100804\t0.3714\t45806\tObama\t45806\t0.008466679\t45806.0\n16234\t-84.328687\t40.846384\tDelphos city\tOH\tOhio\tAllen County\t6725\t36.7\t12.6\t11.5\t20849\t80553\t0.3714\t45833\tObama\t45833\t0.015099023\t45833.0\n16235\t-84.352594\t40.708278\tSpencerville village\tOH\tOhio\tAllen County\t2145\t39.2\t13.0\t12.9\t19028\t84610\t0.3714\t45887\tObama\t45887\t0.004815971\t45887.0\n16236\t-82.214649\t40.944969\tPolk village\tOH\tOhio\tAshland County\t405\t33.8\t9.2\t7.6\t18804\t123529\t0.3404\t44866\tObama\t44866\t0.000909309\t44866.0\n16237\t-82.21538699999999\t40.636798999999996\tLoudonville village\tOH\tOhio\tAshland County\t2978\t39.9\t16.1\t10.4\t22481\t91037\t0.3404\t44842\tObama\t44842\t0.006686229\t44842.0\n16238\t-82.19624300000001\t40.803758\tJeromesville village\tOH\tOhio\tAshland County\t519\t41.7\t17.5\t15.4\t22071\t113663\t0.3404\t44840\tObama\t44840\t0.001165263\t44840.0\n16239\t-82.25946400000001\t40.775234000000005\tHayesville village\tOH\tOhio\tAshland County\t377\t42.1\t24.3\t13.5\t20785\t110938\t0.3404\t44838\tObama\t44838\t0.000846443\t44838.0\n16240\t-82.313898\t40.657451\tPerrysville village\tOH\tOhio\tAshland County\t851\t39.4\t14.1\t12.8\t18690\t75192\t0.3404\t44864\tObama\t44864\t0.0019106720000000002\t44864.0\n16241\t-82.31832299999999\t40.867502\tAshland city\tOH\tOhio\tAshland County\t21617\t35.8\t23.9\t14.8\t21911\t107149\t0.3404\t44805\tObama\t44805\t0.048534659\t44805.0\n16242\t-82.357186\t40.949056\tBailey Lakes village\tOH\tOhio\tAshland County\t449\t32.0\t16.9\t9.4\t16128\t128125\t0.3404\t44874\tObama\t44874\t0.001008098\t44874.0\n16243\t-82.363737\t40.774575\tMifflin village\tOH\tOhio\tAshland County\t152\t45.0\t17.7\t16.1\t23455\t117308\t0.3404\t44843\tObama\t44843\t0.000341272\t44843.0\n16244\t-82.364727\t40.967316\tSavannah village\tOH\tOhio\tAshland County\t395\t39.9\t11.2\t11.8\t19589\t131250\t0.3404\t44874\tObama\t44874\t0.000886857\t44874.0\n16245\t-80.672123\t41.918775\tNorth Kingsville village\tOH\tOhio\tAshtabula County\t2755\t46.2\t17.3\t8.6\t23628\t114987\t0.5527\t44048\tObama\t44048\t0.006185548000000001\t44048.0\n16246\t-80.854443\t41.660262\tRock Creek village\tOH\tOhio\tAshtabula County\t624\t38.3\t11.2\t11.8\t20670\t105405\t0.5527\t44084\tObama\t44084\t0.00140101\t44084.0\n16247\t-80.945761\t41.85653\tGeneva-on-the-Lake village\tOH\tOhio\tAshtabula County\t1444\t38.3\t14.1\t17.2\t19197\t93611\t0.5527\t44041\tObama\t44041\t0.00324208\t44041.0\n16248\t-80.74566300000001\t41.878524\tEdgewood CDP\tOH\tOhio\tAshtabula County\t4518\t43.9\t14.4\t12.7\t24240\t89286\t0.5527\t44004\tObama\t44004\t0.010143849\t44004.0\n16249\t-80.82494399999999\t41.636339\tRoaming Shores village\tOH\tOhio\tAshtabula County\t1458\t42.8\t21.6\t12.5\t29587\t157986\t0.5527\t44085\tObama\t44085\t0.003273513\t44085.0\n16250\t-80.568598\t41.927595000000004\tConneaut city\tOH\tOhio\tAshtabula County\t11888\t40.2\t12.7\t14.6\t19323\t83197\t0.5527\t44030\tObama\t44030\t0.026691031\t44030.0\n16251\t-80.568722\t41.606637\tAndover village\tOH\tOhio\tAshtabula County\t1353\t43.7\t10.1\t12.5\t17584\t85000\t0.5527\t44003\tObama\t44003\t0.003037766\t44003.0\n16252\t-80.855864\t41.536226\tOrwell village\tOH\tOhio\tAshtabula County\t1599\t34.5\t11.1\t12.8\t17943\t111771\t0.5527\t44076\tObama\t44076\t0.003590087\t44076.0\n16253\t-80.945196\t41.799953\tGeneva city\tOH\tOhio\tAshtabula County\t6495\t40.2\t12.4\t12.8\t21587\t105194\t0.5527\t44041\tObama\t44041\t0.014582625\t44041.0\n16254\t-80.76854200000001\t41.737495\tJefferson village\tOH\tOhio\tAshtabula County\t3590\t41.5\t23.5\t12.8\t22697\t117075\t0.5527\t44047\tObama\t44047\t0.008060296\t44047.0\n16255\t-80.797957\t41.880403\tAshtabula city\tOH\tOhio\tAshtabula County\t19932\t36.5\t13.3\t16.4\t18514\t78977\t0.5527\t44004\tObama\t44004\t0.044751484\t44004.0\n16256\t-82.197905\t39.224045000000004\tAlbany village\tOH\tOhio\tAthens County\t836\t40.9\t26.0\t11.4\t23140\t99048\t0.6624\t45710\tObama\t45710\t0.0018769939999999999\t45710.0\n16257\t-82.126614\t39.400276\tChauncey village\tOH\tOhio\tAthens County\t1006\t37.2\t17.0\t15.9\t14918\t48919\t0.6624\t45719\tObama\t45719\t0.002258679\t45719.0\n16258\t-82.080617\t39.486158\tTrimble village\tOH\tOhio\tAthens County\t444\t38.3\t4.8\t13.8\t14478\t48611\t0.6624\t45782\tObama\t45782\t0.000996872\t45782.0\n16259\t-82.084128\t39.502275\tGlouster village\tOH\tOhio\tAthens County\t1893\t35.4\t5.7\t16.2\t15029\t47889\t0.6624\t45732\tObama\t45732\t0.004250179000000001\t45732.0\n16260\t-81.797435\t39.220309\tCoolville village\tOH\tOhio\tAthens County\t494\t44.1\t5.0\t12.6\t17522\t70000\t0.6624\t45723\tObama\t45723\t0.001109133\t45723.0\n16261\t-81.954962\t39.401462\tAmesville village\tOH\tOhio\tAthens County\t179\t39.0\t15.7\t15.3\t15065\t77000\t0.6624\t45711\tObama\t45711\t0.000401892\t45711.0\n16262\t-82.098668\t39.323190999999994\tAthens city\tOH\tOhio\tAthens County\t22079\t22.5\t68.2\t11.1\t16978\t123415\t0.6624\t45701\tObama\t45701\t0.049571945\t45701.0\n16263\t-82.134396\t39.365462\tThe Plains CDP\tOH\tOhio\tAthens County\t3171\t37.9\t29.9\t9.0\t21788\t89459\t0.6624\t45780\tObama\t45780\t0.007119554\t45780.0\n16264\t-82.07990600000001\t39.476014\tJacksonville village\tOH\tOhio\tAthens County\t509\t40.8\t4.7\t11.8\t14088\t49200\t0.6624\t45740\tObama\t45740\t0.001142811\t45740.0\n16265\t-82.173599\t39.467653999999996\tBuchtel village\tOH\tOhio\tAthens County\t545\t36.8\t12.5\t15.4\t17882\t63529\t0.6624\t45716\tObama\t45716\t0.001223638\t45716.0\n16266\t-82.22178199999999\t39.455751\tNelsonville city\tOH\tOhio\tAthens County\t5010\t31.3\t9.4\t14.3\t15500\t63889\t0.6624\t45764\tObama\t45764\t0.011248491999999999\t45764.0\n16267\t-84.378438\t40.434805\tNew Bremen village\tOH\tOhio\tAuglaize County\t2908\t36.7\t19.2\t6.7\t25494\t123575\t0.2491\t45869\tObama\t45869\t0.006529065\t45869.0\n16268\t-84.145368\t40.65155\tCridersville village\tOH\tOhio\tAuglaize County\t1793\t38.1\t8.6\t14.6\t23188\t86638\t0.2491\t45806\tObama\t45806\t0.004025658\t45806.0\n16269\t-84.19102600000001\t40.567785\tWapakoneta city\tOH\tOhio\tAuglaize County\t9617\t36.6\t16.9\t9.6\t24711\t94534\t0.2491\t45895\tObama\t45895\t0.021592164\t45895.0\n16270\t-84.26040400000001\t40.623999\tBuckland village\tOH\tOhio\tAuglaize County\t269\t40.3\t16.0\t9.5\t23702\t118750\t0.2491\t45819\tObama\t45819\t0.000603961\t45819.0\n16271\t-84.316735\t40.494288\tNew Knoxville village\tOH\tOhio\tAuglaize County\t928\t34.1\t19.0\t9.3\t24472\t102985\t0.2491\t45871\tObama\t45871\t0.0020835529999999997\t45871.0\n16272\t-84.37882900000001\t40.396026\tMinster village\tOH\tOhio\tAuglaize County\t2798\t38.5\t26.0\t9.1\t25277\t145343\t0.2491\t45865\tObama\t45865\t0.0062820919999999995\t45865.0\n16273\t-84.393649\t40.546896999999994\tSt. Marys city\tOH\tOhio\tAuglaize County\t8292\t37.2\t16.1\t12.8\t23463\t95130\t0.2491\t45885\tObama\t45885\t0.018617263999999998\t45885.0\n16274\t-83.97357199999999\t40.602138000000004\tWaynesfield village\tOH\tOhio\tAuglaize County\t826\t33.4\t7.0\t16.7\t21046\t81711\t0.2491\t45896\tObama\t45896\t0.001854542\t45896.0\n16275\t-84.08627299999999\t40.602102\tUniopolis village\tOH\tOhio\tAuglaize County\t258\t42.5\t17.7\t8.8\t25413\t108750\t0.2491\t45888\tObama\t45888\t0.000579264\t45888.0\n16276\t-81.173214\t39.988781\tBarnesville village\tOH\tOhio\tBelmont County\t4044\t42.6\t7.6\t15.4\t17857\t67829\t0.4485\t43713\tObama\t43713\t0.009079621\t43713.0\n16277\t-80.817093\t40.032348\tNeffs CDP\tOH\tOhio\tBelmont County\t1070\t44.5\t5.6\t5.2\t15819\t78171\t0.4485\t43940\tObama\t43940\t0.0024023720000000003\t43940.0\n16278\t-81.041214\t40.028061\tBelmont village\tOH\tOhio\tBelmont County\t486\t40.6\t7.6\t11.9\t15587\t68750\t0.4485\t43718\tObama\t43718\t0.0010911710000000002\t43718.0\n16279\t-80.747445\t40.066817\tBridgeport village\tOH\tOhio\tBelmont County\t1987\t44.8\t11.5\t10.5\t18204\t61250\t0.4485\t43912\tObama\t43912\t0.004461228\t43912.0\n16280\t-80.746685\t40.017657\tBellaire city\tOH\tOhio\tBelmont County\t4486\t42.3\t6.1\t12.4\t14300\t59026\t0.4485\t43906\tObama\t43906\t0.010072003000000001\t43906.0\n16281\t-81.072932\t40.016408\tBethesda village\tOH\tOhio\tBelmont County\t1289\t41.2\t6.0\t9.9\t15548\t74286\t0.4485\t43719\tObama\t43719\t0.002894073\t43719.0\n16282\t-81.065382\t40.148559999999996\tFlushing village\tOH\tOhio\tBelmont County\t924\t42.7\t7.9\t9.9\t18201\t68469\t0.4485\t43977\tObama\t43977\t0.0020745720000000002\t43977.0\n16283\t-81.06849100000001\t39.865162\tWilson village\tOH\tOhio\tBelmont County\t120\t46.4\t11.1\t14.5\t18553\t79000\t0.4485\t43747\tObama\t43747\t0.000269425\t43747.0\n16284\t-80.7611\t40.070803999999995\tBrookside village\tOH\tOhio\tBelmont County\t584\t46.1\t8.8\t9.4\t20289\t73214\t0.4485\t43912\tObama\t43912\t0.0013112010000000001\t43912.0\n16285\t-81.070441\t40.062921\tMorristown village\tOH\tOhio\tBelmont County\t300\t43.8\t17.7\t10.6\t19949\t101250\t0.4485\t43719\tObama\t43719\t0.0006735619999999999\t43719.0\n16286\t-80.810304\t39.862356\tPowhatan Point village\tOH\tOhio\tBelmont County\t1626\t44.5\t8.2\t12.2\t21378\t75079\t0.4485\t43942\tObama\t43942\t0.003650708\t43942.0\n16287\t-81.131608\t40.161882\tHolloway village\tOH\tOhio\tBelmont County\t340\t47.6\t8.1\t8.9\t19541\t56250\t0.4485\t43977\tObama\t43977\t0.0007633710000000001\t43977.0\n16288\t-80.89921\t40.07994\tSt. Clairsville city\tOH\tOhio\tBelmont County\t4969\t49.5\t27.1\t7.2\t26079\t122840\t0.4485\t43950\tObama\t43950\t0.011156438000000001\t43950.0\n16289\t-80.704779\t40.161202\tYorkville village\tOH\tOhio\tBelmont County\t1104\t45.4\t14.4\t10.4\t21242\t69545\t0.4485\t43971\tObama\t43971\t0.00247871\t43971.0\n16290\t-80.72414\t40.101268\tMartins Ferry city\tOH\tOhio\tBelmont County\t6599\t45.4\t10.9\t8.2\t18762\t66522\t0.4485\t43935\tObama\t43935\t0.014816127\t43935.0\n16291\t-80.751237\t39.971303999999996\tShadyside village\tOH\tOhio\tBelmont County\t3438\t47.7\t13.5\t7.8\t21812\t79431\t0.4485\t43947\tObama\t43947\t0.007719025\t43947.0\n16292\t-83.76958\t38.670494\tAberdeen village\tOH\tOhio\tBrown County\t1639\t37.6\t9.5\t13.7\t18122\t70714\t0.3665\t45101\tObama\t45101\t0.0036798959999999998\t45101.0\n16293\t-83.803228\t39.020459\tSardinia village\tOH\tOhio\tBrown County\t926\t34.9\t9.5\t20.0\t20272\t91500\t0.3665\t45171\tObama\t45171\t0.002079063\t45171.0\n16294\t-83.839984\t38.739891\tRipley village\tOH\tOhio\tBrown County\t1679\t41.9\t11.8\t12.4\t19402\t89149\t0.3665\t45167\tObama\t45167\t0.003769704\t45167.0\n16295\t-83.93145600000001\t39.185974\tFayetteville village\tOH\tOhio\tBrown County\t406\t38.3\t15.4\t11.7\t24876\t128846\t0.3665\t45118\tObama\t45118\t0.000911554\t45118.0\n16296\t-83.967588\t38.790308\tHigginsport village\tOH\tOhio\tBrown County\t322\t36.9\t10.7\t18.9\t20061\t114583\t0.3665\t45131\tObama\t45131\t0.000722957\t45131.0\n16297\t-83.88892299999999\t39.214267\tSt. Martin village\tOH\tOhio\tBrown County\t100\t38.6\t15.9\t10.5\t26182\t140625\t0.3665\t45118\tObama\t45118\t0.000224521\t45118.0\n16298\t-83.984832\t38.918098\tHamersville village\tOH\tOhio\tBrown County\t526\t38.8\t7.9\t13.5\t21731\t104435\t0.3665\t45130\tObama\t45130\t0.001180979\t45130.0\n16299\t-83.899342\t38.864971000000004\tGeorgetown village\tOH\tOhio\tBrown County\t3902\t39.4\t14.3\t11.6\t21498\t99467\t0.3665\t45121\tObama\t45121\t0.008760801\t45121.0\n16300\t-83.931516\t39.032191\tMount Orab village\tOH\tOhio\tBrown County\t2988\t32.6\t10.9\t12.4\t19283\t102054\t0.3665\t45154\tObama\t45154\t0.006708681\t45154.0\n16301\t-83.78764100000001\t38.867134\tRussellville village\tOH\tOhio\tBrown County\t464\t39.9\t16.0\t15.3\t20037\t97667\t0.3665\t45168\tObama\t45168\t0.0010417760000000001\t45168.0\n16302\t-84.377084\t39.363448999999996\tWetherington CDP\tOH\tOhio\tButler County\t1552\t42.2\t56.0\t4.5\t72142\t363415\t0.3666\t45069\tObama\t45069\t0.003484563\t45069.0\n16303\t-84.461024\t39.480037\tTrenton city\tOH\tOhio\tButler County\t10671\t34.4\t10.1\t9.7\t24971\t124497\t0.3666\t45067\tObama\t45067\t0.023958612999999997\t45067.0\n16304\t-84.503196\t39.53822\tJacksonburg village\tOH\tOhio\tButler County\t73\t40.0\t20.0\t12.5\t22142\t156250\t0.3666\t45067\tObama\t45067\t0.0001639\t45067.0\n16305\t-84.639455\t39.563219000000004\tSomerville village\tOH\tOhio\tButler County\t322\t42.9\t12.6\t6.8\t23633\t161111\t0.3666\t45064\tObama\t45064\t0.000722957\t45064.0\n16306\t-84.403615\t39.335334\tOlde West Chester CDP\tOH\tOhio\tButler County\t230\t42.1\t41.8\t7.7\t28122\t140278\t0.3666\t45069\tObama\t45069\t0.000516398\t45069.0\n16307\t-84.652232\t39.392134999999996\tMillville village\tOH\tOhio\tButler County\t844\t43.0\t17.0\t7.4\t26350\t130556\t0.3666\t45013\tObama\t45013\t0.001894955\t45013.0\n16308\t-84.437761\t39.344449\tBeckett Ridge CDP\tOH\tOhio\tButler County\t8976\t34.7\t56.4\t10.2\t43135\t204953\t0.3666\t45069\tObama\t45069\t0.020152986\t45069.0\n16309\t-84.523847\t39.330241\tFairfield city\tOH\tOhio\tButler County\t44431\t36.6\t29.5\t9.7\t30071\t138691\t0.3666\t45014\tObama\t45014\t0.09975683199999999\t45014.0\n16310\t-84.324162\t39.447896\tMonroe city\tOH\tOhio\tButler County\t10760\t40.6\t23.7\t7.2\t30780\t139317\t0.3666\t45050\tObama\t45050\t0.024158437\t45050.0\n16311\t-84.41425699999999\t39.483561\tSouth Middletown CDP\tOH\tOhio\tButler County\t275\t36.9\t3.8\t17.9\t21324\t79250\t0.3666\t45044\tObama\t45044\t0.000617432\t45044.0\n16312\t-84.655924\t39.310571\tRoss CDP\tOH\tOhio\tButler County\t2077\t38.9\t17.6\t7.0\t24566\t125633\t0.3666\t45252\tObama\t45252\t0.004663297\t45252.0\n16313\t-84.539795\t39.431807\tNew Miami village\tOH\tOhio\tButler County\t2465\t35.2\t3.0\t16.4\t18039\t72748\t0.3666\t45011\tObama\t45011\t0.005534437\t45011.0\n16314\t-84.565414\t39.394033\tHamilton city\tOH\tOhio\tButler County\t64790\t36.5\t13.9\t13.8\t22636\t99960\t0.3666\t45015\tObama\t45015\t0.145467019\t45015.0\n16315\t-84.74665300000001\t39.505311\tOxford city\tOH\tOhio\tButler County\t22839\t22.4\t56.1\t12.4\t19385\t155698\t0.3666\t45056\tObama\t45056\t0.051278303\t45056.0\n16316\t-84.552577\t39.485706\tSeven Mile village\tOH\tOhio\tButler County\t698\t45.0\t9.0\t10.3\t23917\t108553\t0.3666\t45062\tObama\t45062\t0.001567155\t45062.0\n16317\t-84.320711\t39.503565\tMiddletown city\tOH\tOhio\tButler County\t51921\t38.3\t14.8\t14.1\t24297\t105455\t0.3666\t45005\tObama\t45005\t0.116573439\t45005.0\n16318\t-81.089765\t40.580171\tCarrollton village\tOH\tOhio\tCarroll County\t3047\t43.7\t14.8\t14.4\t21063\t101130\t0.418\t44615\tObama\t44615\t0.006841148000000001\t44615.0\n16319\t-81.181528\t40.68971\tMalvern village\tOH\tOhio\tCarroll County\t1133\t38.8\t10.2\t17.3\t16642\t81667\t0.418\t44644\tObama\t44644\t0.002543821\t44644.0\n16320\t-81.199251\t40.555018\tDellroy village\tOH\tOhio\tCarroll County\t318\t50.7\t20.0\t14.9\t23794\t100000\t0.418\t44620\tObama\t44620\t0.0007139760000000001\t44620.0\n16321\t-81.24425699999999\t40.494537\tSherrodsville village\tOH\tOhio\tCarroll County\t340\t44.9\t9.6\t7.7\t19573\t74333\t0.418\t44675\tObama\t44675\t0.0007633710000000001\t44675.0\n16322\t-81.209532\t40.451975\tLeesville village\tOH\tOhio\tCarroll County\t188\t45.2\t8.8\t14.8\t21776\t73750\t0.418\t44695\tObama\t44695\t0.000422099\t44695.0\n16323\t-83.56082099999999\t40.220729\tNorth Lewisburg village\tOH\tOhio\tChampaign County\t1747\t33.6\t8.1\t13.2\t23447\t99375\t0.3824\t43060\tObama\t43060\t0.003922378\t43060.0\n16324\t-83.958772\t40.128444\tSt. Paris village\tOH\tOhio\tChampaign County\t2102\t39.0\t12.7\t14.0\t22044\t110185\t0.3824\t43072\tObama\t43072\t0.004719427\t43072.0\n16325\t-83.52715699999999\t40.173946\tWoodstock village\tOH\tOhio\tChampaign County\t347\t41.0\t7.6\t16.4\t22081\t115833\t0.3824\t43084\tObama\t43084\t0.0007790869999999999\t43084.0\n16326\t-83.636931\t40.079506\tMutual village\tOH\tOhio\tChampaign County\t141\t43.0\t16.2\t9.6\t24374\t142188\t0.3824\t43044\tObama\t43044\t0.000316574\t43044.0\n16327\t-84.025293\t40.056540000000005\tChristiansburg village\tOH\tOhio\tChampaign County\t597\t42.6\t9.5\t9.2\t22453\t119000\t0.3824\t45389\tObama\t45389\t0.001340389\t45389.0\n16328\t-83.749579\t40.109919\tUrbana city\tOH\tOhio\tChampaign County\t11594\t37.8\t14.3\t15.4\t22944\t102095\t0.3824\t43078\tObama\t43078\t0.02603094\t43078.0\n16329\t-83.556883\t40.073576\tMechanicsburg village\tOH\tOhio\tChampaign County\t1692\t37.8\t10.0\t12.6\t21995\t102306\t0.3824\t43044\tObama\t43044\t0.0037988920000000003\t43044.0\n16330\t-84.02485899999999\t39.885919\tCrystal Lakes CDP\tOH\tOhio\tClark County\t1338\t39.5\t1.9\t21.5\t22862\t79250\t0.4879\t45341\tObama\t45341\t0.003004088\t45341.0\n16331\t-83.611154\t39.929041\tSouth Vienna village\tOH\tOhio\tClark County\t478\t40.9\t11.3\t4.9\t24581\t113393\t0.4879\t45369\tObama\t45369\t0.0010732089999999999\t45369.0\n16332\t-83.622796\t39.999774\tCatawba village\tOH\tOhio\tClark County\t322\t39.5\t15.8\t8.4\t25692\t132143\t0.4879\t43010\tObama\t43010\t0.000722957\t43010.0\n16333\t-83.932903\t39.865065\tEnon village\tOH\tOhio\tClark County\t2527\t47.6\t33.4\t9.8\t30999\t139919\t0.4879\t45323\tObama\t45323\t0.00567364\t45323.0\n16334\t-83.872948\t39.984617\tLawrenceville village\tOH\tOhio\tClark County\t305\t42.7\t28.0\t9.9\t27263\t133750\t0.4879\t45504\tObama\t45504\t0.000684788\t45504.0\n16335\t-84.027773\t39.943726\tNew Carlisle city\tOH\tOhio\tClark County\t5507\t37.7\t17.4\t13.2\t23160\t96913\t0.4879\t45344\tObama\t45344\t0.01236436\t45344.0\n16336\t-83.64184200000001\t39.825010999999996\tSouth Charleston village\tOH\tOhio\tClark County\t1826\t35.9\t13.9\t11.0\t20388\t101023\t0.4879\t45368\tObama\t45368\t0.00409975\t45368.0\n16337\t-84.039997\t39.888081\tPark Layne CDP\tOH\tOhio\tClark County\t4338\t32.9\t5.3\t14.0\t20877\t87074\t0.4879\t45341\tObama\t45341\t0.009739712\t45341.0\n16338\t-83.941502\t39.989881\tNorth Hampton village\tOH\tOhio\tClark County\t363\t41.5\t21.3\t8.1\t23486\t126786\t0.4879\t45349\tObama\t45349\t0.00081501\t45349.0\n16339\t-83.842747\t40.014661\tTremont City village\tOH\tOhio\tClark County\t353\t41.6\t22.4\t10.7\t26537\t132500\t0.4879\t45504\tObama\t45504\t0.0007925580000000001\t45504.0\n16340\t-83.96136899999999\t39.85479\tHoliday Valley CDP\tOH\tOhio\tClark County\t1712\t45.0\t27.8\t8.8\t29820\t120339\t0.4879\t45323\tObama\t45323\t0.0038437959999999996\t45323.0\n16341\t-83.94435899999999\t39.868472\tGreen Meadows CDP\tOH\tOhio\tClark County\t2194\t39.7\t19.5\t9.4\t24823\t108451\t0.4879\t45323\tObama\t45323\t0.004925985999999999\t45323.0\n16342\t-83.800872\t39.931176\tSpringfield city\tOH\tOhio\tClark County\t62257\t36.2\t15.8\t16.4\t21637\t80389\t0.4879\t45502\tObama\t45502\t0.13977990699999998\t45502.0\n16343\t-83.942994\t39.915271999999995\tDonnelsville village\tOH\tOhio\tClark County\t283\t46.9\t20.6\t9.4\t27911\t156250\t0.4879\t45323\tObama\t45323\t0.0006353940000000001\t45323.0\n16344\t-83.776946\t39.997095\tNorthridge CDP\tOH\tOhio\tClark County\t7062\t45.5\t21.7\t6.4\t29014\t116667\t0.4879\t45503\tObama\t45503\t0.015855658\t45503.0\n16345\t-84.280808\t39.171021\tMilford city\tOH\tOhio\tClermont County\t6596\t42.9\t28.3\t12.2\t28164\t140074\t0.3164\t45111\tObama\t45111\t0.014809391000000002\t45111.0\n16346\t-84.228218\t38.859947999999996\tMoscow village\tOH\tOhio\tClermont County\t297\t36.9\t7.8\t12.2\t18185\t75000\t0.3164\t45153\tObama\t45153\t0.0006668269999999999\t45153.0\n16347\t-84.26737800000001\t39.061118\tWithamsville CDP\tOH\tOhio\tClermont County\t3430\t35.6\t19.7\t15.3\t27622\t141845\t0.3164\t45245\tObama\t45245\t0.007701063\t45245.0\n16348\t-84.098348\t38.838966\tFelicity village\tOH\tOhio\tClermont County\t1075\t35.5\t6.5\t22.4\t13481\t43654\t0.3164\t45120\tObama\t45120\t0.002413598\t45120.0\n16349\t-84.088225\t39.181537\tNewtonsville village\tOH\tOhio\tClermont County\t505\t39.4\t12.2\t10.9\t22213\t122685\t0.3164\t45122\tObama\t45122\t0.00113383\t45122.0\n16350\t-84.13653199999999\t39.125037\tOwensville village\tOH\tOhio\tClermont County\t856\t38.1\t15.7\t9.9\t22157\t150000\t0.3164\t45160\tObama\t45160\t0.0019218979999999998\t45160.0\n16351\t-84.220214\t39.190634\tMount Repose CDP\tOH\tOhio\tClermont County\t4480\t36.1\t26.3\t9.6\t28637\t142807\t0.3164\t45150\tObama\t45150\t0.010058530999999999\t45150.0\n16352\t-84.181569\t39.078703000000004\tBatavia village\tOH\tOhio\tClermont County\t1766\t32.5\t19.2\t11.1\t23241\t137074\t0.3164\t45103\tObama\t45103\t0.003965037\t45103.0\n16353\t-84.137638\t38.793738\tChilo village\tOH\tOhio\tClermont County\t97\t38.3\t10.8\t10.9\t20640\t92500\t0.3164\t45112\tObama\t45112\t0.000217785\t45112.0\n16354\t-84.279692\t38.962067\tNew Richmond village\tOH\tOhio\tClermont County\t2348\t35.0\t24.0\t11.4\t21773\t135861\t0.3164\t45157\tObama\t45157\t0.005271748000000001\t45157.0\n16355\t-84.299314\t39.096614\tMount Carmel CDP\tOH\tOhio\tClermont County\t4589\t35.2\t13.7\t17.2\t23940\t117853\t0.3164\t45245\tObama\t45245\t0.010303259\t45245.0\n16356\t-84.046868\t39.051814\tWilliamsburg village\tOH\tOhio\tClermont County\t2603\t38.2\t13.7\t15.0\t21950\t115549\t0.3164\t45176\tObama\t45176\t0.005844276\t45176.0\n16357\t-84.211535\t38.812156\tNeville village\tOH\tOhio\tClermont County\t137\t36.5\t9.8\t12.3\t20946\t102500\t0.3164\t45156\tObama\t45156\t0.000307593\t45156.0\n16358\t-84.227496\t39.175451\tDay Heights CDP\tOH\tOhio\tClermont County\t2841\t42.7\t26.2\t10.7\t31669\t145986\t0.3164\t45150\tObama\t45150\t0.006378636\t45150.0\n16359\t-84.251559\t39.197325\tMulberry CDP\tOH\tOhio\tClermont County\t3684\t43.7\t42.2\t7.8\t35482\t186842\t0.3164\t45150\tObama\t45150\t0.008271346\t45150.0\n16360\t-84.28715\t39.118308\tSummerside CDP\tOH\tOhio\tClermont County\t5656\t34.6\t25.9\t11.4\t28046\t131745\t0.3164\t45245\tObama\t45245\t0.012698896000000001\t45245.0\n16361\t-84.084379\t38.962589\tBethel village\tOH\tOhio\tClermont County\t2766\t33.7\t14.6\t18.3\t19345\t103967\t0.3164\t45106\tObama\t45106\t0.006210245\t45106.0\n16362\t-84.219379\t39.022698999999996\tAmelia village\tOH\tOhio\tClermont County\t4017\t32.2\t17.3\t9.8\t24562\t138445\t0.3164\t45102\tObama\t45102\t0.009019\t45102.0\n16363\t-83.98056700000001\t39.290273\tBlanchester village\tOH\tOhio\tClinton County\t4430\t37.3\t15.4\t16.0\t23199\t107628\t0.3192\t45107\tObama\t45107\t0.009946271\t45107.0\n16364\t-83.78551800000001\t39.552219\tPort William village\tOH\tOhio\tClinton County\t280\t39.6\t23.0\t17.5\t26033\t153750\t0.3192\t45164\tObama\t45164\t0.000628658\t45164.0\n16365\t-83.81085\t39.322439\tMartinsville village\tOH\tOhio\tClinton County\t463\t38.3\t14.1\t20.6\t23406\t116000\t0.3192\t45146\tObama\t45146\t0.001039531\t45146.0\n16366\t-83.82879\t39.43953\tWilmington city\tOH\tOhio\tClinton County\t12407\t34.6\t20.9\t20.8\t22983\t115736\t0.3192\t45177\tObama\t45177\t0.027856294\t45177.0\n16367\t-83.98277399999999\t39.401584\tClarksville village\tOH\tOhio\tClinton County\t559\t38.3\t10.9\t17.3\t20289\t107051\t0.3192\t45113\tObama\t45113\t0.001255071\t45113.0\n16368\t-83.633735\t39.490437\tSabina village\tOH\tOhio\tClinton County\t2679\t37.0\t11.5\t20.4\t21472\t87500\t0.3192\t45169\tObama\t45169\t0.006014912\t45169.0\n16369\t-83.692882\t39.325146000000004\tNew Vienna village\tOH\tOhio\tClinton County\t1428\t32.4\t6.2\t19.4\t20007\t76571\t0.3192\t45159\tObama\t45159\t0.0032061570000000003\t45159.0\n16370\t-83.910354\t39.307005\tMidland village\tOH\tOhio\tClinton County\t335\t39.7\t5.3\t20.3\t20570\t109783\t0.3192\t45148\tObama\t45148\t0.000752145\t45148.0\n16371\t-80.545183\t40.837542\tEast Palestine city\tOH\tOhio\tColumbiana County\t4619\t40.5\t15.0\t9.1\t20487\t86640\t0.4304\t44413\tObama\t44413\t0.010370615\t44413.0\n16372\t-80.76541\t40.903368\tWashingtonville village\tOH\tOhio\tColumbiana County\t794\t40.6\t16.5\t16.9\t20523\t83065\t0.4304\t44490\tObama\t44490\t0.001782695\t44490.0\n16373\t-80.56169799999999\t40.68479\tCalcutta CDP\tOH\tOhio\tColumbiana County\t3541\t47.0\t15.7\t12.5\t21954\t108317\t0.4304\t43920\tObama\t43920\t0.007950281\t43920.0\n16374\t-80.769852\t40.77563\tLisbon village\tOH\tOhio\tColumbiana County\t2649\t39.2\t15.9\t13.8\t20122\t84826\t0.4304\t44432\tObama\t44432\t0.005947556\t44432.0\n16375\t-80.834571\t40.620718\tSalineville village\tOH\tOhio\tColumbiana County\t1312\t37.8\t8.9\t14.7\t16443\t51892\t0.4304\t43945\tObama\t43945\t0.002945713\t43945.0\n16376\t-80.851667\t40.903096000000005\tSalem city\tOH\tOhio\tColumbiana County\t11380\t41.8\t18.7\t13.8\t21349\t92430\t0.4304\t44460\tObama\t44460\t0.025550466\t44460.0\n16377\t-80.888037\t40.674985\tSummitville village\tOH\tOhio\tColumbiana County\t115\t37.9\t9.5\t10.9\t18671\t95000\t0.4304\t43962\tObama\t43962\t0.000258199\t43962.0\n16378\t-80.655011\t40.604082\tWellsville village\tOH\tOhio\tColumbiana County\t3825\t37.4\t8.5\t19.9\t16737\t50649\t0.4304\t43968\tObama\t43968\t0.00858792\t43968.0\n16379\t-80.762179\t40.878411\tLeetonia village\tOH\tOhio\tColumbiana County\t2021\t38.8\t13.7\t14.6\t20736\t81667\t0.4304\t44431\tObama\t44431\t0.004537565\t44431.0\n16380\t-80.613222\t40.663984\tGlenmoor CDP\tOH\tOhio\tColumbiana County\t2095\t45.3\t7.9\t14.2\t20086\t80714\t0.4304\t43920\tObama\t43920\t0.004703711\t43920.0\n16381\t-80.672739\t40.904884\tColumbiana village\tOH\tOhio\tColumbiana County\t5631\t45.1\t17.7\t13.1\t22740\t113801\t0.4304\t44408\tObama\t44408\t0.012642766000000001\t44408.0\n16382\t-80.59970899999999\t40.64665\tLa Croft CDP\tOH\tOhio\tColumbiana County\t1218\t41.5\t5.1\t15.9\t16806\t62955\t0.4304\t43920\tObama\t43920\t0.002734663\t43920.0\n16383\t-80.618983\t40.847998\tNew Waterford village\tOH\tOhio\tColumbiana County\t1373\t41.9\t10.0\t10.8\t20204\t105500\t0.4304\t44445\tObama\t44445\t0.00308267\t44445.0\n16384\t-80.568827\t40.632607\tEast Liverpool city\tOH\tOhio\tColumbiana County\t12003\t37.0\t9.7\t16.3\t15887\t53872\t0.4304\t43920\tObama\t43920\t0.02694923\t43920.0\n16385\t-80.935552\t40.754682\tHanoverton village\tOH\tOhio\tColumbiana County\t386\t40.5\t13.2\t11.7\t20607\t109615\t0.4304\t44423\tObama\t44423\t0.00086665\t44423.0\n16386\t-80.627361\t40.789626\tRogers village\tOH\tOhio\tColumbiana County\t277\t38.8\t9.8\t11.4\t18942\t75625\t0.4304\t44455\tObama\t44455\t0.000621923\t44455.0\n16387\t-81.891819\t40.185140999999994\tConesville village\tOH\tOhio\tCoshocton County\t345\t39.6\t4.6\t12.1\t17698\t71429\t0.4409\t43811\tObama\t43811\t0.000774597\t43811.0\n16388\t-81.751549\t40.27389\tWest Lafayette village\tOH\tOhio\tCoshocton County\t2177\t39.4\t14.2\t16.2\t20800\t74176\t0.4409\t43845\tObama\t43845\t0.0048878179999999995\t43845.0\n16389\t-82.001489\t40.335402\tWarsaw village\tOH\tOhio\tCoshocton County\t768\t38.6\t14.8\t14.6\t19646\t92037\t0.4409\t43844\tObama\t43844\t0.00172432\t43844.0\n16390\t-82.070992\t40.338467\tNellie village\tOH\tOhio\tCoshocton County\t144\t41.8\t16.5\t8.1\t16650\t68750\t0.4409\t43844\tObama\t43844\t0.00032331\t43844.0\n16391\t-81.71822399999999\t40.205098\tPlainfield village\tOH\tOhio\tCoshocton County\t153\t45.4\t6.1\t19.3\t19954\t65714\t0.4409\t43845\tObama\t43845\t0.000343517\t43845.0\n16392\t-81.848329\t40.2623\tCoshocton city\tOH\tOhio\tCoshocton County\t11048\t42.0\t15.4\t16.5\t21282\t83911\t0.4409\t43812\tObama\t43812\t0.024805057000000002\t43812.0\n16393\t-82.971713\t40.805157\tBucyrus city\tOH\tOhio\tCrawford County\t12280\t39.4\t12.4\t16.1\t22135\t90563\t0.3791\t44820\tObama\t44820\t0.027571152999999998\t44820.0\n16394\t-82.856822\t40.792458\tNorth Robinson village\tOH\tOhio\tCrawford County\t200\t43.8\t12.4\t12.3\t22821\t103571\t0.3791\t44856\tObama\t44856\t0.000449042\t44856.0\n16395\t-82.789996\t40.732562\tGalion city\tOH\tOhio\tCrawford County\t10309\t38.5\t10.5\t14.5\t20876\t83497\t0.3791\t44833\tObama\t44833\t0.023145847999999997\t44833.0\n16396\t-82.941411\t40.951985\tChatfield village\tOH\tOhio\tCrawford County\t210\t42.8\t12.9\t9.9\t22545\t97500\t0.3791\t44825\tObama\t44825\t0.00047149400000000004\t44825.0\n16397\t-82.76901099999999\t40.906335\tTiro village\tOH\tOhio\tCrawford County\t268\t38.5\t2.9\t14.5\t19684\t93000\t0.3791\t44887\tObama\t44887\t0.000601716\t44887.0\n16398\t-82.854528\t40.961175\tNew Washington village\tOH\tOhio\tCrawford County\t983\t40.1\t12.4\t12.3\t21305\t87917\t0.3791\t44854\tObama\t44854\t0.002207039\t44854.0\n16399\t-82.72346\t40.786434\tCrestline village\tOH\tOhio\tCrawford County\t4839\t37.1\t10.7\t14.5\t21657\t83842\t0.3791\t44827\tObama\t44827\t0.010864561000000002\t44827.0\n16400\t-81.38665400000001\t41.483105\tHunting Valley village\tOH\tOhio\tCuyahoga County\t698\t50.3\t72.3\t2.3\t105714\t892500\t0.6942\t44022\tObama\t44022\t0.001567155\t44022.0\n16401\t-81.815046\t41.369544\tMiddleburg Heights city\tOH\tOhio\tCuyahoga County\t15334\t47.4\t27.3\t10.0\t29732\t144492\t0.6942\t44142\tObama\t44142\t0.034428018\t44142.0\n16402\t-81.863156\t41.369146\tBerea city\tOH\tOhio\tCuyahoga County\t18261\t38.4\t32.3\t9.0\t26817\t114099\t0.6942\t44017\tObama\t44017\t0.040999741\t44017.0\n16403\t-81.472392\t41.359875\tGlenwillow village\tOH\tOhio\tCuyahoga County\t540\t42.6\t19.2\t5.3\t29421\t101829\t0.6942\t44139\tObama\t44139\t0.001212412\t44139.0\n16404\t-81.579453\t41.531715999999996\tEast Cleveland city\tOH\tOhio\tCuyahoga County\t22797\t35.2\t10.8\t24.5\t15201\t68022\t0.6942\t44112\tObama\t44112\t0.051184004000000005\t44112.0\n16405\t-81.555199\t41.366321\tWalton Hills village\tOH\tOhio\tCuyahoga County\t2220\t53.5\t22.3\t10.4\t28142\t169422\t0.6942\t44146\tObama\t44146\t0.004984362\t44146.0\n16406\t-81.90504200000001\t41.365504\tOlmsted Falls city\tOH\tOhio\tCuyahoga County\t8273\t40.0\t38.0\t4.2\t29694\t133062\t0.6942\t44138\tObama\t44138\t0.018574605\t44138.0\n16407\t-81.82259499999999\t41.402640999999996\tBrook Park city\tOH\tOhio\tCuyahoga County\t19259\t43.7\t11.4\t8.6\t24159\t110198\t0.6942\t44142\tObama\t44142\t0.043240459\t44142.0\n16408\t-81.53493900000001\t41.494803999999995\tUniversity Heights city\tOH\tOhio\tCuyahoga County\t12943\t33.5\t59.9\t7.6\t32053\t133859\t0.6942\t44118\tObama\t44118\t0.029059726\t44118.0\n16409\t-81.606672\t41.383315\tValley View village\tOH\tOhio\tCuyahoga County\t2075\t45.3\t24.8\t5.9\t28680\t173239\t0.6942\t44125\tObama\t44125\t0.004658806\t44125.0\n16410\t-81.638315\t41.377761\tIndependence city\tOH\tOhio\tCuyahoga County\t6840\t47.4\t32.7\t5.8\t29116\t177914\t0.6942\t44131\tObama\t44131\t0.015357222\t44131.0\n16411\t-81.440386\t41.386379\tSolon city\tOH\tOhio\tCuyahoga County\t21752\t42.9\t54.5\t5.0\t40231\t200064\t0.6942\t44139\tObama\t44139\t0.048837762\t44139.0\n16412\t-81.800691\t41.482372999999995\tLakewood city\tOH\tOhio\tCuyahoga County\t51289\t36.8\t39.9\t8.3\t29173\t112628\t0.6942\t44107\tObama\t44107\t0.115154467\t44107.0\n16413\t-81.74499499999999\t41.313696\tNorth Royalton city\tOH\tOhio\tCuyahoga County\t29722\t40.6\t32.6\t8.4\t32460\t158357\t0.6942\t44133\tObama\t44133\t0.066732069\t44133.0\n16414\t-81.502881\t41.475971\tBeachwood city\tOH\tOhio\tCuyahoga County\t11731\t55.1\t55.5\t6.3\t43045\t219966\t0.6942\t44122\tObama\t44122\t0.026338534\t44122.0\n16415\t-81.67359599999999\t41.380502\tSeven Hills city\tOH\tOhio\tCuyahoga County\t11460\t50.5\t25.5\t7.2\t27346\t156687\t0.6942\t44131\tObama\t44131\t0.025730082\t44131.0\n16416\t-81.677642\t41.319749\tBroadview Heights city\tOH\tOhio\tCuyahoga County\t16900\t42.2\t41.1\t7.6\t33277\t162574\t0.6942\t44147\tObama\t44147\t0.037944013\t44147.0\n16417\t-81.469162\t41.551864\tHighland Heights city\tOH\tOhio\tCuyahoga County\t8528\t45.8\t48.0\t7.9\t38925\t199666\t0.6942\t44143\tObama\t44143\t0.019147133\t44143.0\n16418\t-81.667749\t41.417654\tBrooklyn Heights village\tOH\tOhio\tCuyahoga County\t1475\t45.5\t30.8\t4.8\t25773\t127083\t0.6942\t44131\tObama\t44131\t0.0033116820000000003\t44131.0\n16419\t-81.54950600000001\t41.474401\tShaker Heights city\tOH\tOhio\tCuyahoga County\t27277\t42.4\t65.5\t8.0\t45244\t168890\t0.6942\t44118\tObama\t44118\t0.061242535\t44118.0\n16420\t-81.51899999999999\t41.59017\tEuclid city\tOH\tOhio\tCuyahoga County\t47940\t41.5\t22.7\t10.5\t24437\t90727\t0.6942\t44123\tObama\t44123\t0.107635266\t44123.0\n16421\t-81.528798\t41.432658\tNorth Randall village\tOH\tOhio\tCuyahoga County\t854\t42.8\t13.4\t9.4\t23244\t98276\t0.6942\t44128\tObama\t44128\t0.0019174079999999998\t44128.0\n16422\t-81.503568\t41.366839\tOakwood village\tOH\tOhio\tCuyahoga County\t3648\t46.5\t20.6\t7.2\t26352\t110790\t0.6942\t44146\tObama\t44146\t0.008190518\t44146.0\n16423\t-81.83133199999999\t41.312805\tStrongsville city\tOH\tOhio\tCuyahoga County\t43143\t42.6\t41.2\t7.2\t34898\t164357\t0.6942\t44136\tObama\t44136\t0.096865004\t44136.0\n16424\t-81.604889\t41.554309\tBratenahl village\tOH\tOhio\tCuyahoga County\t1186\t54.6\t67.9\t6.3\t72745\t174063\t0.6942\t44108\tObama\t44108\t0.002662817\t44108.0\n16425\t-81.656008\t41.435024\tCuyahoga Heights village\tOH\tOhio\tCuyahoga County\t545\t44.9\t11.2\t8.8\t27019\t110381\t0.6942\t44127\tObama\t44127\t0.001223638\t44127.0\n16426\t-81.680308\t41.476748\tCleveland city\tOH\tOhio\tCuyahoga County\t428412\t34.5\t13.8\t18.8\t17591\t71134\t0.6942\t44115\tObama\t44115\t0.961874\t44115.0\n16427\t-81.728573\t41.384279\tParma city\tOH\tOhio\tCuyahoga County\t79429\t42.1\t20.7\t8.7\t26033\t111512\t0.6942\t44129\tObama\t44129\t0.178334617\t44129.0\n16428\t-81.436624\t41.549549\tMayfield village\tOH\tOhio\tCuyahoga County\t3338\t49.3\t50.0\t6.2\t38717\t191192\t0.6942\t44040\tObama\t44040\t0.007494504\t44040.0\n16429\t-81.76665799999999\t41.445066\tLinndale village\tOH\tOhio\tCuyahoga County\t102\t35.0\t0.0\t5.7\t18608\t61667\t0.6942\t44111\tObama\t44111\t0.000229011\t44111.0\n16430\t-81.749763\t41.434864000000005\tBrooklyn city\tOH\tOhio\tCuyahoga County\t10687\t44.9\t15.6\t9.8\t24721\t106409\t0.6942\t44144\tObama\t44144\t0.023994537000000003\t44144.0\n16431\t-81.412111\t41.412094\tBentleyville village\tOH\tOhio\tCuyahoga County\t880\t42.6\t79.8\t9.5\t73327\t467532\t0.6942\t44022\tObama\t44022\t0.001975783\t44022.0\n16432\t-81.428954\t41.442204\tMoreland Hills village\tOH\tOhio\tCuyahoga County\t3093\t51.0\t69.8\t5.8\t69925\t336700\t0.6942\t44022\tObama\t44022\t0.006944428000000001\t44022.0\n16433\t-81.662743\t41.450948\tNewburgh Heights village\tOH\tOhio\tCuyahoga County\t2182\t39.5\t12.8\t12.4\t22566\t73108\t0.6942\t44127\tObama\t44127\t0.004899044\t44127.0\n16434\t-81.52439100000001\t41.523943\tSouth Euclid city\tOH\tOhio\tCuyahoga County\t21624\t40.7\t40.5\t7.4\t26551\t104240\t0.6942\t44121\tObama\t44121\t0.048550375\t44121.0\n16435\t-81.51894300000001\t41.450669\tHighland Hills village\tOH\tOhio\tCuyahoga County\t1552\t40.1\t23.9\t31.5\t17618\t93214\t0.6942\t44122\tObama\t44122\t0.003484563\t44122.0\n16436\t-81.461797\t41.479796\tPepper Pike city\tOH\tOhio\tCuyahoga County\t5703\t50.6\t75.3\t8.0\t73793\t351623\t0.6942\t44124\tObama\t44124\t0.012804421000000002\t44124.0\n16437\t-81.562499\t41.409633\tMaple Heights city\tOH\tOhio\tCuyahoga County\t23845\t40.0\t15.1\t10.7\t23709\t84372\t0.6942\t44137\tObama\t44137\t0.053536982000000004\t44137.0\n16438\t-81.521999\t41.436405\tWarrensville Heights city\tOH\tOhio\tCuyahoga County\t14341\t39.1\t19.1\t15.9\t23292\t86218\t0.6942\t44128\tObama\t44128\t0.032198526\t44128.0\n16439\t-81.56353399999999\t41.511188\tCleveland Heights city\tOH\tOhio\tCuyahoga County\t46377\t37.5\t54.3\t8.3\t29918\t107474\t0.6942\t44118\tObama\t44118\t0.104126006\t44118.0\n16440\t-81.492135\t41.517232\tLyndhurst city\tOH\tOhio\tCuyahoga County\t14045\t47.0\t41.9\t7.7\t32200\t126569\t0.6942\t44124\tObama\t44124\t0.031533945\t44124.0\n16441\t-81.763648\t41.386511\tParma Heights city\tOH\tOhio\tCuyahoga County\t19975\t45.0\t21.5\t9.0\t24820\t111506\t0.6942\t44130\tObama\t44130\t0.044848027\t44130.0\n16442\t-81.852829\t41.442056\tFairview Park city\tOH\tOhio\tCuyahoga County\t15966\t44.1\t40.5\t6.5\t31385\t128003\t0.6942\t44126\tObama\t44126\t0.035846988999999996\t44126.0\n16443\t-81.453352\t41.517468\tMayfield Heights city\tOH\tOhio\tCuyahoga County\t17996\t46.5\t31.4\t10.7\t27805\t119953\t0.6942\t44124\tObama\t44124\t0.040404761000000004\t44124.0\n16444\t-81.3888\t41.431849\tChagrin Falls village\tOH\tOhio\tCuyahoga County\t3751\t44.5\t65.2\t6.9\t44742\t199375\t0.6942\t44022\tObama\t44022\t0.008421775\t44022.0\n16445\t-81.918784\t41.415008\tNorth Olmsted city\tOH\tOhio\tCuyahoga County\t31912\t43.1\t30.7\t7.5\t28394\t135983\t0.6942\t44070\tObama\t44070\t0.07164907400000001\t44070.0\n16446\t-81.92943000000001\t41.452431\tWestlake city\tOH\tOhio\tCuyahoga County\t31280\t45.5\t50.1\t7.0\t44223\t166623\t0.6942\t44145\tObama\t44145\t0.070230103\t44145.0\n16447\t-81.85258499999999\t41.470327000000005\tRocky River city\tOH\tOhio\tCuyahoga County\t19164\t47.2\t50.9\t5.9\t38445\t163806\t0.6942\t44116\tObama\t44116\t0.04302716400000001\t44116.0\n16448\t-81.502852\t41.558873999999996\tRichmond Heights city\tOH\tOhio\tCuyahoga County\t10319\t43.8\t39.9\t9.8\t29979\t135183\t0.6942\t44143\tObama\t44143\t0.0231683\t44143.0\n16449\t-81.93168299999999\t41.48507\tBay Village city\tOH\tOhio\tCuyahoga County\t14758\t44.8\t57.8\t5.6\t38993\t160261\t0.6942\t44140\tObama\t44140\t0.033134778\t44140.0\n16450\t-81.619191\t41.307805\tBrecksville city\tOH\tOhio\tCuyahoga County\t12791\t49.1\t51.9\t6.6\t42522\t194811\t0.6942\t44141\tObama\t44141\t0.028718453999999997\t44141.0\n16451\t-81.505313\t41.404196\tBedford Heights city\tOH\tOhio\tCuyahoga County\t10552\t41.6\t18.8\t11.7\t25915\t103511\t0.6942\t44146\tObama\t44146\t0.023691434\t44146.0\n16452\t-81.603815\t41.419897999999996\tGarfield Heights city\tOH\tOhio\tCuyahoga County\t28125\t40.7\t14.2\t11.8\t23840\t88491\t0.6942\t44125\tObama\t44125\t0.063146472\t44125.0\n16453\t-81.535765\t41.392247999999995\tBedford city\tOH\tOhio\tCuyahoga County\t12942\t41.9\t21.1\t8.1\t24572\t91967\t0.6942\t44146\tObama\t44146\t0.02905748\t44146.0\n16454\t-81.409824\t41.531499\tGates Mills village\tOH\tOhio\tCuyahoga County\t2363\t49.7\t71.0\t6.2\t74091\t421324\t0.6942\t44040\tObama\t44040\t0.005305425999999999\t44040.0\n16455\t-81.479637\t41.459994\tWoodmere village\tOH\tOhio\tCuyahoga County\t791\t34.3\t34.4\t7.7\t28764\t144022\t0.6942\t44122\tObama\t44122\t0.001775959\t44122.0\n16456\t-81.474152\t41.441365000000005\tOrange village\tOH\tOhio\tCuyahoga County\t3136\t46.3\t63.0\t7.0\t51222\t234492\t0.6942\t44122\tObama\t44122\t0.0070409719999999995\t44122.0\n16457\t-84.55326\t39.937692999999996\tIthaca village\tOH\tOhio\tDarke County\t98\t41.8\t13.4\t8.6\t22943\t140000\t0.2687\t45304\tObama\t45304\t0.00022003\t45304.0\n16458\t-84.744394\t40.050152000000004\tPalestine village\tOH\tOhio\tDarke County\t170\t39.8\t10.6\t11.0\t20015\t109167\t0.2687\t45352\tObama\t45352\t0.000381685\t45352.0\n16459\t-84.495025\t40.325311\tYorkshire village\tOH\tOhio\tDarke County\t111\t32.5\t9.0\t6.8\t19948\t135000\t0.2687\t45351\tObama\t45351\t0.000249218\t45351.0\n16460\t-84.568999\t40.324251000000004\tNorth Star village\tOH\tOhio\tDarke County\t203\t38.2\t7.4\t13.6\t19246\t128125\t0.2687\t45351\tObama\t45351\t0.000455777\t45351.0\n16461\t-84.496394\t40.115486\tGettysburg village\tOH\tOhio\tDarke County\t561\t38.3\t12.7\t9.4\t21763\t120833\t0.2687\t45328\tObama\t45328\t0.0012595619999999999\t45328.0\n16462\t-84.643623\t40.337036\tNew Weston village\tOH\tOhio\tDarke County\t137\t34.8\t5.7\t9.6\t18634\t98333\t0.2687\t45348\tObama\t45348\t0.000307593\t45348.0\n16463\t-84.509127\t39.930285999999995\tGordon village\tOH\tOhio\tDarke County\t179\t42.7\t15.6\t10.5\t25141\t130682\t0.2687\t45378\tObama\t45378\t0.000401892\t45378.0\n16464\t-84.624647\t39.931142\tCastine village\tOH\tOhio\tDarke County\t126\t40.3\t10.3\t14.5\t18482\t117857\t0.2687\t45382\tObama\t45382\t0.000282896\t45382.0\n16465\t-84.79401999999999\t40.199017\tUnion City village\tOH\tOhio\tDarke County\t1733\t35.0\t1.9\t16.3\t17165\t65000\t0.2687\t45390\tObama\t45390\t0.003890945\t45390.0\n16466\t-84.792976\t39.998490000000004\tHollansburg village\tOH\tOhio\tDarke County\t221\t40.3\t3.3\t12.4\t21659\t86667\t0.2687\t45332\tObama\t45332\t0.000496191\t45332.0\n16467\t-84.495699\t40.339363\tOsgood village\tOH\tOhio\tDarke County\t258\t34.5\t9.0\t7.2\t19891\t129808\t0.2687\t45351\tObama\t45351\t0.000579264\t45351.0\n16468\t-84.48755600000001\t39.986752\tPitsburg village\tOH\tOhio\tDarke County\t382\t37.9\t15.0\t7.2\t23509\t122917\t0.2687\t45358\tObama\t45358\t0.0008576689999999999\t45358.0\n16469\t-84.482293\t40.222111\tVersailles village\tOH\tOhio\tDarke County\t2568\t37.9\t15.9\t10.2\t23959\t123525\t0.2687\t45380\tObama\t45380\t0.005765694\t45380.0\n16470\t-84.63828199999999\t40.280322999999996\tRossburg village\tOH\tOhio\tDarke County\t227\t35.3\t5.6\t9.9\t18653\t95000\t0.2687\t45362\tObama\t45362\t0.0005096619999999999\t45362.0\n16471\t-84.554118\t39.991938\tArcanum village\tOH\tOhio\tDarke County\t2130\t38.4\t16.3\t6.5\t24628\t118785\t0.2687\t45304\tObama\t45304\t0.004782293\t45304.0\n16472\t-84.707883\t39.968278000000005\tNew Madison village\tOH\tOhio\tDarke County\t812\t40.6\t7.8\t8.4\t20997\t102045\t0.2687\t45346\tObama\t45346\t0.0018231089999999998\t45346.0\n16473\t-84.662508\t40.021596\tWayne Lakes village\tOH\tOhio\tDarke County\t652\t43.2\t19.2\t9.2\t24309\t104167\t0.2687\t45346\tObama\t45346\t0.001463876\t45346.0\n16474\t-84.634376\t40.214935\tAnsonia village\tOH\tOhio\tDarke County\t1105\t38.8\t5.2\t14.6\t20490\t89878\t0.2687\t45303\tObama\t45303\t0.002480955\t45303.0\n16475\t-84.621985\t40.104605\tGreenville city\tOH\tOhio\tDarke County\t12873\t42.1\t14.4\t13.1\t22326\t102873\t0.2687\t45331\tObama\t45331\t0.028902561\t45331.0\n16476\t-84.36851899999999\t41.279671\tDefiance city\tOH\tOhio\tDefiance County\t15833\t36.5\t20.7\t15.7\t25163\t100476\t0.4228\t43512\tObama\t43512\t0.035548376\t43512.0\n16477\t-84.553413\t41.289158\tSherwood village\tOH\tOhio\tDefiance County\t812\t38.5\t10.4\t14.1\t22149\t81500\t0.4228\t43556\tObama\t43556\t0.0018231089999999998\t43556.0\n16478\t-84.520873\t41.380587\tNey village\tOH\tOhio\tDefiance County\t369\t41.1\t9.9\t16.8\t24393\t95556\t0.4228\t43549\tObama\t43549\t0.000828482\t43549.0\n16479\t-84.765397\t41.293454\tHicksville village\tOH\tOhio\tDefiance County\t3588\t36.8\t17.5\t17.1\t22964\t92960\t0.4228\t43526\tObama\t43526\t0.008055806\t43526.0\n16480\t-83.081991\t40.294383\tDelaware city\tOH\tOhio\tDelaware County\t32818\t34.0\t31.9\t11.4\t29323\t167996\t0.3776\t43015\tObama\t43015\t0.073683232\t43015.0\n16481\t-83.21299300000001\t40.265195\tOstrander village\tOH\tOhio\tDelaware County\t491\t40.8\t27.4\t10.4\t25987\t171000\t0.3776\t43061\tObama\t43061\t0.001102397\t43061.0\n16482\t-82.88006999999999\t40.221346000000004\tGalena village\tOH\tOhio\tDelaware County\t457\t40.9\t40.2\t6.9\t34223\t230682\t0.3776\t43021\tObama\t43021\t0.00102606\t43021.0\n16483\t-82.95428199999999\t40.408975\tAshley village\tOH\tOhio\tDelaware County\t1552\t36.3\t12.4\t10.6\t21831\t65500\t0.3776\t43003\tObama\t43003\t0.003484563\t43003.0\n16484\t-83.06976\t40.159221\tPowell village\tOH\tOhio\tDelaware County\t8171\t36.4\t71.7\t8.1\t58032\t406902\t0.3776\t43065\tObama\t43065\t0.018345594\t43065.0\n16485\t-83.134857\t40.159531\tShawnee Hills village\tOH\tOhio\tDelaware County\t538\t44.9\t52.7\t9.6\t57899\t366216\t0.3776\t43017\tObama\t43017\t0.001207922\t43017.0\n16486\t-82.866112\t40.244044\tSunbury village\tOH\tOhio\tDelaware County\t4251\t40.1\t32.8\t7.3\t31760\t205513\t0.3776\t43074\tObama\t43074\t0.009544379\t43074.0\n16487\t-82.654438\t41.426778999999996\tFairview Lanes CDP\tOH\tOhio\tErie County\t1301\t43.4\t28.6\t5.4\t31416\t117028\t0.5531\t44870\tObama\t44870\t0.002921015\t44870.0\n16488\t-82.490022\t41.320291999999995\tBerlin Heights village\tOH\tOhio\tErie County\t702\t43.0\t17.9\t6.3\t26533\t128125\t0.5531\t44814\tObama\t44814\t0.0015761360000000001\t44814.0\n16489\t-82.56248000000001\t41.391234000000004\tHuron city\tOH\tOhio\tErie County\t7779\t41.6\t34.5\t8.1\t31782\t142108\t0.5531\t44839\tObama\t44839\t0.017465472\t44839.0\n16490\t-82.825098\t41.468343\tBay View village\tOH\tOhio\tErie County\t649\t46.4\t16.5\t10.3\t22631\t95000\t0.5531\t448HH\tObama\t448HH\t0.00145714\t0.0\n16491\t-82.809173\t41.400662\tCastalia village\tOH\tOhio\tErie County\t887\t43.2\t18.4\t8.1\t24820\t136842\t0.5531\t44824\tObama\t44824\t0.001991499\t44824.0\n16492\t-82.703303\t41.603259\tKelleys Island village\tOH\tOhio\tErie County\t372\t56.6\t23.9\t29.1\t28026\t170588\t0.5531\t43438\tObama\t43438\t0.000835217\t43438.0\n16493\t-82.686937\t41.415265000000005\tSandusky South CDP\tOH\tOhio\tErie County\t6327\t50.2\t21.5\t8.1\t26825\t125743\t0.5531\t44870\tObama\t44870\t0.01420543\t44870.0\n16494\t-82.715814\t41.443594\tSandusky city\tOH\tOhio\tErie County\t26282\t37.5\t13.8\t15.1\t22683\t78584\t0.5531\t44870\tObama\t44870\t0.059008554000000005\t44870.0\n16495\t-82.592118\t41.293293\tMilan village\tOH\tOhio\tErie County\t1611\t41.3\t27.0\t11.5\t26696\t123515\t0.5531\t44846\tObama\t44846\t0.00361703\t44846.0\n16496\t-82.43014699999999\t39.764456\tRushville village\tOH\tOhio\tFairfield County\t286\t43.0\t13.1\t13.8\t24624\t142708\t0.4147\t43150\tObama\t43150\t0.000642129\t43150.0\n16497\t-82.814098\t39.803622\tLithopolis village\tOH\tOhio\tFairfield County\t726\t44.4\t25.1\t8.8\t31680\t179327\t0.4147\t43136\tObama\t43136\t0.0016300210000000002\t43136.0\n16498\t-82.606034\t39.844962\tBaltimore village\tOH\tOhio\tFairfield County\t3017\t38.0\t9.7\t14.5\t23370\t118348\t0.4147\t43105\tObama\t43105\t0.006773792\t43105.0\n16499\t-82.60399100000001\t39.724194\tLancaster city\tOH\tOhio\tFairfield County\t38171\t38.2\t15.9\t13.5\t22669\t111395\t0.4147\t43130\tObama\t43130\t0.08570183\t43130.0\n16500\t-82.8245\t39.605724\tStoutsville village\tOH\tOhio\tFairfield County\t563\t40.2\t16.5\t9.6\t23719\t142614\t0.4147\t43154\tObama\t43154\t0.0012640519999999999\t43154.0\n16501\t-82.54435\t39.842216\tThurston village\tOH\tOhio\tFairfield County\t589\t39.8\t11.2\t16.5\t22864\t140341\t0.4147\t43157\tObama\t43157\t0.0013224270000000002\t43157.0\n16502\t-82.741386\t39.650133000000004\tAmanda village\tOH\tOhio\tFairfield County\t760\t38.8\t5.8\t17.9\t19588\t114384\t0.4147\t43102\tObama\t43102\t0.0017063579999999998\t43102.0\n16503\t-82.448024\t39.763821\tWest Rushville village\tOH\tOhio\tFairfield County\t144\t41.3\t17.6\t12.8\t25905\t156250\t0.4147\t43150\tObama\t43150\t0.00032331\t43150.0\n16504\t-82.478984\t39.918227\tFairfield Beach CDP\tOH\tOhio\tFairfield County\t1240\t42.9\t4.4\t13.5\t20094\t105114\t0.4147\t43008\tObama\t43008\t0.002784058\t43008.0\n16505\t-82.705014\t39.800013\tCarroll village\tOH\tOhio\tFairfield County\t547\t39.6\t11.6\t6.6\t23451\t143750\t0.4147\t43112\tObama\t43112\t0.001228129\t43112.0\n16506\t-82.540486\t39.897616\tMillersport village\tOH\tOhio\tFairfield County\t1141\t41.3\t17.4\t8.5\t24880\t130417\t0.4147\t43046\tObama\t43046\t0.0025617820000000003\t43046.0\n16507\t-82.429579\t39.706512\tBremen village\tOH\tOhio\tFairfield County\t1292\t39.9\t15.6\t11.0\t20326\t121987\t0.4147\t43107\tObama\t43107\t0.0029008090000000003\t43107.0\n16508\t-82.768244\t39.903895\tPickerington city\tOH\tOhio\tFairfield County\t14509\t34.5\t35.2\t8.1\t31797\t176185\t0.4147\t43147\tObama\t43147\t0.032575721\t43147.0\n16509\t-82.52181\t39.808966999999996\tPleasantville village\tOH\tOhio\tFairfield County\t981\t41.1\t13.6\t10.7\t21637\t133824\t0.4147\t43148\tObama\t43148\t0.002202549\t43148.0\n16510\t-82.54683399999999\t39.626253000000005\tSugar Grove village\tOH\tOhio\tFairfield County\t499\t39.3\t13.1\t8.4\t21217\t116223\t0.4147\t43155\tObama\t43155\t0.001120359\t43155.0\n16511\t-83.42849\t39.538041\tWashington city\tOH\tOhio\tFayette County\t13674\t38.6\t16.1\t14.3\t22654\t100000\t0.3856\t43160\tObama\t43160\t0.030700973\t43160.0\n16512\t-83.58747199999999\t39.593919\tMilledgeville village\tOH\tOhio\tFayette County\t116\t43.8\t11.6\t11.5\t18796\t100000\t0.3856\t43142\tObama\t43142\t0.00026044400000000003\t43142.0\n16513\t-83.556127\t39.652068\tJeffersonville village\tOH\tOhio\tFayette County\t1249\t34.5\t9.8\t13.6\t16869\t91020\t0.3856\t43128\tObama\t43128\t0.002804265\t43128.0\n16514\t-83.395512\t39.607718\tBloomingburg village\tOH\tOhio\tFayette County\t967\t33.8\t5.9\t17.5\t18759\t82593\t0.3856\t43106\tObama\t43106\t0.002171116\t43106.0\n16515\t-83.61045899999999\t39.613729\tOcta village\tOH\tOhio\tFayette County\t79\t43.3\t11.9\t11.3\t19324\t104167\t0.3856\t43142\tObama\t43142\t0.00017737099999999998\t43142.0\n16516\t-82.969661\t39.809308\tLockbourne village\tOH\tOhio\tFranklin County\t281\t43.0\t11.4\t9.9\t23979\t111806\t0.6066\t43137\tObama\t43137\t0.000630903\t43137.0\n16517\t-83.087568\t39.899522999999995\tUrbancrest village\tOH\tOhio\tFranklin County\t903\t26.7\t4.3\t20.1\t15219\t78235\t0.6066\t43123\tObama\t43123\t0.002027423\t43123.0\n16518\t-83.071875\t39.868066\tGrove City\tOH\tOhio\tFranklin County\t33485\t38.3\t25.1\t8.9\t30126\t145118\t0.6066\t43123\tObama\t43123\t0.075180786\t43123.0\n16519\t-83.07026\t40.027062\tUpper Arlington city\tOH\tOhio\tFranklin County\t33595\t45.9\t71.5\t6.0\t43472\t236582\t0.6066\t43221\tObama\t43221\t0.075427759\t43221.0\n16520\t-83.040511\t39.979296999999995\tGrandview Heights city\tOH\tOhio\tFranklin County\t6526\t37.6\t53.3\t7.4\t33131\t171965\t0.6066\t432HH\tObama\t432HH\t0.014652227\t0.0\n16521\t-82.940069\t39.871325\tObetz village\tOH\tOhio\tFranklin County\t4275\t34.8\t11.6\t9.9\t25437\t110952\t0.6066\t43207\tObama\t43207\t0.009598264\t43207.0\n16522\t-82.918869\t40.140131\tWesterville city\tOH\tOhio\tFranklin County\t38544\t39.3\t49.8\t7.7\t37596\t193525\t0.6066\t43082\tObama\t43082\t0.086539293\t43082.0\n16523\t-83.02079499999999\t40.094839\tWorthington city\tOH\tOhio\tFranklin County\t13959\t47.1\t64.6\t7.0\t37047\t191333\t0.6066\t43085\tObama\t43085\t0.031340857\t43085.0\n16524\t-83.06119699999999\t39.985456\tMarble Cliff village\tOH\tOhio\tFranklin County\t641\t43.2\t62.6\t4.9\t35702\t329268\t0.6066\t43212\tObama\t43212\t0.001439178\t43212.0\n16525\t-83.170068\t39.810947999999996\tHarrisburg village\tOH\tOhio\tFranklin County\t332\t45.5\t21.8\t9.4\t29591\t149306\t0.6066\t43126\tObama\t43126\t0.0007454089999999999\t43126.0\n16526\t-82.898813\t39.856971\tGroveport village\tOH\tOhio\tFranklin County\t4697\t40.6\t16.4\t9.9\t26080\t127658\t0.6066\t43125\tObama\t43125\t0.010545741\t43125.0\n16527\t-82.775499\t39.964245\tReynoldsburg city\tOH\tOhio\tFranklin County\t35412\t37.3\t32.0\t9.7\t29078\t138709\t0.6066\t43068\tObama\t43068\t0.079507302\t43068.0\n16528\t-82.88316999999999\t39.968188\tWhitehall city\tOH\tOhio\tFranklin County\t18502\t35.9\t15.0\t11.6\t22409\t89937\t0.6066\t43213\tObama\t43213\t0.041540836\t43213.0\n16529\t-82.917252\t40.091019\tHuber Ridge CDP\tOH\tOhio\tFranklin County\t4771\t33.2\t28.5\t8.3\t22596\t117301\t0.6066\t43081\tObama\t43081\t0.010711887\t43081.0\n16530\t-83.147886\t40.037915999999996\tHilliard city\tOH\tOhio\tFranklin County\t29163\t33.1\t48.3\t6.3\t33669\t177208\t0.6066\t43026\tObama\t43026\t0.065476998\t43026.0\n16531\t-82.86476800000001\t40.025206\tGahanna city\tOH\tOhio\tFranklin County\t34342\t39.0\t44.8\t8.4\t35640\t171182\t0.6066\t43230\tObama\t43230\t0.077104929\t43230.0\n16532\t-83.073054\t39.964298\tValleyview village\tOH\tOhio\tFranklin County\t579\t46.7\t9.9\t12.0\t23730\t83485\t0.6066\t43204\tObama\t43204\t0.001299975\t43204.0\n16533\t-82.800661\t40.144133000000004\tColumbus city\tOH\tOhio\tFranklin County\t759728\t32.2\t33.0\t11.6\t25935\t116971\t0.6066\t43054\tObama\t43054\t1.705747296\t43054.0\n16534\t-83.131251\t39.953383\tLincoln Village CDP\tOH\tOhio\tFranklin County\t9080\t37.3\t14.1\t11.0\t21617\t98428\t0.6066\t43228\tObama\t43228\t0.020386488\t43228.0\n16535\t-83.141848\t39.951226\tNew Rome village\tOH\tOhio\tFranklin County\t72\t34.2\t8.3\t35.3\t22322\t91250\t0.6066\t43228\tObama\t43228\t0.000161655\t43228.0\n16536\t-83.22413900000001\t39.960153000000005\tLake Darby CDP\tOH\tOhio\tFranklin County\t3995\t32.8\t25.1\t5.5\t27631\t127597\t0.6066\t43119\tObama\t43119\t0.008969605\t43119.0\n16537\t-82.942093\t40.077686\tMinerva Park village\tOH\tOhio\tFranklin County\t1452\t52.4\t39.0\t8.6\t34446\t155863\t0.6066\t43231\tObama\t43231\t0.0032600420000000003\t43231.0\n16538\t-83.136152\t40.14779\tDublin city\tOH\tOhio\tFranklin County\t36490\t37.0\t65.0\t7.1\t48828\t284132\t0.6066\t43017\tObama\t43017\t0.081927636\t43017.0\n16539\t-82.934265\t39.965092999999996\tBexley city\tOH\tOhio\tFranklin County\t13075\t38.3\t71.8\t8.3\t39385\t216584\t0.6066\t43209\tObama\t43209\t0.029356093\t43209.0\n16540\t-82.831774\t39.917333\tBrice village\tOH\tOhio\tFranklin County\t98\t30.2\t30.4\t5.7\t26773\t142500\t0.6066\t43109\tObama\t43109\t0.00022003\t43109.0\n16541\t-82.805229\t40.082\tNew Albany village\tOH\tOhio\tFranklin County\t6657\t42.4\t54.0\t4.9\t56723\t300802\t0.6066\t43054\tObama\t43054\t0.014946349\t43054.0\n16542\t-83.025058\t40.080475\tRiverlea village\tOH\tOhio\tFranklin County\t492\t48.9\t68.6\t8.2\t48935\t218500\t0.6066\t43085\tObama\t43085\t0.0011046419999999999\t43085.0\n16543\t-82.865597\t39.905352\tBlacklick Estates CDP\tOH\tOhio\tFranklin County\t9253\t34.1\t11.3\t10.5\t22721\t96148\t0.6066\t43232\tObama\t43232\t0.020774908999999998\t43232.0\n16544\t-82.79050500000001\t39.850743\tCanal Winchester village\tOH\tOhio\tFranklin County\t6209\t40.1\t33.5\t7.2\t32447\t160899\t0.6066\t43110\tObama\t43110\t0.013940496\t43110.0\n16545\t-83.907803\t41.711721999999995\tMetamora village\tOH\tOhio\tFulton County\t726\t40.4\t19.4\t11.7\t21677\t113915\t0.4266\t43540\tObama\t43540\t0.0016300210000000002\t43540.0\n16546\t-84.303715\t41.514761\tArchbold village\tOH\tOhio\tFulton County\t4326\t40.5\t24.3\t8.5\t26615\t114525\t0.4266\t43502\tObama\t43502\t0.009712769\t43502.0\n16547\t-83.877997\t41.584244\tSwanton village\tOH\tOhio\tFulton County\t3329\t41.4\t18.9\t15.1\t26014\t113550\t0.4266\t43558\tObama\t43558\t0.0074742969999999995\t43558.0\n16548\t-84.071792\t41.700396000000005\tLyons village\tOH\tOhio\tFulton County\t605\t39.4\t12.6\t15.4\t20230\t102907\t0.4266\t43533\tObama\t43533\t0.001358351\t43533.0\n16549\t-84.004977\t41.575319\tDelta village\tOH\tOhio\tFulton County\t2898\t36.6\t14.6\t14.0\t20448\t101878\t0.4266\t43515\tObama\t43515\t0.006506611999999999\t43515.0\n16550\t-84.14105\t41.553139\tWauseon city\tOH\tOhio\tFulton County\t7077\t34.8\t17.2\t13.8\t23015\t105177\t0.4266\t43567\tObama\t43567\t0.015889336\t43567.0\n16551\t-84.329035\t41.673491\tFayette village\tOH\tOhio\tFulton County\t1398\t32.1\t10.0\t16.4\t17918\t71721\t0.4266\t43521\tObama\t43521\t0.0031388009999999997\t43521.0\n16552\t-82.111999\t38.944404999999996\tCheshire village\tOH\tOhio\tGallia County\t212\t40.7\t9.0\t8.7\t20892\t85000\t0.3618\t45620\tObama\t45620\t0.000475984\t45620.0\n16553\t-82.29079399999999\t38.590294\tCrown City village\tOH\tOhio\tGallia County\t418\t41.1\t5.5\t12.5\t15878\t64000\t0.3618\t45623\tObama\t45623\t0.0009384969999999999\t45623.0\n16554\t-82.193407\t38.818597\tGallipolis city\tOH\tOhio\tGallia County\t3773\t45.4\t21.4\t15.5\t19767\t87952\t0.3618\t45631\tObama\t45631\t0.008471169\t45631.0\n16555\t-82.37831800000001\t38.880637\tRio Grande village\tOH\tOhio\tGallia County\t854\t24.3\t21.8\t10.1\t16377\t92857\t0.3618\t45674\tObama\t45674\t0.0019174079999999998\t45674.0\n16556\t-82.338257\t38.977588\tVinton village\tOH\tOhio\tGallia County\t327\t40.4\t10.0\t16.8\t17145\t68333\t0.3618\t45686\tObama\t45686\t0.000734183\t45686.0\n16557\t-82.44560899999999\t38.897877\tCenterville village\tOH\tOhio\tGallia County\t125\t24.3\t22.0\t10.3\t16386\t82500\t0.3618\t45685\tObama\t45685\t0.000280651\t45685.0\n16558\t-81.336331\t41.394254\tBainbridge CDP\tOH\tOhio\tGeauga County\t3612\t44.5\t68.3\t9.3\t49419\t213831\t0.3855\t44023\tObama\t44023\t0.008109691\t44023.0\n16559\t-81.173289\t41.546559\tAquilla village\tOH\tOhio\tGeauga County\t369\t39.4\t22.9\t2.0\t23623\t90000\t0.3855\t44024\tObama\t44024\t0.000828482\t44024.0\n16560\t-81.145778\t41.470746000000005\tBurton village\tOH\tOhio\tGeauga County\t1510\t39.1\t23.7\t7.3\t26731\t142026\t0.3855\t44021\tObama\t44021\t0.003390264\t44021.0\n16561\t-81.074395\t41.460957\tMiddlefield village\tOH\tOhio\tGeauga County\t2453\t36.6\t16.7\t8.5\t24585\t119231\t0.3855\t44062\tObama\t44062\t0.005507495\t44062.0\n16562\t-81.33631899999999\t41.52126\tChesterland CDP\tOH\tOhio\tGeauga County\t2634\t46.4\t39.2\t6.1\t38001\t169986\t0.3855\t44026\tObama\t44026\t0.005913878000000001\t44026.0\n16563\t-81.20828399999999\t41.580261\tChardon village\tOH\tOhio\tGeauga County\t5340\t40.4\t33.3\t11.2\t28917\t155651\t0.3855\t44024\tObama\t44024\t0.01198941\t44024.0\n16564\t-81.334446\t41.431934999999996\tSouth Russell village\tOH\tOhio\tGeauga County\t4079\t44.5\t70.6\t4.6\t47062\t270797\t0.3855\t44023\tObama\t44023\t0.009158203\t44023.0\n16565\t-83.74191400000001\t39.659862\tJamestown village\tOH\tOhio\tGreene County\t1859\t37.7\t11.7\t12.5\t20038\t102400\t0.3863\t45335\tObama\t45335\t0.004173841\t45335.0\n16566\t-84.062749\t39.73115\tBeavercreek city\tOH\tOhio\tGreene County\t43570\t44.3\t47.6\t9.1\t36394\t169096\t0.3863\t45434\tObama\t45434\t0.09782370800000001\t45434.0\n16567\t-84.08610999999999\t39.638674\tBellbrook city\tOH\tOhio\tGreene County\t7163\t40.3\t48.7\t9.5\t33605\t170121\t0.3863\t45305\tObama\t45305\t0.016082423999999998\t45305.0\n16568\t-83.809556\t39.746\tCedarville village\tOH\tOhio\tGreene County\t4193\t21.9\t43.4\t8.5\t18226\t130324\t0.3863\t45314\tObama\t45314\t0.009414157\t45314.0\n16569\t-83.939192\t39.684508\tXenia city\tOH\tOhio\tGreene County\t25258\t36.1\t18.6\t14.3\t22384\t97356\t0.3863\t45385\tObama\t45385\t0.056709460999999996\t45385.0\n16570\t-83.782163\t39.65146\tShawnee Hills CDP\tOH\tOhio\tGreene County\t2334\t39.9\t18.9\t16.4\t24818\t120778\t0.3863\t45335\tObama\t45335\t0.005240315\t45335.0\n16571\t-83.893825\t39.799406\tYellow Springs village\tOH\tOhio\tGreene County\t3853\t43.0\t63.5\t8.9\t33401\t177336\t0.3863\t45387\tObama\t45387\t0.008650786\t45387.0\n16572\t-83.72324499999999\t39.580672\tBowersville village\tOH\tOhio\tGreene County\t305\t38.8\t10.7\t8.6\t21374\t116346\t0.3863\t45307\tObama\t45307\t0.000684788\t45307.0\n16573\t-84.006773\t39.609997\tSpring Valley village\tOH\tOhio\tGreene County\t511\t39.8\t17.3\t18.8\t22505\t56875\t0.3863\t45370\tObama\t45370\t0.001147301\t45370.0\n16574\t-84.05064399999999\t39.817261\tWright-Patterson AFB CDP\tOH\tOhio\tGreene County\t5867\t22.1\t36.8\t15.4\t16844\t41818\t0.3863\t45433\tObama\t45433\t0.013172635\t45433.0\n16575\t-83.825163\t39.798817\tClifton village\tOH\tOhio\tGreene County\t188\t47.5\t45.0\t8.1\t31801\t159375\t0.3863\t45316\tObama\t45316\t0.000422099\t45316.0\n16576\t-84.01418000000001\t39.803611\tFairborn city\tOH\tOhio\tGreene County\t33489\t31.6\t26.1\t13.8\t24356\t107520\t0.3863\t45324\tObama\t45324\t0.075189767\t45324.0\n16577\t-83.88476899999999\t39.715051\tWilberforce CDP\tOH\tOhio\tGreene County\t1778\t22.4\t44.4\t30.4\t18876\t161058\t0.3863\t45384\tObama\t45384\t0.00399198\t45384.0\n16578\t-81.444117\t40.037664\tOld Washington village\tOH\tOhio\tGuernsey County\t296\t42.5\t8.3\t9.3\t16080\t87500\t0.4431\t43768\tObama\t43768\t0.0006645819999999999\t43768.0\n16579\t-81.460024\t39.983253000000005\tLore City village\tOH\tOhio\tGuernsey County\t317\t43.2\t15.3\t11.5\t17156\t75000\t0.4431\t43780\tObama\t43780\t0.0007117310000000001\t43780.0\n16580\t-81.574588\t40.153923\tKimbolton village\tOH\tOhio\tGuernsey County\t191\t45.2\t10.1\t13.3\t17541\t70000\t0.4431\t43749\tObama\t43749\t0.000428835\t43749.0\n16581\t-81.297386\t39.969674\tQuaker City village\tOH\tOhio\tGuernsey County\t606\t31.8\t12.5\t14.4\t14436\t63500\t0.4431\t43773\tObama\t43773\t0.0013605960000000002\t43773.0\n16582\t-81.229711\t40.057365000000004\tFairview village\tOH\tOhio\tGuernsey County\t82\t43.3\t6.8\t14.6\t20220\t75000\t0.4431\t43773\tObama\t43773\t0.000184107\t43773.0\n16583\t-81.543876\t39.903492\tPleasant City village\tOH\tOhio\tGuernsey County\t433\t44.2\t12.1\t18.5\t17754\t63571\t0.4431\t43772\tObama\t43772\t0.000972175\t43772.0\n16584\t-81.459459\t39.934852\tSenecaville village\tOH\tOhio\tGuernsey County\t471\t42.7\t14.7\t11.7\t17719\t73636\t0.4431\t43780\tObama\t43780\t0.001057493\t43780.0\n16585\t-81.587642\t40.024174\tCambridge city\tOH\tOhio\tGuernsey County\t10821\t38.5\t16.3\t14.2\t18472\t71095\t0.4431\t43725\tObama\t43725\t0.024295395\t43725.0\n16586\t-81.65876\t39.85329\tCumberland village\tOH\tOhio\tGuernsey County\t396\t41.9\t6.6\t16.7\t19060\t85909\t0.4431\t43732\tObama\t43732\t0.000889102\t43732.0\n16587\t-81.543965\t39.970877\tByesville village\tOH\tOhio\tGuernsey County\t2495\t36.2\t6.6\t15.6\t17724\t66589\t0.4431\t43723\tObama\t43723\t0.005601794\t43723.0\n16588\t-81.33681899999999\t39.973462\tSalesville village\tOH\tOhio\tGuernsey County\t169\t34.6\t7.8\t10.7\t16249\t71250\t0.4431\t43778\tObama\t43778\t0.00037944\t43778.0\n16589\t-84.59143\t39.199985\tWhite Oak East CDP\tOH\tOhio\tHamilton County\t3420\t40.0\t35.2\t6.0\t29212\t125882\t0.525\t45239\tObama\t45239\t0.007678611\t45239.0\n16590\t-84.456608\t39.227826\tLockland village\tOH\tOhio\tHamilton County\t3456\t37.2\t10.3\t18.4\t21267\t85280\t0.525\t45215\tObama\t45215\t0.0077594380000000004\t45215.0\n16591\t-84.794344\t39.252747\tHarrison city\tOH\tOhio\tHamilton County\t8446\t34.7\t13.5\t9.2\t24515\t118380\t0.525\t45030\tObama\t45030\t0.018963026\t45030.0\n16592\t-84.495798\t39.171258\tSt. Bernard city\tOH\tOhio\tHamilton County\t4775\t37.7\t15.7\t6.2\t24243\t107188\t0.525\t45217\tObama\t45217\t0.010720868\t45217.0\n16593\t-84.575763\t39.292765\tPleasant Run CDP\tOH\tOhio\tHamilton County\t5273\t35.0\t22.4\t10.4\t26843\t117249\t0.525\t45251\tObama\t45251\t0.011838981\t45251.0\n16594\t-84.403272\t39.217324\tDillonvale CDP\tOH\tOhio\tHamilton County\t3592\t46.1\t24.5\t7.7\t28701\t121764\t0.525\t45236\tObama\t45236\t0.008064787\t45236.0\n16595\t-84.747548\t39.163016999999996\tCleves village\tOH\tOhio\tHamilton County\t3237\t34.1\t17.8\t11.3\t25212\t113038\t0.525\t45002\tObama\t45002\t0.007267738\t45002.0\n16596\t-84.48915699999999\t39.185648\tElmwood Place village\tOH\tOhio\tHamilton County\t2641\t34.4\t5.0\t16.6\t16940\t70000\t0.525\t45216\tObama\t45216\t0.005929594\t45216.0\n16597\t-84.338853\t39.071096999999995\tForestville CDP\tOH\tOhio\tHamilton County\t10901\t41.2\t49.2\t7.3\t33353\t162520\t0.525\t45255\tObama\t45255\t0.024475011\t45255.0\n16598\t-84.546743\t39.23356\tMount Healthy city\tOH\tOhio\tHamilton County\t6813\t38.7\t19.4\t9.5\t23978\t98763\t0.525\t45231\tObama\t45231\t0.015296601000000002\t45231.0\n16599\t-84.50613\t39.141321000000005\tCincinnati city\tOH\tOhio\tHamilton County\t318064\t33.2\t30.2\t15.2\t23942\t109095\t0.525\t45220\tObama\t45220\t0.7141198009999999\t45220.0\n16600\t-84.47112800000001\t39.255602\tWoodlawn village\tOH\tOhio\tHamilton County\t3255\t39.8\t39.7\t11.1\t34782\t97255\t0.525\t45215\tObama\t45215\t0.007308151999999999\t45215.0\n16601\t-84.45590200000001\t39.215178\tArlington Heights village\tOH\tOhio\tHamilton County\t900\t34.3\t5.5\t8.9\t19714\t84490\t0.525\t45215\tObama\t45215\t0.002020687\t45215.0\n16602\t-84.710373\t39.137306\tAddyston village\tOH\tOhio\tHamilton County\t1025\t34.1\t10.1\t16.5\t22316\t79286\t0.525\t45001\tObama\t45001\t0.002301338\t45001.0\n16603\t-84.433412\t39.224437\tReading city\tOH\tOhio\tHamilton County\t10920\t39.6\t21.0\t11.2\t26896\t110930\t0.525\t45215\tObama\t45215\t0.02451767\t45215.0\n16604\t-84.61395999999999\t39.201274\tWhite Oak West CDP\tOH\tOhio\tHamilton County\t2989\t44.3\t40.7\t8.3\t35959\t167228\t0.525\t45247\tObama\t45247\t0.006710926\t45247.0\n16605\t-84.370233\t39.106319\tTurpin Hills CDP\tOH\tOhio\tHamilton County\t5002\t42.5\t64.4\t5.8\t44502\t214554\t0.525\t45230\tObama\t45230\t0.01123053\t45230.0\n16606\t-84.36102\t39.085374\tSherwood CDP\tOH\tOhio\tHamilton County\t3825\t41.3\t51.7\t6.7\t32264\t153714\t0.525\t45230\tObama\t45230\t0.00858792\t45230.0\n16607\t-84.397717\t39.203744\tDeer Park city\tOH\tOhio\tHamilton County\t5998\t41.7\t20.1\t9.8\t27925\t111996\t0.525\t45236\tObama\t45236\t0.013466757\t45236.0\n16608\t-84.32197099999999\t39.080228999999996\tCherry Grove CDP\tOH\tOhio\tHamilton County\t4480\t39.3\t36.2\t8.4\t29457\t149276\t0.525\t45255\tObama\t45255\t0.010058530999999999\t45255.0\n16609\t-84.67087099999999\t39.165236\tMack North CDP\tOH\tOhio\tHamilton County\t3914\t39.5\t33.1\t6.4\t34235\t166425\t0.525\t45248\tObama\t45248\t0.008787744\t45248.0\n16610\t-84.453572\t39.160497\tNorwood city\tOH\tOhio\tHamilton County\t20642\t35.9\t17.0\t12.4\t22950\t103095\t0.525\t45212\tObama\t45212\t0.046345581\t45212.0\n16611\t-84.428338\t39.203482\tAmberley village\tOH\tOhio\tHamilton County\t3387\t48.7\t67.3\t8.8\t50767\t210084\t0.525\t45213\tObama\t45213\t0.0076045190000000006\t45213.0\n16612\t-84.373189\t39.185590999999995\tMadeira city\tOH\tOhio\tHamilton County\t8775\t44.9\t45.8\t7.1\t32668\t161888\t0.525\t45243\tObama\t45243\t0.019701699\t45243.0\n16613\t-84.397186\t39.143221999999994\tFairfax village\tOH\tOhio\tHamilton County\t1865\t37.6\t18.6\t9.5\t23961\t110086\t0.525\t45227\tObama\t45227\t0.004187313\t45227.0\n16614\t-84.613782\t39.157738\tCheviot city\tOH\tOhio\tHamilton County\t8702\t37.3\t18.8\t12.0\t25575\t104456\t0.525\t45211\tObama\t45211\t0.019537798999999998\t45211.0\n16615\t-84.587678\t39.18538\tMonfort Heights East CDP\tOH\tOhio\tHamilton County\t3757\t34.1\t33.5\t8.8\t27209\t124041\t0.525\t45239\tObama\t45239\t0.008435246\t45239.0\n16616\t-84.33439399999999\t39.191913\tThe Village of Indian Hill city\tOH\tOhio\tHamilton County\t5865\t47.8\t75.3\t6.8\t76495\t665751\t0.525\t45243\tObama\t45243\t0.013168144\t45243.0\n16617\t-84.251362\t39.276392\tLoveland city\tOH\tOhio\tHamilton County\t12201\t37.0\t43.2\t9.6\t34714\t157002\t0.525\t45140\tObama\t45140\t0.027393781000000002\t45140.0\n16618\t-84.45822\t39.270575\tGlendale village\tOH\tOhio\tHamilton County\t2157\t49.5\t60.6\t11.3\t46603\t195109\t0.525\t45246\tObama\t45246\t0.004842913\t45246.0\n16619\t-84.525906\t39.286103000000004\tForest Park city\tOH\tOhio\tHamilton County\t19855\t36.9\t29.1\t9.8\t27798\t113777\t0.525\t45240\tObama\t45240\t0.044578603\t45240.0\n16620\t-84.59698399999999\t39.229224\tGroesbeck CDP\tOH\tOhio\tHamilton County\t7128\t36.9\t21.4\t9.5\t25238\t113980\t0.525\t45251\tObama\t45251\t0.016003842\t45251.0\n16621\t-84.345899\t39.249417\tMontgomery city\tOH\tOhio\tHamilton County\t10466\t45.9\t62.6\t7.3\t47135\t224093\t0.525\t45242\tObama\t45242\t0.023498346\t45242.0\n16622\t-84.367029\t39.069839\tFruit Hill CDP\tOH\tOhio\tHamilton County\t3971\t42.6\t46.2\t6.8\t34863\t138417\t0.525\t45230\tObama\t45230\t0.008915721\t45230.0\n16623\t-84.740473\t39.150374\tNorth Bend village\tOH\tOhio\tHamilton County\t670\t35.4\t13.5\t16.4\t26110\t94583\t0.525\t45002\tObama\t45002\t0.001504289\t45002.0\n16624\t-84.519624\t39.26696\tGreenhills village\tOH\tOhio\tHamilton County\t3981\t36.9\t34.6\t10.1\t27435\t115133\t0.525\t45218\tObama\t45218\t0.008938173\t45218.0\n16625\t-84.446966\t39.187799\tGolf Manor village\tOH\tOhio\tHamilton County\t3871\t40.9\t23.9\t13.9\t24027\t90439\t0.525\t45237\tObama\t45237\t0.008691200000000001\t45237.0\n16626\t-84.51442\t39.215897999999996\tFinneytown CDP\tOH\tOhio\tHamilton County\t13387\t40.9\t41.2\t10.9\t29785\t122766\t0.525\t45224\tObama\t45224\t0.030056597999999997\t45224.0\n16627\t-84.456926\t39.243575\tLincoln Heights village\tOH\tOhio\tHamilton County\t3788\t31.5\t7.0\t18.5\t14571\t69130\t0.525\t45215\tObama\t45215\t0.008504847\t45215.0\n16628\t-84.481526\t39.229766\tWyoming city\tOH\tOhio\tHamilton County\t8375\t43.9\t66.6\t11.6\t41563\t210089\t0.525\t45215\tObama\t45215\t0.018803616000000002\t45215.0\n16629\t-84.606189\t39.215327\tWhite Oak CDP\tOH\tOhio\tHamilton County\t13480\t38.9\t25.7\t10.8\t30004\t129118\t0.525\t45239\tObama\t45239\t0.030265402\t45239.0\n16630\t-84.549366\t39.301718\tPleasant Run Farm CDP\tOH\tOhio\tHamilton County\t4752\t34.3\t31.3\t9.3\t26976\t127716\t0.525\t45240\tObama\t45240\t0.010669228000000001\t45240.0\n16631\t-84.378201\t39.143313\tMariemont village\tOH\tOhio\tHamilton County\t3529\t40.0\t65.8\t4.7\t37125\t222368\t0.525\t45227\tObama\t45227\t0.007923339\t45227.0\n16632\t-84.382607\t39.248397\tBlue Ash city\tOH\tOhio\tHamilton County\t12322\t42.9\t51.7\t8.3\t38794\t161337\t0.525\t45242\tObama\t45242\t0.027665452000000004\t45242.0\n16633\t-84.63565200000001\t39.15983\tBridgetown North CDP\tOH\tOhio\tHamilton County\t12339\t40.2\t20.9\t8.5\t25008\t118269\t0.525\t45248\tObama\t45248\t0.02770362\t45248.0\n16634\t-84.59421800000001\t39.253325\tNorthgate CDP\tOH\tOhio\tHamilton County\t7893\t38.4\t17.1\t9.1\t24246\t114868\t0.525\t45251\tObama\t45251\t0.017721426000000002\t45251.0\n16635\t-84.569328\t39.270345\tMount Healthy Heights CDP\tOH\tOhio\tHamilton County\t3427\t34.6\t17.5\t11.7\t24905\t100089\t0.525\t45251\tObama\t45251\t0.007694327\t45251.0\n16636\t-84.725411\t39.192035\tGrandview CDP\tOH\tOhio\tHamilton County\t1372\t38.1\t19.7\t16.7\t24477\t101434\t0.525\t45002\tObama\t45002\t0.003080425\t45002.0\n16637\t-84.636593\t39.126633\tCovedale CDP\tOH\tOhio\tHamilton County\t6284\t43.6\t34.0\t8.6\t33883\t143708\t0.525\t45238\tObama\t45238\t0.014108886000000001\t45238.0\n16638\t-84.311491\t39.158297999999995\tTerrace Park village\tOH\tOhio\tHamilton County\t2265\t40.7\t73.6\t6.5\t46112\t310526\t0.525\t45174\tObama\t45174\t0.005085396\t45174.0\n16639\t-84.36608000000001\t39.297288\tSharonville city\tOH\tOhio\tHamilton County\t13388\t42.6\t37.2\t9.5\t31197\t136096\t0.525\t45241\tObama\t45241\t0.030058843\t45241.0\n16640\t-84.374575\t39.206755\tKenwood CDP\tOH\tOhio\tHamilton County\t7206\t47.5\t53.0\t7.7\t34908\t183520\t0.525\t45236\tObama\t45236\t0.016178968000000002\t45236.0\n16641\t-84.351375\t39.124177\tNewtown village\tOH\tOhio\tHamilton County\t2583\t40.7\t51.7\t9.0\t48277\t189179\t0.525\t45244\tObama\t45244\t0.005799372\t45244.0\n16642\t-84.47606\t39.290876000000004\tSpringdale city\tOH\tOhio\tHamilton County\t10405\t42.9\t30.6\t11.6\t27504\t120603\t0.525\t45246\tObama\t45246\t0.023361387999999997\t45246.0\n16643\t-84.61018299999999\t39.176107\tMonfort Heights South CDP\tOH\tOhio\tHamilton County\t4945\t43.6\t28.4\t6.2\t34799\t130198\t0.525\t45211\tObama\t45211\t0.011102553000000001\t45211.0\n16644\t-84.40079899999999\t39.188266999999996\tSilverton city\tOH\tOhio\tHamilton County\t4977\t42.4\t24.3\t10.8\t25260\t110987\t0.525\t45236\tObama\t45236\t0.0111744\t45236.0\n16645\t-84.579633\t39.246678\tNorthbrook CDP\tOH\tOhio\tHamilton County\t10978\t36.6\t14.8\t10.8\t24051\t88861\t0.525\t45251\tObama\t45251\t0.024647892\t45251.0\n16646\t-84.671612\t39.139989\tMack South CDP\tOH\tOhio\tHamilton County\t5788\t44.2\t39.5\t7.2\t35468\t181610\t0.525\t45233\tObama\t45233\t0.012995263\t45233.0\n16647\t-84.426618\t39.250797999999996\tEvendale village\tOH\tOhio\tHamilton County\t3023\t46.9\t60.4\t8.5\t47955\t224238\t0.525\t45215\tObama\t45215\t0.006787263000000001\t45215.0\n16648\t-84.551917\t39.217442999999996\tNorth College Hill city\tOH\tOhio\tHamilton County\t9716\t38.1\t16.9\t12.1\t23634\t93227\t0.525\t45224\tObama\t45224\t0.02181444\t45224.0\n16649\t-84.659508\t39.192303\tDent CDP\tOH\tOhio\tHamilton County\t9825\t42.1\t27.5\t7.0\t31165\t140058\t0.525\t45247\tObama\t45247\t0.022059167\t45247.0\n16650\t-84.33095\t39.104715999999996\tDry Run CDP\tOH\tOhio\tHamilton County\t7427\t40.2\t61.6\t8.9\t50066\t188796\t0.525\t45244\tObama\t45244\t0.016675159\t45244.0\n16651\t-83.726686\t40.900222\tJenera village\tOH\tOhio\tHancock County\t270\t41.5\t22.1\t8.9\t21132\t110294\t0.35200000000000004\t45841\tObama\t45841\t0.000606206\t45841.0\n16652\t-83.791919\t41.00488\tBenton Ridge village\tOH\tOhio\tHancock County\t328\t39.7\t22.4\t13.4\t26321\t123750\t0.35200000000000004\t45816\tObama\t45816\t0.000736428\t45816.0\n16653\t-83.648909\t41.138668\tVan Buren village\tOH\tOhio\tHancock County\t326\t42.5\t18.7\t15.1\t27610\t135227\t0.35200000000000004\t45889\tObama\t45889\t0.000731938\t45889.0\n16654\t-83.652838\t40.893198\tArlington village\tOH\tOhio\tHancock County\t1568\t40.8\t21.4\t8.3\t22136\t113785\t0.35200000000000004\t45814\tObama\t45814\t0.0035204859999999998\t45814.0\n16655\t-83.789393\t41.107296999999996\tMcComb village\tOH\tOhio\tHancock County\t1826\t34.8\t15.3\t9.0\t19181\t103046\t0.35200000000000004\t45858\tObama\t45858\t0.00409975\t45858.0\n16656\t-83.6394\t41.044577000000004\tFindlay city\tOH\tOhio\tHancock County\t40522\t36.9\t28.2\t10.0\t27232\t116557\t0.35200000000000004\t45840\tObama\t45840\t0.090980314\t45840.0\n16657\t-83.823476\t40.9348\tMount Cory village\tOH\tOhio\tHancock County\t211\t42.7\t16.2\t5.3\t22650\t115000\t0.35200000000000004\t45868\tObama\t45868\t0.00047373900000000004\t45868.0\n16658\t-83.556846\t40.898477\tMount Blanchard village\tOH\tOhio\tHancock County\t516\t39.6\t16.9\t9.6\t25631\t107337\t0.35200000000000004\t45867\tObama\t45867\t0.001158527\t45867.0\n16659\t-83.784941\t40.956934999999994\tRawson village\tOH\tOhio\tHancock County\t505\t39.7\t12.6\t6.3\t21550\t95500\t0.35200000000000004\t45881\tObama\t45881\t0.00113383\t45881.0\n16660\t-83.511649\t41.111636\tArcadia village\tOH\tOhio\tHancock County\t530\t37.8\t12.0\t10.6\t23859\t94091\t0.35200000000000004\t44804\tObama\t44804\t0.00118996\t44804.0\n16661\t-83.482184\t40.974514\tVanlue village\tOH\tOhio\tHancock County\t391\t39.3\t16.7\t10.4\t22243\t115726\t0.35200000000000004\t45890\tObama\t45890\t0.0008778760000000001\t45890.0\n16662\t-83.60647900000001\t40.646770000000004\tKenton city\tOH\tOhio\tHardin County\t8046\t38.4\t9.6\t12.5\t20808\t78538\t0.371\t43326\tObama\t43326\t0.018064943\t43326.0\n16663\t-83.51195\t40.802966999999995\tForest village\tOH\tOhio\tHardin County\t1386\t35.5\t8.2\t13.2\t20633\t81667\t0.371\t45843\tObama\t45843\t0.003111858\t45843.0\n16664\t-83.785975\t40.6926\tMcGuffey village\tOH\tOhio\tHardin County\t511\t37.4\t5.7\t14.5\t16933\t86923\t0.371\t45859\tObama\t45859\t0.001147301\t45859.0\n16665\t-83.568489\t40.515453\tRidgeway village\tOH\tOhio\tHardin County\t374\t35.9\t12.1\t8.5\t19670\t101563\t0.371\t43345\tObama\t43345\t0.000839708\t43345.0\n16666\t-83.824472\t40.768368\tAda village\tOH\tOhio\tHardin County\t5933\t22.9\t36.7\t11.9\t18075\t87529\t0.371\t45810\tObama\t45810\t0.013320818\t45810.0\n16667\t-83.51982199999999\t40.533359999999995\tMount Victory village\tOH\tOhio\tHardin County\t669\t37.1\t6.6\t6.2\t22642\t87692\t0.371\t43340\tObama\t43340\t0.001502044\t43340.0\n16668\t-83.642995\t40.787967\tDunkirk village\tOH\tOhio\tHardin County\t918\t36.4\t14.3\t12.2\t18037\t76400\t0.371\t45836\tObama\t45836\t0.002061101\t45836.0\n16669\t-83.84396\t40.709489000000005\tAlger village\tOH\tOhio\tHardin County\t873\t38.6\t8.4\t15.2\t16023\t75227\t0.371\t45812\tObama\t45812\t0.001960066\t45812.0\n16670\t-83.526101\t40.782187\tPatterson village\tOH\tOhio\tHardin County\t127\t39.1\t5.8\t12.1\t18808\t83750\t0.371\t45843\tObama\t45843\t0.000285141\t45843.0\n16671\t-81.268681\t40.210974\tFreeport village\tOH\tOhio\tHarrison County\t373\t42.6\t12.6\t13.2\t17578\t70588\t0.4131\t43973\tObama\t43973\t0.000837463\t43973.0\n16672\t-80.99467\t40.184689\tNew Athens village\tOH\tOhio\tHarrison County\t305\t42.1\t6.1\t13.5\t16390\t67000\t0.4131\t43981\tObama\t43981\t0.000684788\t43981.0\n16673\t-80.99814599999999\t40.264515\tCadiz village\tOH\tOhio\tHarrison County\t3038\t44.8\t11.1\t7.0\t21665\t78261\t0.4131\t43907\tObama\t43907\t0.006820941999999999\t43907.0\n16674\t-81.088151\t40.399028\tScio village\tOH\tOhio\tHarrison County\t810\t46.4\t7.9\t10.8\t20154\t75938\t0.4131\t43988\tObama\t43988\t0.001818618\t43988.0\n16675\t-81.18741\t40.427284\tBowerston village\tOH\tOhio\tHarrison County\t422\t45.0\t9.1\t13.3\t17458\t83333\t0.4131\t44695\tObama\t44695\t0.0009474780000000001\t44695.0\n16676\t-80.89554\t40.323033\tHopedale village\tOH\tOhio\tHarrison County\t908\t47.6\t6.8\t14.5\t24187\t74375\t0.4131\t43976\tObama\t43976\t0.002038649\t43976.0\n16677\t-81.003066\t40.368088\tJewett village\tOH\tOhio\tHarrison County\t799\t40.9\t6.9\t13.2\t18701\t63871\t0.4131\t43986\tObama\t43986\t0.001793921\t43986.0\n16678\t-80.88693\t40.181521000000004\tHarrisville village\tOH\tOhio\tHarrison County\t257\t46.3\t7.7\t17.1\t18768\t65000\t0.4131\t43974\tObama\t43974\t0.000577018\t43974.0\n16679\t-81.18837099999999\t40.308572999999996\tDeersville village\tOH\tOhio\tHarrison County\t83\t45.8\t6.7\t7.7\t20463\t86250\t0.4131\t44693\tObama\t44693\t0.000186352\t44693.0\n16680\t-84.007683\t41.443528\tLiberty Center village\tOH\tOhio\tHenry County\t1237\t37.4\t15.2\t15.5\t20517\t98113\t0.3974\t43532\tObama\t43532\t0.002777322\t43532.0\n16681\t-84.12929\t41.249361\tHolgate village\tOH\tOhio\tHenry County\t1188\t36.0\t10.6\t13.2\t23448\t72045\t0.3974\t43527\tObama\t43527\t0.0026673070000000003\t43527.0\n16682\t-84.200376\t41.323840000000004\tFlorida village\tOH\tOhio\tHenry County\t244\t44.1\t12.7\t12.1\t23701\t115179\t0.3974\t43527\tObama\t43527\t0.000547831\t43527.0\n16683\t-83.905503\t41.207367\tDeshler village\tOH\tOhio\tHenry County\t1705\t37.4\t11.9\t12.7\t21001\t82091\t0.3974\t43516\tObama\t43516\t0.0038280790000000003\t43516.0\n16684\t-84.033612\t41.230429\tHamler village\tOH\tOhio\tHenry County\t677\t36.4\t10.5\t13.8\t19701\t91136\t0.3974\t43524\tObama\t43524\t0.001520006\t43524.0\n16685\t-84.1256\t41.395812\tNapoleon city\tOH\tOhio\tHenry County\t8976\t37.9\t17.0\t12.7\t23256\t106054\t0.3974\t43545\tObama\t43545\t0.020152986\t43545.0\n16686\t-83.941331\t41.370899\tMcClure village\tOH\tOhio\tHenry County\t755\t39.3\t9.2\t15.3\t20478\t81000\t0.3974\t43534\tObama\t43534\t0.001695132\t43534.0\n16687\t-84.035368\t41.319635999999996\tMalinta village\tOH\tOhio\tHenry County\t290\t41.1\t9.5\t13.9\t21122\t99444\t0.3974\t43535\tObama\t43535\t0.00065111\t43535.0\n16688\t-84.167542\t41.203708\tNew Bavaria village\tOH\tOhio\tHenry County\t79\t42.1\t12.5\t16.0\t22394\t90833\t0.3974\t43548\tObama\t43548\t0.00017737099999999998\t43548.0\n16689\t-83.387141\t39.074728\tSinking Spring village\tOH\tOhio\tHighland County\t162\t41.3\t8.0\t24.7\t19344\t115625\t0.3391\t45172\tObama\t45172\t0.000363724\t45172.0\n16690\t-83.75185400000001\t39.040562\tMowrystown village\tOH\tOhio\tHighland County\t372\t36.0\t7.9\t14.6\t20947\t90000\t0.3391\t45155\tObama\t45155\t0.000835217\t45155.0\n16691\t-83.611007\t39.213685\tHillsboro city\tOH\tOhio\tHighland County\t6328\t39.8\t16.6\t21.0\t20368\t102550\t0.3391\t45133\tObama\t45133\t0.014207675\t45133.0\n16692\t-83.554919\t39.345963\tLeesburg village\tOH\tOhio\tHighland County\t1384\t35.4\t10.1\t21.0\t19550\t95541\t0.3391\t45135\tObama\t45135\t0.0031073679999999997\t45135.0\n16693\t-83.599958\t39.343984999999996\tHighland village\tOH\tOhio\tHighland County\t308\t37.1\t10.2\t16.9\t22773\t100694\t0.3391\t45132\tObama\t45132\t0.0006915239999999999\t45132.0\n16694\t-83.787178\t39.241772\tLynchburg village\tOH\tOhio\tHighland County\t1426\t35.2\t10.9\t14.9\t19956\t98191\t0.3391\t45142\tObama\t45142\t0.0032016659999999997\t45142.0\n16695\t-83.389052\t39.354239\tGreenfield city\tOH\tOhio\tHighland County\t4930\t36.7\t11.7\t21.4\t19519\t79653\t0.3391\t45123\tObama\t45123\t0.011068875\t45123.0\n16696\t-82.16740899999999\t39.509547\tMurray City village\tOH\tOhio\tHocking County\t435\t39.3\t5.3\t12.1\t14833\t41364\t0.4837\t43144\tObama\t43144\t0.000976665\t43144.0\n16697\t-82.398965\t39.537252\tLogan city\tOH\tOhio\tHocking County\t6795\t39.2\t13.1\t12.0\t19165\t88762\t0.4837\t43138\tObama\t43138\t0.015256188\t43138.0\n16698\t-82.737339\t39.471872\tLaurelville village\tOH\tOhio\tHocking County\t538\t41.6\t7.0\t10.8\t17765\t93235\t0.4837\t43101\tObama\t43101\t0.001207922\t43101.0\n16699\t-81.91405300000001\t40.553304\tMillersburg village\tOH\tOhio\tHolmes County\t3352\t38.2\t21.5\t8.8\t19622\t94247\t0.2261\t44654\tObama\t44654\t0.007525937\t44654.0\n16700\t-82.112875\t40.595869\tNashville village\tOH\tOhio\tHolmes County\t182\t35.2\t11.5\t8.5\t18478\t103571\t0.2261\t44661\tObama\t44661\t0.000408628\t44661.0\n16701\t-82.092288\t40.519024\tGlenmont village\tOH\tOhio\tHolmes County\t331\t38.6\t8.6\t12.1\t19998\t89286\t0.2261\t44628\tObama\t44628\t0.0007431639999999999\t44628.0\n16702\t-81.923221\t40.628943\tHolmesville village\tOH\tOhio\tHolmes County\t407\t33.1\t6.2\t7.6\t16628\t132500\t0.2261\t44633\tObama\t44633\t0.0009138\t44633.0\n16703\t-81.98281800000001\t40.497459\tKillbuck village\tOH\tOhio\tHolmes County\t881\t38.5\t7.1\t11.3\t17870\t76852\t0.2261\t44637\tObama\t44637\t0.0019780279999999997\t44637.0\n16704\t-82.406894\t41.079775\tNew London village\tOH\tOhio\tHuron County\t2652\t36.7\t14.6\t11.7\t22073\t98846\t0.4463\t44851\tObama\t44851\t0.005954291\t44851.0\n16705\t-82.701899\t41.244175\tMonroeville village\tOH\tOhio\tHuron County\t1491\t38.0\t13.4\t14.1\t21324\t121101\t0.4463\t44847\tObama\t44847\t0.003347605\t44847.0\n16706\t-82.403615\t41.255325\tWakeman village\tOH\tOhio\tHuron County\t1007\t37.1\t9.6\t14.5\t25016\t109511\t0.4463\t44889\tObama\t44889\t0.002260924\t44889.0\n16707\t-82.518762\t41.030525\tGreenwich village\tOH\tOhio\tHuron County\t1431\t34.8\t9.3\t15.6\t17924\t89625\t0.4463\t44837\tObama\t44837\t0.003212892\t44837.0\n16708\t-82.72306400000001\t41.051475\tWillard city\tOH\tOhio\tHuron County\t6691\t32.7\t9.0\t22.0\t18588\t88256\t0.4463\t44890\tObama\t44890\t0.015022686\t44890.0\n16709\t-82.610833\t41.242733\tNorwalk city\tOH\tOhio\tHuron County\t16562\t35.0\t18.6\t15.6\t22823\t115839\t0.4463\t44857\tObama\t44857\t0.037185132999999995\t44857.0\n16710\t-82.613742\t41.104498\tNorth Fairfield village\tOH\tOhio\tHuron County\t586\t35.2\t6.4\t16.0\t19454\t104032\t0.4463\t44855\tObama\t44855\t0.001315692\t44855.0\n16711\t-82.667516\t41.003591\tPlymouth village\tOH\tOhio\tHuron County\t1788\t36.8\t8.6\t15.3\t20597\t80000\t0.4463\t44865\tObama\t44865\t0.004014432\t44865.0\n16712\t-82.65383800000001\t39.047767\tJackson city\tOH\tOhio\tJackson County\t6190\t39.9\t19.3\t12.5\t20145\t91373\t0.3861\t45640\tObama\t45640\t0.013897837\t45640.0\n16713\t-82.610837\t39.111791\tCoalton village\tOH\tOhio\tJackson County\t548\t34.7\t9.3\t21.9\t10893\t70833\t0.3861\t45621\tObama\t45621\t0.001230374\t45621.0\n16714\t-82.569106\t38.89617\tOak Hill village\tOH\tOhio\tJackson County\t1736\t40.3\t17.7\t16.8\t17846\t69741\t0.3861\t45656\tObama\t45656\t0.0038976809999999996\t45656.0\n16715\t-82.537515\t39.11725\tWellston city\tOH\tOhio\tJackson County\t6007\t37.3\t11.3\t14.4\t17932\t71164\t0.3861\t45692\tObama\t45692\t0.013486963999999999\t45692.0\n16716\t-80.631592\t40.525263\tStratton village\tOH\tOhio\tJefferson County\t250\t44.7\t9.7\t13.3\t14996\t60500\t0.4652\t43961\tObama\t43961\t0.000561302\t43961.0\n16717\t-80.771555\t40.432796\tRichmond village\tOH\tOhio\tJefferson County\t480\t46.5\t9.3\t12.2\t21018\t93333\t0.4652\t43944\tObama\t43944\t0.0010777\t43944.0\n16718\t-80.707451\t40.376342\tWintersville village\tOH\tOhio\tJefferson County\t3838\t47.3\t21.3\t12.0\t24876\t98528\t0.4652\t43953\tObama\t43953\t0.008617108\t43953.0\n16719\t-80.873251\t40.217713\tAdena village\tOH\tOhio\tJefferson County\t812\t47.0\t7.6\t15.7\t20756\t61406\t0.4652\t43901\tObama\t43901\t0.0018231089999999998\t43901.0\n16720\t-80.817472\t40.342223\tBloomingdale village\tOH\tOhio\tJefferson County\t210\t42.7\t15.9\t8.3\t21472\t90000\t0.4652\t43910\tObama\t43910\t0.00047149400000000004\t43910.0\n16721\t-80.799571\t40.175702\tMount Pleasant village\tOH\tOhio\tJefferson County\t490\t45.7\t11.6\t12.1\t21336\t70357\t0.4652\t43939\tObama\t43939\t0.001100152\t43939.0\n16722\t-80.625825\t40.511412\tEmpire village\tOH\tOhio\tJefferson County\t269\t44.7\t8.9\t13.9\t14388\t59500\t0.4652\t43926\tObama\t43926\t0.000603961\t43926.0\n16723\t-80.726298\t40.573174\tIrondale village\tOH\tOhio\tJefferson County\t438\t42.0\t11.0\t14.8\t17815\t69167\t0.4652\t43932\tObama\t43932\t0.000983401\t43932.0\n16724\t-80.88522900000001\t40.520768\tBergholz village\tOH\tOhio\tJefferson County\t684\t40.0\t11.3\t12.1\t20567\t67037\t0.4652\t43908\tObama\t43908\t0.0015357220000000002\t43908.0\n16725\t-80.775284\t40.19853\tDillonvale village\tOH\tOhio\tJefferson County\t718\t45.4\t5.9\t12.9\t16199\t52258\t0.4652\t43917\tObama\t43917\t0.0016120589999999999\t43917.0\n16726\t-80.616008\t40.323834000000005\tMingo Junction village\tOH\tOhio\tJefferson County\t3276\t46.4\t11.1\t14.3\t20659\t77990\t0.4652\t43938\tObama\t43938\t0.007355301\t43938.0\n16727\t-80.697172\t40.172226\tTiltonsville village\tOH\tOhio\tJefferson County\t1241\t47.1\t12.2\t15.1\t18931\t72500\t0.4652\t43963\tObama\t43963\t0.002786303\t43963.0\n16728\t-80.921553\t40.47167\tAmsterdam village\tOH\tOhio\tJefferson County\t475\t40.8\t7.1\t11.6\t17324\t58056\t0.4652\t43903\tObama\t43903\t0.001066474\t43903.0\n16729\t-80.777396\t40.271428\tSmithfield village\tOH\tOhio\tJefferson County\t724\t45.8\t7.0\t20.7\t19133\t66719\t0.4652\t43948\tObama\t43948\t0.0016255310000000002\t43948.0\n16730\t-80.69118900000001\t40.183701\tRayland village\tOH\tOhio\tJefferson County\t414\t47.1\t11.2\t14.4\t18210\t75000\t0.4652\t43963\tObama\t43963\t0.000929516\t43963.0\n16731\t-80.649935\t40.368139\tSteubenville city\tOH\tOhio\tJefferson County\t18287\t43.8\t21.1\t17.8\t20611\t86250\t0.4652\t43952\tObama\t43952\t0.041058117000000005\t43952.0\n16732\t-80.67497\t40.291674\tNew Alexandria village\tOH\tOhio\tJefferson County\t199\t43.5\t6.3\t12.5\t18036\t60000\t0.4652\t43938\tObama\t43938\t0.000446796\t43938.0\n16733\t-80.60753000000001\t40.457785\tToronto city\tOH\tOhio\tJefferson County\t5201\t42.3\t9.7\t16.2\t20293\t76259\t0.4652\t43964\tObama\t43964\t0.011677326000000002\t43964.0\n16734\t-82.35432\t40.269586\tMartinsburg village\tOH\tOhio\tKnox County\t210\t40.0\t13.6\t3.6\t16830\t133750\t0.3688\t43037\tObama\t43037\t0.00047149400000000004\t43037.0\n16735\t-82.39465200000001\t40.376205999999996\tGambier village\tOH\tOhio\tKnox County\t2167\t22.0\t58.7\t12.9\t22258\t147059\t0.3688\t43022\tObama\t43022\t0.004865365\t43022.0\n16736\t-82.69636700000001\t40.303798\tCenterburg village\tOH\tOhio\tKnox County\t1663\t38.3\t18.7\t8.5\t23691\t134776\t0.3688\t43011\tObama\t43011\t0.003733781\t43011.0\n16737\t-82.191356\t40.469235\tGann village\tOH\tOhio\tKnox County\t158\t35.8\t11.0\t10.4\t16258\t108333\t0.3688\t43006\tObama\t43006\t0.00035474300000000003\t43006.0\n16738\t-82.472353\t40.385269\tMount Vernon city\tOH\tOhio\tKnox County\t15985\t37.9\t22.7\t12.8\t21082\t101373\t0.3688\t43050\tObama\t43050\t0.035889647999999996\t43050.0\n16739\t-82.544483\t40.478639\tFredericktown village\tOH\tOhio\tKnox County\t2470\t38.1\t20.1\t7.8\t23571\t102222\t0.3688\t43019\tObama\t43019\t0.005545663\t43019.0\n16740\t-82.26067900000001\t40.446913\tDanville village\tOH\tOhio\tKnox County\t1240\t36.4\t14.7\t12.3\t17745\t96500\t0.3688\t43014\tObama\t43014\t0.002784058\t43014.0\n16741\t-81.319521\t41.63615\tKirtland Hills village\tOH\tOhio\tLake County\t612\t49.1\t53.1\t3.8\t73438\t452632\t0.4871\t44060\tObama\t44060\t0.001374067\t44060.0\n16742\t-81.340689\t41.596796999999995\tKirtland city\tOH\tOhio\tLake County\t6830\t46.5\t37.9\t8.1\t35927\t198605\t0.4871\t44094\tObama\t44094\t0.01533477\t44094.0\n16743\t-81.364924\t41.713316999999996\tMentor-on-the-Lake city\tOH\tOhio\tLake County\t8003\t37.4\t17.3\t10.5\t25903\t125024\t0.4871\t440HH\tObama\t440HH\t0.017968399\t0.0\n16744\t-81.143557\t41.76389\tPerry village\tOH\tOhio\tLake County\t1568\t43.1\t26.2\t8.0\t25660\t153739\t0.4871\t44081\tObama\t44081\t0.0035204859999999998\t44081.0\n16745\t-81.442792\t41.665538\tTimberlake village\tOH\tOhio\tLake County\t755\t50.5\t26.9\t8.1\t30721\t161644\t0.4871\t44095\tObama\t44095\t0.001695132\t44095.0\n16746\t-81.454466\t41.65957\tLakeline village\tOH\tOhio\tLake County\t172\t44.5\t10.7\t9.0\t25744\t115000\t0.4871\t44095\tObama\t44095\t0.000386176\t44095.0\n16747\t-81.04899300000001\t41.829785\tNorth Madison CDP\tOH\tOhio\tLake County\t8897\t36.9\t11.2\t10.5\t23862\t105881\t0.4871\t44057\tObama\t44057\t0.019975615\t44057.0\n16748\t-81.433145\t41.587385\tWilloughby Hills city\tOH\tOhio\tLake County\t9264\t46.1\t37.5\t9.5\t32580\t222466\t0.4871\t44092\tObama\t44092\t0.020799606\t44092.0\n16749\t-81.124309\t41.799964\tNorth Perry village\tOH\tOhio\tLake County\t920\t44.3\t19.5\t9.1\t26320\t148897\t0.4871\t44081\tObama\t44081\t0.002065591\t44081.0\n16750\t-81.336246\t41.689323\tMentor city\tOH\tOhio\tLake County\t50509\t42.4\t32.1\t7.7\t30595\t157057\t0.4871\t44060\tObama\t44060\t0.113403205\t44060.0\n16751\t-81.467838\t41.634278\tWillowick city\tOH\tOhio\tLake County\t14233\t44.3\t17.4\t11.2\t26708\t118880\t0.4871\t44095\tObama\t44095\t0.031956043999999996\t44095.0\n16752\t-81.273025\t41.747653\tFairport Harbor village\tOH\tOhio\tLake County\t3384\t38.4\t18.2\t5.4\t24245\t105124\t0.4871\t44077\tObama\t44077\t0.007597783\t44077.0\n16753\t-81.284549\t41.741873\tGrand River village\tOH\tOhio\tLake County\t378\t40.4\t10.9\t8.4\t22859\t125735\t0.4871\t44077\tObama\t44077\t0.0008486889999999999\t44077.0\n16754\t-81.46907900000001\t41.60729\tWickliffe city\tOH\tOhio\tLake County\t13150\t45.2\t19.6\t8.5\t27265\t122527\t0.4871\t44092\tObama\t44092\t0.029524484\t44092.0\n16755\t-81.053547\t41.772490999999995\tMadison village\tOH\tOhio\tLake County\t3072\t41.1\t27.0\t10.3\t26427\t135272\t0.4871\t44057\tObama\t44057\t0.006897279\t44057.0\n16756\t-81.40841\t41.646031\tWilloughby city\tOH\tOhio\tLake County\t23375\t41.8\t28.0\t9.0\t30856\t134176\t0.4871\t44094\tObama\t44094\t0.052481734\t44094.0\n16757\t-81.38549\t41.612507\tWaite Hill village\tOH\tOhio\tLake County\t449\t53.4\t62.8\t7.5\t62146\t444444\t0.4871\t44094\tObama\t44094\t0.001008098\t44094.0\n16758\t-81.432356\t41.65821\tEastlake city\tOH\tOhio\tLake County\t19922\t41.0\t15.1\t9.3\t25607\t120191\t0.4871\t44095\tObama\t44095\t0.044729030999999995\t44095.0\n16759\t-81.253066\t41.724471\tPainesville city\tOH\tOhio\tLake County\t18487\t31.9\t15.7\t15.2\t19210\t101068\t0.4871\t44077\tObama\t44077\t0.041507157999999995\t44077.0\n16760\t-82.64231\t38.497819\tCoal Grove village\tOH\tOhio\tLawrence County\t1948\t41.8\t8.6\t10.2\t15234\t72951\t0.4159\t45638\tObama\t45638\t0.004373665\t45638.0\n16761\t-82.381557\t38.437734000000006\tProctorville village\tOH\tOhio\tLawrence County\t736\t38.9\t9.3\t13.9\t15063\t70714\t0.4159\t45669\tObama\t45669\t0.0016524729999999998\t45669.0\n16762\t-82.454228\t38.429909\tChesapeake village\tOH\tOhio\tLawrence County\t818\t41.4\t13.0\t8.2\t19636\t89375\t0.4159\t45619\tObama\t45619\t0.00183658\t45619.0\n16763\t-82.677787\t38.53159\tIronton city\tOH\tOhio\tLawrence County\t10696\t44.0\t13.5\t10.0\t19613\t87183\t0.4159\t45638\tObama\t45638\t0.024014743999999998\t45638.0\n16764\t-82.309554\t38.512716\tAthalia village\tOH\tOhio\tLawrence County\t343\t38.9\t16.7\t11.8\t18408\t111413\t0.4159\t45669\tObama\t45669\t0.0007701060000000001\t45669.0\n16765\t-82.72793\t38.56012\tHanging Rock village\tOH\tOhio\tLawrence County\t274\t37.6\t9.5\t9.2\t17578\t68333\t0.4159\t45638\tObama\t45638\t0.000615187\t45638.0\n16766\t-82.52896199999999\t38.409867\tBurlington CDP\tOH\tOhio\tLawrence County\t2791\t47.8\t12.0\t7.9\t18491\t74340\t0.4159\t45680\tObama\t45680\t0.006266375\t45680.0\n16767\t-82.575314\t38.418821\tSouth Point village\tOH\tOhio\tLawrence County\t3845\t42.0\t17.1\t6.7\t20554\t111369\t0.4159\t45680\tObama\t45680\t0.008632824\t45680.0\n16768\t-82.611766\t40.089374\tAlexandria village\tOH\tOhio\tLicking County\t257\t39.9\t31.1\t5.1\t27639\t181250\t0.4202\t43001\tObama\t43001\t0.000577018\t43001.0\n16769\t-82.489971\t39.963278\tHebron village\tOH\tOhio\tLicking County\t2276\t37.4\t10.3\t11.7\t22585\t94077\t0.4202\t43025\tObama\t43025\t0.005110093\t43025.0\n16770\t-82.716193\t40.011074\tPataskala city\tOH\tOhio\tLicking County\t13727\t36.6\t25.6\t8.6\t28126\t151208\t0.4202\t43062\tObama\t43062\t0.030819969\t43062.0\n16771\t-82.596817\t39.948327\tKirkersville village\tOH\tOhio\tLicking County\t569\t41.1\t18.8\t8.2\t24698\t121284\t0.4202\t43033\tObama\t43033\t0.001277523\t43033.0\n16772\t-82.41797199999999\t40.171203000000006\tSt. Louisville village\tOH\tOhio\tLicking County\t327\t40.6\t9.7\t19.6\t18027\t117917\t0.4202\t43071\tObama\t43071\t0.000734183\t43071.0\n16773\t-82.43440799999999\t39.936591\tHarbor Hills CDP\tOH\tOhio\tLicking County\t1517\t53.2\t16.7\t8.0\t30426\t160041\t0.4202\t43076\tObama\t43076\t0.00340598\t43076.0\n16774\t-82.647797\t40.025437\tBeechwood Trails CDP\tOH\tOhio\tLicking County\t2451\t40.6\t37.6\t6.9\t36783\t195234\t0.4202\t43062\tObama\t43062\t0.005503005\t43062.0\n16775\t-82.438722\t40.245658\tUtica village\tOH\tOhio\tLicking County\t2325\t39.7\t12.7\t9.5\t22703\t90750\t0.4202\t43080\tObama\t43080\t0.005220108\t43080.0\n16776\t-82.215597\t39.952523\tGratiot village\tOH\tOhio\tLicking County\t201\t42.5\t14.8\t9.8\t24462\t123864\t0.4202\t43740\tObama\t43740\t0.000451287\t43740.0\n16777\t-82.439747\t40.024840000000005\tHeath city\tOH\tOhio\tLicking County\t9870\t40.4\t16.1\t10.1\t22536\t114454\t0.4202\t43055\tObama\t43055\t0.022160202\t43055.0\n16778\t-82.689933\t40.150674\tJohnstown village\tOH\tOhio\tLicking County\t4374\t39.1\t20.5\t7.5\t25811\t123248\t0.4202\t43031\tObama\t43031\t0.009820539\t43031.0\n16779\t-82.54165400000001\t40.052002\tGranville South CDP\tOH\tOhio\tLicking County\t1428\t43.8\t50.9\t12.1\t33398\t198016\t0.4202\t43023\tObama\t43023\t0.0032061570000000003\t43023.0\n16780\t-82.48142299999999\t39.936277000000004\tBuckeye Lake village\tOH\tOhio\tLicking County\t3376\t36.7\t6.9\t15.3\t19957\t46337\t0.4202\t43008\tObama\t43008\t0.007579822\t43008.0\n16781\t-82.68791999999999\t40.240396999999994\tHartford village\tOH\tOhio\tLicking County\t450\t38.4\t20.3\t7.1\t24023\t167969\t0.4202\t43013\tObama\t43013\t0.001010344\t43013.0\n16782\t-82.423558\t40.069272\tNewark city\tOH\tOhio\tLicking County\t47144\t37.8\t18.5\t13.3\t23189\t103215\t0.4202\t43055\tObama\t43055\t0.105848081\t43055.0\n16783\t-82.272418\t40.081864\tHanover village\tOH\tOhio\tLicking County\t1079\t40.5\t6.3\t9.4\t23320\t119975\t0.4202\t43056\tObama\t43056\t0.002422579\t43056.0\n16784\t-82.503248\t40.069181\tGranville village\tOH\tOhio\tLicking County\t5399\t36.1\t53.8\t9.0\t35252\t240909\t0.4202\t43023\tObama\t43023\t0.012121877\t43023.0\n16785\t-83.745135\t40.508958\tBelle Center village\tOH\tOhio\tLogan County\t858\t36.8\t12.1\t9.6\t27688\t91892\t0.3341\t43310\tObama\t43310\t0.0019263879999999998\t43310.0\n16786\t-83.925791\t40.487619\tLakeview village\tOH\tOhio\tLogan County\t1014\t38.1\t5.9\t17.9\t17849\t60625\t0.3341\t43331\tObama\t43331\t0.0022766410000000003\t43331.0\n16787\t-83.67602600000001\t40.315540000000006\tValley Hi village\tOH\tOhio\tLogan County\t270\t38.5\t14.1\t14.4\t23278\t95000\t0.3341\t43360\tObama\t43360\t0.000606206\t43360.0\n16788\t-83.671153\t40.461220000000004\tRushsylvania village\tOH\tOhio\tLogan County\t591\t36.6\t9.8\t6.2\t20175\t85476\t0.3341\t43347\tObama\t43347\t0.0013269179999999998\t43347.0\n16789\t-83.763361\t40.362159999999996\tBellefontaine city\tOH\tOhio\tLogan County\t13069\t35.2\t17.2\t13.4\t23815\t99362\t0.3341\t43311\tObama\t43311\t0.029342622000000002\t43311.0\n16790\t-83.893726\t40.468024\tRussells Point village\tOH\tOhio\tLogan County\t1560\t37.1\t8.4\t21.3\t19875\t67397\t0.3341\t43348\tObama\t43348\t0.0035025240000000003\t43348.0\n16791\t-83.677913\t40.338531\tZanesfield village\tOH\tOhio\tLogan County\t244\t38.6\t13.9\t14.0\t23231\t95000\t0.3341\t43360\tObama\t43360\t0.000547831\t43360.0\n16792\t-83.80414\t40.442401000000004\tHuntsville village\tOH\tOhio\tLogan County\t530\t40.2\t11.0\t9.3\t24006\t110547\t0.3341\t43324\tObama\t43324\t0.00118996\t43324.0\n16793\t-83.75818100000001\t40.256001\tWest Liberty village\tOH\tOhio\tLogan County\t1911\t45.9\t22.4\t9.0\t21845\t109084\t0.3341\t43357\tObama\t43357\t0.004290592\t43357.0\n16794\t-83.968627\t40.295405\tQuincy village\tOH\tOhio\tLogan County\t779\t38.6\t11.2\t14.3\t20454\t95278\t0.3341\t43343\tObama\t43343\t0.001749017\t43343.0\n16795\t-83.544393\t40.400507\tWest Mansfield village\tOH\tOhio\tLogan County\t709\t38.1\t12.6\t6.5\t22369\t97917\t0.3341\t43358\tObama\t43358\t0.0015918520000000002\t43358.0\n16796\t-83.915064\t40.31106\tDe Graff village\tOH\tOhio\tLogan County\t1232\t35.7\t8.3\t13.5\t19964\t89872\t0.3341\t43318\tObama\t43318\t0.0027660959999999996\t43318.0\n16797\t-82.305761\t41.124642\tRochester village\tOH\tOhio\tLorain County\t202\t40.8\t15.6\t15.5\t24069\t154167\t0.5687\t44090\tObama\t44090\t0.000453532\t44090.0\n16798\t-82.097539\t41.488405\tSheffield Lake city\tOH\tOhio\tLorain County\t9404\t38.0\t15.7\t11.8\t25087\t111392\t0.5687\t44054\tObama\t44054\t0.021113935\t44054.0\n16799\t-82.011379\t41.306105\tEaton Estates CDP\tOH\tOhio\tLorain County\t1456\t35.5\t10.2\t7.3\t20525\t113110\t0.5687\t44044\tObama\t44044\t0.003269023\t44044.0\n16800\t-82.303927\t41.266805\tKipton village\tOH\tOhio\tLorain County\t268\t43.8\t18.8\t5.3\t24418\t142708\t0.5687\t44049\tObama\t44049\t0.000601716\t44049.0\n16801\t-82.015846\t41.494535\tAvon Lake city\tOH\tOhio\tLorain County\t22519\t40.8\t47.0\t7.3\t38110\t186823\t0.5687\t44012\tObama\t44012\t0.050559836\t44012.0\n16802\t-82.23039\t41.402245\tAmherst city\tOH\tOhio\tLorain County\t12241\t42.5\t24.5\t7.8\t29281\t138022\t0.5687\t44001\tObama\t44001\t0.02748359\t44001.0\n16803\t-82.239405\t41.351323\tSouth Amherst village\tOH\tOhio\tLorain County\t1831\t41.1\t13.2\t9.7\t22679\t125469\t0.5687\t44001\tObama\t44001\t0.004110976\t44001.0\n16804\t-82.019425\t41.385203000000004\tNorth Ridgeville city\tOH\tOhio\tLorain County\t28811\t41.5\t18.8\t7.6\t28313\t133827\t0.5687\t44039\tObama\t44039\t0.06468668400000001\t44039.0\n16805\t-82.222235\t41.165569\tWellington village\tOH\tOhio\tLorain County\t5091\t37.5\t13.9\t12.3\t23224\t119928\t0.5687\t44090\tObama\t44090\t0.011430353\t44090.0\n16806\t-82.106656\t41.377219000000004\tElyria city\tOH\tOhio\tLorain County\t55452\t37.3\t16.0\t13.3\t23804\t104640\t0.5687\t44035\tObama\t44035\t0.12450126800000001\t44035.0\n16807\t-82.312092\t41.415549\tVermilion city\tOH\tOhio\tLorain County\t11046\t42.0\t21.6\t12.1\t28344\t121447\t0.5687\t44089\tObama\t44089\t0.024800566\t44089.0\n16808\t-82.091176\t41.456043\tSheffield village\tOH\tOhio\tLorain County\t3748\t41.2\t26.3\t5.7\t29339\t166902\t0.5687\t44054\tObama\t44054\t0.008415039000000001\t44054.0\n16809\t-82.118051\t41.240096\tLagrange village\tOH\tOhio\tLorain County\t2034\t37.9\t14.6\t6.8\t24728\t157500\t0.5687\t44050\tObama\t44050\t0.004566753\t44050.0\n16810\t-82.03599399999999\t41.281011\tGrafton village\tOH\tOhio\tLorain County\t6653\t37.3\t14.1\t7.4\t21636\t137143\t0.5687\t44044\tObama\t44044\t0.014937368000000001\t44044.0\n16811\t-82.21981099999999\t41.287905\tOberlin city\tOH\tOhio\tLorain County\t8623\t27.3\t46.5\t10.9\t23281\t137330\t0.5687\t44074\tObama\t44074\t0.019360428\t44074.0\n16812\t-82.018817\t41.448617999999996\tAvon city\tOH\tOhio\tLorain County\t18218\t40.7\t37.1\t6.1\t34395\t189423\t0.5687\t44011\tObama\t44011\t0.040903197\t44011.0\n16813\t-82.18390500000001\t41.440914\tLorain city\tOH\tOhio\tLorain County\t70434\t35.4\t12.3\t16.0\t20412\t94872\t0.5687\t44052\tObama\t44052\t0.158138972\t44052.0\n16814\t-83.838539\t41.708304\tBerkey village\tOH\tOhio\tLucas County\t279\t43.4\t18.9\t9.7\t28195\t119196\t0.6499\t43504\tObama\t43504\t0.000626413\t43504.0\n16815\t-83.663387\t41.5696\tMaumee city\tOH\tOhio\tLucas County\t14248\t41.3\t30.5\t11.3\t28003\t113306\t0.6499\t43537\tObama\t43537\t0.031989722000000005\t43537.0\n16816\t-83.801002\t41.519673\tWhitehouse village\tOH\tOhio\tLucas County\t3306\t43.4\t28.5\t9.4\t30400\t130819\t0.6499\t43571\tObama\t43571\t0.007422656999999999\t43571.0\n16817\t-83.70681\t41.711606\tSylvania city\tOH\tOhio\tLucas County\t18210\t41.2\t44.5\t9.9\t34418\t157224\t0.6499\t43560\tObama\t43560\t0.040885236\t43560.0\n16818\t-83.44465\t41.69334\tHarbor View village\tOH\tOhio\tLucas County\t94\t38.3\t1.6\t12.5\t22843\t60000\t0.6499\t43611\tObama\t43611\t0.00021105\t43611.0\n16819\t-83.582139\t41.664034\tToledo city\tOH\tOhio\tLucas County\t297333\t35.2\t18.5\t16.9\t21925\t76898\t0.6499\t43607\tObama\t43607\t0.667574396\t43607.0\n16820\t-83.70853100000001\t41.61979\tHolland village\tOH\tOhio\tLucas County\t1774\t40.7\t18.1\t10.2\t24267\t99746\t0.6499\t43528\tObama\t43528\t0.003982999\t43528.0\n16821\t-83.73457900000001\t41.496685\tWaterville village\tOH\tOhio\tLucas County\t5050\t41.7\t38.1\t8.3\t30599\t147866\t0.6499\t43566\tObama\t43566\t0.011338299999999999\t43566.0\n16822\t-83.43214300000001\t41.653042\tOregon city\tOH\tOhio\tLucas County\t18731\t42.9\t17.4\t14.2\t25691\t115803\t0.6499\t43616\tObama\t43616\t0.042054989\t43616.0\n16823\t-83.643247\t41.668274\tOttawa Hills village\tOH\tOhio\tLucas County\t4353\t47.4\t71.0\t10.7\t57436\t233972\t0.6499\t43615\tObama\t43615\t0.00977339\t43615.0\n16824\t-83.436537\t39.894637\tLondon city\tOH\tOhio\tMadison County\t9406\t36.8\t17.3\t9.5\t22687\t115367\t0.3908\t43140\tObama\t43140\t0.021118425\t43140.0\n16825\t-83.487725\t39.960808\tChoctaw Lake CDP\tOH\tOhio\tMadison County\t1627\t43.5\t37.4\t7.6\t37934\t191518\t0.3908\t43140\tObama\t43140\t0.003652953\t43140.0\n16826\t-83.26925200000001\t40.114299\tPlain City village\tOH\tOhio\tMadison County\t3296\t36.3\t17.7\t7.1\t24960\t155674\t0.3908\t43064\tObama\t43064\t0.007400205\t43064.0\n16827\t-83.476375\t39.7333\tMidway village\tOH\tOhio\tMadison County\t289\t43.6\t11.0\t8.1\t24982\t119231\t0.3908\t43151\tObama\t43151\t0.000648865\t43151.0\n16828\t-83.267718\t39.719769\tMount Sterling village\tOH\tOhio\tMadison County\t1827\t34.8\t9.7\t11.8\t19948\t107212\t0.3908\t43143\tObama\t43143\t0.004101995\t43143.0\n16829\t-83.294333\t39.943244\tWest Jefferson village\tOH\tOhio\tMadison County\t4342\t38.7\t11.5\t11.2\t26655\t112643\t0.3908\t43162\tObama\t43162\t0.009748693000000001\t43162.0\n16830\t-83.612717\t39.737891\tSouth Solon village\tOH\tOhio\tMadison County\t441\t39.7\t11.7\t12.8\t21391\t102778\t0.3908\t43153\tObama\t43153\t0.0009901369999999999\t43153.0\n16831\t-80.6681\t41.032361\tBoardman CDP\tOH\tOhio\tMahoning County\t34391\t45.3\t28.5\t10.3\t26356\t104170\t0.6352\t44512\tObama\t44512\t0.07721494400000001\t44512.0\n16832\t-80.998723\t40.921063000000004\tBeloit village\tOH\tOhio\tMahoning County\t953\t45.5\t12.1\t13.7\t20605\t68400\t0.6352\t44609\tObama\t44609\t0.002139683\t44609.0\n16833\t-80.740488\t41.093173\tAustintown CDP\tOH\tOhio\tMahoning County\t29357\t42.3\t19.0\t12.6\t24562\t92380\t0.6352\t44515\tObama\t44515\t0.065912568\t44515.0\n16834\t-80.64579\t41.134688\tYoungstown city\tOH\tOhio\tMahoning County\t72153\t37.4\t12.3\t20.3\t16609\t46086\t0.6352\t44504\tObama\t44504\t0.161998484\t44504.0\n16835\t-81.022669\t40.92386\tSebring village\tOH\tOhio\tMahoning County\t4392\t46.3\t16.2\t11.4\t21460\t75791\t0.6352\t44672\tObama\t44672\t0.009860953\t44672.0\n16836\t-80.591951\t41.050971999999994\tStruthers city\tOH\tOhio\tMahoning County\t10853\t41.2\t12.6\t16.2\t19843\t66270\t0.6352\t44471\tObama\t44471\t0.024367241\t44471.0\n16837\t-80.613283\t41.02465\tPoland village\tOH\tOhio\tMahoning County\t2665\t46.2\t37.6\t13.1\t25289\t119120\t0.6352\t44514\tObama\t44514\t0.005983479\t44514.0\n16838\t-80.590334\t41.077718\tCampbell city\tOH\tOhio\tMahoning County\t8514\t41.3\t12.4\t18.0\t17921\t64281\t0.6352\t44405\tObama\t44405\t0.0191157\t44405.0\n16839\t-80.766666\t41.031132\tCanfield city\tOH\tOhio\tMahoning County\t7239\t46.9\t44.8\t9.7\t35236\t141473\t0.6352\t44406\tObama\t44406\t0.01625306\t44406.0\n16840\t-81.047586\t40.914291\tMaple Ridge CDP\tOH\tOhio\tMahoning County\t783\t44.7\t1.8\t19.9\t21161\t56512\t0.6352\t44672\tObama\t44672\t0.001757998\t44672.0\n16841\t-80.56064\t40.964903\tNew Middletown village\tOH\tOhio\tMahoning County\t1661\t45.7\t15.2\t12.2\t23400\t99653\t0.6352\t44442\tObama\t44442\t0.00372929\t44442.0\n16842\t-80.982745\t41.11629\tCraig Beach village\tOH\tOhio\tMahoning County\t1272\t39.7\t10.8\t17.8\t24691\t84375\t0.6352\t44429\tObama\t44429\t0.0028559040000000003\t44429.0\n16843\t-80.546141\t41.038996000000004\tLowellville village\tOH\tOhio\tMahoning County\t1166\t41.4\t10.4\t12.9\t15954\t63750\t0.6352\t44436\tObama\t44436\t0.002617912\t44436.0\n16844\t-83.38216800000001\t40.578011\tLa Rue village\tOH\tOhio\tMarion County\t767\t41.1\t4.6\t19.5\t19728\t70556\t0.4572\t43332\tObama\t43332\t0.0017220739999999999\t43332.0\n16845\t-83.12423100000001\t40.593238\tMarion city\tOH\tOhio\tMarion County\t36503\t36.2\t11.0\t14.0\t20103\t83486\t0.4572\t43302\tObama\t43302\t0.081956823\t43302.0\n16846\t-83.207643\t40.531983000000004\tGreen Camp village\tOH\tOhio\tMarion County\t360\t42.4\t9.4\t8.0\t22348\t103226\t0.4572\t43322\tObama\t43322\t0.000808275\t43322.0\n16847\t-83.084638\t40.459798\tWaldo village\tOH\tOhio\tMarion County\t343\t46.1\t25.5\t6.5\t28460\t125000\t0.4572\t43356\tObama\t43356\t0.0007701060000000001\t43356.0\n16848\t-83.312589\t40.583673\tNew Bloomington village\tOH\tOhio\tMarion County\t555\t37.8\t8.1\t15.0\t19361\t79000\t0.4572\t43341\tObama\t43341\t0.00124609\t43341.0\n16849\t-82.969264\t40.63622\tCaledonia village\tOH\tOhio\tMarion County\t536\t39.2\t8.5\t12.0\t23908\t84167\t0.4572\t43314\tObama\t43314\t0.001203431\t43314.0\n16850\t-83.185512\t40.45302\tProspect village\tOH\tOhio\tMarion County\t1187\t40.2\t17.2\t11.4\t22339\t104688\t0.4572\t43342\tObama\t43342\t0.002665062\t43342.0\n16851\t-83.209823\t40.691421000000005\tMorral village\tOH\tOhio\tMarion County\t379\t45.0\t16.5\t10.9\t22466\t101042\t0.4572\t43337\tObama\t43337\t0.0008509339999999999\t43337.0\n16852\t-81.900765\t41.057815000000005\tGloria Glens Park village\tOH\tOhio\tMedina County\t538\t37.6\t16.8\t6.2\t26380\t104545\t0.4272\t44215\tObama\t44215\t0.001207922\t44215.0\n16853\t-82.12220400000001\t41.097916\tSpencer village\tOH\tOhio\tMedina County\t791\t37.1\t14.0\t8.4\t21438\t147973\t0.4272\t44275\tObama\t44275\t0.001775959\t44275.0\n16854\t-81.904294\t41.073406\tChippewa Lake village\tOH\tOhio\tMedina County\t797\t40.0\t15.4\t10.1\t24844\t110261\t0.4272\t44215\tObama\t44215\t0.001789431\t44215.0\n16855\t-81.734459\t41.026334999999996\tWadsworth city\tOH\tOhio\tMedina County\t21151\t39.8\t30.4\t10.8\t28401\t151599\t0.4272\t44281\tObama\t44281\t0.047488392000000004\t44281.0\n16856\t-81.867336\t41.135209\tMedina city\tOH\tOhio\tMedina County\t27464\t34.4\t38.3\t7.8\t29140\t169658\t0.4272\t44256\tObama\t44256\t0.061662389000000005\t44256.0\n16857\t-82.013064\t41.034485\tLodi village\tOH\tOhio\tMedina County\t3115\t38.1\t8.2\t14.3\t23174\t101646\t0.4272\t44254\tObama\t44254\t0.006993823000000001\t44254.0\n16858\t-81.819775\t41.245826\tBrunswick city\tOH\tOhio\tMedina County\t36125\t37.0\t22.4\t8.9\t28707\t160948\t0.4272\t44212\tObama\t44212\t0.081108135\t44212.0\n16859\t-81.930643\t41.02859\tWestfield Center village\tOH\tOhio\tMedina County\t1204\t46.1\t48.8\t13.4\t38903\t210476\t0.4272\t44251\tObama\t44251\t0.00270323\t44251.0\n16860\t-81.867448\t41.019523\tSeville village\tOH\tOhio\tMedina County\t2376\t39.9\t18.1\t6.9\t23476\t132841\t0.4272\t44273\tObama\t44273\t0.0053346140000000005\t44273.0\n16861\t-81.912127\t38.968907\tRacine village\tOH\tOhio\tMeigs County\t725\t44.2\t9.6\t21.2\t16115\t78158\t0.3941\t45771\tObama\t45771\t0.001627776\t45771.0\n16862\t-82.03394899999999\t39.029137\tPomeroy village\tOH\tOhio\tMeigs County\t1817\t39.9\t13.1\t27.5\t16320\t56066\t0.3941\t45760\tObama\t45760\t0.004079543\t45760.0\n16863\t-82.127933\t39.04107\tRutland village\tOH\tOhio\tMeigs County\t402\t39.0\t7.7\t20.0\t13969\t57333\t0.3941\t45760\tObama\t45760\t0.000902574\t45760.0\n16864\t-81.968915\t38.998823\tSyracuse village\tOH\tOhio\tMeigs County\t859\t43.7\t14.6\t14.2\t20334\t84028\t0.3941\t45779\tObama\t45779\t0.001928634\t45779.0\n16865\t-82.06425\t38.994852\tMiddleport village\tOH\tOhio\tMeigs County\t2277\t42.8\t8.5\t19.7\t16969\t56429\t0.3941\t45760\tObama\t45760\t0.005112338\t45760.0\n16866\t-84.648724\t40.691502\tRockford village\tOH\tOhio\tMercer County\t1135\t42.5\t13.4\t6.8\t20667\t95588\t0.2191\t45882\tObama\t45882\t0.002548311\t45882.0\n16867\t-84.632911\t40.421132\tSt. Henry village\tOH\tOhio\tMercer County\t2522\t31.2\t15.9\t6.5\t21342\t123185\t0.2191\t45883\tObama\t45883\t0.005662414\t45883.0\n16868\t-84.549384\t40.489036\tMontezuma village\tOH\tOhio\tMercer County\t192\t41.7\t11.1\t9.8\t21407\t107955\t0.2191\t45866\tObama\t45866\t0.00043108\t45866.0\n16869\t-84.775281\t40.41127\tFort Recovery village\tOH\tOhio\tMercer County\t1231\t35.8\t14.3\t7.4\t20060\t112636\t0.2191\t45846\tObama\t45846\t0.002763851\t45846.0\n16870\t-84.518051\t40.671206\tMendon village\tOH\tOhio\tMercer County\t770\t36.7\t5.9\t7.6\t21972\t59167\t0.2191\t45862\tObama\t45862\t0.00172881\t45862.0\n16871\t-84.642239\t40.353865\tBurkettsville village\tOH\tOhio\tMercer County\t250\t35.4\t9.2\t8.0\t19579\t112500\t0.2191\t45310\tObama\t45310\t0.000561302\t45310.0\n16872\t-84.56431500000001\t40.555938\tCelina city\tOH\tOhio\tMercer County\t10299\t37.8\t19.5\t11.6\t23022\t105607\t0.2191\t45822\tObama\t45822\t0.023123396\t45822.0\n16873\t-84.493337\t40.437044\tChickasaw village\tOH\tOhio\tMercer County\t360\t33.9\t18.5\t5.9\t20057\t146154\t0.2191\t45860\tObama\t45860\t0.000808275\t45860.0\n16874\t-84.632171\t40.482965\tColdwater village\tOH\tOhio\tMercer County\t4501\t37.2\t14.5\t6.3\t24278\t115948\t0.2191\t45828\tObama\t45828\t0.010105681\t45828.0\n16875\t-84.242183\t40.1496\tPiqua city\tOH\tOhio\tMiami County\t20234\t37.4\t12.7\t14.6\t22943\t98495\t0.3154\t45356\tObama\t45356\t0.045429536\t45356.0\n16876\t-84.324494\t39.951793\tWest Milton village\tOH\tOhio\tMiami County\t4520\t38.4\t17.9\t11.5\t25073\t112796\t0.3154\t45383\tObama\t45383\t0.01014834\t45383.0\n16877\t-84.112443\t40.14258\tFletcher village\tOH\tOhio\tMiami County\t540\t39.8\t19.2\t11.1\t25070\t115530\t0.3154\t45326\tObama\t45326\t0.001212412\t45326.0\n16878\t-84.220762\t40.043968\tTroy city\tOH\tOhio\tMiami County\t23740\t37.8\t21.7\t11.8\t25867\t116628\t0.3154\t45373\tObama\t45373\t0.053301235\t45373.0\n16879\t-84.128349\t40.052826\tCasstown village\tOH\tOhio\tMiami County\t333\t45.1\t18.4\t9.1\t27137\t155769\t0.3154\t45312\tObama\t45312\t0.0007476539999999999\t45312.0\n16880\t-84.41448299999999\t39.963659\tPotsdam village\tOH\tOhio\tMiami County\t241\t41.3\t6.7\t11.3\t22288\t114286\t0.3154\t45337\tObama\t45337\t0.000541095\t45337.0\n16881\t-84.351671\t40.118801\tCovington village\tOH\tOhio\tMiami County\t2467\t39.4\t11.3\t15.0\t21286\t106005\t0.3154\t45318\tObama\t45318\t0.005538928\t45318.0\n16882\t-84.339189\t39.99839\tLudlow Falls village\tOH\tOhio\tMiami County\t210\t46.8\t14.6\t8.0\t24884\t134722\t0.3154\t45339\tObama\t45339\t0.00047149400000000004\t45339.0\n16883\t-84.187034\t39.96518\tTipp City\tOH\tOhio\tMiami County\t9003\t36.8\t25.5\t10.1\t29643\t141038\t0.3154\t45371\tObama\t45371\t0.020213606999999998\t45371.0\n16884\t-84.345562\t40.051866\tPleasant Hill village\tOH\tOhio\tMiami County\t1214\t40.9\t12.1\t10.3\t23334\t134879\t0.3154\t45359\tObama\t45359\t0.002725682\t45359.0\n16885\t-84.426243\t40.130644000000004\tBradford village\tOH\tOhio\tMiami County\t1808\t35.0\t6.4\t15.3\t20088\t88721\t0.3154\t45308\tObama\t45308\t0.004059336\t45308.0\n16886\t-84.40821700000001\t39.994921000000005\tLaura village\tOH\tOhio\tMiami County\t579\t41.4\t6.8\t11.6\t22252\t112838\t0.3154\t45337\tObama\t45337\t0.001299975\t45337.0\n16887\t-81.218342\t39.766994\tLewisville village\tOH\tOhio\tMonroe County\t219\t46.4\t5.7\t10.5\t15256\t78333\t0.4475\t43754\tObama\t43754\t0.000491701\t43754.0\n16888\t-81.09600400000001\t39.851958\tJerusalem village\tOH\tOhio\tMonroe County\t160\t47.0\t12.5\t16.2\t18372\t80625\t0.4475\t43747\tObama\t43747\t0.00035923300000000003\t43747.0\n16889\t-81.035446\t39.848808\tBeallsville village\tOH\tOhio\tMonroe County\t407\t41.5\t8.5\t15.5\t17277\t72333\t0.4475\t43716\tObama\t43716\t0.0009138\t43716.0\n16890\t-81.276622\t39.71253\tStafford village\tOH\tOhio\tMonroe County\t66\t44.4\t8.3\t18.2\t17037\t80000\t0.4475\t43754\tObama\t43754\t0.000148184\t43754.0\n16891\t-81.174678\t39.663346999999995\tGraysville village\tOH\tOhio\tMonroe County\t106\t44.3\t5.2\t6.8\t20011\t60000\t0.4475\t45734\tObama\t45734\t0.000237992\t45734.0\n16892\t-81.16456099999999\t39.831269\tMiltonsburg village\tOH\tOhio\tMonroe County\t31\t37.5\t13.0\t15.4\t18095\t90000\t0.4475\t43747\tObama\t43747\t6.96e-05\t43747.0\n16893\t-81.11694399999999\t39.762890999999996\tWoodsfield village\tOH\tOhio\tMonroe County\t2382\t44.6\t15.1\t9.5\t18766\t71800\t0.4475\t43793\tObama\t43793\t0.005348085\t43793.0\n16894\t-80.86499\t39.775864\tClarington village\tOH\tOhio\tMonroe County\t447\t45.2\t8.1\t9.0\t21297\t68250\t0.4475\t43915\tObama\t43915\t0.001003608\t43915.0\n16895\t-81.06669699999999\t39.660866999999996\tAntioch village\tOH\tOhio\tMonroe County\t82\t47.1\t13.1\t10.0\t19430\t60000\t0.4475\t43793\tObama\t43793\t0.000184107\t43793.0\n16896\t-84.30715500000001\t39.864596999999996\tEnglewood city\tOH\tOhio\tMontgomery County\t12151\t42.3\t25.4\t11.2\t28246\t122753\t0.515\t45322\tObama\t45322\t0.027281521\t45322.0\n16897\t-84.401737\t39.904708\tPhillipsburg village\tOH\tOhio\tMontgomery County\t608\t40.2\t10.8\t12.3\t22508\t122826\t0.515\t45354\tObama\t45354\t0.0013650860000000002\t45354.0\n16898\t-84.112515\t39.885798\tHuber Heights city\tOH\tOhio\tMontgomery County\t37099\t36.8\t20.8\t13.0\t26212\t104966\t0.515\t45424\tObama\t45424\t0.083294967\t45424.0\n16899\t-84.268354\t39.633184\tMiamisburg city\tOH\tOhio\tMontgomery County\t19123\t39.4\t18.9\t12.3\t26792\t116707\t0.515\t45342\tObama\t45342\t0.04293511\t45342.0\n16900\t-84.346544\t39.878207\tClayton city\tOH\tOhio\tMontgomery County\t12908\t42.1\t34.3\t10.5\t30651\t135621\t0.515\t45315\tObama\t45315\t0.028981142999999997\t45315.0\n16901\t-84.317836\t39.793285\tTrotwood city\tOH\tOhio\tMontgomery County\t26547\t40.2\t16.6\t16.2\t23318\t89662\t0.515\t45426\tObama\t45426\t0.05960353400000001\t45426.0\n16902\t-84.173385\t39.720252\tOakwood city\tOH\tOhio\tMontgomery County\t9307\t42.4\t65.6\t5.9\t44483\t197508\t0.515\t45419\tObama\t45419\t0.02089615\t45419.0\n16903\t-84.253663\t39.670106\tWest Carrollton City\tOH\tOhio\tMontgomery County\t12893\t37.9\t19.3\t11.5\t26396\t104316\t0.515\t45449\tObama\t45449\t0.028947465\t45449.0\n16904\t-84.245337\t39.698275\tMoraine city\tOH\tOhio\tMontgomery County\t6416\t36.2\t9.4\t14.2\t20368\t85251\t0.515\t45439\tObama\t45439\t0.014405254\t45439.0\n16905\t-84.39556999999999\t39.744064\tNew Lebanon village\tOH\tOhio\tMontgomery County\t3985\t39.5\t6.5\t15.2\t21236\t97481\t0.515\t45345\tObama\t45345\t0.008947153000000001\t45345.0\n16906\t-84.417309\t39.839551\tBrookville village\tOH\tOhio\tMontgomery County\t5272\t42.4\t20.0\t11.3\t26146\t112203\t0.515\t45309\tObama\t45309\t0.011836736\t45309.0\n16907\t-84.231787\t39.815811\tShiloh CDP\tOH\tOhio\tMontgomery County\t10570\t45.9\t28.9\t11.8\t27462\t99517\t0.515\t45416\tObama\t45416\t0.023731847\t45416.0\n16908\t-84.293161\t39.738163\tDrexel CDP\tOH\tOhio\tMontgomery County\t2184\t34.8\t5.6\t32.0\t13965\t62679\t0.515\t45427\tObama\t45427\t0.004903534\t45427.0\n16909\t-84.363182\t39.632251000000004\tGermantown village\tOH\tOhio\tMontgomery County\t4968\t41.4\t20.5\t9.7\t26361\t116089\t0.515\t45327\tObama\t45327\t0.011154193\t45327.0\n16910\t-84.116702\t39.758842\tRiverside city\tOH\tOhio\tMontgomery County\t22325\t38.6\t16.2\t13.8\t23198\t93726\t0.515\t45431\tObama\t45431\t0.050124265999999994\t45431.0\n16911\t-84.191597\t39.812025\tNorthridge CDP\tOH\tOhio\tMontgomery County\t7769\t37.2\t5.6\t18.5\t19268\t75739\t0.515\t45414\tObama\t45414\t0.01744302\t45414.0\n16912\t-84.197783\t39.768561\tDayton city\tOH\tOhio\tMontgomery County\t152007\t34.1\t16.3\t19.1\t19668\t74038\t0.515\t454HH\tObama\t454HH\t0.341287315\t0.0\n16913\t-84.175145\t39.661716999999996\tWoodbourne-Hyde Park CDP\tOH\tOhio\tMontgomery County\t7694\t52.5\t54.5\t9.9\t41999\t180701\t0.515\t45459\tObama\t45459\t0.017274629\t45459.0\n16914\t-84.428372\t39.678484999999995\tFarmersville village\tOH\tOhio\tMontgomery County\t956\t41.7\t11.9\t11.2\t25404\t129911\t0.515\t45325\tObama\t45325\t0.002146419\t45325.0\n16915\t-84.246032\t39.802564000000004\tFort McKinley CDP\tOH\tOhio\tMontgomery County\t3792\t41.2\t13.5\t14.2\t20846\t67356\t0.515\t45416\tObama\t45416\t0.008513828000000001\t45416.0\n16916\t-84.108466\t39.695871999999994\tKettering city\tOH\tOhio\tMontgomery County\t54994\t41.4\t32.0\t10.5\t30826\t118237\t0.515\t45440\tObama\t45440\t0.12347296199999999\t45440.0\n16917\t-84.191897\t39.879969\tVandalia city\tOH\tOhio\tMontgomery County\t14548\t41.1\t23.8\t10.2\t29898\t122892\t0.515\t45377\tObama\t45377\t0.032663284\t45377.0\n16918\t-84.146274\t39.633635999999996\tCenterville city\tOH\tOhio\tMontgomery County\t22788\t45.3\t49.0\t9.4\t35669\t158735\t0.515\t45459\tObama\t45459\t0.051163797000000004\t45459.0\n16919\t-84.27665400000001\t39.922993\tUnion city\tOH\tOhio\tMontgomery County\t5622\t36.1\t15.3\t11.3\t26797\t103307\t0.515\t45322\tObama\t45322\t0.012622558999999998\t45322.0\n16920\t-81.847094\t39.656408\tMcConnelsville village\tOH\tOhio\tMorgan County\t1579\t44.3\t16.8\t9.1\t18798\t85660\t0.4591\t43756\tObama\t43756\t0.003545183\t43756.0\n16921\t-81.866732\t39.49073\tChesterhill village\tOH\tOhio\tMorgan County\t313\t38.2\t5.9\t17.4\t18607\t59286\t0.4591\t43728\tObama\t43728\t0.00070275\t43728.0\n16922\t-81.86385\t39.650763\tMalta village\tOH\tOhio\tMorgan County\t678\t42.7\t8.7\t12.7\t15195\t67105\t0.4591\t43758\tObama\t43758\t0.001522251\t43758.0\n16923\t-81.79445\t39.548573\tStockport village\tOH\tOhio\tMorgan County\t561\t40.4\t10.4\t17.5\t16120\t57500\t0.4591\t43787\tObama\t43787\t0.0012595619999999999\t43787.0\n16924\t-82.893069\t40.497463\tCardington village\tOH\tOhio\tMorrow County\t2054\t36.5\t15.0\t11.6\t19598\t106149\t0.3666\t43315\tObama\t43315\t0.004611657\t43315.0\n16925\t-82.69957600000001\t40.394412\tSparta village\tOH\tOhio\tMorrow County\t222\t41.4\t9.3\t20.4\t21086\t145455\t0.3666\t43350\tObama\t43350\t0.000498436\t43350.0\n16926\t-82.682878\t40.47998\tChesterville village\tOH\tOhio\tMorrow County\t203\t41.7\t13.4\t9.6\t19816\t98750\t0.3666\t43317\tObama\t43317\t0.000455777\t43317.0\n16927\t-82.827539\t40.553675\tMount Gilead village\tOH\tOhio\tMorrow County\t3383\t39.8\t16.8\t13.7\t21799\t112628\t0.3666\t43338\tObama\t43338\t0.007595538000000001\t43338.0\n16928\t-82.828858\t40.463213\tFulton village\tOH\tOhio\tMorrow County\t305\t37.0\t12.2\t13.8\t19248\t95833\t0.3666\t43321\tObama\t43321\t0.000684788\t43321.0\n16929\t-82.810424\t40.400646\tMarengo village\tOH\tOhio\tMorrow County\t330\t38.6\t11.4\t12.2\t23464\t114286\t0.3666\t43334\tObama\t43334\t0.0007409189999999999\t43334.0\n16930\t-82.863478\t40.558116\tEdison village\tOH\tOhio\tMorrow County\t497\t39.8\t13.7\t21.7\t20752\t110870\t0.3666\t43320\tObama\t43320\t0.0011158680000000001\t43320.0\n16931\t-82.012535\t39.953762\tZanesville city\tOH\tOhio\tMuskingum County\t24799\t37.0\t15.0\t15.4\t18935\t73462\t0.4584\t43701\tObama\t43701\t0.05567891\t43701.0\n16932\t-81.909943\t39.861069\tPhilo village\tOH\tOhio\tMuskingum County\t814\t38.8\t7.6\t13.9\t17643\t77500\t0.4584\t437HH\tObama\t437HH\t0.0018275989999999998\t0.0\n16933\t-81.95899200000001\t39.951373\tPleasant Grove CDP\tOH\tOhio\tMuskingum County\t2067\t40.9\t15.7\t11.2\t21383\t103700\t0.4584\t43701\tObama\t43701\t0.004640845\t43701.0\n16934\t-82.019136\t39.903188\tSouth Zanesville village\tOH\tOhio\tMuskingum County\t1882\t42.8\t8.6\t10.9\t18588\t77234\t0.4584\t43701\tObama\t43701\t0.004225481\t43701.0\n16935\t-81.998347\t39.990594\tNorth Zanesville CDP\tOH\tOhio\tMuskingum County\t3029\t47.6\t29.3\t13.4\t28962\t138574\t0.4584\t43701\tObama\t43701\t0.006800735\t43701.0\n16936\t-81.882203\t40.068868\tAdamsville village\tOH\tOhio\tMuskingum County\t131\t39.1\t9.2\t12.5\t17807\t98333\t0.4584\t43802\tObama\t43802\t0.000294122\t43802.0\n16937\t-81.73808100000001\t39.994059\tNew Concord village\tOH\tOhio\tMuskingum County\t2561\t24.7\t35.6\t8.4\t17354\t107589\t0.4584\t43762\tObama\t43762\t0.005749977\t43762.0\n16938\t-82.11894000000001\t40.116879\tFrazeysburg village\tOH\tOhio\tMuskingum County\t1323\t37.4\t11.5\t9.2\t22136\t103220\t0.4584\t43822\tObama\t43822\t0.00297041\t43822.0\n16939\t-81.792379\t39.984217\tNorwich village\tOH\tOhio\tMuskingum County\t122\t39.2\t18.3\t17.9\t21094\t122500\t0.4584\t43767\tObama\t43767\t0.000273915\t43767.0\n16940\t-82.142589\t39.855798\tFultonham village\tOH\tOhio\tMuskingum County\t160\t40.9\t7.3\t15.9\t16267\t102273\t0.4584\t43738\tObama\t43738\t0.00035923300000000003\t43738.0\n16941\t-82.011436\t40.12128\tDresden village\tOH\tOhio\tMuskingum County\t1386\t38.2\t12.1\t13.0\t20961\t92917\t0.4584\t43821\tObama\t43821\t0.003111858\t43821.0\n16942\t-81.469349\t39.807499\tSarahsville village\tOH\tOhio\tNoble County\t195\t40.7\t10.4\t16.7\t19679\t80000\t0.3629\t43779\tObama\t43779\t0.000437816\t43779.0\n16943\t-81.33546899999999\t39.796907\tSummerfield village\tOH\tOhio\tNoble County\t313\t32.8\t5.9\t19.9\t12735\t48000\t0.3629\t43788\tObama\t43788\t0.00070275\t43788.0\n16944\t-81.511699\t39.746706\tCaldwell village\tOH\tOhio\tNoble County\t1938\t40.6\t12.0\t17.6\t19772\t76953\t0.3629\t43724\tObama\t43724\t0.004351213\t43724.0\n16945\t-81.473917\t39.659357\tDexter City village\tOH\tOhio\tNoble County\t160\t39.1\t5.6\t12.2\t16316\t67000\t0.3629\t45727\tObama\t45727\t0.00035923300000000003\t45727.0\n16946\t-81.556349\t39.789059\tBelle Valley village\tOH\tOhio\tNoble County\t272\t42.1\t15.3\t13.4\t17199\t68000\t0.3629\t43717\tObama\t43717\t0.000610697\t43717.0\n16947\t-81.281906\t39.915793\tBatesville village\tOH\tOhio\tNoble County\t115\t33.4\t15.3\t16.7\t14436\t88750\t0.3629\t43773\tObama\t43773\t0.000258199\t43773.0\n16948\t-83.36440400000001\t41.571521000000004\tClay Center village\tOH\tOhio\tOttawa County\t301\t42.2\t20.7\t12.0\t30072\t123333\t0.5122\t43408\tObama\t43408\t0.0006758080000000001\t43408.0\n16949\t-83.212588\t41.530926\tRocky Ridge village\tOH\tOhio\tOttawa County\t390\t40.2\t9.3\t11.8\t21810\t116429\t0.5122\t43458\tObama\t43458\t0.0008756310000000001\t43458.0\n16950\t-82.727319\t41.527084\tMarblehead village\tOH\tOhio\tOttawa County\t736\t52.4\t30.1\t16.5\t27506\t140625\t0.5122\t43440\tObama\t43440\t0.0016524729999999998\t43440.0\n16951\t-83.143776\t41.511044\tOak Harbor village\tOH\tOhio\tOttawa County\t2790\t39.6\t22.0\t11.0\t25112\t106875\t0.5122\t43449\tObama\t43449\t0.00626413\t43449.0\n16952\t-83.362193\t41.519791999999995\tGenoa village\tOH\tOhio\tOttawa County\t2099\t42.3\t14.4\t13.1\t23667\t97756\t0.5122\t43430\tObama\t43430\t0.004712691\t43430.0\n16953\t-83.291166\t41.471127\tElmore village\tOH\tOhio\tOttawa County\t1509\t41.2\t23.7\t13.1\t23148\t124227\t0.5122\t43416\tObama\t43416\t0.0033880190000000004\t43416.0\n16954\t-82.818127\t41.651483\tPut-in-Bay village\tOH\tOhio\tOttawa County\t135\t49.5\t33.0\t34.1\t31008\t245833\t0.5122\t43456\tObama\t43456\t0.000303103\t43456.0\n16955\t-82.937714\t41.509359\tPort Clinton city\tOH\tOhio\tOttawa County\t6042\t41.8\t15.2\t16.1\t24990\t98733\t0.5122\t43452\tObama\t43452\t0.013565546000000001\t43452.0\n16956\t-84.583174\t41.087723\tLatty village\tOH\tOhio\tPaulding County\t189\t38.9\t7.4\t13.2\t22469\t89286\t0.3876\t45855\tObama\t45855\t0.000424344\t45855.0\n16957\t-84.738087\t41.180087\tAntwerp village\tOH\tOhio\tPaulding County\t1648\t40.2\t10.9\t11.4\t22456\t92449\t0.3876\t45813\tObama\t45813\t0.0037001029999999997\t45813.0\n16958\t-84.420048\t41.088681\tMelrose village\tOH\tOhio\tPaulding County\t303\t37.1\t5.9\t12.5\t20252\t80625\t0.3876\t45861\tObama\t45861\t0.0006802980000000001\t45861.0\n16959\t-84.535117\t41.087993\tBroughton village\tOH\tOhio\tPaulding County\t155\t38.4\t3.8\t12.6\t20497\t85000\t0.3876\t45855\tObama\t45855\t0.00034800699999999995\t45855.0\n16960\t-84.601771\t41.219072\tCecil village\tOH\tOhio\tPaulding County\t212\t37.9\t8.8\t10.1\t22582\t85000\t0.3876\t45821\tObama\t45821\t0.000475984\t45821.0\n16961\t-84.477724\t41.018739000000004\tGrover Hill village\tOH\tOhio\tPaulding County\t391\t37.0\t7.1\t18.2\t22363\t65714\t0.3876\t45849\tObama\t45849\t0.0008778760000000001\t45849.0\n16962\t-84.72680799999999\t41.079413\tPayne village\tOH\tOhio\tPaulding County\t1197\t41.4\t12.9\t14.9\t25144\t76571\t0.3876\t45880\tObama\t45880\t0.0026875140000000002\t45880.0\n16963\t-84.376529\t41.093065\tOakwood village\tOH\tOhio\tPaulding County\t569\t39.9\t4.9\t12.7\t23923\t72308\t0.3876\t45873\tObama\t45873\t0.001277523\t45873.0\n16964\t-84.582661\t41.018921999999996\tHaviland village\tOH\tOhio\tPaulding County\t177\t36.3\t10.9\t9.2\t21481\t90000\t0.3876\t45851\tObama\t45851\t0.000397402\t45851.0\n16965\t-84.58189499999999\t41.142061\tPaulding village\tOH\tOhio\tPaulding County\t3420\t37.4\t12.4\t11.8\t20248\t83633\t0.3876\t45879\tObama\t45879\t0.007678611\t45879.0\n16966\t-82.087564\t39.601737\tCorning village\tOH\tOhio\tPerry County\t622\t39.0\t7.3\t17.4\t19993\t56667\t0.4694\t43730\tObama\t43730\t0.001396519\t43730.0\n16967\t-82.209514\t39.717881\tNew Lexington city\tOH\tOhio\tPerry County\t4618\t35.7\t9.3\t18.7\t17625\t77583\t0.4694\t43764\tObama\t43764\t0.01036837\t43764.0\n16968\t-82.09493499999999\t39.768584999999995\tCrooksville village\tOH\tOhio\tPerry County\t2449\t35.8\t5.8\t17.1\t17202\t66574\t0.4694\t43731\tObama\t43731\t0.005498514\t43731.0\n16969\t-82.207738\t39.609708000000005\tShawnee village\tOH\tOhio\tPerry County\t610\t32.6\t2.9\t25.6\t17104\t48382\t0.4694\t43782\tObama\t43782\t0.001369577\t43782.0\n16970\t-82.154484\t39.590502\tHemlock village\tOH\tOhio\tPerry County\t143\t40.2\t3.0\t17.6\t15353\t68750\t0.4694\t43730\tObama\t43730\t0.000321065\t43730.0\n16971\t-82.23441\t39.579307\tNew Straitsville village\tOH\tOhio\tPerry County\t778\t38.3\t4.3\t20.5\t14870\t43421\t0.4694\t43766\tObama\t43766\t0.0017467720000000002\t43766.0\n16972\t-82.089945\t39.619858\tRendville village\tOH\tOhio\tPerry County\t48\t37.5\t6.1\t22.7\t18248\t62500\t0.4694\t43730\tObama\t43730\t0.00010777\t43730.0\n16973\t-82.319037\t39.886611\tGlenford village\tOH\tOhio\tPerry County\t214\t35.2\t5.2\t8.9\t19497\t84000\t0.4694\t43739\tObama\t43739\t0.000480474\t43739.0\n16974\t-82.29949\t39.806133\tSomerset village\tOH\tOhio\tPerry County\t1686\t42.2\t12.2\t11.5\t19856\t109470\t0.4694\t43783\tObama\t43783\t0.00378542\t43783.0\n16975\t-82.29962900000001\t39.72167\tJunction City village\tOH\tOhio\tPerry County\t851\t36.1\t4.8\t17.4\t16773\t81034\t0.4694\t43748\tObama\t43748\t0.0019106720000000002\t43748.0\n16976\t-82.071058\t39.806884000000004\tRoseville village\tOH\tOhio\tPerry County\t1894\t31.9\t4.0\t23.1\t15572\t64400\t0.4694\t43777\tObama\t43777\t0.004252424\t43777.0\n16977\t-82.419896\t39.896882\tThornville village\tOH\tOhio\tPerry County\t749\t43.6\t16.1\t12.0\t25135\t112264\t0.4694\t43076\tObama\t43076\t0.001681661\t43076.0\n16978\t-82.98912299999999\t39.716295\tSouth Bloomfield village\tOH\tOhio\tPickaway County\t1394\t33.1\t10.6\t13.3\t21359\t96000\t0.4014\t431HH\tObama\t431HH\t0.00312982\t0.0\n16979\t-82.95611600000001\t39.720411999999996\tAshville village\tOH\tOhio\tPickaway County\t3526\t34.8\t10.9\t13.1\t22841\t94815\t0.4014\t43103\tObama\t43103\t0.007916603000000001\t43103.0\n16980\t-83.255685\t39.559197999999995\tNew Holland village\tOH\tOhio\tPickaway County\t837\t41.3\t13.8\t16.6\t22223\t83158\t0.4014\t43145\tObama\t43145\t0.001879239\t43145.0\n16981\t-83.116478\t39.582531\tWilliamsport village\tOH\tOhio\tPickaway County\t1028\t40.1\t14.9\t11.9\t20044\t113514\t0.4014\t43164\tObama\t43164\t0.002308074\t43164.0\n16982\t-83.11392\t39.695482\tDarbyville village\tOH\tOhio\tPickaway County\t308\t41.7\t12.5\t11.7\t22894\t141667\t0.4014\t43116\tObama\t43116\t0.0006915239999999999\t43116.0\n16983\t-82.933904\t39.60581\tCircleville city\tOH\tOhio\tPickaway County\t13322\t38.6\t16.8\t15.7\t21663\t111883\t0.4014\t43113\tObama\t43113\t0.029910659\t43113.0\n16984\t-83.063789\t39.772554\tCommercial Point village\tOH\tOhio\tPickaway County\t1079\t41.2\t12.8\t5.7\t28087\t155163\t0.4014\t43116\tObama\t43116\t0.002422579\t43116.0\n16985\t-83.15193000000001\t39.805291\tOrient village\tOH\tOhio\tPickaway County\t242\t32.6\t6.5\t5.1\t18145\t116667\t0.4014\t43126\tObama\t43126\t0.00054334\t43126.0\n16986\t-82.946466\t39.571845\tLogan Elm Village CDP\tOH\tOhio\tPickaway County\t1043\t39.4\t6.2\t8.5\t20980\t107646\t0.4014\t43113\tObama\t43113\t0.0023417520000000003\t43113.0\n16987\t-82.778002\t39.554097999999996\tTarlton village\tOH\tOhio\tPickaway County\t321\t40.8\t12.9\t12.1\t20098\t126786\t0.4014\t43156\tObama\t43156\t0.000720712\t43156.0\n16988\t-83.000848\t39.066757\tPiketon village\tOH\tOhio\tPike County\t1947\t38.2\t12.3\t21.4\t17043\t89844\t0.4908\t45690\tObama\t45690\t0.00437142\t45690.0\n16989\t-82.825153\t39.032107\tBeaver village\tOH\tOhio\tPike County\t468\t36.4\t6.6\t18.6\t18754\t87500\t0.4908\t45613\tObama\t45613\t0.001050757\t45613.0\n16990\t-82.982166\t39.126329999999996\tWaverly City\tOH\tOhio\tPike County\t4309\t46.8\t27.3\t14.3\t25607\t94773\t0.4908\t45690\tObama\t45690\t0.009674601\t45690.0\n16991\t-81.362864\t41.149319\tKent city\tOH\tOhio\tPortage County\t28163\t24.2\t42.4\t13.6\t21318\t126667\t0.5175\t44240\tObama\t44240\t0.06323179\t44240.0\n16992\t-81.348236\t41.094235999999995\tBrimfield CDP\tOH\tOhio\tPortage County\t3652\t39.8\t19.1\t14.6\t23153\t118416\t0.5175\t44243\tObama\t44243\t0.008199499\t44243.0\n16993\t-81.34505\t41.311890999999996\tAurora city\tOH\tOhio\tPortage County\t14565\t41.5\t46.1\t8.4\t41892\t218079\t0.5175\t44202\tObama\t44202\t0.032701453\t44202.0\n16994\t-81.22307099999999\t41.281925\tMantua village\tOH\tOhio\tPortage County\t1044\t37.9\t19.9\t10.8\t25267\t144467\t0.5175\t44255\tObama\t44255\t0.002343997\t44255.0\n16995\t-81.345574\t41.239611\tStreetsboro city\tOH\tOhio\tPortage County\t14746\t36.3\t25.2\t8.8\t29713\t130959\t0.5175\t44241\tObama\t44241\t0.033107835\t44241.0\n16996\t-81.314249\t41.162482000000004\tBrady Lake village\tOH\tOhio\tPortage County\t589\t42.3\t22.2\t8.6\t26279\t101613\t0.5175\t44243\tObama\t44243\t0.0013224270000000002\t44243.0\n16997\t-81.143236\t41.310476\tHiram village\tOH\tOhio\tPortage County\t1294\t29.7\t28.6\t15.0\t22800\t170833\t0.5175\t44234\tObama\t44234\t0.002905299\t44234.0\n16998\t-81.240786\t41.161571\tRavenna city\tOH\tOhio\tPortage County\t11438\t38.2\t17.7\t13.0\t22992\t104795\t0.5175\t44266\tObama\t44266\t0.025680687999999997\t44266.0\n16999\t-81.347185\t41.2036\tSugar Bush Knolls village\tOH\tOhio\tPortage County\t200\t42.5\t38.7\t8.7\t31696\t196875\t0.5175\t44241\tObama\t44241\t0.000449042\t44241.0\n17000\t-81.036369\t41.237315\tWindham village\tOH\tOhio\tPortage County\t2556\t28.0\t4.6\t19.8\t15916\t82949\t0.5175\t44288\tObama\t44288\t0.005738750999999999\t44288.0\n17001\t-81.09344399999999\t41.284203999999995\tGarrettsville village\tOH\tOhio\tPortage County\t2205\t38.8\t23.0\t9.7\t23527\t141858\t0.5175\t44231\tObama\t44231\t0.004950683\t44231.0\n17002\t-84.62618499999999\t39.903591999999996\tWest Manchester village\tOH\tOhio\tPreble County\t429\t40.4\t15.2\t12.6\t19928\t107721\t0.3079\t45382\tObama\t45382\t0.0009631939999999999\t45382.0\n17003\t-84.675033\t39.90416\tEldorado village\tOH\tOhio\tPreble County\t507\t37.8\t7.9\t13.0\t20103\t93462\t0.3079\t45321\tObama\t45321\t0.00113832\t45321.0\n17004\t-84.644672\t39.637295\tCamden village\tOH\tOhio\tPreble County\t2259\t38.4\t10.0\t15.0\t20540\t86761\t0.3079\t45311\tObama\t45311\t0.005071925\t45311.0\n17005\t-84.792438\t39.856352\tNew Paris village\tOH\tOhio\tPreble County\t1556\t41.4\t6.3\t12.7\t20186\t76364\t0.3079\t45347\tObama\t45347\t0.003493543\t45347.0\n17006\t-84.558712\t39.588689\tWest Elkton village\tOH\tOhio\tPreble County\t189\t43.1\t10.4\t13.5\t25765\t137500\t0.3079\t45070\tObama\t45070\t0.000424344\t45070.0\n17007\t-84.482951\t39.903183\tVerona village\tOH\tOhio\tPreble County\t426\t41.3\t9.3\t9.0\t22888\t111058\t0.3079\t45378\tObama\t45378\t0.0009564589999999999\t45378.0\n17008\t-84.534316\t39.743411\tWest Alexandria village\tOH\tOhio\tPreble County\t1359\t41.2\t13.0\t11.2\t22851\t114552\t0.3079\t45381\tObama\t45381\t0.003051238\t45381.0\n17009\t-84.543406\t39.856441\tLewisburg village\tOH\tOhio\tPreble County\t1866\t40.6\t11.7\t10.6\t21816\t117969\t0.3079\t45338\tObama\t45338\t0.0041895579999999995\t45338.0\n17010\t-84.811212\t39.571355\tCollege Corner village\tOH\tOhio\tPreble County\t410\t45.9\t29.7\t8.8\t25876\t130833\t0.3079\t45003\tObama\t45003\t0.000920535\t45003.0\n17011\t-84.634764\t39.749411\tEaton city\tOH\tOhio\tPreble County\t7895\t38.7\t14.1\t13.7\t23219\t99732\t0.3079\t45320\tObama\t45320\t0.017725916\t45320.0\n17012\t-84.528468\t39.648365999999996\tGratis village\tOH\tOhio\tPreble County\t905\t40.6\t8.4\t16.3\t21569\t114118\t0.3079\t45330\tObama\t45330\t0.0020319129999999998\t45330.0\n17013\t-84.301177\t41.054584999999996\tDupont village\tOH\tOhio\tPutnam County\t282\t35.5\t14.4\t18.6\t18116\t94375\t0.235\t45837\tObama\t45837\t0.0006331490000000001\t45837.0\n17014\t-84.039074\t41.01956\tOttawa village\tOH\tOhio\tPutnam County\t4397\t38.3\t21.4\t10.1\t25154\t117188\t0.235\t45875\tObama\t45875\t0.009872179\t45875.0\n17015\t-84.337203\t40.934329999999996\tOttoville village\tOH\tOhio\tPutnam County\t853\t39.5\t13.9\t5.9\t23053\t118542\t0.235\t45876\tObama\t45876\t0.0019151620000000002\t45876.0\n17016\t-84.132488\t41.10218\tMiller City village\tOH\tOhio\tPutnam County\t140\t35.5\t14.3\t7.3\t21751\t123438\t0.235\t43548\tObama\t43548\t0.000314329\t43548.0\n17017\t-83.92179300000001\t41.018763\tGilboa village\tOH\tOhio\tPutnam County\t168\t39.2\t14.5\t6.2\t20373\t105147\t0.235\t45877\tObama\t45877\t0.000377195\t45877.0\n17018\t-84.07889300000001\t41.028022\tGlandorf village\tOH\tOhio\tPutnam County\t946\t37.8\t16.2\t9.2\t23259\t118981\t0.235\t45875\tObama\t45875\t0.002123967\t45875.0\n17019\t-84.267461\t41.099103\tContinental village\tOH\tOhio\tPutnam County\t1206\t37.5\t8.5\t8.8\t22046\t70714\t0.235\t45831\tObama\t45831\t0.0027077209999999997\t45831.0\n17020\t-83.96036\t40.947424\tPandora village\tOH\tOhio\tPutnam County\t1219\t38.4\t25.5\t9.8\t22046\t110354\t0.235\t45877\tObama\t45877\t0.0027369079999999997\t45877.0\n17021\t-84.303552\t41.019513\tCloverdale village\tOH\tOhio\tPutnam County\t211\t35.4\t14.0\t18.3\t18162\t94167\t0.235\t45827\tObama\t45827\t0.00047373900000000004\t45827.0\n17022\t-84.059241\t40.918667\tColumbus Grove village\tOH\tOhio\tPutnam County\t2170\t36.0\t11.6\t10.3\t21127\t107875\t0.235\t45830\tObama\t45830\t0.004872100999999999\t45830.0\n17023\t-84.299624\t40.906068\tFort Jennings village\tOH\tOhio\tPutnam County\t428\t38.9\t14.8\t8.4\t21767\t115278\t0.235\t45844\tObama\t45844\t0.0009609489999999999\t45844.0\n17024\t-83.941286\t41.155165999999994\tBelmore village\tOH\tOhio\tPutnam County\t170\t33.4\t15.7\t13.3\t17441\t90000\t0.235\t45856\tObama\t45856\t0.000381685\t45856.0\n17025\t-84.192319\t40.985546\tKalida village\tOH\tOhio\tPutnam County\t1035\t34.5\t19.7\t6.8\t24960\t124199\t0.235\t45853\tObama\t45853\t0.00232379\t45853.0\n17026\t-83.965227\t41.109877000000004\tLeipsic village\tOH\tOhio\tPutnam County\t2207\t38.8\t9.2\t18.3\t20174\t86803\t0.235\t45856\tObama\t45856\t0.0049551740000000006\t45856.0\n17027\t-84.000997\t41.105258\tWest Leipsic village\tOH\tOhio\tPutnam County\t266\t33.0\t12.3\t11.7\t18398\t111765\t0.235\t45856\tObama\t45856\t0.000597225\t45856.0\n17028\t-82.42338199999999\t40.703334000000005\tLucas village\tOH\tOhio\tRichland County\t646\t43.0\t8.2\t10.7\t23592\t112171\t0.3931\t44843\tObama\t44843\t0.001450404\t44843.0\n17029\t-82.53477099999999\t40.629757\tBellville village\tOH\tOhio\tRichland County\t1824\t43.5\t12.5\t10.7\t21228\t105519\t0.3931\t44813\tObama\t44813\t0.004095259\t44813.0\n17030\t-82.527711\t40.765516999999996\tMansfield city\tOH\tOhio\tRichland County\t48937\t37.0\t16.2\t14.1\t20927\t78768\t0.3931\t44903\tObama\t44903\t0.10987373800000001\t44903.0\n17031\t-82.41981899999999\t40.589319\tButler village\tOH\tOhio\tRichland County\t947\t40.1\t14.0\t9.8\t21508\t98793\t0.3931\t44822\tObama\t44822\t0.002126212\t44822.0\n17032\t-82.66125699999999\t40.883134999999996\tShelby city\tOH\tOhio\tRichland County\t9413\t38.6\t11.4\t11.3\t22328\t88484\t0.3931\t44875\tObama\t44875\t0.021134142\t44875.0\n17033\t-82.57894399999999\t40.680367\tLexington village\tOH\tOhio\tRichland County\t4445\t41.4\t29.2\t10.5\t28912\t117461\t0.3931\t44904\tObama\t44904\t0.009979949\t44904.0\n17034\t-82.601387\t40.969235\tShiloh village\tOH\tOhio\tRichland County\t759\t29.3\t6.5\t13.6\t15680\t62292\t0.3931\t44878\tObama\t44878\t0.001704113\t44878.0\n17035\t-82.61058\t40.770283\tOntario village\tOH\tOhio\tRichland County\t5506\t41.9\t21.8\t9.7\t28197\t115979\t0.3931\t44906\tObama\t44906\t0.012362115\t44906.0\n17036\t-83.030213\t39.334416999999995\tNorth Fork Village CDP\tOH\tOhio\tRoss County\t1893\t40.5\t32.6\t9.1\t25635\t141493\t0.4843\t45601\tObama\t45601\t0.004250179000000001\t45601.0\n17037\t-83.269571\t39.226467\tBainbridge village\tOH\tOhio\tRoss County\t1024\t36.5\t6.1\t17.7\t15452\t68182\t0.4843\t45612\tObama\t45612\t0.002299093\t45612.0\n17038\t-82.989874\t39.338021999999995\tChillicothe city\tOH\tOhio\tRoss County\t21922\t41.5\t20.9\t13.9\t23198\t94539\t0.4843\t45601\tObama\t45601\t0.049219447\t45601.0\n17039\t-82.91207\t39.4722\tKingston village\tOH\tOhio\tRoss County\t1082\t42.1\t15.7\t8.3\t22112\t114224\t0.4843\t45644\tObama\t45644\t0.002429315\t45644.0\n17040\t-82.745626\t39.464659999999995\tAdelphi village\tOH\tOhio\tRoss County\t402\t38.8\t5.5\t11.0\t21125\t96500\t0.4843\t43101\tObama\t43101\t0.000902574\t43101.0\n17041\t-83.19\t39.406773\tFrankfort village\tOH\tOhio\tRoss County\t1045\t41.7\t14.0\t11.4\t23406\t99677\t0.4843\t45628\tObama\t45628\t0.002346242\t45628.0\n17042\t-83.306859\t39.337281\tSouth Salem village\tOH\tOhio\tRoss County\t246\t41.8\t15.5\t9.4\t18007\t101923\t0.4843\t456XX\tObama\t456XX\t0.0005523209999999999\t0.0\n17043\t-83.154698\t39.505878\tClarksburg village\tOH\tOhio\tRoss County\t527\t37.1\t16.3\t14.5\t16286\t88000\t0.4843\t43115\tObama\t43115\t0.001183225\t43115.0\n17044\t-83.362904\t41.450709\tWoodville village\tOH\tOhio\tSandusky County\t1954\t40.4\t18.2\t10.3\t25016\t135807\t0.5015\t43469\tObama\t43469\t0.004387136\t43469.0\n17045\t-82.82539200000001\t41.291142\tBellevue city\tOH\tOhio\tSandusky County\t8003\t37.5\t10.8\t10.6\t25310\t106566\t0.5015\t44811\tObama\t44811\t0.017968399\t44811.0\n17046\t-83.22059899999999\t41.42138\tLindsey village\tOH\tOhio\tSandusky County\t492\t39.9\t17.5\t10.9\t22086\t132813\t0.5015\t43442\tObama\t43442\t0.0011046419999999999\t43442.0\n17047\t-82.976629\t41.305305\tClyde city\tOH\tOhio\tSandusky County\t5917\t37.9\t12.8\t8.3\t23496\t99585\t0.5015\t43410\tObama\t43410\t0.013284895\t43410.0\n17048\t-83.291985\t41.340214\tHelena village\tOH\tOhio\tSandusky County\t247\t43.6\t10.2\t6.0\t21762\t119853\t0.5015\t43435\tObama\t43435\t0.0005545659999999999\t43435.0\n17049\t-83.16545699999999\t41.352128\tStony Prairie CDP\tOH\tOhio\tSandusky County\t827\t43.0\t4.3\t14.4\t22886\t87813\t0.5015\t43420\tObama\t43420\t0.0018567870000000002\t43420.0\n17050\t-83.115205\t41.352267\tFremont city\tOH\tOhio\tSandusky County\t16784\t35.0\t13.5\t13.1\t21925\t88314\t0.5015\t43420\tObama\t43420\t0.037683569\t43420.0\n17051\t-83.319937\t41.384735\tGibsonburg village\tOH\tOhio\tSandusky County\t2439\t38.1\t13.7\t12.2\t21473\t103553\t0.5015\t43431\tObama\t43431\t0.005476061999999999\t43431.0\n17052\t-83.250977\t41.267134000000006\tBurgoon village\tOH\tOhio\tSandusky County\t200\t42.5\t14.2\t8.0\t23528\t121250\t0.5015\t43407\tObama\t43407\t0.000449042\t43407.0\n17053\t-83.052865\t41.260529\tGreen Springs village\tOH\tOhio\tSandusky County\t1290\t38.8\t8.0\t12.3\t21427\t93649\t0.5015\t44836\tObama\t44836\t0.0028963179999999997\t44836.0\n17054\t-83.13669\t41.32695\tBallville CDP\tOH\tOhio\tSandusky County\t3191\t49.7\t26.6\t5.9\t30609\t148112\t0.5015\t43420\tObama\t43420\t0.007164458\t43420.0\n17055\t-82.935012\t38.751719\tNew Boston village\tOH\tOhio\tScioto County\t2163\t37.4\t7.2\t23.6\t15244\t52212\t0.4838\t45662\tObama\t45662\t0.004856385\t45662.0\n17056\t-82.993584\t38.878254999999996\tLucasville CDP\tOH\tOhio\tScioto County\t1622\t34.3\t14.0\t9.5\t16885\t75690\t0.4838\t45648\tObama\t45648\t0.003641727\t45648.0\n17057\t-83.188373\t38.865189\tOtway village\tOH\tOhio\tScioto County\t86\t38.6\t5.1\t15.4\t20069\t71667\t0.4838\t45657\tObama\t45657\t0.000193088\t45657.0\n17058\t-82.728187\t38.817\tSouth Webster village\tOH\tOhio\tScioto County\t745\t37.7\t11.7\t10.4\t17573\t74200\t0.4838\t45682\tObama\t45682\t0.00167268\t45682.0\n17059\t-83.242373\t38.9234\tRarden village\tOH\tOhio\tScioto County\t177\t36.2\t2.6\t20.9\t17805\t64167\t0.4838\t45671\tObama\t45671\t0.000397402\t45671.0\n17060\t-82.94433000000001\t38.753840000000004\tPortsmouth city\tOH\tOhio\tScioto County\t19678\t40.5\t15.1\t14.9\t18503\t68795\t0.4838\t45662\tObama\t45662\t0.044181200999999996\t45662.0\n17061\t-82.844142\t38.611761\tFranklin Furnace CDP\tOH\tOhio\tScioto County\t1519\t37.8\t13.3\t14.0\t19086\t89643\t0.4838\t45629\tObama\t45629\t0.0034104709999999996\t45629.0\n17062\t-82.860361\t38.753934\tSciotodale CDP\tOH\tOhio\tScioto County\t915\t42.8\t6.1\t15.4\t19240\t82907\t0.4838\t456HH\tObama\t456HH\t0.002054365\t0.0\n17063\t-82.966385\t38.78102\tRosemount CDP\tOH\tOhio\tScioto County\t1985\t46.7\t24.8\t13.4\t25249\t97263\t0.4838\t45662\tObama\t45662\t0.004456738\t45662.0\n17064\t-82.841931\t38.738316\tWheelersburg CDP\tOH\tOhio\tScioto County\t6377\t41.2\t19.1\t10.2\t21216\t95622\t0.4838\t45694\tObama\t45694\t0.014317691\t45694.0\n17065\t-83.041577\t38.762165\tWest Portsmouth CDP\tOH\tOhio\tScioto County\t3235\t39.5\t6.9\t16.1\t16583\t51532\t0.4838\t45663\tObama\t45663\t0.007263248000000001\t45663.0\n17066\t-83.404397\t41.173204\tFostoria city\tOH\tOhio\tSeneca County\t12832\t37.4\t11.3\t15.1\t19863\t70293\t0.4494\t44830\tObama\t44830\t0.028810508\t44830.0\n17067\t-83.17879599999999\t41.116942\tTiffin city\tOH\tOhio\tSeneca County\t17402\t36.6\t20.5\t14.1\t21300\t88656\t0.4494\t44883\tObama\t44883\t0.039071108\t44883.0\n17068\t-83.01432199999999\t41.050957000000004\tBloomville village\tOH\tOhio\tSeneca County\t1057\t32.8\t15.5\t13.8\t19813\t80116\t0.4494\t44818\tObama\t44818\t0.002373185\t44818.0\n17069\t-83.318894\t41.051885\tNew Riegel village\tOH\tOhio\tSeneca County\t229\t41.0\t10.4\t10.9\t21308\t116667\t0.4494\t44853\tObama\t44853\t0.000514153\t44853.0\n17070\t-82.88710999999999\t41.065345\tAttica village\tOH\tOhio\tSeneca County\t1049\t40.0\t13.0\t10.4\t20792\t91585\t0.4494\t44807\tObama\t44807\t0.002355223\t44807.0\n17071\t-83.01629399999999\t41.124102\tRepublic village\tOH\tOhio\tSeneca County\t581\t37.4\t12.0\t9.9\t18328\t90526\t0.4494\t44867\tObama\t44867\t0.001304466\t44867.0\n17072\t-83.233838\t41.243974\tBettsville village\tOH\tOhio\tSeneca County\t729\t40.2\t7.8\t16.5\t18507\t79868\t0.4494\t44815\tObama\t44815\t0.0016367570000000002\t44815.0\n17073\t-84.370925\t40.344741\tFort Loramie village\tOH\tOhio\tShelby County\t1541\t35.6\t18.3\t9.1\t24213\t154241\t0.2658\t45845\tObama\t45845\t0.003459865\t45845.0\n17074\t-84.039924\t40.438559999999995\tJackson Center village\tOH\tOhio\tShelby County\t1385\t37.8\t14.1\t11.3\t21220\t109152\t0.2658\t45334\tObama\t45334\t0.003109613\t45334.0\n17075\t-84.235853\t40.207518\tLockington village\tOH\tOhio\tShelby County\t210\t38.4\t11.2\t8.9\t22671\t141667\t0.2658\t45356\tObama\t45356\t0.00047149400000000004\t45356.0\n17076\t-84.164485\t40.289794\tSidney city\tOH\tOhio\tShelby County\t20409\t36.1\t17.3\t13.6\t24571\t109809\t0.2658\t45365\tObama\t45365\t0.045822447999999995\t45365.0\n17077\t-84.0923\t40.33039\tPort Jefferson village\tOH\tOhio\tShelby County\t325\t41.7\t12.2\t10.0\t26613\t130469\t0.2658\t45360\tObama\t45360\t0.000729693\t45360.0\n17078\t-84.17295899999999\t40.395169\tAnna village\tOH\tOhio\tShelby County\t1458\t32.6\t13.3\t12.1\t22605\t110000\t0.2658\t45302\tObama\t45302\t0.003273513\t45302.0\n17079\t-84.183199\t40.461465000000004\tBotkins village\tOH\tOhio\tShelby County\t1329\t37.3\t15.3\t11.3\t22588\t117257\t0.2658\t45306\tObama\t45306\t0.002983881\t45306.0\n17080\t-84.406925\t40.233829\tRussia village\tOH\tOhio\tShelby County\t575\t31.4\t21.1\t10.0\t23639\t150893\t0.2658\t45363\tObama\t45363\t0.001290995\t45363.0\n17081\t-84.25995999999999\t40.43878\tKettlersville village\tOH\tOhio\tShelby County\t185\t35.8\t17.9\t8.9\t25136\t157143\t0.2658\t45336\tObama\t45336\t0.00041536300000000003\t45336.0\n17082\t-81.08543399999999\t40.910835999999996\tAlliance city\tOH\tOhio\tStark County\t22462\t35.5\t15.0\t15.7\t19509\t77035\t0.4928\t44601\tObama\t44601\t0.050431859\t44601.0\n17083\t-81.514447\t40.723478\tNavarre village\tOH\tOhio\tStark County\t1706\t46.2\t11.8\t10.8\t23119\t95067\t0.4928\t44662\tObama\t44662\t0.003830325\t44662.0\n17084\t-81.372688\t40.812137\tCanton city\tOH\tOhio\tStark County\t77478\t36.9\t14.5\t18.3\t19680\t73577\t0.4928\t44703\tObama\t44703\t0.17395421600000002\t44703.0\n17085\t-81.35225\t40.670189\tEast Sparta village\tOH\tOhio\tStark County\t846\t42.3\t6.6\t15.3\t20855\t91630\t0.4928\t44671\tObama\t44671\t0.0018994460000000002\t44671.0\n17086\t-81.335356\t40.961481\tHartville village\tOH\tOhio\tStark County\t2267\t39.1\t27.6\t10.6\t26697\t151100\t0.4928\t44632\tObama\t44632\t0.005089886\t44632.0\n17087\t-81.585815\t40.889426\tCanal Fulton village\tOH\tOhio\tStark County\t5348\t40.2\t20.5\t11.9\t25493\t128342\t0.4928\t44614\tObama\t44614\t0.012007371999999999\t44614.0\n17088\t-81.259745\t40.668372999999995\tWaynesburg village\tOH\tOhio\tStark County\t1033\t40.3\t11.8\t15.4\t20149\t89559\t0.4928\t44688\tObama\t44688\t0.0023193000000000003\t44688.0\n17089\t-81.416409\t40.815886\tMeyers Lake village\tOH\tOhio\tStark County\t555\t52.9\t29.0\t11.1\t28849\t101020\t0.4928\t44708\tObama\t44708\t0.00124609\t44708.0\n17090\t-81.4044\t40.973581\tUniontown CDP\tOH\tOhio\tStark County\t2954\t46.1\t25.0\t12.2\t31661\t149761\t0.4928\t44685\tObama\t44685\t0.006632344\t44685.0\n17091\t-81.284137\t40.788746\tEast Canton village\tOH\tOhio\tStark County\t1607\t43.7\t10.0\t12.9\t19987\t95375\t0.4928\t44730\tObama\t44730\t0.0036080490000000003\t44730.0\n17092\t-81.08491500000001\t40.744555\tMinerva village\tOH\tOhio\tStark County\t3817\t42.2\t11.0\t15.0\t20870\t90065\t0.4928\t44657\tObama\t44657\t0.008569958\t44657.0\n17093\t-81.263326\t40.836606\tLouisville city\tOH\tOhio\tStark County\t9198\t38.0\t17.2\t11.5\t25470\t119167\t0.4928\t44641\tObama\t44641\t0.020651422\t44641.0\n17094\t-81.290154\t40.655179\tMagnolia village\tOH\tOhio\tStark County\t1001\t42.5\t10.7\t13.6\t21533\t101367\t0.4928\t44643\tObama\t44643\t0.002247453\t44643.0\n17095\t-81.443883\t40.828915\tHills and Dales village\tOH\tOhio\tStark County\t250\t56.3\t45.6\t8.3\t42330\t210417\t0.4928\t44718\tObama\t44718\t0.000561302\t44718.0\n17096\t-81.39749499999999\t40.873542\tNorth Canton city\tOH\tOhio\tStark County\t16351\t43.7\t36.7\t11.0\t27817\t131582\t0.4928\t44720\tObama\t44720\t0.036711394\t44720.0\n17097\t-81.402028\t40.927381\tGreentown CDP\tOH\tOhio\tStark County\t3730\t37.3\t35.8\t10.8\t31228\t166433\t0.4928\t44720\tObama\t44720\t0.008374625\t44720.0\n17098\t-81.468325\t40.797707\tPerry Heights CDP\tOH\tOhio\tStark County\t8793\t41.6\t15.2\t14.9\t24802\t98396\t0.4928\t44646\tObama\t44646\t0.019742113000000002\t44646.0\n17099\t-81.148368\t40.983944\tLimaville village\tOH\tOhio\tStark County\t191\t43.2\t6.0\t7.4\t22793\t110417\t0.4928\t44640\tObama\t44640\t0.000428835\t44640.0\n17100\t-81.600224\t40.714407\tBrewster village\tOH\tOhio\tStark County\t2311\t40.8\t10.3\t13.1\t19634\t93482\t0.4928\t44613\tObama\t44613\t0.005188675\t44613.0\n17101\t-81.63438199999999\t40.655834999999996\tWilmot village\tOH\tOhio\tStark County\t346\t38.3\t12.4\t10.3\t19204\t82222\t0.4928\t44689\tObama\t44689\t0.0007768419999999999\t44689.0\n17102\t-81.57955600000001\t40.653259000000006\tBeach City village\tOH\tOhio\tStark County\t1137\t40.7\t8.9\t12.9\t21695\t77200\t0.4928\t44608\tObama\t44608\t0.002552801\t44608.0\n17103\t-81.524033\t40.786654\tMassillon city\tOH\tOhio\tStark County\t31423\t39.6\t14.8\t13.6\t22045\t88781\t0.4928\t44647\tObama\t44647\t0.070551167\t44647.0\n17104\t-81.551878\t41.237858\tPeninsula village\tOH\tOhio\tSummit County\t581\t45.1\t45.0\t12.1\t35564\t191912\t0.5717\t44264\tObama\t44264\t0.001304466\t44264.0\n17105\t-81.646121\t41.029573\tNorton city\tOH\tOhio\tSummit County\t11801\t43.9\t21.7\t9.0\t25546\t113432\t0.5717\t44203\tObama\t44203\t0.026495697999999998\t44203.0\n17106\t-81.540122\t40.99145\tPortage Lakes CDP\tOH\tOhio\tSummit County\t10082\t44.4\t23.4\t11.9\t27599\t109184\t0.5717\t44319\tObama\t44319\t0.022636186000000003\t44319.0\n17107\t-81.426119\t41.021361999999996\tLakemore village\tOH\tOhio\tSummit County\t2490\t40.0\t7.8\t13.9\t20477\t85982\t0.5717\t44250\tObama\t44250\t0.005590568000000001\t44250.0\n17108\t-81.440908\t41.239856\tHudson city\tOH\tOhio\tSummit County\t22428\t42.2\t70.6\t9.4\t47366\t240037\t0.5717\t44236\tObama\t44236\t0.050355522\t44236.0\n17109\t-81.641475\t41.233367\tRichfield village\tOH\tOhio\tSummit County\t3475\t48.1\t38.4\t11.4\t42508\t196284\t0.5717\t44286\tObama\t44286\t0.007802096999999999\t44286.0\n17110\t-81.63040500000001\t40.928537\tClinton village\tOH\tOhio\tSummit County\t1340\t41.4\t19.0\t11.7\t23961\t105583\t0.5717\t44216\tObama\t44216\t0.0030085790000000004\t44216.0\n17111\t-81.49888100000001\t41.314479\tMacedonia city\tOH\tOhio\tSummit County\t10875\t41.8\t35.0\t9.7\t31355\t167471\t0.5717\t44056\tObama\t44056\t0.024416636000000002\t44056.0\n17112\t-81.475649\t40.948352\tGreen city\tOH\tOhio\tSummit County\t24310\t42.1\t31.6\t10.5\t30423\t140421\t0.5717\t44685\tObama\t44685\t0.054581004\t44685.0\n17113\t-81.64375799999999\t41.153734\tMontrose-Ghent CDP\tOH\tOhio\tSummit County\t5378\t51.1\t62.0\t9.0\t56508\t250725\t0.5717\t44333\tObama\t44333\t0.012074728\t44333.0\n17114\t-81.603635\t41.009572\tBarberton city\tOH\tOhio\tSummit County\t26324\t39.1\t12.9\t14.8\t21417\t83848\t0.5717\t44203\tObama\t44203\t0.059102852000000004\t44203.0\n17115\t-81.52176700000001\t41.079845\tAkron city\tOH\tOhio\tSummit County\t206878\t36.3\t21.4\t15.5\t22077\t82591\t0.5717\t44308\tObama\t44308\t0.46448411700000003\t44308.0\n17116\t-81.434502\t41.138471\tMunroe Falls city\tOH\tOhio\tSummit County\t5205\t45.0\t39.2\t11.1\t33049\t142883\t0.5717\t44262\tObama\t44262\t0.011686307\t44262.0\n17117\t-81.672292\t41.110115\tPigeon Creek CDP\tOH\tOhio\tSummit County\t965\t48.0\t53.9\t8.0\t39902\t193238\t0.5717\t44321\tObama\t44321\t0.002166626\t44321.0\n17118\t-81.460489\t41.1593\tSilver Lake village\tOH\tOhio\tSummit County\t2913\t50.2\t55.9\t7.0\t39646\t184500\t0.5717\t44221\tObama\t44221\t0.006540291\t44221.0\n17119\t-81.508726\t41.2537\tBoston Heights village\tOH\tOhio\tSummit County\t1262\t38.7\t44.2\t9.3\t40877\t260185\t0.5717\t44264\tObama\t44264\t0.002833452\t44264.0\n17120\t-81.43428399999999\t41.176367\tStow city\tOH\tOhio\tSummit County\t34450\t38.6\t41.7\t9.3\t30441\t146914\t0.5717\t44224\tObama\t44224\t0.077347412\t44224.0\n17121\t-81.448803\t41.32203\tTwinsburg city\tOH\tOhio\tSummit County\t18525\t38.7\t43.4\t8.8\t35563\t175911\t0.5717\t44087\tObama\t44087\t0.041592476\t44087.0\n17122\t-81.540341\t41.163906\tCuyahoga Falls city\tOH\tOhio\tSummit County\t49936\t39.9\t31.5\t9.9\t27805\t111588\t0.5717\t44223\tObama\t44223\t0.112116701\t44223.0\n17123\t-81.382225\t41.109183\tTallmadge city\tOH\tOhio\tSummit County\t16746\t44.8\t28.8\t7.8\t26907\t141019\t0.5717\t44278\tObama\t44278\t0.037598251\t44278.0\n17124\t-81.621071\t41.126615\tFairlawn city\tOH\tOhio\tSummit County\t7495\t46.1\t53.4\t8.5\t37329\t170109\t0.5717\t44333\tObama\t44333\t0.016827833\t44333.0\n17125\t-81.52856899999999\t41.342657\tNorthfield village\tOH\tOhio\tSummit County\t3924\t38.8\t16.2\t13.7\t26749\t117071\t0.5717\t44067\tObama\t44067\t0.008810196\t44067.0\n17126\t-81.389282\t41.052592\tMogadore village\tOH\tOhio\tSummit County\t3772\t42.9\t21.4\t8.2\t27597\t111171\t0.5717\t44260\tObama\t44260\t0.008468924000000001\t44260.0\n17127\t-81.399366\t41.330465999999994\tReminderville village\tOH\tOhio\tSummit County\t2653\t40.0\t36.6\t8.5\t31458\t137588\t0.5717\t44202\tObama\t44202\t0.005956537\t44202.0\n17128\t-81.543686\t40.942652\tNew Franklin village\tOH\tOhio\tSummit County\t2115\t45.4\t20.6\t9.3\t27978\t121716\t0.5717\t44319\tObama\t44319\t0.004748615\t44319.0\n17129\t-80.554843\t41.238529\tBrookfield Center CDP\tOH\tOhio\tTrumbull County\t1203\t50.8\t25.3\t13.6\t26666\t121396\t0.6063\t44438\tObama\t44438\t0.002700985\t44438.0\n17130\t-80.696042\t41.166125\tGirard city\tOH\tOhio\tTrumbull County\t10059\t41.8\t19.2\t13.6\t23197\t85000\t0.6063\t44420\tObama\t44420\t0.022584546\t44420.0\n17131\t-80.986405\t41.176035\tSouth Canal CDP\tOH\tOhio\tTrumbull County\t1269\t45.3\t13.7\t11.4\t27798\t108960\t0.6063\t44444\tObama\t44444\t0.0028491690000000004\t44444.0\n17132\t-80.858965\t41.168423\tLordstown village\tOH\tOhio\tTrumbull County\t3333\t43.6\t17.6\t13.7\t25870\t112113\t0.6063\t44481\tObama\t44481\t0.007483278\t44481.0\n17133\t-80.744185\t41.248398\tHowland Center CDP\tOH\tOhio\tTrumbull County\t6069\t46.4\t32.3\t11.0\t27944\t121203\t0.6063\t44484\tObama\t44484\t0.013626167\t44484.0\n17134\t-80.723042\t41.163540000000005\tMcDonald village\tOH\tOhio\tTrumbull County\t3203\t40.9\t24.7\t13.5\t23427\t97771\t0.6063\t44437\tObama\t44437\t0.007191401\t44437.0\n17135\t-80.777989\t41.20865\tBolindale CDP\tOH\tOhio\tTrumbull County\t2301\t41.2\t10.5\t22.8\t21275\t84381\t0.6063\t44484\tObama\t44484\t0.005166223\t44484.0\n17136\t-80.537819\t41.208414000000005\tMasury CDP\tOH\tOhio\tTrumbull County\t2372\t45.1\t16.2\t17.2\t21610\t83448\t0.6063\t44438\tObama\t44438\t0.005325633000000001\t44438.0\n17137\t-80.570546\t41.158482\tHubbard city\tOH\tOhio\tTrumbull County\t7827\t43.3\t21.2\t12.0\t23187\t93724\t0.6063\t44425\tObama\t44425\t0.017573242\t44425.0\n17138\t-80.84595\t41.290031\tChampion Heights CDP\tOH\tOhio\tTrumbull County\t4486\t42.9\t14.7\t12.2\t24891\t102198\t0.6063\t44485\tObama\t44485\t0.010072003000000001\t44485.0\n17139\t-80.765781\t41.14575\tMineral Ridge CDP\tOH\tOhio\tTrumbull County\t3793\t44.7\t20.6\t14.8\t25072\t103106\t0.6063\t44440\tObama\t44440\t0.008516074\t44440.0\n17140\t-80.57907\t41.139328000000006\tMaplewood Park CDP\tOH\tOhio\tTrumbull County\t299\t44.9\t26.4\t9.1\t15518\t57000\t0.6063\t44425\tObama\t44425\t0.0006713169999999999\t44425.0\n17141\t-80.817504\t41.239009\tWarren city\tOH\tOhio\tTrumbull County\t43730\t38.0\t13.2\t18.9\t21081\t72771\t0.6063\t44483\tObama\t44483\t0.098182941\t44483.0\n17142\t-80.526946\t41.230009\tWest Hill CDP\tOH\tOhio\tTrumbull County\t2287\t40.1\t8.7\t11.4\t20092\t57105\t0.6063\t44438\tObama\t44438\t0.00513479\t44438.0\n17143\t-80.753282\t41.187882\tNiles city\tOH\tOhio\tTrumbull County\t19619\t41.6\t13.4\t18.6\t23485\t88132\t0.6063\t44446\tObama\t44446\t0.044048733\t44446.0\n17144\t-80.972951\t41.390885\tWest Farmington village\tOH\tOhio\tTrumbull County\t571\t23.5\t10.6\t12.8\t15622\t117500\t0.6063\t44491\tObama\t44491\t0.001282014\t44491.0\n17145\t-80.878805\t41.245461\tLeavittsburg CDP\tOH\tOhio\tTrumbull County\t2059\t39.0\t8.0\t13.3\t21127\t62712\t0.6063\t44430\tObama\t44430\t0.0046228829999999995\t44430.0\n17146\t-80.569632\t41.268704\tYankee Lake village\tOH\tOhio\tTrumbull County\t91\t44.6\t13.4\t11.4\t22420\t91667\t0.6063\t44403\tObama\t44403\t0.000204314\t44403.0\n17147\t-80.671945\t41.250836\tVienna Center CDP\tOH\tOhio\tTrumbull County\t987\t46.0\t18.9\t12.3\t27302\t110031\t0.6063\t44473\tObama\t44473\t0.00221602\t44473.0\n17148\t-80.741762\t41.164344\tHilltop CDP\tOH\tOhio\tTrumbull County\t505\t42.0\t13.3\t16.9\t20829\t84444\t0.6063\t44437\tObama\t44437\t0.00113383\t44437.0\n17149\t-80.66598\t41.169331\tChurchill CDP\tOH\tOhio\tTrumbull County\t2428\t46.1\t20.4\t14.2\t22821\t91259\t0.6063\t44420\tObama\t44420\t0.005451365\t44420.0\n17150\t-80.97018\t41.188837\tNewton Falls village\tOH\tOhio\tTrumbull County\t4667\t39.7\t16.1\t18.7\t22839\t92222\t0.6063\t44444\tObama\t44444\t0.010478385\t44444.0\n17151\t-80.718908\t41.332226\tCortland city\tOH\tOhio\tTrumbull County\t6607\t43.5\t34.3\t13.3\t30297\t137536\t0.6063\t44410\tObama\t44410\t0.014834088\t44410.0\n17152\t-80.52835400000001\t41.341977\tOrangeville village\tOH\tOhio\tTrumbull County\t176\t41.5\t8.2\t15.4\t21540\t98500\t0.6063\t44404\tObama\t44404\t0.000395157\t44404.0\n17153\t-81.51922900000001\t40.326685999999995\tPort Washington village\tOH\tOhio\tTuscarawas County\t520\t41.6\t10.4\t12.1\t18078\t78095\t0.4423\t43837\tObama\t43837\t0.001167508\t43837.0\n17154\t-81.59820400000001\t40.275479\tNewcomerstown village\tOH\tOhio\tTuscarawas County\t3784\t38.6\t8.8\t18.3\t18066\t64593\t0.4423\t43832\tObama\t43832\t0.008495866999999999\t43832.0\n17155\t-81.40096700000001\t40.395714\tTuscarawas village\tOH\tOhio\tTuscarawas County\t886\t41.3\t7.6\t8.9\t18180\t98800\t0.4423\t44682\tObama\t44682\t0.0019892539999999998\t44682.0\n17156\t-81.494679\t40.560787\tParral village\tOH\tOhio\tTuscarawas County\t260\t43.7\t26.2\t12.7\t23793\t141667\t0.4423\t44622\tObama\t44622\t0.000583754\t44622.0\n17157\t-81.69993000000001\t40.448\tBaltic village\tOH\tOhio\tTuscarawas County\t731\t30.6\t8.2\t10.3\t15747\t100000\t0.4423\t43804\tObama\t43804\t0.0016412470000000002\t43804.0\n17158\t-81.43914699999999\t40.486605\tNew Philadelphia city\tOH\tOhio\tTuscarawas County\t16455\t39.9\t16.9\t9.9\t21808\t99323\t0.4423\t44663\tObama\t44663\t0.036944896\t44663.0\n17159\t-81.55806199999999\t40.39972\tStone Creek village\tOH\tOhio\tTuscarawas County\t190\t42.9\t16.2\t9.7\t19322\t103409\t0.4423\t43840\tObama\t43840\t0.000426589\t43840.0\n17160\t-81.429036\t40.359608\tGnadenhutten village\tOH\tOhio\tTuscarawas County\t1273\t38.3\t12.1\t10.7\t17052\t86087\t0.4423\t44629\tObama\t44629\t0.00285815\t44629.0\n17161\t-81.454385\t40.650278\tBolivar village\tOH\tOhio\tTuscarawas County\t839\t42.9\t17.9\t11.7\t23451\t108642\t0.4423\t44612\tObama\t44612\t0.001883729\t44612.0\n17162\t-81.422891\t40.613324\tZoar village\tOH\tOhio\tTuscarawas County\t202\t40.0\t19.7\t15.6\t23502\t134615\t0.4423\t44697\tObama\t44697\t0.000453532\t44697.0\n17163\t-81.327759\t40.394498\tDennison village\tOH\tOhio\tTuscarawas County\t2903\t36.9\t8.0\t12.1\t17572\t68307\t0.4423\t44621\tObama\t44621\t0.006517838000000001\t44621.0\n17164\t-81.348529\t40.475879\tRoswell village\tOH\tOhio\tTuscarawas County\t300\t35.4\t4.3\t21.7\t16447\t62500\t0.4423\t44653\tObama\t44653\t0.0006735619999999999\t44653.0\n17165\t-81.52870300000001\t40.600291999999996\tStrasburg village\tOH\tOhio\tTuscarawas County\t2427\t39.1\t13.9\t11.7\t21459\t103176\t0.4423\t44680\tObama\t44680\t0.00544912\t44680.0\n17166\t-81.37145699999999\t40.436069\tMidvale village\tOH\tOhio\tTuscarawas County\t583\t39.1\t8.6\t16.0\t17078\t76111\t0.4423\t44653\tObama\t44653\t0.001308956\t44653.0\n17167\t-81.35084\t40.409763\tUhrichsville city\tOH\tOhio\tTuscarawas County\t5341\t36.6\t8.2\t12.9\t17416\t73011\t0.4423\t44653\tObama\t44653\t0.011991655\t44653.0\n17168\t-81.36779200000001\t40.449622\tBarnhill village\tOH\tOhio\tTuscarawas County\t392\t37.6\t6.7\t18.7\t16762\t68125\t0.4423\t44653\tObama\t44653\t0.0008801210000000001\t44653.0\n17169\t-81.361254\t40.601718\tMineral City village\tOH\tOhio\tTuscarawas County\t846\t39.9\t7.2\t15.6\t19242\t83667\t0.4423\t44678\tObama\t44678\t0.0018994460000000002\t44678.0\n17170\t-81.480436\t40.531878000000006\tDover city\tOH\tOhio\tTuscarawas County\t12121\t43.1\t21.6\t9.5\t22641\t116184\t0.4423\t44622\tObama\t44622\t0.027214165\t44622.0\n17171\t-81.64036\t40.507182\tSugarcreek village\tOH\tOhio\tTuscarawas County\t2273\t37.5\t15.5\t2.9\t18828\t117731\t0.4423\t44681\tObama\t44681\t0.005103358\t44681.0\n17172\t-83.294997\t40.427302000000005\tRichwood village\tOH\tOhio\tUnion County\t2211\t34.3\t9.3\t8.1\t19691\t95439\t0.3444\t43344\tObama\t43344\t0.004964155\t43344.0\n17173\t-83.341649\t40.136987\tUnionville Center village\tOH\tOhio\tUnion County\t310\t42.5\t8.4\t7.2\t22368\t145313\t0.3444\t43077\tObama\t43077\t0.0006960139999999999\t43077.0\n17174\t-83.358492\t40.226755\tMarysville city\tOH\tOhio\tUnion County\t21230\t34.0\t20.3\t9.6\t26338\t160743\t0.3444\t43040\tObama\t43040\t0.047665763\t43040.0\n17175\t-83.262662\t40.353328999999995\tMagnetic Springs village\tOH\tOhio\tUnion County\t341\t38.8\t14.3\t14.0\t23828\t109239\t0.3444\t43036\tObama\t43036\t0.0007656160000000001\t43036.0\n17176\t-83.437374\t40.179045\tMilford Center village\tOH\tOhio\tUnion County\t757\t39.0\t18.3\t7.4\t29374\t129630\t0.3444\t43045\tObama\t43045\t0.001699622\t43045.0\n17177\t-84.476008\t40.742577000000004\tElgin village\tOH\tOhio\tVan Wert County\t50\t43.3\t8.1\t10.7\t22321\t108333\t0.2906\t45838\tObama\t45838\t0.00011226\t45838.0\n17178\t-84.792402\t40.746569\tWillshire village\tOH\tOhio\tVan Wert County\t450\t36.7\t7.8\t16.9\t23789\t74643\t0.2906\t45898\tObama\t45898\t0.001010344\t45898.0\n17179\t-84.58370500000001\t40.86505\tVan Wert city\tOH\tOhio\tVan Wert County\t10234\t39.0\t16.0\t19.1\t22610\t84573\t0.2906\t45891\tObama\t45891\t0.022977457000000003\t45891.0\n17180\t-84.774608\t40.800558\tWren village\tOH\tOhio\tVan Wert County\t198\t39.2\t9.3\t17.7\t20005\t86667\t0.2906\t45899\tObama\t45899\t0.000444551\t45899.0\n17181\t-84.582259\t40.993476\tScott village\tOH\tOhio\tVan Wert County\t311\t40.0\t15.6\t10.3\t21723\t104000\t0.2906\t45886\tObama\t45886\t0.00069826\t45886.0\n17182\t-84.446249\t40.855582\tMiddle Point village\tOH\tOhio\tVan Wert County\t581\t39.3\t6.8\t15.3\t20475\t71250\t0.2906\t45863\tObama\t45863\t0.001304466\t45863.0\n17183\t-84.615679\t40.770255999999996\tOhio City village\tOH\tOhio\tVan Wert County\t819\t35.5\t8.9\t21.3\t17946\t63625\t0.2906\t45874\tObama\t45874\t0.001838825\t45874.0\n17184\t-84.70557600000001\t40.918176\tConvoy village\tOH\tOhio\tVan Wert County\t1083\t39.0\t14.9\t12.6\t22169\t92841\t0.2906\t45832\tObama\t45832\t0.00243156\t45832.0\n17185\t-84.455917\t40.785198\tVenedocia village\tOH\tOhio\tVan Wert County\t160\t41.5\t7.9\t9.1\t22303\t106250\t0.2906\t45894\tObama\t45894\t0.00035923300000000003\t45894.0\n17186\t-82.524338\t39.159075\tHamden village\tOH\tOhio\tVinton County\t952\t39.2\t8.3\t14.2\t15950\t73971\t0.4456\t45634\tObama\t45634\t0.0021374379999999998\t45634.0\n17187\t-82.47867099999999\t39.246589\tMcArthur village\tOH\tOhio\tVinton County\t1920\t35.0\t10.2\t14.1\t16648\t79524\t0.4456\t45651\tObama\t45651\t0.004310799000000001\t45651.0\n17188\t-82.327184\t39.076448\tWilkesville village\tOH\tOhio\tVinton County\t147\t41.8\t6.7\t14.3\t19646\t74000\t0.4456\t45695\tObama\t45695\t0.00033004599999999996\t45695.0\n17189\t-82.39529399999999\t39.280640999999996\tZaleski village\tOH\tOhio\tVinton County\t395\t39.4\t12.0\t17.7\t18907\t80000\t0.4456\t45698\tObama\t45698\t0.000886857\t45698.0\n17190\t-84.110802\t39.279734999999995\tPleasant Plain village\tOH\tOhio\tWarren County\t178\t38.8\t15.8\t7.9\t23130\t132500\t0.2965\t45162\tObama\t45162\t0.000399647\t45162.0\n17191\t-84.315534\t39.592898\tCarlisle village\tOH\tOhio\tWarren County\t5764\t38.2\t8.7\t10.0\t24448\t149924\t0.2965\t45005\tObama\t45005\t0.012941378\t45005.0\n17192\t-84.19566400000001\t39.561619\tFive Points CDP\tOH\tOhio\tWarren County\t2754\t35.2\t57.1\t9.1\t45796\t311796\t0.2965\t45066\tObama\t45066\t0.006183303\t45066.0\n17193\t-84.126942\t39.348209999999995\tMorrow village\tOH\tOhio\tWarren County\t1428\t41.5\t17.1\t32.0\t24529\t141295\t0.2965\t45152\tObama\t45152\t0.0032061570000000003\t45152.0\n17194\t-84.000615\t39.500527000000005\tHarveysburg village\tOH\tOhio\tWarren County\t679\t39.1\t20.9\t10.7\t25699\t184375\t0.2965\t45032\tObama\t45032\t0.001524496\t45032.0\n17195\t-84.23517199999999\t39.591263\tSpringboro city\tOH\tOhio\tWarren County\t17302\t36.5\t43.7\t8.8\t39060\t239825\t0.2965\t45066\tObama\t45066\t0.038846587\t45066.0\n17196\t-84.282089\t39.30825\tLanden CDP\tOH\tOhio\tWarren County\t16766\t35.4\t51.9\t6.6\t39657\t209181\t0.2965\t45039\tObama\t45039\t0.037643155\t45039.0\n17197\t-84.091341\t39.532444\tWaynesville village\tOH\tOhio\tWarren County\t3164\t42.5\t24.8\t8.9\t29418\t174931\t0.2965\t45068\tObama\t45068\t0.007103838\t45068.0\n17198\t-84.262204\t39.303465\tLoveland Park CDP\tOH\tOhio\tWarren County\t2046\t36.9\t23.9\t18.5\t26424\t159923\t0.2965\t45039\tObama\t45039\t0.004593695\t45039.0\n17199\t-84.292037\t39.493906\tHunter CDP\tOH\tOhio\tWarren County\t2049\t45.1\t16.1\t12.3\t29826\t160297\t0.2965\t45005\tObama\t45005\t0.0046004309999999994\t45005.0\n17200\t-84.090349\t39.301924\tButlerville village\tOH\tOhio\tWarren County\t248\t44.4\t16.0\t10.1\t28006\t180000\t0.2965\t45162\tObama\t45162\t0.000556812\t45162.0\n17201\t-84.222092\t39.315424\tMaineville village\tOH\tOhio\tWarren County\t1236\t37.7\t33.3\t5.9\t34642\t194216\t0.2965\t45039\tObama\t45039\t0.002775077\t45039.0\n17202\t-84.305194\t39.355866\tMason city\tOH\tOhio\tWarren County\t30627\t34.4\t44.0\t10.2\t38491\t212870\t0.2965\t45040\tObama\t45040\t0.068763982\t45040.0\n17203\t-84.21815600000001\t39.371611\tSouth Lebanon village\tOH\tOhio\tWarren County\t2978\t36.1\t4.0\t12.3\t19230\t69907\t0.2965\t45065\tObama\t45065\t0.006686229\t45065.0\n17204\t-84.06920600000001\t39.525647\tCorwin village\tOH\tOhio\tWarren County\t494\t38.2\t14.0\t10.7\t31536\t140909\t0.2965\t45068\tObama\t45068\t0.001109133\t45068.0\n17205\t-84.29575\t39.553964\tFranklin city\tOH\tOhio\tWarren County\t13032\t36.3\t11.2\t15.1\t24445\t131588\t0.2965\t45005\tObama\t45005\t0.029259549\t45005.0\n17206\t-84.21486999999999\t39.423623\tLebanon city\tOH\tOhio\tWarren County\t22708\t33.4\t30.3\t11.6\t28352\t191786\t0.2965\t45036\tObama\t45036\t0.050984180999999996\t45036.0\n17207\t-81.446921\t39.424194\tMarietta city\tOH\tOhio\tWashington County\t14092\t40.0\t27.9\t10.0\t21987\t90355\t0.395\t45750\tObama\t45750\t0.03163947\t45750.0\n17208\t-81.068669\t39.52023\tMatamoras village\tOH\tOhio\tWashington County\t906\t41.9\t7.7\t9.5\t18681\t66714\t0.395\t45767\tObama\t45767\t0.002034158\t45767.0\n17209\t-81.456251\t39.631724\tMacksburg village\tOH\tOhio\tWashington County\t191\t43.2\t4.5\t14.9\t15837\t48333\t0.395\t45746\tObama\t45746\t0.000428835\t45746.0\n17210\t-81.507279\t39.529222999999995\tLowell village\tOH\tOhio\tWashington County\t609\t42.8\t9.0\t6.1\t19162\t68571\t0.395\t45744\tObama\t45744\t0.0013673320000000002\t45744.0\n17211\t-81.393846\t39.563486\tLower Salem village\tOH\tOhio\tWashington County\t104\t39.6\t11.3\t8.6\t19145\t95000\t0.395\t45788\tObama\t45788\t0.00023350200000000002\t45788.0\n17212\t-81.468032\t39.473844\tDevola CDP\tOH\tOhio\tWashington County\t2841\t49.6\t33.1\t9.0\t28852\t130366\t0.395\t45750\tObama\t45750\t0.006378636\t45750.0\n17213\t-81.636177\t39.550073\tBeverly village\tOH\tOhio\tWashington County\t1211\t46.8\t18.4\t11.1\t21851\t87105\t0.395\t45786\tObama\t45786\t0.002718947\t45786.0\n17214\t-81.59687199999999\t39.281414\tBelpre city\tOH\tOhio\tWashington County\t6322\t42.9\t16.3\t7.7\t22564\t91831\t0.395\t45714\tObama\t45714\t0.014194203999999998\t45714.0\n17215\t-82.107621\t40.969645\tWest Salem village\tOH\tOhio\tWayne County\t1573\t37.3\t6.3\t12.4\t22098\t103792\t0.3879\t44287\tObama\t44287\t0.0035317120000000002\t44287.0\n17216\t-82.055138\t40.925692\tCongress village\tOH\tOhio\tWayne County\t211\t40.4\t15.3\t11.1\t18766\t128750\t0.3879\t44214\tObama\t44214\t0.00047373900000000004\t44214.0\n17217\t-81.83295\t40.748719\tApple Creek village\tOH\tOhio\tWayne County\t1066\t36.2\t12.9\t6.8\t19884\t117544\t0.3879\t44606\tObama\t44606\t0.0023933920000000003\t44606.0\n17218\t-81.860219\t40.862378\tSmithville village\tOH\tOhio\tWayne County\t1427\t37.4\t21.6\t11.5\t23778\t131563\t0.3879\t44677\tObama\t44677\t0.003203912\t44677.0\n17219\t-81.701295\t40.799821\tDalton village\tOH\tOhio\tWayne County\t1747\t38.0\t18.1\t8.0\t23369\t110459\t0.3879\t44618\tObama\t44618\t0.003922378\t44618.0\n17220\t-81.869385\t40.677052\tFredericksburg village\tOH\tOhio\tWayne County\t547\t24.8\t7.7\t6.6\t12158\t123295\t0.3879\t44627\tObama\t44627\t0.001228129\t44627.0\n17221\t-81.695511\t40.969028\tDoylestown village\tOH\tOhio\tWayne County\t2767\t41.4\t23.5\t11.6\t28459\t148750\t0.3879\t44230\tObama\t44230\t0.00621249\t44230.0\n17222\t-81.732876\t40.899858\tMarshallville village\tOH\tOhio\tWayne County\t972\t40.2\t12.8\t8.2\t19182\t116154\t0.3879\t44645\tObama\t44645\t0.0021823420000000003\t44645.0\n17223\t-81.78142\t40.994695\tRittman city\tOH\tOhio\tWayne County\t6385\t38.5\t12.7\t8.6\t21410\t108421\t0.3879\t44270\tObama\t44270\t0.014335651999999999\t44270.0\n17224\t-81.88530300000001\t40.991232000000004\tCreston village\tOH\tOhio\tWayne County\t2199\t40.5\t9.7\t16.0\t20583\t105882\t0.3879\t44217\tObama\t44217\t0.004937212\t44217.0\n17225\t-81.703161\t40.695395\tMount Eaton village\tOH\tOhio\tWayne County\t267\t25.8\t5.8\t5.8\t14403\t120833\t0.3879\t44659\tObama\t44659\t0.000599471\t44659.0\n17226\t-82.021788\t40.681466\tShreve village\tOH\tOhio\tWayne County\t1713\t36.8\t12.6\t10.9\t20364\t91667\t0.3879\t44676\tObama\t44676\t0.0038460409999999997\t44676.0\n17227\t-81.936113\t40.817446999999994\tWooster city\tOH\tOhio\tWayne County\t25184\t37.3\t33.2\t12.3\t24962\t121598\t0.3879\t44691\tObama\t44691\t0.056543315\t44691.0\n17228\t-81.994629\t40.986599\tBurbank village\tOH\tOhio\tWayne County\t300\t40.3\t16.6\t12.3\t22480\t142188\t0.3879\t44214\tObama\t44214\t0.0006735619999999999\t44214.0\n17229\t-81.773178\t40.848995\tOrrville city\tOH\tOhio\tWayne County\t8509\t37.0\t19.3\t11.9\t23187\t118972\t0.3879\t44667\tObama\t44667\t0.019104474\t44667.0\n17230\t-84.75037900000001\t41.449894\tEdgerton village\tOH\tOhio\tWilliams County\t2000\t38.9\t12.8\t11.1\t20136\t92667\t0.4104\t43517\tObama\t43517\t0.004490416\t43517.0\n17231\t-84.730991\t41.524262\tBlakeslee village\tOH\tOhio\tWilliams County\t134\t39.0\t8.0\t16.0\t21864\t116250\t0.4104\t43518\tObama\t43518\t0.000300858\t43518.0\n17232\t-84.551238\t41.677533000000004\tPioneer village\tOH\tOhio\tWilliams County\t1417\t39.2\t11.4\t13.0\t19932\t99265\t0.4104\t43554\tObama\t43554\t0.00318146\t43554.0\n17233\t-84.43401999999999\t41.585731\tWest Unity village\tOH\tOhio\tWilliams County\t1841\t34.6\t10.6\t17.3\t20640\t92250\t0.4104\t43570\tObama\t43570\t0.004133428\t43570.0\n17234\t-84.434506\t41.664691\tAlvordton village\tOH\tOhio\tWilliams County\t296\t41.9\t4.3\t15.6\t17742\t80000\t0.4104\t43501\tObama\t43501\t0.0006645819999999999\t43501.0\n17235\t-84.418459\t41.502835\tStryker village\tOH\tOhio\tWilliams County\t1326\t34.7\t11.3\t12.6\t21727\t83828\t0.4104\t43557\tObama\t43557\t0.002977146\t43557.0\n17236\t-84.548221\t41.609087\tHoliday City village\tOH\tOhio\tWilliams County\t48\t45.6\t18.2\t13.3\t23090\t125000\t0.4104\t43554\tObama\t43554\t0.00010777\t43554.0\n17237\t-84.55091999999999\t41.469609000000005\tBryan city\tOH\tOhio\tWilliams County\t8225\t39.2\t17.2\t18.4\t25075\t99236\t0.4104\t43506\tObama\t43506\t0.018466835\t43506.0\n17238\t-84.598475\t41.581167\tMontpelier village\tOH\tOhio\tWilliams County\t4165\t34.5\t8.8\t14.6\t21055\t82597\t0.4104\t43543\tObama\t43543\t0.009351291\t43543.0\n17239\t-84.768774\t41.556026\tEdon village\tOH\tOhio\tWilliams County\t857\t40.5\t11.2\t11.8\t20900\t84865\t0.4104\t43518\tObama\t43518\t0.001924143\t43518.0\n17240\t-83.48928199999999\t41.584146999999994\tWalbridge village\tOH\tOhio\tWood County\t2415\t44.5\t8.3\t12.6\t25810\t85083\t0.5129\t43465\tObama\t43465\t0.005422176999999999\t43465.0\n17241\t-83.60711500000001\t41.17116\tBairdstown village\tOH\tOhio\tWood County\t132\t38.6\t15.1\t15.9\t19494\t78750\t0.5129\t45889\tObama\t45889\t0.000296367\t45889.0\n17242\t-83.483873\t41.609032\tNorthwood city\tOH\tOhio\tWood County\t5376\t38.6\t15.4\t10.7\t26129\t104234\t0.5129\t43619\tObama\t43619\t0.012070238\t43619.0\n17243\t-83.56868\t41.602493\tRossford city\tOH\tOhio\tWood County\t6277\t40.0\t27.5\t11.7\t28730\t121964\t0.5129\t43460\tObama\t43460\t0.01409317\t43460.0\n17244\t-83.49091\t41.242628\tWest Millgrove village\tOH\tOhio\tWood County\t86\t40.4\t12.3\t15.2\t21887\t96667\t0.5129\t43467\tObama\t43467\t0.000193088\t43467.0\n17245\t-83.865113\t41.410899\tGrand Rapids village\tOH\tOhio\tWood County\t963\t38.9\t20.2\t13.3\t23316\t90625\t0.5129\t43522\tObama\t43522\t0.002162135\t43522.0\n17246\t-83.794928\t41.346449\tWeston village\tOH\tOhio\tWood County\t1587\t36.1\t8.0\t13.8\t22317\t68222\t0.5129\t43569\tObama\t43569\t0.003563145\t43569.0\n17247\t-83.646812\t41.323236\tPortage village\tOH\tOhio\tWood County\t464\t38.9\t22.9\t11.1\t23581\t118056\t0.5129\t43451\tObama\t43451\t0.0010417760000000001\t43451.0\n17248\t-83.602092\t41.253762\tJerry City village\tOH\tOhio\tWood County\t470\t40.7\t9.6\t12.7\t21062\t87778\t0.5129\t43437\tObama\t43437\t0.001055248\t43437.0\n17249\t-83.426893\t41.267128\tRisingsun village\tOH\tOhio\tWood County\t635\t35.9\t4.1\t13.8\t23915\t70000\t0.5129\t43457\tObama\t43457\t0.001425707\t43457.0\n17250\t-83.42577299999999\t41.564938\tMillbury village\tOH\tOhio\tWood County\t1275\t41.6\t15.2\t10.8\t26714\t123676\t0.5129\t43447\tObama\t43447\t0.00286264\t43447.0\n17251\t-83.740133\t41.420028\tTontogany village\tOH\tOhio\tWood County\t388\t42.6\t32.1\t7.4\t26135\t148077\t0.5129\t43565\tObama\t43565\t0.0008711410000000001\t43565.0\n17252\t-83.67133199999999\t41.180175\tNorth Baltimore village\tOH\tOhio\tWood County\t3349\t35.2\t14.1\t11.1\t23221\t73190\t0.5129\t45872\tObama\t45872\t0.007519201\t45872.0\n17253\t-83.43618000000001\t41.323693\tBradner village\tOH\tOhio\tWood County\t1236\t35.5\t8.5\t10.6\t20599\t72955\t0.5129\t43406\tObama\t43406\t0.002775077\t43406.0\n17254\t-83.637734\t41.541315000000004\tPerrysburg city\tOH\tOhio\tWood County\t18025\t40.6\t50.9\t9.9\t35373\t168020\t0.5129\t43551\tObama\t43551\t0.040469872000000004\t43551.0\n17255\t-83.643516\t41.241092\tCygnet village\tOH\tOhio\tWood County\t590\t39.7\t8.8\t12.8\t20296\t77292\t0.5129\t43413\tObama\t43413\t0.001324673\t43413.0\n17256\t-83.458417\t41.409407\tPemberville village\tOH\tOhio\tWood County\t1443\t40.9\t26.2\t10.8\t27304\t123760\t0.5129\t43450\tObama\t43450\t0.003239835\t43450.0\n17257\t-83.84371999999999\t41.284589000000004\tCustar village\tOH\tOhio\tWood County\t203\t42.0\t11.1\t15.4\t21442\t89000\t0.5129\t43541\tObama\t43541\t0.000455777\t43541.0\n17258\t-83.703709\t41.463786\tHaskins village\tOH\tOhio\tWood County\t862\t40.1\t30.7\t9.7\t28996\t135000\t0.5129\t43525\tObama\t43525\t0.001935369\t43525.0\n17259\t-83.784406\t41.190011\tHoytville village\tOH\tOhio\tWood County\t303\t39.2\t16.6\t13.7\t21218\t95000\t0.5129\t43529\tObama\t43529\t0.0006802980000000001\t43529.0\n17260\t-83.483807\t41.452574\tLuckey village\tOH\tOhio\tWood County\t1082\t42.7\t20.3\t12.4\t25541\t117647\t0.5129\t43443\tObama\t43443\t0.002429315\t43443.0\n17261\t-83.64990300000001\t41.376127000000004\tBowling Green city\tOH\tOhio\tWood County\t30996\t23.9\t49.9\t14.2\t21662\t130074\t0.5129\t43402\tObama\t43402\t0.069592464\t43402.0\n17262\t-83.471681\t41.300946\tWayne village\tOH\tOhio\tWood County\t876\t40.6\t11.3\t12.5\t21046\t73036\t0.5129\t43466\tObama\t43466\t0.001966802\t43466.0\n17263\t-83.82965899999999\t41.300746999999994\tMilton Center village\tOH\tOhio\tWood County\t190\t41.8\t11.8\t15.5\t21467\t89000\t0.5129\t43541\tObama\t43541\t0.000426589\t43541.0\n17264\t-83.553457\t41.171628999999996\tBloomdale village\tOH\tOhio\tWood County\t734\t37.8\t15.2\t16.1\t19526\t79545\t0.5129\t44817\tObama\t44817\t0.0016479829999999998\t44817.0\n17265\t-83.46485600000001\t40.861301\tWharton village\tOH\tOhio\tWyandot County\t435\t38.2\t6.6\t10.1\t20487\t102574\t0.3913\t43359\tObama\t43359\t0.000976665\t43359.0\n17266\t-83.271476\t40.831773\tUpper Sandusky city\tOH\tOhio\tWyandot County\t6292\t40.8\t15.7\t12.2\t23419\t98253\t0.3913\t43351\tObama\t43351\t0.014126848000000001\t43351.0\n17267\t-83.392336\t40.70104\tMarseilles village\tOH\tOhio\tWyandot County\t118\t40.8\t8.4\t12.7\t21939\t96250\t0.3913\t43332\tObama\t43332\t0.000264935\t43332.0\n17268\t-83.25029\t40.738356\tHarpster village\tOH\tOhio\tWyandot County\t206\t43.8\t15.8\t8.2\t22243\t96000\t0.3913\t43323\tObama\t43323\t0.000462513\t43323.0\n17269\t-83.384023\t40.950109999999995\tCarey village\tOH\tOhio\tWyandot County\t3771\t36.2\t11.5\t19.5\t20353\t93136\t0.3913\t43316\tObama\t43316\t0.008466679\t43316.0\n17270\t-83.17112\t40.951264\tSycamore village\tOH\tOhio\tWyandot County\t949\t37.4\t14.4\t15.6\t21249\t82500\t0.3913\t44882\tObama\t44882\t0.002130702\t44882.0\n17271\t-83.419412\t40.813471\tKirby village\tOH\tOhio\tWyandot County\t126\t41.0\t8.0\t13.4\t21865\t95000\t0.3913\t43359\tObama\t43359\t0.000282896\t43359.0\n17272\t-83.131214\t40.818831\tNevada village\tOH\tOhio\tWyandot County\t870\t39.1\t8.3\t13.7\t20932\t78542\t0.3913\t44849\tObama\t44849\t0.001953331\t44849.0\n17273\t-94.57535899999999\t35.760949\tSalem CDP\tOK\tOklahoma\tAdair County\t93\t34.6\t10.2\t11.1\t13089\t73000\t0.3268\t74960\tRomney\t74960\t0.00022719\t74960.0\n17274\t-94.526852\t35.739633000000005\tBell CDP\tOK\tOklahoma\tAdair County\t627\t34.0\t10.6\t11.4\t13118\t70000\t0.3268\t74960\tRomney\t74960\t0.001531702\t74960.0\n17275\t-94.647959\t35.912937\tWest Peavine CDP\tOK\tOklahoma\tAdair County\t235\t37.2\t15.7\t10.2\t13755\t70833\t0.3268\t74960\tRomney\t74960\t0.0005740830000000001\t74960.0\n17276\t-94.71759899999999\t35.681946\tGreasy CDP\tOK\tOklahoma\tAdair County\t394\t36.7\t15.5\t10.4\t14561\t75417\t0.3268\t74931\tRomney\t74931\t0.000962505\t74931.0\n17277\t-94.562914\t36.053343\tWatts Community CDP\tOK\tOklahoma\tAdair County\t595\t36.8\t9.6\t7.0\t15004\t78846\t0.3268\t74965\tRomney\t74965\t0.0014535289999999998\t74965.0\n17278\t-94.777851\t35.793624\tRocky Mountain CDP\tOK\tOklahoma\tAdair County\t453\t37.3\t17.0\t8.9\t15913\t77778\t0.3268\t74931\tRomney\t74931\t0.001106637\t74931.0\n17279\t-94.693297\t35.779301000000004\tLyons Switch CDP\tOK\tOklahoma\tAdair County\t231\t37.1\t15.1\t10.3\t14569\t74375\t0.3268\t74960\tRomney\t74960\t0.000564311\t74960.0\n17280\t-94.651351\t35.743177\tCherry Tree CDP\tOK\tOklahoma\tAdair County\t1224\t32.3\t8.1\t14.3\t12167\t65152\t0.3268\t74960\tRomney\t74960\t0.002990118\t74960.0\n17281\t-94.738493\t36.090458\tChewey CDP\tOK\tOklahoma\tAdair County\t130\t34.6\t11.4\t6.8\t16893\t80000\t0.3268\t74457\tRomney\t74457\t0.000317578\t74457.0\n17282\t-94.60632199999999\t35.890181\tPeavine CDP\tOK\tOklahoma\tAdair County\t369\t35.6\t15.1\t8.2\t14954\t74167\t0.3268\t74960\tRomney\t74960\t0.000901433\t74960.0\n17283\t-94.574212\t35.990235999999996\tWestville town\tOK\tOklahoma\tAdair County\t2091\t34.0\t12.0\t8.5\t15539\t72561\t0.3268\t74965\tRomney\t74965\t0.005108118\t74965.0\n17284\t-94.630955\t35.814953\tStilwell city\tOK\tOklahoma\tAdair County\t3363\t33.2\t11.8\t15.3\t13058\t84500\t0.3268\t74960\tRomney\t74960\t0.008215495\t74960.0\n17285\t-94.652612\t35.847809000000005\tMaryetta CDP\tOK\tOklahoma\tAdair County\t144\t33.9\t14.8\t14.3\t13855\t71667\t0.3268\t74960\tRomney\t74960\t0.00035177900000000003\t74960.0\n17286\t-94.571853\t36.107296999999996\tWatts town\tOK\tOklahoma\tAdair County\t329\t36.0\t6.2\t7.4\t13507\t71429\t0.3268\t74964\tRomney\t74964\t0.0008037160000000001\t74964.0\n17287\t-94.610337\t35.854375\tFairfield CDP\tOK\tOklahoma\tAdair County\t379\t35.5\t15.1\t8.1\t14925\t74000\t0.3268\t74960\tRomney\t74960\t0.000925862\t74960.0\n17288\t-94.63772\t35.785185999999996\tZion CDP\tOK\tOklahoma\tAdair County\t50\t44.4\t8.8\t22.7\t11299\t80000\t0.3268\t74960\tRomney\t74960\t0.000122145\t74960.0\n17289\t-94.65483499999999\t35.96735\tChristie CDP\tOK\tOklahoma\tAdair County\t177\t37.0\t11.3\t8.3\t16470\t70000\t0.3268\t74965\tRomney\t74965\t0.000432394\t74965.0\n17290\t-98.423428\t36.900138\tBurlington town\tOK\tOklahoma\tAlfalfa County\t137\t48.0\t27.2\t1.4\t21841\t49000\t0.1546\t73722\tRomney\t73722\t0.00033467800000000004\t73722.0\n17291\t-98.2937\t36.923984000000004\tAmorita town\tOK\tOklahoma\tAlfalfa County\t39\t49.2\t26.7\t0.0\t21631\t47500\t0.1546\t73719\tRomney\t73719\t9.53e-05\t73719.0\n17292\t-98.355118\t36.754686\tCherokee city\tOK\tOklahoma\tAlfalfa County\t1589\t45.7\t21.5\t4.6\t19596\t51795\t0.1546\t73728\tRomney\t73728\t0.003881779\t73728.0\n17293\t-98.18134\t36.666311\tJet town\tOK\tOklahoma\tAlfalfa County\t227\t48.3\t16.9\t8.6\t19643\t38889\t0.1546\t73749\tRomney\t73749\t0.00055454\t73749.0\n17294\t-98.294567\t36.901513\tByron town\tOK\tOklahoma\tAlfalfa County\t40\t49.2\t25.8\t0.0\t21584\t80000\t0.1546\t73719\tRomney\t73719\t9.77e-05\t73719.0\n17295\t-98.423744\t36.683203999999996\tLambert town\tOK\tOklahoma\tAlfalfa County\t9\t0.0\t20.0\t0.0\t18914\t0\t0.1546\t73728\tRomney\t73728\t2.2e-05\t73728.0\n17296\t-98.15128399999999\t36.531845000000004\tGoltry town\tOK\tOklahoma\tAlfalfa County\t238\t45.8\t17.3\t3.5\t18163\t40714\t0.1546\t73739\tRomney\t73739\t0.000581412\t73739.0\n17297\t-98.27150400000001\t36.546576\tHelena town\tOK\tOklahoma\tAlfalfa County\t1418\t39.7\t9.6\t3.1\t15241\t50000\t0.1546\t73741\tRomney\t73741\t0.003464042\t73741.0\n17298\t-98.45778100000001\t36.579095\tCarmen town\tOK\tOklahoma\tAlfalfa County\t364\t46.0\t17.5\t3.5\t18212\t40909\t0.1546\t73726\tRomney\t73726\t0.000889218\t73726.0\n17299\t-98.448588\t36.509578000000005\tAline town\tOK\tOklahoma\tAlfalfa County\t190\t46.2\t17.4\t3.3\t18168\t39375\t0.1546\t73716\tRomney\t73716\t0.00046415199999999996\t73716.0\n17300\t-96.216876\t34.235645\tCaney town\tOK\tOklahoma\tAtoka County\t220\t40.3\t14.7\t9.1\t15909\t69167\t0.26\t74533\tRomney\t74533\t0.000537439\t74533.0\n17301\t-96.05396800000001\t34.467582\tStringtown town\tOK\tOklahoma\tAtoka County\t423\t42.0\t9.6\t12.8\t14958\t63889\t0.26\t74569\tRomney\t74569\t0.00103335\t74569.0\n17302\t-96.12449000000001\t34.39208\tAtoka city\tOK\tOklahoma\tAtoka County\t3088\t41.8\t15.7\t12.5\t16396\t73293\t0.26\t74525\tRomney\t74525\t0.007543696\t74525.0\n17303\t-96.167615\t34.317858\tTushka town\tOK\tOklahoma\tAtoka County\t381\t38.7\t13.8\t7.7\t16004\t97000\t0.26\t74525\tRomney\t74525\t0.000930747\t74525.0\n17304\t-100.523544\t36.815090000000005\tBeaver city\tOK\tOklahoma\tBeaver County\t1532\t42.2\t20.2\t3.6\t21174\t77931\t0.1058\t73932\tRomney\t73932\t0.0037425329999999997\t73932.0\n17305\t-100.055195\t36.851706\tGate town\tOK\tOklahoma\tBeaver County\t107\t38.3\t13.4\t1.8\t19435\t55000\t0.1058\t73844\tRomney\t73844\t0.000261391\t73844.0\n17306\t-100.53792\t36.90681\tForgan town\tOK\tOklahoma\tBeaver County\t506\t38.8\t14.1\t2.6\t19515\t55000\t0.1058\t73938\tRomney\t73938\t0.001236111\t73938.0\n17307\t-100.193023\t36.87307\tKnowles town\tOK\tOklahoma\tBeaver County\t30\t38.8\t15.0\t0.0\t19768\t45000\t0.1058\t73847\tRomney\t73847\t7.329999999999999e-05\t73847.0\n17308\t-99.50370500000001\t35.217639\tCarter town\tOK\tOklahoma\tBeckham County\t276\t41.2\t17.6\t5.6\t17616\t52000\t0.2046\t73627\tRomney\t73627\t0.0006742419999999999\t73627.0\n17309\t-99.417763\t35.398852000000005\tElk City\tOK\tOklahoma\tBeckham County\t11238\t37.1\t21.4\t7.3\t19590\t95538\t0.2046\t73644\tRomney\t73644\t0.027453385\t73644.0\n17310\t-99.99278699999999\t35.222254\tTexola town\tOK\tOklahoma\tBeckham County\t52\t46.3\t16.7\t6.5\t19919\t65000\t0.2046\t73668\tRomney\t73668\t0.000127031\t73668.0\n17311\t-99.63455\t35.296778\tSayre city\tOK\tOklahoma\tBeckham County\t2999\t42.3\t11.6\t8.2\t15940\t57895\t0.2046\t73662\tRomney\t73662\t0.007326277\t73662.0\n17312\t-99.868548\t35.215783\tErick city\tOK\tOklahoma\tBeckham County\t1142\t40.8\t10.3\t9.2\t14525\t38182\t0.2046\t73645\tRomney\t73645\t0.0027897990000000004\t73645.0\n17313\t-98.34960699999999\t35.967597999999995\tHitchcock town\tOK\tOklahoma\tBlaine County\t133\t43.9\t20.4\t7.9\t19594\t70000\t0.26\t73744\tRomney\t73744\t0.000324907\t73744.0\n17314\t-98.310731\t35.629401\tGeary city\tOK\tOklahoma\tBlaine County\t1221\t40.3\t14.9\t8.2\t15501\t50600\t0.26\t73040\tRomney\t73040\t0.0029827890000000004\t73040.0\n17315\t-98.588329\t36.055\tCanton town\tOK\tOklahoma\tBlaine County\t585\t42.4\t19.2\t7.2\t15547\t44630\t0.26\t73724\tRomney\t73724\t0.0014290999999999998\t73724.0\n17316\t-98.377486\t35.72907\tGreenfield town\tOK\tOklahoma\tBlaine County\t115\t45.0\t10.0\t4.0\t18393\t55000\t0.26\t73043\tRomney\t73043\t0.000280934\t73043.0\n17317\t-98.316561\t36.11704\tOkeene town\tOK\tOklahoma\tBlaine County\t1146\t43.8\t20.7\t2.8\t18052\t57903\t0.26\t73763\tRomney\t73763\t0.002799571\t73763.0\n17318\t-98.551224\t36.133783\tLongdale town\tOK\tOklahoma\tBlaine County\t294\t41.8\t11.6\t7.3\t14871\t38750\t0.26\t73755\tRomney\t73755\t0.000718215\t73755.0\n17319\t-98.412485\t35.854196\tWatonga city\tOK\tOklahoma\tBlaine County\t5704\t34.4\t14.5\t10.2\t15693\t66145\t0.26\t73772\tRomney\t73772\t0.01393434\t73772.0\n17320\t-96.390025\t33.834678000000004\tAchille town\tOK\tOklahoma\tBryan County\t562\t33.9\t9.8\t10.1\t12986\t76111\t0.2788\t74720\tRomney\t74720\t0.001372914\t74720.0\n17321\t-96.037578\t34.003745\tBennington town\tOK\tOklahoma\tBryan County\t319\t41.6\t13.3\t5.4\t14463\t78750\t0.2788\t74723\tRomney\t74723\t0.0007792869999999999\t74723.0\n17322\t-96.504406\t33.857064\tColbert town\tOK\tOklahoma\tBryan County\t1193\t41.7\t8.6\t6.7\t17206\t63333\t0.2788\t74733\tRomney\t74733\t0.002914388\t74733.0\n17323\t-96.141354\t34.017689000000004\tBokchito town\tOK\tOklahoma\tBryan County\t615\t41.0\t8.3\t6.6\t12444\t56364\t0.2788\t74726\tRomney\t74726\t0.001502388\t74726.0\n17324\t-96.51096899999999\t34.000775\tMead town\tOK\tOklahoma\tBryan County\t122\t42.8\t22.1\t6.7\t16681\t95000\t0.2788\t73449\tRomney\t73449\t0.000298035\t73449.0\n17325\t-96.474233\t34.035537\tSilo town\tOK\tOklahoma\tBryan County\t281\t42.9\t22.2\t7.2\t16699\t91429\t0.2788\t73449\tRomney\t73449\t0.000686457\t73449.0\n17326\t-96.407002\t33.775259000000005\tHendrix town\tOK\tOklahoma\tBryan County\t86\t42.1\t10.2\t2.5\t15216\t51667\t0.2788\t74747\tRomney\t74747\t0.00021009\t74747.0\n17327\t-96.269915\t34.130126000000004\tCaddo town\tOK\tOklahoma\tBryan County\t1029\t42.6\t19.5\t4.0\t17196\t64400\t0.2788\t74729\tRomney\t74729\t0.0025137510000000003\t74729.0\n17328\t-96.42894799999999\t33.939278\tCalera town\tOK\tOklahoma\tBryan County\t1911\t38.7\t15.1\t5.6\t14763\t77333\t0.2788\t74730\tRomney\t74730\t0.004668395\t74730.0\n17329\t-96.354427\t33.769463\tKemp town\tOK\tOklahoma\tBryan County\t157\t42.1\t11.0\t4.1\t15198\t55714\t0.2788\t74747\tRomney\t74747\t0.00038353599999999997\t74747.0\n17330\t-96.34470999999999\t34.053001\tArmstrong town\tOK\tOklahoma\tBryan County\t160\t37.0\t21.3\t7.9\t19521\t81667\t0.2788\t74701\tRomney\t74701\t0.000390865\t74701.0\n17331\t-96.393186\t33.988621\tDurant city\tOK\tOklahoma\tBryan County\t14841\t33.1\t26.2\t7.0\t17864\t98938\t0.2788\t74701\tRomney\t74701\t0.036255178\t74701.0\n17332\t-96.364147\t34.15011\tKenefic town\tOK\tOklahoma\tBryan County\t218\t36.5\t21.8\t8.2\t19501\t82500\t0.2788\t74729\tRomney\t74729\t0.000532554\t74729.0\n17333\t-98.343738\t35.310488\tBinger town\tOK\tOklahoma\tCaddo County\t666\t40.9\t9.6\t8.5\t16299\t52222\t0.3575\t73009\tRomney\t73009\t0.001626976\t73009.0\n17334\t-98.35866899999999\t35.480165\tHinton town\tOK\tOklahoma\tCaddo County\t2228\t36.6\t15.0\t6.5\t16980\t82037\t0.3575\t73047\tRomney\t73047\t0.005442796\t73047.0\n17335\t-98.377477\t35.547593\tBridgeport city\tOK\tOklahoma\tCaddo County\t105\t40.0\t13.2\t4.9\t15623\t63750\t0.3575\t73040\tRomney\t73040\t0.000256505\t73040.0\n17336\t-98.136093\t34.93627\tCement town\tOK\tOklahoma\tCaddo County\t501\t41.7\t10.5\t6.5\t17152\t41923\t0.3575\t73017\tRomney\t73017\t0.0012238960000000001\t73017.0\n17337\t-98.244265\t35.065027\tAnadarko city\tOK\tOklahoma\tCaddo County\t6626\t31.7\t19.7\t10.0\t14478\t57530\t0.3575\t73005\tRomney\t73005\t0.016186699\t73005.0\n17338\t-98.202893\t34.898571000000004\tCyril town\tOK\tOklahoma\tCaddo County\t1143\t39.0\t15.1\t5.3\t15642\t74048\t0.3575\t73029\tRomney\t73029\t0.002792242\t73029.0\n17339\t-98.556551\t35.30538\tEakly town\tOK\tOklahoma\tCaddo County\t255\t45.3\t23.9\t8.5\t16003\t68125\t0.3575\t73033\tRomney\t73033\t0.000622941\t73033.0\n17340\t-98.363792\t35.362978999999996\tLookeba town\tOK\tOklahoma\tCaddo County\t121\t41.3\t12.3\t5.6\t15302\t58333\t0.3575\t73053\tRomney\t73053\t0.000295592\t73053.0\n17341\t-98.358234\t34.893786999999996\tApache town\tOK\tOklahoma\tCaddo County\t1562\t37.1\t16.2\t8.1\t15306\t70543\t0.3575\t73006\tRomney\t73006\t0.00381582\t73006.0\n17342\t-98.43795899999999\t35.097837\tFort Cobb town\tOK\tOklahoma\tCaddo County\t627\t38.6\t20.0\t5.6\t16028\t53636\t0.3575\t73038\tRomney\t73038\t0.001531702\t73038.0\n17343\t-98.60061999999999\t35.102907\tCarnegie town\tOK\tOklahoma\tCaddo County\t1702\t38.7\t17.9\t10.3\t13852\t50441\t0.3575\t73015\tRomney\t73015\t0.004157827\t73015.0\n17344\t-98.257094\t35.187785\tGracemont town\tOK\tOklahoma\tCaddo County\t318\t40.0\t14.0\t5.2\t15166\t66000\t0.3575\t73042\tRomney\t73042\t0.000776844\t73042.0\n17345\t-98.574492\t35.552912\tHydro town\tOK\tOklahoma\tCaddo County\t1120\t38.3\t19.8\t8.0\t16679\t53788\t0.3575\t73048\tRomney\t73048\t0.002736055\t73048.0\n17346\t-97.75001999999999\t35.735381\tPiedmont city\tOK\tOklahoma\tCanadian County\t5488\t38.1\t28.1\t4.3\t25230\t154911\t0.2283\t73078\tRomney\t73078\t0.013406672\t73078.0\n17347\t-97.966018\t35.543019\tEl Reno city\tOK\tOklahoma\tCanadian County\t16690\t36.5\t14.8\t8.6\t19267\t85025\t0.2283\t73036\tRomney\t73036\t0.040772112\t73036.0\n17348\t-97.72456899999999\t35.391698\tMustang city\tOK\tOklahoma\tCanadian County\t16098\t35.7\t19.8\t5.0\t25913\t123978\t0.2283\t73064\tRomney\t73064\t0.039325911\t73064.0\n17349\t-98.124725\t35.601393\tCalumet town\tOK\tOklahoma\tCanadian County\t614\t37.8\t15.8\t8.6\t17965\t91250\t0.2283\t73014\tRomney\t73014\t0.001499945\t73014.0\n17350\t-97.903461\t35.405623999999996\tUnion City town\tOK\tOklahoma\tCanadian County\t1557\t39.1\t20.1\t4.3\t22108\t99643\t0.2283\t73090\tRomney\t73090\t0.0038036059999999997\t73090.0\n17351\t-97.762139\t35.520656\tYukon city\tOK\tOklahoma\tCanadian County\t23173\t37.6\t23.8\t6.2\t25998\t118100\t0.2283\t73099\tRomney\t73099\t0.056609476\t73099.0\n17352\t-97.51549200000001\t34.44915\tRatliff City town\tOK\tOklahoma\tCarter County\t135\t46.9\t11.5\t6.2\t15051\t51250\t0.2866\t73481\tRomney\t73481\t0.000329792\t73481.0\n17353\t-96.997366\t34.187608000000004\tDickson town\tOK\tOklahoma\tCarter County\t1245\t39.8\t12.1\t5.6\t19596\t103906\t0.2866\t73401\tRomney\t73401\t0.003041419\t73401.0\n17354\t-97.124371\t34.289284\tSpringer town\tOK\tOklahoma\tCarter County\t641\t43.4\t15.1\t4.5\t19294\t82708\t0.2866\t73401\tRomney\t73401\t0.0015659029999999998\t73401.0\n17355\t-97.038534\t34.284046000000004\tGene Autry town\tOK\tOklahoma\tCarter County\t110\t40.4\t11.1\t3.6\t17776\t83750\t0.2866\t73032\tRomney\t73032\t0.00026872\t73032.0\n17356\t-97.48682099999999\t34.233523999999996\tHealdton city\tOK\tOklahoma\tCarter County\t2752\t41.2\t12.5\t6.2\t16088\t50517\t0.2866\t73438\tRomney\t73438\t0.006722879\t73438.0\n17357\t-97.466138\t34.477908\tTatums town\tOK\tOklahoma\tCarter County\t185\t42.3\t8.7\t8.1\t12737\t47500\t0.2866\t73487\tRomney\t73487\t0.00045193800000000004\t73487.0\n17358\t-97.255953\t34.182328999999996\tLone Grove city\tOK\tOklahoma\tCarter County\t5267\t36.3\t16.7\t6.2\t19113\t103531\t0.2866\t73443\tRomney\t73443\t0.012866788999999998\t73443.0\n17359\t-97.119396\t34.190008\tArdmore city\tOK\tOklahoma\tCarter County\t24512\t40.1\t21.5\t7.0\t20175\t93459\t0.2866\t73401\tRomney\t73401\t0.059880527999999995\t73401.0\n17360\t-97.426016\t34.168394\tWilson city\tOK\tOklahoma\tCarter County\t1670\t39.8\t8.8\t6.9\t15335\t47188\t0.2866\t73463\tRomney\t73463\t0.004079654\t73463.0\n17361\t-94.865558\t35.797613\tTenkiller CDP\tOK\tOklahoma\tCherokee County\t516\t36.4\t13.0\t11.5\t14809\t73125\t0.4295\t74471\tRomney\t74471\t0.00126054\t74471.0\n17362\t-95.095271\t35.948796\tShady Grove CDP\tOK\tOklahoma\tCherokee County\t600\t36.5\t15.7\t6.4\t14852\t90500\t0.4295\t74441\tRomney\t74441\t0.001465744\t74441.0\n17363\t-95.122323\t36.000859999999996\tLost City CDP\tOK\tOklahoma\tCherokee County\t965\t38.0\t14.6\t6.0\t15692\t89615\t0.4295\t74441\tRomney\t74441\t0.002357405\t74441.0\n17364\t-94.969157\t35.765653\tPettit CDP\tOK\tOklahoma\tCherokee County\t794\t49.6\t30.2\t6.5\t21751\t100781\t0.4295\t74451\tRomney\t74451\t0.0019396679999999999\t74451.0\n17365\t-94.860188\t36.028749\tScraper CDP\tOK\tOklahoma\tCherokee County\t582\t36.0\t20.7\t5.9\t15550\t98333\t0.4295\t74457\tRomney\t74457\t0.0014217720000000002\t74457.0\n17366\t-94.870194\t35.727477\tDry Creek CDP\tOK\tOklahoma\tCherokee County\t238\t43.4\t14.7\t7.8\t15227\t80000\t0.4295\t74427\tRomney\t74427\t0.000581412\t74427.0\n17367\t-94.845632\t35.8561\tWelling CDP\tOK\tOklahoma\tCherokee County\t634\t36.7\t14.2\t10.8\t14890\t78636\t0.4295\t74471\tRomney\t74471\t0.0015488029999999999\t74471.0\n17368\t-95.043739\t35.806262\tZeb CDP\tOK\tOklahoma\tCherokee County\t547\t30.1\t22.0\t7.7\t17435\t104630\t0.4295\t744XX\tRomney\t744XX\t0.00133627\t0.0\n17369\t-95.08274399999999\t35.824512\tWoodall CDP\tOK\tOklahoma\tCherokee County\t756\t38.4\t16.6\t6.6\t16453\t101042\t0.4295\t744XX\tRomney\t744XX\t0.001846837\t0.0\n17370\t-94.94261800000001\t35.805671000000004\tKeys CDP\tOK\tOklahoma\tCherokee County\t475\t32.7\t25.3\t14.2\t15042\t80556\t0.4295\t74451\tRomney\t74451\t0.001160381\t74451.0\n17371\t-94.97746\t35.911116\tTahlequah city\tOK\tOklahoma\tCherokee County\t15126\t29.2\t36.2\t7.2\t17936\t108775\t0.4295\t74464\tRomney\t74464\t0.036951406\t74464.0\n17372\t-94.900286\t35.921172999999996\tBriggs CDP\tOK\tOklahoma\tCherokee County\t365\t37.7\t20.3\t5.1\t15228\t90000\t0.4295\t74464\tRomney\t74464\t0.0008916610000000001\t74464.0\n17373\t-94.83615400000001\t35.933413\tEldon CDP\tOK\tOklahoma\tCherokee County\t1454\t37.5\t17.0\t5.1\t14920\t91515\t0.4295\t74471\tRomney\t74471\t0.0035519859999999996\t74471.0\n17374\t-94.95587900000001\t35.854577\tPark Hill CDP\tOK\tOklahoma\tCherokee County\t4170\t30.3\t26.1\t8.4\t16268\t96549\t0.4295\t74464\tRomney\t74464\t0.010186921\t74464.0\n17375\t-95.143851\t35.931721\tHulbert town\tOK\tOklahoma\tCherokee County\t596\t33.4\t13.1\t13.3\t14735\t65455\t0.4295\t74441\tRomney\t74441\t0.001455972\t74441.0\n17376\t-95.337973\t34.024493\tFort Towson town\tOK\tOklahoma\tChoctaw County\t573\t44.4\t9.4\t18.7\t14587\t58077\t0.2949\t74756\tRomney\t74756\t0.001399786\t74756.0\n17377\t-95.515992\t34.013063\tHugo city\tOK\tOklahoma\tChoctaw County\t5780\t40.4\t11.5\t9.5\t15189\t57051\t0.2949\t74743\tRomney\t74743\t0.014119999999999999\t74743.0\n17378\t-95.202411\t34.017922\tSwink town\tOK\tOklahoma\tChoctaw County\t74\t43.1\t10.9\t6.1\t15568\t58333\t0.2949\t74761\tRomney\t74761\t0.000180775\t74761.0\n17379\t-95.696609\t34.03216\tSoper town\tOK\tOklahoma\tChoctaw County\t280\t42.2\t16.2\t8.0\t15078\t62778\t0.2949\t74759\tRomney\t74759\t0.0006840139999999999\t74759.0\n17380\t-95.365297\t34.017525\tSawyer town\tOK\tOklahoma\tChoctaw County\t258\t43.2\t10.9\t6.6\t13779\t60714\t0.2949\t74756\tRomney\t74756\t0.00063027\t74756.0\n17381\t-95.86847900000001\t34.028052\tBoswell town\tOK\tOklahoma\tChoctaw County\t652\t40.5\t8.2\t11.1\t12404\t59722\t0.2949\t74727\tRomney\t74727\t0.001592775\t74727.0\n17382\t-102.251889\t36.807665\tKeyes town\tOK\tOklahoma\tCimarron County\t375\t37.2\t16.5\t3.3\t18930\t56875\t0.0961\t73947\tRomney\t73947\t0.00091609\t73947.0\n17383\t-102.510896\t36.730265\tBoise City\tOK\tOklahoma\tCimarron County\t1384\t41.8\t21.6\t3.3\t18411\t53974\t0.0961\t73933\tRomney\t73933\t0.0033809829999999997\t73933.0\n17384\t-97.2883\t35.091064\tSlaughterville town\tOK\tOklahoma\tCleveland County\t4238\t37.8\t11.8\t7.1\t18338\t87824\t0.3703\t73051\tRomney\t73051\t0.010353038\t73051.0\n17385\t-97.34833\t35.233031\tNorman city\tOK\tOklahoma\tCleveland County\t107233\t30.9\t42.5\t7.4\t26143\t140427\t0.3703\t73026\tRomney\t73026\t0.261960209\t73026.0\n17386\t-97.33641\t35.018187\tLexington city\tOK\tOklahoma\tCleveland County\t2428\t35.4\t8.2\t7.4\t19042\t63519\t0.3703\t73051\tRomney\t73051\t0.005931377\t73051.0\n17387\t-97.404475\t35.239813\tHall Park town\tOK\tOklahoma\tCleveland County\t1157\t35.0\t39.2\t4.8\t26401\t138138\t0.3703\t73071\tRomney\t73071\t0.002826443\t73071.0\n17388\t-97.163269\t35.129985\tEtowah town\tOK\tOklahoma\tCleveland County\t144\t32.1\t12.4\t9.5\t15414\t72500\t0.3703\t73026\tRomney\t73026\t0.00035177900000000003\t73026.0\n17389\t-97.373705\t35.138762\tNoble city\tOK\tOklahoma\tCleveland County\t6336\t35.5\t15.1\t5.2\t20100\t83684\t0.3703\t73068\tRomney\t73068\t0.015478256999999999\t73068.0\n17390\t-97.476519\t35.329899\tMoore city\tOK\tOklahoma\tCleveland County\t53205\t34.0\t18.9\t5.9\t23808\t103312\t0.3703\t73160\tRomney\t73160\t0.129974849\t73160.0\n17391\t-96.220824\t34.470789\tLehigh city\tOK\tOklahoma\tCoal County\t308\t43.5\t11.6\t12.0\t14428\t55000\t0.2751\t74556\tRomney\t74556\t0.000752415\t74556.0\n17392\t-96.420624\t34.602426\tTupelo city\tOK\tOklahoma\tCoal County\t351\t38.1\t13.7\t8.1\t14545\t62143\t0.2751\t74572\tRomney\t74572\t0.00085746\t74572.0\n17393\t-96.219261\t34.532546\tCoalgate city\tOK\tOklahoma\tCoal County\t2009\t41.2\t12.0\t9.0\t14125\t53333\t0.2751\t74538\tRomney\t74538\t0.004907799\t74538.0\n17394\t-96.34372900000001\t34.610347999999995\tCentrahoma city\tOK\tOklahoma\tCoal County\t102\t37.1\t14.3\t7.5\t14608\t65000\t0.2751\t74534\tRomney\t74534\t0.000249176\t74534.0\n17395\t-96.223112\t34.504259000000005\tPhillips town\tOK\tOklahoma\tCoal County\t147\t44.0\t11.4\t11.1\t14400\t52500\t0.2751\t74556\tRomney\t74556\t0.00035910699999999995\t74556.0\n17396\t-98.383297\t34.481942\tGeronimo town\tOK\tOklahoma\tComanche County\t1005\t34.3\t10.5\t7.3\t16959\t79271\t0.4148\t73543\tRomney\t73543\t0.002455121\t73543.0\n17397\t-98.239237\t34.822425\tFletcher town\tOK\tOklahoma\tComanche County\t995\t40.6\t18.3\t6.1\t18948\t67727\t0.4148\t73541\tRomney\t73541\t0.002430692\t73541.0\n17398\t-98.17290799999999\t34.749862\tSterling town\tOK\tOklahoma\tComanche County\t699\t39.9\t14.6\t4.3\t18967\t64643\t0.4148\t73567\tRomney\t73567\t0.0017075920000000002\t73567.0\n17399\t-98.291514\t34.782296\tElgin city\tOK\tOklahoma\tComanche County\t1167\t34.2\t22.3\t4.6\t20786\t81667\t0.4148\t73538\tRomney\t73538\t0.002850872\t73538.0\n17400\t-98.417182\t34.620255\tLawton city\tOK\tOklahoma\tComanche County\t92046\t29.5\t22.0\t8.2\t20064\t96355\t0.4148\t73507\tRomney\t73507\t0.224859786\t73507.0\n17401\t-98.579403\t34.460262\tFaxon town\tOK\tOklahoma\tComanche County\t122\t42.5\t14.1\t7.5\t20314\t105556\t0.4148\t73540\tRomney\t73540\t0.000298035\t73540.0\n17402\t-98.65512700000001\t34.424183\tChattanooga town\tOK\tOklahoma\tComanche County\t385\t36.9\t20.5\t2.9\t18290\t73929\t0.4148\t73528\tRomney\t73528\t0.0009405189999999999\t73528.0\n17403\t-98.627595\t34.628589\tCache city\tOK\tOklahoma\tComanche County\t2250\t34.8\t21.6\t7.2\t20040\t108929\t0.4148\t73527\tRomney\t73527\t0.00549654\t73527.0\n17404\t-98.752099\t34.619887\tIndiahoma town\tOK\tOklahoma\tComanche County\t343\t38.9\t17.6\t5.7\t16675\t79167\t0.4148\t73552\tRomney\t73552\t0.000837917\t73552.0\n17405\t-98.49103199999999\t34.730119\tMedicine Park town\tOK\tOklahoma\tComanche County\t348\t44.0\t11.7\t8.6\t19191\t70000\t0.4148\t73557\tRomney\t73557\t0.000850132\t73557.0\n17406\t-98.588145\t34.195434000000006\tDevol town\tOK\tOklahoma\tCotton County\t142\t43.1\t20.8\t4.2\t19756\t78333\t0.2678\t73531\tRomney\t73531\t0.00034689300000000003\t73531.0\n17407\t-98.234859\t34.272863\tTemple town\tOK\tOklahoma\tCotton County\t1074\t41.3\t8.9\t7.4\t17636\t45556\t0.2678\t73568\tRomney\t73568\t0.002623682\t73568.0\n17408\t-98.356448\t34.361197\tWalters city\tOK\tOklahoma\tCotton County\t2612\t39.0\t15.6\t6.3\t17165\t72667\t0.2678\t73572\tRomney\t73572\t0.006380871999999999\t73572.0\n17409\t-98.46391\t34.177365\tRandlett town\tOK\tOklahoma\tCotton County\t492\t38.0\t9.8\t4.5\t14117\t53500\t0.2678\t73562\tRomney\t73562\t0.00120191\t73562.0\n17410\t-95.026733\t36.525683\tKetchum town\tOK\tOklahoma\tCraig County\t288\t44.3\t17.5\t3.4\t18093\t116071\t0.3292\t74349\tRomney\t74349\t0.0007035569999999999\t74349.0\n17411\t-95.074067\t36.800779999999996\tBluejacket town\tOK\tOklahoma\tCraig County\t290\t40.4\t6.5\t5.4\t15942\t81667\t0.3292\t74333\tRomney\t74333\t0.000708443\t74333.0\n17412\t-95.094533\t36.87397\tWelch town\tOK\tOklahoma\tCraig County\t622\t40.8\t10.8\t5.3\t19492\t56429\t0.3292\t74369\tRomney\t74369\t0.0015194879999999998\t74369.0\n17413\t-95.222437\t36.538921\tBig Cabin town\tOK\tOklahoma\tCraig County\t339\t43.5\t14.4\t3.9\t18193\t101667\t0.3292\t74332\tRomney\t74332\t0.000828145\t74332.0\n17414\t-95.15460300000001\t36.643741\tVinita city\tOK\tOklahoma\tCraig County\t5765\t42.2\t13.1\t5.3\t18404\t76272\t0.3292\t74301\tRomney\t74301\t0.014083357\t74301.0\n17415\t-96.59801\t35.989824\tDrumright city\tOK\tOklahoma\tCreek County\t2832\t40.4\t16.0\t14.7\t16870\t58361\t0.273\t74030\tRomney\t74030\t0.006918311999999999\t74030.0\n17416\t-96.26713000000001\t35.778207\tSlick town\tOK\tOklahoma\tCreek County\t157\t37.8\t7.5\t10.7\t18488\t91000\t0.273\t74071\tRomney\t74071\t0.00038353599999999997\t74071.0\n17417\t-96.585527\t36.084994\tOilton city\tOK\tOklahoma\tCreek County\t1098\t37.8\t7.2\t8.7\t16375\t45000\t0.273\t74052\tRomney\t74052\t0.002682312\t74052.0\n17418\t-96.243277\t36.181823\tMannford town\tOK\tOklahoma\tCreek County\t2101\t38.9\t17.8\t8.1\t20464\t101196\t0.273\t74060\tRomney\t74060\t0.005132547\t74060.0\n17419\t-96.059539\t35.872855\tMounds town\tOK\tOklahoma\tCreek County\t1212\t35.9\t11.2\t10.3\t22014\t80233\t0.273\t74047\tRomney\t74047\t0.0029608029999999997\t74047.0\n17420\t-96.059433\t35.949779\tKiefer town\tOK\tOklahoma\tCreek County\t1072\t37.1\t11.0\t6.0\t18676\t90962\t0.273\t74041\tRomney\t74041\t0.002618796\t74041.0\n17421\t-96.394639\t35.832713\tBristow city\tOK\tOklahoma\tCreek County\t4335\t36.3\t14.6\t9.2\t18086\t56598\t0.273\t74010\tRomney\t74010\t0.01059\t74010.0\n17422\t-96.577159\t35.91137\tShamrock town\tOK\tOklahoma\tCreek County\t129\t38.8\t7.1\t7.3\t17276\t70000\t0.273\t74068\tRomney\t74068\t0.000315135\t74068.0\n17423\t-96.426506\t36.084821999999996\tLawrence Creek town\tOK\tOklahoma\tCreek County\t136\t38.4\t8.0\t7.1\t18943\t72000\t0.273\t74044\tRomney\t74044\t0.000332235\t74044.0\n17424\t-96.095809\t35.994508\tSapulpa city\tOK\tOklahoma\tCreek County\t20234\t39.6\t16.2\t8.6\t21303\t91784\t0.273\t74066\tRomney\t74066\t0.049429772999999996\t74066.0\n17425\t-96.216684\t35.941044\tKellyville town\tOK\tOklahoma\tCreek County\t932\t37.1\t8.6\t6.3\t19677\t73684\t0.273\t74039\tRomney\t74039\t0.002276789\t74039.0\n17426\t-96.507486\t35.800979\tDepew town\tOK\tOklahoma\tCreek County\t572\t38.5\t10.3\t2.7\t15850\t47500\t0.273\t74028\tRomney\t74028\t0.001397343\t74028.0\n17427\t-98.689262\t35.538359\tWeatherford city\tOK\tOklahoma\tCuster County\t10295\t27.5\t39.2\t5.7\t21040\t117843\t0.2406\t73096\tRomney\t73096\t0.025149724\t73096.0\n17428\t-98.953274\t35.507736\tClinton city\tOK\tOklahoma\tCuster County\t8709\t36.8\t16.7\t5.8\t18106\t80935\t0.2406\t73601\tRomney\t73601\t0.021275274\t73601.0\n17429\t-98.886839\t35.663656\tCuster City town\tOK\tOklahoma\tCuster County\t371\t43.6\t27.0\t6.8\t18343\t76667\t0.2406\t73639\tRomney\t73639\t0.000906318\t73639.0\n17430\t-99.186336\t35.636463\tButler town\tOK\tOklahoma\tCuster County\t333\t45.8\t11.7\t5.8\t18948\t73000\t0.2406\t73625\tRomney\t73625\t0.000813488\t73625.0\n17431\t-98.959487\t35.577928\tArapaho town\tOK\tOklahoma\tCuster County\t714\t42.7\t13.8\t7.7\t17362\t57241\t0.2406\t73620\tRomney\t73620\t0.001744235\t73620.0\n17432\t-98.749464\t35.747596\tThomas city\tOK\tOklahoma\tCuster County\t1188\t43.4\t20.0\t6.5\t16863\t63500\t0.2406\t73669\tRomney\t73669\t0.002902173\t73669.0\n17433\t-94.847443\t36.170823\tOaks town\tOK\tOklahoma\tDelaware County\t434\t31.2\t15.0\t6.7\t14155\t78571\t0.2939\t74368\tRomney\t74368\t0.001060221\t74368.0\n17434\t-94.685195\t36.171052\tDripping Springs CDP\tOK\tOklahoma\tDelaware County\t45\t41.7\t12.9\t8.3\t16148\t90000\t0.2939\t74338\tRomney\t74338\t0.000109931\t74338.0\n17435\t-94.69210799999999\t36.264208\tColcord town\tOK\tOklahoma\tDelaware County\t869\t36.3\t10.5\t9.4\t14155\t90294\t0.2939\t74338\tRomney\t74338\t0.002122886\t74338.0\n17436\t-94.910946\t36.622035\tBernice town\tOK\tOklahoma\tDelaware County\t625\t46.3\t12.4\t4.0\t18373\t101389\t0.2939\t74331\tRomney\t74331\t0.0015268170000000002\t74331.0\n17437\t-94.852576\t36.39135\tNew Eucha CDP\tOK\tOklahoma\tDelaware County\t319\t40.4\t13.8\t4.8\t15768\t81000\t0.2939\t74342\tRomney\t74342\t0.0007792869999999999\t74342.0\n17438\t-94.715828\t36.393963\tSycamore CDP\tOK\tOklahoma\tDelaware County\t198\t36.0\t8.9\t7.9\t16819\t81667\t0.2939\t74346\tRomney\t74346\t0.000483696\t74346.0\n17439\t-94.789212\t36.59304\tGrove city\tOK\tOklahoma\tDelaware County\t5725\t53.4\t18.2\t6.1\t24009\t145382\t0.2939\t74344\tRomney\t74344\t0.013985641000000002\t74344.0\n17440\t-94.79742399999999\t36.203753000000006\tKansas town\tOK\tOklahoma\tDelaware County\t761\t32.4\t9.1\t13.0\t17878\t90909\t0.2939\t74347\tRomney\t74347\t0.0018590520000000001\t74347.0\n17441\t-94.795872\t36.426889\tJay city\tOK\tOklahoma\tDelaware County\t2549\t35.2\t16.4\t6.5\t13325\t84800\t0.2939\t74346\tRomney\t74346\t0.006226969000000001\t74346.0\n17442\t-94.845479\t36.512899\tZena CDP\tOK\tOklahoma\tDelaware County\t134\t48.3\t21.8\t10.2\t22931\t125000\t0.2939\t74346\tRomney\t74346\t0.000327349\t74346.0\n17443\t-94.82112\t36.656503\tCopeland CDP\tOK\tOklahoma\tDelaware County\t1776\t56.1\t13.6\t10.0\t17339\t97368\t0.2939\t74344\tRomney\t74344\t0.004338602\t74344.0\n17444\t-94.654049\t36.62557\tCayuga CDP\tOK\tOklahoma\tDelaware County\t123\t50.6\t13.7\t8.6\t18532\t103125\t0.2939\t74344\tRomney\t74344\t0.000300478\t74344.0\n17445\t-94.900896\t36.304576000000004\tBull Hollow CDP\tOK\tOklahoma\tDelaware County\t90\t30.0\t9.4\t7.7\t11306\t55000\t0.2939\t74368\tRomney\t74368\t0.000219862\t74368.0\n17446\t-94.638413\t36.578927\tDodge CDP\tOK\tOklahoma\tDelaware County\t119\t37.1\t17.1\t8.2\t18999\t112500\t0.2939\t74344\tRomney\t74344\t0.000290706\t74344.0\n17447\t-94.903728\t36.338608\tTagg Flats CDP\tOK\tOklahoma\tDelaware County\t12\t12.5\t0.0\t0.0\t11046\t5000\t0.2939\t74342\tRomney\t74342\t2.9299999999999997e-05\t74342.0\n17448\t-94.947772\t36.573887\tCleora CDP\tOK\tOklahoma\tDelaware County\t1241\t52.7\t24.5\t7.0\t30267\t140485\t0.2939\t743HH\tRomney\t743HH\t0.003031647\t0.0\n17449\t-94.821628\t36.192586999999996\tTwin Oaks CDP\tOK\tOklahoma\tDelaware County\t198\t31.4\t14.0\t6.9\t13902\t77500\t0.2939\t74347\tRomney\t74347\t0.000483696\t74347.0\n17450\t-94.790012\t36.271108\tCloud Creek CDP\tOK\tOklahoma\tDelaware County\t96\t31.7\t8.8\t13.3\t17827\t95000\t0.2939\t74347\tRomney\t74347\t0.000234519\t74347.0\n17451\t-94.784029\t36.416493\tBrush Creek CDP\tOK\tOklahoma\tDelaware County\t42\t38.3\t14.8\t5.0\t15358\t106250\t0.2939\t74346\tRomney\t74346\t0.000102602\t74346.0\n17452\t-94.593878\t36.175447999999996\tWest Siloam Springs town\tOK\tOklahoma\tDelaware County\t964\t39.9\t11.6\t8.7\t16104\t88000\t0.2939\t74964\tRomney\t74964\t0.002354962\t74964.0\n17453\t-94.86936899999999\t36.543256\tDennis CDP\tOK\tOklahoma\tDelaware County\t201\t48.2\t22.4\t9.1\t22995\t119318\t0.2939\t74331\tRomney\t74331\t0.0004910240000000001\t74331.0\n17454\t-94.911353\t36.174975\tRocky Ford CDP\tOK\tOklahoma\tDelaware County\t64\t30.5\t16.2\t7.1\t13866\t80000\t0.2939\t74364\tRomney\t74364\t0.000156346\t74364.0\n17455\t-94.909974\t36.198232\tLeach CDP\tOK\tOklahoma\tDelaware County\t236\t30.5\t10.7\t8.7\t12324\t64000\t0.2939\t74368\tRomney\t74368\t0.000576526\t74368.0\n17456\t-94.937864\t36.355024\tOld Eucha CDP\tOK\tOklahoma\tDelaware County\t49\t29.4\t10.0\t9.1\t11361\t50000\t0.2939\t74342\tRomney\t74342\t0.00011970200000000001\t74342.0\n17457\t-94.743779\t36.176363\tFlint Creek CDP\tOK\tOklahoma\tDelaware County\t640\t37.6\t10.9\t9.9\t16658\t87500\t0.2939\t74347\tRomney\t74347\t0.00156346\t74347.0\n17458\t-99.299306\t36.148853\tVici town\tOK\tOklahoma\tDewey County\t637\t47.7\t17.3\t4.3\t19465\t49773\t0.1438\t73859\tRomney\t73859\t0.0015561320000000002\t73859.0\n17459\t-98.964517\t36.040298\tTaloga town\tOK\tOklahoma\tDewey County\t351\t44.7\t19.4\t5.9\t19891\t55500\t0.1438\t73667\tRomney\t73667\t0.00085746\t73667.0\n17460\t-98.925692\t36.152087\tSeiling city\tOK\tOklahoma\tDewey County\t835\t40.6\t17.3\t6.7\t18802\t66296\t0.1438\t73663\tRomney\t73663\t0.002039827\t73663.0\n17461\t-99.28817099999999\t36.017895\tCamargo town\tOK\tOklahoma\tDewey County\t109\t48.1\t13.6\t3.4\t16457\t80000\t0.1438\t73835\tRomney\t73835\t0.000266277\t73835.0\n17462\t-99.34507099999999\t35.868648\tLeedey town\tOK\tOklahoma\tDewey County\t338\t48.4\t16.9\t2.2\t17578\t56667\t0.1438\t73654\tRomney\t73654\t0.000825702\t73654.0\n17463\t-98.967938\t35.855877\tPutnam town\tOK\tOklahoma\tDewey County\t43\t43.8\t18.8\t6.9\t20070\t50000\t0.1438\t73659\tRomney\t73659\t0.000105045\t73659.0\n17464\t-98.703163\t35.931612\tOakwood town\tOK\tOklahoma\tDewey County\t68\t44.5\t16.7\t2.4\t18607\t67500\t0.1438\t73658\tRomney\t73658\t0.00016611799999999998\t73658.0\n17465\t-99.771292\t36.134971\tArnett town\tOK\tOklahoma\tEllis County\t490\t45.9\t20.0\t2.2\t18832\t46458\t0.1255\t73832\tRomney\t73832\t0.0011970239999999999\t73832.0\n17466\t-99.622022\t36.374219000000004\tFargo town\tOK\tOklahoma\tEllis County\t306\t45.8\t17.9\t4.3\t18394\t71429\t0.1255\t73840\tRomney\t73840\t0.0007475289999999999\t73840.0\n17467\t-99.757809\t36.318132\tGage town\tOK\tOklahoma\tEllis County\t474\t48.5\t18.0\t3.4\t20058\t56071\t0.1255\t73843\tRomney\t73843\t0.001157938\t73843.0\n17468\t-99.877449\t36.272894\tShattuck town\tOK\tOklahoma\tEllis County\t1331\t48.7\t25.6\t5.6\t19955\t58333\t0.1255\t73858\tRomney\t73858\t0.003251509\t73858.0\n17469\t-97.66247\t36.563648\tHunter town\tOK\tOklahoma\tGarfield County\t166\t46.9\t23.0\t6.5\t20096\t87500\t0.2377\t74640\tRomney\t74640\t0.00040552300000000003\t74640.0\n17470\t-97.992672\t36.563453\tHillsdale town\tOK\tOklahoma\tGarfield County\t98\t41.7\t20.9\t3.6\t17323\t72500\t0.2377\t73743\tRomney\t73743\t0.000239405\t73743.0\n17471\t-97.72732099999999\t36.462204\tBreckenridge town\tOK\tOklahoma\tGarfield County\t345\t44.8\t18.5\t6.0\t20219\t100893\t0.2377\t73736\tRomney\t73736\t0.000842803\t73736.0\n17472\t-98.035772\t36.301137\tDrummond town\tOK\tOklahoma\tGarfield County\t392\t39.3\t17.5\t5.3\t16675\t92500\t0.2377\t73735\tRomney\t73735\t0.0009576189999999999\t73735.0\n17473\t-97.87034200000001\t36.406101\tEnid city\tOK\tOklahoma\tGarfield County\t47722\t38.5\t22.7\t5.7\t21432\t89395\t0.2377\t73701\tRomney\t73701\t0.11658039099999999\t73701.0\n17474\t-97.904514\t36.281555\tWaukomis town\tOK\tOklahoma\tGarfield County\t1220\t41.5\t16.9\t4.1\t19177\t72105\t0.2377\t73773\tRomney\t73773\t0.0029803459999999996\t73773.0\n17475\t-97.832334\t36.5466\tKremlin town\tOK\tOklahoma\tGarfield County\t233\t41.6\t20.9\t3.0\t17312\t78750\t0.2377\t73753\tRomney\t73753\t0.000569197\t73753.0\n17476\t-98.08906999999999\t36.388006\tLahoma town\tOK\tOklahoma\tGarfield County\t569\t44.5\t23.7\t3.5\t18901\t109091\t0.2377\t73754\tRomney\t73754\t0.001390014\t73754.0\n17477\t-97.704472\t36.355284999999995\tFairmont town\tOK\tOklahoma\tGarfield County\t144\t46.1\t20.8\t2.4\t20393\t116071\t0.2377\t73736\tRomney\t73736\t0.00035177900000000003\t73736.0\n17478\t-97.580831\t36.436572999999996\tGarber city\tOK\tOklahoma\tGarfield County\t816\t40.4\t12.5\t2.6\t17224\t43750\t0.2377\t73738\tRomney\t73738\t0.001993412\t73738.0\n17479\t-98.01711800000001\t36.478678\tCarrier town\tOK\tOklahoma\tGarfield County\t75\t41.9\t21.6\t2.4\t17254\t70000\t0.2377\t73727\tRomney\t73727\t0.000183218\t73727.0\n17480\t-97.58823199999999\t36.307546\tCovington town\tOK\tOklahoma\tGarfield County\t523\t44.0\t15.8\t3.3\t16920\t57188\t0.2377\t73730\tRomney\t73730\t0.00127764\t73730.0\n17481\t-97.667502\t36.260421\tDouglas town\tOK\tOklahoma\tGarfield County\t30\t40.0\t17.4\t5.6\t17074\t50000\t0.2377\t73733\tRomney\t73733\t7.329999999999999e-05\t73733.0\n17482\t-97.863396\t36.445783\tNorth Enid town\tOK\tOklahoma\tGarfield County\t826\t43.1\t13.6\t4.0\t19099\t102806\t0.2377\t73701\tRomney\t73701\t0.0020178410000000003\t73701.0\n17483\t-97.16241099999999\t34.643719\tWynnewood city\tOK\tOklahoma\tGarvin County\t2387\t42.0\t15.0\t6.6\t19600\t69776\t0.2698\t73098\tRomney\t73098\t0.005831218000000001\t73098.0\n17484\t-96.960197\t34.794987\tStratford town\tOK\tOklahoma\tGarvin County\t1880\t38.2\t10.7\t9.8\t13456\t58854\t0.2698\t74872\tRomney\t74872\t0.004592665\t74872.0\n17485\t-97.253423\t34.723201\tPauls Valley city\tOK\tOklahoma\tGarvin County\t6404\t40.3\t17.3\t8.0\t19316\t75968\t0.2698\t73075\tRomney\t73075\t0.015644374\t73075.0\n17486\t-97.6056\t34.811165\tErin Springs town\tOK\tOklahoma\tGarvin County\t109\t43.2\t13.2\t6.6\t18447\t73750\t0.2698\t73052\tRomney\t73052\t0.000266277\t73052.0\n17487\t-97.26172700000001\t34.826439\tPaoli town\tOK\tOklahoma\tGarvin County\t626\t38.7\t12.9\t4.4\t16688\t71316\t0.2698\t73074\tRomney\t73074\t0.00152926\t73074.0\n17488\t-97.394821\t34.622786\tElmore City town\tOK\tOklahoma\tGarvin County\t709\t38.5\t11.4\t8.5\t14251\t64615\t0.2698\t73433\tRomney\t73433\t0.001732021\t73433.0\n17489\t-97.41197\t34.817089\tMaysville town\tOK\tOklahoma\tGarvin County\t1284\t39.7\t10.7\t7.0\t13766\t60125\t0.2698\t73057\tRomney\t73057\t0.003136692\t73057.0\n17490\t-97.61042900000001\t34.839403000000004\tLindsay city\tOK\tOklahoma\tGarvin County\t2957\t41.0\t17.8\t6.0\t18581\t59024\t0.2698\t73052\tRomney\t73052\t0.007223675\t73052.0\n17491\t-97.776303\t34.922746000000004\tAlex town\tOK\tOklahoma\tGrady County\t741\t37.2\t13.1\t7.2\t17603\t44483\t0.2439\t73002\tRomney\t73002\t0.001810194\t73002.0\n17492\t-97.94838399999999\t35.033726\tChickasha city\tOK\tOklahoma\tGrady County\t15907\t37.9\t20.2\t10.9\t18542\t71088\t0.2439\t73018\tRomney\t73018\t0.038859316\t73018.0\n17493\t-97.944813\t34.964071000000004\tNinnekah town\tOK\tOklahoma\tGrady County\t1062\t42.9\t17.0\t5.4\t19887\t90400\t0.2439\t73067\tRomney\t73067\t0.002594367\t73067.0\n17494\t-97.95452\t35.19515\tPocasset town\tOK\tOklahoma\tGrady County\t193\t41.6\t21.6\t4.5\t18775\t90000\t0.2439\t73079\tRomney\t73079\t0.000471481\t73079.0\n17495\t-97.996209\t34.988040000000005\tNorge town\tOK\tOklahoma\tGrady County\t95\t39.4\t18.0\t2.3\t17582\t75000\t0.2439\t73018\tRomney\t73018\t0.00023207599999999998\t73018.0\n17496\t-97.882104\t35.160159\tAmber town\tOK\tOklahoma\tGrady County\t502\t33.5\t9.9\t7.5\t16876\t66667\t0.2439\t73004\tRomney\t73004\t0.001226339\t73004.0\n17497\t-97.95553100000001\t34.780682\tRush Springs town\tOK\tOklahoma\tGrady County\t1393\t38.1\t11.3\t8.9\t15288\t51964\t0.2439\t73082\tRomney\t73082\t0.003402969\t73082.0\n17498\t-98.087335\t35.083378\tVerden town\tOK\tOklahoma\tGrady County\t765\t39.3\t14.5\t4.9\t16149\t56579\t0.2439\t73092\tRomney\t73092\t0.001868824\t73092.0\n17499\t-97.952024\t35.316875\tMinco city\tOK\tOklahoma\tGrady County\t1732\t38.9\t15.6\t4.6\t17689\t66628\t0.2439\t73059\tRomney\t73059\t0.004231114\t73059.0\n17500\t-97.708664\t34.877966\tBradley town\tOK\tOklahoma\tGrady County\t211\t40.8\t14.6\t7.1\t15234\t66000\t0.2439\t73011\tRomney\t73011\t0.000515453\t73011.0\n17501\t-97.756416\t35.307146\tTuttle city\tOK\tOklahoma\tGrady County\t5443\t39.8\t15.8\t4.4\t25246\t128674\t0.2439\t73089\tRomney\t73089\t0.013296741\t73089.0\n17502\t-98.05195\t36.664946\tNash town\tOK\tOklahoma\tGrant County\t192\t45.2\t17.9\t1.8\t18835\t74167\t0.19\t73761\tRomney\t73761\t0.000469038\t73761.0\n17503\t-98.035195\t36.994434999999996\tManchester town\tOK\tOklahoma\tGrant County\t91\t51.5\t17.8\t6.0\t17767\t30000\t0.19\t73758\tRomney\t73758\t0.000222305\t73758.0\n17504\t-97.657165\t36.924871\tRenfrow town\tOK\tOklahoma\tGrant County\t14\t52.5\t30.0\t0.0\t17902\t90000\t0.19\t73759\tRomney\t73759\t3.4200000000000005e-05\t73759.0\n17505\t-97.73782299999999\t36.803946\tMedford city\tOK\tOklahoma\tGrant County\t1160\t43.9\t16.2\t4.8\t17828\t67200\t0.19\t73759\tRomney\t73759\t0.002833772\t73759.0\n17506\t-97.802623\t36.667531\tPond Creek city\tOK\tOklahoma\tGrant County\t786\t42.3\t17.2\t4.2\t20687\t58077\t0.19\t73766\tRomney\t73766\t0.001920125\t73766.0\n17507\t-97.79090699999999\t36.720317\tJefferson town\tOK\tOklahoma\tGrant County\t32\t45.8\t24.0\t5.3\t18149\t85000\t0.19\t73766\tRomney\t73766\t7.82e-05\t73766.0\n17508\t-97.923563\t36.881696000000005\tWakita town\tOK\tOklahoma\tGrant County\t369\t51.3\t17.5\t6.0\t17695\t32083\t0.19\t73771\tRomney\t73771\t0.000901433\t73771.0\n17509\t-97.519508\t36.806743\tDeer Creek town\tOK\tOklahoma\tGrant County\t131\t41.4\t20.5\t4.3\t15175\t50000\t0.19\t74636\tRomney\t74636\t0.000320021\t74636.0\n17510\t-97.558262\t36.691311\tLamont town\tOK\tOklahoma\tGrant County\t413\t41.3\t20.9\t4.5\t15227\t46500\t0.19\t74643\tRomney\t74643\t0.00100892\t74643.0\n17511\t-99.50399499999999\t34.87842\tMangum city\tOK\tOklahoma\tGreer County\t2811\t42.5\t12.5\t9.0\t16684\t46454\t0.2664\t73554\tRomney\t73554\t0.006867011\t73554.0\n17512\t-99.509948\t35.051415000000006\tWillow town\tOK\tOklahoma\tGreer County\t109\t36.8\t10.3\t9.1\t15384\t63333\t0.2664\t73673\tRomney\t73673\t0.000266277\t73673.0\n17513\t-99.37918\t34.96252\tGranite town\tOK\tOklahoma\tGreer County\t1770\t38.5\t13.1\t7.7\t17344\t52143\t0.2664\t73547\tRomney\t73547\t0.004323945\t73547.0\n17514\t-99.916501\t34.686594\tHollis city\tOK\tOklahoma\tHarmon County\t2107\t39.6\t10.2\t10.3\t13687\t41197\t0.28600000000000003\t73550\tRomney\t73550\t0.005147204\t73550.0\n17515\t-99.77369399999999\t34.669142\tGould town\tOK\tOklahoma\tHarmon County\t175\t44.8\t31.0\t3.0\t22013\t47500\t0.28600000000000003\t73544\tRomney\t73544\t0.000427509\t73544.0\n17516\t-99.934164\t36.814153000000005\tRosston town\tOK\tOklahoma\tHarper County\t60\t49.5\t24.4\t2.4\t22102\t85000\t0.1206\t73855\tRomney\t73855\t0.000146574\t73855.0\n17517\t-99.897214\t36.705379\tLaverne town\tOK\tOklahoma\tHarper County\t1014\t44.3\t17.8\t3.3\t22122\t52833\t0.1206\t73848\tRomney\t73848\t0.002477107\t73848.0\n17518\t-99.62776600000001\t36.835203\tBuffalo town\tOK\tOklahoma\tHarper County\t1106\t46.6\t17.2\t2.8\t18698\t49211\t0.1206\t73834\tRomney\t73834\t0.002701855\t73834.0\n17519\t-99.74859000000001\t36.616577\tMay town\tOK\tOklahoma\tHarper County\t30\t47.5\t25.0\t4.8\t22120\t85000\t0.1206\t73851\tRomney\t73851\t7.329999999999999e-05\t73851.0\n17520\t-94.922682\t35.257055\tKeota town\tOK\tOklahoma\tHaskell County\t596\t33.9\t5.8\t8.4\t13334\t49889\t0.2769\t74941\tRomney\t74941\t0.001455972\t74941.0\n17521\t-94.966893\t35.15088\tMcCurtain town\tOK\tOklahoma\tHaskell County\t456\t39.8\t13.5\t8.1\t15134\t61250\t0.2769\t74944\tRomney\t74944\t0.001113965\t74944.0\n17522\t-95.017979\t35.405869\tTamaha town\tOK\tOklahoma\tHaskell County\t193\t43.2\t14.2\t5.1\t16296\t82000\t0.2769\t74962\tRomney\t74962\t0.000471481\t74962.0\n17523\t-95.122098\t35.25713\tStigler city\tOK\tOklahoma\tHaskell County\t3171\t37.4\t15.5\t7.9\t16957\t69348\t0.2769\t74462\tRomney\t74462\t0.007746456999999999\t74462.0\n17524\t-95.237636\t35.251599\tWhitefield town\tOK\tOklahoma\tHaskell County\t227\t44.5\t10.4\t6.7\t15020\t76429\t0.2769\t74472\tRomney\t74472\t0.00055454\t74472.0\n17525\t-95.237826\t35.119276\tKinta town\tOK\tOklahoma\tHaskell County\t234\t42.0\t17.2\t2.9\t17203\t84000\t0.2769\t74552\tRomney\t74552\t0.00057164\t74552.0\n17526\t-96.336297\t34.959196\tAtwood town\tOK\tOklahoma\tHughes County\t102\t41.1\t16.9\t8.3\t16440\t52500\t0.3256\t74827\tRomney\t74827\t0.000249176\t74827.0\n17527\t-96.340052\t35.156786\tYeager town\tOK\tOklahoma\tHughes County\t80\t44.5\t10.5\t8.3\t17027\t75000\t0.3256\t74848\tRomney\t74848\t0.00019543299999999998\t74848.0\n17528\t-96.28899\t34.83569\tGerty town\tOK\tOklahoma\tHughes County\t97\t41.1\t17.2\t4.4\t16696\t65000\t0.3256\t74531\tRomney\t74531\t0.000236962\t74531.0\n17529\t-96.247651\t35.086929\tHorntown town\tOK\tOklahoma\tHughes County\t70\t44.4\t10.0\t6.5\t16964\t80000\t0.3256\t74848\tRomney\t74848\t0.000171003\t74848.0\n17530\t-96.123677\t35.094206\tLamar town\tOK\tOklahoma\tHughes County\t154\t46.9\t9.6\t6.8\t15714\t83333\t0.3256\t74850\tRomney\t74850\t0.00037620800000000005\t74850.0\n17531\t-96.441614\t35.009439\tSpaulding town\tOK\tOklahoma\tHughes County\t74\t43.5\t11.3\t8.8\t17033\t65000\t0.3256\t74848\tRomney\t74848\t0.000180775\t74848.0\n17532\t-96.03195699999999\t35.271262\tDustin town\tOK\tOklahoma\tHughes County\t400\t44.6\t8.7\t11.8\t13774\t42667\t0.3256\t74839\tRomney\t74839\t0.000977163\t74839.0\n17533\t-96.400624\t35.083740999999996\tHoldenville city\tOK\tOklahoma\tHughes County\t5351\t39.6\t11.2\t9.4\t15520\t48045\t0.3256\t74848\tRomney\t74848\t0.013071993999999998\t74848.0\n17534\t-96.099502\t34.901032\tStuart town\tOK\tOklahoma\tHughes County\t217\t46.3\t16.0\t8.6\t16182\t78750\t0.3256\t74570\tRomney\t74570\t0.000530111\t74570.0\n17535\t-96.25297900000001\t34.967234999999995\tCalvin town\tOK\tOklahoma\tHughes County\t251\t41.3\t17.7\t8.3\t16498\t54167\t0.3256\t74531\tRomney\t74531\t0.00061317\t74531.0\n17536\t-96.238867\t35.241061\tWetumka city\tOK\tOklahoma\tHughes County\t1326\t41.5\t10.6\t14.3\t14206\t49878\t0.3256\t74883\tRomney\t74883\t0.003239294\t74883.0\n17537\t-99.569581\t34.662807\tEast Duke town\tOK\tOklahoma\tJackson County\t388\t40.3\t13.4\t6.6\t15914\t56000\t0.2467\t73532\tRomney\t73532\t0.000947848\t73532.0\n17538\t-99.650195\t34.472989\tEldorado town\tOK\tOklahoma\tJackson County\t460\t40.4\t13.3\t6.9\t15893\t55769\t0.2467\t73537\tRomney\t73537\t0.0011237369999999999\t73537.0\n17539\t-99.386655\t34.725993\tMartha town\tOK\tOklahoma\tJackson County\t166\t35.8\t14.2\t9.0\t17996\t95000\t0.2467\t73556\tRomney\t73556\t0.00040552300000000003\t73556.0\n17540\t-99.137309\t34.626769\tHeadrick town\tOK\tOklahoma\tJackson County\t97\t43.8\t15.9\t2.0\t18112\t66667\t0.2467\t73549\tRomney\t73549\t0.000236962\t73549.0\n17541\t-99.42397\t34.547756\tOlustee town\tOK\tOklahoma\tJackson County\t533\t36.4\t16.5\t5.9\t13221\t61333\t0.2467\t73560\tRomney\t73560\t0.0013020689999999999\t73560.0\n17542\t-99.351937\t34.480843\tElmer town\tOK\tOklahoma\tJackson County\t72\t45.5\t15.7\t2.7\t18013\t66667\t0.2467\t73539\tRomney\t73539\t0.000175889\t73539.0\n17543\t-99.306623\t34.654687\tAltus city\tOK\tOklahoma\tJackson County\t19460\t32.7\t22.5\t6.6\t19693\t84755\t0.2467\t73521\tRomney\t73521\t0.047538963\t73521.0\n17544\t-99.33279499999999\t34.779492\tBlair town\tOK\tOklahoma\tJackson County\t864\t38.2\t12.0\t6.4\t18194\t62609\t0.2467\t73526\tRomney\t73526\t0.002110671\t73526.0\n17545\t-97.596434\t34.16345\tCornish town\tOK\tOklahoma\tJefferson County\t164\t38.0\t7.7\t12.7\t12450\t54167\t0.2702\t73456\tRomney\t73456\t0.00040063699999999997\t73456.0\n17546\t-97.95407800000001\t34.021322\tRyan town\tOK\tOklahoma\tJefferson County\t823\t44.4\t12.1\t9.7\t15407\t37917\t0.2702\t73565\tRomney\t73565\t0.0020105120000000003\t73565.0\n17547\t-97.591222\t34.176990999999994\tRingling town\tOK\tOklahoma\tJefferson County\t1048\t40.6\t9.0\t9.6\t13719\t43250\t0.2702\t73456\tRomney\t73456\t0.002560166\t73456.0\n17548\t-97.978838\t34.082468\tSugden town\tOK\tOklahoma\tJefferson County\t56\t47.5\t17.1\t11.1\t16985\t75000\t0.2702\t73573\tRomney\t73573\t0.00013680299999999998\t73573.0\n17549\t-98.026533\t34.185736\tWaurika city\tOK\tOklahoma\tJefferson County\t1895\t40.2\t11.3\t7.5\t16027\t53696\t0.2702\t73573\tRomney\t73573\t0.0046293079999999995\t73573.0\n17550\t-98.108684\t34.224308\tHastings town\tOK\tOklahoma\tJefferson County\t147\t49.7\t18.2\t13.8\t15210\t58333\t0.2702\t73548\tRomney\t73548\t0.00035910699999999995\t73548.0\n17551\t-97.966098\t34.243109000000004\tAddington town\tOK\tOklahoma\tJefferson County\t113\t40.4\t5.2\t6.0\t18618\t55625\t0.2702\t73520\tRomney\t73520\t0.000276048\t73520.0\n17552\t-97.938364\t33.896645\tTerral town\tOK\tOklahoma\tJefferson County\t347\t45.6\t7.8\t16.0\t14412\t42188\t0.2702\t73569\tRomney\t73569\t0.000847689\t73569.0\n17553\t-96.491937\t34.423415000000006\tBromide town\tOK\tOklahoma\tJohnston County\t153\t40.3\t16.3\t6.8\t14704\t63333\t0.3003\t74530\tRomney\t74530\t0.000373765\t74530.0\n17554\t-96.551999\t34.240037\tMilburn town\tOK\tOklahoma\tJohnston County\t390\t43.9\t14.1\t5.3\t13960\t54583\t0.3003\t73450\tRomney\t73450\t0.0009527339999999999\t73450.0\n17555\t-96.425301\t34.373653999999995\tWapanucka town\tOK\tOklahoma\tJohnston County\t417\t40.5\t16.8\t6.4\t15064\t59286\t0.3003\t73461\tRomney\t73461\t0.001018692\t73461.0\n17556\t-96.825097\t34.402043\tMill Creek town\tOK\tOklahoma\tJohnston County\t312\t40.1\t12.6\t11.9\t15426\t50000\t0.3003\t74856\tRomney\t74856\t0.000762187\t74856.0\n17557\t-96.682939\t34.238559\tTishomingo city\tOK\tOklahoma\tJohnston County\t3202\t37.6\t18.1\t8.3\t17539\t69756\t0.3003\t73460\tRomney\t73460\t0.007822187\t73460.0\n17558\t-96.879648\t34.186826\tMannsville town\tOK\tOklahoma\tJohnston County\t563\t37.4\t13.3\t5.3\t17526\t60455\t0.3003\t73447\tRomney\t73447\t0.001375356\t73447.0\n17559\t-96.756454\t34.240543\tRavia town\tOK\tOklahoma\tJohnston County\t437\t43.9\t6.4\t7.6\t13859\t55000\t0.3003\t73455\tRomney\t73455\t0.00106755\t73455.0\n17560\t-97.051804\t36.723946000000005\tPonca City\tOK\tOklahoma\tKay County\t25072\t39.6\t23.8\t11.0\t21308\t85906\t0.2869\t74604\tRomney\t74604\t0.061248555999999996\t74604.0\n17561\t-97.31089399999999\t36.683815\tTonkawa city\tOK\tOklahoma\tKay County\t3127\t33.8\t22.6\t7.7\t15793\t62612\t0.2869\t74653\tRomney\t74653\t0.007638969000000001\t74653.0\n17562\t-97.33407199999999\t36.923407\tBraman town\tOK\tOklahoma\tKay County\t232\t45.6\t18.9\t6.3\t19144\t63000\t0.2869\t74632\tRomney\t74632\t0.000566754\t74632.0\n17563\t-97.05013199999999\t36.80862\tKildare town\tOK\tOklahoma\tKay County\t88\t44.2\t18.8\t6.5\t19924\t81667\t0.2869\t74647\tRomney\t74647\t0.000214976\t74647.0\n17564\t-96.862677\t36.768161\tKaw City\tOK\tOklahoma\tKay County\t367\t48.4\t14.3\t5.3\t19093\t96364\t0.2869\t74641\tRomney\t74641\t0.0008965469999999999\t74641.0\n17565\t-97.05492\t36.881867\tNewkirk city\tOK\tOklahoma\tKay County\t2160\t42.0\t13.6\t8.2\t18292\t74603\t0.2869\t74647\tRomney\t74647\t0.005276678000000001\t74647.0\n17566\t-97.29973000000001\t36.801027000000005\tBlackwell city\tOK\tOklahoma\tKay County\t7306\t38.2\t12.5\t9.8\t17246\t53377\t0.2869\t74631\tRomney\t74631\t0.017847876000000002\t74631.0\n17567\t-97.898916\t36.105818\tHennessey town\tOK\tOklahoma\tKingfisher County\t2293\t36.6\t19.1\t6.6\t18500\t61731\t0.1557\t73742\tRomney\t73742\t0.005601585\t73742.0\n17568\t-98.118297\t35.972804\tLoyal town\tOK\tOklahoma\tKingfisher County\t85\t44.0\t17.7\t4.3\t19804\t75000\t0.1557\t73756\tRomney\t73756\t0.000207647\t73756.0\n17569\t-97.669555\t35.816140999999995\tCashion town\tOK\tOklahoma\tKingfisher County\t901\t40.0\t17.9\t6.0\t22146\t120625\t0.1557\t73016\tRomney\t73016\t0.002201059\t73016.0\n17570\t-97.977032\t35.730018\tOkarche town\tOK\tOklahoma\tKingfisher County\t1106\t42.8\t19.5\t4.2\t20279\t127754\t0.1557\t73762\tRomney\t73762\t0.002701855\t73762.0\n17571\t-97.93818900000001\t35.84368\tKingfisher city\tOK\tOklahoma\tKingfisher County\t4471\t39.5\t22.4\t4.8\t24666\t109848\t0.1557\t73750\tRomney\t73750\t0.010922236\t73750.0\n17572\t-97.910986\t35.981640999999996\tDover town\tOK\tOklahoma\tKingfisher County\t400\t37.5\t12.8\t3.6\t21906\t99000\t0.1557\t73734\tRomney\t73734\t0.000977163\t73734.0\n17573\t-98.952343\t34.698938\tMountain Park town\tOK\tOklahoma\tKiowa County\t329\t47.9\t15.7\t9.4\t17094\t49167\t0.3232\t73559\tRomney\t73559\t0.0008037160000000001\t73559.0\n17574\t-98.750162\t35.099160999999995\tMountain View town\tOK\tOklahoma\tKiowa County\t743\t43.9\t14.0\t6.9\t17484\t45152\t0.3232\t73062\tRomney\t73062\t0.00181508\t73062.0\n17575\t-99.24561\t34.990413000000004\tLone Wolf town\tOK\tOklahoma\tKiowa County\t489\t47.2\t20.1\t8.0\t19135\t57917\t0.3232\t73655\tRomney\t73655\t0.0011945810000000001\t73655.0\n17576\t-98.953174\t34.655409000000006\tSnyder city\tOK\tOklahoma\tKiowa County\t1422\t40.5\t18.2\t8.7\t15103\t55444\t0.3232\t73566\tRomney\t73566\t0.003473813\t73566.0\n17577\t-98.875865\t34.866207\tCooperton town\tOK\tOklahoma\tKiowa County\t17\t50.0\t21.4\t14.3\t16938\t50000\t0.3232\t73564\tRomney\t73564\t4.15e-05\t73564.0\n17578\t-99.09291\t35.026291\tHobart city\tOK\tOklahoma\tKiowa County\t3912\t41.6\t17.8\t7.2\t18786\t54433\t0.3232\t73651\tRomney\t73651\t0.009556651\t73651.0\n17579\t-99.02264\t34.848088\tRoosevelt town\tOK\tOklahoma\tKiowa County\t236\t47.9\t15.8\t9.1\t17112\t50000\t0.3232\t73564\tRomney\t73564\t0.000576526\t73564.0\n17580\t-98.874398\t35.071079\tGotebo town\tOK\tOklahoma\tKiowa County\t228\t50.0\t14.5\t8.6\t15818\t60000\t0.3232\t73041\tRomney\t73041\t0.000556983\t73041.0\n17581\t-95.081464\t34.951031\tRed Oak town\tOK\tOklahoma\tLatimer County\t600\t41.9\t9.4\t13.1\t17772\t58250\t0.3081\t74563\tRomney\t74563\t0.001465744\t74563.0\n17582\t-95.303597\t34.91789\tWilburton city\tOK\tOklahoma\tLatimer County\t2773\t31.5\t15.7\t12.3\t14566\t62169\t0.3081\t74578\tRomney\t74578\t0.00677418\t74578.0\n17583\t-94.44375600000001\t35.337507\tArkoma town\tOK\tOklahoma\tLe Flore County\t2133\t40.6\t9.7\t11.6\t17506\t66341\t0.2943\t74901\tRomney\t74901\t0.00521072\t74901.0\n17584\t-94.53585600000001\t35.135011\tCameron town\tOK\tOklahoma\tLe Flore County\t282\t39.1\t12.4\t8.6\t14945\t84167\t0.2943\t74932\tRomney\t74932\t0.0006888999999999999\t74932.0\n17585\t-94.97589599999999\t34.898377\tLe Flore town\tOK\tOklahoma\tLe Flore County\t175\t40.9\t18.3\t8.8\t15907\t78333\t0.2943\t74942\tRomney\t74942\t0.000427509\t74942.0\n17586\t-94.790662\t35.190688\tBokoshe town\tOK\tOklahoma\tLe Flore County\t450\t38.7\t11.1\t11.9\t16639\t66250\t0.2943\t74930\tRomney\t74930\t0.001099308\t74930.0\n17587\t-94.47743\t35.245418\tPocola town\tOK\tOklahoma\tLe Flore County\t4177\t39.6\t10.0\t10.1\t17818\t83359\t0.2943\t74902\tRomney\t74902\t0.010204021\t74902.0\n17588\t-94.640862\t34.949775\tHowe town\tOK\tOklahoma\tLe Flore County\t734\t36.8\t10.5\t11.3\t15526\t66786\t0.2943\t74940\tRomney\t74940\t0.001793093\t74940.0\n17589\t-94.573198\t35.294049\tFort Coffee town\tOK\tOklahoma\tLe Flore County\t435\t36.5\t13.8\t6.5\t17923\t70833\t0.2943\t74959\tRomney\t74959\t0.0010626639999999998\t74959.0\n17590\t-94.670376\t35.170790999999994\tPanama town\tOK\tOklahoma\tLe Flore County\t1386\t35.3\t11.3\t10.2\t15421\t64833\t0.2943\t74951\tRomney\t74951\t0.003385869\t74951.0\n17591\t-94.90191999999999\t34.973389000000005\tFanshawe town\tOK\tOklahoma\tLe Flore County\t401\t41.9\t19.1\t8.5\t16988\t80000\t0.2943\t74935\tRomney\t74935\t0.000979606\t74935.0\n17592\t-94.481146\t35.183251\tRock Island town\tOK\tOklahoma\tLe Flore County\t1505\t38.2\t9.0\t9.4\t16884\t84898\t0.2943\t74902\tRomney\t74902\t0.003676575\t74902.0\n17593\t-94.607452\t34.89192\tHeavener city\tOK\tOklahoma\tLe Flore County\t3266\t32.9\t12.3\t10.2\t13955\t61034\t0.2943\t74937\tRomney\t74937\t0.007978533000000001\t74937.0\n17594\t-94.635925\t35.036575\tPoteau city\tOK\tOklahoma\tLe Flore County\t8137\t35.7\t18.6\t10.2\t18076\t81289\t0.2943\t74953\tRomney\t74953\t0.019877931\t74953.0\n17595\t-94.668764\t35.127660999999996\tShady Point town\tOK\tOklahoma\tLe Flore County\t874\t38.4\t12.0\t8.3\t17173\t78438\t0.2943\t74951\tRomney\t74951\t0.0021351\t74951.0\n17596\t-94.72290100000001\t34.970366999999996\tWister town\tOK\tOklahoma\tLe Flore County\t1046\t39.5\t15.0\t10.8\t15464\t80769\t0.2943\t74940\tRomney\t74940\t0.00255528\t74940.0\n17597\t-94.787984\t35.310713\tCowlington town\tOK\tOklahoma\tLe Flore County\t135\t43.1\t10.4\t11.1\t18011\t51667\t0.2943\t74941\tRomney\t74941\t0.000329792\t74941.0\n17598\t-95.04079300000001\t34.752209\tTalihina town\tOK\tOklahoma\tLe Flore County\t1205\t40.0\t14.4\t11.7\t14728\t53077\t0.2943\t74571\tRomney\t74571\t0.0029437029999999998\t74571.0\n17599\t-94.621228\t35.240838000000004\tSpiro town\tOK\tOklahoma\tLe Flore County\t2644\t37.4\t12.6\t10.0\t15872\t66970\t0.2943\t74959\tRomney\t74959\t0.006459045\t74959.0\n17600\t-96.604375\t35.807189\tStroud city\tOK\tOklahoma\tLincoln County\t2735\t40.2\t16.3\t8.9\t17547\t70455\t0.2552\t74028\tRomney\t74028\t0.00668135\t74028.0\n17601\t-96.764196\t35.707875\tDavenport town\tOK\tOklahoma\tLincoln County\t685\t38.4\t9.2\t5.1\t17183\t57105\t0.2552\t74026\tRomney\t74026\t0.001673391\t74026.0\n17602\t-97.061334\t35.685990000000004\tWellston town\tOK\tOklahoma\tLincoln County\t1272\t38.1\t17.3\t4.4\t19719\t68393\t0.2552\t74881\tRomney\t74881\t0.003107377\t74881.0\n17603\t-97.001633\t35.688154\tWarwick town\tOK\tOklahoma\tLincoln County\t222\t42.9\t12.7\t9.4\t18760\t88000\t0.2552\t74881\tRomney\t74881\t0.000542325\t74881.0\n17604\t-96.896004\t35.485775\tMeeker town\tOK\tOklahoma\tLincoln County\t979\t40.4\t13.8\t8.1\t17061\t76429\t0.2552\t74855\tRomney\t74855\t0.002391606\t74855.0\n17605\t-97.118351\t35.74928\tFallis town\tOK\tOklahoma\tLincoln County\t27\t35.0\t5.6\t8.3\t16143\t80000\t0.2552\t74881\tRomney\t74881\t6.6e-05\t74881.0\n17606\t-96.775257\t35.785295\tKendrick town\tOK\tOklahoma\tLincoln County\t107\t38.9\t9.9\t4.7\t17231\t56667\t0.2552\t74026\tRomney\t74026\t0.000261391\t74026.0\n17607\t-96.965549\t35.881607\tTryon town\tOK\tOklahoma\tLincoln County\t417\t42.1\t12.7\t9.2\t16235\t65000\t0.2552\t74875\tRomney\t74875\t0.001018692\t74875.0\n17608\t-96.87553100000001\t35.709406\tChandler city\tOK\tOklahoma\tLincoln County\t2930\t38.2\t18.1\t8.8\t19349\t85185\t0.2552\t74834\tRomney\t74834\t0.007157716\t74834.0\n17609\t-96.690874\t35.488481\tPrague city\tOK\tOklahoma\tLincoln County\t3565\t43.3\t14.5\t5.8\t18501\t73846\t0.2552\t74864\tRomney\t74864\t0.008708961999999999\t74864.0\n17610\t-97.015287\t35.806614\tCarney town\tOK\tOklahoma\tLincoln County\t611\t40.1\t15.7\t5.8\t15813\t79444\t0.2552\t74832\tRomney\t74832\t0.001492616\t74832.0\n17611\t-96.87016700000001\t35.894935\tAgra town\tOK\tOklahoma\tLincoln County\t334\t37.4\t10.6\t6.3\t16177\t73571\t0.2552\t74824\tRomney\t74824\t0.0008159310000000001\t74824.0\n17612\t-96.819088\t35.611063\tSparks town\tOK\tOklahoma\tLincoln County\t127\t42.3\t11.5\t8.5\t18805\t83750\t0.2552\t74869\tRomney\t74869\t0.000310249\t74869.0\n17613\t-97.562925\t35.864073\tCedar Valley city\tOK\tOklahoma\tLogan County\t97\t41.7\t23.5\t4.5\t26941\t183333\t0.2773\t73028\tRomney\t73028\t0.000236962\t73028.0\n17614\t-97.245657\t35.844032\tMeridian town\tOK\tOklahoma\tLogan County\t56\t43.1\t15.0\t4.2\t17242\t60000\t0.2773\t73058\tRomney\t73058\t0.00013680299999999998\t73058.0\n17615\t-97.594894\t35.951832\tCrescent city\tOK\tOklahoma\tLogan County\t1347\t40.9\t13.5\t5.7\t17324\t73966\t0.2773\t73028\tRomney\t73028\t0.003290595\t73028.0\n17616\t-97.404987\t36.063984999999995\tMulhall town\tOK\tOklahoma\tLogan County\t252\t39.1\t14.2\t8.3\t18299\t73750\t0.2773\t73063\tRomney\t73063\t0.000615612\t73063.0\n17617\t-97.237306\t35.954105\tCoyle town\tOK\tOklahoma\tLogan County\t350\t41.8\t14.0\t5.3\t17208\t61250\t0.2773\t73050\tRomney\t73050\t0.000855017\t73050.0\n17618\t-97.602238\t35.841977\tGuthrie city\tOK\tOklahoma\tLogan County\t10459\t37.1\t17.3\t7.7\t19672\t88315\t0.2773\t73016\tRomney\t73016\t0.025550361\t73016.0\n17619\t-97.60191\t35.888319\tCimarron City town\tOK\tOklahoma\tLogan County\t115\t46.4\t15.7\t5.9\t20145\t75000\t0.2773\t73028\tRomney\t73028\t0.000280934\t73028.0\n17620\t-97.376594\t36.148771\tOrlando town\tOK\tOklahoma\tLogan County\t212\t39.3\t14.0\t7.8\t18299\t75000\t0.2773\t73073\tRomney\t73073\t0.000517896\t73073.0\n17621\t-97.26972099999999\t35.944303000000005\tLangston town\tOK\tOklahoma\tLogan County\t1702\t21.9\t38.8\t32.1\t14423\t62857\t0.2773\t73050\tRomney\t73050\t0.004157827\t73050.0\n17622\t-97.625739\t36.155451\tMarshall town\tOK\tOklahoma\tLogan County\t280\t42.6\t11.6\t7.8\t17619\t70000\t0.2773\t73056\tRomney\t73056\t0.0006840139999999999\t73056.0\n17623\t-97.42904300000001\t33.877416\tLeon town\tOK\tOklahoma\tLove County\t98\t45.0\t8.6\t4.1\t14886\t65000\t0.298\t73441\tRomney\t73441\t0.000239405\t73441.0\n17624\t-97.124073\t33.935801\tMarietta city\tOK\tOklahoma\tLove County\t2600\t38.1\t13.6\t7.9\t18088\t69115\t0.298\t73448\tRomney\t73448\t0.006351557\t73448.0\n17625\t-97.142684\t33.793569\tThackerville town\tOK\tOklahoma\tLove County\t424\t38.1\t6.4\t4.8\t19247\t83750\t0.298\t73459\tRomney\t73459\t0.001035792\t73459.0\n17626\t-97.340812\t35.022736\tPurcell city\tOK\tOklahoma\tMcClain County\t6337\t38.3\t18.8\t8.4\t19139\t88492\t0.2233\t73051\tRomney\t73051\t0.015480698999999999\t73051.0\n17627\t-97.47414599999999\t35.133682\tGoldsby town\tOK\tOklahoma\tMcClain County\t1327\t40.3\t27.6\t5.1\t26275\t146389\t0.2233\t73093\tRomney\t73093\t0.003241737\t73093.0\n17628\t-97.184699\t34.918795\tRosedale town\tOK\tOklahoma\tMcClain County\t75\t43.1\t22.6\t6.9\t18486\t75000\t0.2233\t73095\tRomney\t73095\t0.000183218\t73095.0\n17629\t-97.316733\t34.917059\tWayne town\tOK\tOklahoma\tMcClain County\t810\t39.9\t11.3\t9.2\t15734\t70882\t0.2233\t73095\tRomney\t73095\t0.001978754\t73095.0\n17630\t-97.62945699999999\t35.035718\tDibble town\tOK\tOklahoma\tMcClain County\t341\t39.2\t10.8\t8.3\t19231\t89167\t0.2233\t73031\tRomney\t73031\t0.000833031\t73031.0\n17631\t-97.054075\t34.872353000000004\tByars town\tOK\tOklahoma\tMcClain County\t299\t39.9\t3.0\t10.0\t13578\t40000\t0.2233\t74831\tRomney\t74831\t0.000730429\t74831.0\n17632\t-97.651889\t35.162595\tBlanchard city\tOK\tOklahoma\tMcClain County\t3692\t37.0\t17.2\t6.5\t21366\t105259\t0.2233\t73010\tRomney\t73010\t0.009019211\t73010.0\n17633\t-97.60295500000001\t35.24886\tNewcastle city\tOK\tOklahoma\tMcClain County\t7807\t41.1\t22.9\t3.2\t26743\t140376\t0.2233\t73065\tRomney\t73065\t0.019071772\t73065.0\n17634\t-97.491004\t35.060095000000004\tWashington town\tOK\tOklahoma\tMcClain County\t606\t36.0\t14.8\t3.1\t22176\t116964\t0.2233\t73093\tRomney\t73093\t0.0014804010000000001\t73093.0\n17635\t-97.566272\t35.099216\tCole town\tOK\tOklahoma\tMcClain County\t551\t38.6\t15.9\t6.6\t21115\t98500\t0.2233\t73093\tRomney\t73093\t0.0013460420000000002\t73093.0\n17636\t-94.93862\t33.955952\tGarvin town\tOK\tOklahoma\tMcCurtain County\t145\t42.0\t17.2\t5.8\t20209\t75000\t0.2422\t74736\tRomney\t74736\t0.000354221\t74736.0\n17637\t-94.646097\t34.468932\tSmithville town\tOK\tOklahoma\tMcCurtain County\t119\t40.0\t9.1\t11.4\t15020\t66667\t0.2422\t74957\tRomney\t74957\t0.000290706\t74957.0\n17638\t-95.017638\t33.983146000000005\tMillerton town\tOK\tOklahoma\tMcCurtain County\t355\t37.5\t14.9\t10.1\t17021\t60714\t0.2422\t74750\tRomney\t74750\t0.000867232\t74750.0\n17639\t-95.007841\t34.064624\tWright City town\tOK\tOklahoma\tMcCurtain County\t809\t37.7\t8.1\t9.6\t14871\t46600\t0.2422\t74764\tRomney\t74764\t0.001976311\t74764.0\n17640\t-94.73938100000001\t34.023488\tBroken Bow city\tOK\tOklahoma\tMcCurtain County\t4115\t36.2\t10.8\t16.2\t15098\t77538\t0.2422\t74728\tRomney\t74728\t0.010052561\t74728.0\n17641\t-94.831458\t33.903962\tIdabel city\tOK\tOklahoma\tMcCurtain County\t6815\t36.0\t14.6\t15.8\t15309\t69901\t0.2422\t74745\tRomney\t74745\t0.016648409\t74745.0\n17642\t-94.65735\t33.840416999999995\tHaworth town\tOK\tOklahoma\tMcCurtain County\t346\t39.0\t15.0\t16.2\t18503\t61667\t0.2422\t74740\tRomney\t74740\t0.000845246\t74740.0\n17643\t-95.089534\t34.004397\tValliant town\tOK\tOklahoma\tMcCurtain County\t840\t40.2\t20.6\t6.5\t19145\t67500\t0.2422\t74764\tRomney\t74764\t0.002052042\t74764.0\n17644\t-95.522368\t35.482101\tChecotah city\tOK\tOklahoma\tMcIntosh County\t3497\t39.8\t14.4\t12.9\t19595\t80188\t0.3813\t74426\tRomney\t74426\t0.008542845\t74426.0\n17645\t-95.889626\t35.203920000000004\tHanna town\tOK\tOklahoma\tMcIntosh County\t123\t36.7\t6.6\t8.9\t14621\t47500\t0.3813\t74845\tRomney\t74845\t0.000300478\t74845.0\n17646\t-95.700705\t35.368497999999995\tStidham town\tOK\tOklahoma\tMcIntosh County\t23\t45.0\t11.8\t11.1\t19928\t55000\t0.3813\t74461\tRomney\t74461\t5.6200000000000004e-05\t74461.0\n17647\t-95.485108\t35.532872\tRentiesville town\tOK\tOklahoma\tMcIntosh County\t99\t44.6\t21.4\t6.3\t17508\t101786\t0.3813\t74459\tRomney\t74459\t0.000241848\t74459.0\n17648\t-95.41668299999999\t35.398432\tDuchess Landing CDP\tOK\tOklahoma\tMcIntosh County\t93\t42.9\t12.3\t2.3\t20927\t95000\t0.3813\t74426\tRomney\t74426\t0.00022719\t74426.0\n17649\t-95.75182099999999\t35.519821\tHitchita town\tOK\tOklahoma\tMcIntosh County\t108\t44.0\t15.6\t4.5\t15393\t77500\t0.3813\t74438\tRomney\t74438\t0.000263834\t74438.0\n17650\t-95.505025\t35.357036\tTexanna CDP\tOK\tOklahoma\tMcIntosh County\t2059\t54.8\t14.6\t8.6\t19267\t88704\t0.3813\t74426\tRomney\t74426\t0.005029945\t74426.0\n17651\t-95.409163\t35.444253\tShady Grove CDP\tOK\tOklahoma\tMcIntosh County\t181\t41.7\t12.7\t3.5\t20947\t92500\t0.3813\t74469\tRomney\t74469\t0.00044216599999999997\t74469.0\n17652\t-95.586297\t35.292277\tEufaula city\tOK\tOklahoma\tMcIntosh County\t3082\t50.2\t19.4\t8.1\t19292\t73390\t0.3813\t74432\tRomney\t74432\t0.007529038\t74432.0\n17653\t-98.186661\t36.247067\tAmes town\tOK\tOklahoma\tMajor County\t189\t47.0\t13.5\t3.7\t20732\t60000\t0.1418\t73718\tRomney\t73718\t0.00046170900000000003\t73718.0\n17654\t-98.477288\t36.269535999999995\tFairview city\tOK\tOklahoma\tMajor County\t2683\t44.4\t19.2\t5.7\t21488\t73819\t0.1418\t73737\tRomney\t73737\t0.006554319\t73737.0\n17655\t-98.241221\t36.381809000000004\tRingwood city\tOK\tOklahoma\tMajor County\t408\t42.7\t12.5\t2.8\t17148\t80556\t0.1418\t73768\tRomney\t73768\t0.000996706\t73768.0\n17656\t-98.440352\t36.404001\tCleo Springs town\tOK\tOklahoma\tMajor County\t311\t45.6\t10.3\t4.9\t19095\t87500\t0.1418\t73729\tRomney\t73729\t0.0007597439999999999\t73729.0\n17657\t-98.177973\t36.388185\tMeno town\tOK\tOklahoma\tMajor County\t188\t42.7\t12.4\t3.1\t17116\t78750\t0.1418\t73760\tRomney\t73760\t0.000459266\t73760.0\n17658\t-96.793607\t34.099965000000005\tOakland town\tOK\tOklahoma\tMarshall County\t683\t35.0\t10.2\t7.7\t13595\t64706\t0.2716\t73446\tRomney\t73446\t0.001668505\t73446.0\n17659\t-96.654913\t33.968759999999996\tWoodville town\tOK\tOklahoma\tMarshall County\t71\t55.4\t12.1\t6.9\t20706\t100000\t0.2716\t73439\tRomney\t73439\t0.00017344599999999998\t73439.0\n17660\t-96.77239399999999\t34.091407000000004\tMadill city\tOK\tOklahoma\tMarshall County\t4026\t36.0\t14.7\t6.6\t15317\t73455\t0.2716\t73446\tRomney\t73446\t0.009835142\t73446.0\n17661\t-96.71381099999999\t34.000439\tKingston town\tOK\tOklahoma\tMarshall County\t1538\t41.5\t13.7\t8.6\t15502\t80000\t0.2716\t73439\tRomney\t73439\t0.00375719\t73439.0\n17662\t-95.269098\t36.438004\tAdair town\tOK\tOklahoma\tMayes County\t701\t35.9\t14.1\t7.7\t16074\t92222\t0.3335\t74330\tRomney\t74330\t0.001712478\t74330.0\n17663\t-95.01948900000001\t36.476949\tDisney town\tOK\tOklahoma\tMayes County\t234\t50.0\t16.4\t5.3\t22026\t100962\t0.3335\t74350\tRomney\t74350\t0.00057164\t74350.0\n17664\t-95.05012099999999\t36.392964\tSpavinaw town\tOK\tOklahoma\tMayes County\t582\t40.2\t5.0\t8.3\t15525\t58125\t0.3335\t74366\tRomney\t74366\t0.0014217720000000002\t74366.0\n17665\t-95.318997\t36.294465\tPryor Creek city\tOK\tOklahoma\tMayes County\t8990\t38.7\t18.3\t9.4\t21808\t103875\t0.3335\t74361\tRomney\t74361\t0.021961731\t74361.0\n17666\t-95.216592\t36.198228\tSams Corner CDP\tOK\tOklahoma\tMayes County\t129\t42.5\t12.9\t3.9\t19126\t90000\t0.3335\t74352\tRomney\t74352\t0.000315135\t74352.0\n17667\t-95.167168\t36.197864\tLocust Grove town\tOK\tOklahoma\tMayes County\t1325\t31.6\t10.4\t9.7\t14123\t75862\t0.3335\t74352\tRomney\t74352\t0.003236851\t74352.0\n17668\t-95.251517\t36.245688\tSportsmen Acres town\tOK\tOklahoma\tMayes County\t197\t34.8\t13.0\t10.8\t15743\t125000\t0.3335\t74361\tRomney\t74361\t0.000481253\t74361.0\n17669\t-95.240859\t36.133598\tMurphy CDP\tOK\tOklahoma\tMayes County\t247\t41.3\t11.1\t11.1\t20493\t70000\t0.3335\t74352\tRomney\t74352\t0.000603398\t74352.0\n17670\t-95.134815\t36.412337\tStrang town\tOK\tOklahoma\tMayes County\t102\t47.1\t6.8\t17.1\t17708\t95000\t0.3335\t74367\tRomney\t74367\t0.000249176\t74367.0\n17671\t-95.025323\t36.504774\tGrand Lake Towne town\tOK\tOklahoma\tMayes County\t67\t50.0\t15.4\t3.7\t22139\t95000\t0.3335\t74349\tRomney\t74349\t0.000163675\t74349.0\n17672\t-95.129204\t36.455665\tPensacola town\tOK\tOklahoma\tMayes County\t75\t46.8\t7.3\t11.5\t15271\t67500\t0.3335\t74367\tRomney\t74367\t0.000183218\t74367.0\n17673\t-95.052922\t36.472566\tLangley town\tOK\tOklahoma\tMayes County\t694\t49.9\t16.5\t5.4\t21993\t102586\t0.3335\t74350\tRomney\t74350\t0.001695377\t74350.0\n17674\t-95.270301\t36.232818\tSportsmen Acres Community CDP\tOK\tOklahoma\tMayes County\t0\t0.0\t0.0\t0.0\t0\t0\t0.3335\t74361\tRomney\t74361\t0.0\t74361.0\n17675\t-95.338521\t36.188926\tChouteau town\tOK\tOklahoma\tMayes County\t2107\t36.1\t11.4\t8.9\t16191\t93226\t0.3335\t74337\tRomney\t74337\t0.005147204\t74337.0\n17676\t-95.11749\t36.270672\tPump Back CDP\tOK\tOklahoma\tMayes County\t163\t39.3\t15.5\t9.4\t17369\t91667\t0.3335\t74365\tRomney\t74365\t0.000398194\t74365.0\n17677\t-95.135124\t36.15582\tIron Post CDP\tOK\tOklahoma\tMayes County\t124\t36.3\t6.3\t10.4\t17247\t77500\t0.3335\t74352\tRomney\t74352\t0.00030292\t74352.0\n17678\t-95.106288\t36.295442\tWickliffe CDP\tOK\tOklahoma\tMayes County\t103\t38.0\t7.4\t12.2\t15955\t80000\t0.3335\t74365\tRomney\t74365\t0.000251619\t74365.0\n17679\t-95.199946\t36.142257\tBallou CDP\tOK\tOklahoma\tMayes County\t152\t41.3\t11.5\t11.1\t20476\t66250\t0.3335\t74352\tRomney\t74352\t0.000371322\t74352.0\n17680\t-95.09366899999999\t36.178551\tSnake Creek CDP\tOK\tOklahoma\tMayes County\t317\t38.8\t15.5\t5.1\t18849\t74000\t0.3335\t74452\tRomney\t74452\t0.0007744010000000001\t74452.0\n17681\t-95.167075\t36.121904\tCedar Crest CDP\tOK\tOklahoma\tMayes County\t326\t36.0\t6.2\t10.2\t17441\t77000\t0.3335\t74352\tRomney\t74352\t0.000796388\t74352.0\n17682\t-95.151794\t36.290516\tSalina town\tOK\tOklahoma\tMayes County\t1670\t37.0\t9.5\t6.4\t18890\t82903\t0.3335\t74365\tRomney\t74365\t0.004079654\t74365.0\n17683\t-95.330298\t36.142517\tMazie CDP\tOK\tOklahoma\tMayes County\t91\t47.5\t5.8\t9.8\t17952\t86250\t0.3335\t74337\tRomney\t74337\t0.000222305\t74337.0\n17684\t-95.12147399999999\t36.360057\tHoot Owl town\tOK\tOklahoma\tMayes County\t0\t0.0\t0.0\t0.0\t0\t0\t0.3335\t74367\tRomney\t74367\t0.0\t74367.0\n17685\t-95.288213\t36.122318\tPin Oak Acres CDP\tOK\tOklahoma\tMayes County\t456\t34.8\t12.6\t10.0\t18944\t105469\t0.3335\t74337\tRomney\t74337\t0.001113965\t74337.0\n17686\t-96.857973\t34.557029\tHickory town\tOK\tOklahoma\tMurray County\t83\t37.9\t22.8\t1.8\t18525\t112500\t0.2993\t74865\tRomney\t74865\t0.00020276099999999998\t74865.0\n17687\t-97.174288\t34.508763\tDavis city\tOK\tOklahoma\tMurray County\t2481\t38.8\t11.1\t5.8\t18154\t75548\t0.2993\t73030\tRomney\t73030\t0.006060851\t73030.0\n17688\t-97.003408\t34.49933\tSulphur city\tOK\tOklahoma\tMurray County\t4802\t41.7\t16.8\t4.7\t18520\t70769\t0.2993\t73086\tRomney\t73086\t0.011730838\t73086.0\n17689\t-97.051456\t34.400448\tDougherty town\tOK\tOklahoma\tMurray County\t211\t45.7\t14.2\t2.7\t18546\t68333\t0.2993\t73032\tRomney\t73032\t0.000515453\t73032.0\n17690\t-95.238117\t35.635778\tRiver Bottom CDP\tOK\tOklahoma\tMuskogee County\t274\t40.5\t13.6\t9.8\t14617\t73333\t0.4261\t74423\tRomney\t74423\t0.0006693560000000001\t74423.0\n17691\t-95.143361\t35.62042\tSour John CDP\tOK\tOklahoma\tMuskogee County\t63\t38.8\t13.6\t11.5\t14642\t70000\t0.4261\t74423\tRomney\t74423\t0.000153903\t74423.0\n17692\t-95.65263\t35.555935999999996\tCouncil Hill town\tOK\tOklahoma\tMuskogee County\t129\t41.1\t12.5\t8.9\t14226\t50000\t0.4261\t74428\tRomney\t74428\t0.000315135\t74428.0\n17693\t-95.164621\t35.398691\tSimms CDP\tOK\tOklahoma\tMuskogee County\t300\t39.3\t8.2\t9.4\t14836\t62500\t0.4261\t74470\tRomney\t74470\t0.000732872\t74470.0\n17694\t-95.35584\t35.747107\tMuskogee city\tOK\tOklahoma\tMuskogee County\t38621\t38.5\t20.2\t10.1\t19120\t84119\t0.4261\t74403\tRomney\t74403\t0.094347498\t74403.0\n17695\t-95.309751\t35.494701\tWarner town\tOK\tOklahoma\tMuskogee County\t1479\t31.8\t19.7\t13.1\t15689\t69839\t0.4261\t74469\tRomney\t74469\t0.003613059\t74469.0\n17696\t-95.19847\t35.663139\tBraggs town\tOK\tOklahoma\tMuskogee County\t311\t40.7\t13.5\t10.2\t14629\t73636\t0.4261\t74423\tRomney\t74423\t0.0007597439999999999\t74423.0\n17697\t-95.263311\t35.356774\tPorum town\tOK\tOklahoma\tMuskogee County\t728\t36.5\t9.0\t13.8\t12907\t33125\t0.4261\t74455\tRomney\t74455\t0.001778436\t74455.0\n17698\t-95.252359\t35.820551\tFort Gibson town\tOK\tOklahoma\tMuskogee County\t4501\t34.1\t17.4\t8.5\t18675\t105191\t0.4261\t74434\tRomney\t74434\t0.010995523\t74434.0\n17699\t-95.477528\t35.577387\tOktaha town\tOK\tOklahoma\tMuskogee County\t351\t36.3\t11.9\t7.0\t14909\t85000\t0.4261\t74450\tRomney\t74450\t0.00085746\t74450.0\n17700\t-95.654235\t35.649268\tBoynton town\tOK\tOklahoma\tMuskogee County\t273\t41.2\t11.8\t8.4\t14273\t50000\t0.4261\t74422\tRomney\t74422\t0.0006669139999999999\t74422.0\n17701\t-95.169333\t35.513201\tWebbers Falls town\tOK\tOklahoma\tMuskogee County\t743\t40.7\t14.2\t12.6\t14107\t65000\t0.4261\t74470\tRomney\t74470\t0.00181508\t74470.0\n17702\t-95.421755\t35.668399\tSummit town\tOK\tOklahoma\tMuskogee County\t243\t36.4\t11.5\t7.3\t14882\t82500\t0.4261\t74401\tRomney\t74401\t0.000593626\t74401.0\n17703\t-95.201534\t35.634186\tSand Hills CDP\tOK\tOklahoma\tMuskogee County\t436\t40.5\t13.5\t10.1\t14631\t73571\t0.4261\t74423\tRomney\t74423\t0.001065107\t74423.0\n17704\t-95.56568399999999\t35.613617\tWainwright town\tOK\tOklahoma\tMuskogee County\t203\t42.5\t16.1\t7.2\t17173\t97500\t0.4261\t74468\tRomney\t74468\t0.00049591\t74468.0\n17705\t-95.543766\t35.759904\tTaft town\tOK\tOklahoma\tMuskogee County\t370\t36.2\t5.7\t15.4\t13865\t83125\t0.4261\t74463\tRomney\t74463\t0.000903875\t74463.0\n17706\t-95.674059\t35.819703999999994\tHaskell town\tOK\tOklahoma\tMuskogee County\t1769\t40.2\t12.3\t10.1\t15459\t59902\t0.4261\t74436\tRomney\t74436\t0.0043215020000000005\t74436.0\n17707\t-97.152976\t36.561094\tMarland town\tOK\tOklahoma\tNoble County\t292\t39.3\t11.4\t11.8\t14139\t52500\t0.2468\t74644\tRomney\t74644\t0.000713329\t74644.0\n17708\t-97.304108\t36.288241\tPerry city\tOK\tOklahoma\tNoble County\t4740\t40.0\t16.2\t5.3\t22128\t74094\t0.2468\t73077\tRomney\t73077\t0.011579378000000001\t73077.0\n17709\t-97.444519\t36.531329\tBillings town\tOK\tOklahoma\tNoble County\t502\t45.7\t11.2\t5.3\t18358\t62727\t0.2468\t74630\tRomney\t74630\t0.001226339\t74630.0\n17710\t-97.012446\t36.294764\tMorrison town\tOK\tOklahoma\tNoble County\t786\t37.2\t17.9\t7.8\t19072\t82692\t0.2468\t73061\tRomney\t73061\t0.001920125\t73061.0\n17711\t-97.179621\t36.460046000000006\tRed Rock town\tOK\tOklahoma\tNoble County\t305\t39.3\t10.9\t12.0\t14160\t50000\t0.2468\t74651\tRomney\t74651\t0.000745087\t74651.0\n17712\t-95.488759\t36.610102000000005\tNew Alluwe town\tOK\tOklahoma\tNowata County\t95\t42.1\t12.1\t7.5\t18357\t103125\t0.3052\t74016\tRomney\t74016\t0.00023207599999999998\t74016.0\n17713\t-95.804751\t36.914696\tWann town\tOK\tOklahoma\tNowata County\t129\t41.6\t8.0\t6.8\t15038\t87500\t0.3052\t74083\tRomney\t74083\t0.000315135\t74083.0\n17714\t-95.63582099999999\t36.851294\tLenapah town\tOK\tOklahoma\tNowata County\t298\t37.2\t16.4\t5.0\t19366\t86667\t0.3052\t74042\tRomney\t74042\t0.000727986\t74042.0\n17715\t-95.642535\t36.778886\tDelaware town\tOK\tOklahoma\tNowata County\t462\t40.1\t6.3\t13.5\t17201\t44000\t0.3052\t74027\tRomney\t74027\t0.001128623\t74027.0\n17716\t-95.639219\t36.697013\tNowata city\tOK\tOklahoma\tNowata County\t4282\t41.9\t11.0\t8.6\t16877\t60931\t0.3052\t74048\tRomney\t74048\t0.010460526\t74048.0\n17717\t-95.62181600000001\t36.993402\tSouth Coffeyville town\tOK\tOklahoma\tNowata County\t773\t40.6\t7.2\t7.4\t17946\t67879\t0.3052\t74072\tRomney\t74072\t0.0018883670000000002\t74072.0\n17718\t-96.135159\t35.34365\tWeleetka town\tOK\tOklahoma\tOkfuskee County\t876\t40.7\t12.8\t13.7\t13527\t44429\t0.3498\t74880\tRomney\t74880\t0.002139986\t74880.0\n17719\t-96.190753\t35.39713\tClearview town\tOK\tOklahoma\tOkfuskee County\t51\t40.0\t11.4\t9.1\t14708\t45000\t0.3498\t74880\tRomney\t74880\t0.000124588\t74880.0\n17720\t-96.479351\t35.490390000000005\tBoley town\tOK\tOklahoma\tOkfuskee County\t1066\t37.5\t8.1\t29.3\t14481\t60714\t0.3498\t74829\tRomney\t74829\t0.0026041379999999998\t74829.0\n17721\t-96.383608\t35.475377\tCastle town\tOK\tOklahoma\tOkfuskee County\t110\t43.2\t11.7\t7.1\t14633\t92500\t0.3498\t74833\tRomney\t74833\t0.00026872\t74833.0\n17722\t-96.56743\t35.508068\tPaden town\tOK\tOklahoma\tOkfuskee County\t450\t42.8\t7.0\t4.1\t17176\t66667\t0.3498\t74860\tRomney\t74860\t0.001099308\t74860.0\n17723\t-96.385203\t35.356794\tBearden town\tOK\tOklahoma\tOkfuskee County\t140\t45.2\t8.7\t13.7\t14071\t75000\t0.3498\t74837\tRomney\t74837\t0.00034200699999999997\t74837.0\n17724\t-96.29997\t35.429684\tOkemah city\tOK\tOklahoma\tOkfuskee County\t3001\t40.4\t15.1\t13.6\t15914\t58092\t0.3498\t74859\tRomney\t74859\t0.007331163000000001\t74859.0\n17725\t-97.446218\t35.513845\tForest Park town\tOK\tOklahoma\tOklahoma County\t1118\t52.2\t42.0\t8.8\t36044\t149561\t0.4167\t73121\tRomney\t73121\t0.00273117\t73121.0\n17726\t-97.371555\t35.510678999999996\tSpencer city\tOK\tOklahoma\tOklahoma County\t3993\t38.8\t12.8\t14.1\t18825\t70387\t0.4167\t73141\tRomney\t73141\t0.009754526\t73141.0\n17727\t-97.456926\t35.450922999999996\tSmith Village town\tOK\tOklahoma\tOklahoma County\t34\t32.5\t22.7\t6.7\t15746\t65000\t0.4167\t73115\tRomney\t73115\t8.31e-05\t73115.0\n17728\t-97.649854\t35.509643\tWoodlawn Park town\tOK\tOklahoma\tOklahoma County\t168\t46.8\t29.8\t2.5\t29337\t140278\t0.4167\t73008\tRomney\t73008\t0.000410408\t73008.0\n17729\t-97.26663\t35.480084000000005\tChoctaw city\tOK\tOklahoma\tOklahoma County\t11431\t41.6\t21.2\t5.0\t26190\t114128\t0.4167\t73020\tRomney\t73020\t0.027924866\t73020.0\n17730\t-97.44874\t35.533291999999996\tLake Aluma town\tOK\tOklahoma\tOklahoma County\t103\t53.2\t50.0\t8.6\t44347\t200000\t0.4167\t73121\tRomney\t73121\t0.000251619\t73121.0\n17731\t-97.64149599999999\t35.506971\tBethany city\tOK\tOklahoma\tOklahoma County\t20036\t38.6\t25.1\t6.6\t22284\t95169\t0.4167\t73008\tRomney\t73008\t0.048946078\t73008.0\n17732\t-97.55643\t35.570544\tThe Village city\tOK\tOklahoma\tOklahoma County\t10115\t37.5\t36.0\t6.3\t27221\t94878\t0.4167\t73120\tRomney\t73120\t0.024710001000000002\t73120.0\n17733\t-97.44081\t35.448370000000004\tDel City\tOK\tOklahoma\tOklahoma County\t21884\t36.3\t14.4\t8.6\t19788\t72671\t0.4167\t73115\tRomney\t73115\t0.053460569000000006\t73115.0\n17734\t-97.371084\t35.463059\tMidwest City\tOK\tOklahoma\tOklahoma County\t57065\t35.6\t19.1\t7.8\t21779\t85324\t0.4167\t73130\tRomney\t73130\t0.139404468\t73130.0\n17735\t-97.325439\t35.665424\tArcadia town\tOK\tOklahoma\tOklahoma County\t319\t47.1\t31.3\t26.7\t23243\t105000\t0.4167\t73007\tRomney\t73007\t0.0007792869999999999\t73007.0\n17736\t-97.61826500000001\t35.528378000000004\tWarr Acres city\tOK\tOklahoma\tOklahoma County\t9980\t37.6\t26.1\t6.9\t23166\t90194\t0.4167\t73122\tRomney\t73122\t0.024380207999999997\t73122.0\n17737\t-97.481623\t35.402590000000004\tValley Brook town\tOK\tOklahoma\tOklahoma County\t843\t32.2\t3.0\t11.3\t12771\t26000\t0.4167\t73149\tRomney\t73149\t0.00205937\t73149.0\n17738\t-97.187466\t35.481293\tHarrah city\tOK\tOklahoma\tOklahoma County\t5180\t37.7\t19.1\t5.6\t20302\t99481\t0.4167\t73045\tRomney\t73045\t0.012654256000000001\t73045.0\n17739\t-97.290086\t35.566371000000004\tJones town\tOK\tOklahoma\tOklahoma County\t2765\t41.1\t16.2\t6.3\t17786\t78110\t0.4167\t73049\tRomney\t73049\t0.006754637\t73049.0\n17740\t-97.325204\t35.491215999999994\tNicoma Park city\tOK\tOklahoma\tOklahoma County\t2739\t40.3\t13.8\t5.9\t21267\t88488\t0.4167\t73066\tRomney\t73066\t0.0066911209999999995\t73066.0\n17741\t-97.183424\t35.6667\tLuther town\tOK\tOklahoma\tOklahoma County\t671\t37.2\t9.0\t3.6\t17654\t64286\t0.4167\t73054\tRomney\t73054\t0.00163919\t73054.0\n17742\t-97.544499\t35.546834000000004\tNichols Hills city\tOK\tOklahoma\tOklahoma County\t4043\t47.0\t68.3\t2.2\t59880\t335052\t0.4167\t73116\tRomney\t73116\t0.009876672\t73116.0\n17743\t-97.41603\t35.668946999999996\tEdmond city\tOK\tOklahoma\tOklahoma County\t81605\t35.1\t50.1\t4.9\t32183\t171733\t0.4167\t73034\tRomney\t73034\t0.19935339800000001\t73034.0\n17744\t-97.133489\t35.509313\tOklahoma City\tOK\tOklahoma\tOklahoma County\t576224\t35.3\t27.2\t7.3\t24047\t112613\t0.4167\t73045\tRomney\t73045\t1.4076614440000002\t73045.0\n17745\t-95.956637\t35.511069\tSchulter town\tOK\tOklahoma\tOkmulgee County\t594\t43.3\t10.9\t7.8\t14906\t52105\t0.4127\t74460\tRomney\t74460\t0.0014510870000000002\t74460.0\n17746\t-95.872889\t35.504831\tGrayson town\tOK\tOklahoma\tOkmulgee County\t130\t39.0\t12.9\t6.1\t14485\t68333\t0.4127\t74460\tRomney\t74460\t0.000317578\t74460.0\n17747\t-95.94768499999999\t35.458244\tDewar town\tOK\tOklahoma\tOkmulgee County\t869\t36.7\t4.3\t13.6\t17587\t47167\t0.4127\t74431\tRomney\t74431\t0.002122886\t74431.0\n17748\t-95.996577\t35.787487\tWinchester town\tOK\tOklahoma\tOkmulgee County\t451\t36.7\t14.7\t7.2\t18952\t93750\t0.4127\t74421\tRomney\t74421\t0.001101751\t74421.0\n17749\t-95.98325\t35.443261\tHenryetta city\tOK\tOklahoma\tOkmulgee County\t5889\t40.4\t11.3\t12.2\t14772\t48729\t0.4127\t74437\tRomney\t74437\t0.014386277\t74437.0\n17750\t-96.041947\t35.755458000000004\tBeggs city\tOK\tOklahoma\tOkmulgee County\t1313\t36.6\t10.6\t6.1\t15526\t57857\t0.4127\t74421\tRomney\t74421\t0.003207536\t74421.0\n17751\t-95.890431\t35.615241\tMorris city\tOK\tOklahoma\tOkmulgee County\t1336\t37.8\t14.1\t8.6\t17261\t64074\t0.4127\t74445\tRomney\t74445\t0.003263723\t74445.0\n17752\t-95.956376\t35.630851\tOkmulgee city\tOK\tOklahoma\tOkmulgee County\t12483\t37.4\t14.7\t11.8\t17584\t57239\t0.4127\t74447\tRomney\t74447\t0.030494804\t74447.0\n17753\t-95.844897\t35.488839\tHoffman town\tOK\tOklahoma\tOkmulgee County\t144\t39.3\t14.0\t7.3\t14443\t66667\t0.4127\t74438\tRomney\t74438\t0.00035177900000000003\t74438.0\n17754\t-96.711935\t36.807441\tWebb City town\tOK\tOklahoma\tOsage County\t95\t43.0\t13.4\t10.3\t17109\t28750\t0.3736\t74652\tRomney\t74652\t0.00023207599999999998\t74652.0\n17755\t-96.331239\t36.669567\tPawhuska city\tOK\tOklahoma\tOsage County\t3587\t41.1\t17.1\t9.5\t17623\t42045\t0.3736\t74056\tRomney\t74056\t0.008762706\t74056.0\n17756\t-96.648802\t36.937934999999996\tGrainola town\tOK\tOklahoma\tOsage County\t31\t42.5\t13.6\t8.3\t17110\t27500\t0.3736\t74652\tRomney\t74652\t7.57e-05\t74652.0\n17757\t-96.16364899999999\t36.560626\tBarnsdall city\tOK\tOklahoma\tOsage County\t1333\t42.3\t10.9\t9.2\t19200\t37188\t0.3736\t74002\tRomney\t74002\t0.003256395\t74002.0\n17758\t-97.034203\t36.679435\tMcCord CDP\tOK\tOklahoma\tOsage County\t1651\t46.5\t16.4\t8.0\t20324\t86915\t0.3736\t74604\tRomney\t74604\t0.004033239\t74604.0\n17759\t-96.415932\t36.294052\tOsage town\tOK\tOklahoma\tOsage County\t194\t43.3\t8.8\t9.4\t16627\t70000\t0.3736\t74020\tRomney\t74020\t0.000473924\t74020.0\n17760\t-96.32645500000001\t36.545854999999996\tWynona town\tOK\tOklahoma\tOsage County\t535\t37.4\t8.0\t14.8\t14602\t43500\t0.3736\t74084\tRomney\t74084\t0.001306955\t74084.0\n17761\t-96.729208\t36.696554\tBurbank town\tOK\tOklahoma\tOsage County\t150\t48.2\t14.0\t5.8\t22312\t78333\t0.3736\t74633\tRomney\t74633\t0.000366436\t74633.0\n17762\t-96.707711\t36.569943\tFairfax town\tOK\tOklahoma\tOsage County\t1439\t41.7\t14.1\t13.5\t15862\t34200\t0.3736\t74637\tRomney\t74637\t0.0035153429999999998\t74637.0\n17763\t-96.059831\t36.488628999999996\tAvant town\tOK\tOklahoma\tOsage County\t388\t36.2\t9.4\t8.9\t17576\t64286\t0.3736\t74001\tRomney\t74001\t0.000947848\t74001.0\n17764\t-96.393025\t36.418923\tHominy city\tOK\tOklahoma\tOsage County\t3674\t38.0\t9.4\t11.4\t15577\t49539\t0.3736\t74035\tRomney\t74035\t0.008975239\t74035.0\n17765\t-96.56917299999999\t36.872177\tForaker town\tOK\tOklahoma\tOsage County\t23\t37.5\t17.6\t10.0\t17129\t27500\t0.3736\t74652\tRomney\t74652\t5.6200000000000004e-05\t74652.0\n17766\t-96.659575\t36.780668\tShidler city\tOK\tOklahoma\tOsage County\t520\t42.4\t13.8\t10.2\t17226\t34375\t0.3736\t74652\tRomney\t74652\t0.001270311\t74652.0\n17767\t-95.998281\t36.369964\tSkiatook town\tOK\tOklahoma\tOsage County\t6698\t34.0\t16.0\t7.6\t20850\t86362\t0.3736\t74070\tRomney\t74070\t0.016362589\t74070.0\n17768\t-96.266979\t36.249657\tPrue town\tOK\tOklahoma\tOsage County\t448\t49.8\t16.7\t6.7\t24392\t110526\t0.3736\t74060\tRomney\t74060\t0.001094422\t74060.0\n17769\t-94.870595\t36.931726\tCommerce city\tOK\tOklahoma\tOttawa County\t2506\t32.5\t6.1\t12.8\t15604\t48644\t0.3518\t74339\tRomney\t74339\t0.006121924\t74339.0\n17770\t-94.87974\t36.920156\tNorth Miami town\tOK\tOklahoma\tOttawa County\t389\t37.6\t3.5\t7.0\t15929\t50000\t0.3518\t74358\tRomney\t74358\t0.000950291\t74358.0\n17771\t-94.83250799999999\t36.986257\tPicher city\tOK\tOklahoma\tOttawa County\t1217\t39.7\t4.7\t12.6\t11107\t28939\t0.3518\t74360\tRomney\t74360\t0.002973017\t74360.0\n17772\t-94.851139\t36.975054\tCardin town\tOK\tOklahoma\tOttawa County\t128\t41.4\t6.6\t8.0\t11650\t50000\t0.3518\t74335\tRomney\t74335\t0.000312692\t74335.0\n17773\t-94.873976\t36.887903\tMiami city\tOK\tOklahoma\tOttawa County\t13370\t37.9\t14.9\t6.6\t18322\t69938\t0.3518\t74354\tRomney\t74354\t0.032661662\t74354.0\n17774\t-94.84980999999999\t36.751185\tFairland town\tOK\tOklahoma\tOttawa County\t919\t41.2\t9.8\t6.4\t16563\t77963\t0.3518\t74343\tRomney\t74343\t0.002245031\t74343.0\n17775\t-94.669575\t36.915566999999996\tPeoria town\tOK\tOklahoma\tOttawa County\t150\t39.5\t11.8\t3.2\t18988\t100000\t0.3518\t74363\tRomney\t74363\t0.000366436\t74363.0\n17776\t-94.790253\t36.952537\tQuapaw town\tOK\tOklahoma\tOttawa County\t871\t37.1\t6.0\t9.4\t14459\t46875\t0.3518\t74360\tRomney\t74360\t0.002127772\t74360.0\n17777\t-94.96350699999999\t36.694776\tAfton town\tOK\tOklahoma\tOttawa County\t1198\t38.0\t9.5\t7.3\t13097\t54348\t0.3518\t74331\tRomney\t74331\t0.002926602\t74331.0\n17778\t-94.901043\t36.836602\tDotyville CDP\tOK\tOklahoma\tOttawa County\t17\t52.5\t27.3\t0.0\t20190\t112500\t0.3518\t74354\tRomney\t74354\t4.15e-05\t74354.0\n17779\t-94.92804100000001\t36.801004999999996\tNarcissa CDP\tOK\tOklahoma\tOttawa County\t110\t45.3\t12.5\t3.0\t18108\t115000\t0.3518\t74354\tRomney\t74354\t0.00026872\t74354.0\n17780\t-94.723158\t36.792596\tWyandotte town\tOK\tOklahoma\tOttawa County\t330\t40.1\t6.6\t3.6\t15579\t53182\t0.3518\t74370\tRomney\t74370\t0.000806159\t74370.0\n17781\t-96.490358\t36.185672\tTerlton town\tOK\tOklahoma\tPawnee County\t83\t39.2\t5.6\t10.5\t15572\t57500\t0.2999\t74081\tRomney\t74081\t0.00020276099999999998\t74081.0\n17782\t-96.801878\t36.336348\tPawnee city\tOK\tOklahoma\tPawnee County\t2357\t40.6\t15.5\t12.0\t15377\t49041\t0.2999\t74058\tRomney\t74058\t0.005757931\t74058.0\n17783\t-96.312077\t36.217766999999995\tMule Barn town\tOK\tOklahoma\tPawnee County\t0\t0.0\t0.0\t0.0\t0\t0\t0.2999\t74060\tRomney\t74060\t0.0\t74060.0\n17784\t-96.56783\t36.231462\tHallett town\tOK\tOklahoma\tPawnee County\t158\t41.8\t10.5\t8.3\t21354\t52000\t0.2999\t74034\tRomney\t74034\t0.000385979\t74034.0\n17785\t-96.314323\t36.194624\tWestport town\tOK\tOklahoma\tPawnee County\t253\t44.2\t14.9\t6.1\t20912\t95000\t0.2999\t74060\tRomney\t74060\t0.000618055\t74060.0\n17786\t-96.737657\t36.503504\tRalston town\tOK\tOklahoma\tPawnee County\t331\t45.5\t18.3\t6.9\t17981\t81818\t0.2999\t74650\tRomney\t74650\t0.000808602\t74650.0\n17787\t-96.287879\t36.189626000000004\tShady Grove town\tOK\tOklahoma\tPawnee County\t42\t45.6\t16.1\t10.0\t21126\t90000\t0.2999\t74060\tRomney\t74060\t0.000102602\t74060.0\n17788\t-96.569005\t36.182308\tJennings town\tOK\tOklahoma\tPawnee County\t635\t38.4\t11.0\t9.2\t20651\t56250\t0.2999\t74038\tRomney\t74038\t0.001551246\t74038.0\n17789\t-96.70825\t36.161291\tQuay town\tOK\tOklahoma\tPawnee County\t45\t46.3\t15.2\t5.6\t19798\t90000\t0.2999\t74085\tRomney\t74085\t0.000109931\t74085.0\n17790\t-96.470074\t36.302664\tCleveland city\tOK\tOklahoma\tPawnee County\t3133\t39.3\t13.3\t10.5\t17280\t63649\t0.2999\t74020\tRomney\t74020\t0.007653627\t74020.0\n17791\t-96.596455\t36.373072\tBlackburn town\tOK\tOklahoma\tPawnee County\t96\t37.8\t9.8\t8.6\t16022\t80000\t0.2999\t74034\tRomney\t74034\t0.000234519\t74034.0\n17792\t-96.70371\t36.380514\tSkedee town\tOK\tOklahoma\tPawnee County\t96\t37.8\t9.8\t8.6\t16022\t81667\t0.2999\t74058\tRomney\t74058\t0.000234519\t74058.0\n17793\t-96.68043399999999\t36.241987\tMaramec town\tOK\tOklahoma\tPawnee County\t99\t43.5\t15.5\t5.0\t20109\t65000\t0.2999\t74045\tRomney\t74045\t0.000241848\t74045.0\n17794\t-96.338272\t36.205604\tOak Grove town\tOK\tOklahoma\tPawnee County\t17\t47.5\t15.4\t0.0\t21633\t95000\t0.2999\t74054\tRomney\t74054\t4.15e-05\t74054.0\n17795\t-96.92743399999999\t36.225904\tGlencoe town\tOK\tOklahoma\tPayne County\t651\t39.0\t14.6\t5.0\t19762\t80588\t0.3582\t74032\tRomney\t74032\t0.001590332\t74032.0\n17796\t-97.072303\t36.131126\tStillwater city\tOK\tOklahoma\tPayne County\t44977\t25.5\t51.5\t7.4\t21307\t143132\t0.3582\t74075\tRomney\t74075\t0.10987461300000001\t74075.0\n17797\t-96.904617\t36.016813\tRipley town\tOK\tOklahoma\tPayne County\t497\t35.4\t17.0\t6.6\t14589\t73333\t0.3582\t74062\tRomney\t74062\t0.001214125\t74062.0\n17798\t-97.031525\t35.977975\tPerkins town\tOK\tOklahoma\tPayne County\t2808\t35.4\t23.1\t4.9\t18940\t88295\t0.3582\t74059\tRomney\t74059\t0.006859682\t74059.0\n17799\t-96.70071\t36.114796999999996\tYale city\tOK\tOklahoma\tPayne County\t1320\t38.0\t8.1\t8.9\t15024\t50500\t0.3582\t74085\tRomney\t74085\t0.0032246370000000002\t74085.0\n17800\t-96.761122\t35.97984\tCushing city\tOK\tOklahoma\tPayne County\t8613\t38.6\t16.4\t7.8\t16107\t76039\t0.3582\t74023\tRomney\t74023\t0.021040755\t74023.0\n17801\t-96.070488\t34.766843\tAshland town\tOK\tOklahoma\tPittsburg County\t53\t43.1\t10.5\t7.4\t15866\t50000\t0.3083\t74570\tRomney\t74570\t0.000129474\t74570.0\n17802\t-95.85032700000001\t34.711609\tPittsburg town\tOK\tOklahoma\tPittsburg County\t281\t43.0\t12.4\t7.1\t16260\t75000\t0.3083\t74553\tRomney\t74553\t0.000686457\t74553.0\n17803\t-95.367386\t35.125231\tQuinton town\tOK\tOklahoma\tPittsburg County\t1074\t41.4\t9.7\t8.5\t16461\t47900\t0.3083\t74561\tRomney\t74561\t0.002623682\t74561.0\n17804\t-95.666709\t35.122442\tCrowder town\tOK\tOklahoma\tPittsburg County\t450\t43.8\t16.7\t8.1\t17040\t86818\t0.3083\t74430\tRomney\t74430\t0.001099308\t74430.0\n17805\t-95.558708\t34.838679\tHartshorne city\tOK\tOklahoma\tPittsburg County\t2150\t42.3\t12.3\t9.8\t15315\t66892\t0.3083\t74547\tRomney\t74547\t0.0052522490000000005\t74547.0\n17806\t-95.71965300000001\t34.933564000000004\tKrebs city\tOK\tOklahoma\tPittsburg County\t2103\t34.7\t11.0\t7.1\t17913\t72826\t0.3083\t74554\tRomney\t74554\t0.005137433\t74554.0\n17807\t-95.649311\t35.174028\tCanadian town\tOK\tOklahoma\tPittsburg County\t257\t52.4\t13.5\t7.2\t19308\t73125\t0.3083\t74425\tRomney\t74425\t0.000627827\t74425.0\n17808\t-95.835704\t34.835296\tSavanna town\tOK\tOklahoma\tPittsburg County\t736\t42.2\t14.8\t4.7\t18566\t67667\t0.3083\t74565\tRomney\t74565\t0.001797979\t74565.0\n17809\t-95.690324\t34.900859000000004\tAlderson town\tOK\tOklahoma\tPittsburg County\t265\t42.7\t9.2\t5.9\t16907\t74375\t0.3083\t74522\tRomney\t74522\t0.00064737\t74522.0\n17810\t-95.77605\t35.163346999999995\tIndianola town\tOK\tOklahoma\tPittsburg County\t197\t41.8\t13.2\t6.5\t16311\t62500\t0.3083\t74442\tRomney\t74442\t0.000481253\t74442.0\n17811\t-95.770666\t34.927087\tMcAlester city\tOK\tOklahoma\tPittsburg County\t18522\t39.8\t16.5\t8.4\t19353\t86845\t0.3083\t74501\tRomney\t74501\t0.045247517\t74501.0\n17812\t-95.518366\t35.240493\tLongtown CDP\tOK\tOklahoma\tPittsburg County\t2590\t57.9\t15.1\t6.5\t19881\t64840\t0.3083\t74432\tRomney\t74432\t0.0063271280000000004\t74432.0\n17813\t-95.578469\t34.854110999999996\tHaileyville city\tOK\tOklahoma\tPittsburg County\t901\t37.5\t14.5\t7.9\t17656\t56800\t0.3083\t74546\tRomney\t74546\t0.002201059\t74546.0\n17814\t-95.90203199999999\t34.722246000000005\tKiowa town\tOK\tOklahoma\tPittsburg County\t698\t42.6\t11.7\t9.2\t15765\t62292\t0.3083\t74553\tRomney\t74553\t0.001705149\t74553.0\n17815\t-96.592384\t34.874735\tFrancis town\tOK\tOklahoma\tPontotoc County\t280\t39.1\t20.1\t6.7\t19195\t85000\t0.3062\t74844\tRomney\t74844\t0.0006840139999999999\t74844.0\n17816\t-96.667864\t34.865942\tByng town\tOK\tOklahoma\tPontotoc County\t1082\t36.9\t21.0\t7.5\t16350\t88667\t0.3062\t74844\tRomney\t74844\t0.002643225\t74844.0\n17817\t-96.660137\t34.76422\tAda city\tOK\tOklahoma\tPontotoc County\t16441\t34.1\t29.6\t7.1\t19024\t93917\t0.3062\t74820\tRomney\t74820\t0.040163828\t74820.0\n17818\t-96.841312\t34.62863\tRoff town\tOK\tOklahoma\tPontotoc County\t768\t39.5\t9.3\t6.3\t17071\t45294\t0.3062\t74865\tRomney\t74865\t0.001876152\t74865.0\n17819\t-96.40437299999999\t34.878443\tAllen town\tOK\tOklahoma\tPontotoc County\t981\t40.1\t10.8\t7.5\t15223\t52619\t0.3062\t74825\tRomney\t74825\t0.002396491\t74825.0\n17820\t-96.525299\t34.651790000000005\tStonewall town\tOK\tOklahoma\tPontotoc County\t510\t40.0\t9.9\t9.7\t12427\t33958\t0.3062\t74871\tRomney\t74871\t0.001245882\t74871.0\n17821\t-96.766548\t34.658052000000005\tFitzhugh town\tOK\tOklahoma\tPontotoc County\t219\t42.0\t25.2\t4.8\t17204\t100000\t0.3062\t74843\tRomney\t74843\t0.000534997\t74843.0\n17822\t-97.09338699999999\t35.099228000000004\tTribbey town\tOK\tOklahoma\tPottawatomie County\t291\t46.6\t10.3\t4.8\t17679\t96429\t0.3067\t74852\tRomney\t74852\t0.0007108860000000001\t74852.0\n17823\t-96.841797\t35.405651\tJohnson town\tOK\tOklahoma\tPottawatomie County\t268\t34.9\t22.1\t11.2\t20057\t125000\t0.3067\t74804\tRomney\t74804\t0.000654699\t74804.0\n17824\t-96.801384\t35.327861999999996\tEarlsboro town\tOK\tOklahoma\tPottawatomie County\t865\t42.5\t18.1\t5.6\t18357\t106402\t0.3067\t74840\tRomney\t74840\t0.002113114\t74840.0\n17825\t-96.933814\t35.263870000000004\tTecumseh city\tOK\tOklahoma\tPottawatomie County\t6125\t38.9\t17.0\t9.8\t16622\t75065\t0.3067\t74873\tRomney\t74873\t0.014962803\t74873.0\n17826\t-96.771086\t35.134394\tMaud city\tOK\tOklahoma\tPottawatomie County\t1143\t38.5\t8.0\t11.6\t14978\t47000\t0.3067\t74854\tRomney\t74854\t0.002792242\t74854.0\n17827\t-97.10064399999999\t35.407539\tMcLoud town\tOK\tOklahoma\tPottawatomie County\t4471\t35.6\t10.6\t4.9\t17812\t99351\t0.3067\t74851\tRomney\t74851\t0.010922236\t74851.0\n17828\t-97.008673\t35.147933\tMacomb town\tOK\tOklahoma\tPottawatomie County\t55\t39.2\t10.8\t8.7\t15577\t70000\t0.3067\t74852\tRomney\t74852\t0.00013436\t74852.0\n17829\t-96.859645\t35.081292\tSt. Louis town\tOK\tOklahoma\tPottawatomie County\t214\t42.5\t11.4\t8.4\t17448\t81000\t0.3067\t74866\tRomney\t74866\t0.000522782\t74866.0\n17830\t-96.96095799999999\t35.210215999999996\tBrooksville town\tOK\tOklahoma\tPottawatomie County\t89\t40.4\t17.2\t7.5\t18397\t97500\t0.3067\t74873\tRomney\t74873\t0.00021741900000000003\t74873.0\n17831\t-96.92201899999999\t35.357402\tShawnee city\tOK\tOklahoma\tPottawatomie County\t29756\t34.6\t20.9\t8.0\t19353\t88203\t0.3067\t74804\tRomney\t74804\t0.07269113\t74804.0\n17832\t-96.925453\t34.988396\tAsher town\tOK\tOklahoma\tPottawatomie County\t532\t41.0\t8.2\t7.8\t15581\t56250\t0.3067\t74826\tRomney\t74826\t0.0012996260000000001\t74826.0\n17833\t-97.031643\t34.962604\tWanette town\tOK\tOklahoma\tPottawatomie County\t420\t38.1\t7.5\t7.0\t14895\t66111\t0.3067\t74878\tRomney\t74878\t0.001026021\t74878.0\n17834\t-97.100213\t35.228117\tPink town\tOK\tOklahoma\tPottawatomie County\t1273\t41.1\t11.2\t7.9\t17155\t77400\t0.3067\t74873\tRomney\t74873\t0.00310982\t74873.0\n17835\t-97.03689200000001\t35.304849\tBethel Acres town\tOK\tOklahoma\tPottawatomie County\t3048\t40.9\t19.3\t3.5\t21273\t109964\t0.3067\t74873\tRomney\t74873\t0.007445979\t74873.0\n17836\t-95.099194\t34.662306\tAlbion town\tOK\tOklahoma\tPushmataha County\t143\t46.7\t14.7\t15.0\t14028\t60000\t0.2525\t74521\tRomney\t74521\t0.000349336\t74521.0\n17837\t-95.621532\t34.232559\tAntlers city\tOK\tOklahoma\tPushmataha County\t2623\t40.2\t14.7\t10.7\t15337\t62643\t0.2525\t74523\tRomney\t74523\t0.006407744\t74523.0\n17838\t-95.356213\t34.585613\tClayton town\tOK\tOklahoma\tPushmataha County\t724\t40.9\t15.5\t9.8\t14286\t52500\t0.2525\t74536\tRomney\t74536\t0.0017686639999999999\t74536.0\n17839\t-95.413143\t34.200399\tRattan town\tOK\tOklahoma\tPushmataha County\t240\t43.3\t16.0\t5.0\t15271\t75000\t0.2525\t74760\tRomney\t74760\t0.0005862980000000001\t74760.0\n17840\t-99.376597\t35.636082\tHammon town\tOK\tOklahoma\tRoger Mills County\t469\t40.3\t15.3\t6.0\t17334\t69500\t0.1625\t73650\tRomney\t73650\t0.001145723\t73650.0\n17841\t-99.677684\t35.610469\tCheyenne town\tOK\tOklahoma\tRoger Mills County\t797\t44.1\t17.9\t2.1\t19953\t78333\t0.1625\t73628\tRomney\t73628\t0.0019469970000000002\t73628.0\n17842\t-99.600368\t35.670108\tStrong City town\tOK\tOklahoma\tRoger Mills County\t42\t49.4\t16.1\t4.2\t20525\t55000\t0.1625\t73628\tRomney\t73628\t0.000102602\t73628.0\n17843\t-99.923692\t35.650148\tReydon town\tOK\tOklahoma\tRoger Mills County\t179\t47.8\t15.6\t3.0\t20285\t78000\t0.1625\t73660\tRomney\t73660\t0.00043728\t73660.0\n17844\t-95.755075\t36.181551\tCatoosa city\tOK\tOklahoma\tRogers County\t5926\t36.2\t15.0\t9.5\t21808\t97115\t0.2493\t74015\tRomney\t74015\t0.014476665\t74015.0\n17845\t-95.710399\t36.445612\tOologah town\tOK\tOklahoma\tRogers County\t1001\t35.3\t14.2\t8.5\t20080\t100000\t0.2493\t74053\tRomney\t74053\t0.00244535\t74053.0\n17846\t-95.747698\t36.314344\tLimestone CDP\tOK\tOklahoma\tRogers County\t890\t40.4\t39.2\t5.5\t29995\t205833\t0.2493\t74055\tRomney\t74055\t0.002174187\t74055.0\n17847\t-95.434572\t36.535032\tChelsea city\tOK\tOklahoma\tRogers County\t2062\t34.1\t11.7\t7.4\t14915\t68514\t0.2493\t74016\tRomney\t74016\t0.0050372740000000004\t74016.0\n17848\t-95.736789\t36.282617\tValley Park town\tOK\tOklahoma\tRogers County\t44\t41.3\t41.4\t4.8\t30113\t250000\t0.2493\t74055\tRomney\t74055\t0.000107488\t74055.0\n17849\t-95.516424\t36.459590000000006\tBushyhead CDP\tOK\tOklahoma\tRogers County\t1376\t37.4\t9.6\t7.8\t18771\t79118\t0.2493\t74016\tRomney\t74016\t0.00336144\t74016.0\n17850\t-95.574108\t36.169728000000006\tGregory CDP\tOK\tOklahoma\tRogers County\t201\t38.8\t17.6\t4.8\t24474\t140278\t0.2493\t74036\tRomney\t74036\t0.0004910240000000001\t74036.0\n17851\t-95.59653\t36.379737\tSequoyah CDP\tOK\tOklahoma\tRogers County\t764\t39.5\t23.6\t5.4\t25745\t147115\t0.2493\t74017\tRomney\t74017\t0.001866381\t74017.0\n17852\t-95.552369\t36.131133\tInola town\tOK\tOklahoma\tRogers County\t2028\t37.4\t12.1\t7.6\t19391\t93790\t0.2493\t74036\tRomney\t74036\t0.004954215\t74036.0\n17853\t-95.69967199999999\t36.530105\tTalala town\tOK\tOklahoma\tRogers County\t287\t36.0\t15.1\t5.6\t20221\t93750\t0.2493\t74080\tRomney\t74080\t0.000701114\t74080.0\n17854\t-95.621625\t36.312697\tClaremore city\tOK\tOklahoma\tRogers County\t17516\t36.7\t18.8\t8.0\t22874\t109859\t0.2493\t74017\tRomney\t74017\t0.042789953\t74017.0\n17855\t-95.563538\t36.290881\tJustice CDP\tOK\tOklahoma\tRogers County\t1421\t42.1\t17.8\t10.4\t24377\t151453\t0.2493\t74017\tRomney\t74017\t0.00347137\t74017.0\n17856\t-95.629594\t36.569108\tJamestown town\tOK\tOklahoma\tRogers County\t11\t0.0\t16.7\t0.0\t19533\t112500\t0.2493\t74080\tRomney\t74080\t2.6899999999999997e-05\t74080.0\n17857\t-95.53621\t36.248312\tTaiwah CDP\tOK\tOklahoma\tRogers County\t201\t39.4\t14.5\t7.1\t18721\t119444\t0.2493\t74036\tRomney\t74036\t0.0004910240000000001\t74036.0\n17858\t-95.52273100000001\t36.431468\tFoyil town\tOK\tOklahoma\tRogers County\t274\t38.6\t12.1\t4.8\t19087\t80556\t0.2493\t74017\tRomney\t74017\t0.0006693560000000001\t74017.0\n17859\t-96.525438\t34.946711\tSasakwa town\tOK\tOklahoma\tSeminole County\t140\t43.8\t10.5\t9.4\t12331\t49000\t0.3487\t74867\tRomney\t74867\t0.00034200699999999997\t74867.0\n17860\t-96.59828\t35.173675\tLima town\tOK\tOklahoma\tSeminole County\t69\t42.1\t6.5\t6.7\t16540\t55000\t0.3487\t748HH\tRomney\t748HH\t0.000168561\t0.0\n17861\t-96.67519\t35.240034\tSeminole city\tOK\tOklahoma\tSeminole County\t7035\t35.4\t17.1\t11.2\t16808\t62344\t0.3487\t74868\tRomney\t74868\t0.017185848\t74868.0\n17862\t-96.459274\t35.362356\tCromwell town\tOK\tOklahoma\tSeminole County\t246\t45.1\t10.3\t19.3\t16278\t70000\t0.3487\t74837\tRomney\t74837\t0.000600955\t74837.0\n17863\t-96.66933399999999\t35.147458\tBowlegs town\tOK\tOklahoma\tSeminole County\t351\t45.7\t8.2\t10.4\t16336\t50000\t0.3487\t74830\tRomney\t74830\t0.00085746\t74830.0\n17864\t-96.496616\t35.144135\tWewoka city\tOK\tOklahoma\tSeminole County\t3330\t37.1\t13.4\t13.1\t14976\t41829\t0.3487\t74884\tRomney\t74884\t0.008134879\t74884.0\n17865\t-96.75394200000001\t34.958196\tKonawa city\tOK\tOklahoma\tSeminole County\t1410\t35.0\t13.1\t15.8\t11570\t52069\t0.3487\t74849\tRomney\t74849\t0.003444498\t74849.0\n17866\t-94.601626\t35.403729\tMuldrow town\tOK\tOklahoma\tSequoyah County\t3618\t36.5\t9.9\t9.6\t16790\t80215\t0.3045\t74948\tRomney\t74948\t0.008838436\t74948.0\n17867\t-94.80435200000001\t35.62315\tFlute Springs CDP\tOK\tOklahoma\tSequoyah County\t188\t37.5\t8.1\t16.4\t16347\t66250\t0.3045\t74945\tRomney\t74945\t0.000459266\t74945.0\n17868\t-95.08999200000001\t35.585504\tNotchietown CDP\tOK\tOklahoma\tSequoyah County\t451\t42.5\t19.8\t10.8\t19611\t86250\t0.3045\t74435\tRomney\t74435\t0.001101751\t74435.0\n17869\t-94.859348\t35.546518\tDwight Mission CDP\tOK\tOklahoma\tSequoyah County\t33\t33.8\t4.8\t15.4\t16394\t70000\t0.3045\t74945\tRomney\t74945\t8.06e-05\t74945.0\n17870\t-95.074434\t35.613795\tParadise Hill town\tOK\tOklahoma\tSequoyah County\t104\t42.5\t20.8\t8.3\t20440\t90000\t0.3045\t74435\tRomney\t74435\t0.000254062\t74435.0\n17871\t-94.914379\t35.619689\tEvening Shade CDP\tOK\tOklahoma\tSequoyah County\t473\t44.8\t15.0\t13.0\t17863\t69167\t0.3045\t74427\tRomney\t74427\t0.001155495\t74427.0\n17872\t-94.550674\t35.536682\tBelfonte CDP\tOK\tOklahoma\tSequoyah County\t459\t37.9\t7.6\t9.7\t17069\t80417\t0.3045\t74948\tRomney\t74948\t0.001121294\t74948.0\n17873\t-94.84843000000001\t35.491169\tMcKey CDP\tOK\tOklahoma\tSequoyah County\t142\t42.7\t8.0\t8.8\t18797\t87500\t0.3045\t74955\tRomney\t74955\t0.00034689300000000003\t74955.0\n17874\t-94.788127\t35.363793\tBrent CDP\tOK\tOklahoma\tSequoyah County\t536\t40.5\t9.7\t10.6\t16841\t76364\t0.3045\t74936\tRomney\t74936\t0.001309398\t74936.0\n17875\t-94.891108\t35.531539\tPinhook Corners CDP\tOK\tOklahoma\tSequoyah County\t169\t39.5\t13.3\t15.2\t17548\t78750\t0.3045\t74962\tRomney\t74962\t0.000412851\t74962.0\n17876\t-94.66993599999999\t35.504011\tAkins CDP\tOK\tOklahoma\tSequoyah County\t468\t41.0\t18.4\t10.1\t16272\t87273\t0.3045\t74936\tRomney\t74936\t0.00114328\t74936.0\n17877\t-94.511482\t35.415799\tRoland town\tOK\tOklahoma\tSequoyah County\t2791\t31.7\t8.6\t6.6\t14359\t87009\t0.3045\t74954\tRomney\t74954\t0.006818151999999999\t74954.0\n17878\t-94.498667\t35.457814\tRemy CDP\tOK\tOklahoma\tSequoyah County\t441\t36.9\t8.1\t8.1\t18605\t92222\t0.3045\t74954\tRomney\t74954\t0.001077322\t74954.0\n17879\t-95.025258\t35.563319\tRedbird Smith CDP\tOK\tOklahoma\tSequoyah County\t439\t43.8\t15.9\t13.3\t18148\t76818\t0.3045\t74962\tRomney\t74962\t0.001072436\t74962.0\n17880\t-94.54718100000001\t35.499128999999996\tLong CDP\tOK\tOklahoma\tSequoyah County\t391\t37.8\t7.7\t9.7\t17073\t81250\t0.3045\t74948\tRomney\t74948\t0.000955177\t74948.0\n17881\t-94.498983\t35.589344\tShort CDP\tOK\tOklahoma\tSequoyah County\t349\t38.5\t8.2\t10.3\t15883\t73889\t0.3045\t74948\tRomney\t74948\t0.0008525739999999999\t74948.0\n17882\t-94.971595\t35.497184000000004\tVian town\tOK\tOklahoma\tSequoyah County\t1483\t39.1\t15.8\t10.1\t12990\t62885\t0.3045\t74962\tRomney\t74962\t0.003622831\t74962.0\n17883\t-95.113382\t35.541314\tGore town\tOK\tOklahoma\tSequoyah County\t927\t43.8\t16.6\t10.1\t17648\t88611\t0.3045\t74435\tRomney\t74435\t0.002264574\t74435.0\n17884\t-94.663517\t35.584726\tStony Point CDP\tOK\tOklahoma\tSequoyah County\t184\t40.4\t18.3\t9.6\t16313\t87500\t0.3045\t74931\tRomney\t74931\t0.000449495\t74931.0\n17885\t-95.032156\t35.503997\tCarlile CDP\tOK\tOklahoma\tSequoyah County\t704\t43.5\t16.9\t10.7\t17841\t88043\t0.3045\t74962\tRomney\t74962\t0.0017198060000000002\t74962.0\n17886\t-94.694108\t35.387075\tGans town\tOK\tOklahoma\tSequoyah County\t220\t38.3\t10.0\t11.1\t17755\t74000\t0.3045\t74936\tRomney\t74936\t0.000537439\t74936.0\n17887\t-94.447429\t35.38947\tMoffett town\tOK\tOklahoma\tSequoyah County\t180\t35.3\t8.5\t8.2\t13815\t49375\t0.3045\t74946\tRomney\t74946\t0.00043972300000000005\t74946.0\n17888\t-94.821658\t35.541946\tMarble City Community CDP\tOK\tOklahoma\tSequoyah County\t434\t37.4\t8.1\t16.7\t16342\t65500\t0.3045\t74945\tRomney\t74945\t0.001060221\t74945.0\n17889\t-94.74316\t35.557894\tBrushy CDP\tOK\tOklahoma\tSequoyah County\t815\t38.4\t11.1\t14.7\t16327\t72353\t0.3045\t74945\tRomney\t74945\t0.001990969\t74945.0\n17890\t-94.818634\t35.582336\tMarble City town\tOK\tOklahoma\tSequoyah County\t250\t37.1\t7.9\t16.5\t16349\t68000\t0.3045\t74945\tRomney\t74945\t0.0006107269999999999\t74945.0\n17891\t-94.806565\t35.461703\tSallisaw city\tOK\tOklahoma\tSequoyah County\t8305\t37.7\t17.4\t16.2\t17335\t86291\t0.3045\t74955\tRomney\t74955\t0.02028834\t74955.0\n17892\t-94.938535\t35.537437\tSycamore CDP\tOK\tOklahoma\tSequoyah County\t159\t41.3\t17.4\t12.7\t18638\t85714\t0.3045\t74962\tRomney\t74962\t0.000388422\t74962.0\n17893\t-97.969024\t34.423179\tMeridian CDP\tOK\tOklahoma\tStephens County\t1450\t42.7\t9.3\t7.6\t15715\t71290\t0.2338\t73529\tRomney\t73529\t0.003542215\t73529.0\n17894\t-97.661552\t34.454692\tVelma town\tOK\tOklahoma\tStephens County\t642\t37.4\t13.2\t9.3\t16830\t64412\t0.2338\t73491\tRomney\t73491\t0.001568346\t73491.0\n17895\t-98.0697\t34.469715\tEmpire City town\tOK\tOklahoma\tStephens County\t734\t43.7\t15.1\t4.3\t17829\t98056\t0.2338\t73533\tRomney\t73533\t0.001793093\t73533.0\n17896\t-98.08916500000001\t34.617036\tCentral High town\tOK\tOklahoma\tStephens County\t952\t43.8\t19.3\t7.9\t19838\t96667\t0.2338\t73567\tRomney\t73567\t0.002325647\t73567.0\n17897\t-98.050949\t34.353966\tComanche city\tOK\tOklahoma\tStephens County\t1512\t41.0\t11.6\t10.2\t16023\t46700\t0.2338\t73529\tRomney\t73529\t0.003693675\t73529.0\n17898\t-97.95992700000001\t34.532379\tDuncan city\tOK\tOklahoma\tStephens County\t22382\t42.0\t22.9\t9.6\t22167\t92356\t0.2338\t73533\tRomney\t73533\t0.054677137\t73533.0\n17899\t-97.957775\t34.629199\tMarlow city\tOK\tOklahoma\tStephens County\t5278\t42.5\t19.1\t13.2\t16571\t76444\t0.2338\t73055\tRomney\t73055\t0.012893661\t73055.0\n17900\t-97.680675\t34.32953\tLoco town\tOK\tOklahoma\tStephens County\t158\t46.7\t11.3\t4.3\t16499\t62500\t0.2338\t73442\tRomney\t73442\t0.000385979\t73442.0\n17901\t-97.820734\t34.615992\tBray town\tOK\tOklahoma\tStephens County\t1002\t43.7\t16.8\t8.3\t16408\t93542\t0.2338\t73055\tRomney\t73055\t0.0024477920000000003\t73055.0\n17902\t-101.214662\t36.861825\tHooker city\tOK\tOklahoma\tTexas County\t1771\t37.8\t19.8\t4.5\t18520\t79787\t0.1488\t73945\tRomney\t73945\t0.004326388\t73945.0\n17903\t-101.632543\t36.594221000000005\tGoodwell town\tOK\tOklahoma\tTexas County\t1179\t23.0\t51.1\t8.0\t19789\t83636\t0.1488\t73939\tRomney\t73939\t0.002880187\t73939.0\n17904\t-101.193623\t36.61483\tHardesty town\tOK\tOklahoma\tTexas County\t273\t32.5\t20.6\t3.4\t15206\t73000\t0.1488\t73944\tRomney\t73944\t0.0006669139999999999\t73944.0\n17905\t-101.067999\t36.955593\tTyrone town\tOK\tOklahoma\tTexas County\t837\t32.0\t8.1\t2.8\t19737\t58519\t0.1488\t73951\tRomney\t73951\t0.002044713\t73951.0\n17906\t-101.349693\t36.762039\tOptima town\tOK\tOklahoma\tTexas County\t262\t32.5\t21.0\t3.5\t15213\t72500\t0.1488\t73945\tRomney\t73945\t0.000640042\t73945.0\n17907\t-101.47841600000001\t36.689713\tGuymon city\tOK\tOklahoma\tTexas County\t11598\t31.0\t21.1\t7.5\t19168\t98112\t0.1488\t73942\tRomney\t73942\t0.028332831\t73942.0\n17908\t-101.787809\t36.505067\tTexhoma town\tOK\tOklahoma\tTexas County\t919\t34.9\t20.3\t7.1\t14695\t66304\t0.1488\t73949\tRomney\t73949\t0.002245031\t73949.0\n17909\t-98.68781\t34.23103\tGrandfield city\tOK\tOklahoma\tTillman County\t1080\t42.6\t17.0\t6.0\t16477\t58929\t0.33299999999999996\t73546\tRomney\t73546\t0.0026383390000000004\t73546.0\n17910\t-99.13844399999999\t34.501816999999996\tTipton town\tOK\tOklahoma\tTillman County\t752\t41.2\t21.3\t7.9\t17161\t54524\t0.33299999999999996\t73570\tRomney\t73570\t0.001837066\t73570.0\n17911\t-98.98086500000001\t34.507262\tManitou town\tOK\tOklahoma\tTillman County\t237\t40.4\t13.8\t4.5\t18899\t46000\t0.33299999999999996\t73555\tRomney\t73555\t0.000578969\t73555.0\n17912\t-98.870521\t34.341109\tHollister town\tOK\tOklahoma\tTillman County\t51\t39.2\t13.5\t5.3\t18941\t45000\t0.33299999999999996\t73551\tRomney\t73551\t0.000124588\t73551.0\n17913\t-98.770742\t34.304635\tLoveland town\tOK\tOklahoma\tTillman County\t14\t48.8\t11.1\t0.0\t15981\t0\t0.33299999999999996\t73553\tRomney\t73553\t3.4200000000000005e-05\t73553.0\n17914\t-99.01056899999999\t34.370605\tFrederick city\tOK\tOklahoma\tTillman County\t4304\t39.7\t14.1\t6.2\t17103\t41162\t0.33299999999999996\t735XX\tRomney\t735XX\t0.01051427\t0.0\n17915\t-99.07811600000001\t34.242125\tDavidson town\tOK\tOklahoma\tTillman County\t302\t41.2\t10.9\t13.0\t18378\t42273\t0.33299999999999996\t73530\tRomney\t73530\t0.000737758\t73530.0\n17916\t-96.06066700000001\t36.087024\tOakhurst CDP\tOK\tOklahoma\tTulsa County\t2765\t38.0\t9.4\t9.1\t21153\t67160\t0.3632\t74050\tRomney\t74050\t0.006754637\t74050.0\n17917\t-95.77639\t36.28884\tOwasso city\tOK\tOklahoma\tTulsa County\t26998\t32.9\t26.8\t4.6\t26449\t134787\t0.3632\t74055\tRomney\t74055\t0.065953594\t74055.0\n17918\t-96.20920699999999\t36.133429\tLotsee town\tOK\tOklahoma\tTulsa County\t12\t0.0\t12.5\t0.0\t20255\t0\t0.3632\t74063\tRomney\t74063\t2.9299999999999997e-05\t74063.0\n17919\t-95.97869399999999\t35.868751\tLiberty town\tOK\tOklahoma\tTulsa County\t201\t37.3\t19.5\t6.3\t21718\t106818\t0.3632\t74047\tRomney\t74047\t0.0004910240000000001\t74047.0\n17920\t-95.79835\t36.373313\tCollinsville city\tOK\tOklahoma\tTulsa County\t5237\t38.3\t11.2\t8.6\t22160\t82585\t0.3632\t74021\tRomney\t74021\t0.012793502\t74021.0\n17921\t-96.00455600000001\t35.952603\tGlenpool city\tOK\tOklahoma\tTulsa County\t10152\t31.9\t20.0\t6.3\t21757\t93570\t0.3632\t74033\tRomney\t74033\t0.024800388\t74033.0\n17922\t-95.973618\t36.001417\tJenks city\tOK\tOklahoma\tTulsa County\t13700\t36.3\t36.3\t4.7\t28835\t146962\t0.3632\t74037\tRomney\t74037\t0.033467821\t74037.0\n17923\t-96.128263\t36.206315000000004\tSand Springs city\tOK\tOklahoma\tTulsa County\t17888\t37.3\t17.9\t7.6\t23541\t96004\t0.3632\t740HH\tRomney\t740HH\t0.04369871400000001\t0.0\n17924\t-95.726242\t36.047443\tBroken Arrow city\tOK\tOklahoma\tTulsa County\t88390\t35.0\t33.0\t5.8\t28007\t134016\t0.3632\t74014\tRomney\t74014\t0.21592851899999999\t74014.0\n17925\t-95.780221\t36.247599\tTulsa city\tOK\tOklahoma\tTulsa County\t398609\t35.7\t30.5\t8.6\t26494\t106965\t0.3632\t74055\tRomney\t74055\t0.9737645779999999\t74055.0\n17926\t-95.98734300000001\t36.296387\tSperry town\tOK\tOklahoma\tTulsa County\t1014\t33.9\t8.9\t8.1\t15225\t44872\t0.3632\t74073\tRomney\t74073\t0.002477107\t74073.0\n17927\t-95.798805\t35.959204\tBixby city\tOK\tOklahoma\tTulsa County\t17984\t37.6\t30.1\t5.8\t30646\t147875\t0.3632\t74011\tRomney\t74011\t0.043933232999999995\t74011.0\n17928\t-95.97145\t36.242222999999996\tTurley CDP\tOK\tOklahoma\tTulsa County\t3093\t35.9\t6.8\t13.5\t17587\t44290\t0.3632\t74130\tRomney\t74130\t0.00755591\t74130.0\n17929\t-95.703638\t36.172484999999995\tFair Oaks town\tOK\tOklahoma\tWagoner County\t131\t36.3\t13.1\t7.1\t20711\t93333\t0.2715\t74015\tRomney\t74015\t0.000320021\t74015.0\n17930\t-95.438699\t35.841413\tTullahassee town\tOK\tOklahoma\tWagoner County\t103\t45.0\t12.2\t9.1\t20917\t82500\t0.2715\t74454\tRomney\t74454\t0.000251619\t74454.0\n17931\t-95.73870699999999\t36.101769\tNew Tulsa town\tOK\tOklahoma\tWagoner County\t524\t31.2\t23.2\t3.8\t24787\t126136\t0.2715\t74014\tRomney\t74014\t0.001280083\t74014.0\n17932\t-95.587186\t35.88712\tRedbird town\tOK\tOklahoma\tWagoner County\t150\t39.2\t13.5\t8.7\t17440\t80000\t0.2715\t74454\tRomney\t74454\t0.000366436\t74454.0\n17933\t-95.52024300000001\t35.868392\tPorter town\tOK\tOklahoma\tWagoner County\t735\t35.6\t4.4\t16.6\t15346\t48182\t0.2715\t74454\tRomney\t74454\t0.0017955360000000001\t74454.0\n17934\t-95.663485\t35.967119\tCoweta city\tOK\tOklahoma\tWagoner County\t8726\t34.4\t12.6\t7.1\t20785\t113844\t0.2715\t74429\tRomney\t74429\t0.021316803\t74429.0\n17935\t-95.383426\t35.958474\tWagoner city\tOK\tOklahoma\tWagoner County\t9078\t35.8\t14.4\t10.2\t19950\t85690\t0.2715\t74467\tRomney\t74467\t0.022176707\t74467.0\n17936\t-95.314176\t35.866104\tOkay town\tOK\tOklahoma\tWagoner County\t742\t40.6\t14.3\t12.2\t13899\t66833\t0.2715\t74446\tRomney\t74446\t0.0018126370000000002\t74446.0\n17937\t-95.925953\t36.532140999999996\tRamona town\tOK\tOklahoma\tWashington County\t573\t41.1\t16.5\t2.1\t19008\t66053\t0.2609\t74061\tRomney\t74061\t0.001399786\t74061.0\n17938\t-95.944471\t36.766565\tBartlesville city\tOK\tOklahoma\tWashington County\t35602\t41.9\t33.9\t6.8\t26453\t97182\t0.2609\t74006\tRomney\t74006\t0.08697236300000001\t74006.0\n17939\t-95.880913\t36.448762\tVera town\tOK\tOklahoma\tWashington County\t206\t38.8\t8.6\t4.5\t20522\t106944\t0.2609\t74061\tRomney\t74061\t0.000503239\t74061.0\n17940\t-95.92541999999999\t36.900797999999995\tCopan town\tOK\tOklahoma\tWashington County\t795\t45.3\t12.3\t8.8\t18375\t70000\t0.2609\t74022\tRomney\t74022\t0.001942111\t74022.0\n17941\t-95.98123100000001\t36.600993\tOchelata town\tOK\tOklahoma\tWashington County\t599\t33.9\t14.2\t7.0\t19577\t56000\t0.2609\t74051\tRomney\t74051\t0.001463301\t74051.0\n17942\t-95.934209\t36.787438\tDewey city\tOK\tOklahoma\tWashington County\t3096\t43.2\t10.7\t4.8\t17964\t61568\t0.2609\t74029\tRomney\t74029\t0.007563239\t74029.0\n17943\t-99.278391\t35.421872\tCanute town\tOK\tOklahoma\tWashita County\t524\t43.9\t13.3\t7.3\t19980\t83462\t0.1905\t73626\tRomney\t73626\t0.001280083\t73626.0\n17944\t-99.170287\t35.450977\tFoss town\tOK\tOklahoma\tWashita County\t144\t43.1\t15.7\t6.3\t20155\t71667\t0.1905\t73647\tRomney\t73647\t0.00035177900000000003\t73647.0\n17945\t-98.989335\t35.385387\tBessie town\tOK\tOklahoma\tWashita County\t215\t43.7\t15.1\t5.9\t20197\t66250\t0.1905\t73622\tRomney\t73622\t0.000525225\t73622.0\n17946\t-99.133596\t35.282305\tDill City town\tOK\tOklahoma\tWashita County\t563\t42.8\t11.5\t8.2\t16818\t40588\t0.1905\t73641\tRomney\t73641\t0.001375356\t73641.0\n17947\t-98.7822\t35.378929\tCorn town\tOK\tOklahoma\tWashita County\t617\t44.1\t19.4\t3.1\t17227\t68571\t0.1905\t73024\tRomney\t73024\t0.001507273\t73024.0\n17948\t-99.17506\t35.354989\tBurns Flat town\tOK\tOklahoma\tWashita County\t1929\t31.9\t16.8\t8.4\t17753\t66154\t0.1905\t73624\tRomney\t73624\t0.004712367\t73624.0\n17949\t-99.05937800000001\t35.156145\tRocky town\tOK\tOklahoma\tWashita County\t170\t43.4\t21.3\t4.7\t17562\t58000\t0.1905\t73661\tRomney\t73661\t0.000415294\t73661.0\n17950\t-98.671279\t35.34859\tColony town\tOK\tOklahoma\tWashita County\t144\t45.8\t17.6\t10.3\t20102\t88000\t0.1905\t73021\tRomney\t73021\t0.00035177900000000003\t73021.0\n17951\t-99.17347\t35.157047999999996\tSentinel town\tOK\tOklahoma\tWashita County\t839\t42.9\t21.1\t4.8\t17562\t58261\t0.1905\t73664\tRomney\t73664\t0.002049599\t73664.0\n17952\t-98.980954\t35.297056\tNew Cordell city\tOK\tOklahoma\tWashita County\t2782\t43.3\t19.0\t5.8\t17109\t70347\t0.1905\t73632\tRomney\t73632\t0.006796166\t73632.0\n17953\t-98.66794200000001\t36.801154\tAlva city\tOK\tOklahoma\tWoods County\t5122\t34.5\t26.1\t4.6\t20409\t69587\t0.1975\t73717\tRomney\t73717\t0.012512568\t73717.0\n17954\t-98.7887\t36.698852\tAvard town\tOK\tOklahoma\tWoods County\t21\t51.3\t18.8\t0.0\t21618\t75000\t0.1975\t73746\tRomney\t73746\t5.13e-05\t73746.0\n17955\t-98.577628\t36.896719\tCapron town\tOK\tOklahoma\tWoods County\t35\t47.5\t35.7\t0.0\t28217\t80000\t0.1975\t73717\tRomney\t73717\t8.55e-05\t73717.0\n17956\t-99.112978\t36.768035999999995\tFreedom town\tOK\tOklahoma\tWoods County\t225\t47.9\t19.5\t1.6\t19232\t64000\t0.1975\t73842\tRomney\t73842\t0.000549654\t73842.0\n17957\t-98.563508\t36.65958\tDacoma town\tOK\tOklahoma\tWoods County\t120\t47.0\t18.3\t1.4\t21530\t71250\t0.1975\t73731\tRomney\t73731\t0.00029314900000000004\t73731.0\n17958\t-98.881108\t36.584348999999996\tWaynoka city\tOK\tOklahoma\tWoods County\t848\t45.7\t13.1\t4.7\t17743\t38889\t0.1975\t73860\tRomney\t73860\t0.002071585\t73860.0\n17959\t-99.573544\t36.572161\tFort Supply town\tOK\tOklahoma\tWoodward County\t414\t35.8\t19.9\t6.3\t15914\t84167\t0.1601\t73841\tRomney\t73841\t0.001011363\t73841.0\n17960\t-99.16794300000001\t36.230466\tMutual town\tOK\tOklahoma\tWoodward County\t78\t45.8\t25.5\t4.2\t21963\t102083\t0.1601\t73853\tRomney\t73853\t0.000190547\t73853.0\n17961\t-99.406018\t36.424646\tWoodward city\tOK\tOklahoma\tWoodward County\t12706\t37.7\t17.2\t8.3\t21088\t89054\t0.1601\t73801\tRomney\t73801\t0.031039572\t73801.0\n17962\t-99.338337\t36.275118\tSharon town\tOK\tOklahoma\tWoodward County\t126\t45.0\t19.6\t4.4\t19475\t76250\t0.1601\t73857\tRomney\t73857\t0.000307806\t73857.0\n17963\t-99.20418000000001\t36.438127\tMooreland town\tOK\tOklahoma\tWoodward County\t1305\t42.5\t13.9\t7.5\t17415\t77969\t0.1601\t73852\tRomney\t73852\t0.003187993\t73852.0\n17964\t-117.169046\t44.767922999999996\tRichland city\tOR\tOregon\tBaker County\t135\t57.6\t9.8\t7.1\t18722\t116667\t0.2804\t97870\tObama\t97870\t0.00032544700000000003\t97870.0\n17965\t-117.939619\t44.911865999999996\tHaines city\tOR\tOregon\tBaker County\t395\t44.3\t19.6\t6.4\t16907\t158333\t0.2804\t97833\tObama\t97833\t0.000952233\t97833.0\n17966\t-118.49655800000001\t44.71196\tGreenhorn city\tOR\tOregon\tBaker County\t0\t0.0\t0.0\t0.0\t0\t0\t0.2804\t978XX\tObama\t978XX\t0.0\t0.0\n17967\t-118.18847099999999\t44.446799\tUnity city\tOR\tOregon\tBaker County\t123\t52.3\t11.5\t8.1\t20824\t233333\t0.2804\t97884\tObama\t97884\t0.000296518\t97884.0\n17968\t-117.832733\t44.774443\tBaker City\tOR\tOregon\tBaker County\t9745\t42.7\t15.6\t7.8\t18488\t134522\t0.2804\t97814\tObama\t97814\t0.023492432999999997\t97814.0\n17969\t-118.197402\t44.743497\tSumpter city\tOR\tOregon\tBaker County\t161\t52.7\t12.0\t8.6\t20761\t225000\t0.2804\t97877\tObama\t97877\t0.000388125\t97877.0\n17970\t-117.26671499999999\t44.350084\tHuntington city\tOR\tOregon\tBaker County\t471\t50.5\t4.7\t9.9\t17272\t87917\t0.2804\t97907\tObama\t97907\t0.001135447\t97907.0\n17971\t-117.11079199999999\t44.878126\tHalfway city\tOR\tOregon\tBaker County\t310\t49.4\t14.2\t6.3\t17079\t153571\t0.2804\t97834\tObama\t97834\t0.0007473219999999999\t97834.0\n17972\t-123.218154\t44.674277000000004\tAdair Village city\tOR\tOregon\tBenton County\t641\t40.9\t53.1\t7.5\t29854\t402083\t0.62\t97330\tObama\t97330\t0.001545269\t97330.0\n17973\t-123.29898600000001\t44.316565999999995\tMonroe city\tOR\tOregon\tBenton County\t708\t41.1\t19.2\t10.1\t22512\t216964\t0.62\t97456\tObama\t97456\t0.0017067870000000002\t97456.0\n17974\t-123.277915\t44.569845\tCorvallis city\tOR\tOregon\tBenton County\t52803\t29.5\t57.3\t9.2\t25586\t256302\t0.62\t97331\tObama\t97331\t0.127293065\t97331.0\n17975\t-123.360327\t44.540653999999996\tPhilomath city\tOR\tOregon\tBenton County\t4491\t32.6\t36.1\t9.1\t23667\t214021\t0.62\t97333\tObama\t97333\t0.010826528\t97333.0\n17976\t-122.737128\t45.387223\tRivergrove city\tOR\tOregon\tClackamas County\t328\t41.6\t57.3\t9.4\t32643\t376667\t0.5044\t97035\tObama\t97035\t0.000790715\t97035.0\n17977\t-121.979244\t45.355528\tMount Hood Village CDP\tOR\tOregon\tClackamas County\t4029\t42.0\t30.9\t12.6\t27646\t222667\t0.5044\t97067\tObama\t97067\t0.009712776999999999\t97067.0\n17978\t-122.55705900000001\t45.432503999999994\tSunnyside CDP\tOR\tOregon\tClackamas County\t7688\t29.8\t32.4\t11.9\t31563\t353093\t0.5044\t97015\tObama\t97015\t0.018533589\t97015.0\n17979\t-122.699152\t45.436232000000004\tLake Oswego city\tOR\tOregon\tClackamas County\t37928\t44.3\t64.5\t9.8\t47889\t474474\t0.5044\t97219\tObama\t97219\t0.09143365699999999\t97219.0\n17980\t-122.68994199999999\t45.265538\tCanby city\tOR\tOregon\tClackamas County\t15394\t33.9\t20.0\t10.7\t24606\t262942\t0.5044\t97013\tObama\t97013\t0.03711057\t97013.0\n17981\t-122.333946\t45.292199\tEstacada city\tOR\tOregon\tClackamas County\t2713\t35.2\t12.9\t13.1\t21293\t194565\t0.5044\t97023\tObama\t97023\t0.0065402740000000004\t97023.0\n17982\t-122.269139\t45.398769\tSandy city\tOR\tOregon\tClackamas County\t8280\t35.6\t17.2\t10.5\t24106\t228368\t0.5044\t97055\tObama\t97055\t0.019960733\t97055.0\n17983\t-122.554578\t45.412214\tClackamas CDP\tOR\tOregon\tClackamas County\t5413\t34.5\t26.1\t15.1\t28934\t261549\t0.5044\t97015\tObama\t97015\t0.013049208999999999\t97015.0\n17984\t-122.768449\t45.334990999999995\tWilsonville city\tOR\tOregon\tClackamas County\t17050\t35.3\t41.8\t10.1\t33822\t336342\t0.5044\t97070\tObama\t97070\t0.041102717000000004\t97070.0\n17985\t-122.58095300000001\t45.150572\tMolalla city\tOR\tOregon\tClackamas County\t7789\t31.7\t12.0\t12.3\t25737\t215103\t0.5044\t97038\tObama\t97038\t0.018777071\t97038.0\n17986\t-122.533107\t45.446556\tHappy Valley city\tOR\tOregon\tClackamas County\t7831\t37.7\t46.8\t9.0\t41283\t449048\t0.5044\t97015\tObama\t97015\t0.018878321\t97015.0\n17987\t-122.59301799999999\t45.386595\tGladstone city\tOR\tOregon\tClackamas County\t11959\t39.6\t20.0\t12.0\t25985\t253742\t0.5044\t97027\tObama\t97027\t0.028829759\t97027.0\n17988\t-122.611842\t45.461721000000004\tMilwaukie city\tOR\tOregon\tClackamas County\t21427\t39.6\t21.6\t11.9\t28146\t239463\t0.5044\t97222\tObama\t97222\t0.051654423\t97222.0\n17989\t-122.721874\t45.252396999999995\tBarlow city\tOR\tOregon\tClackamas County\t145\t35.0\t14.1\t12.2\t23557\t262500\t0.5044\t97013\tObama\t97013\t0.000349554\t97013.0\n17990\t-122.57902800000001\t45.404327\tJohnson City\tOR\tOregon\tClackamas County\t699\t43.8\t17.5\t11.3\t26610\t193182\t0.5044\t97027\tObama\t97027\t0.001685091\t97027.0\n17991\t-122.639008\t45.414293\tOak Grove CDP\tOR\tOregon\tClackamas County\t13694\t41.8\t22.7\t14.1\t27430\t234094\t0.5044\t97267\tObama\t97267\t0.033012352\t97267.0\n17992\t-122.59630600000001\t45.345834\tOregon City\tOR\tOregon\tClackamas County\t30267\t35.3\t21.7\t11.7\t25998\t262356\t0.5044\t97045\tObama\t97045\t0.072965157\t97045.0\n17993\t-122.60003700000001\t45.414183\tOatfield CDP\tOR\tOregon\tClackamas County\t16690\t44.8\t27.5\t9.8\t31248\t284643\t0.5044\t97267\tObama\t97267\t0.040234859\t97267.0\n17994\t-122.61516\t45.392739\tJennings Lodge CDP\tOR\tOregon\tClackamas County\t7443\t36.9\t18.3\t12.1\t25483\t239725\t0.5044\t97267\tObama\t97267\t0.017942963\t97267.0\n17995\t-122.641322\t45.367046\tWest Linn city\tOR\tOregon\tClackamas County\t25088\t41.2\t52.7\t9.8\t43611\t418645\t0.5044\t97068\tObama\t97068\t0.060480056\t97068.0\n17996\t-123.92097199999999\t45.9899\tSeaside city\tOR\tOregon\tClatsop County\t5998\t45.2\t21.6\t7.6\t24344\t243182\t0.5534\t971HH\tObama\t971HH\t0.014459478000000001\t0.0\n17997\t-123.91698999999998\t46.024763\tGearhart city\tOR\tOregon\tClatsop County\t1109\t52.8\t36.5\t9.1\t31742\t325000\t0.5534\t971HH\tObama\t971HH\t0.002673485\t0.0\n17998\t-123.809808\t46.18469\tAstoria city\tOR\tOregon\tClatsop County\t9687\t38.9\t24.7\t10.3\t22286\t202005\t0.5534\t97103\tObama\t97103\t0.023352611000000002\t97103.0\n17999\t-123.932745\t46.168501\tWarrenton city\tOR\tOregon\tClatsop County\t4666\t37.2\t16.6\t7.7\t21275\t184403\t0.5534\t97146\tObama\t97146\t0.011248403\t97146.0\n18000\t-123.96063400000001\t45.888616\tCannon Beach city\tOR\tOregon\tClatsop County\t1753\t50.2\t37.8\t8.0\t28812\t378621\t0.5534\t97110\tObama\t97110\t0.004225986\t97110.0\n18001\t-122.947299\t46.092487\tRainier city\tOR\tOregon\tColumbia County\t1925\t44.0\t16.5\t12.8\t25852\t200987\t0.5028\t97048\tObama\t97048\t0.004640629\t97048.0\n18002\t-123.183927\t45.860841\tVernonia city\tOR\tOregon\tColumbia County\t2303\t37.0\t14.8\t13.0\t19048\t206522\t0.5028\t97064\tObama\t97064\t0.00555188\t97064.0\n18003\t-122.815124\t45.857882000000004\tSt. Helens city\tOR\tOregon\tColumbia County\t11916\t34.3\t14.3\t13.9\t22885\t202359\t0.5028\t97051\tObama\t97051\t0.028726098\t97051.0\n18004\t-122.81096399999998\t45.894656\tColumbia City\tOR\tOregon\tColumbia County\t1996\t40.4\t21.6\t11.2\t26305\t254518\t0.5028\t97018\tObama\t97018\t0.00481179\t97018.0\n18005\t-122.878277\t45.755086\tScappoose city\tOR\tOregon\tColumbia County\t6471\t37.8\t20.5\t12.6\t26047\t231148\t0.5028\t97056\tObama\t97056\t0.015599746999999999\t97056.0\n18006\t-122.887978\t46.048185\tPrescott city\tOR\tOregon\tColumbia County\t80\t43.3\t15.8\t16.7\t22566\t187500\t0.5028\t97048\tObama\t97048\t0.000192857\t97048.0\n18007\t-123.205389\t46.103383\tClatskanie city\tOR\tOregon\tColumbia County\t1648\t40.3\t15.2\t13.9\t23062\t176733\t0.5028\t97016\tObama\t97016\t0.003972860999999999\t97016.0\n18008\t-124.18423200000001\t43.179916999999996\tCoquille city\tOR\tOregon\tCoos County\t4131\t43.5\t14.2\t13.9\t20753\t147346\t0.4478\t97423\tObama\t97423\t0.00995867\t97423.0\n18009\t-124.072345\t42.886095000000005\tPowers city\tOR\tOregon\tCoos County\t745\t48.9\t13.3\t14.6\t16090\t104167\t0.4478\t97466\tObama\t97466\t0.001795984\t97466.0\n18010\t-124.415361\t43.115006\tBandon city\tOR\tOregon\tCoos County\t3009\t53.3\t20.8\t12.2\t23176\t184829\t0.4478\t97411\tObama\t97411\t0.0072538459999999996\t97411.0\n18011\t-124.173275\t43.579356\tLakeside city\tOR\tOregon\tCoos County\t1608\t58.0\t10.0\t11.2\t20861\t139450\t0.4478\t97449\tObama\t97449\t0.003876432\t97449.0\n18012\t-124.133126\t43.061592\tMyrtle Point city\tOR\tOregon\tCoos County\t2434\t43.6\t12.2\t14.6\t17142\t133201\t0.4478\t97458\tObama\t97458\t0.005867684000000001\t97458.0\n18013\t-124.208279\t43.350117\tBunker Hill CDP\tOR\tOregon\tCoos County\t1455\t43.5\t10.4\t20.4\t17122\t131250\t0.4478\t97420\tObama\t97420\t0.003507593\t97420.0\n18014\t-124.23695900000001\t43.404713\tNorth Bend city\tOR\tOregon\tCoos County\t9274\t41.6\t21.6\t9.4\t21831\t164414\t0.4478\t97459\tObama\t97459\t0.022356985\t97459.0\n18015\t-124.30561200000001\t43.347066999999996\tBarview CDP\tOR\tOregon\tCoos County\t1806\t47.5\t11.7\t17.2\t15754\t145553\t0.4478\t97420\tObama\t97420\t0.0043537540000000005\t97420.0\n18016\t-124.241666\t43.372510999999996\tCoos Bay city\tOR\tOregon\tCoos County\t15392\t43.0\t18.1\t13.4\t21532\t146716\t0.4478\t97420\tObama\t97420\t0.037105749\t97420.0\n18017\t-120.863766\t44.298766\tPrineville city\tOR\tOregon\tCrook County\t9393\t35.8\t13.6\t13.9\t18316\t149567\t0.3034\t97754\tObama\t97754\t0.02264386\t97754.0\n18018\t-124.42311799999999\t42.397137\tGold Beach city\tOR\tOregon\tCurry County\t1886\t50.4\t24.1\t9.6\t20289\t180990\t0.396\t97444\tObama\t97444\t0.004546611\t97444.0\n18019\t-124.49682299999999\t42.74938\tPort Orford city\tOR\tOregon\tCurry County\t1131\t56.9\t24.0\t10.8\t17745\t153676\t0.396\t97465\tObama\t97465\t0.00272652\t97465.0\n18020\t-124.29043100000001\t42.060173999999996\tBrookings city\tOR\tOregon\tCurry County\t5727\t47.4\t18.6\t7.7\t22782\t230547\t0.396\t97415\tObama\t97415\t0.013806174\t97415.0\n18021\t-124.25168700000002\t42.038768\tHarbor CDP\tOR\tOregon\tCurry County\t2588\t60.3\t11.6\t9.3\t20933\t104667\t0.396\t97415\tObama\t97415\t0.006238934\t97415.0\n18022\t-121.18336799999999\t44.339569\tTerrebonne CDP\tOR\tOregon\tDeschutes County\t1910\t44.5\t17.3\t13.3\t23181\t223643\t0.4513\t97760\tObama\t97760\t0.004604469\t97760.0\n18023\t-121.518548\t43.719136\tLa Pine CDP\tOR\tOregon\tDeschutes County\t7131\t49.4\t10.3\t17.7\t18519\t144256\t0.4513\t97739\tObama\t97739\t0.01719082\t97739.0\n18024\t-121.30960400000001\t44.054464\tBend city\tOR\tOregon\tDeschutes County\t79335\t37.0\t32.3\t12.3\t27391\t215244\t0.4513\t97702\tObama\t97702\t0.19125419600000002\t97702.0\n18025\t-121.551973\t44.291609\tSisters city\tOR\tOregon\tDeschutes County\t1710\t44.1\t26.5\t14.1\t25026\t232386\t0.4513\t97759\tObama\t97759\t0.004122325\t97759.0\n18026\t-121.17600900000001\t44.260927\tRedmond city\tOR\tOregon\tDeschutes County\t18828\t36.0\t16.4\t13.8\t21069\t164590\t0.4513\t97756\tObama\t97756\t0.04538897099999999\t97756.0\n18027\t-121.46836599999999\t43.8231\tThree Rivers CDP\tOR\tOregon\tDeschutes County\t3486\t42.3\t24.3\t14.3\t22399\t165000\t0.4513\t97707\tObama\t97707\t0.008403758\t97707.0\n18028\t-121.357801\t43.990419\tDeschutes River Woods CDP\tOR\tOregon\tDeschutes County\t5575\t38.9\t13.3\t13.8\t22568\t169133\t0.4513\t97702\tObama\t97702\t0.013439745\t97702.0\n18029\t-123.299773\t42.990444000000004\tTri-City CDP\tOR\tOregon\tDouglas County\t3801\t40.1\t7.8\t14.1\t17203\t142651\t0.3443\t97417\tObama\t97417\t0.009163134\t97417.0\n18030\t-123.066507\t43.302895\tGlide CDP\tOR\tOregon\tDouglas County\t1749\t44.6\t17.9\t9.8\t21430\t205588\t0.3443\t97443\tObama\t97443\t0.004216343\t97443.0\n18031\t-124.17509799999999\t43.679058000000005\tWinchester Bay CDP\tOR\tOregon\tDouglas County\t490\t52.9\t19.1\t21.1\t23263\t132500\t0.3443\t97441\tObama\t97441\t0.0011812510000000001\t97441.0\n18032\t-123.30368500000002\t43.263811\tRoseburg North CDP\tOR\tOregon\tDouglas County\t5292\t43.5\t12.3\t11.7\t20284\t118310\t0.3443\t97470\tObama\t97470\t0.012757512\t97470.0\n18033\t-123.38566100000001\t43.150673\tGreen CDP\tOR\tOregon\tDouglas County\t7362\t35.7\t11.9\t11.3\t18779\t142557\t0.3443\t97496\tObama\t97496\t0.017747695\t97496.0\n18034\t-123.35503600000001\t43.221923\tRoseburg city\tOR\tOregon\tDouglas County\t20900\t42.4\t19.9\t11.9\t22020\t176389\t0.3443\t97470\tObama\t97470\t0.050383975\t97470.0\n18035\t-123.282246\t43.026413\tMyrtle Creek city\tOR\tOregon\tDouglas County\t3630\t38.9\t14.0\t14.5\t18417\t149830\t0.3443\t97457\tObama\t97457\t0.008750901\t97457.0\n18036\t-123.280901\t42.927446999999994\tCanyonville city\tOR\tOregon\tDouglas County\t1344\t44.9\t13.0\t15.5\t15789\t139881\t0.3443\t97417\tObama\t97417\t0.003240003\t97417.0\n18037\t-124.112508\t43.698141\tReedsport city\tOR\tOregon\tDouglas County\t4265\t51.1\t17.0\t15.8\t19072\t140916\t0.3443\t97441\tObama\t97441\t0.010281706\t97441.0\n18038\t-123.31495\t43.661727\tDrain city\tOR\tOregon\tDouglas County\t1039\t43.4\t12.6\t14.0\t17498\t159615\t0.3443\t97435\tObama\t97435\t0.0025047339999999998\t97435.0\n18039\t-123.429105\t42.737997\tGlendale city\tOR\tOregon\tDouglas County\t884\t36.8\t6.4\t10.0\t16364\t124760\t0.3443\t97442\tObama\t97442\t0.002131073\t97442.0\n18040\t-123.297063\t43.42327\tOakland city\tOR\tOregon\tDouglas County\t995\t45.4\t15.0\t12.5\t16358\t158929\t0.3443\t97479\tObama\t97479\t0.002398663\t97479.0\n18041\t-123.56783200000001\t43.636938\tElkton city\tOR\tOregon\tDouglas County\t134\t47.3\t13.3\t14.3\t20199\t191667\t0.3443\t97436\tObama\t97436\t0.00032303599999999996\t97436.0\n18042\t-123.31725\t43.386426\tSutherlin city\tOR\tOregon\tDouglas County\t7727\t41.9\t11.1\t13.0\t18308\t138571\t0.3443\t97479\tObama\t97479\t0.018627607\t97479.0\n18043\t-123.36953999999999\t42.954186\tRiddle city\tOR\tOregon\tDouglas County\t1044\t32.8\t7.8\t19.2\t15904\t128697\t0.3443\t97469\tObama\t97469\t0.002516788\t97469.0\n18044\t-123.419454\t43.119766999999996\tWinston city\tOR\tOregon\tDouglas County\t4841\t36.8\t10.0\t13.6\t17212\t137500\t0.3443\t97496\tObama\t97496\t0.011670278999999999\t97496.0\n18045\t-123.287748\t43.600549\tYoncalla city\tOR\tOregon\tDouglas County\t1099\t40.1\t6.3\t11.9\t14573\t122629\t0.3443\t97499\tObama\t97499\t0.002649377\t97499.0\n18046\t-120.185184\t45.236508\tCondon city\tOR\tOregon\tGilliam County\t736\t49.1\t14.5\t11.3\t21542\t126471\t0.3497\t97823\tObama\t97823\t0.001774287\t97823.0\n18047\t-119.883976\t45.08872\tLonerock city\tOR\tOregon\tGilliam County\t23\t46.3\t6.3\t8.3\t20703\t131250\t0.3497\t97830\tObama\t97830\t5.539999999999999e-05\t97830.0\n18048\t-120.19424\t45.720222\tArlington city\tOR\tOregon\tGilliam County\t504\t44.5\t11.9\t5.5\t23293\t134896\t0.3497\t97812\tObama\t97812\t0.001215001\t97812.0\n18049\t-118.976757\t44.135221\tSeneca city\tOR\tOregon\tGrant County\t207\t47.7\t23.0\t9.0\t16083\t135000\t0.2181\t97873\tObama\t97873\t0.000499018\t97873.0\n18050\t-119.420728\t44.820634000000005\tMonument city\tOR\tOregon\tGrant County\t136\t48.0\t14.3\t9.5\t19194\t134375\t0.2181\t97864\tObama\t97864\t0.000327857\t97864.0\n18051\t-118.94939699999999\t44.393041\tCanyon City town\tOR\tOregon\tGrant County\t643\t41.0\t22.1\t8.3\t24132\t160000\t0.2181\t97845\tObama\t97845\t0.001550091\t97845.0\n18052\t-119.113274\t44.416901\tMount Vernon city\tOR\tOregon\tGrant County\t562\t45.8\t16.9\t9.0\t20271\t113971\t0.2181\t97865\tObama\t97865\t0.0013548229999999998\t97865.0\n18053\t-118.95188300000001\t44.419299\tJohn Day city\tOR\tOregon\tGrant County\t1783\t41.1\t17.9\t7.8\t20477\t135500\t0.2181\t97845\tObama\t97845\t0.004298308\t97845.0\n18054\t-118.419288\t44.810056\tGranite city\tOR\tOregon\tGrant County\t22\t50.0\t5.9\t9.1\t19033\t125000\t0.2181\t978XX\tObama\t978XX\t5.3e-05\t0.0\n18055\t-118.70990400000001\t44.461145\tPrairie City\tOR\tOregon\tGrant County\t990\t48.3\t15.9\t9.4\t19128\t132500\t0.2181\t97869\tObama\t97869\t0.002386609\t97869.0\n18056\t-119.103994\t44.714271000000004\tLong Creek city\tOR\tOregon\tGrant County\t206\t48.2\t14.6\t9.4\t19130\t135000\t0.2181\t97856\tObama\t97856\t0.000496608\t97856.0\n18057\t-119.532105\t44.46703\tDayville town\tOR\tOregon\tGrant County\t128\t47.8\t23.4\t9.1\t16097\t145833\t0.2181\t97825\tObama\t97825\t0.000308572\t97825.0\n18058\t-119.07875700000001\t43.555987\tHines city\tOR\tOregon\tHarney County\t1456\t43.5\t16.9\t12.1\t20758\t134958\t0.2322\t97720\tObama\t97720\t0.003510003\t97720.0\n18059\t-119.061299\t43.58834\tBurns city\tOR\tOregon\tHarney County\t3134\t42.4\t8.8\t13.4\t18610\t97273\t0.2322\t97720\tObama\t97720\t0.007555186\t97720.0\n18060\t-121.59213899999999\t45.513056\tParkdale CDP\tOR\tOregon\tHood River County\t275\t37.2\t26.3\t7.2\t18663\t250000\t0.6158\t97041\tObama\t97041\t0.000662947\t97041.0\n18061\t-121.52201399999998\t45.709934999999994\tHood River city\tOR\tOregon\tHood River County\t6416\t34.5\t34.4\t8.3\t22587\t230284\t0.6158\t97031\tObama\t97031\t0.015467156999999999\t97031.0\n18062\t-121.552073\t45.635302\tOdell CDP\tOR\tOregon\tHood River County\t2050\t31.5\t12.6\t6.1\t17288\t187019\t0.6158\t97031\tObama\t97031\t0.004941969\t97031.0\n18063\t-121.871384\t45.676520000000004\tCascade Locks city\tOR\tOregon\tHood River County\t1166\t38.3\t10.3\t6.6\t17159\t147535\t0.6158\t97014\tObama\t97014\t0.002810895\t97014.0\n18064\t-122.568524\t42.541803\tButte Falls town\tOR\tOregon\tJackson County\t447\t45.5\t12.2\t13.7\t17642\t222917\t0.4578\t97522\tObama\t97522\t0.00107759\t97522.0\n18065\t-122.912733\t42.374419\tCentral Point city\tOR\tOregon\tJackson County\t15515\t36.6\t16.5\t12.4\t21978\t189849\t0.4578\t97502\tObama\t97502\t0.037402267\t97502.0\n18066\t-122.816111\t42.273894\tPhoenix city\tOR\tOregon\tJackson County\t4901\t46.2\t21.0\t16.1\t21946\t113358\t0.4578\t97535\tObama\t97535\t0.011814922\t97535.0\n18067\t-123.05291499999998\t42.435553000000006\tGold Hill city\tOR\tOregon\tJackson County\t1218\t44.3\t19.0\t14.4\t20298\t187500\t0.4578\t97525\tObama\t97525\t0.0029362529999999998\t97525.0\n18068\t-122.818013\t42.611345\tShady Cove city\tOR\tOregon\tJackson County\t2894\t49.6\t14.9\t11.8\t20001\t189271\t0.4578\t97539\tObama\t97539\t0.006976614\t97539.0\n18069\t-122.832378\t42.431639000000004\tWhite City CDP\tOR\tOregon\tJackson County\t7751\t34.6\t11.3\t18.0\t16077\t127140\t0.4578\t97503\tObama\t97503\t0.018685464\t97503.0\n18070\t-122.853581\t42.338527\tMedford city\tOR\tOregon\tJackson County\t71239\t39.4\t24.8\t13.9\t25073\t206661\t0.4578\t97504\tObama\t97504\t0.171737035\t97504.0\n18071\t-122.80053400000001\t42.466058000000004\tEagle Point city\tOR\tOregon\tJackson County\t8038\t34.2\t13.2\t14.7\t18766\t174023\t0.4578\t97524\tObama\t97524\t0.019377339\t97524.0\n18072\t-122.96960200000001\t42.312634\tJacksonville city\tOR\tOregon\tJackson County\t2685\t52.7\t37.4\t11.9\t30181\t284375\t0.4578\t97502\tObama\t97502\t0.006472774000000001\t97502.0\n18073\t-122.699418\t42.190503\tAshland city\tOR\tOregon\tJackson County\t21661\t39.8\t55.1\t13.1\t27798\t306639\t0.4578\t97520\tObama\t97520\t0.052218531\t97520.0\n18074\t-123.168075\t42.43569\tRogue River city\tOR\tOregon\tJackson County\t2097\t52.0\t20.3\t12.4\t21078\t175682\t0.4578\t975HH\tObama\t975HH\t0.005055273\t0.0\n18075\t-122.78106000000001\t42.240522\tTalent city\tOR\tOregon\tJackson County\t6459\t37.3\t25.6\t15.1\t20025\t150377\t0.4578\t97540\tObama\t97540\t0.015570818\t97540.0\n18076\t-121.176529\t44.587990000000005\tMetolius city\tOR\tOregon\tJefferson County\t750\t33.1\t8.5\t18.2\t17865\t129167\t0.4038\t97741\tObama\t97741\t0.0018080370000000002\t97741.0\n18077\t-121.211055\t44.523964\tCulver city\tOR\tOregon\tJefferson County\t1082\t34.4\t13.5\t11.9\t20010\t161765\t0.4038\t97734\tObama\t97734\t0.002608395\t97734.0\n18078\t-121.127812\t44.629799\tMadras city\tOR\tOregon\tJefferson County\t5754\t31.7\t19.1\t14.4\t18078\t162868\t0.4038\t97741\tObama\t97741\t0.013871263\t97741.0\n18079\t-121.28996699999999\t44.796405\tWarm Springs CDP\tOR\tOregon\tJefferson County\t3166\t25.5\t5.6\t26.5\t12262\t110815\t0.4038\t97761\tObama\t97761\t0.007632329\t97761.0\n18080\t-123.646864\t42.167662\tCave Junction city\tOR\tOregon\tJosephine County\t1602\t42.8\t9.5\t21.0\t13533\t118750\t0.3716\t97531\tObama\t97531\t0.003861968\t97531.0\n18081\t-123.38738700000002\t42.422681\tRedwood CDP\tOR\tOregon\tJosephine County\t7774\t41.0\t14.0\t16.4\t21551\t189471\t0.3716\t97527\tObama\t97527\t0.01874091\t97527.0\n18082\t-123.306306\t42.419057\tHarbeck-Fruitdale CDP\tOR\tOregon\tJosephine County\t4307\t45.6\t13.2\t21.3\t17803\t192297\t0.3716\t97526\tObama\t97526\t0.010382956\t97526.0\n18083\t-123.326923\t42.44034\tGrants Pass city\tOR\tOregon\tJosephine County\t24769\t40.4\t16.2\t16.5\t20486\t175109\t0.3716\t97526\tObama\t97526\t0.059711038\t97526.0\n18084\t-121.72507\t42.198077000000005\tAltamont CDP\tOR\tOregon\tKlamath County\t20351\t39.3\t15.3\t13.1\t20159\t138238\t0.2949\t97603\tObama\t97603\t0.049060492000000004\t97603.0\n18085\t-121.59973899999999\t42.025940000000006\tMerrill city\tOR\tOregon\tKlamath County\t891\t40.1\t22.0\t12.3\t20108\t160000\t0.2949\t97633\tObama\t97633\t0.002147948\t97633.0\n18086\t-121.40898500000002\t42.013740999999996\tMalin city\tOR\tOregon\tKlamath County\t615\t31.7\t15.2\t13.0\t16142\t108333\t0.2949\t97632\tObama\t97632\t0.0014825910000000001\t97632.0\n18087\t-121.86768799999999\t42.576375\tChiloquin city\tOR\tOregon\tKlamath County\t729\t44.8\t11.4\t21.9\t15006\t137500\t0.2949\t97624\tObama\t97624\t0.001757412\t97624.0\n18088\t-121.77333300000001\t42.221368\tKlamath Falls city\tOR\tOregon\tKlamath County\t19752\t34.0\t23.1\t14.3\t19497\t144780\t0.2949\t976HH\tObama\t976HH\t0.047616473\t0.0\n18089\t-121.406535\t42.200267\tBonanza town\tOR\tOregon\tKlamath County\t420\t42.8\t17.5\t14.0\t17562\t159167\t0.2949\t97623\tObama\t97623\t0.001012501\t97623.0\n18090\t-120.545542\t42.692572\tPaisley city\tOR\tOregon\tLake County\t245\t47.7\t24.0\t6.5\t20671\t150000\t0.2075\t97636\tObama\t97636\t0.000590626\t97636.0\n18091\t-120.34881000000001\t42.187883\tLakeview town\tOR\tOregon\tLake County\t2381\t45.2\t20.3\t7.2\t19744\t102301\t0.2075\t97630\tObama\t97630\t0.005739915999999999\t97630.0\n18092\t-124.098496\t43.908428\tDunes City\tOR\tOregon\tLane County\t1391\t59.2\t31.9\t12.2\t29621\t288214\t0.5973\t97493\tObama\t97493\t0.0033533070000000002\t97493.0\n18093\t-123.204847\t44.218087\tJunction City\tOR\tOregon\tLane County\t5010\t35.4\t13.5\t9.6\t21186\t190197\t0.5973\t97448\tObama\t97448\t0.01207769\t97448.0\n18094\t-123.11383799999999\t44.053096000000004\tEugene city\tOR\tOregon\tLane County\t149331\t34.6\t39.9\t11.5\t25882\t237250\t0.5973\t97401\tObama\t97401\t0.35999471\t97401.0\n18095\t-122.78183999999999\t43.9208\tLowell city\tOR\tOregon\tLane County\t989\t37.8\t18.3\t14.3\t19076\t168490\t0.5973\t97438\tObama\t97438\t0.002384199\t97438.0\n18096\t-123.06594399999999\t44.138102\tCoburg city\tOR\tOregon\tLane County\t1161\t40.6\t31.4\t8.9\t24442\t249621\t0.5973\t97408\tObama\t97408\t0.002798842\t97408.0\n18097\t-122.50818600000001\t43.757913\tWestfir city\tOR\tOregon\tLane County\t283\t47.4\t18.7\t8.5\t20851\t162500\t0.5973\t97492\tObama\t97492\t0.0006822330000000001\t97492.0\n18098\t-124.10675400000001\t43.990701\tFlorence city\tOR\tOregon\tLane County\t8407\t58.7\t18.8\t14.9\t22824\t175253\t0.5973\t97439\tObama\t97439\t0.020266894\t97439.0\n18099\t-123.35161799999999\t44.047228999999994\tVeneta city\tOR\tOregon\tLane County\t3836\t36.7\t16.5\t15.2\t21072\t199823\t0.5973\t97487\tObama\t97487\t0.009247509000000001\t97487.0\n18100\t-122.97900800000001\t44.053888\tSpringfield city\tOR\tOregon\tLane County\t55858\t33.9\t15.5\t12.9\t20690\t183137\t0.5973\t97477\tObama\t97477\t0.134657804\t97477.0\n18101\t-123.056766\t43.796149\tCottage Grove city\tOR\tOregon\tLane County\t8893\t39.9\t12.1\t12.8\t20080\t185934\t0.5973\t97424\tObama\t97424\t0.021438502\t97424.0\n18102\t-123.018274\t43.918894\tCreswell city\tOR\tOregon\tLane County\t4084\t34.0\t15.2\t13.3\t20077\t188103\t0.5973\t97426\tObama\t97426\t0.009845366\t97426.0\n18103\t-122.465465\t43.744508\tOakridge city\tOR\tOregon\tLane County\t3409\t46.3\t10.8\t14.5\t18471\t129622\t0.5973\t97463\tObama\t97463\t0.008218133\t97463.0\n18104\t-124.00740800000001\t44.97207\tLincoln City\tOR\tOregon\tLincoln County\t7325\t46.9\t20.1\t12.6\t18822\t212821\t0.5831\t97367\tObama\t97367\t0.017658498999999998\t97367.0\n18105\t-124.066344\t44.41726\tWaldport city\tOR\tOregon\tLincoln County\t2199\t49.5\t20.9\t14.1\t21091\t197379\t0.5831\t97394\tObama\t97394\t0.0053011659999999995\t97394.0\n18106\t-123.93386299999999\t44.619506\tToledo city\tOR\tOregon\tLincoln County\t3427\t37.7\t17.1\t10.2\t21412\t176136\t0.5831\t97391\tObama\t97391\t0.008261526\t97391.0\n18107\t-124.031742\t44.871233000000004\tLincoln Beach CDP\tOR\tOregon\tLincoln County\t2232\t59.2\t30.5\t9.9\t28837\t246472\t0.5831\t97341\tObama\t97341\t0.005380719\t97341.0\n18108\t-124.052718\t44.652332\tNewport city\tOR\tOregon\tLincoln County\t9854\t45.2\t30.3\t11.1\t25088\t212939\t0.5831\t97365\tObama\t97365\t0.023755201\t97365.0\n18109\t-124.059698\t44.809328\tDepoe Bay city\tOR\tOregon\tLincoln County\t1274\t55.4\t27.1\t10.8\t26298\t241369\t0.5831\t97341\tObama\t97341\t0.003071253\t97341.0\n18110\t-124.102177\t44.312686\tYachats city\tOR\tOregon\tLincoln County\t642\t54.7\t33.0\t8.7\t23458\t273611\t0.5831\t97498\tObama\t97498\t0.00154768\t97498.0\n18111\t-123.91872\t44.721996000000004\tSiletz city\tOR\tOregon\tLincoln County\t1140\t39.9\t12.8\t9.7\t21274\t171284\t0.5831\t97380\tObama\t97380\t0.0027482170000000003\t97380.0\n18112\t-123.88796699999999\t45.018607\tRose Lodge CDP\tOR\tOregon\tLincoln County\t1746\t47.8\t13.4\t9.1\t20387\t165865\t0.5831\t97368\tObama\t97368\t0.004209111\t97368.0\n18113\t-122.849553\t44.704589\tScio city\tOR\tOregon\tLinn County\t824\t39.6\t15.9\t11.7\t21196\t194792\t0.3963\t97374\tObama\t97374\t0.00198643\t97374.0\n18114\t-122.901183\t44.507672\tSouth Lebanon CDP\tOR\tOregon\tLinn County\t1379\t44.1\t10.3\t16.8\t21659\t189935\t0.3963\t97355\tObama\t97355\t0.003324378\t97355.0\n18115\t-122.477594\t44.755571999999994\tMill City\tOR\tOregon\tLinn County\t1745\t41.2\t14.7\t13.1\t17949\t178549\t0.3963\t97360\tObama\t97360\t0.0042067\t97360.0\n18116\t-122.824653\t44.493646000000005\tWaterloo town\tOR\tOregon\tLinn County\t247\t41.4\t19.9\t11.3\t20940\t225000\t0.3963\t97355\tObama\t97355\t0.0005954469999999999\t97355.0\n18117\t-122.90610900000001\t44.533019\tLebanon city\tOR\tOregon\tLinn County\t14756\t37.4\t12.6\t15.1\t19629\t177349\t0.3963\t97355\tObama\t97355\t0.035572532999999996\t97355.0\n18118\t-123.11088500000001\t44.547307\tTangent city\tOR\tOregon\tLinn County\t967\t39.1\t22.7\t12.0\t24506\t148958\t0.3963\t97389\tObama\t97389\t0.002331163\t97389.0\n18119\t-123.09090900000001\t44.655959\tAlbany city\tOR\tOregon\tLinn County\t47527\t36.2\t21.7\t13.7\t24001\t203879\t0.3963\t97321\tObama\t97321\t0.114574125\t97321.0\n18120\t-122.86826699999999\t44.483227\tSodaville city\tOR\tOregon\tLinn County\t309\t42.6\t12.9\t13.4\t20662\t260938\t0.3963\t97355\tObama\t97355\t0.000744911\t97355.0\n18121\t-122.98266799999999\t44.392416\tBrownsville city\tOR\tOregon\tLinn County\t1611\t41.2\t19.1\t13.8\t19086\t205707\t0.3963\t97327\tObama\t97327\t0.003883664\t97327.0\n18122\t-123.16661299999998\t44.272313\tHarrisburg city\tOR\tOregon\tLinn County\t3029\t32.7\t10.8\t13.9\t19725\t171774\t0.3963\t97446\tObama\t97446\t0.00730206\t97446.0\n18123\t-123.10986499999999\t44.382595\tHalsey city\tOR\tOregon\tLinn County\t859\t33.6\t8.5\t15.7\t20225\t178827\t0.3963\t97348\tObama\t97348\t0.002070805\t97348.0\n18124\t-123.069298\t44.677683\tMillersburg city\tOR\tOregon\tLinn County\t948\t42.4\t13.2\t15.0\t22664\t252703\t0.3963\t97321\tObama\t97321\t0.002285359\t97321.0\n18125\t-122.610148\t44.7777\tLyons city\tOR\tOregon\tLinn County\t1195\t42.3\t8.3\t12.4\t20366\t200000\t0.3963\t97358\tObama\t97358\t0.0028808059999999996\t97358.0\n18126\t-122.702684\t44.402177\tSweet Home city\tOR\tOregon\tLinn County\t8630\t38.8\t7.9\t15.8\t17647\t152984\t0.3963\t97386\tObama\t97386\t0.020804483999999998\t97386.0\n18127\t-117.242053\t43.983492\tVale city\tOR\tOregon\tMalheur County\t2027\t35.6\t16.6\t8.7\t16704\t121802\t0.2771\t97918\tObama\t97918\t0.004886522\t97918.0\n18128\t-116.997656\t43.879599\tNyssa city\tOR\tOregon\tMalheur County\t3122\t29.9\t6.6\t16.9\t13722\t102037\t0.2771\t97913\tObama\t97913\t0.007526257\t97913.0\n18129\t-116.97461299999999\t44.024894\tOntario city\tOR\tOregon\tMalheur County\t10807\t31.1\t16.5\t12.9\t17983\t144880\t0.2771\t97914\tObama\t97914\t0.026052613999999998\t97914.0\n18130\t-117.057376\t42.979409999999994\tJordan Valley city\tOR\tOregon\tMalheur County\t209\t45.0\t8.7\t8.5\t19614\t89167\t0.2771\t97910\tObama\t97910\t0.00050384\t97910.0\n18131\t-117.07083200000001\t43.740646999999996\tAdrian city\tOR\tOregon\tMalheur County\t137\t41.3\t16.1\t8.5\t18136\t150000\t0.2771\t97901\tObama\t97901\t0.00033026800000000004\t97901.0\n18132\t-122.97731\t45.212174\tSt. Paul city\tOR\tOregon\tMarion County\t369\t32.9\t13.9\t8.9\t18746\t287500\t0.4683\t97137\tObama\t97137\t0.000889554\t97137.0\n18133\t-122.151918\t44.733759\tDetroit city\tOR\tOregon\tMarion County\t306\t43.3\t15.4\t14.0\t22667\t189773\t0.4683\t97342\tObama\t97342\t0.000737679\t97342.0\n18134\t-122.838823\t45.222158\tDonald city\tOR\tOregon\tMarion County\t698\t39.0\t11.9\t8.6\t20356\t206250\t0.4683\t97020\tObama\t97020\t0.00168268\t97020.0\n18135\t-122.896327\t45.107959\tGervais city\tOR\tOregon\tMarion County\t2575\t26.4\t6.9\t13.5\t13917\t184454\t0.4683\t97026\tObama\t97026\t0.006207595\t97026.0\n18136\t-122.97171200000001\t44.981595\tHayesville CDP\tOR\tOregon\tMarion County\t20256\t30.9\t17.0\t12.9\t19930\t185930\t0.4683\t97305\tObama\t97305\t0.04883147400000001\t97305.0\n18137\t-122.780574\t45.005463\tSilverton city\tOR\tOregon\tMarion County\t8597\t32.8\t22.8\t10.8\t22552\t234026\t0.4683\t97381\tObama\t97381\t0.02072493\t97381.0\n18138\t-122.85863700000002\t45.148277\tWoodburn city\tOR\tOregon\tMarion County\t25082\t32.9\t12.7\t13.9\t16602\t172222\t0.4683\t97071\tObama\t97071\t0.060465592\t97071.0\n18139\t-123.017168\t44.953699\tSalem city\tOR\tOregon\tMarion County\t153994\t35.1\t25.9\t12.5\t23736\t193836\t0.4683\t97303\tObama\t97303\t0.371235881\t97303.0\n18140\t-122.408795\t44.756296999999996\tGates city\tOR\tOregon\tMarion County\t540\t46.2\t17.4\t10.2\t20586\t171196\t0.4683\t97346\tObama\t97346\t0.001301787\t97346.0\n18141\t-122.75763899999998\t45.229801\tAurora city\tOR\tOregon\tMarion County\t743\t37.7\t17.9\t11.9\t21347\t177083\t0.4683\t97002\tObama\t97002\t0.0017911620000000002\t97002.0\n18142\t-122.95754199999999\t45.050773\tBrooks CDP\tOR\tOregon\tMarion County\t453\t34.2\t24.7\t9.8\t26219\t248077\t0.4683\t97305\tObama\t97305\t0.001092055\t97305.0\n18143\t-122.63098899999999\t44.791433000000005\tMehama CDP\tOR\tOregon\tMarion County\t288\t44.6\t8.1\t10.4\t18897\t218333\t0.4683\t97358\tObama\t97358\t0.000694286\t97358.0\n18144\t-123.023544\t45.002871\tKeizer city\tOR\tOregon\tMarion County\t35388\t35.6\t21.5\t12.1\t24624\t199665\t0.4683\t97303\tObama\t97303\t0.08531043699999999\t97303.0\n18145\t-123.006533\t44.717109\tJefferson city\tOR\tOregon\tMarion County\t3136\t32.9\t11.5\t13.6\t18628\t172125\t0.4683\t97352\tObama\t97352\t0.007560007\t97352.0\n18146\t-122.79608999999999\t45.068670000000004\tMount Angel city\tOR\tOregon\tMarion County\t3744\t35.7\t16.3\t13.4\t19767\t191250\t0.4683\t97362\tObama\t97362\t0.009025723000000001\t97362.0\n18147\t-122.951825\t44.848507\tTurner city\tOR\tOregon\tMarion County\t1365\t45.4\t23.1\t9.8\t24523\t229310\t0.4683\t97392\tObama\t97392\t0.003290628\t97392.0\n18148\t-122.83565\t45.256258\tButteville CDP\tOR\tOregon\tMarion County\t300\t45.6\t24.9\t8.7\t22366\t300000\t0.4683\t97020\tObama\t97020\t0.000723215\t97020.0\n18149\t-122.807275\t45.181078\tHubbard city\tOR\tOregon\tMarion County\t2892\t29.9\t15.2\t12.4\t18860\t192773\t0.4683\t97032\tObama\t97032\t0.006971791999999999\t97032.0\n18150\t-122.871369\t44.845611\tAumsville city\tOR\tOregon\tMarion County\t3447\t30.6\t10.5\t12.8\t18924\t169853\t0.4683\t97325\tObama\t97325\t0.00830974\t97325.0\n18151\t-122.92770300000001\t44.751092\tMarion CDP\tOR\tOregon\tMarion County\t279\t42.7\t6.8\t13.0\t20137\t181818\t0.4683\t97392\tObama\t97392\t0.00067259\t97392.0\n18152\t-122.79253600000001\t44.829246999999995\tSublimity city\tOR\tOregon\tMarion County\t2523\t45.8\t20.4\t10.7\t22827\t238619\t0.4683\t97385\tObama\t97385\t0.006082238\t97385.0\n18153\t-122.668374\t45.040467\tScotts Mills city\tOR\tOregon\tMarion County\t323\t40.6\t22.8\t13.6\t22858\t318421\t0.4683\t97375\tObama\t97375\t0.000778661\t97375.0\n18154\t-122.973568\t45.019116\tLabish Village CDP\tOR\tOregon\tMarion County\t381\t38.9\t15.3\t12.9\t20502\t237500\t0.4683\t97305\tObama\t97305\t0.000918483\t97305.0\n18155\t-122.97355300000001\t44.927432\tFour Corners CDP\tOR\tOregon\tMarion County\t15607\t31.7\t13.2\t11.9\t19271\t167067\t0.4683\t97301\tObama\t97301\t0.037624053\t97301.0\n18156\t-122.073353\t44.706284000000004\tIdanha city\tOR\tOregon\tMarion County\t258\t45.1\t16.7\t13.1\t21713\t192188\t0.4683\t97350\tObama\t97350\t0.000621965\t97350.0\n18157\t-122.79873300000001\t44.802592\tStayton city\tOR\tOregon\tMarion County\t7590\t31.0\t16.8\t14.7\t20356\t191135\t0.4683\t97383\tObama\t97383\t0.018297338\t97383.0\n18158\t-119.556031\t45.354679\tHeppner city\tOR\tOregon\tMorrow County\t1459\t46.6\t17.9\t11.4\t24496\t137917\t0.3096\t97836\tObama\t97836\t0.003517235\t97836.0\n18159\t-119.68789199999999\t45.446195\tLexington town\tOR\tOregon\tMorrow County\t279\t42.5\t26.6\t9.2\t24196\t167500\t0.3096\t97839\tObama\t97839\t0.00067259\t97839.0\n18160\t-119.488372\t45.896273\tIrrigon city\tOR\tOregon\tMorrow County\t2018\t31.3\t7.7\t14.9\t17103\t137019\t0.3096\t97844\tObama\t97844\t0.004864826\t97844.0\n18161\t-119.695073\t45.837305\tBoardman city\tOR\tOregon\tMorrow County\t3300\t26.9\t10.6\t15.6\t15986\t137500\t0.3096\t97818\tObama\t97818\t0.007955365\t97818.0\n18162\t-119.82093\t45.50233\tIone city\tOR\tOregon\tMorrow County\t340\t46.0\t22.3\t8.7\t22609\t135000\t0.3096\t97843\tObama\t97843\t0.0008196439999999999\t97843.0\n18163\t-122.438505\t45.546966999999995\tFairview city\tOR\tOregon\tMultnomah County\t9573\t35.0\t20.6\t12.0\t25563\t203086\t0.7537\t97024\tObama\t97024\t0.023077788999999998\t97024.0\n18164\t-122.39414599999999\t45.534237\tTroutdale city\tOR\tOregon\tMultnomah County\t15583\t33.4\t25.8\t9.8\t27412\t266731\t0.7537\t97060\tObama\t97060\t0.037566196\t97060.0\n18165\t-122.536754\t45.537714\tPortland city\tOR\tOregon\tMultnomah County\t581966\t37.3\t38.6\t11.3\t29282\t253184\t0.7537\t97220\tObama\t97220\t1.402955056\t97220.0\n18166\t-122.440528\t45.504288\tGresham city\tOR\tOregon\tMultnomah County\t103886\t33.5\t23.9\t11.2\t24528\t261204\t0.7537\t97030\tObama\t97030\t0.250439697\t97030.0\n18167\t-122.56173100000001\t45.552473\tMaywood Park city\tOR\tOregon\tMultnomah County\t625\t48.4\t34.1\t9.0\t31457\t282937\t0.7537\t97220\tObama\t97220\t0.0015066979999999999\t97220.0\n18168\t-122.42058600000001\t45.535676\tWood Village city\tOR\tOregon\tMultnomah County\t3335\t30.5\t20.2\t11.3\t23021\t163462\t0.7537\t97024\tObama\t97024\t0.00803974\t97024.0\n18169\t-123.121277\t44.931257\tEola CDP\tOR\tOregon\tPolk County\t63\t46.7\t41.3\t8.3\t30810\t295833\t0.4621\t97304\tObama\t97304\t0.000151875\t97304.0\n18170\t-123.229051\t44.849695000000004\tMonmouth city\tOR\tOregon\tPolk County\t9139\t24.8\t43.0\t10.9\t19457\t201646\t0.4621\t97351\tObama\t97351\t0.022031538\t97351.0\n18171\t-123.62190600000001\t45.060503000000004\tGrand Ronde CDP\tOR\tOregon\tPolk County\t318\t40.1\t9.7\t9.4\t17645\t217500\t0.4621\t97347\tObama\t97347\t0.000766608\t97347.0\n18172\t-123.43804399999999\t44.864919\tFalls City\tOR\tOregon\tPolk County\t1043\t41.4\t18.0\t11.9\t19553\t187500\t0.4621\t97344\tObama\t97344\t0.002514377\t97344.0\n18173\t-123.19413999999999\t44.855160999999995\tIndependence city\tOR\tOregon\tPolk County\t7579\t29.4\t15.6\t12.9\t17137\t148582\t0.4621\t97351\tObama\t97351\t0.018270821\t97351.0\n18174\t-123.234404\t44.932016\tRickreall CDP\tOR\tOregon\tPolk County\t66\t40.6\t20.0\t8.6\t22965\t196875\t0.4621\t97371\tObama\t97371\t0.00015910700000000002\t97371.0\n18175\t-123.314277\t44.922163\tDallas city\tOR\tOregon\tPolk County\t14356\t38.0\t19.6\t10.9\t20882\t186878\t0.4621\t97338\tObama\t97338\t0.034608247\t97338.0\n18176\t-120.838396\t45.664260999999996\tBiggs Junction CDP\tOR\tOregon\tSherman County\t49\t47.5\t17.1\t10.3\t20883\t125000\t0.3109\t97050\tObama\t97050\t0.000118125\t97050.0\n18177\t-120.78400400000001\t45.359212\tGrass Valley city\tOR\tOregon\tSherman County\t166\t47.7\t22.8\t12.1\t19655\t122500\t0.3109\t97029\tObama\t97029\t0.000400179\t97029.0\n18178\t-120.697373\t45.591709\tWasco city\tOR\tOregon\tSherman County\t372\t45.5\t18.3\t9.3\t20677\t135000\t0.3109\t97065\tObama\t97065\t0.000896787\t97065.0\n18179\t-120.74275\t45.691492\tRufus city\tOR\tOregon\tSherman County\t261\t45.7\t14.5\t8.8\t22157\t95000\t0.3109\t97050\tObama\t97050\t0.000629197\t97050.0\n18180\t-120.73329299999999\t45.484213000000004\tMoro city\tOR\tOregon\tSherman County\t326\t47.8\t22.5\t11.9\t19730\t125962\t0.3109\t97039\tObama\t97039\t0.000785894\t97039.0\n18181\t-123.913334\t45.562028000000005\tGaribaldi city\tOR\tOregon\tTillamook County\t989\t51.6\t14.9\t10.7\t20824\t168750\t0.5027\t97118\tObama\t97118\t0.002384199\t97118.0\n18182\t-123.82467\t45.277941999999996\tBeaver CDP\tOR\tOregon\tTillamook County\t159\t45.8\t12.0\t9.0\t19922\t181250\t0.5027\t97112\tObama\t97112\t0.000383304\t97112.0\n18183\t-123.975839\t45.121074\tNeskowin CDP\tOR\tOregon\tTillamook County\t184\t53.5\t35.1\t6.3\t28544\t368182\t0.5027\t97149\tObama\t97149\t0.000443572\t97149.0\n18184\t-123.93458999999999\t45.716947\tManzanita city\tOR\tOregon\tTillamook County\t611\t61.7\t49.5\t8.2\t28567\t359649\t0.5027\t97130\tObama\t97130\t0.001472948\t97130.0\n18185\t-123.89386499999999\t45.718744\tNehalem city\tOR\tOregon\tTillamook County\t218\t55.2\t18.8\t9.7\t26530\t237500\t0.5027\t97131\tObama\t97131\t0.000525536\t97131.0\n18186\t-123.95387\t45.515005\tCape Meares CDP\tOR\tOregon\tTillamook County\t112\t43.6\t7.6\t11.7\t23060\t239286\t0.5027\t97134\tObama\t97134\t0.00027\t97134.0\n18187\t-123.883975\t45.521829\tBay City\tOR\tOregon\tTillamook County\t1263\t48.4\t12.5\t8.8\t22155\t172500\t0.5027\t97107\tObama\t97107\t0.003044735\t97107.0\n18188\t-123.838922\t45.456185999999995\tTillamook city\tOR\tOregon\tTillamook County\t4553\t34.9\t17.3\t7.5\t19692\t160441\t0.5027\t97141\tObama\t97141\t0.010975992\t97141.0\n18189\t-123.858778\t45.225996\tHebo CDP\tOR\tOregon\tTillamook County\t232\t49.0\t22.3\t8.1\t22870\t198438\t0.5027\t97112\tObama\t97112\t0.000559286\t97112.0\n18190\t-123.96110800000001\t45.455422\tOceanside CDP\tOR\tOregon\tTillamook County\t361\t56.0\t32.9\t8.6\t28951\t381579\t0.5027\t97134\tObama\t97134\t0.0008702689999999999\t97134.0\n18191\t-123.884176\t45.200612\tCloverdale CDP\tOR\tOregon\tTillamook County\t241\t48.0\t19.3\t9.2\t21613\t191071\t0.5027\t97112\tObama\t97112\t0.000580983\t97112.0\n18192\t-123.934324\t45.435619\tNetarts CDP\tOR\tOregon\tTillamook County\t812\t54.9\t28.9\t9.1\t27209\t284884\t0.5027\t97143\tObama\t97143\t0.0019575020000000003\t97143.0\n18193\t-123.954201\t45.20604\tPacific City CDP\tOR\tOregon\tTillamook County\t1114\t51.9\t26.3\t9.0\t24170\t266848\t0.5027\t97135\tObama\t97135\t0.002685538\t97135.0\n18194\t-123.88653300000001\t45.687090999999995\tWheeler city\tOR\tOregon\tTillamook County\t405\t58.0\t23.1\t4.9\t19969\t223214\t0.5027\t97147\tObama\t97147\t0.00097634\t97147.0\n18195\t-123.938965\t45.618194\tRockaway Beach city\tOR\tOregon\tTillamook County\t1429\t56.9\t17.1\t7.8\t23892\t214045\t0.5027\t97136\tObama\t97136\t0.0034449140000000003\t97136.0\n18196\t-118.736833\t45.676787\tRiverside CDP\tOR\tOregon\tUmatilla County\t188\t44.4\t25.7\t8.2\t19096\t194643\t0.3438\t97801\tObama\t97801\t0.000453215\t97801.0\n18197\t-119.21942299999999\t45.785678999999995\tStanfield city\tOR\tOregon\tUmatilla County\t1970\t30.7\t7.5\t9.8\t17458\t136458\t0.3438\t97875\tObama\t97875\t0.004749112\t97875.0\n18198\t-118.56393100000001\t45.766405\tAdams city\tOR\tOregon\tUmatilla County\t292\t36.0\t24.3\t6.6\t17939\t145000\t0.3438\t97813\tObama\t97813\t0.000703929\t97813.0\n18199\t-118.65006000000001\t45.679526\tKirkpatrick CDP\tOR\tOregon\tUmatilla County\t171\t43.2\t25.0\t7.9\t19110\t190000\t0.3438\t97801\tObama\t97801\t0.000412233\t97801.0\n18200\t-118.81852099999999\t45.674923\tPendleton city\tOR\tOregon\tUmatilla County\t16423\t36.5\t27.6\t8.8\t22989\t168516\t0.3438\t97801\tObama\t97801\t0.039591198\t97801.0\n18201\t-118.70639299999999\t45.614175\tTutuilla CDP\tOR\tOregon\tUmatilla County\t469\t39.4\t13.6\t7.9\t19821\t190000\t0.3438\t97801\tObama\t97801\t0.001130626\t97801.0\n18202\t-118.83178799999999\t45.484014\tPilot Rock city\tOR\tOregon\tUmatilla County\t1455\t41.4\t14.1\t9.8\t16888\t133537\t0.3438\t97868\tObama\t97868\t0.003507593\t97868.0\n18203\t-118.49260100000001\t45.813284\tAthena city\tOR\tOregon\tUmatilla County\t1201\t37.7\t25.2\t6.5\t17845\t155585\t0.3438\t97813\tObama\t97813\t0.0028952709999999996\t97813.0\n18204\t-119.32821000000001\t45.913514\tUmatilla city\tOR\tOregon\tUmatilla County\t5407\t29.7\t12.7\t9.7\t17164\t133759\t0.3438\t97882\tObama\t97882\t0.013034744\t97882.0\n18205\t-118.665489\t45.658522\tMission CDP\tOR\tOregon\tUmatilla County\t961\t31.2\t15.6\t11.2\t18028\t144886\t0.3438\t97801\tObama\t97801\t0.0023166989999999998\t97801.0\n18206\t-118.42581899999999\t45.815062\tWeston city\tOR\tOregon\tUmatilla County\t718\t40.2\t8.2\t9.2\t17860\t139286\t0.3438\t97813\tObama\t97813\t0.001730894\t97813.0\n18207\t-118.573559\t45.6765\tCayuse CDP\tOR\tOregon\tUmatilla County\t57\t41.7\t23.1\t7.1\t21276\t233333\t0.3438\t97810\tObama\t97810\t0.00013741100000000002\t97810.0\n18208\t-118.72249099999999\t45.665969\tGopher Flats CDP\tOR\tOregon\tUmatilla County\t378\t31.1\t15.6\t11.1\t18037\t146591\t0.3438\t97801\tObama\t97801\t0.0009112510000000001\t97801.0\n18209\t-118.391425\t45.934929\tMilton-Freewater city\tOR\tOregon\tUmatilla County\t6569\t32.4\t18.1\t12.0\t17018\t131787\t0.3438\t97862\tObama\t97862\t0.015835997\t97862.0\n18210\t-119.28413700000002\t45.834979\tHermiston city\tOR\tOregon\tUmatilla County\t14928\t32.8\t17.1\t9.6\t21850\t153599\t0.3438\t97838\tObama\t97838\t0.035987176\t97838.0\n18211\t-118.658728\t45.850496\tHelix city\tOR\tOregon\tUmatilla County\t180\t41.3\t36.7\t6.3\t23440\t175000\t0.3438\t97835\tObama\t97835\t0.000433929\t97835.0\n18212\t-118.93301899999999\t45.134051\tUkiah city\tOR\tOregon\tUmatilla County\t244\t45.5\t18.6\t14.8\t20634\t129167\t0.3438\t97880\tObama\t97880\t0.000588215\t97880.0\n18213\t-119.19197\t45.74317\tEcho city\tOR\tOregon\tUmatilla County\t645\t39.4\t15.6\t6.9\t17093\t142130\t0.3438\t97826\tObama\t97826\t0.001554912\t97826.0\n18214\t-118.004176\t45.489651\tSummerville town\tOR\tOregon\tUnion County\t119\t46.8\t24.7\t10.3\t24054\t287500\t0.3292\t97876\tObama\t97876\t0.000286875\t97876.0\n18215\t-117.963196\t45.462007\tImbler city\tOR\tOregon\tUnion County\t313\t46.2\t27.7\t6.8\t22594\t189286\t0.3292\t97841\tObama\t97841\t0.0007545539999999999\t97841.0\n18216\t-117.92033500000001\t45.030122999999996\tNorth Powder city\tOR\tOregon\tUnion County\t515\t41.9\t19.7\t9.3\t15992\t119000\t0.3292\t97867\tObama\t97867\t0.001241519\t97867.0\n18217\t-117.810321\t45.296481\tCove city\tOR\tOregon\tUnion County\t669\t48.1\t29.5\t8.2\t22593\t240833\t0.3292\t97824\tObama\t97824\t0.001612769\t97824.0\n18218\t-118.08681599999998\t45.324191\tLa Grande city\tOR\tOregon\tUnion County\t12551\t34.7\t28.7\t9.7\t21824\t151896\t0.3292\t97850\tObama\t97850\t0.030256902999999998\t97850.0\n18219\t-117.92132099999999\t45.56435\tElgin city\tOR\tOregon\tUnion County\t1657\t39.4\t10.1\t14.0\t17850\t114674\t0.3292\t97827\tObama\t97827\t0.003994557\t97827.0\n18220\t-118.04886499999999\t45.335971\tIsland City\tOR\tOregon\tUnion County\t972\t44.3\t20.8\t9.4\t19985\t150284\t0.3292\t97850\tObama\t97850\t0.002343216\t97850.0\n18221\t-117.86797299999999\t45.208890999999994\tUnion city\tOR\tOregon\tUnion County\t1984\t44.3\t14.9\t12.0\t17232\t132799\t0.3292\t97883\tObama\t97883\t0.004782862\t97883.0\n18222\t-117.42958\t45.487142\tLostine city\tOR\tOregon\tWallowa County\t247\t46.0\t16.7\t10.7\t17369\t136111\t0.298\t97857\tObama\t97857\t0.0005954469999999999\t97857.0\n18223\t-117.27908899999998\t45.425733\tEnterprise city\tOR\tOregon\tWallowa County\t1867\t46.7\t21.8\t9.7\t22288\t159921\t0.298\t97828\tObama\t97828\t0.004500808\t97828.0\n18224\t-117.52881799999999\t45.570336\tWallowa city\tOR\tOregon\tWallowa County\t814\t45.9\t16.7\t10.8\t17358\t135484\t0.298\t97885\tObama\t97885\t0.0019623229999999998\t97885.0\n18225\t-117.23045800000001\t45.352782\tJoseph city\tOR\tOregon\tWallowa County\t973\t50.3\t16.8\t10.2\t21580\t176042\t0.298\t97846\tObama\t97846\t0.0023456270000000003\t97846.0\n18226\t-121.274054\t45.669857\tRowena CDP\tOR\tOregon\tWasco County\t148\t39.7\t18.8\t7.1\t23044\t178125\t0.4793\t97058\tObama\t97058\t0.000356786\t97058.0\n18227\t-121.35533400000001\t45.113527000000005\tPine Grove CDP\tOR\tOregon\tWasco County\t166\t58.6\t9.0\t11.7\t17908\t162500\t0.4793\t97063\tObama\t97063\t0.000400179\t97063.0\n18228\t-121.169004\t45.241844\tTygh Valley CDP\tOR\tOregon\tWasco County\t228\t57.4\t10.4\t10.7\t18545\t164063\t0.4793\t97063\tObama\t97063\t0.000549643\t97063.0\n18229\t-121.128708\t45.453173\tDufur city\tOR\tOregon\tWasco County\t563\t45.8\t21.7\t5.3\t20719\t161719\t0.4793\t97021\tObama\t97021\t0.0013572329999999998\t97021.0\n18230\t-121.231822\t45.620411\tChenoweth CDP\tOR\tOregon\tWasco County\t3519\t40.3\t10.6\t8.8\t19654\t145667\t0.4793\t97058\tObama\t97058\t0.008483311\t97058.0\n18231\t-121.176158\t45.601548\tCity of The Dalles city\tOR\tOregon\tWasco County\t12246\t40.2\t19.5\t8.6\t22530\t169318\t0.4793\t97058\tObama\t97058\t0.029521635\t97058.0\n18232\t-120.723875\t44.911542\tAntelope city\tOR\tOregon\tWasco County\t59\t47.0\t20.9\t7.9\t22106\t168750\t0.4793\t97001\tObama\t97001\t0.000142232\t97001.0\n18233\t-121.29275200000001\t45.225671999999996\tWamic CDP\tOR\tOregon\tWasco County\t37\t56.3\t10.0\t11.8\t17855\t187500\t0.4793\t97063\tObama\t97063\t8.92e-05\t97063.0\n18234\t-121.291031\t45.242135\tPine Hollow CDP\tOR\tOregon\tWasco County\t434\t58.6\t8.9\t11.9\t17931\t161719\t0.4793\t97063\tObama\t97063\t0.001046251\t97063.0\n18235\t-121.08765600000001\t45.17348\tMaupin city\tOR\tOregon\tWasco County\t410\t46.8\t21.8\t7.8\t22162\t144118\t0.4793\t97037\tObama\t97037\t0.0009883939999999999\t97037.0\n18236\t-120.75223899999999\t45.003972999999995\tShaniko city\tOR\tOregon\tWasco County\t26\t43.8\t20.0\t5.9\t22101\t150000\t0.4793\t97001\tObama\t97001\t6.27e-05\t97001.0\n18237\t-121.39526399999998\t45.685025\tMosier city\tOR\tOregon\tWasco County\t415\t42.7\t28.3\t6.1\t21066\t225000\t0.4793\t97040\tObama\t97040\t0.001000447\t97040.0\n18238\t-122.80235800000001\t45.403752000000004\tKing City\tOR\tOregon\tWashington County\t2101\t75.9\t26.5\t13.4\t33558\t200547\t0.5708\t97224\tObama\t97224\t0.005064915\t97224.0\n18239\t-122.998609\t45.596998\tNorth Plains city\tOR\tOregon\tWashington County\t2077\t39.0\t19.7\t8.5\t26006\t225987\t0.5708\t97133\tObama\t97133\t0.005007058\t97133.0\n18240\t-123.141791\t45.435825\tGaston city\tOR\tOregon\tWashington County\t696\t39.0\t23.2\t11.1\t31871\t452778\t0.5708\t97119\tObama\t97119\t0.0016778589999999999\t97119.0\n18241\t-123.106499\t45.521815999999994\tForest Grove city\tOR\tOregon\tWashington County\t21330\t34.0\t24.4\t13.2\t21087\t230369\t0.5708\t97116\tObama\t97116\t0.051420584000000005\t97116.0\n18242\t-123.111033\t45.614684999999994\tBanks city\tOR\tOregon\tWashington County\t1470\t37.0\t26.3\t8.6\t25597\t333182\t0.5708\t97106\tObama\t97106\t0.0035437529999999997\t97106.0\n18243\t-122.8176\t45.477716\tBeaverton city\tOR\tOregon\tWashington County\t88061\t34.2\t43.0\t10.4\t31092\t319098\t0.5708\t97005\tObama\t97005\t0.212290108\t97005.0\n18244\t-122.84236100000001\t45.359648\tSherwood city\tOR\tOregon\tWashington County\t17376\t32.1\t39.4\t9.3\t32525\t309981\t0.5708\t97140\tObama\t97140\t0.04188861\t97140.0\n18245\t-122.75816200000001\t45.394326\tDurham city\tOR\tOregon\tWashington County\t1534\t40.2\t41.8\t9.5\t34052\t321359\t0.5708\t97062\tObama\t97062\t0.003698039\t97062.0\n18246\t-122.805301\t45.504802000000005\tCedar Hills CDP\tOR\tOregon\tWashington County\t9397\t37.5\t41.5\t10.4\t29731\t275146\t0.5708\t97005\tObama\t97005\t0.022653503\t97005.0\n18247\t-122.751675\t45.489429\tRaleigh Hills CDP\tOR\tOregon\tWashington County\t6314\t42.8\t54.9\t10.8\t42525\t428440\t0.5708\t97225\tObama\t97225\t0.015221263999999998\t97225.0\n18248\t-122.872602\t45.491986\tAloha CDP\tOR\tOregon\tWashington County\t49908\t33.1\t24.6\t11.1\t25901\t259110\t0.5708\t97007\tObama\t97007\t0.120314041\t97007.0\n18249\t-122.93778300000001\t45.528827\tHillsboro city\tOR\tOregon\tWashington County\t87511\t31.8\t33.3\t10.8\t27885\t271038\t0.5708\t97124\tObama\t97124\t0.21096421399999998\t97124.0\n18250\t-122.7778\t45.425087\tTigard city\tOR\tOregon\tWashington County\t45830\t36.6\t39.8\t10.5\t30800\t320749\t0.5708\t97223\tObama\t97223\t0.11048313900000001\t97223.0\n18251\t-122.776537\t45.495740999999995\tWest Slope CDP\tOR\tOregon\tWashington County\t6901\t38.4\t50.3\t9.9\t36709\t408791\t0.5708\t97225\tObama\t97225\t0.016636355\t97225.0\n18252\t-122.734536\t45.379336\tTualatin city\tOR\tOregon\tWashington County\t26272\t34.5\t40.6\t9.8\t33231\t343499\t0.5708\t97035\tObama\t97035\t0.063334345\t97035.0\n18253\t-122.876194\t45.552440000000004\tRockcreek CDP\tOR\tOregon\tWashington County\t10593\t38.9\t44.6\t9.8\t34588\t336328\t0.5708\t97006\tObama\t97006\t0.02553672\t97006.0\n18254\t-122.76983200000001\t45.516351\tWest Haven-Sylvan CDP\tOR\tOregon\tWashington County\t9027\t35.3\t57.0\t8.9\t40559\t384581\t0.5708\t97225\tObama\t97225\t0.021761537999999997\t97225.0\n18255\t-122.761527\t45.463573\tGarden Home-Whitford CDP\tOR\tOregon\tWashington County\t7574\t40.8\t45.5\t9.5\t34349\t332842\t0.5708\t97223\tObama\t97223\t0.018258767\t97223.0\n18256\t-122.762201\t45.449217\tMetzger CDP\tOR\tOregon\tWashington County\t3810\t37.8\t33.2\t10.4\t29276\t273326\t0.5708\t97223\tObama\t97223\t0.00918483\t97223.0\n18257\t-122.84139099999999\t45.540510999999995\tOak Hills CDP\tOR\tOregon\tWashington County\t12010\t32.9\t54.5\t10.4\t33610\t351797\t0.5708\t97229\tObama\t97229\t0.028952706\t97229.0\n18258\t-122.80060300000001\t45.534634999999994\tCedar Mill CDP\tOR\tOregon\tWashington County\t15304\t39.3\t52.0\t8.8\t44170\t458425\t0.5708\t97229\tObama\t97229\t0.036893606\t97229.0\n18259\t-123.054235\t45.519346\tCornelius city\tOR\tOregon\tWashington County\t10574\t30.8\t10.8\t11.9\t20932\t202808\t0.5708\t97113\tObama\t97113\t0.025490917000000002\t97113.0\n18260\t-120.153953\t44.570083000000004\tMitchell city\tOR\tOregon\tWheeler County\t171\t51.7\t15.3\t4.5\t17325\t171875\t0.31\t97750\tObama\t97750\t0.000412233\t97750.0\n18261\t-119.79311000000001\t44.831989\tSpray town\tOR\tOregon\tWheeler County\t141\t51.0\t15.0\t5.4\t17311\t193750\t0.31\t97874\tObama\t97874\t0.000339911\t97874.0\n18262\t-120.21473\t44.998181\tFossil city\tOR\tOregon\tWheeler County\t477\t55.8\t14.2\t4.6\t21216\t113942\t0.31\t97830\tObama\t97830\t0.001149912\t97830.0\n18263\t-123.20343700000001\t45.115294\tAmity city\tOR\tOregon\tYamhill County\t1880\t32.0\t11.4\t14.3\t19032\t178326\t0.4489\t97101\tObama\t97101\t0.004532147\t97101.0\n18264\t-123.483061\t45.08126\tWillamina city\tOR\tOregon\tYamhill County\t2229\t34.2\t8.8\t9.6\t20642\t168000\t0.4489\t97396\tObama\t97396\t0.005373487\t97396.0\n18265\t-123.078101\t45.219529\tDayton city\tOR\tOregon\tYamhill County\t2665\t31.6\t15.5\t12.5\t17383\t189974\t0.4489\t97114\tObama\t97114\t0.00642456\t97114.0\n18266\t-123.111589\t45.246034\tLafayette city\tOR\tOregon\tYamhill County\t2826\t32.7\t11.7\t16.4\t17308\t152802\t0.4489\t97127\tObama\t97127\t0.006812685\t97127.0\n18267\t-123.190968\t45.210173\tMcMinnville city\tOR\tOregon\tYamhill County\t31754\t33.4\t25.4\t12.5\t22002\t208684\t0.4489\t97128\tObama\t97128\t0.076549893\t97128.0\n18268\t-123.17649499999999\t45.29476\tCarlton city\tOR\tOregon\tYamhill County\t1856\t40.1\t16.7\t10.7\t20240\t219375\t0.4489\t97111\tObama\t97111\t0.00447429\t97111.0\n18269\t-123.00701799999999\t45.275949\tDundee city\tOR\tOregon\tYamhill County\t3115\t38.7\t34.7\t9.6\t25363\t271850\t0.4489\t97115\tObama\t97115\t0.007509381999999999\t97115.0\n18270\t-122.960452\t45.30771\tNewberg city\tOR\tOregon\tYamhill County\t21777\t32.8\t25.2\t10.8\t23799\t222711\t0.4489\t97132\tObama\t97132\t0.052498174\t97132.0\n18271\t-123.396446\t45.09543\tSheridan city\tOR\tOregon\tYamhill County\t5782\t35.0\t14.2\t13.2\t20497\t178314\t0.4489\t97378\tObama\t97378\t0.013938763\t97378.0\n18272\t-123.18491200000001\t45.341112\tYamhill city\tOR\tOregon\tYamhill County\t962\t34.7\t12.2\t11.0\t23739\t190541\t0.4489\t97148\tObama\t97148\t0.0023191089999999998\t97148.0\n18273\t-77.116065\t40.00943\tYork Springs borough\tPA\tPennsylvania\tAdams County\t644\t39.9\t15.4\t8.3\t20885\t146983\t0.3554\t17372\tObama\t17372\t0.0018275560000000001\t17372.0\n18274\t-77.249494\t39.982153000000004\tBendersville borough\tPA\tPennsylvania\tAdams County\t669\t37.4\t10.5\t12.6\t20000\t145170\t0.3554\t17306\tObama\t17306\t0.001898502\t17306.0\n18275\t-77.358711\t39.846011\tOrrtanna CDP\tPA\tPennsylvania\tAdams County\t195\t45.1\t16.8\t10.3\t22989\t141071\t0.3554\t17353\tObama\t17353\t0.000553375\t17353.0\n18276\t-77.380686\t39.749942\tCarroll Valley borough\tPA\tPennsylvania\tAdams County\t3860\t36.9\t28.9\t6.8\t27761\t193892\t0.3554\t17320\tObama\t17320\t0.010953986\t17320.0\n18277\t-77.13647399999999\t39.810352\tBonneauville borough\tPA\tPennsylvania\tAdams County\t1729\t35.5\t10.6\t9.0\t20250\t149590\t0.3554\t17340\tObama\t17340\t0.004906591\t17340.0\n18278\t-77.04213399999999\t39.983638\tLake Meade CDP\tPA\tPennsylvania\tAdams County\t1957\t38.8\t23.8\t6.0\t23003\t181452\t0.3554\t17316\tObama\t17316\t0.005553614\t17316.0\n18279\t-77.22598\t39.976405\tBendersville Station-Aspers CDP\tPA\tPennsylvania\tAdams County\t376\t37.4\t10.6\t12.6\t20012\t145652\t0.3554\t17304\tObama\t17304\t0.00106702\t17304.0\n18280\t-77.088901\t39.745239\tLittlestown borough\tPA\tPennsylvania\tAdams County\t4709\t35.9\t17.2\t8.6\t21576\t164098\t0.3554\t17340\tObama\t17340\t0.013363295\t17340.0\n18281\t-77.24659\t39.93016\tBiglerville borough\tPA\tPennsylvania\tAdams County\t1254\t42.9\t20.2\t10.9\t20499\t166176\t0.3554\t17307\tObama\t17307\t0.0035586259999999996\t17307.0\n18282\t-77.05467900000001\t39.863046999999995\tNew Oxford borough\tPA\tPennsylvania\tAdams County\t1832\t34.4\t12.0\t9.5\t23084\t165816\t0.3554\t17350\tObama\t17350\t0.005198886\t17350.0\n18283\t-77.344589\t39.878567\tCashtown-McKnightstown CDP\tPA\tPennsylvania\tAdams County\t863\t43.2\t19.6\t7.2\t21431\t186979\t0.3554\t17343\tObama\t17343\t0.002449039\t17343.0\n18284\t-76.988842\t39.884214\tAbbottstown borough\tPA\tPennsylvania\tAdams County\t980\t36.6\t17.3\t6.1\t20119\t165057\t0.3554\t17301\tObama\t17301\t0.002781064\t17301.0\n18285\t-76.979525\t39.937086\tEast Berlin borough\tPA\tPennsylvania\tAdams County\t1581\t35.6\t18.7\t11.0\t23688\t166563\t0.3554\t17316\tObama\t17316\t0.004486594\t17316.0\n18286\t-77.18559599999999\t39.80928\tLake Heritage CDP\tPA\tPennsylvania\tAdams County\t1249\t43.3\t27.2\t9.6\t24469\t184539\t0.3554\t17325\tObama\t17325\t0.003544437\t17325.0\n18287\t-77.020044\t39.803526\tMcSherrystown borough\tPA\tPennsylvania\tAdams County\t2847\t39.7\t19.4\t7.8\t25269\t137094\t0.3554\t17344\tObama\t17344\t0.008079274000000001\t17344.0\n18288\t-77.369734\t39.789285\tFairfield borough\tPA\tPennsylvania\tAdams County\t581\t44.1\t18.3\t11.6\t21065\t161207\t0.3554\t17320\tObama\t17320\t0.001648774\t17320.0\n18289\t-77.233839\t39.830625\tGettysburg borough\tPA\tPennsylvania\tAdams County\t7795\t24.6\t40.1\t18.4\t19857\t171660\t0.3554\t17325\tObama\t17325\t0.022120808\t17325.0\n18290\t-77.00533399999999\t39.803917999999996\tMidway CDP\tPA\tPennsylvania\tAdams County\t2404\t38.5\t14.4\t6.7\t23454\t143094\t0.3554\t17344\tObama\t17344\t0.00682212\t17344.0\n18291\t-77.299308\t39.923367999999996\tArendtsville borough\tPA\tPennsylvania\tAdams County\t1054\t34.6\t30.1\t6.5\t22915\t176974\t0.3554\t17307\tObama\t17307\t0.002991062\t17307.0\n18292\t-77.05804300000001\t39.928511\tHampton CDP\tPA\tPennsylvania\tAdams County\t659\t36.6\t16.2\t9.6\t21874\t136480\t0.3554\t17350\tObama\t17350\t0.0018701229999999998\t17350.0\n18293\t-79.855616\t40.298977\tLincoln borough\tPA\tPennsylvania\tAllegheny County\t1148\t48.2\t10.2\t9.3\t21056\t94189\t0.5669\t15133\tObama\t15133\t0.003257818\t15133.0\n18294\t-79.75983199999999\t40.604175\tTarentum borough\tPA\tPennsylvania\tAllegheny County\t4689\t40.5\t14.1\t11.3\t21209\t70448\t0.5669\t15014\tObama\t15014\t0.013306539\t15014.0\n18295\t-79.838615\t40.410126\tChalfant borough\tPA\tPennsylvania\tAllegheny County\t795\t43.4\t23.4\t7.0\t27701\t83400\t0.5669\t15112\tObama\t15112\t0.002256067\t15112.0\n18296\t-80.179569\t40.539786\tSewickley borough\tPA\tPennsylvania\tAllegheny County\t3558\t47.0\t51.7\t8.8\t32875\t194068\t0.5669\t15143\tObama\t15143\t0.010096964\t15143.0\n18297\t-79.86897900000001\t40.401874\tBraddock borough\tPA\tPennsylvania\tAllegheny County\t2380\t37.5\t12.2\t19.2\t13656\t32500\t0.5669\t15104\tObama\t15104\t0.006754011999999999\t15104.0\n18298\t-80.028075\t40.583511\tMcCandless Township CDP\tPA\tPennsylvania\tAllegheny County\t28004\t43.6\t56.4\t5.7\t37409\t228460\t0.5669\t15237\tObama\t15237\t0.079470315\t15237.0\n18299\t-80.127051\t40.576762\tSewickley Hills borough\tPA\tPennsylvania\tAllegheny County\t600\t43.8\t59.5\t10.1\t43198\t298913\t0.5669\t15143\tObama\t15143\t0.0017026920000000002\t15143.0\n18300\t-79.840147\t40.608219\tRussellton CDP\tPA\tPennsylvania\tAllegheny County\t1441\t44.1\t23.3\t9.5\t27610\t143811\t0.5669\t15076\tObama\t15076\t0.004089299\t15076.0\n18301\t-79.900428\t40.393565\tMunhall borough\tPA\tPennsylvania\tAllegheny County\t11540\t44.8\t17.6\t8.9\t22631\t90145\t0.5669\t15120\tObama\t15120\t0.032748444\t15120.0\n18302\t-79.93345\t40.293009999999995\tJefferson Hills borough\tPA\tPennsylvania\tAllegheny County\t9706\t45.1\t34.8\t9.4\t29664\t152579\t0.5669\t15025\tObama\t15025\t0.027543882000000002\t15025.0\n18303\t-80.068472\t40.444855\tIngram borough\tPA\tPennsylvania\tAllegheny County\t3508\t39.1\t20.4\t7.4\t26670\t112775\t0.5669\t15205\tObama\t15205\t0.009955073\t15205.0\n18304\t-80.191978\t40.554858\tEdgeworth borough\tPA\tPennsylvania\tAllegheny County\t1649\t44.0\t78.1\t6.1\t66394\t524764\t0.5669\t150HH\tObama\t150HH\t0.004679565\t0.0\n18305\t-80.062792\t40.468795\tMcKees Rocks borough\tPA\tPennsylvania\tAllegheny County\t6086\t40.3\t10.8\t15.0\t18111\t60951\t0.5669\t15204\tObama\t15204\t0.017270973000000002\t15204.0\n18306\t-79.963174\t40.52252\tShaler Township CDP\tPA\tPennsylvania\tAllegheny County\t28020\t45.6\t31.4\t7.4\t28153\t156848\t0.5669\t15116\tObama\t15116\t0.07951572\t15116.0\n18307\t-80.079161\t40.387336\tScott Township CDP\tPA\tPennsylvania\tAllegheny County\t16370\t45.3\t41.9\t7.6\t28175\t146908\t0.5669\t15243\tObama\t15243\t0.046455116\t15243.0\n18308\t-79.860299\t40.492252\tBlawnox borough\tPA\tPennsylvania\tAllegheny County\t1416\t47.1\t31.1\t8.8\t25293\t108979\t0.5669\t15147\tObama\t15147\t0.004018353\t15147.0\n18309\t-80.213955\t40.565502\tLeetsdale borough\tPA\tPennsylvania\tAllegheny County\t1105\t45.6\t25.1\t7.2\t21602\t86579\t0.5669\t15056\tObama\t15056\t0.0031357909999999998\t15056.0\n18310\t-79.85462199999999\t40.425134\tForest Hills borough\tPA\tPennsylvania\tAllegheny County\t6614\t47.0\t53.0\t8.9\t32528\t133723\t0.5669\t15221\tObama\t15221\t0.018769341999999998\t15221.0\n18311\t-79.808252\t40.378109\tNorth Versailles CDP\tPA\tPennsylvania\tAllegheny County\t10470\t45.7\t14.5\t10.4\t24716\t94727\t0.5669\t15137\tObama\t15137\t0.029711977\t15137.0\n18312\t-79.74951999999999\t40.502357\tPlum borough\tPA\tPennsylvania\tAllegheny County\t26295\t41.7\t33.4\t8.1\t26726\t144341\t0.5669\t15239\tObama\t15239\t0.074620481\t15239.0\n18313\t-80.05472900000001\t40.416878999999994\tGreen Tree borough\tPA\tPennsylvania\tAllegheny County\t4387\t48.6\t38.5\t6.1\t32296\t170075\t0.5669\t15220\tObama\t15220\t0.012449517\t15220.0\n18314\t-80.09957299999999\t40.590218\tFranklin Park borough\tPA\tPennsylvania\tAllegheny County\t12098\t44.1\t64.9\t5.0\t47988\t317671\t0.5669\t15015\tObama\t15015\t0.034331948\t15015.0\n18315\t-79.862674\t40.417815000000004\tBraddock Hills borough\tPA\tPennsylvania\tAllegheny County\t1875\t47.6\t22.0\t15.8\t24364\t97197\t0.5669\t15104\tObama\t15104\t0.005320913000000001\t15104.0\n18316\t-80.033204\t40.518045\tWest View borough\tPA\tPennsylvania\tAllegheny County\t6839\t41.1\t28.8\t6.4\t26348\t125260\t0.5669\t15229\tObama\t15229\t0.019407852\t15229.0\n18317\t-80.084108\t40.434631\tThornburg borough\tPA\tPennsylvania\tAllegheny County\t427\t47.6\t68.0\t6.8\t53558\t343617\t0.5669\t15205\tObama\t15205\t0.001211749\t15205.0\n18318\t-79.885707\t40.305479\tClairton city\tPA\tPennsylvania\tAllegheny County\t7737\t43.6\t12.5\t11.7\t19561\t57757\t0.5669\t15025\tObama\t15025\t0.021956213999999998\t15025.0\n18319\t-80.019566\t40.36642\tCastle Shannon borough\tPA\tPennsylvania\tAllegheny County\t8075\t42.4\t29.3\t8.4\t27632\t124435\t0.5669\t15234\tObama\t15234\t0.022915397999999997\t15234.0\n18320\t-80.153039\t40.559642\tSewickley Heights borough\tPA\tPennsylvania\tAllegheny County\t925\t54.3\t63.1\t4.2\t74664\t917339\t0.5669\t15143\tObama\t15143\t0.0026249840000000003\t15143.0\n18321\t-79.947733\t40.498413\tEtna borough\tPA\tPennsylvania\tAllegheny County\t3780\t41.1\t21.8\t6.9\t24639\t95556\t0.5669\t15223\tObama\t15223\t0.01072696\t15223.0\n18322\t-80.162525\t40.514988\tCoraopolis borough\tPA\tPennsylvania\tAllegheny County\t5838\t43.6\t22.5\t9.3\t25307\t100120\t0.5669\t15108\tObama\t15108\t0.016567194\t15108.0\n18323\t-80.071177\t40.433361\tCrafton borough\tPA\tPennsylvania\tAllegheny County\t6146\t41.2\t33.3\t8.3\t28668\t132962\t0.5669\t15205\tObama\t15205\t0.017441243000000002\t15205.0\n18324\t-80.086049\t40.407839\tCarnegie borough\tPA\tPennsylvania\tAllegheny County\t7936\t42.4\t22.3\t11.4\t26581\t109146\t0.5669\t15106\tObama\t15106\t0.022520941000000003\t15106.0\n18325\t-79.785165\t40.391358000000004\tWall borough\tPA\tPennsylvania\tAllegheny County\t607\t42.2\t8.4\t13.3\t21450\t54643\t0.5669\t15140\tObama\t15140\t0.0017225570000000002\t15140.0\n18326\t-79.741293\t40.608011\tBrackenridge borough\tPA\tPennsylvania\tAllegheny County\t3311\t43.2\t14.3\t7.6\t23015\t80641\t0.5669\t15014\tObama\t15014\t0.009396022\t15014.0\n18327\t-79.88409200000001\t40.431281\tEdgewood borough\tPA\tPennsylvania\tAllegheny County\t3141\t43.4\t62.4\t5.5\t42287\t164103\t0.5669\t15218\tObama\t15218\t0.008913593000000001\t15218.0\n18328\t-80.054873\t40.494614\tBellevue borough\tPA\tPennsylvania\tAllegheny County\t8288\t38.9\t28.9\t10.0\t24733\t105996\t0.5669\t15202\tObama\t15202\t0.023519852999999997\t15202.0\n18329\t-80.211303\t40.390962\tSturgeon-Noblestown CDP\tPA\tPennsylvania\tAllegheny County\t1801\t41.5\t23.3\t4.5\t25125\t118519\t0.5669\t15082\tObama\t15082\t0.005110914\t15082.0\n18330\t-79.89470899999999\t40.272476\tWest Elizabeth borough\tPA\tPennsylvania\tAllegheny County\t495\t40.1\t11.2\t10.1\t21621\t59000\t0.5669\t15088\tObama\t15088\t0.001404721\t15088.0\n18331\t-79.989085\t40.485167\tReserve Township CDP\tPA\tPennsylvania\tAllegheny County\t3544\t44.9\t14.3\t6.9\t24693\t127827\t0.5669\t15209\tObama\t15209\t0.010057235\t15209.0\n18332\t-80.073105\t40.512551\tBen Avon Heights borough\tPA\tPennsylvania\tAllegheny County\t386\t44.0\t78.4\t4.8\t49645\t307692\t0.5669\t15202\tObama\t15202\t0.001095399\t15202.0\n18333\t-79.84128\t40.504979\tVerona borough\tPA\tPennsylvania\tAllegheny County\t2838\t41.4\t13.7\t15.6\t21072\t85786\t0.5669\t15147\tObama\t15147\t0.008053734\t15147.0\n18334\t-80.132584\t40.458794\tRobinson Township CDP\tPA\tPennsylvania\tAllegheny County\t13172\t43.0\t40.1\t7.1\t33703\t196821\t0.5669\t15225\tObama\t15225\t0.037379767\t15225.0\n18335\t-80.06809\t40.501209\tAvalon borough\tPA\tPennsylvania\tAllegheny County\t4925\t43.9\t22.2\t10.9\t23704\t106469\t0.5669\t15202\tObama\t15202\t0.013976263999999999\t15202.0\n18336\t-80.247393\t40.452979\tImperial-Enlow CDP\tPA\tPennsylvania\tAllegheny County\t3477\t40.7\t16.8\t7.7\t26161\t99605\t0.5669\t15126\tObama\t15126\t0.009867101\t15126.0\n18337\t-80.080738\t40.636852000000005\tBradfordwoods borough\tPA\tPennsylvania\tAllegheny County\t1151\t51.1\t65.3\t5.2\t66000\t313971\t0.5669\t15015\tObama\t15015\t0.003266331\t15015.0\n18338\t-79.837642\t40.397149\tEast Pittsburgh borough\tPA\tPennsylvania\tAllegheny County\t1851\t39.2\t13.7\t10.3\t18233\t66017\t0.5669\t15112\tObama\t15112\t0.005252805\t15112.0\n18339\t-79.849246\t40.649719\tCurtisville CDP\tPA\tPennsylvania\tAllegheny County\t1125\t44.9\t11.3\t11.1\t20457\t96000\t0.5669\t15006\tObama\t15006\t0.003192548\t15006.0\n18340\t-80.173061\t40.590222\tBell Acres borough\tPA\tPennsylvania\tAllegheny County\t1319\t49.4\t44.6\t5.6\t48460\t211842\t0.5669\t15143\tObama\t15143\t0.003743085\t15143.0\n18341\t-79.858455\t40.324133\tLiberty borough\tPA\tPennsylvania\tAllegheny County\t2499\t46.8\t14.8\t10.1\t21903\t91200\t0.5669\t15133\tObama\t15133\t0.007091713\t15133.0\n18342\t-79.782107\t40.540737\tSpringdale borough\tPA\tPennsylvania\tAllegheny County\t3505\t45.4\t15.0\t10.9\t23968\t107868\t0.5669\t15144\tObama\t15144\t0.00994656\t15144.0\n18343\t-79.907395\t40.35795\tWest Mifflin borough\tPA\tPennsylvania\tAllegheny County\t20581\t45.7\t18.7\t10.3\t25084\t104987\t0.5669\t15122\tObama\t15122\t0.058405175999999996\t15122.0\n18344\t-79.801237\t40.542817\tCheswick borough\tPA\tPennsylvania\tAllegheny County\t1758\t50.1\t28.0\t10.8\t26445\t129609\t0.5669\t15049\tObama\t15049\t0.0049888879999999995\t15049.0\n18345\t-80.081441\t40.50586\tBen Avon borough\tPA\tPennsylvania\tAllegheny County\t1781\t39.1\t54.0\t3.0\t35913\t186381\t0.5669\t15202\tObama\t15202\t0.005054158\t15202.0\n18346\t-80.08926899999999\t40.422482\tRosslyn Farms borough\tPA\tPennsylvania\tAllegheny County\t447\t48.6\t70.5\t5.3\t53655\t335577\t0.5669\t15106\tObama\t15106\t0.001268506\t15106.0\n18347\t-79.87188\t40.337059\tPort Vue borough\tPA\tPennsylvania\tAllegheny County\t3935\t46.1\t9.1\t13.2\t24210\t77430\t0.5669\t15133\tObama\t15133\t0.011166822\t15133.0\n18348\t-80.09218\t40.391579\tHeidelberg borough\tPA\tPennsylvania\tAllegheny County\t1136\t44.5\t20.2\t7.6\t22346\t102857\t0.5669\t15106\tObama\t15106\t0.003223764\t15106.0\n18349\t-79.976012\t40.373422\tBrentwood borough\tPA\tPennsylvania\tAllegheny County\t9575\t41.7\t27.3\t7.0\t26666\t115221\t0.5669\t15227\tObama\t15227\t0.027172127999999997\t15227.0\n18350\t-80.073258\t40.483065\tStowe Township CDP\tPA\tPennsylvania\tAllegheny County\t6057\t43.8\t15.9\t12.4\t23349\t75667\t0.5669\t15136\tObama\t15136\t0.017188677\t15136.0\n18351\t-80.096544\t40.511249\tEmsworth borough\tPA\tPennsylvania\tAllegheny County\t2490\t40.3\t33.4\t6.4\t28873\t117974\t0.5669\t15202\tObama\t15202\t0.007066172\t15202.0\n18352\t-79.97652099999999\t40.439569\tPittsburgh city\tPA\tPennsylvania\tAllegheny County\t310959\t37.4\t31.7\t12.7\t23984\t92037\t0.5669\t15219\tObama\t15219\t0.882445713\t15219.0\n18353\t-80.217361\t40.518784000000004\tCarnot-Moon CDP\tPA\tPennsylvania\tAllegheny County\t10288\t38.2\t41.2\t10.5\t30722\t183396\t0.5669\t150HH\tObama\t150HH\t0.029195494\t0.0\n18354\t-79.823394\t40.42586\tWilkins Township CDP\tPA\tPennsylvania\tAllegheny County\t6355\t49.5\t37.0\t8.0\t31495\t110799\t0.5669\t15145\tObama\t15145\t0.018034347\t15145.0\n18355\t-79.800831\t40.34133\tWhite Oak borough\tPA\tPennsylvania\tAllegheny County\t7868\t48.1\t32.2\t8.6\t27751\t116615\t0.5669\t15131\tObama\t15131\t0.022327969\t15131.0\n18356\t-79.843812\t40.341828\tMcKeesport city\tPA\tPennsylvania\tAllegheny County\t21794\t41.4\t14.3\t18.8\t17647\t57077\t0.5669\t15132\tObama\t15132\t0.061847452000000004\t15132.0\n18357\t-80.03627900000001\t40.323941\tBethel Park borough\tPA\tPennsylvania\tAllegheny County\t32171\t46.2\t44.0\t6.7\t31671\t178517\t0.5669\t15102\tObama\t15102\t0.091295512\t15102.0\n18358\t-79.830663\t40.31777\tVersailles borough\tPA\tPennsylvania\tAllegheny County\t1548\t46.8\t11.7\t5.8\t24779\t84507\t0.5669\t15135\tObama\t15135\t0.004392946\t15135.0\n18359\t-79.890087\t40.35116\tDravosburg borough\tPA\tPennsylvania\tAllegheny County\t1820\t45.6\t12.7\t11.9\t22054\t73526\t0.5669\t15034\tObama\t15034\t0.005164833\t15034.0\n18360\t-79.80727900000001\t40.38487\tEast McKeesport borough\tPA\tPennsylvania\tAllegheny County\t2162\t44.6\t14.0\t11.2\t24126\t80147\t0.5669\t15035\tObama\t15035\t0.006135366999999999\t15035.0\n18361\t-79.909646\t40.407191999999995\tHomestead borough\tPA\tPennsylvania\tAllegheny County\t3309\t43.7\t12.7\t17.1\t14995\t48627\t0.5669\t151HH\tObama\t151HH\t0.009390347\t0.0\n18362\t-79.88607900000001\t40.326056\tGlassport borough\tPA\tPennsylvania\tAllegheny County\t4585\t45.0\t10.8\t10.3\t21587\t66667\t0.5669\t15045\tObama\t15045\t0.013011405\t15045.0\n18363\t-80.15573499999999\t40.526931\tHaysville borough\tPA\tPennsylvania\tAllegheny County\t69\t45.5\t20.8\t0.0\t41707\t80000\t0.5669\t15225\tObama\t15225\t0.00019581\t15225.0\n18364\t-79.716549\t40.638083\tHarrison Township CDP\tPA\tPennsylvania\tAllegheny County\t10165\t45.7\t21.4\t10.2\t24421\t116553\t0.5669\t15065\tObama\t15065\t0.028846442000000003\t15065.0\n18365\t-79.836146\t40.520127\tOakmont borough\tPA\tPennsylvania\tAllegheny County\t6570\t48.2\t45.0\t7.6\t31374\t172926\t0.5669\t15139\tObama\t15139\t0.018644478\t15139.0\n18366\t-79.873278\t40.444292\tWilkinsburg borough\tPA\tPennsylvania\tAllegheny County\t17324\t40.5\t27.9\t13.4\t21902\t82506\t0.5669\t15221\tObama\t15221\t0.049162396\t15221.0\n18367\t-79.88701800000001\t40.271382\tElizabeth borough\tPA\tPennsylvania\tAllegheny County\t1495\t43.8\t14.5\t15.4\t18838\t87083\t0.5669\t15088\tObama\t15088\t0.004242541\t15088.0\n18368\t-79.885103\t40.420032\tSwissvale borough\tPA\tPennsylvania\tAllegheny County\t9038\t41.0\t30.3\t11.7\t25290\t83308\t0.5669\t15218\tObama\t15218\t0.025648217999999997\t15218.0\n18369\t-79.903832\t40.492666\tAspinwall borough\tPA\tPennsylvania\tAllegheny County\t2831\t40.9\t58.6\t5.3\t35889\t190396\t0.5669\t15215\tObama\t15215\t0.008033869\t15215.0\n18370\t-79.994281\t40.298658\tSouth Park Township CDP\tPA\tPennsylvania\tAllegheny County\t13843\t40.4\t29.0\t7.0\t27197\t160156\t0.5669\t15129\tObama\t15129\t0.039283944\t15129.0\n18371\t-79.973824\t40.481628\tMillvale borough\tPA\tPennsylvania\tAllegheny County\t3667\t37.7\t11.2\t13.1\t19906\t68577\t0.5669\t15209\tObama\t15209\t0.010406285999999999\t15209.0\n18372\t-80.186797\t40.400273\tOakdale borough\tPA\tPennsylvania\tAllegheny County\t1490\t46.5\t20.3\t7.9\t24270\t127632\t0.5669\t15071\tObama\t15071\t0.004228352\t15071.0\n18373\t-80.037723\t40.393966\tDormont borough\tPA\tPennsylvania\tAllegheny County\t8824\t38.9\t33.1\t9.2\t27742\t125523\t0.5669\t15216\tObama\t15216\t0.025040925\t15216.0\n18374\t-79.966735\t40.380613000000004\tBaldwin borough\tPA\tPennsylvania\tAllegheny County\t19315\t46.5\t22.4\t8.3\t26477\t133937\t0.5669\t15227\tObama\t15227\t0.054812495999999995\t15227.0\n18375\t-79.985805\t40.411293\tMount Oliver borough\tPA\tPennsylvania\tAllegheny County\t3522\t37.9\t11.6\t15.9\t21089\t69504\t0.5669\t15210\tObama\t15210\t0.009994803\t15210.0\n18376\t-79.760315\t40.426103999999995\tMunicipality of Monroeville borough\tPA\tPennsylvania\tAllegheny County\t27958\t46.5\t42.3\t7.3\t29265\t144375\t0.5669\t15146\tObama\t15146\t0.079339775\t15146.0\n18377\t-80.102965\t40.477853\tKennedy Township CDP\tPA\tPennsylvania\tAllegheny County\t7388\t47.0\t27.6\t8.9\t27196\t166521\t0.5669\t15136\tObama\t15136\t0.020965815\t15136.0\n18378\t-79.81024599999999\t40.394096999999995\tWilmerding borough\tPA\tPennsylvania\tAllegheny County\t1927\t42.7\t17.4\t10.2\t17935\t67833\t0.5669\t15148\tObama\t15148\t0.005468479\t15148.0\n18379\t-79.925353\t40.493949\tSharpsburg borough\tPA\tPennsylvania\tAllegheny County\t3371\t45.3\t15.6\t10.6\t21071\t87151\t0.5669\t15215\tObama\t15215\t0.009566291999999999\t15215.0\n18380\t-79.890103\t40.524634000000006\tFox Chapel borough\tPA\tPennsylvania\tAllegheny County\t5118\t47.1\t83.0\t4.8\t77566\t669414\t0.5669\t15238\tObama\t15238\t0.014523963\t15238.0\n18381\t-79.867068\t40.50452\tO'Hara Township CDP\tPA\tPennsylvania\tAllegheny County\t9342\t48.8\t55.2\t6.9\t39364\t254116\t0.5669\t15238\tObama\t15238\t0.026510916000000002\t15238.0\n18382\t-79.886606\t40.400619\tWhitaker borough\tPA\tPennsylvania\tAllegheny County\t1256\t44.8\t12.5\t10.5\t20440\t74231\t0.5669\t15120\tObama\t15120\t0.003564302\t15120.0\n18383\t-79.881086\t40.410987\tRankin borough\tPA\tPennsylvania\tAllegheny County\t2034\t32.7\t5.8\t21.0\t12912\t39096\t0.5669\t15218\tObama\t15218\t0.005772126\t15218.0\n18384\t-79.952993\t40.584326000000004\tHampton Township CDP\tPA\tPennsylvania\tAllegheny County\t18300\t43.8\t48.7\t6.9\t34887\t211321\t0.5669\t15101\tObama\t15101\t0.051932109000000004\t15101.0\n18385\t-79.82104\t40.408976\tTurtle Creek borough\tPA\tPennsylvania\tAllegheny County\t5527\t42.9\t16.2\t7.4\t23312\t70219\t0.5669\t15145\tObama\t15145\t0.015684632\t15145.0\n18386\t-80.024134\t40.525524\tRoss Township CDP\tPA\tPennsylvania\tAllegheny County\t30906\t47.2\t39.7\t6.3\t30704\t166885\t0.5669\t15229\tObama\t15229\t0.087705669\t15229.0\n18387\t-80.049317\t40.375282\tMount Lebanon CDP\tPA\tPennsylvania\tAllegheny County\t31919\t44.9\t67.3\t5.8\t39532\t227248\t0.5669\t15228\tObama\t15228\t0.090580381\t15228.0\n18388\t-79.84166\t40.438964\tChurchill borough\tPA\tPennsylvania\tAllegheny County\t3309\t51.9\t61.7\t5.5\t42353\t197421\t0.5669\t15235\tObama\t15235\t0.009390347\t15235.0\n18389\t-79.850177\t40.373071\tDuquesne city\tPA\tPennsylvania\tAllegheny County\t6183\t37.3\t10.9\t18.0\t15598\t52932\t0.5669\t15110\tObama\t15110\t0.017546242\t15110.0\n18390\t-80.13320300000001\t40.520775\tGlenfield borough\tPA\tPennsylvania\tAllegheny County\t218\t38.9\t13.0\t7.6\t23716\t98000\t0.5669\t15225\tObama\t15225\t0.000618645\t15225.0\n18391\t-79.989808\t40.36022\tWhitehall borough\tPA\tPennsylvania\tAllegheny County\t13839\t47.5\t36.0\t9.2\t30681\t161302\t0.5669\t15236\tObama\t15236\t0.039272593\t15236.0\n18392\t-80.106224\t40.358019\tBridgeville borough\tPA\tPennsylvania\tAllegheny County\t4982\t46.3\t23.0\t7.6\t26508\t118536\t0.5669\t15017\tObama\t15017\t0.01413802\t15017.0\n18393\t-80.167827\t40.530921\tOsborne borough\tPA\tPennsylvania\tAllegheny County\t521\t47.6\t64.5\t4.3\t47613\t318750\t0.5669\t15143\tObama\t15143\t0.0014785039999999998\t15143.0\n18394\t-79.85315600000001\t40.401909\tNorth Braddock borough\tPA\tPennsylvania\tAllegheny County\t5663\t40.6\t11.3\t13.7\t18241\t49948\t0.5669\t15104\tObama\t15104\t0.016070575\t15104.0\n18395\t-79.825463\t40.476089\tPenn Hills CDP\tPA\tPennsylvania\tAllegheny County\t43334\t45.4\t26.6\t8.4\t26003\t106433\t0.5669\t15235\tObama\t15235\t0.122974098\t15235.0\n18396\t-80.08417299999999\t40.333587\tUpper St. Clair CDP\tPA\tPennsylvania\tAllegheny County\t19083\t45.7\t70.9\t5.3\t46637\t279501\t0.5669\t15241\tObama\t15241\t0.054154122\t15241.0\n18397\t-80.100755\t40.428262\tPennsbury Village borough\tPA\tPennsylvania\tAllegheny County\t717\t39.2\t54.3\t7.8\t40649\t92479\t0.5669\t15106\tObama\t15106\t0.002034717\t15106.0\n18398\t-79.776246\t40.407796000000005\tPitcairn borough\tPA\tPennsylvania\tAllegheny County\t3366\t40.8\t13.3\t12.2\t22349\t79301\t0.5669\t15140\tObama\t15140\t0.009552103000000001\t15140.0\n18399\t-79.95965\t40.329714\tPleasant Hills borough\tPA\tPennsylvania\tAllegheny County\t8136\t46.5\t45.5\t6.4\t31557\t156563\t0.5669\t15236\tObama\t15236\t0.023088505\t15236.0\n18400\t-79.92675899999999\t40.397836\tWest Homestead borough\tPA\tPennsylvania\tAllegheny County\t2036\t47.7\t21.1\t11.7\t20157\t106571\t0.5669\t15207\tObama\t15207\t0.005777801999999999\t15207.0\n18401\t-79.684783\t41.092149\tParker city\tPA\tPennsylvania\tArmstrong County\t703\t40.9\t10.9\t14.3\t16669\t94464\t0.3056\t16049\tObama\t16049\t0.001994988\t16049.0\n18402\t-79.240709\t40.88107\tDayton borough\tPA\tPennsylvania\tArmstrong County\t484\t45.7\t14.1\t11.9\t21446\t65750\t0.3056\t16222\tObama\t16222\t0.001373505\t16222.0\n18403\t-79.602047\t40.630424\tLeechburg borough\tPA\tPennsylvania\tArmstrong County\t2148\t44.3\t16.2\t8.8\t23774\t92778\t0.3056\t15656\tObama\t15656\t0.0060956380000000004\t15656.0\n18404\t-79.556275\t40.593924\tNorth Apollo borough\tPA\tPennsylvania\tArmstrong County\t1278\t45.3\t10.8\t12.6\t21236\t103309\t0.3056\t15673\tObama\t15673\t0.0036267340000000004\t15673.0\n18405\t-79.531914\t40.769935\tFord City borough\tPA\tPennsylvania\tArmstrong County\t3250\t42.1\t11.1\t9.3\t19819\t74237\t0.3056\t16228\tObama\t16228\t0.009222915\t16228.0\n18406\t-79.541623\t40.584697999999996\tOrchard Hills CDP\tPA\tPennsylvania\tArmstrong County\t2076\t45.4\t10.2\t11.4\t22293\t115809\t0.3056\t15673\tObama\t15673\t0.005891315\t15673.0\n18407\t-79.564669\t40.584739\tApollo borough\tPA\tPennsylvania\tArmstrong County\t1617\t38.4\t10.9\t11.4\t17259\t77286\t0.3056\t15673\tObama\t15673\t0.004588755\t15673.0\n18408\t-79.531082\t40.81266\tWest Kittanning borough\tPA\tPennsylvania\tArmstrong County\t1023\t46.5\t16.9\t7.2\t20795\t111473\t0.3056\t16238\tObama\t16238\t0.00290309\t16238.0\n18409\t-79.562846\t40.61165\tNorth Vandergrift-Pleasant View CDP\tPA\tPennsylvania\tArmstrong County\t1348\t46.1\t7.8\t9.9\t19644\t77821\t0.3056\t15690\tObama\t15690\t0.003825382\t15690.0\n18410\t-79.259126\t40.750896999999995\tAtwood borough\tPA\tPennsylvania\tArmstrong County\t97\t37.9\t3.3\t12.8\t14055\t71667\t0.3056\t16250\tObama\t16250\t0.000275269\t16250.0\n18411\t-79.68439599999999\t40.682623\tFreeport borough\tPA\tPennsylvania\tArmstrong County\t1797\t41.4\t17.6\t10.7\t20393\t82288\t0.3056\t16229\tObama\t16229\t0.005099563\t16229.0\n18412\t-79.52186\t40.82781\tKittanning borough\tPA\tPennsylvania\tArmstrong County\t4537\t40.7\t12.9\t7.8\t17984\t70814\t0.3056\t16201\tObama\t16201\t0.01287519\t16201.0\n18413\t-79.634202\t40.837468\tWorthington borough\tPA\tPennsylvania\tArmstrong County\t697\t45.1\t12.2\t9.3\t21567\t104487\t0.3056\t16262\tObama\t16262\t0.001977961\t16262.0\n18414\t-79.339344\t40.999288\tSouth Bethlehem borough\tPA\tPennsylvania\tArmstrong County\t396\t44.9\t12.0\t8.7\t21933\t80000\t0.3056\t16242\tObama\t16242\t0.001123777\t16242.0\n18415\t-79.53549\t40.760857\tFord Cliff borough\tPA\tPennsylvania\tArmstrong County\t361\t46.2\t13.8\t10.9\t20491\t73571\t0.3056\t16228\tObama\t16228\t0.001024453\t16228.0\n18416\t-79.521507\t40.763123\tLenape Heights CDP\tPA\tPennsylvania\tArmstrong County\t1199\t47.9\t20.7\t11.2\t21993\t121127\t0.3056\t16228\tObama\t16228\t0.0034025459999999998\t16228.0\n18417\t-79.560488\t40.828990999999995\tWest Hills CDP\tPA\tPennsylvania\tArmstrong County\t1347\t46.3\t27.3\t6.3\t23657\t138474\t0.3056\t16238\tObama\t16238\t0.003822544\t16238.0\n18418\t-79.520179\t40.788199\tManorville borough\tPA\tPennsylvania\tArmstrong County\t473\t44.5\t18.2\t7.7\t17622\t96765\t0.3056\t16238\tObama\t16238\t0.001342289\t16238.0\n18419\t-79.314806\t40.799132\tRural Valley borough\tPA\tPennsylvania\tArmstrong County\t820\t47.1\t13.6\t13.5\t16152\t95435\t0.3056\t16263\tObama\t16263\t0.0023270129999999997\t16263.0\n18420\t-79.521885\t40.808287\tApplewold borough\tPA\tPennsylvania\tArmstrong County\t351\t46.6\t30.5\t6.1\t23922\t146196\t0.3056\t16238\tObama\t16238\t0.000996075\t16238.0\n18421\t-79.34243199999999\t40.694708\tElderton borough\tPA\tPennsylvania\tArmstrong County\t336\t46.6\t7.4\t12.0\t20926\t117969\t0.3056\t15736\tObama\t15736\t0.000953508\t15736.0\n18422\t-80.422596\t40.624383\tShippingport borough\tPA\tPennsylvania\tBeaver County\t229\t38.0\t10.0\t15.6\t21842\t119643\t0.4605\t15052\tObama\t15052\t0.000649861\t15052.0\n18423\t-80.18418199999999\t40.640846999999994\tEconomy borough\tPA\tPennsylvania\tBeaver County\t9175\t46.3\t28.2\t8.1\t29753\t173842\t0.4605\t15005\tObama\t15005\t0.026037\t15005.0\n18424\t-80.22655\t40.592267\tAmbridge borough\tPA\tPennsylvania\tBeaver County\t7309\t42.4\t17.7\t11.4\t20965\t78678\t0.4605\t15003\tObama\t15003\t0.020741627\t15003.0\n18425\t-80.274243\t40.683636\tMonaca borough\tPA\tPennsylvania\tBeaver County\t5947\t42.7\t11.0\t7.0\t25518\t112924\t0.4605\t15061\tObama\t15061\t0.016876516\t15061.0\n18426\t-80.255325\t40.615511\tAliquippa city\tPA\tPennsylvania\tBeaver County\t10694\t42.2\t11.7\t13.9\t19510\t82092\t0.4605\t15001\tObama\t15001\t0.030347648999999997\t15001.0\n18427\t-80.315442\t40.76749\tEastvale borough\tPA\tPennsylvania\tBeaver County\t276\t43.8\t19.8\t16.0\t24651\t149000\t0.4605\t15010\tObama\t15010\t0.000783238\t15010.0\n18428\t-80.329131\t40.812622\tHomewood borough\tPA\tPennsylvania\tBeaver County\t135\t49.7\t8.3\t7.5\t18653\t79000\t0.4605\t16136\tObama\t16136\t0.000383106\t16136.0\n18429\t-80.219303\t40.608697\tHarmony Township CDP\tPA\tPennsylvania\tBeaver County\t3178\t47.1\t18.0\t10.0\t25135\t113946\t0.4605\t15003\tObama\t15003\t0.009018591999999999\t15003.0\n18430\t-80.50796\t40.644714\tGlasgow borough\tPA\tPennsylvania\tBeaver County\t59\t46.3\t11.4\t3.3\t19592\t125000\t0.4605\t15059\tObama\t15059\t0.00016743099999999998\t15059.0\n18431\t-80.478441\t40.687113000000004\tOhioville borough\tPA\tPennsylvania\tBeaver County\t3634\t44.5\t12.4\t7.4\t22343\t137216\t0.4605\t15059\tObama\t15059\t0.010312638\t15059.0\n18432\t-80.312414\t40.723348\tFallston borough\tPA\tPennsylvania\tBeaver County\t309\t46.1\t23.2\t14.1\t23722\t88462\t0.4605\t15066\tObama\t15066\t0.000876886\t15066.0\n18433\t-80.308904\t40.735496000000005\tNew Brighton borough\tPA\tPennsylvania\tBeaver County\t6342\t38.3\t12.3\t18.1\t18240\t83345\t0.4605\t15066\tObama\t15066\t0.017997455\t15066.0\n18434\t-80.45571600000001\t40.638272\tMidland borough\tPA\tPennsylvania\tBeaver County\t2759\t41.0\t8.0\t16.9\t16715\t63409\t0.4605\t15059\tObama\t15059\t0.007829546\t15059.0\n18435\t-80.33228000000001\t40.742734000000006\tPatterson Township CDP\tPA\tPennsylvania\tBeaver County\t3055\t46.9\t24.2\t8.6\t23148\t129653\t0.4605\t15010\tObama\t15010\t0.008669541\t15010.0\n18436\t-80.473332\t40.599073\tHookstown borough\tPA\tPennsylvania\tBeaver County\t147\t37.8\t9.3\t15.4\t21833\t117500\t0.4605\t15043\tObama\t15043\t0.00041716\t15043.0\n18437\t-80.499636\t40.641878000000005\tGeorgetown borough\tPA\tPennsylvania\tBeaver County\t169\t38.3\t16.2\t12.6\t21549\t131250\t0.4605\t15059\tObama\t15059\t0.000479592\t15059.0\n18438\t-80.423589\t40.810406\tDarlington borough\tPA\tPennsylvania\tBeaver County\t284\t41.3\t9.2\t11.0\t17580\t107031\t0.4605\t16115\tObama\t16115\t0.000805941\t16115.0\n18439\t-80.326094\t40.739138\tPatterson Heights borough\tPA\tPennsylvania\tBeaver County\t647\t46.8\t39.4\t11.8\t27734\t187500\t0.4605\t15010\tObama\t15010\t0.00183607\t15010.0\n18440\t-80.321502\t40.834947\tKoppel borough\tPA\tPennsylvania\tBeaver County\t755\t44.8\t13.1\t9.9\t19354\t83125\t0.4605\t16136\tObama\t16136\t0.002142554\t16136.0\n18441\t-80.322751\t40.762034\tBeaver Falls city\tPA\tPennsylvania\tBeaver County\t9162\t36.0\t16.2\t16.7\t16867\t69328\t0.4605\t15010\tObama\t15010\t0.026000107999999997\t15010.0\n18442\t-80.444324\t40.480559\tFrankfort Springs borough\tPA\tPennsylvania\tBeaver County\t128\t40.9\t16.7\t6.8\t21824\t121875\t0.4605\t15050\tObama\t15050\t0.000363241\t15050.0\n18443\t-80.221863\t40.639059\tBaden borough\tPA\tPennsylvania\tBeaver County\t4134\t47.9\t16.5\t8.9\t24182\t114708\t0.4605\t15005\tObama\t15005\t0.011731548\t15005.0\n18444\t-80.26871700000001\t40.698423\tEast Rochester borough\tPA\tPennsylvania\tBeaver County\t595\t44.4\t6.8\t9.0\t21521\t81000\t0.4605\t15074\tObama\t15074\t0.0016885029999999998\t15074.0\n18445\t-80.283636\t40.702532\tRochester borough\tPA\tPennsylvania\tBeaver County\t3779\t42.1\t14.1\t9.5\t23756\t81802\t0.4605\t15074\tObama\t15074\t0.010724121999999999\t15074.0\n18446\t-80.36324300000001\t40.823401000000004\tBig Beaver borough\tPA\tPennsylvania\tBeaver County\t1982\t47.8\t13.4\t11.0\t23439\t105592\t0.4605\t16136\tObama\t16136\t0.00562456\t16136.0\n18447\t-80.252928\t40.685433\tFreedom borough\tPA\tPennsylvania\tBeaver County\t1659\t36.1\t10.7\t12.1\t16583\t76809\t0.4605\t15042\tObama\t15042\t0.004707944\t15042.0\n18448\t-80.33885500000001\t40.780295\tWest Mayfield borough\tPA\tPennsylvania\tBeaver County\t1116\t43.0\t14.9\t7.8\t20940\t104219\t0.4605\t15010\tObama\t15010\t0.0031670070000000003\t15010.0\n18449\t-80.30761700000001\t40.693923999999996\tBeaver borough\tPA\tPennsylvania\tBeaver County\t4552\t46.6\t41.2\t7.6\t28072\t170124\t0.4605\t15009\tObama\t15009\t0.012917757\t15009.0\n18450\t-80.241714\t40.667113\tConway borough\tPA\tPennsylvania\tBeaver County\t2167\t47.0\t16.2\t5.7\t20494\t124240\t0.4605\t15027\tObama\t15027\t0.006149556\t15027.0\n18451\t-80.30089100000001\t40.706749\tBridgewater borough\tPA\tPennsylvania\tBeaver County\t693\t46.7\t20.6\t7.9\t23001\t125379\t0.4605\t15074\tObama\t15074\t0.001966609\t15074.0\n18452\t-80.400747\t40.833673\tNew Galilee borough\tPA\tPennsylvania\tBeaver County\t383\t47.1\t15.7\t12.2\t25270\t120000\t0.4605\t16141\tObama\t16141\t0.001086885\t16141.0\n18453\t-80.41131700000001\t40.659132\tIndustry borough\tPA\tPennsylvania\tBeaver County\t1847\t47.0\t15.6\t9.0\t21730\t116132\t0.4605\t15052\tObama\t15052\t0.005241454\t15052.0\n18454\t-80.236101\t40.57503\tSouth Heights borough\tPA\tPennsylvania\tBeaver County\t525\t44.9\t16.2\t6.9\t26870\t138068\t0.4605\t15081\tObama\t15081\t0.0014898560000000001\t15081.0\n18455\t-78.502934\t40.015074\tBedford borough\tPA\tPennsylvania\tBedford County\t2937\t45.9\t26.4\t7.6\t24522\t147081\t0.2207\t15522\tObama\t15522\t0.008334678\t15522.0\n18456\t-78.216987\t40.167527\tCoaldale borough\tPA\tPennsylvania\tBedford County\t140\t38.1\t7.4\t20.3\t15365\t66000\t0.2207\t16679\tObama\t16679\t0.000397295\t16679.0\n18457\t-78.517123\t39.895148\tRainsburg borough\tPA\tPennsylvania\tBedford County\t144\t44.7\t12.3\t9.5\t19798\t146875\t0.2207\t15535\tObama\t15535\t0.000408646\t15535.0\n18458\t-78.247062\t40.212747\tSaxton borough\tPA\tPennsylvania\tBedford County\t742\t40.2\t14.5\t16.9\t21837\t101111\t0.2207\t16678\tObama\t16678\t0.002105663\t16678.0\n18459\t-78.721556\t39.820734\tHyndman borough\tPA\tPennsylvania\tBedford County\t934\t42.4\t7.3\t11.1\t15538\t78966\t0.2207\t15545\tObama\t15545\t0.002650524\t15545.0\n18460\t-78.643383\t40.108076000000004\tNew Paris borough\tPA\tPennsylvania\tBedford County\t214\t42.2\t16.0\t15.7\t18885\t135938\t0.2207\t15559\tObama\t15559\t0.000607294\t15559.0\n18461\t-78.365978\t40.225355\tWoodbury borough\tPA\tPennsylvania\tBedford County\t264\t35.9\t15.3\t8.1\t15947\t130208\t0.2207\t16695\tObama\t16695\t0.000749185\t16695.0\n18462\t-78.591204\t40.007083\tManns Choice borough\tPA\tPennsylvania\tBedford County\t277\t43.6\t18.4\t9.6\t19270\t119531\t0.2207\t15550\tObama\t15550\t0.000786076\t15550.0\n18463\t-78.26642700000001\t40.134321\tHopewell borough\tPA\tPennsylvania\tBedford County\t214\t39.7\t8.1\t10.1\t16732\t109615\t0.2207\t16650\tObama\t16650\t0.000607294\t16650.0\n18464\t-78.613463\t40.179762\tPleasantville borough\tPA\tPennsylvania\tBedford County\t216\t38.1\t10.5\t9.7\t15099\t109167\t0.2207\t15521\tObama\t15521\t0.000612969\t15521.0\n18465\t-78.64301400000001\t40.048884\tSchellsburg borough\tPA\tPennsylvania\tBedford County\t328\t45.8\t10.7\t9.1\t21131\t132031\t0.2207\t15559\tObama\t15559\t0.000930805\t15559.0\n18466\t-78.372745\t40.013498\tEverett borough\tPA\tPennsylvania\tBedford County\t1801\t41.5\t12.7\t13.2\t17910\t99286\t0.2207\t15537\tObama\t15537\t0.005110914\t15537.0\n18467\t-78.51091600000001\t40.155846000000004\tSt. Clairsville borough\tPA\tPennsylvania\tBedford County\t87\t39.5\t3.5\t11.1\t20496\t121875\t0.2207\t16667\tObama\t16667\t0.00024689\t16667.0\n18468\t-75.913404\t40.389565999999995\tLaureldale borough\tPA\tPennsylvania\tBerks County\t3801\t45.4\t12.6\t12.3\t28485\t136753\t0.4874\t19560\tObama\t19560\t0.010786553999999999\t19560.0\n18469\t-76.005657\t40.486153\tCenterport borough\tPA\tPennsylvania\tBerks County\t370\t41.1\t16.2\t7.9\t23311\t189583\t0.4874\t19516\tObama\t19516\t0.001049993\t19516.0\n18470\t-76.11069300000001\t40.434160999999996\tBernville borough\tPA\tPennsylvania\tBerks County\t971\t42.5\t17.0\t7.4\t23189\t172500\t0.4874\t19506\tObama\t19506\t0.0027555229999999997\t19506.0\n18471\t-75.994385\t40.322966\tWest Wyomissing CDP\tPA\tPennsylvania\tBerks County\t3057\t44.5\t24.1\t6.6\t29104\t142813\t0.4874\t19609\tObama\t19609\t0.008675216\t19609.0\n18472\t-75.98285600000001\t40.556086\tHamburg borough\tPA\tPennsylvania\tBerks County\t4232\t42.3\t17.8\t8.1\t26869\t138868\t0.4874\t19526\tObama\t19526\t0.012009655\t19526.0\n18473\t-76.183826\t40.491606\tStrausstown borough\tPA\tPennsylvania\tBerks County\t384\t40.8\t13.0\t9.0\t21554\t190909\t0.4874\t19559\tObama\t19559\t0.0010897230000000001\t19559.0\n18474\t-75.969368\t40.500553000000004\tShoemakersville borough\tPA\tPennsylvania\tBerks County\t2248\t42.5\t11.3\t10.1\t21188\t135478\t0.4874\t19555\tObama\t19555\t0.00637942\t19555.0\n18475\t-75.916011\t40.276596999999995\tFlying Hills CDP\tPA\tPennsylvania\tBerks County\t1198\t45.1\t47.2\t8.7\t44023\t174500\t0.4874\t19607\tObama\t19607\t0.0033997090000000003\t19607.0\n18476\t-75.702479\t40.50329\tTopton borough\tPA\tPennsylvania\tBerks County\t2056\t45.4\t21.9\t7.5\t25207\t164607\t0.4874\t19562\tObama\t19562\t0.005834558\t19562.0\n18477\t-75.73311\t40.269819\tAmity Gardens CDP\tPA\tPennsylvania\tBerks County\t3529\t39.1\t30.8\t8.1\t31565\t227061\t0.4874\t19518\tObama\t19518\t0.010014667\t19518.0\n18478\t-75.889173\t40.328544\tMount Penn borough\tPA\tPennsylvania\tBerks County\t3080\t40.1\t22.2\t11.5\t27592\t133716\t0.4874\t19606\tObama\t19606\t0.008740486\t19606.0\n18479\t-76.186807\t40.365243\tWomelsdorf borough\tPA\tPennsylvania\tBerks County\t2769\t40.3\t19.0\t7.5\t25463\t136646\t0.4874\t19567\tObama\t19567\t0.007857924\t19567.0\n18480\t-75.926569\t40.340061999999996\tReading city\tPA\tPennsylvania\tBerks County\t86603\t31.0\t11.2\t16.8\t16031\t71562\t0.4874\t19601\tObama\t19601\t0.245763738\t19601.0\n18481\t-75.968762\t40.444669\tLeesport borough\tPA\tPennsylvania\tBerks County\t2341\t38.9\t21.0\t7.8\t24294\t148295\t0.4874\t195HH\tObama\t195HH\t0.006643336999999999\t0.0\n18482\t-76.023431\t40.32416\tSinking Spring borough\tPA\tPennsylvania\tBerks County\t3230\t42.3\t26.6\t8.3\t28925\t160067\t0.4874\t19608\tObama\t19608\t0.009166159\t19608.0\n18483\t-75.846896\t40.292064\tLorane CDP\tPA\tPennsylvania\tBerks County\t3826\t41.7\t17.8\t8.3\t28660\t183867\t0.4874\t19508\tObama\t19508\t0.0108575\t19508.0\n18484\t-75.86350300000001\t40.312622999999995\tReiffton CDP\tPA\tPennsylvania\tBerks County\t3732\t45.9\t35.4\t7.9\t30073\t207662\t0.4874\t19606\tObama\t19606\t0.010590745\t19606.0\n18485\t-75.637454\t40.332407\tBoyertown borough\tPA\tPennsylvania\tBerks County\t4165\t41.6\t16.8\t6.5\t26486\t163199\t0.4874\t19545\tObama\t19545\t0.011819521000000001\t19545.0\n18486\t-75.98719799999999\t40.286863000000004\tMohnton borough\tPA\tPennsylvania\tBerks County\t3086\t40.9\t29.9\t8.2\t27767\t154065\t0.4874\t19607\tObama\t19607\t0.008757513\t19607.0\n18487\t-75.810337\t40.261801\tBirdsboro borough\tPA\tPennsylvania\tBerks County\t5149\t37.7\t20.7\t10.0\t23725\t163779\t0.4874\t19508\tObama\t19508\t0.014611936\t19508.0\n18488\t-75.889505\t40.183422\tNew Morgan borough\tPA\tPennsylvania\tBerks County\t60\t40.0\t26.2\t6.1\t25347\t208333\t0.4874\t19543\tObama\t19543\t0.00017026900000000002\t19543.0\n18489\t-75.587591\t40.400546000000006\tBally borough\tPA\tPennsylvania\tBerks County\t1200\t41.7\t18.4\t5.8\t28211\t183477\t0.4874\t19503\tObama\t19503\t0.0034053840000000004\t19503.0\n18490\t-75.989265\t40.353246999999996\tSpring Ridge CDP\tPA\tPennsylvania\tBerks County\t1000\t49.7\t53.8\t7.4\t51394\t249206\t0.4874\t19610\tObama\t19610\t0.00283782\t19610.0\n18491\t-76.08098199999999\t40.330221\tWernersville borough\tPA\tPennsylvania\tBerks County\t2366\t45.8\t26.4\t8.4\t27788\t162592\t0.4874\t19565\tObama\t19565\t0.006714281999999999\t19565.0\n18492\t-75.993708\t40.328983\tWest Lawn borough\tPA\tPennsylvania\tBerks County\t1629\t41.8\t21.0\t8.6\t25458\t142149\t0.4874\t19609\tObama\t19609\t0.004622809\t19609.0\n18493\t-75.759734\t40.480465\tLyons borough\tPA\tPennsylvania\tBerks County\t564\t39.5\t16.2\t9.4\t22931\t167500\t0.4874\t19536\tObama\t19536\t0.001600531\t19536.0\n18494\t-75.967749\t40.330942\tWyomissing borough\tPA\tPennsylvania\tBerks County\t8756\t50.3\t45.0\t9.3\t40758\t259314\t0.4874\t19610\tObama\t19610\t0.024847953\t19610.0\n18495\t-75.966725\t40.302753\tShillington borough\tPA\tPennsylvania\tBerks County\t5057\t43.7\t33.1\t7.4\t30462\t145561\t0.4874\t19607\tObama\t19607\t0.014350856\t19607.0\n18496\t-75.865418\t40.325737\tSt. Lawrence borough\tPA\tPennsylvania\tBerks County\t1887\t40.7\t25.6\t9.4\t28258\t162207\t0.4874\t19606\tObama\t19606\t0.0053549669999999995\t19606.0\n18497\t-75.946776\t40.33378\tWest Reading borough\tPA\tPennsylvania\tBerks County\t4099\t42.7\t18.4\t7.9\t23846\t118094\t0.4874\t19611\tObama\t19611\t0.011632225\t19611.0\n18498\t-75.630444\t40.37063\tBechtelsville borough\tPA\tPennsylvania\tBerks County\t1119\t39.5\t13.2\t7.3\t24929\t184184\t0.4874\t19505\tObama\t19505\t0.0031755209999999997\t19505.0\n18499\t-75.820909\t40.45668\tFleetwood borough\tPA\tPennsylvania\tBerks County\t4095\t39.6\t21.3\t8.2\t27875\t164015\t0.4874\t19522\tObama\t19522\t0.011620873\t19522.0\n18500\t-75.777484\t40.521324\tKutztown borough\tPA\tPennsylvania\tBerks County\t5234\t28.1\t31.3\t8.0\t21518\t165152\t0.4874\t19530\tObama\t19530\t0.014853151\t19530.0\n18501\t-75.943696\t40.306913\tKenhorst borough\tPA\tPennsylvania\tBerks County\t2677\t46.8\t13.9\t10.3\t27700\t138534\t0.4874\t19607\tObama\t19607\t0.007596845\t19607.0\n18502\t-76.006484\t40.334826\tWhitfield CDP\tPA\tPennsylvania\tBerks County\t3260\t47.6\t46.3\t8.9\t35482\t224947\t0.4874\t19609\tObama\t19609\t0.009251294\t19609.0\n18503\t-75.888834\t40.572964\tLenhartsville borough\tPA\tPennsylvania\tBerks County\t191\t42.7\t25.7\t7.4\t27451\t230000\t0.4874\t19534\tObama\t19534\t0.000542024\t19534.0\n18504\t-75.98366999999999\t40.334573999999996\tWyomissing Hills borough\tPA\tPennsylvania\tBerks County\t2595\t49.5\t45.0\t7.0\t38582\t214264\t0.4874\t19610\tObama\t19610\t0.007364143\t19610.0\n18505\t-76.139319\t40.349996999999995\tRobesonia borough\tPA\tPennsylvania\tBerks County\t2080\t41.4\t16.3\t8.1\t26175\t145333\t0.4874\t19551\tObama\t19551\t0.005902666\t19551.0\n18506\t-78.246329\t40.6769\tTyrone borough\tPA\tPennsylvania\tBlair County\t6002\t41.2\t14.1\t9.0\t20857\t101667\t0.324\t16686\tObama\t16686\t0.017032596\t16686.0\n18507\t-78.300454\t40.635978\tTipton CDP\tPA\tPennsylvania\tBlair County\t914\t44.1\t27.8\t6.9\t25590\t160326\t0.324\t16617\tObama\t16617\t0.0025937679999999998\t16617.0\n18508\t-78.20433299999999\t40.462468\tWilliamsburg borough\tPA\tPennsylvania\tBlair County\t1151\t40.6\t14.9\t9.3\t20920\t93780\t0.324\t16693\tObama\t16693\t0.003266331\t16693.0\n18509\t-78.395923\t40.334413\tRoaring Spring borough\tPA\tPennsylvania\tBlair County\t2588\t39.1\t22.4\t6.8\t25230\t117277\t0.324\t16673\tObama\t16673\t0.007344279\t16673.0\n18510\t-78.333702\t40.600964000000005\tBellwood borough\tPA\tPennsylvania\tBlair County\t1904\t38.4\t15.5\t8.0\t21476\t110274\t0.324\t16617\tObama\t16617\t0.00540321\t16617.0\n18511\t-78.435716\t40.392965000000004\tNewry borough\tPA\tPennsylvania\tBlair County\t231\t46.2\t9.8\t11.5\t20109\t126250\t0.324\t16665\tObama\t16665\t0.0006555360000000001\t16665.0\n18512\t-78.429949\t40.425901\tDuncansville borough\tPA\tPennsylvania\tBlair County\t1181\t47.4\t12.4\t6.8\t23564\t120203\t0.324\t16635\tObama\t16635\t0.0033514659999999996\t16635.0\n18513\t-78.393613\t40.431138\tHollidaysburg borough\tPA\tPennsylvania\tBlair County\t5062\t43.7\t26.9\t4.5\t23762\t130986\t0.324\t16648\tObama\t16648\t0.014365046000000001\t16648.0\n18514\t-78.32452099999999\t40.310598\tMartinsburg borough\tPA\tPennsylvania\tBlair County\t2126\t49.0\t16.6\t7.9\t20764\t119306\t0.324\t16662\tObama\t16662\t0.006033206\t16662.0\n18515\t-78.400932\t40.50846\tAltoona city\tPA\tPennsylvania\tBlair County\t47376\t39.4\t15.2\t10.5\t19804\t92993\t0.324\t16602\tObama\t16602\t0.134444567\t16602.0\n18516\t-78.44826\t40.289597\tClaysburg CDP\tPA\tPennsylvania\tBlair County\t1431\t38.5\t5.4\t9.8\t17967\t109375\t0.324\t16682\tObama\t16682\t0.0040609209999999995\t16682.0\n18517\t-76.34178299999999\t41.857685\tRome borough\tPA\tPennsylvania\tBradford County\t359\t37.7\t15.5\t4.9\t19278\t88125\t0.3681\t18837\tObama\t18837\t0.001018777\t18837.0\n18518\t-76.605624\t41.78164\tBurlington borough\tPA\tPennsylvania\tBradford County\t178\t45.4\t16.9\t7.7\t17505\t134375\t0.3681\t18814\tObama\t18814\t0.0005051319999999999\t18814.0\n18519\t-76.54413199999999\t41.995589\tSouth Waverly borough\tPA\tPennsylvania\tBradford County\t953\t46.5\t22.7\t11.3\t24798\t120614\t0.3681\t18840\tObama\t18840\t0.002704443\t18840.0\n18520\t-76.47569399999999\t41.713509\tMonroe borough\tPA\tPennsylvania\tBradford County\t488\t43.3\t23.6\t9.5\t22776\t128214\t0.3681\t18848\tObama\t18848\t0.001384856\t18848.0\n18521\t-76.44464599999999\t41.600054\tNew Albany borough\tPA\tPennsylvania\tBradford County\t294\t42.7\t13.0\t8.7\t20498\t105833\t0.3681\t18833\tObama\t18833\t0.0008343189999999999\t18833.0\n18522\t-76.261809\t41.670118\tWyalusing borough\tPA\tPennsylvania\tBradford County\t521\t46.3\t24.3\t3.4\t25951\t119485\t0.3681\t18853\tObama\t18853\t0.0014785039999999998\t18853.0\n18523\t-76.178205\t41.837892\tLe Raysville borough\tPA\tPennsylvania\tBradford County\t301\t35.5\t15.2\t6.5\t18553\t126136\t0.3681\t18829\tObama\t18829\t0.0008541839999999999\t18829.0\n18524\t-76.51854300000001\t41.962216999999995\tAthens borough\tPA\tPennsylvania\tBradford County\t3235\t42.2\t21.8\t10.7\t22620\t116071\t0.3681\t18810\tObama\t18810\t0.009180348\t18810.0\n18525\t-76.447338\t41.770697999999996\tTowanda borough\tPA\tPennsylvania\tBradford County\t2800\t40.5\t32.6\t6.1\t25463\t124112\t0.3681\t18848\tObama\t18848\t0.007945896\t18848.0\n18526\t-76.82767199999999\t41.705991999999995\tAlba borough\tPA\tPennsylvania\tBradford County\t178\t41.3\t15.7\t7.6\t17576\t123611\t0.3681\t17724\tObama\t17724\t0.0005051319999999999\t17724.0\n18527\t-76.853027\t41.656595\tCanton borough\tPA\tPennsylvania\tBradford County\t1913\t39.4\t18.2\t6.9\t19790\t101543\t0.3681\t17724\tObama\t17724\t0.00542875\t17724.0\n18528\t-76.856717\t41.804907\tSylvania borough\tPA\tPennsylvania\tBradford County\t188\t41.0\t14.8\t6.9\t18497\t116250\t0.3681\t16947\tObama\t16947\t0.00053351\t16947.0\n18529\t-76.78953100000001\t41.783896999999996\tTroy borough\tPA\tPennsylvania\tBradford County\t1418\t42.8\t23.2\t8.2\t18739\t126027\t0.3681\t16947\tObama\t16947\t0.004024029\t16947.0\n18530\t-76.52076\t41.985739\tSayre borough\tPA\tPennsylvania\tBradford County\t5733\t41.0\t23.1\t8.0\t24320\t116885\t0.3681\t18840\tObama\t18840\t0.016269223\t18840.0\n18531\t-75.084041\t40.18838\tWarminster Heights CDP\tPA\tPennsylvania\tBucks County\t4067\t31.1\t8.7\t13.3\t20923\t250551\t0.5\t18974\tObama\t18974\t0.011541415\t18974.0\n18532\t-75.291891\t40.372043\tPerkasie borough\tPA\tPennsylvania\tBucks County\t8749\t36.5\t26.7\t8.3\t28744\t249266\t0.5\t18960\tObama\t18960\t0.024828087999999998\t18960.0\n18533\t-74.780015\t40.207318\tMorrisville borough\tPA\tPennsylvania\tBucks County\t9876\t37.2\t21.7\t8.9\t29939\t194803\t0.5\t19067\tObama\t19067\t0.028026312\t19067.0\n18534\t-74.91449\t40.155171\tPenndel borough\tPA\tPennsylvania\tBucks County\t2430\t30.8\t19.0\t13.0\t23109\t230491\t0.5\t19047\tObama\t19047\t0.006895903\t19047.0\n18535\t-74.99860799999999\t40.199383000000005\tChurchville CDP\tPA\tPennsylvania\tBucks County\t4255\t46.2\t43.9\t7.6\t39833\t392213\t0.5\t18954\tObama\t18954\t0.012074925\t18954.0\n18536\t-75.204273\t40.373104\tDublin borough\tPA\tPennsylvania\tBucks County\t2200\t31.6\t30.0\t9.5\t28914\t274524\t0.5\t18917\tObama\t18917\t0.0062432040000000005\t18917.0\n18537\t-74.838373\t40.240798999999996\tYardley borough\tPA\tPennsylvania\tBucks County\t2435\t44.0\t52.1\t7.7\t39232\t296121\t0.5\t19067\tObama\t19067\t0.006910092\t19067.0\n18538\t-74.860597\t40.230561\tWoodside CDP\tPA\tPennsylvania\tBucks County\t2503\t43.6\t73.0\t8.5\t51405\t482686\t0.5\t19067\tObama\t19067\t0.007103064\t19067.0\n18539\t-75.180918\t40.298096\tNew Britain borough\tPA\tPennsylvania\tBucks County\t3081\t26.9\t39.0\t11.4\t29210\t255102\t0.5\t18914\tObama\t18914\t0.008743324\t18914.0\n18540\t-74.896752\t40.092317\tCroydon CDP\tPA\tPennsylvania\tBucks County\t9885\t38.8\t10.3\t8.8\t28284\t183501\t0.5\t19021\tObama\t19021\t0.028051852000000002\t19021.0\n18541\t-74.97039000000001\t40.201613\tVillage Shires CDP\tPA\tPennsylvania\tBucks County\t3961\t45.5\t43.0\t8.8\t38592\t323639\t0.5\t18954\tObama\t18954\t0.011240606\t18954.0\n18542\t-74.852928\t40.153779\tLevittown CDP\tPA\tPennsylvania\tBucks County\t52444\t40.0\t16.0\t9.5\t27996\t199597\t0.5\t19057\tObama\t19057\t0.148826639\t19057.0\n18543\t-75.000613\t40.226278\tRichboro CDP\tPA\tPennsylvania\tBucks County\t6640\t42.3\t51.2\t7.4\t42083\t396658\t0.5\t18954\tObama\t18954\t0.018843126\t18954.0\n18544\t-75.345747\t40.439858\tQuakertown borough\tPA\tPennsylvania\tBucks County\t8835\t37.5\t19.8\t8.0\t27266\t192222\t0.5\t18951\tObama\t18951\t0.025072141000000003\t18951.0\n18545\t-74.810848\t40.140135\tTullytown borough\tPA\tPennsylvania\tBucks County\t1954\t41.8\t13.9\t4.9\t30399\t194032\t0.5\t19055\tObama\t19055\t0.005545101\t19055.0\n18546\t-75.379986\t40.412946999999996\tTrumbauersville borough\tPA\tPennsylvania\tBucks County\t1133\t40.2\t22.7\t7.0\t26462\t264516\t0.5\t18970\tObama\t18970\t0.00321525\t18970.0\n18547\t-75.321119\t40.472506\tRichlandtown borough\tPA\tPennsylvania\tBucks County\t1340\t39.1\t17.0\t7.4\t24004\t177734\t0.5\t18955\tObama\t18955\t0.003802679\t18955.0\n18548\t-74.95755799999999\t40.361834\tNew Hope borough\tPA\tPennsylvania\tBucks County\t2253\t45.8\t63.7\t7.7\t54546\t449091\t0.5\t18938\tObama\t18938\t0.006393609000000001\t18938.0\n18549\t-75.308346\t40.359825\tSellersville borough\tPA\tPennsylvania\tBucks County\t4563\t35.8\t23.3\t7.0\t30182\t213485\t0.5\t18960\tObama\t18960\t0.012948973\t18960.0\n18550\t-74.920816\t40.177772\tLanghorne borough\tPA\tPennsylvania\tBucks County\t1980\t35.6\t31.6\t8.8\t27979\t310500\t0.5\t19047\tObama\t19047\t0.005618884\t19047.0\n18551\t-74.887316\t40.201505\tWoodbourne CDP\tPA\tPennsylvania\tBucks County\t4175\t40.5\t56.2\t6.2\t43234\t418225\t0.5\t19047\tObama\t19047\t0.011847898999999999\t19047.0\n18552\t-75.21400600000001\t40.268987\tBrittany Farms-Highlands CDP\tPA\tPennsylvania\tBucks County\t3317\t44.0\t41.7\t7.6\t40054\t262950\t0.5\t18914\tObama\t18914\t0.009413049\t18914.0\n18553\t-75.198954\t40.596577\tRiegelsville borough\tPA\tPennsylvania\tBucks County\t876\t40.5\t27.3\t6.5\t34365\t246471\t0.5\t18077\tObama\t18077\t0.00248593\t18077.0\n18554\t-75.12804799999999\t40.313978999999996\tDoylestown borough\tPA\tPennsylvania\tBucks County\t8146\t48.7\t46.8\t8.3\t40482\t318159\t0.5\t18901\tObama\t18901\t0.023116882999999998\t18901.0\n18555\t-75.209408\t40.289242\tChalfont borough\tPA\tPennsylvania\tBucks County\t4020\t38.9\t43.1\t10.1\t35886\t303299\t0.5\t18914\tObama\t18914\t0.011408037\t18914.0\n18556\t-74.85245\t40.178432\tFairless Hills CDP\tPA\tPennsylvania\tBucks County\t8151\t40.8\t15.5\t7.8\t28774\t210134\t0.5\t19030\tObama\t19030\t0.023131072000000003\t19030.0\n18557\t-75.07264\t40.208842\tIvyland borough\tPA\tPennsylvania\tBucks County\t717\t41.3\t26.7\t8.3\t39234\t268023\t0.5\t18974\tObama\t18974\t0.002034717\t18974.0\n18558\t-74.916691\t40.165707\tLanghorne Manor borough\tPA\tPennsylvania\tBucks County\t932\t43.1\t48.2\t9.4\t31465\t338596\t0.5\t19047\tObama\t19047\t0.002644848\t19047.0\n18559\t-74.93226899999999\t40.228944\tNewtown borough\tPA\tPennsylvania\tBucks County\t2381\t41.8\t54.2\t7.8\t42894\t392895\t0.5\t18940\tObama\t18940\t0.00675685\t18940.0\n18560\t-74.986519\t40.152459\tFeasterville-Trevose CDP\tPA\tPennsylvania\tBucks County\t6590\t38.9\t26.4\t10.1\t30794\t248488\t0.5\t19053\tObama\t19053\t0.018701235\t19053.0\n18561\t-75.271849\t40.346802000000004\tSilverdale borough\tPA\tPennsylvania\tBucks County\t1052\t38.9\t24.7\t10.0\t30295\t281790\t0.5\t18962\tObama\t18962\t0.002985387\t18962.0\n18562\t-74.85218\t40.103304\tBristol borough\tPA\tPennsylvania\tBucks County\t9830\t37.3\t12.8\t14.2\t25439\t160339\t0.5\t19007\tObama\t19007\t0.027895772000000003\t19007.0\n18563\t-74.947795\t40.082162\tCornwells Heights-Eddington CDP\tPA\tPennsylvania\tBucks County\t3466\t42.5\t17.6\t12.7\t31214\t231529\t0.5\t19020\tObama\t19020\t0.009835885\t19020.0\n18564\t-74.956065\t40.259933000000004\tNewtown Grant CDP\tPA\tPennsylvania\tBucks County\t4201\t35.9\t68.5\t6.9\t48711\t298492\t0.5\t18940\tObama\t18940\t0.011921682\t18940.0\n18565\t-74.907712\t40.142142\tHulmeville borough\tPA\tPennsylvania\tBucks County\t839\t37.9\t20.6\t8.0\t29920\t264919\t0.5\t19056\tObama\t19056\t0.002380931\t19056.0\n18566\t-79.896479\t41.006293\tWest Sunbury borough\tPA\tPennsylvania\tButler County\t113\t38.9\t9.3\t10.7\t19011\t131250\t0.3192\t16061\tObama\t16061\t0.000320674\t16061.0\n18567\t-80.062984\t40.693639000000005\tSeven Fields borough\tPA\tPennsylvania\tButler County\t3144\t36.8\t52.0\t6.1\t35355\t256034\t0.3192\t16046\tObama\t16046\t0.008922107\t16046.0\n18568\t-79.81494599999999\t40.751062\tSaxonburg borough\tPA\tPennsylvania\tButler County\t1776\t51.7\t20.3\t11.0\t25297\t149328\t0.3192\t16056\tObama\t16056\t0.005039969\t16056.0\n18569\t-79.915\t40.826596\tOak Hills CDP\tPA\tPennsylvania\tButler County\t2335\t42.6\t31.1\t8.4\t29991\t180789\t0.3192\t16045\tObama\t16045\t0.00662631\t16045.0\n18570\t-79.89455500000001\t40.844305\tMeadowood CDP\tPA\tPennsylvania\tButler County\t2939\t47.5\t24.1\t6.9\t28420\t145130\t0.3192\t16045\tObama\t16045\t0.008340353\t16045.0\n18571\t-79.915723\t40.910472999999996\tShanor-Northvue CDP\tPA\tPennsylvania\tButler County\t4983\t47.3\t35.2\t7.4\t28802\t196429\t0.3192\t16001\tObama\t16001\t0.014140858000000001\t16001.0\n18572\t-79.988928\t40.676738\tValencia borough\tPA\tPennsylvania\tButler County\t583\t40.4\t21.1\t12.3\t21430\t124306\t0.3192\t16046\tObama\t16046\t0.001654449\t16046.0\n18573\t-80.037756\t40.7396\tCallery borough\tPA\tPennsylvania\tButler County\t526\t41.3\t28.6\t9.3\t27321\t178333\t0.3192\t16024\tObama\t16024\t0.0014926929999999998\t16024.0\n18574\t-80.132025\t40.692994\tFernway CDP\tPA\tPennsylvania\tButler County\t12995\t35.3\t50.8\t5.8\t33243\t189229\t0.3192\t16066\tObama\t16066\t0.036877473\t16066.0\n18575\t-80.058003\t41.069482\tSlippery Rock borough\tPA\tPennsylvania\tButler County\t3067\t23.3\t42.5\t9.6\t18098\t138449\t0.3192\t16057\tObama\t16057\t0.008703594\t16057.0\n18576\t-80.083258\t40.698325\tFox Run CDP\tPA\tPennsylvania\tButler County\t3352\t36.0\t42.8\t8.0\t31958\t236492\t0.3192\t16066\tObama\t16066\t0.009512373000000001\t16066.0\n18577\t-80.013788\t40.817448\tConnoquenessing borough\tPA\tPennsylvania\tButler County\t617\t40.3\t27.4\t7.9\t24373\t195109\t0.3192\t16027\tObama\t16027\t0.001750935\t16027.0\n18578\t-80.12525500000001\t40.801221999999996\tHarmony borough\tPA\tPennsylvania\tButler County\t1075\t46.4\t28.2\t7.7\t26295\t152174\t0.3192\t16063\tObama\t16063\t0.003050657\t16063.0\n18579\t-79.79791\t41.137696000000005\tEau Claire borough\tPA\tPennsylvania\tButler County\t357\t40.9\t12.9\t9.9\t18988\t99500\t0.3192\t16030\tObama\t16030\t0.0010131019999999999\t16030.0\n18580\t-80.009303\t41.136084000000004\tHarrisville borough\tPA\tPennsylvania\tButler County\t904\t48.0\t15.5\t6.5\t18765\t106352\t0.3192\t16035\tObama\t16035\t0.002565389\t16035.0\n18581\t-79.71684499999999\t41.021433\tPetrolia borough\tPA\tPennsylvania\tButler County\t219\t38.1\t10.1\t10.8\t24296\t96667\t0.3192\t16041\tObama\t16041\t0.000621483\t16041.0\n18582\t-79.934035\t40.784453000000006\tNixon CDP\tPA\tPennsylvania\tButler County\t1348\t48.0\t52.6\t15.8\t31057\t197039\t0.3192\t16053\tObama\t16053\t0.003825382\t16053.0\n18583\t-79.89623900000001\t40.861798\tButler city\tPA\tPennsylvania\tButler County\t14505\t37.5\t18.8\t10.9\t19974\t99443\t0.3192\t16045\tObama\t16045\t0.041162581000000004\t16045.0\n18584\t-80.04870600000001\t40.898348\tProspect borough\tPA\tPennsylvania\tButler County\t1344\t41.1\t19.8\t8.4\t19818\t122704\t0.3192\t16052\tObama\t16052\t0.00381403\t16052.0\n18585\t-80.143049\t40.789089000000004\tZelienople borough\tPA\tPennsylvania\tButler County\t4051\t44.8\t32.6\t9.4\t31456\t176092\t0.3192\t16063\tObama\t16063\t0.011496009\t16063.0\n18586\t-79.92069599999999\t40.872064\tHomeacre-Lyndora CDP\tPA\tPennsylvania\tButler County\t6760\t47.9\t23.2\t7.3\t24970\t140406\t0.3192\t16001\tObama\t16001\t0.019183664\t16001.0\n18587\t-79.955625\t40.853225\tMeridian CDP\tPA\tPennsylvania\tButler County\t3813\t47.2\t29.0\t9.2\t28076\t169583\t0.3192\t16045\tObama\t16045\t0.010820608\t16045.0\n18588\t-79.74485899999999\t41.017062\tFairview borough\tPA\tPennsylvania\tButler County\t222\t38.1\t10.0\t10.7\t24317\t97273\t0.3192\t16050\tObama\t16050\t0.000629996\t16050.0\n18589\t-80.057994\t41.006899\tWest Liberty borough\tPA\tPennsylvania\tButler County\t344\t34.9\t17.7\t12.0\t18448\t108929\t0.3192\t16057\tObama\t16057\t0.00097621\t16057.0\n18590\t-80.013465\t40.696847\tMars borough\tPA\tPennsylvania\tButler County\t1881\t50.2\t27.4\t7.0\t23749\t146324\t0.3192\t16046\tObama\t16046\t0.00533794\t16046.0\n18591\t-79.74000699999999\t40.950579\tChicora borough\tPA\tPennsylvania\tButler County\t1086\t42.0\t17.2\t6.6\t22283\t100938\t0.3192\t16025\tObama\t16025\t0.0030818729999999997\t16025.0\n18592\t-80.146162\t40.923739000000005\tPortersville borough\tPA\tPennsylvania\tButler County\t269\t39.2\t13.1\t10.8\t17482\t46667\t0.3192\t16051\tObama\t16051\t0.0007633739999999999\t16051.0\n18593\t-79.727021\t41.05451\tBruin borough\tPA\tPennsylvania\tButler County\t555\t40.3\t9.1\t11.9\t18162\t69348\t0.3192\t16022\tObama\t16022\t0.00157499\t16022.0\n18594\t-79.847511\t40.878851\tEast Butler borough\tPA\tPennsylvania\tButler County\t728\t43.8\t7.6\t6.8\t23805\t118393\t0.3192\t16029\tObama\t16029\t0.002065933\t16029.0\n18595\t-79.800207\t41.159582\tCherry Valley borough\tPA\tPennsylvania\tButler County\t72\t40.8\t13.5\t10.8\t19088\t104167\t0.3192\t16030\tObama\t16030\t0.000204323\t16030.0\n18596\t-79.72606999999999\t40.996446999999996\tKarns City borough\tPA\tPennsylvania\tButler County\t244\t41.7\t9.9\t8.5\t20087\t96000\t0.3192\t16041\tObama\t16041\t0.000692428\t16041.0\n18597\t-80.05863000000001\t40.76862\tEvans City borough\tPA\tPennsylvania\tButler County\t1957\t39.8\t22.2\t5.6\t23863\t144915\t0.3192\t16033\tObama\t16033\t0.005553614\t16033.0\n18598\t-78.700438\t40.324104\tBeaverdale-Lloydell CDP\tPA\tPennsylvania\tCambria County\t1106\t41.0\t11.0\t15.5\t14032\t58511\t0.4006\t15955\tObama\t15955\t0.0031386290000000004\t15955.0\n18599\t-78.95259\t40.319384\tWestmont borough\tPA\tPennsylvania\tCambria County\t5190\t47.9\t48.6\t7.9\t33648\t180197\t0.4006\t15905\tObama\t15905\t0.014728287\t15905.0\n18600\t-78.88615\t40.347569\tEast Conemaugh borough\tPA\tPennsylvania\tCambria County\t1173\t47.0\t9.1\t12.3\t20766\t45565\t0.4006\t15909\tObama\t15909\t0.0033287629999999998\t15909.0\n18601\t-78.932746\t40.310804\tSouthmont borough\tPA\tPennsylvania\tCambria County\t2161\t47.9\t40.1\t8.5\t26456\t138714\t0.4006\t15905\tObama\t15905\t0.006132529\t15905.0\n18602\t-78.609832\t40.578139\tChest Springs borough\tPA\tPennsylvania\tCambria County\t144\t36.7\t8.9\t8.3\t15980\t145833\t0.4006\t16624\tObama\t16624\t0.000408646\t16624.0\n18603\t-78.76128299999999\t40.375885\tSummerhill borough\tPA\tPennsylvania\tCambria County\t466\t41.0\t16.6\t6.0\t21539\t86875\t0.4006\t15958\tObama\t15958\t0.001322424\t15958.0\n18604\t-78.540791\t40.480368\tTunnelhill borough\tPA\tPennsylvania\tCambria County\t410\t40.2\t12.4\t7.9\t17564\t101190\t0.4006\t16641\tObama\t16641\t0.0011635060000000001\t16641.0\n18605\t-78.93727\t40.333672\tBrownstown borough\tPA\tPennsylvania\tCambria County\t787\t44.9\t8.0\t8.1\t21007\t62703\t0.4006\t159HH\tObama\t159HH\t0.002233364\t0.0\n18606\t-78.62040400000001\t40.424285\tLilly borough\tPA\tPennsylvania\tCambria County\t867\t46.2\t13.6\t7.5\t18084\t78971\t0.4006\t15938\tObama\t15938\t0.00246039\t15938.0\n18607\t-78.89094899999999\t40.282958\tBelmont CDP\tPA\tPennsylvania\tCambria County\t2794\t51.9\t21.9\t9.9\t26134\t128075\t0.4006\t15904\tObama\t15904\t0.007928869\t15904.0\n18608\t-78.70746700000001\t40.604126\tCarrolltown borough\tPA\tPennsylvania\tCambria County\t994\t43.2\t15.8\t5.5\t18686\t94464\t0.4006\t15722\tObama\t15722\t0.002820793\t15722.0\n18609\t-78.70863\t40.664858\tHastings borough\tPA\tPennsylvania\tCambria County\t1276\t44.1\t16.0\t6.6\t15281\t81081\t0.4006\t16646\tObama\t16646\t0.003621058\t16646.0\n18610\t-78.88433\t40.341674\tFranklin borough\tPA\tPennsylvania\tCambria County\t401\t47.3\t9.1\t12.2\t20878\t45476\t0.4006\t15909\tObama\t15909\t0.001137966\t15909.0\n18611\t-78.872456\t40.293619\tGeistown borough\tPA\tPennsylvania\tCambria County\t2396\t47.3\t27.3\t7.5\t25454\t135282\t0.4006\t15904\tObama\t15904\t0.0067994169999999994\t15904.0\n18612\t-78.942792\t40.298757\tElim CDP\tPA\tPennsylvania\tCambria County\t3988\t49.6\t27.3\t9.5\t24021\t111974\t0.4006\t15905\tObama\t15905\t0.011317227\t15905.0\n18613\t-78.844349\t40.249544\tScalp Level borough\tPA\tPennsylvania\tCambria County\t776\t44.0\t11.3\t10.6\t18714\t57794\t0.4006\t15963\tObama\t15963\t0.0022021479999999997\t15963.0\n18614\t-78.919554\t40.325626\tJohnstown city\tPA\tPennsylvania\tCambria County\t21299\t43.9\t10.5\t16.1\t17446\t57993\t0.4006\t15901\tObama\t15901\t0.060442731\t15901.0\n18615\t-78.669199\t40.370368\tSpring Hill CDP\tPA\tPennsylvania\tCambria County\t976\t45.0\t15.9\t8.9\t22492\t110795\t0.4006\t15946\tObama\t15946\t0.002769712\t15946.0\n18616\t-78.91732900000001\t40.288134\tFerndale borough\tPA\tPennsylvania\tCambria County\t1677\t42.9\t16.1\t7.3\t24726\t94803\t0.4006\t15905\tObama\t15905\t0.004759024000000001\t15905.0\n18617\t-78.648466\t40.633348\tPatton borough\tPA\tPennsylvania\tCambria County\t1825\t43.3\t16.0\t14.0\t20918\t72453\t0.4006\t16668\tObama\t16668\t0.005179022\t16668.0\n18618\t-78.904114\t40.319719\tDaisytown borough\tPA\tPennsylvania\tCambria County\t312\t47.4\t17.6\t9.1\t16734\t98500\t0.4006\t15902\tObama\t15902\t0.0008853999999999999\t15902.0\n18619\t-78.791656\t40.363638\tSouth Fork borough\tPA\tPennsylvania\tCambria County\t1068\t40.2\t7.7\t9.5\t15182\t56622\t0.4006\t15956\tObama\t15956\t0.003030792\t15956.0\n18620\t-78.54776899999999\t40.559666\tAshville borough\tPA\tPennsylvania\tCambria County\t303\t43.6\t6.4\t9.1\t20047\t100781\t0.4006\t16613\tObama\t16613\t0.00085986\t16613.0\n18621\t-78.764397\t40.296132\tSalix-Beauty Line Park CDP\tPA\tPennsylvania\tCambria County\t1206\t43.2\t15.0\t10.0\t21299\t128646\t0.4006\t15952\tObama\t15952\t0.0034224109999999998\t15952.0\n18622\t-78.586667\t40.462619000000004\tCresson borough\tPA\tPennsylvania\tCambria County\t1545\t41.4\t16.8\t7.0\t19865\t107895\t0.4006\t16630\tObama\t16630\t0.004384432\t16630.0\n18623\t-78.78905400000001\t40.542515\tColver CDP\tPA\tPennsylvania\tCambria County\t945\t40.6\t6.7\t4.7\t15666\t68333\t0.4006\t15927\tObama\t15927\t0.00268174\t15927.0\n18624\t-78.76151899999999\t40.325524\tSt. Michael-Sidman CDP\tPA\tPennsylvania\tCambria County\t865\t44.9\t14.5\t9.3\t20734\t76000\t0.4006\t15952\tObama\t15952\t0.0024547139999999998\t15952.0\n18625\t-78.904609\t40.311652\tDale borough\tPA\tPennsylvania\tCambria County\t1367\t38.3\t8.3\t12.9\t15915\t58571\t0.4006\t15902\tObama\t15902\t0.0038793\t15902.0\n18626\t-78.912072\t40.479695\tVintondale borough\tPA\tPennsylvania\tCambria County\t470\t45.3\t5.7\t13.2\t17633\t53714\t0.4006\t15961\tObama\t15961\t0.001333775\t15961.0\n18627\t-78.67478100000001\t40.386893\tPortage borough\tPA\tPennsylvania\tCambria County\t2622\t44.0\t13.1\t19.6\t19041\t78488\t0.4006\t15946\tObama\t15946\t0.007440764\t15946.0\n18628\t-78.592043\t40.47159\tSankertown borough\tPA\tPennsylvania\tCambria County\t631\t40.3\t9.9\t11.1\t21780\t98750\t0.4006\t16630\tObama\t16630\t0.001790665\t16630.0\n18629\t-78.635552\t40.509161\tLoretto borough\tPA\tPennsylvania\tCambria County\t1295\t23.9\t28.7\t10.8\t18225\t130500\t0.4006\t15940\tObama\t15940\t0.0036749770000000003\t15940.0\n18630\t-78.89569499999999\t40.296059\tLorain borough\tPA\tPennsylvania\tCambria County\t680\t50.0\t9.5\t6.1\t19355\t75000\t0.4006\t15902\tObama\t15902\t0.001929718\t15902.0\n18631\t-78.726322\t40.488265999999996\tEbensburg borough\tPA\tPennsylvania\tCambria County\t2999\t44.3\t31.4\t8.0\t21751\t142690\t0.4006\t15931\tObama\t15931\t0.008510623\t15931.0\n18632\t-78.778098\t40.656220000000005\tNorthern Cambria borough\tPA\tPennsylvania\tCambria County\t3762\t42.5\t12.6\t14.1\t19074\t70865\t0.4006\t15775\tObama\t15775\t0.010675879\t15775.0\n18633\t-78.77585699999999\t40.374338\tEhrenfeld borough\tPA\tPennsylvania\tCambria County\t209\t41.6\t15.9\t6.7\t21566\t88333\t0.4006\t15956\tObama\t15956\t0.000593104\t15956.0\n18634\t-78.844486\t40.410794\tVinco CDP\tPA\tPennsylvania\tCambria County\t1349\t47.7\t13.0\t17.4\t20717\t135432\t0.4006\t15942\tObama\t15942\t0.0038282190000000003\t15942.0\n18635\t-78.717537\t40.386688\tWilmore borough\tPA\tPennsylvania\tCambria County\t252\t38.2\t16.0\t13.4\t18700\t135326\t0.4006\t15958\tObama\t15958\t0.000715131\t15958.0\n18636\t-78.554682\t40.481004\tGallitzin borough\tPA\tPennsylvania\tCambria County\t1634\t41.0\t9.0\t14.6\t16296\t67754\t0.4006\t16641\tObama\t16641\t0.004636998\t16641.0\n18637\t-78.833663\t40.471094\tNanty-Glo borough\tPA\tPennsylvania\tCambria County\t2876\t43.8\t11.6\t19.2\t22309\t65819\t0.4006\t15943\tObama\t15943\t0.008161571\t15943.0\n18638\t-78.640658\t40.408589\tCassandra borough\tPA\tPennsylvania\tCambria County\t133\t43.4\t14.6\t8.1\t18272\t112500\t0.4006\t15925\tObama\t15925\t0.00037743\t15925.0\n18639\t-78.2361\t41.510162\tEmporium borough\tPA\tPennsylvania\tCameron County\t2142\t41.9\t15.9\t21.2\t19524\t95392\t0.34299999999999997\t15834\tObama\t15834\t0.006078610999999999\t15834.0\n18640\t-78.135036\t41.342993\tDriftwood borough\tPA\tPennsylvania\tCameron County\t85\t47.5\t10.9\t15.8\t18072\t87500\t0.34299999999999997\t15832\tObama\t15832\t0.000241215\t15832.0\n18641\t-75.884949\t40.833096000000005\tLansford borough\tPA\tPennsylvania\tCarbon County\t4195\t42.4\t13.4\t12.6\t19961\t57023\t0.4527\t18232\tObama\t18232\t0.011904655\t18232.0\n18642\t-75.686481\t40.837013\tWeissport East CDP\tPA\tPennsylvania\tCarbon County\t1934\t43.1\t11.9\t13.3\t22749\t133015\t0.4527\t18235\tObama\t18235\t0.005488344\t18235.0\n18643\t-75.96566899999999\t40.916158\tTresckow CDP\tPA\tPennsylvania\tCarbon County\t1050\t47.2\t8.8\t12.1\t20127\t105147\t0.4527\t18254\tObama\t18254\t0.002979711\t18254.0\n18644\t-75.912899\t40.929965\tBeaver Meadows borough\tPA\tPennsylvania\tCarbon County\t1074\t45.0\t7.9\t11.8\t18486\t93871\t0.4527\t18216\tObama\t18216\t0.0030478190000000002\t18216.0\n18645\t-75.740473\t40.889708\tJim Thorpe borough\tPA\tPennsylvania\tCarbon County\t4995\t43.8\t17.9\t13.6\t24107\t134200\t0.4527\t182HH\tObama\t182HH\t0.014174912\t0.0\n18646\t-75.615314\t40.802365\tPalmerton borough\tPA\tPennsylvania\tCarbon County\t5390\t39.9\t14.8\t13.4\t22562\t123331\t0.4527\t18012\tObama\t18012\t0.015295851000000001\t18012.0\n18647\t-75.701237\t40.828984999999996\tWeissport borough\tPA\tPennsylvania\tCarbon County\t434\t43.1\t12.7\t14.4\t21274\t128704\t0.4527\t18235\tObama\t18235\t0.001231614\t18235.0\n18648\t-75.820863\t40.941958\tWeatherly borough\tPA\tPennsylvania\tCarbon County\t2675\t46.6\t15.2\t10.2\t20894\t117469\t0.4527\t18255\tObama\t18255\t0.007591169\t18255.0\n18649\t-75.67015500000001\t40.824252\tParryville borough\tPA\tPennsylvania\tCarbon County\t593\t43.0\t20.1\t9.1\t25858\t208889\t0.4527\t18244\tObama\t18244\t0.001682827\t18244.0\n18650\t-75.660824\t40.801809000000006\tBowmanstown borough\tPA\tPennsylvania\tCarbon County\t947\t43.8\t9.1\t10.4\t21272\t137321\t0.4527\t18030\tObama\t18030\t0.0026874159999999998\t18030.0\n18651\t-75.716121\t40.830458\tLehighton borough\tPA\tPennsylvania\tCarbon County\t5373\t42.3\t8.9\t14.4\t20834\t121550\t0.4527\t18235\tObama\t18235\t0.015247608000000001\t18235.0\n18652\t-75.844813\t40.825057\tSummit Hill borough\tPA\tPennsylvania\tCarbon County\t2971\t45.3\t13.1\t14.4\t27417\t103326\t0.4527\t18250\tObama\t18250\t0.008431164\t18250.0\n18653\t-75.759393\t41.061858\tEast Side borough\tPA\tPennsylvania\tCarbon County\t283\t43.8\t12.0\t17.1\t16431\t139063\t0.4527\t18661\tObama\t18661\t0.000803103\t18661.0\n18654\t-75.832592\t40.865248\tNesquehoning borough\tPA\tPennsylvania\tCarbon County\t3548\t44.7\t14.3\t7.7\t23253\t98131\t0.4527\t18240\tObama\t18240\t0.010068586\t18240.0\n18655\t-77.454388\t40.901595\tAaronsburg CDP\tPA\tPennsylvania\tCentre County\t499\t39.2\t20.1\t4.6\t18798\t144257\t0.4909\t16854\tObama\t16854\t0.0014160720000000002\t16854.0\n18656\t-77.342196\t40.900781\tWoodward CDP\tPA\tPennsylvania\tCentre County\t130\t38.3\t20.0\t4.8\t18749\t147727\t0.4909\t16882\tObama\t16882\t0.00036891699999999996\t16882.0\n18657\t-77.443264\t40.942924\tRebersburg CDP\tPA\tPennsylvania\tCentre County\t547\t34.0\t20.7\t4.8\t14794\t143561\t0.4909\t16820\tObama\t16820\t0.001552288\t16820.0\n18658\t-77.79757099999999\t40.94231\tMilesburg borough\tPA\tPennsylvania\tCentre County\t1188\t39.7\t16.2\t7.0\t20158\t131882\t0.4909\t16853\tObama\t16853\t0.00337133\t16853.0\n18659\t-77.822681\t40.826621\tHouserville CDP\tPA\tPennsylvania\tCentre County\t1987\t34.5\t51.6\t4.5\t26825\t180420\t0.4909\t16851\tObama\t16851\t0.005638749\t16851.0\n18660\t-77.773213\t40.778458\tBoalsburg CDP\tPA\tPennsylvania\tCentre County\t4035\t44.1\t60.4\t6.2\t33848\t254818\t0.4909\t16827\tObama\t16827\t0.011450604\t16827.0\n18661\t-77.856833\t40.790904\tState College borough\tPA\tPennsylvania\tCentre County\t40655\t22.7\t74.8\t10.4\t17270\t239126\t0.4909\t16801\tObama\t16801\t0.115371578\t16801.0\n18662\t-77.945453\t41.0482\tClarence CDP\tPA\tPennsylvania\tCentre County\t575\t43.1\t5.6\t6.2\t18233\t113362\t0.4909\t16829\tObama\t16829\t0.001631747\t16829.0\n18663\t-78.218713\t40.886717\tSouth Philipsburg borough\tPA\tPennsylvania\tCentre County\t413\t43.8\t31.6\t10.3\t26382\t122115\t0.4909\t16866\tObama\t16866\t0.00117202\t16866.0\n18664\t-77.876609\t40.906084\tUnionville borough\tPA\tPennsylvania\tCentre County\t346\t43.3\t18.5\t6.7\t19974\t150000\t0.4909\t16844\tObama\t16844\t0.000981886\t16844.0\n18665\t-77.942679\t40.861658\tJulian CDP\tPA\tPennsylvania\tCentre County\t157\t40.0\t26.4\t8.4\t20227\t150000\t0.4909\t16844\tObama\t16844\t0.00044553800000000004\t16844.0\n18666\t-77.949712\t41.027729\tSnow Shoe borough\tPA\tPennsylvania\tCentre County\t809\t41.6\t16.7\t11.3\t19907\t126411\t0.4909\t16874\tObama\t16874\t0.002295796\t16874.0\n18667\t-77.656612\t41.01267\tHoward borough\tPA\tPennsylvania\tCentre County\t695\t44.7\t17.6\t2.4\t26333\t142742\t0.4909\t16841\tObama\t16841\t0.001972285\t16841.0\n18668\t-78.052503\t40.799419\tPort Matilda borough\tPA\tPennsylvania\tCentre County\t631\t37.6\t12.1\t11.5\t21910\t111218\t0.4909\t16870\tObama\t16870\t0.001790665\t16870.0\n18669\t-78.0116\t40.783229999999996\tStormstown CDP\tPA\tPennsylvania\tCentre County\t1693\t37.8\t47.2\t4.6\t29574\t243868\t0.4909\t16870\tObama\t16870\t0.004804429\t16870.0\n18670\t-77.70031999999999\t41.108967\tMonument CDP\tPA\tPennsylvania\tCentre County\t125\t43.9\t11.1\t8.3\t15646\t106250\t0.4909\t16864\tObama\t16864\t0.000354728\t16864.0\n18671\t-77.607915\t41.066340000000004\tBlanchard CDP\tPA\tPennsylvania\tCentre County\t614\t43.2\t10.8\t8.6\t16542\t104464\t0.4909\t16826\tObama\t16826\t0.0017424220000000002\t16826.0\n18672\t-78.208748\t40.909208\tNorth Philipsburg CDP\tPA\tPennsylvania\tCentre County\t705\t48.3\t9.0\t7.5\t19735\t77500\t0.4909\t16840\tObama\t16840\t0.0020006629999999997\t16840.0\n18673\t-77.95600999999999\t40.725755\tRamblewood CDP\tPA\tPennsylvania\tCentre County\t1057\t42.9\t54.9\t4.0\t33673\t217560\t0.4909\t16865\tObama\t16865\t0.002999576\t16865.0\n18674\t-77.518833\t40.928237\tMadisonburg CDP\tPA\tPennsylvania\tCentre County\t150\t34.0\t20.5\t4.8\t14798\t148611\t0.4909\t16852\tObama\t16852\t0.00042567300000000006\t16852.0\n18675\t-78.233921\t40.810521\tSandy Ridge CDP\tPA\tPennsylvania\tCentre County\t337\t45.2\t8.9\t9.1\t22753\t76333\t0.4909\t16677\tObama\t16677\t0.000956345\t16677.0\n18676\t-77.816222\t40.812363\tLemont CDP\tPA\tPennsylvania\tCentre County\t2128\t45.4\t61.2\t5.6\t35176\t245000\t0.4909\t16851\tObama\t16851\t0.006038880999999999\t16851.0\n18677\t-77.46175799999999\t40.867269\tCoburn CDP\tPA\tPennsylvania\tCentre County\t153\t39.4\t23.3\t6.2\t20447\t148438\t0.4909\t16832\tObama\t16832\t0.000434186\t16832.0\n18678\t-77.740646\t40.860576\tPleasant Gap CDP\tPA\tPennsylvania\tCentre County\t1543\t43.6\t21.8\t9.7\t29904\t143189\t0.4909\t16823\tObama\t16823\t0.004378756\t16823.0\n18679\t-77.684742\t40.844646000000004\tCentre Hall borough\tPA\tPennsylvania\tCentre County\t1074\t46.0\t29.4\t5.8\t27256\t169913\t0.4909\t16828\tObama\t16828\t0.0030478190000000002\t16828.0\n18680\t-77.767689\t40.914255\tBellefonte borough\tPA\tPennsylvania\tCentre County\t6186\t39.5\t31.3\t10.3\t24562\t159745\t0.4909\t16823\tObama\t16823\t0.017554755\t16823.0\n18681\t-77.871848\t40.737891999999995\tPine Grove Mills CDP\tPA\tPennsylvania\tCentre County\t1146\t42.6\t48.0\t2.2\t27574\t183571\t0.4909\t16801\tObama\t16801\t0.003252142\t16801.0\n18682\t-78.052775\t41.090344\tPine Glen CDP\tPA\tPennsylvania\tCentre County\t209\t43.3\t5.3\t6.0\t18258\t115000\t0.4909\t168XX\tObama\t168XX\t0.000593104\t0.0\n18683\t-77.476536\t40.893505\tMillheim borough\tPA\tPennsylvania\tCentre County\t734\t38.7\t16.1\t5.3\t21311\t144767\t0.4909\t16854\tObama\t16854\t0.00208296\t16854.0\n18684\t-77.908322\t40.7999\tPark Forest Village CDP\tPA\tPennsylvania\tCentre County\t9002\t33.5\t68.9\t5.3\t28540\t228846\t0.4909\t16803\tObama\t16803\t0.025546057\t16803.0\n18685\t-78.22112299999999\t40.895255999999996\tPhilipsburg borough\tPA\tPennsylvania\tCentre County\t2780\t42.1\t19.7\t16.8\t21145\t95946\t0.4909\t16866\tObama\t16866\t0.00788914\t16866.0\n18686\t-77.563715\t40.853806\tSpring Mills CDP\tPA\tPennsylvania\tCentre County\t280\t41.0\t28.5\t4.6\t21052\t145833\t0.4909\t16875\tObama\t16875\t0.00079459\t16875.0\n18687\t-77.663838\t40.927407\tZion CDP\tPA\tPennsylvania\tCentre County\t2637\t41.3\t24.5\t5.5\t24884\t171225\t0.4909\t16856\tObama\t16856\t0.007483332\t16856.0\n18688\t-75.491424\t40.042075\tPaoli CDP\tPA\tPennsylvania\tChester County\t5557\t44.8\t54.2\t8.2\t41208\t297574\t0.4934\t19301\tObama\t19301\t0.015769767\t19301.0\n18689\t-75.64188\t40.22415\tKenilworth CDP\tPA\tPennsylvania\tChester County\t1812\t39.5\t27.4\t5.8\t32946\t250184\t0.4934\t19465\tObama\t19465\t0.00514213\t19465.0\n18690\t-75.574201\t39.967137\tWest Goshen CDP\tPA\tPennsylvania\tChester County\t8555\t39.4\t48.5\t6.0\t38298\t312129\t0.4934\t19380\tObama\t19380\t0.024277551\t19380.0\n18691\t-75.630238\t40.030698\tExton CDP\tPA\tPennsylvania\tChester County\t4758\t36.0\t62.0\t8.0\t53447\t314972\t0.4934\t19341\tObama\t19341\t0.013502348\t19341.0\n18692\t-75.51431099999999\t40.032806\tMalvern borough\tPA\tPennsylvania\tChester County\t3072\t42.3\t57.3\t6.7\t46701\t270732\t0.4934\t19355\tObama\t19355\t0.008717783\t19355.0\n18693\t-75.803296\t39.961576\tModena borough\tPA\tPennsylvania\tChester County\t734\t28.4\t9.4\t15.1\t17500\t144792\t0.4934\t19358\tObama\t19358\t0.00208296\t19358.0\n18694\t-75.711136\t39.843668\tKennett Square borough\tPA\tPennsylvania\tChester County\t5510\t36.2\t26.5\t8.9\t27434\t217802\t0.4934\t19348\tObama\t19348\t0.015636389\t19348.0\n18695\t-75.978785\t39.786336999999996\tOxford borough\tPA\tPennsylvania\tChester County\t4962\t39.5\t25.1\t8.3\t22399\t213941\t0.4934\t19363\tObama\t19363\t0.014081264\t19363.0\n18696\t-75.660124\t40.236736\tSouth Pottstown CDP\tPA\tPennsylvania\tChester County\t2255\t41.3\t27.1\t8.6\t33480\t213000\t0.4934\t19464\tObama\t19464\t0.006399284\t19464.0\n18697\t-75.701978\t40.007670000000005\tDowningtown borough\tPA\tPennsylvania\tChester County\t8252\t36.4\t27.0\t8.1\t29188\t206197\t0.4934\t19335\tObama\t19335\t0.023417692\t19335.0\n18698\t-75.605871\t39.960052000000005\tWest Chester borough\tPA\tPennsylvania\tChester County\t19067\t24.9\t47.0\t10.7\t26814\t248932\t0.4934\t19382\tObama\t19382\t0.054108717\t19382.0\n18699\t-75.439818\t40.04204\tDevon-Berwyn CDP\tPA\tPennsylvania\tChester County\t5281\t44.9\t61.4\t7.4\t45064\t410968\t0.4934\t19312\tObama\t19312\t0.014986528\t19312.0\n18700\t-75.546706\t40.176718\tSpring City borough\tPA\tPennsylvania\tChester County\t3686\t38.6\t21.0\t7.0\t31288\t173547\t0.4934\t19468\tObama\t19468\t0.010460205\t19468.0\n18701\t-75.644012\t40.052401\tLionville-Marchwood CDP\tPA\tPennsylvania\tChester County\t6729\t39.3\t59.7\t6.2\t42224\t302129\t0.4934\t19341\tObama\t19341\t0.019095692\t19341.0\n18702\t-75.813323\t39.969697\tSouth Coatesville borough\tPA\tPennsylvania\tChester County\t1348\t39.4\t8.9\t20.7\t21779\t162500\t0.4934\t19320\tObama\t19320\t0.003825382\t19320.0\n18703\t-75.519988\t40.135740000000006\tPhoenixville borough\tPA\tPennsylvania\tChester County\t16930\t36.9\t33.5\t8.7\t32970\t184355\t0.4934\t19460\tObama\t19460\t0.048044295\t19460.0\n18704\t-75.82985699999999\t40.155715\tElverson borough\tPA\tPennsylvania\tChester County\t1207\t50.5\t45.0\t6.9\t37535\t321711\t0.4934\t19520\tObama\t19520\t0.0034252490000000004\t19520.0\n18705\t-75.97463\t39.947105\tAtglen borough\tPA\tPennsylvania\tChester County\t1522\t31.3\t28.4\t6.6\t26804\t221429\t0.4934\t19310\tObama\t19310\t0.0043191620000000005\t19310.0\n18706\t-75.911423\t40.094075\tHoney Brook borough\tPA\tPennsylvania\tChester County\t1567\t34.6\t24.7\t6.6\t29177\t216367\t0.4934\t19344\tObama\t19344\t0.004446864\t19344.0\n18707\t-75.75191600000001\t39.999001\tThorndale CDP\tPA\tPennsylvania\tChester County\t3762\t37.0\t42.3\t7.3\t36371\t218227\t0.4934\t19372\tObama\t19372\t0.010675879\t19372.0\n18708\t-75.828711\t39.820703\tWest Grove borough\tPA\tPennsylvania\tChester County\t2828\t34.8\t34.9\t8.4\t25669\t216710\t0.4934\t19390\tObama\t19390\t0.008025355\t19390.0\n18709\t-75.781977\t39.824574\tAvondale borough\tPA\tPennsylvania\tChester County\t1343\t33.9\t16.3\t8.6\t21003\t207246\t0.4934\t19311\tObama\t19311\t0.003811192\t19311.0\n18710\t-75.75654\t39.831336\tToughkenamon CDP\tPA\tPennsylvania\tChester County\t1680\t30.2\t28.0\t10.0\t24547\t305682\t0.4934\t19374\tObama\t19374\t0.004767538\t19374.0\n18711\t-75.458329\t40.07347\tChesterbrook CDP\tPA\tPennsylvania\tChester County\t4688\t44.9\t79.4\t6.3\t66829\t311164\t0.4934\t19312\tObama\t19312\t0.013303701000000001\t19312.0\n18712\t-75.91764\t39.959216999999995\tParkesburg borough\tPA\tPennsylvania\tChester County\t3654\t34.7\t23.8\t8.4\t27152\t194764\t0.4934\t19365\tObama\t19365\t0.010369395\t19365.0\n18713\t-75.819717\t39.984882\tCoatesville city\tPA\tPennsylvania\tChester County\t12674\t31.3\t14.1\t15.6\t18480\t135688\t0.4934\t19320\tObama\t19320\t0.035966532\t19320.0\n18714\t-79.27681\t41.021729\tHawthorn borough\tPA\tPennsylvania\tClarion County\t538\t40.6\t8.3\t11.0\t14417\t75000\t0.3123\t16230\tObama\t16230\t0.0015267470000000002\t16230.0\n18715\t-79.612387\t40.984015\tEast Brady borough\tPA\tPennsylvania\tClarion County\t1029\t45.6\t17.6\t9.8\t22744\t92059\t0.3123\t16028\tObama\t16028\t0.0029201170000000003\t16028.0\n18716\t-79.32857299999999\t41.004437\tNew Bethlehem borough\tPA\tPennsylvania\tClarion County\t983\t46.5\t24.6\t8.2\t20752\t110795\t0.3123\t16242\tObama\t16242\t0.002789577\t16242.0\n18717\t-79.496655\t41.107966999999995\tSligo borough\tPA\tPennsylvania\tClarion County\t719\t44.1\t12.5\t10.3\t17099\t100798\t0.3123\t16255\tObama\t16255\t0.0020403929999999997\t16255.0\n18718\t-79.50248\t41.040803000000004\tRimersburg borough\tPA\tPennsylvania\tClarion County\t996\t38.5\t15.6\t11.2\t15196\t87292\t0.3123\t16248\tObama\t16248\t0.0028264690000000003\t16248.0\n18719\t-79.326916\t41.202513\tStrattanville borough\tPA\tPennsylvania\tClarion County\t535\t36.7\t17.1\t9.3\t20531\t90625\t0.3123\t16214\tObama\t16214\t0.001518234\t16214.0\n18720\t-79.655037\t41.160967\tSt. Petersburg borough\tPA\tPennsylvania\tClarion County\t394\t42.8\t18.1\t12.7\t16364\t87500\t0.3123\t16054\tObama\t16054\t0.001118101\t16054.0\n18721\t-79.68043\t41.144754\tFoxburg borough\tPA\tPennsylvania\tClarion County\t268\t42.7\t18.2\t12.5\t16334\t89000\t0.3123\t16036\tObama\t16036\t0.000760536\t16036.0\n18722\t-79.557618\t41.125442\tCallensburg borough\tPA\tPennsylvania\tClarion County\t220\t40.7\t14.4\t9.4\t17679\t109375\t0.3123\t16213\tObama\t16213\t0.00062432\t16213.0\n18723\t-79.535836\t41.23465\tKnox borough\tPA\tPennsylvania\tClarion County\t1110\t44.8\t21.7\t7.8\t20631\t114557\t0.3123\t16232\tObama\t16232\t0.00314998\t16232.0\n18724\t-79.46220600000001\t41.250965\tShippenville borough\tPA\tPennsylvania\tClarion County\t530\t44.9\t18.8\t13.2\t19538\t112109\t0.3123\t16254\tObama\t16254\t0.001504045\t16254.0\n18725\t-79.380274\t41.210483\tClarion borough\tPA\tPennsylvania\tClarion County\t5524\t23.4\t37.4\t13.6\t17791\t146696\t0.3123\t16214\tObama\t16214\t0.015676118\t16214.0\n18726\t-78.446686\t41.042689\tPlymptonville CDP\tPA\tPennsylvania\tClearfield County\t1013\t45.3\t12.6\t12.9\t19193\t103464\t0.3479\t16830\tObama\t16830\t0.002874712\t16830.0\n18727\t-78.532333\t40.747777\tCoalport borough\tPA\tPennsylvania\tClearfield County\t470\t44.9\t12.8\t9.4\t21676\t72692\t0.3479\t16627\tObama\t16627\t0.001333775\t16627.0\n18728\t-78.72842299999999\t40.874716\tMahaffey borough\tPA\tPennsylvania\tClearfield County\t392\t43.1\t7.4\t12.4\t15634\t83000\t0.3479\t15757\tObama\t15757\t0.001112425\t15757.0\n18729\t-78.289975\t40.962781\tWallaceton borough\tPA\tPennsylvania\tClearfield County\t340\t39.8\t4.2\t12.0\t14964\t80500\t0.3479\t16876\tObama\t16876\t0.000964859\t16876.0\n18730\t-78.786333\t41.025511\tTroutville borough\tPA\tPennsylvania\tClearfield County\t218\t42.5\t8.5\t8.6\t17408\t107143\t0.3479\t15866\tObama\t15866\t0.000618645\t15866.0\n18731\t-78.701679\t40.821273\tNew Washington borough\tPA\tPennsylvania\tClearfield County\t86\t40.8\t5.1\t14.6\t14456\t70000\t0.3479\t15753\tObama\t15753\t0.000244053\t15753.0\n18732\t-78.756389\t41.122475\tDuBois city\tPA\tPennsylvania\tClearfield County\t7535\t40.3\t15.7\t9.2\t19278\t99385\t0.3479\t15801\tObama\t15801\t0.021382975\t15801.0\n18733\t-78.61105400000001\t40.964593\tGrampian borough\tPA\tPennsylvania\tClearfield County\t427\t43.5\t11.2\t11.6\t16269\t103409\t0.3479\t16838\tObama\t16838\t0.001211749\t16838.0\n18734\t-78.574237\t40.929598999999996\tLumber City borough\tPA\tPennsylvania\tClearfield County\t83\t44.6\t10.2\t11.1\t16335\t100000\t0.3479\t16833\tObama\t16833\t0.00023553900000000002\t16833.0\n18735\t-78.717574\t41.171367\tTreasure Lake CDP\tPA\tPennsylvania\tClearfield County\t4937\t44.1\t38.7\t8.7\t28147\t179260\t0.3479\t15801\tObama\t15801\t0.014010318\t15801.0\n18736\t-78.791169\t40.813521\tBurnside borough\tPA\tPennsylvania\tClearfield County\t274\t43.8\t8.6\t12.7\t15741\t75000\t0.3479\t15721\tObama\t15721\t0.000777563\t15721.0\n18737\t-78.439025\t41.021541\tClearfield borough\tPA\tPennsylvania\tClearfield County\t6300\t43.8\t21.9\t10.2\t23352\t104129\t0.3479\t16830\tObama\t16830\t0.017878267\t16830.0\n18738\t-78.682402\t40.746767\tWestover borough\tPA\tPennsylvania\tClearfield County\t444\t39.4\t5.2\t15.2\t14419\t74286\t0.3479\t16692\tObama\t16692\t0.001259992\t16692.0\n18739\t-78.269859\t40.85246\tOsceola Mills borough\tPA\tPennsylvania\tClearfield County\t1170\t42.6\t15.8\t12.0\t21998\t84000\t0.3479\t16666\tObama\t16666\t0.00332025\t16666.0\n18740\t-78.350597\t40.824683\tHoutzdale borough\tPA\tPennsylvania\tClearfield County\t898\t42.5\t12.3\t12.8\t20798\t102083\t0.3479\t16651\tObama\t16651\t0.002548362\t16651.0\n18741\t-78.399835\t40.801584999999996\tRamey borough\tPA\tPennsylvania\tClearfield County\t515\t44.6\t9.8\t15.2\t16716\t98125\t0.3479\t16671\tObama\t16671\t0.001461477\t16671.0\n18742\t-78.77550500000001\t41.106413\tSandy CDP\tPA\tPennsylvania\tClearfield County\t1632\t46.8\t16.6\t8.9\t18940\t98088\t0.3479\t15801\tObama\t15801\t0.004631322\t15801.0\n18743\t-78.229332\t40.890293\tChester Hill borough\tPA\tPennsylvania\tClearfield County\t1030\t41.4\t15.6\t17.7\t15323\t102155\t0.3479\t16866\tObama\t16866\t0.002922955\t16866.0\n18744\t-78.519052\t40.973534\tCurwensville borough\tPA\tPennsylvania\tClearfield County\t2454\t42.5\t10.5\t14.2\t21241\t107275\t0.3479\t16833\tObama\t16833\t0.006964011\t16833.0\n18745\t-78.468937\t41.007514\tHyde CDP\tPA\tPennsylvania\tClearfield County\t1260\t41.6\t14.0\t8.2\t17668\t85517\t0.3479\t16843\tObama\t16843\t0.003575653\t16843.0\n18746\t-78.498232\t40.800395\tGlen Hope borough\tPA\tPennsylvania\tClearfield County\t144\t44.2\t9.6\t12.3\t14606\t95000\t0.3479\t16645\tObama\t16645\t0.000408646\t16645.0\n18747\t-78.684699\t40.838469\tNewburg borough\tPA\tPennsylvania\tClearfield County\t79\t39.0\t5.6\t16.2\t14324\t75000\t0.3479\t15753\tObama\t15753\t0.000224188\t15753.0\n18748\t-78.35204300000001\t40.839455\tBrisbin borough\tPA\tPennsylvania\tClearfield County\t405\t43.1\t8.7\t11.8\t19845\t95000\t0.3479\t16620\tObama\t16620\t0.001149317\t16620.0\n18749\t-78.553554\t40.773918\tIrvona borough\tPA\tPennsylvania\tClearfield County\t665\t40.1\t8.9\t11.8\t17390\t71667\t0.3479\t16656\tObama\t16656\t0.00188715\t16656.0\n18750\t-77.316411\t41.185786\tAvis borough\tPA\tPennsylvania\tClinton County\t1411\t43.2\t11.1\t7.3\t21185\t119399\t0.4323\t17721\tObama\t17721\t0.004004164\t17721.0\n18751\t-77.470096\t41.127121\tFlemington borough\tPA\tPennsylvania\tClinton County\t1292\t44.9\t17.1\t9.0\t23309\t116282\t0.4323\t17751\tObama\t17751\t0.0036664640000000004\t17751.0\n18752\t-77.301728\t41.034003000000006\tLoganton borough\tPA\tPennsylvania\tClinton County\t455\t38.1\t10.4\t6.5\t19580\t121212\t0.4323\t17747\tObama\t17747\t0.001291208\t17747.0\n18753\t-77.428658\t41.1201\tCastanea CDP\tPA\tPennsylvania\tClinton County\t1104\t44.5\t16.9\t8.0\t17746\t113906\t0.4323\t17745\tObama\t17745\t0.003132953\t17745.0\n18754\t-77.74818\t41.328025\tRenovo borough\tPA\tPennsylvania\tClinton County\t1253\t40.1\t8.7\t18.5\t14258\t48429\t0.4323\t17764\tObama\t17764\t0.003555789\t17764.0\n18755\t-77.742684\t41.324627\tSouth Renovo borough\tPA\tPennsylvania\tClinton County\t512\t50.9\t10.8\t4.7\t16040\t45800\t0.4323\t17764\tObama\t17764\t0.001452964\t17764.0\n18756\t-77.420058\t41.148455\tDunnstown CDP\tPA\tPennsylvania\tClinton County\t1401\t47.5\t29.5\t9.1\t24983\t143563\t0.4323\t17745\tObama\t17745\t0.003975785999999999\t17745.0\n18757\t-77.48940999999999\t41.10452\tMill Hall borough\tPA\tPennsylvania\tClinton County\t1477\t43.5\t12.7\t8.1\t18165\t116929\t0.4323\t17751\tObama\t17751\t0.00419146\t17751.0\n18758\t-77.58511800000001\t41.07454\tBeech Creek borough\tPA\tPennsylvania\tClinton County\t682\t45.9\t6.9\t6.5\t18207\t115625\t0.4323\t16826\tObama\t16826\t0.0019353929999999999\t16826.0\n18759\t-77.452282\t41.136520000000004\tLock Haven city\tPA\tPennsylvania\tClinton County\t8809\t27.5\t24.2\t11.4\t17601\t122850\t0.4323\t17745\tObama\t17745\t0.024998358\t17745.0\n18760\t-76.404668\t40.90423\tSlabtown CDP\tPA\tPennsylvania\tColumbia County\t113\t46.0\t20.5\t7.8\t21563\t165625\t0.4268\t17820\tObama\t17820\t0.000320674\t17820.0\n18761\t-76.480113\t40.976078\tRupert CDP\tPA\tPennsylvania\tColumbia County\t172\t45.5\t19.7\t7.4\t20513\t136250\t0.4268\t17815\tObama\t17815\t0.000488105\t17815.0\n18762\t-76.36866500000001\t41.298096\tJamison City CDP\tPA\tPennsylvania\tColumbia County\t102\t48.3\t8.6\t13.6\t21677\t137500\t0.4268\t17814\tObama\t17814\t0.000289458\t17814.0\n18763\t-76.58362199999999\t41.090059000000004\tJerseytown CDP\tPA\tPennsylvania\tColumbia County\t157\t45.0\t17.2\t4.7\t20745\t154167\t0.4268\t17846\tObama\t17846\t0.00044553800000000004\t17846.0\n18764\t-76.29963599999999\t41.030729\tMifflinville CDP\tPA\tPennsylvania\tColumbia County\t1179\t46.6\t17.6\t5.5\t21029\t142300\t0.4268\t18631\tObama\t18631\t0.00334579\t18631.0\n18765\t-76.416028\t41.040971\tLightstreet CDP\tPA\tPennsylvania\tColumbia County\t924\t46.7\t22.7\t9.5\t26679\t147500\t0.4268\t17815\tObama\t17815\t0.0026221459999999997\t17815.0\n18766\t-76.37647199999999\t40.778218\tLocustdale CDP\tPA\tPennsylvania\tColumbia County\t64\t48.8\t6.3\t6.9\t15609\t72500\t0.4268\t17945\tObama\t17945\t0.00018162\t17945.0\n18767\t-76.285664\t41.047514\tBriar Creek borough\tPA\tPennsylvania\tColumbia County\t574\t43.7\t11.9\t12.2\t17993\t128378\t0.4268\t18631\tObama\t18631\t0.001628909\t18631.0\n18768\t-76.342353\t40.804584999999996\tCentralia borough\tPA\tPennsylvania\tColumbia County\t19\t51.3\t6.7\t11.1\t15755\t70000\t0.4268\t17927\tObama\t17927\t5.39e-05\t17927.0\n18769\t-76.384883\t41.195452\tBenton borough\tPA\tPennsylvania\tColumbia County\t921\t35.8\t19.6\t13.8\t18032\t116865\t0.4268\t17814\tObama\t17814\t0.0026136320000000003\t17814.0\n18770\t-76.304927\t41.127041\tJonestown CDP\tPA\tPennsylvania\tColumbia County\t38\t43.3\t21.4\t9.1\t21627\t168750\t0.4268\t17878\tObama\t17878\t0.000107837\t17878.0\n18771\t-76.53050400000001\t41.132011999999996\tIola CDP\tPA\tPennsylvania\tColumbia County\t133\t41.4\t13.5\t6.3\t19641\t144643\t0.4268\t17846\tObama\t17846\t0.00037743\t17846.0\n18772\t-76.423001\t41.132914\tRohrsburg CDP\tPA\tPennsylvania\tColumbia County\t169\t41.7\t14.6\t6.9\t19645\t143750\t0.4268\t17859\tObama\t17859\t0.000479592\t17859.0\n18773\t-76.337887\t40.814549\tAristes CDP\tPA\tPennsylvania\tColumbia County\t211\t47.5\t6.9\t8.2\t15556\t71667\t0.4268\t17920\tObama\t17920\t0.00059878\t17920.0\n18774\t-76.386884\t41.013875\tAlmedia CDP\tPA\tPennsylvania\tColumbia County\t1030\t46.3\t16.3\t7.6\t20067\t128629\t0.4268\t17815\tObama\t17815\t0.002922955\t17815.0\n18775\t-76.37780699999999\t40.818624\tWilburton Number Two CDP\tPA\tPennsylvania\tColumbia County\t71\t46.7\t7.3\t9.1\t15475\t72500\t0.4268\t17888\tObama\t17888\t0.000201485\t17888.0\n18776\t-76.460215\t40.953072\tCatawissa borough\tPA\tPennsylvania\tColumbia County\t1532\t40.2\t19.2\t9.5\t18581\t106081\t0.4268\t17820\tObama\t17820\t0.00434754\t17820.0\n18777\t-76.249314\t41.055646\tBerwick borough\tPA\tPennsylvania\tColumbia County\t10350\t42.3\t11.2\t15.4\t19449\t111327\t0.4268\t18603\tObama\t18603\t0.029371438\t18603.0\n18778\t-76.37249200000001\t40.981219\tMainville CDP\tPA\tPennsylvania\tColumbia County\t86\t42.9\t21.0\t5.7\t20972\t156250\t0.4268\t17815\tObama\t17815\t0.000244053\t17815.0\n18779\t-76.525369\t41.120793\tMillville borough\tPA\tPennsylvania\tColumbia County\t971\t46.9\t18.8\t6.5\t20141\t134028\t0.4268\t17846\tObama\t17846\t0.0027555229999999997\t17846.0\n18780\t-76.371095\t41.149952\tStillwater borough\tPA\tPennsylvania\tColumbia County\t236\t43.9\t20.3\t8.1\t21567\t158654\t0.4268\t17878\tObama\t17878\t0.000669726\t17878.0\n18781\t-76.392219\t40.812989\tWilburton Number One CDP\tPA\tPennsylvania\tColumbia County\t228\t47.6\t7.0\t8.5\t15521\t70000\t0.4268\t17888\tObama\t17888\t0.000647023\t17888.0\n18782\t-76.403502\t40.878268\tNumidia CDP\tPA\tPennsylvania\tColumbia County\t262\t47.0\t14.0\t5.4\t18300\t145139\t0.4268\t17820\tObama\t17820\t0.0007435089999999999\t17820.0\n18783\t-76.496712\t41.017244\tBuckhorn CDP\tPA\tPennsylvania\tColumbia County\t198\t42.8\t26.6\t6.2\t23729\t158750\t0.4268\t17815\tObama\t17815\t0.0005618880000000001\t17815.0\n18784\t-76.35252\t41.023639\tLime Ridge CDP\tPA\tPennsylvania\tColumbia County\t927\t46.3\t16.4\t7.5\t20076\t128549\t0.4268\t18631\tObama\t18631\t0.002630659\t18631.0\n18785\t-76.412318\t41.077715999999995\tOrangeville borough\tPA\tPennsylvania\tColumbia County\t473\t46.2\t26.8\t5.5\t22868\t172321\t0.4268\t17859\tObama\t17859\t0.001342289\t17859.0\n18786\t-76.51896500000001\t41.093924\tEyers Grove CDP\tPA\tPennsylvania\tColumbia County\t89\t41.7\t14.1\t7.4\t19553\t140625\t0.4268\t17846\tObama\t17846\t0.00025256599999999997\t17846.0\n18787\t-76.42166\t41.233707\tWaller CDP\tPA\tPennsylvania\tColumbia County\t55\t48.5\t7.0\t12.5\t21700\t137500\t0.4268\t17814\tObama\t17814\t0.00015608\t17814.0\n18788\t-76.475278\t41.002543\tFernville CDP\tPA\tPennsylvania\tColumbia County\t550\t42.8\t26.9\t6.3\t23690\t154839\t0.4268\t17815\tObama\t17815\t0.0015608010000000001\t17815.0\n18789\t-76.239024\t41.078908\tFoundryville CDP\tPA\tPennsylvania\tColumbia County\t260\t47.3\t16.8\t13.5\t24052\t150000\t0.4268\t18603\tObama\t18603\t0.000737833\t18603.0\n18790\t-76.456147\t41.002474\tBloomsburg town\tPA\tPennsylvania\tColumbia County\t13450\t23.9\t32.2\t7.4\t17435\t136392\t0.4268\t17815\tObama\t17815\t0.038168681\t17815.0\n18791\t-76.416319\t41.005703999999994\tEspy CDP\tPA\tPennsylvania\tColumbia County\t1490\t46.5\t26.4\t5.2\t25905\t139326\t0.4268\t17815\tObama\t17815\t0.004228352\t17815.0\n18792\t-80.42204699999999\t41.656523\tLinesville borough\tPA\tPennsylvania\tCrawford County\t1087\t42.3\t13.9\t13.8\t17764\t108686\t0.3923\t16424\tObama\t16424\t0.00308471\t16424.0\n18793\t-79.66996999999999\t41.627354\tTitusville city\tPA\tPennsylvania\tCrawford County\t5820\t39.3\t17.8\t13.0\t21208\t83510\t0.3923\t16354\tObama\t16354\t0.016516113\t16354.0\n18794\t-79.682642\t41.823969\tSpartansburg borough\tPA\tPennsylvania\tCrawford County\t310\t36.4\t8.6\t12.0\t17283\t92500\t0.3923\t16434\tObama\t16434\t0.0008797239999999999\t16434.0\n18795\t-80.479514\t41.585584999999995\tPymatuning Central CDP\tPA\tPennsylvania\tCrawford County\t2270\t52.3\t12.1\t13.0\t18608\t108939\t0.3923\t16424\tObama\t16424\t0.006441852\t16424.0\n18796\t-80.381875\t41.550898\tHartstown CDP\tPA\tPennsylvania\tCrawford County\t250\t38.4\t7.7\t12.2\t17143\t110938\t0.3923\t16131\tObama\t16131\t0.000709455\t16131.0\n18797\t-80.368291\t41.757838\tConneautville borough\tPA\tPennsylvania\tCrawford County\t847\t43.7\t13.5\t9.6\t17626\t111000\t0.3923\t16406\tObama\t16406\t0.002403634\t16406.0\n18798\t-79.803903\t41.778769\tRiceville CDP\tPA\tPennsylvania\tCrawford County\t80\t44.2\t13.8\t11.4\t18589\t118750\t0.3923\t16404\tObama\t16404\t0.000227026\t16404.0\n18799\t-80.470102\t41.50672\tPymatuning South CDP\tPA\tPennsylvania\tCrawford County\t508\t48.5\t15.5\t13.8\t18459\t110000\t0.3923\t16134\tObama\t16134\t0.0014416129999999998\t16134.0\n18800\t-80.179528\t41.639554\tFredericksburg CDP\tPA\tPennsylvania\tCrawford County\t1079\t44.4\t6.7\t9.9\t22649\t98704\t0.3923\t16335\tObama\t16335\t0.0030620079999999997\t16335.0\n18801\t-79.837998\t41.790517\tLincolnville CDP\tPA\tPennsylvania\tCrawford County\t114\t35.8\t14.1\t10.5\t19244\t107500\t0.3923\t16404\tObama\t16404\t0.00032351099999999996\t16404.0\n18802\t-80.22606400000001\t41.562109\tGeneva CDP\tPA\tPennsylvania\tCrawford County\t116\t41.8\t14.1\t9.4\t20289\t95000\t0.3923\t16111\tObama\t16111\t0.000329187\t16111.0\n18803\t-80.339203\t41.507735\tAtlantic CDP\tPA\tPennsylvania\tCrawford County\t45\t27.5\t8.3\t11.1\t14886\t106250\t0.3923\t16110\tObama\t16110\t0.00012770200000000002\t16110.0\n18804\t-80.0839\t41.754362\tWoodcock borough\tPA\tPennsylvania\tCrawford County\t145\t40.4\t12.5\t12.5\t18093\t112500\t0.3923\t16440\tObama\t16440\t0.000411484\t16440.0\n18805\t-79.72464699999999\t41.651303000000006\tHydetown borough\tPA\tPennsylvania\tCrawford County\t565\t45.2\t9.9\t8.5\t20885\t98889\t0.3923\t16354\tObama\t16354\t0.001603368\t16354.0\n18806\t-80.04743\t41.519988\tCochranton borough\tPA\tPennsylvania\tCrawford County\t1345\t42.5\t16.8\t8.8\t21557\t110693\t0.3923\t16314\tObama\t16314\t0.0038168679999999997\t16314.0\n18807\t-80.039817\t41.679635\tBlooming Valley borough\tPA\tPennsylvania\tCrawford County\t360\t40.9\t19.2\t8.9\t19979\t127232\t0.3923\t16327\tObama\t16327\t0.001021615\t16327.0\n18808\t-79.975859\t41.630738\tGuys Mills CDP\tPA\tPennsylvania\tCrawford County\t128\t41.3\t15.9\t13.0\t17835\t90000\t0.3923\t16327\tObama\t16327\t0.000363241\t16327.0\n18809\t-80.31428100000001\t41.66577\tHarmonsburg CDP\tPA\tPennsylvania\tCrawford County\t342\t43.8\t15.7\t11.4\t20243\t112500\t0.3923\t16422\tObama\t16422\t0.0009705339999999999\t16422.0\n18810\t-80.136438\t41.71651\tSaegertown borough\tPA\tPennsylvania\tCrawford County\t1034\t39.2\t20.9\t6.2\t23167\t121731\t0.3923\t16433\tObama\t16433\t0.002934306\t16433.0\n18811\t-79.836391\t41.817721\tCanadohta Lake CDP\tPA\tPennsylvania\tCrawford County\t559\t43.6\t13.8\t10.9\t18550\t116987\t0.3923\t16438\tObama\t16438\t0.001586341\t16438.0\n18812\t-80.146741\t41.647644\tMeadville city\tPA\tPennsylvania\tCrawford County\t13529\t36.0\t29.7\t11.7\t20846\t117981\t0.3923\t16335\tObama\t16335\t0.038392868999999996\t16335.0\n18813\t-79.76134499999999\t41.738844\tCenterville borough\tPA\tPennsylvania\tCrawford County\t257\t37.3\t9.9\t13.0\t15655\t92500\t0.3923\t16404\tObama\t16404\t0.00072932\t16404.0\n18814\t-80.310133\t41.627255\tConneaut Lakeshore CDP\tPA\tPennsylvania\tCrawford County\t2453\t48.3\t27.0\t10.2\t24285\t142992\t0.3923\t16316\tObama\t16316\t0.006961173\t16316.0\n18815\t-79.87999\t41.680074\tTownville borough\tPA\tPennsylvania\tCrawford County\t291\t39.3\t14.3\t9.5\t15906\t96875\t0.3923\t16360\tObama\t16360\t0.0008258060000000001\t16360.0\n18816\t-80.370399\t41.515772999999996\tAdamsville CDP\tPA\tPennsylvania\tCrawford County\t122\t27.5\t9.2\t10.0\t14932\t108929\t0.3923\t16110\tObama\t16110\t0.000346214\t16110.0\n18817\t-80.371593\t41.800455\tSpringboro borough\tPA\tPennsylvania\tCrawford County\t511\t37.3\t10.3\t11.9\t18376\t95000\t0.3923\t16435\tObama\t16435\t0.0014501260000000001\t16435.0\n18818\t-80.464916\t41.666089\tPymatuning North CDP\tPA\tPennsylvania\tCrawford County\t318\t47.0\t8.7\t12.0\t20207\t113750\t0.3923\t164HH\tObama\t164HH\t0.0009024269999999999\t0.0\n18819\t-80.059597\t41.801956\tCambridge Springs borough\tPA\tPennsylvania\tCrawford County\t2337\t38.9\t20.2\t11.5\t20135\t116869\t0.3923\t16403\tObama\t16403\t0.0066319859999999994\t16403.0\n18820\t-80.31021899999999\t41.601941\tConneaut Lake borough\tPA\tPennsylvania\tCrawford County\t730\t46.9\t22.0\t10.9\t26524\t133333\t0.3923\t16316\tObama\t16316\t0.002071609\t16316.0\n18821\t-80.112174\t41.772645000000004\tVenango borough\tPA\tPennsylvania\tCrawford County\t291\t39.5\t22.2\t8.8\t21061\t127885\t0.3923\t16440\tObama\t16440\t0.0008258060000000001\t16440.0\n18822\t-76.935007\t40.288349\tEnola CDP\tPA\tPennsylvania\tCumberland County\t5599\t35.3\t16.3\t10.6\t25058\t135582\t0.4004\t17025\tObama\t17025\t0.015888955\t17025.0\n18823\t-77.17853000000001\t40.243396000000004\tSchlusser CDP\tPA\tPennsylvania\tCumberland County\t5254\t43.4\t27.7\t5.8\t32049\t157510\t0.4004\t17013\tObama\t17013\t0.014909907\t17013.0\n18824\t-76.876345\t40.229838\tNew Cumberland borough\tPA\tPennsylvania\tCumberland County\t7129\t44.0\t39.2\t8.2\t29791\t170373\t0.4004\t17070\tObama\t17070\t0.02023082\t17070.0\n18825\t-76.92710600000001\t40.24225\tCamp Hill borough\tPA\tPennsylvania\tCumberland County\t7516\t46.6\t49.6\t7.7\t32769\t196105\t0.4004\t17011\tObama\t17011\t0.021329056000000002\t17011.0\n18826\t-77.514507\t40.049655\tShippensburg borough\tPA\tPennsylvania\tCumberland County\t6110\t30.8\t29.0\t8.3\t20553\t144431\t0.4004\t17257\tObama\t17257\t0.017339081\t17257.0\n18827\t-77.185361\t40.112687\tMount Holly Springs borough\tPA\tPennsylvania\tCumberland County\t2091\t40.2\t21.3\t6.9\t24685\t151820\t0.4004\t17065\tObama\t17065\t0.005933882\t17065.0\n18828\t-77.401226\t40.170533\tNewville borough\tPA\tPennsylvania\tCumberland County\t1371\t34.1\t19.4\t11.9\t22085\t127760\t0.4004\t17241\tObama\t17241\t0.0038906509999999997\t17241.0\n18829\t-77.004582\t40.21096\tMechanicsburg borough\tPA\tPennsylvania\tCumberland County\t8858\t41.8\t30.8\t6.9\t30008\t170033\t0.4004\t17055\tObama\t17055\t0.025137411000000002\t17055.0\n18830\t-77.13901800000001\t40.159188\tBoiling Springs CDP\tPA\tPennsylvania\tCumberland County\t3045\t43.5\t35.3\t6.5\t29732\t205491\t0.4004\t17007\tObama\t17007\t0.008641161999999999\t17007.0\n18831\t-77.283282\t40.201267\tPlainfield CDP\tPA\tPennsylvania\tCumberland County\t415\t44.0\t24.0\t3.9\t23293\t184783\t0.4004\t17081\tObama\t17081\t0.001177695\t17081.0\n18832\t-76.955616\t40.22246\tShiremanstown borough\tPA\tPennsylvania\tCumberland County\t1508\t43.4\t34.5\t7.2\t26165\t169821\t0.4004\t17011\tObama\t17011\t0.004279433\t17011.0\n18833\t-77.554229\t40.137371\tNewburg borough\tPA\tPennsylvania\tCumberland County\t421\t38.0\t16.4\t8.5\t19156\t164286\t0.4004\t17240\tObama\t17240\t0.001194722\t17240.0\n18834\t-76.909968\t40.260866\tWormleysburg borough\tPA\tPennsylvania\tCumberland County\t2765\t41.0\t38.6\t6.2\t35652\t188710\t0.4004\t17043\tObama\t17043\t0.007846573\t17043.0\n18835\t-77.072702\t40.231084\tNew Kingstown CDP\tPA\tPennsylvania\tCumberland County\t538\t44.0\t34.0\t5.5\t33861\t197368\t0.4004\t17072\tObama\t17072\t0.0015267470000000002\t17072.0\n18836\t-76.901388\t40.226181\tLower Allen CDP\tPA\tPennsylvania\tCumberland County\t6593\t43.2\t38.3\t7.3\t35682\t177153\t0.4004\t17043\tObama\t17043\t0.018709748000000002\t17043.0\n18837\t-76.898676\t40.244307\tLemoyne borough\tPA\tPennsylvania\tCumberland County\t3986\t41.3\t35.0\t7.1\t33346\t142921\t0.4004\t17043\tObama\t17043\t0.011311551000000001\t17043.0\n18838\t-77.20412900000001\t40.199899\tCarlisle borough\tPA\tPennsylvania\tCumberland County\t18381\t37.5\t38.7\t10.0\t27240\t166136\t0.4004\t17013\tObama\t17013\t0.052161972\t17013.0\n18839\t-76.929773\t40.368417\tDauphin borough\tPA\tPennsylvania\tDauphin County\t671\t43.5\t17.3\t6.1\t29184\t145918\t0.5239\t17018\tObama\t17018\t0.0019041770000000002\t17018.0\n18840\t-76.809512\t40.603032\tBerrysburg borough\tPA\tPennsylvania\tDauphin County\t365\t41.0\t8.8\t7.3\t19356\t109375\t0.5239\t17005\tObama\t17005\t0.001035804\t17005.0\n18841\t-76.825439\t40.225702000000005\tSteelton borough\tPA\tPennsylvania\tDauphin County\t5849\t35.9\t10.7\t10.9\t21072\t100369\t0.5239\t17113\tObama\t17113\t0.01659841\t17113.0\n18842\t-76.767942\t40.269648\tRutherford CDP\tPA\tPennsylvania\tDauphin County\t4120\t43.7\t22.9\t7.6\t29256\t151188\t0.5239\t17111\tObama\t17111\t0.011691818999999999\t17111.0\n18843\t-76.78846800000001\t40.316612\tPaxtonia CDP\tPA\tPennsylvania\tDauphin County\t5205\t41.8\t30.7\t6.8\t28022\t178412\t0.5239\t17112\tObama\t17112\t0.014770854\t17112.0\n18844\t-76.80680799999999\t40.299655\tColonial Park CDP\tPA\tPennsylvania\tDauphin County\t12830\t40.3\t28.9\t8.1\t27024\t163972\t0.5239\t17109\tObama\t17109\t0.036409232\t17109.0\n18845\t-76.838132\t40.289823999999996\tProgress CDP\tPA\tPennsylvania\tDauphin County\t9569\t42.7\t29.8\t8.4\t29890\t165689\t0.5239\t17109\tObama\t17109\t0.027155101\t17109.0\n18846\t-76.955267\t40.542736\tMillersburg borough\tPA\tPennsylvania\tDauphin County\t2536\t41.7\t14.2\t7.3\t25024\t112920\t0.5239\t17061\tObama\t17061\t0.007196711999999999\t17061.0\n18847\t-76.848454\t40.278181\tPenbrook borough\tPA\tPennsylvania\tDauphin County\t3006\t35.5\t18.6\t11.2\t22275\t126495\t0.5239\t17103\tObama\t17103\t0.008530487\t17103.0\n18848\t-76.80267099999999\t40.640498\tPillow borough\tPA\tPennsylvania\tDauphin County\t314\t41.1\t8.8\t7.2\t19324\t106667\t0.5239\t17080\tObama\t17080\t0.0008910760000000001\t17080.0\n18849\t-76.932923\t40.464553\tHalifax borough\tPA\tPennsylvania\tDauphin County\t853\t37.8\t11.0\t10.6\t24575\t108824\t0.5239\t17069\tObama\t17069\t0.002420661\t17069.0\n18850\t-76.81563100000001\t40.548289000000004\tElizabethville borough\tPA\tPennsylvania\tDauphin County\t1362\t39.5\t15.3\t7.2\t21467\t127911\t0.5239\t17023\tObama\t17023\t0.0038651109999999996\t17023.0\n18851\t-76.617091\t40.581003\tWilliamstown borough\tPA\tPennsylvania\tDauphin County\t1362\t42.8\t7.0\t14.7\t19473\t76691\t0.5239\t17098\tObama\t17098\t0.0038651109999999996\t17098.0\n18852\t-76.784515\t40.208615\tHighspire borough\tPA\tPennsylvania\tDauphin County\t2536\t40.5\t12.0\t7.6\t24054\t119669\t0.5239\t17034\tObama\t17034\t0.007196711999999999\t17034.0\n18853\t-76.72551700000001\t40.337577\tSkyline View CDP\tPA\tPennsylvania\tDauphin County\t3382\t45.4\t23.9\t5.1\t28805\t180804\t0.5239\t17112\tObama\t17112\t0.009597508000000001\t17112.0\n18854\t-76.797712\t40.264005\tLawnton CDP\tPA\tPennsylvania\tDauphin County\t3722\t39.9\t30.1\t9.2\t26258\t168947\t0.5239\t17111\tObama\t17111\t0.010562367\t17111.0\n18855\t-76.884248\t40.274823\tHarrisburg city\tPA\tPennsylvania\tDauphin County\t48630\t34.7\t16.5\t16.5\t19919\t89826\t0.5239\t17102\tObama\t17102\t0.138003193\t17102.0\n18856\t-76.714836\t40.607642999999996\tGratz borough\tPA\tPennsylvania\tDauphin County\t638\t38.2\t8.4\t7.1\t20995\t122143\t0.5239\t17048\tObama\t17048\t0.001810529\t17048.0\n18857\t-76.69737099999999\t40.563693\tLykens borough\tPA\tPennsylvania\tDauphin County\t1927\t41.0\t7.4\t12.9\t21064\t75523\t0.5239\t17097\tObama\t17097\t0.005468479\t17097.0\n18858\t-76.794821\t40.344331\tLinglestown CDP\tPA\tPennsylvania\tDauphin County\t6292\t45.2\t32.9\t8.0\t30428\t186317\t0.5239\t17112\tObama\t17112\t0.017855563999999997\t17112.0\n18859\t-76.834192\t40.262119\tPaxtang borough\tPA\tPennsylvania\tDauphin County\t1537\t39.9\t33.8\t6.4\t26648\t147932\t0.5239\t17104\tObama\t17104\t0.00436173\t17104.0\n18860\t-76.726659\t40.187171\tRoyalton borough\tPA\tPennsylvania\tDauphin County\t939\t41.0\t8.1\t5.6\t26494\t116071\t0.5239\t17057\tObama\t17057\t0.002664713\t17057.0\n18861\t-76.711617\t40.265788\tHummelstown borough\tPA\tPennsylvania\tDauphin County\t4332\t40.5\t23.9\t6.3\t25948\t159551\t0.5239\t17036\tObama\t17036\t0.012293436999999999\t17036.0\n18862\t-76.8211\t40.233168\tBressler-Enhaut-Oberlin CDP\tPA\tPennsylvania\tDauphin County\t2813\t41.0\t12.2\t7.4\t24686\t123611\t0.5239\t17113\tObama\t17113\t0.007982788000000001\t17113.0\n18863\t-76.729135\t40.200661\tMiddletown borough\tPA\tPennsylvania\tDauphin County\t10155\t39.3\t15.6\t10.6\t25268\t127897\t0.5239\t17057\tObama\t17057\t0.028818063999999997\t17057.0\n18864\t-76.645861\t40.280566\tHershey CDP\tPA\tPennsylvania\tDauphin County\t12771\t43.8\t45.4\t6.3\t32358\t246479\t0.5239\t17033\tObama\t17033\t0.036241801000000004\t17033.0\n18865\t-75.295852\t39.930132\tClifton Heights borough\tPA\tPennsylvania\tDelaware County\t6504\t38.0\t16.0\t9.1\t26653\t153835\t0.6016\t19018\tObama\t19018\t0.018457182\t19018.0\n18866\t-75.26106\t39.920759999999994\tDarby borough\tPA\tPennsylvania\tDelaware County\t10073\t33.9\t13.2\t19.2\t18697\t94032\t0.6016\t19023\tObama\t19023\t0.028585362000000003\t19023.0\n18867\t-75.39827199999999\t39.937537\tUpper Providence Township CDP\tPA\tPennsylvania\tDelaware County\t10562\t43.2\t57.8\t8.1\t44188\t397913\t0.6016\t19063\tObama\t19063\t0.029973056\t19063.0\n18868\t-75.344476\t39.877407\tWoodlyn CDP\tPA\tPennsylvania\tDelaware County\t9970\t40.3\t17.8\t10.6\t25728\t207341\t0.6016\t19094\tObama\t19094\t0.028293067\t19094.0\n18869\t-75.400063\t39.850459\tChester Township CDP\tPA\tPennsylvania\tDelaware County\t4540\t32.2\t15.8\t15.4\t18862\t110499\t0.6016\t19015\tObama\t19015\t0.012883703\t19015.0\n18870\t-75.367524\t40.028778\tRadnor Township CDP\tPA\tPennsylvania\tDelaware County\t31107\t32.0\t71.3\t8.3\t46481\t567804\t0.6016\t19085\tObama\t19085\t0.088276071\t19085.0\n18871\t-75.26777\t39.907388\tSharon Hill borough\tPA\tPennsylvania\tDelaware County\t5368\t37.7\t20.2\t8.8\t25400\t132772\t0.6016\t19079\tObama\t19079\t0.015233419\t19079.0\n18872\t-75.352932\t39.969567\tBroomall CDP\tPA\tPennsylvania\tDelaware County\t10822\t44.5\t32.1\t8.3\t28563\t322318\t0.6016\t19008\tObama\t19008\t0.03071089\t19008.0\n18873\t-75.424132\t39.82437\tLinwood CDP\tPA\tPennsylvania\tDelaware County\t3270\t35.7\t6.9\t10.2\t19206\t130334\t0.6016\t19061\tObama\t19061\t0.009279672\t19061.0\n18874\t-75.391739\t39.871515\tBrookhaven borough\tPA\tPennsylvania\tDelaware County\t8094\t43.3\t25.0\t10.2\t32398\t209894\t0.6016\t19015\tObama\t19015\t0.022969316\t19015.0\n18875\t-75.325129\t39.878467\tRidley Park borough\tPA\tPennsylvania\tDelaware County\t7045\t43.8\t28.8\t8.4\t31377\t233067\t0.6016\t19078\tObama\t19078\t0.019992443000000002\t19078.0\n18876\t-75.276035\t39.940829\tLansdowne borough\tPA\tPennsylvania\tDelaware County\t10745\t40.4\t40.0\t10.1\t29676\t183835\t0.6016\t19050\tObama\t19050\t0.030492377\t19050.0\n18877\t-75.334416\t39.856569\tEddystone borough\tPA\tPennsylvania\tDelaware County\t2408\t36.4\t11.9\t7.6\t25715\t127177\t0.6016\t19022\tObama\t19022\t0.006833471\t19022.0\n18878\t-75.252545\t39.963823\tMillbourne borough\tPA\tPennsylvania\tDelaware County\t849\t34.8\t30.5\t11.6\t17385\t115972\t0.6016\t19151\tObama\t19151\t0.002409309\t19151.0\n18879\t-75.29648900000001\t39.886482\tNorwood borough\tPA\tPennsylvania\tDelaware County\t5924\t38.6\t17.8\t9.7\t26789\t183632\t0.6016\t19074\tObama\t19074\t0.016811246999999998\t19074.0\n18880\t-75.36965699999999\t39.897216\tNether Providence Township CDP\tPA\tPennsylvania\tDelaware County\t13603\t45.1\t55.6\t8.0\t40085\t322701\t0.6016\t19086\tObama\t19086\t0.038602867\t19086.0\n18881\t-75.328655\t39.892378\tFolsom CDP\tPA\tPennsylvania\tDelaware County\t7878\t42.8\t24.2\t7.4\t27164\t218430\t0.6016\t19033\tObama\t19033\t0.022356347000000002\t19033.0\n18882\t-75.42556\t39.863699\tVillage Green-Green Ridge CDP\tPA\tPennsylvania\tDelaware County\t8062\t42.7\t24.5\t6.3\t28635\t246823\t0.6016\t19014\tObama\t19014\t0.022878506\t19014.0\n18883\t-75.326676\t39.911471\tMorton borough\tPA\tPennsylvania\tDelaware County\t2628\t40.3\t32.5\t4.7\t30089\t214486\t0.6016\t19070\tObama\t19070\t0.007457791\t19070.0\n18884\t-75.264296\t39.897573\tDarby Township CDP\tPA\tPennsylvania\tDelaware County\t9580\t39.5\t12.1\t12.9\t25023\t143959\t0.6016\t19079\tObama\t19079\t0.027186317\t19079.0\n18885\t-75.335859\t39.928682\tSpringfield CDP\tPA\tPennsylvania\tDelaware County\t23157\t44.5\t41.6\t6.5\t33362\t299045\t0.6016\t19064\tObama\t19064\t0.06571540099999999\t19064.0\n18886\t-75.2528\t39.932485\tYeadon borough\tPA\tPennsylvania\tDelaware County\t11310\t40.8\t27.2\t13.0\t26867\t154368\t0.6016\t19050\tObama\t19050\t0.032095746\t19050.0\n18887\t-75.307526\t39.885962\tProspect Park borough\tPA\tPennsylvania\tDelaware County\t6437\t38.1\t18.8\t9.0\t28547\t181560\t0.6016\t19076\tObama\t19076\t0.018267048\t19076.0\n18888\t-75.40350600000001\t39.824490999999995\tTrainer borough\tPA\tPennsylvania\tDelaware County\t1890\t37.8\t10.0\t10.7\t23335\t141824\t0.6016\t19013\tObama\t19013\t0.00536348\t19013.0\n18889\t-75.27699799999999\t39.889070000000004\tFolcroft borough\tPA\tPennsylvania\tDelaware County\t6960\t37.8\t10.0\t10.4\t26072\t137708\t0.6016\t19032\tObama\t19032\t0.019751228\t19032.0\n18890\t-75.303793\t39.949519\tDrexel Hill CDP\tPA\tPennsylvania\tDelaware County\t28814\t38.3\t40.1\t7.8\t31085\t229175\t0.6016\t19026\tObama\t19026\t0.08176895\t19026.0\n18891\t-75.44156600000001\t39.919496\tLima CDP\tPA\tPennsylvania\tDelaware County\t3289\t74.0\t38.7\t8.7\t30491\t299107\t0.6016\t19063\tObama\t19063\t0.00933359\t19063.0\n18892\t-75.269385\t39.864507\tTinicum Township CDP\tPA\tPennsylvania\tDelaware County\t4188\t40.3\t10.4\t10.2\t27468\t167575\t0.6016\t19113\tObama\t19113\t0.011884791\t19113.0\n18893\t-75.37795200000001\t39.867249\tParkside borough\tPA\tPennsylvania\tDelaware County\t2262\t36.6\t17.5\t8.8\t21849\t162763\t0.6016\t19015\tObama\t19015\t0.006419149\t19015.0\n18894\t-75.384985\t39.894887\tRose Valley borough\tPA\tPennsylvania\tDelaware County\t983\t51.4\t73.3\t4.8\t70799\t574248\t0.6016\t19086\tObama\t19086\t0.002789577\t19086.0\n18895\t-75.388715\t39.919817\tMedia borough\tPA\tPennsylvania\tDelaware County\t5448\t44.1\t45.8\t8.8\t32715\t239088\t0.6016\t19063\tObama\t19063\t0.015460443999999999\t19063.0\n18896\t-75.288108\t39.922445\tAldan borough\tPA\tPennsylvania\tDelaware County\t4165\t40.4\t27.7\t10.7\t26424\t200215\t0.6016\t19018\tObama\t19018\t0.011819521000000001\t19018.0\n18897\t-75.26080400000001\t39.943975\tEast Lansdowne borough\tPA\tPennsylvania\tDelaware County\t2522\t38.1\t22.8\t11.9\t23012\t144828\t0.6016\t19050\tObama\t19050\t0.007156981999999999\t19050.0\n18898\t-75.27762299999999\t39.91513\tCollingdale borough\tPA\tPennsylvania\tDelaware County\t8474\t35.3\t10.9\t11.7\t24797\t128517\t0.6016\t19023\tObama\t19023\t0.024047687999999998\t19023.0\n18899\t-75.445409\t39.83578\tBoothwyn CDP\tPA\tPennsylvania\tDelaware County\t5279\t41.0\t17.8\t8.9\t29352\t224484\t0.6016\t19061\tObama\t19061\t0.014980853\t19061.0\n18900\t-75.348842\t39.902161\tSwarthmore borough\tPA\tPennsylvania\tDelaware County\t6204\t32.7\t80.7\t7.3\t44257\t421789\t0.6016\t19081\tObama\t19081\t0.017605836\t19081.0\n18901\t-75.327487\t39.900878000000006\tRutledge borough\tPA\tPennsylvania\tDelaware County\t861\t39.3\t43.6\t9.9\t28342\t263889\t0.6016\t19070\tObama\t19070\t0.002443363\t19070.0\n18902\t-75.372031\t39.845457\tChester city\tPA\tPennsylvania\tDelaware County\t36839\t31.1\t10.7\t19.2\t16860\t77188\t0.6016\t19013\tObama\t19013\t0.10454245599999999\t19013.0\n18903\t-75.41642399999999\t39.813139\tMarcus Hook borough\tPA\tPennsylvania\tDelaware County\t2405\t35.7\t6.8\t9.9\t19900\t115959\t0.6016\t19061\tObama\t19061\t0.0068249569999999996\t19061.0\n18904\t-75.469563\t39.893032\tChester Heights borough\tPA\tPennsylvania\tDelaware County\t2502\t41.3\t50.6\t6.2\t45449\t241869\t0.6016\t19342\tObama\t19342\t0.007100225999999999\t19342.0\n18905\t-75.379482\t39.856159999999996\tUpland borough\tPA\tPennsylvania\tDelaware County\t3106\t35.4\t12.7\t17.7\t22378\t123227\t0.6016\t19013\tObama\t19013\t0.008814269\t19013.0\n18906\t-75.253117\t39.911834999999996\tColwyn borough\tPA\tPennsylvania\tDelaware County\t2443\t31.6\t15.8\t16.3\t18062\t95379\t0.6016\t19023\tObama\t19023\t0.006932795\t19023.0\n18907\t-75.291995\t39.899631\tGlenolden borough\tPA\tPennsylvania\tDelaware County\t7304\t38.9\t15.7\t10.2\t27566\t165918\t0.6016\t19036\tObama\t19036\t0.020727438\t19036.0\n18908\t-78.678574\t41.491751\tJohnsonburg borough\tPA\tPennsylvania\tElk County\t2656\t41.2\t11.9\t17.7\t22125\t71942\t0.4127\t15845\tObama\t15845\t0.00753725\t15845.0\n18909\t-78.72940899999999\t41.427328\tRidgway borough\tPA\tPennsylvania\tElk County\t4247\t41.5\t18.6\t13.0\t24807\t91857\t0.4127\t15853\tObama\t15853\t0.012052222\t15853.0\n18910\t-78.534293\t41.457527\tSt. Marys city\tPA\tPennsylvania\tElk County\t13792\t42.7\t19.2\t9.6\t23420\t137550\t0.4127\t15857\tObama\t15857\t0.039139215\t15857.0\n18911\t-79.807129\t42.003912\tWattsburg borough\tPA\tPennsylvania\tErie County\t383\t39.5\t14.3\t12.9\t22113\t109135\t0.5736\t16442\tObama\t16442\t0.001086885\t16442.0\n18912\t-80.34617\t42.018059\tLake City borough\tPA\tPennsylvania\tErie County\t2807\t35.0\t9.5\t10.6\t19490\t114000\t0.5736\t16423\tObama\t16423\t0.007965761\t16423.0\n18913\t-79.985316\t41.944588\tWaterford borough\tPA\tPennsylvania\tErie County\t1464\t36.2\t19.5\t8.2\t21101\t129669\t0.5736\t16441\tObama\t16441\t0.004154569\t16441.0\n18914\t-79.843662\t41.89686\tUnion City borough\tPA\tPennsylvania\tErie County\t3270\t32.8\t8.9\t10.7\t16191\t69255\t0.5736\t16438\tObama\t16438\t0.009279672\t16438.0\n18915\t-80.073226\t42.116587\tErie city\tPA\tPennsylvania\tErie County\t99477\t35.5\t19.8\t13.8\t19878\t93662\t0.5736\t16501\tObama\t16501\t0.28229783399999997\t16501.0\n18916\t-80.319126\t42.004178\tGirard borough\tPA\tPennsylvania\tErie County\t3120\t37.4\t21.5\t6.3\t17848\t123368\t0.5736\t16423\tObama\t16423\t0.008853999\t16423.0\n18917\t-80.023016\t42.150597999999995\tLawrence Park CDP\tPA\tPennsylvania\tErie County\t3938\t41.8\t26.0\t11.8\t24625\t101109\t0.5736\t16511\tObama\t16511\t0.011175336000000001\t16511.0\n18918\t-79.972327\t41.877584999999996\tMill Village borough\tPA\tPennsylvania\tErie County\t421\t37.3\t15.6\t11.5\t19002\t126563\t0.5736\t16427\tObama\t16427\t0.001194722\t16427.0\n18919\t-80.27636700000001\t42.047061\tAvonia CDP\tPA\tPennsylvania\tErie County\t1324\t47.2\t49.4\t7.1\t34315\t227778\t0.5736\t16415\tObama\t16415\t0.003757274\t16415.0\n18920\t-80.01225699999999\t42.136873\tWesleyville borough\tPA\tPennsylvania\tErie County\t3464\t35.2\t14.2\t10.6\t20839\t87277\t0.5736\t16510\tObama\t16510\t0.009830209\t16510.0\n18921\t-79.833272\t42.213333\tNorth East borough\tPA\tPennsylvania\tErie County\t4399\t35.1\t25.1\t13.7\t22520\t133508\t0.5736\t16428\tObama\t16428\t0.012483571\t16428.0\n18922\t-80.363628\t41.890252000000004\tAlbion borough\tPA\tPennsylvania\tErie County\t1525\t37.1\t13.6\t9.7\t19923\t106689\t0.5736\t16401\tObama\t16401\t0.004327676\t16401.0\n18923\t-79.994585\t42.149324\tNorthwest Harborcreek CDP\tPA\tPennsylvania\tErie County\t9066\t45.5\t23.1\t9.9\t25861\t148541\t0.5736\t16510\tObama\t16510\t0.025727677\t16510.0\n18924\t-79.746126\t41.907125\tElgin borough\tPA\tPennsylvania\tErie County\t236\t39.8\t10.7\t10.3\t17303\t95556\t0.5736\t16407\tObama\t16407\t0.000669726\t16407.0\n18925\t-80.12385400000001\t41.876278000000006\tEdinboro borough\tPA\tPennsylvania\tErie County\t7670\t22.8\t56.7\t11.6\t17445\t152396\t0.5736\t16412\tObama\t16412\t0.02176608\t16412.0\n18926\t-80.14086\t41.998315000000005\tMcKean borough\tPA\tPennsylvania\tErie County\t399\t39.9\t21.3\t5.9\t22045\t160938\t0.5736\t16426\tObama\t16426\t0.00113229\t16426.0\n18927\t-80.32996700000001\t41.950990999999995\tPlatea borough\tPA\tPennsylvania\tErie County\t484\t39.9\t9.8\t7.2\t20545\t126293\t0.5736\t16410\tObama\t16410\t0.001373505\t16410.0\n18928\t-80.34143900000001\t41.904047999999996\tCranesville borough\tPA\tPennsylvania\tErie County\t639\t36.3\t13.5\t10.1\t20084\t85000\t0.5736\t16410\tObama\t16410\t0.0018133670000000002\t16410.0\n18929\t-79.635565\t41.925686\tCorry city\tPA\tPennsylvania\tErie County\t6512\t37.6\t13.0\t14.9\t19456\t76759\t0.5736\t16407\tObama\t16407\t0.018479885\t16407.0\n18930\t-79.724523\t39.899288\tUniontown city\tPA\tPennsylvania\tFayette County\t11921\t43.7\t17.6\t18.0\t18765\t90466\t0.45299999999999996\t15401\tObama\t15401\t0.033829654\t15401.0\n18931\t-79.900808\t39.734593\tPoint Marion borough\tPA\tPennsylvania\tFayette County\t1322\t41.9\t21.0\t11.9\t18965\t75938\t0.45299999999999996\t15474\tObama\t15474\t0.003751598\t15474.0\n18932\t-79.88996\t40.075124\tNewell borough\tPA\tPennsylvania\tFayette County\t536\t45.8\t12.9\t6.6\t20445\t80556\t0.45299999999999996\t15466\tObama\t15466\t0.001521072\t15466.0\n18933\t-79.808852\t39.802203000000006\tSmithfield borough\tPA\tPennsylvania\tFayette County\t839\t43.4\t8.2\t10.3\t16204\t98889\t0.45299999999999996\t15478\tObama\t15478\t0.002380931\t15478.0\n18934\t-79.451926\t39.73588\tMarkleysburg borough\tPA\tPennsylvania\tFayette County\t298\t42.2\t7.2\t17.3\t13576\t98750\t0.45299999999999996\t15459\tObama\t15459\t0.00084567\t15459.0\n18935\t-79.614296\t39.978576000000004\tDunbar borough\tPA\tPennsylvania\tFayette County\t1139\t42.7\t7.7\t11.4\t15771\t72059\t0.45299999999999996\t15431\tObama\t15431\t0.003232277\t15431.0\n18936\t-79.73141700000001\t39.877390000000005\tLeith-Hatfield CDP\tPA\tPennsylvania\tFayette County\t2785\t50.8\t35.3\t4.6\t32391\t197188\t0.45299999999999996\t15401\tObama\t15401\t0.007903329\t15401.0\n18937\t-79.721576\t39.915356\tOliver CDP\tPA\tPennsylvania\tFayette County\t2836\t43.7\t13.2\t11.1\t18771\t75507\t0.45299999999999996\t15472\tObama\t15472\t0.008048058\t15472.0\n18938\t-79.580673\t39.994690000000006\tSouth Connellsville borough\tPA\tPennsylvania\tFayette County\t2202\t43.8\t9.3\t8.8\t18766\t89706\t0.45299999999999996\t15425\tObama\t15425\t0.00624888\t15425.0\n18939\t-79.908172\t39.848558000000004\tMasontown borough\tPA\tPennsylvania\tFayette County\t3513\t44.0\t14.8\t13.1\t19226\t93000\t0.45299999999999996\t15461\tObama\t15461\t0.009969262\t15461.0\n18940\t-79.752937\t40.08688\tPerryopolis borough\tPA\tPennsylvania\tFayette County\t1620\t48.6\t16.8\t6.8\t24154\t137500\t0.45299999999999996\t15473\tObama\t15473\t0.004597269\t15473.0\n18941\t-79.867284\t40.125752\tBelle Vernon borough\tPA\tPennsylvania\tFayette County\t1145\t46.9\t22.1\t22.5\t19109\t93205\t0.45299999999999996\t15432\tObama\t15432\t0.003249304\t15432.0\n18942\t-79.586947\t40.090376\tEverson borough\tPA\tPennsylvania\tFayette County\t739\t42.1\t9.6\t8.1\t19396\t75192\t0.45299999999999996\t15631\tObama\t15631\t0.002097149\t15631.0\n18943\t-79.838514\t40.100433\tFayette City borough\tPA\tPennsylvania\tFayette County\t654\t37.9\t14.4\t9.1\t19098\t69474\t0.45299999999999996\t15438\tObama\t15438\t0.0018559339999999998\t15438.0\n18944\t-79.662786\t40.034065000000005\tVanderbilt borough\tPA\tPennsylvania\tFayette County\t505\t40.3\t7.9\t12.8\t18839\t80714\t0.45299999999999996\t15430\tObama\t15430\t0.001433099\t15430.0\n18945\t-79.818425\t40.014196000000005\tGrindstone-Rowes Run CDP\tPA\tPennsylvania\tFayette County\t1154\t45.1\t8.5\t10.3\t18092\t46596\t0.45299999999999996\t15442\tObama\t15442\t0.0032748440000000003\t15442.0\n18946\t-79.494989\t39.86894\tOhiopyle borough\tPA\tPennsylvania\tFayette County\t79\t43.3\t8.8\t18.6\t15069\t97500\t0.45299999999999996\t15470\tObama\t15470\t0.000224188\t15470.0\n18947\t-79.75383199999999\t39.825103000000006\tFairchance borough\tPA\tPennsylvania\tFayette County\t2094\t41.1\t12.5\t16.7\t19020\t96250\t0.45299999999999996\t15436\tObama\t15436\t0.005942395\t15436.0\n18948\t-79.697687\t39.896046000000005\tEast Uniontown CDP\tPA\tPennsylvania\tFayette County\t2609\t42.9\t9.4\t21.0\t18754\t92366\t0.45299999999999996\t15445\tObama\t15445\t0.007403873\t15445.0\n18949\t-79.826513\t39.930105\tNew Salem-Buffington CDP\tPA\tPennsylvania\tFayette County\t767\t39.4\t11.9\t10.9\t19258\t75357\t0.45299999999999996\t15468\tObama\t15468\t0.002176608\t15468.0\n18950\t-79.588898\t40.016418\tConnellsville city\tPA\tPennsylvania\tFayette County\t8744\t39.9\t16.6\t11.2\t18135\t94643\t0.45299999999999996\t15425\tObama\t15425\t0.024813899\t15425.0\n18951\t-79.657624\t40.048076\tDawson borough\tPA\tPennsylvania\tFayette County\t408\t40.0\t8.2\t10.3\t17491\t80417\t0.45299999999999996\t15430\tObama\t15430\t0.001157831\t15430.0\n18952\t-79.904014\t40.007994000000004\tHiller CDP\tPA\tPennsylvania\tFayette County\t1230\t47.0\t20.4\t8.2\t22265\t69085\t0.45299999999999996\t15444\tObama\t15444\t0.003490519\t15444.0\n18953\t-79.70170300000001\t39.877299\tHopwood CDP\tPA\tPennsylvania\tFayette County\t2136\t47.0\t16.6\t9.9\t25275\t137035\t0.45299999999999996\t15445\tObama\t15445\t0.006061584\t15445.0\n18954\t-79.87686\t39.966381\tRepublic CDP\tPA\tPennsylvania\tFayette County\t1249\t41.8\t10.0\t12.0\t19333\t73000\t0.45299999999999996\t15475\tObama\t15475\t0.003544437\t15475.0\n18955\t-79.891222\t40.018764000000004\tBrownsville borough\tPA\tPennsylvania\tFayette County\t2608\t41.4\t20.4\t9.3\t17694\t58864\t0.45299999999999996\t15417\tObama\t15417\t0.007401035\t15417.0\n18956\t-79.448094\t41.493808\tTionesta borough\tPA\tPennsylvania\tForest County\t641\t47.4\t23.8\t10.9\t19029\t99200\t0.3875\t16353\tObama\t16353\t0.0018190429999999998\t16353.0\n18957\t-77.726137\t39.79095\tGreencastle borough\tPA\tPennsylvania\tFranklin County\t4103\t42.8\t18.8\t9.2\t25834\t170014\t0.3011\t17225\tObama\t17225\t0.011643576000000001\t17225.0\n18958\t-77.655374\t39.931869\tChambersburg borough\tPA\tPennsylvania\tFranklin County\t19319\t41.9\t22.8\t13.0\t24120\t140711\t0.3011\t17201\tObama\t17201\t0.054823847\t17201.0\n18959\t-77.543644\t39.745472\tWayne Heights CDP\tPA\tPennsylvania\tFranklin County\t2156\t45.5\t19.1\t7.8\t26173\t176563\t0.3011\t17268\tObama\t17268\t0.00611834\t17268.0\n18960\t-77.601058\t39.915566999999996\tGuilford CDP\tPA\tPennsylvania\tFranklin County\t2111\t48.4\t44.7\t5.2\t32802\t188854\t0.3011\t17254\tObama\t17254\t0.005990638\t17254.0\n18961\t-77.902674\t39.832402\tMercersburg borough\tPA\tPennsylvania\tFranklin County\t1610\t42.2\t24.4\t8.2\t25778\t147078\t0.3011\t17236\tObama\t17236\t0.00456889\t17236.0\n18962\t-77.555387\t39.840624\tMont Alto borough\tPA\tPennsylvania\tFranklin County\t1578\t40.2\t10.1\t10.4\t22792\t134220\t0.3011\t17237\tObama\t17237\t0.00447808\t17237.0\n18963\t-77.527998\t39.734057\tRouzerville CDP\tPA\tPennsylvania\tFranklin County\t862\t42.6\t8.3\t7.7\t22073\t136607\t0.3011\t17268\tObama\t17268\t0.002446201\t17268.0\n18964\t-77.609143\t40.058678\tOrrstown borough\tPA\tPennsylvania\tFranklin County\t246\t38.9\t13.0\t6.4\t22361\t180556\t0.3011\t17244\tObama\t17244\t0.000698104\t17244.0\n18965\t-77.582216\t39.752093\tWaynesboro borough\tPA\tPennsylvania\tFranklin County\t10256\t37.6\t15.8\t10.5\t22968\t134843\t0.3011\t17268\tObama\t17268\t0.029104683\t17268.0\n18966\t-77.566005\t39.912009999999995\tFayetteville CDP\tPA\tPennsylvania\tFranklin County\t3042\t44.8\t14.4\t8.4\t27117\t141483\t0.3011\t17222\tObama\t17222\t0.008632649000000001\t17222.0\n18967\t-77.99548399999999\t39.932142\tMcConnellsburg borough\tPA\tPennsylvania\tFulton County\t896\t45.9\t16.3\t11.4\t18467\t123958\t0.2113\t17233\tObama\t17233\t0.002542687\t17233.0\n18968\t-78.191542\t40.029962\tValley-Hi borough\tPA\tPennsylvania\tFulton County\t20\t42.5\t7.1\t12.5\t17727\t125000\t0.2113\t16691\tObama\t16691\t5.68e-05\t16691.0\n18969\t-79.92942099999999\t39.878473\tNemacolin CDP\tPA\tPennsylvania\tGreene County\t974\t36.1\t8.9\t12.0\t18099\t43939\t0.4046\t15351\tObama\t15351\t0.002764037\t15351.0\n18970\t-79.99846099999999\t39.947617\tRices Landing borough\tPA\tPennsylvania\tGreene County\t411\t45.0\t17.0\t7.8\t21151\t102500\t0.4046\t15357\tObama\t15357\t0.001166344\t15357.0\n18971\t-80.044049\t39.974383\tClarksville borough\tPA\tPennsylvania\tGreene County\t223\t46.8\t13.9\t15.4\t21895\t65000\t0.4046\t15322\tObama\t15322\t0.000632834\t15322.0\n18972\t-80.167912\t39.900791999999996\tMorrisville CDP\tPA\tPennsylvania\tGreene County\t1349\t34.5\t12.7\t7.1\t18910\t137500\t0.4046\t15370\tObama\t15370\t0.0038282190000000003\t15370.0\n18973\t-80.18566899999999\t39.898308\tWaynesburg borough\tPA\tPennsylvania\tGreene County\t4160\t32.1\t24.9\t12.1\t23022\t106421\t0.4046\t15370\tObama\t15370\t0.011805332\t15370.0\n18974\t-80.057501\t39.930689\tJefferson borough\tPA\tPennsylvania\tGreene County\t321\t46.0\t17.8\t7.4\t20656\t92500\t0.4046\t15344\tObama\t15344\t0.00091094\t15344.0\n18975\t-79.96819\t39.890097\tFairdale CDP\tPA\tPennsylvania\tGreene County\t1893\t46.8\t11.8\t14.6\t20730\t90395\t0.4046\t15320\tObama\t15320\t0.005371994000000001\t15320.0\n18976\t-79.91280400000001\t39.791874\tGreensboro borough\tPA\tPennsylvania\tGreene County\t275\t42.1\t10.8\t10.6\t16334\t63889\t0.4046\t15460\tObama\t15460\t0.000780401\t15460.0\n18977\t-79.974476\t39.897673\tCarmichaels borough\tPA\tPennsylvania\tGreene County\t520\t44.7\t21.2\t10.0\t24909\t95192\t0.4046\t15320\tObama\t15320\t0.001475666\t15320.0\n18978\t-77.893023\t40.24289\tOrbisonia borough\tPA\tPennsylvania\tHuntingdon County\t387\t45.6\t13.4\t11.9\t18081\t92083\t0.3067\t17249\tObama\t17249\t0.001098236\t17249.0\n18979\t-78.195538\t40.647165\tBirmingham borough\tPA\tPennsylvania\tHuntingdon County\t156\t42.1\t26.9\t7.3\t21497\t169643\t0.3067\t16686\tObama\t16686\t0.00044269999999999997\t16686.0\n18980\t-78.051935\t40.572855\tPetersburg borough\tPA\tPennsylvania\tHuntingdon County\t434\t40.4\t13.3\t8.8\t18009\t110938\t0.3067\t16611\tObama\t16611\t0.001231614\t16611.0\n18981\t-77.88242\t40.384289\tMount Union borough\tPA\tPennsylvania\tHuntingdon County\t2507\t40.5\t13.6\t12.4\t17781\t80000\t0.3067\t17066\tObama\t17066\t0.007114415\t17066.0\n18982\t-78.17611\t40.203914000000005\tDudley borough\tPA\tPennsylvania\tHuntingdon County\t183\t40.8\t7.0\t10.3\t16499\t96000\t0.3067\t16634\tObama\t16634\t0.000519321\t16634.0\n18983\t-77.92936800000001\t40.437525\tMill Creek borough\tPA\tPennsylvania\tHuntingdon County\t362\t36.2\t9.1\t9.9\t16713\t100781\t0.3067\t17060\tObama\t17060\t0.001027291\t17060.0\n18984\t-78.00960699999999\t40.499196000000005\tHuntingdon borough\tPA\tPennsylvania\tHuntingdon County\t6674\t34.0\t28.8\t8.7\t21636\t115295\t0.3067\t16652\tObama\t16652\t0.018939611999999998\t16652.0\n18985\t-78.007082\t40.211117\tSaltillo borough\tPA\tPennsylvania\tHuntingdon County\t325\t40.8\t11.9\t8.2\t17738\t95500\t0.3067\t17253\tObama\t17253\t0.000922292\t17253.0\n18986\t-77.98178\t40.19723\tThree Springs borough\tPA\tPennsylvania\tHuntingdon County\t421\t41.0\t11.9\t7.8\t17764\t95714\t0.3067\t17264\tObama\t17264\t0.001194722\t17264.0\n18987\t-78.099786\t40.558301\tAlexandria borough\tPA\tPennsylvania\tHuntingdon County\t381\t42.6\t20.8\t8.5\t21252\t112500\t0.3067\t16611\tObama\t16611\t0.0010812089999999999\t16611.0\n18988\t-78.16991800000001\t40.38316\tMarklesburg borough\tPA\tPennsylvania\tHuntingdon County\t199\t44.2\t14.4\t7.3\t19713\t137500\t0.3067\t166HH\tObama\t166HH\t0.000564726\t0.0\n18989\t-77.866281\t40.179749\tShade Gap borough\tPA\tPennsylvania\tHuntingdon County\t93\t40.7\t9.1\t10.4\t19185\t122500\t0.3067\t17255\tObama\t17255\t0.000263917\t17255.0\n18990\t-77.939842\t40.393165\tMapleton borough\tPA\tPennsylvania\tHuntingdon County\t439\t44.0\t5.3\t9.9\t20718\t62619\t0.3067\t17060\tObama\t17060\t0.001245803\t17060.0\n18991\t-78.140975\t40.200914000000004\tBroad Top City borough\tPA\tPennsylvania\tHuntingdon County\t367\t41.1\t7.4\t9.8\t16454\t99091\t0.3067\t16621\tObama\t16621\t0.00104148\t16621.0\n18992\t-77.899703\t40.24088\tRockhill Furnace borough\tPA\tPennsylvania\tHuntingdon County\t376\t45.5\t13.2\t11.7\t18125\t90000\t0.3067\t17249\tObama\t17249\t0.00106702\t17249.0\n18993\t-78.028136\t40.294654\tCassville borough\tPA\tPennsylvania\tHuntingdon County\t145\t40.7\t9.9\t6.8\t17591\t127500\t0.3067\t16623\tObama\t16623\t0.000411484\t16623.0\n18994\t-77.876698\t40.297724\tShirleysburg borough\tPA\tPennsylvania\tHuntingdon County\t137\t45.9\t6.0\t7.8\t17613\t95000\t0.3067\t17260\tObama\t17260\t0.000388781\t17260.0\n18995\t-78.20039\t40.211164000000004\tCoalmont borough\tPA\tPennsylvania\tHuntingdon County\t122\t40.8\t7.1\t10.3\t16504\t102778\t0.3067\t16634\tObama\t16634\t0.000346214\t16634.0\n18996\t-79.17116700000001\t40.870255\tSmicksburg borough\tPA\tPennsylvania\tIndiana County\t46\t20.0\t10.0\t7.1\t9423\t95000\t0.3985\t16256\tObama\t16256\t0.00013054\t16256.0\n18997\t-78.93879100000001\t40.715456\tCommodore CDP\tPA\tPennsylvania\tIndiana County\t335\t40.0\t10.2\t8.6\t13562\t55682\t0.3985\t15729\tObama\t15729\t0.00095067\t15729.0\n18998\t-79.179502\t40.792511\tPlumville borough\tPA\tPennsylvania\tIndiana County\t332\t37.9\t10.4\t12.2\t15066\t90000\t0.3985\t16246\tObama\t16246\t0.0009421560000000001\t16246.0\n18999\t-79.04720400000001\t40.770540999999994\tMarion Center borough\tPA\tPennsylvania\tIndiana County\t478\t38.8\t15.6\t9.7\t14309\t105625\t0.3985\t15759\tObama\t15759\t0.001356478\t15759.0\n19000\t-78.935436\t40.899046000000006\tRossiter CDP\tPA\tPennsylvania\tIndiana County\t743\t46.4\t7.9\t6.4\t18502\t69118\t0.3985\t15772\tObama\t15772\t0.0021085\t15772.0\n19001\t-79.010375\t40.715485\tDicksonville CDP\tPA\tPennsylvania\tIndiana County\t438\t41.7\t13.6\t9.6\t15174\t106944\t0.3985\t15734\tObama\t15734\t0.001242965\t15734.0\n19002\t-78.909228\t40.632243\tHeilwood CDP\tPA\tPennsylvania\tIndiana County\t764\t42.9\t8.5\t13.2\t15699\t55208\t0.3985\t15745\tObama\t15745\t0.002168095\t15745.0\n19003\t-79.155212\t40.622005\tIndiana borough\tPA\tPennsylvania\tIndiana County\t15106\t22.9\t43.0\t11.7\t16845\t136047\t0.3985\t15701\tObama\t15701\t0.042868110999999993\t15701.0\n19004\t-79.15984300000001\t40.540409000000004\tHomer City borough\tPA\tPennsylvania\tIndiana County\t1813\t44.5\t23.1\t8.6\t21326\t106288\t0.3985\t15748\tObama\t15748\t0.005144968\t15748.0\n19005\t-79.30154\t40.656943\tShelocta borough\tPA\tPennsylvania\tIndiana County\t123\t40.6\t17.0\t10.0\t19695\t110417\t0.3985\t15774\tObama\t15774\t0.000349052\t15774.0\n19006\t-79.013288\t40.668526\tClymer borough\tPA\tPennsylvania\tIndiana County\t1467\t41.8\t19.7\t12.4\t20412\t69821\t0.3985\t15728\tObama\t15728\t0.004163082\t15728.0\n19007\t-79.188419\t40.471593\tBlack Lick CDP\tPA\tPennsylvania\tIndiana County\t1383\t45.1\t8.6\t13.1\t19046\t96964\t0.3985\t15716\tObama\t15716\t0.003924705\t15716.0\n19008\t-79.16454499999999\t40.678104\tErnest borough\tPA\tPennsylvania\tIndiana County\t480\t42.2\t11.6\t14.5\t18600\t78889\t0.3985\t15739\tObama\t15739\t0.001362154\t15739.0\n19009\t-79.155838\t40.555993\tLucerne Mines CDP\tPA\tPennsylvania\tIndiana County\t920\t45.1\t11.3\t12.5\t21968\t98704\t0.3985\t15754\tObama\t15754\t0.002610795\t15754.0\n19010\t-79.44775200000001\t40.485099\tSaltsburg borough\tPA\tPennsylvania\tIndiana County\t909\t40.5\t17.2\t6.3\t22053\t98235\t0.3985\t15681\tObama\t15681\t0.002579579\t15681.0\n19011\t-79.145647\t40.640378999999996\tChevy Chase Heights CDP\tPA\tPennsylvania\tIndiana County\t1527\t44.9\t36.2\t8.8\t23945\t117188\t0.3985\t15701\tObama\t15701\t0.004333351\t15701.0\n19012\t-79.192746\t40.681075\tCreekside borough\tPA\tPennsylvania\tIndiana County\t314\t41.1\t16.2\t8.6\t18839\t99444\t0.3985\t15739\tObama\t15739\t0.0008910760000000001\t15739.0\n19013\t-79.259928\t40.432465\tBlairsville borough\tPA\tPennsylvania\tIndiana County\t3424\t44.0\t19.8\t7.3\t22589\t101881\t0.3985\t15717\tObama\t15717\t0.009716696\t15717.0\n19014\t-78.82956800000001\t40.819720000000004\tGlen Campbell borough\tPA\tPennsylvania\tIndiana County\t293\t45.5\t8.2\t14.4\t15045\t75000\t0.3985\t15742\tObama\t15742\t0.000831481\t15742.0\n19015\t-79.295229\t40.565201\tJacksonville CDP\tPA\tPennsylvania\tIndiana County\t649\t44.0\t15.2\t12.2\t18714\t88684\t0.3985\t15756\tObama\t15756\t0.001841745\t15756.0\n19016\t-79.032347\t40.453625\tArmagh borough\tPA\tPennsylvania\tIndiana County\t126\t45.8\t9.2\t6.7\t19434\t106250\t0.3985\t15920\tObama\t15920\t0.000357565\t15920.0\n19017\t-78.80843399999999\t40.725159000000005\tCherry Tree borough\tPA\tPennsylvania\tIndiana County\t458\t45.3\t15.3\t10.2\t16744\t76818\t0.3985\t15724\tObama\t15724\t0.001299722\t15724.0\n19018\t-79.13946700000001\t41.02459\tWorthville borough\tPA\tPennsylvania\tJefferson County\t79\t38.1\t17.0\t7.7\t17901\t95000\t0.2645\t15784\tObama\t15784\t0.000224188\t15784.0\n19019\t-79.082539\t41.161493\tBrookville borough\tPA\tPennsylvania\tJefferson County\t3971\t43.6\t25.0\t9.4\t24050\t112279\t0.2645\t15825\tObama\t15825\t0.011268984\t15825.0\n19020\t-78.97659399999999\t40.943690000000004\tPunxsutawney borough\tPA\tPennsylvania\tJefferson County\t6132\t42.3\t18.6\t13.7\t20790\t89231\t0.2645\t15767\tObama\t15767\t0.017401513\t15767.0\n19021\t-78.887126\t41.09454\tReynoldsville borough\tPA\tPennsylvania\tJefferson County\t2753\t38.1\t12.3\t13.5\t19035\t86071\t0.2645\t15851\tObama\t15851\t0.007812519\t15851.0\n19022\t-78.793018\t41.247023999999996\tBrockway borough\tPA\tPennsylvania\tJefferson County\t2116\t40.9\t17.1\t5.3\t23626\t104074\t0.2645\t15824\tObama\t15824\t0.006004827\t15824.0\n19023\t-78.876194\t40.970197999999996\tBig Run borough\tPA\tPennsylvania\tJefferson County\t551\t39.6\t10.9\t14.1\t17725\t80000\t0.2645\t15715\tObama\t15715\t0.001563639\t15715.0\n19024\t-79.18813399999999\t41.116353000000004\tSummerville borough\tPA\tPennsylvania\tJefferson County\t516\t47.7\t11.3\t8.4\t17585\t83158\t0.2645\t15864\tObama\t15864\t0.001464315\t15864.0\n19025\t-78.79717600000001\t41.142941\tFalls Creek borough\tPA\tPennsylvania\tJefferson County\t947\t43.7\t8.8\t13.0\t18449\t95263\t0.2645\t15840\tObama\t15840\t0.0026874159999999998\t15840.0\n19026\t-79.197979\t40.967534\tTimblin borough\tPA\tPennsylvania\tJefferson County\t152\t43.4\t11.8\t8.5\t16011\t90000\t0.2645\t15778\tObama\t15778\t0.00043134900000000003\t15778.0\n19027\t-79.20290200000001\t41.181328\tCorsica borough\tPA\tPennsylvania\tJefferson County\t363\t41.4\t17.2\t9.1\t19867\t100658\t0.2645\t15829\tObama\t15829\t0.0010301289999999999\t15829.0\n19028\t-78.818714\t41.047499\tSykesville borough\tPA\tPennsylvania\tJefferson County\t1180\t43.5\t7.7\t14.2\t16333\t83721\t0.2645\t15865\tObama\t15865\t0.0033486279999999998\t15865.0\n19029\t-77.11802800000001\t40.684419\tRichfield CDP\tPA\tPennsylvania\tJuniata County\t452\t38.3\t12.8\t6.7\t18186\t145000\t0.2671\t17086\tObama\t17086\t0.001282695\t17086.0\n19030\t-77.394947\t40.571317\tMifflintown borough\tPA\tPennsylvania\tJuniata County\t883\t35.2\t16.7\t4.3\t20312\t102381\t0.2671\t17059\tObama\t17059\t0.002505795\t17059.0\n19031\t-77.606154\t40.370175\tEast Rutherford CDP\tPA\tPennsylvania\tJuniata County\t183\t41.3\t6.2\t7.5\t17458\t120313\t0.2671\t17021\tObama\t17021\t0.000519321\t17021.0\n19032\t-77.27560600000001\t40.639396000000005\tMcAlisterville CDP\tPA\tPennsylvania\tJuniata County\t852\t38.7\t12.9\t4.6\t18743\t146934\t0.2671\t17049\tObama\t17049\t0.002417823\t17049.0\n19033\t-77.357214\t40.542977\tMexico CDP\tPA\tPennsylvania\tJuniata County\t277\t38.2\t10.3\t5.7\t18805\t144643\t0.2671\t17059\tObama\t17059\t0.000786076\t17059.0\n19034\t-77.389402\t40.534185\tPort Royal borough\tPA\tPennsylvania\tJuniata County\t1055\t38.1\t9.9\t6.9\t22649\t126389\t0.2671\t17082\tObama\t17082\t0.0029939\t17082.0\n19035\t-77.404436\t40.56843\tMifflin borough\tPA\tPennsylvania\tJuniata County\t633\t42.1\t12.6\t6.3\t18551\t131667\t0.2671\t17059\tObama\t17059\t0.00179634\t17059.0\n19036\t-77.236164\t40.565708\tThompsontown borough\tPA\tPennsylvania\tJuniata County\t740\t42.5\t13.8\t5.8\t19159\t116250\t0.2671\t17094\tObama\t17094\t0.002099987\t17094.0\n19037\t-75.636023\t41.467644\tDickson City borough\tPA\tPennsylvania\tLackawanna County\t6029\t44.4\t18.5\t10.8\t21993\t135710\t0.6309\t18519\tObama\t18519\t0.017109218\t18519.0\n19038\t-75.575479\t41.450677\tOlyphant borough\tPA\tPennsylvania\tLackawanna County\t4980\t44.6\t21.4\t7.2\t24644\t147545\t0.6309\t18434\tObama\t18434\t0.014132344\t18434.0\n19039\t-75.470011\t41.631352\tVandling borough\tPA\tPennsylvania\tLackawanna County\t704\t44.9\t18.1\t7.3\t20367\t137037\t0.6309\t18421\tObama\t18421\t0.001997825\t18421.0\n19040\t-75.500884\t41.434929\tMount Cobb CDP\tPA\tPennsylvania\tLackawanna County\t2347\t42.9\t31.5\t7.1\t25574\t213435\t0.6309\t18434\tObama\t18434\t0.006660364\t18434.0\n19041\t-75.71465500000001\t41.395748\tTaylor borough\tPA\tPennsylvania\tLackawanna County\t6126\t45.0\t11.5\t8.1\t22236\t134487\t0.6309\t18517\tObama\t18517\t0.017384486\t18517.0\n19042\t-75.608429\t41.415492\tDunmore borough\tPA\tPennsylvania\tLackawanna County\t13379\t44.2\t28.6\t8.2\t25425\t162239\t0.6309\t18512\tObama\t18512\t0.037967196\t18512.0\n19043\t-75.70263800000001\t41.358441\tMoosic borough\tPA\tPennsylvania\tLackawanna County\t5800\t47.9\t24.4\t7.6\t25750\t147663\t0.6309\t18507\tObama\t18507\t0.016459357\t18507.0\n19044\t-75.593037\t41.438117999999996\tThroop borough\tPA\tPennsylvania\tLackawanna County\t3932\t44.3\t15.5\t9.4\t23001\t127841\t0.6309\t18512\tObama\t18512\t0.011158309\t18512.0\n19045\t-75.530114\t41.341767\tMoscow borough\tPA\tPennsylvania\tLackawanna County\t1844\t40.9\t34.7\t7.4\t24241\t221221\t0.6309\t18444\tObama\t18444\t0.00523294\t18444.0\n19046\t-75.706299\t41.490621999999995\tClarks Summit borough\tPA\tPennsylvania\tLackawanna County\t5022\t47.9\t49.1\t6.8\t29979\t194444\t0.6309\t18411\tObama\t18411\t0.014251533\t18411.0\n19047\t-75.505643\t41.571414000000004\tCarbondale city\tPA\tPennsylvania\tLackawanna County\t9419\t41.7\t16.4\t11.3\t19732\t107301\t0.6309\t18407\tObama\t18407\t0.026729428\t18407.0\n19048\t-75.60130699999999\t41.486259999999994\tBlakely borough\tPA\tPennsylvania\tLackawanna County\t6718\t47.1\t24.9\t8.8\t23987\t148978\t0.6309\t18447\tObama\t18447\t0.019064476\t18447.0\n19049\t-75.531418\t41.539333\tMayfield borough\tPA\tPennsylvania\tLackawanna County\t1696\t45.5\t11.5\t10.7\t20831\t136653\t0.6309\t18433\tObama\t18433\t0.004812943\t18433.0\n19050\t-75.69490400000001\t41.500965\tClarks Green borough\tPA\tPennsylvania\tLackawanna County\t1859\t39.1\t59.4\t7.7\t36298\t272472\t0.6309\t18411\tObama\t18411\t0.005275508000000001\t18411.0\n19051\t-75.545649\t41.508081\tArchbald borough\tPA\tPennsylvania\tLackawanna County\t6222\t43.3\t25.3\t7.7\t25694\t149129\t0.6309\t18403\tObama\t18403\t0.017656917\t18403.0\n19052\t-75.545552\t41.527356\tJermyn borough\tPA\tPennsylvania\tLackawanna County\t2164\t43.0\t18.2\t14.3\t22522\t132824\t0.6309\t18433\tObama\t18433\t0.0061410430000000005\t18433.0\n19053\t-75.73875600000001\t41.538024\tDalton borough\tPA\tPennsylvania\tLackawanna County\t1235\t41.8\t47.3\t6.7\t28549\t197273\t0.6309\t18414\tObama\t18414\t0.003504708\t18414.0\n19054\t-75.74104100000001\t41.370487\tOld Forge borough\tPA\tPennsylvania\tLackawanna County\t8470\t45.2\t20.7\t10.8\t25400\t147443\t0.6309\t18518\tObama\t18518\t0.024036337\t18518.0\n19055\t-75.737938\t41.509785\tGlenburn CDP\tPA\tPennsylvania\tLackawanna County\t1241\t46.6\t45.9\t4.6\t34499\t213492\t0.6309\t18414\tObama\t18414\t0.003521735\t18414.0\n19056\t-75.664876\t41.404444\tScranton city\tPA\tPennsylvania\tLackawanna County\t73857\t41.0\t19.7\t10.3\t21617\t126355\t0.6309\t18503\tObama\t18503\t0.20959288199999998\t18503.0\n19057\t-75.548105\t41.461981\tJessup borough\tPA\tPennsylvania\tLackawanna County\t4622\t44.1\t22.5\t12.0\t23916\t140078\t0.6309\t18434\tObama\t18434\t0.013116405\t18434.0\n19058\t-76.57909000000001\t40.079114000000004\tMaytown CDP\tPA\tPennsylvania\tLancaster County\t3561\t36.0\t24.7\t10.2\t25774\t175753\t0.3976\t17547\tObama\t17547\t0.010105478000000001\t17547.0\n19059\t-76.185192\t39.983004\tStrasburg borough\tPA\tPennsylvania\tLancaster County\t2871\t37.7\t27.1\t10.1\t25307\t206281\t0.3976\t17579\tObama\t17579\t0.008147382\t17579.0\n19060\t-76.286313\t40.222555\tBrickerville CDP\tPA\tPennsylvania\tLancaster County\t1355\t38.6\t16.5\t7.5\t24250\t199051\t0.3976\t17543\tObama\t17543\t0.0038452459999999996\t17543.0\n19061\t-76.35096\t40.100614\tEast Petersburg borough\tPA\tPennsylvania\tLancaster County\t4432\t42.1\t31.5\t6.7\t28480\t178429\t0.3976\t17520\tObama\t17520\t0.012577218999999999\t17520.0\n19062\t-76.021479\t39.98917\tGap CDP\tPA\tPennsylvania\tLancaster County\t1851\t37.1\t18.1\t8.4\t21995\t230046\t0.3976\t17535\tObama\t17535\t0.005252805\t17535.0\n19063\t-76.189021\t40.091543\tLeacock-Leola-Bareville CDP\tPA\tPennsylvania\tLancaster County\t7126\t36.2\t23.0\t7.9\t24799\t219583\t0.3976\t17540\tObama\t17540\t0.020222306000000002\t17540.0\n19064\t-76.50752\t40.110518\tMount Joy borough\tPA\tPennsylvania\tLancaster County\t7115\t37.7\t19.6\t7.2\t27712\t167386\t0.3976\t17552\tObama\t17552\t0.02019109\t17552.0\n19065\t-76.24725699999999\t40.153223\tRothsville CDP\tPA\tPennsylvania\tLancaster County\t3075\t37.4\t23.9\t5.4\t24092\t187850\t0.3976\t17508\tObama\t17508\t0.008726297\t17508.0\n19066\t-76.046373\t40.249247\tAdamstown borough\tPA\tPennsylvania\tLancaster County\t1422\t39.0\t19.1\t8.8\t25560\t172403\t0.3976\t19501\tObama\t19501\t0.00403538\t19501.0\n19067\t-76.573296\t40.125545\tRheems CDP\tPA\tPennsylvania\tLancaster County\t1719\t41.3\t23.9\t4.8\t26734\t210473\t0.3976\t17570\tObama\t17570\t0.004878213\t17570.0\n19068\t-76.117885\t40.211209999999994\tReamstown CDP\tPA\tPennsylvania\tLancaster County\t3636\t40.2\t17.0\t5.8\t22529\t176591\t0.3976\t17517\tObama\t17517\t0.010318314\t17517.0\n19069\t-76.300538\t40.041667\tLancaster city\tPA\tPennsylvania\tLancaster County\t58184\t31.1\t17.2\t14.6\t18373\t114758\t0.3976\t17602\tObama\t17602\t0.165115727\t17602.0\n19070\t-76.495313\t40.033977\tColumbia borough\tPA\tPennsylvania\tLancaster County\t10325\t38.0\t10.5\t12.4\t22746\t118964\t0.3976\t17512\tObama\t17512\t0.029300492999999997\t17512.0\n19071\t-76.161537\t39.895641999999995\tQuarryville borough\tPA\tPennsylvania\tLancaster County\t2246\t35.6\t15.6\t7.0\t26771\t190843\t0.3976\t17566\tObama\t17566\t0.006373744000000001\t17566.0\n19072\t-76.05090899999999\t40.159174\tTerre Hill borough\tPA\tPennsylvania\tLancaster County\t1349\t32.2\t10.1\t5.5\t19919\t200362\t0.3976\t17581\tObama\t17581\t0.0038282190000000003\t17581.0\n19073\t-75.996976\t39.954552\tChristiana borough\tPA\tPennsylvania\tLancaster County\t1190\t40.3\t16.3\t8.2\t22871\t181653\t0.3976\t19310\tObama\t19310\t0.0033770059999999997\t19310.0\n19074\t-76.181392\t40.180944000000004\tEphrata borough\tPA\tPennsylvania\tLancaster County\t13634\t37.6\t16.8\t8.3\t25823\t163638\t0.3976\t17522\tObama\t17522\t0.03869084\t17522.0\n19075\t-76.43415\t40.040424\tMountville borough\tPA\tPennsylvania\tLancaster County\t2845\t43.3\t21.3\t11.1\t28698\t172110\t0.3976\t17554\tObama\t17554\t0.008073598000000001\t17554.0\n19076\t-76.20326899999999\t40.15791\tAkron borough\tPA\tPennsylvania\tLancaster County\t4057\t41.9\t25.6\t5.5\t27236\t178549\t0.3976\t17501\tObama\t17501\t0.011513036\t17501.0\n19077\t-76.2705\t39.980833000000004\tWillow Street CDP\tPA\tPennsylvania\tLancaster County\t7759\t56.2\t31.6\t8.2\t30266\t212792\t0.3976\t17584\tObama\t17584\t0.022018646\t17584.0\n19078\t-76.551067\t40.057315\tMarietta borough\tPA\tPennsylvania\tLancaster County\t3159\t38.4\t17.1\t9.6\t23771\t140084\t0.3976\t17547\tObama\t17547\t0.008964674\t17547.0\n19079\t-76.304407\t40.154053000000005\tLititz borough\tPA\tPennsylvania\tLancaster County\t9435\t42.5\t28.2\t5.7\t26784\t168780\t0.3976\t17543\tObama\t17543\t0.026774832999999998\t17543.0\n19080\t-76.39644799999999\t40.163021\tManheim borough\tPA\tPennsylvania\tLancaster County\t4783\t40.0\t19.9\t8.3\t26681\t164624\t0.3976\t17545\tObama\t17545\t0.013573294\t17545.0\n19081\t-76.13936700000001\t40.232372\tDenver borough\tPA\tPennsylvania\tLancaster County\t3513\t36.3\t19.2\t8.7\t26811\t165556\t0.3976\t17517\tObama\t17517\t0.009969262\t17517.0\n19082\t-76.418998\t40.091826\tSalunga-Landisville CDP\tPA\tPennsylvania\tLancaster County\t5014\t43.4\t37.8\t8.3\t29684\t222837\t0.3976\t17538\tObama\t17538\t0.01422883\t17538.0\n19083\t-76.090249\t40.101031\tNew Holland borough\tPA\tPennsylvania\tLancaster County\t5316\t40.8\t22.6\t7.2\t27067\t187952\t0.3976\t17557\tObama\t17557\t0.015085852\t17557.0\n19084\t-76.352312\t40.004455\tMillersville borough\tPA\tPennsylvania\tLancaster County\t8106\t32.6\t36.4\t8.5\t22742\t184325\t0.3976\t17551\tObama\t17551\t0.02300337\t17551.0\n19085\t-76.59904\t40.153332\tElizabethtown borough\tPA\tPennsylvania\tLancaster County\t11858\t35.9\t31.9\t6.6\t25005\t177721\t0.3976\t17022\tObama\t17022\t0.033650871\t17022.0\n19086\t-76.124222\t40.006024\tParadise CDP\tPA\tPennsylvania\tLancaster County\t1050\t37.8\t14.5\t5.9\t19958\t188839\t0.3976\t17572\tObama\t17572\t0.002979711\t17572.0\n19087\t-80.33886\t40.886887\tWampum borough\tPA\tPennsylvania\tLawrence County\t645\t45.5\t8.8\t10.7\t18305\t108125\t0.4486\t16157\tObama\t16157\t0.001830394\t16157.0\n19088\t-80.487685\t40.975347\tBessemer borough\tPA\tPennsylvania\tLawrence County\t1173\t44.6\t14.5\t9.7\t22633\t114773\t0.4486\t16112\tObama\t16112\t0.0033287629999999998\t16112.0\n19089\t-80.34572299999999\t40.974903000000005\tSouth New Castle borough\tPA\tPennsylvania\tLawrence County\t780\t43.3\t5.5\t9.3\t16467\t77115\t0.4486\t16101\tObama\t16101\t0.0022135\t16101.0\n19090\t-80.33204\t41.117340999999996\tNew Wilmington borough\tPA\tPennsylvania\tLawrence County\t2363\t23.6\t60.2\t8.6\t18269\t189773\t0.4486\t16142\tObama\t16142\t0.006705769\t16142.0\n19091\t-80.259209\t41.113213\tVolant borough\tPA\tPennsylvania\tLawrence County\t107\t43.1\t21.8\t7.8\t17959\t135714\t0.4486\t16156\tObama\t16156\t0.000303647\t16156.0\n19092\t-80.45661700000001\t40.856004999999996\tEnon Valley borough\tPA\tPennsylvania\tLawrence County\t368\t40.3\t14.7\t13.3\t18206\t93333\t0.4486\t16120\tObama\t16120\t0.001044318\t16120.0\n19093\t-80.26218\t40.861994\tEllport borough\tPA\tPennsylvania\tLawrence County\t1122\t44.2\t11.9\t9.4\t19877\t124085\t0.4486\t16117\tObama\t16117\t0.003184034\t16117.0\n19094\t-80.379313\t41.011182\tOakwood CDP\tPA\tPennsylvania\tLawrence County\t2184\t46.9\t19.6\t11.6\t22731\t101012\t0.4486\t16102\tObama\t16102\t0.006197799\t16102.0\n19095\t-80.28238\t40.86385\tEllwood City borough\tPA\tPennsylvania\tLawrence County\t8243\t42.1\t19.4\t10.8\t20870\t119616\t0.4486\t16117\tObama\t16117\t0.023392151\t16117.0\n19096\t-80.356639\t41.022177\tNew Castle Northwest CDP\tPA\tPennsylvania\tLawrence County\t1426\t53.8\t29.2\t10.5\t24330\t134470\t0.4486\t16105\tObama\t16105\t0.004046732\t16105.0\n19097\t-80.497472\t40.930246999999994\tS.N.P.J. borough\tPA\tPennsylvania\tLawrence County\t0\t0.0\t0.0\t0.0\t0\t0\t0.4486\t16112\tObama\t16112\t0.0\t16112.0\n19098\t-80.346014\t40.995597\tNew Castle city\tPA\tPennsylvania\tLawrence County\t24271\t40.7\t15.2\t15.3\t18264\t70686\t0.4486\t16101\tObama\t16101\t0.068876733\t16101.0\n19099\t-80.369845\t40.87715\tNew Beaver borough\tPA\tPennsylvania\tLawrence County\t1589\t43.9\t10.4\t9.7\t19124\t97000\t0.4486\t16157\tObama\t16157\t0.0045092959999999994\t16157.0\n19100\t-80.367073\t40.991521999999996\tOakland CDP\tPA\tPennsylvania\tLawrence County\t1539\t46.8\t13.5\t9.9\t24323\t96395\t0.4486\t16102\tObama\t16102\t0.004367405\t16102.0\n19101\t-76.381739\t40.342535\tAvon CDP\tPA\tPennsylvania\tLebanon County\t3022\t42.8\t11.8\t6.0\t21918\t143871\t0.3517\t17046\tObama\t17046\t0.008575892\t17046.0\n19102\t-76.480643\t40.41294\tJonestown borough\tPA\tPennsylvania\tLebanon County\t1037\t41.7\t13.9\t7.2\t21201\t168636\t0.3517\t17038\tObama\t17038\t0.002942819\t17038.0\n19103\t-76.47144899999999\t40.245427\tMount Gretna borough\tPA\tPennsylvania\tLebanon County\t275\t61.0\t41.0\t3.1\t30458\t155000\t0.3517\t17064\tObama\t17064\t0.000780401\t17064.0\n19104\t-76.466454\t40.248758\tMount Gretna Heights CDP\tPA\tPennsylvania\tLebanon County\t408\t60.9\t41.3\t3.1\t30538\t155833\t0.3517\t17064\tObama\t17064\t0.001157831\t17064.0\n19105\t-76.584634\t40.275969\tCampbelltown CDP\tPA\tPennsylvania\tLebanon County\t3108\t40.1\t32.2\t7.8\t27064\t201958\t0.3517\t17010\tObama\t17010\t0.008819945\t17010.0\n19106\t-76.507316\t40.33234\tAnnville CDP\tPA\tPennsylvania\tLebanon County\t4919\t29.1\t20.8\t6.1\t22318\t139874\t0.3517\t17003\tObama\t17003\t0.013959237\t17003.0\n19107\t-76.293749\t40.296892\tSchaefferstown CDP\tPA\tPennsylvania\tLebanon County\t1119\t41.3\t18.0\t3.6\t25845\t170270\t0.3517\t17088\tObama\t17088\t0.0031755209999999997\t17088.0\n19108\t-76.421738\t40.361367\tSand Hill CDP\tPA\tPennsylvania\tLebanon County\t2328\t45.6\t13.2\t7.2\t22361\t174314\t0.3517\t17046\tObama\t17046\t0.006606445\t17046.0\n19109\t-76.422728\t40.341295\tLebanon city\tPA\tPennsylvania\tLebanon County\t25164\t38.0\t11.2\t10.2\t19814\t103723\t0.3517\t17046\tObama\t17046\t0.071410906\t17046.0\n19110\t-76.482548\t40.246296\tTimber Hills CDP\tPA\tPennsylvania\tLebanon County\t375\t42.9\t25.5\t4.3\t24762\t148864\t0.3517\t17064\tObama\t17064\t0.001064183\t17064.0\n19111\t-76.476815\t40.338623\tCleona borough\tPA\tPennsylvania\tLebanon County\t2154\t42.3\t20.0\t5.2\t26020\t153436\t0.3517\t17046\tObama\t17046\t0.006112665\t17046.0\n19112\t-76.305701\t40.372095\tMyerstown borough\tPA\tPennsylvania\tLebanon County\t3186\t40.6\t15.0\t6.7\t25513\t137623\t0.3517\t17067\tObama\t17067\t0.009041295\t17067.0\n19113\t-76.437732\t40.444312\tFredericksburg CDP\tPA\tPennsylvania\tLebanon County\t1155\t40.3\t12.3\t4.7\t19125\t156373\t0.3517\t17026\tObama\t17026\t0.003277682\t17026.0\n19114\t-76.211683\t40.351363\tNewmanstown CDP\tPA\tPennsylvania\tLebanon County\t1706\t39.0\t10.6\t8.9\t27771\t142500\t0.3517\t19567\tObama\t19567\t0.004841321\t19567.0\n19115\t-76.407638\t40.265764000000004\tCornwall borough\tPA\tPennsylvania\tLebanon County\t4025\t50.5\t42.1\t5.0\t31081\t225275\t0.3517\t17016\tObama\t17016\t0.011422226\t17016.0\n19116\t-76.597571\t40.442884\tFort Indiantown Gap CDP\tPA\tPennsylvania\tLebanon County\t258\t38.4\t14.5\t4.3\t24819\t203846\t0.3517\t17028\tObama\t17028\t0.000732158\t17028.0\n19117\t-76.406352\t40.327765\tLebanon South CDP\tPA\tPennsylvania\tLebanon County\t2299\t49.6\t23.5\t4.4\t28892\t154063\t0.3517\t17042\tObama\t17042\t0.006524149\t17042.0\n19118\t-76.594432\t40.309733\tPalmyra borough\tPA\tPennsylvania\tLebanon County\t7193\t40.2\t24.9\t7.4\t27992\t150821\t0.3517\t17078\tObama\t17078\t0.02041244\t17078.0\n19119\t-76.447973\t40.336876000000004\tPleasant Hill CDP\tPA\tPennsylvania\tLebanon County\t2568\t35.5\t12.9\t7.8\t22143\t121225\t0.3517\t17042\tObama\t17042\t0.007287521999999999\t17042.0\n19120\t-76.435244\t40.279416999999995\tQuentin CDP\tPA\tPennsylvania\tLebanon County\t563\t41.5\t29.8\t4.6\t27834\t168939\t0.3517\t17083\tObama\t17083\t0.0015976929999999999\t17083.0\n19121\t-76.256722\t40.357476\tRichland borough\tPA\tPennsylvania\tLebanon County\t1739\t41.0\t13.2\t6.6\t22194\t148906\t0.3517\t17087\tObama\t17087\t0.004934969\t17087.0\n19122\t-75.39151700000001\t40.510193\tCoopersburg borough\tPA\tPennsylvania\tLehigh County\t2628\t44.0\t26.9\t10.2\t23518\t224038\t0.5324\t18036\tObama\t18036\t0.007457791\t18036.0\n19123\t-75.483743\t40.630762\tFullerton CDP\tPA\tPennsylvania\tLehigh County\t15012\t41.7\t24.0\t10.7\t28183\t189681\t0.5324\t18052\tObama\t18052\t0.04260135599999999\t18052.0\n19124\t-75.600163\t40.509045\tAlburtis borough\tPA\tPennsylvania\tLehigh County\t2569\t35.8\t22.5\t5.4\t24375\t165994\t0.5324\t18011\tObama\t18011\t0.00729036\t18011.0\n19125\t-75.585359\t40.534909999999996\tAncient Oaks CDP\tPA\tPennsylvania\tLehigh County\t4441\t43.2\t41.3\t9.1\t33923\t217679\t0.5324\t18087\tObama\t18087\t0.012602759\t18087.0\n19126\t-75.39616600000001\t40.602748999999996\tFountain Hill borough\tPA\tPennsylvania\tLehigh County\t4826\t42.9\t22.7\t15.5\t26220\t136247\t0.5324\t180HH\tObama\t180HH\t0.01369532\t0.0\n19127\t-75.49519000000001\t40.658471\tHokendauqua CDP\tPA\tPennsylvania\tLehigh County\t3470\t45.6\t18.4\t6.0\t26812\t181612\t0.5324\t18052\tObama\t18052\t0.009847236\t18052.0\n19128\t-75.619739\t40.676445\tSchnecksville CDP\tPA\tPennsylvania\tLehigh County\t2199\t46.3\t42.2\t5.4\t35973\t262664\t0.5324\t18078\tObama\t18078\t0.006240366\t18078.0\n19129\t-75.497846\t40.535315999999995\tEmmaus borough\tPA\tPennsylvania\tLehigh County\t11552\t42.4\t27.2\t7.3\t28793\t185742\t0.5324\t18049\tObama\t18049\t0.032782498\t18049.0\n19130\t-75.554325\t40.516694\tMacungie borough\tPA\tPennsylvania\tLehigh County\t3215\t40.5\t31.5\t8.6\t32226\t190286\t0.5324\t18062\tObama\t18062\t0.009123592\t18062.0\n19131\t-75.46516\t40.652995000000004\tCatasauqua borough\tPA\tPennsylvania\tLehigh County\t6703\t39.8\t14.9\t12.2\t25583\t141943\t0.5324\t18032\tObama\t18032\t0.019021908\t18032.0\n19132\t-75.611729\t40.75392\tSlatington borough\tPA\tPennsylvania\tLehigh County\t4447\t38.3\t12.7\t13.8\t23022\t135139\t0.5324\t18080\tObama\t18080\t0.012619786000000001\t18080.0\n19133\t-75.496031\t40.671033\tCoplay borough\tPA\tPennsylvania\tLehigh County\t3443\t42.9\t14.1\t11.9\t23812\t159444\t0.5324\t18037\tObama\t18037\t0.009770615\t18037.0\n19134\t-75.47561800000001\t40.59621\tAllentown city\tPA\tPennsylvania\tLehigh County\t111176\t35.6\t18.1\t14.9\t20393\t125893\t0.5324\t18101\tObama\t18101\t0.315497492\t18101.0\n19135\t-75.879736\t41.297996000000005\tSwoyersville borough\tPA\tPennsylvania\tLuzerne County\t4917\t46.6\t25.8\t10.3\t22501\t133538\t0.5168\t18709\tObama\t18709\t0.013953562\t18709.0\n19136\t-75.89945300000001\t41.212632\tAshley borough\tPA\tPennsylvania\tLuzerne County\t2834\t43.0\t13.9\t11.8\t22472\t94942\t0.5168\t18706\tObama\t18706\t0.008042381999999999\t18706.0\n19137\t-76.22089799999999\t41.065583000000004\tEast Berwick CDP\tPA\tPennsylvania\tLuzerne County\t1916\t47.7\t23.3\t8.3\t28047\t147483\t0.5168\t18603\tObama\t18603\t0.005437263\t18603.0\n19138\t-75.780236\t41.056465\tWhite Haven borough\tPA\tPennsylvania\tLuzerne County\t1070\t41.8\t17.7\t5.7\t20437\t123397\t0.5168\t18661\tObama\t18661\t0.003036468\t18661.0\n19139\t-76.000085\t41.200347\tNanticoke city\tPA\tPennsylvania\tLuzerne County\t10824\t45.0\t14.0\t12.5\t20546\t108581\t0.5168\t18634\tObama\t18634\t0.030716565\t18634.0\n19140\t-75.949924\t41.187769\tWarrior Run borough\tPA\tPennsylvania\tLuzerne County\t593\t43.4\t7.2\t12.7\t22778\t103750\t0.5168\t18706\tObama\t18706\t0.001682827\t18706.0\n19141\t-75.95806400000001\t41.126858\tMountain Top CDP\tPA\tPennsylvania\tLuzerne County\t16603\t43.3\t29.9\t8.3\t26487\t200719\t0.5168\t18707\tObama\t18707\t0.047116328\t18707.0\n19142\t-76.07797099999999\t41.179639\tGlen Lyon CDP\tPA\tPennsylvania\tLuzerne County\t1816\t40.0\t8.3\t12.7\t20272\t89649\t0.5168\t18617\tObama\t18617\t0.005153481\t18617.0\n19143\t-75.97783199999999\t41.15824\tNuangola borough\tPA\tPennsylvania\tLuzerne County\t703\t45.3\t26.5\t8.7\t23086\t149490\t0.5168\t18634\tObama\t18634\t0.001994988\t18634.0\n19144\t-75.93148599999999\t41.193771999999996\tSugar Notch borough\tPA\tPennsylvania\tLuzerne County\t982\t46.1\t14.2\t10.0\t23867\t114183\t0.5168\t18706\tObama\t18706\t0.0027867390000000003\t18706.0\n19145\t-75.743868\t41.337887\tAvoca borough\tPA\tPennsylvania\tLuzerne County\t2771\t44.0\t17.5\t7.0\t22908\t130716\t0.5168\t18641\tObama\t18641\t0.007863600000000002\t18641.0\n19146\t-75.914502\t41.284974\tCourtdale borough\tPA\tPennsylvania\tLuzerne County\t756\t47.3\t16.3\t8.2\t19775\t134949\t0.5168\t18709\tObama\t18709\t0.0021453920000000003\t18709.0\n19147\t-75.770342\t41.329273\tHughestown borough\tPA\tPennsylvania\tLuzerne County\t1499\t47.3\t23.7\t8.9\t21527\t142995\t0.5168\t18640\tObama\t18640\t0.0042538920000000004\t18640.0\n19148\t-75.775616\t41.115443\tPenn Lake Park borough\tPA\tPennsylvania\tLuzerne County\t359\t48.6\t23.1\t7.5\t27049\t145313\t0.5168\t18661\tObama\t18661\t0.001018777\t18661.0\n19149\t-75.896703\t41.286869\tLuzerne borough\tPA\tPennsylvania\tLuzerne County\t2827\t45.5\t13.1\t8.4\t23582\t108840\t0.5168\t18709\tObama\t18709\t0.008022518000000001\t18709.0\n19150\t-76.03865400000001\t41.362691\tHarveys Lake borough\tPA\tPennsylvania\tLuzerne County\t2933\t43.5\t28.4\t9.6\t25121\t159734\t0.5168\t18618\tObama\t18618\t0.008323325999999999\t18618.0\n19151\t-75.788609\t41.327475\tPittston city\tPA\tPennsylvania\tLuzerne County\t7757\t42.8\t14.8\t9.6\t20073\t120772\t0.5168\t18640\tObama\t18640\t0.022012971\t18640.0\n19152\t-75.932485\t41.263816999999996\tLarksville borough\tPA\tPennsylvania\tLuzerne County\t4460\t43.3\t15.9\t14.7\t23008\t137828\t0.5168\t18651\tObama\t18651\t0.012656678000000001\t18651.0\n19153\t-75.950191\t41.240431\tPlymouth borough\tPA\tPennsylvania\tLuzerne County\t6228\t41.3\t13.3\t11.7\t19982\t92168\t0.5168\t18651\tObama\t18651\t0.017673944\t18651.0\n19154\t-75.90162\t41.277253\tPringle borough\tPA\tPennsylvania\tLuzerne County\t949\t46.3\t13.3\t11.3\t21041\t119776\t0.5168\t18709\tObama\t18709\t0.002693091\t18709.0\n19155\t-75.754984\t41.187866\tBear Creek Village borough\tPA\tPennsylvania\tLuzerne County\t293\t52.0\t63.3\t5.0\t37167\t372222\t0.5168\t18602\tObama\t18602\t0.000831481\t18602.0\n19156\t-75.907026\t41.261009\tEdwardsville borough\tPA\tPennsylvania\tLuzerne County\t4781\t41.1\t14.4\t11.7\t19502\t112712\t0.5168\t18704\tObama\t18704\t0.013567618\t18704.0\n19157\t-75.79493199999999\t41.289771\tLaflin borough\tPA\tPennsylvania\tLuzerne County\t1468\t47.4\t43.5\t6.8\t33100\t215169\t0.5168\t18640\tObama\t18640\t0.00416592\t18640.0\n19158\t-76.003311\t41.332781\tBack Mountain CDP\tPA\tPennsylvania\tLuzerne County\t26743\t43.8\t29.9\t8.8\t28508\t195828\t0.5168\t18612\tObama\t18612\t0.07589182400000001\t18612.0\n19159\t-76.211789\t41.052284\tNescopeck borough\tPA\tPennsylvania\tLuzerne County\t1763\t38.9\t12.6\t12.6\t23613\t126844\t0.5168\t18635\tObama\t18635\t0.005003077\t18635.0\n19160\t-75.896117\t40.989801\tJeddo borough\tPA\tPennsylvania\tLuzerne County\t141\t34.3\t0.0\t0.0\t12837\t72917\t0.5168\t18221\tObama\t18221\t0.00040013300000000005\t18221.0\n19161\t-75.84173100000001\t41.305787\tWyoming borough\tPA\tPennsylvania\tLuzerne County\t3127\t45.2\t24.7\t9.9\t27565\t157368\t0.5168\t18644\tObama\t18644\t0.008873864\t18644.0\n19162\t-75.88741\t41.265189\tKingston borough\tPA\tPennsylvania\tLuzerne County\t13154\t46.4\t30.5\t9.7\t26134\t154442\t0.5168\t18704\tObama\t18704\t0.037328686\t18704.0\n19163\t-75.896491\t41.021206\tFreeland borough\tPA\tPennsylvania\tLuzerne County\t3510\t45.1\t13.5\t15.3\t20569\t92371\t0.5168\t18224\tObama\t18224\t0.009960749\t18224.0\n19164\t-75.844447\t41.219235\tLaurel Run borough\tPA\tPennsylvania\tLuzerne County\t693\t41.1\t16.5\t11.8\t22043\t60625\t0.5168\t18702\tObama\t18702\t0.001966609\t18702.0\n19165\t-76.150627\t41.153478\tShickshinny borough\tPA\tPennsylvania\tLuzerne County\t883\t43.2\t6.7\t18.4\t22095\t91000\t0.5168\t18655\tObama\t18655\t0.002505795\t18655.0\n19166\t-76.059252\t40.991614\tConyngham borough\tPA\tPennsylvania\tLuzerne County\t1866\t47.2\t40.8\t8.4\t28709\t192892\t0.5168\t18219\tObama\t18219\t0.005295372\t18219.0\n19167\t-75.859269\t41.233585\tWilkes-Barre Township CDP\tPA\tPennsylvania\tLuzerne County\t3134\t45.6\t19.7\t13.8\t21344\t108816\t0.5168\t18702\tObama\t18702\t0.008893728\t18702.0\n19168\t-75.821107\t41.334831\tExeter borough\tPA\tPennsylvania\tLuzerne County\t5831\t44.1\t17.6\t11.7\t21430\t128208\t0.5168\t18643\tObama\t18643\t0.016547329\t18643.0\n19169\t-75.74270899999999\t41.323663\tDupont borough\tPA\tPennsylvania\tLuzerne County\t2587\t47.6\t16.2\t11.0\t25172\t132465\t0.5168\t18641\tObama\t18641\t0.007341441\t18641.0\n19170\t-75.868877\t41.284824\tForty Fort borough\tPA\tPennsylvania\tLuzerne County\t4426\t45.7\t34.3\t9.5\t30314\t164610\t0.5168\t18704\tObama\t18704\t0.012560192\t18704.0\n19171\t-76.030148\t40.970083\tWest Hazleton borough\tPA\tPennsylvania\tLuzerne County\t3354\t43.0\t16.3\t8.8\t23010\t90081\t0.5168\t18219\tObama\t18219\t0.009518049\t18219.0\n19172\t-75.87568\t41.246845\tWilkes-Barre city\tPA\tPennsylvania\tLuzerne County\t41293\t40.8\t16.2\t14.7\t20213\t105803\t0.5168\t18701\tObama\t18701\t0.117182107\t18701.0\n19173\t-75.973701\t41.330511\tDallas borough\tPA\tPennsylvania\tLuzerne County\t2460\t46.4\t40.7\t9.2\t27708\t193095\t0.5168\t18612\tObama\t18612\t0.006981038\t18612.0\n19174\t-75.857984\t41.321909000000005\tWest Wyoming borough\tPA\tPennsylvania\tLuzerne County\t2759\t46.3\t19.3\t8.2\t25385\t149597\t0.5168\t18644\tObama\t18644\t0.007829546\t18644.0\n19175\t-75.97197800000001\t40.950454\tHazleton city\tPA\tPennsylvania\tLuzerne County\t22132\t43.8\t14.7\t12.6\t21733\t106410\t0.5168\t18201\tObama\t18201\t0.062806635\t18201.0\n19176\t-75.799954\t41.329528\tWest Pittston borough\tPA\tPennsylvania\tLuzerne County\t4974\t46.1\t22.9\t8.8\t22103\t136848\t0.5168\t18643\tObama\t18643\t0.014115316999999999\t18643.0\n19177\t-75.775779\t41.353612\tDuryea borough\tPA\tPennsylvania\tLuzerne County\t4602\t46.8\t17.9\t9.1\t23433\t132375\t0.5168\t18642\tObama\t18642\t0.013059648\t18642.0\n19178\t-76.286445\t41.172973999999996\tNew Columbus borough\tPA\tPennsylvania\tLuzerne County\t204\t37.9\t14.4\t14.7\t19228\t123750\t0.5168\t18611\tObama\t18611\t0.000578915\t18611.0\n19179\t-75.782137\t41.303699\tYatesville borough\tPA\tPennsylvania\tLuzerne County\t650\t42.4\t28.0\t8.5\t24073\t175000\t0.5168\t18640\tObama\t18640\t0.001844583\t18640.0\n19180\t-77.001351\t41.229122\tSouth Williamsport borough\tPA\tPennsylvania\tLycoming County\t6113\t41.4\t20.0\t5.2\t24195\t121240\t0.327\t17702\tObama\t17702\t0.017347595\t17702.0\n19181\t-76.91844499999999\t41.247357\tMontoursville borough\tPA\tPennsylvania\tLycoming County\t4529\t45.4\t22.2\t8.7\t26551\t146367\t0.327\t17754\tObama\t17754\t0.012852487\t17754.0\n19182\t-77.266813\t41.201471999999995\tJersey Shore borough\tPA\tPennsylvania\tLycoming County\t4180\t35.5\t14.0\t10.6\t21161\t106881\t0.327\t17740\tObama\t17740\t0.011862088\t17740.0\n19183\t-76.785418\t41.202076\tMuncy borough\tPA\tPennsylvania\tLycoming County\t2507\t39.4\t24.8\t5.7\t24868\t130075\t0.327\t17756\tObama\t17756\t0.007114415\t17756.0\n19184\t-77.227422\t41.278386\tSalladasburg borough\tPA\tPennsylvania\tLycoming County\t245\t42.8\t13.6\t7.9\t18151\t130357\t0.327\t17740\tObama\t17740\t0.000695266\t17740.0\n19185\t-77.03751\t41.222547\tDuboistown borough\tPA\tPennsylvania\tLycoming County\t1219\t44.7\t15.8\t5.0\t19600\t124048\t0.327\t17702\tObama\t17702\t0.003459303\t17702.0\n19186\t-77.049022\t41.256961\tGarden View CDP\tPA\tPennsylvania\tLycoming County\t2493\t44.3\t14.8\t6.3\t25110\t140566\t0.327\t17701\tObama\t17701\t0.007074686\t17701.0\n19187\t-76.707716\t41.280183\tPicture Rocks borough\tPA\tPennsylvania\tLycoming County\t724\t44.6\t20.7\t7.3\t21743\t158036\t0.327\t17762\tObama\t17762\t0.002054582\t17762.0\n19188\t-76.87380999999999\t41.170658\tMontgomery borough\tPA\tPennsylvania\tLycoming County\t1667\t33.7\t10.5\t8.7\t19901\t106969\t0.327\t17752\tObama\t17752\t0.004730646\t17752.0\n19189\t-76.725381\t41.239036999999996\tHughesville borough\tPA\tPennsylvania\tLycoming County\t2131\t40.0\t21.7\t7.5\t21438\t133385\t0.327\t17756\tObama\t17756\t0.006047395\t17756.0\n19190\t-77.036559\t41.239953\tWilliamsport city\tPA\tPennsylvania\tLycoming County\t29676\t32.9\t19.9\t15.3\t19176\t106374\t0.327\t17702\tObama\t17702\t0.08421515\t17702.0\n19191\t-78.641348\t41.960344\tBradford city\tPA\tPennsylvania\tMcKean County\t8627\t38.1\t20.2\t13.7\t20721\t73906\t0.3506\t16701\tObama\t16701\t0.024481874\t16701.0\n19192\t-78.381833\t41.956148999999996\tEldred borough\tPA\tPennsylvania\tMcKean County\t783\t41.5\t11.6\t11.7\t19375\t97647\t0.3506\t16731\tObama\t16731\t0.0022220129999999997\t16731.0\n19193\t-78.659149\t41.869753\tLewis Run borough\tPA\tPennsylvania\tMcKean County\t643\t36.7\t7.6\t10.4\t17106\t95313\t0.3506\t16725\tObama\t16725\t0.001824718\t16725.0\n19194\t-78.644479\t41.725538\tMount Jewett borough\tPA\tPennsylvania\tMcKean County\t982\t42.2\t12.9\t11.3\t20399\t89130\t0.3506\t16740\tObama\t16740\t0.0027867390000000003\t16740.0\n19195\t-78.80942900000001\t41.662935\tKane borough\tPA\tPennsylvania\tMcKean County\t3675\t42.6\t17.5\t10.9\t23108\t96500\t0.3506\t16735\tObama\t16735\t0.010428989\t16735.0\n19196\t-78.443497\t41.807266\tSmethport borough\tPA\tPennsylvania\tMcKean County\t1620\t44.5\t19.0\t11.7\t18713\t99286\t0.3506\t16749\tObama\t16749\t0.004597269\t16749.0\n19197\t-78.27671600000001\t41.814588\tPort Allegany borough\tPA\tPennsylvania\tMcKean County\t2265\t35.5\t23.3\t12.0\t20920\t93404\t0.3506\t16743\tObama\t16743\t0.006427663\t16743.0\n19198\t-80.49989599999999\t41.233872999999996\tSharon city\tPA\tPennsylvania\tMercer County\t15210\t40.2\t18.3\t14.8\t20272\t62321\t0.4764\t16146\tObama\t16146\t0.043163244\t16146.0\n19199\t-80.437397\t41.484644\tJamestown borough\tPA\tPennsylvania\tMercer County\t680\t40.8\t14.1\t15.6\t21515\t83333\t0.4764\t16134\tObama\t16134\t0.001929718\t16134.0\n19200\t-80.258863\t41.321599\tFredonia borough\tPA\tPennsylvania\tMercer County\t635\t37.8\t12.7\t9.6\t21825\t62963\t0.4764\t16124\tObama\t16124\t0.001802016\t16124.0\n19201\t-80.497175\t41.211104999999996\tFarrell city\tPA\tPennsylvania\tMercer County\t5444\t42.6\t13.8\t21.4\t17125\t56928\t0.4764\t16121\tObama\t16121\t0.015449093\t16121.0\n19202\t-80.111828\t41.333756\tStoneboro borough\tPA\tPennsylvania\tMercer County\t1086\t40.9\t14.5\t14.6\t16271\t79286\t0.4764\t16153\tObama\t16153\t0.0030818729999999997\t16153.0\n19203\t-80.089528\t41.157289\tGrove City borough\tPA\tPennsylvania\tMercer County\t8013\t26.2\t36.7\t11.4\t21189\t108919\t0.4764\t16127\tObama\t16127\t0.022739453\t16127.0\n19204\t-80.139718\t41.273205\tJackson Center borough\tPA\tPennsylvania\tMercer County\t222\t42.3\t19.7\t12.9\t21328\t120000\t0.4764\t16133\tObama\t16133\t0.000629996\t16133.0\n19205\t-80.496558\t41.196669\tWheatland borough\tPA\tPennsylvania\tMercer County\t731\t46.8\t9.0\t15.3\t17730\t53333\t0.4764\t16161\tObama\t16161\t0.002074447\t16161.0\n19206\t-80.456148\t41.174215000000004\tWest Middlesex borough\tPA\tPennsylvania\tMercer County\t940\t45.4\t15.8\t12.9\t22901\t92162\t0.4764\t16159\tObama\t16159\t0.0026675509999999998\t16159.0\n19207\t-80.207211\t41.444148999999996\tSheakleyville borough\tPA\tPennsylvania\tMercer County\t160\t45.8\t12.5\t7.9\t17652\t98750\t0.4764\t16151\tObama\t16151\t0.00045405099999999997\t16151.0\n19208\t-80.384159\t41.405157\tGreenville borough\tPA\tPennsylvania\tMercer County\t6145\t35.1\t20.5\t10.3\t21088\t73825\t0.4764\t16125\tObama\t16125\t0.017438405\t16125.0\n19209\t-80.075473\t41.419378\tNew Lebanon borough\tPA\tPennsylvania\tMercer County\t203\t42.0\t12.9\t12.2\t19290\t97500\t0.4764\t16145\tObama\t16145\t0.0005760769999999999\t16145.0\n19210\t-80.083446\t41.350175\tSandy Lake borough\tPA\tPennsylvania\tMercer County\t781\t36.9\t18.8\t9.6\t22276\t96774\t0.4764\t16153\tObama\t16153\t0.002216338\t16153.0\n19211\t-80.408332\t41.283124\tClark borough\tPA\tPennsylvania\tMercer County\t612\t45.4\t34.2\t7.0\t28203\t150446\t0.4764\t16113\tObama\t16113\t0.0017367460000000002\t16113.0\n19212\t-80.48116\t41.259522\tSharpsville borough\tPA\tPennsylvania\tMercer County\t4345\t42.5\t21.1\t11.3\t22801\t93072\t0.4764\t16150\tObama\t16150\t0.012330329\t16150.0\n19213\t-80.441009\t41.230508\tHermitage city\tPA\tPennsylvania\tMercer County\t16237\t48.2\t30.8\t10.7\t27924\t132916\t0.4764\t16148\tObama\t16148\t0.046077686\t16148.0\n19214\t-80.236304\t41.226488\tMercer borough\tPA\tPennsylvania\tMercer County\t2342\t38.9\t29.0\t8.4\t23895\t97095\t0.4764\t16137\tObama\t16137\t0.006646175\t16137.0\n19215\t-77.573091\t40.596595\tLewistown borough\tPA\tPennsylvania\tMifflin County\t8695\t40.1\t11.8\t14.3\t17153\t99529\t0.261\t17044\tObama\t17044\t0.024674846\t17044.0\n19216\t-77.57690799999999\t40.584921\tJuniata Terrace borough\tPA\tPennsylvania\tMifflin County\t470\t42.2\t8.4\t8.6\t17610\t76111\t0.261\t17044\tObama\t17044\t0.001333775\t17044.0\n19217\t-77.83566400000001\t40.392641999999995\tNewton Hamilton borough\tPA\tPennsylvania\tMifflin County\t255\t44.6\t12.6\t10.4\t20613\t88000\t0.261\t17075\tObama\t17075\t0.000723644\t17075.0\n19218\t-77.866001\t40.377207\tKistler borough\tPA\tPennsylvania\tMifflin County\t367\t41.1\t8.4\t10.4\t14545\t77667\t0.261\t17066\tObama\t17066\t0.00104148\t17066.0\n19219\t-77.56339\t40.635403000000004\tBurnham borough\tPA\tPennsylvania\tMifflin County\t2048\t43.2\t16.8\t9.2\t22633\t104766\t0.261\t17009\tObama\t17009\t0.005811856\t17009.0\n19220\t-77.58058100000001\t40.641537\tYeagertown CDP\tPA\tPennsylvania\tMifflin County\t1063\t39.3\t14.5\t13.9\t26054\t126220\t0.261\t17099\tObama\t17099\t0.003016603\t17099.0\n19221\t-77.74149\t40.497836\tMcVeytown borough\tPA\tPennsylvania\tMifflin County\t432\t42.9\t10.8\t7.8\t17018\t133173\t0.261\t17051\tObama\t17051\t0.001225938\t17051.0\n19222\t-77.58754300000001\t40.715227\tMilroy CDP\tPA\tPennsylvania\tMifflin County\t1343\t40.9\t11.2\t8.6\t18009\t113068\t0.261\t17084\tObama\t17084\t0.003811192\t17084.0\n19223\t-77.726733\t40.601454\tBelleville CDP\tPA\tPennsylvania\tMifflin County\t1431\t39.2\t14.7\t7.2\t16351\t126515\t0.261\t17004\tObama\t17004\t0.0040609209999999995\t17004.0\n19224\t-77.611582\t40.649899\tReedsville CDP\tPA\tPennsylvania\tMifflin County\t863\t41.5\t24.2\t6.0\t18393\t131048\t0.261\t17084\tObama\t17084\t0.002449039\t17084.0\n19225\t-77.570683\t40.621592\tHighland Park CDP\tPA\tPennsylvania\tMifflin County\t1376\t51.4\t26.0\t9.9\t26500\t138347\t0.261\t17009\tObama\t17009\t0.0039048409999999996\t17009.0\n19226\t-75.459168\t41.115778999999996\tPocono Pines CDP\tPA\tPennsylvania\tMonroe County\t1410\t46.3\t25.7\t9.8\t23082\t168085\t0.5598\t18350\tObama\t18350\t0.0040013259999999995\t18350.0\n19227\t-75.17781\t41.00247\tEast Stroudsburg borough\tPA\tPennsylvania\tMonroe County\t10969\t29.1\t27.8\t14.3\t22120\t169173\t0.5598\t18327\tObama\t18327\t0.031128048999999998\t18327.0\n19228\t-75.26334200000001\t41.177822\tMountainhome CDP\tPA\tPennsylvania\tMonroe County\t1253\t45.0\t24.8\t9.0\t28926\t166875\t0.5598\t18323\tObama\t18323\t0.003555789\t18323.0\n19229\t-75.197119\t40.983717\tStroudsburg borough\tPA\tPennsylvania\tMonroe County\t6365\t36.3\t30.3\t11.7\t26153\t170863\t0.5598\t18327\tObama\t18327\t0.018062725\t18327.0\n19230\t-75.358171\t41.122566\tMount Pocono borough\tPA\tPennsylvania\tMonroe County\t3305\t36.0\t24.9\t13.4\t23422\t181485\t0.5598\t18344\tObama\t18344\t0.009378996\t18344.0\n19231\t-75.2117\t41.003853\tArlington Heights CDP\tPA\tPennsylvania\tMonroe County\t5972\t45.8\t27.6\t7.8\t28456\t184526\t0.5598\t18360\tObama\t18360\t0.016947462\t18360.0\n19232\t-75.40171600000001\t40.926753000000005\tBrodheadsville CDP\tPA\tPennsylvania\tMonroe County\t1771\t41.1\t26.2\t11.5\t25408\t215827\t0.5598\t18322\tObama\t18322\t0.005025779\t18322.0\n19233\t-75.139599\t40.973465000000004\tDelaware Water Gap borough\tPA\tPennsylvania\tMonroe County\t962\t36.5\t36.3\t8.6\t30172\t186310\t0.5598\t18327\tObama\t18327\t0.002729983\t18327.0\n19234\t-75.588686\t40.2498\tSanatoga CDP\tPA\tPennsylvania\tMontgomery County\t8316\t35.2\t28.8\t11.8\t30211\t206597\t0.5661\t19457\tObama\t19457\t0.023599312\t19457.0\n19235\t-75.194039\t40.085646999999994\tWyndmoor CDP\tPA\tPennsylvania\tMontgomery County\t5477\t49.8\t57.1\t9.3\t44652\t307176\t0.5661\t19118\tObama\t19118\t0.015542741\t19118.0\n19236\t-75.318567\t40.07008\tWest Conshohocken borough\tPA\tPennsylvania\tMontgomery County\t1403\t38.6\t39.6\t10.6\t38425\t225321\t0.5661\t19428\tObama\t19428\t0.003981462\t19428.0\n19237\t-75.39956\t40.148837\tTrooper CDP\tPA\tPennsylvania\tMontgomery County\t6089\t38.5\t39.0\t5.9\t34176\t280843\t0.5661\t19403\tObama\t19403\t0.017279487\t19403.0\n19238\t-75.40901600000001\t40.160387\tEagleville CDP\tPA\tPennsylvania\tMontgomery County\t4490\t36.9\t28.5\t6.8\t26005\t265966\t0.5661\t19403\tObama\t19403\t0.012741812\t19403.0\n19239\t-75.640204\t40.279519\tHalfway House CDP\tPA\tPennsylvania\tMontgomery County\t2660\t37.2\t23.2\t5.8\t31310\t251763\t0.5661\t19464\tObama\t19464\t0.007548602\t19464.0\n19240\t-75.427813\t40.130295000000004\tAudubon CDP\tPA\tPennsylvania\tMontgomery County\t6883\t40.3\t45.7\t7.7\t36916\t308748\t0.5661\t19403\tObama\t19403\t0.019532716000000002\t19403.0\n19241\t-75.274457\t40.211168\tNorth Wales borough\tPA\tPennsylvania\tMontgomery County\t3418\t37.9\t31.3\t8.5\t33907\t237716\t0.5661\t19436\tObama\t19436\t0.009699669000000001\t19436.0\n19242\t-75.20698399999999\t40.103895\tFlourtown CDP\tPA\tPennsylvania\tMontgomery County\t4663\t46.3\t57.9\t4.3\t40123\t327394\t0.5661\t19031\tObama\t19031\t0.013232755\t19031.0\n19243\t-75.268695\t40.147368\tBlue Bell CDP\tPA\tPennsylvania\tMontgomery County\t6349\t45.6\t66.9\t7.9\t57079\t455968\t0.5661\t19422\tObama\t19422\t0.01801732\t19422.0\n19244\t-75.18011700000001\t40.114940000000004\tOreland CDP\tPA\tPennsylvania\tMontgomery County\t5344\t41.9\t42.2\t8.6\t32748\t270142\t0.5661\t19075\tObama\t19075\t0.015165311\t19075.0\n19245\t-75.39979699999999\t40.222401\tSkippack CDP\tPA\tPennsylvania\tMontgomery County\t3191\t38.5\t44.3\t4.9\t43303\t282407\t0.5661\t19474\tObama\t19474\t0.009055484\t19474.0\n19246\t-75.146309\t40.091514000000004\tWyncote CDP\tPA\tPennsylvania\tMontgomery County\t3026\t52.3\t59.3\t10.3\t38590\t322067\t0.5661\t19095\tObama\t19095\t0.008587244\t19095.0\n19247\t-75.339638\t40.122702000000004\tNorristown borough\tPA\tPennsylvania\tMontgomery County\t32553\t34.8\t16.8\t13.1\t23087\t150862\t0.5661\t19401\tObama\t19401\t0.092379559\t19401.0\n19248\t-75.324206\t40.328757\tTelford borough\tPA\tPennsylvania\tMontgomery County\t4800\t40.3\t24.5\t6.6\t29590\t226209\t0.5661\t18969\tObama\t18969\t0.013621537\t18969.0\n19249\t-75.151798\t40.103201\tGlenside CDP\tPA\tPennsylvania\tMontgomery County\t7617\t38.7\t48.1\t9.2\t32628\t254403\t0.5661\t19095\tObama\t19095\t0.021615676\t19095.0\n19250\t-75.322139\t40.310970000000005\tSouderton borough\tPA\tPennsylvania\tMontgomery County\t6667\t37.1\t24.1\t6.8\t30061\t225094\t0.5661\t18964\tObama\t18964\t0.018919747\t18964.0\n19251\t-75.138627\t40.182587\tHorsham CDP\tPA\tPennsylvania\tMontgomery County\t14751\t40.0\t37.1\t9.1\t33069\t261842\t0.5661\t19044\tObama\t19044\t0.041860685\t19044.0\n19252\t-75.33654399999999\t40.150634000000004\tEast Norriton CDP\tPA\tPennsylvania\tMontgomery County\t13547\t45.9\t38.3\t6.5\t38135\t263398\t0.5661\t19401\tObama\t19401\t0.038443949\t19401.0\n19253\t-75.644697\t40.250889\tPottstown borough\tPA\tPennsylvania\tMontgomery County\t21666\t37.8\t15.8\t10.5\t26204\t154892\t0.5661\t19464\tObama\t19464\t0.061484211\t19464.0\n19254\t-75.263426\t40.007785999999996\tNarberth borough\tPA\tPennsylvania\tMontgomery County\t4172\t40.3\t69.2\t8.0\t42314\t377851\t0.5661\t19072\tObama\t19072\t0.011839386\t19072.0\n19255\t-75.538069\t40.186101\tRoyersford borough\tPA\tPennsylvania\tMontgomery County\t4442\t39.7\t21.3\t9.8\t30994\t184778\t0.5661\t19468\tObama\t19468\t0.012605597\t19468.0\n19256\t-75.46522399999999\t40.27534\tSpring Mount CDP\tPA\tPennsylvania\tMontgomery County\t2204\t33.0\t38.5\t4.6\t28642\t210039\t0.5661\t19478\tObama\t19478\t0.006254556\t19478.0\n19257\t-75.469941\t40.336548\tGreen Lane borough\tPA\tPennsylvania\tMontgomery County\t619\t36.0\t19.3\t4.1\t30101\t232778\t0.5661\t18054\tObama\t18054\t0.0017566110000000002\t18054.0\n19258\t-75.279824\t40.109913\tPlymouth Meeting CDP\tPA\tPennsylvania\tMontgomery County\t6072\t43.9\t48.0\t7.9\t42251\t298264\t0.5661\t19462\tObama\t19462\t0.017231244\t19462.0\n19259\t-75.105387\t40.177558000000005\tHatboro borough\tPA\tPennsylvania\tMontgomery County\t7667\t40.8\t28.7\t7.3\t31122\t234795\t0.5661\t19040\tObama\t19040\t0.021757567000000002\t19040.0\n19260\t-75.226692\t40.184591999999995\tSpring House CDP\tPA\tPennsylvania\tMontgomery County\t3691\t51.8\t62.2\t6.2\t57198\t480226\t0.5661\t19002\tObama\t19002\t0.010474394\t19002.0\n19261\t-75.382048\t40.096049\tKing of Prussia CDP\tPA\tPennsylvania\tMontgomery County\t18798\t39.9\t54.7\t7.9\t41211\t275140\t0.5661\t19406\tObama\t19406\t0.053345342999999996\t19406.0\n19262\t-75.31564399999999\t40.022713\tBryn Mawr CDP\tPA\tPennsylvania\tMontgomery County\t4140\t29.6\t60.6\t10.7\t40975\t293750\t0.5661\t19010\tObama\t19010\t0.011748575\t19010.0\n19263\t-75.179242\t40.177753\tMaple Glen CDP\tPA\tPennsylvania\tMontgomery County\t6990\t40.9\t56.2\t6.8\t41381\t379809\t0.5661\t19002\tObama\t19002\t0.019836363\t19002.0\n19264\t-75.08966\t40.082254999999996\tRockledge borough\tPA\tPennsylvania\tMontgomery County\t2524\t39.6\t22.9\t7.5\t31720\t226316\t0.5661\t19046\tObama\t19046\t0.0071626580000000006\t19046.0\n19265\t-75.68144699999999\t40.251065000000004\tStowe CDP\tPA\tPennsylvania\tMontgomery County\t3482\t39.0\t18.1\t8.9\t27429\t168714\t0.5661\t19464\tObama\t19464\t0.00988129\t19464.0\n19266\t-75.303344\t40.077233\tConshohocken borough\tPA\tPennsylvania\tMontgomery County\t8012\t37.6\t27.6\t7.2\t30804\t200530\t0.5661\t19428\tObama\t19428\t0.022736615\t19428.0\n19267\t-75.271467\t39.986681\tPenn Wynne CDP\tPA\tPennsylvania\tMontgomery County\t5232\t47.6\t65.9\t11.8\t50353\t344444\t0.5661\t19096\tObama\t19096\t0.014847475\t19096.0\n19268\t-75.60940699999999\t40.264207\tPottsgrove CDP\tPA\tPennsylvania\tMontgomery County\t3461\t45.8\t35.0\t8.1\t44227\t254232\t0.5661\t19464\tObama\t19464\t0.009821696\t19464.0\n19269\t-75.608975\t40.321836\tGilbertsville CDP\tPA\tPennsylvania\tMontgomery County\t4546\t39.9\t22.5\t8.0\t31193\t231975\t0.5661\t19525\tObama\t19525\t0.01290073\t19525.0\n19270\t-75.50633\t40.405887\tEast Greenville borough\tPA\tPennsylvania\tMontgomery County\t2975\t32.9\t14.7\t8.7\t25508\t165998\t0.5661\t18041\tObama\t18041\t0.008442515\t18041.0\n19271\t-75.3407\t40.243924\tKulpsville CDP\tPA\tPennsylvania\tMontgomery County\t8135\t39.4\t47.9\t10.3\t39696\t261456\t0.5661\t19446\tObama\t19446\t0.023085667\t19446.0\n19272\t-75.379136\t40.13085\tWest Norriton CDP\tPA\tPennsylvania\tMontgomery County\t14715\t42.3\t40.8\t8.0\t37037\t231118\t0.5661\t19403\tObama\t19403\t0.041758523\t19403.0\n19273\t-75.189009\t40.139967\tFort Washington CDP\tPA\tPennsylvania\tMontgomery County\t3535\t44.6\t66.0\t5.7\t51566\t425551\t0.5661\t19034\tObama\t19034\t0.010031694\t19034.0\n19274\t-75.287571\t40.007238\tArdmore CDP\tPA\tPennsylvania\tMontgomery County\t12532\t40.4\t60.3\t8.4\t45267\t286185\t0.5661\t19003\tObama\t19003\t0.035563562\t19003.0\n19275\t-75.48378100000001\t40.377154\tRed Hill borough\tPA\tPennsylvania\tMontgomery County\t2720\t41.4\t18.6\t8.3\t29619\t187050\t0.5661\t18076\tObama\t18076\t0.0077188709999999995\t18076.0\n19276\t-75.434798\t40.189944\tEvansburg CDP\tPA\tPennsylvania\tMontgomery County\t1705\t36.2\t51.1\t6.1\t38447\t340758\t0.5661\t19426\tObama\t19426\t0.004838483\t19426.0\n19277\t-75.281161\t40.241755\tLansdale borough\tPA\tPennsylvania\tMontgomery County\t16251\t39.6\t30.3\t7.3\t32134\t220387\t0.5661\t19446\tObama\t19446\t0.046117415\t19446.0\n19278\t-75.387322\t40.279168\tHarleysville CDP\tPA\tPennsylvania\tMontgomery County\t9590\t35.9\t43.2\t5.4\t34477\t286350\t0.5661\t19438\tObama\t19438\t0.027214695\t19438.0\n19279\t-75.466038\t40.257197\tSchwenksville borough\tPA\tPennsylvania\tMontgomery County\t1778\t29.6\t24.4\t14.5\t29585\t189286\t0.5661\t19473\tObama\t19473\t0.005045644\t19473.0\n19280\t-75.221462\t40.156375\tAmbler borough\tPA\tPennsylvania\tMontgomery County\t6289\t39.7\t33.3\t9.2\t30522\t231070\t0.5661\t19002\tObama\t19002\t0.017847051000000003\t19002.0\n19281\t-75.457886\t40.187214000000004\tCollegeville borough\tPA\tPennsylvania\tMontgomery County\t4821\t38.5\t35.4\t35.7\t35858\t325656\t0.5661\t19426\tObama\t19426\t0.013681131000000001\t19426.0\n19282\t-75.47529399999999\t40.199139\tTrappe borough\tPA\tPennsylvania\tMontgomery County\t3344\t37.8\t48.3\t6.6\t44711\t263571\t0.5661\t19426\tObama\t19426\t0.009489671\t19426.0\n19283\t-75.117789\t40.149491\tWillow Grove CDP\tPA\tPennsylvania\tMontgomery County\t16035\t41.3\t33.4\t8.6\t32364\t238848\t0.5661\t19090\tObama\t19090\t0.045504446\t19090.0\n19284\t-75.240507\t40.250283\tMontgomeryville CDP\tPA\tPennsylvania\tMontgomery County\t12310\t39.4\t50.1\t8.1\t39511\t315277\t0.5661\t19454\tObama\t19454\t0.034933566\t19454.0\n19285\t-75.34334100000001\t40.104335999999996\tBridgeport borough\tPA\tPennsylvania\tMontgomery County\t4205\t39.1\t18.2\t8.8\t28910\t171907\t0.5661\t19405\tObama\t19405\t0.011933033999999999\t19405.0\n19286\t-75.129678\t40.096264\tJenkintown borough\tPA\tPennsylvania\tMontgomery County\t4398\t43.7\t53.2\t7.7\t39480\t249706\t0.5661\t19095\tObama\t19095\t0.012480733\t19095.0\n19287\t-75.066854\t40.140465\tBryn Athyn borough\tPA\tPennsylvania\tMontgomery County\t1430\t34.6\t59.7\t13.3\t36449\t390323\t0.5661\t19009\tObama\t19009\t0.004058083\t19009.0\n19288\t-75.299091\t40.277390000000004\tHatfield borough\tPA\tPennsylvania\tMontgomery County\t2846\t36.5\t29.4\t7.2\t31118\t234686\t0.5661\t19440\tObama\t19440\t0.008076436\t19440.0\n19289\t-75.49651899999999\t40.393555\tPennsburg borough\tPA\tPennsylvania\tMontgomery County\t3678\t37.8\t16.8\t8.7\t27519\t210280\t0.5661\t18073\tObama\t18073\t0.010437502\t18073.0\n19290\t-76.674872\t41.052443\tWashingtonville borough\tPA\tPennsylvania\tMontour County\t195\t37.5\t9.4\t7.5\t17237\t112500\t0.3899\t17884\tObama\t17884\t0.000553375\t17884.0\n19291\t-76.586067\t40.967599\tMechanicsville CDP\tPA\tPennsylvania\tMontour County\t3090\t49.1\t38.7\t17.7\t32290\t161985\t0.3899\t17868\tObama\t17868\t0.008768864\t17868.0\n19292\t-76.612114\t40.961618\tDanville borough\tPA\tPennsylvania\tMontour County\t4736\t41.3\t19.0\t7.7\t24371\t113646\t0.3899\t17868\tObama\t17868\t0.013439916000000001\t17868.0\n19293\t-75.337886\t40.581265\tHellertown borough\tPA\tPennsylvania\tNorthampton County\t5741\t44.5\t17.2\t9.0\t27319\t176146\t0.517\t18055\tObama\t18055\t0.016291925\t18055.0\n19294\t-75.313073\t40.739982\tNazareth borough\tPA\tPennsylvania\tNorthampton County\t6233\t43.6\t22.9\t12.0\t27197\t175365\t0.517\t18064\tObama\t18064\t0.017688133\t18064.0\n19295\t-75.26734\t40.690713\tPalmer Heights CDP\tPA\tPennsylvania\tNorthampton County\t3679\t49.6\t26.0\t7.5\t31482\t205765\t0.517\t18045\tObama\t18045\t0.01044034\t18045.0\n19296\t-75.291816\t40.848428000000006\tWind Gap borough\tPA\tPennsylvania\tNorthampton County\t2889\t42.1\t14.2\t7.5\t25035\t179489\t0.517\t18091\tObama\t18091\t0.008198462\t18091.0\n19297\t-75.401988\t40.758373999999996\tChapman borough\tPA\tPennsylvania\tNorthampton County\t252\t44.5\t24.3\t6.6\t26401\t219444\t0.517\t18014\tObama\t18014\t0.000715131\t18014.0\n19298\t-75.220097\t40.685863\tEaston city\tPA\tPennsylvania\tNorthampton County\t27618\t32.4\t18.6\t12.9\t20163\t124410\t0.517\t18042\tObama\t18042\t0.078374917\t18042.0\n19299\t-75.220137\t40.878253\tRoseto borough\tPA\tPennsylvania\tNorthampton County\t1711\t40.9\t15.8\t8.9\t19486\t171566\t0.517\t18013\tObama\t18013\t0.00485551\t18013.0\n19300\t-75.59565400000001\t40.75145\tWalnutport borough\tPA\tPennsylvania\tNorthampton County\t2223\t44.2\t10.7\t11.2\t23169\t159766\t0.517\t18088\tObama\t18088\t0.0063084740000000005\t18088.0\n19301\t-75.25587900000001\t40.741313\tTatamy borough\tPA\tPennsylvania\tNorthampton County\t1091\t44.5\t22.6\t7.1\t24861\t183390\t0.517\t18085\tObama\t18085\t0.003096062\t18085.0\n19302\t-75.09849200000001\t40.921484\tPortland borough\tPA\tPennsylvania\tNorthampton County\t652\t45.2\t23.9\t9.5\t24824\t205714\t0.517\t18351\tObama\t18351\t0.001850259\t18351.0\n19303\t-75.240678\t40.684878999999995\tWilson borough\tPA\tPennsylvania\tNorthampton County\t7893\t37.7\t15.2\t9.0\t24286\t129578\t0.517\t18042\tObama\t18042\t0.022398914\t18042.0\n19304\t-75.32446\t40.644199\tMiddletown CDP\tPA\tPennsylvania\tNorthampton County\t7612\t42.8\t28.5\t8.3\t30241\t207399\t0.517\t18020\tObama\t18020\t0.021601487000000003\t18020.0\n19305\t-75.20808199999999\t40.867934999999996\tBangor borough\tPA\tPennsylvania\tNorthampton County\t5391\t36.5\t14.9\t9.9\t22787\t145299\t0.517\t18013\tObama\t18013\t0.015298688000000001\t18013.0\n19306\t-75.275448\t40.783167999999996\tBelfast CDP\tPA\tPennsylvania\tNorthampton County\t1351\t46.5\t23.3\t10.3\t26208\t214157\t0.517\t18083\tObama\t18083\t0.003833895\t18083.0\n19307\t-75.23581800000001\t40.677735999999996\tWest Easton borough\tPA\tPennsylvania\tNorthampton County\t1264\t40.6\t11.1\t13.2\t22430\t142279\t0.517\t18042\tObama\t18042\t0.003587005\t18042.0\n19308\t-75.291852\t40.748527\tEastlawn Gardens CDP\tPA\tPennsylvania\tNorthampton County\t3330\t41.9\t27.1\t5.7\t27321\t221806\t0.517\t18064\tObama\t18064\t0.009449941\t18064.0\n19309\t-75.23626800000001\t40.661024\tGlendon borough\tPA\tPennsylvania\tNorthampton County\t391\t45.1\t21.9\t11.0\t30930\t215625\t0.517\t18042\tObama\t18042\t0.0011095880000000001\t18042.0\n19310\t-75.356093\t40.632177\tBethlehem city\tPA\tPennsylvania\tNorthampton County\t75814\t37.9\t28.5\t13.8\t24604\t158356\t0.517\t18017\tObama\t18017\t0.21514649600000002\t18017.0\n19311\t-75.25374599999999\t40.867693\tPen Argyl borough\tPA\tPennsylvania\tNorthampton County\t3731\t38.7\t21.4\t9.4\t22741\t145791\t0.517\t18072\tObama\t18072\t0.010587906999999999\t18072.0\n19312\t-75.18566899999999\t40.881561\tEast Bangor borough\tPA\tPennsylvania\tNorthampton County\t967\t37.8\t9.9\t13.0\t19954\t141211\t0.517\t18013\tObama\t18013\t0.002744172\t18013.0\n19313\t-75.26091\t40.657568\tOld Orchard CDP\tPA\tPennsylvania\tNorthampton County\t2668\t47.7\t39.1\t7.3\t33441\t233428\t0.517\t18045\tObama\t18045\t0.007571304\t18045.0\n19314\t-75.391979\t40.727833000000004\tBath borough\tPA\tPennsylvania\tNorthampton County\t2756\t36.7\t19.1\t12.2\t25419\t166994\t0.517\t18014\tObama\t18014\t0.007821032\t18014.0\n19315\t-75.26289200000001\t40.754705\tStockertown borough\tPA\tPennsylvania\tNorthampton County\t790\t38.3\t21.6\t9.0\t26383\t191786\t0.517\t18083\tObama\t18083\t0.002241878\t18083.0\n19316\t-75.340063\t40.628025\tFreemansburg borough\tPA\tPennsylvania\tNorthampton County\t2579\t37.0\t7.5\t13.5\t21955\t145471\t0.517\t18020\tObama\t18020\t0.007318738000000001\t18020.0\n19317\t-75.489999\t40.686409000000005\tNorthampton borough\tPA\tPennsylvania\tNorthampton County\t10349\t43.1\t16.8\t6.8\t27222\t151717\t0.517\t18067\tObama\t18067\t0.029368601\t18067.0\n19318\t-75.474202\t40.663992\tNorth Catasauqua borough\tPA\tPennsylvania\tNorthampton County\t2860\t41.3\t17.6\t9.1\t25430\t159630\t0.517\t18032\tObama\t18032\t0.008116166\t18032.0\n19319\t-76.671318\t40.784110999999996\tTrevorton CDP\tPA\tPennsylvania\tNorthumberland County\t2434\t45.3\t6.7\t10.5\t17049\t82538\t0.3936\t17881\tObama\t17881\t0.006907254\t17881.0\n19320\t-76.79326800000001\t40.896535\tNorthumberland borough\tPA\tPennsylvania\tNorthumberland County\t3697\t42.7\t21.4\t7.9\t22034\t126092\t0.3936\t17857\tObama\t17857\t0.010491421\t17857.0\n19321\t-76.86453399999999\t41.085190999999995\tWatsontown borough\tPA\tPennsylvania\tNorthumberland County\t2206\t44.7\t14.4\t10.3\t24201\t130825\t0.3936\t17887\tObama\t17887\t0.006260231\t17887.0\n19322\t-76.78719\t40.861765999999996\tSunbury city\tPA\tPennsylvania\tNorthumberland County\t10311\t38.4\t8.2\t10.8\t19262\t97917\t0.3936\t17801\tObama\t17801\t0.029260763\t17801.0\n19323\t-76.57812\t40.788156\tEdgewood CDP\tPA\tPennsylvania\tNorthumberland County\t2500\t46.4\t16.2\t9.3\t23305\t63841\t0.3936\t17872\tObama\t17872\t0.00709455\t17872.0\n19324\t-76.769441\t41.101898999999996\tTurbotville borough\tPA\tPennsylvania\tNorthumberland County\t695\t35.2\t21.9\t8.6\t28278\t137755\t0.3936\t17772\tObama\t17772\t0.001972285\t17772.0\n19325\t-76.554985\t40.788249\tShamokin city\tPA\tPennsylvania\tNorthumberland County\t7573\t43.0\t9.2\t16.8\t18370\t49711\t0.3936\t17866\tObama\t17866\t0.021490812\t17866.0\n19326\t-76.850746\t41.008451\tMilton borough\tPA\tPennsylvania\tNorthumberland County\t6075\t40.2\t17.9\t12.2\t22828\t121615\t0.3936\t17847\tObama\t17847\t0.017239756999999998\t17847.0\n19327\t-76.472027\t40.795258000000004\tKulpmont borough\tPA\tPennsylvania\tNorthumberland County\t2828\t46.9\t11.0\t12.8\t19661\t64953\t0.3936\t17834\tObama\t17834\t0.008025355\t17834.0\n19328\t-76.464481\t40.803583\tMarion Heights borough\tPA\tPennsylvania\tNorthumberland County\t649\t47.5\t12.9\t10.7\t17550\t78889\t0.3936\t17832\tObama\t17832\t0.001841745\t17832.0\n19329\t-76.536283\t40.785414\tMarshallton CDP\tPA\tPennsylvania\tNorthumberland County\t1426\t44.0\t8.0\t12.9\t19517\t61635\t0.3936\t17872\tObama\t17872\t0.004046732\t17872.0\n19330\t-76.549151\t40.867978\tElysburg CDP\tPA\tPennsylvania\tNorthumberland County\t2255\t48.1\t26.2\t4.9\t27472\t161919\t0.3936\t17824\tObama\t17824\t0.006399284\t17824.0\n19331\t-76.85175100000001\t40.710407000000004\tHerndon borough\tPA\tPennsylvania\tNorthumberland County\t349\t42.3\t11.0\t4.9\t19353\t112963\t0.3936\t17830\tObama\t17830\t0.0009903989999999999\t17830.0\n19332\t-76.672391\t40.872904\tSnydertown borough\tPA\tPennsylvania\tNorthumberland County\t328\t43.9\t15.5\t11.0\t21268\t148958\t0.3936\t17860\tObama\t17860\t0.000930805\t17860.0\n19333\t-76.646282\t40.946111\tRiverside borough\tPA\tPennsylvania\tNorthumberland County\t1973\t44.9\t32.3\t5.9\t29467\t162582\t0.3936\t17868\tObama\t17868\t0.005599019\t17868.0\n19334\t-76.57554499999999\t40.780196000000004\tFairview-Ferndale CDP\tPA\tPennsylvania\tNorthumberland County\t2333\t47.1\t14.9\t15.3\t20583\t65100\t0.3936\t17872\tObama\t17872\t0.006620634\t17872.0\n19335\t-76.818333\t41.07268\tMcEwensville borough\tPA\tPennsylvania\tNorthumberland County\t313\t44.8\t12.7\t10.9\t20295\t152778\t0.3936\t17749\tObama\t17749\t0.0008882380000000001\t17749.0\n19336\t-76.41209599999999\t40.795968\tMount Carmel borough\tPA\tPennsylvania\tNorthumberland County\t6316\t46.9\t14.8\t12.9\t20803\t54742\t0.3936\t17851\tObama\t17851\t0.017923671999999998\t17851.0\n19337\t-77.02760699999999\t40.395245\tDuncannon borough\tPA\tPennsylvania\tPerry County\t1490\t40.7\t8.3\t13.5\t22920\t124296\t0.2972\t170HH\tObama\t170HH\t0.004228352\t0.0\n19338\t-76.970518\t40.454240000000006\tNew Buffalo borough\tPA\tPennsylvania\tPerry County\t132\t43.3\t11.6\t7.7\t23504\t164286\t0.2972\t17069\tObama\t17069\t0.000374592\t17069.0\n19339\t-77.18923000000001\t40.418008\tBloomfield borough\tPA\tPennsylvania\tPerry County\t1098\t43.0\t21.2\t7.6\t24090\t162010\t0.2972\t17068\tObama\t17068\t0.003115927\t17068.0\n19340\t-77.512241\t40.33668\tBlain borough\tPA\tPennsylvania\tPerry County\t271\t41.3\t8.6\t9.2\t17918\t126389\t0.2972\t17006\tObama\t17006\t0.000769049\t17006.0\n19341\t-77.152709\t40.554048\tMillerstown borough\tPA\tPennsylvania\tPerry County\t706\t42.7\t23.5\t5.5\t26293\t145625\t0.2972\t17062\tObama\t17062\t0.002003501\t17062.0\n19342\t-77.133876\t40.478408\tNewport borough\tPA\tPennsylvania\tPerry County\t1635\t34.9\t12.9\t7.6\t20161\t113690\t0.2972\t17074\tObama\t17074\t0.004639836\t17074.0\n19343\t-76.992914\t40.572174\tLiverpool borough\tPA\tPennsylvania\tPerry County\t897\t43.4\t13.7\t10.0\t26225\t126415\t0.2972\t17045\tObama\t17045\t0.002545525\t17045.0\n19344\t-76.93397399999999\t40.337812\tMarysville borough\tPA\tPennsylvania\tPerry County\t2369\t43.4\t16.0\t11.3\t24939\t135798\t0.2972\t17093\tObama\t17093\t0.006722796\t17093.0\n19345\t-77.305502\t40.343626\tLandisburg borough\tPA\tPennsylvania\tPerry County\t201\t43.3\t16.6\t7.3\t22443\t147727\t0.2972\t17040\tObama\t17040\t0.000570402\t17040.0\n19346\t-75.134088\t40.007508\tPhiladelphia city\tPA\tPennsylvania\tPhiladelphia County\t1440459\t35.7\t21.8\t15.9\t20987\t122080\t0.8529\t19140\tObama\t19140\t4.087763561\t19140.0\n19347\t-74.801629\t41.324001\tMilford borough\tPA\tPennsylvania\tPike County\t1235\t45.0\t34.3\t17.4\t26522\t268966\t0.4386\t18337\tObama\t18337\t0.003504708\t18337.0\n19348\t-74.699729\t41.366541\tMatamoras borough\tPA\tPennsylvania\tPike County\t2511\t39.3\t18.3\t9.5\t22796\t175357\t0.4386\t18336\tObama\t18336\t0.0071257659999999995\t18336.0\n19349\t-78.020907\t41.920423\tOswayo borough\tPA\tPennsylvania\tPotter County\t139\t41.6\t8.3\t10.9\t15854\t93333\t0.2619\t16915\tObama\t16915\t0.00039445699999999997\t16915.0\n19350\t-78.089667\t41.636922\tAustin borough\tPA\tPennsylvania\tPotter County\t539\t36.8\t4.4\t11.0\t18053\t89583\t0.2619\t16720\tObama\t16720\t0.001529585\t16720.0\n19351\t-77.75423\t41.903202\tUlysses borough\tPA\tPennsylvania\tPotter County\t737\t33.8\t10.1\t12.1\t16629\t103049\t0.2619\t16948\tObama\t16948\t0.002091473\t16948.0\n19352\t-78.015795\t41.775643\tCoudersport borough\tPA\tPennsylvania\tPotter County\t2488\t41.1\t23.9\t7.5\t24597\t123673\t0.2619\t16915\tObama\t16915\t0.007060497\t16915.0\n19353\t-78.190751\t41.966302\tShinglehouse borough\tPA\tPennsylvania\tPotter County\t1080\t41.3\t10.6\t10.6\t15079\t83488\t0.2619\t16748\tObama\t16748\t0.003064846\t16748.0\n19354\t-77.64376700000001\t41.733937\tGaleton borough\tPA\tPennsylvania\tPotter County\t1249\t43.1\t8.3\t14.7\t19959\t75270\t0.2619\t16922\tObama\t16922\t0.003544437\t16922.0\n19355\t-76.24229100000001\t40.685933\tMarlin CDP\tPA\tPennsylvania\tSchuylkill County\t619\t45.6\t13.3\t7.0\t22546\t120608\t0.4251\t17951\tObama\t17951\t0.0017566110000000002\t17951.0\n19356\t-76.23625\t40.695626000000004\tSeltzer CDP\tPA\tPennsylvania\tSchuylkill County\t297\t45.5\t13.6\t7.0\t22540\t119444\t0.4251\t17974\tObama\t17974\t0.0008428330000000001\t17974.0\n19357\t-76.391851\t40.630177\tTremont borough\tPA\tPennsylvania\tSchuylkill County\t1713\t45.1\t4.8\t11.4\t21142\t77250\t0.4251\t17981\tObama\t17981\t0.004861186\t17981.0\n19358\t-76.148465\t40.64969\tRenningers CDP\tPA\tPennsylvania\tSchuylkill County\t423\t47.1\t2.6\t18.7\t20619\t113500\t0.4251\t17929\tObama\t17929\t0.001200398\t17929.0\n19359\t-75.98646600000001\t40.821593\tHometown CDP\tPA\tPennsylvania\tSchuylkill County\t1360\t51.8\t27.7\t4.9\t27558\t160179\t0.4251\t18252\tObama\t18252\t0.003859435\t18252.0\n19360\t-76.206232\t40.832127\tShenandoah Heights CDP\tPA\tPennsylvania\tSchuylkill County\t1253\t45.2\t14.4\t11.0\t21549\t67000\t0.4251\t17976\tObama\t17976\t0.003555789\t17976.0\n19361\t-76.193939\t40.630324\tCressona borough\tPA\tPennsylvania\tSchuylkill County\t1589\t39.7\t14.1\t8.3\t20286\t111080\t0.4251\t17929\tObama\t17929\t0.0045092959999999994\t17929.0\n19362\t-76.168718\t40.860133000000005\tBrandonville CDP\tPA\tPennsylvania\tSchuylkill County\t212\t47.8\t6.7\t8.0\t20317\t111364\t0.4251\t17967\tObama\t17967\t0.000601618\t17967.0\n19363\t-75.991833\t40.900888\tMcAdoo borough\tPA\tPennsylvania\tSchuylkill County\t2183\t44.4\t10.1\t9.8\t20164\t94747\t0.4251\t18237\tObama\t18237\t0.006194961\t18237.0\n19364\t-76.16767800000001\t40.937596\tNuremberg CDP\tPA\tPennsylvania\tSchuylkill County\t260\t42.9\t16.8\t10.0\t20481\t135714\t0.4251\t18241\tObama\t18241\t0.000737833\t18241.0\n19365\t-76.063653\t40.819773\tGrier City-Park Crest CDP\tPA\tPennsylvania\tSchuylkill County\t975\t39.1\t19.8\t12.9\t19259\t144091\t0.4251\t18214\tObama\t18214\t0.002766875\t18214.0\n19366\t-76.097311\t40.59482\tAuburn borough\tPA\tPennsylvania\tSchuylkill County\t813\t39.9\t7.1\t11.3\t23870\t115667\t0.4251\t179HH\tObama\t179HH\t0.0023071479999999998\t0.0\n19367\t-76.379384\t40.719196999999994\tBeurys Lake CDP\tPA\tPennsylvania\tSchuylkill County\t129\t44.6\t17.9\t6.2\t20089\t129167\t0.4251\t17943\tObama\t17943\t0.000366079\t17943.0\n19368\t-76.168669\t40.790040000000005\tNew Boston-Morea CDP\tPA\tPennsylvania\tSchuylkill County\t461\t32.2\t16.6\t6.4\t14437\t76905\t0.4251\t17948\tObama\t17948\t0.001308235\t17948.0\n19369\t-76.32119499999999\t40.673476\tBranchdale CDP\tPA\tPennsylvania\tSchuylkill County\t408\t42.3\t7.4\t11.5\t15978\t86111\t0.4251\t17923\tObama\t17923\t0.001157831\t17923.0\n19370\t-76.116749\t40.717892\tNew Philadelphia borough\tPA\tPennsylvania\tSchuylkill County\t1063\t46.1\t8.6\t13.5\t19305\t72292\t0.4251\t17959\tObama\t17959\t0.003016603\t17959.0\n19371\t-76.118638\t40.896091\tSheppton CDP\tPA\tPennsylvania\tSchuylkill County\t233\t47.6\t6.7\t8.1\t20360\t110417\t0.4251\t18248\tObama\t18248\t0.000661212\t18248.0\n19372\t-76.200214\t40.816727\tShenandoah borough\tPA\tPennsylvania\tSchuylkill County\t5278\t45.9\t9.4\t15.3\t17896\t48052\t0.4251\t17976\tObama\t17976\t0.014978015\t17976.0\n19373\t-76.18812199999999\t40.673002000000004\tMount Carbon borough\tPA\tPennsylvania\tSchuylkill County\t85\t44.2\t29.0\t7.7\t26421\t170833\t0.4251\t17901\tObama\t17901\t0.000241215\t17901.0\n19374\t-76.180812\t40.587471\tLake Wynonah CDP\tPA\tPennsylvania\tSchuylkill County\t2405\t41.7\t19.8\t7.2\t24998\t183654\t0.4251\t17972\tObama\t17972\t0.0068249569999999996\t17972.0\n19375\t-76.057774\t40.621657\tDeer Lake borough\tPA\tPennsylvania\tSchuylkill County\t645\t43.7\t13.1\t7.3\t25252\t163636\t0.4251\t17961\tObama\t17961\t0.001830394\t17961.0\n19376\t-76.393739\t40.568815\tRavine CDP\tPA\tPennsylvania\tSchuylkill County\t614\t43.5\t12.7\t9.4\t21073\t131707\t0.4251\t17963\tObama\t17963\t0.0017424220000000002\t17963.0\n19377\t-76.07396999999999\t40.841504\tDelano CDP\tPA\tPennsylvania\tSchuylkill County\t367\t47.9\t1.7\t14.1\t23390\t64375\t0.4251\t18220\tObama\t18220\t0.00104148\t18220.0\n19378\t-76.026702\t40.581508\tPort Clinton borough\tPA\tPennsylvania\tSchuylkill County\t281\t49.3\t22.6\t7.4\t26343\t120968\t0.4251\t19549\tObama\t19549\t0.000797427\t19549.0\n19379\t-76.32486899999999\t40.771341\tFountain Springs CDP\tPA\tPennsylvania\tSchuylkill County\t99\t50.3\t20.5\t10.9\t26936\t122917\t0.4251\t17921\tObama\t17921\t0.00028094400000000004\t17921.0\n19380\t-76.169857\t40.685953000000005\tPalo Alto borough\tPA\tPennsylvania\tSchuylkill County\t1003\t45.5\t13.0\t12.1\t19659\t90303\t0.4251\t17965\tObama\t17965\t0.0028463340000000003\t17965.0\n19381\t-76.060757\t40.763712\tTuscarora CDP\tPA\tPennsylvania\tSchuylkill County\t904\t50.1\t8.2\t11.1\t19127\t80968\t0.4251\t17952\tObama\t17952\t0.002565389\t17952.0\n19382\t-76.34475400000001\t40.782236\tAshland borough\tPA\tPennsylvania\tSchuylkill County\t3154\t43.7\t11.5\t12.0\t22439\t67320\t0.4251\t17921\tObama\t17921\t0.008950485\t17921.0\n19383\t-75.91589300000001\t40.819527\tCoaldale borough\tPA\tPennsylvania\tSchuylkill County\t2312\t46.5\t10.3\t16.8\t20335\t71920\t0.4251\t18218\tObama\t18218\t0.00656104\t18218.0\n19384\t-76.244848\t40.781515\tEnglewood CDP\tPA\tPennsylvania\tSchuylkill County\t481\t50.6\t20.2\t10.1\t26827\t126103\t0.4251\t17931\tObama\t17931\t0.001364991\t17931.0\n19385\t-76.552465\t40.58856\tTower City borough\tPA\tPennsylvania\tSchuylkill County\t1358\t43.4\t8.8\t9.8\t17373\t82927\t0.4251\t17980\tObama\t17980\t0.00385376\t17980.0\n19386\t-76.232925\t40.783277000000005\tFrackville borough\tPA\tPennsylvania\tSchuylkill County\t4294\t46.3\t14.7\t9.7\t23427\t93321\t0.4251\t17931\tObama\t17931\t0.012185600000000001\t17931.0\n19387\t-76.180578\t40.690869\tMechanicsville borough\tPA\tPennsylvania\tSchuylkill County\t491\t45.3\t13.2\t12.0\t19663\t90333\t0.4251\t17965\tObama\t17965\t0.00139337\t17965.0\n19388\t-76.38730600000001\t40.761977\tLavelle-Locustdale CDP\tPA\tPennsylvania\tSchuylkill County\t727\t43.3\t10.3\t7.2\t23258\t125490\t0.4251\t17943\tObama\t17943\t0.002063095\t17943.0\n19389\t-76.22903199999999\t40.607001000000004\tFriedensburg CDP\tPA\tPennsylvania\tSchuylkill County\t755\t45.9\t16.3\t6.2\t23053\t185000\t0.4251\t17933\tObama\t17933\t0.002142554\t17933.0\n19390\t-76.19965400000001\t40.561409000000005\tSummit Station CDP\tPA\tPennsylvania\tSchuylkill County\t211\t44.7\t18.8\t11.2\t19667\t161250\t0.4251\t17979\tObama\t17979\t0.00059878\t17979.0\n19391\t-76.12257\t40.90514\tOneida CDP\tPA\tPennsylvania\tSchuylkill County\t214\t47.8\t6.6\t8.0\t20311\t110577\t0.4251\t18242\tObama\t18242\t0.000607294\t18242.0\n19392\t-76.29228499999999\t40.693868\tForrestville CDP\tPA\tPennsylvania\tSchuylkill County\t422\t45.3\t5.6\t11.1\t18654\t88929\t0.4251\t17944\tObama\t17944\t0.00119756\t17944.0\n19393\t-76.260207\t40.690791\tMinersville borough\tPA\tPennsylvania\tSchuylkill County\t4478\t42.3\t11.0\t11.1\t21453\t74529\t0.4251\t17954\tObama\t17954\t0.012707758999999999\t17954.0\n19394\t-76.216722\t40.784987\tAltamont CDP\tPA\tPennsylvania\tSchuylkill County\t711\t31.9\t4.3\t16.5\t20758\t96897\t0.4251\t17934\tObama\t17934\t0.00201769\t17934.0\n19395\t-76.28272199999999\t40.79234\tGirardville borough\tPA\tPennsylvania\tSchuylkill County\t1647\t45.9\t8.0\t15.1\t16805\t51313\t0.4251\t17935\tObama\t17935\t0.00467389\t17935.0\n19396\t-76.087127\t40.727794\tMiddleport borough\tPA\tPennsylvania\tSchuylkill County\t439\t43.6\t6.2\t11.4\t21794\t76667\t0.4251\t17953\tObama\t17953\t0.001245803\t17953.0\n19397\t-76.538137\t40.647372\tValley View CDP\tPA\tPennsylvania\tSchuylkill County\t1793\t45.4\t12.3\t8.5\t25961\t127859\t0.4251\t17983\tObama\t17983\t0.005088212\t17983.0\n19398\t-75.99237099999999\t40.6894\tNew Ringgold borough\tPA\tPennsylvania\tSchuylkill County\t284\t43.1\t13.5\t8.3\t18383\t153125\t0.4251\t17960\tObama\t17960\t0.000805941\t17960.0\n19399\t-76.172849\t40.628429\tSchuylkill Haven borough\tPA\tPennsylvania\tSchuylkill County\t5366\t40.9\t17.3\t8.9\t23023\t108454\t0.4251\t17929\tObama\t17929\t0.015227743\t17929.0\n19400\t-76.138127\t40.812665\tMahanoy City borough\tPA\tPennsylvania\tSchuylkill County\t4190\t44.6\t8.3\t14.8\t19924\t48468\t0.4251\t17948\tObama\t17948\t0.011890466\t17948.0\n19401\t-75.934326\t40.803683\tTamaqua borough\tPA\tPennsylvania\tSchuylkill County\t7019\t43.3\t9.6\t10.4\t21870\t81507\t0.4251\t18218\tObama\t18218\t0.01991866\t18218.0\n19402\t-76.23447900000001\t40.856519\tRingtown borough\tPA\tPennsylvania\tSchuylkill County\t1003\t42.6\t18.2\t8.8\t21957\t124228\t0.4251\t17967\tObama\t17967\t0.0028463340000000003\t17967.0\n19403\t-76.264342\t40.720812\tHeckscherville CDP\tPA\tPennsylvania\tSchuylkill County\t74\t45.5\t6.7\t10.8\t18760\t88333\t0.4251\t17954\tObama\t17954\t0.00020999900000000002\t17954.0\n19404\t-76.31949\t40.706603\tBuck Run CDP\tPA\tPennsylvania\tSchuylkill County\t183\t32.8\t3.3\t9.2\t21668\t81429\t0.4251\t17923\tObama\t17923\t0.000519321\t17923.0\n19405\t-76.38610200000001\t40.553501000000004\tPine Grove borough\tPA\tPennsylvania\tSchuylkill County\t2112\t40.9\t9.6\t8.3\t22399\t99367\t0.4251\t17963\tObama\t17963\t0.005993476\t17963.0\n19406\t-76.339511\t40.750678\tGordon borough\tPA\tPennsylvania\tSchuylkill County\t762\t40.8\t14.2\t5.5\t21329\t98810\t0.4251\t17936\tObama\t17936\t0.002162419\t17936.0\n19407\t-76.694067\t40.658834999999996\tKlingerstown CDP\tPA\tPennsylvania\tSchuylkill County\t124\t42.3\t10.0\t4.6\t17857\t125000\t0.4251\t17867\tObama\t17867\t0.00035189\t17867.0\n19408\t-76.19026099999999\t40.721001\tSt. Clair borough\tPA\tPennsylvania\tSchuylkill County\t3123\t45.1\t12.1\t11.9\t21889\t80261\t0.4251\t17970\tObama\t17970\t0.008862512\t17970.0\n19409\t-76.103912\t40.654088\tOrwigsburg borough\tPA\tPennsylvania\tSchuylkill County\t3188\t46.3\t30.8\t8.8\t27677\t146678\t0.4251\t17961\tObama\t17961\t0.009046971\t17961.0\n19410\t-76.529605\t40.587418\tReinerton-Orwin-Muir CDP\tPA\tPennsylvania\tSchuylkill County\t1022\t44.1\t7.4\t6.6\t21743\t98103\t0.4251\t17957\tObama\t17957\t0.0029002520000000003\t17957.0\n19411\t-76.20913900000001\t40.679793\tPottsville city\tPA\tPennsylvania\tSchuylkill County\t15074\t43.0\t16.9\t10.9\t22336\t95512\t0.4251\t17901\tObama\t17901\t0.042777301\t17901.0\n19412\t-76.406161\t40.636355\tDonaldson CDP\tPA\tPennsylvania\tSchuylkill County\t292\t33.0\t3.6\t9.4\t21737\t80417\t0.4251\t17981\tObama\t17981\t0.000828643\t17981.0\n19413\t-76.223525\t40.796034000000006\tGilberton borough\tPA\tPennsylvania\tSchuylkill County\t836\t42.6\t7.1\t12.7\t15622\t43095\t0.4251\t17934\tObama\t17934\t0.002372418\t17934.0\n19414\t-76.166289\t40.696811\tPort Carbon borough\tPA\tPennsylvania\tSchuylkill County\t1904\t44.3\t12.0\t12.5\t18301\t93854\t0.4251\t17965\tObama\t17965\t0.00540321\t17965.0\n19415\t-76.12341500000001\t40.625547\tLandingville borough\tPA\tPennsylvania\tSchuylkill County\t164\t44.4\t13.8\t7.8\t20631\t183333\t0.4251\t179HH\tObama\t179HH\t0.00046540300000000003\t0.0\n19416\t-76.346466\t40.652883\tNewtown CDP\tPA\tPennsylvania\tSchuylkill County\t228\t42.6\t7.5\t11.2\t16001\t85000\t0.4251\t17923\tObama\t17923\t0.000647023\t17923.0\n19417\t-76.019613\t40.682317\tMcKeansburg CDP\tPA\tPennsylvania\tSchuylkill County\t151\t44.3\t21.5\t8.2\t23217\t182500\t0.4251\t17960\tObama\t17960\t0.00042851099999999996\t17960.0\n19418\t-77.045194\t40.788832\tMiddleburg borough\tPA\tPennsylvania\tSnyder County\t1503\t40.9\t16.0\t5.3\t18026\t129970\t0.3124\t17842\tObama\t17842\t0.0042652440000000005\t17842.0\n19419\t-77.21009699999999\t40.808389\tTroxelville CDP\tPA\tPennsylvania\tSnyder County\t191\t40.5\t10.6\t10.1\t16826\t138889\t0.3124\t17882\tObama\t17882\t0.000542024\t17882.0\n19420\t-76.941168\t40.762654\tFreeburg borough\tPA\tPennsylvania\tSnyder County\t571\t44.1\t7.3\t9.0\t22119\t131548\t0.3124\t17827\tObama\t17827\t0.001620395\t17827.0\n19421\t-77.060721\t40.861117\tPenns Creek CDP\tPA\tPennsylvania\tSnyder County\t673\t35.1\t11.0\t8.9\t15778\t136071\t0.3124\t17862\tObama\t17862\t0.001909853\t17862.0\n19422\t-76.864584\t40.80005\tSelinsgrove borough\tPA\tPennsylvania\tSnyder County\t5324\t29.4\t30.0\t10.0\t20706\t136515\t0.3124\t17870\tObama\t17870\t0.015108554\t17870.0\n19423\t-77.312373\t40.707764000000005\tMcClure borough\tPA\tPennsylvania\tSnyder County\t957\t42.5\t8.1\t10.6\t18044\t112308\t0.3124\t17841\tObama\t17841\t0.002715794\t17841.0\n19424\t-76.894194\t40.858885\tKratzerville CDP\tPA\tPennsylvania\tSnyder County\t384\t43.2\t8.1\t7.3\t19495\t147500\t0.3124\t17889\tObama\t17889\t0.0010897230000000001\t17889.0\n19425\t-76.898185\t40.690763000000004\tPort Trevorton CDP\tPA\tPennsylvania\tSnyder County\t447\t33.6\t14.1\t5.8\t15525\t143750\t0.3124\t17864\tObama\t17864\t0.001268506\t17864.0\n19426\t-77.027384\t40.721948\tMount Pleasant Mills CDP\tPA\tPennsylvania\tSnyder County\t552\t38.2\t9.7\t6.9\t17365\t135547\t0.3124\t17853\tObama\t17853\t0.0015664770000000001\t17853.0\n19427\t-76.837324\t40.83528\tHummels Wharf CDP\tPA\tPennsylvania\tSnyder County\t617\t47.8\t28.3\t13.3\t29290\t139951\t0.3124\t17870\tObama\t17870\t0.001750935\t17870.0\n19428\t-77.227547\t40.741344\tBeaver Springs CDP\tPA\tPennsylvania\tSnyder County\t672\t40.5\t12.3\t8.7\t17131\t129268\t0.3124\t17812\tObama\t17812\t0.001907015\t17812.0\n19429\t-76.967415\t40.796924\tKreamer CDP\tPA\tPennsylvania\tSnyder County\t767\t41.2\t12.8\t8.8\t19687\t141595\t0.3124\t17833\tObama\t17833\t0.002176608\t17833.0\n19430\t-77.08864\t40.771606\tPaxtonville CDP\tPA\tPennsylvania\tSnyder County\t218\t44.8\t8.5\t7.4\t21631\t128906\t0.3124\t17861\tObama\t17861\t0.000618645\t17861.0\n19431\t-76.822699\t40.854805999999996\tShamokin Dam borough\tPA\tPennsylvania\tSnyder County\t1621\t47.8\t18.8\t9.0\t26059\t148069\t0.3124\t17801\tObama\t17801\t0.004600106\t17801.0\n19432\t-77.16939\t40.752145\tBeavertown borough\tPA\tPennsylvania\tSnyder County\t867\t42.9\t11.3\t10.2\t19284\t128125\t0.3124\t17813\tObama\t17813\t0.00246039\t17813.0\n19433\t-79.084174\t39.753423\tSalisbury borough\tPA\tPennsylvania\tSomerset County\t831\t45.2\t9.8\t10.3\t19362\t100962\t0.278\t15558\tObama\t15558\t0.002358229\t15558.0\n19434\t-78.935627\t40.234905\tDavidsville CDP\tPA\tPennsylvania\tSomerset County\t1175\t46.3\t12.5\t6.0\t23655\t157849\t0.278\t15928\tObama\t15928\t0.0033344390000000002\t15928.0\n19435\t-78.92196899999999\t39.800502\tCallimont borough\tPA\tPennsylvania\tSomerset County\t51\t41.9\t14.3\t11.1\t18262\t118750\t0.278\t15552\tObama\t15552\t0.000144729\t15552.0\n19436\t-79.160484\t39.915279999999996\tRockwood borough\tPA\tPennsylvania\tSomerset County\t942\t43.5\t10.8\t5.4\t20566\t96296\t0.278\t15557\tObama\t15557\t0.0026732270000000002\t15557.0\n19437\t-79.062511\t39.865428\tGarrett borough\tPA\tPennsylvania\tSomerset County\t437\t39.1\t1.3\t6.4\t15613\t77000\t0.278\t15542\tObama\t15542\t0.001240127\t15542.0\n19438\t-79.077864\t40.004933\tSomerset borough\tPA\tPennsylvania\tSomerset County\t6590\t43.1\t25.7\t7.9\t23107\t140067\t0.278\t15501\tObama\t15501\t0.018701235\t15501.0\n19439\t-79.027855\t39.813465\tMeyersdale borough\tPA\tPennsylvania\tSomerset County\t2303\t44.3\t13.5\t13.7\t18143\t92929\t0.278\t15552\tObama\t15552\t0.0065355000000000005\t15552.0\n19440\t-79.334789\t39.745026\tAddison borough\tPA\tPennsylvania\tSomerset County\t208\t47.3\t14.9\t12.5\t17733\t101136\t0.278\t15411\tObama\t15411\t0.000590267\t15411.0\n19441\t-78.824454\t40.235125\tWindber borough\tPA\tPennsylvania\tSomerset County\t4046\t45.9\t15.6\t13.9\t20160\t93333\t0.278\t15963\tObama\t15963\t0.01148182\t15963.0\n19442\t-79.28961899999999\t40.034796\tSeven Springs borough\tPA\tPennsylvania\tSomerset County\t132\t47.5\t21.8\t13.2\t20217\t118182\t0.278\t15622\tObama\t15622\t0.000374592\t15622.0\n19443\t-78.94985799999999\t39.921637\tBerlin borough\tPA\tPennsylvania\tSomerset County\t2155\t44.1\t16.3\t12.4\t18069\t113715\t0.278\t15530\tObama\t15530\t0.006115501999999999\t15530.0\n19444\t-78.953999\t40.103245\tStoystown borough\tPA\tPennsylvania\tSomerset County\t448\t44.6\t16.5\t7.6\t21868\t114674\t0.278\t15563\tObama\t15563\t0.001271343\t15563.0\n19445\t-79.193229\t39.939912\tNew Centerville borough\tPA\tPennsylvania\tSomerset County\t193\t44.8\t17.4\t6.5\t17474\t111667\t0.278\t15557\tObama\t15557\t0.000547699\t15557.0\n19446\t-78.90679399999999\t40.017151\tShanksville borough\tPA\tPennsylvania\tSomerset County\t264\t37.9\t10.8\t6.0\t14864\t116964\t0.278\t15560\tObama\t15560\t0.000749185\t15560.0\n19447\t-78.804956\t40.109258000000004\tCentral City borough\tPA\tPennsylvania\tSomerset County\t1142\t44.4\t8.7\t8.8\t19667\t75952\t0.278\t15924\tObama\t15924\t0.003240791\t15924.0\n19448\t-79.06085300000001\t40.163697\tJennerstown borough\tPA\tPennsylvania\tSomerset County\t741\t43.4\t24.3\t5.1\t22718\t129688\t0.278\t15547\tObama\t15547\t0.002102825\t15547.0\n19449\t-78.929635\t40.203154999999995\tBenson borough\tPA\tPennsylvania\tSomerset County\t174\t46.8\t6.2\t8.6\t18963\t67000\t0.278\t15935\tObama\t15935\t0.000493781\t15935.0\n19450\t-78.772002\t39.984183\tNew Baltimore borough\tPA\tPennsylvania\tSomerset County\t162\t47.0\t12.2\t12.4\t16461\t101786\t0.278\t15553\tObama\t15553\t0.00045972699999999994\t15553.0\n19451\t-78.84906600000001\t39.730659\tWellersburg borough\tPA\tPennsylvania\tSomerset County\t175\t42.8\t9.0\t10.1\t14289\t101563\t0.278\t15545\tObama\t15545\t0.000496619\t15545.0\n19452\t-78.98088\t40.213715\tJerome CDP\tPA\tPennsylvania\tSomerset County\t1049\t45.8\t8.8\t13.8\t20771\t100721\t0.278\t15937\tObama\t15937\t0.0029768729999999997\t15937.0\n19453\t-79.332277\t39.815583000000004\tUrsina borough\tPA\tPennsylvania\tSomerset County\t253\t44.7\t8.6\t23.0\t18164\t91667\t0.278\t15485\tObama\t15485\t0.000717968\t15485.0\n19454\t-79.211123\t39.885682\tCasselman borough\tPA\tPennsylvania\tSomerset County\t95\t42.5\t7.5\t8.2\t17309\t97500\t0.278\t15551\tObama\t15551\t0.000269593\t15551.0\n19455\t-78.848966\t40.242492999999996\tPaint borough\tPA\tPennsylvania\tSomerset County\t1093\t53.4\t13.9\t12.4\t15488\t91500\t0.278\t15963\tObama\t15963\t0.0031017370000000002\t15963.0\n19456\t-79.002718\t40.044883\tFriedens CDP\tPA\tPennsylvania\tSomerset County\t1691\t37.5\t12.7\t5.1\t17354\t114619\t0.278\t15541\tObama\t15541\t0.0047987540000000006\t15541.0\n19457\t-79.027446\t40.161431\tBoswell borough\tPA\tPennsylvania\tSomerset County\t1260\t41.7\t13.1\t13.3\t16208\t88448\t0.278\t15546\tObama\t15546\t0.003575653\t15546.0\n19458\t-78.91341700000001\t40.151039000000004\tHooversville borough\tPA\tPennsylvania\tSomerset County\t717\t45.1\t10.7\t9.1\t20680\t73043\t0.278\t15936\tObama\t15936\t0.002034717\t15936.0\n19459\t-79.355389\t39.811298\tConfluence borough\tPA\tPennsylvania\tSomerset County\t832\t44.8\t8.5\t22.8\t18131\t91579\t0.278\t15424\tObama\t15424\t0.002361066\t15424.0\n19460\t-78.860644\t40.044534000000006\tIndian Lake borough\tPA\tPennsylvania\tSomerset County\t476\t46.7\t28.0\t7.8\t24026\t154167\t0.278\t15560\tObama\t15560\t0.0013508020000000001\t15560.0\n19461\t-76.603802\t41.491294\tForksville borough\tPA\tPennsylvania\tSullivan County\t129\t49.7\t19.8\t9.0\t18280\t128125\t0.3506\t18616\tObama\t18616\t0.000366079\t18616.0\n19462\t-76.583238\t41.410184\tEagles Mere borough\tPA\tPennsylvania\tSullivan County\t134\t50.4\t18.2\t8.2\t21238\t128571\t0.3506\t17731\tObama\t17731\t0.000380268\t17731.0\n19463\t-76.491658\t41.417671999999996\tLaporte borough\tPA\tPennsylvania\tSullivan County\t281\t42.7\t18.8\t4.3\t19002\t135577\t0.3506\t18626\tObama\t18626\t0.000797427\t18626.0\n19464\t-76.39795\t41.525723\tDushore borough\tPA\tPennsylvania\tSullivan County\t978\t44.5\t16.1\t11.2\t26705\t111039\t0.3506\t18614\tObama\t18614\t0.0027753879999999997\t18614.0\n19465\t-75.726721\t41.87611\tNew Milford borough\tPA\tPennsylvania\tSusquehanna County\t1267\t40.7\t16.0\t8.8\t16060\t112921\t0.3843\t18834\tObama\t18834\t0.003595518\t18834.0\n19466\t-75.482054\t41.715884\tUnion Dale borough\tPA\tPennsylvania\tSusquehanna County\t1638\t42.7\t23.1\t8.3\t21139\t140313\t0.3843\t18430\tObama\t18430\t0.004648349\t18430.0\n19467\t-75.51400500000001\t41.863457000000004\tThompson borough\tPA\tPennsylvania\tSusquehanna County\t271\t44.1\t17.8\t7.5\t17875\t131250\t0.3843\t18465\tObama\t18465\t0.000769049\t18465.0\n19468\t-75.603814\t41.943414000000004\tSusquehanna Depot borough\tPA\tPennsylvania\tSusquehanna County\t2289\t39.4\t15.0\t12.9\t16460\t83571\t0.3843\t18827\tObama\t18827\t0.00649577\t18827.0\n19469\t-75.76753599999999\t41.705349\tHop Bottom borough\tPA\tPennsylvania\tSusquehanna County\t301\t43.9\t13.2\t5.7\t19121\t114167\t0.3843\t18824\tObama\t18824\t0.0008541839999999999\t18824.0\n19470\t-75.469063\t41.651896\tForest City borough\tPA\tPennsylvania\tSusquehanna County\t1681\t47.5\t10.3\t10.9\t19878\t89435\t0.3843\t18421\tObama\t18421\t0.004770376\t18421.0\n19471\t-75.74574100000001\t41.973228000000006\tGreat Bend borough\tPA\tPennsylvania\tSusquehanna County\t620\t44.4\t9.7\t10.7\t23465\t90000\t0.3843\t18821\tObama\t18821\t0.0017594479999999998\t18821.0\n19472\t-75.74739\t41.961968\tHallstead borough\tPA\tPennsylvania\tSusquehanna County\t1233\t43.3\t10.1\t8.6\t17064\t96667\t0.3843\t18821\tObama\t18821\t0.003499032\t18821.0\n19473\t-76.04751800000001\t41.917703\tFriendsville borough\tPA\tPennsylvania\tSusquehanna County\t81\t46.3\t20.0\t8.5\t19790\t139063\t0.3843\t18818\tObama\t18818\t0.000229863\t18818.0\n19474\t-75.582314\t41.961628999999995\tLanesboro borough\tPA\tPennsylvania\tSusquehanna County\t537\t45.1\t11.5\t10.0\t19549\t126000\t0.3843\t18827\tObama\t18827\t0.001523909\t18827.0\n19475\t-75.876035\t41.833379\tMontrose borough\tPA\tPennsylvania\tSusquehanna County\t1432\t40.7\t32.6\t10.5\t22879\t122588\t0.3843\t18801\tObama\t18801\t0.004063758\t18801.0\n19476\t-75.609302\t41.950737\tOakland borough\tPA\tPennsylvania\tSusquehanna County\t577\t41.1\t12.3\t5.1\t18064\t97500\t0.3843\t18827\tObama\t18827\t0.0016374220000000001\t18827.0\n19477\t-76.129132\t41.989507\tLittle Meadows borough\tPA\tPennsylvania\tSusquehanna County\t259\t41.6\t14.6\t8.8\t19715\t116667\t0.3843\t18830\tObama\t18830\t0.000734995\t18830.0\n19478\t-77.10504300000001\t41.559264\tLiberty borough\tPA\tPennsylvania\tTioga County\t229\t42.0\t19.8\t8.4\t19109\t130357\t0.315\t16930\tObama\t16930\t0.000649861\t16930.0\n19479\t-77.133296\t41.907084000000005\tTioga borough\tPA\tPennsylvania\tTioga County\t612\t30.1\t14.4\t12.0\t16818\t57609\t0.315\t169HH\tObama\t169HH\t0.0017367460000000002\t0.0\n19480\t-77.313108\t41.98957\tElkland borough\tPA\tPennsylvania\tTioga County\t1832\t42.2\t11.6\t14.6\t20921\t86618\t0.315\t16920\tObama\t16920\t0.005198886\t16920.0\n19481\t-77.437665\t41.958718\tKnoxville borough\tPA\tPennsylvania\tTioga County\t634\t40.2\t14.9\t7.4\t17835\t73421\t0.315\t16928\tObama\t16928\t0.0017991779999999998\t16928.0\n19482\t-77.06845200000001\t41.679139\tBlossburg borough\tPA\tPennsylvania\tTioga County\t1458\t42.4\t17.9\t7.8\t18818\t104625\t0.315\t16912\tObama\t16912\t0.004137542\t16912.0\n19483\t-77.078547\t41.806149\tMansfield borough\tPA\tPennsylvania\tTioga County\t3340\t23.3\t41.6\t7.6\t18467\t146060\t0.315\t16933\tObama\t16933\t0.009478319\t16933.0\n19484\t-76.956795\t41.864201\tRoseville borough\tPA\tPennsylvania\tTioga County\t206\t43.9\t15.4\t5.7\t17076\t129688\t0.315\t16932\tObama\t16932\t0.000584591\t16932.0\n19485\t-77.129226\t41.995854\tLawrenceville borough\tPA\tPennsylvania\tTioga County\t606\t40.1\t12.2\t10.2\t17838\t107197\t0.315\t16929\tObama\t16929\t0.001719719\t16929.0\n19486\t-77.540603\t41.917856\tWestfield borough\tPA\tPennsylvania\tTioga County\t1250\t41.6\t11.4\t7.9\t19699\t82121\t0.315\t16950\tObama\t16950\t0.003547275\t16950.0\n19487\t-77.303377\t41.74609\tWellsboro borough\tPA\tPennsylvania\tTioga County\t3268\t45.7\t30.9\t9.0\t22829\t145735\t0.315\t16901\tObama\t16901\t0.009273996\t16901.0\n19488\t-76.890033\t40.964139\tLewisburg borough\tPA\tPennsylvania\tUnion County\t5572\t23.7\t46.9\t7.3\t20974\t164321\t0.3755\t17837\tObama\t17837\t0.015812333999999997\t17837.0\n19489\t-76.900251\t40.95665\tLinntown CDP\tPA\tPennsylvania\tUnion County\t1538\t49.3\t58.8\t5.7\t32832\t171619\t0.3755\t17837\tObama\t17837\t0.004364567\t17837.0\n19490\t-77.156351\t40.900129\tHartleton borough\tPA\tPennsylvania\tUnion County\t290\t40.5\t11.9\t9.3\t19091\t129861\t0.3755\t17829\tObama\t17829\t0.000822968\t17829.0\n19491\t-77.046351\t40.920190999999996\tMifflinburg borough\tPA\tPennsylvania\tUnion County\t3555\t39.7\t27.1\t9.2\t21844\t135103\t0.3755\t17844\tObama\t17844\t0.010088451\t17844.0\n19492\t-76.984522\t40.880962\tNew Berlin borough\tPA\tPennsylvania\tUnion County\t925\t39.1\t26.0\t7.9\t21110\t135887\t0.3755\t17855\tObama\t17855\t0.0026249840000000003\t17855.0\n19493\t-79.873773\t41.499849\tCooperstown borough\tPA\tPennsylvania\tVenango County\t436\t46.3\t10.4\t9.3\t22718\t102717\t0.3584\t16317\tObama\t16317\t0.00123729\t16317.0\n19494\t-79.707316\t41.377053000000004\tSeneca CDP\tPA\tPennsylvania\tVenango County\t912\t41.3\t16.7\t9.7\t19717\t106250\t0.3584\t16346\tObama\t16346\t0.002588092\t16346.0\n19495\t-79.930617\t41.368743\tPolk borough\tPA\tPennsylvania\tVenango County\t975\t48.9\t13.1\t11.2\t19130\t106250\t0.3584\t16342\tObama\t16342\t0.002766875\t16342.0\n19496\t-79.68475500000001\t41.470391\tRouseville borough\tPA\tPennsylvania\tVenango County\t437\t45.8\t6.3\t15.2\t16453\t63276\t0.3584\t16344\tObama\t16344\t0.001240127\t16344.0\n19497\t-79.697192\t41.181374\tEmlenton borough\tPA\tPennsylvania\tVenango County\t774\t45.3\t23.3\t14.5\t19869\t106686\t0.3584\t16373\tObama\t16373\t0.002196473\t16373.0\n19498\t-79.67659\t41.448471000000005\tHasson Heights CDP\tPA\tPennsylvania\tVenango County\t1493\t47.1\t21.2\t8.0\t24420\t113942\t0.3584\t16301\tObama\t16301\t0.004236865\t16301.0\n19499\t-79.874845\t41.201415999999995\tClintonville borough\tPA\tPennsylvania\tVenango County\t503\t40.6\t10.6\t10.5\t17339\t94545\t0.3584\t16372\tObama\t16372\t0.0014274239999999998\t16372.0\n19500\t-79.580269\t41.593519\tPleasantville borough\tPA\tPennsylvania\tVenango County\t795\t45.4\t16.1\t10.5\t17060\t95000\t0.3584\t16341\tObama\t16341\t0.002256067\t16341.0\n19501\t-79.818843\t41.438525\tSugarcreek borough\tPA\tPennsylvania\tVenango County\t5109\t46.2\t13.7\t11.2\t22237\t89425\t0.3584\t16323\tObama\t16323\t0.014498423\t16323.0\n19502\t-79.704302\t41.428319\tOil City\tPA\tPennsylvania\tVenango County\t10759\t39.6\t18.5\t12.2\t20323\t73579\t0.3584\t16301\tObama\t16301\t0.030532107000000003\t16301.0\n19503\t-79.704132\t41.411037\tWoodland Heights CDP\tPA\tPennsylvania\tVenango County\t1318\t42.9\t23.3\t9.2\t22071\t102431\t0.3584\t16301\tObama\t16301\t0.003740247\t16301.0\n19504\t-79.982573\t41.196805\tBarkeyville borough\tPA\tPennsylvania\tVenango County\t273\t41.3\t12.8\t8.1\t18836\t116667\t0.3584\t16038\tObama\t16038\t0.000774725\t16038.0\n19505\t-79.842057\t41.409669\tFranklin city\tPA\tPennsylvania\tVenango County\t6771\t41.2\t22.6\t11.0\t21919\t84049\t0.3584\t16323\tObama\t16323\t0.01921488\t16323.0\n19506\t-79.960123\t41.435786\tUtica borough\tPA\tPennsylvania\tVenango County\t199\t44.7\t16.6\t11.8\t18148\t98750\t0.3584\t16362\tObama\t16362\t0.000564726\t16362.0\n19507\t-79.316815\t41.852422\tYoungsville borough\tPA\tPennsylvania\tWarren County\t1714\t40.8\t13.4\t5.9\t21581\t101316\t0.4044\t16371\tObama\t16371\t0.004864024000000001\t16371.0\n19508\t-79.39994300000001\t41.68397\tTidioute borough\tPA\tPennsylvania\tWarren County\t731\t44.5\t10.6\t9.9\t17941\t79800\t0.4044\t16351\tObama\t16351\t0.002074447\t16351.0\n19509\t-79.029677\t41.700931\tSheffield CDP\tPA\tPennsylvania\tWarren County\t1027\t42.8\t15.8\t9.2\t22474\t85595\t0.4044\t16347\tObama\t16347\t0.002914441\t16347.0\n19510\t-79.095624\t41.780712\tClarendon borough\tPA\tPennsylvania\tWarren County\t479\t39.5\t4.0\t11.7\t14939\t67143\t0.4044\t16313\tObama\t16313\t0.001359316\t16313.0\n19511\t-79.501405\t41.993429\tBear Lake borough\tPA\tPennsylvania\tWarren County\t168\t34.3\t8.8\t9.3\t14277\t90000\t0.4044\t16402\tObama\t16402\t0.000476754\t16402.0\n19512\t-79.339505\t41.983732\tSugar Grove borough\tPA\tPennsylvania\tWarren County\t589\t36.2\t15.4\t5.4\t17661\t118243\t0.4044\t16350\tObama\t16350\t0.001671476\t16350.0\n19513\t-79.156728\t41.831196000000006\tWarren South CDP\tPA\tPennsylvania\tWarren County\t1734\t53.1\t21.1\t7.6\t28903\t138241\t0.4044\t16365\tObama\t16365\t0.00492078\t16365.0\n19514\t-79.1446\t41.843038\tWarren city\tPA\tPennsylvania\tWarren County\t9339\t41.5\t24.1\t10.5\t23119\t101003\t0.4044\t16365\tObama\t16365\t0.026502402\t16365.0\n19515\t-79.922168\t40.195679\tMonongahela city\tPA\tPennsylvania\tWashington County\t4659\t45.1\t14.9\t10.5\t21472\t84545\t0.4258\t15063\tObama\t15063\t0.013221403999999999\t15063.0\n19516\t-80.004362\t40.11779\tBentleyville borough\tPA\tPennsylvania\tWashington County\t2414\t41.3\t13.7\t14.9\t21573\t85556\t0.4258\t15314\tObama\t15314\t0.006850498000000001\t15314.0\n19517\t-80.009642\t40.266794\tGastonville CDP\tPA\tPennsylvania\tWashington County\t2976\t46.4\t17.5\t7.1\t27617\t135012\t0.4258\t15332\tObama\t15332\t0.008445353000000001\t15332.0\n19518\t-80.226713\t40.371452000000005\tMcDonald borough\tPA\tPennsylvania\tWashington County\t2193\t43.3\t16.8\t7.3\t24123\t107456\t0.4258\t15082\tObama\t15082\t0.00622334\t15082.0\n19519\t-80.225578\t40.238584\tMcGovern CDP\tPA\tPennsylvania\tWashington County\t2614\t47.8\t27.9\t8.4\t26283\t169743\t0.4258\t15342\tObama\t15342\t0.007418062\t15342.0\n19520\t-80.413267\t40.119944\tClaysville borough\tPA\tPennsylvania\tWashington County\t698\t41.4\t16.6\t6.6\t20552\t101210\t0.4258\t15323\tObama\t15323\t0.0019807979999999998\t15323.0\n19521\t-80.193281\t40.31836\tCecil-Bishop CDP\tPA\tPennsylvania\tWashington County\t2734\t42.7\t25.5\t9.5\t25521\t184052\t0.4258\t15321\tObama\t15321\t0.0077586\t15321.0\n19522\t-79.901176\t40.069884\tCoal Center borough\tPA\tPennsylvania\tWashington County\t146\t45.6\t17.8\t20.0\t23890\t106250\t0.4258\t15466\tObama\t15466\t0.00041432199999999995\t15466.0\n19523\t-80.030683\t40.062032\tBeallsville borough\tPA\tPennsylvania\tWashington County\t505\t43.1\t17.7\t8.4\t19712\t103125\t0.4258\t15313\tObama\t15313\t0.001433099\t15313.0\n19524\t-80.12049499999999\t40.280177\tThompsonville CDP\tPA\tPennsylvania\tWashington County\t3585\t47.0\t58.4\t6.5\t41876\t302656\t0.4258\t15055\tObama\t15055\t0.010173585\t15055.0\n19525\t-80.00607600000001\t39.996624\tFredericktown-Millsboro CDP\tPA\tPennsylvania\tWashington County\t1057\t43.9\t14.5\t12.1\t15358\t74722\t0.4258\t15333\tObama\t15333\t0.002999576\t15333.0\n19526\t-80.186924\t40.264301\tCanonsburg borough\tPA\tPennsylvania\tWashington County\t8842\t43.0\t17.2\t11.3\t24482\t119381\t0.4258\t15363\tObama\t15363\t0.025092006\t15363.0\n19527\t-80.232539\t40.174417\tEast Washington borough\tPA\tPennsylvania\tWashington County\t1839\t42.3\t56.0\t5.2\t34104\t237651\t0.4258\t15301\tObama\t15301\t0.005218751\t15301.0\n19528\t-80.033272\t40.027244\tDeemston borough\tPA\tPennsylvania\tWashington County\t828\t42.5\t17.2\t10.1\t20610\t120127\t0.4258\t15333\tObama\t15333\t0.002349715\t15333.0\n19529\t-80.508264\t40.104351\tWest Alexander borough\tPA\tPennsylvania\tWashington County\t315\t39.7\t10.8\t8.6\t19956\t94286\t0.4258\t15376\tObama\t15376\t0.000893913\t15376.0\n19530\t-80.392485\t40.381248\tBurgettstown borough\tPA\tPennsylvania\tWashington County\t1556\t44.9\t14.8\t10.3\t21293\t107661\t0.4258\t15021\tObama\t15021\t0.004415648\t15021.0\n19531\t-80.021188\t40.107521999999996\tEllsworth borough\tPA\tPennsylvania\tWashington County\t1076\t43.7\t11.4\t13.2\t18671\t61515\t0.4258\t15331\tObama\t15331\t0.0030534940000000003\t15331.0\n19532\t-79.906834\t40.177526\tWickerham Manor-Fisher CDP\tPA\tPennsylvania\tWashington County\t1755\t52.4\t27.5\t13.5\t25430\t133915\t0.4258\t15063\tObama\t15063\t0.004980374\t15063.0\n19533\t-80.065799\t40.100079\tCokeburg borough\tPA\tPennsylvania\tWashington County\t691\t45.0\t12.2\t16.8\t23010\t57568\t0.4258\t15324\tObama\t15324\t0.001960934\t15324.0\n19534\t-79.879958\t40.121995\tSpeers borough\tPA\tPennsylvania\tWashington County\t1222\t49.1\t26.8\t8.3\t23897\t125231\t0.4258\t15432\tObama\t15432\t0.003467816\t15432.0\n19535\t-79.95311\t40.206297\tNew Eagle borough\tPA\tPennsylvania\tWashington County\t2200\t45.1\t13.2\t9.7\t19938\t77778\t0.4258\t15067\tObama\t15067\t0.0062432040000000005\t15067.0\n19536\t-80.003035\t40.252655\tFinleyville borough\tPA\tPennsylvania\tWashington County\t487\t39.9\t21.1\t10.0\t23414\t105682\t0.4258\t15332\tObama\t15332\t0.0013820179999999998\t15332.0\n19537\t-80.211416\t40.250287\tHouston borough\tPA\tPennsylvania\tWashington County\t1321\t45.2\t11.5\t5.8\t23447\t118910\t0.4258\t15342\tObama\t15342\t0.00374876\t15342.0\n19538\t-79.915257\t40.069328999999996\tCalifornia borough\tPA\tPennsylvania\tWashington County\t5875\t24.5\t30.9\t13.0\t18029\t99149\t0.4258\t15423\tObama\t15423\t0.016672193000000002\t15423.0\n19539\t-80.112107\t40.012857000000004\tMarianna borough\tPA\tPennsylvania\tWashington County\t622\t34.5\t11.1\t16.3\t17765\t40571\t0.4258\t15345\tObama\t15345\t0.0017651239999999999\t15345.0\n19540\t-79.86250799999999\t40.178985\tDonora borough\tPA\tPennsylvania\tWashington County\t5501\t43.7\t14.7\t16.0\t20993\t59319\t0.4258\t15033\tObama\t15033\t0.015610849\t15033.0\n19541\t-79.858852\t40.112999\tDunlevy borough\tPA\tPennsylvania\tWashington County\t387\t50.3\t13.2\t25.8\t18021\t57750\t0.4258\t15432\tObama\t15432\t0.001098236\t15432.0\n19542\t-80.425425\t40.242915\tWest Middletown borough\tPA\tPennsylvania\tWashington County\t143\t45.8\t18.9\t12.2\t19514\t147917\t0.4258\t15379\tObama\t15379\t0.000405808\t15379.0\n19543\t-80.247087\t40.17411\tWashington city\tPA\tPennsylvania\tWashington County\t15216\t37.4\t16.6\t13.8\t19239\t95923\t0.4258\t15301\tObama\t15301\t0.043180271\t15301.0\n19544\t-79.893913\t40.115695\tTwilight borough\tPA\tPennsylvania\tWashington County\t237\t49.2\t26.5\t8.0\t23925\t125658\t0.4258\t15022\tObama\t15022\t0.000672563\t15022.0\n19545\t-79.881089\t40.080754999999996\tElco borough\tPA\tPennsylvania\tWashington County\t354\t47.4\t12.9\t22.0\t19294\t90000\t0.4258\t15434\tObama\t15434\t0.001004588\t15434.0\n19546\t-80.087458\t40.281473999999996\tMcMurray CDP\tPA\tPennsylvania\tWashington County\t4822\t47.1\t56.5\t5.4\t39153\t274255\t0.4258\t15367\tObama\t15367\t0.013683968999999999\t15367.0\n19547\t-79.953396\t40.188716\tBaidland CDP\tPA\tPennsylvania\tWashington County\t1536\t48.6\t19.0\t8.7\t25831\t134744\t0.4258\t15067\tObama\t15067\t0.0043588920000000005\t15067.0\n19548\t-79.962913\t40.030218\tCenterville borough\tPA\tPennsylvania\tWashington County\t3341\t44.4\t18.7\t9.3\t23638\t90688\t0.4258\t15450\tObama\t15450\t0.009481156999999999\t15450.0\n19549\t-79.90839799999999\t40.150233\tNorth Charleroi borough\tPA\tPennsylvania\tWashington County\t1350\t44.8\t20.8\t10.4\t22800\t71786\t0.4258\t15022\tObama\t15022\t0.003831057\t15022.0\n19550\t-79.90029\t40.138298999999996\tCharleroi borough\tPA\tPennsylvania\tWashington County\t4609\t43.6\t14.4\t16.8\t19782\t65145\t0.4258\t15022\tObama\t15022\t0.013079513000000001\t15022.0\n19551\t-79.891195\t40.031321000000005\tWest Brownsville borough\tPA\tPennsylvania\tWashington County\t1082\t47.8\t19.7\t11.2\t22177\t62059\t0.4258\t15417\tObama\t15417\t0.0030705209999999997\t15417.0\n19552\t-79.856087\t40.09255\tAllenport borough\tPA\tPennsylvania\tWashington County\t536\t49.9\t14.6\t21.0\t18819\t65357\t0.4258\t15483\tObama\t15483\t0.001521072\t15483.0\n19553\t-79.88023199999999\t40.098012\tLong Branch borough\tPA\tPennsylvania\tWashington County\t528\t47.8\t13.0\t21.9\t19259\t88636\t0.4258\t15434\tObama\t15434\t0.001498369\t15434.0\n19554\t-79.86438000000001\t40.07813\tRoscoe borough\tPA\tPennsylvania\tWashington County\t827\t48.6\t17.7\t6.7\t25343\t78269\t0.4258\t15477\tObama\t15477\t0.0023468770000000003\t15477.0\n19555\t-80.291299\t40.368644\tMidway borough\tPA\tPennsylvania\tWashington County\t959\t45.3\t10.0\t10.3\t19734\t109601\t0.4258\t15060\tObama\t15060\t0.00272147\t15060.0\n19556\t-80.302888\t40.198112\tWolfdale CDP\tPA\tPennsylvania\tWashington County\t2910\t45.6\t19.4\t7.2\t23193\t104076\t0.4258\t15301\tObama\t15301\t0.008258057\t15301.0\n19557\t-79.850592\t40.083339\tStockdale borough\tPA\tPennsylvania\tWashington County\t543\t48.4\t17.3\t8.8\t20757\t95556\t0.4258\t15483\tObama\t15483\t0.0015409360000000001\t15483.0\n19558\t-80.304576\t40.115409\tGreen Hills borough\tPA\tPennsylvania\tWashington County\t18\t35.0\t25.0\t0.0\t19389\t162500\t0.4258\t15301\tObama\t15301\t5.11e-05\t15301.0\n19559\t-75.252685\t41.57778\tHonesdale borough\tPA\tPennsylvania\tWayne County\t4894\t41.2\t22.3\t8.4\t21987\t131849\t0.3886\t18431\tObama\t18431\t0.013888292\t18431.0\n19560\t-75.327294\t41.589375\tPrompton borough\tPA\tPennsylvania\tWayne County\t269\t45.7\t14.0\t6.0\t19391\t159821\t0.3886\t184HH\tObama\t184HH\t0.0007633739999999999\t0.0\n19561\t-75.453818\t41.899556\tStarrucca borough\tPA\tPennsylvania\tWayne County\t218\t47.5\t16.5\t9.3\t22355\t125000\t0.3886\t18462\tObama\t18462\t0.000618645\t18462.0\n19562\t-75.405322\t41.586515999999996\tWaymart borough\tPA\tPennsylvania\tWayne County\t1858\t45.7\t15.5\t9.1\t18613\t132646\t0.3886\t18472\tObama\t18472\t0.00527267\t18472.0\n19563\t-75.177892\t41.476453\tHawley borough\tPA\tPennsylvania\tWayne County\t1236\t42.6\t19.9\t6.8\t18409\t133283\t0.3886\t18473\tObama\t18473\t0.003507546\t18473.0\n19564\t-75.287349\t41.614357\tBethany borough\tPA\tPennsylvania\tWayne County\t293\t48.8\t31.7\t3.7\t22964\t181818\t0.3886\t18431\tObama\t18431\t0.000831481\t18431.0\n19565\t-79.657651\t40.268229\tArona borough\tPA\tPennsylvania\tWestmoreland County\t396\t44.7\t21.0\t8.8\t26134\t139063\t0.3758\t15617\tObama\t15617\t0.001123777\t15617.0\n19566\t-79.356089\t40.314456\tMcChesneytown-Loyalhanna CDP\tPA\tPennsylvania\tWestmoreland County\t3200\t46.6\t15.2\t7.7\t23337\t126680\t0.3758\t15661\tObama\t15661\t0.009081024\t15661.0\n19567\t-79.67509799999999\t40.245517\tMadison borough\tPA\tPennsylvania\tWestmoreland County\t477\t47.7\t14.7\t9.0\t22870\t130208\t0.3758\t15663\tObama\t15663\t0.00135364\t15663.0\n19568\t-79.574076\t40.600004\tVandergrift borough\tPA\tPennsylvania\tWestmoreland County\t5384\t42.3\t15.6\t13.5\t21667\t78348\t0.3758\t15629\tObama\t15629\t0.015278824\t15629.0\n19569\t-79.764716\t40.578787\tArnold city\tPA\tPennsylvania\tWestmoreland County\t5196\t41.8\t12.4\t13.6\t21604\t76823\t0.3758\t15030\tObama\t15030\t0.014745313000000001\t15030.0\n19570\t-79.301115\t40.333399\tDerry borough\tPA\tPennsylvania\tWestmoreland County\t2855\t41.5\t15.9\t14.5\t20414\t106602\t0.3758\t15627\tObama\t15627\t0.008101976\t15627.0\n19571\t-79.02205500000001\t40.41312\tSeward borough\tPA\tPennsylvania\tWestmoreland County\t446\t46.1\t8.9\t26.9\t23272\t69250\t0.3758\t15954\tObama\t15954\t0.001265668\t15954.0\n19572\t-79.699536\t40.325047\tIrwin borough\tPA\tPennsylvania\tWestmoreland County\t4256\t38.8\t30.0\t9.3\t26230\t148830\t0.3758\t15642\tObama\t15642\t0.012077763\t15642.0\n19573\t-79.650198\t40.354749\tHarrison City CDP\tPA\tPennsylvania\tWestmoreland County\t155\t43.8\t35.5\t6.4\t25722\t191250\t0.3758\t15636\tObama\t15636\t0.00043986199999999996\t15636.0\n19574\t-79.655167\t40.4458\tMunicipality of Murrysville borough\tPA\tPennsylvania\tWestmoreland County\t18697\t46.6\t51.7\t5.4\t37233\t239172\t0.3758\t15668\tObama\t15668\t0.053058722999999995\t15668.0\n19575\t-79.622915\t40.416651\tExport borough\tPA\tPennsylvania\tWestmoreland County\t865\t45.4\t14.5\t8.2\t23206\t97667\t0.3758\t15632\tObama\t15632\t0.0024547139999999998\t15632.0\n19576\t-79.518276\t40.461979\tSlickville CDP\tPA\tPennsylvania\tWestmoreland County\t335\t41.2\t11.3\t6.1\t16769\t85625\t0.3758\t15684\tObama\t15684\t0.00095067\t15684.0\n19577\t-79.543529\t40.151027\tMount Pleasant borough\tPA\tPennsylvania\tWestmoreland County\t4456\t46.5\t16.7\t7.9\t23357\t115167\t0.3758\t15666\tObama\t15666\t0.012645327\t15666.0\n19578\t-79.589478\t40.103427\tScottdale borough\tPA\tPennsylvania\tWestmoreland County\t4483\t45.4\t22.1\t16.2\t24403\t110010\t0.3758\t15683\tObama\t15683\t0.012721948\t15683.0\n19579\t-79.469301\t40.363757\tCrabtree CDP\tPA\tPennsylvania\tWestmoreland County\t299\t45.5\t22.6\t12.2\t22011\t136111\t0.3758\t15624\tObama\t15624\t0.000848508\t15624.0\n19580\t-79.382786\t40.312628000000004\tLatrobe city\tPA\tPennsylvania\tWestmoreland County\t8613\t44.3\t21.5\t8.2\t26389\t116106\t0.3758\t15650\tObama\t15650\t0.024442145\t15650.0\n19581\t-79.741398\t40.153304\tSmithton borough\tPA\tPennsylvania\tWestmoreland County\t427\t44.6\t16.7\t9.2\t18917\t106250\t0.3758\t15479\tObama\t15479\t0.001211749\t15479.0\n19582\t-79.605558\t40.325296\tGrapeville CDP\tPA\tPennsylvania\tWestmoreland County\t691\t45.9\t21.7\t20.1\t24585\t121324\t0.3758\t15634\tObama\t15634\t0.001960934\t15634.0\n19583\t-79.563099\t40.597221000000005\tEast Vandergrift borough\tPA\tPennsylvania\tWestmoreland County\t683\t45.1\t12.3\t6.5\t15777\t66538\t0.3758\t15629\tObama\t15629\t0.0019382310000000001\t15629.0\n19584\t-79.074962\t40.379232\tNew Florence borough\tPA\tPennsylvania\tWestmoreland County\t825\t43.7\t10.4\t15.6\t19818\t85750\t0.3758\t15944\tObama\t15944\t0.002341202\t15944.0\n19585\t-79.654697\t40.31235\tAdamsburg borough\tPA\tPennsylvania\tWestmoreland County\t206\t46.1\t17.5\t12.3\t24076\t116346\t0.3758\t15611\tObama\t15611\t0.000584591\t15611.0\n19586\t-79.88265\t40.151821999999996\tMonessen city\tPA\tPennsylvania\tWestmoreland County\t7940\t47.1\t19.4\t16.0\t21758\t80033\t0.3758\t15062\tObama\t15062\t0.022532292000000002\t15062.0\n19587\t-79.18496800000001\t40.21107\tLaurel Mountain borough\tPA\tPennsylvania\tWestmoreland County\t173\t50.4\t33.8\t8.0\t25199\t185417\t0.3758\t15655\tObama\t15655\t0.000490943\t15655.0\n19588\t-79.713626\t40.263171\tHerminie CDP\tPA\tPennsylvania\tWestmoreland County\t811\t43.7\t12.9\t12.6\t22030\t97414\t0.3758\t15637\tObama\t15637\t0.002301472\t15637.0\n19589\t-79.152051\t40.395241999999996\tBolivar borough\tPA\tPennsylvania\tWestmoreland County\t463\t48.4\t9.7\t28.3\t20406\t77381\t0.3758\t15949\tObama\t15949\t0.001313911\t15949.0\n19590\t-79.751964\t40.571099\tNew Kensington city\tPA\tPennsylvania\tWestmoreland County\t13738\t44.6\t18.9\t12.8\t21545\t105640\t0.3758\t15068\tObama\t15068\t0.038985973\t15068.0\n19591\t-79.57610799999999\t40.580161\tOklahoma borough\tPA\tPennsylvania\tWestmoreland County\t798\t45.9\t16.8\t8.4\t25937\t109115\t0.3758\t15613\tObama\t15613\t0.00226458\t15613.0\n19592\t-79.850588\t40.135277\tLynnwood-Pricedale CDP\tPA\tPennsylvania\tWestmoreland County\t2058\t47.3\t18.0\t10.7\t22794\t112973\t0.3758\t15072\tObama\t15072\t0.005840234000000001\t15072.0\n19593\t-79.469915\t40.527248\tAvonmore borough\tPA\tPennsylvania\tWestmoreland County\t820\t45.2\t6.9\t8.0\t20375\t87750\t0.3758\t15618\tObama\t15618\t0.0023270129999999997\t15618.0\n19594\t-79.41738000000001\t40.394358000000004\tNew Alexandria borough\tPA\tPennsylvania\tWestmoreland County\t496\t46.7\t21.2\t6.6\t26976\t143561\t0.3758\t15670\tObama\t15670\t0.0014075589999999999\t15670.0\n19595\t-79.573089\t40.414467\tDelmont borough\tPA\tPennsylvania\tWestmoreland County\t2393\t44.4\t29.2\t5.8\t27602\t167975\t0.3758\t15626\tObama\t15626\t0.006790904\t15626.0\n19596\t-79.71126600000001\t40.338919\tNorth Irwin borough\tPA\tPennsylvania\tWestmoreland County\t872\t39.8\t11.7\t14.9\t25545\t107276\t0.3758\t15642\tObama\t15642\t0.0024745789999999998\t15642.0\n19597\t-79.589073\t40.631723\tHyde Park borough\tPA\tPennsylvania\tWestmoreland County\t504\t41.1\t10.4\t7.3\t23546\t119758\t0.3758\t15641\tObama\t15641\t0.0014302610000000002\t15641.0\n19598\t-79.75539300000001\t40.384597\tTrafford borough\tPA\tPennsylvania\tWestmoreland County\t3254\t45.5\t25.9\t5.2\t26198\t119167\t0.3758\t15085\tObama\t15085\t0.009234266999999999\t15085.0\n19599\t-79.61692\t40.633762\tWest Leechburg borough\tPA\tPennsylvania\tWestmoreland County\t1279\t46.1\t19.3\t9.9\t26763\t126124\t0.3758\t15656\tObama\t15656\t0.003629572\t15656.0\n19600\t-79.613665\t40.327698999999996\tJeannette city\tPA\tPennsylvania\tWestmoreland County\t9893\t42.3\t16.2\t10.3\t21609\t95323\t0.3758\t15644\tObama\t15644\t0.028074555\t15644.0\n19601\t-79.642083\t40.329178000000006\tPenn borough\tPA\tPennsylvania\tWestmoreland County\t356\t36.5\t10.3\t29.3\t19988\t68750\t0.3758\t15675\tObama\t15675\t0.0010102639999999999\t15675.0\n19602\t-79.387361\t40.293925\tLawson Heights CDP\tPA\tPennsylvania\tWestmoreland County\t2222\t48.1\t23.2\t12.4\t26956\t160000\t0.3758\t15650\tObama\t15650\t0.006305636\t15650.0\n19603\t-79.581554\t40.2439\tYoungwood borough\tPA\tPennsylvania\tWestmoreland County\t3106\t42.2\t17.1\t12.4\t22180\t118540\t0.3758\t15697\tObama\t15697\t0.008814269\t15697.0\n19604\t-79.769826\t40.209340000000005\tWest Newton borough\tPA\tPennsylvania\tWestmoreland County\t2890\t44.9\t14.4\t8.7\t21441\t100114\t0.3758\t15089\tObama\t15089\t0.0082013\t15089.0\n19605\t-79.237589\t40.24492\tLigonier borough\tPA\tPennsylvania\tWestmoreland County\t1676\t49.7\t35.7\t12.8\t23034\t166875\t0.3758\t15658\tObama\t15658\t0.004756187\t15658.0\n19606\t-79.365718\t40.279928000000005\tYoungstown borough\tPA\tPennsylvania\tWestmoreland County\t375\t49.1\t17.1\t13.3\t19883\t125543\t0.3758\t15696\tObama\t15696\t0.001064183\t15696.0\n19607\t-79.668966\t40.346181\tManor borough\tPA\tPennsylvania\tWestmoreland County\t3207\t41.3\t23.4\t8.6\t22513\t162162\t0.3758\t15665\tObama\t15665\t0.009100889000000001\t15665.0\n19608\t-79.547875\t40.291723\tSouthwest Greensburg borough\tPA\tPennsylvania\tWestmoreland County\t2305\t43.2\t27.9\t5.2\t28222\t122691\t0.3758\t15601\tObama\t15601\t0.006541175\t15601.0\n19609\t-79.381109\t40.112623\tDonegal borough\tPA\tPennsylvania\tWestmoreland County\t157\t43.3\t15.9\t11.6\t21280\t108929\t0.3758\t15628\tObama\t15628\t0.00044553800000000004\t15628.0\n19610\t-79.614423\t40.203522\tHunker borough\tPA\tPennsylvania\tWestmoreland County\t296\t43.9\t23.5\t8.0\t26017\t158088\t0.3758\t15639\tObama\t15639\t0.000839995\t15639.0\n19611\t-79.60848\t40.223742\tNew Stanton borough\tPA\tPennsylvania\tWestmoreland County\t1910\t45.6\t20.1\t10.2\t26504\t142708\t0.3758\t15672\tObama\t15672\t0.005420236\t15672.0\n19612\t-79.54448199999999\t40.311211\tGreensburg city\tPA\tPennsylvania\tWestmoreland County\t15317\t41.7\t34.3\t12.1\t25043\t130203\t0.3758\t15601\tObama\t15601\t0.043466890999999994\t15601.0\n19613\t-79.547335\t40.277908000000004\tSouth Greensburg borough\tPA\tPennsylvania\tWestmoreland County\t2178\t46.0\t18.6\t6.9\t27707\t112240\t0.3758\t15601\tObama\t15601\t0.006180771999999999\t15601.0\n19614\t-79.86437\t40.132283\tNorth Belle Vernon borough\tPA\tPennsylvania\tWestmoreland County\t1979\t44.2\t20.8\t7.4\t22035\t95944\t0.3758\t15072\tObama\t15072\t0.0056160459999999995\t15072.0\n19615\t-79.713442\t40.582681\tLower Burrell city\tPA\tPennsylvania\tWestmoreland County\t12050\t46.8\t23.1\t7.5\t26305\t142873\t0.3758\t15068\tObama\t15068\t0.034195733\t15068.0\n19616\t-79.80135899999999\t40.236268\tSutersville borough\tPA\tPennsylvania\tWestmoreland County\t620\t46.8\t7.5\t9.6\t21653\t111667\t0.3758\t15083\tObama\t15083\t0.0017594479999999998\t15083.0\n19617\t-79.492122\t40.210518\tCalumet-Norvelt CDP\tPA\tPennsylvania\tWestmoreland County\t1684\t46.7\t17.2\t9.3\t25804\t117872\t0.3758\t15674\tObama\t15674\t0.004778889000000001\t15674.0\n19618\t-76.158976\t41.645786\tLaceyville borough\tPA\tPennsylvania\tWyoming County\t375\t36.9\t11.2\t8.7\t21795\t115341\t0.4263\t18623\tObama\t18623\t0.001064183\t18623.0\n19619\t-75.78556\t41.627538\tNicholson borough\tPA\tPennsylvania\tWyoming County\t656\t35.6\t22.3\t15.3\t20274\t135969\t0.4263\t18446\tObama\t18446\t0.00186161\t18446.0\n19620\t-76.044907\t41.612522999999996\tMeshoppen borough\tPA\tPennsylvania\tWyoming County\t438\t35.8\t11.3\t9.7\t16625\t129167\t0.4263\t18630\tObama\t18630\t0.001242965\t18630.0\n19621\t-75.782547\t41.56012\tFactoryville borough\tPA\tPennsylvania\tWyoming County\t1135\t24.5\t25.5\t7.2\t21651\t146154\t0.4263\t18419\tObama\t18419\t0.003220926\t18419.0\n19622\t-75.948148\t41.5416\tTunkhannock borough\tPA\tPennsylvania\tWyoming County\t1774\t43.2\t28.2\t9.2\t22870\t147290\t0.4263\t18657\tObama\t18657\t0.005034293\t18657.0\n19623\t-76.69645799999999\t39.759657000000004\tRailroad borough\tPA\tPennsylvania\tYork County\t314\t39.6\t28.8\t5.9\t29418\t199219\t0.3868\t17355\tObama\t17355\t0.0008910760000000001\t17355.0\n19624\t-76.686489\t39.912554\tSpry CDP\tPA\tPennsylvania\tYork County\t5250\t44.3\t36.2\t11.5\t32114\t183333\t0.3868\t17407\tObama\t17407\t0.014898556\t17407.0\n19625\t-76.69667\t39.735234999999996\tNew Freedom borough\tPA\tPennsylvania\tYork County\t3930\t43.4\t38.8\t8.2\t30574\t238703\t0.3868\t17355\tObama\t17355\t0.011152633\t17355.0\n19626\t-76.452265\t39.73103\tFawn Grove borough\tPA\tPennsylvania\tYork County\t468\t40.8\t10.0\t6.7\t24382\t210366\t0.3868\t17321\tObama\t17321\t0.0013280999999999998\t17321.0\n19627\t-76.71175\t39.882256\tJacobus borough\tPA\tPennsylvania\tYork County\t1305\t45.3\t26.0\t6.6\t30638\t188075\t0.3868\t17407\tObama\t17407\t0.003703355\t17407.0\n19628\t-76.327216\t39.726529\tDelta borough\tPA\tPennsylvania\tYork County\t847\t33.9\t18.6\t11.6\t24489\t144420\t0.3868\t17314\tObama\t17314\t0.002403634\t17314.0\n19629\t-76.794718\t40.156655\tValley Green CDP\tPA\tPennsylvania\tYork County\t3729\t34.6\t27.0\t10.1\t28357\t149353\t0.3868\t17319\tObama\t17319\t0.010582231000000001\t17319.0\n19630\t-76.637038\t39.909477\tYoe borough\tPA\tPennsylvania\tYork County\t1056\t32.3\t15.9\t6.8\t22226\t136232\t0.3868\t17313\tObama\t17313\t0.002996738\t17313.0\n19631\t-76.69580500000001\t39.934527\tTyler Run-Queens Gate CDP\tPA\tPennsylvania\tYork County\t3328\t47.9\t34.6\t10.4\t32435\t184904\t0.3868\t17403\tObama\t17403\t0.009444265\t17403.0\n19632\t-76.67589699999999\t39.968489\tEast York CDP\tPA\tPennsylvania\tYork County\t9170\t48.5\t33.6\t8.8\t31671\t178024\t0.3868\t17402\tObama\t17402\t0.026022811\t17402.0\n19633\t-76.604086\t40.002687\tHallam borough\tPA\tPennsylvania\tYork County\t2457\t38.6\t18.5\t9.0\t25994\t153161\t0.3868\t17406\tObama\t17406\t0.006972524\t17406.0\n19634\t-76.792004\t39.973383\tShiloh CDP\tPA\tPennsylvania\tYork County\t12017\t46.4\t26.6\t7.1\t28394\t183699\t0.3868\t17404\tObama\t17404\t0.034102085\t17404.0\n19635\t-76.84860400000001\t40.003303\tDover borough\tPA\tPennsylvania\tYork County\t1947\t35.6\t13.7\t8.9\t23485\t144555\t0.3868\t17315\tObama\t17315\t0.005525235999999999\t17315.0\n19636\t-76.731382\t39.96492\tYork city\tPA\tPennsylvania\tYork County\t43040\t32.2\t13.5\t18.3\t16958\t87981\t0.3868\t17401\tObama\t17401\t0.122139779\t17401.0\n19637\t-76.584446\t39.975605\tYorkana borough\tPA\tPennsylvania\tYork County\t380\t44.2\t22.6\t6.9\t25776\t171296\t0.3868\t17406\tObama\t17406\t0.001078372\t17406.0\n19638\t-76.94068\t40.051235999999996\tWellsville borough\tPA\tPennsylvania\tYork County\t303\t45.3\t22.5\t10.9\t26256\t182292\t0.3868\t17365\tObama\t17365\t0.00085986\t17365.0\n19639\t-77.03365699999999\t40.110347\tDillsburg borough\tPA\tPennsylvania\tYork County\t2380\t37.5\t27.6\t6.7\t23351\t170536\t0.3868\t17019\tObama\t17019\t0.006754011999999999\t17019.0\n19640\t-76.640679\t39.97455\tStonybrook-Wilshire CDP\tPA\tPennsylvania\tYork County\t6236\t45.7\t35.9\t5.6\t33231\t212162\t0.3868\t17402\tObama\t17402\t0.017696646\t17402.0\n19641\t-76.728746\t39.940633\tGrantley CDP\tPA\tPennsylvania\tYork County\t3698\t23.0\t48.2\t12.1\t28162\t261290\t0.3868\t174HH\tObama\t174HH\t0.010494258999999999\t0.0\n19642\t-76.860875\t40.135719\tLewisberry borough\tPA\tPennsylvania\tYork County\t476\t40.0\t22.8\t10.5\t24592\t163333\t0.3868\t17339\tObama\t17339\t0.0013508020000000001\t17339.0\n19643\t-76.99061999999999\t39.787939\tPennville CDP\tPA\tPennsylvania\tYork County\t2069\t41.3\t13.6\t12.1\t25479\t148934\t0.3868\t17331\tObama\t17331\t0.00587145\t17331.0\n19644\t-76.573525\t39.820029\tCross Roads borough\tPA\tPennsylvania\tYork County\t551\t41.1\t19.3\t9.5\t23109\t220098\t0.3868\t17322\tObama\t17322\t0.001563639\t17322.0\n19645\t-76.968571\t39.785946\tParkville CDP\tPA\tPennsylvania\tYork County\t7055\t38.1\t15.4\t10.2\t24765\t136342\t0.3868\t17331\tObama\t17331\t0.020020821\t17331.0\n19646\t-76.731003\t40.008451\tEmigsville CDP\tPA\tPennsylvania\tYork County\t2603\t44.2\t17.8\t6.6\t30337\t147705\t0.3868\t17318\tObama\t17318\t0.007386846\t17318.0\n19647\t-76.67977900000001\t39.771352\tShrewsbury borough\tPA\tPennsylvania\tYork County\t3763\t42.7\t31.7\t5.5\t27255\t220563\t0.3868\t17361\tObama\t17361\t0.010678716999999999\t17361.0\n19648\t-76.98389499999999\t39.811688000000004\tHanover borough\tPA\tPennsylvania\tYork County\t15466\t42.5\t19.2\t10.5\t26748\t154872\t0.3868\t17331\tObama\t17331\t0.043889726\t17331.0\n19649\t-76.607138\t39.898603\tRed Lion borough\tPA\tPennsylvania\tYork County\t6476\t35.5\t18.2\t9.2\t24063\t131842\t0.3868\t17356\tObama\t17356\t0.018377723000000002\t17356.0\n19650\t-76.765718\t39.854265999999996\tSeven Valleys borough\tPA\tPennsylvania\tYork County\t451\t39.8\t9.2\t6.0\t22201\t153125\t0.3868\t17360\tObama\t17360\t0.001279857\t17360.0\n19651\t-76.640783\t39.899675\tDallastown borough\tPA\tPennsylvania\tYork County\t4316\t38.4\t12.4\t11.6\t24714\t129026\t0.3868\t17313\tObama\t17313\t0.012248031999999999\t17313.0\n19652\t-76.59248000000001\t39.752790000000005\tStewartstown borough\tPA\tPennsylvania\tYork County\t2051\t36.5\t26.4\t8.8\t26150\t178916\t0.3868\t17363\tObama\t17363\t0.005820369000000001\t17363.0\n19653\t-76.70803599999999\t39.855779\tLoganville borough\tPA\tPennsylvania\tYork County\t1082\t43.4\t20.8\t8.8\t26878\t173269\t0.3868\t17407\tObama\t17407\t0.0030705209999999997\t17407.0\n19654\t-76.705626\t40.061534\tMount Wolf borough\tPA\tPennsylvania\tYork County\t1606\t39.0\t16.1\t7.5\t24347\t132391\t0.3868\t17347\tObama\t17347\t0.004557539\t17347.0\n19655\t-76.760643\t39.953268\tWest York borough\tPA\tPennsylvania\tYork County\t4388\t36.6\t10.4\t10.5\t23769\t114860\t0.3868\t17404\tObama\t17404\t0.012452355\t17404.0\n19656\t-76.730787\t39.793507\tGlen Rock borough\tPA\tPennsylvania\tYork County\t1981\t38.1\t22.2\t8.6\t25597\t168194\t0.3868\t17327\tObama\t17327\t0.005621721999999999\t17327.0\n19657\t-76.79113000000001\t39.90383\tNew Salem borough\tPA\tPennsylvania\tYork County\t767\t46.4\t20.6\t6.2\t28870\t185714\t0.3868\t17360\tObama\t17360\t0.002176608\t17360.0\n19658\t-76.75155699999999\t40.153763\tGoldsboro borough\tPA\tPennsylvania\tYork County\t905\t35.4\t19.4\t6.8\t29406\t169336\t0.3868\t17370\tObama\t17370\t0.002568227\t17370.0\n19659\t-76.521178\t39.970924\tEast Prospect borough\tPA\tPennsylvania\tYork County\t844\t38.3\t16.3\t8.8\t23016\t171726\t0.3868\t17317\tObama\t17317\t0.00239512\t17317.0\n19660\t-77.02946999999999\t40.076002\tFranklintown borough\tPA\tPennsylvania\tYork County\t609\t34.2\t27.4\t11.5\t24512\t174342\t0.3868\t17019\tObama\t17019\t0.0017282320000000001\t17019.0\n19661\t-76.864076\t39.880499\tSpring Grove borough\tPA\tPennsylvania\tYork County\t2216\t35.7\t17.4\t10.2\t23595\t148180\t0.3868\t17362\tObama\t17362\t0.0062886090000000006\t17362.0\n19662\t-76.8411\t39.815689\tJefferson borough\tPA\tPennsylvania\tYork County\t762\t43.2\t17.9\t7.1\t24739\t175595\t0.3868\t17311\tObama\t17311\t0.002162419\t17311.0\n19663\t-76.701126\t39.949875\tValley View CDP\tPA\tPennsylvania\tYork County\t2822\t45.4\t37.7\t7.3\t33123\t157789\t0.3868\t17403\tObama\t17403\t0.008008328\t17403.0\n19664\t-76.715339\t40.11076\tYork Haven borough\tPA\tPennsylvania\tYork County\t996\t28.8\t6.1\t11.8\t18110\t88947\t0.3868\t17345\tObama\t17345\t0.0028264690000000003\t17345.0\n19665\t-76.53117900000001\t40.02388\tWrightsville borough\tPA\tPennsylvania\tYork County\t2241\t39.8\t10.8\t11.7\t25194\t126397\t0.3868\t17368\tObama\t17368\t0.006359555\t17368.0\n19666\t-76.719769\t40.061245\tManchester borough\tPA\tPennsylvania\tYork County\t2474\t40.6\t16.6\t8.3\t27456\t146725\t0.3868\t17345\tObama\t17345\t0.007020767\t17345.0\n19667\t-76.73128100000001\t39.978334999999994\tNorth York borough\tPA\tPennsylvania\tYork County\t1797\t37.9\t13.3\t12.8\t26633\t103448\t0.3868\t17401\tObama\t17401\t0.005099563\t17401.0\n19668\t-76.583904\t39.916457\tWindsor borough\tPA\tPennsylvania\tYork County\t1384\t32.9\t7.0\t9.2\t19250\t125512\t0.3868\t17356\tObama\t17356\t0.0039275429999999995\t17356.0\n19669\t-76.651002\t39.989369\tSpringetts Manor-Yorklyn CDP\tPA\tPennsylvania\tYork County\t4370\t39.0\t16.8\t6.0\t20922\t164370\t0.3868\t17402\tObama\t17402\t0.012401273999999999\t17402.0\n19670\t-76.831587\t39.984159000000005\tWeigelstown CDP\tPA\tPennsylvania\tYork County\t12656\t40.2\t16.2\t10.1\t24486\t151209\t0.3868\t17315\tObama\t17315\t0.035915452\t17315.0\n19671\t-76.617427\t39.840723\tWinterstown borough\tPA\tPennsylvania\tYork County\t594\t44.8\t11.9\t10.8\t22756\t167411\t0.3868\t17356\tObama\t17356\t0.001685665\t17356.0\n19672\t-76.368391\t39.758458000000005\tSusquehanna Trails CDP\tPA\tPennsylvania\tYork County\t2357\t37.4\t10.3\t8.4\t19624\t161909\t0.3868\t17314\tObama\t17314\t0.006688741999999999\t17314.0\n19673\t-76.561583\t39.857003000000006\tFelton borough\tPA\tPennsylvania\tYork County\t503\t42.3\t14.6\t10.0\t23338\t182813\t0.3868\t17322\tObama\t17322\t0.0014274239999999998\t17322.0\n19674\t-71.269787\t41.682204999999996\tBristol CDP\tRI\tRhode Island\tBristol County\t22498\t39.8\t27.8\t10.8\t28525\t267787\t0.6068\t2809\tObama\t02809\t0.12057613699999999\t2809.0\n19675\t-71.32202\t41.73923\tBarrington CDP\tRI\tRhode Island\tBristol County\t16641\t43.6\t55.0\t12.5\t44980\t355220\t0.6068\t2806\tObama\t02806\t0.08918603900000001\t2806.0\n19676\t-71.43417600000001\t41.710829\tWarwick city\tRI\tRhode Island\tKent County\t85375\t43.4\t30.9\t12.2\t28044\t218621\t0.5773\t2886\tObama\t02886\t0.457560126\t2886.0\n19677\t-71.52555\t41.698615999999994\tWest Warwick CDP\tRI\tRhode Island\tKent County\t30150\t38.7\t22.0\t14.8\t25117\t204590\t0.5773\t2893\tObama\t02893\t0.161586387\t2893.0\n19678\t-71.287454\t41.515731\tNewport East CDP\tRI\tRhode Island\tNewport County\t10659\t44.1\t43.9\t12.9\t33060\t256667\t0.5947\t2842\tObama\t02842\t0.057126012999999996\t2842.0\n19679\t-71.303527\t41.558904\tMelville CDP\tRI\tRhode Island\tNewport County\t2398\t25.4\t58.1\t21.3\t24205\t215000\t0.5947\t2842\tObama\t02842\t0.012851878999999998\t2842.0\n19680\t-71.196244\t41.647679\tTiverton CDP\tRI\tRhode Island\tNewport County\t6924\t45.8\t28.3\t14.5\t30084\t223086\t0.5947\t2878\tObama\t02878\t0.037108595\t2878.0\n19681\t-71.337213\t41.479888\tNewport city\tRI\tRhode Island\tNewport County\t23682\t36.5\t49.0\t15.4\t33968\t285213\t0.5947\t2840\tObama\t02840\t0.126921686\t2840.0\n19682\t-71.39366600000001\t41.890029\tCentral Falls city\tRI\tRhode Island\tProvidence County\t18822\t30.5\t8.1\t18.2\t13383\t172069\t0.6653\t2863\tObama\t02863\t0.100874925\t2863.0\n19683\t-71.460155\t41.973351\tCumberland Hill CDP\tRI\tRhode Island\tProvidence County\t7815\t40.7\t41.8\t10.4\t32082\t265075\t0.6653\t2838\tObama\t02838\t0.041883835\t2838.0\n19684\t-71.35589\t41.806344\tEast Providence city\tRI\tRhode Island\tProvidence County\t47970\t42.7\t22.7\t14.1\t24446\t224657\t0.6653\t2914\tObama\t02914\t0.257091177\t2914.0\n19685\t-71.554885\t41.88002\tGreenville CDP\tRI\tRhode Island\tProvidence County\t8669\t47.3\t35.3\t12.1\t28230\t271791\t0.6653\t2828\tObama\t02828\t0.046460775999999995\t2828.0\n19686\t-71.48606\t41.765801\tCranston city\tRI\tRhode Island\tProvidence County\t79298\t41.2\t30.2\t13.1\t26913\t233899\t0.6653\t2920\tObama\t02920\t0.42499095600000003\t2920.0\n19687\t-71.374212\t41.87453\tPawtucket city\tRI\tRhode Island\tProvidence County\t71188\t36.9\t18.3\t16.5\t20490\t190696\t0.6653\t2860\tObama\t02860\t0.381526094\t2860.0\n19688\t-71.421991\t41.823584000000004\tProvidence city\tRI\tRhode Island\tProvidence County\t180392\t28.4\t28.7\t17.7\t18783\t189052\t0.6653\t2903\tObama\t02903\t0.966795739\t2903.0\n19689\t-71.45748499999999\t41.861622\tNorth Providence CDP\tRI\tRhode Island\tProvidence County\t32075\t44.0\t26.7\t12.9\t26427\t223599\t0.6653\t2911\tObama\t02911\t0.171903263\t2911.0\n19690\t-71.704063\t41.951993\tPascoag CDP\tRI\tRhode Island\tProvidence County\t4630\t38.9\t17.5\t12.5\t24311\t238345\t0.6653\t2859\tObama\t02859\t0.024814095\t2859.0\n19691\t-71.676405\t41.968926\tHarrisville CDP\tRI\tRhode Island\tProvidence County\t1632\t37.6\t20.0\t15.8\t26016\t225000\t0.6653\t2830\tObama\t02830\t0.008746567\t2830.0\n19692\t-71.392322\t41.923183\tValley Falls CDP\tRI\tRhode Island\tProvidence County\t11542\t41.6\t21.4\t13.8\t25461\t242916\t0.6653\t2864\tObama\t02864\t0.061858377\t2864.0\n19693\t-71.499318\t42.000793\tWoonsocket city\tRI\tRhode Island\tProvidence County\t42186\t36.0\t13.6\t15.7\t19679\t212585\t0.6653\t2895\tObama\t02895\t0.22609231600000002\t2895.0\n19694\t-71.785258\t41.426025\tAshaway CDP\tRI\tRhode Island\tWashington County\t1686\t42.1\t23.1\t7.2\t34147\t225843\t0.5707\t2804\tObama\t02804\t0.009035975\t2804.0\n19695\t-71.50048699999999\t41.446126\tWakefield-Peacedale CDP\tRI\tRhode Island\tWashington County\t8624\t38.6\t48.9\t11.7\t32539\t267284\t0.5707\t2879\tObama\t02879\t0.046219602\t2879.0\n19696\t-71.753964\t41.394707000000004\tBradford CDP\tRI\tRhode Island\tWashington County\t1471\t29.8\t16.9\t16.0\t21618\t199605\t0.5707\t2808\tObama\t02808\t0.007883701\t2808.0\n19697\t-71.52356400000001\t41.473784\tKingston CDP\tRI\tRhode Island\tWashington County\t5562\t19.7\t67.5\t14.0\t19147\t359286\t0.5707\t2881\tObama\t02881\t0.029809071\t2881.0\n19698\t-71.806921\t41.372346\tWesterly CDP\tRI\tRhode Island\tWashington County\t18980\t42.0\t29.5\t11.4\t32243\t264148\t0.5707\t2891\tObama\t02891\t0.10172171199999999\t2891.0\n19699\t-71.46692900000001\t41.428184\tNarragansett Pier CDP\tRI\tRhode Island\tWashington County\t3658\t43.4\t49.4\t9.1\t37052\t349257\t0.5707\t2882\tObama\t02882\t0.019604743\t2882.0\n19700\t-71.720189\t41.515086\tHope Valley CDP\tRI\tRhode Island\tWashington County\t1823\t42.3\t27.5\t7.7\t24624\t243566\t0.5707\t2832\tObama\t02832\t0.009770215\t2832.0\n19701\t-82.377509\t34.179406\tAbbeville city\tSC\tSouth Carolina\tAbbeville County\t5783\t38.7\t12.9\t17.7\t17488\t75926\t0.4257\t29620\tRomney\t29620\t0.025552516\t29620.0\n19702\t-82.590593\t34.282486999999996\tLake Secession CDP\tSC\tSouth Carolina\tAbbeville County\t912\t46.9\t20.7\t11.1\t23767\t100000\t0.4257\t29655\tRomney\t29655\t0.004029724\t29655.0\n19703\t-82.346739\t34.376779\tDonalds town\tSC\tSouth Carolina\tAbbeville County\t328\t39.2\t18.2\t11.9\t16888\t82500\t0.4257\t29638\tRomney\t29638\t0.001449287\t29638.0\n19704\t-82.595642\t34.092377\tCalhoun Falls town\tSC\tSouth Carolina\tAbbeville County\t2179\t40.0\t7.7\t16.3\t16296\t59437\t0.4257\t29628\tRomney\t29628\t0.009628036\t29628.0\n19705\t-82.554273\t34.297278999999996\tAntreville CDP\tSC\tSouth Carolina\tAbbeville County\t118\t42.5\t14.5\t20.0\t19111\t91000\t0.4257\t29655\tRomney\t29655\t0.00052139\t29655.0\n19706\t-82.64781500000001\t34.209695\tLowndesville town\tSC\tSouth Carolina\tAbbeville County\t166\t37.5\t8.3\t9.8\t20274\t57857\t0.4257\t29659\tRomney\t29659\t0.00073348\t29659.0\n19707\t-82.388734\t34.333484999999996\tDue West town\tSC\tSouth Carolina\tAbbeville County\t1265\t37.0\t36.5\t20.6\t20361\t92750\t0.4257\t29639\tRomney\t29639\t0.005589475\t29639.0\n19708\t-81.680428\t33.419140999999996\tNew Ellenton town\tSC\tSouth Carolina\tAiken County\t2177\t41.3\t8.7\t11.2\t21545\t83563\t0.3599\t29809\tRomney\t29809\t0.009619199\t29809.0\n19709\t-81.308604\t33.627762\tPerry town\tSC\tSouth Carolina\tAiken County\t260\t40.0\t8.0\t11.7\t14780\t65000\t0.3599\t29124\tRomney\t29124\t0.001148825\t29124.0\n19710\t-81.941156\t33.537461\tBelvedere CDP\tSC\tSouth Carolina\tAiken County\t5411\t37.7\t13.9\t10.6\t20978\t89957\t0.3599\t29841\tRomney\t29841\t0.023908812999999998\t29841.0\n19711\t-81.90992\t33.503698\tClearwater CDP\tSC\tSouth Carolina\tAiken County\t4228\t37.8\t7.6\t9.8\t20110\t96111\t0.3599\t29822\tRomney\t29822\t0.01868166\t29822.0\n19712\t-81.871036\t33.514555\tBurnettown town\tSC\tSouth Carolina\tAiken County\t2811\t41.7\t7.8\t12.4\t19136\t69945\t0.3599\t29816\tRomney\t29816\t0.012420563999999999\t29816.0\n19713\t-81.304443\t33.566421999999996\tSalley town\tSC\tSouth Carolina\tAiken County\t409\t40.0\t4.0\t18.2\t19224\t75833\t0.3599\t29137\tRomney\t29137\t0.00180719\t29137.0\n19714\t-81.956501\t33.544792\tNorth Augusta city\tSC\tSouth Carolina\tAiken County\t20419\t39.2\t30.5\t8.7\t27579\t132959\t0.3599\t29841\tRomney\t29841\t0.090222519\t29841.0\n19715\t-81.726609\t33.538311\tAiken city\tSC\tSouth Carolina\tAiken County\t27141\t41.7\t39.3\t9.9\t28452\t140622\t0.3599\t29801\tRomney\t29801\t0.11992406\t29801.0\n19716\t-81.513722\t33.480599\tWindsor town\tSC\tSouth Carolina\tAiken County\t149\t31.7\t4.4\t11.3\t14725\t62000\t0.3599\t29856\tRomney\t29856\t0.000658365\t29856.0\n19717\t-81.815312\t33.527353000000005\tGloverville CDP\tSC\tSouth Carolina\tAiken County\t2848\t37.5\t7.1\t11.1\t17492\t64932\t0.3599\t29851\tRomney\t29851\t0.012584051\t29851.0\n19718\t-81.363098\t33.652336\tWagener town\tSC\tSouth Carolina\tAiken County\t923\t40.6\t10.6\t13.9\t18921\t84815\t0.3599\t29164\tRomney\t29164\t0.004078328\t29164.0\n19719\t-81.79277900000001\t33.328425\tJackson town\tSC\tSouth Carolina\tAiken County\t1631\t41.3\t11.6\t10.9\t22384\t87500\t0.3599\t29831\tRomney\t29831\t0.007206667\t29831.0\n19720\t-81.22215899999999\t33.036221999999995\tSycamore town\tSC\tSouth Carolina\tAllendale County\t170\t42.0\t8.5\t20.3\t17200\t62143\t0.792\t29846\tRomney\t29846\t0.000751155\t29846.0\n19721\t-81.207352\t33.095541\tUlmer town\tSC\tSouth Carolina\tAllendale County\t94\t42.1\t7.8\t19.5\t17141\t63333\t0.792\t29849\tRomney\t29849\t0.000415344\t29849.0\n19722\t-81.308939\t33.008032\tAllendale town\tSC\tSouth Carolina\tAllendale County\t3767\t34.9\t11.4\t25.7\t13200\t57343\t0.792\t29810\tRomney\t29810\t0.016644705\t29810.0\n19723\t-81.236634\t32.958886\tFairfax town\tSC\tSouth Carolina\tAllendale County\t3201\t35.3\t6.9\t29.2\t12978\t58154\t0.792\t29827\tRomney\t29827\t0.014143801000000001\t29827.0\n19724\t-82.716107\t34.5256\tCenterville CDP\tSC\tSouth Carolina\tAnderson County\t6450\t39.8\t17.9\t9.9\t24208\t120028\t0.3103\t29625\tRomney\t29625\t0.028499694\t29625.0\n19725\t-82.47936\t34.619313\tWilliamston town\tSC\tSouth Carolina\tAnderson County\t4024\t38.9\t10.8\t16.5\t17346\t78661\t0.3103\t29697\tRomney\t29697\t0.017780274\t29697.0\n19726\t-82.695639\t34.377229\tStarr town\tSC\tSouth Carolina\tAnderson County\t178\t39.6\t11.3\t12.8\t18931\t78750\t0.3103\t29684\tRomney\t29684\t0.000786503\t29684.0\n19727\t-82.49589300000001\t34.782806\tPowderville CDP\tSC\tSouth Carolina\tAnderson County\t7034\t41.7\t23.8\t9.9\t25011\t155750\t0.3103\t29642\tRomney\t29642\t0.031080131\t29642.0\n19728\t-82.474035\t34.644894\tWest Pelzer town\tSC\tSouth Carolina\tAnderson County\t909\t36.4\t7.8\t12.3\t18096\t77333\t0.3103\t29669\tRomney\t29669\t0.004016468\t29669.0\n19729\t-82.659262\t34.464529\tHomeland Park CDP\tSC\tSouth Carolina\tAnderson County\t6684\t37.2\t4.7\t14.4\t16375\t66197\t0.3103\t29624\tRomney\t29624\t0.029533636000000002\t29624.0\n19730\t-82.647649\t34.51972\tAnderson city\tSC\tSouth Carolina\tAnderson County\t26180\t39.0\t22.7\t17.5\t20801\t106407\t0.3103\t29621\tRomney\t29621\t0.115677826\t29621.0\n19731\t-82.782223\t34.650787\tPendleton town\tSC\tSouth Carolina\tAnderson County\t3192\t39.4\t28.4\t13.5\t19905\t87240\t0.3103\t29670\tRomney\t29670\t0.014104034\t29670.0\n19732\t-82.464021\t34.64484\tPelzer town\tSC\tSouth Carolina\tAnderson County\t97\t41.7\t4.4\t16.7\t17211\t60000\t0.3103\t29669\tRomney\t29669\t0.00042860000000000006\t29669.0\n19733\t-82.66342900000001\t34.307128999999996\tIva town\tSC\tSouth Carolina\tAnderson County\t1290\t42.2\t4.4\t13.0\t17493\t71200\t0.3103\t29655\tRomney\t29655\t0.005699939\t29655.0\n19734\t-82.683803\t34.568682\tNorthlake CDP\tSC\tSouth Carolina\tAnderson County\t4182\t41.1\t31.9\t9.6\t29165\t147894\t0.3103\t296HH\tRomney\t296HH\t0.018478406\t0.0\n19735\t-82.384202\t34.447915\tHonea Path town\tSC\tSouth Carolina\tAnderson County\t3538\t43.1\t11.9\t15.4\t20607\t78182\t0.3103\t29654\tRomney\t29654\t0.015632855\t29654.0\n19736\t-82.493471\t34.52433\tBelton city\tSC\tSouth Carolina\tAnderson County\t4503\t41.0\t15.4\t12.3\t20610\t83659\t0.3103\t29627\tRomney\t29627\t0.019896763\t29627.0\n19737\t-81.185259\t33.180244\tOlar town\tSC\tSouth Carolina\tBamberg County\t204\t49.2\t9.0\t26.3\t19639\t60000\t0.6719\t29843\tRomney\t29843\t0.000901386\t29843.0\n19738\t-81.031917\t33.299369\tBamberg town\tSC\tSouth Carolina\tBamberg County\t3532\t38.5\t18.5\t20.4\t15157\t77133\t0.6719\t29003\tRomney\t29003\t0.015606344\t29003.0\n19739\t-81.174846\t33.2228\tGovan town\tSC\tSouth Carolina\tBamberg County\t63\t41.3\t19.0\t12.5\t14385\t35000\t0.6719\t29843\tRomney\t29843\t0.000278369\t29843.0\n19740\t-81.139584\t33.318005\tDenmark city\tSC\tSouth Carolina\tBamberg County\t3024\t34.5\t23.7\t21.2\t14157\t56318\t0.6719\t29042\tRomney\t29042\t0.013361717\t29042.0\n19741\t-81.01413000000001\t33.098633\tEhrhardt town\tSC\tSouth Carolina\tBamberg County\t555\t43.0\t17.1\t16.5\t18349\t75333\t0.6719\t29081\tRomney\t29081\t0.002452299\t29081.0\n19742\t-81.24646899999999\t33.273877\tHilda town\tSC\tSouth Carolina\tBarnwell County\t434\t37.6\t9.7\t14.6\t16583\t60000\t0.5228\t29817\tRomney\t29817\t0.001917654\t29817.0\n19743\t-81.364441\t33.241322\tBarnwell city\tSC\tSouth Carolina\tBarnwell County\t4946\t37.9\t18.8\t17.0\t22978\t85675\t0.5228\t29812\tRomney\t29812\t0.021854184\t29812.0\n19744\t-81.421726\t33.402318\tWilliston town\tSC\tSouth Carolina\tBarnwell County\t3268\t37.3\t10.5\t20.2\t17768\t65842\t0.5228\t29853\tRomney\t29853\t0.014439845\t29853.0\n19745\t-81.378652\t33.380155\tElko town\tSC\tSouth Carolina\tBarnwell County\t208\t38.9\t5.0\t19.1\t16660\t55000\t0.5228\t29826\tRomney\t29826\t0.00091906\t29826.0\n19746\t-81.283746\t33.354706\tBlackville town\tSC\tSouth Carolina\tBarnwell County\t2809\t38.9\t12.9\t24.5\t16070\t58514\t0.5228\t29817\tRomney\t29817\t0.012411727\t29817.0\n19747\t-81.455066\t33.239346999999995\tSnelling town\tSC\tSouth Carolina\tBarnwell County\t254\t32.9\t14.6\t22.0\t18295\t58333\t0.5228\t29812\tRomney\t29812\t0.001122314\t29812.0\n19748\t-81.342563\t33.125087\tKline town\tSC\tSouth Carolina\tBarnwell County\t246\t34.8\t10.5\t19.4\t14658\t76250\t0.5228\t29812\tRomney\t29812\t0.001086965\t29812.0\n19749\t-80.696878\t32.424446\tBeaufort city\tSC\tSouth Carolina\tBeaufort County\t12755\t31.9\t31.5\t13.3\t23042\t151511\t0.4072\t29902\tRomney\t29902\t0.056358697\t29902.0\n19750\t-80.78054300000001\t32.460988\tLaurel Bay CDP\tSC\tSouth Carolina\tBeaufort County\t6933\t23.0\t17.1\t10.2\t15395\t113624\t0.4072\t29906\tRomney\t29906\t0.030633857\t29906.0\n19751\t-80.691218\t32.332330999999996\tParris Island CDP\tSC\tSouth Carolina\tBeaufort County\t4303\t20.4\t24.9\t8.3\t12835\t59706\t0.4072\t29935\tRomney\t29935\t0.019013051\t29935.0\n19752\t-80.74329499999999\t32.192409000000005\tHilton Head Island town\tSC\tSouth Carolina\tBeaufort County\t38864\t50.7\t48.0\t6.3\t41872\t492168\t0.4072\t29928\tRomney\t29928\t0.171722805\t29928.0\n19753\t-80.743812\t32.420726\tBurton CDP\tSC\tSouth Carolina\tBeaufort County\t8551\t30.4\t18.3\t15.1\t22158\t130880\t0.4072\t29906\tRomney\t29906\t0.037783082\t29906.0\n19754\t-80.92784499999999\t32.192093\tBluffton town\tSC\tSouth Carolina\tBeaufort County\t2478\t29.8\t22.2\t9.5\t21330\t187500\t0.4072\t29910\tRomney\t29910\t0.010949185\t29910.0\n19755\t-80.70662\t32.385337\tPort Royal town\tSC\tSouth Carolina\tBeaufort County\t4381\t32.7\t23.4\t15.9\t24680\t133235\t0.4072\t29935\tRomney\t29935\t0.019357699\t29935.0\n19756\t-80.745087\t32.376106\tShell Point CDP\tSC\tSouth Carolina\tBeaufort County\t3374\t35.3\t19.5\t11.1\t22415\t139631\t0.4072\t299HH\tRomney\t299HH\t0.014908211999999999\t0.0\n19757\t-80.002358\t32.928746999999994\tHanahan city\tSC\tSouth Carolina\tBerkeley County\t15674\t34.8\t20.8\t9.5\t23288\t148535\t0.4185\t29406\tRomney\t29406\t0.069256465\t29406.0\n19758\t-79.925661\t33.405021999999995\tSt. Stephen town\tSC\tSouth Carolina\tBerkeley County\t1936\t36.8\t12.9\t21.3\t16689\t85152\t0.4185\t29479\tRomney\t29479\t0.008554326999999999\t29479.0\n19759\t-80.000447\t33.19587\tMoncks Corner town\tSC\tSouth Carolina\tBerkeley County\t6280\t35.5\t17.2\t14.1\t19738\t119987\t0.4185\t29461\tRomney\t29461\t0.027748539\t29461.0\n19760\t-80.104348\t33.01631\tLadson CDP\tSC\tSouth Carolina\tBerkeley County\t15032\t33.6\t13.1\t9.1\t19861\t107154\t0.4185\t29456\tRomney\t29456\t0.066419751\t29456.0\n19761\t-79.695076\t33.285556\tJamestown town\tSC\tSouth Carolina\tBerkeley County\t106\t41.7\t8.1\t13.7\t15838\t65000\t0.4185\t29453\tRomney\t29453\t0.00046836699999999997\t29453.0\n19762\t-79.958474\t33.308501\tBonneau town\tSC\tSouth Carolina\tBerkeley County\t386\t40.3\t8.4\t14.6\t18827\t86364\t0.4185\t29431\tRomney\t29431\t0.0017055629999999998\t29431.0\n19763\t-79.99074499999999\t32.993994\tGoose Creek city\tSC\tSouth Carolina\tBerkeley County\t30635\t28.2\t21.9\t10.3\t21673\t149128\t0.4185\t29445\tRomney\t29445\t0.135362498\t29445.0\n19764\t-80.77786400000001\t33.664025\tSt. Matthews town\tSC\tSouth Carolina\tCalhoun County\t2155\t42.4\t18.9\t14.6\t20120\t80373\t0.5163\t29135\tRomney\t29135\t0.009521991\t29135.0\n19765\t-80.715627\t33.558131\tCameron town\tSC\tSouth Carolina\tCalhoun County\t457\t46.4\t27.4\t9.2\t26536\t96250\t0.5163\t29030\tRomney\t29030\t0.002019281\t29030.0\n19766\t-80.251182\t32.698297\tMeggett town\tSC\tSouth Carolina\tCharleston County\t1404\t44.3\t20.5\t10.5\t19014\t92917\t0.5039\t29449\tRomney\t29449\t0.006203654\t29449.0\n19767\t-80.20764399999999\t32.75188\tHollywood town\tSC\tSouth Carolina\tCharleston County\t4427\t41.3\t19.0\t11.7\t19733\t89063\t0.5039\t29470\tRomney\t29470\t0.019560953\t29470.0\n19768\t-79.631383\t32.999054\tAwendaw town\tSC\tSouth Carolina\tCharleston County\t1255\t41.1\t21.7\t10.7\t19639\t99667\t0.5039\t29429\tRomney\t29429\t0.005545289\t29429.0\n19769\t-80.173716\t32.582364\tSeabrook Island town\tSC\tSouth Carolina\tCharleston County\t1524\t66.1\t66.9\t7.1\t60359\t551429\t0.5039\t29487\tRomney\t29487\t0.006733881\t29487.0\n19770\t-79.83846899999999\t32.764701\tSullivan's Island town\tSC\tSouth Carolina\tCharleston County\t2057\t44.1\t69.6\t7.0\t55092\t750000\t0.5039\t29482\tRomney\t29482\t0.009088971999999999\t29482.0\n19771\t-80.034627\t32.931932\tNorth Charleston city\tSC\tSouth Carolina\tCharleston County\t96177\t31.8\t17.9\t15.0\t18621\t91772\t0.5039\t29406\tRomney\t29406\t0.42496357100000004\t29406.0\n19772\t-79.95215\t32.672691\tFolly Beach city\tSC\tSouth Carolina\tCharleston County\t2558\t43.6\t55.0\t9.3\t36901\t364504\t0.5039\t29439\tRomney\t29439\t0.011302669\t29439.0\n19773\t-80.155982\t33.006538\tLincolnville town\tSC\tSouth Carolina\tCharleston County\t665\t36.5\t10.0\t13.0\t14921\t68621\t0.5039\t29485\tRomney\t29485\t0.0029383409999999997\t29485.0\n19774\t-79.831765\t32.852662\tMount Pleasant town\tSC\tSouth Carolina\tCharleston County\t68685\t37.5\t55.5\t7.9\t36081\t240304\t0.5039\t29466\tRomney\t29466\t0.303488598\t29466.0\n19775\t-80.193702\t32.602478999999995\tRockville town\tSC\tSouth Carolina\tCharleston County\t161\t47.7\t20.7\t13.2\t18193\t115625\t0.5039\t29487\tRomney\t29487\t0.0007113880000000001\t29487.0\n19776\t-79.753497\t32.804651\tIsle of Palms city\tSC\tSouth Carolina\tCharleston County\t4179\t47.3\t64.8\t6.8\t47433\t573433\t0.5039\t29451\tRomney\t29451\t0.01846515\t29451.0\n19777\t-80.231234\t32.776022999999995\tRavenel town\tSC\tSouth Carolina\tCharleston County\t2624\t40.0\t18.9\t11.5\t21007\t87348\t0.5039\t29470\tRomney\t29470\t0.011594294\t29470.0\n19778\t-79.882224\t32.906294\tCharleston city\tSC\tSouth Carolina\tCharleston County\t116390\t35.8\t39.4\t11.5\t26051\t158176\t0.5039\t29492\tRomney\t29492\t0.514275867\t29492.0\n19779\t-79.46831999999999\t33.086461\tMcClellanville town\tSC\tSouth Carolina\tCharleston County\t537\t44.8\t26.0\t13.7\t19680\t103947\t0.5039\t29458\tRomney\t29458\t0.002372765\t29458.0\n19780\t-80.060197\t32.615427000000004\tKiawah Island town\tSC\tSouth Carolina\tCharleston County\t1110\t66.8\t77.8\t10.0\t48497\t1000001\t0.5039\t29455\tRomney\t29455\t0.004904598\t29455.0\n19781\t-81.65578199999999\t35.073684\tGaffney city\tSC\tSouth Carolina\tCherokee County\t12582\t38.0\t19.1\t16.3\t20324\t93402\t0.3481\t29341\tRomney\t29341\t0.055594286\t29341.0\n19782\t-81.61908100000001\t35.083677\tEast Gaffney CDP\tSC\tSouth Carolina\tCherokee County\t3194\t37.5\t5.1\t19.3\t15811\t69221\t0.3481\t29340\tRomney\t29340\t0.014112872\t29340.0\n19783\t-81.518366\t35.122105\tBlacksburg town\tSC\tSouth Carolina\tCherokee County\t1850\t37.8\t10.8\t18.9\t17862\t79429\t0.3481\t29702\tRomney\t29702\t0.008174331\t29702.0\n19784\t-80.898475\t34.700857\tFort Lawn town\tSC\tSouth Carolina\tChester County\t928\t37.2\t7.4\t18.4\t16089\t75323\t0.5477\t29714\tRomney\t29714\t0.004100421\t29714.0\n19785\t-81.019774\t34.716297999999995\tRichburg town\tSC\tSouth Carolina\tChester County\t317\t39.1\t17.4\t19.4\t20526\t77857\t0.5477\t29729\tRomney\t29729\t0.0014006829999999998\t29729.0\n19786\t-81.19322199999999\t34.717612\tEureka Mill CDP\tSC\tSouth Carolina\tChester County\t1575\t36.1\t9.4\t23.0\t17016\t71786\t0.5477\t29706\tRomney\t29706\t0.0069592280000000005\t29706.0\n19787\t-81.239225\t34.702192\tGayle Mill CDP\tSC\tSouth Carolina\tChester County\t991\t32.2\t8.4\t34.2\t15585\t53529\t0.5477\t29706\tRomney\t29706\t0.00437879\t29706.0\n19788\t-81.237328\t34.803955\tLowrys town\tSC\tSouth Carolina\tChester County\t210\t40.0\t10.3\t20.4\t22174\t93000\t0.5477\t29726\tRomney\t29726\t0.000927897\t29726.0\n19789\t-81.213889\t34.70493\tChester city\tSC\tSouth Carolina\tChester County\t5828\t35.4\t11.5\t25.2\t16335\t72930\t0.5477\t29706\tRomney\t29706\t0.025751351000000002\t29706.0\n19790\t-80.904562\t34.57558\tGreat Falls town\tSC\tSouth Carolina\tChester County\t1952\t35.7\t8.6\t23.3\t16939\t40872\t0.5477\t29055\tRomney\t29055\t0.008625024\t29055.0\n19791\t-80.083179\t34.734396999999994\tChesterfield town\tSC\tSouth Carolina\tChesterfield County\t1387\t42.3\t16.2\t14.8\t17883\t81538\t0.4796\t29709\tRomney\t29709\t0.0061285390000000006\t29709.0\n19792\t-80.38987900000001\t34.771959\tPageland town\tSC\tSouth Carolina\tChesterfield County\t2456\t34.4\t12.2\t21.2\t15680\t82564\t0.4796\t29728\tRomney\t29728\t0.010851976000000001\t29728.0\n19793\t-80.226343\t34.769752000000004\tMount Croghan town\tSC\tSouth Carolina\tChesterfield County\t154\t38.1\t5.9\t16.4\t17244\t52000\t0.4796\t29741\tRomney\t29741\t0.000680458\t29741.0\n19794\t-80.17779399999999\t34.744426000000004\tRuby town\tSC\tSouth Carolina\tChesterfield County\t346\t41.3\t8.3\t17.8\t17481\t75882\t0.4796\t29741\tRomney\t29741\t0.001528821\t29741.0\n19795\t-79.89697\t34.696274\tCheraw town\tSC\tSouth Carolina\tChesterfield County\t5315\t42.9\t20.0\t25.0\t19509\t88278\t0.4796\t29520\tRomney\t29520\t0.023484631000000002\t29520.0\n19796\t-80.257667\t34.467806\tMcBee town\tSC\tSouth Carolina\tChesterfield County\t724\t37.4\t11.5\t24.2\t17461\t63167\t0.4796\t29101\tRomney\t29101\t0.003199035\t29101.0\n19797\t-80.387282\t34.650851\tJefferson town\tSC\tSouth Carolina\tChesterfield County\t687\t39.1\t7.6\t20.7\t16301\t70263\t0.4796\t29718\tRomney\t29718\t0.0030355490000000002\t29718.0\n19798\t-80.04470500000001\t34.575412\tPatrick town\tSC\tSouth Carolina\tChesterfield County\t363\t43.6\t4.6\t20.3\t17525\t60750\t0.4796\t29584\tRomney\t29584\t0.001603936\t29584.0\n19799\t-80.216134\t33.693334\tManning city\tSC\tSouth Carolina\tClarendon County\t3963\t38.0\t15.6\t14.1\t15133\t86274\t0.5579999999999999\t29102\tRomney\t29102\t0.017510742\t29102.0\n19800\t-80.016266\t33.889643\tTurbeville town\tSC\tSouth Carolina\tClarendon County\t737\t37.9\t12.1\t14.8\t17726\t81304\t0.5579999999999999\t29162\tRomney\t29162\t0.0032564770000000002\t29162.0\n19801\t-80.352089\t33.603398\tSummerton town\tSC\tSouth Carolina\tClarendon County\t1050\t38.0\t14.4\t20.8\t14645\t82826\t0.5579999999999999\t29148\tRomney\t29148\t0.004639485\t29148.0\n19802\t-80.358674\t33.738978\tPaxville town\tSC\tSouth Carolina\tClarendon County\t248\t38.4\t9.1\t12.1\t18396\t59167\t0.5579999999999999\t29125\tRomney\t29125\t0.0010958019999999999\t29125.0\n19803\t-80.323436\t32.492144\tEdisto Beach town\tSC\tSouth Carolina\tColleton County\t800\t62.7\t52.3\t10.4\t44724\t387805\t0.496\t29438\tRomney\t29438\t0.003534846\t29438.0\n19804\t-80.95361700000001\t33.067833\tLodge town\tSC\tSouth Carolina\tColleton County\t108\t41.1\t7.7\t12.5\t17670\t53333\t0.496\t29082\tRomney\t29082\t0.000477204\t29082.0\n19805\t-80.84276700000001\t33.033743\tWilliams town\tSC\tSouth Carolina\tColleton County\t129\t40.9\t10.2\t9.8\t16716\t66250\t0.496\t29493\tRomney\t29493\t0.000569994\t29493.0\n19806\t-80.67065799999999\t32.901776\tWalterboro city\tSC\tSouth Carolina\tColleton County\t5179\t38.8\t20.2\t18.1\t18761\t88440\t0.496\t29488\tRomney\t29488\t0.022883708\t29488.0\n19807\t-80.81466800000001\t33.089921999999994\tSmoaks town\tSC\tSouth Carolina\tColleton County\t148\t38.8\t10.3\t10.7\t14090\t72500\t0.496\t29481\tRomney\t29481\t0.000653946\t29481.0\n19808\t-80.481044\t32.937296\tCottageville town\tSC\tSouth Carolina\tColleton County\t767\t38.1\t9.7\t17.4\t17573\t84545\t0.496\t29435\tRomney\t29435\t0.003389033\t29435.0\n19809\t-80.064864\t34.169416999999996\tLamar town\tSC\tSouth Carolina\tDarlington County\t911\t43.5\t16.8\t16.1\t17087\t76800\t0.5127\t29069\tRomney\t29069\t0.004025306\t29069.0\n19810\t-80.084215\t34.366768\tHartsville city\tSC\tSouth Carolina\tDarlington County\t7058\t39.1\t24.2\t16.5\t22397\t97901\t0.5127\t29550\tRomney\t29550\t0.031186176\t29550.0\n19811\t-79.866511\t34.302023\tDarlington city\tSC\tSouth Carolina\tDarlington County\t6426\t40.2\t19.6\t13.4\t17860\t78717\t0.5127\t29532\tRomney\t29532\t0.028393647999999997\t29532.0\n19812\t-79.853724\t34.509869\tSociety Hill town\tSC\tSouth Carolina\tDarlington County\t800\t41.8\t9.4\t14.5\t15411\t63571\t0.5127\t29593\tRomney\t29593\t0.003534846\t29593.0\n19813\t-80.07200999999999\t34.400135\tNorth Hartsville CDP\tSC\tSouth Carolina\tDarlington County\t3161\t40.1\t19.7\t16.6\t23065\t97885\t0.5127\t29550\tRomney\t29550\t0.013967058999999999\t29550.0\n19814\t-79.165949\t34.340695000000004\tLake View town\tSC\tSouth Carolina\tDillon County\t791\t45.5\t12.5\t16.2\t16010\t75000\t0.5771\t29563\tRomney\t29563\t0.0034950790000000003\t29563.0\n19815\t-79.369159\t34.422543\tDillon city\tSC\tSouth Carolina\tDillon County\t6077\t39.5\t17.8\t16.4\t17762\t88815\t0.5771\t29536\tRomney\t29536\t0.026851572\t29536.0\n19816\t-79.43389300000001\t34.338947999999995\tLatta town\tSC\tSouth Carolina\tDillon County\t1381\t40.6\t16.5\t16.5\t17894\t77188\t0.5771\t29565\tRomney\t29565\t0.0061020269999999995\t29565.0\n19817\t-80.307572\t33.089927\tRidgeville town\tSC\tSouth Carolina\tDorchester County\t1951\t37.8\t8.4\t17.7\t14259\t66389\t0.4124\t29472\tRomney\t29472\t0.008620605\t29472.0\n19818\t-80.58081\t33.186552\tSt. George town\tSC\tSouth Carolina\tDorchester County\t2184\t42.5\t13.6\t13.8\t18242\t85568\t0.4124\t29477\tRomney\t29477\t0.009650129\t29477.0\n19819\t-80.446495\t33.212973\tHarleyville town\tSC\tSouth Carolina\tDorchester County\t753\t41.4\t12.4\t15.4\t17065\t74474\t0.4124\t29448\tRomney\t29448\t0.003327174\t29448.0\n19820\t-80.147961\t33.038266\tSummerville town\tSC\tSouth Carolina\tDorchester County\t38220\t37.0\t25.8\t10.7\t24122\t156934\t0.4124\t29483\tRomney\t29483\t0.16887725399999998\t29483.0\n19821\t-80.64572199999999\t33.202309\tReevesville town\tSC\tSouth Carolina\tDorchester County\t229\t41.3\t9.0\t8.5\t15983\t78333\t0.4124\t29471\tRomney\t29471\t0.00101185\t29471.0\n19822\t-81.944381\t33.600219\tMurphys Estates CDP\tSC\tSouth Carolina\tEdgefield County\t1700\t35.4\t5.4\t12.2\t16370\t62235\t0.4287\t29860\tRomney\t29860\t0.0075115469999999995\t29860.0\n19823\t-81.929629\t33.786994\tEdgefield town\tSC\tSouth Carolina\tEdgefield County\t4749\t36.3\t8.3\t15.8\t14695\t91132\t0.4287\t29824\tRomney\t29824\t0.020983727999999997\t29824.0\n19824\t-81.804771\t33.834113\tJohnston town\tSC\tSouth Carolina\tEdgefield County\t2297\t37.5\t10.0\t15.5\t17175\t86389\t0.4287\t29832\tRomney\t29832\t0.010149426\t29832.0\n19825\t-81.840166\t33.740528999999995\tTrenton town\tSC\tSouth Carolina\tEdgefield County\t254\t33.6\t13.0\t8.5\t19126\t83125\t0.4287\t29847\tRomney\t29847\t0.001122314\t29847.0\n19826\t-81.070194\t34.356087\tWinnsboro Mills CDP\tSC\tSouth Carolina\tFairfield County\t2260\t34.6\t10.0\t21.4\t16243\t66579\t0.6538\t29180\tRomney\t29180\t0.009985939000000001\t29180.0\n19827\t-81.08985200000001\t34.372890000000005\tWinnsboro town\tSC\tSouth Carolina\tFairfield County\t3596\t33.9\t19.7\t23.7\t15627\t84000\t0.6538\t29180\tRomney\t29180\t0.015889132\t29180.0\n19828\t-80.960202\t34.306622\tRidgeway town\tSC\tSouth Carolina\tFairfield County\t374\t43.9\t13.2\t11.5\t19463\t91071\t0.6538\t29130\tRomney\t29130\t0.00165254\t29130.0\n19829\t-79.779473\t34.178174\tFlorence city\tSC\tSouth Carolina\tFlorence County\t31758\t39.3\t27.3\t13.9\t23068\t113755\t0.4923\t29501\tRomney\t29501\t0.140324538\t29501.0\n19830\t-79.748901\t33.971740999999994\tCoward town\tSC\tSouth Carolina\tFlorence County\t701\t40.5\t6.0\t17.5\t14265\t64808\t0.4923\t29530\tRomney\t29530\t0.003097409\t29530.0\n19831\t-79.569263\t33.997122999999995\tPamplico town\tSC\tSouth Carolina\tFlorence County\t1224\t39.0\t17.1\t21.2\t14515\t76818\t0.4923\t29583\tRomney\t29583\t0.005408314\t29583.0\n19832\t-79.942894\t34.134732\tTimmonsville town\tSC\tSouth Carolina\tFlorence County\t2270\t35.9\t12.3\t21.9\t13817\t66442\t0.4923\t29161\tRomney\t29161\t0.010030125\t29161.0\n19833\t-79.744127\t33.917353000000006\tScranton town\tSC\tSouth Carolina\tFlorence County\t981\t42.2\t8.2\t21.2\t14667\t61250\t0.4923\t29591\tRomney\t29591\t0.004334605\t29591.0\n19834\t-79.932075\t33.935863\tOlanta town\tSC\tSouth Carolina\tFlorence County\t626\t40.9\t8.6\t16.9\t15951\t67619\t0.4923\t29114\tRomney\t29114\t0.002766017\t29114.0\n19835\t-79.44799599999999\t33.815906\tJohnsonville city\tSC\tSouth Carolina\tFlorence County\t1447\t37.4\t12.6\t15.7\t17579\t70128\t0.4923\t29555\tRomney\t29555\t0.006393652\t29555.0\n19836\t-79.754984\t33.867732000000004\tLake City\tSC\tSouth Carolina\tFlorence County\t6255\t36.2\t17.7\t19.8\t15498\t67746\t0.4923\t29560\tRomney\t29560\t0.027638075\t29560.0\n19837\t-79.733678\t34.230340999999996\tQuinby town\tSC\tSouth Carolina\tFlorence County\t835\t45.3\t28.4\t10.0\t22141\t100160\t0.4923\t29506\tRomney\t29506\t0.003689495\t29506.0\n19838\t-79.565125\t33.456624\tAndrews town\tSC\tSouth Carolina\tGeorgetown County\t2913\t38.7\t12.3\t16.9\t13959\t77891\t0.4574\t29510\tRomney\t29510\t0.012871256999999999\t29510.0\n19839\t-79.05874\t33.55607\tMurrells Inlet CDP\tSC\tSouth Carolina\tGeorgetown County\t6990\t51.9\t28.8\t10.8\t30149\t136087\t0.4574\t29576\tRomney\t29576\t0.030885715\t29576.0\n19840\t-79.126062\t33.424653\tPawleys Island town\tSC\tSouth Carolina\tGeorgetown County\t209\t51.2\t40.9\t9.1\t35833\t192708\t0.4574\t29585\tRomney\t29585\t0.000923478\t29585.0\n19841\t-79.295815\t33.362201\tGeorgetown city\tSC\tSouth Carolina\tGeorgetown County\t9275\t35.1\t16.8\t15.8\t17478\t103477\t0.4574\t29440\tRomney\t29440\t0.040982118\t29440.0\n19842\t-82.439813\t34.968238\tTravelers Rest city\tSC\tSouth Carolina\tGreenville County\t4872\t35.5\t21.5\t8.8\t25267\t117265\t0.3523\t29690\tRomney\t29690\t0.02152721\t29690.0\n19843\t-82.42708499999999\t34.833557\tJudson CDP\tSC\tSouth Carolina\tGreenville County\t2310\t36.0\t9.0\t20.3\t14349\t62105\t0.3523\t29611\tRomney\t29611\t0.010206867\t29611.0\n19844\t-82.451263\t34.85123\tParker CDP\tSC\tSouth Carolina\tGreenville County\t11116\t37.3\t4.2\t16.8\t15536\t63692\t0.3523\t29611\tRomney\t29611\t0.049116680999999995\t29611.0\n19845\t-82.42436500000001\t34.890066999999995\tSans Souci CDP\tSC\tSouth Carolina\tGreenville County\t8140\t37.1\t10.2\t10.1\t16805\t84691\t0.3523\t29617\tRomney\t29617\t0.035967055\t29617.0\n19846\t-82.226962\t34.806961\tFive Forks CDP\tSC\tSouth Carolina\tGreenville County\t14312\t35.3\t45.7\t8.0\t36767\t211774\t0.3523\t29681\tRomney\t29681\t0.06323839\t29681.0\n19847\t-82.40287099999999\t34.784271999999994\tGantt CDP\tSC\tSouth Carolina\tGreenville County\t14336\t37.1\t19.8\t14.1\t22655\t86090\t0.3523\t29605\tRomney\t29605\t0.063344435\t29605.0\n19848\t-82.493076\t35.034607\tSlater-Marietta CDP\tSC\tSouth Carolina\tGreenville County\t2632\t39.0\t8.3\t15.2\t17945\t75556\t0.3523\t29683\tRomney\t29683\t0.011629641999999999\t29683.0\n19849\t-82.36971700000001\t34.838328999999995\tGreenville city\tSC\tSouth Carolina\tGreenville County\t58595\t36.6\t36.1\t12.7\t26216\t137795\t0.3523\t29607\tRomney\t29607\t0.25890535600000003\t29607.0\n19850\t-82.45146\t34.710822\tPiedmont CDP\tSC\tSouth Carolina\tGreenville County\t5209\t39.8\t8.2\t11.4\t19326\t82339\t0.3523\t29673\tRomney\t29673\t0.023016263999999998\t29673.0\n19851\t-82.42466\t34.862152\tCity View CDP\tSC\tSouth Carolina\tGreenville County\t1250\t34.0\t3.0\t12.1\t12974\t48125\t0.3523\t29601\tRomney\t29601\t0.005523196\t29601.0\n19852\t-82.31182199999999\t34.915597\tTaylors CDP\tSC\tSouth Carolina\tGreenville County\t21719\t38.5\t31.9\t9.0\t27649\t141031\t0.3523\t29687\tRomney\t29687\t0.095966643\t29687.0\n19853\t-82.465276\t34.880224\tBerea CDP\tSC\tSouth Carolina\tGreenville County\t14773\t38.5\t9.9\t12.7\t19342\t100075\t0.3523\t29617\tRomney\t29617\t0.065275345\t29617.0\n19854\t-82.256102\t34.729627\tSimpsonville city\tSC\tSouth Carolina\tGreenville County\t16783\t35.9\t28.3\t8.3\t25057\t137369\t0.3523\t29680\tRomney\t29680\t0.074156645\t29680.0\n19855\t-82.30174699999999\t34.785692\tMauldin city\tSC\tSouth Carolina\tGreenville County\t20774\t37.7\t36.0\t7.5\t30146\t152520\t0.3523\t29662\tRomney\t29662\t0.091791106\t29662.0\n19856\t-82.185222\t34.698418\tFountain Inn city\tSC\tSouth Carolina\tGreenville County\t7222\t35.3\t17.8\t11.7\t20595\t114670\t0.3523\t29644\tRomney\t29644\t0.03191082\t29644.0\n19857\t-82.440813\t34.732146\tGolden Grove CDP\tSC\tSouth Carolina\tGreenville County\t2615\t38.5\t9.4\t12.1\t21599\t93875\t0.3523\t29673\tRomney\t29673\t0.011554527\t29673.0\n19858\t-82.333765\t34.881975\tWade Hampton CDP\tSC\tSouth Carolina\tGreenville County\t22046\t42.0\t40.2\t10.7\t29748\t158163\t0.3523\t29615\tRomney\t29615\t0.09741151099999999\t29615.0\n19859\t-82.45993299999999\t34.82045\tWelcome CDP\tSC\tSouth Carolina\tGreenville County\t6377\t41.6\t9.8\t18.1\t20568\t77996\t0.3523\t29611\tRomney\t29611\t0.028177139\t29611.0\n19860\t-82.422285\t34.820479\tDunean CDP\tSC\tSouth Carolina\tGreenville County\t3762\t38.8\t7.4\t12.4\t16899\t70982\t0.3523\t29611\tRomney\t29611\t0.016622612\t29611.0\n19861\t-82.197873\t34.925779999999996\tGreer city\tSC\tSouth Carolina\tGreenville County\t22145\t37.5\t20.5\t13.2\t23085\t125029\t0.3523\t29651\tRomney\t29651\t0.097848948\t29651.0\n19862\t-82.238977\t34.40675\tWare Shoals town\tSC\tSouth Carolina\tGreenwood County\t2442\t39.3\t13.5\t13.8\t18508\t69861\t0.4176\t29692\tRomney\t29692\t0.010790117\t29692.0\n19863\t-82.208754\t34.290005\tCokesbury CDP\tSC\tSouth Carolina\tGreenwood County\t320\t42.0\t10.0\t14.8\t17170\t84444\t0.4176\t29653\tRomney\t29653\t0.0014139379999999998\t29653.0\n19864\t-82.15439599999999\t34.189035\tGreenwood city\tSC\tSouth Carolina\tGreenwood County\t22719\t32.5\t18.0\t17.2\t17542\t88534\t0.4176\t29646\tRomney\t29646\t0.1003852\t29646.0\n19865\t-82.023551\t34.171896999999994\tNinety Six town\tSC\tSouth Carolina\tGreenwood County\t1991\t40.1\t14.1\t14.0\t20197\t79421\t0.4176\t29666\tRomney\t29666\t0.008797346999999999\t29666.0\n19866\t-82.243565\t34.039203\tBradley CDP\tSC\tSouth Carolina\tGreenwood County\t175\t40.8\t12.5\t15.7\t17797\t87500\t0.4176\t29819\tRomney\t29819\t0.000773248\t29819.0\n19867\t-82.297338\t33.987858\tTroy town\tSC\tSouth Carolina\tGreenwood County\t108\t40.0\t12.2\t15.7\t17724\t90000\t0.4176\t29835\tRomney\t29835\t0.000477204\t29835.0\n19868\t-82.097093\t34.259381\tCoronaca CDP\tSC\tSouth Carolina\tGreenwood County\t197\t46.2\t31.1\t13.8\t27821\t176786\t0.4176\t29384\tRomney\t29384\t0.000870456\t29384.0\n19869\t-82.230529\t34.127621999999995\tPromised Land CDP\tSC\tSouth Carolina\tGreenwood County\t584\t37.6\t26.4\t12.0\t19858\t107692\t0.4176\t29819\tRomney\t29819\t0.002580437\t29819.0\n19870\t-82.247826\t34.287490999999996\tHodges town\tSC\tSouth Carolina\tGreenwood County\t169\t43.2\t22.2\t11.8\t23306\t95000\t0.4176\t29653\tRomney\t29653\t0.000746736\t29653.0\n19871\t-81.238068\t32.860462\tGifford town\tSC\tSouth Carolina\tHampton County\t352\t37.2\t11.9\t15.7\t16467\t67500\t0.6337\t29923\tRomney\t29923\t0.0015553320000000002\t29923.0\n19872\t-81.08082900000001\t32.851138\tVarnville town\tSC\tSouth Carolina\tHampton County\t2113\t36.6\t18.2\t18.0\t20419\t86136\t0.6337\t29924\tRomney\t29924\t0.009336411\t29924.0\n19873\t-81.243514\t32.680809\tScotia town\tSC\tSouth Carolina\tHampton County\t233\t34.3\t9.0\t17.4\t14695\t54545\t0.6337\t29939\tRomney\t29939\t0.001029524\t29939.0\n19874\t-80.8407\t32.697448\tYemassee town\tSC\tSouth Carolina\tHampton County\t786\t36.0\t11.4\t16.6\t16674\t67619\t0.6337\t29945\tRomney\t29945\t0.003472986\t29945.0\n19875\t-81.109468\t32.867725\tHampton town\tSC\tSouth Carolina\tHampton County\t2769\t40.6\t19.2\t15.3\t21130\t83729\t0.6337\t29924\tRomney\t29924\t0.012234985\t29924.0\n19876\t-81.188285\t32.924585\tBrunson town\tSC\tSouth Carolina\tHampton County\t583\t37.4\t11.5\t16.6\t15378\t62222\t0.6337\t29911\tRomney\t29911\t0.002576019\t29911.0\n19877\t-81.240449\t32.814254999999996\tLuray town\tSC\tSouth Carolina\tHampton County\t109\t34.2\t8.2\t17.2\t14023\t58000\t0.6337\t29923\tRomney\t29923\t0.00048162300000000003\t29923.0\n19878\t-81.24086199999999\t32.754064\tEstill town\tSC\tSouth Carolina\tHampton County\t2390\t34.9\t10.8\t15.1\t15170\t58836\t0.6337\t29918\tRomney\t29918\t0.010560352\t29918.0\n19879\t-81.187198\t32.681239\tFurman town\tSC\tSouth Carolina\tHampton County\t288\t36.4\t7.8\t14.7\t20369\t47500\t0.6337\t29921\tRomney\t29921\t0.001272544\t29921.0\n19880\t-79.008499\t33.687123\tSocastee CDP\tSC\tSouth Carolina\tHorry County\t18388\t36.2\t16.3\t11.6\t24642\t136833\t0.34600000000000003\t29579\tRomney\t29579\t0.081248429\t29579.0\n19881\t-79.200889\t33.998929\tAynor town\tSC\tSouth Carolina\tHorry County\t930\t38.7\t18.2\t11.6\t16254\t99063\t0.34600000000000003\t29544\tRomney\t29544\t0.004109258\t29544.0\n19882\t-79.007112\t33.592615\tGarden City CDP\tSC\tSouth Carolina\tHorry County\t9877\t56.9\t21.2\t10.1\t27675\t121899\t0.34600000000000003\t29576\tRomney\t29576\t0.043642089\t29576.0\n19883\t-79.110483\t33.672267\tBucksport CDP\tSC\tSouth Carolina\tHorry County\t1241\t35.2\t7.8\t17.6\t13769\t77000\t0.34600000000000003\t29527\tRomney\t29527\t0.005483429000000001\t29527.0\n19884\t-78.892625\t33.699671\tMyrtle Beach city\tSC\tSouth Carolina\tHorry County\t25633\t40.0\t24.4\t11.6\t28390\t161207\t0.34600000000000003\t29577\tRomney\t29577\t0.113260876\t29577.0\n19885\t-78.966819\t33.725249\tForestbrook CDP\tSC\tSouth Carolina\tHorry County\t5193\t37.3\t23.3\t11.4\t23157\t162005\t0.34600000000000003\t29579\tRomney\t29579\t0.022945567000000004\t29579.0\n19886\t-79.010675\t33.761719\tRed Hill CDP\tSC\tSouth Carolina\tHorry County\t13887\t41.2\t24.5\t10.6\t22302\t161163\t0.34600000000000003\t29579\tRomney\t29579\t0.061360503\t29579.0\n19887\t-78.717456\t33.803385999999996\tAtlantic Beach town\tSC\tSouth Carolina\tHorry County\t379\t34.0\t14.6\t15.3\t17774\t145833\t0.34600000000000003\t29582\tRomney\t29582\t0.0016746329999999998\t29582.0\n19888\t-78.748817\t33.790015999999994\tBriarcliffe Acres town\tSC\tSouth Carolina\tHorry County\t655\t60.3\t59.0\t8.9\t55509\t416279\t0.34600000000000003\t29572\tRomney\t29572\t0.002894155\t29572.0\n19889\t-78.693427\t33.822632\tNorth Myrtle Beach city\tSC\tSouth Carolina\tHorry County\t16637\t50.0\t28.4\t10.8\t29539\t176190\t0.34600000000000003\t29582\tRomney\t29582\t0.073511535\t29582.0\n19890\t-78.884848\t34.056983\tLoris city\tSC\tSouth Carolina\tHorry County\t2221\t43.2\t14.5\t11.0\t16724\t107692\t0.34600000000000003\t29569\tRomney\t29569\t0.009813615\t29569.0\n19891\t-78.977521\t33.609466\tSurfside Beach town\tSC\tSouth Carolina\tHorry County\t4891\t47.6\t29.6\t10.8\t33049\t221751\t0.34600000000000003\t29575\tRomney\t29575\t0.021611163\t29575.0\n19892\t-79.062116\t33.844803999999996\tConway city\tSC\tSouth Carolina\tHorry County\t14075\t36.5\t21.7\t13.5\t21346\t128633\t0.34600000000000003\t295HH\tRomney\t295HH\t0.062191192\t0.0\n19893\t-78.639522\t33.878577\tLittle River CDP\tSC\tSouth Carolina\tHorry County\t9345\t51.3\t20.9\t10.6\t26680\t165735\t0.34600000000000003\t29566\tRomney\t29566\t0.041291417000000004\t29566.0\n19894\t-81.07550400000001\t32.2782\tHardeeville city\tSC\tSouth Carolina\tJasper County\t2010\t32.7\t7.2\t10.4\t19152\t112231\t0.5745\t29927\tRomney\t29927\t0.008881299999999998\t29927.0\n19895\t-80.977118\t32.487097\tRidgeland town\tSC\tSouth Carolina\tJasper County\t2720\t34.6\t8.7\t10.7\t15917\t101613\t0.5745\t29936\tRomney\t29936\t0.012018475\t29936.0\n19896\t-80.69258\t34.220928\tLugoff CDP\tSC\tSouth Carolina\tKershaw County\t7972\t38.6\t23.5\t9.6\t24777\t133240\t0.4029\t29078\tRomney\t29078\t0.035224738\t29078.0\n19897\t-80.34921700000001\t34.414066\tBethune town\tSC\tSouth Carolina\tKershaw County\t429\t45.8\t12.7\t10.2\t19967\t87619\t0.4029\t29009\tRomney\t29009\t0.001895561\t29009.0\n19898\t-80.614575\t34.257984\tCamden city\tSC\tSouth Carolina\tKershaw County\t6990\t45.6\t34.9\t12.2\t26760\t128620\t0.4029\t29020\tRomney\t29020\t0.030885715\t29020.0\n19899\t-80.792344\t34.167812\tElgin town\tSC\tSouth Carolina\tKershaw County\t1157\t37.1\t13.9\t9.9\t20508\t111932\t0.4029\t29045\tRomney\t29045\t0.005112271\t29045.0\n19900\t-80.674049\t34.590457\tHeath Springs town\tSC\tSouth Carolina\tLancaster County\t968\t43.7\t8.9\t24.1\t15936\t88281\t0.4049\t29058\tRomney\t29058\t0.004277163\t29058.0\n19901\t-80.721395\t34.67253\tElgin CDP\tSC\tSouth Carolina\tLancaster County\t2625\t38.8\t11.0\t15.4\t20177\t104071\t0.4049\t29720\tRomney\t29720\t0.011598713\t29720.0\n19902\t-80.784678\t34.690622999999995\tSpringdale CDP\tSC\tSouth Carolina\tLancaster County\t2825\t36.1\t5.7\t17.6\t15722\t83839\t0.4049\t29720\tRomney\t29720\t0.012482423999999999\t29720.0\n19903\t-80.780252\t34.70896\tLancaster Mill CDP\tSC\tSouth Carolina\tLancaster County\t2108\t28.9\t4.8\t28.7\t12492\t71957\t0.4049\t29720\tRomney\t29720\t0.009314318\t29720.0\n19904\t-80.82007\t34.694158\tIrwin CDP\tSC\tSouth Carolina\tLancaster County\t1300\t39.2\t5.1\t21.6\t21988\t94758\t0.4049\t29720\tRomney\t29720\t0.005744124000000001\t29720.0\n19905\t-80.58662700000001\t34.544457\tKershaw town\tSC\tSouth Carolina\tLancaster County\t1661\t42.5\t11.3\t19.2\t20205\t97500\t0.4049\t29067\tRomney\t29067\t0.007339223000000001\t29067.0\n19906\t-80.779573\t34.723919\tLancaster city\tSC\tSouth Carolina\tLancaster County\t8141\t40.3\t21.3\t30.5\t18664\t116373\t0.4049\t29720\tRomney\t29720\t0.035971473999999996\t29720.0\n19907\t-82.060874\t34.354932\tWaterloo town\tSC\tSouth Carolina\tLaurens County\t216\t40.2\t4.2\t17.2\t19657\t87000\t0.406\t29384\tRomney\t29384\t0.000954408\t29384.0\n19908\t-82.295643\t34.49127\tPrinceton CDP\tSC\tSouth Carolina\tLaurens County\t65\t43.8\t17.0\t15.2\t19087\t83333\t0.406\t29654\tRomney\t29654\t0.000287206\t29654.0\n19909\t-81.86353000000001\t34.476459999999996\tClinton city\tSC\tSouth Carolina\tLaurens County\t8245\t38.1\t19.7\t15.7\t17239\t78583\t0.406\t29325\tRomney\t29325\t0.036431003999999996\t29325.0\n19910\t-81.983302\t34.30475\tCross Hill town\tSC\tSouth Carolina\tLaurens County\t651\t35.9\t10.6\t13.1\t15190\t61176\t0.406\t29332\tRomney\t29332\t0.0028764809999999997\t29332.0\n19911\t-82.024885\t34.501003999999995\tLaurens city\tSC\tSouth Carolina\tLaurens County\t9539\t40.2\t18.4\t17.3\t18781\t85961\t0.406\t29360\tRomney\t29360\t0.042148617\t29360.0\n19912\t-81.985711\t34.516312\tWatts Mills CDP\tSC\tSouth Carolina\tLaurens County\t1431\t33.9\t3.6\t17.8\t14718\t58667\t0.406\t29360\tRomney\t29360\t0.006322955\t29360.0\n19913\t-81.976112\t34.366172\tMountville CDP\tSC\tSouth Carolina\tLaurens County\t137\t38.3\t14.1\t12.3\t18940\t86000\t0.406\t29370\tRomney\t29370\t0.0006053419999999999\t29370.0\n19914\t-81.808423\t34.415040000000005\tJoanna CDP\tSC\tSouth Carolina\tLaurens County\t1539\t41.3\t7.7\t11.7\t17908\t59357\t0.406\t29351\tRomney\t29351\t0.006800159\t29351.0\n19915\t-82.114457\t34.60779\tGray Court town\tSC\tSouth Carolina\tLaurens County\t1144\t36.3\t8.6\t14.9\t16244\t89600\t0.406\t29645\tRomney\t29645\t0.005054829\t29645.0\n19916\t-80.07596\t34.059973\tLynchburg town\tSC\tSouth Carolina\tLee County\t570\t39.6\t11.4\t25.1\t17317\t53462\t0.6709999999999999\t29080\tRomney\t29080\t0.002518578\t29080.0\n19917\t-80.248237\t34.220165\tBishopville city\tSC\tSouth Carolina\tLee County\t3371\t37.9\t17.4\t18.5\t15904\t69449\t0.6709999999999999\t29010\tRomney\t29010\t0.014894956\t29010.0\n19918\t-81.142829\t33.980924\tOak Grove CDP\tSC\tSouth Carolina\tLexington County\t9430\t38.2\t21.3\t9.7\t27790\t116922\t0.3032\t29170\tRomney\t29170\t0.041666994\t29170.0\n19919\t-81.121165\t33.959123999999996\tSpringdale town\tSC\tSouth Carolina\tLexington County\t2918\t45.7\t25.0\t10.2\t28871\t126035\t0.3032\t29170\tRomney\t29170\t0.01289335\t29170.0\n19920\t-81.256886\t33.77663\tPelion town\tSC\tSouth Carolina\tLexington County\t626\t33.8\t6.1\t14.1\t17309\t74643\t0.3032\t29123\tRomney\t29123\t0.002766017\t29123.0\n19921\t-81.529872\t33.91104\tBatesburg-Leesville town\tSC\tSouth Carolina\tLexington County\t5685\t39.8\t16.6\t13.8\t20834\t92518\t0.3032\t29006\tRomney\t29006\t0.025119497\t29006.0\n19922\t-81.393126\t33.925028999999995\tGilbert town\tSC\tSouth Carolina\tLexington County\t543\t36.6\t14.9\t7.6\t21125\t110345\t0.3032\t29054\tRomney\t29054\t0.002399277\t29054.0\n19923\t-81.10084499999999\t33.817663\tGaston town\tSC\tSouth Carolina\tLexington County\t1370\t32.4\t7.0\t12.4\t15966\t71667\t0.3032\t29053\tRomney\t29053\t0.0060534230000000005\t29053.0\n19924\t-81.232016\t33.929635\tRed Bank CDP\tSC\tSouth Carolina\tLexington County\t9640\t35.7\t17.5\t9.8\t23795\t111471\t0.3032\t29073\tRomney\t29073\t0.042594890999999996\t29073.0\n19925\t-81.05760500000001\t33.952013\tCayce city\tSC\tSouth Carolina\tLexington County\t12458\t38.2\t21.8\t9.8\t23586\t103768\t0.3032\t29033\tRomney\t29033\t0.055046385\t29033.0\n19926\t-81.100628\t33.912135\tPine Ridge town\tSC\tSouth Carolina\tLexington County\t1616\t40.4\t18.3\t8.7\t24434\t107990\t0.3032\t29172\tRomney\t29172\t0.007140388\t29172.0\n19927\t-81.106477\t33.737888\tSwansea town\tSC\tSouth Carolina\tLexington County\t541\t37.5\t9.4\t14.2\t21082\t82500\t0.3032\t29160\tRomney\t29160\t0.002390439\t29160.0\n19928\t-81.137338\t33.909564\tSouth Congaree town\tSC\tSouth Carolina\tLexington County\t2442\t36.1\t7.5\t12.4\t21796\t91436\t0.3032\t29170\tRomney\t29170\t0.010790117\t29170.0\n19929\t-81.22949200000001\t33.984369\tLexington town\tSC\tSouth Carolina\tLexington County\t14742\t35.7\t37.7\t7.9\t31349\t169875\t0.3032\t29072\tRomney\t29072\t0.06513837\t29072.0\n19930\t-81.34389399999999\t34.165227\tChapin town\tSC\tSouth Carolina\tLexington County\t1023\t41.8\t32.8\t8.5\t31160\t136709\t0.3032\t29036\tRomney\t29036\t0.004520184\t29036.0\n19931\t-81.08509699999999\t33.993608\tWest Columbia city\tSC\tSouth Carolina\tLexington County\t13108\t41.7\t23.2\t10.3\t23773\t110616\t0.3032\t29169\tRomney\t29169\t0.057918447000000005\t29169.0\n19932\t-81.181527\t34.100487\tIrmo town\tSC\tSouth Carolina\tLexington County\t11582\t35.8\t45.7\t8.9\t29622\t138703\t0.3032\t29063\tRomney\t29063\t0.051175729\t29063.0\n19933\t-81.422395\t33.92492\tSummit town\tSC\tSouth Carolina\tLexington County\t340\t33.8\t5.1\t6.8\t19943\t78571\t0.3032\t29070\tRomney\t29070\t0.0015023089999999998\t29070.0\n19934\t-81.143512\t34.047431\tSeven Oaks CDP\tSC\tSouth Carolina\tLexington County\t15763\t38.7\t42.0\t8.6\t29288\t148985\t0.3032\t29210\tRomney\t29210\t0.069649716\t29210.0\n19935\t-82.504412\t34.018581\tMount Carmel CDP\tSC\tSouth Carolina\tMcCormick County\t237\t63.0\t37.4\t16.1\t30629\t210000\t0.5141\t29840\tRomney\t29840\t0.001047198\t29840.0\n19936\t-82.258738\t33.848093\tPlum Branch town\tSC\tSouth Carolina\tMcCormick County\t93\t42.1\t9.0\t15.4\t17287\t55000\t0.5141\t29845\tRomney\t29845\t0.000410926\t29845.0\n19937\t-82.16600600000001\t33.658087\tClarks Hill CDP\tSC\tSouth Carolina\tMcCormick County\t389\t47.1\t12.9\t16.9\t18682\t65000\t0.5141\t29821\tRomney\t29821\t0.001718819\t29821.0\n19938\t-82.217548\t33.785911999999996\tParksville town\tSC\tSouth Carolina\tMcCormick County\t124\t46.9\t12.8\t16.4\t18710\t64000\t0.5141\t29844\tRomney\t29844\t0.0005479009999999999\t29844.0\n19939\t-82.29293\t33.911021999999996\tMcCormick town\tSC\tSouth Carolina\tMcCormick County\t1574\t40.6\t17.2\t13.1\t17337\t67031\t0.5141\t29835\tRomney\t29835\t0.006954809\t29835.0\n19940\t-82.45769200000001\t33.968326\tWillington CDP\tSC\tSouth Carolina\tMcCormick County\t177\t63.1\t37.8\t14.6\t30633\t209375\t0.5141\t29840\tRomney\t29840\t0.000782085\t29840.0\n19941\t-82.217493\t33.719411\tModoc CDP\tSC\tSouth Carolina\tMcCormick County\t265\t46.8\t12.9\t16.9\t18669\t63750\t0.5141\t29838\tRomney\t29838\t0.001170918\t29838.0\n19942\t-79.397932\t34.178205\tMarion city\tSC\tSouth Carolina\tMarion County\t6658\t35.5\t18.2\t24.1\t16894\t73792\t0.6465\t29571\tRomney\t29571\t0.029418754\t29571.0\n19943\t-79.149362\t34.235468\tNichols town\tSC\tSouth Carolina\tMarion County\t348\t39.4\t10.4\t19.3\t19804\t75000\t0.6465\t29581\tRomney\t29581\t0.001537658\t29581.0\n19944\t-79.25361600000001\t34.203983\tMullins city\tSC\tSouth Carolina\tMarion County\t4716\t38.8\t14.7\t23.8\t15604\t74532\t0.6465\t29574\tRomney\t29574\t0.020837916\t29574.0\n19945\t-79.47189200000001\t34.283373\tSellers town\tSC\tSouth Carolina\tMarion County\t280\t42.2\t2.5\t16.5\t18359\t61000\t0.6465\t29592\tRomney\t29592\t0.001237196\t29592.0\n19946\t-79.586827\t34.644351\tTatum town\tSC\tSouth Carolina\tMarlboro County\t68\t42.1\t13.3\t32.3\t18381\t58333\t0.6191\t29594\tRomney\t29594\t0.000300462\t29594.0\n19947\t-79.686187\t34.629877\tBennettsville city\tSC\tSouth Carolina\tMarlboro County\t9801\t35.9\t12.7\t20.6\t15622\t68130\t0.6191\t29512\tRomney\t29512\t0.043306279\t29512.0\n19948\t-79.546375\t34.579291999999995\tClio town\tSC\tSouth Carolina\tMarlboro County\t720\t36.8\t15.2\t15.4\t14503\t60926\t0.6191\t29525\tRomney\t29525\t0.0031813609999999997\t29525.0\n19949\t-79.652946\t34.508787\tBlenheim town\tSC\tSouth Carolina\tMarlboro County\t132\t43.1\t9.5\t19.1\t16997\t47143\t0.6191\t29516\tRomney\t29516\t0.00058325\t29516.0\n19950\t-79.545511\t34.666618\tMcColl town\tSC\tSouth Carolina\tMarlboro County\t2273\t36.0\t7.8\t23.2\t15615\t62911\t0.6191\t29570\tRomney\t29570\t0.01004338\t29570.0\n19951\t-81.328113\t34.237809999999996\tPeak town\tSC\tSouth Carolina\tNewberry County\t68\t43.3\t12.2\t5.4\t26998\t106250\t0.4228\t29122\tRomney\t29122\t0.000300462\t29122.0\n19952\t-81.534428\t34.210928\tProsperity town\tSC\tSouth Carolina\tNewberry County\t1134\t38.2\t15.4\t12.2\t16085\t88529\t0.4228\t29127\tRomney\t29127\t0.005010644\t29127.0\n19953\t-81.41341\t34.195121\tLittle Mountain town\tSC\tSouth Carolina\tNewberry County\t285\t44.8\t12.8\t6.5\t26915\t110294\t0.4228\t29075\tRomney\t29075\t0.001259289\t29075.0\n19954\t-81.419478\t34.268281\tPomaria town\tSC\tSouth Carolina\tNewberry County\t190\t40.2\t9.9\t9.2\t18377\t90833\t0.4228\t29126\tRomney\t29126\t0.000839526\t29126.0\n19955\t-81.610393\t34.278537\tNewberry town\tSC\tSouth Carolina\tNewberry County\t10696\t34.7\t21.7\t14.9\t18056\t84333\t0.4228\t29108\tRomney\t29108\t0.047260887\t29108.0\n19956\t-81.713973\t34.217327000000004\tSilverstreet town\tSC\tSouth Carolina\tNewberry County\t225\t43.4\t15.4\t12.0\t19425\t94167\t0.4228\t29145\tRomney\t29145\t0.000994175\t29145.0\n19957\t-81.61425\t34.504061\tWhitmire town\tSC\tSouth Carolina\tNewberry County\t1449\t44.6\t11.0\t14.2\t17083\t52857\t0.4228\t29178\tRomney\t29178\t0.006402489\t29178.0\n19958\t-82.95981\t34.681707\tSeneca city\tSC\tSouth Carolina\tOconee County\t8082\t40.2\t21.3\t12.9\t22401\t118009\t0.2788\t29678\tRomney\t29678\t0.035710779\t29678.0\n19959\t-82.975739\t34.887341\tSalem town\tSC\tSouth Carolina\tOconee County\t131\t37.8\t5.8\t13.5\t18493\t68750\t0.2788\t29676\tRomney\t29676\t0.000578831\t29676.0\n19960\t-83.091124\t34.666381\tWestminster city\tSC\tSouth Carolina\tOconee County\t2746\t39.1\t11.5\t16.5\t19882\t91104\t0.2788\t29693\tRomney\t29693\t0.012133358\t29693.0\n19961\t-82.92474200000001\t34.677673999999996\tUtica CDP\tSC\tSouth Carolina\tOconee County\t1462\t37.7\t12.1\t18.1\t20071\t68611\t0.2788\t29678\tRomney\t29678\t0.0064599309999999995\t29678.0\n19962\t-83.04289200000001\t34.75929\tWest Union town\tSC\tSouth Carolina\tOconee County\t317\t42.9\t15.2\t11.3\t21923\t100000\t0.2788\t29696\tRomney\t29696\t0.0014006829999999998\t29696.0\n19963\t-83.06246999999999\t34.771855\tWalhalla city\tSC\tSouth Carolina\tOconee County\t3766\t39.5\t16.3\t15.4\t19359\t96645\t0.2788\t29691\tRomney\t29691\t0.016640286\t29691.0\n19964\t-80.41963\t33.436023\tVance town\tSC\tSouth Carolina\tOrangeburg County\t206\t39.8\t5.0\t14.8\t12133\t56429\t0.7137\t29163\tRomney\t29163\t0.000910223\t29163.0\n19965\t-80.86536\t33.491575\tOrangeburg city\tSC\tSouth Carolina\tOrangeburg County\t12429\t29.2\t32.8\t21.8\t19436\t99569\t0.7137\t29115\tRomney\t29115\t0.054918247\t29115.0\n19966\t-80.83326600000001\t33.518341\tBrookdale CDP\tSC\tSouth Carolina\tOrangeburg County\t4578\t36.6\t32.0\t19.6\t17710\t76850\t0.7137\t29115\tRomney\t29115\t0.020228155\t29115.0\n19967\t-80.836084\t33.372212\tRowesville town\tSC\tSouth Carolina\tOrangeburg County\t385\t38.9\t10.1\t16.8\t17127\t71429\t0.7137\t29133\tRomney\t29133\t0.001701145\t29133.0\n19968\t-80.828723\t33.491795\tWilkinson Heights CDP\tSC\tSouth Carolina\tOrangeburg County\t2848\t28.6\t21.6\t17.8\t14245\t67583\t0.7137\t29115\tRomney\t29115\t0.012584051\t29115.0\n19969\t-81.11165600000001\t33.668203999999996\tWoodford town\tSC\tSouth Carolina\tOrangeburg County\t185\t42.2\t12.9\t15.5\t16787\t70000\t0.7137\t29112\tRomney\t29112\t0.000817433\t29112.0\n19970\t-81.102809\t33.617117\tNorth town\tSC\tSouth Carolina\tOrangeburg County\t768\t42.4\t12.7\t15.7\t16833\t69750\t0.7137\t29112\tRomney\t29112\t0.003393452\t29112.0\n19971\t-80.81548599999999\t33.251543\tBranchville town\tSC\tSouth Carolina\tOrangeburg County\t974\t41.2\t10.7\t15.3\t17911\t70156\t0.7137\t29432\tRomney\t29432\t0.004303675\t29432.0\n19972\t-80.899204\t33.477845\tEdisto CDP\tSC\tSouth Carolina\tOrangeburg County\t2537\t39.0\t13.2\t19.3\t18168\t74438\t0.7137\t29115\tRomney\t29115\t0.01120988\t29115.0\n19973\t-80.342801\t33.397524\tEutawville town\tSC\tSouth Carolina\tOrangeburg County\t367\t40.4\t8.2\t18.8\t13550\t59444\t0.7137\t29048\tRomney\t29048\t0.00162161\t29048.0\n19974\t-81.279165\t33.496102\tSpringfield town\tSC\tSouth Carolina\tOrangeburg County\t472\t42.8\t11.9\t15.5\t16947\t62500\t0.7137\t29146\tRomney\t29146\t0.002085559\t29146.0\n19975\t-80.486815\t33.479936\tSantee town\tSC\tSouth Carolina\tOrangeburg County\t707\t44.7\t18.4\t21.9\t18651\t95833\t0.7137\t29142\tRomney\t29142\t0.00312392\t29142.0\n19976\t-81.12670899999999\t33.450398\tNorway town\tSC\tSouth Carolina\tOrangeburg County\t397\t38.5\t12.9\t15.8\t16296\t70833\t0.7137\t29113\tRomney\t29113\t0.001754167\t29113.0\n19977\t-81.119375\t33.55348\tLivingston town\tSC\tSouth Carolina\tOrangeburg County\t153\t40.4\t6.8\t20.9\t15664\t62500\t0.7137\t29107\tRomney\t29107\t0.0006760389999999999\t29107.0\n19978\t-80.57175\t33.529978\tElloree town\tSC\tSouth Carolina\tOrangeburg County\t725\t45.1\t14.5\t17.9\t17450\t71957\t0.7137\t29047\tRomney\t29047\t0.003203454\t29047.0\n19979\t-81.124411\t33.536742\tNeeses town\tSC\tSouth Carolina\tOrangeburg County\t434\t40.2\t7.9\t19.3\t18007\t66667\t0.7137\t29107\tRomney\t29107\t0.001917654\t29107.0\n19980\t-80.412962\t33.324290999999995\tHolly Hill town\tSC\tSouth Carolina\tOrangeburg County\t1421\t39.7\t18.0\t22.1\t15874\t79423\t0.7137\t29059\tRomney\t29059\t0.00627877\t29059.0\n19981\t-80.919725\t33.435569\tCordova town\tSC\tSouth Carolina\tOrangeburg County\t156\t35.9\t10.8\t13.9\t19696\t87000\t0.7137\t29039\tRomney\t29039\t0.000689295\t29039.0\n19982\t-81.00678\t33.378045\tCope town\tSC\tSouth Carolina\tOrangeburg County\t115\t40.3\t15.6\t14.3\t18870\t78333\t0.7137\t29038\tRomney\t29038\t0.000508134\t29038.0\n19983\t-80.685101\t33.348484\tBowman town\tSC\tSouth Carolina\tOrangeburg County\t1128\t40.5\t10.5\t18.5\t13770\t69000\t0.7137\t29018\tRomney\t29018\t0.0049841320000000005\t29018.0\n19984\t-82.709597\t34.883743\tPickens town\tSC\tSouth Carolina\tPickens County\t2930\t40.7\t12.2\t13.8\t18486\t78438\t0.2449\t29671\tRomney\t29671\t0.012946372\t29671.0\n19985\t-82.640037\t34.845791999999996\tArial CDP\tSC\tSouth Carolina\tPickens County\t2574\t40.5\t14.5\t7.4\t20385\t90500\t0.2449\t29640\tRomney\t29640\t0.011373366000000001\t29640.0\n19986\t-82.75251899999999\t34.766\tNorris town\tSC\tSouth Carolina\tPickens County\t929\t38.9\t12.1\t10.3\t20897\t73636\t0.2449\t29667\tRomney\t29667\t0.00410484\t29667.0\n19987\t-82.780975\t34.724067\tCentral town\tSC\tSouth Carolina\tPickens County\t4308\t26.6\t36.9\t11.4\t18338\t95833\t0.2449\t29630\tRomney\t29630\t0.019035144\t29630.0\n19988\t-82.60812800000001\t34.820102\tEasley city\tSC\tSouth Carolina\tPickens County\t18391\t39.1\t21.6\t11.2\t25121\t119647\t0.2449\t29640\tRomney\t29640\t0.081261685\t29640.0\n19989\t-82.817206\t34.807474\tSix Mile town\tSC\tSouth Carolina\tPickens County\t621\t39.6\t16.6\t13.5\t20770\t106000\t0.2449\t29682\tRomney\t29682\t0.0027439240000000004\t29682.0\n19990\t-82.695651\t34.791234\tLiberty town\tSC\tSouth Carolina\tPickens County\t3022\t38.8\t13.6\t14.3\t18762\t85759\t0.2449\t29657\tRomney\t29657\t0.01335288\t29657.0\n19991\t-82.793125\t34.684296999999994\tClemson city\tSC\tSouth Carolina\tPickens County\t13498\t26.4\t57.7\t12.8\t24339\t160061\t0.2449\t29631\tRomney\t29631\t0.059641684\t29631.0\n19992\t-80.971604\t34.032503000000005\tForest Acres city\tSC\tSouth Carolina\tRichland County\t10368\t46.0\t53.7\t8.5\t35598\t158577\t0.6534\t29206\tRomney\t29206\t0.04581160099999999\t29206.0\n19993\t-80.89785\t34.073147\tColumbia city\tSC\tSouth Carolina\tRichland County\t120188\t29.2\t38.1\t15.7\t22478\t134538\t0.6534\t29223\tRomney\t29223\t0.5310575470000001\t29223.0\n19994\t-80.954799\t34.076483\tDentsville CDP\tSC\tSouth Carolina\tRichland County\t14401\t36.8\t31.2\t10.2\t25107\t116325\t0.6534\t29223\tRomney\t29223\t0.063631642\t29223.0\n19995\t-80.987167\t34.241053\tBlythewood town\tSC\tSouth Carolina\tRichland County\t479\t38.8\t22.2\t10.8\t24677\t127500\t0.6534\t29016\tRomney\t29016\t0.002116489\t29016.0\n19996\t-81.264441\t34.120528\tLake Murray of Richland CDP\tSC\tSouth Carolina\tRichland County\t5200\t50.8\t44.3\t5.0\t45781\t281020\t0.6534\t29177\tRomney\t29177\t0.022976497000000002\t29177.0\n19997\t-80.93089599999999\t34.058651\tWoodfield CDP\tSC\tSouth Carolina\tRichland County\t9153\t35.7\t20.9\t14.2\t21692\t105710\t0.6534\t29223\tRomney\t29223\t0.040443054\t29223.0\n19998\t-80.695309\t33.878589\tEastover town\tSC\tSouth Carolina\tRichland County\t867\t36.5\t8.0\t20.1\t13452\t83333\t0.6534\t29044\tRomney\t29044\t0.003830889\t29044.0\n19999\t-80.9616\t34.053581\tArcadia Lakes town\tSC\tSouth Carolina\tRichland County\t852\t49.3\t43.7\t10.1\t34471\t152083\t0.6534\t29206\tRomney\t29206\t0.0037646109999999997\t29206.0\n20000\t-81.105846\t34.051106\tSt. Andrews CDP\tSC\tSouth Carolina\tRichland County\t21961\t29.9\t35.9\t11.3\t24389\t108442\t0.6534\t29210\tRomney\t29210\t0.097035934\t29210.0\n20001\t-81.771573\t34.000961\tSaluda town\tSC\tSouth Carolina\tSaluda County\t2972\t36.9\t13.6\t11.7\t15916\t78200\t0.3886\t29138\tRomney\t29138\t0.013131951999999999\t29138.0\n20002\t-81.731443\t33.857454\tWard town\tSC\tSouth Carolina\tSaluda County\t109\t36.6\t8.8\t12.7\t20557\t71250\t0.3886\t29166\tRomney\t29166\t0.00048162300000000003\t29166.0\n20003\t-81.661825\t33.845358000000004\tRidge Spring town\tSC\tSouth Carolina\tSaluda County\t781\t40.0\t12.8\t16.9\t16658\t81316\t0.3886\t29129\tRomney\t29129\t0.003450893\t29129.0\n20004\t-81.606311\t33.851408\tMonetta town\tSC\tSouth Carolina\tSaluda County\t216\t39.7\t10.7\t11.1\t18573\t67000\t0.3886\t29105\tRomney\t29105\t0.000954408\t29105.0\n20005\t-81.92586\t34.943369\tSpartanburg city\tSC\tSouth Carolina\tSpartanburg County\t39668\t36.6\t27.5\t17.6\t21026\t104200\t0.3772\t29306\tRomney\t29306\t0.175275325\t29306.0\n20006\t-82.18699000000001\t35.174982\tLandrum city\tSC\tSouth Carolina\tSpartanburg County\t2649\t43.8\t13.2\t13.2\t19750\t99904\t0.3772\t29356\tRomney\t29356\t0.011704758000000001\t29356.0\n20007\t-82.033525\t34.739476\tWoodruff city\tSC\tSouth Carolina\tSpartanburg County\t4126\t39.3\t10.7\t19.4\t18663\t78440\t0.3772\t29388\tRomney\t29388\t0.018230967\t29388.0\n20008\t-82.12365799999999\t34.958211\tLyman town\tSC\tSouth Carolina\tSpartanburg County\t2904\t40.7\t18.3\t10.6\t22744\t92600\t0.3772\t29365\tRomney\t29365\t0.01283149\t29365.0\n20009\t-82.101764\t34.953641999999995\tWellford city\tSC\tSouth Carolina\tSpartanburg County\t2121\t39.4\t8.9\t15.1\t17710\t77563\t0.3772\t29385\tRomney\t29385\t0.00937176\t29385.0\n20010\t-82.14894100000001\t35.116425\tCampobello town\tSC\tSouth Carolina\tSpartanburg County\t521\t41.9\t12.4\t7.7\t19578\t86250\t0.3772\t29322\tRomney\t29322\t0.002302068\t29322.0\n20011\t-82.093501\t35.050146999999996\tInman city\tSC\tSouth Carolina\tSpartanburg County\t1949\t40.0\t9.1\t11.4\t20219\t89706\t0.3772\t29349\tRomney\t29349\t0.008611768\t29349.0\n20012\t-81.977634\t35.044817\tBoiling Springs CDP\tSC\tSouth Carolina\tSpartanburg County\t7236\t38.0\t24.7\t11.1\t27184\t118597\t0.3772\t29316\tRomney\t29316\t0.03197268\t29316.0\n20013\t-81.752725\t34.909501\tCentral Pacolet town\tSC\tSouth Carolina\tSpartanburg County\t303\t42.9\t5.9\t15.8\t13734\t60625\t0.3772\t29372\tRomney\t29372\t0.0013388229999999998\t29372.0\n20014\t-81.971181\t34.961631\tSaxon CDP\tSC\tSouth Carolina\tSpartanburg County\t3716\t34.3\t4.4\t17.9\t13794\t58154\t0.3772\t29320\tRomney\t29320\t0.016419358000000002\t29320.0\n20015\t-82.094983\t34.929879\tStartex CDP\tSC\tSouth Carolina\tSpartanburg County\t1078\t34.6\t8.2\t16.6\t16807\t67000\t0.3772\t29377\tRomney\t29377\t0.004763205\t29377.0\n20016\t-82.10121600000001\t35.040699\tInman Mills CDP\tSC\tSouth Carolina\tSpartanburg County\t1412\t42.8\t14.2\t13.3\t26371\t85949\t0.3772\t29349\tRomney\t29349\t0.006239003000000001\t29349.0\n20017\t-81.96468399999999\t34.878774\tRoebuck CDP\tSC\tSouth Carolina\tSpartanburg County\t2107\t40.6\t18.0\t12.0\t23552\t111554\t0.3772\t29376\tRomney\t29376\t0.0093099\t29376.0\n20018\t-82.108813\t34.862415999999996\tReidville town\tSC\tSouth Carolina\tSpartanburg County\t643\t38.4\t13.8\t8.4\t24619\t125833\t0.3772\t29375\tRomney\t29375\t0.002841132\t29375.0\n20019\t-81.76038100000001\t34.904618\tPacolet town\tSC\tSouth Carolina\tSpartanburg County\t2996\t43.5\t7.0\t18.8\t16228\t72022\t0.3772\t29372\tRomney\t29372\t0.013237997\t29372.0\n20020\t-81.993399\t34.984821000000004\tSouthern Shops CDP\tSC\tSouth Carolina\tSpartanburg County\t3803\t34.3\t6.9\t16.0\t14946\t61512\t0.3772\t29320\tRomney\t29320\t0.016803773\t29320.0\n20021\t-81.804076\t35.018651\tCowpens town\tSC\tSouth Carolina\tSpartanburg County\t2643\t40.1\t11.8\t17.4\t20133\t85347\t0.3772\t29330\tRomney\t29330\t0.011678247\t29330.0\n20022\t-81.968747\t35.007469\tValley Falls CDP\tSC\tSouth Carolina\tSpartanburg County\t4990\t34.4\t22.7\t11.0\t22610\t119541\t0.3772\t29316\tRomney\t29316\t0.022048599999999998\t29316.0\n20023\t-82.14304399999999\t34.938796\tDuncan town\tSC\tSouth Carolina\tSpartanburg County\t3113\t30.8\t6.4\t14.0\t16682\t81687\t0.3772\t29334\tRomney\t29334\t0.013754968000000001\t29334.0\n20024\t-81.853886\t35.085371\tMayo CDP\tSC\tSouth Carolina\tSpartanburg County\t2110\t40.4\t11.3\t14.3\t21515\t91792\t0.3772\t29323\tRomney\t29323\t0.009323155999999999\t29323.0\n20025\t-81.85528000000001\t35.151182\tChesnee city\tSC\tSouth Carolina\tSpartanburg County\t1011\t39.7\t8.2\t26.2\t14161\t68077\t0.3772\t29323\tRomney\t29323\t0.004467161\t29323.0\n20026\t-80.204475\t33.984827\tMayesville town\tSC\tSouth Carolina\tSumter County\t985\t36.0\t15.4\t26.7\t12539\t66447\t0.5832\t29104\tRomney\t29104\t0.0043522790000000006\t29104.0\n20027\t-80.460832\t33.954302\tCherryvale CDP\tSC\tSouth Carolina\tSumter County\t2336\t32.5\t16.1\t17.9\t19754\t68472\t0.5832\t29152\tRomney\t29152\t0.01032175\t29152.0\n20028\t-80.52637299999999\t33.975301\tStateburg CDP\tSC\tSouth Carolina\tSumter County\t1166\t37.2\t28.0\t13.1\t24303\t135577\t0.5832\t29152\tRomney\t29152\t0.005152038\t29152.0\n20029\t-80.49725699999999\t33.986805\tOakland CDP\tSC\tSouth Carolina\tSumter County\t1152\t35.0\t22.0\t10.0\t22952\t97568\t0.5832\t29152\tRomney\t29152\t0.005090178\t29152.0\n20030\t-80.435955\t33.893048\tCane Savannah CDP\tSC\tSouth Carolina\tSumter County\t1702\t35.6\t18.7\t10.5\t25017\t120940\t0.5832\t29154\tRomney\t29154\t0.007520384000000001\t29154.0\n20031\t-80.33139200000001\t33.957283000000004\tMulberry CDP\tSC\tSouth Carolina\tSumter County\t844\t39.1\t10.0\t12.9\t16973\t89412\t0.5832\t29153\tRomney\t29153\t0.003729262\t29153.0\n20032\t-80.462106\t33.740027000000005\tPinewood town\tSC\tSouth Carolina\tSumter County\t484\t41.6\t10.5\t14.4\t17433\t78000\t0.5832\t29125\tRomney\t29125\t0.002138582\t29125.0\n20033\t-80.28619499999999\t34.007281\tOswego CDP\tSC\tSouth Carolina\tSumter County\t94\t40.9\t15.9\t9.7\t19397\t109375\t0.5832\t29153\tRomney\t29153\t0.000415344\t29153.0\n20034\t-80.33784\t33.886787\tSouth Sumter CDP\tSC\tSouth Carolina\tSumter County\t2966\t37.2\t9.3\t22.4\t14839\t60833\t0.5832\t29150\tRomney\t29150\t0.013105441\t29150.0\n20035\t-80.394723\t33.81698\tPrivateer CDP\tSC\tSouth Carolina\tSumter County\t2133\t38.0\t6.7\t12.7\t19948\t84583\t0.5832\t29154\tRomney\t29154\t0.009424782\t29154.0\n20036\t-80.396743\t33.912967\tMillwood CDP\tSC\tSouth Carolina\tSumter County\t807\t40.1\t30.1\t10.0\t25992\t107863\t0.5832\t29150\tRomney\t29150\t0.0035657759999999997\t29150.0\n20037\t-80.020445\t33.946422\tShiloh CDP\tSC\tSouth Carolina\tSumter County\t257\t40.3\t8.0\t18.0\t14581\t66667\t0.5832\t29162\tRomney\t29162\t0.001135569\t29162.0\n20038\t-80.29517\t33.92595\tEast Sumter CDP\tSC\tSouth Carolina\tSumter County\t1133\t41.1\t9.5\t17.3\t16034\t78125\t0.5832\t29153\tRomney\t29153\t0.005006225\t29153.0\n20039\t-80.39253599999999\t33.94016\tSumter city\tSC\tSouth Carolina\tSumter County\t36999\t33.2\t24.5\t16.9\t19947\t104523\t0.5832\t29150\tRomney\t29150\t0.163482196\t29150.0\n20040\t-80.349147\t33.842888\tLakewood CDP\tSC\tSouth Carolina\tSumter County\t2965\t38.0\t13.8\t14.6\t18314\t63649\t0.5832\t29150\tRomney\t29150\t0.013101022\t29150.0\n20041\t-80.43858900000001\t34.018934\tDalzell CDP\tSC\tSouth Carolina\tSumter County\t2789\t33.3\t16.2\t13.6\t19793\t87899\t0.5832\t29040\tRomney\t29040\t0.012323356\t29040.0\n20042\t-80.532577\t34.103432\tRembert CDP\tSC\tSouth Carolina\tSumter County\t396\t35.9\t7.8\t14.6\t14535\t65417\t0.5832\t29128\tRomney\t29128\t0.0017497489999999999\t29128.0\n20043\t-80.51559300000001\t33.882884000000004\tWedgewood CDP\tSC\tSouth Carolina\tSumter County\t1615\t31.9\t7.4\t15.9\t15983\t77234\t0.5832\t29168\tRomney\t29168\t0.00713597\t29168.0\n20044\t-81.624703\t34.723847\tUnion city\tSC\tSouth Carolina\tUnion County\t7809\t43.1\t16.1\t22.8\t18891\t75388\t0.4622\t29379\tRomney\t29379\t0.034504513\t29379.0\n20045\t-81.584808\t34.715911\tMonarch Mill CDP\tSC\tSouth Carolina\tUnion County\t1721\t42.3\t9.8\t18.8\t19506\t59048\t0.4622\t29379\tRomney\t29379\t0.007604336999999999\t29379.0\n20046\t-81.46413000000001\t34.591757\tCarlisle town\tSC\tSouth Carolina\tUnion County\t459\t39.2\t7.4\t22.2\t19876\t65789\t0.4622\t29031\tRomney\t29031\t0.0020281179999999998\t29031.0\n20047\t-81.460229\t34.79376\tLockhart town\tSC\tSouth Carolina\tUnion County\t36\t46.7\t7.7\t14.3\t21850\t40000\t0.4622\t29364\tRomney\t29364\t0.000159068\t29364.0\n20048\t-81.68434\t34.72461\tBuffalo CDP\tSC\tSouth Carolina\tUnion County\t1626\t40.0\t9.0\t14.8\t20010\t60000\t0.4622\t29321\tRomney\t29321\t0.007184574\t29321.0\n20049\t-81.681012\t34.834692\tJonesville town\tSC\tSouth Carolina\tUnion County\t918\t40.5\t7.4\t23.0\t20251\t62800\t0.4622\t29353\tRomney\t29353\t0.004056235\t29353.0\n20050\t-79.82905699999999\t33.666083\tKingstree town\tSC\tSouth Carolina\tWilliamsburg County\t3295\t38.4\t22.6\t19.8\t16132\t76840\t0.6952\t29556\tRomney\t29556\t0.014559146\t29556.0\n20051\t-79.98924699999999\t33.579484\tGreeleyville town\tSC\tSouth Carolina\tWilliamsburg County\t396\t39.1\t12.6\t14.9\t17227\t68000\t0.6952\t29056\tRomney\t29056\t0.0017497489999999999\t29056.0\n20052\t-79.446311\t33.753902000000004\tHemingway town\tSC\tSouth Carolina\tWilliamsburg County\t412\t44.4\t21.4\t11.1\t22127\t88667\t0.6952\t29554\tRomney\t29554\t0.001820446\t29554.0\n20053\t-79.51325600000001\t33.732177\tStuckey town\tSC\tSouth Carolina\tWilliamsburg County\t249\t37.7\t8.8\t10.7\t15969\t53750\t0.6952\t29580\tRomney\t29580\t0.001100221\t29580.0\n20054\t-79.879326\t33.525126\tLane town\tSC\tSouth Carolina\tWilliamsburg County\t596\t40.0\t9.0\t17.8\t13911\t52826\t0.6952\t29564\tRomney\t29564\t0.00263346\t29564.0\n20055\t-81.223013\t35.111655\tClover town\tSC\tSouth Carolina\tYork County\t4859\t36.3\t14.9\t19.7\t20188\t94318\t0.3905\t29710\tRomney\t29710\t0.021469769\t29710.0\n20056\t-81.021745\t35.037227\tTega Cay city\tSC\tSouth Carolina\tYork County\t7202\t41.6\t49.5\t10.9\t38931\t217730\t0.3905\t29708\tRomney\t29708\t0.031822448999999996\t29708.0\n20057\t-81.226476\t34.868959000000004\tMcConnells town\tSC\tSouth Carolina\tYork County\t308\t37.5\t10.9\t16.6\t19985\t92857\t0.3905\t29726\tRomney\t29726\t0.001360916\t29726.0\n20058\t-81.415873\t34.980742\tHickory Grove town\tSC\tSouth Carolina\tYork County\t378\t39.6\t14.2\t19.8\t19529\t82500\t0.3905\t29717\tRomney\t29717\t0.001670215\t29717.0\n20059\t-80.985837\t35.005\tRiverview CDP\tSC\tSouth Carolina\tYork County\t751\t32.5\t31.9\t8.3\t26390\t197727\t0.3905\t297HH\tRomney\t297HH\t0.003318336\t0.0\n20060\t-81.038668\t35.014016\tIndia Hook CDP\tSC\tSouth Carolina\tYork County\t3305\t43.8\t22.4\t12.5\t31146\t179078\t0.3905\t29732\tRomney\t29732\t0.014603331\t29732.0\n20061\t-81.236437\t34.996821999999995\tYork city\tSC\tSouth Carolina\tYork County\t8121\t35.6\t16.4\t16.1\t18299\t101062\t0.3905\t29745\tRomney\t29745\t0.035883103\t29745.0\n20062\t-80.943673\t35.00659\tFort Mill town\tSC\tSouth Carolina\tYork County\t10231\t37.9\t31.1\t14.4\t25930\t161553\t0.3905\t29715\tRomney\t29715\t0.045206258\t29715.0\n20063\t-81.409896\t35.047591\tSmyrna town\tSC\tSouth Carolina\tYork County\t66\t39.4\t15.6\t20.0\t19581\t77500\t0.3905\t29743\tRomney\t29743\t0.000291625\t29743.0\n20064\t-81.34259300000001\t34.951919000000004\tSharon town\tSC\tSouth Carolina\tYork County\t497\t38.9\t11.1\t14.9\t20438\t99000\t0.3905\t29717\tRomney\t29717\t0.002196023\t29717.0\n20065\t-81.09839699999999\t34.983031\tNewport CDP\tSC\tSouth Carolina\tYork County\t4467\t38.9\t24.5\t14.7\t27840\t163451\t0.3905\t29732\tRomney\t29732\t0.019737695\t29732.0\n20066\t-81.026359\t34.937812\tRock Hill city\tSC\tSouth Carolina\tYork County\t65106\t34.6\t27.0\t17.9\t23483\t124281\t0.3905\t29730\tRomney\t29730\t0.287674582\t29730.0\n20067\t-81.05484100000001\t35.111940000000004\tLake Wylie CDP\tSC\tSouth Carolina\tYork County\t4467\t56.9\t49.0\t11.1\t48809\t284808\t0.3905\t29708\tRomney\t29708\t0.019737695\t29708.0\n20068\t-80.95422099999999\t34.885646\tLesslie CDP\tSC\tSouth Carolina\tYork County\t3256\t39.3\t16.8\t15.2\t23774\t126266\t0.3905\t29704\tRomney\t29704\t0.014386821999999999\t29704.0\n20069\t-98.71145200000001\t43.728065\tWhite Lake city\tSD\tSouth Dakota\tAurora County\t396\t44.0\t6.8\t3.5\t15703\t40000\t0.3971\t57383\tRomney\t57383\t0.002018877\t57383.0\n20070\t-98.484757\t43.715941\tPlankinton city\tSD\tSouth Dakota\tAurora County\t575\t41.3\t21.0\t1.3\t16371\t69750\t0.3971\t57368\tRomney\t57368\t0.00293145\t57368.0\n20071\t-98.589469\t43.52714\tStorla CDP\tSD\tSouth Dakota\tAurora County\t15\t46.3\t9.1\t0.0\t15367\t5000\t0.3971\t57344\tRomney\t57344\t7.65e-05\t57344.0\n20072\t-98.352593\t43.86267\tAurora Center CDP\tSD\tSouth Dakota\tAurora County\t7\t0.0\t0.0\t0.0\t13620\t0\t0.3971\t57368\tRomney\t57368\t3.570000000000001e-05\t57368.0\n20073\t-98.437641\t43.589289\tStickney town\tSD\tSouth Dakota\tAurora County\t325\t43.1\t12.8\t3.2\t21066\t58500\t0.3971\t57375\tRomney\t57375\t0.001656906\t57375.0\n20074\t-98.220781\t44.363433\tHuron city\tSD\tSouth Dakota\tBeadle County\t11230\t43.3\t23.1\t3.5\t21464\t87302\t0.3967\t57350\tRomney\t57350\t0.057252492\t57350.0\n20075\t-97.98842900000001\t44.434007\tYale town\tSD\tSouth Dakota\tBeadle County\t110\t40.8\t14.1\t1.4\t17469\t68333\t0.3967\t57386\tRomney\t57386\t0.0005607990000000001\t57386.0\n20076\t-98.473814\t44.410641\tWolsey town\tSD\tSouth Dakota\tBeadle County\t428\t46.6\t14.4\t1.8\t19090\t76667\t0.3967\t57384\tRomney\t57384\t0.002182018\t57384.0\n20077\t-98.427581\t44.291152000000004\tVirgil town\tSD\tSouth Dakota\tBeadle County\t26\t41.3\t15.8\t0.0\t18798\t80000\t0.3967\t57379\tRomney\t57379\t0.000132553\t57379.0\n20078\t-98.346597\t44.493193\tBroadland town\tSD\tSouth Dakota\tBeadle County\t34\t45.0\t20.8\t0.0\t16480\t55000\t0.3967\t57348\tRomney\t57348\t0.00017333799999999999\t57348.0\n20079\t-98.696117\t44.455378\tWessington city\tSD\tSouth Dakota\tBeadle County\t225\t45.7\t21.0\t2.3\t16555\t61250\t0.3967\t57381\tRomney\t57381\t0.001147089\t57381.0\n20080\t-98.408178\t44.629342\tHitchcock town\tSD\tSouth Dakota\tBeadle County\t98\t45.3\t20.6\t1.8\t16252\t56667\t0.3967\t57348\tRomney\t57348\t0.000499621\t57348.0\n20081\t-98.041984\t44.36934\tCavour town\tSD\tSouth Dakota\tBeadle County\t131\t40.6\t14.9\t1.2\t17527\t70000\t0.3967\t57324\tRomney\t57324\t0.0006678610000000001\t57324.0\n20082\t-101.725944\t43.174871\tMartin city\tSD\tSouth Dakota\tBennett County\t1094\t29.5\t14.6\t11.1\t12435\t60625\t0.4555\t57551\tRomney\t57551\t0.0055774019999999995\t57551.0\n20083\t-101.929294\t43.281064\tAllen CDP\tSD\tSouth Dakota\tBennett County\t411\t20.9\t3.9\t40.8\t4775\t58750\t0.4555\t57714\tRomney\t57714\t0.002095349\t57714.0\n20084\t-98.059115\t43.005146\tAvon city\tSD\tSouth Dakota\tBon Homme County\t534\t45.1\t20.6\t2.8\t16648\t76538\t0.3796\t57315\tRomney\t57315\t0.002722425\t57315.0\n20085\t-97.864203\t42.989876\tTyndall city\tSD\tSouth Dakota\tBon Homme County\t1104\t45.8\t14.8\t4.4\t16179\t77031\t0.3796\t57066\tRomney\t57066\t0.005628384\t57066.0\n20086\t-97.894435\t42.855011\tSpringfield city\tSD\tSouth Dakota\tBon Homme County\t911\t36.5\t14.5\t4.0\t15945\t91250\t0.3796\t57062\tRomney\t57062\t0.004644436\t57062.0\n20087\t-97.720366\t43.148351\tScotland city\tSD\tSouth Dakota\tBon Homme County\t817\t49.4\t14.6\t3.8\t17391\t55172\t0.3796\t57059\tRomney\t57059\t0.004165208\t57059.0\n20088\t-97.659716\t42.948399\tTabor town\tSD\tSouth Dakota\tBon Homme County\t423\t41.0\t13.1\t2.3\t17152\t79667\t0.3796\t57063\tRomney\t57063\t0.002156528\t57063.0\n20089\t-96.478066\t44.234415999999996\tElkton city\tSD\tSouth Dakota\tBrookings County\t734\t40.4\t17.2\t1.8\t19224\t86053\t0.4699\t57026\tRomney\t57026\t0.00374206\t57026.0\n20090\t-97.043959\t44.244523\tSinai town\tSD\tSouth Dakota\tBrookings County\t147\t42.8\t36.1\t3.4\t25215\t143750\t0.4699\t57061\tRomney\t57061\t0.000749432\t57061.0\n20091\t-96.641896\t44.327892\tBushnell town\tSD\tSouth Dakota\tBrookings County\t71\t43.0\t31.4\t5.0\t24558\t129167\t0.4699\t57002\tRomney\t57002\t0.00036197\t57002.0\n20092\t-96.922145\t44.323627\tVolga city\tSD\tSouth Dakota\tBrookings County\t1371\t36.9\t33.5\t3.1\t19098\t115921\t0.4699\t57071\tRomney\t57071\t0.006989596\t57071.0\n20093\t-96.78551800000001\t44.304033000000004\tBrookings city\tSD\tSouth Dakota\tBrookings County\t20332\t24.9\t43.0\t4.9\t22285\t138352\t0.4699\t57006\tRomney\t57006\t0.10365607\t57006.0\n20094\t-96.64469\t44.43421\tWhite city\tSD\tSouth Dakota\tBrookings County\t539\t41.1\t17.1\t2.3\t17994\t100000\t0.4699\t57276\tRomney\t57276\t0.0027479159999999996\t57276.0\n20095\t-96.89039\t44.438249\tBruce city\tSD\tSouth Dakota\tBrookings County\t304\t41.7\t18.3\t1.9\t21296\t103846\t0.4699\t57220\tRomney\t57220\t0.001549845\t57220.0\n20096\t-96.686645\t44.282161\tAurora town\tSD\tSouth Dakota\tBrookings County\t514\t39.1\t24.7\t6.2\t20844\t112500\t0.4699\t57002\tRomney\t57002\t0.002620461\t57002.0\n20097\t-98.467679\t45.464867\tAberdeen city\tSD\tSouth Dakota\tBrown County\t24179\t37.5\t29.5\t3.4\t23512\t107890\t0.4512\t57401\tRomney\t57401\t0.123268745\t57401.0\n20098\t-98.495506\t45.325062\tWarner town\tSD\tSouth Dakota\tBrown County\t430\t41.3\t22.2\t4.1\t21275\t104808\t0.4512\t57479\tRomney\t57479\t0.002192215\t57479.0\n20099\t-98.310983\t45.614411\tColumbia city\tSD\tSouth Dakota\tBrown County\t171\t45.4\t17.5\t2.2\t19845\t66667\t0.4512\t57433\tRomney\t57433\t0.0008717880000000001\t57433.0\n20100\t-98.304338\t45.31756\tStratford town\tSD\tSouth Dakota\tBrown County\t96\t37.1\t16.9\t4.4\t17017\t95000\t0.4512\t57474\tRomney\t57474\t0.000489425\t57474.0\n20101\t-98.151826\t45.882197999999995\tHecla city\tSD\tSouth Dakota\tBrown County\t309\t48.8\t12.9\t4.8\t17406\t54375\t0.4512\t57446\tRomney\t57446\t0.001575336\t57446.0\n20102\t-98.100199\t45.451799\tGroton city\tSD\tSouth Dakota\tBrown County\t1402\t40.0\t25.8\t3.2\t21156\t97727\t0.4512\t57445\tRomney\t57445\t0.00714764\t57445.0\n20103\t-98.015196\t45.671786\tClaremont town\tSD\tSouth Dakota\tBrown County\t159\t45.6\t17.0\t2.4\t19811\t67000\t0.4512\t57432\tRomney\t57432\t0.00081061\t57432.0\n20104\t-98.497382\t45.647771\tWestport town\tSD\tSouth Dakota\tBrown County\t129\t43.3\t22.7\t2.5\t21851\t112500\t0.4512\t57426\tRomney\t57426\t0.000657664\t57426.0\n20105\t-98.506807\t45.832296\tFrederick town\tSD\tSouth Dakota\tBrown County\t248\t41.6\t23.7\t3.5\t19128\t63500\t0.4512\t57441\tRomney\t57441\t0.0012643469999999999\t57441.0\n20106\t-98.09924699999999\t45.244278\tVerdon town\tSD\tSouth Dakota\tBrown County\t6\t0.0\t33.3\t0.0\t17138\t0\t0.4512\t57434\tRomney\t57434\t3.06e-05\t57434.0\n20107\t-99.32311800000001\t43.781337\tChamberlain city\tSD\tSouth Dakota\tBrule County\t2210\t38.4\t29.2\t3.3\t23414\t105481\t0.3464\t57325\tRomney\t57325\t0.011266963999999999\t57325.0\n20108\t-99.184234\t43.779201\tPukwana town\tSD\tSouth Dakota\tBrule County\t290\t43.4\t15.8\t3.5\t19149\t93571\t0.3464\t57370\tRomney\t57370\t0.00147847\t57370.0\n20109\t-98.956935\t43.746646999999996\tKimball city\tSD\tSouth Dakota\tBrule County\t783\t40.6\t18.5\t2.5\t18728\t58182\t0.3464\t57355\tRomney\t57355\t0.00399187\t57355.0\n20110\t-99.4079\t44.05271\tFort Thompson CDP\tSD\tSouth Dakota\tBuffalo County\t1468\t23.2\t5.2\t34.5\t4958\t51429\t0.7363\t57339\tRomney\t57339\t0.007484119\t57339.0\n20111\t-103.85169599999999\t44.668162\tBelle Fourche city\tSD\tSouth Dakota\tButte County\t5029\t40.4\t12.8\t6.2\t17915\t93390\t0.2381\t57717\tRomney\t57717\t0.025638716000000002\t57717.0\n20112\t-103.55319899999999\t44.673111\tNisland town\tSD\tSouth Dakota\tButte County\t219\t40.5\t23.2\t8.5\t15121\t87500\t0.2381\t57762\tRomney\t57762\t0.0011164999999999999\t57762.0\n20113\t-103.41823199999999\t44.717584\tNewell city\tSD\tSouth Dakota\tButte County\t668\t43.5\t21.4\t5.5\t16550\t55800\t0.2381\t57788\tRomney\t57788\t0.00340558\t57788.0\n20114\t-103.69483100000001\t44.669336\tFruitdale town\tSD\tSouth Dakota\tButte County\t66\t40.4\t25.6\t8.3\t15262\t95000\t0.2381\t57742\tRomney\t57742\t0.000336479\t57742.0\n20115\t-99.80689699999999\t45.887358\tArtas town\tSD\tSouth Dakota\tCampbell County\t10\t47.5\t12.5\t0.0\t17900\t45000\t0.1944\t57437\tRomney\t57437\t5.1e-05\t57437.0\n20116\t-100.288726\t45.90055\tPollock town\tSD\tSouth Dakota\tCampbell County\t270\t46.6\t18.2\t1.3\t17273\t44000\t0.1944\t57648\tRomney\t57648\t0.0013765070000000001\t57648.0\n20117\t-100.06883\t45.726138\tMound City town\tSD\tSouth Dakota\tCampbell County\t67\t47.1\t18.8\t2.6\t17237\t46667\t0.1944\t57646\tRomney\t57646\t0.00034157800000000004\t57646.0\n20118\t-100.075133\t45.837503999999996\tHerreid city\tSD\tSouth Dakota\tCampbell County\t384\t46.7\t18.3\t1.3\t17273\t44615\t0.1944\t57632\tRomney\t57632\t0.001957699\t57632.0\n20119\t-98.530067\t43.067809000000004\tPickstown town\tSD\tSouth Dakota\tCharles Mix County\t160\t27.7\t14.1\t13.0\t12863\t73333\t0.39399999999999996\t57367\tRomney\t57367\t0.0008157080000000001\t57367.0\n20120\t-98.186375\t43.040745\tDante town\tSD\tSouth Dakota\tCharles Mix County\t86\t35.6\t13.5\t5.7\t15178\t80000\t0.39399999999999996\t57329\tRomney\t57329\t0.000438443\t57329.0\n20121\t-98.843595\t43.386957\tPlatte city\tSD\tSouth Dakota\tCharles Mix County\t1274\t45.4\t16.0\t1.3\t16444\t85976\t0.39399999999999996\t57369\tRomney\t57369\t0.0064950730000000005\t57369.0\n20122\t-98.697834\t43.253282\tGeddes city\tSD\tSouth Dakota\tCharles Mix County\t238\t41.9\t12.0\t2.9\t16654\t49286\t0.39399999999999996\t57342\tRomney\t57342\t0.001213365\t57342.0\n20123\t-98.426836\t43.136517\tRavinia town\tSD\tSouth Dakota\tCharles Mix County\t90\t36.0\t14.8\t5.6\t9676\t112500\t0.39399999999999996\t57356\tRomney\t57356\t0.000458836\t57356.0\n20124\t-98.298899\t43.080560999999996\tWagner city\tSD\tSouth Dakota\tCharles Mix County\t1604\t39.4\t12.5\t14.0\t13101\t77931\t0.39399999999999996\t57380\tRomney\t57380\t0.008177471\t57380.0\n20125\t-98.536397\t43.155803000000006\tLake Andes city\tSD\tSouth Dakota\tCharles Mix County\t769\t35.7\t13.8\t15.4\t13100\t36136\t0.39399999999999996\t57356\tRomney\t57356\t0.003920496\t57356.0\n20126\t-98.430084\t42.996601\tMarty CDP\tSD\tSouth Dakota\tCharles Mix County\t400\t27.4\t14.5\t13.4\t12889\t72500\t0.39399999999999996\t57361\tRomney\t57361\t0.00203927\t57361.0\n20127\t-97.580443\t44.959406\tGarden City town\tSD\tSouth Dakota\tClark County\t63\t38.8\t14.6\t3.3\t15723\t55000\t0.3915\t57236\tRomney\t57236\t0.000321185\t57236.0\n20128\t-97.50001\t44.703101000000004\tVienna town\tSD\tSouth Dakota\tClark County\t67\t40.0\t14.0\t3.0\t14108\t40000\t0.3915\t57271\tRomney\t57271\t0.00034157800000000004\t57271.0\n20129\t-97.513203\t44.771627\tNaples town\tSD\tSouth Dakota\tClark County\t22\t31.3\t12.5\t7.7\t15762\t75000\t0.3915\t57271\tRomney\t57271\t0.00011216\t57271.0\n20130\t-97.63863\t44.627938\tWillow Lake city\tSD\tSouth Dakota\tClark County\t254\t40.5\t14.0\t3.2\t14026\t45909\t0.3915\t57278\tRomney\t57278\t0.001294936\t57278.0\n20131\t-97.93745899999999\t44.910619\tRaymond town\tSD\tSouth Dakota\tClark County\t76\t40.4\t14.3\t2.8\t15563\t52500\t0.3915\t57258\tRomney\t57258\t0.00038746099999999997\t57258.0\n20132\t-97.73506400000001\t44.881318\tClark city\tSD\tSouth Dakota\tClark County\t1206\t48.0\t17.6\t4.5\t19553\t69722\t0.3915\t57225\tRomney\t57225\t0.006148398\t57225.0\n20133\t-97.641927\t45.090309000000005\tBradley town\tSD\tSouth Dakota\tClark County\t98\t48.4\t8.0\t0.0\t17585\t46667\t0.3915\t57217\tRomney\t57217\t0.000499621\t57217.0\n20134\t-96.92451700000001\t42.782064\tVermillion city\tSD\tSouth Dakota\tClay County\t10370\t24.1\t52.3\t4.4\t17903\t112144\t0.5646\t57069\tRomney\t57069\t0.052868063\t57069.0\n20135\t-97.105923\t43.008058\tWakonda town\tSD\tSouth Dakota\tClay County\t361\t47.2\t16.9\t3.4\t17323\t56250\t0.5646\t57073\tRomney\t57073\t0.001840441\t57073.0\n20136\t-97.158165\t44.910932\tWatertown city\tSD\tSouth Dakota\tCodington County\t20815\t36.3\t23.5\t4.2\t22605\t124595\t0.3981\t57201\tRomney\t57201\t0.10611848800000001\t57201.0\n20137\t-97.32722\t45.055033\tFlorence town\tSD\tSouth Dakota\tCodington County\t302\t37.4\t14.0\t2.9\t18046\t99444\t0.3981\t57235\tRomney\t57235\t0.0015396479999999998\t57235.0\n20138\t-96.909273\t44.88881\tKranzburg town\tSD\tSouth Dakota\tCodington County\t175\t34.5\t20.0\t6.5\t21334\t138636\t0.3981\t57245\tRomney\t57245\t0.00089218\t57245.0\n20139\t-97.462056\t44.880171000000004\tHenry town\tSD\tSouth Dakota\tCodington County\t276\t41.4\t10.8\t7.3\t18300\t99286\t0.3981\t57243\tRomney\t57243\t0.001407096\t57243.0\n20140\t-96.930142\t45.101499\tSouth Shore town\tSD\tSouth Dakota\tCodington County\t259\t42.2\t21.5\t5.7\t18490\t98333\t0.3981\t57263\tRomney\t57263\t0.001320427\t57263.0\n20141\t-97.478049\t45.084456\tWallace town\tSD\tSouth Dakota\tCodington County\t87\t37.5\t14.5\t2.0\t18006\t100000\t0.3981\t57272\tRomney\t57272\t0.000443541\t57272.0\n20142\t-100.796637\t45.683005\tLittle Eagle CDP\tSD\tSouth Dakota\tCorson County\t366\t25.4\t4.8\t10.1\t7006\t65000\t0.54\t57642\tRomney\t57642\t0.001865932\t57642.0\n20143\t-100.81134200000001\t45.813634\tMcLaughlin city\tSD\tSouth Dakota\tCorson County\t760\t29.1\t13.6\t18.2\t10281\t44091\t0.54\t57642\tRomney\t57642\t0.003874612\t57642.0\n20144\t-101.718971\t45.938735\tMorristown town\tSD\tSouth Dakota\tCorson County\t86\t45.0\t16.4\t5.1\t13967\t27500\t0.54\t57645\tRomney\t57645\t0.000438443\t57645.0\n20145\t-101.080857\t45.76924\tBullhead CDP\tSD\tSouth Dakota\tCorson County\t297\t25.5\t6.0\t15.2\t9589\t43333\t0.54\t57621\tRomney\t57621\t0.0015141579999999998\t57621.0\n20146\t-101.34954\t45.920192\tMcIntosh city\tSD\tSouth Dakota\tCorson County\t227\t44.0\t15.9\t5.8\t14011\t28500\t0.54\t57641\tRomney\t57641\t0.001157285\t57641.0\n20147\t-103.315061\t43.49225\tBuffalo Gap town\tSD\tSouth Dakota\tCuster County\t163\t46.3\t25.2\t1.9\t19046\t117857\t0.2954\t57766\tRomney\t57766\t0.000831002\t57766.0\n20148\t-103.594432\t43.609012\tPringle town\tSD\tSouth Dakota\tCuster County\t136\t49.4\t23.3\t2.0\t22231\t170000\t0.2954\t57773\tRomney\t57773\t0.0006933519999999999\t57773.0\n20149\t-103.208056\t43.686805\tFairburn town\tSD\tSouth Dakota\tCuster County\t81\t46.1\t24.1\t1.9\t19043\t125000\t0.2954\t57738\tRomney\t57738\t0.00041295199999999996\t57738.0\n20150\t-103.599523\t43.766818\tCuster city\tSD\tSouth Dakota\tCuster County\t1926\t46.8\t28.6\t1.8\t20913\t123837\t0.2954\t57730\tRomney\t57730\t0.009819083000000001\t57730.0\n20151\t-103.192815\t43.839555\tHermosa town\tSD\tSouth Dakota\tCuster County\t335\t46.3\t24.9\t1.8\t19032\t120536\t0.2954\t57744\tRomney\t57744\t0.0017078879999999999\t57744.0\n20152\t-98.104028\t43.792968\tLoomis CDP\tSD\tSouth Dakota\tDavison County\t51\t39.2\t18.8\t3.4\t19400\t116667\t0.3816\t57301\tRomney\t57301\t0.00026000700000000003\t57301.0\n20153\t-97.983047\t43.546293\tEthan town\tSD\tSouth Dakota\tDavison County\t347\t38.1\t16.2\t3.0\t24374\t116176\t0.3816\t57334\tRomney\t57334\t0.0017690660000000001\t57334.0\n20154\t-98.260814\t43.712139\tMount Vernon city\tSD\tSouth Dakota\tDavison County\t464\t39.3\t14.7\t1.9\t19335\t67941\t0.3816\t57363\tRomney\t57363\t0.002365553\t57363.0\n20155\t-98.034118\t43.731066\tMitchell city\tSD\tSouth Dakota\tDavison County\t14764\t35.7\t24.8\t4.0\t23429\t108803\t0.3816\t57301\tRomney\t57301\t0.075269438\t57301.0\n20156\t-97.493206\t45.496557\tRoslyn town\tSD\tSouth Dakota\tDay County\t193\t50.6\t12.9\t5.1\t18396\t44167\t0.5211\t57261\tRomney\t57261\t0.0009839480000000001\t57261.0\n20157\t-97.74849499999999\t45.346628\tBristol city\tSD\tSouth Dakota\tDay County\t408\t46.9\t16.8\t4.9\t21041\t46250\t0.5211\t57219\tRomney\t57219\t0.002080055\t57219.0\n20158\t-97.521668\t45.335412\tWebster city\tSD\tSouth Dakota\tDay County\t1778\t44.5\t23.0\t3.9\t17769\t58980\t0.5211\t57274\tRomney\t57274\t0.009064553000000001\t57274.0\n20159\t-97.30554000000001\t45.334346999999994\tWaubay city\tSD\tSouth Dakota\tDay County\t601\t45.9\t16.9\t6.2\t14026\t40714\t0.5211\t57273\tRomney\t57273\t0.003064002\t57273.0\n20160\t-97.712212\t45.258975\tButler town\tSD\tSouth Dakota\tDay County\t15\t56.3\t10.0\t0.0\t17886\t0\t0.5211\t57219\tRomney\t57219\t7.65e-05\t57219.0\n20161\t-97.39020500000001\t45.466924\tGrenville town\tSD\tSouth Dakota\tDay County\t54\t48.8\t17.9\t3.1\t22107\t80000\t0.5211\t57239\tRomney\t57239\t0.000275301\t57239.0\n20162\t-97.683451\t45.181761\tLily town\tSD\tSouth Dakota\tDay County\t18\t53.8\t7.7\t0.0\t18385\t22500\t0.5211\t57217\tRomney\t57217\t9.18e-05\t57217.0\n20163\t-97.90365\t45.41024\tAndover town\tSD\tSouth Dakota\tDay County\t107\t46.9\t16.9\t4.2\t21064\t46667\t0.5211\t57422\tRomney\t57422\t0.000545505\t57422.0\n20164\t-97.832099\t45.495324\tPierpont town\tSD\tSouth Dakota\tDay County\t106\t48.6\t19.8\t3.2\t18740\t58333\t0.5211\t57468\tRomney\t57468\t0.000540406\t57468.0\n20165\t-96.625165\t44.666885\tBrandt town\tSD\tSouth Dakota\tDeuel County\t109\t41.5\t13.3\t3.2\t17479\t70000\t0.4334\t57218\tRomney\t57218\t0.000555701\t57218.0\n20166\t-96.54652800000001\t44.55774\tAstoria town\tSD\tSouth Dakota\tDeuel County\t145\t42.1\t13.1\t2.5\t17449\t66667\t0.4334\t57213\tRomney\t57213\t0.000739235\t57213.0\n20167\t-96.642471\t44.572828\tToronto town\tSD\tSouth Dakota\tDeuel County\t195\t40.9\t12.9\t2.7\t17474\t62500\t0.4334\t57268\tRomney\t57268\t0.000994144\t57268.0\n20168\t-96.849704\t44.877517\tGoodwin town\tSD\tSouth Dakota\tDeuel County\t154\t43.5\t9.9\t3.0\t18908\t85000\t0.4334\t57238\tRomney\t57238\t0.0007851189999999999\t57238.0\n20169\t-96.68267900000001\t44.754160999999996\tClear Lake city\tSD\tSouth Dakota\tDeuel County\t1351\t44.4\t16.2\t2.0\t18655\t79265\t0.4334\t57226\tRomney\t57226\t0.006887633000000001\t57226.0\n20170\t-96.457762\t44.79484\tGary city\tSD\tSouth Dakota\tDeuel County\t225\t44.7\t12.3\t2.0\t18640\t98000\t0.4334\t57237\tRomney\t57237\t0.001147089\t57237.0\n20171\t-96.690185\t44.840853\tAltamont town\tSD\tSouth Dakota\tDeuel County\t33\t42.5\t8.3\t4.5\t18752\t90000\t0.4334\t57226\tRomney\t57226\t0.00016824\t57226.0\n20172\t-101.432849\t45.393864\tIsabel town\tSD\tSouth Dakota\tDewey County\t229\t40.0\t20.4\t17.2\t11052\t44000\t0.6369\t57633\tRomney\t57633\t0.001167482\t57633.0\n20173\t-101.07475\t45.4279\tTimber Lake city\tSD\tSouth Dakota\tDewey County\t429\t39.6\t21.4\t17.4\t14073\t50000\t0.6369\t57656\tRomney\t57656\t0.002187117\t57656.0\n20174\t-100.901122\t45.274444\tWhitehorse CDP\tSD\tSouth Dakota\tDewey County\t154\t26.3\t12.8\t10.8\t11972\t108333\t0.6369\t57661\tRomney\t57661\t0.0007851189999999999\t57661.0\n20175\t-101.216213\t45.018355\tNorth Eagle Butte CDP\tSD\tSouth Dakota\tDewey County\t2119\t25.4\t15.2\t27.7\t11168\t42813\t0.6369\t57625\tRomney\t57625\t0.01080303\t57625.0\n20176\t-101.226236\t44.997197\tEagle Butte city\tSD\tSouth Dakota\tDewey County\t665\t21.4\t16.8\t24.7\t9406\t40000\t0.6369\t57625\tRomney\t57625\t0.0033902859999999997\t57625.0\n20177\t-101.257204\t45.171416\tGreen Grass CDP\tSD\tSouth Dakota\tDewey County\t62\t23.8\t13.3\t33.3\t9537\t80000\t0.6369\t57636\tRomney\t57636\t0.000316087\t57636.0\n20178\t-100.666443\t45.134564000000005\tLa Plant CDP\tSD\tSouth Dakota\tDewey County\t152\t29.4\t7.4\t22.0\t9689\t57500\t0.6369\t57652\tRomney\t57652\t0.0007749219999999999\t57652.0\n20179\t-98.405539\t43.424062\tCorsica city\tSD\tSouth Dakota\tDouglas County\t607\t46.1\t14.8\t1.9\t15963\t71818\t0.1964\t57328\tRomney\t57328\t0.003094592\t57328.0\n20180\t-98.52679599999999\t43.43114\tHarrison CDP\tSD\tSouth Dakota\tDouglas County\t48\t39.2\t12.9\t0.0\t14904\t50000\t0.1964\t57364\tRomney\t57364\t0.000244712\t57364.0\n20181\t-98.344827\t43.31907\tArmour city\tSD\tSouth Dakota\tDouglas County\t712\t50.9\t17.7\t3.1\t19020\t57969\t0.1964\t57313\tRomney\t57313\t0.0036299\t57313.0\n20182\t-98.607373\t43.428605\tNew Holland CDP\tSD\tSouth Dakota\tDouglas County\t73\t38.1\t13.3\t0.0\t14996\t55000\t0.1964\t57364\tRomney\t57364\t0.00037216699999999996\t57364.0\n20183\t-98.15906899999999\t43.266601\tDelmont city\tSD\tSouth Dakota\tDouglas County\t247\t40.4\t10.4\t3.8\t13581\t51667\t0.1964\t57330\tRomney\t57330\t0.001259249\t57330.0\n20184\t-99.656841\t45.451256\tBowdle city\tSD\tSouth Dakota\tEdmunds County\t559\t47.3\t13.1\t3.7\t15615\t37833\t0.3213\t57428\tRomney\t57428\t0.002849879\t57428.0\n20185\t-99.029758\t45.443484999999995\tIpswich city\tSD\tSouth Dakota\tEdmunds County\t873\t45.1\t16.0\t3.8\t18494\t64474\t0.3213\t57451\tRomney\t57451\t0.004450706\t57451.0\n20186\t-99.47363399999999\t45.578747\tHosmer city\tSD\tSouth Dakota\tEdmunds County\t281\t47.3\t13.3\t3.3\t15617\t37500\t0.3213\t57448\tRomney\t57448\t0.0014325870000000001\t57448.0\n20187\t-99.33585500000001\t45.450778\tRoscoe city\tSD\tSouth Dakota\tEdmunds County\t282\t43.9\t11.0\t0.7\t17325\t47000\t0.3213\t57471\tRomney\t57471\t0.001437685\t57471.0\n20188\t-103.48105\t43.433454\tHot Springs city\tSD\tSouth Dakota\tFall River County\t4010\t48.1\t24.7\t7.0\t20134\t93239\t0.3242\t57747\tRomney\t57747\t0.020443677\t57747.0\n20189\t-103.8277\t43.298195\tEdgemont city\tSD\tSouth Dakota\tFall River County\t825\t51.5\t13.7\t3.1\t18485\t45139\t0.3242\t57735\tRomney\t57735\t0.004205993\t57735.0\n20190\t-103.233837\t43.182194\tOelrichs town\tSD\tSouth Dakota\tFall River County\t139\t53.2\t25.9\t2.3\t17805\t85000\t0.3242\t57763\tRomney\t57763\t0.0007086460000000001\t57763.0\n20191\t-99.509196\t45.060795\tSeneca town\tSD\tSouth Dakota\tFaulk County\t56\t42.5\t13.2\t4.3\t12459\t52500\t0.2937\t57473\tRomney\t57473\t0.00028549799999999997\t57473.0\n20192\t-98.947879\t45.169381\tCresbard town\tSD\tSouth Dakota\tFaulk County\t138\t41.3\t11.8\t1.8\t12472\t56250\t0.2937\t57435\tRomney\t57435\t0.000703548\t57435.0\n20193\t-99.12706700000001\t45.03398\tFaulkton city\tSD\tSouth Dakota\tFaulk County\t809\t50.5\t17.2\t1.7\t20680\t66129\t0.2937\t57438\tRomney\t57438\t0.0041244229999999995\t57438.0\n20194\t-99.088913\t44.901902\tOrient town\tSD\tSouth Dakota\tFaulk County\t58\t40.6\t7.7\t3.6\t18835\t40000\t0.2937\t57467\tRomney\t57467\t0.000295694\t57467.0\n20195\t-98.743368\t45.16758\tChelsea town\tSD\tSouth Dakota\tFaulk County\t32\t40.0\t9.5\t0.0\t12435\t50000\t0.2937\t57465\tRomney\t57465\t0.00016314200000000002\t57465.0\n20196\t-99.466032\t45.191266999999996\tOnaka town\tSD\tSouth Dakota\tFaulk County\t29\t40.0\t10.5\t0.0\t12453\t40000\t0.2937\t57466\tRomney\t57466\t0.000147847\t57466.0\n20197\t-98.823422\t44.904401\tRockham town\tSD\tSouth Dakota\tFaulk County\t54\t41.7\t8.3\t3.8\t18812\t60000\t0.2937\t57470\tRomney\t57470\t0.000275301\t57470.0\n20198\t-96.553535\t45.051241999999995\tAlbee town\tSD\tSouth Dakota\tGrant County\t9\t0.0\t0.0\t0.0\t16141\t112500\t0.414\t57259\tRomney\t57259\t4.59e-05\t57259.0\n20199\t-96.799716\t45.101856\tStockholm town\tSD\tSouth Dakota\tGrant County\t96\t45.0\t13.2\t1.6\t20654\t85000\t0.414\t57264\tRomney\t57264\t0.000489425\t57264.0\n20200\t-96.67520400000001\t45.049039\tLa Bolt town\tSD\tSouth Dakota\tGrant County\t81\t39.5\t16.7\t4.2\t20690\t48750\t0.414\t57246\tRomney\t57246\t0.00041295199999999996\t57246.0\n20201\t-96.760586\t45.043982\tStrandburg town\tSD\tSouth Dakota\tGrant County\t65\t45.0\t15.9\t2.6\t20694\t52500\t0.414\t57265\tRomney\t57265\t0.000331381\t57265.0\n20202\t-96.57112\t45.015305\tRevillo town\tSD\tSouth Dakota\tGrant County\t139\t41.9\t15.8\t3.7\t20608\t51000\t0.414\t57259\tRomney\t57259\t0.0007086460000000001\t57259.0\n20203\t-96.465585\t45.298741\tBig Stone City\tSD\tSouth Dakota\tGrant County\t558\t46.6\t11.1\t2.4\t19369\t75833\t0.414\t57216\tRomney\t57216\t0.002844781\t57216.0\n20204\t-96.915322\t45.260471\tMarvin town\tSD\tSouth Dakota\tGrant County\t60\t47.5\t11.1\t2.8\t20122\t95000\t0.414\t57251\tRomney\t57251\t0.00030589\t57251.0\n20205\t-96.634428\t45.220125\tMilbank city\tSD\tSouth Dakota\tGrant County\t3372\t44.3\t23.1\t2.5\t20101\t97375\t0.414\t57252\tRomney\t57252\t0.017191042\t57252.0\n20206\t-96.785655\t45.209098\tTwin Brooks town\tSD\tSouth Dakota\tGrant County\t50\t47.0\t13.9\t3.0\t20770\t92500\t0.414\t57269\tRomney\t57269\t0.000254909\t57269.0\n20207\t-98.946839\t43.077664\tBonesteel city\tSD\tSouth Dakota\tGregory County\t270\t45.0\t10.5\t1.6\t15118\t35000\t0.2785\t57317\tRomney\t57317\t0.0013765070000000001\t57317.0\n20208\t-99.094813\t43.088196\tSt. Charles CDP\tSD\tSouth Dakota\tGregory County\t17\t32.5\t9.1\t0.0\t15354\t17500\t0.2785\t57571\tRomney\t57571\t8.669999999999999e-05\t57571.0\n20209\t-99.188211\t43.115005\tHerrick town\tSD\tSouth Dakota\tGregory County\t94\t43.1\t7.9\t3.4\t13979\t37500\t0.2785\t57538\tRomney\t57538\t0.00047922800000000005\t57538.0\n20210\t-99.292335\t43.18286\tBurke city\tSD\tSouth Dakota\tGregory County\t619\t46.7\t20.0\t3.7\t16772\t64762\t0.2785\t57523\tRomney\t57523\t0.00315577\t57523.0\n20211\t-99.51751999999999\t43.23786\tDallas town\tSD\tSouth Dakota\tGregory County\t133\t49.5\t14.0\t3.6\t14362\t65000\t0.2785\t57529\tRomney\t57529\t0.0006780569999999999\t57529.0\n20212\t-99.425217\t43.23207\tGregory city\tSD\tSouth Dakota\tGregory County\t1212\t48.0\t18.4\t2.4\t16788\t60577\t0.2785\t57533\tRomney\t57533\t0.0061789869999999995\t57533.0\n20213\t-98.889021\t43.028081\tFairfax town\tSD\tSouth Dakota\tGregory County\t112\t45.3\t10.5\t1.9\t15089\t35833\t0.2785\t57317\tRomney\t57317\t0.000570995\t57317.0\n20214\t-101.15544200000001\t44.071057\tMidland town\tSD\tSouth Dakota\tHaakon County\t158\t41.3\t15.7\t2.2\t18087\t47000\t0.1264\t57552\tRomney\t57552\t0.0008055110000000001\t57552.0\n20215\t-101.66454499999999\t44.040820000000004\tPhilip city\tSD\tSouth Dakota\tHaakon County\t750\t48.6\t16.7\t5.7\t22797\t64259\t0.1264\t57567\tRomney\t57567\t0.00382363\t57567.0\n20216\t-97.208077\t44.579671000000005\tLake Norden city\tSD\tSouth Dakota\tHamlin County\t460\t36.2\t17.3\t2.7\t16508\t57885\t0.3298\t57248\tRomney\t57248\t0.00234516\t57248.0\n20217\t-96.901101\t44.576792\tEstelline city\tSD\tSouth Dakota\tHamlin County\t739\t48.4\t17.1\t6.9\t20884\t96389\t0.3298\t57234\tRomney\t57234\t0.00376755\t57234.0\n20218\t-97.030962\t44.724194\tCastlewood city\tSD\tSouth Dakota\tHamlin County\t701\t37.7\t14.6\t4.5\t19167\t109797\t0.3298\t57223\tRomney\t57223\t0.00357382\t57223.0\n20219\t-97.38102099999999\t44.758183\tHazel town\tSD\tSouth Dakota\tHamlin County\t108\t39.0\t11.8\t4.5\t18134\t66667\t0.3298\t57242\tRomney\t57242\t0.000550603\t57242.0\n20220\t-97.204149\t44.656822999999996\tHayti town\tSD\tSouth Dakota\tHamlin County\t385\t33.7\t16.2\t2.1\t17662\t100000\t0.3298\t57241\tRomney\t57241\t0.001962797\t57241.0\n20221\t-97.467221\t44.589896\tBryant city\tSD\tSouth Dakota\tHamlin County\t405\t37.1\t12.4\t4.2\t18234\t63636\t0.3298\t57221\tRomney\t57221\t0.00206476\t57221.0\n20222\t-98.940156\t44.517663\tSt. Lawrence town\tSD\tSouth Dakota\tHand County\t186\t48.9\t18.2\t2.9\t20393\t65833\t0.3111\t57373\tRomney\t57373\t0.00094826\t57373.0\n20223\t-99.20053100000001\t44.515778000000005\tRee Heights town\tSD\tSouth Dakota\tHand County\t77\t43.0\t22.0\t0.0\t20445\t72500\t0.3111\t57371\tRomney\t57371\t0.000392559\t57371.0\n20224\t-98.98733399999999\t44.520339\tMiller city\tSD\tSouth Dakota\tHand County\t1358\t49.2\t17.9\t2.7\t20357\t66809\t0.3111\t57362\tRomney\t57362\t0.00692332\t57362.0\n20225\t-97.622063\t43.602851\tEmery city\tSD\tSouth Dakota\tHanson County\t457\t41.2\t18.0\t4.7\t16990\t76923\t0.3146\t57332\tRomney\t57332\t0.002329865\t57332.0\n20226\t-97.688307\t43.724891\tFarmer town\tSD\tSouth Dakota\tHanson County\t19\t41.3\t15.4\t0.0\t16771\t112500\t0.3146\t57374\tRomney\t57374\t9.690000000000001e-05\t57374.0\n20227\t-97.82263\t43.728819\tFulton town\tSD\tSouth Dakota\tHanson County\t96\t39.2\t23.3\t4.1\t19140\t112500\t0.3146\t57340\tRomney\t57340\t0.000489425\t57340.0\n20228\t-97.78079100000001\t43.653873\tAlexandria city\tSD\tSouth Dakota\tHanson County\t705\t36.1\t13.2\t3.0\t15584\t95000\t0.3146\t57311\tRomney\t57311\t0.0035942129999999997\t57311.0\n20229\t-103.543444\t45.586366999999996\tBuffalo town\tSD\tSouth Dakota\tHarding County\t333\t41.6\t17.1\t1.4\t16272\t66818\t0.111\t57720\tRomney\t57720\t0.0016976920000000002\t57720.0\n20230\t-103.974896\t45.550057\tCamp Crook town\tSD\tSouth Dakota\tHarding County\t49\t41.9\t18.8\t2.9\t15315\t67500\t0.111\t57724\tRomney\t57724\t0.000249811\t57724.0\n20231\t-99.98865\t44.515978000000004\tBlunt city\tSD\tSouth Dakota\tHughes County\t440\t40.6\t18.8\t1.1\t22296\t114732\t0.3416\t57522\tRomney\t57522\t0.0022431960000000003\t57522.0\n20232\t-99.73928000000001\t44.523523\tHarrold town\tSD\tSouth Dakota\tHughes County\t247\t44.0\t22.4\t1.5\t27636\t81667\t0.3416\t57536\tRomney\t57536\t0.001259249\t57536.0\n20233\t-100.320802\t44.374686\tPierre city\tSD\tSouth Dakota\tHughes County\t13917\t40.0\t39.8\t3.8\t26300\t131963\t0.3416\t575HH\tRomney\t575HH\t0.070951285\t0.0\n20234\t-97.577838\t43.238383\tMenno city\tSD\tSouth Dakota\tHutchinson County\t662\t57.6\t17.2\t1.0\t18083\t45962\t0.2695\t57045\tRomney\t57045\t0.003374991\t57045.0\n20235\t-97.988986\t43.478497\tDimock town\tSD\tSouth Dakota\tHutchinson County\t148\t37.3\t10.6\t1.2\t20501\t84167\t0.2695\t57331\tRomney\t57331\t0.00075453\t57331.0\n20236\t-97.80869\t43.425251\tMilltown CDP\tSD\tSouth Dakota\tHutchinson County\t8\t0.0\t20.0\t0.0\t20134\t107500\t0.2695\t57366\tRomney\t57366\t4.0799999999999996e-05\t57366.0\n20237\t-97.98676\t43.393487\tParkston city\tSD\tSouth Dakota\tHutchinson County\t1569\t45.1\t17.5\t2.3\t19870\t82632\t0.2695\t57366\tRomney\t57366\t0.007999035\t57366.0\n20238\t-97.429714\t43.35024\tFreeman city\tSD\tSouth Dakota\tHutchinson County\t1209\t48.7\t22.2\t1.0\t17698\t83800\t0.2695\t57029\tRomney\t57029\t0.006163691999999999\t57029.0\n20239\t-97.67459699999999\t43.241162\tOlivet town\tSD\tSouth Dakota\tHutchinson County\t67\t37.5\t22.7\t3.0\t15722\t62500\t0.2695\t57052\tRomney\t57052\t0.00034157800000000004\t57052.0\n20240\t-97.84385400000001\t43.193061\tKaylor CDP\tSD\tSouth Dakota\tHutchinson County\t62\t39.4\t22.5\t3.3\t15551\t65000\t0.2695\t57376\tRomney\t57376\t0.000316087\t57376.0\n20241\t-97.966157\t43.225233\tTripp city\tSD\tSouth Dakota\tHutchinson County\t662\t56.8\t13.1\t2.1\t18006\t32500\t0.2695\t57376\tRomney\t57376\t0.003374991\t57376.0\n20242\t-99.439464\t44.521127\tHighmore city\tSD\tSouth Dakota\tHyde County\t866\t45.7\t18.3\t2.6\t19385\t57857\t0.2578\t57345\tRomney\t57345\t0.004415019\t57345.0\n20243\t-101.98369\t43.726824\tInterior town\tSD\tSouth Dakota\tJackson County\t74\t44.2\t23.5\t3.5\t18946\t37500\t0.3852\t57750\tRomney\t57750\t0.000377265\t57750.0\n20244\t-101.66356800000001\t43.570528\tWanblee CDP\tSD\tSouth Dakota\tJackson County\t622\t19.7\t7.1\t39.2\t6342\t30000\t0.3852\t57577\tRomney\t57577\t0.0031710640000000003\t57577.0\n20245\t-101.508101\t43.832519\tKadoka city\tSD\tSouth Dakota\tJackson County\t658\t43.7\t20.6\t3.9\t15018\t52708\t0.3852\t57543\tRomney\t57543\t0.003354598\t57543.0\n20246\t-101.271086\t43.830771999999996\tBelvidere town\tSD\tSouth Dakota\tJackson County\t54\t45.6\t23.7\t4.8\t19207\t37500\t0.3852\t57521\tRomney\t57521\t0.000275301\t57521.0\n20247\t-101.902064\t43.965705\tCottonwood town\tSD\tSouth Dakota\tJackson County\t6\t0.0\t25.0\t0.0\t18187\t0\t0.3852\t57775\tRomney\t57775\t3.06e-05\t57775.0\n20248\t-98.368306\t44.182961\tAlpena town\tSD\tSouth Dakota\tJerauld County\t250\t45.3\t9.6\t2.8\t17948\t65000\t0.4493\t57312\tRomney\t57312\t0.001274543\t57312.0\n20249\t-98.424763\t44.069744\tLane town\tSD\tSouth Dakota\tJerauld County\t56\t44.4\t9.8\t2.5\t17834\t60000\t0.4493\t57358\tRomney\t57358\t0.00028549799999999997\t57358.0\n20250\t-98.571527\t44.080525\tWessington Springs city\tSD\tSouth Dakota\tJerauld County\t917\t54.7\t15.0\t1.5\t24043\t65690\t0.4493\t57382\tRomney\t57382\t0.004675025\t57382.0\n20251\t-100.90486800000001\t43.862014\tOkaton CDP\tSD\tSouth Dakota\tJones County\t26\t40.0\t21.1\t0.0\t19798\t70000\t0.1773\t57562\tRomney\t57562\t0.000132553\t57562.0\n20252\t-100.714003\t43.889354\tMurdo city\tSD\tSouth Dakota\tJones County\t553\t45.5\t18.2\t1.8\t19651\t59000\t0.1773\t57559\tRomney\t57559\t0.00281929\t57559.0\n20253\t-100.53739\t43.926266999999996\tDraper town\tSD\tSouth Dakota\tJones County\t83\t46.5\t17.7\t1.7\t19677\t57500\t0.1773\t57531\tRomney\t57531\t0.00042314800000000004\t57531.0\n20254\t-97.37639899999999\t44.361979999999996\tLake Preston city\tSD\tSouth Dakota\tKingsbury County\t696\t47.4\t15.3\t4.3\t19305\t57391\t0.4187\t57249\tRomney\t57249\t0.0035483290000000002\t57249.0\n20255\t-97.309379\t44.227967\tOldham city\tSD\tSouth Dakota\tKingsbury County\t177\t46.0\t15.6\t5.0\t18053\t60000\t0.4187\t57051\tRomney\t57051\t0.000902377\t57051.0\n20256\t-97.848215\t44.3672\tIroquois city\tSD\tSouth Dakota\tKingsbury County\t247\t43.0\t13.3\t4.6\t16742\t60000\t0.4187\t57353\tRomney\t57353\t0.001259249\t57353.0\n20257\t-97.234668\t44.377233000000004\tHetland town\tSD\tSouth Dakota\tKingsbury County\t41\t48.8\t16.7\t4.2\t18440\t70000\t0.4187\t57244\tRomney\t57244\t0.000209025\t57244.0\n20258\t-97.20787800000001\t44.485508\tBadger town\tSD\tSouth Dakota\tKingsbury County\t138\t47.0\t16.0\t4.9\t18354\t78333\t0.4187\t57214\tRomney\t57214\t0.000703548\t57214.0\n20259\t-97.54874000000001\t44.386672\tDe Smet city\tSD\tSouth Dakota\tKingsbury County\t1096\t48.9\t17.8\t2.0\t20833\t75161\t0.4187\t57231\tRomney\t57231\t0.005587599\t57231.0\n20260\t-97.750528\t44.489391999999995\tBancroft town\tSD\tSouth Dakota\tKingsbury County\t33\t42.5\t13.6\t5.9\t16443\t50000\t0.4187\t57353\tRomney\t57353\t0.00016824\t57353.0\n20261\t-97.124312\t44.36318\tArlington city\tSD\tSouth Dakota\tKingsbury County\t1091\t44.4\t17.8\t3.8\t21706\t84857\t0.4187\t57212\tRomney\t57212\t0.0055621080000000005\t57212.0\n20262\t-97.440762\t44.488058\tErwin town\tSD\tSouth Dakota\tKingsbury County\t56\t46.9\t15.4\t6.1\t18228\t75000\t0.4187\t57233\tRomney\t57233\t0.00028549799999999997\t57233.0\n20263\t-96.964668\t43.996990000000004\tWentworth village\tSD\tSouth Dakota\tLake County\t145\t45.3\t31.7\t3.8\t26820\t137500\t0.4334\t57075\tRomney\t57075\t0.000739235\t57075.0\n20264\t-97.108078\t44.007360999999996\tMadison city\tSD\tSouth Dakota\tLake County\t6594\t35.7\t27.6\t5.8\t20712\t113781\t0.4334\t57042\tRomney\t57042\t0.033617358\t57042.0\n20265\t-97.215281\t44.119987\tRamona town\tSD\tSouth Dakota\tLake County\t205\t45.3\t20.9\t3.7\t18193\t95000\t0.4334\t57054\tRomney\t57054\t0.001045126\t57054.0\n20266\t-97.019239\t44.15985\tNunda town\tSD\tSouth Dakota\tLake County\t51\t45.0\t22.2\t3.8\t18094\t100000\t0.4334\t57050\tRomney\t57050\t0.00026000700000000003\t57050.0\n20267\t-103.723849\t44.381248\tDeadwood city\tSD\tSouth Dakota\tLawrence County\t1383\t45.6\t21.6\t3.6\t21900\t123106\t0.3498\t57732\tRomney\t57732\t0.007050774\t57732.0\n20268\t-103.770379\t44.368641\tCentral City\tSD\tSouth Dakota\tLawrence County\t157\t46.0\t24.2\t2.1\t25065\t119444\t0.3498\t57732\tRomney\t57732\t0.000800413\t57732.0\n20269\t-103.893103\t44.511897\tNorth Spearfish CDP\tSD\tSouth Dakota\tLawrence County\t2334\t32.3\t34.9\t4.3\t20389\t148537\t0.3498\t57783\tRomney\t57783\t0.011899138\t57783.0\n20270\t-103.83483100000001\t44.481789\tSpearfish city\tSD\tSouth Dakota\tLawrence County\t9398\t34.8\t33.3\t5.9\t22623\t140710\t0.3498\t57799\tRomney\t57799\t0.047912638\t57799.0\n20271\t-103.76628199999999\t44.35289\tLead city\tSD\tSouth Dakota\tLawrence County\t3225\t38.5\t19.6\t3.7\t21487\t76139\t0.3498\t57732\tRomney\t57732\t0.016441611000000002\t57732.0\n20272\t-103.637522\t44.462324\tWhitewood city\tSD\tSouth Dakota\tLawrence County\t905\t44.7\t22.8\t5.0\t20943\t134756\t0.3498\t57793\tRomney\t57793\t0.004613847\t57793.0\n20273\t-96.58218000000001\t43.303151\tCanton city\tSD\tSouth Dakota\tLincoln County\t3060\t37.0\t18.6\t4.3\t24868\t107603\t0.3636\t57013\tRomney\t57013\t0.015600412\t57013.0\n20274\t-96.769368\t43.329733000000004\tWorthing town\tSD\tSouth Dakota\tLincoln County\t913\t32.8\t14.3\t2.4\t21802\t114759\t0.3636\t57077\tRomney\t57077\t0.004654633\t57077.0\n20275\t-96.89553000000001\t43.35264\tLennox city\tSD\tSouth Dakota\tLincoln County\t2952\t40.7\t12.8\t2.8\t22134\t94091\t0.3636\t57039\tRomney\t57039\t0.015049808999999999\t57039.0\n20276\t-96.45541999999999\t43.130291\tHudson town\tSD\tSouth Dakota\tLincoln County\t392\t40.0\t12.0\t5.2\t16217\t67727\t0.3636\t57034\tRomney\t57034\t0.001998484\t57034.0\n20277\t-96.488462\t43.222039\tFairview town\tSD\tSouth Dakota\tLincoln County\t92\t40.4\t13.1\t5.6\t16162\t67500\t0.3636\t57027\tRomney\t57027\t0.000469032\t57027.0\n20278\t-96.69870999999999\t43.430821\tHarrisburg city\tSD\tSouth Dakota\tLincoln County\t921\t33.1\t23.3\t3.1\t22962\t152035\t0.3636\t57032\tRomney\t57032\t0.004695418\t57032.0\n20279\t-96.83528100000001\t43.448396\tTea city\tSD\tSouth Dakota\tLincoln County\t2223\t30.9\t20.1\t2.9\t24995\t171094\t0.3636\t57064\tRomney\t57064\t0.01133324\t57064.0\n20280\t-99.583964\t44.074007\tLower Brule CDP\tSD\tSouth Dakota\tLyman County\t604\t20.2\t8.4\t28.6\t8801\t79000\t0.3856\t57548\tRomney\t57548\t0.003079297\t57548.0\n20281\t-99.86202\t43.903442\tKennebec town\tSD\tSouth Dakota\tLyman County\t277\t44.4\t15.6\t3.3\t19419\t87778\t0.3856\t57544\tRomney\t57544\t0.0014121939999999999\t57544.0\n20282\t-99.369973\t43.805685\tOacoma town\tSD\tSouth Dakota\tLyman County\t394\t42.2\t20.2\t6.3\t24084\t69375\t0.3856\t57365\tRomney\t57365\t0.00200868\t57365.0\n20283\t-100.058462\t43.90743\tPresho city\tSD\tSouth Dakota\tLyman County\t567\t46.8\t18.3\t6.0\t16880\t57500\t0.3856\t57568\tRomney\t57568\t0.002890665\t57568.0\n20284\t-100.30109499999999\t43.927291\tVivian CDP\tSD\tSouth Dakota\tLyman County\t126\t46.8\t18.5\t6.2\t16925\t58333\t0.3856\t57576\tRomney\t57576\t0.00064237\t57576.0\n20285\t-99.60174\t43.879991\tReliance town\tSD\tSouth Dakota\tLyman County\t208\t41.8\t20.3\t6.3\t24097\t70000\t0.3856\t57569\tRomney\t57569\t0.00106042\t57569.0\n20286\t-97.388909\t43.724558\tSalem city\tSD\tSouth Dakota\tMcCook County\t1368\t44.2\t17.2\t3.3\t21339\t84206\t0.3463\t57058\tRomney\t57058\t0.006974302\t57058.0\n20287\t-97.591071\t43.727507\tSpencer city\tSD\tSouth Dakota\tMcCook County\t156\t37.5\t13.5\t4.2\t16914\t110000\t0.3463\t57374\tRomney\t57374\t0.000795315\t57374.0\n20288\t-97.292583\t43.597756\tCanistota city\tSD\tSouth Dakota\tMcCook County\t661\t41.3\t18.6\t3.8\t17680\t78281\t0.3463\t57012\tRomney\t57012\t0.0033698929999999997\t57012.0\n20289\t-97.498471\t43.550185\tBridgewater city\tSD\tSouth Dakota\tMcCook County\t561\t43.8\t14.4\t4.4\t15958\t64000\t0.3463\t57319\tRomney\t57319\t0.0028600759999999996\t57319.0\n20290\t-97.183943\t43.700798\tMontrose city\tSD\tSouth Dakota\tMcCook County\t472\t37.8\t17.7\t4.3\t18416\t101500\t0.3463\t57048\tRomney\t57048\t0.002406338\t57048.0\n20291\t-99.622805\t45.7697\tEureka city\tSD\tSouth Dakota\tMcPherson County\t967\t62.9\t13.5\t2.2\t16900\t32750\t0.2239\t57437\tRomney\t57437\t0.004929934\t57437.0\n20292\t-99.205765\t45.856698\tLong Lake town\tSD\tSouth Dakota\tMcPherson County\t54\t41.3\t11.1\t0.0\t12192\t85000\t0.2239\t57457\tRomney\t57457\t0.000275301\t57457.0\n20293\t-98.938927\t45.721077\tLeola city\tSD\tSouth Dakota\tMcPherson County\t409\t46.2\t18.8\t5.1\t16893\t37857\t0.2239\t57456\tRomney\t57456\t0.0020851529999999997\t57456.0\n20294\t-99.56066\t45.664186\tHillsview town\tSD\tSouth Dakota\tMcPherson County\t3\t0.0\t0.0\t0.0\t11475\t0\t0.2239\t57448\tRomney\t57448\t1.53e-05\t57448.0\n20295\t-98.771857\t45.624219000000004\tWetonka town\tSD\tSouth Dakota\tMcPherson County\t11\t62.5\t16.7\t0.0\t16357\t0\t0.2239\t57481\tRomney\t57481\t5.610000000000001e-05\t57481.0\n20296\t-97.286647\t45.861964\tVeblen city\tSD\tSouth Dakota\tMarshall County\t267\t50.8\t14.2\t4.9\t15930\t38750\t0.534\t57270\tRomney\t57270\t0.001361212\t57270.0\n20297\t-97.75239599999999\t45.791713\tBritton city\tSD\tSouth Dakota\tMarshall County\t1298\t47.9\t16.4\t3.2\t20095\t72273\t0.534\t57430\tRomney\t57430\t0.00661743\t57430.0\n20298\t-97.41968299999999\t45.61698\tEden town\tSD\tSouth Dakota\tMarshall County\t93\t44.6\t16.9\t4.2\t17086\t60000\t0.534\t57232\tRomney\t57232\t0.00047413\t57232.0\n20299\t-97.41371099999999\t45.72493\tLake City town\tSD\tSouth Dakota\tMarshall County\t45\t40.0\t20.7\t5.9\t13708\t95000\t0.534\t57247\tRomney\t57247\t0.000229418\t57247.0\n20300\t-97.829909\t45.602534000000006\tLangford town\tSD\tSouth Dakota\tMarshall County\t278\t44.4\t16.5\t4.9\t17093\t59167\t0.534\t57454\tRomney\t57454\t0.0014172920000000001\t57454.0\n20301\t-103.316366\t44.153591\tBlackhawk CDP\tSD\tSouth Dakota\tMeade County\t2367\t37.3\t18.6\t5.0\t21633\t120763\t0.2707\t57718\tRomney\t57718\t0.012067376999999999\t57718.0\n20302\t-102.03622\t45.025862\tFaith city\tSD\tSouth Dakota\tMeade County\t461\t45.0\t21.2\t4.8\t19985\t64286\t0.2707\t57626\tRomney\t57626\t0.002350258\t57626.0\n20303\t-103.518825\t44.409763\tSturgis city\tSD\tSouth Dakota\tMeade County\t5987\t42.7\t16.6\t6.5\t19417\t94375\t0.2707\t57785\tRomney\t57785\t0.030522767000000003\t57785.0\n20304\t-100.48014599999999\t43.497027\tWood town\tSD\tSouth Dakota\tMellette County\t63\t42.5\t17.5\t12.5\t15981\t55000\t0.4876\t57585\tRomney\t57585\t0.000321185\t57585.0\n20305\t-100.744773\t43.566895\tWhite River city\tSD\tSouth Dakota\tMellette County\t592\t32.2\t18.4\t12.6\t12007\t45417\t0.4876\t57579\tRomney\t57579\t0.003018119\t57579.0\n20306\t-97.69719599999999\t44.001256\tRoswell town\tSD\tSouth Dakota\tMiner County\t20\t32.5\t7.1\t0.0\t15994\t35000\t0.4202\t57337\tRomney\t57337\t0.000101963\t57337.0\n20307\t-97.503945\t43.881232000000004\tCanova town\tSD\tSouth Dakota\tMiner County\t131\t44.2\t8.9\t4.5\t16272\t37857\t0.4202\t57321\tRomney\t57321\t0.0006678610000000001\t57321.0\n20308\t-97.52454200000001\t44.01192\tHoward city\tSD\tSouth Dakota\tMiner County\t935\t46.5\t20.8\t2.4\t19778\t49722\t0.4202\t57349\tRomney\t57349\t0.004766793\t57349.0\n20309\t-97.714956\t44.168597999999996\tCarthage city\tSD\tSouth Dakota\tMiner County\t173\t49.2\t11.5\t3.6\t18045\t46111\t0.4202\t57323\tRomney\t57323\t0.0008819839999999999\t57323.0\n20310\t-97.595949\t44.00832\tVilas town\tSD\tSouth Dakota\tMiner County\t18\t30.0\t7.7\t0.0\t16058\t32500\t0.4202\t57349\tRomney\t57349\t9.18e-05\t57349.0\n20311\t-96.47625\t43.757805\tSherman town\tSD\tSouth Dakota\tMinnehaha County\t105\t41.9\t18.3\t3.5\t20504\t109375\t0.4528\t57030\tRomney\t57030\t0.0005353080000000001\t57030.0\n20312\t-96.57839\t43.591586\tBrandon city\tSD\tSouth Dakota\tMinnehaha County\t8886\t31.8\t34.4\t3.7\t32017\t164469\t0.4528\t57005\tRomney\t57005\t0.045302373\t57005.0\n20313\t-96.92808199999999\t43.787071999999995\tColton city\tSD\tSouth Dakota\tMinnehaha County\t781\t42.2\t17.2\t3.9\t23815\t94000\t0.4528\t57018\tRomney\t57018\t0.003981674\t57018.0\n20314\t-96.736102\t43.760929\tBaltic city\tSD\tSouth Dakota\tMinnehaha County\t1065\t37.5\t20.9\t4.0\t22830\t129891\t0.4528\t57003\tRomney\t57003\t0.005429555\t57003.0\n20315\t-96.807259\t43.659703\tCrooks city\tSD\tSouth Dakota\tMinnehaha County\t1253\t31.8\t21.1\t3.9\t22824\t141267\t0.4528\t57020\tRomney\t57020\t0.006388011999999999\t57020.0\n20316\t-96.502898\t43.714719\tGarretson city\tSD\tSouth Dakota\tMinnehaha County\t1403\t42.4\t18.4\t4.3\t20574\t110250\t0.4528\t57030\tRomney\t57030\t0.0071527380000000005\t57030.0\n20317\t-96.46600699999999\t43.583285\tValley Springs city\tSD\tSouth Dakota\tMinnehaha County\t889\t37.3\t18.2\t5.9\t22905\t115323\t0.4528\t57068\tRomney\t57068\t0.004532277\t57068.0\n20318\t-96.733293\t43.548626\tSioux Falls city\tSD\tSouth Dakota\tMinnehaha County\t154804\t34.6\t31.6\t5.1\t27806\t145055\t0.4528\t57104\tRomney\t57104\t0.7892177020000001\t57104.0\n20319\t-96.944272\t43.623088\tHartford city\tSD\tSouth Dakota\tMinnehaha County\t2118\t33.8\t20.9\t5.3\t24741\t121947\t0.4528\t57033\tRomney\t57033\t0.010797932\t57033.0\n20320\t-96.71481999999999\t43.825845\tDell Rapids city\tSD\tSouth Dakota\tMinnehaha County\t3492\t37.6\t25.2\t4.4\t24280\t126507\t0.4528\t57022\tRomney\t57022\t0.017802823\t57022.0\n20321\t-97.074629\t43.644740000000006\tHumboldt town\tSD\tSouth Dakota\tMinnehaha County\t623\t37.7\t12.7\t3.6\t20624\t104412\t0.4528\t57035\tRomney\t57035\t0.003176162\t57035.0\n20322\t-96.597581\t44.046733\tFlandreau city\tSD\tSouth Dakota\tMoody County\t2271\t38.2\t19.2\t10.6\t19687\t84367\t0.4712\t57028\tRomney\t57028\t0.011577953\t57028.0\n20323\t-96.658351\t43.906341\tTrent town\tSD\tSouth Dakota\tMoody County\t260\t40.9\t28.4\t2.0\t21321\t109211\t0.4712\t57065\tRomney\t57065\t0.001325525\t57065.0\n20324\t-96.81652\t43.984755\tColman city\tSD\tSouth Dakota\tMoody County\t594\t37.2\t18.4\t7.0\t21458\t119531\t0.4712\t57017\tRomney\t57017\t0.003028315\t57017.0\n20325\t-96.648712\t44.0005\tEgan city\tSD\tSouth Dakota\tMoody County\t253\t36.9\t12.8\t11.5\t17027\t73333\t0.4712\t57024\tRomney\t57024\t0.001289838\t57024.0\n20326\t-96.462457\t44.154789\tWard town\tSD\tSouth Dakota\tMoody County\t42\t45.0\t24.1\t3.8\t21452\t112500\t0.4712\t57074\tRomney\t57074\t0.00021412299999999998\t57074.0\n20327\t-103.07339499999999\t44.148895\tEllsworth AFB CDP\tSD\tSouth Dakota\tPennington County\t3849\t22.1\t18.2\t6.5\t15033\t72500\t0.3402\t57706\tRomney\t57706\t0.019622871\t57706.0\n20328\t-103.313452\t44.014503000000005\tColonial Pine Hills CDP\tSD\tSouth Dakota\tPennington County\t3416\t43.0\t51.8\t2.7\t34921\t220064\t0.3402\t57702\tRomney\t57702\t0.017415362\t57702.0\n20329\t-102.446005\t44.069559000000005\tWasta town\tSD\tSouth Dakota\tPennington County\t83\t44.4\t22.8\t4.5\t21796\t65000\t0.3402\t57791\tRomney\t57791\t0.00042314800000000004\t57791.0\n20330\t-102.128962\t43.987167\tQuinn town\tSD\tSouth Dakota\tPennington County\t49\t42.5\t23.5\t7.1\t17669\t80000\t0.3402\t57775\tRomney\t57775\t0.000249811\t57775.0\n20331\t-103.121638\t44.074174\tRapid Valley CDP\tSD\tSouth Dakota\tPennington County\t9316\t32.9\t16.2\t3.9\t22529\t112487\t0.3402\t57703\tRomney\t57703\t0.047494587000000005\t57703.0\n20332\t-103.22171999999999\t44.069585\tRapid City\tSD\tSouth Dakota\tPennington County\t64590\t36.0\t31.3\t5.9\t25020\t130775\t0.3402\t57701\tRomney\t57701\t0.32929104800000003\t57701.0\n20333\t-103.426909\t43.895456\tKeystone town\tSD\tSouth Dakota\tPennington County\t380\t45.3\t25.0\t4.3\t23712\t147500\t0.3402\t57751\tRomney\t57751\t0.001937306\t57751.0\n20334\t-102.83434799999999\t44.094014\tNew Underwood city\tSD\tSouth Dakota\tPennington County\t747\t38.8\t16.9\t5.2\t17036\t65800\t0.3402\t57761\tRomney\t57761\t0.003808336\t57761.0\n20335\t-103.128491\t44.129344\tAshland Heights CDP\tSD\tSouth Dakota\tPennington County\t890\t32.0\t11.6\t12.7\t21482\t31563\t0.3402\t57706\tRomney\t57706\t0.004537375\t57706.0\n20336\t-102.24275899999999\t43.992225\tWall town\tSD\tSouth Dakota\tPennington County\t944\t43.2\t25.9\t2.6\t21686\t51944\t0.3402\t57790\tRomney\t57790\t0.004812676\t57790.0\n20337\t-103.058904\t44.141937\tBox Elder city\tSD\tSouth Dakota\tPennington County\t3741\t28.9\t8.9\t8.6\t19560\t57653\t0.3402\t57719\tRomney\t57719\t0.019072268\t57719.0\n20338\t-103.575389\t43.931743\tHill City\tSD\tSouth Dakota\tPennington County\t920\t42.8\t28.3\t5.2\t22600\t140833\t0.3402\t57745\tRomney\t57745\t0.00469032\t57745.0\n20339\t-103.107871\t44.04534\tGreen Valley CDP\tSD\tSouth Dakota\tPennington County\t1059\t41.3\t14.0\t4.3\t21015\t93542\t0.3402\t57703\tRomney\t57703\t0.005398966\t57703.0\n20340\t-102.46776899999999\t45.523409\tBison town\tSD\tSouth Dakota\tPerkins County\t303\t44.4\t16.8\t1.8\t18541\t58750\t0.2006\t57620\tRomney\t57620\t0.0015447470000000002\t57620.0\n20341\t-102.15860699999999\t45.938515\tLemmon city\tSD\tSouth Dakota\tPerkins County\t1273\t45.3\t18.6\t5.1\t19844\t43415\t0.2006\t57638\tRomney\t57638\t0.006489975\t57638.0\n20342\t-99.777596\t45.241749\tHoven town\tSD\tSouth Dakota\tPotter County\t431\t49.9\t15.7\t1.5\t21585\t67500\t0.2455\t57450\tRomney\t57450\t0.002197313\t57450.0\n20343\t-99.766719\t45.068740000000005\tLebanon town\tSD\tSouth Dakota\tPotter County\t73\t50.0\t15.8\t2.2\t21462\t70000\t0.2455\t57455\tRomney\t57455\t0.00037216699999999996\t57455.0\n20344\t-99.95396099999999\t45.006073\tGettysburg city\tSD\tSouth Dakota\tPotter County\t1242\t48.7\t23.5\t2.1\t19764\t62308\t0.2455\t57442\tRomney\t57442\t0.006331931999999999\t57442.0\n20345\t-99.614216\t45.208014\tTolstoy town\tSD\tSouth Dakota\tPotter County\t54\t49.4\t14.3\t2.9\t21558\t60000\t0.2455\t57475\tRomney\t57475\t0.000275301\t57475.0\n20346\t-96.731112\t45.866521999999996\tRosholt town\tSD\tSouth Dakota\tRoberts County\t408\t46.7\t15.5\t3.7\t17691\t75625\t0.5409\t57260\tRomney\t57260\t0.002080055\t57260.0\n20347\t-97.045467\t45.662652\tSisseton city\tSD\tSouth Dakota\tRoberts County\t2580\t39.3\t23.4\t5.4\t16970\t75635\t0.5409\t57262\tRomney\t57262\t0.013153288\t57262.0\n20348\t-97.103548\t45.856612\tClaire City town\tSD\tSouth Dakota\tRoberts County\t80\t45.0\t5.3\t2.2\t19969\t51250\t0.5409\t57224\tRomney\t57224\t0.00040785400000000003\t57224.0\n20349\t-96.917397\t45.855894\tNew Effington town\tSD\tSouth Dakota\tRoberts County\t226\t46.6\t8.8\t3.8\t16587\t51667\t0.5409\t57255\tRomney\t57255\t0.001152187\t57255.0\n20350\t-96.764736\t45.335245\tCorona town\tSD\tSouth Dakota\tRoberts County\t111\t45.4\t18.7\t3.6\t18162\t97500\t0.5409\t57279\tRomney\t57279\t0.000565897\t57279.0\n20351\t-96.956375\t45.542195\tPeever town\tSD\tSouth Dakota\tRoberts County\t200\t27.5\t13.2\t9.3\t11044\t73333\t0.5409\t57257\tRomney\t57257\t0.001019635\t57257.0\n20352\t-97.036737\t45.303796000000006\tSummit town\tSD\tSouth Dakota\tRoberts County\t270\t38.4\t8.4\t6.3\t11522\t57857\t0.5409\t57266\tRomney\t57266\t0.0013765070000000001\t57266.0\n20353\t-96.576102\t45.924755\tWhite Rock town\tSD\tSouth Dakota\tRoberts County\t19\t32.5\t16.7\t0.0\t14033\t0\t0.5409\t57260\tRomney\t57260\t9.690000000000001e-05\t57260.0\n20354\t-96.856922\t45.409282\tWilmot city\tSD\tSouth Dakota\tRoberts County\t545\t45.5\t17.3\t5.5\t18094\t65789\t0.5409\t57279\tRomney\t57279\t0.002778505\t57279.0\n20355\t-97.20501800000001\t45.334939\tOrtley town\tSD\tSouth Dakota\tRoberts County\t51\t48.3\t7.5\t7.7\t12088\t37500\t0.5409\t57273\tRomney\t57273\t0.00026000700000000003\t57273.0\n20356\t-98.272573\t44.054039\tWoonsocket city\tSD\tSouth Dakota\tSanborn County\t665\t46.6\t12.0\t2.9\t21847\t48793\t0.3489\t57385\tRomney\t57385\t0.0033902859999999997\t57385.0\n20357\t-98.144297\t43.899568\tLetcher town\tSD\tSouth Dakota\tSanborn County\t167\t45.0\t15.0\t2.1\t19112\t75000\t0.3489\t57359\tRomney\t57359\t0.000851395\t57359.0\n20358\t-97.923649\t44.007948999999996\tArtesian town\tSD\tSouth Dakota\tSanborn County\t145\t40.0\t17.5\t2.6\t18254\t71667\t0.3489\t57314\tRomney\t57314\t0.000739235\t57314.0\n20359\t-102.368296\t43.143571\tWounded Knee CDP\tSD\tSouth Dakota\tShannon County\t364\t23.4\t20.9\t43.9\t5742\t37500\t0.9339\t57794\tRomney\t57794\t0.001855735\t57794.0\n20360\t-102.726958\t43.184791\tOglala CDP\tSD\tSouth Dakota\tShannon County\t1422\t22.5\t17.1\t39.0\t5894\t40455\t0.9339\t57764\tRomney\t57764\t0.007249603\t57764.0\n20361\t-102.560294\t43.021454999999996\tPine Ridge CDP\tSD\tSouth Dakota\tShannon County\t3486\t20.6\t9.0\t38.2\t8356\t32500\t0.9339\t57770\tRomney\t57770\t0.017772233999999998\t57770.0\n20362\t-102.101935\t43.127796000000004\tBatesland town\tSD\tSouth Dakota\tShannon County\t93\t25.6\t12.5\t14.9\t7963\t32500\t0.9339\t57716\tRomney\t57716\t0.00047413\t57716.0\n20363\t-102.491226\t43.235056\tManderson-White Horse Creek CDP\tSD\tSouth Dakota\tShannon County\t724\t22.5\t17.2\t39.1\t5904\t40000\t0.9339\t57756\tRomney\t57756\t0.003691078\t57756.0\n20364\t-102.164369\t43.425434\tKyle CDP\tSD\tSouth Dakota\tShannon County\t1060\t23.3\t17.6\t30.0\t9500\t43929\t0.9339\t57752\tRomney\t57752\t0.005404064\t57752.0\n20365\t-102.335375\t43.269158000000004\tPorcupine CDP\tSD\tSouth Dakota\tShannon County\t440\t21.7\t11.1\t41.1\t6913\t41667\t0.9339\t57772\tRomney\t57772\t0.0022431960000000003\t57772.0\n20366\t-98.508955\t44.73834\tTulare town\tSD\tSouth Dakota\tSpink County\t206\t42.5\t17.0\t2.4\t18432\t55000\t0.4275\t57476\tRomney\t57476\t0.001050224\t57476.0\n20367\t-98.30914200000001\t44.877671\tFrankfort city\tSD\tSouth Dakota\tSpink County\t149\t39.3\t16.5\t2.7\t16035\t41250\t0.4275\t57440\tRomney\t57440\t0.000759628\t57440.0\n20368\t-98.095568\t45.157322\tConde city\tSD\tSouth Dakota\tSpink County\t152\t50.9\t24.2\t2.2\t21552\t51250\t0.4275\t57434\tRomney\t57434\t0.0007749219999999999\t57434.0\n20369\t-98.49911\t44.993184\tAshton city\tSD\tSouth Dakota\tSpink County\t138\t43.0\t18.0\t1.4\t17831\t53750\t0.4275\t57424\tRomney\t57424\t0.000703548\t57424.0\n20370\t-98.498447\t45.154512\tMellette city\tSD\tSouth Dakota\tSpink County\t225\t41.9\t17.1\t1.7\t17845\t54167\t0.4275\t57461\tRomney\t57461\t0.001147089\t57461.0\n20371\t-98.57934200000001\t45.155467\tNorthville town\tSD\tSouth Dakota\tSpink County\t113\t42.2\t17.6\t1.7\t17766\t56667\t0.4275\t57465\tRomney\t57465\t0.000576094\t57465.0\n20372\t-98.322446\t45.159290999999996\tBrentford town\tSD\tSouth Dakota\tSpink County\t53\t51.5\t23.3\t3.1\t21469\t50000\t0.4275\t57461\tRomney\t57461\t0.000270203\t57461.0\n20373\t-98.097383\t45.048994\tTurton town\tSD\tSouth Dakota\tSpink County\t50\t51.5\t25.0\t3.2\t21366\t52500\t0.4275\t57477\tRomney\t57477\t0.000254909\t57477.0\n20374\t-98.099172\t44.894349\tDoland city\tSD\tSouth Dakota\tSpink County\t266\t38.3\t17.1\t2.2\t16075\t37500\t0.4275\t57436\tRomney\t57436\t0.0013561139999999998\t57436.0\n20375\t-98.516476\t44.87559\tRedfield city\tSD\tSouth Dakota\tSpink County\t2286\t41.1\t16.3\t2.5\t18559\t57048\t0.4275\t57469\tRomney\t57469\t0.011654425\t57469.0\n20376\t-100.383129\t44.366865999999995\tFort Pierre city\tSD\tSouth Dakota\tStanley County\t1843\t40.2\t27.9\t1.6\t24153\t109539\t0.2825\t575HH\tRomney\t575HH\t0.009395934\t0.0\n20377\t-100.073314\t44.839034000000005\tAgar town\tSD\tSouth Dakota\tSully County\t77\t47.9\t12.3\t2.1\t17682\t75000\t0.2274\t57520\tRomney\t57520\t0.000392559\t57520.0\n20378\t-100.06738399999999\t44.704376\tOnida city\tSD\tSouth Dakota\tSully County\t783\t40.8\t19.9\t1.5\t22308\t80833\t0.2274\t57564\tRomney\t57564\t0.00399187\t57564.0\n20379\t-101.030446\t43.117458\tSpring Creek CDP\tSD\tSouth Dakota\tTodd County\t155\t20.0\t1.5\t20.8\t7303\t80000\t0.7913\t57572\tRomney\t57572\t0.000790217\t57572.0\n20380\t-100.874903\t43.212809\tTwo Strike CDP\tSD\tSouth Dakota\tTodd County\t38\t19.4\t0.0\t18.2\t7220\t112500\t0.7913\t57570\tRomney\t57570\t0.000193731\t57570.0\n20381\t-100.660884\t43.306253999999996\tMission city\tSD\tSouth Dakota\tTodd County\t1045\t26.5\t24.0\t15.3\t13669\t60000\t0.7913\t57555\tRomney\t57555\t0.005327592\t57555.0\n20382\t-100.594813\t43.306249\tWhite Horse CDP\tSD\tSouth Dakota\tTodd County\t208\t20.8\t12.1\t19.7\t7129\t16250\t0.7913\t57555\tRomney\t57555\t0.00106042\t57555.0\n20383\t-101.041014\t43.324157\tParmelee CDP\tSD\tSouth Dakota\tTodd County\t745\t21.2\t8.2\t26.4\t4108\t50714\t0.7913\t57566\tRomney\t57566\t0.00379814\t57566.0\n20384\t-100.63079499999999\t43.308824\tAntelope CDP\tSD\tSouth Dakota\tTodd County\t1003\t20.8\t11.7\t19.9\t7122\t18182\t0.7913\t57555\tRomney\t57555\t0.0051134679999999995\t57555.0\n20385\t-100.902805\t43.142609\tSt. Francis town\tSD\tSouth Dakota\tTodd County\t764\t22.5\t15.7\t22.3\t8524\t26667\t0.7913\t57572\tRomney\t57572\t0.003895005\t57572.0\n20386\t-100.82296\t43.240111\tRosebud CDP\tSD\tSouth Dakota\tTodd County\t1791\t21.0\t20.5\t21.6\t8453\t72778\t0.7913\t57570\tRomney\t57570\t0.009130829\t57570.0\n20387\t-99.69050899999999\t43.593832\tHamill CDP\tSD\tSouth Dakota\tTripp County\t10\t32.5\t16.7\t0.0\t14064\t0\t0.2739\t57534\tRomney\t57534\t5.1e-05\t57534.0\n20388\t-99.85683900000001\t43.373818\tWinner city\tSD\tSouth Dakota\tTripp County\t2769\t41.3\t18.4\t5.1\t17157\t70085\t0.2739\t57580\tRomney\t57580\t0.014116843\t57580.0\n20389\t-99.716837\t43.259679999999996\tColome city\tSD\tSouth Dakota\tTripp County\t353\t44.1\t15.2\t1.5\t19535\t60769\t0.2739\t57528\tRomney\t57528\t0.001799655\t57528.0\n20390\t-100.082436\t43.440723\tNew Witten town\tSD\tSouth Dakota\tTripp County\t47\t40.0\t13.3\t4.3\t13835\t50000\t0.2739\t57584\tRomney\t57584\t0.00023961400000000003\t57584.0\n20391\t-97.079613\t43.171402\tViborg city\tSD\tSouth Dakota\tTurner County\t805\t47.0\t14.4\t3.4\t20236\t91304\t0.3352\t57070\tRomney\t57070\t0.00410403\t57070.0\n20392\t-97.089277\t43.279344\tHurley city\tSD\tSouth Dakota\tTurner County\t443\t40.0\t17.1\t4.9\t20468\t91667\t0.3352\t57036\tRomney\t57036\t0.002258491\t57036.0\n20393\t-96.95950500000001\t43.116601\tCenterville city\tSD\tSouth Dakota\tTurner County\t942\t45.8\t18.0\t3.9\t19981\t83256\t0.3352\t57014\tRomney\t57014\t0.00480248\t57014.0\n20394\t-96.99440799999999\t43.259510999999996\tDavis town\tSD\tSouth Dakota\tTurner County\t108\t40.0\t17.8\t4.0\t20501\t92500\t0.3352\t57021\tRomney\t57021\t0.000550603\t57021.0\n20395\t-96.98801999999999\t43.372645\tChancellor town\tSD\tSouth Dakota\tTurner County\t318\t41.2\t17.4\t2.1\t20037\t103409\t0.3352\t57015\tRomney\t57015\t0.001621219\t57015.0\n20396\t-97.26055\t43.423584999999996\tMarion city\tSD\tSouth Dakota\tTurner County\t864\t47.8\t13.0\t3.1\t18682\t74318\t0.3352\t57043\tRomney\t57043\t0.004404822\t57043.0\n20397\t-97.137796\t43.396055\tParker city\tSD\tSouth Dakota\tTurner County\t1000\t41.1\t17.6\t2.5\t20029\t103646\t0.3352\t57053\tRomney\t57053\t0.0050981740000000005\t57053.0\n20398\t-97.156116\t43.084918\tIrene city\tSD\tSouth Dakota\tTurner County\t433\t46.3\t17.7\t3.7\t18815\t76364\t0.3352\t57037\tRomney\t57037\t0.002207509\t57037.0\n20399\t-97.384723\t43.491153000000004\tDolton town\tSD\tSouth Dakota\tTurner County\t40\t39.2\t25.0\t4.5\t25437\t112500\t0.3352\t57319\tRomney\t57319\t0.00020392700000000001\t57319.0\n20400\t-97.216599\t43.486583\tMonroe town\tSD\tSouth Dakota\tTurner County\t156\t41.3\t17.0\t2.6\t21157\t116071\t0.3352\t57047\tRomney\t57047\t0.000795315\t57047.0\n20401\t-96.629051\t43.023133\tAlcester city\tSD\tSouth Dakota\tUnion County\t1002\t49.5\t17.9\t3.3\t19363\t70417\t0.3662\t57001\tRomney\t57001\t0.00510837\t57001.0\n20402\t-96.773698\t43.086406\tBeresford city\tSD\tSouth Dakota\tUnion County\t1938\t39.4\t24.9\t8.0\t20988\t102433\t0.3662\t57004\tRomney\t57004\t0.009880261\t57004.0\n20403\t-96.499664\t42.535237\tNorth Sioux City\tSD\tSouth Dakota\tUnion County\t2626\t36.8\t40.3\t3.9\t35916\t134231\t0.3662\t57049\tRomney\t57049\t0.013387804\t57049.0\n20404\t-96.56201\t42.6038\tJefferson city\tSD\tSouth Dakota\tUnion County\t666\t41.2\t21.4\t5.6\t22111\t97667\t0.3662\t57038\tRomney\t57038\t0.0033953840000000004\t57038.0\n20405\t-96.680477\t42.681876\tElk Point city\tSD\tSouth Dakota\tUnion County\t2027\t36.8\t23.7\t2.9\t22909\t103365\t0.3662\t57025\tRomney\t57025\t0.010333998\t57025.0\n20406\t-99.884063\t45.503795000000004\tJava town\tSD\tSouth Dakota\tWalworth County\t180\t50.1\t16.8\t2.9\t20403\t41000\t0.2725\t57452\tRomney\t57452\t0.0009176710000000001\t57452.0\n20407\t-100.03311500000001\t45.504597\tSelby city\tSD\tSouth Dakota\tWalworth County\t666\t49.5\t21.0\t2.7\t18968\t50882\t0.2725\t57472\tRomney\t57472\t0.0033953840000000004\t57472.0\n20408\t-100.120645\t45.331714\tAkaska town\tSD\tSouth Dakota\tWalworth County\t30\t46.3\t27.3\t5.6\t17663\t65000\t0.2725\t57420\tRomney\t57420\t0.000152945\t57420.0\n20409\t-100.27102\t45.532893\tGlenham town\tSD\tSouth Dakota\tWalworth County\t133\t46.4\t24.0\t3.8\t17864\t63000\t0.2725\t57631\tRomney\t57631\t0.0006780569999999999\t57631.0\n20410\t-100.437016\t45.540789000000004\tMobridge city\tSD\tSouth Dakota\tWalworth County\t3268\t42.2\t18.4\t8.6\t17649\t65789\t0.2725\t57601\tRomney\t57601\t0.016660832\t57601.0\n20411\t-99.98174200000001\t45.315286\tLowry town\tSD\tSouth Dakota\tWalworth County\t10\t55.0\t33.3\t0.0\t17062\t75000\t0.2725\t57420\tRomney\t57420\t5.1e-05\t57420.0\n20412\t-97.27905600000001\t42.920757\tMission Hill town\tSD\tSouth Dakota\tYankton County\t170\t41.6\t18.4\t4.6\t19671\t86429\t0.4237\t57046\tRomney\t57046\t0.00086669\t57046.0\n20413\t-97.590642\t43.038601\tLesterville town\tSD\tSouth Dakota\tYankton County\t154\t43.8\t26.0\t3.5\t18173\t102083\t0.4237\t57040\tRomney\t57040\t0.0007851189999999999\t57040.0\n20414\t-97.393523\t42.89059\tYankton city\tSD\tSouth Dakota\tYankton County\t14049\t39.2\t27.3\t4.7\t21674\t117032\t0.4237\t57078\tRomney\t57078\t0.071624244\t57078.0\n20415\t-97.173174\t42.888672\tGayville town\tSD\tSouth Dakota\tYankton County\t388\t41.1\t18.1\t4.5\t19683\t87188\t0.4237\t57031\tRomney\t57031\t0.001978091\t57031.0\n20416\t-97.181205\t42.958694\tVolin town\tSD\tSouth Dakota\tYankton County\t200\t39.2\t17.6\t9.0\t17659\t82500\t0.4237\t57072\tRomney\t57072\t0.001019635\t57072.0\n20417\t-97.496654\t42.981089000000004\tUtica town\tSD\tSouth Dakota\tYankton County\t78\t38.1\t18.0\t2.6\t14839\t87500\t0.4237\t57067\tRomney\t57067\t0.000397658\t57067.0\n20418\t-101.601428\t45.049366\tDupree city\tSD\tSouth Dakota\tZiebach County\t420\t35.4\t16.5\t17.1\t11649\t78750\t0.5769\t57623\tRomney\t57623\t0.0021412329999999998\t57623.0\n20419\t-84.154555\t36.240109000000004\tLake City town\tTN\tTennessee\tAnderson County\t1974\t46.0\t7.6\t17.7\t14321\t72895\t0.3413\t37769\tRomney\t37769\t0.005743717\t37769.0\n20420\t-84.322175\t36.050317\tOliver Springs town\tTN\tTennessee\tAnderson County\t3235\t43.3\t12.9\t9.5\t20654\t94739\t0.3413\t37840\tRomney\t37840\t0.009412828\t37840.0\n20421\t-84.061823\t36.211295\tNorris city\tTN\tTennessee\tAnderson County\t1520\t48.4\t45.7\t6.8\t32006\t157863\t0.3413\t37828\tRomney\t37828\t0.00442272\t37828.0\n20422\t-84.244637\t35.992826\tOak Ridge city\tTN\tTennessee\tAnderson County\t28505\t45.9\t40.9\t10.1\t30367\t130974\t0.3413\t37830\tRomney\t37830\t0.082940548\t37830.0\n20423\t-84.129693\t36.095271999999994\tClinton city\tTN\tTennessee\tAnderson County\t9705\t43.0\t15.9\t10.6\t22752\t119386\t0.3413\t37716\tRomney\t37716\t0.028238485\t37716.0\n20424\t-86.353444\t35.590928000000005\tBell Buckle town\tTN\tTennessee\tBedford County\t412\t42.4\t31.8\t12.6\t24273\t163889\t0.2915\t37020\tRomney\t37020\t0.00119879\t37020.0\n20425\t-86.332656\t35.527752\tWartrace town\tTN\tTennessee\tBedford County\t641\t40.7\t10.9\t16.8\t18619\t121500\t0.2915\t37183\tRomney\t37183\t0.0018651079999999999\t37183.0\n20426\t-86.449759\t35.491685\tShelbyville city\tTN\tTennessee\tBedford County\t19763\t35.5\t11.6\t14.2\t19142\t106192\t0.2915\t37160\tRomney\t37160\t0.057504089\t37160.0\n20427\t-86.258044\t35.452246\tNormandy town\tTN\tTennessee\tBedford County\t151\t43.2\t25.7\t11.0\t21945\t131250\t0.2915\t37360\tRomney\t37360\t0.00043936199999999994\t37360.0\n20428\t-88.106526\t36.05249\tCamden city\tTN\tTennessee\tBenton County\t3554\t46.3\t9.7\t14.7\t16572\t82580\t0.3627\t38320\tRomney\t38320\t0.010341018\t38320.0\n20429\t-88.085431\t36.23229\tBig Sandy town\tTN\tTennessee\tBenton County\t522\t42.9\t4.9\t11.0\t15526\t68333\t0.3627\t38221\tRomney\t38221\t0.001518855\t38221.0\n20430\t-85.198144\t35.610858\tPikeville city\tTN\tTennessee\tBledsoe County\t1780\t41.2\t12.4\t20.2\t16042\t89872\t0.2907\t37367\tRomney\t37367\t0.005179238\t37367.0\n20431\t-84.133872\t35.754689\tFriendsville city\tTN\tTennessee\tBlount County\t1021\t43.5\t13.5\t8.6\t21573\t111830\t0.2627\t37737\tRomney\t37737\t0.002970788\t37737.0\n20432\t-83.935621\t35.788579\tEagleton Village CDP\tTN\tTennessee\tBlount County\t5178\t40.7\t11.9\t12.1\t20863\t97853\t0.2627\t37804\tRomney\t37804\t0.015066345\t37804.0\n20433\t-84.06326\t35.826792\tLouisville city\tTN\tTennessee\tBlount County\t2308\t43.2\t25.0\t8.9\t26793\t178488\t0.2627\t37777\tRomney\t37777\t0.006715551\t37777.0\n20434\t-83.93559\t35.832117\tRockford city\tTN\tTennessee\tBlount County\t895\t44.3\t19.1\t8.0\t24179\t125962\t0.2627\t37853\tRomney\t37853\t0.002604167\t37853.0\n20435\t-83.975616\t35.805191\tAlcoa city\tTN\tTennessee\tBlount County\t8348\t40.8\t21.6\t8.9\t23003\t108367\t0.2627\t37701\tRomney\t37701\t0.024290044\t37701.0\n20436\t-83.754486\t35.673495\tTownsend city\tTN\tTennessee\tBlount County\t320\t51.1\t15.2\t11.6\t20163\t129167\t0.2627\t37882\tRomney\t37882\t0.0009310989999999999\t37882.0\n20437\t-83.977699\t35.746807000000004\tMaryville city\tTN\tTennessee\tBlount County\t26621\t41.7\t27.4\t11.3\t25835\t150805\t0.2627\t37701\tRomney\t37701\t0.077458703\t37701.0\n20438\t-84.868658\t35.182748\tCleveland city\tTN\tTennessee\tBradley County\t41030\t37.0\t24.8\t9.4\t22574\t132249\t0.2235\t37312\tRomney\t37312\t0.119384343\t37312.0\n20439\t-84.90934\t35.110327000000005\tSouth Cleveland CDP\tTN\tTennessee\tBradley County\t6881\t38.2\t8.8\t10.3\t18892\t103291\t0.2235\t37311\tRomney\t37311\t0.020021537\t37311.0\n20440\t-84.761055\t35.286229999999996\tCharleston city\tTN\tTennessee\tBradley County\t824\t40.6\t14.7\t13.7\t21632\t110606\t0.2235\t37310\tRomney\t37310\t0.00239758\t37310.0\n20441\t-84.854161\t35.152643\tEast Cleveland CDP\tTN\tTennessee\tBradley County\t1783\t33.2\t2.4\t20.7\t15458\t59559\t0.2235\t37311\tRomney\t37311\t0.005187967\t37311.0\n20442\t-84.851274\t35.089494\tWildwood Lake CDP\tTN\tTennessee\tBradley County\t3257\t40.7\t10.7\t6.7\t19701\t106122\t0.2235\t37323\tRomney\t37323\t0.009476841\t37323.0\n20443\t-84.91376899999999\t35.23858\tHopewell CDP\tTN\tTennessee\tBradley County\t2017\t42.9\t18.9\t4.8\t22472\t134524\t0.2235\t37312\tRomney\t37312\t0.005868833\t37312.0\n20444\t-84.1259\t36.578697999999996\tJellico city\tTN\tTennessee\tCampbell County\t2381\t43.0\t10.8\t9.4\t14777\t57153\t0.275\t37762\tRomney\t37762\t0.0069279580000000006\t37762.0\n20445\t-84.124925\t36.372543\tLa Follette city\tTN\tTennessee\tCampbell County\t7673\t42.7\t7.2\t15.5\t15047\t71000\t0.275\t37766\tRomney\t37766\t0.022326007000000002\t37766.0\n20446\t-84.192367\t36.33442\tJacksboro town\tTN\tTennessee\tCampbell County\t2040\t40.8\t14.6\t12.1\t20491\t117910\t0.275\t37757\tRomney\t37757\t0.0059357559999999995\t37757.0\n20447\t-84.21984\t36.324882\tCaryville town\tTN\tTennessee\tCampbell County\t2377\t40.3\t8.9\t11.6\t18293\t92347\t0.275\t37714\tRomney\t37714\t0.006916319000000001\t37714.0\n20448\t-86.069487\t35.823698\tWoodbury town\tTN\tTennessee\tCannon County\t2483\t40.4\t13.2\t10.7\t19278\t96508\t0.3145\t37190\tRomney\t37190\t0.007224746\t37190.0\n20449\t-86.101197\t35.950921\tAuburntown town\tTN\tTennessee\tCannon County\t279\t40.7\t11.9\t9.2\t21848\t103409\t0.3145\t37016\tRomney\t37016\t0.0008118019999999999\t37016.0\n20450\t-88.507609\t36.157356\tMcKenzie city\tTN\tTennessee\tCarroll County\t5026\t39.5\t22.5\t16.3\t20751\t83287\t0.3202\t38201\tRomney\t38201\t0.014624073000000001\t38201.0\n20451\t-88.39164\t35.871663\tClarksburg town\tTN\tTennessee\tCarroll County\t274\t40.5\t8.8\t16.8\t18569\t65714\t0.3202\t38390\tRomney\t38390\t0.000797253\t38390.0\n20452\t-88.41723\t36.00659\tHuntingdon town\tTN\tTennessee\tCarroll County\t4217\t43.5\t19.5\t17.9\t20233\t89913\t0.3202\t38344\tRomney\t38344\t0.012270138\t38344.0\n20453\t-88.620681\t36.010834\tTrezevant town\tTN\tTennessee\tCarroll County\t911\t41.4\t9.9\t16.8\t17278\t66346\t0.3202\t38258\tRomney\t38258\t0.0026507220000000003\t38258.0\n20454\t-88.246977\t36.034113\tBruceton town\tTN\tTennessee\tCarroll County\t1463\t47.2\t12.2\t18.9\t17698\t67857\t0.3202\t38317\tRomney\t38317\t0.004256868\t38317.0\n20455\t-88.578872\t35.987083\tMcLemoresville town\tTN\tTennessee\tCarroll County\t258\t41.2\t7.3\t16.7\t17707\t75500\t0.3202\t38235\tRomney\t38235\t0.000750699\t38235.0\n20456\t-88.668564\t35.975514000000004\tAtwood town\tTN\tTennessee\tCarroll County\t1009\t44.8\t12.0\t19.8\t18770\t73372\t0.3202\t38220\tRomney\t38220\t0.0029358709999999996\t38220.0\n20457\t-88.273662\t36.035444\tHollow Rock town\tTN\tTennessee\tCarroll County\t962\t40.9\t6.1\t22.8\t17568\t67414\t0.3202\t38317\tRomney\t38317\t0.002799116\t38317.0\n20458\t-82.151882\t36.397463\tHunter CDP\tTN\tTennessee\tCarter County\t1616\t44.7\t10.8\t4.3\t20549\t111139\t0.2323\t37643\tRomney\t37643\t0.00470205\t37643.0\n20459\t-82.292571\t36.376456\tWatauga city\tTN\tTennessee\tCarter County\t433\t42.9\t11.6\t11.8\t18015\t109500\t0.2323\t37694\tRomney\t37694\t0.001259893\t37694.0\n20460\t-82.072353\t36.184523999999996\tRoan Mountain CDP\tTN\tTennessee\tCarter County\t1341\t41.2\t8.0\t7.0\t13880\t80676\t0.2323\t37687\tRomney\t37687\t0.003901887\t37687.0\n20461\t-82.234496\t36.338091\tElizabethton city\tTN\tTennessee\tCarter County\t14227\t41.0\t18.7\t11.2\t17494\t108658\t0.2323\t37643\tRomney\t37643\t0.041396077\t37643.0\n20462\t-82.32367099999999\t36.289141\tPine Crest CDP\tTN\tTennessee\tCarter County\t2965\t38.2\t30.3\t6.9\t21069\t116399\t0.2323\t37601\tRomney\t37601\t0.008627214\t37601.0\n20463\t-82.288585\t36.329948\tCentral CDP\tTN\tTennessee\tCarter County\t2752\t43.8\t15.3\t8.9\t18912\t107031\t0.2323\t37694\tRomney\t37694\t0.008007451\t37694.0\n20464\t-87.04083\t36.255719\tAshland City town\tTN\tTennessee\tCheatham County\t4411\t36.4\t13.0\t9.7\t22663\t106920\t0.3069\t37015\tRomney\t37015\t0.012834617\t37015.0\n20465\t-87.104344\t36.086062\tKingston Springs town\tTN\tTennessee\tCheatham County\t3054\t39.2\t32.3\t7.9\t32295\t220455\t0.3069\t37082\tRomney\t37082\t0.008886175999999999\t37082.0\n20466\t-87.056627\t36.104277\tPegram town\tTN\tTennessee\tCheatham County\t2222\t38.5\t24.0\t9.1\t26032\t166607\t0.3069\t37143\tRomney\t37143\t0.006465318\t37143.0\n20467\t-87.04553100000001\t36.389261\tPleasant View city\tTN\tTennessee\tCheatham County\t4189\t33.3\t18.4\t7.9\t25647\t154552\t0.3069\t37146\tRomney\t37146\t0.012188667\t37146.0\n20468\t-88.64944399999999\t35.443397999999995\tHenderson city\tTN\tTennessee\tChester County\t5521\t29.8\t25.7\t16.8\t18434\t92429\t0.2534\t38340\tRomney\t38340\t0.016064366\t38340.0\n20469\t-88.433041\t35.392325\tEnville town\tTN\tTennessee\tChester County\t232\t42.8\t6.0\t15.2\t17849\t76667\t0.2534\t38332\tRomney\t38332\t0.000675047\t38332.0\n20470\t-83.563847\t36.461434000000004\tTazewell town\tTN\tTennessee\tClaiborne County\t2310\t42.6\t10.2\t12.1\t15991\t83145\t0.239\t37879\tRomney\t37879\t0.00672137\t37879.0\n20471\t-83.665736\t36.597415999999996\tCumberland Gap town\tTN\tTennessee\tClaiborne County\t217\t44.5\t26.7\t18.4\t25243\t99167\t0.239\t37724\tRomney\t37724\t0.000631401\t37724.0\n20472\t-83.608071\t36.438472\tNew Tazewell town\tTN\tTennessee\tClaiborne County\t3088\t39.4\t11.1\t14.7\t16784\t85462\t0.239\t37825\tRomney\t37825\t0.008985105\t37825.0\n20473\t-83.643493\t36.584315000000004\tHarrogate-Shawanee CDP\tTN\tTennessee\tClaiborne County\t2756\t44.9\t20.8\t12.4\t21675\t102171\t0.239\t37752\tRomney\t37752\t0.00801909\t37752.0\n20474\t-85.500636\t36.547943\tCelina city\tTN\tTennessee\tClay County\t1286\t46.5\t11.0\t14.6\t16672\t80000\t0.3677\t38551\tRomney\t38551\t0.003741854\t38551.0\n20475\t-83.085814\t36.010296999999994\tParrottsville town\tTN\tTennessee\tCocke County\t214\t41.6\t10.1\t7.1\t16524\t87000\t0.2448\t37843\tRomney\t37843\t0.000622672\t37843.0\n20476\t-83.194773\t35.960781\tNewport city\tTN\tTennessee\tCocke County\t7175\t40.8\t8.2\t16.7\t16953\t90533\t0.2448\t37821\tRomney\t37821\t0.020876983999999998\t37821.0\n20477\t-86.215602\t35.376058\tTullahoma city\tTN\tTennessee\tCoffee County\t18507\t39.5\t26.9\t13.4\t23326\t103465\t0.3048\t37388\tRomney\t37388\t0.053849525\t37388.0\n20478\t-86.080626\t35.467043\tManchester city\tTN\tTennessee\tCoffee County\t9594\t40.6\t23.0\t9.8\t22182\t109139\t0.3048\t37355\tRomney\t37355\t0.02791551\t37355.0\n20479\t-89.224012\t35.814359\tMaury City town\tTN\tTennessee\tCrockett County\t614\t41.1\t13.2\t14.0\t15579\t68529\t0.3036\t38050\tRomney\t38050\t0.001786546\t38050.0\n20480\t-89.116431\t35.782911\tAlamo town\tTN\tTennessee\tCrockett County\t2337\t41.8\t14.6\t13.1\t17919\t92164\t0.3036\t38001\tRomney\t38001\t0.006799932\t38001.0\n20481\t-88.986215\t35.776903000000004\tGadsden town\tTN\tTennessee\tCrockett County\t578\t41.8\t11.4\t8.1\t20078\t76800\t0.3036\t38337\tRomney\t38337\t0.001681797\t38337.0\n20482\t-89.085181\t35.720459000000005\tBells city\tTN\tTennessee\tCrockett County\t2245\t36.5\t15.3\t15.0\t15031\t85595\t0.3036\t38006\tRomney\t38006\t0.006532240999999999\t38006.0\n20483\t-89.240752\t35.907412\tFriendship city\tTN\tTennessee\tCrockett County\t553\t40.0\t7.2\t17.0\t15241\t73182\t0.3036\t38034\tRomney\t38034\t0.001609055\t38034.0\n20484\t-85.19923100000001\t35.976602\tPleasant Hill town\tTN\tTennessee\tCumberland County\t622\t43.4\t18.7\t8.5\t17045\t85303\t0.248\t38555\tRomney\t38555\t0.001809824\t38555.0\n20485\t-85.035562\t35.955983\tCrossville city\tTN\tTennessee\tCumberland County\t9445\t40.8\t13.3\t12.1\t20534\t104720\t0.248\t38555\tRomney\t38555\t0.027481967000000003\t38555.0\n20486\t-84.874414\t36.002299\tFairfield Glade CDP\tTN\tTennessee\tCumberland County\t7166\t66.5\t30.4\t19.7\t28957\t164790\t0.248\t38558\tRomney\t38558\t0.020850797\t38558.0\n20487\t-84.88396\t35.906573\tCrab Orchard city\tTN\tTennessee\tCumberland County\t867\t43.4\t7.9\t10.3\t17859\t74737\t0.248\t37723\tRomney\t37723\t0.002522696\t37723.0\n20488\t-85.060813\t35.870646\tLake Tansi CDP\tTN\tTennessee\tCumberland County\t3521\t48.3\t17.0\t9.5\t19490\t103520\t0.248\t38555\tRomney\t38555\t0.010244998\t38555.0\n20489\t-86.78605300000001\t36.072753000000006\tOak Hill city\tTN\tTennessee\tDavidson County\t4581\t48.2\t64.3\t7.1\t58883\t363205\t0.5845\t37220\tRomney\t37220\t0.013329263000000001\t37220.0\n20490\t-86.692592\t36.349225\tGoodlettsville city\tTN\tTennessee\tDavidson County\t16061\t39.1\t26.6\t8.8\t29054\t163271\t0.5845\t37072\tRomney\t37072\t0.046732438\t37072.0\n20491\t-86.63558\t36.241346\tLakewood city\tTN\tTennessee\tDavidson County\t2375\t39.8\t19.9\t8.3\t23198\t126067\t0.5845\t37138\tRomney\t37138\t0.0069105\t37138.0\n20492\t-86.840278\t36.065119\tForest Hills city\tTN\tTennessee\tDavidson County\t5022\t48.7\t75.2\t6.0\t76780\t482643\t0.5845\t37215\tRomney\t37215\t0.014612433999999999\t37215.0\n20493\t-86.767616\t36.119788\tBerry Hill city\tTN\tTennessee\tDavidson County\t695\t44.3\t25.5\t10.4\t30187\t116964\t0.5845\t37204\tRomney\t37204\t0.002022231\t37204.0\n20494\t-86.784522\t36.171231\tNashville-Davidson (balance)\tTN\tTennessee\tDavidson County\t609975\t35.8\t32.6\t10.4\t28715\t143085\t0.5845\t37219\tRomney\t37219\t1.774834618\t37219.0\n20495\t-86.856257\t36.099369\tBelle Meade city\tTN\tTennessee\tDavidson County\t2991\t46.2\t79.0\t3.4\t81625\t840232\t0.5845\t37205\tRomney\t37205\t0.008702865\t37205.0\n20496\t-88.123374\t35.65023\tParsons city\tTN\tTennessee\tDecatur County\t2289\t45.3\t10.5\t17.3\t19073\t73723\t0.3065\t38363\tRomney\t38363\t0.006660266999999999\t38363.0\n20497\t-88.11921600000001\t35.581934999999994\tDecaturville town\tTN\tTennessee\tDecatur County\t795\t46.2\t8.5\t13.9\t18726\t74600\t0.3065\t383HH\tRomney\t383HH\t0.002313199\t0.0\n20498\t-85.977632\t36.004799\tLiberty town\tTN\tTennessee\tDeKalb County\t388\t38.7\t11.1\t12.6\t17136\t125000\t0.3385\t37095\tRomney\t37095\t0.0011289569999999999\t37095.0\n20499\t-86.034187\t36.075987\tAlexandria town\tTN\tTennessee\tDeKalb County\t855\t38.7\t6.6\t13.5\t18570\t105032\t0.3385\t37012\tRomney\t37012\t0.00248778\t37012.0\n20500\t-85.820545\t35.958056\tSmithville city\tTN\tTennessee\tDeKalb County\t4197\t40.7\t14.6\t11.9\t19944\t97875\t0.3385\t37166\tRomney\t37166\t0.012211945\t37166.0\n20501\t-85.942262\t36.012189\tDowelltown town\tTN\tTennessee\tDeKalb County\t322\t40.9\t16.6\t10.5\t17258\t97333\t0.3385\t37059\tRomney\t37059\t0.000936918\t37059.0\n20502\t-87.23434300000001\t36.107957\tWhite Bluff town\tTN\tTennessee\tDickson County\t2708\t38.3\t12.0\t10.3\t21428\t119786\t0.3495\t37187\tRomney\t37187\t0.007879425\t37187.0\n20503\t-87.368184\t36.066282\tDickson city\tTN\tTennessee\tDickson County\t13472\t36.7\t14.2\t11.5\t23707\t129552\t0.3495\t37055\tRomney\t37055\t0.039199265\t37055.0\n20504\t-87.313191\t36.053135\tBurns town\tTN\tTennessee\tDickson County\t1531\t39.5\t15.5\t9.5\t23056\t141267\t0.3495\t37029\tRomney\t37029\t0.004454727\t37029.0\n20505\t-87.445513\t36.236132\tVanleer town\tTN\tTennessee\tDickson County\t342\t39.8\t12.0\t9.6\t18521\t98125\t0.3495\t37181\tRomney\t37181\t0.000995112\t37181.0\n20506\t-87.34728\t36.182056\tCharlotte town\tTN\tTennessee\tDickson County\t1286\t37.1\t12.5\t11.3\t20729\t112175\t0.3495\t37036\tRomney\t37036\t0.003741854\t37036.0\n20507\t-87.467874\t36.293226000000004\tSlayden town\tTN\tTennessee\tDickson County\t200\t41.2\t10.7\t9.7\t18828\t104167\t0.3495\t37051\tRomney\t37051\t0.0005819369999999999\t37051.0\n20508\t-89.269412\t36.116993\tNewbern town\tTN\tTennessee\tDyer County\t3045\t39.0\t15.6\t11.6\t19725\t90361\t0.2722\t38059\tRomney\t38059\t0.008859988000000001\t38059.0\n20509\t-89.18684\t36.206246\tTrimble town\tTN\tTennessee\tDyer County\t745\t39.8\t6.7\t9.8\t19044\t80800\t0.2722\t38259\tRomney\t38259\t0.002167715\t38259.0\n20510\t-89.377922\t36.04511\tDyersburg city\tTN\tTennessee\tDyer County\t17261\t36.8\t18.0\t15.5\t20255\t94379\t0.2722\t38024\tRomney\t38024\t0.050224059\t38024.0\n20511\t-89.594778\t35.232096000000006\tHickory Withe town\tTN\tTennessee\tFayette County\t3636\t40.5\t18.6\t9.6\t25491\t140291\t0.3417\t38028\tRomney\t38028\t0.010579612\t38028.0\n20512\t-89.375446\t35.15825\tWilliston city\tTN\tTennessee\tFayette County\t400\t36.9\t20.1\t10.8\t20792\t99545\t0.3417\t38076\tRomney\t38076\t0.0011638739999999999\t38076.0\n20513\t-89.37378299999999\t35.233968\tSomerville town\tTN\tTennessee\tFayette County\t3019\t41.5\t16.8\t19.4\t19036\t99231\t0.3417\t38068\tRomney\t38068\t0.008784337\t38068.0\n20514\t-89.543974\t35.0445\tRossville town\tTN\tTennessee\tFayette County\t625\t42.9\t14.1\t7.9\t22912\t123780\t0.3417\t38066\tRomney\t38066\t0.0018185529999999999\t38066.0\n20515\t-89.571453\t35.368349\tBraden town\tTN\tTennessee\tFayette County\t314\t41.4\t7.5\t14.5\t19472\t92500\t0.3417\t38049\tRomney\t38049\t0.0009136410000000001\t38049.0\n20516\t-89.605184\t35.337547\tGallaway city\tTN\tTennessee\tFayette County\t774\t41.5\t7.6\t13.4\t19934\t96429\t0.3417\t38036\tRomney\t38036\t0.002252096\t38036.0\n20517\t-89.516028\t35.227892\tOakland town\tTN\tTennessee\tFayette County\t4456\t39.7\t16.6\t8.4\t26579\t130647\t0.3417\t38060\tRomney\t38060\t0.012965553000000001\t38060.0\n20518\t-89.387612\t35.05992\tMoscow city\tTN\tTennessee\tFayette County\t492\t40.3\t16.6\t11.1\t20306\t114706\t0.3417\t38057\tRomney\t38057\t0.001431565\t38057.0\n20519\t-89.617387\t35.046762\tPiperton city\tTN\tTennessee\tFayette County\t756\t46.4\t14.7\t15.4\t24992\t124510\t0.3417\t38017\tRomney\t38017\t0.002199721\t38017.0\n20520\t-89.236772\t35.047627\tLa Grange town\tTN\tTennessee\tFayette County\t144\t37.8\t17.7\t13.8\t21916\t97500\t0.3417\t38046\tRomney\t38046\t0.000418995\t38046.0\n20521\t-84.881387\t36.381168\tAllardt city\tTN\tTennessee\tFentress County\t673\t43.0\t19.0\t9.0\t16462\t87941\t0.2264\t38556\tRomney\t38556\t0.001958217\t38556.0\n20522\t-84.934066\t36.431959\tJamestown city\tTN\tTennessee\tFentress County\t1873\t44.0\t10.5\t15.6\t14780\t70882\t0.2264\t38556\tRomney\t38556\t0.005449838\t38556.0\n20523\t-86.26897\t35.057775\tHuntland town\tTN\tTennessee\tFranklin County\t975\t40.9\t11.5\t14.3\t19296\t75735\t0.3476\t37345\tRomney\t37345\t0.0028369420000000003\t37345.0\n20524\t-86.151983\t35.274971\tEstill Springs town\tTN\tTennessee\tFranklin County\t2292\t42.4\t17.4\t9.4\t22462\t108453\t0.3476\t37330\tRomney\t37330\t0.006668996\t37330.0\n20525\t-85.920501\t35.200178\tSewanee CDP\tTN\tTennessee\tFranklin County\t2667\t22.9\t73.6\t9.3\t24542\t212500\t0.3476\t37375\tRomney\t37375\t0.007760128000000001\t37375.0\n20526\t-86.075097\t35.216653\tDecherd city\tTN\tTennessee\tFranklin County\t2440\t40.8\t10.9\t14.4\t17214\t90592\t0.3476\t37324\tRomney\t37324\t0.0070996290000000005\t37324.0\n20527\t-86.014563\t35.163569\tCowan city\tTN\tTennessee\tFranklin County\t1837\t39.9\t12.4\t10.1\t18736\t81170\t0.3476\t37318\tRomney\t37318\t0.00534509\t37318.0\n20528\t-86.107691\t35.188992999999996\tWinchester city\tTN\tTennessee\tFranklin County\t7527\t43.0\t16.8\t14.6\t20952\t99500\t0.3476\t37398\tRomney\t37398\t0.021901193\t37398.0\n20529\t-88.816168\t36.073923\tBradford town\tTN\tTennessee\tGibson County\t1126\t42.1\t8.6\t13.0\t17646\t76630\t0.3338\t38316\tRomney\t38316\t0.0032763040000000003\t38316.0\n20530\t-88.879258\t35.826546\tHumboldt city\tTN\tTennessee\tGibson County\t9207\t41.4\t8.9\t17.0\t17977\t81250\t0.3338\t38343\tRomney\t38343\t0.026789462000000003\t38343.0\n20531\t-89.013508\t36.208251000000004\tKenton town\tTN\tTennessee\tGibson County\t1245\t40.5\t7.6\t11.0\t18163\t80563\t0.3338\t38233\tRomney\t38233\t0.003622557\t38233.0\n20532\t-88.77834399999999\t35.80571\tMedina city\tTN\tTennessee\tGibson County\t1466\t37.1\t19.0\t11.6\t21895\t102455\t0.3338\t38355\tRomney\t38355\t0.004265597\t38355.0\n20533\t-88.992359\t36.125832\tRutherford town\tTN\tTennessee\tGibson County\t1247\t43.0\t7.7\t13.3\t18362\t69444\t0.3338\t38369\tRomney\t38369\t0.0036283759999999996\t38369.0\n20534\t-89.11845799999999\t36.096740000000004\tYorkville city\tTN\tTennessee\tGibson County\t288\t40.2\t7.9\t9.2\t18079\t83636\t0.3338\t38330\tRomney\t38330\t0.0008379889999999999\t38330.0\n20535\t-88.992307\t36.071504\tDyer city\tTN\tTennessee\tGibson County\t2356\t42.1\t10.6\t19.4\t18127\t76916\t0.3338\t38330\tRomney\t38330\t0.006855216\t38330.0\n20536\t-88.75495500000001\t35.915316\tMilan city\tTN\tTennessee\tGibson County\t7638\t40.9\t16.1\t14.6\t21233\t89495\t0.3338\t38358\tRomney\t38358\t0.022224168\t38358.0\n20537\t-88.93984499999999\t35.972148\tTrenton city\tTN\tTennessee\tGibson County\t4561\t40.2\t17.8\t19.9\t18962\t91984\t0.3338\t38382\tRomney\t38382\t0.01327107\t38382.0\n20538\t-88.844465\t35.874739\tGibson town\tTN\tTennessee\tGibson County\t421\t39.7\t7.5\t15.4\t20676\t97857\t0.3338\t38343\tRomney\t38343\t0.001224977\t38343.0\n20539\t-87.006103\t35.378114000000004\tLynnville town\tTN\tTennessee\tGiles County\t344\t45.9\t10.5\t15.6\t21489\t97308\t0.3482\t38472\tRomney\t38472\t0.001000931\t38472.0\n20540\t-87.17575\t35.035\tMinor Hill city\tTN\tTennessee\tGiles County\t467\t40.4\t5.0\t13.7\t19842\t91333\t0.3482\t38473\tRomney\t38473\t0.0013588229999999999\t38473.0\n20541\t-87.034276\t35.194831\tPulaski city\tTN\tTennessee\tGiles County\t7371\t40.2\t13.0\t19.6\t20638\t93844\t0.3482\t38478\tRomney\t38478\t0.021447282\t38478.0\n20542\t-86.825277\t35.004061\tArdmore city\tTN\tTennessee\tGiles County\t1138\t45.5\t20.0\t13.3\t20065\t101786\t0.3482\t38449\tRomney\t38449\t0.0033112209999999996\t38449.0\n20543\t-86.897437\t35.061057\tElkton city\tTN\tTennessee\tGiles County\t474\t41.9\t14.6\t15.0\t18959\t91786\t0.3482\t38449\tRomney\t38449\t0.00137919\t38449.0\n20544\t-83.519563\t36.280049\tRutledge town\tTN\tTennessee\tGrainger County\t1270\t43.9\t9.2\t12.0\t15386\t81136\t0.23\t37861\tRomney\t37861\t0.0036952990000000004\t37861.0\n20545\t-83.695493\t36.149143\tBlaine city\tTN\tTennessee\tGrainger County\t1637\t39.7\t9.2\t17.1\t18860\t105278\t0.23\t37709\tRomney\t37709\t0.004763153\t37709.0\n20546\t-82.818809\t36.166606\tGreeneville town\tTN\tTennessee\tGreene County\t15409\t43.7\t23.1\t14.9\t20523\t108679\t0.2606\t37745\tRomney\t37745\t0.044835324\t37745.0\n20547\t-82.830859\t36.327983\tBaileyton town\tTN\tTennessee\tGreene County\t557\t41.9\t10.1\t13.3\t18871\t83214\t0.2606\t37745\tRomney\t37745\t0.001620694\t37745.0\n20548\t-82.745638\t36.174327000000005\tTusculum city\tTN\tTennessee\tGreene County\t2130\t43.6\t21.9\t10.9\t24177\t138443\t0.2606\t37744\tRomney\t37744\t0.006197627\t37744.0\n20549\t-82.968448\t36.197255\tMosheim town\tTN\tTennessee\tGreene County\t1914\t43.9\t9.1\t12.5\t18970\t95804\t0.2606\t37818\tRomney\t37818\t0.005569136\t37818.0\n20550\t-85.669208\t35.458843\tBeersheba Springs town\tTN\tTennessee\tGrundy County\t546\t40.1\t3.9\t13.1\t15790\t57750\t0.3878\t37305\tRomney\t37305\t0.0015886879999999998\t37305.0\n20551\t-85.711518\t35.344448\tCoalmont city\tTN\tTennessee\tGrundy County\t950\t38.4\t9.3\t12.0\t12843\t57000\t0.3878\t37313\tRomney\t37313\t0.0027642\t37313.0\n20552\t-85.564833\t35.357013\tPalmer town\tTN\tTennessee\tGrundy County\t671\t43.5\t3.6\t24.4\t13532\t50882\t0.3878\t37365\tRomney\t37365\t0.001952398\t37365.0\n20553\t-85.740928\t35.435896\tAltamont town\tTN\tTennessee\tGrundy County\t1142\t36.0\t4.2\t13.7\t14679\t61429\t0.3878\t37301\tRomney\t37301\t0.003322859\t37301.0\n20554\t-85.63759\t35.372696999999995\tGruetli-Laager city\tTN\tTennessee\tGrundy County\t1865\t37.0\t6.8\t16.0\t14212\t68947\t0.3878\t37339\tRomney\t37339\t0.005426561\t37339.0\n20555\t-85.751418\t35.261817\tTracy City town\tTN\tTennessee\tGrundy County\t1666\t41.1\t11.0\t13.0\t14472\t71951\t0.3878\t37387\tRomney\t37387\t0.0048475340000000006\t37387.0\n20556\t-83.30156600000001\t36.208981\tMorristown city\tTN\tTennessee\tHamblen County\t26495\t38.2\t15.5\t14.1\t20079\t98668\t0.2613\t37814\tRomney\t37814\t0.07709208299999999\t37814.0\n20557\t-85.1096\t35.015496\tEast Brainerd CDP\tTN\tTennessee\tHamilton County\t15786\t42.3\t43.0\t7.4\t34918\t171594\t0.4167\t37421\tRomney\t37421\t0.045932275\t37421.0\n20558\t-85.33250100000001\t35.180699\tFairmount CDP\tTN\tTennessee\tHamilton County\t2680\t41.7\t53.8\t7.8\t38138\t225935\t0.4167\t37377\tRomney\t37377\t0.007797954\t37377.0\n20559\t-85.24686899999999\t35.035025\tRidgeside city\tTN\tTennessee\tHamilton County\t374\t44.4\t34.0\t12.8\t26389\t220313\t0.4167\t37411\tRomney\t37411\t0.001088222\t37411.0\n20560\t-85.346019\t35.139337\tSignal Mountain town\tTN\tTennessee\tHamilton County\t7576\t47.9\t66.9\t7.6\t42633\t239579\t0.4167\t37377\tRomney\t37377\t0.022043767000000002\t37377.0\n20561\t-85.173265\t35.258777\tSoddy-Daisy city\tTN\tTennessee\tHamilton County\t13305\t40.6\t14.5\t10.0\t23511\t100278\t0.4167\t37379\tRomney\t37379\t0.038713348\t37379.0\n20562\t-85.229158\t34.997283\tEast Ridge city\tTN\tTennessee\tHamilton County\t20761\t42.2\t17.6\t8.9\t27136\t109820\t0.4167\t37412\tRomney\t37412\t0.06040795400000001\t37412.0\n20563\t-85.308734\t35.164603\tWalden town\tTN\tTennessee\tHamilton County\t2039\t43.5\t55.6\t7.8\t41093\t257589\t0.4167\t37377\tRomney\t37377\t0.005932845999999999\t37377.0\n20564\t-85.250941\t35.06875\tChattanooga city\tTN\tTennessee\tHamilton County\t167036\t39.1\t24.9\t12.5\t25269\t114519\t0.4167\t37406\tRomney\t37406\t0.486022009\t37406.0\n20565\t-85.14076800000001\t35.202812\tLakesite city\tTN\tTennessee\tHamilton County\t1971\t42.1\t31.0\t8.1\t27056\t159375\t0.4167\t37341\tRomney\t37341\t0.005734988000000001\t37341.0\n20566\t-85.296322\t35.111365\tRed Bank city\tTN\tTennessee\tHamilton County\t12925\t37.8\t24.6\t10.9\t26794\t107844\t0.4167\t37415\tRomney\t37415\t0.037607668\t37415.0\n20567\t-85.350985\t34.995463\tLookout Mountain town\tTN\tTennessee\tHamilton County\t2000\t44.4\t74.1\t6.1\t58200\t464024\t0.4167\t37350\tRomney\t37350\t0.005819368\t37350.0\n20568\t-85.047446\t35.046764\tCollegedale city\tTN\tTennessee\tHamilton County\t7191\t35.9\t37.2\t8.3\t25752\t143949\t0.4167\t37363\tRomney\t37363\t0.020923538999999998\t37363.0\n20569\t-85.188096\t35.185409\tMiddle Valley CDP\tTN\tTennessee\tHamilton County\t13361\t40.7\t26.6\t7.1\t28840\t136869\t0.4167\t37343\tRomney\t37343\t0.038876291\t37343.0\n20570\t-85.146345\t35.126353\tHarrison CDP\tTN\tTennessee\tHamilton County\t7967\t42.1\t27.5\t9.5\t26745\t138503\t0.4167\t37416\tRomney\t37416\t0.023181454\t37416.0\n20571\t-85.10284\t35.053858\tOoltewah CDP\tTN\tTennessee\tHamilton County\t7269\t39.3\t23.1\t10.7\t24341\t111949\t0.4167\t37363\tRomney\t37363\t0.021150494\t37363.0\n20572\t-83.210088\t36.536949\tSneedville town\tTN\tTennessee\tHancock County\t1421\t42.0\t11.9\t18.9\t13973\t61563\t0.2322\t37869\tRomney\t37869\t0.0041346609999999995\t37869.0\n20573\t-89.18715\t35.05032\tGrand Junction city\tTN\tTennessee\tHardeman County\t321\t35.8\t4.4\t17.4\t13292\t67500\t0.5251\t38039\tRomney\t38039\t0.000934009\t38039.0\n20574\t-88.800005\t35.342159\tSilerton town\tTN\tTennessee\tHardeman County\t63\t41.3\t9.3\t14.3\t16665\t92500\t0.5251\t38356\tRomney\t38356\t0.00018331\t38356.0\n20575\t-89.149348\t35.318653999999995\tWhiteville town\tTN\tTennessee\tHardeman County\t4515\t35.3\t6.8\t14.0\t14391\t75294\t0.5251\t38075\tRomney\t38075\t0.013137224\t38075.0\n20576\t-88.829915\t35.229269\tHornsby town\tTN\tTennessee\tHardeman County\t315\t44.0\t11.8\t12.4\t19060\t73333\t0.5251\t38044\tRomney\t38044\t0.000916551\t38044.0\n20577\t-88.954262\t35.35374\tToone town\tTN\tTennessee\tHardeman County\t347\t41.1\t8.9\t14.6\t16695\t88571\t0.5251\t38381\tRomney\t38381\t0.00100966\t38381.0\n20578\t-89.014604\t35.265534\tBolivar city\tTN\tTennessee\tHardeman County\t5526\t37.8\t14.9\t16.4\t17533\t83150\t0.5251\t38008\tRomney\t38008\t0.016078915\t38008.0\n20579\t-88.889848\t35.061853\tMiddleton city\tTN\tTennessee\tHardeman County\t626\t42.3\t10.1\t16.5\t19729\t97188\t0.5251\t38052\tRomney\t38052\t0.001821462\t38052.0\n20580\t-89.087683\t35.047601\tSaulsbury town\tTN\tTennessee\tHardeman County\t96\t37.9\t4.9\t16.7\t13962\t57500\t0.5251\t38067\tRomney\t38067\t0.00027933\t38067.0\n20581\t-89.12599\t35.154802000000004\tHickory Valley town\tTN\tTennessee\tHardeman County\t137\t39.1\t9.2\t19.3\t14656\t65000\t0.5251\t38042\tRomney\t38042\t0.000398627\t38042.0\n20582\t-88.215875\t35.3802\tSaltillo town\tTN\tTennessee\tHardin County\t372\t48.8\t10.3\t12.4\t18109\t67917\t0.2351\t38370\tRomney\t38370\t0.001082403\t38370.0\n20583\t-88.337055\t35.230584\tCrump city\tTN\tTennessee\tHardin County\t1632\t40.9\t10.3\t11.2\t16630\t74434\t0.2351\t38327\tRomney\t38327\t0.004748605\t38327.0\n20584\t-88.23705799999999\t35.221446\tSavannah city\tTN\tTennessee\tHardin County\t7044\t43.1\t14.3\t11.5\t17988\t79661\t0.2351\t38372\tRomney\t38372\t0.020495815\t38372.0\n20585\t-82.713809\t36.52074\tChurch Hill city\tTN\tTennessee\tHawkins County\t6600\t41.5\t15.3\t13.2\t21491\t129994\t0.257\t37642\tRomney\t37642\t0.019203916\t37642.0\n20586\t-82.855653\t36.475128999999995\tSurgoinsville town\tTN\tTennessee\tHawkins County\t1680\t41.5\t10.4\t9.5\t19999\t100000\t0.257\t37873\tRomney\t37873\t0.004888269000000001\t37873.0\n20587\t-83.07919\t36.263690000000004\tBulls Gap town\tTN\tTennessee\tHawkins County\t805\t41.8\t8.6\t9.5\t17868\t96944\t0.257\t37711\tRomney\t37711\t0.0023422960000000002\t37711.0\n20588\t-82.661342\t36.561058\tMount Carmel town\tTN\tTennessee\tHawkins County\t4906\t40.9\t22.1\t11.6\t22728\t127987\t0.257\t37645\tRomney\t37645\t0.014274911000000001\t37645.0\n20589\t-83.001088\t36.409734\tRogersville town\tTN\tTennessee\tHawkins County\t4389\t43.1\t11.6\t9.7\t21009\t98155\t0.257\t37857\tRomney\t37857\t0.012770604\t37857.0\n20590\t-89.40136\t35.461425\tStanton town\tTN\tTennessee\tHaywood County\t606\t37.2\t4.1\t24.1\t12763\t71053\t0.6036\t38069\tRomney\t38069\t0.001763269\t38069.0\n20591\t-89.257228\t35.591570000000004\tBrownsville city\tTN\tTennessee\tHaywood County\t10493\t34.9\t17.5\t18.9\t18008\t91914\t0.6036\t38012\tRomney\t38012\t0.030531316\t38012.0\n20592\t-88.291565\t35.442569\tSardis town\tTN\tTennessee\tHenderson County\t438\t39.7\t7.5\t21.6\t17132\t61667\t0.2503\t38371\tRomney\t38371\t0.001274442\t38371.0\n20593\t-88.396568\t35.659403000000005\tLexington city\tTN\tTennessee\tHenderson County\t7801\t39.7\t14.1\t19.3\t20133\t99665\t0.2503\t38351\tRomney\t38351\t0.022698446\t38351.0\n20594\t-88.392258\t35.784966\tParkers Crossroads city\tTN\tTennessee\tHenderson County\t259\t39.7\t11.4\t11.3\t19333\t93000\t0.2503\t38388\tRomney\t38388\t0.000753608\t38388.0\n20595\t-88.238395\t35.518926\tScotts Hill town\tTN\tTennessee\tHenderson County\t911\t41.9\t10.0\t14.8\t18876\t81400\t0.2503\t38374\tRomney\t38374\t0.0026507220000000003\t38374.0\n20596\t-88.305018\t36.297693\tParis city\tTN\tTennessee\tHenry County\t9423\t42.4\t16.5\t15.9\t18199\t87585\t0.3406\t38242\tRomney\t38242\t0.027417953999999998\t38242.0\n20597\t-88.409803\t36.200241999999996\tHenry town\tTN\tTennessee\tHenry County\t553\t39.9\t11.7\t14.1\t18055\t81905\t0.3406\t38231\tRomney\t38231\t0.001609055\t38231.0\n20598\t-88.33277\t36.442296999999996\tPuryear city\tTN\tTennessee\tHenry County\t733\t40.6\t10.3\t15.2\t20294\t74048\t0.3406\t38251\tRomney\t38251\t0.002132799\t38251.0\n20599\t-88.47910300000001\t36.378535\tCottage Grove town\tTN\tTennessee\tHenry County\t95\t42.5\t17.9\t15.4\t18156\t80000\t0.3406\t38224\tRomney\t38224\t0.00027642\t38224.0\n20600\t-87.45841899999999\t35.825496\tCenterville town\tTN\tTennessee\tHickman County\t3776\t44.1\t13.3\t16.4\t17395\t114976\t0.3549\t37033\tRomney\t37033\t0.010986968\t37033.0\n20601\t-87.756508\t36.343649\tTennessee Ridge town\tTN\tTennessee\tHouston County\t1392\t40.4\t10.8\t8.9\t20124\t85278\t0.4625\t37178\tRomney\t37178\t0.00405028\t37178.0\n20602\t-87.702608\t36.315973\tErin city\tTN\tTennessee\tHouston County\t1532\t44.0\t13.8\t12.2\t17236\t73898\t0.4625\t37061\tRomney\t37061\t0.004457636\t37061.0\n20603\t-87.968531\t36.016068\tNew Johnsonville city\tTN\tTennessee\tHumphreys County\t2030\t40.8\t14.8\t12.7\t25503\t95806\t0.4233\t37134\tRomney\t37134\t0.005906659\t37134.0\n20604\t-87.634987\t36.110282\tMcEwen city\tTN\tTennessee\tHumphreys County\t1732\t38.2\t8.6\t12.1\t18980\t96200\t0.4233\t37101\tRomney\t37101\t0.005039573\t37101.0\n20605\t-87.785227\t36.093527\tWaverly city\tTN\tTennessee\tHumphreys County\t3933\t42.7\t14.2\t9.1\t21207\t98151\t0.4233\t37185\tRomney\t37185\t0.011443788\t37185.0\n20606\t-85.65569599999999\t36.361615\tGainesboro town\tTN\tTennessee\tJackson County\t817\t48.7\t11.1\t13.9\t18240\t75588\t0.4156\t38562\tRomney\t38562\t0.002377212\t38562.0\n20607\t-83.552436\t36.097796\tNew Market town\tTN\tTennessee\tJefferson County\t1351\t41.6\t19.0\t8.3\t18997\t111712\t0.24100000000000002\t37820\tRomney\t37820\t0.003930983\t37820.0\n20608\t-83.432796\t36.037646\tDandridge town\tTN\tTennessee\tJefferson County\t2488\t41.1\t17.6\t10.1\t21653\t122879\t0.24100000000000002\t37725\tRomney\t37725\t0.007239294\t37725.0\n20609\t-83.484751\t36.117253999999996\tJefferson City\tTN\tTennessee\tJefferson County\t8251\t32.1\t26.4\t15.9\t19690\t116990\t0.24100000000000002\t37760\tRomney\t37760\t0.024007804\t37760.0\n20610\t-83.278494\t36.047139\tBaneberry city\tTN\tTennessee\tJefferson County\t454\t41.5\t10.5\t9.0\t22830\t129861\t0.24100000000000002\t37890\tRomney\t37890\t0.0013209970000000002\t37890.0\n20611\t-83.281281\t36.132643\tWhite Pine town\tTN\tTennessee\tJefferson County\t2328\t41.0\t7.5\t14.0\t18569\t96667\t0.24100000000000002\t37890\tRomney\t37890\t0.006773745\t37890.0\n20612\t-81.804888\t36.469419\tMountain City town\tTN\tTennessee\tJohnson County\t2461\t45.2\t11.3\t15.9\t17451\t96583\t0.2394\t37683\tRomney\t37683\t0.007160733000000001\t37683.0\n20613\t-83.948254\t35.969291\tKnoxville city\tTN\tTennessee\tKnox County\t184915\t35.5\t28.9\t11.7\t23317\t109772\t0.3443\t37916\tRomney\t37916\t0.5380442529999999\t37916.0\n20614\t-83.764922\t36.067084\tMascot CDP\tTN\tTennessee\tKnox County\t2456\t41.6\t12.8\t7.9\t19148\t74067\t0.3443\t37806\tRomney\t37806\t0.007146184\t37806.0\n20615\t-84.18216\t35.873135999999995\tFarragut town\tTN\tTennessee\tKnox County\t21371\t45.3\t57.3\t7.2\t43639\t265084\t0.3443\t37932\tRomney\t37932\t0.062182861\t37932.0\n20616\t-89.483742\t36.264463\tRidgely town\tTN\tTennessee\tLake County\t1527\t43.0\t7.8\t13.8\t15287\t68725\t0.4236\t38080\tRomney\t38080\t0.0044430879999999996\t38080.0\n20617\t-89.471292\t36.37596\tTiptonville town\tTN\tTennessee\tLake County\t2117\t41.7\t10.8\t15.3\t14859\t70368\t0.4236\t38079\tRomney\t38079\t0.0061598009999999995\t38079.0\n20618\t-89.405034\t35.880519\tHalls town\tTN\tTennessee\tLauderdale County\t2215\t39.7\t10.2\t23.9\t17096\t69063\t0.4616\t38040\tRomney\t38040\t0.00644495\t38040.0\n20619\t-89.407701\t35.840993\tGates town\tTN\tTennessee\tLauderdale County\t985\t40.5\t7.1\t28.3\t15518\t74211\t0.4616\t38037\tRomney\t38037\t0.0028660390000000003\t38037.0\n20620\t-89.536\t35.744755\tRipley city\tTN\tTennessee\tLauderdale County\t7668\t34.7\t14.5\t19.4\t18189\t89617\t0.4616\t38063\tRomney\t38063\t0.022311458\t38063.0\n20621\t-89.583011\t35.675713\tHenning town\tTN\tTennessee\tLauderdale County\t1154\t35.0\t4.8\t25.9\t16100\t72059\t0.4616\t38041\tRomney\t38041\t0.003357776\t38041.0\n20622\t-87.44084699999999\t35.080525\tLoretto city\tTN\tTennessee\tLawrence County\t1621\t40.2\t12.3\t11.0\t18084\t89868\t0.2784\t38469\tRomney\t38469\t0.004716598\t38469.0\n20623\t-87.579429\t35.036485\tIron City\tTN\tTennessee\tLawrence County\t400\t39.9\t6.1\t15.5\t16118\t65385\t0.2784\t38463\tRomney\t38463\t0.0011638739999999999\t38463.0\n20624\t-87.301213\t35.321687\tEthridge town\tTN\tTennessee\tLawrence County\t578\t34.2\t11.1\t12.3\t17546\t95357\t0.2784\t38456\tRomney\t38456\t0.001681797\t38456.0\n20625\t-87.33192700000001\t35.24962\tLawrenceburg city\tTN\tTennessee\tLawrence County\t10560\t41.3\t12.9\t17.1\t19616\t98385\t0.2784\t38464\tRomney\t38464\t0.030726265\t38464.0\n20626\t-87.501312\t35.032711\tSt. Joseph city\tTN\tTennessee\tLawrence County\t901\t39.7\t6.4\t15.9\t16364\t66034\t0.2784\t38481\tRomney\t38481\t0.002621625\t38481.0\n20627\t-87.558578\t35.550659\tHohenwald city\tTN\tTennessee\tLewis County\t3721\t39.1\t8.8\t18.5\t16479\t78514\t0.3083\t38462\tRomney\t38462\t0.010826935\t38462.0\n20628\t-86.636818\t35.321293\tPetersburg town\tTN\tTennessee\tLincoln County\t656\t43.0\t12.7\t9.6\t21163\t103409\t0.248\t37144\tRomney\t37144\t0.0019087529999999998\t37144.0\n20629\t-86.562513\t35.149204\tFayetteville city\tTN\tTennessee\tLincoln County\t6781\t43.9\t14.8\t16.9\t20600\t85211\t0.248\t37334\tRomney\t37334\t0.019730569\t37334.0\n20630\t-84.399772\t35.678915\tPhiladelphia city\tTN\tTennessee\tLoudon County\t571\t38.0\t18.5\t15.6\t17286\t106786\t0.2291\t37846\tRomney\t37846\t0.00166143\t37846.0\n20631\t-84.170015\t35.651198\tGreenback city\tTN\tTennessee\tLoudon County\t1153\t43.0\t14.1\t7.1\t23534\t130297\t0.2291\t37742\tRomney\t37742\t0.0033548659999999998\t37742.0\n20632\t-84.275258\t35.800468\tLenoir City\tTN\tTennessee\tLoudon County\t7721\t36.6\t7.9\t9.1\t22190\t90355\t0.2291\t37771\tRomney\t37771\t0.022465672000000003\t37771.0\n20633\t-84.365261\t35.735377\tLoudon town\tTN\tTennessee\tLoudon County\t4866\t43.0\t12.1\t9.1\t20637\t104299\t0.2291\t37774\tRomney\t37774\t0.014158523000000001\t37774.0\n20634\t-84.528053\t35.336940000000006\tEtowah city\tTN\tTennessee\tMcMinn County\t3817\t44.2\t10.3\t13.8\t19298\t83889\t0.2584\t37331\tRomney\t37331\t0.011106265\t37331.0\n20635\t-84.604155\t35.452228000000005\tAthens city\tTN\tTennessee\tMcMinn County\t13691\t39.6\t19.1\t16.7\t21601\t98700\t0.2584\t37303\tRomney\t37303\t0.039836486000000004\t37303.0\n20636\t-84.74547\t35.297345\tCalhoun town\tTN\tTennessee\tMcMinn County\t567\t42.2\t10.0\t14.6\t21101\t88333\t0.2584\t37309\tRomney\t37309\t0.001649791\t37309.0\n20637\t-84.489315\t35.421925\tEnglewood town\tTN\tTennessee\tMcMinn County\t1820\t37.8\t9.4\t15.9\t16841\t78769\t0.2584\t37329\tRomney\t37329\t0.005295625\t37329.0\n20638\t-84.549072\t35.515959\tNiota city\tTN\tTennessee\tMcMinn County\t890\t40.8\t17.5\t14.6\t20823\t114464\t0.2584\t37826\tRomney\t37826\t0.002589619\t37826.0\n20639\t-88.595833\t35.170878\tSelmer town\tTN\tTennessee\tMcNairy County\t4540\t42.7\t16.5\t14.6\t19663\t82890\t0.2698\t38375\tRomney\t38375\t0.013209966\t38375.0\n20640\t-88.364455\t35.255067\tAdamsville town\tTN\tTennessee\tMcNairy County\t2096\t47.2\t13.2\t9.8\t20264\t98378\t0.2698\t38310\tRomney\t38310\t0.0060986980000000005\t38310.0\n20641\t-88.358805\t35.383152\tMilledgeville town\tTN\tTennessee\tMcNairy County\t301\t42.0\t9.4\t11.5\t17586\t71667\t0.2698\t38359\tRomney\t38359\t0.000875815\t38359.0\n20642\t-88.617174\t35.35687\tFinger city\tTN\tTennessee\tMcNairy County\t389\t36.4\t12.0\t9.8\t15966\t76429\t0.2698\t38334\tRomney\t38334\t0.001131867\t38334.0\n20643\t-88.42994300000001\t35.156948\tStantonville town\tTN\tTennessee\tMcNairy County\t327\t42.3\t8.1\t12.7\t19727\t76429\t0.2698\t38379\tRomney\t38379\t0.000951467\t38379.0\n20644\t-88.615205\t35.071661\tRamer city\tTN\tTennessee\tMcNairy County\t374\t37.5\t6.0\t10.3\t19348\t80500\t0.2698\t38367\tRomney\t38367\t0.001088222\t38367.0\n20645\t-88.541466\t35.019232\tGuys town\tTN\tTennessee\tMcNairy County\t518\t38.7\t6.3\t12.4\t19118\t80357\t0.2698\t38339\tRomney\t38339\t0.001507216\t38339.0\n20646\t-88.551535\t35.087733\tEastview town\tTN\tTennessee\tMcNairy County\t681\t39.2\t13.4\t11.0\t17602\t90714\t0.2698\t38339\tRomney\t38339\t0.001981495\t38339.0\n20647\t-88.425435\t35.060475\tMichie town\tTN\tTennessee\tMcNairy County\t719\t41.2\t6.6\t10.7\t17579\t74250\t0.2698\t38357\tRomney\t38357\t0.002092063\t38357.0\n20648\t-88.61184399999999\t35.234976\tBethel Springs town\tTN\tTennessee\tMcNairy County\t822\t37.7\t6.8\t11.9\t19271\t68636\t0.2698\t38315\tRomney\t38315\t0.00239176\t38315.0\n20649\t-86.02934499999999\t36.523798\tLafayette city\tTN\tTennessee\tMacon County\t4337\t41.8\t9.2\t12.7\t18489\t88082\t0.2248\t37083\tRomney\t37083\t0.0126193\t37083.0\n20650\t-85.850409\t36.530153999999996\tRed Boiling Springs city\tTN\tTennessee\tMacon County\t993\t43.7\t7.2\t14.2\t15865\t66786\t0.2248\t37150\tRomney\t37150\t0.002889316\t37150.0\n20651\t-88.830049\t35.644514\tJackson city\tTN\tTennessee\tMadison County\t63326\t34.4\t26.7\t15.0\t23781\t101116\t0.4513\t38301\tRomney\t38301\t0.18425866100000002\t38301.0\n20652\t-88.856662\t35.773679\tThree Way city\tTN\tTennessee\tMadison County\t1661\t40.7\t41.2\t8.0\t28717\t126136\t0.4513\t38343\tRomney\t38343\t0.004832985\t38343.0\n20653\t-88.86461700000001\t35.455925\tMedon city\tTN\tTennessee\tMadison County\t199\t39.5\t21.3\t12.1\t20319\t92500\t0.4513\t38356\tRomney\t38356\t0.000579027\t38356.0\n20654\t-85.659665\t35.004459999999995\tNew Hope city\tTN\tTennessee\tMarion County\t1131\t39.3\t8.7\t11.3\t18674\t104398\t0.3798\t37347\tRomney\t37347\t0.003290853\t37347.0\n20655\t-85.804289\t35.014367\tOrme town\tTN\tTennessee\tMarion County\t130\t41.9\t14.3\t8.3\t20508\t96667\t0.3798\t37380\tRomney\t37380\t0.00037825900000000004\t37380.0\n20656\t-85.62424399999999\t35.066407\tJasper town\tTN\tTennessee\tMarion County\t3479\t42.5\t14.8\t8.3\t21940\t113171\t0.3798\t37347\tRomney\t37347\t0.010122790999999999\t37347.0\n20657\t-85.834005\t35.244797\tMonteagle town\tTN\tTennessee\tMarion County\t1227\t46.7\t22.4\t11.3\t18334\t97424\t0.3798\t37356\tRomney\t37356\t0.0035701829999999998\t37356.0\n20658\t-85.673776\t35.045638000000004\tKimball town\tTN\tTennessee\tMarion County\t1389\t43.3\t9.6\t9.1\t20481\t93043\t0.3798\t37380\tRomney\t37380\t0.004041551\t37380.0\n20659\t-85.520501\t35.192932\tWhitwell city\tTN\tTennessee\tMarion County\t1856\t41.6\t8.5\t13.5\t17474\t94366\t0.3798\t37397\tRomney\t37397\t0.005400374\t37397.0\n20660\t-85.71216700000001\t35.015963\tSouth Pittsburg city\tTN\tTennessee\tMarion County\t3213\t43.3\t12.6\t13.7\t16248\t95064\t0.3798\t37380\tRomney\t37380\t0.009348815\t37380.0\n20661\t-85.48536800000001\t35.18163\tPowells Crossroads town\tTN\tTennessee\tMarion County\t1369\t38.3\t10.6\t10.5\t17963\t101675\t0.3798\t37397\tRomney\t37397\t0.003983358\t37397.0\n20662\t-86.84325600000001\t35.355140999999996\tCornersville town\tTN\tTennessee\tMarshall County\t1100\t38.9\t15.9\t12.7\t20772\t106579\t0.3468\t37047\tRomney\t37047\t0.003200653\t37047.0\n20663\t-86.786898\t35.447618\tLewisburg city\tTN\tTennessee\tMarshall County\t11174\t38.1\t11.1\t25.8\t20996\t99668\t0.3468\t37091\tRomney\t37091\t0.032512811\t37091.0\n20664\t-86.694407\t35.628003\tChapel Hill town\tTN\tTennessee\tMarshall County\t1002\t41.2\t12.2\t13.3\t22075\t113594\t0.3468\t37034\tRomney\t37034\t0.002915504\t37034.0\n20665\t-87.203026\t35.550256\tMount Pleasant city\tTN\tTennessee\tMaury County\t4982\t39.7\t10.7\t16.3\t20272\t100718\t0.3583\t38474\tRomney\t38474\t0.014496047\t38474.0\n20666\t-86.904093\t35.770639\tSpring Hill city\tTN\tTennessee\tMaury County\t25808\t32.5\t33.5\t7.4\t29391\t194991\t0.3583\t37179\tRomney\t37179\t0.07509313\t37179.0\n20667\t-87.049355\t35.619366\tColumbia city\tTN\tTennessee\tMaury County\t37500\t37.3\t17.1\t19.4\t23642\t119526\t0.3583\t38401\tRomney\t38401\t0.10911315699999999\t38401.0\n20668\t-84.791847\t35.52463\tDecatur town\tTN\tTennessee\tMeigs County\t1440\t38.9\t12.5\t9.2\t17286\t91154\t0.2934\t37322\tRomney\t37322\t0.004189945\t37322.0\n20669\t-84.361657\t35.522240000000004\tMadisonville town\tTN\tTennessee\tMonroe County\t4628\t38.3\t17.4\t17.4\t19015\t102229\t0.2676\t37354\tRomney\t37354\t0.013466018\t37354.0\n20670\t-84.184531\t35.604917\tVonore town\tTN\tTennessee\tMonroe County\t1630\t38.7\t14.1\t15.3\t19113\t118605\t0.2676\t37885\tRomney\t37885\t0.004742785\t37885.0\n20671\t-84.298891\t35.36667\tTellico Plains town\tTN\tTennessee\tMonroe County\t1063\t40.8\t8.1\t15.3\t17503\t74500\t0.2676\t37385\tRomney\t37385\t0.0030929940000000004\t37385.0\n20672\t-84.467219\t35.604668\tSweetwater city\tTN\tTennessee\tMonroe County\t6162\t41.6\t12.7\t17.5\t19151\t90273\t0.2676\t37874\tRomney\t37874\t0.017929474\t37874.0\n20673\t-87.345155\t36.569584000000006\tClarksville city\tTN\tTennessee\tMontgomery County\t126822\t30.6\t22.0\t12.1\t22647\t133338\t0.4408\t37040\tRomney\t37040\t0.369011969\t37040.0\n20674\t-86.358811\t35.284673\tLynchburg, Moore County\tTN\tTennessee\tMoore County\t6345\t42.8\t13.8\t12.6\t21804\t114334\t0.2519\t37352\tRomney\t37352\t0.018461946\t37352.0\n20675\t-84.556904\t35.989824\tOakdale town\tTN\tTennessee\tMorgan County\t235\t38.8\t11.3\t10.3\t16656\t73333\t0.2652\t37829\tRomney\t37829\t0.0006837760000000001\t37829.0\n20676\t-84.68072099999999\t36.243253\tSunbright city\tTN\tTennessee\tMorgan County\t593\t38.6\t6.5\t15.9\t13929\t65526\t0.2652\t37872\tRomney\t37872\t0.001725443\t37872.0\n20677\t-84.586862\t36.104448\tWartburg city\tTN\tTennessee\tMorgan County\t952\t36.0\t10.0\t15.5\t16973\t80536\t0.2652\t37887\tRomney\t37887\t0.0027700190000000003\t37887.0\n20678\t-89.194673\t36.262562\tObion town\tTN\tTennessee\tObion County\t1051\t39.1\t7.0\t10.3\t19195\t69744\t0.2701\t38240\tRomney\t38240\t0.003058078\t38240.0\n20679\t-89.04605699999999\t36.423666\tUnion City\tTN\tTennessee\tObion County\t10635\t39.6\t14.3\t11.4\t23894\t91656\t0.2701\t38261\tRomney\t38261\t0.030944491\t38261.0\n20680\t-89.111419\t36.479295\tWoodland Mills city\tTN\tTennessee\tObion County\t292\t42.8\t15.2\t12.4\t26993\t101250\t0.2701\t38261\tRomney\t38261\t0.0008496280000000001\t38261.0\n20681\t-88.884304\t36.494403000000005\tSouth Fulton city\tTN\tTennessee\tObion County\t2247\t43.2\t10.8\t12.2\t18776\t74936\t0.2701\t38257\tRomney\t38257\t0.00653806\t38257.0\n20682\t-89.352367\t36.381962\tSamburg town\tTN\tTennessee\tObion County\t266\t42.5\t8.4\t15.8\t18053\t71364\t0.2701\t38232\tRomney\t38232\t0.000773976\t38232.0\n20683\t-89.04950600000001\t36.356407\tRives town\tTN\tTennessee\tObion County\t306\t38.4\t8.4\t9.9\t17536\t73000\t0.2701\t38253\tRomney\t38253\t0.000890363\t38253.0\n20684\t-89.293914\t36.334561\tHornbeak town\tTN\tTennessee\tObion County\t456\t41.4\t1.9\t15.9\t17989\t67500\t0.2701\t38232\tRomney\t38232\t0.001326816\t38232.0\n20685\t-89.157323\t36.342325\tTroy town\tTN\tTennessee\tObion County\t1330\t39.9\t9.2\t8.7\t19591\t82051\t0.2701\t38260\tRomney\t38260\t0.00386988\t38260.0\n20686\t-85.327517\t36.389421\tLivingston town\tTN\tTennessee\tOverton County\t3353\t44.9\t15.9\t11.5\t16759\t96091\t0.366\t38570\tRomney\t38570\t0.009756171\t38570.0\n20687\t-87.809287\t35.749858\tLobelville city\tTN\tTennessee\tPerry County\t962\t42.2\t6.9\t20.5\t17394\t67000\t0.3785\t37097\tRomney\t37097\t0.002799116\t37097.0\n20688\t-87.843562\t35.611393\tLinden town\tTN\tTennessee\tPerry County\t886\t44.2\t11.1\t15.6\t20431\t73913\t0.3785\t37096\tRomney\t37096\t0.00257798\t37096.0\n20689\t-85.13408100000001\t36.573547\tByrdstown town\tTN\tTennessee\tPickett County\t700\t46.2\t10.4\t18.9\t16508\t72292\t0.2903\t38549\tRomney\t38549\t0.002036779\t38549.0\n20690\t-84.38613199999999\t34.993838000000004\tCopperhill city\tTN\tTennessee\tPolk County\t504\t45.1\t9.3\t6.7\t18045\t80417\t0.3063\t37317\tRomney\t37317\t0.0014664810000000002\t37317.0\n20691\t-84.388306\t35.037192\tDucktown city\tTN\tTennessee\tPolk County\t423\t56.0\t5.3\t16.5\t16357\t77000\t0.3063\t37326\tRomney\t37326\t0.0012307960000000001\t37326.0\n20692\t-84.652424\t35.175289\tBenton town\tTN\tTennessee\tPolk County\t1130\t37.4\t6.1\t15.2\t17107\t75833\t0.3063\t37307\tRomney\t37307\t0.0032879429999999998\t37307.0\n20693\t-85.264742\t36.144958\tMonterey town\tTN\tTennessee\tPutnam County\t3055\t40.2\t10.2\t10.2\t15378\t94324\t0.306\t38574\tRomney\t38574\t0.008889085\t38574.0\n20694\t-85.63681700000001\t36.153715000000005\tBaxter town\tTN\tTennessee\tPutnam County\t1387\t41.3\t11.0\t13.6\t14793\t93095\t0.306\t38544\tRomney\t38544\t0.004035732\t38544.0\n20695\t-85.505027\t36.155053\tCookeville city\tTN\tTennessee\tPutnam County\t27127\t31.4\t32.0\t10.1\t21382\t136734\t0.306\t38501\tRomney\t38501\t0.078931003\t38501.0\n20696\t-85.4464\t36.200764\tAlgood town\tTN\tTennessee\tPutnam County\t3433\t40.9\t23.1\t9.1\t20041\t112181\t0.306\t38506\tRomney\t38506\t0.009988946\t38506.0\n20697\t-85.011087\t35.493957\tDayton city\tTN\tTennessee\tRhea County\t6898\t36.7\t13.2\t14.7\t18659\t95000\t0.2482\t37321\tRomney\t37321\t0.020071002\t37321.0\n20698\t-85.08179100000001\t35.448309\tGraysville town\tTN\tTennessee\tRhea County\t1335\t37.7\t2.2\t18.4\t17424\t67073\t0.2482\t37373\tRomney\t37373\t0.003884428\t37373.0\n20699\t-84.863284\t35.686651\tSpring City town\tTN\tTennessee\tRhea County\t2202\t46.0\t12.6\t14.6\t20738\t96957\t0.2482\t37381\tRomney\t37381\t0.006407125\t37381.0\n20700\t-84.571991\t35.882334\tMidtown city\tTN\tTennessee\tRoane County\t1321\t40.6\t8.0\t8.0\t18700\t80714\t0.2853\t37748\tRomney\t37748\t0.003843693\t37748.0\n20701\t-84.666911\t35.874121\tRockwood city\tTN\tTennessee\tRoane County\t5944\t44.3\t10.2\t13.2\t17099\t72820\t0.2853\t37854\tRomney\t37854\t0.017295163\t37854.0\n20702\t-84.554913\t35.952333\tHarriman city\tTN\tTennessee\tRoane County\t6538\t42.5\t11.2\t11.1\t17815\t74161\t0.2853\t37748\tRomney\t37748\t0.019023515\t37748.0\n20703\t-84.515792\t35.871396000000004\tKingston city\tTN\tTennessee\tRoane County\t5419\t43.8\t18.7\t10.3\t23134\t104764\t0.2853\t37763\tRomney\t37763\t0.015767579\t37763.0\n20704\t-87.064332\t36.582563\tAdams city\tTN\tTennessee\tRobertson County\t735\t37.5\t9.1\t7.4\t18632\t116964\t0.3153\t37010\tRomney\t37010\t0.0021386179999999997\t37010.0\n20705\t-86.798767\t36.423451\tGreenbrier town\tTN\tTennessee\tRobertson County\t5883\t38.0\t14.0\t7.7\t23491\t147286\t0.3153\t37073\tRomney\t37073\t0.017117672\t37073.0\n20706\t-86.771437\t36.401156\tRidgetop city\tTN\tTennessee\tRobertson County\t1282\t37.0\t18.9\t8.0\t22829\t148214\t0.3153\t37152\tRomney\t37152\t0.003730215\t37152.0\n20707\t-86.645771\t36.469646000000004\tWhite House city\tTN\tTennessee\tRobertson County\t10197\t33.7\t15.8\t8.0\t25520\t156545\t0.3153\t37188\tRomney\t37188\t0.02967005\t37188.0\n20708\t-86.965939\t36.414075\tCoopertown town\tTN\tTennessee\tRobertson County\t4053\t40.4\t16.6\t8.6\t26699\t173393\t0.3153\t37146\tRomney\t37146\t0.01179295\t37146.0\n20709\t-86.872173\t36.493835\tSpringfield city\tTN\tTennessee\tRobertson County\t17674\t37.1\t13.5\t12.6\t21607\t122370\t0.3153\t37172\tRomney\t37172\t0.051425757999999995\t37172.0\n20710\t-86.675045\t36.540774\tCross Plains city\tTN\tTennessee\tRobertson County\t1491\t39.4\t15.6\t7.5\t23529\t157566\t0.3153\t37049\tRomney\t37049\t0.004338339\t37049.0\n20711\t-87.000799\t36.551181\tCedar Hill city\tTN\tTennessee\tRobertson County\t350\t39.6\t16.6\t6.9\t18345\t126563\t0.3153\t37032\tRomney\t37032\t0.001018389\t37032.0\n20712\t-86.70040999999999\t36.593501\tOrlinda town\tTN\tTennessee\tRobertson County\t685\t39.9\t12.2\t9.0\t22130\t122984\t0.3153\t37141\tRomney\t37141\t0.001993134\t37141.0\n20713\t-86.39833\t35.854559\tMurfreesboro city\tTN\tTennessee\tRutherford County\t96743\t31.3\t32.3\t12.5\t26590\t180747\t0.3684\t37130\tRomney\t37130\t0.281491578\t37130.0\n20714\t-86.655386\t35.741105\tEagleville city\tTN\tTennessee\tRutherford County\t574\t42.4\t16.7\t12.1\t25585\t166250\t0.3684\t37060\tRomney\t37060\t0.0016701589999999998\t37060.0\n20715\t-86.520567\t35.978493\tSmyrna town\tTN\tTennessee\tRutherford County\t35217\t32.2\t22.0\t10.2\t26461\t168407\t0.3684\t37167\tRomney\t37167\t0.102470348\t37167.0\n20716\t-86.557025\t36.021613\tLa Vergne city\tTN\tTennessee\tRutherford County\t31635\t32.1\t20.5\t10.2\t26287\t152379\t0.3684\t37086\tRomney\t37086\t0.09204786\t37086.0\n20717\t-86.375187\t35.965423\tWalterhill CDP\tTN\tTennessee\tRutherford County\t2530\t38.0\t19.7\t10.9\t25753\t170874\t0.3684\t37085\tRomney\t37085\t0.0073615009999999995\t37085.0\n20718\t-84.504692\t36.41115\tHuntsville town\tTN\tTennessee\tScott County\t1029\t40.8\t13.5\t21.1\t15250\t78125\t0.2178\t37755\tRomney\t37755\t0.002994065\t37755.0\n20719\t-84.446377\t36.564285999999996\tWinfield town\tTN\tTennessee\tScott County\t1000\t36.7\t8.1\t24.0\t15214\t70600\t0.2178\t37892\tRomney\t37892\t0.002909684\t37892.0\n20720\t-84.50479399999999\t36.521796\tOneida town\tTN\tTennessee\tScott County\t3995\t39.3\t11.7\t20.8\t16256\t78728\t0.2178\t37841\tRomney\t37841\t0.011624188\t37841.0\n20721\t-84.5416\t36.414384999999996\tHelenwood town\tTN\tTennessee\tScott County\t926\t38.6\t7.9\t20.2\t15752\t79412\t0.2178\t37755\tRomney\t37755\t0.002694368\t37755.0\n20722\t-85.385121\t35.373158000000004\tDunlap city\tTN\tTennessee\tSequatchie County\t4470\t37.6\t12.3\t16.9\t18585\t103125\t0.2896\t37327\tRomney\t37327\t0.013006288000000001\t37327.0\n20723\t-83.56179499999999\t35.800202\tPigeon Forge city\tTN\tTennessee\tSevier County\t5660\t39.6\t12.9\t9.3\t18267\t132130\t0.2191\t37863\tRomney\t37863\t0.016468813\t37863.0\n20724\t-83.38817399999999\t35.759493\tPittman Center town\tTN\tTennessee\tSevier County\t544\t45.2\t14.9\t12.3\t22455\t140385\t0.2191\t37738\tRomney\t37738\t0.0015828679999999999\t37738.0\n20725\t-83.76390699999999\t35.880278000000004\tSeymour CDP\tTN\tTennessee\tSevier County\t10985\t41.7\t21.7\t7.8\t22569\t134877\t0.2191\t37865\tRomney\t37865\t0.031962881\t37865.0\n20726\t-83.572449\t35.891963\tSevierville city\tTN\tTennessee\tSevier County\t13143\t39.9\t16.5\t7.3\t21288\t136003\t0.2191\t37862\tRomney\t37862\t0.038241979\t37862.0\n20727\t-83.4936\t35.72469\tGatlinburg city\tTN\tTennessee\tSevier County\t3948\t51.6\t21.7\t11.0\t25898\t193071\t0.2191\t37738\tRomney\t37738\t0.011487433\t37738.0\n20728\t-89.995532\t35.103493\tMemphis city\tTN\tTennessee\tShelby County\t629293\t33.5\t22.7\t15.4\t21872\t83226\t0.6263\t38114\tRomney\t38114\t1.8310438969999998\t38114.0\n20729\t-89.890854\t35.336133000000004\tMillington city\tTN\tTennessee\tShelby County\t10198\t32.7\t14.2\t10.8\t21445\t93059\t0.6263\t38053\tRomney\t38053\t0.029672959\t38053.0\n20730\t-89.69165100000001\t35.055848\tCollierville town\tTN\tTennessee\tShelby County\t38036\t37.3\t43.3\t7.5\t39650\t225142\t0.6263\t38017\tRomney\t38017\t0.110672748\t38017.0\n20731\t-89.83473599999999\t35.224599\tBartlett city\tTN\tTennessee\tShelby County\t45485\t39.1\t29.6\t7.4\t30771\t136331\t0.6263\t38135\tRomney\t38135\t0.132346986\t38135.0\n20732\t-89.786875\t35.087869\tGermantown city\tTN\tTennessee\tShelby County\t38439\t45.5\t59.8\t6.6\t51230\t240103\t0.6263\t38138\tRomney\t38138\t0.111845351\t38138.0\n20733\t-89.727761\t35.245166999999995\tLakeland city\tTN\tTennessee\tShelby County\t9249\t39.1\t33.2\t7.9\t34121\t157376\t0.6263\t38002\tRomney\t38002\t0.026911669\t38002.0\n20734\t-89.66866999999999\t35.264223\tArlington town\tTN\tTennessee\tShelby County\t6537\t34.1\t20.7\t6.0\t27650\t98544\t0.6263\t38002\tRomney\t38002\t0.019020606000000002\t38002.0\n20735\t-85.943139\t36.256446000000004\tCarthage town\tTN\tTennessee\tSmith County\t2218\t43.3\t14.7\t13.5\t20849\t116758\t0.3485\t37030\tRomney\t37030\t0.00645368\t37030.0\n20736\t-85.93214300000001\t36.181816\tGordonsville town\tTN\tTennessee\tSmith County\t1125\t40.1\t10.5\t18.1\t20994\t116840\t0.3485\t38567\tRomney\t38567\t0.003273395\t38567.0\n20737\t-85.957571\t36.24123\tSouth Carthage town\tTN\tTennessee\tSmith County\t1380\t39.2\t6.8\t15.7\t17751\t111875\t0.3485\t37030\tRomney\t37030\t0.004015364\t37030.0\n20738\t-87.843739\t36.481871999999996\tDover city\tTN\tTennessee\tStewart County\t1576\t48.3\t16.8\t10.7\t20121\t100992\t0.4045\t37058\tRomney\t37058\t0.004585662\t37058.0\n20739\t-87.639553\t36.382858\tCumberland City town\tTN\tTennessee\tStewart County\t351\t42.3\t11.7\t23.5\t18431\t100000\t0.4045\t37050\tRomney\t37050\t0.001021299\t37050.0\n20740\t-82.27724599999999\t36.461339\tBluff City\tTN\tTennessee\tSullivan County\t1754\t39.6\t17.6\t13.0\t18591\t85116\t0.2558\t37618\tRomney\t37618\t0.005103585999999999\t37618.0\n20741\t-82.510207\t36.579336\tBloomingdale CDP\tTN\tTennessee\tSullivan County\t10443\t44.6\t13.6\t11.9\t22105\t98857\t0.2558\t37660\tRomney\t37660\t0.030385832\t37660.0\n20742\t-82.519269\t36.474810999999995\tColonial Heights CDP\tTN\tTennessee\tSullivan County\t7173\t45.5\t34.9\t7.0\t30185\t153985\t0.2558\t37663\tRomney\t37663\t0.020871165\t37663.0\n20743\t-82.327668\t36.533088\tBlountville CDP\tTN\tTennessee\tSullivan County\t3045\t41.9\t13.1\t7.3\t22116\t111590\t0.2558\t37617\tRomney\t37617\t0.008859988000000001\t37617.0\n20744\t-82.540104\t36.531698\tKingsport city\tTN\tTennessee\tSullivan County\t45378\t44.8\t24.0\t12.3\t23881\t114056\t0.2558\t37660\tRomney\t37660\t0.132035649\t37660.0\n20745\t-82.262877\t36.56888\tWalnut Hill CDP\tTN\tTennessee\tSullivan County\t3044\t47.6\t16.9\t6.5\t26349\t121067\t0.2558\t37620\tRomney\t37620\t0.008857079\t37620.0\n20746\t-82.20961199999999\t36.560722\tBristol city\tTN\tTennessee\tSullivan County\t24461\t43.8\t20.2\t10.0\t22493\t97517\t0.2558\t37620\tRomney\t37620\t0.071173785\t37620.0\n20747\t-82.461502\t36.45107\tSpurgeon CDP\tTN\tTennessee\tSullivan County\t3901\t40.0\t23.6\t13.3\t22983\t135337\t0.2558\t37663\tRomney\t37663\t0.011350678000000001\t37663.0\n20748\t-86.24437900000001\t36.560072\tWestmoreland town\tTN\tTennessee\tSumner County\t2282\t38.8\t8.4\t10.4\t18608\t84576\t0.2842\t37186\tRomney\t37186\t0.006639899\t37186.0\n20749\t-86.603089\t36.300492\tHendersonville city\tTN\tTennessee\tSumner County\t49104\t39.2\t29.3\t9.2\t31991\t184282\t0.2842\t37075\tRomney\t37075\t0.14287713300000002\t37075.0\n20750\t-86.614468\t36.482657\tWalnut Grove town\tTN\tTennessee\tSumner County\t773\t39.7\t16.5\t11.2\t26070\t189015\t0.2842\t37048\tRomney\t37048\t0.0022491860000000002\t37048.0\n20751\t-86.539982\t36.633393\tMitchellville city\tTN\tTennessee\tSumner County\t212\t38.9\t9.1\t8.6\t21389\t115833\t0.2842\t37148\tRomney\t37148\t0.000616853\t37148.0\n20752\t-86.706434\t36.418125\tMillersville city\tTN\tTennessee\tSumner County\t6117\t36.4\t17.5\t9.6\t24501\t153791\t0.2842\t37188\tRomney\t37188\t0.017798538\t37188.0\n20753\t-86.453242\t36.379796999999996\tGallatin city\tTN\tTennessee\tSumner County\t28677\t38.1\t18.2\t11.7\t23465\t136639\t0.2842\t37066\tRomney\t37066\t0.08344101400000001\t37066.0\n20754\t-86.51644399999999\t36.585328000000004\tPortland city\tTN\tTennessee\tSumner County\t10467\t35.1\t10.2\t9.1\t21237\t108571\t0.2842\t37148\tRomney\t37148\t0.030455664\t37148.0\n20755\t-89.73391\t35.481715\tBrighton town\tTN\tTennessee\tTipton County\t2597\t35.5\t11.1\t11.2\t19957\t114801\t0.2962\t38011\tRomney\t38011\t0.00755645\t38011.0\n20756\t-89.64915400000001\t35.566659\tCovington city\tTN\tTennessee\tTipton County\t9154\t35.3\t13.7\t16.6\t18895\t95973\t0.2962\t38019\tRomney\t38019\t0.026635249\t38019.0\n20757\t-89.831225\t35.533209\tGilt Edge city\tTN\tTennessee\tTipton County\t506\t38.3\t6.4\t11.7\t20418\t93000\t0.2962\t38015\tRomney\t38015\t0.0014723\t38015.0\n20758\t-89.809539\t35.446374\tMunford town\tTN\tTennessee\tTipton County\t6125\t37.5\t11.4\t10.7\t22493\t120029\t0.2962\t38058\tRomney\t38058\t0.017821816\t38058.0\n20759\t-89.784518\t35.557041999999996\tBurlison town\tTN\tTennessee\tTipton County\t468\t39.5\t9.7\t12.0\t21524\t103929\t0.2962\t38015\tRomney\t38015\t0.001361732\t38015.0\n20760\t-89.755453\t35.583271\tGarland town\tTN\tTennessee\tTipton County\t316\t38.5\t8.5\t16.0\t20476\t100000\t0.2962\t38015\tRomney\t38015\t0.00091946\t38015.0\n20761\t-89.553761\t35.411328999999995\tMason town\tTN\tTennessee\tTipton County\t1134\t33.3\t7.6\t15.3\t17610\t91842\t0.2962\t38049\tRomney\t38049\t0.003299582\t38049.0\n20762\t-89.781779\t35.431013\tAtoka town\tTN\tTennessee\tTipton County\t4873\t32.6\t20.4\t10.1\t26587\t139205\t0.2962\t38004\tRomney\t38004\t0.014178891\t38004.0\n20763\t-86.15841400000001\t36.390278\tHartsville town\tTN\tTennessee\tTrousdale County\t2631\t42.0\t12.6\t16.5\t18128\t92734\t0.4269\t37074\tRomney\t37074\t0.007655379\t37074.0\n20764\t-82.328889\t36.221365000000006\tUnicoi town\tTN\tTennessee\tUnicoi County\t3380\t41.3\t17.8\t8.3\t19846\t129117\t0.27\t37692\tRomney\t37692\t0.009834733\t37692.0\n20765\t-82.402789\t36.126736\tBanner Hill CDP\tTN\tTennessee\tUnicoi County\t1089\t44.8\t5.2\t5.5\t18345\t77361\t0.27\t37650\tRomney\t37650\t0.003168646\t37650.0\n20766\t-82.412523\t36.144290000000005\tErwin city\tTN\tTennessee\tUnicoi County\t5641\t45.9\t15.6\t9.4\t19630\t103134\t0.27\t37650\tRomney\t37650\t0.016413529\t37650.0\n20767\t-83.747563\t36.209901\tLuttrell town\tTN\tTennessee\tUnion County\t953\t36.8\t5.9\t11.3\t15354\t90000\t0.2536\t37779\tRomney\t37779\t0.0027729290000000004\t37779.0\n20768\t-83.80622\t36.246683000000004\tMaynardville city\tTN\tTennessee\tUnion County\t2063\t37.9\t6.4\t12.2\t16137\t100354\t0.2536\t37807\tRomney\t37807\t0.006002678000000001\t37807.0\n20769\t-83.79342199999999\t36.181025\tPlainview city\tTN\tTennessee\tUnion County\t2048\t34.3\t9.1\t11.5\t15477\t103277\t0.2536\t37721\tRomney\t37721\t0.005959033000000001\t37721.0\n20770\t-85.455519\t35.739951\tSpencer town\tTN\tTennessee\tVan Buren County\t1788\t41.0\t10.7\t15.1\t18846\t76607\t0.3804\t38585\tRomney\t38585\t0.005202515\t38585.0\n20771\t-85.780047\t35.686582\tMcMinnville city\tTN\tTennessee\tWarren County\t13006\t38.0\t12.9\t13.5\t18814\t93664\t0.3651\t37110\tRomney\t37110\t0.037843352999999996\t37110.0\n20772\t-85.86066600000001\t35.53873\tViola town\tTN\tTennessee\tWarren County\t136\t38.1\t14.0\t12.7\t19571\t105357\t0.3651\t37394\tRomney\t37394\t0.00039571699999999997\t37394.0\n20773\t-85.919803\t35.725423\tCentertown town\tTN\tTennessee\tWarren County\t276\t41.3\t8.7\t16.0\t20215\t99545\t0.3651\t37357\tRomney\t37357\t0.0008030730000000001\t37357.0\n20774\t-85.911913\t35.604596\tMorrison town\tTN\tTennessee\tWarren County\t675\t39.9\t9.8\t17.0\t15093\t99500\t0.3651\t37357\tRomney\t37357\t0.001964037\t37357.0\n20775\t-82.475176\t36.294125\tJonesborough town\tTN\tTennessee\tWashington County\t4763\t41.6\t26.4\t8.8\t22744\t139844\t0.2982\t37659\tRomney\t37659\t0.013858826000000001\t37659.0\n20776\t-82.474675\t36.419665\tGray CDP\tTN\tTennessee\tWashington County\t1651\t38.8\t23.5\t10.6\t23439\t118804\t0.2982\t37615\tRomney\t37615\t0.004803889\t37615.0\n20777\t-82.42939799999999\t36.421942\tOak Grove CDP\tTN\tTennessee\tWashington County\t4784\t39.4\t24.9\t6.3\t26739\t137346\t0.2982\t37615\tRomney\t37615\t0.013919929\t37615.0\n20778\t-82.61873800000001\t36.41775\tFall Branch CDP\tTN\tTennessee\tWashington County\t1358\t45.5\t15.9\t10.6\t20907\t114435\t0.2982\t37656\tRomney\t37656\t0.003951351\t37656.0\n20779\t-82.320952\t36.411229999999996\tJohnson City\tTN\tTennessee\tWashington County\t60135\t39.2\t31.7\t10.2\t23440\t132184\t0.2982\t37686\tRomney\t37686\t0.17497385899999998\t37686.0\n20780\t-82.42746700000001\t36.288064\tMidway CDP\tTN\tTennessee\tWashington County\t2649\t39.2\t28.0\t9.9\t21416\t122789\t0.2982\t37604\tRomney\t37604\t0.007707753\t37604.0\n20781\t-87.750757\t35.324585\tWaynesboro city\tTN\tTennessee\tWayne County\t2155\t41.6\t12.5\t12.2\t17826\t64352\t0.212\t38485\tRomney\t38485\t0.0062703690000000005\t38485.0\n20782\t-87.993585\t35.377125\tClifton city\tTN\tTennessee\tWayne County\t2780\t35.3\t16.1\t9.2\t14737\t82903\t0.212\t38425\tRomney\t38425\t0.008088922\t38425.0\n20783\t-87.74342\t35.174964\tCollinwood city\tTN\tTennessee\tWayne County\t1017\t40.9\t9.3\t11.9\t15087\t64091\t0.212\t38450\tRomney\t38450\t0.0029591490000000003\t38450.0\n20784\t-88.825231\t36.233723\tSharon town\tTN\tTennessee\tWeakley County\t967\t43.5\t11.3\t14.7\t16413\t71964\t0.2876\t38255\tRomney\t38255\t0.002813665\t38255.0\n20785\t-88.804047\t36.159213\tGreenfield city\tTN\tTennessee\tWeakley County\t2096\t40.5\t14.8\t16.4\t18042\t65610\t0.2876\t38230\tRomney\t38230\t0.0060986980000000005\t38230.0\n20786\t-88.692903\t36.277182\tDresden town\tTN\tTennessee\tWeakley County\t2708\t40.5\t12.6\t14.1\t17521\t80648\t0.2876\t38225\tRomney\t38225\t0.007879425\t38225.0\n20787\t-88.851672\t36.338713\tMartin city\tTN\tTennessee\tWeakley County\t10026\t29.0\t27.6\t16.6\t18131\t98558\t0.2876\t38237\tRomney\t38237\t0.029172494\t38237.0\n20788\t-88.610867\t36.217227\tGleason town\tTN\tTennessee\tWeakley County\t1481\t37.8\t15.0\t18.8\t18319\t68333\t0.2876\t38229\tRomney\t38229\t0.0043092420000000005\t38229.0\n20789\t-85.473014\t35.934779\tSparta city\tTN\tTennessee\tWhite County\t4654\t43.7\t11.4\t14.5\t17803\t103252\t0.3058\t38583\tRomney\t38583\t0.01354167\t38583.0\n20790\t-85.512762\t35.855815\tDoyle town\tTN\tTennessee\tWhite County\t566\t42.3\t5.6\t13.9\t16245\t89167\t0.3058\t38559\tRomney\t38559\t0.001646881\t38559.0\n20791\t-86.907459\t35.807965\tThompson's Station town\tTN\tTennessee\tWilliamson County\t2293\t32.5\t36.1\t7.3\t29681\t203956\t0.2613\t37179\tRomney\t37179\t0.006671906\t37179.0\n20792\t-87.12019699999999\t35.978409\tFairview city\tTN\tTennessee\tWilliamson County\t7592\t35.1\t19.5\t8.5\t26672\t132918\t0.2613\t37062\tRomney\t37062\t0.022090322000000003\t37062.0\n20793\t-86.846565\t35.928413\tFranklin city\tTN\tTennessee\tWilliamson County\t54273\t35.5\t49.3\t9.3\t40975\t251341\t0.2613\t37067\tRomney\t37067\t0.15791729\t37067.0\n20794\t-86.782993\t35.992853000000004\tBrentwood city\tTN\tTennessee\tWilliamson County\t28860\t42.3\t67.1\t7.5\t63438\t422999\t0.2613\t37027\tRomney\t37027\t0.083973486\t37027.0\n20795\t-86.667186\t35.953165999999996\tNolensville town\tTN\tTennessee\tWilliamson County\t4929\t38.5\t39.4\t6.3\t35529\t235027\t0.2613\t37135\tRomney\t37135\t0.014341833\t37135.0\n20796\t-86.333381\t36.2068\tLebanon city\tTN\tTennessee\tWilson County\t25027\t37.7\t21.2\t11.4\t25388\t151939\t0.2853\t37087\tRomney\t37087\t0.07282066599999999\t37087.0\n20797\t-86.513501\t36.201178999999996\tMount Juliet city\tTN\tTennessee\tWilson County\t19286\t38.2\t28.5\t7.1\t31142\t198869\t0.2853\t37122\tRomney\t37122\t0.056116169\t37122.0\n20798\t-86.571605\t36.233672999999996\tGreen Hill CDP\tTN\tTennessee\tWilson County\t7168\t42.1\t28.3\t9.2\t33355\t192232\t0.2853\t37138\tRomney\t37138\t0.020856616\t37138.0\n20799\t-86.14016099999999\t36.100978000000005\tWatertown city\tTN\tTennessee\tWilson County\t1476\t39.3\t13.0\t10.7\t21436\t104730\t0.2853\t37184\tRomney\t37184\t0.004294694\t37184.0\n20800\t-86.514478\t36.115775\tRural Hill CDP\tTN\tTennessee\tWilson County\t2838\t38.9\t24.9\t7.6\t31626\t185842\t0.2853\t37122\tRomney\t37122\t0.008257684\t37122.0\n20801\t-95.50438100000001\t32.05599\tFrankston town\tTX\tTexas\tAnderson County\t1257\t45.5\t13.8\t8.0\t15933\t77500\t0.2352\t75763\tRomney\t75763\t0.002453873\t75763.0\n20802\t-95.57895500000001\t31.628059999999998\tElkhart town\tTX\tTexas\tAnderson County\t1203\t43.1\t12.1\t6.3\t18594\t60690\t0.2352\t75839\tRomney\t75839\t0.002348456\t75839.0\n20803\t-95.646227\t31.757021\tPalestine city\tTX\tTexas\tAnderson County\t17407\t34.9\t16.3\t11.7\t17730\t79810\t0.2352\t75801\tRomney\t75801\t0.033981353\t75801.0\n20804\t-102.550035\t32.321331\tAndrews city\tTX\tTexas\tAndrews County\t10396\t34.8\t13.2\t10.2\t17635\t59714\t0.1774\t79714\tRomney\t79714\t0.020294717\t79714.0\n20805\t-94.77033399999999\t31.228773999999998\tBurke city\tTX\tTexas\tAngelina County\t337\t33.5\t7.6\t5.1\t14693\t56333\t0.2758\t75941\tRomney\t75941\t0.00065788\t75941.0\n20806\t-94.726373\t31.329117\tLufkin city\tTX\tTexas\tAngelina County\t32894\t34.8\t22.1\t9.8\t20501\t95266\t0.2758\t75904\tRomney\t75904\t0.064214548\t75904.0\n20807\t-94.418013\t31.158388000000002\tZavalla city\tTX\tTexas\tAngelina County\t659\t43.3\t7.9\t10.5\t16340\t63529\t0.2758\t75980\tRomney\t75980\t0.001286477\t75980.0\n20808\t-94.577207\t31.280484\tHuntington city\tTX\tTexas\tAngelina County\t2169\t35.2\t12.9\t9.8\t17809\t69884\t0.2758\t75949\tRomney\t75949\t0.0042342479999999995\t75949.0\n20809\t-94.798997\t31.330121999999996\tHudson city\tTX\tTexas\tAngelina County\t5160\t32.7\t13.7\t7.0\t17629\t86229\t0.2758\t75904\tRomney\t75904\t0.010073176\t75904.0\n20810\t-94.78352\t31.18785\tDiboll city\tTX\tTexas\tAngelina County\t5332\t32.8\t9.2\t7.1\t13583\t64700\t0.2758\t75941\tRomney\t75941\t0.010408949\t75941.0\n20811\t-97.043361\t28.069888\tFulton town\tTX\tTexas\tAransas County\t1852\t55.3\t18.4\t9.0\t21567\t72121\t0.2803\t78358\tRomney\t78358\t0.003615411\t78358.0\n20812\t-97.05879499999999\t28.050608\tRockport city\tTX\tTexas\tAransas County\t8780\t49.2\t23.6\t8.1\t25210\t112939\t0.2803\t78382\tRomney\t78382\t0.017140017\t78382.0\n20813\t-98.929826\t33.45358\tMegargel town\tTX\tTexas\tArcher County\t253\t46.1\t14.7\t5.8\t20137\t42500\t0.1261\t76370\tRomney\t76370\t0.000493898\t76370.0\n20814\t-98.406635\t33.65018\tScotland city\tTX\tTexas\tArcher County\t451\t35.2\t15.7\t1.9\t18665\t79500\t0.1261\t76379\tRomney\t76379\t0.0008804269999999999\t76379.0\n20815\t-98.625662\t33.593753\tArcher City\tTX\tTexas\tArcher County\t1876\t42.3\t14.5\t6.6\t19888\t50287\t0.1261\t76351\tRomney\t76351\t0.003662263\t76351.0\n20816\t-98.54032099999999\t33.829146\tLakeside City town\tTX\tTexas\tArcher County\t1277\t48.1\t27.1\t4.6\t28962\t117560\t0.1261\t76310\tRomney\t76310\t0.002492916\t76310.0\n20817\t-98.689942\t33.813014\tHolliday city\tTX\tTexas\tArcher County\t1687\t34.7\t15.4\t6.1\t18514\t57344\t0.1261\t76366\tRomney\t76366\t0.0032933040000000004\t76366.0\n20818\t-98.42081800000001\t33.576853\tWindthorst town\tTX\tTexas\tArcher County\t452\t35.4\t16.0\t2.3\t18649\t80417\t0.1261\t76389\tRomney\t76389\t0.000882379\t76389.0\n20819\t-101.36313100000001\t35.107803000000004\tClaude city\tTX\tTexas\tArmstrong County\t1393\t44.1\t24.0\t4.8\t20226\t76029\t0.1048\t79019\tRomney\t79019\t0.0027193670000000003\t79019.0\n20820\t-98.492047\t28.965286\tPleasanton city\tTX\tTexas\tAtascosa County\t9116\t34.2\t17.8\t8.7\t17191\t83684\t0.4035\t78064\tRomney\t78064\t0.017795945\t78064.0\n20821\t-98.49801\t28.786161\tChristine town\tTX\tTexas\tAtascosa County\t504\t38.3\t8.7\t6.1\t16090\t55000\t0.4035\t78012\tRomney\t78012\t0.0009838919999999999\t78012.0\n20822\t-98.786624\t29.246440999999997\tLytle city\tTX\tTexas\tAtascosa County\t2773\t33.4\t13.9\t7.0\t17241\t81224\t0.4035\t78052\tRomney\t78052\t0.005413355999999999\t78052.0\n20823\t-98.54140600000001\t28.913553000000004\tJourdanton city\tTX\tTexas\tAtascosa County\t4388\t33.2\t10.0\t8.2\t16632\t60825\t0.4035\t78026\tRomney\t78026\t0.008566104\t78026.0\n20824\t-98.700453\t28.85905\tCharlotte city\tTX\tTexas\tAtascosa County\t1883\t32.0\t8.2\t12.1\t11706\t43482\t0.4035\t78011\tRomney\t78011\t0.003675929\t78011.0\n20825\t-98.574097\t29.037518\tPoteet city\tTX\tTexas\tAtascosa County\t3759\t30.9\t7.6\t10.6\t13087\t47469\t0.4035\t78065\tRomney\t78065\t0.0073381919999999995\t78065.0\n20826\t-96.06383100000001\t29.631988\tWallis city\tTX\tTexas\tAustin County\t1289\t37.2\t9.9\t9.5\t16287\t72895\t0.1933\t77485\tRomney\t77485\t0.002516342\t77485.0\n20827\t-96.260504\t29.947214000000002\tBellville city\tTX\tTexas\tAustin County\t4171\t40.0\t24.4\t6.2\t21417\t111081\t0.1933\t77418\tRomney\t77418\t0.008142484\t77418.0\n20828\t-96.10455400000001\t29.796051000000002\tSan Felipe town\tTX\tTexas\tAustin County\t1015\t36.3\t9.2\t9.2\t19763\t79167\t0.1933\t77473\tRomney\t77473\t0.001981448\t77473.0\n20829\t-96.49918100000001\t29.971506\tIndustry city\tTX\tTexas\tAustin County\t318\t43.9\t20.0\t4.2\t21258\t115625\t0.1933\t78944\tRomney\t78944\t0.0006207890000000001\t78944.0\n20830\t-96.156777\t29.769835999999998\tSealy city\tTX\tTexas\tAustin County\t6263\t35.0\t15.6\t10.4\t20062\t102921\t0.1933\t77474\tRomney\t77474\t0.012226415\t77474.0\n20831\t-102.72828100000001\t34.229344\tMuleshoe city\tTX\tTexas\tBailey County\t4380\t34.4\t9.8\t10.2\t14488\t43438\t0.2566\t79347\tRomney\t79347\t0.008550486999999999\t79347.0\n20832\t-99.074218\t29.725231\tBandera city\tTX\tTexas\tBandera County\t1107\t47.0\t17.9\t9.9\t23157\t102692\t0.1973\t78003\tRomney\t78003\t0.002161048\t78003.0\n20833\t-98.944833\t29.623628000000004\tLakehills CDP\tTX\tTexas\tBandera County\t5572\t45.5\t17.1\t6.6\t21981\t106535\t0.1973\t78063\tRomney\t78063\t0.010877468999999999\t78063.0\n20834\t-97.29335999999999\t30.188366\tCamp Swift CDP\tTX\tTexas\tBastrop County\t6127\t36.5\t15.5\t9.6\t19127\t114807\t0.4029\t78602\tRomney\t78602\t0.011960921000000001\t78602.0\n20835\t-97.151152\t30.007696000000003\tSmithville city\tTX\tTexas\tBastrop County\t4578\t38.6\t18.2\t9.8\t19491\t111624\t0.4029\t78957\tRomney\t78957\t0.008937015999999999\t78957.0\n20836\t-97.308674\t30.112152000000002\tBastrop city\tTX\tTexas\tBastrop County\t7272\t38.5\t28.0\t6.5\t23761\t143088\t0.4029\t78602\tRomney\t78602\t0.014196151\t78602.0\n20837\t-97.234553\t30.161042\tCircle D-KC Estates CDP\tTX\tTexas\tBastrop County\t2670\t37.1\t16.9\t9.4\t19714\t117055\t0.4029\t78602\tRomney\t78602\t0.005212283\t78602.0\n20838\t-97.48013399999999\t30.129697999999998\tWyldwood CDP\tTX\tTexas\tBastrop County\t2854\t38.1\t18.0\t8.6\t23582\t137075\t0.4029\t78612\tRomney\t78612\t0.005571481999999999\t78612.0\n20839\t-97.38126899999999\t30.367511999999998\tElgin city\tTX\tTexas\tBastrop County\t7789\t34.0\t19.9\t9.6\t20662\t110074\t0.4029\t78621\tRomney\t78621\t0.015205421\t78621.0\n20840\t-99.259232\t33.597797\tSeymour city\tTX\tTexas\tBaylor County\t2624\t46.0\t12.9\t5.4\t16679\t47586\t0.1677\t76380\tRomney\t76380\t0.005122484\t76380.0\n20841\t-97.798067\t28.576715000000004\tTuleta CDP\tTX\tTexas\tBee County\t265\t41.0\t10.7\t8.1\t14223\t50000\t0.4381\t78146\tRomney\t78146\t0.000517324\t78146.0\n20842\t-97.749219\t28.170761\tTynan CDP\tTX\tTexas\tBee County\t274\t42.2\t13.0\t12.5\t15469\t62500\t0.4381\t78391\tRomney\t78391\t0.000534893\t78391.0\n20843\t-97.79208100000001\t28.385515\tBlue Berry Hill CDP\tTX\tTexas\tBee County\t1023\t39.8\t7.1\t10.8\t14869\t60909\t0.4381\t78102\tRomney\t78102\t0.001997066\t78102.0\n20844\t-97.812062\t28.615624\tPettus CDP\tTX\tTexas\tBee County\t553\t41.2\t11.6\t8.1\t14519\t51667\t0.4381\t78146\tRomney\t78146\t0.001079548\t78146.0\n20845\t-97.783064\t28.52753\tNormanna CDP\tTX\tTexas\tBee County\t110\t42.1\t13.3\t7.5\t15285\t58333\t0.4381\t78142\tRomney\t78142\t0.000214738\t78142.0\n20846\t-97.813047\t28.654004999999998\tTulsita CDP\tTX\tTexas\tBee County\t18\t46.3\t15.4\t11.1\t15995\t75000\t0.4381\t78146\tRomney\t78146\t3.5100000000000006e-05\t78146.0\n20847\t-97.685458\t28.262539\tSkidmore CDP\tTX\tTexas\tBee County\t940\t37.8\t6.1\t10.5\t13668\t42895\t0.4381\t78389\tRomney\t78389\t0.001835036\t78389.0\n20848\t-97.749677\t28.406705\tBeeville city\tTX\tTexas\tBee County\t12891\t31.3\t12.6\t12.8\t14089\t60044\t0.4381\t78102\tRomney\t78102\t0.025165372000000002\t78102.0\n20849\t-98.008318\t28.648346000000004\tPawnee CDP\tTX\tTexas\tBee County\t183\t43.4\t13.8\t6.8\t15840\t66667\t0.4381\t78145\tRomney\t78145\t0.000357246\t78145.0\n20850\t-97.531723\t30.955863\tSalado CDP\tTX\tTexas\tBell County\t3354\t45.7\t40.0\t2.6\t30788\t194574\t0.4119\t76571\tRomney\t76571\t0.006547565\t76571.0\n20851\t-97.46765400000001\t31.063546999999996\tBelton city\tTX\tTexas\tBell County\t16478\t30.1\t21.9\t9.7\t18396\t85217\t0.4119\t76513\tRomney\t76513\t0.032167791\t76513.0\n20852\t-97.403228\t30.883939\tHolland town\tTX\tTexas\tBell County\t1258\t32.7\t9.3\t5.5\t14051\t60400\t0.4119\t76534\tRomney\t76534\t0.002455825\t76534.0\n20853\t-97.650889\t31.059321\tHarker Heights city\tTX\tTexas\tBell County\t23472\t31.3\t30.6\t8.2\t25477\t138724\t0.4119\t76548\tRomney\t76548\t0.04582124\t76548.0\n20854\t-97.37768100000001\t31.102613\tTemple city\tTX\tTexas\tBell County\t64125\t36.6\t25.7\t7.3\t23379\t105837\t0.4119\t76504\tRomney\t76504\t0.125182643\t76504.0\n20855\t-97.303216\t31.19394\tTroy city\tTX\tTexas\tBell County\t1524\t37.1\t16.7\t5.4\t20826\t95893\t0.4119\t76579\tRomney\t76579\t0.002975101\t76579.0\n20856\t-97.743298\t31.143440999999996\tFort Hood CDP\tTX\tTexas\tBell County\t33431\t21.8\t13.7\t16.8\t12608\t95833\t0.4119\t76541\tRomney\t76541\t0.06526286099999999\t76541.0\n20857\t-97.610624\t31.078276000000002\tNolanville city\tTX\tTexas\tBell County\t3042\t31.7\t12.9\t9.0\t17357\t63636\t0.4119\t76559\tRomney\t76559\t0.005938489\t76559.0\n20858\t-97.727171\t31.096357\tKilleen city\tTX\tTexas\tBell County\t114135\t28.3\t17.9\t10.5\t19997\t103622\t0.4119\t76541\tRomney\t76541\t0.22281046300000001\t76541.0\n20859\t-97.2287\t30.932294\tRogers town\tTX\tTexas\tBell County\t1274\t36.9\t8.4\t7.9\t15265\t54485\t0.4119\t76569\tRomney\t76569\t0.002487059\t76569.0\n20860\t-97.354187\t30.988190000000003\tLittle River-Academy city\tTX\tTexas\tBell County\t2046\t37.2\t19.0\t5.1\t21603\t94255\t0.4119\t76554\tRomney\t76554\t0.003994132\t76554.0\n20861\t-97.459632\t31.151993\tMorgan's Point Resort city\tTX\tTexas\tBell County\t3902\t38.9\t26.0\t5.5\t26535\t120326\t0.4119\t765HH\tRomney\t765HH\t0.007617351999999999\t0.0\n20862\t-98.468118\t29.482768\tAlamo Heights city\tTX\tTexas\tBexar County\t7344\t43.2\t67.4\t5.3\t40734\t243278\t0.5156\t78209\tRomney\t78209\t0.014336706999999999\t78209.0\n20863\t-98.307404\t29.551198\tUniversal City\tTX\tTexas\tBexar County\t17573\t37.6\t29.5\t6.5\t27261\t120018\t0.5156\t78148\tRomney\t78148\t0.034305413\t78148.0\n20864\t-98.34554200000001\t29.394190999999996\tChina Grove town\tTX\tTexas\tBexar County\t1351\t42.9\t20.1\t5.2\t23075\t122115\t0.5156\t78263\tRomney\t78263\t0.002637376\t78263.0\n20865\t-98.447102\t29.477103000000003\tTerrell Hills city\tTX\tTexas\tBexar County\t5032\t45.0\t68.4\t3.2\t42004\t247809\t0.5156\t78209\tRomney\t78209\t0.009823299\t78209.0\n20866\t-98.483985\t29.599361\tHollywood Park town\tTX\tTexas\tBexar County\t3327\t49.6\t49.1\t3.4\t36501\t213043\t0.5156\t78232\tRomney\t78232\t0.006494855999999999\t78232.0\n20867\t-98.307039\t29.514711\tConverse city\tTX\tTexas\tBexar County\t16067\t33.7\t19.1\t9.2\t22818\t102174\t0.5156\t78109\tRomney\t78109\t0.031365451\t78109.0\n20868\t-98.340512\t29.554231\tLive Oak city\tTX\tTexas\tBexar County\t11947\t37.5\t22.6\t7.7\t25527\t103956\t0.5156\t78233\tRomney\t78233\t0.023322527000000003\t78233.0\n20869\t-98.345867\t29.640678\tSan Antonio city\tTX\tTexas\tBexar County\t1290463\t32.9\t23.1\t9.3\t20871\t95722\t0.5156\t78266\tRomney\t78266\t2.51919796\t78266.0\n20870\t-98.62955600000001\t29.762201\tFair Oaks Ranch city\tTX\tTexas\tBexar County\t6552\t48.3\t54.0\t4.8\t45974\t331641\t0.5156\t78015\tRomney\t78015\t0.012790591\t78015.0\n20871\t-98.204859\t29.419689\tSt. Hedwig town\tTX\tTexas\tBexar County\t1935\t40.6\t15.4\t7.5\t21956\t107478\t0.5156\t78152\tRomney\t78152\t0.003777441\t78152.0\n20872\t-98.669558\t29.702191\tScenic Oaks CDP\tTX\tTexas\tBexar County\t5849\t46.8\t53.5\t5.1\t40265\t225439\t0.5156\t78255\tRomney\t78255\t0.011418218999999999\t78255.0\n20873\t-98.379719\t29.517266999999997\tWindcrest city\tTX\tTexas\tBexar County\t5127\t53.6\t38.2\t6.9\t31080\t154799\t0.5156\t78239\tRomney\t78239\t0.010008755\t78239.0\n20874\t-98.65705600000001\t29.22845\tSomerset city\tTX\tTexas\tBexar County\t1784\t32.3\t6.2\t7.6\t14506\t54714\t0.5156\t78069\tRomney\t78069\t0.0034826640000000003\t78069.0\n20875\t-98.486436\t29.474818\tOlmos Park city\tTX\tTexas\tBexar County\t2281\t45.0\t68.9\t5.7\t56459\t430380\t0.5156\t78212\tRomney\t78212\t0.004452891\t78212.0\n20876\t-98.334856\t29.258603000000004\tElmendorf city\tTX\tTexas\tBexar County\t810\t33.5\t7.0\t7.6\t19644\t81190\t0.5156\t78112\tRomney\t78112\t0.001581254\t78112.0\n20877\t-98.550234\t29.489835999999997\tBalcones Heights city\tTX\tTexas\tBexar County\t2805\t32.2\t13.5\t10.0\t17014\t88611\t0.5156\t78229\tRomney\t78229\t0.005475826\t78229.0\n20878\t-98.691191\t29.565515\tHelotes city\tTX\tTexas\tBexar County\t4976\t41.8\t42.3\t4.8\t34250\t151944\t0.5156\t78250\tRomney\t78250\t0.009713978\t78250.0\n20879\t-98.299984\t29.600735999999998\tSelma city\tTX\tTexas\tBexar County\t3131\t36.6\t29.9\t6.1\t24494\t170227\t0.5156\t78154\tRomney\t78154\t0.0061122319999999996\t78154.0\n20880\t-98.617989\t29.386564\tLackland AFB CDP\tTX\tTexas\tBexar County\t7507\t20.6\t17.9\t6.5\t14305\t75000\t0.5156\t78236\tRomney\t78236\t0.01465491\t78236.0\n20881\t-98.654333\t29.653629\tCross Mountain CDP\tTX\tTexas\tBexar County\t3309\t45.1\t41.3\t5.0\t44452\t235443\t0.5156\t78255\tRomney\t78255\t0.006459716999999999\t78255.0\n20882\t-98.386062\t29.460703999999996\tKirby city\tTX\tTexas\tBexar County\t9219\t34.5\t9.8\t9.6\t19378\t77412\t0.5156\t78219\tRomney\t78219\t0.017997018\t78219.0\n20883\t-98.614302\t29.49529\tLeon Valley city\tTX\tTexas\tBexar County\t10385\t38.8\t30.2\t7.3\t26192\t117035\t0.5156\t78238\tRomney\t78238\t0.020273244\t78238.0\n20884\t-98.482186\t29.701588\tTimberwood Park CDP\tTX\tTexas\tBexar County\t18979\t37.8\t41.2\t5.2\t37656\t207231\t0.5156\t78260\tRomney\t78260\t0.037050158\t78260.0\n20885\t-98.489486\t29.583058\tHill Country Village city\tTX\tTexas\tBexar County\t1150\t48.2\t58.2\t3.3\t48282\t242683\t0.5156\t78232\tRomney\t78232\t0.002244991\t78232.0\n20886\t-98.553955\t29.586247999999998\tShavano Park city\tTX\tTexas\tBexar County\t1673\t47.9\t59.6\t5.6\t49855\t243934\t0.5156\t78231\tRomney\t78231\t0.003265974\t78231.0\n20887\t-98.519715\t29.522853\tCastle Hills city\tTX\tTexas\tBexar County\t5041\t52.0\t43.2\t7.9\t36989\t181109\t0.5156\t78213\tRomney\t78213\t0.009840869\t78213.0\n20888\t-98.68336\t29.616852\tGrey Forest city\tTX\tTexas\tBexar County\t368\t46.6\t44.1\t4.7\t38840\t194167\t0.5156\t78255\tRomney\t78255\t0.000718397\t78255.0\n20889\t-98.422298\t30.098457\tBlanco city\tTX\tTexas\tBlanco County\t1532\t40.6\t18.9\t7.4\t16879\t117742\t0.2453\t78606\tRomney\t78606\t0.002990718\t78606.0\n20890\t-98.361102\t30.440298\tRound Mountain town\tTX\tTexas\tBlanco County\t128\t49.3\t29.9\t8.1\t28466\t231250\t0.2453\t78663\tRomney\t78663\t0.000249877\t78663.0\n20891\t-98.406777\t30.27455\tJohnson City\tTX\tTexas\tBlanco County\t1323\t37.4\t20.7\t2.7\t18361\t116111\t0.2453\t78636\tRomney\t78636\t0.002582716\t78636.0\n20892\t-97.606113\t32.015541\tMorgan city\tTX\tTexas\tBosque County\t513\t33.3\t2.7\t11.4\t11559\t26579\t0.1858\t76671\tRomney\t76671\t0.0010014610000000001\t76671.0\n20893\t-97.648193\t31.925159000000004\tMeridian city\tTX\tTexas\tBosque County\t1622\t39.0\t17.6\t9.4\t16538\t66852\t0.1858\t76665\tRomney\t76665\t0.003166413\t76665.0\n20894\t-97.871875\t31.986578\tIredell city\tTX\tTexas\tBosque County\t355\t46.2\t16.9\t8.0\t19225\t91667\t0.1858\t76649\tRomney\t76649\t0.0006930189999999999\t76649.0\n20895\t-97.750838\t32.056258\tWalnut Springs city\tTX\tTexas\tBosque County\t800\t36.3\t6.9\t6.2\t13673\t42708\t0.1858\t76690\tRomney\t76690\t0.0015617329999999998\t76690.0\n20896\t-97.46387299999999\t31.658565999999997\tValley Mills city\tTX\tTexas\tBosque County\t1173\t40.6\t12.6\t6.5\t17753\t81154\t0.1858\t76689\tRomney\t76689\t0.002289891\t76689.0\n20897\t-97.581255\t31.78217\tClifton city\tTX\tTexas\tBosque County\t3684\t43.5\t18.0\t9.3\t18808\t78810\t0.1858\t76634\tRomney\t76634\t0.007191779000000001\t76634.0\n20898\t-97.83028\t31.775249\tCranfills Gap city\tTX\tTexas\tBosque County\t363\t47.6\t27.1\t5.0\t24113\t116848\t0.1858\t76637\tRomney\t76637\t0.000708636\t76637.0\n20899\t-94.113303\t33.424634000000005\tWake Village city\tTX\tTexas\tBowie County\t5627\t37.6\t27.5\t7.5\t21592\t89320\t0.28800000000000003\t75569\tRomney\t75569\t0.010984838\t75569.0\n20900\t-94.211962\t33.472339\tLeary city\tTX\tTexas\tBowie County\t602\t40.6\t13.1\t8.4\t19849\t64333\t0.28800000000000003\t75561\tRomney\t75561\t0.001175204\t75561.0\n20901\t-94.254708\t33.358426\tRedwater city\tTX\tTexas\tBowie County\t875\t37.8\t11.2\t8.5\t17795\t74286\t0.28800000000000003\t75573\tRomney\t75573\t0.001708145\t75573.0\n20902\t-94.418412\t33.460308000000005\tNew Boston city\tTX\tTexas\tBowie County\t4547\t40.5\t14.2\t9.1\t18020\t64391\t0.28800000000000003\t75570\tRomney\t75570\t0.008876499\t75570.0\n20903\t-94.178609\t33.477751\tRed Lick city\tTX\tTexas\tBowie County\t945\t43.3\t35.0\t6.9\t30030\t139103\t0.28800000000000003\t75569\tRomney\t75569\t0.001844797\t75569.0\n20904\t-94.284044\t33.470662\tHooks city\tTX\tTexas\tBowie County\t3000\t37.3\t11.2\t7.1\t18699\t54783\t0.28800000000000003\t75561\tRomney\t75561\t0.005856498000000001\t75561.0\n20905\t-94.617125\t33.507543\tDe Kalb city\tTX\tTexas\tBowie County\t1831\t42.2\t14.9\t14.3\t14487\t54516\t0.28800000000000003\t75559\tRomney\t75559\t0.003574416\t75559.0\n20906\t-94.126956\t33.441458000000004\tNash city\tTX\tTexas\tBowie County\t2580\t37.3\t15.9\t9.6\t18086\t58547\t0.28800000000000003\t75569\tRomney\t75569\t0.005036588\t75569.0\n20907\t-94.346236\t33.330103\tMaud city\tTX\tTexas\tBowie County\t1183\t41.9\t11.5\t6.5\t17105\t56282\t0.28800000000000003\t75567\tRomney\t75567\t0.0023094120000000003\t75567.0\n20908\t-94.07803299999999\t33.444278000000004\tTexarkana city\tTX\tTexas\tBowie County\t36041\t37.4\t21.9\t12.6\t20293\t80614\t0.28800000000000003\t75501\tRomney\t75501\t0.07035801400000001\t75501.0\n20909\t-95.41759300000001\t29.460446\tIowa Colony village\tTX\tTexas\tBrazoria County\t1051\t38.5\t18.2\t8.3\t22788\t115686\t0.3225\t77583\tRomney\t77583\t0.0020517260000000002\t77583.0\n20910\t-95.74077\t29.283227\tDamon CDP\tTX\tTexas\tBrazoria County\t668\t38.8\t9.3\t10.2\t19278\t53519\t0.3225\t77430\tRomney\t77430\t0.001304047\t77430.0\n20911\t-95.277376\t29.300286\tLiverpool city\tTX\tTexas\tBrazoria County\t533\t39.4\t15.1\t10.0\t24805\t103947\t0.3225\t77577\tRomney\t77577\t0.001040504\t77577.0\n20912\t-95.648834\t29.142033\tWest Columbia city\tTX\tTexas\tBrazoria County\t4313\t39.3\t18.6\t10.7\t23591\t84671\t0.3225\t77486\tRomney\t77486\t0.008419692\t77486.0\n20913\t-95.41040600000001\t29.059129\tRichwood city\tTX\tTexas\tBrazoria County\t3482\t31.6\t22.5\t10.4\t26648\t96733\t0.3225\t77531\tRomney\t77531\t0.006797442\t77531.0\n20914\t-95.362962\t29.477225\tManvel city\tTX\tTexas\tBrazoria County\t6083\t36.1\t24.4\t8.2\t24987\t133720\t0.3225\t77578\tRomney\t77578\t0.011875026\t77578.0\n20915\t-95.328828\t28.996391999999997\tOyster Creek city\tTX\tTexas\tBrazoria County\t1333\t34.4\t12.0\t8.5\t23185\t55957\t0.3225\t77541\tRomney\t77541\t0.0026022370000000003\t77541.0\n20916\t-95.450405\t29.050394\tLake Jackson city\tTX\tTexas\tBrazoria County\t28517\t36.2\t40.1\t8.2\t31612\t131408\t0.3225\t77566\tRomney\t77566\t0.055669917\t77566.0\n20917\t-95.452495\t29.302565\tBonney village\tTX\tTexas\tBrazoria County\t388\t42.0\t11.3\t10.8\t17359\t51667\t0.3225\t77583\tRomney\t77583\t0.00075744\t77583.0\n20918\t-95.499038\t29.152898999999998\tBailey's Prairie village\tTX\tTexas\tBrazoria County\t824\t44.9\t24.8\t7.2\t29261\t137500\t0.3225\t77515\tRomney\t77515\t0.001608585\t77515.0\n20919\t-95.427675\t29.168084999999998\tAngleton city\tTX\tTexas\tBrazoria County\t19701\t34.9\t21.1\t9.8\t22758\t89000\t0.3225\t77515\tRomney\t77515\t0.038459622\t77515.0\n20920\t-95.47219100000001\t28.975707\tJones Creek village\tTX\tTexas\tBrazoria County\t2151\t38.4\t13.0\t11.8\t21183\t81667\t0.3225\t77566\tRomney\t77566\t0.004199109\t77566.0\n20921\t-95.51495\t29.208227\tHoliday Lakes town\tTX\tTexas\tBrazoria County\t1286\t35.9\t7.1\t12.4\t17730\t43646\t0.3225\t77515\tRomney\t77515\t0.002510485\t77515.0\n20922\t-95.247141\t29.419067\tAlvin city\tTX\tTexas\tBrazoria County\t24198\t31.6\t17.3\t9.9\t21714\t92283\t0.3225\t77511\tRomney\t77511\t0.047238512\t77511.0\n20923\t-95.346199\t29.227299\tDanbury city\tTX\tTexas\tBrazoria County\t1822\t34.0\t17.9\t7.6\t22210\t94386\t0.3225\t77534\tRomney\t77534\t0.003556846\t77534.0\n20924\t-95.567991\t29.047109000000003\tBrazoria city\tTX\tTexas\tBrazoria County\t3004\t35.1\t9.9\t9.9\t23427\t72727\t0.3225\t77422\tRomney\t77422\t0.005864306999999999\t77422.0\n20925\t-95.318467\t29.590587\tBrookside Village city\tTX\tTexas\tBrazoria County\t2063\t39.3\t20.2\t9.9\t23740\t125000\t0.3225\t77048\tRomney\t77048\t0.004027318\t77048.0\n20926\t-95.36374\t28.95342\tFreeport city\tTX\tTexas\tBrazoria County\t13314\t27.7\t6.7\t17.5\t15110\t50140\t0.3225\t77541\tRomney\t77541\t0.025991137999999997\t77541.0\n20927\t-95.308079\t28.932316999999998\tQuintana town\tTX\tTexas\tBrazoria County\t38\t28.8\t4.5\t25.0\t15547\t85000\t0.3225\t77541\tRomney\t77541\t7.42e-05\t77541.0\n20928\t-95.22334599999999\t29.392315999999997\tHillcrest village\tTX\tTexas\tBrazoria County\t830\t38.0\t36.3\t8.0\t28101\t145486\t0.3225\t77511\tRomney\t77511\t0.0016202979999999998\t77511.0\n20929\t-95.314763\t29.592083000000002\tPearland city\tTX\tTexas\tBrazoria County\t71059\t34.9\t33.6\t7.8\t29544\t147977\t0.3225\t77048\tRomney\t77048\t0.138718962\t77048.0\n20930\t-95.283236\t28.955608\tSurfside Beach city\tTX\tTexas\tBrazoria County\t788\t46.3\t23.0\t10.4\t29738\t106992\t0.3225\t77541\tRomney\t77541\t0.001538307\t77541.0\n20931\t-95.39706899999999\t29.027427000000003\tClute city\tTX\tTexas\tBrazoria County\t12014\t28.5\t11.4\t12.8\t18385\t64225\t0.3225\t77531\tRomney\t77531\t0.023453322000000002\t77531.0\n20932\t-95.636877\t29.080862\tWild Peach Village CDP\tTX\tTexas\tBrazoria County\t2579\t37.6\t8.3\t9.7\t20543\t84919\t0.3225\t77486\tRomney\t77486\t0.0050346359999999995\t77486.0\n20933\t-95.698924\t29.045338\tSweeny city\tTX\tTexas\tBrazoria County\t3962\t37.8\t14.4\t11.9\t20581\t82941\t0.3225\t77480\tRomney\t77480\t0.007734481999999999\t77480.0\n20934\t-96.36664300000001\t30.666053\tBryan city\tTX\tTexas\tBrazos County\t70874\t29.1\t28.4\t7.6\t19051\t98598\t0.3123\t77803\tRomney\t77803\t0.138357811\t77803.0\n20935\t-96.203405\t30.467098999999997\tMillican town\tTX\tTexas\tBrazos County\t170\t41.3\t31.0\t3.3\t23411\t85000\t0.3123\t77866\tRomney\t77866\t0.00033186800000000003\t77866.0\n20936\t-96.301201\t30.590369\tCollege Station city\tTX\tTexas\tBrazos County\t86220\t23.2\t59.0\t7.0\t20041\t161606\t0.3123\t77845\tRomney\t77845\t0.16831575\t77845.0\n20937\t-96.318853\t30.763088\tWixon Valley city\tTX\tTexas\tBrazos County\t285\t38.6\t24.6\t3.3\t22507\t87500\t0.3123\t77808\tRomney\t77808\t0.000556367\t77808.0\n20938\t-103.242882\t30.215445000000003\tMarathon CDP\tTX\tTexas\tBrewster County\t427\t51.4\t26.6\t6.0\t18056\t80833\t0.4564\t79842\tRomney\t79842\t0.000833575\t79842.0\n20939\t-103.568226\t29.309848\tStudy Butte-Terlingua CDP\tTX\tTexas\tBrewster County\t265\t44.6\t34.3\t4.0\t21299\t133929\t0.4564\t79852\tRomney\t79852\t0.000517324\t79852.0\n20940\t-103.664846\t30.362788000000002\tAlpine city\tTX\tTexas\tBrewster County\t6202\t35.5\t29.3\t9.7\t17652\t84804\t0.4564\t79831\tRomney\t79831\t0.012107333\t79831.0\n20941\t-101.304066\t34.471367\tSilverton city\tTX\tTexas\tBriscoe County\t716\t39.1\t18.8\t5.4\t16399\t44412\t0.1667\t79257\tRomney\t79257\t0.001397751\t79257.0\n20942\t-101.055614\t34.367383000000004\tQuitaque city\tTX\tTexas\tBriscoe County\t397\t45.9\t16.3\t5.1\t17651\t40833\t0.1667\t79255\tRomney\t79255\t0.00077501\t79255.0\n20943\t-98.155641\t27.202059999999996\tCantu Addition CDP\tTX\tTexas\tBrooks County\t221\t36.8\t9.7\t7.0\t13525\t58750\t0.7849\t78355\tRomney\t78355\t0.000431429\t78355.0\n20944\t-98.115433\t26.936269\tEncino CDP\tTX\tTexas\tBrooks County\t164\t42.5\t6.4\t11.8\t14368\t41667\t0.7849\t78353\tRomney\t78353\t0.000320155\t78353.0\n20945\t-98.064403\t27.220086\tFlowella CDP\tTX\tTexas\tBrooks County\t130\t38.1\t9.4\t9.7\t12542\t67500\t0.7849\t78355\tRomney\t78355\t0.00025378200000000003\t78355.0\n20946\t-98.098013\t27.219023999999997\tAirport Road Addition CDP\tTX\tTexas\tBrooks County\t128\t39.1\t8.4\t9.8\t12550\t67500\t0.7849\t78355\tRomney\t78355\t0.000249877\t78355.0\n20947\t-98.14540600000001\t27.224785999999998\tFalfurrias city\tTX\tTexas\tBrooks County\t5106\t35.3\t6.4\t10.8\t10526\t38542\t0.7849\t78355\tRomney\t78355\t0.009967759\t78355.0\n20948\t-98.789574\t31.824515\tBlanket town\tTX\tTexas\tBrown County\t456\t43.8\t16.0\t4.0\t17935\t89167\t0.1365\t76432\tRomney\t76432\t0.000890188\t76432.0\n20949\t-98.97790400000001\t31.718829\tBrownwood city\tTX\tTexas\tBrown County\t19016\t34.8\t17.7\t10.8\t18147\t60402\t0.1365\t76801\tRomney\t76801\t0.037122388\t76801.0\n20950\t-99.130868\t31.715071999999996\tBangs city\tTX\tTexas\tBrown County\t1709\t41.7\t12.8\t5.3\t14674\t55213\t0.1365\t76823\tRomney\t76823\t0.003336252\t76823.0\n20951\t-98.938991\t31.744857\tEarly city\tTX\tTexas\tBrown County\t2547\t38.8\t16.8\t9.6\t19188\t81182\t0.1365\t76802\tRomney\t76802\t0.004972167\t76802.0\n20952\t-99.106277\t31.815642999999998\tLake Brownwood CDP\tTX\tTexas\tBrown County\t1803\t45.6\t5.6\t2.5\t16881\t64359\t0.1365\t768HH\tRomney\t768HH\t0.003519755\t0.0\n20953\t-96.467117\t30.490646999999996\tSnook city\tTX\tTexas\tBurleson County\t608\t38.3\t15.2\t7.0\t19823\t70938\t0.2641\t77878\tRomney\t77878\t0.001186917\t77878.0\n20954\t-96.531102\t30.345975\tSomerville city\tTX\tTexas\tBurleson County\t1664\t37.1\t11.7\t10.1\t14779\t57500\t0.2641\t77879\tRomney\t77879\t0.0032484040000000003\t77879.0\n20955\t-96.703233\t30.529892999999998\tCaldwell city\tTX\tTexas\tBurleson County\t3618\t36.9\t18.8\t6.2\t18134\t68014\t0.2641\t77836\tRomney\t77836\t0.007062936\t77836.0\n20956\t-98.38476899999999\t30.58727\tGranite Shoals city\tTX\tTexas\tBurnet County\t2560\t39.2\t13.6\t5.7\t16907\t104449\t0.2187\t78657\tRomney\t78657\t0.004997545\t78657.0\n20957\t-98.233001\t30.753776000000002\tBurnet city\tTX\tTexas\tBurnet County\t6461\t39.1\t12.1\t7.5\t17659\t122760\t0.2187\t78611\tRomney\t78611\t0.012612944\t78611.0\n20958\t-98.325127\t30.556407\tCottonwood Shores city\tTX\tTexas\tBurnet County\t1584\t36.6\t20.7\t5.2\t19950\t108077\t0.2187\t78654\tRomney\t78654\t0.003092231\t78654.0\n20959\t-98.057885\t30.744346999999998\tBertram city\tTX\tTexas\tBurnet County\t1400\t42.8\t12.6\t4.9\t20964\t146964\t0.2187\t78605\tRomney\t78605\t0.0027330320000000003\t78605.0\n20960\t-98.29524\t30.563786999999998\tMeadowlakes city\tTX\tTexas\tBurnet County\t1904\t57.8\t43.3\t4.6\t37029\t264607\t0.2187\t78654\tRomney\t78654\t0.0037169240000000004\t78654.0\n20961\t-98.270759\t30.583402000000003\tMarble Falls city\tTX\tTexas\tBurnet County\t6215\t37.8\t19.2\t6.2\t21243\t143961\t0.2187\t78654\tRomney\t78654\t0.012132712\t78654.0\n20962\t-98.39494\t30.607511\tHighland Haven city\tTX\tTexas\tBurnet County\t677\t60.1\t22.5\t3.8\t30475\t221429\t0.2187\t78657\tRomney\t78657\t0.001321616\t78657.0\n20963\t-97.67896\t29.877878999999997\tLockhart city\tTX\tTexas\tCaldwell County\t12375\t33.9\t13.9\t11.9\t17653\t95428\t0.4329\t78644\tRomney\t78644\t0.024158053999999998\t78644.0\n20964\t-97.639983\t29.677359000000003\tLuling city\tTX\tTexas\tCaldwell County\t5824\t34.8\t14.1\t8.4\t15749\t63679\t0.4329\t78648\tRomney\t78648\t0.011369415\t78648.0\n20965\t-97.839175\t29.844283\tMartindale city\tTX\tTexas\tCaldwell County\t1140\t34.1\t18.9\t8.5\t17902\t92778\t0.4329\t78655\tRomney\t78655\t0.002225469\t78655.0\n20966\t-96.558966\t28.671551\tPoint Comfort city\tTX\tTexas\tCalhoun County\t727\t34.9\t8.6\t9.2\t18429\t58793\t0.3625\t77978\tRomney\t77978\t0.001419225\t77978.0\n20967\t-96.635662\t28.621946\tPort Lavaca city\tTX\tTexas\tCalhoun County\t12144\t34.4\t14.7\t11.5\t18135\t67125\t0.3625\t77979\tRomney\t77979\t0.023707104\t77979.0\n20968\t-96.71615899999999\t28.414557000000002\tSeadrift city\tTX\tTexas\tCalhoun County\t1315\t40.3\t9.2\t9.2\t15566\t40952\t0.3625\t77983\tRomney\t77983\t0.002567098\t77983.0\n20969\t-99.16578\t32.127022\tCross Plains town\tTX\tTexas\tCallahan County\t1064\t48.1\t15.9\t8.2\t16786\t57609\t0.1445\t76443\tRomney\t76443\t0.002077105\t76443.0\n20970\t-99.39654200000001\t32.39609\tBaird city\tTX\tTexas\tCallahan County\t1577\t46.0\t14.0\t4.8\t16129\t58256\t0.1445\t79504\tRomney\t79504\t0.0030785659999999996\t79504.0\n20971\t-99.19558599999999\t32.370236\tPutnam town\tTX\tTexas\tCallahan County\t89\t45.3\t15.6\t4.3\t15938\t60000\t0.1445\t76469\tRomney\t76469\t0.000173743\t76469.0\n20972\t-99.500988\t32.403859000000004\tClyde city\tTX\tTexas\tCallahan County\t3690\t41.3\t14.0\t8.7\t18264\t73602\t0.1445\t79510\tRomney\t79510\t0.007203492\t79510.0\n20973\t-97.844454\t26.2006\tRatamosa CDP\tTX\tTexas\tCameron County\t238\t34.7\t12.7\t6.8\t12812\t59286\t0.6499\t785XX\tRomney\t785XX\t0.000464616\t0.0\n20974\t-97.478061\t25.971093\tCameron Park CDP\tTX\tTexas\tCameron County\t6707\t22.7\t3.7\t25.8\t5676\t38962\t0.6499\t78526\tRomney\t78526\t0.013093177\t78526.0\n20975\t-97.82895500000001\t26.242527000000003\tGrand Acres CDP\tTX\tTexas\tCameron County\t249\t28.6\t5.1\t16.3\t9659\t40714\t0.6499\t78593\tRomney\t78593\t0.00048608900000000004\t78593.0\n20976\t-97.68975\t26.188353\tHarlingen city\tTX\tTexas\tCameron County\t64897\t32.1\t18.1\t12.2\t16168\t71994\t0.6499\t78550\tRomney\t78550\t0.126689715\t78550.0\n20977\t-97.695049\t26.257882000000002\tLasana CDP\tTX\tTexas\tCameron County\t155\t30.5\t6.7\t19.7\t11512\t54286\t0.6499\t78550\tRomney\t78550\t0.000302586\t78550.0\n20978\t-97.844363\t26.169649\tSolis CDP\tTX\tTexas\tCameron County\t694\t34.5\t8.8\t12.5\t11642\t41458\t0.6499\t78559\tRomney\t78559\t0.001354803\t78559.0\n20979\t-97.82445899999999\t26.159816\tLa Feria city\tTX\tTexas\tCameron County\t5850\t34.3\t12.9\t13.0\t12215\t54543\t0.6499\t78559\tRomney\t78559\t0.011420171000000002\t78559.0\n20980\t-97.594688\t25.979828\tSan Pedro CDP\tTX\tTexas\tCameron County\t802\t35.4\t9.1\t16.0\t11529\t53696\t0.6499\t78575\tRomney\t78575\t0.0015656370000000001\t78575.0\n20981\t-97.537811\t26.02309\tOlmito CDP\tTX\tTexas\tCameron County\t1304\t30.8\t22.6\t19.7\t13165\t70625\t0.6499\t78575\tRomney\t78575\t0.002545624\t78575.0\n20982\t-97.557974\t26.036875\tRancho Viejo town\tTX\tTexas\tCameron County\t2415\t37.2\t41.5\t11.6\t27775\t135227\t0.6499\t78575\tRomney\t78575\t0.0047144809999999995\t78575.0\n20983\t-97.628182\t26.03179\tEncantada-Ranchito El Calaboz CDP\tTX\tTexas\tCameron County\t2648\t25.7\t7.0\t15.0\t8929\t52453\t0.6499\t78586\tRomney\t78586\t0.005169336\t78586.0\n20984\t-97.613235\t26.088532\tLago CDP\tTX\tTexas\tCameron County\t273\t26.3\t6.3\t19.8\t8736\t60000\t0.6499\t78586\tRomney\t78586\t0.000532941\t78586.0\n20985\t-97.737325\t26.105125\tRangerville village\tTX\tTexas\tCameron County\t321\t28.1\t4.1\t17.5\t9761\t52500\t0.6499\t78552\tRomney\t78552\t0.000626645\t78552.0\n20986\t-97.823162\t26.178104\tLa Feria North CDP\tTX\tTexas\tCameron County\t132\t46.7\t10.2\t26.1\t12974\t37500\t0.6499\t78559\tRomney\t78559\t0.00025768599999999997\t78559.0\n20987\t-97.63951999999999\t26.140389000000003\tSan Benito city\tTX\tTexas\tCameron County\t24833\t30.0\t10.3\t16.1\t11146\t48825\t0.6499\t78586\tRomney\t78586\t0.048478138\t78586.0\n20988\t-97.167751\t26.111126000000002\tSouth Padre Island town\tTX\tTexas\tCameron County\t2873\t60.5\t33.9\t7.8\t34596\t150833\t0.6499\t78597\tRomney\t78597\t0.005608573\t78597.0\n20989\t-97.81553199999999\t26.318688\tYznaga CDP\tTX\tTexas\tCameron County\t108\t26.4\t8.8\t16.7\t9799\t57500\t0.6499\t78594\tRomney\t78594\t0.00021083400000000002\t78594.0\n20990\t-97.222925\t26.071720000000003\tPort Isabel city\tTX\tTexas\tCameron County\t4268\t34.4\t15.3\t7.8\t12558\t71747\t0.6499\t78578\tRomney\t78578\t0.008331844\t78578.0\n20991\t-97.42358\t26.057242000000002\tDel Mar Heights CDP\tTX\tTexas\tCameron County\t346\t22.2\t0.0\t10.7\t5882\t28125\t0.6499\t78566\tRomney\t78566\t0.000675449\t78566.0\n20992\t-97.82596\t26.074455\tBluetown-Iglesia Antigua CDP\tTX\tTexas\tCameron County\t728\t26.8\t3.6\t22.1\t8179\t42381\t0.6499\t78592\tRomney\t78592\t0.001421177\t78592.0\n20993\t-97.738764\t26.049158\tLos Indios town\tTX\tTexas\tCameron County\t1221\t27.6\t3.8\t17.3\t9722\t52500\t0.6499\t78592\tRomney\t78592\t0.002383595\t78592.0\n20994\t-97.477676\t26.073016\tLos Fresnos city\tTX\tTexas\tCameron County\t5766\t29.3\t15.3\t12.3\t11794\t66203\t0.6499\t78566\tRomney\t78566\t0.011256189\t78566.0\n20995\t-97.644382\t26.111558\tEl Camino Angosto CDP\tTX\tTexas\tCameron County\t251\t26.5\t3.9\t19.1\t8038\t49000\t0.6499\t78586\tRomney\t78586\t0.000489994\t78586.0\n20996\t-97.415774\t25.884518\tVilla Pancho CDP\tTX\tTexas\tCameron County\t372\t23.9\t0.0\t11.4\t6477\t52353\t0.6499\t78521\tRomney\t78521\t0.0007262060000000001\t78521.0\n20997\t-97.75466999999999\t26.201543\tPalm Valley city\tTX\tTexas\tCameron County\t1547\t58.0\t47.6\t6.6\t41018\t154891\t0.6499\t78552\tRomney\t78552\t0.0030200009999999996\t78552.0\n20998\t-97.414162\t25.922677\tReid Hope King CDP\tTX\tTexas\tCameron County\t950\t29.2\t10.0\t20.1\t11763\t43148\t0.6499\t78521\tRomney\t78521\t0.0018545579999999999\t78521.0\n20999\t-97.48751999999999\t26.116799\tLaureles CDP\tTX\tTexas\tCameron County\t4019\t26.5\t8.0\t14.2\t8929\t47429\t0.6499\t78566\tRomney\t78566\t0.007845755\t78566.0\n21000\t-97.736628\t26.202606\tLas Palmas-Juarez CDP\tTX\tTexas\tCameron County\t1693\t35.4\t11.1\t17.8\t13799\t51538\t0.6499\t78552\tRomney\t78552\t0.003305017\t78552.0\n21001\t-97.483025\t25.960631\tBrownsville city\tTX\tTexas\tCameron County\t171019\t28.7\t15.7\t15.9\t11625\t66413\t0.6499\t78526\tRomney\t78526\t0.333857473\t78526.0\n21002\t-97.668116\t26.048501\tLa Paloma CDP\tTX\tTexas\tCameron County\t397\t26.5\t3.9\t19.1\t8034\t48125\t0.6499\t78586\tRomney\t78586\t0.00077501\t78586.0\n21003\t-97.543734\t26.189519\tLozano CDP\tTX\tTexas\tCameron County\t332\t31.4\t13.8\t19.4\t9264\t46500\t0.6499\t785HH\tRomney\t785HH\t0.0006481190000000001\t0.0\n21004\t-97.856181\t26.140631\tBixby CDP\tTX\tTexas\tCameron County\t431\t34.5\t7.4\t13.9\t11298\t35000\t0.6499\t78559\tRomney\t78559\t0.0008413839999999999\t78559.0\n21005\t-97.561024\t26.121906\tGreen Valley Farms CDP\tTX\tTexas\tCameron County\t791\t26.4\t9.2\t15.0\t8417\t49722\t0.6499\t78586\tRomney\t78586\t0.0015441629999999999\t78586.0\n21006\t-97.578277\t26.191519\tVilla del Sol CDP\tTX\tTexas\tCameron County\t144\t31.4\t14.3\t18.6\t9371\t47500\t0.6499\t785HH\tRomney\t785HH\t0.00028111200000000003\t0.0\n21007\t-97.825928\t26.255090999999997\tSanta Rosa town\tTX\tTexas\tCameron County\t3280\t27.8\t6.4\t15.9\t9694\t45677\t0.6499\t78593\tRomney\t78593\t0.006403104000000001\t78593.0\n21008\t-97.30837700000001\t26.105733999999998\tLaguna Vista town\tTX\tTexas\tCameron County\t3095\t31.5\t26.9\t10.1\t18994\t115051\t0.6499\t78578\tRomney\t78578\t0.006041954\t78578.0\n21009\t-97.725218\t26.242649\tCombes town\tTX\tTexas\tCameron County\t2619\t33.9\t6.7\t14.8\t12968\t60702\t0.6499\t78550\tRomney\t78550\t0.005112723\t78550.0\n21010\t-97.48599300000001\t26.219547\tArroyo Gardens-La Tina Ranch CDP\tTX\tTexas\tCameron County\t756\t31.2\t13.9\t17.5\t9848\t47308\t0.6499\t78583\tRomney\t78583\t0.001475837\t78583.0\n21011\t-97.584117\t26.234633000000002\tRio Hondo city\tTX\tTexas\tCameron County\t2242\t36.3\t11.2\t15.1\t11761\t54873\t0.6499\t785HH\tRomney\t785HH\t0.004376756\t0.0\n21012\t-97.259553\t26.081897\tLaguna Heights CDP\tTX\tTexas\tCameron County\t2318\t26.9\t6.8\t14.4\t7248\t40000\t0.6499\t78578\tRomney\t78578\t0.004525121\t78578.0\n21013\t-97.611393\t26.18638\tArroyo Colorado Estates CDP\tTX\tTexas\tCameron County\t937\t29.7\t23.9\t12.9\t14997\t85769\t0.6499\t785HH\tRomney\t785HH\t0.00182918\t0.0\n21014\t-97.50308299999999\t26.087729\tIndian Lake town\tTX\tTexas\tCameron County\t611\t41.7\t15.5\t14.5\t13759\t48750\t0.6499\t78566\tRomney\t78566\t0.001192773\t78566.0\n21015\t-97.846643\t26.076708\tSanta Maria CDP\tTX\tTexas\tCameron County\t909\t27.1\t3.7\t22.1\t8179\t42333\t0.6499\t78592\tRomney\t78592\t0.001774519\t78592.0\n21016\t-97.443683\t26.074127999999998\tChula Vista-Orason CDP\tTX\tTexas\tCameron County\t419\t26.1\t12.7\t7.0\t11758\t75000\t0.6499\t78566\tRomney\t78566\t0.000817958\t78566.0\n21017\t-97.750615\t26.222865999999996\tPrimera town\tTX\tTexas\tCameron County\t2993\t28.3\t6.5\t14.4\t12566\t64561\t0.6499\t78552\tRomney\t78552\t0.005842833\t78552.0\n21018\t-97.827035\t26.27192\tTierra Bonita CDP\tTX\tTexas\tCameron County\t168\t26.1\t9.1\t15.6\t9774\t52500\t0.6499\t78593\tRomney\t78593\t0.00032796400000000003\t78593.0\n21019\t-97.382991\t25.872861999999998\tSouth Point CDP\tTX\tTexas\tCameron County\t1314\t27.8\t3.4\t21.5\t8928\t52625\t0.6499\t78521\tRomney\t78521\t0.002565146\t78521.0\n21020\t-97.39965500000001\t26.126129000000002\tBayview town\tTX\tTexas\tCameron County\t546\t27.3\t12.8\t10.8\t11208\t58125\t0.6499\t78566\tRomney\t78566\t0.001065883\t78566.0\n21021\t-97.82159399999999\t26.135296\tArroyo Alto CDP\tTX\tTexas\tCameron County\t337\t41.4\t11.0\t21.4\t14458\t65000\t0.6499\t78559\tRomney\t78559\t0.00065788\t78559.0\n21022\t-95.03071700000001\t33.028785\tRocky Mound town\tTX\tTexas\tCamp County\t117\t44.6\t11.8\t7.8\t19720\t100000\t0.3294\t75686\tRomney\t75686\t0.000228403\t75686.0\n21023\t-94.966974\t32.998022\tPittsburg city\tTX\tTexas\tCamp County\t4638\t35.0\t16.3\t10.9\t16276\t88925\t0.3294\t75686\tRomney\t75686\t0.009054145999999999\t75686.0\n21024\t-101.106461\t35.205175\tGroom town\tTX\tTexas\tCarson County\t516\t42.1\t20.5\t1.8\t19138\t69412\t0.1051\t79039\tRomney\t79039\t0.001007318\t79039.0\n21025\t-101.175139\t35.433254\tWhite Deer town\tTX\tTexas\tCarson County\t1035\t41.9\t13.6\t4.6\t19563\t61897\t0.1051\t79097\tRomney\t79097\t0.002020492\t79097.0\n21026\t-101.173348\t35.572858000000004\tSkellytown town\tTX\tTexas\tCarson County\t587\t45.9\t7.9\t8.0\t20205\t33500\t0.1051\t79080\tRomney\t79080\t0.001145921\t79080.0\n21027\t-101.380434\t35.346073\tPanhandle town\tTX\tTexas\tCarson County\t2569\t38.5\t18.2\t4.1\t22923\t66635\t0.1051\t79068\tRomney\t79068\t0.005015114\t79068.0\n21028\t-94.11834\t33.261586\tDomino town\tTX\tTexas\tCass County\t51\t40.6\t5.9\t9.5\t16092\t65000\t0.248\t75572\tRomney\t75572\t9.96e-05\t75572.0\n21029\t-94.553967\t32.898383\tAvinger town\tTX\tTexas\tCass County\t470\t47.7\t16.1\t15.3\t18642\t49722\t0.248\t75630\tRomney\t75630\t0.000917518\t75630.0\n21030\t-94.16546\t33.115726\tAtlanta city\tTX\tTexas\tCass County\t5571\t40.1\t16.1\t10.6\t17438\t71231\t0.248\t75551\tRomney\t75551\t0.010875517\t75551.0\n21031\t-94.362656\t33.010967\tLinden city\tTX\tTexas\tCass County\t2162\t44.8\t17.1\t13.8\t19288\t64688\t0.248\t75563\tRomney\t75563\t0.004220583\t75563.0\n21032\t-94.059084\t33.137797\tBloomburg town\tTX\tTexas\tCass County\t363\t44.0\t12.7\t10.3\t18753\t84286\t0.248\t75556\tRomney\t75556\t0.000708636\t75556.0\n21033\t-94.630765\t33.008988\tHughes Springs city\tTX\tTexas\tCass County\t1764\t39.3\t10.7\t12.1\t15245\t59524\t0.248\t75656\tRomney\t75656\t0.0034436209999999996\t75656.0\n21034\t-94.152215\t33.150698999999996\tQueen City\tTX\tTexas\tCass County\t1547\t37.7\t10.2\t8.2\t16229\t66429\t0.248\t75551\tRomney\t75551\t0.0030200009999999996\t75551.0\n21035\t-94.351938\t33.191646999999996\tDouglassville town\tTX\tTexas\tCass County\t187\t42.7\t6.0\t9.0\t17110\t65000\t0.248\t75560\tRomney\t75560\t0.000365055\t75560.0\n21036\t-94.542536\t33.173538\tMarietta town\tTX\tTexas\tCass County\t111\t47.9\t9.8\t11.9\t15199\t50000\t0.248\t75566\tRomney\t75566\t0.00021669\t75566.0\n21037\t-102.10243100000001\t34.541986\tNazareth city\tTX\tTexas\tCastro County\t294\t37.9\t23.6\t2.9\t19756\t80833\t0.2973\t79063\tRomney\t79063\t0.000573937\t79063.0\n21038\t-102.318105\t34.548584000000005\tDimmitt city\tTX\tTexas\tCastro County\t4165\t32.8\t17.0\t8.6\t15433\t58000\t0.2973\t79027\tRomney\t79027\t0.008130771\t79027.0\n21039\t-102.115205\t34.385723999999996\tHart city\tTX\tTexas\tCastro County\t982\t28.8\t9.6\t10.3\t12383\t39318\t0.2973\t79043\tRomney\t79043\t0.0019170270000000002\t79043.0\n21040\t-94.379475\t29.781396\tStowell CDP\tTX\tTexas\tChambers County\t1847\t38.8\t8.3\t16.8\t17903\t57800\t0.1893\t77665\tRomney\t77665\t0.0036056509999999996\t77665.0\n21041\t-94.854215\t29.760334999999998\tBeach City\tTX\tTexas\tChambers County\t1926\t41.1\t20.3\t7.5\t33709\t146791\t0.1893\t77520\tRomney\t77520\t0.003759872\t77520.0\n21042\t-94.867385\t29.889933000000003\tMont Belvieu city\tTX\tTexas\tChambers County\t2899\t35.6\t9.5\t9.2\t22723\t109722\t0.1893\t77521\tRomney\t77521\t0.005659329\t77521.0\n21043\t-94.824671\t29.875238\tOld River-Winfree city\tTX\tTexas\tChambers County\t1305\t37.6\t11.8\t10.0\t23214\t127500\t0.1893\t77597\tRomney\t77597\t0.002547577\t77597.0\n21044\t-94.678735\t29.764977000000002\tAnahuac city\tTX\tTexas\tChambers County\t2622\t35.6\t15.3\t12.7\t19541\t72857\t0.1893\t77514\tRomney\t77514\t0.005118579\t77514.0\n21045\t-94.831499\t29.810444\tCove city\tTX\tTexas\tChambers County\t514\t32.6\t20.1\t5.5\t28910\t193421\t0.1893\t77520\tRomney\t77520\t0.001003413\t77520.0\n21046\t-94.380876\t29.816774\tWinnie CDP\tTX\tTexas\tChambers County\t3482\t38.4\t7.6\t13.0\t17790\t60288\t0.1893\t77665\tRomney\t77665\t0.006797442\t77665.0\n21047\t-95.414731\t32.037437\tCuney town\tTX\tTexas\tCherokee County\t130\t41.3\t4.5\t4.1\t16935\t90000\t0.2403\t75759\tRomney\t75759\t0.00025378200000000003\t75759.0\n21048\t-95.262068\t31.964305\tJacksonville city\tTX\tTexas\tCherokee County\t14126\t33.6\t16.9\t13.0\t16012\t73610\t0.2403\t75766\tRomney\t75766\t0.027576297000000003\t75766.0\n21049\t-95.148501\t31.797738\tRusk city\tTX\tTexas\tCherokee County\t5279\t38.4\t9.8\t9.5\t16792\t79815\t0.2403\t75785\tRomney\t75785\t0.010305484\t75785.0\n21050\t-95.152011\t31.896929999999998\tGallatin city\tTX\tTexas\tCherokee County\t377\t39.8\t13.1\t6.3\t15638\t89375\t0.2403\t75764\tRomney\t75764\t0.000735967\t75764.0\n21051\t-94.947328\t31.491553999999997\tWells town\tTX\tTexas\tCherokee County\t764\t40.8\t10.5\t11.8\t16166\t63846\t0.2403\t75976\tRomney\t75976\t0.001491455\t75976.0\n21052\t-95.07096700000001\t31.650978000000002\tAlto town\tTX\tTexas\tCherokee County\t1176\t42.5\t9.0\t12.2\t14641\t65313\t0.2403\t75925\tRomney\t75925\t0.0022957470000000003\t75925.0\n21053\t-95.11567\t31.980662\tNew Summerfield city\tTX\tTexas\tCherokee County\t1030\t33.6\t10.1\t9.2\t13629\t52105\t0.2403\t75764\tRomney\t75764\t0.002010731\t75764.0\n21054\t-100.292087\t34.429361\tChildress city\tTX\tTexas\tChildress County\t6702\t37.2\t9.2\t6.8\t16871\t55629\t0.1603\t79201\tRomney\t79201\t0.013083416\t79201.0\n21055\t-98.347493\t33.882658\tJolly city\tTX\tTexas\tClay County\t195\t45.0\t13.4\t6.5\t19940\t93571\t0.1463\t76301\tRomney\t76301\t0.000380672\t76301.0\n21056\t-98.193437\t33.815826\tHenrietta city\tTX\tTexas\tClay County\t3109\t41.6\t17.0\t8.9\t19541\t50000\t0.1463\t76365\tRomney\t76365\t0.006069284\t76365.0\n21057\t-98.016341\t33.633485\tBellevue city\tTX\tTexas\tClay County\t361\t45.0\t17.0\t11.1\t20447\t60625\t0.1463\t76228\tRomney\t76228\t0.000704732\t76228.0\n21058\t-98.37512\t33.93006\tDean city\tTX\tTexas\tClay County\t357\t45.1\t13.8\t6.1\t19778\t92500\t0.1463\t76301\tRomney\t76301\t0.000696923\t76301.0\n21059\t-98.191163\t34.069681\tByers city\tTX\tTexas\tClay County\t479\t45.6\t18.5\t5.4\t17321\t72273\t0.1463\t76357\tRomney\t76357\t0.000935088\t76357.0\n21060\t-98.231367\t34.013273\tPetrolia city\tTX\tTexas\tClay County\t722\t37.9\t10.9\t12.1\t13545\t41220\t0.1463\t76377\tRomney\t76377\t0.001409464\t76377.0\n21061\t-102.75864399999999\t33.725196000000004\tMorton city\tTX\tTexas\tCochran County\t2025\t35.1\t9.9\t13.7\t13862\t28643\t0.2792\t79346\tRomney\t79346\t0.0039531359999999995\t79346.0\n21062\t-102.613417\t33.599523\tWhiteface town\tTX\tTexas\tCochran County\t390\t35.5\t17.1\t6.7\t17220\t34167\t0.2792\t79379\tRomney\t79379\t0.000761345\t79379.0\n21063\t-100.295397\t31.885886\tBronte town\tTX\tTexas\tCoke County\t1007\t37.3\t16.1\t6.0\t17954\t52500\t0.1271\t76933\tRomney\t76933\t0.001965831\t76933.0\n21064\t-100.48559200000001\t31.895388\tRobert Lee city\tTX\tTexas\tCoke County\t1078\t47.4\t12.7\t9.8\t19847\t51556\t0.1271\t76945\tRomney\t76945\t0.002104435\t76945.0\n21065\t-99.625281\t31.987571000000003\tNovice city\tTX\tTexas\tColeman County\t167\t48.3\t19.0\t12.1\t20176\t59000\t0.1266\t79538\tRomney\t79538\t0.000326012\t79538.0\n21066\t-99.42229\t31.831546000000003\tColeman city\tTX\tTexas\tColeman County\t4635\t43.0\t10.4\t7.9\t17121\t42235\t0.1266\t76834\tRomney\t76834\t0.009048289000000001\t76834.0\n21067\t-99.325772\t31.73698\tSanta Anna town\tTX\tTexas\tColeman County\t831\t43.2\t11.0\t13.4\t15637\t39643\t0.1266\t76878\tRomney\t76878\t0.00162225\t76878.0\n21068\t-96.793906\t33.157161\tFrisco city\tTX\tTexas\tCollin County\t113579\t34.9\t45.4\t6.3\t40485\t206317\t0.3349\t75035\tRomney\t75035\t0.22172505899999997\t75035.0\n21069\t-96.57602299999999\t33.283716\tMelissa city\tTX\tTexas\tCollin County\t2921\t37.3\t24.1\t6.4\t39802\t118955\t0.3349\t75454\tRomney\t75454\t0.0057022769999999995\t75454.0\n21070\t-96.549789\t33.35109\tAnna city\tTX\tTexas\tCollin County\t2117\t36.8\t13.6\t6.0\t23183\t118919\t0.3349\t75409\tRomney\t75409\t0.004132735\t75409.0\n21071\t-96.613777\t33.141119\tFairview town\tTX\tTexas\tCollin County\t7648\t36.1\t49.9\t5.5\t50134\t284638\t0.3349\t75002\tRomney\t75002\t0.014930165\t75002.0\n21072\t-96.43724\t33.028407\tLavon town\tTX\tTexas\tCollin County\t864\t37.7\t17.4\t5.9\t24472\t118056\t0.3349\t75166\tRomney\t75166\t0.001686671\t75166.0\n21073\t-96.63181800000001\t33.054132\tParker city\tTX\tTexas\tCollin County\t1599\t34.7\t50.9\t6.0\t47978\t225648\t0.3349\t75002\tRomney\t75002\t0.003121513\t75002.0\n21074\t-96.51308399999999\t33.038734000000005\tWylie city\tTX\tTexas\tCollin County\t34459\t33.3\t29.6\t6.5\t31090\t146442\t0.3349\t75098\tRomney\t75098\t0.06726968700000001\t75098.0\n21075\t-96.745142\t33.050036\tPlano city\tTX\tTexas\tCollin County\t288184\t35.9\t54.5\t7.8\t49975\t235023\t0.3349\t75023\tRomney\t75023\t0.562582999\t75023.0\n21076\t-96.45835600000001\t33.35752\tWestminster city\tTX\tTexas\tCollin County\t711\t39.9\t15.0\t6.5\t26211\t108438\t0.3349\t75485\tRomney\t75485\t0.00138799\t75485.0\n21077\t-96.581097\t33.097716\tLucas city\tTX\tTexas\tCollin County\t3657\t41.2\t43.8\t5.0\t49264\t259649\t0.3349\t75002\tRomney\t75002\t0.0071390709999999994\t75002.0\n21078\t-96.61148299999999\t33.018978000000004\tMurphy city\tTX\tTexas\tCollin County\t12729\t34.6\t47.0\t6.2\t43275\t221353\t0.3349\t75094\tRomney\t75094\t0.024849121000000002\t75094.0\n21079\t-96.550167\t33.044148\tSt. Paul town\tTX\tTexas\tCollin County\t1177\t34.7\t23.4\t5.7\t31482\t152455\t0.3349\t75098\tRomney\t75098\t0.002297699\t75098.0\n21080\t-96.783863\t33.318571999999996\tCelina town\tTX\tTexas\tCollin County\t2765\t33.9\t18.2\t8.6\t26385\t110734\t0.3349\t75009\tRomney\t75009\t0.005397739\t75009.0\n21081\t-96.288894\t33.062932\tJosephine city\tTX\tTexas\tCollin County\t604\t35.6\t12.4\t6.9\t22667\t100000\t0.3349\t75164\tRomney\t75164\t0.0011791080000000001\t75164.0\n21082\t-96.667146\t33.346517\tWeston city\tTX\tTexas\tCollin County\t753\t41.7\t27.8\t7.7\t31545\t160294\t0.3349\t75009\tRomney\t75009\t0.001469981\t75009.0\n21083\t-96.40056700000001\t33.300052\tBlue Ridge city\tTX\tTexas\tCollin County\t720\t37.6\t15.1\t8.6\t23498\t109926\t0.3349\t75424\tRomney\t75424\t0.00140556\t75424.0\n21084\t-96.663285\t33.196639000000005\tMcKinney city\tTX\tTexas\tCollin County\t133825\t32.6\t46.5\t6.8\t45016\t225211\t0.3349\t75070\tRomney\t75070\t0.261248612\t75070.0\n21085\t-96.673889\t33.108518\tAllen city\tTX\tTexas\tCollin County\t85173\t32.3\t51.7\t6.2\t43668\t224155\t0.3349\t75013\tRomney\t75013\t0.166271833\t75013.0\n21086\t-96.358423\t33.15879\tFarmersville city\tTX\tTexas\tCollin County\t3722\t34.7\t13.5\t10.2\t22112\t92324\t0.3349\t75442\tRomney\t75442\t0.007265962\t75442.0\n21087\t-96.506035\t33.186485\tPrinceton city\tTX\tTexas\tCollin County\t5185\t36.2\t14.2\t7.2\t22765\t103558\t0.3349\t75407\tRomney\t75407\t0.010121981\t75407.0\n21088\t-96.3706\t33.038885\tNevada city\tTX\tTexas\tCollin County\t665\t37.0\t16.6\t6.3\t24408\t117969\t0.3349\t75173\tRomney\t75173\t0.00129819\t75173.0\n21089\t-96.56484300000001\t33.211878000000006\tNew Hope town\tTX\tTexas\tCollin County\t760\t38.4\t18.9\t6.2\t25699\t123026\t0.3349\t75069\tRomney\t75069\t0.0014836460000000001\t75069.0\n21090\t-96.799859\t33.234964\tProsper town\tTX\tTexas\tCollin County\t3710\t30.6\t33.4\t5.8\t35716\t159167\t0.3349\t75078\tRomney\t75078\t0.007242536\t75078.0\n21091\t-96.544788\t33.169346999999995\tLowry Crossing city\tTX\tTexas\tCollin County\t1678\t36.6\t15.5\t6.8\t26577\t119744\t0.3349\t75407\tRomney\t75407\t0.003275735\t75407.0\n21092\t-100.28143\t35.050104\tSamnorwood CDP\tTX\tTexas\tCollingsworth County\t31\t47.5\t21.7\t0.0\t19060\t50000\t0.1539\t79079\tRomney\t79079\t6.05e-05\t79079.0\n21093\t-100.02044699999999\t34.76535\tDodson town\tTX\tTexas\tCollingsworth County\t92\t50.0\t23.6\t1.8\t18936\t60000\t0.1539\t79230\tRomney\t79230\t0.000179599\t79230.0\n21094\t-100.391803\t34.915021\tQuail CDP\tTX\tTexas\tCollingsworth County\t26\t45.0\t23.8\t0.0\t19211\t60000\t0.1539\t79251\tRomney\t79251\t5.08e-05\t79251.0\n21095\t-100.214122\t34.853781\tWellington city\tTX\tTexas\tCollingsworth County\t2249\t41.1\t14.0\t5.5\t17462\t44918\t0.1539\t79095\tRomney\t79095\t0.004390420999999999\t79095.0\n21096\t-96.556722\t29.705558\tColumbus city\tTX\tTexas\tColorado County\t3993\t43.4\t19.0\t6.3\t18490\t104917\t0.25\t78934\tRomney\t78934\t0.007794999\t78934.0\n21097\t-96.32847199999999\t29.587278\tEagle Lake city\tTX\tTexas\tColorado County\t3658\t36.5\t12.0\t12.1\t17064\t61103\t0.25\t77434\tRomney\t77434\t0.007141023000000001\t77434.0\n21098\t-96.777582\t29.700082000000002\tWeimar city\tTX\tTexas\tColorado County\t2069\t44.5\t15.0\t8.0\t19031\t77661\t0.25\t78962\tRomney\t78962\t0.004039030999999999\t78962.0\n21099\t-98.291958\t29.637643\tGarden Ridge city\tTX\tTexas\tComal County\t3240\t49.3\t43.7\t3.6\t40695\t297049\t0.2222\t78266\tRomney\t78266\t0.006325018000000001\t78266.0\n21100\t-98.26171\t29.876246000000002\tCanyon Lake CDP\tTX\tTexas\tComal County\t23359\t46.7\t23.2\t8.7\t24720\t126718\t0.2222\t78133\tRomney\t78133\t0.045600645\t78133.0\n21101\t-98.44972299999999\t29.764179\tBulverde city\tTX\tTexas\tComal County\t4817\t43.4\t32.4\t4.7\t32846\t231348\t0.2222\t78163\tRomney\t78163\t0.009403583\t78163.0\n21102\t-98.118369\t29.705778999999996\tNew Braunfels city\tTX\tTexas\tComal County\t50006\t38.4\t26.1\t6.8\t23201\t133749\t0.2222\t78130\tRomney\t78130\t0.09762001199999999\t78130.0\n21103\t-98.604602\t31.900462\tComanche city\tTX\tTexas\tComanche County\t4077\t38.5\t10.1\t7.6\t15374\t51522\t0.1814\t76442\tRomney\t76442\t0.007958981\t76442.0\n21104\t-98.402562\t31.845692\tGustine town\tTX\tTexas\tComanche County\t486\t42.4\t11.5\t5.1\t16684\t68750\t0.1814\t76455\tRomney\t76455\t0.000948753\t76455.0\n21105\t-98.536459\t32.111166\tDe Leon city\tTX\tTexas\tComanche County\t2325\t38.1\t11.3\t7.2\t14954\t46438\t0.1814\t76444\tRomney\t76444\t0.0045387859999999995\t76444.0\n21106\t-99.92534\t31.509973\tPaint Rock town\tTX\tTexas\tConcho County\t281\t46.3\t18.6\t5.4\t19280\t58333\t0.1938\t76866\tRomney\t76866\t0.000548559\t76866.0\n21107\t-99.843992\t31.216002000000003\tEden city\tTX\tTexas\tConcho County\t2526\t34.3\t13.0\t4.5\t17532\t49643\t0.1938\t76837\tRomney\t76837\t0.004931171\t76837.0\n21108\t-97.018051\t33.698199\tCallisburg city\tTX\tTexas\tCooke County\t452\t37.5\t14.0\t6.1\t18508\t120000\t0.1565\t76273\tRomney\t76273\t0.000882379\t76273.0\n21109\t-97.151038\t33.638705\tGainesville city\tTX\tTexas\tCooke County\t16122\t35.0\t15.7\t10.4\t17795\t81903\t0.1565\t76240\tRomney\t76240\t0.03147282\t76240.0\n21110\t-97.22081700000001\t33.636383\tLindsay town\tTX\tTexas\tCooke County\t859\t38.2\t21.0\t3.5\t21324\t129779\t0.1565\t76250\tRomney\t76250\t0.0016769110000000001\t76250.0\n21111\t-97.012905\t33.570336\tLake Kiowa CDP\tTX\tTexas\tCooke County\t2041\t60.5\t25.7\t5.8\t33143\t201325\t0.1565\t76233\tRomney\t76233\t0.003984371\t76233.0\n21112\t-97.376875\t33.651901\tMuenster city\tTX\tTexas\tCooke County\t1659\t38.5\t17.4\t3.9\t20977\t115625\t0.1565\t76252\tRomney\t76252\t0.003238643\t76252.0\n21113\t-97.16120500000001\t33.485147999999995\tValley View town\tTX\tTexas\tCooke County\t808\t35.0\t18.7\t5.6\t20247\t101293\t0.1565\t76272\tRomney\t76272\t0.00157735\t76272.0\n21114\t-97.038299\t33.648171000000005\tOak Ridge town\tTX\tTexas\tCooke County\t229\t32.0\t16.2\t9.4\t18235\t101389\t0.1565\t76240\tRomney\t76240\t0.000447046\t76240.0\n21115\t-97.679165\t31.439727\tSouth Mountain town\tTX\tTexas\tCoryell County\t428\t36.2\t10.0\t6.0\t17515\t78929\t0.3106\t76528\tRomney\t76528\t0.000835527\t76528.0\n21116\t-97.51129499999999\t31.418605\tOglesby city\tTX\tTexas\tCoryell County\t480\t35.6\t13.5\t2.8\t19517\t70000\t0.3106\t76561\tRomney\t76561\t0.00093704\t76561.0\n21117\t-97.876547\t31.118885\tCopperas Cove city\tTX\tTexas\tCoryell County\t30392\t28.5\t18.1\t10.8\t19756\t89340\t0.3106\t76522\tRomney\t76522\t0.059330228\t76522.0\n21118\t-97.743687\t31.442409\tGatesville city\tTX\tTexas\tCoryell County\t15789\t36.0\t9.0\t8.0\t16751\t72051\t0.3106\t76528\tRomney\t76528\t0.030822749\t76528.0\n21119\t-98.14938199999999\t31.480713\tEvant town\tTX\tTexas\tCoryell County\t386\t48.6\t17.0\t4.9\t19874\t80625\t0.3106\t76525\tRomney\t76525\t0.0007535360000000001\t76525.0\n21120\t-100.303751\t34.014480999999996\tPaducah town\tTX\tTexas\tCottle County\t1317\t47.5\t16.0\t6.3\t17866\t32946\t0.2429\t79248\tRomney\t79248\t0.002571003\t79248.0\n21121\t-102.350475\t31.391996000000002\tCrane city\tTX\tTexas\tCrane County\t3310\t34.8\t14.8\t9.9\t15982\t49930\t0.2143\t79731\tRomney\t79731\t0.006461669000000001\t79731.0\n21122\t-101.20608399999999\t30.707341999999997\tOzona CDP\tTX\tTexas\tCrockett County\t3436\t38.2\t10.2\t9.3\t16252\t60068\t0.3294\t76943\tRomney\t76943\t0.006707642\t76943.0\n21123\t-101.23791800000001\t33.641341\tCrosbyton city\tTX\tTexas\tCrosby County\t1771\t36.7\t15.8\t11.8\t16043\t41471\t0.3576\t79322\tRomney\t79322\t0.003457286\t79322.0\n21124\t-101.384559\t33.678719\tRalls city\tTX\tTexas\tCrosby County\t2107\t34.5\t8.9\t10.7\t13971\t39333\t0.3576\t79357\tRomney\t79357\t0.0041132140000000005\t79357.0\n21125\t-101.53524\t33.670308\tLorenzo city\tTX\tTexas\tCrosby County\t1027\t34.3\t11.9\t11.5\t13447\t42717\t0.3576\t79343\tRomney\t79343\t0.002004874\t79343.0\n21126\t-104.83487099999999\t31.040668\tVan Horn town\tTX\tTexas\tCulberson County\t1999\t31.6\t14.8\t2.6\t12907\t36915\t0.6462\t79855\tRomney\t79855\t0.00390238\t79855.0\n21127\t-103.018858\t36.376481\tTexline town\tTX\tTexas\tDallam County\t510\t37.3\t18.8\t2.9\t15383\t61000\t0.1649\t79087\tRomney\t79087\t0.000995605\t79087.0\n21128\t-102.506523\t36.06658\tDalhart city\tTX\tTexas\tDallam County\t7404\t35.4\t15.1\t5.8\t19517\t76722\t0.1649\t79022\tRomney\t79022\t0.014453836999999999\t79022.0\n21129\t-96.70760600000001\t32.643871000000004\tHutchins city\tTX\tTexas\tDallas County\t2914\t32.2\t4.4\t13.2\t18494\t49291\t0.5711\t75141\tRomney\t75141\t0.005688611999999999\t75141.0\n21130\t-96.616566\t32.718265\tBalch Springs city\tTX\tTexas\tDallas County\t22667\t29.0\t6.4\t11.9\t18474\t70231\t0.5711\t75180\tRomney\t75180\t0.044249746\t75180.0\n21131\t-96.68341099999999\t32.58956\tWilmer city\tTX\tTexas\tDallas County\t3761\t30.7\t6.0\t12.6\t16250\t41311\t0.5711\t75172\tRomney\t75172\t0.007342095999999999\t75172.0\n21132\t-96.80131899999999\t32.831032\tHighland Park town\tTX\tTexas\tDallas County\t8710\t44.8\t75.7\t6.6\t82505\t839149\t0.5711\t75205\tRomney\t75205\t0.017003366000000002\t75205.0\n21133\t-96.512843\t32.917074\tRowlett city\tTX\tTexas\tDallas County\t54153\t34.2\t33.1\t6.9\t30985\t139020\t0.5711\t75089\tRomney\t75089\t0.105715644\t75089.0\n21134\t-96.88855699999999\t32.738203000000006\tCockrell Hill city\tTX\tTexas\tDallas County\t4428\t26.2\t5.0\t12.5\t13156\t64381\t0.5711\t75211\tRomney\t75211\t0.008644190999999999\t75211.0\n21135\t-96.557743\t32.797309999999996\tSunnyvale town\tTX\tTexas\tDallas County\t4187\t43.5\t30.2\t7.0\t40679\t188628\t0.5711\t75182\tRomney\t75182\t0.008173719\t75182.0\n21136\t-96.855132\t32.557790999999995\tGlenn Heights city\tTX\tTexas\tDallas County\t10883\t32.1\t20.7\t7.2\t23824\t97251\t0.5711\t75115\tRomney\t75115\t0.021245422000000003\t75115.0\n21137\t-96.912708\t32.646042\tDuncanville city\tTX\tTexas\tDallas County\t38562\t37.6\t28.6\t7.3\t27786\t108674\t0.5711\t75137\tRomney\t75137\t0.075279424\t75137.0\n21138\t-96.957334\t32.585177\tCedar Hill city\tTX\tTexas\tDallas County\t42952\t33.0\t28.5\t7.2\t27454\t113932\t0.5711\t75104\tRomney\t75104\t0.083849433\t75104.0\n21139\t-96.505705\t32.658171\tSeagoville city\tTX\tTexas\tDallas County\t13894\t34.2\t7.0\t9.1\t19159\t62405\t0.5711\t75159\tRomney\t75159\t0.027123394\t75159.0\n21140\t-96.835645\t32.958578\tAddison town\tTX\tTexas\tDallas County\t14395\t32.6\t49.0\t8.1\t43864\t235192\t0.5711\t75001\tRomney\t75001\t0.028101429\t75001.0\n21141\t-96.793749\t32.850590000000004\tUniversity Park city\tTX\tTexas\tDallas County\t24235\t31.3\t81.1\t5.4\t56194\t653657\t0.5711\t75225\tRomney\t75225\t0.047310742\t75225.0\n21142\t-96.97035799999999\t32.858216999999996\tIrving city\tTX\tTexas\tDallas County\t209617\t31.3\t30.2\t8.3\t29419\t114257\t0.5711\t75062\tRomney\t75062\t0.409207175\t75062.0\n21143\t-96.863327\t32.599499\tDeSoto city\tTX\tTexas\tDallas County\t48322\t37.3\t31.1\t7.8\t30477\t123282\t0.5711\t75115\tRomney\t75115\t0.09433256400000001\t75115.0\n21144\t-96.68324100000001\t32.994484\tRichardson city\tTX\tTexas\tDallas County\t104441\t37.5\t48.2\t7.3\t35597\t155399\t0.5711\t75082\tRomney\t75082\t0.20388616699999998\t75082.0\n21145\t-96.498001\t32.999607\tDallas city\tTX\tTexas\tDallas County\t1292014\t31.7\t27.4\t11.0\t25511\t103630\t0.5711\t75098\tRomney\t75098\t2.522225769\t75098.0\n21146\t-96.880398\t32.927253\tFarmers Branch city\tTX\tTexas\tDallas County\t28384\t36.2\t25.2\t7.7\t26997\t115538\t0.5711\t75234\tRomney\t75234\t0.05541027900000001\t75234.0\n21147\t-96.781088\t32.59554\tLancaster city\tTX\tTexas\tDallas County\t33092\t32.9\t19.1\t11.1\t23212\t89515\t0.5711\t75146\tRomney\t75146\t0.064601076\t75146.0\n21148\t-96.990963\t32.991213\tCoppell city\tTX\tTexas\tDallas County\t40711\t34.4\t62.8\t5.6\t46520\t233028\t0.5711\t75019\tRomney\t75019\t0.079474629\t75019.0\n21149\t-96.516513\t32.768372\tMesquite city\tTX\tTexas\tDallas County\t139852\t32.7\t19.3\t7.7\t25820\t105054\t0.5711\t75181\tRomney\t75181\t0.27301431600000003\t75181.0\n21150\t-97.00497\t32.704215999999995\tGrand Prairie city\tTX\tTexas\tDallas County\t169408\t31.7\t22.2\t9.1\t24667\t107680\t0.5711\t75051\tRomney\t75051\t0.33071253300000003\t75051.0\n21151\t-96.509275\t32.984952\tGarland city\tTX\tTexas\tDallas County\t230518\t32.9\t22.3\t8.7\t24827\t106382\t0.5711\t75098\tRomney\t75098\t0.450009396\t75098.0\n21152\t-96.578176\t32.991307\tSachse city\tTX\tTexas\tDallas County\t17423\t33.9\t30.4\t5.8\t32337\t141531\t0.5711\t75048\tRomney\t75048\t0.034012587999999996\t75048.0\n21153\t-101.71526800000001\t32.526984000000006\tAckerly city\tTX\tTexas\tDawson County\t229\t41.6\t8.9\t4.0\t20565\t83571\t0.2798\t79713\tRomney\t79713\t0.000447046\t79713.0\n21154\t-101.91744399999999\t32.718749\tLos Ybanez city\tTX\tTexas\tDawson County\t31\t35.0\t4.0\t0.0\t15099\t87500\t0.2798\t79331\tRomney\t79331\t6.05e-05\t79331.0\n21155\t-101.955513\t32.733594000000004\tLamesa city\tTX\tTexas\tDawson County\t9247\t36.5\t14.4\t10.8\t16789\t47500\t0.2798\t79331\tRomney\t79331\t0.018051678999999998\t79331.0\n21156\t-102.39894100000001\t34.823365\tHereford city\tTX\tTexas\tDeaf Smith County\t14914\t30.4\t14.2\t8.2\t14708\t66949\t0.2875\t79045\tRomney\t79045\t0.029114603\t79045.0\n21157\t-95.85039\t33.438107\tPecan Gap city\tTX\tTexas\tDelta County\t204\t44.6\t13.8\t8.8\t18255\t46389\t0.225\t75469\tRomney\t75469\t0.000398242\t75469.0\n21158\t-95.691022\t33.371778000000006\tCooper city\tTX\tTexas\tDelta County\t2134\t37.7\t15.0\t10.4\t16328\t47346\t0.225\t75432\tRomney\t75432\t0.004165922\t75432.0\n21159\t-97.029658\t33.10999\tHickory Creek town\tTX\tTexas\tDenton County\t2752\t42.5\t30.1\t7.4\t41246\t162295\t0.3335\t75065\tRomney\t75065\t0.005372361\t75065.0\n21160\t-97.168929\t33.004211\tTrophy Club town\tTX\tTexas\tDenton County\t7966\t40.0\t46.8\t7.1\t48207\t240686\t0.3335\t76262\tRomney\t76262\t0.015550953999999999\t76262.0\n21161\t-96.999033\t33.227508\tCross Roads town\tTX\tTexas\tDenton County\t1123\t40.0\t28.8\t4.8\t33374\t146944\t0.3335\t76227\tRomney\t76227\t0.0021922820000000003\t76227.0\n21162\t-97.208264\t33.021879\tMarshall Creek town\tTX\tTexas\tDenton County\t438\t33.5\t32.1\t6.8\t32344\t178846\t0.3335\t76262\tRomney\t76262\t0.000855049\t76262.0\n21163\t-97.023612\t33.127678\tLake Dallas city\tTX\tTexas\tDenton County\t6885\t34.2\t22.9\t10.9\t28235\t131437\t0.3335\t75065\tRomney\t75065\t0.013440663\t75065.0\n21164\t-97.25562\t33.083428000000005\tNorthlake town\tTX\tTexas\tDenton County\t1382\t34.4\t25.1\t5.8\t31800\t139103\t0.3335\t76247\tRomney\t76247\t0.002697893\t76247.0\n21165\t-96.984049\t33.304472\tAubrey city\tTX\tTexas\tDenton County\t2564\t39.1\t24.6\t5.9\t26504\t153354\t0.3335\t76227\tRomney\t76227\t0.005005354\t76227.0\n21166\t-96.984921\t33.045190999999996\tLewisville city\tTX\tTexas\tDenton County\t101527\t31.4\t37.2\t8.0\t32548\t164698\t0.3335\t75057\tRomney\t75057\t0.198197555\t75057.0\n21167\t-97.186233\t33.110889\tArgyle city\tTX\tTexas\tDenton County\t3419\t44.3\t45.6\t4.6\t43647\t299038\t0.3335\t76226\tRomney\t76226\t0.006674455\t76226.0\n21168\t-97.176569\t33.362655\tSanger city\tTX\tTexas\tDenton County\t5611\t36.5\t18.6\t7.7\t23330\t108333\t0.3335\t76266\tRomney\t76266\t0.010953603000000001\t76266.0\n21169\t-96.917776\t33.149103000000004\tHackberry town\tTX\tTexas\tDenton County\t1030\t36.9\t23.1\t6.2\t26669\t149679\t0.3335\t75068\tRomney\t75068\t0.002010731\t75068.0\n21170\t-97.291089\t33.178405\tPonder town\tTX\tTexas\tDenton County\t1388\t37.0\t19.7\t5.8\t25421\t135746\t0.3335\t76259\tRomney\t76259\t0.002709606\t76259.0\n21171\t-96.972928\t33.22578\tLincoln Park town\tTX\tTexas\tDenton County\t674\t36.7\t31.5\t7.3\t22491\t130682\t0.3335\t76227\tRomney\t76227\t0.00131576\t76227.0\n21172\t-97.228849\t33.266704\tKrum city\tTX\tTexas\tDenton County\t2968\t35.4\t29.1\t8.6\t26213\t130669\t0.3335\t76249\tRomney\t76249\t0.005794029\t76249.0\n21173\t-97.09768299999999\t33.096153\tCopper Canyon town\tTX\tTexas\tDenton County\t1427\t40.8\t52.9\t5.4\t54020\t304206\t0.3335\t75077\tRomney\t75077\t0.0027857409999999996\t75077.0\n21174\t-97.140569\t33.205088\tDenton city\tTX\tTexas\tDenton County\t116127\t28.5\t36.7\t9.7\t25695\t143649\t0.3335\t76201\tRomney\t76201\t0.226699178\t76201.0\n21175\t-96.934117\t33.162240000000004\tLittle Elm town\tTX\tTexas\tDenton County\t13910\t31.6\t19.6\t6.7\t23237\t133133\t0.3335\t75068\tRomney\t75068\t0.027154629\t75068.0\n21176\t-96.99096899999999\t33.17953\tOak Point city\tTX\tTexas\tDenton County\t3202\t40.0\t31.0\t4.8\t34457\t142273\t0.3335\t75068\tRomney\t75068\t0.006250835\t75068.0\n21177\t-96.975422\t33.137874\tLakewood Village city\tTX\tTexas\tDenton County\t622\t41.1\t30.8\t4.1\t37870\t145109\t0.3335\t75068\tRomney\t75068\t0.001214247\t75068.0\n21178\t-96.896245\t33.056455\tHebron town\tTX\tTexas\tDenton County\t3963\t35.6\t49.4\t4.9\t41534\t222996\t0.3335\t75056\tRomney\t75056\t0.007736434\t75056.0\n21179\t-96.89761899999999\t33.09209\tThe Colony city\tTX\tTexas\tDenton County\t41697\t33.0\t33.6\t6.6\t36266\t141546\t0.3335\t75056\tRomney\t75056\t0.081399465\t75056.0\n21180\t-97.068487\t33.143407\tCorinth city\tTX\tTexas\tDenton County\t18905\t33.7\t38.0\t6.9\t36864\t191303\t0.3335\t76205\tRomney\t76205\t0.036905698\t76205.0\n21181\t-97.233992\t33.01175\tRoanoke city\tTX\tTexas\tDenton County\t6027\t31.9\t29.8\t6.1\t31942\t154754\t0.3335\t76262\tRomney\t76262\t0.011765703999999998\t76262.0\n21182\t-97.15099000000001\t33.080539\tBartonville town\tTX\tTexas\tDenton County\t1387\t42.1\t42.0\t6.2\t47141\t298684\t0.3335\t76226\tRomney\t76226\t0.0027076540000000003\t76226.0\n21183\t-97.06152800000001\t33.089515999999996\tHighland Village city\tTX\tTexas\tDenton County\t15935\t39.4\t55.1\t5.5\t49520\t261447\t0.3335\t75077\tRomney\t75077\t0.031107765\t75077.0\n21184\t-96.84125\t33.022783000000004\tCarrollton city\tTX\tTexas\tDenton County\t130758\t34.8\t38.6\t7.4\t33234\t165263\t0.3335\t75287\tRomney\t75287\t0.255261318\t75287.0\n21185\t-97.300708\t33.085939\tJustin city\tTX\tTexas\tDenton County\t3322\t39.2\t19.1\t6.6\t24266\t137610\t0.3335\t76247\tRomney\t76247\t0.006485095\t76247.0\n21186\t-97.067234\t33.033308\tFlower Mound town\tTX\tTexas\tDenton County\t66995\t33.5\t55.0\t6.5\t43505\t240240\t0.3335\t75028\tRomney\t75028\t0.130785359\t75028.0\n21187\t-97.226749\t33.09879\tCorral City town\tTX\tTexas\tDenton County\t97\t37.9\t23.4\t6.3\t27799\t140625\t0.3335\t76226\tRomney\t76226\t0.00018936\t76226.0\n21188\t-97.039355\t33.162597\tShady Shores town\tTX\tTexas\tDenton County\t2598\t32.7\t32.6\t6.1\t34674\t189597\t0.3335\t75065\tRomney\t75065\t0.005071727\t75065.0\n21189\t-97.110421\t33.064434000000006\tDouble Oak town\tTX\tTexas\tDenton County\t2817\t44.2\t54.4\t6.0\t52225\t350195\t0.3335\t75022\tRomney\t75022\t0.005499252\t75022.0\n21190\t-96.991412\t33.280601000000004\tKrugerville city\tTX\tTexas\tDenton County\t1516\t39.1\t24.9\t5.9\t26426\t152557\t0.3335\t76227\tRomney\t76227\t0.002959484\t76227.0\n21191\t-96.95551400000001\t33.397337\tPilot Point city\tTX\tTexas\tDenton County\t4919\t36.0\t19.6\t6.2\t22616\t115417\t0.3335\t76258\tRomney\t76258\t0.009602704\t76258.0\n21192\t-97.287414\t29.094565999999997\tCuero city\tTX\tTexas\tDeWitt County\t6394\t40.8\t12.3\t8.0\t15855\t56212\t0.221\t77954\tRomney\t77954\t0.012482149\t77954.0\n21193\t-97.614068\t28.923776\tNordheim city\tTX\tTexas\tDeWitt County\t346\t46.1\t16.0\t5.6\t18865\t67500\t0.221\t78141\tRomney\t78141\t0.000675449\t78141.0\n21194\t-97.505046\t28.982783\tYorktown city\tTX\tTexas\tDeWitt County\t2144\t44.7\t11.6\t11.4\t16603\t55000\t0.221\t78164\tRomney\t78164\t0.004185444\t78164.0\n21195\t-100.855599\t33.469815999999994\tSpur city\tTX\tTexas\tDickens County\t1049\t47.2\t9.8\t9.3\t16879\t27308\t0.212\t79370\tRomney\t79370\t0.002047822\t79370.0\n21196\t-100.83668399999999\t33.621356\tDickens city\tTX\tTexas\tDickens County\t298\t36.1\t7.7\t6.5\t16464\t46875\t0.212\t79229\tRomney\t79229\t0.000581745\t79229.0\n21197\t-99.858703\t28.526469\tCarrizo Springs city\tTX\tTexas\tDimmit County\t5508\t32.6\t9.9\t16.9\t11673\t45086\t0.7340000000000001\t78834\tRomney\t78834\t0.01075253\t78834.0\n21198\t-99.67576600000001\t28.598591\tBrundage CDP\tTX\tTexas\tDimmit County\t30\t42.5\t0.0\t18.2\t8132\t22500\t0.7340000000000001\t78839\tRomney\t78839\t5.8599999999999995e-05\t78839.0\n21199\t-99.829334\t28.503176\tCarrizo Hill CDP\tTX\tTexas\tDimmit County\t548\t29.1\t14.3\t8.5\t12449\t40500\t0.7340000000000001\t78834\tRomney\t78834\t0.001069787\t78834.0\n21200\t-99.570269\t28.569817999999998\tBig Wells city\tTX\tTexas\tDimmit County\t677\t43.8\t1.6\t15.3\t8191\t25625\t0.7340000000000001\t78830\tRomney\t78830\t0.001321616\t78830.0\n21201\t-99.616128\t28.349801\tCatarina CDP\tTX\tTexas\tDimmit County\t142\t35.4\t14.0\t13.1\t12347\t42500\t0.7340000000000001\t78836\tRomney\t78836\t0.000277208\t78836.0\n21202\t-99.760508\t28.445721000000002\tAsherton city\tTX\tTexas\tDimmit County\t1231\t35.2\t10.8\t14.1\t10918\t26161\t0.7340000000000001\t78827\tRomney\t78827\t0.002403116\t78827.0\n21203\t-100.90826700000001\t35.035548\tHowardwick city\tTX\tTexas\tDonley County\t448\t55.3\t13.4\t1.8\t20157\t73750\t0.1472\t79226\tRomney\t79226\t0.00087457\t79226.0\n21204\t-100.65921800000001\t34.867364\tHedley city\tTX\tTexas\tDonley County\t366\t43.6\t13.7\t8.0\t17174\t45000\t0.1472\t79237\tRomney\t79237\t0.0007144930000000001\t79237.0\n21205\t-100.891773\t34.936648\tClarendon city\tTX\tTexas\tDonley County\t2018\t37.4\t18.4\t6.8\t18527\t60250\t0.1472\t79226\tRomney\t79226\t0.003939471\t79226.0\n21206\t-98.409559\t27.598208000000003\tBenavides city\tTX\tTexas\tDuval County\t1380\t38.3\t15.5\t16.0\t13053\t30800\t0.7668\t78384\tRomney\t78384\t0.0026939890000000004\t78384.0\n21207\t-98.35560799999999\t27.39514\tConcepcion CDP\tTX\tTexas\tDuval County\t51\t50.6\t8.1\t10.0\t13017\t30000\t0.7668\t78349\tRomney\t78349\t9.96e-05\t78349.0\n21208\t-98.618672\t27.882543\tFreer city\tTX\tTexas\tDuval County\t2730\t31.7\t7.3\t10.2\t14229\t36866\t0.7668\t78357\tRomney\t78357\t0.005329413000000001\t78357.0\n21209\t-98.530232\t27.448607\tRealitos CDP\tTX\tTexas\tDuval County\t173\t49.4\t8.3\t11.3\t13141\t32500\t0.7668\t78376\tRomney\t78376\t0.000337725\t78376.0\n21210\t-98.232162\t27.762983000000002\tSan Diego city\tTX\tTexas\tDuval County\t5066\t30.0\t9.4\t13.0\t11588\t31139\t0.7668\t78332\tRomney\t78332\t0.009889673\t78332.0\n21211\t-98.979973\t32.384962\tCisco city\tTX\tTexas\tEastland County\t3820\t40.1\t13.4\t13.8\t15672\t37286\t0.1493\t76437\tRomney\t76437\t0.007457274\t76437.0\n21212\t-98.81907199999999\t32.401389\tEastland city\tTX\tTexas\tEastland County\t3747\t40.7\t11.9\t7.6\t18087\t55567\t0.1493\t76448\tRomney\t76448\t0.0073147659999999995\t76448.0\n21213\t-98.67206\t32.213553999999995\tGorman city\tTX\tTexas\tEastland County\t1240\t41.4\t11.7\t5.1\t16082\t47069\t0.1493\t76454\tRomney\t76454\t0.002420686\t76454.0\n21214\t-98.675112\t32.469361\tRanger city\tTX\tTexas\tEastland County\t2606\t36.5\t15.6\t9.0\t15396\t33389\t0.1493\t76470\tRomney\t76470\t0.005087345\t76470.0\n21215\t-98.966185\t32.097566\tRising Star town\tTX\tTexas\tEastland County\t805\t46.4\t14.2\t7.8\t17265\t34231\t0.1493\t76471\tRomney\t76471\t0.0015714939999999999\t76471.0\n21216\t-98.827246\t32.268383\tCarbon town\tTX\tTexas\tEastland County\t209\t45.2\t25.0\t3.8\t17933\t72500\t0.1493\t76435\tRomney\t76435\t0.00040800300000000004\t76435.0\n21217\t-102.49969300000001\t31.838583\tWest Odessa CDP\tTX\tTexas\tEctor County\t21944\t31.1\t5.9\t12.4\t15452\t54396\t0.2497\t79764\tRomney\t79764\t0.04283833\t79764.0\n21218\t-102.616556\t31.983451000000002\tGoldsmith city\tTX\tTexas\tEctor County\t284\t36.6\t11.7\t3.0\t16441\t53214\t0.2497\t79741\tRomney\t79741\t0.000554415\t79741.0\n21219\t-102.358653\t32.011557\tGardendale CDP\tTX\tTexas\tEctor County\t1294\t44.1\t15.7\t3.8\t26462\t125284\t0.2497\t79758\tRomney\t79758\t0.002526103\t79758.0\n21220\t-102.272865\t31.915594\tOdessa city\tTX\tTexas\tEctor County\t99059\t32.5\t16.8\t9.4\t18801\t79060\t0.2497\t79765\tRomney\t79765\t0.19337960899999998\t79765.0\n21221\t-100.212829\t30.017106\tRocksprings town\tTX\tTexas\tEdwards County\t1185\t31.6\t10.4\t9.0\t12004\t39762\t0.2624\t78880\tRomney\t78880\t0.002313317\t78880.0\n21222\t-96.886434\t32.185528999999995\tItaly town\tTX\tTexas\tEllis County\t2838\t34.4\t15.4\t10.1\t18771\t79396\t0.2563\t76651\tRomney\t76651\t0.005540247\t76651.0\n21223\t-96.673738\t32.427478\tPalmer town\tTX\tTexas\tEllis County\t2030\t33.9\t11.3\t11.3\t19511\t80816\t0.2563\t75152\tRomney\t75152\t0.003962897\t75152.0\n21224\t-96.84711999999999\t32.405374\tWaxahachie city\tTX\tTexas\tEllis County\t28877\t33.4\t20.6\t10.3\t23019\t113736\t0.2563\t75165\tRomney\t75165\t0.056372697\t75165.0\n21225\t-96.78156700000001\t32.490684\tPecan Hill city\tTX\tTexas\tEllis County\t775\t32.1\t18.9\t8.8\t25928\t135833\t0.2563\t75154\tRomney\t75154\t0.0015129289999999999\t75154.0\n21226\t-96.949798\t32.122721000000006\tMilford town\tTX\tTexas\tEllis County\t949\t37.0\t8.9\t11.0\t14672\t53065\t0.2563\t76670\tRomney\t76670\t0.0018526060000000001\t76670.0\n21227\t-96.994562\t32.480195\tMidlothian city\tTX\tTexas\tEllis County\t14620\t35.0\t22.6\t7.0\t26086\t130648\t0.2563\t76065\tRomney\t76065\t0.028540667000000002\t76065.0\n21228\t-96.695565\t32.267267\tBardwell city\tTX\tTexas\tEllis County\t812\t33.4\t9.6\t8.1\t17156\t73200\t0.2563\t75101\tRomney\t75101\t0.001585159\t75101.0\n21229\t-96.64085899999999\t32.331458000000005\tEnnis city\tTX\tTexas\tEllis County\t19397\t31.5\t12.8\t9.6\t19351\t91839\t0.2563\t75119\tRomney\t75119\t0.037866163\t75119.0\n21230\t-96.862697\t32.514762\tOak Leaf town\tTX\tTexas\tEllis County\t1654\t43.2\t33.7\t4.1\t35778\t167778\t0.2563\t75154\tRomney\t75154\t0.003228883\t75154.0\n21231\t-96.808848\t32.523187\tRed Oak city\tTX\tTexas\tEllis County\t7129\t32.7\t14.5\t9.6\t23099\t114359\t0.2563\t75154\tRomney\t75154\t0.013916991\t75154.0\n21232\t-96.666797\t32.550404\tFerris city\tTX\tTexas\tEllis County\t2753\t31.4\t14.3\t9.5\t19379\t67319\t0.2563\t75125\tRomney\t75125\t0.005374313\t75125.0\n21233\t-96.55037\t32.281674\tAlma town\tTX\tTexas\tEllis County\t434\t36.6\t10.8\t8.4\t20699\t111310\t0.2563\t75119\tRomney\t75119\t0.00084724\t75119.0\n21234\t-96.887925\t32.551641\tOvilla city\tTX\tTexas\tEllis County\t4203\t39.0\t40.4\t5.1\t33309\t175276\t0.2563\t75115\tRomney\t75115\t0.008204954\t75115.0\n21235\t-97.01164399999999\t32.31491\tMaypearl city\tTX\tTexas\tEllis County\t1035\t33.7\t12.0\t6.5\t19872\t110833\t0.2563\t76064\tRomney\t76064\t0.002020492\t76064.0\n21236\t-96.651926\t32.362614\tGarrett town\tTX\tTexas\tEllis County\t542\t33.4\t19.5\t8.2\t24328\t102155\t0.2563\t75119\tRomney\t75119\t0.001058074\t75119.0\n21237\t-106.26083200000001\t31.576749\tSan Elizario CDP\tTX\tTexas\tEl Paso County\t13085\t24.5\t3.8\t14.1\t7858\t62236\t0.6551\t79849\tRomney\t79849\t0.025544092\t79849.0\n21238\t-106.42075600000001\t31.809157\tFort Bliss CDP\tTX\tTexas\tEl Paso County\t9055\t22.7\t30.0\t13.8\t15640\t90625\t0.6551\t79906\tRomney\t79906\t0.017676863\t79906.0\n21239\t-106.173776\t31.84951\tHomestead Meadows North CDP\tTX\tTexas\tEl Paso County\t5414\t26.4\t7.0\t13.1\t11954\t64308\t0.6551\t79938\tRomney\t79938\t0.010569027\t79938.0\n21240\t-106.613527\t31.889841999999998\tPrado Verde CDP\tTX\tTexas\tEl Paso County\t217\t42.0\t48.6\t11.5\t33676\t200000\t0.6551\t79932\tRomney\t79932\t0.00042362\t79932.0\n21241\t-106.193348\t31.679477000000002\tHorizon City\tTX\tTexas\tEl Paso County\t11035\t29.5\t20.2\t8.6\t16761\t110894\t0.6551\t79927\tRomney\t79927\t0.021542152000000002\t79927.0\n21242\t-106.271323\t31.640556\tSocorro city\tTX\tTexas\tEl Paso County\t29243\t28.6\t5.0\t14.4\t9496\t74496\t0.6551\t79849\tRomney\t79849\t0.05708719\t79849.0\n21243\t-106.239756\t31.672801\tSparks CDP\tTX\tTexas\tEl Paso County\t4260\t26.6\t2.0\t10.1\t8820\t51230\t0.6551\t79927\tRomney\t79927\t0.008316226999999999\t79927.0\n21244\t-106.599998\t31.918021000000003\tCanutillo CDP\tTX\tTexas\tEl Paso County\t5809\t29.5\t8.8\t12.4\t10397\t62345\t0.6551\t79835\tRomney\t79835\t0.011340132\t79835.0\n21245\t-106.10316399999999\t31.436921\tTornillo CDP\tTX\tTexas\tEl Paso County\t1844\t23.0\t2.8\t13.6\t7481\t44048\t0.6551\t79853\tRomney\t79853\t0.0035997940000000003\t79853.0\n21246\t-106.13756200000002\t31.655886\tAgua Dulce CDP\tTX\tTexas\tEl Paso County\t2254\t25.5\t12.7\t13.8\t8653\t76750\t0.6551\t79927\tRomney\t79927\t0.004400182\t79927.0\n21247\t-106.594802\t31.959908000000002\tVinton village\tTX\tTexas\tEl Paso County\t2101\t24.8\t4.6\t10.6\t9361\t73298\t0.6551\t79821\tRomney\t79821\t0.004101501\t79821.0\n21248\t-106.43588500000001\t31.849168\tEl Paso city\tTX\tTexas\tEl Paso County\t616145\t32.0\t20.9\t10.7\t17173\t105859\t0.6551\t79904\tRomney\t79904\t1.202817304\t79904.0\n21249\t-106.15486999999999\t31.509851\tFabens CDP\tTX\tTexas\tEl Paso County\t9060\t26.1\t4.5\t14.1\t8363\t56292\t0.6551\t79838\tRomney\t79838\t0.017686623999999998\t79838.0\n21250\t-106.20908600000001\t31.564875\tMorning Glory CDP\tTX\tTexas\tEl Paso County\t714\t25.8\t8.7\t13.6\t9057\t58235\t0.6551\t79836\tRomney\t79836\t0.0013938470000000001\t79836.0\n21251\t-106.228917\t31.590040999999996\tClint town\tTX\tTexas\tEl Paso County\t1042\t35.9\t12.2\t11.4\t14019\t81471\t0.6551\t79836\tRomney\t79836\t0.002034157\t79836.0\n21252\t-106.57613700000002\t31.958785\tWestway CDP\tTX\tTexas\tEl Paso County\t4119\t26.2\t0.7\t12.5\t7582\t62682\t0.6551\t79835\tRomney\t79835\t0.008040972\t79835.0\n21253\t-106.16353400000001\t31.811119\tHomestead Meadows South CDP\tTX\tTexas\tEl Paso County\t7995\t25.8\t8.2\t12.4\t10664\t76582\t0.6551\t79938\tRomney\t79938\t0.015607567\t79938.0\n21254\t-106.593556\t31.987459\tAnthony town\tTX\tTexas\tEl Paso County\t3999\t33.0\t7.1\t16.0\t12853\t78088\t0.6551\t79821\tRomney\t79821\t0.0078067119999999995\t79821.0\n21255\t-106.08275800000001\t31.840844\tButterfield CDP\tTX\tTexas\tEl Paso County\t67\t33.8\t10.0\t4.2\t10685\t48333\t0.6551\t79938\tRomney\t79938\t0.000130795\t79938.0\n21256\t-98.337593\t32.087246\tDublin city\tTX\tTexas\tErath County\t3729\t34.6\t19.7\t9.3\t13404\t59754\t0.1575\t76446\tRomney\t76446\t0.0072796269999999995\t76446.0\n21257\t-98.218915\t32.216195\tStephenville city\tTX\tTexas\tErath County\t15997\t30.7\t31.6\t10.0\t18971\t96959\t0.1575\t76401\tRomney\t76401\t0.031228798999999998\t76401.0\n21258\t-97.074338\t31.381234000000003\tGolinda city\tTX\tTexas\tFalls County\t451\t41.8\t16.9\t7.5\t20154\t73500\t0.3741\t76685\tRomney\t76685\t0.0008804269999999999\t76685.0\n21259\t-97.033159\t31.205096\tLott city\tTX\tTexas\tFalls County\t658\t40.7\t10.7\t17.1\t14262\t42353\t0.3741\t76656\tRomney\t76656\t0.001284525\t76656.0\n21260\t-96.89332900000001\t31.308451\tMarlin city\tTX\tTexas\tFalls County\t5960\t35.4\t9.8\t15.8\t14581\t45686\t0.3741\t76661\tRomney\t76661\t0.011634908999999999\t76661.0\n21261\t-96.975088\t31.075411\tRosebud city\tTX\tTexas\tFalls County\t1273\t41.9\t11.3\t10.3\t15603\t42969\t0.3741\t76570\tRomney\t76570\t0.0024851070000000003\t76570.0\n21262\t-96.192066\t33.587437\tBonham city\tTX\tTexas\tFannin County\t10450\t37.0\t12.6\t13.0\t16968\t75364\t0.2301\t75418\tRomney\t75418\t0.020400134\t75418.0\n21263\t-96.33981999999999\t33.428543\tTrenton city\tTX\tTexas\tFannin County\t705\t37.7\t15.3\t5.8\t21807\t76563\t0.2301\t75490\tRomney\t75490\t0.0013762770000000002\t75490.0\n21264\t-95.998535\t33.564803999999995\tWindom town\tTX\tTexas\tFannin County\t265\t42.0\t13.7\t7.5\t21544\t74000\t0.2301\t75492\tRomney\t75492\t0.000517324\t75492.0\n21265\t-96.240879\t33.670506\tRavenna city\tTX\tTexas\tFannin County\t245\t44.0\t11.7\t4.7\t20110\t96000\t0.2301\t75476\tRomney\t75476\t0.000478281\t75476.0\n21266\t-95.94547\t33.429057\tLadonia town\tTX\tTexas\tFannin County\t628\t39.4\t8.9\t6.5\t14758\t58200\t0.2301\t75449\tRomney\t75449\t0.00122596\t75449.0\n21267\t-96.365668\t33.599292999999996\tSavoy city\tTX\tTexas\tFannin County\t916\t44.1\t9.0\t8.0\t17769\t73438\t0.2301\t75479\tRomney\t75479\t0.001788184\t75479.0\n21268\t-96.16508\t33.433628999999996\tBailey city\tTX\tTexas\tFannin County\t246\t41.6\t18.3\t7.6\t20594\t95000\t0.2301\t75413\tRomney\t75413\t0.00048023300000000005\t75413.0\n21269\t-96.273264\t33.579336\tEctor city\tTX\tTexas\tFannin County\t679\t42.3\t15.3\t1.9\t21694\t81667\t0.2301\t75439\tRomney\t75439\t0.001325521\t75439.0\n21270\t-96.246225\t33.380626\tLeonard city\tTX\tTexas\tFannin County\t1975\t34.4\t15.1\t6.5\t18345\t95147\t0.2301\t75452\tRomney\t75452\t0.003855528\t75452.0\n21271\t-95.908252\t33.585826000000004\tHoney Grove city\tTX\tTexas\tFannin County\t1820\t41.0\t12.6\t8.7\t17661\t74773\t0.2301\t75446\tRomney\t75446\t0.003552942\t75446.0\n21272\t-96.075592\t33.57524\tDodd City town\tTX\tTexas\tFannin County\t453\t42.0\t13.8\t7.5\t21548\t71667\t0.2301\t75438\tRomney\t75438\t0.000884331\t75438.0\n21273\t-96.876944\t29.909612\tLa Grange city\tTX\tTexas\tFayette County\t4722\t39.6\t14.2\t9.5\t19290\t98544\t0.2194\t78945\tRomney\t78945\t0.009218128\t78945.0\n21274\t-96.674667\t29.90638\tFayetteville city\tTX\tTexas\tFayette County\t296\t46.1\t12.0\t2.7\t17892\t100000\t0.2194\t78940\tRomney\t78940\t0.0005778409999999999\t78940.0\n21275\t-96.90746899999999\t29.681625\tSchulenburg city\tTX\tTexas\tFayette County\t2799\t46.3\t14.9\t3.7\t19459\t84338\t0.2194\t78956\tRomney\t78956\t0.0054641130000000005\t78956.0\n21276\t-96.6965\t30.064107\tRound Top town\tTX\tTexas\tFayette County\t82\t50.0\t25.4\t4.7\t24219\t153125\t0.2194\t78954\tRomney\t78954\t0.000160078\t78954.0\n21277\t-97.10598399999999\t29.688798\tFlatonia town\tTX\tTexas\tFayette County\t1425\t40.1\t11.9\t8.6\t14355\t70469\t0.2194\t78941\tRomney\t78941\t0.002781837\t78941.0\n21278\t-96.690862\t30.148660999999997\tCarmine city\tTX\tTexas\tFayette County\t241\t50.8\t25.4\t4.0\t24409\t153125\t0.2194\t78932\tRomney\t78932\t0.000470472\t78932.0\n21279\t-100.46556899999999\t32.853976\tRotan city\tTX\tTexas\tFisher County\t1459\t42.7\t11.7\t8.7\t15936\t32829\t0.3143\t79546\tRomney\t79546\t0.00284821\t79546.0\n21280\t-100.379363\t32.745976\tRoby city\tTX\tTexas\tFisher County\t573\t39.0\t11.5\t5.7\t15100\t40000\t0.3143\t79543\tRomney\t79543\t0.0011185910000000002\t79543.0\n21281\t-101.442458\t34.122989000000004\tLockney town\tTX\tTexas\tFloyd County\t1719\t33.7\t13.3\t7.1\t15703\t47609\t0.2643\t79241\tRomney\t79241\t0.003355773\t79241.0\n21282\t-101.336775\t33.983525\tFloydada city\tTX\tTexas\tFloyd County\t3432\t34.6\t12.9\t12.0\t14535\t38000\t0.2643\t79235\tRomney\t79235\t0.006699834\t79235.0\n21283\t-99.724152\t33.983901\tCrowell city\tTX\tTexas\tFoard County\t993\t41.2\t10.7\t2.9\t15900\t30714\t0.2828\t79227\tRomney\t79227\t0.001938501\t79227.0\n21284\t-95.465114\t29.50208\tArcola city\tTX\tTexas\tFort Bend County\t1494\t32.1\t34.9\t8.1\t31648\t192500\t0.4608\t77545\tRomney\t77545\t0.002916536\t77545.0\n21285\t-96.00434\t29.682128999999996\tSimonton city\tTX\tTexas\tFort Bend County\t915\t46.2\t35.1\t6.9\t39248\t191477\t0.4608\t77476\tRomney\t77476\t0.001786232\t77476.0\n21286\t-95.552243\t29.598005999999998\tFifth Street CDP\tTX\tTexas\tFort Bend County\t2409\t33.3\t31.4\t19.3\t18404\t98846\t0.4608\t77459\tRomney\t77459\t0.0047027679999999995\t77459.0\n21287\t-95.73268900000001\t29.624888000000002\tPecan Grove CDP\tTX\tTexas\tFort Bend County\t16589\t38.1\t48.0\t9.9\t39492\t194169\t0.4608\t77469\tRomney\t77469\t0.032384481\t77469.0\n21288\t-95.68820699999999\t29.590729\tNew Territory CDP\tTX\tTexas\tFort Bend County\t16662\t29.8\t59.1\t8.5\t37982\t236870\t0.4608\t77479\tRomney\t77479\t0.032526989\t77479.0\n21289\t-95.667745\t29.552919\tGreatwood CDP\tTX\tTexas\tFort Bend County\t11091\t36.3\t62.0\t6.4\t53132\t265743\t0.4608\t77479\tRomney\t77479\t0.021651472999999997\t77479.0\n21290\t-95.764088\t29.584263\tRichmond city\tTX\tTexas\tFort Bend County\t12318\t31.8\t14.9\t16.5\t18108\t103644\t0.4608\t77469\tRomney\t77469\t0.02404678\t77469.0\n21291\t-95.630604\t29.490506\tThompsons town\tTX\tTexas\tFort Bend County\t243\t36.8\t30.5\t8.4\t33603\t116667\t0.4608\t77481\tRomney\t77481\t0.000474376\t77481.0\n21292\t-95.58723\t29.651428999999997\tMeadows Place city\tTX\tTexas\tFort Bend County\t5183\t39.9\t48.2\t9.9\t31048\t140863\t0.4608\t77099\tRomney\t77099\t0.010118076\t77099.0\n21293\t-95.916842\t29.497085\tBeasley city\tTX\tTexas\tFort Bend County\t703\t33.7\t8.0\t11.9\t16978\t92500\t0.4608\t77417\tRomney\t77417\t0.0013723729999999999\t77417.0\n21294\t-95.81133100000001\t29.541797999999996\tRosenberg city\tTX\tTexas\tFort Bend County\t30673\t32.9\t12.4\t12.2\t18299\t102915\t0.4608\t77471\tRomney\t77471\t0.059878787\t77471.0\n21295\t-95.811993\t29.494132\tPleak village\tTX\tTexas\tFort Bend County\t1177\t35.7\t10.6\t9.4\t18374\t102989\t0.4608\t77471\tRomney\t77471\t0.002297699\t77471.0\n21296\t-95.521047\t29.634145\tMissouri City\tTX\tTexas\tFort Bend County\t68447\t35.8\t44.7\t10.2\t32237\t152768\t0.4608\t77071\tRomney\t77071\t0.133619904\t77071.0\n21297\t-95.75805\t29.754421999999998\tCinco Ranch CDP\tTX\tTexas\tFort Bend County\t20497\t35.1\t64.4\t6.3\t47553\t286481\t0.4608\t77450\tRomney\t77450\t0.040013546000000004\t77450.0\n21298\t-95.658783\t29.669457\tFour Corners CDP\tTX\tTexas\tFort Bend County\t10736\t32.9\t44.1\t7.2\t27462\t154976\t0.4608\t77083\tRomney\t77083\t0.020958453999999998\t77083.0\n21299\t-95.77931099999999\t29.446446999999996\tFairchilds village\tTX\tTexas\tFort Bend County\t905\t37.1\t10.9\t7.3\t20938\t115549\t0.4608\t77461\tRomney\t77461\t0.00176671\t77461.0\n21300\t-95.469171\t29.535553999999998\tFresno CDP\tTX\tTexas\tFort Bend County\t18785\t30.6\t27.7\t8.4\t22232\t138149\t0.4608\t77545\tRomney\t77545\t0.036671438\t77545.0\n21301\t-95.54807199999999\t29.639167999999998\tStafford city\tTX\tTexas\tFort Bend County\t18660\t32.8\t35.3\t12.1\t25249\t131297\t0.4608\t77031\tRomney\t77031\t0.036427417000000004\t77031.0\n21302\t-95.972462\t29.596140000000002\tOrchard city\tTX\tTexas\tFort Bend County\t549\t34.6\t12.4\t4.4\t20514\t110185\t0.4608\t77464\tRomney\t77464\t0.001071739\t77464.0\n21303\t-96.000947\t29.446777\tKendleton city\tTX\tTexas\tFort Bend County\t642\t37.6\t7.4\t13.4\t12181\t58448\t0.4608\t77451\tRomney\t77451\t0.0012532910000000001\t77451.0\n21304\t-95.656705\t29.701676000000003\tMission Bend CDP\tTX\tTexas\tFort Bend County\t37045\t33.5\t32.7\t9.9\t24521\t123115\t0.4608\t77083\tRomney\t77083\t0.072317989\t77083.0\n21305\t-95.509074\t29.481494\tSienna Plantation CDP\tTX\tTexas\tFort Bend County\t14417\t32.9\t40.1\t6.5\t34926\t230779\t0.4608\t77545\tRomney\t77545\t0.028144377\t77545.0\n21306\t-95.79932\t29.584963000000002\tCumings CDP\tTX\tTexas\tFort Bend County\t944\t36.1\t32.3\t7.5\t31023\t214130\t0.4608\t77471\tRomney\t77471\t0.001842845\t77471.0\n21307\t-95.839047\t29.395398999999998\tNeedville city\tTX\tTexas\tFort Bend County\t3463\t36.2\t12.7\t9.8\t22558\t105447\t0.4608\t77461\tRomney\t77461\t0.0067603509999999995\t77461.0\n21308\t-95.88265799999999\t29.689970000000002\tFulshear city\tTX\tTexas\tFort Bend County\t831\t41.1\t35.6\t8.2\t34982\t208333\t0.4608\t77441\tRomney\t77441\t0.00162225\t77441.0\n21309\t-95.617777\t29.601456\tSugar Land city\tTX\tTexas\tFort Bend County\t71824\t39.6\t53.7\t10.1\t37033\t210495\t0.4608\t77478\tRomney\t77478\t0.140212369\t77478.0\n21310\t-95.22448299999999\t33.17581\tMount Vernon town\tTX\tTexas\tFranklin County\t2788\t39.0\t18.3\t6.4\t17970\t86848\t0.1764\t75457\tRomney\t75457\t0.005442639\t75457.0\n21311\t-96.330015\t31.767115000000004\tKirvin town\tTX\tTexas\tFreestone County\t139\t41.9\t10.4\t6.1\t17136\t80000\t0.2444\t75848\tRomney\t75848\t0.00027135099999999997\t75848.0\n21312\t-96.32341\t31.881809000000004\tStreetman town\tTX\tTexas\tFreestone County\t220\t49.3\t6.0\t7.1\t19812\t40909\t0.2444\t75848\tRomney\t75848\t0.000429477\t75848.0\n21313\t-96.28178100000001\t31.630124\tTeague city\tTX\tTexas\tFreestone County\t4973\t33.3\t10.7\t7.7\t18177\t65317\t0.2444\t75860\tRomney\t75860\t0.009708121\t75860.0\n21314\t-96.16564100000001\t31.718359000000003\tFairfield city\tTX\tTexas\tFreestone County\t3361\t39.4\t10.8\t4.0\t18487\t83243\t0.2444\t75840\tRomney\t75840\t0.00656123\t75840.0\n21315\t-96.461052\t31.789633000000002\tWortham town\tTX\tTexas\tFreestone County\t1155\t37.5\t12.3\t4.8\t15109\t60313\t0.2444\t76693\tRomney\t76693\t0.002254752\t76693.0\n21316\t-99.010626\t29.054068\tMoore CDP\tTX\tTexas\tFrio County\t752\t43.1\t12.5\t7.1\t18841\t67333\t0.5988\t78057\tRomney\t78057\t0.001468029\t78057.0\n21317\t-99.092694\t28.888599\tPearsall city\tTX\tTexas\tFrio County\t7120\t31.5\t9.0\t8.5\t12189\t51328\t0.5988\t78061\tRomney\t78061\t0.013899422\t78061.0\n21318\t-99.094185\t28.923452\tNorth Pearsall CDP\tTX\tTexas\tFrio County\t544\t28.9\t9.0\t7.6\t11582\t54091\t0.5988\t78061\tRomney\t78061\t0.001061978\t78061.0\n21319\t-99.108172\t28.898434\tWest Pearsall CDP\tTX\tTexas\tFrio County\t350\t29.8\t4.1\t8.3\t10406\t39167\t0.5988\t78061\tRomney\t78061\t0.0006832580000000001\t78061.0\n21320\t-98.85209300000001\t29.061822999999997\tBigfoot CDP\tTX\tTexas\tFrio County\t363\t43.2\t12.6\t7.1\t18843\t65714\t0.5988\t78005\tRomney\t78005\t0.000708636\t78005.0\n21321\t-99.176123\t28.693786\tHilltop CDP\tTX\tTexas\tFrio County\t295\t29.1\t10.1\t17.1\t13063\t46250\t0.5988\t78017\tRomney\t78017\t0.000575889\t78017.0\n21322\t-99.176712\t28.667443\tDilley city\tTX\tTexas\tFrio County\t3595\t29.5\t8.2\t11.7\t11626\t36702\t0.5988\t78017\tRomney\t78017\t0.0070180369999999995\t78017.0\n21323\t-102.649824\t32.721044\tSeminole city\tTX\tTexas\tGaines County\t6595\t32.6\t13.6\t6.5\t15486\t66958\t0.1316\t79360\tRomney\t79360\t0.012874535\t79360.0\n21324\t-102.56569499999999\t32.941921\tSeagraves city\tTX\tTexas\tGaines County\t2415\t32.7\t10.1\t12.5\t13493\t45085\t0.1316\t79359\tRomney\t79359\t0.0047144809999999995\t79359.0\n21325\t-94.93814300000001\t29.325378000000004\tBayou Vista city\tTX\tTexas\tGalveston County\t1650\t51.4\t24.2\t7.2\t39812\t137121\t0.3589\t77568\tRomney\t77568\t0.0032210740000000004\t77568.0\n21326\t-95.108427\t29.511188\tLeague City\tTX\tTexas\tGalveston County\t71570\t35.2\t37.0\t6.6\t31716\t135953\t0.3589\t77573\tRomney\t77573\t0.139716519\t77573.0\n21327\t-95.033462\t29.546959\tClear Lake Shores city\tTX\tTexas\tGalveston County\t1250\t49.3\t44.6\t7.0\t47086\t170139\t0.3589\t77565\tRomney\t77565\t0.0024402070000000002\t77565.0\n21328\t-94.862513\t29.263721000000004\tGalveston city\tTX\tTexas\tGalveston County\t59175\t37.2\t26.8\t12.2\t21711\t98361\t0.3589\t77551\tRomney\t77551\t0.115519422\t77551.0\n21329\t-94.94029599999999\t29.490087\tSan Leon CDP\tTX\tTexas\tGalveston County\t4818\t41.5\t14.1\t13.6\t20698\t78839\t0.3589\t77518\tRomney\t77518\t0.009405535999999999\t77518.0\n21330\t-94.98806\t29.508028000000003\tBacliff CDP\tTX\tTexas\tGalveston County\t8353\t35.6\t11.5\t11.1\t19673\t63923\t0.3589\t77518\tRomney\t77518\t0.016306442\t77518.0\n21331\t-95.180062\t29.534851\tFriendswood city\tTX\tTexas\tGalveston County\t36003\t38.2\t42.0\t7.0\t33340\t163436\t0.3589\t77546\tRomney\t77546\t0.070283832\t77546.0\n21332\t-94.979834\t29.189982\tJamaica Beach city\tTX\tTexas\tGalveston County\t1543\t50.7\t51.8\t6.3\t41370\t154297\t0.3589\t77554\tRomney\t77554\t0.003012192\t77554.0\n21333\t-95.10236\t29.385102000000003\tSanta Fe city\tTX\tTexas\tGalveston County\t10398\t38.2\t13.3\t7.3\t24525\t108221\t0.3589\t77510\tRomney\t77510\t0.020298622\t77510.0\n21334\t-94.66170100000001\t29.439076\tBolivar Peninsula CDP\tTX\tTexas\tGalveston County\t4682\t55.4\t18.2\t9.3\t25063\t69873\t0.3589\t77650\tRomney\t77650\t0.009140041\t77650.0\n21335\t-95.030789\t29.296107\tHitchcock city\tTX\tTexas\tGalveston County\t6964\t39.0\t10.0\t11.0\t18489\t70304\t0.3589\t77563\tRomney\t77563\t0.013594884\t77563.0\n21336\t-95.01876800000001\t29.531913\tKemah city\tTX\tTexas\tGalveston County\t2690\t34.8\t29.4\t7.2\t28331\t165064\t0.3589\t77565\tRomney\t77565\t0.005251326\t77565.0\n21337\t-95.057146\t29.454514\tDickinson city\tTX\tTexas\tGalveston County\t19246\t34.6\t23.9\t9.1\t23696\t106523\t0.3589\t77539\tRomney\t77539\t0.037571386\t77539.0\n21338\t-94.968393\t29.407783000000002\tTexas City\tTX\tTexas\tGalveston County\t45756\t36.6\t13.6\t10.8\t21655\t85414\t0.3589\t77591\tRomney\t77591\t0.08932330599999999\t77591.0\n21339\t-94.995346\t29.369009000000002\tLa Marque city\tTX\tTexas\tGalveston County\t14587\t38.7\t15.5\t13.2\t20748\t78536\t0.3589\t77591\tRomney\t77591\t0.028476245\t77591.0\n21340\t-94.916556\t29.297833\tTiki Island village\tTX\tTexas\tGalveston County\t1093\t54.5\t43.5\t5.0\t61618\t293750\t0.3589\t77554\tRomney\t77554\t0.0021337170000000003\t77554.0\n21341\t-101.381462\t33.191034\tPost city\tTX\tTexas\tGarza County\t4944\t34.0\t9.8\t7.0\t14642\t47478\t0.1788\t79356\tRomney\t79356\t0.009651509\t79356.0\n21342\t-99.24579399999999\t30.290240999999998\tHarper CDP\tTX\tTexas\tGillespie County\t1273\t49.0\t20.9\t3.7\t21709\t135962\t0.1637\t78631\tRomney\t78631\t0.0024851070000000003\t78631.0\n21343\t-98.875886\t30.267765999999998\tFredericksburg city\tTX\tTexas\tGillespie County\t9850\t47.9\t25.7\t3.9\t23211\t149480\t0.1637\t78624\tRomney\t78624\t0.019228835\t78624.0\n21344\t-98.659425\t30.249685999999997\tStonewall CDP\tTX\tTexas\tGillespie County\t555\t48.8\t22.5\t4.0\t21397\t172500\t0.1637\t78671\tRomney\t78671\t0.001083452\t78671.0\n21345\t-97.39185\t28.670602000000002\tGoliad city\tTX\tTexas\tGoliad County\t1967\t41.9\t13.6\t6.4\t17357\t63182\t0.3259\t77963\tRomney\t77963\t0.00383991\t77963.0\n21346\t-97.762375\t29.269205\tNixon city\tTX\tTexas\tGonzales County\t2213\t31.3\t9.4\t6.5\t11521\t40846\t0.2934\t78140\tRomney\t78140\t0.004320143\t78140.0\n21347\t-97.445669\t29.512163\tGonzales city\tTX\tTexas\tGonzales County\t7154\t35.2\t10.9\t7.9\t16132\t69839\t0.2934\t78629\tRomney\t78629\t0.013965795\t78629.0\n21348\t-97.63750999999999\t29.271262\tSmiley city\tTX\tTexas\tGonzales County\t473\t39.4\t11.0\t7.3\t13197\t56071\t0.2934\t78159\tRomney\t78159\t0.000923375\t78159.0\n21349\t-97.29733\t29.694468\tWaelder city\tTX\tTexas\tGonzales County\t1039\t40.0\t8.0\t6.3\t13671\t46042\t0.2934\t78959\tRomney\t78959\t0.0020283000000000002\t78959.0\n21350\t-100.965195\t35.546818\tPampa city\tTX\tTexas\tGray County\t17739\t41.7\t14.0\t7.9\t20578\t53950\t0.1199\t79065\tRomney\t79065\t0.034629472\t79065.0\n21351\t-100.803934\t35.439631\tLefors town\tTX\tTexas\tGray County\t547\t42.1\t5.9\t9.5\t18109\t32727\t0.1199\t79054\tRomney\t79054\t0.001067835\t79054.0\n21352\t-100.600053\t35.232516\tMcLean town\tTX\tTexas\tGray County\t798\t52.9\t13.7\t4.9\t19936\t40714\t0.1199\t79057\tRomney\t79057\t0.0015578279999999998\t79057.0\n21353\t-96.743472\t33.452882\tGunter city\tTX\tTexas\tGrayson County\t1358\t35.3\t15.4\t5.1\t16492\t79688\t0.2525\t75058\tRomney\t75058\t0.002651041\t75058.0\n21354\t-96.618381\t33.689253\tKnollwood village\tTX\tTexas\tGrayson County\t468\t40.9\t24.6\t14.4\t22222\t71111\t0.2525\t75092\tRomney\t75092\t0.000913614\t75092.0\n21355\t-96.909931\t33.559197999999995\tCollinsville town\tTX\tTexas\tGrayson County\t1362\t38.5\t11.6\t8.5\t18426\t77963\t0.2525\t76233\tRomney\t76233\t0.00265885\t76233.0\n21356\t-96.90328199999999\t33.661509\tWhitesboro city\tTX\tTexas\tGrayson County\t3781\t41.1\t12.9\t9.2\t20435\t69930\t0.2525\t76273\tRomney\t76273\t0.00738114\t76273.0\n21357\t-96.672312\t33.772636999999996\tPottsboro town\tTX\tTexas\tGrayson County\t1745\t41.7\t21.7\t5.3\t21089\t97222\t0.2525\t75076\tRomney\t75076\t0.00340653\t75076.0\n21358\t-96.61540699999999\t33.512076\tHowe town\tTX\tTexas\tGrayson County\t2647\t32.8\t13.0\t7.6\t18343\t72759\t0.2525\t75459\tRomney\t75459\t0.005167383\t75459.0\n21359\t-96.413595\t33.617185\tBells town\tTX\tTexas\tGrayson County\t1323\t37.3\t13.3\t6.2\t19718\t77241\t0.2525\t75414\tRomney\t75414\t0.002582716\t75414.0\n21360\t-96.763752\t33.624357\tSouthmayd city\tTX\tTexas\tGrayson County\t1188\t38.2\t19.8\t6.9\t22905\t61563\t0.2525\t76268\tRomney\t76268\t0.002319173\t76268.0\n21361\t-96.483811\t33.52069\tTom Bean city\tTX\tTexas\tGrayson County\t1039\t37.0\t13.6\t6.6\t19234\t86167\t0.2525\t75489\tRomney\t75489\t0.0020283000000000002\t75489.0\n21362\t-96.380729\t33.524899\tWhitewright town\tTX\tTexas\tGrayson County\t1820\t42.4\t16.6\t7.7\t18260\t67800\t0.2525\t75491\tRomney\t75491\t0.003552942\t75491.0\n21363\t-96.61582299999999\t33.619831\tSherman city\tTX\tTexas\tGrayson County\t37175\t35.1\t21.9\t9.6\t21258\t80943\t0.2525\t75090\tRomney\t75090\t0.07257177\t75090.0\n21364\t-96.576727\t33.421514\tVan Alstyne city\tTX\tTexas\tGrayson County\t2762\t38.6\t21.3\t4.8\t21987\t93421\t0.2525\t75495\tRomney\t75495\t0.005391882\t75495.0\n21365\t-96.84666700000001\t33.682776000000004\tSadler city\tTX\tTexas\tGrayson County\t466\t40.3\t19.6\t6.7\t20562\t95000\t0.2525\t76264\tRomney\t76264\t0.000909709\t76264.0\n21366\t-96.707672\t33.533827\tDorchester town\tTX\tTexas\tGrayson County\t188\t40.0\t18.5\t7.8\t25417\t117647\t0.2525\t75459\tRomney\t75459\t0.000367007\t75459.0\n21367\t-96.56545\t33.757312\tDenison city\tTX\tTexas\tGrayson County\t23423\t40.9\t15.8\t9.4\t21358\t61513\t0.2525\t75020\tRomney\t75020\t0.04572558400000001\t75020.0\n21368\t-96.918521\t33.471239000000004\tTioga town\tTX\tTexas\tGrayson County\t841\t36.7\t13.9\t8.3\t20221\t82500\t0.2525\t76271\tRomney\t76271\t0.0016417720000000001\t76271.0\n21369\t-94.710151\t32.404986\tLakeport city\tTX\tTexas\tGregg County\t955\t44.9\t20.9\t7.2\t21413\t78824\t0.2987\t75603\tRomney\t75603\t0.001864319\t75603.0\n21370\t-94.68959699999999\t32.517556\tLongview city\tTX\tTexas\tGregg County\t77817\t35.2\t22.9\t8.6\t22060\t104311\t0.2987\t75601\tRomney\t75601\t0.1519117\t75601.0\n21371\t-94.856341\t32.531271000000004\tWhite Oak city\tTX\tTexas\tGregg County\t6205\t36.8\t22.4\t7.7\t21088\t113513\t0.2987\t75693\tRomney\t75693\t0.01211319\t75693.0\n21372\t-94.580402\t32.383355\tEaston city\tTX\tTexas\tGregg County\t534\t43.1\t20.0\t9.0\t19148\t96000\t0.2987\t75641\tRomney\t75641\t0.0010424569999999999\t75641.0\n21373\t-94.863505\t32.399294\tKilgore city\tTX\tTexas\tGregg County\t12029\t37.6\t19.0\t6.3\t20427\t77500\t0.2987\t75662\tRomney\t75662\t0.023482605\t75662.0\n21374\t-94.904309\t32.559205\tWarren City\tTX\tTexas\tGregg County\t357\t43.4\t6.2\t5.9\t16537\t55000\t0.2987\t75647\tRomney\t75647\t0.000696923\t75647.0\n21375\t-94.9376\t32.558682\tGladewater city\tTX\tTexas\tGregg County\t6524\t38.1\t13.7\t6.3\t16770\t76549\t0.2987\t75647\tRomney\t75647\t0.012735931\t75647.0\n21376\t-94.89456700000001\t32.564181\tClarksville City\tTX\tTexas\tGregg County\t854\t41.4\t10.8\t5.5\t17025\t72143\t0.2987\t75693\tRomney\t75693\t0.00166715\t75693.0\n21377\t-94.94449200000001\t32.452172999999995\tLiberty City CDP\tTX\tTexas\tGregg County\t2154\t37.8\t18.7\t7.6\t22479\t108157\t0.2987\t75647\tRomney\t75647\t0.004204966\t75647.0\n21378\t-95.830299\t30.260766999999998\tTodd Mission city\tTX\tTexas\tGrimes County\t171\t39.5\t10.2\t10.3\t17384\t88333\t0.2719\t77363\tRomney\t77363\t0.00033382\t77363.0\n21379\t-95.989948\t30.48712\tAnderson city\tTX\tTexas\tGrimes County\t340\t46.1\t12.1\t5.5\t19855\t82000\t0.2719\t77830\tRomney\t77830\t0.0006637360000000001\t77830.0\n21380\t-96.088305\t30.390029\tNavasota city\tTX\tTexas\tGrimes County\t7303\t33.9\t14.7\t12.1\t15733\t80087\t0.2719\t77868\tRomney\t77868\t0.014256668\t77868.0\n21381\t-98.151106\t29.496392999999998\tZuehl CDP\tTX\tTexas\tGuadalupe County\t389\t45.5\t17.3\t7.7\t21274\t89000\t0.318\t78124\tRomney\t78124\t0.000759393\t78124.0\n21382\t-97.90928100000001\t29.811382000000002\tRedwood CDP\tTX\tTexas\tGuadalupe County\t3901\t28.2\t9.4\t10.4\t13139\t61596\t0.318\t78655\tRomney\t78655\t0.007615399\t78655.0\n21383\t-97.969975\t29.578245000000003\tSeguin city\tTX\tTexas\tGuadalupe County\t22412\t33.0\t14.4\t11.2\t16217\t92525\t0.318\t78155\tRomney\t78155\t0.043751944\t78155.0\n21384\t-97.81894799999999\t29.647522\tKingsbury CDP\tTX\tTexas\tGuadalupe County\t750\t43.2\t12.2\t8.7\t21672\t107452\t0.318\t78638\tRomney\t78638\t0.001464124\t78638.0\n21385\t-98.175368\t29.591265999999997\tSanta Clara city\tTX\tTexas\tGuadalupe County\t1041\t36.2\t11.0\t8.7\t19879\t110372\t0.318\t78124\tRomney\t78124\t0.002032205\t78124.0\n21386\t-98.257714\t29.622957\tSchertz city\tTX\tTexas\tGuadalupe County\t25991\t35.7\t28.1\t8.1\t26312\t151530\t0.318\t78154\tRomney\t78154\t0.050738745999999994\t78154.0\n21387\t-98.101304\t29.463017999999998\tNew Berlin city\tTX\tTexas\tGuadalupe County\t576\t41.8\t20.1\t4.2\t20439\t116071\t0.318\t78152\tRomney\t78152\t0.0011244480000000001\t78152.0\n21388\t-98.14301\t29.572839000000002\tMarion city\tTX\tTexas\tGuadalupe County\t1346\t36.5\t12.8\t9.1\t17807\t92222\t0.318\t78124\tRomney\t78124\t0.002627615\t78124.0\n21389\t-98.221209\t29.620093\tNorthcliff CDP\tTX\tTexas\tGuadalupe County\t3076\t42.8\t13.3\t7.7\t25701\t120175\t0.318\t78108\tRomney\t78108\t0.006004863\t78108.0\n21390\t-98.043712\t29.599121000000004\tMcQueeney CDP\tTX\tTexas\tGuadalupe County\t2839\t41.6\t18.8\t9.9\t21111\t105147\t0.318\t78123\tRomney\t78123\t0.005542199\t78123.0\n21391\t-98.224633\t29.576244\tCibolo city\tTX\tTexas\tGuadalupe County\t8436\t37.6\t34.5\t6.1\t28995\t170192\t0.318\t78108\tRomney\t78108\t0.016468471999999998\t78108.0\n21392\t-97.967202\t29.671965000000004\tGeronimo CDP\tTX\tTexas\tGuadalupe County\t848\t35.0\t15.0\t8.7\t17403\t104032\t0.318\t781HH\tRomney\t781HH\t0.001655437\t0.0\n21393\t-101.597367\t33.871085\tPetersburg city\tTX\tTexas\tHale County\t1158\t36.1\t16.2\t6.9\t16517\t48095\t0.2533\t79250\tRomney\t79250\t0.002260608\t79250.0\n21394\t-101.896976\t34.279249\tEdmonson town\tTX\tTexas\tHale County\t102\t34.6\t22.6\t1.8\t21522\t95000\t0.2533\t79032\tRomney\t79032\t0.000199121\t79032.0\n21395\t-101.845381\t33.834223\tAbernathy city\tTX\tTexas\tHale County\t2907\t36.9\t14.1\t8.1\t15833\t61477\t0.2533\t79311\tRomney\t79311\t0.005674946\t79311.0\n21396\t-101.84493\t34.064784\tHale Center city\tTX\tTexas\tHale County\t2118\t32.7\t14.5\t7.5\t13322\t44851\t0.2533\t79041\tRomney\t79041\t0.004134688\t79041.0\n21397\t-101.723587\t34.191112\tPlainview city\tTX\tTexas\tHale County\t21542\t31.4\t19.1\t8.7\t16690\t78229\t0.2533\t79072\tRomney\t79072\t0.042053559000000004\t79072.0\n21398\t-101.695103\t34.21346\tSeth Ward CDP\tTX\tTexas\tHale County\t1903\t26.3\t1.6\t15.3\t11682\t42813\t0.2533\t79072\tRomney\t79072\t0.003714972\t79072.0\n21399\t-100.69720500000001\t34.672832\tLakeview town\tTX\tTexas\tHall County\t125\t40.0\t14.8\t11.8\t13802\t27500\t0.239\t79239\tRomney\t79239\t0.00024402099999999997\t79239.0\n21400\t-100.895393\t34.393831\tTurkey city\tTX\tTexas\tHall County\t428\t40.6\t9.0\t11.4\t12101\t18690\t0.239\t79261\tRomney\t79261\t0.000835527\t79261.0\n21401\t-100.439986\t34.54698\tEstelline town\tTX\tTexas\tHall County\t142\t49.2\t20.6\t10.2\t16573\t25000\t0.239\t79233\tRomney\t79233\t0.000277208\t79233.0\n21402\t-100.541726\t34.726752000000005\tMemphis city\tTX\tTexas\tHall County\t2313\t40.1\t11.2\t11.4\t14373\t35135\t0.239\t79245\tRomney\t79245\t0.00451536\t79245.0\n21403\t-98.11896999999999\t31.7043\tHamilton city\tTX\tTexas\tHamilton County\t2962\t45.0\t14.5\t5.0\t18847\t64896\t0.1664\t76531\tRomney\t76531\t0.005782316\t76531.0\n21404\t-98.028278\t31.984321\tHico city\tTX\tTexas\tHamilton County\t1318\t41.5\t14.0\t6.7\t18578\t71471\t0.1664\t76457\tRomney\t76457\t0.002572955\t76457.0\n21405\t-101.405899\t36.263211\tGruver city\tTX\tTexas\tHansford County\t1077\t39.1\t22.3\t2.3\t18823\t73214\t0.081\t79040\tRomney\t79040\t0.002102483\t79040.0\n21406\t-101.47689100000001\t36.065943\tMorse CDP\tTX\tTexas\tHansford County\t160\t44.2\t26.1\t4.1\t21065\t70000\t0.081\t79062\tRomney\t79062\t0.000312347\t79062.0\n21407\t-101.19404499999999\t36.194660999999996\tSpearman city\tTX\tTexas\tHansford County\t3163\t39.6\t17.2\t6.8\t19373\t53917\t0.081\t79081\tRomney\t79081\t0.0061747009999999995\t79081.0\n21408\t-99.514448\t34.255978999999996\tChillicothe city\tTX\tTexas\tHardeman County\t690\t39.9\t11.6\t5.8\t16291\t31250\t0.20199999999999999\t79225\tRomney\t79225\t0.001346995\t79225.0\n21409\t-99.742859\t34.295312\tQuanah city\tTX\tTexas\tHardeman County\t2771\t42.1\t13.2\t8.1\t18718\t35519\t0.20199999999999999\t79252\tRomney\t79252\t0.0054094519999999995\t79252.0\n21410\t-94.315955\t30.372379\tKountze city\tTX\tTexas\tHardin County\t2109\t38.3\t12.7\t8.8\t16008\t53362\t0.1577\t77625\tRomney\t77625\t0.0041171179999999995\t77625.0\n21411\t-94.177071\t30.345793\tSilsbee city\tTX\tTexas\tHardin County\t6524\t38.8\t16.6\t9.2\t19676\t76496\t0.1577\t77656\tRomney\t77656\t0.012735931\t77656.0\n21412\t-94.401205\t30.135934000000002\tSour Lake city\tTX\tTexas\tHardin County\t1682\t40.7\t13.1\t8.3\t17144\t63250\t0.1577\t77659\tRomney\t77659\t0.003283543\t77659.0\n21413\t-94.192914\t30.193244\tRose Hill Acres city\tTX\tTexas\tHardin County\t527\t39.6\t19.9\t8.1\t21183\t93438\t0.1577\t77657\tRomney\t77657\t0.001028791\t77657.0\n21414\t-94.320611\t30.169162\tPinewood Estates CDP\tTX\tTexas\tHardin County\t1851\t45.3\t38.1\t11.7\t28352\t145109\t0.1577\t77659\tRomney\t77659\t0.0036134590000000003\t77659.0\n21415\t-94.20343299999999\t30.262953999999997\tLumberton city\tTX\tTexas\tHardin County\t10062\t36.0\t17.7\t8.6\t21321\t109617\t0.1577\t77657\tRomney\t77657\t0.019642694\t77657.0\n21416\t-95.086489\t29.5448\tNassau Bay city\tTX\tTexas\tHarris County\t4742\t48.7\t54.2\t7.2\t43782\t209896\t0.4939\t77058\tRomney\t77058\t0.009257171\t77058.0\n21417\t-95.436599\t29.708962\tSouthside Place city\tTX\tTexas\tHarris County\t1637\t41.1\t70.1\t5.6\t58185\t682584\t0.4939\t77005\tRomney\t77005\t0.0031956959999999996\t77005.0\n21418\t-95.023389\t29.575426\tSeabrook city\tTX\tTexas\tHarris County\t10839\t38.3\t45.6\t6.5\t33857\t154115\t0.4939\t77586\tRomney\t77586\t0.021159527\t77586.0\n21419\t-95.504328\t29.78952\tSpring Valley city\tTX\tTexas\tHarris County\t3765\t45.0\t65.3\t7.4\t48428\t290439\t0.4939\t77055\tRomney\t77055\t0.007349905\t77055.0\n21420\t-95.384008\t30.061496999999996\tSpring CDP\tTX\tTexas\tHarris County\t48602\t34.8\t20.1\t7.2\t26071\t106618\t0.4939\t77373\tRomney\t77373\t0.094879171\t77373.0\n21421\t-95.488512\t29.790819\tHilshire Village city\tTX\tTexas\tHarris County\t732\t50.7\t61.6\t4.4\t63787\t416304\t0.4939\t77055\tRomney\t77055\t0.001428985\t77055.0\n21422\t-95.617673\t30.127013\tTomball city\tTX\tTexas\tHarris County\t10478\t35.8\t23.0\t8.6\t25097\t132476\t0.4939\t77375\tRomney\t77375\t0.020454795\t77375.0\n21423\t-94.912418\t29.768095000000002\tBaytown city\tTX\tTexas\tHarris County\t74723\t32.4\t14.4\t11.3\t21819\t86317\t0.4939\t77520\tRomney\t77520\t0.145871698\t77520.0\n21424\t-95.817359\t29.805707\tKaty city\tTX\tTexas\tHarris County\t15477\t33.7\t24.0\t9.5\t25034\t124496\t0.4939\t77493\tRomney\t77493\t0.030213672999999996\t77493.0\n21425\t-95.114923\t29.691062\tDeer Park city\tTX\tTexas\tHarris County\t32412\t36.6\t17.0\t8.9\t28416\t125154\t0.4939\t77536\tRomney\t77536\t0.063273604\t77536.0\n21426\t-95.133995\t29.859594\tSheldon CDP\tTX\tTexas\tHarris County\t1877\t28.9\t8.6\t5.2\t18940\t59138\t0.4939\t77044\tRomney\t77044\t0.0036642159999999997\t77044.0\n21427\t-95.055987\t29.576395\tTaylor Lake Village city\tTX\tTexas\tHarris County\t4113\t44.5\t59.2\t6.0\t49002\t219118\t0.4939\t77586\tRomney\t77586\t0.008029259\t77586.0\n21428\t-95.043909\t29.573196999999997\tEl Lago city\tTX\tTexas\tHarris County\t3005\t39.5\t52.4\t7.4\t38540\t177083\t0.4939\t77586\tRomney\t77586\t0.005866259\t77586.0\n21429\t-95.228539\t29.661171999999997\tSouth Houston city\tTX\tTexas\tHarris County\t16770\t28.2\t3.6\t12.9\t14157\t63629\t0.4939\t77587\tRomney\t77587\t0.032737823\t77587.0\n21430\t-95.241199\t29.766336\tJacinto City\tTX\tTexas\tHarris County\t10889\t29.6\t5.0\t12.4\t14031\t57772\t0.4939\t77013\tRomney\t77013\t0.021257135\t77013.0\n21431\t-95.059322\t29.914544\tCrosby CDP\tTX\tTexas\tHarris County\t2058\t32.4\t8.5\t10.0\t24373\t103488\t0.4939\t77532\tRomney\t77532\t0.004017558\t77532.0\n21432\t-95.53173699999999\t29.764691\tBunker Hill Village city\tTX\tTexas\tHarris County\t3826\t48.5\t81.5\t5.9\t76814\t856273\t0.4939\t77024\tRomney\t77024\t0.007468987\t77024.0\n21433\t-95.263806\t30.055732\tHouston city\tTX\tTexas\tHarris County\t2191893\t32.2\t27.3\t11.4\t23379\t107699\t0.4939\t77339\tRomney\t77339\t4.278938934\t77339.0\n21434\t-94.99879399999999\t29.620366999999998\tShoreacres city\tTX\tTexas\tHarris County\t1558\t43.6\t27.3\t8.7\t30252\t129209\t0.4939\t77586\tRomney\t77586\t0.003041475\t77586.0\n21435\t-95.233352\t29.745140000000003\tGalena Park city\tTX\tTexas\tHarris County\t11269\t28.7\t7.1\t17.7\t13623\t60236\t0.4939\t77547\tRomney\t77547\t0.021998958\t77547.0\n21436\t-95.05344699999999\t29.867026\tBarrett CDP\tTX\tTexas\tHarris County\t3327\t38.7\t8.1\t11.2\t18432\t73071\t0.4939\t77562\tRomney\t77562\t0.006494855999999999\t77562.0\n21437\t-95.515537\t29.758671000000003\tPiney Point Village city\tTX\tTexas\tHarris County\t3599\t49.3\t75.1\t5.6\t85066\t1000001\t0.4939\t77024\tRomney\t77024\t0.007025845\t77024.0\n21438\t-95.172454\t29.788133000000002\tCloverleaf CDP\tTX\tTexas\tHarris County\t26185\t29.2\t9.8\t11.3\t17314\t102107\t0.4939\t77015\tRomney\t77015\t0.05111746599999999\t77015.0\n21439\t-95.37812\t29.91302\tAldine CDP\tTX\tTexas\tHarris County\t14491\t29.1\t5.7\t13.0\t13953\t71673\t0.4939\t77060\tRomney\t77060\t0.028288837\t77060.0\n21440\t-95.193425\t29.977346\tAtascocita CDP\tTX\tTexas\tHarris County\t65471\t33.3\t32.9\t6.5\t31440\t145528\t0.4939\t77346\tRomney\t77346\t0.127810259\t77346.0\n21441\t-95.572425\t29.890728999999997\tJersey Village city\tTX\tTexas\tHarris County\t8901\t38.5\t40.7\t7.8\t37476\t199504\t0.4939\t77041\tRomney\t77041\t0.017376229\t77041.0\n21442\t-95.118735\t29.531587\tWebster city\tTX\tTexas\tHarris County\t10540\t29.3\t29.6\t10.1\t27140\t96923\t0.4939\t77598\tRomney\t77598\t0.020575829\t77598.0\n21443\t-95.462275\t29.703921\tBellaire city\tTX\tTexas\tHarris County\t16457\t42.4\t67.8\t5.9\t51966\t308873\t0.4939\t77401\tRomney\t77401\t0.032126795\t77401.0\n21444\t-95.050336\t29.668288\tLa Porte city\tTX\tTexas\tHarris County\t35448\t34.5\t13.5\t9.0\t25871\t111696\t0.4939\t77571\tRomney\t77571\t0.069200379\t77571.0\n21445\t-95.115312\t29.790992\tChannelview CDP\tTX\tTexas\tHarris County\t36644\t30.7\t8.4\t10.4\t19454\t88154\t0.4939\t77530\tRomney\t77530\t0.07153517\t77530.0\n21446\t-95.432092\t29.715725\tWest University Place city\tTX\tTexas\tHarris County\t14952\t42.1\t80.3\t4.6\t69331\t528399\t0.4939\t77005\tRomney\t77005\t0.029188786\t77005.0\n21447\t-95.519808\t29.779555\tHedwig Village city\tTX\tTexas\tHarris County\t2311\t43.0\t66.6\t6.4\t48434\t525000\t0.4939\t77024\tRomney\t77024\t0.004511456\t77024.0\n21448\t-95.26586999999999\t29.992514\tHumble city\tTX\tTexas\tHarris County\t16888\t31.8\t14.9\t10.6\t21818\t112688\t0.4939\t77338\tRomney\t77338\t0.032968179\t77338.0\n21449\t-95.057833\t29.813039\tHighlands CDP\tTX\tTexas\tHarris County\t7557\t37.3\t7.4\t11.3\t22026\t79118\t0.4939\t77562\tRomney\t77562\t0.014752518000000001\t77562.0\n21450\t-95.498721\t29.771465999999997\tHunters Creek Village city\tTX\tTexas\tHarris County\t4637\t47.4\t77.4\t5.3\t80754\t879261\t0.4939\t77024\tRomney\t77024\t0.009052194\t77024.0\n21451\t-95.151085\t29.659208000000003\tPasadena city\tTX\tTexas\tHarris County\t156049\t30.4\t13.5\t11.0\t19707\t95477\t0.4939\t77505\tRomney\t77505\t0.30463354800000003\t77505.0\n21452\t-95.00317199999999\t29.677521999999996\tMorgan's Point city\tTX\tTexas\tHarris County\t371\t41.8\t23.2\t7.4\t32725\t115625\t0.4939\t77571\tRomney\t77571\t0.0007242539999999999\t77571.0\n21453\t-94.351348\t32.53732\tMarshall city\tTX\tTexas\tHarrison County\t23455\t35.7\t20.8\t12.4\t17943\t82745\t0.3231\t75670\tRomney\t75670\t0.045788052999999995\t75670.0\n21454\t-94.13650200000001\t32.705753\tUncertain city\tTX\tTexas\tHarrison County\t147\t57.5\t13.7\t7.4\t21451\t91250\t0.3231\t75661\tRomney\t75661\t0.00028696799999999997\t75661.0\n21455\t-94.576424\t32.503127\tHallsville city\tTX\tTexas\tHarrison County\t3221\t34.7\t19.5\t7.7\t20780\t104452\t0.3231\t75650\tRomney\t75650\t0.006287927\t75650.0\n21456\t-94.246397\t32.542853\tScottsville city\tTX\tTexas\tHarrison County\t258\t42.7\t10.1\t11.7\t18056\t85000\t0.3231\t75672\tRomney\t75672\t0.000503659\t75672.0\n21457\t-94.0644\t32.476556\tWaskom city\tTX\tTexas\tHarrison County\t1990\t38.4\t8.1\t12.2\t16319\t72326\t0.3231\t75692\tRomney\t75692\t0.00388481\t75692.0\n21458\t-94.446853\t32.590972\tNesbitt town\tTX\tTexas\tHarrison County\t324\t37.5\t7.4\t9.9\t16197\t79000\t0.3231\t75670\tRomney\t75670\t0.000632502\t75670.0\n21459\t-102.393334\t35.891381\tHartley CDP\tTX\tTexas\tHartley County\t438\t37.9\t17.5\t4.3\t17038\t69286\t0.0962\t79044\tRomney\t79044\t0.000855049\t79044.0\n21460\t-102.332224\t35.681901\tChanning city\tTX\tTexas\tHartley County\t354\t38.3\t17.4\t4.3\t17019\t67500\t0.0962\t79018\tRomney\t79018\t0.000691067\t79018.0\n21461\t-99.856235\t33.31422\tRochester town\tTX\tTexas\tHaskell County\t308\t45.5\t15.2\t7.1\t15566\t36500\t0.2747\t79544\tRomney\t79544\t0.000601267\t79544.0\n21462\t-99.893264\t33.181933\tRule town\tTX\tTexas\tHaskell County\t566\t46.7\t12.3\t3.3\t18279\t26719\t0.2747\t79547\tRomney\t79547\t0.001104926\t79547.0\n21463\t-99.673674\t33.323399\tWeinert city\tTX\tTexas\tHaskell County\t144\t45.2\t15.0\t7.0\t15592\t37500\t0.2747\t76388\tRomney\t76388\t0.00028111200000000003\t76388.0\n21464\t-99.732557\t33.158967\tHaskell city\tTX\tTexas\tHaskell County\t2925\t45.5\t14.5\t5.6\t16574\t42315\t0.2747\t79521\tRomney\t79521\t0.005710085\t79521.0\n21465\t-99.843823\t33.380195\tO'Brien city\tTX\tTexas\tHaskell County\t108\t45.3\t16.0\t7.7\t15508\t35000\t0.2747\t79529\tRomney\t79529\t0.00021083400000000002\t79529.0\n21466\t-97.891775\t30.03957\tMountain City\tTX\tTexas\tHays County\t977\t38.6\t43.2\t4.8\t33875\t215299\t0.4327\t78640\tRomney\t78640\t0.0019072660000000001\t78640.0\n21467\t-98.111815\t30.026877000000002\tWoodcreek city\tTX\tTexas\tHays County\t1528\t51.9\t45.3\t6.3\t35800\t214860\t0.4327\t78676\tRomney\t78676\t0.00298291\t78676.0\n21468\t-97.938843\t30.18295\tBear Creek village\tTX\tTexas\tHays County\t496\t42.1\t48.9\t4.5\t39348\t344186\t0.4327\t78737\tRomney\t78737\t0.000968274\t78737.0\n21469\t-97.872861\t30.120148999999998\tHays city\tTX\tTexas\tHays County\t251\t40.8\t32.5\t6.8\t33863\t250000\t0.4327\t78652\tRomney\t78652\t0.000489994\t78652.0\n21470\t-98.091448\t29.995496999999997\tWimberley CDP\tTX\tTexas\tHays County\t5129\t47.9\t45.0\t4.9\t29105\t228488\t0.4327\t78676\tRomney\t78676\t0.010012659\t78676.0\n21471\t-98.089516\t30.188684000000002\tDripping Springs city\tTX\tTexas\tHays County\t1846\t40.6\t42.6\t5.1\t33734\t282051\t0.4327\t78620\tRomney\t78620\t0.003603698\t78620.0\n21472\t-97.873666\t30.001303999999998\tKyle city\tTX\tTexas\tHays County\t13193\t29.6\t19.2\t7.3\t21141\t138533\t0.4327\t78640\tRomney\t78640\t0.025754926\t78640.0\n21473\t-97.83892800000001\t30.085960999999998\tBuda city\tTX\tTexas\tHays County\t3339\t33.1\t29.3\t5.8\t26764\t168662\t0.4327\t78610\tRomney\t78610\t0.006518281999999999\t78610.0\n21474\t-97.732613\t30.022717\tNiederwald town\tTX\tTexas\tHays County\t1158\t31.1\t11.5\t8.9\t17718\t88000\t0.4327\t78610\tRomney\t78610\t0.002260608\t78610.0\n21475\t-97.783716\t29.960853000000004\tUhland city\tTX\tTexas\tHays County\t682\t30.8\t18.6\t6.2\t20731\t137083\t0.4327\t78640\tRomney\t78640\t0.0013313770000000001\t78640.0\n21476\t-97.862883\t29.894683\tSan Marcos city\tTX\tTexas\tHays County\t45953\t24.6\t34.0\t10.6\t18944\t127409\t0.4327\t78656\tRomney\t78656\t0.089707883\t78656.0\n21477\t-100.383852\t35.909754\tCanadian city\tTX\tTexas\tHemphill County\t2365\t39.4\t20.2\t3.7\t18742\t74688\t0.1272\t79014\tRomney\t79014\t0.004616873\t79014.0\n21478\t-96.016319\t32.172365\tMalakoff city\tTX\tTexas\tHenderson County\t2534\t41.3\t13.6\t11.5\t17799\t74776\t0.221\t75148\tRomney\t75148\t0.004946789\t75148.0\n21479\t-95.496358\t32.138338\tCoffee City town\tTX\tTexas\tHenderson County\t193\t45.2\t11.4\t10.5\t18717\t67000\t0.221\t75763\tRomney\t75763\t0.00037676800000000004\t75763.0\n21480\t-96.130894\t32.328232\tGun Barrel City town\tTX\tTexas\tHenderson County\t5549\t46.4\t8.7\t8.5\t21175\t86634\t0.221\t75147\tRomney\t75147\t0.010832568999999998\t75147.0\n21481\t-96.219592\t32.361626\tSeven Points city\tTX\tTexas\tHenderson County\t1214\t42.9\t4.7\t8.8\t17638\t61364\t0.221\t75143\tRomney\t75143\t0.002369929\t75143.0\n21482\t-96.054323\t32.192775\tStar Harbor city\tTX\tTexas\tHenderson County\t470\t57.2\t24.3\t14.2\t27519\t158929\t0.221\t75148\tRomney\t75148\t0.000917518\t75148.0\n21483\t-96.172782\t32.280161\tTool city\tTX\tTexas\tHenderson County\t2470\t53.3\t10.8\t10.7\t23266\t97073\t0.221\t75147\tRomney\t75147\t0.00482185\t75147.0\n21484\t-96.11516800000001\t32.286019\tPayne Springs town\tTX\tTexas\tHenderson County\t802\t47.5\t11.1\t15.6\t20085\t91250\t0.221\t75147\tRomney\t75147\t0.0015656370000000001\t75147.0\n21485\t-96.01360799999999\t32.307279\tEustace city\tTX\tTexas\tHenderson County\t925\t39.8\t10.4\t9.3\t19545\t86250\t0.221\t75124\tRomney\t75124\t0.001805754\t75124.0\n21486\t-96.1088\t32.266199\tEnchanted Oaks town\tTX\tTexas\tHenderson County\t420\t47.7\t11.1\t16.3\t20160\t94000\t0.221\t75147\tRomney\t75147\t0.00081991\t75147.0\n21487\t-95.612282\t32.298086\tBrownsboro city\tTX\tTexas\tHenderson County\t898\t35.2\t17.1\t7.5\t19747\t86429\t0.221\t75756\tRomney\t75756\t0.001753045\t75756.0\n21488\t-95.83731999999999\t32.204101\tAthens city\tTX\tTexas\tHenderson County\t11564\t35.9\t20.4\t9.2\t19318\t99696\t0.221\t75751\tRomney\t75751\t0.022574847000000002\t75751.0\n21489\t-95.570115\t32.190779\tMoore Station city\tTX\tTexas\tHenderson County\t188\t41.5\t13.7\t18.4\t15489\t57000\t0.221\t75758\tRomney\t75758\t0.000367007\t75758.0\n21490\t-96.105248\t32.156245\tTrinidad city\tTX\tTexas\tHenderson County\t1207\t39.1\t9.1\t10.5\t15101\t56136\t0.221\t75163\tRomney\t75163\t0.002356264\t75163.0\n21491\t-96.021754\t32.223527000000004\tLog Cabin city\tTX\tTexas\tHenderson County\t864\t46.9\t7.6\t5.7\t18420\t66111\t0.221\t75148\tRomney\t75148\t0.001686671\t75148.0\n21492\t-95.472466\t32.087759000000005\tBerryville town\tTX\tTexas\tHenderson County\t892\t46.1\t11.4\t9.9\t18750\t69750\t0.221\t75763\tRomney\t75763\t0.0017413320000000002\t75763.0\n21493\t-95.478685\t32.305594\tChandler city\tTX\tTexas\tHenderson County\t2196\t40.9\t22.2\t4.1\t23278\t144318\t0.221\t757HH\tRomney\t757HH\t0.004286956\t0.0\n21494\t-95.592401\t32.079346\tPoynor town\tTX\tTexas\tHenderson County\t354\t42.5\t15.5\t5.4\t19144\t91667\t0.221\t75782\tRomney\t75782\t0.000691067\t75782.0\n21495\t-95.75614\t32.275175\tMurchison city\tTX\tTexas\tHenderson County\t640\t37.4\t16.6\t6.4\t21217\t84750\t0.221\t75778\tRomney\t75778\t0.0012493860000000001\t75778.0\n21496\t-96.03811999999999\t32.209624\tCaney City town\tTX\tTexas\tHenderson County\t270\t53.9\t19.0\t11.0\t24498\t128750\t0.221\t75148\tRomney\t75148\t0.000527085\t75148.0\n21497\t-98.392326\t26.328691\tCitrus City CDP\tTX\tTexas\tHidalgo County\t1324\t21.6\t5.7\t13.0\t5511\t38295\t0.7040000000000001\t78576\tRomney\t78576\t0.002584668\t78576.0\n21498\t-98.578742\t26.258477000000003\tCuevitas CDP\tTX\tTexas\tHidalgo County\t57\t29.4\t6.7\t21.1\t6956\t51667\t0.7040000000000001\t78565\tRomney\t78565\t0.00011127299999999999\t78565.0\n21499\t-98.314727\t26.297990000000002\tAlton North CDP\tTX\tTexas\tHidalgo County\t8261\t25.4\t2.9\t15.9\t6722\t48021\t0.7040000000000001\t78572\tRomney\t78572\t0.016126843000000002\t78572.0\n21500\t-97.993093\t26.228546\tOlivarez CDP\tTX\tTexas\tHidalgo County\t3903\t22.6\t5.6\t20.3\t6778\t49864\t0.7040000000000001\t78596\tRomney\t78596\t0.007619304\t78596.0\n21501\t-98.116904\t26.360051000000002\tDoolittle CDP\tTX\tTexas\tHidalgo County\t2473\t24.0\t6.4\t15.9\t7917\t57933\t0.7040000000000001\t78539\tRomney\t78539\t0.004827706\t78539.0\n21502\t-98.108036\t26.151667\tSouth Alamo CDP\tTX\tTexas\tHidalgo County\t4025\t24.8\t4.6\t21.7\t6041\t47833\t0.7040000000000001\t78516\tRomney\t78516\t0.007857468000000001\t78516.0\n21503\t-98.37965799999999\t26.230124\tPalmview city\tTX\tTexas\tHidalgo County\t4656\t26.0\t11.1\t18.3\t8732\t61094\t0.7040000000000001\t78572\tRomney\t78572\t0.009089285\t78572.0\n21504\t-97.902812\t26.084657\tRelampago CDP\tTX\tTexas\tHidalgo County\t190\t23.8\t6.6\t16.4\t6609\t44167\t0.7040000000000001\t78592\tRomney\t78592\t0.000370912\t78592.0\n21505\t-97.972725\t26.374373\tMonte Alto CDP\tTX\tTexas\tHidalgo County\t1628\t27.3\t9.9\t17.0\t8717\t45233\t0.7040000000000001\t78538\tRomney\t78538\t0.003178126\t78538.0\n21506\t-97.926333\t26.297517\tLa Villa city\tTX\tTexas\tHidalgo County\t1724\t26.6\t5.0\t19.3\t7291\t40391\t0.7040000000000001\t78562\tRomney\t78562\t0.0033655340000000003\t78562.0\n21507\t-97.959902\t26.222316999999997\tMila Doce CDP\tTX\tTexas\tHidalgo County\t6687\t22.7\t8.0\t21.6\t6487\t50110\t0.7040000000000001\t78596\tRomney\t78596\t0.013054133999999998\t78596.0\n21508\t-97.956638\t26.096091\tProgreso city\tTX\tTexas\tHidalgo County\t6300\t24.3\t6.2\t18.1\t6505\t45688\t0.7040000000000001\t78579\tRomney\t78579\t0.012298646000000002\t78579.0\n21509\t-98.31568100000001\t26.285424\tAlton city\tTX\tTexas\tHidalgo County\t8716\t26.8\t6.7\t13.1\t8582\t57715\t0.7040000000000001\t78572\tRomney\t78572\t0.017015079\t78572.0\n21510\t-98.413161\t26.224957\tAbram-Perezville CDP\tTX\tTexas\tHidalgo County\t5407\t28.9\t7.6\t12.9\t10145\t55648\t0.7040000000000001\t78576\tRomney\t78576\t0.010555361000000001\t78576.0\n21511\t-98.129746\t26.566197999999996\tSan Manuel-Linn CDP\tTX\tTexas\tHidalgo County\t1088\t37.5\t13.7\t11.4\t13763\t50408\t0.7040000000000001\t78563\tRomney\t78563\t0.002123957\t78563.0\n21512\t-97.99589499999999\t26.129888\tVilla Verde CDP\tTX\tTexas\tHidalgo County\t1020\t28.0\t13.9\t14.4\t13427\t81250\t0.7040000000000001\t78596\tRomney\t78596\t0.001991209\t78596.0\n21513\t-98.35778\t26.277034000000004\tLa Homa CDP\tTX\tTexas\tHidalgo County\t14527\t23.5\t5.2\t16.7\t7141\t50197\t0.7040000000000001\t78572\tRomney\t78572\t0.028359115\t78572.0\n21514\t-98.476017\t26.248382\tLa Joya city\tTX\tTexas\tHidalgo County\t4810\t29.6\t7.6\t18.5\t10063\t64186\t0.7040000000000001\t78560\tRomney\t78560\t0.009389918\t78560.0\n21515\t-98.37742\t26.216143\tPalmview South CDP\tTX\tTexas\tHidalgo County\t5568\t26.4\t10.6\t15.5\t8525\t59182\t0.7040000000000001\t78572\tRomney\t78572\t0.01086966\t78572.0\n21516\t-98.558059\t26.242426000000002\tLos Ebanos CDP\tTX\tTexas\tHidalgo County\t527\t39.2\t18.2\t22.4\t6713\t50952\t0.7040000000000001\t78565\tRomney\t78565\t0.001028791\t78565.0\n21517\t-98.163011\t26.315398\tEdinburg city\tTX\tTexas\tHidalgo County\t73077\t28.4\t21.0\t10.2\t13851\t77657\t0.7040000000000001\t78539\tRomney\t78539\t0.142658433\t78539.0\n21518\t-98.189526\t26.174221\tPharr city\tTX\tTexas\tHidalgo County\t66005\t28.8\t13.1\t11.5\t10985\t57986\t0.7040000000000001\t78577\tRomney\t78577\t0.128852715\t78577.0\n21519\t-98.052319\t26.170469\tDonna city\tTX\tTexas\tHidalgo County\t16697\t31.9\t10.6\t14.3\t10897\t53900\t0.7040000000000001\t78537\tRomney\t78537\t0.032595315\t78537.0\n21520\t-97.987342\t26.159172\tWeslaco city\tTX\tTexas\tHidalgo County\t34811\t30.7\t15.5\t13.6\t13017\t62128\t0.7040000000000001\t78596\tRomney\t78596\t0.06795685\t78596.0\n21521\t-98.244748\t26.217432000000002\tMcAllen city\tTX\tTexas\tHidalgo County\t124726\t31.9\t26.6\t8.5\t17753\t103321\t0.7040000000000001\t78501\tRomney\t78501\t0.243485853\t78501.0\n21522\t-97.958826\t26.071277\tProgreso Lakes city\tTX\tTexas\tHidalgo County\t434\t25.2\t8.2\t14.7\t8627\t47727\t0.7040000000000001\t78579\tRomney\t78579\t0.00084724\t78579.0\n21523\t-98.445729\t26.240784\tPenitas city\tTX\tTexas\tHidalgo County\t1109\t28.3\t7.7\t12.7\t8848\t61316\t0.7040000000000001\t78576\tRomney\t78576\t0.002164952\t78576.0\n21524\t-98.301264\t26.260011\tPalmhurst city\tTX\tTexas\tHidalgo County\t5778\t26.7\t15.3\t13.0\t11119\t81172\t0.7040000000000001\t78572\tRomney\t78572\t0.011279615\t78572.0\n21525\t-97.963101\t26.2942\tEdcouch city\tTX\tTexas\tHidalgo County\t4206\t26.5\t7.2\t14.3\t8379\t47500\t0.7040000000000001\t78543\tRomney\t78543\t0.00821081\t78543.0\n21526\t-98.06301500000001\t26.295671000000002\tSan Carlos CDP\tTX\tTexas\tHidalgo County\t3769\t26.0\t8.2\t12.9\t9089\t56947\t0.7040000000000001\t78558\tRomney\t78558\t0.0073577140000000004\t78558.0\n21527\t-97.968772\t26.131117\tLlano Grande CDP\tTX\tTexas\tHidalgo County\t3581\t33.4\t8.3\t11.5\t11110\t53506\t0.7040000000000001\t78596\tRomney\t78596\t0.006990706\t78596.0\n21528\t-98.12825500000001\t26.216316\tNorth Alamo CDP\tTX\tTexas\tHidalgo County\t2659\t29.5\t8.1\t12.9\t10835\t50286\t0.7040000000000001\t78589\tRomney\t78589\t0.005190809\t78589.0\n21529\t-98.30281\t26.138185\tGranjeno city\tTX\tTexas\tHidalgo County\t302\t26.5\t5.8\t12.4\t7459\t82143\t0.7040000000000001\t78503\tRomney\t78503\t0.0005895540000000001\t78503.0\n21530\t-98.129561\t26.404013\tFaysville CDP\tTX\tTexas\tHidalgo County\t349\t31.3\t3.7\t13.8\t11205\t54000\t0.7040000000000001\t78539\tRomney\t78539\t0.000681306\t78539.0\n21531\t-98.116609\t26.183159\tAlamo city\tTX\tTexas\tHidalgo County\t18496\t30.2\t12.1\t15.0\t10472\t53253\t0.7040000000000001\t78516\tRomney\t78516\t0.036107262\t78516.0\n21532\t-98.046933\t26.133895000000003\tScissors CDP\tTX\tTexas\tHidalgo County\t3390\t24.4\t6.0\t9.2\t7057\t47850\t0.7040000000000001\t78537\tRomney\t78537\t0.006617843000000001\t78537.0\n21533\t-98.564447\t26.275211\tSullivan City\tTX\tTexas\tHidalgo County\t5766\t27.4\t3.2\t19.8\t7376\t51891\t0.7040000000000001\t78595\tRomney\t78595\t0.011256189\t78595.0\n21534\t-98.15793199999999\t26.249218\tLopezville CDP\tTX\tTexas\tHidalgo County\t5871\t26.3\t6.5\t14.9\t9618\t64101\t0.7040000000000001\t78577\tRomney\t78577\t0.011461166000000002\t78577.0\n21535\t-98.335521\t26.276115\tWest Sharyland CDP\tTX\tTexas\tHidalgo County\t3815\t24.8\t5.5\t14.3\t7257\t55735\t0.7040000000000001\t78572\tRomney\t78572\t0.007447513\t78572.0\n21536\t-97.993842\t26.298201000000002\tElsa city\tTX\tTexas\tHidalgo County\t7475\t28.1\t7.7\t20.8\t9114\t51966\t0.7040000000000001\t78543\tRomney\t78543\t0.014592441000000001\t78543.0\n21537\t-98.508996\t26.250729999999997\tHavana CDP\tTX\tTexas\tHidalgo County\t652\t27.4\t3.4\t20.2\t7304\t52391\t0.7040000000000001\t78560\tRomney\t78560\t0.001272812\t78560.0\n21538\t-98.089669\t26.257821999999997\tMuniz CDP\tTX\tTexas\tHidalgo County\t1289\t23.5\t6.7\t15.0\t6666\t45811\t0.7040000000000001\t78558\tRomney\t78558\t0.002516342\t78558.0\n21539\t-98.125855\t26.264138\tNurillo CDP\tTX\tTexas\tHidalgo County\t8798\t25.9\t10.3\t12.2\t10450\t64787\t0.7040000000000001\t78589\tRomney\t78589\t0.017175156\t78589.0\n21540\t-98.385581\t26.278793\tDoffing CDP\tTX\tTexas\tHidalgo County\t5886\t22.9\t3.3\t15.6\t6642\t48165\t0.7040000000000001\t78572\tRomney\t78572\t0.011490449\t78572.0\n21541\t-97.920101\t26.148951\tMercedes city\tTX\tTexas\tHidalgo County\t15158\t30.8\t13.9\t13.9\t11023\t54726\t0.7040000000000001\t78570\tRomney\t78570\t0.029590932\t78570.0\n21542\t-97.885486\t26.182229\tHeidelberg CDP\tTX\tTexas\tHidalgo County\t1768\t23.3\t13.8\t23.4\t7128\t45132\t0.7040000000000001\t78570\tRomney\t78570\t0.003451429\t78570.0\n21543\t-98.316506\t26.207696\tMission city\tTX\tTexas\tHidalgo County\t71434\t31.7\t21.1\t10.5\t14874\t82660\t0.7040000000000001\t78572\tRomney\t78572\t0.139451024\t78572.0\n21544\t-98.11410699999999\t26.310565999999998\tCesar Chavez CDP\tTX\tTexas\tHidalgo County\t1948\t26.6\t11.6\t15.5\t10374\t58571\t0.7040000000000001\t78539\tRomney\t78539\t0.0038028190000000003\t78539.0\n21545\t-98.152268\t26.190295000000003\tSan Juan city\tTX\tTexas\tHidalgo County\t32618\t26.5\t9.3\t11.4\t9682\t59492\t0.7040000000000001\t78589\tRomney\t78589\t0.06367575\t78589.0\n21546\t-98.019875\t26.156841\tMidway South CDP\tTX\tTexas\tHidalgo County\t2074\t28.1\t11.5\t13.4\t10159\t49554\t0.7040000000000001\t78596\tRomney\t78596\t0.004048792\t78596.0\n21547\t-98.028599\t26.304787\tLa Blanca CDP\tTX\tTexas\tHidalgo County\t2974\t25.1\t5.5\t15.8\t7685\t52590\t0.7040000000000001\t78558\tRomney\t78558\t0.005805741999999999\t78558.0\n21548\t-97.918347\t26.212237\tIndian Hills CDP\tTX\tTexas\tHidalgo County\t2614\t21.5\t10.7\t22.7\t6405\t41875\t0.7040000000000001\t78570\tRomney\t78570\t0.005102962\t78570.0\n21549\t-98.254487\t26.103481\tHidalgo city\tTX\tTexas\tHidalgo County\t9374\t26.7\t7.0\t14.0\t7335\t78968\t0.7040000000000001\t78557\tRomney\t78557\t0.018299604\t78557.0\n21550\t-98.017174\t26.188082\tMidway North CDP\tTX\tTexas\tHidalgo County\t4323\t23.3\t12.2\t13.0\t9138\t67000\t0.7040000000000001\t78596\tRomney\t78596\t0.008439214\t78596.0\n21551\t-97.926162\t26.279289000000002\tLaguna Seca CDP\tTX\tTexas\tHidalgo County\t255\t25.8\t11.5\t25.6\t8495\t61250\t0.7040000000000001\t78562\tRomney\t78562\t0.000497802\t78562.0\n21552\t-97.086943\t31.889395\tAbbott city\tTX\tTexas\tHill County\t319\t42.4\t23.9\t2.4\t18680\t103846\t0.2285\t76621\tRomney\t76621\t0.000622741\t76621.0\n21553\t-97.397225\t32.141897\tBlum town\tTX\tTexas\tHill County\t481\t41.1\t11.1\t7.4\t17351\t77500\t0.2285\t76627\tRomney\t76627\t0.0009389919999999999\t76627.0\n21554\t-97.14806\t32.158752\tItasca city\tTX\tTexas\tHill County\t1569\t38.2\t11.8\t7.2\t15134\t60179\t0.2285\t76055\tRomney\t76055\t0.003062948\t76055.0\n21555\t-96.893762\t32.058842\tMertens town\tTX\tTexas\tHill County\t159\t43.6\t18.9\t2.7\t20137\t98333\t0.2285\t76666\tRomney\t76666\t0.000310394\t76666.0\n21556\t-97.117176\t32.005249\tHillsboro city\tTX\tTexas\tHill County\t8713\t33.7\t14.5\t8.4\t16154\t79919\t0.2285\t76645\tRomney\t76645\t0.017009222\t76645.0\n21557\t-97.00327\t31.968971999999997\tBynum town\tTX\tTexas\tHill County\t244\t43.2\t19.5\t3.5\t20227\t101389\t0.2285\t76631\tRomney\t76631\t0.00047632800000000004\t76631.0\n21558\t-97.048402\t32.086615\tCarl's Corner town\tTX\tTexas\tHill County\t143\t36.4\t10.3\t16.4\t18830\t134375\t0.2285\t76670\tRomney\t76670\t0.00027916\t76670.0\n21559\t-97.220151\t31.854709000000003\tAquilla city\tTX\tTexas\tHill County\t155\t43.1\t13.9\t2.9\t18080\t96667\t0.2285\t76622\tRomney\t76622\t0.000302586\t76622.0\n21560\t-96.92819300000001\t31.858525\tPenelope town\tTX\tTexas\tHill County\t240\t40.0\t12.6\t7.1\t15754\t74000\t0.2285\t76676\tRomney\t76676\t0.00046852\t76676.0\n21561\t-96.881725\t31.756559000000003\tMount Calm city\tTX\tTexas\tHill County\t373\t42.7\t11.8\t6.4\t17795\t83750\t0.2285\t76673\tRomney\t76673\t0.000728158\t76673.0\n21562\t-97.318045\t31.951818\tWhitney town\tTX\tTexas\tHill County\t2011\t44.0\t10.2\t8.9\t15687\t81413\t0.2285\t76692\tRomney\t76692\t0.003925806\t76692.0\n21563\t-96.800358\t31.846973\tHubbard city\tTX\tTexas\tHill County\t1763\t41.4\t14.5\t9.3\t17482\t66034\t0.2285\t76648\tRomney\t76648\t0.003441669\t76648.0\n21564\t-97.260292\t32.178385999999996\tCovington city\tTX\tTexas\tHill County\t286\t35.3\t13.7\t7.8\t19111\t94000\t0.2285\t76636\tRomney\t76636\t0.000558319\t76636.0\n21565\t-96.894706\t31.91706\tMalone town\tTX\tTexas\tHill County\t316\t40.2\t12.9\t7.3\t15767\t73333\t0.2285\t76660\tRomney\t76660\t0.000616884\t76660.0\n21566\t-102.16342900000001\t33.587328\tSmyer town\tTX\tTexas\tHockley County\t481\t34.6\t16.0\t9.6\t17054\t67941\t0.2083\t79367\tRomney\t79367\t0.0009389919999999999\t79367.0\n21567\t-102.49083\t33.457578999999996\tSundown city\tTX\tTexas\tHockley County\t1378\t32.1\t11.8\t9.2\t14630\t46829\t0.2083\t79372\tRomney\t79372\t0.002690085\t79372.0\n21568\t-102.162134\t33.811284\tAnton city\tTX\tTexas\tHockley County\t1124\t35.9\t12.8\t6.4\t14742\t48256\t0.2083\t79313\tRomney\t79313\t0.002194235\t79313.0\n21569\t-102.155082\t33.413455\tRopesville city\tTX\tTexas\tHockley County\t538\t36.9\t20.9\t7.9\t18819\t66250\t0.2083\t79358\tRomney\t79358\t0.001050265\t79358.0\n21570\t-102.300789\t33.592981\tOpdyke West town\tTX\tTexas\tHockley County\t176\t33.8\t13.4\t6.4\t21401\t58000\t0.2083\t79336\tRomney\t79336\t0.000343581\t79336.0\n21571\t-102.364113\t33.580587\tLevelland city\tTX\tTexas\tHockley County\t12808\t32.6\t15.2\t9.3\t17098\t61984\t0.2083\t79336\tRomney\t79336\t0.025003342\t79336.0\n21572\t-98.046944\t32.518696000000006\tLipan city\tTX\tTexas\tHood County\t472\t40.4\t14.7\t8.8\t19985\t93333\t0.1705\t76462\tRomney\t76462\t0.000921422\t76462.0\n21573\t-97.918801\t32.389140999999995\tTolar city\tTX\tTexas\tHood County\t601\t36.9\t19.9\t10.7\t22141\t123214\t0.1705\t76476\tRomney\t76476\t0.001173252\t76476.0\n21574\t-97.78319300000001\t32.439341999999996\tGranbury city\tTX\tTexas\tHood County\t6848\t41.4\t20.3\t6.1\t24823\t136530\t0.1705\t76048\tRomney\t76048\t0.013368433\t76048.0\n21575\t-97.83578299999999\t32.488579\tOak Trail Shores CDP\tTX\tTexas\tHood County\t2911\t37.8\t9.9\t13.1\t15062\t55000\t0.1705\t76048\tRomney\t76048\t0.005682755\t76048.0\n21576\t-97.658162\t32.363422\tPecan Plantation CDP\tTX\tTexas\tHood County\t5416\t59.3\t49.9\t4.1\t44130\t281813\t0.1705\t76077\tRomney\t76077\t0.010572931\t76077.0\n21577\t-95.475546\t33.060163\tComo town\tTX\tTexas\tHopkins County\t714\t35.4\t8.1\t5.9\t15184\t64063\t0.2178\t75431\tRomney\t75431\t0.0013938470000000001\t75431.0\n21578\t-95.61071899999999\t33.14565\tSulphur Springs city\tTX\tTexas\tHopkins County\t14706\t37.7\t19.6\t8.4\t19109\t89639\t0.2178\t75482\tRomney\t75482\t0.028708552999999998\t75482.0\n21579\t-95.589345\t33.322334999999995\tTira town\tTX\tTexas\tHopkins County\t287\t40.4\t16.3\t5.2\t17815\t72500\t0.2178\t75450\tRomney\t75450\t0.000560272\t75450.0\n21580\t-95.83928399999999\t33.133927\tCumby city\tTX\tTexas\tHopkins County\t846\t45.0\t17.0\t4.3\t18296\t54500\t0.2178\t75433\tRomney\t75433\t0.001651532\t75433.0\n21581\t-95.475207\t31.38891\tLatexo city\tTX\tTexas\tHouston County\t281\t45.6\t14.8\t12.2\t19824\t78889\t0.2757\t75849\tRomney\t75849\t0.000548559\t75849.0\n21582\t-95.18539100000001\t31.357722999999996\tKennard city\tTX\tTexas\tHouston County\t321\t39.8\t11.6\t13.0\t17751\t73750\t0.2757\t75847\tRomney\t75847\t0.000626645\t75847.0\n21583\t-95.480106\t31.494787\tGrapeland city\tTX\tTexas\tHouston County\t1417\t45.5\t10.7\t9.7\t16429\t64024\t0.2757\t75844\tRomney\t75844\t0.0027662190000000003\t75844.0\n21584\t-95.456438\t31.317596\tCrockett city\tTX\tTexas\tHouston County\t7148\t39.4\t12.2\t13.2\t15028\t58745\t0.2757\t75835\tRomney\t75835\t0.013954082\t75835.0\n21585\t-95.44551899999999\t31.126151\tLovelady city\tTX\tTexas\tHouston County\t611\t39.5\t22.2\t5.4\t17574\t58103\t0.2757\t75851\tRomney\t75851\t0.001192773\t75851.0\n21586\t-101.480263\t32.2387\tBig Spring city\tTX\tTexas\tHoward County\t25501\t35.3\t11.9\t8.5\t17220\t48926\t0.2427\t79720\tRomney\t79720\t0.049782185\t79720.0\n21587\t-101.366815\t32.110339\tForsan city\tTX\tTexas\tHoward County\t209\t42.3\t14.0\t7.1\t19589\t73750\t0.2427\t79733\tRomney\t79733\t0.00040800300000000004\t79733.0\n21588\t-101.308612\t32.295770000000005\tCoahoma town\tTX\tTexas\tHoward County\t796\t42.6\t11.3\t6.6\t19566\t54737\t0.2427\t79511\tRomney\t79511\t0.001553924\t79511.0\n21589\t-105.340979\t31.183944\tSierra Blanca CDP\tTX\tTexas\tHudspeth County\t500\t36.0\t15.1\t4.4\t15793\t53636\t0.4392\t79851\tRomney\t79851\t0.000976083\t79851.0\n21590\t-105.89000800000001\t31.320629999999998\tFort Hancock CDP\tTX\tTexas\tHudspeth County\t1769\t27.6\t9.1\t11.2\t9289\t32240\t0.4392\t79839\tRomney\t79839\t0.003453382\t79839.0\n21591\t-105.19984099999999\t31.935022999999997\tDell City\tTX\tTexas\tHudspeth County\t371\t42.4\t5.9\t6.3\t13873\t37500\t0.4392\t79837\tRomney\t79837\t0.0007242539999999999\t79837.0\n21592\t-96.00554\t33.200764\tNeylandville town\tTX\tTexas\tHunt County\t53\t36.3\t11.8\t8.7\t18405\t60000\t0.2378\t75422\tRomney\t75422\t0.000103465\t75422.0\n21593\t-96.238625\t33.052053\tCaddo Mills city\tTX\tTexas\tHunt County\t1195\t38.0\t11.2\t5.7\t17199\t63667\t0.2378\t75135\tRomney\t75135\t0.002332838\t75135.0\n21594\t-95.94321500000001\t32.996359999999996\tLone Oak town\tTX\tTexas\tHunt County\t544\t37.4\t11.6\t7.8\t15197\t55385\t0.2378\t75453\tRomney\t75453\t0.001061978\t75453.0\n21595\t-96.068845\t33.370494\tWolfe City\tTX\tTexas\tHunt County\t1618\t36.8\t12.4\t7.9\t18531\t49444\t0.2378\t75496\tRomney\t75496\t0.003158605\t75496.0\n21596\t-95.90051700000001\t33.239199\tCommerce city\tTX\tTexas\tHunt County\t8047\t27.2\t35.1\t10.4\t18224\t71942\t0.2378\t75428\tRomney\t75428\t0.01570908\t75428.0\n21597\t-95.953056\t33.148831\tCampbell city\tTX\tTexas\tHunt County\t905\t43.4\t23.3\t8.0\t20805\t80192\t0.2378\t75422\tRomney\t75422\t0.00176671\t75422.0\n21598\t-96.132706\t32.909135\tQuinlan city\tTX\tTexas\tHunt County\t1539\t38.3\t7.8\t7.5\t17613\t57131\t0.2378\t75474\tRomney\t75474\t0.003004383\t75474.0\n21599\t-96.112537\t33.109077\tGreenville city\tTX\tTexas\tHunt County\t24778\t36.7\t22.1\t8.9\t20394\t71695\t0.2378\t75402\tRomney\t75402\t0.048370769\t75402.0\n21600\t-96.081254\t32.883453\tHawk Cove city\tTX\tTexas\tHunt County\t489\t40.2\t7.7\t6.3\t18257\t47500\t0.2378\t75474\tRomney\t75474\t0.0009546089999999999\t75474.0\n21601\t-96.195276\t33.293882\tCeleste city\tTX\tTexas\tHunt County\t850\t33.6\t12.4\t5.8\t18172\t50341\t0.2378\t75423\tRomney\t75423\t0.0016593410000000002\t75423.0\n21602\t-96.030354\t32.897397999999995\tWest Tawakoni town\tTX\tTexas\tHunt County\t1658\t38.4\t8.0\t9.4\t16935\t46726\t0.2378\t75474\tRomney\t75474\t0.003236691\t75474.0\n21603\t-101.443648\t35.823111\tStinnett city\tTX\tTexas\tHutchinson County\t1644\t40.5\t11.1\t5.9\t16859\t47672\t0.1318\t79083\tRomney\t79083\t0.0032093609999999996\t79083.0\n21604\t-101.400897\t35.659944\tBorger city\tTX\tTexas\tHutchinson County\t13616\t36.5\t15.1\t8.6\t20673\t54121\t0.1318\t79007\tRomney\t79007\t0.026580692000000003\t79007.0\n21605\t-101.531801\t35.702605\tSanford town\tTX\tTexas\tHutchinson County\t177\t44.2\t14.8\t4.3\t19070\t81000\t0.1318\t79078\tRomney\t79078\t0.00034553300000000003\t79078.0\n21606\t-101.596468\t35.642394\tFritch city\tTX\tTexas\tHutchinson County\t1960\t41.2\t15.6\t8.5\t20767\t58712\t0.1318\t79036\tRomney\t79036\t0.003826245\t79036.0\n21607\t-100.82080500000001\t31.262029\tMertzon city\tTX\tTexas\tIrion County\t826\t39.3\t15.9\t3.2\t19355\t75200\t0.1421\t76941\tRomney\t76941\t0.001612489\t76941.0\n21608\t-98.15553100000001\t33.224144\tJacksboro city\tTX\tTexas\tJack County\t4562\t38.0\t16.1\t5.9\t18367\t58355\t0.1042\t76458\tRomney\t76458\t0.008905781\t76458.0\n21609\t-98.387376\t33.159839\tBryson city\tTX\tTexas\tJack County\t527\t45.2\t9.2\t2.7\t19320\t55000\t0.1042\t76427\tRomney\t76427\t0.001028791\t76427.0\n21610\t-96.647784\t28.97545\tEdna city\tTX\tTexas\tJackson County\t5825\t38.2\t14.8\t6.7\t17550\t69312\t0.2129\t77957\tRomney\t77957\t0.011371367\t77957.0\n21611\t-96.53873399999999\t28.832542\tLolita CDP\tTX\tTexas\tJackson County\t567\t37.7\t8.8\t10.2\t19472\t67000\t0.2129\t77971\tRomney\t77971\t0.001106878\t77971.0\n21612\t-96.609711\t28.820840000000004\tVanderbilt CDP\tTX\tTexas\tJackson County\t419\t40.9\t21.1\t6.8\t21876\t88333\t0.2129\t77991\tRomney\t77991\t0.000817958\t77991.0\n21613\t-96.464907\t28.846424\tLa Ward city\tTX\tTexas\tJackson County\t208\t40.5\t11.3\t10.2\t19939\t70000\t0.2129\t77970\tRomney\t77970\t0.000406051\t77970.0\n21614\t-96.510995\t29.041208\tGanado city\tTX\tTexas\tJackson County\t1975\t39.0\t13.3\t8.7\t17444\t75814\t0.2129\t77962\tRomney\t77962\t0.003855528\t77962.0\n21615\t-93.98013900000001\t31.125108\tBrowndell city\tTX\tTexas\tJasper County\t204\t41.9\t5.1\t9.4\t15940\t58333\t0.2532\t75931\tRomney\t75931\t0.000398242\t75931.0\n21616\t-93.900053\t30.657901000000003\tKirbyville city\tTX\tTexas\tJasper County\t2269\t39.1\t11.2\t11.9\t16721\t60259\t0.2532\t75956\tRomney\t75956\t0.004429465\t75956.0\n21617\t-94.059927\t30.336883\tEvadale CDP\tTX\tTexas\tJasper County\t1325\t36.4\t6.0\t14.4\t17462\t58902\t0.2532\t77615\tRomney\t77615\t0.00258662\t77615.0\n21618\t-93.994336\t30.922116\tJasper city\tTX\tTexas\tJasper County\t7364\t35.9\t13.0\t10.8\t16315\t74228\t0.2532\t75951\tRomney\t75951\t0.01437575\t75951.0\n21619\t-93.962411\t30.445859999999996\tBuna CDP\tTX\tTexas\tJasper County\t2117\t40.6\t9.5\t10.3\t17224\t72358\t0.2532\t77612\tRomney\t77612\t0.004132735\t77612.0\n21620\t-103.894238\t30.59113\tFort Davis CDP\tTX\tTexas\tJeff Davis County\t1162\t43.7\t28.1\t7.9\t16462\t104508\t0.3691\t79734\tRomney\t79734\t0.002268417\t79734.0\n21621\t-104.495351\t30.588672999999996\tValentine town\tTX\tTexas\tJeff Davis County\t202\t49.6\t28.9\t14.1\t20771\t32500\t0.3691\t79854\tRomney\t79854\t0.00039433800000000005\t79854.0\n21622\t-93.884835\t30.002633000000003\tPort Arthur city\tTX\tTexas\tJefferson County\t55014\t36.0\t11.3\t14.9\t16849\t46723\t0.504\t77611\tRomney\t77611\t0.107396459\t77611.0\n21623\t-94.338402\t30.052467\tChina city\tTX\tTexas\tJefferson County\t981\t41.3\t16.9\t6.3\t19299\t82391\t0.504\t77613\tRomney\t77613\t0.001915075\t77613.0\n21624\t-94.406113\t30.036497999999998\tNome city\tTX\tTexas\tJefferson County\t456\t37.5\t14.5\t7.1\t19549\t78750\t0.504\t77629\tRomney\t77629\t0.000890188\t77629.0\n21625\t-93.964928\t29.976658\tPort Neches city\tTX\tTexas\tJefferson County\t13173\t40.7\t23.0\t9.7\t26557\t100856\t0.504\t77651\tRomney\t77651\t0.025715882000000002\t77651.0\n21626\t-94.27105\t30.151887\tBevil Oaks city\tTX\tTexas\tJefferson County\t1254\t47.3\t24.6\t6.3\t26324\t112593\t0.504\t77713\tRomney\t77713\t0.002448016\t77713.0\n21627\t-93.999849\t29.971203999999997\tNederland city\tTX\tTexas\tJefferson County\t16967\t38.9\t19.0\t9.9\t24998\t85417\t0.504\t77627\tRomney\t77627\t0.033122399999999996\t77627.0\n21628\t-94.021566\t29.989340000000002\tCentral Gardens CDP\tTX\tTexas\tJefferson County\t4248\t38.8\t24.1\t9.8\t25137\t103641\t0.504\t77627\tRomney\t77627\t0.008292800999999999\t77627.0\n21629\t-93.91636899999999\t29.945627\tGroves city\tTX\tTexas\tJefferson County\t14619\t40.8\t16.7\t9.8\t23729\t76811\t0.504\t77619\tRomney\t77619\t0.028538714\t77619.0\n21630\t-94.14415799999999\t30.084488\tBeaumont city\tTX\tTexas\tJefferson County\t111089\t36.0\t24.2\t10.5\t21904\t79512\t0.504\t77702\tRomney\t77702\t0.21686416600000002\t77702.0\n21631\t-98.723922\t27.269707\tSouth Fork Estates CDP\tTX\tTexas\tJim Hogg County\t50\t37.5\t3.2\t10.7\t11782\t40000\t0.7804\t78361\tRomney\t78361\t9.76e-05\t78361.0\n21632\t-98.68554499999999\t27.323271999999996\tHebbronville CDP\tTX\tTexas\tJim Hogg County\t4331\t35.4\t10.1\t9.2\t13928\t43264\t0.7804\t78376\tRomney\t78376\t0.008454831\t78376.0\n21633\t-98.878187\t26.867198\tGuerra CDP\tTX\tTexas\tJim Hogg County\t7\t0.0\t0.0\t0.0\t11865\t0\t0.7804\t78361\tRomney\t78361\t1.3699999999999998e-05\t78361.0\n21634\t-98.66283299999999\t27.337809999999998\tLas Lomitas CDP\tTX\tTexas\tJim Hogg County\t245\t28.9\t8.0\t11.7\t13264\t41818\t0.7804\t78376\tRomney\t78376\t0.000478281\t78376.0\n21635\t-97.926743\t27.992820000000002\tK-Bar Ranch CDP\tTX\tTexas\tJim Wells County\t378\t34.4\t10.7\t9.0\t13715\t68333\t0.5814\t78383\tRomney\t78383\t0.000737919\t78383.0\n21636\t-98.10795\t27.711911999999998\tAlice Acres CDP\tTX\tTexas\tJim Wells County\t490\t26.6\t13.1\t7.9\t12118\t59000\t0.5814\t78332\tRomney\t78332\t0.0009565610000000001\t78332.0\n21637\t-98.102739\t27.739331\tRancho Alegre CDP\tTX\tTexas\tJim Wells County\t1959\t30.6\t3.2\t8.0\t11088\t51163\t0.5814\t78332\tRomney\t78332\t0.003824293\t78332.0\n21638\t-98.124397\t27.358635999999997\tPremont city\tTX\tTexas\tJim Wells County\t2838\t36.0\t12.9\t10.3\t12035\t39918\t0.5814\t78375\tRomney\t78375\t0.005540247\t78375.0\n21639\t-98.103841\t27.891949\tOwl Ranch-Amargosa CDP\tTX\tTexas\tJim Wells County\t559\t31.1\t1.9\t14.0\t9497\t27750\t0.5814\t78372\tRomney\t78372\t0.001091261\t78372.0\n21640\t-97.938744\t27.956599\tOrange Grove city\tTX\tTexas\tJim Wells County\t1369\t35.7\t16.3\t7.0\t17616\t80652\t0.5814\t78383\tRomney\t78383\t0.002672515\t78383.0\n21641\t-97.870121\t28.019868\tSandia CDP\tTX\tTexas\tJim Wells County\t465\t34.6\t10.8\t9.1\t13720\t69167\t0.5814\t78383\tRomney\t78383\t0.0009077569999999999\t78383.0\n21642\t-98.066312\t27.755865000000004\tAlice city\tTX\tTexas\tJim Wells County\t19164\t33.5\t14.0\t7.9\t15101\t63315\t0.5814\t78332\tRomney\t78332\t0.037411309\t78332.0\n21643\t-98.134653\t27.712190000000003\tCoyote Acres CDP\tTX\tTexas\tJim Wells County\t458\t29.7\t10.5\t8.4\t13433\t73500\t0.5814\t78332\tRomney\t78332\t0.000894092\t78332.0\n21644\t-97.992876\t27.966683000000003\tWestdale CDP\tTX\tTexas\tJim Wells County\t329\t35.1\t14.7\t9.1\t16130\t81667\t0.5814\t78372\tRomney\t78372\t0.000642263\t78372.0\n21645\t-98.194147\t27.766336\tLoma Linda East CDP\tTX\tTexas\tJim Wells County\t216\t33.3\t17.3\t5.8\t15975\t86667\t0.5814\t78332\tRomney\t78332\t0.00042166800000000004\t78332.0\n21646\t-97.96244300000001\t27.887935\tAlfred-South La Paloma CDP\tTX\tTexas\tJim Wells County\t486\t34.9\t11.0\t9.0\t13736\t68846\t0.5814\t78330\tRomney\t78330\t0.000948753\t78330.0\n21647\t-97.178032\t32.269042999999996\tGrandview city\tTX\tTexas\tJohnson County\t1690\t35.1\t17.6\t12.1\t19463\t80167\t0.2149\t76050\tRomney\t76050\t0.00329916\t76050.0\n21648\t-97.330072\t32.393104\tKeene city\tTX\tTexas\tJohnson County\t5533\t31.9\t26.1\t8.0\t19607\t87079\t0.2149\t76059\tRomney\t76059\t0.010801334\t76059.0\n21649\t-97.3754\t32.236059999999995\tRio Vista city\tTX\tTexas\tJohnson County\t1026\t36.9\t7.9\t10.2\t16846\t78333\t0.2149\t76093\tRomney\t76093\t0.0020029220000000003\t76093.0\n21650\t-97.407059\t32.352897\tCleburne city\tTX\tTexas\tJohnson County\t29359\t35.3\t16.2\t9.9\t20256\t85928\t0.2149\t76031\tRomney\t76031\t0.057313641\t76031.0\n21651\t-97.325998\t32.483146000000005\tCross Timber town\tTX\tTexas\tJohnson County\t290\t44.3\t12.9\t5.3\t21872\t117262\t0.2149\t76028\tRomney\t76028\t0.000566128\t76028.0\n21652\t-97.382263\t32.461431\tJoshua city\tTX\tTexas\tJohnson County\t6476\t36.9\t19.7\t7.2\t20913\t110173\t0.2149\t76058\tRomney\t76058\t0.012642226999999999\t76058.0\n21653\t-97.082135\t32.442327\tVenus town\tTX\tTexas\tJohnson County\t2663\t36.5\t6.3\t10.0\t16979\t79884\t0.2149\t76084\tRomney\t76084\t0.0051986179999999995\t76084.0\n21654\t-97.331829\t32.561667\tBurleson city\tTX\tTexas\tJohnson County\t32900\t36.0\t18.0\t6.5\t24742\t108387\t0.2149\t76028\tRomney\t76028\t0.06422626099999999\t76028.0\n21655\t-97.53295899999999\t32.451446000000004\tGodley city\tTX\tTexas\tJohnson County\t1071\t33.2\t11.2\t10.4\t18435\t78800\t0.2149\t76044\tRomney\t76044\t0.00209077\t76044.0\n21656\t-97.21006\t32.411382\tAlvarado city\tTX\tTexas\tJohnson County\t4566\t33.2\t7.7\t11.2\t17709\t65921\t0.2149\t76009\tRomney\t76009\t0.00891359\t76009.0\n21657\t-97.304222\t32.496241\tBriaroaks city\tTX\tTexas\tJohnson County\t532\t43.5\t31.2\t4.4\t23124\t133173\t0.2149\t76028\tRomney\t76028\t0.0010385519999999999\t76028.0\n21658\t-99.621866\t33.042732\tStamford city\tTX\tTexas\tJones County\t3275\t42.3\t8.5\t12.1\t16439\t41951\t0.2202\t79521\tRomney\t79521\t0.0063933440000000005\t79521.0\n21659\t-100.128676\t32.890287\tHamlin city\tTX\tTexas\tJones County\t1951\t43.2\t9.7\t6.5\t16625\t40980\t0.2202\t79520\tRomney\t79520\t0.0038086759999999996\t79520.0\n21660\t-99.896869\t32.75654\tAnson city\tTX\tTexas\tJones County\t2337\t37.0\t9.9\t10.7\t15638\t39100\t0.2202\t79501\tRomney\t79501\t0.004562212\t79501.0\n21661\t-99.611366\t32.800249\tLueders city\tTX\tTexas\tJones County\t294\t41.8\t8.5\t5.4\t17184\t39000\t0.2202\t79533\tRomney\t79533\t0.000573937\t79533.0\n21662\t-99.811125\t32.60375\tHawley city\tTX\tTexas\tJones County\t592\t36.6\t9.1\t3.9\t15991\t52381\t0.2202\t79525\tRomney\t79525\t0.0011556819999999999\t79525.0\n21663\t-97.900642\t28.887215\tKarnes City\tTX\tTexas\tKarnes County\t3452\t34.1\t12.4\t11.6\t15497\t44746\t0.3166\t78118\tRomney\t78118\t0.006738877\t78118.0\n21664\t-98.021755\t28.982008\tFalls City\tTX\tTexas\tKarnes County\t624\t41.2\t12.9\t6.1\t18847\t73889\t0.3166\t78113\tRomney\t78113\t0.001218152\t78113.0\n21665\t-97.713174\t28.885559999999998\tRunge town\tTX\tTexas\tKarnes County\t1016\t39.3\t11.1\t12.6\t13320\t35455\t0.3166\t78151\tRomney\t78151\t0.001983401\t78151.0\n21666\t-97.85105300000001\t28.815706\tKenedy city\tTX\tTexas\tKarnes County\t3337\t36.7\t9.7\t13.7\t14932\t52632\t0.3166\t78119\tRomney\t78119\t0.006514378\t78119.0\n21667\t-96.396633\t32.695762\tTalty city\tTX\tTexas\tKaufman County\t2703\t32.4\t18.6\t6.0\t27074\t165385\t0.2732\t75126\tRomney\t75126\t0.005276705\t75126.0\n21668\t-96.45099599999999\t32.627821000000004\tCrandall city\tTX\tTexas\tKaufman County\t3695\t33.2\t11.5\t7.3\t20047\t104064\t0.2732\t75114\tRomney\t75114\t0.007213253\t75114.0\n21669\t-96.351329\t32.472718\tGrays Prairie village\tTX\tTexas\tKaufman County\t350\t37.4\t12.1\t10.3\t20740\t94167\t0.2732\t75158\tRomney\t75158\t0.0006832580000000001\t75158.0\n21670\t-96.517274\t32.600604\tCombine city\tTX\tTexas\tKaufman County\t2104\t40.7\t13.8\t7.3\t23581\t126591\t0.2732\t75159\tRomney\t75159\t0.004107357\t75159.0\n21671\t-96.318894\t32.534046000000004\tOak Grove town\tTX\tTexas\tKaufman County\t822\t35.4\t17.3\t14.4\t21818\t110547\t0.2732\t75142\tRomney\t75142\t0.00160468\t75142.0\n21672\t-96.288445\t32.732323\tTerrell city\tTX\tTexas\tKaufman County\t16842\t32.7\t12.2\t15.1\t16487\t83165\t0.2732\t75160\tRomney\t75160\t0.032878379\t75160.0\n21673\t-96.46497099999999\t32.752022\tForney city\tTX\tTexas\tKaufman County\t12220\t34.0\t17.4\t6.9\t24274\t129654\t0.2732\t75126\tRomney\t75126\t0.023855467999999998\t75126.0\n21674\t-96.224221\t32.437922\tKemp town\tTX\tTexas\tKaufman County\t1432\t42.0\t9.9\t11.8\t18240\t73500\t0.2732\t751HH\tRomney\t751HH\t0.002795502\t0.0\n21675\t-96.108272\t32.372907\tMabank town\tTX\tTexas\tKaufman County\t2811\t38.5\t12.2\t10.9\t19702\t71739\t0.2732\t75147\tRomney\t75147\t0.0054875390000000005\t75147.0\n21676\t-96.263436\t32.655307\tOak Ridge town\tTX\tTexas\tKaufman County\t627\t38.5\t13.9\t7.5\t20084\t110606\t0.2732\t75142\tRomney\t75142\t0.001224008\t75142.0\n21677\t-96.452083\t32.464597\tRosser village\tTX\tTexas\tKaufman County\t499\t36.8\t14.6\t6.7\t20690\t131250\t0.2732\t75158\tRomney\t75158\t0.000974131\t75158.0\n21678\t-96.419024\t32.462558\tCottonwood city\tTX\tTexas\tKaufman County\t217\t38.8\t9.0\t8.6\t20135\t89286\t0.2732\t75158\tRomney\t75158\t0.00042362\t75158.0\n21679\t-96.30263599999999\t32.577587\tKaufman city\tTX\tTexas\tKaufman County\t7005\t33.2\t14.4\t10.7\t17507\t83298\t0.2732\t75142\tRomney\t75142\t0.013674923\t75142.0\n21680\t-96.321467\t32.635014\tPost Oak Bend City town\tTX\tTexas\tKaufman County\t669\t40.2\t12.7\t6.3\t22580\t113487\t0.2732\t75142\tRomney\t75142\t0.001305999\t75142.0\n21681\t-98.90401999999999\t29.971403999999996\tComfort CDP\tTX\tTexas\tKendall County\t2556\t32.4\t16.5\t10.5\t16709\t61905\t0.1711\t78013\tRomney\t78013\t0.004989736\t78013.0\n21682\t-98.73639200000001\t29.796387\tBoerne city\tTX\tTexas\tKendall County\t8984\t42.8\t31.8\t7.2\t26028\t169956\t0.1711\t78006\tRomney\t78006\t0.017538259\t78006.0\n21683\t-100.57486800000001\t33.250164\tJayton city\tTX\tTexas\tKent County\t460\t54.5\t15.5\t6.0\t22315\t32857\t0.163\t79528\tRomney\t79528\t0.0008979960000000001\t79528.0\n21684\t-100.659811\t33.363607\tGirard CDP\tTX\tTexas\tKent County\t59\t47.0\t15.9\t2.9\t16114\t50000\t0.163\t79518\tRomney\t79518\t0.00011517799999999999\t79518.0\n21685\t-99.236755\t30.077625\tIngram city\tTX\tTexas\tKerr County\t2034\t41.3\t14.9\t7.0\t20110\t97143\t0.1983\t78025\tRomney\t78025\t0.003970706\t78025.0\n21686\t-99.13712199999999\t30.041913\tKerrville city\tTX\tTexas\tKerr County\t22402\t48.2\t25.9\t6.2\t24670\t130742\t0.1983\t78028\tRomney\t78028\t0.043732422\t78028.0\n21687\t-99.772589\t30.490747999999996\tJunction city\tTX\tTexas\tKimble County\t2667\t40.2\t13.9\t5.8\t16920\t67746\t0.1147\t76849\tRomney\t76849\t0.0052064270000000005\t76849.0\n21688\t-100.410899\t29.318091\tBrackettville city\tTX\tTexas\tKinney County\t1767\t35.4\t6.6\t10.6\t11222\t36786\t0.3663\t78832\tRomney\t78832\t0.0034494770000000003\t78832.0\n21689\t-100.41119599999999\t29.173175\tSpofford city\tTX\tTexas\tKinney County\t72\t61.1\t30.5\t3.0\t26385\t70000\t0.3663\t78832\tRomney\t78832\t0.00014055600000000001\t78832.0\n21690\t-97.86093699999999\t27.509371\tKingsville city\tTX\tTexas\tKleberg County\t25398\t29.8\t23.5\t10.1\t16258\t62658\t0.5337\t78363\tRomney\t78363\t0.049581111\t78363.0\n21691\t-99.623912\t33.447109999999995\tMunday city\tTX\tTexas\tKnox County\t1271\t37.7\t9.9\t10.8\t15647\t34167\t0.2199\t76371\tRomney\t76371\t0.002481203\t76371.0\n21692\t-99.523627\t33.467983000000004\tGoree city\tTX\tTexas\tKnox County\t284\t43.5\t12.8\t3.7\t18256\t36250\t0.2199\t76363\tRomney\t76363\t0.000554415\t76363.0\n21693\t-99.79303399999999\t33.583689\tBenjamin city\tTX\tTexas\tKnox County\t246\t46.8\t13.1\t2.5\t17264\t33333\t0.2199\t79505\tRomney\t79505\t0.00048023300000000005\t79505.0\n21694\t-99.815623\t33.41744\tKnox City town\tTX\tTexas\tKnox County\t1096\t42.7\t17.5\t6.8\t15955\t38636\t0.2199\t79529\tRomney\t79529\t0.002139574\t79529.0\n21695\t-95.428719\t33.670504\tSun Valley city\tTX\tTexas\tLamar County\t103\t35.7\t13.4\t5.5\t20232\t88333\t0.2431\t75416\tRomney\t75416\t0.000201073\t75416.0\n21696\t-95.382583\t33.662957\tBlossom city\tTX\tTexas\tLamar County\t1532\t40.2\t15.1\t5.2\t17243\t79848\t0.2431\t75416\tRomney\t75416\t0.002990718\t75416.0\n21697\t-95.724818\t33.545295\tRoxton city\tTX\tTexas\tLamar County\t681\t37.6\t9.3\t12.5\t17556\t56786\t0.2431\t75477\tRomney\t75477\t0.001329425\t75477.0\n21698\t-95.649248\t33.653935\tToco city\tTX\tTexas\tLamar County\t138\t43.9\t14.1\t5.5\t19792\t92500\t0.2431\t75421\tRomney\t75421\t0.00026939900000000003\t75421.0\n21699\t-95.477153\t33.667586\tReno city\tTX\tTexas\tLamar County\t3163\t36.7\t21.1\t4.4\t22684\t105711\t0.2431\t75462\tRomney\t75462\t0.0061747009999999995\t75462.0\n21700\t-95.30796600000001\t33.529706\tDeport city\tTX\tTexas\tLamar County\t567\t46.9\t12.9\t9.4\t15447\t58125\t0.2431\t75435\tRomney\t75435\t0.001106878\t75435.0\n21701\t-95.535526\t33.665271000000004\tParis city\tTX\tTexas\tLamar County\t26534\t38.2\t16.9\t8.3\t19132\t78842\t0.2431\t75460\tRomney\t75460\t0.051798772\t75460.0\n21702\t-102.305836\t34.231651\tSpringlake town\tTX\tTexas\tLamb County\t119\t40.8\t18.1\t6.8\t24297\t65000\t0.244\t79082\tRomney\t79082\t0.000232308\t79082.0\n21703\t-102.137045\t34.180205\tOlton city\tTX\tTexas\tLamb County\t2109\t35.5\t12.0\t8.2\t13603\t41000\t0.244\t79064\tRomney\t79064\t0.0041171179999999995\t79064.0\n21704\t-102.153869\t33.925635\tSpade CDP\tTX\tTexas\tLamb County\t88\t45.0\t13.8\t6.0\t22178\t102083\t0.244\t79369\tRomney\t79369\t0.000171791\t79369.0\n21705\t-102.334797\t33.91979\tLittlefield city\tTX\tTexas\tLamb County\t6400\t35.9\t11.0\t7.0\t16216\t43800\t0.244\t79339\tRomney\t79339\t0.012493862\t79339.0\n21706\t-102.40919699999999\t34.233812\tEarth city\tTX\tTexas\tLamb County\t993\t36.8\t12.8\t7.9\t13732\t33750\t0.244\t79031\tRomney\t79031\t0.001938501\t79031.0\n21707\t-102.414479\t34.012481\tAmherst city\tTX\tTexas\tLamb County\t698\t41.9\t12.9\t6.5\t16170\t37647\t0.244\t79312\tRomney\t79312\t0.001362612\t79312.0\n21708\t-102.525343\t34.067646999999994\tSudan city\tTX\tTexas\tLamb County\t1088\t39.5\t16.7\t5.9\t19301\t45814\t0.244\t79371\tRomney\t79371\t0.002123957\t79371.0\n21709\t-98.183396\t31.067931\tLampasas city\tTX\tTexas\tLampasas County\t7503\t37.7\t17.2\t7.3\t18228\t78402\t0.2053\t76550\tRomney\t76550\t0.014647101000000001\t76550.0\n21710\t-97.971769\t31.074313\tKempner city\tTX\tTexas\tLampasas County\t1163\t39.3\t13.1\t4.8\t19881\t115396\t0.2053\t76539\tRomney\t76539\t0.002270369\t76539.0\n21711\t-98.392414\t31.216766999999997\tLometa city\tTX\tTexas\tLampasas County\t946\t38.4\t12.6\t3.7\t16422\t49872\t0.2053\t76853\tRomney\t76853\t0.001846749\t76853.0\n21712\t-99.236492\t28.436307\tCotulla city\tTX\tTexas\tLa Salle County\t3816\t33.5\t7.9\t9.4\t12310\t36081\t0.5863\t78014\tRomney\t78014\t0.007449465\t78014.0\n21713\t-98.811368\t28.460728000000003\tFowlerton CDP\tTX\tTexas\tLa Salle County\t59\t35.4\t9.8\t5.9\t14849\t85000\t0.5863\t78021\tRomney\t78021\t0.00011517799999999999\t78021.0\n21714\t-99.355213\t28.040677000000002\tEncinal city\tTX\tTexas\tLa Salle County\t551\t34.2\t2.1\t17.2\t9367\t29643\t0.5863\t78019\tRomney\t78019\t0.001075643\t78019.0\n21715\t-97.14233\t29.299342\tYoakum city\tTX\tTexas\tLavaca County\t5591\t38.5\t15.2\t7.1\t17867\t75038\t0.1722\t77995\tRomney\t77995\t0.01091456\t77995.0\n21716\t-97.146508\t29.571988\tMoulton town\tTX\tTexas\tLavaca County\t886\t45.8\t9.0\t3.4\t17074\t66974\t0.1722\t77975\tRomney\t77975\t0.001729619\t77975.0\n21717\t-96.94194499999999\t29.445463\tHallettsville city\tTX\tTexas\tLavaca County\t2582\t44.4\t11.9\t6.1\t18309\t78448\t0.1722\t77964\tRomney\t77964\t0.005040493\t77964.0\n21718\t-97.172699\t29.431984999999997\tShiner city\tTX\tTexas\tLavaca County\t2002\t46.8\t17.2\t2.6\t19306\t71885\t0.1722\t77984\tRomney\t77984\t0.003908236\t77984.0\n21719\t-97.009217\t30.414814\tLexington town\tTX\tTexas\tLee County\t1338\t39.4\t17.4\t6.3\t21942\t111567\t0.2623\t78947\tRomney\t78947\t0.002611998\t78947.0\n21720\t-96.928579\t30.183390999999997\tGiddings city\tTX\tTexas\tLee County\t5367\t29.9\t12.9\t5.9\t17900\t97016\t0.2623\t78942\tRomney\t78942\t0.010477275\t78942.0\n21721\t-96.14511999999999\t31.362784\tJewett city\tTX\tTexas\tLeon County\t1004\t36.8\t9.4\t8.9\t18194\t70000\t0.1529\t75846\tRomney\t75846\t0.001959975\t75846.0\n21722\t-95.978248\t31.257959000000003\tCenterville city\tTX\tTexas\tLeon County\t983\t47.7\t16.4\t5.0\t23766\t80000\t0.1529\t75833\tRomney\t75833\t0.001918979\t75833.0\n21723\t-95.849512\t31.589534000000004\tOakwood town\tTX\tTexas\tLeon County\t485\t47.2\t15.9\t10.0\t19819\t92500\t0.1529\t75855\tRomney\t75855\t0.0009468\t75855.0\n21724\t-96.25556999999999\t31.237907\tMarquez city\tTX\tTexas\tLeon County\t263\t45.3\t15.7\t3.5\t19776\t92857\t0.1529\t77865\tRomney\t77865\t0.00051342\t77865.0\n21725\t-96.06286999999999\t31.460379\tBuffalo city\tTX\tTexas\tLeon County\t2040\t38.9\t11.0\t6.8\t17824\t87286\t0.1529\t75831\tRomney\t75831\t0.003982419\t75831.0\n21726\t-95.975038\t31.153921\tLeona city\tTX\tTexas\tLeon County\t182\t47.5\t7.5\t4.3\t19803\t85000\t0.1529\t75850\tRomney\t75850\t0.00035529400000000003\t75850.0\n21727\t-96.112663\t31.031371000000004\tNormangee town\tTX\tTexas\tLeon County\t780\t41.6\t15.7\t11.1\t19570\t94545\t0.1529\t77871\tRomney\t77871\t0.001522689\t77871.0\n21728\t-94.736813\t30.150431\tHardin city\tTX\tTexas\tLiberty County\t797\t36.1\t12.6\t8.6\t20199\t73125\t0.2287\t77561\tRomney\t77561\t0.001555876\t77561.0\n21729\t-94.642596\t30.113511\tDaisetta city\tTX\tTexas\tLiberty County\t1109\t33.4\t11.8\t11.0\t18852\t47895\t0.2287\t77533\tRomney\t77533\t0.002164952\t77533.0\n21730\t-94.820717\t30.144638\tDayton Lakes city\tTX\tTexas\tLiberty County\t122\t41.1\t5.9\t10.2\t19492\t66667\t0.2287\t77561\tRomney\t77561\t0.00023816400000000002\t77561.0\n21731\t-95.100235\t30.357629\tNorth Cleveland city\tTX\tTexas\tLiberty County\t262\t36.4\t6.0\t6.0\t15212\t60000\t0.2287\t77327\tRomney\t77327\t0.0005114669999999999\t77327.0\n21732\t-94.585993\t30.028703000000004\tDevers city\tTX\tTexas\tLiberty County\t458\t37.9\t11.1\t9.7\t22416\t77500\t0.2287\t77538\tRomney\t77538\t0.000894092\t77538.0\n21733\t-94.889135\t30.05831\tDayton city\tTX\tTexas\tLiberty County\t5901\t33.0\t12.9\t8.9\t20529\t87609\t0.2287\t77535\tRomney\t77535\t0.011519731\t77535.0\n21734\t-94.80063299999999\t30.044190000000004\tLiberty city\tTX\tTexas\tLiberty County\t8095\t37.0\t19.1\t11.5\t19050\t79439\t0.2287\t77575\tRomney\t77575\t0.015802784\t77575.0\n21735\t-95.087991\t30.200229999999998\tPlum Grove city\tTX\tTexas\tLiberty County\t1077\t31.6\t3.5\t13.5\t16018\t73243\t0.2287\t77372\tRomney\t77372\t0.002102483\t77372.0\n21736\t-95.077534\t30.344977\tCleveland city\tTX\tTexas\tLiberty County\t8191\t34.3\t8.7\t11.7\t16098\t59363\t0.2287\t77327\tRomney\t77327\t0.015990191\t77327.0\n21737\t-94.73840899999999\t30.045119\tAmes city\tTX\tTexas\tLiberty County\t1098\t39.4\t14.2\t11.6\t16965\t70758\t0.2287\t77575\tRomney\t77575\t0.002143478\t77575.0\n21738\t-94.849577\t30.10687\tKenefick town\tTX\tTexas\tLiberty County\t791\t35.9\t9.2\t10.8\t19243\t100543\t0.2287\t77535\tRomney\t77535\t0.0015441629999999999\t77535.0\n21739\t-96.573769\t31.411039000000002\tThornton town\tTX\tTexas\tLimestone County\t506\t43.0\t5.5\t3.0\t14960\t49474\t0.2919\t76687\tRomney\t76687\t0.000987796\t76687.0\n21740\t-96.629253\t31.306982\tKosse town\tTX\tTexas\tLimestone County\t487\t41.0\t8.8\t10.0\t17349\t47759\t0.2919\t76653\tRomney\t76653\t0.000950705\t76653.0\n21741\t-96.652263\t31.751289\tCoolidge town\tTX\tTexas\tLimestone County\t847\t31.3\t8.7\t6.0\t14604\t33333\t0.2919\t76635\tRomney\t76635\t0.001653485\t76635.0\n21742\t-96.528518\t31.525024\tGroesbeck city\tTX\tTexas\tLimestone County\t4237\t33.3\t11.0\t7.9\t15933\t64000\t0.2919\t76642\tRomney\t76642\t0.008271327\t76642.0\n21743\t-96.543476\t31.741128999999997\tTehuacana town\tTX\tTexas\tLimestone County\t296\t44.8\t23.7\t2.7\t22578\t77778\t0.2919\t76686\tRomney\t76686\t0.0005778409999999999\t76686.0\n21744\t-96.480968\t31.679547999999997\tMexia city\tTX\tTexas\tLimestone County\t7141\t35.5\t12.4\t9.5\t15600\t46712\t0.2919\t76667\tRomney\t76667\t0.013940417\t76667.0\n21745\t-100.027377\t36.120907\tHiggins city\tTX\tTexas\tLipscomb County\t426\t50.6\t20.4\t3.9\t19650\t44167\t0.1019\t79046\tRomney\t79046\t0.000831623\t79046.0\n21746\t-100.325787\t36.444891\tDarrouzett town\tTX\tTexas\tLipscomb County\t295\t45.7\t22.3\t6.1\t21366\t48929\t0.1019\t79024\tRomney\t79024\t0.000575889\t79024.0\n21747\t-100.26713000000001\t36.220281\tLipscomb CDP\tTX\tTexas\tLipscomb County\t44\t50.6\t20.6\t4.2\t19705\t45000\t0.1019\t79056\tRomney\t79056\t8.590000000000001e-05\t79056.0\n21748\t-100.538517\t36.456138\tBooker town\tTX\tTexas\tLipscomb County\t1329\t34.9\t16.5\t6.4\t16629\t57000\t0.1019\t79005\tRomney\t79005\t0.002594429\t79005.0\n21749\t-100.140837\t36.433964\tFollett city\tTX\tTexas\tLipscomb County\t405\t47.2\t20.4\t5.5\t19882\t61000\t0.1019\t79034\tRomney\t79034\t0.000790627\t79034.0\n21750\t-98.118197\t28.329853999999997\tGeorge West city\tTX\tTexas\tLive Oak County\t2329\t37.6\t11.1\t5.9\t15573\t58934\t0.2234\t78022\tRomney\t78022\t0.004546595\t78022.0\n21751\t-98.17825699999999\t28.466876\tThree Rivers city\tTX\tTexas\tLive Oak County\t1747\t34.7\t9.4\t8.9\t17258\t59516\t0.2234\t78071\tRomney\t78071\t0.0034104340000000004\t78071.0\n21752\t-97.900661\t28.060677000000002\tPernitas Point village\tTX\tTexas\tLive Oak County\t273\t52.7\t12.4\t11.9\t18532\t60556\t0.2234\t78383\tRomney\t78383\t0.000532941\t78383.0\n21753\t-98.418757\t30.586115000000003\tSunrise Beach Village city\tTX\tTexas\tLlano County\t966\t63.6\t30.6\t4.9\t32399\t200385\t0.1906\t78657\tRomney\t78657\t0.001885792\t78657.0\n21754\t-98.439284\t30.780689000000002\tBuchanan Dam CDP\tTX\tTexas\tLlano County\t2055\t59.6\t16.0\t10.8\t25080\t138867\t0.1906\t78609\tRomney\t78609\t0.0040117009999999995\t78609.0\n21755\t-98.314531\t30.542608\tHorseshoe Bay CDP\tTX\tTexas\tLlano County\t4100\t61.9\t41.8\t5.2\t40200\t241667\t0.1906\t78654\tRomney\t78654\t0.00800388\t78654.0\n21756\t-98.45492\t30.665145000000003\tKingsland CDP\tTX\tTexas\tLlano County\t5205\t54.0\t15.2\t6.7\t22574\t111159\t0.1906\t78639\tRomney\t78639\t0.010161024\t78639.0\n21757\t-98.674921\t30.753148\tLlano city\tTX\tTexas\tLlano County\t3511\t42.1\t19.7\t5.7\t20898\t88876\t0.1906\t78643\tRomney\t78643\t0.006854055\t78643.0\n21758\t-101.683353\t33.662496000000004\tIdalou city\tTX\tTexas\tLubbock County\t2072\t37.9\t18.6\t5.2\t19672\t75638\t0.2881\t79329\tRomney\t79329\t0.004044888\t79329.0\n21759\t-101.707897\t33.532745\tBuffalo Springs village\tTX\tTexas\tLubbock County\t542\t45.3\t31.8\t3.7\t26377\t106618\t0.2881\t793HH\tRomney\t793HH\t0.001058074\t0.0\n21760\t-102.00981\t33.508851\tWolfforth city\tTX\tTexas\tLubbock County\t2629\t36.1\t22.2\t8.9\t18273\t65234\t0.2881\t79382\tRomney\t79382\t0.005132244\t79382.0\n21761\t-101.683862\t33.530372\tRansom Canyon town\tTX\tTexas\tLubbock County\t1111\t45.4\t31.7\t3.8\t26394\t106667\t0.2881\t79366\tRomney\t79366\t0.0021688560000000003\t79366.0\n21762\t-102.040913\t33.600059\tReese Center CDP\tTX\tTexas\tLubbock County\t43\t29.5\t10.7\t8.0\t15923\t45000\t0.2881\t79407\tRomney\t79407\t8.39e-05\t79407.0\n21763\t-101.64299100000001\t33.43889\tSlaton city\tTX\tTexas\tLubbock County\t6176\t34.6\t7.5\t10.1\t15964\t49095\t0.2881\t79364\tRomney\t79364\t0.012056576999999999\t79364.0\n21764\t-101.883531\t33.569699\tLubbock city\tTX\tTexas\tLubbock County\t220201\t31.1\t30.1\t7.8\t21592\t86825\t0.2881\t79410\tRomney\t79410\t0.42986890000000005\t79410.0\n21765\t-101.992667\t33.689947\tShallowater city\tTX\tTexas\tLubbock County\t2340\t37.1\t19.6\t4.4\t19634\t79000\t0.2881\t79363\tRomney\t79363\t0.004568068\t79363.0\n21766\t-101.839149\t33.729541999999995\tNew Deal town\tTX\tTexas\tLubbock County\t767\t36.8\t23.3\t5.8\t19604\t66667\t0.2881\t79350\tRomney\t79350\t0.001497311\t79350.0\n21767\t-101.830539\t32.966561999999996\tO'Donnell city\tTX\tTexas\tLynn County\t891\t33.3\t11.2\t7.9\t15671\t29250\t0.2583\t79351\tRomney\t79351\t0.00173938\t79351.0\n21768\t-101.911766\t33.326945\tNew Home city\tTX\tTexas\tLynn County\t303\t37.8\t19.5\t6.1\t16188\t73333\t0.2583\t79383\tRomney\t79383\t0.000591506\t79383.0\n21769\t-101.72748399999999\t33.319384\tWilson city\tTX\tTexas\tLynn County\t470\t36.4\t13.4\t10.7\t15590\t39000\t0.2583\t79381\tRomney\t79381\t0.000917518\t79381.0\n21770\t-101.795011\t33.164023\tTahoka city\tTX\tTexas\tLynn County\t2574\t38.0\t14.3\t10.1\t15222\t47113\t0.2583\t79373\tRomney\t79373\t0.005024875\t79373.0\n21771\t-99.396346\t31.132396000000004\tBrady city\tTX\tTexas\tMcCulloch County\t5480\t39.4\t12.2\t10.7\t14568\t42579\t0.1794\t76825\tRomney\t76825\t0.01069787\t76825.0\n21772\t-99.580927\t31.199265999999998\tMelvin town\tTX\tTexas\tMcCulloch County\t140\t49.7\t16.3\t6.7\t18597\t81667\t0.1794\t76858\tRomney\t76858\t0.00027330299999999997\t76858.0\n21773\t-97.095052\t31.802603\tWest city\tTX\tTexas\tMcLennan County\t2695\t41.7\t15.8\t5.4\t19414\t67746\t0.3447\t76691\tRomney\t76691\t0.005261086999999999\t76691.0\n21774\t-96.930487\t31.475620000000003\tRiesel city\tTX\tTexas\tMcLennan County\t1060\t40.3\t12.4\t3.2\t18167\t68158\t0.3447\t76682\tRomney\t76682\t0.002069296\t76682.0\n21775\t-97.091925\t31.601634000000004\tBellmead city\tTX\tTexas\tMcLennan County\t9453\t32.3\t9.6\t12.6\t15733\t46550\t0.3447\t76705\tRomney\t76705\t0.018453825\t76705.0\n21776\t-97.231684\t31.49865\tWoodway city\tTX\tTexas\tMcLennan County\t9030\t48.2\t52.5\t4.2\t36588\t155868\t0.3447\t76712\tRomney\t76712\t0.017628058999999998\t76712.0\n21777\t-97.020863\t31.732119\tLeroy city\tTX\tTexas\tMcLennan County\t356\t38.6\t9.9\t6.3\t21317\t87143\t0.3447\t76691\tRomney\t76691\t0.0006949710000000001\t76691.0\n21778\t-97.212579\t31.381217\tLorena city\tTX\tTexas\tMcLennan County\t1594\t37.5\t20.1\t6.6\t21416\t103208\t0.3447\t76630\tRomney\t76630\t0.003111753\t76630.0\n21779\t-97.196365\t31.451729999999998\tHewitt city\tTX\tTexas\tMcLennan County\t13642\t36.3\t37.0\t4.4\t27137\t116394\t0.3447\t76643\tRomney\t76643\t0.026631448\t76643.0\n21780\t-97.12016\t31.449690000000004\tRobinson city\tTX\tTexas\tMcLennan County\t9646\t40.3\t17.3\t5.0\t22936\t101234\t0.3447\t76706\tRomney\t76706\t0.018830593\t76706.0\n21781\t-97.360626\t31.308858\tMoody city\tTX\tTexas\tMcLennan County\t1563\t39.1\t10.9\t8.3\t16182\t68387\t0.3447\t76557\tRomney\t76557\t0.003051235\t76557.0\n21782\t-97.106971\t31.625622999999997\tLacy-Lakeview city\tTX\tTexas\tMcLennan County\t6010\t31.7\t12.3\t7.4\t19579\t63567\t0.3447\t76705\tRomney\t76705\t0.011732518\t76705.0\n21783\t-97.249509\t31.309856\tBruceville-Eddy city\tTX\tTexas\tMcLennan County\t1767\t37.1\t9.1\t7.7\t17177\t67703\t0.3447\t76630\tRomney\t76630\t0.0034494770000000003\t76630.0\n21784\t-96.813077\t31.544702\tMart city\tTX\tTexas\tMcLennan County\t2237\t37.4\t13.3\t7.7\t15147\t47857\t0.3447\t76664\tRomney\t76664\t0.004366995\t76664.0\n21785\t-97.441765\t31.535687\tCrawford town\tTX\tTexas\tMcLennan County\t696\t39.5\t26.1\t3.2\t20186\t103526\t0.3447\t76638\tRomney\t76638\t0.001358708\t76638.0\n21786\t-97.241113\t31.716611999999998\tGholson city\tTX\tTexas\tMcLennan County\t979\t37.6\t9.5\t7.8\t18136\t80000\t0.3447\t76633\tRomney\t76633\t0.00191117\t76633.0\n21787\t-97.18645699999999\t31.561353000000004\tWaco city\tTX\tTexas\tMcLennan County\t121027\t29.2\t20.3\t11.5\t17180\t67356\t0.3447\t76708\tRomney\t76708\t0.236264791\t76708.0\n21788\t-96.94958000000001\t31.545268\tHallsburg city\tTX\tTexas\tMcLennan County\t523\t38.0\t12.3\t5.4\t18399\t82273\t0.3447\t767HH\tRomney\t767HH\t0.001020983\t0.0\n21789\t-97.112385\t31.728507\tRoss city\tTX\tTexas\tMcLennan County\t254\t38.3\t14.5\t3.6\t20770\t83000\t0.3447\t76640\tRomney\t76640\t0.00049585\t76640.0\n21790\t-97.156123\t31.5225\tBeverly Hills city\tTX\tTexas\tMcLennan County\t2054\t32.0\t5.4\t8.5\t13103\t51278\t0.3447\t76711\tRomney\t76711\t0.004009749\t76711.0\n21791\t-97.416811\t31.423340000000003\tMcGregor city\tTX\tTexas\tMcLennan County\t4916\t38.2\t17.3\t7.0\t23235\t68611\t0.3447\t76657\tRomney\t76657\t0.009596848\t76657.0\n21792\t-95.7538\t31.025209000000004\tMidway city\tTX\tTexas\tMadison County\t278\t33.8\t10.5\t12.9\t17108\t72000\t0.2401\t75852\tRomney\t75852\t0.0005427019999999999\t75852.0\n21793\t-95.909335\t30.953553000000003\tMadisonville city\tTX\tTexas\tMadison County\t4592\t35.8\t13.6\t9.7\t14894\t69813\t0.2401\t77864\tRomney\t77864\t0.008964346\t77864.0\n21794\t-94.351067\t32.763179\tJefferson city\tTX\tTexas\tMarion County\t1969\t45.6\t12.1\t9.9\t15555\t68462\t0.3491\t75657\tRomney\t75657\t0.003843815\t75657.0\n21795\t-101.793192\t32.130838\tStanton city\tTX\tTexas\tMartin County\t2612\t33.4\t13.5\t4.9\t15900\t56735\t0.1527\t79782\tRomney\t79782\t0.005099058\t79782.0\n21796\t-99.228536\t30.748015999999996\tMason city\tTX\tTexas\tMason County\t2199\t44.7\t16.6\t6.1\t19177\t79750\t0.1931\t76856\tRomney\t76856\t0.0042928129999999995\t76856.0\n21797\t-96.064481\t28.962688\tMarkham CDP\tTX\tTexas\tMatagorda County\t1065\t35.4\t5.1\t6.6\t17973\t65385\t0.32799999999999996\t77456\tRomney\t77456\t0.002079057\t77456.0\n21798\t-95.96023000000001\t28.981351\tBay City\tTX\tTexas\tMatagorda County\t18632\t33.5\t14.0\t12.2\t18163\t83071\t0.32799999999999996\t77414\tRomney\t77414\t0.036372756\t77414.0\n21799\t-95.88265600000001\t29.034242\tVan Vleck CDP\tTX\tTexas\tMatagorda County\t1356\t41.9\t6.0\t13.7\t17377\t65233\t0.32799999999999996\t77482\tRomney\t77482\t0.002647137\t77482.0\n21800\t-96.21729\t28.872797\tBlessing CDP\tTX\tTexas\tMatagorda County\t830\t36.7\t14.5\t15.8\t14058\t69808\t0.32799999999999996\t77419\tRomney\t77419\t0.0016202979999999998\t77419.0\n21801\t-96.250411\t28.72059\tPalacios city\tTX\tTexas\tMatagorda County\t5211\t31.5\t15.8\t14.2\t15063\t66471\t0.32799999999999996\t77465\tRomney\t77465\t0.010172737\t77465.0\n21802\t-100.306784\t28.509159999999998\tEl Indio CDP\tTX\tTexas\tMaverick County\t329\t23.1\t0.7\t17.4\t6938\t39375\t0.7859999999999999\t78860\tRomney\t78860\t0.000642263\t78860.0\n21803\t-100.484589\t28.711042\tEagle Pass city\tTX\tTexas\tMaverick County\t25055\t33.3\t16.1\t8.5\t11867\t92545\t0.7859999999999999\t78852\tRomney\t78852\t0.048911518\t78852.0\n21804\t-100.467744\t28.688993\tLas Quintas Fronterizas CDP\tTX\tTexas\tMaverick County\t2515\t26.1\t11.0\t15.9\t9673\t68971\t0.7859999999999999\t78852\tRomney\t78852\t0.004909697\t78852.0\n21805\t-100.517871\t28.855067\tRadar Base CDP\tTX\tTexas\tMaverick County\t166\t37.8\t5.9\t13.5\t10043\t48571\t0.7859999999999999\t78877\tRomney\t78877\t0.00032406\t78877.0\n21806\t-100.623756\t28.947122999999998\tQuemado CDP\tTX\tTexas\tMaverick County\t263\t41.6\t12.6\t3.5\t10492\t82917\t0.7859999999999999\t78877\tRomney\t78877\t0.00051342\t78877.0\n21807\t-100.478501\t28.66787\tEidson Road CDP\tTX\tTexas\tMaverick County\t10425\t25.4\t4.0\t13.0\t7644\t55205\t0.7859999999999999\t78852\tRomney\t78852\t0.02035133\t78852.0\n21808\t-100.490999\t28.778082\tElm Creek CDP\tTX\tTexas\tMaverick County\t2323\t24.0\t6.3\t13.8\t9034\t50172\t0.7859999999999999\t78852\tRomney\t78852\t0.0045348820000000005\t78852.0\n21809\t-100.428376\t28.623737\tRosita South CDP\tTX\tTexas\tMaverick County\t3245\t22.2\t0.7\t18.5\t6637\t37622\t0.7859999999999999\t78852\tRomney\t78852\t0.0063347790000000005\t78852.0\n21810\t-100.422191\t28.656433000000003\tRosita North CDP\tTX\tTexas\tMaverick County\t3623\t23.7\t4.4\t20.0\t6257\t46485\t0.7859999999999999\t78852\tRomney\t78852\t0.007072696999999999\t78852.0\n21811\t-98.85595\t29.190305\tNatalia city\tTX\tTexas\tMedina County\t2028\t29.3\t7.6\t11.0\t13290\t69464\t0.2981\t78059\tRomney\t78059\t0.003958993\t78059.0\n21812\t-99.16235400000001\t29.353481\tHondo city\tTX\tTexas\tMedina County\t8173\t32.3\t9.6\t10.3\t14969\t76762\t0.2981\t78861\tRomney\t78861\t0.015955053\t78861.0\n21813\t-98.904439\t29.145391999999998\tDevine city\tTX\tTexas\tMedina County\t4345\t36.5\t11.8\t7.8\t17116\t58527\t0.2981\t78016\tRomney\t78016\t0.008482161\t78016.0\n21814\t-98.874301\t29.350996999999996\tCastroville city\tTX\tTexas\tMedina County\t3151\t40.5\t27.3\t4.6\t22399\t108440\t0.2981\t78009\tRomney\t78009\t0.006151275\t78009.0\n21815\t-98.811756\t29.309925\tLaCoste city\tTX\tTexas\tMedina County\t1446\t34.9\t15.5\t5.7\t17102\t75698\t0.2981\t78039\tRomney\t78039\t0.002822832\t78039.0\n21816\t-99.783691\t30.918313\tMenard city\tTX\tTexas\tMenard County\t1551\t44.2\t13.6\t7.8\t14234\t37891\t0.2014\t76859\tRomney\t76859\t0.0030278090000000002\t76859.0\n21817\t-102.069739\t32.106538\tMidland city\tTX\tTexas\tMidland County\t107106\t34.6\t29.8\t6.3\t24680\t116969\t0.1858\t79705\tRomney\t79705\t0.209088689\t79705.0\n21818\t-96.85919399999999\t30.707831\tMilano city\tTX\tTexas\tMilam County\t387\t38.3\t14.4\t9.6\t18455\t68333\t0.3203\t76556\tRomney\t76556\t0.000755488\t76556.0\n21819\t-97.008187\t30.655658000000003\tRockdale city\tTX\tTexas\tMilam County\t5623\t36.5\t12.4\t9.2\t20690\t69817\t0.3203\t76567\tRomney\t76567\t0.010977029\t76567.0\n21820\t-96.97744399999999\t30.859040999999998\tCameron city\tTX\tTexas\tMilam County\t5957\t39.9\t15.3\t13.0\t16475\t70395\t0.3203\t76520\tRomney\t76520\t0.011629053\t76520.0\n21821\t-97.12890300000001\t30.873983000000003\tBuckholts town\tTX\tTexas\tMilam County\t397\t40.8\t15.9\t10.1\t19212\t89167\t0.3203\t76518\tRomney\t76518\t0.00077501\t76518.0\n21822\t-97.20676800000001\t30.614022\tThorndale city\tTX\tTexas\tMilam County\t1324\t38.3\t12.8\t8.7\t20466\t87632\t0.3203\t76577\tRomney\t76577\t0.002584668\t76577.0\n21823\t-98.665633\t31.555253999999998\tMullin town\tTX\tTexas\tMills County\t181\t46.4\t21.4\t3.8\t18304\t96667\t0.1268\t76864\tRomney\t76864\t0.000353342\t76864.0\n21824\t-98.570157\t31.453260999999998\tGoldthwaite city\tTX\tTexas\tMills County\t1785\t43.8\t18.1\t6.5\t18860\t70465\t0.1268\t76844\tRomney\t76844\t0.003484616\t76844.0\n21825\t-100.858408\t32.399629\tColorado City\tTX\tTexas\tMitchell County\t4010\t38.9\t12.0\t7.8\t15663\t37039\t0.2323\t79512\tRomney\t79512\t0.007828185999999999\t79512.0\n21826\t-100.7127\t32.408776\tLoraine town\tTX\tTexas\tMitchell County\t592\t44.0\t15.4\t8.6\t16630\t33750\t0.2323\t79532\tRomney\t79532\t0.0011556819999999999\t79532.0\n21827\t-101.013086\t32.35705\tWestbrook city\tTX\tTexas\tMitchell County\t183\t49.6\t14.3\t5.9\t18000\t53333\t0.2323\t79565\tRomney\t79565\t0.000357246\t79565.0\n21828\t-97.523077\t33.695009999999996\tSt. Jo city\tTX\tTexas\tMontague County\t882\t43.1\t13.6\t6.8\t17808\t70625\t0.14400000000000002\t76265\tRomney\t76265\t0.00172181\t76265.0\n21829\t-97.730203\t33.783530999999996\tNocona city\tTX\tTexas\tMontague County\t3382\t40.7\t11.8\t10.2\t17980\t64375\t0.14400000000000002\t76255\tRomney\t76255\t0.006602225\t76255.0\n21830\t-97.844714\t33.559315000000005\tBowie city\tTX\tTexas\tMontague County\t5359\t40.2\t13.0\t7.6\t19345\t79590\t0.14400000000000002\t76230\tRomney\t76230\t0.010461657\t76230.0\n21831\t-97.76907299999999\t33.454412\tSunset city\tTX\tTexas\tMontague County\t363\t45.3\t4.6\t6.6\t18233\t92143\t0.14400000000000002\t76270\tRomney\t76270\t0.000708636\t76270.0\n21832\t-95.32136899999999\t30.150116999999998\tPorter Heights CDP\tTX\tTexas\tMontgomery County\t1675\t34.1\t12.7\t10.4\t22112\t91985\t0.1902\t77365\tRomney\t77365\t0.003269878\t77365.0\n21833\t-95.36358100000001\t30.340028999999998\tCut and Shoot town\tTX\tTexas\tMontgomery County\t1413\t36.2\t10.9\t8.3\t20179\t94167\t0.1902\t77303\tRomney\t77303\t0.0027584109999999997\t77303.0\n21834\t-95.15855400000001\t30.179465999999998\tRoman Forest town\tTX\tTexas\tMontgomery County\t1543\t42.9\t18.4\t7.4\t26913\t132895\t0.1902\t77357\tRomney\t77357\t0.003012192\t77357.0\n21835\t-95.16983499999999\t30.195549\tPatton Village city\tTX\tTexas\tMontgomery County\t1687\t31.2\t7.7\t12.0\t19824\t65500\t0.1902\t77372\tRomney\t77372\t0.0032933040000000004\t77372.0\n21836\t-95.4621\t30.318841\tConroe city\tTX\tTexas\tMontgomery County\t49452\t31.3\t21.6\t11.4\t20550\t112069\t0.1902\t77301\tRomney\t77301\t0.09653851199999999\t77301.0\n21837\t-95.49856700000001\t30.171470000000003\tThe Woodlands CDP\tTX\tTexas\tMontgomery County\t66649\t37.8\t58.9\t6.3\t45889\t246514\t0.1902\t77381\tRomney\t77381\t0.13010991\t77381.0\n21838\t-95.163584\t30.227803\tSplendora city\tTX\tTexas\tMontgomery County\t1364\t30.7\t4.7\t12.0\t16278\t63333\t0.1902\t77372\tRomney\t77372\t0.0026627540000000002\t77372.0\n21839\t-95.697343\t30.392558\tMontgomery city\tTX\tTexas\tMontgomery County\t759\t39.2\t16.4\t8.2\t22037\t109470\t0.1902\t77356\tRomney\t77356\t0.001481694\t77356.0\n21840\t-95.70808000000001\t30.143852000000003\tStagecoach town\tTX\tTexas\tMontgomery County\t567\t38.5\t25.4\t8.1\t27083\t160156\t0.1902\t77362\tRomney\t77362\t0.001106878\t77362.0\n21841\t-95.183098\t30.181457\tWoodbranch city\tTX\tTexas\tMontgomery County\t1542\t40.4\t14.4\t5.9\t23118\t121396\t0.1902\t77357\tRomney\t77357\t0.00301024\t77357.0\n21842\t-95.747224\t30.210344\tMagnolia city\tTX\tTexas\tMontgomery County\t1664\t36.7\t18.7\t8.9\t23032\t128750\t0.1902\t77355\tRomney\t77355\t0.0032484040000000003\t77355.0\n21843\t-95.482845\t30.429446000000002\tWillis city\tTX\tTexas\tMontgomery County\t5856\t31.1\t11.0\t11.0\t16645\t74835\t0.1902\t77378\tRomney\t77378\t0.011431884\t77378.0\n21844\t-95.705361\t30.191240000000004\tPinehurst CDP\tTX\tTexas\tMontgomery County\t5105\t38.0\t20.6\t9.1\t23064\t102671\t0.1902\t77362\tRomney\t77362\t0.009965807\t77362.0\n21845\t-95.454114\t30.181903000000002\tShenandoah city\tTX\tTexas\tMontgomery County\t2213\t42.2\t31.4\t7.3\t30344\t146976\t0.1902\t77385\tRomney\t77385\t0.004320143\t77385.0\n21846\t-95.494354\t30.380956\tPanorama Village city\tTX\tTexas\tMontgomery County\t2192\t50.1\t42.3\t8.4\t34582\t165409\t0.1902\t77304\tRomney\t77304\t0.004279148\t77304.0\n21847\t-95.413637\t30.217483\tWoodloch town\tTX\tTexas\tMontgomery County\t250\t32.1\t18.0\t7.3\t19584\t99286\t0.1902\t77302\tRomney\t77302\t0.000488041\t77302.0\n21848\t-95.443185\t30.156882\tOak Ridge North city\tTX\tTexas\tMontgomery County\t3662\t44.5\t36.0\t5.6\t34144\t169151\t0.1902\t77380\tRomney\t77380\t0.007148832\t77380.0\n21849\t-102.008911\t36.045149\tCactus city\tTX\tTexas\tMoore County\t2544\t22.9\t2.6\t8.3\t9506\t32016\t0.1934\t79013\tRomney\t79013\t0.00496631\t79013.0\n21850\t-101.824483\t36.018190999999995\tSunray city\tTX\tTexas\tMoore County\t1817\t33.4\t12.7\t5.2\t16371\t59286\t0.1934\t79086\tRomney\t79086\t0.0035470859999999996\t79086.0\n21851\t-101.963827\t35.859169\tDumas city\tTX\tTexas\tMoore County\t13927\t32.1\t13.2\t5.6\t17952\t74940\t0.1934\t79029\tRomney\t79029\t0.027187816\t79029.0\n21852\t-94.709018\t32.939377\tLone Star city\tTX\tTexas\tMorris County\t1699\t38.8\t12.3\t15.8\t16964\t64074\t0.3615\t75668\tRomney\t75668\t0.00331673\t75668.0\n21853\t-94.67772099999999\t33.202903000000006\tNaples city\tTX\tTexas\tMorris County\t1081\t41.9\t14.1\t15.0\t16366\t53205\t0.3615\t75568\tRomney\t75568\t0.0021102910000000002\t75568.0\n21854\t-94.725047\t33.030891\tDaingerfield town\tTX\tTexas\tMorris County\t2554\t39.9\t15.0\t10.2\t17096\t51899\t0.3615\t75638\tRomney\t75638\t0.004985832\t75638.0\n21855\t-94.74150300000001\t33.180569\tOmaha city\tTX\tTexas\tMorris County\t1046\t41.3\t10.4\t13.0\t15334\t57051\t0.3615\t75571\tRomney\t75571\t0.002041966\t75571.0\n21856\t-100.856172\t33.899149\tRoaring Springs town\tTX\tTexas\tMotley County\t244\t46.0\t14.2\t1.7\t19493\t55000\t0.0917\t79256\tRomney\t79256\t0.00047632800000000004\t79256.0\n21857\t-100.821122\t34.015097\tMatador town\tTX\tTexas\tMotley County\t698\t44.5\t16.0\t5.1\t16397\t36000\t0.0917\t79244\tRomney\t79244\t0.001362612\t79244.0\n21858\t-94.60775500000001\t31.717082\tAppleby city\tTX\tTexas\tNacogdoches County\t521\t39.1\t32.7\t4.5\t24091\t116667\t0.313\t75961\tRomney\t75961\t0.001017078\t75961.0\n21859\t-94.345878\t31.498887\tChireno city\tTX\tTexas\tNacogdoches County\t428\t42.2\t10.9\t9.8\t19865\t73889\t0.313\t75937\tRomney\t75937\t0.000835527\t75937.0\n21860\t-94.493225\t31.825115000000004\tGarrison city\tTX\tTexas\tNacogdoches County\t900\t38.6\t12.6\t5.9\t14884\t66538\t0.313\t75946\tRomney\t75946\t0.0017569489999999998\t75946.0\n21861\t-94.84121999999999\t31.812773999999997\tCushing city\tTX\tTexas\tNacogdoches County\t573\t45.1\t14.0\t9.0\t15373\t71364\t0.313\t75760\tRomney\t75760\t0.0011185910000000002\t75760.0\n21862\t-94.651512\t31.614953999999997\tNacogdoches city\tTX\tTexas\tNacogdoches County\t30972\t25.0\t32.2\t9.0\t17734\t108752\t0.313\t75961\tRomney\t75961\t0.060462485\t75961.0\n21863\t-96.360088\t32.041852\tMildred town\tTX\tTexas\tNavarro County\t594\t36.9\t16.8\t9.4\t20330\t95000\t0.2831\t75110\tRomney\t75110\t0.001159587\t75110.0\n21864\t-96.469674\t32.081915\tCorsicana city\tTX\tTexas\tNavarro County\t25633\t34.3\t14.6\t11.2\t17000\t86535\t0.2831\t75110\tRomney\t75110\t0.05003987\t75110.0\n21865\t-96.22515200000001\t32.131098\tKerens city\tTX\tTexas\tNavarro County\t1760\t37.3\t11.1\t15.5\t17427\t66125\t0.2831\t75144\tRomney\t75144\t0.0034358120000000003\t75144.0\n21866\t-96.296308\t32.013339\tEureka city\tTX\tTexas\tNavarro County\t583\t38.5\t18.1\t9.4\t20918\t98889\t0.2831\t75144\tRomney\t75144\t0.001138113\t75144.0\n21867\t-96.807985\t32.078602000000004\tFrost city\tTX\tTexas\tNavarro County\t704\t35.1\t9.2\t5.8\t17492\t63095\t0.2831\t76641\tRomney\t76641\t0.001374325\t76641.0\n21868\t-96.42661899999999\t31.997138\tAngus city\tTX\tTexas\tNavarro County\t368\t40.7\t18.5\t9.6\t21506\t103125\t0.2831\t75110\tRomney\t75110\t0.000718397\t75110.0\n21869\t-96.38261700000001\t32.001199\tNavarro town\tTX\tTexas\tNavarro County\t274\t40.4\t19.5\t9.4\t21750\t103571\t0.2831\t76681\tRomney\t76681\t0.000534893\t76681.0\n21870\t-96.511611\t32.033072\tOak Valley town\tTX\tTexas\tNavarro County\t430\t32.0\t9.6\t12.3\t17004\t83750\t0.2831\t75110\tRomney\t75110\t0.0008394310000000001\t75110.0\n21871\t-96.478767\t32.050546999999995\tRetreat town\tTX\tTexas\tNavarro County\t362\t40.9\t7.7\t8.9\t18908\t94444\t0.2831\t75110\tRomney\t75110\t0.000706684\t75110.0\n21872\t-96.43032600000001\t32.013537\tMustang town\tTX\tTexas\tNavarro County\t51\t41.3\t20.0\t8.0\t21710\t125000\t0.2831\t75110\tRomney\t75110\t9.96e-05\t75110.0\n21873\t-96.715121\t31.894206\tDawson town\tTX\tTexas\tNavarro County\t965\t43.5\t10.5\t11.1\t14840\t58148\t0.2831\t76639\tRomney\t76639\t0.00188384\t76639.0\n21874\t-96.577176\t32.160886\tEmhouse town\tTX\tTexas\tNavarro County\t175\t37.1\t11.5\t7.5\t17091\t75000\t0.2831\t75102\tRomney\t75102\t0.00034162900000000003\t75102.0\n21875\t-96.63763399999999\t32.100311\tBarry city\tTX\tTexas\tNavarro County\t233\t37.9\t11.3\t7.5\t16683\t71667\t0.2831\t75102\tRomney\t75102\t0.000454855\t75102.0\n21876\t-96.717446\t32.092368\tBlooming Grove town\tTX\tTexas\tNavarro County\t905\t42.7\t17.9\t7.0\t18962\t85000\t0.2831\t76626\tRomney\t76626\t0.00176671\t76626.0\n21877\t-96.328701\t32.117422\tPowell town\tTX\tTexas\tNavarro County\t120\t42.5\t11.1\t11.1\t18411\t100000\t0.2831\t75153\tRomney\t75153\t0.00023426\t75153.0\n21878\t-96.49866899999999\t32.240106\tRice city\tTX\tTexas\tNavarro County\t897\t36.1\t10.2\t9.2\t15685\t78750\t0.2831\t75155\tRomney\t75155\t0.0017510929999999998\t75155.0\n21879\t-96.215335\t32.109169\tGoodlow city\tTX\tTexas\tNavarro County\t265\t42.4\t12.0\t15.5\t16817\t68571\t0.2831\t75144\tRomney\t75144\t0.000517324\t75144.0\n21880\t-96.427782\t31.923512\tRichland town\tTX\tTexas\tNavarro County\t353\t41.8\t16.3\t6.8\t17160\t96429\t0.2831\t76681\tRomney\t76681\t0.000689115\t76681.0\n21881\t-93.599559\t31.150222999999997\tSouth Toledo Bend CDP\tTX\tTexas\tNewton County\t546\t54.3\t9.3\t6.3\t19397\t69250\t0.2857\t75932\tRomney\t75932\t0.001065883\t75932.0\n21882\t-93.75864\t30.303442999999998\tDeweyville CDP\tTX\tTexas\tNewton County\t1107\t39.1\t4.7\t15.9\t16477\t48226\t0.2857\t77614\tRomney\t77614\t0.002161048\t77614.0\n21883\t-93.753434\t30.850465000000003\tNewton city\tTX\tTexas\tNewton County\t2311\t33.1\t10.0\t13.2\t15213\t55375\t0.2857\t75966\tRomney\t75966\t0.004511456\t75966.0\n21884\t-100.40978\t32.467578\tSweetwater city\tTX\tTexas\tNolan County\t10891\t36.5\t11.5\t9.9\t16322\t42178\t0.2658\t79556\tRomney\t79556\t0.02126104\t79556.0\n21885\t-100.319117\t32.086641\tBlackwell city\tTX\tTexas\tNolan County\t327\t40.8\t15.2\t4.4\t15741\t45000\t0.2658\t79506\tRomney\t79506\t0.000638358\t79506.0\n21886\t-100.542014\t32.442984\tRoscoe city\tTX\tTexas\tNolan County\t1214\t39.2\t12.2\t9.9\t14462\t40429\t0.2658\t79545\tRomney\t79545\t0.002369929\t79545.0\n21887\t-97.72555899999999\t27.761551\tSpring Garden-Terra Verde CDP\tTX\tTexas\tNueces County\t806\t27.8\t13.3\t12.9\t12071\t50000\t0.4763\t78380\tRomney\t78380\t0.001573446\t78380.0\n21888\t-97.818517\t27.945248\tSandy Hollow-Escondidas CDP\tTX\tTexas\tNueces County\t424\t36.9\t17.6\t13.3\t17814\t71500\t0.4763\t78352\tRomney\t78352\t0.0008277180000000001\t78352.0\n21889\t-97.08744\t27.803917\tPort Aransas city\tTX\tTexas\tNueces County\t3515\t48.6\t27.8\t5.9\t26367\t115783\t0.4763\t78373\tRomney\t78373\t0.006861863\t78373.0\n21890\t-97.571833\t27.703694\tTierra Grande CDP\tTX\tTexas\tNueces County\t350\t33.0\t9.8\t11.6\t15241\t76071\t0.4763\t78406\tRomney\t78406\t0.0006832580000000001\t78406.0\n21891\t-97.909954\t27.782839000000003\tAgua Dulce city\tTX\tTexas\tNueces County\t703\t33.2\t8.4\t9.0\t14664\t51042\t0.4763\t78330\tRomney\t78330\t0.0013723729999999999\t78330.0\n21892\t-97.738423\t27.720428000000002\tLa Paloma-Lost Creek CDP\tTX\tTexas\tNueces County\t376\t27.7\t13.1\t13.2\t12060\t48636\t0.4763\t78351\tRomney\t78351\t0.000734014\t78351.0\n21893\t-97.750864\t27.673054999999998\tDriscoll city\tTX\tTexas\tNueces County\t819\t31.2\t5.1\t12.6\t15779\t37708\t0.4763\t78351\tRomney\t78351\t0.001598824\t78351.0\n21894\t-97.681967\t27.802708000000003\tNorth San Pedro CDP\tTX\tTexas\tNueces County\t909\t27.0\t0.6\t15.6\t8638\t25543\t0.4763\t78380\tRomney\t78380\t0.001774519\t78380.0\n21895\t-97.429468\t27.845078000000004\tCorpus Christi city\tTX\tTexas\tNueces County\t292432\t34.0\t20.7\t8.4\t21120\t95855\t0.4763\t78402\tRomney\t78402\t0.5708758\t78402.0\n21896\t-97.84555300000001\t27.809428999999998\tRancho Banquete CDP\tTX\tTexas\tNueces County\t459\t37.2\t17.7\t13.2\t17823\t69000\t0.4763\t78339\tRomney\t78339\t0.0008960439999999999\t78339.0\n21897\t-97.634268\t27.67225\tPetronila city\tTX\tTexas\tNueces County\t92\t28.3\t11.1\t7.0\t17533\t55000\t0.4763\t78351\tRomney\t78351\t0.000179599\t78351.0\n21898\t-97.797634\t27.585191\tBishop city\tTX\tTexas\tNueces County\t3128\t34.5\t15.2\t9.0\t18151\t59350\t0.4763\t78343\tRomney\t78343\t0.006106375\t78343.0\n21899\t-97.664416\t27.795749\tRobstown city\tTX\tTexas\tNueces County\t12483\t30.3\t6.1\t14.2\t11363\t44817\t0.4763\t78380\tRomney\t78380\t0.024368888\t78380.0\n21900\t-100.797434\t36.394179\tPerryton city\tTX\tTexas\tOchiltree County\t8447\t33.5\t16.1\t7.0\t18288\t65441\t0.0845\t79070\tRomney\t79070\t0.016489946000000002\t79070.0\n21901\t-102.42627\t35.245635\tVega city\tTX\tTexas\tOldham County\t927\t39.2\t17.0\t5.0\t17794\t60000\t0.0817\t79092\tRomney\t79092\t0.0018096579999999998\t79092.0\n21902\t-102.664979\t35.275358000000004\tAdrian city\tTX\tTexas\tOldham County\t157\t38.0\t22.8\t14.5\t19347\t72500\t0.0817\t79001\tRomney\t79001\t0.00030649\t79001.0\n21903\t-93.875912\t30.21847\tMauriceville CDP\tTX\tTexas\tOrange County\t2844\t38.1\t11.3\t8.3\t23761\t86860\t0.2228\t77632\tRomney\t77632\t0.00555196\t77632.0\n21904\t-94.035165\t30.175809\tPine Forest city\tTX\tTexas\tOrange County\t626\t37.3\t7.5\t7.9\t19242\t69500\t0.2228\t77662\tRomney\t77662\t0.001222056\t77662.0\n21905\t-93.786333\t30.111677\tOrange city\tTX\tTexas\tOrange County\t17946\t38.4\t17.6\t13.3\t19930\t68139\t0.2228\t77630\tRomney\t77630\t0.035033571\t77630.0\n21906\t-94.050351\t30.105058000000003\tRose City\tTX\tTexas\tOrange County\t497\t33.1\t4.8\t10.7\t19716\t54600\t0.2228\t77662\tRomney\t77662\t0.000970226\t77662.0\n21907\t-94.001292\t30.128758\tVidor city\tTX\tTexas\tOrange County\t11242\t37.5\t6.5\t11.7\t17990\t58773\t0.2228\t77662\tRomney\t77662\t0.02194625\t77662.0\n21908\t-93.758852\t30.078715000000003\tWest Orange city\tTX\tTexas\tOrange County\t3905\t38.8\t10.1\t12.9\t19286\t49382\t0.2228\t77630\tRomney\t77630\t0.007623208\t77630.0\n21909\t-93.77046899999999\t30.108769\tPinehurst city\tTX\tTexas\tOrange County\t2088\t42.4\t15.6\t12.3\t21393\t90638\t0.2228\t77630\tRomney\t77630\t0.004076123\t77630.0\n21910\t-93.838472\t30.032569\tBridge City\tTX\tTexas\tOrange County\t8694\t37.9\t10.8\t9.9\t22004\t87715\t0.2228\t77611\tRomney\t77611\t0.016972131\t77611.0\n21911\t-98.42506800000001\t32.53627\tMingus city\tTX\tTexas\tPalo Pinto County\t259\t49.6\t22.2\t4.9\t23286\t75000\t0.19399999999999998\t76463\tRomney\t76463\t0.000505611\t76463.0\n21912\t-98.036919\t32.838710999999996\tMineral Wells city\tTX\tTexas\tPalo Pinto County\t16541\t36.5\t12.9\t10.2\t16617\t60602\t0.19399999999999998\t76067\tRomney\t76067\t0.032290777\t76067.0\n21913\t-98.247665\t32.937338000000004\tGraford city\tTX\tTexas\tPalo Pinto County\t569\t42.4\t17.6\t6.9\t19871\t57813\t0.19399999999999998\t76449\tRomney\t76449\t0.001110782\t76449.0\n21914\t-98.497771\t32.550905\tStrawn city\tTX\tTexas\tPalo Pinto County\t729\t36.6\t13.6\t8.3\t19092\t41167\t0.19399999999999998\t76475\tRomney\t76475\t0.001423129\t76475.0\n21915\t-98.367325\t32.545068\tGordon city\tTX\tTexas\tPalo Pinto County\t475\t49.5\t21.9\t5.3\t23281\t78333\t0.19399999999999998\t76453\tRomney\t76453\t0.0009272789999999999\t76453.0\n21916\t-94.33675699999999\t32.152589\tCarthage city\tTX\tTexas\tPanola County\t6499\t38.7\t23.4\t7.1\t20514\t85966\t0.2161\t75633\tRomney\t75633\t0.012687127\t75633.0\n21917\t-94.456119\t32.243507\tBeckville city\tTX\tTexas\tPanola County\t705\t38.1\t11.1\t6.1\t17290\t55000\t0.2161\t75631\tRomney\t75631\t0.0013762770000000002\t75631.0\n21918\t-94.367814\t32.027962\tGary City town\tTX\tTexas\tPanola County\t284\t41.5\t13.4\t7.5\t14089\t57500\t0.2161\t75643\tRomney\t75643\t0.000554415\t75643.0\n21919\t-97.680929\t32.970118\tSpringtown city\tTX\tTexas\tParker County\t2659\t37.3\t10.5\t9.8\t18260\t104730\t0.1647\t76082\tRomney\t76082\t0.005190809\t76082.0\n21920\t-97.584967\t32.908797\tSanctuary town\tTX\tTexas\tParker County\t319\t40.1\t6.0\t18.6\t17140\t88333\t0.1647\t76020\tRomney\t76020\t0.000622741\t76020.0\n21921\t-98.011537\t32.800163\tCool city\tTX\tTexas\tParker County\t182\t38.0\t9.8\t9.2\t17253\t93333\t0.1647\t76066\tRomney\t76066\t0.00035529400000000003\t76066.0\n21922\t-97.604557\t32.693838\tAledo city\tTX\tTexas\tParker County\t2539\t35.3\t28.0\t5.6\t25459\t117821\t0.1647\t76008\tRomney\t76008\t0.004956549\t76008.0\n21923\t-97.667749\t32.67405\tAnnetta South town\tTX\tTexas\tParker County\t710\t39.4\t42.6\t5.8\t32975\t219318\t0.1647\t76008\tRomney\t76008\t0.0013860379999999998\t76008.0\n21924\t-98.010787\t32.748553\tMillsap town\tTX\tTexas\tParker County\t392\t39.7\t10.6\t8.8\t17687\t76250\t0.1647\t76066\tRomney\t76066\t0.000765249\t76066.0\n21925\t-97.6507\t32.755817\tWillow Park city\tTX\tTexas\tParker County\t3514\t42.9\t36.9\t3.7\t32523\t170530\t0.1647\t76008\tRomney\t76008\t0.006859911\t76008.0\n21926\t-97.678596\t32.720485\tAnnetta North town\tTX\tTexas\tParker County\t542\t40.2\t43.4\t5.7\t33530\t219737\t0.1647\t76008\tRomney\t76008\t0.001058074\t76008.0\n21927\t-97.764325\t32.757566\tWeatherford city\tTX\tTexas\tParker County\t24462\t38.3\t25.1\t8.8\t22435\t113705\t0.1647\t76086\tRomney\t76086\t0.047753884\t76086.0\n21928\t-97.544372\t32.945011\tReno city\tTX\tTexas\tParker County\t2578\t37.2\t9.9\t10.5\t18390\t85873\t0.1647\t76020\tRomney\t76020\t0.005032684\t76020.0\n21929\t-97.698066\t32.749093\tHudson Oaks city\tTX\tTexas\tParker County\t2091\t42.9\t29.2\t5.8\t26371\t165164\t0.1647\t76087\tRomney\t76087\t0.004081979\t76087.0\n21930\t-97.660051\t32.696052\tAnnetta town\tTX\tTexas\tParker County\t1299\t39.2\t42.5\t5.7\t32973\t217949\t0.1647\t76008\tRomney\t76008\t0.002535864\t76008.0\n21931\t-102.723016\t34.639524\tFriona city\tTX\tTexas\tParmer County\t3924\t32.5\t16.3\t3.8\t16050\t59415\t0.2071\t79035\tRomney\t79035\t0.007660299000000001\t79035.0\n21932\t-102.88874200000001\t34.516248\tBovina city\tTX\tTexas\tParmer County\t1684\t29.6\t10.1\t6.1\t12209\t38519\t0.2071\t79009\tRomney\t79009\t0.0032874479999999997\t79009.0\n21933\t-103.037304\t34.385672\tFarwell city\tTX\tTexas\tParmer County\t1181\t39.7\t13.1\t7.3\t15520\t63529\t0.2071\t79325\tRomney\t79325\t0.002305508\t79325.0\n21934\t-102.694512\t31.266817\tImperial CDP\tTX\tTexas\tPecos County\t423\t38.4\t6.6\t3.1\t13077\t30833\t0.3834\t79743\tRomney\t79743\t0.000825766\t79743.0\n21935\t-102.885989\t30.892608000000003\tFort Stockton city\tTX\tTexas\tPecos County\t7889\t33.3\t16.0\t6.6\t15316\t55853\t0.3834\t79735\tRomney\t79735\t0.015400637\t79735.0\n21936\t-101.89993299999999\t30.912816999999997\tIraan city\tTX\tTexas\tPecos County\t1170\t35.6\t17.7\t3.9\t18259\t55500\t0.3834\t79744\tRomney\t79744\t0.002284034\t79744.0\n21937\t-103.066052\t31.240454999999997\tCoyanosa CDP\tTX\tTexas\tPecos County\t136\t38.8\t6.7\t3.2\t13112\t32500\t0.3834\t79730\tRomney\t79730\t0.000265495\t79730.0\n21938\t-95.107601\t30.809310999999997\tOnalaska city\tTX\tTexas\tPolk County\t1248\t57.1\t14.4\t12.6\t22815\t80882\t0.2539\t77360\tRomney\t77360\t0.002436303\t77360.0\n21939\t-94.936934\t30.709266999999997\tLivingston town\tTX\tTexas\tPolk County\t5852\t37.7\t20.0\t10.2\t20066\t102714\t0.2539\t77351\tRomney\t77351\t0.011424075\t77351.0\n21940\t-94.857888\t30.851837\tSeven Oaks city\tTX\tTexas\tPolk County\t155\t44.7\t8.0\t14.5\t16789\t75000\t0.2539\t773XX\tRomney\t773XX\t0.000302586\t0.0\n21941\t-94.82486800000001\t30.996373\tCorrigan town\tTX\tTexas\tPolk County\t1948\t34.3\t8.5\t12.0\t13903\t59015\t0.2539\t75939\tRomney\t75939\t0.0038028190000000003\t75939.0\n21942\t-95.002921\t30.700495\tWest Livingston CDP\tTX\tTexas\tPolk County\t6993\t35.0\t9.5\t9.7\t16614\t80362\t0.2539\t77351\tRomney\t77351\t0.013651497\t77351.0\n21943\t-94.94640600000001\t30.609719000000002\tGoodrich city\tTX\tTexas\tPolk County\t257\t39.3\t3.6\t9.1\t14029\t51667\t0.2539\t77335\tRomney\t77335\t0.000501707\t77335.0\n21944\t-101.952027\t35.260782\tBishop Hills town\tTX\tTexas\tPotter County\t232\t42.0\t16.1\t3.1\t20473\t99167\t0.2694\t79124\tRomney\t79124\t0.00045290300000000005\t79124.0\n21945\t-101.799384\t35.219228\tAmarillo city\tTX\tTexas\tPotter County\t188660\t34.4\t22.3\t6.4\t21669\t89745\t0.2694\t79104\tRomney\t79104\t0.36829563299999996\t79104.0\n21946\t-104.365723\t29.560705\tPresidio city\tTX\tTexas\tPresidio County\t4648\t28.0\t8.8\t19.0\t8888\t41200\t0.7056\t79845\tRomney\t79845\t0.009073666999999999\t79845.0\n21947\t-104.02495\t30.310821999999998\tMarfa city\tTX\tTexas\tPresidio County\t2191\t40.1\t19.8\t3.3\t15575\t67755\t0.7056\t79843\tRomney\t79843\t0.004277196\t79843.0\n21948\t-104.127842\t29.450836\tRedford CDP\tTX\tTexas\tPresidio County\t145\t37.5\t20.5\t8.7\t11024\t46000\t0.7056\t79846\tRomney\t79846\t0.000283064\t79846.0\n21949\t-95.940922\t32.901005\tEast Tawakoni city\tTX\tTexas\tRains County\t912\t47.4\t7.3\t14.3\t19810\t98542\t0.1862\t75453\tRomney\t75453\t0.001780375\t75453.0\n21950\t-95.868945\t32.930162\tPoint city\tTX\tTexas\tRains County\t966\t40.8\t12.6\t10.5\t16982\t84200\t0.1862\t75472\tRomney\t75472\t0.001885792\t75472.0\n21951\t-95.767615\t32.876589\tEmory city\tTX\tTexas\tRains County\t1503\t41.2\t11.7\t11.4\t19463\t92800\t0.1862\t75440\tRomney\t75440\t0.002934105\t75440.0\n21952\t-101.78181\t35.057441\tLake Tanglewood village\tTX\tTexas\tRandall County\t942\t42.4\t27.8\t4.8\t28431\t132639\t0.1524\t79118\tRomney\t79118\t0.00183894\t79118.0\n21953\t-101.921154\t34.981006\tCanyon city\tTX\tTexas\tRandall County\t13348\t26.7\t45.6\t6.7\t21803\t109442\t0.1524\t79015\tRomney\t79015\t0.026057511000000002\t79015.0\n21954\t-101.818349\t35.054463\tTimbercreek Canyon village\tTX\tTexas\tRandall County\t444\t41.7\t33.2\t6.5\t29050\t140625\t0.1524\t79118\tRomney\t79118\t0.000866762\t79118.0\n21955\t-101.803033\t35.061539\tPalisades village\tTX\tTexas\tRandall County\t326\t43.0\t28.6\t5.0\t28627\t129167\t0.1524\t79118\tRomney\t79118\t0.000636406\t79118.0\n21956\t-101.45900400000001\t31.193467\tBig Lake city\tTX\tTexas\tReagan County\t2756\t30.7\t9.3\t6.4\t15362\t51176\t0.1874\t76932\tRomney\t76932\t0.005380169000000001\t76932.0\n21957\t-99.763108\t29.725388\tLeakey city\tTX\tTexas\tReal County\t383\t43.6\t17.2\t5.7\t17309\t85625\t0.1805\t78873\tRomney\t78873\t0.00074768\t78873.0\n21958\t-100.011088\t29.669249\tCamp Wood city\tTX\tTexas\tReal County\t826\t41.8\t12.0\t5.0\t13118\t52250\t0.1805\t78833\tRomney\t78833\t0.001612489\t78833.0\n21959\t-95.213537\t33.469791\tBogata city\tTX\tTexas\tRed River County\t1246\t44.3\t8.4\t14.3\t16405\t40233\t0.2921\t75417\tRomney\t75417\t0.002432399\t75417.0\n21960\t-95.266468\t33.659953\tDetroit town\tTX\tTexas\tRed River County\t862\t37.6\t7.8\t13.1\t14780\t50000\t0.2921\t75436\tRomney\t75436\t0.0016827670000000002\t75436.0\n21961\t-94.78019300000001\t33.552161\tAvery town\tTX\tTexas\tRed River County\t409\t43.2\t8.2\t6.9\t15342\t42083\t0.2921\t75554\tRomney\t75554\t0.000798436\t75554.0\n21962\t-94.913026\t33.581792\tAnnona town\tTX\tTexas\tRed River County\t251\t45.0\t12.1\t9.7\t18609\t53000\t0.2921\t75550\tRomney\t75550\t0.000489994\t75550.0\n21963\t-95.05591899999999\t33.610718\tClarksville city\tTX\tTexas\tRed River County\t3760\t38.8\t12.0\t12.2\t16814\t40235\t0.2921\t75426\tRomney\t75426\t0.007340144\t75426.0\n21964\t-103.537464\t31.369132\tLindsay CDP\tTX\tTexas\tReeves County\t631\t27.1\t8.1\t17.7\t12980\t17778\t0.5753\t79772\tRomney\t79772\t0.001231817\t79772.0\n21965\t-103.743746\t30.984225\tBalmorhea city\tTX\tTexas\tReeves County\t309\t31.3\t13.5\t5.9\t9370\t22000\t0.5753\t79718\tRomney\t79718\t0.000603219\t79718.0\n21966\t-103.505234\t31.404721000000002\tPecos city\tTX\tTexas\tReeves County\t8211\t33.6\t10.2\t12.7\t12980\t27601\t0.5753\t79772\tRomney\t79772\t0.016029235\t79772.0\n21967\t-103.79468\t31.312466999999998\tToyah town\tTX\tTexas\tReeves County\t160\t26.9\t8.0\t15.8\t12979\t18333\t0.5753\t79785\tRomney\t79785\t0.000312347\t79785.0\n21968\t-96.84384\t28.391322\tAustwell city\tTX\tTexas\tRefugio County\t170\t43.4\t10.2\t4.5\t17593\t40833\t0.3728\t77950\tRomney\t77950\t0.00033186800000000003\t77950.0\n21969\t-97.275047\t28.30746\tRefugio town\tTX\tTexas\tRefugio County\t2903\t40.9\t13.8\t7.9\t15955\t50870\t0.3728\t78377\tRomney\t78377\t0.005667138\t78377.0\n21970\t-97.211011\t28.096044\tBayside town\tTX\tTexas\tRefugio County\t313\t46.3\t20.5\t5.5\t19549\t55000\t0.3728\t78340\tRomney\t78340\t0.000611028\t78340.0\n21971\t-97.325461\t28.237813\tWoodsboro town\tTX\tTexas\tRefugio County\t1460\t38.0\t9.8\t7.5\t16827\t43100\t0.3728\t78393\tRomney\t78393\t0.0028501620000000003\t78393.0\n21972\t-100.641584\t35.692352\tMiami city\tTX\tTexas\tRoberts County\t595\t46.9\t25.5\t4.8\t21425\t59483\t0.065\t79059\tRomney\t79059\t0.0011615389999999998\t79059.0\n21973\t-96.59569599999999\t30.877046000000004\tHearne city\tTX\tTexas\tRobertson County\t4489\t35.1\t9.6\t12.0\t14882\t62754\t0.384\t77859\tRomney\t77859\t0.008763273\t77859.0\n21974\t-96.671533\t30.979176000000002\tCalvert city\tTX\tTexas\tRobertson County\t1343\t41.0\t12.0\t11.6\t13062\t52778\t0.384\t77837\tRomney\t77837\t0.0026217590000000004\t77837.0\n21975\t-96.485555\t31.025509999999997\tFranklin city\tTX\tTexas\tRobertson County\t1424\t39.6\t15.0\t7.4\t16366\t61304\t0.384\t77856\tRomney\t77856\t0.0027798840000000003\t77856.0\n21976\t-96.67593199999999\t31.165585999999998\tBremond city\tTX\tTexas\tRobertson County\t1017\t41.2\t7.1\t8.8\t18071\t64200\t0.384\t76629\tRomney\t76629\t0.001985353\t76629.0\n21977\t-96.476577\t32.850713\tHeath city\tTX\tTexas\tRockwall County\t6831\t42.0\t44.8\t5.7\t44576\t272256\t0.2276\t75032\tRomney\t75032\t0.013335246\t75032.0\n21978\t-96.39152800000001\t32.851440000000004\tMcLendon-Chisholm city\tTX\tTexas\tRockwall County\t1293\t40.9\t39.3\t5.9\t44368\t259211\t0.2276\t75032\tRomney\t75032\t0.002524151\t75032.0\n21979\t-96.38963100000001\t32.940146999999996\tFate city\tTX\tTexas\tRockwall County\t4004\t35.1\t23.8\t6.0\t21093\t142284\t0.2276\t75132\tRomney\t75132\t0.007816473\t75132.0\n21980\t-96.333476\t32.990016\tRoyse City\tTX\tTexas\tRockwall County\t8288\t34.8\t11.7\t6.9\t26806\t120867\t0.2276\t75189\tRomney\t75189\t0.016179552\t75189.0\n21981\t-96.411056\t32.922905\tMobile City\tTX\tTexas\tRockwall County\t268\t35.0\t23.7\t5.9\t21131\t143056\t0.2276\t75132\tRomney\t75132\t0.00052318\t75132.0\n21982\t-96.4459\t32.919538\tRockwall city\tTX\tTexas\tRockwall County\t36916\t37.6\t41.7\t5.6\t37277\t241027\t0.2276\t75087\tRomney\t75087\t0.072066159\t75087.0\n21983\t-100.183922\t31.599970000000003\tMiles city\tTX\tTexas\tRunnels County\t699\t41.1\t14.8\t9.3\t15140\t61429\t0.1415\t76861\tRomney\t76861\t0.001364564\t76861.0\n21984\t-99.955446\t31.740685\tBallinger city\tTX\tTexas\tRunnels County\t3944\t40.1\t13.7\t10.9\t15222\t50081\t0.1415\t76821\tRomney\t76821\t0.007699343000000001\t76821.0\n21985\t-99.964412\t31.955865999999997\tWinters city\tTX\tTexas\tRunnels County\t2678\t38.0\t9.7\t10.9\t14255\t35962\t0.1415\t79567\tRomney\t79567\t0.0052279\t79567.0\n21986\t-94.6828\t31.911564000000002\tMount Enterprise city\tTX\tTexas\tRusk County\t512\t41.3\t11.8\t7.5\t14512\t47703\t0.24\t75681\tRomney\t75681\t0.000999509\t75681.0\n21987\t-94.96819599999999\t32.276485\tOverton city\tTX\tTexas\tRusk County\t2590\t39.1\t14.2\t8.6\t16782\t64231\t0.24\t75684\tRomney\t75684\t0.00505611\t75684.0\n21988\t-94.97556\t31.866382\tReklaw city\tTX\tTexas\tRusk County\t332\t39.0\t8.8\t10.0\t16315\t53077\t0.24\t75784\tRomney\t75784\t0.0006481190000000001\t75784.0\n21989\t-94.79689300000001\t32.157539\tHenderson city\tTX\tTexas\tRusk County\t11284\t38.2\t19.1\t8.1\t20908\t83865\t0.24\t75652\tRomney\t75652\t0.022028241\t75652.0\n21990\t-94.508617\t32.317112\tTatum city\tTX\tTexas\tRusk County\t1011\t37.2\t8.7\t8.1\t14897\t61667\t0.24\t75691\tRomney\t75691\t0.00197364\t75691.0\n21991\t-94.929612\t32.268772999999996\tNew London city\tTX\tTexas\tRusk County\t980\t41.9\t13.7\t8.4\t15694\t58857\t0.24\t75684\tRomney\t75684\t0.0019131229999999999\t75684.0\n21992\t-93.803481\t31.454748\tMilam CDP\tTX\tTexas\tSabine County\t1262\t56.2\t20.0\t16.7\t20435\t69394\t0.1763\t75959\tRomney\t75959\t0.002463633\t75959.0\n21993\t-93.85194200000001\t31.342645\tHemphill city\tTX\tTexas\tSabine County\t1027\t39.3\t15.0\t10.0\t15827\t58750\t0.1763\t75948\tRomney\t75948\t0.002004874\t75948.0\n21994\t-93.974522\t31.246903000000003\tPineland city\tTX\tTexas\tSabine County\t913\t42.6\t9.9\t16.0\t17802\t50526\t0.1763\t75968\tRomney\t75968\t0.001782328\t75968.0\n21995\t-94.270014\t31.304928999999998\tBroaddus town\tTX\tTexas\tSan Augustine County\t182\t44.5\t13.7\t14.7\t17198\t61000\t0.3233\t75929\tRomney\t75929\t0.00035529400000000003\t75929.0\n21996\t-94.110848\t31.529651\tSan Augustine town\tTX\tTexas\tSan Augustine County\t2455\t43.4\t14.8\t12.8\t17209\t63175\t0.3233\t75972\tRomney\t75972\t0.004792567\t75972.0\n21997\t-95.215202\t30.746183000000002\tPoint Blank city\tTX\tTexas\tSan Jacinto County\t558\t56.0\t10.9\t14.5\t19160\t81136\t0.2506\t77364\tRomney\t77364\t0.001089309\t77364.0\n21998\t-95.002075\t30.49095\tShepherd city\tTX\tTexas\tSan Jacinto County\t2201\t37.4\t6.7\t13.0\t14494\t55294\t0.2506\t77371\tRomney\t77371\t0.004296717\t77371.0\n21999\t-95.307136\t30.743376\tOakhurst city\tTX\tTexas\tSan Jacinto County\t249\t42.8\t14.1\t10.0\t19580\t70000\t0.2506\t77359\tRomney\t77359\t0.00048608900000000004\t77359.0\n22000\t-95.130658\t30.589838\tColdspring city\tTX\tTexas\tSan Jacinto County\t752\t39.5\t12.3\t12.2\t18032\t78571\t0.2506\t77331\tRomney\t77331\t0.001468029\t77331.0\n22001\t-97.563198\t28.090934999999998\tSt. Paul CDP\tTX\tTexas\tSan Patricio County\t551\t39.1\t13.6\t10.5\t17790\t57258\t0.3913\t78387\tRomney\t78387\t0.001075643\t78387.0\n22002\t-97.32240300000001\t27.883484000000003\tPortland city\tTX\tTexas\tSan Patricio County\t16846\t32.9\t25.7\t8.0\t24659\t124198\t0.3913\t78374\tRomney\t78374\t0.032886188\t78374.0\n22003\t-97.677137\t27.966713000000002\tEdroy CDP\tTX\tTexas\tSan Patricio County\t445\t33.0\t10.0\t7.6\t15920\t57917\t0.3913\t78352\tRomney\t78352\t0.0008687139999999999\t78352.0\n22004\t-97.16691800000001\t27.925317\tFalman-County Acres CDP\tTX\tTexas\tSan Patricio County\t310\t35.8\t14.2\t16.0\t20821\t39583\t0.3913\t78336\tRomney\t78336\t0.0006051709999999999\t78336.0\n22005\t-97.861891\t28.124458\tLakeshore Gardens-Hidden Acres CDP\tTX\tTexas\tSan Patricio County\t622\t46.3\t8.8\t9.9\t26055\t56607\t0.3913\t78368\tRomney\t78368\t0.001214247\t78368.0\n22006\t-97.223008\t27.830215000000003\tIngleside on the Bay city\tTX\tTexas\tSan Patricio County\t536\t35.6\t22.0\t9.2\t20662\t111944\t0.3913\t783HH\tRomney\t783HH\t0.001046361\t0.0\n22007\t-97.55358100000001\t28.005515000000003\tMorgan Farm Area CDP\tTX\tTexas\tSan Patricio County\t517\t36.2\t9.7\t8.8\t22130\t67222\t0.3913\t78370\tRomney\t78370\t0.00100927\t78370.0\n22008\t-97.882836\t28.082143\tLake City town\tTX\tTexas\tSan Patricio County\t516\t47.4\t10.7\t14.0\t18202\t76842\t0.3913\t78383\tRomney\t78383\t0.001007318\t78383.0\n22009\t-97.51049\t28.034411\tSinton city\tTX\tTexas\tSan Patricio County\t5572\t32.9\t10.3\t13.0\t15428\t55530\t0.3913\t78387\tRomney\t78387\t0.010877468999999999\t78387.0\n22010\t-97.586568\t27.946647\tOdem city\tTX\tTexas\tSan Patricio County\t2849\t32.6\t9.8\t12.7\t14739\t64468\t0.3913\t78370\tRomney\t78370\t0.0055617209999999995\t78370.0\n22011\t-97.292287\t27.921975\tGregory city\tTX\tTexas\tSan Patricio County\t2326\t30.1\t5.5\t12.2\t13661\t48636\t0.3913\t78359\tRomney\t78359\t0.004540738\t78359.0\n22012\t-97.50591999999999\t28.011315999999997\tDel Sol-Loma Linda CDP\tTX\tTexas\tSan Patricio County\t748\t31.2\t7.1\t11.8\t14384\t50625\t0.3913\t78387\tRomney\t78387\t0.00146022\t78387.0\n22013\t-97.49665999999999\t28.024289000000003\tRancho Chico CDP\tTX\tTexas\tSan Patricio County\t302\t31.9\t10.6\t11.4\t15801\t50385\t0.3913\t78387\tRomney\t78387\t0.0005895540000000001\t78387.0\n22014\t-97.08050899999999\t27.920378999999997\tAransas Pass city\tTX\tTexas\tSan Patricio County\t8418\t36.7\t9.7\t13.9\t16419\t60238\t0.3913\t78336\tRomney\t78336\t0.016433333\t78336.0\n22015\t-97.391212\t27.980099\tTaft city\tTX\tTexas\tSan Patricio County\t3060\t30.1\t10.8\t10.6\t13557\t58125\t0.3913\t78390\tRomney\t78390\t0.005973628000000001\t78390.0\n22016\t-97.20635\t27.868052000000002\tIngleside city\tTX\tTexas\tSan Patricio County\t9451\t29.9\t16.7\t10.4\t19658\t101599\t0.3913\t78362\tRomney\t78362\t0.018449921\t78362.0\n22017\t-97.405661\t27.972934999999996\tTaft Southwest CDP\tTX\tTexas\tSan Patricio County\t1530\t29.3\t2.4\t18.1\t9260\t41310\t0.3913\t78390\tRomney\t78390\t0.0029868140000000004\t78390.0\n22018\t-97.861366\t28.103562\tLakeside town\tTX\tTexas\tSan Patricio County\t327\t47.4\t11.0\t13.9\t18185\t75833\t0.3913\t78368\tRomney\t78368\t0.000638358\t78368.0\n22019\t-97.260194\t27.995010999999998\tTradewinds CDP\tTX\tTexas\tSan Patricio County\t165\t36.4\t12.7\t7.1\t19482\t75000\t0.3913\t78359\tRomney\t78359\t0.000322107\t78359.0\n22020\t-97.857956\t28.097539\tEdgewater-Paisano CDP\tTX\tTexas\tSan Patricio County\t179\t47.7\t11.5\t13.4\t18162\t77000\t0.3913\t78368\tRomney\t78368\t0.00034943800000000004\t78368.0\n22021\t-97.776323\t27.977081\tSan Patricio city\tTX\tTexas\tSan Patricio County\t335\t38.7\t13.5\t9.4\t18482\t83333\t0.3913\t78352\tRomney\t78352\t0.000653976\t78352.0\n22022\t-97.82485799999999\t28.093667\tMathis city\tTX\tTexas\tSan Patricio County\t4636\t29.3\t7.7\t20.9\t11436\t35240\t0.3913\t78368\tRomney\t78368\t0.009050241\t78368.0\n22023\t-97.353123\t27.885652\tDoyle CDP\tTX\tTexas\tSan Patricio County\t276\t29.6\t24.6\t6.1\t26741\t120536\t0.3913\t78374\tRomney\t78374\t0.0005387980000000001\t78374.0\n22024\t-98.946055\t31.270773\tRichland Springs town\tTX\tTexas\tSan Saba County\t336\t48.0\t22.3\t5.7\t20819\t93333\t0.14300000000000002\t76871\tRomney\t76871\t0.0006559280000000001\t76871.0\n22025\t-98.725849\t31.195827\tSan Saba town\tTX\tTexas\tSan Saba County\t2581\t41.4\t12.0\t7.3\t16288\t58246\t0.14300000000000002\t76877\tRomney\t76877\t0.00503854\t76877.0\n22026\t-100.597944\t30.86174\tEldorado city\tTX\tTexas\tSchleicher County\t1889\t40.0\t12.4\t7.6\t16492\t49111\t0.2173\t76936\tRomney\t76936\t0.003687642\t76936.0\n22027\t-100.752399\t32.636528000000006\tHermleigh CDP\tTX\tTexas\tScurry County\t410\t42.8\t13.4\t6.7\t17853\t60385\t0.1667\t79526\tRomney\t79526\t0.0008003880000000001\t79526.0\n22028\t-100.911233\t32.713723\tSnyder city\tTX\tTexas\tScurry County\t10332\t37.1\t13.6\t8.0\t19019\t54085\t0.1667\t79549\tRomney\t79549\t0.020169779\t79549.0\n22029\t-99.166477\t32.547193\tMoran city\tTX\tTexas\tShackelford County\t234\t50.5\t23.5\t8.4\t19985\t41875\t0.0961\t76464\tRomney\t76464\t0.000456807\t76464.0\n22030\t-99.295506\t32.72663\tAlbany city\tTX\tTexas\tShackelford County\t1857\t42.7\t19.8\t1.9\t17575\t53478\t0.0961\t76430\tRomney\t76430\t0.0036251720000000003\t76430.0\n22031\t-94.244907\t31.944134000000002\tTenaha town\tTX\tTexas\tShelby County\t1124\t37.5\t12.5\t4.7\t14792\t73462\t0.2501\t75974\tRomney\t75974\t0.002194235\t75974.0\n22032\t-94.17894\t31.794109000000002\tCenter city\tTX\tTexas\tShelby County\t6073\t36.6\t14.1\t8.9\t15636\t66800\t0.2501\t75935\tRomney\t75935\t0.011855504\t75935.0\n22033\t-94.39717399999999\t31.906449\tTimpson city\tTX\tTexas\tShelby County\t1196\t38.2\t14.7\t7.3\t16203\t77200\t0.2501\t75975\tRomney\t75975\t0.002334791\t75975.0\n22034\t-94.050626\t31.965827\tJoaquin city\tTX\tTexas\tShelby County\t970\t38.8\t10.3\t12.9\t14768\t60526\t0.2501\t75954\tRomney\t75954\t0.001893601\t75954.0\n22035\t-93.904134\t31.765054\tHuxley city\tTX\tTexas\tShelby County\t279\t47.8\t11.9\t5.7\t19572\t90000\t0.2501\t75973\tRomney\t75973\t0.000544654\t75973.0\n22036\t-101.79375\t36.493722999999996\tTexhoma city\tTX\tTexas\tSherman County\t367\t35.6\t23.3\t4.3\t17325\t73500\t0.1166\t73949\tRomney\t73949\t0.000716445\t73949.0\n22037\t-102.073949\t36.336649\tStratford city\tTX\tTexas\tSherman County\t2001\t38.9\t21.1\t6.4\t17291\t58000\t0.1166\t79084\tRomney\t79084\t0.003906284\t79084.0\n22038\t-95.217212\t32.223137\tWhitehouse city\tTX\tTexas\tSmith County\t6593\t35.1\t26.1\t5.8\t23872\t114853\t0.2695\t75791\tRomney\t75791\t0.01287063\t75791.0\n22039\t-95.402345\t32.495416999999996\tLindale town\tTX\tTexas\tSmith County\t3656\t39.5\t13.0\t6.7\t18673\t94603\t0.2695\t75771\tRomney\t75771\t0.007137119\t75771.0\n22040\t-95.30189\t32.318771999999996\tTyler city\tTX\tTexas\tSmith County\t93829\t34.4\t29.3\t8.2\t22119\t105120\t0.2695\t75701\tRomney\t75701\t0.183169781\t75701.0\n22041\t-95.172352\t32.493105\tWinona town\tTX\tTexas\tSmith County\t691\t38.2\t10.6\t8.3\t17620\t83125\t0.2695\t75792\tRomney\t75792\t0.001348947\t75792.0\n22042\t-95.398746\t32.250357\tNoonday city\tTX\tTexas\tSmith County\t538\t41.0\t29.1\t5.1\t23899\t140152\t0.2695\t75762\tRomney\t75762\t0.001050265\t75762.0\n22043\t-95.122237\t32.145426\tTroup city\tTX\tTexas\tSmith County\t1913\t36.2\t12.4\t7.8\t15379\t59750\t0.2695\t75789\tRomney\t75789\t0.003734494\t75789.0\n22044\t-95.322096\t32.141771000000006\tBullard town\tTX\tTexas\tSmith County\t1311\t35.2\t15.1\t7.5\t16503\t85682\t0.2695\t75757\tRomney\t75757\t0.00255929\t75757.0\n22045\t-95.165594\t32.30015\tNew Chapel Hill city\tTX\tTexas\tSmith County\t564\t40.7\t22.3\t5.0\t22948\t102976\t0.2695\t75707\tRomney\t75707\t0.001101022\t75707.0\n22046\t-95.053857\t32.227932\tArp city\tTX\tTexas\tSmith County\t985\t40.2\t14.1\t6.0\t17385\t61818\t0.2695\t75750\tRomney\t75750\t0.0019228829999999998\t75750.0\n22047\t-97.752574\t32.239763\tGlen Rose city\tTX\tTexas\tSomervell County\t2572\t39.6\t16.5\t7.5\t17734\t119508\t0.1733\t76043\tRomney\t76043\t0.005020971\t76043.0\n22048\t-98.969328\t26.404233\tEscobares CDP\tTX\tTexas\tStarr County\t2271\t26.9\t7.4\t16.1\t7223\t63400\t0.8634\t78584\tRomney\t78584\t0.004433369\t78584.0\n22049\t-98.646957\t26.269284999999996\tLa Grulla city\tTX\tTexas\tStarr County\t1490\t27.8\t3.5\t26.2\t6847\t40833\t0.8634\t78548\tRomney\t78548\t0.0029087270000000003\t78548.0\n22050\t-99.135639\t26.564162\tFalcon Village CDP\tTX\tTexas\tStarr County\t86\t30.0\t6.3\t11.4\t8731\t56250\t0.8634\t78545\tRomney\t78545\t0.00016788599999999998\t78545.0\n22051\t-99.110401\t26.523678999999998\tSalineno CDP\tTX\tTexas\tStarr County\t336\t29.1\t8.0\t12.3\t8704\t56818\t0.8634\t78545\tRomney\t78545\t0.0006559280000000001\t78545.0\n22052\t-98.822314\t26.376988\tRio Grande City\tTX\tTexas\tStarr County\t13297\t29.0\t11.6\t17.8\t9679\t68927\t0.8634\t78547\tRomney\t78547\t0.025957951\t78547.0\n22053\t-98.94748100000001\t26.408831\tGarceno CDP\tTX\tTexas\tStarr County\t1795\t25.6\t3.7\t17.4\t6702\t56321\t0.8634\t78584\tRomney\t78584\t0.003504138\t78584.0\n22054\t-99.03506\t26.437758000000002\tRoma Creek CDP\tTX\tTexas\tStarr County\t769\t32.8\t12.6\t16.9\t9611\t77273\t0.8634\t78584\tRomney\t78584\t0.001501216\t78584.0\n22055\t-98.64026700000001\t26.343740000000004\tLa Victoria CDP\tTX\tTexas\tStarr County\t2797\t26.1\t3.1\t25.2\t6640\t54426\t0.8634\t78547\tRomney\t78547\t0.005460208\t78547.0\n22056\t-98.97573299999999\t26.421087\tNorth Escobares CDP\tTX\tTexas\tStarr County\t2323\t23.2\t7.9\t21.4\t5566\t60417\t0.8634\t78584\tRomney\t78584\t0.0045348820000000005\t78584.0\n22057\t-99.107974\t26.56193\tFalcon Heights CDP\tTX\tTexas\tStarr County\t370\t29.1\t7.7\t12.4\t8715\t57917\t0.8634\t78545\tRomney\t78545\t0.0007223010000000001\t78545.0\n22058\t-98.882981\t26.433612\tLos Villareales CDP\tTX\tTexas\tStarr County\t1502\t25.7\t11.2\t28.8\t8687\t69595\t0.8634\t78584\tRomney\t78584\t0.002932153\t78584.0\n22059\t-99.077721\t26.418611\tFronton CDP\tTX\tTexas\tStarr County\t662\t29.1\t7.6\t12.5\t8707\t56667\t0.8634\t78584\tRomney\t78584\t0.001292334\t78584.0\n22060\t-98.44762800000001\t26.712905\tSan Isidro CDP\tTX\tTexas\tStarr County\t319\t42.1\t11.2\t10.6\t11399\t48571\t0.8634\t78588\tRomney\t78588\t0.000622741\t78588.0\n22061\t-98.66314\t26.314465000000002\tAlto Bonito CDP\tTX\tTexas\tStarr County\t616\t26.1\t2.8\t25.2\t6636\t54583\t0.8634\t78547\tRomney\t78547\t0.001202534\t78547.0\n22062\t-98.759766\t26.341309000000003\tEl Refugio CDP\tTX\tTexas\tStarr County\t154\t25.0\t1.3\t25.4\t6010\t46667\t0.8634\t78547\tRomney\t78547\t0.00030063400000000004\t78547.0\n22063\t-99.00232\t26.403139000000003\tRoma city\tTX\tTexas\tStarr County\t11523\t28.5\t11.7\t21.5\t7790\t70800\t0.8634\t78584\tRomney\t78584\t0.022494808999999998\t78584.0\n22064\t-98.919686\t26.405763\tLa Rosita CDP\tTX\tTexas\tStarr County\t2036\t25.2\t11.0\t28.3\t7916\t67727\t0.8634\t78584\tRomney\t78584\t0.00397461\t78584.0\n22065\t-98.77518\t26.363031\tLas Lomas CDP\tTX\tTexas\tStarr County\t2963\t24.7\t1.4\t25.2\t6018\t48673\t0.8634\t78547\tRomney\t78547\t0.005784268\t78547.0\n22066\t-98.90015600000001\t26.387163\tLos Alvarez CDP\tTX\tTexas\tStarr County\t1754\t27.8\t12.9\t27.5\t8470\t67766\t0.8634\t78584\tRomney\t78584\t0.0034240990000000003\t78584.0\n22067\t-98.769217\t26.34362\tSanta Cruz CDP\tTX\tTexas\tStarr County\t611\t24.5\t1.3\t25.3\t6015\t48636\t0.8634\t78547\tRomney\t78547\t0.001192773\t78547.0\n22068\t-98.705316\t26.333965999999997\tLa Casita-Garciasville CDP\tTX\tTexas\tStarr County\t2423\t26.1\t3.0\t25.1\t6638\t54722\t0.8634\t78547\tRomney\t78547\t0.004730098\t78547.0\n22069\t-98.752414\t26.353669\tLa Puerta CDP\tTX\tTexas\tStarr County\t1509\t24.6\t1.3\t25.2\t6018\t48774\t0.8634\t78547\tRomney\t78547\t0.002945818\t78547.0\n22070\t-98.912102\t32.756608\tBreckenridge city\tTX\tTexas\tStephens County\t5698\t36.0\t13.4\t7.2\t17443\t47602\t0.1392\t76424\tRomney\t76424\t0.011123441999999999\t76424.0\n22071\t-100.985997\t31.839109999999998\tSterling City\tTX\tTexas\tSterling County\t999\t39.9\t13.2\t3.9\t18729\t57326\t0.0628\t76951\tRomney\t76951\t0.001950214\t76951.0\n22072\t-100.22533100000001\t33.14052\tAspermont town\tTX\tTexas\tStonewall County\t948\t44.6\t9.7\t2.6\t17704\t37576\t0.237\t79502\tRomney\t79502\t0.0018506529999999998\t79502.0\n22073\t-100.64518000000001\t30.572694\tSonora city\tTX\tTexas\tSutton County\t3108\t37.5\t14.2\t2.6\t19112\t62333\t0.2478\t76950\tRomney\t76950\t0.006067332\t76950.0\n22074\t-101.855517\t34.748391999999996\tHappy town\tTX\tTexas\tSwisher County\t581\t40.7\t21.0\t1.6\t18320\t45000\t0.2551\t79042\tRomney\t79042\t0.001134208\t79042.0\n22075\t-101.748352\t34.365795\tKress city\tTX\tTexas\tSwisher County\t746\t36.0\t9.9\t11.5\t12640\t40714\t0.2551\t79052\tRomney\t79052\t0.001456316\t79052.0\n22076\t-101.774568\t34.537396\tTulia city\tTX\tTexas\tSwisher County\t4850\t35.9\t18.9\t8.2\t16600\t49380\t0.2551\t79088\tRomney\t79088\t0.009468005\t79088.0\n22077\t-97.34071\t32.656001\tEdgecliff Village town\tTX\tTexas\tTarrant County\t2841\t50.2\t28.6\t5.3\t28846\t108947\t0.4143\t76134\tRomney\t76134\t0.0055461040000000005\t76134.0\n22078\t-97.529549\t32.909012\tAzle city\tTX\tTexas\tTarrant County\t10357\t39.8\t17.7\t9.3\t24667\t101532\t0.4143\t76020\tRomney\t76020\t0.020218583000000002\t76020.0\n22079\t-97.529786\t33.012632\tBriar CDP\tTX\tTexas\tTarrant County\t5931\t41.1\t13.0\t7.7\t22903\t105090\t0.4143\t76071\tRomney\t76071\t0.011578296\t76071.0\n22080\t-97.460562\t32.755353\tWhite Settlement city\tTX\tTexas\tTarrant County\t16569\t33.9\t8.6\t10.0\t19434\t59875\t0.4143\t76108\tRomney\t76108\t0.032345438\t76108.0\n22081\t-97.4022\t32.802878\tSansom Park city\tTX\tTexas\tTarrant County\t4337\t34.5\t4.3\t11.6\t14771\t49275\t0.4143\t76114\tRomney\t76114\t0.008466544\t76114.0\n22082\t-97.33806899999999\t32.854310999999996\tBlue Mound city\tTX\tTexas\tTarrant County\t2431\t30.4\t17.8\t7.4\t24132\t97258\t0.4143\t76131\tRomney\t76131\t0.004745715\t76131.0\n22083\t-97.350567\t32.577602\tCrowley city\tTX\tTexas\tTarrant County\t10931\t36.0\t18.8\t6.5\t24289\t89050\t0.4143\t76036\tRomney\t76036\t0.021339126\t76036.0\n22084\t-97.148619\t32.891306\tColleyville city\tTX\tTexas\tTarrant County\t22814\t43.4\t57.3\t5.7\t52503\t318927\t0.4143\t76034\tRomney\t76034\t0.044536715\t76034.0\n22085\t-97.083415\t32.578854\tMansfield city\tTX\tTexas\tTarrant County\t54527\t34.5\t35.3\t6.7\t33125\t147784\t0.4143\t76063\tRomney\t76063\t0.106445754\t76063.0\n22086\t-97.266506\t32.662122\tForest Hill city\tTX\tTexas\tTarrant County\t15055\t36.5\t10.7\t13.1\t18077\t67908\t0.4143\t76119\tRomney\t76119\t0.029389858999999997\t76119.0\n22087\t-97.215675\t32.644785999999996\tKennedale city\tTX\tTexas\tTarrant County\t6920\t34.7\t21.0\t9.7\t26832\t111280\t0.4143\t76060\tRomney\t76060\t0.013508988999999999\t76060.0\n22088\t-97.444988\t32.89832\tEagle Mountain CDP\tTX\tTexas\tTarrant County\t11184\t42.3\t37.7\t5.4\t35751\t171988\t0.4143\t76179\tRomney\t76179\t0.021833024\t76179.0\n22089\t-97.125443\t32.698844\tArlington city\tTX\tTexas\tTarrant County\t384130\t32.0\t32.7\t8.5\t26700\t120309\t0.4143\t76015\tRomney\t76015\t0.749885516\t76015.0\n22090\t-97.20832800000001\t32.576834999999996\tRendon CDP\tTX\tTexas\tTarrant County\t10694\t41.7\t23.5\t7.3\t26079\t112016\t0.4143\t76060\tRomney\t76060\t0.020876463\t76060.0\n22091\t-97.180712\t32.835407000000004\tHurst city\tTX\tTexas\tTarrant County\t38766\t38.8\t26.1\t8.5\t28340\t123203\t0.4143\t76053\tRomney\t76053\t0.07567766599999999\t76053.0\n22092\t-97.15427700000001\t32.714971999999996\tPantego town\tTX\tTexas\tTarrant County\t2717\t49.8\t42.0\t4.9\t36808\t151786\t0.4143\t76013\tRomney\t76013\t0.005304035\t76013.0\n22093\t-97.13498\t32.846472\tBedford city\tTX\tTexas\tTarrant County\t49468\t38.7\t37.1\t6.4\t34094\t143937\t0.4143\t76021\tRomney\t76021\t0.096569746\t76021.0\n22094\t-97.150297\t32.996043\tSouthlake city\tTX\tTexas\tTarrant County\t27213\t38.2\t59.4\t6.3\t54184\t421007\t0.4143\t76092\tRomney\t76092\t0.053124292999999996\t76092.0\n22095\t-97.324961\t32.991768\tHaslet city\tTX\tTexas\tTarrant County\t1690\t33.2\t30.3\t6.0\t32215\t139063\t0.4143\t76052\tRomney\t76052\t0.00329916\t76052.0\n22096\t-97.424261\t32.759886\tWestworth Village city\tTX\tTexas\tTarrant County\t2964\t34.6\t10.2\t7.8\t21447\t67121\t0.4143\t76127\tRomney\t76127\t0.00578622\t76127.0\n22097\t-97.467036\t33.012774\tPecan Acres CDP\tTX\tTexas\tTarrant County\t3743\t36.0\t15.6\t8.1\t22691\t107374\t0.4143\t76071\tRomney\t76071\t0.007306956999999999\t76071.0\n22098\t-97.412166\t32.743722\tWestover Hills town\tTX\tTexas\tTarrant County\t664\t48.6\t69.8\t0.0\t89861\t975490\t0.4143\t76107\tRomney\t76107\t0.0012962380000000001\t76107.0\n22099\t-97.2273\t32.809453000000005\tRichland Hills city\tTX\tTexas\tTarrant County\t8473\t40.7\t17.9\t8.6\t24287\t92360\t0.4143\t76118\tRomney\t76118\t0.016540702\t76118.0\n22100\t-97.270794\t32.81769\tHaltom City\tTX\tTexas\tTarrant County\t40995\t33.1\t14.1\t9.8\t22482\t78918\t0.4143\t76117\tRomney\t76117\t0.08002904400000001\t76117.0\n22101\t-97.464584\t32.676393\tBenbrook city\tTX\tTexas\tTarrant County\t22293\t42.6\t34.9\t7.4\t31710\t117264\t0.4143\t76126\tRomney\t76126\t0.043519635999999993\t76126.0\n22102\t-97.518817\t32.922771999999995\tPelican Bay city\tTX\tTexas\tTarrant County\t1608\t31.1\t5.6\t10.4\t15325\t39737\t0.4143\t76020\tRomney\t76020\t0.003139083\t76020.0\n22103\t-97.365207\t32.865346\tSaginaw city\tTX\tTexas\tTarrant County\t17780\t32.5\t15.5\t8.3\t24292\t97853\t0.4143\t76131\tRomney\t76131\t0.034709511\t76131.0\n22104\t-97.202274\t32.991507\tWestlake town\tTX\tTexas\tTarrant County\t623\t44.0\t44.3\t5.0\t44065\t221491\t0.4143\t76262\tRomney\t76262\t0.0012161989999999998\t76262.0\n22105\t-97.398289\t32.776848\tRiver Oaks city\tTX\tTexas\tTarrant County\t7061\t35.5\t10.7\t11.0\t19543\t60784\t0.4143\t76114\tRomney\t76114\t0.013784244\t76114.0\n22106\t-97.280123\t32.629462\tEverman city\tTX\tTexas\tTarrant County\t6080\t32.6\t9.4\t11.4\t17776\t67753\t0.4143\t76140\tRomney\t76140\t0.011869168999999999\t76140.0\n22107\t-97.302011\t33.014033000000005\tFort Worth city\tTX\tTexas\tTarrant County\t699425\t32.3\t23.9\t10.0\t22857\t94879\t0.4143\t76177\tRomney\t76177\t1.3653936869999999\t76177.0\n22108\t-97.156589\t32.693738\tDalworthington Gardens city\tTX\tTexas\tTarrant County\t2353\t41.8\t48.6\t6.2\t44020\t246307\t0.4143\t76015\tRomney\t76015\t0.0045934470000000005\t76015.0\n22109\t-97.21787900000001\t32.860462\tNorth Richland Hills city\tTX\tTexas\tTarrant County\t66245\t35.6\t27.8\t7.9\t29882\t122392\t0.4143\t76180\tRomney\t76180\t0.129321235\t76180.0\n22110\t-97.02736999999999\t32.988279\tGrapevine city\tTX\tTexas\tTarrant County\t48848\t35.9\t44.2\t6.1\t37815\t186125\t0.4143\t75067\tRomney\t75067\t0.09535940400000001\t75067.0\n22111\t-97.489017\t32.822095000000004\tLakeside town\tTX\tTexas\tTarrant County\t1185\t47.7\t19.0\t10.9\t27481\t102765\t0.4143\t76135\tRomney\t76135\t0.002313317\t76135.0\n22112\t-97.251327\t32.871852000000004\tWatauga city\tTX\tTexas\tTarrant County\t23877\t33.3\t17.5\t7.7\t24417\t102043\t0.4143\t76148\tRomney\t76148\t0.046611867\t76148.0\n22113\t-97.225247\t32.933739\tKeller city\tTX\tTexas\tTarrant County\t37361\t35.7\t43.8\t6.1\t39121\t208803\t0.4143\t76248\tRomney\t76248\t0.072934873\t76248.0\n22114\t-97.079831\t32.850957\tEuless city\tTX\tTexas\tTarrant County\t52339\t33.8\t30.6\t7.1\t29893\t116876\t0.4143\t76039\tRomney\t76039\t0.102174415\t76039.0\n22115\t-97.430426\t32.813161\tLake Worth city\tTX\tTexas\tTarrant County\t4977\t40.7\t9.6\t12.9\t19431\t72305\t0.4143\t761HH\tRomney\t761HH\t0.00971593\t0.0\n22116\t-99.8662\t32.453034\tTye city\tTX\tTexas\tTaylor County\t1209\t38.8\t10.9\t7.8\t19172\t46809\t0.2254\t79563\tRomney\t79563\t0.002360169\t79563.0\n22117\t-99.67899399999999\t32.340361\tPotosi CDP\tTX\tTexas\tTaylor County\t2756\t42.0\t20.3\t6.0\t24849\t103786\t0.2254\t79602\tRomney\t79602\t0.005380169000000001\t79602.0\n22118\t-100.12321800000001\t32.488516\tTrent town\tTX\tTexas\tTaylor County\t331\t41.2\t10.2\t5.2\t18269\t45333\t0.2254\t79561\tRomney\t79561\t0.000646167\t79561.0\n22119\t-99.834287\t32.283839\tBuffalo Gap town\tTX\tTexas\tTaylor County\t453\t42.3\t32.2\t6.3\t23792\t114375\t0.2254\t79508\tRomney\t79508\t0.000884331\t79508.0\n22120\t-99.750123\t32.136569\tLawn town\tTX\tTexas\tTaylor County\t374\t44.1\t14.4\t6.1\t17720\t57000\t0.2254\t79530\tRomney\t79530\t0.00073011\t79530.0\n22121\t-100.012089\t32.468227\tMerkel town\tTX\tTexas\tTaylor County\t2492\t40.7\t14.8\t5.6\t18097\t44554\t0.2254\t79536\tRomney\t79536\t0.004864798\t79536.0\n22122\t-99.746714\t32.500221999999994\tImpact town\tTX\tTexas\tTaylor County\t40\t31.3\t7.7\t16.7\t13846\t25000\t0.2254\t79603\tRomney\t79603\t7.809999999999999e-05\t79603.0\n22123\t-99.688692\t32.57248\tAbilene city\tTX\tTexas\tTaylor County\t115481\t31.8\t24.7\t7.9\t20900\t78853\t0.2254\t79601\tRomney\t79601\t0.22543807899999999\t79601.0\n22124\t-99.79928699999999\t32.210653\tTuscola city\tTX\tTexas\tTaylor County\t821\t44.6\t26.2\t4.5\t21061\t97500\t0.2254\t79541\tRomney\t79541\t0.0016027279999999999\t79541.0\n22125\t-102.407937\t30.150793\tSanderson CDP\tTX\tTexas\tTerrell County\t775\t44.8\t18.6\t12.2\t15635\t31827\t0.3315\t79848\tRomney\t79848\t0.0015129289999999999\t79848.0\n22126\t-102.427545\t33.046957\tWellman city\tTX\tTexas\tTerry County\t178\t35.4\t17.0\t3.1\t17565\t75000\t0.2855\t79378\tRomney\t79378\t0.000347486\t79378.0\n22127\t-102.20586800000001\t33.337827000000004\tMeadow town\tTX\tTexas\tTerry County\t613\t36.3\t9.0\t5.0\t12976\t49167\t0.2855\t79345\tRomney\t79345\t0.001196678\t79345.0\n22128\t-102.272525\t33.176281\tBrownfield city\tTX\tTexas\tTerry County\t9112\t36.4\t8.7\t7.6\t16114\t55419\t0.2855\t79316\tRomney\t79316\t0.017788136\t79316.0\n22129\t-98.984583\t33.269899\tElbert CDP\tTX\tTexas\tThrockmorton County\t57\t46.0\t17.5\t3.1\t19094\t55000\t0.1341\t76372\tRomney\t76372\t0.00011127299999999999\t76372.0\n22130\t-99.179742\t33.182016\tThrockmorton town\tTX\tTexas\tThrockmorton County\t734\t44.2\t19.7\t6.9\t17642\t39318\t0.1341\t76483\tRomney\t76483\t0.00143289\t76483.0\n22131\t-99.05345600000001\t33.014846999999996\tWoodson town\tTX\tTexas\tThrockmorton County\t301\t46.3\t18.1\t4.0\t19125\t48636\t0.1341\t76491\tRomney\t76491\t0.000587602\t76491.0\n22132\t-95.103388\t33.362799\tTalco city\tTX\tTexas\tTitus County\t588\t39.5\t9.1\t8.4\t12836\t37500\t0.2991\t75487\tRomney\t75487\t0.001147874\t75487.0\n22133\t-95.110292\t33.166846\tWinfield city\tTX\tTexas\tTitus County\t515\t33.9\t14.0\t3.0\t19551\t79286\t0.2991\t75493\tRomney\t75493\t0.001005365\t75493.0\n22134\t-95.114903\t33.156071000000004\tMiller's Cove town\tTX\tTexas\tTitus County\t122\t38.0\t26.3\t7.4\t18184\t158333\t0.2991\t75493\tRomney\t75493\t0.00023816400000000002\t75493.0\n22135\t-94.973511\t33.163018\tMount Pleasant city\tTX\tTexas\tTitus County\t15083\t31.0\t14.3\t11.4\t15136\t82579\t0.2991\t75455\tRomney\t75455\t0.029444519\t75455.0\n22136\t-100.548343\t31.577464000000003\tGrape Creek CDP\tTX\tTexas\tTom Green County\t3340\t38.9\t9.6\t13.0\t16934\t74533\t0.2531\t769HH\tRomney\t769HH\t0.006520234000000001\t0.0\n22137\t-100.45156\t31.441142\tSan Angelo city\tTX\tTexas\tTom Green County\t90919\t33.6\t22.3\t8.6\t20680\t87267\t0.2531\t76903\tRomney\t76903\t0.17748897800000002\t76903.0\n22138\t-100.49274399999999\t31.197927000000004\tChristoval CDP\tTX\tTexas\tTom Green County\t430\t51.0\t24.9\t7.3\t23982\t112109\t0.2531\t76935\tRomney\t76935\t0.0008394310000000001\t76935.0\n22139\t-97.99647399999999\t30.452037\tLago Vista city\tTX\tTexas\tTravis County\t6517\t49.0\t37.1\t7.2\t35457\t189310\t0.6014\t78645\tRomney\t78645\t0.012722266000000001\t78645.0\n22140\t-97.75792\t30.468048\tAustin city\tTX\tTexas\tTravis County\t795201\t30.8\t42.7\t7.6\t30798\t171509\t0.6014\t78729\tRomney\t78729\t1.552364335\t78729.0\n22141\t-97.816188\t30.226053999999998\tSunset Valley city\tTX\tTexas\tTravis County\t908\t29.0\t48.1\t6.4\t26752\t236905\t0.6014\t78745\tRomney\t78745\t0.001772567\t78745.0\n22142\t-97.84536899999999\t30.294313\tLost Creek CDP\tTX\tTexas\tTravis County\t4952\t43.2\t78.2\t4.4\t59333\t406529\t0.6014\t78735\tRomney\t78735\t0.009667126\t78735.0\n22143\t-97.78858000000001\t30.129953000000004\tOnion Creek CDP\tTX\tTexas\tTravis County\t2015\t61.0\t60.9\t5.0\t61521\t281429\t0.6014\t78747\tRomney\t78747\t0.003933614\t78747.0\n22144\t-97.742014\t30.092740000000003\tCreedmoor city\tTX\tTexas\tTravis County\t248\t35.1\t13.4\t8.7\t22434\t128676\t0.6014\t78747\tRomney\t78747\t0.000484137\t78747.0\n22145\t-98.045707\t30.408171000000003\tBriarcliff village\tTX\tTexas\tTravis County\t1081\t44.8\t43.0\t5.6\t43552\t220139\t0.6014\t78669\tRomney\t78669\t0.0021102910000000002\t78669.0\n22146\t-97.557059\t30.347313\tManor city\tTX\tTexas\tTravis County\t1183\t35.5\t8.6\t6.3\t24076\t76875\t0.6014\t78653\tRomney\t78653\t0.0023094120000000003\t78653.0\n22147\t-97.954059\t30.308028999999998\tBee Cave village\tTX\tTexas\tTravis County\t1557\t41.2\t62.1\t4.2\t50943\t350526\t0.6014\t78738\tRomney\t78738\t0.0030395220000000002\t78738.0\n22148\t-97.678839\t30.443964\tWells Branch CDP\tTX\tTexas\tTravis County\t13310\t32.4\t52.3\t6.4\t37638\t166355\t0.6014\t78728\tRomney\t78728\t0.025983329\t78728.0\n22149\t-97.818783\t30.144575\tSan Leanna village\tTX\tTexas\tTravis County\t529\t47.5\t31.4\t4.6\t29450\t180093\t0.6014\t78748\tRomney\t78748\t0.001032696\t78748.0\n22150\t-97.65117\t30.461092999999998\tWindemere CDP\tTX\tTexas\tTravis County\t9165\t31.5\t38.5\t5.5\t30012\t157308\t0.6014\t78728\tRomney\t78728\t0.017891601\t78728.0\n22151\t-97.98621899999999\t30.346595\tThe Hills village\tTX\tTexas\tTravis County\t1937\t48.3\t69.9\t4.7\t64425\t405785\t0.6014\t78738\tRomney\t78738\t0.003781345\t78738.0\n22152\t-97.557416\t30.196094\tGarfield CDP\tTX\tTexas\tTravis County\t1805\t35.3\t14.7\t7.6\t20126\t78000\t0.6014\t78725\tRomney\t78725\t0.00352366\t78725.0\n22153\t-97.546227\t30.479195\tPflugerville city\tTX\tTexas\tTravis County\t34041\t32.0\t39.4\t5.1\t31384\t166943\t0.6014\t78634\tRomney\t78634\t0.066453682\t78634.0\n22154\t-97.975201\t30.363825\tLakeway city\tTX\tTexas\tTravis County\t10114\t46.9\t57.5\t6.2\t48837\t319260\t0.6014\t78738\tRomney\t78738\t0.019744207\t78738.0\n22155\t-97.931065\t30.480515999999998\tJonestown city\tTX\tTexas\tTravis County\t2226\t44.3\t31.9\t5.6\t32217\t164113\t0.6014\t78645\tRomney\t78645\t0.004345521\t78645.0\n22156\t-97.92773000000001\t30.413390000000003\tHudson Bend CDP\tTX\tTexas\tTravis County\t3000\t45.8\t45.4\t4.9\t43884\t244231\t0.6014\t78734\tRomney\t78734\t0.005856498000000001\t78734.0\n22157\t-97.86760600000001\t30.280589000000003\tBarton Creek CDP\tTX\tTexas\tTravis County\t1963\t42.2\t63.6\t5.0\t67904\t233333\t0.6014\t78735\tRomney\t78735\t0.003832102\t78735.0\n22158\t-97.874026\t30.164928000000003\tShady Hollow CDP\tTX\tTexas\tTravis County\t5417\t35.8\t55.2\t5.5\t40852\t245039\t0.6014\t78739\tRomney\t78739\t0.010574883\t78739.0\n22159\t-97.78644\t30.273818\tRollingwood city\tTX\tTexas\tTravis County\t1464\t46.3\t78.3\t4.1\t62001\t421765\t0.6014\t78746\tRomney\t78746\t0.002857971\t78746.0\n22160\t-97.631699\t30.063981\tMustang Ridge city\tTX\tTexas\tTravis County\t979\t34.2\t10.3\t6.6\t19041\t110045\t0.6014\t78617\tRomney\t78617\t0.00191117\t78617.0\n22161\t-97.80878100000001\t30.292087\tWest Lake Hills city\tTX\tTexas\tTravis County\t3219\t46.9\t81.6\t4.4\t60030\t473765\t0.6014\t78746\tRomney\t78746\t0.006284021999999999\t78746.0\n22162\t-95.126855\t31.057170000000003\tGroveton city\tTX\tTexas\tTrinity County\t1128\t40.7\t10.6\t14.3\t15104\t48906\t0.2589\t75845\tRomney\t75845\t0.002202043\t75845.0\n22163\t-95.373565\t30.944542\tTrinity city\tTX\tTexas\tTrinity County\t2772\t38.9\t8.9\t13.2\t17115\t60849\t0.2589\t75862\tRomney\t75862\t0.005411404\t75862.0\n22164\t-94.422095\t30.909625\tColmesneil city\tTX\tTexas\tTyler County\t610\t41.8\t11.7\t8.5\t15599\t66250\t0.2179\t75938\tRomney\t75938\t0.0011908210000000001\t75938.0\n22165\t-94.600309\t30.921460999999997\tChester town\tTX\tTexas\tTyler County\t255\t41.0\t14.5\t7.0\t26847\t80000\t0.2179\t75936\tRomney\t75936\t0.000497802\t75936.0\n22166\t-94.423511\t30.774175\tWoodville town\tTX\tTexas\tTyler County\t2659\t42.6\t17.2\t11.3\t18009\t80000\t0.2179\t75979\tRomney\t75979\t0.005190809\t75979.0\n22167\t-94.717759\t32.801319\tOre City\tTX\tTexas\tUpshur County\t1249\t32.9\t8.7\t7.3\t17007\t66053\t0.1963\t75683\tRomney\t75683\t0.002438255\t75683.0\n22168\t-94.91575300000001\t32.579844\tUnion Grove city\tTX\tTexas\tUpshur County\t416\t39.9\t13.6\t4.9\t18118\t81111\t0.1963\t75647\tRomney\t75647\t0.0008121010000000001\t75647.0\n22169\t-94.948086\t32.734047\tGilmer city\tTX\tTexas\tUpshur County\t5225\t40.9\t17.8\t6.6\t19517\t83619\t0.1963\t75644\tRomney\t75644\t0.010200067\t75644.0\n22170\t-94.860606\t32.602047\tEast Mountain city\tTX\tTexas\tUpshur County\t661\t43.5\t13.2\t7.8\t18779\t79545\t0.1963\t75693\tRomney\t75693\t0.001290382\t75693.0\n22171\t-95.113834\t32.586356\tBig Sandy town\tTX\tTexas\tUpshur County\t1152\t35.6\t14.3\t9.2\t16189\t70345\t0.1963\t75755\tRomney\t75755\t0.002248895\t75755.0\n22172\t-102.220134\t31.132585\tMcCamey city\tTX\tTexas\tUpton County\t1746\t40.3\t10.8\t7.6\t15896\t37500\t0.2562\t79752\tRomney\t79752\t0.003408482\t79752.0\n22173\t-101.939433\t31.22542\tRankin city\tTX\tTexas\tUpton County\t779\t44.5\t14.6\t4.1\t17610\t32647\t0.2562\t79778\tRomney\t79778\t0.001520737\t79778.0\n22174\t-99.841966\t29.148758\tUvalde Estates CDP\tTX\tTexas\tUvalde County\t2130\t25.5\t4.2\t11.5\t9883\t50476\t0.4535\t78801\tRomney\t78801\t0.004158114\t78801.0\n22175\t-99.51538000000001\t29.618797999999998\tUtopia CDP\tTX\tTexas\tUvalde County\t238\t50.5\t22.7\t8.8\t17704\t110000\t0.4535\t78884\tRomney\t78884\t0.000464616\t78884.0\n22176\t-99.775126\t29.213829999999998\tUvalde city\tTX\tTexas\tUvalde County\t15235\t31.9\t15.2\t9.9\t13969\t62848\t0.4535\t78801\tRomney\t78801\t0.029741248999999997\t78801.0\n22177\t-99.46945600000001\t29.321278999999997\tSabinal city\tTX\tTexas\tUvalde County\t1529\t38.1\t12.5\t7.3\t14219\t47100\t0.4535\t78881\tRomney\t78881\t0.002984862\t78881.0\n22178\t-99.64200799999999\t29.28548\tKnippa CDP\tTX\tTexas\tUvalde County\t740\t36.8\t16.3\t9.9\t14369\t57105\t0.4535\t78870\tRomney\t78870\t0.0014446029999999998\t78870.0\n22179\t-100.953317\t29.459086\tLake View CDP\tTX\tTexas\tVal Verde County\t205\t47.5\t28.3\t7.1\t19746\t141250\t0.5202\t78840\tRomney\t78840\t0.00040019400000000004\t78840.0\n22180\t-100.78341400000001\t29.356415999999996\tLaughlin AFB CDP\tTX\tTexas\tVal Verde County\t2153\t23.7\t53.7\t17.0\t17020\t58333\t0.5202\t78840\tRomney\t78840\t0.004203013\t78840.0\n22181\t-100.89443\t29.376501\tDel Rio city\tTX\tTexas\tVal Verde County\t36031\t32.7\t15.7\t13.4\t13787\t85225\t0.5202\t78840\tRomney\t78840\t0.070338492\t78840.0\n22182\t-101.15471600000001\t29.524399\tBox Canyon-Amistad CDP\tTX\tTexas\tVal Verde County\t82\t47.5\t15.0\t9.1\t13686\t68333\t0.5202\t78840\tRomney\t78840\t0.000160078\t78840.0\n22183\t-100.830772\t29.374537\tVal Verde Park CDP\tTX\tTexas\tVal Verde County\t2373\t26.7\t4.8\t15.8\t10333\t57917\t0.5202\t78840\tRomney\t78840\t0.00463249\t78840.0\n22184\t-100.943304\t29.368772999999997\tCienegas Terrace CDP\tTX\tTexas\tVal Verde County\t3359\t29.8\t7.7\t13.8\t12350\t58934\t0.5202\t788HH\tRomney\t788HH\t0.006557326\t0.0\n22185\t-95.637298\t32.524269\tVan city\tTX\tTexas\tVan Zandt County\t2619\t38.8\t20.6\t8.1\t19330\t103000\t0.1615\t75790\tRomney\t75790\t0.005112723\t75790.0\n22186\t-95.712056\t32.67817\tGrand Saline city\tTX\tTexas\tVan Zandt County\t3110\t38.0\t8.6\t7.9\t16380\t80779\t0.1615\t75140\tRomney\t75140\t0.006071236\t75140.0\n22187\t-95.61007099999999\t32.378634999999996\tEdom city\tTX\tTexas\tVan Zandt County\t352\t47.6\t11.8\t5.8\t18608\t92500\t0.1615\t75754\tRomney\t75754\t0.000687162\t75754.0\n22188\t-96.004587\t32.70947\tWills Point city\tTX\tTexas\tVan Zandt County\t3594\t38.2\t13.9\t10.4\t18680\t92200\t0.1615\t75169\tRomney\t75169\t0.007016085\t75169.0\n22189\t-95.803505\t32.68336\tFruitvale city\tTX\tTexas\tVan Zandt County\t471\t40.5\t10.5\t9.3\t15605\t91875\t0.1615\t75127\tRomney\t75127\t0.00091947\t75127.0\n22190\t-95.883421\t32.694613000000004\tEdgewood town\tTX\tTexas\tVan Zandt County\t2184\t39.1\t12.8\t12.3\t19221\t98000\t0.1615\t75117\tRomney\t75117\t0.00426353\t75117.0\n22191\t-95.864527\t32.55209\tCanton city\tTX\tTexas\tVan Zandt County\t3293\t41.8\t18.0\t11.9\t18318\t108021\t0.1615\t75103\tRomney\t75103\t0.0064284830000000005\t75103.0\n22192\t-96.98588199999999\t28.824724\tVictoria city\tTX\tTexas\tVictoria County\t62978\t35.0\t20.4\t8.9\t21524\t89033\t0.3051\t77901\tRomney\t77901\t0.122943509\t77901.0\n22193\t-96.902126\t28.650384999999996\tBloomington CDP\tTX\tTexas\tVictoria County\t2715\t27.4\t2.6\t15.1\t12320\t43774\t0.3051\t77951\tRomney\t77951\t0.005300131\t77951.0\n22194\t-96.79590400000001\t28.87183\tInez CDP\tTX\tTexas\tVictoria County\t2050\t39.7\t16.5\t4.6\t23260\t101200\t0.3051\t77968\tRomney\t77968\t0.00400194\t77968.0\n22195\t-95.550526\t30.706925\tHuntsville city\tTX\tTexas\tWalker County\t38871\t28.7\t24.8\t9.1\t18473\t106852\t0.3346\t77341\tRomney\t77341\t0.075882644\t77341.0\n22196\t-95.482099\t30.537316999999998\tNew Waverly city\tTX\tTexas\tWalker County\t848\t38.9\t9.7\t7.8\t17635\t95714\t0.3346\t77358\tRomney\t77358\t0.001655437\t77358.0\n22197\t-95.398536\t30.847523\tRiverside city\tTX\tTexas\tWalker County\t407\t49.7\t19.4\t7.1\t21105\t102155\t0.3346\t77367\tRomney\t77367\t0.0007945319999999999\t77367.0\n22198\t-95.91538\t30.059283\tWaller city\tTX\tTexas\tWaller County\t2229\t31.2\t18.2\t9.4\t18780\t89844\t0.4096\t77484\tRomney\t77484\t0.0043513779999999995\t77484.0\n22199\t-95.954278\t29.782079\tBrookshire city\tTX\tTexas\tWaller County\t4196\t30.1\t12.7\t12.9\t14848\t55118\t0.4096\t77423\tRomney\t77423\t0.008191288\t77423.0\n22200\t-95.98938100000001\t30.085067\tPrairie View city\tTX\tTexas\tWaller County\t4579\t22.0\t36.6\t21.4\t16418\t97059\t0.4096\t77446\tRomney\t77446\t0.008938968\t77446.0\n22201\t-96.02535400000001\t30.055365999999996\tPine Island town\tTX\tTexas\tWaller County\t925\t31.7\t16.6\t18.4\t17097\t93333\t0.4096\t77446\tRomney\t77446\t0.001805754\t77446.0\n22202\t-95.975955\t29.818958000000002\tPattison city\tTX\tTexas\tWaller County\t537\t39.1\t30.4\t8.3\t22031\t144444\t0.4096\t77423\tRomney\t77423\t0.001048313\t77423.0\n22203\t-96.078238\t30.095159999999996\tHempstead city\tTX\tTexas\tWaller County\t5020\t31.5\t18.4\t8.5\t15130\t81746\t0.4096\t77445\tRomney\t77445\t0.009799873\t77445.0\n22204\t-103.099235\t31.670415000000002\tMonahans city\tTX\tTexas\tWard County\t6822\t37.4\t16.1\t10.5\t17243\t47347\t0.2592\t79789\tRomney\t79789\t0.013317676\t79789.0\n22205\t-102.922237\t31.578828\tThorntonville town\tTX\tTexas\tWard County\t460\t48.4\t6.8\t7.8\t17904\t38056\t0.2592\t79756\tRomney\t79756\t0.0008979960000000001\t79756.0\n22206\t-103.395602\t31.461612\tBarstow city\tTX\tTexas\tWard County\t384\t26.0\t6.1\t9.9\t12630\t16000\t0.2592\t79719\tRomney\t79719\t0.000749632\t79719.0\n22207\t-103.122461\t31.537954\tPyote town\tTX\tTexas\tWard County\t124\t26.5\t4.8\t8.6\t12621\t16250\t0.2592\t79777\tRomney\t79777\t0.000242069\t79777.0\n22208\t-103.005748\t31.567147\tWickett town\tTX\tTexas\tWard County\t426\t38.8\t6.1\t12.8\t17991\t25192\t0.2592\t79788\tRomney\t79788\t0.000831623\t79788.0\n22209\t-102.854384\t31.340445000000003\tGrandfalls town\tTX\tTexas\tWard County\t360\t37.5\t11.0\t10.6\t14401\t28750\t0.2592\t79742\tRomney\t79742\t0.00070278\t79742.0\n22210\t-96.600311\t30.181496000000003\tBurton town\tTX\tTexas\tWashington County\t401\t43.6\t16.7\t5.3\t19328\t130769\t0.2348\t77835\tRomney\t77835\t0.0007828189999999999\t77835.0\n22211\t-96.39534\t30.158447999999996\tBrenham city\tTX\tTexas\tWashington County\t14154\t34.8\t20.9\t6.4\t20149\t110811\t0.2348\t77833\tRomney\t77833\t0.027630957\t77833.0\n22212\t-99.49169599999999\t27.552863000000002\tLaredo city\tTX\tTexas\tWebb County\t228174\t27.9\t17.1\t10.3\t13040\t99333\t0.7656\t78041\tRomney\t78041\t0.445433519\t78041.0\n22213\t-99.31554\t27.487786\tLaredo Ranchettes CDP\tTX\tTexas\tWebb County\t2023\t24.1\t4.6\t14.6\t8259\t60333\t0.7656\t78043\tRomney\t78043\t0.0039492320000000004\t78043.0\n22214\t-98.984063\t27.443154999999997\tMirando City CDP\tTX\tTexas\tWebb County\t722\t27.7\t5.7\t13.7\t9810\t52917\t0.7656\t78369\tRomney\t78369\t0.001409464\t78369.0\n22215\t-99.437292\t27.399648\tLa Presa CDP\tTX\tTexas\tWebb County\t754\t27.7\t5.7\t13.8\t9812\t52273\t0.7656\t78046\tRomney\t78046\t0.001471933\t78046.0\n22216\t-99.44924\t27.772894\tBotines CDP\tTX\tTexas\tWebb County\t131\t25.3\t18.5\t6.4\t14433\t93333\t0.7656\t78045\tRomney\t78045\t0.00025573400000000003\t78045.0\n22217\t-99.211523\t27.647144\tRanchitos Las Lomas CDP\tTX\tTexas\tWebb County\t358\t27.9\t8.2\t11.4\t9424\t62857\t0.7656\t78043\tRomney\t78043\t0.000698875\t78043.0\n22218\t-99.422786\t27.499098999999998\tLarga Vista CDP\tTX\tTexas\tWebb County\t1428\t23.8\t4.4\t14.7\t8070\t60968\t0.7656\t78043\tRomney\t78043\t0.002787693\t78043.0\n22219\t-99.600716\t27.668817999999998\tRanchos Penitas West CDP\tTX\tTexas\tWebb County\t516\t25.2\t18.9\t7.0\t14447\t93750\t0.7656\t78045\tRomney\t78045\t0.001007318\t78045.0\n22220\t-99.502955\t27.331713\tEl Cenizo city\tTX\tTexas\tWebb County\t3924\t19.7\t1.4\t21.9\t4783\t37575\t0.7656\t78046\tRomney\t78046\t0.007660299000000001\t78046.0\n22221\t-99.48212099999999\t27.364853000000004\tRio Bravo city\tTX\tTexas\tWebb County\t5796\t22.5\t2.2\t16.1\t5823\t43629\t0.7656\t78046\tRomney\t78046\t0.011314754\t78046.0\n22222\t-98.832187\t27.428247\tBruni CDP\tTX\tTexas\tWebb County\t524\t33.7\t10.3\t14.8\t12000\t46667\t0.7656\t78344\tRomney\t78344\t0.001022935\t78344.0\n22223\t-98.970945\t27.471463\tOilton CDP\tTX\tTexas\tWebb County\t399\t33.4\t10.2\t14.8\t11865\t46250\t0.7656\t78371\tRomney\t78371\t0.0007789139999999999\t78371.0\n22224\t-96.105021\t29.313538\tWharton city\tTX\tTexas\tWharton County\t9291\t36.0\t19.3\t13.4\t17638\t75132\t0.3006\t77488\tRomney\t77488\t0.018137574\t77488.0\n22225\t-96.271291\t29.196612\tEl Campo city\tTX\tTexas\tWharton County\t10750\t35.8\t17.0\t11.1\t17664\t78299\t0.3006\t77437\tRomney\t77437\t0.020985784\t77437.0\n22226\t-96.083726\t29.404021000000004\tHungerford CDP\tTX\tTexas\tWharton County\t609\t37.5\t9.7\t8.7\t19086\t53889\t0.3006\t77448\tRomney\t77448\t0.001188869\t77448.0\n22227\t-96.063123\t29.528664000000003\tEast Bernard CDP\tTX\tTexas\tWharton County\t1792\t36.8\t13.9\t4.6\t17838\t84545\t0.3006\t77435\tRomney\t77435\t0.003498281\t77435.0\n22228\t-95.94951800000001\t29.261574\tBoling-Iago CDP\tTX\tTexas\tWharton County\t1358\t33.1\t6.4\t8.4\t14730\t57414\t0.3006\t77420\tRomney\t77420\t0.002651041\t77420.0\n22229\t-96.412325\t29.111869\tLouise CDP\tTX\tTexas\tWharton County\t924\t35.0\t11.5\t10.0\t16321\t72931\t0.3006\t77455\tRomney\t77455\t0.001803801\t77455.0\n22230\t-100.24633\t35.215564\tShamrock city\tTX\tTexas\tWheeler County\t1885\t43.8\t13.5\t4.4\t16678\t42328\t0.109\t79079\tRomney\t79079\t0.003679833\t79079.0\n22231\t-100.275238\t35.441037\tWheeler city\tTX\tTexas\tWheeler County\t1255\t42.1\t11.9\t2.1\t18927\t53462\t0.109\t79096\tRomney\t79096\t0.002449968\t79096.0\n22232\t-100.441867\t35.529140000000005\tMobeetie city\tTX\tTexas\tWheeler County\t96\t49.2\t12.3\t1.3\t20875\t67500\t0.109\t79061\tRomney\t79061\t0.000187408\t79061.0\n22233\t-98.565363\t34.078371000000004\tBurkburnett city\tTX\tTexas\tWichita County\t10892\t39.3\t19.1\t6.5\t22640\t69944\t0.2566\t76354\tRomney\t76354\t0.021262992\t76354.0\n22234\t-98.919771\t34.030383\tElectra city\tTX\tTexas\tWichita County\t2856\t40.3\t9.1\t7.9\t16271\t32194\t0.2566\t76360\tRomney\t76360\t0.005575386\t76360.0\n22235\t-98.529661\t33.908052000000005\tWichita Falls city\tTX\tTexas\tWichita County\t101904\t32.9\t23.9\t8.6\t20886\t75332\t0.2566\t76309\tRomney\t76309\t0.198933521\t76309.0\n22236\t-98.680541\t33.961363\tIowa Park city\tTX\tTexas\tWichita County\t6219\t38.6\t12.9\t6.3\t21866\t64691\t0.2566\t76367\tRomney\t76367\t0.01214052\t76367.0\n22237\t-98.59814300000001\t33.937102\tPleasant Valley town\tTX\tTexas\tWichita County\t392\t37.4\t12.2\t10.9\t18587\t75455\t0.2566\t76306\tRomney\t76306\t0.000765249\t76306.0\n22238\t-99.300156\t34.147905\tVernon city\tTX\tTexas\tWilbarger County\t11201\t37.8\t15.8\t6.0\t18944\t56598\t0.244\t76384\tRomney\t76384\t0.021866211\t76384.0\n22239\t-97.908525\t26.463027\tLasara CDP\tTX\tTexas\tWillacy County\t1072\t26.8\t7.8\t12.4\t8978\t38235\t0.7109\t78580\tRomney\t78580\t0.002092722\t78580.0\n22240\t-97.437126\t26.561902000000003\tPort Mansfield CDP\tTX\tTexas\tWillacy County\t461\t37.9\t8.9\t13.6\t11342\t48636\t0.7109\t78598\tRomney\t78598\t0.0008999489999999999\t78598.0\n22241\t-97.824206\t26.356897999999997\tZapata Ranch CDP\tTX\tTexas\tWillacy County\t97\t28.8\t1.9\t9.8\t9518\t50000\t0.7109\t78594\tRomney\t78594\t0.00018936\t78594.0\n22242\t-97.821988\t26.484401000000002\tRanchette Estates CDP\tTX\tTexas\tWillacy County\t139\t30.6\t9.9\t16.7\t11345\t65000\t0.7109\t78580\tRomney\t78580\t0.00027135099999999997\t78580.0\n22243\t-97.78989200000001\t26.411617\tLyford city\tTX\tTexas\tWillacy County\t2128\t31.1\t10.5\t13.8\t11215\t49569\t0.7109\t78594\tRomney\t78594\t0.004154209\t78594.0\n22244\t-97.639662\t26.500921\tSan Perlita city\tTX\tTexas\tWillacy County\t756\t37.7\t8.8\t13.5\t11333\t48750\t0.7109\t78569\tRomney\t78569\t0.001475837\t78569.0\n22245\t-97.786642\t26.49473\tLos Angeles Subdivision CDP\tTX\tTexas\tWillacy County\t83\t28.9\t0.0\t18.2\t6690\t28750\t0.7109\t78580\tRomney\t78580\t0.00016203\t78580.0\n22246\t-97.614751\t26.415545\tWillamar CDP\tTX\tTexas\tWillacy County\t16\t18.8\t12.5\t14.3\t12072\t50000\t0.7109\t78569\tRomney\t78569\t3.12e-05\t78569.0\n22247\t-97.79389599999999\t26.397249\tLyford South CDP\tTX\tTexas\tWillacy County\t189\t30.4\t10.0\t15.5\t10569\t46000\t0.7109\t78594\tRomney\t78594\t0.00036895900000000003\t78594.0\n22248\t-97.776933\t26.476791\tRaymondville city\tTX\tTexas\tWillacy County\t9799\t29.8\t9.4\t15.6\t9840\t49283\t0.7109\t78580\tRomney\t78580\t0.019129273999999998\t78580.0\n22249\t-97.786893\t26.433471\tBausell and Ellis CDP\tTX\tTexas\tWillacy County\t117\t32.5\t11.1\t11.1\t12340\t53750\t0.7109\t78580\tRomney\t78580\t0.000228403\t78580.0\n22250\t-97.79610699999999\t26.345488\tSebastian CDP\tTX\tTexas\tWillacy County\t2056\t29.4\t4.3\t14.0\t9806\t50730\t0.7109\t78594\tRomney\t78594\t0.004013653\t78594.0\n22251\t-97.598791\t26.358707\tSanta Monica CDP\tTX\tTexas\tWillacy County\t87\t32.0\t7.4\t26.7\t10367\t60000\t0.7109\t78569\tRomney\t78569\t0.00016983799999999998\t78569.0\n22252\t-97.699699\t30.695295\tSerenada CDP\tTX\tTexas\tWilliamson County\t2635\t52.4\t50.6\t4.8\t47965\t267488\t0.379\t78628\tRomney\t78628\t0.005143957\t78628.0\n22253\t-97.741807\t30.510156\tBrushy Creek CDP\tTX\tTexas\tWilliamson County\t28775\t32.9\t58.1\t5.9\t41531\t267821\t0.379\t78717\tRomney\t78717\t0.056173575999999996\t78717.0\n22254\t-97.746677\t30.459308\tJollyville CDP\tTX\tTexas\tWilliamson County\t18550\t33.5\t48.1\t7.6\t36864\t226319\t0.379\t78729\tRomney\t78729\t0.036212679\t78729.0\n22255\t-97.29809399999999\t30.588435999999998\tThrall city\tTX\tTexas\tWilliamson County\t1096\t35.2\t8.6\t12.2\t18314\t81731\t0.379\t76578\tRomney\t76578\t0.002139574\t76578.0\n22256\t-97.428967\t30.798296\tBartlett city\tTX\tTexas\tWilliamson County\t2232\t36.5\t11.1\t6.7\t14426\t79000\t0.379\t76511\tRomney\t76511\t0.004357234000000001\t76511.0\n22257\t-97.54181899999999\t30.546084000000004\tHutto city\tTX\tTexas\tWilliamson County\t2402\t31.5\t27.1\t6.8\t34463\t166604\t0.379\t78634\tRomney\t78634\t0.004689103\t78634.0\n22258\t-97.82089\t30.513108000000003\tCedar Park city\tTX\tTexas\tWilliamson County\t47873\t32.3\t40.5\t6.5\t34962\t204720\t0.379\t78613\tRomney\t78613\t0.09345604199999999\t78613.0\n22259\t-97.918061\t30.666288\tLiberty Hill city\tTX\tTexas\tWilliamson County\t1682\t37.8\t17.5\t10.2\t27540\t155172\t0.379\t78642\tRomney\t78642\t0.003283543\t78642.0\n22260\t-97.44114300000001\t30.718066999999998\tGranger city\tTX\tTexas\tWilliamson County\t1960\t39.2\t9.4\t10.4\t16995\t81383\t0.379\t76530\tRomney\t76530\t0.003826245\t76530.0\n22261\t-97.66774000000001\t30.51874\tRound Rock city\tTX\tTexas\tWilliamson County\t91607\t31.2\t32.6\t7.6\t32884\t199517\t0.379\t78664\tRomney\t78664\t0.178832068\t78664.0\n22262\t-97.85573000000001\t30.565424\tLeander city\tTX\tTexas\tWilliamson County\t15522\t31.1\t24.9\t6.7\t27829\t162979\t0.379\t78641\tRomney\t78641\t0.03030152\t78641.0\n22263\t-97.792908\t30.84047\tFlorence city\tTX\tTexas\tWilliamson County\t1408\t35.5\t13.1\t7.2\t21145\t116011\t0.379\t76527\tRomney\t76527\t0.00274865\t76527.0\n22264\t-97.592686\t30.675807\tWeir city\tTX\tTexas\tWilliamson County\t646\t33.5\t17.7\t9.0\t21152\t100781\t0.379\t78626\tRomney\t78626\t0.001261099\t78626.0\n22265\t-97.807151\t30.454881\tAnderson Mill CDP\tTX\tTexas\tWilliamson County\t9718\t34.5\t40.1\t8.5\t32110\t185521\t0.379\t78750\tRomney\t78750\t0.018971149\t78750.0\n22266\t-97.689318\t30.662115000000004\tGeorgetown city\tTX\tTexas\tWilliamson County\t45223\t41.0\t40.8\t7.6\t33770\t244034\t0.379\t78628\tRomney\t78628\t0.088282802\t78628.0\n22267\t-97.41663199999999\t30.574341999999998\tTaylor city\tTX\tTexas\tWilliamson County\t16061\t34.7\t15.2\t9.6\t22063\t126143\t0.379\t76574\tRomney\t76574\t0.031353738\t76574.0\n22268\t-98.156646\t29.137863\tFloresville city\tTX\tTexas\tWilson County\t6755\t36.7\t13.1\t11.9\t16584\t83185\t0.2802\t78114\tRomney\t78114\t0.013186881000000001\t78114.0\n22269\t-98.11876600000001\t29.354891\tLa Vernia city\tTX\tTexas\tWilson County\t1270\t36.1\t14.1\t5.9\t23495\t120766\t0.2802\t78121\tRomney\t78121\t0.002479251\t78121.0\n22270\t-98.08093199999999\t29.072553000000003\tPoth town\tTX\tTexas\tWilson County\t2294\t35.5\t11.7\t5.2\t17233\t83804\t0.2802\t78147\tRomney\t78147\t0.004478269\t78147.0\n22271\t-97.963941\t29.236017999999998\tStockdale city\tTX\tTexas\tWilson County\t1666\t41.3\t12.9\t7.7\t17640\t65370\t0.2802\t78160\tRomney\t78160\t0.003252309\t78160.0\n22272\t-103.09231899999999\t31.853890000000003\tKermit city\tTX\tTexas\tWinkler County\t5698\t34.5\t9.4\t10.4\t15810\t35970\t0.2307\t79745\tRomney\t79745\t0.011123441999999999\t79745.0\n22273\t-103.154682\t31.754844\tWink city\tTX\tTexas\tWinkler County\t818\t38.0\t16.0\t5.3\t17198\t39833\t0.2307\t79789\tRomney\t79789\t0.001596872\t79789.0\n22274\t-97.79935400000001\t33.2948\tChico city\tTX\tTexas\tWise County\t1253\t39.0\t8.0\t8.8\t16943\t71618\t0.1553\t76431\tRomney\t76431\t0.002446064\t76431.0\n22275\t-97.454675\t33.003428\tNewark city\tTX\tTexas\tWise County\t1027\t36.9\t10.6\t11.7\t18581\t89286\t0.1553\t76071\tRomney\t76071\t0.002004874\t76071.0\n22276\t-97.688733\t33.150226\tParadise city\tTX\tTexas\tWise County\t512\t38.5\t14.5\t7.5\t19949\t112981\t0.1553\t76073\tRomney\t76073\t0.000999509\t76073.0\n22277\t-97.69589599999999\t33.357572999999995\tAlvord town\tTX\tTexas\tWise County\t1478\t39.9\t11.1\t9.3\t19574\t73721\t0.1553\t76225\tRomney\t76225\t0.002885301\t76225.0\n22278\t-97.756976\t33.209317999999996\tBridgeport city\tTX\tTexas\tWise County\t5301\t34.2\t13.0\t11.1\t16956\t76369\t0.1553\t76426\tRomney\t76426\t0.010348432\t76426.0\n22279\t-97.511949\t33.05773\tAurora town\tTX\tTexas\tWise County\t908\t38.8\t16.3\t11.9\t18896\t109896\t0.1553\t76078\tRomney\t76078\t0.001772567\t76078.0\n22280\t-97.87006600000001\t33.177423\tRunaway Bay city\tTX\tTexas\tWise County\t1407\t51.2\t30.7\t4.3\t27166\t126389\t0.1553\t76426\tRomney\t76426\t0.0027466979999999997\t76426.0\n22281\t-97.590707\t33.232119\tDecatur city\tTX\tTexas\tWise County\t6322\t34.3\t19.7\t8.7\t19997\t102165\t0.1553\t76234\tRomney\t76234\t0.012341593\t76234.0\n22282\t-97.56284000000001\t33.080951\tBoyd town\tTX\tTexas\tWise County\t1298\t37.0\t13.2\t7.1\t18078\t81154\t0.1553\t76023\tRomney\t76023\t0.0025339110000000002\t76023.0\n22283\t-97.467885\t33.048428\tRhome city\tTX\tTexas\tWise County\t934\t36.1\t15.3\t6.9\t19664\t114464\t0.1553\t76078\tRomney\t76078\t0.001823323\t76078.0\n22284\t-97.461881\t33.115703\tNew Fairview city\tTX\tTexas\tWise County\t1047\t36.1\t15.3\t6.9\t19677\t114648\t0.1553\t76078\tRomney\t76078\t0.002043918\t76078.0\n22285\t-97.830961\t33.207269000000004\tLake Bridgeport city\tTX\tTexas\tWise County\t426\t46.0\t16.3\t8.5\t21234\t75714\t0.1553\t76426\tRomney\t76426\t0.000831623\t76426.0\n22286\t-95.444602\t32.794816\tQuitman city\tTX\tTexas\tWood County\t2266\t47.2\t20.5\t7.3\t21555\t111905\t0.1738\t75783\tRomney\t75783\t0.004423608\t75783.0\n22287\t-95.202749\t32.591910999999996\tHawkins city\tTX\tTexas\tWood County\t1699\t41.7\t21.5\t9.9\t19593\t79630\t0.1738\t75765\tRomney\t75765\t0.00331673\t75765.0\n22288\t-95.29070899999999\t32.967729\tWinnsboro city\tTX\tTexas\tWood County\t3696\t39.5\t13.6\t9.0\t17470\t94783\t0.1738\t75494\tRomney\t75494\t0.007215205\t75494.0\n22289\t-95.57615600000001\t32.930555\tYantis town\tTX\tTexas\tWood County\t348\t50.3\t14.3\t6.7\t23815\t120588\t0.1738\t75497\tRomney\t75497\t0.000679354\t75497.0\n22290\t-95.488353\t32.666063\tMineola city\tTX\tTexas\tWood County\t4925\t39.9\t14.3\t11.7\t19177\t97703\t0.1738\t75773\tRomney\t75773\t0.009614417\t75773.0\n22291\t-95.63430600000001\t32.790946000000005\tAlba town\tTX\tTexas\tWood County\t519\t47.6\t12.2\t11.8\t18728\t120500\t0.1738\t75410\tRomney\t75410\t0.001013174\t75410.0\n22292\t-102.829809\t32.968971999999994\tDenver City town\tTX\tTexas\tYoakum County\t4214\t34.4\t9.5\t9.9\t16060\t47107\t0.1922\t79323\tRomney\t79323\t0.008226427\t79323.0\n22293\t-102.82732\t33.189583\tPlains town\tTX\tTexas\tYoakum County\t1527\t38.3\t13.5\t7.6\t16675\t56563\t0.1922\t79355\tRomney\t79355\t0.0029809570000000002\t79355.0\n22294\t-98.743651\t33.194856\tNewcastle city\tTX\tTexas\tYoung County\t597\t42.8\t9.8\t12.2\t17759\t46316\t0.1356\t76372\tRomney\t76372\t0.001165443\t76372.0\n22295\t-98.57817800000001\t33.101007\tGraham city\tTX\tTexas\tYoung County\t8627\t41.5\t14.9\t6.0\t20126\t60829\t0.1356\t76450\tRomney\t76450\t0.016841336000000002\t76450.0\n22296\t-98.758184\t33.364396\tOlney city\tTX\tTexas\tYoung County\t3373\t42.0\t16.4\t8.2\t16404\t44488\t0.1356\t76374\tRomney\t76374\t0.0065846559999999995\t76374.0\n22297\t-99.289422\t26.874789\tFalcon Mesa CDP\tTX\tTexas\tZapata County\t695\t51.3\t9.8\t12.7\t15657\t59688\t0.7132\t78076\tRomney\t78076\t0.001356755\t78076.0\n22298\t-99.10736800000001\t26.795593\tMorales-Sanchez CDP\tTX\tTexas\tZapata County\t109\t33.9\t6.0\t13.6\t14437\t75000\t0.7132\t78076\tRomney\t78076\t0.000212786\t78076.0\n22299\t-99.25317\t26.857689\tSiesta Shores CDP\tTX\tTexas\tZapata County\t923\t33.3\t15.2\t3.6\t15745\t61875\t0.7132\t78076\tRomney\t78076\t0.001801849\t78076.0\n22300\t-99.263664\t26.906726000000003\tZapata CDP\tTX\tTexas\tZapata County\t5716\t32.7\t10.0\t11.7\t13555\t71942\t0.7132\t78076\tRomney\t78076\t0.011158581\t78076.0\n22301\t-99.101416\t26.711434000000004\tLopeno CDP\tTX\tTexas\tZapata County\t169\t43.9\t6.2\t18.9\t14714\t75000\t0.7132\t78545\tRomney\t78545\t0.000329916\t78545.0\n22302\t-99.094678\t26.638159\tNew Falcon CDP\tTX\tTexas\tZapata County\t222\t43.9\t6.0\t18.6\t14725\t74167\t0.7132\t78545\tRomney\t78545\t0.000433381\t78545.0\n22303\t-99.256442\t26.871057\tFalcon Lake Estates CDP\tTX\tTexas\tZapata County\t861\t33.4\t15.1\t3.8\t15740\t61471\t0.7132\t78076\tRomney\t78076\t0.001680815\t78076.0\n22304\t-99.430848\t27.048298\tSan Ignacio CDP\tTX\tTexas\tZapata County\t1018\t31.3\t14.0\t12.9\t10559\t50750\t0.7132\t78067\tRomney\t78067\t0.001987305\t78067.0\n22305\t-99.261401\t26.928907000000002\tMedina CDP\tTX\tTexas\tZapata County\t3714\t23.9\t7.3\t21.2\t8698\t52063\t0.7132\t78076\tRomney\t78076\t0.007250344000000001\t78076.0\n22306\t-99.832303\t28.723745\tLas Colonias CDP\tTX\tTexas\tZavala County\t306\t26.0\t8.9\t18.5\t9507\t62500\t0.8327\t78839\tRomney\t78839\t0.0005973630000000001\t78839.0\n22307\t-99.825671\t28.690834000000002\tCrystal City\tTX\tTexas\tZavala County\t7530\t30.5\t9.1\t20.6\t8888\t40483\t0.8327\t78839\tRomney\t78839\t0.01469981\t78839.0\n22308\t-99.80775\t28.656149\tChula Vista-River Spur CDP\tTX\tTexas\tZavala County\t379\t24.8\t7.4\t24.1\t9740\t38000\t0.8327\t78839\tRomney\t78839\t0.000739871\t78839.0\n22309\t-99.616733\t28.949587\tBatesville CDP\tTX\tTexas\tZavala County\t1240\t29.7\t8.8\t16.4\t9706\t26000\t0.8327\t78829\tRomney\t78829\t0.002420686\t78829.0\n22310\t-99.848395\t28.948696\tLa Pryor CDP\tTX\tTexas\tZavala County\t1460\t29.1\t8.2\t14.3\t10008\t25294\t0.8327\t78872\tRomney\t78872\t0.0028501620000000003\t78872.0\n22311\t-112.92470700000001\t38.213896000000005\tMinersville town\tUT\tUtah\tBeaver County\t881\t27.7\t13.0\t6.5\t15835\t113117\t0.1352\t84752\tRomney\t84752\t0.00199993\t84752.0\n22312\t-112.643607\t38.269321999999995\tBeaver city\tUT\tUtah\tBeaver County\t2586\t33.5\t14.6\t7.9\t16423\t124438\t0.1352\t84713\tRomney\t84713\t0.005870395\t84713.0\n22313\t-113.011298\t38.393694\tMilford city\tUT\tUtah\tBeaver County\t1573\t27.1\t9.4\t5.6\t17236\t95795\t0.1352\t84751\tRomney\t84751\t0.0035708159999999997\t84751.0\n22314\t-112.12160800000001\t41.549176\tCorinne city\tUT\tUtah\tBox Elder County\t647\t32.1\t12.8\t8.1\t17386\t146512\t0.1022\t84301\tRomney\t84301\t0.001468734\t84301.0\n22315\t-112.040949\t41.358048\tSouth Willard CDP\tUT\tUtah\tBox Elder County\t635\t32.7\t14.9\t7.5\t20630\t173370\t0.1022\t84340\tRomney\t84340\t0.0014414929999999999\t84340.0\n22316\t-112.04464499999999\t41.413957\tWillard city\tUT\tUtah\tBox Elder County\t1756\t32.9\t15.6\t7.1\t20674\t175195\t0.1022\t84340\tRomney\t84340\t0.003986239\t84340.0\n22317\t-112.162907\t41.736812\tGarland city\tUT\tUtah\tBox Elder County\t2503\t25.8\t15.5\t8.8\t17611\t144138\t0.1022\t84312\tRomney\t84312\t0.005681979\t84312.0\n22318\t-112.237379\t41.976433\tPortage town\tUT\tUtah\tBox Elder County\t367\t27.0\t18.8\t8.9\t18947\t159375\t0.1022\t84331\tRomney\t84331\t0.000833115\t84331.0\n22319\t-112.08525700000001\t41.635498\tHoneyville city\tUT\tUtah\tBox Elder County\t1492\t31.5\t20.3\t8.2\t16825\t170221\t0.1022\t84314\tRomney\t84314\t0.0033869409999999996\t84314.0\n22320\t-112.445323\t41.773916\tHowell town\tUT\tUtah\tBox Elder County\t284\t24.9\t11.3\t7.6\t16318\t145192\t0.1022\t84316\tRomney\t84316\t0.000644699\t84316.0\n22321\t-112.1375\t41.677341999999996\tElwood town\tUT\tUtah\tBox Elder County\t1050\t32.3\t19.2\t6.8\t19506\t185795\t0.1022\t84314\tRomney\t84314\t0.002383571\t84314.0\n22322\t-112.14477\t41.875383\tPlymouth town\tUT\tUtah\tBox Elder County\t338\t27.3\t18.8\t9.0\t18948\t155769\t0.1022\t84330\tRomney\t84330\t0.000767283\t84330.0\n22323\t-112.14021699999999\t41.810575\tRiverside CDP\tUT\tUtah\tBox Elder County\t877\t29.4\t21.3\t10.0\t18533\t155743\t0.1022\t84334\tRomney\t84334\t0.001990849\t84334.0\n22324\t-112.038803\t41.463792\tPerry city\tUT\tUtah\tBox Elder County\t3357\t30.5\t30.8\t9.1\t25699\t216111\t0.1022\t84302\tRomney\t84302\t0.007620617\t84302.0\n22325\t-112.12471000000001\t41.613881\tBear River City town\tUT\tUtah\tBox Elder County\t827\t31.1\t18.6\t7.1\t18670\t171875\t0.1022\t84301\tRomney\t84301\t0.001877346\t84301.0\n22326\t-112.18061399999999\t41.716211\tTremonton city\tUT\tUtah\tBox Elder County\t7181\t27.1\t16.7\t8.9\t19167\t155678\t0.1022\t84337\tRomney\t84337\t0.016301356\t84337.0\n22327\t-112.08809299999999\t41.693081\tDeweyville town\tUT\tUtah\tBox Elder County\t314\t34.0\t24.7\t6.5\t19002\t190385\t0.1022\t84309\tRomney\t84309\t0.0007128010000000001\t84309.0\n22328\t-112.117198\t41.812242\tFielding town\tUT\tUtah\tBox Elder County\t538\t29.2\t21.2\t10.0\t18532\t156771\t0.1022\t84311\tRomney\t84311\t0.001221296\t84311.0\n22329\t-112.017036\t41.511965999999994\tBrigham City\tUT\tUtah\tBox Elder County\t18633\t29.6\t27.3\t10.8\t19727\t160382\t0.1022\t84302\tRomney\t84302\t0.042298170999999996\t84302.0\n22330\t-112.71635500000001\t41.973071999999995\tSnowville town\tUT\tUtah\tBox Elder County\t227\t25.0\t11.4\t7.4\t16350\t145455\t0.1022\t84336\tRomney\t84336\t0.000515305\t84336.0\n22331\t-111.93403300000001\t41.501092\tMantua town\tUT\tUtah\tBox Elder County\t816\t33.1\t35.4\t9.1\t19873\t197619\t0.1022\t84324\tRomney\t84324\t0.001852375\t84324.0\n22332\t-111.80403999999999\t41.776134000000006\tNorth Logan city\tUT\tUtah\tCache County\t9018\t26.7\t49.7\t5.3\t21341\t226154\t0.1476\t84341\tRomney\t84341\t0.02047147\t84341.0\n22333\t-111.91617099999999\t41.747888\tBenson CDP\tUT\tUtah\tCache County\t1845\t27.4\t25.4\t4.6\t19272\t178697\t0.1476\t84325\tRomney\t84325\t0.004188275\t84325.0\n22334\t-111.833698\t41.568842\tParadise town\tUT\tUtah\tCache County\t992\t29.0\t33.0\t5.0\t18723\t220679\t0.1476\t84319\tRomney\t84319\t0.002251907\t84319.0\n22335\t-111.779924\t41.967345\tCove CDP\tUT\tUtah\tCache County\t672\t28.8\t29.4\t6.6\t16552\t168000\t0.1476\t84333\tRomney\t84333\t0.001525485\t84333.0\n22336\t-111.98616399999999\t41.771815000000004\tPeter CDP\tUT\tUtah\tCache County\t384\t27.8\t34.0\t6.7\t19798\t200000\t0.1476\t84325\tRomney\t84325\t0.0008717060000000001\t84325.0\n22337\t-111.879915\t41.961565\tLewiston city\tUT\tUtah\tCache County\t2351\t25.3\t19.2\t7.0\t15879\t158791\t0.1476\t84320\tRomney\t84320\t0.005336929\t84320.0\n22338\t-112.050326\t41.920421999999995\tClarkston town\tUT\tUtah\tCache County\t951\t28.9\t17.9\t5.9\t15292\t140686\t0.1476\t84305\tRomney\t84305\t0.002158834\t84305.0\n22339\t-111.978788\t41.711175\tMendon city\tUT\tUtah\tCache County\t1276\t27.6\t37.5\t6.8\t20788\t244922\t0.1476\t84325\tRomney\t84325\t0.002896606\t84325.0\n22340\t-111.934999\t41.912105\tTrenton town\tUT\tUtah\tCache County\t521\t27.6\t24.9\t4.1\t14657\t172619\t0.1476\t84338\tRomney\t84338\t0.001182705\t84338.0\n22341\t-111.990425\t41.861031\tNewton town\tUT\tUtah\tCache County\t899\t28.1\t27.3\t6.0\t17935\t173256\t0.1476\t84327\tRomney\t84327\t0.002040791\t84327.0\n22342\t-111.89737\t41.855827000000005\tAmalga town\tUT\tUtah\tCache County\t476\t28.0\t27.2\t2.6\t13561\t176563\t0.1476\t84335\tRomney\t84335\t0.001080552\t84335.0\n22343\t-111.94115\t41.624429\tWellsville city\tUT\tUtah\tCache County\t3175\t27.7\t23.7\t5.8\t18576\t189695\t0.1476\t84339\tRomney\t84339\t0.007207465\t84339.0\n22344\t-112.005118\t41.830892\tCache CDP\tUT\tUtah\tCache County\t66\t28.0\t25.7\t5.9\t17925\t184375\t0.1476\t84304\tRomney\t84304\t0.000149824\t84304.0\n22345\t-111.815426\t41.798575\tHyde Park city\tUT\tUtah\tCache County\t3445\t25.8\t43.5\t6.3\t19218\t203409\t0.1476\t84318\tRomney\t84318\t0.007820383\t84318.0\n22346\t-111.813552\t41.703216999999995\tProvidence city\tUT\tUtah\tCache County\t6622\t27.3\t44.3\t5.0\t22891\t208006\t0.1476\t84332\tRomney\t84332\t0.015032388\t84332.0\n22347\t-111.819694\t41.685433\tMillville city\tUT\tUtah\tCache County\t1646\t25.4\t32.2\t5.5\t19146\t203774\t0.1476\t84326\tRomney\t84326\t0.003736531\t84326.0\n22348\t-111.838558\t41.741153999999995\tLogan city\tUT\tUtah\tCache County\t51862\t23.9\t37.9\t8.6\t17615\t165225\t0.1476\t84332\tRomney\t84332\t0.11773025\t84332.0\n22349\t-111.812789\t41.535887\tAvon CDP\tUT\tUtah\tCache County\t441\t28.0\t32.8\t4.5\t18392\t235938\t0.1476\t84328\tRomney\t84328\t0.0010011\t84328.0\n22350\t-111.80873700000001\t41.92029\tRichmond city\tUT\tUtah\tCache County\t2688\t28.7\t29.4\t6.6\t16554\t168697\t0.1476\t84333\tRomney\t84333\t0.006101942\t84333.0\n22351\t-111.841067\t41.670388\tNibley city\tUT\tUtah\tCache County\t3157\t26.7\t36.9\t6.2\t19725\t202249\t0.1476\t84326\tRomney\t84326\t0.007166604\t84326.0\n22352\t-111.954632\t41.972235\tCornish town\tUT\tUtah\tCache County\t330\t26.2\t20.0\t6.4\t16763\t168750\t0.1476\t84338\tRomney\t84338\t0.000749122\t84338.0\n22353\t-111.830269\t41.834732\tSmithfield city\tUT\tUtah\tCache County\t9698\t27.0\t30.0\t5.3\t18508\t188039\t0.1476\t84335\tRomney\t84335\t0.022015116\t84335.0\n22354\t-111.81986699999999\t41.722679\tRiver Heights city\tUT\tUtah\tCache County\t1589\t30.4\t52.5\t5.7\t26236\t219947\t0.1476\t84332\tRomney\t84332\t0.0036071379999999998\t84332.0\n22355\t-111.84544199999999\t41.632914\tHyrum city\tUT\tUtah\tCache County\t7953\t24.9\t25.5\t7.3\t18080\t166192\t0.1476\t84319\tRomney\t84319\t0.018053848\t84319.0\n22356\t-110.802449\t39.601855\tPrice city\tUT\tUtah\tCarbon County\t7998\t32.1\t15.1\t9.1\t19699\t115379\t0.3006\t84501\tRomney\t84501\t0.018156001\t84501.0\n22357\t-110.437547\t39.530066\tEast Carbon city\tUT\tUtah\tCarbon County\t1365\t42.7\t8.3\t13.6\t15020\t65282\t0.3006\t84520\tRomney\t84520\t0.003098642\t84520.0\n22358\t-110.859457\t39.690044\tHelper city\tUT\tUtah\tCarbon County\t1838\t40.2\t11.2\t11.4\t17589\t96037\t0.3006\t84529\tRomney\t84529\t0.004172384\t84529.0\n22359\t-110.402974\t39.55321\tSunnyside city\tUT\tUtah\tCarbon County\t396\t42.8\t8.4\t13.6\t15011\t65000\t0.3006\t84520\tRomney\t84520\t0.000898947\t84520.0\n22360\t-111.163918\t39.725083000000005\tScofield town\tUT\tUtah\tCarbon County\t31\t32.5\t20.0\t5.6\t21477\t200000\t0.3006\t84526\tRomney\t84526\t7.04e-05\t84526.0\n22361\t-110.741134\t39.544419\tWellington city\tUT\tUtah\tCarbon County\t1578\t32.1\t11.9\t12.6\t17373\t114015\t0.3006\t84542\tRomney\t84542\t0.0035821670000000003\t84542.0\n22362\t-109.721621\t40.9923\tManila town\tUT\tUtah\tDaggett County\t321\t40.9\t12.2\t8.6\t19863\t92500\t0.1808\t84046\tRomney\t84046\t0.000728692\t84046.0\n22363\t-112.063271\t41.138872\tClinton city\tUT\tUtah\tDavis County\t21125\t27.8\t24.7\t6.9\t22594\t184852\t0.1808\t84015\tRomney\t84015\t0.04795518\t84015.0\n22364\t-111.901821\t40.984967\tFarmington city\tUT\tUtah\tDavis County\t16630\t30.0\t45.0\t6.3\t30772\t280160\t0.1808\t84025\tRomney\t84025\t0.037751226\t84025.0\n22365\t-111.944422\t41.029637\tKaysville city\tUT\tUtah\tDavis County\t27127\t26.3\t41.9\t7.0\t24254\t236655\t0.1808\t84037\tRomney\t84037\t0.061580126\t84037.0\n22366\t-112.02391200000001\t41.102702\tClearfield city\tUT\tUtah\tDavis County\t30980\t25.2\t19.7\t9.3\t20800\t160699\t0.1808\t84056\tRomney\t84056\t0.07032669700000001\t84056.0\n22367\t-111.95998999999999\t41.078169\tLayton city\tUT\tUtah\tDavis County\t69373\t28.3\t30.1\t8.3\t25190\t194759\t0.1808\t84041\tRomney\t84041\t0.157481405\t84041.0\n22368\t-111.91568799999999\t40.873069\tWoods Cross city\tUT\tUtah\tDavis County\t9730\t27.5\t26.1\t6.5\t23090\t206403\t0.1808\t84087\tRomney\t84087\t0.022087759\t84087.0\n22369\t-111.86368999999999\t40.872212\tBountiful city\tUT\tUtah\tDavis County\t45740\t33.3\t40.2\t7.2\t30378\t257377\t0.1808\t84010\tRomney\t84010\t0.103832896\t84010.0\n22370\t-111.884542\t40.92837\tCenterville city\tUT\tUtah\tDavis County\t17683\t30.3\t41.1\t8.1\t26819\t259815\t0.1808\t84014\tRomney\t84014\t0.040141607\t84014.0\n22371\t-111.94048799999999\t41.133744\tSouth Weber city\tUT\tUtah\tDavis County\t6343\t28.2\t35.5\t7.9\t26912\t252622\t0.1808\t84405\tRomney\t84405\t0.014399038999999999\t84405.0\n22372\t-112.068572\t41.087634\tSyracuse city\tUT\tUtah\tDavis County\t19908\t27.2\t27.1\t6.1\t22735\t212659\t0.1808\t84075\tRomney\t84075\t0.045192507\t84075.0\n22373\t-111.90776799999999\t41.027685999999996\tFruit Heights city\tUT\tUtah\tDavis County\t5742\t35.8\t42.5\t6.6\t31398\t297037\t0.1808\t84037\tRomney\t84037\t0.013034728999999998\t84037.0\n22374\t-112.02902399999999\t41.13949\tSunset city\tUT\tUtah\tDavis County\t5469\t31.1\t12.3\t12.3\t22144\t140169\t0.1808\t84015\tRomney\t84015\t0.012415\t84015.0\n22375\t-111.91860700000001\t40.843994\tNorth Salt Lake city\tUT\tUtah\tDavis County\t13389\t31.4\t34.4\t7.1\t28039\t208925\t0.1808\t84054\tRomney\t84054\t0.030393936\t84054.0\n22376\t-111.90718100000001\t40.898123\tWest Bountiful city\tUT\tUtah\tDavis County\t5564\t29.8\t28.9\t6.5\t25302\t224742\t0.1808\t84087\tRomney\t84087\t0.012630657\t84087.0\n22377\t-112.099759\t41.122046999999995\tWest Point city\tUT\tUtah\tDavis County\t9219\t28.5\t23.2\t6.2\t24937\t217255\t0.1808\t84315\tRomney\t84315\t0.020927754\t84315.0\n22378\t-110.040342\t40.439388\tNeola CDP\tUT\tUtah\tDuchesne County\t590\t30.2\t14.9\t7.7\t15977\t128125\t0.0911\t84053\tRomney\t84053\t0.00133934\t84053.0\n22379\t-110.287148\t40.359145\tAltamont town\tUT\tUtah\tDuchesne County\t195\t31.4\t9.7\t8.7\t14471\t118750\t0.0911\t84001\tRomney\t84001\t0.00044266300000000004\t84001.0\n22380\t-110.00571200000002\t40.302186999999996\tRoosevelt city\tUT\tUtah\tDuchesne County\t5947\t25.8\t21.4\t11.1\t15016\t115458\t0.0911\t84066\tRomney\t84066\t0.013500093000000001\t84066.0\n22381\t-110.70945\t40.354259000000006\tTabiona town\tUT\tUtah\tDuchesne County\t172\t42.8\t8.8\t11.7\t13757\t130357\t0.0911\t84072\tRomney\t84072\t0.00039045199999999995\t84072.0\n22382\t-110.06255\t40.193156\tMyton city\tUT\tUtah\tDuchesne County\t601\t28.4\t8.1\t11.3\t12322\t95000\t0.0911\t84066\tRomney\t84066\t0.001364311\t84066.0\n22383\t-110.40101399999999\t40.165017\tDuchesne city\tUT\tUtah\tDuchesne County\t1565\t29.9\t13.6\t9.2\t15920\t112125\t0.0911\t84021\tRomney\t84021\t0.003552656\t84021.0\n22384\t-111.021778\t39.21942\tCastle Dale city\tUT\tUtah\tEmery County\t1633\t29.0\t19.0\t8.4\t18851\t107117\t0.1279\t84513\tRomney\t84513\t0.0037070209999999996\t84513.0\n22385\t-110.85561000000001\t39.349383\tCleveland town\tUT\tUtah\tEmery County\t507\t31.8\t10.7\t9.3\t15283\t111071\t0.1279\t84518\tRomney\t84518\t0.001150924\t84518.0\n22386\t-111.252475\t38.924977\tEmery town\tUT\tUtah\tEmery County\t308\t37.8\t13.9\t8.0\t19039\t94000\t0.1279\t84522\tRomney\t84522\t0.0006991810000000001\t84522.0\n22387\t-111.09810300000001\t39.131746\tClawson town\tUT\tUtah\tEmery County\t153\t37.5\t13.9\t8.1\t18802\t93750\t0.1279\t84523\tRomney\t84523\t0.00034732\t84523.0\n22388\t-110.96368899999999\t39.330653999999996\tHuntington city\tUT\tUtah\tEmery County\t2134\t29.3\t10.4\t8.1\t16088\t92083\t0.1279\t84528\tRomney\t84528\t0.0048443240000000005\t84528.0\n22389\t-111.13418600000001\t39.09069\tFerron city\tUT\tUtah\tEmery County\t1621\t37.2\t17.2\t10.9\t17582\t96548\t0.1279\t84523\tRomney\t84523\t0.00367978\t84523.0\n22390\t-111.059078\t39.230722\tOrangeville city\tUT\tUtah\tEmery County\t1402\t29.6\t15.0\t11.5\t17169\t109615\t0.1279\t84513\tRomney\t84513\t0.003182635\t84513.0\n22391\t-110.815234\t39.387566\tElmo town\tUT\tUtah\tEmery County\t373\t31.6\t7.5\t4.2\t16754\t115909\t0.1279\t84521\tRomney\t84521\t0.000846735\t84521.0\n22392\t-112.438725\t37.822828\tPanguitch city\tUT\tUtah\tGarfield County\t1783\t35.4\t20.3\t5.6\t16299\t119231\t0.1412\t84759\tRomney\t84759\t0.004047531\t84759.0\n22393\t-111.600902\t37.763756\tEscalante city\tUT\tUtah\tGarfield County\t898\t37.1\t25.7\t5.7\t16661\t137772\t0.1412\t84726\tRomney\t84726\t0.002038521\t84726.0\n22394\t-111.994957\t37.564203000000006\tHenrieville town\tUT\tUtah\tGarfield County\t175\t34.2\t27.9\t8.4\t16031\t118182\t0.1412\t84736\tRomney\t84736\t0.00039726199999999995\t84736.0\n22395\t-111.431699\t37.922715000000004\tBoulder town\tUT\tUtah\tGarfield County\t203\t34.5\t23.6\t6.3\t17254\t143750\t0.1412\t84726\tRomney\t84726\t0.00046082400000000003\t84726.0\n22396\t-112.434436\t37.651756\tHatch town\tUT\tUtah\tGarfield County\t140\t35.8\t21.1\t6.5\t16773\t125000\t0.1412\t84759\tRomney\t84759\t0.000317809\t84759.0\n22397\t-112.09030700000001\t37.630124\tTropic town\tUT\tUtah\tGarfield County\t560\t33.8\t27.5\t8.2\t16005\t118359\t0.1412\t84776\tRomney\t84776\t0.001271238\t84776.0\n22398\t-111.98321999999999\t38.101811\tAntimony town\tUT\tUtah\tGarfield County\t134\t34.3\t27.2\t8.5\t16062\t120313\t0.1412\t84712\tRomney\t84712\t0.000304189\t84712.0\n22399\t-112.051348\t37.564363\tCannonville town\tUT\tUtah\tGarfield County\t163\t33.9\t27.3\t8.1\t16016\t117500\t0.1412\t84718\tRomney\t84718\t0.000370021\t84718.0\n22400\t-109.396596\t38.632397\tCastle Valley town\tUT\tUtah\tGrand County\t386\t44.8\t38.1\t9.0\t24721\t172368\t0.4372\t84532\tRomney\t84532\t0.000876246\t84532.0\n22401\t-109.551965\t38.572365000000005\tMoab city\tUT\tUtah\tGrand County\t4771\t35.0\t23.9\t9.4\t20091\t136433\t0.4372\t84532\tRomney\t84532\t0.010830493\t84532.0\n22402\t-110.073917\t38.994915999999996\tGreen River city\tUT\tUtah\tGrand County\t1011\t31.3\t11.6\t5.5\t15566\t86800\t0.4372\t84525\tRomney\t84525\t0.0022950379999999997\t84525.0\n22403\t-113.18064299999999\t37.537838\tKanarraville town\tUT\tUtah\tIron County\t309\t29.1\t38.3\t8.0\t19633\t219318\t0.1286\t84757\tRomney\t84757\t0.0007014510000000001\t84757.0\n22404\t-112.84323\t37.697227000000005\tBrian Head town\tUT\tUtah\tIron County\t174\t42.0\t16.7\t9.3\t16849\t138462\t0.1286\t84719\tRomney\t84719\t0.000394992\t84719.0\n22405\t-112.77176999999999\t37.886255\tParagonah town\tUT\tUtah\tIron County\t682\t42.0\t17.3\t9.5\t16852\t136806\t0.1286\t84761\tRomney\t84761\t0.001548186\t84761.0\n22406\t-113.05540500000001\t37.759207\tEnoch city\tUT\tUtah\tIron County\t5572\t26.3\t25.8\t9.8\t17433\t148733\t0.1286\t84720\tRomney\t84720\t0.012648817\t84720.0\n22407\t-112.82746100000001\t37.832207000000004\tParowan city\tUT\tUtah\tIron County\t3754\t38.4\t22.1\t11.3\t16113\t154730\t0.1286\t84761\tRomney\t84761\t0.008521834\t84761.0\n22408\t-113.083249\t37.685226\tCedar City\tUT\tUtah\tIron County\t27034\t24.7\t29.6\t9.9\t17260\t178130\t0.1286\t84720\tRomney\t84720\t0.06136901\t84720.0\n22409\t-111.860817\t39.556562\tLevan town\tUT\tUtah\tJuab County\t1018\t30.1\t10.6\t8.5\t15068\t156845\t0.1135\t84639\tRomney\t84639\t0.0023109289999999998\t84639.0\n22410\t-111.857689\t39.815049\tMona town\tUT\tUtah\tJuab County\t969\t21.5\t21.4\t7.7\t13695\t186719\t0.1135\t84645\tRomney\t84645\t0.002199696\t84645.0\n22411\t-111.830955\t39.710807\tNephi city\tUT\tUtah\tJuab County\t5475\t27.9\t14.3\t6.5\t17353\t149117\t0.1135\t84648\tRomney\t84648\t0.012428621\t84648.0\n22412\t-112.11487\t39.958649\tEureka city\tUT\tUtah\tJuab County\t1129\t29.2\t9.4\t10.2\t18243\t89500\t0.1135\t84628\tRomney\t84628\t0.002562906\t84628.0\n22413\t-111.826582\t39.919296\tRocky Ridge town\tUT\tUtah\tJuab County\t459\t21.5\t21.5\t7.8\t13697\t187500\t0.1135\t84645\tRomney\t84645\t0.001041961\t84645.0\n22414\t-112.520967\t37.026205\tKanab city\tUT\tUtah\tKane County\t3723\t46.1\t27.7\t5.1\t19607\t142576\t0.2207\t84758\tRomney\t84758\t0.008451462\t84758.0\n22415\t-112.656617\t37.252982\tOrderville town\tUT\tUtah\tKane County\t773\t36.0\t17.2\t8.9\t14230\t118000\t0.2207\t84758\tRomney\t84758\t0.0017547620000000002\t84758.0\n22416\t-112.603324\t37.334158\tGlendale town\tUT\tUtah\tKane County\t458\t36.1\t17.0\t8.9\t14158\t117917\t0.2207\t84729\tRomney\t84729\t0.0010396910000000001\t84729.0\n22417\t-111.65821899999999\t37.071768\tBig Water town\tUT\tUtah\tKane County\t564\t43.7\t14.7\t6.6\t21113\t98125\t0.2207\t84741\tRomney\t84741\t0.0012803180000000001\t84741.0\n22418\t-112.484597\t37.439889\tAlton town\tUT\tUtah\tKane County\t179\t39.0\t27.7\t8.5\t19730\t187500\t0.2207\t84710\tRomney\t84710\t0.00040634199999999997\t84710.0\n22419\t-112.43783\t38.802531\tKanosh town\tUT\tUtah\tMillard County\t515\t36.0\t20.2\t4.2\t17247\t110870\t0.0858\t84631\tRomney\t84631\t0.001169085\t84631.0\n22420\t-112.396286\t39.509079\tLynndyl town\tUT\tUtah\tMillard County\t140\t27.5\t23.6\t6.0\t16623\t120833\t0.0858\t84640\tRomney\t84640\t0.000317809\t84640.0\n22421\t-112.566639\t39.354236\tDelta city\tUT\tUtah\tMillard County\t3413\t28.5\t21.1\t8.9\t16518\t104756\t0.0858\t84624\tRomney\t84624\t0.007747741\t84624.0\n22422\t-112.27053799999999\t39.099878000000004\tHolden town\tUT\tUtah\tMillard County\t427\t40.7\t19.3\t8.4\t16957\t105556\t0.0858\t84636\tRomney\t84636\t0.000969319\t84636.0\n22423\t-112.40656000000001\t38.886305\tMeadow town\tUT\tUtah\tMillard County\t270\t36.7\t20.6\t4.0\t17227\t107692\t0.0858\t84631\tRomney\t84631\t0.0006129180000000001\t84631.0\n22424\t-112.103601\t39.247856\tScipio town\tUT\tUtah\tMillard County\t310\t40.0\t19.5\t8.4\t16934\t107386\t0.0858\t84656\tRomney\t84656\t0.000703721\t84656.0\n22425\t-112.673709\t39.333433\tHinckley town\tUT\tUtah\tMillard County\t745\t33.6\t12.8\t8.1\t15780\t115714\t0.0858\t84650\tRomney\t84650\t0.0016912\t84650.0\n22426\t-112.33755900000001\t39.376022\tOak City town\tUT\tUtah\tMillard County\t681\t28.0\t24.0\t5.8\t16580\t120076\t0.0858\t84649\tRomney\t84649\t0.001545916\t84649.0\n22427\t-112.337878\t38.966404\tFillmore city\tUT\tUtah\tMillard County\t2506\t28.8\t17.3\t8.8\t15815\t120143\t0.0858\t84631\tRomney\t84631\t0.00568879\t84631.0\n22428\t-112.28548300000001\t39.531321999999996\tLeamington town\tUT\tUtah\tMillard County\t227\t28.4\t23.7\t5.5\t16604\t119231\t0.0858\t84638\tRomney\t84638\t0.000515305\t84638.0\n22429\t-111.68071599999999\t41.042199\tMorgan city\tUT\tUtah\tMorgan County\t3810\t29.8\t24.9\t8.4\t20276\t228695\t0.0877\t84050\tRomney\t84050\t0.008648958\t84050.0\n22430\t-112.26570900000002\t38.165976\tCircleville town\tUT\tUtah\tPiute County\t530\t42.7\t15.8\t9.5\t15035\t105000\t0.0946\t84723\tRomney\t84723\t0.001203136\t84723.0\n22431\t-112.17801599999999\t38.207005\tKingston town\tUT\tUtah\tPiute County\t144\t40.6\t14.0\t6.5\t16178\t108333\t0.0946\t84743\tRomney\t84743\t0.00032689\t84743.0\n22432\t-112.223653\t38.237666\tJunction town\tUT\tUtah\tPiute County\t186\t42.3\t16.1\t9.3\t15017\t107292\t0.0946\t84740\tRomney\t84740\t0.00042223300000000005\t84740.0\n22433\t-112.261652\t38.440288\tMarysvale town\tUT\tUtah\tPiute County\t386\t39.5\t13.8\t6.1\t16194\t104167\t0.0946\t84750\tRomney\t84750\t0.000876246\t84750.0\n22434\t-111.18502\t41.664234\tRandolph city\tUT\tUtah\tRich County\t579\t32.1\t18.9\t5.8\t15972\t90417\t0.0824\t84064\tRomney\t84064\t0.001314369\t84064.0\n22435\t-111.408253\t41.931813\tGarden City town\tUT\tUtah\tRich County\t457\t44.3\t29.5\t6.2\t24448\t157292\t0.0824\t84028\tRomney\t84028\t0.001037421\t84028.0\n22436\t-111.431018\t41.888675\tGarden CDP\tUT\tUtah\tRich County\t114\t45.0\t29.1\t6.3\t24453\t157143\t0.0824\t84028\tRomney\t84028\t0.000258788\t84028.0\n22437\t-111.324901\t41.822326000000004\tLaketown town\tUT\tUtah\tRich County\t240\t44.7\t29.3\t6.0\t24449\t156818\t0.0824\t84038\tRomney\t84038\t0.0005448159999999999\t84038.0\n22438\t-111.16304199999999\t41.522614000000004\tWoodruff town\tUT\tUtah\tRich County\t231\t29.6\t21.7\t2.7\t15633\t106875\t0.0824\t84064\tRomney\t84064\t0.000524386\t84064.0\n22439\t-111.821923\t40.687955\tEast Millcreek CDP\tUT\tUtah\tSalt Lake County\t21878\t38.9\t47.8\t6.2\t31140\t289214\t0.3828\t84124\tRomney\t84124\t0.049664541\t84124.0\n22440\t-111.930575\t40.777642\tSalt Lake City\tUT\tUtah\tSalt Lake County\t192872\t31.6\t37.0\t9.3\t25783\t209272\t0.3828\t84116\tRomney\t84116\t0.43783249399999996\t84116.0\n22441\t-112.00088600000001\t40.601473999999996\tWest Jordan city\tUT\tUtah\tSalt Lake County\t90724\t26.9\t23.6\t7.2\t22773\t208842\t0.3828\t84088\tRomney\t84088\t0.20594962\t84088.0\n22442\t-111.803633\t40.567832\tGranite CDP\tUT\tUtah\tSalt Lake County\t2146\t36.4\t57.0\t4.3\t46981\t493548\t0.3828\t84092\tRomney\t84092\t0.004871565\t84092.0\n22443\t-111.821396\t40.705375\tCanyon Rim CDP\tUT\tUtah\tSalt Lake County\t10611\t36.1\t42.5\t7.1\t29740\t237748\t0.3828\t84109\tRomney\t84109\t0.024087688\t84109.0\n22444\t-111.895474\t40.651368\tMurray city\tUT\tUtah\tSalt Lake County\t36555\t32.5\t28.2\t8.4\t26582\t208630\t0.3828\t84107\tRomney\t84107\t0.08298232400000001\t84107.0\n22445\t-111.62284199999999\t40.580282000000004\tAlta town\tUT\tUtah\tSalt Lake County\t407\t37.1\t54.5\t4.9\t51967\t536765\t0.3828\t84049\tRomney\t84049\t0.000923918\t84049.0\n22446\t-111.82530200000001\t40.505387\tDraper city\tUT\tUtah\tSalt Lake County\t41218\t29.8\t36.8\t4.5\t31519\t350183\t0.3828\t84020\tRomney\t84020\t0.09356765\t84020.0\n22447\t-111.976653\t40.556785999999995\tSouth Jordan city\tUT\tUtah\tSalt Lake County\t50610\t29.4\t32.3\t5.8\t25911\t284009\t0.3828\t84095\tRomney\t84095\t0.114888125\t84095.0\n22448\t-111.94865\t40.657243\tTaylorsville city\tUT\tUtah\tSalt Lake County\t60464\t30.2\t20.0\t7.9\t23876\t184755\t0.3828\t84123\tRomney\t84123\t0.137257372\t84123.0\n22449\t-112.087556\t40.702927\tMagna CDP\tUT\tUtah\tSalt Lake County\t26721\t27.0\t12.2\t9.8\t20079\t153552\t0.3828\t84044\tRomney\t84044\t0.060658479\t84044.0\n22450\t-111.898648\t40.705684000000005\tSouth Salt Lake city\tUT\tUtah\tSalt Lake County\t22952\t29.4\t14.7\t9.5\t20290\t153087\t0.3828\t84115\tRomney\t84115\t0.052102592999999996\t84115.0\n22451\t-112.02336299999999\t40.499103000000005\tHerriman town\tUT\tUtah\tSalt Lake County\t15619\t29.6\t29.4\t5.7\t23285\t242091\t0.3828\t84065\tRomney\t84065\t0.035456187\t84065.0\n22452\t-111.85073999999999\t40.647171\tCottonwood West CDP\tUT\tUtah\tSalt Lake County\t19333\t40.2\t38.6\t7.7\t34263\t241101\t0.3828\t84117\tRomney\t84117\t0.043887218\t84117.0\n22453\t-111.95381200000001\t40.475558\tBluffdale city\tUT\tUtah\tSalt Lake County\t7959\t29.3\t24.8\t5.1\t23860\t352663\t0.3828\t84065\tRomney\t84065\t0.018067469\t84065.0\n22454\t-111.96431299999999\t40.517337\tRiverton city\tUT\tUtah\tSalt Lake County\t40825\t27.0\t26.7\t5.4\t23765\t247819\t0.3828\t84065\tRomney\t84065\t0.092675513\t84065.0\n22455\t-111.86316200000002\t40.570718\tWhite City CDP\tUT\tUtah\tSalt Lake County\t6016\t31.7\t24.2\t7.3\t23211\t180600\t0.3828\t84094\tRomney\t84094\t0.013656726999999999\t84094.0\n22456\t-111.81645900000001\t40.596061999999996\tLittle Cottonwood Creek Valley CDP\tUT\tUtah\tSalt Lake County\t7613\t36.4\t52.2\t4.3\t41798\t361019\t0.3828\t84093\tRomney\t84093\t0.017282025\t84093.0\n22457\t-112.02472\t40.629682\tOquirrh CDP\tUT\tUtah\tSalt Lake County\t16006\t24.6\t23.9\t6.9\t20215\t186588\t0.3828\t84118\tRomney\t84118\t0.036334702999999996\t84118.0\n22458\t-111.86618600000001\t40.683289\tMillcreek CDP\tUT\tUtah\tSalt Lake County\t31399\t33.0\t29.9\t8.6\t26535\t208169\t0.3828\t84106\tRomney\t84106\t0.071277855\t84106.0\n22459\t-112.01256000000001\t40.688355\tWest Valley City\tUT\tUtah\tSalt Lake County\t123633\t28.8\t13.0\t9.2\t20436\t169568\t0.3828\t84120\tRomney\t84120\t0.280655278\t84120.0\n22460\t-111.81203700000002\t40.611627\tCottonwood Heights CDP\tUT\tUtah\tSalt Lake County\t28357\t35.4\t45.8\t6.0\t34202\t273976\t0.3828\t84121\tRomney\t84121\t0.064372309\t84121.0\n22461\t-111.891525\t40.615332\tMidvale city\tUT\tUtah\tSalt Lake County\t30275\t30.5\t23.2\t8.6\t23554\t190552\t0.3828\t84047\tRomney\t84047\t0.068726299\t84047.0\n22462\t-111.85308\t40.570170000000005\tSandy city\tUT\tUtah\tSalt Lake County\t94749\t32.0\t37.6\t6.3\t29620\t249817\t0.3828\t84094\tRomney\t84094\t0.215086643\t84094.0\n22463\t-111.81782199999999\t40.652383\tHolladay city\tUT\tUtah\tSalt Lake County\t14963\t39.2\t50.3\t5.8\t39720\t373048\t0.3828\t84117\tRomney\t84117\t0.033967023\t84117.0\n22464\t-112.00950300000001\t40.651921\tKearns CDP\tUT\tUtah\tSalt Lake County\t37142\t27.5\t11.7\t9.0\t18482\t159363\t0.3828\t84118\tRomney\t84118\t0.08431485400000001\t84118.0\n22465\t-111.78889299999999\t40.683046000000004\tMount Olympus CDP\tUT\tUtah\tSalt Lake County\t7167\t47.4\t63.8\t6.8\t50856\t377347\t0.3828\t84109\tRomney\t84109\t0.016269575\t84109.0\n22466\t-110.793497\t37.047128\tNavajo Mountain CDP\tUT\tUtah\tSan Juan County\t418\t24.4\t10.2\t19.1\t8885\t35000\t0.4031\t86044\tRomney\t86044\t0.000948888\t86044.0\n22467\t-110.251476\t37.030586\tOljato-Monument Valley CDP\tUT\tUtah\tSan Juan County\t955\t22.8\t8.2\t26.7\t9167\t30192\t0.4031\t84536\tRomney\t84536\t0.002167915\t84536.0\n22468\t-109.336776\t37.871271\tMonticello city\tUT\tUtah\tSan Juan County\t2117\t29.8\t24.0\t7.7\t16992\t131863\t0.4031\t84535\tRomney\t84535\t0.0048057329999999995\t84535.0\n22469\t-109.460104\t37.459598\tWhite Mesa CDP\tUT\tUtah\tSan Juan County\t297\t32.1\t27.6\t17.8\t18181\t72500\t0.4031\t84511\tRomney\t84511\t0.00067421\t84511.0\n22470\t-109.42086699999999\t38.47423\tSpanish Valley CDP\tUT\tUtah\tSan Juan County\t201\t33.3\t18.3\t4.3\t18450\t146875\t0.4031\t84532\tRomney\t84532\t0.000456284\t84532.0\n22471\t-109.56995\t37.291326\tBluff CDP\tUT\tUtah\tSan Juan County\t343\t32.0\t27.9\t17.6\t18191\t72143\t0.4031\t84512\tRomney\t84512\t0.000778633\t84512.0\n22472\t-109.263605\t38.302459000000006\tLa Sal CDP\tUT\tUtah\tSan Juan County\t376\t33.4\t18.7\t4.6\t18473\t143750\t0.4031\t84530\tRomney\t84530\t0.000853545\t84530.0\n22473\t-109.30304\t37.256138\tMontezuma Creek CDP\tUT\tUtah\tSan Juan County\t561\t23.7\t4.9\t35.8\t8403\t21563\t0.4031\t84534\tRomney\t84534\t0.001273508\t84534.0\n22474\t-109.91358899999999\t37.131158\tHalchita CDP\tUT\tUtah\tSan Juan County\t298\t23.1\t8.0\t26.8\t9179\t31250\t0.4031\t84531\tRomney\t84531\t0.00067648\t84531.0\n22475\t-109.873423\t37.173089000000004\tMexican Hat CDP\tUT\tUtah\tSan Juan County\t94\t31.7\t27.6\t17.3\t18252\t75000\t0.4031\t84531\tRomney\t84531\t0.00021338599999999998\t84531.0\n22476\t-110.68275700000001\t37.457648999999996\tHalls Crossing CDP\tUT\tUtah\tSan Juan County\t95\t32.5\t27.6\t17.3\t18260\t77500\t0.4031\t860HH\tRomney\t860HH\t0.000215656\t0.0\n22477\t-109.60881499999999\t37.210122999999996\tTselakai Dezza CDP\tUT\tUtah\tSan Juan County\t114\t24.8\t1.8\t44.4\t10461\t21250\t0.4031\t84512\tRomney\t84512\t0.000258788\t84512.0\n22478\t-109.162894\t37.205239\tAneth CDP\tUT\tUtah\tSan Juan County\t662\t23.4\t5.1\t34.8\t8111\t21111\t0.4031\t84510\tRomney\t84510\t0.001502785\t84510.0\n22479\t-109.480626\t37.622361\tBlanding city\tUT\tUtah\tSan Juan County\t3211\t26.4\t24.6\t10.9\t14816\t118087\t0.4031\t84511\tRomney\t84511\t0.007289187\t84511.0\n22480\t-111.813336\t39.156821\tGunnison city\tUT\tUtah\tSanpete County\t2939\t33.4\t16.7\t7.0\t16761\t137260\t0.1027\t84622\tRomney\t84622\t0.006671729\t84622.0\n22481\t-111.492052\t39.479776\tSpring City\tUT\tUtah\tSanpete County\t1153\t33.4\t24.3\t10.5\t16033\t164706\t0.1027\t84662\tRomney\t84662\t0.002617388\t84662.0\n22482\t-111.437996\t39.629886\tFairview city\tUT\tUtah\tSanpete County\t1208\t35.6\t20.4\t11.8\t16383\t142778\t0.1027\t84629\tRomney\t84629\t0.002742242\t84629.0\n22483\t-111.63594199999999\t39.486055\tWales town\tUT\tUtah\tSanpete County\t268\t27.5\t11.7\t8.9\t14394\t134375\t0.1027\t84667\tRomney\t84667\t0.000608378\t84667.0\n22484\t-111.637625\t39.265996\tManti city\tUT\tUtah\tSanpete County\t3278\t26.3\t24.2\t7.7\t14825\t145471\t0.1027\t84642\tRomney\t84642\t0.007441282\t84642.0\n22485\t-111.708027\t39.118602\tMayfield town\tUT\tUtah\tSanpete County\t496\t33.8\t19.0\t8.3\t17551\t169643\t0.1027\t84643\tRomney\t84643\t0.001125954\t84643.0\n22486\t-111.455652\t39.540708\tMount Pleasant city\tUT\tUtah\tSanpete County\t2922\t29.2\t20.4\t8.7\t16958\t151053\t0.1027\t84647\tRomney\t84647\t0.006633138\t84647.0\n22487\t-111.58233899999999\t39.527082\tMoroni city\tUT\tUtah\tSanpete County\t1473\t32.0\t15.7\t8.6\t16184\t128893\t0.1027\t84646\tRomney\t84646\t0.00334381\t84646.0\n22488\t-111.818937\t39.127435999999996\tCenterfield town\tUT\tUtah\tSanpete County\t1257\t28.5\t9.6\t9.9\t13380\t132452\t0.1027\t84622\tRomney\t84622\t0.002853475\t84622.0\n22489\t-111.690979\t39.193815\tSterling town\tUT\tUtah\tSanpete County\t277\t33.8\t19.4\t8.5\t17586\t167857\t0.1027\t84643\tRomney\t84643\t0.000628809\t84643.0\n22490\t-111.854267\t39.225408\tFayette town\tUT\tUtah\tSanpete County\t240\t31.9\t10.4\t9.0\t12759\t160417\t0.1027\t84634\tRomney\t84634\t0.0005448159999999999\t84634.0\n22491\t-111.581849\t39.357104\tEphraim city\tUT\tUtah\tSanpete County\t5973\t21.1\t31.1\t11.2\t13423\t161725\t0.1027\t84627\tRomney\t84627\t0.013559113999999999\t84627.0\n22492\t-111.64031200000001\t39.628095\tFountain Green city\tUT\tUtah\tSanpete County\t1156\t27.7\t12.0\t9.2\t14406\t133681\t0.1027\t84632\tRomney\t84632\t0.002624198\t84632.0\n22493\t-112.05816999999999\t38.706699\tAnnabella town\tUT\tUtah\tSevier County\t669\t34.4\t18.0\t7.9\t16534\t143581\t0.0915\t84711\tRomney\t84711\t0.001518675\t84711.0\n22494\t-112.149304\t38.682459\tElsinore town\tUT\tUtah\tSevier County\t877\t31.3\t8.9\t6.4\t14992\t116311\t0.0915\t84724\tRomney\t84724\t0.001990849\t84724.0\n22495\t-111.86719\t39.005779\tRedmond town\tUT\tUtah\tSevier County\t766\t27.3\t21.7\t11.2\t19060\t126875\t0.0915\t84621\tRomney\t84621\t0.001738872\t84621.0\n22496\t-111.9337\t38.919672\tAurora city\tUT\tUtah\tSevier County\t1034\t34.4\t13.1\t10.4\t17971\t137689\t0.0915\t84620\tRomney\t84620\t0.00234725\t84620.0\n22497\t-112.11958200000001\t38.623153\tMonroe city\tUT\tUtah\tSevier County\t2337\t36.9\t20.1\t10.6\t15536\t132440\t0.0915\t84724\tRomney\t84724\t0.005305148000000001\t84724.0\n22498\t-111.987587\t38.762438\tGlenwood town\tUT\tUtah\tSevier County\t485\t34.4\t18.1\t7.7\t16528\t143750\t0.0915\t84730\tRomney\t84730\t0.001100983\t84730.0\n22499\t-111.967251\t38.859977\tSigurd town\tUT\tUtah\tSevier County\t429\t33.7\t18.3\t7.4\t16249\t128125\t0.0915\t84657\tRomney\t84657\t0.000973859\t84657.0\n22500\t-112.21988300000001\t38.624913\tJoseph town\tUT\tUtah\tSevier County\t306\t29.5\t16.2\t10.2\t14241\t138636\t0.0915\t84739\tRomney\t84739\t0.0006946410000000001\t84739.0\n22501\t-111.881271\t38.510815\tKoosharem town\tUT\tUtah\tSevier County\t275\t33.8\t18.5\t6.9\t16248\t128409\t0.0915\t84744\tRomney\t84744\t0.000624269\t84744.0\n22502\t-111.866906\t38.936505\tSalina city\tUT\tUtah\tSevier County\t2485\t29.7\t13.0\t10.6\t15672\t130398\t0.0915\t84620\tRomney\t84620\t0.0056411180000000005\t84620.0\n22503\t-112.093246\t38.765576\tRichfield city\tUT\tUtah\tSevier County\t7438\t29.7\t20.2\t8.8\t18031\t133829\t0.0915\t84701\tRomney\t84701\t0.016884763\t84701.0\n22504\t-111.27790900000001\t40.610821\tFrancis town\tUT\tUtah\tSummit County\t1189\t34.6\t24.8\t6.5\t23486\t252778\t0.4616\t84036\tRomney\t84036\t0.00269911\t84036.0\n22505\t-111.512621\t40.758638\tNorth Snyderville Basin CDP\tUT\tUtah\tSummit County\t2240\t32.7\t59.2\t4.5\t40383\t415541\t0.4616\t84098\tRomney\t84098\t0.005084952\t84098.0\n22506\t-111.597904\t40.757290000000005\tSummit Park CDP\tUT\tUtah\tSummit County\t7938\t36.3\t63.2\t5.0\t47445\t494986\t0.4616\t84098\tRomney\t84098\t0.018019797\t84098.0\n22507\t-111.242677\t40.631643\tSamak CDP\tUT\tUtah\tSummit County\t193\t34.5\t24.6\t7.1\t23396\t250000\t0.4616\t84036\tRomney\t84036\t0.000438123\t84036.0\n22508\t-111.27328600000001\t40.64297\tKamas city\tUT\tUtah\tSummit County\t1683\t32.1\t19.2\t7.0\t23969\t179762\t0.4616\t84036\tRomney\t84036\t0.003820524\t84036.0\n22509\t-111.395459\t40.918064\tCoalville city\tUT\tUtah\tSummit County\t1895\t31.1\t20.2\t6.7\t20890\t139080\t0.4616\t84017\tRomney\t84017\t0.004301778\t84017.0\n22510\t-111.482284\t40.657754\tPark City\tUT\tUtah\tSummit County\t9597\t35.1\t56.1\t5.8\t45745\t553998\t0.4616\t84060\tRomney\t84060\t0.02178584\t84060.0\n22511\t-111.507977\t40.701372\tSouth Snyderville Basin CDP\tUT\tUtah\tSummit County\t4934\t39.4\t66.1\t4.3\t48088\t480249\t0.4616\t84098\tRomney\t84098\t0.011200513999999998\t84098.0\n22512\t-111.49388700000002\t41.018842\tHenefer town\tUT\tUtah\tSummit County\t823\t33.1\t30.2\t6.3\t23531\t193750\t0.4616\t84033\tRomney\t84033\t0.0018682660000000002\t84033.0\n22513\t-111.236209\t40.584294\tWoodland CDP\tUT\tUtah\tSummit County\t484\t34.9\t25.0\t6.5\t23488\t250000\t0.4616\t84036\tRomney\t84036\t0.001098713\t84036.0\n22514\t-111.27760900000001\t40.726053\tOakley city\tUT\tUtah\tSummit County\t1439\t33.4\t34.8\t5.8\t24926\t258929\t0.4616\t84061\tRomney\t84061\t0.0032666270000000002\t84061.0\n22515\t-112.32413700000001\t40.60147\tErda CDP\tUT\tUtah\tTooele County\t4060\t27.2\t21.4\t5.1\t24976\t247000\t0.2349\t84074\tRomney\t84074\t0.009216475\t84074.0\n22516\t-112.314076\t40.542477000000005\tTooele city\tUT\tUtah\tTooele County\t30246\t28.0\t17.0\t9.6\t21536\t180551\t0.2349\t84074\tRomney\t84074\t0.068660467\t84074.0\n22517\t-114.02704399999999\t40.726649\tWendover city\tUT\tUtah\tTooele County\t2465\t23.8\t9.8\t15.8\t11977\t50000\t0.2349\t84083\tRomney\t84083\t0.005595716999999999\t84083.0\n22518\t-112.465751\t40.596846\tGrantsville city\tUT\tUtah\tTooele County\t10374\t29.3\t16.8\t9.0\t21082\t187775\t0.2349\t84074\tRomney\t84074\t0.023549682000000002\t84074.0\n22519\t-112.36306\t40.454188\tStockton town\tUT\tUtah\tTooele County\t734\t33.2\t9.8\t9.9\t20560\t136397\t0.2349\t84071\tRomney\t84071\t0.00166623\t84071.0\n22520\t-112.754129\t40.230688\tDugway CDP\tUT\tUtah\tTooele County\t2403\t20.6\t22.2\t12.5\t21431\t112500\t0.2349\t84022\tRomney\t84022\t0.005454973\t84022.0\n22521\t-112.446446\t40.094358\tVernon town\tUT\tUtah\tTooele County\t325\t38.8\t11.6\t8.0\t20597\t182813\t0.2349\t84080\tRomney\t84080\t0.0007377719999999999\t84080.0\n22522\t-112.450404\t40.361512\tRush Valley town\tUT\tUtah\tTooele County\t797\t38.5\t11.7\t8.2\t20601\t181579\t0.2349\t84069\tRomney\t84069\t0.001809244\t84069.0\n22523\t-112.257241\t40.368718\tOphir town\tUT\tUtah\tTooele County\t36\t38.8\t12.5\t6.3\t20580\t212500\t0.2349\t84071\tRomney\t84071\t8.170000000000001e-05\t84071.0\n22524\t-112.301548\t40.639261\tStansbury Park CDP\tUT\tUtah\tTooele County\t4016\t28.0\t37.0\t7.8\t28483\t266481\t0.2349\t84074\tRomney\t84074\t0.009116592\t84074.0\n22525\t-109.491091\t40.431868\tNaples city\tUT\tUtah\tUintah County\t1691\t31.0\t13.6\t7.1\t17547\t118977\t0.0861\t84078\tRomney\t84078\t0.003838684\t84078.0\n22526\t-109.876585\t40.281052\tFort Duchesne CDP\tUT\tUtah\tUintah County\t818\t27.4\t6.7\t19.3\t10605\t91818\t0.0861\t84026\tRomney\t84026\t0.001856915\t84026.0\n22527\t-109.949757\t40.294977\tBallard town\tUT\tUtah\tUintah County\t728\t31.8\t14.5\t3.3\t16677\t112821\t0.0861\t84066\tRomney\t84066\t0.001652609\t84066.0\n22528\t-109.537751\t40.451684\tVernal city\tUT\tUtah\tUintah County\t9238\t28.9\t17.5\t7.6\t17917\t119957\t0.0861\t84078\tRomney\t84078\t0.020970885\t84078.0\n22529\t-109.83058\t40.22671\tRandlett CDP\tUT\tUtah\tUintah County\t301\t35.5\t10.3\t15.1\t12036\t69167\t0.0861\t84026\tRomney\t84026\t0.00068329\t84026.0\n22530\t-109.57861899999999\t40.47177\tMaeser CDP\tUT\tUtah\tUintah County\t3183\t32.7\t23.1\t9.7\t19330\t149435\t0.0861\t84078\tRomney\t84078\t0.007225625\t84078.0\n22531\t-109.941042\t40.47215\tWhiterocks CDP\tUT\tUtah\tUintah County\t466\t26.9\t5.8\t40.5\t7485\t63000\t0.0861\t84085\tRomney\t84085\t0.001057852\t84085.0\n22532\t-111.772874\t40.461919\tAlpine city\tUT\tUtah\tUtah County\t10093\t24.0\t48.0\t6.6\t26461\t403916\t0.0972\t84004\tRomney\t84004\t0.022911793\t84004.0\n22533\t-111.73871000000001\t40.094507\tBenjamin CDP\tUT\tUtah\tUtah County\t1294\t30.2\t26.6\t7.8\t19167\t238672\t0.0972\t84651\tRomney\t84651\t0.002937468\t84651.0\n22534\t-111.750368\t40.002435999999996\tSpring Lake CDP\tUT\tUtah\tUtah County\t642\t27.2\t17.6\t5.8\t19182\t246552\t0.0972\t84651\tRomney\t84651\t0.0014573829999999998\t84651.0\n22535\t-111.74820600000001\t40.132518\tLake Shore CDP\tUT\tUtah\tUtah County\t971\t30.6\t25.8\t5.9\t21857\t217553\t0.0972\t84660\tRomney\t84660\t0.002204236\t84660.0\n22536\t-111.65014199999999\t40.014784999999996\tWoodland Hills town\tUT\tUtah\tUtah County\t1519\t28.6\t44.6\t6.9\t28195\t395000\t0.0972\t84653\tRomney\t84653\t0.0034482329999999998\t84653.0\n22537\t-111.79256000000001\t40.384008\tAmerican Fork city\tUT\tUtah\tUtah County\t26582\t26.6\t32.1\t9.5\t21413\t213636\t0.0972\t84003\tRomney\t84003\t0.060342939000000005\t84003.0\n22538\t-111.900926\t39.952201\tGoshen town\tUT\tUtah\tUtah County\t1159\t25.8\t9.5\t11.9\t17731\t117073\t0.0972\t84633\tRomney\t84633\t0.002631008\t84633.0\n22539\t-111.793745\t40.423491999999996\tHighland city\tUT\tUtah\tUtah County\t13488\t25.8\t47.4\t6.6\t22795\t330171\t0.0972\t84003\tRomney\t84003\t0.030618673\t84003.0\n22540\t-111.67821599999999\t40.056451\tSalem city\tUT\tUtah\tUtah County\t6660\t26.3\t28.3\t7.3\t19894\t217685\t0.0972\t84653\tRomney\t84653\t0.015118651\t84653.0\n22541\t-111.717874\t40.3415\tLindon city\tUT\tUtah\tUtah County\t10591\t23.9\t36.3\t9.7\t20997\t305300\t0.0972\t84042\tRomney\t84042\t0.024042287000000002\t84042.0\n22542\t-111.869522\t40.415208\tLehi city\tUT\tUtah\tUtah County\t40343\t25.9\t34.4\t6.4\t20884\t216354\t0.0972\t84043\tRomney\t84043\t0.09158134\t84043.0\n22543\t-111.57499399999999\t40.124966\tMapleton city\tUT\tUtah\tUtah County\t7416\t28.4\t30.7\t5.3\t21682\t280643\t0.0972\t84664\tRomney\t84664\t0.016834822\t84664.0\n22544\t-111.74886200000002\t40.309671\tVineyard town\tUT\tUtah\tUtah County\t386\t23.4\t26.6\t4.8\t20659\t198295\t0.0972\t84057\tRomney\t84057\t0.000876246\t84057.0\n22545\t-111.955785\t39.973976\tElberta CDP\tUT\tUtah\tUtah County\t353\t24.3\t17.9\t9.9\t15217\t187500\t0.0972\t84626\tRomney\t84626\t0.0008013339999999999\t84626.0\n22546\t-111.69948400000001\t40.298821000000004\tOrem city\tUT\tUtah\tUtah County\t98019\t24.6\t39.6\t9.3\t21206\t206923\t0.0972\t84057\tRomney\t84057\t0.222509764\t84057.0\n22547\t-111.695633\t40.144583000000004\tPalmyra CDP\tUT\tUtah\tUtah County\t617\t31.7\t24.5\t4.1\t21412\t193750\t0.0972\t84660\tRomney\t84660\t0.0014006320000000002\t84660.0\n22548\t-112.005137\t40.310549\tEagle Mountain town\tUT\tUtah\tUtah County\t19477\t29.2\t35.2\t5.8\t18032\t226505\t0.0972\t84013\tRomney\t84013\t0.044214107999999995\t84013.0\n22549\t-111.729766\t40.032595\tPayson city\tUT\tUtah\tUtah County\t18378\t26.1\t20.9\t8.3\t18762\t171913\t0.0972\t84651\tRomney\t84651\t0.041719304\t84651.0\n22550\t-111.678195\t40.007532\tElk Ridge town\tUT\tUtah\tUtah County\t2720\t23.9\t43.7\t9.5\t21799\t278734\t0.0972\t84653\tRomney\t84653\t0.006174584\t84653.0\n22551\t-111.764742\t40.407998\tCedar Hills town\tUT\tUtah\tUtah County\t7170\t25.0\t45.5\t5.4\t19157\t290940\t0.0972\t84003\tRomney\t84003\t0.016276385\t84003.0\n22552\t-111.614158\t40.161766\tSpringville city\tUT\tUtah\tUtah County\t30317\t26.7\t32.7\t7.4\t20251\t194212\t0.0972\t84663\tRomney\t84663\t0.068821642\t84663.0\n22553\t-111.740202\t40.371082\tPleasant Grove city\tUT\tUtah\tUtah County\t34208\t26.2\t32.8\t7.7\t20246\t222931\t0.0972\t84062\tRomney\t84062\t0.077654475\t84062.0\n22554\t-111.78251000000002\t39.973766\tSantaquin city\tUT\tUtah\tUtah County\t6753\t25.1\t15.5\t9.0\t18216\t182047\t0.0972\t84651\tRomney\t84651\t0.015329767\t84651.0\n22555\t-111.786273\t40.061735999999996\tWest Mountain CDP\tUT\tUtah\tUtah County\t1207\t28.6\t25.7\t8.7\t17236\t205469\t0.0972\t84655\tRomney\t84655\t0.0027399720000000002\t84655.0\n22556\t-111.64411000000001\t40.24637\tProvo city\tUT\tUtah\tUtah County\t128047\t23.0\t39.6\t9.9\t17241\t201372\t0.0972\t84606\tRomney\t84606\t0.290675356\t84606.0\n22557\t-111.899243\t40.322853\tSaratoga Springs town\tUT\tUtah\tUtah County\t8641\t31.2\t43.8\t5.2\t21626\t223377\t0.0972\t84043\tRomney\t84043\t0.019615655\t84043.0\n22558\t-111.848098\t40.009189\tGenola town\tUT\tUtah\tUtah County\t1226\t24.5\t17.8\t9.8\t15209\t189773\t0.0972\t84655\tRomney\t84655\t0.002783103\t84655.0\n22559\t-112.098353\t40.327408\tCedar Fort town\tUT\tUtah\tUtah County\t400\t25.1\t18.9\t6.5\t17101\t206000\t0.0972\t84013\tRomney\t84013\t0.0009080269999999999\t84013.0\n22560\t-111.638572\t40.107295\tSpanish Fork city\tUT\tUtah\tUtah County\t32352\t25.4\t28.5\t7.4\t19567\t199874\t0.0972\t84660\tRomney\t84660\t0.07344123\t84660.0\n22561\t-111.422141\t40.387976\tWallsburg town\tUT\tUtah\tWasatch County\t285\t32.2\t19.5\t7.9\t23923\t327778\t0.2285\t84082\tRomney\t84082\t0.0006469690000000001\t84082.0\n22562\t-111.24946899999999\t40.475055\tTimber Lakes CDP\tUT\tUtah\tWasatch County\t307\t31.4\t33.9\t9.5\t26559\t381250\t0.2285\t84032\tRomney\t84032\t0.000696911\t84032.0\n22563\t-111.415869\t40.471361\tDaniel CDP\tUT\tUtah\tWasatch County\t1159\t32.5\t19.5\t7.9\t23921\t327848\t0.2285\t84032\tRomney\t84032\t0.002631008\t84032.0\n22564\t-111.412999\t40.50356\tHeber city\tUT\tUtah\tWasatch County\t9477\t28.1\t27.6\t9.0\t21547\t246834\t0.2285\t84032\tRomney\t84032\t0.021513431\t84032.0\n22565\t-111.46666499999999\t40.465914\tCharleston town\tUT\tUtah\tWasatch County\t309\t38.6\t37.1\t8.1\t29974\t379167\t0.2285\t84049\tRomney\t84049\t0.0007014510000000001\t84049.0\n22566\t-111.47719099999999\t40.51826\tMidway city\tUT\tUtah\tWasatch County\t3923\t35.5\t35.4\t7.7\t25123\t314011\t0.2285\t84049\tRomney\t84049\t0.008905475999999999\t84049.0\n22567\t-113.30859199999999\t37.48045\tNew Harmony town\tUT\tUtah\tWashington County\t197\t46.1\t36.5\t13.6\t19232\t250000\t0.1544\t84757\tRomney\t84757\t0.000447203\t84757.0\n22568\t-113.291299\t37.255133\tToquerville town\tUT\tUtah\tWashington County\t1235\t38.4\t23.8\t10.5\t16395\t201136\t0.1544\t84774\tRomney\t84774\t0.0028035340000000003\t84774.0\n22569\t-113.356872\t37.238601\tLeeds town\tUT\tUtah\tWashington County\t775\t54.1\t23.6\t11.7\t20958\t154942\t0.1544\t84774\tRomney\t84774\t0.0017593020000000001\t84774.0\n22570\t-113.20608899999999\t37.195838\tVirgin town\tUT\tUtah\tWashington County\t673\t46.3\t24.9\t9.0\t21350\t239706\t0.1544\t84745\tRomney\t84745\t0.0015277560000000001\t84745.0\n22571\t-113.65550800000001\t37.128929\tSanta Clara city\tUT\tUtah\tWashington County\t7698\t27.9\t30.5\t7.0\t19532\t222241\t0.1544\t84765\tRomney\t84765\t0.017474981\t84765.0\n22572\t-113.00517099999999\t37.181548\tSpringdale town\tUT\tUtah\tWashington County\t836\t46.3\t24.8\t8.9\t21351\t242708\t0.1544\t84779\tRomney\t84779\t0.001897777\t84779.0\n22573\t-113.241501\t37.231878\tLa Verkin city\tUT\tUtah\tWashington County\t4445\t29.2\t15.9\t12.9\t14616\t146632\t0.1544\t84745\tRomney\t84745\t0.010090451\t84745.0\n22574\t-113.490925\t37.131164\tWashington city\tUT\tUtah\tWashington County\t15987\t33.3\t23.7\t8.7\t16456\t147593\t0.1544\t84780\tRomney\t84780\t0.036291572\t84780.0\n22575\t-113.346695\t37.168454\tHurricane city\tUT\tUtah\tWashington County\t13978\t33.1\t21.3\t11.1\t16780\t156293\t0.1544\t84745\tRomney\t84745\t0.031731006\t84745.0\n22576\t-113.680341\t37.174481\tIvins town\tUT\tUtah\tWashington County\t7885\t33.3\t23.7\t10.4\t19828\t169460\t0.1544\t84738\tRomney\t84738\t0.017899484\t84738.0\n22577\t-113.00514299999999\t37.00932\tHildale city\tUT\tUtah\tWashington County\t2968\t15.1\t14.1\t9.9\t7289\t147115\t0.1544\t84737\tRomney\t84737\t0.0067375609999999996\t84737.0\n22578\t-113.71111299999998\t37.566396000000005\tEnterprise city\tUT\tUtah\tWashington County\t2171\t33.0\t12.0\t4.7\t14483\t140854\t0.1544\t84725\tRomney\t84725\t0.004928317\t84725.0\n22579\t-113.57596399999998\t37.073752\tSt. George city\tUT\tUtah\tWashington County\t76987\t34.4\t25.3\t10.7\t20947\t194544\t0.1544\t84790\tRomney\t84790\t0.17476570100000002\t84790.0\n22580\t-113.054703\t37.147639\tRockville town\tUT\tUtah\tWashington County\t417\t46.3\t24.8\t8.7\t21352\t238462\t0.1544\t84779\tRomney\t84779\t0.000946618\t84779.0\n22581\t-111.64538\t38.40341\tLoa town\tUT\tUtah\tWayne County\t567\t29.3\t19.4\t3.0\t15280\t124688\t0.162\t84747\tRomney\t84747\t0.001287128\t84747.0\n22582\t-111.58941200000001\t38.396661\tLyman town\tUT\tUtah\tWayne County\t253\t29.5\t19.3\t3.0\t15265\t124306\t0.162\t84749\tRomney\t84749\t0.000574327\t84749.0\n22583\t-111.545503\t38.341894\tBicknell town\tUT\tUtah\tWayne County\t380\t43.3\t29.5\t6.6\t20038\t153409\t0.162\t84715\tRomney\t84715\t0.000862626\t84715.0\n22584\t-111.42133000000001\t38.301079\tTorrey town\tUT\tUtah\tWayne County\t184\t43.5\t29.5\t6.3\t20043\t154167\t0.162\t84773\tRomney\t84773\t0.00041769199999999994\t84773.0\n22585\t-111.98633400000001\t41.284285\tHarrisville city\tUT\tUtah\tWeber County\t5423\t29.9\t24.3\t6.8\t21131\t159787\t0.2614\t84404\tRomney\t84404\t0.012310577\t84404.0\n22586\t-112.053785\t41.208007\tWest Haven city\tUT\tUtah\tWeber County\t9526\t31.0\t20.0\t7.5\t23083\t189862\t0.2614\t84067\tRomney\t84067\t0.021624665\t84067.0\n22587\t-112.04736799999999\t41.171367\tRoy city\tUT\tUtah\tWeber County\t37248\t30.3\t19.0\t8.5\t24181\t161579\t0.2614\t84067\tRomney\t84067\t0.084555481\t84067.0\n22588\t-112.037208\t41.262679\tMarriott-Slaterville city\tUT\tUtah\tWeber County\t1666\t40.0\t17.5\t6.0\t21898\t164063\t0.2614\t84404\tRomney\t84404\t0.003781933\t84404.0\n22589\t-111.95834599999999\t41.311528\tNorth Ogden city\tUT\tUtah\tWeber County\t18278\t31.1\t34.1\t8.3\t24656\t195191\t0.2614\t84414\tRomney\t84414\t0.041492297000000004\t84414.0\n22590\t-111.978477\t41.169175\tWashington Terrace city\tUT\tUtah\tWeber County\t8716\t32.6\t18.9\t10.5\t22324\t146000\t0.2614\t84405\tRomney\t84405\t0.01978591\t84405.0\n22591\t-112.00231200000002\t41.173487\tRiverdale city\tUT\tUtah\tWeber County\t8488\t31.3\t16.5\t9.4\t24264\t167363\t0.2614\t84405\tRomney\t84405\t0.019268333999999998\t84405.0\n22592\t-111.93220500000001\t41.143229999999996\tUintah town\tUT\tUtah\tWeber County\t1301\t35.9\t23.3\t7.5\t24579\t207303\t0.2614\t84405\tRomney\t84405\t0.0029533579999999997\t84405.0\n22593\t-111.96773999999999\t41.228028\tOgden city\tUT\tUtah\tWeber County\t85195\t30.4\t19.7\t13.2\t19651\t137052\t0.2614\t84401\tRomney\t84401\t0.19339841600000002\t84401.0\n22594\t-112.001407\t41.325078000000005\tPleasant View city\tUT\tUtah\tWeber County\t6459\t33.0\t33.5\t9.5\t26048\t206362\t0.2614\t84414\tRomney\t84414\t0.014662366999999999\t84414.0\n22595\t-112.031683\t41.300989\tFarr West city\tUT\tUtah\tWeber County\t5512\t37.8\t19.3\t5.9\t21158\t173889\t0.2614\t84404\tRomney\t84404\t0.012512613\t84404.0\n22596\t-112.074798\t41.297964\tPlain City\tUT\tUtah\tWeber County\t4772\t32.3\t20.4\t5.7\t21965\t184035\t0.2614\t84404\tRomney\t84404\t0.010832763\t84404.0\n22597\t-112.125079\t41.174799\tHooper CDP\tUT\tUtah\tWeber County\t5152\t33.7\t21.4\t7.3\t24284\t208915\t0.2614\t84315\tRomney\t84315\t0.011695388999999999\t84315.0\n22598\t-111.956829\t41.171721999999995\tSouth Ogden city\tUT\tUtah\tWeber County\t16395\t36.1\t34.1\t8.0\t26600\t183439\t0.2614\t84405\tRomney\t84405\t0.03721776\t84405.0\n22599\t-111.77391000000001\t41.259626000000004\tHuntsville town\tUT\tUtah\tWeber County\t748\t37.4\t40.5\t8.8\t22092\t277174\t0.2614\t84317\tRomney\t84317\t0.0016980110000000001\t84317.0\n22600\t-73.25568\t44.167021000000005\tVergennes city\tVT\tVermont\tAddison County\t2847\t33.3\t25.0\t7.3\t22861\t170559\t0.6844\t5456\tObama\t05456\t0.039844559\t5456.0\n22601\t-73.158049\t44.007658\tMiddlebury CDP\tVT\tVermont\tAddison County\t6233\t25.0\t48.6\t6.3\t24925\t236675\t0.6844\t5753\tObama\t05753\t0.08723257400000001\t5753.0\n22602\t-73.24150300000001\t42.923849\tNorth Bennington village\tVT\tVermont\tBennington County\t1384\t30.8\t31.1\t7.5\t19819\t192500\t0.6545\t5257\tObama\t05257\t0.019369466000000002\t5257.0\n22603\t-73.20311\t42.940864000000005\tSouth Shaftsbury CDP\tVT\tVermont\tBennington County\t839\t42.8\t32.0\t5.5\t25465\t208203\t0.6545\t5257\tObama\t05257\t0.011742039\t5257.0\n22604\t-73.214885\t42.884634000000005\tOld Bennington village\tVT\tVermont\tBennington County\t251\t48.0\t46.1\t6.5\t34146\t264063\t0.6545\t5201\tObama\t05201\t0.003512815\t5201.0\n22605\t-73.185287\t42.874596000000004\tBennington CDP\tVT\tVermont\tBennington County\t8712\t43.2\t23.2\t7.7\t24041\t171281\t0.6545\t5201\tObama\t05201\t0.12192687\t5201.0\n22606\t-73.036263\t43.182078999999995\tManchester Center CDP\tVT\tVermont\tBennington County\t2051\t47.3\t43.4\t4.6\t33207\t331356\t0.6545\t5255\tObama\t05255\t0.028704317000000003\t5255.0\n22607\t-73.1471\t43.069134000000005\tArlington CDP\tVT\tVermont\tBennington County\t1148\t45.0\t29.3\t5.3\t23174\t220690\t0.6545\t5250\tObama\t05250\t0.01606658\t5250.0\n22608\t-73.071264\t43.160999\tManchester village\tVT\tVermont\tBennington County\t596\t48.9\t51.6\t4.8\t41857\t391026\t0.6545\t5254\tObama\t05254\t0.008341186\t5254.0\n22609\t-72.011622\t44.428957000000004\tSt. Johnsbury CDP\tVT\tVermont\tCaledonia County\t6085\t41.7\t24.2\t6.3\t23434\t147597\t0.5997\t058HH\tObama\t058HH\t0.085161272\t0.0\n22610\t-71.979159\t44.643674\tWest Burke village\tVT\tVermont\tCaledonia County\t389\t37.7\t28.3\t7.0\t28264\t159559\t0.5997\t5871\tObama\t05871\t0.0054441640000000005\t5871.0\n22611\t-72.001887\t44.534775\tLyndonville village\tVT\tVermont\tCaledonia County\t1265\t40.8\t23.2\t10.1\t19159\t131633\t0.5997\t5851\tObama\t05851\t0.017704028\t5851.0\n22612\t-73.184133\t44.494888\tWinooski city\tVT\tVermont\tChittenden County\t6605\t35.3\t27.3\t10.3\t23888\t202047\t0.6957\t5404\tObama\t05404\t0.09243881699999999\t5404.0\n22613\t-73.113558\t44.490268\tEssex Junction village\tVT\tVermont\tChittenden County\t9181\t38.1\t43.7\t7.1\t33546\t236495\t0.6957\t5452\tObama\t05452\t0.128490656\t5452.0\n22614\t-73.231461\t44.487497\tBurlington city\tVT\tVermont\tChittenden County\t39296\t29.8\t47.8\t7.8\t25841\t227468\t0.6957\t5401\tObama\t05401\t0.549958481\t5401.0\n22615\t-73.27166700000001\t44.461921999999994\tSouth Burlington city\tVT\tVermont\tChittenden County\t18049\t38.2\t52.6\t5.1\t35993\t242922\t0.6957\t5401\tObama\t05401\t0.252600789\t5401.0\n22616\t-73.112875\t44.638166999999996\tMilton village\tVT\tVermont\tChittenden County\t1692\t36.7\t24.7\t6.7\t24248\t207904\t0.6957\t5468\tObama\t05468\t0.023680012\t5468.0\n22617\t-72.98774\t44.504991\tJericho village\tVT\tVermont\tChittenden County\t1531\t40.1\t49.0\t4.1\t34603\t222963\t0.6957\t5465\tObama\t05465\t0.021426772\t5465.0\n22618\t-71.885951\t44.812611\tIsland Pond CDP\tVT\tVermont\tEssex County\t781\t44.2\t14.7\t11.2\t18851\t113851\t0.55\t5846\tObama\t05846\t0.010930313\t5846.0\n22619\t-72.80261800000001\t44.908479\tEnosburg Falls village\tVT\tVermont\tFranklin County\t1599\t41.8\t11.6\t5.3\t17866\t153017\t0.6062\t5450\tObama\t05450\t0.022378451\t5450.0\n22620\t-73.084866\t44.811591\tSt. Albans city\tVT\tVermont\tFranklin County\t7551\t36.8\t23.9\t5.3\t24124\t188766\t0.6062\t5478\tObama\t05478\t0.10567835099999999\t5478.0\n22621\t-73.11997099999999\t44.921388\tSwanton village\tVT\tVermont\tFranklin County\t2593\t39.1\t18.0\t8.7\t22737\t181336\t0.6062\t5488\tObama\t05488\t0.036289758\t5488.0\n22622\t-73.302627\t44.976228000000006\tAlburg village\tVT\tVermont\tGrand Isle County\t511\t42.7\t16.1\t5.3\t20625\t187500\t0.6211\t5440\tObama\t05440\t0.007151588\t5440.0\n22623\t-72.67774\t44.636344\tJohnson village\tVT\tVermont\tLamoille County\t1572\t28.8\t33.0\t7.1\t22024\t150852\t0.6983\t5656\tObama\t05656\t0.022000578\t5656.0\n22624\t-72.878846\t44.63897\tCambridge village\tVT\tVermont\tLamoille County\t264\t39.9\t36.5\t5.8\t25514\t230556\t0.6983\t5444\tObama\t05444\t0.003694754\t5444.0\n22625\t-72.611815\t44.595874\tHyde Park village\tVT\tVermont\tLamoille County\t447\t41.3\t29.2\t8.2\t24964\t161875\t0.6983\t5655\tObama\t05655\t0.00625589\t5655.0\n22626\t-72.59383299999999\t44.55856\tMorrisville village\tVT\tVermont\tLamoille County\t2146\t43.9\t29.0\t5.8\t24685\t196642\t0.6983\t5661\tObama\t05661\t0.030033868999999998\t5661.0\n22627\t-72.828419\t44.642494\tJeffersonville village\tVT\tVermont\tLamoille County\t637\t40.0\t36.8\t5.7\t25563\t228191\t0.6983\t5464\tObama\t05464\t0.008914993000000001\t5464.0\n22628\t-72.061285\t44.153421\tWells River village\tVT\tVermont\tOrange County\t305\t47.7\t30.2\t6.8\t23584\t180682\t0.6458\t5081\tObama\t05081\t0.00426856\t5081.0\n22629\t-72.126364\t43.995638\tBradford village\tVT\tVermont\tOrange County\t824\t40.8\t21.2\t8.3\t26039\t170098\t0.6458\t5033\tObama\t05033\t0.01153211\t5033.0\n22630\t-72.060292\t44.080982\tNewbury village\tVT\tVermont\tOrange County\t386\t45.3\t31.7\t5.9\t20574\t177273\t0.6458\t5051\tObama\t05051\t0.0054021780000000005\t5051.0\n22631\t-72.380728\t44.729499\tAlbany village\tVT\tVermont\tOrleans County\t155\t42.0\t17.9\t7.4\t18094\t146429\t0.6087\t5820\tObama\t05820\t0.002169268\t5820.0\n22632\t-72.135539\t44.954271000000006\tDerby Center village\tVT\tVermont\tOrleans County\t679\t41.6\t20.5\t8.7\t21860\t188542\t0.6087\t5829\tObama\t05829\t0.009502794\t5829.0\n22633\t-72.103723\t45.000797\tDerby Line village\tVT\tVermont\tOrleans County\t830\t41.8\t26.6\t4.3\t23895\t148311\t0.6087\t5830\tObama\t05830\t0.011616082\t5830.0\n22634\t-72.201847\t44.810714000000004\tOrleans village\tVT\tVermont\tOrleans County\t836\t46.3\t14.0\t6.6\t16847\t139688\t0.6087\t5860\tObama\t05860\t0.011700053\t5860.0\n22635\t-72.175818\t44.747578999999995\tBarton village\tVT\tVermont\tOrleans County\t820\t43.8\t19.8\t10.2\t18043\t150000\t0.6087\t5822\tObama\t05822\t0.011476129\t5822.0\n22636\t-72.40437800000001\t44.996331\tNorth Troy village\tVT\tVermont\tOrleans County\t643\t39.0\t12.8\t7.0\t18291\t126339\t0.6087\t5859\tObama\t05859\t0.008998964\t5859.0\n22637\t-72.209212\t44.937864000000005\tNewport city\tVT\tVermont\tOrleans County\t5000\t42.6\t18.9\t11.3\t21557\t152574\t0.6087\t5855\tObama\t05855\t0.069976395\t5855.0\n22638\t-72.967516\t43.474866\tWallingford CDP\tVT\tVermont\tRutland County\t877\t46.3\t26.3\t6.2\t26938\t169792\t0.5973\t5773\tObama\t05773\t0.01227386\t5773.0\n22639\t-72.978115\t43.60902\tRutland city\tVT\tVermont\tRutland County\t16563\t42.6\t26.0\t8.8\t24176\t164037\t0.5973\t5701\tObama\t05701\t0.231803805\t5701.0\n22640\t-73.235899\t43.517852000000005\tPoultney village\tVT\tVermont\tRutland County\t1550\t31.3\t26.1\t9.3\t17777\t156055\t0.5973\t5764\tObama\t05764\t0.021692682\t5764.0\n22641\t-73.084202\t43.800954\tBrandon CDP\tVT\tVermont\tRutland County\t1712\t44.4\t30.4\t10.7\t29952\t173633\t0.5973\t5733\tObama\t05733\t0.023959917999999997\t5733.0\n22642\t-73.268206\t43.593236\tFair Haven CDP\tVT\tVermont\tRutland County\t2839\t39.8\t22.7\t9.8\t22805\t139313\t0.5973\t5750\tObama\t05750\t0.039732597\t5750.0\n22643\t-73.044452\t43.596369\tWest Rutland CDP\tVT\tVermont\tRutland County\t2216\t43.7\t19.5\t9.1\t20238\t163086\t0.5973\t5777\tObama\t05777\t0.031013537999999997\t5777.0\n22644\t-72.65570500000001\t44.152621999999994\tNorthfield village\tVT\tVermont\tWashington County\t3085\t28.0\t35.3\t6.0\t24251\t178323\t0.6944\t5663\tObama\t05663\t0.043175435\t5663.0\n22645\t-72.50355400000001\t44.164117\tSouth Barre CDP\tVT\tVermont\tWashington County\t1246\t43.3\t21.7\t4.5\t27889\t176179\t0.6944\t5641\tObama\t05641\t0.017438118\t5641.0\n22646\t-72.743303\t44.343438\tWaterbury village\tVT\tVermont\tWashington County\t1775\t38.6\t34.9\t8.6\t28969\t193319\t0.6944\t5676\tObama\t05676\t0.02484162\t5676.0\n22647\t-72.351615\t44.35188\tMarshfield village\tVT\tVermont\tWashington County\t266\t41.9\t39.1\t7.3\t22496\t168056\t0.6944\t5658\tObama\t05658\t0.003722744\t5658.0\n22648\t-72.571929\t44.266051000000004\tMontpelier city\tVT\tVermont\tWashington County\t7835\t42.7\t51.6\t5.4\t29364\t194492\t0.6944\t5602\tObama\t05602\t0.10965301\t5602.0\n22649\t-72.311313\t44.404746\tCabot village\tVT\tVermont\tWashington County\t267\t41.9\t33.9\t5.5\t23026\t178846\t0.6944\t5647\tObama\t05647\t0.003736739\t5647.0\n22650\t-72.469504\t44.15508\tGraniteville-East Barre CDP\tVT\tVermont\tWashington County\t2144\t41.6\t16.4\t6.0\t28280\t152574\t0.6944\t5678\tObama\t05678\t0.030005878\t5678.0\n22651\t-72.508737\t44.199668\tBarre city\tVT\tVermont\tWashington County\t9021\t41.0\t21.0\t7.1\t24657\t162219\t0.6944\t5641\tObama\t05641\t0.126251411\t5641.0\n22652\t-72.454764\t43.134245\tBellows Falls village\tVT\tVermont\tWindham County\t2991\t38.6\t14.4\t10.5\t22697\t150586\t0.7305\t5101\tObama\t05101\t0.041859878999999996\t5101.0\n22653\t-72.819304\t42.797717999999996\tJacksonville village\tVT\tVermont\tWindham County\t253\t42.2\t16.9\t6.7\t23743\t185938\t0.7305\t5342\tObama\t05342\t0.0035408059999999996\t5342.0\n22654\t-72.45506\t43.073925\tWestminster village\tVT\tVermont\tWindham County\t258\t43.0\t22.0\t6.0\t20878\t167708\t0.7305\t5158\tObama\t05158\t0.0036107820000000003\t5158.0\n22655\t-72.569884\t42.863237\tBrattleboro CDP\tVT\tVermont\tWindham County\t8098\t40.9\t34.7\t8.4\t26846\t187871\t0.7305\t5301\tObama\t05301\t0.113333769\t5301.0\n22656\t-72.61439399999999\t42.852101\tWest Brattleboro CDP\tVT\tVermont\tWindham County\t2980\t47.0\t35.9\t4.9\t30499\t189205\t0.7305\t5301\tObama\t05301\t0.041705931\t5301.0\n22657\t-72.455676\t43.120994\tNorth Westminster village\tVT\tVermont\tWindham County\t253\t43.0\t21.9\t6.2\t20908\t168182\t0.7305\t5158\tObama\t05158\t0.0035408059999999996\t5158.0\n22658\t-72.654764\t42.987693\tNewfane village\tVT\tVermont\tWindham County\t115\t43.9\t41.7\t7.5\t24446\t195000\t0.7305\t5345\tObama\t05345\t0.0016094570000000001\t5345.0\n22659\t-72.510335\t43.139057\tSaxtons River village\tVT\tVermont\tWindham County\t474\t45.4\t29.1\t3.1\t27164\t173333\t0.7305\t5154\tObama\t05154\t0.006633762\t5154.0\n22660\t-72.476444\t43.288996000000004\tSpringfield CDP\tVT\tVermont\tWindsor County\t3683\t42.0\t17.1\t6.4\t23619\t143394\t0.6793\t5156\tObama\t05156\t0.051544612000000004\t5156.0\n22661\t-72.51608399999999\t43.371185\tPerkinsville village\tVT\tVermont\tWindsor County\t145\t45.9\t31.1\t8.5\t27548\t189286\t0.6793\t5151\tObama\t05151\t0.002029315\t5151.0\n22662\t-72.59361700000001\t43.26474\tChester-Chester Depot CDP\tVT\tVermont\tWindsor County\t964\t45.8\t28.8\t5.7\t22894\t222283\t0.6793\t5143\tObama\t05143\t0.013491448999999999\t5143.0\n22663\t-72.310789\t43.673093\tWilder CDP\tVT\tVermont\tWindsor County\t1575\t42.2\t35.1\t5.8\t31619\t204027\t0.6793\t5088\tObama\t05088\t0.022042564\t5088.0\n22664\t-72.517578\t43.625797999999996\tWoodstock village\tVT\tVermont\tWindsor County\t963\t51.0\t53.6\t5.8\t38046\t388571\t0.6793\t5091\tObama\t05091\t0.013477454\t5091.0\n22665\t-72.324005\t43.649528000000004\tWhite River Junction CDP\tVT\tVermont\tWindsor County\t2504\t40.9\t22.1\t8.9\t24637\t186328\t0.6793\t5088\tObama\t05088\t0.035044177999999995\t5088.0\n22666\t-72.69682399999999\t43.397059999999996\tLudlow village\tVT\tVermont\tWindsor County\t973\t44.4\t27.6\t7.6\t23897\t215625\t0.6793\t5149\tObama\t05149\t0.013617406\t5149.0\n22667\t-75.667488\t37.719661\tAccomac town\tVA\tVirginia\tAccomack County\t538\t39.4\t26.4\t6.2\t17933\t139583\t0.4769\t23301\tObama\t23301\t0.0014888660000000001\t23301.0\n22668\t-75.824917\t37.557123\tBelle Haven town\tVA\tVirginia\tAccomack County\t468\t44.3\t16.6\t17.3\t16001\t127976\t0.4769\t23306\tObama\t23306\t0.001295147\t23306.0\n22669\t-75.718328\t37.691708\tOnley town\tVA\tVirginia\tAccomack County\t487\t45.3\t20.1\t8.1\t19670\t149537\t0.4769\t23418\tObama\t23418\t0.0013477279999999999\t23418.0\n22670\t-75.992414\t37.824607\tTangier town\tVA\tVirginia\tAccomack County\t659\t46.3\t7.7\t11.9\t20491\t93519\t0.4769\t23440\tObama\t23440\t0.001823722\t23440.0\n22671\t-75.764082\t37.621297\tKeller town\tVA\tVirginia\tAccomack County\t170\t40.5\t15.8\t6.0\t14227\t86250\t0.4769\t23401\tObama\t23401\t0.00047046\t23401.0\n22672\t-75.743499\t37.710134000000004\tOnancock town\tVA\tVirginia\tAccomack County\t1462\t49.5\t25.3\t10.7\t19420\t136898\t0.4769\t23417\tObama\t23417\t0.004045952\t23417.0\n22673\t-75.653975\t37.786421999999995\tParksley town\tVA\tVirginia\tAccomack County\t814\t44.4\t17.8\t9.6\t18745\t114535\t0.4769\t23421\tObama\t23421\t0.002252671\t23421.0\n22674\t-75.740825\t37.649108\tMelfa town\tVA\tVirginia\tAccomack County\t447\t38.2\t8.7\t12.6\t16555\t113043\t0.4769\t23410\tObama\t23410\t0.0012370319999999999\t23410.0\n22675\t-75.78380899999999\t37.585208\tPainter town\tVA\tVirginia\tAccomack County\t243\t40.0\t11.4\t9.8\t15768\t103750\t0.4769\t23420\tObama\t23420\t0.00067248\t23420.0\n22676\t-75.722409\t37.925897\tSaxis town\tVA\tVirginia\tAccomack County\t322\t48.4\t10.8\t5.9\t18793\t72727\t0.4769\t23427\tObama\t23427\t0.000891106\t23427.0\n22677\t-75.689595\t37.606107\tWachapreague town\tVA\tVirginia\tAccomack County\t227\t46.9\t21.6\t4.8\t21769\t114423\t0.4769\t23480\tObama\t23480\t0.000628202\t23480.0\n22678\t-75.589578\t37.877446\tHallwood town\tVA\tVirginia\tAccomack County\t286\t39.7\t8.0\t7.7\t15355\t88333\t0.4769\t23359\tObama\t23359\t0.000791479\t23359.0\n22679\t-75.62110600000001\t37.829507\tBloxom town\tVA\tVirginia\tAccomack County\t396\t41.2\t8.4\t7.3\t13392\t76500\t0.4769\t23308\tObama\t23308\t0.001095894\t23308.0\n22680\t-75.36274399999999\t37.934498\tChincoteague town\tVA\tVirginia\tAccomack County\t4248\t51.2\t18.9\t8.2\t22885\t157935\t0.4769\t23336\tObama\t23336\t0.011755953000000001\t23336.0\n22681\t-78.48727099999999\t37.806699\tScottsville town\tVA\tVirginia\tAlbemarle County\t574\t41.7\t26.8\t4.3\t25012\t176250\t0.552\t24590\tObama\t24590\t0.0015884929999999998\t24590.0\n22682\t-78.69906800000001\t38.069976000000004\tCrozet CDP\tVA\tVirginia\tAlbemarle County\t4083\t42.0\t36.8\t5.8\t26968\t186765\t0.552\t22932\tObama\t22932\t0.01129933\t22932.0\n22683\t-79.79038299999999\t37.798584999999996\tIron Gate town\tVA\tVirginia\tAlleghany County\t368\t47.8\t10.1\t6.9\t18532\t79444\t0.4744\t24448\tObama\t24448\t0.0010184060000000001\t24448.0\n22684\t-79.851451\t37.80259\tSelma CDP\tVA\tVirginia\tAlleghany County\t439\t45.4\t10.2\t13.1\t23404\t84444\t0.4744\t24474\tObama\t24474\t0.001214892\t24474.0\n22685\t-79.869272\t37.79396\tLow Moor CDP\tVA\tVirginia\tAlleghany County\t337\t44.8\t11.1\t11.8\t23644\t92143\t0.4744\t24457\tObama\t24457\t0.000932617\t24457.0\n22686\t-79.105795\t37.448676\tMadison Heights CDP\tVA\tVirginia\tAmherst County\t11662\t42.5\t11.8\t9.7\t19796\t136591\t0.3941\t24572\tObama\t24572\t0.032273522\t24572.0\n22687\t-79.050842\t37.581451\tAmherst town\tVA\tVirginia\tAmherst County\t2337\t30.1\t29.5\t10.6\t22209\t160825\t0.3941\t24595\tObama\t24595\t0.006467435\t24595.0\n22688\t-78.677356\t37.26421\tPamplin City town\tVA\tVirginia\tAppomattox County\t217\t43.0\t17.0\t10.2\t19426\t109615\t0.3091\t23958\tObama\t23958\t0.000600528\t23958.0\n22689\t-78.826677\t37.358645\tAppomattox town\tVA\tVirginia\tAppomattox County\t2099\t43.6\t13.8\t7.9\t19117\t140441\t0.3091\t24522\tObama\t24522\t0.005808791\t24522.0\n22690\t-77.100948\t38.878623\tArlington CDP\tVA\tVirginia\tArlington County\t215842\t36.4\t68.4\t5.7\t47808\t412919\t0.691\t22201\tObama\t22201\t0.597323064\t22201.0\n22691\t-78.849485\t38.102957\tDooms CDP\tVA\tVirginia\tAugusta County\t1323\t45.2\t7.8\t12.2\t21370\t136775\t0.2807\t22980\tObama\t22980\t0.003661282\t22980.0\n22692\t-79.030919\t38.02447\tStuarts Draft CDP\tVA\tVirginia\tAugusta County\t9069\t39.3\t16.7\t5.8\t23249\t164623\t0.2807\t24477\tObama\t24477\t0.025097631000000002\t24477.0\n22693\t-79.010343\t38.195141\tVerona CDP\tVA\tVirginia\tAugusta County\t3713\t42.0\t16.0\t5.9\t24620\t152957\t0.2807\t24482\tObama\t24482\t0.010275389000000001\t24482.0\n22694\t-79.067408\t38.114168\tJolivue CDP\tVA\tVirginia\tAugusta County\t1223\t47.3\t25.1\t10.4\t25095\t161719\t0.2807\t24401\tObama\t24401\t0.0033845409999999996\t24401.0\n22695\t-78.96912900000001\t38.100476\tFishersville CDP\tVA\tVirginia\tAugusta County\t6495\t43.8\t24.0\t7.0\t25099\t220449\t0.2807\t22939\tObama\t22939\t0.017974321\t22939.0\n22696\t-79.385719\t38.083009000000004\tCraigsville town\tVA\tVirginia\tAugusta County\t1002\t39.8\t7.9\t6.3\t16632\t97258\t0.2807\t24430\tObama\t24430\t0.0027729440000000003\t24430.0\n22697\t-78.95158599999999\t38.022033\tLyndhurst CDP\tVA\tVirginia\tAugusta County\t1648\t40.0\t20.3\t4.7\t24011\t168810\t0.2807\t22952\tObama\t22952\t0.00456069\t22952.0\n22698\t-79.152315\t38.003598\tGreenville CDP\tVA\tVirginia\tAugusta County\t966\t44.4\t9.1\t7.0\t20387\t126316\t0.2807\t24440\tObama\t24440\t0.002673317\t24440.0\n22699\t-78.911517\t38.283498\tWeyers Cave CDP\tVA\tVirginia\tAugusta County\t1934\t40.1\t27.6\t4.6\t19725\t197098\t0.2807\t24486\tObama\t24486\t0.005352169\t24486.0\n22700\t-78.944565\t37.988726\tSherando CDP\tVA\tVirginia\tAugusta County\t672\t41.6\t22.4\t4.7\t24372\t169643\t0.2807\t22952\tObama\t22952\t0.001859699\t22952.0\n22701\t-78.841219\t38.161729\tCrimora CDP\tVA\tVirginia\tAugusta County\t2161\t40.6\t7.8\t10.3\t22278\t102016\t0.2807\t24431\tObama\t24431\t0.005980371\t24431.0\n22702\t-79.281286\t37.374194\tForest CDP\tVA\tVirginia\tBedford County\t8880\t40.8\t42.2\t7.3\t31587\t213225\t0.2728\t24551\tObama\t24551\t0.024574591\t24551.0\n22703\t-79.905649\t37.356497999999995\tCloverdale CDP\tVA\tVirginia\tBotetourt County\t3133\t43.7\t28.7\t6.1\t26207\t227469\t0.2989\t24077\tObama\t24077\t0.008670292\t24077.0\n22704\t-79.879042\t37.415433\tTroutville town\tVA\tVirginia\tBotetourt County\t470\t45.3\t19.0\t6.9\t21851\t155208\t0.2989\t24175\tObama\t24175\t0.001300682\t24175.0\n22705\t-79.875367\t37.499037\tFincastle town\tVA\tVirginia\tBotetourt County\t382\t46.4\t23.2\t6.8\t23505\t197727\t0.2989\t24090\tObama\t24090\t0.00105715\t24090.0\n22706\t-79.688232\t37.52214\tBuchanan town\tVA\tVirginia\tBotetourt County\t1296\t44.8\t12.5\t7.2\t20948\t123837\t0.2989\t24066\tObama\t24066\t0.003586562\t24066.0\n22707\t-79.853554\t37.363038\tLaymantown CDP\tVA\tVirginia\tBotetourt County\t2062\t44.1\t31.4\t8.6\t28504\t210734\t0.2989\t24077\tObama\t24077\t0.005706396999999999\t24077.0\n22708\t-79.919275\t37.420939000000004\tDaleville CDP\tVA\tVirginia\tBotetourt County\t1961\t45.4\t32.4\t5.0\t32055\t248120\t0.2989\t24083\tObama\t24083\t0.005426889\t24083.0\n22709\t-79.820228\t37.379298\tBlue Ridge CDP\tVA\tVirginia\tBotetourt County\t3312\t45.2\t24.4\t7.7\t25547\t191867\t0.2989\t24064\tObama\t24064\t0.009165658\t24064.0\n22710\t-77.88287199999999\t36.863580999999996\tAlberta town\tVA\tVirginia\tBrunswick County\t306\t44.4\t11.4\t14.4\t17519\t98636\t0.6214\t23821\tObama\t23821\t0.000846827\t23821.0\n22711\t-77.85171899999999\t36.75786\tLawrenceville town\tVA\tVirginia\tBrunswick County\t1217\t35.4\t22.9\t9.7\t20299\t103977\t0.6214\t23868\tObama\t23868\t0.003367937\t23868.0\n22712\t-78.02896899999999\t36.703978\tBrodnax town\tVA\tVirginia\tBrunswick County\t340\t41.0\t10.8\t10.4\t15407\t96250\t0.6214\t23920\tObama\t23920\t0.0009409189999999999\t23920.0\n22713\t-82.09689399999999\t37.230278000000006\tVansant CDP\tVA\tVirginia\tBuchanan County\t838\t46.6\t14.8\t8.4\t15297\t99167\t0.3208\t24656\tObama\t24656\t0.002319089\t24656.0\n22714\t-82.09874599999999\t37.275395\tGrundy town\tVA\tVirginia\tBuchanan County\t1307\t41.4\t28.1\t11.5\t18150\t117925\t0.3208\t24614\tObama\t24614\t0.0036170029999999997\t24614.0\n22715\t-78.46125699999999\t37.540972\tDillwyn town\tVA\tVirginia\tBuckingham County\t477\t36.8\t8.6\t9.1\t17639\t111250\t0.5029\t23936\tObama\t23936\t0.001320054\t23936.0\n22716\t-79.095791\t37.272058\tRustburg CDP\tVA\tVirginia\tCampbell County\t1342\t42.1\t20.5\t9.4\t23223\t152813\t0.2956\t24588\tObama\t24588\t0.003713863\t24588.0\n22717\t-78.948696\t37.053168\tBrookneal town\tVA\tVirginia\tCampbell County\t1290\t43.6\t14.1\t18.3\t16762\t88750\t0.2956\t24528\tObama\t24528\t0.003569957\t24528.0\n22718\t-79.286064\t37.122581\tAltavista town\tVA\tVirginia\tCampbell County\t3221\t46.1\t23.9\t8.3\t21928\t119776\t0.2956\t24517\tObama\t24517\t0.008913824\t24517.0\n22719\t-79.24923199999999\t37.323189\tTimberlake CDP\tVA\tVirginia\tCampbell County\t11717\t41.3\t26.2\t6.1\t25419\t176492\t0.2956\t24502\tObama\t24502\t0.03242573\t24502.0\n22720\t-77.191077\t38.169519\tPort Royal town\tVA\tVirginia\tCaroline County\t191\t40.4\t15.5\t10.2\t20475\t158333\t0.5329999999999999\t22535\tObama\t22535\t0.000528575\t22535.0\n22721\t-77.34761400000001\t38.053268\tBowling Green town\tVA\tVirginia\tCaroline County\t1276\t44.4\t18.3\t10.3\t21973\t178606\t0.5329999999999999\t22427\tObama\t22427\t0.0035312140000000004\t22427.0\n22722\t-80.73368\t36.757843\tHillsville town\tVA\tVirginia\tCarroll County\t2674\t43.7\t17.1\t13.8\t21125\t132672\t0.2853\t24343\tObama\t24343\t0.0074000509999999995\t24343.0\n22723\t-80.668764\t36.581587\tCana CDP\tVA\tVirginia\tCarroll County\t1259\t42.0\t8.4\t16.9\t15848\t98333\t0.2853\t24317\tObama\t24317\t0.0034841679999999997\t24317.0\n22724\t-80.699504\t36.676978999999996\tFancy Gap CDP\tVA\tVirginia\tCarroll County\t269\t42.1\t10.8\t17.3\t19197\t112500\t0.2853\t24328\tObama\t24328\t0.0007444330000000001\t24328.0\n22725\t-80.816129\t36.738728\tWoodlawn CDP\tVA\tVirginia\tCarroll County\t2230\t43.1\t11.0\t13.6\t19897\t122123\t0.2853\t24381\tObama\t24381\t0.006171322\t24381.0\n22726\t-78.600942\t36.993347\tDrakes Branch town\tVA\tVirginia\tCharlotte County\t514\t43.5\t14.3\t10.2\t17249\t110833\t0.4244\t23937\tObama\t23937\t0.001422448\t23937.0\n22727\t-78.637688\t37.056248\tCharlotte Court House town\tVA\tVirginia\tCharlotte County\t469\t44.1\t17.6\t9.0\t18735\t122222\t0.4244\t23923\tObama\t23923\t0.001297915\t23923.0\n22728\t-78.748501\t37.081059\tPhenix town\tVA\tVirginia\tCharlotte County\t197\t44.3\t5.6\t18.2\t16059\t112500\t0.4244\t23959\tObama\t23959\t0.00054518\t23959.0\n22729\t-78.480522\t37.038990999999996\tKeysville town\tVA\tVirginia\tCharlotte County\t830\t45.1\t18.5\t11.4\t17633\t126014\t0.4244\t23947\tObama\t23947\t0.002296949\t23947.0\n22730\t-77.436476\t37.405654999999996\tBellwood CDP\tVA\tVirginia\tChesterfield County\t6890\t33.4\t10.2\t10.3\t20268\t111087\t0.4544\t23237\tObama\t23237\t0.019067447\t23237.0\n22731\t-77.43431700000001\t37.352927\tChester CDP\tVA\tVirginia\tChesterfield County\t21805\t37.3\t31.1\t8.9\t28337\t186401\t0.4544\t23831\tObama\t23831\t0.06034335\t23831.0\n22732\t-77.467911\t37.231183\tMatoaca CDP\tVA\tVirginia\tChesterfield County\t2410\t38.5\t20.4\t8.3\t25953\t124342\t0.4544\t23803\tObama\t23803\t0.006669455\t23803.0\n22733\t-77.57001600000001\t37.517883000000005\tBon Air CDP\tVA\tVirginia\tChesterfield County\t17250\t43.7\t49.6\t7.9\t31419\t194856\t0.4544\t23235\tObama\t23235\t0.047737802999999995\t23235.0\n22734\t-77.442161\t37.447045\tBensley CDP\tVA\tVirginia\tChesterfield County\t5607\t33.8\t7.6\t11.8\t20276\t115072\t0.4544\t23234\tObama\t23234\t0.015516862\t23234.0\n22735\t-77.512684\t37.38073\tChesterfield Court House CDP\tVA\tVirginia\tChesterfield County\t3910\t36.2\t22.2\t9.1\t28055\t151348\t0.4544\t23237\tObama\t23237\t0.010820568999999999\t23237.0\n22736\t-77.4288\t37.243307\tEttrick CDP\tVA\tVirginia\tChesterfield County\t5910\t23.9\t28.8\t12.5\t22066\t129469\t0.4544\t23803\tObama\t23803\t0.016355386\t23803.0\n22737\t-78.059903\t39.093241\tBoyce town\tVA\tVirginia\tClarke County\t523\t45.5\t33.5\t6.3\t25403\t271667\t0.4173\t22646\tObama\t22646\t0.001447355\t22646.0\n22738\t-77.98423199999999\t39.152411\tBerryville town\tVA\tVirginia\tClarke County\t3530\t45.1\t23.3\t8.0\t27808\t230183\t0.4173\t22611\tObama\t22611\t0.009768953\t22611.0\n22739\t-80.111846\t37.501253999999996\tNew Castle town\tVA\tVirginia\tCraig County\t180\t44.3\t12.5\t6.7\t21337\t155357\t0.3112\t24127\tObama\t24127\t0.000498134\t24127.0\n22740\t-78.001114\t38.470155\tCulpeper town\tVA\tVirginia\tCulpeper County\t15744\t36.9\t20.4\t9.6\t22179\t213791\t0.4099\t22701\tObama\t22701\t0.043570085\t22701.0\n22741\t-82.356652\t37.159528\tClinchco town\tVA\tVirginia\tDickenson County\t460\t43.2\t8.2\t10.3\t15428\t79231\t0.3582\t24226\tObama\t24226\t0.001273008\t24226.0\n22742\t-82.292236\t37.206456\tHaysi town\tVA\tVirginia\tDickenson County\t176\t43.9\t10.1\t9.7\t13738\t82500\t0.3582\t24256\tObama\t24256\t0.000487064\t24256.0\n22743\t-82.456938\t37.150857\tClintwood town\tVA\tVirginia\tDickenson County\t1907\t44.3\t13.0\t14.7\t16554\t94355\t0.3582\t24228\tObama\t24228\t0.005277449\t24228.0\n22744\t-77.721754\t36.98534\tMcKenney town\tVA\tVirginia\tDinwiddie County\t542\t44.4\t8.5\t12.4\t18767\t113542\t0.48200000000000004\t23872\tObama\t23872\t0.001499936\t23872.0\n22745\t-76.86662199999999\t37.918347\tTappahannock town\tVA\tVirginia\tEssex County\t2423\t43.3\t20.9\t10.7\t23155\t156331\t0.5315\t22560\tObama\t22560\t0.006705432\t22560.0\n22746\t-77.130578\t38.847749\tBailey's Crossroads CDP\tVA\tVirginia\tFairfax County\t24072\t35.0\t41.7\t9.3\t30377\t245328\t0.5957\t22041\tObama\t22041\t0.066617066\t22041.0\n22747\t-77.058428\t38.778808000000005\tBelle Haven CDP\tVA\tVirginia\tFairfax County\t6268\t43.9\t65.3\t6.0\t59694\t336548\t0.5957\t22307\tObama\t22307\t0.017346119\t22307.0\n22748\t-77.144522\t38.865840999999996\tSeven Corners CDP\tVA\tVirginia\tFairfax County\t8697\t35.4\t35.1\t11.0\t26266\t173199\t0.5957\t22044\tObama\t22044\t0.024068155\t22044.0\n22749\t-77.112882\t38.788926000000004\tRose Hill CDP\tVA\tVirginia\tFairfax County\t15930\t41.7\t52.8\t5.3\t46385\t360360\t0.5957\t22310\tObama\t22310\t0.044084822999999995\t22310.0\n22750\t-77.205198\t38.735671999999994\tNewington CDP\tVA\tVirginia\tFairfax County\t20744\t40.2\t55.5\t6.0\t41915\t336872\t0.5957\t22153\tObama\t22153\t0.057407129\t22153.0\n22751\t-77.14577299999999\t38.711763\tFort Belvoir CDP\tVA\tVirginia\tFairfax County\t7728\t21.7\t24.9\t18.4\t19258\t110000\t0.5957\t22060\tObama\t22060\t0.021386536\t22060.0\n22752\t-77.210444\t38.802706\tNorth Springfield CDP\tVA\tVirginia\tFairfax County\t9185\t40.5\t50.3\t6.3\t35150\t345601\t0.5957\t22151\tObama\t22151\t0.02541865\t22151.0\n22753\t-77.386785\t38.969825\tHerndon town\tVA\tVirginia\tFairfax County\t23425\t34.0\t46.3\t5.7\t35540\t319429\t0.5957\t20170\tObama\t20170\t0.064826553\t20170.0\n22754\t-77.23706700000001\t38.702422\tLorton CDP\tVA\tVirginia\tFairfax County\t22516\t33.4\t35.9\t5.6\t39920\t262061\t0.5957\t22125\tObama\t22125\t0.062310977999999996\t22125.0\n22755\t-77.242577\t38.873129999999996\tMerrifield CDP\tVA\tVirginia\tFairfax County\t13823\t34.6\t61.1\t7.2\t45995\t351605\t0.5957\t22031\tObama\t22031\t0.038253893\t22031.0\n22756\t-77.070975\t38.792392\tHuntington CDP\tVA\tVirginia\tFairfax County\t9487\t37.7\t59.9\t7.9\t45301\t219721\t0.5957\t22303\tObama\t22303\t0.026254407999999996\t22303.0\n22757\t-77.188013\t38.864866\tJefferson CDP\tVA\tVirginia\tFairfax County\t27753\t37.8\t45.0\t6.8\t36178\t329287\t0.5957\t22042\tObama\t22042\t0.076803898\t22042.0\n22758\t-77.056874\t38.734806\tFort Hunt CDP\tVA\tVirginia\tFairfax County\t12845\t47.4\t71.0\t4.5\t60258\t498669\t0.5957\t22308\tObama\t22308\t0.035547367\t22308.0\n22759\t-77.212744\t38.834385\tAnnandale CDP\tVA\tVirginia\tFairfax County\t56069\t40.3\t54.0\t6.7\t40428\t389945\t0.5957\t22003\tObama\t22003\t0.155165848\t22003.0\n22760\t-77.096954\t38.765776\tGroveton CDP\tVA\tVirginia\tFairfax County\t22209\t37.2\t43.3\t7.5\t36378\t307713\t0.5957\t22306\tObama\t22306\t0.061461383\t22306.0\n22761\t-77.199338\t38.910555\tPimmit Hills CDP\tVA\tVirginia\tFairfax County\t6084\t39.2\t44.4\t3.3\t37077\t310040\t0.5957\t22043\tObama\t22043\t0.016836916\t22043.0\n22762\t-77.407892\t38.876881\tChantilly CDP\tVA\tVirginia\tFairfax County\t48376\t36.7\t64.3\t5.8\t50259\t372599\t0.5957\t22033\tObama\t22033\t0.133876171\t22033.0\n22763\t-77.257214\t38.852665\tMantua CDP\tVA\tVirginia\tFairfax County\t7508\t47.3\t64.5\t7.1\t46619\t619911\t0.5957\t22031\tObama\t22031\t0.020777706\t22031.0\n22764\t-77.343848\t38.95093\tReston CDP\tVA\tVirginia\tFairfax County\t58961\t39.5\t67.0\t6.4\t56734\t370527\t0.5957\t20190\tObama\t20190\t0.16316919400000002\t20190.0\n22765\t-77.287657\t39.010111\tGreat Falls CDP\tVA\tVirginia\tFairfax County\t9042\t45.5\t79.9\t4.4\t90760\t969384\t0.5957\t22066\tObama\t22066\t0.025022911000000002\t22066.0\n22766\t-77.38666500000001\t38.779908\tClifton town\tVA\tVirginia\tFairfax County\t191\t39.6\t61.0\t2.9\t56139\t661765\t0.5957\t20124\tObama\t20124\t0.000528575\t20124.0\n22767\t-77.17586\t38.938138\tMcLean CDP\tVA\tVirginia\tFairfax County\t40415\t46.0\t79.2\t4.9\t80728\t714604\t0.5957\t22101\tObama\t22101\t0.111844829\t22101.0\n22768\t-77.107126\t38.719273\tMount Vernon CDP\tVA\tVirginia\tFairfax County\t29621\t37.0\t40.3\t8.0\t37806\t307748\t0.5957\t22309\tObama\t22309\t0.08197341799999999\t22309.0\n22769\t-77.259683\t38.899601000000004\tVienna town\tVA\tVirginia\tFairfax County\t14326\t43.6\t61.7\t6.2\t49863\t408794\t0.5957\t22180\tObama\t22180\t0.039645899\t22180.0\n22770\t-77.17891\t38.78477\tSpringfield CDP\tVA\tVirginia\tFairfax County\t35814\t39.2\t42.9\t6.5\t37189\t338427\t0.5957\t22150\tObama\t22150\t0.099111981\t22150.0\n22771\t-77.15786899999999\t38.851345\tLake Barcroft CDP\tVA\tVirginia\tFairfax County\t9246\t43.1\t65.9\t5.5\t60527\t534219\t0.5957\t22044\tObama\t22044\t0.025587462000000002\t22044.0\n22772\t-77.23042\t38.893301\tDunn Loring CDP\tVA\tVirginia\tFairfax County\t9229\t40.3\t62.3\t6.1\t51830\t476116\t0.5957\t22027\tObama\t22027\t0.025540416\t22027.0\n22773\t-77.232008\t38.785897\tWest Springfield CDP\tVA\tVirginia\tFairfax County\t28299\t43.0\t62.5\t5.1\t46547\t361177\t0.5957\t22152\tObama\t22152\t0.07831490299999999\t22152.0\n22774\t-77.27358199999999\t38.780653\tBurke CDP\tVA\tVirginia\tFairfax County\t57285\t41.1\t63.7\t5.7\t44221\t371367\t0.5957\t22015\tObama\t22015\t0.158531017\t22015.0\n22775\t-77.285921\t38.940337\tWolf Trap CDP\tVA\tVirginia\tFairfax County\t14406\t44.8\t80.4\t4.9\t72169\t716331\t0.5957\t22182\tObama\t22182\t0.039867292\t22182.0\n22776\t-77.150059\t38.763515000000005\tFranconia CDP\tVA\tVirginia\tFairfax County\t33251\t38.2\t63.2\t6.1\t49770\t319368\t0.5957\t22315\tObama\t22315\t0.09201911199999999\t22315.0\n22777\t-77.152507\t38.824692999999996\tLincolnia CDP\tVA\tVirginia\tFairfax County\t17002\t35.1\t44.7\t7.2\t32793\t380424\t0.5957\t22312\tObama\t22312\t0.047051486\t22312.0\n22778\t-77.205396\t38.889967999999996\tIdylwood CDP\tVA\tVirginia\tFairfax County\t16227\t36.3\t59.4\t5.7\t45473\t364440\t0.5957\t22043\tObama\t22043\t0.044906744000000005\t22043.0\n22779\t-77.30159\t38.888909999999996\tOakton CDP\tVA\tVirginia\tFairfax County\t32596\t38.7\t67.4\t6.6\t59106\t472567\t0.5957\t22181\tObama\t22181\t0.090206459\t22181.0\n22780\t-77.442228\t38.845875\tCentreville CDP\tVA\tVirginia\tFairfax County\t53072\t33.0\t53.8\t5.9\t39308\t300971\t0.5957\t20120\tObama\t20120\t0.14687192300000002\t20120.0\n22781\t-77.231697\t38.920176\tTysons Corner CDP\tVA\tVirginia\tFairfax County\t18878\t38.7\t74.1\t5.2\t65720\t425340\t0.5957\t22102\tObama\t22102\t0.052243145\t22102.0\n22782\t-77.077055\t38.749123\tHybla Valley CDP\tVA\tVirginia\tFairfax County\t17626\t36.5\t36.2\t7.5\t31451\t290749\t0.5957\t22306\tObama\t22306\t0.048778349000000006\t22306.0\n22783\t-77.80827099999999\t38.534731\tRemington town\tVA\tVirginia\tFauquier County\t759\t30.8\t11.4\t9.0\t26543\t207500\t0.3928\t22734\tObama\t22734\t0.002100463\t22734.0\n22784\t-77.797065\t38.717599\tWarrenton town\tVA\tVirginia\tFauquier County\t9619\t39.8\t36.0\t6.4\t33589\t315705\t0.3928\t20186\tObama\t20186\t0.026619706\t20186.0\n22785\t-77.773967\t38.862657\tThe Plains town\tVA\tVirginia\tFauquier County\t318\t44.0\t33.0\t6.5\t38726\t376190\t0.3928\t20198\tObama\t20198\t0.0008800360000000001\t20198.0\n22786\t-80.31836700000001\t36.911761\tFloyd town\tVA\tVirginia\tFloyd County\t468\t44.8\t23.0\t6.1\t17939\t133036\t0.3574\t24091\tObama\t24091\t0.001295147\t24091.0\n22787\t-78.329859\t37.92102\tLake Monticello CDP\tVA\tVirginia\tFluvanna County\t9906\t44.4\t41.2\t7.3\t29783\t239421\t0.4622\t22963\tObama\t22963\t0.027413952000000002\t22963.0\n22788\t-78.163599\t37.753278\tColumbia town\tVA\tVirginia\tFluvanna County\t63\t45.4\t31.1\t6.3\t25985\t187500\t0.4622\t23038\tObama\t23038\t0.00017434700000000002\t23038.0\n22789\t-79.696915\t37.12335\tWestlake Corner CDP\tVA\tVirginia\tFranklin County\t1143\t55.7\t33.3\t6.4\t32952\t271053\t0.3404\t24121\tObama\t24121\t0.0031631479999999997\t24121.0\n22790\t-80.009997\t36.938739\tFerrum CDP\tVA\tVirginia\tFranklin County\t1402\t29.2\t16.8\t5.9\t18914\t130750\t0.3404\t24088\tObama\t24088\t0.003879907\t24088.0\n22791\t-79.95165300000001\t37.115703\tBoones Mill town\tVA\tVirginia\tFranklin County\t301\t44.8\t23.5\t7.1\t21833\t149219\t0.3404\t24065\tObama\t24065\t0.00083299\t24065.0\n22792\t-79.63173499999999\t36.990156\tPenhook CDP\tVA\tVirginia\tFranklin County\t1046\t50.3\t24.4\t7.5\t27663\t205000\t0.3404\t24137\tObama\t24137\t0.00289471\t24137.0\n22793\t-79.68314000000001\t37.020565000000005\tUnion Hall CDP\tVA\tVirginia\tFranklin County\t1275\t51.6\t26.4\t6.9\t29263\t242308\t0.3404\t24176\tObama\t24176\t0.0035284459999999998\t24176.0\n22794\t-79.889699\t36.996625\tRocky Mount town\tVA\tVirginia\tFranklin County\t4226\t44.0\t18.2\t13.9\t20038\t120878\t0.3404\t24151\tObama\t24151\t0.01169507\t24151.0\n22795\t-79.651673\t37.077690000000004\tNorth Shore CDP\tVA\tVirginia\tFranklin County\t2666\t60.7\t38.1\t6.5\t38276\t333508\t0.3404\t24176\tObama\t24176\t0.0073779119999999995\t24176.0\n22796\t-78.277916\t39.028894\tMiddletown town\tVA\tVirginia\tFrederick County\t1262\t43.0\t21.9\t9.1\t21093\t154234\t0.3487\t22645\tObama\t22645\t0.00349247\t22645.0\n22797\t-78.223442\t39.092026000000004\tStephens City town\tVA\tVirginia\tFrederick County\t1782\t39.3\t17.4\t6.9\t22819\t158144\t0.3487\t22655\tObama\t22655\t0.004931523\t22655.0\n22798\t-80.857517\t37.373101\tGlen Lyn town\tVA\tVirginia\tGiles County\t148\t46.4\t11.9\t9.8\t20283\t103125\t0.3612\t24093\tObama\t24093\t0.00040957699999999994\t24093.0\n22799\t-80.808353\t37.331728999999996\tNarrows town\tVA\tVirginia\tGiles County\t2080\t42.9\t12.5\t14.0\t20153\t97597\t0.3612\t24124\tObama\t24124\t0.00575621\t24124.0\n22800\t-80.820741\t37.383386\tRich Creek town\tVA\tVirginia\tGiles County\t688\t43.4\t8.4\t12.6\t20311\t99286\t0.3612\t24147\tObama\t24147\t0.001903977\t24147.0\n22801\t-80.727853\t37.328679\tPearisburg town\tVA\tVirginia\tGiles County\t2831\t44.4\t18.6\t10.6\t23785\t116813\t0.3612\t24134\tObama\t24134\t0.007834534\t24134.0\n22802\t-80.63617099999999\t37.322246\tPembroke town\tVA\tVirginia\tGiles County\t1107\t43.6\t10.4\t8.0\t20829\t102802\t0.3612\t24136\tObama\t24136\t0.003063522\t24136.0\n22803\t-76.496667\t37.276004\tGloucester Point CDP\tVA\tVirginia\tGloucester County\t10458\t40.9\t23.5\t8.7\t25601\t199538\t0.3508\t23062\tObama\t23062\t0.028941562\t23062.0\n22804\t-76.526794\t37.405252000000004\tGloucester Courthouse CDP\tVA\tVirginia\tGloucester County\t2335\t44.3\t23.4\t9.5\t24942\t201095\t0.3508\t23061\tObama\t23061\t0.0064619\t23061.0\n22805\t-80.975252\t36.7141\tFries town\tVA\tVirginia\tGrayson County\t500\t50.5\t8.5\t17.2\t19225\t63421\t0.2904\t24330\tObama\t24330\t0.001383704\t24330.0\n22806\t-81.44122\t36.702239\tTroutdale town\tVA\tVirginia\tGrayson County\t185\t39.0\t8.8\t13.0\t20055\t109722\t0.2904\t24378\tObama\t24378\t0.000511971\t24378.0\n22807\t-81.150982\t36.625417999999996\tIndependence town\tVA\tVirginia\tGrayson County\t1003\t47.2\t15.5\t12.6\t18123\t117500\t0.2904\t24348\tObama\t24348\t0.0027757109999999997\t24348.0\n22808\t-78.437201\t38.298551\tStanardsville town\tVA\tVirginia\tGreene County\t531\t43.5\t19.2\t4.9\t21217\t195000\t0.3646\t22973\tObama\t22973\t0.001469494\t22973.0\n22809\t-77.464316\t36.81615\tJarratt town\tVA\tVirginia\tGreensville County\t621\t38.5\t16.5\t9.5\t17634\t117578\t0.6364\t23867\tObama\t23867\t0.001718561\t23867.0\n22810\t-78.79144000000001\t36.75881\tScottsburg town\tVA\tVirginia\tHalifax County\t144\t44.4\t5.9\t11.3\t17710\t107500\t0.4653\t24589\tObama\t24589\t0.000398507\t24589.0\n22811\t-78.775539\t36.546294\tVirgilina town\tVA\tVirginia\tHalifax County\t169\t47.3\t11.8\t9.5\t21093\t118056\t0.4653\t24598\tObama\t24598\t0.00046769199999999997\t24598.0\n22812\t-78.91238\t36.714566\tSouth Boston town\tVA\tVirginia\tHalifax County\t7798\t44.1\t17.7\t13.3\t19309\t121591\t0.4653\t24592\tObama\t24592\t0.021580254\t24592.0\n22813\t-78.928053\t36.761313\tHalifax town\tVA\tVirginia\tHalifax County\t1354\t44.9\t20.5\t13.1\t20714\t134954\t0.4653\t24558\tObama\t24558\t0.003747072\t24558.0\n22814\t-77.47141500000001\t37.759741\tAshland town\tVA\tVirginia\tHanover County\t7391\t34.2\t23.8\t12.0\t23607\t159846\t0.3098\t23005\tObama\t23005\t0.020453918999999997\t23005.0\n22815\t-77.356113\t37.626212\tMechanicsville CDP\tVA\tVirginia\tHanover County\t36053\t38.6\t29.8\t7.2\t31260\t210658\t0.3098\t23116\tObama\t23116\t0.09977339199999999\t23116.0\n22816\t-77.585629\t37.587685\tTuckahoe CDP\tVA\tVirginia\tHenrico County\t45458\t42.5\t54.3\t6.9\t36273\t236652\t0.5522\t23229\tObama\t23229\t0.12580087199999998\t23229.0\n22817\t-77.506114\t37.637467\tLaurel CDP\tVA\tVirginia\tHenrico County\t15755\t35.8\t29.8\t8.9\t26802\t155058\t0.5522\t23228\tObama\t23228\t0.043600527\t23228.0\n22818\t-77.627096\t37.663897999999996\tShort Pump CDP\tVA\tVirginia\tHenrico County\t207\t39.5\t27.2\t5.4\t30916\t305769\t0.5522\t23233\tObama\t23233\t0.000572854\t23233.0\n22819\t-77.48356899999999\t37.666149\tGlen Allen CDP\tVA\tVirginia\tHenrico County\t14556\t38.2\t40.3\t7.2\t30951\t196448\t0.5522\t23060\tObama\t23060\t0.040282403\t23060.0\n22820\t-77.386511\t37.577052\tEast Highland Park CDP\tVA\tVirginia\tHenrico County\t14255\t39.7\t15.4\t10.3\t22984\t122831\t0.5522\t23223\tObama\t23223\t0.039449412999999996\t23223.0\n22821\t-77.376737\t37.519663\tMontrose CDP\tVA\tVirginia\tHenrico County\t7818\t33.8\t14.3\t10.4\t22342\t114015\t0.5522\t23223\tObama\t23223\t0.021635603\t23223.0\n22822\t-77.47601999999999\t37.613537\tLakeside CDP\tVA\tVirginia\tHenrico County\t12395\t41.7\t25.8\t7.8\t28004\t137404\t0.5522\t23228\tObama\t23228\t0.034302032999999996\t23228.0\n22823\t-77.428712\t37.627772\tChamberlayne CDP\tVA\tVirginia\tHenrico County\t5297\t49.6\t43.4\t10.0\t33524\t188170\t0.5522\t23227\tObama\t23227\t0.014658965\t23227.0\n22824\t-77.61243499999999\t37.692316999999996\tWyndham CDP\tVA\tVirginia\tHenrico County\t8028\t35.8\t73.2\t5.9\t49343\t419277\t0.5522\t23233\tObama\t23233\t0.022216758\t23233.0\n22825\t-77.505326\t37.612071\tDumbarton CDP\tVA\tVirginia\tHenrico County\t6901\t37.3\t25.5\t9.7\t25579\t145543\t0.5522\t23228\tObama\t23228\t0.019097889\t23228.0\n22826\t-77.328694\t37.551759000000004\tHighland Springs CDP\tVA\tVirginia\tHenrico County\t16049\t35.5\t11.5\t9.4\t22419\t129935\t0.5522\t23075\tObama\t23075\t0.044414145\t23075.0\n22827\t-79.787161\t36.687042\tLaurel Park CDP\tVA\tVirginia\tHenry County\t727\t43.0\t12.8\t14.9\t21480\t148321\t0.4133\t24054\tObama\t24054\t0.002011906\t24054.0\n22828\t-79.798172\t36.675649\tChatmoss CDP\tVA\tVirginia\tHenry County\t1655\t45.1\t27.1\t15.2\t30980\t194853\t0.4133\t24112\tObama\t24112\t0.004580062\t24112.0\n22829\t-79.951497\t36.631246999999995\tHorse Pasture CDP\tVA\tVirginia\tHenry County\t2187\t45.9\t9.0\t13.2\t20972\t121731\t0.4133\t24089\tObama\t24089\t0.006052323\t24089.0\n22830\t-79.727657\t36.564412\tSandy Level CDP\tVA\tVirginia\tHenry County\t685\t41.1\t1.4\t19.7\t15725\t87857\t0.4133\t24069\tObama\t24069\t0.001895675\t24069.0\n22831\t-79.858183\t36.578293\tRidgeway town\tVA\tVirginia\tHenry County\t829\t43.2\t11.6\t14.3\t19764\t131048\t0.4133\t24148\tObama\t24148\t0.002294182\t24148.0\n22832\t-79.942771\t36.701083000000004\tFieldale CDP\tVA\tVirginia\tHenry County\t804\t45.8\t4.5\t17.6\t17471\t87931\t0.4133\t24089\tObama\t24089\t0.0022249970000000003\t24089.0\n22833\t-79.939318\t36.794447999999996\tOak Level CDP\tVA\tVirginia\tHenry County\t841\t46.4\t10.4\t15.4\t18749\t120040\t0.4133\t24168\tObama\t24168\t0.0023273910000000003\t24168.0\n22834\t-79.8994\t36.698127\tVilla Heights CDP\tVA\tVirginia\tHenry County\t744\t37.1\t11.5\t14.9\t15614\t97368\t0.4133\t24078\tObama\t24078\t0.002058952\t24078.0\n22835\t-79.98626999999999\t36.76169\tBassett CDP\tVA\tVirginia\tHenry County\t1303\t48.3\t18.0\t19.2\t20978\t120408\t0.4133\t24055\tObama\t24055\t0.0036059340000000003\t24055.0\n22836\t-79.912211\t36.721583\tCollinsville CDP\tVA\tVirginia\tHenry County\t6953\t41.3\t16.1\t13.4\t19877\t131585\t0.4133\t24078\tObama\t24078\t0.019241794\t24078.0\n22837\t-79.95219300000001\t36.751051000000004\tStanleytown CDP\tVA\tVirginia\tHenry County\t1456\t46.6\t14.5\t20.3\t21005\t124185\t0.4133\t24168\tObama\t24168\t0.004029347\t24168.0\n22838\t-79.580867\t38.411636\tMonterey town\tVA\tVirginia\tHighland County\t144\t52.5\t14.9\t13.7\t20249\t127083\t0.3248\t24465\tObama\t24465\t0.000398507\t24465.0\n22839\t-76.742362\t36.809581\tWindsor town\tVA\tVirginia\tIsle of Wight County\t1044\t41.3\t15.7\t8.9\t22482\t148500\t0.4207\t23487\tObama\t23487\t0.002889175\t23487.0\n22840\t-76.67451899999999\t37.083431\tRushmere CDP\tVA\tVirginia\tIsle of Wight County\t1121\t46.0\t19.5\t7.2\t21592\t174020\t0.4207\t23883\tObama\t23883\t0.003102265\t23883.0\n22841\t-76.616742\t36.974057\tSmithfield town\tVA\tVirginia\tIsle of Wight County\t8222\t41.8\t25.3\t10.1\t24688\t235880\t0.4207\t23430\tObama\t23430\t0.022753636\t23430.0\n22842\t-77.242758\t38.330172\tFairview Beach CDP\tVA\tVirginia\tKing George County\t289\t37.9\t19.1\t9.3\t26186\t215909\t0.3953\t22485\tObama\t22485\t0.0007997810000000001\t22485.0\n22843\t-77.05577199999999\t38.338471000000006\tDahlgren CDP\tVA\tVirginia\tKing George County\t1442\t41.1\t39.0\t6.7\t31524\t248558\t0.3953\t22448\tObama\t22448\t0.003990604\t22448.0\n22844\t-76.802054\t37.553181\tWest Point town\tVA\tVirginia\tKing William County\t3819\t43.2\t23.3\t6.8\t26122\t164911\t0.3748\t23110\tObama\t23110\t0.010568734\t23110.0\n22845\t-76.419373\t37.662805\tIrvington town\tVA\tVirginia\tLancaster County\t678\t63.9\t46.9\t3.8\t32128\t205208\t0.4524\t22480\tObama\t22480\t0.001876303\t22480.0\n22846\t-76.389814\t37.643926\tWhite Stone town\tVA\tVirginia\tLancaster County\t343\t53.5\t35.3\t5.9\t29241\t175000\t0.4524\t22578\tObama\t22578\t0.0009492210000000001\t22578.0\n22847\t-76.372787\t37.714674\tKilmarnock town\tVA\tVirginia\tLancaster County\t1235\t56.3\t31.6\t7.0\t27210\t156410\t0.4524\t22482\tObama\t22482\t0.00341775\t22482.0\n22848\t-83.428397\t36.637415999999995\tEwing CDP\tVA\tVirginia\tLee County\t434\t44.8\t13.5\t8.0\t15841\t97857\t0.2691\t24248\tObama\t24248\t0.001201055\t24248.0\n22849\t-82.943438\t36.776301000000004\tDryden CDP\tVA\tVirginia\tLee County\t1392\t42.2\t8.2\t12.7\t14951\t97833\t0.2691\t24243\tObama\t24243\t0.003852233\t24243.0\n22850\t-83.115275\t36.687135\tJonesville town\tVA\tVirginia\tLee County\t1072\t44.7\t18.3\t8.8\t18422\t121818\t0.2691\t24263\tObama\t24263\t0.002966662\t24263.0\n22851\t-83.374861\t36.667199\tRose Hill CDP\tVA\tVirginia\tLee County\t712\t44.0\t12.6\t10.4\t14445\t88571\t0.2691\t24281\tObama\t24281\t0.001970395\t24281.0\n22852\t-82.914078\t36.863559\tKeokee CDP\tVA\tVirginia\tLee County\t306\t41.0\t3.3\t3.9\t16331\t65000\t0.2691\t24265\tObama\t24265\t0.000846827\t24265.0\n22853\t-83.057631\t36.804548\tSt. Charles town\tVA\tVirginia\tLee County\t156\t40.4\t2.8\t17.9\t11290\t40000\t0.2691\t24282\tObama\t24282\t0.000431716\t24282.0\n22854\t-83.028944\t36.759228\tPennington Gap town\tVA\tVirginia\tLee County\t1669\t45.0\t12.2\t11.1\t16065\t100169\t0.2691\t24277\tObama\t24277\t0.004618805\t24277.0\n22855\t-77.738486\t38.969726\tMiddleburg town\tVA\tVirginia\tLoudoun County\t725\t44.7\t41.7\t7.5\t61804\t554167\t0.5153\t20117\tObama\t20117\t0.002006371\t20117.0\n22856\t-77.768973\t39.134259\tRound Hill town\tVA\tVirginia\tLoudoun County\t539\t42.4\t47.8\t5.2\t42584\t448333\t0.5153\t20141\tObama\t20141\t0.0014916329999999998\t20141.0\n22857\t-77.55570300000001\t39.104797\tLeesburg town\tVA\tVirginia\tLoudoun County\t44422\t33.8\t52.1\t5.9\t42495\t386391\t0.5153\t20175\tObama\t20175\t0.12293383699999999\t20175.0\n22858\t-77.664417\t39.134951\tHamilton town\tVA\tVirginia\tLoudoun County\t666\t44.6\t50.2\t3.8\t46042\t405556\t0.5153\t20158\tObama\t20158\t0.001843094\t20158.0\n22859\t-77.710432\t39.135506\tPurcellville town\tVA\tVirginia\tLoudoun County\t6334\t37.7\t44.1\t5.5\t34507\t427213\t0.5153\t20132\tObama\t20132\t0.017528768\t20132.0\n22860\t-77.724713\t39.199276\tHillsboro town\tVA\tVirginia\tLoudoun County\t123\t41.7\t58.1\t4.1\t54519\t711538\t0.5153\t20132\tObama\t20132\t0.000340391\t20132.0\n22861\t-77.6393\t39.274355\tLovettsville town\tVA\tVirginia\tLoudoun County\t1391\t42.3\t46.9\t5.4\t41761\t480612\t0.5153\t20180\tObama\t20180\t0.0038494659999999997\t20180.0\n22862\t-77.998671\t38.021251\tLouisa town\tVA\tVirginia\tLouisa County\t1602\t39.3\t19.0\t9.5\t21234\t165164\t0.4226\t23093\tObama\t23093\t0.004433389\t23093.0\n22863\t-77.906033\t38.006797\tMineral town\tVA\tVirginia\tLouisa County\t491\t44.7\t16.2\t8.5\t22359\t142969\t0.4226\t23117\tObama\t23117\t0.0013587979999999998\t23117.0\n22864\t-78.127215\t36.962540000000004\tKenbridge town\tVA\tVirginia\tLunenburg County\t1143\t43.6\t19.5\t10.2\t18093\t107250\t0.4681\t23944\tObama\t23944\t0.0031631479999999997\t23944.0\n22865\t-78.22416199999999\t36.994709\tVictoria town\tVA\tVirginia\tLunenburg County\t1825\t41.1\t8.3\t10.7\t16377\t86354\t0.4681\t23974\tObama\t23974\t0.005050521\t23974.0\n22866\t-78.258365\t38.379227\tMadison town\tVA\tVirginia\tMadison County\t222\t43.1\t20.4\t8.5\t22793\t181250\t0.39899999999999997\t22727\tObama\t22727\t0.000614365\t22727.0\n22867\t-78.390721\t36.666061\tBoydton town\tVA\tVirginia\tMecklenburg County\t516\t41.6\t13.7\t13.4\t17597\t112500\t0.45899999999999996\t239HH\tObama\t239HH\t0.0014279829999999999\t0.0\n22868\t-78.127121\t36.726983000000004\tSouth Hill town\tVA\tVirginia\tMecklenburg County\t4226\t42.2\t20.1\t16.1\t19961\t139832\t0.45899999999999996\t23970\tObama\t23970\t0.01169507\t23970.0\n22869\t-78.460926\t36.799868\tChase City town\tVA\tVirginia\tMecklenburg County\t2392\t43.2\t13.7\t22.8\t16316\t94417\t0.45899999999999996\t23924\tObama\t23924\t0.006619641999999999\t23924.0\n22870\t-78.09406\t36.701423999999996\tLa Crosse town\tVA\tVirginia\tMecklenburg County\t558\t40.8\t8.1\t16.7\t15536\t96250\t0.45899999999999996\t23950\tObama\t23950\t0.001544214\t23950.0\n22871\t-78.55064300000001\t36.628572\tClarksville town\tVA\tVirginia\tMecklenburg County\t1231\t47.1\t24.0\t10.7\t22694\t146332\t0.45899999999999996\t23927\tObama\t23927\t0.00340668\t23927.0\n22872\t-76.574731\t37.639579\tUrbanna town\tVA\tVirginia\tMiddlesex County\t576\t53.6\t41.8\t4.7\t30135\t222222\t0.3898\t23175\tObama\t23175\t0.001594028\t23175.0\n22873\t-80.42442199999999\t37.190953\tMerrimac CDP\tVA\tVirginia\tMontgomery County\t2048\t41.3\t35.5\t10.3\t22900\t125368\t0.4853\t24060\tObama\t24060\t0.005667653000000001\t24060.0\n22874\t-80.240256\t37.171349\tShawsville CDP\tVA\tVirginia\tMontgomery County\t1139\t38.5\t11.6\t9.1\t19854\t93846\t0.4853\t24162\tObama\t24162\t0.0031520790000000003\t24162.0\n22875\t-80.216164\t37.223644\tElliston-Lafayette CDP\tVA\tVirginia\tMontgomery County\t1380\t35.9\t16.2\t6.4\t20158\t63750\t0.4853\t24087\tObama\t24087\t0.0038190240000000003\t24087.0\n22876\t-80.40233\t37.141746000000005\tChristiansburg town\tVA\tVirginia\tMontgomery County\t20131\t37.6\t31.5\t7.2\t25064\t152013\t0.4853\t24073\tObama\t24073\t0.055710708\t24073.0\n22877\t-80.428203\t37.230156\tBlacksburg town\tVA\tVirginia\tMontgomery County\t41976\t22.9\t70.5\t10.9\t18865\t209580\t0.4853\t24060\tObama\t24060\t0.11616475400000001\t24060.0\n22878\t-75.822878\t37.532956\tExmore town\tVA\tVirginia\tNorthampton County\t1163\t43.3\t14.0\t9.0\t18158\t113352\t0.5763\t23350\tObama\t23350\t0.0032184970000000003\t23350.0\n22879\t-75.940776\t37.351338\tEastville town\tVA\tVirginia\tNorthampton County\t212\t44.4\t24.8\t15.9\t18365\t154167\t0.5763\t23347\tObama\t23347\t0.000586691\t23347.0\n22880\t-75.860851\t37.474788000000004\tNassawadox town\tVA\tVirginia\tNorthampton County\t599\t48.4\t23.4\t12.1\t25280\t142105\t0.5763\t23413\tObama\t23413\t0.0016576779999999999\t23413.0\n22881\t-75.968487\t37.292051\tCheriton town\tVA\tVirginia\tNorthampton County\t521\t41.5\t15.0\t10.7\t15041\t111458\t0.5763\t23316\tObama\t23316\t0.00144182\t23316.0\n22882\t-76.009343\t37.257687\tCape Charles town\tVA\tVirginia\tNorthampton County\t1221\t44.2\t21.0\t7.7\t21298\t173214\t0.5763\t23310\tObama\t23310\t0.003379006\t23310.0\n22883\t-78.201259\t37.187861\tBurkeville town\tVA\tVirginia\tNottoway County\t511\t44.9\t15.1\t13.8\t17954\t126389\t0.4885\t23922\tObama\t23922\t0.001414146\t23922.0\n22884\t-78.002889\t37.082559\tBlackstone town\tVA\tVirginia\tNottoway County\t3716\t43.9\t16.4\t12.3\t17215\t104403\t0.4885\t23824\tObama\t23824\t0.010283691\t23824.0\n22885\t-78.130549\t37.181177000000005\tCrewe town\tVA\tVirginia\tNottoway County\t2279\t37.8\t21.4\t10.1\t20377\t117614\t0.4885\t23930\tObama\t23930\t0.006306925\t23930.0\n22886\t-78.187443\t38.135979\tGordonsville town\tVA\tVirginia\tOrange County\t2163\t41.5\t14.3\t9.0\t22677\t176067\t0.4201\t22942\tObama\t22942\t0.005985905\t22942.0\n22887\t-78.112316\t38.248405\tOrange town\tVA\tVirginia\tOrange County\t4554\t41.7\t27.0\t8.7\t22305\t187500\t0.4201\t22960\tObama\t22960\t0.01260278\t22960.0\n22888\t-78.62213\t38.488119\tShenandoah town\tVA\tVirginia\tPage County\t1848\t40.4\t11.3\t10.1\t18761\t137879\t0.3641\t22849\tObama\t22849\t0.005114172\t22849.0\n22889\t-78.502739\t38.577622999999996\tStanley town\tVA\tVirginia\tPage County\t1420\t39.4\t5.2\t11.5\t17916\t141761\t0.3641\t22851\tObama\t22851\t0.003929721\t22851.0\n22890\t-78.45464100000001\t38.665281\tLuray town\tVA\tVirginia\tPage County\t5019\t44.2\t19.3\t8.7\t20875\t152520\t0.3641\t22835\tObama\t22835\t0.013889625\t22835.0\n22891\t-80.27335500000001\t36.640678\tStuart town\tVA\tVirginia\tPatrick County\t918\t40.8\t20.6\t24.2\t17015\t133841\t0.2927\t24171\tObama\t24171\t0.0025404810000000002\t24171.0\n22892\t-80.197992\t36.634060999999996\tPatrick Springs CDP\tVA\tVirginia\tPatrick County\t2170\t43.7\t12.1\t12.2\t19825\t143995\t0.2927\t24171\tObama\t24171\t0.006005277\t24171.0\n22893\t-79.362157\t36.952693\tGretna town\tVA\tVirginia\tPittsylvania County\t1213\t48.3\t14.3\t12.0\t18622\t102006\t0.3539\t24557\tObama\t24557\t0.003356867\t24557.0\n22894\t-79.297802\t37.094601000000004\tHurt town\tVA\tVirginia\tPittsylvania County\t1282\t43.5\t7.0\t11.7\t19028\t98727\t0.3539\t24563\tObama\t24563\t0.003547818\t24563.0\n22895\t-79.39673\t36.818422999999996\tChatham town\tVA\tVirginia\tPittsylvania County\t1378\t45.4\t34.5\t12.1\t20482\t116923\t0.3539\t24531\tObama\t24531\t0.003813489\t24531.0\n22896\t-78.466802\t37.24288\tHampden Sydney CDP\tVA\tVirginia\tPrince Edward County\t1420\t23.3\t26.7\t11.8\t21770\t151389\t0.5555\t23943\tObama\t23943\t0.003929721\t23943.0\n22897\t-78.387517\t37.312065000000004\tFarmville town\tVA\tVirginia\tPrince Edward County\t7787\t24.1\t32.4\t11.4\t19397\t155165\t0.5555\t23901\tObama\t23901\t0.021549812999999998\t23901.0\n22898\t-77.334336\t37.246579\tFort Lee CDP\tVA\tVirginia\tPrince George County\t6224\t22.0\t30.8\t14.2\t17987\t104167\t0.4357\t23801\tObama\t23801\t0.017224353\t23801.0\n22899\t-77.576789\t38.7611\tLinton Hall CDP\tVA\tVirginia\tPrince William County\t21507\t31.7\t51.1\t5.8\t38845\t379620\t0.5734\t20136\tObama\t20136\t0.059518662\t20136.0\n22900\t-77.520434\t38.78018\tBull Run CDP\tVA\tVirginia\tPrince William County\t15094\t29.7\t35.3\t6.7\t30155\t205471\t0.5734\t20109\tObama\t20109\t0.041771269\t20109.0\n22901\t-77.44968399999999\t38.788129999999995\tYorkshire CDP\tVA\tVirginia\tPrince William County\t7765\t32.3\t17.0\t7.4\t25039\t242298\t0.5734\t20111\tObama\t20111\t0.02148893\t20111.0\n22902\t-77.323227\t38.566577\tDumfries town\tVA\tVirginia\tPrince William County\t5454\t27.8\t14.3\t8.8\t20480\t168676\t0.5734\t22026\tObama\t22026\t0.015093448\t22026.0\n22903\t-77.34462099999999\t38.647855\tDale City CDP\tVA\tVirginia\tPrince William County\t67952\t33.1\t27.1\t8.1\t29160\t262563\t0.5734\t22193\tObama\t22193\t0.18805096699999999\t22193.0\n22904\t-77.62391600000001\t38.794698\tGainesville CDP\tVA\tVirginia\tPrince William County\t14866\t37.9\t39.9\t6.0\t45502\t371253\t0.5734\t20155\tObama\t20155\t0.041140300000000005\t20155.0\n22905\t-77.319906\t38.547571999999995\tTriangle CDP\tVA\tVirginia\tPrince William County\t7458\t32.3\t20.9\t11.9\t25283\t253846\t0.5734\t22026\tObama\t22026\t0.020639335\t22026.0\n22906\t-77.340282\t38.611232\tMontclair CDP\tVA\tVirginia\tPrince William County\t21661\t37.7\t55.2\t7.0\t38054\t331763\t0.5734\t22026\tObama\t22026\t0.059944843\t22026.0\n22907\t-77.57526\t38.693832\tNokesville CDP\tVA\tVirginia\tPrince William County\t1333\t44.0\t24.8\t8.6\t36898\t378322\t0.5734\t20181\tObama\t20181\t0.0036889559999999997\t20181.0\n22908\t-77.290151\t38.522366\tQuantico town\tVA\tVirginia\tPrince William County\t486\t35.0\t19.6\t12.6\t23679\t152778\t0.5734\t22134\tObama\t22134\t0.001344961\t22134.0\n22909\t-77.495994\t38.792567\tSudley CDP\tVA\tVirginia\tPrince William County\t9006\t35.8\t34.9\t6.2\t32241\t252115\t0.5734\t20109\tObama\t20109\t0.024923284\t20109.0\n22910\t-77.482095\t38.780901\tLoch Lomond CDP\tVA\tVirginia\tPrince William County\t3556\t37.0\t21.3\t7.5\t27443\t271033\t0.5734\t20110\tObama\t20110\t0.009840906\t20110.0\n22911\t-77.635987\t38.811702000000004\tHaymarket town\tVA\tVirginia\tPrince William County\t1130\t33.3\t37.6\t5.8\t36646\t288194\t0.5734\t20155\tObama\t20155\t0.003127172\t20155.0\n22912\t-77.261652\t38.638048\tWoodbridge CDP\tVA\tVirginia\tPrince William County\t40101\t32.6\t19.7\t8.4\t26171\t223187\t0.5734\t22191\tObama\t22191\t0.11097586300000001\t22191.0\n22913\t-77.31316899999999\t38.689597\tLake Ridge CDP\tVA\tVirginia\tPrince William County\t32929\t35.8\t50.4\t6.9\t37782\t288370\t0.5734\t22192\tObama\t22192\t0.091128006\t22192.0\n22914\t-77.49605600000001\t38.781962\tWest Gate CDP\tVA\tVirginia\tPrince William County\t7918\t30.5\t18.0\t8.4\t22824\t240829\t0.5734\t20109\tObama\t20109\t0.021912342999999997\t20109.0\n22915\t-77.257494\t38.684164\tOccoquan town\tVA\tVirginia\tPrince William County\t786\t39.2\t39.5\t8.9\t39065\t225510\t0.5734\t22125\tObama\t22125\t0.002175183\t22125.0\n22916\t-80.762599\t37.052861\tPulaski town\tVA\tVirginia\tPulaski County\t8831\t43.2\t11.2\t17.1\t19743\t95447\t0.3605\t24301\tObama\t24301\t0.024438988\t24301.0\n22917\t-80.688668\t37.099529\tDublin town\tVA\tVirginia\tPulaski County\t2435\t39.1\t18.5\t13.6\t22540\t121167\t0.3605\t24084\tObama\t24084\t0.006738641\t24084.0\n22918\t-80.557652\t37.14728\tFairlawn CDP\tVA\tVirginia\tPulaski County\t2431\t43.7\t18.0\t10.2\t26484\t116773\t0.3605\t24142\tObama\t24142\t0.006727571\t24142.0\n22919\t-78.16062600000001\t38.712126\tWashington town\tVA\tVirginia\tRappahannock County\t181\t51.5\t25.9\t6.8\t26786\t320000\t0.4544\t22747\tObama\t22747\t0.000500901\t22747.0\n22920\t-76.760551\t37.960251\tWarsaw town\tVA\tVirginia\tRichmond County\t1545\t43.4\t18.8\t6.8\t22020\t159743\t0.4175\t22572\tObama\t22572\t0.0042756470000000005\t22572.0\n22921\t-80.00717900000001\t37.225248\tCave Spring CDP\tVA\tVirginia\tRoanoke County\t26333\t43.9\t45.4\t6.1\t34981\t205684\t0.3653\t24018\tObama\t24018\t0.072874178\t24018.0\n22922\t-79.888824\t37.274577\tVinton town\tVA\tVirginia\tRoanoke County\t8085\t39.9\t12.3\t6.3\t23044\t139873\t0.3653\t24179\tObama\t24179\t0.022374501\t24179.0\n22923\t-79.932286\t37.362041\tHollins CDP\tVA\tVirginia\tRoanoke County\t14704\t46.0\t24.5\t7.6\t27601\t166789\t0.3653\t24020\tObama\t24020\t0.04069198\t24020.0\n22924\t-79.451436\t37.634662\tGlasgow town\tVA\tVirginia\tRockbridge County\t1041\t43.3\t8.3\t9.6\t20475\t106618\t0.4017\t24555\tObama\t24555\t0.002880873\t24555.0\n22925\t-79.507085\t37.990638\tGoshen town\tVA\tVirginia\tRockbridge County\t457\t45.3\t21.1\t7.1\t21082\t136806\t0.4017\t24439\tObama\t24439\t0.001264706\t24439.0\n22926\t-78.968158\t38.385953\tBridgewater town\tVA\tVirginia\tRockingham County\t5400\t35.5\t41.2\t6.7\t23023\t208307\t0.2887\t22812\tObama\t22812\t0.014944008\t22812.0\n22927\t-78.824443\t38.268115\tGrottoes town\tVA\tVirginia\tRockingham County\t2403\t35.8\t13.4\t5.9\t23398\t155519\t0.2887\t24441\tObama\t24441\t0.0066500840000000006\t24441.0\n22928\t-78.938909\t38.417846000000004\tDayton town\tVA\tVirginia\tRockingham County\t1639\t39.4\t28.1\t5.4\t21002\t210560\t0.2887\t22821\tObama\t22821\t0.004535783\t22821.0\n22929\t-78.772885\t38.635329\tTimberville town\tVA\tVirginia\tRockingham County\t1939\t42.8\t11.4\t7.5\t19983\t146403\t0.2887\t22853\tObama\t22853\t0.0053660059999999996\t22853.0\n22930\t-78.617077\t38.413558\tElkton town\tVA\tVirginia\tRockingham County\t2036\t41.6\t9.5\t7.7\t22199\t146441\t0.2887\t22827\tObama\t22827\t0.005634444000000001\t22827.0\n22931\t-78.799603\t38.609744\tBroadway town\tVA\tVirginia\tRockingham County\t3127\t41.8\t16.7\t6.7\t20375\t158828\t0.2887\t22815\tObama\t22815\t0.008653688\t22815.0\n22932\t-78.940753\t38.358329\tMount Crawford town\tVA\tVirginia\tRockingham County\t339\t38.5\t31.5\t5.8\t24398\t308333\t0.2887\t22841\tObama\t22841\t0.0009381519999999999\t22841.0\n22933\t-78.72025\t38.420795\tMassanutten CDP\tVA\tVirginia\tRockingham County\t2278\t42.0\t39.4\t5.8\t25171\t209035\t0.2887\t22840\tObama\t22840\t0.0063041569999999995\t22840.0\n22934\t-82.077229\t36.899182\tLebanon town\tVA\tVirginia\tRussell County\t3327\t42.7\t17.2\t12.6\t20550\t131552\t0.3076\t24266\tObama\t24266\t0.009207169\t24266.0\n22935\t-82.287717\t36.8782\tCastlewood CDP\tVA\tVirginia\tRussell County\t1940\t44.6\t17.0\t10.1\t17945\t105078\t0.3076\t24224\tObama\t24224\t0.005368773\t24224.0\n22936\t-81.976276\t37.016178000000004\tHonaker town\tVA\tVirginia\tRussell County\t1383\t42.6\t8.6\t13.4\t13918\t90972\t0.3076\t24260\tObama\t24260\t0.003827326\t24260.0\n22937\t-82.152568\t36.943363\tCleveland town\tVA\tVirginia\tRussell County\t142\t44.8\t7.7\t15.4\t14102\t85000\t0.3076\t24225\tObama\t24225\t0.00039297199999999995\t24225.0\n22938\t-82.46809\t36.828294\tDungannon town\tVA\tVirginia\tScott County\t283\t42.0\t9.1\t11.3\t11556\t63333\t0.2397\t24245\tObama\t24245\t0.0007831769999999999\t24245.0\n22939\t-82.560025\t36.621766\tWeber City town\tVA\tVirginia\tScott County\t1278\t50.6\t14.5\t8.2\t19268\t114545\t0.2397\t24290\tObama\t24290\t0.003536749\t24290.0\n22940\t-82.74500400000001\t36.678057\tClinchport town\tVA\tVirginia\tScott County\t68\t45.5\t3.9\t14.3\t15917\t85000\t0.2397\t24244\tObama\t24244\t0.000188184\t24244.0\n22941\t-82.58060400000001\t36.639247\tGate City town\tVA\tVirginia\tScott County\t3113\t44.6\t18.2\t11.8\t20524\t108558\t0.2397\t24251\tObama\t24251\t0.008614944\t24251.0\n22942\t-82.416105\t36.751605\tNickelsville town\tVA\tVirginia\tScott County\t415\t45.1\t7.2\t11.6\t16320\t98333\t0.2397\t24271\tObama\t24271\t0.001148475\t24271.0\n22943\t-82.796728\t36.72075\tDuffield town\tVA\tVirginia\tScott County\t80\t42.1\t13.6\t15.0\t17322\t118750\t0.2397\t24244\tObama\t24244\t0.00022139299999999999\t24244.0\n22944\t-78.439596\t38.946739\tToms Brook town\tVA\tVirginia\tShenandoah County\t293\t43.4\t19.8\t9.1\t23667\t195588\t0.3339\t22660\tObama\t22660\t0.000810851\t22660.0\n22945\t-78.671215\t38.646026\tNew Market town\tVA\tVirginia\tShenandoah County\t2065\t46.0\t26.4\t8.0\t24739\t189130\t0.3339\t22844\tObama\t22844\t0.005714699\t22844.0\n22946\t-78.354512\t38.994124\tStrasburg town\tVA\tVirginia\tShenandoah County\t5641\t40.0\t12.7\t10.0\t22485\t169420\t0.3339\t22657\tObama\t22657\t0.015610953\t22657.0\n22947\t-78.56364\t38.823363\tEdinburg town\tVA\tVirginia\tShenandoah County\t864\t45.5\t18.1\t9.4\t23704\t207979\t0.3339\t22824\tObama\t22824\t0.002391041\t22824.0\n22948\t-78.638746\t38.750671999999994\tMount Jackson town\tVA\tVirginia\tShenandoah County\t1851\t40.8\t18.6\t10.0\t20869\t157853\t0.3339\t22842\tObama\t22842\t0.005122474\t22842.0\n22949\t-78.766805\t38.816412\tBasye-Bryce Mountain CDP\tVA\tVirginia\tShenandoah County\t1265\t50.7\t25.8\t10.7\t25438\t178676\t0.3339\t22810\tObama\t22810\t0.003500772\t22810.0\n22950\t-78.51674399999999\t38.875566\tWoodstock town\tVA\tVirginia\tShenandoah County\t5251\t44.2\t21.7\t9.9\t23638\t199417\t0.3339\t22664\tObama\t22664\t0.014531664\t22664.0\n22951\t-81.513601\t36.838826\tMarion town\tVA\tVirginia\tSmyth County\t5916\t43.5\t15.9\t9.8\t19901\t112739\t0.3264\t24354\tObama\t24354\t0.016371991000000002\t24354.0\n22952\t-81.683725\t36.801121\tChilhowie town\tVA\tVirginia\tSmyth County\t1658\t46.5\t12.4\t12.4\t18553\t133811\t0.3264\t24319\tObama\t24319\t0.004588364\t24319.0\n22953\t-81.759169\t36.87827\tSaltville town\tVA\tVirginia\tSmyth County\t2097\t43.9\t8.7\t14.7\t19254\t96408\t0.3264\t24370\tObama\t24370\t0.005803256\t24370.0\n22954\t-81.39925500000001\t36.867415\tAtkins CDP\tVA\tVirginia\tSmyth County\t1128\t40.4\t5.6\t8.2\t17580\t85435\t0.3264\t24311\tObama\t24311\t0.003121637\t24311.0\n22955\t-81.591865\t36.792496\tAdwolf CDP\tVA\tVirginia\tSmyth County\t1468\t44.6\t14.6\t10.4\t22335\t128699\t0.3264\t24319\tObama\t24319\t0.004062556\t24319.0\n22956\t-81.413292\t36.748353\tSugar Grove CDP\tVA\tVirginia\tSmyth County\t741\t40.0\t6.0\t12.5\t18389\t83611\t0.3264\t24375\tObama\t24375\t0.00205065\t24375.0\n22957\t-77.12479\t36.626188\tNewsoms town\tVA\tVirginia\tSouthampton County\t305\t44.0\t13.6\t12.0\t18926\t121196\t0.479\t23874\tObama\t23874\t0.00084406\t23874.0\n22958\t-77.0619\t36.712199\tCourtland town\tVA\tVirginia\tSouthampton County\t1395\t44.7\t23.3\t9.2\t22445\t159491\t0.479\t23837\tObama\t23837\t0.003860535\t23837.0\n22959\t-77.198986\t36.577846\tBoykins town\tVA\tVirginia\tSouthampton County\t647\t45.3\t12.4\t12.6\t15100\t115741\t0.479\t23827\tObama\t23827\t0.001790514\t23827.0\n22960\t-77.250107\t36.569703999999994\tBranchville town\tVA\tVirginia\tSouthampton County\t128\t44.7\t12.1\t12.5\t15133\t112500\t0.479\t23828\tObama\t23828\t0.00035422800000000005\t23828.0\n22961\t-76.897802\t36.905165999999994\tIvor town\tVA\tVirginia\tSouthampton County\t374\t44.0\t15.0\t10.3\t19291\t148864\t0.479\t23866\tObama\t23866\t0.001035011\t23866.0\n22962\t-77.201286\t36.709340000000005\tCapron town\tVA\tVirginia\tSouthampton County\t175\t45.8\t15.4\t11.0\t20938\t118269\t0.479\t23829\tObama\t23829\t0.00048429699999999996\t23829.0\n22963\t-77.588145\t38.198168\tSpotsylvania Courthouse CDP\tVA\tVirginia\tSpotsylvania County\t4249\t35.6\t19.1\t5.8\t25724\t224516\t0.4341\t22553\tObama\t22553\t0.01175872\t22553.0\n22964\t-77.465462\t38.331694\tFalmouth CDP\tVA\tVirginia\tStafford County\t4224\t36.6\t25.4\t6.6\t30657\t242222\t0.4487\t22401\tObama\t22401\t0.011689535\t22401.0\n22965\t-77.307918\t38.524345000000004\tQuantico Station CDP\tVA\tVirginia\tStafford County\t6283\t22.5\t47.9\t13.8\t18206\t42500\t0.4487\t22134\tObama\t22134\t0.01738763\t22134.0\n22966\t-77.37315699999999\t38.466496\tAquia Harbour CDP\tVA\tVirginia\tStafford County\t8716\t39.9\t43.6\t6.5\t36837\t343687\t0.4487\t22134\tObama\t22134\t0.024120736\t22134.0\n22967\t-76.924048\t37.036419\tDendron town\tVA\tVirginia\tSurry County\t326\t42.3\t18.3\t8.2\t18462\t136111\t0.598\t23839\tObama\t23839\t0.000902175\t23839.0\n22968\t-76.833138\t37.13709\tSurry town\tVA\tVirginia\tSurry County\t262\t44.4\t16.4\t12.4\t18949\t149038\t0.598\t23846\tObama\t23846\t0.000725061\t23846.0\n22969\t-76.966501\t37.22726\tClaremont town\tVA\tVirginia\tSurry County\t324\t46.9\t16.0\t16.7\t18752\t173611\t0.598\t23899\tObama\t23899\t0.00089664\t23899.0\n22970\t-77.09526600000001\t37.034044\tWaverly town\tVA\tVirginia\tSussex County\t2168\t41.3\t12.6\t15.9\t18877\t110278\t0.6173\t23890\tObama\t23890\t0.005999742\t23890.0\n22971\t-76.987489\t36.96863\tWakefield town\tVA\tVirginia\tSussex County\t893\t42.5\t9.3\t16.0\t16282\t109211\t0.6173\t23888\tObama\t23888\t0.002471296\t23888.0\n22972\t-77.40009599999999\t36.947959999999995\tStony Creek town\tVA\tVirginia\tSussex County\t225\t46.0\t15.2\t6.1\t20498\t113750\t0.6173\t23882\tObama\t23882\t0.0006226669999999999\t23882.0\n22973\t-81.266327\t37.237088\tBluefield town\tVA\tVirginia\tTazewell County\t5057\t46.6\t22.9\t7.4\t23746\t124067\t0.2065\t24613\tObama\t24613\t0.013994787\t24613.0\n22974\t-81.857215\t37.095109\tRaven CDP\tVA\tVirginia\tTazewell County\t2540\t42.0\t9.2\t9.8\t13644\t77447\t0.2065\t24612\tObama\t24612\t0.007029219000000001\t24612.0\n22975\t-81.763205\t37.086884000000005\tCedar Bluff town\tVA\tVirginia\tTazewell County\t1081\t43.2\t13.3\t8.4\t16556\t101302\t0.2065\t24609\tObama\t24609\t0.0029915690000000003\t24609.0\n22976\t-81.343135\t37.306825\tPocahontas town\tVA\tVirginia\tTazewell County\t425\t45.3\t6.3\t10.6\t15837\t67500\t0.2065\t24635\tObama\t24635\t0.001176149\t24635.0\n22977\t-81.755476\t37.064833\tClaypool Hill CDP\tVA\tVirginia\tTazewell County\t1708\t45.1\t19.9\t8.4\t19554\t143373\t0.2065\t24609\tObama\t24609\t0.004726734000000001\t24609.0\n22978\t-81.802819\t37.095093\tRichlands town\tVA\tVirginia\tTazewell County\t4314\t45.3\t12.8\t9.4\t16906\t89491\t0.2065\t24641\tObama\t24641\t0.011938602\t24641.0\n22979\t-81.516116\t37.122642\tTazewell town\tVA\tVirginia\tTazewell County\t4206\t45.3\t20.9\t18.8\t21162\t114447\t0.2065\t24651\tObama\t24651\t0.011639722\t24651.0\n22980\t-78.185138\t38.924385\tFront Royal town\tVA\tVirginia\tWarren County\t15007\t38.7\t17.1\t7.3\t21709\t193152\t0.3864\t22630\tObama\t22630\t0.041530505\t22630.0\n22981\t-81.97027\t36.70864\tAbingdon town\tVA\tVirginia\tWashington County\t8404\t46.0\t30.7\t11.3\t24891\t143024\t0.2761\t24210\tObama\t24210\t0.023257304\t24210.0\n22982\t-81.77275\t36.790212\tGlade Spring town\tVA\tVirginia\tWashington County\t1504\t45.4\t14.4\t10.2\t19348\t107440\t0.2761\t24340\tObama\t24340\t0.004162183\t24340.0\n22983\t-81.788845\t36.632715000000005\tDamascus town\tVA\tVirginia\tWashington County\t1010\t44.2\t13.8\t9.7\t16981\t108565\t0.2761\t24236\tObama\t24236\t0.002795083\t24236.0\n22984\t-81.85127\t36.771738\tEmory-Meadow View CDP\tVA\tVirginia\tWashington County\t2507\t34.9\t23.2\t10.0\t19584\t113358\t0.2761\t24361\tObama\t24361\t0.006937894\t24361.0\n22985\t-76.998435\t38.256833\tColonial Beach town\tVA\tVirginia\tWestmoreland County\t3308\t46.6\t11.2\t8.9\t22897\t146839\t0.5289\t22443\tObama\t22443\t0.009154589\t22443.0\n22986\t-76.822869\t38.094034\tMontross town\tVA\tVirginia\tWestmoreland County\t290\t48.0\t18.5\t5.3\t19447\t160526\t0.5289\t22520\tObama\t22520\t0.000802549\t22520.0\n22987\t-82.468065\t36.944813\tCoeburn town\tVA\tVirginia\tWise County\t2108\t41.9\t9.9\t15.3\t16334\t96053\t0.2504\t24230\tObama\t24230\t0.005833698000000001\t24230.0\n22988\t-82.78791899999999\t36.909881\tAppalachia town\tVA\tVirginia\tWise County\t1660\t42.0\t11.5\t12.8\t15779\t63525\t0.2504\t24216\tObama\t24216\t0.004593899\t24216.0\n22989\t-82.309149\t36.90824\tSt. Paul town\tVA\tVirginia\tWise County\t925\t42.8\t13.6\t10.5\t15981\t97391\t0.2504\t24283\tObama\t24283\t0.002559853\t24283.0\n22990\t-82.58046\t36.976696999999994\tWise town\tVA\tVirginia\tWise County\t3176\t39.0\t20.2\t8.3\t19571\t115441\t0.2504\t24293\tObama\t24293\t0.008789291\t24293.0\n22991\t-82.607212\t37.126212\tPound town\tVA\tVirginia\tWise County\t1080\t37.0\t11.3\t10.5\t15332\t94833\t0.2504\t24279\tObama\t24279\t0.002988802\t24279.0\n22992\t-82.77660300000001\t36.862363\tBig Stone Gap town\tVA\tVirginia\tWise County\t5781\t38.6\t19.0\t7.8\t17309\t114960\t0.2504\t24219\tObama\t24219\t0.015998391\t24219.0\n22993\t-80.96818\t36.980109999999996\tMax Meadows CDP\tVA\tVirginia\tWythe County\t525\t39.6\t11.1\t11.8\t19597\t127404\t0.3061\t24360\tObama\t24360\t0.00145289\t24360.0\n22994\t-80.951309\t36.94399\tFort Chiswell CDP\tVA\tVirginia\tWythe County\t1016\t43.0\t11.9\t14.0\t20757\t147581\t0.3061\t24360\tObama\t24360\t0.002811687\t24360.0\n22995\t-81.276324\t36.901117\tRural Retreat town\tVA\tVirginia\tWythe County\t1386\t40.4\t14.4\t11.6\t18771\t121449\t0.3061\t24368\tObama\t24368\t0.003835629\t24368.0\n22996\t-81.087285\t36.953396000000005\tWytheville town\tVA\tVirginia\tWythe County\t7759\t46.6\t24.4\t12.4\t22893\t142319\t0.3061\t24382\tObama\t24382\t0.021472325\t24382.0\n22997\t-76.514652\t37.235246999999994\tYorktown CDP\tVA\tVirginia\tYork County\t247\t45.5\t24.7\t5.5\t25638\t180357\t0.3883\t23690\tObama\t23690\t0.00068355\t23690.0\n22998\t-77.08606999999999\t38.818475\tAlexandria city\tVA\tVirginia\tAlexandria city\t145210\t36.7\t60.6\t6.4\t43378\t350274\t0.7111\t22302\tObama\t22302\t0.40185544100000004\t22302.0\n22999\t-79.520222\t37.33785\tBedford city\tVA\tVirginia\tBedford city\t6187\t43.5\t15.6\t16.5\t19420\t143325\t0.4367\t24523\tObama\t24523\t0.017121959\t24523.0\n23000\t-82.160763\t36.618083\tBristol city\tVA\tVirginia\tBristol city\t17619\t44.1\t20.9\t12.8\t20956\t111889\t0.3373\t24201\tObama\t24201\t0.048758977\t24201.0\n23001\t-79.356604\t37.731547\tBuena Vista city\tVA\tVirginia\tBuena Vista city\t6544\t39.0\t10.8\t10.6\t20037\t123205\t0.3638\t24416\tObama\t24416\t0.018109924\t24416.0\n23002\t-78.485512\t38.037515\tCharlottesville city\tVA\tVirginia\tCharlottesville city\t41314\t29.0\t47.6\t7.5\t22552\t197358\t0.7574\t22902\tObama\t22902\t0.11433273\t22902.0\n23003\t-76.302348\t36.677457000000004\tChesapeake city\tVA\tVirginia\tChesapeake city\t223279\t36.1\t29.0\t9.0\t26291\t214757\t0.4985\t23322\tObama\t23322\t0.617904284\t23322.0\n23004\t-77.397138\t37.2651\tColonial Heights city\tVA\tVirginia\tColonial Heights city\t17803\t42.0\t22.6\t8.1\t28420\t153653\t0.295\t23834\tObama\t23834\t0.04926818\t23834.0\n23005\t-79.986743\t37.778617\tCovington city\tVA\tVirginia\tCovington city\t6030\t42.3\t8.0\t10.1\t20233\t94372\t0.5661\t24426\tObama\t24426\t0.016687475\t24426.0\n23006\t-79.408759\t36.583127000000005\tDanville city\tVA\tVirginia\tDanville city\t44749\t42.5\t17.6\t16.0\t20102\t100018\t0.6047\t24540\tObama\t24540\t0.12383877900000001\t24540.0\n23007\t-77.535663\t36.695333000000005\tEmporia city\tVA\tVirginia\tEmporia city\t5778\t42.1\t18.5\t17.1\t19215\t115966\t0.6651\t23847\tObama\t23847\t0.015990088\t23847.0\n23008\t-77.30006\t38.853341\tFairfax city\tVA\tVirginia\tFairfax city\t24723\t39.3\t51.2\t6.7\t39304\t353983\t0.5719\t22030\tObama\t22030\t0.068418649\t22030.0\n23009\t-77.174631\t38.884377\tFalls Church city\tVA\tVirginia\tFalls Church city\t11472\t42.1\t68.4\t7.7\t57356\t471554\t0.6893\t22046\tObama\t22046\t0.031747713999999996\t22046.0\n23010\t-76.938252\t36.682551000000004\tFranklin city\tVA\tVirginia\tFranklin city\t8556\t42.4\t20.5\t14.4\t21760\t155586\t0.6498\t23851\tObama\t23851\t0.02367795\t23851.0\n23011\t-77.487003\t38.299049\tFredericksburg city\tVA\tVirginia\tFredericksburg city\t22915\t31.5\t36.2\t11.2\t27669\t247216\t0.6235\t22401\tObama\t22401\t0.063415174\t22401.0\n23012\t-80.917505\t36.6662\tGalax city\tVA\tVirginia\tGalax city\t6842\t42.4\t11.5\t12.2\t19775\t104989\t0.3953\t24333\tObama\t24333\t0.018934611\t24333.0\n23013\t-76.366525\t37.053579\tHampton city\tVA\tVirginia\tHampton city\t146762\t34.8\t25.6\t10.3\t23291\t166241\t0.7064\t23669\tObama\t23669\t0.40615046\t23669.0\n23014\t-78.87347700000001\t38.436165\tHarrisonburg city\tVA\tVirginia\tHarrisonburg city\t46493\t25.2\t37.2\t11.7\t18948\t196418\t0.555\t22801\tObama\t22801\t0.12866514\t22801.0\n23015\t-77.29841\t37.291596000000006\tHopewell city\tVA\tVirginia\tHopewell city\t23344\t36.1\t12.9\t13.1\t20758\t128955\t0.5735\t23860\tObama\t23860\t0.064602393\t23860.0\n23016\t-79.44404200000001\t37.782451\tLexington city\tVA\tVirginia\tLexington city\t7215\t24.5\t49.9\t10.9\t22970\t184833\t0.5529999999999999\t24450\tObama\t24450\t0.019966855\t24450.0\n23017\t-79.190999\t37.400359\tLynchburg city\tVA\tVirginia\tLynchburg city\t73430\t35.2\t30.3\t10.4\t21851\t137762\t0.4376\t24501\tObama\t24501\t0.203210833\t24501.0\n23018\t-77.483928\t38.747996\tManassas city\tVA\tVirginia\tManassas city\t36476\t32.6\t33.2\t9.0\t30536\t266374\t0.5578\t20110\tObama\t20110\t0.100944006\t20110.0\n23019\t-77.462623\t38.777228\tManassas Park city\tVA\tVirginia\tManassas Park city\t13364\t32.3\t24.6\t6.7\t27897\t230749\t0.6183\t20111\tObama\t20111\t0.036983652\t20111.0\n23020\t-79.86363399999999\t36.682655\tMartinsville city\tVA\tVirginia\tMartinsville city\t14560\t43.8\t20.8\t19.9\t20445\t114087\t0.6135\t24112\tObama\t24112\t0.040293472999999996\t24112.0\n23021\t-76.518493\t37.104864\tNewport News city\tVA\tVirginia\tNewport News city\t181614\t33.0\t23.5\t10.0\t21983\t175545\t0.6432\t23602\tObama\t23602\t0.502600194\t23602.0\n23022\t-76.25514\t36.897121999999996\tNorfolk city\tVA\tVirginia\tNorfolk city\t236947\t30.1\t23.8\t13.2\t20578\t164310\t0.7202\t23509\tObama\t23509\t0.655729228\t23509.0\n23023\t-82.62624699999999\t36.931340999999996\tNorton city\tVA\tVirginia\tNorton city\t3860\t42.0\t17.8\t11.0\t18178\t97778\t0.3794\t24273\tObama\t24273\t0.010682198\t24273.0\n23024\t-77.391409\t37.204165\tPetersburg city\tVA\tVirginia\tPetersburg city\t31595\t39.7\t18.7\t16.4\t19361\t113326\t0.8979\t23805\tObama\t23805\t0.087436283\t23805.0\n23025\t-76.358091\t37.131514\tPoquoson city\tVA\tVirginia\tPoquoson city\t12083\t43.9\t36.2\t7.2\t33320\t266640\t0.2363\t23662\tObama\t23662\t0.033438601\t23662.0\n23026\t-76.342523\t36.819205\tPortsmouth city\tVA\tVirginia\tPortsmouth city\t99998\t35.6\t17.1\t13.0\t20311\t149074\t0.7077\t23707\tObama\t23707\t0.276735352\t23707.0\n23027\t-80.558236\t37.12297\tRadford city\tVA\tVirginia\tRadford city\t15711\t23.9\t34.6\t10.2\t19564\t143056\t0.506\t24141\tObama\t24141\t0.043478761\t24141.0\n23028\t-77.475627\t37.529456\tRichmond city\tVA\tVirginia\tRichmond city\t201272\t35.5\t35.6\t13.8\t23633\t137404\t0.7781\t232HH\tObama\t232HH\t0.557001917\t0.0\n23029\t-79.958147\t37.278364\tRoanoke city\tVA\tVirginia\tRoanoke city\t93391\t39.8\t22.8\t11.6\t22672\t127993\t0.601\t24016\tObama\t24016\t0.258451081\t24016.0\n23030\t-80.055684\t37.286489\tSalem city\tVA\tVirginia\tSalem city\t25550\t41.9\t23.6\t7.5\t25403\t158005\t0.3864\t24153\tObama\t24153\t0.070707296\t24153.0\n23031\t-79.06156700000001\t38.158727\tStaunton city\tVA\tVirginia\tStaunton city\t23859\t42.8\t25.0\t8.0\t23981\t153967\t0.511\t24401\tObama\t24401\t0.066027608\t24401.0\n23032\t-76.64129799999999\t36.693199\tSuffolk city\tVA\tVirginia\tSuffolk city\t85224\t37.6\t21.0\t9.3\t22835\t196212\t0.5701\t23434\tObama\t23434\t0.23584965300000002\t23434.0\n23033\t-76.061363\t36.756453\tVirginia Beach city\tVA\tVirginia\tVirginia Beach city\t436642\t34.4\t31.9\t8.1\t27065\t218152\t0.4795\t23456\tObama\t23456\t1.208366941\t23456.0\n23034\t-78.901392\t38.067214\tWaynesboro city\tVA\tVirginia\tWaynesboro city\t21537\t41.0\t25.0\t11.5\t22025\t157397\t0.4368\t22980\tObama\t22980\t0.059601685\t22980.0\n23035\t-76.707285\t37.269177\tWilliamsburg city\tVA\tVirginia\tWilliamsburg city\t13402\t24.5\t50.7\t12.4\t26553\t297656\t0.6328\t23186\tObama\t23186\t0.037088814\t23186.0\n23036\t-78.17461800000001\t39.173429\tWinchester city\tVA\tVirginia\tWinchester city\t26243\t36.2\t28.9\t8.7\t24371\t164703\t0.4948\t22601\tObama\t22601\t0.07262511099999999\t22601.0\n23037\t-119.168318\t46.822666999999996\tOthello city\tWA\tWashington\tAdams County\t6495\t26.0\t13.9\t8.7\t14904\t155329\t0.3213\t99344\tObama\t99344\t0.014664508\t99344.0\n23038\t-118.61471999999999\t46.971019\tLind town\tWA\tWashington\tAdams County\t618\t42.3\t16.1\t10.8\t17975\t119097\t0.3213\t99341\tObama\t99341\t0.00139533\t99341.0\n23039\t-118.31268899999999\t46.752961\tWashtucna town\tWA\tWashington\tAdams County\t271\t47.8\t23.3\t8.8\t23721\t123864\t0.3213\t99371\tObama\t99371\t0.000611868\t99371.0\n23040\t-118.82766799999999\t46.773481\tHatton town\tWA\tWashington\tAdams County\t95\t36.3\t15.3\t9.4\t15255\t104167\t0.3213\t99332\tObama\t99332\t0.00021449200000000002\t99332.0\n23041\t-118.375969\t47.126263\tRitzville city\tWA\tWashington\tAdams County\t1696\t48.2\t17.8\t6.0\t20502\t137500\t0.3213\t99169\tObama\t99169\t0.0038292540000000003\t99169.0\n23042\t-117.05024499999999\t46.414956\tClarkston city\tWA\tWashington\tAsotin County\t7329\t38.0\t14.8\t11.2\t18658\t139345\t0.4043\t99403\tObama\t99403\t0.016547526\t99403.0\n23043\t-117.063368\t46.40221\tWest Clarkston-Highland CDP\tWA\tWashington\tAsotin County\t4949\t39.1\t19.9\t8.2\t20112\t177510\t0.4043\t99403\tObama\t99403\t0.011173926\t99403.0\n23044\t-117.08283\t46.387516999999995\tClarkston Heights-Vineland CDP\tWA\tWashington\tAsotin County\t6675\t43.7\t27.1\t6.9\t25285\t218644\t0.4043\t99403\tObama\t99403\t0.015070915\t99403.0\n23045\t-117.042727\t46.337065\tAsotin city\tWA\tWashington\tAsotin County\t1230\t43.6\t17.9\t9.7\t20412\t196307\t0.4043\t994HH\tObama\t994HH\t0.002777112\t0.0\n23046\t-119.76279299999999\t46.203345\tProsser city\tWA\tWashington\tBenton County\t5118\t32.8\t17.7\t10.2\t18351\t145553\t0.3538\t99350\tObama\t99350\t0.011555497\t99350.0\n23047\t-119.29218600000002\t46.290015999999994\tRichland city\tWA\tWashington\tBenton County\t47859\t40.5\t42.0\t6.6\t30122\t193396\t0.3538\t99352\tObama\t99352\t0.10805676800000001\t99352.0\n23048\t-119.12756100000001\t46.136213\tHighland CDP\tWA\tWashington\tBenton County\t4022\t36.3\t24.0\t6.7\t26723\t181818\t0.3538\t99337\tObama\t99337\t0.009080932\t99337.0\n23049\t-119.48786000000001\t46.267996999999994\tBenton City\tWA\tWashington\tBenton County\t3226\t30.6\t13.6\t12.2\t17158\t115160\t0.3538\t99320\tObama\t99320\t0.007283711\t99320.0\n23050\t-119.044699\t46.169734999999996\tFinley CDP\tWA\tWashington\tBenton County\t6647\t37.4\t6.4\t12.0\t21058\t147599\t0.3538\t99337\tObama\t99337\t0.015007696000000001\t99337.0\n23051\t-119.171605\t46.201357\tKennewick city\tWA\tWashington\tBenton County\t62468\t32.8\t24.8\t8.4\t23667\t163231\t0.3538\t99336\tObama\t99336\t0.141041188\t99336.0\n23052\t-119.400152\t46.312186\tWest Richland city\tWA\tWashington\tBenton County\t11553\t34.3\t33.4\t7.1\t25197\t174835\t0.3538\t99353\tObama\t99353\t0.026084537\t99353.0\n23053\t-120.21433700000001\t47.687063\tEntiat city\tWA\tWashington\tChelan County\t1041\t33.6\t13.4\t7.2\t18216\t204911\t0.4066\t98843\tObama\t98843\t0.002350385\t98843.0\n23054\t-120.328356\t47.426075\tWenatchee city\tWA\tWashington\tChelan County\t30073\t35.8\t25.8\t9.9\t21768\t205828\t0.4066\t98801\tObama\t98801\t0.067899271\t98801.0\n23055\t-120.66340100000001\t47.594293\tLeavenworth city\tWA\tWashington\tChelan County\t2270\t44.7\t28.3\t5.2\t23281\t272143\t0.4066\t98847\tObama\t98847\t0.00512524\t98847.0\n23056\t-120.357542\t47.449328\tWest Wenatchee CDP\tWA\tWashington\tChelan County\t1879\t42.2\t31.0\t6.8\t25553\t252926\t0.4066\t98801\tObama\t98801\t0.004242434000000001\t98801.0\n23057\t-120.29198400000001\t47.391546999999996\tSouth Wenatchee CDP\tWA\tWashington\tChelan County\t2365\t27.8\t11.3\t14.4\t13521\t165432\t0.4066\t98801\tObama\t98801\t0.005339732\t98801.0\n23058\t-120.343998\t47.487959000000004\tSunnyslope CDP\tWA\tWashington\tChelan County\t3034\t46.3\t39.0\t7.7\t29442\t381720\t0.4066\t98801\tObama\t98801\t0.006850211\t98801.0\n23059\t-120.467357\t47.517731\tCashmere city\tWA\tWashington\tChelan County\t3069\t37.7\t19.3\t11.2\t19864\t210417\t0.4066\t98815\tObama\t98815\t0.006929234\t98815.0\n23060\t-120.02660300000001\t47.843619\tChelan city\tWA\tWashington\tChelan County\t3835\t42.2\t24.5\t8.6\t20692\t242986\t0.4066\t98817\tObama\t98817\t0.008658721\t98817.0\n23061\t-122.989326\t48.012687\tBlyn CDP\tWA\tWashington\tClallam County\t174\t53.1\t33.1\t9.7\t27948\t355556\t0.4881\t98382\tObama\t98382\t0.00039286\t98382.0\n23062\t-123.127874\t48.070065\tRiver Road CDP\tWA\tWashington\tClallam County\t568\t61.2\t40.1\t7.2\t30880\t290909\t0.4881\t98382\tObama\t98382\t0.001282439\t98382.0\n23063\t-123.455983\t48.114018\tPort Angeles city\tWA\tWashington\tClallam County\t19115\t41.5\t21.5\t10.2\t23359\t185378\t0.4881\t98362\tObama\t98362\t0.043158134\t98362.0\n23064\t-124.61141599999999\t48.361202\tNeah Bay CDP\tWA\tWashington\tClallam County\t904\t28.5\t10.3\t23.3\t16967\t132212\t0.4881\t98357\tObama\t98357\t0.002041065\t98357.0\n23065\t-123.08738400000001\t48.055576\tBell Hill CDP\tWA\tWashington\tClallam County\t934\t57.7\t35.3\t8.0\t28653\t295536\t0.4881\t98382\tObama\t98382\t0.0021087989999999997\t98382.0\n23066\t-123.09455200000001\t48.073445\tSequim city\tWA\tWashington\tClallam County\t4970\t56.9\t25.6\t8.6\t21838\t193012\t0.4881\t98382\tObama\t98382\t0.011221341000000001\t98382.0\n23067\t-123.17029299999999\t48.084432\tCarlsborg CDP\tWA\tWashington\tClallam County\t935\t56.7\t23.1\t7.0\t20663\t177823\t0.4881\t98382\tObama\t98382\t0.002111057\t98382.0\n23068\t-124.38878100000001\t47.952631\tForks city\tWA\tWashington\tClallam County\t3581\t33.9\t12.2\t12.9\t19482\t134607\t0.4881\t98331\tObama\t98331\t0.008085235999999999\t98331.0\n23069\t-123.370097\t48.104085\tPort Angeles East CDP\tWA\tWashington\tClallam County\t3143\t47.3\t22.3\t11.3\t22811\t176214\t0.4881\t98362\tObama\t98362\t0.007096313000000001\t98362.0\n23070\t-122.529279\t45.683955\tOrchards CDP\tWA\tWashington\tClark County\t21277\t29.6\t17.4\t17.7\t23973\t212734\t0.4894\t98682\tObama\t98682\t0.04803953\t98682.0\n23071\t-122.516653\t45.811131\tLewisville CDP\tWA\tWashington\tClark County\t1775\t38.2\t29.6\t14.0\t27988\t334706\t0.4894\t98604\tObama\t98604\t0.004007622\t98604.0\n23072\t-122.659873\t45.671853000000006\tHazel Dell South CDP\tWA\tWashington\tClark County\t6927\t36.8\t20.8\t20.3\t24180\t213761\t0.4894\t98665\tObama\t98665\t0.015639885\t98665.0\n23073\t-122.651582\t45.686034\tHazel Dell North CDP\tWA\tWashington\tClark County\t12479\t34.4\t21.9\t19.7\t25380\t236375\t0.4894\t98665\tObama\t98665\t0.028175272999999997\t98665.0\n23074\t-122.54098799999998\t45.780233\tBattle Ground city\tWA\tWashington\tClark County\t14408\t29.8\t19.4\t12.4\t23368\t218368\t0.4894\t98604\tObama\t98604\t0.032530599\t98604.0\n23075\t-122.573567\t45.687176\tFive Corners CDP\tWA\tWashington\tClark County\t18209\t35.5\t19.9\t14.8\t25775\t221901\t0.4894\t98662\tObama\t98662\t0.041112552999999996\t98662.0\n23076\t-122.620452\t45.65769\tMinnehaha CDP\tWA\tWashington\tClark County\t10013\t34.9\t22.0\t14.8\t25068\t212975\t0.4894\t98661\tObama\t98661\t0.022607502\t98661.0\n23077\t-122.60491200000001\t45.634663\tVancouver city\tWA\tWashington\tClark County\t170265\t34.3\t24.9\t17.9\t25706\t223518\t0.4894\t98661\tObama\t98661\t0.38442687200000003\t98661.0\n23078\t-122.606854\t45.676577\tWalnut Grove CDP\tWA\tWashington\tClark County\t9466\t41.9\t25.5\t14.6\t29872\t229348\t0.4894\t98662\tObama\t98662\t0.021372477\t98662.0\n23079\t-122.5999\t45.780202\tDollar Corner CDP\tWA\tWashington\tClark County\t1133\t35.1\t20.2\t13.1\t26641\t283721\t0.4894\t98686\tObama\t98686\t0.002558104\t98686.0\n23080\t-122.63166899999999\t45.737252000000005\tMount Vista CDP\tWA\tWashington\tClark County\t8560\t42.6\t38.6\t14.6\t34802\t315266\t0.4894\t98686\tObama\t98686\t0.019326896\t98686.0\n23081\t-122.4658\t45.903828999999995\tAmboy CDP\tWA\tWashington\tClark County\t2435\t32.2\t14.0\t17.3\t19882\t267330\t0.4894\t98601\tObama\t98601\t0.00549778\t98601.0\n23082\t-122.573299\t45.798156\tCherry Grove CDP\tWA\tWashington\tClark County\t2668\t30.1\t20.4\t8.6\t24535\t245812\t0.4894\t98604\tObama\t98604\t0.00602385\t98604.0\n23083\t-122.54766000000001\t45.725568\tBrush Prairie CDP\tWA\tWashington\tClark County\t2564\t43.1\t29.9\t18.9\t31137\t322941\t0.4894\t98662\tObama\t98662\t0.005789038000000001\t98662.0\n23084\t-122.663251\t45.709912\tSalmon Creek CDP\tWA\tWashington\tClark County\t20393\t38.2\t31.0\t15.6\t30180\t249445\t0.4894\t98685\tObama\t98685\t0.04604362099999999\t98685.0\n23085\t-122.667621\t45.865896\tLa Center city\tWA\tWashington\tClark County\t2394\t36.0\t24.5\t14.6\t25683\t285440\t0.4894\t98629\tObama\t98629\t0.005405209\t98629.0\n23086\t-122.732945\t45.810894\tRidgefield city\tWA\tWashington\tClark County\t4358\t40.3\t27.1\t8.1\t24721\t305926\t0.4894\t98642\tObama\t98642\t0.009839558\t98642.0\n23087\t-122.481219\t45.736026\tHockinson CDP\tWA\tWashington\tClark County\t5758\t38.9\t33.7\t15.8\t30139\t395421\t0.4894\t98606\tObama\t98606\t0.013000498999999999\t98606.0\n23088\t-122.430172\t45.59438\tCamas city\tWA\tWashington\tClark County\t17156\t34.5\t32.4\t13.8\t33710\t319981\t0.4894\t98607\tObama\t98607\t0.038735074\t98607.0\n23089\t-122.556095\t45.756374\tMeadow Glade CDP\tWA\tWashington\tClark County\t2931\t39.8\t27.9\t14.6\t27878\t324121\t0.4894\t98604\tObama\t98604\t0.0066176559999999995\t98604.0\n23090\t-122.61143500000001\t45.71354\tBarberton CDP\tWA\tWashington\tClark County\t5845\t41.4\t31.3\t11.7\t31683\t313056\t0.4894\t98686\tObama\t98686\t0.013196929\t98686.0\n23091\t-122.69118600000002\t45.691124\tLake Shore CDP\tWA\tWashington\tClark County\t7346\t43.1\t35.4\t15.1\t34002\t251708\t0.4894\t98685\tObama\t98685\t0.016585909\t98685.0\n23092\t-122.710342\t45.713646999999995\tFelida CDP\tWA\tWashington\tClark County\t7786\t41.6\t41.3\t15.7\t35118\t351105\t0.4894\t98685\tObama\t98685\t0.017579348\t98685.0\n23093\t-122.473459\t45.7866\tVenersborg CDP\tWA\tWashington\tClark County\t3973\t37.8\t30.2\t15.8\t28535\t361765\t0.4894\t98604\tObama\t98604\t0.008970299000000001\t98604.0\n23094\t-122.340639\t45.581426\tWashougal city\tWA\tWashington\tClark County\t13475\t36.6\t20.6\t14.9\t24845\t218391\t0.4894\t98671\tObama\t98671\t0.030424057\t98671.0\n23095\t-122.490344\t45.646338\tMill Plain CDP\tWA\tWashington\tClark County\t13792\t30.0\t31.6\t10.6\t27440\t245294\t0.4894\t98682\tObama\t98682\t0.031139785\t98682.0\n23096\t-122.406729\t45.865229\tYacolt town\tWA\tWashington\tClark County\t1355\t29.9\t15.6\t16.5\t20748\t259286\t0.4894\t98675\tObama\t98675\t0.0030593390000000003\t98675.0\n23097\t-117.977317\t46.316891\tDayton city\tWA\tWashington\tColumbia County\t2647\t43.4\t18.5\t11.6\t21295\t139732\t0.2855\t99328\tObama\t99328\t0.005976436\t99328.0\n23098\t-118.12505900000001\t46.518471999999996\tStarbuck town\tWA\tWashington\tColumbia County\t137\t46.7\t22.8\t8.5\t20967\t130556\t0.2855\t99359\tObama\t99359\t0.000309321\t99359.0\n23099\t-122.743457\t45.915271999999995\tWoodland city\tWA\tWashington\tCowlitz County\t4643\t35.0\t14.2\t13.0\t21269\t189052\t0.5093\t98674\tObama\t98674\t0.010483035\t98674.0\n23100\t-122.957481\t46.17927\tLongview Heights CDP\tWA\tWashington\tCowlitz County\t3635\t41.8\t24.3\t11.9\t27763\t226569\t0.5093\t98632\tObama\t98632\t0.008207158\t98632.0\n23101\t-122.890828\t46.125065\tKelso city\tWA\tWashington\tCowlitz County\t12415\t34.7\t13.4\t16.1\t18583\t139240\t0.5093\t98626\tObama\t98626\t0.028030773\t98626.0\n23102\t-122.910851\t46.270081\tCastle Rock city\tWA\tWashington\tCowlitz County\t2379\t36.3\t10.5\t14.3\t20183\t149142\t0.5093\t98611\tObama\t98611\t0.0053713419999999994\t98611.0\n23103\t-122.962695\t46.146249\tLongview city\tWA\tWashington\tCowlitz County\t36627\t38.4\t16.2\t13.9\t22313\t168484\t0.5093\t98632\tObama\t98632\t0.08269699\t98632.0\n23104\t-122.834629\t46.007581\tKalama city\tWA\tWashington\tCowlitz County\t1960\t42.1\t18.6\t12.0\t22059\t200568\t0.5093\t98625\tObama\t98625\t0.004425317\t98625.0\n23105\t-122.98731699999999\t46.173415999999996\tWest Longview CDP\tWA\tWashington\tCowlitz County\t2968\t34.6\t15.8\t11.7\t22271\t184596\t0.5093\t98632\tObama\t98632\t0.006701195\t98632.0\n23106\t-122.916688\t46.18293\tWest Side Highway CDP\tWA\tWashington\tCowlitz County\t5128\t36.1\t16.7\t11.9\t24776\t173925\t0.5093\t98626\tObama\t98626\t0.011578075\t98626.0\n23107\t-120.27876\t47.443806\tEast Wenatchee Bench CDP\tWA\tWashington\tDouglas County\t16329\t38.2\t21.6\t8.1\t21786\t221665\t0.3457\t98802\tObama\t98802\t0.036867861\t98802.0\n23108\t-120.286546\t47.422961\tEast Wenatchee city\tWA\tWashington\tDouglas County\t6201\t38.3\t21.9\t6.2\t23506\t237749\t0.3457\t98802\tObama\t98802\t0.014000711\t98802.0\n23109\t-120.07072\t47.648033\tWaterville town\tWA\tWashington\tDouglas County\t1294\t42.7\t21.2\t7.5\t19015\t150472\t0.3457\t98843\tObama\t98843\t0.002921613\t98843.0\n23110\t-120.137708\t47.372889\tRock Island city\tWA\tWashington\tDouglas County\t921\t30.5\t9.8\t10.2\t13384\t157500\t0.3457\t98850\tObama\t98850\t0.002079448\t98850.0\n23111\t-119.63838\t47.811793\tMansfield town\tWA\tWashington\tDouglas County\t359\t45.1\t19.0\t5.6\t21160\t104327\t0.3457\t98830\tObama\t98830\t0.000810556\t98830.0\n23112\t-119.673346\t48.006161999999996\tBridgeport city\tWA\tWashington\tDouglas County\t2396\t27.3\t8.8\t13.6\t11058\t93491\t0.3457\t988HH\tObama\t988HH\t0.005409725\t0.0\n23113\t-118.73276299999999\t48.648496\tRepublic city\tWA\tWashington\tFerry County\t982\t44.4\t13.4\t11.2\t17391\t124074\t0.3762\t99166\tObama\t99166\t0.002217174\t99166.0\n23114\t-118.237205\t48.337893\tInchelium CDP\tWA\tWashington\tFerry County\t398\t38.6\t11.9\t27.7\t14416\t133750\t0.3762\t99138\tObama\t99138\t0.00089861\t99138.0\n23115\t-119.190497\t46.249469\tWest Pasco CDP\tWA\tWashington\tFranklin County\t6815\t44.2\t28.6\t7.4\t29771\t221439\t0.3709\t99336\tObama\t99336\t0.015387008999999998\t99336.0\n23116\t-119.11845100000001\t46.250116999999996\tPasco city\tWA\tWashington\tFranklin County\t55676\t29.8\t15.1\t12.1\t15803\t158650\t0.3709\t99301\tObama\t99301\t0.125706108\t99301.0\n23117\t-118.857753\t46.660971\tConnell city\tWA\tWashington\tFranklin County\t3555\t28.7\t10.8\t13.9\t16566\t103670\t0.3709\t99326\tObama\t99326\t0.008026532\t99326.0\n23118\t-118.553877\t46.643504\tKahlotus city\tWA\tWashington\tFranklin County\t258\t37.3\t14.9\t6.8\t17866\t91250\t0.3709\t99335\tObama\t99335\t0.0005825159999999999\t99335.0\n23119\t-119.156554\t46.589038\tBasin City CDP\tWA\tWashington\tFranklin County\t1044\t23.2\t5.9\t15.4\t12459\t108929\t0.3709\t99343\tObama\t99343\t0.0023571589999999997\t99343.0\n23120\t-119.001222\t46.573489\tMesa city\tWA\tWashington\tFranklin County\t445\t24.8\t7.2\t13.3\t14603\t104688\t0.3709\t99343\tObama\t99343\t0.001004728\t99343.0\n23121\t-117.597123\t46.473890999999995\tPomeroy city\tWA\tWashington\tGarfield County\t1362\t47.6\t15.9\t8.3\t18419\t106541\t0.2629\t99347\tObama\t99347\t0.003075144\t99347.0\n23122\t-119.49056000000002\t47.38901\tSoap Lake city\tWA\tWashington\tGrant County\t1855\t44.0\t12.2\t15.4\t14888\t123825\t0.3248\t98851\tObama\t98851\t0.004188247\t98851.0\n23123\t-119.50446799999999\t47.375475\tLakeview CDP\tWA\tWashington\tGrant County\t930\t39.7\t14.1\t9.9\t16425\t165741\t0.3248\t98851\tObama\t98851\t0.0020997679999999997\t98851.0\n23124\t-119.283446\t47.117934000000005\tMoses Lake city\tWA\tWashington\tGrant County\t17426\t33.8\t18.0\t10.8\t21407\t163146\t0.3248\t98837\tObama\t98837\t0.039344684\t98837.0\n23125\t-119.03746399999999\t47.930229\tElectric City town\tWA\tWashington\tGrant County\t1083\t51.6\t18.2\t8.9\t20724\t147059\t0.3248\t99133\tObama\t99133\t0.002445214\t99133.0\n23126\t-119.3172\t47.194379\tMoses Lake North CDP\tWA\tWashington\tGrant County\t4697\t23.6\t6.6\t10.6\t13606\t144365\t0.3248\t98837\tObama\t98837\t0.010604957\t98837.0\n23127\t-119.003386\t47.939661\tGrand Coulee city\tWA\tWashington\tGrant County\t1026\t47.3\t8.8\t8.9\t19386\t109539\t0.3248\t99133\tObama\t99133\t0.002316518\t99133.0\n23128\t-118.988579\t47.410546000000004\tKrupp town\tWA\tWashington\tGrant County\t65\t45.0\t13.6\t7.1\t18848\t162500\t0.3248\t98832\tObama\t98832\t0.00014675799999999998\t98832.0\n23129\t-119.290186\t47.611369\tCoulee City town\tWA\tWashington\tGrant County\t704\t48.6\t10.7\t9.2\t19960\t123214\t0.3248\t99115\tObama\t99115\t0.001589502\t99115.0\n23130\t-119.93120400000001\t46.687022\tDesert Aire CDP\tWA\tWashington\tGrant County\t1968\t26.2\t8.0\t14.7\t11153\t163051\t0.3248\t99349\tObama\t99349\t0.00444338\t99349.0\n23131\t-119.108152\t47.689549\tHartline town\tWA\tWashington\tGrant County\t152\t51.0\t22.0\t8.5\t24576\t200000\t0.3248\t99135\tObama\t99135\t0.000343188\t99135.0\n23132\t-119.855101\t47.234503000000004\tQuincy city\tWA\tWashington\tGrant County\t6271\t26.9\t15.1\t14.8\t12880\t158036\t0.3248\t98848\tObama\t98848\t0.014158758\t98848.0\n23133\t-119.629126\t46.904246\tRoyal City\tWA\tWashington\tGrant County\t2277\t22.7\t9.6\t14.2\t9496\t114286\t0.3248\t99357\tObama\t99357\t0.005141045\t99357.0\n23134\t-119.11711100000001\t47.422661\tWilson Creek town\tWA\tWashington\tGrant County\t244\t42.5\t14.3\t5.7\t18989\t150000\t0.3248\t98860\tObama\t98860\t0.000550907\t98860.0\n23135\t-119.27606000000002\t47.631021000000004\tBanks Lake South CDP\tWA\tWashington\tGrant County\t188\t48.4\t10.1\t9.3\t19810\t122917\t0.3248\t99115\tObama\t99115\t0.000424469\t99115.0\n23136\t-119.857203\t47.077936\tGeorge city\tWA\tWashington\tGrant County\t680\t32.2\t6.6\t16.1\t15900\t200000\t0.3248\t98848\tObama\t98848\t0.0015353139999999999\t98848.0\n23137\t-119.048852\t46.969923\tWarden city\tWA\tWashington\tGrant County\t3126\t24.1\t6.3\t18.1\t14697\t131651\t0.3248\t98857\tObama\t98857\t0.00705793\t98857.0\n23138\t-119.32925300000001\t47.142013\tCascade Valley CDP\tWA\tWashington\tGrant County\t2131\t36.0\t22.8\t11.9\t22319\t231757\t0.3248\t98837\tObama\t98837\t0.004811404\t98837.0\n23139\t-119.903792\t46.73584\tMattawa town\tWA\tWashington\tGrant County\t3450\t26.2\t8.0\t14.7\t11153\t163246\t0.3248\t99349\tObama\t99349\t0.007789462\t99349.0\n23140\t-119.53479399999999\t47.312940999999995\tEphrata city\tWA\tWashington\tGrant County\t7138\t38.2\t23.9\t8.0\t21106\t160903\t0.3248\t98823\tObama\t98823\t0.016116283000000002\t98823.0\n23141\t-123.815697\t46.976264\tAberdeen city\tWA\tWashington\tGrays Harbor County\t16309\t35.7\t13.8\t14.8\t19465\t141175\t0.5564\t98520\tObama\t98520\t0.036822705\t98520.0\n23142\t-123.777289\t47.061282\tAberdeen Gardens CDP\tWA\tWashington\tGrays Harbor County\t230\t41.9\t15.6\t11.0\t21640\t198611\t0.5564\t98520\tObama\t98520\t0.0005192969999999999\t98520.0\n23143\t-124.27653000000001\t47.337207\tTaholah CDP\tWA\tWashington\tGrays Harbor County\t909\t30.2\t14.4\t17.6\t13172\t120690\t0.5564\t98587\tObama\t98587\t0.002052354\t98587.0\n23144\t-123.77292299999999\t46.953897\tCosmopolis city\tWA\tWashington\tGrays Harbor County\t1760\t40.4\t13.3\t11.0\t21842\t155025\t0.5564\t98520\tObama\t98520\t0.003973754\t98520.0\n23145\t-123.529449\t47.008794\tBrady CDP\tWA\tWashington\tGrays Harbor County\t665\t43.0\t15.3\t11.4\t23635\t221094\t0.5564\t985HH\tObama\t985HH\t0.0015014470000000002\t0.0\n23146\t-123.757029\t46.969190999999995\tJunction City CDP\tWA\tWashington\tGrays Harbor County\t81\t44.6\t20.7\t14.3\t25096\t190625\t0.5564\t98520\tObama\t98520\t0.000182883\t98520.0\n23147\t-124.10392900000001\t46.865567\tCohassett Beach CDP\tWA\tWashington\tGrays Harbor County\t671\t48.5\t9.5\t10.7\t21049\t151420\t0.5564\t98595\tObama\t98595\t0.001514994\t98595.0\n23148\t-123.302145\t46.974343\tMalone-Porter CDP\tWA\tWashington\tGrays Harbor County\t528\t41.4\t12.5\t11.9\t19179\t201563\t0.5564\t98559\tObama\t98559\t0.0011921260000000002\t98559.0\n23149\t-123.234831\t46.840229\tOakville city\tWA\tWashington\tGrays Harbor County\t698\t36.2\t8.7\t13.9\t14856\t173295\t0.5564\t985XX\tObama\t985XX\t0.001575955\t0.0\n23150\t-124.15661399999999\t47.078352\tOcean City CDP\tWA\tWashington\tGrays Harbor County\t210\t52.5\t15.1\t20.3\t16699\t172917\t0.5564\t98535\tObama\t98535\t0.00047414099999999997\t98535.0\n23151\t-124.16306399999999\t47.031308\tOyehut-Hogans Corner CDP\tWA\tWashington\tGrays Harbor County\t182\t52.1\t14.7\t20.0\t16697\t167500\t0.5564\t98569\tObama\t98569\t0.000410922\t98569.0\n23152\t-124.20026999999999\t47.22518\tMoclips CDP\tWA\tWashington\tGrays Harbor County\t724\t49.6\t26.8\t9.1\t20477\t158000\t0.5564\t98571\tObama\t98571\t0.001634658\t98571.0\n23153\t-124.153754\t46.969823\tOcean Shores city\tWA\tWashington\tGrays Harbor County\t4798\t56.1\t19.9\t10.2\t25869\t219358\t0.5564\t98569\tObama\t98569\t0.010832996000000001\t98569.0\n23154\t-123.585874\t47.011928999999995\tMontesano city\tWA\tWashington\tGrays Harbor County\t3518\t40.9\t23.1\t10.4\t24438\t192718\t0.5564\t98563\tObama\t98563\t0.007942993\t98563.0\n23155\t-124.111801\t46.891731\tWestport city\tWA\tWashington\tGrays Harbor County\t2335\t47.0\t12.7\t12.7\t22999\t162054\t0.5564\t98595\tObama\t98595\t0.005271998000000001\t98595.0\n23156\t-123.40280700000001\t47.006091\tElma city\tWA\tWashington\tGrays Harbor County\t3265\t36.9\t9.5\t15.1\t19591\t165217\t0.5564\t98541\tObama\t98541\t0.007371766\t98541.0\n23157\t-124.17221299999999\t47.12068\tCopalis Beach CDP\tWA\tWashington\tGrays Harbor County\t532\t50.1\t26.4\t16.7\t21199\t155921\t0.5564\t98535\tObama\t98535\t0.0012011580000000001\t98535.0\n23158\t-123.273781\t47.058881\tMcCleary city\tWA\tWashington\tGrays Harbor County\t1630\t42.0\t10.4\t13.0\t17756\t160206\t0.5564\t98557\tObama\t98557\t0.0036802379999999997\t98557.0\n23159\t-123.98974399999999\t47.2497\tHumptulips CDP\tWA\tWashington\tGrays Harbor County\t226\t42.0\t6.5\t12.4\t16322\t161364\t0.5564\t98552\tObama\t98552\t0.000510266\t98552.0\n23160\t-123.702726\t46.970268\tCentral Park CDP\tWA\tWashington\tGrays Harbor County\t2558\t46.3\t19.1\t12.1\t23771\t192125\t0.5564\t98537\tObama\t98537\t0.005775491\t98537.0\n23161\t-123.9011\t46.988694\tHoquiam city\tWA\tWashington\tGrays Harbor County\t8909\t37.5\t11.4\t14.9\t17715\t133460\t0.5564\t98550\tObama\t98550\t0.020114873999999998\t98550.0\n23162\t-123.17093200000001\t46.807996\tChehalis Village CDP\tWA\tWashington\tGrays Harbor County\t358\t36.3\t8.9\t14.1\t14851\t175000\t0.5564\t985XX\tObama\t985XX\t0.000808298\t0.0\n23163\t-123.981252\t46.915521999999996\tMarkham CDP\tWA\tWashington\tGrays Harbor County\t345\t34.7\t14.8\t10.5\t20965\t187500\t0.5564\t98550\tObama\t98550\t0.0007789460000000001\t98550.0\n23164\t-123.473772\t47.022490999999995\tSatsop CDP\tWA\tWashington\tGrays Harbor County\t642\t38.9\t11.5\t14.1\t19695\t183333\t0.5564\t985HH\tObama\t985HH\t0.0014495170000000002\t0.0\n23165\t-123.878629\t47.402874\tNeilton CDP\tWA\tWashington\tGrays Harbor County\t369\t45.7\t14.4\t12.3\t19556\t133929\t0.5564\t98552\tObama\t98552\t0.0008331339999999999\t98552.0\n23166\t-124.089378\t46.830206\tGrayland CDP\tWA\tWashington\tGrays Harbor County\t1110\t56.2\t22.1\t11.8\t20736\t130847\t0.5564\t98547\tObama\t98547\t0.002506175\t98547.0\n23167\t-122.50568700000001\t48.187411\tCamano CDP\tWA\tWashington\tIsland County\t16357\t46.7\t28.3\t9.5\t28105\t341171\t0.5102\t98253\tObama\t98253\t0.03693108\t98253.0\n23168\t-122.67733700000001\t48.216941\tCoupeville town\tWA\tWashington\tIsland County\t1920\t47.3\t33.0\t10.7\t25168\t265347\t0.5102\t98239\tObama\t98239\t0.004335005\t98239.0\n23169\t-122.40681399999998\t48.035072\tLangley city\tWA\tWashington\tIsland County\t1070\t53.3\t42.2\t6.4\t29946\t381757\t0.5102\t98260\tObama\t98260\t0.002415862\t98260.0\n23170\t-122.66289499999999\t48.337652\tAult Field CDP\tWA\tWashington\tIsland County\t2218\t22.8\t18.8\t23.5\t17486\t204167\t0.5102\t98277\tObama\t98277\t0.005007834\t98277.0\n23171\t-122.63155400000001\t48.296095\tOak Harbor city\tWA\tWashington\tIsland County\t22188\t29.0\t24.0\t12.2\t21582\t235406\t0.5102\t98277\tObama\t98277\t0.05009639900000001\t98277.0\n23172\t-122.54625800000001\t48.018636\tFreeland CDP\tWA\tWashington\tIsland County\t1762\t52.7\t37.7\t10.6\t28511\t340000\t0.5102\t98249\tObama\t98249\t0.00397827\t98249.0\n23173\t-122.357226\t47.972590999999994\tClinton CDP\tWA\tWashington\tIsland County\t1000\t50.3\t36.4\t5.8\t29997\t461765\t0.5102\t98236\tObama\t98236\t0.002257815\t98236.0\n23174\t-122.787149\t48.122203000000006\tPort Townsend city\tWA\tWashington\tJefferson County\t9187\t50.7\t36.5\t9.8\t25797\t241789\t0.6424\t98368\tObama\t98368\t0.020742546\t98368.0\n23175\t-122.789771\t48.031763\tPort Hadlock-Irondale CDP\tWA\tWashington\tJefferson County\t3893\t40.8\t13.4\t6.0\t20395\t170528\t0.6424\t98339\tObama\t98339\t0.008789674\t98339.0\n23176\t-122.924823\t47.669102\tBrinnon CDP\tWA\tWashington\tJefferson County\t848\t59.2\t19.2\t12.4\t20337\t163750\t0.6424\t983HH\tObama\t983HH\t0.0019146270000000001\t0.0\n23177\t-122.90900400000001\t47.84024\tQuilcene CDP\tWA\tWashington\tJefferson County\t698\t43.8\t11.2\t10.2\t20500\t192763\t0.6424\t98376\tObama\t98376\t0.001575955\t98376.0\n23178\t-122.693509\t48.080658\tMarrowstone CDP\tWA\tWashington\tJefferson County\t904\t53.8\t38.5\t14.0\t27972\t514764\t0.6424\t98358\tObama\t98358\t0.002041065\t98358.0\n23179\t-122.70054499999999\t47.910036\tPort Ludlow CDP\tWA\tWashington\tJefferson County\t2343\t65.6\t43.5\t13.5\t39124\t439313\t0.6424\t98365\tObama\t98365\t0.0052900609999999995\t98365.0\n23180\t-122.23301599999999\t47.566410999999995\tMercer Island city\tWA\tWashington\tKing County\t23282\t48.1\t73.5\t6.9\t62797\t809171\t0.6907\t98040\tObama\t98040\t0.052566449\t98040.0\n23181\t-122.34441299999999\t47.469008\tBurien city\tWA\tWashington\tKing County\t33283\t40.4\t25.0\t7.3\t31109\t266170\t0.6907\t98166\tObama\t98166\t0.075146857\t98166.0\n23182\t-122.29862299999999\t47.444492\tSeaTac city\tWA\tWashington\tKing County\t27553\t35.5\t18.6\t9.0\t26784\t220554\t0.6907\t98188\tObama\t98188\t0.062209577\t98188.0\n23183\t-122.19784299999999\t47.79227\tBothell city\tWA\tWashington\tKing County\t34407\t38.3\t42.2\t7.8\t36462\t339933\t0.6907\t98021\tObama\t98021\t0.077684641\t98021.0\n23184\t-122.277628\t47.330832\tLakeland North CDP\tWA\tWashington\tKing County\t17777\t38.3\t28.5\t8.0\t32852\t267949\t0.6907\t98001\tObama\t98001\t0.040137177\t98001.0\n23185\t-122.13387\t47.571343\tEastgate CDP\tWA\tWashington\tKing County\t4762\t41.3\t49.7\t7.1\t41486\t366790\t0.6907\t98006\tObama\t98006\t0.010751715\t98006.0\n23186\t-122.075728\t47.746479\tCottage Lake CDP\tWA\tWashington\tKing County\t24359\t40.7\t58.5\t6.8\t46883\t616328\t0.6907\t98072\tObama\t98072\t0.054998116\t98072.0\n23187\t-121.91518899999998\t47.692634999999996\tLake Marcel-Stillwater CDP\tWA\tWashington\tKing County\t1434\t37.4\t33.9\t6.0\t31595\t359259\t0.6907\t98014\tObama\t98014\t0.0032377070000000003\t98014.0\n23188\t-122.213333\t47.299437\tAuburn city\tWA\tWashington\tKing County\t47818\t35.9\t19.2\t8.9\t26428\t208173\t0.6907\t98002\tObama\t98002\t0.10796419800000001\t98002.0\n23189\t-122.23135500000001\t47.720658\tInglewood-Finn Hill CDP\tWA\tWashington\tKing County\t24423\t38.3\t48.3\t6.6\t40382\t374594\t0.6907\t98034\tObama\t98034\t0.055142616\t98034.0\n23190\t-121.966477\t47.634615000000004\tAmes Lake CDP\tWA\tWashington\tKing County\t1520\t34.0\t52.8\t4.3\t57504\t616827\t0.6907\t98014\tObama\t98014\t0.003431879\t98014.0\n23191\t-121.86439299999999\t47.529945\tSnoqualmie city\tWA\tWashington\tKing County\t8689\t38.7\t48.6\t7.7\t35529\t436290\t0.6907\t98065\tObama\t98065\t0.019618155\t98065.0\n23192\t-122.173194\t47.727151\tKingsgate CDP\tWA\tWashington\tKing County\t14226\t37.1\t44.8\t6.8\t35741\t353004\t0.6907\t98034\tObama\t98034\t0.032119676\t98034.0\n23193\t-122.18186599999999\t47.328445\tLea Hill CDP\tWA\tWashington\tKing County\t14825\t33.5\t32.3\t7.8\t35976\t308264\t0.6907\t98092\tObama\t98092\t0.033472107\t98092.0\n23194\t-122.1739\t47.409588\tEast Hill-Meridian CDP\tWA\tWashington\tKing County\t32548\t37.3\t32.5\t7.0\t31662\t285358\t0.6907\t98031\tObama\t98031\t0.073487363\t98031.0\n23195\t-122.285206\t47.2779\tLakeland South CDP\tWA\tWashington\tKing County\t12340\t39.3\t28.4\t6.5\t33879\t241980\t0.6907\t98001\tObama\t98001\t0.027861437000000003\t98001.0\n23196\t-122.09192\t47.473782\tEast Renton Highlands CDP\tWA\tWashington\tKing County\t14464\t41.2\t29.7\t7.1\t34474\t311789\t0.6907\t98059\tObama\t98059\t0.032657036\t98059.0\n23197\t-122.33868899999999\t47.309965999999996\tFederal Way city\tWA\tWashington\tKing County\t88425\t33.1\t30.4\t8.5\t29978\t251701\t0.6907\t98023\tObama\t98023\t0.199647292\t98023.0\n23198\t-122.09863500000002\t47.578255\tWest Lake Sammamish CDP\tWA\tWashington\tKing County\t6125\t41.6\t64.3\t6.4\t47997\t536140\t0.6907\t98008\tObama\t98008\t0.013829117\t98008.0\n23199\t-122.018748\t47.315183000000005\tBlack Diamond city\tWA\tWashington\tKing County\t4501\t39.7\t24.3\t7.3\t35021\t290327\t0.6907\t98010\tObama\t98010\t0.010162425\t98010.0\n23200\t-121.789776\t47.495444\tNorth Bend city\tWA\tWashington\tKing County\t5091\t36.4\t38.8\t5.7\t36418\t384173\t0.6907\t98065\tObama\t98065\t0.011494536000000001\t98065.0\n23201\t-122.34348600000001\t47.434521999999994\tNormandy Park city\tWA\tWashington\tKing County\t6502\t49.0\t50.8\t6.4\t43062\t488804\t0.6907\t98148\tObama\t98148\t0.014680313\t98148.0\n23202\t-122.122222\t47.672385999999996\tRedmond city\tWA\tWashington\tKing County\t50026\t36.2\t57.5\t7.2\t46488\t403452\t0.6907\t98052\tObama\t98052\t0.112949453\t98052.0\n23203\t-122.028632\t47.679013\tUnion Hill-Novelty Hill CDP\tWA\tWashington\tKing County\t21052\t40.4\t57.8\t5.5\t46637\t670178\t0.6907\t98053\tObama\t98053\t0.04753152099999999\t98053.0\n23204\t-122.24375900000001\t47.626674\tMedina city\tWA\tWashington\tKing County\t3065\t44.0\t78.0\t3.0\t80074\t1000001\t0.6907\t98039\tObama\t98039\t0.006920203000000001\t98039.0\n23205\t-122.038326\t47.367045000000005\tMaple Valley city\tWA\tWashington\tKing County\t20638\t32.9\t36.9\t6.9\t35997\t318938\t0.6907\t98038\tObama\t98038\t0.046596785999999994\t98038.0\n23206\t-122.34245800000001\t47.75634\tShoreline city\tWA\tWashington\tKing County\t55852\t42.2\t42.7\t7.9\t33558\t321773\t0.6907\t98133\tObama\t98133\t0.12610348400000002\t98133.0\n23207\t-122.34636699999999\t47.504302\tWhite Center CDP\tWA\tWashington\tKing County\t22307\t35.5\t16.4\t9.4\t23547\t227302\t0.6907\t98146\tObama\t98146\t0.05036507900000001\t98146.0\n23208\t-122.042051\t47.53508\tIssaquah city\tWA\tWashington\tKing County\t17630\t38.3\t54.1\t6.9\t46975\t497862\t0.6907\t98027\tObama\t98027\t0.039805279\t98027.0\n23209\t-122.19108600000001\t47.685302\tKirkland city\tWA\tWashington\tKing County\t48450\t39.5\t53.0\t6.6\t51103\t426699\t0.6907\t98033\tObama\t98033\t0.109391137\t98033.0\n23210\t-122.31271699999999\t47.504171\tRiverton-Boulevard Park CDP\tWA\tWashington\tKing County\t12022\t34.9\t19.0\t8.9\t26868\t209399\t0.6907\t98168\tObama\t98168\t0.027143452000000002\t98168.0\n23211\t-121.972932\t47.736101\tDuvall city\tWA\tWashington\tKing County\t5919\t34.7\t45.2\t6.2\t38782\t376512\t0.6907\t98019\tObama\t98019\t0.013364006999999999\t98019.0\n23212\t-121.99389199999999\t47.461726\tMirrormont CDP\tWA\tWashington\tKing County\t3871\t44.1\t51.5\t6.9\t42982\t543931\t0.6907\t98027\tObama\t98027\t0.008740002\t98027.0\n23213\t-121.976128\t47.356646999999995\tRavensdale CDP\tWA\tWashington\tKing County\t2492\t37.7\t20.0\t7.0\t29674\t258333\t0.6907\t98010\tObama\t98010\t0.005626475\t98010.0\n23214\t-121.901974\t47.566829\tFall City CDP\tWA\tWashington\tKing County\t1848\t44.0\t27.2\t7.1\t34038\t328286\t0.6907\t98024\tObama\t98024\t0.004172442\t98024.0\n23215\t-121.47458200000001\t47.762307\tBaring CDP\tWA\tWashington\tKing County\t264\t45.2\t17.6\t12.8\t30337\t130833\t0.6907\t98224\tObama\t98224\t0.0005960630000000001\t98224.0\n23216\t-122.32406\t47.622539\tSeattle city\tWA\tWashington\tKing County\t614161\t37.7\t51.4\t8.2\t39964\t391475\t0.6907\t98102\tObama\t98102\t1.38666192\t98102.0\n23217\t-122.22353799999999\t47.385964\tKent city\tWA\tWashington\tKing County\t88583\t32.7\t28.2\t8.8\t29217\t257582\t0.6907\t98031\tObama\t98031\t0.200004026\t98031.0\n23218\t-122.250335\t47.282161\tAlgona city\tWA\tWashington\tKing County\t2800\t34.3\t7.8\t10.5\t26097\t208254\t0.6907\t98047\tObama\t98047\t0.006321881999999999\t98047.0\n23219\t-121.99644199999999\t47.411899\tHobart CDP\tWA\tWashington\tKing County\t6549\t42.3\t40.0\t6.9\t42307\t441447\t0.6907\t98038\tObama\t98038\t0.01478643\t98038.0\n23220\t-121.749118\t47.465152\tRiverbend CDP\tWA\tWashington\tKing County\t2302\t34.3\t38.3\t8.3\t36492\t327632\t0.6907\t98045\tObama\t98045\t0.00519749\t98045.0\n23221\t-122.197092\t47.482137\tRenton city\tWA\tWashington\tKing County\t59196\t36.6\t30.9\t7.8\t33237\t262031\t0.6907\t98055\tObama\t98055\t0.133653617\t98055.0\n23222\t-122.248718\t47.264233000000004\tPacific city\tWA\tWashington\tKing County\t6093\t32.1\t10.4\t11.0\t25903\t215052\t0.6907\t98047\tObama\t98047\t0.013756866999999999\t98047.0\n23223\t-122.22898300000001\t47.641892999999996\tHunts Point town\tWA\tWashington\tKing County\t435\t45.4\t76.4\t6.9\t84187\t1000001\t0.6907\t98039\tObama\t98039\t0.00098215\t98039.0\n23224\t-121.3581\t47.710373\tSkykomish town\tWA\tWashington\tKing County\t243\t45.4\t17.5\t13.1\t30271\t129464\t0.6907\t98288\tObama\t98288\t0.000548649\t98288.0\n23225\t-122.16041200000001\t47.447651\tCascade-Fairwood CDP\tWA\tWashington\tKing County\t41664\t37.5\t36.7\t7.2\t35332\t282256\t0.6907\t98058\tObama\t98058\t0.094069604\t98058.0\n23226\t-122.217996\t47.630321\tClyde Hill city\tWA\tWashington\tKing County\t2865\t47.4\t76.6\t2.5\t83294\t961066\t0.6907\t98039\tObama\t98039\t0.00646864\t98039.0\n23227\t-122.272769\t47.476938\tTukwila city\tWA\tWashington\tKing County\t18479\t34.6\t20.7\t9.2\t27543\t207768\t0.6907\t98188\tObama\t98188\t0.041722163\t98188.0\n23228\t-122.09746200000001\t47.444196000000005\tMaple Heights-Lake Desire CDP\tWA\tWashington\tKing County\t3108\t42.3\t45.0\t5.8\t42899\t388649\t0.6907\t98058\tObama\t98058\t0.007017289\t98058.0\n23229\t-122.2408\t47.49382\tBryn Mawr-Skyway CDP\tWA\tWashington\tKing County\t14957\t39.8\t28.3\t9.1\t32024\t261426\t0.6907\t98178\tObama\t98178\t0.033770139\t98178.0\n23230\t-122.104974\t47.367466\tCovington city\tWA\tWashington\tKing County\t17133\t33.5\t29.8\t8.2\t31500\t252803\t0.6907\t98042\tObama\t98042\t0.038683143999999996\t98042.0\n23231\t-122.246128\t47.753273\tKenmore city\tWA\tWashington\tKing County\t20879\t40.5\t47.4\t6.5\t40131\t378399\t0.6907\t98028\tObama\t98028\t0.047140919\t98028.0\n23232\t-122.03794199999999\t47.604008\tSammamish city\tWA\tWashington\tKing County\t43018\t37.2\t66.1\t5.5\t54394\t617174\t0.6907\t98029\tObama\t98029\t0.09712668599999999\t98029.0\n23233\t-122.4724\t47.41233\tVashon CDP\tWA\tWashington\tKing County\t10786\t47.6\t54.3\t6.2\t42865\t431462\t0.6907\t98070\tObama\t98070\t0.024352792999999998\t98070.0\n23234\t-122.287745\t47.759319\tLake Forest Park city\tWA\tWashington\tKing County\t13171\t46.1\t56.6\t6.6\t41144\t420251\t0.6907\t98155\tObama\t98155\t0.029737681000000002\t98155.0\n23235\t-121.98153700000002\t47.201044\tEnumclaw city\tWA\tWashington\tKing County\t11650\t36.0\t21.7\t9.0\t28752\t235036\t0.6907\t98022\tObama\t98022\t0.026303545\t98022.0\n23236\t-122.16351599999999\t47.530345000000004\tNewcastle city\tWA\tWashington\tKing County\t10260\t39.1\t56.2\t5.4\t46878\t502619\t0.6907\t98056\tObama\t98056\t0.023165182000000003\t98056.0\n23237\t-122.21778400000001\t47.645258\tYarrow Point town\tWA\tWashington\tKing County\t1010\t48.5\t80.3\t5.2\t79170\t1000001\t0.6907\t98039\tObama\t98039\t0.002280393\t98039.0\n23238\t-121.712447\t47.479898\tTanner CDP\tWA\tWashington\tKing County\t3332\t38.3\t38.0\t7.5\t40595\t438800\t0.6907\t98045\tObama\t98045\t0.00752304\t98045.0\n23239\t-122.20480900000001\t47.585315\tBeaux Arts Village town\tWA\tWashington\tKing County\t303\t49.0\t80.6\t5.2\t62092\t739130\t0.6907\t98040\tObama\t98040\t0.000684118\t98040.0\n23240\t-122.15671699999999\t47.597734\tBellevue city\tWA\tWashington\tKing County\t117430\t40.3\t58.9\t7.3\t46696\t471112\t0.6907\t98005\tObama\t98005\t0.265135216\t98005.0\n23241\t-122.14786399999998\t47.756774\tWoodinville city\tWA\tWashington\tKing County\t11108\t36.9\t47.0\t6.5\t40871\t401085\t0.6907\t98072\tObama\t98072\t0.025079808999999998\t98072.0\n23242\t-121.909527\t47.646106\tCarnation city\tWA\tWashington\tKing County\t2120\t34.7\t32.0\t7.9\t31761\t305914\t0.6907\t98014\tObama\t98014\t0.004786568\t98014.0\n23243\t-122.31546000000002\t47.392254\tDes Moines city\tWA\tWashington\tKing County\t30103\t38.8\t26.9\t8.9\t30786\t256761\t0.6907\t98198\tObama\t98198\t0.067967005\t98198.0\n23244\t-122.102892\t47.332971\tLake Morton-Berrydale CDP\tWA\tWashington\tKing County\t11006\t41.4\t31.2\t7.5\t37413\t368137\t0.6907\t98042\tObama\t98042\t0.024849512\t98042.0\n23245\t-122.59898500000001\t47.526573\tParkwood CDP\tWA\tWashington\tKitsap County\t7248\t35.7\t17.8\t10.8\t23376\t202439\t0.5453\t98366\tObama\t98366\t0.016364643\t98366.0\n23246\t-122.645052\t47.612976\tTracyton CDP\tWA\tWashington\tKitsap County\t3942\t37.3\t26.3\t9.9\t28730\t202377\t0.5453\t98311\tObama\t98311\t0.008900307\t98311.0\n23247\t-122.58343\t47.723184\tSuquamish CDP\tWA\tWashington\tKitsap County\t3722\t44.1\t32.5\t8.8\t26517\t205331\t0.5453\t98392\tObama\t98392\t0.008403586999999999\t98392.0\n23248\t-122.497099\t47.805285999999995\tKingston CDP\tWA\tWashington\tKitsap County\t1837\t44.1\t32.3\t8.4\t30212\t342268\t0.5453\t98346\tObama\t98346\t0.004147606\t98346.0\n23249\t-122.63942\t47.742545\tPoulsbo city\tWA\tWashington\tKitsap County\t8049\t41.9\t33.8\t8.5\t25845\t270320\t0.5453\t98370\tObama\t98370\t0.018173153\t98370.0\n23250\t-122.51353999999999\t47.754837\tIndianola CDP\tWA\tWashington\tKitsap County\t3455\t38.4\t35.1\t8.7\t26498\t233607\t0.5453\t98342\tObama\t98342\t0.007800751\t98342.0\n23251\t-122.714524\t47.722965\tBangor Trident Base CDP\tWA\tWashington\tKitsap County\t7110\t24.6\t13.4\t14.8\t15861\t300000\t0.5453\t98315\tObama\t98315\t0.016053065\t98315.0\n23252\t-122.537143\t47.644529\tBainbridge Island city\tWA\tWashington\tKitsap County\t22452\t47.5\t63.8\t6.3\t39553\t605269\t0.5453\t98110\tObama\t98110\t0.050692462\t98110.0\n23253\t-122.68095600000001\t47.662566999999996\tSilverdale CDP\tWA\tWashington\tKitsap County\t16786\t30.8\t32.4\t8.9\t24297\t256327\t0.5453\t98383\tObama\t98383\t0.037899682999999997\t98383.0\n23254\t-122.704682\t47.594602\tErlands Point-Kitsap Lake CDP\tWA\tWashington\tKitsap County\t2991\t40.2\t21.9\t10.0\t26604\t188816\t0.5453\t98312\tObama\t98312\t0.006753125\t98312.0\n23255\t-122.62435\t47.517509000000004\tEast Port Orchard CDP\tWA\tWashington\tKitsap County\t5336\t34.8\t12.7\t8.7\t23513\t191233\t0.5453\t98366\tObama\t98366\t0.012047701000000001\t98366.0\n23256\t-122.64371100000001\t47.526920000000004\tPort Orchard city\tWA\tWashington\tKitsap County\t8196\t34.2\t16.9\t11.3\t21347\t186104\t0.5453\t98337\tObama\t98337\t0.018505052\t98337.0\n23257\t-122.66889499999999\t47.553721\tNavy Yard City CDP\tWA\tWashington\tKitsap County\t2451\t29.2\t12.9\t17.5\t19338\t146963\t0.5453\t98337\tObama\t98337\t0.005533905\t98337.0\n23258\t-122.55261999999999\t47.550878999999995\tManchester CDP\tWA\tWashington\tKitsap County\t5372\t40.6\t25.5\t10.1\t28395\t230187\t0.5453\t98353\tObama\t98353\t0.012128982\t98353.0\n23259\t-122.72248799999998\t47.548193\tBremerton city\tWA\tWashington\tKitsap County\t36248\t32.0\t16.7\t12.0\t21241\t165545\t0.5453\t98312\tObama\t98312\t0.081841278\t98312.0\n23260\t-119.99221200000001\t46.945338\tVantage CDP\tWA\tWashington\tKittitas County\t84\t38.3\t30.9\t7.3\t19857\t360000\t0.4375\t98950\tObama\t98950\t0.000189656\t98950.0\n23261\t-121.18544399999999\t47.243081\tEaston CDP\tWA\tWashington\tKittitas County\t439\t50.8\t22.0\t10.3\t28745\t313889\t0.4375\t98925\tObama\t98925\t0.000991181\t98925.0\n23262\t-121.411383\t47.402058000000004\tSnoqualmie Pass CDP\tWA\tWashington\tKittitas County\t265\t50.9\t27.1\t8.1\t33336\t336364\t0.4375\t98068\tObama\t98068\t0.000598321\t98068.0\n23263\t-120.93591799999999\t47.194426\tCle Elum city\tWA\tWashington\tKittitas County\t2036\t42.9\t12.9\t12.3\t19808\t182955\t0.4375\t98922\tObama\t98922\t0.0045969109999999995\t98922.0\n23264\t-121.031695\t47.233213\tRonald CDP\tWA\tWashington\tKittitas County\t348\t50.1\t25.4\t8.8\t30509\t282692\t0.4375\t98941\tObama\t98941\t0.00078572\t98941.0\n23265\t-120.95281999999999\t47.186384999999994\tSouth Cle Elum town\tWA\tWashington\tKittitas County\t467\t41.6\t13.8\t9.0\t20322\t216667\t0.4375\t98943\tObama\t98943\t0.0010544\t98943.0\n23266\t-121.130264\t47.253106\tRoslyn city\tWA\tWashington\tKittitas County\t1244\t48.4\t22.3\t9.8\t23494\t204630\t0.4375\t98925\tObama\t98925\t0.002808722\t98925.0\n23267\t-120.550036\t47.000991\tEllensburg city\tWA\tWashington\tKittitas County\t17618\t24.2\t35.9\t11.2\t17981\t196585\t0.4375\t98926\tObama\t98926\t0.039778185\t98926.0\n23268\t-120.670639\t47.065271\tThorp CDP\tWA\tWashington\tKittitas County\t315\t44.4\t40.1\t8.0\t24377\t293750\t0.4375\t98946\tObama\t98946\t0.000711212\t98946.0\n23269\t-120.41861999999999\t46.983378\tKittitas city\tWA\tWashington\tKittitas County\t1249\t38.4\t22.9\t12.3\t19394\t174632\t0.4375\t98934\tObama\t98934\t0.002820011\t98934.0\n23270\t-120.90541699999999\t45.752146\tCenterville CDP\tWA\tWashington\tKlickitat County\t126\t44.6\t15.9\t10.1\t16825\t143750\t0.4475\t98613\tObama\t98613\t0.000284485\t98613.0\n23271\t-121.174081\t45.632115\tDallesport CDP\tWA\tWashington\tKlickitat County\t1268\t43.4\t8.9\t8.8\t18335\t159961\t0.4475\t98617\tObama\t98617\t0.0028629090000000003\t98617.0\n23272\t-120.32091899999999\t45.992635\tBickleton CDP\tWA\tWashington\tKlickitat County\t124\t38.8\t20.7\t5.8\t18886\t160000\t0.4475\t99322\tObama\t99322\t0.00027996900000000003\t99322.0\n23273\t-121.15684499999999\t45.821107\tKlickitat CDP\tWA\tWashington\tKlickitat County\t423\t33.6\t12.2\t20.3\t17379\t129167\t0.4475\t98670\tObama\t98670\t0.000955056\t98670.0\n23274\t-120.215778\t45.739866\tRoosevelt CDP\tWA\tWashington\tKlickitat County\t86\t38.9\t20.7\t6.3\t19028\t158333\t0.4475\t99356\tObama\t99356\t0.000194172\t99356.0\n23275\t-120.81913300000001\t45.821567\tGoldendale city\tWA\tWashington\tKlickitat County\t3985\t38.3\t15.9\t10.9\t18933\t148569\t0.4475\t98620\tObama\t98620\t0.008997393000000001\t98620.0\n23276\t-121.24964399999999\t45.687155\tLyle CDP\tWA\tWashington\tKlickitat County\t540\t45.2\t27.5\t7.7\t22496\t206250\t0.4475\t98635\tObama\t98635\t0.00121922\t98635.0\n23277\t-120.969545\t45.659923\tWishram CDP\tWA\tWashington\tKlickitat County\t341\t44.2\t15.7\t10.7\t16789\t142857\t0.4475\t98673\tObama\t98673\t0.000769915\t98673.0\n23278\t-121.52899\t45.997183\tTrout Lake CDP\tWA\tWashington\tKlickitat County\t514\t43.8\t28.5\t6.8\t19875\t282143\t0.4475\t98650\tObama\t98650\t0.001160517\t98650.0\n23279\t-121.4848\t45.728086\tWhite Salmon city\tWA\tWashington\tKlickitat County\t2291\t40.9\t22.6\t9.3\t22635\t212059\t0.4475\t98605\tObama\t98605\t0.0051726540000000005\t98605.0\n23280\t-121.46983300000001\t45.715149\tBingen city\tWA\tWashington\tKlickitat County\t707\t35.2\t16.0\t10.4\t18573\t187500\t0.4475\t98605\tObama\t98605\t0.001596275\t98605.0\n23281\t-120.80701299999998\t45.692755\tMaryhill CDP\tWA\tWashington\tKlickitat County\t117\t46.4\t16.9\t10.1\t19622\t195833\t0.4475\t98673\tObama\t98673\t0.000264164\t98673.0\n23282\t-122.283662\t46.557837\tMorton city\tWA\tWashington\tLewis County\t1140\t45.4\t15.5\t14.2\t19943\t161735\t0.37200000000000005\t98356\tObama\t98356\t0.002573909\t98356.0\n23283\t-122.967977\t46.722742\tCentralia city\tWA\tWashington\tLewis County\t15812\t37.3\t15.2\t15.0\t19921\t168236\t0.37200000000000005\t98531\tObama\t98531\t0.035700571\t98531.0\n23284\t-122.483378\t46.529903999999995\tMossyrock city\tWA\tWashington\tLewis County\t532\t42.0\t10.7\t16.1\t16903\t172500\t0.37200000000000005\t98564\tObama\t98564\t0.0012011580000000001\t98564.0\n23285\t-122.936108\t46.490777\tWinlock city\tWA\tWashington\tLewis County\t1349\t37.6\t13.0\t14.9\t17040\t180603\t0.37200000000000005\t98596\tObama\t98596\t0.0030457920000000003\t98596.0\n23286\t-122.956653\t46.404203\tVader city\tWA\tWashington\tLewis County\t671\t36.4\t10.2\t15.9\t17306\t167361\t0.37200000000000005\t98593\tObama\t98593\t0.001514994\t98593.0\n23287\t-123.298174\t46.57178\tPe Ell town\tWA\tWashington\tLewis County\t744\t40.2\t6.6\t16.3\t17230\t145732\t0.37200000000000005\t98572\tObama\t98572\t0.001679814\t98572.0\n23288\t-122.84878799999998\t46.440104999999996\tToledo city\tWA\tWashington\tLewis County\t729\t40.5\t16.1\t13.7\t17635\t179924\t0.37200000000000005\t98591\tObama\t98591\t0.001645947\t98591.0\n23289\t-123.00416799999999\t46.752549\tFords Prairie CDP\tWA\tWashington\tLewis County\t2077\t44.7\t17.6\t12.5\t22722\t199725\t0.37200000000000005\t98531\tObama\t98531\t0.004689482\t98531.0\n23290\t-122.910049\t46.577963000000004\tNapavine city\tWA\tWashington\tLewis County\t1485\t32.4\t12.0\t11.2\t18742\t177750\t0.37200000000000005\t98565\tObama\t98565\t0.003352855\t98565.0\n23291\t-122.96569\t46.664619\tChehalis city\tWA\tWashington\tLewis County\t7462\t32.9\t19.7\t15.5\t20715\t183480\t0.37200000000000005\t98532\tObama\t98532\t0.016847816\t98532.0\n23292\t-118.689089\t47.332597\tOdessa town\tWA\tWashington\tLincoln County\t943\t47.8\t18.5\t8.4\t23117\t118359\t0.2849\t99159\tObama\t99159\t0.00212912\t99159.0\n23293\t-117.975574\t47.300239000000005\tSprague city\tWA\tWashington\tLincoln County\t507\t44.7\t26.3\t7.3\t22007\t136458\t0.2849\t99032\tObama\t99032\t0.001144712\t99032.0\n23294\t-118.15403799999999\t47.651036\tDavenport city\tWA\tWashington\tLincoln County\t1728\t42.4\t22.6\t7.9\t21644\t143681\t0.2849\t99122\tObama\t99122\t0.003901504\t99122.0\n23295\t-117.87791999999999\t47.669815\tReardan town\tWA\tWashington\tLincoln County\t611\t41.6\t24.9\t6.7\t19888\t167905\t0.2849\t99029\tObama\t99029\t0.001379525\t99029.0\n23296\t-118.255101\t47.480164\tHarrington city\tWA\tWashington\tLincoln County\t417\t45.7\t21.3\t7.9\t19671\t125000\t0.2849\t99134\tObama\t99134\t0.000941509\t99134.0\n23297\t-118.520068\t47.759515\tCreston town\tWA\tWashington\tLincoln County\t229\t51.9\t16.0\t13.3\t17359\t135000\t0.2849\t99117\tObama\t99117\t0.00051704\t99117.0\n23298\t-118.705459\t47.757715000000005\tWilbur town\tWA\tWashington\tLincoln County\t914\t50.1\t19.6\t11.2\t22008\t123517\t0.2849\t99185\tObama\t99185\t0.002063643\t99185.0\n23299\t-118.937331\t47.710521\tAlmira town\tWA\tWashington\tLincoln County\t355\t44.9\t19.8\t11.0\t21569\t129167\t0.2849\t99103\tObama\t99103\t0.000801524\t99103.0\n23300\t-123.159052\t47.329248\tSkokomish CDP\tWA\tWashington\tMason County\t649\t32.0\t14.1\t28.5\t12501\t120417\t0.5229\t98592\tObama\t98592\t0.001465322\t98592.0\n23301\t-122.842476\t47.363878\tAllyn-Grapeview CDP\tWA\tWashington\tMason County\t2961\t54.0\t28.7\t8.7\t26685\t323800\t0.5229\t98524\tObama\t98524\t0.00668539\t98524.0\n23302\t-123.11413300000001\t47.21891\tShelton city\tWA\tWashington\tMason County\t9140\t36.4\t15.5\t12.9\t19559\t164169\t0.5229\t98584\tObama\t98584\t0.020636428999999998\t98584.0\n23303\t-119.43683300000001\t48.704599\tTonasket city\tWA\tWashington\tOkanogan County\t988\t44.3\t18.2\t9.5\t15591\t134122\t0.4219\t98855\tObama\t98855\t0.002230721\t98855.0\n23304\t-119.436856\t48.937255\tOroville city\tWA\tWashington\tOkanogan County\t1643\t39.1\t10.5\t9.5\t14993\t122937\t0.4219\t98844\tObama\t98844\t0.00370959\t98844.0\n23305\t-118.95316899999999\t47.999811\tElmer City town\tWA\tWashington\tOkanogan County\t251\t42.0\t26.9\t10.0\t21508\t118750\t0.4219\t99124\tObama\t99124\t0.0005667119999999999\t99124.0\n23306\t-119.023002\t48.171288\tNespelem Community CDP\tWA\tWashington\tOkanogan County\t286\t32.1\t10.2\t15.8\t14712\t117500\t0.4219\t99155\tObama\t99155\t0.000645735\t99155.0\n23307\t-118.97254299999999\t48.166565999999996\tNespelem town\tWA\tWashington\tOkanogan County\t208\t26.1\t6.5\t19.5\t12814\t86250\t0.4219\t99155\tObama\t99155\t0.000469626\t99155.0\n23308\t-118.973148\t47.969536\tCoulee Dam town\tWA\tWashington\tOkanogan County\t1008\t46.0\t22.7\t7.7\t24137\t133864\t0.4219\t99116\tObama\t99116\t0.002275878\t99116.0\n23309\t-119.751443\t48.55923\tConconully town\tWA\tWashington\tOkanogan County\t186\t55.8\t14.3\t7.4\t16426\t162500\t0.4219\t98819\tObama\t98819\t0.000419954\t98819.0\n23310\t-119.44578899999999\t48.443961\tNorth Omak CDP\tWA\tWashington\tOkanogan County\t697\t28.0\t9.9\t13.1\t12788\t118929\t0.4219\t98841\tObama\t98841\t0.0015736970000000002\t98841.0\n23311\t-119.57861000000001\t48.368186\tOkanogan city\tWA\tWashington\tOkanogan County\t2488\t38.7\t18.2\t6.9\t17529\t139099\t0.4219\t98840\tObama\t98840\t0.005617444\t98840.0\n23312\t-120.119134\t48.363012\tTwisp town\tWA\tWashington\tOkanogan County\t945\t47.0\t22.9\t8.6\t19536\t181481\t0.4219\t98856\tObama\t98856\t0.002133635\t98856.0\n23313\t-119.51359199999999\t48.505457\tRiverside town\tWA\tWashington\tOkanogan County\t384\t42.7\t10.4\t9.3\t17357\t136364\t0.4219\t98849\tObama\t98849\t0.0008670010000000001\t98849.0\n23314\t-119.780786\t48.103074\tBrewster city\tWA\tWashington\tOkanogan County\t2244\t26.3\t10.3\t9.9\t9919\t154167\t0.4219\t98812\tObama\t98812\t0.005066537\t98812.0\n23315\t-119.89984299999999\t48.055485\tPateros city\tWA\tWashington\tOkanogan County\t644\t36.4\t17.2\t7.5\t17411\t173500\t0.4219\t98846\tObama\t98846\t0.001454033\t98846.0\n23316\t-119.52365400000001\t48.412143\tOmak city\tWA\tWashington\tOkanogan County\t4703\t36.5\t17.5\t11.1\t17134\t136310\t0.4219\t98840\tObama\t98840\t0.010618503999999999\t98840.0\n23317\t-120.177931\t48.471724\tWinthrop town\tWA\tWashington\tOkanogan County\t360\t51.4\t40.8\t8.1\t23364\t219118\t0.4219\t98862\tObama\t98862\t0.000812813\t98862.0\n23318\t-123.8032\t46.668953\tSouth Bend city\tWA\tWashington\tPacific County\t1813\t43.6\t18.0\t13.8\t18396\t135634\t0.5427\t98586\tObama\t98586\t0.004093419\t98586.0\n23319\t-123.55089199999999\t46.564095\tLebam CDP\tWA\tWashington\tPacific County\t188\t46.5\t13.1\t7.1\t24303\t182500\t0.5427\t98577\tObama\t98577\t0.000424469\t98577.0\n23320\t-123.983419\t46.708785999999996\tTokeland CDP\tWA\tWashington\tPacific County\t201\t41.9\t17.8\t11.1\t20084\t147500\t0.5427\t98590\tObama\t98590\t0.000453821\t98590.0\n23321\t-123.81013\t46.36502\tNaselle CDP\tWA\tWashington\tPacific County\t381\t44.7\t20.1\t11.4\t21701\t186538\t0.5427\t98638\tObama\t98638\t0.000860228\t98638.0\n23322\t-123.94220800000001\t46.275319\tChinook CDP\tWA\tWashington\tPacific County\t465\t50.2\t24.8\t10.0\t24696\t196875\t0.5427\t98614\tObama\t98614\t0.0010498839999999998\t98614.0\n23323\t-124.041909\t46.310970000000005\tIlwaco city\tWA\tWashington\tPacific County\t972\t51.0\t21.6\t11.9\t21130\t184470\t0.5427\t98624\tObama\t98624\t0.002194596\t98624.0\n23324\t-123.73703700000002\t46.682385\tRaymond city\tWA\tWashington\tPacific County\t2877\t43.3\t15.0\t12.8\t17659\t123790\t0.5427\t98577\tObama\t98577\t0.006495734\t98577.0\n23325\t-124.05586299999999\t46.354904\tLong Beach city\tWA\tWashington\tPacific County\t1279\t52.8\t18.2\t10.4\t19472\t164500\t0.5427\t98631\tObama\t98631\t0.002887745\t98631.0\n23326\t-123.955072\t46.627848\tBay Center CDP\tWA\tWashington\tPacific County\t180\t41.9\t17.4\t11.1\t20121\t153125\t0.5427\t98527\tObama\t98527\t0.00040640699999999996\t98527.0\n23327\t-124.044348\t46.496190999999996\tOcean Park CDP\tWA\tWashington\tPacific County\t1485\t57.9\t18.3\t13.7\t18122\t151935\t0.5427\t98640\tObama\t98640\t0.003352855\t98640.0\n23328\t-117.052074\t48.180309\tNewport city\tWA\tWashington\tPend Oreille County\t2070\t40.0\t16.0\t15.0\t17609\t157083\t0.3761\t99156\tObama\t99156\t0.004673677\t99156.0\n23329\t-117.422298\t48.740378\tIone town\tWA\tWashington\tPend Oreille County\t523\t43.1\t10.4\t12.2\t17534\t106250\t0.3761\t99139\tObama\t99139\t0.001180837\t99139.0\n23330\t-117.38996399999999\t48.854006\tMetaline town\tWA\tWashington\tPend Oreille County\t177\t48.8\t17.8\t13.6\t19495\t137500\t0.3761\t99152\tObama\t99152\t0.00039963300000000004\t99152.0\n23331\t-117.370572\t48.861738\tMetaline Falls town\tWA\tWashington\tPend Oreille County\t244\t48.7\t17.6\t13.4\t19468\t132813\t0.3761\t99152\tObama\t99152\t0.000550907\t99152.0\n23332\t-117.295235\t48.334117\tCusick town\tWA\tWashington\tPend Oreille County\t226\t44.0\t11.4\t21.6\t17523\t131250\t0.3761\t99180\tObama\t99180\t0.000510266\t99180.0\n23333\t-122.21175500000001\t47.097231\tOrting city\tWA\tWashington\tPierce County\t6352\t31.9\t15.8\t9.1\t26190\t219085\t0.5437\t98374\tObama\t98374\t0.014341641\t98374.0\n23334\t-122.172547\t47.181121999999995\tBonney Lake city\tWA\tWashington\tPierce County\t13556\t34.9\t21.4\t10.5\t28477\t259607\t0.5437\t98390\tObama\t98390\t0.03060694\t98390.0\n23335\t-122.593473\t47.170086\tSteilacoom town\tWA\tWashington\tPierce County\t6255\t41.8\t40.0\t10.6\t33793\t310460\t0.5437\t98388\tObama\t98388\t0.014122633\t98388.0\n23336\t-122.36906299999998\t47.050253999999995\tElk Plain CDP\tWA\tWashington\tPierce County\t17770\t33.2\t16.4\t12.0\t23651\t210456\t0.5437\t98387\tObama\t98387\t0.040121372999999995\t98387.0\n23337\t-122.492621\t47.134069000000004\tMcChord AFB CDP\tWA\tWashington\tPierce County\t3107\t22.4\t18.7\t13.0\t16008\t97500\t0.5437\t98439\tObama\t98439\t0.007015031\t98439.0\n23338\t-122.01158899999999\t46.753082\tAshford CDP\tWA\tWashington\tPierce County\t298\t43.1\t22.5\t12.2\t22427\t207692\t0.5437\t98304\tObama\t98304\t0.0006728289999999999\t98304.0\n23339\t-122.41202\t47.173533\tMidland CDP\tWA\tWashington\tPierce County\t8315\t32.6\t10.4\t16.0\t20013\t174000\t0.5437\t98445\tObama\t98445\t0.018773731999999998\t98445.0\n23340\t-122.020046\t47.161361\tBuckley city\tWA\tWashington\tPierce County\t4786\t38.1\t11.8\t12.8\t26778\t226364\t0.5437\t98321\tObama\t98321\t0.010805903\t98321.0\n23341\t-122.142169\t47.144674\tPrairie Ridge CDP\tWA\tWashington\tPierce County\t12323\t33.2\t11.9\t11.9\t24758\t203592\t0.5437\t98385\tObama\t98385\t0.027823054\t98385.0\n23342\t-122.62514099999999\t47.247042\tFox Island CDP\tWA\tWashington\tPierce County\t3356\t47.0\t44.1\t10.8\t37330\t468966\t0.5437\t98333\tObama\t98333\t0.007577227\t98333.0\n23343\t-122.2832\t47.230923\tEdgewood city\tWA\tWashington\tPierce County\t9707\t43.3\t28.4\t10.3\t29646\t320976\t0.5437\t98372\tObama\t98372\t0.02191661\t98372.0\n23344\t-122.51567\t47.230726000000004\tFircrest city\tWA\tWashington\tPierce County\t6870\t45.7\t38.7\t10.0\t31849\t271734\t0.5437\t98466\tObama\t98466\t0.015511189\t98466.0\n23345\t-122.546051\t47.214386\tUniversity Place city\tWA\tWashington\tPierce County\t32013\t38.5\t37.5\t10.5\t30065\t289720\t0.5437\t98467\tObama\t98467\t0.072279432\t98467.0\n23346\t-122.470017\t47.234469\tTacoma city\tWA\tWashington\tPierce County\t203783\t35.2\t22.5\t13.4\t23459\t195011\t0.5437\t98405\tObama\t98405\t0.460104315\t98405.0\n23347\t-122.23450700000001\t47.217424\tSumner city\tWA\tWashington\tPierce County\t8933\t35.2\t22.8\t14.2\t24842\t217632\t0.5437\t98372\tObama\t98372\t0.020169061000000002\t98372.0\n23348\t-122.57678\t47.107115\tFort Lewis CDP\tWA\tWashington\tPierce County\t21372\t22.7\t18.6\t16.5\t16350\t91667\t0.5437\t98433\tObama\t98433\t0.048254022\t98433.0\n23349\t-122.59198899999998\t47.330521000000005\tGig Harbor city\tWA\tWashington\tPierce County\t6857\t47.1\t34.2\t10.7\t33446\t342326\t0.5437\t98335\tObama\t98335\t0.015481837\t98335.0\n23350\t-122.356703\t47.082972999999996\tFrederickson CDP\tWA\tWashington\tPierce County\t9843\t33.4\t16.9\t10.1\t24180\t240000\t0.5437\t98375\tObama\t98375\t0.022223673\t98375.0\n23351\t-122.43538000000001\t47.137856\tParkland CDP\tWA\tWashington\tPierce County\t26893\t32.3\t17.2\t13.8\t21933\t196269\t0.5437\t98444\tObama\t98444\t0.060719419000000004\t98444.0\n23352\t-122.311613\t47.259918\tMilton city\tWA\tWashington\tPierce County\t6574\t38.3\t19.8\t10.0\t27617\t252562\t0.5437\t98354\tObama\t98354\t0.014842876000000001\t98354.0\n23353\t-122.28503500000001\t47.032846\tGraham CDP\tWA\tWashington\tPierce County\t10538\t36.1\t15.7\t11.5\t25399\t248507\t0.5437\t98338\tObama\t98338\t0.023792855\t98338.0\n23354\t-121.633068\t47.146545\tGreenwater CDP\tWA\tWashington\tPierce County\t112\t40.7\t19.3\t7.0\t28145\t271429\t0.5437\t980XX\tObama\t980XX\t0.000252875\t0.0\n23355\t-122.53003000000001\t47.162614000000005\tLakewood city\tWA\tWashington\tPierce County\t59401\t36.1\t24.6\t14.0\t23883\t221989\t0.5437\t98499\tObama\t98499\t0.13411646900000002\t98499.0\n23356\t-122.364354\t47.202463\tWaller CDP\tWA\tWashington\tPierce County\t9933\t44.4\t17.0\t11.7\t25017\t233303\t0.5437\t98443\tObama\t98443\t0.022426876000000002\t98443.0\n23357\t-122.049985\t47.103168\tWilkeson town\tWA\tWashington\tPierce County\t462\t38.3\t16.5\t11.4\t25117\t204808\t0.5437\t98396\tObama\t98396\t0.001043111\t98396.0\n23358\t-122.26861399999999\t46.868089000000005\tEatonville town\tWA\tWashington\tPierce County\t2399\t38.6\t20.0\t11.4\t23276\t223821\t0.5437\t98328\tObama\t98328\t0.0054164980000000005\t98328.0\n23359\t-122.19368300000001\t46.76502\tElbe CDP\tWA\tWashington\tPierce County\t23\t38.8\t23.5\t9.1\t22778\t225000\t0.5437\t98330\tObama\t98330\t5.19e-05\t98330.0\n23360\t-122.287149\t47.179719\tPuyallup city\tWA\tWashington\tPierce County\t37987\t34.9\t25.2\t11.6\t26875\t244949\t0.5437\t98372\tObama\t98372\t0.085767619\t98372.0\n23361\t-122.09396699999999\t47.137097999999995\tSouth Prairie town\tWA\tWashington\tPierce County\t472\t35.2\t12.7\t12.1\t24537\t208750\t0.5437\t98385\tObama\t98385\t0.0010656889999999999\t98385.0\n23362\t-122.421471\t47.097451\tSpanaway CDP\tWA\tWashington\tPierce County\t26720\t34.8\t13.4\t11.7\t23314\t202637\t0.5437\t98387\tObama\t98387\t0.060328817\t98387.0\n23363\t-122.635949\t47.306608000000004\tArtondale CDP\tWA\tWashington\tPierce County\t9591\t42.6\t46.1\t9.9\t32870\t351210\t0.5437\t98335\tObama\t98335\t0.021654704\t98335.0\n23364\t-122.362435\t47.169574\tSummit CDP\tWA\tWashington\tPierce County\t8354\t40.7\t21.7\t11.9\t27746\t249138\t0.5437\t98443\tObama\t98443\t0.018861786999999998\t98443.0\n23365\t-122.053576\t47.08047\tCarbonado town\tWA\tWashington\tPierce County\t771\t34.0\t15.0\t12.1\t25847\t229487\t0.5437\t98396\tObama\t98396\t0.001740775\t98396.0\n23366\t-122.54298899999999\t47.002736\tRoy city\tWA\tWashington\tPierce County\t365\t38.9\t13.4\t10.8\t20476\t152500\t0.5437\t98580\tObama\t98580\t0.000824102\t98580.0\n23367\t-122.649845\t47.107283\tDuPont city\tWA\tWashington\tPierce County\t7668\t33.1\t48.9\t9.5\t30700\t250587\t0.5437\t98327\tObama\t98327\t0.017312925\t98327.0\n23368\t-122.35201200000002\t47.232319\tFife city\tWA\tWashington\tPierce County\t7498\t30.8\t15.5\t11.3\t22505\t245297\t0.5437\t98424\tObama\t98424\t0.016929097\t98424.0\n23369\t-122.510202\t47.298072999999995\tRuston town\tWA\tWashington\tPierce County\t737\t39.8\t26.2\t11.9\t23663\t197561\t0.5437\t98407\tObama\t98407\t0.00166401\t98407.0\n23370\t-122.285058\t47.1166\tSouth Hill CDP\tWA\tWashington\tPierce County\t48701\t35.5\t25.4\t10.7\t28106\t257699\t0.5437\t98374\tObama\t98374\t0.10995784800000001\t98374.0\n23371\t-123.021565\t48.534653000000006\tFriday Harbor town\tWA\tWashington\tSan Juan County\t2235\t44.3\t32.5\t6.3\t28531\t323529\t0.6726\t98250\tObama\t98250\t0.005046217\t98250.0\n23372\t-122.629475\t48.48727\tAnacortes city\tWA\tWashington\tSkagit County\t16645\t46.5\t30.3\t9.4\t27357\t296633\t0.5191\t98221\tObama\t98221\t0.037581331\t98221.0\n23373\t-122.34442800000001\t48.335485\tConway CDP\tWA\tWashington\tSkagit County\t97\t43.8\t34.3\t13.2\t23790\t387500\t0.5191\t98238\tObama\t98238\t0.000219008\t98238.0\n23374\t-122.47130200000001\t48.486252\tBay View CDP\tWA\tWashington\tSkagit County\t393\t45.9\t26.7\t6.4\t27901\t316667\t0.5191\t982HH\tObama\t982HH\t0.000887321\t0.0\n23375\t-122.329954\t48.467526\tBurlington city\tWA\tWashington\tSkagit County\t8769\t32.0\t13.2\t12.9\t20551\t212810\t0.5191\t98233\tObama\t98233\t0.01979878\t98233.0\n23376\t-122.237127\t48.508303000000005\tSedro-Woolley city\tWA\tWashington\tSkagit County\t9820\t35.8\t11.2\t12.8\t21426\t185546\t0.5191\t98235\tObama\t98235\t0.022171742999999997\t98235.0\n23377\t-121.60627099999999\t48.485183\tRockport CDP\tWA\tWashington\tSkagit County\t112\t42.8\t28.6\t14.0\t23915\t170833\t0.5191\t98237\tObama\t98237\t0.000252875\t98237.0\n23378\t-122.012346\t48.322528999999996\tLake Cavanaugh CDP\tWA\tWashington\tSkagit County\t192\t44.3\t27.1\t15.8\t27198\t394118\t0.5191\t98223\tObama\t98223\t0.0004335\t98223.0\n23379\t-122.310286\t48.421995\tMount Vernon city\tWA\tWashington\tSkagit County\t31563\t31.5\t23.0\t11.9\t21378\t232587\t0.5191\t98273\tObama\t98273\t0.071263415\t98273.0\n23380\t-122.231349\t48.313072\tLake McMurray CDP\tWA\tWashington\tSkagit County\t232\t46.3\t21.6\t6.8\t32613\t388235\t0.5191\t98274\tObama\t98274\t0.000523813\t98274.0\n23381\t-121.75028\t48.537566\tConcrete town\tWA\tWashington\tSkagit County\t854\t36.9\t10.8\t14.8\t18400\t137037\t0.5191\t98237\tObama\t98237\t0.001928174\t98237.0\n23382\t-121.993371\t48.529131\tHamilton town\tWA\tWashington\tSkagit County\t348\t41.3\t9.2\t11.0\t23017\t215909\t0.5191\t98284\tObama\t98284\t0.00078572\t98284.0\n23383\t-122.237866\t48.456068\tClear Lake CDP\tWA\tWashington\tSkagit County\t1151\t38.5\t17.1\t11.7\t22495\t245486\t0.5191\t98235\tObama\t98235\t0.002598745\t98235.0\n23384\t-122.06326899999999\t48.523185\tLyman town\tWA\tWashington\tSkagit County\t446\t41.2\t17.8\t12.3\t20133\t219000\t0.5191\t98284\tObama\t98284\t0.001006985\t98284.0\n23385\t-121.436976\t48.536952\tMarblemount CDP\tWA\tWashington\tSkagit County\t275\t42.9\t28.6\t14.4\t23970\t160714\t0.5191\t98267\tObama\t98267\t0.0006208990000000001\t98267.0\n23386\t-122.241827\t48.393096\tBig Lake CDP\tWA\tWashington\tSkagit County\t1895\t43.2\t25.9\t14.9\t26225\t374583\t0.5191\t98274\tObama\t98274\t0.004278559\t98274.0\n23387\t-122.34195600000001\t48.632695\tAlger CDP\tWA\tWashington\tSkagit County\t109\t45.0\t17.3\t4.7\t27073\t275000\t0.5191\t98232\tObama\t98232\t0.000246102\t98232.0\n23388\t-122.431099\t48.560234\tEdison CDP\tWA\tWashington\tSkagit County\t144\t48.7\t42.3\t11.0\t29177\t400000\t0.5191\t98232\tObama\t98232\t0.000325125\t98232.0\n23389\t-122.49466699999999\t48.392732\tLa Conner town\tWA\tWashington\tSkagit County\t1049\t49.2\t38.9\t8.4\t29676\t294397\t0.5191\t98257\tObama\t98257\t0.002368448\t98257.0\n23390\t-121.8942\t45.693999\tStevenson city\tWA\tWashington\tSkamania County\t1288\t39.1\t19.9\t16.3\t21056\t196429\t0.4808\t98648\tObama\t98648\t0.002908066\t98648.0\n23391\t-121.96963500000001\t45.642532\tNorth Bonneville city\tWA\tWashington\tSkamania County\t683\t43.8\t20.1\t14.4\t22086\t225676\t0.4808\t98639\tObama\t98639\t0.0015420879999999998\t98639.0\n23392\t-121.82194799999999\t45.73572\tCarson River Valley CDP\tWA\tWashington\tSkamania County\t2358\t36.7\t11.5\t20.1\t18578\t175441\t0.4808\t98610\tObama\t98610\t0.005323928\t98610.0\n23393\t-122.173212\t47.875343\tSeattle Hill-Silver Firs CDP\tWA\tWashington\tSnohomish County\t47172\t36.7\t35.6\t7.6\t33987\t361832\t0.5716\t98208\tObama\t98208\t0.10650564900000001\t98208.0\n23394\t-122.179946\t47.816074\tNorth Creek CDP\tWA\tWashington\tSnohomish County\t32438\t35.9\t39.1\t7.9\t33875\t349246\t0.5716\t98012\tObama\t98012\t0.073239003\t98012.0\n23395\t-122.245773\t48.09816\tJohn Sam Lake CDP\tWA\tWashington\tSnohomish County\t1064\t41.7\t19.0\t11.6\t25456\t272973\t0.5716\t98271\tObama\t98271\t0.002402315\t98271.0\n23396\t-122.14656599999999\t48.168942\tArlington city\tWA\tWashington\tSnohomish County\t15729\t32.5\t20.9\t9.0\t26419\t271973\t0.5716\t98223\tObama\t98223\t0.035513172\t98223.0\n23397\t-122.34587900000001\t48.165566999999996\tWarm Beach CDP\tWA\tWashington\tSnohomish County\t2221\t47.7\t28.8\t8.3\t28279\t297043\t0.5716\t98292\tObama\t98292\t0.005014607\t98292.0\n23398\t-121.98703\t48.115215\tJordan Road-Canyon Creek CDP\tWA\tWashington\tSnohomish County\t2708\t34.1\t11.4\t10.9\t26855\t236255\t0.5716\t98223\tObama\t98223\t0.006114163000000001\t98223.0\n23399\t-121.98532\t47.859049\tMonroe city\tWA\tWashington\tSnohomish County\t17062\t32.6\t23.7\t7.9\t25021\t305986\t0.5716\t98272\tObama\t98272\t0.03852284\t98272.0\n23400\t-122.281705\t48.111529\tCathan CDP\tWA\tWashington\tSnohomish County\t594\t30.7\t11.0\t10.7\t21733\t235106\t0.5716\t98271\tObama\t98271\t0.001341142\t98271.0\n23401\t-122.342298\t48.282264\tLake Ketchum CDP\tWA\tWashington\tSnohomish County\t1252\t37.8\t16.4\t17.0\t26103\t307921\t0.5716\t98238\tObama\t98238\t0.002826784\t98238.0\n23402\t-122.220335\t47.95218\tEverett city\tWA\tWashington\tSnohomish County\t98763\t33.2\t21.4\t10.5\t26556\t256352\t0.5716\t98203\tObama\t98203\t0.22298858300000002\t98203.0\n23403\t-121.69215600000001\t47.855942\tGold Bar city\tWA\tWashington\tSnohomish County\t2176\t32.0\t13.7\t8.9\t23323\t201198\t0.5716\t98251\tObama\t98251\t0.004913005\t98251.0\n23404\t-121.96601000000001\t48.086079\tGranite Falls city\tWA\tWashington\tSnohomish County\t3287\t32.5\t15.1\t10.6\t26577\t241697\t0.5716\t98258\tObama\t98258\t0.007421438000000001\t98258.0\n23405\t-122.05073200000001\t47.991131\tMachias CDP\tWA\tWashington\tSnohomish County\t1107\t37.4\t23.4\t8.9\t31772\t308642\t0.5716\t98258\tObama\t98258\t0.002499401\t98258.0\n23406\t-122.303335\t47.828474\tLynnwood city\tWA\tWashington\tSnohomish County\t37394\t35.9\t26.1\t9.2\t27451\t280965\t0.5716\t98036\tObama\t98036\t0.084428734\t98036.0\n23407\t-122.340001\t48.259547999999995\tNorth Stanwood CDP\tWA\tWashington\tSnohomish County\t1210\t39.6\t25.7\t5.8\t29974\t268023\t0.5716\t98292\tObama\t98292\t0.002731956\t98292.0\n23408\t-122.346769\t48.242238\tStanwood city\tWA\tWashington\tSnohomish County\t5051\t34.6\t21.2\t9.1\t23846\t261166\t0.5716\t98292\tObama\t98292\t0.011404224\t98292.0\n23409\t-122.19806299999999\t48.150816\tSmokey Point CDP\tWA\tWashington\tSnohomish County\t2311\t35.0\t16.2\t8.3\t28726\t230482\t0.5716\t98271\tObama\t98271\t0.00521781\t98271.0\n23410\t-122.0935\t47.923559999999995\tSnohomish city\tWA\tWashington\tSnohomish County\t8685\t36.1\t25.7\t9.1\t30157\t287500\t0.5716\t98290\tObama\t98290\t0.019609123\t98290.0\n23411\t-122.31511200000001\t48.106803\tWeallup Lake CDP\tWA\tWashington\tSnohomish County\t897\t59.9\t9.0\t8.5\t29082\t57179\t0.5716\t98271\tObama\t98271\t0.00202526\t98271.0\n23412\t-122.109177\t47.848394\tCathcart CDP\tWA\tWashington\tSnohomish County\t3250\t40.5\t31.7\t8.5\t35878\t441667\t0.5716\t98296\tObama\t98296\t0.007337899\t98296.0\n23413\t-122.38472\t47.790711\tWoodway city\tWA\tWashington\tSnohomish County\t1146\t49.8\t62.4\t8.3\t61633\t819257\t0.5716\t98020\tObama\t98020\t0.002587456\t98020.0\n23414\t-121.60302800000001\t48.250752\tDarrington town\tWA\tWashington\tSnohomish County\t1372\t42.3\t9.6\t8.1\t19747\t169444\t0.5716\t98241\tObama\t98241\t0.0030977220000000002\t98241.0\n23415\t-121.66540900000001\t47.852276\tMay Creek CDP\tWA\tWashington\tSnohomish County\t1303\t39.4\t15.1\t11.8\t25380\t197449\t0.5716\t98251\tObama\t98251\t0.002941933\t98251.0\n23416\t-122.27908500000001\t48.064901\tTulalip Bay CDP\tWA\tWashington\tSnohomish County\t1618\t44.1\t28.5\t12.5\t27515\t198750\t0.5716\t98271\tObama\t98271\t0.003653145\t98271.0\n23417\t-122.245851\t48.20178\tSilvana CDP\tWA\tWashington\tSnohomish County\t117\t42.9\t26.8\t7.6\t27457\t278125\t0.5716\t98271\tObama\t98271\t0.000264164\t98271.0\n23418\t-122.23935700000001\t47.849994\tMartha Lake CDP\tWA\tWashington\tSnohomish County\t15911\t36.4\t32.1\t9.2\t30744\t346494\t0.5716\t98012\tObama\t98012\t0.035924095\t98012.0\n23419\t-121.749173\t47.867305\tStartup CDP\tWA\tWashington\tSnohomish County\t891\t42.8\t11.5\t14.8\t26499\t280909\t0.5716\t98294\tObama\t98294\t0.002011713\t98294.0\n23420\t-122.101336\t47.996584999999996\tWest Lake Stevens CDP\tWA\tWashington\tSnohomish County\t23649\t33.4\t21.1\t9.4\t29768\t277612\t0.5716\t98205\tObama\t98205\t0.053395067000000004\t98205.0\n23421\t-122.13913500000001\t48.104979\tNorth Marysville CDP\tWA\tWashington\tSnohomish County\t24866\t34.7\t16.7\t9.7\t27855\t253867\t0.5716\t98270\tObama\t98270\t0.056142828\t98270.0\n23422\t-122.261849\t47.8912\tPaine Field-Lake Stickney CDP\tWA\tWashington\tSnohomish County\t30900\t32.2\t17.1\t9.8\t25831\t197026\t0.5716\t98204\tObama\t98204\t0.069766484\t98204.0\n23423\t-122.35346299999999\t47.811406\tEdmonds city\tWA\tWashington\tSnohomish County\t41202\t45.6\t40.7\t8.1\t37083\t377685\t0.5716\t98020\tObama\t98020\t0.093026494\t98020.0\n23424\t-122.28040700000001\t48.138669\tLake Goodwin CDP\tWA\tWashington\tSnohomish County\t3528\t41.0\t24.1\t9.1\t33476\t358889\t0.5716\t98271\tObama\t98271\t0.007965571\t98271.0\n23425\t-122.209106\t47.860224\tMill Creek city\tWA\tWashington\tSnohomish County\t15393\t40.2\t47.0\t8.3\t40445\t468329\t0.5716\t98012\tObama\t98012\t0.034754546000000004\t98012.0\n23426\t-122.23544\t48.036227000000004\tPriest Point CDP\tWA\tWashington\tSnohomish County\t809\t47.4\t27.9\t9.6\t29617\t437500\t0.5716\t98201\tObama\t98201\t0.001826572\t98201.0\n23427\t-122.10438899999998\t47.939677\tNorthwest Snohomish CDP\tWA\tWashington\tSnohomish County\t2227\t39.3\t25.5\t9.1\t28546\t299101\t0.5716\t98205\tObama\t98205\t0.005028154\t98205.0\n23428\t-122.307592\t47.792065\tMountlake Terrace city\tWA\tWashington\tSnohomish County\t21273\t35.8\t27.6\t8.2\t29062\t269858\t0.5716\t98043\tObama\t98043\t0.048030499000000004\t98043.0\n23429\t-122.17642\t48.068619\tMarysville city\tWA\tWashington\tSnohomish County\t30920\t34.0\t23.0\t8.7\t28180\t279978\t0.5716\t98270\tObama\t98270\t0.06981164\t98270.0\n23430\t-122.27370400000001\t47.792367\tBrier city\tWA\tWashington\tSnohomish County\t6601\t40.8\t34.3\t7.0\t36580\t364993\t0.5716\t98036\tObama\t98036\t0.014903837\t98036.0\n23431\t-121.555122\t47.821415\tIndex town\tWA\tWashington\tSnohomish County\t170\t42.4\t19.2\t9.5\t28118\t209091\t0.5716\t98256\tObama\t98256\t0.00038382900000000003\t98256.0\n23432\t-122.30325\t47.909603000000004\tMukilteo city\tWA\tWashington\tSnohomish County\t19928\t37.7\t45.8\t8.1\t36641\t438634\t0.5716\t98275\tObama\t98275\t0.044993737\t98275.0\n23433\t-121.89691299999998\t47.87962\tWoods Creek CDP\tWA\tWashington\tSnohomish County\t5288\t37.7\t20.9\t9.5\t32001\t348707\t0.5716\t98272\tObama\t98272\t0.011939326\t98272.0\n23434\t-121.967225\t48.045445\tLake Bosworth CDP\tWA\tWashington\tSnohomish County\t233\t38.8\t26.1\t14.2\t30811\t356250\t0.5716\t98258\tObama\t98258\t0.000526071\t98258.0\n23435\t-121.913946\t48.2776\tOso CDP\tWA\tWashington\tSnohomish County\t252\t42.9\t13.2\t6.1\t32658\t262500\t0.5716\t98223\tObama\t98223\t0.000568969\t98223.0\n23436\t-122.210431\t48.111897\tStimson Crossing CDP\tWA\tWashington\tSnohomish County\t998\t41.8\t19.1\t11.2\t25337\t271512\t0.5716\t98271\tObama\t98271\t0.002253299\t98271.0\n23437\t-122.06666799999999\t48.019232\tLake Stevens city\tWA\tWashington\tSnohomish County\t7423\t33.1\t23.5\t9.5\t31204\t315957\t0.5716\t98258\tObama\t98258\t0.016759761\t98258.0\n23438\t-121.802894\t47.86962\tSultan city\tWA\tWashington\tSnohomish County\t4402\t33.1\t10.0\t10.2\t24708\t243977\t0.5716\t98294\tObama\t98294\t0.009938902\t98294.0\n23439\t-121.998337\t47.940923\tThree Lakes CDP\tWA\tWashington\tSnohomish County\t2787\t42.0\t23.9\t10.0\t34373\t354412\t0.5716\t98290\tObama\t98290\t0.00629253\t98290.0\n23440\t-121.74648400000001\t48.094433\tVerlot CDP\tWA\tWashington\tSnohomish County\t188\t38.4\t22.8\t10.5\t24670\t265385\t0.5716\t98252\tObama\t98252\t0.000424469\t98252.0\n23441\t-121.811374\t47.881568\tNorth Sultan CDP\tWA\tWashington\tSnohomish County\t446\t40.3\t13.2\t12.4\t27539\t271591\t0.5716\t98294\tObama\t98294\t0.001006985\t98294.0\n23442\t-122.095997\t47.804477\tMaltby CDP\tWA\tWashington\tSnohomish County\t8665\t41.8\t33.2\t7.8\t37938\t469652\t0.5716\t98296\tObama\t98296\t0.019563966999999998\t98296.0\n23443\t-121.930981\t47.983791\tLake Roesiger CDP\tWA\tWashington\tSnohomish County\t753\t43.0\t25.1\t6.1\t31424\t463095\t0.5716\t98290\tObama\t98290\t0.001700135\t98290.0\n23444\t-122.346804\t47.793746\tEsperance CDP\tWA\tWashington\tSnohomish County\t3653\t40.9\t35.1\t7.7\t32888\t339085\t0.5716\t98020\tObama\t98020\t0.008247798\t98020.0\n23445\t-122.039631\t48.054856\tLochsloy CDP\tWA\tWashington\tSnohomish County\t2495\t41.0\t18.5\t9.5\t29489\t297727\t0.5716\t98258\tObama\t98258\t0.005633248\t98258.0\n23446\t-122.06755600000001\t48.209733\tArlington Heights CDP\tWA\tWashington\tSnohomish County\t2732\t41.7\t19.4\t7.3\t27938\t341505\t0.5716\t98223\tObama\t98223\t0.006168351\t98223.0\n23447\t-122.041129\t47.784353\tEcho Lake CDP\tWA\tWashington\tSnohomish County\t1113\t39.5\t33.4\t6.0\t31686\t393750\t0.5716\t98072\tObama\t98072\t0.002512948\t98072.0\n23448\t-122.23245\t48.057515\tShaker Church CDP\tWA\tWashington\tSnohomish County\t858\t35.0\t8.9\t11.7\t23933\t226111\t0.5716\t98271\tObama\t98271\t0.001937205\t98271.0\n23449\t-122.257507\t47.805105\tAlderwood Manor CDP\tWA\tWashington\tSnohomish County\t17815\t37.2\t32.6\t8.5\t32417\t311769\t0.5716\t98036\tObama\t98036\t0.040222974\t98036.0\n23450\t-122.295194\t47.86285\tPicnic Point-North Lynnwood CDP\tWA\tWashington\tSnohomish County\t27582\t33.9\t35.2\t8.1\t30844\t336302\t0.5716\t98037\tObama\t98037\t0.062275053\t98037.0\n23451\t-117.07241699999999\t47.655933000000005\tLiberty Lake CDP\tWA\tWashington\tSpokane County\t7673\t35.5\t36.8\t7.6\t30809\t285554\t0.457\t99019\tObama\t99019\t0.017324215\t99019.0\n23452\t-117.421066\t47.725623\tTown and Country CDP\tWA\tWashington\tSpokane County\t4604\t43.3\t24.3\t10.7\t23649\t172997\t0.457\t99208\tObama\t99208\t0.01039498\t99208.0\n23453\t-117.2312\t47.338037\tWaverly town\tWA\tWashington\tSpokane County\t133\t42.8\t18.1\t7.5\t19167\t200000\t0.457\t99012\tObama\t99012\t0.000300289\t99012.0\n23454\t-117.17496399999999\t47.384683\tFairfield town\tWA\tWashington\tSpokane County\t545\t45.2\t26.1\t12.7\t19714\t131522\t0.457\t99012\tObama\t99012\t0.0012305089999999999\t99012.0\n23455\t-117.415253\t47.673315\tSpokane city\tWA\tWashington\tSpokane County\t210856\t36.3\t27.3\t12.4\t22017\t163821\t0.457\t99201\tObama\t99201\t0.47607384\t99201.0\n23456\t-117.38204099999999\t47.429574\tSpangle town\tWA\tWashington\tSpokane County\t264\t43.3\t18.3\t6.8\t19143\t190625\t0.457\t99031\tObama\t99031\t0.0005960630000000001\t99031.0\n23457\t-117.415768\t47.767825\tFairwood CDP\tWA\tWashington\tSpokane County\t7888\t42.3\t44.4\t10.7\t29725\t251441\t0.457\t99218\tObama\t99218\t0.017809645\t99218.0\n23458\t-117.579751\t47.646506\tAirway Heights city\tWA\tWashington\tSpokane County\t5252\t34.2\t8.2\t34.6\t18845\t132986\t0.457\t99001\tObama\t99001\t0.011858044\t99001.0\n23459\t-117.44005\t47.963289\tDeer Park city\tWA\tWashington\tSpokane County\t3662\t36.1\t13.1\t13.4\t18251\t164171\t0.457\t99006\tObama\t99006\t0.008268119\t99006.0\n23460\t-117.155697\t47.282078000000006\tLatah town\tWA\tWashington\tSpokane County\t166\t45.5\t26.2\t12.2\t19778\t129688\t0.457\t99018\tObama\t99018\t0.00037479699999999996\t99018.0\n23461\t-117.21267399999999\t47.699932000000004\tTrentwood CDP\tWA\tWashington\tSpokane County\t4746\t35.8\t16.4\t10.3\t21337\t178851\t0.457\t99216\tObama\t99216\t0.01071559\t99216.0\n23462\t-117.647379\t47.619019\tFairchild AFB CDP\tWA\tWashington\tSpokane County\t3639\t22.5\t20.1\t13.1\t15050\t93500\t0.457\t99011\tObama\t99011\t0.008216189\t99011.0\n23463\t-117.28063\t47.685767\tMillwood town\tWA\tWashington\tSpokane County\t1699\t44.1\t17.5\t12.2\t22072\t165472\t0.457\t99212\tObama\t99212\t0.003836028\t99212.0\n23464\t-117.42000300000001\t47.747894\tCountry Homes CDP\tWA\tWashington\tSpokane County\t5944\t30.0\t33.0\t9.8\t23326\t208509\t0.457\t99218\tObama\t99218\t0.013420452\t99218.0\n23465\t-117.20784599999999\t47.650115\tVeradale CDP\tWA\tWashington\tSpokane County\t10250\t38.2\t19.7\t11.3\t23060\t198164\t0.457\t99037\tObama\t99037\t0.023142604\t99037.0\n23466\t-117.24068899999999\t47.649674\tOpportunity CDP\tWA\tWashington\tSpokane County\t26514\t36.6\t22.0\t10.8\t22895\t186669\t0.457\t99206\tObama\t99206\t0.059863707\t99206.0\n23467\t-117.689682\t47.570981\tMedical Lake city\tWA\tWashington\tSpokane County\t4884\t37.8\t13.5\t8.0\t22874\t173505\t0.457\t99022\tObama\t99022\t0.011027168\t99022.0\n23468\t-117.579105\t47.489734000000006\tCheney city\tWA\tWashington\tSpokane County\t10639\t23.5\t44.6\t11.7\t17612\t188161\t0.457\t99004\tObama\t99004\t0.024020893999999997\t99004.0\n23469\t-117.130742\t47.451388\tRockford town\tWA\tWashington\tSpokane County\t512\t44.3\t17.4\t13.1\t19925\t174306\t0.457\t99030\tObama\t99030\t0.001156001\t99030.0\n23470\t-117.159085\t47.663463\tGreen Acres CDP\tWA\tWashington\tSpokane County\t6563\t38.5\t15.0\t12.3\t22630\t158531\t0.457\t99016\tObama\t99016\t0.01481804\t99016.0\n23471\t-117.085346\t47.703052\tOtis Orchards-East Farms CDP\tWA\tWashington\tSpokane County\t6459\t38.1\t13.0\t10.8\t21098\t181352\t0.457\t99027\tObama\t99027\t0.014583226999999999\t99027.0\n23472\t-117.27703400000001\t47.658595\tDishman CDP\tWA\tWashington\tSpokane County\t11260\t38.0\t17.8\t11.3\t20496\t166309\t0.457\t99206\tObama\t99206\t0.025422997000000003\t99206.0\n23473\t-118.061182\t48.605047\tKettle Falls city\tWA\tWashington\tStevens County\t1534\t36.3\t10.9\t12.7\t19351\t151020\t0.3503\t99151\tObama\t99151\t0.003463488\t99151.0\n23474\t-118.06046299999998\t48.663981\tMarcus town\tWA\tWashington\tStevens County\t123\t46.7\t19.5\t10.6\t18504\t175000\t0.3503\t99151\tObama\t99151\t0.000277711\t99151.0\n23475\t-117.719256\t48.278822999999996\tChewelah city\tWA\tWashington\tStevens County\t2505\t42.8\t15.2\t14.4\t18241\t155662\t0.3503\t99109\tObama\t99109\t0.0056558269999999996\t99109.0\n23476\t-117.746858\t48.055973\tSpringdale town\tWA\tWashington\tStevens County\t322\t41.9\t13.8\t15.4\t16705\t170313\t0.3503\t99173\tObama\t99173\t0.000727016\t99173.0\n23477\t-117.77964399999999\t48.916106\tNorthport town\tWA\tWashington\tStevens County\t363\t51.4\t16.1\t17.6\t15136\t125000\t0.3503\t99157\tObama\t99157\t0.000819587\t99157.0\n23478\t-117.89929599999999\t48.544554999999995\tColville city\tWA\tWashington\tStevens County\t4944\t40.4\t18.6\t13.8\t18468\t164929\t0.3503\t99114\tObama\t99114\t0.011162637\t99114.0\n23479\t-122.86896599999999\t46.797258\tBucoda town\tWA\tWashington\tThurston County\t790\t39.0\t7.7\t19.5\t16418\t126042\t0.5827\t98530\tObama\t98530\t0.0017836739999999998\t98530.0\n23480\t-122.894084\t47.040361\tOlympia city\tWA\tWashington\tThurston County\t46694\t37.5\t41.9\t9.1\t27261\t252342\t0.5827\t98501\tObama\t98501\t0.10542641400000001\t98501.0\n23481\t-122.78099399999999\t47.05128\tTanglewilde-Thompson Place CDP\tWA\tWashington\tThurston County\t6251\t33.4\t19.9\t13.1\t23071\t213265\t0.5827\t98503\tObama\t98503\t0.014113602\t98503.0\n23482\t-123.013574\t46.808527000000005\tGrand Mound CDP\tWA\tWashington\tThurston County\t2517\t32.4\t11.7\t14.2\t21566\t197068\t0.5827\t98579\tObama\t98579\t0.00568292\t98579.0\n23483\t-122.602726\t46.96467\tNorth Yelm CDP\tWA\tWashington\tThurston County\t3375\t36.5\t15.8\t14.0\t19088\t163081\t0.5827\t98597\tObama\t98597\t0.007620126\t98597.0\n23484\t-123.07214599999999\t46.82881\tRochester CDP\tWA\tWashington\tThurston County\t2407\t37.9\t12.4\t9.0\t23759\t204641\t0.5827\t98579\tObama\t98579\t0.005434561\t98579.0\n23485\t-122.687146\t46.890937\tRainier town\tWA\tWashington\tThurston County\t1877\t40.4\t15.5\t11.2\t20522\t211905\t0.5827\t98576\tObama\t98576\t0.004237919000000001\t98576.0\n23486\t-122.849686\t46.857102000000005\tTenino city\tWA\tWashington\tThurston County\t1725\t40.5\t18.0\t12.6\t21973\t205357\t0.5827\t98589\tObama\t98589\t0.003894731\t98589.0\n23487\t-122.627429\t46.939614\tYelm city\tWA\tWashington\tThurston County\t5039\t35.0\t16.3\t12.1\t21212\t196105\t0.5827\t98597\tObama\t98597\t0.01137713\t98597.0\n23488\t-122.79351299999999\t47.04472\tLacey city\tWA\tWashington\tThurston County\t41554\t36.3\t30.2\t9.8\t27280\t231240\t0.5827\t98503\tObama\t98503\t0.093821245\t98503.0\n23489\t-122.67882\t47.016746999999995\tNisqually Indian Community CDP\tWA\tWashington\tThurston County\t638\t31.3\t7.5\t13.9\t17476\t111667\t0.5827\t98513\tObama\t98513\t0.0014404860000000002\t98513.0\n23490\t-122.91693899999999\t46.998227\tTumwater city\tWA\tWashington\tThurston County\t14956\t35.3\t32.8\t9.6\t28488\t230723\t0.5827\t98501\tObama\t98501\t0.033767881\t98501.0\n23491\t-123.38073700000001\t46.201562\tCathlamet town\tWA\tWashington\tWahkiakum County\t627\t47.1\t21.6\t14.6\t24044\t174074\t0.4769\t98612\tObama\t98612\t0.00141565\t98612.0\n23492\t-123.35807700000001\t46.196841\tEast Cathlamet CDP\tWA\tWashington\tWahkiakum County\t557\t46.4\t18.3\t11.0\t25217\t208333\t0.4769\t98612\tObama\t98612\t0.001257603\t98612.0\n23493\t-118.151271\t46.269211999999996\tWaitsburg city\tWA\tWashington\tWalla Walla County\t1297\t43.2\t19.3\t5.4\t16803\t151786\t0.389\t99361\tObama\t99361\t0.002928386\t99361.0\n23494\t-118.90553899999999\t46.084578\tWallula CDP\tWA\tWashington\tWalla Walla County\t211\t35.2\t29.5\t6.9\t19567\t203125\t0.389\t99363\tObama\t99363\t0.000476399\t99363.0\n23495\t-118.672321\t46.041086\tTouchet CDP\tWA\tWashington\tWalla Walla County\t450\t36.4\t21.4\t6.1\t17759\t172368\t0.389\t99360\tObama\t99360\t0.001016017\t99360.0\n23496\t-118.382232\t46.04339\tCollege Place city\tWA\tWashington\tWalla Walla County\t8758\t33.5\t34.2\t8.1\t20369\t181024\t0.389\t99324\tObama\t99324\t0.019773943999999998\t99324.0\n23497\t-118.97270300000001\t46.199344\tBurbank CDP\tWA\tWashington\tWalla Walla County\t3452\t37.0\t15.2\t7.2\t21546\t173655\t0.389\t99323\tObama\t99323\t0.007793977\t99323.0\n23498\t-118.31348100000001\t46.298727\tPrescott town\tWA\tWashington\tWalla Walla County\t368\t26.1\t11.5\t7.2\t14392\t133333\t0.389\t99348\tObama\t99348\t0.000830876\t99348.0\n23499\t-118.304064\t46.051916\tWalla Walla East CDP\tWA\tWashington\tWalla Walla County\t2587\t44.8\t38.2\t6.6\t25144\t225000\t0.389\t99362\tObama\t99362\t0.005840967\t99362.0\n23500\t-118.148283\t46.139463\tDixie CDP\tWA\tWashington\tWalla Walla County\t224\t43.6\t19.9\t5.9\t19738\t221875\t0.389\t99329\tObama\t99329\t0.000505751\t99329.0\n23501\t-118.33213500000001\t46.064122\tWalla Walla city\tWA\tWashington\tWalla Walla County\t30930\t34.6\t23.6\t10.1\t20097\t164662\t0.389\t99362\tObama\t99362\t0.069834218\t99362.0\n23502\t-118.384625\t46.063371999999994\tGarrett CDP\tWA\tWashington\tWalla Walla County\t1186\t46.3\t22.2\t5.8\t22711\t199609\t0.389\t99324\tObama\t99324\t0.0026777690000000004\t99324.0\n23503\t-122.358271\t48.912864\tEverson city\tWA\tWashington\tWhatcom County\t2372\t31.9\t15.9\t9.7\t19079\t226626\t0.5541\t98247\tObama\t98247\t0.005355537\t98247.0\n23504\t-122.738422\t48.993332\tBlaine city\tWA\tWashington\tWhatcom County\t4857\t40.1\t21.8\t10.2\t23254\t241047\t0.5541\t98230\tObama\t98230\t0.010966207\t98230.0\n23505\t-122.09762099999999\t48.915125\tMaple Falls CDP\tWA\tWashington\tWhatcom County\t308\t36.6\t17.6\t13.4\t20825\t196667\t0.5541\t98244\tObama\t98244\t0.000695407\t98244.0\n23506\t-122.55646399999999\t48.793902\tMarietta-Alderwood CDP\tWA\tWashington\tWhatcom County\t3846\t35.9\t24.8\t8.3\t24443\t250478\t0.5541\t98225\tObama\t98225\t0.008683557\t98225.0\n23507\t-122.231145\t48.838046999999996\tDeming CDP\tWA\tWashington\tWhatcom County\t242\t40.0\t19.2\t9.6\t23306\t283333\t0.5541\t98244\tObama\t98244\t0.000546391\t98244.0\n23508\t-122.588495\t48.850908000000004\tFerndale city\tWA\tWashington\tWhatcom County\t10968\t34.2\t22.6\t10.5\t20839\t264450\t0.5541\t98248\tObama\t98248\t0.024763715\t98248.0\n23509\t-121.93180100000001\t48.890287\tGlacier CDP\tWA\tWashington\tWhatcom County\t263\t48.9\t0.0\t7.5\t9374\t179167\t0.5541\t98244\tObama\t98244\t0.000593805\t98244.0\n23510\t-122.406292\t48.746241\tGeneva CDP\tWA\tWashington\tWhatcom County\t2508\t41.7\t49.3\t5.8\t31981\t378125\t0.5541\t98226\tObama\t98226\t0.0056626\t98226.0\n23511\t-122.64020500000001\t48.914509\tCuster CDP\tWA\tWashington\tWhatcom County\t342\t39.7\t10.9\t12.6\t22398\t273611\t0.5541\t98240\tObama\t98240\t0.000772173\t98240.0\n23512\t-122.46762700000001\t48.751846\tBellingham city\tWA\tWashington\tWhatcom County\t79754\t32.2\t35.5\t10.3\t23452\t280044\t0.5541\t98225\tObama\t98225\t0.180069778\t98225.0\n23513\t-122.458226\t48.949406\tLynden city\tWA\tWashington\tWhatcom County\t11444\t37.9\t30.2\t7.4\t24596\t300147\t0.5541\t98264\tObama\t98264\t0.025838435\t98264.0\n23514\t-122.13815600000001\t48.916733\tKendall CDP\tWA\tWashington\tWhatcom County\t195\t38.8\t17.2\t13.8\t22060\t221429\t0.5541\t98244\tObama\t98244\t0.000440274\t98244.0\n23515\t-122.753271\t48.948254\tBirch Bay CDP\tWA\tWashington\tWhatcom County\t7676\t43.7\t23.8\t11.9\t26411\t230216\t0.5541\t98230\tObama\t98230\t0.017330988000000002\t98230.0\n23516\t-122.270131\t48.996019\tSumas city\tWA\tWashington\tWhatcom County\t1176\t33.6\t18.1\t11.2\t16917\t227976\t0.5541\t98295\tObama\t98295\t0.00265519\t98295.0\n23517\t-122.23180500000001\t48.726196\tAcme CDP\tWA\tWashington\tWhatcom County\t291\t35.5\t28.2\t9.6\t20714\t261111\t0.5541\t98220\tObama\t98220\t0.000657024\t98220.0\n23518\t-122.14067\t48.947812\tPeaceful Valley CDP\tWA\tWashington\tWhatcom County\t2895\t28.5\t18.8\t12.8\t17570\t116291\t0.5541\t98295\tObama\t98295\t0.006536374\t98295.0\n23519\t-122.321248\t48.927566\tNooksack city\tWA\tWashington\tWhatcom County\t1001\t32.3\t14.1\t9.9\t22227\t219608\t0.5541\t98247\tObama\t98247\t0.002260073\t98247.0\n23520\t-122.34663799999998\t48.719792\tSudden Valley CDP\tWA\tWashington\tWhatcom County\t5768\t40.3\t51.8\t8.5\t30496\t292883\t0.5541\t98226\tObama\t98226\t0.013023077\t98226.0\n23521\t-117.07532900000001\t46.910367\tPalouse city\tWA\tWashington\tWhitman County\t1085\t44.2\t29.0\t7.0\t23246\t152612\t0.4694\t99161\tObama\t99161\t0.002449729\t99161.0\n23522\t-117.88031299999999\t46.814023999999996\tLa Crosse town\tWA\tWashington\tWhitman County\t379\t45.9\t18.2\t8.2\t16993\t98182\t0.4694\t99143\tObama\t99143\t0.000855712\t99143.0\n23523\t-117.369101\t47.236109\tRosalia town\tWA\tWashington\tWhitman County\t655\t41.6\t16.8\t8.9\t15334\t114865\t0.4694\t99170\tObama\t99170\t0.0014788689999999998\t99170.0\n23524\t-117.47347099999999\t47.229489\tMalden town\tWA\tWashington\tWhitman County\t217\t41.7\t16.8\t9.0\t15360\t116071\t0.4694\t99149\tObama\t99149\t0.000489946\t99149.0\n23525\t-117.04656200000001\t47.087858000000004\tFarmington town\tWA\tWashington\tWhitman County\t153\t46.3\t20.2\t6.5\t20105\t128125\t0.4694\t99128\tObama\t99128\t0.00034544599999999996\t99128.0\n23526\t-117.160625\t46.733046\tPullman city\tWA\tWashington\tWhitman County\t27017\t23.7\t67.0\t10.4\t19618\t230891\t0.4694\t99163\tObama\t99163\t0.060999387999999995\t99163.0\n23527\t-117.249951\t46.791557\tAlbion town\tWA\tWashington\tWhitman County\t606\t34.4\t44.6\t6.7\t24655\t156522\t0.4694\t99102\tObama\t99102\t0.001368236\t99102.0\n23528\t-117.08578100000001\t46.538258\tUniontown town\tWA\tWashington\tWhitman County\t349\t42.2\t30.4\t3.3\t20640\t166912\t0.4694\t99179\tObama\t99179\t0.0007879769999999999\t99179.0\n23529\t-117.36188700000001\t46.884694\tColfax city\tWA\tWashington\tWhitman County\t2739\t43.9\t26.1\t8.7\t24240\t161623\t0.4694\t99111\tObama\t99111\t0.006184155\t99111.0\n23530\t-117.24656\t47.13055\tOakesdale town\tWA\tWashington\tWhitman County\t448\t46.2\t23.8\t9.5\t19460\t125658\t0.4694\t99158\tObama\t99158\t0.0010115010000000002\t99158.0\n23531\t-117.141594\t47.008367\tGarfield town\tWA\tWashington\tWhitman County\t638\t43.4\t27.3\t8.2\t20014\t125735\t0.4694\t99130\tObama\t99130\t0.0014404860000000002\t99130.0\n23532\t-117.686577\t46.928096000000004\tEndicott town\tWA\tWashington\tWhitman County\t347\t40.8\t26.1\t8.1\t19033\t123438\t0.4694\t99125\tObama\t99125\t0.000783462\t99125.0\n23533\t-117.904969\t47.200689000000004\tLamont town\tWA\tWashington\tWhitman County\t104\t43.8\t25.0\t7.7\t16608\t104167\t0.4694\t99017\tObama\t99017\t0.000234813\t99017.0\n23534\t-117.073976\t47.225099\tTekoa city\tWA\tWashington\tWhitman County\t833\t43.6\t14.1\t6.6\t20231\t115278\t0.4694\t99033\tObama\t99033\t0.00188076\t99033.0\n23535\t-117.58559299999999\t47.090565999999995\tSt. John town\tWA\tWashington\tWhitman County\t550\t39.4\t26.9\t8.3\t19954\t125000\t0.4694\t99171\tObama\t99171\t0.0012417980000000001\t99171.0\n23536\t-117.12828200000001\t46.567968\tColton town\tWA\tWashington\tWhitman County\t391\t42.4\t30.2\t3.6\t20607\t165789\t0.4694\t99113\tObama\t99113\t0.0008828060000000001\t99113.0\n23537\t-120.19198200000001\t46.343839\tGranger town\tWA\tWashington\tYakima County\t2833\t23.7\t6.0\t11.4\t10695\t126986\t0.4315\t98932\tObama\t98932\t0.00639639\t98932.0\n23538\t-120.60458100000001\t46.596719\tWest Valley CDP\tWA\tWashington\tYakima County\t12609\t39.7\t30.2\t5.0\t27506\t232705\t0.4315\t98908\tObama\t98908\t0.028468788999999998\t98908.0\n23539\t-120.00680700000001\t46.314146\tSunnyside city\tWA\tWashington\tYakima County\t15116\t25.8\t12.2\t15.6\t12485\t125476\t0.4315\t98944\tObama\t98944\t0.034129132\t98944.0\n23540\t-119.911672\t46.256273\tGrandview city\tWA\tWashington\tYakima County\t9277\t27.1\t13.6\t13.9\t15625\t128675\t0.4315\t98930\tObama\t98930\t0.02094575\t98930.0\n23541\t-120.420744\t46.444829999999996\tWapato city\tWA\tWashington\tYakima County\t4714\t25.8\t8.2\t18.9\t9972\t122368\t0.4315\t98951\tObama\t98951\t0.01064334\t98951.0\n23542\t-119.997032\t46.212223\tMabton city\tWA\tWashington\tYakima County\t2089\t26.0\t5.0\t16.3\t9208\t110326\t0.4315\t98935\tObama\t98935\t0.004716576\t98935.0\n23543\t-120.63388700000002\t46.667396999999994\tEschbach CDP\tWA\tWashington\tYakima County\t416\t42.3\t17.1\t5.4\t20883\t194444\t0.4315\t98908\tObama\t98908\t0.0009392510000000001\t98908.0\n23544\t-120.39773000000001\t46.563226\tMoxee city\tWA\tWashington\tYakima County\t1151\t34.5\t9.0\t8.8\t17339\t145755\t0.4315\t989HH\tObama\t989HH\t0.002598745\t0.0\n23545\t-120.60241200000002\t46.659428999999996\tGleed CDP\tWA\tWashington\tYakima County\t3061\t41.9\t23.1\t4.6\t22383\t192833\t0.4315\t98908\tObama\t98908\t0.006911171999999999\t98908.0\n23546\t-120.49348400000001\t46.557003\tUnion Gap city\tWA\tWashington\tYakima County\t5841\t35.0\t7.3\t10.2\t17516\t112047\t0.4315\t989HH\tObama\t989HH\t0.013187896999999999\t0.0\n23547\t-120.44771399999999\t46.602019\tTerrace Heights CDP\tWA\tWashington\tYakima County\t7039\t43.0\t25.5\t7.0\t24496\t194856\t0.4315\t989HH\tObama\t989HH\t0.01589276\t0.0\n23548\t-120.607262\t46.560190000000006\tAhtanum CDP\tWA\tWashington\tYakima County\t5084\t43.0\t19.7\t6.1\t23804\t208243\t0.4315\t98903\tObama\t98903\t0.011478731\t98903.0\n23549\t-120.53863999999999\t46.64738\tSelah city\tWA\tWashington\tYakima County\t6848\t32.0\t25.2\t5.5\t22042\t196971\t0.4315\t98902\tObama\t98902\t0.015461517\t98902.0\n23550\t-120.26251\t46.404678999999994\tZillah city\tWA\tWashington\tYakima County\t2692\t33.9\t20.6\t7.4\t20899\t180873\t0.4315\t98953\tObama\t98953\t0.006078038000000001\t98953.0\n23551\t-120.31320500000001\t46.379397999999995\tToppenish city\tWA\tWashington\tYakima County\t9225\t25.7\t8.2\t14.5\t9790\t129231\t0.4315\t98948\tObama\t98948\t0.020828343\t98948.0\n23552\t-120.120899\t46.235019\tSatus CDP\tWA\tWashington\tYakima County\t784\t30.0\t14.5\t9.8\t11485\t107292\t0.4315\t98935\tObama\t98935\t0.001770127\t98935.0\n23553\t-120.720929\t46.38969\tWhite Swan CDP\tWA\tWashington\tYakima County\t3304\t26.2\t12.8\t16.5\t13752\t136786\t0.4315\t98952\tObama\t98952\t0.007459821\t98952.0\n23554\t-120.529676\t46.595304999999996\tYakima city\tWA\tWashington\tYakima County\t73493\t32.1\t18.3\t11.0\t17728\t151757\t0.4315\t98902\tObama\t98902\t0.16593359800000002\t98902.0\n23555\t-120.75738100000001\t46.703308\tTieton town\tWA\tWashington\tYakima County\t1320\t27.5\t8.8\t6.4\t13805\t148611\t0.4315\t98947\tObama\t98947\t0.0029803159999999998\t98947.0\n23556\t-120.65155700000001\t46.598166\tSummitview CDP\tWA\tWashington\tYakima County\t937\t42.0\t29.3\t4.7\t26885\t264103\t0.4315\t98908\tObama\t98908\t0.002115573\t98908.0\n23557\t-120.542716\t46.404996999999995\tHarrah town\tWA\tWashington\tYakima County\t557\t30.3\t15.7\t7.6\t16467\t150000\t0.4315\t98933\tObama\t98933\t0.001257603\t98933.0\n23558\t-120.698842\t46.729603000000004\tNaches town\tWA\tWashington\tYakima County\t718\t38.8\t12.9\t5.8\t20594\t149716\t0.4315\t98947\tObama\t98947\t0.0016211110000000002\t98947.0\n23559\t-80.042755\t39.149925\tPhilippi city\tWV\tWest Virginia\tBarbour County\t2981\t37.8\t22.0\t8.2\t15150\t94846\t0.3069\t26416\tRomney\t26416\t0.019780523\t26416.0\n23560\t-79.938215\t39.022102000000004\tBelington town\tWV\tWest Virginia\tBarbour County\t1901\t41.7\t10.9\t9.1\t14458\t76771\t0.3069\t26250\tRomney\t26250\t0.012614148\t26250.0\n23561\t-79.950529\t38.978212\tJunior town\tWV\tWest Virginia\tBarbour County\t457\t42.4\t7.2\t10.6\t13297\t75000\t0.3069\t26275\tRomney\t26275\t0.0030324379999999997\t26275.0\n23562\t-77.99454399999999\t39.554607\tHedgesville town\tWV\tWest Virginia\tBerkeley County\t341\t38.4\t11.8\t12.9\t20573\t153846\t0.384\t25427\tRomney\t25427\t0.002262717\t25427.0\n23563\t-78.055148\t39.353868\tInwood CDP\tWV\tWest Virginia\tBerkeley County\t2598\t39.9\t17.2\t8.9\t22755\t158367\t0.384\t25428\tRomney\t25428\t0.017239114\t25428.0\n23564\t-77.969174\t39.461175\tMartinsburg city\tWV\tWest Virginia\tBerkeley County\t17265\t38.5\t17.0\t14.9\t20863\t127003\t0.384\t25401\tRomney\t25401\t0.11456247300000001\t25401.0\n23565\t-81.532352\t37.976936\tWhitesville town\tWV\tWest Virginia\tBoone County\t500\t44.5\t7.3\t11.6\t16549\t54286\t0.3282\t25209\tRomney\t25209\t0.0033177659999999998\t25209.0\n23566\t-81.834225\t38.080833\tDanville town\tWV\tWest Virginia\tBoone County\t544\t43.2\t11.4\t9.4\t18380\t85833\t0.3282\t25053\tRomney\t25053\t0.00360973\t25053.0\n23567\t-81.562229\t38.008014\tSylvester town\tWV\tWest Virginia\tBoone County\t192\t44.0\t15.1\t7.0\t14017\t75000\t0.3282\t25193\tRomney\t25193\t0.0012740219999999999\t25193.0\n23568\t-81.804608\t38.059470000000005\tMadison city\tWV\tWest Virginia\tBoone County\t2616\t43.0\t14.2\t10.2\t18847\t98452\t0.3282\t25130\tRomney\t25130\t0.017358553999999998\t25130.0\n23569\t-80.65276999999999\t38.720211\tFlatwoods town\tWV\tWest Virginia\tBraxton County\t345\t40.5\t21.5\t5.8\t15871\t112500\t0.4159\t26627\tRomney\t26627\t0.002289259\t26627.0\n23570\t-80.711524\t38.666391\tSutton town\tWV\tWest Virginia\tBraxton County\t993\t45.4\t17.6\t7.2\t17742\t91750\t0.4159\t26601\tRomney\t26601\t0.006589084\t26601.0\n23571\t-80.771723\t38.670242\tGassaway town\tWV\tWest Virginia\tBraxton County\t816\t44.9\t16.6\t8.4\t19135\t80517\t0.4159\t26624\tRomney\t26624\t0.005414595\t26624.0\n23572\t-80.65395500000001\t38.858167\tBurnsville town\tWV\tWest Virginia\tBraxton County\t468\t42.1\t6.4\t10.3\t14860\t78000\t0.4159\t26335\tRomney\t26335\t0.0031054290000000003\t26335.0\n23573\t-80.664676\t40.191472999999995\tWindsor Heights village\tWV\tWest Virginia\tBrooke County\t386\t44.2\t8.0\t11.6\t17263\t46875\t0.4309\t26075\tRomney\t26075\t0.002561316\t26075.0\n23574\t-80.5816\t40.319032\tHooverson Heights CDP\tWV\tWest Virginia\tBrooke County\t2694\t44.9\t11.0\t11.3\t21644\t84884\t0.4309\t26037\tRomney\t26037\t0.017876125\t26037.0\n23575\t-80.597088\t40.33788\tFollansbee city\tWV\tWest Virginia\tBrooke County\t3120\t46.0\t16.5\t13.7\t20911\t85685\t0.4309\t26037\tRomney\t26037\t0.020702862\t26037.0\n23576\t-80.562686\t40.205259000000005\tBethany town\tWV\tWest Virginia\tBrooke County\t923\t23.8\t38.1\t29.3\t15398\t104934\t0.4309\t26032\tRomney\t26032\t0.006124597\t26032.0\n23577\t-80.653902\t40.226672\tBeech Bottom village\tWV\tWest Virginia\tBrooke County\t530\t46.8\t9.0\t15.0\t23133\t53000\t0.4309\t26030\tRomney\t26030\t0.003516832\t26030.0\n23578\t-80.610024\t40.281069\tWellsburg city\tWV\tWest Virginia\tBrooke County\t2641\t48.8\t17.3\t11.4\t20872\t84286\t0.4309\t26070\tRomney\t26070\t0.017524442\t26070.0\n23579\t-82.137064\t38.435346\tMilton town\tWV\tWest Virginia\tCabell County\t2228\t41.4\t19.6\t9.3\t21746\t95581\t0.4221\t25541\tRomney\t25541\t0.014783967\t25541.0\n23580\t-82.428786\t38.411971\tHuntington city\tWV\tWest Virginia\tCabell County\t48792\t38.7\t25.8\t13.0\t19416\t89740\t0.4221\t25701\tRomney\t25701\t0.323760914\t25701.0\n23581\t-82.047674\t38.422551\tCulloden CDP\tWV\tWest Virginia\tCabell County\t3297\t43.0\t20.7\t7.2\t22795\t103267\t0.4221\t25510\tRomney\t25510\t0.021877351\t25510.0\n23582\t-82.320065\t38.417738\tPea Ridge CDP\tWV\tWest Virginia\tCabell County\t6347\t41.8\t37.8\t6.8\t26720\t131533\t0.4221\t25504\tRomney\t25504\t0.042115726\t25504.0\n23583\t-82.298179\t38.405569\tBarboursville village\tWV\tWest Virginia\tCabell County\t3473\t44.7\t23.6\t7.4\t25469\t111716\t0.4221\t25504\tRomney\t25504\t0.023045205\t25504.0\n23584\t-81.093303\t38.920393\tGrantsville town\tWV\tWest Virginia\tCalhoun County\t577\t47.5\t14.2\t15.3\t13246\t59375\t0.3706\t26147\tRomney\t26147\t0.0038287020000000002\t26147.0\n23585\t-81.08143199999999\t38.470813\tClay town\tWV\tWest Virginia\tClay County\t583\t37.2\t14.7\t20.6\t16256\t74722\t0.3091\t25133\tRomney\t25133\t0.003868516\t25133.0\n23586\t-80.775246\t39.296496000000005\tWest Union town\tWV\tWest Virginia\tDoddridge County\t817\t42.3\t14.5\t12.6\t15506\t67917\t0.2077\t26456\tRomney\t26456\t0.00542123\t26456.0\n23587\t-81.174812\t37.900387\tMount Hope city\tWV\tWest Virginia\tFayette County\t1349\t38.4\t13.5\t18.9\t15286\t56667\t0.3851\t25880\tRomney\t25880\t0.008951334\t25880.0\n23588\t-81.07965899999999\t37.960821\tThurmond town\tWV\tWest Virginia\tFayette County\t7\t0.0\t0.0\t0.0\t11811\t55000\t0.3851\t25879\tRomney\t25879\t4.6399999999999996e-05\t25879.0\n23589\t-81.151289\t37.984536999999996\tOak Hill city\tWV\tWest Virginia\tFayette County\t7497\t43.7\t11.1\t10.1\t17725\t79461\t0.3851\t25901\tRomney\t25901\t0.049746589\t25901.0\n23590\t-81.304707\t38.183088\tSmithers city\tWV\tWest Virginia\tFayette County\t842\t41.3\t12.7\t7.6\t18760\t81935\t0.3851\t25186\tRomney\t25186\t0.005587119000000001\t25186.0\n23591\t-81.20359\t38.167849\tGauley Bridge town\tWV\tWest Virginia\tFayette County\t697\t41.3\t19.2\t6.7\t17748\t87188\t0.3851\t25085\tRomney\t25085\t0.0046249659999999995\t25085.0\n23592\t-80.856144\t37.861303\tMeadow Bridge town\tWV\tWest Virginia\tFayette County\t326\t45.0\t7.9\t7.3\t15520\t68333\t0.3851\t25976\tRomney\t25976\t0.002163184\t25976.0\n23593\t-81.264753\t37.909752000000005\tPax town\tWV\tWest Virginia\tFayette County\t170\t42.1\t4.1\t23.9\t10443\t60714\t0.3851\t25904\tRomney\t25904\t0.001128041\t25904.0\n23594\t-81.32130699999999\t38.178202\tMontgomery city\tWV\tWest Virginia\tFayette County\t1795\t39.5\t19.2\t12.6\t16991\t77778\t0.3851\t25136\tRomney\t25136\t0.011910781\t25136.0\n23595\t-81.103913\t38.135712\tAnsted town\tWV\tWest Virginia\tFayette County\t1513\t43.6\t9.0\t12.1\t16232\t62632\t0.3851\t25812\tRomney\t25812\t0.010039560999999999\t25812.0\n23596\t-81.109391\t38.046107\tFayetteville town\tWV\tWest Virginia\tFayette County\t3848\t45.5\t24.1\t9.0\t21854\t99038\t0.3851\t25840\tRomney\t25840\t0.02553353\t25840.0\n23597\t-81.307147\t38.091415999999995\tPowellton CDP\tWV\tWest Virginia\tFayette County\t1724\t37.1\t12.6\t12.8\t14793\t77500\t0.3851\t25161\tRomney\t25161\t0.011439658\t25161.0\n23598\t-80.747675\t38.915403999999995\tSand Fork town\tWV\tWest Virginia\tGilmer County\t165\t40.0\t10.5\t13.0\t14206\t77500\t0.3348\t26430\tRomney\t26430\t0.001094863\t26430.0\n23599\t-80.83410500000001\t38.937926000000004\tGlenville town\tWV\tWest Virginia\tGilmer County\t2691\t31.3\t32.3\t10.6\t11804\t93261\t0.3348\t26351\tRomney\t26351\t0.017856219\t26351.0\n23600\t-79.366167\t39.270922\tBayard town\tWV\tWest Virginia\tGrant County\t319\t46.0\t11.9\t15.4\t18846\t85556\t0.1566\t26707\tRomney\t26707\t0.002116735\t26707.0\n23601\t-79.127737\t38.995765999999996\tPetersburg city\tWV\tWest Virginia\tGrant County\t2479\t44.9\t23.0\t14.6\t19271\t110728\t0.1566\t26847\tRomney\t26847\t0.016449486\t26847.0\n23602\t-80.771815\t37.967877\tRainelle town\tWV\tWest Virginia\tGreenbrier County\t1445\t48.3\t12.9\t12.9\t16433\t69348\t0.3633\t25962\tRomney\t25962\t0.009588345\t25962.0\n23603\t-80.302428\t37.795617\tWhite Sulphur Springs city\tWV\tWest Virginia\tGreenbrier County\t2328\t46.2\t10.9\t12.0\t19948\t96059\t0.3633\t24925\tRomney\t24925\t0.01544752\t24925.0\n23604\t-80.458274\t37.775554\tFairlea CDP\tWV\tWest Virginia\tGreenbrier County\t1754\t43.9\t17.5\t5.6\t17675\t82200\t0.3633\t24970\tRomney\t24970\t0.011638724\t24970.0\n23605\t-80.68689\t37.965015\tRupert town\tWV\tWest Virginia\tGreenbrier County\t935\t44.3\t12.2\t8.0\t12876\t72222\t0.3633\t25984\tRomney\t25984\t0.006204223000000001\t25984.0\n23606\t-80.35749799999999\t37.992626\tFalling Spring town\tWV\tWest Virginia\tGreenbrier County\t215\t45.9\t11.3\t11.5\t13599\t76000\t0.3633\t24966\tRomney\t24966\t0.00142664\t24966.0\n23607\t-80.470839\t37.749053\tRonceverte city\tWV\tWest Virginia\tGreenbrier County\t1595\t43.3\t15.6\t7.7\t17955\t96486\t0.3633\t24970\tRomney\t24970\t0.010583675\t24970.0\n23608\t-80.64200799999999\t37.729481\tAlderson town\tWV\tWest Virginia\tGreenbrier County\t1124\t41.9\t13.0\t8.7\t20901\t94459\t0.3633\t24910\tRomney\t24910\t0.0074583390000000005\t24910.0\n23609\t-80.432199\t37.80996\tLewisburg city\tWV\tWest Virginia\tGreenbrier County\t3689\t47.9\t34.3\t9.1\t25121\t178926\t0.3633\t24901\tRomney\t24901\t0.02447848\t24901.0\n23610\t-80.70350400000001\t38.058214\tQuinwood town\tWV\tWest Virginia\tGreenbrier County\t423\t43.0\t1.7\t20.5\t11489\t49167\t0.3633\t25981\tRomney\t25981\t0.00280683\t25981.0\n23611\t-78.755658\t39.344959\tRomney city\tWV\tWest Virginia\tHampshire County\t1853\t43.8\t24.3\t13.1\t18101\t114368\t0.2879\t26757\tRomney\t26757\t0.012295641999999999\t26757.0\n23612\t-78.43423\t39.298739000000005\tCapon Bridge town\tWV\tWest Virginia\tHampshire County\t236\t44.9\t15.2\t10.8\t23195\t124167\t0.2879\t26711\tRomney\t26711\t0.0015659860000000001\t26711.0\n23613\t-80.56366700000001\t40.612716999999996\tChester city\tWV\tWest Virginia\tHancock County\t2408\t43.7\t16.8\t16.2\t18525\t78456\t0.3818\t26034\tRomney\t26034\t0.015978363\t26034.0\n23614\t-80.599981\t40.617917\tNewell CDP\tWV\tWest Virginia\tHancock County\t1378\t38.2\t4.8\t19.0\t17695\t55164\t0.3818\t26050\tRomney\t26050\t0.009143764\t26050.0\n23615\t-80.540876\t40.416765999999996\tWeirton city\tWV\tWest Virginia\tHancock County\t19842\t46.6\t16.4\t14.5\t23730\t94129\t0.3818\t26062\tRomney\t26062\t0.13166224099999999\t26062.0\n23616\t-80.61585500000001\t40.507137\tNew Cumberland city\tWV\tWest Virginia\tHancock County\t932\t46.2\t10.9\t17.1\t23875\t69571\t0.3818\t26047\tRomney\t26047\t0.006184317\t26047.0\n23617\t-78.965997\t39.061484\tMoorefield town\tWV\tWest Virginia\tHardy County\t2293\t40.7\t8.2\t11.4\t16605\t85755\t0.2868\t26836\tRomney\t26836\t0.015215277\t26836.0\n23618\t-78.593496\t39.076495\tWardensville town\tWV\tWest Virginia\tHardy County\t278\t44.8\t13.4\t10.8\t19708\t122222\t0.2868\t26851\tRomney\t26851\t0.001844678\t26851.0\n23619\t-80.564006\t39.285032\tSalem city\tWV\tWest Virginia\tHarrison County\t1866\t33.6\t24.4\t9.3\t15483\t70882\t0.3722\t26426\tRomney\t26426\t0.012381904\t26426.0\n23620\t-80.24804\t39.301774\tBridgeport city\tWV\tWest Virginia\tHarrison County\t7588\t46.2\t37.4\t5.1\t28733\t168881\t0.3722\t26330\tRomney\t26330\t0.050350422\t26330.0\n23621\t-80.403385\t39.204438\tWest Milford town\tWV\tWest Virginia\tHarrison County\t630\t42.4\t8.6\t10.0\t17048\t99412\t0.3722\t26451\tRomney\t26451\t0.0041803859999999995\t26451.0\n23622\t-80.29176600000001\t39.26086\tAnmoore town\tWV\tWest Virginia\tHarrison County\t641\t40.9\t23.9\t7.0\t20267\t122348\t0.3722\t26323\tRomney\t26323\t0.004253376\t26323.0\n23623\t-80.298567\t39.392466\tShinnston city\tWV\tWest Virginia\tHarrison County\t2214\t44.3\t18.9\t9.6\t21588\t94313\t0.3722\t26431\tRomney\t26431\t0.01469107\t26431.0\n23624\t-80.31582\t39.287347\tDespard CDP\tWV\tWest Virginia\tHarrison County\t1065\t39.0\t10.0\t7.4\t13286\t49265\t0.3722\t26302\tRomney\t26302\t0.007066841999999999\t26302.0\n23625\t-80.348052\t39.162451000000004\tLost Creek town\tWV\tWest Virginia\tHarrison County\t456\t39.8\t17.7\t11.7\t20244\t106875\t0.3722\t26385\tRomney\t26385\t0.003025803\t26385.0\n23626\t-80.348381\t39.374119\tLumberport town\tWV\tWest Virginia\tHarrison County\t909\t42.1\t15.9\t8.5\t19323\t82059\t0.3722\t26366\tRomney\t26366\t0.006031699000000001\t26366.0\n23627\t-80.32646899999999\t39.260312\tNutter Fort town\tWV\tWest Virginia\tHarrison County\t1635\t46.0\t19.0\t6.5\t21618\t88043\t0.3722\t26302\tRomney\t26302\t0.010849096\t26302.0\n23628\t-80.283436\t39.419719\tEnterprise CDP\tWV\tWest Virginia\tHarrison County\t909\t41.7\t11.1\t7.9\t17763\t72885\t0.3722\t26568\tRomney\t26568\t0.006031699000000001\t26568.0\n23629\t-80.30545\t39.250144\tStonewood city\tWV\tWest Virginia\tHarrison County\t1784\t45.5\t11.7\t8.9\t20512\t78056\t0.3722\t26302\tRomney\t26302\t0.01183779\t26302.0\n23630\t-80.34796\t39.286331\tClarksburg city\tWV\tWest Virginia\tHarrison County\t16412\t42.7\t17.8\t10.0\t20352\t87263\t0.3722\t26301\tRomney\t26301\t0.108902363\t26301.0\n23631\t-81.76176099999999\t38.955946999999995\tRavenswood city\tWV\tWest Virginia\tJackson County\t3943\t44.5\t19.1\t11.0\t21388\t103579\t0.3339\t26164\tRomney\t26164\t0.026163906\t26164.0\n23632\t-81.708573\t38.820084\tRipley city\tWV\tWest Virginia\tJackson County\t3069\t45.1\t18.4\t9.4\t17222\t110263\t0.3339\t25271\tRomney\t25271\t0.02036445\t25271.0\n23633\t-77.86005\t39.299673\tCorporation of Ranson town\tWV\tWest Virginia\tJefferson County\t3326\t37.4\t8.3\t7.0\t19658\t151667\t0.4697\t25438\tRomney\t25438\t0.022069782000000003\t25438.0\n23634\t-77.805188\t39.432006\tShepherdstown town\tWV\tWest Virginia\tJefferson County\t1414\t31.2\t52.9\t6.8\t28460\t316667\t0.4697\t25443\tRomney\t25443\t0.009382643000000001\t25443.0\n23635\t-77.74134699999999\t39.325352\tHarpers Ferry town\tWV\tWest Virginia\tJefferson County\t363\t45.1\t35.8\t5.8\t29150\t215625\t0.4697\t25425\tRomney\t25425\t0.002408698\t25425.0\n23636\t-77.854853\t39.28182\tCharles Town city\tWV\tWest Virginia\tJefferson County\t3403\t40.0\t27.1\t6.5\t24760\t226515\t0.4697\t25414\tRomney\t25414\t0.022580718\t25414.0\n23637\t-77.753251\t39.323538\tBolivar town\tWV\tWest Virginia\tJefferson County\t1409\t45.3\t35.8\t6.0\t29112\t214329\t0.4697\t25425\tRomney\t25425\t0.009349465999999999\t25425.0\n23638\t-81.770622\t38.435117\tCross Lanes CDP\tWV\tWest Virginia\tKanawha County\t10041\t40.3\t31.0\t7.5\t25682\t114748\t0.4326\t25313\tRomney\t25313\t0.066627384\t25313.0\n23639\t-81.629338\t38.349511\tCharleston city\tWV\tWest Virginia\tKanawha County\t50572\t43.8\t36.8\t7.6\t29764\t122259\t0.4326\t25301\tRomney\t25301\t0.335572162\t25301.0\n23640\t-81.536227\t38.223202\tChesapeake town\tWV\tWest Virginia\tKanawha County\t1534\t46.7\t12.8\t12.0\t18885\t69103\t0.4326\t25015\tRomney\t25015\t0.010178907\t25015.0\n23641\t-81.477165\t38.432641\tElkview CDP\tWV\tWest Virginia\tKanawha County\t1284\t46.8\t17.4\t7.3\t23315\t83158\t0.4326\t25071\tRomney\t25071\t0.008520024000000001\t25071.0\n23642\t-81.827667\t38.431583\tNitro city\tWV\tWest Virginia\tKanawha County\t6530\t42.8\t17.3\t7.7\t24402\t84685\t0.4326\t25143\tRomney\t25143\t0.043330029000000006\t25143.0\n23643\t-81.34969699999999\t38.486791\tClendenin town\tWV\tWest Virginia\tKanawha County\t1047\t43.8\t10.1\t15.1\t15145\t60000\t0.4326\t25045\tRomney\t25045\t0.006947403\t25045.0\n23644\t-81.480776\t38.406106\tPinch CDP\tWV\tWest Virginia\tKanawha County\t2800\t42.5\t34.9\t7.2\t24302\t135473\t0.4326\t250HH\tRomney\t250HH\t0.018579492\t0.0\n23645\t-81.81996\t38.376816\tSt. Albans city\tWV\tWest Virginia\tKanawha County\t10924\t46.2\t25.6\t7.1\t26314\t94866\t0.4326\t25177\tRomney\t25177\t0.07248656\t25177.0\n23646\t-81.42184\t38.21085\tGlasgow town\tWV\tWest Virginia\tKanawha County\t683\t44.8\t7.6\t9.3\t21909\t68542\t0.4326\t25086\tRomney\t25086\t0.0045320690000000005\t25086.0\n23647\t-81.571586\t38.245718\tMarmet city\tWV\tWest Virginia\tKanawha County\t1610\t45.6\t11.0\t11.5\t20114\t72131\t0.4326\t25315\tRomney\t25315\t0.010683208000000001\t25315.0\n23648\t-81.772424\t38.372728\tJefferson town\tWV\tWest Virginia\tKanawha County\t538\t43.7\t16.8\t10.7\t18641\t74545\t0.4326\t25064\tRomney\t25064\t0.003569917\t25064.0\n23649\t-81.443912\t38.215295000000005\tEast Bank town\tWV\tWest Virginia\tKanawha County\t831\t43.2\t13.5\t7.3\t19187\t84250\t0.4326\t25067\tRomney\t25067\t0.005514128\t25067.0\n23650\t-81.707093\t38.353281\tSouth Charleston city\tWV\tWest Virginia\tKanawha County\t12688\t45.9\t30.0\t7.0\t28436\t103563\t0.4326\t25303\tRomney\t25303\t0.084191639\t25303.0\n23651\t-81.538815\t38.233791\tBelle town\tWV\tWest Virginia\tKanawha County\t1187\t44.3\t14.1\t6.8\t21277\t83676\t0.4326\t25315\tRomney\t25315\t0.007876377\t25315.0\n23652\t-81.367289\t38.186234999999996\tHandley town\tWV\tWest Virginia\tKanawha County\t316\t39.5\t15.9\t12.0\t18514\t56250\t0.4326\t25102\tRomney\t25102\t0.002096828\t25102.0\n23653\t-81.855098\t38.353282\tTornado CDP\tWV\tWest Virginia\tKanawha County\t1120\t37.5\t28.2\t3.4\t25876\t102252\t0.4326\t25202\tRomney\t25202\t0.0074317969999999995\t25202.0\n23654\t-81.522481\t38.318295\tCoal Fork CDP\tWV\tWest Virginia\tKanawha County\t1171\t44.4\t5.6\t9.1\t17970\t72500\t0.4326\t25306\tRomney\t25306\t0.007770209\t25306.0\n23655\t-81.437657\t38.222318\tCedar Grove town\tWV\tWest Virginia\tKanawha County\t742\t42.4\t4.7\t9.3\t19392\t60714\t0.4326\t25086\tRomney\t25086\t0.004923565\t25086.0\n23656\t-81.734368\t38.366748\tDunbar city\tWV\tWest Virginia\tKanawha County\t7901\t44.3\t22.8\t9.0\t25551\t92788\t0.4326\t25064\tRomney\t25064\t0.052427344\t25064.0\n23657\t-81.386995\t38.208492\tPratt town\tWV\tWest Virginia\tKanawha County\t479\t47.2\t18.4\t4.8\t25303\t79583\t0.4326\t25162\tRomney\t25162\t0.00317842\t25162.0\n23658\t-81.640012\t38.504073\tSissonville CDP\tWV\tWest Virginia\tKanawha County\t4305\t42.6\t18.5\t8.4\t21163\t89608\t0.4326\t25320\tRomney\t25320\t0.028565967999999997\t25320.0\n23659\t-80.46906899999999\t39.042526\tWeston city\tWV\tWest Virginia\tLewis County\t4386\t44.4\t12.7\t8.9\t17551\t86897\t0.2761\t26452\tRomney\t26452\t0.029103447\t26452.0\n23660\t-80.408589\t39.110002\tJane Lew town\tWV\tWest Virginia\tLewis County\t427\t42.9\t20.1\t10.3\t18334\t109524\t0.2761\t26378\tRomney\t26378\t0.0028333720000000002\t26378.0\n23661\t-82.14032399999999\t38.038167\tHarts CDP\tWV\tWest Virginia\tLincoln County\t2421\t37.8\t5.3\t15.6\t12287\t60877\t0.3266\t25524\tRomney\t25524\t0.016064625\t25524.0\n23662\t-82.123204\t38.280237\tHamlin town\tWV\tWest Virginia\tLincoln County\t1050\t43.5\t17.0\t13.4\t18111\t79474\t0.3266\t25523\tRomney\t25523\t0.0069673090000000005\t25523.0\n23663\t-82.198842\t38.280241\tWest Hamlin town\tWV\tWest Virginia\tLincoln County\t728\t38.8\t9.1\t13.1\t14000\t79167\t0.3266\t25571\tRomney\t25571\t0.004830668\t25571.0\n23664\t-81.844421\t38.279052\tAlum Creek CDP\tWV\tWest Virginia\tLincoln County\t1985\t44.0\t17.5\t10.8\t21808\t112619\t0.3266\t25564\tRomney\t25564\t0.013171533000000001\t25564.0\n23665\t-81.776501\t37.779621999999996\tAmherstdale-Robinette CDP\tWV\tWest Virginia\tLogan County\t1663\t43.4\t4.3\t18.4\t16169\t77703\t0.2904\t25607\tRomney\t25607\t0.011034891000000002\t25607.0\n23666\t-81.986625\t37.908761\tMitchell Heights town\tWV\tWest Virginia\tLogan County\t331\t46.6\t25.8\t12.0\t28073\t145192\t0.2904\t25624\tRomney\t25624\t0.002196361\t25624.0\n23667\t-81.813364\t37.745261\tMallory CDP\tWV\tWest Virginia\tLogan County\t1063\t44.0\t4.3\t17.9\t15301\t70645\t0.2904\t25617\tRomney\t25617\t0.007053571\t25617.0\n23668\t-81.985846\t37.850837\tLogan city\tWV\tWest Virginia\tLogan County\t1540\t46.3\t13.8\t11.0\t18684\t77547\t0.2904\t25601\tRomney\t25601\t0.01021872\t25601.0\n23669\t-81.873663\t37.74214\tMan town\tWV\tWest Virginia\tLogan County\t722\t42.5\t13.2\t15.3\t15041\t75667\t0.2904\t25635\tRomney\t25635\t0.004790855\t25635.0\n23670\t-82.03182199999999\t37.972735\tChapmanville town\tWV\tWest Virginia\tLogan County\t1137\t43.4\t14.2\t13.3\t18042\t100000\t0.2904\t25508\tRomney\t25508\t0.007544601\t25508.0\n23671\t-82.045955\t37.85445\tMount Gay-Shamrock CDP\tWV\tWest Virginia\tLogan County\t2429\t41.8\t7.0\t17.0\t13482\t72368\t0.2904\t25649\tRomney\t25649\t0.016117708999999997\t25649.0\n23672\t-81.990711\t37.867962\tWest Logan town\tWV\tWest Virginia\tLogan County\t406\t49.2\t19.8\t14.7\t18481\t89615\t0.2904\t25639\tRomney\t25639\t0.002694026\t25639.0\n23673\t-81.99941700000001\t37.791292\tSwitzer CDP\tWV\tWest Virginia\tLogan County\t1106\t41.8\t10.3\t12.3\t16589\t75192\t0.2904\t25647\tRomney\t25647\t0.007338899\t25647.0\n23674\t-82.073468\t37.816142\tHolden CDP\tWV\tWest Virginia\tLogan County\t1036\t40.3\t9.1\t13.5\t16463\t73750\t0.2904\t25625\tRomney\t25625\t0.006874412\t25625.0\n23675\t-81.441375\t37.336876000000004\tAnawalt town\tWV\tWest Virginia\tMcDowell County\t237\t44.3\t3.6\t14.9\t9837\t26500\t0.3408\t24808\tRomney\t24808\t0.001572621\t24808.0\n23676\t-81.427435\t37.419579999999996\tNorthfork town\tWV\tWest Virginia\tMcDowell County\t444\t44.2\t9.8\t18.4\t10570\t26667\t0.3408\t24855\tRomney\t24855\t0.002946177\t24855.0\n23677\t-81.817419\t37.463784000000004\tIaeger town\tWV\tWest Virginia\tMcDowell County\t303\t45.0\t9.9\t16.7\t12698\t44500\t0.3408\t24844\tRomney\t24844\t0.002010566\t24844.0\n23678\t-81.507909\t37.426742\tKimball town\tWV\tWest Virginia\tMcDowell County\t361\t46.2\t15.5\t18.5\t13988\t37083\t0.3408\t24853\tRomney\t24853\t0.0023954270000000003\t24853.0\n23679\t-81.647549\t37.475831\tDavy town\tWV\tWest Virginia\tMcDowell County\t319\t39.9\t1.8\t22.6\t10073\t20000\t0.3408\t24828\tRomney\t24828\t0.002116735\t24828.0\n23680\t-81.446273\t37.415782\tKeystone city\tWV\tWest Virginia\tMcDowell County\t388\t42.4\t7.9\t20.8\t9820\t38958\t0.3408\t24852\tRomney\t24852\t0.002574587\t24852.0\n23681\t-81.58077\t37.43285\tWelch city\tWV\tWest Virginia\tMcDowell County\t2386\t46.1\t12.2\t16.9\t14958\t44527\t0.3408\t24801\tRomney\t24801\t0.015832381\t24801.0\n23682\t-81.548461\t37.3611\tGary city\tWV\tWest Virginia\tMcDowell County\t793\t50.2\t10.4\t14.0\t16317\t30750\t0.3408\t24836\tRomney\t24836\t0.005261976999999999\t24836.0\n23683\t-81.801139\t37.35335\tBradshaw town\tWV\tWest Virginia\tMcDowell County\t254\t40.1\t4.1\t19.0\t10515\t37500\t0.3408\t24817\tRomney\t24817\t0.001685425\t24817.0\n23684\t-81.680442\t37.304338\tWar city\tWV\tWest Virginia\tMcDowell County\t662\t44.3\t13.3\t14.6\t13373\t39063\t0.3408\t24892\tRomney\t24892\t0.004392723\t24892.0\n23685\t-80.26321899999999\t39.456478000000004\tWorthington town\tWV\tWest Virginia\tMarion County\t165\t45.0\t13.9\t9.5\t18388\t74444\t0.4159\t26591\tRomney\t26591\t0.001094863\t26591.0\n23686\t-80.169863\t39.501665\tBarrackville town\tWV\tWest Virginia\tMarion County\t1276\t42.3\t19.7\t10.3\t17594\t99615\t0.4159\t26559\tRomney\t26559\t0.00846694\t26559.0\n23687\t-80.17724799999999\t39.558951\tGrant Town town\tWV\tWest Virginia\tMarion County\t644\t43.5\t11.6\t10.8\t19126\t72955\t0.4159\t26574\tRomney\t26574\t0.004273283\t26574.0\n23688\t-80.15414399999999\t39.450666999999996\tPleasant Valley city\tWV\tWest Virginia\tMarion County\t3147\t42.1\t21.1\t8.4\t21071\t108706\t0.4159\t26554\tRomney\t26554\t0.020882022\t26554.0\n23689\t-80.188387\t39.425014000000004\tWhitehall town\tWV\tWest Virginia\tMarion County\t625\t43.2\t32.8\t5.9\t26016\t168750\t0.4159\t26554\tRomney\t26554\t0.0041472079999999995\t26554.0\n23690\t-80.25135300000001\t39.511815999999996\tFarmington town\tWV\tWest Virginia\tMarion County\t377\t44.4\t7.6\t4.9\t16886\t71111\t0.4159\t26571\tRomney\t26571\t0.002501596\t26571.0\n23691\t-80.120599\t39.53188\tRivesville town\tWV\tWest Virginia\tMarion County\t843\t47.7\t11.5\t10.4\t18826\t90147\t0.4159\t26586\tRomney\t26586\t0.005593754\t26586.0\n23692\t-80.246773\t39.592707\tFairview town\tWV\tWest Virginia\tMarion County\t422\t43.8\t11.8\t8.6\t18477\t69583\t0.4159\t26570\tRomney\t26570\t0.002800195\t26570.0\n23693\t-80.34075\t39.527294\tMannington city\tWV\tWest Virginia\tMarion County\t2666\t42.6\t15.5\t10.1\t19368\t71554\t0.4159\t26582\tRomney\t26582\t0.01769033\t26582.0\n23694\t-80.21824699999999\t39.459697999999996\tMonongah town\tWV\tWest Virginia\tMarion County\t999\t47.5\t10.3\t7.7\t16431\t72727\t0.4159\t26576\tRomney\t26576\t0.006628897\t26576.0\n23695\t-80.14647\t39.480532000000004\tFairmont city\tWV\tWest Virginia\tMarion County\t18395\t41.7\t23.1\t10.3\t20781\t95685\t0.4159\t26554\tRomney\t26554\t0.122060625\t26554.0\n23696\t-80.733335\t39.985523\tMcMechen city\tWV\tWest Virginia\tMarshall County\t1790\t47.1\t12.4\t6.8\t18959\t57143\t0.3472\t26040\tRomney\t26040\t0.011877603999999998\t26040.0\n23697\t-80.742101\t39.922264\tMoundsville city\tWV\tWest Virginia\tMarshall County\t9857\t45.2\t10.3\t12.4\t18424\t67440\t0.3472\t26041\tRomney\t26041\t0.065406446\t26041.0\n23698\t-80.756734\t39.946333\tGlen Dale city\tWV\tWest Virginia\tMarshall County\t1444\t50.6\t29.1\t8.3\t28759\t116418\t0.3472\t26038\tRomney\t26038\t0.009581709\t26038.0\n23699\t-80.568649\t39.827698999999996\tCameron city\tWV\tWest Virginia\tMarshall County\t1083\t45.6\t9.4\t14.5\t17801\t45455\t0.3472\t26033\tRomney\t26033\t0.0071862819999999996\t26033.0\n23700\t-80.732794\t40.013931\tBenwood city\tWV\tWest Virginia\tMarshall County\t1458\t40.9\t7.2\t10.9\t17381\t49717\t0.3472\t26031\tRomney\t26031\t0.009674607\t26031.0\n23701\t-82.03264399999999\t39.018128999999995\tMason town\tWV\tWest Virginia\tMason County\t1041\t43.6\t8.7\t17.4\t19152\t71207\t0.3859\t25260\tRomney\t25260\t0.00690759\t25260.0\n23702\t-81.990509\t38.998013\tHartford City town\tWV\tWest Virginia\tMason County\t509\t44.9\t5.0\t23.0\t16824\t70357\t0.3859\t25247\tRomney\t25247\t0.003377486\t25247.0\n23703\t-81.966092\t38.987614\tNew Haven town\tWV\tWest Virginia\tMason County\t1507\t44.5\t8.4\t15.3\t19110\t89362\t0.3859\t25265\tRomney\t25265\t0.009999748000000001\t25265.0\n23704\t-82.130613\t38.852265\tPoint Pleasant city\tWV\tWest Virginia\tMason County\t4483\t46.3\t19.0\t11.8\t19459\t96548\t0.3859\t25550\tRomney\t25550\t0.029747093\t25550.0\n23705\t-81.955425\t38.747181\tLeon town\tWV\tWest Virginia\tMason County\t130\t42.8\t0.0\t19.2\t16124\t81000\t0.3859\t25123\tRomney\t25123\t0.0008626189999999999\t25123.0\n23706\t-82.136169\t38.830479\tHenderson town\tWV\tWest Virginia\tMason County\t299\t42.5\t12.4\t15.0\t12787\t45455\t0.3859\t25106\tRomney\t25106\t0.001984024\t25106.0\n23707\t-81.31282\t37.326925\tBramwell town\tWV\tWest Virginia\tMercer County\t383\t45.2\t12.4\t18.2\t15347\t55769\t0.2553\t24715\tRomney\t24715\t0.002541409\t24715.0\n23708\t-81.24174599999999\t37.418154\tMatoaka town\tWV\tWest Virginia\tMercer County\t288\t40.8\t5.9\t19.1\t13184\t38333\t0.2553\t24733\tRomney\t24733\t0.001911033\t24733.0\n23709\t-81.216066\t37.260391\tBluefield city\tWV\tWest Virginia\tMercer County\t11638\t44.4\t25.6\t13.2\t21562\t91667\t0.2553\t24701\tRomney\t24701\t0.07722433\t24701.0\n23710\t-81.095582\t37.368390000000005\tPrinceton city\tWV\tWest Virginia\tMercer County\t5905\t46.0\t15.7\t10.7\t18845\t90572\t0.2553\t24740\tRomney\t24740\t0.039182821\t24740.0\n23711\t-81.015601\t37.422776\tAthens town\tWV\tWest Virginia\tMercer County\t1073\t29.1\t28.0\t11.5\t15550\t97857\t0.2553\t24712\tRomney\t24712\t0.007119927\t24712.0\n23712\t-80.97053000000001\t37.332245\tOakvale town\tWV\tWest Virginia\tMercer County\t132\t39.1\t8.9\t12.3\t14834\t46000\t0.2553\t24739\tRomney\t24739\t0.00087589\t24739.0\n23713\t-81.251368\t37.351572999999995\tMontcalm CDP\tWV\tWest Virginia\tMercer County\t815\t42.0\t8.0\t15.7\t12192\t56346\t0.2553\t24737\tRomney\t24737\t0.005407959\t24737.0\n23714\t-78.982291\t39.439638\tKeyser city\tWV\tWest Virginia\tMineral County\t5007\t40.4\t13.8\t10.1\t17714\t88846\t0.2628\t26726\tRomney\t26726\t0.033224112\t26726.0\n23715\t-79.155635\t39.386169\tElk Garden town\tWV\tWest Virginia\tMineral County\t206\t45.7\t5.7\t10.4\t12634\t63333\t0.2628\t26717\tRomney\t26717\t0.00136692\t26717.0\n23716\t-78.771192\t39.642955\tRidgeley town\tWV\tWest Virginia\tMineral County\t732\t41.1\t9.6\t10.7\t19770\t74444\t0.2628\t26767\tRomney\t26767\t0.00485721\t26767.0\n23717\t-78.789797\t39.628271999999996\tCarpendale town\tWV\tWest Virginia\tMineral County\t917\t42.8\t8.9\t11.2\t19345\t103500\t0.2628\t26767\tRomney\t26767\t0.006084784\t26767.0\n23718\t-79.04646\t39.478033\tPiedmont town\tWV\tWest Virginia\tMineral County\t960\t36.8\t4.1\t15.5\t12565\t55769\t0.2628\t26750\tRomney\t26750\t0.0063701109999999995\t26750.0\n23719\t-78.761753\t39.614893\tWiley Ford CDP\tWV\tWest Virginia\tMineral County\t1053\t46.3\t8.1\t8.9\t20874\t101630\t0.2628\t26767\tRomney\t26767\t0.006987216\t26767.0\n23720\t-78.765203\t39.497354\tFort Ashby CDP\tWV\tWest Virginia\tMineral County\t1344\t42.6\t15.3\t6.2\t19598\t118529\t0.2628\t26719\tRomney\t26719\t0.008918156\t26719.0\n23721\t-82.131414\t37.648711999999996\tRed Jacket CDP\tWV\tWest Virginia\tMingo County\t684\t39.7\t6.5\t18.7\t13253\t74286\t0.275\t25692\tRomney\t25692\t0.004538704\t25692.0\n23722\t-81.868604\t37.614518\tGilbert town\tWV\tWest Virginia\tMingo County\t391\t40.3\t6.9\t14.1\t15002\t59000\t0.275\t24851\tRomney\t24851\t0.002594493\t24851.0\n23723\t-82.271314\t37.674327000000005\tWilliamson city\tWV\tWest Virginia\tMingo County\t3256\t47.7\t16.0\t17.8\t18939\t94634\t0.275\t25667\tRomney\t25667\t0.021605295\t25667.0\n23724\t-82.407392\t37.840948\tKermit town\tWV\tWest Virginia\tMingo County\t191\t42.5\t7.2\t22.6\t12499\t71000\t0.275\t25674\tRomney\t25674\t0.001267387\t25674.0\n23725\t-82.179975\t37.624812\tMatewan town\tWV\tWest Virginia\tMingo County\t467\t40.7\t6.2\t23.5\t13822\t81154\t0.275\t25678\tRomney\t25678\t0.003098794\t25678.0\n23726\t-82.18628199999999\t37.705249\tDelbarton town\tWV\tWest Virginia\tMingo County\t459\t41.3\t6.2\t17.0\t13842\t68125\t0.275\t25670\tRomney\t25670\t0.00304571\t25670.0\n23727\t-81.894224\t37.573304\tGilbert Creek CDP\tWV\tWest Virginia\tMingo County\t1491\t39.0\t5.6\t14.6\t14071\t71000\t0.275\t25608\tRomney\t25608\t0.009893579\t25608.0\n23728\t-82.271316\t37.699515000000005\tChattaroy CDP\tWV\tWest Virginia\tMingo County\t1035\t45.0\t10.1\t13.1\t20367\t96667\t0.275\t25661\tRomney\t25661\t0.006867776\t25661.0\n23729\t-80.214721\t39.717307\tBlacksville town\tWV\tWest Virginia\tMonongalia County\t172\t44.4\t7.0\t6.0\t17543\t85000\t0.4393\t26521\tRomney\t26521\t0.001141312\t26521.0\n23730\t-79.986582\t39.658799\tStar City town\tWV\tWest Virginia\tMonongalia County\t1322\t36.4\t41.6\t3.8\t22663\t141856\t0.4393\t26534\tRomney\t26534\t0.008772174\t26534.0\n23731\t-79.997373\t39.647139\tGranville town\tWV\tWest Virginia\tMonongalia County\t678\t38.8\t8.6\t8.8\t13359\t50455\t0.4393\t26534\tRomney\t26534\t0.004498891\t26534.0\n23732\t-79.947753\t39.636246\tMorgantown city\tWV\tWest Virginia\tMonongalia County\t28999\t24.6\t52.3\t8.2\t17087\t133285\t0.4393\t26505\tRomney\t26505\t0.192423814\t26505.0\n23733\t-80.061662\t39.662274\tCassville CDP\tWV\tWest Virginia\tMonongalia County\t1401\t43.8\t16.7\t6.4\t14772\t70652\t0.4393\t26543\tRomney\t26543\t0.009296381\t26543.0\n23734\t-79.976312\t39.634858\tWestover city\tWV\tWest Virginia\tMonongalia County\t3948\t40.9\t25.0\t4.9\t20004\t115325\t0.4393\t26501\tRomney\t26501\t0.026197083\t26501.0\n23735\t-79.856418\t39.667176\tCheat Lake CDP\tWV\tWest Virginia\tMonongalia County\t7588\t41.3\t42.9\t5.4\t31402\t178758\t0.4393\t26531\tRomney\t26531\t0.050350422\t26531.0\n23736\t-79.88118\t39.60626\tBrookhaven CDP\tWV\tWest Virginia\tMonongalia County\t5584\t38.6\t28.6\t5.8\t19327\t113031\t0.4393\t26531\tRomney\t26531\t0.037052815\t26531.0\n23737\t-80.795247\t37.39898\tPeterstown town\tWV\tWest Virginia\tMonroe County\t481\t45.0\t13.2\t7.0\t19028\t100000\t0.2792\t24963\tRomney\t24963\t0.003191691\t24963.0\n23738\t-80.54229699999999\t37.590377000000004\tUnion town\tWV\tWest Virginia\tMonroe County\t755\t47.5\t17.5\t4.9\t17788\t113720\t0.2792\t24983\tRomney\t24983\t0.005009827\t24983.0\n23739\t-78.226476\t39.625834999999995\tBath (Berkeley Springs) town\tWV\tWest Virginia\tMorgan County\t687\t41.4\t16.0\t12.5\t17796\t125658\t0.3355\t25411\tRomney\t25411\t0.004558611\t25411.0\n23740\t-78.45541899999999\t39.531384\tPaw Paw town\tWV\tWest Virginia\tMorgan County\t560\t41.6\t4.3\t20.8\t17609\t71250\t0.3355\t25434\tRomney\t25434\t0.003715898\t25434.0\n23741\t-80.841566\t38.284715999999996\tSummersville town\tWV\tWest Virginia\tNicholas County\t3425\t45.5\t19.9\t8.7\t23273\t115587\t0.3032\t266HH\tRomney\t266HH\t0.0227267\t0.0\n23742\t-80.644887\t38.324456\tCraigsville CDP\tWV\tWest Virginia\tNicholas County\t2071\t41.8\t11.6\t11.4\t15372\t77727\t0.3032\t26205\tRomney\t26205\t0.013742188\t26205.0\n23743\t-80.536153\t38.222075\tRichwood city\tWV\tWest Virginia\tNicholas County\t2512\t47.9\t11.0\t11.6\t16628\t49301\t0.3032\t26261\tRomney\t26261\t0.016668458\t26261.0\n23744\t-80.689437\t40.139825\tClearview village\tWV\tWest Virginia\tOhio County\t545\t43.0\t31.1\t9.3\t21229\t113776\t0.3789\t26075\tRomney\t26075\t0.003616365\t26075.0\n23745\t-80.571244\t40.09006\tValley Grove village\tWV\tWest Virginia\tOhio County\t438\t43.5\t18.1\t9.9\t20360\t79545\t0.3789\t26060\tRomney\t26060\t0.002906363\t26060.0\n23746\t-80.631425\t40.048303999999995\tTriadelphia town\tWV\tWest Virginia\tOhio County\t746\t42.6\t16.2\t10.0\t20213\t75652\t0.3789\t26059\tRomney\t26059\t0.0049501070000000005\t26059.0\n23747\t-80.596835\t40.16704\tWest Liberty town\tWV\tWest Virginia\tOhio County\t1124\t23.7\t23.2\t16.8\t15366\t86071\t0.3789\t26074\tRomney\t26074\t0.0074583390000000005\t26074.0\n23748\t-80.689926\t40.045193\tBethlehem village\tWV\tWest Virginia\tOhio County\t2469\t46.0\t33.6\t8.0\t24950\t106417\t0.3789\t26003\tRomney\t26003\t0.01638313\t26003.0\n23749\t-80.654863\t40.075502\tWheeling city\tWV\tWest Virginia\tOhio County\t28723\t45.3\t26.4\t13.0\t21827\t82314\t0.3789\t26003\tRomney\t26003\t0.190592407\t26003.0\n23750\t-79.33215\t38.646012\tFranklin town\tWV\tWest Virginia\tPendleton County\t830\t50.1\t20.8\t7.5\t17954\t121429\t0.3316\t26807\tRomney\t26807\t0.005507491999999999\t26807.0\n23751\t-81.197263\t39.403099\tSt. Marys city\tWV\tWest Virginia\tPleasants County\t2013\t43.2\t13.0\t13.8\t19560\t89063\t0.3363\t26170\tRomney\t26170\t0.013357326999999999\t26170.0\n23752\t-81.26343\t39.378799\tBelmont city\tWV\tWest Virginia\tPleasants County\t1121\t43.2\t11.1\t8.0\t18181\t98958\t0.3363\t26134\tRomney\t26134\t0.007438431999999999\t26134.0\n23753\t-79.82776899999999\t38.547009\tDurbin town\tWV\tWest Virginia\tPocahontas County\t227\t44.3\t3.7\t11.9\t14358\t71875\t0.3644\t26264\tRomney\t26264\t0.001506266\t26264.0\n23754\t-80.213531\t38.135219\tHillsboro town\tWV\tWest Virginia\tPocahontas County\t218\t44.7\t11.1\t12.4\t15131\t80714\t0.3644\t24946\tRomney\t24946\t0.0014465460000000002\t24946.0\n23755\t-80.09030200000001\t38.222453\tMarlinton town\tWV\tWest Virginia\tPocahontas County\t1134\t47.0\t12.8\t8.2\t16544\t88966\t0.3644\t24954\tRomney\t24954\t0.007524694\t24954.0\n23756\t-79.853575\t39.388852\tNewburg town\tWV\tWest Virginia\tPreston County\t371\t43.0\t12.7\t6.8\t14380\t71250\t0.2628\t26410\tRomney\t26410\t0.002461783\t26410.0\n23757\t-79.682496\t39.471918\tKingwood city\tWV\tWest Virginia\tPreston County\t2968\t44.7\t24.1\t9.5\t20290\t108421\t0.2628\t26537\tRomney\t26537\t0.019694261\t26537.0\n23758\t-79.800255\t39.5513\tMasontown town\tWV\tWest Virginia\tPreston County\t683\t42.0\t13.4\t10.3\t14289\t91471\t0.2628\t26542\tRomney\t26542\t0.0045320690000000005\t26542.0\n23759\t-79.543563\t39.444251\tTerra Alta town\tWV\tWest Virginia\tPreston County\t1390\t41.0\t15.7\t9.0\t16034\t78929\t0.2628\t26764\tRomney\t26764\t0.009223391\t26764.0\n23760\t-79.62814\t39.667546\tBrandonville town\tWV\tWest Virginia\tPreston County\t228\t42.5\t13.7\t8.7\t18471\t125000\t0.2628\t26525\tRomney\t26525\t0.001512901\t26525.0\n23761\t-79.676238\t39.348240999999994\tRowlesburg town\tWV\tWest Virginia\tPreston County\t628\t43.6\t6.7\t8.2\t14326\t60000\t0.2628\t26425\tRomney\t26425\t0.004167115\t26425.0\n23762\t-79.747006\t39.392829\tTunnelton town\tWV\tWest Virginia\tPreston County\t350\t44.3\t9.0\t8.8\t13452\t53462\t0.2628\t26444\tRomney\t26444\t0.002322436\t26444.0\n23763\t-79.800535\t39.510289\tReedsville town\tWV\tWest Virginia\tPreston County\t557\t38.9\t15.4\t7.2\t17744\t102941\t0.2628\t26547\tRomney\t26547\t0.003695992\t26547.0\n23764\t-79.63923299999999\t39.493644\tAlbright town\tWV\tWest Virginia\tPreston County\t241\t42.4\t9.9\t11.3\t13782\t86667\t0.2628\t26519\tRomney\t26519\t0.0015991629999999998\t26519.0\n23765\t-79.64061600000001\t39.659371\tBruceton Mills town\tWV\tWest Virginia\tPreston County\t65\t42.0\t12.8\t9.4\t18782\t133333\t0.2628\t26525\tRomney\t26525\t0.00043131\t26525.0\n23766\t-81.9318\t38.539393\tEleanor town\tWV\tWest Virginia\tPutnam County\t1566\t46.1\t13.0\t6.5\t23939\t118202\t0.3065\t25070\tRomney\t25070\t0.010391244000000001\t25070.0\n23767\t-82.01899999999999\t38.434203000000004\tHurricane city\tWV\tWest Virginia\tPutnam County\t5820\t39.7\t24.0\t6.5\t26308\t119149\t0.3065\t25526\tRomney\t25526\t0.038618801\t25526.0\n23768\t-81.98192\t38.611728\tBuffalo town\tWV\tWest Virginia\tPutnam County\t1258\t42.7\t8.1\t9.3\t16613\t74265\t0.3065\t25033\tRomney\t25033\t0.008347499999999999\t25033.0\n23769\t-81.925524\t38.448284\tTeays Valley CDP\tWV\tWest Virginia\tPutnam County\t14277\t39.4\t35.3\t5.1\t29518\t169910\t0.3065\t25560\tRomney\t25560\t0.094735501\t25560.0\n23770\t-81.88346\t38.528145\tWinfield town\tWV\tWest Virginia\tPutnam County\t2149\t42.1\t26.8\t5.2\t27246\t142089\t0.3065\t25168\tRomney\t25168\t0.01425976\t25168.0\n23771\t-81.812055\t38.472989\tPoca town\tWV\tWest Virginia\tPutnam County\t1094\t42.5\t18.0\t4.1\t25975\t116316\t0.3065\t25159\tRomney\t25159\t0.007259273\t25159.0\n23772\t-81.841756\t38.510627\tBancroft town\tWV\tWest Virginia\tPutnam County\t411\t40.8\t7.7\t6.0\t19109\t82917\t0.3065\t25011\tRomney\t25011\t0.0027272040000000004\t25011.0\n23773\t-81.126683\t37.723966\tDaniels CDP\tWV\tWest Virginia\tRaleigh County\t1791\t44.9\t15.5\t10.0\t23341\t103788\t0.2684\t25832\tRomney\t25832\t0.011884239\t25832.0\n23774\t-81.207607\t37.755093\tMacArthur CDP\tWV\tWest Virginia\tRaleigh County\t1695\t44.0\t17.3\t9.0\t19309\t96750\t0.2684\t25871\tRomney\t25871\t0.011247228\t25871.0\n23775\t-81.148584\t37.815474\tStanaford CDP\tWV\tWest Virginia\tRaleigh County\t1503\t49.6\t22.1\t10.8\t25436\t118750\t0.2684\t25909\tRomney\t25909\t0.009973206\t25909.0\n23776\t-81.18508100000001\t37.787746000000006\tBeckley city\tWV\tWest Virginia\tRaleigh County\t17168\t44.7\t22.9\t10.2\t21770\t105054\t0.2684\t25801\tRomney\t25801\t0.113918826\t25801.0\n23777\t-81.301606\t37.734835\tLester town\tWV\tWest Virginia\tRaleigh County\t322\t42.5\t4.3\t11.0\t15527\t77500\t0.2684\t25849\tRomney\t25849\t0.0021366420000000002\t25849.0\n23778\t-81.21339\t37.769269\tMabscott town\tWV\tWest Virginia\tRaleigh County\t1401\t44.0\t12.3\t10.8\t17073\t84028\t0.2684\t25871\tRomney\t25871\t0.009296381\t25871.0\n23779\t-81.218002\t37.677278\tCoal City CDP\tWV\tWest Virginia\tRaleigh County\t1939\t44.1\t8.3\t12.7\t17678\t70481\t0.2684\t25823\tRomney\t25823\t0.012866298\t25823.0\n23780\t-81.252567\t37.711451000000004\tSophia town\tWV\tWest Virginia\tRaleigh County\t1306\t44.1\t9.1\t13.2\t15779\t73571\t0.2684\t25921\tRomney\t25921\t0.008666006\t25921.0\n23781\t-81.305026\t37.6094\tRhodell town\tWV\tWest Virginia\tRaleigh County\t229\t39.3\t3.9\t18.3\t10072\t24722\t0.2684\t25915\tRomney\t25915\t0.001519537\t25915.0\n23782\t-81.149957\t37.735721999999996\tBeaver CDP\tWV\tWest Virginia\tRaleigh County\t1403\t41.3\t10.6\t7.0\t19804\t84500\t0.2684\t25847\tRomney\t25847\t0.009309652\t25847.0\n23783\t-81.090705\t37.703502\tShady Spring CDP\tWV\tWest Virginia\tRaleigh County\t2182\t37.2\t14.7\t9.5\t16668\t122170\t0.2684\t25832\tRomney\t25832\t0.014478732\t25832.0\n23784\t-81.143691\t37.848646\tPiney View CDP\tWV\tWest Virginia\tRaleigh County\t1033\t44.2\t7.1\t12.5\t14862\t70962\t0.2684\t25818\tRomney\t25818\t0.006854505\t25818.0\n23785\t-81.203022\t37.835837\tProsperity CDP\tWV\tWest Virginia\tRaleigh County\t1356\t39.4\t17.8\t8.1\t21330\t110441\t0.2684\t25909\tRomney\t25909\t0.008997782\t25909.0\n23786\t-81.235961\t37.740964\tCrab Orchard CDP\tWV\tWest Virginia\tRaleigh County\t2779\t42.0\t9.6\t8.4\t20165\t90481\t0.2684\t25827\tRomney\t25827\t0.018440146\t25827.0\n23787\t-81.199268\t37.863833\tBradley CDP\tWV\tWest Virginia\tRaleigh County\t2714\t35.1\t19.8\t12.6\t18269\t90769\t0.2684\t25818\tRomney\t25818\t0.018008836\t25818.0\n23788\t-79.976452\t38.713933000000004\tHuttonsville town\tWV\tWest Virginia\tRandolph County\t213\t37.8\t4.8\t9.0\t14241\t76250\t0.3426\t26280\tRomney\t26280\t0.001413368\t26280.0\n23789\t-79.963539\t38.898077\tWomelsdorf (Coalton) town\tWV\tWest Virginia\tRandolph County\t241\t41.1\t10.2\t9.5\t14119\t79375\t0.3426\t26285\tRomney\t26285\t0.0015991629999999998\t26285.0\n23790\t-79.52459300000001\t38.921018\tHarman town\tWV\tWest Virginia\tRandolph County\t123\t45.8\t15.1\t11.5\t18423\t95000\t0.3426\t26270\tRomney\t26270\t0.0008161710000000001\t26270.0\n23791\t-79.871507\t38.844421000000004\tBeverly town\tWV\tWest Virginia\tRandolph County\t665\t39.3\t13.5\t9.2\t15791\t93500\t0.3426\t26253\tRomney\t26253\t0.004412629\t26253.0\n23792\t-79.852902\t38.924431\tElkins city\tWV\tWest Virginia\tRandolph County\t6873\t42.8\t25.6\t8.3\t19898\t102719\t0.3426\t26241\tRomney\t26241\t0.045606017\t26241.0\n23793\t-79.972566\t38.731934\tMill Creek town\tWV\tWest Virginia\tRandolph County\t652\t37.1\t7.4\t10.0\t12597\t65625\t0.3426\t26280\tRomney\t26280\t0.004326367\t26280.0\n23794\t-79.814465\t39.067254999999996\tMontrose town\tWV\tWest Virginia\tRandolph County\t176\t40.4\t10.8\t11.9\t16095\t100000\t0.3426\t26283\tRomney\t26283\t0.0011678539999999999\t26283.0\n23795\t-81.15423100000001\t39.206702\tCairo town\tWV\tWest Virginia\tRitchie County\t253\t43.4\t10.4\t9.9\t17032\t79286\t0.2027\t26337\tRomney\t26337\t0.00167879\t26337.0\n23796\t-81.05458\t39.265178999999996\tEllenboro town\tWV\tWest Virginia\tRitchie County\t370\t40.8\t5.4\t8.6\t16588\t80000\t0.2027\t26346\tRomney\t26346\t0.002455147\t26346.0\n23797\t-80.94924300000001\t39.187813\tPullman town\tWV\tWest Virginia\tRitchie County\t163\t42.3\t12.4\t4.7\t19111\t87500\t0.2027\t26421\tRomney\t26421\t0.001081592\t26421.0\n23798\t-80.974713\t39.280972\tPennsboro city\tWV\tWest Virginia\tRitchie County\t1207\t43.9\t9.3\t12.7\t17926\t68816\t0.2027\t26415\tRomney\t26415\t0.008009088000000001\t26415.0\n23799\t-80.856266\t39.096158\tAuburn town\tWV\tWest Virginia\tRitchie County\t100\t44.5\t14.3\t6.9\t16372\t77500\t0.2027\t26325\tRomney\t26325\t0.000663553\t26325.0\n23800\t-81.049009\t39.211127000000005\tHarrisville town\tWV\tWest Virginia\tRitchie County\t1945\t44.0\t10.8\t8.7\t18857\t91591\t0.2027\t26362\tRomney\t26362\t0.012906111000000001\t26362.0\n23801\t-81.355312\t38.802580999999996\tSpencer city\tWV\tWest Virginia\tRoane County\t2259\t41.6\t16.2\t16.8\t15138\t86429\t0.3842\t25276\tRomney\t25276\t0.014989668000000001\t25276.0\n23802\t-81.426411\t38.899240999999996\tReedy town\tWV\tWest Virginia\tRoane County\t196\t44.2\t14.8\t15.5\t15759\t91250\t0.3842\t25270\tRomney\t25270\t0.001300564\t25270.0\n23803\t-80.89092\t37.665452\tHinton city\tWV\tWest Virginia\tSummers County\t2655\t46.8\t13.0\t13.0\t16748\t65400\t0.3423\t259HH\tRomney\t259HH\t0.017617339\t0.0\n23804\t-80.128599\t39.266565\tFlemington town\tWV\tWest Virginia\tTaylor County\t292\t43.0\t8.5\t11.2\t13821\t74000\t0.3285\t26347\tRomney\t26347\t0.001937576\t26347.0\n23805\t-80.01621899999999\t39.340879\tGrafton city\tWV\tWest Virginia\tTaylor County\t5359\t42.9\t11.4\t10.0\t15508\t73150\t0.3285\t26354\tRomney\t26354\t0.03555982\t26354.0\n23806\t-79.49739100000001\t39.147233\tThomas city\tWV\tWest Virginia\tTucker County\t412\t53.1\t9.3\t11.3\t18064\t75667\t0.2804\t26292\tRomney\t26292\t0.002733839\t26292.0\n23807\t-79.645452\t39.081329\tHambleton town\tWV\tWest Virginia\tTucker County\t225\t44.6\t2.5\t11.4\t17207\t67778\t0.2804\t26269\tRomney\t26269\t0.001492995\t26269.0\n23808\t-79.678565\t39.094184999999996\tParsons city\tWV\tWest Virginia\tTucker County\t1427\t44.1\t11.2\t13.5\t17996\t75000\t0.2804\t26269\tRomney\t26269\t0.009468905\t26269.0\n23809\t-79.630078\t39.075454\tHendricks town\tWV\tWest Virginia\tTucker County\t292\t44.4\t2.8\t11.4\t17194\t67000\t0.2804\t26269\tRomney\t26269\t0.001937576\t26269.0\n23810\t-79.464546\t39.134825\tDavis town\tWV\tWest Virginia\tTucker County\t554\t45.1\t11.5\t14.3\t18906\t69545\t0.2804\t26292\tRomney\t26292\t0.003676085\t26292.0\n23811\t-80.99865600000001\t39.559805\tSistersville city\tWV\tWest Virginia\tTyler County\t1528\t45.5\t13.7\t13.7\t19124\t79070\t0.2714\t26175\tRomney\t26175\t0.010139094\t26175.0\n23812\t-81.061689\t39.51354\tFriendly town\tWV\tWest Virginia\tTyler County\t151\t42.7\t3.7\t12.7\t20783\t80000\t0.2714\t26146\tRomney\t26146\t0.001001965\t26146.0\n23813\t-80.907078\t39.494632\tMiddlebourne town\tWV\tWest Virginia\tTyler County\t805\t46.4\t11.7\t17.3\t18893\t89231\t0.2714\t26149\tRomney\t26149\t0.005341604000000001\t26149.0\n23814\t-80.223802\t38.991690999999996\tBuckhannon city\tWV\tWest Virginia\tUpshur County\t5910\t34.9\t27.3\t8.6\t18368\t112374\t0.2608\t26201\tRomney\t26201\t0.039215999\t26201.0\n23815\t-82.555633\t38.395582\tCeredo city\tWV\tWest Virginia\tWayne County\t1550\t48.4\t20.8\t10.7\t21422\t105769\t0.3534\t25507\tRomney\t25507\t0.010285076\t25507.0\n23816\t-82.582837\t38.404445\tKenova city\tWV\tWest Virginia\tWayne County\t3168\t44.8\t12.4\t9.5\t19756\t83852\t0.3534\t25530\tRomney\t25530\t0.021021368\t25530.0\n23817\t-82.594638\t38.119527000000005\tFort Gay town\tWV\tWest Virginia\tWayne County\t972\t38.4\t4.5\t14.5\t13724\t66481\t0.3534\t25514\tRomney\t25514\t0.006449738000000001\t25514.0\n23818\t-82.441684\t38.224812\tWayne town\tWV\tWest Virginia\tWayne County\t1065\t41.1\t11.1\t9.4\t15446\t85000\t0.3534\t25570\tRomney\t25570\t0.007066841999999999\t25570.0\n23819\t-80.40831700000001\t38.478172\tAddison (Webster Springs) town\tWV\tWest Virginia\tWebster County\t839\t48.1\t15.7\t15.5\t17397\t72500\t0.3437\t26288\tRomney\t26288\t0.005567211999999999\t26288.0\n23820\t-80.596992\t38.368194\tCamden-on-Gauley town\tWV\tWest Virginia\tWebster County\t148\t45.2\t8.2\t15.4\t13831\t60000\t0.3437\t26208\tRomney\t26208\t0.000982059\t26208.0\n23821\t-80.55417800000001\t38.410989\tCowen town\tWV\tWest Virginia\tWebster County\t489\t44.8\t8.6\t16.1\t13722\t62500\t0.3437\t26206\tRomney\t26206\t0.0032447759999999996\t26206.0\n23822\t-80.930123\t39.60615\tPaden City\tWV\tWest Virginia\tWetzel County\t2696\t44.3\t8.1\t15.7\t17754\t85000\t0.3786\t26159\tRomney\t26159\t0.017889396000000002\t26159.0\n23823\t-80.563126\t39.498199\tSmithfield town\tWV\tWest Virginia\tWetzel County\t153\t42.3\t2.8\t18.4\t17680\t42857\t0.3786\t26437\tRomney\t26437\t0.001015237\t26437.0\n23824\t-80.682482\t39.564059\tPine Grove town\tWV\tWest Virginia\tWetzel County\t497\t42.5\t9.6\t11.5\t17524\t62813\t0.3786\t26419\tRomney\t26419\t0.00329786\t26419.0\n23825\t-80.859487\t39.663634\tNew Martinsville city\tWV\tWest Virginia\tWetzel County\t5754\t45.4\t19.5\t16.7\t22812\t103457\t0.3786\t26155\tRomney\t26155\t0.038180855\t26155.0\n23826\t-80.45748\t39.683766\tHundred town\tWV\tWest Virginia\tWetzel County\t298\t46.3\t19.5\t17.0\t16188\t58125\t0.3786\t26575\tRomney\t26575\t0.001977389\t26575.0\n23827\t-80.515087\t39.699153\tLittleton town\tWV\tWest Virginia\tWetzel County\t178\t44.3\t11.4\t17.0\t15389\t38125\t0.3786\t26581\tRomney\t26581\t0.001181125\t26581.0\n23828\t-81.397475\t39.061934\tElizabeth town\tWV\tWest Virginia\tWirt County\t1041\t41.7\t13.1\t12.5\t16703\t78108\t0.3114\t26143\tRomney\t26143\t0.00690759\t26143.0\n23829\t-81.631398\t39.25618\tBlennerhassett CDP\tWV\tWest Virginia\tWood County\t3252\t44.3\t15.9\t10.2\t25474\t117347\t0.3305\t26181\tRomney\t26181\t0.021578752000000003\t26181.0\n23830\t-81.667773\t39.242319\tWashington CDP\tWV\tWest Virginia\tWood County\t1230\t44.7\t27.0\t7.0\t30793\t138554\t0.3305\t26181\tRomney\t26181\t0.008161705\t26181.0\n23831\t-81.512674\t39.180294\tMineralwells CDP\tWV\tWest Virginia\tWood County\t1789\t39.4\t17.0\t10.2\t22974\t109157\t0.3305\t26150\tRomney\t26150\t0.011870968\t26150.0\n23832\t-81.485357\t39.3673\tBoaz CDP\tWV\tWest Virginia\tWood County\t1293\t41.9\t25.2\t9.5\t23252\t116106\t0.3305\t26187\tRomney\t26187\t0.008579744\t26187.0\n23833\t-81.541735\t39.262337\tParkersburg city\tWV\tWest Virginia\tWood County\t31488\t42.9\t15.3\t13.0\t19941\t83435\t0.3305\t26101\tRomney\t26101\t0.208939655\t26101.0\n23834\t-81.626532\t39.22761\tLubeck CDP\tWV\tWest Virginia\tWood County\t1280\t41.7\t19.5\t11.6\t23062\t117028\t0.3305\t26181\tRomney\t26181\t0.008493482\t26181.0\n23835\t-81.451397\t39.400529999999996\tWilliamstown city\tWV\tWest Virginia\tWood County\t2929\t44.5\t23.2\t10.9\t23156\t107481\t0.3305\t26187\tRomney\t26187\t0.019435475\t26187.0\n23836\t-81.546176\t39.323279\tVienna city\tWV\tWest Virginia\tWood County\t10844\t45.7\t28.5\t9.0\t28366\t110408\t0.3305\t26105\tRomney\t26105\t0.071955717\t26105.0\n23837\t-81.508969\t39.314825\tNorth Hills town\tWV\tWest Virginia\tWood County\t943\t45.7\t52.6\t12.2\t38515\t193036\t0.3305\t26104\tRomney\t26104\t0.006257306999999999\t26104.0\n23838\t-81.38569100000001\t37.580944\tMullens city\tWV\tWest Virginia\tWyoming County\t1735\t44.5\t11.4\t12.9\t18605\t61172\t0.2104\t25882\tRomney\t25882\t0.011512649\t25882.0\n23839\t-81.536199\t37.585573\tPineville town\tWV\tWest Virginia\tWyoming County\t672\t46.4\t7.6\t11.8\t17869\t66591\t0.2104\t24874\tRomney\t24874\t0.004459078\t24874.0\n23840\t-81.63198100000001\t37.692685\tOceana town\tWV\tWest Virginia\tWyoming County\t1444\t43.8\t8.0\t14.4\t16722\t69000\t0.2104\t24870\tRomney\t24870\t0.009581709\t24870.0\n23841\t-89.81694\t43.95538\tAdams city\tWI\tWisconsin\tAdams County\t1939\t42.9\t15.4\t16.4\t18566\t87063\t0.5387\t53934\tObama\t53934\t0.004858474000000001\t53934.0\n23842\t-89.820298\t43.971984\tFriendship village\tWI\tWisconsin\tAdams County\t834\t44.6\t16.4\t20.0\t19062\t97222\t0.5387\t53934\tObama\t53934\t0.00208972\t53934.0\n23843\t-90.686175\t46.605903999999995\tOdanah CDP\tWI\tWisconsin\tAshland County\t252\t33.8\t18.2\t12.0\t16058\t88000\t0.6449\t54861\tObama\t54861\t0.000631426\t54861.0\n23844\t-90.660713\t46.324033\tMellen city\tWI\tWisconsin\tAshland County\t789\t44.7\t15.0\t9.3\t19547\t68250\t0.6449\t54546\tObama\t54546\t0.001976965\t54546.0\n23845\t-90.49881500000001\t46.013655\tButternut village\tWI\tWisconsin\tAshland County\t393\t45.6\t12.1\t8.4\t20797\t94706\t0.6449\t54514\tObama\t54514\t0.000984724\t54514.0\n23846\t-90.871465\t46.58037\tAshland city\tWI\tWisconsin\tAshland County\t8331\t36.4\t24.7\t9.7\t21163\t88340\t0.6449\t54806\tObama\t54806\t0.020874651\t54806.0\n23847\t-91.740429\t45.496199\tRice Lake city\tWI\tWisconsin\tBarron County\t8573\t40.2\t21.9\t7.6\t24039\t100078\t0.4799\t54868\tObama\t54868\t0.02148102\t54868.0\n23848\t-91.653269\t45.316216\tChetek city\tWI\tWisconsin\tBarron County\t2226\t48.1\t16.8\t9.9\t20470\t110020\t0.4799\t54728\tObama\t54728\t0.0055775980000000005\t54728.0\n23849\t-91.743478\t45.407071\tCameron village\tWI\tWisconsin\tBarron County\t1574\t36.5\t15.9\t6.9\t19823\t105053\t0.4799\t54822\tObama\t54822\t0.003943908\t54822.0\n23850\t-91.847422\t45.401033\tBarron city\tWI\tWisconsin\tBarron County\t3231\t40.7\t22.2\t8.9\t20067\t96116\t0.4799\t54812\tObama\t54812\t0.008095785999999999\t54812.0\n23851\t-92.02727900000001\t45.536764\tCumberland city\tWI\tWisconsin\tBarron County\t2426\t46.4\t18.6\t8.7\t22598\t105492\t0.4799\t54829\tObama\t54829\t0.00607873\t54829.0\n23852\t-91.980384\t45.236893\tPrairie Farm village\tWI\tWisconsin\tBarron County\t528\t42.8\t10.4\t4.4\t21159\t92083\t0.4799\t54762\tObama\t54762\t0.001322988\t54762.0\n23853\t-92.03736500000001\t45.41383\tAlmena village\tWI\tWisconsin\tBarron County\t731\t41.7\t13.7\t8.6\t20627\t109470\t0.4799\t54805\tObama\t54805\t0.0018316370000000001\t54805.0\n23854\t-91.77894599999999\t45.607942\tHaugen village\tWI\tWisconsin\tBarron County\t310\t43.7\t14.3\t10.4\t22162\t119118\t0.4799\t54841\tObama\t54841\t0.0007767539999999999\t54841.0\n23855\t-92.140213\t45.395684\tTurtle Lake village\tWI\tWisconsin\tBarron County\t1136\t42.3\t12.4\t9.8\t18528\t91579\t0.4799\t54889\tObama\t54889\t0.002846429\t54889.0\n23856\t-91.814233\t45.259035\tDallas village\tWI\tWisconsin\tBarron County\t392\t43.3\t12.3\t4.3\t20430\t95500\t0.4799\t54733\tObama\t54733\t0.0009822189999999999\t54733.0\n23857\t-90.901622\t46.676963\tWashburn city\tWI\tWisconsin\tBayfield County\t2323\t45.3\t31.6\t8.0\t21816\t114012\t0.6164\t54891\tObama\t54891\t0.005820646999999999\t54891.0\n23858\t-91.062004\t46.434647999999996\tMason village\tWI\tWisconsin\tBayfield County\t77\t42.5\t19.6\t10.8\t18205\t93333\t0.6164\t54856\tObama\t54856\t0.000192936\t54856.0\n23859\t-90.822434\t46.814036\tBayfield city\tWI\tWisconsin\tBayfield County\t431\t52.0\t34.5\t12.1\t23606\t133523\t0.6164\t54814\tObama\t54814\t0.001079939\t54814.0\n23860\t-88.02614100000001\t44.472157\tAllouez village\tWI\tWisconsin\tBrown County\t15341\t40.0\t39.1\t6.4\t31267\t151304\t0.485\t54301\tObama\t54301\t0.038439325\t54301.0\n23861\t-88.169416\t44.323195\tWrightstown village\tWI\tWisconsin\tBrown County\t2313\t32.2\t23.5\t6.7\t27860\t147681\t0.485\t54180\tObama\t54180\t0.005795591\t54180.0\n23862\t-88.08841600000001\t44.479171\tAshwaubenon village\tWI\tWisconsin\tBrown County\t17794\t38.7\t29.6\t7.4\t28299\t153078\t0.485\t54304\tObama\t54304\t0.044585707999999995\t54304.0\n23863\t-88.093756\t44.585896000000005\tHoward village\tWI\tWisconsin\tBrown County\t16836\t34.8\t27.6\t6.8\t28004\t161958\t0.485\t54313\tObama\t54313\t0.042185285999999995\t54313.0\n23864\t-88.17965500000001\t44.500516\tOneida CDP\tWI\tWisconsin\tBrown County\t1256\t37.7\t18.1\t7.0\t22610\t152134\t0.485\t54155\tObama\t54155\t0.0031471090000000004\t54155.0\n23865\t-88.079972\t44.433132\tDe Pere city\tWI\tWisconsin\tBrown County\t22689\t34.0\t34.6\t7.0\t28861\t155430\t0.485\t54115\tObama\t54115\t0.056850912\t54115.0\n23866\t-88.22528299999999\t44.676783\tPulaski village\tWI\tWisconsin\tBrown County\t3300\t33.9\t17.9\t7.2\t23330\t118083\t0.485\t54162\tObama\t54162\t0.008268677\t54162.0\n23867\t-87.95548000000001\t44.459532\tBellevue Town CDP\tWI\tWisconsin\tBrown County\t14456\t33.1\t26.0\t7.2\t28984\t164837\t0.485\t54311\tObama\t54311\t0.036221816000000004\t54311.0\n23868\t-87.994538\t44.513907\tGreen Bay city\tWI\tWisconsin\tBrown County\t105383\t34.4\t23.0\t10.2\t24513\t123675\t0.485\t543HH\tObama\t543HH\t0.264053932\t0.0\n23869\t-87.83032\t44.348487\tDenmark village\tWI\tWisconsin\tBrown County\t1887\t37.8\t17.2\t7.7\t21983\t122933\t0.485\t54208\tObama\t54208\t0.00472818\t54208.0\n23870\t-91.922394\t44.336902\tAlma city\tWI\tWisconsin\tBuffalo County\t921\t45.5\t19.1\t6.2\t22991\t96964\t0.5072\t54610\tObama\t54610\t0.002307713\t54610.0\n23871\t-91.667485\t44.571023\tMondovi city\tWI\tWisconsin\tBuffalo County\t2559\t42.9\t15.6\t10.0\t20778\t97591\t0.5072\t54755\tObama\t54755\t0.0064119830000000004\t54755.0\n23872\t-91.838365\t44.227885\tCochrane village\tWI\tWisconsin\tBuffalo County\t450\t44.7\t20.1\t6.7\t24365\t101953\t0.5072\t54622\tObama\t54622\t0.001127547\t54622.0\n23873\t-92.00456\t44.421339\tNelson village\tWI\tWisconsin\tBuffalo County\t391\t47.3\t16.4\t5.5\t20547\t94286\t0.5072\t54756\tObama\t54756\t0.0009797130000000001\t54756.0\n23874\t-91.697002\t44.120174\tFountain City\tWI\tWisconsin\tBuffalo County\t935\t42.5\t24.6\t4.2\t21532\t104464\t0.5072\t54629\tObama\t54629\t0.0023427920000000002\t54629.0\n23875\t-91.865332\t44.223696000000004\tBuffalo City\tWI\tWisconsin\tBuffalo County\t1105\t45.7\t18.4\t5.1\t24389\t115104\t0.5072\t54622\tObama\t54622\t0.0027687540000000004\t54622.0\n23876\t-92.363035\t45.880216\tWebster village\tWI\tWisconsin\tBurnett County\t674\t49.6\t18.8\t13.2\t21457\t106649\t0.4594\t54893\tObama\t54893\t0.001688815\t54893.0\n23877\t-92.685331\t45.778988\tGrantsburg village\tWI\tWisconsin\tBurnett County\t1467\t39.9\t22.8\t6.1\t24368\t100129\t0.4594\t54840\tObama\t54840\t0.003675803\t54840.0\n23878\t-92.380256\t45.783002\tSiren village\tWI\tWisconsin\tBurnett County\t1074\t46.6\t15.8\t14.0\t19035\t93269\t0.4594\t54872\tObama\t54872\t0.002691078\t54872.0\n23879\t-88.16345\t44.029546\tChilton city\tWI\tWisconsin\tCalumet County\t3774\t38.6\t14.3\t6.6\t24762\t123631\t0.4349\t53014\tObama\t53014\t0.00945636\t53014.0\n23880\t-88.310321\t44.071481\tStockbridge village\tWI\tWisconsin\tCalumet County\t673\t43.7\t14.8\t7.4\t26275\t146389\t0.4349\t53088\tObama\t53088\t0.001686309\t53088.0\n23881\t-88.099914\t44.120094\tPotter village\tWI\tWisconsin\tCalumet County\t260\t33.8\t8.1\t4.3\t19926\t130000\t0.4349\t54160\tObama\t54160\t0.0006514719999999999\t54160.0\n23882\t-88.160257\t44.139615\tHilbert village\tWI\tWisconsin\tCalumet County\t1269\t38.3\t9.3\t5.4\t23447\t97755\t0.4349\t54129\tObama\t54129\t0.003179682\t54129.0\n23883\t-88.276457\t44.174646\tSherwood village\tWI\tWisconsin\tCalumet County\t2214\t38.1\t30.2\t5.1\t29110\t188985\t0.4349\t54169\tObama\t54169\t0.00554753\t54169.0\n23884\t-88.071652\t44.175325\tBrillion city\tWI\tWisconsin\tCalumet County\t2971\t39.3\t17.5\t7.3\t24982\t117339\t0.4349\t54110\tObama\t54110\t0.007444315\t54110.0\n23885\t-88.095035\t43.949822999999995\tNew Holstein city\tWI\tWisconsin\tCalumet County\t3284\t44.2\t15.8\t8.0\t24428\t120670\t0.4349\t53061\tObama\t53061\t0.008228586\t53061.0\n23886\t-91.15215400000001\t45.163006\tCornell city\tWI\tWisconsin\tChippewa County\t1636\t41.0\t13.1\t7.1\t18863\t82449\t0.4926\t54732\tObama\t54732\t0.004099259\t54732.0\n23887\t-91.301324\t44.921921000000005\tLake Wissota CDP\tWI\tWisconsin\tChippewa County\t2793\t41.1\t25.6\t7.4\t24963\t163750\t0.4926\t54729\tObama\t54729\t0.006998307\t54729.0\n23888\t-91.15361899999999\t44.949869\tCadott village\tWI\tWisconsin\tChippewa County\t1418\t38.8\t17.6\t8.8\t19434\t113380\t0.4926\t54727\tObama\t54727\t0.003553025\t54727.0\n23889\t-90.94457299999999\t44.960437\tStanley city\tWI\tWisconsin\tChippewa County\t2004\t40.8\t16.1\t5.5\t19204\t80714\t0.4926\t54768\tObama\t54768\t0.005021342\t54768.0\n23890\t-91.54985\t45.208606\tNew Auburn village\tWI\tWisconsin\tChippewa County\t572\t36.7\t11.1\t7.4\t16391\t84091\t0.4926\t54757\tObama\t54757\t0.0014332370000000002\t54757.0\n23891\t-91.389464\t44.935291\tChippewa Falls city\tWI\tWisconsin\tChippewa County\t13363\t40.0\t20.3\t7.6\t22368\t119694\t0.4926\t54729\tObama\t54729\t0.03348313\t54729.0\n23892\t-91.039795\t44.953277\tBoyd village\tWI\tWisconsin\tChippewa County\t1605\t34.6\t6.6\t7.7\t15291\t98056\t0.4926\t54726\tObama\t54726\t0.004021584\t54726.0\n23893\t-91.48956700000001\t45.102024\tBloomer city\tWI\tWisconsin\tChippewa County\t3367\t39.5\t16.1\t10.1\t23528\t118424\t0.4926\t54724\tObama\t54724\t0.008436556\t54724.0\n23894\t-90.30696\t44.948403000000006\tAbbotsford city\tWI\tWisconsin\tClark County\t2011\t41.3\t18.0\t7.6\t21342\t85882\t0.4472\t54405\tObama\t54405\t0.005038882\t54405.0\n23895\t-90.43489699999999\t44.952363\tCurtiss village\tWI\tWisconsin\tClark County\t218\t32.3\t9.4\t8.6\t15461\t84000\t0.4472\t54422\tObama\t54422\t0.000546234\t54422.0\n23896\t-90.59854200000001\t44.95075\tWithee village\tWI\tWisconsin\tClark County\t599\t42.6\t14.4\t6.6\t17815\t83793\t0.4472\t54460\tObama\t54460\t0.00150089\t54460.0\n23897\t-90.590727\t44.560596999999994\tNeillsville city\tWI\tWisconsin\tClark County\t2606\t42.1\t19.4\t8.7\t19845\t87616\t0.4472\t54456\tObama\t54456\t0.0065297490000000005\t54456.0\n23898\t-90.31529499999999\t45.004251000000004\tDorchester village\tWI\tWisconsin\tClark County\t866\t34.8\t10.7\t9.0\t19139\t94615\t0.4472\t54425\tObama\t54425\t0.002169901\t54425.0\n23899\t-90.800635\t44.95917\tThorp city\tWI\tWisconsin\tClark County\t1671\t42.1\t19.2\t9.1\t20431\t87169\t0.4472\t54771\tObama\t54771\t0.004186957\t54771.0\n23900\t-90.311649\t44.912855\tColby city\tWI\tWisconsin\tClark County\t1515\t40.2\t11.3\t8.6\t18907\t93778\t0.4472\t54421\tObama\t54421\t0.0037960740000000004\t54421.0\n23901\t-90.56769\t44.950071\tOwen city\tWI\tWisconsin\tClark County\t1043\t46.3\t9.3\t11.1\t17039\t64878\t0.4472\t54460\tObama\t54460\t0.002613403\t54460.0\n23902\t-90.461417\t44.588444\tGranton village\tWI\tWisconsin\tClark County\t397\t35.5\t10.3\t7.6\t16667\t91364\t0.4472\t54436\tObama\t54436\t0.000994747\t54436.0\n23903\t-90.599451\t44.765529\tGreenwood city\tWI\tWisconsin\tClark County\t1090\t40.6\t14.0\t6.3\t17607\t83182\t0.4472\t54437\tObama\t54437\t0.0027311690000000003\t54437.0\n23904\t-90.495851\t44.736398\tLoyal city\tWI\tWisconsin\tClark County\t1268\t35.6\t12.5\t6.8\t16918\t90000\t0.4472\t54446\tObama\t54446\t0.003177176\t54446.0\n23905\t-89.372652\t43.335479\tArlington village\tWI\tWisconsin\tColumbia County\t527\t40.8\t23.5\t5.3\t27002\t191071\t0.5623\t53911\tObama\t53911\t0.001320483\t53911.0\n23906\t-89.066775\t43.588571\tFriesland village\tWI\tWisconsin\tColumbia County\t324\t38.5\t13.7\t4.8\t19220\t141406\t0.5623\t53935\tObama\t53935\t0.000811834\t53935.0\n23907\t-89.111876\t43.541709000000004\tCambria village\tWI\tWisconsin\tColumbia County\t852\t33.8\t15.4\t13.5\t23857\t104261\t0.5623\t53923\tObama\t53923\t0.002134822\t53923.0\n23908\t-89.76544100000001\t43.641907\tWisconsin Dells city\tWI\tWisconsin\tColumbia County\t2426\t44.8\t20.8\t7.3\t24953\t135227\t0.5623\t53965\tObama\t53965\t0.00607873\t53965.0\n23909\t-89.300999\t43.535683\tPardeeville village\tWI\tWisconsin\tColumbia County\t2112\t39.4\t16.4\t7.8\t25936\t154902\t0.5623\t53954\tObama\t53954\t0.005291953\t53954.0\n23910\t-89.406758\t43.391467999999996\tPoynette village\tWI\tWisconsin\tColumbia County\t2707\t37.6\t22.7\t6.4\t25858\t159979\t0.5623\t53955\tObama\t53955\t0.006782821\t53955.0\n23911\t-89.145899\t43.427548\tDoylestown village\tWI\tWisconsin\tColumbia County\t364\t41.4\t11.2\t6.2\t24840\t173864\t0.5623\t53928\tObama\t53928\t0.00091206\t53928.0\n23912\t-89.57618599999999\t43.385776\tLake Wisconsin CDP\tWI\tWisconsin\tColumbia County\t3990\t44.5\t26.0\t6.7\t29996\t207920\t0.5623\t53555\tObama\t53555\t0.009997582\t53555.0\n23913\t-89.466328\t43.547257\tPortage city\tWI\tWisconsin\tColumbia County\t10104\t36.8\t18.1\t8.1\t24034\t124676\t0.5623\t53901\tObama\t53901\t0.025317185\t53901.0\n23914\t-89.048139\t43.383965\tFall River village\tWI\tWisconsin\tColumbia County\t1549\t36.9\t19.9\t5.5\t23175\t157056\t0.5623\t53932\tObama\t53932\t0.0038812670000000003\t53932.0\n23915\t-89.309795\t43.492945\tWyocena village\tWI\tWisconsin\tColumbia County\t673\t43.4\t15.5\t7.4\t23755\t154891\t0.5623\t53969\tObama\t53969\t0.001686309\t53969.0\n23916\t-89.00847399999999\t43.335231\tColumbus city\tWI\tWisconsin\tColumbia County\t4677\t38.8\t24.3\t6.7\t25515\t157705\t0.5623\t53925\tObama\t53925\t0.01171897\t53925.0\n23917\t-89.239164\t43.450243\tRio village\tWI\tWisconsin\tColumbia County\t1130\t39.3\t17.1\t8.3\t27825\t134335\t0.5623\t53960\tObama\t53960\t0.002831395\t53960.0\n23918\t-89.535259\t43.315808000000004\tLodi city\tWI\tWisconsin\tColumbia County\t2965\t37.8\t22.7\t6.8\t28186\t179481\t0.5623\t53555\tObama\t53555\t0.007429280999999999\t53555.0\n23919\t-90.929125\t43.316112\tMount Sterling village\tWI\tWisconsin\tCrawford County\t223\t46.4\t16.0\t8.4\t21082\t93571\t0.5922\t54645\tObama\t54645\t0.000558762\t54645.0\n23920\t-90.849351\t43.320827\tGays Mills village\tWI\tWisconsin\tCrawford County\t611\t45.6\t18.3\t11.6\t16374\t93056\t0.5922\t54631\tObama\t54631\t0.0015309579999999998\t54631.0\n23921\t-91.04644300000001\t43.249256\tLynxville village\tWI\tWisconsin\tCrawford County\t202\t44.6\t13.8\t9.4\t18700\t96429\t0.5922\t54640\tObama\t54640\t0.000506143\t54640.0\n23922\t-90.773491\t43.392151\tSoldiers Grove village\tWI\tWisconsin\tCrawford County\t651\t45.2\t12.7\t11.1\t18208\t77917\t0.5922\t54655\tObama\t54655\t0.001631184\t54655.0\n23923\t-90.856903\t43.183279999999996\tSteuben village\tWI\tWisconsin\tCrawford County\t182\t39.3\t11.8\t8.1\t17543\t104167\t0.5922\t54657\tObama\t54657\t0.00045603\t54657.0\n23924\t-90.900018\t43.08497\tWauzeka village\tWI\tWisconsin\tCrawford County\t788\t32.9\t9.1\t6.5\t19252\t91458\t0.5922\t53826\tObama\t53826\t0.00197446\t53826.0\n23925\t-91.090278\t43.350008\tFerryville village\tWI\tWisconsin\tCrawford County\t181\t47.1\t15.9\t8.3\t21015\t92857\t0.5922\t54628\tObama\t54628\t0.000453524\t54628.0\n23926\t-90.825675\t43.291607\tBell Center village\tWI\tWisconsin\tCrawford County\t115\t45.0\t22.6\t10.6\t18022\t96667\t0.5922\t54631\tObama\t54631\t0.000288151\t54631.0\n23927\t-91.139089\t43.043781\tPrairie du Chien city\tWI\tWisconsin\tCrawford County\t5883\t38.3\t17.8\t9.2\t21569\t98165\t0.5922\t53821\tObama\t53821\t0.014740796\t53821.0\n23928\t-91.02531\t43.162239\tEastman village\tWI\tWisconsin\tCrawford County\t463\t40.5\t14.2\t8.8\t19603\t96250\t0.5922\t54626\tObama\t54626\t0.00116012\t54626.0\n23929\t-89.533919\t42.989185\tVerona city\tWI\tWisconsin\tDane County\t9843\t38.7\t47.4\t6.0\t33381\t238210\t0.7103\t53593\tObama\t53593\t0.024663208\t53593.0\n23930\t-89.292209\t43.019641\tMcFarland village\tWI\tWisconsin\tDane County\t7826\t39.7\t38.7\t5.2\t33785\t220906\t0.7103\t53558\tObama\t53558\t0.019609292\t53558.0\n23931\t-89.730183\t43.007996\tMount Horeb village\tWI\tWisconsin\tDane County\t6752\t34.9\t30.6\t5.5\t28745\t216163\t0.7103\t53572\tObama\t53572\t0.016918213999999997\t53572.0\n23932\t-89.07466600000001\t43.051404999999995\tDeerfield village\tWI\tWisconsin\tDane County\t2299\t38.9\t25.4\t6.4\t25544\t194355\t0.7103\t53531\tObama\t53531\t0.005760512\t53531.0\n23933\t-89.425845\t42.985563\tFitchburg city\tWI\tWisconsin\tDane County\t24441\t32.9\t49.0\t9.0\t34090\t256686\t0.7103\t53711\tObama\t53711\t0.061240828\t53711.0\n23934\t-89.507671\t43.104309\tMiddleton city\tWI\tWisconsin\tDane County\t18009\t39.2\t55.1\t4.9\t38285\t249609\t0.7103\t53562\tObama\t53562\t0.045124425\t53562.0\n23935\t-89.200537\t43.089715999999996\tCottage Grove village\tWI\tWisconsin\tDane County\t5365\t33.1\t38.1\t4.5\t32597\t226827\t0.7103\t53527\tObama\t53527\t0.013442863999999999\t53527.0\n23936\t-89.82725400000001\t43.018803999999996\tBlue Mounds village\tWI\tWisconsin\tDane County\t807\t41.9\t34.1\t6.7\t29521\t187500\t0.7103\t53517\tObama\t53517\t0.0020220670000000002\t53517.0\n23937\t-89.348908\t43.243312\tDeForest village\tWI\tWisconsin\tDane County\t8633\t34.7\t29.3\t4.7\t29918\t197551\t0.7103\t53532\tObama\t53532\t0.02163136\t53532.0\n23938\t-89.010149\t43.006285999999996\tCambridge village\tWI\tWisconsin\tDane County\t1193\t41.8\t33.5\t10.5\t28070\t187981\t0.7103\t53523\tObama\t53523\t0.002989252\t53523.0\n23939\t-89.064613\t43.171665999999995\tMarshall village\tWI\tWisconsin\tDane County\t3859\t35.7\t19.3\t10.1\t24062\t166386\t0.7103\t53559\tObama\t53559\t0.009669341\t53559.0\n23940\t-89.49990600000001\t43.25076\tDane village\tWI\tWisconsin\tDane County\t909\t36.1\t19.4\t5.5\t25079\t199583\t0.7103\t53529\tObama\t53529\t0.002277645\t53529.0\n23941\t-89.531951\t42.864736\tBelleville village\tWI\tWisconsin\tDane County\t2202\t39.6\t23.9\t6.3\t26793\t177412\t0.7103\t53508\tObama\t53508\t0.005517463\t53508.0\n23942\t-89.33345200000001\t43.053969\tMonona city\tWI\tWisconsin\tDane County\t8152\t44.9\t40.6\t7.2\t32618\t193045\t0.7103\t53716\tObama\t53716\t0.020426138\t53716.0\n23943\t-89.381908\t42.925171\tOregon village\tWI\tWisconsin\tDane County\t8098\t36.9\t41.9\t5.1\t30404\t211659\t0.7103\t53575\tObama\t53575\t0.020290831999999998\t53575.0\n23944\t-89.033001\t42.971228\tRockdale village\tWI\tWisconsin\tDane County\t215\t41.7\t33.1\t11.0\t27896\t184722\t0.7103\t53523\tObama\t53523\t0.000538717\t53523.0\n23945\t-89.372338\t43.114272\tMaple Bluff village\tWI\tWisconsin\tDane County\t1390\t47.6\t80.8\t4.8\t69607\t387826\t0.7103\t53704\tObama\t53704\t0.003482867\t53704.0\n23946\t-89.79821700000001\t43.173365999999994\tMazomanie village\tWI\tWisconsin\tDane County\t1742\t41.0\t24.1\t6.9\t26926\t175000\t0.7103\t53560\tObama\t53560\t0.0043648590000000004\t53560.0\n23947\t-89.339136\t43.21092\tWindsor CDP\tWI\tWisconsin\tDane County\t3117\t37.5\t35.3\t7.3\t36290\t214336\t0.7103\t53598\tObama\t53598\t0.007810141\t53598.0\n23948\t-89.390517\t43.081376\tMadison city\tWI\tWisconsin\tDane County\t231453\t31.7\t51.7\t8.3\t29658\t197147\t0.7103\t53703\tObama\t53703\t0.579942445\t53703.0\n23949\t-89.237276\t43.182772\tSun Prairie city\tWI\tWisconsin\tDane County\t26589\t34.3\t38.5\t7.1\t32048\t212617\t0.7103\t53590\tObama\t53590\t0.066622985\t53590.0\n23950\t-89.654473\t43.114936\tCross Plains village\tWI\tWisconsin\tDane County\t3114\t36.5\t29.8\t5.7\t28956\t211751\t0.7103\t53528\tObama\t53528\t0.007802624\t53528.0\n23951\t-89.446708\t43.078843\tShorewood Hills village\tWI\tWisconsin\tDane County\t1809\t49.1\t87.9\t3.1\t65150\t440116\t0.7103\t53705\tObama\t53705\t0.004532738\t53705.0\n23952\t-89.43969399999999\t43.182643\tWaunakee village\tWI\tWisconsin\tDane County\t10973\t36.9\t35.0\t4.0\t31908\t250582\t0.7103\t53597\tObama\t53597\t0.027494603\t53597.0\n23953\t-89.222813\t42.921693\tStoughton city\tWI\tWisconsin\tDane County\t13053\t37.5\t31.5\t7.6\t27784\t186697\t0.7103\t53589\tObama\t53589\t0.032706376\t53589.0\n23954\t-89.74656999999999\t43.137147\tBlack Earth village\tWI\tWisconsin\tDane County\t1527\t42.2\t23.8\t6.3\t25661\t176607\t0.7103\t53515\tObama\t53515\t0.0038261420000000003\t53515.0\n23955\t-88.81839599999999\t43.336353\tLowell village\tWI\tWisconsin\tDodge County\t366\t39.8\t12.3\t14.3\t22091\t161607\t0.4217\t53557\tObama\t53557\t0.0009170710000000001\t53557.0\n23956\t-88.531784\t43.398395\tIron Ridge village\tWI\tWisconsin\tDodge County\t1170\t33.8\t9.2\t8.1\t21744\t150980\t0.4217\t53035\tObama\t53035\t0.002931622\t53035.0\n23957\t-88.51920600000001\t43.309667\tNeosho village\tWI\tWisconsin\tDodge County\t632\t39.7\t12.0\t9.5\t26389\t187500\t0.4217\t53059\tObama\t53059\t0.001583577\t53059.0\n23958\t-88.84472\t43.306567\tReeseville village\tWI\tWisconsin\tDodge County\t729\t39.6\t11.5\t10.9\t22632\t127083\t0.4217\t53579\tObama\t53579\t0.001826626\t53579.0\n23959\t-88.99986899999999\t43.540056\tRandolph village\tWI\tWisconsin\tDodge County\t1848\t39.3\t16.8\t9.8\t20649\t129875\t0.4217\t53956\tObama\t53956\t0.004630459\t53956.0\n23960\t-88.719817\t43.311489\tClyman village\tWI\tWisconsin\tDodge County\t376\t40.1\t12.6\t8.7\t21336\t155833\t0.4217\t53016\tObama\t53016\t0.000942128\t53016.0\n23961\t-88.836123\t43.463423999999996\tBeaver Dam city\tWI\tWisconsin\tDodge County\t15401\t38.8\t19.4\t12.1\t25320\t128766\t0.4217\t53916\tObama\t53916\t0.038589663999999996\t53916.0\n23962\t-88.606052\t43.346201\tHustisford village\tWI\tWisconsin\tDodge County\t1251\t37.9\t17.9\t7.2\t28469\t164000\t0.4217\t53034\tObama\t53034\t0.00313458\t53034.0\n23963\t-88.637762\t43.444992\tHoricon city\tWI\tWisconsin\tDodge County\t3709\t38.6\t17.1\t9.3\t29871\t136400\t0.4217\t53032\tObama\t53032\t0.009293491999999999\t53032.0\n23964\t-88.561576\t43.527052000000005\tKekoskee village\tWI\tWisconsin\tDodge County\t177\t44.8\t12.3\t5.9\t24758\t164063\t0.4217\t53050\tObama\t53050\t0.00044350199999999997\t53050.0\n23965\t-88.733936\t43.637664\tWaupun city\tWI\tWisconsin\tDodge County\t10962\t35.0\t15.2\t8.5\t21956\t121561\t0.4217\t53963\tObama\t53963\t0.027467041\t53963.0\n23966\t-88.546931\t43.498471\tMayville city\tWI\tWisconsin\tDodge County\t5146\t41.3\t15.3\t8.2\t26466\t144542\t0.4217\t53050\tObama\t53050\t0.012894125\t53050.0\n23967\t-88.453508\t43.515359000000004\tTheresa village\tWI\tWisconsin\tDodge County\t1453\t40.8\t10.9\t8.0\t22383\t140250\t0.4217\t53091\tObama\t53091\t0.003640723\t53091.0\n23968\t-88.49266800000001\t43.614982\tBrownsville village\tWI\tWisconsin\tDodge County\t486\t37.7\t18.6\t8.5\t24003\t188816\t0.4217\t53006\tObama\t53006\t0.001217751\t53006.0\n23969\t-88.912173\t43.563140000000004\tFox Lake city\tWI\tWisconsin\tDodge County\t1565\t43.0\t13.3\t13.3\t23704\t133967\t0.4217\t53933\tObama\t53933\t0.003921357\t53933.0\n23970\t-88.70308399999999\t43.406849\tJuneau city\tWI\tWisconsin\tDodge County\t2541\t41.6\t13.6\t9.9\t22333\t134235\t0.4217\t53039\tObama\t53039\t0.006366881\t53039.0\n23971\t-88.444018\t43.592448\tLomira village\tWI\tWisconsin\tDodge County\t2434\t36.4\t14.4\t8.7\t23255\t153324\t0.4217\t53048\tObama\t53048\t0.006098776\t53048.0\n23972\t-87.166216\t45.158667\tEphraim village\tWI\tWisconsin\tDoor County\t354\t54.2\t45.3\t9.3\t32022\t258824\t0.5295\t54211\tObama\t54211\t0.0008870039999999999\t54211.0\n23973\t-87.364828\t44.822407\tSturgeon Bay city\tWI\tWisconsin\tDoor County\t9787\t44.1\t21.3\t8.6\t24536\t115222\t0.5295\t54235\tObama\t54235\t0.024522891\t54235.0\n23974\t-87.126979\t45.183471999999995\tSister Bay village\tWI\tWisconsin\tDoor County\t905\t60.6\t37.1\t8.2\t29938\t236574\t0.5295\t54234\tObama\t54234\t0.002267622\t54234.0\n23975\t-87.47876\t44.690668\tForestville village\tWI\tWisconsin\tDoor County\t469\t42.7\t15.8\t7.6\t21575\t109896\t0.5295\t54213\tObama\t54213\t0.0011751539999999999\t54213.0\n23976\t-87.302604\t45.050496\tEgg Harbor village\tWI\tWisconsin\tDoor County\t335\t52.8\t34.1\t8.5\t30690\t210294\t0.5295\t54209\tObama\t54209\t0.0008393960000000001\t54209.0\n23977\t-92.188204\t46.649159000000004\tOliver village\tWI\tWisconsin\tDouglas County\t401\t45.6\t18.3\t7.6\t23517\t126667\t0.6492\t54880\tObama\t54880\t0.00100477\t54880.0\n23978\t-91.69950899999999\t46.511866\tLake Nebagamon village\tWI\tWisconsin\tDouglas County\t1119\t44.3\t27.2\t7.8\t23551\t143182\t0.6492\t54849\tObama\t54849\t0.002803833\t54849.0\n23979\t-92.108297\t46.653137\tSuperior village\tWI\tWisconsin\tDouglas County\t547\t41.2\t16.9\t6.9\t23861\t115972\t0.6492\t54880\tObama\t54880\t0.001370596\t54880.0\n23980\t-91.820711\t46.349396999999996\tSolon Springs village\tWI\tWisconsin\tDouglas County\t574\t45.6\t14.8\t11.9\t19247\t104688\t0.6492\t54873\tObama\t54873\t0.001438249\t54873.0\n23981\t-91.783549\t46.582819\tPoplar village\tWI\tWisconsin\tDouglas County\t626\t41.9\t24.2\t6.4\t21467\t116810\t0.6492\t54864\tObama\t54864\t0.001568543\t54864.0\n23982\t-92.084744\t46.691046\tSuperior city\tWI\tWisconsin\tDouglas County\t27300\t37.7\t22.7\t9.5\t22777\t95248\t0.6492\t54880\tObama\t54880\t0.068404509\t54880.0\n23983\t-91.91045799999999\t44.888746000000005\tMenomonie city\tWI\tWisconsin\tDunn County\t16406\t24.4\t35.3\t8.0\t20343\t135925\t0.5146\t54751\tObama\t54751\t0.041107852\t54751.0\n23984\t-92.124341\t45.049771\tDowning village\tWI\tWisconsin\tDunn County\t280\t39.3\t14.9\t7.5\t20463\t122115\t0.5146\t54734\tObama\t54734\t0.000701585\t54734.0\n23985\t-91.726295\t44.997346\tColfax village\tWI\tWisconsin\tDunn County\t1220\t41.9\t18.4\t7.1\t16839\t92714\t0.5146\t54730\tObama\t54730\t0.003056905\t54730.0\n23986\t-92.07701\t44.951370000000004\tKnapp village\tWI\tWisconsin\tDunn County\t453\t40.3\t12.5\t6.4\t21174\t115625\t0.5146\t54749\tObama\t54749\t0.0011350639999999999\t54749.0\n23987\t-92.03824200000001\t45.042974\tBoyceville village\tWI\tWisconsin\tDunn County\t1177\t35.4\t13.5\t8.7\t17264\t88036\t0.5146\t54725\tObama\t54725\t0.0029491609999999996\t54725.0\n23988\t-91.897471\t45.202147\tRidgeland village\tWI\tWisconsin\tDunn County\t287\t42.5\t22.8\t7.1\t18894\t91875\t0.5146\t54763\tObama\t54763\t0.0007191239999999999\t54763.0\n23989\t-91.904074\t45.043937\tWheeler village\tWI\tWisconsin\tDunn County\t354\t38.4\t22.2\t8.1\t20954\t126250\t0.5146\t54772\tObama\t54772\t0.0008870039999999999\t54772.0\n23990\t-91.843749\t44.988178999999995\tTainter Lake CDP\tWI\tWisconsin\tDunn County\t2324\t44.0\t32.5\t6.5\t28010\t156362\t0.5146\t54772\tObama\t54772\t0.005823153\t54772.0\n23991\t-91.68649\t44.874355\tElk Mound village\tWI\tWisconsin\tDunn County\t864\t34.3\t17.9\t8.9\t19642\t112772\t0.5146\t54739\tObama\t54739\t0.00216489\t54739.0\n23992\t-91.274722\t44.761868\tFall Creek village\tWI\tWisconsin\tEau Claire County\t1382\t39.9\t20.7\t6.6\t20986\t130195\t0.5595\t54742\tObama\t54742\t0.003462822\t54742.0\n23993\t-91.473341\t44.865662\tEau Claire city\tWI\tWisconsin\tEau Claire County\t65414\t31.8\t33.2\t7.4\t24084\t133601\t0.5595\t54703\tObama\t54703\t0.163905221\t54703.0\n23994\t-91.432698\t44.824272\tSeymour CDP\tWI\tWisconsin\tEau Claire County\t1582\t42.4\t29.5\t5.5\t24997\t148958\t0.5595\t54720\tObama\t54720\t0.0039639540000000004\t54720.0\n23995\t-91.120564\t44.678666\tAugusta city\tWI\tWisconsin\tEau Claire County\t1577\t38.7\t12.4\t8.9\t14957\t92121\t0.5595\t54722\tObama\t54722\t0.003951425\t54722.0\n23996\t-91.44249\t44.804707\tAltoona city\tWI\tWisconsin\tEau Claire County\t6821\t36.6\t31.2\t5.3\t27322\t124136\t0.5595\t54720\tObama\t54720\t0.017091105\t54720.0\n23997\t-90.957796\t44.603711\tFairchild village\tWI\tWisconsin\tEau Claire County\t665\t39.3\t7.1\t14.7\t14435\t73214\t0.5595\t54741\tObama\t54741\t0.001666264\t54741.0\n23998\t-88.674369\t43.807736\tRosendale village\tWI\tWisconsin\tFond du Lac County\t1007\t40.1\t18.0\t8.1\t23352\t148904\t0.4191\t54974\tObama\t54974\t0.002523199\t54974.0\n23999\t-88.24589300000001\t43.826240000000006\tMount Calvary village\tWI\tWisconsin\tFond du Lac County\t1025\t43.5\t21.9\t7.9\t21400\t134677\t0.4191\t53057\tObama\t53057\t0.0025683010000000003\t53057.0\n24000\t-88.84156800000001\t43.845579\tRipon city\tWI\tWisconsin\tFond du Lac County\t7333\t39.1\t22.4\t8.0\t22949\t120163\t0.4191\t54971\tObama\t54971\t0.018374002\t54971.0\n24001\t-88.363282\t43.692039\tEden village\tWI\tWisconsin\tFond du Lac County\t745\t37.8\t10.8\t10.2\t22382\t114145\t0.4191\t53019\tObama\t53019\t0.001866716\t53019.0\n24002\t-88.78262\t43.735493\tBrandon village\tWI\tWisconsin\tFond du Lac County\t1002\t37.8\t19.0\t8.2\t21067\t109142\t0.4191\t53919\tObama\t53919\t0.002510671\t53919.0\n24003\t-88.547866\t43.684446\tOakfield village\tWI\tWisconsin\tFond du Lac County\t1081\t39.5\t15.8\t9.7\t24444\t154521\t0.4191\t53065\tObama\t53065\t0.002708618\t53065.0\n24004\t-88.86813599999999\t43.742358\tFairwater village\tWI\tWisconsin\tFond du Lac County\t358\t41.0\t16.5\t8.2\t22218\t122917\t0.4191\t53931\tObama\t53931\t0.0008970260000000001\t53931.0\n24005\t-88.43883100000001\t43.775078\tFond du Lac city\tWI\tWisconsin\tFond du Lac County\t42814\t37.6\t23.5\t9.2\t26118\t119823\t0.4191\t54935\tObama\t54935\t0.10727731300000001\t54935.0\n24006\t-88.280372\t43.599163\tCampbellsport village\tWI\tWisconsin\tFond du Lac County\t2076\t40.6\t17.4\t8.4\t26324\t150625\t0.4191\t53010\tObama\t53010\t0.005201749\t53010.0\n24007\t-88.4843\t43.80911\tNorth Fond du Lac village\tWI\tWisconsin\tFond du Lac County\t5156\t38.4\t13.7\t9.2\t24520\t98535\t0.4191\t54937\tObama\t54937\t0.012919181\t54937.0\n24008\t-88.168747\t43.824494\tSt. Cloud village\tWI\tWisconsin\tFond du Lac County\t555\t41.2\t12.7\t6.0\t24284\t125806\t0.4191\t53079\tObama\t53079\t0.001390641\t53079.0\n24009\t-88.89722900000001\t45.568717\tCrandon city\tWI\tWisconsin\tForest County\t1932\t40.8\t12.7\t10.9\t19165\t97321\t0.5217\t54520\tObama\t54520\t0.004840934\t54520.0\n24010\t-90.797387\t43.09231\tWoodman village\tWI\tWisconsin\tGrant County\t99\t45.9\t13.3\t5.1\t21377\t80000\t0.5606\t53827\tObama\t53827\t0.00024806\t53827.0\n24011\t-90.476324\t42.73498\tPlatteville city\tWI\tWisconsin\tGrant County\t10663\t24.2\t40.8\t10.3\t21192\t122374\t0.5606\t53818\tObama\t53818\t0.026717849\t53818.0\n24012\t-90.710875\t42.687453000000005\tPotosi village\tWI\tWisconsin\tGrant County\t700\t41.6\t14.6\t5.3\t22318\t102989\t0.5606\t53820\tObama\t53820\t0.0017539620000000002\t53820.0\n24013\t-90.686868\t42.690668\tTennyson village\tWI\tWisconsin\tGrant County\t360\t41.8\t14.7\t4.5\t20464\t112500\t0.5606\t53820\tObama\t53820\t0.000902037\t53820.0\n24014\t-90.926674\t42.893503\tBloomington village\tWI\tWisconsin\tGrant County\t689\t43.2\t9.7\t6.0\t19011\t75476\t0.5606\t53804\tObama\t53804\t0.0017264\t53804.0\n24015\t-90.426941\t42.969772\tMontfort village\tWI\tWisconsin\tGrant County\t676\t35.7\t19.7\t7.8\t17910\t96563\t0.5606\t53569\tObama\t53569\t0.001693826\t53569.0\n24016\t-90.419965\t43.188961\tMuscoda village\tWI\tWisconsin\tGrant County\t1483\t42.3\t14.2\t10.8\t18649\t82955\t0.5606\t53573\tObama\t53573\t0.003715893\t53573.0\n24017\t-90.70800799999999\t42.847521\tLancaster city\tWI\tWisconsin\tGrant County\t3811\t41.1\t23.3\t6.4\t22550\t103945\t0.5606\t53813\tObama\t53813\t0.009549069\t53813.0\n24018\t-90.85920300000001\t42.969615000000005\tMount Hope village\tWI\tWisconsin\tGrant County\t191\t45.9\t13.1\t5.2\t21475\t80000\t0.5606\t53816\tObama\t53816\t0.000478581\t53816.0\n24019\t-90.651436\t42.981001\tFennimore city\tWI\tWisconsin\tGrant County\t2329\t42.1\t21.2\t7.7\t22122\t100563\t0.5606\t53809\tObama\t53809\t0.005835681\t53809.0\n24020\t-90.571911\t43.185543\tBlue River village\tWI\tWisconsin\tGrant County\t449\t44.0\t19.7\t8.3\t21256\t94375\t0.5606\t53518\tObama\t53518\t0.001125041\t53518.0\n24021\t-90.98366899999999\t42.713148\tCassville village\tWI\tWisconsin\tGrant County\t1073\t46.6\t10.1\t10.2\t17376\t83136\t0.5606\t53806\tObama\t53806\t0.002688573\t53806.0\n24022\t-90.423975\t42.534273999999996\tHazel Green village\tWI\tWisconsin\tGrant County\t1174\t38.0\t17.5\t8.5\t22733\t101215\t0.5606\t53803\tObama\t53803\t0.002941644\t53803.0\n24023\t-90.424204\t42.604231\tCuba City\tWI\tWisconsin\tGrant County\t2092\t43.4\t15.6\t6.4\t21046\t104405\t0.5606\t53807\tObama\t53807\t0.00524184\t53807.0\n24024\t-90.972313\t42.940382\tPatch Grove village\tWI\tWisconsin\tGrant County\t176\t40.4\t13.2\t6.3\t19891\t95000\t0.5606\t53817\tObama\t53817\t0.000440996\t53817.0\n24025\t-90.702404\t43.138886\tBoscobel city\tWI\tWisconsin\tGrant County\t3013\t38.3\t14.0\t8.8\t18477\t91919\t0.5606\t53805\tObama\t53805\t0.0075495530000000005\t53805.0\n24026\t-90.42561500000001\t42.900096999999995\tLivingston village\tWI\tWisconsin\tGrant County\t650\t41.5\t15.3\t5.3\t19973\t98810\t0.5606\t53554\tObama\t53554\t0.0016286789999999998\t53554.0\n24027\t-90.593163\t42.626195\tDickeyville village\tWI\tWisconsin\tGrant County\t1047\t39.3\t13.8\t6.1\t23555\t127621\t0.5606\t53808\tObama\t53808\t0.002623426\t53808.0\n24028\t-91.09711300000001\t42.901181\tBagley village\tWI\tWisconsin\tGrant County\t364\t46.0\t13.1\t5.5\t18491\t95625\t0.5606\t53801\tObama\t53801\t0.00091206\t53801.0\n24029\t-89.36945\t42.859226\tBrooklyn village\tWI\tWisconsin\tGreen County\t1065\t40.6\t25.4\t6.9\t27435\t206667\t0.58\t53521\tObama\t53521\t0.002668528\t53521.0\n24030\t-89.37656700000001\t42.61688\tBrodhead city\tWI\tWisconsin\tGreen County\t3313\t36.9\t16.4\t6.9\t23868\t111692\t0.58\t53520\tObama\t53520\t0.00830125\t53520.0\n24031\t-89.436746\t42.706915\tAlbany village\tWI\tWisconsin\tGreen County\t1347\t37.6\t12.7\t14.3\t24303\t116554\t0.58\t53502\tObama\t53502\t0.003375124\t53502.0\n24032\t-89.789338\t42.578789\tBrowntown village\tWI\tWisconsin\tGreen County\t262\t42.1\t15.6\t9.0\t21859\t140000\t0.58\t53522\tObama\t53522\t0.000656483\t53522.0\n24033\t-89.58950300000001\t42.745696\tMonticello village\tWI\tWisconsin\tGreen County\t1302\t41.8\t21.1\t6.5\t27344\t131780\t0.58\t53570\tObama\t53570\t0.003262369\t53570.0\n24034\t-89.643022\t42.600321\tMonroe city\tWI\tWisconsin\tGreen County\t11197\t40.7\t21.3\t10.1\t24944\t127172\t0.58\t53566\tObama\t53566\t0.028055871\t53566.0\n24035\t-89.63488199999999\t42.81305\tNew Glarus village\tWI\tWisconsin\tGreen County\t2426\t40.7\t28.9\t7.5\t28709\t165179\t0.58\t53574\tObama\t53574\t0.00607873\t53574.0\n24036\t-88.937925\t43.989318\tBerlin city\tWI\tWisconsin\tGreen Lake County\t5165\t41.0\t18.8\t8.6\t22437\t108102\t0.392\t54923\tObama\t54923\t0.012941732\t54923.0\n24037\t-89.138468\t43.746136\tMarquette village\tWI\tWisconsin\tGreen Lake County\t165\t49.7\t19.2\t6.6\t21241\t159375\t0.392\t53947\tObama\t53947\t0.000413434\t53947.0\n24038\t-88.99073299999999\t43.709706\tMarkesan city\tWI\tWisconsin\tGreen Lake County\t1428\t38.4\t16.4\t8.2\t24594\t108268\t0.392\t53946\tObama\t53946\t0.0035780820000000002\t53946.0\n24039\t-88.956203\t43.842718\tGreen Lake city\tWI\tWisconsin\tGreen Lake County\t1103\t51.8\t29.3\t8.7\t26503\t147857\t0.392\t54941\tObama\t54941\t0.002763743\t54941.0\n24040\t-89.130514\t43.852668\tPrinceton city\tWI\tWisconsin\tGreen Lake County\t1486\t48.1\t9.1\t14.7\t20179\t101149\t0.392\t54968\tObama\t54968\t0.00372341\t54968.0\n24041\t-89.130545\t43.69319\tKingston village\tWI\tWisconsin\tGreen Lake County\t301\t35.4\t11.6\t9.0\t18126\t113125\t0.392\t53939\tObama\t53939\t0.000754204\t53939.0\n24042\t-89.934218\t42.875636\tHollandale village\tWI\tWisconsin\tIowa County\t317\t44.5\t17.2\t9.9\t21205\t133333\t0.6466\t53544\tObama\t53544\t0.000794294\t53544.0\n24043\t-89.895237\t43.014762\tBarneveld village\tWI\tWisconsin\tIowa County\t1248\t38.8\t25.3\t7.3\t24585\t171324\t0.6466\t53507\tObama\t53507\t0.003127063\t53507.0\n24044\t-90.13032199999999\t42.964794\tDodgeville city\tWI\tWisconsin\tIowa County\t4508\t39.7\t25.8\t7.0\t26999\t126481\t0.6466\t53533\tObama\t53533\t0.011295514\t53533.0\n24045\t-90.274199\t42.918510999999995\tLinden village\tWI\tWisconsin\tIowa County\t695\t37.8\t13.7\t8.6\t19312\t123810\t0.6466\t53553\tObama\t53553\t0.001741433\t53553.0\n24046\t-89.909552\t43.164148\tArena village\tWI\tWisconsin\tIowa County\t867\t40.9\t16.9\t7.7\t22732\t154276\t0.6466\t53503\tObama\t53503\t0.0021724070000000003\t53503.0\n24047\t-89.99317099999999\t42.998543\tRidgeway village\tWI\tWisconsin\tIowa County\t660\t39.0\t16.3\t8.8\t22866\t147348\t0.6466\t53582\tObama\t53582\t0.001653735\t53582.0\n24048\t-90.326084\t43.190099\tAvoca village\tWI\tWisconsin\tIowa County\t624\t39.6\t8.7\t9.2\t17743\t68947\t0.6466\t53540\tObama\t53540\t0.001563532\t53540.0\n24049\t-90.183699\t42.862148\tMineral Point city\tWI\tWisconsin\tIowa County\t2725\t40.6\t27.8\t8.1\t23617\t132353\t0.6466\t53565\tObama\t53565\t0.0068279230000000005\t53565.0\n24050\t-90.39593\t42.841782\tRewey village\tWI\tWisconsin\tIowa County\t343\t35.6\t21.1\t7.2\t18279\t109091\t0.6466\t53580\tObama\t53580\t0.0008594410000000001\t53580.0\n24051\t-90.380054\t43.047508\tHighland village\tWI\tWisconsin\tIowa County\t911\t40.2\t12.0\t8.8\t20819\t114912\t0.6466\t53543\tObama\t53543\t0.002282656\t53543.0\n24052\t-90.32956899999999\t42.966011\tCobb village\tWI\tWisconsin\tIowa County\t481\t41.3\t16.7\t7.7\t19701\t115625\t0.6466\t53526\tObama\t53526\t0.001205222\t53526.0\n24053\t-90.196608\t46.443045\tHurley city\tWI\tWisconsin\tIron County\t1678\t47.0\t11.7\t9.7\t18919\t55733\t0.4912\t54525\tObama\t54525\t0.004204497\t54525.0\n24054\t-90.238228\t46.431384\tMontreal city\tWI\tWisconsin\tIron County\t765\t44.0\t12.6\t9.2\t18563\t54889\t0.4912\t54525\tObama\t54525\t0.00191683\t54525.0\n24055\t-91.015178\t44.383312\tHixton village\tWI\tWisconsin\tJackson County\t466\t41.6\t10.3\t6.9\t20823\t107386\t0.5689\t54635\tObama\t54635\t0.001167637\t54635.0\n24056\t-91.120482\t44.321793\tTaylor village\tWI\tWisconsin\tJackson County\t590\t37.7\t9.8\t9.8\t17315\t70000\t0.5689\t54659\tObama\t54659\t0.001478339\t54659.0\n24057\t-90.850791\t44.298828\tBlack River Falls city\tWI\tWisconsin\tJackson County\t3743\t42.6\t21.7\t8.6\t24267\t109493\t0.5689\t54615\tObama\t54615\t0.009378684\t54615.0\n24058\t-90.91290699999999\t44.436997\tAlma Center village\tWI\tWisconsin\tJackson County\t454\t37.9\t10.3\t7.3\t18578\t93462\t0.5689\t54611\tObama\t54611\t0.001137569\t54611.0\n24059\t-90.835643\t44.450645\tMerrillan village\tWI\tWisconsin\tJackson County\t653\t40.5\t13.4\t8.6\t18775\t88889\t0.5689\t54754\tObama\t54754\t0.0016361960000000001\t54754.0\n24060\t-90.997378\t44.131436\tMelrose village\tWI\tWisconsin\tJackson County\t592\t44.6\t14.4\t6.0\t21372\t108854\t0.5689\t54642\tObama\t54642\t0.0014833510000000002\t54642.0\n24061\t-88.587793\t42.878524\tPalmyra village\tWI\tWisconsin\tJefferson County\t1968\t40.2\t17.3\t10.3\t24308\t164693\t0.4552\t53156\tObama\t53156\t0.004931138\t53156.0\n24062\t-88.543605\t43.136546\tLake Lac La Belle CDP\tWI\tWisconsin\tJefferson County\t1105\t40.9\t24.1\t8.1\t29890\t212740\t0.4552\t53036\tObama\t53036\t0.0027687540000000004\t53036.0\n24063\t-88.691525\t42.923311\tHebron CDP\tWI\tWisconsin\tJefferson County\t250\t41.8\t15.0\t10.6\t26036\t141071\t0.4552\t53137\tObama\t53137\t0.000626415\t53137.0\n24064\t-88.774029\t43.080086\tJohnson Creek village\tWI\tWisconsin\tJefferson County\t2152\t36.2\t18.8\t9.7\t23721\t136207\t0.4552\t53038\tObama\t53038\t0.00539218\t53038.0\n24065\t-88.589774\t43.010839000000004\tSullivan village\tWI\tWisconsin\tJefferson County\t737\t41.4\t16.2\t8.6\t26290\t190000\t0.4552\t53178\tObama\t53178\t0.001846671\t53178.0\n24066\t-88.63999100000001\t42.98213\tRome CDP\tWI\tWisconsin\tJefferson County\t625\t40.6\t17.1\t8.9\t26339\t202907\t0.4552\t53137\tObama\t53137\t0.0015660370000000002\t53137.0\n24067\t-88.8075\t43.006426\tJefferson city\tWI\tWisconsin\tJefferson County\t7602\t39.5\t16.2\t12.3\t24952\t155445\t0.4552\t53549\tObama\t53549\t0.019048025\t53549.0\n24068\t-88.844796\t42.923148\tFort Atkinson city\tWI\tWisconsin\tJefferson County\t12041\t38.7\t23.3\t10.6\t26359\t157171\t0.4552\t53538\tObama\t53538\t0.030170647999999998\t53538.0\n24069\t-88.905964\t43.074604\tLake Mills city\tWI\tWisconsin\tJefferson County\t5548\t38.8\t30.5\t10.4\t25410\t174035\t0.4552\t53551\tObama\t53551\t0.013901400000000001\t53551.0\n24070\t-88.987854\t43.001846\tLake Ripley CDP\tWI\tWisconsin\tJefferson County\t1671\t43.0\t34.7\t8.5\t30132\t195962\t0.4552\t53523\tObama\t53523\t0.004186957\t53523.0\n24071\t-88.597665\t43.137011\tIxonia CDP\tWI\tWisconsin\tJefferson County\t1036\t41.7\t21.8\t7.9\t28153\t212374\t0.4552\t53036\tObama\t53036\t0.002595863\t53036.0\n24072\t-88.9424\t42.883787\tLake Koshkonong CDP\tWI\tWisconsin\tJefferson County\t1264\t44.9\t22.1\t7.8\t27839\t189706\t0.4552\t53538\tObama\t53538\t0.003167154\t53538.0\n24073\t-88.989808\t43.183536\tWaterloo city\tWI\tWisconsin\tJefferson County\t3320\t35.8\t19.4\t8.8\t27779\t156383\t0.4552\t53594\tObama\t53594\t0.00831879\t53594.0\n24074\t-88.726933\t43.207059\tWatertown city\tWI\tWisconsin\tJefferson County\t22291\t36.3\t19.7\t10.2\t24689\t155637\t0.4552\t53098\tObama\t53098\t0.05585365900000001\t53098.0\n24075\t-88.70011\t43.016791999999995\tHelenville CDP\tWI\tWisconsin\tJefferson County\t235\t42.9\t15.7\t9.2\t25897\t189773\t0.4552\t53137\tObama\t53137\t0.00058883\t53137.0\n24076\t-89.89461899999999\t43.709201\tLyndon Station village\tWI\tWisconsin\tJuneau County\t509\t41.5\t10.7\t7.6\t20334\t115217\t0.5278\t53944\tObama\t53944\t0.0012753810000000001\t53944.0\n24077\t-90.071474\t44.023932\tNecedah village\tWI\tWisconsin\tJuneau County\t962\t40.6\t11.7\t11.2\t18420\t94000\t0.5278\t54646\tObama\t54646\t0.002410445\t54646.0\n24078\t-90.263288\t43.682683000000004\tUnion Center village\tWI\tWisconsin\tJuneau County\t240\t45.1\t7.3\t8.9\t19200\t106818\t0.5278\t53962\tObama\t53962\t0.0006013580000000001\t53962.0\n24079\t-90.22393199999999\t43.6522\tWonewoc village\tWI\tWisconsin\tJuneau County\t949\t42.6\t13.1\t10.9\t20383\t89844\t0.5278\t53968\tObama\t53968\t0.002377871\t53968.0\n24080\t-90.26937099999999\t43.919412\tCamp Douglas village\tWI\tWisconsin\tJuneau County\t679\t43.0\t8.8\t8.8\t20751\t92037\t0.5278\t54637\tObama\t54637\t0.001701343\t54637.0\n24081\t-90.27072\t43.741440000000004\tElroy city\tWI\tWisconsin\tJuneau County\t1861\t38.9\t17.5\t10.8\t19701\t89182\t0.5278\t53929\tObama\t53929\t0.004663033\t53929.0\n24082\t-90.265698\t43.87729\tHustler village\tWI\tWisconsin\tJuneau County\t131\t42.5\t8.8\t8.8\t20798\t92000\t0.5278\t54637\tObama\t54637\t0.000328241\t54637.0\n24083\t-90.163279\t43.878032\tNew Lisbon city\tWI\tWisconsin\tJuneau County\t1434\t41.8\t14.1\t11.1\t23492\t91481\t0.5278\t53950\tObama\t53950\t0.003593116\t53950.0\n24084\t-90.079693\t43.801037\tMauston city\tWI\tWisconsin\tJuneau County\t4325\t38.4\t15.5\t8.9\t21269\t84599\t0.5278\t53948\tObama\t53948\t0.010836978\t53948.0\n24085\t-87.865279\t42.584668\tKenosha city\tWI\tWisconsin\tKenosha County\t96973\t34.8\t21.8\t14.0\t25065\t141424\t0.5546\t53144\tObama\t53144\t0.242981334\t53144.0\n24086\t-88.14364499999999\t42.527923\tCamp Lake CDP\tWI\tWisconsin\tKenosha County\t3749\t37.8\t11.6\t11.5\t21436\t148796\t0.5546\t53179\tObama\t53179\t0.009393718\t53179.0\n24087\t-87.889398\t42.526506\tPleasant Prairie village\tWI\tWisconsin\tKenosha County\t19758\t39.6\t32.1\t10.0\t32621\t193510\t0.5546\t53158\tObama\t53158\t0.049506824000000005\t53158.0\n24088\t-88.069468\t42.503177\tLake Shangrila CDP\tWI\tWisconsin\tKenosha County\t917\t42.1\t17.5\t12.6\t25386\t175781\t0.5546\t53104\tObama\t53104\t0.00229769\t53104.0\n24089\t-88.29500999999999\t42.54538\tPowers Lake CDP\tWI\tWisconsin\tKenosha County\t1593\t39.5\t17.4\t10.6\t25685\t188218\t0.5546\t53128\tObama\t53128\t0.003991516\t53128.0\n24090\t-88.16718\t42.549623\tSilver Lake village\tWI\tWisconsin\tKenosha County\t2611\t38.5\t20.5\t11.7\t25711\t148841\t0.5546\t53170\tObama\t53170\t0.006542276999999999\t53170.0\n24091\t-88.100009\t42.572041\tPaddock Lake village\tWI\tWisconsin\tKenosha County\t3134\t37.9\t17.8\t8.8\t26150\t148958\t0.5546\t53168\tObama\t53168\t0.007852737\t53168.0\n24092\t-88.26028000000001\t42.519927\tTwin Lakes village\tWI\tWisconsin\tKenosha County\t5683\t39.6\t23.3\t11.2\t28217\t184249\t0.5546\t53181\tObama\t53181\t0.014239663999999999\t53181.0\n24093\t-87.617981\t44.554543\tCasco village\tWI\tWisconsin\tKewaunee County\t639\t38.7\t14.6\t7.1\t21600\t124679\t0.4669\t54205\tObama\t54205\t0.0016011170000000002\t54205.0\n24094\t-87.70683000000001\t44.54415\tLuxemburg village\tWI\tWisconsin\tKewaunee County\t2183\t36.4\t10.4\t5.3\t21156\t129918\t0.4669\t54217\tObama\t54217\t0.005469855\t54217.0\n24095\t-87.51360799999999\t44.460201\tKewaunee city\tWI\tWisconsin\tKewaunee County\t2775\t44.2\t17.4\t10.3\t21435\t97313\t0.4669\t54216\tObama\t54216\t0.006953206\t54216.0\n24096\t-87.446273\t44.605810999999996\tAlgoma city\tWI\tWisconsin\tKewaunee County\t3414\t44.3\t18.4\t7.0\t22715\t93320\t0.4669\t54201\tObama\t54201\t0.008554322\t54201.0\n24097\t-90.908979\t43.906518\tRockland village\tWI\tWisconsin\tLa Crosse County\t656\t37.5\t13.1\t6.5\t20097\t119758\t0.5782\t54653\tObama\t54653\t0.001643713\t54653.0\n24098\t-90.990736\t43.89242\tBangor village\tWI\tWisconsin\tLa Crosse County\t1479\t38.3\t14.0\t6.9\t20548\t119886\t0.5782\t54614\tObama\t54614\t0.003705871\t54614.0\n24099\t-91.225975\t43.818622\tLa Crosse city\tWI\tWisconsin\tLa Crosse County\t51912\t31.4\t28.7\t7.8\t22431\t119221\t0.5782\t54601\tObama\t54601\t0.13007380400000002\t54601.0\n24100\t-91.209956\t43.887392\tOnalaska city\tWI\tWisconsin\tLa Crosse County\t16035\t37.2\t35.0\t6.3\t28813\t153392\t0.5782\t54650\tObama\t54650\t0.040178253\t54650.0\n24101\t-91.26269599999999\t43.954731\tHolmen village\tWI\tWisconsin\tLa Crosse County\t8176\t34.3\t24.1\t6.6\t23155\t141338\t0.5782\t54636\tObama\t54636\t0.020486273\t54636.0\n24102\t-91.08114499999999\t43.899136\tWest Salem village\tWI\tWisconsin\tLa Crosse County\t4937\t37.0\t27.9\t7.6\t24249\t133807\t0.5782\t54669\tObama\t54669\t0.012370441999999999\t54669.0\n24103\t-91.30828199999999\t43.93748\tBrice Prairie CDP\tWI\tWisconsin\tLa Crosse County\t1791\t35.7\t22.6\t7.1\t24715\t154054\t0.5782\t54636\tObama\t54636\t0.004487636\t54636.0\n24104\t-91.26233\t43.859575\tFrench Island CDP\tWI\tWisconsin\tLa Crosse County\t4655\t43.1\t21.4\t10.4\t27592\t136907\t0.5782\t54603\tObama\t54603\t0.011663846\t54603.0\n24105\t-90.232192\t42.573231\tShullsburg city\tWI\tWisconsin\tLafayette County\t1354\t42.3\t13.0\t10.7\t20124\t83776\t0.5704\t53586\tObama\t53586\t0.0033926629999999998\t53586.0\n24106\t-89.860777\t42.815187\tBlanchardville village\tWI\tWisconsin\tLafayette County\t804\t42.4\t16.9\t4.8\t21094\t117982\t0.5704\t53516\tObama\t53516\t0.00201455\t53516.0\n24107\t-90.383057\t42.570112\tBenton village\tWI\tWisconsin\tLafayette County\t930\t41.8\t18.0\t8.7\t19241\t92105\t0.5704\t53803\tObama\t53803\t0.002330263\t53803.0\n24108\t-90.332899\t42.737626\tBelmont village\tWI\tWisconsin\tLafayette County\t857\t39.0\t19.1\t5.7\t20673\t105804\t0.5704\t53510\tObama\t53510\t0.00214735\t53510.0\n24109\t-89.86569\t42.701197\tArgyle village\tWI\tWisconsin\tLafayette County\t799\t42.1\t14.1\t6.4\t20073\t113032\t0.5704\t53504\tObama\t53504\t0.002002022\t53504.0\n24110\t-90.023306\t42.58012\tGratiot village\tWI\tWisconsin\tLafayette County\t266\t43.2\t14.1\t4.3\t20575\t100000\t0.5704\t53541\tObama\t53541\t0.000666505\t53541.0\n24111\t-89.876266\t42.566844\tSouth Wayne village\tWI\tWisconsin\tLafayette County\t510\t43.4\t12.4\t4.4\t20985\t104044\t0.5704\t53587\tObama\t53587\t0.001277886\t53587.0\n24112\t-90.11674000000001\t42.681283\tDarlington city\tWI\tWisconsin\tLafayette County\t2313\t41.4\t19.4\t7.2\t20573\t94589\t0.5704\t53530\tObama\t53530\t0.005795591\t53530.0\n24113\t-89.15589399999999\t45.143843\tAntigo city\tWI\tWisconsin\tLanglade County\t8447\t40.1\t16.9\t10.9\t20477\t81521\t0.4347\t54409\tObama\t54409\t0.021165307\t54409.0\n24114\t-88.77035500000001\t45.161665\tWhite Lake village\tWI\tWisconsin\tLanglade County\t348\t48.1\t13.9\t10.1\t20970\t82000\t0.4347\t54491\tObama\t54491\t0.00087197\t54491.0\n24115\t-89.70224\t45.181717\tMerrill city\tWI\tWisconsin\tLincoln County\t10217\t38.5\t17.9\t12.8\t22187\t103682\t0.49700000000000005\t54452\tObama\t54452\t0.025600325\t54452.0\n24116\t-89.722924\t45.475116\tTomahawk city\tWI\tWisconsin\tLincoln County\t3756\t43.8\t20.8\t14.8\t20228\t110290\t0.49700000000000005\t54487\tObama\t54487\t0.009411258\t54487.0\n24117\t-87.74587700000001\t43.918137\tCleveland village\tWI\tWisconsin\tManitowoc County\t1431\t41.5\t23.4\t7.9\t24746\t139224\t0.4788\t53015\tObama\t53015\t0.003585599\t53015.0\n24118\t-88.02369499999999\t43.916469\tKiel city\tWI\tWisconsin\tManitowoc County\t3511\t38.4\t18.0\t8.1\t25204\t131462\t0.4788\t53042\tObama\t53042\t0.008797371\t53042.0\n24119\t-87.884457\t44.065877\tValders village\tWI\tWisconsin\tManitowoc County\t998\t39.2\t17.9\t8.2\t24051\t142578\t0.4788\t54245\tObama\t54245\t0.002500648\t54245.0\n24120\t-87.828055\t44.145244\tWhitelaw village\tWI\tWisconsin\tManitowoc County\t726\t36.9\t17.3\t8.7\t24573\t137500\t0.4788\t54247\tObama\t54247\t0.001819109\t54247.0\n24121\t-87.801672\t44.277573\tMaribel village\tWI\tWisconsin\tManitowoc County\t295\t40.5\t19.3\t7.6\t24788\t164423\t0.4788\t54227\tObama\t54227\t0.00073917\t54227.0\n24122\t-87.642658\t44.230214000000004\tMishicot village\tWI\tWisconsin\tManitowoc County\t1434\t40.2\t13.9\t8.7\t21558\t119817\t0.4788\t54228\tObama\t54228\t0.003593116\t54228.0\n24123\t-87.681514\t44.098281\tManitowoc city\tWI\tWisconsin\tManitowoc County\t33659\t40.8\t20.6\t10.5\t25005\t113858\t0.4788\t54220\tObama\t54220\t0.08433799800000001\t54220.0\n24124\t-87.72076700000001\t44.200939\tFrancis Creek village\tWI\tWisconsin\tManitowoc County\t696\t42.1\t15.0\t8.1\t25486\t139145\t0.4788\t54214\tObama\t54214\t0.001743939\t54214.0\n24125\t-87.582552\t44.155693\tTwo Rivers city\tWI\tWisconsin\tManitowoc County\t12165\t40.6\t16.9\t9.6\t25127\t106443\t0.4788\t54241\tObama\t54241\t0.03048135\t54241.0\n24126\t-87.80210500000001\t44.225313\tKellnersville village\tWI\tWisconsin\tManitowoc County\t383\t42.3\t12.2\t8.8\t23759\t136413\t0.4788\t54215\tObama\t54215\t0.000959668\t54215.0\n24127\t-87.924648\t44.006591\tSt. Nazianz village\tWI\tWisconsin\tManitowoc County\t792\t41.1\t15.1\t9.8\t24035\t148897\t0.4788\t54232\tObama\t54232\t0.001984482\t54232.0\n24128\t-87.953986\t44.153737\tReedsville village\tWI\tWisconsin\tManitowoc County\t1258\t40.3\t14.0\t7.4\t23263\t124493\t0.4788\t54230\tObama\t54230\t0.00315212\t54230.0\n24129\t-90.07224000000001\t44.80089\tStratford village\tWI\tWisconsin\tMarathon County\t1564\t36.3\t14.3\t13.1\t22639\t95000\t0.4632\t54484\tObama\t54484\t0.0039188520000000004\t54484.0\n24130\t-89.660788\t44.840672999999995\tEvergreen CDP\tWI\tWisconsin\tMarathon County\t3857\t36.9\t27.6\t10.9\t29767\t156498\t0.4632\t544HH\tObama\t544HH\t0.009664329000000001\t0.0\n24131\t-89.677097\t44.920667\tRib Mountain CDP\tWI\tWisconsin\tMarathon County\t5939\t42.0\t36.4\t9.8\t30309\t170370\t0.4632\t54401\tObama\t54401\t0.014881113\t54401.0\n24132\t-90.29826700000001\t44.754421\tSpencer village\tWI\tWisconsin\tMarathon County\t2032\t37.3\t15.3\t8.2\t21935\t95353\t0.4632\t54479\tObama\t54479\t0.0050915\t54479.0\n24133\t-89.683678\t44.786889\tMosinee city\tWI\tWisconsin\tMarathon County\t4124\t37.6\t18.8\t10.0\t25516\t119172\t0.4632\t54455\tObama\t54455\t0.01033334\t54455.0\n24134\t-89.33736400000001\t44.887018\tHatley village\tWI\tWisconsin\tMarathon County\t503\t39.4\t15.8\t6.3\t24048\t135985\t0.4632\t54440\tObama\t54440\t0.001260347\t54440.0\n24135\t-89.614538\t44.915172\tSchofield city\tWI\tWisconsin\tMarathon County\t2004\t40.2\t20.3\t8.4\t25786\t106692\t0.4632\t54474\tObama\t54474\t0.005021342\t54474.0\n24136\t-89.247702\t44.784029\tElderon village\tWI\tWisconsin\tMarathon County\t201\t43.4\t10.9\t8.5\t21234\t111538\t0.4632\t54427\tObama\t54427\t0.000503638\t54427.0\n24137\t-90.309501\t44.851873\tUnity village\tWI\tWisconsin\tMarathon County\t383\t36.8\t12.0\t7.0\t18452\t108854\t0.4632\t54488\tObama\t54488\t0.000959668\t54488.0\n24138\t-89.617288\t44.876069\tRothschild village\tWI\tWisconsin\tMarathon County\t5350\t41.2\t26.9\t6.8\t26312\t138918\t0.4632\t54474\tObama\t54474\t0.013405278999999999\t54474.0\n24139\t-89.656355\t45.027896000000005\tBrokaw village\tWI\tWisconsin\tMarathon County\t110\t45.7\t12.2\t9.2\t23316\t141071\t0.4632\t54417\tObama\t54417\t0.000275623\t54417.0\n24140\t-89.96350699999999\t44.922647\tEdgar village\tWI\tWisconsin\tMarathon County\t1449\t38.9\t15.4\t5.8\t23534\t126225\t0.4632\t54426\tObama\t54426\t0.0036307009999999996\t54426.0\n24141\t-89.548926\t44.890066999999995\tWeston village\tWI\tWisconsin\tMarathon County\t14000\t32.7\t22.9\t9.0\t26294\t146942\t0.4632\t54476\tObama\t54476\t0.035079235\t54476.0\n24142\t-90.014569\t44.865768\tFenwood village\tWI\tWisconsin\tMarathon County\t182\t40.2\t13.5\t11.0\t20847\t112500\t0.4632\t54426\tObama\t54426\t0.00045603\t54426.0\n24143\t-89.644864\t44.960596\tWausau city\tWI\tWisconsin\tMarathon County\t39750\t38.6\t25.6\t9.9\t25380\t118146\t0.4632\t54401\tObama\t54401\t0.099599971\t54401.0\n24144\t-89.842118\t44.933704999999996\tMarathon City village\tWI\tWisconsin\tMarathon County\t1703\t39.8\t19.5\t8.0\t23737\t122592\t0.4632\t54448\tObama\t54448\t0.004267138\t54448.0\n24145\t-90.079233\t45.03485\tAthens village\tWI\tWisconsin\tMarathon County\t1216\t35.8\t16.1\t7.3\t20461\t102060\t0.4632\t54411\tObama\t54411\t0.0030468820000000003\t54411.0\n24146\t-88.007703\t45.234221999999995\tCrivitz village\tWI\tWisconsin\tMarinette County\t1050\t44.2\t13.9\t10.0\t20305\t106500\t0.4756\t54114\tObama\t54114\t0.0026309429999999997\t54114.0\n24147\t-87.999178\t45.780142\tNiagara city\tWI\tWisconsin\tMarinette County\t1749\t39.6\t15.5\t10.5\t22547\t76569\t0.4756\t54151\tObama\t54151\t0.004382399\t54151.0\n24148\t-87.63059399999999\t45.087413\tMarinette city\tWI\tWisconsin\tMarinette County\t10709\t41.4\t17.6\t9.1\t23247\t79776\t0.4756\t54143\tObama\t54143\t0.026833108999999997\t54143.0\n24149\t-88.034319\t45.069748\tColeman village\tWI\tWisconsin\tMarinette County\t700\t42.9\t18.2\t11.9\t20081\t99286\t0.4756\t54112\tObama\t54112\t0.0017539620000000002\t54112.0\n24150\t-87.955203\t45.378059\tWausaukee village\tWI\tWisconsin\tMarinette County\t580\t48.0\t11.8\t11.6\t18697\t97000\t0.4756\t54177\tObama\t54177\t0.0014532829999999999\t54177.0\n24151\t-87.747579\t45.055593\tPeshtigo city\tWI\tWisconsin\tMarinette County\t3411\t43.3\t17.9\t13.1\t21284\t96923\t0.4756\t54157\tObama\t54157\t0.008546805\t54157.0\n24152\t-88.033387\t45.095473\tPound village\tWI\tWisconsin\tMarinette County\t356\t42.2\t12.9\t9.9\t18987\t92500\t0.4756\t54112\tObama\t54112\t0.000892015\t54112.0\n24153\t-89.213489\t43.964849\tNeshkoro village\tWI\tWisconsin\tMarquette County\t486\t51.6\t11.2\t9.0\t21708\t127632\t0.4952\t54960\tObama\t54960\t0.001217751\t54960.0\n24154\t-89.562515\t43.779671\tOxford village\tWI\tWisconsin\tMarquette County\t552\t43.1\t10.5\t7.2\t20701\t100000\t0.4952\t53952\tObama\t53952\t0.001383124\t53952.0\n24155\t-89.468441\t43.714636\tEndeavor village\tWI\tWisconsin\tMarquette County\t448\t36.3\t7.0\t8.7\t18881\t119271\t0.4952\t53930\tObama\t53930\t0.0011225360000000002\t53930.0\n24156\t-89.49333100000001\t43.884725\tWestfield village\tWI\tWisconsin\tMarquette County\t1320\t38.7\t12.8\t6.1\t19756\t98605\t0.4952\t53964\tObama\t53964\t0.0033074709999999998\t53964.0\n24157\t-89.333727\t43.793669\tMontello city\tWI\tWisconsin\tMarquette County\t1547\t47.4\t11.1\t9.1\t22413\t116713\t0.4952\t53949\tObama\t53949\t0.003876255\t53949.0\n24158\t-88.894362\t45.017835\tZoar CDP\tWI\tWisconsin\tMenominee County\t125\t25.4\t9.4\t20.0\t10542\t63333\t0.8649\t54150\tObama\t54150\t0.000313207\t54150.0\n24159\t-88.822643\t44.987797\tNeopit CDP\tWI\tWisconsin\tMenominee County\t845\t25.8\t9.8\t19.5\t10552\t64130\t0.8649\t54150\tObama\t54150\t0.0021172820000000003\t54150.0\n24160\t-88.600593\t44.87012\tKeshena CDP\tWI\tWisconsin\tMenominee County\t1381\t22.3\t12.4\t31.3\t9964\t64545\t0.8649\t54135\tObama\t54135\t0.0034603159999999997\t54135.0\n24161\t-88.54413100000001\t44.89091\tLegend Lake CDP\tWI\tWisconsin\tMenominee County\t1633\t41.4\t20.7\t17.0\t16010\t98056\t0.8649\t54135\tObama\t54135\t0.004091742\t54135.0\n24162\t-87.900739\t42.880235\tOak Creek city\tWI\tWisconsin\tMilwaukee County\t33230\t36.2\t27.9\t7.0\t30562\t182019\t0.6749\t53154\tObama\t53154\t0.08326307\t53154.0\n24163\t-88.034773\t43.061549\tWauwatosa city\tWI\tWisconsin\tMilwaukee County\t46994\t41.9\t51.5\t6.9\t33031\t182518\t0.6749\t53226\tObama\t53226\t0.11775097\t53226.0\n24164\t-87.974923\t43.174346\tBrown Deer village\tWI\tWisconsin\tMilwaukee County\t12289\t45.6\t35.7\t7.9\t30971\t149397\t0.6749\t53223\tObama\t53223\t0.030792052\t53223.0\n24165\t-87.901398\t43.158190000000005\tFox Point village\tWI\tWisconsin\tMilwaukee County\t7002\t47.0\t70.8\t5.6\t48040\t261704\t0.6749\t53217\tObama\t53217\t0.017544629\t53217.0\n24166\t-87.86256\t42.911946\tSouth Milwaukee city\tWI\tWisconsin\tMilwaukee County\t21307\t40.3\t18.1\t9.6\t27302\t145183\t0.6749\t53172\tObama\t53172\t0.05338809\t53172.0\n24167\t-87.872927\t42.971647\tSt. Francis city\tWI\tWisconsin\tMilwaukee County\t9180\t42.7\t15.9\t8.8\t26022\t125935\t0.6749\t53235\tObama\t53235\t0.023001956\t53235.0\n24168\t-87.89695999999999\t43.194716\tBayside village\tWI\tWisconsin\tMilwaukee County\t4462\t49.7\t65.0\t6.2\t50672\t289867\t0.6749\t53217\tObama\t53217\t0.011180253000000001\t53217.0\n24169\t-87.967058\t43.193793\tMilwaukee city\tWI\tWisconsin\tMilwaukee County\t600821\t31.4\t21.2\t15.9\t20227\t98534\t0.6749\t53092\tObama\t53092\t1.5054529419999998\t53092.0\n24170\t-88.005038\t42.961926\tGreenfield city\tWI\tWisconsin\tMilwaukee County\t36316\t44.7\t23.3\t8.2\t28782\t158881\t0.6749\t53220\tObama\t53220\t0.090995536\t53220.0\n24171\t-87.970924\t43.012446000000004\tWest Milwaukee village\tWI\tWisconsin\tMilwaukee County\t4081\t36.8\t18.9\t12.7\t23866\t116536\t0.6749\t53219\tObama\t53219\t0.010225597\t53219.0\n24172\t-88.02942900000001\t43.006876\tWest Allis city\tWI\tWisconsin\tMilwaukee County\t60754\t40.2\t19.1\t9.9\t26370\t131994\t0.6749\t53227\tObama\t53227\t0.152228847\t53227.0\n24173\t-88.00178100000001\t42.937093\tGreendale village\tWI\tWisconsin\tMilwaukee County\t14262\t47.1\t39.5\t7.9\t32418\t193427\t0.6749\t53129\tObama\t53129\t0.035735718\t53129.0\n24174\t-87.935335\t43.171744\tRiver Hills village\tWI\tWisconsin\tMilwaukee County\t1600\t48.1\t79.7\t5.5\t79537\t616150\t0.6749\t53217\tObama\t53217\t0.004009055\t53217.0\n24175\t-87.886664\t43.091367\tShorewood village\tWI\tWisconsin\tMilwaukee County\t13840\t40.5\t66.7\t6.3\t36152\t224088\t0.6749\t53211\tObama\t53211\t0.03467833\t53211.0\n24176\t-88.049139\t42.940946999999994\tHales Corners village\tWI\tWisconsin\tMilwaukee County\t7699\t43.7\t39.1\t8.1\t29206\t193984\t0.6749\t53130\tObama\t53130\t0.019291074\t53130.0\n24177\t-88.010402\t42.885362\tFranklin city\tWI\tWisconsin\tMilwaukee County\t34954\t40.6\t32.4\t7.3\t34464\t199980\t0.6749\t53132\tObama\t53132\t0.087582828\t53132.0\n24178\t-87.927737\t43.129011\tGlendale city\tWI\tWisconsin\tMilwaukee County\t13443\t48.4\t47.7\t8.1\t32647\t175632\t0.6749\t53209\tObama\t53209\t0.033683582999999996\t53209.0\n24179\t-87.863871\t42.946728\tCudahy city\tWI\tWisconsin\tMilwaukee County\t18533\t40.4\t15.9\t9.8\t25704\t138785\t0.6749\t53110\tObama\t53110\t0.04643739\t53110.0\n24180\t-87.900527\t43.113267\tWhitefish Bay village\tWI\tWisconsin\tMilwaukee County\t14033\t41.2\t74.3\t5.9\t43066\t249785\t0.6749\t53217\tObama\t53217\t0.035161922000000005\t53217.0\n24181\t-90.781409\t43.802529\tMelvina village\tWI\tWisconsin\tMonroe County\t96\t32.0\t10.9\t6.3\t14617\t129167\t0.4883\t54619\tObama\t54619\t0.000240543\t54619.0\n24182\t-90.813242\t43.940315000000005\tSparta city\tWI\tWisconsin\tMonroe County\t9244\t37.7\t19.1\t9.3\t21824\t98655\t0.4883\t54656\tObama\t54656\t0.023162317999999998\t54656.0\n24183\t-90.783978\t43.742971999999995\tCashton village\tWI\tWisconsin\tMonroe County\t1149\t39.6\t14.4\t3.5\t17646\t79333\t0.4883\t54619\tObama\t54619\t0.0028790029999999998\t54619.0\n24184\t-90.378242\t43.962445\tOakdale village\tWI\tWisconsin\tMonroe County\t321\t41.0\t10.2\t7.0\t20100\t127381\t0.4883\t54618\tObama\t54618\t0.0008043169999999999\t54618.0\n24185\t-90.498906\t43.988627\tTomah city\tWI\tWisconsin\tMonroe County\t8747\t39.5\t16.6\t8.1\t21793\t100385\t0.4883\t54660\tObama\t54660\t0.021917005\t54660.0\n24186\t-90.386284\t44.028107\tWyeville village\tWI\tWisconsin\tMonroe County\t149\t40.0\t16.7\t13.3\t17025\t95000\t0.4883\t54660\tObama\t54660\t0.00037334300000000005\t54660.0\n24187\t-90.502537\t44.128969\tWarrens village\tWI\tWisconsin\tMonroe County\t305\t39.7\t8.5\t9.6\t17882\t116667\t0.4883\t54666\tObama\t54666\t0.000764226\t54666.0\n24188\t-90.367775\t43.792590999999994\tKendall village\tWI\tWisconsin\tMonroe County\t540\t37.8\t14.8\t7.4\t17598\t112500\t0.4883\t54638\tObama\t54638\t0.001353056\t54638.0\n24189\t-90.52723\t43.813463\tWilton village\tWI\tWisconsin\tMonroe County\t593\t32.9\t7.8\t5.9\t15499\t93750\t0.4883\t54670\tObama\t54670\t0.001485856\t54670.0\n24190\t-90.626776\t43.834016\tNorwalk village\tWI\tWisconsin\tMonroe County\t751\t35.2\t15.5\t6.0\t17325\t113636\t0.4883\t54648\tObama\t54648\t0.00188175\t54648.0\n24191\t-88.144385\t44.873377000000005\tOconto Falls city\tWI\tWisconsin\tOconto County\t3033\t40.9\t15.4\t9.5\t23575\t99197\t0.4464\t54154\tObama\t54154\t0.007599666\t54154.0\n24192\t-88.36855200000001\t45.000815\tSuring village\tWI\tWisconsin\tOconto County\t674\t45.4\t8.2\t10.8\t19234\t84750\t0.4464\t54174\tObama\t54174\t0.001688815\t54174.0\n24193\t-88.306529\t44.889545\tGillett city\tWI\tWisconsin\tOconto County\t1424\t41.9\t10.9\t9.4\t19507\t89694\t0.4464\t54124\tObama\t54124\t0.003568059\t54124.0\n24194\t-88.049971\t44.95299\tLena village\tWI\tWisconsin\tOconto County\t611\t37.0\t15.7\t11.1\t21548\t96500\t0.4464\t54139\tObama\t54139\t0.0015309579999999998\t54139.0\n24195\t-87.86961600000001\t44.891954999999996\tOconto city\tWI\tWisconsin\tOconto County\t4750\t40.3\t11.8\t11.4\t21312\t91688\t0.4464\t54153\tObama\t54153\t0.011901883\t54153.0\n24196\t-89.42375899999999\t45.638298\tRhinelander city\tWI\tWisconsin\tOneida County\t7851\t40.3\t23.8\t10.8\t20882\t97148\t0.4827\t54501\tObama\t54501\t0.019671934\t54501.0\n24197\t-88.32891\t44.514493\tSeymour city\tWI\tWisconsin\tOutagamie County\t3501\t36.5\t22.4\t7.7\t23992\t132711\t0.4827\t54165\tObama\t54165\t0.008772314\t54165.0\n24198\t-88.314849\t44.285758\tLittle Chute village\tWI\tWisconsin\tOutagamie County\t11278\t34.8\t19.0\t6.9\t27476\t137860\t0.4827\t54140\tObama\t54140\t0.02825883\t54140.0\n24199\t-88.45150500000001\t44.473763\tBlack Creek village\tWI\tWisconsin\tOutagamie County\t1264\t38.5\t8.8\t9.5\t24092\t133190\t0.4827\t54106\tObama\t54106\t0.003167154\t54106.0\n24200\t-88.576672\t44.444932\tShiocton village\tWI\tWisconsin\tOutagamie County\t1056\t36.5\t10.6\t10.7\t24075\t130357\t0.4827\t54170\tObama\t54170\t0.0026459770000000003\t54170.0\n24201\t-88.467815\t44.567054\tNichols village\tWI\tWisconsin\tOutagamie County\t322\t34.2\t11.3\t10.2\t22099\t125000\t0.4827\t54152\tObama\t54152\t0.000806822\t54152.0\n24202\t-88.306733\t44.265091\tCombined Locks village\tWI\tWisconsin\tOutagamie County\t3104\t35.4\t24.7\t6.9\t29491\t151802\t0.4827\t54113\tObama\t54113\t0.007777568\t54113.0\n24203\t-88.63265600000001\t44.339719\tHortonville village\tWI\tWisconsin\tOutagamie County\t2774\t38.9\t22.9\t5.4\t26128\t139444\t0.4827\t54944\tObama\t54944\t0.006950700000000001\t54944.0\n24204\t-88.37531800000001\t44.276396999999996\tAppleton city\tWI\tWisconsin\tOutagamie County\t72869\t35.3\t34.2\t7.8\t28536\t135761\t0.4827\t54911\tObama\t54911\t0.182584914\t54911.0\n24205\t-88.727522\t44.531329\tBear Creek village\tWI\tWisconsin\tOutagamie County\t449\t35.6\t9.1\t8.8\t20167\t113500\t0.4827\t54922\tObama\t54922\t0.001125041\t54922.0\n24206\t-88.264925\t44.278084\tKaukauna city\tWI\tWisconsin\tOutagamie County\t14457\t36.7\t17.7\t9.7\t25062\t126019\t0.4827\t54130\tObama\t54130\t0.036224322\t54130.0\n24207\t-88.33928\t44.268809000000005\tKimberly village\tWI\tWisconsin\tOutagamie County\t6230\t37.8\t21.5\t5.9\t28150\t129470\t0.4827\t54136\tObama\t54136\t0.01561026\t54136.0\n24208\t-87.988268\t43.296561\tCedarburg city\tWI\tWisconsin\tOzaukee County\t11611\t41.8\t47.9\t5.5\t37387\t245907\t0.3432\t53012\tObama\t53012\t0.029093214\t53012.0\n24209\t-87.97865999999999\t43.236446\tThiensville village\tWI\tWisconsin\tOzaukee County\t3282\t46.0\t46.2\t9.2\t43123\t222635\t0.3432\t53092\tObama\t53092\t0.008223575\t53092.0\n24210\t-87.953228\t43.469407000000004\tFredonia village\tWI\tWisconsin\tOzaukee County\t2158\t36.7\t22.1\t10.4\t27897\t191635\t0.3432\t53021\tObama\t53021\t0.0054072140000000005\t53021.0\n24211\t-87.950963\t43.319825\tGrafton village\tWI\tWisconsin\tOzaukee County\t11187\t41.0\t34.4\t8.8\t34714\t200327\t0.3432\t53024\tObama\t53024\t0.028030815\t53024.0\n24212\t-87.880449\t43.391257\tPort Washington city\tWI\tWisconsin\tOzaukee County\t10502\t38.6\t30.1\t7.9\t30773\t186902\t0.3432\t53074\tObama\t53074\t0.026314438\t53074.0\n24213\t-87.942187\t43.384559\tSaukville village\tWI\tWisconsin\tOzaukee County\t4105\t36.7\t23.5\t9.5\t30777\t186023\t0.3432\t53080\tObama\t53080\t0.010285733\t53080.0\n24214\t-88.026389\t43.23512\tMequon city\tWI\tWisconsin\tOzaukee County\t23368\t46.1\t64.7\t8.2\t54812\t340401\t0.3432\t53097\tObama\t53097\t0.058552255\t53097.0\n24215\t-87.85723399999999\t43.502914000000004\tBelgium village\tWI\tWisconsin\tOzaukee County\t1976\t38.0\t25.8\t8.3\t27664\t193684\t0.3432\t53004\tObama\t53004\t0.004951183\t53004.0\n24216\t-91.96089599999999\t44.628475\tDurand city\tWI\tWisconsin\tPepin County\t2025\t41.0\t17.3\t7.2\t19676\t104471\t0.5072\t54736\tObama\t54736\t0.005073961\t54736.0\n24217\t-92.14840500000001\t44.442239\tPepin village\tWI\tWisconsin\tPepin County\t938\t51.2\t20.0\t8.4\t23323\t105405\t0.5072\t54759\tObama\t54759\t0.002350309\t54759.0\n24218\t-92.26328199999999\t44.485031\tStockholm village\tWI\tWisconsin\tPepin County\t102\t49.2\t30.7\t7.3\t24098\t150000\t0.5072\t54769\tObama\t54769\t0.000255577\t54769.0\n24219\t-92.480549\t44.736666\tEllsworth village\tWI\tWisconsin\tPierce County\t3272\t37.8\t17.9\t12.7\t23659\t127022\t0.4869\t54011\tObama\t54011\t0.008198518\t54011.0\n24220\t-92.453873\t44.586135\tBay City village\tWI\tWisconsin\tPierce County\t525\t39.7\t13.2\t7.6\t25303\t128000\t0.4869\t54723\tObama\t54723\t0.0013154710000000001\t54723.0\n24221\t-92.79238199999999\t44.750999\tPrescott city\tWI\tWisconsin\tPierce County\t4237\t37.5\t28.1\t6.9\t28579\t186951\t0.4869\t54021\tObama\t54021\t0.01061648\t54021.0\n24222\t-92.148709\t44.780024\tElmwood village\tWI\tWisconsin\tPierce County\t901\t44.5\t13.3\t7.7\t17513\t89677\t0.4869\t54740\tObama\t54740\t0.002257599\t54740.0\n24223\t-92.306949\t44.56576\tMaiden Rock village\tWI\tWisconsin\tPierce County\t126\t46.6\t20.4\t4.4\t23205\t128125\t0.4869\t54750\tObama\t54750\t0.000315713\t54750.0\n24224\t-92.62258299999999\t44.872312\tRiver Falls city\tWI\tWisconsin\tPierce County\t13764\t26.1\t44.4\t6.9\t25249\t177736\t0.4869\t54022\tObama\t54022\t0.0344879\t54022.0\n24225\t-92.191776\t44.633901\tPlum City village\tWI\tWisconsin\tPierce County\t630\t45.5\t15.4\t5.3\t20530\t100368\t0.4869\t54761\tObama\t54761\t0.001578566\t54761.0\n24226\t-92.24328\t44.867171\tSpring Valley village\tWI\tWisconsin\tPierce County\t1415\t38.5\t23.0\t7.5\t21232\t97805\t0.4869\t54767\tObama\t54767\t0.0035455079999999997\t54767.0\n24227\t-92.69484\t45.321363\tOsceola village\tWI\tWisconsin\tPolk County\t2726\t33.6\t22.7\t9.7\t22927\t146591\t0.4462\t54020\tObama\t54020\t0.006830428\t54020.0\n24228\t-92.466939\t45.571723\tLuck village\tWI\tWisconsin\tPolk County\t1393\t44.3\t19.9\t11.7\t20704\t108750\t0.4462\t54853\tObama\t54853\t0.003490384\t54853.0\n24229\t-92.500941\t45.526436\tMilltown village\tWI\tWisconsin\tPolk County\t1106\t42.6\t7.6\t9.8\t18929\t90667\t0.4462\t54858\tObama\t54858\t0.00277126\t54858.0\n24230\t-92.452813\t45.457931\tBalsam Lake village\tWI\tWisconsin\tPolk County\t1022\t45.7\t16.6\t11.5\t23547\t134766\t0.4462\t54810\tObama\t54810\t0.002560784\t54810.0\n24231\t-92.629796\t45.408615000000005\tSt. Croix Falls city\tWI\tWisconsin\tPolk County\t2180\t43.5\t24.2\t8.6\t24083\t142876\t0.4462\t54024\tObama\t54024\t0.005462338000000001\t54024.0\n24232\t-92.63435\t45.362134999999995\tDresser village\tWI\tWisconsin\tPolk County\t703\t38.2\t21.5\t7.5\t24649\t135938\t0.4462\t54009\tObama\t54009\t0.001761479\t54009.0\n24233\t-92.464191\t45.654701\tFrederic village\tWI\tWisconsin\tPolk County\t1365\t46.1\t14.1\t9.2\t18282\t95417\t0.4462\t54837\tObama\t54837\t0.003420225\t54837.0\n24234\t-92.363209\t45.304854\tAmery city\tWI\tWisconsin\tPolk County\t2902\t44.7\t20.8\t6.0\t22552\t129610\t0.4462\t54001\tObama\t54001\t0.007271424\t54001.0\n24235\t-92.556969\t45.449117\tCenturia village\tWI\tWisconsin\tPolk County\t941\t41.0\t18.4\t7.6\t21899\t135000\t0.4462\t54824\tObama\t54824\t0.002357826\t54824.0\n24236\t-92.26764399999999\t45.249012\tClear Lake village\tWI\tWisconsin\tPolk County\t1203\t39.2\t14.6\t11.6\t20683\t106746\t0.4462\t54005\tObama\t54005\t0.003014309\t54005.0\n24237\t-92.171243\t45.325495000000004\tClayton village\tWI\tWisconsin\tPolk County\t570\t35.2\t7.1\t16.1\t18974\t104167\t0.4462\t54004\tObama\t54004\t0.001428226\t54004.0\n24238\t-89.283498\t44.448431\tAmherst village\tWI\tWisconsin\tPortage County\t975\t39.8\t24.5\t9.0\t22351\t135491\t0.5612\t54406\tObama\t54406\t0.002443018\t54406.0\n24239\t-89.309179\t44.493722\tNelsonville village\tWI\tWisconsin\tPortage County\t222\t37.2\t20.3\t8.7\t22700\t135417\t0.5612\t54407\tObama\t54407\t0.000556256\t54407.0\n24240\t-89.560272\t44.490519\tWhiting village\tWI\tWisconsin\tPortage County\t1949\t45.2\t30.9\t6.1\t27141\t153641\t0.5612\t54481\tObama\t54481\t0.004883531\t54481.0\n24241\t-89.54320600000001\t44.463178000000006\tPlover village\tWI\tWisconsin\tPortage County\t11301\t35.7\t32.1\t6.8\t28326\t154402\t0.5612\t54467\tObama\t54467\t0.02831646\t54467.0\n24242\t-89.305322\t44.630006\tRosholt village\tWI\tWisconsin\tPortage County\t557\t32.1\t11.2\t9.5\t18972\t94750\t0.5612\t54473\tObama\t54473\t0.001395652\t54473.0\n24243\t-89.76612800000001\t44.591126\tJunction City village\tWI\tWisconsin\tPortage County\t437\t38.2\t13.2\t4.8\t20773\t108854\t0.5612\t54443\tObama\t54443\t0.001094973\t54443.0\n24244\t-89.316884\t44.468488\tAmherst Junction village\tWI\tWisconsin\tPortage County\t355\t37.6\t20.1\t8.8\t22671\t133824\t0.5612\t54407\tObama\t54407\t0.0008895089999999999\t54407.0\n24245\t-89.556331\t44.52625\tStevens Point city\tWI\tWisconsin\tPortage County\t25116\t27.5\t30.9\t9.0\t21799\t114013\t0.5612\t54481\tObama\t54481\t0.062932148\t54481.0\n24246\t-89.54624\t44.520219\tPark Ridge village\tWI\tWisconsin\tPortage County\t464\t43.8\t41.9\t4.2\t31021\t138750\t0.5612\t54481\tObama\t54481\t0.0011626260000000002\t54481.0\n24247\t-89.408728\t44.260811\tAlmond village\tWI\tWisconsin\tPortage County\t481\t40.5\t16.8\t14.6\t18837\t90000\t0.5612\t54909\tObama\t54909\t0.001205222\t54909.0\n24248\t-90.400914\t45.695253\tPhillips city\tWI\tWisconsin\tPrice County\t1578\t43.4\t15.8\t8.0\t22046\t92193\t0.49200000000000005\t54555\tObama\t54555\t0.003953931\t54555.0\n24249\t-90.586822\t45.530057\tKennan village\tWI\tWisconsin\tPrice County\t167\t38.0\t4.5\t8.0\t17603\t83750\t0.49200000000000005\t54537\tObama\t54537\t0.000418445\t54537.0\n24250\t-90.533534\t45.537012\tCatawba village\tWI\tWisconsin\tPrice County\t147\t45.8\t12.0\t11.1\t20994\t75833\t0.49200000000000005\t54515\tObama\t54515\t0.00036833199999999997\t54515.0\n24251\t-90.289587\t45.540825\tPrentice village\tWI\tWisconsin\tPrice County\t612\t41.7\t8.3\t8.1\t17147\t85625\t0.49200000000000005\t54556\tObama\t54556\t0.001533464\t54556.0\n24252\t-90.445713\t45.934994\tPark Falls city\tWI\tWisconsin\tPrice County\t2694\t46.1\t13.7\t7.6\t22444\t85632\t0.49200000000000005\t54524\tObama\t54524\t0.006750246999999999\t54524.0\n24253\t-88.21724\t42.765079\tWaterford village\tWI\tWisconsin\tRacine County\t5003\t38.5\t27.5\t9.2\t29951\t178235\t0.5128\t53167\tObama\t53167\t0.012535815\t53167.0\n24254\t-87.900758\t42.703553\tSturtevant village\tWI\tWisconsin\tRacine County\t6263\t35.3\t13.4\t9.3\t25093\t140130\t0.5128\t53177\tObama\t53177\t0.015692946\t53177.0\n24255\t-88.129079\t42.701387\tEagle Lake CDP\tWI\tWisconsin\tRacine County\t1295\t35.6\t28.8\t14.0\t23284\t152778\t0.5128\t53139\tObama\t53139\t0.0032448290000000003\t53139.0\n24256\t-88.285549\t42.621916\tBohners Lake CDP\tWI\tWisconsin\tRacine County\t2096\t38.5\t16.4\t8.2\t26478\t140520\t0.5128\t53105\tObama\t53105\t0.005251863000000001\t53105.0\n24257\t-87.78076800000001\t42.764542999999996\tNorth Bay village\tWI\tWisconsin\tRacine County\t256\t46.7\t50.6\t10.5\t31547\t221429\t0.5128\t53402\tObama\t53402\t0.000641449\t53402.0\n24258\t-88.214903\t42.808543\tWaterford North CDP\tWI\tWisconsin\tRacine County\t5261\t40.9\t25.6\t8.4\t29956\t217531\t0.5128\t53185\tObama\t53185\t0.013182275\t53185.0\n24259\t-87.822406\t42.691953999999996\tElmwood Park village\tWI\tWisconsin\tRacine County\t469\t45.6\t44.6\t8.4\t33275\t210156\t0.5128\t53405\tObama\t53405\t0.0011751539999999999\t53405.0\n24260\t-87.77199499999999\t42.781317\tWind Point village\tWI\tWisconsin\tRacine County\t1838\t51.5\t64.6\t10.5\t45675\t228058\t0.5128\t53402\tObama\t53402\t0.004605402\t53402.0\n24261\t-88.229295\t42.689617\tBrowns Lake CDP\tWI\tWisconsin\tRacine County\t1926\t43.1\t23.8\t9.6\t30351\t164861\t0.5128\t53167\tObama\t53167\t0.004825901\t53167.0\n24262\t-87.897072\t42.769672\tFranksville CDP\tWI\tWisconsin\tRacine County\t2151\t40.6\t21.6\t8.1\t28703\t175773\t0.5128\t53406\tObama\t53406\t0.0053896740000000005\t53406.0\n24263\t-88.04972099999999\t42.684499\tUnion Grove village\tWI\tWisconsin\tRacine County\t4553\t37.1\t23.7\t10.6\t26002\t164593\t0.5128\t53182\tObama\t53182\t0.011408268000000001\t53182.0\n24264\t-88.223574\t42.740988\tRochester village\tWI\tWisconsin\tRacine County\t1236\t40.1\t26.7\t8.1\t30157\t200649\t0.5128\t53167\tObama\t53167\t0.003096995\t53167.0\n24265\t-87.81183399999999\t42.725773\tRacine city\tWI\tWisconsin\tRacine County\t81736\t34.0\t19.6\t14.5\t23007\t111887\t0.5128\t53405\tObama\t53405\t0.204802598\t53405.0\n24266\t-88.275403\t42.69321\tBurlington city\tWI\tWisconsin\tRacine County\t10627\t37.1\t25.4\t11.9\t26710\t167383\t0.5128\t53105\tObama\t53105\t0.026627645\t53105.0\n24267\t-88.156892\t42.822846000000006\tWind Lake CDP\tWI\tWisconsin\tRacine County\t5415\t37.9\t24.7\t8.7\t31924\t218361\t0.5128\t53185\tObama\t53185\t0.013568147\t53185.0\n24268\t-90.201379\t43.186662\tLone Rock village\tWI\tWisconsin\tRichland County\t966\t37.2\t11.8\t10.2\t21902\t105797\t0.5741\t53556\tObama\t53556\t0.002420467\t53556.0\n24269\t-90.426776\t43.536453\tYuba village\tWI\tWisconsin\tRichland County\t96\t45.0\t16.9\t8.6\t19856\t108333\t0.5741\t54634\tObama\t54634\t0.000240543\t54634.0\n24270\t-90.19166\t43.523708\tCazenovia village\tWI\tWisconsin\tRichland County\t326\t38.9\t9.0\t9.5\t17440\t109239\t0.5741\t53941\tObama\t53941\t0.000816845\t53941.0\n24271\t-90.527611\t43.329966999999996\tBoaz village\tWI\tWisconsin\tRichland County\t140\t44.4\t17.2\t6.0\t21797\t117857\t0.5741\t53518\tObama\t53518\t0.00035079199999999994\t53518.0\n24272\t-90.38381700000001\t43.339271999999994\tRichland Center city\tWI\tWisconsin\tRichland County\t4984\t39.5\t19.8\t11.6\t20414\t95719\t0.5741\t53581\tObama\t53581\t0.012488208\t53581.0\n24273\t-90.66624399999999\t43.509078\tViola village\tWI\tWisconsin\tRichland County\t702\t46.0\t17.2\t8.6\t19517\t86667\t0.5741\t54664\tObama\t54664\t0.0017589729999999998\t54664.0\n24274\t-88.868082\t42.556065000000004\tClinton village\tWI\tWisconsin\tRock County\t2351\t38.1\t15.9\t13.4\t21889\t126563\t0.61\t53525\tObama\t53525\t0.005890806\t53525.0\n24275\t-89.29809300000001\t42.779629\tEvansville city\tWI\tWisconsin\tRock County\t4540\t37.8\t25.6\t15.2\t26404\t140293\t0.61\t53536\tObama\t53536\t0.011375695\t53536.0\n24276\t-89.256939\t42.629267999999996\tOrfordville village\tWI\tWisconsin\tRock County\t1624\t40.6\t16.1\t13.2\t23621\t124533\t0.61\t53576\tObama\t53576\t0.004069191\t53576.0\n24277\t-89.01293100000001\t42.687348\tJanesville city\tWI\tWisconsin\tRock County\t63186\t37.7\t22.7\t13.3\t27627\t126911\t0.61\t53546\tObama\t53546\t0.158322611\t53546.0\n24278\t-88.948964\t42.778153\tMilton city\tWI\tWisconsin\tRock County\t5480\t37.1\t21.8\t12.3\t26545\t140615\t0.61\t53563\tObama\t53563\t0.013731015\t53563.0\n24279\t-89.057968\t42.854114\tEdgerton city\tWI\tWisconsin\tRock County\t5067\t38.6\t21.4\t10.6\t25647\t122512\t0.61\t53534\tObama\t53534\t0.012696177\t53534.0\n24280\t-89.209299\t42.672228000000004\tFootville village\tWI\tWisconsin\tRock County\t841\t41.0\t13.4\t10.4\t25152\t138750\t0.61\t53537\tObama\t53537\t0.00210726\t53537.0\n24281\t-89.019758\t42.52292\tBeloit city\tWI\tWisconsin\tRock County\t36251\t34.4\t16.6\t18.5\t21903\t84882\t0.61\t53511\tObama\t53511\t0.090832668\t53511.0\n24282\t-91.096742\t45.461444\tLadysmith city\tWI\tWisconsin\tRusk County\t3538\t40.4\t19.5\t9.4\t20397\t89122\t0.4724\t54848\tObama\t54848\t0.008865024\t54848.0\n24283\t-90.893468\t45.496990000000004\tGlen Flora village\tWI\tWisconsin\tRusk County\t98\t41.0\t8.2\t8.5\t16786\t76667\t0.4724\t54526\tObama\t54526\t0.000245555\t54526.0\n24284\t-90.71488599999999\t45.51142\tHawkins village\tWI\tWisconsin\tRusk County\t335\t42.5\t7.8\t8.1\t16838\t75000\t0.4724\t54530\tObama\t54530\t0.0008393960000000001\t54530.0\n24285\t-90.997157\t45.480342\tTony village\tWI\tWisconsin\tRusk County\t111\t42.5\t14.3\t10.0\t19213\t107500\t0.4724\t54563\tObama\t54563\t0.000278128\t54563.0\n24286\t-91.035528\t45.384106\tConrath village\tWI\tWisconsin\tRusk County\t105\t37.9\t14.5\t4.3\t15435\t90000\t0.4724\t54731\tObama\t54731\t0.000263094\t54731.0\n24287\t-91.2734\t45.459075\tBruce village\tWI\tWisconsin\tRusk County\t789\t45.3\t16.6\t5.6\t18060\t76250\t0.4724\t54819\tObama\t54819\t0.001976965\t54819.0\n24288\t-91.41449399999999\t45.425094\tWeyerhaeuser village\tWI\tWisconsin\tRusk County\t384\t47.3\t12.6\t9.8\t18116\t91000\t0.4724\t54895\tObama\t54895\t0.000962173\t54895.0\n24289\t-90.956705\t45.311912\tSheldon village\tWI\tWisconsin\tRusk County\t258\t36.5\t10.2\t7.1\t15648\t85000\t0.4724\t54766\tObama\t54766\t0.00064646\t54766.0\n24290\t-90.813668\t45.505621000000005\tIngram village\tWI\tWisconsin\tRusk County\t80\t43.8\t8.6\t7.9\t16815\t71667\t0.4724\t54526\tObama\t54526\t0.00020045299999999999\t54526.0\n24291\t-92.53208000000001\t45.197874\tStar Prairie village\tWI\tWisconsin\tSt. Croix County\t599\t36.1\t17.4\t6.6\t23985\t189919\t0.4307\t54026\tObama\t54026\t0.00150089\t54026.0\n24292\t-92.550398\t44.986711\tRoberts village\tWI\tWisconsin\tSt. Croix County\t1522\t37.0\t13.9\t6.5\t24614\t107095\t0.4307\t54023\tObama\t54023\t0.0038136140000000003\t54023.0\n24293\t-92.171255\t45.05695\tGlenwood City\tWI\tWisconsin\tSt. Croix County\t1546\t37.2\t17.1\t6.8\t21325\t104167\t0.4307\t54013\tObama\t54013\t0.00387375\t54013.0\n24294\t-92.674782\t45.126435\tSomerset village\tWI\tWisconsin\tSt. Croix County\t2153\t36.4\t23.0\t8.1\t28153\t204128\t0.4307\t54025\tObama\t54025\t0.005394685\t54025.0\n24295\t-92.75810600000001\t44.995957000000004\tNorth Hudson village\tWI\tWisconsin\tSt. Croix County\t3802\t37.5\t37.9\t6.6\t34081\t228696\t0.4307\t54016\tObama\t54016\t0.009526518000000001\t54016.0\n24296\t-92.387925\t45.188894\tDeer Park village\tWI\tWisconsin\tSt. Croix County\t256\t40.5\t16.5\t8.8\t23403\t157353\t0.4307\t54007\tObama\t54007\t0.000641449\t54007.0\n24297\t-92.438126\t44.972984000000004\tHammond village\tWI\tWisconsin\tSt. Croix County\t1590\t35.7\t19.6\t6.5\t25327\t148611\t0.4307\t54015\tObama\t54015\t0.003983999\t54015.0\n24298\t-92.371657\t44.958211\tBaldwin village\tWI\tWisconsin\tSt. Croix County\t3788\t37.4\t24.4\t9.2\t25483\t163512\t0.4307\t54002\tObama\t54002\t0.009491439\t54002.0\n24299\t-92.170459\t44.957515\tWilson village\tWI\tWisconsin\tSt. Croix County\t207\t41.6\t20.5\t8.5\t25023\t161111\t0.4307\t54027\tObama\t54027\t0.000518672\t54027.0\n24300\t-92.286542\t44.952621\tWoodville village\tWI\tWisconsin\tSt. Croix County\t1315\t35.0\t24.0\t6.7\t24497\t125909\t0.4307\t54028\tObama\t54028\t0.003294942\t54028.0\n24301\t-92.540322\t45.123546999999995\tNew Richmond city\tWI\tWisconsin\tSt. Croix County\t7143\t35.7\t20.6\t8.8\t27383\t162843\t0.4307\t54017\tObama\t54017\t0.017897927\t54017.0\n24302\t-92.737094\t44.965877\tHudson city\tWI\tWisconsin\tSt. Croix County\t10841\t36.2\t42.6\t6.0\t35532\t234497\t0.4307\t54016\tObama\t54016\t0.027163856\t54016.0\n24303\t-89.742777\t43.468163\tBaraboo city\tWI\tWisconsin\tSauk County\t11336\t37.6\t24.5\t10.5\t25361\t126093\t0.5868\t53913\tObama\t53913\t0.028404158\t53913.0\n24304\t-90.130492\t43.582902000000004\tLa Valle village\tWI\tWisconsin\tSauk County\t343\t40.1\t13.5\t7.1\t23002\t153676\t0.5868\t53941\tObama\t53941\t0.0008594410000000001\t53941.0\n24305\t-89.72977\t43.271803999999996\tSauk City village\tWI\tWisconsin\tSauk County\t3347\t38.1\t20.8\t7.6\t24958\t161239\t0.5868\t53583\tObama\t53583\t0.008386443\t53583.0\n24306\t-89.99669899999999\t43.53216\tReedsburg city\tWI\tWisconsin\tSauk County\t8524\t36.9\t17.2\t8.1\t24655\t125735\t0.5868\t53959\tObama\t53959\t0.021358243\t53959.0\n24307\t-89.76880600000001\t43.476428999999996\tWest Baraboo village\tWI\tWisconsin\tSauk County\t1338\t37.6\t34.0\t9.0\t25799\t149094\t0.5868\t53913\tObama\t53913\t0.0033525729999999998\t53913.0\n24308\t-89.78728199999999\t43.594069\tLake Delton village\tWI\tWisconsin\tSauk County\t2560\t47.1\t20.4\t11.4\t24958\t85714\t0.5868\t53940\tObama\t53940\t0.006414489000000001\t53940.0\n24309\t-89.860563\t43.45876\tNorth Freedom village\tWI\tWisconsin\tSauk County\t730\t37.5\t7.5\t8.2\t17902\t99808\t0.5868\t53951\tObama\t53951\t0.001829132\t53951.0\n24310\t-90.041495\t43.277469\tPlain village\tWI\tWisconsin\tSauk County\t821\t43.2\t20.9\t6.5\t24399\t157143\t0.5868\t53577\tObama\t53577\t0.002057147\t53577.0\n24311\t-90.15780500000001\t43.467559\tLime Ridge village\tWI\tWisconsin\tSauk County\t189\t41.4\t12.4\t6.7\t19855\t133929\t0.5868\t53937\tObama\t53937\t0.00047357\t53937.0\n24312\t-90.06709599999999\t43.176044\tSpring Green village\tWI\tWisconsin\tSauk County\t1659\t43.2\t33.0\t7.9\t27975\t148009\t0.5868\t53588\tObama\t53588\t0.004156889\t53588.0\n24313\t-89.917461\t43.479083\tRock Springs village\tWI\tWisconsin\tSauk County\t471\t42.9\t16.4\t6.9\t24123\t131731\t0.5868\t53961\tObama\t53961\t0.001180166\t53961.0\n24314\t-89.73068599999999\t43.290943\tPrairie du Sac village\tWI\tWisconsin\tSauk County\t3654\t38.4\t29.2\t5.1\t27645\t183106\t0.5868\t53578\tObama\t53578\t0.00915568\t53578.0\n24315\t-89.627095\t43.373745\tMerrimac village\tWI\tWisconsin\tSauk County\t449\t45.5\t18.4\t6.1\t24868\t174167\t0.5868\t53561\tObama\t53561\t0.001125041\t53561.0\n24316\t-90.14358100000001\t43.545199\tIronton village\tWI\tWisconsin\tSauk County\t279\t41.6\t12.6\t6.5\t19906\t129688\t0.5868\t53941\tObama\t53941\t0.0006990789999999999\t53941.0\n24317\t-90.037834\t43.439184999999995\tLoganville village\tWI\tWisconsin\tSauk County\t295\t41.5\t15.9\t8.7\t21380\t133929\t0.5868\t53943\tObama\t53943\t0.00073917\t53943.0\n24318\t-91.30031899999999\t45.797674\tCouderay village\tWI\tWisconsin\tSawyer County\t97\t44.4\t13.0\t11.3\t18357\t85000\t0.4971\t54828\tObama\t54828\t0.000243049\t54828.0\n24319\t-91.217834\t45.768145000000004\tRadisson village\tWI\tWisconsin\tSawyer County\t225\t44.3\t13.1\t10.7\t18308\t80833\t0.4971\t54867\tObama\t54867\t0.000563773\t54867.0\n24320\t-91.331254\t45.921369\tChief Lake CDP\tWI\tWisconsin\tSawyer County\t664\t45.4\t18.9\t9.4\t18512\t138393\t0.4971\t54843\tObama\t54843\t0.001663758\t54843.0\n24321\t-91.367245\t45.969679\tLittle Round Lake CDP\tWI\tWisconsin\tSawyer County\t1006\t41.7\t17.3\t8.7\t17686\t146429\t0.4971\t54843\tObama\t54843\t0.002520694\t54843.0\n24322\t-91.242483\t45.667590999999994\tExeland village\tWI\tWisconsin\tSawyer County\t239\t47.3\t6.8\t8.0\t16012\t89375\t0.4971\t54835\tObama\t54835\t0.000598853\t54835.0\n24323\t-91.482727\t46.009629\tHayward city\tWI\tWisconsin\tSawyer County\t2311\t40.4\t22.1\t6.3\t21622\t113846\t0.4971\t548HH\tObama\t548HH\t0.0057905790000000006\t0.0\n24324\t-91.35441999999999\t45.833801\tReserve CDP\tWI\tWisconsin\tSawyer County\t458\t47.1\t18.9\t10.2\t19666\t105208\t0.4971\t54828\tObama\t54828\t0.001147592\t54828.0\n24325\t-91.01310699999999\t45.822114\tWinter village\tWI\tWisconsin\tSawyer County\t361\t42.5\t13.8\t14.9\t20511\t94375\t0.4971\t54896\tObama\t54896\t0.0009045430000000001\t54896.0\n24326\t-91.192895\t45.896547\tNew Post CDP\tWI\tWisconsin\tSawyer County\t377\t43.6\t15.2\t10.1\t18159\t100000\t0.4971\t54828\tObama\t54828\t0.000944634\t54828.0\n24327\t-89.05252\t44.740074\tTigerton village\tWI\tWisconsin\tShawano County\t749\t41.7\t9.7\t12.8\t16865\t73750\t0.4438\t54486\tObama\t54486\t0.0018767389999999999\t54486.0\n24328\t-88.728825\t44.934762\tMiddle Village CDP\tWI\tWisconsin\tShawano County\t369\t38.1\t14.8\t11.6\t17873\t102679\t0.4438\t54128\tObama\t54128\t0.0009245880000000001\t54128.0\n24329\t-88.447061\t44.739446\tBonduel village\tWI\tWisconsin\tShawano County\t1546\t37.3\t15.9\t8.2\t21677\t128289\t0.4438\t54107\tObama\t54107\t0.00387375\t54107.0\n24330\t-88.58448800000001\t44.775425\tShawano city\tWI\tWisconsin\tShawano County\t8779\t40.2\t22.6\t10.6\t21843\t108307\t0.4438\t54166\tObama\t54166\t0.021997186000000002\t54166.0\n24331\t-88.44880699999999\t44.812777000000004\tCecil village\tWI\tWisconsin\tShawano County\t510\t45.7\t15.5\t7.8\t22358\t119697\t0.4438\t54111\tObama\t54111\t0.001277886\t54111.0\n24332\t-89.20898199999999\t44.866987\tEland village\tWI\tWisconsin\tShawano County\t268\t40.1\t11.7\t10.5\t20562\t87143\t0.4438\t54427\tObama\t54427\t0.000671517\t54427.0\n24333\t-88.786075\t44.847966\tGresham village\tWI\tWisconsin\tShawano County\t606\t39.7\t14.0\t10.9\t18653\t108108\t0.4438\t54128\tObama\t54128\t0.00151843\t54128.0\n24334\t-89.041318\t45.004523\tMattoon village\tWI\tWisconsin\tShawano County\t479\t38.5\t8.1\t12.0\t19689\t87500\t0.4438\t54414\tObama\t54414\t0.001200211\t54414.0\n24335\t-89.167857\t44.826228\tWittenberg village\tWI\tWisconsin\tShawano County\t1242\t37.3\t16.2\t11.8\t19162\t96071\t0.4438\t54499\tObama\t54499\t0.003112029\t54499.0\n24336\t-89.20885799999999\t45.011479\tAniwa village\tWI\tWisconsin\tShawano County\t284\t39.6\t9.9\t8.6\t18127\t105833\t0.4438\t54414\tObama\t54414\t0.000711607\t54414.0\n24337\t-89.209019\t44.931872\tBirnamwood village\tWI\tWisconsin\tShawano County\t849\t40.1\t11.4\t10.4\t20587\t86957\t0.4438\t54414\tObama\t54414\t0.002127305\t54414.0\n24338\t-88.98151999999999\t44.862873\tBowler village\tWI\tWisconsin\tShawano County\t329\t38.9\t11.9\t11.6\t16243\t100781\t0.4438\t54416\tObama\t54416\t0.0008243619999999999\t54416.0\n24339\t-88.014787\t43.832244\tElkhart Lake village\tWI\tWisconsin\tSheboygan County\t1034\t45.8\t31.3\t8.1\t34180\t185714\t0.4456\t53020\tObama\t53020\t0.0025908520000000003\t53020.0\n24340\t-88.007765\t43.659959\tCascade village\tWI\tWisconsin\tSheboygan County\t838\t44.0\t18.2\t7.2\t27068\t149038\t0.4456\t53001\tObama\t53001\t0.002099743\t53001.0\n24341\t-87.94715699999999\t43.676123\tWaldo village\tWI\tWisconsin\tSheboygan County\t450\t41.9\t17.2\t6.9\t25628\t149569\t0.4456\t53093\tObama\t53093\t0.001127547\t53093.0\n24342\t-87.969658\t43.745436\tPlymouth city\tWI\tWisconsin\tSheboygan County\t8325\t39.9\t23.2\t6.8\t27764\t146944\t0.4456\t53073\tObama\t53073\t0.020859617\t53073.0\n24343\t-88.046829\t43.798427000000004\tGlenbeulah village\tWI\tWisconsin\tSheboygan County\t407\t41.6\t17.4\t7.6\t24298\t137500\t0.4456\t53023\tObama\t53023\t0.0010198030000000001\t53023.0\n24344\t-87.955736\t43.554288\tRandom Lake village\tWI\tWisconsin\tSheboygan County\t1652\t37.6\t22.3\t7.6\t26635\t173295\t0.4456\t53075\tObama\t53075\t0.00413935\t53075.0\n24345\t-87.82419\t43.567468\tCedar Grove village\tWI\tWisconsin\tSheboygan County\t2018\t36.8\t23.3\t6.5\t25643\t158333\t0.4456\t53013\tObama\t53013\t0.005056421\t53013.0\n24346\t-87.82771\t43.730954\tSheboygan Falls city\tWI\tWisconsin\tSheboygan County\t7626\t40.8\t18.2\t8.2\t28467\t140565\t0.4456\t53085\tObama\t53085\t0.019108161000000002\t53085.0\n24347\t-87.82457099999999\t43.826775\tHowards Grove village\tWI\tWisconsin\tSheboygan County\t3065\t40.9\t23.2\t6.9\t27534\t165305\t0.4456\t53083\tObama\t53083\t0.007679846999999999\t53083.0\n24348\t-87.78854399999999\t43.623771999999995\tOostburg village\tWI\tWisconsin\tSheboygan County\t2890\t38.3\t26.6\t8.4\t25001\t152007\t0.4456\t53070\tObama\t53070\t0.007241356\t53070.0\n24349\t-87.948691\t43.620391999999995\tAdell village\tWI\tWisconsin\tSheboygan County\t487\t38.2\t14.5\t7.8\t24863\t159722\t0.4456\t53093\tObama\t53093\t0.001220256\t53093.0\n24350\t-87.731551\t43.74505\tSheboygan city\tWI\tWisconsin\tSheboygan County\t50509\t36.6\t19.4\t11.7\t25103\t117059\t0.4456\t53081\tObama\t53081\t0.126558364\t53081.0\n24351\t-87.779605\t43.736346000000005\tKohler village\tWI\tWisconsin\tSheboygan County\t2117\t42.6\t52.0\t8.5\t37346\t179167\t0.4456\t53044\tObama\t53044\t0.005304481\t53044.0\n24352\t-90.345866\t45.138544\tMedford city\tWI\tWisconsin\tTaylor County\t4202\t41.2\t23.2\t4.5\t23527\t103947\t0.3956\t54451\tObama\t54451\t0.010528781999999999\t54451.0\n24353\t-90.313643\t45.076505\tStetsonville village\tWI\tWisconsin\tTaylor County\t584\t39.3\t7.5\t4.7\t21181\t108882\t0.3956\t54480\tObama\t54480\t0.001463305\t54480.0\n24354\t-90.203171\t45.31926\tRib Lake village\tWI\tWisconsin\tTaylor County\t864\t43.1\t13.5\t8.2\t18920\t88929\t0.3956\t54470\tObama\t54470\t0.00216489\t54470.0\n24355\t-90.724121\t45.075034\tLublin village\tWI\tWisconsin\tTaylor County\t115\t42.2\t5.0\t11.5\t17010\t82500\t0.3956\t54447\tObama\t54447\t0.000288151\t54447.0\n24356\t-90.80718399999999\t45.166296\tGilman village\tWI\tWisconsin\tTaylor County\t484\t43.0\t15.1\t16.8\t18342\t82917\t0.3956\t54433\tObama\t54433\t0.001212739\t54433.0\n24357\t-91.470434\t44.576388\tEleva village\tWI\tWisconsin\tTrempealeau County\t684\t40.8\t12.4\t4.6\t20271\t98125\t0.5641\t54738\tObama\t54738\t0.001713871\t54738.0\n24358\t-91.20875600000001\t44.424894\tPigeon Falls village\tWI\tWisconsin\tTrempealeau County\t389\t41.4\t13.3\t5.9\t18019\t108750\t0.5641\t54760\tObama\t54760\t0.0009747019999999999\t54760.0\n24359\t-91.495184\t44.249508\tArcadia city\tWI\tWisconsin\tTrempealeau County\t2406\t40.3\t12.8\t6.2\t21957\t98377\t0.5641\t54612\tObama\t54612\t0.006028616999999999\t54612.0\n24360\t-91.41875\t44.362213\tIndependence city\tWI\tWisconsin\tTrempealeau County\t1323\t40.1\t13.0\t5.9\t22587\t95333\t0.5641\t54747\tObama\t54747\t0.003314988\t54747.0\n24361\t-91.436379\t44.007967\tTrempealeau village\tWI\tWisconsin\tTrempealeau County\t1545\t42.5\t20.3\t4.3\t23928\t122222\t0.5641\t54661\tObama\t54661\t0.0038712440000000002\t54661.0\n24362\t-91.211997\t44.579162\tOsseo city\tWI\tWisconsin\tTrempealeau County\t1753\t41.6\t19.4\t4.4\t23159\t104087\t0.5641\t54758\tObama\t54758\t0.004392421\t54758.0\n24363\t-91.355517\t44.084268\tGalesville city\tWI\tWisconsin\tTrempealeau County\t1492\t43.4\t24.9\t4.1\t22528\t130938\t0.5641\t54630\tObama\t54630\t0.003738444\t54630.0\n24364\t-91.387814\t44.553146999999996\tStrum village\tWI\tWisconsin\tTrempealeau County\t1179\t42.2\t15.7\t6.1\t21498\t120349\t0.5641\t54770\tObama\t54770\t0.002954173\t54770.0\n24365\t-91.266548\t44.170258000000004\tEttrick village\tWI\tWisconsin\tTrempealeau County\t500\t43.5\t15.4\t6.7\t19867\t113571\t0.5641\t54627\tObama\t54627\t0.00125283\t54627.0\n24366\t-91.314937\t44.365906\tWhitehall city\tWI\tWisconsin\tTrempealeau County\t1679\t43.5\t14.2\t7.3\t18490\t92661\t0.5641\t54773\tObama\t54773\t0.004207003\t54773.0\n24367\t-91.228563\t44.295283000000005\tBlair city\tWI\tWisconsin\tTrempealeau County\t1325\t42.0\t14.2\t6.7\t18837\t88523\t0.5641\t54616\tObama\t54616\t0.003319999\t54616.0\n24368\t-90.75889699999999\t43.448376\tReadstown village\tWI\tWisconsin\tVernon County\t456\t41.7\t14.7\t8.3\t16079\t84091\t0.5637\t54652\tObama\t54652\t0.0011425810000000002\t54652.0\n24369\t-91.011503\t43.702222\tCoon Valley village\tWI\tWisconsin\tVernon County\t738\t45.0\t22.2\t7.0\t21750\t98824\t0.5637\t54623\tObama\t54623\t0.001849177\t54623.0\n24370\t-91.22621\t43.573108000000005\tGenoa village\tWI\tWisconsin\tVernon County\t275\t39.7\t18.9\t7.9\t21904\t102500\t0.5637\t54632\tObama\t54632\t0.0006890560000000001\t54632.0\n24371\t-91.10029499999999\t43.654565000000005\tChaseburg village\tWI\tWisconsin\tVernon County\t337\t40.1\t17.1\t8.6\t20323\t138158\t0.5637\t54621\tObama\t54621\t0.0008444069999999999\t54621.0\n24372\t-90.886926\t43.55875\tViroqua city\tWI\tWisconsin\tVernon County\t4458\t46.2\t19.5\t7.2\t19433\t89172\t0.5637\t54665\tObama\t54665\t0.011170231000000001\t54665.0\n24373\t-90.33745400000001\t43.653814000000004\tHillsboro city\tWI\tWisconsin\tVernon County\t1482\t44.1\t14.7\t8.9\t19096\t94231\t0.5637\t53962\tObama\t53962\t0.0037133879999999998\t53962.0\n24374\t-90.594131\t43.722151000000004\tOntario village\tWI\tWisconsin\tVernon County\t533\t43.0\t13.9\t8.7\t17698\t73125\t0.5637\t54651\tObama\t54651\t0.001335517\t54651.0\n24375\t-90.63816899999999\t43.577821\tLa Farge village\tWI\tWisconsin\tVernon County\t863\t44.0\t13.1\t7.2\t18572\t63833\t0.5637\t54639\tObama\t54639\t0.002162384\t54639.0\n24376\t-90.857463\t43.65266\tWestby city\tWI\tWisconsin\tVernon County\t2015\t41.9\t22.0\t6.9\t18621\t92132\t0.5637\t54667\tObama\t54667\t0.005048904\t54667.0\n24377\t-91.19445\t43.431275\tDe Soto village\tWI\tWisconsin\tVernon County\t394\t50.6\t13.4\t9.8\t22137\t96818\t0.5637\t54624\tObama\t54624\t0.00098723\t54624.0\n24378\t-91.21850699999999\t43.661511\tStoddard village\tWI\tWisconsin\tVernon County\t816\t41.9\t14.0\t8.6\t23388\t106618\t0.5637\t54658\tObama\t54658\t0.0020446179999999998\t54658.0\n24379\t-89.25700400000001\t45.924859999999995\tEagle River city\tWI\tWisconsin\tVilas County\t1493\t47.4\t17.2\t8.3\t21772\t125357\t0.4299\t54521\tObama\t54521\t0.00374095\t54521.0\n24380\t-89.899197\t45.9696\tLac du Flambeau CDP\tWI\tWisconsin\tVilas County\t1847\t39.5\t16.9\t8.5\t18012\t160357\t0.4299\t54538\tObama\t54538\t0.004627953\t54538.0\n24381\t-88.730207\t42.501209\tSharon village\tWI\tWisconsin\tWalworth County\t1737\t38.1\t10.1\t8.8\t20267\t148088\t0.4312\t53585\tObama\t53585\t0.004352331\t53585.0\n24382\t-88.615391\t42.598632\tDelavan Lake CDP\tWI\tWisconsin\tWalworth County\t2312\t41.3\t21.5\t6.0\t24924\t165441\t0.4312\t53115\tObama\t53115\t0.005793085\t53115.0\n24383\t-88.427912\t42.588063\tLake Geneva city\tWI\tWisconsin\tWalworth County\t7422\t38.9\t29.0\t8.9\t26808\t162905\t0.4312\t53147\tObama\t53147\t0.018597006\t53147.0\n24384\t-88.596956\t42.531874\tWalworth village\tWI\tWisconsin\tWalworth County\t2478\t38.8\t22.1\t8.7\t23755\t162214\t0.4312\t53184\tObama\t53184\t0.006209025\t53184.0\n24385\t-88.631159\t42.62832\tDelavan city\tWI\tWisconsin\tWalworth County\t8188\t33.2\t23.8\t12.8\t22326\t146875\t0.4312\t53115\tObama\t53115\t0.020516341\t53115.0\n24386\t-88.347139\t42.822381\tPotter Lake CDP\tWI\tWisconsin\tWalworth County\t1154\t44.8\t16.6\t11.1\t26743\t180167\t0.4312\t53149\tObama\t53149\t0.0028915309999999997\t53149.0\n24387\t-88.565104\t42.546158\tFontana-on-Geneva Lake village\tWI\tWisconsin\tWalworth County\t1774\t48.0\t39.2\t10.8\t31139\t242213\t0.4312\t53125\tObama\t53125\t0.00444504\t53125.0\n24388\t-88.49348\t42.610946000000006\tComo CDP\tWI\tWisconsin\tWalworth County\t2223\t45.5\t21.0\t9.5\t25303\t147756\t0.4312\t53147\tObama\t53147\t0.005570081\t53147.0\n24389\t-88.301552\t42.504096999999994\tGenoa City village\tWI\tWisconsin\tWalworth County\t2372\t29.8\t22.7\t7.7\t25093\t167909\t0.4312\t53128\tObama\t53128\t0.005943425\t53128.0\n24390\t-88.540013\t42.67139\tElkhorn city\tWI\tWisconsin\tWalworth County\t8680\t35.0\t23.0\t10.3\t24210\t157946\t0.4312\t53121\tObama\t53121\t0.021749126\t53121.0\n24391\t-88.397413\t42.787708\tEast Troy village\tWI\tWisconsin\tWalworth County\t4342\t37.8\t22.2\t7.0\t26138\t176226\t0.4312\t53120\tObama\t53120\t0.010879574\t53120.0\n24392\t-88.713541\t42.600811\tDarien village\tWI\tWisconsin\tWalworth County\t1785\t33.3\t16.7\t10.5\t22962\t158803\t0.4312\t53114\tObama\t53114\t0.004472602\t53114.0\n24393\t-88.542229\t42.576488\tWilliams Bay village\tWI\tWisconsin\tWalworth County\t2662\t45.7\t41.8\t7.1\t33075\t220423\t0.4312\t53191\tObama\t53191\t0.006670066\t53191.0\n24394\t-88.735294\t42.848987\tWhitewater city\tWI\tWisconsin\tWalworth County\t14108\t23.9\t36.3\t12.6\t19751\t155861\t0.4312\t53190\tObama\t53190\t0.035349846000000004\t53190.0\n24395\t-88.35888100000001\t42.542134999999995\tPell Lake CDP\tWI\tWisconsin\tWalworth County\t3511\t36.9\t5.5\t13.6\t23832\t128975\t0.4312\t53128\tObama\t53128\t0.008797371\t53128.0\n24396\t-91.891876\t45.825971\tSpooner city\tWI\tWisconsin\tWashburn County\t2702\t44.4\t20.4\t7.4\t19295\t97379\t0.4788\t54801\tObama\t54801\t0.006770292\t54801.0\n24397\t-91.550785\t45.657967\tBirchwood village\tWI\tWisconsin\tWashburn County\t597\t46.1\t14.6\t15.8\t19853\t102778\t0.4788\t54817\tObama\t54817\t0.0014958789999999999\t54817.0\n24398\t-91.826104\t46.097649\tMinong village\tWI\tWisconsin\tWashburn County\t626\t41.5\t5.6\t10.9\t15024\t72750\t0.4788\t54859\tObama\t54859\t0.001568543\t54859.0\n24399\t-91.903305\t45.732217\tShell Lake city\tWI\tWisconsin\tWashburn County\t1613\t46.6\t26.4\t6.5\t20130\t99891\t0.4788\t54871\tObama\t54871\t0.004041629000000001\t54871.0\n24400\t-88.037617\t43.431865\tNewburg village\tWI\tWisconsin\tWashington County\t1219\t38.5\t23.5\t11.0\t29115\t235588\t0.2942\t53021\tObama\t53021\t0.003054399\t53021.0\n24401\t-88.121666\t43.234258000000004\tGermantown village\tWI\tWisconsin\tWashington County\t20507\t38.2\t34.4\t8.6\t35066\t237639\t0.2942\t53022\tObama\t53022\t0.051383563\t53022.0\n24402\t-88.167412\t43.323811\tJackson village\tWI\tWisconsin\tWashington County\t6338\t35.3\t27.0\t8.9\t31014\t202550\t0.2942\t53037\tObama\t53037\t0.015880871\t53037.0\n24403\t-88.28434200000001\t43.332063\tSlinger village\tWI\tWisconsin\tWashington County\t4598\t38.6\t24.1\t7.5\t32641\t194013\t0.2942\t53086\tObama\t53086\t0.011521023\t53086.0\n24404\t-88.381793\t43.334153\tHartford city\tWI\tWisconsin\tWashington County\t12946\t35.5\t17.6\t7.8\t28654\t190265\t0.2942\t53027\tObama\t53027\t0.03243827\t53027.0\n24405\t-88.228492\t43.519825\tKewaskum village\tWI\tWisconsin\tWashington County\t4038\t36.9\t19.0\t7.4\t28994\t186391\t0.2942\t53040\tObama\t53040\t0.010117854\t53040.0\n24406\t-88.187535\t43.420711\tWest Bend city\tWI\tWisconsin\tWashington County\t29942\t37.9\t26.3\t10.2\t31498\t187922\t0.2942\t53095\tObama\t53095\t0.075024462\t53095.0\n24407\t-88.12916\t42.972570000000005\tNew Berlin city\tWI\tWisconsin\tWaukesha County\t40137\t42.7\t42.6\t8.8\t40227\t223155\t0.3231\t53146\tObama\t53146\t0.10056966199999999\t53146.0\n24408\t-88.391163\t43.071825\tDelafield city\tWI\tWisconsin\tWaukesha County\t7135\t41.4\t46.6\t6.4\t43650\t317221\t0.3231\t53018\tObama\t53018\t0.017877882\t53018.0\n24409\t-88.497514\t43.104571\tOconomowoc city\tWI\tWisconsin\tWaukesha County\t14092\t40.1\t36.4\t8.7\t34825\t209750\t0.3231\t53066\tObama\t53066\t0.035309756\t53066.0\n24410\t-88.122476\t43.06361\tBrookfield city\tWI\tWisconsin\tWaukesha County\t39407\t46.8\t53.3\t8.7\t45528\t263164\t0.3231\t53005\tObama\t53005\t0.09874053\t53005.0\n24411\t-88.4708\t43.016705\tDousman village\tWI\tWisconsin\tWaukesha County\t1814\t36.4\t24.8\t7.8\t29284\t196131\t0.3231\t53118\tObama\t53118\t0.004545267\t53118.0\n24412\t-88.469921\t42.878509\tEagle village\tWI\tWisconsin\tWaukesha County\t1985\t37.6\t25.2\t7.7\t31424\t225786\t0.3231\t53119\tObama\t53119\t0.0049737340000000005\t53119.0\n24413\t-88.440913\t43.124956\tOkauchee Lake CDP\tWI\tWisconsin\tWaukesha County\t4293\t43.7\t37.0\t7.5\t45652\t306031\t0.3231\t53069\tObama\t53069\t0.010756797\t53069.0\n24414\t-88.37975\t43.003358\tWales village\tWI\tWisconsin\tWaukesha County\t2357\t42.3\t45.8\t6.8\t38717\t281078\t0.3231\t53183\tObama\t53183\t0.00590584\t53183.0\n24415\t-88.122659\t43.148688\tMenomonee Falls village\tWI\tWisconsin\tWaukesha County\t35729\t41.8\t35.7\t8.4\t35885\t210912\t0.3231\t53051\tObama\t53051\t0.089524714\t53051.0\n24416\t-88.452043\t43.097409000000006\tOconomowoc Lake village\tWI\tWisconsin\tWaukesha County\t563\t47.2\t52.7\t8.1\t59459\t505952\t0.3231\t53069\tObama\t53069\t0.001410686\t53069.0\n24417\t-88.160175\t43.151983\tLannon village\tWI\tWisconsin\tWaukesha County\t1071\t44.1\t21.1\t9.3\t32604\t178378\t0.3231\t53046\tObama\t53046\t0.0026835609999999997\t53046.0\n24418\t-88.08669599999999\t43.048021000000006\tElm Grove village\tWI\tWisconsin\tWaukesha County\t6159\t49.5\t70.6\t9.5\t55740\t342939\t0.3231\t53122\tObama\t53122\t0.015432358\t53122.0\n24419\t-88.404478\t42.935697\tNorth Prairie village\tWI\tWisconsin\tWaukesha County\t1865\t40.6\t30.1\t7.7\t34559\t217992\t0.3231\t53153\tObama\t53153\t0.004673055\t53153.0\n24420\t-88.214349\t42.895982000000004\tBig Bend village\tWI\tWisconsin\tWaukesha County\t1299\t39.9\t25.6\t9.4\t28405\t205787\t0.3231\t53103\tObama\t53103\t0.003254852\t53103.0\n24421\t-88.383752\t43.122896000000004\tChenequa village\tWI\tWisconsin\tWaukesha County\t584\t46.5\t59.1\t6.4\t62649\t586957\t0.3231\t53058\tObama\t53058\t0.001463305\t53058.0\n24422\t-88.252429\t43.085592\tPewaukee village\tWI\tWisconsin\tWaukesha County\t8767\t38.5\t39.1\t8.8\t41725\t215424\t0.3231\t53072\tObama\t53072\t0.021967117999999997\t53072.0\n24423\t-88.341825\t43.099489\tHartland village\tWI\tWisconsin\tWaukesha County\t8126\t33.9\t38.8\t7.0\t38640\t239136\t0.3231\t53029\tObama\t53029\t0.02036099\t53029.0\n24424\t-88.328518\t42.864614\tMukwonago village\tWI\tWisconsin\tWaukesha County\t7019\t35.4\t28.5\t9.0\t32867\t196589\t0.3231\t53149\tObama\t53149\t0.017587225\t53149.0\n24425\t-88.53564\t43.143065\tLac La Belle village\tWI\tWisconsin\tWaukesha County\t376\t52.3\t39.4\t4.7\t44128\t416667\t0.3231\t53036\tObama\t53036\t0.000942128\t53036.0\n24426\t-88.217348\t43.132809\tSussex village\tWI\tWisconsin\tWaukesha County\t9995\t36.3\t28.7\t8.9\t33266\t222566\t0.3231\t53089\tObama\t53089\t0.025044068\t53089.0\n24427\t-88.241881\t43.009116999999996\tWaukesha city\tWI\tWisconsin\tWaukesha County\t68497\t35.8\t35.4\t8.9\t32328\t192185\t0.3231\t53188\tObama\t53188\t0.17163017\t53188.0\n24428\t-88.242976\t43.067431\tPewaukee city\tWI\tWisconsin\tWaukesha County\t12963\t40.3\t41.4\t9.2\t42371\t251799\t0.3231\t53072\tObama\t53072\t0.032480866000000004\t53072.0\n24429\t-88.311498\t43.143359000000004\tMerton village\tWI\tWisconsin\tWaukesha County\t2225\t38.4\t30.7\t7.5\t32665\t276111\t0.3231\t53029\tObama\t53029\t0.005575093000000001\t53029.0\n24430\t-88.129039\t42.885898\tMuskego city\tWI\tWisconsin\tWaukesha County\t23641\t40.8\t29.5\t9.3\t34587\t229903\t0.3231\t53150\tObama\t53150\t0.059236300000000006\t53150.0\n24431\t-88.071274\t43.108531\tButler village\tWI\tWisconsin\tWaukesha County\t1795\t44.6\t16.1\t9.5\t28263\t159067\t0.3231\t53007\tObama\t53007\t0.004497659\t53007.0\n24432\t-88.403787\t43.094122\tNashotah village\tWI\tWisconsin\tWaukesha County\t1329\t42.7\t43.8\t8.6\t39645\t295192\t0.3231\t53058\tObama\t53058\t0.003330022\t53058.0\n24433\t-88.751299\t44.621262\tClintonville city\tWI\tWisconsin\tWaupaca County\t4700\t40.2\t16.9\t12.2\t21147\t92949\t0.4015\t54929\tObama\t54929\t0.0117766\t54929.0\n24434\t-88.88933399999999\t44.68153\tMarion city\tWI\tWisconsin\tWaupaca County\t1367\t41.9\t10.9\t6.9\t20071\t104276\t0.4015\t54950\tObama\t54950\t0.0034252370000000002\t54950.0\n24435\t-89.016665\t44.617467\tBig Falls village\tWI\tWisconsin\tWaupaca County\t85\t42.9\t11.5\t6.7\t18808\t134375\t0.4015\t54486\tObama\t54486\t0.00021298099999999997\t54486.0\n24436\t-88.871442\t44.260216\tFremont village\tWI\tWisconsin\tWaupaca County\t657\t45.4\t14.7\t8.5\t21663\t152941\t0.4015\t54940\tObama\t54940\t0.0016462179999999999\t54940.0\n24437\t-89.031591\t44.453604\tOgdensburg village\tWI\tWisconsin\tWaupaca County\t232\t44.5\t16.0\t9.8\t22609\t125000\t0.4015\t54962\tObama\t54962\t0.0005813130000000001\t54962.0\n24438\t-88.727447\t44.397416\tNew London city\tWI\tWisconsin\tWaupaca County\t7353\t37.5\t18.0\t7.1\t23413\t115475\t0.4015\t54961\tObama\t54961\t0.018424115\t54961.0\n24439\t-89.122063\t44.509309\tIola village\tWI\tWisconsin\tWaupaca County\t1395\t44.2\t17.9\t7.9\t24048\t120417\t0.4015\t54945\tObama\t54945\t0.003495395\t54945.0\n24440\t-88.93419399999999\t44.322831\tWeyauwega city\tWI\tWisconsin\tWaupaca County\t1895\t41.4\t17.2\t9.0\t20535\t107839\t0.4015\t54983\tObama\t54983\t0.004748225\t54983.0\n24441\t-88.70379\t44.668467\tEmbarrass village\tWI\tWisconsin\tWaupaca County\t491\t42.0\t10.4\t6.0\t18983\t120673\t0.4015\t54933\tObama\t54933\t0.001230279\t54933.0\n24442\t-89.079424\t44.355865\tWaupaca city\tWI\tWisconsin\tWaupaca County\t5830\t38.1\t25.9\t11.6\t23363\t118449\t0.4015\t54981\tObama\t54981\t0.014607996000000002\t54981.0\n24443\t-89.14620500000001\t44.460845\tScandinavia village\tWI\tWisconsin\tWaupaca County\t382\t42.3\t18.6\t8.3\t22057\t142614\t0.4015\t54977\tObama\t54977\t0.000957162\t54977.0\n24444\t-89.166712\t44.330857\tChain O' Lakes-King CDP\tWI\tWisconsin\tWaupaca County\t2444\t52.3\t28.9\t7.2\t23939\t171000\t0.4015\t54981\tObama\t54981\t0.006123831999999999\t54981.0\n24445\t-88.920242\t44.461155\tManawa city\tWI\tWisconsin\tWaupaca County\t1399\t39.1\t15.4\t9.6\t20603\t97830\t0.4015\t54949\tObama\t54949\t0.0035054179999999997\t54949.0\n24446\t-89.29109\t44.070448\tWautoma city\tWI\tWisconsin\tWaushara County\t2448\t38.6\t18.9\t15.7\t19422\t93385\t0.4428\t54982\tObama\t54982\t0.006133855\t54982.0\n24447\t-89.52153100000001\t44.033415000000005\tColoma village\tWI\tWisconsin\tWaushara County\t533\t51.6\t12.9\t12.0\t21115\t120833\t0.4428\t54930\tObama\t54930\t0.001335517\t54930.0\n24448\t-89.10542199999999\t44.050839\tRedgranite village\tWI\tWisconsin\tWaushara County\t1157\t44.3\t6.8\t10.8\t18321\t90244\t0.4428\t54970\tObama\t54970\t0.002899048\t54970.0\n24449\t-89.246758\t44.176624\tWild Rose village\tWI\tWisconsin\tWaushara County\t928\t42.6\t15.2\t8.8\t18096\t87759\t0.4428\t54984\tObama\t54984\t0.0023252520000000003\t54984.0\n24450\t-89.120193\t44.038287\tLohrville village\tWI\tWisconsin\tWaushara County\t480\t42.9\t6.6\t6.8\t18838\t86316\t0.4428\t54970\tObama\t54970\t0.001202717\t54970.0\n24451\t-89.521636\t44.133324\tHancock village\tWI\tWisconsin\tWaushara County\t479\t47.4\t13.9\t9.3\t22304\t100694\t0.4428\t54943\tObama\t54943\t0.001200211\t54943.0\n24452\t-89.494789\t44.213823\tPlainfield village\tWI\tWisconsin\tWaushara County\t949\t37.7\t16.6\t14.0\t19228\t96500\t0.4428\t54966\tObama\t54966\t0.002377871\t54966.0\n24453\t-88.47368\t44.169404\tNeenah city\tWI\tWisconsin\tWinnebago County\t25321\t38.1\t29.9\t8.1\t29278\t123419\t0.5097\t54956\tObama\t54956\t0.06344580799999999\t54956.0\n24454\t-88.710542\t44.112226\tWinneconne village\tWI\tWisconsin\tWinnebago County\t2517\t45.5\t20.7\t5.9\t26472\t126154\t0.5097\t54986\tObama\t54986\t0.006306745\t54986.0\n24455\t-88.394133\t44.219547999999996\tMenasha city\tWI\tWisconsin\tWinnebago County\t16920\t36.3\t21.2\t7.1\t28327\t114235\t0.5097\t54952\tObama\t54952\t0.042395761\t54952.0\n24456\t-88.559289\t44.022958\tOshkosh city\tWI\tWisconsin\tWinnebago County\t64466\t33.9\t27.1\t9.2\t24298\t114583\t0.5097\t54901\tObama\t54901\t0.161529856\t54901.0\n24457\t-88.739917\t44.039123\tOmro city\tWI\tWisconsin\tWinnebago County\t3589\t39.9\t19.8\t10.3\t25232\t118574\t0.5097\t54963\tObama\t54963\t0.008992813\t54963.0\n24458\t-90.03191\t44.53947\tArpin village\tWI\tWisconsin\tWood County\t344\t45.7\t10.5\t13.9\t19949\t97500\t0.4777\t54410\tObama\t54410\t0.000861947\t54410.0\n24459\t-90.103541\t44.643844\tHewitt village\tWI\tWisconsin\tWood County\t711\t41.9\t17.7\t8.2\t25534\t138333\t0.4777\t54441\tObama\t54441\t0.001781524\t54441.0\n24460\t-89.75509699999999\t44.370939\tLake Wazeecha CDP\tWI\tWisconsin\tWood County\t2723\t42.1\t26.2\t8.5\t29649\t144707\t0.4777\t54494\tObama\t54494\t0.006822911\t54494.0\n24461\t-90.130204\t44.439031\tPittsville city\tWI\tWisconsin\tWood County\t940\t35.3\t20.2\t11.8\t21769\t91029\t0.4777\t544XX\tObama\t544XX\t0.00235532\t0.0\n24462\t-89.844532\t44.608919\tMilladore village\tWI\tWisconsin\tWood County\t271\t39.3\t10.3\t6.5\t22967\t113690\t0.4777\t54454\tObama\t54454\t0.0006790339999999999\t54454.0\n24463\t-89.84955500000001\t44.348061\tPort Edwards village\tWI\tWisconsin\tWood County\t1899\t43.3\t26.4\t12.5\t23259\t113250\t0.4777\t54469\tObama\t54469\t0.004758248\t54469.0\n24464\t-89.90738499999999\t44.313404999999996\tNekoosa city\tWI\tWisconsin\tWood County\t2569\t36.7\t13.0\t14.1\t25326\t90781\t0.4777\t54469\tObama\t54469\t0.00643704\t54469.0\n24465\t-89.82757099999999\t44.393208\tWisconsin Rapids city\tWI\tWisconsin\tWood County\t18114\t38.9\t18.8\t10.5\t25053\t95184\t0.4777\t54494\tObama\t54494\t0.045387519\t54494.0\n24466\t-89.801579\t44.496309000000004\tRudolph village\tWI\tWisconsin\tWood County\t423\t40.0\t18.4\t5.9\t23545\t121324\t0.4777\t54475\tObama\t54475\t0.001059894\t54475.0\n24467\t-90.014657\t44.626763000000004\tAuburndale village\tWI\tWisconsin\tWood County\t734\t38.1\t11.4\t9.1\t21556\t114951\t0.4777\t54412\tObama\t54412\t0.001839154\t54412.0\n24468\t-89.96789\t44.480461\tVesper village\tWI\tWisconsin\tWood County\t549\t42.5\t9.3\t11.6\t22145\t102841\t0.4777\t54489\tObama\t54489\t0.001375607\t54489.0\n24469\t-89.766302\t44.428527\tBiron village\tWI\tWisconsin\tWood County\t977\t44.9\t18.6\t9.1\t27436\t108537\t0.4777\t54494\tObama\t54494\t0.002448029\t54494.0\n24470\t-90.170123\t44.692966\tMarshfield city\tWI\tWisconsin\tWood County\t18866\t40.9\t25.7\t9.3\t27676\t110289\t0.4777\t54449\tObama\t54449\t0.047271775\t54449.0\n24471\t-106.02977800000001\t41.099940000000004\tWoods Landing-Jelm CDP\tWY\tWyoming\tAlbany County\t116\t48.3\t23.9\t8.5\t29246\t281250\t0.4575\t82063\tRomney\t82063\t0.000830188\t82063.0\n24472\t-105.56770800000001\t41.170863\tThe Buttes CDP\tWY\tWyoming\tAlbany County\t36\t46.9\t20.7\t10.5\t29176\t325000\t0.4575\t82072\tRomney\t82072\t0.000257645\t82072.0\n24473\t-106.11379299999999\t41.188725\tAlbany CDP\tWY\tWyoming\tAlbany County\t93\t47.8\t23.6\t8.5\t29171\t291667\t0.4575\t82055\tRomney\t82055\t0.000665582\t82055.0\n24474\t-105.58535400000001\t41.310446\tLaramie city\tWY\tWyoming\tAlbany County\t28579\t27.2\t48.5\t6.1\t21981\t190348\t0.4575\t82072\tRomney\t82072\t0.20453406899999999\t82072.0\n24475\t-106.11771599999999\t41.28974\tCentennial CDP\tWY\tWyoming\tAlbany County\t206\t47.2\t41.7\t6.6\t23926\t265000\t0.4575\t82055\tRomney\t82055\t0.0014743\t82055.0\n24476\t-105.975467\t41.73149\tRock River town\tWY\tWyoming\tAlbany County\t254\t46.7\t41.9\t6.2\t23867\t268750\t0.4575\t82083\tRomney\t82083\t0.001817826\t82083.0\n24477\t-108.61768500000001\t44.971357\tFrannie town\tWY\tWyoming\tBig Horn County\t218\t38.8\t16.0\t6.6\t18912\t126786\t0.163\t82423\tRomney\t82423\t0.0015601810000000001\t82423.0\n24478\t-108.05928999999999\t44.489146000000005\tGreybull town\tWY\tWyoming\tBig Horn County\t1775\t43.1\t15.4\t7.9\t19018\t109091\t0.163\t82426\tRomney\t82426\t0.012703313\t82426.0\n24479\t-107.964026\t44.269933\tManderson town\tWY\tWyoming\tBig Horn County\t106\t46.6\t21.1\t4.4\t19217\t150000\t0.163\t82432\tRomney\t82432\t0.00075862\t82432.0\n24480\t-108.43203000000001\t44.44692\tBurlington town\tWY\tWyoming\tBig Horn County\t246\t28.1\t20.2\t2.5\t13061\t117500\t0.163\t82411\tRomney\t82411\t0.0017605720000000002\t82411.0\n24481\t-107.615178\t44.249915\tHyattville CDP\tWY\tWyoming\tBig Horn County\t74\t46.7\t21.2\t3.2\t19328\t150000\t0.163\t82428\tRomney\t82428\t0.000529603\t82428.0\n24482\t-108.50766899999999\t44.796259\tByron town\tWY\tWyoming\tBig Horn County\t575\t38.7\t14.1\t6.6\t16305\t108125\t0.163\t82412\tRomney\t82412\t0.004115158\t82412.0\n24483\t-108.46999\t44.884993\tCowley town\tWY\tWyoming\tBig Horn County\t580\t38.6\t15.9\t5.6\t18578\t116346\t0.163\t82420\tRomney\t82420\t0.004150942\t82420.0\n24484\t-107.208496\t44.194231\tMeadow Lark Lake CDP\tWY\tWyoming\tBig Horn County\t8\t0.0\t20.0\t0.0\t19615\t0\t0.163\t82442\tRomney\t82442\t5.73e-05\t82442.0\n24485\t-108.04626200000001\t44.378968\tBasin town\tWY\tWyoming\tBig Horn County\t1266\t51.0\t17.9\t11.8\t22279\t115306\t0.163\t82410\tRomney\t82410\t0.009060504\t82410.0\n24486\t-108.59602\t44.889032\tDeaver town\tWY\tWyoming\tBig Horn County\t183\t38.3\t15.8\t5.8\t18616\t118056\t0.163\t82421\tRomney\t82421\t0.001309694\t82421.0\n24487\t-108.391552\t44.836052\tLovell town\tWY\tWyoming\tBig Horn County\t2326\t36.0\t17.0\t10.0\t17447\t118421\t0.163\t82431\tRomney\t82431\t0.016646707\t82431.0\n24488\t-105.49625800000001\t43.748758\tWright town\tWY\tWyoming\tCampbell County\t1385\t38.3\t6.9\t5.9\t22832\t171939\t0.1231\t82732\tRomney\t82732\t0.009912161999999999\t82732.0\n24489\t-105.42834599999999\t44.232389000000005\tSleepy Hollow CDP\tWY\tWyoming\tCampbell County\t1230\t31.4\t10.9\t7.5\t26212\t201860\t0.1231\t82717\tRomney\t82717\t0.008802859\t82717.0\n24490\t-105.516301\t44.280988\tGillette city\tWY\tWyoming\tCampbell County\t23783\t32.9\t18.9\t6.4\t25430\t194370\t0.1231\t82716\tRomney\t82716\t0.17021007600000002\t82716.0\n24491\t-105.474104\t44.22489\tAntelope Valley-Crestview CDP\tWY\tWyoming\tCampbell County\t1878\t31.3\t22.6\t6.1\t32250\t282237\t0.1231\t82716\tRomney\t82716\t0.013440463\t82716.0\n24492\t-106.20191100000001\t41.899528000000004\tMedicine Bow town\tWY\tWyoming\tCarbon County\t276\t50.2\t9.0\t7.1\t17530\t66667\t0.3242\t82083\tRomney\t82083\t0.001975276\t82083.0\n24493\t-107.53557099999999\t41.034461\tDixon town\tWY\tWyoming\tCarbon County\t76\t39.2\t15.8\t5.0\t18264\t104167\t0.3242\t82323\tRomney\t82323\t0.000543916\t82323.0\n24494\t-107.22875400000001\t41.784796\tRawlins city\tWY\tWyoming\tCarbon County\t8971\t37.1\t15.9\t5.9\t22504\t121569\t0.3242\t82301\tRomney\t82301\t0.06420361599999999\t82301.0\n24495\t-106.413249\t41.688383\tElk Mountain town\tWY\tWyoming\tCarbon County\t204\t44.0\t21.7\t2.1\t20883\t95000\t0.3242\t82324\tRomney\t82324\t0.0014599860000000001\t82324.0\n24496\t-107.65726000000001\t41.034420000000004\tBaggs town\tWY\tWyoming\tCarbon County\t333\t39.4\t15.2\t3.4\t18360\t105682\t0.3242\t82323\tRomney\t82323\t0.002383213\t82323.0\n24497\t-106.78141399999998\t41.215375\tRiverside town\tWY\tWyoming\tCarbon County\t63\t51.5\t28.0\t6.5\t23789\t150000\t0.3242\t82325\tRomney\t82325\t0.00045087800000000004\t82325.0\n24498\t-106.79481299999999\t41.208777000000005\tGrand Encampment town\tWY\tWyoming\tCarbon County\t475\t50.8\t28.4\t6.4\t23678\t166176\t0.3242\t82325\tRomney\t82325\t0.003399478\t82325.0\n24499\t-107.119863\t41.776063\tSinclair town\tWY\tWyoming\tCarbon County\t437\t44.3\t17.7\t7.3\t23171\t110417\t0.3242\t82301\tRomney\t82301\t0.00312752\t82301.0\n24500\t-106.810965\t41.45126\tSaratoga town\tWY\tWyoming\tCarbon County\t1835\t48.0\t23.5\t5.8\t23399\t154844\t0.3242\t82331\tRomney\t82331\t0.01313272\t82331.0\n24501\t-106.55964099999998\t41.869781\tHanna town\tWY\tWyoming\tCarbon County\t916\t44.0\t15.5\t9.0\t20796\t79853\t0.3242\t82327\tRomney\t82327\t0.006555625\t82327.0\n24502\t-105.84644399999999\t42.900044\tRolling Hills town\tWY\tWyoming\tConverse County\t552\t40.0\t16.8\t5.6\t21456\t151667\t0.1717\t82637\tRomney\t82637\t0.003950551\t82637.0\n24503\t-105.858609\t42.858358\tGlenrock town\tWY\tWyoming\tConverse County\t2663\t42.1\t12.4\t6.8\t21032\t123857\t0.1717\t82637\tRomney\t82637\t0.019058547\t82637.0\n24504\t-105.40084399999999\t42.754313\tDouglas city\tWY\tWyoming\tConverse County\t5609\t38.1\t14.5\t4.6\t21964\t139464\t0.1717\t82633\tRomney\t82633\t0.040142468\t82633.0\n24505\t-105.386081\t42.406071999999995\tEsterbrook CDP\tWY\tWyoming\tConverse County\t33\t42.5\t17.4\t11.1\t25562\t212500\t0.1717\t82058\tRomney\t82058\t0.00023617400000000002\t82058.0\n24506\t-104.925302\t42.765126\tLost Springs town\tWY\tWyoming\tConverse County\t1\t0.0\t0.0\t0.0\t27144\t0\t0.1717\t82224\tRomney\t82224\t7.16e-06\t82224.0\n24507\t-104.810291\t44.353633\tPine Haven town\tWY\tWyoming\tCrook County\t264\t44.5\t17.6\t5.6\t21929\t200000\t0.1156\t82721\tRomney\t82721\t0.001889394\t82721.0\n24508\t-104.59803199999999\t44.68248\tHulett town\tWY\tWyoming\tCrook County\t461\t43.3\t14.0\t4.0\t15690\t124219\t0.1156\t82711\tRomney\t82711\t0.003299283\t82711.0\n24509\t-104.95191000000001\t44.26465\tMoorcroft town\tWY\tWyoming\tCrook County\t926\t35.7\t14.6\t1.8\t20458\t121552\t0.1156\t82721\tRomney\t82721\t0.006627193000000001\t82721.0\n24510\t-104.368351\t44.405572\tSundance town\tWY\tWyoming\tCrook County\t1318\t46.5\t24.2\t8.4\t23129\t153191\t0.1156\t82729\tRomney\t82729\t0.009432656999999999\t82729.0\n24511\t-108.920449\t43.006864\tFort Washakie CDP\tWY\tWyoming\tFremont County\t1611\t28.0\t8.2\t23.7\t10442\t114744\t0.3148\t82514\tRomney\t82514\t0.011529598\t82514.0\n24512\t-109.23015500000001\t43.340029\tCrowheart CDP\tWY\tWyoming\tFremont County\t174\t44.5\t10.3\t6.7\t24855\t246429\t0.3148\t82512\tRomney\t82512\t0.001245282\t82512.0\n24513\t-108.715455\t42.490162\tAtlantic City CDP\tWY\tWyoming\tFremont County\t42\t42.5\t35.5\t4.5\t22363\t200000\t0.3148\t82520\tRomney\t82520\t0.000300585\t82520.0\n24514\t-108.39206000000001\t43.033353000000005\tRiverton city\tWY\tWyoming\tFremont County\t9761\t37.3\t17.4\t9.7\t21580\t152219\t0.3148\t82501\tRomney\t82501\t0.069857484\t82501.0\n24515\t-108.79946399999999\t42.915712\tBoulder Flats CDP\tWY\tWyoming\tFremont County\t413\t28.4\t9.3\t21.7\t11143\t125000\t0.3148\t82514\tRomney\t82514\t0.0029557570000000003\t82514.0\n24516\t-108.102593\t43.237541\tShoshoni town\tWY\tWyoming\tFremont County\t687\t45.5\t35.4\t4.5\t22307\t176786\t0.3148\t82649\tRomney\t82649\t0.004916719\t82649.0\n24517\t-108.45701399999999\t42.985831\tArapahoe CDP\tWY\tWyoming\tFremont County\t1906\t24.8\t5.5\t29.5\t9879\t87800\t0.3148\t82501\tRomney\t82501\t0.013640853\t82501.0\n24518\t-108.68993700000001\t43.243654\tPavillion town\tWY\tWyoming\tFremont County\t178\t43.6\t15.4\t6.6\t20234\t191667\t0.3148\t825HH\tRomney\t825HH\t0.00127391\t0.0\n24519\t-108.581974\t42.902561\tHudson town\tWY\tWyoming\tFremont County\t474\t48.0\t28.2\t8.1\t22076\t177679\t0.3148\t82515\tRomney\t82515\t0.003392321\t82515.0\n24520\t-108.695548\t43.111818\tJohnstown CDP\tWY\tWyoming\tFremont County\t291\t43.2\t18.7\t7.2\t20317\t179167\t0.3148\t825HH\tRomney\t825HH\t0.002082628\t0.0\n24521\t-109.64403200000001\t43.536596\tDubois town\tWY\tWyoming\tFremont County\t1040\t51.6\t24.7\t7.2\t22815\t245313\t0.3148\t82513\tRomney\t82513\t0.007443068000000001\t82513.0\n24522\t-107.82541100000002\t42.480759\tJeffrey City CDP\tWY\tWyoming\tFremont County\t115\t45.4\t35.8\t5.1\t22249\t175000\t0.3148\t82310\tRomney\t82310\t0.000823032\t82310.0\n24523\t-108.729422\t42.830156\tLander city\tWY\tWyoming\tFremont County\t7416\t44.3\t28.6\t6.0\t23845\t179848\t0.3148\t82520\tRomney\t82520\t0.053074798\t82520.0\n24524\t-108.72320800000001\t43.000844\tEthete CDP\tWY\tWyoming\tFremont County\t1576\t26.4\t8.3\t26.4\t9844\t122826\t0.3148\t82510\tRomney\t82510\t0.01127911\t82510.0\n24525\t-104.295152\t41.917353000000006\tYoder town\tWY\tWyoming\tGoshen County\t159\t37.8\t26.5\t11.6\t17896\t225000\t0.2511\t82244\tRomney\t82244\t0.001137931\t82244.0\n24526\t-104.386003\t41.962584\tVeteran CDP\tWY\tWyoming\tGoshen County\t26\t38.8\t15.0\t0.0\t19498\t175000\t0.2511\t82243\tRomney\t82243\t0.00018607700000000001\t82243.0\n24527\t-104.17376800000001\t42.064945\tTorrington city\tWY\tWyoming\tGoshen County\t5638\t43.4\t20.3\t8.2\t22399\t128724\t0.2511\t82240\tRomney\t82240\t0.040350015\t82240.0\n24528\t-104.346092\t42.138696\tLingle town\tWY\tWyoming\tGoshen County\t484\t44.9\t18.9\t10.0\t19111\t148864\t0.2511\t82223\tRomney\t82223\t0.0034638890000000004\t82223.0\n24529\t-104.26521\t41.785394000000004\tHawk Springs CDP\tWY\tWyoming\tGoshen County\t65\t37.5\t25.0\t11.4\t17892\t187500\t0.2511\t82217\tRomney\t82217\t0.00046519199999999996\t82217.0\n24530\t-104.517748\t42.213351\tFort Laramie town\tWY\tWyoming\tGoshen County\t229\t49.4\t28.9\t10.0\t19519\t130000\t0.2511\t82212\tRomney\t82212\t0.001638906\t82212.0\n24531\t-104.144032\t41.931582\tHuntley CDP\tWY\tWyoming\tGoshen County\t20\t46.3\t13.3\t0.0\t19051\t162500\t0.2511\t82218\tRomney\t82218\t0.000143136\t82218.0\n24532\t-104.163452\t41.6392\tLa Grange town\tWY\tWyoming\tGoshen County\t313\t38.2\t25.9\t11.2\t17864\t237500\t0.2511\t82221\tRomney\t82221\t0.002240077\t82221.0\n24533\t-108.18726399999998\t43.713553000000005\tLucerne CDP\tWY\tWyoming\tHot Springs County\t521\t52.3\t19.6\t2.9\t21714\t148333\t0.20800000000000002\t82430\tRomney\t82430\t0.0037286909999999997\t82430.0\n24534\t-108.18044099999999\t43.803826\tKirby town\tWY\tWyoming\tHot Springs County\t57\t53.8\t20.5\t3.3\t21580\t162500\t0.20800000000000002\t82430\tRomney\t82430\t0.000407937\t82430.0\n24535\t-108.56773899999999\t43.781819\tOwl Creek CDP\tWY\tWyoming\tHot Springs County\t11\t56.3\t22.2\t0.0\t21697\t0\t0.20800000000000002\t82443\tRomney\t82443\t7.87e-05\t82443.0\n24536\t-108.214049\t43.647882\tThermopolis town\tWY\tWyoming\tHot Springs County\t2990\t46.6\t17.8\t3.1\t22172\t121578\t0.20800000000000002\t82443\tRomney\t82443\t0.02139882\t82443.0\n24537\t-108.19803200000001\t43.644149\tEast Thermopolis town\tWY\tWyoming\tHot Springs County\t272\t52.2\t19.3\t2.8\t21707\t143182\t0.20800000000000002\t82443\tRomney\t82443\t0.0019466479999999998\t82443.0\n24538\t-106.715255\t44.342512\tBuffalo city\tWY\tWyoming\tJohnson County\t4529\t48.4\t24.2\t10.5\t23130\t195973\t0.1759\t82834\tRomney\t82834\t0.032413128\t82834.0\n24539\t-106.63796200000002\t43.709868\tKaycee town\tWY\tWyoming\tJohnson County\t254\t44.9\t22.2\t2.9\t23955\t216071\t0.1759\t82639\tRomney\t82639\t0.001817826\t82639.0\n24540\t-104.359039\t41.190892\tBurns town\tWY\tWyoming\tLaramie County\t322\t39.8\t18.1\t5.9\t19805\t125000\t0.3619\t82053\tRomney\t82053\t0.002304488\t82053.0\n24541\t-104.86203400000001\t41.148616\tWarren AFB CDP\tWY\tWyoming\tLaramie County\t4689\t24.9\t28.9\t3.2\t15694\t175000\t0.3619\t82001\tRomney\t82001\t0.033558216\t82001.0\n24542\t-104.773106\t41.218090000000004\tRanchettes CDP\tWY\tWyoming\tLaramie County\t7066\t44.2\t32.9\t5.7\t32265\t257633\t0.3619\t82001\tRomney\t82001\t0.05056992\t82001.0\n24543\t-104.06914499999999\t41.180378000000005\tPine Bluffs town\tWY\tWyoming\tLaramie County\t1272\t43.5\t16.9\t5.3\t20327\t130183\t0.3619\t82082\tRomney\t82082\t0.009103444\t82082.0\n24544\t-104.100959\t41.417051\tAlbin town\tWY\tWyoming\tLaramie County\t136\t39.3\t18.7\t5.6\t19737\t120000\t0.3619\t82050\tRomney\t82050\t0.0009733239999999999\t82050.0\n24545\t-104.806459\t41.094895\tSouth Greeley CDP\tWY\tWyoming\tLaramie County\t4434\t31.0\t11.0\t11.8\t18344\t74236\t0.3619\t82007\tRomney\t82007\t0.031733233\t82007.0\n24546\t-104.802882\t41.148064\tCheyenne city\tWY\tWyoming\tLaramie County\t55688\t38.3\t25.5\t8.5\t25850\t163414\t0.3619\t82001\tRomney\t82001\t0.398547648\t82001.0\n24547\t-104.78550200000001\t41.111872\tFox Farm-College CDP\tWY\tWyoming\tLaramie County\t3503\t31.9\t9.0\t10.8\t18723\t55727\t0.3619\t82007\tRomney\t82007\t0.025070256000000003\t82007.0\n24548\t-110.932428\t42.731105\tAfton town\tWY\tWyoming\tLincoln County\t2252\t34.1\t23.6\t4.2\t17852\t184375\t0.1493\t83110\tRomney\t83110\t0.016117104\t83110.0\n24549\t-110.91960300000001\t42.619089\tSmoot CDP\tWY\tWyoming\tLincoln County\t227\t28.5\t15.9\t4.9\t14227\t187500\t0.1493\t83126\tRomney\t83126\t0.001624593\t83126.0\n24550\t-111.01353999999999\t42.794506\tAuburn CDP\tWY\tWyoming\tLincoln County\t340\t31.3\t15.0\t6.9\t15460\t183333\t0.1493\t83111\tRomney\t83111\t0.002433311\t83111.0\n24551\t-110.95531299999999\t42.083932\tCokeville town\tWY\tWyoming\tLincoln County\t621\t38.5\t13.8\t2.9\t17971\t148864\t0.1493\t83114\tRomney\t83114\t0.00444437\t83114.0\n24552\t-110.55570300000001\t41.777048\tKemmerer city\tWY\tWyoming\tLincoln County\t2682\t41.9\t17.9\t5.0\t23723\t132298\t0.1493\t83116\tRomney\t83116\t0.019194526\t83116.0\n24553\t-111.01761599999999\t43.161359000000004\tAlpine town\tWY\tWyoming\tLincoln County\t677\t49.3\t18.1\t8.7\t24893\t273438\t0.1493\t83128\tRomney\t83128\t0.004845151\t83128.0\n24554\t-111.007847\t43.19437\tAlpine Northeast CDP\tWY\tWyoming\tLincoln County\t104\t50.3\t16.9\t9.1\t25023\t283333\t0.1493\t83128\tRomney\t83128\t0.0007443069999999999\t83128.0\n24555\t-111.03326299999999\t43.180528\tAlpine Northwest CDP\tWY\tWyoming\tLincoln County\t191\t50.4\t17.4\t8.6\t25013\t277083\t0.1493\t83128\tRomney\t83128\t0.001366948\t83128.0\n24556\t-111.01296699999999\t43.033273\tEtna CDP\tWY\tWyoming\tLincoln County\t145\t47.0\t20.2\t9.5\t24625\t275000\t0.1493\t83118\tRomney\t83118\t0.001037735\t83118.0\n24557\t-110.527969\t41.752072999999996\tOakley CDP\tWY\tWyoming\tLincoln County\t19\t38.8\t23.1\t9.1\t23050\t143750\t0.1493\t83116\tRomney\t83116\t0.000135979\t83116.0\n24558\t-110.324316\t41.768522999999995\tOpal town\tWY\tWyoming\tLincoln County\t125\t41.3\t15.5\t6.9\t20477\t112500\t0.1493\t83124\tRomney\t83124\t0.0008945989999999999\t83124.0\n24559\t-110.989931\t42.070233\tTaylor CDP\tWY\tWyoming\tLincoln County\t110\t38.5\t13.2\t2.1\t18037\t150000\t0.1493\t83114\tRomney\t83114\t0.000787248\t83114.0\n24560\t-110.062583\t41.997223999999996\tFontenelle CDP\tWY\tWyoming\tLincoln County\t23\t27.5\t14.3\t9.1\t20749\t112500\t0.1493\t831XX\tRomney\t831XX\t0.00016460599999999998\t0.0\n24561\t-110.929498\t42.794641999999996\tGrover CDP\tWY\tWyoming\tLincoln County\t169\t31.3\t15.7\t6.9\t15469\t185000\t0.1493\t83122\tRomney\t83122\t0.001209498\t83122.0\n24562\t-111.002375\t42.921009999999995\tThayne town\tWY\tWyoming\tLincoln County\t438\t36.1\t14.3\t5.0\t18233\t200000\t0.1493\t83127\tRomney\t83127\t0.003134677\t83127.0\n24563\t-110.196976\t42.261102\tLa Barge town\tWY\tWyoming\tLincoln County\t528\t39.5\t15.1\t7.3\t20491\t113235\t0.1493\t83123\tRomney\t83123\t0.003778788\t83123.0\n24564\t-110.927423\t42.90077\tBedford CDP\tWY\tWyoming\tLincoln County\t198\t36.4\t14.5\t4.9\t18232\t200000\t0.1493\t83112\tRomney\t83112\t0.0014170460000000001\t83112.0\n24565\t-110.90083600000001\t42.859608\tTurnerville CDP\tWY\tWyoming\tLincoln County\t205\t35.7\t13.9\t4.8\t17858\t197500\t0.1493\t83112\tRomney\t83112\t0.001467143\t83112.0\n24566\t-110.98635700000001\t42.687267999999996\tFairview CDP\tWY\tWyoming\tLincoln County\t387\t28.2\t16.0\t4.6\t14225\t187500\t0.1493\t83119\tRomney\t83119\t0.00276968\t83119.0\n24567\t-110.53600300000001\t41.776792\tDiamondville town\tWY\tWyoming\tLincoln County\t714\t39.8\t21.3\t4.7\t24188\t139167\t0.1493\t83116\tRomney\t83116\t0.005109952\t83116.0\n24568\t-110.954163\t42.97798\tStar Valley Ranch CDP\tWY\tWyoming\tLincoln County\t1264\t47.6\t19.9\t9.3\t24701\t271484\t0.1493\t83127\tRomney\t83127\t0.00904619\t83127.0\n24569\t-106.71775900000002\t42.556838\tAlcova CDP\tWY\tWyoming\tNatrona County\t23\t35.0\t17.6\t16.7\t24794\t275000\t0.2768\t82604\tRomney\t82604\t0.00016460599999999998\t82604.0\n24570\t-106.323899\t42.844446999999995\tCasper city\tWY\tWyoming\tNatrona County\t53673\t37.5\t23.4\t7.1\t25066\t166161\t0.2768\t82644\tRomney\t82644\t0.384126704\t82644.0\n24571\t-106.433706\t42.805014\tRed Butte CDP\tWY\tWyoming\tNatrona County\t544\t32.8\t19.3\t6.7\t23592\t161875\t0.2768\t82644\tRomney\t82644\t0.003893297\t82644.0\n24572\t-106.25889199999999\t42.87216\tEvansville town\tWY\tWyoming\tNatrona County\t2669\t29.6\t7.8\t12.6\t16244\t101149\t0.2768\t826HH\tRomney\t826HH\t0.019101488\t0.0\n24573\t-106.321044\t42.744886\tCasper Mountain CDP\tWY\tWyoming\tNatrona County\t371\t45.6\t20.3\t6.5\t26513\t300000\t0.2768\t82644\tRomney\t82644\t0.0026551709999999996\t82644.0\n24574\t-106.24771299999999\t43.414118\tEdgerton town\tWY\tWyoming\tNatrona County\t187\t41.2\t15.5\t7.8\t21695\t103125\t0.2768\t82635\tRomney\t82635\t0.001338321\t82635.0\n24575\t-106.37853899999999\t42.84539\tMills town\tWY\tWyoming\tNatrona County\t2802\t41.1\t5.1\t11.6\t19009\t89583\t0.2768\t82644\tRomney\t82644\t0.020053342\t82644.0\n24576\t-106.52358400000001\t42.757902\tBessemer Bend CDP\tWY\tWyoming\tNatrona County\t199\t41.2\t16.4\t13.4\t24329\t191667\t0.2768\t82604\tRomney\t82604\t0.001424202\t82604.0\n24577\t-106.37111200000001\t42.984976\tHoma Hills CDP\tWY\tWyoming\tNatrona County\t301\t33.0\t4.7\t11.7\t16519\t125781\t0.2768\t82601\tRomney\t82601\t0.002154196\t82601.0\n24578\t-106.31198799999999\t43.081398\tAntelope Hills CDP\tWY\tWyoming\tNatrona County\t98\t41.3\t14.9\t7.5\t21583\t85000\t0.2768\t82601\tRomney\t82601\t0.000701366\t82601.0\n24579\t-106.34936\t42.883906\tHartrandt CDP\tWY\tWyoming\tNatrona County\t889\t33.1\t5.1\t11.8\t16518\t125000\t0.2768\t82644\tRomney\t82644\t0.006362392\t82644.0\n24580\t-106.234705\t42.861496\tBrookhurst CDP\tWY\tWyoming\tNatrona County\t195\t45.5\t20.3\t6.6\t26507\t302778\t0.2768\t826HH\tRomney\t826HH\t0.001395575\t0.0\n24581\t-106.09543700000002\t42.859263\tMeadow Acres CDP\tWY\tWyoming\tNatrona County\t197\t45.4\t20.5\t6.5\t26519\t302778\t0.2768\t82636\tRomney\t82636\t0.0014098889999999999\t82636.0\n24582\t-106.993187\t43.049009000000005\tPowder River CDP\tWY\tWyoming\tNatrona County\t60\t43.5\t16.7\t13.8\t24236\t216667\t0.2768\t82620\tRomney\t82620\t0.00042940800000000005\t82620.0\n24583\t-106.34761999999999\t42.92216\tBar Nunn town\tWY\tWyoming\tNatrona County\t1842\t33.2\t5.1\t11.9\t16516\t125294\t0.2768\t82601\tRomney\t82601\t0.013182818\t82601.0\n24584\t-106.411302\t42.868377\tMountain View CDP\tWY\tWyoming\tNatrona County\t112\t38.8\t10.5\t12.5\t22003\t118750\t0.2768\t82644\tRomney\t82644\t0.000801561\t82644.0\n24585\t-106.27708200000001\t43.411112\tMidwest town\tWY\tWyoming\tNatrona County\t452\t41.7\t15.7\t7.7\t21680\t97500\t0.2768\t82635\tRomney\t82635\t0.003234872\t82635.0\n24586\t-106.435965\t42.861945\tVista West CDP\tWY\tWyoming\tNatrona County\t1064\t42.9\t26.9\t0.6\t26464\t273125\t0.2768\t82644\tRomney\t82644\t0.007614831\t82644.0\n24587\t-104.45753\t42.761697999999996\tLusk town\tWY\tWyoming\tNiobrara County\t1522\t42.4\t14.6\t5.8\t19746\t101411\t0.1567\t82219\tRomney\t82219\t0.010892643\t82219.0\n24588\t-104.09123100000001\t42.66427\tVan Tassell town\tWY\tWyoming\tNiobrara County\t18\t55.0\t14.3\t0.0\t21273\t875000\t0.1567\t82242\tRomney\t82242\t0.000128822\t82242.0\n24589\t-104.662176\t43.041019\tLance Creek CDP\tWY\tWyoming\tNiobrara County\t51\t49.5\t18.4\t3.3\t21256\t350000\t0.1567\t82222\tRomney\t82222\t0.000364997\t82222.0\n24590\t-104.61748399999999\t42.779394\tManville town\tWY\tWyoming\tNiobrara County\t101\t49.2\t17.3\t1.7\t21253\t275000\t0.1567\t82227\tRomney\t82227\t0.000722836\t82227.0\n24591\t-109.05503200000001\t44.518777\tCody city\tWY\tWyoming\tPark County\t9769\t42.3\t24.3\t5.7\t23312\t191050\t0.2004\t82414\tRomney\t82414\t0.069914739\t82414.0\n24592\t-108.75776699999999\t44.755612\tPowell city\tWY\tWyoming\tPark County\t5487\t35.8\t23.5\t5.8\t20675\t147491\t0.2004\t82440\tRomney\t82440\t0.039269339\t82440.0\n24593\t-108.882446\t44.708479\tRalston CDP\tWY\tWyoming\tPark County\t252\t42.5\t20.0\t6.2\t22067\t215909\t0.2004\t82440\tRomney\t82440\t0.0018035129999999999\t82440.0\n24594\t-108.655699\t44.777213\tGarland CDP\tWY\tWyoming\tPark County\t104\t42.2\t17.4\t9.5\t20766\t225000\t0.2004\t82412\tRomney\t82412\t0.0007443069999999999\t82412.0\n24595\t-108.862544\t44.154476\tMeeteetse town\tWY\tWyoming\tPark County\t409\t46.6\t21.6\t6.6\t19415\t167361\t0.2004\t82433\tRomney\t82433\t0.00292713\t82433.0\n24596\t-104.82289499999999\t41.755771\tChugwater town\tWY\tWyoming\tPlatte County\t251\t42.0\t20.7\t3.3\t20635\t135000\t0.2699\t82210\tRomney\t82210\t0.001796356\t82210.0\n24597\t-104.744741\t42.268568\tGuernsey town\tWY\tWyoming\tPlatte County\t941\t44.6\t13.0\t10.3\t18222\t98684\t0.2699\t82214\tRomney\t82214\t0.006734545\t82214.0\n24598\t-105.025501\t42.504205\tGlendo town\tWY\tWyoming\tPlatte County\t193\t48.4\t11.2\t9.4\t19059\t106250\t0.2699\t82213\tRomney\t82213\t0.001381262\t82213.0\n24599\t-104.960173\t42.052155\tWheatland town\tWY\tWyoming\tPlatte County\t3601\t44.8\t16.2\t7.1\t23173\t129695\t0.2699\t82201\tRomney\t82201\t0.025771622\t82201.0\n24600\t-104.90836000000002\t42.053416\tChugcreek CDP\tWY\tWyoming\tPlatte County\t135\t44.3\t14.4\t8.3\t22077\t153125\t0.2699\t82201\tRomney\t82201\t0.000966167\t82201.0\n24601\t-104.92321499999998\t42.035158\tY-O Ranch CDP\tWY\tWyoming\tPlatte County\t247\t43.5\t14.2\t8.4\t22130\t148214\t0.2699\t82201\tRomney\t82201\t0.001767729\t82201.0\n24602\t-104.958698\t42.097072999999995\tLakeview North CDP\tWY\tWyoming\tPlatte County\t79\t43.1\t14.5\t9.5\t22026\t158333\t0.2699\t82201\tRomney\t82201\t0.000565387\t82201.0\n24603\t-105.07172800000001\t42.0606\tWestview Circle CDP\tWY\tWyoming\tPlatte County\t64\t42.0\t13.6\t9.1\t22046\t287500\t0.2699\t82201\tRomney\t82201\t0.000458035\t82201.0\n24604\t-104.78869399999999\t41.877721\tSlater CDP\tWY\tWyoming\tPlatte County\t84\t42.9\t20.3\t2.5\t20731\t137500\t0.2699\t82210\tRomney\t82210\t0.000601171\t82210.0\n24605\t-104.72476\t42.327496999999994\tHartville town\tWY\tWyoming\tPlatte County\t64\t50.4\t10.6\t10.7\t19086\t106250\t0.2699\t82215\tRomney\t82215\t0.000458035\t82215.0\n24606\t-107.16543700000001\t44.907985\tRanchester town\tWY\tWyoming\tSheridan County\t808\t44.6\t21.9\t9.2\t21284\t196667\t0.2526\t82839\tRomney\t82839\t0.0057826909999999995\t82839.0\n24607\t-106.381115\t44.64001\tClearmont town\tWY\tWyoming\tSheridan County\t130\t49.4\t20.0\t3.9\t23103\t240000\t0.2526\t82835\tRomney\t82835\t0.000930383\t82835.0\n24608\t-106.14236499999998\t44.660604\tArvada CDP\tWY\tWyoming\tSheridan County\t37\t46.3\t20.7\t4.5\t23244\t262500\t0.2526\t82831\tRomney\t82831\t0.000264801\t82831.0\n24609\t-106.973823\t44.671141999999996\tBig Horn CDP\tWY\tWyoming\tSheridan County\t228\t43.1\t23.8\t7.2\t25240\t292308\t0.2526\t82842\tRomney\t82842\t0.001631749\t82842.0\n24610\t-107.306175\t44.948093\tParkman CDP\tWY\tWyoming\tSheridan County\t160\t44.2\t21.6\t4.9\t20379\t187500\t0.2526\t82838\tRomney\t82838\t0.001145087\t82838.0\n24611\t-107.263196\t44.87362\tDayton town\tWY\tWyoming\tSheridan County\t794\t43.7\t21.9\t5.2\t20280\t185268\t0.2526\t82844\tRomney\t82844\t0.0056824959999999996\t82844.0\n24612\t-106.92191399999999\t44.577806\tStory CDP\tWY\tWyoming\tSheridan County\t1065\t52.3\t30.9\t10.5\t24592\t265500\t0.2526\t82842\tRomney\t82842\t0.0076219880000000005\t82842.0\n24613\t-106.95993600000001\t44.798119\tSheridan city\tWY\tWyoming\tSheridan County\t16823\t41.7\t21.4\t6.7\t23734\t168607\t0.2526\t82801\tRomney\t82801\t0.120398777\t82801.0\n24614\t-109.98987\t42.95593\tCora CDP\tWY\tWyoming\tSublette County\t109\t49.3\t26.5\t3.8\t24158\t295833\t0.1753\t82925\tRomney\t82925\t0.000780091\t82925.0\n24615\t-110.10106599999999\t42.556571999999996\tMarbleton town\tWY\tWyoming\tSublette County\t929\t37.6\t13.2\t4.3\t20958\t171484\t0.1753\t83113\tRomney\t83113\t0.006648663000000001\t83113.0\n24616\t-110.405084\t43.204665999999996\tBondurant CDP\tWY\tWyoming\tSublette County\t214\t49.5\t26.2\t3.8\t24156\t292500\t0.1753\t82922\tRomney\t82922\t0.0015315539999999999\t82922.0\n24617\t-109.866022\t42.866499\tPinedale town\tWY\tWyoming\tSublette County\t1933\t46.4\t26.1\t3.7\t23726\t282468\t0.1753\t82941\tRomney\t82941\t0.013834086\t82941.0\n24618\t-110.282656\t42.290562\tCalpet CDP\tWY\tWyoming\tSublette County\t9\t52.5\t28.6\t0.0\t22964\t0\t0.1753\t83123\tRomney\t83123\t6.440000000000001e-05\t83123.0\n24619\t-110.130377\t42.539804\tBig Piney town\tWY\tWyoming\tSublette County\t483\t37.3\t13.5\t4.3\t20956\t170833\t0.1753\t83113\tRomney\t83113\t0.003456732\t83113.0\n24620\t-109.71093400000001\t42.752409\tBoulder CDP\tWY\tWyoming\tSublette County\t51\t43.1\t25.7\t2.8\t23337\t300000\t0.1753\t82923\tRomney\t82923\t0.000364997\t82923.0\n24621\t-110.07523799999998\t42.866127\tDaniel CDP\tWY\tWyoming\tSublette County\t122\t49.0\t25.8\t3.4\t24151\t295833\t0.1753\t83115\tRomney\t83115\t0.0008731289999999999\t83115.0\n24622\t-109.96271100000001\t41.59682\tGranger town\tWY\tWyoming\tSweetwater County\t180\t38.1\t13.8\t9.5\t21658\t135417\t0.2826\t82934\tRomney\t82934\t0.001288223\t82934.0\n24623\t-109.759126\t41.016901000000004\tWasham CDP\tWY\tWyoming\tSweetwater County\t47\t39.2\t20.6\t8.0\t24462\t243750\t0.2826\t82938\tRomney\t82938\t0.000336369\t82938.0\n24624\t-109.278267\t41.664883\tNorth Rock Springs CDP\tWY\tWyoming\tSweetwater County\t2147\t35.7\t13.0\t3.6\t24458\t190698\t0.2826\t82943\tRomney\t82943\t0.015365641000000001\t82943.0\n24625\t-109.55493700000001\t41.567293\tJames Town CDP\tWY\tWyoming\tSweetwater County\t667\t38.5\t14.3\t8.8\t22315\t141848\t0.2826\t82935\tRomney\t82935\t0.004773583\t82935.0\n24626\t-109.01018300000001\t41.48196\tSweeney Ranch CDP\tWY\tWyoming\tSweetwater County\t16\t40.0\t20.0\t9.1\t25399\t162500\t0.2826\t82901\tRomney\t82901\t0.000114509\t82901.0\n24627\t-108.964289\t41.759384000000004\tSuperior town\tWY\tWyoming\tSweetwater County\t291\t43.0\t24.5\t6.5\t23484\t103750\t0.2826\t82945\tRomney\t82945\t0.002082628\t82945.0\n24628\t-109.27999799999999\t41.584323\tClearview Acres CDP\tWY\tWyoming\tSweetwater County\t959\t36.2\t19.6\t6.4\t24054\t212879\t0.2826\t82901\tRomney\t82901\t0.0068633669999999996\t82901.0\n24629\t-109.850501\t41.55442\tLittle America CDP\tWY\tWyoming\tSweetwater County\t69\t37.5\t14.6\t8.3\t21660\t125000\t0.2826\t82929\tRomney\t82929\t0.000493819\t82929.0\n24630\t-109.15531200000001\t41.509407\tArrowhead Springs CDP\tWY\tWyoming\tSweetwater County\t63\t38.1\t20.0\t7.1\t25824\t162500\t0.2826\t82901\tRomney\t82901\t0.00045087800000000004\t82901.0\n24631\t-109.422858\t42.185219000000004\tFarson CDP\tWY\tWyoming\tSweetwater County\t289\t42.7\t24.6\t6.6\t23460\t101136\t0.2826\t82932\tRomney\t82932\t0.002068314\t82932.0\n24632\t-109.880196\t41.029205\tMcKinnon CDP\tWY\tWyoming\tSweetwater County\t53\t39.4\t18.9\t7.1\t24710\t243750\t0.2826\t82936\tRomney\t82936\t0.00037931\t82936.0\n24633\t-109.348565\t41.541683\tPurple Sage CDP\tWY\tWyoming\tSweetwater County\t452\t28.9\t5.8\t8.8\t23050\t112500\t0.2826\t82901\tRomney\t82901\t0.003234872\t82901.0\n24634\t-109.238076\t41.596115999999995\tRock Springs city\tWY\tWyoming\tSweetwater County\t20660\t35.3\t18.5\t7.6\t26186\t170424\t0.2826\t82901\tRomney\t82901\t0.147859402\t82901.0\n24635\t-108.794642\t41.681026\tPoint of Rocks CDP\tWY\tWyoming\tSweetwater County\t4\t0.0\t33.3\t0.0\t21366\t0\t0.2826\t82942\tRomney\t82942\t2.8600000000000004e-05\t82942.0\n24636\t-108.371404\t41.624217\tTable Rock CDP\tWY\tWyoming\tSweetwater County\t76\t38.0\t18.9\t7.8\t25817\t154167\t0.2826\t82336\tRomney\t82336\t0.000543916\t82336.0\n24637\t-109.44076499999998\t42.064067\tEden CDP\tWY\tWyoming\tSweetwater County\t464\t43.2\t24.6\t6.7\t23426\t103125\t0.2826\t82932\tRomney\t82932\t0.003320753\t82932.0\n24638\t-109.46980400000001\t41.515005\tGreen River city\tWY\tWyoming\tSweetwater County\t12441\t34.2\t18.2\t7.3\t25534\t178670\t0.2826\t82935\tRomney\t82935\t0.089037697\t82935.0\n24639\t-107.977942\t41.668667\tWamsutter town\tWY\tWyoming\tSweetwater County\t242\t38.6\t18.9\t7.4\t25800\t147500\t0.2826\t82336\tRomney\t82336\t0.001731945\t82336.0\n24640\t-107.558201\t42.238603999999995\tBairoil town\tWY\tWyoming\tSweetwater County\t116\t42.5\t24.1\t6.1\t23412\t97500\t0.2826\t82322\tRomney\t82322\t0.000830188\t82322.0\n24641\t-109.196249\t41.659327000000005\tReliance CDP\tWY\tWyoming\tSweetwater County\t720\t33.2\t3.7\t13.9\t23208\t71316\t0.2826\t82943\tRomney\t82943\t0.0051528929999999995\t82943.0\n24642\t-110.79233500000001\t43.432021999999996\tRafter J Ranch CDP\tWY\tWyoming\tTeton County\t1340\t40.0\t38.1\t0.0\t35898\t463571\t0.542\t83001\tRomney\t83001\t0.009590106\t83001.0\n24643\t-110.84396000000001\t43.59318\tTeton Village CDP\tWY\tWyoming\tTeton County\t205\t48.1\t63.7\t3.7\t57536\t1000001\t0.542\t830HH\tRomney\t830HH\t0.001467143\t0.0\n24644\t-110.771289\t43.472207\tJackson town\tWY\tWyoming\tTeton County\t9961\t34.6\t42.2\t4.3\t38791\t441528\t0.542\t83001\tRomney\t83001\t0.071288844\t83001.0\n24645\t-110.95333600000001\t43.744553\tAlta CDP\tWY\tWyoming\tTeton County\t470\t48.2\t63.4\t3.5\t57358\t1000001\t0.542\t83012\tRomney\t83012\t0.0033636940000000004\t83012.0\n24646\t-110.752201\t43.338359000000004\tHoback CDP\tWY\tWyoming\tTeton County\t1618\t43.5\t37.3\t4.9\t44225\t606618\t0.542\t83001\tRomney\t83001\t0.011579696\t83001.0\n24647\t-110.799667\t43.424033\tSouth Park CDP\tWY\tWyoming\tTeton County\t1017\t40.1\t38.0\t0.0\t35910\t466667\t0.542\t83001\tRomney\t83001\t0.007278461\t83001.0\n24648\t-110.833777\t43.531464\tMoose Wilson Road CDP\tWY\tWyoming\tTeton County\t1757\t41.9\t62.2\t7.9\t68421\t1000001\t0.542\t83014\tRomney\t83014\t0.01257449\t83014.0\n24649\t-110.89423899999998\t43.486093\tWilson CDP\tWY\tWyoming\tTeton County\t1506\t43.0\t57.9\t10.6\t71848\t957908\t0.542\t83014\tRomney\t83014\t0.010778135\t83014.0\n24650\t-110.429308\t41.440627\tCarter CDP\tWY\tWyoming\tUinta County\t9\t0.0\t14.3\t0.0\t19595\t175000\t0.1907\t82937\tRomney\t82937\t6.440000000000001e-05\t82937.0\n24651\t-110.296226\t41.327495\tLyman town\tWY\tWyoming\tUinta County\t2100\t30.5\t11.2\t5.8\t19569\t148624\t0.1907\t82939\tRomney\t82939\t0.015029271\t82939.0\n24652\t-110.96468700000001\t41.26032\tEvanston city\tWY\tWyoming\tUinta County\t12352\t29.9\t18.4\t8.7\t21558\t152336\t0.1907\t82930\tRomney\t82930\t0.08840074199999999\t82930.0\n24653\t-110.38933999999999\t41.318456\tFort Bridger CDP\tWY\tWyoming\tUinta County\t438\t36.4\t10.5\t7.0\t20032\t153472\t0.1907\t82933\tRomney\t82933\t0.003134677\t82933.0\n24654\t-110.33453300000001\t41.272027\tMountain View town\tWY\tWyoming\tUinta County\t1264\t35.1\t14.2\t7.5\t21410\t163710\t0.1907\t82939\tRomney\t82939\t0.00904619\t82939.0\n24655\t-110.427269\t41.181553\tRobertson CDP\tWY\tWyoming\tUinta County\t65\t33.8\t14.0\t8.3\t21279\t162500\t0.1907\t82939\tRomney\t82939\t0.00046519199999999996\t82939.0\n24656\t-110.153683\t41.027243\tLonetree CDP\tWY\tWyoming\tUinta County\t67\t35.6\t11.1\t7.9\t19977\t162500\t0.1907\t82936\tRomney\t82936\t0.000479505\t82936.0\n24657\t-108.044895\t43.972082\tMc Nutt CDP\tWY\tWyoming\tWashakie County\t285\t40.1\t21.4\t4.1\t22450\t179167\t0.2013\t82401\tRomney\t82401\t0.002039687\t82401.0\n24658\t-107.44805600000001\t44.034828999999995\tTen Sleep town\tWY\tWyoming\tWashakie County\t314\t46.5\t21.7\t6.4\t22093\t187500\t0.2013\t82442\tRomney\t82442\t0.002247234\t82442.0\n24659\t-107.911874\t44.092081\tWashakie Ten CDP\tWY\tWyoming\tWashakie County\t588\t42.4\t22.2\t10.2\t22830\t172321\t0.2013\t82401\tRomney\t82401\t0.004208196\t82401.0\n24660\t-108.014397\t43.93025\tSouth Flat CDP\tWY\tWyoming\tWashakie County\t384\t44.8\t19.6\t6.9\t21361\t177500\t0.2013\t82401\tRomney\t82401\t0.00274821\t82401.0\n24661\t-107.96019799999999\t44.016481\tWorland city\tWY\tWyoming\tWashakie County\t4891\t40.7\t17.6\t10.1\t22862\t124067\t0.2013\t82401\tRomney\t82401\t0.035003888999999996\t82401.0\n24662\t-107.996381\t44.097282\tWest River CDP\tWY\tWyoming\tWashakie County\t329\t39.7\t21.3\t4.1\t22452\t180357\t0.2013\t82401\tRomney\t82401\t0.002354586\t82401.0\n24663\t-107.94723\t43.99592\tAirport Road CDP\tWY\tWyoming\tWashakie County\t300\t36.1\t12.7\t8.1\t19171\t123214\t0.2013\t82401\tRomney\t82401\t0.002147039\t82401.0\n24664\t-108.12976200000001\t43.885385\tWinchester CDP\tWY\tWyoming\tWashakie County\t61\t40.0\t20.0\t3.2\t22628\t179167\t0.2013\t82430\tRomney\t82430\t0.000436565\t82430.0\n24665\t-104.151753\t43.81564\tHill View Heights CDP\tWY\tWyoming\tWeston County\t179\t43.4\t21.5\t5.3\t22781\t162500\t0.1256\t82701\tRomney\t82701\t0.001281066\t82701.0\n24666\t-104.426962\t43.985015999999995\tOsage CDP\tWY\tWyoming\tWeston County\t231\t43.7\t21.3\t5.1\t22861\t156944\t0.1256\t82723\tRomney\t82723\t0.00165322\t82723.0\n24667\t-104.219101\t43.850435\tNewcastle city\tWY\tWyoming\tWeston County\t3529\t43.3\t13.0\t6.6\t19835\t108239\t0.1256\t82701\tRomney\t82701\t0.025256333\t82701.0\n24668\t-104.624248\t44.100938\tUpton town\tWY\tWyoming\tWeston County\t910\t45.7\t14.6\t5.2\t19920\t121131\t0.1256\t82730\tRomney\t82730\t0.006512684\t82730.0"
  },
  {
    "path": "docs/sample-data/titanicmaster.tsv",
    "content": "Name\tClass\tJoined\tJob\tTicketCost\tAge\tGender\tSurvived\tDepartment\n\"ALLEN, Miss Elisabeth Walton\"\t1st Class Passenger\tSouthampton\t\t214.0375\t29\tFemale\tTrue\t\n\"ALLISON, Mr Hudson Joshua Creighton\"\t1st Class Passenger\tSouthampton\tBusinessman\t151.8\t30\tMale\tFalse\t\n\"ALLISON, Mrs Bessie Waldo\"\t1st Class Passenger\tSouthampton\t\t151.8\t25\tFemale\tFalse\t\n\"ALLISON, Miss Helen Loraine\"\t1st Class Passenger\tSouthampton\t\t151.8\t2\tFemale\tFalse\t\n\"ALLISON, Master Hudson Trevor\"\t1st Class Passenger\tSouthampton\t\t151.8\t0.916666667\tMale\tTrue\t\n\"ANDERSON, Mr Harry\"\t1st Class Passenger\tSouthampton\tStockbroker\t26.55\t47\tMale\tTrue\t\n\"ANDREWS, Miss Kornelia Theodosia\"\t1st Class Passenger\tCherbourg\t\t77.95833333\t62\tFemale\tTrue\t\n\"ANDREWS, Mr Thomas\"\t1st Class Passenger\tBelfast\tShipbuilder\t0\t39\tMale\tFalse\tH&W Guarantee Group\n\"APPLETON, Mrs Charlotte\"\t1st Class Passenger\tSouthampton\t\t51.47916667\t53\tFemale\tTrue\t\n\"ARTAGAVEYTIA, Mr Ramon\"\t1st Class Passenger\tCherbourg\tBusinessman\t49.50416667\t71\tMale\tFalse\t\n\"ASTOR, Colonel John Jacob\"\t1st Class Passenger\tCherbourg\tProperty Developer / Real Estate\t247.525\t47\tMale\tFalse\t\n\"ASTOR, Mrs Madeleine Talmage\"\t1st Class Passenger\tCherbourg\t\t247.525\t18\tFemale\tTrue\t\n\"AUBART, Mme. L�ontine Pauline\"\t1st Class Passenger\tCherbourg\tSinger\t69.3\t24\tMale\tTrue\t\n\"�STBY, Miss Helen Ragnhild\"\t1st Class Passenger\tSouthampton\t\t61.97916667\t22\tFemale\tTrue\t\n\"BARBER, Miss Ellen Mary\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t78.85\t26\tFemale\tTrue\tServant\n\"BARKWORTH, Mr Algernon Henry\"\t1st Class Passenger\tSouthampton\tJustice of the Peace\t30\t47\tMale\tTrue\t\n\"BASSANI, Mrs Albina\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t76.29166667\t32\tFemale\tTrue\tServant\n\"BAUMANN, Mr John D.\"\t1st Class Passenger\tCherbourg\tBusinessman\t25.925\t60\tMale\tFalse\t\n\"BAXTER, Mrs H�l�ne\"\t1st Class Passenger\tCherbourg\t\t247.5208333\t50\tFemale\tTrue\t\n\"BAXTER, Mr Quigg Edmond\"\t1st Class Passenger\tCherbourg\t\t247.5208333\t24\tMale\tFalse\t\n\"BEATTIE, Mr Thomson\"\t1st Class Passenger\tSouthampton\tLandowner\t75.24166667\t36\tMale\tFalse\t\n\"BECKWITH, Mr Richard Leonard\"\t1st Class Passenger\tSouthampton\t\t52.55416667\t37\tMale\tTrue\t\n\"BECKWITH, Mrs Sallie\"\t1st Class Passenger\tSouthampton\t\t52.55416667\t46\tFemale\tTrue\t\n\"BEHR, Mr Karl Howell\"\t1st Class Passenger\tCherbourg\t\t30\t26\tMale\tTrue\t\n\"BESSETTE, Miss Nellie Mayo\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t63.35833333\t39\tFemale\tTrue\tServant\n\"BIDOIS, Miss Rosalie\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t247.525\t46\tFemale\tTrue\tServant\n\"BIRD, Miss Ellen\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t221.7791667\t31\tFemale\tTrue\tServant\n\"BIRNBAUM, Mr Jakob\"\t1st Class Passenger\tCherbourg\t\t26\t24\tMale\tFalse\t\n\"BISHOP, Mr Dickinson H.\"\t1st Class Passenger\tCherbourg\t\t91.07916667\t25\tMale\tTrue\t\n\"BISHOP, Mrs Helen\"\t1st Class Passenger\tCherbourg\t\t91.07916667\t19\tFemale\tTrue\t\n\"BJ�RNSTR�M-STEFFANSSON, Mr Mauritz Hokan\"\t1st Class Passenger\tSouthampton\tBusinessman\t26.55\t28\tMale\tTrue\t\n\"BLACKWELL, Mr Stephen Weart\"\t1st Class Passenger\tSouthampton\t\t35.5\t45\tMale\tFalse\t\n\"BLANK, Mr Henry\"\t1st Class Passenger\tCherbourg\tJeweller\t31\t39\tMale\tTrue\t\n\"BONNELL, Miss Caroline\"\t1st Class Passenger\tSouthampton\t\t164.8666667\t30\tFemale\tTrue\t\n\"BONNELL, Miss Elizabeth\"\t1st Class Passenger\tSouthampton\t\t26.55\t61\tFemale\tTrue\t\n\"BOREBANK, Mr John James\"\t1st Class Passenger\tSouthampton\tProperty Developer / Real Estate\t26.55\t42\tMale\tFalse\t\n\"BOWEN, Miss Grace Scott\"\t1st Class Passenger\tCherbourg\tGoverness\t262.375\t45\tFemale\tTrue\tServant\n\"BOWERMAN, Miss Elsie Edith\"\t1st Class Passenger\tSouthampton\t\t55\t22\tFemale\tTrue\t\n\"BRADY, Mr John Bertram\"\t1st Class Passenger\tSouthampton\t\t30.5\t41\tMale\tFalse\t\n\"BRANDEIS, Mr Emil\"\t1st Class Passenger\tCherbourg\t\t50.49583333\t48\tMale\tFalse\t\n\"BRERETON, Mr George Andrew\"\t1st Class Passenger\tSouthampton\t\t26.55\t37\tMale\tTrue\t\n\"BREWE, Dr Arthur Jackson\"\t1st Class Passenger\tCherbourg\t\t39.6\t45\tMale\tFalse\t\n\"BROWN, Mrs Caroline Lane\"\t1st Class Passenger\tSouthampton\t\t51.47916667\t59\tFemale\tTrue\t\n\"BROWN, Mrs Margaret\"\t1st Class Passenger\tCherbourg\t\t27.72083333\t44\tFemale\tTrue\t\n\"BUCKNELL, Mrs Emma Eliza\"\t1st Class Passenger\tCherbourg\t\t76.29166667\t58\tFemale\tTrue\t\n\"BURNS, Miss Elizabeth Margaret\"\t1st Class Passenger\tCherbourg\tNursemaid\t134.5\t41\tFemale\tTrue\tServant\n\"BUTT, Major Archibald Willingham\"\t1st Class Passenger\tSouthampton\tMilitary\t26.55\t46\tMale\tFalse\t\n\"CAIRNS, Mr Alexander Milne\"\t1st Class Passenger\tSouthampton\tServant\t31\t28\tMale\tFalse\tServant\n\"CALDERHEAD, Mr Edward Pennington\"\t1st Class Passenger\tSouthampton\t\t26.2875\t42\tMale\tTrue\t\n\"CANDEE, Mrs Helen Churchill\"\t1st Class Passenger\tCherbourg\t\t27.44583333\t52\tFemale\tTrue\t\n\"CARDEZA, Mrs Charlotte Wardle\"\t1st Class Passenger\tCherbourg\t\t512.3291667\t58\tFemale\tTrue\t\n\"CARDEZA, Mr Thomas Drake Martinez\"\t1st Class Passenger\tCherbourg\tGentleman\t512.3291667\t36\tMale\tTrue\t\n\"CARLSSON, Mr Frans Olof\"\t1st Class Passenger\tSouthampton\t\t5\t33\tMale\tFalse\t\n\"CARRA�-ESTEVES, Mr Jos� Pedro\"\t1st Class Passenger\tSouthampton\t\t47.1\t17\tMale\tFalse\t\n\"CARRAU, Mr Francisco Mauro Severiano\"\t1st Class Passenger\tSouthampton\t\t47.1\t27\tMale\tFalse\t\n\"CARTER, Mr William Ernest\"\t1st Class Passenger\tSouthampton\t\t120\t36\tMale\tTrue\t\n\"CARTER, Mrs Lucile\"\t1st Class Passenger\tSouthampton\t\t120\t36\tFemale\tTrue\t\n\"CARTER, Miss Lucile Polk\"\t1st Class Passenger\tSouthampton\t\t120\t13\tFemale\tTrue\t\n\"CARTER, Master William Thornton II\"\t1st Class Passenger\tSouthampton\t\t120\t11\tMale\tTrue\t\n\"CASE, Mr Howard Brown\"\t1st Class Passenger\tSouthampton\t\t26\t49\tMale\tFalse\t\n\"CASSEBEER, Mrs Eleanor Genevieve\"\t1st Class Passenger\tCherbourg\t\t27.72083333\t36\tFemale\tTrue\t\n\"CAVENDISH, Mr Tyrell William\"\t1st Class Passenger\tSouthampton\t\t78.85\t36\tMale\tFalse\t\n\"CAVENDISH, Mrs Julia Florence\"\t1st Class Passenger\tSouthampton\t\t78.85\t25\tFemale\tTrue\t\n\"CHAFFEE, Mr Herbert Fuller\"\t1st Class Passenger\tSouthampton\t\t61.175\t46\tMale\tFalse\t\n\"CHAFFEE, Mrs Carrie Constance\"\t1st Class Passenger\tSouthampton\t\t61.175\t47\tFemale\tTrue\t\n\"CHAMBERS, Mr Norman Campbell\"\t1st Class Passenger\tSouthampton\t\t53.1\t27\tMale\tTrue\t\n\"CHAMBERS, Mrs Bertha\"\t1st Class Passenger\tSouthampton\t\t53.1\t32\tFemale\tTrue\t\n\"CHAUDANSON, Miss Victorine\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t262.375\t36\tFemale\tTrue\tServant\n\"CHERRY, Miss Gladys\"\t1st Class Passenger\tSouthampton\tOf Independent Means\t86.5\t30\tFemale\tTrue\t\n\"CHEVR�, Mr Paul Romaine Marie L�once\"\t1st Class Passenger\tCherbourg\tSculptor\t29.7\t45\tMale\tTrue\t\n\"CHIBNALL, Mrs Edith Martha Bowerman\"\t1st Class Passenger\tSouthampton\tOf Independent Means\t55\t48\tFemale\tTrue\t\n\"CHISHOLM, Mr Roderick Robert Crispin\"\t1st Class Passenger\tBelfast\tDraughtsman\t0\t43\tMale\tFalse\tH&W Guarantee Group\n\"CLARK, Mr Walter Miller\"\t1st Class Passenger\tCherbourg\t\t136.7791667\t27\tMale\tFalse\t\n\"CLARK, Mrs Virginia Estelle\"\t1st Class Passenger\tCherbourg\t\t136.7791667\t26\tFemale\tTrue\t\n\"CLEAVER, Miss Alice Catherine\"\t1st Class Passenger\tSouthampton\tNursemaid\t151.8\t22\tFemale\tTrue\tServant\n\"CLIFFORD, Mr George Quincy\"\t1st Class Passenger\tSouthampton\t\t52\t40\tMale\tFalse\t\n\"COLLEY, Mr Edward Pomeroy\"\t1st Class Passenger\tSouthampton\t\t25.5875\t37\tMale\tFalse\t\n\"COMPTON, Mrs Mary Eliza\"\t1st Class Passenger\tCherbourg\t\t83.15833333\t64\tFemale\tTrue\t\n\"COMPTON, Miss Sara Rebecca\"\t1st Class Passenger\tCherbourg\t\t83.15833333\t39\tFemale\tTrue\t\n\"COMPTON, Mr Alexander Taylor jr\"\t1st Class Passenger\tCherbourg\t\t83.15833333\t37\tMale\tFalse\t\n\"CORNELL, Mrs Malvina Helen\"\t1st Class Passenger\tSouthampton\t\t25.74166667\t55\tFemale\tTrue\t\n\"CRAFTON, Mr John Bertram\"\t1st Class Passenger\tSouthampton\tBusinessman\t26.55\t59\tMale\tFalse\t\n\"CROSBY, Captain Edward Gifford\"\t1st Class Passenger\tSouthampton\t\t71\t70\tMale\tFalse\t\n\"CROSBY, Mrs Catherine Elizabeth\"\t1st Class Passenger\tSouthampton\t\t71\t64\tFemale\tTrue\t\n\"CROSBY, Miss Harriette Rebecca\"\t1st Class Passenger\tSouthampton\t\t26.55\t39\tFemale\tTrue\t\n\"CUMINGS, Mr John Bradley\"\t1st Class Passenger\tCherbourg\t\t71.28333333\t39\tMale\tFalse\t\n\"CUMINGS, Mrs Florence Briggs\"\t1st Class Passenger\tCherbourg\t\t71.28333333\t35\tFemale\tTrue\t\n\"DALY, Mr Peter Dennis\"\t1st Class Passenger\tSouthampton\tBusinessman\t26.55\t51\tMale\tTrue\t\n\"DANIEL, Mr Robert Williams\"\t1st Class Passenger\tSouthampton\t\t30.5\t27\tMale\tTrue\t\n\"DANIELS, Miss Sarah Rebecca\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t151.8\t33\tFemale\tTrue\tServant\n\"DAVIDSON, Mr Thornton\"\t1st Class Passenger\tCherbourg\t\t52\t31\tMale\tFalse\t\n\"DAVIDSON, Mrs Orian\"\t1st Class Passenger\tCherbourg\t\t52\t27\tFemale\tTrue\t\n\"DICK, Mr Albert Adrian\"\t1st Class Passenger\tSouthampton\t\t57\t31\tMale\tTrue\t\n\"DICK, Mrs Vera\"\t1st Class Passenger\tSouthampton\t\t57\t17\tFemale\tTrue\t\n\"DODGE, Dr Washington\"\t1st Class Passenger\tSouthampton\tPolitician\t81.85833333\t52\tMale\tTrue\t\n\"DODGE, Mrs Ruth\"\t1st Class Passenger\tSouthampton\t\t81.85833333\t34\tFemale\tTrue\t\n\"DODGE, Master Washington\"\t1st Class Passenger\tSouthampton\t\t81.85833333\t4\tMale\tTrue\t\n\"DOUGLAS, Mr Walter Donald\"\t1st Class Passenger\tCherbourg\t\t106.425\t50\tFemale\tFalse\t\n\"DOUGLAS, Mrs Mahala\"\t1st Class Passenger\tCherbourg\t\t106.425\t48\tFemale\tTrue\t\n\"DOUGLAS, Mrs Mary H�l�ne\"\t1st Class Passenger\tCherbourg\t\t247.5208333\t27\tFemale\tTrue\t\n\"DUFF GORDON, Sir Cosmo Edmund\"\t1st Class Passenger\tCherbourg\tLandowner\t39.6\t49\tMale\tTrue\t\n\"DUFF GORDON, Lucy Christiana, Lady\"\t1st Class Passenger\tCherbourg\tDressmaker / Couturi?re\t56.92916667\t48\tFemale\tTrue\t\n\"DULLES, Mr William Crothers\"\t1st Class Passenger\tCherbourg\t\t29.7\t39\tMale\tFalse\t\n\"EARNSHAW, Mrs Olive\"\t1st Class Passenger\tCherbourg\tOf Independent Means\t83.15833333\t23\tFemale\tTrue\t\n\"ENDRES, Miss Caroline Louise\"\t1st Class Passenger\tCherbourg\tNurse\t247.525\t39\tFemale\tTrue\tServant\n\"EUSTIS, Miss Elizabeth Mussey\"\t1st Class Passenger\tCherbourg\t\t78.26666667\t54\tFemale\tTrue\t\n\"EVANS, Miss Edith Corse\"\t1st Class Passenger\tCherbourg\t\t31.67916667\t36\tFemale\tFalse\t\n\"FARTHING, Mr John\"\t1st Class Passenger\tSouthampton\tServant\t221.7791667\t57\tMale\tFalse\tServant\n\"FLEGENHEIM, Mrs Antoinette\"\t1st Class Passenger\tCherbourg\t\t31.68333333\t48\tFemale\tTrue\t\n\"FLEMING, Miss Margaret\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t110.8833333\t42\tFemale\tTrue\tServant\n\"FLYNN, Mr John Irwin\"\t1st Class Passenger\tSouthampton\t\t26.2875\t36\tMale\tTrue\t\n\"FOREMAN, Mr Benjamin Laventall\"\t1st Class Passenger\tSouthampton\t\t27.75\t30\tMale\tFalse\t\n\"FORTUNE, Mr Mark\"\t1st Class Passenger\tSouthampton\t\t263\t64\tMale\tFalse\t\n\"FORTUNE, Mrs Mary\"\t1st Class Passenger\tSouthampton\t\t263\t60\tFemale\tTrue\t\n\"FORTUNE, Miss Ethel Flora\"\t1st Class Passenger\tSouthampton\t\t263\t28\tFemale\tTrue\t\n\"FORTUNE, Miss Alice Elizabeth\"\t1st Class Passenger\tSouthampton\t\t263\t24\tFemale\tTrue\t\n\"FORTUNE, Miss Mabel Helen\"\t1st Class Passenger\tSouthampton\t\t263\t23\tFemale\tTrue\t\n\"FORTUNE, Mr Charles Alexander\"\t1st Class Passenger\tSouthampton\t\t263\t19\tMale\tFalse\t\n\"FRANCATELLI, Miss Laura Mabel\"\t1st Class Passenger\tCherbourg\tSecretary\t56.92916667\t31\tFemale\tTrue\tServant\n\"FRANKLIN, Mr Thomas Parnham\"\t1st Class Passenger\tSouthampton\t\t26.55\t37\tMale\tFalse\t\n\"FRAUENTHAL, Mr Isaac Gerald\"\t1st Class Passenger\tCherbourg\t\t27.72083333\t43\tMale\tTrue\t\n\"FRAUENTHAL, Dr Henry William\"\t1st Class Passenger\tSouthampton\tDoctor\t133.65\t49\tMale\tTrue\t\n\"FRAUENTHAL, Mrs Clara\"\t1st Class Passenger\tSouthampton\t\t133.65\t42\tFemale\tTrue\t\n\"FR�LICHER, Miss Hedwig Margaritha\"\t1st Class Passenger\tCherbourg\t\t49.5\t22\tFemale\tTrue\t\n\"FR�LICHER-STEHLI, Mr Maximilian Josef\"\t1st Class Passenger\tCherbourg\t\t79.2\t60\tMale\tTrue\t\n\"FR�LICHER-STEHLI, Mrs Margaretha Emerentia\"\t1st Class Passenger\tCherbourg\t\t79.2\t48\tFemale\tTrue\t\n\"FRY, Mr Richard\"\t1st Class Passenger\tSouthampton\tServant\t0\t39\tMale\tFalse\tServant\n\"FUTRELLE, Mr Jacques Heath\"\t1st Class Passenger\tSouthampton\tWriter\t53.1\t37\tMale\tFalse\t\n\"FUTRELLE, Mrs Lily May\"\t1st Class Passenger\tSouthampton\t\t53.1\t35\tFemale\tTrue\t\n\"GEE, Mr Arthur H.\"\t1st Class Passenger\tSouthampton\t\t38.5\t47\tMale\tFalse\t\n\"GIBSON, Mrs Pauline Caroline\"\t1st Class Passenger\tCherbourg\t\t59.4\t44\tFemale\tTrue\t\n\"GIBSON, Miss Dorothy Winifred\"\t1st Class Passenger\tCherbourg\t\t59.4\t22\tFemale\tTrue\t\n\"GIEGER, Miss Amalie\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t211.5\t35\tFemale\tTrue\tServant\n\"GIGLIO, Mr Victor Gaitan Andrea\"\t1st Class Passenger\tCherbourg\tServant\t79.2\t23\tMale\tFalse\tServant\n\"GOLDENBERG, Mr Samuel L.\"\t1st Class Passenger\tCherbourg\t\t89.10416667\t47\tMale\tTrue\t\n\"GOLDENBERG, Mrs Nella\"\t1st Class Passenger\tCherbourg\t\t89.10416667\t40\tFemale\tTrue\t\n\"GOLDSCHMIDT, Mr George B.\"\t1st Class Passenger\tCherbourg\tLawyer\t34.65416667\t71\tMale\tFalse\t\n\"GRACIE, Colonel Archibald\"\t1st Class Passenger\tSouthampton\tWriter\t28.5\t53\tMale\tTrue\t\n\"GRAHAM, Mr George Edward\"\t1st Class Passenger\tSouthampton\tSales Manager\t30\t38\tMale\tFalse\t\n\"GRAHAM, Mrs Edith\"\t1st Class Passenger\tSouthampton\t\t153.4625\t59\tFemale\tTrue\t\n\"GRAHAM, Miss Margaret Edith\"\t1st Class Passenger\tSouthampton\t\t153.4625\t19\tFemale\tTrue\t\n\"GREENFIELD, Mrs Blanche\"\t1st Class Passenger\tCherbourg\t\t63.35833333\t45\tFemale\tTrue\t\n\"GREENFIELD, Mr William Bertram\"\t1st Class Passenger\tCherbourg\t\t63.35833333\t23\tMale\tTrue\t\n\"GUGGENHEIM, Mr Benjamin\"\t1st Class Passenger\tCherbourg\tBusinessman\t79.2\t46\tMale\tFalse\t\n\"HARDER, Mr George Achilles\"\t1st Class Passenger\tCherbourg\tBusinessman\t55.44166667\t25\tMale\tTrue\t\n\"HARDER, Mrs Dorothy\"\t1st Class Passenger\tCherbourg\t\t55.44166667\t21\tFemale\tTrue\t\n\"HARPER, Mr Henry Sleeper\"\t1st Class Passenger\tCherbourg\tOf Independent Means\t76.72916667\t48\tMale\tTrue\t\n\"HARPER, Mrs Myra Raymond\"\t1st Class Passenger\tCherbourg\t\t76.72916667\t49\tFemale\tTrue\t\n\"HARRINGTON, Mr Charles Henry\"\t1st Class Passenger\tSouthampton\tServant\t42.4\t37\tMale\tFalse\tServant\n\"HARRIS, Mr Henry Birkhardt\"\t1st Class Passenger\tSouthampton\tTheatre Manager\t83.475\t45\tMale\tFalse\t\n\"HARRIS, Mrs Irene\"\t1st Class Passenger\tSouthampton\t\t83.475\t35\tFemale\tTrue\t\n\"HARRISON, Mr William Henry\"\t1st Class Passenger\tSouthampton\tSecretary\t0\t45\tMale\tFalse\tServant\n\"HASSAB, Mr Hammad\"\t1st Class Passenger\tCherbourg\tServant\t76.72916667\t27\tMale\tTrue\tServant\n\"HAWKSFORD, Mr Walter James\"\t1st Class Passenger\tSouthampton\tSales Manager\t30\t45\tMale\tTrue\t\n\"HAYS, Mr Charles Melville\"\t1st Class Passenger\tSouthampton\tBusinessman\t93.5\t55\tMale\tFalse\t\n\"HAYS, Mrs Clara Jennings\"\t1st Class Passenger\tSouthampton\t\t93.5\t52\tFemale\tTrue\t\n\"HAYS, Miss Margaret Bechstein\"\t1st Class Passenger\tCherbourg\t\t83.15833333\t24\tFemale\tTrue\t\n\"HEAD, Mr Christopher\"\t1st Class Passenger\tSouthampton\tPolitician\t42.5\t42\tMale\tFalse\t\n\"HILLIARD, Mr Herbert Henry\"\t1st Class Passenger\tSouthampton\tBuyer\t51.8625\t44\tMale\tFalse\t\n\"HIPKINS, Mr William Edward\"\t1st Class Passenger\tSouthampton\tManufacturer\t50\t55\tMale\tFalse\t\n\"HIPPACH, Mrs Ida Sophia\"\t1st Class Passenger\tCherbourg\t\t57.97916667\t44\tFemale\tTrue\t\n\"HIPPACH, Miss Jean Gertrude\"\t1st Class Passenger\tCherbourg\t\t57.97916667\t17\tFemale\tTrue\t\n\"HOGEBOOM, Mrs Anna Louisa\"\t1st Class Passenger\tCherbourg\tOf Independent Means\t77.95833333\t51\tFemale\tTrue\t\n\"HOLVERSON, Mr Alexander Oskar\"\t1st Class Passenger\tSouthampton\t\t52\t42\tMale\tFalse\t\n\"HOLVERSON, Mrs Mary Aline\"\t1st Class Passenger\tSouthampton\t\t52\t35\tFemale\tTrue\t\n\"HOMER, Mr Harry\"\t1st Class Passenger\tSouthampton\tGambler\t26.55\t40\tMale\tTrue\t\n\"HOYT, Mr Frederick Maxfield\"\t1st Class Passenger\tSouthampton\t\t100\t38\tMale\tTrue\t\n\"HOYT, Mrs Jane Anne\"\t1st Class Passenger\tSouthampton\t\t100\t31\tFemale\tTrue\t\n\"HOYT, Mr William Fisher\"\t1st Class Passenger\tCherbourg\tBusinessman\t30.69583333\t42\tMale\tFalse\t\n\"ICARD, Miss Rose Am�lie\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t80\t39\tFemale\tTrue\tServant\n\"ISHAM, Miss Ann Elizabeth\"\t1st Class Passenger\tCherbourg\t\t28.7125\t50\tFemale\tFalse\t\n\"ISMAY, Mr Joseph Bruce\"\t1st Class Passenger\tSouthampton\tShipowner\t0\t49\tMale\tTrue\t\n\"JONES, Mr Charles Cresson\"\t1st Class Passenger\tSouthampton\tEstate Manager\t26\t46\tMale\tFalse\t\n\"JULIAN, Mr Henry Forbes\"\t1st Class Passenger\tSouthampton\tMetallurgist\t26\t50\tMale\tFalse\t\n\"KEEPING, Mr Edwin Herbert\"\t1st Class Passenger\tSouthampton\tServant\t211.5\t33\tMale\tFalse\tServant\n\"KENT, Mr Edward Austin\"\t1st Class Passenger\tCherbourg\tArchitect\t29.7\t58\tMale\tFalse\t\n\"KENYON, Mr Frederick Roland\"\t1st Class Passenger\tSouthampton\t\t51.8625\t41\tMale\tFalse\t\n\"KENYON, Mrs Marion Estelle\"\t1st Class Passenger\tSouthampton\t\t51.8625\t40\tFemale\tTrue\t\n\"KIMBALL, Mr Edwin Nelson Jr.\"\t1st Class Passenger\tSouthampton\t\t52.55416667\t42\tMale\tTrue\t\n\"KIMBALL, Mrs Susan Gertrude\"\t1st Class Passenger\tSouthampton\t\t52.55416667\t45\tFemale\tTrue\t\n\"KLABER, Mr Herman\"\t1st Class Passenger\tSouthampton\tBusinessman\t26.55\t42\tMale\tFalse\t\n\"KREUCHEN, Miss Emilie\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t211.3375\t29\tFemale\tTrue\tServant\n\"LEADER, Dr Alice May\"\t1st Class Passenger\tSouthampton\tDoctor\t25.92916667\t49\tMale\tTrue\t\n\"LEROY, Miss Berthe\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t106.425\t27\tFemale\tTrue\tServant\n\"LESUEUR, Mr Gustave J.\"\t1st Class Passenger\tCherbourg\tServant\t512.3291667\t35\tMale\tTrue\tServant\n\"LEWY, Mr Ervin G.\"\t1st Class Passenger\tCherbourg\tJeweller\t27.72083333\t30\tMale\tFalse\t\n\"LINDEBERG-LIND, Mr Erik Gustaf\"\t1st Class Passenger\tSouthampton\tBusinessman\t26.55\t42\tMale\tFalse\t\n\"LINDSTR�M, Mrs Sigrid\"\t1st Class Passenger\tCherbourg\t\t27.72083333\t55\tFemale\tTrue\t\n\"LINES, Mrs Elizabeth Lindsey\"\t1st Class Passenger\tCherbourg\t\t39.4\t50\tFemale\tTrue\t\n\"LINES, Miss Mary Conover\"\t1st Class Passenger\tCherbourg\t\t39.4\t16\tFemale\tTrue\t\n\"LONG, Mr Milton Clyde\"\t1st Class Passenger\tSouthampton\t\t30\t29\tMale\tFalse\t\n\"LONGLEY, Miss Gretchen Fiske\"\t1st Class Passenger\tCherbourg\t\t77.95833333\t21\tFemale\tTrue\t\n\"LORING, Mr Joseph Holland\"\t1st Class Passenger\tSouthampton\tStockbroker\t45.5\t30\tMale\tFalse\t\n\"LURETTE, Miss Eug�nie Elise\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t146.5208333\t59\tFemale\tTrue\tServant\n\"MADILL, Miss Georgette Alexandra\"\t1st Class Passenger\tSouthampton\t\t211.3375\t16\tFemale\tTrue\t\n\"MAGUIRE, Mr John Edward\"\t1st Class Passenger\tSouthampton\t\t26\t30\tMale\tFalse\t\n\"MAIONI, Miss Roberta Elizabeth Mary\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t86.5\t19\tFemale\tTrue\tServant\n\"MAR�CHAL, Mr Pierre\"\t1st Class Passenger\tCherbourg\tAviator\t29.7\t29\tMale\tTrue\t\n\"MARVIN, Mr Daniel Warner\"\t1st Class Passenger\tSouthampton\tOf Independent Means\t53.1\t18\tMale\tFalse\t\n\"MARVIN, Mrs Mary Graham Carmichael\"\t1st Class Passenger\tSouthampton\t\t53.1\t18\tFemale\tTrue\t\n\"MAYN�, Mlle Berthe Antonine\"\t1st Class Passenger\tCherbourg\tSinger\t49.50416667\t24\tFemale\tTrue\t\n\"MCCAFFRY, Mr Thomas Francis\"\t1st Class Passenger\tSouthampton\tBanker\t75.24166667\t46\tMale\tFalse\t\n\"MCCARTHY, Mr Timothy J.\"\t1st Class Passenger\tSouthampton\tBuyer\t51.8625\t54\tMale\tFalse\t\n\"MCGOUGH, Mr James Robert\"\t1st Class Passenger\tSouthampton\tBuyer\t26.2875\t35\tMale\tTrue\t\n\"MEYER, Mr Edgar Joseph\"\t1st Class Passenger\tCherbourg\tMechanical Engineer\t82.17083333\t28\tMale\tFalse\t\n\"MEYER, Mrs Leila\"\t1st Class Passenger\tCherbourg\t\t82.17083333\t25\tFemale\tTrue\t\n\"MILLET, Mr Francis Davis\"\t1st Class Passenger\tCherbourg\tArtist\t26.55\t65\tMale\tFalse\t\n\"MINAHAN, Dr William Edward\"\t1st Class Passenger\tQueenstown\tMerchant\t90\t44\tMale\tFalse\t\n\"MINAHAN, Mrs Lillian E.\"\t1st Class Passenger\tQueenstown\t\t90\t37\tFemale\tTrue\t\n\"MINAHAN, Miss Daisy E.\"\t1st Class Passenger\tQueenstown\t\t90\t33\tFemale\tTrue\t\n\"MOCK, Mr Philipp Edmund\"\t1st Class Passenger\tCherbourg\t\t57.75\t30\tMale\tTrue\t\n\"MOLSON, Mr Harry Markland\"\t1st Class Passenger\tSouthampton\tBusinessman\t30.5\t55\tMale\tFalse\t\n\"MOORE, Mr Clarence Bloomfield\"\t1st Class Passenger\tSouthampton\tBusinessman\t42.4\t47\tMale\tFalse\t\n\"NATSCH, Mr Charles\"\t1st Class Passenger\tCherbourg\t\t29.7\t36\tMale\tFalse\t\n\"NEWELL, Mr Arthur Webster\"\t1st Class Passenger\tCherbourg\t\t113.275\t58\tMale\tFalse\t\n\"NEWELL, Miss Marjorie Anne\"\t1st Class Passenger\tCherbourg\t\t113.275\t23\tFemale\tTrue\t\n\"NEWELL, Miss Madeleine\"\t1st Class Passenger\tCherbourg\t\t113.275\t31\tFemale\tTrue\t\n\"NEWSOM, Miss Helen Monypeny\"\t1st Class Passenger\tSouthampton\t\t26.28333333\t19\tFemale\tTrue\t\n\"NICHOLSON, Mr Arthur Ernest\"\t1st Class Passenger\tSouthampton\t\t26\t59\tMale\tFalse\t\n\"NOURNEY, Mr Alfred\"\t1st Class Passenger\tCherbourg\tGentleman\t13.8625\t20\tMale\tTrue\t\n\"OLIVA Y OCANA, Do�a Fermina\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t108.9\t39\tMale\tTrue\tServant\n\"OMONT, Mr Alfred Fernand\"\t1st Class Passenger\tCherbourg\tDealer\t25.74166667\t29\tMale\tTrue\t\n\"OSTBY, Mr Engelhart Cornelius\"\t1st Class Passenger\tSouthampton\tJeweller\t61.97916667\t64\tMale\tFalse\t\n\"OVI�S Y RODR�GUEZ, Mr Servando Jos� Florentino\"\t1st Class Passenger\tCherbourg\tMerchant\t27.72083333\t36\tMale\tFalse\t\n\"PARR, Mr William Henry Marsh\"\t1st Class Passenger\tBelfast\tElectrician\t0\t29\tMale\tFalse\tH&W Guarantee Group\n\"PARTNER, Mr Austin\"\t1st Class Passenger\tSouthampton\tStockbroker\t28.5\t40\tMale\tFalse\t\n\"PAYNE, Mr Vivian Ponsonby\"\t1st Class Passenger\tSouthampton\tClerk\t93.5\t22\tMale\tFalse\tServant\n\"PEARS, Mr Thomas Clinton\"\t1st Class Passenger\tSouthampton\tOf Independent Means\t66.6\t29\tMale\tFalse\t\n\"PEARS, Mrs Edith\"\t1st Class Passenger\tSouthampton\t\t66.6\t22\tFemale\tTrue\t\n\"PE�ASCO Y CASTELLANA, Mr Victor\"\t1st Class Passenger\tCherbourg\tOf Independent Means\t108.9\t24\tMale\tFalse\t\n\"PE�ASCO Y CASTELLANA, Mrs Maria Josefa Perezde Soto y Vallejo\"\t1st Class Passenger\tCherbourg\tOf Independent Means\t108.9\t22\tFemale\tTrue\t\n\"PERREAULT, Miss Mary Anne\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t93.5\t33\tFemale\tTrue\tServant\n\"PEUCHEN, Major Arthur Godfrey\"\t1st Class Passenger\tSouthampton\t\t30.5\t52\tMale\tTrue\t\n\"PORTER, Mr Walter Chamberlain\"\t1st Class Passenger\tSouthampton\t\t52\t46\tMale\tFalse\t\n\"POTTER, Mrs Lily Alexenia\"\t1st Class Passenger\tCherbourg\t\t83.15833333\t56\tFemale\tTrue\t\n\"REUCHLIN, Mr Jonkheer Johan George\"\t1st Class Passenger\tCherbourg\t\t0\t38\tMale\tFalse\t\n\"RHEIMS, Mr George Alexander Lucien\"\t1st Class Passenger\tCherbourg\tBusinessman\t39.6\t33\tMale\tTrue\t\n\"RIGHINI, Mr Sante\"\t1st Class Passenger\tCherbourg\tServant\t135.6333333\t22\tMale\tFalse\tServant\n\"ROBERT, Mrs Elisabeth Walton\"\t1st Class Passenger\tSouthampton\tOf Independent Means\t211.3375\t43\tFemale\tTrue\t\n\"ROBINS, Mr Victor\"\t1st Class Passenger\tCherbourg\tServant\t247.525\t42\tMale\tFalse\tServant\n\"ROEBLING, Mr Washington Augustus II\"\t1st Class Passenger\tSouthampton\tOf Independent Means\t50.49583333\t31\tMale\tFalse\t\n\"ROMAINE, Mr Charles Hallace\"\t1st Class Passenger\tSouthampton\t\t26.55\t45\tMale\tTrue\t\n\"ROOD, Mr Hugh Roscoe\"\t1st Class Passenger\tSouthampton\tBusinessman\t50\t39\tMale\tFalse\t\n\"ROSENBAUM, Miss Edith Louise\"\t1st Class Passenger\tCherbourg\tJournalist\t27.72083333\t33\tFemale\tTrue\t\n\"ROSENSHINE, Mr George\"\t1st Class Passenger\tCherbourg\tMerchant\t79.2\t46\tMale\tFalse\t\n\"ROSS, Mr John Hugo\"\t1st Class Passenger\tSouthampton\t\t40.125\t36\tMale\tFalse\t\n\"ROTHES, Lucy No�l Martha, Countess of\"\t1st Class Passenger\tSouthampton\tOf Independent Means\t86.5\t33\tFemale\tTrue\t\n\"ROTHSCHILD, Mr Martin\"\t1st Class Passenger\tCherbourg\t\t59.4\t46\tMale\tFalse\t\n\"ROTHSCHILD, Mrs Elizabeth Jane Anne\"\t1st Class Passenger\tCherbourg\t\t59.4\t54\tFemale\tTrue\t\n\"ROWE, Mr Alfred G.\"\t1st Class Passenger\tSouthampton\tLandowner\t26.55\t59\tMale\tFalse\t\n\"RYERSON, Mr Arthur Larned\"\t1st Class Passenger\tCherbourg\t\t262.375\t61\tMale\tFalse\t\n\"RYERSON, Mrs Emily Maria\"\t1st Class Passenger\tCherbourg\t\t262.375\t48\tFemale\tTrue\t\n\"RYERSON, Miss Emily Borie\"\t1st Class Passenger\tCherbourg\t\t262.375\t18\tFemale\tTrue\t\n\"RYERSON, Miss Susan Parker \"\"Suzette\"\"\"\t1st Class Passenger\tCherbourg\t\t262.375\t21\tFemale\tTrue\t\n\"RYERSON, Master John Borie\"\t1st Class Passenger\tCherbourg\t\t262.375\t13\tMale\tTrue\t\n\"SAALFELD, Mr Adolphe\"\t1st Class Passenger\tSouthampton\tBusinessman\t30.5\t47\tMale\tTrue\t\n\"SALOMON, Mr Abraham Lincoln\"\t1st Class Passenger\tCherbourg\tBusinessman\t26\t43\tMale\tTrue\t\n\"S�GESSER, Mlle Emma\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t69.3\t24\tFemale\tTrue\tServant\n\"SCHABERT, Mrs Emma\"\t1st Class Passenger\tCherbourg\t\t57.75\t35\tFemale\tTrue\t\n\"SERREPLAN, Miss Auguste\"\t1st Class Passenger\tSouthampton\tPersonal Maid\t31\t30\tFemale\tTrue\tServant\n\"SEWARD, Mr Frederic Kimber\"\t1st Class Passenger\tSouthampton\tLawyer\t26.55\t34\tMale\tTrue\t\n\"SHUTES, Miss Elizabeth Weed\"\t1st Class Passenger\tSouthampton\tGoverness\t153.4625\t40\tFemale\tTrue\tServant\n\"SILVERTHORNE, Mr Spencer Victor\"\t1st Class Passenger\tSouthampton\t\t26.2875\t35\tMale\tTrue\t\n\"SILVEY, Mr William Baird\"\t1st Class Passenger\tCherbourg\tBusinessman\t55.9\t51\tMale\tFalse\t\n\"SILVEY, Mrs Alice Gray\"\t1st Class Passenger\tCherbourg\t\t55.9\t39\tFemale\tTrue\t\n\"SIMONIUS-BLUMER, Mr Colonel (Oberst) Alfons\"\t1st Class Passenger\tSouthampton\tBanker\t35.5\t56\tMale\tTrue\t\n\"SLOPER, Mr William Thompson\"\t1st Class Passenger\tSouthampton\tStockbroker\t35.5\t28\tMale\tTrue\t\n\"SMART, Mr John Montgomery\"\t1st Class Passenger\tSouthampton\t\t26.55\t56\tMale\tFalse\t\n\"SMITH, Mr James Clinch\"\t1st Class Passenger\tCherbourg\tMilitary\t30.69583333\t56\tMale\tFalse\t\n\"SMITH, Mr Richard William\"\t1st Class Passenger\tSouthampton\t\t26\t57\tMale\tFalse\t\n\"SMITH, Mr Lucian Philip\"\t1st Class Passenger\tCherbourg\t\t60\t24\tMale\tFalse\t\n\"SMITH, Mrs Mary Eloise\"\t1st Class Passenger\tCherbourg\t\t60\t18\tFemale\tTrue\t\n\"SNYDER, Mr John Pillsbury\"\t1st Class Passenger\tSouthampton\t\t82.26666667\t24\tMale\tTrue\t\n\"SNYDER, Mrs Nelle\"\t1st Class Passenger\tSouthampton\t\t82.26666667\t23\tFemale\tTrue\t\n\"SPEDDEN, Mr Frederic Oakley\"\t1st Class Passenger\tCherbourg\t\t134.5\t45\tMale\tTrue\t\n\"SPEDDEN, Mrs Margaretta Corning\"\t1st Class Passenger\tCherbourg\t\t134.5\t39\tFemale\tTrue\t\n\"SPEDDEN, Master Robert Douglas\"\t1st Class Passenger\tCherbourg\t\t134.5\t6\tMale\tTrue\t\n\"SPENCER, Mr William Augustus\"\t1st Class Passenger\tCherbourg\t\t146.5208333\t57\tMale\tFalse\t\n\"SPENCER, Mrs Marie Eugenie\"\t1st Class Passenger\tCherbourg\t\t146.5208333\t45\tFemale\tTrue\t\n\"ST�HELIN-MAEGLIN, Dr Max\"\t1st Class Passenger\tSouthampton\tLawyer\t30.5\t32\tMale\tTrue\t\n\"STEAD, Mr William Thomas\"\t1st Class Passenger\tSouthampton\tJournalist\t26.55\t62\tMale\tFalse\t\n\"STENGEL, Mr Charles Emil Henry\"\t1st Class Passenger\tCherbourg\tBusinessman\t55.44166667\t54\tMale\tTrue\t\n\"STENGEL, Mrs Annie May\"\t1st Class Passenger\tCherbourg\t\t55.44166667\t44\tFemale\tTrue\t\n\"STEPHENSON, Mrs Martha\"\t1st Class Passenger\tCherbourg\t\t78.26666667\t52\tFemale\tTrue\t\n\"STEWART, Mr Albert Ankeny\"\t1st Class Passenger\tCherbourg\tBusinessman\t27.72083333\t64\tMale\tFalse\t\n\"STONE, Mrs Martha Evelyn\"\t1st Class Passenger\tSouthampton\t\t80\t62\tFemale\tTrue\t\n\"STRAUS, Mr Isidor\"\t1st Class Passenger\tSouthampton\tBusinessman\t221.7791667\t67\tMale\tFalse\t\n\"STRAUS, Mrs Rosalie Ida\"\t1st Class Passenger\tSouthampton\t\t221.7791667\t63\tFemale\tFalse\t\n\"SUTTON, Mr Frederick\"\t1st Class Passenger\tSouthampton\tProperty Developer / Real Estate\t32.32083333\t61\tMale\tFalse\t\n\"SWIFT, Mrs Margaret Welles\"\t1st Class Passenger\tSouthampton\t\t25.92916667\t46\tFemale\tTrue\t\n\"TAUSSIG, Mr Emil\"\t1st Class Passenger\tSouthampton\t\t79.65\t52\tMale\tFalse\t\n\"TAUSSIG, Mrs Tillie\"\t1st Class Passenger\tSouthampton\t\t79.65\t39\tFemale\tTrue\t\n\"TAUSSIG, Miss Ruth\"\t1st Class Passenger\tSouthampton\t\t79.65\t18\tFemale\tTrue\t\n\"TAYLOR, Mr Elmer Zebley\"\t1st Class Passenger\tSouthampton\tManufacturer\t52\t48\tMale\tTrue\t\n\"TAYLOR, Mrs Juliet Cummins\"\t1st Class Passenger\tSouthampton\t\t52\t49\tFemale\tTrue\t\n\"THAYER, Mr John Borland\"\t1st Class Passenger\tCherbourg\tBusinessman\t110.8833333\t49\tMale\tFalse\t\n\"THAYER, Mrs Marian Longstreth\"\t1st Class Passenger\tCherbourg\t\t110.8833333\t39\tFemale\tTrue\t\n\"THAYER, Mr John Borland jr\"\t1st Class Passenger\tCherbourg\tScholar\t110.8833333\t17\tMale\tTrue\t\n\"THORNE, Miss Gertrude Maybelle\"\t1st Class Passenger\tCherbourg\t\t80.2\t38\tFemale\tTrue\t\n\"TUCKER, Mr Gilbert Milligan jr\"\t1st Class Passenger\tCherbourg\t\t28.5375\t31\tMale\tTrue\t\n\"URUCHURTU, Don. Manuel Ramirez\"\t1st Class Passenger\tCherbourg\tLawyer\t27.72083333\t39\tMale\tFalse\t\n\"VAN DER HOEF, Mr Wyckoff\"\t1st Class Passenger\tBelfast\tBusinessman\t33.5\t61\tMale\tFalse\t\n\"WALKER, Mr William Anderson\"\t1st Class Passenger\tSouthampton\t\t34.25\t48\tMale\tFalse\t\n\"WARD, Miss Annie Moore\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t512.3291667\t35\tFemale\tTrue\tServant\n\"WARREN, Mr Frank Manley\"\t1st Class Passenger\tCherbourg\t\t75.25\t63\tMale\tFalse\t\n\"WARREN, Mrs Anna Sophia\"\t1st Class Passenger\tCherbourg\t\t75.25\t60\tFemale\tTrue\t\n\"WEIR, Colonel John\"\t1st Class Passenger\tSouthampton\tMilitary\t26.55\t59\tMale\tFalse\t\n\"WHITE, Mr Percival Wayland\"\t1st Class Passenger\tSouthampton\tManufacturer\t77.2875\t54\tMale\tFalse\t\n\"WHITE, Mr Richard Frasar\"\t1st Class Passenger\tSouthampton\t\t77.2875\t21\tMale\tFalse\t\n\"WHITE, Mrs Ella\"\t1st Class Passenger\tCherbourg\t\t135.6333333\t55\tFemale\tTrue\t\n\"WICK, Col. George Dennick\"\t1st Class Passenger\tSouthampton\t\t164.8666667\t57\tMale\tFalse\t\n\"WICK, Mrs Mary Peebles\"\t1st Class Passenger\tSouthampton\t\t164.8666667\t45\tFemale\tTrue\t\n\"WICK, Miss Mary Natalie\"\t1st Class Passenger\tSouthampton\t\t164.8666667\t31\tFemale\tTrue\t\n\"WIDENER, Mr George Dunton\"\t1st Class Passenger\tSouthampton\tBanker\t211.5\t50\tMale\tFalse\t\n\"WIDENER, Mrs Eleanor\"\t1st Class Passenger\tSouthampton\t\t211.5\t50\tFemale\tTrue\t\n\"WIDENER, Mr Harry Elkins\"\t1st Class Passenger\tSouthampton\tBibliophile\t211.5\t27\tMale\tFalse\t\n\"WILLARD, Miss Constance\"\t1st Class Passenger\tSouthampton\t\t26.55\t21\tFemale\tTrue\t\n\"WILLIAMS, Mr Fletcher Fellowes Lambert\"\t1st Class Passenger\tSouthampton\tBusinessman\t35\t43\tMale\tFalse\t\n\"WILLIAMS, Mr Charles Duane\"\t1st Class Passenger\tCherbourg\tLawyer\t61.37916667\t51\tMale\tFalse\t\n\"WILLIAMS, Mr Richard Norris II\"\t1st Class Passenger\tCherbourg\tSportsman\t61.37916667\t21\tMale\tTrue\t\n\"WILSON, Miss Helen Alice\"\t1st Class Passenger\tCherbourg\tPersonal Maid\t134.5\t31\tFemale\tTrue\tServant\n\"WOOLNER, Mr Hugh\"\t1st Class Passenger\tSouthampton\tBusinessman\t35.5\t45\tMale\tTrue\t\n\"WRIGHT, Mr George\"\t1st Class Passenger\tSouthampton\tBusinessman\t26.55\t62\tMale\tFalse\t\n\"YOUNG, Miss Marie Grice\"\t1st Class Passenger\tCherbourg\t\t135.6333333\t36\tFemale\tTrue\t\n\"ABELSON, Mr Samuel\"\t2nd Class Passenger\tCherbourg\t\t24\t30\tMale\tFalse\t\n\"ABELSON, Mrs Hannah\"\t2nd Class Passenger\tCherbourg\t\t24\t28\tFemale\tTrue\t\n\"ALDWORTH, Mr Augustus Henry\"\t2nd Class Passenger\tSouthampton\tChauffeur\t13\t34\tMale\tFalse\tServant\n\"ANDREW, Mr Edgar Samuel\"\t2nd Class Passenger\tSouthampton\t\t11.5\t17\tMale\tFalse\t\n\"ANDREW, Mr Frank Thomas\"\t2nd Class Passenger\tSouthampton\tMiner\t10.5\t25\tMale\tFalse\t\n\"ANGLE, Mr William\"\t2nd Class Passenger\tSouthampton\tTile Maker\t26\t32\tMale\tFalse\t\n\"ANGLE, Mrs Florence Agnes\"\t2nd Class Passenger\tSouthampton\t\t26\t36\tFemale\tTrue\t\n\"ASHBY, Mr John\"\t2nd Class Passenger\tSouthampton\t\t13\t57\tMale\tFalse\t\n\"BAILEY, Mr Percy\"\t2nd Class Passenger\tSouthampton\tButcher's Assistant\t11.5\t15\tMale\tFalse\t\n\"BAINBRIGGE, Mr Charles Robert\"\t2nd Class Passenger\tSouthampton\tHorse Trainer\t10.5\t22\tMale\tFalse\t\n\"BALLS, Mrs Ada E.\"\t2nd Class Passenger\tSouthampton\t\t13\t36\tFemale\tTrue\t\n\"BANFIELD, Mr Frederick James\"\t2nd Class Passenger\tSouthampton\tMiner\t10.5\t28\tMale\tFalse\t\n\"BATEMAN, Revd Robert James\"\t2nd Class Passenger\tSouthampton\tPriest / Minister\t12.525\t51\tMale\tFalse\t\n\"BEANE, Mr Edward\"\t2nd Class Passenger\tSouthampton\t\t26\t32\tMale\tTrue\t\n\"BEANE, Mrs Ethel\"\t2nd Class Passenger\tSouthampton\t\t26\t22\tFemale\tTrue\t\n\"BEAUCHAMP, Mr Henry James\"\t2nd Class Passenger\tSouthampton\tClub Head Steward\t26\t28\tMale\tFalse\t\n\"BECKER, Mrs Nellie E.\"\t2nd Class Passenger\tSouthampton\t\t39\t35\tFemale\tTrue\t\n\"BECKER, Miss Marion Louise\"\t2nd Class Passenger\tSouthampton\t\t39\t4\tFemale\tTrue\t\n\"BECKER, Master Richard F.\"\t2nd Class Passenger\tSouthampton\t\t39\t1\tMale\tTrue\t\n\"BECKER, Miss Ruth Elizabeth\"\t2nd Class Passenger\tSouthampton\t\t39\t12\tFemale\tTrue\t\n\"BEESLEY, Mr Lawrence\"\t2nd Class Passenger\tSouthampton\tTeacher\t13\t34\tMale\tTrue\t\n\"BENTHAM, Miss Lillian W.\"\t2nd Class Passenger\tSouthampton\t\t13\t19\tFemale\tTrue\t\n\"BERRIMAN, Mr William John\"\t2nd Class Passenger\tSouthampton\t\t13\t23\tMale\tFalse\t\n\"BOTSFORD, Mr William Hull\"\t2nd Class Passenger\tSouthampton\t\t13\t25\tMale\tFalse\t\n\"BOWENUR, Mr Solomon\"\t2nd Class Passenger\tSouthampton\tMerchant\t13\t42\tMale\tFalse\t\n\"BRACKEN, Mr James Hollen\"\t2nd Class Passenger\tSouthampton\tStockman\t13\t29\tMale\tFalse\t\n\"BRAILEY, Mr William Theodore Ronald\"\t2nd Class Passenger\tSouthampton\tMusician\t0\t24\tMale\tFalse\tMusician\n\"BRICOUX, Mr Roger Marie\"\t2nd Class Passenger\tSouthampton\tMusician\t0\t20\tMale\tFalse\tMusician\n\"BRITO, Mr Jos� Joaquim de\"\t2nd Class Passenger\tSouthampton\t\t13\t32\tMale\tFalse\t\n\"BROWN, Miss Amelia Mary\"\t2nd Class Passenger\tSouthampton\tCook (Personal)\t13\t18\tFemale\tTrue\tServant\n\"BROWN, Mr Thomas William Solomon\"\t2nd Class Passenger\tSouthampton\tHotelier\t39\t60\tMale\tFalse\t\n\"BROWN, Mrs Elizabeth Catherine\"\t2nd Class Passenger\tSouthampton\t\t39\t40\tFemale\tTrue\t\n\"BROWN, Miss Edith Eileen\"\t2nd Class Passenger\tSouthampton\tScholar\t39\t15\tFemale\tTrue\t\n\"BRYHL, Mr Kurt Arnold Gottfrid\"\t2nd Class Passenger\tSouthampton\t\t26\t25\tMale\tFalse\t\n\"BRYHL, Miss Dagmar Jenny Ingeborg\"\t2nd Class Passenger\tSouthampton\t\t26\t20\tFemale\tTrue\t\n\"BUSS, Miss Kate\"\t2nd Class Passenger\tSouthampton\t\t13\t36\tFemale\tTrue\t\n\"BUTLER, Mr Reginald Fenton\"\t2nd Class Passenger\tSouthampton\tMechanical Engineer\t13\t25\tMale\tFalse\t\n\"BYLES, Fr Thomas Roussel Davids\"\t2nd Class Passenger\tSouthampton\tPriest / Minister\t13\t42\tMale\tFalse\t\n\"BYSTR�M, Mrs Karolina\"\t2nd Class Passenger\tSouthampton\t\t13\t40\tFemale\tTrue\t\n\"CALDWELL, Mr Albert Francis\"\t2nd Class Passenger\tSouthampton\t\t29\t26\tMale\tTrue\t\n\"CALDWELL, Mrs Sylvia Mae\"\t2nd Class Passenger\tSouthampton\t\t29\t28\tFemale\tTrue\t\n\"CALDWELL, Master Alden Gates\"\t2nd Class Passenger\tSouthampton\t\t29\t0.833333333\tMale\tTrue\t\n\"CAMERON, Miss Clear Annie\"\t2nd Class Passenger\tSouthampton\tPersonal Maid\t21\t35\tFemale\tTrue\t\n\"CAMPBELL, Mr William Henry\"\t2nd Class Passenger\tBelfast\t\t0\t21\tMale\tFalse\tH&W Guarantee Group\n\"CARBINES, Mr William\"\t2nd Class Passenger\tSouthampton\tMiner\t13\t19\tMale\tFalse\t\n\"CARTER, Fr Ernest Courtenay\"\t2nd Class Passenger\tSouthampton\tPriest / Minister\t26\t54\tMale\tFalse\t\n\"CARTER, Mrs Lilian\"\t2nd Class Passenger\tSouthampton\t\t26\t45\tFemale\tFalse\t\n\"CHAPMAN, Mr Charles Henry\"\t2nd Class Passenger\tSouthampton\t\t13.5\t52\tMale\tFalse\t\n\"CHAPMAN, Mr John Henry\"\t2nd Class Passenger\tSouthampton\tFarmer\t26\t36\tMale\tFalse\t\n\"CHAPMAN, Mrs Sara Elizabeth\"\t2nd Class Passenger\tSouthampton\t\t26\t28\tFemale\tFalse\t\n\"CHRISTY, Mrs Alice Frances\"\t2nd Class Passenger\tSouthampton\t\t30\t45\tFemale\tTrue\t\n\"CHRISTY, Miss Rachel Juli Cohen\"\t2nd Class Passenger\tSouthampton\t\t30\t25\tFemale\tTrue\t\n\"CLARKE, Mr Charles Valentine\"\t2nd Class Passenger\tSouthampton\tDairy Worker\t26\t29\tMale\tFalse\t\n\"CLARKE, Mrs Ada Maria\"\t2nd Class Passenger\tSouthampton\t\t27\t28\tFemale\tTrue\t\n\"CLARKE, Mr John Frederick Preston\"\t2nd Class Passenger\tSouthampton\tMusician\t0\t28\tMale\tFalse\tMusician\n\"COLERIDGE, Mr Reginald Charles\"\t2nd Class Passenger\tSouthampton\tAdvertising Consultant\t10.5\t29\tMale\tFalse\t\n\"COLLANDER, Mr Erik Gustaf\"\t2nd Class Passenger\tSouthampton\t\t13\t27\tMale\tFalse\t\n\"COLLETT, Mr Sidney Clarence Stuart\"\t2nd Class Passenger\tSouthampton\t\t10.5\t25\tMale\tTrue\t\n\"COLLYER, Mr Harvey\"\t2nd Class Passenger\tSouthampton\tGrocer\t26.25\t31\tMale\tFalse\t\n\"COLLYER, Mrs Charlotte Caroline\"\t2nd Class Passenger\tSouthampton\t\t26.25\t31\tFemale\tTrue\t\n\"COLLYER, Miss Marjorie Lottie\"\t2nd Class Passenger\tSouthampton\t\t26.25\t8\tFemale\tTrue\t\n\"COOK, Mrs Selena\"\t2nd Class Passenger\tSouthampton\t\t10.5\t22\tFemale\tTrue\t\n\"CORBETT, Mrs Irene\"\t2nd Class Passenger\tSouthampton\tMusician\t13\t30\tFemale\tFalse\t\n\"COREY, Mrs Mary Emma\"\t2nd Class Passenger\tSouthampton\t\t21\t30\tFemale\tFalse\t\n\"COTTERILL, Mr Henry\"\t2nd Class Passenger\tSouthampton\tCarpenter / Joiner\t11.5\t20\tMale\tFalse\t\n\"CUNNINGHAM, Mr Alfred Fleming\"\t2nd Class Passenger\tBelfast\tFitter\t0\t21\tMale\tFalse\tH&W Guarantee Group\n\"DAVIES, Mr Charles Henry\"\t2nd Class Passenger\tSouthampton\t\t73.5\t19\tMale\tFalse\t\n\"DAVIES, Mrs Agnes\"\t2nd Class Passenger\tSouthampton\t\t36.75\t48\tFemale\tTrue\t\n\"DAVIES, Master John Morgan jr\"\t2nd Class Passenger\tSouthampton\t\t36.75\t8\tMale\tTrue\t\n\"DAVIS, Miss Mary Ann Charlotte\"\t2nd Class Passenger\tSouthampton\t\t13\t28\tFemale\tTrue\t\n\"DEACON, Mr Percy William\"\t2nd Class Passenger\tSouthampton\tBaker\t73.5\t18\tMale\tFalse\t\n\"DEL CARLO, Mr Sebastiano\"\t2nd Class Passenger\tCherbourg\t\t27.72083333\t29\tMale\tFalse\t\n\"DEL CARLO, Mrs Argene\"\t2nd Class Passenger\tCherbourg\t\t27.72083333\t24\tFemale\tTrue\t\n\"DENBUOY, Mr Albert Joseph\"\t2nd Class Passenger\tSouthampton\tFruit Farmer\t31.5\t25\tMale\tFalse\t\n\"DIBDEN, Mr William\"\t2nd Class Passenger\tSouthampton\tGeneral Labourer\t73.5\t18\tMale\tFalse\t\n\"DOLING, Mrs Ada Julia Elizabeth\"\t2nd Class Passenger\tSouthampton\t\t23\t34\tFemale\tTrue\t\n\"DOLING, Miss Elsie\"\t2nd Class Passenger\tSouthampton\t\t23\t18\tFemale\tTrue\t\n\"DOUTON, Mr William Joseph\"\t2nd Class Passenger\tSouthampton\tQuarryman\t26\t55\tMale\tFalse\t\n\"DREW, Mr James Vivian\"\t2nd Class Passenger\tSouthampton\t\t32.5\t42\tMale\tFalse\t\n\"DREW, Mrs Lulu Thorne\"\t2nd Class Passenger\tSouthampton\t\t32.5\t34\tFemale\tTrue\t\n\"DREW, Master Marshall Brines\"\t2nd Class Passenger\tSouthampton\t\t32.5\t8\tMale\tTrue\t\n\"DUR�N I MON�, Sra. Florentina\"\t2nd Class Passenger\tCherbourg\t\t13.85833333\t30\tFemale\tTrue\t\n\"DUR�N I MON�, Sra. Asuncion\"\t2nd Class Passenger\tCherbourg\t\t13.85833333\t27\tFemale\tTrue\t\n\"EITEMILLER, Mr George Floyd\"\t2nd Class Passenger\tSouthampton\t\t13\t25\tMale\tFalse\t\n\"ENANDER, Mr Ingvar\"\t2nd Class Passenger\tSouthampton\t\t13\t21\tMale\tFalse\t\n\"FAHLSTR�M, Mr Arne Joma\"\t2nd Class Passenger\tSouthampton\t\t13\t18\tMale\tFalse\t\n\"FAUNTHORPE, Mr Harry Bartram\"\t2nd Class Passenger\tSouthampton\t\t26\t41\tMale\tFalse\t\n\"FILLBROOK, Mr Joseph Charles\"\t2nd Class Passenger\tSouthampton\tPainter & Decorator\t10.5\t18\tMale\tFalse\t\n\"FOX, Mr Stanley Harrington\"\t2nd Class Passenger\tSouthampton\tBusinessman\t13\t38\tMale\tFalse\t\n\"FROST, Mr Anthony Wood\"\t2nd Class Passenger\tBelfast\tFitter\t0\t38\tMale\tFalse\tH&W Guarantee Group\n\"FUNK, Miss Annie Clemmer\"\t2nd Class Passenger\tSouthampton\tMissionary\t13\t38\tFemale\tFalse\t\n\"FYNNEY, Mr Joseph J.\"\t2nd Class Passenger\tSouthampton\tRubber Merchant\t26\t35\tMale\tFalse\t\n\"GALE, Mr Harry\"\t2nd Class Passenger\tSouthampton\tMiner\t21\t38\tMale\tFalse\t\n\"GALE, Mr Shadrach\"\t2nd Class Passenger\tSouthampton\tMiner\t21\t33\tMale\tFalse\t\n\"GARSIDE, Miss Ethel\"\t2nd Class Passenger\tSouthampton\t\t13\t39\tFemale\tTrue\t\n\"GASKELL, Mr William Alfred\"\t2nd Class Passenger\tSouthampton\tCooper\t26\t19\tMale\tFalse\t\n\"GAVEY, Mr Laurence\"\t2nd Class Passenger\tSouthampton\t\t10.5\t26\tMale\tFalse\t\n\"GILBERT, Mr William\"\t2nd Class Passenger\tSouthampton\t\t10.5\t47\tMale\tFalse\t\n\"GILES, Mr Edgar\"\t2nd Class Passenger\tSouthampton\tCab Driver\t11.5\t21\tMale\tFalse\t\n\"GILES, Mr Frederick Edward\"\t2nd Class Passenger\tSouthampton\tBus Driver\t11.5\t20\tMale\tFalse\t\n\"GILES, Mr Ralph\"\t2nd Class Passenger\tSouthampton\t\t13.5\t24\tMale\tFalse\t\n\"GILL, Mr John\"\t2nd Class Passenger\tSouthampton\tChauffeur\t13\t24\tMale\tFalse\t\n\"GILLESPIE, Mr William Henry\"\t2nd Class Passenger\tSouthampton\tClerk\t13\t31\tMale\tFalse\t\n\"GIVARD, Mr Hans Kristensen\"\t2nd Class Passenger\tSouthampton\t\t13\t30\tMale\tFalse\t\n\"GREENBERG, Mr Samuel\"\t2nd Class Passenger\tSouthampton\t\t13\t52\tMale\tFalse\t\n\"HALE, Mr Reginald\"\t2nd Class Passenger\tSouthampton\tGardener\t13\t30\tMale\tFalse\t\n\"HARBECK, Mr William H.\"\t2nd Class Passenger\tSouthampton\tCinematographer\t13\t44\tMale\tFalse\t\n\"HARPER, Rev. John\"\t2nd Class Passenger\tSouthampton\tPriest / Minister\t33\t39\tMale\tFalse\t\n\"HARPER, Miss Annie Jessie\"\t2nd Class Passenger\tSouthampton\t\t33\t6\tFemale\tTrue\t\n\"HARRIS, Mr George\"\t2nd Class Passenger\tSouthampton\t\t10.5\t62\tMale\tTrue\t\n\"HARRIS, Mr Walter\"\t2nd Class Passenger\tSouthampton\t\t10.5\t44\tMale\tFalse\t\n\"HART, Mr Benjamin\"\t2nd Class Passenger\tSouthampton\tBuilder\t26.25\t47\tMale\tFalse\t\n\"HART, Mrs Esther Ada\"\t2nd Class Passenger\tSouthampton\t\t26.25\t48\tFemale\tTrue\t\n\"HART, Miss Eva Miriam\"\t2nd Class Passenger\tSouthampton\t\t26.25\t7\tFemale\tTrue\t\n\"HARTLEY, Mr Wallace Henry\"\t2nd Class Passenger\tSouthampton\tMusician\t0\t33\tMale\tFalse\tMusician\n\"H�M�L�INEN, Mrs Anna\"\t2nd Class Passenger\tSouthampton\t\t14.5\t23\tFemale\tTrue\t\n\"H�M�L�INEN, Master Viljo Unto Johannes\"\t2nd Class Passenger\tSouthampton\t\t14.5\t0.583333333\tMale\tTrue\t\n\"HERMAN, Mr Samuel\"\t2nd Class Passenger\tSouthampton\tFarmer\t65\t49\tMale\tFalse\t\n\"HERMAN, Mrs Jane\"\t2nd Class Passenger\tSouthampton\t\t65\t48\tFemale\tTrue\t\n\"HERMAN, Miss Alice\"\t2nd Class Passenger\tSouthampton\t\t65\t23\tFemale\tTrue\t\n\"HERMAN, Miss Kate\"\t2nd Class Passenger\tSouthampton\t\t65\t23\tFemale\tTrue\t\n\"HEWLETT, Mrs Mary Dunbar\"\t2nd Class Passenger\tSouthampton\t\t16\t56\tFemale\tTrue\t\n\"HICKMAN, Mr Leonard Mark\"\t2nd Class Passenger\tSouthampton\t\t73.5\t24\tMale\tFalse\t\n\"HICKMAN, Mr Lewis\"\t2nd Class Passenger\tSouthampton\t\t73.5\t30\tMale\tFalse\t\n\"HICKMAN, Mr Stanley George\"\t2nd Class Passenger\tSouthampton\t\t73.5\t20\tMale\tFalse\t\n\"HILTUNEN, Miss Marta\"\t2nd Class Passenger\tSouthampton\t\t13\t18\tFemale\tFalse\t\n\"HOCKING, Mr Richard George\"\t2nd Class Passenger\tSouthampton\tBaker\t11.5\t23\tMale\tFalse\t\n\"HOCKING, Mrs Eliza\"\t2nd Class Passenger\tSouthampton\t\t23\t54\tFemale\tTrue\t\n\"HOCKING, Miss Ellen\"\t2nd Class Passenger\tSouthampton\t\t23\t20\tFemale\tTrue\t\n\"HOCKING, Mr Samuel James Metcalfe\"\t2nd Class Passenger\tSouthampton\tPainter & Decorator\t13\t36\tMale\tFalse\t\n\"HODGES, Mr Henry Price\"\t2nd Class Passenger\tSouthampton\tMusical Instrument Vendor\t13\t50\tMale\tFalse\t\n\"HOLD, Mr Stephen\"\t2nd Class Passenger\tSouthampton\tClerk\t26\t44\tMale\tFalse\t\n\"HOLD, Mrs Annie Margaret\"\t2nd Class Passenger\tSouthampton\t\t26\t29\tFemale\tTrue\t\n\"HOOD, Mr Ambrose Jr\"\t2nd Class Passenger\tSouthampton\t\t73.5\t21\tMale\tFalse\t\n\"HOSONO, Mr Masabumi\"\t2nd Class Passenger\tSouthampton\tCivil Servant\t13\t41\tMale\tTrue\t\n\"HOWARD, Mr Benjamin\"\t2nd Class Passenger\tSouthampton\tRetired\t26\t63\tMale\tFalse\t\n\"HOWARD, Mrs Ellen Truelove\"\t2nd Class Passenger\tSouthampton\t\t26\t61\tFemale\tFalse\t\n\"HUME, Mr John Law\"\t2nd Class Passenger\tSouthampton\tMusician\t0\t21\tMale\tFalse\tMusician\n\"HUNT, Mr George Henry\"\t2nd Class Passenger\tSouthampton\tGardener\t12.275\t33\tMale\tFalse\t\n\"ILETT, Miss Bertha\"\t2nd Class Passenger\tSouthampton\t\t10.5\t17\tFemale\tTrue\t\n\"JACOBSOHN, Mr Sidney Samuel\"\t2nd Class Passenger\tSouthampton\tLawyer\t27\t42\tMale\tFalse\t\n\"JACOBSOHN, Mrs Amy Frances Christy\"\t2nd Class Passenger\tSouthampton\t\t27\t24\tFemale\tTrue\t\n\"JARVIS, Mr Denzil John\"\t2nd Class Passenger\tSouthampton\tEngineer\t15\t47\tMale\tFalse\t\n\"JEFFERYS, Mr Clifford Thomas\"\t2nd Class Passenger\tSouthampton\tGranite Cutter\t31.5\t24\tMale\tFalse\t\n\"JEFFERYS, Mr Ernest Wilfred\"\t2nd Class Passenger\tSouthampton\tGranite Cutter\t31.5\t22\tMale\tFalse\t\n\"JENKIN, Mr Stephen Curnow\"\t2nd Class Passenger\tSouthampton\tMiner\t10.5\t32\tMale\tFalse\t\n\"JERWAN, Mrs Marie Marthe\"\t2nd Class Passenger\tCherbourg\t\t13.79166667\t23\tFemale\tTrue\t\n\"KANTOR, Mr Sinai\"\t2nd Class Passenger\tSouthampton\t\t26\t34\tMale\tFalse\t\n\"KANTOR, Mrs Miriam\"\t2nd Class Passenger\tSouthampton\t\t26\t24\tFemale\tTrue\t\n\"KARNES, Mrs Claire\"\t2nd Class Passenger\tSouthampton\t\t21\t28\tFemale\tFalse\t\n\"KEANE, Mr Daniel\"\t2nd Class Passenger\tQueenstown\t\t12.35\t35\tMale\tFalse\t\n\"KEANE, Miss Nora Agnes\"\t2nd Class Passenger\tQueenstown\t\t12.35\t46\tFemale\tTrue\t\n\"KELLY, Mrs Fanny Maria\"\t2nd Class Passenger\tSouthampton\t\t13.5\t45\tFemale\tTrue\t\n\"KIRKLAND, Fr Charles Leonard\"\t2nd Class Passenger\tQueenstown\tPriest / Minister\t12.35\t52\tMale\tFalse\t\n\"KNIGHT, Mr Robert\"\t2nd Class Passenger\tBelfast\tFitter\t0\t39\tMale\tFalse\tH&W Guarantee Group\n\"KRINS, Mr Georges Alexandre\"\t2nd Class Passenger\tSouthampton\tMusician\t0\t23\tMale\tFalse\tMusician\n\"KVILLNER, Mr Johan Henrik Johannesson\"\t2nd Class Passenger\tSouthampton\tMechanical Engineer\t10.5\t31\tMale\tFalse\t\n\"LAHTINEN, Fr William\"\t2nd Class Passenger\tSouthampton\tPriest / Minister\t26\t35\tMale\tFalse\t\n\"LAHTINEN, Mrs Anna Amelia\"\t2nd Class Passenger\tSouthampton\t\t26\t34\tFemale\tFalse\t\n\"LAMB, Mr John J.\"\t2nd Class Passenger\tQueenstown\tGentleman\t10.70833333\t30\tMale\tFalse\t\n\"LAROCHE, Mr Joseph Philippe Lemercier\"\t2nd Class Passenger\tCherbourg\tEngineer\t41.57916667\t25\tMale\tFalse\t\n\"LAROCHE, Mrs Juliette Marie Louise\"\t2nd Class Passenger\tCherbourg\t\t41.57916667\t22\tFemale\tTrue\t\n\"LAROCHE, Miss Louise\"\t2nd Class Passenger\tCherbourg\t\t41.57916667\t1\tFemale\tTrue\t\n\"LAROCHE, Miss Simonne Marie Anne Andr�e\"\t2nd Class Passenger\tCherbourg\t\t41.57916667\t3\tFemale\tTrue\t\n\"L�VY, Mr Ren� Jacques\"\t2nd Class Passenger\tSouthampton\tChemist\t12.875\t36\tMale\tFalse\t\n\"LEHMANN, Miss Bertha\"\t2nd Class Passenger\tCherbourg\t\t12\t17\tFemale\tTrue\t\n\"LEITCH, Miss Jessie Wills\"\t2nd Class Passenger\tSouthampton\t\t33\t31\tFemale\tTrue\t\n\"LEMORE, Mrs Amelia\"\t2nd Class Passenger\tSouthampton\t\t10.5\t46\tFemale\tTrue\t\n\"LEYSON, Mr Robert William Norman\"\t2nd Class Passenger\tSouthampton\tSolicitor\t10.5\t25\tMale\tFalse\t\n\"LINNANE, Mr John\"\t2nd Class Passenger\tQueenstown\tGentleman\t12.35\t61\tMale\tFalse\t\n\"LOUCH, Mr Charles\"\t2nd Class Passenger\tSouthampton\tSaddler\t26\t50\tMale\tFalse\t\n\"LOUCH, Mrs Alice Adelaide\"\t2nd Class Passenger\tSouthampton\t\t26\t42\tFemale\tTrue\t\n\"MACK, Mrs Mary\"\t2nd Class Passenger\tSouthampton\t\t10.5\t57\tFemale\tFalse\t\n\"MALACHARD, Mr Jean-No�l\"\t2nd Class Passenger\tCherbourg\t\t15.55\t25\tMale\tFalse\t\n\"MALLET, Mr Albert Denis Pierre\"\t2nd Class Passenger\tCherbourg\tMerchant\t37.05\t45\tMale\tFalse\t\n\"MALLET, Mrs Antonine Marie\"\t2nd Class Passenger\tCherbourg\t\t37.05\t24\tFemale\tTrue\t\n\"MALLET, Master Andr� Clement\"\t2nd Class Passenger\tCherbourg\t\t37.05\t1\tMale\tTrue\t\n\"MANGIAVACCHI, Mr Serafino Emilio\"\t2nd Class Passenger\tCherbourg\tClerk\t15.57916667\t30\tMale\tFalse\t\n\"MATTHEWS, Mr William John\"\t2nd Class Passenger\tSouthampton\tChina Clay Worker\t13\t23\tMale\tFalse\t\n\"MAYBERY, Mr Frank Hubert\"\t2nd Class Passenger\tSouthampton\tProperty Developer / Real Estate\t16\t36\tMale\tFalse\t\n\"MCCRAE, Mr Arthur Gordon\"\t2nd Class Passenger\tSouthampton\tEngineer\t13.5\t32\tMale\tFalse\t\n\"MCCRIE, Mr James Matthew\"\t2nd Class Passenger\tSouthampton\tOil Worker\t13\t32\tMale\tFalse\t\n\"MCKANE, Mr Peter Dan\"\t2nd Class Passenger\tSouthampton\tQuarryman\t26\t46\tMale\tFalse\t\n\"MELLINGER, Mrs Elizabeth Anne\"\t2nd Class Passenger\tSouthampton\tServant\t19.5\t41\tFemale\tTrue\t\n\"MELLINGER, Miss Violet Madeline\"\t2nd Class Passenger\tSouthampton\t\t19.5\t13\tFemale\tTrue\t\n\"MELLORS, Mr William John\"\t2nd Class Passenger\tSouthampton\tSalesman\t10.5\t19\tMale\tTrue\t\n\"MEYER, Mr August\"\t2nd Class Passenger\tSouthampton\tBaker\t13\t31\tMale\tFalse\t\n\"MILLING, Mr Jacob Christian\"\t2nd Class Passenger\tSouthampton\tMachine Inspector\t13\t48\tMale\tFalse\t\n\"MITCHELL, Mr Henry Michael\"\t2nd Class Passenger\tSouthampton\tRetired\t10.5\t71\tMale\tFalse\t\n\"MONTVILA, Fr Juozas\"\t2nd Class Passenger\tSouthampton\tPriest / Minister\t13\t27\tMale\tFalse\t\n\"MORAWECK, Dr Ernest\"\t2nd Class Passenger\tSouthampton\tDoctor\t14\t54\tMale\tFalse\t\n\"MORLEY, Mr Henry Samuel\"\t2nd Class Passenger\tSouthampton\tConfectioner\t26\t38\tMale\tFalse\t\n\"MUDD, Mr Thomas Cupper\"\t2nd Class Passenger\tSouthampton\t\t10.5\t16\tMale\tFalse\t\n\"MYLES, Mr Thomas Francis\"\t2nd Class Passenger\tQueenstown\tGentleman\t9.6875\t63\tMale\tFalse\t\n\"NASSER, Mr Nicholas\"\t2nd Class Passenger\tCherbourg\t\t30.07083333\t28\tMale\tFalse\t\n\"NASSER, Mrs Adele\"\t2nd Class Passenger\tCherbourg\t\t30.07083333\t14\tFemale\tTrue\t\n\"NAVRATIL, Mr Michel\"\t2nd Class Passenger\tSouthampton\t\t26\t32\tMale\tFalse\t\n\"NAVRATIL, Master Edmond Roger\"\t2nd Class Passenger\tSouthampton\t\t26\t2\tMale\tTrue\t\n\"NAVRATIL, Master Michel Marcel\"\t2nd Class Passenger\tSouthampton\t\t26\t3\tMale\tTrue\t\n\"NESSON, Mr Israel\"\t2nd Class Passenger\tSouthampton\tElectrician\t13\t26\tMale\tFalse\t\n\"NICHOLLS, Mr Joseph Charles\"\t2nd Class Passenger\tSouthampton\tMiner\t36.75\t19\tMale\tFalse\t\n\"NORMAN, Mr Robert Douglas\"\t2nd Class Passenger\tSouthampton\tElectrical Engineer\t13.5\t27\tMale\tFalse\t\n\"NYE, Mrs Elizabeth\"\t2nd Class Passenger\tSouthampton\t\t10.5\t29\tFemale\tTrue\t\n\"OTTER, Mr Richard\"\t2nd Class Passenger\tSouthampton\tStone Cutter\t13\t38\tMale\tFalse\t\n\"OXENHAM, Mr Percy Thomas\"\t2nd Class Passenger\tSouthampton\tMason\t10.5\t22\tMale\tTrue\t\n\"PADRON MANENT, Mr Julian\"\t2nd Class Passenger\tCherbourg\tChauffeur\t13.8625\t26\tMale\tTrue\t\n\"PAIN, Dr Alfred\"\t2nd Class Passenger\tSouthampton\tDoctor\t10.5\t23\tMale\tFalse\t\n\"PALL�S I CASTELL�, Sr. Emili\"\t2nd Class Passenger\tCherbourg\t\t13.85833333\t29\tMale\tTrue\t\n\"PARKER, Mr Clifford Richard\"\t2nd Class Passenger\tSouthampton\tClerk\t10.5\t17\tMale\tFalse\t\n\"PARKES, Mr Francis\"\t2nd Class Passenger\tBelfast\tPlumber\t0\t21\tMale\tFalse\tH&W Guarantee Group\n\"PARRISH, Mrs Lutie Davis\"\t2nd Class Passenger\tSouthampton\t\t26\t59\tFemale\tTrue\t\n\"PENGELLY, Mr Frederick William\"\t2nd Class Passenger\tSouthampton\tMiner\t10.5\t19\tMale\tFalse\t\n\"PERNOT, Mr Ren�\"\t2nd Class Passenger\tCherbourg\tChauffeur\t15.05\t39\tMale\tFalse\tServant\n\"PERUSCHITZ, Fr Josef\"\t2nd Class Passenger\tSouthampton\tPriest / Minister\t13\t41\tMale\tFalse\t\n\"PHILLIPS, Mr Escott Robert\"\t2nd Class Passenger\tSouthampton\t\t21\t42\tMale\tFalse\t\n\"PHILLIPS, Miss Alice Frances Louisa\"\t2nd Class Passenger\tSouthampton\t\t21\t21\tFemale\tTrue\t\n\"PHILLIPS, Miss Kate Florence\"\t2nd Class Passenger\tSouthampton\t\t26\t19\tFemale\tTrue\t\n\"PINSKY, Mrs Rosa\"\t2nd Class Passenger\tSouthampton\t\t13\t32\tFemale\tTrue\t\n\"PONESELL, Mr Martin\"\t2nd Class Passenger\tSouthampton\t\t13\t24\tMale\tFalse\t\n\"PORTALUPPI, Mr Emilio Ilario Giuseppe\"\t2nd Class Passenger\tCherbourg\t\t12.7375\t30\tMale\tTrue\t\n\"PULBAUM, Mr Franz\"\t2nd Class Passenger\tCherbourg\t\t15.4\t27\tMale\tFalse\t\n\"QUICK, Mrs Jane\"\t2nd Class Passenger\tSouthampton\t\t26\t33\tFemale\tTrue\t\n\"QUICK, Miss Winifred Vera\"\t2nd Class Passenger\tSouthampton\t\t26\t8\tFemale\tTrue\t\n\"QUICK, Miss Phyllis May\"\t2nd Class Passenger\tSouthampton\t\t26\t2\tFemale\tTrue\t\n\"REEVES, Mr David\"\t2nd Class Passenger\tSouthampton\tCarpenter / Joiner\t10.5\t36\tMale\tFalse\t\n\"RENOUF, Mr Peter Henry\"\t2nd Class Passenger\tSouthampton\tCarpenter / Joiner\t21\t33\tMale\tFalse\t\n\"RENOUF, Mrs Lillian\"\t2nd Class Passenger\tSouthampton\t\t21\t30\tFemale\tTrue\t\n\"REYNALDS, Sra. Encarnaci�n\"\t2nd Class Passenger\tSouthampton\t\t13\t28\tFemale\tTrue\t\n\"RICHARD, Mr Emile Phillippe\"\t2nd Class Passenger\tCherbourg\t\t15.55\t23\tMale\tFalse\t\n\"RICHARDS, Mrs Emily\"\t2nd Class Passenger\tSouthampton\t\t18.75\t24\tFemale\tTrue\t\n\"RICHARDS, Master William Rowe\"\t2nd Class Passenger\tSouthampton\t\t18.75\t3\tMale\tTrue\t\n\"RICHARDS, Master Sibley George\"\t2nd Class Passenger\tSouthampton\t\t18.75\t0.75\tMale\tTrue\t\n\"RIDSDALE, Miss Lucy\"\t2nd Class Passenger\tSouthampton\t\t10.5\t58\tFemale\tTrue\t\n\"ROGERS, Mr Reginald Harry\"\t2nd Class Passenger\tSouthampton\t\t10.5\t18\tMale\tFalse\t\n\"RUGG, Miss Emily\"\t2nd Class Passenger\tSouthampton\t\t10.5\t21\tFemale\tTrue\t\n\"SCHMIDT, Mr Augustus\"\t2nd Class Passenger\tSouthampton\t\t13\t21\tMale\tFalse\t\n\"SEDGWICK, Mr Charles Frederick Waddington\"\t2nd Class Passenger\tSouthampton\t\t13\t28\tMale\tFalse\t\n\"SHARP, Mr Percival\"\t2nd Class Passenger\tSouthampton\t\t26\t27\tMale\tFalse\t\n\"SHELLEY, Mrs Imanita Parrish\"\t2nd Class Passenger\tSouthampton\t\t26\t25\tFemale\tTrue\t\n\"SILV�N, Miss Lyyli Karoliina\"\t2nd Class Passenger\tSouthampton\t\t13\t17\tFemale\tTrue\t\n\"SINCOCK, Miss Maude\"\t2nd Class Passenger\tSouthampton\t\t36.75\t20\tFemale\tTrue\t\n\"SINKKONEN, Miss Anna\"\t2nd Class Passenger\tSouthampton\t\t13\t29\tFemale\tTrue\t\n\"SJ�STEDT, Mr Ernst Adolf\"\t2nd Class Passenger\tSouthampton\t\t13.5\t59\tMale\tFalse\t\n\"SLAYTER, Miss Hilda Mary\"\t2nd Class Passenger\tQueenstown\t\t12.35\t30\tFemale\tTrue\t\n\"SLEMEN, Mr Richard James\"\t2nd Class Passenger\tSouthampton\tJourneyman carpenter\t10.5\t35\tMale\tFalse\t\n\"SMITH, Miss Marion Elsie\"\t2nd Class Passenger\tSouthampton\t\t13\t39\tFemale\tTrue\t\n\"SOBEY, Mr Samuel James Hayden\"\t2nd Class Passenger\tSouthampton\tQuarryman\t13\t25\tMale\tFalse\t\n\"STANTON, Mr Samuel Ward\"\t2nd Class Passenger\tCherbourg\t\t15.55\t42\tMale\tFalse\t\n\"STOKES, Mr Philip Joseph\"\t2nd Class Passenger\tSouthampton\tBricklayer\t10.5\t25\tMale\tFalse\t\n\"SWANE, Mr George\"\t2nd Class Passenger\tSouthampton\tChauffeur\t13\t19\tMale\tFalse\tServant\n\"SWEET, Mr George Frederick\"\t2nd Class Passenger\tSouthampton\tFarm Labourer\t65\t14\tMale\tFalse\t\n\"TAYLOR, Mr Percy Cornelius\"\t2nd Class Passenger\tSouthampton\tMusician\t0\t32\tMale\tFalse\tMusician\n\"TOOMEY, Miss Ellen Mary\"\t2nd Class Passenger\tSouthampton\tServant\t10.5\t48\tFemale\tTrue\t\n\"TROUPIANSKY, Mr Moses Aaron\"\t2nd Class Passenger\tSouthampton\tShop Assistant\t13\t23\tMale\tFalse\t\n\"TROUT, Mrs Jessie Laird\"\t2nd Class Passenger\tSouthampton\t\t12.65\t27\tFemale\tTrue\t\n\"TROUTT, Miss Edwina Celia\"\t2nd Class Passenger\tSouthampton\t\t10.5\t27\tFemale\tTrue\t\n\"TURPIN, Mr William John\"\t2nd Class Passenger\tSouthampton\tCarpenter / Joiner\t21\t29\tMale\tFalse\t\n\"TURPIN, Mrs Dorothy Ann\"\t2nd Class Passenger\tSouthampton\tHousewife\t21\t26\tFemale\tFalse\t\n\"VEAL, Mr James\"\t2nd Class Passenger\tSouthampton\t\t13\t40\tMale\tFalse\t\n\"WALLCROFT, Miss Ellen 'Nellie'\"\t2nd Class Passenger\tSouthampton\tCook\t21\t36\tFemale\tTrue\t\n\"WARE, Mr John James\"\t2nd Class Passenger\tSouthampton\tCarpenter / Joiner\t21\t45\tMale\tFalse\t\n\"WARE, Mrs Florence Louise\"\t2nd Class Passenger\tSouthampton\t\t21\t31\tFemale\tTrue\t\n\"WARE, Mr William Jeffery\"\t2nd Class Passenger\tSouthampton\t\t10.5\t23\tMale\tFalse\t\n\"WATSON, Mr Ennis Hastings\"\t2nd Class Passenger\tBelfast\tApprentice Electrician\t0\t19\tMale\tFalse\tH&W Guarantee Group\n\"WATT, Mrs Elizabeth\"\t2nd Class Passenger\tSouthampton\t\t15.75\t40\tFemale\tTrue\t\n\"WATT, Miss Robertha Josephine\"\t2nd Class Passenger\tSouthampton\t\t15.75\t12\tFemale\tTrue\t\n\"WEBBER, Miss Susan\"\t2nd Class Passenger\tSouthampton\t\t13\t37\tFemale\tTrue\t\n\"WEISZ, Mr L�opold\"\t2nd Class Passenger\tSouthampton\tStonemason and Carver\t26\t37\tMale\tFalse\t\n\"WEISZ, Mrs Mathilde Fran�oise\"\t2nd Class Passenger\tSouthampton\t\t26\t37\tFemale\tTrue\t\n\"WELLS, Mrs\"\t2nd Class Passenger\tSouthampton\t\t23\t29\tFemale\tTrue\t\n\"WELLS, Miss Joan\"\t2nd Class Passenger\tSouthampton\t\t23\t4\tFemale\tTrue\t\n\"WELLS, Master Ralph Lester\"\t2nd Class Passenger\tSouthampton\t\t23\t2\tMale\tTrue\t\n\"WEST, Mr Edwy Arthur\"\t2nd Class Passenger\tSouthampton\t\t27.75\t36\tMale\tFalse\t\n\"WEST, Mrs Ada Mary\"\t2nd Class Passenger\tSouthampton\t\t27.75\t33\tFemale\tTrue\t\n\"WEST, Miss Constance Mirium\"\t2nd Class Passenger\tSouthampton\t\t27.75\t4\tFemale\tTrue\t\n\"WEST, Miss Barbara Joyce\"\t2nd Class Passenger\tSouthampton\t\t27.75\t0.833333333\tFemale\tTrue\t\n\"WHEADON, Mr Edward Henry\"\t2nd Class Passenger\tSouthampton\tFarmer\t10.5\t65\tMale\tFalse\t\n\"WHEELER, Mr Edwin Charles\"\t2nd Class Passenger\tSouthampton\tServant\t12.875\t24\tMale\tFalse\tServant\n\"WHILEMS, Mr Charles\"\t2nd Class Passenger\tSouthampton\tFactory Foreman\t13\t31\tMale\tTrue\t\n\"WILKINSON, Mrs Elizabeth Anne\"\t2nd Class Passenger\tSouthampton\t\t26\t35\tFemale\tTrue\t\n\"WILLIAMS, Mr Charles Eugene\"\t2nd Class Passenger\tSouthampton\tSportsman\t13\t23\tMale\tTrue\t\n\"WOODWARD, Mr John Wesley\"\t2nd Class Passenger\tSouthampton\tMusician\t0\t32\tMale\tFalse\tMusician\n\"WRIGHT, Miss Marion\"\t2nd Class Passenger\tSouthampton\t\t13.5\t26\tFemale\tTrue\t\n\"YVOIS, Miss Henriette\"\t2nd Class Passenger\tSouthampton\t\t13\t24\tFemale\tFalse\t\n\"ABBING, Mr Anthony\"\t3rd Class Passenger\tSouthampton\tBlacksmith\t7.55\t42\tMale\tFalse\t\n\"ABBOTT, Mrs Rhoda Mary 'Rosa'\"\t3rd Class Passenger\tSouthampton\t\t20.25\t39\tFemale\tTrue\t\n\"ABBOTT, Mr Rossmore Edward\"\t3rd Class Passenger\tSouthampton\tJeweller\t20.25\t16\tMale\tFalse\t\n\"ABBOTT, Mr Eugene Joseph\"\t3rd Class Passenger\tSouthampton\tScholar\t20.25\t14\tMale\tFalse\t\n\"ABELSETH, Miss Karen Marie\"\t3rd Class Passenger\tSouthampton\t\t7.65\t16\tFemale\tTrue\t\n\"ABELSETH, Mr Olaus J�rgensen\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.65\t25\tMale\tTrue\t\n\"ABRAHAMSSON, Mr Abraham August Johannes\"\t3rd Class Passenger\tSouthampton\t\t7.925\t20\tMale\tTrue\t\n\"ADAMS, Mr John\"\t3rd Class Passenger\tSouthampton\t\t8.05\t26\tMale\tFalse\t\n\"AHLIN, Mrs Johanna Persdotter\"\t3rd Class Passenger\tSouthampton\t\t9.475\t40\tFemale\tFalse\t\n\"AKS, Mrs Leah\"\t3rd Class Passenger\tSouthampton\t\t9.35\t18\tFemale\tTrue\t\n\"AKS, Master Frank Philip\"\t3rd Class Passenger\tSouthampton\t\t9.35\t0.833333333\tMale\tTrue\t\n\"ALBIMONA, Mr Nassef Cassem\"\t3rd Class Passenger\tCherbourg\t\t18.7875\t26\tMale\tTrue\t\n\"ALEXANDER, Mr William Albert\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.8875\t23\tMale\tFalse\t\n\"ALHOM�KI, Mr Ilmari Rudolf\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.925\t19\tMale\tFalse\t\n\"ALI, Mr Ahmed\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.05\t24\tMale\tFalse\t\n\"ALI, Mr William\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.05\t25\tMale\tFalse\t\n\"ALLEN, Mr William Henry\"\t3rd Class Passenger\tSouthampton\tTool Maker\t8.05\t38\tMale\tFalse\t\n\"ALLUM, Mr Owen George\"\t3rd Class Passenger\tSouthampton\tGardener\t8.3\t15\tMale\tFalse\t\n\"ANDERSEN, Mr Albert Karvin\"\t3rd Class Passenger\tSouthampton\tEngineer\t22.525\t33\tMale\tFalse\t\n\"ANDERSEN-JENSEN, Miss Carla Christine Nielsine\"\t3rd Class Passenger\tSouthampton\t\t7.854166667\t19\tFemale\tTrue\t\n\"ANDERSSON, Miss Erna Alexandra\"\t3rd Class Passenger\tSouthampton\t\t7.925\t17\tFemale\tTrue\t\n\"ANDERSSON, Mr Johan Samuel\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t26\tMale\tFalse\t\n\"ANDERSSON, Miss Ida Augusta Margareta\"\t3rd Class Passenger\tSouthampton\t\t7.775\t38\tFemale\tFalse\t\n\"ANDERSSON, Mr Anders Johan\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t31.275\t39\tMale\tFalse\t\n\"ANDERSSON, Mrs Alfrida Konstantia Brogren\"\t3rd Class Passenger\tSouthampton\t\t31.275\t39\tFemale\tFalse\t\n\"ANDERSSON, Miss Sigrid Elisabeth\"\t3rd Class Passenger\tSouthampton\t\t31.275\t11\tFemale\tFalse\t\n\"ANDERSSON, Miss Ingeborg Constanzia\"\t3rd Class Passenger\tSouthampton\t\t31.275\t9\tFemale\tFalse\t\n\"ANDERSSON, Miss Ebba Iris Alfrida\"\t3rd Class Passenger\tSouthampton\t\t31.275\t6\tFemale\tFalse\t\n\"ANDERSSON, Master Sigvard Harald Elias\"\t3rd Class Passenger\tSouthampton\t\t31.275\t4\tMale\tFalse\t\n\"ANDERSSON, Miss Ellis Anna Maria\"\t3rd Class Passenger\tSouthampton\t\t31.275\t2\tFemale\tFalse\t\n\"ANDREASSON, Mr P�l Edvin\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.854166667\t20\tMale\tFalse\t\n\"ANGHELOFF, Mr Minko\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t26\tMale\tFalse\t\n\"ARNOLD-FRANCHI, Mr Josef\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t17.8\t25\tMale\tFalse\t\n\"ARNOLD-FRANCHI, Mrs Josefine\"\t3rd Class Passenger\tSouthampton\t\t17.8\t18\tFemale\tFalse\t\n\"ARONSSON, Mr Ernst Axel Algot\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t24\tMale\tFalse\t\n\"ASIM, Mr Adola\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.05\t35\tMale\tFalse\t\n\"ASPLUND, Master Edvin Rojj Felix\"\t3rd Class Passenger\tSouthampton\t\t31.3875\t3\tMale\tTrue\t\n\"ASPLUND, Mr Johan Charles\"\t3rd Class Passenger\tSouthampton\t\t7.795833333\t23\tMale\tTrue\t\n\"ASPLUND, Mr Carl Oscar Vilhelm Gustafsson\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t31.3875\t40\tMale\tFalse\t\n\"ASPLUND, Mrs Selma Augusta Emilia\"\t3rd Class Passenger\tSouthampton\t\t31.3875\t38\tFemale\tTrue\t\n\"ASPLUND, Master Carl Edgar\"\t3rd Class Passenger\tSouthampton\t\t31.3875\t5\tMale\tFalse\t\n\"ASPLUND, Master Filip Oscar\"\t3rd Class Passenger\tSouthampton\t\t31.3875\t13\tMale\tFalse\t\n\"ASPLUND, Master Clarence Gustaf Hugo\"\t3rd Class Passenger\tSouthampton\t\t31.3875\t9\tMale\tFalse\t\n\"ASPLUND, Miss Lillian Gertrud\"\t3rd Class Passenger\tSouthampton\t\t31.3875\t5\tFemale\tTrue\t\n\"ASSAF, Mrs Mariana\"\t3rd Class Passenger\tCherbourg\t\t7.225\t45\tFemale\tTrue\t\n\"ASSAM, Mr Ali\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.05\t23\tMale\tFalse\t\n\"ATTALA, Mr Sleiman\"\t3rd Class Passenger\tCherbourg\tJournalist\t7.225\t27\tMale\tFalse\t\n\"ATTALAH, Miss Malake\"\t3rd Class Passenger\tCherbourg\t\t14.45833333\t17\tFemale\tFalse\t\n\"AUGUSTSSON, Mr Albert\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.854166667\t23\tMale\tFalse\t\n\"AYOUB DAHER, Miss Banoura\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t15\tFemale\tTrue\t\n\"�DAHL, Mr Nils Martin\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t9.225\t23\tMale\tFalse\t\n\"�HMAN, Miss Velin\"\t3rd Class Passenger\tSouthampton\t\t7.775\t22\tFemale\tTrue\t\n\"�DAHL, Mr Mauritz\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.25\t30\tMale\tFalse\t\n\"BACCOS, Mr Raffull\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t7.225\t20\tMale\tFalse\t\n\"BACKSTR�M, Mr Karl Alfred\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t15.85\t32\tMale\tFalse\t\n\"BACKSTR�M, Mrs Maria Mathilda\"\t3rd Class Passenger\tSouthampton\t\t15.85\t33\tFemale\tTrue\t\n\"BACLINI, Mrs Latifa\"\t3rd Class Passenger\tCherbourg\t\t19.25833333\t24\tFemale\tTrue\t\n\"BACLINI, Miss Marie Catherine\"\t3rd Class Passenger\tCherbourg\t\t19.25833333\t5\tFemale\tTrue\t\n\"BACLINI, Miss Eugenie\"\t3rd Class Passenger\tCherbourg\t\t19.25833333\t3\tFemale\tTrue\t\n\"BACLINI, Miss Helene Barbara\"\t3rd Class Passenger\tCherbourg\t\t19.25833333\t0.75\tFemale\tTrue\t\n\"BADMAN, Miss Emily Louisa\"\t3rd Class Passenger\tSouthampton\tServant\t8.05\t18\tFemale\tTrue\t\n\"BADT, Mr Mohamed\"\t3rd Class Passenger\tCherbourg\tFarmer\t7.225\t40\tMale\tFalse\t\n\"BALKIC, Mr Cerin\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t26\tMale\tFalse\t\n\"BANSKI, Mrs Mara\"\t3rd Class Passenger\tSouthampton\t\t8.683333333\t31\tFemale\tTrue\t\n\"BARBARA, Mrs Catherine David\"\t3rd Class Passenger\tCherbourg\tHousekeeper\t14.45416667\t45\tFemale\tFalse\t\n\"BARBARA, Miss Saiide\"\t3rd Class Passenger\tCherbourg\tHousekeeper\t14.45416667\t18\tFemale\tFalse\t\n\"BARRY, Miss Julia\"\t3rd Class Passenger\tQueenstown\tHousekeeper\t7.879166667\t26\tFemale\tFalse\t\n\"BARTON, Mr David John\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.05\t22\tMale\tFalse\t\n\"BATOSHEV, Mr Hristo Lalev\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t23\tMale\tFalse\t\n\"BEAVAN, Mr William Thomas\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.05\t20\tMale\tFalse\t\n\"BENGTSSON, Mr Johan Viktor\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t26\tMale\tFalse\t\n\"BERGLUND, Mr Karl Ivar Sven\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t9.35\t22\tMale\tFalse\t\n\"BING, Mr Lee\"\t3rd Class Passenger\tSouthampton\tSeaman\t56.49583333\t32\tMale\tTrue\t\n\"BIRKELAND, Mr Hans Martin Monsen\"\t3rd Class Passenger\tSouthampton\tSeaman\t7.775\t21\tMale\tFalse\t\n\"BJ�RKLUND, Mr Ernst Herbert\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.75\t18\tMale\tFalse\t\n\"BOSTANDYEFF, Mr Guentcho\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t26\tMale\tFalse\t\n\"BOULOS, Mrs Sultana\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t40\tFemale\tFalse\t\n\"BOULOS, Miss Nourelain\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t7\tFemale\tFalse\t\n\"BOULOS, Master Akar\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t9\tMale\tFalse\t\n\"BOURKE, Mr John\"\t3rd Class Passenger\tQueenstown\tFarmer\t15.5\t42\tMale\tFalse\t\n\"BOURKE, Mrs Catherine\"\t3rd Class Passenger\tQueenstown\tHousewife\t15.5\t32\tFemale\tFalse\t\n\"BOURKE, Miss Mary\"\t3rd Class Passenger\tQueenstown\t\t7.75\t40\tFemale\tFalse\t\n\"BOWEN, Mr David John 'Dai'\"\t3rd Class Passenger\tSouthampton\tPugilist\t16.1\t26\tMale\tFalse\t\n\"BRADLEY, Miss Bridget Delia\"\t3rd Class Passenger\tQueenstown\t\t7.725\t22\tFemale\tTrue\t\n\"BRAF, Miss Elin Ester Maria\"\t3rd Class Passenger\tSouthampton\tServant\t7.854166667\t20\tFemale\tFalse\t\n\"BRAUND, Mr Lewis Richard\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t7.55\t29\tMale\tFalse\t\n\"BRAUND, Mr Owen Harris\"\t3rd Class Passenger\tSouthampton\tIronmonger\t7.25\t22\tMale\tFalse\t\n\"BROB�CK, Mr Karl Rudolf\"\t3rd Class Passenger\tSouthampton\tDecorator\t7.795833333\t22\tMale\tFalse\t\n\"BROCKLEBANK, Mr William Alfred\"\t3rd Class Passenger\tSouthampton\tGroom\t8.05\t35\tMale\tFalse\t\n\"BUCKLEY, Mr Daniel\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.820833333\t21\tMale\tTrue\t\n\"BUCKLEY, Miss Katherine\"\t3rd Class Passenger\tQueenstown\t\t7.283333333\t22\tFemale\tFalse\t\n\"BURKE, Mr Jeremiah\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t6.75\t19\tMale\tFalse\t\n\"BURNS, Miss Mary Delia\"\t3rd Class Passenger\tQueenstown\t\t7.879166667\t17\tFemale\tFalse\t\n\"BUTRUS-KA'W?, Mr Tann?s\"\t3rd Class Passenger\tCherbourg\tShoemaker\t7.229166667\t21\tMale\tFalse\t\n\"CACIC, Mr Jego Grga\"\t3rd Class Passenger\tSouthampton\tFarmer\t8.6625\t18\tMale\tFalse\t\n\"CACIC, Mr Luka\"\t3rd Class Passenger\tSouthampton\tFarmer\t8.6625\t38\tMale\tFalse\t\n\"CACIC, Miss Marija\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t8.6625\t30\tFemale\tFalse\t\n\"CACIC, Miss Manda\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t8.6625\t21\tFemale\tFalse\t\n\"CALIC, Mr Petar\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t8.6625\t17\tMale\tFalse\t\n\"CALIC, Mr Jovo\"\t3rd Class Passenger\tSouthampton\t\t8.6625\t17\tMale\tFalse\t\n\"CANAVAN, Miss Mary\"\t3rd Class Passenger\tQueenstown\t\t7.75\t22\tFemale\tFalse\t\n\"CANAVAN, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t21\tMale\tFalse\t\n\"CANN, Mr Ernest\"\t3rd Class Passenger\tSouthampton\tMiner\t8.05\t21\tMale\tFalse\t\n\"CARAM, Mr Joseph\"\t3rd Class Passenger\tCherbourg\tMerchant\t14.45833333\t28\tMale\tFalse\t\n\"CARAM, Mrs Maria Elias\"\t3rd Class Passenger\tCherbourg\tHousekeeper\t14.45833333\t18\tFemale\tFalse\t\n\"CARLSSON, Mr Carl Robert\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.854166667\t24\tMale\tFalse\t\n\"CARLSSON, Mr August Sigfrid\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.795833333\t28\tMale\tFalse\t\n\"CARR, Miss Jane\"\t3rd Class Passenger\tQueenstown\t\t7.75\t45\tFemale\tFalse\t\n\"CARVER, Mr Alfred John\"\t3rd Class Passenger\tSouthampton\tSeaman\t7.25\t28\tMale\tFalse\t\n\"CELOTTI, Mr Francesco\"\t3rd Class Passenger\tSouthampton\tStoker\t8.05\t24\tMale\tFalse\t\n\"CHARTERS, Mr David\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.733333333\t20\tMale\tFalse\t\n\"CHIP, Mr Chang\"\t3rd Class Passenger\tSouthampton\tSeaman\t56.49583333\t32\tMale\tTrue\t\n\"CHRISTMANN, Mr Emil\"\t3rd Class Passenger\tSouthampton\tClerk\t8.05\t29\tMale\tFalse\t\n\"CHRONOPOULOS, Mr Apostolos M.\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t14.45416667\t26\tMale\tFalse\t\n\"CHRONOPOULOS, Mr Dimitrios M.\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t14.45416667\t21\tMale\tFalse\t\n\"COELHO, Mr Domingos Fernandeo\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.05\t20\tMale\tFalse\t\n\"COHEN, Mr Gurshon\"\t3rd Class Passenger\tSouthampton\tPrinter / Compositor\t8.05\t18\tMale\tTrue\t\n\"COLBERT, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.25\t24\tMale\tFalse\t\n\"COLEFF, Mr Satio\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t24\tMale\tFalse\t\n\"COLTCHEFF, Mr Peju\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t36\tMale\tFalse\t\n\"CONLIN, Mr Thomas Henry\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.733333333\t31\tMale\tFalse\t\n\"CONNAUGHTON, Mr Michael\"\t3rd Class Passenger\tQueenstown\tBus Driver\t7.75\t40\tMale\tFalse\t\n\"CONNOLLY, Miss Catherine\"\t3rd Class Passenger\tQueenstown\t\t7.75\t23\tFemale\tTrue\t\n\"CONNOLLY, Miss Kate\"\t3rd Class Passenger\tQueenstown\t\t7.629166667\t41\tFemale\tFalse\t\n\"CONNORS, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t66\tMale\tFalse\t\n\"COOK, Mr Jacob\"\t3rd Class Passenger\tSouthampton\tWood Carver\t8.05\t43\tMale\tFalse\t\n\"COR, Mr Bartol\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t35\tMale\tFalse\t\n\"COR, Mr Ivan\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t27\tMale\tFalse\t\n\"COR, Mr Liudevit\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t19\tMale\tFalse\t\n\"CORN, Mr Harry\"\t3rd Class Passenger\tSouthampton\tUpholsterer\t8.05\t30\tMale\tFalse\t\n\"CORR, Miss Helen\"\t3rd Class Passenger\tQueenstown\t\t7.75\t16\tFemale\tTrue\t\n\"COUTTS, Mrs Winnie\"\t3rd Class Passenger\tSouthampton\t\t15.9\t36\tFemale\tTrue\t\n\"COUTTS, Master William Loch\"\t3rd Class Passenger\tSouthampton\t\t15.9\t9\tMale\tTrue\t\n\"COUTTS, Master Neville Leslie\"\t3rd Class Passenger\tSouthampton\t\t15.9\t3\tMale\tTrue\t\n\"COXON, Mr Daniel\"\t3rd Class Passenger\tSouthampton\tDealer\t7.25\t59\tMale\tFalse\t\n\"CREASE, Mr Ernest James\"\t3rd Class Passenger\tSouthampton\tTinsmith\t8.158333333\t19\tMale\tFalse\t\n\"CRIBB, Mr John Hatfield\"\t3rd Class Passenger\tSouthampton\tButler\t16.1\t44\tMale\tFalse\t\n\"CRIBB, Miss Laura Mae\"\t3rd Class Passenger\tSouthampton\tShop Assistant\t16.1\t16\tFemale\tTrue\t\n\"CULUMOVIC, Mr Jeso\"\t3rd Class Passenger\tSouthampton\t\t8.6625\t17\tMale\tFalse\t\n\"DAHER, Mr Tannous\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t28\tMale\tFalse\t\n\"DAHL, Mr Charles Edward\"\t3rd Class Passenger\tSouthampton\tCarpenter / Joiner\t8.05\t45\tMale\tTrue\t\n\"DAHLBERG, Miss Gerda Ulrika\"\t3rd Class Passenger\tSouthampton\t\t10.51666667\t22\tFemale\tFalse\t\n\"DAKIC, Mr Branko\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t10.17083333\t19\tMale\tFalse\t\n\"DALY, Miss Margaret Marcella\"\t3rd Class Passenger\tQueenstown\tHousekeeper\t6.95\t33\tFemale\tTrue\t\n\"DALY, Mr Eugene Patrick\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t29\tMale\tTrue\t\n\"DANBOM, Mr Ernst Gilbert\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t14.4\t34\tMale\tFalse\t\n\"DANBOM, Mrs Anna Sigrid Maria\"\t3rd Class Passenger\tSouthampton\t\t14.4\t28\tFemale\tFalse\t\n\"DANBOM, Master Gilbert Sigvard Emanuel\"\t3rd Class Passenger\tSouthampton\t\t14.4\t0.333333333\tMale\tFalse\t\n\"DANOFF, Mr Yoto\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t27\tMale\tFalse\t\n\"DAVIES, Mr Evan\"\t3rd Class Passenger\tSouthampton\tMiner\t8.05\t22\tMale\tFalse\t\n\"DAVIES, Mr Alfred James\"\t3rd Class Passenger\tSouthampton\tCaster\t24.15\t24\tMale\tFalse\t\n\"DAVIES, Mr John\"\t3rd Class Passenger\tSouthampton\tIronworker\t24.15\t21\tMale\tFalse\t\n\"DAVIES, Mr Joseph\"\t3rd Class Passenger\tSouthampton\tIronworker\t8.05\t17\tMale\tFalse\t\n\"DAVISON, Mr Thomas Henry\"\t3rd Class Passenger\tSouthampton\tBlacksmith\t16.1\t32\tMale\tFalse\t\n\"DAVISON, Mrs Mary Elizabeth\"\t3rd Class Passenger\tSouthampton\t\t16.1\t34\tFemale\tTrue\t\n\"DE MESSEMAEKER, Mr Guillaume Joseph\"\t3rd Class Passenger\tSouthampton\t\t17.4\t36\tMale\tTrue\t\n\"DE MESSEMAEKER, Mrs Anna\"\t3rd Class Passenger\tSouthampton\t\t17.4\t36\tFemale\tTrue\t\n\"DE MULDER, Mr Theodoor\"\t3rd Class Passenger\tSouthampton\t\t9.5\t30\tMale\tTrue\t\n\"DE PELSMAEKER, Mr Alfons\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t9.5\t16\tMale\tFalse\t\n\"DEAN, Mr Bertram Frank\"\t3rd Class Passenger\tSouthampton\tFarmer\t20.575\t25\tMale\tFalse\t\n\"DEAN, Mrs Eva Georgetta\"\t3rd Class Passenger\tSouthampton\t\t20.575\t32\tFemale\tTrue\t\n\"DEAN, Master Bertram Vere\"\t3rd Class Passenger\tSouthampton\t\t20.575\t1\tMale\tTrue\t\n\"DEAN, Miss Elizabeth Gladys 'Millvina'\"\t3rd Class Passenger\tSouthampton\t\t20.575\t0.166666667\tFemale\tTrue\t\n\"DELALIC, Mr Redjo\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t25\tMale\tFalse\t\n\"DENKOFF, Mr Mitto\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t30\tMale\tFalse\t\n\"DENNIS, Mr Samuel\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.25\t22\tMale\tFalse\t\n\"DENNIS, Mr William\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.25\t26\tMale\tFalse\t\n\"DEVANEY, Miss Margaret Delia\"\t3rd Class Passenger\tQueenstown\t\t7.879166667\t19\tFemale\tTrue\t\n\"DIKA, Mr Mirko\"\t3rd Class Passenger\tSouthampton\t\t7.895833333\t17\tMale\tFalse\t\n\"DIMIC, Mr Jovan\"\t3rd Class Passenger\tSouthampton\t\t8.6625\t42\tMale\tFalse\t\n\"DINTCHEFF, Mr Valtcho\"\t3rd Class Passenger\tSouthampton\t\t7.895833333\t43\tMale\tFalse\t\n\"DONOHOE, Miss Bridget\"\t3rd Class Passenger\tQueenstown\t\t7.75\t21\tFemale\tFalse\t\n\"DOOLY, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t38\tMale\tFalse\t\n\"DORKING, Mr Edward Arthur\"\t3rd Class Passenger\tSouthampton\tGroom\t8.05\t18\tMale\tTrue\t\n\"DOUGHERTY, Mr William John\"\t3rd Class Passenger\tQueenstown\t\t8.458333333\t22\tMale\tFalse\t\n\"DOWDELL, Miss Elizabeth\"\t3rd Class Passenger\tSouthampton\tHousekeeper\t12.475\t31\tFemale\tTrue\t\n\"DOYLE, Miss Elizabeth\"\t3rd Class Passenger\tQueenstown\t\t7.75\t28\tFemale\tFalse\t\n\"DRAZENOVIC, Mr Jozef\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.895833333\t33\tMale\tFalse\t\n\"DRISCOLL, Miss Bridget\"\t3rd Class Passenger\tQueenstown\t\t7.75\t27\tFemale\tTrue\t\n\"DROPKIN, Miss Jennie\"\t3rd Class Passenger\tSouthampton\tBox Maker\t8.05\t24\tFemale\tTrue\t\n\"DUQUEMIN, Mr Joseph Pierre\"\t3rd Class Passenger\tSouthampton\tMason\t7.55\t24\tMale\tTrue\t\n\"DWAN, Mr Frank\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t65\tMale\tFalse\t\n\"DYKER, Mr Adolf Fredrik\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t13.9\t23\tMale\tFalse\t\n\"DYKER, Mrs Anna Elisabeth Judith\"\t3rd Class Passenger\tSouthampton\t\t13.9\t22\tFemale\tTrue\t\n\"EDVARDSSON, Mr Gustaf Hjalmar\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t18\tMale\tFalse\t\n\"EKLUND, Mr Hans Linus\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t16\tMale\tFalse\t\n\"EKSTR�M, Mr Amandus\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t6.975\t45\tMale\tFalse\t\n\"ELIAS, Mr Dibo\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.225\t29\tMale\tFalse\t\n\"ELIAS, Mr Joseph jr.\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.229166667\t15\tMale\tFalse\t\n\"ELIAS NASRALLAH, Mr Tannous\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.229166667\t22\tMale\tFalse\t\n\"ELSBURY, Mr William James\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.25\t48\tMale\tFalse\t\n\"EMANUEL, Miss Virginia Ethel\"\t3rd Class Passenger\tSouthampton\t\t12.475\t5\tFemale\tTrue\t\n\"ESTANISLAU, Mr Manuel Gon�alves\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.05\t37\tMale\tFalse\t\n\"EVERETT, Mr Thomas James\"\t3rd Class Passenger\tSouthampton\tCrane Operator\t15.1\t38\tMale\tFalse\t\n\"FARDON, Mr Charles Richard\"\t3rd Class Passenger\tSouthampton\tCarpenter / Joiner\t7.25\t45\tMale\tFalse\t\n\"FARRELL, Mr James\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t25\tMale\tFalse\t\n\"FINOLI, Mr Luigi\"\t3rd Class Passenger\tSouthampton\t\t7.05\t34\tMale\tTrue\t\n\"FISCHER, Mr Eberhard Thelander\"\t3rd Class Passenger\tSouthampton\t\t7.795833333\t18\tMale\tFalse\t\n\"FLEMING, Miss Honor\"\t3rd Class Passenger\tQueenstown\t\t7.75\t22\tFemale\tFalse\t\n\"FLYNN, Mr James\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t28\tMale\tFalse\t\n\"FLYNN, Mr John\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t6.95\t42\tMale\tFalse\t\n\"FOLEY, Mr Joseph\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.879166667\t19\tMale\tFalse\t\n\"FOLEY, Mr William\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t20\tMale\tFalse\t\n\"FOO, Mr Choong\"\t3rd Class Passenger\tSouthampton\tSeaman\t56.49583333\t32\tMale\tTrue\t\n\"FORD, Mr Arthur\"\t3rd Class Passenger\tSouthampton\tCarpenter / Joiner\t8.05\t22\tMale\tFalse\t\n\"FORD, Mrs Margaret Ann Watson\"\t3rd Class Passenger\tSouthampton\tFarmer\t34.375\t20\tFemale\tFalse\t\n\"FORD, Miss Dollina Margaret\"\t3rd Class Passenger\tSouthampton\tServant\t34.375\t54\tFemale\tFalse\t\n\"FORD, Mr Edward Watson\"\t3rd Class Passenger\tSouthampton\tBlacksmith\t34.375\t18\tMale\tFalse\t\n\"FORD, Mr William Neal Thomas\"\t3rd Class Passenger\tSouthampton\tMessenger\t34.375\t16\tMale\tFalse\t\n\"FORD, Miss Robina Maggie\"\t3rd Class Passenger\tSouthampton\t\t34.375\t7\tFemale\tFalse\t\n\"FOX, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t28\tMale\tFalse\t\n\"GALLAGHER, Mr Martin\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.741666667\t29\tMale\tFalse\t\n\"GARFIRTH, Mr John\"\t3rd Class Passenger\tSouthampton\tShoemaker\t14.5\t21\tMale\tFalse\t\n\"GEORGE/JOSEPH, Mrs Shawneene\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t38\tFemale\tTrue\t\n\"GERIOS THAMAH, Mr Assaf\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t7.225\t21\tMale\tFalse\t\n\"GHEORGHEFF, Mr Stanio\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.895833333\t0\tMale\tFalse\t\n\"GILINSKI, Mr Eliezer\"\t3rd Class Passenger\tSouthampton\tLocksmith\t8.05\t22\tMale\tFalse\t\n\"GILNAGH, Miss Katherine\"\t3rd Class Passenger\tQueenstown\t\t7.733333333\t17\tFemale\tTrue\t\n\"GLYNN, Miss Mary Agatha\"\t3rd Class Passenger\tQueenstown\t\t7.75\t19\tFemale\tTrue\t\n\"GOLDSMITH, Mr Frank John\"\t3rd Class Passenger\tSouthampton\tTurner\t20.525\t33\tMale\tFalse\t\n\"GOLDSMITH, Mrs Emily Alice\"\t3rd Class Passenger\tSouthampton\t\t20.525\t31\tFemale\tTrue\t\n\"GOLDSMITH, Master Frank John William\"\t3rd Class Passenger\tSouthampton\t\t20.525\t9\tMale\tTrue\t\n\"GOLDSMITH, Mr Nathan\"\t3rd Class Passenger\tSouthampton\tShoemaker\t7.85\t41\tMale\tFalse\t\n\"GOODWIN, Mr Frederick Joseph\"\t3rd Class Passenger\tSouthampton\tEngineer\t46.9\t42\tMale\tFalse\t\n\"GOODWIN, Mrs Augusta\"\t3rd Class Passenger\tSouthampton\t\t46.9\t43\tFemale\tFalse\t\n\"GOODWIN, Miss Lillian Amy\"\t3rd Class Passenger\tSouthampton\tServant\t46.9\t16\tFemale\tFalse\t\n\"GOODWIN, Mr Charles Edward\"\t3rd Class Passenger\tSouthampton\tScholar\t46.9\t14\tMale\tFalse\t\n\"GOODWIN, Master William Frederick\"\t3rd Class Passenger\tSouthampton\t\t46.9\t11\tMale\tFalse\t\n\"GOODWIN, Miss Jessie Allis\"\t3rd Class Passenger\tSouthampton\t\t46.9\t10\tFemale\tFalse\t\n\"GOODWIN, Master Harold Victor\"\t3rd Class Passenger\tSouthampton\t\t46.9\t9\tMale\tFalse\t\n\"GOODWIN, Master Sidney Leslie\"\t3rd Class Passenger\tSouthampton\t\t46.9\t1\tMale\tFalse\t\n\"GR�NNESTAD, Mr Daniel Danielsen\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.3625\t32\tMale\tFalse\t\n\"GREEN, Mr George\"\t3rd Class Passenger\tSouthampton\tFarrier\t8.05\t40\tMale\tFalse\t\n\"GUEST, Mr Robert\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.05\t23\tMale\tFalse\t\n\"GUSTAFSSON, Mr Karl Gideon\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t19\tMale\tFalse\t\n\"GUSTAFSSON, Mr Alfred Ossian\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t9.845833333\t19\tMale\tFalse\t\n\"GUSTAFSSON, Mr Anders Vilhelm\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.925\t37\tMale\tFalse\t\n\"GUSTAFSSON, Mr Johan Birger\"\t3rd Class Passenger\tSouthampton\t\t7.925\t28\tMale\tFalse\t\n\"HAAS, Miss Aloisia\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.85\t24\tFemale\tFalse\t\n\"HAGLAND, Mr Ingvald Olai Olsen\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t6.966666667\t28\tMale\tFalse\t\n\"HAGLAND, Mr Konrad Mathias Reiersen\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t6.966666667\t19\tMale\tFalse\t\n\"HAKKARAINEN, Mr Pekka Pietari\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t15.85\t28\tMale\tFalse\t\n\"HAKKARAINEN, Mrs Elin Matilda\"\t3rd Class Passenger\tSouthampton\t\t15.85\t24\tFemale\tTrue\t\n\"HAMPE, Mr L�on J�rome\"\t3rd Class Passenger\tSouthampton\tPainter & Decorator\t9.5\t19\tMale\tFalse\t\n\"HANNA, Mr Boulos\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.225\t18\tMale\tFalse\t\n\"HANNA, Mr Mansour\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t35\tMale\tFalse\t\n\"HANNAH, Mr Borak (\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t27\tMale\tTrue\t\n\"HANSEN, Mr Claus Peter\"\t3rd Class Passenger\tSouthampton\tBarber\t14.10833333\t41\tMale\tFalse\t\n\"HANSEN, Mrs Jennie Louise\"\t3rd Class Passenger\tSouthampton\t\t14.10833333\t45\tFemale\tTrue\t\n\"HANSEN, Mr Henry Damsgaard\"\t3rd Class Passenger\tSouthampton\tManufacturer\t7.854166667\t21\tMale\tFalse\t\n\"HANSEN, Mr Henrik Juul\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.854166667\t26\tMale\tFalse\t\n\"HARGADON, Miss Catherine\"\t3rd Class Passenger\tQueenstown\tCook\t7.733333333\t17\tFemale\tFalse\t\n\"HARKNETT, Miss Alice Phoebe\"\t3rd Class Passenger\tSouthampton\tDomestic Kitchen Servant\t7.55\t21\tFemale\tFalse\t\n\"HART, Mr Henry\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t6.858333333\t28\tMale\tFalse\t\n\"HASSAN ABILMONA, Mr Houssein Mohamed\"\t3rd Class Passenger\tCherbourg\t\t18.7875\t11\tMale\tFalse\t\n\"HEALY, Miss Honor\"\t3rd Class Passenger\tQueenstown\t\t7.75\t29\tFemale\tTrue\t\n\"HEDMAN, Mr Oskar Arvid\"\t3rd Class Passenger\tSouthampton\tSettler Recruiter\t6.975\t27\tMale\tTrue\t\n\"HEE, Mr Ling\"\t3rd Class Passenger\tSouthampton\tSeaman\t56.49583333\t24\tMale\tTrue\t\n\"HEGARTY, Miss Hanora\"\t3rd Class Passenger\tQueenstown\t\t6.75\t18\tFemale\tFalse\t\n\"HEIKKINEN, Miss Laina\"\t3rd Class Passenger\tSouthampton\t\t7.925\t26\tFemale\tTrue\t\n\"HEININEN, Miss Wendla Maria\"\t3rd Class Passenger\tSouthampton\tServant\t7.925\t23\tFemale\tFalse\t\n\"HELLSTR�M, Miss Hilda Maria\"\t3rd Class Passenger\tSouthampton\t\t8.9625\t22\tFemale\tTrue\t\n\"HENDEKOVIC, Mr Ignjac\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t28\tMale\tFalse\t\n\"HENRIKSSON, Miss Jenny Lovisa\"\t3rd Class Passenger\tSouthampton\tServant\t7.775\t28\tFemale\tFalse\t\n\"HENRY, Miss Bridget Delia\"\t3rd Class Passenger\tQueenstown\t\t7.75\t21\tFemale\tFalse\t\n\"HIRVONEN, Mrs Helga Elisabeth Lindqvist\"\t3rd Class Passenger\tSouthampton\t\t12.2875\t22\tFemale\tTrue\t\n\"HIRVONEN, Miss Hildur Elisabeth\"\t3rd Class Passenger\tSouthampton\t\t12.2875\t2\tFemale\tTrue\t\n\"HOLM, Mr John Fredrik Alexander\"\t3rd Class Passenger\tSouthampton\tFarmer\t6.45\t43\tMale\tFalse\t\n\"HOLTHEN, Mr Johan Martin\"\t3rd Class Passenger\tSouthampton\tSeaman\t22.525\t28\tMale\tFalse\t\n\"HONKANEN, Miss Eliina\"\t3rd Class Passenger\tSouthampton\t\t7.925\t27\tFemale\tTrue\t\n\"HORGAN, Mr John\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t22\tMale\tFalse\t\n\"HOWARD, Miss May Elizabeth\"\t3rd Class Passenger\tSouthampton\tLaundry Worker\t8.05\t26\tFemale\tTrue\t\n\"HUMBLEN, Mr Adolf Mathias Nicolai Olsen\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.65\t42\tMale\tFalse\t\n\"HYMAN, Mr Abraham Joseph\"\t3rd Class Passenger\tSouthampton\tFramer\t7.8875\t34\tMale\tTrue\t\n\"IBRAHIM SHAWAH, Mr Yousseff\"\t3rd Class Passenger\tCherbourg\t\t14.45833333\t33\tMale\tFalse\t\n\"IBR?H?M, Mrs S?fiyah\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t18\tFemale\tTrue\t\n\"ILIEFF, Mr Ylio\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t32\tMale\tFalse\t\n\"ILMAKANGAS, Miss Ida Livija\"\t3rd Class Passenger\tSouthampton\tServant\t7.925\t27\tFemale\tFalse\t\n\"ILMAKANGAS, Miss Pieta Sofia\"\t3rd Class Passenger\tSouthampton\tServant\t7.925\t25\tFemale\tFalse\t\n\"IVANOFF, Mr Kanio\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t20\tMale\tFalse\t\n\"JABBUR (ZABOUR), Miss Thamine\"\t3rd Class Passenger\tCherbourg\tHousekeeper\t14.45416667\t19\tFemale\tFalse\t\n\"JABBUR (ZABOUR), Miss Hileni\"\t3rd Class Passenger\tCherbourg\tHousekeeper\t14.45416667\t16\tFemale\tFalse\t\n\"JAL�EVAC, Mr Ivan\"\t3rd Class Passenger\tCherbourg\t\t7.895833333\t29\tMale\tTrue\t\n\"JANSSON, Mr Carl Olof\"\t3rd Class Passenger\tSouthampton\t\t7.795833333\t21\tMale\tTrue\t\n\"JARDIM, Mr Jos� Neto\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.05\t21\tMale\tFalse\t\n\"J�NSSON, Mr Nils Hilding\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.854166667\t27\tMale\tFalse\t\n\"JENSEN, Mr Hans Peder\"\t3rd Class Passenger\tSouthampton\t\t7.854166667\t20\tMale\tFalse\t\n\"JENSEN, Mr Svend Lauritz\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.854166667\t17\tMale\tFalse\t\n\"JENSEN, Mr Niels Peder\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.054166667\t48\tMale\tFalse\t\n\"JERMYN, Miss Annie Jane\"\t3rd Class Passenger\tQueenstown\t\t7.75\t26\tFemale\tTrue\t\n\"JOHANNESEN, Mr Bernt Johannes\"\t3rd Class Passenger\tSouthampton\t\t8.1125\t29\tMale\tTrue\t\n\"JOHANSON, Mr Jakob Alfred\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t6.495833333\t34\tMale\tFalse\t\n\"JOHANSSON, Mr Nils\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.854166667\t29\tMale\tFalse\t\n\"JOHANSSON, Mr Erik\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.795833333\t22\tMale\tFalse\t\n\"JOHANSSON, Mr Gustaf Joel\"\t3rd Class Passenger\tSouthampton\t\t8.654166667\t33\tMale\tFalse\t\n\"JOHANSSON, Mr Karl Johan\"\t3rd Class Passenger\tSouthampton\t\t7.775\t31\tMale\tFalse\t\n\"JOHANSSON PALMQUIST, Mr Oskar Leander\"\t3rd Class Passenger\tSouthampton\t\t7.775\t26\tMale\tTrue\t\n\"JOHNSON, Mr August\"\t3rd Class Passenger\tSouthampton\tSeaman\t0\t49\tMale\tFalse\t\n\"JOHNSON, Mr William Cahoone Jr.\"\t3rd Class Passenger\tSouthampton\tSeaman\t0\t19\tMale\tFalse\t\n\"JOHNSON, Mr Malkolm Joackim\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t33\tMale\tFalse\t\n\"JOHNSON, Mrs Elisabeth Vilhelmina\"\t3rd Class Passenger\tSouthampton\t\t11.13333333\t26\tFemale\tTrue\t\n\"JOHNSON, Master Harold Theodor\"\t3rd Class Passenger\tSouthampton\t\t11.13333333\t4\tMale\tTrue\t\n\"JOHNSON, Miss Eleanor Ileen\"\t3rd Class Passenger\tSouthampton\t\t11.13333333\t1\tFemale\tTrue\t\n\"JOHNSTON, Mr Andrew Emslie\"\t3rd Class Passenger\tSouthampton\tPlumber\t23.45\t35\tMale\tFalse\t\n\"JOHNSTON, Mrs Eliza\"\t3rd Class Passenger\tSouthampton\t\t23.45\t36\tFemale\tFalse\t\n\"JOHNSTON, Master William Andrew\"\t3rd Class Passenger\tSouthampton\t\t23.45\t8\tMale\tFalse\t\n\"JOHNSTON, Miss Catherine Nellie\"\t3rd Class Passenger\tSouthampton\t\t23.45\t7\tFemale\tFalse\t\n\"JONKOFF, Mr Lalio\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t23\tMale\tFalse\t\n\"JONSSON, Mr Carl\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.854166667\t25\tMale\tTrue\t\n\"JOSEPH (SHAHIN), Mr Elias\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t39\tMale\tFalse\t\n\"JUSSILA, Miss Katriina\"\t3rd Class Passenger\tSouthampton\tServant\t9.841666667\t20\tFemale\tFalse\t\n\"JUSSILA, Miss Mari Aina\"\t3rd Class Passenger\tSouthampton\tServant\t9.841666667\t21\tFemale\tFalse\t\n\"JUSSILA, Mr Eiriik\"\t3rd Class Passenger\tSouthampton\t\t7.925\t32\tMale\tTrue\t\n\"KALLIO, Mr Nikolai Erland\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.125\t17\tMale\tFalse\t\n\"KALVIK, Mr Johannes Halvorsen\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.433333333\t21\tMale\tFalse\t\n\"KARAJIC, Mr Milan\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t30\tMale\tFalse\t\n\"KARLSSON, Mr Einar Gervasius\"\t3rd Class Passenger\tSouthampton\tMilitary\t7.795833333\t21\tMale\tTrue\t\n\"KARLSSON, Mr Julius Konrad Eugen\"\t3rd Class Passenger\tSouthampton\tEngineer\t7.854166667\t33\tMale\tFalse\t\n\"KARLSSON, Mr Nils August\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.520833333\t22\tMale\tFalse\t\n\"KARUN, Mr Franz\"\t3rd Class Passenger\tCherbourg\tHotelier\t13.41666667\t39\tMale\tTrue\t\n\"KARUN, Miss Manca\"\t3rd Class Passenger\tCherbourg\t\t13.41666667\t4\tFemale\tTrue\t\n\"KASSEM HOUSSEIN, Mr Fared\"\t3rd Class Passenger\tCherbourg\tFarmer\t7.229166667\t18\tMale\tFalse\t\n\"KATAVELOS, Mr Vasilios G.\"\t3rd Class Passenger\tCherbourg\tFarmer\t7.229166667\t19\tMale\tFalse\t\n\"KEANE, Mr Andrew\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t23\tMale\tFalse\t\n\"KEEFE, Mr Arthur\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.25\t39\tMale\tFalse\t\n\"KELLY, Mr James\"\t3rd Class Passenger\tSouthampton\tPainter & Decorator\t8.05\t19\tMale\tFalse\t\n\"KELLY, Mr James\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.829166667\t44\tMale\tFalse\t\n\"KELLY, Miss Anna Katherine\"\t3rd Class Passenger\tQueenstown\t\t7.75\t20\tFemale\tTrue\t\n\"KELLY, Miss Mary\"\t3rd Class Passenger\tQueenstown\t\t7.75\t22\tFemale\tTrue\t\n\"KENNEDY, Mr John\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t24\tMale\tTrue\t\n\"KHALIL, Mr Betros\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t14.45416667\t25\tMale\tFalse\t\n\"KHALIL, Mrs Zahie\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t14.45416667\t20\tFemale\tFalse\t\n\"KIERNAN, Mr John Joseph\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t25\tMale\tFalse\t\n\"KIERNAN, Mr Philip\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t22\tMale\tFalse\t\n\"KILGANNON, Mr Thomas\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.7375\t22\tMale\tFalse\t\n\"KINK, Mr Anton\"\t3rd Class Passenger\tSouthampton\t\t22.3\t29\tMale\tTrue\t\n\"KINK, Miss Maria\"\t3rd Class Passenger\tSouthampton\t\t8.6625\t22\tFemale\tFalse\t\n\"KINK, Mr Vincenz\"\t3rd Class Passenger\tSouthampton\tMagazineer\t8.6625\t26\tMale\tFalse\t\n\"KINK-HEILMANN, Mrs Luise\"\t3rd Class Passenger\tSouthampton\t\t22.3\t26\tFemale\tTrue\t\n\"KINK-HEILMANN, Miss Luise Gretchen\"\t3rd Class Passenger\tSouthampton\t\t22.3\t4\tFemale\tTrue\t\n\"KLAS�N, Mr Klas Albin\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t7.854166667\t18\tMale\tFalse\t\n\"KLAS�N, Miss Gertrud Emilia\"\t3rd Class Passenger\tSouthampton\t\t12.18333333\t1\tFemale\tFalse\t\n\"KLAS�N, Mrs Hulda Kristina Eugenia\"\t3rd Class Passenger\tSouthampton\tHousewife\t12.18333333\t36\tFemale\tFalse\t\n\"KRAEFF, Mr Theodor\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.895833333\t0\tMale\tFalse\t\n\"KREKORIAN, Mr Neshan\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.229166667\t25\tMale\tTrue\t\n\"KUTSCHER (LITHMAN), Mr Simon\"\t3rd Class Passenger\tSouthampton\tBaker\t7.55\t26\tMale\tFalse\t\n\"LAHH?D ISHAQ MU'AWWAD, Mr Sark?s\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.225\t30\tMale\tFalse\t\n\"LAITINEN, Miss Kristina Sofia\"\t3rd Class Passenger\tSouthampton\tHousekeeper\t9.5875\t37\tFemale\tFalse\t\n\"LAM, Mr Ali\"\t3rd Class Passenger\tSouthampton\tSeaman\t56.49583333\t38\tMale\tTrue\t\n\"LAM, Mr Len\"\t3rd Class Passenger\tSouthampton\tSeaman\t56.49583333\t23\tMale\tFalse\t\n\"LANDERGREN, Miss Aurora Adelia\"\t3rd Class Passenger\tSouthampton\t\t7.25\t22\tFemale\tTrue\t\n\"LANE, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t16\tMale\tFalse\t\n\"LANG, Mr Fang\"\t3rd Class Passenger\tSouthampton\tSeaman\t56.49583333\t32\tMale\tTrue\t\n\"LARSSON, Mr August Viktor\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t9.483333333\t29\tMale\tFalse\t\n\"LARSSON, Mr Bengt Edvin\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t29\tMale\tFalse\t\n\"LARSSON, Mr Edvard\"\t3rd Class Passenger\tSouthampton\tCook\t7.775\t22\tMale\tFalse\t\n\"LEFEBVRE, Mrs Frances Marie\"\t3rd Class Passenger\tSouthampton\t\t25.46666667\t40\tFemale\tFalse\t\n\"LEFEBVRE, Master Henry\"\t3rd Class Passenger\tSouthampton\t\t25.46666667\t5\tMale\tFalse\t\n\"LEFEBVRE, Miss Ida\"\t3rd Class Passenger\tSouthampton\t\t25.46666667\t3\tFemale\tFalse\t\n\"LEFEBVRE, Miss Jeannie\"\t3rd Class Passenger\tSouthampton\t\t25.46666667\t8\tFemale\tFalse\t\n\"LEFEBVRE, Miss Mathilde\"\t3rd Class Passenger\tSouthampton\t\t25.46666667\t12\tFemale\tFalse\t\n\"LEINONEN, Mr Antti Gustaf\"\t3rd Class Passenger\tSouthampton\t\t7.925\t32\tMale\tFalse\t\n\"LENNON, Mr Denis\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t15.5\t20\tMale\tFalse\t\n\"LESTER, Mr James\"\t3rd Class Passenger\tSouthampton\tDipper\t24.15\t26\tMale\tFalse\t\n\"LIEVENS, Mr Ren� Aim�\"\t3rd Class Passenger\tSouthampton\tFarmer\t9.5\t24\tMale\tFalse\t\n\"LINDAHL, Miss Agda Thorilda Viktoria\"\t3rd Class Passenger\tSouthampton\t\t7.775\t25\tFemale\tFalse\t\n\"LINDBLOM, Miss Augusta Charlotta\"\t3rd Class Passenger\tSouthampton\t\t7.75\t45\tFemale\tFalse\t\n\"LINDELL, Mr Edvard Bengtsson\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t15.55\t36\tMale\tFalse\t\n\"LINDELL, Mrs Elin Gerda\"\t3rd Class Passenger\tSouthampton\t\t15.55\t30\tFemale\tFalse\t\n\"LINDQVIST, Mr Eino William\"\t3rd Class Passenger\tSouthampton\t\t7.925\t20\tMale\tTrue\t\n\"LINEHAN, Mr Michael\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.879166667\t21\tMale\tFalse\t\n\"LING, Mr Lee\"\t3rd Class Passenger\tSouthampton\tSeaman\t56.49583333\t28\tMale\tFalse\t\n\"LINHART, Mr Wenzel\"\t3rd Class Passenger\tSouthampton\tBaker\t9.5\t27\tMale\tFalse\t\n\"LIVSHIN, Mr David\"\t3rd Class Passenger\tSouthampton\tJeweller\t7.25\t25\tMale\tFalse\t\n\"LOBB, Mr William Arthur\"\t3rd Class Passenger\tSouthampton\tEngineer\t16.1\t30\tMale\tFalse\t\n\"LOBB, Mrs Cordelia K.\"\t3rd Class Passenger\tSouthampton\t\t16.1\t26\tFemale\tFalse\t\n\"LOCKYER, Mr Edward Thomas\"\t3rd Class Passenger\tSouthampton\tGrocers Assistant\t7.879166667\t19\tMale\tFalse\t\n\"LOVELL, Mr John Hall\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.25\t20\tMale\tFalse\t\n\"LULIC, Mr Nikola\"\t3rd Class Passenger\tSouthampton\t\t8.6625\t29\tMale\tTrue\t\n\"LUNDAHL, Mr Johan Svensson\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.054166667\t51\tMale\tFalse\t\n\"LUNDIN, Miss Olga Elida\"\t3rd Class Passenger\tSouthampton\t\t7.854166667\t23\tFemale\tTrue\t\n\"LUNDSTR�M, Mr Thure Edvin\"\t3rd Class Passenger\tSouthampton\t\t7.579166667\t32\tMale\tTrue\t\n\"LYMPEROPOULUS, Mr Panagiotis K.\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t6.4375\t30\tMale\tFalse\t\n\"LYNTAKOFF, Mr Stanko\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t44\tMale\tFalse\t\n\"MACKAY, Mr George William\"\t3rd Class Passenger\tSouthampton\tFootman\t7.55\t20\tMale\tFalse\t\n\"MADIGAN, Miss Margaret\"\t3rd Class Passenger\tQueenstown\t\t7.75\t21\tFemale\tTrue\t\n\"MADSEN, Mr Fridtjof Arne\"\t3rd Class Passenger\tSouthampton\t\t7.141666667\t24\tMale\tTrue\t\n\"MAHON, Miss Bridget Delia\"\t3rd Class Passenger\tQueenstown\t\t7.879166667\t20\tFemale\tFalse\t\n\"MAISNER, Mr Simon\"\t3rd Class Passenger\tSouthampton\tTailor\t8.05\t34\tMale\tFalse\t\n\"MANGAN, Miss Mary\"\t3rd Class Passenger\tQueenstown\t\t7.75\t32\tFemale\tFalse\t\n\"MANNION, Miss Margaret\"\t3rd Class Passenger\tQueenstown\t\t7.7375\t28\tFemale\tTrue\t\n\"MARDIROSIAN, Mr Sarkis\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t7.229166667\t25\tMale\tFalse\t\n\"MARINKO, Mr Dmitri\"\t3rd Class Passenger\tSouthampton\t\t7.895833333\t23\tMale\tFalse\t\n\"MARKOFF, Mr Marin\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t35\tMale\tFalse\t\n\"MARKUN, Mr Johann\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.895833333\t33\tMale\tFalse\t\n\"MATINOFF, Mr Nicola\"\t3rd Class Passenger\tCherbourg\t\t7.895833333\t30\tMale\tFalse\t\n\"M?M?, Mr Hann? Mik?'?l\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t18\tMale\tTrue\t\n\"M�ENP��, Mr Matti Alexanteri\"\t3rd Class Passenger\tSouthampton\t\t7.125\t22\tMale\tFalse\t\n\"M�KINEN, Mr Kalle Edvard\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.925\t29\tMale\tFalse\t\n\"MCCARTHY, Miss Catherine\"\t3rd Class Passenger\tQueenstown\t\t7.75\t24\tFemale\tTrue\t\n\"MCCORMACK, Mr Thomas Joseph\"\t3rd Class Passenger\tQueenstown\tBarman\t7.75\t19\tMale\tTrue\t\n\"MCCOY, Miss Agnes\"\t3rd Class Passenger\tQueenstown\t\t23.25\t29\tFemale\tTrue\t\n\"MCCOY, Miss Alice\"\t3rd Class Passenger\tQueenstown\t\t23.25\t26\tFemale\tTrue\t\n\"MCCOY, Mr Bernard\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t23.25\t24\tMale\tTrue\t\n\"MCDERMOTT, Miss Bridget Delia\"\t3rd Class Passenger\tQueenstown\t\t7.783333333\t31\tFemale\tTrue\t\n\"MCEVOY, Mr Michael\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t15.5\t19\tMale\tFalse\t\n\"MCGOVERN, Ms Mary\"\t3rd Class Passenger\tQueenstown\t\t7.879166667\t22\tFemale\tTrue\t\n\"MCGOWAN, Miss Catherine\"\t3rd Class Passenger\tQueenstown\t\t7.75\t42\tFemale\tFalse\t\n\"MCGOWAN, Miss Anna Louise\"\t3rd Class Passenger\tQueenstown\t\t8.35\t17\tFemale\tTrue\t\n\"MCMAHON, Mr Martin\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t19\tMale\tFalse\t\n\"MCNAMEE, Mr Neal\"\t3rd Class Passenger\tSouthampton\tProvision Manager\t16.1\t27\tMale\tFalse\t\n\"MCNAMEE, Mrs Eileen\"\t3rd Class Passenger\tSouthampton\t\t16.1\t19\tFemale\tFalse\t\n\"MCNEILL, Miss Bridget\"\t3rd Class Passenger\tQueenstown\t\t7.75\t32\tFemale\tFalse\t\n\"MEANWELL, Mrs Marian\"\t3rd Class Passenger\tSouthampton\tMilliner\t8.05\t63\tFemale\tFalse\t\n\"MEEHAN, Mr John\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t22\tMale\tFalse\t\n\"MEEK, Mrs Annie Louisa\"\t3rd Class Passenger\tSouthampton\t\t8.05\t31\tFemale\tFalse\t\n\"MEO (MARTINO), Mr Alfonzo\"\t3rd Class Passenger\tSouthampton\tMusician\t8.05\t48\tMale\tFalse\t\n\"MERNAGH, Mr Robert\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t28\tMale\tFalse\t\n\"MIDTSJ�, Mr Karl Albert\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.775\t21\tMale\tTrue\t\n\"MIHOFF, Mr Stoytcho\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t28\tMale\tFalse\t\n\"MILES, Mr Frank\"\t3rd Class Passenger\tSouthampton\tEngineer\t8.05\t23\tMale\tFalse\t\n\"MINEFF, Mr Ivan\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t24\tMale\tFalse\t\n\"MINKOFF, Mr Lazar\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t21\tMale\tFalse\t\n\"MITKOFF, Mr Mito\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t23\tMale\tFalse\t\n\"MOCKLER, Miss Ellen Mary\"\t3rd Class Passenger\tQueenstown\t\t7.879166667\t23\tFemale\tTrue\t\n\"MOEN, Mr Sigurd Hansen\"\t3rd Class Passenger\tSouthampton\tCarpenter / Joiner\t7.65\t27\tMale\tFalse\t\n\"MOOR, Mrs Beila\"\t3rd Class Passenger\tSouthampton\tTailor\t12.475\t29\tFemale\tTrue\t\n\"MOOR, Master Meier\"\t3rd Class Passenger\tSouthampton\t\t12.475\t7\tMale\tTrue\t\n\"MOORE, Mr Leonard Charles\"\t3rd Class Passenger\tSouthampton\tBricklayer\t8.05\t19\tMale\tFalse\t\n\"MORAN, Miss Bridget\"\t3rd Class Passenger\tQueenstown\t\t24.15\t28\tFemale\tTrue\t\n\"MORAN, Mr Daniel J.\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t24.15\t27\tMale\tFalse\t\n\"MORLEY, Mr William\"\t3rd Class Passenger\tSouthampton\tCarpenter / Joiner\t8.05\t34\tMale\tFalse\t\n\"MORROW, Mr Thomas Rowan\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t30\tMale\tFalse\t\n\"MOSS, Mr Albert Johan\"\t3rd Class Passenger\tSouthampton\t\t7.775\t29\tMale\tTrue\t\n\"MOUSSA, Mrs Mantoura Boulos\"\t3rd Class Passenger\tCherbourg\tHousewife\t7.229166667\t35\tFemale\tTrue\t\n\"MOUTAL, Mr Rahamin Haim\"\t3rd Class Passenger\tSouthampton\tTraveller\t8.05\t28\tMale\tFalse\t\n\"MUB?RIK, Mrs Am?nah\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t24\tFemale\tTrue\t\n\"MUB?RIK, Master Jirjis\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t7\tMale\tTrue\t\n\"MUB?RIK, Master Hal?m\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t4\tMale\tTrue\t\n\"MULLIN, Miss Catherine\"\t3rd Class Passenger\tQueenstown\t\t7.733333333\t21\tFemale\tTrue\t\n\"MULLIN, Miss Mary (_Lennon)\"\t3rd Class Passenger\tQueenstown\t\t15.5\t18\tFemale\tFalse\t\n\"MULVIHILL, Miss Bridget Elizabeth\"\t3rd Class Passenger\tQueenstown\t\t7.75\t25\tFemale\tTrue\t\n\"MURDLIN, Mr Joseph\"\t3rd Class Passenger\tSouthampton\tChemist\t8.05\t22\tMale\tFalse\t\n\"MURPHY, Miss Nora\"\t3rd Class Passenger\tQueenstown\t\t15.5\t34\tFemale\tTrue\t\n\"MURPHY, Miss Margaret Jane\"\t3rd Class Passenger\tQueenstown\t\t15.5\t25\tFemale\tTrue\t\n\"MURPHY, Miss Catherine\"\t3rd Class Passenger\tQueenstown\t\t15.5\t18\tFemale\tTrue\t\n\"MUSLAM?N?, Mrs Fat?mah Muhammad\"\t3rd Class Passenger\tCherbourg\t\t7.225\t22\tFemale\tTrue\t\n\"MYHRMAN, Mr Pehr Fabian Oliver Malkolm\"\t3rd Class Passenger\tSouthampton\tClerk\t7.75\t18\tMale\tFalse\t\n\"NAIDENOFF, Mr Penko\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t22\tMale\tFalse\t\n\"NAJIB KIAMIE, Miss Adele \"\"Jane\"\"\"\t3rd Class Passenger\tCherbourg\t\t7.225\t15\tFemale\tTrue\t\n\"NAKHLI, Mr Toufik\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t17\tMale\tFalse\t\n\"NAKID, Mr Sahid\"\t3rd Class Passenger\tCherbourg\t\t15.74166667\t20\tMale\tTrue\t\n\"NAKID, Mrs Waika \"\"Mary\"\"\"\t3rd Class Passenger\tCherbourg\t\t15.74166667\t19\tFemale\tTrue\t\n\"NAKID, Miss Maria\"\t3rd Class Passenger\tCherbourg\t\t15.74166667\t1\tFemale\tTrue\t\n\"NANCARROW, Mr William Henry\"\t3rd Class Passenger\tSouthampton\tMason\t8.05\t36\tMale\tFalse\t\n\"NANKOFF, Mr Minko\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t32\tMale\tFalse\t\n\"NASR 'ALM?, Mr Mustaf�\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t7.229166667\t20\tMale\tFalse\t\n\"NASSR RIZQ, Mr Saade\"\t3rd Class Passenger\tCherbourg\t\t7.225\t20\tMale\tFalse\t\n\"NAUGHTON, Miss Hannah\"\t3rd Class Passenger\tQueenstown\tTeacher\t7.75\t21\tFemale\tFalse\t\n\"N?Q?LA Y?RID, Miss Jamilah\"\t3rd Class Passenger\tCherbourg\t\t11.24166667\t14\tFemale\tTrue\t\n\"N?Q?LA Y?RID, Master Ily?s\"\t3rd Class Passenger\tCherbourg\t\t11.24166667\t11\tMale\tTrue\t\n\"NENKOFF, Mr Christo\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t22\tMale\tFalse\t\n\"NIEMINEN, Miss Manta Josefina\"\t3rd Class Passenger\tSouthampton\tServant\t7.925\t29\tFemale\tFalse\t\n\"NIKLASSON, Mr Samuel\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.05\t28\tMale\tFalse\t\n\"NILSSON, Mr August Ferdinand\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.854166667\t21\tMale\tFalse\t\n\"NILSSON, Miss Berta Olivia\"\t3rd Class Passenger\tSouthampton\t\t7.775\t18\tFemale\tTrue\t\n\"NILSSON, Miss Helmina Josefina\"\t3rd Class Passenger\tSouthampton\t\t7.854166667\t26\tFemale\tTrue\t\n\"NIRVA, Mr Iisakki Antino �ij�\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.125\t41\tMale\tFalse\t\n\"NISK�NEN, Mr Juha\"\t3rd Class Passenger\tSouthampton\t\t7.925\t39\tMale\tTrue\t\n\"NOFAL, Mr Mansouer\"\t3rd Class Passenger\tCherbourg\tJournalist\t7.229166667\t20\tMale\tFalse\t\n\"NOSWORTHY, Mr Richard Cater\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t7.8\t21\tMale\tFalse\t\n\"NYSTEN, Miss Anna Sofia\"\t3rd Class Passenger\tSouthampton\t\t7.75\t22\tFemale\tTrue\t\n\"NYSVEEN, Mr Johan Hansen\"\t3rd Class Passenger\tSouthampton\tFarmer\t6.2375\t60\tMale\tFalse\t\n\"O'BRIEN, Mr Denis\"\t3rd Class Passenger\tQueenstown\tPostal Clerk / Postman\t7.829166667\t21\tMale\tFalse\t\n\"O'BRIEN, Mr Thomas\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t15.5\t27\tMale\tFalse\t\n\"O'BRIEN, Mrs Johanna \"\"Hannah\"\"\"\t3rd Class Passenger\tQueenstown\tHousewife\t15.5\t26\tFemale\tTrue\t\n\"O'CONNELL, Mr Patrick Denis\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.733333333\t17\tMale\tFalse\t\n\"O'CONNOR, Mr Maurice\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t16\tMale\tFalse\t\n\"O'CONNOR, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tFarmer\t7.75\t23\tMale\tFalse\t\n\"O'DWYER, Miss Ellen\"\t3rd Class Passenger\tQueenstown\t\t7.879166667\t25\tFemale\tTrue\t\n\"O'KEEFE, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t21\tMale\tTrue\t\n\"O'LEARY, Miss Hanora \"\"Nora\"\"\"\t3rd Class Passenger\tQueenstown\t\t7.829166667\t16\tFemale\tTrue\t\n\"O'SULLIVAN, Miss Bridget Mary\"\t3rd Class Passenger\tQueenstown\t\t7.629166667\t21\tFemale\tFalse\t\n\"OLSEN, Mr Karl Siegwart Andreas\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.404166667\t42\tMale\tFalse\t\n\"OLSEN, Master Artur Karl\"\t3rd Class Passenger\tSouthampton\t\t3.170833333\t9\tMale\tTrue\t\n\"OLSEN, Mr Henry Margido\"\t3rd Class Passenger\tSouthampton\tEngineer\t22.525\t28\tMale\tFalse\t\n\"OLSEN, Mr Ole Martin\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.3125\t27\tMale\tFalse\t\n\"OLSSON, Mr Oscar Wilhelm\"\t3rd Class Passenger\tSouthampton\t\t7.775\t32\tMale\tTrue\t\n\"OLSSON, Mr Nils Johan G�ransson\"\t3rd Class Passenger\tSouthampton\t\t7.854166667\t28\tMale\tFalse\t\n\"OLSSON, Miss Elina\"\t3rd Class Passenger\tSouthampton\t\t7.854166667\t31\tFemale\tFalse\t\n\"OLSVIGEN, Mr Thor Anderson\"\t3rd Class Passenger\tSouthampton\tSalesman\t9.225\t20\tMale\tFalse\t\n\"ORESKOVIC, Mr Luka\"\t3rd Class Passenger\tSouthampton\tFarmer\t8.6625\t20\tMale\tFalse\t\n\"ORESKOVIC, Miss Jelka\"\t3rd Class Passenger\tSouthampton\tFarmer\t8.6625\t23\tFemale\tFalse\t\n\"ORESKOVIC, Miss Marija\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t8.6625\t20\tFemale\tFalse\t\n\"OS�N, Mr Olaf Elon\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t9.216666667\t16\tMale\tFalse\t\n\"PANULA, Mrs Maija Emelia Abrahamintytar\"\t3rd Class Passenger\tSouthampton\t\t39.6875\t41\tFemale\tFalse\t\n\"PANULA, Master Jaako Arnold\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t39.6875\t14\tMale\tFalse\t\n\"PANULA, Mr Ernesti Arvid\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t39.6875\t16\tMale\tFalse\t\n\"PANULA, Master Juha Niilo\"\t3rd Class Passenger\tSouthampton\t\t39.6875\t7\tMale\tFalse\t\n\"PANULA, Master Urho Abraham\"\t3rd Class Passenger\tSouthampton\t\t39.6875\t2\tMale\tFalse\t\n\"PANULA, Master Eino Viljam\"\t3rd Class Passenger\tSouthampton\t\t39.6875\t1\tMale\tFalse\t\n\"PASIC, Mr Jakob\"\t3rd Class Passenger\tSouthampton\tFarmer\t8.6625\t21\tMale\tFalse\t\n\"PATCHETT, Mr George\"\t3rd Class Passenger\tSouthampton\tShoemaker\t14.5\t19\tMale\tFalse\t\n\"PAVLOVIC, Mr Stefo\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t32\tMale\tFalse\t\n\"P�LSSON, Mrs Alma Cornelia\"\t3rd Class Passenger\tSouthampton\tHousewife\t21.075\t29\tFemale\tFalse\t\n\"P�LSSON, Master G�sta Leonard\"\t3rd Class Passenger\tSouthampton\t\t21.075\t2\tMale\tFalse\t\n\"P�LSSON, Master Paul Folke\"\t3rd Class Passenger\tSouthampton\t\t21.075\t6\tMale\tFalse\t\n\"P�LSSON, Miss Stina Viola\"\t3rd Class Passenger\tSouthampton\t\t21.075\t3\tFemale\tFalse\t\n\"P�LSSON, Miss Torborg Danira\"\t3rd Class Passenger\tSouthampton\t\t21.075\t8\tFemale\tFalse\t\n\"PEACOCK, Mrs Edith\"\t3rd Class Passenger\tSouthampton\t\t13.775\t26\tFemale\tFalse\t\n\"PEACOCK, Master Albert Edward\"\t3rd Class Passenger\tSouthampton\t\t13.775\t0.583333333\tMale\tFalse\t\n\"PEACOCK, Miss Treasteall\"\t3rd Class Passenger\tSouthampton\t\t13.775\t3\tFemale\tFalse\t\n\"PEARCE, Mr Ernest\"\t3rd Class Passenger\tSouthampton\tFarmer\t7\t32\tMale\tFalse\t\n\"PEDERSEN, Mr Olaf\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t28\tMale\tFalse\t\n\"PEDUZZI, Mr Giuseppe\"\t3rd Class Passenger\tSouthampton\tWaiter\t8.05\t24\tMale\tFalse\t\n\"PEKONIEMI, Mr Edvard\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.925\t21\tMale\tFalse\t\n\"PELTOM�KI, Mr Nikolai Johannes\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.925\t25\tMale\tFalse\t\n\"PERKIN, Mr John Henry\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.25\t22\tMale\tFalse\t\n\"PERSSON, Mr Ernst Ulrik\"\t3rd Class Passenger\tSouthampton\tChauffeur\t7.775\t25\tMale\tTrue\t\n\"PETER / JOSEPH, Mrs Catherine\"\t3rd Class Passenger\tCherbourg\t\t22.35833333\t24\tFemale\tTrue\t\n\"PETER / JOSEPH, Master Michael J. (\"\"Michael Joseph\"\")\"\t3rd Class Passenger\tCherbourg\t\t22.35833333\t4\tMale\tTrue\t\n\"PETER / JOSEPH, Miss Anna (\"\"Mary Joseph\"\")\"\t3rd Class Passenger\tCherbourg\t\t22.35833333\t2\tFemale\tTrue\t\n\"PETERS, Miss Catherine\"\t3rd Class Passenger\tQueenstown\t\t8.1375\t26\tFemale\tFalse\t\n\"PETERSEN, Mr Marius\"\t3rd Class Passenger\tSouthampton\tDairy Worker\t8.05\t24\tMale\tFalse\t\n\"PETRANEC, Miss Matilda\"\t3rd Class Passenger\tSouthampton\tServant\t7.895833333\t28\tFemale\tFalse\t\n\"PETROFF, Mr Nedialco\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t19\tMale\tFalse\t\n\"PETROFF, Mr Pastcho\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t29\tMale\tFalse\t\n\"PETTERSSON, Mr Johan Emil\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.775\t25\tMale\tFalse\t\n\"PETTERSSON, Miss Elin Natalia\"\t3rd Class Passenger\tSouthampton\t\t7.775\t18\tFemale\tFalse\t\n\"PICARD, Mr Beno�t\"\t3rd Class Passenger\tSouthampton\tLeather Worker\t8.05\t32\tMale\tTrue\t\n\"PLOTCHARSKY, Mr Vasil\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t27\tMale\tFalse\t\n\"POKRNIC, Mr Mate\"\t3rd Class Passenger\tSouthampton\t\t8.6625\t17\tMale\tFalse\t\n\"POKRNIC, Mr Tome\"\t3rd Class Passenger\tSouthampton\t\t8.6625\t24\tMale\tFalse\t\n\"PULNER, Mr Uscher\"\t3rd Class Passenger\tCherbourg\t\t8.7125\t16\tMale\tFalse\t\n\"RADEFF, Mr Alexander\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t27\tMale\tFalse\t\n\"RASMUSSEN, Mrs Lena Jakobsen\"\t3rd Class Passenger\tSouthampton\t\t8.1125\t63\tFemale\tFalse\t\n\"RAZI, Mr Raihed\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t30\tMale\tFalse\t\n\"REED, Mr James George\"\t3rd Class Passenger\tSouthampton\tButcher\t7.25\t19\tMale\tFalse\t\n\"REKIC, Mr Tido\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t38\tMale\tFalse\t\n\"REYNOLDS, Mr Harold\"\t3rd Class Passenger\tSouthampton\tBaker\t8.05\t21\tMale\tFalse\t\n\"RICE, Mrs Margaret\"\t3rd Class Passenger\tQueenstown\tHousekeeper\t29.125\t39\tFemale\tFalse\t\n\"RICE, Master Albert\"\t3rd Class Passenger\tQueenstown\t\t29.125\t10\tMale\tFalse\t\n\"RICE, Master George Hugh\"\t3rd Class Passenger\tQueenstown\t\t29.125\t8\tMale\tFalse\t\n\"RICE, Master Eric\"\t3rd Class Passenger\tQueenstown\t\t29.125\t7\tMale\tFalse\t\n\"RICE, Master Arthur\"\t3rd Class Passenger\tQueenstown\t\t29.125\t4\tMale\tFalse\t\n\"RICE, Master Eugene Francis\"\t3rd Class Passenger\tQueenstown\t\t29.125\t2\tMale\tFalse\t\n\"RIIHIVUORI, Miss Susanna Juhantyt�r\"\t3rd Class Passenger\tSouthampton\t\t39.6875\t22\tFemale\tFalse\t\n\"RINTAM�KI, Mr Matti\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.125\t35\tMale\tFalse\t\n\"RIORDAN, Miss Hannah\"\t3rd Class Passenger\tQueenstown\t\t7.720833333\t18\tFemale\tTrue\t\n\"RISIEN, Mr Samuel Beard\"\t3rd Class Passenger\tSouthampton\tHotelier\t14.5\t69\tMale\tFalse\t\n\"RISIEN, Mrs Emma Jane\"\t3rd Class Passenger\tSouthampton\t\t14.5\t58\tFemale\tFalse\t\n\"ROBINS, Mr Alexander A.\"\t3rd Class Passenger\tSouthampton\tMason\t14.5\t50\tMale\tFalse\t\n\"ROBINS, Mrs Charity\"\t3rd Class Passenger\tSouthampton\t\t14.5\t47\tFemale\tFalse\t\n\"ROGERS, Mr William John\"\t3rd Class Passenger\tSouthampton\tMiner\t8.05\t29\tMale\tFalse\t\n\"ROMMETVEDT, Mr Knud Paust\"\t3rd Class Passenger\tSouthampton\tTailor\t7.775\t49\tMale\tFalse\t\n\"ROSBLOM, Mrs Helena Wilhelmina\"\t3rd Class Passenger\tSouthampton\t\t20.2125\t41\tFemale\tFalse\t\n\"ROSBLOM, Miss Salli Helena\"\t3rd Class Passenger\tSouthampton\t\t20.2125\t2\tFemale\tFalse\t\n\"ROSBLOM, Mr Viktor Richard\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t20.2125\t18\tMale\tFalse\t\n\"ROTH, Miss Sarah\"\t3rd Class Passenger\tSouthampton\tTailor\t8.05\t31\tFemale\tTrue\t\n\"ROUSE, Mr Richard Henry\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t8.05\t53\tMale\tFalse\t\n\"RUSH, Mr Alfred George John\"\t3rd Class Passenger\tSouthampton\tPorter\t8.05\t17\tMale\tFalse\t\n\"RYAN, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t24.15\t30\tMale\tFalse\t\n\"RYAN, Mr Edward\"\t3rd Class Passenger\tQueenstown\tGeneral Labourer\t7.75\t24\tMale\tTrue\t\n\"SAAD, Mr Amin\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t7.229166667\t30\tMale\tFalse\t\n\"SAAD, Mr Khalil\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t7.225\t27\tMale\tFalse\t\n\"SADLIER, Mr Matthew\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.729166667\t18\tMale\tFalse\t\n\"SADOWITZ, Mr Henry\"\t3rd Class Passenger\tSouthampton\tFur Cutter\t7.591666667\t17\tMale\tFalse\t\n\"SAGE, Mr John George\"\t3rd Class Passenger\tSouthampton\tTradesman\t69.55\t44\tMale\tFalse\t\n\"SAGE, Mrs Annie Elizabeth\"\t3rd Class Passenger\tSouthampton\t\t69.55\t44\tFemale\tFalse\t\n\"SAGE, Miss Stella Anne\"\t3rd Class Passenger\tSouthampton\tDressmaker / Couturi?re\t69.55\t20\tFemale\tFalse\t\n\"SAGE, Mr George John\"\t3rd Class Passenger\tSouthampton\tBarman\t69.55\t19\tMale\tFalse\t\n\"SAGE, Mr Douglas Bullen\"\t3rd Class Passenger\tSouthampton\tBaker\t69.55\t18\tMale\tFalse\t\n\"SAGE, Mr Frederick\"\t3rd Class Passenger\tSouthampton\tCook\t69.55\t16\tMale\tFalse\t\n\"SAGE, Miss Dorothy\"\t3rd Class Passenger\tSouthampton\tScholar\t69.55\t14\tFemale\tFalse\t\n\"SAGE, Master Anthony William\"\t3rd Class Passenger\tSouthampton\t\t69.55\t12\tMale\tFalse\t\n\"SAGE, Miss Elizabeth Ada\"\t3rd Class Passenger\tSouthampton\t\t69.55\t10\tFemale\tFalse\t\n\"SAGE, Miss Constance Gladys\"\t3rd Class Passenger\tSouthampton\t\t69.55\t7\tFemale\tFalse\t\n\"SAGE, Master Thomas Henry\"\t3rd Class Passenger\tSouthampton\t\t69.55\t4\tMale\tFalse\t\n\"SALANDER, Mr Karl Johan\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t9.325\t24\tMale\tFalse\t\n\"SALKJELSVIK, Miss Anna Kristine\"\t3rd Class Passenger\tSouthampton\t\t7.65\t21\tFemale\tTrue\t\n\"SALONEN, Mr Johan Werner\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.925\t29\tMale\tFalse\t\n\"SAMAAN, Mr Hanna Elias\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t21.67916667\t40\tMale\tFalse\t\n\"SAMAAN, Mr Elias\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t21.67916667\t17\tMale\tFalse\t\n\"SAMAAN, Mr Youssef\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t21.67916667\t16\tMale\tFalse\t\n\"SANDSTR�M, Mrs Agnes Charlotta\"\t3rd Class Passenger\tSouthampton\t\t16.7\t24\tFemale\tTrue\t\n\"SANDSTR�M, Miss Beatrice Irene\"\t3rd Class Passenger\tSouthampton\t\t16.7\t1\tFemale\tTrue\t\n\"SANDSTR�M, Miss Marguerite Rut\"\t3rd Class Passenger\tSouthampton\t\t16.7\t4\tFemale\tTrue\t\n\"SAP, Mr Julius (\"\"Jules _\"\")\"\t3rd Class Passenger\tSouthampton\t\t9.5\t21\tMale\tTrue\t\n\"SAUNDERCOCK, Mr William Henry\"\t3rd Class Passenger\tSouthampton\tMiner\t8.05\t19\tMale\tFalse\t\n\"SAWYER, Mr Frederick Charles\"\t3rd Class Passenger\tSouthampton\tGardener\t8.05\t33\tMale\tFalse\t\n\"S�THER, Mr Simon Sivertsen\"\t3rd Class Passenger\tSouthampton\tMiner\t7.25\t43\tMale\tFalse\t\n\"S�HOLT, Mr Peter Andreas Lauritz Andersen\"\t3rd Class Passenger\tSouthampton\tCarpenter / Joiner\t7.65\t19\tMale\tFalse\t\n\"SCANLAN, Mr James\"\t3rd Class Passenger\tQueenstown\t\t7.725\t22\tMale\tFalse\t\n\"SCHEERLINCK, Mr Jean\"\t3rd Class Passenger\tSouthampton\t\t9.5\t29\tMale\tTrue\t\n\"SDYCOFF, Mr Todor\"\t3rd Class Passenger\tSouthampton\t\t7.895833333\t42\tMale\tFalse\t\n\"SEMAN, Master Betros\"\t3rd Class Passenger\tCherbourg\t\t4.15\t10\tMale\tFalse\t\n\"SHANNON, Mr Andrew John\"\t3rd Class Passenger\tSouthampton\tSeaman\t0\t36\tMale\tFalse\t\n\"SHAUGHNESSY, Mr Patrick\"\t3rd Class Passenger\tQueenstown\tFarm Labourer\t7.75\t24\tMale\tFalse\t\n\"SHEDID, Mr Daher\"\t3rd Class Passenger\tCherbourg\t\t7.225\t19\tMale\tFalse\t\n\"SHELLARD, Mr Frederick William Blainey\"\t3rd Class Passenger\tSouthampton\tPainter & Decorator\t15.1\t55\tMale\tFalse\t\n\"SHIH?B, Mr Al-Am?r F?ris\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.225\t29\tMale\tFalse\t\n\"SHINE, Miss Ellen\"\t3rd Class Passenger\tQueenstown\t\t7.829166667\t20\tFemale\tTrue\t\n\"SHORNEY, Mr Charles Joseph\"\t3rd Class Passenger\tSouthampton\tValet\t8.05\t22\tMale\tFalse\t\n\"SIMMONS, Mr John\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.05\t40\tMale\tFalse\t\n\"SIRAYANIAN, Mr Orsen\"\t3rd Class Passenger\tCherbourg\tFarmer\t7.229166667\t22\tMale\tFalse\t\n\"SIROTA, Mr Morris\"\t3rd Class Passenger\tSouthampton\tTailor\t8.05\t20\tMale\tFalse\t\n\"SIVIC, Mr Husein\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t40\tMale\tFalse\t\n\"SIVOLA, Mr Antti Wilhelm\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.925\t21\tMale\tFalse\t\n\"SJ�BLOM, Miss Anna Sofia\"\t3rd Class Passenger\tSouthampton\t\t6.495833333\t18\tFemale\tTrue\t\n\"SKOOG, Mr Wilhelm Johansson\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t27.9\t40\tMale\tFalse\t\n\"SKOOG, Mrs Anna Bernhardina\"\t3rd Class Passenger\tSouthampton\t\t27.9\t43\tFemale\tFalse\t\n\"SKOOG, Master Karl Thorsten\"\t3rd Class Passenger\tSouthampton\t\t27.9\t11\tMale\tFalse\t\n\"SKOOG, Master Harald\"\t3rd Class Passenger\tSouthampton\t\t27.9\t5\tMale\tFalse\t\n\"SKOOG, Miss Mabel\"\t3rd Class Passenger\tSouthampton\t\t27.9\t9\tFemale\tFalse\t\n\"SKOOG, Miss Margit Elizabeth\"\t3rd Class Passenger\tSouthampton\t\t27.9\t2\tFemale\tFalse\t\n\"SLABENOFF, Mr Petco\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t42\tMale\tFalse\t\n\"SLOCOVSKI, Mr Selman Francis\"\t3rd Class Passenger\tSouthampton\tMerchant\t8.05\t20\tMale\tFalse\t\n\"SMILJANIC, Mr Mile\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t8.6625\t37\tMale\tFalse\t\n\"SMYTH, Mr Thomas\"\t3rd Class Passenger\tQueenstown\t\t7.75\t26\tMale\tFalse\t\n\"SMYTH, Miss Julia\"\t3rd Class Passenger\tQueenstown\t\t7.733333333\t17\tFemale\tTrue\t\n\"SOMERTON, Mr Francis William\"\t3rd Class Passenger\tSouthampton\t\t8.05\t30\tMale\tFalse\t\n\"SPECTOR, Mr Woolf\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t8.05\t23\tMale\tFalse\t\n\"SPINNER, Mr Henry John\"\t3rd Class Passenger\tSouthampton\tGlove Cutter\t8.05\t32\tMale\tFalse\t\n\"STANEFF, Mr Ivan\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t23\tMale\tFalse\t\n\"STANKOVIC, Mr Ivan\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t8.6875\t33\tMale\tFalse\t\n\"STANLEY, Miss Amy Zillah Elsie\"\t3rd Class Passenger\tSouthampton\tServant\t7.55\t24\tFemale\tTrue\t\n\"STANLEY, Mr Edward Roland\"\t3rd Class Passenger\tSouthampton\tPorter\t8.05\t21\tMale\tFalse\t\n\"STOREY, Mr Thomas\"\t3rd Class Passenger\tSouthampton\tSeaman\t0\t51\tMale\tFalse\t\n\"STOYTCHEFF, Mr Ilia\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t19\tMale\tFalse\t\n\"STRAND�N, Mr Juho Niilosson\"\t3rd Class Passenger\tSouthampton\t\t7.925\t31\tMale\tTrue\t\n\"STRANDBERG, Miss Ida Sofia\"\t3rd Class Passenger\tSouthampton\t\t9.8375\t22\tFemale\tFalse\t\n\"STR�M, Mrs Elna Matilda\"\t3rd Class Passenger\tSouthampton\t\t10.4625\t29\tFemale\tFalse\t\n\"STR�M, Miss Telma Matilda\"\t3rd Class Passenger\tSouthampton\t\t10.4625\t2\tFemale\tFalse\t\n\"STRILIC, Mr Ivan\"\t3rd Class Passenger\tSouthampton\tFarmer\t8.6625\t27\tMale\tFalse\t\n\"SUNDERLAND, Mr Victor Francis\"\t3rd Class Passenger\tSouthampton\tFarmer\t8.05\t20\tMale\tTrue\t\n\"SUNDMAN, Mr Johan Julian\"\t3rd Class Passenger\tSouthampton\t\t7.925\t44\tMale\tTrue\t\n\"SUTEHALL, Mr Henry Jr\"\t3rd Class Passenger\tSouthampton\tCoach Trimmer\t7.05\t25\tMale\tFalse\t\n\"SVENSSON, Mr Olof\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.795833333\t24\tMale\tFalse\t\n\"SVENSSON, Mr Johan\"\t3rd Class Passenger\tSouthampton\t\t7.775\t74\tMale\tFalse\t\n\"SVENSSON, Mr Johan Cervin\"\t3rd Class Passenger\tSouthampton\t\t9.225\t14\tMale\tTrue\t\n\"TANN?S, Mr Bash?r\"\t3rd Class Passenger\tCherbourg\tDealer\t6.4375\t31\tMale\tFalse\t\n\"TANN?S, Mrs Tham?n\"\t3rd Class Passenger\tCherbourg\t\t8.516666667\t16\tFemale\tTrue\t\n\"TANN?S, Master As'ad\"\t3rd Class Passenger\tCherbourg\t\t8.516666667\t0.416666667\tMale\tTrue\t\n\"T�RBER, Mr Ernst Wilhelm\"\t3rd Class Passenger\tSouthampton\tFlorist\t8.05\t41\tMale\tFalse\t\n\"T�RNQUIST, Mr William Henry\"\t3rd Class Passenger\tSouthampton\tSeaman\t0\t25\tMale\tTrue\t\n\"TENGLIN, Mr Gunnar Isidor\"\t3rd Class Passenger\tSouthampton\t\t7.795833333\t25\tMale\tTrue\t\n\"THEOBALD, Mr Thomas Leonard\"\t3rd Class Passenger\tSouthampton\tGroom\t8.05\t34\tMale\tFalse\t\n\"THOMAS/TANNOUS, Mr Tannous\"\t3rd Class Passenger\tCherbourg\tScholar\t7.225\t16\tMale\tFalse\t\n\"THOMAS/TANNOUS, Mr John\"\t3rd Class Passenger\tCherbourg\tDealer\t6.4375\t34\tMale\tFalse\t\n\"THOMPSON, Mr Alexander Morrison\"\t3rd Class Passenger\tSouthampton\tMason\t8.05\t36\tMale\tFalse\t\n\"THORNEYCROFT, Mr Percival\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t16.1\t36\tMale\tFalse\t\n\"THORNEYCROFT, Mrs Florence Kate\"\t3rd Class Passenger\tSouthampton\t\t16.1\t32\tFemale\tTrue\t\n\"TIKKANEN, Mr Juho\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.925\t32\tMale\tFalse\t\n\"TOBIN, Mr Roger\"\t3rd Class Passenger\tQueenstown\tFarmer\t7.75\t20\tMale\tFalse\t\n\"TODOROFF, Mr Lalio\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t23\tMale\tFalse\t\n\"TOMLIN, Mr Ernest Portage\"\t3rd Class Passenger\tSouthampton\tScholar\t8.05\t22\tMale\tFalse\t\n\"TORFA, Mr Assad\"\t3rd Class Passenger\tCherbourg\tFarm Labourer\t7.229166667\t20\tMale\tFalse\t\n\"TOTEVSKI, Mr Hristo Danchev\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t25\tMale\tFalse\t\n\"TU'MAH, Mrs Hinnah\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t27\tFemale\tTrue\t\n\"TU'MAH, Miss Mariyam\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t9\tFemale\tTrue\t\n\"TU'MAH, Master Jirjis Y?suf\"\t3rd Class Passenger\tCherbourg\t\t15.24583333\t8\tMale\tTrue\t\n\"TURCIN, Mr Stjepan\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t36\tMale\tFalse\t\n\"TURJA, Miss Anna Sofia\"\t3rd Class Passenger\tSouthampton\t\t9.841666667\t18\tFemale\tTrue\t\n\"TURKULA, Mrs Hedwig\"\t3rd Class Passenger\tSouthampton\t\t9.5875\t63\tFemale\tTrue\t\n\"VAN BILLIARD, Mr Austin Blyler\"\t3rd Class Passenger\tSouthampton\t\t14.5\t35\tMale\tFalse\t\n\"VAN BILLIARD, Master James William\"\t3rd Class Passenger\tSouthampton\t\t14.5\t10\tMale\tFalse\t\n\"VAN BILLIARD, Master Walter John\"\t3rd Class Passenger\tSouthampton\t\t14.5\t9\tMale\tFalse\t\n\"VAN DE VELDE, Mr Johannes Josef\"\t3rd Class Passenger\tSouthampton\tFarmer\t9.5\t35\tMale\tFalse\t\n\"VAN DEN STEEN, Mr Leo Peter\"\t3rd Class Passenger\tSouthampton\tFarmer\t9.5\t28\tMale\tFalse\t\n\"VAN IMPE, Mr Jean Baptiste\"\t3rd Class Passenger\tSouthampton\tFarmer\t24.15\t36\tMale\tFalse\t\n\"VAN IMPE, Mrs Rosalie Paula\"\t3rd Class Passenger\tSouthampton\t\t24.15\t30\tFemale\tFalse\t\n\"VAN IMPE, Miss Catharina\"\t3rd Class Passenger\tSouthampton\t\t24.15\t10\tFemale\tFalse\t\n\"VAN MELCKEBEKE, Mr Philemon\"\t3rd Class Passenger\tSouthampton\tFarmer\t9.5\t23\tMale\tFalse\t\n\"VANDERCRUYSSEN, Mr Victor\"\t3rd Class Passenger\tSouthampton\tFarmer\t9\t46\tMale\tFalse\t\n\"VANDERPLANCKE, Mr Julius\"\t3rd Class Passenger\tSouthampton\tFarmer\t18\t31\tMale\tFalse\t\n\"VANDERPLANCKE, Mrs Emelie Maria\"\t3rd Class Passenger\tSouthampton\t\t18\t31\tFemale\tFalse\t\n\"VANDERPLANCKE, Miss Augusta Maria\"\t3rd Class Passenger\tSouthampton\tServant\t18\t18\tFemale\tFalse\t\n\"VANDERPLANCKE, Mr Leo Edmondus\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t18\t15\tMale\tFalse\t\n\"VANDEWALLE, Mr Nestor Cyriel\"\t3rd Class Passenger\tSouthampton\tMerchant\t9.5\t28\tMale\tFalse\t\n\"VARTANIAN, Mr David\"\t3rd Class Passenger\tCherbourg\t\t7.225\t22\tMale\tTrue\t\n\"VENDEL, Mr Olof Edvin\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.854166667\t20\tMale\tFalse\t\n\"VESTR�M, Miss Hulda Amanda Adolfina\"\t3rd Class Passenger\tSouthampton\tServant\t7.854166667\t14\tFemale\tFalse\t\n\"VOVK, Mr Janko\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.895833333\t21\tMale\tFalse\t\n\"WAELENS, Mr Achille\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t9\t22\tMale\tFalse\t\n\"WARE, Mr Frederick\"\t3rd Class Passenger\tSouthampton\tMotor Fitter\t8.05\t34\tMale\tFalse\t\n\"WARREN, Mr Charles William\"\t3rd Class Passenger\tSouthampton\tBricklayer\t7.55\t30\tMale\tFalse\t\n\"WAZLI, Mr Yousif Ahmed\"\t3rd Class Passenger\tCherbourg\tFarmer\t7.225\t23\tMale\tFalse\t\n\"WEBBER, Mr James\"\t3rd Class Passenger\tSouthampton\tMiner\t8.05\t66\tMale\tFalse\t\n\"WENNERSTR�M, Mr August\"\t3rd Class Passenger\tSouthampton\t\t7.795833333\t27\tMale\tTrue\t\n\"WIDEGREN, Mr Carl Peter\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t7.75\t51\tMale\tFalse\t\n\"WIKLUND, Mr Karl Johan\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t6.495833333\t21\tMale\tFalse\t\n\"WIKLUND, Mr Jakob Alfred\"\t3rd Class Passenger\tSouthampton\tGeneral Labourer\t6.495833333\t18\tMale\tFalse\t\n\"WILKES, Mrs Ellen\"\t3rd Class Passenger\tSouthampton\t\t7\t47\tFemale\tTrue\t\n\"WILLER, Mr Aaron\"\t3rd Class Passenger\tCherbourg\t\t8.7125\t37\tMale\tFalse\t\n\"WILLEY, Mr Edward John\"\t3rd Class Passenger\tSouthampton\tFarm Labourer\t7.55\t18\tMale\tFalse\t\n\"WILLIAMS, Mr Howard Hugh\"\t3rd Class Passenger\tSouthampton\tCarman\t8.05\t28\tMale\tFalse\t\n\"WILLIAMS, Mr Leslie\"\t3rd Class Passenger\tSouthampton\tPugilist\t16.1\t28\tMale\tFalse\t\n\"WINDEL�V, Mr Einar\"\t3rd Class Passenger\tSouthampton\tDairy Worker\t7.25\t21\tMale\tFalse\t\n\"WIRZ, Mr Albert\"\t3rd Class Passenger\tSouthampton\tFarmer\t8.6625\t27\tMale\tFalse\t\n\"WISEMAN, Mr Philippe\"\t3rd Class Passenger\tSouthampton\tMerchant\t7.25\t54\tMale\tFalse\t\n\"WITTEVRONGEL, Mr Camilius Aloysius\"\t3rd Class Passenger\tSouthampton\tFarmer\t9.5\t36\tMale\tFalse\t\n\"YASBECK, Mr Antoni\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t14.45416667\t27\tMale\tFalse\t\n\"YAZBECK, Mrs Selini\"\t3rd Class Passenger\tCherbourg\t\t14.45416667\t15\tFemale\tTrue\t\n\"YOUSSEFF (ABI SAAB), Mr Gerios\"\t3rd Class Passenger\tCherbourg\tShoemaker\t7.225\t26\tMale\tFalse\t\n\"YOUSSIFF (SAM'AAN), Mr Gerios\"\t3rd Class Passenger\tCherbourg\t\t7.229166667\t45\tMale\tFalse\t\n\"ZAKARIAN, Mr Ortin\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.225\t27\tMale\tFalse\t\n\"ZAKARIAN, Mr Mapriededer\"\t3rd Class Passenger\tCherbourg\t\t7.225\t22\tMale\tFalse\t\n\"ZENNI, Mr Philip\"\t3rd Class Passenger\tCherbourg\tGeneral Labourer\t7.225\t22\tMale\tTrue\t\n\"ZIMMERMANN, Mr Leo\"\t3rd Class Passenger\tSouthampton\tFarmer\t7.875\t29\tMale\tFalse\t\n\"ANDERSON, Mr James\"\tCrew\tSouthampton\tAble Seaman\t0\t40\tMale\tTrue\tDeck\n\"ARCHER, Mr Ernest Edward\"\tCrew\tSouthampton\tAble Seaman\t0\t35\tMale\tTrue\tDeck\n\"BAILEY, Mr Henry Joseph\"\tCrew\tSouthampton\tMaster-at-arms\t0\t43\tMale\tTrue\tDeck\n\"BOXHALL, Mr Joseph Groves\"\tCrew\tBelfast\t4th. Officer\t0\t28\tMale\tTrue\tOfficer\n\"BRADLEY, Mr T.\"\tCrew\tSouthampton\tAble Seaman\t0\t29\tMale\tFalse\tDeck\n\"BRICE, Mr Walter Thomas\"\tCrew\tSouthampton\tAble Seaman\t0\t42\tMale\tTrue\tDeck\n\"BRIGHT, Mr Arthur John\"\tCrew\tBelfast\tQuartermaster\t0\t42\tMale\tTrue\tDeck\n\"BULEY, Mr Edward John\"\tCrew\tSouthampton\tAble Seaman\t0\t26\tMale\tTrue\tDeck\n\"CLENCH, Mr Frederick Charles\"\tCrew\tSouthampton\tAble Seaman\t0\t33\tMale\tTrue\tDeck\n\"CLENCH, Mr George James\"\tCrew\tSouthampton\tAble Seaman\t0\t31\tMale\tFalse\tDeck\n\"COUCH, Mr Frank\"\tCrew\tSouthampton\tAble Seaman\t0\t28\tMale\tFalse\tDeck\n\"DAVIS, Mr Stephen James\"\tCrew\tSouthampton\tAble Seaman\t0\t39\tMale\tFalse\tDeck\n\"EVANS, Mr Alfred Frank\"\tCrew\tSouthampton\tLookout\t0\t25\tMale\tTrue\tDeck\n\"EVANS, Mr Frank Oliver\"\tCrew\tSouthampton\tAble Seaman\t0\t27\tMale\tTrue\tDeck\n\"FLEET, Mr Frederick\"\tCrew\tBelfast\tLookout\t0\t24\tMale\tTrue\tDeck\n\"FOLEY, Mr John\"\tCrew\tBelfast\tDeck storekeeper\t0\t46\tMale\tTrue\tDeck\n\"FORWARD, Mr James\"\tCrew\tSouthampton\tAble Seaman\t0\t27\tMale\tTrue\tDeck\n\"HAINES, Mr Albert\"\tCrew\tBelfast\tBoatswain Mate\t0\t31\tMale\tTrue\tDeck\n\"HARDER, Mr William\"\tCrew\tSouthampton\tWindow Cleaner\t0\t39\tMale\tTrue\tDeck\n\"HEMMING, Mr Samuel Ernest\"\tCrew\tBelfast\tLamp Trimmer\t0\t43\tMale\tTrue\tDeck\n\"HICHENS, Mr Robert\"\tCrew\tSouthampton\tQuartermaster\t0\t29\tMale\tTrue\tDeck\n\"HOGG, Mr George Alfred\"\tCrew\tBelfast\tLookout\t0\t29\tMale\tTrue\tDeck\n\"HOLMAN, Mr Harry\"\tCrew\tBelfast\tAble Seaman\t0\t28\tMale\tFalse\tDeck\n\"HOPKINS, Mr Robert John\"\tCrew\tSouthampton\tAble Seaman\t0\t40\tMale\tTrue\tDeck\n\"HORSWILL, Mr Albert Edward James\"\tCrew\tSouthampton\tAble Seaman\t0\t33\tMale\tTrue\tDeck\n\"HUMPHREYS, Mr Sidney James\"\tCrew\tSouthampton\tQuartermaster\t0\t48\tMale\tTrue\tDeck\n\"HUTCHINSON, Mr John Hall\"\tCrew\tBelfast\tCarpenter / Joiner\t0\t26\tMale\tFalse\tDeck\n\"JEWELL, Mr Archie\"\tCrew\tBelfast\tLookout\t0\t23\tMale\tTrue\tDeck\n\"JONES, Mr Thomas William\"\tCrew\tSouthampton\tAble Seaman\t0\t32\tMale\tTrue\tDeck\n\"KING, Mr Thomas Walter\"\tCrew\tSouthampton\tMaster-at-arms\t0\t42\tMale\tFalse\tDeck\n\"LEE, Mr Reginald Robinson\"\tCrew\tSouthampton\tLookout\t0\t41\tMale\tTrue\tDeck\n\"LIGHTOLLER, Mr Charles Herbert\"\tCrew\tBelfast\t2nd. Officer\t0\t38\tMale\tTrue\tOfficer\n\"LOWE, Mr Harold Godfrey\"\tCrew\tBelfast\t5th. Officer\t0\t29\tMale\tTrue\tOfficer\n\"LUCAS, Mr William Arthur\"\tCrew\tSouthampton\tAble Seaman\t0\t25\tMale\tTrue\tDeck\n\"LYONS, Mr William Henry\"\tCrew\tSouthampton\tAble Seaman\t0\t25\tMale\tFalse\tDeck\n\"MATHERSON, Mr David\"\tCrew\tSouthampton\tAble Seaman\t0\t30\tMale\tFalse\tDeck\n\"MATHIAS, Mr Montague Vincent\"\tCrew\tSouthampton\tMess Steward\t0\t28\tMale\tFalse\tDeck\n\"MAXWELL, Mr John\"\tCrew\tBelfast\tCarpenter / Joiner\t0\t31\tMale\tFalse\tDeck\n\"MCCARTHY, Mr William\"\tCrew\tSouthampton\tAble Seaman\t0\t47\tMale\tTrue\tDeck\n\"MCGOUGH, Mr George Francis 'Paddy'\"\tCrew\tSouthampton\tAble Seaman\t0\t36\tMale\tTrue\tDeck\n\"MOODY, Mr James Paul\"\tCrew\tBelfast\t6th. Officer\t0\t24\tMale\tFalse\tOfficer\n\"MOORE, Mr George Alfred\"\tCrew\tSouthampton\tAble Seaman\t0\t32\tMale\tTrue\tDeck\n\"MURDOCH, Mr William McMaster\"\tCrew\tBelfast\t1st. Officer\t0\t39\tMale\tFalse\tOfficer\n\"NICHOLS, Mr Alfred William Stanley\"\tCrew\tBelfast\tBoatswain\t0\t47\tMale\tFalse\tDeck\n\"O'LOUGHLIN, Dr William Francis Norman\"\tCrew\tBelfast\tSurgeon\t0\t62\tMale\tFalse\tDeck\n\"OLLIVER, Mr Alfred John\"\tCrew\tBelfast\tQuartermaster\t0\t27\tMale\tTrue\tDeck\n\"OSMAN, Mr Frank\"\tCrew\tSouthampton\tAble Seaman\t0\t27\tMale\tTrue\tDeck\n\"PASCOE, Mr Charles H.\"\tCrew\tSouthampton\tAble Seaman\t0\t43\tMale\tTrue\tDeck\n\"PERKIS, Mr Walter John\"\tCrew\tBelfast\tQuartermaster\t0\t37\tMale\tTrue\tDeck\n\"PETERS, Mr William Chapman\"\tCrew\tSouthampton\tAble Seaman\t0\t26\tMale\tTrue\tDeck\n\"PITMAN, Mr Herbert John\"\tCrew\tBelfast\t3rd. Officer\t0\t34\tMale\tTrue\tOfficer\n\"POINGDESTRE, Mr John Thomas\"\tCrew\tSouthampton\tAble Seaman\t0\t33\tMale\tTrue\tDeck\n\"ROWE, Mr George Thomas\"\tCrew\tBelfast\tQuartermaster\t0\t32\tMale\tTrue\tDeck\n\"SAWYER, Mr Robert James\"\tCrew\tSouthampton\tWindow Cleaner\t0\t31\tMale\tFalse\tDeck\n\"SCARROTT, Mr Joseph George\"\tCrew\tSouthampton\tAble Seaman\t0\t33\tMale\tTrue\tDeck\n\"SIMPSON, Dr John Edward\"\tCrew\tSouthampton\tAssistant Surgeon\t0\t37\tMale\tFalse\tDeck\n\"SMITH, Captain Edward John\"\tCrew\tSouthampton\tMaster\t0\t62\tMale\tFalse\tOfficer\n\"SMITH, Mr William\"\tCrew\tSouthampton\tSeaman\t0\t26\tMale\tFalse\tDeck\n\"SYMONS, Mr George Thomas Macdonald\"\tCrew\tSouthampton\tLookout\t0\t24\tMale\tTrue\tDeck\n\"TAMLYN, Mr Frederick\"\tCrew\tSouthampton\tMess Steward (Deck Dept.)\t0\t23\tMale\tFalse\tDeck\n\"TAYLOR, Mr Charles William Frederick\"\tCrew\tSouthampton\tAble-bodied Seaman\t0\t35\tMale\tFalse\tDeck\n\"TERRELL, Mr Bertram\"\tCrew\tSouthampton\tSeaman\t0\t18\tMale\tFalse\tDeck\n\"VIGOTT, Mr Philip Francis\"\tCrew\tSouthampton\tAble Seaman\t0\t32\tMale\tTrue\tDeck\n\"WELLER, Mr William Clifford\"\tCrew\tBelfast\tAble-bodied Seaman\t0\t30\tMale\tTrue\tDeck\n\"WILDE, Mr Henry Tingle\"\tCrew\tSouthampton\tChief Officer\t0\t39\tMale\tFalse\tOfficer\n\"WYNN, Mr Walter\"\tCrew\tBelfast\tQuartermaster\t0\t41\tMale\tTrue\tDeck\n\"ABRAMS, Mr William Thomas\"\tCrew\tSouthampton\tFireman\t0\t33\tMale\tFalse\tEngineering\n\"ADAMS, Mr Robert John\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"ALLEN, Mr Henry\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"ALLEN, Mr Ernest Frederick\"\tCrew\tSouthampton\tTrimmer\t0\t24\tMale\tTrue\tEngineering\n\"ALLSOP, Mr Alfred Samuel\"\tCrew\tBelfast\t2nd Electrician\t0\t35\tMale\tFalse\tEngineering\n\"AVERY, Mr James Albert\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tTrue\tEngineering\n\"BAILEY, Mr George Frank\"\tCrew\tSouthampton\tFireman\t0\t46\tMale\tFalse\tEngineering\n\"BAINES, Mr Richard\"\tCrew\tSouthampton\tGreaser\t0\t24\tMale\tFalse\tEngineering\n\"BANNON, Mr John Joseph\"\tCrew\tSouthampton\tGreaser\t0\t34\tMale\tFalse\tEngineering\n\"BARLOW, Mr Charles\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"BARNES, Mr Charles\"\tCrew\tSouthampton\tFireman\t0\t29\tMale\tFalse\tEngineering\n\"BARNES, Mr John\"\tCrew\tSouthampton\tFireman\t0\t41\tMale\tFalse\tEngineering\n\"BARRETT, Mr Frederick\"\tCrew\tSouthampton\tLeading Fireman\t0\t28\tMale\tTrue\tEngineering\n\"BARRETT, Mr Frederick William\"\tCrew\tSouthampton\tFireman\t0\t33\tMale\tFalse\tEngineering\n\"BEATTIE, Mr Joseph\"\tCrew\tBelfast\tGreaser\t0\t35\tMale\tFalse\tEngineering\n\"BEAUCHAMP, Mr George William\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tTrue\tEngineering\n\"BELL, Mr Joseph\"\tCrew\tBelfast\tChief Engineer\t0\t50\tMale\tFalse\tEngineering\n\"BENDELL, Mr Frank\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tFalse\tEngineering\n\"BENNETT, Mr George Alfred\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"BENVILLE, Mr Edward\"\tCrew\tSouthampton\tFireman\t0\t47\tMale\tFalse\tEngineering\n\"BESSANT, Mr William Edward Lowe\"\tCrew\tSouthampton\tFireman\t0\t39\tMale\tFalse\tEngineering\n\"BEVIS, Mr Joseph Henry\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tFalse\tEngineering\n\"BIDDLECOMBE, Mr Reginald Charles\"\tCrew\tSouthampton\tFireman\t0\t31\tMale\tFalse\tEngineering\n\"BIGGS, Mr Edward Charles\"\tCrew\tSouthampton\tFireman\t0\t20\tMale\tFalse\tEngineering\n\"BILLOWS, Mr James\"\tCrew\tSouthampton\tTrimmer\t0\t20\tMale\tFalse\tEngineering\n\"BINSTEAD, Mr Walter William\"\tCrew\tSouthampton\tTrimmer\t0\t20\tMale\tTrue\tEngineering\n\"BLACK, Mr Alexander\"\tCrew\tSouthampton\tFireman\t0\t28\tMale\tFalse\tEngineering\n\"BLACK, Mr D.\"\tCrew\tSouthampton\tFireman\t0\t41\tMale\tFalse\tEngineering\n\"BLACKMAN, Mr Albert Edward\"\tCrew\tSouthampton\tFireman\t0\t23\tMale\tFalse\tEngineering\n\"BLAKE, Mr Percival Albert\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tTrue\tEngineering\n\"BLAKE, Mr Seaton\"\tCrew\tBelfast\tMess Steward\t0\t26\tMale\tFalse\tEngineering\n\"BLAKE, Mr Thomas Henry\"\tCrew\tSouthampton\tFireman\t0\t36\tMale\tFalse\tEngineering\n\"BLANEY, Mr James\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"BLANN, Mr Eustace Horatius\"\tCrew\tSouthampton\tFireman\t0\t21\tMale\tFalse\tEngineering\n\"BOTT, Mr William Thomas\"\tCrew\tSouthampton\tGreaser\t0\t44\tMale\tFalse\tEngineering\n\"BRADLEY, Mr Patrick Joseph\"\tCrew\tSouthampton\tFireman\t0\t39\tMale\tFalse\tEngineering\n\"BREWER, Mr Harry\"\tCrew\tSouthampton\tTrimmer\t0\t30\tMale\tFalse\tEngineering\n\"BRIANT, Mr Albert\"\tCrew\tSouthampton\tGreaser\t0\t34\tMale\tFalse\tEngineering\n\"BROOKS, Mr J.\"\tCrew\tSouthampton\tTrimmer\t0\t25\tMale\tFalse\tEngineering\n\"BROWN, Mr John\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tFalse\tEngineering\n\"BROWN, Mr Joseph James\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tFalse\tEngineering\n\"BURROUGHS, Mr Arthur Peckham\"\tCrew\tSouthampton\tFireman\t0\t35\tMale\tFalse\tEngineering\n\"BURTON, Mr Edward John\"\tCrew\tSouthampton\tFireman\t0\t35\tMale\tFalse\tEngineering\n\"BUTT, Mr William John\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"CALDERWOOD, Mr Hugh\"\tCrew\tBelfast\tTrimmer\t0\t30\tMale\tFalse\tEngineering\n\"CANNER, Mr John\"\tCrew\tSouthampton\tFireman\t0\t39\tMale\tFalse\tEngineering\n\"CARR, Mr Richard Stephen\"\tCrew\tSouthampton\tTrimmer\t0\t37\tMale\tFalse\tEngineering\n\"CARTER (BALL), Mr James (W.)\"\tCrew\tSouthampton\tFireman\t0\t46\tMale\tFalse\tEngineering\n\"CASEY, Mr Thomas\"\tCrew\tSouthampton\tTrimmer\t0\t28\tMale\tFalse\tEngineering\n\"CASTLEMAN, Mr Edward\"\tCrew\tSouthampton\tGreaser\t0\t37\tMale\tFalse\tEngineering\n\"CAVELL, Mr George Henry\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tTrue\tEngineering\n\"CHERRETT, Mr William Victor\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tFalse\tEngineering\n\"CHISNALL, Mr George Alexander\"\tCrew\tBelfast\tBoilermaker\t0\t36\tMale\tFalse\tEngineering\n\"CHORLEY, Mr John Henry\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tFalse\tEngineering\n\"CLARK, Mr William\"\tCrew\tSouthampton\tFireman\t0\t39\tMale\tTrue\tEngineering\n\"COE, Mr Harry\"\tCrew\tSouthampton\tTrimmer\t0\t21\tMale\tFalse\tEngineering\n\"COLEMAN, Mr John\"\tCrew\tBelfast\tEngineers' Mess steward\t0\t57\tMale\tFalse\tEngineering\n\"COLLINS, Mr John\"\tCrew\tSouthampton\tFireman\t0\t38\tMale\tTrue\tEngineering\n\"COMBES, Mr George\"\tCrew\tSouthampton\tFireman\t0\t34\tMale\tTrue\tEngineering\n\"COOPER, Mr Harry\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"COOPER, Mr James Edward\"\tCrew\tSouthampton\tTrimmer\t0\t25\tMale\tFalse\tEngineering\n\"COPPERTHWAITE, Mr Albert Harry\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tFalse\tEngineering\n\"CORCORAN, Mr Denny\"\tCrew\tSouthampton\tFireman\t0\t33\tMale\tFalse\tEngineering\n\"COTTON, Mr Alfred\"\tCrew\tSouthampton\tTrimmer\t0\t35\tMale\tFalse\tEngineering\n\"COUCH, Mr Joseph Henry\"\tCrew\tSouthampton\tGreaser\t0\t49\tMale\tFalse\tEngineering\n\"COUPER, Mr Robert Frederick William\"\tCrew\tSouthampton\tFireman\t0\t29\tMale\tTrue\tEngineering\n\"COY, Mr Francis Ernest George\"\tCrew\tBelfast\tJunior Assistant 3rd. Engineer\t0\t26\tMale\tFalse\tEngineering\n\"CRABB, Mr Henry James\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tFalse\tEngineering\n\"CREESE, Mr Henry Philip\"\tCrew\tBelfast\tDeck Engineer\t0\t44\tMale\tFalse\tEngineering\n\"CRIMMINS, Mr James\"\tCrew\tSouthampton\tFireman\t0\t21\tMale\tTrue\tEngineering\n\"CROSS, Mr William Alfred\"\tCrew\tSouthampton\tFireman\t0\t43\tMale\tFalse\tEngineering\n\"CUNNINGHAM, Mr B.\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"CURTIS, Mr Arthur\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tFalse\tEngineering\n\"DAVIES, Mr Thomas\"\tCrew\tSouthampton\tLeading Fireman\t0\t33\tMale\tFalse\tEngineering\n\"DAWSON, Mr Joseph\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tFalse\tEngineering\n\"DIAPER, Mr John Joseph\"\tCrew\tSouthampton\tFireman\t0\t27\tMale\tTrue\tEngineering\n\"DICKSON, Mr William\"\tCrew\tSouthampton\tTrimmer\t0\t36\tMale\tFalse\tEngineering\n\"DILLEY, Mr John\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tTrue\tEngineering\n\"DILLON, Mr Thomas Patrick\"\tCrew\tSouthampton\tTrimmer\t0\t24\tMale\tTrue\tEngineering\n\"DODD, Mr Edward Charles\"\tCrew\tBelfast\tJunior 3rd. Engineer\t0\t38\tMale\tFalse\tEngineering\n\"DODDS, Mr Henry Watson\"\tCrew\tSouthampton\tJunior Assistant 4th Engineer\t0\t27\tMale\tFalse\tEngineering\n\"DOEL, Mr Frederick\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tTrue\tEngineering\n\"DORE, Mr Albert James\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tTrue\tEngineering\n\"DOYLE, Mr Laurence\"\tCrew\tSouthampton\tFireman\t0\t27\tMale\tFalse\tEngineering\n\"DUFFY, Mr William Luke\"\tCrew\tBelfast\tWriter / Engineer's Clerk\t0\t36\tMale\tFalse\tEngineering\n\"DURNIL, Mr James\"\tCrew\tSouthampton\tLeading Fireman\t0\t38\tMale\tFalse\tEngineering\n\"DYER, Mr Henry Ryland\"\tCrew\tBelfast\tSenior Assistant 4th. Engineer\t0\t24\tMale\tFalse\tEngineering\n\"DYMOND, Mr Frank\"\tCrew\tSouthampton\tFireman\t0\t40\tMale\tTrue\tEngineering\n\"EAGLE, Mr Alfred James\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tFalse\tEngineering\n\"EASTMAN, Mr Charles\"\tCrew\tSouthampton\tGreaser\t0\t44\tMale\tFalse\tEngineering\n\"ELLIOTT, Mr Everett Edward\"\tCrew\tSouthampton\tTrimmer\t0\t24\tMale\tFalse\tEngineering\n\"ERVINE, Mr Albert George\"\tCrew\tBelfast\tAssistant Electrician\t0\t18\tMale\tFalse\tEngineering\n\"EVANS, Mr William Thomas\"\tCrew\tSouthampton\tTrimmer\t0\t33\tMale\tFalse\tEngineering\n\"FARQUHARSON, Mr William Edward\"\tCrew\tBelfast\tSenior 2nd. Engineer\t0\t39\tMale\tFalse\tEngineering\n\"FAY, Mr Thomas Joseph\"\tCrew\tSouthampton\tGreaser\t0\t30\tMale\tFalse\tEngineering\n\"FERRARY, Mr Antonio\"\tCrew\tSouthampton\tTrimmer\t0\t34\tMale\tFalse\tEngineering\n\"FERRIS, Mr William\"\tCrew\tSouthampton\tLeading Fireman\t0\t38\tMale\tFalse\tEngineering\n\"FITZPATRICK, Mr Hugh Joseph\"\tCrew\tBelfast\tJunior Boilermaker\t0\t28\tMale\tFalse\tEngineering\n\"FITZPATRICK, Mr Cecil William\"\tCrew\tSouthampton\tMess Steward\t0\t21\tMale\tTrue\tEngineering\n\"FLARTY, Mr Edward\"\tCrew\tSouthampton\tFireman\t0\t43\tMale\tTrue\tEngineering\n\"FORD, Mr H.\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tFalse\tEngineering\n\"FORD, Mr Thomas\"\tCrew\tSouthampton\tLeading Fireman\t0\t32\tMale\tFalse\tEngineering\n\"FOSTER, Mr Alfred Charles\"\tCrew\tBelfast\tStorekeeper (Engineering)\t0\t37\tMale\tFalse\tEngineering\n\"FRASER, Mr James\"\tCrew\tBelfast\tJunior Assistant 3rd. Engineer\t0\t29\tMale\tFalse\tEngineering\n\"FRASER, Mr J.\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"FREDERICKS, Mr Walter Francis\"\tCrew\tSouthampton\tTrimmer\t0\t21\tMale\tTrue\tEngineering\n\"FRYER, Mr Albert Ernest\"\tCrew\tSouthampton\tTrimmer\t0\t29\tMale\tTrue\tEngineering\n\"GEER, Mr Alfred Emest\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"GODLEY, Mr George Auguste\"\tCrew\tSouthampton\tFireman\t0\t38\tMale\tTrue\tEngineering\n\"GODWIN, Mr Frederick Charles\"\tCrew\tSouthampton\tGreaser\t0\t35\tMale\tFalse\tEngineering\n\"GOLDER, Mr M. W.\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"GORDON, Mr J.\"\tCrew\tSouthampton\tTrimmer\t0\t29\tMale\tFalse\tEngineering\n\"GOREE, Mr Frank\"\tCrew\tSouthampton\tGreaser\t0\t40\tMale\tFalse\tEngineering\n\"GOSLING, Mr Bertram James\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tFalse\tEngineering\n\"GOSLING, Mr S.\"\tCrew\tSouthampton\tTrimmer\t0\t26\tMale\tFalse\tEngineering\n\"GRADIDGE, Mr Ernest Edward\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tFalse\tEngineering\n\"GRAHAM, Mr Thomas G.\"\tCrew\tBelfast\tFireman\t0\t28\tMale\tTrue\tEngineering\n\"GREEN, Mr George\"\tCrew\tSouthampton\tTrimmer\t0\t20\tMale\tFalse\tEngineering\n\"GREGORY, Mr David\"\tCrew\tSouthampton\tGreaser\t0\t43\tMale\tFalse\tEngineering\n\"GUMERY, Mr George\"\tCrew\tSouthampton\tMess Steward\t0\t24\tMale\tFalse\tEngineering\n\"HAGGAN, Mr John\"\tCrew\tBelfast\tFireman\t0\t35\tMale\tTrue\tEngineering\n\"HALL, Mr J.\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"HALLETT, Mr George Alexander\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tFalse\tEngineering\n\"HANDS, Mr Bernard\"\tCrew\tSouthampton\tFireman\t0\t53\tMale\tFalse\tEngineering\n\"HANNAM, Mr George\"\tCrew\tSouthampton\tFireman\t0\t29\tMale\tFalse\tEngineering\n\"HARRIS, Mr Amos\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tFalse\tEngineering\n\"HARRIS, Mr Edward John\"\tCrew\tSouthampton\tFireman\t0\t28\tMale\tFalse\tEngineering\n\"HARRIS, Mr Frederick\"\tCrew\tSouthampton\tFireman\t0\t39\tMale\tTrue\tEngineering\n\"HARRISON, Mr Norman E.\"\tCrew\tBelfast\tJunior 2nd. Engineer\t0\t38\tMale\tFalse\tEngineering\n\"HART, Mr James\"\tCrew\tSouthampton\tFireman\t0\t49\tMale\tFalse\tEngineering\n\"HARVEY, Mr Herbert Gifford\"\tCrew\tBelfast\tJunior Assistant 2nd. Engineer\t0\t34\tMale\tFalse\tEngineering\n\"HEAD, Mr Alfred\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tFalse\tEngineering\n\"HEBB, Mr William Albert\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tTrue\tEngineering\n\"HENDRICKSON, Mr Charles Osker\"\tCrew\tSouthampton\tLeading Fireman\t0\t28\tMale\tTrue\tEngineering\n\"HESKETH, Mr John Henry\"\tCrew\tBelfast\tSecond Engineer (refrigeration)\t0\t33\tMale\tFalse\tEngineering\n\"HESLIN, Mr James\"\tCrew\tSouthampton\tTrimmer\t0\t45\tMale\tFalse\tEngineering\n\"HILL, Mr James\"\tCrew\tSouthampton\tTrimmer\t0\t25\tMale\tFalse\tEngineering\n\"HINTON, Mr Stephen William\"\tCrew\tSouthampton\tTrimmer\t0\t30\tMale\tFalse\tEngineering\n\"HODGE, Mr Charley\"\tCrew\tBelfast\tSenior Assistant 3rd. Engineer\t0\t29\tMale\tFalse\tEngineering\n\"HODGES, Mr W.\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"HODGKINSON, Mr Leonard\"\tCrew\tBelfast\tSenior 4th. Engineer\t0\t46\tMale\tFalse\tEngineering\n\"HOPGOOD, Mr Roland John C.\"\tCrew\tSouthampton\tFireman\t0\t28\tMale\tFalse\tEngineering\n\"HOSGOOD, Mr Richard William\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tFalse\tEngineering\n\"HOSKING, Mr George Fox\"\tCrew\tBelfast\tSenior 3rd. Engineer\t0\t36\tMale\tFalse\tEngineering\n\"HUNT, Mr Albert Sylvanus\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tTrue\tEngineering\n\"HUNT, Mr Tom\"\tCrew\tSouthampton\tFireman\t0\t27\tMale\tFalse\tEngineering\n\"HURST, Mr Charles John\"\tCrew\tSouthampton\tFireman\t0\t35\tMale\tFalse\tEngineering\n\"HURST, Mr Walter\"\tCrew\tSouthampton\tFireman\t0\t23\tMale\tTrue\tEngineering\n\"INGRAM, Mr George\"\tCrew\tSouthampton\tTrimmer\t0\t20\tMale\tFalse\tEngineering\n\"INSTANCE, Mr T.\"\tCrew\tSouthampton\tFireman\t0\t33\tMale\tFalse\tEngineering\n\"JACKOPSON, Mr John Henry\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"JAGO, Mr Joseph\"\tCrew\tSouthampton\tGreaser\t0\t57\tMale\tFalse\tEngineering\n\"JAMES, Mr Thomas\"\tCrew\tSouthampton\tFireman\t0\t27\tMale\tFalse\tEngineering\n\"JOAS, Mr N.\"\tCrew\tSouthampton\tFireman\t0\t38\tMale\tFalse\tEngineering\n\"JUDD, Mr Charles Edward\"\tCrew\tSouthampton\tFireman\t0\t31\tMale\tTrue\tEngineering\n\"JUKES, Mr Henry James\"\tCrew\tSouthampton\tGreaser\t0\t38\tMale\tFalse\tEngineering\n\"JUPE, Mr Boykett Herbert\"\tCrew\tSouthampton\tElectrician\t0\t30\tMale\tFalse\tEngineering\n\"KASPER, Mr F.\"\tCrew\tSouthampton\tFireman\t0\t40\tMale\tTrue\tEngineering\n\"KEARL, Mr Charles Henry\"\tCrew\tSouthampton\tGreaser\t0\t44\tMale\tFalse\tEngineering\n\"KEARL, Mr George Edward\"\tCrew\tSouthampton\tTrimmer\t0\t24\tMale\tFalse\tEngineering\n\"KELLY, Mr James\"\tCrew\tSouthampton\tGreaser\t0\t44\tMale\tFalse\tEngineering\n\"KELLY, Mr William\"\tCrew\tBelfast\tAssistant Electrician\t0\t23\tMale\tFalse\tEngineering\n\"KEMISH, Mr George\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tTrue\tEngineering\n\"KEMP, Mr Thomas Hulman\"\tCrew\tBelfast\tExtra Assistant 4th Engineer (Refrigeration)\t0\t43\tMale\tFalse\tEngineering\n\"KENCHENTEN, Mr Frederick Charles\"\tCrew\tSouthampton\tGreaser\t0\t36\tMale\tFalse\tEngineering\n\"KENZLER, Mr August\"\tCrew\tBelfast\tStorekeeper\t0\t43\tMale\tFalse\tEngineering\n\"KERR, Mr Thomas Russell\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"KINSELLA, Mr Louis\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"KIRKHAM, Mr James\"\tCrew\tSouthampton\tGreaser\t0\t43\tMale\tFalse\tEngineering\n\"KNOWLES, Mr Thomas\"\tCrew\tSouthampton\tFiremens' Messman\t0\t42\tMale\tTrue\tEngineering\n\"LAHY, Mr T. E.\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"LEE, Mr H.\"\tCrew\tSouthampton\tTrimmer\t0\t18\tMale\tFalse\tEngineering\n\"LIGHT, Mr Christopher William\"\tCrew\tSouthampton\tFireman\t0\t20\tMale\tFalse\tEngineering\n\"LIGHT, Mr W.\"\tCrew\tSouthampton\tFireman\t0\t47\tMale\tFalse\tEngineering\n\"LINDSAY, Mr William Charles\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tTrue\tEngineering\n\"LLOYD, Mr William\"\tCrew\tSouthampton\tFireman\t0\t29\tMale\tFalse\tEngineering\n\"LONG, Mr Frank\"\tCrew\tSouthampton\tTrimmer\t0\t28\tMale\tFalse\tEngineering\n\"LONG, Mr William\"\tCrew\tSouthampton\tTrimmer\t0\t30\tMale\tFalse\tEngineering\n\"MACKIE, Mr William Dickson\"\tCrew\tBelfast\tJunior 5th. Engineer\t0\t32\tMale\tFalse\tEngineering\n\"MAJOR, Mr William James\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tTrue\tEngineering\n\"MARETT, Mr George John\"\tCrew\tSouthampton\tFireman\t0\t27\tMale\tFalse\tEngineering\n\"MARSH, Mr Frederick Charles\"\tCrew\tSouthampton\tFireman\t0\t39\tMale\tFalse\tEngineering\n\"MASKELL, Mr Leopold Adolphus\"\tCrew\tSouthampton\tTrimmer\t0\t25\tMale\tFalse\tEngineering\n\"MASON, Mr Frank Archibald Robert\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tTrue\tEngineering\n\"MASON, Mr J.\"\tCrew\tSouthampton\tLeading Fireman\t0\t39\tMale\tFalse\tEngineering\n\"MAY, Mr Arthur William\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tFalse\tEngineering\n\"MAY, Mr Arthur William\"\tCrew\tSouthampton\tFireman Messman\t0\t59\tMale\tFalse\tEngineering\n\"MAYO, Mr William Peter\"\tCrew\tSouthampton\tLeading Fireman\t0\t27\tMale\tFalse\tEngineering\n\"MAYZES, Mr Thomas Jubilee\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tTrue\tEngineering\n\"MCANDREW, Mr Thomas Patrick\"\tCrew\tSouthampton\tFireman\t0\t38\tMale\tFalse\tEngineering\n\"MCANDREWS, Mr William\"\tCrew\tSouthampton\tFireman\t0\t23\tMale\tFalse\tEngineering\n\"MCCASTLAN, Mr W.\"\tCrew\tSouthampton\tFireman\t0\t38\tMale\tFalse\tEngineering\n\"MCGANN, Mr James\"\tCrew\tSouthampton\tTrimmer\t0\t26\tMale\tTrue\tEngineering\n\"MCGARVEY, Mr Edward Joseph\"\tCrew\tSouthampton\tFireman\t0\t34\tMale\tFalse\tEngineering\n\"MCGAW, Mr Erroll Victor\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"MCINERNEY, Mr Thomas\"\tCrew\tSouthampton\tGreaser\t0\t38\tMale\tFalse\tEngineering\n\"MCINTYRE, Mr William\"\tCrew\tSouthampton\tTrimmer\t0\t21\tMale\tTrue\tEngineering\n\"MCQUILLAN, Mr William\"\tCrew\tBelfast\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"MCRAE, Mr William Alexander\"\tCrew\tSouthampton\tFireman\t0\t31\tMale\tFalse\tEngineering\n\"MCREYNOLDS, Mr William\"\tCrew\tBelfast\tJunior 6th. Engineer\t0\t22\tMale\tFalse\tEngineering\n\"MIDDLETON, Mr Alfred Pirrie\"\tCrew\tBelfast\tAssistant Electrician\t0\t26\tMale\tFalse\tEngineering\n\"MILFORD, Mr George\"\tCrew\tSouthampton\tFireman\t0\t27\tMale\tFalse\tEngineering\n\"MILLAR, Mr Robert\"\tCrew\tBelfast\tExtra 5th Engineer\t0\t26\tMale\tFalse\tEngineering\n\"MILLAR, Mr Thomas\"\tCrew\tBelfast\tDeck Engineer\t0\t32\tMale\tFalse\tEngineering\n\"MINTRAM, Mr William\"\tCrew\tSouthampton\tFireman\t0\t46\tMale\tFalse\tEngineering\n\"MITCHELL, Mr Lorenzo (Lawrence) Horace\"\tCrew\tSouthampton\tTrimmer\t0\t18\tMale\tFalse\tEngineering\n\"MOORE, Mr John J.\"\tCrew\tSouthampton\tFireman\t0\t29\tMale\tTrue\tEngineering\n\"MOORE, Mr Ralph\"\tCrew\tSouthampton\tTrimmer\t0\t21\tMale\tFalse\tEngineering\n\"MOORES, Mr Richard Henry\"\tCrew\tSouthampton\tGreaser\t0\t44\tMale\tFalse\tEngineering\n\"MORGAN, Mr Arthur Herbert\"\tCrew\tSouthampton\tTrimmer\t0\t27\tMale\tFalse\tEngineering\n\"MORGAN, Mr Thomas A.\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"MORRIS, Mr Arthur\"\tCrew\tSouthampton\tGreaser\t0\t30\tMale\tFalse\tEngineering\n\"MORRIS, Mr William Edward\"\tCrew\tSouthampton\tTrimmer\t0\t22\tMale\tFalse\tEngineering\n\"MOYES, Mr William Young\"\tCrew\tBelfast\tSenior 6th. Engineer\t0\t23\tMale\tFalse\tEngineering\n\"NETTLETON, Mr George Walter\"\tCrew\tSouthampton\tFireman\t0\t29\tMale\tFalse\tEngineering\n\"NEWMAN, Mr Charles Thomas\"\tCrew\tSouthampton\tAssistant Storekeeper\t0\t33\tMale\tFalse\tEngineering\n\"NIVEN, Mr John Brown\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"NOON, Mr John\"\tCrew\tSouthampton\tFireman\t0\t35\tMale\tFalse\tEngineering\n\"NORRIS, Mr James\"\tCrew\tSouthampton\tFireman\t0\t23\tMale\tFalse\tEngineering\n\"NOSS, Mr Bertram Arthur\"\tCrew\tSouthampton\tFireman\t0\t21\tMale\tFalse\tEngineering\n\"NOSS, Mr Henry\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tTrue\tEngineering\n\"NUTBEAN, Mr William\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tTrue\tEngineering\n\"O'CONNOR, Mr John\"\tCrew\tSouthampton\tTrimmer\t0\t25\tMale\tTrue\tEngineering\n\"OLIVE, Mr Charles\"\tCrew\tSouthampton\tGreaser\t0\t31\tMale\tFalse\tEngineering\n\"OLIVER, Mr H.\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tTrue\tEngineering\n\"OTHEN, Mr Charles Alfred\"\tCrew\tSouthampton\tFireman\t0\t36\tMale\tTrue\tEngineering\n\"PAICE, Mr Richard Charles John\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"PAINTER, Mr Charles\"\tCrew\tSouthampton\tFireman\t0\t31\tMale\tFalse\tEngineering\n\"PAINTER, Mr Frank Frederick\"\tCrew\tSouthampton\tFireman\t0\t29\tMale\tFalse\tEngineering\n\"PALLES, Mr Thomas Henry Michael\"\tCrew\tBelfast\tGreaser\t0\t42\tMale\tFalse\tEngineering\n\"PARSONS, Mr Frank Alfred\"\tCrew\tBelfast\tSenior 5th. Engineer\t0\t26\tMale\tFalse\tEngineering\n\"PEARCE, Mr John\"\tCrew\tSouthampton\tFireman\t0\t28\tMale\tTrue\tEngineering\n\"PELHAM, Mr George\"\tCrew\tSouthampton\tTrimmer\t0\t39\tMale\tTrue\tEngineering\n\"PERRY, Mr Edgar Lionel\"\tCrew\tSouthampton\tTrimmer\t0\t19\tMale\tTrue\tEngineering\n\"PERRY, Mr Henry Frederick\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tFalse\tEngineering\n\"PHILLIPS, Mr A. George\"\tCrew\tSouthampton\tGreaser\t0\t27\tMale\tFalse\tEngineering\n\"PITFIELD, Mr William James\"\tCrew\tSouthampton\tGreaser\t0\t25\tMale\tFalse\tEngineering\n\"PODESTA, Mr Alfred John Alexander\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tTrue\tEngineering\n\"POND, Mr George\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"PRANGNELL, Mr George Alexander\"\tCrew\tSouthampton\tGreaser\t0\t30\tMale\tTrue\tEngineering\n\"PRESTON, Mr Thomas Charles Alfred\"\tCrew\tSouthampton\tTrimmer\t0\t20\tMale\tFalse\tEngineering\n\"PRIEST, Mr Arthur John\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tTrue\tEngineering\n\"PROUDFOOT, Mr Richard Royston\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tFalse\tEngineering\n\"PUGH, Mr Arthur Percy\"\tCrew\tSouthampton\tLeading Fireman\t0\t31\tMale\tFalse\tEngineering\n\"PUSEY, Mr William Robert Holland\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tTrue\tEngineering\n\"RANGER, Mr Thomas\"\tCrew\tSouthampton\tGreaser\t0\t29\tMale\tTrue\tEngineering\n\"READ, Mr Joseph\"\tCrew\tSouthampton\tTrimmer\t0\t21\tMale\tFalse\tEngineering\n\"REEVES, Mr Frederick Simms\"\tCrew\tSouthampton\tFireman\t0\t33\tMale\tFalse\tEngineering\n\"REID, Mr Robert Thomas\"\tCrew\tSouthampton\tTrimmer\t0\t30\tMale\tFalse\tEngineering\n\"RICE, Mr Charles\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tTrue\tEngineering\n\"RICHARDS, Mr Joseph James\"\tCrew\tSouthampton\tFireman\t0\t28\tMale\tFalse\tEngineering\n\"RICKMAN, Mr George Albert\"\tCrew\tSouthampton\tFireman\t0\t36\tMale\tFalse\tEngineering\n\"ROBERTS, Mr Robert George\"\tCrew\tSouthampton\tFireman\t0\t35\tMale\tFalse\tEngineering\n\"ROUS, Mr Arthur John\"\tCrew\tBelfast\tPlumber\t0\t26\tMale\tFalse\tEngineering\n\"RUDD, Mr Henry\"\tCrew\tSouthampton\tEngineers' storekeeper\t0\t23\tMale\tFalse\tEngineering\n\"RUTTER, Mr Sidney Frank\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"SANGSTER, Mr Charles Edward\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"SAUNDERS, Mr F.\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tFalse\tEngineering\n\"SAUNDERS, Mr Walter Ernest\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tFalse\tEngineering\n\"SAUNDERS, Mr W.\"\tCrew\tSouthampton\tFireman\t0\t23\tMale\tFalse\tEngineering\n\"SCOTT, Mr Frederick William\"\tCrew\tSouthampton\tGreaser\t0\t28\tMale\tTrue\tEngineering\n\"SCOTT, Mr Archibald\"\tCrew\tSouthampton\tFireman\t0\t41\tMale\tFalse\tEngineering\n\"SELF, Mr Alfred Henry\"\tCrew\tSouthampton\tGreaser\t0\t39\tMale\tFalse\tEngineering\n\"SELF, Mr Albert Charles Edward\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tTrue\tEngineering\n\"SENIOR, Mr Harry\"\tCrew\tSouthampton\tFireman\t0\t31\tMale\tTrue\tEngineering\n\"SHEA, Mr Thomas\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"SHEATH, Mr Frederick\"\tCrew\tSouthampton\tTrimmer\t0\t20\tMale\tTrue\tEngineering\n\"SHEPHERD, Mr Jonathan\"\tCrew\tSouthampton\tJunior Assistant 2nd. Engineer\t0\t32\tMale\tFalse\tEngineering\n\"SHIERS, Mr Alfred Charles\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tTrue\tEngineering\n\"SHILLABEER, Mr Charles Frederick\"\tCrew\tSouthampton\tTrimmer\t0\t19\tMale\tFalse\tEngineering\n\"SKEATES, Mr William\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tFalse\tEngineering\n\"SLOAN, Mr Peter\"\tCrew\tBelfast\tChief Electrician\t0\t31\tMale\tFalse\tEngineering\n\"SMALL, Mr William\"\tCrew\tSouthampton\tLeading Fireman\t0\t40\tMale\tFalse\tEngineering\n\"SMITH, Mr Emest George\"\tCrew\tSouthampton\tTrimmer\t0\t27\tMale\tFalse\tEngineering\n\"SMITH, Mr James Muil\"\tCrew\tBelfast\tJunior 4th. Engineer\t0\t39\tMale\tFalse\tEngineering\n\"SMITHER, Mr Harry James\"\tCrew\tSouthampton\tFireman\t0\t22\tMale\tFalse\tEngineering\n\"SNELLGROVE, Mr George\"\tCrew\tSouthampton\tFireman\t0\t40\tMale\tFalse\tEngineering\n\"SNOOKS, Mr W.\"\tCrew\tSouthampton\tTrimmer\t0\t26\tMale\tFalse\tEngineering\n\"SNOW, Mr Eustace Philip\"\tCrew\tSouthampton\tTrimmer\t0\t21\tMale\tTrue\tEngineering\n\"SPARKMAN, Mr Henry William\"\tCrew\tSouthampton\tFireman\t0\t35\tMale\tTrue\tEngineering\n\"STANBROOK, Mr Augustus George\"\tCrew\tSouthampton\tFireman\t0\t30\tMale\tFalse\tEngineering\n\"STEEL, Mr Robert Edward\"\tCrew\tSouthampton\tTrimmer\t0\t29\tMale\tFalse\tEngineering\n\"STOCKER, Mr Henry Dorey\"\tCrew\tSouthampton\tTrimmer\t0\t20\tMale\tFalse\tEngineering\n\"STREET, Mr Thomas Albert\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tTrue\tEngineering\n\"STUBBS, Mr James Henry\"\tCrew\tSouthampton\tFireman\t0\t28\tMale\tFalse\tEngineering\n\"SULLIVAN, Mr S.\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tFalse\tEngineering\n\"TAYLOR, Mr J.\"\tCrew\tSouthampton\tFireman\t0\t42\tMale\tFalse\tEngineering\n\"TAYLOR, Mr George\"\tCrew\tSouthampton\tFireman\t0\t24\tMale\tTrue\tEngineering\n\"TAYLOR, Mr John Henry\"\tCrew\tSouthampton\tFireman\t0\t49\tMale\tFalse\tEngineering\n\"TAYLOR, Mr William Henry\"\tCrew\tSouthampton\tFireman\t0\t27\tMale\tTrue\tEngineering\n\"THOMAS, Mr Joseph Wakefield\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tFalse\tEngineering\n\"THOMPSON, Mr John William\"\tCrew\tSouthampton\tFireman\t0\t35\tMale\tTrue\tEngineering\n\"THRELFALL, Mr Thomas\"\tCrew\tSouthampton\tLeading Fireman\t0\t44\tMale\tTrue\tEngineering\n\"THRESHER, Mr George Terrill\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tTrue\tEngineering\n\"TIZARD, Mr Arthur Leopold\"\tCrew\tSouthampton\tFireman\t0\t31\tMale\tFalse\tEngineering\n\"TOZER, Mr James\"\tCrew\tSouthampton\tGreaser\t0\t30\tMale\tFalse\tEngineering\n\"TRIGGS, Mr Robert\"\tCrew\tSouthampton\tFireman\t0\t40\tMale\tTrue\tEngineering\n\"TURLEY, Mr Richard\"\tCrew\tBelfast\tFireman\t0\t36\tMale\tFalse\tEngineering\n\"VAN DER BRUGGE, Mr Wessel Adrianus\"\tCrew\tSouthampton\tFireman\t0\t38\tMale\tFalse\tEngineering\n\"VEAL, Mr Arthur\"\tCrew\tSouthampton\tGreaser\t0\t36\tMale\tFalse\tEngineering\n\"VEAR, Mr Henry\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"VEAR, Mr William\"\tCrew\tSouthampton\tFireman\t0\t33\tMale\tFalse\tEngineering\n\"WARD, Mr Arthur\"\tCrew\tBelfast\tJunior Assistant 4th. Engineer\t0\t24\tMale\tFalse\tEngineering\n\"WARD, Mr James William\"\tCrew\tSouthampton\tLeading Fireman\t0\t31\tMale\tFalse\tEngineering\n\"WARDNER, Mr Fred Albert\"\tCrew\tSouthampton\tFireman\t0\t39\tMale\tFalse\tEngineering\n\"WATERIDGE, Mr Edward Lewis\"\tCrew\tSouthampton\tFireman\t0\t25\tMale\tFalse\tEngineering\n\"WATSON, Mr W.\"\tCrew\tSouthampton\tFireman\t0\t27\tMale\tFalse\tEngineering\n\"WATTS, Mr\"\tCrew\tSouthampton\tTrimmer\t0\t36\tMale\tFalse\tEngineering\n\"WEBB, Mr Samuel Francis\"\tCrew\tSouthampton\tTrimmer\t0\t28\tMale\tFalse\tEngineering\n\"WEBBER, Mr Francis Albert\"\tCrew\tSouthampton\tLeading Fireman\t0\t31\tMale\tFalse\tEngineering\n\"WHITE, Mr Albert\"\tCrew\tSouthampton\tTrimmer\t0\t21\tMale\tFalse\tEngineering\n\"WHITE, Mr Alfred\"\tCrew\tSouthampton\tGreaser\t0\t32\tMale\tTrue\tEngineering\n\"WHITE, Mr Frank Leonard\"\tCrew\tSouthampton\tTrimmer\t0\t28\tMale\tFalse\tEngineering\n\"WHITE, Mr William George\"\tCrew\tSouthampton\tTrimmer\t0\t23\tMale\tTrue\tEngineering\n\"WILLIAMS, Mr Samuel Solomon\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"WILSON, Mr Herbert 'Bertie'\"\tCrew\tBelfast\tSenior Assistant 2nd Engineer\t0\t28\tMale\tFalse\tEngineering\n\"WILTON, Mr William Edward\"\tCrew\tSouthampton\tTrimmer\t0\t53\tMale\tFalse\tEngineering\n\"WITCHER, Mr Albert Ernest\"\tCrew\tSouthampton\tFireman\t0\t39\tMale\tFalse\tEngineering\n\"WITT, Mr Henry Dennis\"\tCrew\tSouthampton\tFireman\t0\t37\tMale\tFalse\tEngineering\n\"WOOD, Mr Henry\"\tCrew\tSouthampton\tTrimmer\t0\t30\tMale\tFalse\tEngineering\n\"WOODFORD, Mr Frederick Ernest\"\tCrew\tSouthampton\tGreaser\t0\t40\tMale\tFalse\tEngineering\n\"WORTHMAN, Mr William Henry\"\tCrew\tSouthampton\tFireman\t0\t37\tMale\tFalse\tEngineering\n\"WYETH, Mr James Robert\"\tCrew\tSouthampton\tFireman\t0\t26\tMale\tFalse\tEngineering\n\"YOUNG, Mr Francis James\"\tCrew\tSouthampton\tFireman\t0\t32\tMale\tFalse\tEngineering\n\"ABBOTT, Mr Ernest Owen\"\tCrew\tSouthampton\tLounge Pantry Steward\t0\t21\tMale\tFalse\tVictualling\n\"AHIER, Mr Percy Snowden\"\tCrew\tSouthampton\tSaloon Steward\t0\t20\tMale\tFalse\tVictualling\n\"AKERMAN, Mr Albert Edward\"\tCrew\tSouthampton\t3rd Class Steward\t0\t31\tMale\tFalse\tVictualling\n\"AKERMAN, Mr Joseph Francis\"\tCrew\tSouthampton\tAssistant Pantryman Steward\t0\t35\tMale\tFalse\tVictualling\n\"ALLEN, Mr George\"\tCrew\tSouthampton\tScullion\t0\t26\tMale\tFalse\tVictualling\n\"ALLEN, Mr Robert Spencer\"\tCrew\tSouthampton\tBedroom Steward (1st Class)\t0\t36\tMale\tFalse\tVictualling\n\"ALLEN, Mr Frederick\"\tCrew\tSouthampton\tLift Steward\t0\t17\tMale\tFalse\tVictualling\n\"ALLSOP, Mr Frank Richard\"\tCrew\tBelfast\tSaloon Steward\t0\t41\tMale\tFalse\tVictualling\n\"ANDERSON, Mr Walter Yuill\"\tCrew\tSouthampton\tBed Room Steward\t0\t48\tMale\tFalse\tVictualling\n\"ANDREWS, Mr Charles Edward\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t19\tMale\tTrue\tVictualling\n\"ASHCROFT, Mr Austin Aloysius\"\tCrew\tSouthampton\tClerk\t0\t26\tMale\tFalse\tVictualling\n\"ASHE, Mr Henry Wellesley\"\tCrew\tSouthampton\tGlory hole steward (3rd class)\t0\t41\tMale\tFalse\tVictualling\n\"AYLING, Mr Edwin George\"\tCrew\tSouthampton\tAssistant Vegetable Cook\t0\t22\tMale\tFalse\tVictualling\n\"BACK, Mr Charles Frederick\"\tCrew\tBelfast\tAssistant Lounge Steward\t0\t32\tMale\tFalse\tVictualling\n\"BAGGOTT, Mr Allen Marden\"\tCrew\tSouthampton\tSaloon Steward\t0\t28\tMale\tTrue\tVictualling\n\"BAGLEY, Mr Edward Henry\"\tCrew\tSouthampton\tSaloon Steward\t0\t33\tMale\tFalse\tVictualling\n\"BAILEY, Mr George Francis\"\tCrew\tBelfast\tSaloon Steward\t0\t36\tMale\tFalse\tVictualling\n\"BALL, Mr Percy\"\tCrew\tSouthampton\tPlate Steward\t0\t19\tMale\tTrue\tVictualling\n\"BARKER, Mr Albert Vale\"\tCrew\tSouthampton\tBaker\t0\t19\tMale\tFalse\tVictualling\n\"BARKER, Mr Ernest Thomas\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t40\tMale\tFalse\tVictualling\n\"BARKER, Mr Reginald Lomond\"\tCrew\tBelfast\t\"Second Purser, 1st Class\"\t0\t40\tMale\tFalse\tVictualling\n\"BARLOW, Mr George\"\tCrew\tSouthampton\tBed Room Steward\t0\t36\tMale\tFalse\tVictualling\n\"BARNES, Mr Frederick Charles\"\tCrew\tSouthampton\tAssistant baker\t0\t39\tMale\tFalse\tVictualling\n\"BARRATT, Mr Arthur\"\tCrew\tSouthampton\tBell Boy\t0\t15\tMale\tFalse\tVictualling\n\"BARRINGER, Mr Arthur William\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t33\tMale\tFalse\tVictualling\n\"BARROW, Mr Charles Henry John Barrow\"\tCrew\tSouthampton\tAssistant butcher\t0\t35\tMale\tFalse\tVictualling\n\"BARROWS, Mr William\"\tCrew\tSouthampton\tSaloon Steward\t0\t32\tMale\tFalse\tVictualling\n\"BARTON, Mr Sidney John\"\tCrew\tSouthampton\t3rd Class Steward\t0\t26\tMale\tFalse\tVictualling\n\"BAXTER, Mr Harry Ross\"\tCrew\tSouthampton\t3rd Class Steward\t0\t53\tMale\tFalse\tVictualling\n\"BAXTER, Mr Thomas Ferguson\"\tCrew\tSouthampton\tLinen Steward (1st class)\t0\t55\tMale\tFalse\tVictualling\n\"BEDFORD, Mr William Barnett\"\tCrew\tSouthampton\tAssistant Roast Cook\t0\t31\tMale\tFalse\tVictualling\n\"BEEDEM, Mr George Arthur\"\tCrew\tSouthampton\t2nd Class Bedroom Steward\t0\t34\tMale\tFalse\tVictualling\n\"BEERE, Mr William\"\tCrew\tSouthampton\tKitchen Porter\t0\t19\tMale\tFalse\tVictualling\n\"BENHAM, Mr Fred John\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t29\tMale\tFalse\tVictualling\n\"BENNETT, Mrs Mabel\"\tCrew\tSouthampton\tStewardess\t0\t33\tFemale\tTrue\tVictualling\n\"BESSANT, Mr Edward\"\tCrew\tSouthampton\t1st class baggage steward\t0\t31\tMale\tFalse\tVictualling\n\"BEST, Mr Edwin Alfred\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t38\tMale\tFalse\tVictualling\n\"BISHOP, Mr Walter Alexander\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t33\tMale\tFalse\tVictualling\n\"BLISS, Mrs Emma\"\tCrew\tSouthampton\tStewardess\t0\t45\tFemale\tTrue\tVictualling\n\"BOCHATAY, Mr Alexis Joseph\"\tCrew\tSouthampton\tChef\t0\t30\tMale\tFalse\tVictualling\n\"BOGIE, Mr Norman Leslie\"\tCrew\tSouthampton\t2nd Class Bedroom Steward\t0\t59\tMale\tFalse\tVictualling\n\"BOND, Mr William John\"\tCrew\tBelfast\tBed Room Steward\t0\t40\tMale\tFalse\tVictualling\n\"BOOTHBY, Mr Walter Thomas\"\tCrew\tSouthampton\t2nd Class Bedroom Steward\t0\t37\tMale\tFalse\tVictualling\n\"BOSTON, Mr William John\"\tCrew\tBelfast\tAssistant Deck Steward (1st Class)\t0\t31\tMale\tFalse\tVictualling\n\"BOUGHTON, Mr Bernard John\"\tCrew\tSouthampton\tFirst class saloon steward\t0\t24\tMale\tFalse\tVictualling\n\"BOYD, Mr John\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t36\tMale\tFalse\tVictualling\n\"BOYES, Mr John Henry\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t36\tMale\tFalse\tVictualling\n\"BRADSHAW, Mr John Albert Perkin\"\tCrew\tSouthampton\tPlate Steward (1st Class)\t0\t43\tMale\tFalse\tVictualling\n\"BREWSTER, Mr George Henry\"\tCrew\tBelfast\tBedroom Steward (1st Class)\t0\t48\tMale\tFalse\tVictualling\n\"BRIDE, Mr Harold Sydney\"\tCrew\tBelfast\tAssistant Telegraphist\t0\t22\tMale\tTrue\tVictualling\n\"BRISTOW, Mr Robert Charles\"\tCrew\tSouthampton\t3rd Class Steward\t0\t31\tMale\tFalse\tVictualling\n\"BRISTOW, Mr Harry\"\tCrew\tSouthampton\tSaloon Steward\t0\t33\tMale\tFalse\tVictualling\n\"BROOKMAN, Mr John Cress\"\tCrew\tSouthampton\t3rd Class Steward\t0\t27\tMale\tFalse\tVictualling\n\"BROOM, Mr Herbert George\"\tCrew\tBelfast\tBath Steward\t0\t33\tMale\tFalse\tVictualling\n\"BROOME, Mr Athol Frederick\"\tCrew\tSouthampton\tVerandah Steward (1st Class)\t0\t30\tMale\tFalse\tVictualling\n\"BROWN, Mr Edward\"\tCrew\tBelfast\tSaloon Steward\t0\t34\tMale\tTrue\tVictualling\n\"BROWN, Mr Walter James\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t40\tMale\tFalse\tVictualling\n\"BUCKLEY, Mr H. E.\"\tCrew\tSouthampton\tAssistant Vegetable Cook\t0\t34\tMale\tFalse\tVictualling\n\"BULL, Mr W.\"\tCrew\tSouthampton\tScullion\t0\t30\tMale\tFalse\tVictualling\n\"BULLEY, Mr Henry Ashburnham\"\tCrew\tSouthampton\tBoots Steward (2nd class)\t0\t21\tMale\tFalse\tVictualling\n\"BUNNELL, Mr Wilfred James\"\tCrew\tBelfast\tPlate Steward\t0\t20\tMale\tFalse\tVictualling\n\"BURGESS, Mr Charles\"\tCrew\tSouthampton\tExtra 3rd. Baker\t0\t18\tMale\tTrue\tVictualling\n\"BURKE, Mr Richard Edward\"\tCrew\tBelfast\tLounge Steward (1st class)\t0\t30\tMale\tFalse\tVictualling\n\"BURKE, Mr William\"\tCrew\tBelfast\tSaloon Steward\t0\t31\tMale\tTrue\tVictualling\n\"BURR, Mr Ewart Sydenham\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t29\tMale\tFalse\tVictualling\n\"BURRAGE, Mr Arthur Victor Edwards\"\tCrew\tSouthampton\tPlate Steward\t0\t20\tMale\tTrue\tVictualling\n\"BUTT, Mr Robert Henry\"\tCrew\tSouthampton\tSaloon Steward\t0\t21\tMale\tFalse\tVictualling\n\"BUTTERWORTH, Mr John\"\tCrew\tSouthampton\tSaloon Steward\t0\t23\tMale\tFalse\tVictualling\n\"BYRNE, Mr James Edward\"\tCrew\tSouthampton\tBedroom Steward (2nd Class)\t0\t38\tMale\tFalse\tVictualling\n\"CAMPBELL, Mr Donald S.\"\tCrew\tSouthampton\t3rd Class Clerk\t0\t25\tFemale\tFalse\tVictualling\n\"CARNEY, Mr William\"\tCrew\tSouthampton\tLift Steward\t0\t31\tMale\tFalse\tVictualling\n\"CARTWRIGHT, Mr James Edward\"\tCrew\tBelfast\tSaloon Steward\t0\t32\tMale\tFalse\tVictualling\n\"CASSWILL, Mr Charles\"\tCrew\tSouthampton\tSaloon Steward\t0\t34\tMale\tFalse\tVictualling\n\"CATON, Miss Annie\"\tCrew\tSouthampton\tTurkish Bath Stewardess\t0\t33\tFemale\tTrue\tVictualling\n\"CAUNT, Mr William Ewart\"\tCrew\tSouthampton\tGrill Cook\t0\t27\tMale\tFalse\tVictualling\n\"CAVE, Mr Herbert\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t39\tMale\tFalse\tVictualling\n\"CECIL, Mr Charles Thomas\"\tCrew\tSouthampton\tSteward\t0\t21\tMale\tFalse\tVictualling\n\"CHAPMAN, Mr Joseph Charles\"\tCrew\tSouthampton\t\"Boots steward, 2nd class\"\t0\t32\tMale\tTrue\tVictualling\n\"CHARMAN, Mr John James\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t25\tMale\tFalse\tVictualling\n\"CHEVERTON, Mr William Frederick\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t27\tMale\tFalse\tVictualling\n\"CHITTY, Mr Archibald George\"\tCrew\tSouthampton\tThird Class Steward\t0\t28\tMale\tFalse\tVictualling\n\"CHITTY, Mr George Henry\"\tCrew\tSouthampton\tBaker\t0\t50\tMale\tFalse\tVictualling\n\"CHRISTMAS, Mr Herbert Harry\"\tCrew\tSouthampton\tAssistant Saloon Steward (2nd class)\t0\t33\tMale\tFalse\tVictualling\n\"COLEMAN, Mr Albert Edward\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t28\tMale\tFalse\tVictualling\n\"COLGAN, Mr E. Joseph\"\tCrew\tSouthampton\tScullion\t0\t33\tMale\tTrue\tVictualling\n\"COLLINS, Mr John\"\tCrew\tSouthampton\tScullion\t0\t17\tMale\tTrue\tVictualling\n\"CONWAY, Mr Percy Walter\"\tCrew\tBelfast\tSaloon Steward (2nd class)\t0\t24\tMale\tFalse\tVictualling\n\"COOK, Mr George\"\tCrew\tSouthampton\tSaloon Steward\t0\t32\tMale\tFalse\tVictualling\n\"COOMBS, Mr Charles Augustus\"\tCrew\tSouthampton\tAssistant Cook\t0\t44\tMale\tFalse\tVictualling\n\"CORBEN, Mr Ernest Theodore\"\tCrew\tSouthampton\tAssistant Printer Steward\t0\t27\tMale\tFalse\tVictualling\n\"COX, Mr William Denton\"\tCrew\tSouthampton\tThird class steward\t0\t29\tMale\tFalse\tVictualling\n\"CRAFTER, Mr Frederick Horace\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t20\tMale\tTrue\tVictualling\n\"CRAWFORD, Mr Alfred George\"\tCrew\tBelfast\tBed Room Steward\t0\t43\tMale\tTrue\tVictualling\n\"CRISP, Mr Albert Hector\"\tCrew\tBelfast\tSaloon Steward\t0\t39\tMale\tFalse\tVictualling\n\"CRISPIN, Mr William\"\tCrew\tSouthampton\tGlory Hole Steward\t0\t32\tMale\tFalse\tVictualling\n\"CROSBIE, Mr John Borthwick\"\tCrew\tSouthampton\tTurkish Bath Attendant\t0\t44\tMale\tFalse\tVictualling\n\"CROWE, Mr George Frederick\"\tCrew\tSouthampton\tSaloon Steward\t0\t30\tMale\tTrue\tVictualling\n\"CRUMPLIN, Mr Charles George Chandler\"\tCrew\tBelfast\tBed Room Steward\t0\t35\tMale\tFalse\tVictualling\n\"CULLEN, Mr Charles James\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t49\tMale\tTrue\tVictualling\n\"CUNNINGHAM, Mr Andrew Orr\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t38\tMale\tTrue\tVictualling\n\"DANIELS, Mr Sidney Edward\"\tCrew\tSouthampton\tThird class steward\t0\t18\tMale\tTrue\tVictualling\n\"DASHWOOD, Mr William George\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t18\tMale\tFalse\tVictualling\n\"DAVIES, Mr Gordon Raleigh\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t32\tMale\tFalse\tVictualling\n\"DAVIES, Mr Robert J.\"\tCrew\tBelfast\tSaloon Steward\t0\t26\tMale\tFalse\tVictualling\n\"DAVIS, Mr John\"\tCrew\tBelfast\tExtra 2nd Baker\t0\t29\tMale\tFalse\tVictualling\n\"DEAN, Mr George H.\"\tCrew\tSouthampton\tAssistant Saloon Steward\t0\t19\tMale\tFalse\tVictualling\n\"DEEBLE, Mr Alfred Arnold\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t34\tMale\tFalse\tVictualling\n\"DERRETT, Mr Arthur Henry\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t28\tMale\tFalse\tVictualling\n\"DESLANDES, Mr Percival Stainer\"\tCrew\tSouthampton\tSaloon Steward\t0\t36\tMale\tFalse\tVictualling\n\"DINENAGE, Mr James Richard\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t49\tMale\tFalse\tVictualling\n\"DODD, Mr George Charles\"\tCrew\tBelfast\t\"Second Steward, 1st Class\"\t0\t44\tMale\tFalse\tVictualling\n\"DOLBY, Mr Joseph\"\tCrew\tBelfast\tReception Steward (1st Class)\t0\t38\tMale\tFalse\tVictualling\n\"DONOGHUE, Mr Frank (?Thomas)\"\tCrew\tBelfast\tBed Room Steward\t0\t35\tMale\tFalse\tVictualling\n\"DOUGHTY, Mr Walter Thomas\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t22\tMale\tFalse\tVictualling\n\"DUNFORD, Mr William\"\tCrew\tSouthampton\tHospital Steward\t0\t47\tMale\tFalse\tVictualling\n\"DYER, Mr William Henry\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t31\tMale\tFalse\tVictualling\n\"EDBROOKE, Mr Francis Samuel Jacob\"\tCrew\tSouthampton\tThird class steward\t0\t23\tMale\tFalse\tVictualling\n\"EDE, Mr George Bulkeley\"\tCrew\tSouthampton\t3rd Class Steward\t0\t22\tMale\tFalse\tVictualling\n\"EDGE, Mr Frederick William\"\tCrew\tSouthampton\tDeck Steward (2nd class)\t0\t39\tMale\tFalse\tVictualling\n\"EDWARDS, Mr Charles Essex\"\tCrew\tSouthampton\tAssistant Pantryman Steward (1st Class)\t0\t39\tMale\tFalse\tVictualling\n\"EGG, Mr William Henry\"\tCrew\tSouthampton\tThird class steward\t0\t47\tMale\tFalse\tVictualling\n\"ELLIS, Mr John Bertie\"\tCrew\tSouthampton\tAssistant Vegetable Cook\t0\t28\tMale\tTrue\tVictualling\n\"ENNIS, Mr Walter\"\tCrew\tSouthampton\tTurkish Bath Attendant\t0\t34\tMale\tFalse\tVictualling\n\"ETCHES, Mr Henry Samuel\"\tCrew\tBelfast\tFirst class bedroom steward\t0\t43\tMale\tTrue\tVictualling\n\"EVANS, Mr George Richard\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t27\tMale\tFalse\tVictualling\n\"FAIRALL, Mr Henry Charles\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t38\tMale\tFalse\tVictualling\n\"FARENDEN, Mr Ernest John\"\tCrew\tBelfast\tConfectioner\t0\t22\tMale\tFalse\tVictualling\n\"FAULKNER, Mr William Stephen\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t37\tMale\tTrue\tVictualling\n\"FELLOWES, Mr Alfred James\"\tCrew\tBelfast\tAssistant boots steward (1st class)\t0\t29\tMale\tFalse\tVictualling\n\"FELTHAM, Mr George William\"\tCrew\tSouthampton\tVienna Baker\t0\t36\tMale\tFalse\tVictualling\n\"FINCH, Mr Henry Herman\"\tCrew\tSouthampton\tSteward (3rd Class)\t0\t18\tMale\tFalse\tVictualling\n\"FLETCHER, Mr Percy William\"\tCrew\tBelfast\tBugler Steward\t0\t26\tMale\tFalse\tVictualling\n\"FOLEY, Mr Wilfred Cyril\"\tCrew\tSouthampton\t3rd Class Steward\t0\t22\tMale\tTrue\tVictualling\n\"FORD, Mr Ernest\"\tCrew\tSouthampton\t3rd Class Steward\t0\t32\tMale\tFalse\tVictualling\n\"FORD, Mr Francis\"\tCrew\tSouthampton\tBedroom Steward (2nd class)\t0\t37\tMale\tFalse\tVictualling\n\"FOX, Mr William Thomas\"\tCrew\tSouthampton\tSteward\t0\t27\tMale\tFalse\tVictualling\n\"FRANKLIN, Mr Alan Vincent\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t28\tMale\tFalse\tVictualling\n\"FREEMAN, Mr Ernest Edward Samuel\"\tCrew\tBelfast\tDeck Steward (1st Class)\t0\t45\tMale\tFalse\tVictualling\n\"GEDDES, Mr Richard Charles\"\tCrew\tSouthampton\tBed Room Steward (1st class)\t0\t31\tMale\tFalse\tVictualling\n\"GIBBONS, Mr Jacob William\"\tCrew\tSouthampton\tSecond Class Steward\t0\t36\tMale\tTrue\tVictualling\n\"GILES, Mr John Robert\"\tCrew\tSouthampton\t2nd Baker\t0\t32\tMale\tFalse\tVictualling\n\"GILL, Mr Joseph Stanley\"\tCrew\tBelfast\tBed Room Steward\t0\t38\tMale\tFalse\tVictualling\n\"GILL, Mr Patrick\"\tCrew\tSouthampton\tShip's Cook\t0\t38\tMale\tFalse\tVictualling\n\"GOLD, Mrs Jane Kate Coulson\"\tCrew\tSouthampton\tStewardess\t0\t45\tFemale\tTrue\tVictualling\n\"GOLLOP, Mr F.\"\tCrew\tSouthampton\tAssistant Passage Cook\t0\t28\tMale\tFalse\tVictualling\n\"GOSHAWK, Mr Alfred James\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t40\tMale\tFalse\tVictualling\n\"GREGSON, Miss Mary\"\tCrew\tSouthampton\tStewardess\t0\t45\tFemale\tTrue\tVictualling\n\"GUNN, Mr Joseph Alfred\"\tCrew\tSouthampton\tAssistant Saloon Steward (2nd Class)\t0\t28\tMale\tFalse\tVictualling\n\"GUY, Mr Elgar John\"\tCrew\tSouthampton\tBoots\t0\t28\tMale\tTrue\tVictualling\n\"GWINN, Mr William Logan\"\tCrew\tSouthampton\tPostal Clerk / Postman\t0\t37\tMale\tFalse\tVictualling\n\"HALFORD, Mr Walter Stamford\"\tCrew\tSouthampton\tSteward\t0\t22\tMale\tTrue\tVictualling\n\"HALL, Mr Frank Alfred James\"\tCrew\tSouthampton\tScullion\t0\t38\tMale\tFalse\tVictualling\n\"HAMBLYN, Mr Ernest William\"\tCrew\tSouthampton\t2nd Class Bedroom Steward\t0\t46\tMale\tFalse\tVictualling\n\"HAMILTON, Mr Ernest\"\tCrew\tBelfast\tAssistant Smoke Room Steward (1st class)\t0\t25\tMale\tFalse\tVictualling\n\"HARDING, Mr Alfred John\"\tCrew\tSouthampton\tAssistant Pantry Steward (2nd class)\t0\t20\tMale\tFalse\tVictualling\n\"HARDWICK, Mr Reginald\"\tCrew\tSouthampton\tKitchen Porter\t0\t21\tMale\tTrue\tVictualling\n\"HARDY, Mr John\"\tCrew\tBelfast\tChief Second Class Steward\t0\t40\tMale\tTrue\tVictualling\n\"HARRIS, Mr Charles William\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t19\tMale\tFalse\tVictualling\n\"HARRIS, Mr Clifford Henry\"\tCrew\tSouthampton\tBell Boy\t0\t16\tMale\tFalse\tVictualling\n\"HARRIS, Mr Edward Matthew\"\tCrew\tSouthampton\tAssistant Pantryman Steward (1st Class)\t0\t18\tMale\tFalse\tVictualling\n\"HARRISON, Mr Arag�a Drummond\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t40\tMale\tTrue\tVictualling\n\"HART, Mr John Edward\"\tCrew\tSouthampton\tSteward\t0\t31\tMale\tTrue\tVictualling\n\"HARTNELL, Mr Fred\"\tCrew\tSouthampton\tSaloon Steward\t0\t21\tMale\tTrue\tVictualling\n\"HATCH, Mr Hugh\"\tCrew\tSouthampton\tScullion\t0\t23\tMale\tFalse\tVictualling\n\"HAWKESWORTH, Mr James\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t38\tMale\tFalse\tVictualling\n\"HAWKESWORTH, Mr William Walter\"\tCrew\tSouthampton\tDeck Steward (1st class)\t0\t43\tMale\tFalse\tVictualling\n\"HAYTER, Mr Arthur\"\tCrew\tBelfast\tBed Room Steward\t0\t44\tMale\tFalse\tVictualling\n\"HEINEN, Mr Joseph Dominichus\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t30\tMale\tFalse\tVictualling\n\"HENDY, Mr Edward Martin\"\tCrew\tBelfast\tSaloon Steward\t0\t39\tMale\tFalse\tVictualling\n\"HENSFORD, Mr Herbert George Ernest\"\tCrew\tSouthampton\tAssistant Butcher\t0\t26\tMale\tFalse\tVictualling\n\"HEWITT, Mr Thomas\"\tCrew\tBelfast\tBed Room Steward (1st class)\t0\t37\tMale\tFalse\tVictualling\n\"HILL, Mr H. P.\"\tCrew\tSouthampton\tSteward\t0\t36\tMale\tFalse\tVictualling\n\"HILL, Mr James Colston\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t38\tMale\tFalse\tVictualling\n\"HINCKLEY, Mr George Herbert\"\tCrew\tSouthampton\tBathroom Steward (1st Class)\t0\t39\tMale\tFalse\tVictualling\n\"HINE, Mr William Edward\"\tCrew\tSouthampton\t3rd Baker\t0\t36\tMale\tFalse\tVictualling\n\"HISCOCK, Mr Sydney George\"\tCrew\tSouthampton\tPlate Steward\t0\t22\tMale\tFalse\tVictualling\n\"HOARE, Mr Leonard James\"\tCrew\tBelfast\tSaloon Steward\t0\t16\tMale\tFalse\tVictualling\n\"HOGG, Mr Charles William\"\tCrew\tSouthampton\t1st Class Bedroom Steward\t0\t43\tMale\tFalse\tVictualling\n\"HOGUE, Mr E.\"\tCrew\tSouthampton\tPlate Steward\t0\t22\tMale\tFalse\tVictualling\n\"HOLLAND, Mr Thomas\"\tCrew\tBelfast\tReception Steward\t0\t28\tMale\tFalse\tVictualling\n\"HOLLOWAY, Mr Sidney\"\tCrew\tSouthampton\tAssistant clothes presser steward\t0\t20\tMale\tFalse\tVictualling\n\"HOPKINS, Mr Frederick William\"\tCrew\tSouthampton\tPlate Steward\t0\t16\tMale\tFalse\tVictualling\n\"HOUSE, Mr William John\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t38\tMale\tFalse\tVictualling\n\"HOWELL, Mr Arthur Albert\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t31\tMale\tFalse\tVictualling\n\"HUGHES, Mr William Thomas\"\tCrew\tSouthampton\tAssistant Second Steward (1st Class)\t0\t33\tMale\tFalse\tVictualling\n\"HUMBY, Mr Frederick Charles\"\tCrew\tSouthampton\tPlate Steward (2nd Class)\t0\t17\tMale\tFalse\tVictualling\n\"HUMPHREYS, Mr Humphrey\"\tCrew\tSouthampton\t\"Assistant Saloon Steward, 2nd Class\"\t0\t31\tMale\tFalse\tVictualling\n\"HUTCHINSON, Mr James\"\tCrew\tSouthampton\tVegetable. Cook\t0\t28\tMale\tFalse\tVictualling\n\"HYLAND, Mr James Leo\"\tCrew\tSouthampton\tSteward (3rd Class)\t0\t19\tMale\tTrue\tVictualling\n\"IDE, Mr Harry John\"\tCrew\tSouthampton\t1st Class Bedroom Steward\t0\t31\tMale\tFalse\tVictualling\n\"INGROUILLE, Mr Henry\"\tCrew\tSouthampton\tSteward\t0\t21\tMale\tFalse\tVictualling\n\"INGS, Mr William Ernest\"\tCrew\tSouthampton\tScullion\t0\t20\tMale\tFalse\tVictualling\n\"JACKSON, Mr Cecil\"\tCrew\tBelfast\tAssistant boots steward (1st class)\t0\t22\tMale\tFalse\tVictualling\n\"JANAWAY, Mr William Frank\"\tCrew\tBelfast\tBed Room Steward\t0\t35\tMale\tFalse\tVictualling\n\"JENNER, Mr Thomas Henry (Harry)\"\tCrew\tBelfast\tSaloon Steward\t0\t55\tMale\tFalse\tVictualling\n\"JENSEN, Mr Charles Valdemar\"\tCrew\tSouthampton\tSaloon Steward\t0\t25\tMale\tFalse\tVictualling\n\"JESSOP, Miss Violet Constance\"\tCrew\tSouthampton\tStewardess\t0\t24\tFemale\tTrue\tVictualling\n\"JOHNSTON, Mr James\"\tCrew\tBelfast\tSaloon Steward\t0\t41\tMale\tTrue\tVictualling\n\"JONES, Mr Albert Hugh Brabner\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t17\tMale\tFalse\tVictualling\n\"JONES, Mr Arthur Ernest\"\tCrew\tSouthampton\tPlate Steward (2nd Class)\t0\t37\tMale\tFalse\tVictualling\n\"JONES, Mr H.\"\tCrew\tSouthampton\tRoast Cook\t0\t29\tMale\tFalse\tVictualling\n\"JONES, Mr Victor Reginald\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t20\tMale\tFalse\tVictualling\n\"JOUGHIN, Mr Charles John\"\tCrew\tBelfast\tChief Baker\t0\t32\tMale\tTrue\tVictualling\n\"KEEN, Mr Percy Edward\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t30\tMale\tTrue\tVictualling\n\"KELLAND, Mr Thomas\"\tCrew\tSouthampton\t2nd class library steward\t0\t18\tMale\tFalse\tVictualling\n\"KENNELL, Mr Charles\"\tCrew\tSouthampton\tHebrew Cook\t0\t30\tMale\tFalse\tVictualling\n\"KERLEY, Mr William Thomas\"\tCrew\tSouthampton\tAssistant Saloon Steward (2nd class)\t0\t28\tMale\tFalse\tVictualling\n\"KETCHLEY, Mr Henry\"\tCrew\tBelfast\tSaloon Steward\t0\t35\tMale\tFalse\tVictualling\n\"KIERAN, Mr James William\"\tCrew\tSouthampton\tChief 3rd Class Steward\t0\t34\tMale\tFalse\tVictualling\n\"KIERAN, Mr Edgar Michael\"\tCrew\tSouthampton\tStorekeeper\t0\t34\tMale\tFalse\tVictualling\n\"KING, Mr Alfred John Moffett\"\tCrew\tSouthampton\tLift Steward\t0\t18\tMale\tFalse\tVictualling\n\"KING, Mr Ernest Waldron\"\tCrew\tSouthampton\tClerk (1st class)\t0\t28\tMale\tFalse\tVictualling\n\"KING, Mr G.\"\tCrew\tSouthampton\tScullion\t0\t20\tMale\tFalse\tVictualling\n\"KINGSCOTE, Mr William Ford\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t42\tMale\tFalse\tVictualling\n\"KIRKALDY, Mr Thomas Benjamin\"\tCrew\tSouthampton\tBed Room Steward\t0\t39\tMale\tFalse\tVictualling\n\"KITCHING, Mr Arthur Alfred\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t30\tMale\tFalse\tVictualling\n\"KLEIN, Mr Herbert\"\tCrew\tSouthampton\tBarber\t0\t33\tMale\tFalse\tVictualling\n\"KNIGHT, Mr George\"\tCrew\tSouthampton\tSaloon Steward\t0\t44\tMale\tTrue\tVictualling\n\"KNIGHT, Mr Leonard George\"\tCrew\tSouthampton\tSteward (3rd class)\t0\t21\tMale\tFalse\tVictualling\n\"LACEY, Mr Bertie William\"\tCrew\tSouthampton\t\"Assistant Saloon steward, 2nd Class\"\t0\t19\tMale\tFalse\tVictualling\n\"LAKE, Mr William\"\tCrew\tBelfast\tSaloon Steward\t0\t35\tMale\tFalse\tVictualling\n\"LANE, Mr Albert Edward\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t34\tMale\tFalse\tVictualling\n\"LATIMER, Mr Andrew\"\tCrew\tBelfast\tChief Steward\t0\t55\tMale\tFalse\tVictualling\n\"LAVINGTON, Miss Elizabeth\"\tCrew\tSouthampton\tStewardess\t0\t40\tFemale\tTrue\tVictualling\n\"LAWRENCE, Mr Arthur\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t35\tMale\tFalse\tVictualling\n\"LEADER, Mr Archibald\"\tCrew\tSouthampton\tConfectioner\t0\t22\tMale\tFalse\tVictualling\n\"LEATHER, Mrs Elizabeth Mary\"\tCrew\tSouthampton\tStewardess\t0\t41\tFemale\tTrue\tVictualling\n\"LEE, Mr Henry Reginald\"\tCrew\tSouthampton\tScullion\t0\t29\tMale\tTrue\tVictualling\n\"LEFEBVRE, Mr Paul Georges\"\tCrew\tSouthampton\tSaloon Steward\t0\t35\tMale\tFalse\tVictualling\n\"LEONARD, Mr Matthew\"\tCrew\tBelfast\t3rd Class Steward\t0\t25\tMale\tFalse\tVictualling\n\"LEVETT, Mr George Alfred\"\tCrew\tBelfast\tAssistant Pantryman Steward (1st Class)\t0\t21\tMale\tFalse\tVictualling\n\"LEWIS, Mr Arthur Ernest Read\"\tCrew\tSouthampton\tSteward\t0\t27\tMale\tTrue\tVictualling\n\"LIGHT, Mr Charles Edward\"\tCrew\tSouthampton\tPlate Steward (1st class)\t0\t23\tMale\tFalse\tVictualling\n\"LITTLEJOHN, Mr Alexander James\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t40\tMale\tTrue\tVictualling\n\"LLOYD, Mr Humphrey\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t41\tMale\tFalse\tVictualling\n\"LOCKE, Mr A.\"\tCrew\tSouthampton\tScullion\t0\t33\tMale\tFalse\tVictualling\n\"LONGMUIR, Mr John Dickson\"\tCrew\tSouthampton\tAssistant Pantry Steward (2nd class)\t0\t19\tMale\tFalse\tVictualling\n\"LOVELL, Mr John\"\tCrew\tSouthampton\tGrill Cook\t0\t37\tMale\tFalse\tVictualling\n\"LUCAS, Mr William Watson\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t31\tMale\tTrue\tVictualling\n\"LYDIATT, Mr Charles\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t45\tMale\tFalse\tVictualling\n\"MABEY, Mr John Charles\"\tCrew\tSouthampton\t3rd Class Steward\t0\t23\tMale\tFalse\tVictualling\n\"MACKAY, Mr Charles Donald\"\tCrew\tBelfast\tSaloon Steward\t0\t34\tMale\tTrue\tVictualling\n\"MACKIE, Mr George William\"\tCrew\tSouthampton\t2nd Class Bedroom Steward\t0\t34\tMale\tFalse\tVictualling\n\"MAJOR, Mr Thomas Edgar\"\tCrew\tBelfast\tBathroom Steward (1st Class)\t0\t35\tMale\tFalse\tVictualling\n\"MANTLE, Mr Roland Frederick\"\tCrew\tSouthampton\t3rd Class Steward\t0\t40\tMale\tFalse\tVictualling\n\"MARCH, Mr John Starr\"\tCrew\tSouthampton\tPostal Clerk / Postman\t0\t50\tMale\tFalse\tVictualling\n\"MARKS, Mr James\"\tCrew\tSouthampton\tAssistant Pantryman Steward (1st Class)\t0\t27\tMale\tFalse\tVictualling\n\"MARRIOTT, Mr John William\"\tCrew\tSouthampton\tAssistant Pantryman Steward (1st Class)\t0\t20\tMale\tFalse\tVictualling\n\"MARSDEN, Miss Evelyn\"\tCrew\tSouthampton\tStewardess\t0\t28\tFemale\tTrue\tVictualling\n\"MARTIN, Mrs Annie Martha\"\tCrew\tSouthampton\tStewardess\t0\t39\tFemale\tTrue\tVictualling\n\"MAYNARD, Mr Isaac Hiram\"\tCrew\tBelfast\tEntr�e Cook\t0\t31\tMale\tTrue\tVictualling\n\"MAYTUM, Mr Alfred\"\tCrew\tBelfast\tChief Butcher\t0\t52\tMale\tFalse\tVictualling\n\"M�LLER, Mr Ludwig\"\tCrew\tSouthampton\tInterpreter Steward (3rd Class)\t0\t36\tMale\tFalse\tVictualling\n\"MCCARTHY, Mr Frederick James\"\tCrew\tSouthampton\tBedroom Steward (1st Class)\t0\t38\tMale\tFalse\tVictualling\n\"MCCAWLEY, Mr Thomas W.\"\tCrew\tBelfast\tGymnasium Steward\t0\t36\tMale\tFalse\tVictualling\n\"MCELROY, Mr Hugh Walter\"\tCrew\tSouthampton\tPurser\t0\t37\tMale\tFalse\tVictualling\n\"MCGRADY, Mr James\"\tCrew\tSouthampton\tSaloon Steward\t0\t27\tMale\tFalse\tVictualling\n\"MCLAREN, Mrs Hypatia\"\tCrew\tSouthampton\tStewardess\t0\t40\tFemale\tTrue\tVictualling\n\"MCMICKEN, Mr Arthur\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t23\tMale\tTrue\tVictualling\n\"MCMICKEN, Mr Benjamin Tucker\"\tCrew\tBelfast\tSecond Pantry Steward\t0\t21\tMale\tFalse\tVictualling\n\"MCMULLIN, Mr John Richard\"\tCrew\tBelfast\tFirst class saloon steward\t0\t32\tMale\tFalse\tVictualling\n\"MCMURRAY, Mr William\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t43\tMale\tFalse\tVictualling\n\"MELLOR, Mr Arthur\"\tCrew\tSouthampton\tSaloon Steward\t0\t34\tMale\tFalse\tVictualling\n\"MIDDLETON, Mr Mark Victor\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t24\tMale\tFalse\tVictualling\n\"MILLS, Mr Christopher\"\tCrew\tSouthampton\tButcher\t0\t51\tMale\tTrue\tVictualling\n\"MISHELLANY, Mr Abraham Mansoor\"\tCrew\tBelfast\tPrinter Steward\t0\t53\tMale\tFalse\tVictualling\n\"MOORE, Mr Alfred Ernest\"\tCrew\tSouthampton\t\"Saloon Steward, 2nd Class\"\t0\t39\tMale\tFalse\tVictualling\n\"MORGAN (BIRD), Mr Charles Frederick\"\tCrew\tSouthampton\tStorekeeper (1st Class)\t0\t42\tMale\tFalse\tVictualling\n\"MORRIS, Mr Frank Herbert\"\tCrew\tBelfast\tBathroom Steward (1st Class)\t0\t28\tMale\tTrue\tVictualling\n\"MOSS, Mr William\"\tCrew\tBelfast\t1st. Saloon Steward\t0\t34\tMale\tFalse\tVictualling\n\"MULLIN, Mr Thomas\"\tCrew\tSouthampton\t3rd Class Steward\t0\t20\tMale\tFalse\tVictualling\n\"NEAL, Mr Bentley Harold\"\tCrew\tSouthampton\tBaker\t0\t25\tMale\tTrue\tVictualling\n\"NICHOLLS, Mr Sidney\"\tCrew\tSouthampton\tSaloon Steward\t0\t39\tMale\tFalse\tVictualling\n\"NICHOLS, Mr A.D.\"\tCrew\tSouthampton\tSteward\t0\t34\tMale\tFalse\tVictualling\n\"NICHOLS, Mr Walter Henry\"\tCrew\tSouthampton\t\"Assistant Saloon Steward, 2nd class\"\t0\t35\tMale\tTrue\tVictualling\n\"O'CONNOR, Mr Thomas Peter\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t43\tMale\tFalse\tVictualling\n\"OLIVE, Mr Ernest Roskelly\"\tCrew\tSouthampton\tClothes Presser Steward (1st class)\t0\t26\tMale\tFalse\tVictualling\n\"ORPET, Mr Walter Hayward\"\tCrew\tSouthampton\tSaloon Steward\t0\t31\tMale\tFalse\tVictualling\n\"ORR, Mr J.\"\tCrew\tSouthampton\tAssistant Vegetable Cook\t0\t40\tMale\tFalse\tVictualling\n\"OSBORNE, Mr William Edward\"\tCrew\tBelfast\tSaloon Steward\t0\t32\tMale\tFalse\tVictualling\n\"OWEN, Mr Lewis\"\tCrew\tSouthampton\tAssistant Saloon Steward\t0\t49\tMale\tFalse\tVictualling\n\"PACEY, Mr Reginald lvan\"\tCrew\tSouthampton\tLift Steward\t0\t17\tMale\tFalse\tVictualling\n\"PAINTIN, Mr James Arthur\"\tCrew\tSouthampton\tCaptain's Steward (Tiger)\t0\t29\tMale\tFalse\tVictualling\n\"PARSONS, Mr Edward\"\tCrew\tSouthampton\tChief Storekeeper (1st Class)\t0\t37\tMale\tFalse\tVictualling\n\"PARSONS, Mr Richard Henry\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t18\tMale\tFalse\tVictualling\n\"PEARCE, Mr Alfred Emest\"\tCrew\tSouthampton\tSteward\t0\t24\tMale\tFalse\tVictualling\n\"PEARCEY, Mr Albert Victor\"\tCrew\tSouthampton\tPantry Steward (3rd Class)\t0\t25\tMale\tTrue\tVictualling\n\"PENNAL, Mr Thomas Frederick Cohen\"\tCrew\tSouthampton\tBathroom Steward (1st Class)\t0\t33\tMale\tFalse\tVictualling\n\"PENNY, Mr William Farr\"\tCrew\tSouthampton\tAssistant Saloon Steward (2nd Class)\t0\t31\tMale\tFalse\tVictualling\n\"PENROSE, Mr John Poole\"\tCrew\tBelfast\tBedroom Steward (1st Class)\t0\t49\tMale\tFalse\tVictualling\n\"PERKINS, Mr Laurence Alexander\"\tCrew\tSouthampton\tTelephone Operator Steward\t0\t22\tMale\tFalse\tVictualling\n\"PERREN, Mr William Charles\"\tCrew\tSouthampton\tBoots Steward (2nd class)\t0\t47\tMale\tFalse\tVictualling\n\"PERRITON, Mr Hubert Prouse\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t31\tMale\tFalse\tVictualling\n\"PETTY, Mr Edwin Henry\"\tCrew\tSouthampton\tBedroom Steward (2nd class)\t0\t25\tMale\tFalse\tVictualling\n\"PFROPPER, Mr Richard Paul Jozef\"\tCrew\tSouthampton\tSaloon Steward\t0\t30\tMale\tTrue\tVictualling\n\"PHILLIMORE, Mr Harold Charles William\"\tCrew\tBelfast\tSaloon Steward (2nd class)\t0\t23\tMale\tTrue\tVictualling\n\"PHILLIPS, Mr John George\"\tCrew\tBelfast\tTelegraphist\t0\t25\tMale\tFalse\tVictualling\n\"PLATT, Mr Wilfred George\"\tCrew\tSouthampton\tScullion\t0\t18\tMale\tFalse\tVictualling\n\"POOK, Mr Percy Robert\"\tCrew\tSouthampton\tAssistant pantry steward\t0\t34\tMale\tFalse\tVictualling\n\"PORT, Mr Frank\"\tCrew\tSouthampton\tSteward\t0\t22\tMale\tTrue\tVictualling\n\"PORTEUS, Mr Thomas Henry\"\tCrew\tSouthampton\tButcher\t0\t32\tMale\tFalse\tVictualling\n\"PRENTICE, Mr Frank Winnold\"\tCrew\tSouthampton\tStorekeeper\t0\t23\tMale\tTrue\tVictualling\n\"PRICHARD, Mrs Alice Maud\"\tCrew\tSouthampton\tStewardess\t0\t34\tFemale\tTrue\tVictualling\n\"PRIDEAUX, Mr John Arthur (Jack)\"\tCrew\tSouthampton\t3rd Class Steward\t0\t23\tMale\tFalse\tVictualling\n\"PRIOR, Mr Harold John Arnold\"\tCrew\tSouthampton\tSteward (3rd Class)\t0\t21\tMale\tTrue\tVictualling\n\"PROCTOR, Mr Charles\"\tCrew\tBelfast\tChef\t0\t45\tMale\tFalse\tVictualling\n\"PRYCE, Mr Charles William\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t22\tMale\tFalse\tVictualling\n\"PUGH, Mr Alfred\"\tCrew\tSouthampton\t3rd Class Steward\t0\t20\tMale\tTrue\tVictualling\n\"PUZEY, Mr John Edward\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t44\tMale\tFalse\tVictualling\n\"RANDALL, Mr Frank Henry\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t29\tMale\tFalse\tVictualling\n\"RANSOM, Mr James Augustus\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t49\tMale\tFalse\tVictualling\n\"RATTENBURY, Mr William Henry\"\tCrew\tBelfast\tBoots steward (1st class)\t0\t37\tMale\tFalse\tVictualling\n\"RAY, Mr Frederick Dent\"\tCrew\tBelfast\tSaloon Steward\t0\t32\tMale\tTrue\tVictualling\n\"REED, Mr Thomas Charles Prowse\"\tCrew\tSouthampton\tBed Room Steward\t0\t54\tMale\tFalse\tVictualling\n\"REVELL, Mr William James Francis\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t31\tMale\tFalse\tVictualling\n\"RICE, Mr John Reginald\"\tCrew\tSouthampton\t1st Class Clerk\t0\t25\tMale\tFalse\tVictualling\n\"RICE, Mr Percy\"\tCrew\tSouthampton\t3rd Class Steward\t0\t19\tMale\tFalse\tVictualling\n\"RICKS, Mr Cyril Gordon\"\tCrew\tSouthampton\tStorekeeper\t0\t23\tMale\tFalse\tVictualling\n\"RIDOUT, Mr Walter George\"\tCrew\tSouthampton\tSecond Class Saloon Steward\t0\t29\tMale\tFalse\tVictualling\n\"RIMMER, Mr Gilbert\"\tCrew\tSouthampton\tSaloon Steward\t0\t28\tMale\tFalse\tVictualling\n\"ROBERTON, Mr George Edward\"\tCrew\tSouthampton\tAssistant Saloon Steward (2nd Class)\t0\t19\tMale\tFalse\tVictualling\n\"ROBERTS, Mrs Mary Kezia\"\tCrew\tSouthampton\tStewardess\t0\t41\tFemale\tTrue\tVictualling\n\"ROBERTS, Mr Frank John\"\tCrew\tBelfast\tThird Butcher\t0\t36\tMale\tFalse\tVictualling\n\"ROBERTS, Mr Hugh H.\"\tCrew\tBelfast\tBed Room Steward\t0\t40\tMale\tFalse\tVictualling\n\"ROBINSON, Mrs Annie\"\tCrew\tSouthampton\tStewardess\t0\t40\tFemale\tTrue\tVictualling\n\"ROBINSON, Mr James William\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t30\tMale\tFalse\tVictualling\n\"ROGERS, Mr Edward James William\"\tCrew\tSouthampton\tAssistant Storekeeper\t0\t31\tMale\tFalse\tVictualling\n\"ROGERS, Mr Michael\"\tCrew\tSouthampton\tSaloon Steward\t0\t27\tMale\tFalse\tVictualling\n\"ROSS, Mr Horace Leopold\"\tCrew\tSouthampton\tScullion\t0\t38\tMale\tTrue\tVictualling\n\"ROWE, Mr Edgar Maurice\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t31\tMale\tFalse\tVictualling\n\"RULE, Mr Samuel James\"\tCrew\tBelfast\tBathroom Steward (1st Class)\t0\t58\tMale\tTrue\tVictualling\n\"RUSSELL, Mr Boysie Richard\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t17\tMale\tFalse\tVictualling\n\"RYAN, Mr Thomas\"\tCrew\tSouthampton\tSteward\t0\t27\tMale\tFalse\tVictualling\n\"RYERSON, Mr William Edwy\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t33\tMale\tTrue\tVictualling\n\"SAMUEL, Mr Owen Wilmore\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t46\tMale\tFalse\tVictualling\n\"SAUNDERS, Mr D. E.\"\tCrew\tSouthampton\tSaloon Steward\t0\t26\tMale\tFalse\tVictualling\n\"SAVAGE, Mr Charles Joseph\"\tCrew\tSouthampton\tSteward\t0\t23\tMale\tTrue\tVictualling\n\"SCOTT, Mr John\"\tCrew\tSouthampton\tAssistant boots steward (1st Class)\t0\t19\tMale\tFalse\tVictualling\n\"SCOVELL, Mr Robert\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t54\tMale\tFalse\tVictualling\n\"SEDUNARY, Mr Samuel Francis\"\tCrew\tSouthampton\tSecond third class steward\t0\t25\tMale\tFalse\tVictualling\n\"SEWARD, Mr Wilfred Deable\"\tCrew\tSouthampton\tChief Pantry Steward (2nd Class)\t0\t25\tMale\tTrue\tVictualling\n\"SHAW, Mr Henry\"\tCrew\tSouthampton\tKitchen Porter\t0\t39\tMale\tFalse\tVictualling\n\"SHEA, Mr John Joseph\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t39\tMale\tFalse\tVictualling\n\"SIEBERT, Mr Sidney Conrad\"\tCrew\tBelfast\tBed Room Steward\t0\t29\tMale\tFalse\tVictualling\n\"SIMMONS, Mr Andrew George James\"\tCrew\tSouthampton\tScullion\t0\t31\tMale\tTrue\tVictualling\n\"SIMMONS, Mr Frederick Charles\"\tCrew\tSouthampton\tSaloon Steward\t0\t24\tMale\tFalse\tVictualling\n\"SIMMONS, Mr William Simon C.\"\tCrew\tSouthampton\tPassage Cook\t0\t35\tMale\tFalse\tVictualling\n\"SIVIER, Mr William\"\tCrew\tSouthampton\tSteward (3rd Class)\t0\t23\tMale\tFalse\tVictualling\n\"SKINNER, Mr Edward\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t33\tMale\tFalse\tVictualling\n\"SLIGHT, Mr Harry John\"\tCrew\tSouthampton\t3rd Class Steward\t0\t33\tMale\tFalse\tVictualling\n\"SLIGHT, Mr William Henry James\"\tCrew\tBelfast\tLarder Cook\t0\t36\tMale\tFalse\tVictualling\n\"SLOAN, Miss Mary\"\tCrew\tSouthampton\tStewardess\t0\t28\tFemale\tTrue\tVictualling\n\"SLOCOMBE, Mrs Maude Louise\"\tCrew\tSouthampton\tTurkish Bath Stewardess\t0\t30\tFemale\tTrue\tVictualling\n\"SMILLIE, Mr John\"\tCrew\tBelfast\tSaloon Steward\t0\t29\tMale\tFalse\tVictualling\n\"SMITH, Mr Charles\"\tCrew\tSouthampton\tKitchen Porter\t0\t38\tMale\tFalse\tVictualling\n\"SMITH, Mr Charles Edwin\"\tCrew\tSouthampton\t2nd Class Bedroom Steward\t0\t38\tMale\tFalse\tVictualling\n\"SMITH, Mr F.\"\tCrew\tBelfast\tAssistant Pantryman Steward\t0\t20\tMale\tFalse\tVictualling\n\"SMITH, Mr James William\"\tCrew\tSouthampton\tAssistant baker\t0\t24\tMale\tFalse\tVictualling\n\"SMITH, Mr John Richard Jago\"\tCrew\tSouthampton\tPostal Clerk / Postman\t0\t35\tMale\tFalse\tVictualling\n\"SMITH, Miss Katherine Elizabeth\"\tCrew\tSouthampton\tStewardess\t0\t44\tFemale\tTrue\tVictualling\n\"SMITH, Mr Reginald George\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t32\tMale\tFalse\tVictualling\n\"SNAPE, Mrs Lucy Violet\"\tCrew\tSouthampton\tStewardess\t0\t22\tFemale\tFalse\tVictualling\n\"STAGG, Mr John Henry\"\tCrew\tSouthampton\tSaloon Steward\t0\t38\tMale\tFalse\tVictualling\n\"STAP, Miss Sarah Agnes\"\tCrew\tSouthampton\tStewardess\t0\t47\tFemale\tTrue\tVictualling\n\"STEBBINGS, Mr Sydney Frederick\"\tCrew\tBelfast\tChief Boots Steward (1st Class)\t0\t35\tMale\tFalse\tVictualling\n\"STEWART, Mr John\"\tCrew\tBelfast\tVerandah Steward\t0\t27\tMale\tTrue\tVictualling\n\"STONE, Mr Edmund\"\tCrew\tSouthampton\t1st Class Bedroom Steward\t0\t33\tMale\tFalse\tVictualling\n\"STONE, Mr Edward Thomas\"\tCrew\tSouthampton\tBedroom Steward (2nd class)\t0\t29\tMale\tFalse\tVictualling\n\"STROUD, Mr Edward Alfred Orlando\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t19\tMale\tFalse\tVictualling\n\"STROUD, Mr Harry John\"\tCrew\tSouthampton\tSaloon Steward\t0\t35\tMale\tFalse\tVictualling\n\"STRUGNELL, Mr John Herbert\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t34\tMale\tFalse\tVictualling\n\"STUBBINGS, Mr Harry Robert\"\tCrew\tBelfast\t2nd. Class Cook\t0\t31\tMale\tFalse\tVictualling\n\"SWAN, Mr William\"\tCrew\tBelfast\t1st Class Bedroom Steward\t0\t46\tMale\tFalse\tVictualling\n\"SYMONDS, Mr John Crane\"\tCrew\tBelfast\tSaloon Steward\t0\t44\tMale\tFalse\tVictualling\n\"TALBOT, Mr George Frederick Charles\"\tCrew\tSouthampton\tSteward\t0\t20\tMale\tFalse\tVictualling\n\"TAYLOR, Mr Bernard Cuthbert\"\tCrew\tSouthampton\t3rd Class Steward\t0\t22\tMale\tFalse\tVictualling\n\"TAYLOR, Mr Leonard\"\tCrew\tSouthampton\tTurkish Bath Attendant\t0\t23\tMale\tFalse\tVictualling\n\"TAYLOR, Mr William John\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t30\tMale\tFalse\tVictualling\n\"TERRELL, Mr Frank\"\tCrew\tSouthampton\tAssistant Saloon Steward\t0\t27\tMale\tTrue\tVictualling\n\"TEUTON, Mr Thomas Moore\"\tCrew\tSouthampton\tSaloon Steward\t0\t32\tMale\tFalse\tVictualling\n\"THALER, Mr Montague Donald\"\tCrew\tSouthampton\tSteward (3rd Class)\t0\t17\tFemale\tFalse\tVictualling\n\"THEISSINGER, Mr Alfred\"\tCrew\tSouthampton\tBed Room Steward\t0\t46\tMale\tTrue\tVictualling\n\"THOMAS, Mr Benjamin James\"\tCrew\tBelfast\tSaloon Steward\t0\t30\tMale\tTrue\tVictualling\n\"THOMAS, Mr Albert Charles\"\tCrew\tSouthampton\tSaloon Steward\t0\t23\tMale\tTrue\tVictualling\n\"THOMPSON, Mr Herbert Henry\"\tCrew\tBelfast\t2nd (Assistant) Storekeeper\t0\t25\tMale\tFalse\tVictualling\n\"THORLEY, Mr William\"\tCrew\tSouthampton\tCook\t0\t39\tMale\tFalse\tVictualling\n\"THORN, Mr Harry\"\tCrew\tSouthampton\tAssistant Ship's Cook\t0\t25\tMale\tFalse\tVictualling\n\"TOMS, Mr Fred\"\tCrew\tBelfast\tSaloon Steward\t0\t29\tMale\tTrue\tVictualling\n\"TOPP, Mr Thomas\"\tCrew\tSouthampton\t2nd Butcher\t0\t28\tMale\tFalse\tVictualling\n\"TOSHACK, Mr James Adamson\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t30\tMale\tFalse\tVictualling\n\"TURNER, Mr George Frederick\"\tCrew\tSouthampton\tStenographer\t0\t32\tMale\tFalse\tVictualling\n\"TURNER, Mr Leopold Olerenshaw\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t28\tMale\tFalse\tVictualling\n\"VEAL, Mr Thomas Henry Edom\"\tCrew\tSouthampton\tSaloon Steward (1st class)\t0\t38\tMale\tFalse\tVictualling\n\"WAKE, Mr Percy\"\tCrew\tSouthampton\tAssistant baker\t0\t37\tMale\tFalse\tVictualling\n\"WALLIS, Mrs Catherine Jane\"\tCrew\tSouthampton\tMatron\t0\t35\tFemale\tFalse\tVictualling\n\"WALPOLE, Mr James\"\tCrew\tBelfast\tChief Pantryman Steward\t0\t48\tMale\tFalse\tVictualling\n\"WALSH, Miss Catherine\"\tCrew\tSouthampton\tStewardess\t0\t32\tFemale\tFalse\tVictualling\n\"WARD, Mr Edward\"\tCrew\tBelfast\tBed Room Steward\t0\t34\tMale\tFalse\tVictualling\n\"WARD, Mr Percy Thomas\"\tCrew\tBelfast\tBedroom Steward (1st Class)\t0\t38\tMale\tFalse\tVictualling\n\"WARD, Mr William\"\tCrew\tSouthampton\tSaloon Steward\t0\t36\tMale\tTrue\tVictualling\n\"WAREHAM, Mr Robert Arthur\"\tCrew\tBelfast\tBed Room Steward\t0\t37\tMale\tFalse\tVictualling\n\"WARWICK, Mr Tom\"\tCrew\tSouthampton\tSaloon Steward\t0\t25\tMale\tFalse\tVictualling\n\"WATSON, Mr William Albert\"\tCrew\tSouthampton\tBell Boy\t0\t14\tMale\tFalse\tVictualling\n\"WEATHERSTON, Mr Thomas Herbert\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t24\tMale\tFalse\tVictualling\n\"WEBB, Mr Brook Holding\"\tCrew\tBelfast\tSmoke Room Steward (1st class)\t0\t50\tMale\tFalse\tVictualling\n\"WEIKMAN, Mr Augustus Henry\"\tCrew\tSouthampton\tBarber\t0\t52\tMale\tTrue\tVictualling\n\"WELCH, Mr William Harold\"\tCrew\tSouthampton\tCook\t0\t23\tMale\tFalse\tVictualling\n\"WHEAT, Mr Joseph Thomas\"\tCrew\tBelfast\tAssistant Second Steward\t0\t30\tMale\tTrue\tVictualling\n\"WHEELTON, Mr Edneser Edward\"\tCrew\tBelfast\tSaloon Steward (1st class)\t0\t29\tMale\tTrue\tVictualling\n\"WHITE, Mr Arthur\"\tCrew\tSouthampton\tAssistant Barber (1st Class)\t0\t37\tMale\tFalse\tVictualling\n\"WHITE, Mr Edward Joseph\"\tCrew\tSouthampton\tGlory hole steward (3rd class)\t0\t27\tMale\tFalse\tVictualling\n\"WHITE, Mr Leonard Lisle Oliver\"\tCrew\tBelfast\tSaloon Steward\t0\t31\tMale\tFalse\tVictualling\n\"WHITELEY, Mr Thomas Arthur\"\tCrew\tSouthampton\tSaloon Steward\t0\t18\tMale\tTrue\tVictualling\n\"WHITFORD, Mr Alfred Henry\"\tCrew\tSouthampton\t\"Saloon Steward, 2nd Class\"\t0\t39\tMale\tFalse\tVictualling\n\"WIDGERY, Mr James George\"\tCrew\tSouthampton\tBath Steward\t0\t37\tMale\tTrue\tVictualling\n\"WILLIAMS, Mr Arthur John\"\tCrew\tSouthampton\tStorekeeper (1st Class)\t0\t42\tMale\tFalse\tVictualling\n\"WILLIAMS, Mr Walter John\"\tCrew\tSouthampton\tSaloon Steward (2nd class)\t0\t28\tMale\tTrue\tVictualling\n\"WILLIAMSON, Mr James Bertram\"\tCrew\tSouthampton\tPostal Clerk / Postman\t0\t35\tMale\tFalse\tVictualling\n\"WILLIS, Mr William\"\tCrew\tSouthampton\t3rd Class Packer Steward\t0\t46\tMale\tFalse\tVictualling\n\"WILLSHER, Mr William Aubrey\"\tCrew\tSouthampton\tButcher\t0\t33\tMale\tFalse\tVictualling\n\"WINDEBANK, Mr Alfred Edgar\"\tCrew\tSouthampton\tCook\t0\t38\tMale\tTrue\tVictualling\n\"WINSER, Mr Rowland\"\tCrew\tSouthampton\tSteward\t0\t33\tMale\tFalse\tVictualling\n\"WITTER, Mr James William Cheetham\"\tCrew\tSouthampton\tSmoke Room Steward (2nd Class)\t0\t31\tMale\tTrue\tVictualling\n\"WITTMAN, Mr Henry\"\tCrew\tSouthampton\tBathroom Steward (1st Class)\t0\t38\tMale\tFalse\tVictualling\n\"WOOD, Mr James Thomas\"\tCrew\tSouthampton\t\"Assistant Saloon Steward, 2nd Class\"\t0\t40\tMale\tFalse\tVictualling\n\"WOODY, Mr Oscar Scott\"\tCrew\tSouthampton\tPostal Clerk / Postman\t0\t44\tMale\tFalse\tVictualling\n\"WORMALD, Mr Henry Frederick Charles\"\tCrew\tSouthampton\tSaloon Steward\t0\t44\tMale\tFalse\tVictualling\n\"WRAPSON, Mr Frederick Bernard\"\tCrew\tBelfast\tAssistant Pantryman Steward\t0\t18\tMale\tFalse\tVictualling\n\"WRIGHT, Mr Frederick\"\tCrew\tSouthampton\tSquash racquet court attendant\t0\t24\tMale\tFalse\tVictualling\n\"WRIGHT, Mr William\"\tCrew\tSouthampton\tGlory Hole Steward\t0\t40\tMale\tTrue\tVictualling\n\"YEARSLEY, Mr Harry\"\tCrew\tSouthampton\tFirst class saloon steward\t0\t40\tMale\tTrue\tVictualling\n\"ALLARIA, Sig. Battista Antonio\"\tCrew\tSouthampton\tAssistant Waiter\t0\t22\tMale\tFalse\tRestaurant\n\"ASPESLAGH, Mr Georges\"\tCrew\tSouthampton\tAssistant Plateman\t0\t26\tMale\tFalse\tRestaurant\n\"BANFI, Sig. Ugo\"\tCrew\tSouthampton\tWaiter\t0\t24\tMale\tFalse\tRestaurant\n\"BASILICO, Sig. Giovanni\"\tCrew\tSouthampton\tWaiter\t0\t27\tMale\tFalse\tRestaurant\n\"BAZZI, Sig. Narciso\"\tCrew\tSouthampton\tWaiter\t0\t33\tMale\tFalse\tRestaurant\n\"BERNARDI, Sig. Battista\"\tCrew\tSouthampton\tAssistant Waiter\t0\t22\tMale\tFalse\tRestaurant\n\"BEUX, Mr David\"\tCrew\tSouthampton\tAssistant Waiter\t0\t26\tMale\tFalse\tRestaurant\n\"BIETRIX, Mr George Baptiste\"\tCrew\tSouthampton\tCook\t0\t28\tMale\tFalse\tRestaurant\n\"BLUMET, Mr Jean Baptiste\"\tCrew\tSouthampton\tPantryman\t0\t26\tMale\tFalse\tRestaurant\n\"BOCHET, Mr Pierre Giuseppe\"\tCrew\tSouthampton\tWaiter\t0\t25\tMale\tFalse\tRestaurant\n\"BOLHUIS, Mr Hendrik\"\tCrew\tSouthampton\tLarder Cook\t0\t27\tMale\tFalse\tRestaurant\n\"BOWKER, Miss Ruth Harwood\"\tCrew\tSouthampton\tCashier\t0\t31\tFemale\tTrue\tRestaurant\n\"CASALI, Sig. Giulio\"\tCrew\tSouthampton\tWaiter\t0\t32\tMale\tFalse\tRestaurant\n\"CHABOISSON, Mr Adrien Finnin\"\tCrew\tSouthampton\tRoast Cook\t0\t25\tMale\tFalse\tRestaurant\n\"CORNAIRE, Mr Marcel Raymond André\"\tCrew\tSouthampton\tAssistant Roast Cook\t0\t19\tMale\tFalse\tRestaurant\n\"COUTIN, Mr Auguste Louis\"\tCrew\tSouthampton\tEntre� Cook\t0\t28\tMale\tFalse\tRestaurant\n\"CROVELLA, Sig. Luigi\"\tCrew\tSouthampton\tAssistant Waiter\t0\t17\tMale\tFalse\tRestaurant\n\"DE MARSICO, Sig. Govanni\"\tCrew\tSouthampton\tAssistant Waiter\t0\t20\tMale\tFalse\tRestaurant\n\"DEBREUCQ, Mr Maurice Emile Victor\"\tCrew\tSouthampton\tAssistant Waiter\t0\t18\tMale\tFalse\tRestaurant\n\"DESVERNINE, Mr Louis Gabriel\"\tCrew\tSouthampton\tAssistant Pastry Cook\t0\t20\tMale\tFalse\tRestaurant\n\"DONATI, Sig. Italo Francesco\"\tCrew\tSouthampton\tAssistant Waiter\t0\t17\tMale\tFalse\tRestaurant\n\"DORNIER, Mr Louis Auguste\"\tCrew\tSouthampton\tAssistant Fish Cook\t0\t20\tMale\tFalse\tRestaurant\n\"FEY, Sig. Carlo\"\tCrew\tSouthampton\tScullion\t0\t30\tMale\tFalse\tRestaurant\n\"FIORAVANTE, Sig. Giuseppe Bertoldo\"\tCrew\tSouthampton\tAssistant Scullion\t0\t23\tMale\tFalse\tRestaurant\n\"GATTI, Sig. Gaspare Antonio Pietro\"\tCrew\tSouthampton\tà la Carte Restaurant Manager\t0\t37\tMale\tFalse\tRestaurant\n\"GILARDINO, Sig. Vincenzo Pio\"\tCrew\tSouthampton\tWaiter\t0\t31\tMale\tFalse\tRestaurant\n\"GROSCLAUDE, Mr Gérald\"\tCrew\tSouthampton\tWaiter\t0\t24\tMale\tFalse\tRestaurant\n\"JAILLET, Mr Henri Marie\"\tCrew\tSouthampton\tPastry Cook (Restaurant)\t0\t38\tMale\tFalse\tRestaurant\n\"JANIN, Mr Claude Marie\"\tCrew\tSouthampton\tSoup Cook\t0\t29\tMale\tFalse\tRestaurant\n\"JEFFERY, Mr William Alfred\"\tCrew\tSouthampton\tA la carte restaurant controller\t0\t28\tMale\tFalse\tRestaurant\n\"JOUANNAULT, Mr Georges Jules\"\tCrew\tSouthampton\tAssistant Sauce Cook\t0\t24\tMale\tFalse\tRestaurant\n\"MARTIN, Miss Mabel Elvina\"\tCrew\tSouthampton\tCashier\t0\t20\tFemale\tTrue\tRestaurant\n\"MATTMANN, Sig. Adolf\"\tCrew\tSouthampton\tIce Man\t0\t20\tMale\tFalse\tRestaurant\n\"MAUGE, Mr Paul Achille Maurice Germain\"\tCrew\tSouthampton\tKitchen Clerk\t0\t25\tMale\tTrue\tRestaurant\n\"MONRóS, Sr. Joan Javier\"\tCrew\tSouthampton\tAssistant Waiter\t0\t20\tMale\tFalse\tRestaurant\n\"MONTEVERDI, Sig. Giovanni\"\tCrew\tSouthampton\tCook\t0\t23\tMale\tFalse\tRestaurant\n\"NANNINI, Sig. Francesco Luigi Arcangelo\"\tCrew\tSouthampton\tHead Waiter (Restaurant)\t0\t42\tMale\tFalse\tRestaurant\n\"PACHERA, Sig. Jean Baptiste Stanislas\"\tCrew\tSouthampton\tAssistant Larder Cook\t0\t19\tMale\tFalse\tRestaurant\n\"PEDRINI, Sig. Alessandro\"\tCrew\tSouthampton\tAssistant Waiter\t0\t21\tMale\tFalse\tRestaurant\n\"PERACCHIO, Sig. Alberto\"\tCrew\tSouthampton\tAssistant Waiter\t0\t20\tMale\tFalse\tRestaurant\n\"PERACCHIO, Sig. Sebastiano\"\tCrew\tSouthampton\tAssistant Waiter\t0\t17\tMale\tFalse\tRestaurant\n\"PEROTTI, Sig. Alfonso\"\tCrew\tSouthampton\tAssistant Waiter\t0\t20\tMale\tFalse\tRestaurant\n\"PHILLIPS, Mr Walter John\"\tCrew\tSouthampton\tStorekeeper\t0\t35\tMale\tFalse\tRestaurant\n\"PIATTI, Sig. Louis\"\tCrew\tSouthampton\tAssistant Waiter\t0\t17\tMale\tFalse\tRestaurant\n\"PIAZZA, Sig. Pompeo Gaspro\"\tCrew\tSouthampton\tWaiter\t0\t32\tMale\tFalse\tRestaurant\n\"POGGI, Sig. Emilio\"\tCrew\tSouthampton\tWaiter\t0\t28\tMale\tFalse\tRestaurant\n\"PRICE, Mr Ernest Cyril\"\tCrew\tSouthampton\tBarman\t0\t17\tMale\tFalse\tRestaurant\n\"RATTI, Sig. Enrico\"\tCrew\tSouthampton\tWaiter\t0\t21\tMale\tFalse\tRestaurant\n\"RICALDONE, Sig. Rinaldo Renato\"\tCrew\tSouthampton\tAssistant Waiter\t0\t22\tMale\tFalse\tRestaurant\n\"RIGOZZI, Sig. Abele\"\tCrew\tSouthampton\tAssistant Waiter\t0\t22\tMale\tFalse\tRestaurant\n\"ROTTA, Sig. Angelo Mario\"\tCrew\tSouthampton\tWaiter\t0\t23\tMale\tFalse\tRestaurant\n\"ROUSSEAU, Mr Pierre\"\tCrew\tSouthampton\tChef\t0\t49\tMale\tFalse\tRestaurant\n\"SACCAGGI, Sig. Giovanni Giuseppe Emilio\"\tCrew\tSouthampton\tAssistant Waiter\t0\t24\tMale\tFalse\tRestaurant\n\"SALUSSOLIA, Sig. Govanni\"\tCrew\tSouthampton\tGlass Man\t0\t25\tMale\tFalse\tRestaurant\n\"SARTORI, Sig. Lazar\"\tCrew\tSouthampton\tAssistant Glass Man\t0\t24\tMale\tFalse\tRestaurant\n\"SCAVINO, Sig. Candido\"\tCrew\tSouthampton\tCarver\t0\t42\tMale\tFalse\tRestaurant\n\"SESIA, Sig. Giacomo\"\tCrew\tSouthampton\tWaiter\t0\t24\tMale\tFalse\tRestaurant\n\"TESTONI, Sig. Ercole\"\tCrew\tSouthampton\tAssistant Glass Man\t0\t23\tMale\tFalse\tRestaurant\n\"TIETZ, Sig. Carlo/Karl\"\tCrew\tSouthampton\tKitchen Porter\t0\t27\tMale\tFalse\tRestaurant\n\"TURVEY, Mr Charles Thomas\"\tCrew\tSouthampton\tPage Boy\t0\t17\tMale\tFalse\tRestaurant\n\"URBINI, Sig. Roberto\"\tCrew\tSouthampton\tWaiter\t0\t20\tMale\tFalse\tRestaurant\n\"VALVASSORI, Sig. Ettore Luigi\"\tCrew\tSouthampton\tWaiter\t0\t35\tMale\tFalse\tRestaurant\n\"VICAT, Sig. Alphonse Jean Eugene\"\tCrew\tSouthampton\tCook\t0\t21\tMale\tFalse\tRestaurant\n\"VILLVARLANGE, Mr Pierre Léon Gabriel\"\tCrew\tSouthampton\tAssistant Soup Cook\t0\t19\tMale\tFalse\tRestaurant\n\"VINE, Mr Herbert Thomas Gordon\"\tCrew\tSouthampton\tAssistant Restaurant Controller\t0\t18\tMale\tFalse\tRestaurant\n\"VIONI, Sig. Roberto\"\tCrew\tSouthampton\tWaiter\t0\t25\tMale\tFalse\tRestaurant\n\"VOEGELIN-DUBACH, Sig. Johannes\"\tCrew\tSouthampton\tWaiter\t0\t35\tMale\tFalse\tRestaurant\n\"ZANETTI, Sig. Minio\"\tCrew\tSouthampton\tAssistant Waiter\t0\t20\tMale\tFalse\tRestaurant\n\"ZARRACCHI, Sig. L.\"\tCrew\tSouthampton\tWine Butler\t0\t26\tMale\tFalse\tRestaurant\n"
  },
  {
    "path": "docs/tests/data-inference/v1/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>Data-Inference test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <link rel=\"stylesheet\" href=\"https://unpkg.com/@highlightjs/cdn-assets@11.11.0/styles/a11y-light.css\">\n    <script src=\"https://unpkg.com/@highlightjs/cdn-assets@11.11.0/highlight.min.js\"></script>\n    <script src=\"js/data-inference.js\"></script>\n\n    <style>\n        body {\n            font-family: sans-serif;\n        }\n\n        header {\n            margin-bottom: 1em;\n        }\n    </style>\n</head>\n\n<body>\n    <header>\n        <h1>Data-Inference test</h1>\n        <label>\n            sample data file:\n            <select onchange=\"test.loadText(JSON.parse(this.value))\">\n                <option value='{\"url\": \"../../../sample-data/titanicmaster.tsv\", \"format\":{\"type\":\"tsv\"}}'>\n                    titanic\n                </option>\n                <option value='{\"url\": \"../../../sample-data/demovote.tsv\", \"format\":{\"type\":\"tsv\"}}'>\n                    demovote\n                </option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/airports.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/airports.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/annual-precip.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/annual-precip.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/anscombe.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/anscombe.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/barley.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/barley.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/birdstrikes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/birdstrikes.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/budget.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/budget.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/budgets.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/budgets.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/burtin.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/burtin.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/cars.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/cars.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/co2-concentration.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/co2-concentration.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/countries.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/countries.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/crimea.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/crimea.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/disasters.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/disasters.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/driving.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/driving.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/earthquakes.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/earthquakes.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flare-dependencies.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flare-dependencies.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flare.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flare.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-10k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-10k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-200k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-200k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-20k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-20k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-2k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-2k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-3m.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/flights-3m.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-5k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-5k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-airport.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/flights-airport.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/football.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/football.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/gapminder-health-income.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/gapminder-health-income.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/gapminder.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/gapminder.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/github.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/github.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/income.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/income.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/iowa-electricity.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/iowa-electricity.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/jobs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/jobs.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/la-riots.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/la-riots.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonBoroughs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonBoroughs.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonCentroids.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonCentroids.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonTubeLines.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonTubeLines.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/lookup_groups.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/lookup_groups.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/lookup_people.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/lookup_people.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/miserables.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/miserables.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/monarchs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/monarchs.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/movies.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/movies.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/normal-2d.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/normal-2d.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/obesity.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/obesity.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/ohlc.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/ohlc.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/penguins.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/penguins.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/platformer-terrain.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/platformer-terrain.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/points.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/points.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/political-contributions.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/political-contributions.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/population.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/population.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/population_engineers_hurricanes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/population_engineers_hurricanes.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/seattle-weather-hourly-normals.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/seattle-weather-hourly-normals.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/seattle-weather.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/seattle-weather.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/sp500-2000.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/sp500-2000.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/sp500.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/sp500.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/stocks.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/stocks.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/udistrict.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/udistrict.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/unemployment-across-industries.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/unemployment-across-industries.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/unemployment.tsv\",\"format\":{\"type\":\"tsv\"}}'>\n                    vega-datasets/unemployment.tsv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/uniform-2d.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/uniform-2d.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-10m.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/us-10m.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-employment.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/us-employment.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-state-capitals.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/us-state-capitals.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/volcano.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/volcano.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/weather.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/weather.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/weather.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/weather.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/wheat.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/wheat.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/windvectors.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/windvectors.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/world-110m.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/world-110m.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/zipcodes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/zipcodes.csv</option>\n            </select>\n        </label>\n    </header>\n\n    <main>\n\n        <button type=\"button\"\n            onclick=\"navigator.clipboard.writeText(document.getElementById('pandasHead')[0].textContent)\"\n            style=\"position:relative;right:1em;float:right;top:3em;\">📋</button>\n        \n        Pandas simulation:\n        <h4>head</h4>\n        <pre id=\"pandasHead\"></pre>\n\n        <h4>info</h4>\n        <pre id=\"pandasInfo\"></pre>\n\n        <hr/>\n\n        <button type=\"button\"\n            onclick=\"navigator.clipboard.writeText(document.getElementById('columnsJson')[0].textContent)\"\n            style=\"position:relative;right:1em;float:right;top:3em;\">📋</button>\n        Columns:\n        <pre><code id=\"columnsJson\"></code></pre>\n\n    </main>\n\n    <script>\n        const test = {\n            display: (pandasHead, pandasInfo, columnsJson, highlight) => {\n                document.getElementById('pandasHead').innerHTML = pandasHead;\n                document.getElementById('pandasInfo').innerHTML = pandasInfo;\n                document.getElementById('columnsJson').innerHTML = columnsJson;\n                if (highlight) {\n                    hljs.highlightAll();\n                }\n            },\n            loadObjectArray: (data) => {\n                const columns = DataInference.getColumnsFromData(vega.inferTypes, data);\n                const columnsJson = JSON.stringify(columns, null, 2);\n                const pandasHead = DataInference.pandasSimulation.head(columns, data);\n                const pandasInfo = DataInference.pandasSimulation.info(columns, data);\n                test.display(pandasHead, pandasInfo, columnsJson, true);\n            },\n            loadText: ({ url, format }) => {\n                test.display('Loading...');\n                vega.loader().load(url).then(function (text) {\n                    const data = vega.read(text, format);\n                    test.loadObjectArray(data);\n                });\n            },\n        };\n\n        test.loadText({ url: '../../../sample-data/titanicmaster.tsv', format: { type: 'tsv' } });\n\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/data-inference/v1/js/data-inference.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.DataInference = {}));\n})(this, (function (exports) { 'use strict';\n\n  function define(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n  }\n\n  function extend(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for (var key in definition) prototype[key] = definition[key];\n    return prototype;\n  }\n\n  function Color() {}\n\n  var darker = 0.7;\n  var brighter = 1 / darker;\n\n  var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n      reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n      reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n      reHex = /^#([0-9a-f]{3,8})$/,\n      reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n      reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n      reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n      reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n      reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n      reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\n  var named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n  };\n\n  define(Color, color, {\n    copy(channels) {\n      return Object.assign(new this.constructor, this, channels);\n    },\n    displayable() {\n      return this.rgb().displayable();\n    },\n    hex: color_formatHex, // Deprecated! Use color.formatHex.\n    formatHex: color_formatHex,\n    formatHex8: color_formatHex8,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n  });\n\n  function color_formatHex() {\n    return this.rgb().formatHex();\n  }\n\n  function color_formatHex8() {\n    return this.rgb().formatHex8();\n  }\n\n  function color_formatHsl() {\n    return hslConvert(this).formatHsl();\n  }\n\n  function color_formatRgb() {\n    return this.rgb().formatRgb();\n  }\n\n  function color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n        : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n        : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n        : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n        : null) // invalid hex\n        : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n        : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n        : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n        : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n        : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n        : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n        : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n        : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n        : null;\n  }\n\n  function rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n  }\n\n  function rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n  }\n\n  function rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n  }\n\n  function rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n  }\n\n  function Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n  }\n\n  define(Rgb, rgb, extend(Color, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb() {\n      return this;\n    },\n    clamp() {\n      return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n    },\n    displayable() {\n      return (-0.5 <= this.r && this.r < 255.5)\n          && (-0.5 <= this.g && this.g < 255.5)\n          && (-0.5 <= this.b && this.b < 255.5)\n          && (0 <= this.opacity && this.opacity <= 1);\n    },\n    hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n    formatHex: rgb_formatHex,\n    formatHex8: rgb_formatHex8,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n  }));\n\n  function rgb_formatHex() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n  }\n\n  function rgb_formatHex8() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n  }\n\n  function rgb_formatRgb() {\n    const a = clampa(this.opacity);\n    return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n  }\n\n  function clampa(opacity) {\n    return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n  }\n\n  function clampi(value) {\n    return Math.max(0, Math.min(255, Math.round(value) || 0));\n  }\n\n  function hex(value) {\n    value = clampi(value);\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n  }\n\n  function hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n  }\n\n  function hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255,\n        g = o.g / 255,\n        b = o.b / 255,\n        min = Math.min(r, g, b),\n        max = Math.max(r, g, b),\n        h = NaN,\n        s = max - min,\n        l = (max + min) / 2;\n    if (s) {\n      if (r === max) h = (g - b) / s + (g < b) * 6;\n      else if (g === max) h = (b - r) / s + 2;\n      else h = (r - g) / s + 4;\n      s /= l < 0.5 ? max + min : 2 - max - min;\n      h *= 60;\n    } else {\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new Hsl(h, s, l, o.opacity);\n  }\n\n  function hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n  }\n\n  function Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n  }\n\n  define(Hsl, hsl, extend(Color, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h = this.h % 360 + (this.h < 0) * 360,\n          s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n          l = this.l,\n          m2 = l + (l < 0.5 ? l : 1 - l) * s,\n          m1 = 2 * l - m2;\n      return new Rgb(\n        hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n        hsl2rgb(h, m1, m2),\n        hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n        this.opacity\n      );\n    },\n    clamp() {\n      return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n    },\n    displayable() {\n      return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n          && (0 <= this.l && this.l <= 1)\n          && (0 <= this.opacity && this.opacity <= 1);\n    },\n    formatHsl() {\n      const a = clampa(this.opacity);\n      return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n    }\n  }));\n\n  function clamph(value) {\n    value = (value || 0) % 360;\n    return value < 0 ? value + 360 : value;\n  }\n\n  function clampt(value) {\n    return Math.max(0, Math.min(1, value || 0));\n  }\n\n  /* From FvD 13.37, CSS Color Module Level 3 */\n  function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60\n        : h < 180 ? m2\n        : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n        : m1) * 255;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  function isColor(cssColorSpecifier) {\n      return !!color(cssColorSpecifier);\n  }\n  function checkIsColorData(data, column) {\n      if (!column.stats.hasColorData) {\n          column.isColorData = false;\n          return;\n      }\n      for (let i = 0; i < data.length; i++) {\n          if (!isColor(data[i][column.name])) {\n              column.isColorData = false;\n              return;\n          }\n      }\n      column.isColorData = true;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  function isQuantitative(column) {\n      return column.type === 'number' || column.type === 'integer';\n  }\n  function detectNegative(columnName, data) {\n      for (let i = 1; i < data.length; i++) {\n          const value = columnName == null ? data[i] : data[i][columnName];\n          if (value < 0)\n              return true;\n      }\n      return false;\n  }\n  function detectSequentialColumn(columnName, data) {\n      if (data.length < 2)\n          return false;\n      for (let i = 1; i < data.length; i++) {\n          const curr = columnName == null ? data[i] : data[i][columnName];\n          const prev = columnName == null ? data[i - 1] : data[i - 1][columnName];\n          if (curr !== prev + 1)\n              return false;\n      }\n      return true;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  function getStats(data, ...args) {\n      let columnName;\n      let columnType;\n      let columnQuantitative;\n      let distinctValuesCallback;\n      if (args.length <= 2) {\n          const column = args[0];\n          columnName = column.name;\n          columnType = column.type;\n          columnQuantitative = column.quantitative;\n          distinctValuesCallback = args[1];\n      }\n      else {\n          columnName = args[0];\n          columnType = args[1];\n          columnQuantitative = args[2];\n          distinctValuesCallback = args[3];\n      }\n      const distinctMap = {};\n      const stats = {\n          nonNull: 0,\n          distinctValueCount: null,\n          max: null,\n          mean: null,\n          min: null,\n      };\n      const columnIsString = columnType === 'string';\n      let sum = 0;\n      for (let i = 0; i < data.length; i++) {\n          const row = data[i];\n          const value = columnName == null ? row : row[columnName];\n          if (columnIsString) {\n              if (value !== '') {\n                  stats.nonNull++;\n              }\n          }\n          else if (value != null) {\n              stats.nonNull++;\n          }\n          const num = +value;\n          distinctMap[value] = true;\n          if (!isNaN(num)) {\n              if (stats.max === null || num > stats.max) {\n                  stats.max = num;\n              }\n              if (stats.min === null || num < stats.min) {\n                  stats.min = num;\n              }\n              sum += num;\n          }\n          // hex codes, ex. #003300, are parsed as dates\n          if ((columnType === 'date' || columnIsString) && !stats.hasColorData && isColor(value)) {\n              stats.hasColorData = true;\n          }\n      }\n      if (columnQuantitative) {\n          stats.mean = data.length > 0 && (sum / data.length);\n          stats.hasNegative = detectNegative(columnName, data);\n          if (columnType === 'integer') {\n              stats.isSequential = detectSequentialColumn(columnName, data);\n          }\n      }\n      const distinctValues = Object.keys(distinctMap);\n      if (distinctValuesCallback) {\n          distinctValues.sort();\n          distinctValuesCallback(distinctValues);\n      }\n      stats.distinctValueCount = distinctValues.length;\n      return stats;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  /**\n   * Derive column metadata from the data array.\n   * @param data Array of data objects.\n   */\n  function getColumnsFromData(inferTypesFn, data, columnTypes) {\n      const sample = data[0];\n      const fields = sample ? Object.keys(sample) : [];\n      const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n      const columns = fields.map(name => {\n          const column = {\n              name,\n              type: inferences[name],\n          };\n          return column;\n      });\n      inferAll(columns, data);\n      return columns;\n  }\n  /**\n   * Populate columns with type inferences and stats.\n   * @param columns Array of columns.\n   * @param data Array of data objects.\n   */\n  function inferAll(columns, data) {\n      columns.forEach(column => {\n          if (column) {\n              if (typeof column.quantitative !== 'boolean') {\n                  column.quantitative = isQuantitative(column);\n              }\n              if (!column.stats) {\n                  column.stats = getStats(data, column);\n              }\n              // hex codes, ex. #003300, are parsed as dates\n              if ((column.type === 'date' || column.type === 'string') && typeof column.isColorData !== 'boolean') {\n                  checkIsColorData(data, column);\n              }\n          }\n      });\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  class Table {\n      constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = 'right') {\n          this.columns = columns;\n          this.rows = rows;\n          this.maxWidth = maxWidth;\n          this.underlineHeaders = underlineHeaders;\n          this.align = align;\n          // Calculate maximum width for each column\n          this.columnWidths = this.columns.map((col, idx) => Math.max(col.length, ...this.rows.map(row => { var _a; return ((_a = row[idx]) === null || _a === void 0 ? void 0 : _a.length) || 0; })));\n      }\n      createSpaces(num) {\n          return ' '.repeat(num);\n      }\n      groupColumns() {\n          let cumulativeWidth = 0;\n          const columnGroups = [];\n          let currentGroup = [];\n          this.columns.forEach((col, idx) => {\n              const columnSpace = this.columnWidths[idx] + 1; // account for one space between columns\n              if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n                  columnGroups.push(currentGroup);\n                  cumulativeWidth = columnSpace;\n                  currentGroup = [col];\n              }\n              else {\n                  cumulativeWidth += columnSpace;\n                  currentGroup.push(col);\n              }\n          });\n          if (currentGroup.length > 0) {\n              columnGroups.push(currentGroup);\n          }\n          return columnGroups;\n      }\n      formatRow(row, group) {\n          return group.map(col => {\n              const idx = this.columns.indexOf(col);\n              const cellValue = row[idx] == null ? '' : row[idx].toString();\n              return this.align === 'right'\n                  ? cellValue.padStart(this.columnWidths[idx], ' ')\n                  : cellValue.padEnd(this.columnWidths[idx], ' ');\n          }).join(this.createSpaces(1));\n      }\n      formatHeader(group) {\n          return group.map(col => {\n              const idx = this.columns.indexOf(col);\n              return this.align === 'right'\n                  ? col.padStart(this.columnWidths[idx], ' ')\n                  : col.padEnd(this.columnWidths[idx], ' ');\n          }).join(this.createSpaces(1));\n      }\n      underlineHeader(group) {\n          return group.map(col => '-'.repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n      }\n      render() {\n          const output = [];\n          const columnGroups = this.groupColumns();\n          columnGroups.forEach((group, groupIndex) => {\n              const headerRow = this.formatHeader(group);\n              let section = headerRow + (groupIndex < columnGroups.length - 1 ? ' \\\\' : '') + '\\n';\n              if (this.underlineHeaders) {\n                  section += this.underlineHeader(group) + '\\n';\n              }\n              this.rows.forEach((row) => {\n                  section += this.formatRow(row, group) + '\\n';\n              });\n              output.push(section);\n              if (groupIndex < columnGroups.length - 1) {\n                  output.push('\\n');\n              }\n          });\n          return output.join('');\n      }\n  }\n  exports.pandasSimulation = void 0;\n  (function (pandasSimulation) {\n      // Mapping TypeScript types to Python-like dtypes\n      const typeMapping = {\n          boolean: 'bool',\n          number: 'float64', // Assuming 'number' is used for floating-point numbers\n          date: 'datetime64[ns]',\n          string: 'object',\n          integer: 'int64',\n      };\n      function head(columns, data, maxWidth = 80) {\n          const numRows = 5; // Number of rows as in `head(5)` from pandas\n          const top = data.slice(0, numRows); // Get the top `numRows` rows\n          // Create a \"fake\" row number column\n          const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n          // Extract column names and rows for the table\n          const columnNames = [''].concat(columns.map(col => col.name));\n          const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map(col => { var _a; return ((_a = row[col.name]) === null || _a === void 0 ? void 0 : _a.toString()) || ''; })));\n          // Create and render the table with right alignment\n          const table = new Table(columnNames, rows, maxWidth, false, 'right'); // Right alignment\n          return table.render();\n      }\n      pandasSimulation.head = head;\n      function info(columns, data, maxWidth = 80) {\n          const numRows = data.length;\n          const output = [];\n          // Summary header\n          output.push('<class \\'pandas.core.frame.DataFrame\\'>');\n          output.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n          output.push(`Data columns (total ${columns.length} columns):\\n`);\n          // Column headers and details\n          const columnHeaders = ['#', 'Column', 'Non-Null Count', 'Dtype'];\n          const rows = columns.map((col, idx) => {\n              const nonNullCount = col.stats.nonNull.toString();\n              const dtype = typeMapping[col.type] || 'unknown';\n              return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n          });\n          // Create and render the table with left alignment and header underline\n          const table = new Table(columnHeaders, rows, maxWidth, true, 'left'); // Left alignment\n          output.push(table.render());\n          // Memory usage estimation\n          const memoryUsage = columns.reduce((total, col) => {\n              var _a;\n              const exampleValue = (_a = data.find(row => row[col.name] != null)) === null || _a === void 0 ? void 0 : _a[col.name];\n              if (exampleValue == null)\n                  return total;\n              const size = new Blob([exampleValue.toString()]).size;\n              return total + (size * numRows);\n          }, 0);\n          output.push(`\\ndtypes: ${columns.filter(col => col.type === 'number').length} float64, ` +\n              `${columns.filter(col => col.type === 'integer').length} int64, ` +\n              `${columns.filter(col => col.type === 'string').length} object`);\n          output.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n          return output.join('\\n');\n      }\n      pandasSimulation.info = info;\n  })(exports.pandasSimulation || (exports.pandasSimulation = {}));\n\n  exports.checkIsColorData = checkIsColorData;\n  exports.detectNegative = detectNegative;\n  exports.detectSequentialColumn = detectSequentialColumn;\n  exports.getColumnsFromData = getColumnsFromData;\n  exports.getStats = getStats;\n  exports.inferAll = inferAll;\n  exports.isColor = isColor;\n  exports.isQuantitative = isQuantitative;\n\n}));\n"
  },
  {
    "path": "docs/tests/data-inference/v2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>Data-Inference test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <link rel=\"stylesheet\" href=\"https://unpkg.com/@highlightjs/cdn-assets@11.11.0/styles/a11y-light.css\">\n    <script src=\"https://unpkg.com/@highlightjs/cdn-assets@11.11.0/highlight.min.js\"></script>\n    <script src=\"js/data-inference.js\"></script>\n\n    <style>\n        body {\n            font-family: sans-serif;\n        }\n\n        header {\n            margin-bottom: 1em;\n        }\n    </style>\n</head>\n\n<body>\n    <header>\n        <h1>Data-Inference test</h1>\n        <label>\n            sample data file:\n            <select onchange=\"test.loadText(JSON.parse(this.value))\">\n                <option value='{\"url\": \"../../../sample-data/titanicmaster.tsv\", \"format\":{\"type\":\"tsv\"}}'>\n                    titanic\n                </option>\n                <option value='{\"url\": \"../../../sample-data/demovote.tsv\", \"format\":{\"type\":\"tsv\"}}'>\n                    demovote\n                </option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/airports.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/airports.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/annual-precip.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/annual-precip.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/anscombe.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/anscombe.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/barley.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/barley.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/birdstrikes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/birdstrikes.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/budget.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/budget.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/budgets.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/budgets.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/burtin.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/burtin.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/cars.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/cars.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/co2-concentration.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/co2-concentration.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/countries.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/countries.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/crimea.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/crimea.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/disasters.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/disasters.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/driving.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/driving.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/earthquakes.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/earthquakes.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flare-dependencies.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flare-dependencies.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flare.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flare.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-10k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-10k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-200k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-200k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-20k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-20k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-2k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-2k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-3m.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/flights-3m.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-5k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-5k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-airport.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/flights-airport.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/football.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/football.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/gapminder-health-income.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/gapminder-health-income.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/gapminder.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/gapminder.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/github.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/github.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/income.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/income.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/iowa-electricity.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/iowa-electricity.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/jobs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/jobs.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/la-riots.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/la-riots.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonBoroughs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonBoroughs.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonCentroids.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonCentroids.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonTubeLines.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonTubeLines.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/lookup_groups.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/lookup_groups.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/lookup_people.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/lookup_people.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/miserables.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/miserables.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/monarchs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/monarchs.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/movies.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/movies.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/normal-2d.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/normal-2d.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/obesity.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/obesity.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/ohlc.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/ohlc.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/penguins.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/penguins.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/platformer-terrain.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/platformer-terrain.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/points.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/points.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/political-contributions.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/political-contributions.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/population.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/population.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/population_engineers_hurricanes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/population_engineers_hurricanes.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/seattle-weather-hourly-normals.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/seattle-weather-hourly-normals.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/seattle-weather.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/seattle-weather.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/sp500-2000.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/sp500-2000.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/sp500.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/sp500.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/stocks.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/stocks.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/udistrict.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/udistrict.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/unemployment-across-industries.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/unemployment-across-industries.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/unemployment.tsv\",\"format\":{\"type\":\"tsv\"}}'>\n                    vega-datasets/unemployment.tsv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/uniform-2d.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/uniform-2d.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-10m.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/us-10m.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-employment.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/us-employment.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-state-capitals.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/us-state-capitals.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/volcano.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/volcano.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/weather.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/weather.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/weather.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/weather.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/wheat.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/wheat.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/windvectors.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/windvectors.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/world-110m.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/world-110m.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/zipcodes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/zipcodes.csv</option>\n            </select>\n        </label>\n    </header>\n\n    <main>\n\n        <button type=\"button\"\n            onclick=\"navigator.clipboard.writeText(document.getElementById('pandasHead')[0].textContent)\"\n            style=\"position:relative;right:1em;float:right;top:3em;\">📋</button>\n        \n        Pandas simulation:\n        <h4>head</h4>\n        <pre id=\"pandasHead\"></pre>\n\n        <h4>info</h4>\n        <pre id=\"pandasInfo\"></pre>\n\n        <hr/>\n\n        <button type=\"button\"\n            onclick=\"navigator.clipboard.writeText(document.getElementById('columnsJson')[0].textContent)\"\n            style=\"position:relative;right:1em;float:right;top:3em;\">📋</button>\n        Columns:\n        <pre><code id=\"columnsJson\"></code></pre>\n\n    </main>\n\n    <script>\n        const test = {\n            display: (pandasHead, pandasInfo, columnsJson, highlight) => {\n                document.getElementById('pandasHead').innerHTML = pandasHead;\n                document.getElementById('pandasInfo').innerHTML = pandasInfo;\n                document.getElementById('columnsJson').innerHTML = columnsJson;\n                if (highlight) {\n                    hljs.highlightAll();\n                }\n            },\n            loadObjectArray: (data) => {\n                const columns = DataInference.getColumnsFromData(vega.inferTypes, data);\n                const columnsJson = JSON.stringify(columns, null, 2);\n                const pandasHead = DataInference.pandasSimulation.head(columns, data);\n                const pandasInfo = DataInference.pandasSimulation.info(columns, data);\n                test.display(pandasHead, pandasInfo, columnsJson, true);\n            },\n            loadText: ({ url, format }) => {\n                test.display('Loading...');\n                vega.loader().load(url).then(function (text) {\n                    const data = vega.read(text, format);\n                    test.loadObjectArray(data);\n                });\n            },\n        };\n\n        test.loadText({ url: '../../../sample-data/titanicmaster.tsv', format: { type: 'tsv' } });\n\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/data-inference/v2/js/data-inference.js",
    "content": "(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.DataInference = {}));\n})(this, (function (exports) { 'use strict';\n\n  function define(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n  }\n\n  function extend(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for (var key in definition) prototype[key] = definition[key];\n    return prototype;\n  }\n\n  function Color() {}\n\n  var darker = 0.7;\n  var brighter = 1 / darker;\n\n  var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n      reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n      reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n      reHex = /^#([0-9a-f]{3,8})$/,\n      reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n      reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n      reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n      reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n      reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n      reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\n  var named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n  };\n\n  define(Color, color, {\n    copy(channels) {\n      return Object.assign(new this.constructor, this, channels);\n    },\n    displayable() {\n      return this.rgb().displayable();\n    },\n    hex: color_formatHex, // Deprecated! Use color.formatHex.\n    formatHex: color_formatHex,\n    formatHex8: color_formatHex8,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n  });\n\n  function color_formatHex() {\n    return this.rgb().formatHex();\n  }\n\n  function color_formatHex8() {\n    return this.rgb().formatHex8();\n  }\n\n  function color_formatHsl() {\n    return hslConvert(this).formatHsl();\n  }\n\n  function color_formatRgb() {\n    return this.rgb().formatRgb();\n  }\n\n  function color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n        : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n        : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n        : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n        : null) // invalid hex\n        : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n        : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n        : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n        : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n        : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n        : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n        : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n        : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n        : null;\n  }\n\n  function rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n  }\n\n  function rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n  }\n\n  function rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n  }\n\n  function rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n  }\n\n  function Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n  }\n\n  define(Rgb, rgb, extend(Color, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb() {\n      return this;\n    },\n    clamp() {\n      return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n    },\n    displayable() {\n      return (-0.5 <= this.r && this.r < 255.5)\n          && (-0.5 <= this.g && this.g < 255.5)\n          && (-0.5 <= this.b && this.b < 255.5)\n          && (0 <= this.opacity && this.opacity <= 1);\n    },\n    hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n    formatHex: rgb_formatHex,\n    formatHex8: rgb_formatHex8,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n  }));\n\n  function rgb_formatHex() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n  }\n\n  function rgb_formatHex8() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n  }\n\n  function rgb_formatRgb() {\n    const a = clampa(this.opacity);\n    return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n  }\n\n  function clampa(opacity) {\n    return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n  }\n\n  function clampi(value) {\n    return Math.max(0, Math.min(255, Math.round(value) || 0));\n  }\n\n  function hex(value) {\n    value = clampi(value);\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n  }\n\n  function hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n  }\n\n  function hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255,\n        g = o.g / 255,\n        b = o.b / 255,\n        min = Math.min(r, g, b),\n        max = Math.max(r, g, b),\n        h = NaN,\n        s = max - min,\n        l = (max + min) / 2;\n    if (s) {\n      if (r === max) h = (g - b) / s + (g < b) * 6;\n      else if (g === max) h = (b - r) / s + 2;\n      else h = (r - g) / s + 4;\n      s /= l < 0.5 ? max + min : 2 - max - min;\n      h *= 60;\n    } else {\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new Hsl(h, s, l, o.opacity);\n  }\n\n  function hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n  }\n\n  function Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n  }\n\n  define(Hsl, hsl, extend(Color, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h = this.h % 360 + (this.h < 0) * 360,\n          s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n          l = this.l,\n          m2 = l + (l < 0.5 ? l : 1 - l) * s,\n          m1 = 2 * l - m2;\n      return new Rgb(\n        hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n        hsl2rgb(h, m1, m2),\n        hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n        this.opacity\n      );\n    },\n    clamp() {\n      return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n    },\n    displayable() {\n      return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n          && (0 <= this.l && this.l <= 1)\n          && (0 <= this.opacity && this.opacity <= 1);\n    },\n    formatHsl() {\n      const a = clampa(this.opacity);\n      return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n    }\n  }));\n\n  function clamph(value) {\n    value = (value || 0) % 360;\n    return value < 0 ? value + 360 : value;\n  }\n\n  function clampt(value) {\n    return Math.max(0, Math.min(1, value || 0));\n  }\n\n  /* From FvD 13.37, CSS Color Module Level 3 */\n  function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60\n        : h < 180 ? m2\n        : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n        : m1) * 255;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  function isColor(cssColorSpecifier) {\n      return !!color(cssColorSpecifier);\n  }\n  function checkIsColorData(data, column) {\n      if (!column.stats.hasColorData) {\n          column.isColorData = false;\n          return;\n      }\n      for (let i = 0; i < data.length; i++) {\n          if (!isColor(data[i][column.name])) {\n              column.isColorData = false;\n              return;\n          }\n      }\n      column.isColorData = true;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  function isQuantitative(column) {\n      return column.type === 'number' || column.type === 'integer';\n  }\n  function detectNegative(columnName, data) {\n      for (let i = 1; i < data.length; i++) {\n          const value = columnName == null ? data[i] : data[i][columnName];\n          if (value < 0)\n              return true;\n      }\n      return false;\n  }\n  function detectSequentialColumn(columnName, data) {\n      if (data.length < 2)\n          return false;\n      for (let i = 1; i < data.length; i++) {\n          const curr = columnName == null ? data[i] : data[i][columnName];\n          const prev = columnName == null ? data[i - 1] : data[i - 1][columnName];\n          if (curr !== prev + 1)\n              return false;\n      }\n      return true;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  function getStats(data, ...args) {\n      let columnName;\n      let columnType;\n      let columnQuantitative;\n      let distinctValuesCallback;\n      if (args.length <= 2) {\n          const column = args[0];\n          columnName = column.name;\n          columnType = column.type;\n          columnQuantitative = column.quantitative;\n          distinctValuesCallback = args[1];\n      }\n      else {\n          columnName = args[0];\n          columnType = args[1];\n          columnQuantitative = args[2];\n          distinctValuesCallback = args[3];\n      }\n      const distinctMap = {};\n      const stats = {\n          nonNull: 0,\n          distinctValueCount: null,\n          max: null,\n          mean: null,\n          min: null,\n      };\n      const columnIsString = columnType === 'string';\n      let sum = 0;\n      for (let i = 0; i < data.length; i++) {\n          const row = data[i];\n          const value = columnName == null ? row : row[columnName];\n          if (columnIsString) {\n              if (value !== '') {\n                  stats.nonNull++;\n              }\n          }\n          else if (value != null) {\n              stats.nonNull++;\n          }\n          const num = +value;\n          distinctMap[value] = true;\n          if (!isNaN(num)) {\n              if (stats.max === null || num > stats.max) {\n                  stats.max = num;\n              }\n              if (stats.min === null || num < stats.min) {\n                  stats.min = num;\n              }\n              sum += num;\n          }\n          // hex codes, ex. #003300, are parsed as dates\n          if ((columnType === 'date' || columnIsString) && !stats.hasColorData && isColor(value)) {\n              stats.hasColorData = true;\n          }\n      }\n      if (columnQuantitative) {\n          stats.mean = data.length > 0 && (sum / data.length);\n          stats.hasNegative = detectNegative(columnName, data);\n          if (columnType === 'integer') {\n              stats.isSequential = detectSequentialColumn(columnName, data);\n          }\n      }\n      const distinctValues = Object.keys(distinctMap);\n      if (distinctValuesCallback) {\n          distinctValues.sort();\n          distinctValuesCallback(distinctValues);\n      }\n      stats.distinctValueCount = distinctValues.length;\n      return stats;\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  /**\n   * Derive column metadata from the data array.\n   * @param data Array of data objects.\n   */\n  function getColumnsFromData(inferTypesFn, data, columnTypes) {\n      const sample = data[0];\n      const fields = sample ? Object.keys(sample) : [];\n      const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n      const columns = fields.map(name => {\n          const column = {\n              name,\n              type: inferences[name],\n          };\n          return column;\n      });\n      inferAll(columns, data);\n      return columns;\n  }\n  /**\n   * Populate columns with type inferences and stats.\n   * @param columns Array of columns.\n   * @param data Array of data objects.\n   */\n  function inferAll(columns, data) {\n      columns.forEach(column => {\n          if (column) {\n              if (typeof column.quantitative !== 'boolean') {\n                  column.quantitative = isQuantitative(column);\n              }\n              if (!column.stats) {\n                  column.stats = getStats(data, column);\n              }\n              // hex codes, ex. #003300, are parsed as dates\n              if ((column.type === 'date' || column.type === 'string') && typeof column.isColorData !== 'boolean') {\n                  checkIsColorData(data, column);\n              }\n          }\n      });\n  }\n\n  /*!\n  * Copyright (c) Microsoft Corporation.\n  * Licensed under the MIT License.\n  */\n  class Table {\n      constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = 'right') {\n          this.columns = columns;\n          this.rows = rows;\n          this.maxWidth = maxWidth;\n          this.underlineHeaders = underlineHeaders;\n          this.align = align;\n          // Calculate maximum width for each column\n          this.columnWidths = this.columns.map((col, idx) => Math.max(col.length, ...this.rows.map(row => { var _a; return ((_a = row[idx]) === null || _a === void 0 ? void 0 : _a.length) || 0; })));\n      }\n      createSpaces(num) {\n          return ' '.repeat(num);\n      }\n      groupColumns() {\n          let cumulativeWidth = 0;\n          const columnGroups = [];\n          let currentGroup = [];\n          this.columns.forEach((col, idx) => {\n              const columnSpace = this.columnWidths[idx] + 1; // account for one space between columns\n              if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n                  columnGroups.push(currentGroup);\n                  cumulativeWidth = columnSpace;\n                  currentGroup = [col];\n              }\n              else {\n                  cumulativeWidth += columnSpace;\n                  currentGroup.push(col);\n              }\n          });\n          if (currentGroup.length > 0) {\n              columnGroups.push(currentGroup);\n          }\n          return columnGroups;\n      }\n      formatRow(row, group) {\n          return group.map(col => {\n              const idx = this.columns.indexOf(col);\n              const cellValue = row[idx] == null ? '' : row[idx].toString();\n              return this.align === 'right'\n                  ? cellValue.padStart(this.columnWidths[idx], ' ')\n                  : cellValue.padEnd(this.columnWidths[idx], ' ');\n          }).join(this.createSpaces(1));\n      }\n      formatHeader(group) {\n          return group.map(col => {\n              const idx = this.columns.indexOf(col);\n              return this.align === 'right'\n                  ? col.padStart(this.columnWidths[idx], ' ')\n                  : col.padEnd(this.columnWidths[idx], ' ');\n          }).join(this.createSpaces(1));\n      }\n      underlineHeader(group) {\n          return group.map(col => '-'.repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n      }\n      render() {\n          const output = [];\n          const columnGroups = this.groupColumns();\n          columnGroups.forEach((group, groupIndex) => {\n              const headerRow = this.formatHeader(group);\n              let section = headerRow + (groupIndex < columnGroups.length - 1 ? ' \\\\' : '') + '\\n';\n              if (this.underlineHeaders) {\n                  section += this.underlineHeader(group) + '\\n';\n              }\n              this.rows.forEach((row) => {\n                  section += this.formatRow(row, group) + '\\n';\n              });\n              output.push(section);\n              if (groupIndex < columnGroups.length - 1) {\n                  output.push('\\n');\n              }\n          });\n          return output.join('');\n      }\n  }\n  exports.pandasSimulation = void 0;\n  (function (pandasSimulation) {\n      // Mapping TypeScript types to Python-like dtypes\n      const typeMapping = {\n          boolean: 'bool',\n          number: 'float64', // Assuming 'number' is used for floating-point numbers\n          date: 'datetime64[ns]',\n          string: 'object',\n          integer: 'int64',\n      };\n      function head(columns, data, maxWidth = 80) {\n          const numRows = 5; // Number of rows as in `head(5)` from pandas\n          const top = data.slice(0, numRows); // Get the top `numRows` rows\n          // Create a \"fake\" row number column\n          const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n          // Extract column names and rows for the table\n          const columnNames = [''].concat(columns.map(col => col.name));\n          const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map(col => { var _a; return ((_a = row[col.name]) === null || _a === void 0 ? void 0 : _a.toString()) || ''; })));\n          // Create and render the table with right alignment\n          const table = new Table(columnNames, rows, maxWidth, false, 'right'); // Right alignment\n          return table.render();\n      }\n      pandasSimulation.head = head;\n      function info(columns, data, maxWidth = 80) {\n          const numRows = data.length;\n          const output = [];\n          // Summary header\n          output.push('<class \\'pandas.core.frame.DataFrame\\'>');\n          output.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n          output.push(`Data columns (total ${columns.length} columns):\\n`);\n          // Column headers and details\n          const columnHeaders = ['#', 'Column', 'Non-Null Count', 'Dtype'];\n          const rows = columns.map((col, idx) => {\n              const nonNullCount = col.stats.nonNull.toString();\n              const dtype = typeMapping[col.type] || 'unknown';\n              return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n          });\n          // Create and render the table with left alignment and header underline\n          const table = new Table(columnHeaders, rows, maxWidth, true, 'left'); // Left alignment\n          output.push(table.render());\n          // Memory usage estimation\n          const memoryUsage = columns.reduce((total, col) => {\n              var _a;\n              const exampleValue = (_a = data.find(row => row[col.name] != null)) === null || _a === void 0 ? void 0 : _a[col.name];\n              if (exampleValue == null)\n                  return total;\n              const size = new Blob([exampleValue.toString()]).size;\n              return total + (size * numRows);\n          }, 0);\n          output.push(`\\ndtypes: ${columns.filter(col => col.type === 'number').length} float64, ` +\n              `${columns.filter(col => col.type === 'integer').length} int64, ` +\n              `${columns.filter(col => col.type === 'string').length} object`);\n          output.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n          return output.join('\\n');\n      }\n      pandasSimulation.info = info;\n  })(exports.pandasSimulation || (exports.pandasSimulation = {}));\n\n  exports.checkIsColorData = checkIsColorData;\n  exports.detectNegative = detectNegative;\n  exports.detectSequentialColumn = detectSequentialColumn;\n  exports.getColumnsFromData = getColumnsFromData;\n  exports.getStats = getStats;\n  exports.inferAll = inferAll;\n  exports.isColor = isColor;\n  exports.isQuantitative = isQuantitative;\n\n}));\n"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>SandDance-Specs test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <style>\n        body {\n            font-family: sans-serif;\n        }\n\n        header {\n            margin-bottom: 1em;\n        }\n        main {\n            display: grid;\n            grid-template-columns: auto 300px;\n        }\n        .sidebar label {\n            display: block;\n            padding-top: 1em;\n        }\n        textarea {\n            box-sizing: border-box;\n            width: 100%;\n            height: 100%;\n        }\n        .sidebar {\n            display: grid;\n            grid-template-rows: auto auto;\n        }\n        .sidebar > div {\n            display: grid;\n            grid-template-rows: 0fr auto 40px;\n        }\n        #vega-spec {\n            border: 1px solid #ccc;\n            max-height: 600px;\n            overflow: scroll;            \n        }\n    </style>\n</head>\n\n<body>\n    <header>\n        <h1>SandDance-Specs test</h1>\n        <label>\n            Insight file:\n            <select id=\"select-spec\">\n                <option>scatter-with-image.json</option>\n                <option>scatter.json</option>\n                <option>scatter-facet-wrap.json</option>\n                <option>scatter-facet-wrap-with-image.json</option>\n                <option>column-categoric.json</option>\n                <option>column-facet-cross.json</option>\n                <option>column-facet-wrap.json</option>\n                <option>column-sum-strip-pct.json</option>\n                <option>column-sum-strip.json</option>\n                <option>column-sum-treemap.json</option>\n                <option>column.json</option>\n                <option>density-facet-cross.json</option>\n                <option>density-facet-wrap.json</option>\n                <option>density-treemap.json</option>\n                <option>density.json</option>\n                <option>scatter-facet-cross.json</option>\n                <option>stacks-facet-cross.json</option>\n                <option>stacks-facet-wrap.json</option>\n                <option>stacks.json</option>\n                <option>stacks-with-image.json</option>\n                <option>stacks-facet-wrap-with-image.json</option>\n            </select>\n        </label>\n    </header>\n\n    <main>\n        <div id=\"vis\"></div>\n        <div class=\"sidebar\">\n            <div>\n                <label>Insight json input</label>\n                <textarea id=\"insight-json\"></textarea>\n                <button id=\"insight-update\">update</button>\n            </div>\n            <div>\n                <label>Vega spec output</label>\n                <textarea id=\"vega-spec\"></textarea>\n                <button id=\"vega-spec-copy\">copy</button>\n            </div>\n        </div>\n    </main>\n\n    <script src=\"js/sanddance-specs.js\"></script>\n    <script src=\"js/index.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/js/index.js",
    "content": "var dataUrl = '/SandDance/sample-data/demovote.tsv';\nvar specViewOptions = {\n    colors: {\n        defaultCube: \"steelblue\",\n        axisLine: \"#000\",\n        axisText: \"#000\"\n    },\n    language: {\n        count: \"Count\"\n    },\n    maxLegends: 20,\n    tickSize: 10,\n};\nvar data;\nvar columns;\nvar container = document.getElementById('vis');\nvar select = document.getElementById('select-spec');\nvar insightTextarea = document.getElementById('insight-json');\nvar insightUdateButton = document.getElementById('insight-update');\nvar vegaOutput = document.getElementById('vega-spec');\nvar vegaCopy = document.getElementById('vega-spec-copy');\nselect.onchange = function () { return selected(select.selectedIndex); };\ninsightUdateButton.onclick = function () {\n    var insight = JSON.parse(insightTextarea.value);\n    render(insight);\n};\nvegaCopy.onclick = function () {\n    vegaOutput.select();\n    document.execCommand('copy');\n    vegaCopy.innerText = 'copied';\n    setTimeout(function () {\n        vegaCopy.innerText = 'copy';\n    }, 2000);\n};\nfunction selected(selectedIndex) {\n    container.innerHTML = \"loading spec...\";\n    fetchInsight(select.options[selectedIndex].value);\n}\nfunction fetchInsight(specFilename) {\n    fetch(\"specs/\".concat(specFilename))\n        .then(function (response) { return response.json(); })\n        .then(function (insight) { return render(insight); })\n        .catch(function (error) { return container.innerText = error; });\n}\nfunction render(insight) {\n    insightTextarea.value = JSON.stringify(insight, null, 2);\n    var specColumns = SandDanceSpecs.getSpecColumns(insight, columns);\n    var context = { specColumns: specColumns, insight: insight, specViewOptions: specViewOptions };\n    var specResult = SandDanceSpecs.build(context, data);\n    if (specResult.errors) {\n        container.innerText = specResult.errors.map(function (error) { return error; }).join('\\n');\n    }\n    else {\n        renderVegaSpec(specResult.vegaSpec);\n    }\n}\nfunction renderVegaSpec(vegaSpec) {\n    var runtime = vega.parse(vegaSpec);\n    var vegaView = new vega.View(runtime, { container: container });\n    vegaView\n        .runAsync()\n        .catch(function (e) { return container.innerHTML = \"error \".concat(e); })\n        .then(function () {\n        var d0 = vegaSpec.data[0];\n        delete d0.values;\n        d0.format = {\n            parse: 'auto',\n            type: 'tsv'\n        };\n        d0.url = 'https://microsoft.github.io' + dataUrl;\n        vegaOutput.value = JSON.stringify(vegaSpec, null, 2);\n    });\n}\ncontainer.innerHTML = \"loading \".concat(dataUrl, \"...\");\nvega.loader().load(dataUrl).then(function (tsv_data) {\n    data = vega.read(tsv_data, { type: 'tsv', parse: 'auto' });\n    columns = SandDanceSpecs.getColumnsFromData(vega.inferTypes, data);\n    selected(0);\n});\n"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/js/sanddance-specs.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.SandDanceSpecs = {}));\n})(this, (function (exports) { 'use strict';\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const FieldNames = {\n        Active: '__SandDance__Active',\n        Collapsed: '__SandDance__Collapsed',\n        Contains: '__SandDance__Contains',\n        Count: '__SandDance__Count',\n        Sum: '__SandDance__Sum',\n        SumOfCount: '__SandDance__CountSum',\n        SumOfSum: '__SandDance__SumSum',\n        Selected: '__SandDance__Selected',\n        First: '__SandDance__First',\n        Last: '__SandDance__Last',\n        Top: '__SandDance__Top',\n        TopColor: '__SandDance__TopColor',\n        TopIndex: '__SandDance__TopIndex',\n        PowerBISelectionId: '__SandDance__PowerBISelectionId',\n        FacetSearch: '__SandDance__FacetSearch',\n        FacetTitle: '__SandDance__FacetTitle',\n        Ordinal: '__SandDance__Ordinal',\n        WrapCol: '__SandDance__WrapCol',\n        WrapRow: '__SandDance__WrapRow',\n        Value: '__SandDance__Value',\n        OffsetX: '__SandDance__X',\n        OffsetY: '__SandDance__Y',\n        OffsetHeight: '__SandDance__H',\n        OffsetWidth: '__SandDance__W',\n    };\n    const ScaleNames = {\n        Color: 'scale_color',\n        X: 'scale_x',\n        Y: 'scale_y',\n        Z: 'scale_z',\n    };\n    //Signal names\n    const SignalNames = {\n        ViewportWidth: 'ViewportWidth',\n        ViewportHeight: 'ViewportHeight',\n        MinCellWidth: 'MinCellWidth',\n        MinCellHeight: 'MinCellHeight',\n        PlotOffsetLeft: 'PlotOffsetLeft',\n        PlotOffsetTop: 'PlotOffsetTop',\n        PlotOffsetBottom: 'PlotOffsetBottom',\n        PlotOffsetRight: 'PlotOffsetRight',\n        PlotHeightIn: 'PlotHeightIn',\n        PlotWidthIn: 'PlotWidthIn',\n        PlotHeightOut: 'PlotHeightOut',\n        PlotWidthOut: 'PlotWidthOut',\n        ColorBinCount: 'RoleColor_BinCountSignal',\n        ColorReverse: 'RoleColor_ReverseSignal',\n        FacetAxesAdjustX: 'RoleFacet_AxesAdjustSignalX',\n        FacetAxesAdjustY: 'RoleFacet_AxesAdjustSignalY',\n        FacetBins: 'RoleFacet_BinsSignal',\n        FacetVBins: 'RoleFacetV_BinsSignal',\n        FacetPaddingTop: 'FacetPaddingTop',\n        FacetPaddingBottom: 'FacetPaddingBottom',\n        FacetPaddingLeft: 'FacetPaddingLeft',\n        MarkOpacity: 'Mark_OpacitySignal',\n        PointScale: 'Chart_PointScaleSignal',\n        TextAngleX: 'Text_AngleXSignal',\n        TextAngleY: 'Text_AngleYSignal',\n        TextScale: 'Text_ScaleSignal',\n        TextSize: 'Text_SizeSignal',\n        TextTitleSize: 'Text_TitleSizeSignal',\n        TreeMapMethod: 'Chart_TreeMapMethodSignal',\n        XBins: 'RoleX_BinsSignal',\n        YBins: 'RoleY_BinsSignal',\n        ZHeight: 'RoleZ_HeightSignal',\n        ZGrounded: 'RoleZ_Grounded',\n        ZProportion: 'RoleZ_ProportionSignal',\n    };\n    //These are special formulaic data values\n    const Other = '__Other';\n    //name of the \"no-color\" palette\n    const ColorScaleNone = 'none';\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //TODO move these to options\n    const defaultBins = 10;\n    const maxbins = 100;\n    const minBarBandWidth = 15;\n    const minFacetWidth = 140;\n    const minFacetHeight = 180;\n    const facetPaddingLeft = 40;\n    const facetPaddingTop = 40;\n    const facetPaddingBottom = 40;\n    const facetPaddingRight = 40;\n    const axesLabelLimit = 100;\n    const axesTitleLimit = 100;\n    const axesTitlePaddingX = 30;\n    const axesTitlePaddingY = 60;\n    const axesTitlePaddingFacetX = 69;\n    const axesTitlePaddingFacetY = 92;\n    const axesOffsetX = 120;\n    const axesOffsetY = 120;\n    const scatterSizedDiv = 20;\n    const debounce = 250;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function allowNoneForSize(specContext) {\n        switch (specContext.insight.totalStyle) {\n            case 'sum-strip':\n            case 'sum-strip-percent':\n            case 'sum-treemap':\n                return false;\n            default:\n                //if totalStyle is blank, count is assumed\n                return true;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function barchartH (specContext) {\n        var _a, _b, _c, _d;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { language } = specViewOptions;\n        const showAxes = !insight.hideAxes;\n        const bandProps = {\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n        };\n        const x = { title: null };\n        const axisScales = {\n            x,\n            y: { title: (_a = specColumns.y) === null || _a === void 0 ? void 0 : _a.name },\n            z: { title: (_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.name },\n        };\n        const layouts = [{\n                layoutType: 'Band',\n                props: bandProps,\n            }];\n        const { totalStyle, view } = insight;\n        if (totalStyle === 'sum-strip-percent') {\n            x.aggregate = 'percent';\n            x.title = language.percent;\n            const stripProps = {\n                addPercentageScale: true,\n                sortOrder: 'ascending',\n                orientation: 'horizontal',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps,\n            });\n        }\n        else {\n            const aggProps = {\n                niceScale: true,\n                dock: 'left',\n                globalAggregateMaxExtentSignal: 'aggMaxExtent',\n                globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n                sumBy: specColumns.size,\n                showAxes,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props: aggProps,\n            });\n            switch (totalStyle) {\n                case 'sum-treemap': {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const treemapProps = {\n                        corner: 'top-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps,\n                    });\n                    break;\n                }\n                case 'sum-strip': {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                case 'count-strip': {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                default: {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'down-right',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps,\n                    });\n                    break;\n                }\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                percentage: true,\n                roles: [\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_c = specColumns.y) === null || _c === void 0 ? void 0 : _c.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_d = specColumns.z) === null || _d === void 0 ? void 0 : _d.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function barchartV (specContext) {\n        var _a, _b;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { language } = specViewOptions;\n        const showAxes = !insight.hideAxes;\n        const bandProps = {\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n        };\n        const y = { title: null };\n        const axisScales = {\n            x: { title: specColumns.x && specColumns.x.name },\n            y,\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [{\n                layoutType: 'Band',\n                props: bandProps,\n            }];\n        const { totalStyle, view } = insight;\n        if (totalStyle === 'sum-strip-percent') {\n            y.aggregate = 'percent';\n            y.title = language.percent;\n            const stripProps = {\n                addPercentageScale: true,\n                sortOrder: 'descending',\n                orientation: 'vertical',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps,\n            });\n        }\n        else {\n            const aggProps = {\n                niceScale: true,\n                dock: 'bottom',\n                globalAggregateMaxExtentSignal: 'aggMaxExtent',\n                globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n                sumBy: specColumns.size,\n                showAxes,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props: aggProps,\n            });\n            switch (totalStyle) {\n                case 'sum-treemap': {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const treemapProps = {\n                        corner: 'bottom-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps,\n                    });\n                    break;\n                }\n                case 'sum-strip': {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                case 'count-strip': {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                default: {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'right-up',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps,\n                    });\n                    break;\n                }\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                percentage: true,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function density (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const axisScales = {\n            x: { title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name },\n            y: { title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name },\n            z: { title: (_c = specColumns.z) === null || _c === void 0 ? void 0 : _c.name },\n        };\n        const backgroundImage = ((_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.quantitative) && ((_f = insight.backgroundImage) === null || _f === void 0 ? void 0 : _f.extents) && insight.backgroundImage;\n        const showAxes = !(backgroundImage || insight.hideAxes);\n        const hBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom },\n        };\n        const vBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left },\n        };\n        const aggProps = {\n            onBuild: null,\n            aggregation: null,\n            sumBy: specColumns.size,\n        };\n        const layouts = [\n            {\n                layoutType: 'Band',\n                props: vBandProps,\n            },\n            {\n                layoutType: 'Band',\n                props: hBandProps,\n            },\n            {\n                layoutType: 'AggregateSquare',\n                props: aggProps,\n            },\n        ];\n        const { totalStyle, view } = insight;\n        switch (totalStyle) {\n            case 'sum-treemap': {\n                aggProps.aggregation = 'sum';\n                const treemapProps = {\n                    corner: 'bottom-left',\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Treemap',\n                    props: treemapProps,\n                });\n                break;\n            }\n            case 'sum-strip': {\n                aggProps.aggregation = 'sum';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            case 'count-strip': {\n                aggProps.aggregation = 'count';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            default: {\n                aggProps.aggregation = 'count';\n                const squareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: 'right-down',\n                    z: specColumns.z,\n                    maxGroupedUnits: null,\n                    maxGroupedFillSize: null,\n                    showAxes,\n                    view,\n                };\n                aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled) => {\n                    squareProps.maxGroupedUnits = aggMaxExtent;\n                    squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n                };\n                layouts.push({\n                    layoutType: 'Square',\n                    props: squareProps,\n                });\n                break;\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: true,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function grid (specContext) {\n        var _a;\n        const { insight, specColumns } = specContext;\n        const { view } = insight;\n        const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: 'right-down',\n            z: specColumns.z,\n            collapseYHeight: true,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        return {\n            axisScales,\n            layouts: [\n                {\n                    layoutType: 'Square',\n                    props: squareProps,\n                },\n            ],\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function scatterplot (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const backgroundImageExtents = ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative) && ((_c = insight.backgroundImage) === null || _c === void 0 ? void 0 : _c.extents);\n        const scatterProps = {\n            x: specColumns.x,\n            y: specColumns.y,\n            z: specColumns.z,\n            size: specColumns.size,\n            scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n            zGrounded: specViewOptions.language.zGrounded,\n            backgroundImageExtents,\n            showAxes: !(backgroundImageExtents || insight.hideAxes),\n            view: insight.view,\n        };\n        const axisScales = {\n            x: { title: (_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.name },\n            y: { title: (_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.name },\n            z: { title: (_f = specColumns.z) === null || _f === void 0 ? void 0 : _f.name },\n        };\n        return {\n            axisScales,\n            layouts: [\n                {\n                    layoutType: 'Scatter',\n                    props: scatterProps,\n                },\n            ],\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'x',\n                        axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                    },\n                    {\n                        role: 'y',\n                        axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? 'range' : 'exact',\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: false,\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        excludeCategoric: true,\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n                signals: [SignalNames.PointScale, SignalNames.ZGrounded],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function stacks (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const axisScales = {\n            x: { title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name },\n            y: { title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name },\n            z: { title: specViewOptions.language.count },\n        };\n        const backgroundImage = ((_c = specColumns.x) === null || _c === void 0 ? void 0 : _c.quantitative) && ((_d = specColumns.y) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = insight.backgroundImage) === null || _e === void 0 ? void 0 : _e.extents) && insight.backgroundImage;\n        const showAxes = !(backgroundImage || insight.hideAxes);\n        const hBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom },\n        };\n        const vBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left },\n        };\n        const stackProps = {\n            sort: specColumns.sort,\n            showAxes,\n        };\n        return {\n            axisScales,\n            customZScale: true,\n            layouts: [\n                {\n                    layoutType: 'Band',\n                    props: vBandProps,\n                },\n                {\n                    layoutType: 'Band',\n                    props: hBandProps,\n                },\n                {\n                    layoutType: 'Stack',\n                    props: stackProps,\n                },\n            ],\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_f = specColumns.x) === null || _f === void 0 ? void 0 : _f.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_g = specColumns.y) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function strips (specContext) {\n        var _a;\n        const { insight, specColumns } = specContext;\n        const { view } = insight;\n        const stripProps = {\n            sortOrder: 'ascending',\n            orientation: 'vertical',\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [];\n        if (specColumns.facet) {\n            axisScales.y = {\n                title: null,\n                aggregate: specColumns.size ? 'sum' : 'count',\n            };\n            const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n            const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n            const props = {\n                dock: 'top',\n                niceScale: false,\n                globalAggregateMaxExtentScaledSignal,\n                globalAggregateMaxExtentSignal,\n                sumBy: specColumns.size,\n                showAxes: false,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props,\n            });\n        }\n        layouts.push({\n            layoutType: 'Strip',\n            props: stripProps,\n        });\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'size',\n                        allowNone: true, //size by none is a count\n                        excludeCategoric: true,\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function treemap (specContext) {\n        var _a;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { view } = insight;\n        const treemapProps = {\n            corner: 'top-left',\n            group: specColumns.group,\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [];\n        if (specColumns.facet) {\n            axisScales.y = {\n                title: null,\n                aggregate: 'sum',\n            };\n            const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n            const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n            const props = {\n                dock: 'top',\n                niceScale: false,\n                globalAggregateMaxExtentScaledSignal,\n                globalAggregateMaxExtentSignal,\n                sumBy: specColumns.size,\n                showAxes: false,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props,\n            });\n        }\n        layouts.push({\n            layoutType: 'Treemap',\n            props: treemapProps,\n        });\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'size',\n                        excludeCategoric: true,\n                    },\n                    {\n                        role: 'group',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n                signals: [SignalNames.TreeMapMethod],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n        let layoutPair;\n        const groupby = facetColumn;\n        const plotPadding = {\n            x: 0,\n            y: 0,\n        };\n        let facetPadding;\n        switch (facetStyle) {\n            case 'cross': {\n                const props = {\n                    axisTextColor,\n                    colRowTitles: true,\n                    groupbyX: groupby,\n                    groupbyY: facetVColumn,\n                };\n                layoutPair = {\n                    layoutType: 'Cross',\n                    props,\n                };\n                facetPadding = {\n                    bottom: facetPaddingBottom,\n                    left: facetPaddingLeft,\n                    top: 0,\n                };\n                plotPadding.y = facetPaddingTop;\n                plotPadding.x = facetPaddingRight;\n                break;\n            }\n            case 'wrap':\n            default: {\n                const props = {\n                    axisTextColor,\n                    cellTitles: true,\n                    groupby,\n                };\n                layoutPair = {\n                    layoutType: 'Wrap',\n                    props,\n                };\n                facetPadding =\n                    {\n                        bottom: facetPaddingBottom,\n                        left: facetPaddingLeft,\n                        top: facetPaddingTop,\n                    };\n                break;\n            }\n        }\n        const facetLayout = {\n            facetPadding,\n            plotPadding,\n        };\n        return {\n            layoutPair,\n            facetLayout,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const map = {\n        barchart: barchartV,\n        barchartH,\n        barchartV,\n        density,\n        grid,\n        scatterplot,\n        stacks,\n        strips,\n        treemap,\n    };\n    function getSpecBuilderPropsForChart(specContext) {\n        const { insight, specColumns, specViewOptions } = specContext;\n        const fn = map[insight.chart];\n        if (fn) {\n            const props = fn(specContext);\n            if (insight.columns.facet) {\n                const discreteFacetColumn = {\n                    column: specColumns.facet,\n                    defaultBins,\n                    maxbins,\n                    maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                    maxbinsSignalName: SignalNames.FacetBins,\n                };\n                const discreteFacetVColumn = {\n                    column: specColumns.facetV,\n                    defaultBins,\n                    maxbins,\n                    maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                    maxbinsSignalName: SignalNames.FacetVBins,\n                };\n                const { facetLayout, layoutPair } = getFacetLayout(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n                props.layouts.unshift(layoutPair);\n                props.facetLayout = facetLayout;\n                props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n            }\n            return props;\n        }\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n        reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n        reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n        reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n        reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n        reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color, color, {\n      copy(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHex8: color_formatHex8,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHex8() {\n      return this.rgb().formatHex8();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb, extend(Color, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb() {\n        return this;\n      },\n      clamp() {\n        return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n      },\n      displayable() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatHex8: rgb_formatHex8,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n    }\n\n    function rgb_formatHex8() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n    }\n\n    function rgb_formatRgb() {\n      const a = clampa(this.opacity);\n      return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n    }\n\n    function clampa(opacity) {\n      return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n    }\n\n    function clampi(value) {\n      return Math.max(0, Math.min(255, Math.round(value) || 0));\n    }\n\n    function hex(value) {\n      value = clampi(value);\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      clamp() {\n        return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n      },\n      displayable() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl() {\n        const a = clampa(this.opacity);\n        return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n      }\n    }));\n\n    function clamph(value) {\n      value = (value || 0) % 360;\n      return value < 0 ? value + 360 : value;\n    }\n\n    function clampt(value) {\n      return Math.max(0, Math.min(1, value || 0));\n    }\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function isColor(cssColorSpecifier) {\n        return !!color(cssColorSpecifier);\n    }\n    function checkIsColorData(data, column) {\n        if (!column.stats.hasColorData) {\n            column.isColorData = false;\n            return;\n        }\n        for (let i = 0; i < data.length; i++) {\n            if (!isColor(data[i][column.name])) {\n                column.isColorData = false;\n                return;\n            }\n        }\n        column.isColorData = true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function isQuantitative(column) {\n        return column.type === 'number' || column.type === 'integer';\n    }\n    function detectNegative(columnName, data) {\n        for (let i = 1; i < data.length; i++) {\n            const value = columnName == null ? data[i] : data[i][columnName];\n            if (value < 0)\n                return true;\n        }\n        return false;\n    }\n    function detectSequentialColumn(columnName, data) {\n        if (data.length < 2)\n            return false;\n        for (let i = 1; i < data.length; i++) {\n            const curr = columnName == null ? data[i] : data[i][columnName];\n            const prev = columnName == null ? data[i - 1] : data[i - 1][columnName];\n            if (curr !== prev + 1)\n                return false;\n        }\n        return true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getStats(data, ...args) {\n        let columnName;\n        let columnType;\n        let columnQuantitative;\n        let distinctValuesCallback;\n        if (args.length <= 2) {\n            const column = args[0];\n            columnName = column.name;\n            columnType = column.type;\n            columnQuantitative = column.quantitative;\n            distinctValuesCallback = args[1];\n        }\n        else {\n            columnName = args[0];\n            columnType = args[1];\n            columnQuantitative = args[2];\n            distinctValuesCallback = args[3];\n        }\n        const distinctMap = {};\n        const stats = {\n            nonNull: 0,\n            distinctValueCount: null,\n            max: null,\n            mean: null,\n            min: null,\n        };\n        const columnIsString = columnType === 'string';\n        let sum = 0;\n        for (let i = 0; i < data.length; i++) {\n            const row = data[i];\n            const value = columnName == null ? row : row[columnName];\n            if (columnIsString) {\n                if (value !== '') {\n                    stats.nonNull++;\n                }\n            }\n            else if (value != null) {\n                stats.nonNull++;\n            }\n            const num = +value;\n            distinctMap[value] = true;\n            if (!isNaN(num)) {\n                if (stats.max === null || num > stats.max) {\n                    stats.max = num;\n                }\n                if (stats.min === null || num < stats.min) {\n                    stats.min = num;\n                }\n                sum += num;\n            }\n            // hex codes, ex. #003300, are parsed as dates\n            if ((columnType === 'date' || columnIsString) && !stats.hasColorData && isColor(value)) {\n                stats.hasColorData = true;\n            }\n        }\n        if (columnQuantitative) {\n            stats.mean = data.length > 0 && (sum / data.length);\n            stats.hasNegative = detectNegative(columnName, data);\n            if (columnType === 'integer') {\n                stats.isSequential = detectSequentialColumn(columnName, data);\n            }\n        }\n        const distinctValues = Object.keys(distinctMap);\n        if (distinctValuesCallback) {\n            distinctValues.sort();\n            distinctValuesCallback(distinctValues);\n        }\n        stats.distinctValueCount = distinctValues.length;\n        return stats;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Derive column metadata from the data array.\n     * @param data Array of data objects.\n     */\n    function getColumnsFromData(inferTypesFn, data, columnTypes) {\n        const sample = data[0];\n        const fields = sample ? Object.keys(sample) : [];\n        const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n        const columns = fields.map(name => {\n            const column = {\n                name,\n                type: inferences[name],\n            };\n            return column;\n        });\n        inferAll(columns, data);\n        return columns;\n    }\n    /**\n     * Populate columns with type inferences and stats.\n     * @param columns Array of columns.\n     * @param data Array of data objects.\n     */\n    function inferAll(columns, data) {\n        columns.forEach(column => {\n            if (column) {\n                if (typeof column.quantitative !== 'boolean') {\n                    column.quantitative = isQuantitative(column);\n                }\n                if (!column.stats) {\n                    column.stats = getStats(data, column);\n                }\n                // hex codes, ex. #003300, are parsed as dates\n                if ((column.type === 'date' || column.type === 'string') && typeof column.isColorData !== 'boolean') {\n                    checkIsColorData(data, column);\n                }\n            }\n        });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Table {\n        constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = 'right') {\n            this.columns = columns;\n            this.rows = rows;\n            this.maxWidth = maxWidth;\n            this.underlineHeaders = underlineHeaders;\n            this.align = align;\n            // Calculate maximum width for each column\n            this.columnWidths = this.columns.map((col, idx) => Math.max(col.length, ...this.rows.map(row => { var _a; return ((_a = row[idx]) === null || _a === void 0 ? void 0 : _a.length) || 0; })));\n        }\n        createSpaces(num) {\n            return ' '.repeat(num);\n        }\n        groupColumns() {\n            let cumulativeWidth = 0;\n            const columnGroups = [];\n            let currentGroup = [];\n            this.columns.forEach((col, idx) => {\n                const columnSpace = this.columnWidths[idx] + 1; // account for one space between columns\n                if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n                    columnGroups.push(currentGroup);\n                    cumulativeWidth = columnSpace;\n                    currentGroup = [col];\n                }\n                else {\n                    cumulativeWidth += columnSpace;\n                    currentGroup.push(col);\n                }\n            });\n            if (currentGroup.length > 0) {\n                columnGroups.push(currentGroup);\n            }\n            return columnGroups;\n        }\n        formatRow(row, group) {\n            return group.map(col => {\n                const idx = this.columns.indexOf(col);\n                const cellValue = row[idx] == null ? '' : row[idx].toString();\n                return this.align === 'right'\n                    ? cellValue.padStart(this.columnWidths[idx], ' ')\n                    : cellValue.padEnd(this.columnWidths[idx], ' ');\n            }).join(this.createSpaces(1));\n        }\n        formatHeader(group) {\n            return group.map(col => {\n                const idx = this.columns.indexOf(col);\n                return this.align === 'right'\n                    ? col.padStart(this.columnWidths[idx], ' ')\n                    : col.padEnd(this.columnWidths[idx], ' ');\n            }).join(this.createSpaces(1));\n        }\n        underlineHeader(group) {\n            return group.map(col => '-'.repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n        }\n        render() {\n            const output = [];\n            const columnGroups = this.groupColumns();\n            columnGroups.forEach((group, groupIndex) => {\n                const headerRow = this.formatHeader(group);\n                let section = headerRow + (groupIndex < columnGroups.length - 1 ? ' \\\\' : '') + '\\n';\n                if (this.underlineHeaders) {\n                    section += this.underlineHeader(group) + '\\n';\n                }\n                this.rows.forEach((row) => {\n                    section += this.formatRow(row, group) + '\\n';\n                });\n                output.push(section);\n                if (groupIndex < columnGroups.length - 1) {\n                    output.push('\\n');\n                }\n            });\n            return output.join('');\n        }\n    }\n    var pandasSimulation;\n    (function (pandasSimulation) {\n        // Mapping TypeScript types to Python-like dtypes\n        const typeMapping = {\n            boolean: 'bool',\n            number: 'float64', // Assuming 'number' is used for floating-point numbers\n            date: 'datetime64[ns]',\n            string: 'object',\n            integer: 'int64',\n        };\n        function head(columns, data, maxWidth = 80) {\n            const numRows = 5; // Number of rows as in `head(5)` from pandas\n            const top = data.slice(0, numRows); // Get the top `numRows` rows\n            // Create a \"fake\" row number column\n            const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n            // Extract column names and rows for the table\n            const columnNames = [''].concat(columns.map(col => col.name));\n            const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map(col => { var _a; return ((_a = row[col.name]) === null || _a === void 0 ? void 0 : _a.toString()) || ''; })));\n            // Create and render the table with right alignment\n            const table = new Table(columnNames, rows, maxWidth, false, 'right'); // Right alignment\n            return table.render();\n        }\n        pandasSimulation.head = head;\n        function info(columns, data, maxWidth = 80) {\n            const numRows = data.length;\n            const output = [];\n            // Summary header\n            output.push('<class \\'pandas.core.frame.DataFrame\\'>');\n            output.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n            output.push(`Data columns (total ${columns.length} columns):\\n`);\n            // Column headers and details\n            const columnHeaders = ['#', 'Column', 'Non-Null Count', 'Dtype'];\n            const rows = columns.map((col, idx) => {\n                const nonNullCount = col.stats.nonNull.toString();\n                const dtype = typeMapping[col.type] || 'unknown';\n                return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n            });\n            // Create and render the table with left alignment and header underline\n            const table = new Table(columnHeaders, rows, maxWidth, true, 'left'); // Left alignment\n            output.push(table.render());\n            // Memory usage estimation\n            const memoryUsage = columns.reduce((total, col) => {\n                var _a;\n                const exampleValue = (_a = data.find(row => row[col.name] != null)) === null || _a === void 0 ? void 0 : _a[col.name];\n                if (exampleValue == null)\n                    return total;\n                const size = new Blob([exampleValue.toString()]).size;\n                return total + (size * numRows);\n            }, 0);\n            output.push(`\\ndtypes: ${columns.filter(col => col.type === 'number').length} float64, ` +\n                `${columns.filter(col => col.type === 'integer').length} int64, ` +\n                `${columns.filter(col => col.type === 'string').length} object`);\n            output.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n            return output.join('\\n');\n        }\n        pandasSimulation.info = info;\n    })(pandasSimulation || (pandasSimulation = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Get columns associated with each Insight role.\n     * @param insight Insight to specify column roles.\n     * @param columns Array of Columns inferred from the data.\n     */\n    function getSpecColumns(insight, columns) {\n        function getColumnByName(name) {\n            return columns.filter(c => c.name === name)[0];\n        }\n        return {\n            color: getColumnByName(insight.columns && insight.columns.color),\n            facet: getColumnByName(insight.columns && insight.columns.facet),\n            facetV: getColumnByName(insight.columns && insight.columns.facetV),\n            group: getColumnByName(insight.columns && insight.columns.group),\n            size: getColumnByName(insight.columns && insight.columns.size),\n            sort: getColumnByName(insight.columns && insight.columns.sort),\n            uid: getColumnByName(insight.columns && insight.columns.uid),\n            x: getColumnByName(insight.columns && insight.columns.x),\n            y: getColumnByName(insight.columns && insight.columns.y),\n            z: getColumnByName(insight.columns && insight.columns.z),\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addAxes(scope, ...axes) {\n        if (!axes || !axes.length)\n            return;\n        if (!scope.axes)\n            scope.axes = [];\n        scope.axes.push(...axes.filter(Boolean));\n    }\n    function addData(scope, ...datas) {\n        if (!datas || !datas.length)\n            return;\n        if (!scope.data)\n            scope.data = [];\n        scope.data.push(...datas.filter(Boolean));\n    }\n    function addMarks(scope, ...marks) {\n        if (!marks || !marks.length)\n            return;\n        if (!scope.marks)\n            scope.marks = [];\n        scope.marks.push(...marks.filter(Boolean));\n    }\n    function addScales(scope, ...scales) {\n        if (!scales || !scales.length)\n            return;\n        if (!scope.scales)\n            scope.scales = [];\n        scope.scales.push(...scales.filter(Boolean));\n    }\n    function addSignals(scope, ...signals) {\n        if (!signals || !signals.length)\n            return;\n        if (!scope.signals)\n            scope.signals = [];\n        scope.signals.push(...signals.filter(Boolean));\n    }\n    function addTransforms(data, ...transforms) {\n        if (!transforms || !transforms.length)\n            return;\n        if (!data.transform)\n            data.transform = [];\n        data.transform.push(...transforms.filter(Boolean));\n    }\n    function getDataByName(data, dataName) {\n        for (let i = 0; i < data.length; i++) {\n            if (data[i].name === dataName)\n                return { data: data[i], index: i };\n        }\n    }\n    function getGroupBy(groupings) {\n        const groupby = groupings.map(g => g.groupby);\n        return groupby.reduce((acc, val) => acc.concat(val), []);\n    }\n    function addOffsets(...offsets) {\n        return offsets.filter(Boolean).join(' + ');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addGlobalAxes(props) {\n        const { axesOffsets, axisScales, axesScopes, axesTitlePadding, allGlobalScales, globalScope, labelBaseline, plotOffsetSignals, specColumns, specViewOptions } = props;\n        const { scope } = globalScope;\n        allGlobalScales.forEach(globalScales => {\n            const { scales } = globalScales;\n            for (const xyz in scales) {\n                const _scales = scales[xyz];\n                if (_scales) {\n                    addScales(scope, ..._scales);\n                    let { showAxes } = globalScales;\n                    let zindex = undefined;\n                    if (xyz === 'z') {\n                        showAxes = false;\n                        if (props.view === '3d' && specViewOptions.zAxisOptions && !props.hideZAxis) {\n                            if (specViewOptions.zAxisOptions.showZAxis) {\n                                showAxes = true;\n                                zindex = specViewOptions.zAxisOptions.zIndex;\n                            }\n                        }\n                    }\n                    if (showAxes && axisScales) {\n                        const axisScale = axisScales[xyz];\n                        if (axisScale) {\n                            const lineColor = specViewOptions.colors.axisLine;\n                            const horizontal = xyz === 'x';\n                            const column = specColumns[xyz] || { quantitative: true };\n                            const title = axisScale.title;\n                            const props = {\n                                title,\n                                horizontal,\n                                column,\n                                specViewOptions,\n                                lineColor,\n                                titlePadding: axesTitlePadding[xyz],\n                                labelBaseline: labelBaseline[xyz],\n                                zindex,\n                            };\n                            axesScopes['main'].forEach(a => addAxes(a.scope, createAxis(Object.assign(Object.assign({}, props), { scale: a.scale || _scales[0], showTitle: a.title, showLabels: a.labels, showLines: a.lines }))));\n                            if (axesScopes[xyz]) {\n                                axesScopes[xyz].forEach(a => addAxes(a.scope, createAxis(Object.assign(Object.assign({}, props), { scale: a.scale || _scales[0], showTitle: a.title, showLabels: a.labels, showLines: a.lines }))));\n                            }\n                            if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                                const plotOffsetSignal = plotOffsetSignals[xyz];\n                                plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                            }\n                        }\n                    }\n                }\n            }\n        });\n    }\n    function createAxis(props) {\n        const { column, horizontal, labelBaseline, lineColor, scale, showLabels, showTitle, showLines, specViewOptions, title, titlePadding, zindex } = props;\n        const axis = Object.assign(Object.assign(Object.assign(Object.assign({ zindex, scale: scale.name, orient: horizontal ? 'bottom' : 'left', domain: showLines, ticks: showLines }, showLines && {\n            domainColor: lineColor,\n            tickColor: lineColor,\n            tickSize: specViewOptions.tickSize,\n        }), showTitle && {\n            title,\n            titleAlign: horizontal ? 'left' : 'right',\n            titleAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY,\n            },\n            titleColor: specViewOptions.colors.axisText,\n            titleFontSize: {\n                signal: SignalNames.TextTitleSize,\n            },\n            titleLimit: axesTitleLimit,\n            titlePadding,\n        }), { labels: showLabels }), showLabels && {\n            labelAlign: horizontal ? 'left' : 'right',\n            labelBaseline,\n            labelAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY,\n            },\n            labelColor: specViewOptions.colors.axisText,\n            labelFontSize: {\n                signal: SignalNames.TextSize,\n            },\n            labelLimit: axesLabelLimit,\n        });\n        if (column.quantitative) {\n            axis.format = '~r';\n        }\n        return axis;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Make sure that the field name is accessible via Vega's Field type\n     * https://vega.github.io/vega/docs/types/#Field\n     * examples: \"source.x\", \"target['x']\", \"[my.field]\"\n     */\n    function safeFieldName(field) {\n        return field\n            .replace(/\\\\/g, '\\\\\\\\') //escape backslashes\n            .replace(/'/g, '\\\\\\'') //escape single quotes\n            .replace(/\"/g, '\\\\\"') //escape double quotes\n            .replace(/\\./g, '\\\\.') //escape periods\n            .replace(/\\[/g, '\\\\[') //escape left square brackets\n            .replace(/\\]/g, '\\\\]') //escape right square brackets\n        ;\n    }\n    /**\n     * Make sure the field name is usable in a Vega expression\n     */\n    function exprSafeFieldName(field) {\n        //remove whitespace, period, accessors and logical modifiers\n        return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, '');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function linearScale(scaleName, domain, range, reverse, zero, nice = true) {\n        const scale = {\n            name: scaleName,\n            type: 'linear',\n            range,\n            round: true,\n            reverse,\n            domain,\n            zero,\n            nice,\n        };\n        return scale;\n    }\n    function pointScale(scaleName, data, range, field, reverse) {\n        const scale = {\n            name: scaleName,\n            type: 'point',\n            range,\n            domain: {\n                data,\n                field: safeFieldName(field),\n                sort: true,\n            },\n            padding: 0.5,\n        };\n        if (reverse !== undefined) {\n            scale.reverse = reverse;\n        }\n        return scale;\n    }\n    function binnableColorScale(scaleName, colorBin, data, field, scheme) {\n        scheme = scheme || ColorScaleNone;\n        const domain = {\n            data,\n            field: safeFieldName(field),\n        };\n        const range = {\n            scheme,\n        };\n        const reverse = { signal: SignalNames.ColorReverse };\n        if (colorBin !== 'continuous') {\n            range.count = { signal: SignalNames.ColorBinCount };\n        }\n        switch (colorBin) {\n            case 'continuous': {\n                const sequentialScale = {\n                    name: scaleName,\n                    type: 'linear',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return sequentialScale;\n            }\n            case 'quantile': {\n                const quantileScale = {\n                    name: scaleName,\n                    type: 'quantile',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return quantileScale;\n            }\n            default: {\n                const quantizeScale = {\n                    name: scaleName,\n                    type: 'quantize',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return quantizeScale;\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const defaultZProportion = 0.6;\n    function textSignals(context, heightSignal) {\n        const { specViewOptions } = context;\n        const signals = [\n            {\n                name: SignalNames.ZProportion,\n                value: defaultZProportion,\n                bind: {\n                    name: specViewOptions.language.zScaleProportion,\n                    debounce,\n                    input: 'range',\n                    min: 0.1,\n                    max: 2,\n                    step: 0.1,\n                },\n            },\n            {\n                name: SignalNames.ZHeight,\n                update: `${heightSignal} * ${SignalNames.ZProportion}`,\n            },\n            {\n                name: SignalNames.TextScale,\n                value: 1.2,\n                bind: {\n                    name: specViewOptions.language.textScaleSignal,\n                    debounce,\n                    input: 'range',\n                    min: 0.5,\n                    max: 2,\n                    step: 0.1,\n                },\n            },\n            {\n                name: SignalNames.TextSize,\n                update: `${SignalNames.TextScale} * 10`,\n            },\n            {\n                name: SignalNames.TextTitleSize,\n                update: `${SignalNames.TextScale} * 15`,\n            },\n            {\n                name: SignalNames.TextAngleX,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.xAxisTextAngleSignal,\n                    debounce,\n                    input: 'range',\n                    min: 0,\n                    max: 90,\n                    step: 1,\n                },\n            },\n            {\n                name: SignalNames.TextAngleY,\n                value: 0,\n                bind: {\n                    name: specViewOptions.language.yAxisTextAngleSignal,\n                    debounce,\n                    input: 'range',\n                    min: -90,\n                    max: 0,\n                    step: 1,\n                },\n            },\n            {\n                name: SignalNames.MarkOpacity,\n                value: 1,\n                bind: {\n                    name: specViewOptions.language.markOpacitySignal,\n                    debounce,\n                    input: 'range',\n                    min: 0.1,\n                    max: 1,\n                    step: 0.05,\n                },\n            },\n        ];\n        return signals;\n    }\n    function colorBinCountSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorBinCount,\n            value: 7,\n            bind: {\n                name: specViewOptions.language.colorBinCount,\n                debounce,\n                input: 'range',\n                min: 1,\n                max: specViewOptions.maxLegends + 1,\n                step: 1,\n            },\n        };\n        return signal;\n    }\n    function colorReverseSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorReverse,\n            value: false,\n            bind: {\n                name: specViewOptions.language.colorReverse,\n                input: 'checkbox',\n            },\n        };\n        return signal;\n    }\n    function modifySignal(s, fn, update) {\n        s.update = `${fn}((${s.update}), (${update}))`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function legend(column, fill) {\n        const legend = {\n            orient: 'none',\n            title: column.name,\n            fill,\n            encode: {\n                symbols: {\n                    update: {\n                        shape: {\n                            value: 'square',\n                        },\n                    },\n                },\n            },\n        };\n        if (column.quantitative) {\n            legend.type = 'symbol';\n            legend.format = '~r';\n        }\n        return legend;\n    }\n    function getLegends(context, fill) {\n        const { specColumns, insight } = context;\n        if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n            return [legend(specColumns.color, fill)];\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function topLookup(column, count, source, legend, lookupName, fieldName, indexName) {\n        const data = [\n            {\n                name: lookupName,\n                source,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: [safeFieldName(column.name)],\n                    },\n                    {\n                        type: 'window',\n                        ops: ['count'],\n                        as: [indexName],\n                    },\n                    {\n                        type: 'filter',\n                        expr: `datum[${JSON.stringify(indexName)}] <= ${count}`,\n                    },\n                ],\n            },\n            {\n                name: legend,\n                source,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: lookupName,\n                        key: safeFieldName(column.name),\n                        fields: [column.name].map(safeFieldName),\n                        values: [column.name].map(safeFieldName),\n                        as: [fieldName],\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum[${JSON.stringify(fieldName)}] == null ? '${Other}' : datum[${JSON.stringify(fieldName)}]`,\n                        as: fieldName,\n                    },\n                ],\n            },\n        ];\n        return data;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addColor(props) {\n        const { colorReverseSignalName, dataName, scope, legendDataName, scaleName, specContext, topLookupName } = props;\n        let colorDataName = dataName;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const legends = getLegends(specContext, scaleName);\n        if (legends) {\n            scope.legends = legends;\n        }\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        if (categoricalColor) {\n            addData(scope, ...topLookup(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, FieldNames.TopColor, FieldNames.TopIndex));\n            colorDataName = legendDataName;\n        }\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                addScales(scope, binnableColorScale(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n            }\n            else {\n                addScales(scope, {\n                    name: scaleName,\n                    type: 'ordinal',\n                    domain: {\n                        data: colorDataName,\n                        field: FieldNames.TopColor,\n                        sort: true,\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone,\n                    },\n                    reverse: { signal: colorReverseSignalName },\n                });\n            }\n        }\n        addSignals(scope, colorBinCountSignal(specContext), colorReverseSignal(specContext));\n        return { topColorField: FieldNames.TopColor, colorDataName };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n        const titleSignal = `parent[${JSON.stringify(FieldNames.FacetTitle)}]`;\n        const index = `datum[${JSON.stringify(FieldNames.Ordinal)}] - 1`;\n        const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index);\n        const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index);\n        addMarks(globalScope, col.header, row.footer);\n        addMarks(col.header, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center',\n                    },\n                    baseline: {\n                        value: 'middle',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    x: {\n                        signal: `${sizeSignals.layoutWidth} / 2`,\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    text: {\n                        signal: titleSignal,\n                    },\n                },\n            },\n        });\n        addMarks(row.footer, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'left',\n                    },\n                    baseline: {\n                        value: 'middle',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    y: {\n                        signal: `${sizeSignals.layoutHeight} / 2`,\n                    },\n                    limit: {\n                        signal: SignalNames.PlotOffsetRight,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    text: {\n                        signal: titleSignal,\n                    },\n                },\n            },\n        });\n    }\n    function addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n        addMarks(scope, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center',\n                    },\n                    baseline: {\n                        value: 'bottom',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    x: {\n                        signal: `(${sizeSignals.layoutWidth}) / 2`,\n                    },\n                    text: {\n                        signal: `parent[${JSON.stringify(FieldNames.FacetTitle)}]`,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth,\n                    },\n                    y: {\n                        signal: `-${SignalNames.FacetPaddingTop} / 2`,\n                    },\n                },\n            },\n        });\n    }\n    function addFacetAxesGroupMarks(props) {\n        const { colSeqName, colTitleScale, globalScope, facetScope, plotScope, rowSeqName, rowTitleScale } = props;\n        const { sizeSignals } = facetScope;\n        const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n        const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n        const index = 'datum.data';\n        const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index);\n        const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index);\n        addData(globalScope, colSequence, rowSequence);\n        addMarks(globalScope, col.footer, row.header);\n        addScales(globalScope, colTitleScale, rowTitleScale);\n        const map = {\n            main: [\n                {\n                    scope: facetScope.facetScope,\n                    lines: true,\n                    labels: false,\n                    title: false,\n                },\n            ],\n            x: [\n                {\n                    scope: col.footer,\n                    lines: true,\n                    labels: true,\n                    title: false,\n                },\n                {\n                    scope: plotScope,\n                    scale: colTitleScale,\n                    lines: false,\n                    labels: false,\n                    title: true,\n                },\n            ],\n            y: [\n                {\n                    scope: row.header,\n                    lines: true,\n                    labels: true,\n                    title: false,\n                },\n                {\n                    scope: plotScope,\n                    scale: rowTitleScale,\n                    lines: false,\n                    labels: false,\n                    title: true,\n                },\n            ],\n        };\n        return map;\n    }\n    function facetRowHeaderFooter(data, sizeSignals, index) {\n        const rowFn = (xSignal) => {\n            return {\n                type: 'group',\n                from: { data },\n                encode: {\n                    update: {\n                        x: { signal: xSignal },\n                        y: {\n                            signal: `${SignalNames.PlotOffsetTop} + ${SignalNames.FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n                        },\n                        height: { signal: sizeSignals.layoutHeight },\n                    },\n                },\n            };\n        };\n        const header = rowFn(SignalNames.PlotOffsetLeft);\n        const footer = rowFn(`${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetRight} / 2`);\n        return { header, footer };\n    }\n    function facetColumnHeaderFooter(data, sizeSignals, index) {\n        const colFn = (ySignal) => {\n            return {\n                type: 'group',\n                from: { data },\n                encode: {\n                    update: {\n                        x: {\n                            signal: `(${index}) * (${sizeSignals.layoutWidth} + ${SignalNames.FacetPaddingLeft}) + ${SignalNames.FacetPaddingLeft} + ${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}`,\n                        },\n                        y: { signal: `${ySignal} - ${SignalNames.FacetAxesAdjustY}` },\n                        width: { signal: sizeSignals.layoutWidth },\n                    },\n                },\n            };\n        };\n        //create group marks based on data sequences\n        const header = colFn(`${SignalNames.PlotOffsetTop} / 2`);\n        const footer = colFn(`${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut}`);\n        return { header, footer };\n    }\n    function createSequence(dataName, countSignal) {\n        return {\n            name: dataName,\n            transform: [\n                {\n                    type: 'sequence',\n                    start: 0,\n                    stop: {\n                        signal: countSignal,\n                    },\n                },\n            ],\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function fill(context, colorFieldName, scale) {\n        const { specColumns, insight, specViewOptions } = context;\n        const colorColumn = specColumns.color;\n        return colorColumn ?\n            colorColumn.isColorData || insight.directColor ?\n                {\n                    field: safeFieldName(colorColumn.name),\n                }\n                :\n                    {\n                        scale,\n                        field: colorColumn.quantitative ? safeFieldName(colorColumn.name) : colorFieldName,\n                    }\n            :\n                {\n                    value: specViewOptions.colors.defaultCube,\n                };\n    }\n    function opacity(context) {\n        const result = {\n            signal: SignalNames.MarkOpacity,\n        };\n        return result;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class GlobalScope {\n        constructor(props) {\n            const { dataName, markGroup, scope, signals } = props;\n            this.scope = scope;\n            this._markGroup = markGroup;\n            this.signals = signals;\n            this.data = getDataByName(scope.data, dataName).data;\n            this._markDataName = dataName;\n            this.offsets = {\n                x: '0',\n                y: '0',\n                h: SignalNames.PlotHeightIn,\n                w: SignalNames.PlotWidthIn,\n            };\n            this.sizeSignals = {\n                layoutHeight: SignalNames.PlotHeightIn,\n                layoutWidth: SignalNames.PlotWidthIn,\n            };\n            this.zSize = SignalNames.PlotHeightIn;\n        }\n        get markDataName() {\n            return this._markDataName;\n        }\n        setMarkDataName(markDataName) {\n            this._markDataName = markDataName;\n        }\n        get markGroup() {\n            return this._markGroup;\n        }\n        setMarkGroup(markGroup) {\n            this._markGroup = markGroup;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Layout {\n        constructor(props) {\n            this.props = props;\n            this.id = props.id;\n        }\n        getGrouping() {\n            return null;\n        }\n        getAggregateSumOp() {\n            return null;\n        }\n        build() {\n            throw 'Not implemented';\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function testForCollapseSelection() {\n        return `datum.${FieldNames.Collapsed}`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class AggregateContainer extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const a = this.aggregation = this.getAggregation();\n            const p = this.prefix = `agg_${this.id}`;\n            this.names = {\n                barCount: `${p}_count`,\n                aggregateField: `${p}_aggregate_value`,\n                globalAggregateExtentSignal: `${p}_${a}_extent`,\n                scale: `scale_${p}`,\n                extentData: `data_${p}_extent`,\n                offsets: `data_${p}_offsets`,\n            };\n        }\n        getAggregateSumOp() {\n            if (this.aggregation === 'sum') {\n                const fieldOp = {\n                    field: safeFieldName(this.props.sumBy.name),\n                    op: 'sum',\n                    as: FieldNames.Sum,\n                };\n                return fieldOp;\n            }\n        }\n        build() {\n            const { aggregation, names, props } = this;\n            const { dock, globalScope, groupings, niceScale, parentScope, showAxes } = props;\n            addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal,\n            });\n            addSignals(globalScope.scope, {\n                name: props.globalAggregateMaxExtentSignal,\n                update: `${names.globalAggregateExtentSignal}[1]`,\n            });\n            const horizontal = dock === 'left';\n            const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n            const offsets = {\n                x: parentScope.offsets.x,\n                y: addOffsets(parentScope.offsets.y, dock === 'bottom' ?\n                    groupScaled\n                    :\n                        ''),\n                h: horizontal ?\n                    parentScope.offsets.h\n                    :\n                        dock === 'top'\n                            ? groupScaled\n                            : `${parentScope.offsets.h} - ${groupScaled}`,\n                w: horizontal ?\n                    groupScaled\n                    :\n                        parentScope.offsets.w,\n            };\n            const scale = {\n                type: 'linear',\n                name: names.scale,\n                domain: [\n                    0,\n                    {\n                        signal: props.globalAggregateMaxExtentSignal,\n                    },\n                ],\n                range: horizontal ?\n                    [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth,\n                        },\n                    ]\n                    :\n                        [\n                            {\n                                signal: parentScope.sizeSignals.layoutHeight,\n                            },\n                            0,\n                        ],\n                nice: niceScale,\n                zero: true,\n                reverse: dock === 'top',\n            };\n            const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n            addSignals(globalScope.scope, {\n                name: props.globalAggregateMaxExtentScaledSignal,\n                update: dock === 'bottom'\n                    ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}`\n                    : globalAggregateMaxExtentScaledValue,\n            });\n            return {\n                offsets,\n                sizeSignals: horizontal ?\n                    {\n                        layoutHeight: parentScope.sizeSignals.layoutHeight,\n                        layoutWidth: null,\n                    }\n                    :\n                        {\n                            layoutHeight: null,\n                            layoutWidth: parentScope.sizeSignals.layoutWidth,\n                        },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? [scale] : undefined,\n                        y: horizontal ? undefined : [scale],\n                    },\n                },\n                encodingRuleMap: horizontal ?\n                    {\n                        x: [{\n                                test: testForCollapseSelection(),\n                                signal: parentScope.offsets.x,\n                            }],\n                        width: [{\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            }],\n                    }\n                    :\n                        {\n                            y: [{\n                                    test: testForCollapseSelection(),\n                                    signal: dock === 'top'\n                                        ? parentScope.offsets.y\n                                        : addOffsets(parentScope.offsets.y, parentScope.offsets.h),\n                                }],\n                            height: [{\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                }],\n                        },\n            };\n        }\n        getTransforms(aggregation, groupby) {\n            const trans = {\n                type: 'joinaggregate',\n                groupby: groupby.map(safeFieldName),\n                ops: [aggregation],\n            };\n            if (aggregation === 'sum') {\n                trans.fields = [this.props.sumBy.name].map(safeFieldName);\n            }\n            return trans;\n        }\n        getAggregation() {\n            const { props } = this;\n            let s;\n            if (props.dock === 'left') {\n                s = props.axesScales.x;\n            }\n            else {\n                s = props.axesScales.y;\n            }\n            switch (s.aggregate) {\n                case 'sum':\n                    return 'sum';\n                default:\n                    return 'count';\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class AggregateSquare extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const a = this.props.aggregation;\n            const p = this.prefix = `agg_${this.id}`;\n            this.names = {\n                barCount: `${p}_count`,\n                aggregateField: `${p}_aggregate_value`,\n                globalAggregateExtentSignal: `${p}_${a}_extent`,\n                extentData: `data_${p}_extent`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { aggregation, globalScope, groupings, onBuild, parentScope } = props;\n            const { sizeSignals } = parentScope;\n            addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal,\n            });\n            const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n            const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n            const squareMaxArea = `(${[squareMaxSide, squareMaxSide].join(' * ')})`;\n            const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n            const squareArea = `(${[squareMaxArea, shrinkRatio].join(' * ')})`;\n            const squareSide = `sqrt(${squareArea})`;\n            const localAggregateMaxExtentScaled = squareSide;\n            onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n                y: addOffsets(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n                h: squareSide,\n                w: squareSide,\n            };\n            return {\n                offsets,\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                encodingRuleMap: {\n                    y: [{\n                            test: testForCollapseSelection(),\n                            signal: offsets.y,\n                        }],\n                    height: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                },\n            };\n        }\n        getTransforms(aggregation, groupby) {\n            const trans = {\n                type: 'joinaggregate',\n                groupby: groupby.map(safeFieldName),\n                ops: [aggregation],\n            };\n            if (aggregation === 'sum') {\n                trans.fields = [this.props.sumBy.name].map(safeFieldName);\n            }\n            return trans;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function dataExtent(column, signal) {\n        return {\n            type: 'extent',\n            field: safeFieldName(column.name),\n            signal,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function binnable(prefix, domainDataName, discreteColumn, outerSignalExtents) {\n        const { column, defaultBins, maxbins, maxbinsSignalDisplayName, maxbinsSignalName } = discreteColumn;\n        if (column.quantitative) {\n            const field = `${prefix}_bin_${exprSafeFieldName(column.name)}`;\n            const fieldEnd = `${field}_end`;\n            const binSignal = `${field}_bins`;\n            const dataExtentSignal = `${field}_bin_extent`;\n            const dataExtentSpanSignal = `${field}_bin_extent_span`;\n            const outerSignal = `${field}_outer_extent`;\n            domainDataName = `${field}_sequence`; //override the data name\n            const extentTransform = dataExtent(column, dataExtentSignal);\n            let imageSignal;\n            if (outerSignalExtents) {\n                imageSignal = outerExtentSignal(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n            }\n            const maxbinsSignal = {\n                name: maxbinsSignalName,\n                value: defaultBins,\n                bind: {\n                    name: maxbinsSignalDisplayName,\n                    debounce,\n                    input: 'range',\n                    min: 1,\n                    max: maxbins,\n                    step: 1,\n                },\n            };\n            const extentSignal = (imageSignal === null || imageSignal === void 0 ? void 0 : imageSignal.name) || dataExtentSignal;\n            const binTransform = {\n                type: 'bin',\n                field: safeFieldName(column.name),\n                as: [\n                    field,\n                    fieldEnd,\n                ],\n                signal: binSignal,\n                extent: {\n                    signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`, //add a tiny bit to the upper extent to force the extra bin - https://github.com/vega/vega/issues/2899\n                },\n                minstep: shouldBeIntegralBinStep(column) ? 1 : 0,\n                maxbins: {\n                    signal: maxbinsSignalName,\n                },\n            };\n            const dataSequence = {\n                name: domainDataName,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: `${binSignal}.start`,\n                        },\n                        stop: {\n                            signal: `${binSignal}.stop`,\n                        },\n                        step: {\n                            signal: `${binSignal}.step`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data',\n                        as: field,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data + ${binSignal}.step`,\n                        as: fieldEnd,\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number'],\n                        as: [FieldNames.Ordinal],\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data === ${binSignal}.start`,\n                        as: FieldNames.First,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                        as: FieldNames.Last,\n                    },\n                    {\n                        // when there is only one bin, use only first sequence element\n                        type: 'filter',\n                        expr: `${dataExtentSpanSignal} === 0 ? datum[${JSON.stringify(FieldNames.First)}] : true`,\n                    },\n                ],\n            };\n            const signals = [\n                maxbinsSignal,\n                {\n                    name: dataExtentSpanSignal,\n                    update: `${extentSignal}[1] - ${extentSignal}[0]`,\n                },\n            ];\n            if (imageSignal) {\n                signals.push(imageSignal);\n            }\n            const augmentBinnable = {\n                discreteColumn,\n                native: false,\n                transforms: [extentTransform, binTransform],\n                fields: [field, fieldEnd],\n                binSignal,\n                extentSignal,\n                dataSequence,\n                domainDataName,\n                signals,\n                fullScaleDataname: dataSequence.name,\n            };\n            return augmentBinnable;\n        }\n        else {\n            const nativeBinnable = {\n                discreteColumn,\n                native: true,\n                fields: [column.name],\n                domainDataName,\n                fullScaleDataname: domainDataName,\n            };\n            return nativeBinnable;\n        }\n    }\n    function outerExtentSignal(name, min, max, dataExtent) {\n        return {\n            name,\n            update: `[min(${min}, ${dataExtent}[0]), max(${max}, ${dataExtent}[1])]`,\n        };\n    }\n    function shouldBeIntegralBinStep(column) {\n        //prevent Vega from showing \".5\" steps between integer scale values\n        return column.quantitative && (column.type === 'integer' && (column.stats.max - column.stats.min) <= 7);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const bandScaleLinearSuffix = '_linear';\n    class Band extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `band_${this.id}`;\n            this.names = {\n                xScale: `scale_${p}_x`,\n                yScale: `scale_${p}_y`,\n                bandWidth: `${p}_bandwidth`,\n                accumulative: `${p}_accumulative`,\n            };\n            this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n        }\n        getGrouping() {\n            return this.bin.fields;\n        }\n        build() {\n            const { bin, names, props } = this;\n            const { globalScope, minBandWidth, orientation, parentScope, showAxes } = props;\n            const binField = bin.fields[0];\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n            }\n            //TODO don't add this, use existing dataset\n            addData(globalScope.scope, {\n                name: names.accumulative,\n                source: bin.fullScaleDataname,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: this.getGrouping().map(safeFieldName),\n                        ops: ['count'],\n                    },\n                ],\n            });\n            const horizontal = orientation === 'horizontal';\n            const minCellSignal = (horizontal) ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n            modifySignal(minCellSignal, 'max', `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n            addSignals(globalScope.scope, {\n                name: names.bandWidth,\n                update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`,\n            });\n            const scale = this.getScale(bin, horizontal);\n            if (props.outerSignalExtents && bin.native === false) {\n                //add a linear scale for use by background image\n                addScales(globalScope.scope, linearScale(scale.name + bandScaleLinearSuffix, { signal: bin.extentSignal }, scale.range, scale.reverse, false, false));\n            }\n            let encodingRuleMap;\n            if (!props.excludeEncodingRuleMap) {\n                encodingRuleMap = horizontal ?\n                    {\n                        x: [\n                            {\n                                test: testForCollapseSelection(),\n                                signal: parentScope.offsets.x,\n                            },\n                        ],\n                        width: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                        ],\n                    }\n                    :\n                        {\n                            y: [\n                                {\n                                    test: testForCollapseSelection(),\n                                    signal: addOffsets(parentScope.offsets.y, parentScope.offsets.h),\n                                },\n                            ],\n                            height: [\n                                {\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                },\n                            ],\n                        };\n            }\n            return {\n                offsets: this.getOffset(horizontal, binField),\n                sizeSignals: horizontal ?\n                    {\n                        layoutHeight: names.bandWidth,\n                        layoutWidth: parentScope.sizeSignals.layoutWidth,\n                    }\n                    :\n                        {\n                            layoutHeight: parentScope.sizeSignals.layoutHeight,\n                            layoutWidth: names.bandWidth,\n                        },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? undefined : [scale],\n                        y: horizontal ? [scale] : undefined,\n                    },\n                },\n                encodingRuleMap,\n            };\n        }\n        getOffset(horizontal, binField) {\n            const { names, props } = this;\n            const { parentScope } = props;\n            return {\n                x: addOffsets(parentScope.offsets.x, horizontal ?\n                    ''\n                    :\n                        `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n                y: addOffsets(parentScope.offsets.y, horizontal ?\n                    `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])`\n                    :\n                        ''),\n                h: horizontal ?\n                    names.bandWidth\n                    :\n                        parentScope.offsets.h,\n                w: horizontal ?\n                    parentScope.offsets.w\n                    :\n                        names.bandWidth,\n            };\n        }\n        getScale(bin, horizontal) {\n            const { names } = this;\n            const { parentScope } = this.props;\n            const binField = safeFieldName(bin.fields[0]);\n            let bandScale;\n            if (horizontal) {\n                bandScale = {\n                    type: 'band',\n                    name: names.yScale,\n                    range: [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutHeight,\n                        },\n                    ],\n                    padding: 0.1,\n                    domain: {\n                        data: bin.domainDataName,\n                        field: binField,\n                        sort: true,\n                    },\n                    reverse: true,\n                };\n            }\n            else {\n                bandScale = {\n                    type: 'band',\n                    name: names.xScale,\n                    range: [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth,\n                        },\n                    ],\n                    padding: 0.1,\n                    domain: {\n                        data: bin.domainDataName,\n                        field: binField,\n                        sort: true,\n                    },\n                };\n            }\n            return bandScale;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function displayBin(bin) {\n        const val = (index) => `datum[${JSON.stringify(bin.fields[index])}]`;\n        return bin.discreteColumn.column.quantitative ?\n            `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')`\n            :\n                val(0);\n    }\n    function obj(nameValues, clause) {\n        return `{${nameValues.join()}}`;\n    }\n    function serializeAsVegaExpression(bin, firstFieldName, lastFieldName, clause) {\n        if (bin.discreteColumn.column.quantitative) {\n            const low = [\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'>=\\'',\n                `value:datum[${JSON.stringify(bin.fields[0])}]`,\n            ];\n            const high = [\n                'clause:\\'&&\\'',\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'<\\'',\n                `value:datum[${JSON.stringify(bin.fields[1])}]`,\n            ];\n            return obj([\n                `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`,\n            ]);\n        }\n        else {\n            const exact = [\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'==\\'',\n                `value:datum[${JSON.stringify(bin.fields[0])}]`,\n            ];\n            return obj([\n                `expressions:[${obj(exact)}]`,\n            ]);\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function createOrdinals(source, prefix, binFields, sortOrder) {\n        const _binFields = binFields.map(safeFieldName);\n        const dataName = `${prefix}_bin_order`;\n        const data = {\n            name: dataName,\n            source,\n            transform: [\n                {\n                    type: 'aggregate',\n                    groupby: _binFields,\n                },\n                {\n                    type: 'collect',\n                    sort: {\n                        field: _binFields,\n                        order: _binFields.map(f => sortOrder),\n                    },\n                },\n                {\n                    type: 'window',\n                    ops: ['row_number'],\n                    as: [FieldNames.Ordinal],\n                },\n            ],\n        };\n        return {\n            data,\n            scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields),\n        };\n    }\n    function ordinalScale(dataName, scaleName, binFields) {\n        return {\n            type: 'ordinal',\n            name: scaleName,\n            domain: {\n                data: dataName,\n                field: safeFieldName(binFields[0]),\n            },\n            range: {\n                data: dataName,\n                field: FieldNames.Ordinal,\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Cross extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `cross_${this.id}`;\n            this.binX = binnable(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n            this.binY = binnable(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n            this.names = {\n                facetDataName: `data_${p}_facet`,\n                searchUnion: `data_${p}_search`,\n                dimScale: `scale_${p}`,\n                dimCount: `${p}_count`,\n                dimCategorical: `data_${p}_cat`,\n                dimCellSize: `${p}_cell_size`,\n                dimCellSizeCalc: `${p}_cell_calc`,\n            };\n        }\n        getGrouping() {\n            return this.binX.fields.concat(this.binY.fields);\n        }\n        build() {\n            const { binX, binY, names, prefix, props } = this;\n            const { axisTextColor, colRowTitles, globalScope, parentScope } = props;\n            const titles = { x: { dataName: null, quantitative: null }, y: { dataName: null, quantitative: null } };\n            const dx = {\n                dim: 'x',\n                bin: binX,\n                sortOrder: 'ascending',\n                size: parentScope.sizeSignals.layoutWidth,\n                layout: parentScope.sizeSignals.layoutWidth,\n                min: globalScope.signals.minCellWidth.name,\n                out: globalScope.signals.plotWidthOut,\n                offset: SignalNames.FacetPaddingLeft,\n                padding: SignalNames.FacetPaddingLeft,\n                dataOut: null,\n                scaleName: null,\n                position: null,\n            };\n            const dy = {\n                dim: 'y',\n                bin: binY,\n                sortOrder: 'ascending',\n                size: parentScope.sizeSignals.layoutHeight,\n                layout: parentScope.sizeSignals.layoutHeight,\n                min: globalScope.signals.minCellHeight.name,\n                out: globalScope.signals.plotHeightOut,\n                offset: SignalNames.FacetPaddingTop,\n                padding: `(${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n                dataOut: null,\n                scaleName: null,\n                position: null,\n            };\n            const dimensions = [dx, dy];\n            dimensions.forEach(d => {\n                const { bin, dim, padding, sortOrder } = d;\n                let data;\n                let dataName;\n                let countSignal;\n                let scale;\n                const titleSource = titles[dim];\n                if (bin.native === false) {\n                    addSignals(globalScope.scope, ...bin.signals);\n                    addTransforms(globalScope.data, ...bin.transforms);\n                    addData(globalScope.scope, bin.dataSequence);\n                    addTransforms(bin.dataSequence, {\n                        type: 'formula',\n                        expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                        as: FieldNames.Contains,\n                    });\n                    data = bin.dataSequence;\n                    dataName = bin.dataSequence.name;\n                    countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                    scale = ordinalScale(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                    titleSource.dataName = bin.dataSequence.name;\n                }\n                else {\n                    dataName = globalScope.markDataName;\n                    const ord = createOrdinals(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                    data = ord.data;\n                    addData(globalScope.scope, ord.data);\n                    countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                    scale = ord.scale;\n                    titleSource.dataName = ord.data.name;\n                }\n                titleSource.quantitative = bin.discreteColumn.column.quantitative;\n                d.dataOut = data;\n                d.scaleName = scale.name;\n                addTransforms(data, {\n                    type: 'formula',\n                    expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                    as: FieldNames.FacetSearch,\n                }, {\n                    type: 'formula',\n                    expr: displayBin(bin),\n                    as: FieldNames.FacetTitle,\n                });\n                addScales(globalScope.scope, scale);\n                const count = `${names.dimCount}_${dim}`;\n                const calc = `${names.dimCellSizeCalc}_${dim}`;\n                const size = `${names.dimCellSize}_${dim}`;\n                addSignals(globalScope.scope, { name: count, update: countSignal });\n                addSignals(globalScope.scope, {\n                    name: calc,\n                    update: `${d.layout} / ${count}`,\n                }, {\n                    name: size,\n                    update: `max(${d.min}, (${calc} - ${padding}))`,\n                });\n                modifySignal(d.out, 'max', `((${size} + ${padding}) * ${count})`);\n                d.position = this.dimensionOffset(d);\n            });\n            const groupRow = {\n                type: 'group',\n                encode: {\n                    update: {\n                        y: {\n                            signal: dy.position,\n                        },\n                    },\n                },\n                from: {\n                    data: dy.dataOut.name,\n                },\n                data: [\n                    {\n                        name: names.searchUnion,\n                        source: dx.dataOut.name,\n                        transform: [\n                            {\n                                type: 'formula',\n                                expr: `[datum[${JSON.stringify(FieldNames.FacetSearch)}], merge(parent[${JSON.stringify(FieldNames.FacetSearch)}], { clause: '&&'})]`,\n                                as: FieldNames.FacetSearch,\n                            },\n                        ],\n                    },\n                ],\n            };\n            const groupCol = {\n                style: 'cell',\n                name: prefix,\n                type: 'group',\n                encode: {\n                    update: {\n                        height: {\n                            signal: `${names.dimCellSize}_y`,\n                        },\n                        width: {\n                            signal: `${names.dimCellSize}_x`,\n                        },\n                        x: {\n                            signal: dx.position,\n                        },\n                    },\n                },\n                from: {\n                    data: names.searchUnion,\n                },\n            };\n            addMarks(globalScope.markGroup, groupRow);\n            addMarks(groupRow, groupCol);\n            const offsets = {\n                x: this.dimensionOffset(dx),\n                y: this.dimensionOffset(dy),\n                h: `${names.dimCellSize}_y`,\n                w: `${names.dimCellSize}_x`,\n            };\n            const sizeSignals = {\n                layoutHeight: `${names.dimCellSize}_y`,\n                layoutWidth: `${names.dimCellSize}_x`,\n                colCount: `${names.dimCount}_x`,\n                rowCount: `${names.dimCount}_y`,\n            };\n            if (colRowTitles) {\n                addFacetColRowTitles(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n            }\n            return {\n                facetScope: groupCol,\n                offsets,\n                sizeSignals,\n                titles,\n            };\n        }\n        dimensionOffset(d) {\n            const { names } = this;\n            return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Scatter extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `scatter_${this.id}`;\n            this.names = {\n                aggregateData: `data_${p}_aggregate`,\n                markData: `data_${p}_mark`,\n                xDataExtent: `${p}_xDataExtent`,\n                yDataExtent: `${p}_yDataExtent`,\n                xExtent: `${p}_xExtent`,\n                yExtent: `${p}_yExtent`,\n                sizeExtent: `${p}_sizeExtent`,\n                sizeRange: `${p}_sizeRange`,\n                sizeScale: `${p}_sizeScale`,\n                xScale: `scale_${p}_x`,\n                yScale: `scale_${p}_y`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { backgroundImageExtents, globalScope, parentScope, scatterPointScaleDisplay, showAxes, size, view, x, y, z, zGrounded } = props;\n            const qsize = size && size.quantitative && size;\n            addSignals(globalScope.scope, {\n                name: SignalNames.PointScale,\n                value: 5,\n                bind: {\n                    name: scatterPointScaleDisplay,\n                    debounce,\n                    input: 'range',\n                    min: 1,\n                    max: 10,\n                    step: 0.1,\n                },\n            }, {\n                name: SignalNames.ZGrounded,\n                value: false,\n                bind: {\n                    name: zGrounded,\n                    input: 'checkbox',\n                },\n            });\n            if (backgroundImageExtents) {\n                addTransforms(globalScope.data, dataExtent(x, names.xDataExtent), dataExtent(y, names.yDataExtent));\n                const xSignal = outerExtentSignal(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n                const ySignal = outerExtentSignal(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n                addSignals(globalScope.scope, xSignal, ySignal);\n            }\n            if (qsize) {\n                addTransforms(globalScope.data, {\n                    type: 'extent',\n                    field: safeFieldName(qsize.name),\n                    signal: names.sizeExtent,\n                });\n                addScales(globalScope.scope, {\n                    name: names.sizeScale,\n                    type: 'pow',\n                    exponent: 0.5,\n                    domain: [0, { signal: `${names.sizeExtent}[1]` }],\n                    range: [0, { signal: names.sizeRange }],\n                });\n                addSignals(globalScope.scope, {\n                    name: names.sizeRange,\n                    update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${scatterSizedDiv}`,\n                });\n            }\n            addData(globalScope.scope, {\n                name: names.markData,\n                source: globalScope.markDataName,\n                transform: [x, y, z].map(c => {\n                    if (!c || !c.quantitative)\n                        return;\n                    const t = {\n                        type: 'filter',\n                        expr: `isValid(datum[${JSON.stringify(c.name)}])`,\n                    };\n                    return t;\n                }).filter(Boolean),\n            });\n            globalScope.setMarkDataName(names.markData);\n            const globalScales = { showAxes, scales: {} };\n            const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n            const sizeValueSignal = qsize ?\n                `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${SignalNames.PointScale}`\n                : SignalNames.PointScale;\n            const update = Object.assign({ height: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: sizeValueSignal,\n                    },\n                ], width: {\n                    signal: sizeValueSignal,\n                } }, z && {\n                z: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`,\n                    },\n                ],\n                zindex: [\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`,\n                    },\n                ],\n                depth: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: view === '3d'\n                            ? `${SignalNames.ZGrounded} ? ${zValue} : ${sizeValueSignal}`\n                            : '0',\n                    },\n                ],\n            });\n            const columnSignals = [\n                {\n                    column: x,\n                    xyz: 'x',\n                    scaleName: names.xScale,\n                    domain: backgroundImageExtents ?\n                        {\n                            signal: names.xExtent,\n                        }\n                        :\n                            {\n                                data: globalScope.data.name,\n                                field: safeFieldName(x.name),\n                            },\n                    reverse: false,\n                    signal: parentScope.sizeSignals.layoutWidth,\n                },\n                {\n                    column: y,\n                    xyz: 'y',\n                    scaleName: names.yScale,\n                    domain: backgroundImageExtents ?\n                        {\n                            signal: names.yExtent,\n                        }\n                        :\n                            {\n                                data: globalScope.data.name,\n                                field: safeFieldName(y.name),\n                            },\n                    reverse: true,\n                    signal: parentScope.sizeSignals.layoutHeight,\n                },\n                {\n                    column: z,\n                    xyz: 'z',\n                    scaleName: names.zScale,\n                    domain: {\n                        data: globalScope.data.name,\n                        field: z ? safeFieldName(z.name) : null,\n                    },\n                    reverse: false,\n                    signal: view === '3d'\n                        ? `(${globalScope.zSize}) * ${SignalNames.ZProportion}`\n                        : `10 * ${SignalNames.ZProportion}`,\n                },\n            ];\n            columnSignals.forEach(cs => {\n                const { column, domain, reverse, scaleName, signal, xyz } = cs;\n                if (!column)\n                    return;\n                let scale;\n                if (column.quantitative) {\n                    scale = linearScale(scaleName, domain, [0, { signal }], reverse, false, showAxes);\n                    if (shouldBeIntegralBinStep(column)) {\n                        scale.bins = { step: 1 };\n                    }\n                }\n                else {\n                    scale = pointScale(scaleName, globalScope.data.name, [0, { signal }], column.name, reverse);\n                }\n                globalScales.scales[xyz] = [scale];\n            });\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: globalScope.markDataName },\n                encode: { update },\n            };\n            addMarks(globalScope.markGroup, mark);\n            return {\n                offsets: {\n                    x: addOffsets(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                    y: addOffsets(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                    h: sizeValueSignal,\n                    w: sizeValueSignal,\n                },\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                globalScales,\n                mark,\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: addOffsets(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight),\n                        },\n                    ],\n                },\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addZScale(z, zSize, dataName, zScaleName) {\n        if (z) {\n            const zRange = [0, { signal: `(${zSize}) * ${SignalNames.ZProportion}` }];\n            const scale = z.quantitative\n                ?\n                    linearScale(zScaleName, {\n                        data: dataName,\n                        field: safeFieldName(z.name),\n                    }, zRange, false, true)\n                :\n                    pointScale(zScaleName, dataName, zRange, z.name, false);\n            return scale;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Square extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `square_${this.id}`;\n            this.names = {\n                bandWidth: this.getBandWidth(),\n                maxGroupField: `${p}_max_group`,\n                maxGroupSignal: `${p}_max_grouping`,\n                stack0: `${p}_stack0`,\n                stack1: `${p}_stack1`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { fillDirection, globalScope, groupings, parentScope, collapseYHeight, showAxes, sortBy, view, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            addTransforms(globalScope.data, Object.assign({ type: 'stack', groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sortBy && {\n                sort: {\n                    field: safeFieldName(sortBy.name),\n                    order: 'ascending',\n                },\n            }));\n            const { gap, levelSize, size, squaresPerBand } = this.addSignals();\n            const heightSignal = {\n                signal: fillDirection === 'down-right' ? size : levelSize,\n            };\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: {\n                    data: globalScope.markDataName,\n                },\n                encode: {\n                    update: Object.assign({ height: collapseYHeight ?\n                            [\n                                {\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                },\n                                heightSignal,\n                            ]\n                            :\n                                heightSignal, width: {\n                            signal: fillDirection === 'down-right' ? levelSize : size,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            const { tx, ty } = this.transformXY(gap, levelSize, squaresPerBand);\n            return Object.assign(Object.assign(Object.assign({}, z && {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n            }), { offsets: {\n                    x: addOffsets(parentScope.offsets.x, tx.expr),\n                    y: addOffsets(parentScope.offsets.y, ty.expr),\n                    h: size,\n                    w: size,\n                }, mark, sizeSignals: {\n                    layoutHeight: size,\n                    layoutWidth: size,\n                } }), collapseYHeight && {\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y,\n                        },\n                    ],\n                },\n            });\n        }\n        getBandWidth() {\n            const { offsets } = this.props.parentScope;\n            switch (this.props.fillDirection) {\n                case 'down-right':\n                    return offsets.h;\n                default:\n                    return offsets.w;\n            }\n        }\n        addSignals() {\n            const { names, props } = this;\n            const { fillDirection, globalScope, groupings, parentScope } = props;\n            let { maxGroupedFillSize, maxGroupedUnits } = props;\n            if (!maxGroupedUnits) {\n                if (groupings) {\n                    addTransforms(globalScope.data, {\n                        type: 'joinaggregate',\n                        groupby: getGroupBy(groupings).map(safeFieldName),\n                        ops: ['count'],\n                        as: [names.maxGroupField],\n                    }, {\n                        type: 'extent',\n                        field: names.maxGroupField,\n                        signal: names.maxGroupSignal,\n                    });\n                    maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n                }\n                else {\n                    maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n                }\n            }\n            if (!maxGroupedFillSize) {\n                maxGroupedFillSize = fillDirection === 'down-right' ? parentScope.offsets.w : parentScope.offsets.h;\n            }\n            const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n            const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n            const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n            const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n            const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n            const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n            return { gap, levelSize, size, squaresPerBand };\n        }\n        transformXY(gap, levelSize, squaresPerBand) {\n            const { names, prefix } = this;\n            const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n            const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n            const { fillDirection, parentScope } = this.props;\n            const tx = {\n                type: 'formula',\n                expr: null,\n                as: `${prefix}_${FieldNames.OffsetX}`,\n            };\n            const ty = {\n                type: 'formula',\n                expr: null,\n                as: `${prefix}_${FieldNames.OffsetY}`,\n            };\n            switch (fillDirection) {\n                case 'down-right': {\n                    tx.expr = `${level} * (${levelSize} + ${gap})`;\n                    ty.expr = compartment;\n                    break;\n                }\n                case 'right-up': {\n                    tx.expr = compartment;\n                    ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                    break;\n                }\n                case 'right-down':\n                default: {\n                    tx.expr = compartment;\n                    ty.expr = `${level} * (${levelSize} + ${gap})`;\n                    break;\n                }\n            }\n            return { tx, ty };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Stack extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `stack_${this.id}`;\n            this.names = {\n                cube: `${p}_cube`,\n                globalDataName: `data_${p}_count`,\n                globalExtent: `${p}_global_extent`,\n                levelDataName: `data_${p}_level`,\n                count: `${p}_count`,\n                stack0: `${p}_stack0`,\n                stack1: `${p}_stack1`,\n                sequence: `data_${p}_sequence`,\n                sides: `${p}_sides`,\n                size: `${p}_size`,\n                squared: `${p}_squared`,\n                maxCount: `${p}_maxCount`,\n                maxLevels: `${p}_maxLevels`,\n                zScale: `${p}_zScale`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { globalScope, groupings, parentScope, showAxes, sort } = props;\n            const { sizeSignals } = parentScope;\n            addTransforms(globalScope.data, {\n                type: 'joinaggregate',\n                groupby: getGroupBy(groupings).map(safeFieldName),\n                ops: ['count'],\n                as: [names.count],\n            }, {\n                type: 'extent',\n                field: names.count,\n                signal: names.globalExtent,\n            }, Object.assign({ type: 'stack', groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sort && {\n                sort: {\n                    field: safeFieldName(sort.name),\n                    order: 'ascending',\n                },\n            }));\n            addData(globalScope.scope, {\n                name: names.sequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `sqrt(${names.globalExtent}[1])`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data * datum.data',\n                        as: 'squared',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                        as: 'maxlevels',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                        as: 'side',\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.side * datum.maxlevels + datum.maxlevels - 1',\n                        as: 'sidecubeheight',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                        as: 'heightmatch',\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: 'heightmatch',\n                            order: 'ascending',\n                        },\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number'],\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.row_number === 1',\n                    },\n                ],\n            });\n            addSignals(globalScope.scope, {\n                name: names.size,\n                update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`,\n            }, {\n                name: names.squared,\n                update: `data('${names.sequence}')[0].squared`,\n            }, {\n                name: names.sides,\n                update: `sqrt(${names.squared})`,\n            }, {\n                name: names.cube,\n                update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`,\n            }, {\n                name: names.maxLevels,\n                update: `data('${names.sequence}')[0].maxlevels`,\n            }, {\n                name: names.maxCount,\n                update: `${names.maxLevels} * ${names.squared}`,\n            });\n            const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n            const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n            const cubeX = `(${layerOrdinal} % ${names.sides})`;\n            const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n            const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n            const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n                y: addOffsets(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n                h: names.size,\n                w: names.size,\n            };\n            const mark = {\n                type: 'rect',\n                from: { data: this.names.levelDataName },\n                encode: {\n                    update: {\n                        z: {\n                            signal: `${zLevel} * (${names.cube} + 1)`,\n                        },\n                        height: {\n                            signal: names.cube,\n                        },\n                        width: {\n                            signal: names.cube,\n                        },\n                        depth: {\n                            signal: names.cube,\n                        },\n                    },\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            const zScale = {\n                type: 'linear',\n                name: names.zScale,\n                domain: [\n                    0,\n                    {\n                        signal: names.maxCount,\n                    },\n                ],\n                range: [\n                    0,\n                    {\n                        signal: `${names.maxLevels} * (${names.cube} + 1) - 1`,\n                    },\n                ],\n                nice: false,\n            };\n            return {\n                offsets,\n                mark,\n                sizeSignals: {\n                    layoutHeight: names.size,\n                    layoutWidth: names.size,\n                },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n                encodingRuleMap: {\n                    y: [{\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y,\n                        }],\n                    z: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                    depth: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                    height: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                },\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Strip extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `strip_${this.id}`;\n            this.names = {\n                firstField: `${p}${FieldNames.First}`,\n                lastField: `${p}${FieldNames.Last}`,\n                valueField: `${p}${FieldNames.Value}`,\n                scale: `scale_${p}`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { addPercentageScale, globalScope, groupings, orientation, showAxes, size, sort, sortOrder, parentScope, view, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            const horizontal = orientation === 'horizontal';\n            const transform = [];\n            if (sort) {\n                transform.push({\n                    type: 'collect',\n                    sort: {\n                        field: safeFieldName(sort.name),\n                        order: sortOrder,\n                    },\n                });\n            }\n            let stackField;\n            if (size) {\n                stackField = size.name;\n                transform.push({\n                    type: 'filter',\n                    expr: `datum[${JSON.stringify(size.name)}] > 0`,\n                });\n            }\n            else {\n                stackField = names.valueField;\n                transform.push({\n                    type: 'formula',\n                    expr: '1',\n                    as: stackField,\n                });\n            }\n            const stackTransform = {\n                type: 'stack',\n                field: safeFieldName(stackField),\n                offset: 'normalize',\n                as: [names.firstField, names.lastField],\n            };\n            if (groupings.length) {\n                stackTransform.groupby = getGroupBy(groupings).map(safeFieldName);\n            }\n            transform.push(stackTransform);\n            addTransforms(globalScope.data, ...transform);\n            const span = [names.lastField, names.firstField].map(f => `datum[${JSON.stringify(f)}]`).join(' - ');\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, horizontal ?\n                    `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})`\n                    :\n                        ''),\n                y: addOffsets(parentScope.offsets.y, horizontal ?\n                    ''\n                    :\n                        `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n                h: horizontal\n                    ? parentScope.offsets.h\n                    : `(${span}) * (${parentScope.offsets.h})`,\n                w: horizontal\n                    ? `(${span}) * (${parentScope.offsets.w})`\n                    : parentScope.offsets.w,\n            };\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: globalScope.markDataName },\n                encode: {\n                    update: Object.assign({ height: {\n                            signal: offsets.h,\n                        }, width: {\n                            signal: offsets.w,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            let percentageScale;\n            if (addPercentageScale) {\n                percentageScale = [{\n                        type: 'linear',\n                        name: names.scale,\n                        domain: [0, 100],\n                        range: horizontal ?\n                            [\n                                0,\n                                {\n                                    signal: parentScope.sizeSignals.layoutWidth,\n                                },\n                            ]\n                            :\n                                [\n                                    {\n                                        signal: parentScope.sizeSignals.layoutHeight,\n                                    },\n                                    0,\n                                ],\n                    }];\n            }\n            return {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? percentageScale : undefined,\n                        y: horizontal ? undefined : percentageScale,\n                        z: zScale && [zScale],\n                    },\n                },\n                offsets,\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                mark,\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Treemap extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `treemap_${this.id}`;\n            this.names = {\n                dataName: `data_${p}`,\n                dataHeightWidth: `data_${p}_hw`,\n                dataExtents: `data_${p}_extents`,\n                dataFacet: `data_${p}_facet`,\n                dataFacetMark: `data_${p}_facetMark`,\n                fieldChildren: `${p}_children`,\n                fieldDepth: `${p}_depth`,\n                fieldX0: `${p}_x0`,\n                fieldX1: `${p}_x1`,\n                fieldY0: `${p}_y0`,\n                fieldY1: `${p}_y1`,\n                fieldHeight: `${p}_h`,\n                fieldWidth: `${p}_w`,\n                heightExtent: `${p}_heightExtent`,\n                widthExtent: `${p}_widthExtent`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { globalScope, parentScope, showAxes, treeMapMethod, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, fn(names.fieldX0)),\n                y: addOffsets(parentScope.offsets.y, fn(names.fieldY0)),\n                h: subtract(names.fieldY1, names.fieldY0),\n                w: subtract(names.fieldX1, names.fieldX0),\n            };\n            const mark = this.transformedMark(offsets);\n            addSignals(globalScope.scope, {\n                name: SignalNames.TreeMapMethod,\n                value: 'squarify',\n                bind: {\n                    name: treeMapMethod,\n                    input: 'select',\n                    options: [\n                        'squarify', 'binary',\n                    ],\n                },\n            });\n            return Object.assign(Object.assign({}, z && {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n            }), { mark,\n                offsets, sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                } });\n        }\n        transformedMark(offsets) {\n            const { names, props } = this;\n            const { globalScope, groupings, parentScope } = props;\n            if (groupings.length) {\n                //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n                addData(globalScope.scope, {\n                    name: names.dataHeightWidth,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.h,\n                            as: names.fieldHeight,\n                        },\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.w,\n                            as: names.fieldWidth,\n                        },\n                    ],\n                });\n                const treemapData = {\n                    name: names.dataFacetMark,\n                    source: names.dataFacet,\n                };\n                const facets = {\n                    type: 'group',\n                    from: {\n                        facet: {\n                            name: names.dataFacet,\n                            data: names.dataHeightWidth,\n                            groupby: getGroupBy(groupings).map(safeFieldName),\n                        },\n                    },\n                    data: [\n                        {\n                            name: names.dataExtents,\n                            source: names.dataFacet,\n                            transform: [\n                                {\n                                    type: 'extent',\n                                    field: names.fieldHeight,\n                                    signal: names.heightExtent,\n                                },\n                                {\n                                    type: 'extent',\n                                    field: names.fieldWidth,\n                                    signal: names.widthExtent,\n                                },\n                            ],\n                        },\n                        treemapData,\n                    ],\n                };\n                globalScope.setMarkDataName(names.dataFacetMark);\n                addMarks(globalScope.markGroup, facets);\n                //assign new markgroup after adding mark to original group\n                globalScope.setMarkGroup(facets);\n                this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n                return this.addMark(offsets, facets, globalScope.markDataName);\n            }\n            else {\n                this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n                return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n            }\n        }\n        addMark(offsets, markParent, markDataName) {\n            const { names, prefix, props } = this;\n            const { view, z } = props;\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: markDataName },\n                encode: {\n                    update: Object.assign({ width: {\n                            signal: offsets.w,\n                        }, height: {\n                            signal: offsets.h,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(markParent, mark);\n            return mark;\n        }\n        treemapTransform(treemapData, widthSignal, heightSignal) {\n            const { names, props } = this;\n            const { group, size } = props;\n            addTransforms(treemapData, {\n                type: 'filter',\n                expr: `datum[${JSON.stringify(size.name)}] > 0`,\n            }, {\n                type: 'nest',\n                keys: [(group && group.name) || '__NONE__'],\n            }, {\n                type: 'treemap',\n                field: safeFieldName(size.name),\n                sort: { field: 'value', order: 'descending' },\n                round: true,\n                method: { signal: SignalNames.TreeMapMethod },\n                paddingInner: 1,\n                paddingOuter: 0,\n                size: [\n                    { signal: widthSignal },\n                    { signal: heightSignal },\n                ],\n                as: [\n                    names.fieldX0,\n                    names.fieldY0,\n                    names.fieldX1,\n                    names.fieldY1,\n                    names.fieldDepth,\n                    names.fieldChildren,\n                ],\n            });\n        }\n    }\n    function fn(n) {\n        return `datum[${JSON.stringify(n)}]`;\n    }\n    function subtract(...fields) {\n        return fields.map(n => fn(n)).join(' - ');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Wrap extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `wrap_${this.id}`;\n            this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n            this.names = {\n                outputData: `data_${p}_out`,\n                rowColumnDataName: `data_${p}_row_col`,\n                cellHeight: `${p}_cellHeight`,\n                cellWidth: `${p}_cellWidth`,\n                fits: `${p}_fits`,\n                target: `${p}_target`,\n                minArea: `${p}_minArea`,\n                aspect: `${p}_aspect`,\n                minAspect: `${p}_minAspect`,\n                idealAspect: `${p}_idealAspect`,\n                dataLength: `${p}_dataLength`,\n                rxc0: `${p}_rxc0`,\n                rxc1: `${p}_rxc1`,\n                rxc2: `${p}_rxc2`,\n                rxc: `${p}_rxc`,\n                growColCount: `${p}_growColCount`,\n                growCellWidth: `${p}_growCellWidth`,\n                fitsArea: `${p}_fitsArea`,\n                colCount: `${p}_colCount`,\n            };\n        }\n        getGrouping() {\n            return this.bin.fields;\n        }\n        build() {\n            const { bin, names, prefix, props } = this;\n            const { axisTextColor, cellTitles, globalScope, parentScope } = props;\n            let ordinalBinData;\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n                addTransforms(bin.dataSequence, {\n                    type: 'formula',\n                    expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                    as: FieldNames.Contains,\n                });\n                ordinalBinData = bin.dataSequence.name;\n            }\n            else {\n                const ord = createOrdinals(globalScope.data.name, prefix, bin.fields, 'ascending');\n                addData(globalScope.scope, ord.data);\n                ordinalBinData = ord.data.name;\n            }\n            addData(globalScope.scope, {\n                name: names.rxc0,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `ceil(sqrt(${names.dataLength})) + 1`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.data)`,\n                        as: 'complement',\n                    },\n                ],\n            }, {\n                name: names.rxc1,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['data'],\n                        as: ['cols'],\n                    },\n                ],\n            }, {\n                name: names.rxc2,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['complement'],\n                        as: ['cols'],\n                    },\n                ],\n            }, {\n                name: names.rxc,\n                source: [names.rxc1, names.rxc2],\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.cols)`,\n                        as: 'rows',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                        as: 'cellw',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.cols === 1 ? max(datum.cellw, ${SignalNames.MinCellWidth}) : datum.cellw`,\n                        as: 'cellw',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                        as: 'cellh',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.rows === 1 ? max(datum.cellh, ${SignalNames.MinCellHeight}) : datum.cellh`,\n                        as: 'cellh',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum.cellw >= ${SignalNames.MinCellWidth} && datum.cellh >= ${SignalNames.MinCellHeight})`,\n                        as: 'meetsmin',\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.meetsmin',\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.cellw / datum.cellh',\n                        as: names.aspect,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(datum.${names.aspect} - ${names.target})`,\n                        as: names.idealAspect,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                        as: 'coverage',\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: [names.idealAspect, 'coverage'],\n                            order: ['ascending', 'descending'],\n                        },\n                    },\n                ],\n            }, {\n                name: names.rowColumnDataName,\n                source: ordinalBinData,\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `floor((datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) / ${names.colCount})`,\n                        as: FieldNames.WrapRow,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) % ${names.colCount}`,\n                        as: FieldNames.WrapCol,\n                    },\n                    {\n                        type: 'formula',\n                        expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                        as: FieldNames.FacetSearch,\n                    },\n                    {\n                        type: 'formula',\n                        expr: displayBin(bin),\n                        as: FieldNames.FacetTitle,\n                    },\n                ],\n            });\n            const dataOut = {\n                name: names.outputData,\n                source: globalScope.data.name,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: names.rowColumnDataName,\n                        key: safeFieldName(bin.fields[0]),\n                        fields: [bin.fields[0]].map(safeFieldName),\n                        values: [FieldNames.WrapRow, FieldNames.WrapCol],\n                    },\n                ],\n            };\n            addData(globalScope.scope, dataOut);\n            globalScope.setMarkDataName(names.outputData);\n            addSignals(globalScope.scope, {\n                name: names.minAspect,\n                update: `${SignalNames.MinCellWidth} / ${SignalNames.MinCellHeight}`,\n            }, {\n                name: names.target,\n                update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`,\n            }, {\n                name: names.minArea,\n                update: `${SignalNames.MinCellWidth}*${SignalNames.MinCellHeight}`,\n            }, {\n                name: names.aspect,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`,\n            }, {\n                name: names.dataLength,\n                update: `data(${JSON.stringify(ordinalBinData)}).length`,\n            }, {\n                name: names.growColCount,\n                update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${SignalNames.MinCellWidth}), 1)`,\n            }, {\n                name: names.growCellWidth,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`,\n            }, {\n                name: names.fitsArea,\n                update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`,\n            }, {\n                name: names.fits,\n                update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`,\n            }, {\n                name: names.colCount,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`,\n            }, {\n                name: names.cellWidth,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`,\n            }, {\n                name: names.cellHeight,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${SignalNames.MinCellHeight}`,\n            });\n            modifySignal(globalScope.signals.plotHeightOut, 'max', `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n            modifySignal(globalScope.signals.plotWidthOut, 'max', `(${names.cellWidth} * ${names.colCount})`);\n            const signalH = [names.cellHeight, SignalNames.FacetPaddingTop, SignalNames.FacetPaddingBottom].join(' - ');\n            const signalW = [names.cellWidth, SignalNames.FacetPaddingLeft].join(' - ');\n            const signalX = addOffsets(parentScope.offsets.x, `datum[${JSON.stringify(FieldNames.WrapCol)}] * ${names.cellWidth}`, SignalNames.FacetPaddingLeft);\n            const signalY = addOffsets(parentScope.offsets.y, `datum[${JSON.stringify(FieldNames.WrapRow)}] * ${names.cellHeight}`, SignalNames.FacetPaddingTop);\n            const update = {\n                height: {\n                    signal: signalH,\n                },\n                width: {\n                    signal: signalW,\n                },\n                x: {\n                    signal: signalX,\n                },\n                y: {\n                    signal: signalY,\n                },\n            };\n            const offsets = {\n                x: signalX,\n                y: signalY,\n                h: signalH,\n                w: signalW,\n            };\n            const group = {\n                style: 'cell',\n                name: prefix,\n                type: 'group',\n                from: {\n                    data: names.rowColumnDataName,\n                },\n                encode: { update },\n            };\n            addMarks(globalScope.markGroup, group);\n            const sizeSignals = {\n                layoutHeight: `(${names.cellHeight} - ${SignalNames.FacetPaddingTop} - ${SignalNames.FacetPaddingBottom})`,\n                layoutWidth: `(${names.cellWidth} - ${SignalNames.FacetPaddingLeft})`,\n                colCount: names.colCount,\n                rowCount: `ceil(${names.dataLength} / ${names.colCount})`,\n            };\n            if (cellTitles) {\n                addFacetCellTitles(group, sizeSignals, axisTextColor);\n            }\n            return {\n                facetScope: group,\n                sizeSignals,\n                offsets,\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const layoutClasses = {\n        AggregateContainer,\n        AggregateSquare,\n        Band,\n        Cross,\n        Scatter,\n        Square,\n        Stack,\n        Strip,\n        Treemap,\n        Wrap,\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getImageMark(backgroundImage, allGlobalScales) {\n        const xScale = allGlobalScales.filter(s => s.scales.x)[0].scales.x[0];\n        const yScale = allGlobalScales.filter(s => s.scales.y)[0].scales.y[0];\n        const [xScaleName, yScaleName] = [xScale, yScale].map(s => s.name + (xScale.type === 'band' ? bandScaleLinearSuffix : ''));\n        return {\n            type: 'image',\n            encode: {\n                update: {\n                    url: {\n                        value: backgroundImage.url,\n                    },\n                    aspect: {\n                        value: false,\n                    },\n                    baseline: {\n                        value: 'bottom',\n                    },\n                    height: {\n                        signal: getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top),\n                    },\n                    y: {\n                        signal: getScaledValue(yScaleName, backgroundImage.extents.bottom),\n                    },\n                    width: {\n                        signal: getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left),\n                    },\n                    x: {\n                        signal: getScaledValue(xScaleName, backgroundImage.extents.left),\n                    },\n                },\n            },\n        };\n    }\n    function getScaledSpan(scaleName, low, high) {\n        return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n    }\n    function getScaledValue(scaleName, value) {\n        return `scale('${scaleName}', ${value})`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class SpecBuilder {\n        constructor(props, specContext) {\n            this.props = props;\n            this.specContext = specContext;\n            this.globalSignals = {\n                facetAxesAdjustX: { name: SignalNames.FacetAxesAdjustX, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingLeft.toString() : '0' },\n                facetAxesAdjustY: { name: SignalNames.FacetAxesAdjustY, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingBottom.toString() : '0' },\n                minCellWidth: {\n                    name: SignalNames.MinCellWidth,\n                    update: `${minFacetWidth}`,\n                },\n                minCellHeight: { name: SignalNames.MinCellHeight, update: `${minFacetHeight}` },\n                plotOffsetLeft: { name: SignalNames.PlotOffsetLeft, update: '0' },\n                plotOffsetTop: { name: SignalNames.PlotOffsetTop, update: '0' },\n                plotOffsetBottom: { name: SignalNames.PlotOffsetBottom, update: '0' },\n                plotOffsetRight: { name: SignalNames.PlotOffsetRight, update: '0' },\n                plotHeightOut: { name: SignalNames.PlotHeightOut, update: SignalNames.PlotHeightIn },\n                plotWidthOut: { name: SignalNames.PlotWidthOut, update: SignalNames.PlotWidthIn },\n            };\n        }\n        validate() {\n            const { specContext } = this;\n            const { specCapabilities } = this.props;\n            const { roles } = specCapabilities;\n            const required = roles.filter(r => {\n                switch (typeof r.allowNone) {\n                    case 'boolean':\n                        return !r.allowNone;\n                    case 'undefined':\n                        return true;\n                    case 'function':\n                        return !r.allowNone(specContext);\n                }\n            });\n            const numeric = roles.filter(r => r.excludeCategoric);\n            const errors = required\n                .map(r => {\n                if (specContext.specColumns[r.role]) {\n                    return null;\n                }\n                else {\n                    return `Field ${r.role} is required.`;\n                }\n            })\n                .concat(numeric.map(r => {\n                if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) {\n                    return `Field ${r.role} must be quantitative.`;\n                }\n                else {\n                    return null;\n                }\n            }))\n                .filter(Boolean);\n            const { backgroundImage } = specContext.insight;\n            if (backgroundImage && !backgroundImage.extents) {\n                errors.push('BackgroundImage must have extents.');\n            }\n            return errors;\n        }\n        build() {\n            var _a, _b;\n            const { globalSignals, specContext } = this;\n            const { facetLayout, specCapabilities } = this.props;\n            const { insight, specColumns, specViewOptions } = specContext;\n            const dataName = 'data_source';\n            const { vegaSpec, groupMark } = this.initSpec(dataName);\n            const { topColorField, colorDataName } = addColor({\n                scope: vegaSpec,\n                dataName,\n                specContext,\n                scaleName: ScaleNames.Color,\n                legendDataName: 'data_legend',\n                topLookupName: 'data_topcolorlookup',\n                colorReverseSignalName: SignalNames.ColorReverse,\n            });\n            const globalScope = new GlobalScope({\n                dataName: colorDataName,\n                markGroup: groupMark,\n                scope: vegaSpec,\n                signals: globalSignals,\n            });\n            if (facetLayout) {\n                addSignals(vegaSpec, {\n                    name: SignalNames.FacetPaddingBottom,\n                    update: `${facetLayout.facetPadding.bottom}`,\n                }, {\n                    name: SignalNames.FacetPaddingLeft,\n                    update: `${facetLayout.facetPadding.left}`,\n                }, {\n                    name: SignalNames.FacetPaddingTop,\n                    update: `${facetLayout.facetPadding.top}`,\n                });\n                globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n                globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n            }\n            const { firstScope, finalScope, specResult, allGlobalScales, allEncodingRules, } = this.iterateLayouts(globalScope, (i, innerScope) => {\n                if (facetLayout && i === 0) {\n                    globalScope.zSize = innerScope.offsets.h;\n                }\n            });\n            if (specResult) {\n                return specResult;\n            }\n            if (allGlobalScales.length > 0) {\n                const plotHeightOut = globalSignals.plotHeightOut.name;\n                const plotWidthOut = globalSignals.plotWidthOut.name;\n                const colTitleScale = {\n                    type: 'linear',\n                    name: 'scale_facet_col_title',\n                    domain: [0, 1],\n                    range: [0, { signal: plotWidthOut }],\n                };\n                const rowTitleScale = {\n                    type: 'linear',\n                    name: 'scale_facet_row_title',\n                    domain: [0, 1],\n                    range: [{ signal: plotHeightOut }, 0],\n                };\n                const facetScope = facetLayout ? firstScope : null;\n                const backgroundGroup = facetLayout ? facetScope.facetScope : groupMark;\n                //TODO if capability and numeric x,y\n                if (insight.backgroundImage && specCapabilities.backgroundImage && ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative)) {\n                    //backgroundGroup.encode.update.fill = { value: 'pink' }\n                    if (!backgroundGroup.marks) {\n                        backgroundGroup.marks = [];\n                    }\n                    const imageMark = getImageMark(insight.backgroundImage, allGlobalScales);\n                    backgroundGroup.marks.unshift(imageMark);\n                }\n                const axesScopes = facetLayout ?\n                    addFacetAxesGroupMarks({\n                        globalScope: globalScope.scope,\n                        plotScope: groupMark,\n                        facetScope,\n                        colTitleScale,\n                        rowTitleScale,\n                        colSeqName: 'data_FacetCellColTitles',\n                        rowSeqName: 'data_FacetCellRowTitles',\n                    })\n                    :\n                        {\n                            main: [{\n                                    scope: groupMark,\n                                    lines: true,\n                                    labels: true,\n                                    title: true,\n                                }],\n                        };\n                addGlobalAxes({\n                    globalScope,\n                    allGlobalScales,\n                    axisScales: this.props.axisScales,\n                    plotOffsetSignals: { x: globalSignals.plotOffsetLeft, y: globalSignals.plotOffsetBottom },\n                    axesOffsets: { x: axesOffsetX, y: axesOffsetY },\n                    axesTitlePadding: facetLayout ? { x: axesTitlePaddingFacetX, y: axesTitlePaddingFacetY } : { x: axesTitlePaddingX, y: axesTitlePaddingY },\n                    labelBaseline: { x: 'top', y: 'middle' },\n                    specColumns,\n                    specViewOptions,\n                    axesScopes,\n                    hideZAxis: !!facetLayout,\n                    view: insight.view,\n                });\n            }\n            //add mark to the final scope\n            if (finalScope.mark) {\n                const { update } = finalScope.mark.encode;\n                const outputDataName = 'output';\n                finalScope.mark.from.data = outputDataName;\n                addData(globalScope.markGroup, {\n                    name: outputDataName,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.x,\n                            as: FieldNames.OffsetX,\n                        },\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.y,\n                            as: FieldNames.OffsetY,\n                        },\n                    ],\n                });\n                update.x = {\n                    field: FieldNames.OffsetX,\n                };\n                update.y = {\n                    field: FieldNames.OffsetY,\n                };\n                allEncodingRules.forEach(map => {\n                    for (const key in map) {\n                        if (update[key]) {\n                            const arrIn = map[key];\n                            if (!Array.isArray(update[key])) {\n                                const value = update[key];\n                                const arrOut = [];\n                                update[key] = arrOut;\n                                arrIn.forEach(rule => arrOut.push(rule));\n                                arrOut.push(value);\n                            }\n                            else {\n                                const arrOut = update[key];\n                                arrIn.forEach(rule => arrOut.unshift(rule));\n                            }\n                        }\n                    }\n                });\n                update.fill = fill(specContext, topColorField, ScaleNames.Color);\n                update.opacity = opacity();\n            }\n            return {\n                specCapabilities,\n                vegaSpec,\n            };\n        }\n        initSpec(dataName) {\n            const { globalSignals } = this;\n            const { facetAxesAdjustX, facetAxesAdjustY, minCellWidth, minCellHeight, plotOffsetLeft, plotOffsetBottom, plotOffsetTop, plotOffsetRight, plotHeightOut, plotWidthOut } = globalSignals;\n            const { specContext } = this;\n            const { insight } = specContext;\n            const groupMark = {\n                type: 'group',\n                //style: 'cell',\n                encode: {\n                    update: {\n                        x: { signal: `${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}` },\n                        y: { signal: SignalNames.PlotOffsetTop },\n                        height: { signal: `${SignalNames.PlotHeightOut} - ${SignalNames.FacetAxesAdjustY}` },\n                        width: { signal: `${SignalNames.PlotWidthOut} + ${SignalNames.FacetAxesAdjustX}` },\n                    },\n                },\n            };\n            const inputDataname = 'input';\n            const vegaSpec = {\n                $schema: 'https://vega.github.io/schema/vega/v5.json',\n                //style: 'cell',\n                data: [{ name: inputDataname }, { name: dataName, source: inputDataname, transform: [] }],\n                marks: [groupMark],\n                signals: textSignals(specContext, SignalNames.ViewportHeight).concat([\n                    minCellWidth,\n                    minCellHeight,\n                    {\n                        name: SignalNames.ViewportHeight,\n                        update: `max(${SignalNames.MinCellHeight}, ${insight.size.height})`,\n                    },\n                    {\n                        name: SignalNames.ViewportWidth,\n                        update: `max(${SignalNames.MinCellWidth}, ${insight.size.width})`,\n                    },\n                    plotOffsetLeft,\n                    plotOffsetTop,\n                    plotOffsetBottom,\n                    plotOffsetRight,\n                    facetAxesAdjustX,\n                    facetAxesAdjustY,\n                    {\n                        name: SignalNames.PlotHeightIn,\n                        update: `${SignalNames.ViewportHeight} - ${SignalNames.PlotOffsetBottom} + ${SignalNames.FacetAxesAdjustY}`,\n                    },\n                    {\n                        name: SignalNames.PlotWidthIn,\n                        update: `${SignalNames.ViewportWidth} - ${SignalNames.PlotOffsetLeft} - ${SignalNames.PlotOffsetRight}`,\n                    },\n                    plotHeightOut,\n                    plotWidthOut,\n                    {\n                        name: 'height',\n                        update: `${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut} + ${SignalNames.PlotOffsetBottom} - ${SignalNames.FacetAxesAdjustY}`,\n                    },\n                    {\n                        name: 'width',\n                        update: `${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotOffsetRight}`,\n                    },\n                ]),\n            };\n            return { vegaSpec, groupMark };\n        }\n        iterateLayouts(globalScope, onLayoutBuild) {\n            let specResult;\n            let parentScope = {\n                sizeSignals: globalScope.sizeSignals,\n                offsets: globalScope.offsets,\n            };\n            let firstScope;\n            let childScope;\n            const groupings = [];\n            const { layouts, specCapabilities } = this.props;\n            const allGlobalScales = [];\n            const allEncodingRules = [];\n            for (let i = 0; i < layouts.length; i++) {\n                if (!parentScope)\n                    continue;\n                const buildProps = {\n                    globalScope,\n                    parentScope,\n                    axesScales: this.props.axisScales,\n                    groupings,\n                    id: i,\n                };\n                const layout = this.createLayout(layouts[i], buildProps);\n                try {\n                    childScope = layout.build();\n                    childScope.id = i;\n                    const groupby = layout.getGrouping();\n                    if (groupby) {\n                        groupings.push({\n                            id: i,\n                            groupby,\n                            fieldOps: [\n                                { field: null, op: 'count', as: FieldNames.Count },\n                            ],\n                        });\n                    }\n                    const sumOp = layout.getAggregateSumOp();\n                    if (sumOp) {\n                        groupings[groupings.length - 1].fieldOps.push(sumOp);\n                    }\n                    onLayoutBuild(i, childScope);\n                }\n                catch (e) {\n                    specResult = {\n                        errors: [e.stack],\n                        specCapabilities,\n                        vegaSpec: null,\n                    };\n                    break;\n                }\n                if (childScope && childScope.globalScales) {\n                    allGlobalScales.push(childScope.globalScales);\n                }\n                if (childScope.encodingRuleMap) {\n                    allEncodingRules.push(childScope.encodingRuleMap);\n                }\n                if (i === 0) {\n                    firstScope = childScope;\n                }\n                parentScope = childScope;\n            }\n            return { firstScope, finalScope: parentScope, specResult, allGlobalScales, allEncodingRules };\n        }\n        createLayout(layoutPair, buildProps) {\n            const { layoutType, props } = layoutPair;\n            const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n            const layoutClass = layoutClasses[layoutType];\n            const layout = new layoutClass(layoutBuildProps);\n            layout.id = buildProps.id;\n            return layout;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function build(specContext, currData) {\n        const { specColumns } = specContext;\n        const columns = [\n            specColumns.color,\n            specColumns.facet,\n            specColumns.facetV,\n            specColumns.group,\n            specColumns.size,\n            specColumns.sort,\n            specColumns.x,\n            specColumns.y,\n            specColumns.z,\n        ];\n        inferAll(columns, currData);\n        const specBuilderProps = getSpecBuilderPropsForChart(specContext);\n        const specBuilder = new SpecBuilder(specBuilderProps, specContext);\n        let specResult;\n        if (specBuilder) {\n            try {\n                const errors = specBuilder.validate();\n                if (errors.length) {\n                    specResult = {\n                        errors,\n                        specCapabilities: specBuilderProps.specCapabilities,\n                        vegaSpec: null,\n                    };\n                }\n                else {\n                    specResult = specBuilder.build();\n                }\n            }\n            catch (e) {\n                specResult = {\n                    specCapabilities: null,\n                    vegaSpec: null,\n                    errors: [e.stack],\n                };\n            }\n            if (!specResult.errors) {\n                const data0 = specResult.vegaSpec.data[0];\n                data0.values = currData;\n            }\n        }\n        else {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [`could not build spec for ${specContext.insight.chart}`],\n            };\n        }\n        return specResult;\n    }\n\n    exports.ColorScaleNone = ColorScaleNone;\n    exports.FieldNames = FieldNames;\n    exports.Other = Other;\n    exports.ScaleNames = ScaleNames;\n    exports.SignalNames = SignalNames;\n    exports.build = build;\n    exports.getColumnsFromData = getColumnsFromData;\n    exports.getSpecColumns = getSpecColumns;\n    exports.getStats = getStats;\n    exports.inferAll = inferAll;\n\n}));\n"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/column-categoric.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"State\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\"\n    },\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/column-facet-cross.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\",\n        \"facetV\": \"Income\"\n    },\n    \"facetStyle\": \"cross\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/column-facet-wrap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/column-sum-strip-pct.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"size\": \"TotalPop\"\n    },\n    \"totalStyle\": \"sum-strip-percent\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/column-sum-strip.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"size\": \"TotalPop\"\n    },\n    \"totalStyle\": \"sum-strip\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/column-sum-treemap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"size\": \"TotalPop\"\n    },\n    \"totalStyle\": \"sum-treemap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/column.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\"\n    },\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/density-facet-cross.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\",\n        \"facetV\": \"Income\"\n    },\n    \"facetStyle\": \"cross\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"density\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/density-facet-wrap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"density\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/density-treemap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\",\n        \"size\": \"TotalPop\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"totalStyle\": \"sum-treemap\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"density\",\n    \"view\": \"2d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/density.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\"\n    },\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"density\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/scatter-facet-cross.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\",\n        \"facetV\": \"Income\"\n    },\n    \"facetStyle\": \"cross\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/scatter-facet-wrap-with-image.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"backgroundImage\": {\n        \"url\": \"img/usa-counties-equirectangular.png\",\n        \"extents\": {\n            \"bottom\": 24,\n            \"left\": -125.5,\n            \"right\": -66.5,\n            \"top\": 49.75\n        }\n    },\n    \"size\": {\n        \"height\": 784,\n        \"width\": 1417\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/scatter-facet-wrap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/scatter-with-image.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\"\n    },\n    \"scheme\": \"redblue\",\n    \"backgroundImage\": {\n        \"url\": \"img/usa-counties-equirectangular.png\",\n        \"extents\": {\n            \"bottom\": 24,\n            \"left\": -125.5,\n            \"right\": -66.5,\n            \"top\": 49.75\n        }\n    },\n    \"size\": {\n        \"height\": 800,\n        \"width\": 1200\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/scatter.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Income\",\n        \"z\": \"Income\"\n    },\n    \"scheme\": \"redyellowgreen\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"2d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/stacks-facet-cross.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\",\n        \"facet\": \"MedAge\",\n        \"facetV\": \"Income\"\n    },\n    \"facetStyle\": \"cross\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/stacks-facet-wrap-with-image.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"backgroundImage\": {\n        \"url\": \"img/usa-counties-equirectangular.png\",\n        \"extents\": {\n            \"bottom\": 24,\n            \"left\": -125.5,\n            \"right\": -66.5,\n            \"top\": 49.75\n        }\n    },\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/stacks-facet-wrap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/stacks-with-image.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\"\n    },\n    \"scheme\": \"redblue\",\n    \"backgroundImage\": {\n        \"url\": \"img/usa-counties-equirectangular.png\",\n        \"extents\": {\n            \"bottom\": 24,\n            \"left\": -125.5,\n            \"right\": -66.5,\n            \"top\": 49.75\n        }\n    },\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v1/specs/stacks.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\"\n    },\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>SandDance-Specs test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <style>\n        body {\n            font-family: sans-serif;\n        }\n\n        header {\n            margin-bottom: 1em;\n        }\n        main {\n            display: grid;\n            grid-template-columns: auto 300px;\n        }\n        .sidebar label {\n            display: block;\n            padding-top: 1em;\n        }\n        textarea {\n            box-sizing: border-box;\n            width: 100%;\n            height: 100%;\n        }\n        .sidebar {\n            display: grid;\n            grid-template-rows: auto auto;\n        }\n        .sidebar > div {\n            display: grid;\n            grid-template-rows: 0fr auto 40px;\n        }\n        #vega-spec {\n            border: 1px solid #ccc;\n            max-height: 600px;\n            overflow: scroll;            \n        }\n    </style>\n</head>\n\n<body>\n    <header>\n        <h1>SandDance-Specs test</h1>\n        <label>\n            Insight file:\n            <select id=\"select-spec\">\n                <option>scatter-with-image.json</option>\n                <option>scatter.json</option>\n                <option>scatter-facet-wrap.json</option>\n                <option>scatter-facet-wrap-with-image.json</option>\n                <option>column-categoric.json</option>\n                <option>column-facet-cross.json</option>\n                <option>column-facet-wrap.json</option>\n                <option>column-sum-strip-pct.json</option>\n                <option>column-sum-strip.json</option>\n                <option>column-sum-treemap.json</option>\n                <option>column.json</option>\n                <option>density-facet-cross.json</option>\n                <option>density-facet-wrap.json</option>\n                <option>density-treemap.json</option>\n                <option>density.json</option>\n                <option>scatter-facet-cross.json</option>\n                <option>stacks-facet-cross.json</option>\n                <option>stacks-facet-wrap.json</option>\n                <option>stacks.json</option>\n                <option>stacks-with-image.json</option>\n                <option>stacks-facet-wrap-with-image.json</option>\n            </select>\n        </label>\n    </header>\n\n    <main>\n        <div id=\"vis\"></div>\n        <div class=\"sidebar\">\n            <div>\n                <label>Insight json input</label>\n                <textarea id=\"insight-json\"></textarea>\n                <button id=\"insight-update\">update</button>\n            </div>\n            <div>\n                <label>Vega spec output</label>\n                <textarea id=\"vega-spec\"></textarea>\n                <button id=\"vega-spec-copy\">copy</button>\n            </div>\n        </div>\n    </main>\n\n    <script src=\"js/sanddance-specs.js\"></script>\n    <script src=\"js/index.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/js/index.js",
    "content": "var dataUrl = '/SandDance/sample-data/demovote.tsv';\nvar specViewOptions = {\n    colors: {\n        defaultCube: \"steelblue\",\n        axisLine: \"#000\",\n        axisText: \"#000\"\n    },\n    language: {\n        count: \"Count\"\n    },\n    maxLegends: 20,\n    tickSize: 10,\n};\nvar data;\nvar columns;\nvar container = document.getElementById('vis');\nvar select = document.getElementById('select-spec');\nvar insightTextarea = document.getElementById('insight-json');\nvar insightUdateButton = document.getElementById('insight-update');\nvar vegaOutput = document.getElementById('vega-spec');\nvar vegaCopy = document.getElementById('vega-spec-copy');\nselect.onchange = function () { return selected(select.selectedIndex); };\ninsightUdateButton.onclick = function () {\n    var insight = JSON.parse(insightTextarea.value);\n    render(insight);\n};\nvegaCopy.onclick = function () {\n    vegaOutput.select();\n    document.execCommand('copy');\n    vegaCopy.innerText = 'copied';\n    setTimeout(function () {\n        vegaCopy.innerText = 'copy';\n    }, 2000);\n};\nfunction selected(selectedIndex) {\n    container.innerHTML = \"loading spec...\";\n    fetchInsight(select.options[selectedIndex].value);\n}\nfunction fetchInsight(specFilename) {\n    fetch(\"specs/\".concat(specFilename))\n        .then(function (response) { return response.json(); })\n        .then(function (insight) { return render(insight); })\n        .catch(function (error) { return container.innerText = error; });\n}\nfunction render(insight) {\n    insightTextarea.value = JSON.stringify(insight, null, 2);\n    var specColumns = SandDanceSpecs.getSpecColumns(insight, columns);\n    var context = { specColumns: specColumns, insight: insight, specViewOptions: specViewOptions };\n    var specResult = SandDanceSpecs.build(context, data);\n    if (specResult.errors) {\n        container.innerText = specResult.errors.map(function (error) { return error; }).join('\\n');\n    }\n    else {\n        renderVegaSpec(specResult.vegaSpec);\n    }\n}\nfunction renderVegaSpec(vegaSpec) {\n    var runtime = vega.parse(vegaSpec);\n    var vegaView = new vega.View(runtime, { container: container });\n    vegaView\n        .runAsync()\n        .catch(function (e) { return container.innerHTML = \"error \".concat(e); })\n        .then(function () {\n        var d0 = vegaSpec.data[0];\n        delete d0.values;\n        d0.format = {\n            parse: 'auto',\n            type: 'tsv'\n        };\n        d0.url = 'https://microsoft.github.io' + dataUrl;\n        vegaOutput.value = JSON.stringify(vegaSpec, null, 2);\n    });\n}\ncontainer.innerHTML = \"loading \".concat(dataUrl, \"...\");\nvega.loader().load(dataUrl).then(function (tsv_data) {\n    data = vega.read(tsv_data, { type: 'tsv', parse: 'auto' });\n    columns = SandDanceSpecs.getColumnsFromData(vega.inferTypes, data);\n    selected(0);\n});\n"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/js/sanddance-specs.js",
    "content": "(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n    typeof define === 'function' && define.amd ? define(['exports'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.SandDanceSpecs = {}));\n})(this, (function (exports) { 'use strict';\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const FieldNames = {\n        Active: '__SandDance__Active',\n        Collapsed: '__SandDance__Collapsed',\n        Contains: '__SandDance__Contains',\n        Count: '__SandDance__Count',\n        Sum: '__SandDance__Sum',\n        SumOfCount: '__SandDance__CountSum',\n        SumOfSum: '__SandDance__SumSum',\n        Selected: '__SandDance__Selected',\n        First: '__SandDance__First',\n        Last: '__SandDance__Last',\n        Top: '__SandDance__Top',\n        TopColor: '__SandDance__TopColor',\n        TopIndex: '__SandDance__TopIndex',\n        PowerBISelectionId: '__SandDance__PowerBISelectionId',\n        FacetSearch: '__SandDance__FacetSearch',\n        FacetTitle: '__SandDance__FacetTitle',\n        Ordinal: '__SandDance__Ordinal',\n        WrapCol: '__SandDance__WrapCol',\n        WrapRow: '__SandDance__WrapRow',\n        Value: '__SandDance__Value',\n        OffsetX: '__SandDance__X',\n        OffsetY: '__SandDance__Y',\n        OffsetHeight: '__SandDance__H',\n        OffsetWidth: '__SandDance__W',\n    };\n    const ScaleNames = {\n        Color: 'scale_color',\n        X: 'scale_x',\n        Y: 'scale_y',\n        Z: 'scale_z',\n    };\n    //Signal names\n    const SignalNames = {\n        ViewportWidth: 'ViewportWidth',\n        ViewportHeight: 'ViewportHeight',\n        MinCellWidth: 'MinCellWidth',\n        MinCellHeight: 'MinCellHeight',\n        PlotOffsetLeft: 'PlotOffsetLeft',\n        PlotOffsetTop: 'PlotOffsetTop',\n        PlotOffsetBottom: 'PlotOffsetBottom',\n        PlotOffsetRight: 'PlotOffsetRight',\n        PlotHeightIn: 'PlotHeightIn',\n        PlotWidthIn: 'PlotWidthIn',\n        PlotHeightOut: 'PlotHeightOut',\n        PlotWidthOut: 'PlotWidthOut',\n        ColorBinCount: 'RoleColor_BinCountSignal',\n        ColorReverse: 'RoleColor_ReverseSignal',\n        FacetAxesAdjustX: 'RoleFacet_AxesAdjustSignalX',\n        FacetAxesAdjustY: 'RoleFacet_AxesAdjustSignalY',\n        FacetBins: 'RoleFacet_BinsSignal',\n        FacetVBins: 'RoleFacetV_BinsSignal',\n        FacetPaddingTop: 'FacetPaddingTop',\n        FacetPaddingBottom: 'FacetPaddingBottom',\n        FacetPaddingLeft: 'FacetPaddingLeft',\n        MarkOpacity: 'Mark_OpacitySignal',\n        PointScale: 'Chart_PointScaleSignal',\n        TextAngleX: 'Text_AngleXSignal',\n        TextAngleY: 'Text_AngleYSignal',\n        TextScale: 'Text_ScaleSignal',\n        TextSize: 'Text_SizeSignal',\n        TextTitleSize: 'Text_TitleSizeSignal',\n        TreeMapMethod: 'Chart_TreeMapMethodSignal',\n        XBins: 'RoleX_BinsSignal',\n        YBins: 'RoleY_BinsSignal',\n        ZHeight: 'RoleZ_HeightSignal',\n        ZGrounded: 'RoleZ_Grounded',\n        ZProportion: 'RoleZ_ProportionSignal',\n    };\n    //These are special formulaic data values\n    const Other = '__Other';\n    //name of the \"no-color\" palette\n    const ColorScaleNone = 'none';\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    //TODO move these to options\n    const defaultBins = 10;\n    const maxbins = 100;\n    const minBarBandWidth = 15;\n    const minFacetWidth = 140;\n    const minFacetHeight = 180;\n    const facetPaddingLeft = 40;\n    const facetPaddingTop = 40;\n    const facetPaddingBottom = 40;\n    const facetPaddingRight = 40;\n    const axesLabelLimit = 100;\n    const axesTitleLimit = 100;\n    const axesTitlePaddingX = 30;\n    const axesTitlePaddingY = 60;\n    const axesTitlePaddingFacetX = 69;\n    const axesTitlePaddingFacetY = 92;\n    const axesOffsetX = 120;\n    const axesOffsetY = 120;\n    const scatterSizedDiv = 20;\n    const debounce = 250;\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function allowNoneForSize(specContext) {\n        switch (specContext.insight.totalStyle) {\n            case 'sum-strip':\n            case 'sum-strip-percent':\n            case 'sum-treemap':\n                return false;\n            default:\n                //if totalStyle is blank, count is assumed\n                return true;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function barchartH (specContext) {\n        var _a, _b, _c, _d;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { language } = specViewOptions;\n        const showAxes = !insight.hideAxes;\n        const bandProps = {\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n        };\n        const x = { title: null };\n        const axisScales = {\n            x,\n            y: { title: (_a = specColumns.y) === null || _a === void 0 ? void 0 : _a.name },\n            z: { title: (_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.name },\n        };\n        const layouts = [{\n                layoutType: 'Band',\n                props: bandProps,\n            }];\n        const { totalStyle, view } = insight;\n        if (totalStyle === 'sum-strip-percent') {\n            x.aggregate = 'percent';\n            x.title = language.percent;\n            const stripProps = {\n                addPercentageScale: true,\n                sortOrder: 'ascending',\n                orientation: 'horizontal',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps,\n            });\n        }\n        else {\n            const aggProps = {\n                niceScale: true,\n                dock: 'left',\n                globalAggregateMaxExtentSignal: 'aggMaxExtent',\n                globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n                sumBy: specColumns.size,\n                showAxes,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props: aggProps,\n            });\n            switch (totalStyle) {\n                case 'sum-treemap': {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const treemapProps = {\n                        corner: 'top-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps,\n                    });\n                    break;\n                }\n                case 'sum-strip': {\n                    x.aggregate = 'sum';\n                    x.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                case 'count-strip': {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'ascending',\n                        orientation: 'horizontal',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                default: {\n                    x.aggregate = 'count';\n                    x.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'down-right',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps,\n                    });\n                    break;\n                }\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                percentage: true,\n                roles: [\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_c = specColumns.y) === null || _c === void 0 ? void 0 : _c.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_d = specColumns.z) === null || _d === void 0 ? void 0 : _d.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function barchartV (specContext) {\n        var _a, _b;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { language } = specViewOptions;\n        const showAxes = !insight.hideAxes;\n        const bandProps = {\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n        };\n        const y = { title: null };\n        const axisScales = {\n            x: { title: specColumns.x && specColumns.x.name },\n            y,\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [{\n                layoutType: 'Band',\n                props: bandProps,\n            }];\n        const { totalStyle, view } = insight;\n        if (totalStyle === 'sum-strip-percent') {\n            y.aggregate = 'percent';\n            y.title = language.percent;\n            const stripProps = {\n                addPercentageScale: true,\n                sortOrder: 'descending',\n                orientation: 'vertical',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps,\n            });\n        }\n        else {\n            const aggProps = {\n                niceScale: true,\n                dock: 'bottom',\n                globalAggregateMaxExtentSignal: 'aggMaxExtent',\n                globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n                sumBy: specColumns.size,\n                showAxes,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props: aggProps,\n            });\n            switch (totalStyle) {\n                case 'sum-treemap': {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const treemapProps = {\n                        corner: 'bottom-left',\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Treemap',\n                        props: treemapProps,\n                    });\n                    break;\n                }\n                case 'sum-strip': {\n                    y.aggregate = 'sum';\n                    y.title = language.sum;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                case 'count-strip': {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const stripProps = {\n                        sortOrder: 'descending',\n                        orientation: 'vertical',\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Strip',\n                        props: stripProps,\n                    });\n                    break;\n                }\n                default: {\n                    y.aggregate = 'count';\n                    y.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: 'right-up',\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes,\n                        view,\n                    };\n                    layouts.push({\n                        layoutType: 'Square',\n                        props: squareProps,\n                    });\n                    break;\n                }\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: true,\n                percentage: true,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function density (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const axisScales = {\n            x: { title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name },\n            y: { title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name },\n            z: { title: (_c = specColumns.z) === null || _c === void 0 ? void 0 : _c.name },\n        };\n        const backgroundImage = ((_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.quantitative) && ((_f = insight.backgroundImage) === null || _f === void 0 ? void 0 : _f.extents) && insight.backgroundImage;\n        const showAxes = !(backgroundImage || insight.hideAxes);\n        const hBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom },\n        };\n        const vBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left },\n        };\n        const aggProps = {\n            onBuild: null,\n            aggregation: null,\n            sumBy: specColumns.size,\n        };\n        const layouts = [\n            {\n                layoutType: 'Band',\n                props: vBandProps,\n            },\n            {\n                layoutType: 'Band',\n                props: hBandProps,\n            },\n            {\n                layoutType: 'AggregateSquare',\n                props: aggProps,\n            },\n        ];\n        const { totalStyle, view } = insight;\n        switch (totalStyle) {\n            case 'sum-treemap': {\n                aggProps.aggregation = 'sum';\n                const treemapProps = {\n                    corner: 'bottom-left',\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Treemap',\n                    props: treemapProps,\n                });\n                break;\n            }\n            case 'sum-strip': {\n                aggProps.aggregation = 'sum';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            case 'count-strip': {\n                aggProps.aggregation = 'count';\n                const stripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'vertical',\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            default: {\n                aggProps.aggregation = 'count';\n                const squareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: 'right-down',\n                    z: specColumns.z,\n                    maxGroupedUnits: null,\n                    maxGroupedFillSize: null,\n                    showAxes,\n                    view,\n                };\n                aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled) => {\n                    squareProps.maxGroupedUnits = aggMaxExtent;\n                    squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n                };\n                layouts.push({\n                    layoutType: 'Square',\n                    props: squareProps,\n                });\n                break;\n            }\n        }\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: true,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        allowNone: allowNoneForSize,\n                        excludeCategoric: true,\n                        signals: [SignalNames.TreeMapMethod],\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function grid (specContext) {\n        var _a;\n        const { insight, specColumns } = specContext;\n        const { view } = insight;\n        const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: 'right-down',\n            z: specColumns.z,\n            collapseYHeight: true,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        return {\n            axisScales,\n            layouts: [\n                {\n                    layoutType: 'Square',\n                    props: squareProps,\n                },\n            ],\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function scatterplot (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const backgroundImageExtents = ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative) && ((_c = insight.backgroundImage) === null || _c === void 0 ? void 0 : _c.extents);\n        const scatterProps = {\n            x: specColumns.x,\n            y: specColumns.y,\n            z: specColumns.z,\n            size: specColumns.size,\n            scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n            zGrounded: specViewOptions.language.zGrounded,\n            backgroundImageExtents,\n            showAxes: !(backgroundImageExtents || insight.hideAxes),\n            view: insight.view,\n        };\n        const axisScales = {\n            x: { title: (_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.name },\n            y: { title: (_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.name },\n            z: { title: (_f = specColumns.z) === null || _f === void 0 ? void 0 : _f.name },\n        };\n        return {\n            axisScales,\n            layouts: [\n                {\n                    layoutType: 'Scatter',\n                    props: scatterProps,\n                },\n            ],\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'x',\n                        axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                    },\n                    {\n                        role: 'y',\n                        axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? 'range' : 'exact',\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: false,\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'size',\n                        excludeCategoric: true,\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n                signals: [SignalNames.PointScale, SignalNames.ZGrounded],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function stacks (specContext) {\n        var _a, _b, _c, _d, _e, _f, _g;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const axisScales = {\n            x: { title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name },\n            y: { title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name },\n            z: { title: specViewOptions.language.count },\n        };\n        const backgroundImage = ((_c = specColumns.x) === null || _c === void 0 ? void 0 : _c.quantitative) && ((_d = specColumns.y) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = insight.backgroundImage) === null || _e === void 0 ? void 0 : _e.extents) && insight.backgroundImage;\n        const showAxes = !(backgroundImage || insight.hideAxes);\n        const hBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'horizontal',\n            groupby: {\n                column: specColumns.y,\n                defaultBins,\n                maxbinsSignalName: SignalNames.YBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom },\n        };\n        const vBandProps = {\n            excludeEncodingRuleMap: true,\n            orientation: 'vertical',\n            groupby: {\n                column: specColumns.x,\n                defaultBins,\n                maxbinsSignalName: SignalNames.XBins,\n                maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n                maxbins,\n            },\n            minBandWidth: minBarBandWidth,\n            showAxes,\n            outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left },\n        };\n        const stackProps = {\n            sort: specColumns.sort,\n            showAxes,\n        };\n        return {\n            axisScales,\n            customZScale: true,\n            layouts: [\n                {\n                    layoutType: 'Band',\n                    props: vBandProps,\n                },\n                {\n                    layoutType: 'Band',\n                    props: hBandProps,\n                },\n                {\n                    layoutType: 'Stack',\n                    props: stackProps,\n                },\n            ],\n            specCapabilities: {\n                backgroundImage: true,\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'x',\n                        binnable: true,\n                        axisSelection: ((_f = specColumns.x) === null || _f === void 0 ? void 0 : _f.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.XBins],\n                    },\n                    {\n                        role: 'y',\n                        binnable: true,\n                        axisSelection: ((_g = specColumns.y) === null || _g === void 0 ? void 0 : _g.quantitative) ? 'range' : 'exact',\n                        axisSelectionBetweenTicks: true,\n                        signals: [SignalNames.YBins],\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function strips (specContext) {\n        var _a;\n        const { insight, specColumns } = specContext;\n        const { view } = insight;\n        const stripProps = {\n            sortOrder: 'ascending',\n            orientation: 'vertical',\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [];\n        if (specColumns.facet) {\n            axisScales.y = {\n                title: null,\n                aggregate: specColumns.size ? 'sum' : 'count',\n            };\n            const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n            const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n            const props = {\n                dock: 'top',\n                niceScale: false,\n                globalAggregateMaxExtentScaledSignal,\n                globalAggregateMaxExtentSignal,\n                sumBy: specColumns.size,\n                showAxes: false,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props,\n            });\n        }\n        layouts.push({\n            layoutType: 'Strip',\n            props: stripProps,\n        });\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'size',\n                        allowNone: true, //size by none is a count\n                        excludeCategoric: true,\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'sort',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function treemap (specContext) {\n        var _a;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const { view } = insight;\n        const treemapProps = {\n            corner: 'top-left',\n            group: specColumns.group,\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes: !insight.hideAxes,\n            view,\n        };\n        const axisScales = {\n            z: { title: specColumns.z && specColumns.z.name },\n        };\n        const layouts = [];\n        if (specColumns.facet) {\n            axisScales.y = {\n                title: null,\n                aggregate: 'sum',\n            };\n            const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n            const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n            const props = {\n                dock: 'top',\n                niceScale: false,\n                globalAggregateMaxExtentScaledSignal,\n                globalAggregateMaxExtentSignal,\n                sumBy: specColumns.size,\n                showAxes: false,\n            };\n            layouts.push({\n                layoutType: 'AggregateContainer',\n                props,\n            });\n        }\n        layouts.push({\n            layoutType: 'Treemap',\n            props: treemapProps,\n        });\n        return {\n            axisScales,\n            layouts,\n            specCapabilities: {\n                countsAndSums: false,\n                roles: [\n                    {\n                        role: 'size',\n                        excludeCategoric: true,\n                    },\n                    {\n                        role: 'group',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'z',\n                        axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? 'range' : 'exact',\n                        allowNone: true,\n                        disabled: view === '2d',\n                    },\n                    {\n                        role: 'color',\n                        allowNone: true,\n                    },\n                    {\n                        role: 'facet',\n                        allowNone: true,\n                        signals: [SignalNames.FacetBins],\n                    },\n                    {\n                        role: 'facetV',\n                        allowNone: true,\n                        signals: [SignalNames.FacetVBins],\n                    },\n                ],\n                signals: [SignalNames.TreeMapMethod],\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n        let layoutPair;\n        const groupby = facetColumn;\n        const plotPadding = {\n            x: 0,\n            y: 0,\n        };\n        let facetPadding;\n        switch (facetStyle) {\n            case 'cross': {\n                const props = {\n                    axisTextColor,\n                    colRowTitles: true,\n                    groupbyX: groupby,\n                    groupbyY: facetVColumn,\n                };\n                layoutPair = {\n                    layoutType: 'Cross',\n                    props,\n                };\n                facetPadding = {\n                    bottom: facetPaddingBottom,\n                    left: facetPaddingLeft,\n                    top: 0,\n                };\n                plotPadding.y = facetPaddingTop;\n                plotPadding.x = facetPaddingRight;\n                break;\n            }\n            case 'wrap':\n            default: {\n                const props = {\n                    axisTextColor,\n                    cellTitles: true,\n                    groupby,\n                };\n                layoutPair = {\n                    layoutType: 'Wrap',\n                    props,\n                };\n                facetPadding =\n                    {\n                        bottom: facetPaddingBottom,\n                        left: facetPaddingLeft,\n                        top: facetPaddingTop,\n                    };\n                break;\n            }\n        }\n        const facetLayout = {\n            facetPadding,\n            plotPadding,\n        };\n        return {\n            layoutPair,\n            facetLayout,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const map = {\n        barchart: barchartV,\n        barchartH,\n        barchartV,\n        density,\n        grid,\n        scatterplot,\n        stacks,\n        strips,\n        treemap,\n    };\n    function getSpecBuilderPropsForChart(specContext) {\n        const { insight, specColumns, specViewOptions } = specContext;\n        const fn = map[insight.chart];\n        if (fn) {\n            const props = fn(specContext);\n            if (insight.columns.facet) {\n                const discreteFacetColumn = {\n                    column: specColumns.facet,\n                    defaultBins,\n                    maxbins,\n                    maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                    maxbinsSignalName: SignalNames.FacetBins,\n                };\n                const discreteFacetVColumn = {\n                    column: specColumns.facetV,\n                    defaultBins,\n                    maxbins,\n                    maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                    maxbinsSignalName: SignalNames.FacetVBins,\n                };\n                const { facetLayout, layoutPair } = getFacetLayout(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n                props.layouts.unshift(layoutPair);\n                props.facetLayout = facetLayout;\n                props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n            }\n            return props;\n        }\n    }\n\n    function define(constructor, factory, prototype) {\n      constructor.prototype = factory.prototype = prototype;\n      prototype.constructor = constructor;\n    }\n\n    function extend(parent, definition) {\n      var prototype = Object.create(parent.prototype);\n      for (var key in definition) prototype[key] = definition[key];\n      return prototype;\n    }\n\n    function Color() {}\n\n    var darker = 0.7;\n    var brighter = 1 / darker;\n\n    var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n        reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n        reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n        reHex = /^#([0-9a-f]{3,8})$/,\n        reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n        reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n        reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n        reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n        reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n        reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\n    var named = {\n      aliceblue: 0xf0f8ff,\n      antiquewhite: 0xfaebd7,\n      aqua: 0x00ffff,\n      aquamarine: 0x7fffd4,\n      azure: 0xf0ffff,\n      beige: 0xf5f5dc,\n      bisque: 0xffe4c4,\n      black: 0x000000,\n      blanchedalmond: 0xffebcd,\n      blue: 0x0000ff,\n      blueviolet: 0x8a2be2,\n      brown: 0xa52a2a,\n      burlywood: 0xdeb887,\n      cadetblue: 0x5f9ea0,\n      chartreuse: 0x7fff00,\n      chocolate: 0xd2691e,\n      coral: 0xff7f50,\n      cornflowerblue: 0x6495ed,\n      cornsilk: 0xfff8dc,\n      crimson: 0xdc143c,\n      cyan: 0x00ffff,\n      darkblue: 0x00008b,\n      darkcyan: 0x008b8b,\n      darkgoldenrod: 0xb8860b,\n      darkgray: 0xa9a9a9,\n      darkgreen: 0x006400,\n      darkgrey: 0xa9a9a9,\n      darkkhaki: 0xbdb76b,\n      darkmagenta: 0x8b008b,\n      darkolivegreen: 0x556b2f,\n      darkorange: 0xff8c00,\n      darkorchid: 0x9932cc,\n      darkred: 0x8b0000,\n      darksalmon: 0xe9967a,\n      darkseagreen: 0x8fbc8f,\n      darkslateblue: 0x483d8b,\n      darkslategray: 0x2f4f4f,\n      darkslategrey: 0x2f4f4f,\n      darkturquoise: 0x00ced1,\n      darkviolet: 0x9400d3,\n      deeppink: 0xff1493,\n      deepskyblue: 0x00bfff,\n      dimgray: 0x696969,\n      dimgrey: 0x696969,\n      dodgerblue: 0x1e90ff,\n      firebrick: 0xb22222,\n      floralwhite: 0xfffaf0,\n      forestgreen: 0x228b22,\n      fuchsia: 0xff00ff,\n      gainsboro: 0xdcdcdc,\n      ghostwhite: 0xf8f8ff,\n      gold: 0xffd700,\n      goldenrod: 0xdaa520,\n      gray: 0x808080,\n      green: 0x008000,\n      greenyellow: 0xadff2f,\n      grey: 0x808080,\n      honeydew: 0xf0fff0,\n      hotpink: 0xff69b4,\n      indianred: 0xcd5c5c,\n      indigo: 0x4b0082,\n      ivory: 0xfffff0,\n      khaki: 0xf0e68c,\n      lavender: 0xe6e6fa,\n      lavenderblush: 0xfff0f5,\n      lawngreen: 0x7cfc00,\n      lemonchiffon: 0xfffacd,\n      lightblue: 0xadd8e6,\n      lightcoral: 0xf08080,\n      lightcyan: 0xe0ffff,\n      lightgoldenrodyellow: 0xfafad2,\n      lightgray: 0xd3d3d3,\n      lightgreen: 0x90ee90,\n      lightgrey: 0xd3d3d3,\n      lightpink: 0xffb6c1,\n      lightsalmon: 0xffa07a,\n      lightseagreen: 0x20b2aa,\n      lightskyblue: 0x87cefa,\n      lightslategray: 0x778899,\n      lightslategrey: 0x778899,\n      lightsteelblue: 0xb0c4de,\n      lightyellow: 0xffffe0,\n      lime: 0x00ff00,\n      limegreen: 0x32cd32,\n      linen: 0xfaf0e6,\n      magenta: 0xff00ff,\n      maroon: 0x800000,\n      mediumaquamarine: 0x66cdaa,\n      mediumblue: 0x0000cd,\n      mediumorchid: 0xba55d3,\n      mediumpurple: 0x9370db,\n      mediumseagreen: 0x3cb371,\n      mediumslateblue: 0x7b68ee,\n      mediumspringgreen: 0x00fa9a,\n      mediumturquoise: 0x48d1cc,\n      mediumvioletred: 0xc71585,\n      midnightblue: 0x191970,\n      mintcream: 0xf5fffa,\n      mistyrose: 0xffe4e1,\n      moccasin: 0xffe4b5,\n      navajowhite: 0xffdead,\n      navy: 0x000080,\n      oldlace: 0xfdf5e6,\n      olive: 0x808000,\n      olivedrab: 0x6b8e23,\n      orange: 0xffa500,\n      orangered: 0xff4500,\n      orchid: 0xda70d6,\n      palegoldenrod: 0xeee8aa,\n      palegreen: 0x98fb98,\n      paleturquoise: 0xafeeee,\n      palevioletred: 0xdb7093,\n      papayawhip: 0xffefd5,\n      peachpuff: 0xffdab9,\n      peru: 0xcd853f,\n      pink: 0xffc0cb,\n      plum: 0xdda0dd,\n      powderblue: 0xb0e0e6,\n      purple: 0x800080,\n      rebeccapurple: 0x663399,\n      red: 0xff0000,\n      rosybrown: 0xbc8f8f,\n      royalblue: 0x4169e1,\n      saddlebrown: 0x8b4513,\n      salmon: 0xfa8072,\n      sandybrown: 0xf4a460,\n      seagreen: 0x2e8b57,\n      seashell: 0xfff5ee,\n      sienna: 0xa0522d,\n      silver: 0xc0c0c0,\n      skyblue: 0x87ceeb,\n      slateblue: 0x6a5acd,\n      slategray: 0x708090,\n      slategrey: 0x708090,\n      snow: 0xfffafa,\n      springgreen: 0x00ff7f,\n      steelblue: 0x4682b4,\n      tan: 0xd2b48c,\n      teal: 0x008080,\n      thistle: 0xd8bfd8,\n      tomato: 0xff6347,\n      turquoise: 0x40e0d0,\n      violet: 0xee82ee,\n      wheat: 0xf5deb3,\n      white: 0xffffff,\n      whitesmoke: 0xf5f5f5,\n      yellow: 0xffff00,\n      yellowgreen: 0x9acd32\n    };\n\n    define(Color, color, {\n      copy(channels) {\n        return Object.assign(new this.constructor, this, channels);\n      },\n      displayable() {\n        return this.rgb().displayable();\n      },\n      hex: color_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: color_formatHex,\n      formatHex8: color_formatHex8,\n      formatHsl: color_formatHsl,\n      formatRgb: color_formatRgb,\n      toString: color_formatRgb\n    });\n\n    function color_formatHex() {\n      return this.rgb().formatHex();\n    }\n\n    function color_formatHex8() {\n      return this.rgb().formatHex8();\n    }\n\n    function color_formatHsl() {\n      return hslConvert(this).formatHsl();\n    }\n\n    function color_formatRgb() {\n      return this.rgb().formatRgb();\n    }\n\n    function color(format) {\n      var m, l;\n      format = (format + \"\").trim().toLowerCase();\n      return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n          : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n          : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n          : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n          : null) // invalid hex\n          : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n          : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n          : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n          : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n          : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n          : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n          : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n          : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n          : null;\n    }\n\n    function rgbn(n) {\n      return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n    }\n\n    function rgba(r, g, b, a) {\n      if (a <= 0) r = g = b = NaN;\n      return new Rgb(r, g, b, a);\n    }\n\n    function rgbConvert(o) {\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Rgb;\n      o = o.rgb();\n      return new Rgb(o.r, o.g, o.b, o.opacity);\n    }\n\n    function rgb(r, g, b, opacity) {\n      return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n    }\n\n    function Rgb(r, g, b, opacity) {\n      this.r = +r;\n      this.g = +g;\n      this.b = +b;\n      this.opacity = +opacity;\n    }\n\n    define(Rgb, rgb, extend(Color, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n      },\n      rgb() {\n        return this;\n      },\n      clamp() {\n        return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n      },\n      displayable() {\n        return (-0.5 <= this.r && this.r < 255.5)\n            && (-0.5 <= this.g && this.g < 255.5)\n            && (-0.5 <= this.b && this.b < 255.5)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n      formatHex: rgb_formatHex,\n      formatHex8: rgb_formatHex8,\n      formatRgb: rgb_formatRgb,\n      toString: rgb_formatRgb\n    }));\n\n    function rgb_formatHex() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n    }\n\n    function rgb_formatHex8() {\n      return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n    }\n\n    function rgb_formatRgb() {\n      const a = clampa(this.opacity);\n      return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n    }\n\n    function clampa(opacity) {\n      return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n    }\n\n    function clampi(value) {\n      return Math.max(0, Math.min(255, Math.round(value) || 0));\n    }\n\n    function hex(value) {\n      value = clampi(value);\n      return (value < 16 ? \"0\" : \"\") + value.toString(16);\n    }\n\n    function hsla(h, s, l, a) {\n      if (a <= 0) h = s = l = NaN;\n      else if (l <= 0 || l >= 1) h = s = NaN;\n      else if (s <= 0) h = NaN;\n      return new Hsl(h, s, l, a);\n    }\n\n    function hslConvert(o) {\n      if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n      if (!(o instanceof Color)) o = color(o);\n      if (!o) return new Hsl;\n      if (o instanceof Hsl) return o;\n      o = o.rgb();\n      var r = o.r / 255,\n          g = o.g / 255,\n          b = o.b / 255,\n          min = Math.min(r, g, b),\n          max = Math.max(r, g, b),\n          h = NaN,\n          s = max - min,\n          l = (max + min) / 2;\n      if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n      } else {\n        s = l > 0 && l < 1 ? 0 : h;\n      }\n      return new Hsl(h, s, l, o.opacity);\n    }\n\n    function hsl(h, s, l, opacity) {\n      return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n    }\n\n    function Hsl(h, s, l, opacity) {\n      this.h = +h;\n      this.s = +s;\n      this.l = +l;\n      this.opacity = +opacity;\n    }\n\n    define(Hsl, hsl, extend(Color, {\n      brighter(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      darker(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n      },\n      rgb() {\n        var h = this.h % 360 + (this.h < 0) * 360,\n            s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n            l = this.l,\n            m2 = l + (l < 0.5 ? l : 1 - l) * s,\n            m1 = 2 * l - m2;\n        return new Rgb(\n          hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n          hsl2rgb(h, m1, m2),\n          hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n          this.opacity\n        );\n      },\n      clamp() {\n        return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n      },\n      displayable() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n            && (0 <= this.l && this.l <= 1)\n            && (0 <= this.opacity && this.opacity <= 1);\n      },\n      formatHsl() {\n        const a = clampa(this.opacity);\n        return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n      }\n    }));\n\n    function clamph(value) {\n      value = (value || 0) % 360;\n      return value < 0 ? value + 360 : value;\n    }\n\n    function clampt(value) {\n      return Math.max(0, Math.min(1, value || 0));\n    }\n\n    /* From FvD 13.37, CSS Color Module Level 3 */\n    function hsl2rgb(h, m1, m2) {\n      return (h < 60 ? m1 + (m2 - m1) * h / 60\n          : h < 180 ? m2\n          : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n          : m1) * 255;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function isColor(cssColorSpecifier) {\n        return !!color(cssColorSpecifier);\n    }\n    function checkIsColorData(data, column) {\n        if (!column.stats.hasColorData) {\n            column.isColorData = false;\n            return;\n        }\n        for (let i = 0; i < data.length; i++) {\n            if (!isColor(data[i][column.name])) {\n                column.isColorData = false;\n                return;\n            }\n        }\n        column.isColorData = true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function isQuantitative(column) {\n        return column.type === 'number' || column.type === 'integer';\n    }\n    function detectNegative(columnName, data) {\n        for (let i = 1; i < data.length; i++) {\n            const value = columnName == null ? data[i] : data[i][columnName];\n            if (value < 0)\n                return true;\n        }\n        return false;\n    }\n    function detectSequentialColumn(columnName, data) {\n        if (data.length < 2)\n            return false;\n        for (let i = 1; i < data.length; i++) {\n            const curr = columnName == null ? data[i] : data[i][columnName];\n            const prev = columnName == null ? data[i - 1] : data[i - 1][columnName];\n            if (curr !== prev + 1)\n                return false;\n        }\n        return true;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getStats(data, ...args) {\n        let columnName;\n        let columnType;\n        let columnQuantitative;\n        let distinctValuesCallback;\n        if (args.length <= 2) {\n            const column = args[0];\n            columnName = column.name;\n            columnType = column.type;\n            columnQuantitative = column.quantitative;\n            distinctValuesCallback = args[1];\n        }\n        else {\n            columnName = args[0];\n            columnType = args[1];\n            columnQuantitative = args[2];\n            distinctValuesCallback = args[3];\n        }\n        const distinctMap = {};\n        const stats = {\n            nonNull: 0,\n            distinctValueCount: null,\n            max: null,\n            mean: null,\n            min: null,\n        };\n        const columnIsString = columnType === 'string';\n        let sum = 0;\n        for (let i = 0; i < data.length; i++) {\n            const row = data[i];\n            const value = columnName == null ? row : row[columnName];\n            if (columnIsString) {\n                if (value !== '') {\n                    stats.nonNull++;\n                }\n            }\n            else if (value != null) {\n                stats.nonNull++;\n            }\n            const num = +value;\n            distinctMap[value] = true;\n            if (!isNaN(num)) {\n                if (stats.max === null || num > stats.max) {\n                    stats.max = num;\n                }\n                if (stats.min === null || num < stats.min) {\n                    stats.min = num;\n                }\n                sum += num;\n            }\n            // hex codes, ex. #003300, are parsed as dates\n            if ((columnType === 'date' || columnIsString) && !stats.hasColorData && isColor(value)) {\n                stats.hasColorData = true;\n            }\n        }\n        if (columnQuantitative) {\n            stats.mean = data.length > 0 && (sum / data.length);\n            stats.hasNegative = detectNegative(columnName, data);\n            if (columnType === 'integer') {\n                stats.isSequential = detectSequentialColumn(columnName, data);\n            }\n        }\n        const distinctValues = Object.keys(distinctMap);\n        if (distinctValuesCallback) {\n            distinctValues.sort();\n            distinctValuesCallback(distinctValues);\n        }\n        stats.distinctValueCount = distinctValues.length;\n        return stats;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Derive column metadata from the data array.\n     * @param data Array of data objects.\n     */\n    function getColumnsFromData(inferTypesFn, data, columnTypes) {\n        const sample = data[0];\n        const fields = sample ? Object.keys(sample) : [];\n        const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n        const columns = fields.map(name => {\n            const column = {\n                name,\n                type: inferences[name],\n            };\n            return column;\n        });\n        inferAll(columns, data);\n        return columns;\n    }\n    /**\n     * Populate columns with type inferences and stats.\n     * @param columns Array of columns.\n     * @param data Array of data objects.\n     */\n    function inferAll(columns, data) {\n        columns.forEach(column => {\n            if (column) {\n                if (typeof column.quantitative !== 'boolean') {\n                    column.quantitative = isQuantitative(column);\n                }\n                if (!column.stats) {\n                    column.stats = getStats(data, column);\n                }\n                // hex codes, ex. #003300, are parsed as dates\n                if ((column.type === 'date' || column.type === 'string') && typeof column.isColorData !== 'boolean') {\n                    checkIsColorData(data, column);\n                }\n            }\n        });\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Table {\n        constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = 'right') {\n            this.columns = columns;\n            this.rows = rows;\n            this.maxWidth = maxWidth;\n            this.underlineHeaders = underlineHeaders;\n            this.align = align;\n            // Calculate maximum width for each column\n            this.columnWidths = this.columns.map((col, idx) => Math.max(col.length, ...this.rows.map(row => { var _a; return ((_a = row[idx]) === null || _a === void 0 ? void 0 : _a.length) || 0; })));\n        }\n        createSpaces(num) {\n            return ' '.repeat(num);\n        }\n        groupColumns() {\n            let cumulativeWidth = 0;\n            const columnGroups = [];\n            let currentGroup = [];\n            this.columns.forEach((col, idx) => {\n                const columnSpace = this.columnWidths[idx] + 1; // account for one space between columns\n                if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n                    columnGroups.push(currentGroup);\n                    cumulativeWidth = columnSpace;\n                    currentGroup = [col];\n                }\n                else {\n                    cumulativeWidth += columnSpace;\n                    currentGroup.push(col);\n                }\n            });\n            if (currentGroup.length > 0) {\n                columnGroups.push(currentGroup);\n            }\n            return columnGroups;\n        }\n        formatRow(row, group) {\n            return group.map(col => {\n                const idx = this.columns.indexOf(col);\n                const cellValue = row[idx] == null ? '' : row[idx].toString();\n                return this.align === 'right'\n                    ? cellValue.padStart(this.columnWidths[idx], ' ')\n                    : cellValue.padEnd(this.columnWidths[idx], ' ');\n            }).join(this.createSpaces(1));\n        }\n        formatHeader(group) {\n            return group.map(col => {\n                const idx = this.columns.indexOf(col);\n                return this.align === 'right'\n                    ? col.padStart(this.columnWidths[idx], ' ')\n                    : col.padEnd(this.columnWidths[idx], ' ');\n            }).join(this.createSpaces(1));\n        }\n        underlineHeader(group) {\n            return group.map(col => '-'.repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n        }\n        render() {\n            const output = [];\n            const columnGroups = this.groupColumns();\n            columnGroups.forEach((group, groupIndex) => {\n                const headerRow = this.formatHeader(group);\n                let section = headerRow + (groupIndex < columnGroups.length - 1 ? ' \\\\' : '') + '\\n';\n                if (this.underlineHeaders) {\n                    section += this.underlineHeader(group) + '\\n';\n                }\n                this.rows.forEach((row) => {\n                    section += this.formatRow(row, group) + '\\n';\n                });\n                output.push(section);\n                if (groupIndex < columnGroups.length - 1) {\n                    output.push('\\n');\n                }\n            });\n            return output.join('');\n        }\n    }\n    var pandasSimulation;\n    (function (pandasSimulation) {\n        // Mapping TypeScript types to Python-like dtypes\n        const typeMapping = {\n            boolean: 'bool',\n            number: 'float64', // Assuming 'number' is used for floating-point numbers\n            date: 'datetime64[ns]',\n            string: 'object',\n            integer: 'int64',\n        };\n        function head(columns, data, maxWidth = 80) {\n            const numRows = 5; // Number of rows as in `head(5)` from pandas\n            const top = data.slice(0, numRows); // Get the top `numRows` rows\n            // Create a \"fake\" row number column\n            const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n            // Extract column names and rows for the table\n            const columnNames = [''].concat(columns.map(col => col.name));\n            const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map(col => { var _a; return ((_a = row[col.name]) === null || _a === void 0 ? void 0 : _a.toString()) || ''; })));\n            // Create and render the table with right alignment\n            const table = new Table(columnNames, rows, maxWidth, false, 'right'); // Right alignment\n            return table.render();\n        }\n        pandasSimulation.head = head;\n        function info(columns, data, maxWidth = 80) {\n            const numRows = data.length;\n            const output = [];\n            // Summary header\n            output.push('<class \\'pandas.core.frame.DataFrame\\'>');\n            output.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n            output.push(`Data columns (total ${columns.length} columns):\\n`);\n            // Column headers and details\n            const columnHeaders = ['#', 'Column', 'Non-Null Count', 'Dtype'];\n            const rows = columns.map((col, idx) => {\n                const nonNullCount = col.stats.nonNull.toString();\n                const dtype = typeMapping[col.type] || 'unknown';\n                return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n            });\n            // Create and render the table with left alignment and header underline\n            const table = new Table(columnHeaders, rows, maxWidth, true, 'left'); // Left alignment\n            output.push(table.render());\n            // Memory usage estimation\n            const memoryUsage = columns.reduce((total, col) => {\n                var _a;\n                const exampleValue = (_a = data.find(row => row[col.name] != null)) === null || _a === void 0 ? void 0 : _a[col.name];\n                if (exampleValue == null)\n                    return total;\n                const size = new Blob([exampleValue.toString()]).size;\n                return total + (size * numRows);\n            }, 0);\n            output.push(`\\ndtypes: ${columns.filter(col => col.type === 'number').length} float64, ` +\n                `${columns.filter(col => col.type === 'integer').length} int64, ` +\n                `${columns.filter(col => col.type === 'string').length} object`);\n            output.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n            return output.join('\\n');\n        }\n        pandasSimulation.info = info;\n    })(pandasSimulation || (pandasSimulation = {}));\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Get columns associated with each Insight role.\n     * @param insight Insight to specify column roles.\n     * @param columns Array of Columns inferred from the data.\n     */\n    function getSpecColumns(insight, columns) {\n        function getColumnByName(name) {\n            return columns.filter(c => c.name === name)[0];\n        }\n        return {\n            color: getColumnByName(insight.columns && insight.columns.color),\n            facet: getColumnByName(insight.columns && insight.columns.facet),\n            facetV: getColumnByName(insight.columns && insight.columns.facetV),\n            group: getColumnByName(insight.columns && insight.columns.group),\n            size: getColumnByName(insight.columns && insight.columns.size),\n            sort: getColumnByName(insight.columns && insight.columns.sort),\n            uid: getColumnByName(insight.columns && insight.columns.uid),\n            x: getColumnByName(insight.columns && insight.columns.x),\n            y: getColumnByName(insight.columns && insight.columns.y),\n            z: getColumnByName(insight.columns && insight.columns.z),\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addAxes(scope, ...axes) {\n        if (!axes || !axes.length)\n            return;\n        if (!scope.axes)\n            scope.axes = [];\n        scope.axes.push(...axes.filter(Boolean));\n    }\n    function addData(scope, ...datas) {\n        if (!datas || !datas.length)\n            return;\n        if (!scope.data)\n            scope.data = [];\n        scope.data.push(...datas.filter(Boolean));\n    }\n    function addMarks(scope, ...marks) {\n        if (!marks || !marks.length)\n            return;\n        if (!scope.marks)\n            scope.marks = [];\n        scope.marks.push(...marks.filter(Boolean));\n    }\n    function addScales(scope, ...scales) {\n        if (!scales || !scales.length)\n            return;\n        if (!scope.scales)\n            scope.scales = [];\n        scope.scales.push(...scales.filter(Boolean));\n    }\n    function addSignals(scope, ...signals) {\n        if (!signals || !signals.length)\n            return;\n        if (!scope.signals)\n            scope.signals = [];\n        scope.signals.push(...signals.filter(Boolean));\n    }\n    function addTransforms(data, ...transforms) {\n        if (!transforms || !transforms.length)\n            return;\n        if (!data.transform)\n            data.transform = [];\n        data.transform.push(...transforms.filter(Boolean));\n    }\n    function getDataByName(data, dataName) {\n        for (let i = 0; i < data.length; i++) {\n            if (data[i].name === dataName)\n                return { data: data[i], index: i };\n        }\n    }\n    function getGroupBy(groupings) {\n        const groupby = groupings.map(g => g.groupby);\n        return groupby.reduce((acc, val) => acc.concat(val), []);\n    }\n    function addOffsets(...offsets) {\n        return offsets.filter(Boolean).join(' + ');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addGlobalAxes(props) {\n        const { axesOffsets, axisScales, axesScopes, axesTitlePadding, allGlobalScales, globalScope, labelBaseline, plotOffsetSignals, specColumns, specViewOptions } = props;\n        const { scope } = globalScope;\n        allGlobalScales.forEach(globalScales => {\n            const { scales } = globalScales;\n            for (const xyz in scales) {\n                const _scales = scales[xyz];\n                if (_scales) {\n                    addScales(scope, ..._scales);\n                    let { showAxes } = globalScales;\n                    let zindex = undefined;\n                    if (xyz === 'z') {\n                        showAxes = false;\n                        if (props.view === '3d' && specViewOptions.zAxisOptions && !props.hideZAxis) {\n                            if (specViewOptions.zAxisOptions.showZAxis) {\n                                showAxes = true;\n                                zindex = specViewOptions.zAxisOptions.zIndex;\n                            }\n                        }\n                    }\n                    if (showAxes && axisScales) {\n                        const axisScale = axisScales[xyz];\n                        if (axisScale) {\n                            const lineColor = specViewOptions.colors.axisLine;\n                            const horizontal = xyz === 'x';\n                            const column = specColumns[xyz] || { quantitative: true };\n                            const title = axisScale.title;\n                            const props = {\n                                title,\n                                horizontal,\n                                column,\n                                specViewOptions,\n                                lineColor,\n                                titlePadding: axesTitlePadding[xyz],\n                                labelBaseline: labelBaseline[xyz],\n                                zindex,\n                            };\n                            axesScopes['main'].forEach(a => addAxes(a.scope, createAxis(Object.assign(Object.assign({}, props), { scale: a.scale || _scales[0], showTitle: a.title, showLabels: a.labels, showLines: a.lines }))));\n                            if (axesScopes[xyz]) {\n                                axesScopes[xyz].forEach(a => addAxes(a.scope, createAxis(Object.assign(Object.assign({}, props), { scale: a.scale || _scales[0], showTitle: a.title, showLabels: a.labels, showLines: a.lines }))));\n                            }\n                            if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                                const plotOffsetSignal = plotOffsetSignals[xyz];\n                                plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                            }\n                        }\n                    }\n                }\n            }\n        });\n    }\n    function createAxis(props) {\n        const { column, horizontal, labelBaseline, lineColor, scale, showLabels, showTitle, showLines, specViewOptions, title, titlePadding, zindex } = props;\n        const axis = Object.assign(Object.assign(Object.assign(Object.assign({ zindex, scale: scale.name, orient: horizontal ? 'bottom' : 'left', domain: showLines, ticks: showLines }, showLines && {\n            domainColor: lineColor,\n            tickColor: lineColor,\n            tickSize: specViewOptions.tickSize,\n        }), showTitle && {\n            title,\n            titleAlign: horizontal ? 'left' : 'right',\n            titleAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY,\n            },\n            titleColor: specViewOptions.colors.axisText,\n            titleFontSize: {\n                signal: SignalNames.TextTitleSize,\n            },\n            titleLimit: axesTitleLimit,\n            titlePadding,\n        }), { labels: showLabels }), showLabels && {\n            labelAlign: horizontal ? 'left' : 'right',\n            labelBaseline,\n            labelAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY,\n            },\n            labelColor: specViewOptions.colors.axisText,\n            labelFontSize: {\n                signal: SignalNames.TextSize,\n            },\n            labelLimit: axesLabelLimit,\n        });\n        if (column.quantitative) {\n            axis.format = '~r';\n        }\n        return axis;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    /**\n     * Make sure that the field name is accessible via Vega's Field type\n     * https://vega.github.io/vega/docs/types/#Field\n     * examples: \"source.x\", \"target['x']\", \"[my.field]\"\n     */\n    function safeFieldName(field) {\n        return field\n            .replace(/\\\\/g, '\\\\\\\\') //escape backslashes\n            .replace(/'/g, '\\\\\\'') //escape single quotes\n            .replace(/\"/g, '\\\\\"') //escape double quotes\n            .replace(/\\./g, '\\\\.') //escape periods\n            .replace(/\\[/g, '\\\\[') //escape left square brackets\n            .replace(/\\]/g, '\\\\]') //escape right square brackets\n        ;\n    }\n    /**\n     * Make sure the field name is usable in a Vega expression\n     */\n    function exprSafeFieldName(field) {\n        //remove whitespace, period, accessors and logical modifiers\n        return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, '');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function linearScale(scaleName, domain, range, reverse, zero, nice = true) {\n        const scale = {\n            name: scaleName,\n            type: 'linear',\n            range,\n            round: true,\n            reverse,\n            domain,\n            zero,\n            nice,\n        };\n        return scale;\n    }\n    function pointScale(scaleName, data, range, field, reverse) {\n        const scale = {\n            name: scaleName,\n            type: 'point',\n            range,\n            domain: {\n                data,\n                field: safeFieldName(field),\n                sort: true,\n            },\n            padding: 0.5,\n        };\n        if (reverse !== undefined) {\n            scale.reverse = reverse;\n        }\n        return scale;\n    }\n    function binnableColorScale(scaleName, colorBin, data, field, scheme) {\n        scheme = scheme || ColorScaleNone;\n        const domain = {\n            data,\n            field: safeFieldName(field),\n        };\n        const range = {\n            scheme,\n        };\n        const reverse = { signal: SignalNames.ColorReverse };\n        if (colorBin !== 'continuous') {\n            range.count = { signal: SignalNames.ColorBinCount };\n        }\n        switch (colorBin) {\n            case 'continuous': {\n                const sequentialScale = {\n                    name: scaleName,\n                    type: 'linear',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return sequentialScale;\n            }\n            case 'quantile': {\n                const quantileScale = {\n                    name: scaleName,\n                    type: 'quantile',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return quantileScale;\n            }\n            default: {\n                const quantizeScale = {\n                    name: scaleName,\n                    type: 'quantize',\n                    domain,\n                    range,\n                    reverse,\n                };\n                return quantizeScale;\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const defaultZProportion = 0.6;\n    function textSignals(context, heightSignal) {\n        const { specViewOptions } = context;\n        const signals = [\n            {\n                name: SignalNames.ZProportion,\n                value: defaultZProportion,\n                bind: {\n                    name: specViewOptions.language.zScaleProportion,\n                    debounce,\n                    input: 'range',\n                    min: 0.1,\n                    max: 2,\n                    step: 0.1,\n                },\n            },\n            {\n                name: SignalNames.ZHeight,\n                update: `${heightSignal} * ${SignalNames.ZProportion}`,\n            },\n            {\n                name: SignalNames.TextScale,\n                value: 1.2,\n                bind: {\n                    name: specViewOptions.language.textScaleSignal,\n                    debounce,\n                    input: 'range',\n                    min: 0.5,\n                    max: 2,\n                    step: 0.1,\n                },\n            },\n            {\n                name: SignalNames.TextSize,\n                update: `${SignalNames.TextScale} * 10`,\n            },\n            {\n                name: SignalNames.TextTitleSize,\n                update: `${SignalNames.TextScale} * 15`,\n            },\n            {\n                name: SignalNames.TextAngleX,\n                value: 30,\n                bind: {\n                    name: specViewOptions.language.xAxisTextAngleSignal,\n                    debounce,\n                    input: 'range',\n                    min: 0,\n                    max: 90,\n                    step: 1,\n                },\n            },\n            {\n                name: SignalNames.TextAngleY,\n                value: 0,\n                bind: {\n                    name: specViewOptions.language.yAxisTextAngleSignal,\n                    debounce,\n                    input: 'range',\n                    min: -90,\n                    max: 0,\n                    step: 1,\n                },\n            },\n            {\n                name: SignalNames.MarkOpacity,\n                value: 1,\n                bind: {\n                    name: specViewOptions.language.markOpacitySignal,\n                    debounce,\n                    input: 'range',\n                    min: 0.1,\n                    max: 1,\n                    step: 0.05,\n                },\n            },\n        ];\n        return signals;\n    }\n    function colorBinCountSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorBinCount,\n            value: 7,\n            bind: {\n                name: specViewOptions.language.colorBinCount,\n                debounce,\n                input: 'range',\n                min: 1,\n                max: specViewOptions.maxLegends + 1,\n                step: 1,\n            },\n        };\n        return signal;\n    }\n    function colorReverseSignal(context) {\n        const { specViewOptions } = context;\n        const signal = {\n            name: SignalNames.ColorReverse,\n            value: false,\n            bind: {\n                name: specViewOptions.language.colorReverse,\n                input: 'checkbox',\n            },\n        };\n        return signal;\n    }\n    function modifySignal(s, fn, update) {\n        s.update = `${fn}((${s.update}), (${update}))`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function legend(column, fill) {\n        const legend = {\n            orient: 'none',\n            title: column.name,\n            fill,\n            encode: {\n                symbols: {\n                    update: {\n                        shape: {\n                            value: 'square',\n                        },\n                    },\n                },\n            },\n        };\n        if (column.quantitative) {\n            legend.type = 'symbol';\n            legend.format = '~r';\n        }\n        return legend;\n    }\n    function getLegends(context, fill) {\n        const { specColumns, insight } = context;\n        if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n            return [legend(specColumns.color, fill)];\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function topLookup(column, count, source, legend, lookupName, fieldName, indexName) {\n        const data = [\n            {\n                name: lookupName,\n                source,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: [safeFieldName(column.name)],\n                    },\n                    {\n                        type: 'window',\n                        ops: ['count'],\n                        as: [indexName],\n                    },\n                    {\n                        type: 'filter',\n                        expr: `datum[${JSON.stringify(indexName)}] <= ${count}`,\n                    },\n                ],\n            },\n            {\n                name: legend,\n                source,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: lookupName,\n                        key: safeFieldName(column.name),\n                        fields: [column.name].map(safeFieldName),\n                        values: [column.name].map(safeFieldName),\n                        as: [fieldName],\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum[${JSON.stringify(fieldName)}] == null ? '${Other}' : datum[${JSON.stringify(fieldName)}]`,\n                        as: fieldName,\n                    },\n                ],\n            },\n        ];\n        return data;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addColor(props) {\n        const { colorReverseSignalName, dataName, scope, legendDataName, scaleName, specContext, topLookupName } = props;\n        let colorDataName = dataName;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const legends = getLegends(specContext, scaleName);\n        if (legends) {\n            scope.legends = legends;\n        }\n        const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n        if (categoricalColor) {\n            addData(scope, ...topLookup(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, FieldNames.TopColor, FieldNames.TopIndex));\n            colorDataName = legendDataName;\n        }\n        if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n            if (specColumns.color.quantitative) {\n                addScales(scope, binnableColorScale(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n            }\n            else {\n                addScales(scope, {\n                    name: scaleName,\n                    type: 'ordinal',\n                    domain: {\n                        data: colorDataName,\n                        field: FieldNames.TopColor,\n                        sort: true,\n                    },\n                    range: {\n                        scheme: insight.scheme || ColorScaleNone,\n                    },\n                    reverse: { signal: colorReverseSignalName },\n                });\n            }\n        }\n        addSignals(scope, colorBinCountSignal(specContext), colorReverseSignal(specContext));\n        return { topColorField: FieldNames.TopColor, colorDataName };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n        const titleSignal = `parent[${JSON.stringify(FieldNames.FacetTitle)}]`;\n        const index = `datum[${JSON.stringify(FieldNames.Ordinal)}] - 1`;\n        const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index);\n        const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index);\n        addMarks(globalScope, col.header, row.footer);\n        addMarks(col.header, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center',\n                    },\n                    baseline: {\n                        value: 'middle',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    x: {\n                        signal: `${sizeSignals.layoutWidth} / 2`,\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    text: {\n                        signal: titleSignal,\n                    },\n                },\n            },\n        });\n        addMarks(row.footer, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'left',\n                    },\n                    baseline: {\n                        value: 'middle',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    y: {\n                        signal: `${sizeSignals.layoutHeight} / 2`,\n                    },\n                    limit: {\n                        signal: SignalNames.PlotOffsetRight,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    text: {\n                        signal: titleSignal,\n                    },\n                },\n            },\n        });\n    }\n    function addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n        addMarks(scope, {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center',\n                    },\n                    baseline: {\n                        value: 'bottom',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    x: {\n                        signal: `(${sizeSignals.layoutWidth}) / 2`,\n                    },\n                    text: {\n                        signal: `parent[${JSON.stringify(FieldNames.FacetTitle)}]`,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth,\n                    },\n                    y: {\n                        signal: `-${SignalNames.FacetPaddingTop} / 2`,\n                    },\n                },\n            },\n        });\n    }\n    function addFacetAxesGroupMarks(props) {\n        const { colSeqName, colTitleScale, globalScope, facetScope, plotScope, rowSeqName, rowTitleScale } = props;\n        const { sizeSignals } = facetScope;\n        const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n        const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n        const index = 'datum.data';\n        const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index);\n        const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index);\n        addData(globalScope, colSequence, rowSequence);\n        addMarks(globalScope, col.footer, row.header);\n        addScales(globalScope, colTitleScale, rowTitleScale);\n        const map = {\n            main: [\n                {\n                    scope: facetScope.facetScope,\n                    lines: true,\n                    labels: false,\n                    title: false,\n                },\n            ],\n            x: [\n                {\n                    scope: col.footer,\n                    lines: true,\n                    labels: true,\n                    title: false,\n                },\n                {\n                    scope: plotScope,\n                    scale: colTitleScale,\n                    lines: false,\n                    labels: false,\n                    title: true,\n                },\n            ],\n            y: [\n                {\n                    scope: row.header,\n                    lines: true,\n                    labels: true,\n                    title: false,\n                },\n                {\n                    scope: plotScope,\n                    scale: rowTitleScale,\n                    lines: false,\n                    labels: false,\n                    title: true,\n                },\n            ],\n        };\n        return map;\n    }\n    function facetRowHeaderFooter(data, sizeSignals, index) {\n        const rowFn = (xSignal) => {\n            return {\n                type: 'group',\n                from: { data },\n                encode: {\n                    update: {\n                        x: { signal: xSignal },\n                        y: {\n                            signal: `${SignalNames.PlotOffsetTop} + ${SignalNames.FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n                        },\n                        height: { signal: sizeSignals.layoutHeight },\n                    },\n                },\n            };\n        };\n        const header = rowFn(SignalNames.PlotOffsetLeft);\n        const footer = rowFn(`${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetRight} / 2`);\n        return { header, footer };\n    }\n    function facetColumnHeaderFooter(data, sizeSignals, index) {\n        const colFn = (ySignal) => {\n            return {\n                type: 'group',\n                from: { data },\n                encode: {\n                    update: {\n                        x: {\n                            signal: `(${index}) * (${sizeSignals.layoutWidth} + ${SignalNames.FacetPaddingLeft}) + ${SignalNames.FacetPaddingLeft} + ${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}`,\n                        },\n                        y: { signal: `${ySignal} - ${SignalNames.FacetAxesAdjustY}` },\n                        width: { signal: sizeSignals.layoutWidth },\n                    },\n                },\n            };\n        };\n        //create group marks based on data sequences\n        const header = colFn(`${SignalNames.PlotOffsetTop} / 2`);\n        const footer = colFn(`${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut}`);\n        return { header, footer };\n    }\n    function createSequence(dataName, countSignal) {\n        return {\n            name: dataName,\n            transform: [\n                {\n                    type: 'sequence',\n                    start: 0,\n                    stop: {\n                        signal: countSignal,\n                    },\n                },\n            ],\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function fill(context, colorFieldName, scale) {\n        const { specColumns, insight, specViewOptions } = context;\n        const colorColumn = specColumns.color;\n        return colorColumn ?\n            colorColumn.isColorData || insight.directColor ?\n                {\n                    field: safeFieldName(colorColumn.name),\n                }\n                :\n                    {\n                        scale,\n                        field: colorColumn.quantitative ? safeFieldName(colorColumn.name) : colorFieldName,\n                    }\n            :\n                {\n                    value: specViewOptions.colors.defaultCube,\n                };\n    }\n    function opacity(context) {\n        const result = {\n            signal: SignalNames.MarkOpacity,\n        };\n        return result;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class GlobalScope {\n        constructor(props) {\n            const { dataName, markGroup, scope, signals } = props;\n            this.scope = scope;\n            this._markGroup = markGroup;\n            this.signals = signals;\n            this.data = getDataByName(scope.data, dataName).data;\n            this._markDataName = dataName;\n            this.offsets = {\n                x: '0',\n                y: '0',\n                h: SignalNames.PlotHeightIn,\n                w: SignalNames.PlotWidthIn,\n            };\n            this.sizeSignals = {\n                layoutHeight: SignalNames.PlotHeightIn,\n                layoutWidth: SignalNames.PlotWidthIn,\n            };\n            this.zSize = SignalNames.PlotHeightIn;\n        }\n        get markDataName() {\n            return this._markDataName;\n        }\n        setMarkDataName(markDataName) {\n            this._markDataName = markDataName;\n        }\n        get markGroup() {\n            return this._markGroup;\n        }\n        setMarkGroup(markGroup) {\n            this._markGroup = markGroup;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Layout {\n        constructor(props) {\n            this.props = props;\n            this.id = props.id;\n        }\n        getGrouping() {\n            return null;\n        }\n        getAggregateSumOp() {\n            return null;\n        }\n        build() {\n            throw 'Not implemented';\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function testForCollapseSelection() {\n        return `datum.${FieldNames.Collapsed}`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class AggregateContainer extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const a = this.aggregation = this.getAggregation();\n            const p = this.prefix = `agg_${this.id}`;\n            this.names = {\n                barCount: `${p}_count`,\n                aggregateField: `${p}_aggregate_value`,\n                globalAggregateExtentSignal: `${p}_${a}_extent`,\n                scale: `scale_${p}`,\n                extentData: `data_${p}_extent`,\n                offsets: `data_${p}_offsets`,\n            };\n        }\n        getAggregateSumOp() {\n            if (this.aggregation === 'sum') {\n                const fieldOp = {\n                    field: safeFieldName(this.props.sumBy.name),\n                    op: 'sum',\n                    as: FieldNames.Sum,\n                };\n                return fieldOp;\n            }\n        }\n        build() {\n            const { aggregation, names, props } = this;\n            const { dock, globalScope, groupings, niceScale, parentScope, showAxes } = props;\n            addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal,\n            });\n            addSignals(globalScope.scope, {\n                name: props.globalAggregateMaxExtentSignal,\n                update: `${names.globalAggregateExtentSignal}[1]`,\n            });\n            const horizontal = dock === 'left';\n            const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n            const offsets = {\n                x: parentScope.offsets.x,\n                y: addOffsets(parentScope.offsets.y, dock === 'bottom' ?\n                    groupScaled\n                    :\n                        ''),\n                h: horizontal ?\n                    parentScope.offsets.h\n                    :\n                        dock === 'top'\n                            ? groupScaled\n                            : `${parentScope.offsets.h} - ${groupScaled}`,\n                w: horizontal ?\n                    groupScaled\n                    :\n                        parentScope.offsets.w,\n            };\n            const scale = {\n                type: 'linear',\n                name: names.scale,\n                domain: [\n                    0,\n                    {\n                        signal: props.globalAggregateMaxExtentSignal,\n                    },\n                ],\n                range: horizontal ?\n                    [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth,\n                        },\n                    ]\n                    :\n                        [\n                            {\n                                signal: parentScope.sizeSignals.layoutHeight,\n                            },\n                            0,\n                        ],\n                nice: niceScale,\n                zero: true,\n                reverse: dock === 'top',\n            };\n            const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n            addSignals(globalScope.scope, {\n                name: props.globalAggregateMaxExtentScaledSignal,\n                update: dock === 'bottom'\n                    ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}`\n                    : globalAggregateMaxExtentScaledValue,\n            });\n            return {\n                offsets,\n                sizeSignals: horizontal ?\n                    {\n                        layoutHeight: parentScope.sizeSignals.layoutHeight,\n                        layoutWidth: null,\n                    }\n                    :\n                        {\n                            layoutHeight: null,\n                            layoutWidth: parentScope.sizeSignals.layoutWidth,\n                        },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? [scale] : undefined,\n                        y: horizontal ? undefined : [scale],\n                    },\n                },\n                encodingRuleMap: horizontal ?\n                    {\n                        x: [{\n                                test: testForCollapseSelection(),\n                                signal: parentScope.offsets.x,\n                            }],\n                        width: [{\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            }],\n                    }\n                    :\n                        {\n                            y: [{\n                                    test: testForCollapseSelection(),\n                                    signal: dock === 'top'\n                                        ? parentScope.offsets.y\n                                        : addOffsets(parentScope.offsets.y, parentScope.offsets.h),\n                                }],\n                            height: [{\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                }],\n                        },\n            };\n        }\n        getTransforms(aggregation, groupby) {\n            const trans = {\n                type: 'joinaggregate',\n                groupby: groupby.map(safeFieldName),\n                ops: [aggregation],\n            };\n            if (aggregation === 'sum') {\n                trans.fields = [this.props.sumBy.name].map(safeFieldName);\n            }\n            return trans;\n        }\n        getAggregation() {\n            const { props } = this;\n            let s;\n            if (props.dock === 'left') {\n                s = props.axesScales.x;\n            }\n            else {\n                s = props.axesScales.y;\n            }\n            switch (s.aggregate) {\n                case 'sum':\n                    return 'sum';\n                default:\n                    return 'count';\n            }\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class AggregateSquare extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const a = this.props.aggregation;\n            const p = this.prefix = `agg_${this.id}`;\n            this.names = {\n                barCount: `${p}_count`,\n                aggregateField: `${p}_aggregate_value`,\n                globalAggregateExtentSignal: `${p}_${a}_extent`,\n                extentData: `data_${p}_extent`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { aggregation, globalScope, groupings, onBuild, parentScope } = props;\n            const { sizeSignals } = parentScope;\n            addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal,\n            });\n            const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n            const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n            const squareMaxArea = `(${[squareMaxSide, squareMaxSide].join(' * ')})`;\n            const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n            const squareArea = `(${[squareMaxArea, shrinkRatio].join(' * ')})`;\n            const squareSide = `sqrt(${squareArea})`;\n            const localAggregateMaxExtentScaled = squareSide;\n            onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n                y: addOffsets(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n                h: squareSide,\n                w: squareSide,\n            };\n            return {\n                offsets,\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                encodingRuleMap: {\n                    y: [{\n                            test: testForCollapseSelection(),\n                            signal: offsets.y,\n                        }],\n                    height: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                },\n            };\n        }\n        getTransforms(aggregation, groupby) {\n            const trans = {\n                type: 'joinaggregate',\n                groupby: groupby.map(safeFieldName),\n                ops: [aggregation],\n            };\n            if (aggregation === 'sum') {\n                trans.fields = [this.props.sumBy.name].map(safeFieldName);\n            }\n            return trans;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function dataExtent(column, signal) {\n        return {\n            type: 'extent',\n            field: safeFieldName(column.name),\n            signal,\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function binnable(prefix, domainDataName, discreteColumn, outerSignalExtents) {\n        const { column, defaultBins, maxbins, maxbinsSignalDisplayName, maxbinsSignalName } = discreteColumn;\n        if (column.quantitative) {\n            const field = `${prefix}_bin_${exprSafeFieldName(column.name)}`;\n            const fieldEnd = `${field}_end`;\n            const binSignal = `${field}_bins`;\n            const dataExtentSignal = `${field}_bin_extent`;\n            const dataExtentSpanSignal = `${field}_bin_extent_span`;\n            const outerSignal = `${field}_outer_extent`;\n            domainDataName = `${field}_sequence`; //override the data name\n            const extentTransform = dataExtent(column, dataExtentSignal);\n            let imageSignal;\n            if (outerSignalExtents) {\n                imageSignal = outerExtentSignal(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n            }\n            const maxbinsSignal = {\n                name: maxbinsSignalName,\n                value: defaultBins,\n                bind: {\n                    name: maxbinsSignalDisplayName,\n                    debounce,\n                    input: 'range',\n                    min: 1,\n                    max: maxbins,\n                    step: 1,\n                },\n            };\n            const extentSignal = (imageSignal === null || imageSignal === void 0 ? void 0 : imageSignal.name) || dataExtentSignal;\n            const binTransform = {\n                type: 'bin',\n                field: safeFieldName(column.name),\n                as: [\n                    field,\n                    fieldEnd,\n                ],\n                signal: binSignal,\n                extent: {\n                    signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`, //add a tiny bit to the upper extent to force the extra bin - https://github.com/vega/vega/issues/2899\n                },\n                minstep: shouldBeIntegralBinStep(column) ? 1 : 0,\n                maxbins: {\n                    signal: maxbinsSignalName,\n                },\n            };\n            const dataSequence = {\n                name: domainDataName,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: {\n                            signal: `${binSignal}.start`,\n                        },\n                        stop: {\n                            signal: `${binSignal}.stop`,\n                        },\n                        step: {\n                            signal: `${binSignal}.step`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data',\n                        as: field,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data + ${binSignal}.step`,\n                        as: fieldEnd,\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number'],\n                        as: [FieldNames.Ordinal],\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data === ${binSignal}.start`,\n                        as: FieldNames.First,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                        as: FieldNames.Last,\n                    },\n                    {\n                        // when there is only one bin, use only first sequence element\n                        type: 'filter',\n                        expr: `${dataExtentSpanSignal} === 0 ? datum[${JSON.stringify(FieldNames.First)}] : true`,\n                    },\n                ],\n            };\n            const signals = [\n                maxbinsSignal,\n                {\n                    name: dataExtentSpanSignal,\n                    update: `${extentSignal}[1] - ${extentSignal}[0]`,\n                },\n            ];\n            if (imageSignal) {\n                signals.push(imageSignal);\n            }\n            const augmentBinnable = {\n                discreteColumn,\n                native: false,\n                transforms: [extentTransform, binTransform],\n                fields: [field, fieldEnd],\n                binSignal,\n                extentSignal,\n                dataSequence,\n                domainDataName,\n                signals,\n                fullScaleDataname: dataSequence.name,\n            };\n            return augmentBinnable;\n        }\n        else {\n            const nativeBinnable = {\n                discreteColumn,\n                native: true,\n                fields: [column.name],\n                domainDataName,\n                fullScaleDataname: domainDataName,\n            };\n            return nativeBinnable;\n        }\n    }\n    function outerExtentSignal(name, min, max, dataExtent) {\n        return {\n            name,\n            update: `[min(${min}, ${dataExtent}[0]), max(${max}, ${dataExtent}[1])]`,\n        };\n    }\n    function shouldBeIntegralBinStep(column) {\n        //prevent Vega from showing \".5\" steps between integer scale values\n        return column.quantitative && (column.type === 'integer' && (column.stats.max - column.stats.min) <= 7);\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const bandScaleLinearSuffix = '_linear';\n    class Band extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `band_${this.id}`;\n            this.names = {\n                xScale: `scale_${p}_x`,\n                yScale: `scale_${p}_y`,\n                bandWidth: `${p}_bandwidth`,\n                accumulative: `${p}_accumulative`,\n            };\n            this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n        }\n        getGrouping() {\n            return this.bin.fields;\n        }\n        build() {\n            const { bin, names, props } = this;\n            const { globalScope, minBandWidth, orientation, parentScope, showAxes } = props;\n            const binField = bin.fields[0];\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n            }\n            //TODO don't add this, use existing dataset\n            addData(globalScope.scope, {\n                name: names.accumulative,\n                source: bin.fullScaleDataname,\n                transform: [\n                    {\n                        type: 'aggregate',\n                        groupby: this.getGrouping().map(safeFieldName),\n                        ops: ['count'],\n                    },\n                ],\n            });\n            const horizontal = orientation === 'horizontal';\n            const minCellSignal = (horizontal) ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n            modifySignal(minCellSignal, 'max', `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n            addSignals(globalScope.scope, {\n                name: names.bandWidth,\n                update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`,\n            });\n            const scale = this.getScale(bin, horizontal);\n            if (props.outerSignalExtents && bin.native === false) {\n                //add a linear scale for use by background image\n                addScales(globalScope.scope, linearScale(scale.name + bandScaleLinearSuffix, { signal: bin.extentSignal }, scale.range, scale.reverse, false, false));\n            }\n            let encodingRuleMap;\n            if (!props.excludeEncodingRuleMap) {\n                encodingRuleMap = horizontal ?\n                    {\n                        x: [\n                            {\n                                test: testForCollapseSelection(),\n                                signal: parentScope.offsets.x,\n                            },\n                        ],\n                        width: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                        ],\n                    }\n                    :\n                        {\n                            y: [\n                                {\n                                    test: testForCollapseSelection(),\n                                    signal: addOffsets(parentScope.offsets.y, parentScope.offsets.h),\n                                },\n                            ],\n                            height: [\n                                {\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                },\n                            ],\n                        };\n            }\n            return {\n                offsets: this.getOffset(horizontal, binField),\n                sizeSignals: horizontal ?\n                    {\n                        layoutHeight: names.bandWidth,\n                        layoutWidth: parentScope.sizeSignals.layoutWidth,\n                    }\n                    :\n                        {\n                            layoutHeight: parentScope.sizeSignals.layoutHeight,\n                            layoutWidth: names.bandWidth,\n                        },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? undefined : [scale],\n                        y: horizontal ? [scale] : undefined,\n                    },\n                },\n                encodingRuleMap,\n            };\n        }\n        getOffset(horizontal, binField) {\n            const { names, props } = this;\n            const { parentScope } = props;\n            return {\n                x: addOffsets(parentScope.offsets.x, horizontal ?\n                    ''\n                    :\n                        `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n                y: addOffsets(parentScope.offsets.y, horizontal ?\n                    `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])`\n                    :\n                        ''),\n                h: horizontal ?\n                    names.bandWidth\n                    :\n                        parentScope.offsets.h,\n                w: horizontal ?\n                    parentScope.offsets.w\n                    :\n                        names.bandWidth,\n            };\n        }\n        getScale(bin, horizontal) {\n            const { names } = this;\n            const { parentScope } = this.props;\n            const binField = safeFieldName(bin.fields[0]);\n            let bandScale;\n            if (horizontal) {\n                bandScale = {\n                    type: 'band',\n                    name: names.yScale,\n                    range: [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutHeight,\n                        },\n                    ],\n                    padding: 0.1,\n                    domain: {\n                        data: bin.domainDataName,\n                        field: binField,\n                        sort: true,\n                    },\n                    reverse: true,\n                };\n            }\n            else {\n                bandScale = {\n                    type: 'band',\n                    name: names.xScale,\n                    range: [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth,\n                        },\n                    ],\n                    padding: 0.1,\n                    domain: {\n                        data: bin.domainDataName,\n                        field: binField,\n                        sort: true,\n                    },\n                };\n            }\n            return bandScale;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function displayBin(bin) {\n        const val = (index) => `datum[${JSON.stringify(bin.fields[index])}]`;\n        return bin.discreteColumn.column.quantitative ?\n            `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')`\n            :\n                val(0);\n    }\n    function obj(nameValues, clause) {\n        return `{${nameValues.join()}}`;\n    }\n    function serializeAsVegaExpression(bin, firstFieldName, lastFieldName, clause) {\n        if (bin.discreteColumn.column.quantitative) {\n            const low = [\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'>=\\'',\n                `value:datum[${JSON.stringify(bin.fields[0])}]`,\n            ];\n            const high = [\n                'clause:\\'&&\\'',\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'<\\'',\n                `value:datum[${JSON.stringify(bin.fields[1])}]`,\n            ];\n            return obj([\n                `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`,\n            ]);\n        }\n        else {\n            const exact = [\n                `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n                'operator:\\'==\\'',\n                `value:datum[${JSON.stringify(bin.fields[0])}]`,\n            ];\n            return obj([\n                `expressions:[${obj(exact)}]`,\n            ]);\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function createOrdinals(source, prefix, binFields, sortOrder) {\n        const _binFields = binFields.map(safeFieldName);\n        const dataName = `${prefix}_bin_order`;\n        const data = {\n            name: dataName,\n            source,\n            transform: [\n                {\n                    type: 'aggregate',\n                    groupby: _binFields,\n                },\n                {\n                    type: 'collect',\n                    sort: {\n                        field: _binFields,\n                        order: _binFields.map(f => sortOrder),\n                    },\n                },\n                {\n                    type: 'window',\n                    ops: ['row_number'],\n                    as: [FieldNames.Ordinal],\n                },\n            ],\n        };\n        return {\n            data,\n            scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields),\n        };\n    }\n    function ordinalScale(dataName, scaleName, binFields) {\n        return {\n            type: 'ordinal',\n            name: scaleName,\n            domain: {\n                data: dataName,\n                field: safeFieldName(binFields[0]),\n            },\n            range: {\n                data: dataName,\n                field: FieldNames.Ordinal,\n            },\n        };\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Cross extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `cross_${this.id}`;\n            this.binX = binnable(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n            this.binY = binnable(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n            this.names = {\n                facetDataName: `data_${p}_facet`,\n                searchUnion: `data_${p}_search`,\n                dimScale: `scale_${p}`,\n                dimCount: `${p}_count`,\n                dimCategorical: `data_${p}_cat`,\n                dimCellSize: `${p}_cell_size`,\n                dimCellSizeCalc: `${p}_cell_calc`,\n            };\n        }\n        getGrouping() {\n            return this.binX.fields.concat(this.binY.fields);\n        }\n        build() {\n            const { binX, binY, names, prefix, props } = this;\n            const { axisTextColor, colRowTitles, globalScope, parentScope } = props;\n            const titles = { x: { dataName: null, quantitative: null }, y: { dataName: null, quantitative: null } };\n            const dx = {\n                dim: 'x',\n                bin: binX,\n                sortOrder: 'ascending',\n                size: parentScope.sizeSignals.layoutWidth,\n                layout: parentScope.sizeSignals.layoutWidth,\n                min: globalScope.signals.minCellWidth.name,\n                out: globalScope.signals.plotWidthOut,\n                offset: SignalNames.FacetPaddingLeft,\n                padding: SignalNames.FacetPaddingLeft,\n                dataOut: null,\n                scaleName: null,\n                position: null,\n            };\n            const dy = {\n                dim: 'y',\n                bin: binY,\n                sortOrder: 'ascending',\n                size: parentScope.sizeSignals.layoutHeight,\n                layout: parentScope.sizeSignals.layoutHeight,\n                min: globalScope.signals.minCellHeight.name,\n                out: globalScope.signals.plotHeightOut,\n                offset: SignalNames.FacetPaddingTop,\n                padding: `(${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n                dataOut: null,\n                scaleName: null,\n                position: null,\n            };\n            const dimensions = [dx, dy];\n            dimensions.forEach(d => {\n                const { bin, dim, padding, sortOrder } = d;\n                let data;\n                let dataName;\n                let countSignal;\n                let scale;\n                const titleSource = titles[dim];\n                if (bin.native === false) {\n                    addSignals(globalScope.scope, ...bin.signals);\n                    addTransforms(globalScope.data, ...bin.transforms);\n                    addData(globalScope.scope, bin.dataSequence);\n                    addTransforms(bin.dataSequence, {\n                        type: 'formula',\n                        expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                        as: FieldNames.Contains,\n                    });\n                    data = bin.dataSequence;\n                    dataName = bin.dataSequence.name;\n                    countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                    scale = ordinalScale(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                    titleSource.dataName = bin.dataSequence.name;\n                }\n                else {\n                    dataName = globalScope.markDataName;\n                    const ord = createOrdinals(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                    data = ord.data;\n                    addData(globalScope.scope, ord.data);\n                    countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                    scale = ord.scale;\n                    titleSource.dataName = ord.data.name;\n                }\n                titleSource.quantitative = bin.discreteColumn.column.quantitative;\n                d.dataOut = data;\n                d.scaleName = scale.name;\n                addTransforms(data, {\n                    type: 'formula',\n                    expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                    as: FieldNames.FacetSearch,\n                }, {\n                    type: 'formula',\n                    expr: displayBin(bin),\n                    as: FieldNames.FacetTitle,\n                });\n                addScales(globalScope.scope, scale);\n                const count = `${names.dimCount}_${dim}`;\n                const calc = `${names.dimCellSizeCalc}_${dim}`;\n                const size = `${names.dimCellSize}_${dim}`;\n                addSignals(globalScope.scope, { name: count, update: countSignal });\n                addSignals(globalScope.scope, {\n                    name: calc,\n                    update: `${d.layout} / ${count}`,\n                }, {\n                    name: size,\n                    update: `max(${d.min}, (${calc} - ${padding}))`,\n                });\n                modifySignal(d.out, 'max', `((${size} + ${padding}) * ${count})`);\n                d.position = this.dimensionOffset(d);\n            });\n            const groupRow = {\n                type: 'group',\n                encode: {\n                    update: {\n                        y: {\n                            signal: dy.position,\n                        },\n                    },\n                },\n                from: {\n                    data: dy.dataOut.name,\n                },\n                data: [\n                    {\n                        name: names.searchUnion,\n                        source: dx.dataOut.name,\n                        transform: [\n                            {\n                                type: 'formula',\n                                expr: `[datum[${JSON.stringify(FieldNames.FacetSearch)}], merge(parent[${JSON.stringify(FieldNames.FacetSearch)}], { clause: '&&'})]`,\n                                as: FieldNames.FacetSearch,\n                            },\n                        ],\n                    },\n                ],\n            };\n            const groupCol = {\n                style: 'cell',\n                name: prefix,\n                type: 'group',\n                encode: {\n                    update: {\n                        height: {\n                            signal: `${names.dimCellSize}_y`,\n                        },\n                        width: {\n                            signal: `${names.dimCellSize}_x`,\n                        },\n                        x: {\n                            signal: dx.position,\n                        },\n                    },\n                },\n                from: {\n                    data: names.searchUnion,\n                },\n            };\n            addMarks(globalScope.markGroup, groupRow);\n            addMarks(groupRow, groupCol);\n            const offsets = {\n                x: this.dimensionOffset(dx),\n                y: this.dimensionOffset(dy),\n                h: `${names.dimCellSize}_y`,\n                w: `${names.dimCellSize}_x`,\n            };\n            const sizeSignals = {\n                layoutHeight: `${names.dimCellSize}_y`,\n                layoutWidth: `${names.dimCellSize}_x`,\n                colCount: `${names.dimCount}_x`,\n                rowCount: `${names.dimCount}_y`,\n            };\n            if (colRowTitles) {\n                addFacetColRowTitles(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n            }\n            return {\n                facetScope: groupCol,\n                offsets,\n                sizeSignals,\n                titles,\n            };\n        }\n        dimensionOffset(d) {\n            const { names } = this;\n            return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Scatter extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `scatter_${this.id}`;\n            this.names = {\n                aggregateData: `data_${p}_aggregate`,\n                markData: `data_${p}_mark`,\n                xDataExtent: `${p}_xDataExtent`,\n                yDataExtent: `${p}_yDataExtent`,\n                xExtent: `${p}_xExtent`,\n                yExtent: `${p}_yExtent`,\n                sizeExtent: `${p}_sizeExtent`,\n                sizeRange: `${p}_sizeRange`,\n                sizeScale: `${p}_sizeScale`,\n                xScale: `scale_${p}_x`,\n                yScale: `scale_${p}_y`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { backgroundImageExtents, globalScope, parentScope, scatterPointScaleDisplay, showAxes, size, view, x, y, z, zGrounded } = props;\n            const qsize = size && size.quantitative && size;\n            addSignals(globalScope.scope, {\n                name: SignalNames.PointScale,\n                value: 5,\n                bind: {\n                    name: scatterPointScaleDisplay,\n                    debounce,\n                    input: 'range',\n                    min: 1,\n                    max: 10,\n                    step: 0.1,\n                },\n            }, {\n                name: SignalNames.ZGrounded,\n                value: false,\n                bind: {\n                    name: zGrounded,\n                    input: 'checkbox',\n                },\n            });\n            if (backgroundImageExtents) {\n                addTransforms(globalScope.data, dataExtent(x, names.xDataExtent), dataExtent(y, names.yDataExtent));\n                const xSignal = outerExtentSignal(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n                const ySignal = outerExtentSignal(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n                addSignals(globalScope.scope, xSignal, ySignal);\n            }\n            if (qsize) {\n                addTransforms(globalScope.data, {\n                    type: 'extent',\n                    field: safeFieldName(qsize.name),\n                    signal: names.sizeExtent,\n                });\n                addScales(globalScope.scope, {\n                    name: names.sizeScale,\n                    type: 'pow',\n                    exponent: 0.5,\n                    domain: [0, { signal: `${names.sizeExtent}[1]` }],\n                    range: [0, { signal: names.sizeRange }],\n                });\n                addSignals(globalScope.scope, {\n                    name: names.sizeRange,\n                    update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${scatterSizedDiv}`,\n                });\n            }\n            addData(globalScope.scope, {\n                name: names.markData,\n                source: globalScope.markDataName,\n                transform: [x, y, z].map(c => {\n                    if (!c || !c.quantitative)\n                        return;\n                    const t = {\n                        type: 'filter',\n                        expr: `isValid(datum[${JSON.stringify(c.name)}])`,\n                    };\n                    return t;\n                }).filter(Boolean),\n            });\n            globalScope.setMarkDataName(names.markData);\n            const globalScales = { showAxes, scales: {} };\n            const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n            const sizeValueSignal = qsize ?\n                `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${SignalNames.PointScale}`\n                : SignalNames.PointScale;\n            const update = Object.assign({ height: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: sizeValueSignal,\n                    },\n                ], width: {\n                    signal: sizeValueSignal,\n                } }, z && {\n                z: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`,\n                    },\n                ],\n                zindex: [\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`,\n                    },\n                ],\n                depth: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: view === '3d'\n                            ? `${SignalNames.ZGrounded} ? ${zValue} : ${sizeValueSignal}`\n                            : '0',\n                    },\n                ],\n            });\n            const columnSignals = [\n                {\n                    column: x,\n                    xyz: 'x',\n                    scaleName: names.xScale,\n                    domain: backgroundImageExtents ?\n                        {\n                            signal: names.xExtent,\n                        }\n                        :\n                            {\n                                data: globalScope.data.name,\n                                field: safeFieldName(x.name),\n                            },\n                    reverse: false,\n                    signal: parentScope.sizeSignals.layoutWidth,\n                },\n                {\n                    column: y,\n                    xyz: 'y',\n                    scaleName: names.yScale,\n                    domain: backgroundImageExtents ?\n                        {\n                            signal: names.yExtent,\n                        }\n                        :\n                            {\n                                data: globalScope.data.name,\n                                field: safeFieldName(y.name),\n                            },\n                    reverse: true,\n                    signal: parentScope.sizeSignals.layoutHeight,\n                },\n                {\n                    column: z,\n                    xyz: 'z',\n                    scaleName: names.zScale,\n                    domain: {\n                        data: globalScope.data.name,\n                        field: z ? safeFieldName(z.name) : null,\n                    },\n                    reverse: false,\n                    signal: view === '3d'\n                        ? `(${globalScope.zSize}) * ${SignalNames.ZProportion}`\n                        : `10 * ${SignalNames.ZProportion}`,\n                },\n            ];\n            columnSignals.forEach(cs => {\n                const { column, domain, reverse, scaleName, signal, xyz } = cs;\n                if (!column)\n                    return;\n                let scale;\n                if (column.quantitative) {\n                    scale = linearScale(scaleName, domain, [0, { signal }], reverse, false, showAxes);\n                    if (shouldBeIntegralBinStep(column)) {\n                        scale.bins = { step: 1 };\n                    }\n                }\n                else {\n                    scale = pointScale(scaleName, globalScope.data.name, [0, { signal }], column.name, reverse);\n                }\n                globalScales.scales[xyz] = [scale];\n            });\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: globalScope.markDataName },\n                encode: { update },\n            };\n            addMarks(globalScope.markGroup, mark);\n            return {\n                offsets: {\n                    x: addOffsets(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                    y: addOffsets(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                    h: sizeValueSignal,\n                    w: sizeValueSignal,\n                },\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                globalScales,\n                mark,\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: addOffsets(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight),\n                        },\n                    ],\n                },\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function addZScale(z, zSize, dataName, zScaleName) {\n        if (z) {\n            const zRange = [0, { signal: `(${zSize}) * ${SignalNames.ZProportion}` }];\n            const scale = z.quantitative\n                ?\n                    linearScale(zScaleName, {\n                        data: dataName,\n                        field: safeFieldName(z.name),\n                    }, zRange, false, true)\n                :\n                    pointScale(zScaleName, dataName, zRange, z.name, false);\n            return scale;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Square extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `square_${this.id}`;\n            this.names = {\n                bandWidth: this.getBandWidth(),\n                maxGroupField: `${p}_max_group`,\n                maxGroupSignal: `${p}_max_grouping`,\n                stack0: `${p}_stack0`,\n                stack1: `${p}_stack1`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { fillDirection, globalScope, groupings, parentScope, collapseYHeight, showAxes, sortBy, view, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            addTransforms(globalScope.data, Object.assign({ type: 'stack', groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sortBy && {\n                sort: {\n                    field: safeFieldName(sortBy.name),\n                    order: 'ascending',\n                },\n            }));\n            const { gap, levelSize, size, squaresPerBand } = this.addSignals();\n            const heightSignal = {\n                signal: fillDirection === 'down-right' ? size : levelSize,\n            };\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: {\n                    data: globalScope.markDataName,\n                },\n                encode: {\n                    update: Object.assign({ height: collapseYHeight ?\n                            [\n                                {\n                                    test: testForCollapseSelection(),\n                                    value: 0,\n                                },\n                                heightSignal,\n                            ]\n                            :\n                                heightSignal, width: {\n                            signal: fillDirection === 'down-right' ? levelSize : size,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            const { tx, ty } = this.transformXY(gap, levelSize, squaresPerBand);\n            return Object.assign(Object.assign(Object.assign({}, z && {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n            }), { offsets: {\n                    x: addOffsets(parentScope.offsets.x, tx.expr),\n                    y: addOffsets(parentScope.offsets.y, ty.expr),\n                    h: size,\n                    w: size,\n                }, mark, sizeSignals: {\n                    layoutHeight: size,\n                    layoutWidth: size,\n                } }), collapseYHeight && {\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y,\n                        },\n                    ],\n                },\n            });\n        }\n        getBandWidth() {\n            const { offsets } = this.props.parentScope;\n            switch (this.props.fillDirection) {\n                case 'down-right':\n                    return offsets.h;\n                default:\n                    return offsets.w;\n            }\n        }\n        addSignals() {\n            const { names, props } = this;\n            const { fillDirection, globalScope, groupings, parentScope } = props;\n            let { maxGroupedFillSize, maxGroupedUnits } = props;\n            if (!maxGroupedUnits) {\n                if (groupings) {\n                    addTransforms(globalScope.data, {\n                        type: 'joinaggregate',\n                        groupby: getGroupBy(groupings).map(safeFieldName),\n                        ops: ['count'],\n                        as: [names.maxGroupField],\n                    }, {\n                        type: 'extent',\n                        field: names.maxGroupField,\n                        signal: names.maxGroupSignal,\n                    });\n                    maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n                }\n                else {\n                    maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n                }\n            }\n            if (!maxGroupedFillSize) {\n                maxGroupedFillSize = fillDirection === 'down-right' ? parentScope.offsets.w : parentScope.offsets.h;\n            }\n            const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n            const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n            const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n            const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n            const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n            const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n            return { gap, levelSize, size, squaresPerBand };\n        }\n        transformXY(gap, levelSize, squaresPerBand) {\n            const { names, prefix } = this;\n            const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n            const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n            const { fillDirection, parentScope } = this.props;\n            const tx = {\n                type: 'formula',\n                expr: null,\n                as: `${prefix}_${FieldNames.OffsetX}`,\n            };\n            const ty = {\n                type: 'formula',\n                expr: null,\n                as: `${prefix}_${FieldNames.OffsetY}`,\n            };\n            switch (fillDirection) {\n                case 'down-right': {\n                    tx.expr = `${level} * (${levelSize} + ${gap})`;\n                    ty.expr = compartment;\n                    break;\n                }\n                case 'right-up': {\n                    tx.expr = compartment;\n                    ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                    break;\n                }\n                case 'right-down':\n                default: {\n                    tx.expr = compartment;\n                    ty.expr = `${level} * (${levelSize} + ${gap})`;\n                    break;\n                }\n            }\n            return { tx, ty };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Stack extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `stack_${this.id}`;\n            this.names = {\n                cube: `${p}_cube`,\n                globalDataName: `data_${p}_count`,\n                globalExtent: `${p}_global_extent`,\n                levelDataName: `data_${p}_level`,\n                count: `${p}_count`,\n                stack0: `${p}_stack0`,\n                stack1: `${p}_stack1`,\n                sequence: `data_${p}_sequence`,\n                sides: `${p}_sides`,\n                size: `${p}_size`,\n                squared: `${p}_squared`,\n                maxCount: `${p}_maxCount`,\n                maxLevels: `${p}_maxLevels`,\n                zScale: `${p}_zScale`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { globalScope, groupings, parentScope, showAxes, sort } = props;\n            const { sizeSignals } = parentScope;\n            addTransforms(globalScope.data, {\n                type: 'joinaggregate',\n                groupby: getGroupBy(groupings).map(safeFieldName),\n                ops: ['count'],\n                as: [names.count],\n            }, {\n                type: 'extent',\n                field: names.count,\n                signal: names.globalExtent,\n            }, Object.assign({ type: 'stack', groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sort && {\n                sort: {\n                    field: safeFieldName(sort.name),\n                    order: 'ascending',\n                },\n            }));\n            addData(globalScope.scope, {\n                name: names.sequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `sqrt(${names.globalExtent}[1])`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data * datum.data',\n                        as: 'squared',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                        as: 'maxlevels',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                        as: 'side',\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.side * datum.maxlevels + datum.maxlevels - 1',\n                        as: 'sidecubeheight',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                        as: 'heightmatch',\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: 'heightmatch',\n                            order: 'ascending',\n                        },\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number'],\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.row_number === 1',\n                    },\n                ],\n            });\n            addSignals(globalScope.scope, {\n                name: names.size,\n                update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`,\n            }, {\n                name: names.squared,\n                update: `data('${names.sequence}')[0].squared`,\n            }, {\n                name: names.sides,\n                update: `sqrt(${names.squared})`,\n            }, {\n                name: names.cube,\n                update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`,\n            }, {\n                name: names.maxLevels,\n                update: `data('${names.sequence}')[0].maxlevels`,\n            }, {\n                name: names.maxCount,\n                update: `${names.maxLevels} * ${names.squared}`,\n            });\n            const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n            const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n            const cubeX = `(${layerOrdinal} % ${names.sides})`;\n            const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n            const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n            const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n                y: addOffsets(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n                h: names.size,\n                w: names.size,\n            };\n            const mark = {\n                type: 'rect',\n                from: { data: this.names.levelDataName },\n                encode: {\n                    update: {\n                        z: {\n                            signal: `${zLevel} * (${names.cube} + 1)`,\n                        },\n                        height: {\n                            signal: names.cube,\n                        },\n                        width: {\n                            signal: names.cube,\n                        },\n                        depth: {\n                            signal: names.cube,\n                        },\n                    },\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            const zScale = {\n                type: 'linear',\n                name: names.zScale,\n                domain: [\n                    0,\n                    {\n                        signal: names.maxCount,\n                    },\n                ],\n                range: [\n                    0,\n                    {\n                        signal: `${names.maxLevels} * (${names.cube} + 1) - 1`,\n                    },\n                ],\n                nice: false,\n            };\n            return {\n                offsets,\n                mark,\n                sizeSignals: {\n                    layoutHeight: names.size,\n                    layoutWidth: names.size,\n                },\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n                encodingRuleMap: {\n                    y: [{\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y,\n                        }],\n                    z: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                    depth: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                    height: [{\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        }],\n                },\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Strip extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `strip_${this.id}`;\n            this.names = {\n                firstField: `${p}${FieldNames.First}`,\n                lastField: `${p}${FieldNames.Last}`,\n                valueField: `${p}${FieldNames.Value}`,\n                scale: `scale_${p}`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, prefix, props } = this;\n            const { addPercentageScale, globalScope, groupings, orientation, showAxes, size, sort, sortOrder, parentScope, view, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            const horizontal = orientation === 'horizontal';\n            const transform = [];\n            if (sort) {\n                transform.push({\n                    type: 'collect',\n                    sort: {\n                        field: safeFieldName(sort.name),\n                        order: sortOrder,\n                    },\n                });\n            }\n            let stackField;\n            if (size) {\n                stackField = size.name;\n                transform.push({\n                    type: 'filter',\n                    expr: `datum[${JSON.stringify(size.name)}] > 0`,\n                });\n            }\n            else {\n                stackField = names.valueField;\n                transform.push({\n                    type: 'formula',\n                    expr: '1',\n                    as: stackField,\n                });\n            }\n            const stackTransform = {\n                type: 'stack',\n                field: safeFieldName(stackField),\n                offset: 'normalize',\n                as: [names.firstField, names.lastField],\n            };\n            if (groupings.length) {\n                stackTransform.groupby = getGroupBy(groupings).map(safeFieldName);\n            }\n            transform.push(stackTransform);\n            addTransforms(globalScope.data, ...transform);\n            const span = [names.lastField, names.firstField].map(f => `datum[${JSON.stringify(f)}]`).join(' - ');\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, horizontal ?\n                    `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})`\n                    :\n                        ''),\n                y: addOffsets(parentScope.offsets.y, horizontal ?\n                    ''\n                    :\n                        `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n                h: horizontal\n                    ? parentScope.offsets.h\n                    : `(${span}) * (${parentScope.offsets.h})`,\n                w: horizontal\n                    ? `(${span}) * (${parentScope.offsets.w})`\n                    : parentScope.offsets.w,\n            };\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: globalScope.markDataName },\n                encode: {\n                    update: Object.assign({ height: {\n                            signal: offsets.h,\n                        }, width: {\n                            signal: offsets.w,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(globalScope.markGroup, mark);\n            let percentageScale;\n            if (addPercentageScale) {\n                percentageScale = [{\n                        type: 'linear',\n                        name: names.scale,\n                        domain: [0, 100],\n                        range: horizontal ?\n                            [\n                                0,\n                                {\n                                    signal: parentScope.sizeSignals.layoutWidth,\n                                },\n                            ]\n                            :\n                                [\n                                    {\n                                        signal: parentScope.sizeSignals.layoutHeight,\n                                    },\n                                    0,\n                                ],\n                    }];\n            }\n            return {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        x: horizontal ? percentageScale : undefined,\n                        y: horizontal ? undefined : percentageScale,\n                        z: zScale && [zScale],\n                    },\n                },\n                offsets,\n                sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                },\n                mark,\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Treemap extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `treemap_${this.id}`;\n            this.names = {\n                dataName: `data_${p}`,\n                dataHeightWidth: `data_${p}_hw`,\n                dataExtents: `data_${p}_extents`,\n                dataFacet: `data_${p}_facet`,\n                dataFacetMark: `data_${p}_facetMark`,\n                fieldChildren: `${p}_children`,\n                fieldDepth: `${p}_depth`,\n                fieldX0: `${p}_x0`,\n                fieldX1: `${p}_x1`,\n                fieldY0: `${p}_y0`,\n                fieldY1: `${p}_y1`,\n                fieldHeight: `${p}_h`,\n                fieldWidth: `${p}_w`,\n                heightExtent: `${p}_heightExtent`,\n                widthExtent: `${p}_widthExtent`,\n                zScale: `scale_${p}_z`,\n            };\n        }\n        build() {\n            const { names, props } = this;\n            const { globalScope, parentScope, showAxes, treeMapMethod, z } = props;\n            const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n            const offsets = {\n                x: addOffsets(parentScope.offsets.x, fn(names.fieldX0)),\n                y: addOffsets(parentScope.offsets.y, fn(names.fieldY0)),\n                h: subtract(names.fieldY1, names.fieldY0),\n                w: subtract(names.fieldX1, names.fieldX0),\n            };\n            const mark = this.transformedMark(offsets);\n            addSignals(globalScope.scope, {\n                name: SignalNames.TreeMapMethod,\n                value: 'squarify',\n                bind: {\n                    name: treeMapMethod,\n                    input: 'select',\n                    options: [\n                        'squarify', 'binary',\n                    ],\n                },\n            });\n            return Object.assign(Object.assign({}, z && {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n            }), { mark,\n                offsets, sizeSignals: {\n                    layoutHeight: null,\n                    layoutWidth: null,\n                } });\n        }\n        transformedMark(offsets) {\n            const { names, props } = this;\n            const { globalScope, groupings, parentScope } = props;\n            if (groupings.length) {\n                //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n                addData(globalScope.scope, {\n                    name: names.dataHeightWidth,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.h,\n                            as: names.fieldHeight,\n                        },\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.w,\n                            as: names.fieldWidth,\n                        },\n                    ],\n                });\n                const treemapData = {\n                    name: names.dataFacetMark,\n                    source: names.dataFacet,\n                };\n                const facets = {\n                    type: 'group',\n                    from: {\n                        facet: {\n                            name: names.dataFacet,\n                            data: names.dataHeightWidth,\n                            groupby: getGroupBy(groupings).map(safeFieldName),\n                        },\n                    },\n                    data: [\n                        {\n                            name: names.dataExtents,\n                            source: names.dataFacet,\n                            transform: [\n                                {\n                                    type: 'extent',\n                                    field: names.fieldHeight,\n                                    signal: names.heightExtent,\n                                },\n                                {\n                                    type: 'extent',\n                                    field: names.fieldWidth,\n                                    signal: names.widthExtent,\n                                },\n                            ],\n                        },\n                        treemapData,\n                    ],\n                };\n                globalScope.setMarkDataName(names.dataFacetMark);\n                addMarks(globalScope.markGroup, facets);\n                //assign new markgroup after adding mark to original group\n                globalScope.setMarkGroup(facets);\n                this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n                return this.addMark(offsets, facets, globalScope.markDataName);\n            }\n            else {\n                this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n                return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n            }\n        }\n        addMark(offsets, markParent, markDataName) {\n            const { names, prefix, props } = this;\n            const { view, z } = props;\n            const mark = {\n                name: prefix,\n                type: 'rect',\n                from: { data: markDataName },\n                encode: {\n                    update: Object.assign({ width: {\n                            signal: offsets.w,\n                        }, height: {\n                            signal: offsets.h,\n                        } }, z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                    {\n                                        scale: names.zScale,\n                                        field: safeFieldName(z.name),\n                                    }\n                                :\n                                    {\n                                        value: 0,\n                                    },\n                        ],\n                    }),\n                },\n            };\n            addMarks(markParent, mark);\n            return mark;\n        }\n        treemapTransform(treemapData, widthSignal, heightSignal) {\n            const { names, props } = this;\n            const { group, size } = props;\n            addTransforms(treemapData, {\n                type: 'filter',\n                expr: `datum[${JSON.stringify(size.name)}] > 0`,\n            }, {\n                type: 'nest',\n                keys: [(group && group.name) || '__NONE__'],\n            }, {\n                type: 'treemap',\n                field: safeFieldName(size.name),\n                sort: { field: 'value', order: 'descending' },\n                round: true,\n                method: { signal: SignalNames.TreeMapMethod },\n                paddingInner: 1,\n                paddingOuter: 0,\n                size: [\n                    { signal: widthSignal },\n                    { signal: heightSignal },\n                ],\n                as: [\n                    names.fieldX0,\n                    names.fieldY0,\n                    names.fieldX1,\n                    names.fieldY1,\n                    names.fieldDepth,\n                    names.fieldChildren,\n                ],\n            });\n        }\n    }\n    function fn(n) {\n        return `datum[${JSON.stringify(n)}]`;\n    }\n    function subtract(...fields) {\n        return fields.map(n => fn(n)).join(' - ');\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class Wrap extends Layout {\n        constructor(props) {\n            super(props);\n            this.props = props;\n            const p = this.prefix = `wrap_${this.id}`;\n            this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n            this.names = {\n                outputData: `data_${p}_out`,\n                rowColumnDataName: `data_${p}_row_col`,\n                cellHeight: `${p}_cellHeight`,\n                cellWidth: `${p}_cellWidth`,\n                fits: `${p}_fits`,\n                target: `${p}_target`,\n                minArea: `${p}_minArea`,\n                aspect: `${p}_aspect`,\n                minAspect: `${p}_minAspect`,\n                idealAspect: `${p}_idealAspect`,\n                dataLength: `${p}_dataLength`,\n                rxc0: `${p}_rxc0`,\n                rxc1: `${p}_rxc1`,\n                rxc2: `${p}_rxc2`,\n                rxc: `${p}_rxc`,\n                growColCount: `${p}_growColCount`,\n                growCellWidth: `${p}_growCellWidth`,\n                fitsArea: `${p}_fitsArea`,\n                colCount: `${p}_colCount`,\n            };\n        }\n        getGrouping() {\n            return this.bin.fields;\n        }\n        build() {\n            const { bin, names, prefix, props } = this;\n            const { axisTextColor, cellTitles, globalScope, parentScope } = props;\n            let ordinalBinData;\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n                addTransforms(bin.dataSequence, {\n                    type: 'formula',\n                    expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                    as: FieldNames.Contains,\n                });\n                ordinalBinData = bin.dataSequence.name;\n            }\n            else {\n                const ord = createOrdinals(globalScope.data.name, prefix, bin.fields, 'ascending');\n                addData(globalScope.scope, ord.data);\n                ordinalBinData = ord.data.name;\n            }\n            addData(globalScope.scope, {\n                name: names.rxc0,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `ceil(sqrt(${names.dataLength})) + 1`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.data)`,\n                        as: 'complement',\n                    },\n                ],\n            }, {\n                name: names.rxc1,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['data'],\n                        as: ['cols'],\n                    },\n                ],\n            }, {\n                name: names.rxc2,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['complement'],\n                        as: ['cols'],\n                    },\n                ],\n            }, {\n                name: names.rxc,\n                source: [names.rxc1, names.rxc2],\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.cols)`,\n                        as: 'rows',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                        as: 'cellw',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.cols === 1 ? max(datum.cellw, ${SignalNames.MinCellWidth}) : datum.cellw`,\n                        as: 'cellw',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                        as: 'cellh',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.rows === 1 ? max(datum.cellh, ${SignalNames.MinCellHeight}) : datum.cellh`,\n                        as: 'cellh',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum.cellw >= ${SignalNames.MinCellWidth} && datum.cellh >= ${SignalNames.MinCellHeight})`,\n                        as: 'meetsmin',\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.meetsmin',\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.cellw / datum.cellh',\n                        as: names.aspect,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(datum.${names.aspect} - ${names.target})`,\n                        as: names.idealAspect,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                        as: 'coverage',\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: [names.idealAspect, 'coverage'],\n                            order: ['ascending', 'descending'],\n                        },\n                    },\n                ],\n            }, {\n                name: names.rowColumnDataName,\n                source: ordinalBinData,\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `floor((datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) / ${names.colCount})`,\n                        as: FieldNames.WrapRow,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) % ${names.colCount}`,\n                        as: FieldNames.WrapCol,\n                    },\n                    {\n                        type: 'formula',\n                        expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                        as: FieldNames.FacetSearch,\n                    },\n                    {\n                        type: 'formula',\n                        expr: displayBin(bin),\n                        as: FieldNames.FacetTitle,\n                    },\n                ],\n            });\n            const dataOut = {\n                name: names.outputData,\n                source: globalScope.data.name,\n                transform: [\n                    {\n                        type: 'lookup',\n                        from: names.rowColumnDataName,\n                        key: safeFieldName(bin.fields[0]),\n                        fields: [bin.fields[0]].map(safeFieldName),\n                        values: [FieldNames.WrapRow, FieldNames.WrapCol],\n                    },\n                ],\n            };\n            addData(globalScope.scope, dataOut);\n            globalScope.setMarkDataName(names.outputData);\n            addSignals(globalScope.scope, {\n                name: names.minAspect,\n                update: `${SignalNames.MinCellWidth} / ${SignalNames.MinCellHeight}`,\n            }, {\n                name: names.target,\n                update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`,\n            }, {\n                name: names.minArea,\n                update: `${SignalNames.MinCellWidth}*${SignalNames.MinCellHeight}`,\n            }, {\n                name: names.aspect,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`,\n            }, {\n                name: names.dataLength,\n                update: `data(${JSON.stringify(ordinalBinData)}).length`,\n            }, {\n                name: names.growColCount,\n                update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${SignalNames.MinCellWidth}), 1)`,\n            }, {\n                name: names.growCellWidth,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`,\n            }, {\n                name: names.fitsArea,\n                update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`,\n            }, {\n                name: names.fits,\n                update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`,\n            }, {\n                name: names.colCount,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`,\n            }, {\n                name: names.cellWidth,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`,\n            }, {\n                name: names.cellHeight,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${SignalNames.MinCellHeight}`,\n            });\n            modifySignal(globalScope.signals.plotHeightOut, 'max', `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n            modifySignal(globalScope.signals.plotWidthOut, 'max', `(${names.cellWidth} * ${names.colCount})`);\n            const signalH = [names.cellHeight, SignalNames.FacetPaddingTop, SignalNames.FacetPaddingBottom].join(' - ');\n            const signalW = [names.cellWidth, SignalNames.FacetPaddingLeft].join(' - ');\n            const signalX = addOffsets(parentScope.offsets.x, `datum[${JSON.stringify(FieldNames.WrapCol)}] * ${names.cellWidth}`, SignalNames.FacetPaddingLeft);\n            const signalY = addOffsets(parentScope.offsets.y, `datum[${JSON.stringify(FieldNames.WrapRow)}] * ${names.cellHeight}`, SignalNames.FacetPaddingTop);\n            const update = {\n                height: {\n                    signal: signalH,\n                },\n                width: {\n                    signal: signalW,\n                },\n                x: {\n                    signal: signalX,\n                },\n                y: {\n                    signal: signalY,\n                },\n            };\n            const offsets = {\n                x: signalX,\n                y: signalY,\n                h: signalH,\n                w: signalW,\n            };\n            const group = {\n                style: 'cell',\n                name: prefix,\n                type: 'group',\n                from: {\n                    data: names.rowColumnDataName,\n                },\n                encode: { update },\n            };\n            addMarks(globalScope.markGroup, group);\n            const sizeSignals = {\n                layoutHeight: `(${names.cellHeight} - ${SignalNames.FacetPaddingTop} - ${SignalNames.FacetPaddingBottom})`,\n                layoutWidth: `(${names.cellWidth} - ${SignalNames.FacetPaddingLeft})`,\n                colCount: names.colCount,\n                rowCount: `ceil(${names.dataLength} / ${names.colCount})`,\n            };\n            if (cellTitles) {\n                addFacetCellTitles(group, sizeSignals, axisTextColor);\n            }\n            return {\n                facetScope: group,\n                sizeSignals,\n                offsets,\n            };\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    const layoutClasses = {\n        AggregateContainer,\n        AggregateSquare,\n        Band,\n        Cross,\n        Scatter,\n        Square,\n        Stack,\n        Strip,\n        Treemap,\n        Wrap,\n    };\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function getImageMark(backgroundImage, allGlobalScales) {\n        const xScale = allGlobalScales.filter(s => s.scales.x)[0].scales.x[0];\n        const yScale = allGlobalScales.filter(s => s.scales.y)[0].scales.y[0];\n        const [xScaleName, yScaleName] = [xScale, yScale].map(s => s.name + (xScale.type === 'band' ? bandScaleLinearSuffix : ''));\n        return {\n            type: 'image',\n            encode: {\n                update: {\n                    url: {\n                        value: backgroundImage.url,\n                    },\n                    aspect: {\n                        value: false,\n                    },\n                    baseline: {\n                        value: 'bottom',\n                    },\n                    height: {\n                        signal: getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top),\n                    },\n                    y: {\n                        signal: getScaledValue(yScaleName, backgroundImage.extents.bottom),\n                    },\n                    width: {\n                        signal: getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left),\n                    },\n                    x: {\n                        signal: getScaledValue(xScaleName, backgroundImage.extents.left),\n                    },\n                },\n            },\n        };\n    }\n    function getScaledSpan(scaleName, low, high) {\n        return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n    }\n    function getScaledValue(scaleName, value) {\n        return `scale('${scaleName}', ${value})`;\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    class SpecBuilder {\n        constructor(props, specContext) {\n            this.props = props;\n            this.specContext = specContext;\n            this.globalSignals = {\n                facetAxesAdjustX: { name: SignalNames.FacetAxesAdjustX, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingLeft.toString() : '0' },\n                facetAxesAdjustY: { name: SignalNames.FacetAxesAdjustY, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingBottom.toString() : '0' },\n                minCellWidth: {\n                    name: SignalNames.MinCellWidth,\n                    update: `${minFacetWidth}`,\n                },\n                minCellHeight: { name: SignalNames.MinCellHeight, update: `${minFacetHeight}` },\n                plotOffsetLeft: { name: SignalNames.PlotOffsetLeft, update: '0' },\n                plotOffsetTop: { name: SignalNames.PlotOffsetTop, update: '0' },\n                plotOffsetBottom: { name: SignalNames.PlotOffsetBottom, update: '0' },\n                plotOffsetRight: { name: SignalNames.PlotOffsetRight, update: '0' },\n                plotHeightOut: { name: SignalNames.PlotHeightOut, update: SignalNames.PlotHeightIn },\n                plotWidthOut: { name: SignalNames.PlotWidthOut, update: SignalNames.PlotWidthIn },\n            };\n        }\n        validate() {\n            const { specContext } = this;\n            const { specCapabilities } = this.props;\n            const { roles } = specCapabilities;\n            const required = roles.filter(r => {\n                switch (typeof r.allowNone) {\n                    case 'boolean':\n                        return !r.allowNone;\n                    case 'undefined':\n                        return true;\n                    case 'function':\n                        return !r.allowNone(specContext);\n                }\n            });\n            const numeric = roles.filter(r => r.excludeCategoric);\n            const errors = required\n                .map(r => {\n                if (specContext.specColumns[r.role]) {\n                    return null;\n                }\n                else {\n                    return `Field ${r.role} is required.`;\n                }\n            })\n                .concat(numeric.map(r => {\n                if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) {\n                    return `Field ${r.role} must be quantitative.`;\n                }\n                else {\n                    return null;\n                }\n            }))\n                .filter(Boolean);\n            const { backgroundImage } = specContext.insight;\n            if (backgroundImage && !backgroundImage.extents) {\n                errors.push('BackgroundImage must have extents.');\n            }\n            return errors;\n        }\n        build() {\n            var _a, _b;\n            const { globalSignals, specContext } = this;\n            const { facetLayout, specCapabilities } = this.props;\n            const { insight, specColumns, specViewOptions } = specContext;\n            const dataName = 'data_source';\n            const { vegaSpec, groupMark } = this.initSpec(dataName);\n            const { topColorField, colorDataName } = addColor({\n                scope: vegaSpec,\n                dataName,\n                specContext,\n                scaleName: ScaleNames.Color,\n                legendDataName: 'data_legend',\n                topLookupName: 'data_topcolorlookup',\n                colorReverseSignalName: SignalNames.ColorReverse,\n            });\n            const globalScope = new GlobalScope({\n                dataName: colorDataName,\n                markGroup: groupMark,\n                scope: vegaSpec,\n                signals: globalSignals,\n            });\n            if (facetLayout) {\n                addSignals(vegaSpec, {\n                    name: SignalNames.FacetPaddingBottom,\n                    update: `${facetLayout.facetPadding.bottom}`,\n                }, {\n                    name: SignalNames.FacetPaddingLeft,\n                    update: `${facetLayout.facetPadding.left}`,\n                }, {\n                    name: SignalNames.FacetPaddingTop,\n                    update: `${facetLayout.facetPadding.top}`,\n                });\n                globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n                globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n            }\n            const { firstScope, finalScope, specResult, allGlobalScales, allEncodingRules, } = this.iterateLayouts(globalScope, (i, innerScope) => {\n                if (facetLayout && i === 0) {\n                    globalScope.zSize = innerScope.offsets.h;\n                }\n            });\n            if (specResult) {\n                return specResult;\n            }\n            if (allGlobalScales.length > 0) {\n                const plotHeightOut = globalSignals.plotHeightOut.name;\n                const plotWidthOut = globalSignals.plotWidthOut.name;\n                const colTitleScale = {\n                    type: 'linear',\n                    name: 'scale_facet_col_title',\n                    domain: [0, 1],\n                    range: [0, { signal: plotWidthOut }],\n                };\n                const rowTitleScale = {\n                    type: 'linear',\n                    name: 'scale_facet_row_title',\n                    domain: [0, 1],\n                    range: [{ signal: plotHeightOut }, 0],\n                };\n                const facetScope = facetLayout ? firstScope : null;\n                const backgroundGroup = facetLayout ? facetScope.facetScope : groupMark;\n                //TODO if capability and numeric x,y\n                if (insight.backgroundImage && specCapabilities.backgroundImage && ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative)) {\n                    //backgroundGroup.encode.update.fill = { value: 'pink' }\n                    if (!backgroundGroup.marks) {\n                        backgroundGroup.marks = [];\n                    }\n                    const imageMark = getImageMark(insight.backgroundImage, allGlobalScales);\n                    backgroundGroup.marks.unshift(imageMark);\n                }\n                const axesScopes = facetLayout ?\n                    addFacetAxesGroupMarks({\n                        globalScope: globalScope.scope,\n                        plotScope: groupMark,\n                        facetScope,\n                        colTitleScale,\n                        rowTitleScale,\n                        colSeqName: 'data_FacetCellColTitles',\n                        rowSeqName: 'data_FacetCellRowTitles',\n                    })\n                    :\n                        {\n                            main: [{\n                                    scope: groupMark,\n                                    lines: true,\n                                    labels: true,\n                                    title: true,\n                                }],\n                        };\n                addGlobalAxes({\n                    globalScope,\n                    allGlobalScales,\n                    axisScales: this.props.axisScales,\n                    plotOffsetSignals: { x: globalSignals.plotOffsetLeft, y: globalSignals.plotOffsetBottom },\n                    axesOffsets: { x: axesOffsetX, y: axesOffsetY },\n                    axesTitlePadding: facetLayout ? { x: axesTitlePaddingFacetX, y: axesTitlePaddingFacetY } : { x: axesTitlePaddingX, y: axesTitlePaddingY },\n                    labelBaseline: { x: 'top', y: 'middle' },\n                    specColumns,\n                    specViewOptions,\n                    axesScopes,\n                    hideZAxis: !!facetLayout,\n                    view: insight.view,\n                });\n            }\n            //add mark to the final scope\n            if (finalScope.mark) {\n                const { update } = finalScope.mark.encode;\n                const outputDataName = 'output';\n                finalScope.mark.from.data = outputDataName;\n                addData(globalScope.markGroup, {\n                    name: outputDataName,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.x,\n                            as: FieldNames.OffsetX,\n                        },\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.y,\n                            as: FieldNames.OffsetY,\n                        },\n                    ],\n                });\n                update.x = {\n                    field: FieldNames.OffsetX,\n                };\n                update.y = {\n                    field: FieldNames.OffsetY,\n                };\n                allEncodingRules.forEach(map => {\n                    for (const key in map) {\n                        if (update[key]) {\n                            const arrIn = map[key];\n                            if (!Array.isArray(update[key])) {\n                                const value = update[key];\n                                const arrOut = [];\n                                update[key] = arrOut;\n                                arrIn.forEach(rule => arrOut.push(rule));\n                                arrOut.push(value);\n                            }\n                            else {\n                                const arrOut = update[key];\n                                arrIn.forEach(rule => arrOut.unshift(rule));\n                            }\n                        }\n                    }\n                });\n                update.fill = fill(specContext, topColorField, ScaleNames.Color);\n                update.opacity = opacity();\n            }\n            return {\n                specCapabilities,\n                vegaSpec,\n            };\n        }\n        initSpec(dataName) {\n            const { globalSignals } = this;\n            const { facetAxesAdjustX, facetAxesAdjustY, minCellWidth, minCellHeight, plotOffsetLeft, plotOffsetBottom, plotOffsetTop, plotOffsetRight, plotHeightOut, plotWidthOut } = globalSignals;\n            const { specContext } = this;\n            const { insight } = specContext;\n            const groupMark = {\n                type: 'group',\n                //style: 'cell',\n                encode: {\n                    update: {\n                        x: { signal: `${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}` },\n                        y: { signal: SignalNames.PlotOffsetTop },\n                        height: { signal: `${SignalNames.PlotHeightOut} - ${SignalNames.FacetAxesAdjustY}` },\n                        width: { signal: `${SignalNames.PlotWidthOut} + ${SignalNames.FacetAxesAdjustX}` },\n                    },\n                },\n            };\n            const inputDataname = 'input';\n            const vegaSpec = {\n                $schema: 'https://vega.github.io/schema/vega/v5.json',\n                //style: 'cell',\n                data: [{ name: inputDataname }, { name: dataName, source: inputDataname, transform: [] }],\n                marks: [groupMark],\n                signals: textSignals(specContext, SignalNames.ViewportHeight).concat([\n                    minCellWidth,\n                    minCellHeight,\n                    {\n                        name: SignalNames.ViewportHeight,\n                        update: `max(${SignalNames.MinCellHeight}, ${insight.size.height})`,\n                    },\n                    {\n                        name: SignalNames.ViewportWidth,\n                        update: `max(${SignalNames.MinCellWidth}, ${insight.size.width})`,\n                    },\n                    plotOffsetLeft,\n                    plotOffsetTop,\n                    plotOffsetBottom,\n                    plotOffsetRight,\n                    facetAxesAdjustX,\n                    facetAxesAdjustY,\n                    {\n                        name: SignalNames.PlotHeightIn,\n                        update: `${SignalNames.ViewportHeight} - ${SignalNames.PlotOffsetBottom} + ${SignalNames.FacetAxesAdjustY}`,\n                    },\n                    {\n                        name: SignalNames.PlotWidthIn,\n                        update: `${SignalNames.ViewportWidth} - ${SignalNames.PlotOffsetLeft} - ${SignalNames.PlotOffsetRight}`,\n                    },\n                    plotHeightOut,\n                    plotWidthOut,\n                    {\n                        name: 'height',\n                        update: `${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut} + ${SignalNames.PlotOffsetBottom} - ${SignalNames.FacetAxesAdjustY}`,\n                    },\n                    {\n                        name: 'width',\n                        update: `${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotOffsetRight}`,\n                    },\n                ]),\n            };\n            return { vegaSpec, groupMark };\n        }\n        iterateLayouts(globalScope, onLayoutBuild) {\n            let specResult;\n            let parentScope = {\n                sizeSignals: globalScope.sizeSignals,\n                offsets: globalScope.offsets,\n            };\n            let firstScope;\n            let childScope;\n            const groupings = [];\n            const { layouts, specCapabilities } = this.props;\n            const allGlobalScales = [];\n            const allEncodingRules = [];\n            for (let i = 0; i < layouts.length; i++) {\n                if (!parentScope)\n                    continue;\n                const buildProps = {\n                    globalScope,\n                    parentScope,\n                    axesScales: this.props.axisScales,\n                    groupings,\n                    id: i,\n                };\n                const layout = this.createLayout(layouts[i], buildProps);\n                try {\n                    childScope = layout.build();\n                    childScope.id = i;\n                    const groupby = layout.getGrouping();\n                    if (groupby) {\n                        groupings.push({\n                            id: i,\n                            groupby,\n                            fieldOps: [\n                                { field: null, op: 'count', as: FieldNames.Count },\n                            ],\n                        });\n                    }\n                    const sumOp = layout.getAggregateSumOp();\n                    if (sumOp) {\n                        groupings[groupings.length - 1].fieldOps.push(sumOp);\n                    }\n                    onLayoutBuild(i, childScope);\n                }\n                catch (e) {\n                    specResult = {\n                        errors: [e.stack],\n                        specCapabilities,\n                        vegaSpec: null,\n                    };\n                    break;\n                }\n                if (childScope && childScope.globalScales) {\n                    allGlobalScales.push(childScope.globalScales);\n                }\n                if (childScope.encodingRuleMap) {\n                    allEncodingRules.push(childScope.encodingRuleMap);\n                }\n                if (i === 0) {\n                    firstScope = childScope;\n                }\n                parentScope = childScope;\n            }\n            return { firstScope, finalScope: parentScope, specResult, allGlobalScales, allEncodingRules };\n        }\n        createLayout(layoutPair, buildProps) {\n            const { layoutType, props } = layoutPair;\n            const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n            const layoutClass = layoutClasses[layoutType];\n            const layout = new layoutClass(layoutBuildProps);\n            layout.id = buildProps.id;\n            return layout;\n        }\n    }\n\n    /*!\n    * Copyright (c) Microsoft Corporation.\n    * Licensed under the MIT License.\n    */\n    function build(specContext, currData) {\n        const { specColumns } = specContext;\n        const columns = [\n            specColumns.color,\n            specColumns.facet,\n            specColumns.facetV,\n            specColumns.group,\n            specColumns.size,\n            specColumns.sort,\n            specColumns.x,\n            specColumns.y,\n            specColumns.z,\n        ];\n        inferAll(columns, currData);\n        const specBuilderProps = getSpecBuilderPropsForChart(specContext);\n        const specBuilder = new SpecBuilder(specBuilderProps, specContext);\n        let specResult;\n        if (specBuilder) {\n            try {\n                const errors = specBuilder.validate();\n                if (errors.length) {\n                    specResult = {\n                        errors,\n                        specCapabilities: specBuilderProps.specCapabilities,\n                        vegaSpec: null,\n                    };\n                }\n                else {\n                    specResult = specBuilder.build();\n                }\n            }\n            catch (e) {\n                specResult = {\n                    specCapabilities: null,\n                    vegaSpec: null,\n                    errors: [e.stack],\n                };\n            }\n            if (!specResult.errors) {\n                const data0 = specResult.vegaSpec.data[0];\n                data0.values = currData;\n            }\n        }\n        else {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [`could not build spec for ${specContext.insight.chart}`],\n            };\n        }\n        return specResult;\n    }\n\n    exports.ColorScaleNone = ColorScaleNone;\n    exports.FieldNames = FieldNames;\n    exports.Other = Other;\n    exports.ScaleNames = ScaleNames;\n    exports.SignalNames = SignalNames;\n    exports.build = build;\n    exports.getColumnsFromData = getColumnsFromData;\n    exports.getSpecColumns = getSpecColumns;\n    exports.getStats = getStats;\n    exports.inferAll = inferAll;\n\n}));\n"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/column-categoric.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"State\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\"\n    },\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/column-facet-cross.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\",\n        \"facetV\": \"Income\"\n    },\n    \"facetStyle\": \"cross\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/column-facet-wrap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/column-sum-strip-pct.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"size\": \"TotalPop\"\n    },\n    \"totalStyle\": \"sum-strip-percent\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/column-sum-strip.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"size\": \"TotalPop\"\n    },\n    \"totalStyle\": \"sum-strip\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/column-sum-treemap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"size\": \"TotalPop\"\n    },\n    \"totalStyle\": \"sum-treemap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/column.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Income\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\"\n    },\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"barchartV\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/density-facet-cross.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\",\n        \"facetV\": \"Income\"\n    },\n    \"facetStyle\": \"cross\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"density\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/density-facet-wrap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"density\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/density-treemap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\",\n        \"size\": \"TotalPop\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"totalStyle\": \"sum-treemap\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"density\",\n    \"view\": \"2d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/density.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\"\n    },\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"density\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/scatter-facet-cross.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\",\n        \"facetV\": \"Income\"\n    },\n    \"facetStyle\": \"cross\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/scatter-facet-wrap-with-image.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"backgroundImage\": {\n        \"url\": \"img/usa-counties-equirectangular.png\",\n        \"extents\": {\n            \"bottom\": 24,\n            \"left\": -125.5,\n            \"right\": -66.5,\n            \"top\": 49.75\n        }\n    },\n    \"size\": {\n        \"height\": 784,\n        \"width\": 1417\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/scatter-facet-wrap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/scatter-with-image.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\"\n    },\n    \"scheme\": \"redblue\",\n    \"backgroundImage\": {\n        \"url\": \"img/usa-counties-equirectangular.png\",\n        \"extents\": {\n            \"bottom\": 24,\n            \"left\": -125.5,\n            \"right\": -66.5,\n            \"top\": 49.75\n        }\n    },\n    \"size\": {\n        \"height\": 800,\n        \"width\": 1200\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/scatter.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Income\",\n        \"z\": \"Income\"\n    },\n    \"scheme\": \"redyellowgreen\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"scatterplot\",\n    \"view\": \"2d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/stacks-facet-cross.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\",\n        \"facet\": \"MedAge\",\n        \"facetV\": \"Income\"\n    },\n    \"facetStyle\": \"cross\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/stacks-facet-wrap-with-image.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"backgroundImage\": {\n        \"url\": \"img/usa-counties-equirectangular.png\",\n        \"extents\": {\n            \"bottom\": 24,\n            \"left\": -125.5,\n            \"right\": -66.5,\n            \"top\": 49.75\n        }\n    },\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/stacks-facet-wrap.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\",\n        \"facet\": \"MedAge\"\n    },\n    \"facetStyle\": \"wrap\",\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/stacks-with-image.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\"\n    },\n    \"scheme\": \"redblue\",\n    \"backgroundImage\": {\n        \"url\": \"img/usa-counties-equirectangular.png\",\n        \"extents\": {\n            \"bottom\": 24,\n            \"left\": -125.5,\n            \"right\": -66.5,\n            \"top\": 49.75\n        }\n    },\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/sanddance-specs/v2/specs/stacks.json",
    "content": "{\n    \"columns\": {\n        \"x\": \"Longitude\",\n        \"y\": \"Latitude\",\n        \"color\": \"Obama\",\n        \"z\": \"Education\",\n        \"sort\": \"State\"\n    },\n    \"scheme\": \"redblue\",\n    \"size\": {\n        \"height\": 600,\n        \"width\": 800\n    },\n    \"chart\": \"stacks\",\n    \"view\": \"3d\"\n}"
  },
  {
    "path": "docs/tests/v2/es6/css/sanddance.css",
    "content": ".sanddance-gl {\n    border: 1px solid #ccc;\n    float: left;\n    height: 700px;\n    width: 700px;\n    margin-right: 1em;\n}\n\n.sanddance-tooltip table {\n    background: #333;\n    color: #fff;\n    font-size: smaller;\n    margin: 1em;\n    min-width: 16em;\n    padding: 6px;\n    position: absolute; \n}\n  \n.sanddance-tooltip td {\n    text-align: left;\n    vertical-align: top;\n    width: 75%; \n}\n\n.sanddance-tooltip td:first-child {\n    width: 25%; \n}\n  "
  },
  {
    "path": "docs/tests/v2/es6/js/sanddance.js",
    "content": "// modules are defined as an array\n// [ module function, map of requires ]\n//\n// map of requires is short require name -> numeric require\n//\n// anything defined in a previous bundle is accessed via the\n// orig method which is the require for previous bundles\nparcelRequire = (function (modules, cache, entry, globalName) {\n  // Save the require from previous bundle to this closure if any\n  var previousRequire = typeof parcelRequire === 'function' && parcelRequire;\n  var nodeRequire = typeof require === 'function' && require;\n\n  function newRequire(name, jumped) {\n    if (!cache[name]) {\n      if (!modules[name]) {\n        // if we cannot find the module within our internal map or\n        // cache jump to the current global require ie. the last bundle\n        // that was added to the page.\n        var currentRequire = typeof parcelRequire === 'function' && parcelRequire;\n        if (!jumped && currentRequire) {\n          return currentRequire(name, true);\n        }\n\n        // If there are other bundles on this page the require from the\n        // previous one is saved to 'previousRequire'. Repeat this as\n        // many times as there are bundles until the module is found or\n        // we exhaust the require chain.\n        if (previousRequire) {\n          return previousRequire(name, true);\n        }\n\n        // Try the node require function if it exists.\n        if (nodeRequire && typeof name === 'string') {\n          return nodeRequire(name);\n        }\n\n        var err = new Error('Cannot find module \\'' + name + '\\'');\n        err.code = 'MODULE_NOT_FOUND';\n        throw err;\n      }\n\n      localRequire.resolve = resolve;\n      localRequire.cache = {};\n\n      var module = cache[name] = new newRequire.Module(name);\n\n      modules[name][0].call(module.exports, localRequire, module, module.exports, this);\n    }\n\n    return cache[name].exports;\n\n    function localRequire(x){\n      return newRequire(localRequire.resolve(x));\n    }\n\n    function resolve(x){\n      return modules[name][1][x] || x;\n    }\n  }\n\n  function Module(moduleName) {\n    this.id = moduleName;\n    this.bundle = newRequire;\n    this.exports = {};\n  }\n\n  newRequire.isParcelRequire = true;\n  newRequire.Module = Module;\n  newRequire.modules = modules;\n  newRequire.cache = cache;\n  newRequire.parent = previousRequire;\n  newRequire.register = function (id, exports) {\n    modules[id] = [function (require, module) {\n      module.exports = exports;\n    }, {}];\n  };\n\n  var error;\n  for (var i = 0; i < entry.length; i++) {\n    try {\n      newRequire(entry[i]);\n    } catch (e) {\n      // Save first error but execute all entries\n      if (!error) {\n        error = e;\n      }\n    }\n  }\n\n  if (entry.length) {\n    // Expose entry point to Node, AMD or browser globals\n    // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js\n    var mainExports = newRequire(entry[entry.length - 1]);\n\n    // CommonJS\n    if (typeof exports === \"object\" && typeof module !== \"undefined\") {\n      module.exports = mainExports;\n\n    // RequireJS\n    } else if (typeof define === \"function\" && define.amd) {\n     define(function () {\n       return mainExports;\n     });\n\n    // <script>\n    } else if (globalName) {\n      this[globalName] = mainExports;\n    }\n  }\n\n  // Override the current require with this new one\n  parcelRequire = newRequire;\n\n  if (error) {\n    // throw error from earlier, _after updating parcelRequire_\n    throw error;\n  }\n\n  return newRequire;\n})({\"FT5O\":[function(require,module,exports) {\n\n// shim for using process in browser\nvar process = module.exports = {}; // cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n  throw new Error('setTimeout has not been defined');\n}\n\nfunction defaultClearTimeout() {\n  throw new Error('clearTimeout has not been defined');\n}\n\n(function () {\n  try {\n    if (typeof setTimeout === 'function') {\n      cachedSetTimeout = setTimeout;\n    } else {\n      cachedSetTimeout = defaultSetTimout;\n    }\n  } catch (e) {\n    cachedSetTimeout = defaultSetTimout;\n  }\n\n  try {\n    if (typeof clearTimeout === 'function') {\n      cachedClearTimeout = clearTimeout;\n    } else {\n      cachedClearTimeout = defaultClearTimeout;\n    }\n  } catch (e) {\n    cachedClearTimeout = defaultClearTimeout;\n  }\n})();\n\nfunction runTimeout(fun) {\n  if (cachedSetTimeout === setTimeout) {\n    //normal enviroments in sane situations\n    return setTimeout(fun, 0);\n  } // if setTimeout wasn't available but was latter defined\n\n\n  if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n    cachedSetTimeout = setTimeout;\n    return setTimeout(fun, 0);\n  }\n\n  try {\n    // when when somebody has screwed with setTimeout but no I.E. maddness\n    return cachedSetTimeout(fun, 0);\n  } catch (e) {\n    try {\n      // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n      return cachedSetTimeout.call(null, fun, 0);\n    } catch (e) {\n      // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n      return cachedSetTimeout.call(this, fun, 0);\n    }\n  }\n}\n\nfunction runClearTimeout(marker) {\n  if (cachedClearTimeout === clearTimeout) {\n    //normal enviroments in sane situations\n    return clearTimeout(marker);\n  } // if clearTimeout wasn't available but was latter defined\n\n\n  if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n    cachedClearTimeout = clearTimeout;\n    return clearTimeout(marker);\n  }\n\n  try {\n    // when when somebody has screwed with setTimeout but no I.E. maddness\n    return cachedClearTimeout(marker);\n  } catch (e) {\n    try {\n      // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n      return cachedClearTimeout.call(null, marker);\n    } catch (e) {\n      // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n      // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n      return cachedClearTimeout.call(this, marker);\n    }\n  }\n}\n\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n  if (!draining || !currentQueue) {\n    return;\n  }\n\n  draining = false;\n\n  if (currentQueue.length) {\n    queue = currentQueue.concat(queue);\n  } else {\n    queueIndex = -1;\n  }\n\n  if (queue.length) {\n    drainQueue();\n  }\n}\n\nfunction drainQueue() {\n  if (draining) {\n    return;\n  }\n\n  var timeout = runTimeout(cleanUpNextTick);\n  draining = true;\n  var len = queue.length;\n\n  while (len) {\n    currentQueue = queue;\n    queue = [];\n\n    while (++queueIndex < len) {\n      if (currentQueue) {\n        currentQueue[queueIndex].run();\n      }\n    }\n\n    queueIndex = -1;\n    len = queue.length;\n  }\n\n  currentQueue = null;\n  draining = false;\n  runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n  var args = new Array(arguments.length - 1);\n\n  if (arguments.length > 1) {\n    for (var i = 1; i < arguments.length; i++) {\n      args[i - 1] = arguments[i];\n    }\n  }\n\n  queue.push(new Item(fun, args));\n\n  if (queue.length === 1 && !draining) {\n    runTimeout(drainQueue);\n  }\n}; // v8 likes predictible objects\n\n\nfunction Item(fun, array) {\n  this.fun = fun;\n  this.array = array;\n}\n\nItem.prototype.run = function () {\n  this.fun.apply(null, this.array);\n};\n\nprocess.title = 'browser';\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\n\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) {\n  return [];\n};\n\nprocess.binding = function (name) {\n  throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () {\n  return '/';\n};\n\nprocess.chdir = function (dir) {\n  throw new Error('process.chdir is not supported');\n};\n\nprocess.umask = function () {\n  return 0;\n};\n},{}],\"K9MZ\":[function(require,module,exports) {\nvar process = require(\"process\");\nvar global = arguments[3];\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.document = exports.global = exports.window = exports.isBrowser = void 0;\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Purpose: include this in your module to avoids adding dependencies on\n// micro modules like 'global' and 'is-browser';\n\n/* global process, window, global, document */\n\n\nvar isBrowser = (typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) !== 'object' || String(process) !== '[object process]' || true;\nexports.isBrowser = isBrowser;\nvar window_ = typeof window !== 'undefined' ? window : global;\nexports.window = window_;\nvar global_ = typeof global !== 'undefined' ? global : window;\nexports.global = global_;\nvar document_ = typeof document !== 'undefined' ? document : {};\nexports.document = document_;\n},{\"process\":\"FT5O\"}],\"xLw6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _typeof;\n\nfunction _typeof2(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof2 = function _typeof2(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof2 = function _typeof2(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof2(obj);\n}\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n    exports.default = _typeof = function _typeof(obj) {\n      return _typeof2(obj);\n    };\n  } else {\n    exports.default = _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n    };\n  }\n\n  return _typeof(obj);\n}\n},{}],\"EqAc\":[function(require,module,exports) {\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isElectron;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isElectron(mockUserAgent) {\n  if (typeof window !== 'undefined' && (0, _typeof2.default)(window.process) === 'object' && window.process.type === 'renderer') {\n    return true;\n  }\n\n  if (typeof process !== 'undefined' && (0, _typeof2.default)(process.versions) === 'object' && Boolean(process.versions.electron)) {\n    return true;\n  }\n\n  var realUserAgent = (typeof navigator === \"undefined\" ? \"undefined\" : (0, _typeof2.default)(navigator)) === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent;\n  var userAgent = mockUserAgent || realUserAgent;\n\n  if (userAgent && userAgent.indexOf('Electron') >= 0) {\n    return true;\n  }\n\n  return false;\n}\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"process\":\"FT5O\"}],\"i60V\":[function(require,module,exports) {\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isBrowser;\nexports.isBrowserMainThread = isBrowserMainThread;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nvar _isElectron = _interopRequireDefault(require(\"./is-electron\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isBrowser() {\n  var isNode = (typeof process === \"undefined\" ? \"undefined\" : (0, _typeof2.default)(process)) === 'object' && String(process) === '[object process]' && !true;\n  return !isNode || (0, _isElectron.default)();\n}\n\nfunction isBrowserMainThread() {\n  return isBrowser() && typeof document !== 'undefined';\n}\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"./is-electron\":\"EqAc\",\"process\":\"FT5O\"}],\"z2pG\":[function(require,module,exports) {\nvar global = arguments[3];\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.console = exports.process = exports.document = exports.global = exports.window = exports.self = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar globals = {\n  self: typeof self !== 'undefined' && self,\n  window: typeof window !== 'undefined' && window,\n  global: typeof global !== 'undefined' && global,\n  document: typeof document !== 'undefined' && document,\n  process: (typeof process === \"undefined\" ? \"undefined\" : (0, _typeof2.default)(process)) === 'object' && process\n};\nvar self_ = globals.self || globals.window || globals.global;\nexports.self = self_;\nvar window_ = globals.window || globals.self || globals.global;\nexports.window = window_;\nvar global_ = globals.global || globals.self || globals.window;\nexports.global = global_;\nvar document_ = globals.document || {};\nexports.document = document_;\nvar process_ = globals.process || {};\nexports.process = process_;\nvar console_ = console;\nexports.console = console_;\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"process\":\"FT5O\"}],\"wtvQ\":[function(require,module,exports) {\nvar global = arguments[3];\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"self\", {\n  enumerable: true,\n  get: function () {\n    return _globals.self;\n  }\n});\nObject.defineProperty(exports, \"window\", {\n  enumerable: true,\n  get: function () {\n    return _globals.window;\n  }\n});\nObject.defineProperty(exports, \"global\", {\n  enumerable: true,\n  get: function () {\n    return _globals.global;\n  }\n});\nObject.defineProperty(exports, \"document\", {\n  enumerable: true,\n  get: function () {\n    return _globals.document;\n  }\n});\nObject.defineProperty(exports, \"process\", {\n  enumerable: true,\n  get: function () {\n    return _globals.process;\n  }\n});\nObject.defineProperty(exports, \"console\", {\n  enumerable: true,\n  get: function () {\n    return _globals.console;\n  }\n});\nexports.isBrowser = exports.VERSION = void 0;\n\nvar _isBrowser = _interopRequireDefault(require(\"../../env/is-browser\"));\n\nvar _globals = require(\"../../env/globals\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar VERSION = typeof \"2.1.0\" !== 'undefined' ? \"2.1.0\" : 'untranspiled source';\nexports.VERSION = VERSION;\nvar isBrowser = (0, _isBrowser.default)();\nexports.isBrowser = isBrowser;\n},{\"../../env/is-browser\":\"i60V\",\"../../env/globals\":\"z2pG\",\"process\":\"FT5O\"}],\"IyIv\":[function(require,module,exports) {\n\n\"use strict\";\n\nvar _globals = require(\"./lib/utils/globals\");\n\n_globals.global.probe = {};\n},{\"./lib/utils/globals\":\"wtvQ\"}],\"JBXe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isMobile = isMobile;\nexports.default = getBrowser;\n\nvar _globals = require(\"./globals\");\n\nvar _isBrowser = _interopRequireDefault(require(\"./is-browser\"));\n\nvar _isElectron = _interopRequireDefault(require(\"./is-electron\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isMobile() {\n  return typeof _globals.window.orientation !== 'undefined';\n}\n\nfunction getBrowser(mockUserAgent) {\n  if (!mockUserAgent && !(0, _isBrowser.default)()) {\n    return 'Node';\n  }\n\n  if ((0, _isElectron.default)(mockUserAgent)) {\n    return 'Electron';\n  }\n\n  var navigator_ = typeof navigator !== 'undefined' ? navigator : {};\n  var userAgent = mockUserAgent || navigator_.userAgent || '';\n\n  if (userAgent.indexOf('Edge') > -1) {\n    return 'Edge';\n  }\n\n  var isMSIE = userAgent.indexOf('MSIE ') !== -1;\n  var isTrident = userAgent.indexOf('Trident/') !== -1;\n\n  if (isMSIE || isTrident) {\n    return 'IE';\n  }\n\n  if (_globals.window.chrome) {\n    return 'Chrome';\n  }\n\n  if (_globals.window.safari) {\n    return 'Safari';\n  }\n\n  if (_globals.window.mozInnerScreenX) {\n    return 'Firefox';\n  }\n\n  return 'Unknown';\n}\n},{\"./globals\":\"z2pG\",\"./is-browser\":\"i60V\",\"./is-electron\":\"EqAc\"}],\"B4eQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = assert;\n\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(\"Assertion failed. \".concat(message));\n  }\n}\n},{}],\"VEjx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _classCallCheck;\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n},{}],\"l5p4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _createClass;\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n},{}],\"dGUH\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getTimestamp = getTimestamp;\nexports.startTimestamp = void 0;\n\nvar _globals = require(\"./globals\");\n\nfunction getTimestamp() {\n  if (!_globals.isBrowser) {\n    var secondsAndNanoseconds = _globals.process.hrtime();\n\n    return secondsAndNanoseconds[0] + secondsAndNanoseconds[1] / 1e6;\n  }\n\n  if (_globals.window.performance) {\n    return _globals.window.performance.now();\n  }\n\n  return Date.now();\n}\n\nvar startTimestamp = getTimestamp();\nexports.startTimestamp = startTimestamp;\n},{\"./globals\":\"wtvQ\"}],\"ue7J\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.formatTime = formatTime;\nexports.leftPad = leftPad;\nexports.rightPad = rightPad;\nexports.getSISuffix = getSISuffix;\nexports.formatSI = formatSI;\nexports.formatValue = formatValue;\nexports.formatImage = formatImage;\n\nfunction formatTime(ms) {\n  var formatted;\n\n  if (ms < 10) {\n    formatted = \"\".concat(ms.toFixed(2), \"ms\");\n  } else if (ms < 100) {\n    formatted = \"\".concat(ms.toFixed(1), \"ms\");\n  } else if (ms < 1000) {\n    formatted = \"\".concat(ms.toFixed(0), \"ms\");\n  } else {\n    formatted = \"\".concat((ms / 1000).toFixed(2), \"s\");\n  }\n\n  return formatted;\n}\n\nfunction leftPad(string) {\n  var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8;\n  var padLength = Math.max(length - string.length, 0);\n  return \"\".concat(' '.repeat(padLength)).concat(string);\n}\n\nfunction rightPad(string) {\n  var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8;\n  var padLength = Math.max(length - string.length, 0);\n  return \"\".concat(string).concat(' '.repeat(padLength));\n}\n\nfunction splitIntoBaseAndExponent(number) {\n  var base = number;\n  var exponent = 0;\n\n  if (number !== 0) {\n    while (base >= 10 || base <= -10) {\n      base /= 10;\n      exponent++;\n    }\n\n    while (base < 1 && base > -1) {\n      base *= 10;\n      exponent--;\n    }\n  }\n\n  return {\n    base: base,\n    exponent: exponent\n  };\n}\n\nfunction getSISuffix(multipleOf3) {\n  var SI_SUFFIXES = {\n    0: '',\n    1: 'K',\n    2: 'M',\n    3: 'G',\n    '-1': 'm',\n    '-2': 'µ',\n    '-3': 'n'\n  };\n  var key = String(multipleOf3);\n  return key in SI_SUFFIXES ? SI_SUFFIXES[key] : \"e\".concat(multipleOf3 * 3);\n}\n\nfunction formatSI(number) {\n  var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;\n\n  var _splitIntoBaseAndExpo = splitIntoBaseAndExponent(number),\n      base = _splitIntoBaseAndExpo.base,\n      exponent = _splitIntoBaseAndExpo.exponent;\n\n  var multipleOf3 = Math.floor(exponent / 3);\n  var remaining = exponent - multipleOf3 * 3;\n  var digits = base * Math.pow(10, remaining);\n  return \"\".concat(digits.toPrecision(precision)).concat(getSISuffix(multipleOf3));\n}\n\nfunction formatValue(v) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var EPSILON = 1e-16;\n  var _opts$isInteger = opts.isInteger,\n      isInteger = _opts$isInteger === void 0 ? false : _opts$isInteger;\n\n  if (Array.isArray(v) || ArrayBuffer.isView(v)) {\n    return formatArrayValue(v, opts);\n  }\n\n  if (!Number.isFinite(v)) {\n    return String(v);\n  }\n\n  if (Math.abs(v) < EPSILON) {\n    return isInteger ? '0' : '0.';\n  }\n\n  if (isInteger) {\n    return v.toFixed(0);\n  }\n\n  if (Math.abs(v) > 100 && Math.abs(v) < 10000) {\n    return v.toFixed(0);\n  }\n\n  var string = v.toPrecision(2);\n  var decimal = string.indexOf('.0');\n  return decimal === string.length - 2 ? string.slice(0, -1) : string;\n}\n\nfunction formatArrayValue(v, opts) {\n  var _opts$maxElts = opts.maxElts,\n      maxElts = _opts$maxElts === void 0 ? 16 : _opts$maxElts,\n      _opts$size = opts.size,\n      size = _opts$size === void 0 ? 1 : _opts$size;\n  var string = '[';\n\n  for (var i = 0; i < v.length && i < maxElts; ++i) {\n    if (i > 0) {\n      string += \",\".concat(i % size === 0 ? ' ' : '');\n    }\n\n    string += formatValue(v[i], opts);\n  }\n\n  var terminator = v.length > maxElts ? '...' : ']';\n  return \"\".concat(string).concat(terminator);\n}\n\nfunction formatImage(image, message, scale) {\n  var maxWidth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 600;\n  var imageUrl = image.src.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\n\n  if (image.width > maxWidth) {\n    scale = Math.min(scale, maxWidth / image.width);\n  }\n\n  var width = image.width * scale;\n  var height = image.height * scale;\n  var style = ['font-size:1px;', \"padding:\".concat(Math.floor(height / 2), \"px \").concat(Math.floor(width / 2), \"px;\"), \"line-height:\".concat(height, \"px;\"), \"background:url(\".concat(imageUrl, \");\"), \"background-size:\".concat(width, \"px \").concat(height, \"px;\"), 'color:transparent;'].join('');\n  return [\"\".concat(message, \" %c+\"), style];\n}\n},{}],\"lXkG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _timestamp = require(\"./utils/timestamp\");\n\nvar _formatters = require(\"./utils/formatters\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Stats = function () {\n  function Stats(_ref) {\n    var id = _ref.id;\n    (0, _classCallCheck2.default)(this, Stats);\n    this.id = id;\n    this.time = (0, _timestamp.getTimestamp)();\n    this.counters = {};\n    Object.seal(this);\n  }\n\n  (0, _createClass2.default)(Stats, [{\n    key: \"addCounter\",\n    value: function addCounter(name) {\n      this._getCounter(name);\n\n      return this;\n    }\n  }, {\n    key: \"bump\",\n    value: function bump(name) {\n      var counter = this._getCounter(name);\n\n      counter.call++;\n      counter.count++;\n      return this;\n    }\n  }, {\n    key: \"increment\",\n    value: function increment(name, count) {\n      var counter = this._getCounter(name);\n\n      counter.call++;\n      counter.count += count;\n      return this;\n    }\n  }, {\n    key: \"addTimer\",\n    value: function addTimer(name) {\n      var timer = this._getCounter(name);\n\n      timer.time = 0;\n      return this;\n    }\n  }, {\n    key: \"addTime\",\n    value: function addTime(name, time) {\n      var timer = this._getCounter(name);\n\n      timer.time += time;\n      timer.count++;\n      return this;\n    }\n  }, {\n    key: \"timeStart\",\n    value: function timeStart(name, subname) {\n      var timer = this._getCounter(name);\n\n      timer._startTime = (0, _timestamp.getTimestamp)();\n    }\n  }, {\n    key: \"timeEnd\",\n    value: function timeEnd(name, subname) {\n      var timer = this._getCounter(name);\n\n      this.addTime(name, (0, _timestamp.getTimestamp)() - timer._startTime);\n    }\n  }, {\n    key: \"reset\",\n    value: function reset() {\n      this.time = (0, _timestamp.getTimestamp)();\n\n      for (var key in this.counters) {\n        var counter = this.counters[key];\n        counter.count = 0;\n        counter.time = 0;\n      }\n\n      return this;\n    }\n  }, {\n    key: \"hasTimeElapsed\",\n    value: function hasTimeElapsed() {\n      var deltaTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1000;\n      return (0, _timestamp.getTimestamp)() - this.time > 1000;\n    }\n  }, {\n    key: \"getStats\",\n    value: function getStats() {\n      var deltaTime = ((0, _timestamp.getTimestamp)() - this.time) / 1000;\n      var stats = {};\n\n      for (var key in this.counters) {\n        var counter = this.counters[key];\n        stats[counter.title] = {\n          total: counter.count,\n          fps: Math.round(counter.count / deltaTime)\n        };\n\n        if (counter.time) {\n          stats[counter.title].totalTime = (0, _formatters.formatTime)(counter.time);\n          stats[counter.title].avgTime = (0, _formatters.formatTime)(counter.time / counter.count);\n        }\n      }\n\n      return stats;\n    }\n  }, {\n    key: \"getStatsTable\",\n    value: function getStatsTable() {\n      var stats = this.getStats();\n\n      for (var key in stats) {\n        if (stats[key].total === 0) {\n          delete stats[key];\n        }\n      }\n\n      return stats;\n    }\n  }, {\n    key: \"getStatNames\",\n    value: function getStatNames() {\n      return Object.keys(this.counters);\n    }\n  }, {\n    key: \"get\",\n    value: function get(name) {\n      var counter = this._getCounter(name);\n\n      return counter.count;\n    }\n  }, {\n    key: \"getCount\",\n    value: function getCount(name) {\n      var counter = this._getCounter(name);\n\n      return counter.count;\n    }\n  }, {\n    key: \"getFPS\",\n    value: function getFPS(name) {\n      var counter = this._getCounter(name);\n\n      var deltaTime = ((0, _timestamp.getTimestamp)() - this.time) / 1000;\n      return Math.round(counter.count / deltaTime);\n    }\n  }, {\n    key: \"getTimeString\",\n    value: function getTimeString() {\n      return \"\".concat(this.id, \":\").concat((0, _formatters.formatTime)(this.time), \"(\").concat(this.count, \")\");\n    }\n  }, {\n    key: \"oneSecondPassed\",\n    value: function oneSecondPassed() {\n      var deltaTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1000;\n      return this.hasTimeElapsed(deltaTime);\n    }\n  }, {\n    key: \"_getCounter\",\n    value: function _getCounter(name) {\n      var counter = this.counters[name];\n\n      if (!counter) {\n        counter = {\n          title: name,\n          unit: '',\n          timer: false,\n          count: 0,\n          time: 0,\n          totalTime: 0,\n          averageTime: 0\n        };\n        this.counters[name] = counter;\n      }\n\n      return counter;\n    }\n  }, {\n    key: \"_incrementTimer\",\n    value: function _incrementTimer(counter, time, count) {\n      counter.count += count;\n      counter.totalTime += time;\n      counter.averageTime = counter.totalTime / count;\n    }\n  }]);\n  return Stats;\n}();\n\nexports.default = Stats;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./utils/timestamp\":\"dGUH\",\"./utils/formatters\":\"ue7J\"}],\"vw6u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _arrayWithoutHoles;\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  }\n}\n},{}],\"bG0g\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _iterableToArray;\n\nfunction _iterableToArray(iter) {\n  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n},{}],\"gdEH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _nonIterableSpread;\n\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n},{}],\"Qv3s\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _toConsumableArray;\n\nvar _arrayWithoutHoles = _interopRequireDefault(require(\"./arrayWithoutHoles\"));\n\nvar _iterableToArray = _interopRequireDefault(require(\"./iterableToArray\"));\n\nvar _nonIterableSpread = _interopRequireDefault(require(\"./nonIterableSpread\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) {\n  return (0, _arrayWithoutHoles.default)(arr) || (0, _iterableToArray.default)(arr) || (0, _nonIterableSpread.default)();\n}\n},{\"./arrayWithoutHoles\":\"vw6u\",\"./iterableToArray\":\"bG0g\",\"./nonIterableSpread\":\"gdEH\"}],\"gpd2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _defineProperty;\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n},{}],\"U1To\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getStorage(type) {\n  try {\n    var storage = window[type];\n    var x = '__storage_test__';\n    storage.setItem(x, x);\n    storage.removeItem(x);\n    return storage;\n  } catch (e) {\n    return null;\n  }\n}\n\nvar LocalStorage = function () {\n  function LocalStorage(id, defaultSettings) {\n    var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'sessionStorage';\n    (0, _classCallCheck2.default)(this, LocalStorage);\n    this.storage = getStorage(type);\n    this.id = id;\n    this.config = {};\n    Object.assign(this.config, defaultSettings);\n\n    this._loadConfiguration();\n  }\n\n  (0, _createClass2.default)(LocalStorage, [{\n    key: \"getConfiguration\",\n    value: function getConfiguration() {\n      return this.config;\n    }\n  }, {\n    key: \"setConfiguration\",\n    value: function setConfiguration(configuration) {\n      this.config = {};\n      return this.updateConfiguration(configuration);\n    }\n  }, {\n    key: \"updateConfiguration\",\n    value: function updateConfiguration(configuration) {\n      Object.assign(this.config, configuration);\n\n      if (this.storage) {\n        var serialized = JSON.stringify(this.config);\n        this.storage.setItem(this.id, serialized);\n      }\n\n      return this;\n    }\n  }, {\n    key: \"_loadConfiguration\",\n    value: function _loadConfiguration() {\n      var configuration = {};\n\n      if (this.storage) {\n        var serializedConfiguration = this.storage.getItem(this.id);\n        configuration = serializedConfiguration ? JSON.parse(serializedConfiguration) : {};\n      }\n\n      Object.assign(this.config, configuration);\n      return this;\n    }\n  }]);\n  return LocalStorage;\n}();\n\nexports.default = LocalStorage;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\"}],\"C21t\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.addColor = addColor;\nexports.COLOR = void 0;\n\nvar _globals = require(\"./globals\");\n\nvar COLOR = {\n  BLACK: 30,\n  RED: 31,\n  GREEN: 32,\n  YELLOW: 33,\n  BLUE: 34,\n  MAGENTA: 35,\n  CYAN: 36,\n  WHITE: 37,\n  BRIGHT_BLACK: 90,\n  BRIGHT_RED: 91,\n  BRIGHT_GREEN: 92,\n  BRIGHT_YELLOW: 93,\n  BRIGHT_BLUE: 94,\n  BRIGHT_MAGENTA: 95,\n  BRIGHT_CYAN: 96,\n  BRIGHT_WHITE: 97\n};\nexports.COLOR = COLOR;\n\nfunction getColor(color) {\n  return typeof color === 'string' ? COLOR[color.toUpperCase()] || COLOR.WHITE : color;\n}\n\nfunction addColor(string, color, background) {\n  if (!_globals.isBrowser && typeof string === 'string') {\n    if (color) {\n      color = getColor(color);\n      string = \"\\x1B[\".concat(color, \"m\").concat(string, \"\\x1B[39m\");\n    }\n\n    if (background) {\n      color = getColor(background);\n      string = \"\\x1B[\".concat(background + 10, \"m\").concat(string, \"\\x1B[49m\");\n    }\n  }\n\n  return string;\n}\n},{\"./globals\":\"wtvQ\"}],\"bDDU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.autobind = autobind;\n\nfunction autobind(obj) {\n  var predefined = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ['constructor'];\n  var proto = Object.getPrototypeOf(obj);\n  var propNames = Object.getOwnPropertyNames(proto);\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    var _loop = function _loop() {\n      var key = _step.value;\n\n      if (typeof obj[key] === 'function') {\n        if (!predefined.find(function (name) {\n          return key === name;\n        })) {\n          obj[key] = obj[key].bind(obj);\n        }\n      }\n    };\n\n    for (var _iterator = propNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      _loop();\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n}\n},{}],\"RKR7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = assert;\n\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(message || 'Assertion failed');\n  }\n}\n},{}],\"CEVT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/toConsumableArray\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _globals = require(\"./utils/globals\");\n\nvar _localStorage = _interopRequireDefault(require(\"./utils/local-storage\"));\n\nvar _timestamp = require(\"./utils/timestamp\");\n\nvar _formatters = require(\"./utils/formatters\");\n\nvar _color = require(\"./utils/color\");\n\nvar _autobind = require(\"./utils/autobind\");\n\nvar _assert2 = _interopRequireDefault(require(\"../lib/utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar originalConsole = {\n  debug: _globals.isBrowser ? console.debug || console.log : console.log,\n  log: console.log,\n  info: console.info,\n  warn: console.warn,\n  error: console.error\n};\nvar DEFAULT_SETTINGS = {\n  enabled: false,\n  priority: 0\n};\n\nfunction noop() {}\n\nvar cache = {};\n\nfunction getTableHeader(table) {\n  for (var key in table) {\n    for (var title in table[key]) {\n      return title || 'untitled';\n    }\n  }\n\n  return 'empty';\n}\n\nvar Log = function () {\n  function Log() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        id = _ref.id;\n\n    (0, _classCallCheck2.default)(this, Log);\n    this.id = id;\n    this.VERSION = _globals.VERSION;\n    this._startTs = (0, _timestamp.getTimestamp)();\n    this._deltaTs = (0, _timestamp.getTimestamp)();\n    this.LOG_THROTTLE_TIMEOUT = 0;\n    this._storage = new _localStorage.default(\"__probe-\".concat(this.id, \"__\"), DEFAULT_SETTINGS);\n    this.userData = {};\n    this.timeStamp(\"\".concat(this.id, \" started\"));\n    (0, _autobind.autobind)(this);\n    Object.seal(this);\n  }\n\n  (0, _createClass2.default)(Log, [{\n    key: \"isEnabled\",\n    value: function isEnabled() {\n      return this._storage.config.enabled;\n    }\n  }, {\n    key: \"getPriority\",\n    value: function getPriority() {\n      return this._storage.config.priority;\n    }\n  }, {\n    key: \"getLevel\",\n    value: function getLevel() {\n      return this._storage.config.priority;\n    }\n  }, {\n    key: \"getTotal\",\n    value: function getTotal() {\n      return Number(((0, _timestamp.getTimestamp)() - this._startTs).toPrecision(10));\n    }\n  }, {\n    key: \"getDelta\",\n    value: function getDelta() {\n      return Number(((0, _timestamp.getTimestamp)() - this._deltaTs).toPrecision(10));\n    }\n  }, {\n    key: \"enable\",\n    value: function enable() {\n      var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n      this._storage.updateConfiguration({\n        enabled: enabled\n      });\n\n      return this;\n    }\n  }, {\n    key: \"setLevel\",\n    value: function setLevel(level) {\n      this._storage.updateConfiguration({\n        priority: level\n      });\n\n      return this;\n    }\n  }, {\n    key: \"assert\",\n    value: function assert(condition, message) {\n      (0, _assert2.default)(condition, message);\n    }\n  }, {\n    key: \"warn\",\n    value: function warn(message) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      return this._getLogFunction({\n        message: message,\n        args: args,\n        method: originalConsole.warn,\n        once: true\n      });\n    }\n  }, {\n    key: \"error\",\n    value: function error(message) {\n      for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n        args[_key2 - 1] = arguments[_key2];\n      }\n\n      return this._getLogFunction({\n        message: message,\n        args: args,\n        method: originalConsole.error\n      });\n    }\n  }, {\n    key: \"deprecated\",\n    value: function deprecated(oldUsage, newUsage) {\n      return this.warn(\"`\".concat(oldUsage, \"` is deprecated and will be removed in a later version. Use `\").concat(newUsage, \"` instead\"));\n    }\n  }, {\n    key: \"removed\",\n    value: function removed(oldUsage, newUsage) {\n      return this.error(\"`\".concat(oldUsage, \"` has been removed. Use `\").concat(newUsage, \"` instead\"));\n    }\n  }, {\n    key: \"probe\",\n    value: function probe(priority, message) {\n      for (var _len3 = arguments.length, args = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n        args[_key3 - 2] = arguments[_key3];\n      }\n\n      return this._getLogFunction({\n        priority: priority,\n        message: message,\n        args: args,\n        method: originalConsole.log,\n        time: true,\n        once: true\n      });\n    }\n  }, {\n    key: \"log\",\n    value: function log(priority, message) {\n      for (var _len4 = arguments.length, args = new Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) {\n        args[_key4 - 2] = arguments[_key4];\n      }\n\n      return this._getLogFunction({\n        priority: priority,\n        message: message,\n        args: args,\n        method: originalConsole.debug\n      });\n    }\n  }, {\n    key: \"info\",\n    value: function info(priority, message) {\n      for (var _len5 = arguments.length, args = new Array(_len5 > 2 ? _len5 - 2 : 0), _key5 = 2; _key5 < _len5; _key5++) {\n        args[_key5 - 2] = arguments[_key5];\n      }\n\n      return this._getLogFunction({\n        priority: priority,\n        message: message,\n        args: args,\n        method: console.info\n      });\n    }\n  }, {\n    key: \"once\",\n    value: function once(priority, message) {\n      for (var _len6 = arguments.length, args = new Array(_len6 > 2 ? _len6 - 2 : 0), _key6 = 2; _key6 < _len6; _key6++) {\n        args[_key6 - 2] = arguments[_key6];\n      }\n\n      return this._getLogFunction({\n        priority: priority,\n        message: message,\n        args: args,\n        method: originalConsole.debug || originalConsole.info,\n        once: true\n      });\n    }\n  }, {\n    key: \"table\",\n    value: function table(priority, _table, columns) {\n      if (_table) {\n        var tag = getTableHeader(_table);\n        return this._getLogFunction({\n          priority: priority,\n          message: _table,\n          args: columns && [columns],\n          tag: tag,\n          method: console.table || noop\n        });\n      }\n\n      return noop;\n    }\n  }, {\n    key: \"image\",\n    value: function image(_ref2) {\n      var priority = _ref2.priority,\n          _image = _ref2.image,\n          _ref2$message = _ref2.message,\n          message = _ref2$message === void 0 ? '' : _ref2$message,\n          _ref2$scale = _ref2.scale,\n          scale = _ref2$scale === void 0 ? 1 : _ref2$scale;\n\n      if (priority > this.getPriority()) {\n        return noop;\n      }\n\n      return _globals.isBrowser ? this._logImageInBrowser({\n        image: _image,\n        message: message,\n        scale: scale\n      }) : this._logImageInNode({\n        image: _image,\n        message: message,\n        scale: scale\n      });\n    }\n  }, {\n    key: \"settings\",\n    value: function settings() {\n      if (console.table) {\n        console.table(this._storage.config);\n      } else {\n        console.log(this._storage.config);\n      }\n    }\n  }, {\n    key: \"get\",\n    value: function get(setting) {\n      return this._storage.config[setting];\n    }\n  }, {\n    key: \"set\",\n    value: function set(setting, value) {\n      this._storage.updateConfiguration((0, _defineProperty2.default)({}, setting, value));\n    }\n  }, {\n    key: \"_logImageInNode\",\n    value: function _logImageInNode(_ref3) {\n      var image = _ref3.image,\n          _ref3$message = _ref3.message,\n          message = _ref3$message === void 0 ? '' : _ref3$message,\n          _ref3$scale = _ref3.scale,\n          scale = _ref3$scale === void 0 ? 1 : _ref3$scale;\n      var asciify = null;\n\n      try {\n        asciify = module.require('asciify-image');\n      } catch (error) {}\n\n      if (asciify) {\n        return function () {\n          return asciify(image, {\n            fit: 'box',\n            width: \"\".concat(Math.round(80 * scale), \"%\")\n          }).then(function (data) {\n            return console.log(data);\n          });\n        };\n      }\n\n      return noop;\n    }\n  }, {\n    key: \"_logImageInBrowser\",\n    value: function _logImageInBrowser(_ref4) {\n      var image = _ref4.image,\n          _ref4$message = _ref4.message,\n          message = _ref4$message === void 0 ? '' : _ref4$message,\n          _ref4$scale = _ref4.scale,\n          scale = _ref4$scale === void 0 ? 1 : _ref4$scale;\n\n      if (typeof image === 'string') {\n        var img = new Image();\n\n        img.onload = function () {\n          var _console;\n\n          var args = (0, _formatters.formatImage)(img, message, scale);\n\n          (_console = console).log.apply(_console, (0, _toConsumableArray2.default)(args));\n        };\n\n        img.src = image;\n        return noop;\n      }\n\n      var element = image.nodeName || '';\n\n      if (element.toLowerCase() === 'img') {\n        var _console2;\n\n        (_console2 = console).log.apply(_console2, (0, _toConsumableArray2.default)((0, _formatters.formatImage)(image, message, scale)));\n\n        return noop;\n      }\n\n      if (element.toLowerCase() === 'canvas') {\n        var _img = new Image();\n\n        _img.onload = function () {\n          var _console3;\n\n          return (_console3 = console).log.apply(_console3, (0, _toConsumableArray2.default)((0, _formatters.formatImage)(_img, message, scale)));\n        };\n\n        _img.src = image.toDataURL();\n        return noop;\n      }\n\n      return noop;\n    }\n  }, {\n    key: \"time\",\n    value: function time(priority, message) {\n      return this._getLogFunction({\n        priority: priority,\n        message: message,\n        method: console.time ? console.time : console.info\n      });\n    }\n  }, {\n    key: \"timeEnd\",\n    value: function timeEnd(priority, message) {\n      return this._getLogFunction({\n        priority: priority,\n        message: message,\n        method: console.timeEnd ? console.timeEnd : console.info\n      });\n    }\n  }, {\n    key: \"timeStamp\",\n    value: function timeStamp(priority, message) {\n      return this._getLogFunction({\n        priority: priority,\n        message: message,\n        method: console.timeStamp || noop\n      });\n    }\n  }, {\n    key: \"group\",\n    value: function group(priority, message) {\n      var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n        collapsed: false\n      };\n      opts = this._normalizeArguments({\n        priority: priority,\n        message: message,\n        opts: opts\n      });\n      var _opts = opts,\n          collapsed = _opts.collapsed;\n      return this._getLogFunction({\n        priority: priority,\n        message: message,\n        opts: opts,\n        method: (collapsed ? console.groupCollapsed : console.group) || console.info\n      });\n    }\n  }, {\n    key: \"groupCollapsed\",\n    value: function groupCollapsed(priority, message) {\n      var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      return this.group(priority, message, Object.assign({}, opts, {\n        collapsed: true\n      }));\n    }\n  }, {\n    key: \"groupEnd\",\n    value: function groupEnd(priority) {\n      return this._getLogFunction({\n        priority: priority,\n        message: '',\n        method: console.groupEnd || noop\n      });\n    }\n  }, {\n    key: \"withGroup\",\n    value: function withGroup(priority, message, func) {\n      var opts = this._normalizeArguments({\n        priority: priority,\n        message: message\n      });\n\n      this.group(opts);\n\n      try {\n        func();\n      } finally {\n        this.groupEnd(opts.message);\n      }\n    }\n  }, {\n    key: \"trace\",\n    value: function trace() {\n      if (console.trace) {\n        console.trace();\n      }\n    }\n  }, {\n    key: \"_shouldLog\",\n    value: function _shouldLog(priority) {\n      priority = this._normalizePriority(priority);\n      return priority === 0 || this.isEnabled() && this.getPriority() >= priority;\n    }\n  }, {\n    key: \"_getElapsedTime\",\n    value: function _getElapsedTime() {\n      var total = this.getTotal();\n      var delta = this.getDelta();\n      this._deltaTs = (0, _timestamp.getTimestamp)();\n      return {\n        total: total,\n        delta: delta\n      };\n    }\n  }, {\n    key: \"_getLogFunction\",\n    value: function _getLogFunction(opts) {\n      if (this._shouldLog(opts.priority)) {\n        var _opts2 = opts,\n            method = _opts2.method;\n        opts = this._parseArguments(opts);\n        (0, _assert2.default)(method);\n        var _opts3 = opts,\n            message = _opts3.message;\n        var tag = opts.tag || opts.message;\n\n        if (opts.once) {\n          if (!cache[tag]) {\n            cache[tag] = (0, _timestamp.getTimestamp)();\n          } else {\n            return noop;\n          }\n        }\n\n        message = this._decorateMessage(message, opts);\n        return method.bind.apply(method, [console, message].concat((0, _toConsumableArray2.default)(opts.args)));\n      }\n\n      return noop;\n    }\n  }, {\n    key: \"_parseArguments\",\n    value: function _parseArguments(options) {\n      var normOpts = this._normalizeArguments(options);\n\n      var _this$_getElapsedTime = this._getElapsedTime(),\n          delta = _this$_getElapsedTime.delta,\n          total = _this$_getElapsedTime.total;\n\n      return Object.assign(options, normOpts, {\n        delta: delta,\n        total: total\n      });\n    }\n  }, {\n    key: \"_normalizePriority\",\n    value: function _normalizePriority(priority) {\n      var resolvedPriority;\n\n      switch ((0, _typeof2.default)(priority)) {\n        case 'number':\n          resolvedPriority = priority;\n          break;\n\n        case 'object':\n          resolvedPriority = priority.priority || 0;\n          break;\n\n        default:\n          resolvedPriority = 0;\n      }\n\n      (0, _assert2.default)(Number.isFinite(resolvedPriority) && resolvedPriority >= 0);\n      return resolvedPriority;\n    }\n  }, {\n    key: \"_normalizeArguments\",\n    value: function _normalizeArguments(_ref5) {\n      var priority = _ref5.priority,\n          message = _ref5.message,\n          _ref5$args = _ref5.args,\n          args = _ref5$args === void 0 ? [] : _ref5$args,\n          opts = _ref5.opts;\n      var newOpts = {\n        priority: this._normalizePriority(priority),\n        message: message,\n        args: args\n      };\n\n      switch ((0, _typeof2.default)(priority)) {\n        case 'string':\n        case 'function':\n          if (message !== undefined) {\n            args.unshift(message);\n          }\n\n          Object.assign(newOpts, {\n            message: priority\n          });\n          break;\n\n        case 'object':\n          Object.assign(newOpts, priority);\n          break;\n\n        default:\n      }\n\n      if (typeof newOpts.message === 'function') {\n        newOpts.message = this._shouldLog(newOpts.priority) ? newOpts.message() : '';\n      }\n\n      (0, _assert2.default)(typeof newOpts.message === 'string' || (0, _typeof2.default)(newOpts.message) === 'object');\n      return Object.assign(newOpts, opts);\n    }\n  }, {\n    key: \"_decorateMessage\",\n    value: function _decorateMessage(message, opts) {\n      if (typeof message === 'string') {\n        var time = '';\n\n        if (opts.time) {\n          var _this$_getElapsedTime2 = this._getElapsedTime(),\n              total = _this$_getElapsedTime2.total;\n\n          time = (0, _formatters.leftPad)((0, _formatters.formatTime)(total));\n        }\n\n        message = opts.time ? \"\".concat(this.id, \": \").concat(time, \"  \").concat(message) : \"\".concat(this.id, \": \").concat(message);\n        message = (0, _color.addColor)(message, opts.color, opts.background);\n      }\n\n      return message;\n    }\n  }, {\n    key: \"priority\",\n    set: function set(newPriority) {\n      this._storage.updateConfiguration({\n        priority: newPriority\n      });\n\n      return this;\n    },\n    get: function get() {\n      return this._storage.config.priority;\n    }\n  }]);\n  return Log;\n}();\n\nexports.default = Log;\nLog.VERSION = _globals.VERSION;\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"@babel/runtime/helpers/esm/toConsumableArray\":\"Qv3s\",\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./utils/globals\":\"wtvQ\",\"./utils/local-storage\":\"U1To\",\"./utils/timestamp\":\"dGUH\",\"./utils/formatters\":\"ue7J\",\"./utils/color\":\"C21t\",\"./utils/autobind\":\"bDDU\",\"../lib/utils/assert\":\"RKR7\"}],\"kgjN\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.enableDOMLogging = enableDOMLogging;\nexports.logLineToDOM = logLineToDOM;\nexports.default = void 0;\n\nvar _globals = require(\"./globals\");\n\nvar old = null;\n\nfunction enableDOMLogging() {\n  var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n  if (enable && !old) {\n    old = _globals.console.log.bind(_globals.console);\n\n    _globals.console.log = function () {\n      logLineToDOM.apply(void 0, arguments);\n      old.apply(void 0, arguments);\n    };\n  }\n\n  if (!enable && old) {\n    _globals.console.log = old;\n    old = null;\n  }\n}\n\nvar logDiv = null;\n\nfunction logLineToDOM(message) {\n  if (!logDiv) {\n    var markdown = _globals.global.probe.markdown;\n    logDiv = _globals.document.createElement(markdown ? 'pre' : 'div');\n  }\n\n  var childNodes = _globals.document.body.childNodes;\n\n  _globals.document.body.insertBefore(logDiv, childNodes && childNodes[0]);\n\n  if (typeof message === 'string') {\n    logDiv.innerHTML += \"\".concat(message, \"<br />\");\n  }\n}\n\nvar _default = enableDOMLogging;\nexports.default = _default;\n},{\"./globals\":\"wtvQ\"}],\"z0g1\":[function(require,module,exports) {\nvar global = arguments[3];\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"VERSION\", {\n  enumerable: true,\n  get: function () {\n    return _globals.VERSION;\n  }\n});\nObject.defineProperty(exports, \"self\", {\n  enumerable: true,\n  get: function () {\n    return _globals2.self;\n  }\n});\nObject.defineProperty(exports, \"window\", {\n  enumerable: true,\n  get: function () {\n    return _globals2.window;\n  }\n});\nObject.defineProperty(exports, \"global\", {\n  enumerable: true,\n  get: function () {\n    return _globals2.global;\n  }\n});\nObject.defineProperty(exports, \"document\", {\n  enumerable: true,\n  get: function () {\n    return _globals2.document;\n  }\n});\nObject.defineProperty(exports, \"process\", {\n  enumerable: true,\n  get: function () {\n    return _globals2.process;\n  }\n});\nObject.defineProperty(exports, \"console\", {\n  enumerable: true,\n  get: function () {\n    return _globals2.console;\n  }\n});\nObject.defineProperty(exports, \"isBrowser\", {\n  enumerable: true,\n  get: function () {\n    return _isBrowser.default;\n  }\n});\nObject.defineProperty(exports, \"isBrowserMainThread\", {\n  enumerable: true,\n  get: function () {\n    return _isBrowser.isBrowserMainThread;\n  }\n});\nObject.defineProperty(exports, \"getBrowser\", {\n  enumerable: true,\n  get: function () {\n    return _getBrowser.default;\n  }\n});\nObject.defineProperty(exports, \"isMobile\", {\n  enumerable: true,\n  get: function () {\n    return _getBrowser.isMobile;\n  }\n});\nObject.defineProperty(exports, \"isElectron\", {\n  enumerable: true,\n  get: function () {\n    return _isElectron.default;\n  }\n});\nObject.defineProperty(exports, \"assert\", {\n  enumerable: true,\n  get: function () {\n    return _assert.default;\n  }\n});\nObject.defineProperty(exports, \"Stats\", {\n  enumerable: true,\n  get: function () {\n    return _stats.default;\n  }\n});\nObject.defineProperty(exports, \"Log\", {\n  enumerable: true,\n  get: function () {\n    return _log.default;\n  }\n});\nObject.defineProperty(exports, \"COLOR\", {\n  enumerable: true,\n  get: function () {\n    return _color.COLOR;\n  }\n});\nObject.defineProperty(exports, \"_enableDOMLogging\", {\n  enumerable: true,\n  get: function () {\n    return _logToDom.enableDOMLogging;\n  }\n});\nexports.default = void 0;\n\nrequire(\"./init\");\n\nvar _globals = require(\"./lib/utils/globals\");\n\nvar _globals2 = require(\"./env/globals\");\n\nvar _isBrowser = _interopRequireWildcard(require(\"./env/is-browser\"));\n\nvar _getBrowser = _interopRequireWildcard(require(\"./env/get-browser\"));\n\nvar _isElectron = _interopRequireDefault(require(\"./env/is-electron\"));\n\nvar _assert = _interopRequireDefault(require(\"./env/assert\"));\n\nvar _stats = _interopRequireDefault(require(\"./lib/stats\"));\n\nvar _log = _interopRequireDefault(require(\"./lib/log\"));\n\nvar _color = require(\"./lib/utils/color\");\n\nvar _logToDom = require(\"./lib/utils/log-to-dom\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar _default = new _log.default({\n  id: 'probe.gl'\n});\n\nexports.default = _default;\n},{\"./init\":\"IyIv\",\"./lib/utils/globals\":\"wtvQ\",\"./env/globals\":\"z2pG\",\"./env/is-browser\":\"i60V\",\"./env/get-browser\":\"JBXe\",\"./env/is-electron\":\"EqAc\",\"./env/assert\":\"B4eQ\",\"./lib/stats\":\"lXkG\",\"./lib/log\":\"CEVT\",\"./lib/utils/color\":\"C21t\",\"./lib/utils/log-to-dom\":\"kgjN\",\"process\":\"FT5O\"}],\"mqAj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _probe = require(\"probe.gl\");\n\nvar _default = new _probe.Log({\n  id: 'deck'\n}).enable();\n\nexports.default = _default;\n},{\"probe.gl\":\"z0g1\"}],\"HIsG\":[function(require,module,exports) {\n\n\"use strict\";\n\nvar _globals = require(\"../utils/globals\");\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Version detection using babel plugin\n// Fallback for tests and SSR since global variable is defined by Webpack.\n\n/* global __VERSION__ */\nvar version = typeof \"6.4.10\" !== 'undefined' ? \"6.4.10\" : _globals.global.DECK_VERSION || 'untranspiled source';\nvar STARTUP_MESSAGE = 'set deck.log.priority=1 (or higher) to trace attribute updates';\n\nif (_globals.global.deck && _globals.global.deck.VERSION !== version) {\n  throw new Error(\"deck.gl - multiple versions detected: \".concat(_globals.global.deck.VERSION, \" vs \").concat(version));\n}\n\nif (!_globals.global.deck) {\n  /* global console */\n\n  /* eslint-disable no-console */\n  _log.default.log(0, \"deck.gl \".concat(version, \" - \").concat(STARTUP_MESSAGE))();\n\n  _globals.global.deck = _globals.global.deck || {\n    VERSION: version,\n    version: version,\n    log: _log.default\n  };\n} // TODO - Hack, remove when luma.gl 4.1.0-alpha.5 is published\n\n\nif (!console.table) {\n  console.table = function () {};\n}\n},{\"../utils/globals\":\"K9MZ\",\"../utils/log\":\"mqAj\"}],\"hqTT\":[function(require,module,exports) {\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// based on https://github.com/cheton/is-electron\n// https://github.com/electron/electron/issues/2288\n\n/* global window, process, navigator */\nfunction isElectron() {\n  // Renderer process\n  if (typeof window !== 'undefined' && (0, _typeof2.default)(window.process) === 'object' && window.process.type === 'renderer') {\n    return true;\n  } // Main process\n\n\n  if (typeof process !== 'undefined' && (0, _typeof2.default)(process.versions) === 'object' && Boolean(process.versions.electron)) {\n    return true;\n  } // Detect the user agent when the `nodeIntegration` option is set to true\n\n\n  if ((typeof navigator === \"undefined\" ? \"undefined\" : (0, _typeof2.default)(navigator)) === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\n    return true;\n  }\n\n  return false;\n}\n\nvar _default = isElectron();\n\nexports.default = _default;\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"process\":\"FT5O\"}],\"WplP\":[function(require,module,exports) {\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.isBrowserMainThread = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nvar _isElectron = _interopRequireDefault(require(\"./is-electron\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This function is needed in initialization stages,\n// make sure it can be imported in isolation\n\n/* global process */\nvar isNode = (typeof process === \"undefined\" ? \"undefined\" : (0, _typeof2.default)(process)) === 'object' && String(process) === '[object process]' && !true;\nvar isBrowser = !isNode || _isElectron.default; // document does not exist on worker thread\n\nvar isBrowserMainThread = isBrowser && typeof document !== 'undefined';\nexports.isBrowserMainThread = isBrowserMainThread;\nvar _default = isBrowser;\nexports.default = _default;\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"./is-electron\":\"hqTT\",\"process\":\"FT5O\"}],\"zU4q\":[function(require,module,exports) {\nvar global = arguments[3];\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.document = exports.global = exports.window = exports.self = void 0;\n\n/* global self, window, global, document */\nvar globals = {\n  self: typeof self !== 'undefined' && self,\n  window: typeof window !== 'undefined' && window,\n  global: typeof global !== 'undefined' && global,\n  document: typeof document !== 'undefined' && document\n};\nvar self_ = globals.self || globals.window || globals.global;\nexports.self = self_;\nvar window_ = globals.window || globals.self || globals.global;\nexports.window = window_;\nvar global_ = globals.global || globals.self || globals.window;\nexports.global = global_;\nvar document_ = globals.document || {};\nexports.document = document_;\n},{}],\"YuHO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _probe = require(\"probe.gl\");\n\nvar _default = new _probe.Log({\n  id: 'luma'\n}).enable();\n\nexports.default = _default;\n},{\"probe.gl\":\"z0g1\"}],\"Lduf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getParameterPolyfill = getParameterPolyfill;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _WEBGL_PARAMETERS;\n/* eslint-disable no-inline-comments, max-len, camelcase */\n\n\nvar OES_element_index = 'OES_element_index';\nvar WEBGL_draw_buffers = 'WEBGL_draw_buffers';\nvar EXT_disjoint_timer_query = 'EXT_disjoint_timer_query';\nvar EXT_disjoint_timer_query_webgl2 = 'EXT_disjoint_timer_query_webgl2';\nvar EXT_texture_filter_anisotropic = 'EXT_texture_filter_anisotropic';\nvar WEBGL_debug_renderer_info = 'WEBGL_debug_renderer_info';\nvar GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8b8b;\nvar GL_DONT_CARE = 0x1100;\nvar GL_GPU_DISJOINT_EXT = 0x8fbb;\nvar GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84ff;\nvar GL_UNMASKED_VENDOR_WEBGL = 0x9245; // vendor string of the graphics driver.\n\nvar GL_UNMASKED_RENDERER_WEBGL = 0x9246; // renderer string of the graphics driver.\n\nvar getWebGL2ValueOrZero = function getWebGL2ValueOrZero(gl) {\n  return !isWebGL2(gl) ? 0 : undefined;\n}; // if a function returns undefined in this table,\n// the original getParameter will be called, defeating the override\n\n\nvar WEBGL_PARAMETERS = (_WEBGL_PARAMETERS = {}, (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 3074, function (gl) {\n  return !isWebGL2(gl) ? 36064 : undefined;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, GL_FRAGMENT_SHADER_DERIVATIVE_HINT, function (gl) {\n  return !isWebGL2(gl) ? GL_DONT_CARE : undefined;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35977, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 32937, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, GL_GPU_DISJOINT_EXT, function (gl, getParameter) {\n  var ext = isWebGL2(gl) ? gl.getExtension(EXT_disjoint_timer_query_webgl2) : gl.getExtension(EXT_disjoint_timer_query);\n  return ext && ext.GPU_DISJOINT_EXT ? getParameter(ext.GPU_DISJOINT_EXT) : 0;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, GL_UNMASKED_VENDOR_WEBGL, function (gl, getParameter) {\n  var ext = gl.getExtension(WEBGL_debug_renderer_info);\n  return getParameter(ext && ext.UNMASKED_VENDOR_WEBGL || 7936);\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, GL_UNMASKED_RENDERER_WEBGL, function (gl, getParameter) {\n  var ext = gl.getExtension(WEBGL_debug_renderer_info);\n  return getParameter(ext && ext.UNMASKED_RENDERER_WEBGL || 7937);\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, function (gl, getParameter) {\n  var ext = gl.luma.extensions[EXT_texture_filter_anisotropic];\n  return ext ? getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1.0;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 32883, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35071, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 37447, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 36063, function (gl, getParameter) {\n  if (!isWebGL2(gl)) {\n    var ext = gl.getExtension(WEBGL_draw_buffers);\n    return ext ? getParameter(ext.MAX_COLOR_ATTACHMENTS_WEBGL) : 0;\n  }\n\n  return undefined;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35379, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35374, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35377, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 34852, function (gl) {\n  if (!isWebGL2(gl)) {\n    var ext = gl.getExtension(WEBGL_draw_buffers);\n    return ext ? ext.MAX_DRAW_BUFFERS_WEBGL : 0;\n  }\n\n  return undefined;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 36203, // Guess: per webglstats.com 99.6% of webgl2 supports 2147483647\nfunction (gl) {\n  return gl.getExtension(OES_element_index) ? 2147483647 : 65535;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 33001, // Guess: \"Reasonably safe\" per webglstats.com - could be higher/lower (on some mobile devices)\nfunction (gl) {\n  return gl.getExtension(OES_element_index) ? 16777216 : 65535;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 33000, // Guess: \"Reasonably safe\" per webglstats.com - could be higher/lower (on some mobile devices)\nfunction (gl) {\n  return 16777216;\n}), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 37157, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35373, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35657, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 36183, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 37137, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 34045, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35978, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35979, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35968, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35376, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35375, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35659, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 37154, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35371, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35658, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35076, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35077, getWebGL2ValueOrZero), (0, _defineProperty2.default)(_WEBGL_PARAMETERS, 35380, getWebGL2ValueOrZero), _WEBGL_PARAMETERS); // Return true if WebGL2 context\n\nfunction isWebGL2(gl) {\n  var GL_TEXTURE_BINDING_3D = 0x806a;\n  return gl && 32874 === GL_TEXTURE_BINDING_3D;\n} // A \"replacement\" gl.getParameter that accepts \"enums\" from extensions and WebGL2\n// and returns reasonably safe defaults\n\n\nfunction getParameterPolyfill(gl, originalGetParameter, pname) {\n  // Return mock limits (usually 0) for WebGL2 constants to ensure these\n  // can be queries without error\n  var limit = WEBGL_PARAMETERS[pname];\n  var value = typeof limit === 'function' ? limit(gl, originalGetParameter, pname) : limit;\n  var result = value !== undefined ? value : originalGetParameter(pname);\n  return result;\n}\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\"}],\"uIkb\":[function(require,module,exports) {\nvar global = arguments[3];\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = polyfillContext;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _polyfillGetParameter = require(\"./polyfill-get-parameter\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _WEBGL_CONTEXT_POLYFI; // WebGL1/WebGL2 extension polyfill support\n//\n// Provides a function that creates polyfills for WebGL2 functions based\n// on available extensions and installs them on a supplied target (could be\n// the WebGLContext or its prototype, or a separate object).\n//\n// This is intended to be a stand-alone file with minimal dependencies,\n// easy to reuse or repurpose in other projects.\n\n/* eslint-disable camelcase, brace-style */\n\n\n// import polyfillVertexArrayObject from './polyfill-vertex-array-object';\n// import {WebGLRenderingContext} from './webgl-rendering-context';\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(message || 'luma.gl: assertion failed.');\n  }\n}\n\nvar OES_vertex_array_object = 'OES_vertex_array_object';\nvar ANGLE_instanced_arrays = 'ANGLE_instanced_arrays';\nvar WEBGL_draw_buffers = 'WEBGL_draw_buffers';\nvar EXT_disjoint_timer_query = 'EXT_disjoint_timer_query';\nvar EXT_disjoint_timer_query_webgl2 = 'EXT_disjoint_timer_query_webgl2';\nvar EXT_texture_filter_anisotropic = 'EXT_texture_filter_anisotropic';\nvar ERR_VAO_NOT_SUPPORTED = 'VertexArray requires WebGL2 or OES_vertex_array_object extension'; // Return true if WebGL2 context\n\nfunction isWebGL2(gl) {\n  return gl && 32874 === 32874;\n} // Return object with webgl2 flag and an extension\n\n\nfunction getExtensionData(gl, extension) {\n  return {\n    webgl2: isWebGL2(gl),\n    ext: gl.getExtension(extension)\n  };\n} // function mapExtensionConstant(gl, constant) {\n//   switch (constant) {\n//   case ext.FRAGMENT_SHADER_DERIVATIVE_HINT_OES: return GL.FRAGMENT_SHADER_DERIVATIVE_HINT;\n//   }\n// }\n\n\nvar WEBGL_CONTEXT_POLYFILLS = (_WEBGL_CONTEXT_POLYFI = {}, (0, _defineProperty2.default)(_WEBGL_CONTEXT_POLYFI, OES_vertex_array_object, {\n  meta: {\n    suffix: 'OES'\n  },\n  // NEW METHODS\n  createVertexArray: function createVertexArray() {\n    assert(false, ERR_VAO_NOT_SUPPORTED);\n  },\n  deleteVertexArray: function deleteVertexArray() {},\n  bindVertexArray: function bindVertexArray() {},\n  isVertexArray: function isVertexArray() {\n    return false;\n  }\n}), (0, _defineProperty2.default)(_WEBGL_CONTEXT_POLYFI, ANGLE_instanced_arrays, {\n  meta: {\n    suffix: 'ANGLE' // constants: {\n    //   VERTEX_ATTRIB_ARRAY_DIVISOR: 'VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE'\n    // }\n\n  },\n  vertexAttribDivisor: function vertexAttribDivisor(location, divisor) {\n    // Accept divisor 0 even if instancing is not supported (0 = no instancing)\n    assert(divisor === 0, 'WebGL instanced rendering not supported');\n  },\n  drawElementsInstanced: function drawElementsInstanced() {},\n  drawArraysInstanced: function drawArraysInstanced() {}\n}), (0, _defineProperty2.default)(_WEBGL_CONTEXT_POLYFI, WEBGL_draw_buffers, {\n  meta: {\n    suffix: 'WEBGL'\n  },\n  drawBuffers: function drawBuffers() {\n    assert(false);\n  }\n}), (0, _defineProperty2.default)(_WEBGL_CONTEXT_POLYFI, EXT_disjoint_timer_query, {\n  meta: {\n    suffix: 'EXT'\n  },\n  // WebGL1: Polyfills the WebGL2 Query API\n  createQuery: function createQuery() {\n    assert(false);\n  },\n  deleteQuery: function deleteQuery() {\n    assert(false);\n  },\n  beginQuery: function beginQuery() {\n    assert(false);\n  },\n  endQuery: function endQuery() {},\n  getQuery: function getQuery(handle, pname) {\n    return this.getQueryObject(handle, pname);\n  },\n  // The WebGL1 extension uses getQueryObject rather then getQueryParameter\n  getQueryParameter: function getQueryParameter(handle, pname) {\n    return this.getQueryObject(handle, pname);\n  },\n  // plus the additional `queryCounter` method\n  queryCounter: function queryCounter() {},\n  getQueryObject: function getQueryObject() {}\n}), (0, _defineProperty2.default)(_WEBGL_CONTEXT_POLYFI, EXT_disjoint_timer_query_webgl2, {\n  meta: {\n    suffix: 'EXT'\n  },\n  // install `queryCounter`\n  // `null` avoids overwriting WebGL1 `queryCounter` if the WebGL2 extension is not available\n  queryCounter: null\n}), (0, _defineProperty2.default)(_WEBGL_CONTEXT_POLYFI, \"OVERRIDES\", {\n  // Ensure readBuffer is a no-op\n  readBuffer: function readBuffer(gl, originalFunc, attachment) {\n    if (isWebGL2(gl)) {\n      originalFunc(attachment);\n    } else {// assert(attachment !== GL_COLOR_ATTACHMENT0 && attachment !== GL_FRONT);\n    }\n  },\n  // Override for getVertexAttrib that returns sane values for non-WebGL1 constants\n  getVertexAttrib: function getVertexAttrib(gl, originalFunc, location, pname) {\n    // const gl = this; // eslint-disable-line\n    var _getExtensionData = getExtensionData(gl, ANGLE_instanced_arrays),\n        webgl2 = _getExtensionData.webgl2,\n        ext = _getExtensionData.ext;\n\n    var result;\n\n    switch (pname) {\n      // WebGL1 attributes will never be integer\n      case 35069:\n        result = !webgl2 ? false : undefined;\n        break;\n      // if instancing is not available, return 0 meaning divisor has not been set\n\n      case 35070:\n        result = !webgl2 && !ext ? 0 : undefined;\n        break;\n\n      default:\n    }\n\n    return result !== undefined ? result : originalFunc(location, pname);\n  },\n  // Handle transform feedback and uniform block queries in WebGL1\n  getProgramParameter: function getProgramParameter(gl, originalFunc, program, pname) {\n    if (!isWebGL2(gl)) {\n      switch (pname) {\n        case 35967:\n          return 35981;\n\n        case 35971:\n          return 0;\n\n        case 35382:\n          return 0;\n\n        default:\n      }\n    }\n\n    return originalFunc(program, pname);\n  },\n  getInternalformatParameter: function getInternalformatParameter(gl, originalFunc, target, format, pname) {\n    if (!isWebGL2(gl)) {\n      switch (pname) {\n        case 32937:\n          return new Int32Array([0]);\n\n        default:\n      }\n    }\n\n    return gl.getInternalformatParameter(target, format, pname);\n  },\n  getTexParameter: function getTexParameter(gl, originalFunc, target, pname) {\n    switch (pname) {\n      case 34046:\n        var extensions = gl.luma.extensions;\n        var ext = extensions[EXT_texture_filter_anisotropic];\n        pname = ext && ext.TEXTURE_MAX_ANISOTROPY_EXT || 34046;\n        break;\n\n      default:\n    }\n\n    return originalFunc(target, pname);\n  },\n  getParameter: _polyfillGetParameter.getParameterPolyfill,\n  hint: function hint(gl, originalFunc, pname, value) {\n    // TODO - handle GL.FRAGMENT_SHADER_DERIVATIVE_HINT:\n    // switch (pname) {\n    // case GL.FRAGMENT_SHADER_DERIVATIVE_HINT:\n    // }\n    return originalFunc(pname, value);\n  }\n}), _WEBGL_CONTEXT_POLYFI);\n\nfunction initializeExtensions(gl) {\n  gl.luma.extensions = {}; // `getSupportedExtensions` can return null when context is lost.\n\n  var EXTENSIONS = gl.getSupportedExtensions() || [];\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = EXTENSIONS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var extension = _step.value;\n      gl.luma[extension] = gl.getExtension(extension);\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n} // Polyfills a single WebGL extension into the `target` object\n\n\nfunction polyfillExtension(gl, _ref) {\n  var extension = _ref.extension,\n      target = _ref.target,\n      target2 = _ref.target2;\n  var defaults = WEBGL_CONTEXT_POLYFILLS[extension];\n  assert(defaults);\n  var _defaults$meta = defaults.meta,\n      meta = _defaults$meta === void 0 ? {} : _defaults$meta;\n  var _meta$suffix = meta.suffix,\n      suffix = _meta$suffix === void 0 ? '' : _meta$suffix;\n  var ext = gl.getExtension(extension);\n  Object.keys(defaults).forEach(function (key) {\n    var extKey = \"\".concat(key).concat(suffix);\n    var polyfill = null;\n\n    if (key === 'meta') {// ignore\n    } else if (typeof gl[key] === 'function') {// WebGL2 implementation is already\n    } else if (ext && typeof ext[extKey] === 'function') {\n      // pick extension implemenentation,if available\n      polyfill = function polyfill() {\n        return ext[extKey].apply(ext, arguments);\n      };\n    } else if (typeof defaults[key] === 'function') {\n      // pick the mock implementation, if no implementation was detected\n      polyfill = defaults[key].bind(target);\n    }\n\n    if (polyfill) {\n      target[key] = polyfill;\n      target2[key] = polyfill;\n    }\n  });\n} // Install simple overrides (mostly get* functions)\n\n\nfunction installOverrides(gl, _ref2) {\n  var target = _ref2.target,\n      target2 = _ref2.target2;\n  var OVERRIDES = WEBGL_CONTEXT_POLYFILLS.OVERRIDES;\n  Object.keys(OVERRIDES).forEach(function (key) {\n    if (typeof OVERRIDES[key] === 'function') {\n      // install an override, if no implementation was detected\n      var originalFunc = gl[key] ? gl[key].bind(gl) : function () {};\n      var polyfill = OVERRIDES[key].bind(null, gl, originalFunc);\n      target[key] = polyfill;\n      target2[key] = polyfill;\n    }\n  });\n} // Registers polyfill or mock functions for all known extensions\n\n\nfunction polyfillContext(gl) {\n  // polyfillVertexArrayObject(WebGLRenderingContext, gl);\n  gl.luma = gl.luma || {};\n  initializeExtensions(gl);\n\n  if (!gl.luma.polyfilled) {\n    for (var extension in WEBGL_CONTEXT_POLYFILLS) {\n      if (extension !== 'overrides') {\n        polyfillExtension(gl, {\n          extension: extension,\n          target: gl.luma,\n          target2: gl\n        });\n      }\n    }\n\n    installOverrides(gl, {\n      target: gl.luma,\n      target2: gl\n    });\n    gl.luma.polyfilled = true;\n  }\n\n  return gl;\n}\n/* global window, global */\n\n\nvar global_ = typeof global !== 'undefined' ? global : window;\nglobal_.polyfillContext = polyfillContext;\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"./polyfill-get-parameter\":\"Lduf\"}],\"RTp2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"polyfillContext\", {\n  enumerable: true,\n  get: function () {\n    return _polyfillContext.default;\n  }\n});\n\nvar _polyfillContext = _interopRequireDefault(require(\"./polyfill-context\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./polyfill-context\":\"uIkb\"}],\"aXVf\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"global\", {\n  enumerable: true,\n  get: function () {\n    return _globals.global;\n  }\n});\nexports.default = void 0;\n\nvar _isBrowser = _interopRequireDefault(require(\"./utils/is-browser\"));\n\nvar _globals = require(\"./utils/globals\");\n\nvar _log = _interopRequireDefault(require(\"./utils/log\"));\n\nrequire(\"./webgl1\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// TODO - when webgl2 gets ubiquitous, remove default support for webgl1 by dropping next line\n// Version detection using babel plugin\n\n/* global __VERSION__ */\nvar VERSION = typeof \"6.4.3\" !== 'undefined' ? \"6.4.3\" : 'untranspiled source';\nvar STARTUP_MESSAGE = 'set luma.log.priority=1 (or higher) to trace rendering'; // Assign luma.log.priority in console to control logging: \\\n// 0: none, 1: minimal, 2: verbose, 3: attribute/uniforms, 4: gl logs\n// luma.log.break[], set to gl funcs, luma.log.profile[] set to model names`;\n\nif (_globals.global.luma && _globals.global.luma.VERSION !== VERSION) {\n  throw new Error(\"luma.gl - multiple VERSIONs detected: \".concat(_globals.global.luma.VERSION, \" vs \").concat(VERSION));\n}\n\nif (!_globals.global.luma) {\n  if (_isBrowser.default) {\n    _log.default.log(0, \"luma.gl \".concat(VERSION, \" - \").concat(STARTUP_MESSAGE))();\n  }\n\n  _globals.global.luma = _globals.global.luma || {\n    VERSION: VERSION,\n    version: VERSION,\n    log: _log.default,\n    // A global stats object that various components can add information to\n    // E.g. see webgl/resource.js\n    stats: {},\n    // Keep some luma globals in a sub-object\n    // This allows us to dynamically detect if certain modules have been\n    // included (such as IO and headless) and enable related functionality,\n    // without unconditionally requiring and thus bundling big dependencies\n    // into the app.\n    globals: {\n      modules: {},\n      nodeIO: {}\n    }\n  };\n}\n\nvar _default = _globals.global.luma;\nexports.default = _default;\n},{\"./utils/is-browser\":\"WplP\",\"./utils/globals\":\"zU4q\",\"./utils/log\":\"YuHO\",\"./webgl1\":\"RTp2\"}],\"bFVP\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WebGL2RenderingContext = exports.WebGLShaderPrecisionFormat = exports.WebGLActiveInfo = exports.WebGLUniformLocation = exports.WebGLTexture = exports.WebGLRenderbuffer = exports.WebGLFramebuffer = exports.WebGLBuffer = exports.WebGLShader = exports.WebGLProgram = exports.WebGLRenderingContext = exports.Image = exports.webGLTypesAvailable = exports.headlessGL = exports.headlessTypes = exports.ERR_HEADLESSGL_LOAD = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _globals = require(\"../utils/globals\");\n\nvar _isBrowser = _interopRequireDefault(require(\"../utils/is-browser\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// WEBGL BUILT-IN TYPES\n// 1) Exports all WebGL constants as {GL}\n// 2) Enables app to \"import\" WebGL types\n//    - Importing these types makes them known to eslint etc.\n//    - Provides dummy types for WebGL2 when not available to streamline\n//      library code.\n//    - Exports types from headless gl when running under Node.js\n\n/* eslint-disable quotes, no-console */\nvar ERR_HEADLESSGL_LOAD = \"luma.gl: loaded under Node.js without headless gl installed, meaning that WebGL contexts can not be created. This may not be an error. For example, this is a typical configuration for isorender applications running on the server.\"; // Load headless gl dynamically, if available\n\nexports.ERR_HEADLESSGL_LOAD = ERR_HEADLESSGL_LOAD;\nvar headlessTypes = null;\nexports.headlessTypes = headlessTypes;\n\nvar headlessGL = function headlessGL() {\n  throw new Error(ERR_HEADLESSGL_LOAD);\n};\n\nexports.headlessGL = headlessGL;\n\nif (!_isBrowser.default) {\n  try {\n    exports.headlessGL = headlessGL = module.require('gl');\n    exports.headlessTypes = headlessTypes = module.require('gl/wrap');\n  } catch (error) {// /* global console */\n    // console.info(ERR_HEADLESSGL_LOAD);\n  }\n}\n\nvar DummyType = function DummyType() {\n  (0, _classCallCheck2.default)(this, DummyType);\n};\n\nvar _ref = headlessTypes || _globals.global,\n    _ref$WebGLRenderingCo = _ref.WebGLRenderingContext,\n    WebGLRenderingContext = _ref$WebGLRenderingCo === void 0 ? DummyType : _ref$WebGLRenderingCo,\n    _ref$WebGLProgram = _ref.WebGLProgram,\n    WebGLProgram = _ref$WebGLProgram === void 0 ? DummyType : _ref$WebGLProgram,\n    _ref$WebGLShader = _ref.WebGLShader,\n    WebGLShader = _ref$WebGLShader === void 0 ? DummyType : _ref$WebGLShader,\n    _ref$WebGLBuffer = _ref.WebGLBuffer,\n    WebGLBuffer = _ref$WebGLBuffer === void 0 ? DummyType : _ref$WebGLBuffer,\n    _ref$WebGLFramebuffer = _ref.WebGLFramebuffer,\n    WebGLFramebuffer = _ref$WebGLFramebuffer === void 0 ? DummyType : _ref$WebGLFramebuffer,\n    _ref$WebGLRenderbuffe = _ref.WebGLRenderbuffer,\n    WebGLRenderbuffer = _ref$WebGLRenderbuffe === void 0 ? DummyType : _ref$WebGLRenderbuffe,\n    _ref$WebGLTexture = _ref.WebGLTexture,\n    WebGLTexture = _ref$WebGLTexture === void 0 ? DummyType : _ref$WebGLTexture,\n    _ref$WebGLUniformLoca = _ref.WebGLUniformLocation,\n    WebGLUniformLocation = _ref$WebGLUniformLoca === void 0 ? DummyType : _ref$WebGLUniformLoca,\n    _ref$WebGLActiveInfo = _ref.WebGLActiveInfo,\n    WebGLActiveInfo = _ref$WebGLActiveInfo === void 0 ? DummyType : _ref$WebGLActiveInfo,\n    _ref$WebGLShaderPreci = _ref.WebGLShaderPrecisionFormat,\n    WebGLShaderPrecisionFormat = _ref$WebGLShaderPreci === void 0 ? DummyType : _ref$WebGLShaderPreci;\n\nexports.WebGLShaderPrecisionFormat = WebGLShaderPrecisionFormat;\nexports.WebGLActiveInfo = WebGLActiveInfo;\nexports.WebGLUniformLocation = WebGLUniformLocation;\nexports.WebGLTexture = WebGLTexture;\nexports.WebGLRenderbuffer = WebGLRenderbuffer;\nexports.WebGLFramebuffer = WebGLFramebuffer;\nexports.WebGLBuffer = WebGLBuffer;\nexports.WebGLShader = WebGLShader;\nexports.WebGLProgram = WebGLProgram;\nexports.WebGLRenderingContext = WebGLRenderingContext;\nvar webGLTypesAvailable = WebGLRenderingContext !== DummyType && WebGLProgram !== DummyType && WebGLShader !== DummyType && WebGLBuffer !== DummyType && WebGLFramebuffer !== DummyType && WebGLRenderbuffer !== DummyType && WebGLTexture !== DummyType && WebGLUniformLocation !== DummyType && WebGLActiveInfo !== DummyType && WebGLShaderPrecisionFormat !== DummyType; // Ensures that WebGL2RenderingContext is defined in non-WebGL2 environments\n// so that apps can test their gl contexts with instanceof\n// E.g. if (gl instanceof WebGL2RenderingContext) { }\n\nexports.webGLTypesAvailable = webGLTypesAvailable;\n\nfunction getWebGL2RenderingContext() {\n  var WebGL2RenderingContextNotSupported = function WebGL2RenderingContextNotSupported() {\n    (0, _classCallCheck2.default)(this, WebGL2RenderingContextNotSupported);\n  };\n\n  return _globals.global.WebGL2RenderingContext || WebGL2RenderingContextNotSupported;\n} // Ensure that Image is defined under Node.js\n\n\nfunction getImage() {\n  var ImageNotSupported = function ImageNotSupported() {\n    (0, _classCallCheck2.default)(this, ImageNotSupported);\n  };\n\n  return _globals.global.Image || ImageNotSupported;\n}\n\nvar WebGL2RenderingContext = getWebGL2RenderingContext();\nexports.WebGL2RenderingContext = WebGL2RenderingContext;\nvar Image = getImage(); // Export the standard WebGL types\n\nexports.Image = Image;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"../utils/globals\":\"zU4q\",\"../utils/is-browser\":\"WplP\"}],\"iVaU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = assert;\n\n// Recommendation is to ignore message but current test suite checks agains the\n// message so keep it for now.\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(message || 'luma.gl: assertion failed.');\n  }\n}\n},{}],\"it7h\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isWebGL = isWebGL;\nexports.isWebGL2 = isWebGL2;\nexports.assertWebGLContext = assertWebGLContext;\nexports.assertWebGL2Context = assertWebGL2Context;\nexports.ERR_WEBGL2 = exports.ERR_WEBGL = exports.ERR_CONTEXT = void 0;\n\nvar _webglTypes = require(\"./webgl-types\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Heuristic testing of contexts (to indentify debug wrappers around gl contexts)\nvar GL_ARRAY_BUFFER = 0x8892;\nvar GL_TEXTURE_BINDING_3D = 0x806a;\nvar ERR_CONTEXT = 'Invalid WebGLRenderingContext';\nexports.ERR_CONTEXT = ERR_CONTEXT;\nvar ERR_WEBGL = ERR_CONTEXT;\nexports.ERR_WEBGL = ERR_WEBGL;\nvar ERR_WEBGL2 = 'Requires WebGL2';\nexports.ERR_WEBGL2 = ERR_WEBGL2;\n\nfunction isWebGL(glAlias) {\n  return Boolean(glAlias && (glAlias instanceof _webglTypes.WebGLRenderingContext || // `glAlias` name prevents gl constant inliner from making this always true\n  glAlias.ARRAY_BUFFER === GL_ARRAY_BUFFER));\n}\n\nfunction isWebGL2(glAlias) {\n  return Boolean(glAlias && (glAlias instanceof _webglTypes.WebGL2RenderingContext || // `glAlias` name prevents gl constant inliner from making this always true\n  glAlias.TEXTURE_BINDING_3D === GL_TEXTURE_BINDING_3D));\n}\n\nfunction assertWebGLContext(gl) {\n  // Need to handle debug context\n  (0, _assert.default)(isWebGL(gl), ERR_CONTEXT);\n}\n\nfunction assertWebGL2Context(gl) {\n  // Need to handle debug context\n  (0, _assert.default)(isWebGL2(gl), ERR_WEBGL2);\n}\n},{\"./webgl-types\":\"bFVP\",\"../utils/assert\":\"iVaU\"}],\"bk0i\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _assertThisInitialized;\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n},{}],\"aBEI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _possibleConstructorReturn;\n\nvar _typeof2 = _interopRequireDefault(require(\"../../helpers/esm/typeof\"));\n\nvar _assertThisInitialized = _interopRequireDefault(require(\"./assertThisInitialized\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && ((0, _typeof2.default)(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return (0, _assertThisInitialized.default)(self);\n}\n},{\"../../helpers/esm/typeof\":\"xLw6\",\"./assertThisInitialized\":\"bk0i\"}],\"QQCW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _getPrototypeOf;\n\nfunction _getPrototypeOf(o) {\n  exports.default = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n},{}],\"hewo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _setPrototypeOf;\n\nfunction _setPrototypeOf(o, p) {\n  exports.default = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n},{}],\"NT06\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _inherits;\n\nvar _setPrototypeOf = _interopRequireDefault(require(\"./setPrototypeOf\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) (0, _setPrototypeOf.default)(subClass, superClass);\n}\n},{\"./setPrototypeOf\":\"hewo\"}],\"qcWm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.requestAnimationFrame = requestAnimationFrame;\nexports.cancelAnimationFrame = cancelAnimationFrame;\n\n// Node.js polyfills for requestAnimationFrame and cancelAnimationFrame\n\n/* global window, setTimeout, clearTimeout */\nfunction requestAnimationFrame(callback) {\n  return typeof window !== 'undefined' && window.requestAnimationFrame ? window.requestAnimationFrame(callback) : setTimeout(callback, 1000 / 60);\n}\n\nfunction cancelAnimationFrame(timerId) {\n  return typeof window !== 'undefined' && window.cancelAnimationFrame ? window.cancelAnimationFrame(timerId) : clearTimeout(timerId);\n}\n},{}],\"yLkN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = getShaderName;\nexports.getShaderTypeName = getShaderTypeName;\nvar GL_FRAGMENT_SHADER = 0x8b30;\nvar GL_VERTEX_SHADER = 0x8b31; // Supports GLSLIFY style naming of shaders\n// #define SHADER_NAME ...\n\nfunction getShaderName(shader) {\n  var defaultName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'unnamed';\n  var SHADER_NAME_REGEXP = /#define[\\s*]SHADER_NAME[\\s*]([A-Za-z0-9_-]+)[\\s*]/;\n  var match = shader.match(SHADER_NAME_REGEXP);\n  return match ? match[1] : defaultName;\n}\n\nfunction getShaderTypeName(type) {\n  switch (type) {\n    case GL_FRAGMENT_SHADER:\n      return 'fragment';\n\n    case GL_VERTEX_SHADER:\n      return 'vertex';\n\n    default:\n      return 'unknown type';\n  }\n}\n},{}],\"ATgZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.parseGLSLCompilerError = parseGLSLCompilerError;\nexports.default = formatGLSLCompilerError;\n\nvar _getShaderName = _interopRequireWildcard(require(\"./get-shader-name\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// TODO - formatGLSLCompilerError should not depend on this\n\n/**\n * Parse a GLSL compiler error log into a string showing the source code around each error.\n * Based on https://github.com/wwwtyro/gl-format-compiler-error (public domain)\n */\n\n/* eslint-disable no-continue, max-statements */\nfunction parseGLSLCompilerError(errLog, src, shaderType, shaderName) {\n  var errorStrings = errLog.split(/\\r?\\n/);\n  var errors = {};\n  var warnings = {}; // Patch the shader name\n\n  var name = shaderName || (0, _getShaderName.default)(src) || '(unnamed)';\n  var shaderDescription = \"\".concat((0, _getShaderName.getShaderTypeName)(shaderType), \" shader \").concat(name); // Parse the error - note: browser and driver dependent\n\n  for (var i = 0; i < errorStrings.length; i++) {\n    var errorString = errorStrings[i];\n\n    if (errorString.length <= 1) {\n      continue;\n    }\n\n    var segments = errorString.split(':');\n    var type = segments[0];\n    var line = parseInt(segments[2], 10);\n\n    if (isNaN(line)) {\n      throw new Error(\"GLSL compilation error in \".concat(shaderDescription, \": \").concat(errLog));\n    }\n\n    if (type !== 'WARNING') {\n      errors[line] = errorString;\n    } else {\n      warnings[line] = errorString;\n    }\n  } // Format the error inline with the code\n\n\n  var lines = addLineNumbers(src);\n  return {\n    shaderName: shaderDescription,\n    errors: formatErrors(errors, lines),\n    warnings: formatErrors(warnings, lines)\n  };\n} // Formats GLSL compiler error log into single string\n\n\nfunction formatGLSLCompilerError(errLog, src, shaderType) {\n  var _parseGLSLCompilerErr = parseGLSLCompilerError(errLog, src, shaderType),\n      shaderName = _parseGLSLCompilerErr.shaderName,\n      errors = _parseGLSLCompilerErr.errors,\n      warnings = _parseGLSLCompilerErr.warnings;\n\n  return \"GLSL compilation error in \".concat(shaderName, \"\\n\\n\").concat(errors, \"\\n\").concat(warnings);\n} // helper function, outputs annotated errors or warnings\n\n\nfunction formatErrors(errors, lines) {\n  var message = '';\n\n  for (var i = 0; i < lines.length; i++) {\n    var line = lines[i];\n\n    if (!errors[i + 3] && !errors[i + 2] && !errors[i + 1]) {\n      continue;\n    }\n\n    message += \"\".concat(line, \"\\n\");\n\n    if (errors[i + 1]) {\n      var error = errors[i + 1];\n      var segments = error.split(':', 3);\n      var type = segments[0];\n      var column = parseInt(segments[1], 10) || 0;\n      var err = error.substring(segments.join(':').length + 1).trim();\n      message += padLeft(\"^^^ \".concat(type, \": \").concat(err, \"\\n\\n\"), column);\n    }\n  }\n\n  return message;\n}\n/**\n * Prepends line numbers to each line of a string.\n * The line numbers will be left-padded with spaces to ensure an\n * aligned layout when rendered using monospace fonts.\n * @param {String} string - multi-line string to add line numbers to\n * @param {Number} start=1 - number of spaces to add\n * @param {String} delim =': ' - injected between line number and original line\n * @return {String[]} strings - array of string, one per line, with line numbers added\n */\n\n\nfunction addLineNumbers(string) {\n  var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var delim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ': ';\n  var lines = string.split(/\\r?\\n/);\n  var maxDigits = String(lines.length + start - 1).length;\n  return lines.map(function (line, i) {\n    var lineNumber = i + start;\n    var digits = String(lineNumber).length;\n    var prefix = padLeft(lineNumber, maxDigits - digits);\n    return prefix + delim + line;\n  });\n}\n/**\n * Pads a string with a number of spaces (space characters) to the left\n * @param {String} string - string to pad\n * @param {Number} digits - number of spaces to add\n * @return {String} string - The padded string\n */\n\n\nfunction padLeft(string, digits) {\n  var result = '';\n\n  for (var i = 0; i < digits; ++i) {\n    result += ' ';\n  }\n\n  return \"\".concat(result).concat(string);\n}\n},{\"./get-shader-name\":\"yLkN\"}],\"v5qF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getGLTypeFromTypedArray = getGLTypeFromTypedArray;\nexports.getTypedArrayFromGLType = getTypedArrayFromGLType;\nexports.flipRows = flipRows;\nexports.scalePixels = scalePixels;\nvar ERR_TYPE_DEDUCTION = 'Failed to deduce GL constant from typed array'; // Converts TYPED ARRAYS to corresponding GL constant\n// Used to auto deduce gl parameter types\n\nfunction getGLTypeFromTypedArray(arrayOrType) {\n  // If typed array, look up constructor\n  var type = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;\n\n  switch (type) {\n    case Float32Array:\n      return 5126;\n\n    case Uint16Array:\n      return 5123;\n\n    case Uint32Array:\n      return 5125;\n\n    case Uint8Array:\n      return 5121;\n\n    case Uint8ClampedArray:\n      return 5121;\n\n    case Int8Array:\n      return 5120;\n\n    case Int16Array:\n      return 5122;\n\n    case Int32Array:\n      return 5124;\n\n    default:\n      throw new Error(ERR_TYPE_DEDUCTION);\n  }\n} // Converts GL constant to corresponding TYPED ARRAY\n// Used to auto deduce gl parameter types\n\n/* eslint-disable complexity */\n\n\nfunction getTypedArrayFromGLType(glType) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$clamped = _ref.clamped,\n      clamped = _ref$clamped === void 0 ? true : _ref$clamped; // Sorted in some order of likelihood to reduce amount of comparisons\n\n\n  switch (glType) {\n    case 5126:\n      return Float32Array;\n\n    case 5123:\n    case 33635:\n    case 32819:\n    case 32820:\n      return Uint16Array;\n\n    case 5125:\n      return Uint32Array;\n\n    case 5121:\n      return clamped ? Uint8ClampedArray : Uint8Array;\n\n    case 5120:\n      return Int8Array;\n\n    case 5122:\n      return Int16Array;\n\n    case 5124:\n      return Int32Array;\n\n    default:\n      throw new Error('Failed to deduce typed array type from GL constant');\n  }\n}\n/* eslint-enable complexity */\n// Flip rows (can be used on arrays returned from `Framebuffer.readPixels`)\n// https://stackoverflow.com/questions/41969562/\n// how-can-i-flip-the-result-of-webglrenderingcontext-readpixels\n\n\nfunction flipRows(_ref2) {\n  var data = _ref2.data,\n      width = _ref2.width,\n      height = _ref2.height,\n      _ref2$bytesPerPixel = _ref2.bytesPerPixel,\n      bytesPerPixel = _ref2$bytesPerPixel === void 0 ? 4 : _ref2$bytesPerPixel,\n      temp = _ref2.temp;\n  var bytesPerRow = width * bytesPerPixel; // make a temp buffer to hold one row\n\n  temp = temp || new Uint8Array(bytesPerRow);\n\n  for (var y = 0; y < height / 2; ++y) {\n    var topOffset = y * bytesPerRow;\n    var bottomOffset = (height - y - 1) * bytesPerRow; // make copy of a row on the top half\n\n    temp.set(data.subarray(topOffset, topOffset + bytesPerRow)); // copy a row from the bottom half to the top\n\n    data.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow); // copy the copy of the top half row to the bottom half\n\n    data.set(temp, bottomOffset);\n  }\n}\n\nfunction scalePixels(_ref3) {\n  var data = _ref3.data,\n      width = _ref3.width,\n      height = _ref3.height;\n  var newWidth = Math.round(width / 2);\n  var newHeight = Math.round(height / 2);\n  var newData = new Uint8Array(newWidth * newHeight * 4);\n\n  for (var y = 0; y < newHeight; y++) {\n    for (var x = 0; x < newWidth; x++) {\n      for (var c = 0; c < 4; c++) {\n        newData[(y * newWidth + x) * 4 + c] = data[(y * 2 * width + x * 2) * 4 + c];\n      }\n    }\n  }\n\n  return {\n    data: newData,\n    width: newWidth,\n    height: newHeight\n  };\n}\n},{}],\"d71e\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getKeyValue = getKeyValue;\nexports.getKey = getKey;\nexports.getKeyType = getKeyType;\nexports.glGet = glGet;\nexports.glKey = glKey;\nexports.glKeyType = glKeyType;\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Resolve a WebGL enumeration name (returns itself if already a number)\nfunction getKeyValue(gl, name) {\n  // If not a string, return (assume number)\n  if (typeof name !== 'string') {\n    return name;\n  } // If string converts to number, return number\n\n\n  var number = Number(name);\n\n  if (!isNaN(number)) {\n    return number;\n  } // Look up string, after removing any 'GL.' or 'gl.' prefix\n\n\n  name = name.replace(/^.*\\./, '');\n  var value = gl[name];\n  (0, _assert.default)(value !== undefined, \"Accessing undefined constant GL.\".concat(name));\n  return value;\n}\n\nfunction getKey(gl, value) {\n  value = Number(value);\n\n  for (var key in gl) {\n    if (gl[key] === value) {\n      return \"GL.\".concat(key);\n    }\n  }\n\n  return String(value);\n}\n\nfunction getKeyType(gl, value) {\n  (0, _assert.default)(value !== undefined, 'undefined key');\n  value = Number(value);\n\n  for (var key in gl) {\n    if (gl[key] === value) {\n      return \"GL.\".concat(key);\n    }\n  }\n\n  return String(value);\n} // Public methods\n// Resolve a WebGL enumeration name (returns itself if already a number)\n// TODO - unify with methods above\n\n\nfunction glGet(gl, name) {\n  if (!name) {\n    _log.default.removed('glGet(name)', 'glGet(gl, name)', '6.0')();\n  }\n\n  return getKeyValue(gl, name);\n}\n\nfunction glKey(gl, value) {\n  if (value === undefined) {\n    _log.default.removed('glKey(value)', 'glKey(gl, value)', '6.0')();\n  }\n\n  return getKey(gl, value);\n}\n\nfunction glKeyType(gl, value) {\n  if (value === undefined) {\n    _log.default.removed('glKeyType(value)', 'glKeyType(gl, value)', '6.0')();\n  }\n\n  return getKeyType(gl, value);\n}\n},{\"../utils/assert\":\"iVaU\",\"../utils/log\":\"YuHO\"}],\"K4em\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getShaderVersion = getShaderVersion;\n\n// returns GLSL shader version of given shader string\nfunction getShaderVersion(source) {\n  var version = 100;\n  var words = source.match(/[^\\s]+/g);\n\n  if (words.length >= 2 && words[0] === '#version') {\n    var v = parseInt(words[1], 10);\n\n    if (Number.isFinite(v)) {\n      version = v;\n    }\n  }\n\n  return version;\n}\n},{}],\"CTd0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Image\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.Image;\n  }\n});\nObject.defineProperty(exports, \"WebGLRenderingContext\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLRenderingContext;\n  }\n});\nObject.defineProperty(exports, \"WebGL2RenderingContext\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGL2RenderingContext;\n  }\n});\nObject.defineProperty(exports, \"WebGLProgram\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLProgram;\n  }\n});\nObject.defineProperty(exports, \"WebGLShader\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLShader;\n  }\n});\nObject.defineProperty(exports, \"WebGLBuffer\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLBuffer;\n  }\n});\nObject.defineProperty(exports, \"WebGLFramebuffer\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLFramebuffer;\n  }\n});\nObject.defineProperty(exports, \"WebGLRenderbuffer\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLRenderbuffer;\n  }\n});\nObject.defineProperty(exports, \"WebGLTexture\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLTexture;\n  }\n});\nObject.defineProperty(exports, \"WebGLUniformLocation\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLUniformLocation;\n  }\n});\nObject.defineProperty(exports, \"WebGLActiveInfo\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLActiveInfo;\n  }\n});\nObject.defineProperty(exports, \"WebGLShaderPrecisionFormat\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.WebGLShaderPrecisionFormat;\n  }\n});\nObject.defineProperty(exports, \"webGLTypesAvailable\", {\n  enumerable: true,\n  get: function () {\n    return _webglTypes.webGLTypesAvailable;\n  }\n});\nObject.defineProperty(exports, \"isWebGL\", {\n  enumerable: true,\n  get: function () {\n    return _webglChecks.isWebGL;\n  }\n});\nObject.defineProperty(exports, \"isWebGL2\", {\n  enumerable: true,\n  get: function () {\n    return _webglChecks.isWebGL2;\n  }\n});\nObject.defineProperty(exports, \"assertWebGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _webglChecks.assertWebGLContext;\n  }\n});\nObject.defineProperty(exports, \"assertWebGL2Context\", {\n  enumerable: true,\n  get: function () {\n    return _webglChecks.assertWebGL2Context;\n  }\n});\nObject.defineProperty(exports, \"requestAnimationFrame\", {\n  enumerable: true,\n  get: function () {\n    return _requestAnimationFrame.requestAnimationFrame;\n  }\n});\nObject.defineProperty(exports, \"cancelAnimationFrame\", {\n  enumerable: true,\n  get: function () {\n    return _requestAnimationFrame.cancelAnimationFrame;\n  }\n});\nObject.defineProperty(exports, \"formatGLSLCompilerError\", {\n  enumerable: true,\n  get: function () {\n    return _formatGlslError.default;\n  }\n});\nObject.defineProperty(exports, \"parseGLSLCompilerError\", {\n  enumerable: true,\n  get: function () {\n    return _formatGlslError.parseGLSLCompilerError;\n  }\n});\nObject.defineProperty(exports, \"getShaderName\", {\n  enumerable: true,\n  get: function () {\n    return _getShaderName.default;\n  }\n});\nObject.defineProperty(exports, \"getGLTypeFromTypedArray\", {\n  enumerable: true,\n  get: function () {\n    return _typedArrayUtils.getGLTypeFromTypedArray;\n  }\n});\nObject.defineProperty(exports, \"getTypedArrayFromGLType\", {\n  enumerable: true,\n  get: function () {\n    return _typedArrayUtils.getTypedArrayFromGLType;\n  }\n});\nObject.defineProperty(exports, \"flipRows\", {\n  enumerable: true,\n  get: function () {\n    return _typedArrayUtils.flipRows;\n  }\n});\nObject.defineProperty(exports, \"scalePixels\", {\n  enumerable: true,\n  get: function () {\n    return _typedArrayUtils.scalePixels;\n  }\n});\nObject.defineProperty(exports, \"getKeyValue\", {\n  enumerable: true,\n  get: function () {\n    return _constantsToKeys.getKeyValue;\n  }\n});\nObject.defineProperty(exports, \"getKey\", {\n  enumerable: true,\n  get: function () {\n    return _constantsToKeys.getKey;\n  }\n});\nObject.defineProperty(exports, \"getKeyType\", {\n  enumerable: true,\n  get: function () {\n    return _constantsToKeys.getKeyType;\n  }\n});\nObject.defineProperty(exports, \"getShaderVersion\", {\n  enumerable: true,\n  get: function () {\n    return _shaderUtils.getShaderVersion;\n  }\n});\nObject.defineProperty(exports, \"cloneTextureFrom\", {\n  enumerable: true,\n  get: function () {\n    return _textureUtils.cloneTextureFrom;\n  }\n});\n\nvar _webglTypes = require(\"./webgl-types\");\n\nvar _webglChecks = require(\"./webgl-checks\");\n\nvar _requestAnimationFrame = require(\"./request-animation-frame\");\n\nvar _formatGlslError = _interopRequireWildcard(require(\"./format-glsl-error\"));\n\nvar _getShaderName = _interopRequireDefault(require(\"./get-shader-name\"));\n\nvar _typedArrayUtils = require(\"./typed-array-utils\");\n\nvar _constantsToKeys = require(\"./constants-to-keys\");\n\nvar _shaderUtils = require(\"./shader-utils\");\n\nvar _textureUtils = require(\"./texture-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./webgl-types\":\"bFVP\",\"./webgl-checks\":\"it7h\",\"./request-animation-frame\":\"qcWm\",\"./format-glsl-error\":\"ATgZ\",\"./get-shader-name\":\"yLkN\",\"./typed-array-utils\":\"v5qF\",\"./constants-to-keys\":\"d71e\",\"./shader-utils\":\"K4em\",\"./texture-utils\":\"i2kP\"}],\"IB2l\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isOldIE;\n\nvar _globals = require(\"./globals\");\n\n// opts allows user agent to be overridden for testing\nfunction isOldIE() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var navigator = _globals.window.navigator || {};\n  var userAgent = opts.userAgent || navigator.userAgent || ''; // We only care about older versions of IE (IE 11 and below). Newer versions of IE (Edge)\n  // have much better web standards support.\n\n  var isMSIE = userAgent.indexOf('MSIE ') !== -1;\n  var isTrident = userAgent.indexOf('Trident/') !== -1;\n  return isMSIE || isTrident;\n}\n},{\"./globals\":\"zU4q\"}],\"CjJ4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.promisify = promisify;\n\n/**\n * Converts a function that accepts a node style (err, result) callback\n * as the last argument into a function that takes the same arguments\n * and returns a promise that resolves or rejects with the values provided\n * by the original callback\n * @param {Function} func - function to wrap\n * @return {Function} promisified function\n */\n\n/* eslint-disable no-try-catch */\nfunction promisify(func) {\n  return function promisifiedFunction() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return new Promise(function (resolve, reject) {\n      function callback(error, data) {\n        try {\n          if (error) {\n            reject(error);\n          } else {\n            resolve(data);\n          }\n        } catch (e) {\n          reject(e);\n        }\n      }\n\n      func.apply(void 0, args.concat([callback]));\n    });\n  };\n}\n/* eslint-enable no-try-catch */\n},{}],\"iNqM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.uid = uid;\nexports.isPowerOfTwo = isPowerOfTwo;\nexports.isObjectEmpty = isObjectEmpty;\n\nvar _assert = _interopRequireDefault(require(\"./assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar uidCounters = {};\n/**\n * Returns a UID.\n * @param {String} id= - Identifier base name\n * @return {number} uid\n **/\n\nfunction uid() {\n  var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'id';\n  uidCounters[id] = uidCounters[id] || 1;\n  var count = uidCounters[id]++;\n  return \"\".concat(id, \"-\").concat(count);\n}\n/**\n * Verifies if a given number is power of two or not.\n * @param {object} n - The number to check.\n * @return {Array} Returns true if the given number is power of 2, false otherwise.\n **/\n\n\nfunction isPowerOfTwo(n) {\n  (0, _assert.default)(typeof n === 'number', 'Input must be a number');\n  return n && (n & n - 1) === 0;\n} // Returns true if given object is empty, false otherwise.\n\n\nfunction isObjectEmpty(obj) {\n  var isEmpty = true;\n  /* eslint-disable no-unused-vars  */\n\n  for (var key in obj) {\n    isEmpty = false;\n    break;\n  }\n  /* eslint-enable no-unused-vars  */\n\n\n  return isEmpty;\n}\n},{\"./assert\":\"iVaU\"}],\"kNii\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.formatValue = formatValue;\n\n// TODO / DEPRECATED - delete when confident that probe.gl logging implements all opts\n\n/* eslint-disable no-console */\nfunction formatArrayValue(v, opts) {\n  var _opts$maxElts = opts.maxElts,\n      maxElts = _opts$maxElts === void 0 ? 16 : _opts$maxElts,\n      _opts$size = opts.size,\n      size = _opts$size === void 0 ? 1 : _opts$size;\n  var string = '[';\n\n  for (var i = 0; i < v.length && i < maxElts; ++i) {\n    if (i > 0) {\n      string += \",\".concat(i % size === 0 ? ' ' : '');\n    }\n\n    string += formatValue(v[i], opts);\n  }\n\n  var terminator = v.length > maxElts ? '...' : ']';\n  return \"\".concat(string).concat(terminator);\n}\n\nfunction formatValue(v) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var EPSILON = 1e-16;\n  var _opts$isInteger = opts.isInteger,\n      isInteger = _opts$isInteger === void 0 ? false : _opts$isInteger;\n\n  if (Array.isArray(v) || ArrayBuffer.isView(v)) {\n    return formatArrayValue(v, opts);\n  }\n\n  if (!Number.isFinite(v)) {\n    return String(v);\n  }\n\n  if (Math.abs(v) < EPSILON) {\n    return isInteger ? '0' : '0.';\n  }\n\n  if (isInteger) {\n    return v.toFixed(0);\n  }\n\n  if (Math.abs(v) > 100 && Math.abs(v) < 10000) {\n    return v.toFixed(0);\n  }\n\n  var string = v.toPrecision(2);\n  var decimal = string.indexOf('.0');\n  return decimal === string.length - 2 ? string.slice(0, -1) : string;\n}\n},{}],\"bzQS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.stubRemovedMethods = stubRemovedMethods;\n\nvar _log = _interopRequireDefault(require(\"./log\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Install stubs for removed methods\nfunction stubRemovedMethods(instance, className, version, methodNames) {\n  var upgradeMessage = \"See luma.gl \".concat(version, \" Upgrade Guide at http://uber.github.io/luma.gl/#/documentation/overview/upgrade-guide\");\n  var prototype = Object.getPrototypeOf(instance);\n  methodNames.forEach(function (methodName) {\n    if (prototype.methodName) {\n      return;\n    }\n\n    prototype[methodName] = function () {\n      _log.default.removed(\"Calling removed method \".concat(className, \".\").concat(methodName, \": \"), upgradeMessage);\n\n      throw new Error(methodName);\n    };\n  });\n}\n},{\"./log\":\"YuHO\"}],\"B7AM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"isBrowser\", {\n  enumerable: true,\n  get: function () {\n    return _isBrowser.default;\n  }\n});\nObject.defineProperty(exports, \"isOldIE\", {\n  enumerable: true,\n  get: function () {\n    return _isOldIe.default;\n  }\n});\nObject.defineProperty(exports, \"promisify\", {\n  enumerable: true,\n  get: function () {\n    return _promiseUtils.promisify;\n  }\n});\nObject.defineProperty(exports, \"uid\", {\n  enumerable: true,\n  get: function () {\n    return _utils.uid;\n  }\n});\nObject.defineProperty(exports, \"isPowerOfTwo\", {\n  enumerable: true,\n  get: function () {\n    return _utils.isPowerOfTwo;\n  }\n});\nObject.defineProperty(exports, \"isObjectEmpty\", {\n  enumerable: true,\n  get: function () {\n    return _utils.isObjectEmpty;\n  }\n});\nObject.defineProperty(exports, \"log\", {\n  enumerable: true,\n  get: function () {\n    return _log.default;\n  }\n});\nObject.defineProperty(exports, \"formatValue\", {\n  enumerable: true,\n  get: function () {\n    return _formatValue.formatValue;\n  }\n});\nObject.defineProperty(exports, \"assert\", {\n  enumerable: true,\n  get: function () {\n    return _assert.default;\n  }\n});\nObject.defineProperty(exports, \"stubRemovedMethods\", {\n  enumerable: true,\n  get: function () {\n    return _stubMethods.stubRemovedMethods;\n  }\n});\n\nvar _isBrowser = _interopRequireDefault(require(\"./is-browser\"));\n\nvar _isOldIe = _interopRequireDefault(require(\"./is-old-ie\"));\n\nvar _promiseUtils = require(\"./promise-utils\");\n\nvar _utils = require(\"./utils\");\n\nvar _log = _interopRequireDefault(require(\"./log\"));\n\nvar _formatValue = require(\"./format-value\");\n\nvar _assert = _interopRequireDefault(require(\"./assert\"));\n\nvar _stubMethods = require(\"./stub-methods\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./is-browser\":\"WplP\",\"./is-old-ie\":\"IB2l\",\"./promise-utils\":\"CjJ4\",\"./utils\":\"iNqM\",\"./log\":\"YuHO\",\"./format-value\":\"kNii\",\"./assert\":\"iVaU\",\"./stub-methods\":\"bzQS\"}],\"LE4Y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _init = _interopRequireDefault(require(\"../init\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ERR_RESOURCE_METHOD_UNDEFINED = 'Resource subclass must define virtual methods'; // TODO - Handle context loss\n// function glGetContextLossCount(gl) {\n//   return (gl.luma && gl.luma.glCount) || 0;\n// }\n\nvar Resource =\n/*#__PURE__*/\nfunction () {\n  function Resource(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Resource);\n    (0, _webglUtils.assertWebGLContext)(gl);\n    var id = opts.id,\n        _opts$userData = opts.userData,\n        userData = _opts$userData === void 0 ? {} : _opts$userData;\n    this.gl = gl; // this.ext = polyfillContext(gl);\n\n    this.id = id || (0, _utils.uid)(this.constructor.name);\n    this.userData = userData;\n    this._bound = false; // Set the handle\n    // If handle was provided, use it, otherwise create a new handle\n    // TODO - Stores the handle with context loss information\n    // this.glCount = glGetContextLossCount(this.gl);\n    // Default VertexArray needs to be created with null handle, so compare against undefined\n\n    this._handle = opts.handle;\n\n    if (this._handle === undefined) {\n      this._handle = this._createHandle();\n    }\n\n    this._addStats();\n  }\n\n  (0, _createClass2.default)(Resource, [{\n    key: \"toString\",\n    value: function toString() {\n      return \"\".concat(this.constructor.name, \"(\").concat(this.id, \")\");\n    }\n  }, {\n    key: \"delete\",\n    value: function _delete() {\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref$deleteChildren = _ref.deleteChildren,\n          deleteChildren = _ref$deleteChildren === void 0 ? false : _ref$deleteChildren; // Delete this object, and get refs to any children\n\n\n      var children = this._handle && this._deleteHandle(this._handle);\n\n      this._handle = null;\n\n      this._removeStats(); // Optionally, recursively delete the children\n\n\n      if (children && deleteChildren) {\n        children.filter(Boolean).forEach(function (child) {\n          child.delete();\n        });\n      }\n\n      return this;\n    }\n  }, {\n    key: \"bind\",\n    value: function bind() {\n      var funcOrHandle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.handle;\n\n      if (typeof funcOrHandle !== 'function') {\n        this._bindHandle(funcOrHandle);\n\n        return this;\n      }\n\n      var value;\n\n      if (!this._bound) {\n        this._bindHandle(this.handle);\n\n        this._bound = true;\n        value = funcOrHandle();\n        this._bound = false;\n\n        this._bindHandle(null);\n      } else {\n        value = funcOrHandle();\n      }\n\n      return value;\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind() {\n      this.bind(null);\n    }\n    /**\n     * Query a Resource parameter\n     *\n     * @param {GLenum} pname\n     * @return {GLint|GLfloat|GLenum} param\n     */\n\n  }, {\n    key: \"getParameter\",\n    value: function getParameter(pname) {\n      var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      pname = (0, _webglUtils.getKeyValue)(this.gl, pname);\n      (0, _assert.default)(pname);\n      var parameters = this.constructor.PARAMETERS || {}; // Use parameter definitions to handle unsupported parameters\n\n      var parameter = parameters[pname];\n\n      if (parameter) {\n        var isWebgl2 = (0, _webglUtils.isWebGL2)(this.gl); // Check if we can query for this parameter\n\n        var parameterAvailable = (!('webgl2' in parameter) || isWebgl2) && (!('extension' in parameter) || this.gl.getExtension(parameter.extension));\n\n        if (!parameterAvailable) {\n          var webgl1Default = parameter.webgl1;\n          var webgl2Default = 'webgl2' in parameter ? parameter.webgl2 : parameter.webgl1;\n          var defaultValue = isWebgl2 ? webgl2Default : webgl1Default;\n          return defaultValue;\n        }\n      } // If unknown parameter - Could be a valid parameter not covered by PARAMS\n      // Attempt to query for it and let WebGL report errors\n\n\n      return this._getParameter(pname, opts);\n    } // Many resources support a getParameter call -\n    // getParameters will get all parameters - slow but useful for debugging\n    // eslint-disable-next-line complexity\n\n  }, {\n    key: \"getParameters\",\n    value: function getParameters() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _ref2 = {},\n          parameters = _ref2.parameters,\n          keys = _ref2.keys; // Get parameter definitions for this Resource\n\n      var PARAMETERS = this.constructor.PARAMETERS || {};\n      var isWebgl2 = (0, _webglUtils.isWebGL2)(this.gl);\n      var values = {}; // Query all parameters if no list provided\n\n      var parameterKeys = parameters || Object.keys(PARAMETERS); // WEBGL limits\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = parameterKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var pname = _step.value;\n          var parameter = PARAMETERS[pname]; // Check if this parameter is available on this platform\n\n          var parameterAvailable = parameter && (!('webgl2' in parameter) || isWebgl2) && (!('extension' in parameter) || this.gl.getExtension(parameter.extension));\n\n          if (parameterAvailable) {\n            var key = keys ? (0, _webglUtils.getKey)(this.gl, pname) : pname;\n            values[key] = this.getParameter(pname, opts);\n\n            if (keys && parameter.type === 'GLenum') {\n              values[key] = (0, _webglUtils.getKey)(this.gl, values[key]);\n            }\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return values;\n    }\n    /**\n     * Update a Resource setting\n     *\n     * @todo - cache parameter to avoid issuing WebGL calls?\n     *\n     * @param {GLenum} pname - parameter (GL constant, value or key)\n     * @param {GLint|GLfloat|GLenum} value\n     * @return {Resource} returns self to enable chaining\n     */\n\n  }, {\n    key: \"setParameter\",\n    value: function setParameter(pname, value) {\n      pname = (0, _webglUtils.getKeyValue)(this.gl, pname);\n      (0, _assert.default)(pname);\n      var parameters = this.constructor.PARAMETERS || {};\n      var parameter = parameters[pname];\n\n      if (parameter) {\n        var isWebgl2 = (0, _webglUtils.isWebGL2)(this.gl); // Check if this parameter is available on this platform\n\n        var parameterAvailable = (!('webgl2' in parameter) || isWebgl2) && (!('extension' in parameter) || this.gl.getExtension(parameter.extension));\n\n        if (!parameterAvailable) {\n          throw new Error('Parameter not available on this platform');\n        } // Handle string keys\n\n\n        if (parameter.type === 'GLenum') {\n          value = (0, _webglUtils.getKeyValue)(value);\n        }\n      } // If unknown parameter - Could be a valid parameter not covered by PARAMS\n      // attempt to set it and let WebGL report errors\n\n\n      this._setParameter(pname, value);\n\n      return this;\n    }\n    /*\n     * Batch update resource parameters\n     * Assumes the subclass supports a setParameter call\n     */\n\n  }, {\n    key: \"setParameters\",\n    value: function setParameters(parameters) {\n      for (var pname in parameters) {\n        this.setParameter(pname, parameters[pname]);\n      }\n\n      return this;\n    } // Install stubs for removed methods\n\n  }, {\n    key: \"stubRemovedMethods\",\n    value: function stubRemovedMethods(className, version, methodNames) {\n      return (0, _utils.stubRemovedMethods)(this, className, version, methodNames);\n    } // PUBLIC VIRTUAL METHODS\n\n  }, {\n    key: \"initialize\",\n    value: function initialize(opts) {} // PROTECTED METHODS - These must be overridden by subclass\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n    }\n  }, {\n    key: \"_bindHandle\",\n    value: function _bindHandle() {\n      throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n    }\n  }, {\n    key: \"_getOptsFromHandle\",\n    value: function _getOptsFromHandle() {\n      throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n    }\n  }, {\n    key: \"_getParameter\",\n    value: function _getParameter(pname, opts) {\n      throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n    }\n    /**\n     * @param {GLenum} pname\n     * @param {GLint|GLfloat|GLenum} param\n     * @return {Sampler} returns self to enable chaining\n     */\n\n  }, {\n    key: \"_setParameter\",\n    value: function _setParameter(pname, value) {\n      throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_context\",\n    value: function _context() {\n      this.gl.luma = this.gl.luma || {};\n      return this.gl.luma;\n    }\n  }, {\n    key: \"_addStats\",\n    value: function _addStats() {\n      var name = this.constructor.name;\n      var stats = _init.default.stats;\n      stats.resourceCount = stats.resourceCount || 0;\n      stats.resourceMap = stats.resourceMap || {}; // Resource creation stats\n\n      stats.resourceCount++;\n      stats.resourceMap[name] = stats.resourceMap[name] || {\n        created: 0,\n        active: 0\n      };\n      stats.resourceMap[name].created++;\n      stats.resourceMap[name].active++;\n    }\n  }, {\n    key: \"_removeStats\",\n    value: function _removeStats() {\n      var name = this.constructor.name;\n      var stats = _init.default.stats;\n      stats.resourceMap[name].active--;\n    }\n  }, {\n    key: \"handle\",\n    get: function get() {\n      // TODO - Add context loss handling\n      // Will regenerate and reinitialize the handle if necessary\n      // const glCount = glGetContextLossCount(this.gl);\n      // if (this.glCount !== glCount) {\n      //   this._handle = this._createHandle(this.opts);\n      //   this._glCount = glCount;\n      //   // Reinitialize object\n      //   this.initialize(this.opts);\n      // }\n      return this._handle;\n    }\n  }]);\n  return Resource;\n}();\n\nexports.default = Resource;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../init\":\"aXVf\",\"../webgl-utils\":\"CTd0\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"M7j4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _construct;\n\nvar _setPrototypeOf = _interopRequireDefault(require(\"./setPrototypeOf\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction _construct(Parent, args, Class) {\n  if (isNativeReflectConstruct()) {\n    exports.default = _construct = Reflect.construct;\n  } else {\n    exports.default = _construct = function _construct(Parent, args, Class) {\n      var a = [null];\n      a.push.apply(a, args);\n      var Constructor = Function.bind.apply(Parent, a);\n      var instance = new Constructor();\n      if (Class) (0, _setPrototypeOf.default)(instance, Class.prototype);\n      return instance;\n    };\n  }\n\n  return _construct.apply(null, arguments);\n}\n},{\"./setPrototypeOf\":\"hewo\"}],\"E5yL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DEFAULT_ACCESSOR_VALUES = exports.default = void 0;\n\nvar _construct2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/construct\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _typedArrayUtils = require(\"../webgl-utils/typed-array-utils\");\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEFAULT_ACCESSOR_VALUES = {\n  offset: 0,\n  stride: 0,\n  type: 5126,\n  size: 1,\n  divisor: 0,\n  normalized: false,\n  integer: false\n};\nexports.DEFAULT_ACCESSOR_VALUES = DEFAULT_ACCESSOR_VALUES;\n\nvar Accessor =\n/*#__PURE__*/\nfunction () {\n  (0, _createClass2.default)(Accessor, null, [{\n    key: \"getBytesPerElement\",\n    value: function getBytesPerElement(accessor) {\n      // TODO: using `FLOAT` when type is not specified,\n      // ensure this assumption is valid or force API to specify type.\n      var ArrayType = (0, _typedArrayUtils.getTypedArrayFromGLType)(accessor.type || 5126);\n      return ArrayType.BYTES_PER_ELEMENT;\n    }\n  }, {\n    key: \"getBytesPerVertex\",\n    value: function getBytesPerVertex(accessor) {\n      (0, _assert.default)(accessor.size); // TODO: using `FLOAT` when type is not specified,\n      // ensure this assumption is valid or force API to specify type.\n\n      var ArrayType = (0, _typedArrayUtils.getTypedArrayFromGLType)(accessor.type || 5126);\n      return ArrayType.BYTES_PER_ELEMENT * accessor.size;\n    } // Combines (merges) a list of accessors. On top of default values\n    // Usually [programAccessor, bufferAccessor, appAccessor]\n    // All props will be set in the returned object.\n    // TODO check for conflicts between values in the supplied accessors\n\n  }, {\n    key: \"resolve\",\n    value: function resolve() {\n      for (var _len = arguments.length, accessors = new Array(_len), _key = 0; _key < _len; _key++) {\n        accessors[_key] = arguments[_key];\n      }\n\n      return (0, _construct2.default)(Accessor, [DEFAULT_ACCESSOR_VALUES].concat(accessors)); // Default values\n    }\n  }]);\n\n  function Accessor() {\n    var _this = this;\n\n    (0, _classCallCheck2.default)(this, Accessor);\n\n    for (var _len2 = arguments.length, accessors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      accessors[_key2] = arguments[_key2];\n    }\n\n    accessors.forEach(function (accessor) {\n      return _this._assign(accessor);\n    }); // Merge in sequence\n\n    Object.freeze(this);\n  }\n\n  (0, _createClass2.default)(Accessor, [{\n    key: \"toString\",\n    value: function toString() {\n      return JSON.stringify(this);\n    } // ACCESSORS\n    // TODO - remove>\n\n  }, {\n    key: \"_assign\",\n    // PRIVATE\n\n    /* eslint-disable complexity, max-statements */\n    value: function _assign() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; // TYPE - not expected to be overridden\n\n      if (props.type !== undefined) {\n        if (this.type !== props.type) {\n          _log.default.warn('accessor type mismatch');\n        }\n\n        this.type = props.type; // Auto-deduce integer type?\n\n        if (props.type === 5124 || props.type === 5125) {\n          this.integer = true;\n        }\n      } // SIZE - not expected to be overridden\n\n\n      if (props.size !== undefined) {\n        if (this.size !== props.size) {\n          _log.default.warn('accessor size mismatch');\n        }\n\n        this.size = props.size;\n      } // INSTANCE DIVISOR\n\n\n      if (props.divisor !== undefined) {\n        this.divisor = props.divisor;\n      }\n\n      if (props.offset !== undefined) {\n        this.offset = props.offset;\n      }\n\n      if (props.stride !== undefined) {\n        this.stride = props.stride;\n      }\n\n      if (props.normalized !== undefined) {\n        this.normalized = props.normalized;\n      }\n\n      if (props.integer !== undefined) {\n        this.integer = props.integer;\n      } // Backwards compatibility\n\n\n      if (props.instanced !== undefined) {\n        _log.default.deprecated('Accessor.instanced', 'Accessor.divisor');\n\n        this.divisor = props.instanced ? 1 : 0;\n      }\n\n      if (props.isInstanced !== undefined) {\n        _log.default.deprecated('Accessor.isInstanced', 'Accessor.divisor');\n\n        this.divisor = props.isInstanced ? 1 : 0;\n      } // TODO - should this be supported?\n\n\n      if (props.index !== undefined) {\n        this.index = props.index ? 1 : 0;\n      }\n\n      return this;\n    }\n    /* eslint-enable complexity, max-statements */\n\n  }, {\n    key: \"BYTES_PER_ELEMENT\",\n    get: function get() {\n      return Accessor.getBytesPerElement(this);\n    }\n  }, {\n    key: \"BYTES_PER_VERTEX\",\n    get: function get() {\n      return Accessor.getBytesPerVertex(this);\n    }\n  }]);\n  return Accessor;\n}(); // TEST EXPORTS\n\n\nexports.default = Accessor;\n},{\"@babel/runtime/helpers/esm/construct\":\"M7j4\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../webgl-utils/typed-array-utils\":\"v5qF\",\"../utils/log\":\"YuHO\",\"../utils/assert\":\"iVaU\"}],\"IZPG\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _accessor = _interopRequireDefault(require(\"./accessor\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _typedArrayUtils = require(\"../webgl-utils/typed-array-utils\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEBUG_DATA_LENGTH = 10;\n\nvar Buffer =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(Buffer, _Resource);\n\n  function Buffer(gl) {\n    var _this;\n\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Buffer);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Buffer).call(this, gl, props));\n\n    _this.stubRemovedMethods('Buffer', 'v6.0', ['layout', 'setLayout', 'getIndexedParameter']); // In WebGL1, need to make sure we use GL.ELEMENT_ARRAY_BUFFER when initializing element buffers\n    // otherwise buffer type will lock to generic (non-element) buffer\n    // In WebGL2, we can use GL.COPY_READ_BUFFER which avoids locking the type here\n\n\n    _this.target = props.target || (_this.gl.webgl2 ? 36662 : 34962);\n\n    _this._initialize(props);\n\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  } // returns number of elements in the buffer (assuming that the full buffer is used)\n\n\n  (0, _createClass2.default)(Buffer, [{\n    key: \"getElementCount\",\n    value: function getElementCount() {\n      var accessor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.accessor;\n      return Math.round(this.byteLength / _accessor.default.getBytesPerElement(accessor));\n    } // returns number of vertices in the buffer (assuming that the full buffer is used)\n\n  }, {\n    key: \"getVertexCount\",\n    value: function getVertexCount() {\n      var accessor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.accessor;\n      return Math.round(this.byteLength / _accessor.default.getBytesPerVertex(accessor));\n    } // Creates and initializes the buffer object's data store.\n\n  }, {\n    key: \"initialize\",\n    value: function initialize(props) {\n      return this._initialize(props);\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('data' in props) {\n        this.setData(props);\n      }\n\n      return this;\n    } // Stores the accessor of data with the buffer, makes it easy to e.g. set it as an attribute later\n    // {accessor,type,size = 1,offset = 0,stride = 0,normalized = false,integer = false,divisor = 0}\n\n  }, {\n    key: \"setAccessor\",\n    value: function setAccessor(opts) {\n      this.accessor = opts;\n      return this;\n    } // Allocate a bigger GPU buffer (if the current buffer is not big enough).\n    // If a reallocation is triggered it clears the buffer\n    // Returns:\n    //  `true`: buffer was reallocated, data was cleared\n    //  `false`: buffer was big enough, data is intact\n\n  }, {\n    key: \"reallocate\",\n    value: function reallocate(byteLength) {\n      if (byteLength > this.byteLength) {\n        this._setByteLength(byteLength);\n\n        return true;\n      }\n\n      this.bytesUsed = byteLength;\n      return false;\n    } // Update with new data\n\n  }, {\n    key: \"setData\",\n    value: function setData(opts) {\n      return this.initialize(opts);\n    } // Updates a subset of a buffer object's data store.\n    // Data (Typed Array or ArrayBuffer), length is inferred unless provided\n    // Offset into buffer\n    // WebGL2 only: Offset into srcData\n    // WebGL2 only: Number of bytes to be copied\n\n  }, {\n    key: \"subData\",\n    value: function subData(props) {\n      // Signature: buffer.subData(new Float32Array([...]))\n      if (ArrayBuffer.isView(props)) {\n        props = {\n          data: props\n        };\n      }\n\n      var _props = props,\n          data = _props.data,\n          _props$offset = _props.offset,\n          offset = _props$offset === void 0 ? 0 : _props$offset,\n          _props$srcOffset = _props.srcOffset,\n          srcOffset = _props$srcOffset === void 0 ? 0 : _props$srcOffset;\n      var byteLength = props.byteLength || props.length; // if (byteLength > this.byteLength) {\n      //   byteLength = this.byteLength;\n      // }\n\n      (0, _assert.default)(data); // Create the buffer - binding it here for the first time locks the type\n      // In WebGL2, use GL.COPY_WRITE_BUFFER to avoid locking the type\n\n      var target = this.gl.webgl2 ? 36663 : this.target;\n      this.gl.bindBuffer(target, this.handle); // WebGL2: subData supports additional srcOffset and length parameters\n\n      if (srcOffset !== 0 || byteLength !== undefined) {\n        (0, _webglUtils.assertWebGL2Context)(this.gl);\n        this.gl.bufferSubData(this.target, offset, data, srcOffset, byteLength);\n      } else {\n        this.gl.bufferSubData(target, offset, data);\n      }\n\n      this.gl.bindBuffer(target, null); // TODO - update local `data` if offsets are right\n\n      this.debugData = null;\n\n      if (!this.accessor.type) {\n        this.setAccessor(new _accessor.default(this.accessor, {\n          type: (0, _typedArrayUtils.getGLTypeFromTypedArray)(data)\n        }));\n      }\n\n      return this;\n    } // WEBGL2 ONLY: Copies part of the data of another buffer into this buffer\n\n  }, {\n    key: \"copyData\",\n    value: function copyData(_ref) {\n      var sourceBuffer = _ref.sourceBuffer,\n          _ref$readOffset = _ref.readOffset,\n          readOffset = _ref$readOffset === void 0 ? 0 : _ref$readOffset,\n          _ref$writeOffset = _ref.writeOffset,\n          writeOffset = _ref$writeOffset === void 0 ? 0 : _ref$writeOffset,\n          size = _ref.size;\n      var gl = this.gl;\n      (0, _webglUtils.assertWebGL2Context)(gl); // Use GL.COPY_READ_BUFFER+GL.COPY_WRITE_BUFFER avoid disturbing other targets and locking type\n\n      gl.bindBuffer(36662, sourceBuffer.handle);\n      gl.bindBuffer(36663, this.handle);\n      gl.copyBufferSubData(36662, 36663, readOffset, writeOffset, size);\n      gl.bindBuffer(36662, null);\n      gl.bindBuffer(36663, null); // TODO - update local `data` if offsets are 0\n\n      this.debugData = null;\n      return this;\n    } // WEBGL2 ONLY: Reads data from buffer into an ArrayBufferView or SharedArrayBuffer.\n\n  }, {\n    key: \"getData\",\n    value: function getData() {\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref2$dstData = _ref2.dstData,\n          dstData = _ref2$dstData === void 0 ? null : _ref2$dstData,\n          _ref2$srcByteOffset = _ref2.srcByteOffset,\n          srcByteOffset = _ref2$srcByteOffset === void 0 ? 0 : _ref2$srcByteOffset,\n          _ref2$dstOffset = _ref2.dstOffset,\n          dstOffset = _ref2$dstOffset === void 0 ? 0 : _ref2$dstOffset,\n          _ref2$length = _ref2.length,\n          length = _ref2$length === void 0 ? 0 : _ref2$length;\n\n      (0, _webglUtils.assertWebGL2Context)(this.gl);\n      var ArrayType = (0, _typedArrayUtils.getTypedArrayFromGLType)(this.accessor.type || 5126, {\n        clamped: false\n      });\n\n      var sourceAvailableElementCount = this._getAvailableElementCount(srcByteOffset);\n\n      var dstElementOffset = dstOffset;\n      var dstAvailableElementCount;\n      var dstElementCount;\n\n      if (dstData) {\n        dstElementCount = dstData.length;\n        dstAvailableElementCount = dstElementCount - dstElementOffset;\n      } else {\n        // Allocate ArrayBufferView with enough size to copy all eligible data.\n        dstAvailableElementCount = Math.min(sourceAvailableElementCount, length || sourceAvailableElementCount);\n        dstElementCount = dstElementOffset + dstAvailableElementCount;\n      }\n\n      var copyElementCount = Math.min(sourceAvailableElementCount, dstAvailableElementCount);\n      length = length || copyElementCount;\n      (0, _assert.default)(length <= copyElementCount);\n      dstData = dstData || new ArrayType(dstElementCount); // Use GL.COPY_READ_BUFFER to avoid disturbing other targets and locking type\n\n      this.gl.bindBuffer(36662, this.handle);\n      this.gl.getBufferSubData(36662, srcByteOffset, dstData, dstOffset, length);\n      this.gl.bindBuffer(36662, null); // TODO - update local `data` if offsets are 0\n\n      return dstData;\n    }\n    /**\n     * Binds a buffer to a given binding point (target).\n     *   GL.TRANSFORM_FEEDBACK_BUFFER and GL.UNIFORM_BUFFER take an index, and optionally a range.\n     * @param {Glenum} target - target for the bind operation.\n     * @param {GLuint} index= - the index of the target.\n     *   - GL.TRANSFORM_FEEDBACK_BUFFER and GL.UNIFORM_BUFFER need an index to affect state\n     * @param {GLuint} offset=0 - the index of the target.\n     *   - GL.UNIFORM_BUFFER: `offset` must be aligned to GL.UNIFORM_BUFFER_OFFSET_ALIGNMENT.\n     * @param {GLuint} size= - the index of the target.\n     *   - GL.UNIFORM_BUFFER: `size` must be a minimum of GL.UNIFORM_BLOCK_SIZE_DATA.\n     * @returns {Buffer} - Returns itself for chaining.\n     */\n\n  }, {\n    key: \"bind\",\n    value: function bind() {\n      var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref3$target = _ref3.target,\n          target = _ref3$target === void 0 ? this.target : _ref3$target,\n          _ref3$index = _ref3.index,\n          index = _ref3$index === void 0 ? this.accessor && this.accessor.index : _ref3$index,\n          _ref3$offset = _ref3.offset,\n          offset = _ref3$offset === void 0 ? 0 : _ref3$offset,\n          size = _ref3.size; // NOTE: While GL.TRANSFORM_FEEDBACK_BUFFER and GL.UNIFORM_BUFFER could\n      // be used as direct binding points, they will not affect transform feedback or\n      // uniform buffer state. Instead indexed bindings need to be made.\n\n\n      if (target === 35345 || target === 35982) {\n        if (size !== undefined) {\n          this.gl.bindBufferRange(target, index, this.handle, offset, size);\n        } else {\n          (0, _assert.default)(offset === 0); // Make sure offset wasn't supplied\n\n          this.gl.bindBufferBase(target, index, this.handle);\n        }\n      } else {\n        this.gl.bindBuffer(target, this.handle);\n      }\n\n      return this;\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind() {\n      var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref4$target = _ref4.target,\n          target = _ref4$target === void 0 ? this.target : _ref4$target,\n          _ref4$index = _ref4.index,\n          index = _ref4$index === void 0 ? this.accessor && this.accessor.index : _ref4$index;\n\n      var isIndexedBuffer = target === 35345 || target === 35982;\n\n      if (isIndexedBuffer) {\n        this.gl.bindBufferBase(target, index, null);\n      } else {\n        this.gl.bindBuffer(target, null);\n      }\n\n      return this;\n    } // DEPRECATED/REMOVED METHODS\n\n  }, {\n    key: \"getDebugData\",\n    // PROTECTED METHODS (INTENDED FOR USE BY OTHER FRAMEWORK CODE ONLY)\n    // Returns a short initial data array\n    value: function getDebugData() {\n      if (!this.debugData) {\n        this.debugData = this.getData({\n          length: DEBUG_DATA_LENGTH\n        });\n        return {\n          data: this.debugData,\n          changed: true\n        };\n      }\n\n      return {\n        data: this.debugData,\n        changed: false\n      };\n    }\n  }, {\n    key: \"invalidateDebugData\",\n    value: function invalidateDebugData() {\n      this.debugData = null;\n    } // PRIVATE METHODS\n    // Signature: `new Buffer(gl, {data: new Float32Array(...)})`\n    // Signature: `new Buffer(gl, new Float32Array(...))`\n    // Signature: `new Buffer(gl, 100)`\n\n  }, {\n    key: \"_initialize\",\n    value: function _initialize() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; // Signature `new Buffer(gl, new Float32Array(...)`\n\n      if (ArrayBuffer.isView(props)) {\n        props = {\n          data: props\n        };\n      } // Signature: `new Buffer(gl, 100)`\n\n\n      if (Number.isFinite(props)) {\n        props = {\n          byteLength: props\n        };\n      }\n\n      if (props.bytes) {\n        _utils.log.deprecated('bytes', 'byteLength');\n      }\n\n      var byteLength = props.byteLength || props.bytes || 0; // assert(props.data || byteLength);\n\n      this.usage = props.usage || 35044; // DEPRECATE - remove `props` from this list in next major release\n\n      this.setAccessor(new _accessor.default(props, props.accessor));\n      return props.data ? this._setData(props.data) : this._setByteLength(byteLength);\n    } // Allocate a new buffer and initialize to contents of typed array\n\n  }, {\n    key: \"_setData\",\n    value: function _setData(data) {\n      var usage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.usage;\n      (0, _assert.default)(ArrayBuffer.isView(data));\n\n      var target = this._getTarget();\n\n      this.gl.bindBuffer(target, this.handle);\n      this.gl.bufferData(target, data, usage);\n      this.gl.bindBuffer(target, null);\n      this.usage = usage;\n      this.debugData = data.slice(0, DEBUG_DATA_LENGTH);\n      this.byteLength = data.byteLength;\n      this.bytesUsed = data.byteLength; // infer GL type from supplied typed array\n\n      var type = (0, _typedArrayUtils.getGLTypeFromTypedArray)(data);\n      (0, _assert.default)(type);\n      this.setAccessor(new _accessor.default(this.accessor, {\n        type: type\n      }));\n      return this;\n    } // Allocate a GPU buffer of specified size.\n\n  }, {\n    key: \"_setByteLength\",\n    value: function _setByteLength(byteLength) {\n      var usage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.usage;\n      (0, _assert.default)(byteLength >= 0); // Workaround needed for Safari (#291):\n      // gl.bufferData with size equal to 0 crashes. Instead create zero sized array.\n\n      var data = byteLength;\n\n      if (byteLength === 0) {\n        data = new Float32Array(0);\n      }\n\n      var target = this._getTarget();\n\n      this.gl.bindBuffer(target, this.handle);\n      this.gl.bufferData(target, data, usage);\n      this.gl.bindBuffer(target, null);\n      this.usage = usage;\n      this.debugData = null;\n      this.byteLength = byteLength;\n      this.bytesUsed = byteLength;\n      return this;\n    } // Binding a buffer for the first time locks the type\n    // In WebGL2, use GL.COPY_WRITE_BUFFER to avoid locking the type\n\n  }, {\n    key: \"_getTarget\",\n    value: function _getTarget() {\n      return this.gl.webgl2 ? 36663 : this.target;\n    }\n  }, {\n    key: \"_getAvailableElementCount\",\n    value: function _getAvailableElementCount(srcByteOffset) {\n      var ArrayType = (0, _typedArrayUtils.getTypedArrayFromGLType)(this.accessor.type || 5126, {\n        clamped: false\n      });\n      var sourceElementOffset = srcByteOffset / ArrayType.BYTES_PER_ELEMENT;\n      return this.getElementCount() - sourceElementOffset;\n    } // RESOURCE METHODS\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createBuffer();\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      this.gl.deleteBuffer(this.handle);\n    }\n  }, {\n    key: \"_getParameter\",\n    value: function _getParameter(pname) {\n      this.gl.bindBuffer(this.target, this.handle);\n      var value = this.gl.getBufferParameter(this.target, pname);\n      this.gl.bindBuffer(this.target, null);\n      return value;\n    } // DEPRECATED\n\n  }, {\n    key: \"updateAccessor\",\n    value: function updateAccessor(opts) {\n      _utils.log.deprecated('updateAccessor(...)', 'setAccessor(new Accessor(buffer.accessor, ...)');\n\n      this.accessor = new _accessor.default(this.accessor, opts);\n      return this;\n    }\n  }, {\n    key: \"setByteLength\",\n    value: function setByteLength(byteLength) {\n      _utils.log.deprecated('setByteLength', 'reallocate');\n\n      return this.reallocate(byteLength);\n    }\n  }, {\n    key: \"data\",\n    get: function get() {\n      _utils.log.removed('Buffer.data', 'N/A', 'v6.0');\n    }\n  }, {\n    key: \"bytes\",\n    get: function get() {\n      _utils.log.deprecated('Buffer.bytes', 'Buffer.byteLength', 'v6.1');\n\n      return this.byteLength;\n    }\n  }]);\n  return Buffer;\n}(_resource.default);\n\nexports.default = Buffer;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./resource\":\"LE4Y\",\"./accessor\":\"E5yL\",\"../webgl-utils\":\"CTd0\",\"../webgl-utils/typed-array-utils\":\"v5qF\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"EbiA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _arrayWithHoles;\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n},{}],\"GS78\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _iterableToArrayLimit;\n\nfunction _iterableToArrayLimit(arr, i) {\n  if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) {\n    return;\n  }\n\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n},{}],\"Kh3j\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _nonIterableRest;\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n},{}],\"T12H\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _slicedToArray;\n\nvar _arrayWithHoles = _interopRequireDefault(require(\"./arrayWithHoles\"));\n\nvar _iterableToArrayLimit = _interopRequireDefault(require(\"./iterableToArrayLimit\"));\n\nvar _nonIterableRest = _interopRequireDefault(require(\"./nonIterableRest\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _slicedToArray(arr, i) {\n  return (0, _arrayWithHoles.default)(arr) || (0, _iterableToArrayLimit.default)(arr, i) || (0, _nonIterableRest.default)();\n}\n},{\"./arrayWithHoles\":\"EbiA\",\"./iterableToArrayLimit\":\"GS78\",\"./nonIterableRest\":\"Kh3j\"}],\"a1Bf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setParameter = setParameter;\nexports.setParameters = setParameters;\nexports.getParameter = getParameter;\nexports.getParameters = getParameters;\nexports.getDefaultParameters = getDefaultParameters;\nexports.resetParameters = resetParameters;\nexports.getModifiedParameters = getModifiedParameters;\nexports.GL_PARAMETER_GETTERS = exports.GL_PARAMETER_SETTERS = exports.GL_PARAMETER_DEFAULTS = void 0;\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/toConsumableArray\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _GL_PARAMETER_DEFAULT, _GL_PARAMETER_SETTERS, _GL_PARAMETER_GETTERS; // Provides a unified API for getting and setting any WebGL parameter\n// Also knows default values of all parameters, enabling fast cache initialization\n// Provides base functionality for the state caching.\n\n\n// DEFAULT SETTINGS - FOR FAST CACHE INITIALIZATION AND CONTEXT RESETS\nvar GL_PARAMETER_DEFAULTS = (_GL_PARAMETER_DEFAULT = {}, (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3042, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32773, new Float32Array([0, 0, 0, 0])), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32777, 32774), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 34877, 32774), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32969, 1), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32968, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32971, 1), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32970, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3106, new Float32Array([0, 0, 0, 0])), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3107, [true, true, true, true]), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2884, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2885, 1029), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2929, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2931, 1), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2932, 513), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2928, new Float32Array([0, 1])), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2930, true), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3024, true), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 36006, null), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2886, 2305), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 33170, 4352), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2849, 1), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32823, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32824, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 10752, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32938, 1.0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32939, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3089, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3088, new Int32Array([0, 0, 1024, 1024])), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2960, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2961, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2968, 0xffffffff), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 36005, 0xffffffff), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2962, 519), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2967, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2963, 0xffffffff), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 34816, 519), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 36003, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 36004, 0xffffffff), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2964, 7680), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2965, 7680), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2966, 7680), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 34817, 7680), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 34818, 7680), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 34819, 7680), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 2978, new Int32Array([0, 0, 1024, 1024])), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3333, 4), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3317, 4), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 37440, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 37441, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 37443, 37444), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 35723, 4352), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 36010, null), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 35977, false), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3330, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3332, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3331, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3314, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32878, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3316, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 3315, 0), (0, _defineProperty2.default)(_GL_PARAMETER_DEFAULT, 32877, 0), _GL_PARAMETER_DEFAULT); // SETTER TABLES - ENABLES SETTING ANY PARAMETER WITH A COMMON API\n\nexports.GL_PARAMETER_DEFAULTS = GL_PARAMETER_DEFAULTS;\n\nvar enable = function enable(gl, value, key) {\n  return value ? gl.enable(key) : gl.disable(key);\n};\n\nvar hint = function hint(gl, value, key) {\n  return gl.hint(key, value);\n};\n\nvar pixelStorei = function pixelStorei(gl, value, key) {\n  return gl.pixelStorei(key, value);\n};\n\nvar drawFramebuffer = function drawFramebuffer(gl, value) {\n  var target = (0, _webglUtils.isWebGL2)(gl) ? 36009 : 36160;\n  return gl.bindFramebuffer(target, value);\n};\n\nvar readFramebuffer = function readFramebuffer(gl, value) {\n  return gl.bindFramebuffer(36008, value);\n}; // Map from WebGL parameter names to corresponding WebGL setter functions\n// WegGL constants are read by parameter names, but set by function names\n// NOTE: When value type is a string, it will be handled by 'COMPOSITE_GL_PARAMETER_SETTERS'\n\n\nvar GL_PARAMETER_SETTERS = (_GL_PARAMETER_SETTERS = {}, (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3042, enable), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32773, function (gl, value) {\n  return gl.blendColor.apply(gl, (0, _toConsumableArray2.default)(value));\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32777, 'blendEquation'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 34877, 'blendEquation'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32969, 'blendFunc'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32968, 'blendFunc'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32971, 'blendFunc'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32970, 'blendFunc'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3106, function (gl, value) {\n  return gl.clearColor.apply(gl, (0, _toConsumableArray2.default)(value));\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3107, function (gl, value) {\n  return gl.colorMask.apply(gl, (0, _toConsumableArray2.default)(value));\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2884, enable), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2885, function (gl, value) {\n  return gl.cullFace(value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2929, enable), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2931, function (gl, value) {\n  return gl.clearDepth(value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2932, function (gl, value) {\n  return gl.depthFunc(value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2928, function (gl, value) {\n  return gl.depthRange.apply(gl, (0, _toConsumableArray2.default)(value));\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2930, function (gl, value) {\n  return gl.depthMask(value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3024, enable), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 35723, hint), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 36006, drawFramebuffer), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2886, function (gl, value) {\n  return gl.frontFace(value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 33170, hint), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2849, function (gl, value) {\n  return gl.lineWidth(value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32823, enable), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32824, 'polygonOffset'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 10752, 'polygonOffset'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 35977, enable), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32938, 'sampleCoverage'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32939, 'sampleCoverage'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3089, enable), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3088, function (gl, value) {\n  return gl.scissor.apply(gl, (0, _toConsumableArray2.default)(value));\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2960, enable), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2961, function (gl, value) {\n  return gl.clearStencil(value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2968, function (gl, value) {\n  return gl.stencilMaskSeparate(1028, value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 36005, function (gl, value) {\n  return gl.stencilMaskSeparate(1029, value);\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2962, 'stencilFuncFront'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2967, 'stencilFuncFront'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2963, 'stencilFuncFront'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 34816, 'stencilFuncBack'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 36003, 'stencilFuncBack'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 36004, 'stencilFuncBack'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2964, 'stencilOpFront'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2965, 'stencilOpFront'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2966, 'stencilOpFront'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 34817, 'stencilOpBack'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 34818, 'stencilOpBack'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 34819, 'stencilOpBack'), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 2978, function (gl, value) {\n  return gl.viewport.apply(gl, (0, _toConsumableArray2.default)(value));\n}), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3333, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3317, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 37440, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 37441, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 37443, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3330, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3332, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3331, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 36010, readFramebuffer), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3314, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32878, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3316, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 3315, pixelStorei), (0, _defineProperty2.default)(_GL_PARAMETER_SETTERS, 32877, pixelStorei), _GL_PARAMETER_SETTERS); // COMPOSITE_WEBGL_PARAMETER_\n\nexports.GL_PARAMETER_SETTERS = GL_PARAMETER_SETTERS;\nvar COMPOSITE_GL_PARAMETER_SETTERS = {\n  blendEquation: function blendEquation(gl, values) {\n    return gl.blendEquationSeparate(values[32777], values[34877]);\n  },\n  blendFunc: function blendFunc(gl, values) {\n    return gl.blendFuncSeparate(values[32969], values[32968], values[32971], values[32970]);\n  },\n  polygonOffset: function polygonOffset(gl, values) {\n    return gl.polygonOffset(values[32824], values[10752]);\n  },\n  sampleCoverage: function sampleCoverage(gl, values) {\n    return gl.sampleCoverage(values[32938], values[32939]);\n  },\n  stencilFuncFront: function stencilFuncFront(gl, values) {\n    return gl.stencilFuncSeparate(1028, values[2962], values[2967], values[2963]);\n  },\n  stencilFuncBack: function stencilFuncBack(gl, values) {\n    return gl.stencilFuncSeparate(1029, values[34816], values[36003], values[36004]);\n  },\n  stencilOpFront: function stencilOpFront(gl, values) {\n    return gl.stencilOpSeparate(1028, values[2964], values[2965], values[2966]);\n  },\n  stencilOpBack: function stencilOpBack(gl, values) {\n    return gl.stencilOpSeparate(1029, values[34817], values[34818], values[34819]);\n  }\n}; // GETTER TABLE - FOR READING OUT AN ENTIRE CONTEXT\n\nvar isEnabled = function isEnabled(gl, key) {\n  return gl.isEnabled(key);\n}; // Exceptions for any keys that cannot be queried by gl.getParameters\n\n\nvar GL_PARAMETER_GETTERS = (_GL_PARAMETER_GETTERS = {}, (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 3042, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 2884, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 2929, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 3024, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 32823, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 32926, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 32928, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 3089, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 2960, isEnabled), (0, _defineProperty2.default)(_GL_PARAMETER_GETTERS, 35977, isEnabled), _GL_PARAMETER_GETTERS); // HELPER METHODS\n\nexports.GL_PARAMETER_GETTERS = GL_PARAMETER_GETTERS;\n\nvar deepArrayEqual = function deepArrayEqual(x, y) {\n  if (x === y) {\n    return true;\n  }\n\n  var isArrayX = Array.isArray(x) || ArrayBuffer.isView(x);\n  var isArrayY = Array.isArray(y) || ArrayBuffer.isView(y);\n\n  if (isArrayX && isArrayY && x.length === y.length) {\n    for (var i = 0; i < x.length; ++i) {\n      if (x[i] !== y[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return false;\n}; // PUBLIC METHODS\n// Sets any single GL parameter regardless of function (gl.getParameter/gl.isEnabled...)\n// Returns the previous value\n// Note: limited to parameter values\n\n\nfunction setParameter(gl, key, value) {\n  var getter = GL_PARAMETER_GETTERS[key];\n  var prevValue = getter ? getter(gl, Number(key)) : gl.getParameter(Number(key));\n  var setter = GL_PARAMETER_SETTERS[key];\n  (0, _assert.default)(typeof setter === 'function');\n  setter(gl, value, Number(key));\n  return prevValue;\n} // Sets any GL parameter regardless of function (gl.blendMode, ...)\n// Note: requires a `cache` object to be set on the context (gl.state.cache)\n// This object is used to fill in any missing values for composite setter functions\n\n\nfunction setParameters(gl, values) {\n  var compositeSetters = {}; // HANDLE PRIMITIVE SETTERS (and make note of any composite setters)\n\n  for (var key in values) {\n    var glConstant = Number(key);\n    var setter = GL_PARAMETER_SETTERS[key];\n\n    if (setter) {\n      // Composite setters should only be called once, so save them\n      if (typeof setter === 'string') {\n        compositeSetters[setter] = true;\n      } else {\n        // if (gl[glConstant] !== undefined) {\n        // TODO - added above check since this is being called on WebGL2 values in WebGL1...\n        // TODO - deep equal on values? only call setter if value has changed?\n        // NOTE - the setter will automatically update this.state\n        setter(gl, values[key], glConstant);\n      }\n    }\n  } // HANDLE COMPOSITE SETTERS\n  // NOTE: any non-provided values needed by composite setters are filled in from state cache\n  // The cache parameter is automatically retrieved from the context\n  // This depends on `trackContextState`, which is technically a \"circular\" dependency.\n  // But it is too inconvenient to always require a cache parameter here.\n  // This is the ONLY external dependency in this module/\n\n\n  var cache = gl.state && gl.state.cache;\n\n  if (cache) {\n    var mergedValues = Object.assign({}, cache, values);\n\n    for (var _key in compositeSetters) {\n      // TODO - avoid calling composite setters if values have not changed.\n      var compositeSetter = COMPOSITE_GL_PARAMETER_SETTERS[_key]; // Note - if `trackContextState` has been called,\n      // the setter will automatically update this.state.cache\n\n      compositeSetter(gl, mergedValues);\n    }\n  } // Add a log for the else case?\n\n} // Queries any single GL parameter regardless of function (gl.getParameter/gl.isEnabled...)\n\n\nfunction getParameter(gl, key) {\n  var getter = GL_PARAMETER_GETTERS[key];\n  return getter ? getter(gl, Number(key)) : gl.getParameter(Number(key));\n} // Copies the state from a context (gl.getParameter should not be overriden)\n// Reads the entire WebGL state from a context\n// Caveat: This generates a huge amount of synchronous driver roundtrips and should be\n// considered a very slow operation, to be used only if/when a context already manipulated\n// by external code needs to be synchronized for the first time\n// @return {Object} - a newly created map, with values keyed by GL parameters\n\n\nfunction getParameters(gl, parameters) {\n  // default to querying all parameters\n  parameters = parameters || GL_PARAMETER_DEFAULTS; // support both arrays of parameters and objects (keys represent parameters)\n\n  var parameterKeys = Array.isArray(parameters) ? parameters : Object.keys(parameters);\n  var state = {};\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = parameterKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var key = _step.value;\n      state[key] = getParameter(gl, key);\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  return state;\n}\n\nfunction getDefaultParameters(gl) {\n  // TODO - Query GL.VIEWPORT and GL.SCISSOR_BOX since these are dynamic\n  return Object.assign({}, GL_PARAMETER_DEFAULTS, {// TODO: For viewport and scissor default values are set at the time of\n    // context creation based on canvas size, we can query them here but it will\n    // not match with what we have in GL_PARAMETER_DEFAULTS table, we should revisit.\n    // [GL.VIEWPORT]: gl.constructor.prototype.getParameter.call(gl, GL.VIEWPORT),\n    // [GL.SCISSOR_BOX]: gl.constructor.prototype.getParameter.call(gl, GL.SCISSOR_BOX)\n  });\n} // Reset all parameters to a pure context state\n\n\nfunction resetParameters(gl) {\n  setParameters(gl, getDefaultParameters(gl));\n} // Get all parameters that have been modified from a pure context state\n\n\nfunction getModifiedParameters(gl) {\n  var values = getParameters(GL_PARAMETER_DEFAULTS);\n  var modified = {};\n\n  for (var key in GL_PARAMETER_DEFAULTS) {\n    if (!deepArrayEqual(values[key], GL_PARAMETER_DEFAULTS[key])) {\n      modified[key] = values[key];\n    }\n  }\n\n  return modified;\n}\n},{\"@babel/runtime/helpers/esm/toConsumableArray\":\"Qv3s\",\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"../webgl-utils\":\"CTd0\",\"../utils/assert\":\"iVaU\"}],\"V1Wo\":[function(require,module,exports) {\nvar global = arguments[3];\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = trackContextState;\nexports.pushContextState = pushContextState;\nexports.popContextState = popContextState;\nexports.GL_STATE_SETTERS = exports.deepEqual = exports.clone = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _setParameters = require(\"./set-parameters\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Support for listening to context state changes and intercepting state queries\n//\n// NOTE: this system does not handle buffer bindings\nvar clone = function clone(x) {\n  return Array.isArray(x) || ArrayBuffer.isView(x) ? x.slice() : x;\n};\n\nexports.clone = clone;\n\nvar deepEqual = function deepEqual(x, y) {\n  var isArrayX = Array.isArray(x) || ArrayBuffer.isView(x);\n  var isArrayY = Array.isArray(y) || ArrayBuffer.isView(y);\n\n  if (isArrayX && isArrayY && x.length === y.length) {\n    for (var i = 0; i < x.length; ++i) {\n      if (x[i] !== y[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return x === y;\n}; // interceptors for WEBGL FUNCTIONS that set WebGLRenderingContext state\n// These \"setters\" map functions to gl parameters\n\n\nexports.deepEqual = deepEqual;\nvar GL_STATE_SETTERS = {\n  // GENERIC SETTERS\n  enable: function enable(update, cap) {\n    return update((0, _defineProperty2.default)({}, cap, true));\n  },\n  disable: function disable(update, cap) {\n    return update((0, _defineProperty2.default)({}, cap, false));\n  },\n  pixelStorei: function pixelStorei(update, pname, param) {\n    return update((0, _defineProperty2.default)({}, pname, param));\n  },\n  hint: function hint(update, pname, _hint) {\n    return update((0, _defineProperty2.default)({}, pname, _hint));\n  },\n  // SPECIFIC SETTERS\n  bindFramebuffer: function bindFramebuffer(update, target, fb) {\n    var _update5;\n\n    switch (target) {\n      case 36160:\n        return update((_update5 = {}, (0, _defineProperty2.default)(_update5, 36006, fb), (0, _defineProperty2.default)(_update5, 36010, fb), _update5));\n\n      case 36009:\n        return update((0, _defineProperty2.default)({}, 36006, fb));\n\n      case 36008:\n        return update((0, _defineProperty2.default)({}, 36010, fb));\n\n      default:\n        return null;\n    }\n  },\n  blendColor: function blendColor(update, r, g, b, a) {\n    return update((0, _defineProperty2.default)({}, 32773, new Float32Array([r, g, b, a])));\n  },\n  blendEquation: function blendEquation(update, mode) {\n    var _update9;\n\n    return update((_update9 = {}, (0, _defineProperty2.default)(_update9, 32777, mode), (0, _defineProperty2.default)(_update9, 34877, mode), _update9));\n  },\n  blendEquationSeparate: function blendEquationSeparate(update, modeRGB, modeAlpha) {\n    var _update10;\n\n    return update((_update10 = {}, (0, _defineProperty2.default)(_update10, 32777, modeRGB), (0, _defineProperty2.default)(_update10, 34877, modeAlpha), _update10));\n  },\n  blendFunc: function blendFunc(update, src, dst) {\n    var _update11;\n\n    return update((_update11 = {}, (0, _defineProperty2.default)(_update11, 32969, src), (0, _defineProperty2.default)(_update11, 32968, dst), (0, _defineProperty2.default)(_update11, 32971, src), (0, _defineProperty2.default)(_update11, 32970, dst), _update11));\n  },\n  blendFuncSeparate: function blendFuncSeparate(update, srcRGB, dstRGB, srcAlpha, dstAlpha) {\n    var _update12;\n\n    return update((_update12 = {}, (0, _defineProperty2.default)(_update12, 32969, srcRGB), (0, _defineProperty2.default)(_update12, 32968, dstRGB), (0, _defineProperty2.default)(_update12, 32971, srcAlpha), (0, _defineProperty2.default)(_update12, 32970, dstAlpha), _update12));\n  },\n  clearColor: function clearColor(update, r, g, b, a) {\n    return update((0, _defineProperty2.default)({}, 3106, new Float32Array([r, g, b, a])));\n  },\n  clearDepth: function clearDepth(update, depth) {\n    return update((0, _defineProperty2.default)({}, 2931, depth));\n  },\n  clearStencil: function clearStencil(update, s) {\n    return update((0, _defineProperty2.default)({}, 2961, s));\n  },\n  colorMask: function colorMask(update, r, g, b, a) {\n    return update((0, _defineProperty2.default)({}, 3107, [r, g, b, a]));\n  },\n  cullFace: function cullFace(update, mode) {\n    return update((0, _defineProperty2.default)({}, 2885, mode));\n  },\n  depthFunc: function depthFunc(update, func) {\n    return update((0, _defineProperty2.default)({}, 2932, func));\n  },\n  depthRange: function depthRange(update, zNear, zFar) {\n    return update((0, _defineProperty2.default)({}, 2928, new Float32Array([zNear, zFar])));\n  },\n  depthMask: function depthMask(update, mask) {\n    return update((0, _defineProperty2.default)({}, 2930, mask));\n  },\n  frontFace: function frontFace(update, face) {\n    return update((0, _defineProperty2.default)({}, 2886, face));\n  },\n  lineWidth: function lineWidth(update, width) {\n    return update((0, _defineProperty2.default)({}, 2849, width));\n  },\n  polygonOffset: function polygonOffset(update, factor, units) {\n    var _update23;\n\n    return update((_update23 = {}, (0, _defineProperty2.default)(_update23, 32824, factor), (0, _defineProperty2.default)(_update23, 10752, units), _update23));\n  },\n  sampleCoverage: function sampleCoverage(update, value, invert) {\n    var _update24;\n\n    return update((_update24 = {}, (0, _defineProperty2.default)(_update24, 32938, value), (0, _defineProperty2.default)(_update24, 32939, invert), _update24));\n  },\n  scissor: function scissor(update, x, y, width, height) {\n    return update((0, _defineProperty2.default)({}, 3088, new Int32Array([x, y, width, height])));\n  },\n  stencilMask: function stencilMask(update, mask) {\n    var _update26;\n\n    return update((_update26 = {}, (0, _defineProperty2.default)(_update26, 2968, mask), (0, _defineProperty2.default)(_update26, 36005, mask), _update26));\n  },\n  stencilMaskSeparate: function stencilMaskSeparate(update, face, mask) {\n    return update((0, _defineProperty2.default)({}, face === 1028 ? 2968 : 36005, mask));\n  },\n  stencilFunc: function stencilFunc(update, func, ref, mask) {\n    var _update28;\n\n    return update((_update28 = {}, (0, _defineProperty2.default)(_update28, 2962, func), (0, _defineProperty2.default)(_update28, 2967, ref), (0, _defineProperty2.default)(_update28, 2963, mask), (0, _defineProperty2.default)(_update28, 34816, func), (0, _defineProperty2.default)(_update28, 36003, ref), (0, _defineProperty2.default)(_update28, 36004, mask), _update28));\n  },\n  stencilFuncSeparate: function stencilFuncSeparate(update, face, func, ref, mask) {\n    var _update29;\n\n    return update((_update29 = {}, (0, _defineProperty2.default)(_update29, face === 1028 ? 2962 : 34816, func), (0, _defineProperty2.default)(_update29, face === 1028 ? 2967 : 36003, ref), (0, _defineProperty2.default)(_update29, face === 1028 ? 2963 : 36004, mask), _update29));\n  },\n  stencilOp: function stencilOp(update, fail, zfail, zpass) {\n    var _update30;\n\n    return update((_update30 = {}, (0, _defineProperty2.default)(_update30, 2964, fail), (0, _defineProperty2.default)(_update30, 2965, zfail), (0, _defineProperty2.default)(_update30, 2966, zpass), (0, _defineProperty2.default)(_update30, 34817, fail), (0, _defineProperty2.default)(_update30, 34818, zfail), (0, _defineProperty2.default)(_update30, 34819, zpass), _update30));\n  },\n  stencilOpSeparate: function stencilOpSeparate(update, face, fail, zfail, zpass) {\n    var _update31;\n\n    return update((_update31 = {}, (0, _defineProperty2.default)(_update31, face === 1028 ? 2964 : 34817, fail), (0, _defineProperty2.default)(_update31, face === 1028 ? 2965 : 34818, zfail), (0, _defineProperty2.default)(_update31, face === 1028 ? 2966 : 34819, zpass), _update31));\n  },\n  viewport: function viewport(update, x, y, width, height) {\n    return update((0, _defineProperty2.default)({}, 2978, new Int32Array([x, y, width, height])));\n  }\n}; // HELPER FUNCTIONS - INSTALL GET/SET INTERCEPTORS (SPYS) ON THE CONTEXT\n// Overrides a WebGLRenderingContext state \"getter\" function\n// to return values directly from cache\n\nexports.GL_STATE_SETTERS = GL_STATE_SETTERS;\n\nfunction installGetterOverride(gl, functionName) {\n  // Get the original function from the WebGLRenderingContext\n  var originalGetterFunc = gl[functionName].bind(gl); // Wrap it with a spy so that we can update our state cache when it gets called\n\n  gl[functionName] = function get() {\n    var pname = arguments.length <= 0 ? undefined : arguments[0]; // WebGL limits are not prepopulated in the cache, we must\n    // query first time. They are all primitive (single value)\n\n    if (!(pname in gl.state.cache)) {\n      gl.state.cache[pname] = originalGetterFunc.apply(void 0, arguments);\n    } // Optionally call the original function to do a \"hard\" query from the WebGLRenderingContext\n\n\n    return gl.state.enable ? // Call the getter the params so that it can e.g. serve from a cache\n    gl.state.cache[pname] : // Optionally call the original function to do a \"hard\" query from the WebGLRenderingContext\n    originalGetterFunc.apply(void 0, arguments);\n  }; // Set the name of this anonymous function to help in debugging and profiling\n\n\n  Object.defineProperty(gl[functionName], 'name', {\n    value: \"\".concat(functionName, \"-from-cache\"),\n    configurable: false\n  });\n} // Overrides a WebGLRenderingContext state \"setter\" function\n// to call a setter spy before the actual setter. Allows us to keep a cache\n// updated with a copy of the WebGL context state.\n\n\nfunction installSetterSpy(gl, functionName, setter) {\n  // Get the original function from the WebGLRenderingContext\n  var originalSetterFunc = gl[functionName].bind(gl); // Wrap it with a spy so that we can update our state cache when it gets called\n\n  gl[functionName] = function set() {\n    for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {\n      params[_key] = arguments[_key];\n    } // Update the value\n    // Call the setter with the state cache and the params so that it can store the parameters\n\n\n    var _setter = setter.apply(void 0, [gl.state._updateCache].concat(params)),\n        valueChanged = _setter.valueChanged,\n        oldValue = _setter.oldValue; // Call the original WebGLRenderingContext func to make sure the context actually gets updated\n\n\n    if (valueChanged) {\n      var _gl$state;\n\n      (_gl$state = gl.state).log.apply(_gl$state, [\"gl.\".concat(functionName)].concat(params)); // eslint-disable-line\n\n\n      originalSetterFunc.apply(void 0, params);\n    } // Note: if the original function fails to set the value, our state cache will be bad\n    // No solution for this at the moment, but assuming that this is unlikely to be a real problem\n    // We could call the setter after the originalSetterFunc. Concern is that this would\n    // cause different behavior in debug mode, where originalSetterFunc can throw exceptions\n\n\n    return oldValue;\n  }; // Set the name of this anonymous function to help in debugging and profiling\n\n\n  Object.defineProperty(gl[functionName], 'name', {\n    value: \"\".concat(functionName, \"-to-cache\"),\n    configurable: false\n  });\n} // HELPER CLASS - GLState\n\n/* eslint-disable no-shadow */\n\n\nvar GLState =\n/*#__PURE__*/\nfunction () {\n  function GLState(gl) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        _ref$copyState = _ref.copyState,\n        copyState = _ref$copyState === void 0 ? false : _ref$copyState,\n        _ref$log = _ref.log,\n        log = _ref$log === void 0 ? function () {} : _ref$log;\n\n    (0, _classCallCheck2.default)(this, GLState);\n    this.gl = gl;\n    this.stateStack = [];\n    this.enable = true;\n    this.cache = copyState ? (0, _setParameters.getParameters)(gl) : Object.assign({}, _setParameters.GL_PARAMETER_DEFAULTS);\n    this.log = log;\n    this._updateCache = this._updateCache.bind(this);\n    Object.seal(this);\n  }\n\n  (0, _createClass2.default)(GLState, [{\n    key: \"push\",\n    value: function push() {\n      var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this.stateStack.push({});\n    }\n  }, {\n    key: \"pop\",\n    value: function pop() {\n      (0, _assert.default)(this.stateStack.length > 0); // Use the saved values in the state stack to restore parameters\n\n      var oldValues = this.stateStack[this.stateStack.length - 1];\n      (0, _setParameters.setParameters)(this.gl, oldValues, this.cache); // Don't pop until we have reset parameters (to make sure other \"stack frames\" are not affected)\n\n      this.stateStack.pop();\n    } // interceptor for context set functions - update our cache and our stack\n    // values (Object) - the key values for this setter\n\n  }, {\n    key: \"_updateCache\",\n    value: function _updateCache(values) {\n      var valueChanged = false;\n      var oldValue; // = undefined\n\n      var oldValues = this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1];\n\n      for (var key in values) {\n        (0, _assert.default)(key !== undefined); // Check that value hasn't already been shadowed\n\n        if (!deepEqual(values[key], this.cache[key])) {\n          valueChanged = true;\n          oldValue = this.cache[key]; // First, save current value being shadowed\n          // If a state stack frame is active, save the current parameter values for pop\n          // but first check that value hasn't already been shadowed and saved\n\n          if (oldValues && !(key in oldValues)) {\n            oldValues[key] = this.cache[key];\n          } // Save current value being shadowed\n\n\n          this.cache[key] = values[key];\n        }\n      }\n\n      return {\n        valueChanged: valueChanged,\n        oldValue: oldValue\n      };\n    }\n  }]);\n  return GLState;\n}(); // PUBLIC API\n\n/**\n * Initialize WebGL state caching on a context\n * can be called multiple times to enable/disable\n * @param {WebGLRenderingContext} - context\n */\n// After calling this function, context state will be cached\n// gl.state.push() and gl.state.pop() will be available for saving,\n// temporarily modifying, and then restoring state.\n\n\nfunction trackContextState(gl) {\n  var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref2$enable = _ref2.enable,\n      enable = _ref2$enable === void 0 ? true : _ref2$enable,\n      copyState = _ref2.copyState;\n\n  (0, _assert.default)(copyState !== undefined);\n\n  if (!gl.state) {\n    /* global window, global */\n    var global_ = typeof global !== 'undefined' ? global : window;\n\n    if (global_.polyfillContext) {\n      global_.polyfillContext(gl);\n    } // Create a state cache\n\n\n    gl.state = new GLState(gl, {\n      copyState: copyState,\n      enable: enable\n    }); // intercept all setter functions in the table\n\n    for (var key in GL_STATE_SETTERS) {\n      var setter = GL_STATE_SETTERS[key];\n      installSetterSpy(gl, key, setter);\n    } // intercept all getter functions in the table\n\n\n    installGetterOverride(gl, 'getParameter');\n    installGetterOverride(gl, 'isEnabled');\n  }\n\n  gl.state.enable = enable;\n  return gl;\n}\n\nfunction pushContextState(gl) {\n  if (!gl.state) {\n    trackContextState(gl, {\n      copyState: false\n    });\n  }\n\n  gl.state.push();\n}\n\nfunction popContextState(gl) {\n  (0, _assert.default)(gl.state);\n  gl.state.pop();\n}\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"./set-parameters\":\"a1Bf\",\"../utils/assert\":\"iVaU\"}],\"ON2o\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setParameters = setParameters;\nexports.withParameters = withParameters;\nObject.defineProperty(exports, \"getParameter\", {\n  enumerable: true,\n  get: function () {\n    return _setParameters.getParameter;\n  }\n});\nObject.defineProperty(exports, \"getParameters\", {\n  enumerable: true,\n  get: function () {\n    return _setParameters.getParameters;\n  }\n});\nObject.defineProperty(exports, \"setParameter\", {\n  enumerable: true,\n  get: function () {\n    return _setParameters.setParameter;\n  }\n});\nObject.defineProperty(exports, \"resetParameters\", {\n  enumerable: true,\n  get: function () {\n    return _setParameters.resetParameters;\n  }\n});\nObject.defineProperty(exports, \"getModifiedParameters\", {\n  enumerable: true,\n  get: function () {\n    return _setParameters.getModifiedParameters;\n  }\n});\nexports.LUMA_SETTERS = void 0;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/toConsumableArray\"));\n\nvar _trackContextState = require(\"../webgl-context/track-context-state\");\n\nvar _setParameters = require(\"../webgl-context/set-parameters\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable no-inline-comments, max-len */\n// map of parameter setter function names, parameter constants, default values and types\n// - Uses gl function names, except when setter function exist that are named differently\n// - When the WebGL api offers <setter> and <setter>Separate (e.g. blendEquation and\n//   blendEquationSeparate, we use non-separate name, but accept both non-separate and\n//   separate arguments. Thus, a `getParameter` call will always return all the separate values\n//   in an array, in a form that can be accepted by the setter.\nvar LUMA_SETTERS = {\n  framebuffer: function framebuffer(gl, _framebuffer) {\n    // accepts 1) a WebGLFramebuffer 2) null (default framebuffer), or 3) luma.gl Framebuffer class\n    // framebuffer is null when restoring to default framebuffer, otherwise use the WebGL handle.\n    var handle = _framebuffer && 'handle' in _framebuffer ? _framebuffer.handle : _framebuffer;\n    return gl.bindFramebuffer(36160, handle);\n  },\n  blend: function blend(gl, value) {\n    return value ? gl.enable(3042) : gl.disable(3042);\n  },\n  blendColor: function blendColor(gl, value) {\n    return gl.blendColor.apply(gl, (0, _toConsumableArray2.default)(value));\n  },\n  blendEquation: function blendEquation(gl, args) {\n    args = isArray(args) ? args : [args, args];\n    gl.blendEquationSeparate.apply(gl, (0, _toConsumableArray2.default)(args));\n  },\n  blendFunc: function blendFunc(gl, args) {\n    args = isArray(args) && args.length === 2 ? (0, _toConsumableArray2.default)(args).concat((0, _toConsumableArray2.default)(args)) : args;\n    gl.blendFuncSeparate.apply(gl, (0, _toConsumableArray2.default)(args));\n  },\n  clearColor: function clearColor(gl, value) {\n    return gl.clearColor.apply(gl, (0, _toConsumableArray2.default)(value));\n  },\n  clearDepth: function clearDepth(gl, value) {\n    return gl.clearDepth(value);\n  },\n  clearStencil: function clearStencil(gl, value) {\n    return gl.clearStencil(value);\n  },\n  colorMask: function colorMask(gl, value) {\n    return gl.colorMask.apply(gl, (0, _toConsumableArray2.default)(value));\n  },\n  cull: function cull(gl, value) {\n    return value ? gl.enable(2884) : gl.disable(2884);\n  },\n  cullFace: function cullFace(gl, value) {\n    return gl.cullFace(value);\n  },\n  depthTest: function depthTest(gl, value) {\n    return value ? gl.enable(2929) : gl.disable(2929);\n  },\n  depthFunc: function depthFunc(gl, value) {\n    return gl.depthFunc(value);\n  },\n  depthMask: function depthMask(gl, value) {\n    return gl.depthMask(value);\n  },\n  depthRange: function depthRange(gl, value) {\n    return gl.depthRange.apply(gl, (0, _toConsumableArray2.default)(value));\n  },\n  dither: function dither(gl, value) {\n    return value ? gl.enable(3024) : gl.disable(3024);\n  },\n  derivativeHint: function derivativeHint(gl, value) {\n    // gl1: 'OES_standard_derivatives'\n    gl.hint(35723, value);\n  },\n  frontFace: function frontFace(gl, value) {\n    return gl.frontFace(value);\n  },\n  mipmapHint: function mipmapHint(gl, value) {\n    return gl.hint(33170, value);\n  },\n  lineWidth: function lineWidth(gl, value) {\n    return gl.lineWidth(value);\n  },\n  polygonOffsetFill: function polygonOffsetFill(gl, value) {\n    return value ? gl.enable(32823) : gl.disable(32823);\n  },\n  polygonOffset: function polygonOffset(gl, value) {\n    return gl.polygonOffset.apply(gl, (0, _toConsumableArray2.default)(value));\n  },\n  sampleCoverage: function sampleCoverage(gl, value) {\n    return gl.sampleCoverage.apply(gl, (0, _toConsumableArray2.default)(value));\n  },\n  scissorTest: function scissorTest(gl, value) {\n    return value ? gl.enable(3089) : gl.disable(3089);\n  },\n  scissor: function scissor(gl, value) {\n    return gl.scissor.apply(gl, (0, _toConsumableArray2.default)(value));\n  },\n  stencilTest: function stencilTest(gl, value) {\n    return value ? gl.enable(2960) : gl.disable(2960);\n  },\n  stencilMask: function stencilMask(gl, value) {\n    value = isArray(value) ? value : [value, value];\n\n    var _value = value,\n        _value2 = (0, _slicedToArray2.default)(_value, 2),\n        mask = _value2[0],\n        backMask = _value2[1];\n\n    gl.stencilMaskSeparate(1028, mask);\n    gl.stencilMaskSeparate(1029, backMask);\n  },\n  stencilFunc: function stencilFunc(gl, args) {\n    args = isArray(args) && args.length === 3 ? (0, _toConsumableArray2.default)(args).concat((0, _toConsumableArray2.default)(args)) : args;\n\n    var _args = args,\n        _args2 = (0, _slicedToArray2.default)(_args, 6),\n        func = _args2[0],\n        ref = _args2[1],\n        mask = _args2[2],\n        backFunc = _args2[3],\n        backRef = _args2[4],\n        backMask = _args2[5];\n\n    gl.stencilFuncSeparate(1028, func, ref, mask);\n    gl.stencilFuncSeparate(1029, backFunc, backRef, backMask);\n  },\n  stencilOp: function stencilOp(gl, args) {\n    args = isArray(args) && args.length === 3 ? (0, _toConsumableArray2.default)(args).concat((0, _toConsumableArray2.default)(args)) : args;\n\n    var _args3 = args,\n        _args4 = (0, _slicedToArray2.default)(_args3, 6),\n        sfail = _args4[0],\n        dpfail = _args4[1],\n        dppass = _args4[2],\n        backSfail = _args4[3],\n        backDpfail = _args4[4],\n        backDppass = _args4[5];\n\n    gl.stencilOpSeparate(1028, sfail, dpfail, dppass);\n    gl.stencilOpSeparate(1029, backSfail, backDpfail, backDppass);\n  },\n  viewport: function viewport(gl, value) {\n    return gl.viewport.apply(gl, (0, _toConsumableArray2.default)(value));\n  }\n}; // HELPERS\n\nexports.LUMA_SETTERS = LUMA_SETTERS;\n\nfunction isArray(array) {\n  return Array.isArray(array) || ArrayBuffer.isView(array);\n} // GETTERS AND SETTERS\n// Get the parameter value(s) from the context\n\n\n// Note: \"setParameters\" is given extra treatment below\n// Set the parameter value(s) by key to the context\n// Sets value with key to context.\n// Value may be \"normalized\" (in case a short form is supported). In that case\n// the normalized value is retured.\nfunction setParameters(gl, parameters) {\n  (0, _setParameters.setParameters)(gl, parameters);\n\n  for (var key in parameters) {\n    var setter = LUMA_SETTERS[key];\n\n    if (setter) {\n      setter(gl, parameters[key], key);\n    }\n  }\n} // VERY LIMITED / BASIC GL STATE MANAGEMENT\n// Executes a function with gl states temporarily set, exception safe\n// Currently support pixelStorage, scissor test and framebuffer binding\n\n\nfunction withParameters(gl, parameters, func) {\n  // assertWebGLContext(gl);\n  if ((0, _utils.isObjectEmpty)(parameters)) {\n    // Avoid setting state if no parameters provided. Just call and return\n    return func(gl);\n  }\n\n  var _parameters$nocatch = parameters.nocatch,\n      nocatch = _parameters$nocatch === void 0 ? true : _parameters$nocatch; // frameBuffer not supported use framebuffer\n\n  (0, _assert.default)(!parameters.frameBuffer);\n  (0, _trackContextState.pushContextState)(gl);\n  setParameters(gl, parameters); // Setup is done, call the function\n\n  var value;\n\n  if (nocatch) {\n    // Avoid try catch to minimize stack size impact for safe execution paths\n    value = func(gl);\n    (0, _trackContextState.popContextState)(gl);\n  } else {\n    // Wrap in a try-catch to ensure that parameters are restored on exceptions\n    try {\n      value = func(gl);\n    } finally {\n      (0, _trackContextState.popContextState)(gl);\n    }\n  }\n\n  return value;\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"@babel/runtime/helpers/esm/toConsumableArray\":\"Qv3s\",\"../webgl-context/track-context-state\":\"V1Wo\",\"../webgl-context/set-parameters\":\"a1Bf\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"m3Lc\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.TEXTURE_FORMATS = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _buffer = _interopRequireDefault(require(\"./buffer\"));\n\nvar _contextState = require(\"../webgl-context/context-state\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _TEXTURE_FORMATS;\n/* eslint-disable no-inline-comments, max-len */\n\n\n// Supported min filters for NPOT texture.\nvar NPOT_MIN_FILTERS = [9729, 9728]; // const S3TC = 'WEBGL_compressed_texture_s3tc';\n// const PVRTC = 'WEBGL_compressed_texture_pvrtc';\n// const ES3 = 'WEBGL_compressed_texture_es3';\n// const ETC1 = 'WEBGL_compressed_texture_etc1';\n// const SRGB = 'EXT_sRGB';\n// const DEPTH = 'WEBGL_depth_texture';\n// Legal combinations for internalFormat, format and type\n\nvar TEXTURE_FORMATS = (_TEXTURE_FORMATS = {}, (0, _defineProperty2.default)(_TEXTURE_FORMATS, 6407, {\n  dataFormat: 6407,\n  types: [5121, 33635]\n}), (0, _defineProperty2.default)(_TEXTURE_FORMATS, 6408, {\n  dataFormat: 6408,\n  types: [5121, 32819, 32820]\n}), (0, _defineProperty2.default)(_TEXTURE_FORMATS, 6406, {\n  dataFormat: 6406,\n  types: [5121]\n}), (0, _defineProperty2.default)(_TEXTURE_FORMATS, 6409, {\n  dataFormat: 6409,\n  types: [5121]\n}), (0, _defineProperty2.default)(_TEXTURE_FORMATS, 6410, {\n  dataFormat: 6410,\n  types: [5121]\n}), (0, _defineProperty2.default)(_TEXTURE_FORMATS, 33326, {\n  dataFormat: 6403,\n  types: [5126],\n  gl2: true\n}), (0, _defineProperty2.default)(_TEXTURE_FORMATS, 33328, {\n  dataFormat: 33319,\n  types: [5126],\n  gl2: true\n}), (0, _defineProperty2.default)(_TEXTURE_FORMATS, 34837, {\n  dataFormat: 6407,\n  types: [5126],\n  gl2: true\n}), (0, _defineProperty2.default)(_TEXTURE_FORMATS, 34836, {\n  dataFormat: 6408,\n  types: [5126],\n  gl2: true // [GL.DEPTH_COMPONENT]: {types: [GL.UNSIGNED_SHORT, GL.UNSIGNED_INT, GL.UNSIGNED_INT_24_8], gl1: DEPTH},\n  // [GL.DEPTH_STENCIL]: {gl1: DEPTH},\n  // Sized texture format - more performance\n  // R\n  // [GL.R8]: {dataFormat: GL.RED, types: [GL.UNSIGNED_BYTE], gl2: true},\n  // [GL.R16F]: {dataFormat: GL.RED, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n  // [GL.R8UI]: {dataFormat: GL.RED_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n  // // RG\n  // [GL.RG8]: {dataFormat: GL.RG, types: [GL.UNSIGNED_BYTE], gl2: true},\n  // [GL.RG16F]: {dataFormat: GL.RG, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n  // [GL.RG8UI]: {dataFormat: GL.RG_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n  // // RGB\n  // [GL.RGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true, gl1: SRGB},\n  // [GL.SRGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true, gl1: SRGB},\n  // [GL.RGB565]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5], gl2: true},\n  // [GL.R11F_G11F_B10F]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_INT_10F_11F_11F_REV, GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n  // [GL.RGB9_E5]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1: 'WEBGL_color_buffer_half_float'},\n  // [GL.RGB16F]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1: 'WEBGL_color_buffer_float'},\n  // [GL.RGB8UI]: {dataFormat: GL.RGB_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n  // // RGBA\n  // [GL.RGBA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true, gl1: SRGB},\n  // [GL.SRGB8_ALPHA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true, gl1: SRGB},\n  // [GL.RGB5_A1]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_5_5_1], gl2: true},\n  // [GL.RGBA4]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4], gl2: true},\n  // [GL.RGBA16F]: {dataFormat: GL.RGBA, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n  // [GL.RGBA8UI]: {dataFormat: GL.RGBA_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true}\n  // Compressed formats\n  // WEBGL_compressed_texture_s3tc\n  // [GL.COMPRESSED_RGB_S3TC_DXT1_EXT]: {compressed: true, gl1: S3TC},\n  // [GL.COMPRESSED_RGBA_S3TC_DXT1_EXT]: {compressed: true, gl1: S3TC},\n  // [GL.COMPRESSED_RGBA_S3TC_DXT3_EXT]: {compressed: true, gl1: S3TC},\n  // [GL.COMPRESSED_RGBA_S3TC_DXT5_EXT]: {compressed: true, gl1: S3TC},\n  // WEBGL_compressed_texture_es3\n  // [GL.COMPRESSED_R11_EAC]: {compressed: true, gl1: ES3}, // RED\n  // [GL.COMPRESSED_SIGNED_R11_EAC]: {compressed: true, gl1: ES3}, // RED\n  // [GL.COMPRESSED_RG11_EAC]: {compressed: true, gl1: ES3}, // RG\n  // [GL.COMPRESSED_SIGNED_RG11_EAC]: {compressed: true, gl1: ES3}, // RG\n  // [GL.COMPRESSED_RGB8_ETC2]: {compressed: true, gl1: ES3}, // RGB\n  // [GL.COMPRESSED_RGBA8_ETC2_EAC]: {compressed: true, gl1: ES3}, // RBG\n  // [GL.COMPRESSED_SRGB8_ETC2]: {compressed: true, gl1: ES3}, // RGB\n  // [GL.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC]: {compressed: true, gl1: ES3}, // RGBA\n  // [GL.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2]: {compressed: true, gl1: ES3}, // RGBA\n  // [GL.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2]: {compressed: true, gl1: ES3}, // RGBA\n\n  /* WebGL2 guaranteed availability compressed formats?\n  COMPRESSED_R11_EAC RED\n  COMPRESSED_SIGNED_R11_EAC RED\n  COMPRESSED_RG11_EAC RG\n  COMPRESSED_SIGNED_RG11_EAC RG\n  COMPRESSED_RGB8_ETC2 RGB\n  COMPRESSED_SRGB8_ETC2 RGB\n  COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 RGBA\n  COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 RGBA\n  COMPRESSED_RGBA8_ETC2_EAC RGBA\n  COMPRESSED_SRGB8_ALPHA8_ETC2_EAC\n  */\n  // WEBGL_compressed_texture_pvrtc\n  // [GL.COMPRESSED_RGB_PVRTC_4BPPV1_IMG]: {compressed: true, gl1: PVRTC},\n  // [GL.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG]: {compressed: true, gl1: PVRTC},\n  // [GL.COMPRESSED_RGB_PVRTC_2BPPV1_IMG]: {compressed: true, gl1: PVRTC},\n  // [GL.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG]: {compressed: true, gl1: PVRTC},\n  // WEBGL_compressed_texture_etc1\n  // [GL.COMPRESSED_RGB_ETC1_WEBGL]: {compressed: true, gl1: ETC1},\n  // WEBGL_compressed_texture_atc\n  // [GL.COMPRESSED_RGB_ATC_WEBGL]: {compressed: true, gl1: ETC1},\n  // [GL.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL]: {compressed: true, gl1: ETC1},\n  // [GL.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL]: {compressed: true, gl1: ETC1}\n\n}), _TEXTURE_FORMATS);\nexports.TEXTURE_FORMATS = TEXTURE_FORMATS;\n\nfunction isFormatSupported(gl, format) {\n  var info = TEXTURE_FORMATS[format];\n\n  if (!info) {\n    return false;\n  }\n\n  if (info.gl1 === undefined && info.gl2 === undefined) {\n    // No info - always supported\n    return true;\n  }\n\n  var value = (0, _webglUtils.isWebGL2)(gl) ? info.gl2 || info.gl1 : info.gl1;\n  return typeof value === 'string' ? gl.getExtension(value) : value;\n}\n\nfunction isLinearFilteringSupported(gl, format) {\n  var info = TEXTURE_FORMATS[format];\n\n  switch (info && info.types[0]) {\n    // Both WebGL1 and WebGL2?\n    case 5126:\n      return gl.getExtension('OES_texture_float_linear');\n    // Not in WebGL2?\n\n    case 5131:\n      return gl.getExtension('OES_texture_half_float_linear');\n\n    default:\n      return true;\n  }\n}\n\nvar Texture =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(Texture, _Resource);\n  (0, _createClass2.default)(Texture, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          format = _ref.format,\n          linearFiltering = _ref.linearFiltering;\n\n      var supported = true;\n\n      if (format) {\n        supported = supported && isFormatSupported(gl, format);\n        supported = supported && (!linearFiltering || isLinearFilteringSupported(gl, format));\n      }\n\n      return supported;\n    } // target cannot be modified by bind:\n    // textures are special because when you first bind them to a target,\n    // they get special information. When you first bind a texture as a\n    // GL_TEXTURE_2D, you are actually setting special state in the texture.\n    // You are saying that this texture is a 2D texture.\n    // And it will always be a 2D texture; this state cannot be changed ever.\n    // If you have a texture that was first bound as a GL_TEXTURE_2D,\n    // you must always bind it as a GL_TEXTURE_2D;\n    // attempting to bind it as GL_TEXTURE_1D will give rise to an error\n    // (while run-time).\n\n  }]);\n\n  function Texture(gl, opts) {\n    var _this;\n\n    (0, _classCallCheck2.default)(this, Texture);\n    var _opts$id = opts.id,\n        id = _opts$id === void 0 ? (0, _utils.uid)('texture') : _opts$id,\n        handle = opts.handle,\n        target = opts.target;\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Texture).call(this, gl, {\n      id: id,\n      handle: handle\n    }));\n    _this.target = target;\n    _this.hasFloatTexture = gl.getExtension('OES_texture_float');\n    _this.textureUnit = undefined;\n    return _this;\n  }\n\n  (0, _createClass2.default)(Texture, [{\n    key: \"toString\",\n    value: function toString() {\n      return \"Texture(\".concat(this.id, \",\").concat(this.width, \"x\").concat(this.height, \")\");\n    }\n    /* eslint-disable max-len, max-statements */\n\n  }, {\n    key: \"initialize\",\n    value: function initialize() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var data = opts.data;\n      var _opts$pixels = opts.pixels,\n          pixels = _opts$pixels === void 0 ? null : _opts$pixels,\n          _opts$format = opts.format,\n          format = _opts$format === void 0 ? 6408 : _opts$format,\n          _opts$type = opts.type,\n          type = _opts$type === void 0 ? 5121 : _opts$type,\n          _opts$border = opts.border,\n          border = _opts$border === void 0 ? 0 : _opts$border,\n          _opts$recreate = opts.recreate,\n          recreate = _opts$recreate === void 0 ? false : _opts$recreate,\n          _opts$parameters = opts.parameters,\n          parameters = _opts$parameters === void 0 ? {} : _opts$parameters,\n          _opts$pixelStore = opts.pixelStore,\n          pixelStore = _opts$pixelStore === void 0 ? {} : _opts$pixelStore,\n          _opts$textureUnit = opts.textureUnit,\n          textureUnit = _opts$textureUnit === void 0 ? undefined : _opts$textureUnit,\n          _opts$unpackFlipY = opts.unpackFlipY,\n          unpackFlipY = _opts$unpackFlipY === void 0 ? true : _opts$unpackFlipY;\n      var _opts$mipmaps = opts.mipmaps,\n          mipmaps = _opts$mipmaps === void 0 ? true : _opts$mipmaps; // pixels variable is for API compatibility purpose\n\n      if (!data) {\n        // TODO - This looks backwards? Commenting out for now until we decide\n        // which prop to use\n        // log.deprecated('data', 'pixels')();\n        data = pixels;\n      }\n\n      var width = opts.width,\n          height = opts.height,\n          dataFormat = opts.dataFormat; // Deduce width and height\n\n      var _this$_deduceParamete = this._deduceParameters({\n        format: format,\n        type: type,\n        dataFormat: dataFormat,\n        compressed: false,\n        data: data,\n        width: width,\n        height: height\n      });\n\n      width = _this$_deduceParamete.width;\n      height = _this$_deduceParamete.height;\n      dataFormat = _this$_deduceParamete.dataFormat; // Store opts for accessors\n\n      this.width = width;\n      this.height = height;\n      this.format = format;\n      this.type = type;\n      this.dataFormat = dataFormat;\n      this.border = border;\n      this.textureUnit = textureUnit;\n\n      if (Number.isFinite(this.textureUnit)) {\n        this.gl.activeTexture(33984 + this.textureUnit);\n        this.gl.bindTexture(this.target, this.handle);\n      } // Note: luma.gl defaults to GL.UNPACK_FLIP_Y_WEBGL = true;\n      // TODO - compare v4 and v3\n\n\n      var DEFAULT_TEXTURE_SETTINGS = (0, _defineProperty2.default)({}, 37440, unpackFlipY);\n      var glSettings = Object.assign({}, DEFAULT_TEXTURE_SETTINGS, pixelStore);\n\n      if (this._isNPOT() && mipmaps) {\n        _utils.log.warn(\"texture: \".concat(this, \" is Non-Power-Of-Two, disabling mipmaping\"))();\n\n        mipmaps = false;\n\n        this._updateForNPOT(parameters);\n      }\n\n      this.mipmaps = mipmaps;\n      this.setImageData({\n        data: data,\n        width: width,\n        height: height,\n        format: format,\n        type: type,\n        dataFormat: dataFormat,\n        border: border,\n        mipmaps: mipmaps,\n        parameters: glSettings\n      });\n\n      if (mipmaps) {\n        this.generateMipmap();\n      } // Set texture sampler parameters\n\n\n      this.setParameters(parameters); // TODO - Store data to enable auto recreate on context loss\n\n      if (recreate) {\n        this.data = data;\n      }\n    } // If size has changed, reinitializes with current format\n    // note clears image and mipmaps\n\n  }, {\n    key: \"resize\",\n    value: function resize(_ref2) {\n      var width = _ref2.width,\n          height = _ref2.height;\n\n      if (width !== this.width || height !== this.height) {\n        return this.initialize({\n          width: width,\n          height: height,\n          format: this.format,\n          type: this.type,\n          dataFormat: this.dataFormat,\n          border: this.border,\n          mipmaps: false\n        });\n      }\n\n      return this;\n    } // Call to regenerate mipmaps after modifying texture(s)\n\n  }, {\n    key: \"generateMipmap\",\n    value: function generateMipmap() {\n      var _this2 = this;\n\n      var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this.gl.bindTexture(this.target, this.handle);\n      (0, _contextState.withParameters)(this.gl, params, function () {\n        _this2.gl.generateMipmap(_this2.target);\n      });\n      this.gl.bindTexture(this.target, null);\n      return this;\n    }\n    /*\n     * Allocates storage\n     * @param {*} pixels -\n     *  null - create empty texture of specified format\n     *  Typed array - init from image data in typed array\n     *  Buffer|WebGLBuffer - (WEBGL2) init from image data in WebGLBuffer\n     *  HTMLImageElement|Image - Inits with content of image. Auto width/height\n     *  HTMLCanvasElement - Inits with contents of canvas. Auto width/height\n     *  HTMLVideoElement - Creates video texture. Auto width/height\n     *\n     * @param {GLint} width -\n     * @param {GLint} height -\n     * @param {GLint} mipMapLevel -\n     * @param {GLenum} format - format of image data.\n     * @param {GLenum} type\n     *  - format of array (autodetect from type) or\n     *  - (WEBGL2) format of buffer\n     * @param {Number} offset - (WEBGL2) offset from start of buffer\n     * @param {GLint} border - must be 0.\n     * @parameters - temporary settings to be applied, can be used to supply pixel store settings.\n     */\n\n    /* eslint-disable max-len, max-statements, complexity */\n\n  }, {\n    key: \"setImageData\",\n    value: function setImageData(_ref3) {\n      var _ref3$target = _ref3.target,\n          target = _ref3$target === void 0 ? this.target : _ref3$target,\n          _ref3$pixels = _ref3.pixels,\n          pixels = _ref3$pixels === void 0 ? null : _ref3$pixels,\n          _ref3$data = _ref3.data,\n          data = _ref3$data === void 0 ? null : _ref3$data,\n          _ref3$width = _ref3.width,\n          width = _ref3$width === void 0 ? this.width : _ref3$width,\n          _ref3$height = _ref3.height,\n          height = _ref3$height === void 0 ? this.height : _ref3$height,\n          _ref3$level = _ref3.level,\n          level = _ref3$level === void 0 ? 0 : _ref3$level,\n          _ref3$format = _ref3.format,\n          format = _ref3$format === void 0 ? this.format : _ref3$format,\n          _ref3$type = _ref3.type,\n          type = _ref3$type === void 0 ? this.type : _ref3$type,\n          _ref3$dataFormat = _ref3.dataFormat,\n          dataFormat = _ref3$dataFormat === void 0 ? this.dataFormat : _ref3$dataFormat,\n          _ref3$offset = _ref3.offset,\n          offset = _ref3$offset === void 0 ? 0 : _ref3$offset,\n          _ref3$border = _ref3.border,\n          border = _ref3$border === void 0 ? this.border : _ref3$border,\n          _ref3$compressed = _ref3.compressed,\n          compressed = _ref3$compressed === void 0 ? false : _ref3$compressed,\n          _ref3$parameters = _ref3.parameters,\n          parameters = _ref3$parameters === void 0 ? {} : _ref3$parameters; // pixels variable is  for API compatibility purpose\n\n      if (!data) {\n        data = pixels;\n      }\n\n      var _this$_deduceParamete2 = this._deduceParameters({\n        format: format,\n        type: type,\n        dataFormat: dataFormat,\n        compressed: compressed,\n        data: data,\n        width: width,\n        height: height\n      });\n\n      type = _this$_deduceParamete2.type;\n      dataFormat = _this$_deduceParamete2.dataFormat;\n      compressed = _this$_deduceParamete2.compressed;\n      width = _this$_deduceParamete2.width;\n      height = _this$_deduceParamete2.height;\n      var gl = this.gl;\n      gl.bindTexture(this.target, this.handle);\n      var dataType = null;\n\n      var _this$_getDataType = this._getDataType({\n        data: data,\n        compressed: compressed\n      });\n\n      data = _this$_getDataType.data;\n      dataType = _this$_getDataType.dataType;\n      (0, _contextState.withParameters)(this.gl, parameters, function () {\n        switch (dataType) {\n          case 'null':\n            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data);\n            break;\n\n          case 'typed-array':\n            // Looks like this assert is not necessary, as offset is ignored under WebGL1\n            // assert((offset === 0 || isWebGL2(gl)), 'offset supported in WebGL2 only');\n            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data, offset);\n            break;\n\n          case 'buffer':\n            // WebGL2 enables creating textures directly from a WebGL buffer\n            (0, _webglUtils.assertWebGL2Context)(gl);\n            gl.bindBuffer(35052, data.handle || data);\n            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, offset);\n            gl.bindBuffer(35052, null);\n            break;\n\n          case 'browser-object':\n            if ((0, _webglUtils.isWebGL2)(gl)) {\n              gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data);\n            } else {\n              gl.texImage2D(target, level, format, dataFormat, type, data);\n            }\n\n            break;\n\n          case 'compressed':\n            gl.compressedTexImage2D(target, level, format, width, height, border, data);\n            break;\n\n          default:\n            (0, _assert.default)(false, 'Unknown image data type');\n        }\n      });\n    }\n    /* eslint-enable max-len, max-statements, complexity */\n\n    /**\n     * Redefines an area of an existing texture\n     * Note: does not allocate storage\n     */\n\n    /*\n     * Redefines an area of an existing texture\n     * @param {*} pixels, data -\n     *  null - create empty texture of specified format\n     *  Typed array - init from image data in typed array\n     *  Buffer|WebGLBuffer - (WEBGL2) init from image data in WebGLBuffer\n     *  HTMLImageElement|Image - Inits with content of image. Auto width/height\n     *  HTMLCanvasElement - Inits with contents of canvas. Auto width/height\n     *  HTMLVideoElement - Creates video texture. Auto width/height\n     *\n     * @param {GLint} x - xOffset from where texture to be updated\n     * @param {GLint} y - yOffset from where texture to be updated\n     * @param {GLint} width - width of the sub image to be updated\n     * @param {GLint} height - height of the sub image to be updated\n     * @param {GLint} level - mip level to be updated\n     * @param {GLenum} format - internal format of image data.\n     * @param {GLenum} type\n     *  - format of array (autodetect from type) or\n     *  - (WEBGL2) format of buffer or ArrayBufferView\n     * @param {GLenum} dataFormat - format of image data.\n     * @param {Number} offset - (WEBGL2) offset from start of buffer\n     * @param {GLint} border - must be 0.\n     * @parameters - temporary settings to be applied, can be used to supply pixel store settings.\n     */\n\n  }, {\n    key: \"setSubImageData\",\n    value: function setSubImageData(_ref4) {\n      var _this3 = this;\n\n      var _ref4$target = _ref4.target,\n          target = _ref4$target === void 0 ? this.target : _ref4$target,\n          _ref4$pixels = _ref4.pixels,\n          pixels = _ref4$pixels === void 0 ? null : _ref4$pixels,\n          _ref4$data = _ref4.data,\n          data = _ref4$data === void 0 ? null : _ref4$data,\n          _ref4$x = _ref4.x,\n          x = _ref4$x === void 0 ? 0 : _ref4$x,\n          _ref4$y = _ref4.y,\n          y = _ref4$y === void 0 ? 0 : _ref4$y,\n          _ref4$width = _ref4.width,\n          width = _ref4$width === void 0 ? this.width : _ref4$width,\n          _ref4$height = _ref4.height,\n          height = _ref4$height === void 0 ? this.height : _ref4$height,\n          _ref4$level = _ref4.level,\n          level = _ref4$level === void 0 ? 0 : _ref4$level,\n          _ref4$format = _ref4.format,\n          format = _ref4$format === void 0 ? this.format : _ref4$format,\n          _ref4$type = _ref4.type,\n          type = _ref4$type === void 0 ? this.type : _ref4$type,\n          _ref4$dataFormat = _ref4.dataFormat,\n          dataFormat = _ref4$dataFormat === void 0 ? this.dataFormat : _ref4$dataFormat,\n          _ref4$compressed = _ref4.compressed,\n          compressed = _ref4$compressed === void 0 ? false : _ref4$compressed,\n          _ref4$offset = _ref4.offset,\n          offset = _ref4$offset === void 0 ? 0 : _ref4$offset,\n          _ref4$border = _ref4.border,\n          border = _ref4$border === void 0 ? this.border : _ref4$border,\n          _ref4$parameters = _ref4.parameters,\n          parameters = _ref4$parameters === void 0 ? {} : _ref4$parameters;\n\n      var _this$_deduceParamete3 = this._deduceParameters({\n        format: format,\n        type: type,\n        dataFormat: dataFormat,\n        compressed: compressed,\n        data: data,\n        width: width,\n        height: height\n      });\n\n      type = _this$_deduceParamete3.type;\n      dataFormat = _this$_deduceParamete3.dataFormat;\n      compressed = _this$_deduceParamete3.compressed;\n      width = _this$_deduceParamete3.width;\n      height = _this$_deduceParamete3.height; // pixels variable is  for API compatibility purpose\n\n      if (!data) {\n        data = pixels;\n      } // Support ndarrays\n\n\n      if (data && data.data) {\n        var ndarray = data;\n        data = ndarray.data;\n        width = ndarray.shape[0];\n        height = ndarray.shape[1];\n      } // Support buffers\n\n\n      if (data instanceof _buffer.default) {\n        data = data.handle;\n      }\n\n      this.gl.bindTexture(this.target, this.handle);\n      (0, _contextState.withParameters)(this.gl, parameters, function () {\n        // TODO - x,y parameters\n        if (compressed) {\n          _this3.gl.compressedTexSubImage2D(target, level, x, y, width, height, format, data);\n        } else if (data === null) {\n          _this3.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, null);\n        } else if (ArrayBuffer.isView(data)) {\n          _this3.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data, offset);\n        } else if (data instanceof _webglUtils.WebGLBuffer) {\n          // WebGL2 allows us to create texture directly from a WebGL buffer\n          (0, _webglUtils.assertWebGL2Context)(_this3.gl); // This texImage2D signature uses currently bound GL.PIXEL_UNPACK_BUFFER\n\n          _this3.gl.bindBuffer(35052, data);\n\n          _this3.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, offset);\n\n          _this3.gl.bindBuffer(35052, null);\n        } else if ((0, _webglUtils.isWebGL2)(_this3.gl)) {\n          // Assume data is a browser supported object (ImageData, Canvas, ...)\n          _this3.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data);\n        } else {\n          _this3.gl.texSubImage2D(target, level, x, y, dataFormat, type, data);\n        }\n      });\n      this.gl.bindTexture(this.target, null);\n    }\n    /* eslint-enable max-len, max-statements, complexity */\n\n    /**\n     * Defines a two-dimensional texture image or cube-map texture image with\n     * pixels from the current framebuffer (rather than from client memory).\n     * (gl.copyTexImage2D wrapper)\n     *\n     * Note that binding a texture into a Framebuffer's color buffer and\n     * rendering can be faster.\n     */\n\n  }, {\n    key: \"copyFramebuffer\",\n    value: function copyFramebuffer(_ref5) {\n      var _ref5$target = _ref5.target,\n          target = _ref5$target === void 0 ? this.target : _ref5$target,\n          framebuffer = _ref5.framebuffer,\n          _ref5$x = _ref5.x,\n          x = _ref5$x === void 0 ? 0 : _ref5$x,\n          _ref5$y = _ref5.y,\n          y = _ref5$y === void 0 ? 0 : _ref5$y,\n          width = _ref5.width,\n          height = _ref5.height,\n          _ref5$level = _ref5.level,\n          level = _ref5$level === void 0 ? 0 : _ref5$level,\n          _ref5$internalFormat = _ref5.internalFormat,\n          internalFormat = _ref5$internalFormat === void 0 ? 6408 : _ref5$internalFormat,\n          _ref5$border = _ref5.border,\n          border = _ref5$border === void 0 ? 0 : _ref5$border;\n\n      if (framebuffer) {\n        framebuffer.bind();\n      } // target\n\n\n      this.bind(0);\n      this.gl.copyTexImage2D(this.target, level, internalFormat, x, y, width, height, border);\n      this.unbind();\n\n      if (framebuffer) {\n        framebuffer.unbind();\n      }\n    }\n  }, {\n    key: \"getActiveUnit\",\n    value: function getActiveUnit() {\n      return this.gl.getParameter(34016) - 33984;\n    } // target cannot be modified by bind:\n    // textures are special because when you first bind them to a target,\n    // they get special information. When you first bind a texture as a\n    // GL_TEXTURE_2D, you are actually setting special state in the texture.\n    // You are saying that this texture is a 2D texture.\n    // And it will always be a 2D texture; this state cannot be changed ever.\n    // If you have a texture that was first bound as a GL_TEXTURE_2D,\n    // you must always bind it as a GL_TEXTURE_2D;\n    // attempting to bind it as GL_TEXTURE_1D will give rise to an error\n    // (while run-time).\n\n  }, {\n    key: \"bind\",\n    value: function bind() {\n      var textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;\n\n      if (textureUnit === undefined) {\n        throw new Error('Texture.bind: must specify texture unit');\n      }\n\n      this.textureUnit = textureUnit;\n      this.gl.activeTexture(33984 + textureUnit);\n      this.gl.bindTexture(this.target, this.handle);\n      return textureUnit;\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind() {\n      if (this.textureUnit === undefined) {\n        throw new Error('Texture.unbind: texture unit not specified');\n      }\n\n      this.gl.activeTexture(33984 + this.textureUnit);\n      this.gl.bindTexture(this.target, null);\n      return this.textureUnit;\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_getDataType\",\n    value: function _getDataType(_ref6) {\n      var data = _ref6.data,\n          _ref6$compressed = _ref6.compressed,\n          compressed = _ref6$compressed === void 0 ? false : _ref6$compressed;\n\n      if (compressed) {\n        return {\n          data: data,\n          dataType: 'compressed'\n        };\n      }\n\n      if (data === null) {\n        return {\n          data: data,\n          dataType: 'null'\n        };\n      }\n\n      if (ArrayBuffer.isView(data)) {\n        return {\n          data: data,\n          dataType: 'typed-array'\n        };\n      }\n\n      if (data instanceof _buffer.default) {\n        return {\n          data: data.handle,\n          dataType: 'buffer'\n        };\n      }\n\n      if (data instanceof _webglUtils.WebGLBuffer) {\n        return {\n          data: data,\n          dataType: 'buffer'\n        };\n      } // Assume data is a browser supported object (ImageData, Canvas, ...)\n\n\n      return {\n        data: data,\n        dataType: 'browser-object'\n      };\n    } // Image 3D copies from Typed Array or WebGLBuffer\n\n  }, {\n    key: \"setImage3D\",\n    value: function setImage3D(_ref7) {\n      var _ref7$level = _ref7.level,\n          level = _ref7$level === void 0 ? 0 : _ref7$level,\n          _ref7$internalformat = _ref7.internalformat,\n          internalformat = _ref7$internalformat === void 0 ? 6408 : _ref7$internalformat,\n          width = _ref7.width,\n          height = _ref7.height,\n          _ref7$depth = _ref7.depth,\n          depth = _ref7$depth === void 0 ? 1 : _ref7$depth,\n          _ref7$border = _ref7.border,\n          border = _ref7$border === void 0 ? 0 : _ref7$border,\n          format = _ref7.format,\n          _ref7$type = _ref7.type,\n          type = _ref7$type === void 0 ? 5121 : _ref7$type,\n          _ref7$offset = _ref7.offset,\n          offset = _ref7$offset === void 0 ? 0 : _ref7$offset,\n          pixels = _ref7.pixels;\n\n      if (ArrayBuffer.isView(pixels)) {\n        this.gl.texImage3D(this.target, level, internalformat, width, height, depth, border, format, type, pixels);\n        return this;\n      }\n\n      if (pixels instanceof _buffer.default) {\n        this.gl.bindBuffer(35052, pixels.handle);\n        this.gl.texImage3D(this.target, level, internalformat, width, height, depth, border, format, type, offset);\n      }\n\n      return this;\n    }\n    /* Copied from texture-2d.js\n    // WebGL2\n    setPixels(opts = {}) {\n      const {\n        buffer,\n        width = null,\n        height = null,\n        mipmapLevel = 0,\n        format = GL.RGBA,\n        type = GL.UNSIGNED_BYTE,\n        border = 0\n      } = opts;\n       const {gl} = this;\n       // This signature of texImage2D uses currently bound GL.PIXEL_UNPACK_BUFFER\n      gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, buffer.target);\n      // And as always, we must also bind the texture itself\n      this.bind();\n       gl.texImage2D(gl.TEXTURE_2D,\n        mipmapLevel, format, width, height, border, format, type, buffer.target);\n       this.unbind();\n      gl.bindBuffer(GL.GL.PIXEL_UNPACK_BUFFER, null);\n      return this;\n    }\n     setImageDataFromCompressedBuffer(opts) {\n      const {\n        buffer,\n        // offset = 0,\n        width = null,\n        height = null,\n        mipmapLevel = 0,\n        internalFormat = GL.RGBA,\n        // format = GL.RGBA,\n        // type = GL.UNSIGNED_BYTE,\n        border = 0\n      } = opts;\n       const {gl} = this;\n      gl.compressedTexImage2D(this.target,\n        mipmapLevel, internalFormat, width, height, border, buffer);\n      // gl.compressedTexSubImage2D(target,\n      //   level, xoffset, yoffset, width, height, format, ArrayBufferView? pixels);\n      return this;\n    }\n     copySubImage(opts) {\n      const {\n        // pixels,\n        // offset = 0,\n        // x,\n        // y,\n        // width,\n        // height,\n        // mipmapLevel = 0,\n        // internalFormat = GL.RGBA,\n        // type = GL.UNSIGNED_BYTE,\n        // border = 0\n      } = opts;\n       // if (pixels instanceof ArrayBufferView) {\n      //   gl.texSubImage2D(target, level, x, y, width, height, format, type, pixels);\n      // }\n      // gl.texSubImage2D(target, level, x, y, format, type, ? pixels);\n      // gl.texSubImage2D(target, level, x, y, format, type, HTMLImageElement pixels);\n      // gl.texSubImage2D(target, level, x, y, format, type, HTMLCanvasElement pixels);\n      // gl.texSubImage2D(target, level, x, y, format, type, HTMLVideoElement pixels);\n      // // Additional signature in a WebGL 2 context:\n      // gl.texSubImage2D(target, level, x, y, format, type, GLintptr offset);\n    }\n    */\n    // HELPER METHODS\n\n  }, {\n    key: \"_deduceParameters\",\n    value: function _deduceParameters(opts) {\n      var format = opts.format,\n          data = opts.data;\n      var width = opts.width,\n          height = opts.height,\n          dataFormat = opts.dataFormat,\n          type = opts.type,\n          compressed = opts.compressed; // Deduce format and type from format\n\n      var textureFormat = TEXTURE_FORMATS[format];\n      dataFormat = dataFormat || textureFormat && textureFormat.dataFormat;\n      type = type || textureFormat && textureFormat.types[0]; // Deduce compression from format\n\n      compressed = compressed || textureFormat && textureFormat.compressed;\n\n      var _this$_deduceImageSiz = this._deduceImageSize(data, width, height);\n\n      width = _this$_deduceImageSiz.width;\n      height = _this$_deduceImageSiz.height;\n      return {\n        dataFormat: dataFormat,\n        type: type,\n        compressed: compressed,\n        width: width,\n        height: height,\n        format: format,\n        data: data\n      };\n    }\n    /* global ImageData, HTMLImageElement, HTMLCanvasElement, HTMLVideoElement */\n    // eslint-disable-next-line complexity\n\n  }, {\n    key: \"_deduceImageSize\",\n    value: function _deduceImageSize(data, width, height) {\n      var size;\n\n      if (typeof ImageData !== 'undefined' && data instanceof ImageData) {\n        size = {\n          width: data.width,\n          height: data.height\n        };\n      } else if (typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement) {\n        size = {\n          width: data.naturalWidth,\n          height: data.naturalHeight\n        };\n      } else if (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement) {\n        size = {\n          width: data.width,\n          height: data.height\n        };\n      } else if (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement) {\n        size = {\n          width: data.videoWidth,\n          height: data.videoHeight\n        };\n      } else if (!data) {\n        size = {\n          width: width >= 0 ? width : 1,\n          height: height >= 0 ? height : 1\n        };\n      } else {\n        size = {\n          width: width,\n          height: height\n        };\n      }\n\n      (0, _assert.default)(size, 'Could not deduced texture size');\n      (0, _assert.default)(width === undefined || size.width === width, 'Deduced texture width does not match supplied width');\n      (0, _assert.default)(height === undefined || size.height === height, 'Deduced texture height does not match supplied height');\n      return size;\n    } // RESOURCE METHODS\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createTexture();\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      this.gl.deleteTexture(this.handle);\n    }\n  }, {\n    key: \"_getParameter\",\n    value: function _getParameter(pname) {\n      switch (pname) {\n        case 4096:\n          return this.width;\n\n        case 4097:\n          return this.height;\n\n        default:\n          this.gl.bindTexture(this.target, this.handle);\n          var value = this.gl.getTexParameter(this.target, pname);\n          this.gl.bindTexture(this.target, null);\n          return value;\n      }\n    }\n  }, {\n    key: \"_setParameter\",\n    value: function _setParameter(pname, param) {\n      this.gl.bindTexture(this.target, this.handle); // NOTE: Apply NPOT workaround\n\n      param = this._getNPOTParam(pname, param); // Apparently there are some integer/float conversion rules that made\n      // the WebGL committe expose two parameter setting functions in JavaScript.\n      // For now, pick the float version for parameters specified as GLfloat.\n\n      switch (pname) {\n        case 33082:\n        case 33083:\n          this.gl.texParameterf(this.handle, pname, param);\n          break;\n\n        case 4096:\n        case 4097:\n          (0, _assert.default)(false);\n          break;\n\n        default:\n          this.gl.texParameteri(this.target, pname, param);\n          break;\n      }\n\n      this.gl.bindTexture(this.target, null);\n      return this;\n    }\n  }, {\n    key: \"_isNPOT\",\n    value: function _isNPOT() {\n      return !(0, _webglUtils.isWebGL2)(this.gl) && (!(0, _utils.isPowerOfTwo)(this.width) || !(0, _utils.isPowerOfTwo)(this.height));\n    } // Update default settings which are not supported by NPOT textures.\n\n  }, {\n    key: \"_updateForNPOT\",\n    value: function _updateForNPOT(parameters) {\n      if (parameters[this.gl.TEXTURE_MIN_FILTER] === undefined) {\n        // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_MIN_FILTER to LINEAR`)();\n        parameters[this.gl.TEXTURE_MIN_FILTER] = this.gl.LINEAR;\n      }\n\n      if (parameters[this.gl.TEXTURE_WRAP_S] === undefined) {\n        // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_WRAP_S to CLAMP_TO_EDGE`)();\n        parameters[this.gl.TEXTURE_WRAP_S] = this.gl.CLAMP_TO_EDGE;\n      }\n\n      if (parameters[this.gl.TEXTURE_WRAP_T] === undefined) {\n        // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_WRAP_T to CLAMP_TO_EDGE`)();\n        parameters[this.gl.TEXTURE_WRAP_T] = this.gl.CLAMP_TO_EDGE;\n      }\n    }\n  }, {\n    key: \"_getNPOTParam\",\n    value: function _getNPOTParam(pname, param) {\n      if (this._isNPOT()) {\n        switch (pname) {\n          case 10241:\n            if (NPOT_MIN_FILTERS.indexOf(param) === -1) {\n              // log.warn(`texture: ${this} is Non-Power-Of-Two, forcing TEXTURE_MIN_FILTER to LINEAR`)();\n              param = 9729;\n            }\n\n            break;\n\n          case 10242:\n          case 10243:\n            if (param !== 33071) {\n              // log.warn(`texture: ${this} is Non-Power-Of-Two, ${getKey(this.gl, pname)} to CLAMP_TO_EDGE`)();\n              param = 33071;\n            }\n\n            break;\n\n          default:\n            break;\n        }\n      }\n\n      return param;\n    }\n  }]);\n  return Texture;\n}(_resource.default);\n\nexports.default = Texture;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"./resource\":\"LE4Y\",\"./buffer\":\"IZPG\",\"../webgl-context/context-state\":\"ON2o\",\"../webgl-utils\":\"CTd0\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"aCs7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _texture = _interopRequireDefault(require(\"./texture\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Texture2D =\n/*#__PURE__*/\nfunction (_Texture) {\n  (0, _inherits2.default)(Texture2D, _Texture);\n  (0, _createClass2.default)(Texture2D, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl, opts) {\n      return _texture.default.isSupported(gl, opts);\n    }\n    /**\n     * @classdesc\n     * 2D WebGL Texture\n     * Note: Constructor will initialize your texture.\n     *\n     * @class\n     * @param {WebGLRenderingContext} gl - gl context\n     * @param {Image|ArrayBuffer|null} opts= - named options\n     * @param {Image|ArrayBuffer|null} opts.data= - buffer\n     * @param {GLint} width - width of texture\n     * @param {GLint} height - height of texture\n     */\n\n  }]);\n\n  function Texture2D(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Texture2D);\n    (0, _webglUtils.assertWebGLContext)(gl);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Texture2D).call(this, gl, Object.assign({}, opts, {\n      target: 3553\n    })));\n\n    _this.initialize(opts);\n\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  } // target cannot be modified by bind:\n  // textures are special because when you first bind them to a target,\n  // they get special information. When you first bind a texture as a\n  // GL_TEXTURE_2D, you are actually setting special state in the texture.\n  // You are saying that this texture is a 2D texture.\n  // And it will always be a 2D texture; this state cannot be changed ever.\n  // If you have a texture that was first bound as a GL_TEXTURE_2D,\n  // you must always bind it as a GL_TEXTURE_2D;\n  // attempting to bind it as GL_TEXTURE_1D will give rise to an error\n  // (while run-time).\n\n\n  (0, _createClass2.default)(Texture2D, [{\n    key: \"bind\",\n    value: function bind() {\n      var textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;\n      var gl = this.gl;\n\n      if (textureUnit === undefined) {\n        throw new Error('Texture.bind: must specify texture unit');\n      }\n\n      this.textureUnit = textureUnit;\n      gl.activeTexture(33984 + textureUnit);\n      gl.bindTexture(this.target, this.handle);\n      return textureUnit;\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind() {\n      var gl = this.gl;\n\n      if (this.textureUnit === undefined) {\n        throw new Error('Texture.unbind: texture unit not specified');\n      }\n\n      gl.activeTexture(33984 + this.textureUnit);\n      gl.bindTexture(this.target, null);\n      return this.textureUnit;\n    }\n  }, {\n    key: \"getActiveUnit\",\n    value: function getActiveUnit() {\n      return this.gl.getParameter(34016) - 33984;\n    }\n  }]);\n  return Texture2D;\n}(_texture.default);\n\nexports.default = Texture2D;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./texture\":\"m3Lc\",\"../webgl-utils\":\"CTd0\"}],\"NgPC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _texture = _interopRequireDefault(require(\"./texture\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar FACES = [34069, 34070, 34071, 34072, 34073, 34074];\n\nvar TextureCube =\n/*#__PURE__*/\nfunction (_Texture) {\n  (0, _inherits2.default)(TextureCube, _Texture);\n\n  function TextureCube(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, TextureCube);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TextureCube).call(this, gl, Object.assign({}, opts, {\n      target: 34067\n    })));\n\n    _this.initialize(opts);\n\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  }\n  /* eslint-disable max-len, max-statements */\n\n\n  (0, _createClass2.default)(TextureCube, [{\n    key: \"initialize\",\n    value: function initialize() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _opts$format = opts.format,\n          format = _opts$format === void 0 ? 6408 : _opts$format,\n          _opts$mipmaps = opts.mipmaps,\n          mipmaps = _opts$mipmaps === void 0 ? true : _opts$mipmaps;\n      var _opts$width = opts.width,\n          width = _opts$width === void 0 ? 1 : _opts$width,\n          _opts$height = opts.height,\n          height = _opts$height === void 0 ? 1 : _opts$height,\n          _opts$type = opts.type,\n          type = _opts$type === void 0 ? 5121 : _opts$type,\n          dataFormat = opts.dataFormat; // Deduce width and height based on one of the faces\n\n      var _this$_deduceParamete = this._deduceParameters({\n        format: format,\n        type: type,\n        dataFormat: dataFormat\n      });\n\n      type = _this$_deduceParamete.type;\n      dataFormat = _this$_deduceParamete.dataFormat;\n\n      var _this$_deduceImageSiz = this._deduceImageSize({\n        data: opts[34069],\n        width: width,\n        height: height\n      });\n\n      width = _this$_deduceImageSiz.width;\n      height = _this$_deduceImageSiz.height; // Enforce cube\n\n      (0, _assert.default)(width === height); // Temporarily apply any pixel store paramaters and build textures\n      // withParameters(this.gl, opts, () => {\n      //   for (const face of CUBE_MAP_FACES) {\n      //     this.setImageData({\n      //       target: face,\n      //       data: opts[face],\n      //       width, height, format, type, dataFormat, border, mipmaps\n      //     });\n      //   }\n      // });\n\n      this.setCubeMapImageData(opts); // Called here so that GL.\n      // TODO - should genMipmap() be called on the cubemap or on the faces?\n\n      if (mipmaps) {\n        this.generateMipmap(opts);\n      } // Store opts for accessors\n\n\n      this.opts = opts;\n    }\n  }, {\n    key: \"subImage\",\n    value: function subImage(_ref) {\n      var face = _ref.face,\n          data = _ref.data,\n          _ref$x = _ref.x,\n          x = _ref$x === void 0 ? 0 : _ref$x,\n          _ref$y = _ref.y,\n          y = _ref$y === void 0 ? 0 : _ref$y,\n          _ref$mipmapLevel = _ref.mipmapLevel,\n          mipmapLevel = _ref$mipmapLevel === void 0 ? 0 : _ref$mipmapLevel;\n      return this._subImage({\n        target: face,\n        data: data,\n        x: x,\n        y: y,\n        mipmapLevel: mipmapLevel\n      });\n    }\n    /* eslint-disable max-statements, max-len */\n\n  }, {\n    key: \"setCubeMapImageData\",\n    value: function setCubeMapImageData(_ref2) {\n      var width = _ref2.width,\n          height = _ref2.height,\n          pixels = _ref2.pixels,\n          data = _ref2.data,\n          _ref2$border = _ref2.border,\n          border = _ref2$border === void 0 ? 0 : _ref2$border,\n          _ref2$format = _ref2.format,\n          format = _ref2$format === void 0 ? 6408 : _ref2$format,\n          _ref2$type = _ref2.type,\n          type = _ref2$type === void 0 ? 5121 : _ref2$type,\n          _ref2$generateMipmap = _ref2.generateMipmap,\n          generateMipmap = _ref2$generateMipmap === void 0 ? false : _ref2$generateMipmap;\n      var gl = this.gl;\n      pixels = pixels || data;\n      this.bind();\n\n      if (this.width || this.height) {\n        for (var _i = 0; _i < FACES.length; _i++) {\n          var face = FACES[_i];\n          gl.texImage2D(face, 0, format, width, height, border, format, type, pixels[face]);\n        }\n      } else {\n        for (var _i2 = 0; _i2 < FACES.length; _i2++) {\n          var _face = FACES[_i2];\n          gl.texImage2D(_face, 0, format, format, type, pixels[_face]);\n        }\n      }\n    }\n  }, {\n    key: \"bind\",\n    value: function bind() {\n      var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          index = _ref3.index;\n\n      if (index !== undefined) {\n        this.gl.activeTexture(33984 + index);\n      }\n\n      this.gl.bindTexture(34067, this.handle);\n      return index;\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind() {\n      this.gl.bindTexture(34067, null);\n      return this;\n    }\n  }]);\n  return TextureCube;\n}(_texture.default);\n\nexports.default = TextureCube;\nTextureCube.FACES = FACES;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./texture\":\"m3Lc\",\"../utils/assert\":\"iVaU\"}],\"PSN1\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _contextState = require(\"../webgl-context/context-state\");\n\nvar _texture = _interopRequireDefault(require(\"../webgl/texture\"));\n\nvar _buffer = _interopRequireDefault(require(\"./buffer\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Texture3D =\n/*#__PURE__*/\nfunction (_Texture) {\n  (0, _inherits2.default)(Texture3D, _Texture);\n  (0, _createClass2.default)(Texture3D, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      return (0, _webglUtils.isWebGL2)(gl);\n    }\n    /**\n     * @classdesc\n     * 3D WebGL Texture\n     * Note: Constructor will initialize your texture.\n     *\n     * @class\n     * @param {WebGLRenderingContext} gl - gl context\n     * @param {Image|ArrayBuffer|null} opts= - named options\n     * @param {Image|ArrayBuffer|null} opts.data= - buffer\n     * @param {GLint} width - width of texture\n     * @param {GLint} height - height of texture\n     */\n\n  }]);\n\n  function Texture3D(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Texture3D);\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Texture3D).call(this, gl, Object.assign({}, opts, {\n      target: opts.target || 32879\n    })));\n    _this.width = null;\n    _this.height = null;\n    _this.depth = null;\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n\n    _this.setImageData(opts);\n\n    if (opts.generateMipmap) {\n      _this.generateMipmap();\n    }\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Texture3D, [{\n    key: \"initialize\",\n    value: function initialize() {\n      var _this2 = this;\n\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this.opts = Object.assign({}, this.opts, opts);\n      var _this$opts = this.opts,\n          pixels = _this$opts.pixels,\n          settings = _this$opts.settings;\n\n      if (settings) {\n        (0, _contextState.withParameters)(settings, function () {\n          if (pixels) {\n            _this2.setImage3D(_this2.opts);\n          }\n        });\n        this.setParameters(opts);\n      }\n    } // WebGL2\n    // Image 3D copies from Typed Array or WebGLBuffer\n\n  }, {\n    key: \"setImage3D\",\n    value: function setImage3D(_ref) {\n      var _ref$level = _ref.level,\n          level = _ref$level === void 0 ? 0 : _ref$level,\n          _ref$internalformat = _ref.internalformat,\n          internalformat = _ref$internalformat === void 0 ? 6408 : _ref$internalformat,\n          width = _ref.width,\n          height = _ref.height,\n          _ref$depth = _ref.depth,\n          depth = _ref$depth === void 0 ? 1 : _ref$depth,\n          _ref$border = _ref.border,\n          border = _ref$border === void 0 ? 0 : _ref$border,\n          format = _ref.format,\n          _ref$type = _ref.type,\n          type = _ref$type === void 0 ? 5121 : _ref$type,\n          _ref$offset = _ref.offset,\n          offset = _ref$offset === void 0 ? 0 : _ref$offset,\n          pixels = _ref.pixels;\n\n      if (ArrayBuffer.isView(pixels)) {\n        this.gl.texImage3D(this.target, level, internalformat, width, height, depth, border, format, type, pixels);\n        return;\n      }\n\n      if (pixels instanceof _buffer.default) {\n        this.gl.bindBuffer(35052, pixels.handle);\n        this.gl.texImage3D(this.target, level, internalformat, width, height, depth, border, format, type, offset);\n        this.gl.bindBuffer(35052, pixels.handle);\n      }\n    }\n  }]);\n  return Texture3D;\n}(_texture.default);\n\nexports.default = Texture3D;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"../webgl-utils\":\"CTd0\",\"../webgl-context/context-state\":\"ON2o\",\"../webgl/texture\":\"m3Lc\",\"./buffer\":\"IZPG\"}],\"tLxU\":[function(require,module,exports) {\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n'use strict';\n/* eslint-disable no-unused-vars */\n\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n  if (val === null || val === undefined) {\n    throw new TypeError('Object.assign cannot be called with null or undefined');\n  }\n\n  return Object(val);\n}\n\nfunction shouldUseNative() {\n  try {\n    if (!Object.assign) {\n      return false;\n    } // Detect buggy property enumeration order in older V8 versions.\n    // https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\n\n    var test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\n    test1[5] = 'de';\n\n    if (Object.getOwnPropertyNames(test1)[0] === '5') {\n      return false;\n    } // https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\n\n    var test2 = {};\n\n    for (var i = 0; i < 10; i++) {\n      test2['_' + String.fromCharCode(i)] = i;\n    }\n\n    var order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n      return test2[n];\n    });\n\n    if (order2.join('') !== '0123456789') {\n      return false;\n    } // https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\n\n    var test3 = {};\n    'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n      test3[letter] = letter;\n    });\n\n    if (Object.keys(Object.assign({}, test3)).join('') !== 'abcdefghijklmnopqrst') {\n      return false;\n    }\n\n    return true;\n  } catch (err) {\n    // We don't expect any of the above to throw, but better to be safe.\n    return false;\n  }\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n  var from;\n  var to = toObject(target);\n  var symbols;\n\n  for (var s = 1; s < arguments.length; s++) {\n    from = Object(arguments[s]);\n\n    for (var key in from) {\n      if (hasOwnProperty.call(from, key)) {\n        to[key] = from[key];\n      }\n    }\n\n    if (getOwnPropertySymbols) {\n      symbols = getOwnPropertySymbols(from);\n\n      for (var i = 0; i < symbols.length; i++) {\n        if (propIsEnumerable.call(from, symbols[i])) {\n          to[symbols[i]] = from[symbols[i]];\n        }\n      }\n    }\n  }\n\n  return to;\n};\n},{}],\"fDiL\":[function(require,module,exports) {\nmodule.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n},{}],\"TZBi\":[function(require,module,exports) {\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n},{}],\"p2sn\":[function(require,module,exports) {\nvar global = arguments[3];\nvar process = require(\"process\");\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\nvar formatRegExp = /%[sdj%]/g;\n\nexports.format = function (f) {\n  if (!isString(f)) {\n    var objects = [];\n\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function (x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n\n    switch (x) {\n      case '%s':\n        return String(args[i++]);\n\n      case '%d':\n        return Number(args[i++]);\n\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n\n      default:\n        return x;\n    }\n  });\n\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n\n  return str;\n}; // Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\n\n\nexports.deprecate = function (fn, msg) {\n  // Allow for deprecating things in the process of starting up.\n  if (isUndefined(global.process)) {\n    return function () {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  if (process.noDeprecation === true) {\n    return fn;\n  }\n\n  var warned = false;\n\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n\n      warned = true;\n    }\n\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\nvar debugs = {};\nvar debugEnviron;\n\nexports.debuglog = function (set) {\n  if (isUndefined(debugEnviron)) debugEnviron = undefined || '';\n  set = set.toUpperCase();\n\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n\n      debugs[set] = function () {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function () {};\n    }\n  }\n\n  return debugs[set];\n};\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n\n/* legacy: obj, showHidden, depth, colors*/\n\n\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  }; // legacy...\n\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  } // set default options\n\n\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\n\nexports.inspect = inspect; // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\n\ninspect.colors = {\n  'bold': [1, 22],\n  'italic': [3, 23],\n  'underline': [4, 24],\n  'inverse': [7, 27],\n  'white': [37, 39],\n  'grey': [90, 39],\n  'black': [30, 39],\n  'blue': [34, 39],\n  'cyan': [36, 39],\n  'green': [32, 39],\n  'magenta': [35, 39],\n  'red': [31, 39],\n  'yellow': [33, 39]\n}; // Don't use 'blue' not visible on cmd.exe\n\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str + '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\nfunction arrayToHash(array) {\n  var hash = {};\n  array.forEach(function (val, idx) {\n    hash[val] = true;\n  });\n  return hash;\n}\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special\n  value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check.\n  !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n\n    return ret;\n  } // Primitive types cannot have properties\n\n\n  var primitive = formatPrimitive(ctx, value);\n\n  if (primitive) {\n    return primitive;\n  } // Look up the keys of the object.\n\n\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  } // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n\n\n  if (isError(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  } // Some type of object without properties can be shortcutted.\n\n\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '',\n      array = false,\n      braces = ['{', '}']; // Make Array say that they are Array\n\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  } // Make functions say that they are functions\n\n\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  } // Make RegExps say that they are RegExps\n\n\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  } // Make dates with properties first say the date\n\n\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  } // Make error with message first say the error\n\n\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n  var output;\n\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function (key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n  return reduceToSingleString(output, base, braces);\n}\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value)) return ctx.stylize('undefined', 'undefined');\n\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '').replace(/'/g, \"\\\\'\").replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n\n  if (isNumber(value)) return ctx.stylize('' + value, 'number');\n  if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is \"object\", so special case here.\n\n  if (isNull(value)) return ctx.stylize('null', 'null');\n}\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n\n  keys.forEach(function (key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true));\n    }\n  });\n  return output;\n}\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || {\n    value: value[key]\n  };\n\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function (line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function (line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n\n    name = JSON.stringify('' + key);\n\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\").replace(/\\\\\"/g, '\"').replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function (prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] + (base === '' ? '' : base + '\\n ') + ' ' + output.join(',\\n  ') + ' ' + braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n} // NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\n\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\n\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\n\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\n\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\n\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\n\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\n\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\n\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\n\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error);\n}\n\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || typeof arg === 'symbol' || // ES6 symbol\n  typeof arg === 'undefined';\n}\n\nexports.isPrimitive = isPrimitive;\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34\n\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n} // log is just a thin wrapper to console.log that prepends a timestamp\n\n\nexports.log = function () {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\n\n\nexports.inherits = require('inherits');\n\nexports._extend = function (origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n  var keys = Object.keys(add);\n  var i = keys.length;\n\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n},{\"./support/isBuffer\":\"fDiL\",\"inherits\":\"TZBi\",\"process\":\"FT5O\"}],\"azYr\":[function(require,module,exports) {\nvar global = arguments[3];\n'use strict';\n\nvar objectAssign = require('object-assign');\n\n// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js\n// original notice:\n\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\nfunction compare(a, b) {\n  if (a === b) {\n    return 0;\n  }\n\n  var x = a.length;\n  var y = b.length;\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i];\n      y = b[i];\n      break;\n    }\n  }\n\n  if (x < y) {\n    return -1;\n  }\n  if (y < x) {\n    return 1;\n  }\n  return 0;\n}\nfunction isBuffer(b) {\n  if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {\n    return global.Buffer.isBuffer(b);\n  }\n  return !!(b != null && b._isBuffer);\n}\n\n// based on node assert, original notice:\n// NB: The URL to the CommonJS spec is kept just for tradition.\n//     node-assert has evolved a lot since then, both in API and behavior.\n\n// http://wiki.commonjs.org/wiki/Unit_Testing/1.0\n//\n// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!\n//\n// Originally from narwhal.js (http://narwhaljs.org)\n// Copyright (c) 2009 Thomas Robinson <280north.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar util = require('util/');\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar pSlice = Array.prototype.slice;\nvar functionsHaveNames = (function () {\n  return function foo() {}.name === 'foo';\n}());\nfunction pToString (obj) {\n  return Object.prototype.toString.call(obj);\n}\nfunction isView(arrbuf) {\n  if (isBuffer(arrbuf)) {\n    return false;\n  }\n  if (typeof global.ArrayBuffer !== 'function') {\n    return false;\n  }\n  if (typeof ArrayBuffer.isView === 'function') {\n    return ArrayBuffer.isView(arrbuf);\n  }\n  if (!arrbuf) {\n    return false;\n  }\n  if (arrbuf instanceof DataView) {\n    return true;\n  }\n  if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {\n    return true;\n  }\n  return false;\n}\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n//                             actual: actual,\n//                             expected: expected })\n\nvar regex = /\\s*function\\s+([^\\(\\s]*)\\s*/;\n// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js\nfunction getName(func) {\n  if (!util.isFunction(func)) {\n    return;\n  }\n  if (functionsHaveNames) {\n    return func.name;\n  }\n  var str = func.toString();\n  var match = str.match(regex);\n  return match && match[1];\n}\nassert.AssertionError = function AssertionError(options) {\n  this.name = 'AssertionError';\n  this.actual = options.actual;\n  this.expected = options.expected;\n  this.operator = options.operator;\n  if (options.message) {\n    this.message = options.message;\n    this.generatedMessage = false;\n  } else {\n    this.message = getMessage(this);\n    this.generatedMessage = true;\n  }\n  var stackStartFunction = options.stackStartFunction || fail;\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, stackStartFunction);\n  } else {\n    // non v8 browsers so we can have a stacktrace\n    var err = new Error();\n    if (err.stack) {\n      var out = err.stack;\n\n      // try to strip useless frames\n      var fn_name = getName(stackStartFunction);\n      var idx = out.indexOf('\\n' + fn_name);\n      if (idx >= 0) {\n        // once we have located the function frame\n        // we need to strip out everything before it (and its line)\n        var next_line = out.indexOf('\\n', idx + 1);\n        out = out.substring(next_line + 1);\n      }\n\n      this.stack = out;\n    }\n  }\n};\n\n// assert.AssertionError instanceof Error\nutil.inherits(assert.AssertionError, Error);\n\nfunction truncate(s, n) {\n  if (typeof s === 'string') {\n    return s.length < n ? s : s.slice(0, n);\n  } else {\n    return s;\n  }\n}\nfunction inspect(something) {\n  if (functionsHaveNames || !util.isFunction(something)) {\n    return util.inspect(something);\n  }\n  var rawname = getName(something);\n  var name = rawname ? ': ' + rawname : '';\n  return '[Function' +  name + ']';\n}\nfunction getMessage(self) {\n  return truncate(inspect(self.actual), 128) + ' ' +\n         self.operator + ' ' +\n         truncate(inspect(self.expected), 128);\n}\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided.  All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n  throw new assert.AssertionError({\n    message: message,\n    actual: actual,\n    expected: expected,\n    operator: operator,\n    stackStartFunction: stackStartFunction\n  });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n  if (!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\nassert.equal = function equal(actual, expected, message) {\n  if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\nassert.notEqual = function notEqual(actual, expected, message) {\n  if (actual == expected) {\n    fail(actual, expected, message, '!=', assert.notEqual);\n  }\n};\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected, false)) {\n    fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n  }\n};\n\nassert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected, true)) {\n    fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);\n  }\n};\n\nfunction _deepEqual(actual, expected, strict, memos) {\n  // 7.1. All identical values are equivalent, as determined by ===.\n  if (actual === expected) {\n    return true;\n  } else if (isBuffer(actual) && isBuffer(expected)) {\n    return compare(actual, expected) === 0;\n\n  // 7.2. If the expected value is a Date object, the actual value is\n  // equivalent if it is also a Date object that refers to the same time.\n  } else if (util.isDate(actual) && util.isDate(expected)) {\n    return actual.getTime() === expected.getTime();\n\n  // 7.3 If the expected value is a RegExp object, the actual value is\n  // equivalent if it is also a RegExp object with the same source and\n  // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n  } else if (util.isRegExp(actual) && util.isRegExp(expected)) {\n    return actual.source === expected.source &&\n           actual.global === expected.global &&\n           actual.multiline === expected.multiline &&\n           actual.lastIndex === expected.lastIndex &&\n           actual.ignoreCase === expected.ignoreCase;\n\n  // 7.4. Other pairs that do not both pass typeof value == 'object',\n  // equivalence is determined by ==.\n  } else if ((actual === null || typeof actual !== 'object') &&\n             (expected === null || typeof expected !== 'object')) {\n    return strict ? actual === expected : actual == expected;\n\n  // If both values are instances of typed arrays, wrap their underlying\n  // ArrayBuffers in a Buffer each to increase performance\n  // This optimization requires the arrays to have the same type as checked by\n  // Object.prototype.toString (aka pToString). Never perform binary\n  // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their\n  // bit patterns are not identical.\n  } else if (isView(actual) && isView(expected) &&\n             pToString(actual) === pToString(expected) &&\n             !(actual instanceof Float32Array ||\n               actual instanceof Float64Array)) {\n    return compare(new Uint8Array(actual.buffer),\n                   new Uint8Array(expected.buffer)) === 0;\n\n  // 7.5 For all other Object pairs, including Array objects, equivalence is\n  // determined by having the same number of owned properties (as verified\n  // with Object.prototype.hasOwnProperty.call), the same set of keys\n  // (although not necessarily the same order), equivalent values for every\n  // corresponding key, and an identical 'prototype' property. Note: this\n  // accounts for both named and indexed properties on Arrays.\n  } else if (isBuffer(actual) !== isBuffer(expected)) {\n    return false;\n  } else {\n    memos = memos || {actual: [], expected: []};\n\n    var actualIndex = memos.actual.indexOf(actual);\n    if (actualIndex !== -1) {\n      if (actualIndex === memos.expected.indexOf(expected)) {\n        return true;\n      }\n    }\n\n    memos.actual.push(actual);\n    memos.expected.push(expected);\n\n    return objEquiv(actual, expected, strict, memos);\n  }\n}\n\nfunction isArguments(object) {\n  return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b, strict, actualVisitedObjects) {\n  if (a === null || a === undefined || b === null || b === undefined)\n    return false;\n  // if one is a primitive, the other must be same\n  if (util.isPrimitive(a) || util.isPrimitive(b))\n    return a === b;\n  if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))\n    return false;\n  var aIsArgs = isArguments(a);\n  var bIsArgs = isArguments(b);\n  if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))\n    return false;\n  if (aIsArgs) {\n    a = pSlice.call(a);\n    b = pSlice.call(b);\n    return _deepEqual(a, b, strict);\n  }\n  var ka = objectKeys(a);\n  var kb = objectKeys(b);\n  var key, i;\n  // having the same number of owned properties (keys incorporates\n  // hasOwnProperty)\n  if (ka.length !== kb.length)\n    return false;\n  //the same set of keys (although not necessarily the same order),\n  ka.sort();\n  kb.sort();\n  //~~~cheap key test\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] !== kb[i])\n      return false;\n  }\n  //equivalent values for every corresponding key, and\n  //~~~possibly expensive deep test\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))\n      return false;\n  }\n  return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected, false)) {\n    fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n  }\n};\n\nassert.notDeepStrictEqual = notDeepStrictEqual;\nfunction notDeepStrictEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected, true)) {\n    fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);\n  }\n}\n\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n  if (actual !== expected) {\n    fail(actual, expected, message, '===', assert.strictEqual);\n  }\n};\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==.  assert.notStrictEqual(actual, expected, message_opt);\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n  if (actual === expected) {\n    fail(actual, expected, message, '!==', assert.notStrictEqual);\n  }\n};\n\nfunction expectedException(actual, expected) {\n  if (!actual || !expected) {\n    return false;\n  }\n\n  if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n    return expected.test(actual);\n  }\n\n  try {\n    if (actual instanceof expected) {\n      return true;\n    }\n  } catch (e) {\n    // Ignore.  The instanceof check doesn't work for arrow functions.\n  }\n\n  if (Error.isPrototypeOf(expected)) {\n    return false;\n  }\n\n  return expected.call({}, actual) === true;\n}\n\nfunction _tryBlock(block) {\n  var error;\n  try {\n    block();\n  } catch (e) {\n    error = e;\n  }\n  return error;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n  var actual;\n\n  if (typeof block !== 'function') {\n    throw new TypeError('\"block\" argument must be a function');\n  }\n\n  if (typeof expected === 'string') {\n    message = expected;\n    expected = null;\n  }\n\n  actual = _tryBlock(block);\n\n  message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n            (message ? ' ' + message : '.');\n\n  if (shouldThrow && !actual) {\n    fail(actual, expected, 'Missing expected exception' + message);\n  }\n\n  var userProvidedMessage = typeof message === 'string';\n  var isUnwantedException = !shouldThrow && util.isError(actual);\n  var isUnexpectedException = !shouldThrow && actual && !expected;\n\n  if ((isUnwantedException &&\n      userProvidedMessage &&\n      expectedException(actual, expected)) ||\n      isUnexpectedException) {\n    fail(actual, expected, 'Got unwanted exception' + message);\n  }\n\n  if ((shouldThrow && actual && expected &&\n      !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n    throw actual;\n  }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n  _throws(true, block, error, message);\n};\n\n// EXTENSION! This is annoying to write outside this module.\nassert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {\n  _throws(false, block, error, message);\n};\n\nassert.ifError = function(err) { if (err) throw err; };\n\n// Expose a strict only variant of assert\nfunction strict(value, message) {\n  if (!value) fail(value, true, message, '==', strict);\n}\nassert.strict = objectAssign(strict, assert, {\n  equal: assert.strictEqual,\n  deepEqual: assert.deepStrictEqual,\n  notEqual: assert.notStrictEqual,\n  notDeepEqual: assert.notDeepStrictEqual\n});\nassert.strict.strict = assert.strict;\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    if (hasOwn.call(obj, key)) keys.push(key);\n  }\n  return keys;\n};\n\n},{\"object-assign\":\"tLxU\",\"util/\":\"p2sn\"}],\"i2kP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cloneTextureFrom = cloneTextureFrom;\n\nvar _texture2d = _interopRequireDefault(require(\"../webgl/texture-2d\"));\n\nvar _textureCube = _interopRequireDefault(require(\"../webgl/texture-cube\"));\n\nvar _texture3d = _interopRequireDefault(require(\"../webgl/texture-3d\"));\n\nvar _assert = _interopRequireDefault(require(\"assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Clone a new texture object from a reference texture object.\nfunction cloneTextureFrom(refTexture, overrides) {\n  (0, _assert.default)(refTexture instanceof _texture2d.default || refTexture instanceof _textureCube.default || refTexture instanceof _texture3d.default);\n  var TextureType = refTexture.constructor;\n  var gl = refTexture.gl,\n      width = refTexture.width,\n      height = refTexture.height,\n      format = refTexture.format,\n      type = refTexture.type,\n      dataFormat = refTexture.dataFormat,\n      border = refTexture.border,\n      mipmaps = refTexture.mipmaps;\n  var textureOptions = Object.assign({\n    width: width,\n    height: height,\n    format: format,\n    type: type,\n    dataFormat: dataFormat,\n    border: border,\n    mipmaps: mipmaps\n  }, overrides); // TODO: move this to `Texture` class as instance method and use this.constructor\n\n  return new TextureType(gl, textureOptions);\n}\n},{\"../webgl/texture-2d\":\"aCs7\",\"../webgl/texture-cube\":\"NgPC\",\"../webgl/texture-3d\":\"PSN1\",\"assert\":\"azYr\"}],\"wSyR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createHeadlessContext = createHeadlessContext;\n\nvar _webglTypes = require(\"../webgl-utils/webgl-types\");\n\nvar ERR_HEADLESSGL_NOT_AVAILABLE = 'Failed to create WebGL context in Node.js, headless gl not available';\nvar ERR_HEADLESSGL_FAILED = 'Failed to create WebGL context in Node.js, headless gl returned null'; // Create headless gl context (for running under Node.js)\n\nfunction createHeadlessContext(_ref) {\n  var width = _ref.width,\n      height = _ref.height,\n      opts = _ref.opts,\n      onError = _ref.onError;\n  var webgl1 = opts.webgl1,\n      webgl2 = opts.webgl2;\n\n  if (webgl2 && !webgl1) {\n    return onError('headless-gl does not support WebGL2');\n  }\n\n  if (!_webglTypes.headlessGL) {\n    return onError(ERR_HEADLESSGL_NOT_AVAILABLE);\n  }\n\n  var gl = (0, _webglTypes.headlessGL)(width, height, opts);\n\n  if (!gl) {\n    return onError(ERR_HEADLESSGL_FAILED);\n  }\n\n  return gl;\n}\n},{\"../webgl-utils/webgl-types\":\"bFVP\"}],\"osjH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPageLoadPromise = getPageLoadPromise;\nexports.createCanvas = createCanvas;\nexports.getCanvas = getCanvas;\n\nvar _utils = require(\"../utils\");\n\n// Resizing a webgl canvas\n\n/* global window, document */\nvar isPage = _utils.isBrowser && typeof document !== 'undefined';\nvar isPageLoaded = isPage && document.readyState === 'complete';\nvar pageLoadPromise;\n/**\n * Returns a promise that resolves when the page is loaded\n * at this point the DOM can be manipulated, and e.g. a new canvas can be inserted\n * @return {Promise} - resolves when the page is loaded\n */\n\nfunction getPageLoadPromise() {\n  if (!pageLoadPromise) {\n    pageLoadPromise = isPage ? new Promise(function (resolve, reject) {\n      if (isPage && document.readyState === 'complete') {\n        isPageLoaded = true;\n        resolve(document);\n        return;\n      }\n\n      window.onload = function () {\n        isPageLoaded = true;\n        resolve(document);\n      };\n    }) : Promise.resolve({});\n  }\n\n  return pageLoadPromise;\n}\n/**\n * Create a canvas\n * @param {Number} width - set to 100%\n * @param {Number} height - set to 100%\n */\n\n\nfunction createCanvas(_ref) {\n  var _ref$width = _ref.width,\n      width = _ref$width === void 0 ? 800 : _ref$width,\n      _ref$height = _ref.height,\n      height = _ref$height === void 0 ? 600 : _ref$height,\n      _ref$id = _ref.id,\n      id = _ref$id === void 0 ? 'gl-canvas' : _ref$id,\n      _ref$insert = _ref.insert,\n      insert = _ref$insert === void 0 ? true : _ref$insert;\n  var canvas = document.createElement('canvas');\n  canvas.id = id;\n  canvas.style.width = Number.isFinite(width) ? \"\".concat(width, \"px\") : '100%';\n  canvas.style.height = Number.isFinite(height) ? \"\".concat(height, \"px\") : '100%'; // add the canvas to the body element once the page has loaded\n\n  if (insert) {\n    var body = document.body;\n    body.insertBefore(canvas, body.firstChild); // getPageLoadPromise().then(document => {});\n  }\n\n  return canvas;\n}\n\nfunction getCanvas(_ref2) {\n  var canvas = _ref2.canvas,\n      width = _ref2.width,\n      height = _ref2.height,\n      _ref2$onError = _ref2.onError,\n      onError = _ref2$onError === void 0 ? function () {} : _ref2$onError;\n  var targetCanvas;\n\n  if (typeof canvas === 'string') {\n    if (!isPageLoaded) {\n      onError(\"createGLContext called on canvas '\".concat(canvas, \"' before page was loaded\"));\n    }\n\n    targetCanvas = document.getElementById(canvas);\n  } else if (canvas) {\n    targetCanvas = canvas;\n  } else {\n    targetCanvas = createCanvas({\n      id: 'lumagl-canvas',\n      width: width,\n      height: height,\n      onError: onError\n    });\n  }\n\n  return targetCanvas;\n}\n},{\"../utils\":\"B7AM\"}],\"apVN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createBrowserContext = createBrowserContext;\n\n/**\n * Create a WebGL context for a canvas\n * Note calling this multiple time on the same canvas does return the same context\n */\nfunction createBrowserContext(_ref) {\n  var canvas = _ref.canvas,\n      _ref$opts = _ref.opts,\n      opts = _ref$opts === void 0 ? {} : _ref$opts,\n      _ref$onError = _ref.onError,\n      onError = _ref$onError === void 0 ? function (message) {\n    return null;\n  } : _ref$onError; // Try to extract any extra information about why context creation failed\n\n  function onContextCreationError(error) {\n    onError(\"WebGL context: \".concat(error.statusMessage || 'Unknown error'));\n  }\n\n  canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);\n  var _opts$webgl = opts.webgl1,\n      webgl1 = _opts$webgl === void 0 ? true : _opts$webgl,\n      _opts$webgl2 = opts.webgl2,\n      webgl2 = _opts$webgl2 === void 0 ? true : _opts$webgl2;\n  var gl = null; // Prefer webgl2 over webgl1, prefer conformant over experimental\n\n  if (webgl2) {\n    gl = gl || canvas.getContext('webgl2', opts);\n    gl = gl || canvas.getContext('experimental-webgl2', opts);\n  }\n\n  if (webgl1) {\n    gl = gl || canvas.getContext('webgl', opts);\n    gl = gl || canvas.getContext('experimental-webgl', opts);\n  }\n\n  canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);\n\n  if (!gl) {\n    return onError(\"Failed to create \".concat(webgl2 && !webgl1 ? 'WebGL2' : 'WebGL', \" context\"));\n  }\n\n  return gl;\n}\n},{}],\"GOH4\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.enableDebug = enableDebug;\nexports.makeDebugContext = makeDebugContext;\nexports.getRealContext = getRealContext;\nexports.getDebugContext = getDebugContext;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _globals = require(\"../utils/globals\");\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Depends on Khronos Debug support module being imported via \"luma.gl/debug\"\n// Helper to get shared context data\nfunction getContextData(gl) {\n  gl.luma = gl.luma || {};\n  return gl.luma;\n} // Enable or disable debug checks in debug contexts\n// Non-debug contexts do not have checks (to ensure performance)\n// Turning off debug for debug contexts removes most of the performance penalty\n\n\nfunction enableDebug(debug) {\n  _utils.log.debug = debug;\n} // Returns (a potentially new) context with debug instrumentation turned off or on.\n// Note that this actually returns a new context\n\n\nfunction makeDebugContext(gl) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$debug = _ref.debug,\n      debug = _ref$debug === void 0 ? true : _ref$debug;\n\n  if (gl === null) {\n    // Return to ensure we don't create a context in this case.\n    return null;\n  }\n\n  return debug ? getDebugContext(gl) : getRealContext(gl);\n} // Returns the real context from either of the real/debug contexts\n\n\nfunction getRealContext(gl) {\n  if (gl === null) {\n    // Return to ensure we don't create a context in this case.\n    return null;\n  }\n\n  var data = getContextData(gl); // If the context has a realContext member, it is a debug context so return the realContext\n\n  return data.realContext ? data.realContext : gl;\n} // Returns the debug context from either of the real/debug contexts\n\n\nfunction getDebugContext(gl) {\n  if (gl === null) {\n    // Return to ensure we don't create a context in this case.\n    return null;\n  }\n\n  if (!_globals.global.WebGLDebug) {\n    _utils.log.warn('WebGL debug mode not activated. import \"luma.gl/debug\" to enable.')();\n\n    return gl;\n  }\n\n  var data = getContextData(gl); // If this *is* a debug context, return itself\n\n  if (data.realContext) {\n    return gl;\n  } // If this already has a debug context, return it.\n\n\n  if (data.debugContext) {\n    return data.debugContext;\n  } // Create a new debug context\n\n\n  var WebGLDebugContext = function WebGLDebugContext() {\n    (0, _classCallCheck2.default)(this, WebGLDebugContext);\n  };\n\n  var debugContext = _globals.global.WebGLDebug.makeDebugContext(gl, onGLError, onValidateGLFunc);\n\n  Object.assign(WebGLDebugContext.prototype, debugContext); // Store the debug context\n\n  data.debugContext = debugContext;\n  debugContext.debug = true;\n  debugContext.gl = gl;\n\n  _utils.log.info('debug context actived.'); // Return it\n\n\n  return debugContext;\n} // DEBUG TRACING\n\n\nfunction getFunctionString(functionName, functionArgs) {\n  var args = _globals.global.WebGLDebug.glFunctionArgsToString(functionName, functionArgs);\n\n  args = \"\".concat(args.slice(0, 100)).concat(args.length > 100 ? '...' : '');\n  return \"gl.\".concat(functionName, \"(\").concat(args, \")\");\n}\n\nfunction onGLError(err, functionName, args) {\n  var errorMessage = _globals.global.WebGLDebug.glEnumToString(err);\n\n  var functionArgs = _globals.global.WebGLDebug.glFunctionArgsToString(functionName, args);\n\n  var message = \"\".concat(errorMessage, \" in gl.\").concat(functionName, \"(\").concat(functionArgs, \")\");\n\n  if (_utils.log.throw) {\n    throw new Error(message);\n  } else {\n    _utils.log.error(message)();\n\n    debugger; // eslint-disable-line\n  }\n} // Don't generate function string until it is needed\n\n\nfunction onValidateGLFunc(functionName, functionArgs) {\n  var functionString;\n\n  if (_utils.log.priority >= 4) {\n    functionString = getFunctionString(functionName, functionArgs);\n\n    _utils.log.log(4, functionString)();\n  }\n\n  if (_utils.log.break) {\n    functionString = functionString || getFunctionString(functionName, functionArgs);\n\n    var isBreakpoint = _utils.log.break && _utils.log.break.every(function (breakOn) {\n      return functionString.indexOf(breakOn) !== -1;\n    });\n\n    if (isBreakpoint) {\n      debugger; // eslint-disable-line\n    }\n  }\n\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = functionArgs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var arg = _step.value;\n\n      if (arg === undefined) {\n        functionString = functionString || getFunctionString(functionName, functionArgs);\n\n        if (_utils.log.throw) {\n          throw new Error(\"Undefined argument: \".concat(functionString));\n        } else {\n          _utils.log.error(\"Undefined argument: \".concat(functionString));\n\n          debugger; // eslint-disable-line\n        }\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n}\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"../utils/globals\":\"zU4q\",\"../utils\":\"B7AM\"}],\"aTuQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getContextLimits = getContextLimits;\nexports.getGLContextInfo = getGLContextInfo;\nexports.getGLContextInfo2 = getGLContextInfo2;\nexports.getContextInfo = getContextInfo;\nexports.glGetDebugInfo = glGetDebugInfo;\nexports.TEST_EXPORTS = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _WEBGL_LIMITS;\n/* eslint-disable no-inline-comments, max-len */\n\n\nvar WEBGL_LIMITS = (_WEBGL_LIMITS = {}, (0, _defineProperty2.default)(_WEBGL_LIMITS, 33902, {\n  gl1: new Float32Array([1, 1])\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 33901, {\n  gl1: new Float32Array([1, 1])\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 3379, {\n  gl1: 64,\n  gl2: 2048\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 34076, {\n  gl1: 16\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 34930, {\n  gl1: 8\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35661, {\n  gl1: 8\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35660, {\n  gl1: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 34024, {\n  gl1: 1\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 36348, {\n  gl1: 8\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 34921, {\n  gl1: 8\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 36347, {\n  gl1: 128\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 36349, {\n  gl1: 16\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 3386, {\n  gl1: new Int32Array([0, 0])\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 32883, {\n  gl1: 0,\n  gl2: 256\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35071, {\n  gl1: 0,\n  gl2: 256\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 37447, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 36063, {\n  gl1: 0,\n  gl2: 4\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35379, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35374, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35377, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 34852, {\n  gl1: 0,\n  gl2: 4\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 36203, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 33001, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 33000, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 37157, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35373, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35657, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 36183, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 37137, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 34045, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35978, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35979, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35968, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35376, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35375, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35659, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 37154, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35371, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35658, {\n  gl1: 0,\n  gl2: 0\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35076, {\n  gl1: 0,\n  gl2: -8,\n  negative: true\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35077, {\n  gl1: 0,\n  gl2: 7\n}), (0, _defineProperty2.default)(_WEBGL_LIMITS, 35380, {\n  gl1: 0,\n  gl2: 0 // GLint\n\n}), _WEBGL_LIMITS);\n\nfunction getContextLimits(gl) {\n  gl.luma = gl.luma || {};\n\n  if (!gl.luma.limits) {\n    gl.luma.limits = {};\n    gl.luma.webgl1MinLimits = {};\n    gl.luma.webgl2MinLimits = {};\n    var isWebgl2 = (0, _webglUtils.isWebGL2)(gl); // WEBGL limits\n\n    for (var parameter in WEBGL_LIMITS) {\n      var limit = WEBGL_LIMITS[parameter];\n      var webgl1MinLimit = limit.gl1;\n      var webgl2MinLimit = 'gl2' in limit ? limit.gl2 : limit.gl1;\n      var minLimit = isWebgl2 ? webgl2MinLimit : webgl1MinLimit; // Check if we can query for this limit\n\n      var limitNotAvailable = 'gl2' in limit && !isWebgl2 || 'extension' in limit && !gl.getExtension(limit.extension);\n      var value = limitNotAvailable ? minLimit : gl.getParameter(parameter);\n      gl.luma.limits[parameter] = value;\n      gl.luma.webgl1MinLimits[parameter] = webgl1MinLimit;\n      gl.luma.webgl2MinLimits[parameter] = webgl2MinLimit;\n    }\n  }\n\n  return gl.luma.limits;\n}\n\nfunction getGLContextInfo(gl) {\n  gl.luma = gl.luma || {};\n\n  if (!gl.luma.info) {\n    var _gl$luma$info;\n\n    var info = gl.getExtension('WEBGL_debug_renderer_info');\n    gl.luma.info = (_gl$luma$info = {}, (0, _defineProperty2.default)(_gl$luma$info, 7936, gl.getParameter(7936)), (0, _defineProperty2.default)(_gl$luma$info, 7937, gl.getParameter(7937)), (0, _defineProperty2.default)(_gl$luma$info, 37445, gl.getParameter(info && info.UNMASKED_VENDOR_WEBGL || 7936)), (0, _defineProperty2.default)(_gl$luma$info, 37446, gl.getParameter(info && info.UNMASKED_RENDERER_WEBGL || 7937)), (0, _defineProperty2.default)(_gl$luma$info, 7938, gl.getParameter(7938)), (0, _defineProperty2.default)(_gl$luma$info, 35724, gl.getParameter(35724)), _gl$luma$info);\n  }\n\n  return gl.luma.info;\n}\n\nvar GL_UNMASKED_VENDOR_WEBGL = 0x9245; // vendor string of the graphics driver.\n\nvar GL_UNMASKED_RENDERER_WEBGL = 0x9246; // renderer string of the graphics driver.\n\nfunction getGLContextInfo2(gl) {\n  var vendorMasked = gl.getParameter(7936);\n  var rendererMasked = gl.getParameter(7937);\n  var ext = gl.getExtension('WEBGL_debug_renderer_info');\n  var vendorUnmasked = ext && gl.getParameter(ext.UNMASKED_VENDOR_WEBGL || 7936);\n  var rendererUnmasked = ext && gl.getParameter(ext.UNMASKED_RENDERER_WEBGL || 7937);\n  return {\n    vendor: vendorUnmasked || vendorMasked,\n    renderer: rendererUnmasked || rendererMasked,\n    vendorMasked: vendorMasked,\n    rendererMasked: rendererMasked,\n    version: gl.getParameter(7938),\n    shadingLanguageVersion: gl.getParameter(35724)\n  };\n}\n\nfunction getContextInfo(gl) {\n  var limits = getContextLimits(gl);\n  var info = getGLContextInfo(gl);\n  return {\n    // basic information\n    vendor: info[GL_UNMASKED_VENDOR_WEBGL] || info[7936],\n    renderer: info[GL_UNMASKED_RENDERER_WEBGL] || info[7937],\n    version: info[7938],\n    shadingLanguageVersion: info[35724],\n    // info, caps and limits\n    info: info,\n    limits: limits,\n    webgl1MinLimits: gl.luma.webgl1MinLimits,\n    webgl2MinLimits: gl.luma.webgl2MinLimits\n  };\n} // DEBUG INFO\n\n/**\n * Provides strings identifying the GPU vendor and driver.\n * https://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/\n * @param {WebGLRenderingContext} gl - context\n * @return {Object} - 'vendor' and 'renderer' string fields.\n */\n\n\nfunction glGetDebugInfo(gl) {\n  return getGLContextInfo2(gl); // const info = gl.getExtension('WEBGL_debug_renderer_info');\n  // // We can't determine if 'WEBGL_debug_renderer_info' is supported by\n  // // checking whether info is null here. Firefox doesn't follow the\n  // // specs by returning null for unsupported extension. Instead,\n  // // it returns an object without GL_UNMASKED_VENDOR_WEBGL and GL_UNMASKED_RENDERER_WEBGL.\n  // return {\n  //   vendor: (info && info.UNMASKED_VENDOR_WEBGL) ?\n  //     gl.getParameter(info.UNMASKED_VENDOR_WEBGL) : 'unknown',\n  //   renderer: (info && info.UNMASKED_RENDERER_WEBGL) ?\n  //     gl.getParameter(info.UNMASKED_RENDERER_WEBGL) : 'unknown'\n  // };\n}\n\nvar TEST_EXPORTS = {\n  WEBGL_LIMITS: WEBGL_LIMITS\n};\nexports.TEST_EXPORTS = TEST_EXPORTS;\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"../webgl-utils\":\"CTd0\"}],\"Gm1D\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// Internal class that helps \"asynchronous WebGL query objects\" manage\n// pending requests (e.g. for EXT_disjoint_timer_query and WebGL2 queries)\n//\n// Creates and manages promises for the queries.\n// Tracks pending queries enabling polling.\n// Tracks pending queries enabling invalidation.\n// Provides some standard error messages.\n//\n// Remarks:\n// - Maintains a minimal list of pending queries only to minimize GC impact\n// - Exported as a singleton class instance.\nvar ERR_DELETED = 'Query was deleted before result was available';\nvar ERR_CANCEL = 'Query was canceled before result was available';\n\nvar noop = function noop(x) {\n  return x;\n};\n\nvar QueryManager =\n/*#__PURE__*/\nfunction () {\n  function QueryManager() {\n    (0, _classCallCheck2.default)(this, QueryManager);\n    this.pendingQueries = new Set();\n    this.invalidQueryType = null;\n    this.invalidErrorMessage = '';\n\n    this.checkInvalid = function () {\n      return false;\n    };\n  } // API THAT SHOULD BE EXPOSED TO APPLICATION\n  // Checks invalidation callback and then all pending queries for completion\n  // Should only be called once per tick\n\n\n  (0, _createClass2.default)(QueryManager, [{\n    key: \"poll\",\n    value: function poll(gl) {\n      this.cancelInvalidQueries(gl); // Now check availability of results and resolve promises as appropriate\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = this.pendingQueries.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var query = _step.value;\n          var resultAvailable = query.isResultAvailable();\n\n          if (resultAvailable) {\n            var result = query.getResult();\n            this.resolveQuery(query, result);\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    } // API FOR MANAGED QUERY CLASSES\n    // Registers query invalidation method - used to detect disjoint timer queries\n\n  }, {\n    key: \"setInvalidator\",\n    value: function setInvalidator(_ref) {\n      var queryType = _ref.queryType,\n          errorMessage = _ref.errorMessage,\n          checkInvalid = _ref.checkInvalid;\n      this.invalidQueryType = queryType;\n      this.invalidErrorMessage = errorMessage;\n      this.checkInvalid = checkInvalid;\n    } // Starts a query, sets up a new promise\n\n  }, {\n    key: \"beginQuery\",\n    value: function beginQuery(query) {\n      var onComplete = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : noop;\n      var onError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : noop; // Make sure disjoint state is cleared, so that this query starts fresh\n      // Cancel other queries if needed\n\n      this.cancelInvalidQueries(query.gl); // Cancel current promise - noop if already resolved or rejected\n\n      this.cancelQuery(query); // Create a new promise with attached resolve and reject methods\n\n      var resolvers = {};\n      query.promise = new Promise(function (resolve, reject) {\n        resolvers.resolve = resolve;\n        resolvers.reject = reject;\n      });\n      Object.assign(query.promise, resolvers); // Add this query to the pending queries\n\n      this.pendingQueries.add(query); // Register the callbacks\n\n      return query.promise.then(onComplete).catch(onError);\n    } // Resolves a query with a result\n\n  }, {\n    key: \"resolveQuery\",\n    value: function resolveQuery(query, result) {\n      this.pendingQueries.delete(query);\n      query.promise.resolve(result);\n    } // Rejects the promise\n\n  }, {\n    key: \"rejectQuery\",\n    value: function rejectQuery(query, errorMessage) {\n      this.pendingQueries.delete(query);\n\n      if (query.promise) {\n        query.promise.reject(new Error(errorMessage));\n      }\n    } // Rejects promise with standard message for Query.delete()\n\n  }, {\n    key: \"deleteQuery\",\n    value: function deleteQuery(query) {\n      return this.rejectQuery(query, ERR_DELETED);\n    } // Rejects promise with standard message for Query.cancel()\n\n  }, {\n    key: \"cancelQuery\",\n    value: function cancelQuery(query) {\n      return this.rejectQuery(query, ERR_CANCEL);\n    } // Rejects promise with registered message for invalidation\n\n  }, {\n    key: \"invalidateQuery\",\n    value: function invalidateQuery(query) {\n      if (query instanceof this.invalidQueryType) {\n        this.rejectQuery(query, this.invalidErrorMessage);\n      }\n    } // Checks all queries to see if need to be invalidated\n\n  }, {\n    key: \"cancelInvalidQueries\",\n    value: function cancelInvalidQueries(gl) {\n      // We assume that we can cancel queries for all context.\n      // Should be OK since this is used to check for \"disjoint\" GPU state\n      if (this.checkInvalid(gl)) {\n        var _iteratorNormalCompletion2 = true;\n        var _didIteratorError2 = false;\n        var _iteratorError2 = undefined;\n\n        try {\n          for (var _iterator2 = this.pendingQueries.values()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n            var query = _step2.value;\n            this.invalidateQuery(query);\n          }\n        } catch (err) {\n          _didIteratorError2 = true;\n          _iteratorError2 = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n              _iterator2.return();\n            }\n          } finally {\n            if (_didIteratorError2) {\n              throw _iteratorError2;\n            }\n          }\n        }\n      }\n    }\n  }]);\n  return QueryManager;\n}();\n\nvar _default = new QueryManager();\n\nexports.default = _default;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\"}],\"LFBw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isWebGL = isWebGL;\nexports.isWebGL2 = isWebGL2;\nexports.assertWebGLContext = assertWebGLContext;\nexports.assertWebGL2Context = assertWebGL2Context;\nexports.setContextDefaults = setContextDefaults;\nexports.createGLContext = createGLContext;\nexports.destroyGLContext = destroyGLContext;\nexports.resizeGLContext = resizeGLContext;\nexports.pollGLContext = pollGLContext;\nexports.ERR_WEBGL2 = exports.ERR_WEBGL = exports.ERR_CONTEXT = void 0;\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _createHeadlessContext = require(\"./create-headless-context\");\n\nvar _createCanvas = require(\"./create-canvas\");\n\nvar _createBrowserContext = require(\"./create-browser-context\");\n\nvar _trackContextState = _interopRequireDefault(require(\"./track-context-state\"));\n\nvar _debugContext = require(\"./debug-context\");\n\nvar _contextLimits = require(\"./context-limits\");\n\nvar _queryManager = _interopRequireDefault(require(\"../webgl-utils/query-manager\"));\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable quotes */\n// WebGLRenderingContext related methods\n// Heuristic testing of contexts (to indentify debug wrappers around gl contexts)\nvar GL_ARRAY_BUFFER = 0x8892;\nvar GL_TEXTURE_BINDING_3D = 0x806a;\nvar ERR_CONTEXT = 'Invalid WebGLRenderingContext';\nexports.ERR_CONTEXT = ERR_CONTEXT;\nvar ERR_WEBGL = ERR_CONTEXT;\nexports.ERR_WEBGL = ERR_WEBGL;\nvar ERR_WEBGL2 = 'Requires WebGL2'; // HACK: avoid use of `gl` parameter name to defeat GL constant inliner, which invalidates check\n\nexports.ERR_WEBGL2 = ERR_WEBGL2;\n\nfunction isWebGL(glContext) {\n  return Boolean(glContext && (glContext instanceof _webglUtils.WebGLRenderingContext || glContext.ARRAY_BUFFER === GL_ARRAY_BUFFER));\n} // HACK: avoid use of `gl` parameter name to defeat GL constant inliner, which invalidates check\n\n\nfunction isWebGL2(glContext) {\n  return Boolean(glContext && (glContext instanceof _webglUtils.WebGL2RenderingContext || glContext.TEXTURE_BINDING_3D === GL_TEXTURE_BINDING_3D));\n}\n\nfunction assertWebGLContext(gl) {\n  // Need to handle debug context\n  (0, _assert.default)(isWebGL(gl), ERR_CONTEXT);\n}\n\nfunction assertWebGL2Context(gl) {\n  // Need to handle debug context\n  (0, _assert.default)(isWebGL2(gl), ERR_WEBGL2);\n}\n\nvar contextDefaults = {\n  // COMMON CONTEXT PARAMETERS\n  // Attempt to allocate WebGL2 context\n  webgl2: true,\n  // Attempt to create a WebGL2 context (false to force webgl1)\n  webgl1: true,\n  // Attempt to create a WebGL1 context (false to fail if webgl2 not available)\n  throwOnFailure: true,\n  manageState: true,\n  // BROWSER CONTEXT PARAMETERS\n  canvas: null,\n  // A canvas element or a canvas string id\n  debug: false,\n  // Instrument context (at the expense of performance)\n  // HEADLESS CONTEXT PARAMETERS\n  width: 800,\n  // width are height are only used by headless gl\n  height: 600 // WEBGL/HEADLESS CONTEXT PARAMETERS\n  // Remaining options are passed through to context creator\n\n};\n/*\n * Change default context creation parameters.\n * Main use case is regression test suite.\n */\n\nfunction setContextDefaults() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  Object.assign(contextDefaults, {\n    width: 1,\n    height: 1\n  }, opts);\n}\n/*\n * Creates a context giving access to the WebGL API\n */\n\n/* eslint-disable complexity, max-statements */\n\n\nfunction createGLContext() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  opts = Object.assign({}, contextDefaults, opts);\n  var _opts = opts,\n      canvas = _opts.canvas,\n      width = _opts.width,\n      height = _opts.height,\n      throwOnError = _opts.throwOnError,\n      manageState = _opts.manageState,\n      debug = _opts.debug; // Error reporting function, enables exceptions to be disabled\n\n  function onError(message) {\n    if (throwOnError) {\n      throw new Error(message);\n    } // log.log(0, message)();\n\n\n    return null;\n  }\n\n  var gl;\n\n  if (_utils.isBrowser) {\n    // Get or create a canvas\n    var targetCanvas = (0, _createCanvas.getCanvas)({\n      canvas: canvas,\n      width: width,\n      height: height,\n      onError: onError\n    }); // Create a WebGL context in the canvas\n\n    gl = (0, _createBrowserContext.createBrowserContext)({\n      canvas: targetCanvas,\n      opts: opts\n    });\n  } else {\n    // Create a headless-gl context under Node.js\n    gl = (0, _createHeadlessContext.createHeadlessContext)({\n      width: width,\n      height: height,\n      opts: opts,\n      onError: onError\n    });\n  }\n\n  if (!gl) {\n    return null;\n  } // Install context state tracking\n\n\n  if (manageState) {\n    (0, _trackContextState.default)(gl, {\n      copyState: false,\n      log: function log() {\n        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n          args[_key] = arguments[_key];\n        }\n\n        return _utils.log.log.apply(_utils.log, [1].concat(args))();\n      }\n    });\n  } // Add debug instrumentation to the context\n\n\n  if (_utils.isBrowser && debug) {\n    gl = (0, _debugContext.makeDebugContext)(gl, {\n      debug: debug\n    }); // Debug forces log level to at least 1\n\n    _utils.log.priority = Math.max(_utils.log.priority, 1); // Log some debug info about the context\n  } // Log context information\n\n\n  logInfo(gl); // Add to seer integration\n\n  return gl;\n}\n\nfunction destroyGLContext(gl) {\n  // TODO - Remove from seer integration\n  // TODO - Unregister any tracking/polyfills\n  // There is no way to delete browser based context\n  // Destroy headless gl context\n  var ext = gl.getExtension('STACKGL_destroy_context');\n\n  if (ext) {\n    ext.destroy();\n  }\n}\n/**\n * Resize the canvas' drawing buffer.\n *\n * Can match the canvas CSS size, and optionally also consider devicePixelRatio\n * Can be called every frame\n *\n * Regardless of size, the drawing buffer will always be scaled to the viewport, but\n * for best visual results, usually set to either:\n *  canvas CSS width x canvas CSS height\n *  canvas CSS width * devicePixelRatio x canvas CSS height * devicePixelRatio\n * See http://webgl2fundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html\n *\n * resizeGLContext(gl, {width, height, useDevicePixels})\n */\n\n\nfunction resizeGLContext(gl) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // Resize browser context\n\n  if (gl.canvas) {\n    /* global window */\n    var devicePixelRatio = opts.useDevicePixels ? window.devicePixelRatio || 1 : 1;\n    var width = \"width\" in opts ? opts.width : gl.canvas.clientWidth;\n    var height = \"height\" in opts ? opts.height : gl.canvas.clientHeight;\n    gl.canvas.width = width * devicePixelRatio;\n    gl.canvas.height = height * devicePixelRatio;\n    return;\n  } // Resize headless gl context\n\n\n  var ext = gl.getExtension('STACKGL_resize_drawingbuffer');\n\n  if (ext && \"width\" in opts && \"height\" in opts) {\n    ext.resize(opts.width, opts.height);\n  }\n} // POLLING FOR PENDING QUERIES\n// Calling this function checks all pending queries for completion\n\n\nfunction pollGLContext(gl) {\n  _queryManager.default.poll(gl);\n} // HELPER METHODS\n\n\nfunction logInfo(gl) {\n  var webGL = isWebGL2(gl) ? 'WebGL2' : 'WebGL1';\n  var info = (0, _contextLimits.glGetDebugInfo)(gl);\n  var driver = info ? \"(\".concat(info.vendor, \",\").concat(info.renderer, \")\") : '';\n  var debug = gl.debug ? ' debug' : '';\n\n  _utils.log.once(0, \"\".concat(webGL).concat(debug, \" context \").concat(driver))();\n}\n},{\"../webgl-utils\":\"CTd0\",\"./create-headless-context\":\"wSyR\",\"./create-canvas\":\"osjH\",\"./create-browser-context\":\"apVN\",\"./track-context-state\":\"V1Wo\",\"./debug-context\":\"GOH4\",\"./context-limits\":\"aTuQ\",\"../webgl-utils/query-manager\":\"Gm1D\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"rNTT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"createGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.createGLContext;\n  }\n});\nObject.defineProperty(exports, \"destroyGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.destroyGLContext;\n  }\n});\nObject.defineProperty(exports, \"resizeGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.resizeGLContext;\n  }\n});\nObject.defineProperty(exports, \"pollGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.pollGLContext;\n  }\n});\nObject.defineProperty(exports, \"withParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.withParameters;\n  }\n});\nObject.defineProperty(exports, \"resetParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.resetParameters;\n  }\n});\nObject.defineProperty(exports, \"getContextInfo\", {\n  enumerable: true,\n  get: function () {\n    return _contextLimits.getContextInfo;\n  }\n});\nObject.defineProperty(exports, \"getPageLoadPromise\", {\n  enumerable: true,\n  get: function () {\n    return _createCanvas.getPageLoadPromise;\n  }\n});\nObject.defineProperty(exports, \"createCanvas\", {\n  enumerable: true,\n  get: function () {\n    return _createCanvas.createCanvas;\n  }\n});\nObject.defineProperty(exports, \"getCanvas\", {\n  enumerable: true,\n  get: function () {\n    return _createCanvas.getCanvas;\n  }\n});\nObject.defineProperty(exports, \"createHeadlessContext\", {\n  enumerable: true,\n  get: function () {\n    return _createHeadlessContext.createHeadlessContext;\n  }\n});\nObject.defineProperty(exports, \"createBrowserContext\", {\n  enumerable: true,\n  get: function () {\n    return _createBrowserContext.createBrowserContext;\n  }\n});\nObject.defineProperty(exports, \"trackContextState\", {\n  enumerable: true,\n  get: function () {\n    return _trackContextState.default;\n  }\n});\n\nvar _context = require(\"./context\");\n\nvar _contextState = require(\"./context-state\");\n\nvar _contextLimits = require(\"./context-limits\");\n\nvar _createCanvas = require(\"./create-canvas\");\n\nvar _createHeadlessContext = require(\"./create-headless-context\");\n\nvar _createBrowserContext = require(\"./create-browser-context\");\n\nvar _trackContextState = _interopRequireDefault(require(\"./track-context-state\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./context\":\"LFBw\",\"./context-state\":\"ON2o\",\"./context-limits\":\"aTuQ\",\"./create-canvas\":\"osjH\",\"./create-headless-context\":\"wSyR\",\"./create-browser-context\":\"apVN\",\"./track-context-state\":\"V1Wo\"}],\"T1Gu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.canCompileGLGSExtension = canCompileGLGSExtension;\nexports.hasFeature = hasFeature;\nexports.hasFeatures = hasFeatures;\nexports.getFeatures = getFeatures;\nexports.TEST_EXPORTS = exports.FEATURES = void 0;\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Feature detection for WebGL\n//\n// Provides a function that enables simple checking of which WebGL features are\n// available in an WebGL1 or WebGL2 environment.\n\n/* eslint-disable no-inline-comments, max-len */\n// Defines luma.gl \"feature\" names and semantics\nvar WEBGL_FEATURES = {\n  // API SUPPORT\n  VERTEX_ARRAY_OBJECT: ['OES_vertex_array_object', true],\n  TIMER_QUERY: ['EXT_disjoint_timer_query', 'EXT_disjoint_timer_query_webgl2'],\n  INSTANCED_RENDERING: ['ANGLE_instanced_arrays', true],\n  MULTIPLE_RENDER_TARGETS: ['WEBGL_draw_buffers', true],\n  // FEATURES\n  ELEMENT_INDEX_UINT32: ['OES_element_index_uint', true],\n  BLEND_EQUATION_MINMAX: ['EXT_blend_minmax', true],\n  // TEXTURES, RENDERBUFFERS\n  COLOR_ENCODING_SRGB: ['EXT_sRGB', true],\n  // TEXTURES\n  TEXTURE_DEPTH: ['WEBGL_depth_texture', true],\n  TEXTURE_FLOAT: ['OES_texture_float', true],\n  TEXTURE_HALF_FLOAT: ['OES_texture_half_float', true],\n  TEXTURE_FILTER_LINEAR_FLOAT: ['OES_texture_float_linear'],\n  TEXTURE_FILTER_LINEAR_HALF_FLOAT: ['OES_texture_half_float_linear'],\n  TEXTURE_FILTER_ANISOTROPIC: ['EXT_texture_filter_anisotropic'],\n  // FRAMEBUFFERS, TEXTURES AND RENDERBUFFERS\n  COLOR_ATTACHMENT_RGBA32F: ['WEBGL_color_buffer_float', 'EXT_color_buffer_float'],\n  COLOR_ATTACHMENT_FLOAT: [false, 'EXT_color_buffer_float'],\n  COLOR_ATTACHMENT_HALF_FLOAT: [false, 'EXT_color_buffer_half_float'],\n  // GLSL extensions\n  GLSL_FRAG_DATA: ['WEBGL_draw_buffers', true],\n  GLSL_FRAG_DEPTH: ['EXT_frag_depth', true],\n  GLSL_DERIVATIVES: ['OES_standard_derivatives', true],\n  GLSL_TEXTURE_LOD: ['EXT_shader_texture_lod', true]\n}; // Create a key-mirrored FEATURES array\n\nvar FEATURES = {};\nexports.FEATURES = FEATURES;\nObject.keys(WEBGL_FEATURES).forEach(function (key) {\n  FEATURES[key] = key;\n});\n// Enables feature detection in IE11 due to a bug where gl.getExtension may return true\n// but fail to compile when the extension is enabled in the shader. Specifically,\n// the OES_standard_derivatives extension fails to compile in IE11 even though its included\n// in the list of supported extensions.\nvar compiledGlslExtensions = {}; // opts allows user agent to be overridden for testing\n\nfunction canCompileGLGSExtension(gl, cap) {\n  var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var feature = WEBGL_FEATURES[cap];\n  (0, _assert.default)(feature, cap);\n\n  if (!(0, _utils.isOldIE)(opts)) {\n    return true;\n  }\n\n  if (cap in compiledGlslExtensions) {\n    return compiledGlslExtensions[cap];\n  }\n\n  var extensionName = feature[0];\n  var source = \"#extension GL_\".concat(extensionName, \" : enable\\nvoid main(void) {}\");\n  var shader = gl.createShader(35633);\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  var canCompile = gl.getShaderParameter(shader, 35713);\n  gl.deleteShader(shader);\n  compiledGlslExtensions[cap] = canCompile;\n  return canCompile;\n} // TODO - cache the value\n\n\nfunction getFeature(gl, cap) {\n  var feature = WEBGL_FEATURES[cap];\n  (0, _assert.default)(feature, cap); // Get extension name from table\n\n  var extensionName = (0, _webglUtils.isWebGL2)(gl) ? feature[1] || feature[0] : feature[0]; // Check if the value is dependent on checking an extension\n\n  var value = typeof extensionName === 'string' ? Boolean(gl.getExtension(extensionName)) : extensionName;\n  (0, _assert.default)(value === false || value === true);\n  return value;\n} // capability can be a WebGL extension name or a luma capability name\n\n\nfunction hasFeature(gl, feature) {\n  return hasFeatures(gl, feature);\n}\n\nfunction hasFeatures(gl, features) {\n  features = Array.isArray(features) ? features : [features];\n  return features.every(function (feature) {\n    return getFeature(gl, feature);\n  });\n}\n\nfunction getFeatures(gl) {\n  gl.luma = gl.luma || {};\n\n  if (!gl.luma.caps) {\n    gl.luma.caps = {};\n    gl.luma.caps.webgl2 = (0, _webglUtils.isWebGL2)(gl);\n\n    for (var cap in WEBGL_FEATURES) {\n      gl.luma.caps[cap] = getFeature(gl, cap);\n    }\n  }\n\n  return gl.luma.caps;\n}\n\nvar TEST_EXPORTS = {\n  WEBGL_FEATURES: WEBGL_FEATURES\n};\nexports.TEST_EXPORTS = TEST_EXPORTS;\n},{\"../webgl-utils\":\"CTd0\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"Y9vu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FragmentShader = exports.VertexShader = exports.Shader = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ERR_SOURCE = 'Shader: GLSL source code must be a JavaScript string';\nvar GL_FRAGMENT_SHADER = 0x8b30;\nvar GL_VERTEX_SHADER = 0x8b31;\nvar GL_COMPILE_STATUS = 0x8b81;\nvar GL_SHADER_TYPE = 0x8b4f; // For now this is an internal class\n\nvar Shader =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(Shader, _Resource);\n  (0, _createClass2.default)(Shader, null, [{\n    key: \"getTypeName\",\n    value: function getTypeName(shaderType) {\n      switch (shaderType) {\n        case GL_VERTEX_SHADER:\n          return 'vertex-shader';\n\n        case GL_FRAGMENT_SHADER:\n          return 'fragment-shader';\n\n        default:\n          (0, _assert.default)(false);\n          return 'unknown';\n      }\n    }\n    /* eslint-disable max-statements */\n\n  }]);\n\n  function Shader(gl, props) {\n    var _this;\n\n    (0, _classCallCheck2.default)(this, Shader);\n    (0, _webglUtils.assertWebGLContext)(gl); // Validate arguments\n\n    (0, _assert.default)(typeof props.source === 'string', ERR_SOURCE); // Deduce an id, from shader source, or supplied id, or shader type\n\n    var id = (0, _webglUtils.getShaderName)(props.source, null) || props.id || (0, _utils.uid)(\"unnamed \".concat(Shader.getTypeName(props.shaderType)));\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Shader).call(this, gl, {\n      id: id\n    }));\n    _this.shaderType = props.shaderType;\n    _this.source = props.source;\n\n    _this.initialize(props);\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Shader, [{\n    key: \"initialize\",\n    value: function initialize(_ref) {\n      var source = _ref.source;\n      var shaderName = (0, _webglUtils.getShaderName)(source, null);\n\n      if (shaderName) {\n        this.id = (0, _utils.uid)(shaderName);\n      }\n\n      this._compile(source);\n    } // Accessors\n\n  }, {\n    key: \"getParameter\",\n    value: function getParameter(pname) {\n      return this.gl.getShaderParameter(this.handle, pname);\n    }\n  }, {\n    key: \"toString\",\n    value: function toString() {\n      return \"\".concat(this.getTypeName(this.shaderType), \":\").concat(this.id);\n    }\n  }, {\n    key: \"getName\",\n    value: function getName() {\n      return (0, _webglUtils.getShaderName)(this.source) || 'unnamed-shader';\n    }\n  }, {\n    key: \"getSource\",\n    value: function getSource() {\n      return this.gl.getShaderSource(this.handle);\n    } // Debug method - Returns translated source if available\n\n  }, {\n    key: \"getTranslatedSource\",\n    value: function getTranslatedSource() {\n      var extension = this.gl.getExtension('WEBGL_debug_shaders');\n      return extension ? extension.getTranslatedShaderSource(this.handle) : 'No translated source available. WEBGL_debug_shaders not implemented';\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_compile\",\n    value: function _compile() {\n      this.gl.shaderSource(this.handle, this.source);\n      this.gl.compileShader(this.handle); // TODO - For performance reasons, avoid checking shader compilation errors on production?\n      // TODO - Load log even when no error reported, to catch warnings?\n      // https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings\n\n      var compileStatus = this.getParameter(GL_COMPILE_STATUS);\n\n      if (!compileStatus) {\n        var infoLog = this.gl.getShaderInfoLog(this.handle);\n\n        var _parseGLSLCompilerErr = (0, _webglUtils.parseGLSLCompilerError)(infoLog, this.source, this.shaderType, this.id),\n            shaderName = _parseGLSLCompilerErr.shaderName,\n            errors = _parseGLSLCompilerErr.errors,\n            warnings = _parseGLSLCompilerErr.warnings;\n\n        _utils.log.error(\"GLSL compilation errors in \".concat(shaderName, \"\\n\").concat(errors))();\n\n        _utils.log.warn(\"GLSL compilation warnings in \".concat(shaderName, \"\\n\").concat(warnings))();\n\n        throw new Error(\"GLSL compilation errors in \".concat(shaderName));\n      }\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      this.gl.deleteShader(this.handle);\n    }\n  }, {\n    key: \"_getOptsFromHandle\",\n    value: function _getOptsFromHandle() {\n      return {\n        type: this.getParameter(GL_SHADER_TYPE),\n        source: this.getSource()\n      };\n    }\n  }]);\n  return Shader;\n}(_resource.default);\n\nexports.Shader = Shader;\n\nvar VertexShader =\n/*#__PURE__*/\nfunction (_Shader) {\n  (0, _inherits2.default)(VertexShader, _Shader);\n\n  function VertexShader(gl, props) {\n    (0, _classCallCheck2.default)(this, VertexShader); // DEPRECATED: Support old constructor signature: VertexShader(gl, source)\n\n    if (typeof props === 'string') {\n      _utils.log.deprecated('new FragmentShader(gl, source)', 'new FragmentShader(gl, {source})', '6.1');\n\n      props = {\n        source: props\n      };\n    }\n\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(VertexShader).call(this, gl, Object.assign({}, props, {\n      shaderType: GL_VERTEX_SHADER\n    })));\n  } // PRIVATE METHODS\n\n\n  (0, _createClass2.default)(VertexShader, [{\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createShader(GL_VERTEX_SHADER);\n    }\n  }]);\n  return VertexShader;\n}(Shader);\n\nexports.VertexShader = VertexShader;\n\nvar FragmentShader =\n/*#__PURE__*/\nfunction (_Shader2) {\n  (0, _inherits2.default)(FragmentShader, _Shader2);\n\n  function FragmentShader(gl, props) {\n    (0, _classCallCheck2.default)(this, FragmentShader); // DEPRECATED: Support old constructor signature: FragmentShader(gl, source)\n\n    if (typeof props === 'string') {\n      _utils.log.deprecated('new FragmentShader(gl, source)', 'new FragmentShader(gl, {source})', '6.1');\n\n      props = {\n        source: props\n      };\n    }\n\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(FragmentShader).call(this, gl, Object.assign({}, props, {\n      shaderType: GL_FRAGMENT_SHADER\n    })));\n  } // PRIVATE METHODS\n\n\n  (0, _createClass2.default)(FragmentShader, [{\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createShader(GL_FRAGMENT_SHADER);\n    }\n  }]);\n  return FragmentShader;\n}(Shader);\n\nexports.FragmentShader = FragmentShader;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./resource\":\"LE4Y\",\"../webgl-utils\":\"CTd0\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"WTsX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _superPropBase;\n\nvar _getPrototypeOf = _interopRequireDefault(require(\"./getPrototypeOf\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = (0, _getPrototypeOf.default)(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n},{\"./getPrototypeOf\":\"QQCW\"}],\"Lwpt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _get;\n\nvar _superPropBase = _interopRequireDefault(require(\"./superPropBase\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    exports.default = _get = Reflect.get;\n  } else {\n    exports.default = _get = function _get(target, property, receiver) {\n      var base = (0, _superPropBase.default)(target, property);\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n},{\"./superPropBase\":\"WTsX\"}],\"OYcf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.RENDERBUFFER_FORMATS = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _RENDERBUFFER_FORMATS;\n/* eslint-disable no-inline-comments */\n\n\n// Define local GL constants to optimize minification\nvar GL_RENDERBUFFER = 0x8d41;\nvar GL_SAMPLES = 0x80a9;\nvar GL_RENDERBUFFER_WIDTH = 0x8d42;\nvar GL_RENDERBUFFER_HEIGHT = 0x8d43;\nvar GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8d44;\nvar GL_RENDERBUFFER_SAMPLES = 0x8cab; // Define local extension strings to optimize minification\n// const SRGB = 'EXT_sRGB';\n// const CB_FLOAT_WEBGL1 = 'WEBGL_color_buffer_float';\n\nvar CB_FLOAT_WEBGL2 = 'EXT_color_buffer_float'; // const CB_HALF_FLOAT_WEBGL1 = 'EXT_color_buffer_half_float';\n\nvar RENDERBUFFER_FORMATS = (_RENDERBUFFER_FORMATS = {}, (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33189, {}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33190, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36012, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36168, {}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 34041, {}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 35056, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36013, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 32854, {}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36194, {}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 32855, {}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33321, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33330, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33329, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33332, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33331, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33334, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33333, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33323, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33336, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33335, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33338, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33337, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33340, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33339, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 32849, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 32856, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 32857, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36220, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36238, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36975, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36214, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36232, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36226, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 36208, {\n  gl2: true\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33325, {\n  gl2: CB_FLOAT_WEBGL2\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33327, {\n  gl2: CB_FLOAT_WEBGL2\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 34842, {\n  gl2: CB_FLOAT_WEBGL2\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33326, {\n  gl2: CB_FLOAT_WEBGL2\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 33328, {\n  gl2: CB_FLOAT_WEBGL2\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 34836, {\n  gl2: CB_FLOAT_WEBGL2\n}), (0, _defineProperty2.default)(_RENDERBUFFER_FORMATS, 35898, {\n  gl2: CB_FLOAT_WEBGL2\n}), _RENDERBUFFER_FORMATS);\nexports.RENDERBUFFER_FORMATS = RENDERBUFFER_FORMATS;\n\nfunction isFormatSupported(gl, format, formats) {\n  var info = formats[format];\n\n  if (!info) {\n    return false;\n  }\n\n  var value = (0, _webglUtils.isWebGL2)(gl) ? info.gl2 || info.gl1 : info.gl1;\n\n  if (typeof value === 'string') {\n    return gl.getExtension(value);\n  }\n\n  return value;\n}\n\nvar Renderbuffer =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(Renderbuffer, _Resource);\n  (0, _createClass2.default)(Renderbuffer, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          format = _ref.format;\n\n      return !format || isFormatSupported(gl, format, RENDERBUFFER_FORMATS);\n    }\n  }, {\n    key: \"getSamplesForFormat\",\n    value: function getSamplesForFormat(gl, _ref2) {\n      var format = _ref2.format; // Polyfilled to return [0] under WebGL1\n\n      return gl.getInternalformatParameter(GL_RENDERBUFFER, format, GL_SAMPLES);\n    }\n  }]);\n\n  function Renderbuffer(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Renderbuffer);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Renderbuffer).call(this, gl, opts));\n\n    _this.initialize(opts);\n\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  } // Creates and initializes a renderbuffer object's data store\n\n\n  (0, _createClass2.default)(Renderbuffer, [{\n    key: \"initialize\",\n    value: function initialize(_ref3) {\n      var format = _ref3.format,\n          _ref3$width = _ref3.width,\n          width = _ref3$width === void 0 ? 1 : _ref3$width,\n          _ref3$height = _ref3.height,\n          height = _ref3$height === void 0 ? 1 : _ref3$height,\n          _ref3$samples = _ref3.samples,\n          samples = _ref3$samples === void 0 ? 0 : _ref3$samples;\n      (0, _assert.default)(format, 'Needs format');\n      this.gl.bindRenderbuffer(GL_RENDERBUFFER, this.handle);\n\n      if (samples !== 0 && (0, _webglUtils.isWebGL2)(this.gl)) {\n        this.gl.renderbufferStorageMultisample(GL_RENDERBUFFER, samples, format, width, height);\n      } else {\n        this.gl.renderbufferStorage(GL_RENDERBUFFER, format, width, height);\n      } // this.gl.bindRenderbuffer(GL_RENDERBUFFER, null);\n\n\n      this.format = format;\n      this.width = width;\n      this.height = height;\n      this.samples = samples;\n      return this;\n    }\n  }, {\n    key: \"resize\",\n    value: function resize(_ref4) {\n      var width = _ref4.width,\n          height = _ref4.height; // Don't resize if width/height haven't changed\n\n      if (width !== this.width || height !== this.height) {\n        return this.initialize({\n          width: width,\n          height: height,\n          format: this.format,\n          samples: this.samples\n        });\n      }\n\n      return this;\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createRenderbuffer();\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      this.gl.deleteRenderbuffer(this.handle);\n    }\n  }, {\n    key: \"_bindHandle\",\n    value: function _bindHandle(handle) {\n      this.gl.bindRenderbuffer(GL_RENDERBUFFER, handle);\n    }\n  }, {\n    key: \"_syncHandle\",\n    value: function _syncHandle(handle) {\n      this.format = this.getParameter(GL_RENDERBUFFER_INTERNAL_FORMAT);\n      this.width = this.getParameter(GL_RENDERBUFFER_WIDTH);\n      this.height = this.getParameter(GL_RENDERBUFFER_HEIGHT);\n      this.samples = this.getParameter(GL_RENDERBUFFER_SAMPLES);\n    } // @param {Boolean} opt.autobind=true - method call will bind/unbind object\n    // @returns {GLenum|GLint} - depends on pname\n\n  }, {\n    key: \"_getParameter\",\n    value: function _getParameter(pname) {\n      this.gl.bindRenderbuffer(GL_RENDERBUFFER, this.handle);\n      var value = this.gl.getRenderbufferParameter(GL_RENDERBUFFER, pname); // this.gl.bindRenderbuffer(GL_RENDERBUFFER, null);\n\n      return value;\n    }\n  }]);\n  return Renderbuffer;\n}(_resource.default);\n\nexports.default = Renderbuffer;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"../webgl-utils\":\"CTd0\",\"./resource\":\"LE4Y\",\"../utils/assert\":\"iVaU\"}],\"mZdw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.clear = clear;\nexports.clearBuffer = clearBuffer;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _contextState = require(\"../webgl-context/context-state\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Should collapse during minification\nvar GL_DEPTH_BUFFER_BIT = 0x00000100;\nvar GL_STENCIL_BUFFER_BIT = 0x00000400;\nvar GL_COLOR_BUFFER_BIT = 0x00004000;\nvar GL_COLOR = 0x1800;\nvar GL_DEPTH = 0x1801;\nvar GL_STENCIL = 0x1802;\nvar GL_DEPTH_STENCIL = 0x84f9; // Should disappear if asserts are removed\n\nvar ERR_ARGUMENTS = 'clear: bad arguments'; // Optionally clears depth, color and stencil buffers\n\nfunction clear(gl) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$framebuffer = _ref.framebuffer,\n      framebuffer = _ref$framebuffer === void 0 ? null : _ref$framebuffer,\n      _ref$color = _ref.color,\n      color = _ref$color === void 0 ? null : _ref$color,\n      _ref$depth = _ref.depth,\n      depth = _ref$depth === void 0 ? null : _ref$depth,\n      _ref$stencil = _ref.stencil,\n      stencil = _ref$stencil === void 0 ? null : _ref$stencil;\n\n  var parameters = {};\n\n  if (framebuffer) {\n    parameters.framebuffer = framebuffer;\n  }\n\n  var clearFlags = 0;\n\n  if (color) {\n    clearFlags |= GL_COLOR_BUFFER_BIT;\n\n    if (color !== true) {\n      parameters.clearColor = color;\n    }\n  }\n\n  if (depth) {\n    clearFlags |= GL_DEPTH_BUFFER_BIT;\n\n    if (depth !== true) {\n      parameters.clearDepth = depth;\n    }\n  }\n\n  if (stencil) {\n    clearFlags |= GL_STENCIL_BUFFER_BIT;\n\n    if (depth !== true) {\n      parameters.clearStencil = depth;\n    }\n  }\n\n  (0, _assert.default)(clearFlags !== 0, ERR_ARGUMENTS); // Temporarily set any clear \"colors\" and call clear\n\n  (0, _contextState.withParameters)(gl, parameters, function () {\n    gl.clear(clearFlags);\n  });\n} // WebGL2 - clear a specific drawing buffer\n\n\nfunction clearBuffer(gl) {\n  var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref2$framebuffer = _ref2.framebuffer,\n      framebuffer = _ref2$framebuffer === void 0 ? null : _ref2$framebuffer,\n      _ref2$buffer = _ref2.buffer,\n      buffer = _ref2$buffer === void 0 ? GL_COLOR : _ref2$buffer,\n      _ref2$drawBuffer = _ref2.drawBuffer,\n      drawBuffer = _ref2$drawBuffer === void 0 ? 0 : _ref2$drawBuffer,\n      _ref2$value = _ref2.value,\n      value = _ref2$value === void 0 ? [0, 0, 0, 0] : _ref2$value;\n\n  (0, _webglUtils.assertWebGL2Context)(gl);\n  (0, _contextState.withParameters)(gl, {\n    framebuffer: framebuffer\n  }, function () {\n    // Method selection per OpenGL ES 3 docs\n    switch (buffer) {\n      case GL_COLOR:\n        switch (value.constructor) {\n          case Int32Array:\n            gl.clearBufferiv(buffer, drawBuffer, value);\n            break;\n\n          case Uint32Array:\n            gl.clearBufferuiv(buffer, drawBuffer, value);\n            break;\n\n          case Float32Array:\n          default:\n            gl.clearBufferfv(buffer, drawBuffer, value);\n        }\n\n        break;\n\n      case GL_DEPTH:\n        gl.clearBufferfv(GL_DEPTH, 0, [value]);\n        break;\n\n      case GL_STENCIL:\n        gl.clearBufferiv(GL_STENCIL, 0, [value]);\n        break;\n\n      case GL_DEPTH_STENCIL:\n        var _value = (0, _slicedToArray2.default)(value, 2),\n            depth = _value[0],\n            stencil = _value[1];\n\n        gl.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);\n        break;\n\n      default:\n        (0, _assert.default)(false, ERR_ARGUMENTS);\n    }\n  });\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"../webgl-context/context-state\":\"ON2o\",\"../webgl-utils\":\"CTd0\",\"../utils/assert\":\"iVaU\"}],\"yuwK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.glFormatToComponents = glFormatToComponents;\nexports.glTypeToBytes = glTypeToBytes;\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Returns number of components in a specific readPixels WebGL format\nfunction glFormatToComponents(format) {\n  switch (format) {\n    case 6406:\n    case 33326:\n    case 6403:\n      return 1;\n\n    case 33328:\n    case 33319:\n      return 2;\n\n    case 6407:\n    case 34837:\n      return 3;\n\n    case 6408:\n    case 34836:\n      return 4;\n    // TODO: Add support for additional WebGL2 formats\n\n    default:\n      (0, _assert.default)(false);\n      return 0;\n  }\n} // Return byte count for given readPixels WebGL type\n\n\nfunction glTypeToBytes(type) {\n  switch (type) {\n    case 5121:\n      return 1;\n\n    case 33635:\n    case 32819:\n    case 32820:\n      return 2;\n\n    case 5126:\n      return 4;\n    // TODO: Add support for additional WebGL2 types\n\n    default:\n      (0, _assert.default)(false);\n      return 0;\n  }\n}\n},{\"../utils/assert\":\"iVaU\"}],\"V5nt\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FRAMEBUFFER_ATTACHMENT_PARAMETERS = exports.default = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _texture2d = _interopRequireDefault(require(\"./texture-2d\"));\n\nvar _renderbuffer = _interopRequireDefault(require(\"./renderbuffer\"));\n\nvar _buffer = _interopRequireDefault(require(\"./buffer\"));\n\nvar _clear2 = require(\"./clear\");\n\nvar _webglContext = require(\"../webgl-context\");\n\nvar _contextFeatures = require(\"../webgl-context/context-features\");\n\nvar _typedArrayUtils = require(\"../webgl-utils/typed-array-utils\");\n\nvar _formatUtils = require(\"../webgl-utils/format-utils\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _constantsToKeys = require(\"../webgl-utils/constants-to-keys\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ERR_MULTIPLE_RENDERTARGETS = 'Multiple render targets not supported';\n\nvar Framebuffer =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(Framebuffer, _Resource);\n  (0, _createClass2.default)(Framebuffer, [{\n    key: \"MAX_COLOR_ATTACHMENTS\",\n    get: function get() {\n      return this.gl.getParameter(this.gl.MAX_COLOR_ATTACHMENTS);\n    }\n  }, {\n    key: \"MAX_DRAW_BUFFERS\",\n    get: function get() {\n      return this.gl.getParameter(this.gl.MAX_DRAW_BUFFERS);\n    }\n  }], [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          colorBufferFloat = _ref.colorBufferFloat,\n          colorBufferHalfFloat = _ref.colorBufferHalfFloat;\n\n      var supported = true;\n      supported = colorBufferFloat && gl.getExtension((0, _webglUtils.isWebGL2)(gl) ? 'EXT_color_buffer_float' : 'WEBGL.color_buffer_float');\n      supported = colorBufferHalfFloat && gl.getExtension((0, _webglUtils.isWebGL2)(gl) ? 'EXT_color_buffer_float' : 'EXT_color_buffer_half_float');\n      return supported;\n    } // Create a Framebuffer wrapper for the default framebuffer (target === null)\n\n  }, {\n    key: \"getDefaultFramebuffer\",\n    value: function getDefaultFramebuffer(gl) {\n      gl.luma = gl.luma || {};\n      gl.luma.defaultFramebuffer = gl.luma.defaultFramebuffer || new Framebuffer(gl, {\n        id: 'default-framebuffer',\n        handle: null,\n        attachments: {}\n      }); // TODO - can we query for and get a handle to the GL.FRONT renderbuffer?\n\n      return gl.luma.defaultFramebuffer;\n    }\n  }]);\n\n  function Framebuffer(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Framebuffer);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Framebuffer).call(this, gl, opts)); // Public members\n\n    _this.width = null;\n    _this.height = null;\n    _this.attachments = {};\n    _this.readBuffer = 36064;\n    _this.drawBuffers = [36064];\n\n    _this.initialize(opts);\n\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  }\n\n  (0, _createClass2.default)(Framebuffer, [{\n    key: \"initialize\",\n    value: function initialize(_ref2) {\n      var _ref2$width = _ref2.width,\n          width = _ref2$width === void 0 ? 1 : _ref2$width,\n          _ref2$height = _ref2.height,\n          height = _ref2$height === void 0 ? 1 : _ref2$height,\n          _ref2$attachments = _ref2.attachments,\n          attachments = _ref2$attachments === void 0 ? null : _ref2$attachments,\n          _ref2$color = _ref2.color,\n          color = _ref2$color === void 0 ? true : _ref2$color,\n          _ref2$depth = _ref2.depth,\n          depth = _ref2$depth === void 0 ? true : _ref2$depth,\n          _ref2$stencil = _ref2.stencil,\n          stencil = _ref2$stencil === void 0 ? false : _ref2$stencil,\n          _ref2$check = _ref2.check,\n          check = _ref2$check === void 0 ? true : _ref2$check,\n          readBuffer = _ref2.readBuffer,\n          drawBuffers = _ref2.drawBuffers;\n      (0, _assert.default)(width >= 0 && height >= 0, 'Width and height need to be integers'); // Store actual width and height for diffing\n\n      this.width = width;\n      this.height = height; // Resize any provided attachments - note that resize only resizes if needed\n      // Note: A framebuffer has no separate size, it is defined by its attachments (which must agree)\n\n      if (attachments) {\n        for (var attachment in attachments) {\n          var target = attachments[attachment];\n          var object = Array.isArray(target) ? target[0] : target;\n          object.resize({\n            width: width,\n            height: height\n          });\n        }\n      } else {\n        // Create any requested default attachments\n        attachments = this._createDefaultAttachments(color, depth, stencil, width, height);\n      }\n\n      this.update({\n        clearAttachments: true,\n        attachments: attachments,\n        readBuffer: readBuffer,\n        drawBuffers: drawBuffers\n      }); // Checks that framebuffer was properly set up, if not, throws an explanatory error\n\n      if (attachments && check) {\n        this.checkStatus();\n      }\n    }\n  }, {\n    key: \"update\",\n    value: function update(_ref3) {\n      var _ref3$attachments = _ref3.attachments,\n          attachments = _ref3$attachments === void 0 ? {} : _ref3$attachments,\n          readBuffer = _ref3.readBuffer,\n          drawBuffers = _ref3.drawBuffers,\n          _ref3$clearAttachment = _ref3.clearAttachments,\n          clearAttachments = _ref3$clearAttachment === void 0 ? false : _ref3$clearAttachment,\n          _ref3$resizeAttachmen = _ref3.resizeAttachments,\n          resizeAttachments = _ref3$resizeAttachmen === void 0 ? true : _ref3$resizeAttachmen;\n      this.attach(attachments, {\n        clearAttachments: clearAttachments,\n        resizeAttachments: resizeAttachments\n      });\n      var gl = this.gl; // Multiple render target support, set read buffer and draw buffers\n\n      var prevHandle = gl.bindFramebuffer(36160, this.handle);\n\n      if (readBuffer) {\n        this._setReadBuffer(readBuffer);\n      }\n\n      if (drawBuffers) {\n        this._setDrawBuffers(drawBuffers);\n      }\n\n      gl.bindFramebuffer(36160, prevHandle || null);\n      return this;\n    } // Attachment resize is expected to be a noop if size is same\n\n  }, {\n    key: \"resize\",\n    value: function resize() {\n      var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          width = _ref4.width,\n          height = _ref4.height; // for default framebuffer, just update the stored size\n\n\n      if (this.handle === null) {\n        (0, _assert.default)(width === undefined && height === undefined);\n        this.width = this.gl.drawingBufferWidth;\n        this.height = this.gl.drawingBufferHeight;\n        return this;\n      }\n\n      if (width === undefined) {\n        width = this.gl.drawingBufferWidth;\n      }\n\n      if (height === undefined) {\n        height = this.gl.drawingBufferHeight;\n      }\n\n      if (width !== this.width && height !== this.height) {\n        _utils.log.log(2, \"Resizing framebuffer \".concat(this.id, \" to \").concat(width, \"x\").concat(height));\n      }\n\n      for (var attachmentPoint in this.attachments) {\n        this.attachments[attachmentPoint].resize({\n          width: width,\n          height: height\n        });\n      }\n\n      this.width = width;\n      this.height = height;\n      return this;\n    } // Attach from a map of attachments\n\n  }, {\n    key: \"attach\",\n    value: function attach(attachments) {\n      var _this2 = this;\n\n      var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref5$clearAttachment = _ref5.clearAttachments,\n          clearAttachments = _ref5$clearAttachment === void 0 ? false : _ref5$clearAttachment,\n          _ref5$resizeAttachmen = _ref5.resizeAttachments,\n          resizeAttachments = _ref5$resizeAttachmen === void 0 ? true : _ref5$resizeAttachmen;\n\n      var newAttachments = {}; // Any current attachments need to be removed, add null values to map\n\n      if (clearAttachments) {\n        Object.keys(this.attachments).forEach(function (key) {\n          newAttachments[key] = null;\n        });\n      } // Overlay the new attachments\n\n\n      Object.assign(newAttachments, attachments);\n      var prevHandle = this.gl.bindFramebuffer(36160, this.handle); // Walk the attachments\n\n      for (var key in newAttachments) {\n        // Ensure key is not undefined\n        (0, _assert.default)(key !== undefined, 'Misspelled framebuffer binding point?');\n        var attachment = Number(key);\n        var descriptor = newAttachments[attachment];\n        var object = descriptor;\n\n        if (!object) {\n          this._unattach(attachment);\n        } else if (object instanceof _renderbuffer.default) {\n          this._attachRenderbuffer({\n            attachment: attachment,\n            renderbuffer: object\n          });\n        } else if (Array.isArray(descriptor)) {\n          var _descriptor = (0, _slicedToArray2.default)(descriptor, 3),\n              texture = _descriptor[0],\n              _descriptor$ = _descriptor[1],\n              layer = _descriptor$ === void 0 ? 0 : _descriptor$,\n              _descriptor$2 = _descriptor[2],\n              level = _descriptor$2 === void 0 ? 0 : _descriptor$2;\n\n          object = texture;\n\n          this._attachTexture({\n            attachment: attachment,\n            texture: texture,\n            layer: layer,\n            level: level\n          });\n        } else {\n          this._attachTexture({\n            attachment: attachment,\n            texture: object,\n            layer: 0,\n            level: 0\n          });\n        } // Resize objects\n\n\n        if (resizeAttachments && object) {\n          object.resize({\n            width: this.width,\n            height: this.height\n          });\n        }\n      }\n\n      this.gl.bindFramebuffer(36160, prevHandle || null); // Assign to attachments and remove any nulls to get a clean attachment map\n\n      Object.assign(this.attachments, attachments);\n      Object.keys(this.attachments).filter(function (key) {\n        return !_this2.attachments[key];\n      }).forEach(function (key) {\n        delete _this2.attachments[key];\n      });\n    }\n  }, {\n    key: \"checkStatus\",\n    value: function checkStatus() {\n      var gl = this.gl;\n      var prevHandle = gl.bindFramebuffer(36160, this.handle);\n      var status = gl.checkFramebufferStatus(36160);\n      gl.bindFramebuffer(36160, prevHandle || null);\n\n      if (status !== 36053) {\n        throw new Error(_getFrameBufferStatus(status));\n      }\n\n      return this;\n    }\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          color = _ref6.color,\n          depth = _ref6.depth,\n          stencil = _ref6.stencil,\n          _ref6$drawBuffers = _ref6.drawBuffers,\n          drawBuffers = _ref6$drawBuffers === void 0 ? [] : _ref6$drawBuffers; // Bind framebuffer and delegate to global clear functions\n\n\n      var prevHandle = this.gl.bindFramebuffer(36160, this.handle);\n\n      if (color || depth || stencil) {\n        (0, _clear2.clear)(this.gl, {\n          color: color,\n          depth: depth,\n          stencil: stencil\n        });\n      }\n\n      drawBuffers.forEach(function (value, drawBuffer) {\n        (0, _clear2.clearBuffer)({\n          drawBuffer: drawBuffer,\n          value: value\n        });\n      });\n      this.gl.bindFramebuffer(36160, prevHandle || null);\n      return this;\n    } // NOTE: Slow requires roundtrip to GPU\n    // App can provide pixelArray or have it auto allocated by this method\n    // @returns {Uint8Array|Uint16Array|FloatArray} - pixel array,\n    //  newly allocated by this method unless provided by app.\n\n  }, {\n    key: \"readPixels\",\n    value: function readPixels() {\n      var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref7$x = _ref7.x,\n          x = _ref7$x === void 0 ? 0 : _ref7$x,\n          _ref7$y = _ref7.y,\n          y = _ref7$y === void 0 ? 0 : _ref7$y,\n          _ref7$width = _ref7.width,\n          width = _ref7$width === void 0 ? this.width : _ref7$width,\n          _ref7$height = _ref7.height,\n          height = _ref7$height === void 0 ? this.height : _ref7$height,\n          _ref7$format = _ref7.format,\n          format = _ref7$format === void 0 ? 6408 : _ref7$format,\n          type = _ref7.type,\n          _ref7$pixelArray = _ref7.pixelArray,\n          pixelArray = _ref7$pixelArray === void 0 ? null : _ref7$pixelArray,\n          _ref7$attachment = _ref7.attachment,\n          attachment = _ref7$attachment === void 0 ? 36064 : _ref7$attachment;\n\n      var gl = this.gl; // TODO - Set and unset gl.readBuffer\n\n      if (attachment === 36064 && this.handle === null) {\n        attachment = 1028;\n      }\n\n      (0, _assert.default)(this.attachments[attachment]); // Deduce the type from color attachment if not provided.\n\n      type = type || this.attachments[attachment].type; // Deduce type and allocated pixelArray if needed\n\n      if (!pixelArray) {\n        // Allocate pixel array if not already available, using supplied type\n        type = type || 5121;\n        var ArrayType = (0, _typedArrayUtils.getTypedArrayFromGLType)(type, {\n          clamped: false\n        });\n        var components = (0, _formatUtils.glFormatToComponents)(format); // TODO - check for composite type (components = 1).\n\n        pixelArray = pixelArray || new ArrayType(width * height * components);\n      } // Pixel array available, if necessary, deduce type from it.\n\n\n      type = type || (0, _typedArrayUtils.getGLTypeFromTypedArray)(pixelArray);\n      var prevHandle = this.gl.bindFramebuffer(36160, this.handle);\n      this.gl.readPixels(x, y, width, height, format, type, pixelArray);\n      this.gl.bindFramebuffer(36160, prevHandle || null);\n      return pixelArray;\n    } // Reads data into provided buffer object asynchronously\n    // This function doesn't wait for copy to be complete, it programs GPU to perform a DMA transffer.\n\n  }, {\n    key: \"readPixelsToBuffer\",\n    value: function readPixelsToBuffer(_ref8) {\n      var _ref8$x = _ref8.x,\n          x = _ref8$x === void 0 ? 0 : _ref8$x,\n          _ref8$y = _ref8.y,\n          y = _ref8$y === void 0 ? 0 : _ref8$y,\n          _ref8$width = _ref8.width,\n          width = _ref8$width === void 0 ? this.width : _ref8$width,\n          _ref8$height = _ref8.height,\n          height = _ref8$height === void 0 ? this.height : _ref8$height,\n          _ref8$format = _ref8.format,\n          format = _ref8$format === void 0 ? 6408 : _ref8$format,\n          type = _ref8.type,\n          _ref8$buffer = _ref8.buffer,\n          buffer = _ref8$buffer === void 0 ? null : _ref8$buffer,\n          _ref8$byteOffset = _ref8.byteOffset,\n          byteOffset = _ref8$byteOffset === void 0 ? 0 : _ref8$byteOffset;\n      var gl = this.gl; // Asynchronus read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n\n      (0, _webglUtils.assertWebGL2Context)(gl); // deduce type if not available.\n\n      type = type || (buffer ? buffer.type : 5121);\n\n      if (!buffer) {\n        // Create new buffer with enough size\n        var components = (0, _formatUtils.glFormatToComponents)(format);\n        var byteCount = (0, _formatUtils.glTypeToBytes)(type);\n        var bytes = byteOffset + width * height * components * byteCount;\n        buffer = new _buffer.default(gl, {\n          bytes: bytes,\n          type: type,\n          size: components\n        });\n      }\n\n      buffer.bind({\n        target: 35051\n      });\n      (0, _webglContext.withParameters)(gl, {\n        framebuffer: this\n      }, function () {\n        gl.readPixels(x, y, width, height, format, type, byteOffset);\n      });\n      buffer.unbind({\n        target: 35051\n      });\n      return buffer;\n    } // Reads pixels as a dataUrl\n\n  }, {\n    key: \"copyToDataUrl\",\n    value: function copyToDataUrl() {\n      var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref9$attachment = _ref9.attachment,\n          attachment = _ref9$attachment === void 0 ? 36064 : _ref9$attachment,\n          _ref9$maxHeight = _ref9.maxHeight,\n          maxHeight = _ref9$maxHeight === void 0 ? Number.MAX_SAFE_INTEGER : _ref9$maxHeight;\n\n      var data = this.readPixels({\n        attachment: attachment\n      }); // Scale down\n\n      var width = this.width,\n          height = this.height;\n\n      while (height > maxHeight) {\n        var _scalePixels = (0, _webglUtils.scalePixels)({\n          data: data,\n          width: width,\n          height: height\n        });\n\n        data = _scalePixels.data;\n        width = _scalePixels.width;\n        height = _scalePixels.height;\n      } // Flip to top down coordinate system\n\n\n      (0, _webglUtils.flipRows)({\n        data: data,\n        width: width,\n        height: height\n      });\n      /* global document */\n\n      var canvas = document.createElement('canvas');\n      canvas.width = width;\n      canvas.height = height;\n      var context = canvas.getContext('2d'); // Copy the pixels to a 2D canvas\n\n      var imageData = context.createImageData(width, height);\n      imageData.data.set(data);\n      context.putImageData(imageData, 0, 0);\n      return canvas.toDataURL();\n    } // Reads pixels into an HTML Image\n\n  }, {\n    key: \"copyToImage\",\n    value: function copyToImage() {\n      var _ref10 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref10$image = _ref10.image,\n          image = _ref10$image === void 0 ? null : _ref10$image,\n          _ref10$attachment = _ref10.attachment,\n          attachment = _ref10$attachment === void 0 ? 36064 : _ref10$attachment,\n          _ref10$maxHeight = _ref10.maxHeight,\n          maxHeight = _ref10$maxHeight === void 0 ? Number.MAX_SAFE_INTEGER : _ref10$maxHeight;\n      /* global Image */\n\n\n      var dataUrl = this.readDataUrl({\n        attachment: attachment\n      });\n      image = image || new Image();\n      image.src = dataUrl;\n      return image;\n    } // copyToFramebuffer({width, height}) {\n    //   const scaleX = width / this.width;\n    //   const scaleY = height / this.height;\n    //   const scale = Math.min(scaleX, scaleY);\n    //   width = width * scale;\n    //   height = height * scale;\n    //   const scaledFramebuffer = new Framebuffer(this.gl, {width, height});\n    //   this.blit();\n    // }\n    // Copy a rectangle from a framebuffer attachment into a texture (at an offset)\n    // NOTE: assumes texture has enough storage allocated\n    // eslint-disable-next-line complexity\n\n  }, {\n    key: \"copyToTexture\",\n    value: function copyToTexture(_ref11) {\n      var texture = _ref11.texture,\n          target = _ref11.target,\n          _ref11$xoffset = _ref11.xoffset,\n          xoffset = _ref11$xoffset === void 0 ? 0 : _ref11$xoffset,\n          _ref11$yoffset = _ref11.yoffset,\n          yoffset = _ref11$yoffset === void 0 ? 0 : _ref11$yoffset,\n          _ref11$zoffset = _ref11.zoffset,\n          zoffset = _ref11$zoffset === void 0 ? 0 : _ref11$zoffset,\n          _ref11$mipmapLevel = _ref11.mipmapLevel,\n          mipmapLevel = _ref11$mipmapLevel === void 0 ? 0 : _ref11$mipmapLevel,\n          _ref11$attachment = _ref11.attachment,\n          attachment = _ref11$attachment === void 0 ? 36064 : _ref11$attachment,\n          _ref11$x = _ref11.x,\n          x = _ref11$x === void 0 ? 0 : _ref11$x,\n          _ref11$y = _ref11.y,\n          y = _ref11$y === void 0 ? 0 : _ref11$y,\n          width = _ref11.width,\n          height = _ref11.height;\n      var gl = this.gl;\n      var prevHandle = gl.bindFramebuffer(36160, this.handle); // TODO - support gl.readBuffer (WebGL2 only)\n      // const prevBuffer = gl.readBuffer(attachment);\n\n      (0, _assert.default)(target || texture); // target\n\n      if (texture) {\n        width = Number.isFinite(width) ? width : texture.width;\n        height = Number.isFinite(height) ? height : texture.height;\n        texture.bind(0);\n      }\n\n      switch (texture.target) {\n        case 3553:\n        case 34067:\n          gl.copyTexSubImage2D(target || texture.target, mipmapLevel, xoffset, yoffset, x, y, width, height);\n          break;\n\n        case 35866:\n        case 32879:\n          gl.copyTexSubImage3D(target || texture.target, mipmapLevel, xoffset, yoffset, zoffset, x, y, width, height);\n          break;\n\n        default:\n      }\n\n      if (texture) {\n        texture.unbind();\n      }\n\n      gl.bindFramebuffer(36160, prevHandle || null);\n      return texture;\n    } // WEBGL2 INTERFACE\n    // Copies a rectangle of pixels between framebuffers\n    // eslint-disable-next-line complexity\n\n  }, {\n    key: \"blit\",\n    value: function blit(_ref12) {\n      var srcFramebuffer = _ref12.srcFramebuffer,\n          _ref12$attachment = _ref12.attachment,\n          attachment = _ref12$attachment === void 0 ? 36064 : _ref12$attachment,\n          _ref12$srcX = _ref12.srcX0,\n          srcX0 = _ref12$srcX === void 0 ? 0 : _ref12$srcX,\n          _ref12$srcY = _ref12.srcY0,\n          srcY0 = _ref12$srcY === void 0 ? 0 : _ref12$srcY,\n          srcX1 = _ref12.srcX1,\n          srcY1 = _ref12.srcY1,\n          _ref12$dstX = _ref12.dstX0,\n          dstX0 = _ref12$dstX === void 0 ? 0 : _ref12$dstX,\n          _ref12$dstY = _ref12.dstY0,\n          dstY0 = _ref12$dstY === void 0 ? 0 : _ref12$dstY,\n          dstX1 = _ref12.dstX1,\n          dstY1 = _ref12.dstY1,\n          _ref12$color = _ref12.color,\n          color = _ref12$color === void 0 ? true : _ref12$color,\n          _ref12$depth = _ref12.depth,\n          depth = _ref12$depth === void 0 ? false : _ref12$depth,\n          _ref12$stencil = _ref12.stencil,\n          stencil = _ref12$stencil === void 0 ? false : _ref12$stencil,\n          _ref12$mask = _ref12.mask,\n          mask = _ref12$mask === void 0 ? 0 : _ref12$mask,\n          _ref12$filter = _ref12.filter,\n          filter = _ref12$filter === void 0 ? 9728 : _ref12$filter;\n      var gl = this.gl;\n      (0, _webglUtils.assertWebGL2Context)(gl);\n\n      if (!srcFramebuffer.handle && attachment === 36064) {\n        attachment = 1028;\n      }\n\n      if (color) {\n        mask |= 16384;\n      }\n\n      if (depth) {\n        mask |= 256;\n      }\n\n      if (stencil) {\n        mask |= 1024;\n      }\n\n      (0, _assert.default)(mask);\n      srcX1 = srcX1 === undefined ? srcFramebuffer.width : srcX1;\n      srcY1 = srcY1 === undefined ? srcFramebuffer.height : srcY1;\n      dstX1 = dstX1 === undefined ? this.width : dstX1;\n      dstY1 = dstY1 === undefined ? this.height : dstY1;\n      var prevDrawHandle = gl.bindFramebuffer(36009, this.handle);\n      var prevReadHandle = gl.bindFramebuffer(36008, srcFramebuffer.handle);\n      gl.readBuffer(attachment);\n      gl.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);\n      gl.readBuffer(this.readBuffer);\n      gl.bindFramebuffer(36008, prevReadHandle || null);\n      gl.bindFramebuffer(36009, prevDrawHandle || null);\n      return this;\n    } // signals to the GL that it need not preserve all pixels of a specified region of the framebuffer\n\n  }, {\n    key: \"invalidate\",\n    value: function invalidate(_ref13) {\n      var _ref13$attachments = _ref13.attachments,\n          attachments = _ref13$attachments === void 0 ? [] : _ref13$attachments,\n          _ref13$x = _ref13.x,\n          x = _ref13$x === void 0 ? 0 : _ref13$x,\n          _ref13$y = _ref13.y,\n          y = _ref13$y === void 0 ? 0 : _ref13$y,\n          width = _ref13.width,\n          height = _ref13.height;\n      var gl = this.gl;\n      (0, _webglUtils.assertWebGL2Context)(gl);\n      var prevHandle = gl.bindFramebuffer(36008, this.handle);\n      var invalidateAll = x === 0 && y === 0 && width === undefined && height === undefined;\n\n      if (invalidateAll) {\n        gl.invalidateFramebuffer(36008, attachments);\n      } else {\n        gl.invalidateFramebuffer(36008, attachments, x, y, width, height);\n      }\n\n      gl.bindFramebuffer(36008, prevHandle);\n      return this;\n    } // Return the value for `pname` of the specified attachment.\n    // The type returned is the type of the requested pname\n\n  }, {\n    key: \"getAttachmentParameter\",\n    value: function getAttachmentParameter(attachment, pname, keys) {\n      var value = this._getAttachmentParameterFallback(pname);\n\n      if (value === null) {\n        this.gl.bindFramebuffer(36160, this.handle);\n        value = this.gl.getFramebufferAttachmentParameter(36160, attachment, pname);\n        this.gl.bindFramebuffer(36160, null);\n      }\n\n      if (keys && value > 1000) {\n        value = (0, _constantsToKeys.glKey)(this.gl, value);\n      }\n\n      return value;\n    }\n  }, {\n    key: \"getAttachmentParameters\",\n    value: function getAttachmentParameters() {\n      var attachment = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 36064;\n      var keys = arguments.length > 1 ? arguments[1] : undefined;\n      var parameters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.constructor.ATTACHMENT_PARAMETERS || [];\n      var values = {};\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = parameters[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var pname = _step.value;\n          var key = keys ? (0, _constantsToKeys.glKey)(this.gl, pname) : pname;\n          values[key] = this.getAttachmentParameter(attachment, pname, keys);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return values;\n    }\n  }, {\n    key: \"getParameters\",\n    value: function getParameters() {\n      var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n      var attachments = Object.keys(this.attachments); // if (this === this.gl.luma.defaultFramebuffer) {\n      //   attachments = [GL.COLOR_ATTACHMENT0, GL.DEPTH_STENCIL_ATTACHMENT];\n      // }\n\n      var parameters = {};\n\n      for (var _i = 0; _i < attachments.length; _i++) {\n        var attachmentName = attachments[_i];\n        var attachment = Number(attachmentName);\n        var key = keys ? (0, _constantsToKeys.glKey)(this.gl, attachment) : attachment;\n        parameters[key] = this.getAttachmentParameters(attachment, keys);\n      }\n\n      return parameters;\n    } // DEBUG\n    // Note: Will only work when called in an event handler\n\n  }, {\n    key: \"show\",\n    value: function show() {\n      /* global window */\n      if (typeof window !== 'undefined') {\n        window.open(this.copyToDataUrl(), 'luma-debug-texture');\n      }\n\n      return this;\n    }\n  }, {\n    key: \"log\",\n    value: function log() {\n      var priority = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n      var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n      if (priority > _utils.log.priority || typeof window === 'undefined') {\n        return this;\n      }\n\n      message = message || \"Framebuffer \".concat(this.id);\n      var image = this.copyToDataUrl({\n        maxHeight: 100\n      });\n\n      _utils.log.image({\n        priority: priority,\n        message: message,\n        image: image\n      }, message)();\n\n      return this;\n    } // WEBGL INTERFACE\n\n  }, {\n    key: \"bind\",\n    value: function bind() {\n      var _ref14 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref14$target = _ref14.target,\n          target = _ref14$target === void 0 ? 36160 : _ref14$target;\n\n      this.gl.bindFramebuffer(target, this.handle);\n      return this;\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind() {\n      var _ref15 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref15$target = _ref15.target,\n          target = _ref15$target === void 0 ? 36160 : _ref15$target;\n\n      this.gl.bindFramebuffer(target, null);\n      return this;\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_createDefaultAttachments\",\n    value: function _createDefaultAttachments(color, depth, stencil, width, height) {\n      var defaultAttachments = null; // Add a color buffer if requested and not supplied\n\n      if (color) {\n        var _parameters;\n\n        defaultAttachments = defaultAttachments || {};\n        defaultAttachments[36064] = new _texture2d.default(this.gl, {\n          id: \"\".concat(this.id, \"-color0\"),\n          pixels: null,\n          // reserves texture memory, but texels are undefined\n          format: 6408,\n          type: 5121,\n          width: width,\n          height: height,\n          // Note: Mipmapping can be disabled by texture resource when we resize the texture\n          // to a non-power-of-two dimenstion (NPOT texture) under WebGL1. To have consistant\n          // behavior we always disable mipmaps.\n          mipmaps: false,\n          // Set MIN and MAG filtering parameters so mipmaps are not used in sampling.\n          // Set WRAP modes that support NPOT textures too.\n          parameters: (_parameters = {}, (0, _defineProperty2.default)(_parameters, 10241, 9728), (0, _defineProperty2.default)(_parameters, 10240, 9728), (0, _defineProperty2.default)(_parameters, 10242, 33071), (0, _defineProperty2.default)(_parameters, 10243, 33071), _parameters)\n        });\n      }\n\n      if (depth && stencil) {\n        // TODO - handle separate stencil\n        defaultAttachments = defaultAttachments || {};\n        defaultAttachments[33306] = new _renderbuffer.default(this.gl, {\n          id: \"\".concat(this.id, \"-depth-stencil\"),\n          format: 35056,\n          width: width,\n          height: 111\n        }); // TODO - optional texture\n        // new Texture2D(this.gl, {\n        //   id: `${this.id}-depth-stencil`,\n        //   format: GL.DEPTH24_STENCIL8,\n        //   dataFormat: GL.DEPTH_STENCIL,\n        //   type: GL.UNSIGNED_INT_24_8,\n        //   width,\n        //   height,\n        //   mipmaps: false\n        // });\n      } else if (depth) {\n        // Add a depth buffer if requested and not supplied\n        defaultAttachments = defaultAttachments || {};\n        defaultAttachments[36096] = new _renderbuffer.default(this.gl, {\n          id: \"\".concat(this.id, \"-depth\"),\n          format: 33189,\n          width: width,\n          height: height\n        });\n      } else if (stencil) {\n        // TODO - handle separate stencil\n        (0, _assert.default)(false);\n      }\n\n      return defaultAttachments;\n    }\n  }, {\n    key: \"_unattach\",\n    value: function _unattach(attachment) {\n      var oldAttachment = this.attachments[attachment];\n\n      if (!oldAttachment) {\n        return;\n      }\n\n      if (oldAttachment instanceof _renderbuffer.default) {\n        // render buffer\n        this.gl.framebufferRenderbuffer(36160, attachment, 36161, null);\n      } else {\n        // Must be a texture attachment\n        this.gl.framebufferTexture2D(36160, attachment, 3553, null, 0);\n      }\n\n      delete this.attachments[attachment];\n    }\n  }, {\n    key: \"_attachRenderbuffer\",\n    value: function _attachRenderbuffer(_ref16) {\n      var _ref16$attachment = _ref16.attachment,\n          attachment = _ref16$attachment === void 0 ? 36064 : _ref16$attachment,\n          renderbuffer = _ref16.renderbuffer;\n      var gl = this.gl; // TODO - is the bind needed?\n      // gl.bindRenderbuffer(GL.RENDERBUFFER, renderbuffer.handle);\n\n      gl.framebufferRenderbuffer(36160, attachment, 36161, renderbuffer.handle); // TODO - is the unbind needed?\n      // gl.bindRenderbuffer(GL.RENDERBUFFER, null);\n\n      this.attachments[attachment] = renderbuffer;\n    } // layer = 0 - index into Texture2DArray and Texture3D or face for `TextureCubeMap`\n    // level = 0 - mipmapLevel (must be 0 in WebGL1)\n\n  }, {\n    key: \"_attachTexture\",\n    value: function _attachTexture(_ref17) {\n      var _ref17$attachment = _ref17.attachment,\n          attachment = _ref17$attachment === void 0 ? 36064 : _ref17$attachment,\n          texture = _ref17.texture,\n          layer = _ref17.layer,\n          level = _ref17.level;\n      var gl = this.gl;\n      gl.bindTexture(texture.target, texture.handle);\n\n      switch (texture.target) {\n        case 35866:\n        case 32879:\n          gl.framebufferTextureLayer(36160, attachment, texture.target, level, layer);\n          break;\n\n        case 34067:\n          // layer must be a cubemap face (or if index, converted to cube map face)\n          var face = mapIndexToCubeMapFace(layer);\n          gl.framebufferTexture2D(36160, attachment, face, texture.handle, level);\n          break;\n\n        case 3553:\n          gl.framebufferTexture2D(36160, attachment, 3553, texture.handle, level);\n          break;\n\n        default:\n          (0, _assert.default)(false, 'Illegal texture type');\n      }\n\n      gl.bindTexture(texture.target, null);\n      this.attachments[attachment] = texture;\n    } // Expects framebuffer to be bound\n\n  }, {\n    key: \"_setReadBuffer\",\n    value: function _setReadBuffer(gl, readBuffer) {\n      if ((0, _webglUtils.isWebGL2)(gl)) {\n        gl.readBuffer(readBuffer);\n      } else {\n        // Setting to color attachment 0 is a noop, so allow it in WebGL1\n        (0, _assert.default)(readBuffer === 36064 || readBuffer === 1029, ERR_MULTIPLE_RENDERTARGETS);\n      }\n\n      this.readBuffer = readBuffer;\n    } // Expects framebuffer to be bound\n\n  }, {\n    key: \"_setDrawBuffers\",\n    value: function _setDrawBuffers(gl, drawBuffers) {\n      if ((0, _webglUtils.isWebGL2)(gl)) {\n        gl.drawBuffers(drawBuffers);\n      } else {\n        var ext = gl.getExtension('WEBGL.draw_buffers');\n\n        if (ext) {\n          ext.drawBuffersWEBGL(drawBuffers);\n        } else {\n          // Setting a single draw buffer to color attachment 0 is a noop, allow in WebGL1\n          (0, _assert.default)(drawBuffers.length === 1 && (drawBuffers[0] === 36064 || drawBuffers[0] === 1029), ERR_MULTIPLE_RENDERTARGETS);\n        }\n      }\n\n      this.drawBuffers = drawBuffers;\n    } // Attempt to provide workable defaults for WebGL2 symbols under WebGL1\n    // null means OK to query\n    // TODO - move to webgl1 polyfills\n\n    /* eslint-disable complexity */\n\n  }, {\n    key: \"_getAttachmentParameterFallback\",\n    value: function _getAttachmentParameterFallback(pname) {\n      var caps = (0, _contextFeatures.getFeatures)(this.gl);\n\n      switch (pname) {\n        case 36052:\n          // GLint\n          return !caps.webgl2 ? 0 : null;\n\n        case 33298: // GLint\n\n        case 33299: // GLint\n\n        case 33300: // GLint\n\n        case 33301: // GLint\n\n        case 33302: // GLint\n\n        case 33303:\n          // GLint\n          return !caps.webgl2 ? 8 : null;\n\n        case 33297:\n          // GLenum\n          return !caps.webgl2 ? 5125 : null;\n\n        case 33296:\n          return !caps.webgl2 && !caps.EXT_sRGB ? 9729 : null;\n\n        default:\n          return null;\n      }\n    }\n    /* eslint-enable complexity */\n    // RESOURCE METHODS\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createFramebuffer();\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      this.gl.deleteFramebuffer(this.handle);\n    }\n  }, {\n    key: \"_bindHandle\",\n    value: function _bindHandle(handle) {\n      return this.gl.bindFramebuffer(36160, handle);\n    }\n  }, {\n    key: \"color\",\n    get: function get() {\n      return this.attachments[36064] || null;\n    }\n  }, {\n    key: \"texture\",\n    get: function get() {\n      return this.attachments[36064] || null;\n    }\n  }, {\n    key: \"depth\",\n    get: function get() {\n      return this.attachments[36096] || this.attachments[33306] || null;\n    }\n  }, {\n    key: \"stencil\",\n    get: function get() {\n      return this.attachments[36128] || this.attachments[33306] || null;\n    }\n  }]);\n  return Framebuffer;\n}(_resource.default); // PUBLIC METHODS\n// Map an index to a cube map face constant\n\n\nexports.default = Framebuffer;\n\nfunction mapIndexToCubeMapFace(layer) {\n  // TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)\n  // if smaller assume layer is index, otherwise assume it is already a cube map face constant\n  return layer < 34069 ? layer + 34069 : layer;\n} // Helper METHODS\n// Get a string describing the framebuffer error if installed\n\n\nfunction _getFrameBufferStatus(status) {\n  // Use error mapping if installed\n  var STATUS = Framebuffer.STATUS || {};\n  return STATUS[status] || \"Framebuffer error \".concat(status);\n}\n\nvar FRAMEBUFFER_ATTACHMENT_PARAMETERS = [36049, // WebGLRenderbuffer or WebGLTexture\n36048, // GL.RENDERBUFFER, GL.TEXTURE, GL.NONE\n// GL.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, // GL.TEXTURE_CUBE_MAP_POSITIVE_X, etc.\n// GL.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, // GLint\n// EXT_sRGB or WebGL2\n33296, // GL.LINEAR, GL.SRBG\n// WebGL2\n// GL.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, // GLint\n33298, // GLint\n33299, // GLint\n33300, // GLint\n33301, // GLint\n33302, // GLint\n33303 // GLint\n// GL.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\n// GL.FLOAT, GL.INT, GL.UNSIGNED_INT, GL.SIGNED_NORMALIZED, OR GL.UNSIGNED_NORMALIZED.\n];\nexports.FRAMEBUFFER_ATTACHMENT_PARAMETERS = FRAMEBUFFER_ATTACHMENT_PARAMETERS;\nFramebuffer.ATTACHMENT_PARAMETERS = FRAMEBUFFER_ATTACHMENT_PARAMETERS;\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./resource\":\"LE4Y\",\"./texture-2d\":\"aCs7\",\"./renderbuffer\":\"OYcf\",\"./buffer\":\"IZPG\",\"./clear\":\"mZdw\",\"../webgl-context\":\"rNTT\",\"../webgl-context/context-features\":\"T1Gu\",\"../webgl-utils/typed-array-utils\":\"v5qF\",\"../webgl-utils/format-utils\":\"yuwK\",\"../webgl-utils\":\"CTd0\",\"../webgl-utils/constants-to-keys\":\"d71e\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"MaRe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable no-inline-comments */\nvar Sampler =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(Sampler, _Resource);\n  (0, _createClass2.default)(Sampler, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      return (0, _webglUtils.isWebGL2)(gl);\n    }\n  }]);\n\n  function Sampler(gl, opts) {\n    var _this;\n\n    (0, _classCallCheck2.default)(this, Sampler);\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Sampler).call(this, gl, opts));\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  } // Bind to the same texture unit as a texture to control sampling for that texture\n  // @param {GLuint} unit - texture unit index\n\n\n  (0, _createClass2.default)(Sampler, [{\n    key: \"bind\",\n    value: function bind(unit) {\n      this.gl.bindSampler(unit, this.handle);\n      return this;\n    }\n  }, {\n    key: \"unbind\",\n    value: function unbind(unit) {\n      this.gl.bindSampler(unit, null);\n      return this;\n    } // RESOURCE METHODS\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createSampler();\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      this.gl.deleteSampler(this.handle);\n    }\n  }, {\n    key: \"_getParameter\",\n    value: function _getParameter(pname) {\n      return this.gl.getSamplerParameter(this.handle, pname);\n    }\n  }, {\n    key: \"_setParameter\",\n    value: function _setParameter(pname, param) {\n      // Apparently there are some conversion integer/float rules that made\n      // the WebGL committe expose two parameter setting functions in JavaScript.\n      // For now, pick the float version for parameters specified as GLfloat.\n      switch (pname) {\n        case 33082:\n        case 33083:\n          this.gl.samplerParameterf(this.handle, pname, param);\n          break;\n\n        default:\n          this.gl.samplerParameteri(this.handle, pname, param);\n          break;\n      }\n\n      return this;\n    }\n  }]);\n  return Sampler;\n}(_resource.default);\n\nexports.default = Sampler;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"../webgl-utils\":\"CTd0\",\"./resource\":\"LE4Y\"}],\"InTr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.parseUniformName = parseUniformName;\nexports.getUniformSetter = getUniformSetter;\nexports.checkUniformValues = checkUniformValues;\nexports.areUniformsEqual = areUniformsEqual;\nexports.getUniformCopy = getUniformCopy;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _framebuffer = _interopRequireDefault(require(\"./framebuffer\"));\n\nvar _renderbuffer = _interopRequireDefault(require(\"./renderbuffer\"));\n\nvar _texture = _interopRequireDefault(require(\"./texture\"));\n\nvar _sampler = _interopRequireDefault(require(\"./sampler\"));\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _UNIFORM_SETTERS;\n\nvar UNIFORM_SETTERS = (_UNIFORM_SETTERS = {}, (0, _defineProperty2.default)(_UNIFORM_SETTERS, 5126, function (gl, location, value) {\n  return gl.uniform1fv(location, toFloatArray(value, 1));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35664, function (gl, location, value) {\n  return gl.uniform2fv(location, toFloatArray(value, 2));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35665, function (gl, location, value) {\n  return gl.uniform3fv(location, toFloatArray(value, 3));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35666, function (gl, location, value) {\n  return gl.uniform4fv(location, toFloatArray(value, 4));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 5124, function (gl, location, value) {\n  return gl.uniform1iv(location, toIntArray(value, 1));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35667, function (gl, location, value) {\n  return gl.uniform2iv(location, toIntArray(value, 2));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35668, function (gl, location, value) {\n  return gl.uniform3iv(location, toIntArray(value, 3));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35669, function (gl, location, value) {\n  return gl.uniform4iv(location, toIntArray(value, 4));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35670, function (gl, location, value) {\n  return gl.uniform1iv(location, toIntArray(value, 1));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35671, function (gl, location, value) {\n  return gl.uniform2iv(location, toIntArray(value, 2));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35672, function (gl, location, value) {\n  return gl.uniform3iv(location, toIntArray(value, 3));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35673, function (gl, location, value) {\n  return gl.uniform4iv(location, toIntArray(value, 4));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35674, function (gl, location, value) {\n  return gl.uniformMatrix2fv(location, false, toFloatArray(value, 4));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35675, function (gl, location, value) {\n  return gl.uniformMatrix3fv(location, false, toFloatArray(value, 9));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35676, function (gl, location, value) {\n  return gl.uniformMatrix4fv(location, false, toFloatArray(value, 16));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35678, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35680, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 5125, function (gl, location, value) {\n  return gl.uniform1uiv(location, toUIntArray(value, 1));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36294, function (gl, location, value) {\n  return gl.uniform2uiv(location, toUIntArray(value, 2));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36295, function (gl, location, value) {\n  return gl.uniform3uiv(location, toUIntArray(value, 3));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36296, function (gl, location, value) {\n  return gl.uniform4uiv(location, toUIntArray(value, 4));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35685, function (gl, location, value) {\n  return gl.uniformMatrix2x3fv(location, false, toFloatArray(value, 6));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35686, function (gl, location, value) {\n  return gl.uniformMatrix2x4fv(location, false, toFloatArray(value, 8));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35687, function (gl, location, value) {\n  return gl.uniformMatrix3x2fv(location, false, toFloatArray(value, 6));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35688, function (gl, location, value) {\n  return gl.uniformMatrix3x4fv(location, false, toFloatArray(value, 12));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35689, function (gl, location, value) {\n  return gl.uniformMatrix4x2fv(location, false, toFloatArray(value, 8));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35690, function (gl, location, value) {\n  return gl.uniformMatrix4x3fv(location, false, toFloatArray(value, 12));\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35679, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 35682, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36289, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36292, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36293, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36298, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36299, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36300, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36303, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36306, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36307, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36308, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), (0, _defineProperty2.default)(_UNIFORM_SETTERS, 36311, function (gl, location, value) {\n  return gl.uniform1i(location, value);\n}), _UNIFORM_SETTERS); // Pre-allocated typed arrays for temporary conversion\n\nvar FLOAT_ARRAY = {};\nvar INT_ARRAY = {};\nvar UINT_ARRAY = {};\nvar array1 = [0]; // Functions to ensure the type of uniform values\n// TODO - Why is this necessary? The uniform*v funtions can consume Arrays\n\nfunction toTypedArray(value, uniformLength, Type, cache) {\n  // convert boolean uniforms to Number\n  if (uniformLength === 1 && typeof value === 'boolean') {\n    value = value ? 1 : 0;\n  }\n\n  if (Number.isFinite(value)) {\n    array1[0] = value;\n    value = array1;\n  }\n\n  var length = value.length;\n\n  if (length % uniformLength) {\n    _utils.log.warn(\"Uniform size should be multiples of \".concat(uniformLength), value)();\n  }\n\n  if (value instanceof Type) {\n    return value;\n  }\n\n  var result = cache[length];\n\n  if (!result) {\n    result = new Type(length);\n    cache[length] = result;\n  }\n\n  for (var i = 0; i < length; i++) {\n    result[i] = value[i];\n  }\n\n  return result;\n}\n\nfunction toFloatArray(value, uniformLength) {\n  return toTypedArray(value, uniformLength, Float32Array, FLOAT_ARRAY);\n}\n\nfunction toIntArray(value, uniformLength) {\n  return toTypedArray(value, uniformLength, Int32Array, INT_ARRAY);\n}\n\nfunction toUIntArray(value, uniformLength) {\n  return toTypedArray(value, uniformLength, Uint32Array, UINT_ARRAY);\n}\n\nfunction parseUniformName(name) {\n  // Shortcut to avoid redundant or bad matches\n  if (name[name.length - 1] !== ']') {\n    return {\n      name: name,\n      length: 1,\n      isArray: false\n    };\n  } // if array name then clean the array brackets\n\n\n  var UNIFORM_NAME_REGEXP = /([^\\[]*)(\\[[0-9]+\\])?/;\n  var matches = name.match(UNIFORM_NAME_REGEXP);\n\n  if (!matches || matches.length < 2) {\n    throw new Error(\"Failed to parse GLSL uniform name \".concat(name));\n  }\n\n  return {\n    name: matches[1],\n    length: matches[2] || 1,\n    isArray: Boolean(matches[2])\n  };\n} // Returns a Magic Uniform Setter\n\n/* eslint-disable complexity */\n\n\nfunction getUniformSetter(gl, location, info) {\n  var setter = UNIFORM_SETTERS[info.type];\n\n  if (!setter) {\n    throw new Error(\"Unknown GLSL uniform type \".concat(info.type));\n  }\n\n  return setter.bind(null, gl, location);\n} // Basic checks of uniform values (with or without knowledge of program)\n// To facilitate early detection of e.g. undefined values in JavaScript\n\n\nfunction checkUniformValues(uniforms, source, uniformMap) {\n  for (var uniformName in uniforms) {\n    var value = uniforms[uniformName];\n    var shouldCheck = !uniformMap || Boolean(uniformMap[uniformName]);\n\n    if (shouldCheck && !checkUniformValue(value)) {\n      // Add space to source\n      source = source ? \"\".concat(source, \" \") : ''; // Value could be unprintable so write the object on console\n\n      console.error(\"\".concat(source, \" Bad uniform \").concat(uniformName), value); // eslint-disable-line\n\n      /* eslint-enable no-console */\n\n      throw new Error(\"\".concat(source, \" Bad uniform \").concat(uniformName));\n    }\n  }\n\n  return true;\n} // TODO use type information during validation\n\n\nfunction checkUniformValue(value) {\n  if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n    return checkUniformArray(value);\n  } // Check if single value is a number\n\n\n  if (isFinite(value)) {\n    return true;\n  } else if (value === true || value === false) {\n    return true;\n  } else if (value instanceof _texture.default || value instanceof _sampler.default) {\n    return true;\n  } else if (value instanceof _renderbuffer.default) {\n    return true;\n  } else if (value instanceof _framebuffer.default) {\n    return Boolean(value.texture);\n  }\n\n  return false;\n}\n\nfunction checkUniformArray(value) {\n  // Check that every element in array is a number, and at least 1 element\n  if (value.length === 0) {\n    return false;\n  }\n\n  var checkLength = Math.min(value.length, 16);\n\n  for (var i = 0; i < checkLength; ++i) {\n    if (!Number.isFinite(value[i])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n/**\n * Given two values of a uniform, returns `true` if they are equal\n */\n\n\nfunction areUniformsEqual(uniform1, uniform2) {\n  if (Array.isArray(uniform1) || ArrayBuffer.isView(uniform1)) {\n    if (!uniform2) {\n      return false;\n    }\n\n    var len = uniform1.length;\n\n    if (uniform2.length !== len) {\n      return false;\n    }\n\n    for (var i = 0; i < len; i++) {\n      if (uniform1[i] !== uniform2[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return uniform1 === uniform2;\n}\n/**\n * Creates a copy of the uniform\n */\n\n\nfunction getUniformCopy(uniform) {\n  if (Array.isArray(uniform) || ArrayBuffer.isView(uniform)) {\n    return uniform.slice();\n  }\n\n  return uniform;\n}\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"./framebuffer\":\"V5nt\",\"./renderbuffer\":\"OYcf\",\"./texture\":\"m3Lc\",\"./sampler\":\"MaRe\",\"../utils\":\"B7AM\"}],\"q52h\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPrimitiveDrawMode = getPrimitiveDrawMode;\nexports.getPrimitiveCount = getPrimitiveCount;\nexports.getVertexCount = getVertexCount;\nexports.decomposeCompositeGLType = decomposeCompositeGLType;\nexports.getCompositeGLType = getCompositeGLType;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _COMPOSITE_GL_TYPES;\n/* eslint-disable camelcase */\n\n\nvar GL_BYTE = 0x1400;\nvar GL_UNSIGNED_BYTE = 0x1401;\nvar GL_SHORT = 0x1402;\nvar GL_UNSIGNED_SHORT = 0x1403;\nvar GL_POINTS = 0x0;\nvar GL_LINES = 0x1;\nvar GL_LINE_LOOP = 0x2;\nvar GL_LINE_STRIP = 0x3;\nvar GL_TRIANGLES = 0x4;\nvar GL_TRIANGLE_STRIP = 0x5;\nvar GL_TRIANGLE_FAN = 0x6; // Local constants - these will \"collapse\" during minification\n\nvar GL_FLOAT = 0x1406;\nvar GL_FLOAT_VEC2 = 0x8b50;\nvar GL_FLOAT_VEC3 = 0x8b51;\nvar GL_FLOAT_VEC4 = 0x8b52;\nvar GL_INT = 0x1404;\nvar GL_INT_VEC2 = 0x8b53;\nvar GL_INT_VEC3 = 0x8b54;\nvar GL_INT_VEC4 = 0x8b55;\nvar GL_UNSIGNED_INT = 0x1405;\nvar GL_UNSIGNED_INT_VEC2 = 0x8dc6;\nvar GL_UNSIGNED_INT_VEC3 = 0x8dc7;\nvar GL_UNSIGNED_INT_VEC4 = 0x8dc8;\nvar GL_BOOL = 0x8b56;\nvar GL_BOOL_VEC2 = 0x8b57;\nvar GL_BOOL_VEC3 = 0x8b58;\nvar GL_BOOL_VEC4 = 0x8b59;\nvar GL_FLOAT_MAT2 = 0x8b5a;\nvar GL_FLOAT_MAT3 = 0x8b5b;\nvar GL_FLOAT_MAT4 = 0x8b5c;\nvar GL_FLOAT_MAT2x3 = 0x8b65;\nvar GL_FLOAT_MAT2x4 = 0x8b66;\nvar GL_FLOAT_MAT3x2 = 0x8b67;\nvar GL_FLOAT_MAT3x4 = 0x8b68;\nvar GL_FLOAT_MAT4x2 = 0x8b69;\nvar GL_FLOAT_MAT4x3 = 0x8b6a; // Composite types table\n\nvar COMPOSITE_GL_TYPES = (_COMPOSITE_GL_TYPES = {}, (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT, [GL_FLOAT, 1, 'float']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC2, [GL_FLOAT, 2, 'vec2']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC3, [GL_FLOAT, 3, 'vec3']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC4, [GL_FLOAT, 4, 'vec4']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_INT, [GL_INT, 1, 'int']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC2, [GL_INT, 2, 'ivec2']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC3, [GL_INT, 3, 'ivec3']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC4, [GL_INT, 4, 'ivec4']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT, [GL_UNSIGNED_INT, 1, 'uint']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC2, [GL_UNSIGNED_INT, 2, 'uvec2']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC3, [GL_UNSIGNED_INT, 3, 'uvec3']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC4, [GL_UNSIGNED_INT, 4, 'uvec4']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_BOOL, [GL_FLOAT, 1, 'bool']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC2, [GL_FLOAT, 2, 'bvec2']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC3, [GL_FLOAT, 3, 'bvec3']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC4, [GL_FLOAT, 4, 'bvec4']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2, [GL_FLOAT, 8, 'mat2']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2x3, [GL_FLOAT, 8, 'mat2x3']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2x4, [GL_FLOAT, 8, 'mat2x4']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3, [GL_FLOAT, 12, 'mat3']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3x2, [GL_FLOAT, 12, 'mat3x2']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3x4, [GL_FLOAT, 12, 'mat3x4']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4, [GL_FLOAT, 16, 'mat4']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4x2, [GL_FLOAT, 16, 'mat4x2']), (0, _defineProperty2.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4x3, [GL_FLOAT, 16, 'mat4x3']), _COMPOSITE_GL_TYPES); // Counts the number of complete primitives given a number of vertices and a drawMode\n\nfunction getPrimitiveDrawMode(drawMode) {\n  switch (drawMode) {\n    case GL_POINTS:\n      return GL_POINTS;\n\n    case GL_LINES:\n      return GL_LINES;\n\n    case GL_LINE_STRIP:\n      return GL_LINES;\n\n    case GL_LINE_LOOP:\n      return GL_LINES;\n\n    case GL_TRIANGLES:\n      return GL_TRIANGLES;\n\n    case GL_TRIANGLE_STRIP:\n      return GL_TRIANGLES;\n\n    case GL_TRIANGLE_FAN:\n      return GL_TRIANGLES;\n\n    default:\n      (0, _assert.default)(false);\n      return 0;\n  }\n} // Counts the number of complete \"primitives\" given a number of vertices and a drawMode\n\n\nfunction getPrimitiveCount(_ref) {\n  var drawMode = _ref.drawMode,\n      vertexCount = _ref.vertexCount;\n\n  switch (drawMode) {\n    case GL_POINTS:\n    case GL_LINE_LOOP:\n      return vertexCount;\n\n    case GL_LINES:\n      return vertexCount / 2;\n\n    case GL_LINE_STRIP:\n      return vertexCount - 1;\n\n    case GL_TRIANGLES:\n      return vertexCount / 3;\n\n    case GL_TRIANGLE_STRIP:\n    case GL_TRIANGLE_FAN:\n      return vertexCount - 2;\n\n    default:\n      (0, _assert.default)(false);\n      return 0;\n  }\n} // Counts the number of vertices after splitting the vertex stream into separate \"primitives\"\n\n\nfunction getVertexCount(_ref2) {\n  var drawMode = _ref2.drawMode,\n      vertexCount = _ref2.vertexCount;\n  var primitiveCount = getPrimitiveCount({\n    drawMode: drawMode,\n    vertexCount: vertexCount\n  });\n\n  switch (getPrimitiveDrawMode(drawMode)) {\n    case GL_POINTS:\n      return primitiveCount;\n\n    case GL_LINES:\n      return primitiveCount * 2;\n\n    case GL_TRIANGLES:\n      return primitiveCount * 3;\n\n    default:\n      (0, _assert.default)(false);\n      return 0;\n  }\n} // Decomposes a composite type GL.VEC3 into a basic type (GL.FLOAT) and components (3)\n\n\nfunction decomposeCompositeGLType(compositeGLType) {\n  var typeAndSize = COMPOSITE_GL_TYPES[compositeGLType];\n\n  if (!typeAndSize) {\n    return null;\n  }\n\n  var _typeAndSize = (0, _slicedToArray2.default)(typeAndSize, 2),\n      type = _typeAndSize[0],\n      components = _typeAndSize[1];\n\n  return {\n    type: type,\n    components: components\n  };\n}\n\nfunction getCompositeGLType(type, components) {\n  switch (type) {\n    case GL_BYTE:\n    case GL_UNSIGNED_BYTE:\n    case GL_SHORT:\n    case GL_UNSIGNED_SHORT:\n      type = GL_FLOAT;\n      break;\n\n    default:\n  }\n\n  for (var glType in COMPOSITE_GL_TYPES) {\n    var _COMPOSITE_GL_TYPES$g = (0, _slicedToArray2.default)(COMPOSITE_GL_TYPES[glType], 3),\n        compType = _COMPOSITE_GL_TYPES$g[0],\n        compComponents = _COMPOSITE_GL_TYPES$g[1],\n        name = _COMPOSITE_GL_TYPES$g[2];\n\n    if (compType === type && compComponents === components) {\n      return {\n        glType: glType,\n        name: name\n      };\n    }\n  }\n\n  return null;\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"../utils/assert\":\"iVaU\"}],\"yNKH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _accessor = _interopRequireDefault(require(\"./accessor\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Contains metadata describing attribute configurations for a program's shaders\n// Much of this is automatically extracted from shaders after program linking\nvar ProgramConfiguration =\n/*#__PURE__*/\nfunction () {\n  function ProgramConfiguration(program) {\n    (0, _classCallCheck2.default)(this, ProgramConfiguration);\n    this.id = program.id;\n    this.attributeInfos = [];\n    this.attributeInfosByName = {};\n    this.varyingInfos = [];\n    this.varyingInfosByName = {};\n    Object.seal(this);\n\n    this._readAttributesFromProgram(program);\n\n    this._readVaryingsFromProgram(program);\n  }\n\n  (0, _createClass2.default)(ProgramConfiguration, [{\n    key: \"getAttributeInfo\",\n    value: function getAttributeInfo(locationOrName) {\n      var location = Number(locationOrName);\n\n      if (Number.isFinite(location)) {\n        return this.attributeInfos[location];\n      }\n\n      return this.attributeInfosByName[locationOrName] || null;\n    } // Resolves an attribute name or index to an index\n\n  }, {\n    key: \"getAttributeLocation\",\n    value: function getAttributeLocation(locationOrName) {\n      var attributeInfo = this.getAttributeInfo(locationOrName);\n      return attributeInfo ? attributeInfo.location : -1;\n    }\n  }, {\n    key: \"getAttributeAccessor\",\n    value: function getAttributeAccessor(locationOrName) {\n      var attributeInfo = this.getAttributeInfo(locationOrName);\n      return attributeInfo ? attributeInfo.accessor : null;\n    }\n  }, {\n    key: \"getVaryingInfo\",\n    value: function getVaryingInfo(locationOrName) {\n      var location = Number(locationOrName);\n\n      if (Number.isFinite(location)) {\n        return this.varyingInfos[location];\n      }\n\n      return this.varyingInfosByName[locationOrName] || null;\n    }\n  }, {\n    key: \"getVaryingIndex\",\n    value: function getVaryingIndex(locationOrName) {\n      var varying = this.getVaryingInfo();\n      return varying ? varying.location : -1;\n    }\n  }, {\n    key: \"getVaryingAccessor\",\n    value: function getVaryingAccessor(locationOrName) {\n      var varying = this.getVaryingInfo();\n      return varying ? varying.accessor : null;\n    } // PRIVATE METHODS\n    // linkProgram needs to have been called, although linking does not need to have been successful\n\n  }, {\n    key: \"_readAttributesFromProgram\",\n    value: function _readAttributesFromProgram(program) {\n      var gl = program.gl;\n      var count = gl.getProgramParameter(program.handle, 35721);\n\n      for (var index = 0; index < count; index++) {\n        var _gl$getActiveAttrib = gl.getActiveAttrib(program.handle, index),\n            name = _gl$getActiveAttrib.name,\n            type = _gl$getActiveAttrib.type,\n            size = _gl$getActiveAttrib.size;\n\n        var location = gl.getAttribLocation(program.handle, name); // Add only user provided attributes, for built-in attributes like\n        // `gl_InstanceID` locaiton will be < 0\n\n        if (location >= 0) {\n          this._addAttribute(location, name, type, size);\n        }\n      }\n\n      this.attributeInfos.sort(function (a, b) {\n        return a.location - b.location;\n      });\n    } // linkProgram needs to have been called, although linking does not need to have been successful\n\n  }, {\n    key: \"_readVaryingsFromProgram\",\n    value: function _readVaryingsFromProgram(program) {\n      var gl = program.gl;\n\n      if (!(0, _webglUtils.isWebGL2)(gl)) {\n        return;\n      }\n\n      var count = gl.getProgramParameter(program.handle, 35971);\n\n      for (var location = 0; location < count; location++) {\n        var _gl$getTransformFeedb = gl.getTransformFeedbackVarying(program.handle, location),\n            name = _gl$getTransformFeedb.name,\n            type = _gl$getTransformFeedb.type,\n            size = _gl$getTransformFeedb.size;\n\n        this._addVarying(location, name, type, size);\n      }\n\n      this.varyingInfos.sort(function (a, b) {\n        return a.location - b.location;\n      });\n    }\n  }, {\n    key: \"_addAttribute\",\n    value: function _addAttribute(location, name, compositeType, size) {\n      var _decomposeCompositeGL = (0, _attributeUtils.decomposeCompositeGLType)(compositeType),\n          type = _decomposeCompositeGL.type,\n          components = _decomposeCompositeGL.components;\n\n      var accessor = {\n        type: type,\n        size: size * components\n      };\n\n      this._inferProperties(location, name, accessor);\n\n      var attributeInfo = {\n        location: location,\n        name: name,\n        accessor: new _accessor.default(accessor)\n      }; // Base values\n\n      this.attributeInfos.push(attributeInfo);\n      this.attributeInfosByName[attributeInfo.name] = attributeInfo; // For quick name based lookup\n    } // Extract additional attribute metadata from shader names (based on attribute naming conventions)\n\n  }, {\n    key: \"_inferProperties\",\n    value: function _inferProperties(location, name, accessor) {\n      if (/instance/i.test(name)) {\n        // Any attribute containing the word \"instance\" will be assumed to be instanced\n        accessor.divisor = 1;\n      }\n    }\n  }, {\n    key: \"_addVarying\",\n    value: function _addVarying(location, name, compositeType, size) {\n      var _decomposeCompositeGL2 = (0, _attributeUtils.decomposeCompositeGLType)(compositeType),\n          type = _decomposeCompositeGL2.type,\n          components = _decomposeCompositeGL2.components;\n\n      var accessor = new _accessor.default({\n        type: type,\n        size: size * components\n      });\n      var varying = {\n        location: location,\n        name: name,\n        accessor: accessor\n      }; // Base values\n\n      this.varyingInfos.push(varying);\n      this.varyingInfosByName[varying.name] = varying; // For quick name based lookup\n    }\n  }]);\n  return ProgramConfiguration;\n}();\n\nexports.default = ProgramConfiguration;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./accessor\":\"E5yL\",\"../webgl-utils\":\"CTd0\",\"../webgl-utils/attribute-utils\":\"q52h\"}],\"xVcT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _get2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/get\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _texture = _interopRequireDefault(require(\"./texture\"));\n\nvar _framebuffer = _interopRequireDefault(require(\"./framebuffer\"));\n\nvar _uniforms = require(\"./uniforms\");\n\nvar _shader = require(\"./shader\");\n\nvar _programConfiguration = _interopRequireDefault(require(\"./program-configuration\"));\n\nvar _contextState = require(\"../webgl-context/context-state\");\n\nvar _uniforms2 = require(\"../webgl/uniforms\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\n\nvar _constantsToKeys = require(\"../webgl-utils/constants-to-keys\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable no-inline-comments */\nvar LOG_PROGRAM_PERF_PRIORITY = 4; // const GL_INTERLEAVED_ATTRIBS = 0x8C8C;\n\nvar GL_SEPARATE_ATTRIBS = 0x8c8d;\n\nvar Program =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(Program, _Resource);\n\n  function Program(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Program);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Program).call(this, gl, opts));\n\n    _this.stubRemovedMethods('Program', 'v6.0', ['setVertexArray', 'setAttributes', 'setBuffers', 'unsetBuffers', 'use', 'getUniformCount', 'getUniformInfo', 'getUniformLocation', 'getUniformValue', 'getVarying', 'getFragDataLocation', 'getAttachedShaders', 'getAttributeCount', 'getAttributeLocation', 'getAttributeInfo']); // Experimental flag to avoid deleting Program object while it is cached\n\n\n    _this._isCached = false;\n\n    _this.initialize(opts);\n\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n\n    _this._setId(opts.id);\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Program, [{\n    key: \"initialize\",\n    value: function initialize() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var vs = props.vs,\n          fs = props.fs,\n          varyings = props.varyings,\n          _props$bufferMode = props.bufferMode,\n          bufferMode = _props$bufferMode === void 0 ? GL_SEPARATE_ATTRIBS : _props$bufferMode; // Create shaders if needed\n\n      this.vs = typeof vs === 'string' ? new _shader.VertexShader(this.gl, {\n        id: \"\".concat(props.id, \"-vs\"),\n        source: vs\n      }) : vs;\n      this.fs = typeof fs === 'string' ? new _shader.FragmentShader(this.gl, {\n        id: \"\".concat(props.id, \"-fs\"),\n        source: fs\n      }) : fs;\n      (0, _assert.default)(this.vs instanceof _shader.VertexShader);\n      (0, _assert.default)(this.fs instanceof _shader.FragmentShader); // uniforms\n\n      this.uniforms = {};\n      this.samplers = {}; // Setup varyings if supplied\n\n      if (varyings) {\n        (0, _webglUtils.assertWebGL2Context)(this.gl);\n        this.varyings = varyings;\n        this.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n      }\n\n      this._compileAndLink();\n\n      this._readUniformLocationsFromLinkedProgram();\n\n      this.configuration = new _programConfiguration.default(this);\n      return this.setProps(props);\n    }\n  }, {\n    key: \"delete\",\n    value: function _delete() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      if (this._isCached) {\n        // This object is cached, do not delete\n        return this;\n      }\n\n      return (0, _get2.default)((0, _getPrototypeOf2.default)(Program.prototype), \"delete\", this).call(this, opts);\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('uniforms' in props) {\n        this.setUniforms(props.uniforms, props.samplers);\n      }\n\n      return this;\n    } // Another thing about the WebGL API is that there are so many ways to draw things.\n    // This function unifies those ways into a single call using common parameters with sane defaults\n\n  }, {\n    key: \"draw\",\n    value: function draw(_ref) {\n      var _this2 = this;\n\n      var logPriority = _ref.logPriority,\n          _ref$drawMode = _ref.drawMode,\n          drawMode = _ref$drawMode === void 0 ? 4 : _ref$drawMode,\n          vertexCount = _ref.vertexCount,\n          _ref$offset = _ref.offset,\n          offset = _ref$offset === void 0 ? 0 : _ref$offset,\n          start = _ref.start,\n          end = _ref.end,\n          _ref$isIndexed = _ref.isIndexed,\n          isIndexed = _ref$isIndexed === void 0 ? false : _ref$isIndexed,\n          _ref$indexType = _ref.indexType,\n          indexType = _ref$indexType === void 0 ? 5123 : _ref$indexType,\n          _ref$isInstanced = _ref.isInstanced,\n          isInstanced = _ref$isInstanced === void 0 ? false : _ref$isInstanced,\n          _ref$instanceCount = _ref.instanceCount,\n          instanceCount = _ref$instanceCount === void 0 ? 0 : _ref$instanceCount,\n          _ref$vertexArray = _ref.vertexArray,\n          vertexArray = _ref$vertexArray === void 0 ? null : _ref$vertexArray,\n          transformFeedback = _ref.transformFeedback,\n          framebuffer = _ref.framebuffer,\n          _ref$parameters = _ref.parameters,\n          parameters = _ref$parameters === void 0 ? {} : _ref$parameters,\n          _ref$uniforms = _ref.uniforms,\n          uniforms = _ref$uniforms === void 0 ? {} : _ref$uniforms,\n          _ref$samplers = _ref.samplers,\n          samplers = _ref$samplers === void 0 ? {} : _ref$samplers;\n\n      if (logPriority !== undefined) {\n        var fb = framebuffer ? framebuffer.id : 'default';\n        var message = \"mode=\".concat((0, _constantsToKeys.getKey)(this.gl, drawMode), \" verts=\").concat(vertexCount, \" \") + \"instances=\".concat(instanceCount, \" indexType=\").concat((0, _constantsToKeys.getKey)(this.gl, indexType), \" \") + \"isInstanced=\".concat(isInstanced, \" isIndexed=\").concat(isIndexed, \" \") + \"Framebuffer=\".concat(fb);\n\n        _utils.log.log(logPriority, message)();\n      }\n\n      this.gl.useProgram(this.handle); // TODO - move vertex array binding and transform feedback binding to withParameters?\n\n      (0, _assert.default)(vertexArray);\n      vertexArray.bindForDraw(vertexCount, instanceCount, function () {\n        if (uniforms) {\n          _utils.log.deprecated('Program.draw({uniforms})', 'Program.setUniforms(uniforms)');\n\n          _this2.setUniforms(uniforms, samplers);\n        }\n\n        _this2._bindTextures();\n\n        if (framebuffer !== undefined) {\n          parameters = Object.assign({}, parameters, {\n            framebuffer: framebuffer\n          });\n        }\n\n        if (transformFeedback) {\n          var primitiveMode = (0, _attributeUtils.getPrimitiveDrawMode)(drawMode);\n          transformFeedback.begin(primitiveMode);\n        }\n\n        (0, _contextState.withParameters)(_this2.gl, parameters, function () {\n          // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension\n          if (isIndexed && isInstanced) {\n            _this2.gl.drawElementsInstanced(drawMode, vertexCount, indexType, offset, instanceCount);\n          } else if (isIndexed && (0, _webglUtils.isWebGL2)(_this2.gl) && !isNaN(start) && !isNaN(end)) {\n            _this2.gl.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n          } else if (isIndexed) {\n            _this2.gl.drawElements(drawMode, vertexCount, indexType, offset);\n          } else if (isInstanced) {\n            _this2.gl.drawArraysInstanced(drawMode, offset, vertexCount, instanceCount);\n          } else {\n            _this2.gl.drawArrays(drawMode, offset, vertexCount);\n          }\n        });\n\n        if (transformFeedback) {\n          transformFeedback.end();\n        }\n      });\n      return this;\n    }\n  }, {\n    key: \"setSamplers\",\n    value: function setSamplers(samplers) {\n      Object.assign(this.samplers, samplers);\n    }\n  }, {\n    key: \"setUniforms\",\n    value: function setUniforms() {\n      var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var samplers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      var _onChangeCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {}; // Simple change detection - if all uniforms are unchanged, do nothing\n      // TODO - Disabled since it interferes with textures\n      // we must still rebind texture units to current program's textures before drawing\n      // If modifying, test with `picking` example on website\n\n\n      var somethingChanged = false;\n      var changedUniforms = {};\n\n      for (var key in uniforms) {\n        if (!(0, _uniforms2.areUniformsEqual)(this.uniforms[key], uniforms[key])) {\n          somethingChanged = true;\n          changedUniforms[key] = uniforms[key];\n          this.uniforms[key] = (0, _uniforms2.getUniformCopy)(uniforms[key]);\n        }\n      }\n\n      if (somethingChanged) {\n        _onChangeCallback();\n\n        (0, _uniforms2.checkUniformValues)(changedUniforms, this.id, this._uniformSetters);\n        Object.assign(this.samplers, samplers);\n\n        this._setUniforms(changedUniforms);\n      }\n\n      return this;\n    } // PRIVATE METHODS\n    // This needs to be done before every draw call\n\n  }, {\n    key: \"_bindTextures\",\n    value: function _bindTextures() {\n      for (var uniformName in this.uniforms) {\n        var uniformSetter = this._uniformSetters[uniformName];\n\n        if (uniformSetter && uniformSetter.textureIndex !== undefined) {\n          var uniform = this.uniforms[uniformName];\n          var sampler = this.samplers[uniformName];\n\n          if (uniform instanceof _framebuffer.default) {\n            uniform = uniform.texture;\n          }\n\n          if (uniform instanceof _texture.default) {\n            // Bind texture to index\n            uniform.bind(uniformSetter.textureIndex);\n          } // Bind a sampler (if supplied) to index\n\n\n          if (sampler) {\n            sampler.bind(uniformSetter.textureIndex);\n          }\n        }\n      }\n    } // Apply a set of uniform values to a program\n    // Only uniforms actually present in the linked program will be updated.\n\n    /* eslint-disable max-depth */\n\n  }, {\n    key: \"_setUniforms\",\n    value: function _setUniforms(uniforms) {\n      this.gl.useProgram(this.handle);\n\n      for (var uniformName in uniforms) {\n        var uniform = uniforms[uniformName];\n        var uniformSetter = this._uniformSetters[uniformName];\n\n        if (uniformSetter) {\n          if (uniform instanceof _framebuffer.default) {\n            uniform = uniform.texture;\n          }\n\n          if (uniform instanceof _texture.default) {\n            if (uniformSetter.textureIndex === undefined) {\n              uniformSetter.textureIndex = this._textureIndexCounter++;\n            } // Bind texture to index\n\n\n            var texture = uniform;\n            var textureIndex = uniformSetter.textureIndex;\n            texture.bind(textureIndex); // Set the uniform sampler to the texture index\n\n            uniformSetter(textureIndex);\n          } else {\n            // Just set the value\n            uniformSetter(uniform);\n          }\n        }\n      }\n\n      return this;\n    } // RESOURCE METHODS\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createProgram();\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      this.gl.deleteProgram(this.handle);\n    } // Extract opts needed to initialize a `Program` from an independently created WebGLProgram handle\n\n  }, {\n    key: \"_getOptionsFromHandle\",\n    value: function _getOptionsFromHandle(handle) {\n      var shaderHandles = this.gl.getAttachedShaders(handle);\n      var opts = {};\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = shaderHandles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var shaderHandle = _step.value;\n          var type = this.gl.getShaderParameter(this.handle, 35663);\n\n          switch (type) {\n            case 35633:\n              opts.vs = new _shader.VertexShader({\n                handle: shaderHandle\n              });\n              break;\n\n            case 35632:\n              opts.fs = new _shader.FragmentShader({\n                handle: shaderHandle\n              });\n              break;\n\n            default:\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return opts;\n    }\n  }, {\n    key: \"_getParameter\",\n    value: function _getParameter(pname) {\n      return this.gl.getProgramParameter(this.handle, pname);\n    } // If program is not named, name it after shader names\n    // TODO - this.id will already have been initialized\n\n  }, {\n    key: \"_setId\",\n    value: function _setId(id) {\n      if (!id) {\n        var programName = this._getName();\n\n        this.id = (0, _utils.uid)(programName);\n      }\n    } // Generate a default name for the program based on names of the shaders\n\n  }, {\n    key: \"_getName\",\n    value: function _getName() {\n      var programName = this.vs.getName() || this.fs.getName();\n      programName = programName.replace(/shader/i, '');\n      programName = programName ? \"\".concat(programName, \"-program\") : 'program';\n      return programName;\n    }\n  }, {\n    key: \"_compileAndLink\",\n    value: function _compileAndLink() {\n      var gl = this.gl;\n      gl.attachShader(this.handle, this.vs.handle);\n      gl.attachShader(this.handle, this.fs.handle);\n\n      _utils.log.time(LOG_PROGRAM_PERF_PRIORITY, \"linkProgram for \".concat(this._getName()))();\n\n      gl.linkProgram(this.handle);\n\n      _utils.log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, \"linkProgram for \".concat(this._getName()))(); // Avoid checking program linking error in production\n\n\n      if (gl.debug || _utils.log.priority > 0) {\n        gl.validateProgram(this.handle);\n        var linked = gl.getProgramParameter(this.handle, 35714);\n\n        if (!linked) {\n          throw new Error(\"Error linking: \".concat(gl.getProgramInfoLog(this.handle)));\n        }\n      }\n    } // query uniform locations and build name to setter map.\n\n  }, {\n    key: \"_readUniformLocationsFromLinkedProgram\",\n    value: function _readUniformLocationsFromLinkedProgram() {\n      var gl = this.gl;\n      this._uniformSetters = {};\n      this._uniformCount = this._getParameter(35718);\n\n      for (var i = 0; i < this._uniformCount; i++) {\n        var info = this.gl.getActiveUniform(this.handle, i);\n\n        var _parseUniformName = (0, _uniforms.parseUniformName)(info.name),\n            name = _parseUniformName.name,\n            isArray = _parseUniformName.isArray;\n\n        var location = gl.getUniformLocation(this.handle, name);\n        this._uniformSetters[name] = (0, _uniforms.getUniformSetter)(gl, location, info, isArray);\n      }\n\n      this._textureIndexCounter = 0;\n    } // stub for shader chache, should reset uniforms to default valiues\n\n  }, {\n    key: \"reset\",\n    value: function reset() {} // TO BE REMOVED in v7?\n    // Rretrieves information about active uniforms identifed by their indices (`uniformIndices`)\n    // https://\n    // developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/getActiveUniforms\n\n  }, {\n    key: \"getActiveUniforms\",\n    value: function getActiveUniforms(uniformIndices, pname) {\n      return this.gl.getActiveUniforms(this.handle, uniformIndices, pname);\n    } // Retrieves the index of a uniform block\n\n  }, {\n    key: \"getUniformBlockIndex\",\n    value: function getUniformBlockIndex(blockName) {\n      return this.gl.getUniformBlockIndex(this.handle, blockName);\n    } // Retrieves information about an active uniform block (`blockIndex`)\n    // https://\n    // developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/getActiveUniformBlockParameter\n\n  }, {\n    key: \"getActiveUniformBlockParameter\",\n    value: function getActiveUniformBlockParameter(blockIndex, pname) {\n      return this.gl.getActiveUniformBlockParameter(this.handle, blockIndex, pname);\n    } // Binds a uniform block (`blockIndex`) to a specific binding point (`blockBinding`)\n\n  }, {\n    key: \"uniformBlockBinding\",\n    value: function uniformBlockBinding(blockIndex, blockBinding) {\n      this.gl.uniformBlockBinding(this.handle, blockIndex, blockBinding);\n    }\n  }]);\n  return Program;\n}(_resource.default);\n\nexports.default = Program;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/get\":\"Lwpt\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./resource\":\"LE4Y\",\"./texture\":\"m3Lc\",\"./framebuffer\":\"V5nt\",\"./uniforms\":\"InTr\",\"./shader\":\"Y9vu\",\"./program-configuration\":\"yNKH\",\"../webgl-context/context-state\":\"ON2o\",\"../webgl/uniforms\":\"InTr\",\"../webgl-utils\":\"CTd0\",\"../webgl-utils/attribute-utils\":\"q52h\",\"../webgl-utils/constants-to-keys\":\"d71e\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"MCxn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _queryManager = _interopRequireDefault(require(\"../webgl-utils/query-manager\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar FenceSync =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(FenceSync, _Resource);\n  /*\n   * @class\n   * @param {WebGL2RenderingContext} gl\n   */\n\n  function FenceSync(gl, opts) {\n    var _this;\n\n    (0, _classCallCheck2.default)(this, FenceSync);\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(FenceSync).call(this, gl, opts)); // query manager needs a promise field\n\n    _this.promise = null;\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  }\n  /**\n   * The method is a no-op in the absence of the possibility of\n   * synchronizing between multiple GL contexts.\n   * Prevent commands from being added to GPU command queue.\n   * Note: commands can still be buffered in driver.\n   *\n   * @param {GLbitfield} flags\n   * @param {GLint64} timeout\n   * @return {Sync} status\n   */\n\n\n  (0, _createClass2.default)(FenceSync, [{\n    key: \"wait\",\n    value: function wait() {\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref$flags = _ref.flags,\n          flags = _ref$flags === void 0 ? 0 : _ref$flags,\n          _ref$timeout = _ref.timeout,\n          timeout = _ref$timeout === void 0 ? -1 : _ref$timeout;\n\n      this.gl.waitSync(this.handle, flags, timeout);\n      return this;\n    }\n    /**\n     * Block all CPU operations until fence is signalled\n     * @param {GLbitfield} flags\n     * @param {GLint64} timeout\n     * @return {GLenum} result\n     */\n\n  }, {\n    key: \"clientWait\",\n    value: function clientWait(_ref2) {\n      var _ref2$flags = _ref2.flags,\n          flags = _ref2$flags === void 0 ? 1 : _ref2$flags,\n          timeout = _ref2.timeout;\n      var result = this.gl.clientWaitSync(this.handle, flags, timeout); // TODO - map to boolean?\n\n      switch (result) {\n        case 37146:\n          // Indicates that sync object was signaled when this method was called.\n          break;\n\n        case 37147:\n          // Indicates that timeout time passed, sync object did not become signaled\n          break;\n\n        case 37148:\n          // Indicates that sync object was signaled before timeout expired.\n          break;\n\n        case 37149:\n          // Indicates that an error occurred during execution.\n          break;\n\n        default:\n      }\n\n      return result;\n    }\n  }, {\n    key: \"cancel\",\n    value: function cancel() {\n      _queryManager.default.cancelQuery(this);\n    }\n  }, {\n    key: \"isSignaled\",\n    value: function isSignaled() {\n      return this.getParameter(37140) === 37145;\n    } // TODO - Query manager needs these?\n\n  }, {\n    key: \"isResultAvailable\",\n    value: function isResultAvailable() {\n      return this.isSignaled();\n    }\n  }, {\n    key: \"getResult\",\n    value: function getResult() {\n      return this.isSignaled();\n    }\n  }, {\n    key: \"getParameter\",\n    value: function getParameter(pname) {\n      return this.gl.getSyncParameter(this.handle, pname);\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.fenceSync(37143, 0);\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      _queryManager.default.deleteQuery(this);\n\n      this.gl.deleteSync(this.handle);\n    }\n  }]);\n  return FenceSync;\n}(_resource.default);\n\nexports.default = FenceSync;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./resource\":\"LE4Y\",\"../webgl-utils\":\"CTd0\",\"../webgl-utils/query-manager\":\"Gm1D\"}],\"pbPK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _contextFeatures = require(\"../webgl-context/context-features\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _queryManager = _interopRequireDefault(require(\"../webgl-utils/query-manager\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// WebGL2 Query (also handles disjoint timer extensions)\nvar noop = function noop(x) {\n  return x;\n};\n\nvar ERR_GPU_DISJOINT = 'Disjoint GPU operation invalidated timer queries';\nvar ERR_TIMER_QUERY_NOT_SUPPORTED = 'Timer queries require \"EXT_disjoint_timer_query\" extension';\nvar GL_QUERY_COUNTER_BITS_EXT = 0x8864; // # bits in query result for the given target.\n\nvar GL_QUERY_RESULT = 0x8866; // Returns a GLuint containing the query result.\n\nvar GL_QUERY_RESULT_AVAILABLE = 0x8867; // whether query result is available.\n\nvar GL_TIME_ELAPSED_EXT = 0x88bf; // Elapsed time (in nanoseconds).\n\nvar GL_TIMESTAMP_EXT = 0x8e28; // The current time.\n\nvar GL_GPU_DISJOINT_EXT = 0x8fbb; // Whether GPU performed any disjoint operation.\n\nvar GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8c88; // #primitives written to feedback buffers\n\nvar GL_ANY_SAMPLES_PASSED = 0x8c2f; // Occlusion query (if drawing passed depth test)\n\nvar GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8d6a; // Occlusion query less accurate/faster version\n\nvar Query =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(Query, _Resource);\n  (0, _createClass2.default)(Query, null, [{\n    key: \"isSupported\",\n    // Returns true if Query is supported by the WebGL implementation\n    // Can also check whether timestamp queries are available.\n    value: function isSupported(gl) {\n      var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n      var webgl2 = (0, _webglUtils.isWebGL2)(gl); // Initial value\n\n      var hasTimerQuery = (0, _contextFeatures.hasFeatures)(gl, _contextFeatures.FEATURES.TIMER_QUERY);\n      var supported = webgl2 || hasTimerQuery;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = opts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var key = _step.value;\n\n          switch (key) {\n            case 'queries':\n              supported = supported && webgl2;\n              break;\n\n            case 'timers':\n              supported = supported && hasTimerQuery;\n              break;\n\n            case 'timestamps':\n              var queryCounterBits = hasTimerQuery ? gl.getQuery(GL_TIMESTAMP_EXT, GL_QUERY_COUNTER_BITS_EXT) : 0;\n              supported = supported && queryCounterBits > 0;\n              break;\n\n            default:\n              (0, _assert.default)(false);\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return supported;\n    } // Create a query class\n\n  }]);\n\n  function Query(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Query);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Query).call(this, gl, opts));\n    var _opts$onComplete = opts.onComplete,\n        onComplete = _opts$onComplete === void 0 ? noop : _opts$onComplete,\n        _opts$onError = opts.onError,\n        onError = _opts$onError === void 0 ? noop : _opts$onError;\n    _this.target = null;\n    _this.onComplete = onComplete;\n    _this.onError = onError; // query manager needs a promise field\n\n    _this.promise = null;\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  } // Shortcut for timer query (dependent on extension in both WebGL1 and 2)\n  // Measures GPU time delta between this call and a matching `end` call in the\n  // GPU instruction stream.\n\n\n  (0, _createClass2.default)(Query, [{\n    key: \"beginTimeElapsedQuery\",\n    value: function beginTimeElapsedQuery() {\n      return this.begin(GL_TIME_ELAPSED_EXT);\n    } // Shortcut for occlusion queries\n\n  }, {\n    key: \"beginOcclusionQuery\",\n    value: function beginOcclusionQuery() {\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref$conservative = _ref.conservative,\n          conservative = _ref$conservative === void 0 ? false : _ref$conservative;\n\n      return this.begin(conservative ? GL_ANY_SAMPLES_PASSED_CONSERVATIVE : GL_ANY_SAMPLES_PASSED);\n    } // Shortcut for transformFeedbackQuery\n\n  }, {\n    key: \"beginTransformFeedbackQuery\",\n    value: function beginTransformFeedbackQuery() {\n      return this.begin(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);\n    } // Generates a GPU time stamp when the GPU instruction stream reaches this instruction.\n    // To measure time deltas, two timestamp queries are needed.\n    // Note: timestamp() queries may not be available even when the timer query extension is.\n\n  }, {\n    key: \"getTimestamp\",\n    value: function getTimestamp() {\n      _queryManager.default.beginQuery(this, this.onComplete, this.onError);\n\n      try {\n        this.gl.queryCounter(this.handle, GL_TIMESTAMP_EXT);\n      } catch (error) {\n        _queryManager.default.rejectQuery(this, ERR_TIMER_QUERY_NOT_SUPPORTED);\n      }\n\n      return this;\n    } // Due to OpenGL API limitations, after calling `begin()` on one Query\n    // instance, `end()` must be called on that same instance before\n    // calling `begin()` on another query. While there can be multiple\n    // outstanding queries representing disjoint `begin()`/`end()` intervals.\n    // It is not possible to interleave or overlap `begin` and `end` calls.\n\n  }, {\n    key: \"begin\",\n    value: function begin(target) {\n      // - Triggering a new query when a Query is already tracking an\n      //   unresolved query causes that query to be cancelled.\n      _queryManager.default.beginQuery(this, this.onComplete, this.onError);\n\n      this.target = target;\n\n      try {\n        this.gl.beginQuery(this.target, this.handle);\n      } catch (error) {\n        _queryManager.default.rejectQuery(this, 'Query not supported');\n      }\n\n      return this;\n    } // ends the current query\n\n  }, {\n    key: \"end\",\n    value: function end() {\n      // Note: calling end does not affect the pending promise\n      if (this.target) {\n        this.gl.endQuery(this.target);\n        this.target = null;\n      }\n\n      return this;\n    } // Cancels a pending query\n\n  }, {\n    key: \"cancel\",\n    value: function cancel() {\n      this.end();\n\n      _queryManager.default.cancelQuery(this);\n\n      return this;\n    } // Returns true if the query result is available\n\n  }, {\n    key: \"isResultAvailable\",\n    value: function isResultAvailable() {\n      return this.gl.getQueryParameter(this.handle, GL_QUERY_RESULT_AVAILABLE);\n    } // Returns the query result, converted to milliseconds to match JavaScript conventions.\n    // TODO - what about non-timer queries\n\n  }, {\n    key: \"getResult\",\n    value: function getResult() {\n      var result = this.gl.getQueryParameter(this.handle, GL_QUERY_RESULT);\n      return Number.isFinite(result) ? result / 1e6 : 0;\n    }\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return Query.isSupported(this.gl) ? this.gl.createQuery() : null;\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      _queryManager.default.deleteQuery(this);\n\n      this.gl.deleteQuery(this.handle);\n    }\n  }], [{\n    key: \"poll\",\n    value: function poll(gl) {\n      _queryManager.default.poll(gl);\n    }\n  }]);\n  return Query;\n}(_resource.default); // NOTE: This call lets the queryManager know how to detect disjoint GPU state\n// It will check dsjoint state on polls and before adding a new query\n// and reject any outstanding TimerQueries with our supplied error message.\n\n\nexports.default = Query;\n\n_queryManager.default.setInvalidator({\n  queryType: Query,\n  errorMessage: ERR_GPU_DISJOINT,\n  // Note: Querying the disjoint state resets it\n  checkInvalid: function checkInvalid(gl) {\n    return gl.getParameter(GL_GPU_DISJOINT_EXT);\n  }\n});\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./resource\":\"LE4Y\",\"../webgl-context/context-features\":\"T1Gu\",\"../webgl-utils\":\"CTd0\",\"../webgl-utils/query-manager\":\"Gm1D\",\"../utils/assert\":\"iVaU\"}],\"sERP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _texture = _interopRequireDefault(require(\"../webgl/texture\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Texture2DArray =\n/*#__PURE__*/\nfunction (_Texture) {\n  (0, _inherits2.default)(Texture2DArray, _Texture);\n  (0, _createClass2.default)(Texture2DArray, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      return (0, _webglUtils.isWebGL2)(gl);\n    }\n  }]);\n\n  function Texture2DArray(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Texture2DArray);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Texture2DArray).call(this, gl, opts));\n    throw new Error('Texture2DArray not yet implemented');\n    return _this;\n  }\n\n  return Texture2DArray;\n}(_texture.default);\n\nexports.default = Texture2DArray;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../webgl/texture\":\"m3Lc\",\"../webgl-utils\":\"CTd0\"}],\"vegQ\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _buffer = _interopRequireDefault(require(\"./buffer\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// NOTE: The `bindOnUse` flag is a major workaround:\n// See https://github.com/KhronosGroup/WebGL/issues/2346\nvar TransformFeedback =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(TransformFeedback, _Resource);\n  (0, _createClass2.default)(TransformFeedback, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      return (0, _webglUtils.isWebGL2)(gl);\n    }\n  }]);\n\n  function TransformFeedback(gl) {\n    var _this;\n\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, TransformFeedback);\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TransformFeedback).call(this, gl, props));\n\n    _this.initialize(props);\n\n    _this.stubRemovedMethods('TransformFeedback', 'v6.0', ['pause', 'resume']);\n\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  }\n\n  (0, _createClass2.default)(TransformFeedback, [{\n    key: \"initialize\",\n    value: function initialize() {\n      var _this2 = this;\n\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this.buffers = {};\n      this.unused = {};\n      this.configuration = null;\n      this.bindOnUse = true; // Unbind any currently bound buffers\n\n      if (!(0, _utils.isObjectEmpty)(this.buffers)) {\n        this.bind(function () {\n          return _this2._unbindBuffers();\n        });\n      }\n\n      this.setProps(props);\n      return this;\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('program' in props) {\n        this.configuration = props.program && props.program.configuration;\n      }\n\n      if ('configuration' in props) {\n        this.configuration = props.configuration;\n      }\n\n      if ('bindOnUse' in props) {\n        props = props.bindOnUse;\n      }\n\n      if ('buffers' in props) {\n        this.setBuffers(props.buffers);\n      }\n    }\n  }, {\n    key: \"setBuffers\",\n    value: function setBuffers() {\n      var _this3 = this;\n\n      var buffers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this.bind(function () {\n        for (var bufferName in buffers) {\n          _this3.setBuffer(bufferName, buffers[bufferName]);\n        }\n      });\n      return this;\n    }\n  }, {\n    key: \"setBuffer\",\n    value: function setBuffer(locationOrName, bufferOrParams) {\n      var _this4 = this;\n\n      var location = this._getVaryingIndex(locationOrName);\n\n      var _this$_getBufferParam = this._getBufferParams(bufferOrParams),\n          buffer = _this$_getBufferParam.buffer,\n          sizeInBytes = _this$_getBufferParam.sizeInBytes,\n          offsetInBytes = _this$_getBufferParam.offsetInBytes;\n\n      if (location < 0) {\n        this.unused[locationOrName] = buffer;\n\n        _utils.log.warn(function () {\n          return \"\".concat(_this4.id, \" unused varying buffer \").concat(locationOrName);\n        })();\n\n        return this;\n      }\n\n      this.buffers[location] = bufferOrParams; // Need to avoid chrome bug where buffer that is already bound to a different target\n      // cannot be bound to 'TRANSFORM_FEEDBACK_BUFFER' target.\n\n      if (!this.bindOnUse) {\n        this._bindBuffer(location, buffer, offsetInBytes, sizeInBytes);\n      }\n\n      return this;\n    }\n  }, {\n    key: \"begin\",\n    value: function begin() {\n      var primitiveMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n      this.gl.bindTransformFeedback(36386, this.handle);\n\n      this._bindBuffers();\n\n      this.gl.beginTransformFeedback(primitiveMode);\n      return this;\n    }\n  }, {\n    key: \"end\",\n    value: function end() {\n      this.gl.endTransformFeedback();\n\n      this._unbindBuffers();\n\n      this.gl.bindTransformFeedback(36386, null);\n      return this;\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_getBufferParams\",\n    value: function _getBufferParams(bufferOrParams) {\n      var offsetInBytes;\n      var sizeInBytes;\n      var buffer;\n\n      if (bufferOrParams instanceof _buffer.default === false) {\n        buffer = bufferOrParams.buffer;\n        sizeInBytes = bufferOrParams.sizeInBytes;\n        offsetInBytes = bufferOrParams.offsetInBytes;\n      } else {\n        buffer = bufferOrParams;\n      } // to use bindBufferRange, either offset or size must be specified, use default value for the other.\n\n\n      if (offsetInBytes !== undefined || sizeInBytes !== undefined) {\n        offsetInBytes = offsetInBytes || 0;\n        sizeInBytes = sizeInBytes || buffer.byteLength - offsetInBytes;\n      }\n\n      return {\n        buffer: buffer,\n        offsetInBytes: offsetInBytes,\n        sizeInBytes: sizeInBytes\n      };\n    }\n  }, {\n    key: \"_getVaryingInfo\",\n    value: function _getVaryingInfo(locationOrName) {\n      return this.configuration && this.configuration.getVaryingInfo(locationOrName);\n    }\n  }, {\n    key: \"_getVaryingIndex\",\n    value: function _getVaryingIndex(locationOrName) {\n      if (this.configuration) {\n        return this.configuration.getVaryingInfo(locationOrName).location;\n      }\n\n      var location = Number(locationOrName);\n      return Number.isFinite(location) ? location : -1;\n    } // Need to avoid chrome bug where buffer that is already bound to a different target\n    // cannot be bound to 'TRANSFORM_FEEDBACK_BUFFER' target.\n\n  }, {\n    key: \"_bindBuffers\",\n    value: function _bindBuffers() {\n      if (this.bindOnUse) {\n        for (var bufferIndex in this.buffers) {\n          var _this$_getBufferParam2 = this._getBufferParams(this.buffers[bufferIndex]),\n              buffer = _this$_getBufferParam2.buffer,\n              sizeInBytes = _this$_getBufferParam2.sizeInBytes,\n              offsetInBytes = _this$_getBufferParam2.offsetInBytes;\n\n          this._bindBuffer(bufferIndex, buffer, offsetInBytes, sizeInBytes);\n        }\n      }\n    }\n  }, {\n    key: \"_unbindBuffers\",\n    value: function _unbindBuffers() {\n      if (this.bindOnUse) {\n        for (var bufferIndex in this.buffers) {\n          this._bindBuffer(bufferIndex, null);\n        }\n      }\n    }\n  }, {\n    key: \"_bindBuffer\",\n    value: function _bindBuffer(index, buffer) {\n      var offsetInBytes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n      var sizeInBytes = arguments.length > 3 ? arguments[3] : undefined;\n      var handle = buffer && buffer.handle;\n\n      if (!handle || sizeInBytes === undefined) {\n        this.gl.bindBufferBase(35982, index, handle);\n      } else {\n        this.gl.bindBufferRange(35982, index, handle, offsetInBytes, sizeInBytes);\n      }\n\n      return this;\n    } // RESOURCE METHODS\n\n  }, {\n    key: \"_createHandle\",\n    value: function _createHandle() {\n      return this.gl.createTransformFeedback();\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle() {\n      this.gl.deleteTransformFeedback(this.handle);\n    }\n  }, {\n    key: \"_bindHandle\",\n    value: function _bindHandle(handle) {\n      this.gl.bindTransformFeedback(36386, this.handle);\n    }\n  }]);\n  return TransformFeedback;\n}(_resource.default);\n\nexports.default = TransformFeedback;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./resource\":\"LE4Y\",\"./buffer\":\"IZPG\",\"../webgl-utils\":\"CTd0\",\"../utils\":\"B7AM\"}],\"ymjJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getScratchArrayBuffer = getScratchArrayBuffer;\nexports.getScratchArray = getScratchArray;\nexports.fillArray = fillArray;\nvar arrayBuffer = null;\n\nfunction getScratchArrayBuffer(byteLength) {\n  if (!arrayBuffer || arrayBuffer.byteLength < byteLength) {\n    arrayBuffer = new ArrayBuffer(byteLength);\n  }\n\n  return arrayBuffer;\n}\n\nfunction getScratchArray(Type, length) {\n  var scratchArrayBuffer = getScratchArrayBuffer(Type.BYTES_PER_ELEMENT * length);\n  return new Type(scratchArrayBuffer, 0, length); // arrayBuffer, byteOffset, length (in elements)\n} // Uses copyWithin to significantly speed up typed array value filling\n\n\nfunction fillArray(_ref) {\n  var target = _ref.target,\n      source = _ref.source,\n      _ref$start = _ref.start,\n      start = _ref$start === void 0 ? 0 : _ref$start,\n      _ref$count = _ref.count,\n      count = _ref$count === void 0 ? 1 : _ref$count;\n  var length = source.length;\n  var total = count * length;\n  var copied = 0;\n\n  for (var i = start; copied < length; copied++) {\n    target[i++] = source[copied];\n  }\n\n  while (copied < total) {\n    // If we have copied less than half, copy everything we got\n    // else copy remaining in one operation\n    if (copied < total - copied) {\n      target.copyWithin(start + copied, start, start + copied);\n      copied *= 2;\n    } else {\n      target.copyWithin(start + copied, start, start + total - copied);\n      copied = total;\n    }\n  }\n\n  return target;\n}\n/*\n\n// Creates a new Uint8Array based on two different ArrayBuffers\n// @private\n// @param {ArrayBuffers} buffer1 The first buffer.\n// @param {ArrayBuffers} buffer2 The second buffer.\n// @return {ArrayBuffers} The new ArrayBuffer created out of the two.\n//\nexport function copyArrayBuffer(\n  targetBuffer, sourceBuffer, byteOffset, byteLength = sourceBuffer.byteLength\n) {\n  const targetArray = new Uint8Array(targetBuffer, byteOffset, byteLength);\n  const sourceArray = new Uint8Array(sourceBuffer);\n  targetArray.set(sourceArray);\n  return targetBuffer;\n}\n\n*/\n},{}],\"ntIB\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _get2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/get\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _resource = _interopRequireDefault(require(\"./resource\"));\n\nvar _buffer = _interopRequireDefault(require(\"./buffer\"));\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _arrayUtilsFlat = require(\"../utils/array-utils-flat\");\n\nvar _utils = require(\"../utils\");\n\nvar _probe = require(\"probe.gl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// WebGL2 VertexArrayObject class\n\n/* eslint-disable camelcase */\nvar OES_vertex_array_object = 'OES_vertex_array_object';\nvar ERR_ELEMENTS = 'elements must be GL.ELEMENT_ARRAY_BUFFER';\n\nvar VertexArrayObject =\n/*#__PURE__*/\nfunction (_Resource) {\n  (0, _inherits2.default)(VertexArrayObject, _Resource);\n  (0, _createClass2.default)(VertexArrayObject, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // Attribute 0 can not be disable on most desktop OpenGL based browsers\n      // and on iOS Safari browser.\n\n      if (options.constantAttributeZero) {\n        return (0, _webglUtils.isWebGL2)(gl) || (0, _probe.getBrowser)() === 'Chrome';\n      } // Whether additional objects can be created\n\n\n      return (0, _webglUtils.isWebGL2)(gl) || gl.getExtension(OES_vertex_array_object);\n    } // Returns the global (null) vertex array object. Exists even when no extension available\n\n  }, {\n    key: \"getDefaultArray\",\n    value: function getDefaultArray(gl) {\n      gl.luma = gl.luma || {};\n\n      if (!gl.luma.defaultVertexArray) {\n        gl.luma.defaultVertexArray = new VertexArrayObject(gl, {\n          handle: null\n        });\n      }\n\n      return gl.luma.defaultVertexArray;\n    }\n  }, {\n    key: \"getMaxAttributes\",\n    value: function getMaxAttributes(gl) {\n      // TODO - should be cached per context\n      VertexArrayObject.MAX_ATTRIBUTES = VertexArrayObject.MAX_ATTRIBUTES || gl.getParameter(34921);\n      return VertexArrayObject.MAX_ATTRIBUTES;\n    } // Note: Constants are stored globally on the WebGL context, not the VAO\n    // So they need to be updated before every render\n    // TODO - use known type (in configuration or passed in) to allow non-typed arrays?\n    // TODO - remember/cache values to avoid setting them unnecessarily?\n\n  }, {\n    key: \"setConstant\",\n    value: function setConstant(gl, location, array) {\n      switch (array.constructor) {\n        case Float32Array:\n          VertexArrayObject._setConstantFloatArray(gl, location, array);\n\n          break;\n\n        case Int32Array:\n          VertexArrayObject._setConstantIntArray(gl, location, array);\n\n          break;\n\n        case Uint32Array:\n          VertexArrayObject._setConstantUintArray(gl, location, array);\n\n          break;\n\n        default:\n          (0, _utils.assert)(false);\n      }\n    } // Create a VertexArray\n\n  }]);\n\n  function VertexArrayObject(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, VertexArrayObject); // Use program's id if program but no id is supplied\n\n    var id = opts.id || opts.program && opts.program.id;\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(VertexArrayObject).call(this, gl, Object.assign({}, opts, {\n      id: id\n    })));\n    _this.hasVertexArrays = VertexArrayObject.isSupported(gl);\n    _this.buffer = null;\n    _this.bufferValue = null;\n\n    _this.initialize(opts);\n\n    Object.seal((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  }\n\n  (0, _createClass2.default)(VertexArrayObject, [{\n    key: \"delete\",\n    value: function _delete() {\n      (0, _get2.default)((0, _getPrototypeOf2.default)(VertexArrayObject.prototype), \"delete\", this).call(this);\n\n      if (this.buffer) {\n        this.buffer.delete();\n      }\n    }\n  }, {\n    key: \"initialize\",\n    value: function initialize() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      return this.setProps(props);\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      // TODO: decide which props should be supported\n      return this;\n    } // Set (bind) an elements buffer, for indexed rendering.\n    // Must be a Buffer bound to GL.ELEMENT_ARRAY_BUFFER. Constants not supported\n\n  }, {\n    key: \"setElementBuffer\",\n    value: function setElementBuffer() {\n      var _this2 = this;\n\n      var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n      var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      (0, _utils.assert)(!elementBuffer || elementBuffer.target === 34963, ERR_ELEMENTS); // The GL.ELEMENT_ARRAY_BUFFER_BINDING is stored on the VertexArrayObject...\n\n      this.bind(function () {\n        _this2.gl.bindBuffer(34963, elementBuffer ? elementBuffer.handle : null);\n      });\n      return this;\n    } // Set a location in vertex attributes array to a bufferk, enables the location, sets divisor\n\n  }, {\n    key: \"setBuffer\",\n    value: function setBuffer(location, buffer, accessor) {\n      // Check target\n      if (buffer.target === 34963) {\n        return this.setElementBuffer(buffer, accessor);\n      }\n\n      var size = accessor.size,\n          type = accessor.type,\n          stride = accessor.stride,\n          offset = accessor.offset,\n          normalized = accessor.normalized,\n          integer = accessor.integer,\n          divisor = accessor.divisor;\n      var gl = this.gl;\n      location = Number(location);\n      this.bind(function () {\n        // A non-zero buffer object must be bound to the GL_ARRAY_BUFFER target\n        gl.bindBuffer(34962, buffer.handle); // WebGL2 supports *integer* data formats, i.e. GPU will see integer values\n\n        if (integer) {\n          (0, _utils.assert)((0, _webglUtils.isWebGL2)(gl));\n          gl.vertexAttribIPointer(location, size, type, stride, offset);\n        } else {\n          // Attaches ARRAY_BUFFER with specified buffer format to location\n          gl.vertexAttribPointer(location, size, type, normalized, stride, offset);\n        }\n\n        gl.enableVertexAttribArray(location);\n        gl.vertexAttribDivisor(location, divisor || 0); // NOTE We don't unbind buffer here, typically another buffer will be bound just after\n      });\n      return this;\n    } // Enabling an attribute location makes it reference the currently bound buffer\n    // Disabling an attribute location makes it reference the global constant value\n    // TODO - handle single values for size 1 attributes?\n    // TODO - convert classic arrays based on known type?\n\n  }, {\n    key: \"enable\",\n    value: function enable(location) {\n      var _this3 = this;\n\n      var _enable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; // Attribute 0 cannot be disabled in most desktop OpenGL based browsers\n\n\n      var disablingAttributeZero = !_enable && location === 0 && !VertexArrayObject.isSupported(this.gl, {\n        constantAttributeZero: true\n      });\n\n      if (!disablingAttributeZero) {\n        location = Number(location);\n        this.bind(function () {\n          return _enable ? _this3.gl.enableVertexAttribArray(location) : _this3.gl.disableVertexAttribArray(location);\n        });\n      }\n\n      return this;\n    } // Provide a means to create a buffer that is equivalent to a constant.\n    // NOTE: Desktop OpenGL cannot disable attribute 0.\n    // https://stackoverflow.com/questions/20305231/webgl-warning-attribute-0-is-disabled-\n    // this-has-significant-performance-penalt\n\n  }, {\n    key: \"getConstantBuffer\",\n    value: function getConstantBuffer(elementCount, value, accessor) {\n      // Create buffer only when needed, and reuse it (avoids inflating buffer creation statistics)\n      var constantValue = this._normalizeConstantArrayValue(value, accessor);\n\n      var byteLength = constantValue.byteLength * elementCount;\n      var length = constantValue.length * elementCount;\n      var updateNeeded = !this.buffer;\n      this.buffer = this.buffer || new _buffer.default(this.gl, byteLength);\n      updateNeeded = updateNeeded || this.buffer.setByteLength(byteLength); // Reallocate and update contents if needed\n\n      updateNeeded = updateNeeded || !this._compareConstantArrayValues(constantValue, this.bufferValue);\n\n      if (updateNeeded) {\n        // Create a typed array that is big enough, and fill it with the required data\n        var typedArray = (0, _arrayUtilsFlat.getScratchArray)(value.constructor, length);\n        (0, _arrayUtilsFlat.fillArray)({\n          target: typedArray,\n          source: constantValue,\n          start: 0,\n          count: length\n        });\n        this.buffer.subData(typedArray);\n        this.bufferValue = value;\n      }\n\n      return this.buffer;\n    } // PRIVATE\n    // TODO - convert Arrays based on known type? (read type from accessor, don't assume Float32Array)\n    // TODO - handle single values for size 1 attributes?\n\n  }, {\n    key: \"_normalizeConstantArrayValue\",\n    value: function _normalizeConstantArrayValue(arrayValue, accessor) {\n      if (Array.isArray(arrayValue)) {\n        return new Float32Array(arrayValue);\n      }\n\n      return arrayValue;\n    }\n  }, {\n    key: \"_compareConstantArrayValues\",\n    value: function _compareConstantArrayValues(v1, v2) {\n      if (!v1 || !v2 || v1.length !== v2.length || v1.constructor !== v2.constructor) {\n        return false;\n      }\n\n      for (var i = 0; i < v1.length; ++i) {\n        if (v1[i] !== v2[i]) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n  }, {\n    key: \"_createHandle\",\n    // RESOURCE IMPLEMENTATION\n    value: function _createHandle() {\n      this.hasVertexArrays = VertexArrayObject.isSupported(this.gl);\n\n      if (this.hasVertexArrays) {\n        return this.gl.createVertexArray();\n      }\n\n      return null;\n    }\n  }, {\n    key: \"_deleteHandle\",\n    value: function _deleteHandle(handle) {\n      if (this.hasVertexArrays) {\n        this.gl.deleteVertexArray(handle);\n      }\n\n      return [this.elements]; // return [this.elements, ...this.buffers];\n    }\n  }, {\n    key: \"_bindHandle\",\n    value: function _bindHandle(handle) {\n      if (this.hasVertexArrays) {\n        this.gl.bindVertexArray(handle);\n      }\n    } // Generic getter for information about a vertex attribute at a given position\n\n  }, {\n    key: \"_getParameter\",\n    value: function _getParameter(pname, _ref) {\n      var _this4 = this;\n\n      var location = _ref.location;\n      (0, _utils.assert)(Number.isFinite(location));\n      return this.bind(function () {\n        switch (pname) {\n          case 34373:\n            return _this4.gl.getVertexAttribOffset(location, pname);\n\n          default:\n            return _this4.gl.getVertexAttrib(location, pname);\n        }\n      });\n    } // DEPRECATED\n\n    /*\n    setDivisor(location, divisor) {\n      location = Number(location);\n      this.bind(() => this.gl.vertexAttribDivisor(location, divisor));\n      return this;\n    }\n     // match assumed WebGL defaults\n    static resetConstants(gl) {\n      const MAX_ATTRIBUTES = VertexArrayObject.getMaxAttributes(gl);\n      for (let i = 0; i < MAX_ATTRIBUTES; i++) {\n        VertexArrayObject.setConstant(gl, i, [0, 0, 0, 1]);\n      }\n    }\n     // Resets all attributes (to default valued constants)\n    resetAttributes() {\n      // WebGL offers disabling, but no clear way to set a VertexArray buffer to `null`\n      // But Chrome does not like buffers that are bound to several binding points.\n      // So we just bind all the attributes to the dummy \"attribute zero\" buffer\n      this.buffer = this.buffer || new Buffer(this.gl, {size: 4});\n       for (const location in this.values) {\n        if (this.values[location] instanceof Buffer) {\n          this.gl.disableVertexAttribArray(location);\n          this.gl.bindBuffer(GL.ARRAY_BUFFER, this.buffer.handle);\n          this.gl.vertexAttribPointer(location, 1, GL.FLOAT, false, 0, 0);\n        }\n      }\n       this.setElementBuffer(null);\n      return this;\n    }\n    */\n\n  }, {\n    key: \"MAX_ATTRIBUTES\",\n    get: function get() {\n      return VertexArrayObject.getMaxAttributes(this.gl);\n    }\n  }], [{\n    key: \"_setConstantFloatArray\",\n    value: function _setConstantFloatArray(gl, location, array) {\n      switch (array.length) {\n        case 1:\n          gl.vertexAttrib1fv(location, array);\n          break;\n\n        case 2:\n          gl.vertexAttrib2fv(location, array);\n          break;\n\n        case 3:\n          gl.vertexAttrib3fv(location, array);\n          break;\n\n        case 4:\n          gl.vertexAttrib4fv(location, array);\n          break;\n\n        default:\n          (0, _utils.assert)(false);\n      }\n    }\n  }, {\n    key: \"_setConstantIntArray\",\n    value: function _setConstantIntArray(gl, location, array) {\n      (0, _utils.assert)((0, _webglUtils.isWebGL2)(gl));\n\n      switch (array.length) {\n        case 1:\n          gl.vertexAttribI1iv(location, array);\n          break;\n\n        case 2:\n          gl.vertexAttribI2iv(location, array);\n          break;\n\n        case 3:\n          gl.vertexAttribI3iv(location, array);\n          break;\n\n        case 4:\n          gl.vertexAttribI4iv(location, array);\n          break;\n\n        default:\n          (0, _utils.assert)(false);\n      }\n    }\n  }, {\n    key: \"_setConstantUintArray\",\n    value: function _setConstantUintArray(gl, location, array) {\n      (0, _utils.assert)((0, _webglUtils.isWebGL2)(gl));\n\n      switch (array.length) {\n        case 1:\n          gl.vertexAttribI1uiv(location, array);\n          break;\n\n        case 2:\n          gl.vertexAttribI2uiv(location, array);\n          break;\n\n        case 3:\n          gl.vertexAttribI3uiv(location, array);\n          break;\n\n        case 4:\n          gl.vertexAttribI4uiv(location, array);\n          break;\n\n        default:\n          (0, _utils.assert)(false);\n      }\n    }\n  }]);\n  return VertexArrayObject;\n}(_resource.default);\n\nexports.default = VertexArrayObject;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/get\":\"Lwpt\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./resource\":\"LE4Y\",\"./buffer\":\"IZPG\",\"../webgl-utils\":\"CTd0\",\"../utils/array-utils-flat\":\"ymjJ\",\"../utils\":\"B7AM\",\"probe.gl\":\"z0g1\"}],\"yRin\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _accessor = _interopRequireDefault(require(\"./accessor\"));\n\nvar _buffer = _interopRequireDefault(require(\"./buffer\"));\n\nvar _vertexArrayObject = _interopRequireDefault(require(\"./vertex-array-object\"));\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// VertexArray class\nvar ERR_ATTRIBUTE_TYPE = 'VertexArray: attributes must be Buffers or constants (i.e. typed array)';\n\nvar VertexArray =\n/*#__PURE__*/\nfunction () {\n  function VertexArray(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, VertexArray); // Use program's id if program is supplied but no id is supplied\n\n    var id = opts.id || opts.program && opts.program.id; // super(gl, Object.assign({}, opts, {id}));\n\n    this.id = id;\n    this.gl = gl;\n    this.configuration = null; // Extracted information\n\n    this.elements = null;\n    this.values = null;\n    this.accessors = null;\n    this.unused = null;\n    this.drawParams = null;\n    this.buffer = null; // For attribute 0 on desktops, and created when unbinding buffers\n\n    this.vertexArrayObject = _vertexArrayObject.default.isSupported(gl) ? new _vertexArrayObject.default(gl) : _vertexArrayObject.default.getDefaultArray(gl); // Issue errors when using removed methods\n\n    (0, _utils.stubRemovedMethods)(this, 'VertexArray', 'v6.0', ['setBuffers', 'setGeneric', 'clearBindings', 'setLocations', 'setGenericValues', 'setDivisor', 'enable', 'disable']);\n    this.initialize(opts);\n    Object.seal(this);\n  }\n\n  (0, _createClass2.default)(VertexArray, [{\n    key: \"delete\",\n    value: function _delete() {\n      if (this.buffer) {\n        this.buffer.delete();\n      }\n    }\n  }, {\n    key: \"initialize\",\n    value: function initialize() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this.reset();\n      this.configuration = null;\n      this.bindOnUse = false;\n      return this.setProps(props);\n    } // Resets all attributes (to default valued constants)\n\n  }, {\n    key: \"reset\",\n    value: function reset() {\n      // this.vertexArrayObject.reset();\n      this.elements = null;\n      var MAX_ATTRIBUTES = this.vertexArrayObject.MAX_ATTRIBUTES;\n      this.values = new Array(MAX_ATTRIBUTES).fill(null);\n      this.accessors = new Array(MAX_ATTRIBUTES).fill(null);\n      this.unused = {}; // Auto detects draw params\n\n      this.drawParams = null;\n      return this;\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('program' in props) {\n        this.configuration = props.program && props.program.configuration;\n      }\n\n      if ('configuration' in props) {\n        this.configuration = props.configuration;\n      }\n\n      if ('attributes' in props) {\n        this.setAttributes(props.attributes);\n      }\n\n      if ('elements' in props) {\n        this.setElementBuffer(props.elements);\n      }\n\n      if ('bindOnUse' in props) {\n        props = props.bindOnUse;\n      }\n\n      return this;\n    } // Automatically called if buffers changed through VertexArray API\n\n  }, {\n    key: \"clearDrawParams\",\n    value: function clearDrawParams() {\n      this.drawParams = null;\n    }\n  }, {\n    key: \"getDrawParams\",\n    value: function getDrawParams(appParameters) {\n      // Auto deduced draw parameters\n      this.drawParams = this.drawParams || this._updateDrawParams(); // Override with any application supplied draw parameters\n\n      return Object.assign({}, this.drawParams, appParameters);\n    } // Set (bind) an array or map of vertex array buffers, either in numbered or named locations.\n    // For names that are not present in `location`, the supplied buffers will be ignored.\n    // if a single buffer of type GL.ELEMENT_ARRAY_BUFFER is present, it will be set as elements\n    //   Signatures:\n    //     {attributeName: buffer}\n    //     {attributeName: [buffer, accessor]}\n    //     {attributeName: (typed) array} => constant\n\n  }, {\n    key: \"setAttributes\",\n    value: function setAttributes(attributes) {\n      var _this = this;\n\n      this.vertexArrayObject.bind(function () {\n        for (var locationOrName in attributes) {\n          var value = attributes[locationOrName];\n\n          if (value instanceof _buffer.default) {\n            //  Signature: attributeName: buffer\n            _this.setBuffer(locationOrName, value);\n          } else if (Array.isArray(value) && value.length && value[0] instanceof _buffer.default) {\n            // Signature: attributeName: [buffer, accessor]\n            var buffer = value[0];\n            var accessor = value[1];\n\n            _this.setBuffer(locationOrName, buffer, accessor);\n          } else if (ArrayBuffer.isView(value) || Array.isArray(value)) {\n            //  Signature: attributeName: (short) (typed) array => constant\n            _this.setConstant(locationOrName, value);\n          } else {\n            throw new Error(ERR_ATTRIBUTE_TYPE);\n          }\n        } // Make sure we don't leave any bindings\n\n\n        _this.gl.bindBuffer(34962, null);\n      });\n      return this;\n    } // Set (bind) an elements buffer, for indexed rendering.\n    // Must be a Buffer bound to GL.ELEMENT_ARRAY_BUFFER. Constants not supported\n\n  }, {\n    key: \"setElementBuffer\",\n    value: function setElementBuffer() {\n      var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n      var accessor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      this.elements = elementBuffer; // Save value for debugging\n\n      this.clearDrawParams(); // Update vertexArray immediately if we have our own array\n\n      if (!this.vertexArrayObject.isDefaultArray) {\n        this.vertexArrayObject.setElementBuffer(elementBuffer, accessor);\n      }\n\n      return this;\n    } // Set a location in vertex attributes array to a buffer\n\n  }, {\n    key: \"setBuffer\",\n    value: function setBuffer(locationOrName, buffer) {\n      var appAccessor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; // Check target\n\n      if (buffer.target === 34963) {\n        return this.setElementBuffer(buffer);\n      }\n\n      var _this$_resolveLocatio = this._resolveLocationAndAccessor(locationOrName, buffer, buffer.accessor, appAccessor),\n          location = _this$_resolveLocatio.location,\n          accessor = _this$_resolveLocatio.accessor;\n\n      if (location >= 0) {\n        this.values[location] = buffer;\n        this.accessors[location] = accessor;\n        this.clearDrawParams(); // Update vertexArray immediately if we have our own array\n\n        if (!this.vertexArrayObject.isDefaultArray) {\n          this.vertexArrayObject.setBuffer(location, buffer, accessor);\n        }\n      }\n\n      return this;\n    } // Set attribute to constant value (small typed array corresponding to one vertex' worth of data)\n\n  }, {\n    key: \"setConstant\",\n    value: function setConstant(locationOrName, arrayValue) {\n      var appAccessor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      var _this$_resolveLocatio2 = this._resolveLocationAndAccessor(locationOrName, arrayValue, appAccessor),\n          location = _this$_resolveLocatio2.location,\n          accessor = _this$_resolveLocatio2.accessor;\n\n      if (location >= 0) {\n        arrayValue = this.vertexArrayObject._normalizeConstantArrayValue(arrayValue, accessor);\n        this.values[location] = arrayValue;\n        this.accessors[location] = accessor;\n        this.clearDrawParams(); // Update vertexArray immediately if we have our own array\n        // NOTE: We set the actual constant value later on bind. We can't set the value now since\n        // constants are global and affect all other VertexArrays that have disabled attributes\n        // in the same location.\n        // We do disable the attribute which makes it use the global constant value at that location\n\n        if (!this.vertexArrayObject.isDefaultArray) {\n          this.vertexArrayObject.enable(location, false);\n        }\n      }\n\n      return this;\n    } // Workaround for Chrome TransformFeedback binding issue\n    // If required, unbind temporarily to avoid conflicting with TransformFeedback\n\n  }, {\n    key: \"unbindBuffers\",\n    value: function unbindBuffers() {\n      var _this2 = this;\n\n      this.vertexArrayObject.bind(function () {\n        if (_this2.elements) {\n          _this2.setElementBuffer(null);\n        } // Chrome does not like buffers that are bound to several binding points,\n        // so we need to offer and unbind facility\n        // WebGL offers disabling, but no clear way to set a VertexArray buffer to `null`\n        // So we just bind all the attributes to the dummy \"attribute zero\" buffer\n\n\n        _this2.buffer = _this2.buffer || new _buffer.default(_this2.gl, {\n          size: 4\n        });\n\n        for (var location = 0; location < _this2.vertexArrayObject.MAX_ATTRIBUTES; location++) {\n          if (_this2.values[location] instanceof _buffer.default) {\n            _this2.gl.disableVertexAttribArray(location);\n\n            _this2.gl.bindBuffer(34962, _this2.buffer.handle);\n\n            _this2.gl.vertexAttribPointer(location, 1, 5126, false, 0, 0);\n          }\n        }\n      });\n      return this;\n    } // Workaround for Chrome TransformFeedback binding issue\n    // If required, rebind rebind after temporary unbind\n\n  }, {\n    key: \"bindBuffers\",\n    value: function bindBuffers() {\n      var _this3 = this;\n\n      this.vertexArrayObject.bind(function () {\n        if (_this3.elements) {\n          _this3.setElementBuffer(_this3.elements);\n        }\n\n        for (var location = 0; location < _this3.vertexArrayObject.MAX_ATTRIBUTES; location++) {\n          var buffer = _this3.values[location];\n\n          if (buffer instanceof _buffer.default) {\n            _this3.setBuffer(location, buffer);\n          }\n        }\n      });\n      return this;\n    } // Bind for use\n    // When a vertex array is about to be used, we must:\n    // - Set constant attributes (since these are stored on the context and reset on bind)\n    // - Check if we need to initialize the buffer\n\n  }, {\n    key: \"bindForDraw\",\n    value: function bindForDraw(vertexCount, instanceCount, func) {\n      var _this4 = this;\n\n      var value;\n      this.vertexArrayObject.bind(function () {\n        // Make sure that any constant attributes are updated (stored on the context, not the VAO)\n        // Also handles attribute 0\n        _this4._setConstantAttributes(vertexCount, instanceCount);\n\n        if (!_this4.vertexArrayObject.hasVertexArrays) {\n          _this4.bindBuffers();\n        }\n\n        value = func();\n\n        if (!_this4.vertexArrayObject.hasVertexArrays) {\n          _this4.unbindBuffers();\n        }\n      });\n      return value;\n    } // PRIVATE\n    // Resolve locations and accessors\n\n  }, {\n    key: \"_resolveLocationAndAccessor\",\n    value: function _resolveLocationAndAccessor(locationOrName, value, valueAccessor, appAccessor) {\n      var _this5 = this;\n\n      var location = this._getAttributeIndex(locationOrName);\n\n      if (!Number.isFinite(location) || location < 0) {\n        this.unused[locationOrName] = value;\n\n        _utils.log.once(3, function () {\n          return \"unused value \".concat(locationOrName, \" in \").concat(_this5.id);\n        })();\n\n        return this;\n      }\n\n      var accessInfo = this._getAttributeInfo(locationOrName); // Resolve the partial accessors into a final accessor\n\n\n      var accessor = _accessor.default.resolve(accessInfo.accessor, valueAccessor, appAccessor);\n\n      var size = accessor.size,\n          type = accessor.type;\n      (0, _utils.assert)(Number.isFinite(size) && Number.isFinite(type));\n      return {\n        location: location,\n        accessor: accessor\n      };\n    }\n  }, {\n    key: \"_getAttributeInfo\",\n    value: function _getAttributeInfo(attributeName) {\n      return this.configuration && this.configuration.getAttributeInfo(attributeName);\n    }\n  }, {\n    key: \"_getAttributeIndex\",\n    value: function _getAttributeIndex(locationOrName) {\n      if (this.configuration) {\n        return this.configuration.getAttributeLocation(locationOrName);\n      }\n\n      var location = Number(locationOrName);\n\n      if (Number.isFinite(location)) {\n        return location;\n      }\n\n      return -1;\n    } // Updates all constant attribute values (constants are used when vertex attributes are disabled).\n    // This needs to be done repeatedly since in contrast to buffer bindings,\n    // constants are stored on the WebGL context, not the VAO\n\n  }, {\n    key: \"_setConstantAttributes\",\n    value: function _setConstantAttributes(vertexCount, instanceCount) {\n      // TODO - use accessor to determine what length to use\n      var elementCount = Math.max(vertexCount | 0, instanceCount | 0);\n      var constant = this.values[0];\n\n      if (ArrayBuffer.isView(constant)) {\n        this._setConstantAttributeZero(constant, elementCount);\n      }\n\n      for (var location = 1; location < this.vertexArrayObject.MAX_ATTRIBUTES; location++) {\n        constant = this.values[location];\n\n        if (ArrayBuffer.isView(constant)) {\n          this._setConstantAttribute(location, constant);\n        }\n      }\n    }\n  }, {\n    key: \"_setConstantAttributeZero\",\n    value: function _setConstantAttributeZero(constant, elementCount) {\n      if (_vertexArrayObject.default.isSupported(this.gl, {\n        constantAttributeZero: true\n      })) {\n        this._setConstantAttribute(0, constant);\n\n        return;\n      } // Get a dummy buffer populated with repeated constants\n\n\n      var buffer = this.vertexArrayObject.getConstantBuffer(elementCount, constant); // Set the buffer on location 0\n\n      this.vertexArrayObject.setBuffer(0, buffer, this.accessors[0]);\n    }\n  }, {\n    key: \"_setConstantAttribute\",\n    value: function _setConstantAttribute(location, constant) {\n      _vertexArrayObject.default.setConstant(this.gl, location, constant); // If we are using the global VertexArrayObject, we need to disable the attribute now\n\n\n      if (this.vertexArrayObject.isDefault) {\n        this.vertexArrayObject.enable(location, false);\n      }\n    } // Walks the buffers and updates draw parameters\n\n  }, {\n    key: \"_updateDrawParams\",\n    value: function _updateDrawParams() {\n      var drawParams = {\n        isIndexed: false,\n        isInstanced: false,\n        indexCount: Infinity,\n        vertexCount: Infinity,\n        instanceCount: Infinity\n      };\n\n      for (var location = 0; location < this.vertexArrayObject.MAX_ATTRIBUTES; location++) {\n        this._updateDrawParamsForLocation(drawParams, location);\n      }\n\n      if (this.elements) {\n        // indexing is autodetected - buffer with target GL.ELEMENT_ARRAY_BUFFER\n        // index type is saved for drawElement calls\n        drawParams.elementCount = this.elements.getElementCount(this.elements.accessor);\n        drawParams.isIndexed = true;\n        drawParams.indexType = this.elements.accessor.type;\n      } // Post-calculation checks\n\n\n      if (drawParams.indexCount === Infinity) {\n        drawParams.indexCount = 0;\n      }\n\n      if (drawParams.vertexCount === Infinity) {\n        drawParams.vertexCount = 0;\n      }\n\n      if (drawParams.instanceCount === Infinity) {\n        drawParams.instanceCount = 0;\n      }\n\n      return drawParams;\n    }\n  }, {\n    key: \"_updateDrawParamsForLocation\",\n    value: function _updateDrawParamsForLocation(drawParams, location) {\n      var value = this.values[location];\n      var accessor = this.accessors[location];\n\n      if (!value) {\n        return;\n      } // Check if instanced (whether buffer or constant)\n\n\n      var divisor = accessor.divisor;\n      var isInstanced = divisor > 0;\n      drawParams.isInstanced = drawParams.isInstanced || isInstanced;\n\n      if (value instanceof _buffer.default) {\n        var buffer = value;\n\n        if (isInstanced) {\n          // instance attribute\n          var instanceCount = buffer.getVertexCount(accessor);\n          drawParams.instanceCount = Math.min(drawParams.instanceCount, instanceCount);\n        } else {\n          // normal attribute\n          var vertexCount = buffer.getVertexCount(accessor);\n          drawParams.vertexCount = Math.min(drawParams.vertexCount, vertexCount);\n        }\n      }\n    } // DEPRECATED\n\n  }, {\n    key: \"setElements\",\n    value: function setElements() {\n      var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n      var accessor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n      _utils.log.deprecated('setElements', 'setElementBuffer');\n\n      return this.setElementBuffer(elementBuffer, accessor);\n    }\n  }]);\n  return VertexArray;\n}();\n\nexports.default = VertexArray;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./accessor\":\"E5yL\",\"./buffer\":\"IZPG\",\"./vertex-array-object\":\"ntIB\",\"../utils\":\"B7AM\"}],\"hoFY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable camelcase */\nvar ERR_ARGUMENT = 'UniformBufferLayout illegal argument'; // Local constants - these will \"collapse\" during minification\n\nvar GL_FLOAT = 0x1406;\nvar GL_INT = 0x1404;\nvar GL_UNSIGNED_INT = 0x1405; // Std140 layout for uniforms\n\nvar UniformBufferLayout =\n/*#__PURE__*/\nfunction () {\n  function UniformBufferLayout(layout) {\n    var _this$typedArray;\n\n    (0, _classCallCheck2.default)(this, UniformBufferLayout);\n    this.layout = {};\n    this.size = 0; // Add layout (type, size and offset) definitions for each uniform in the layout\n\n    for (var key in layout) {\n      this._addUniform(key, layout[key]);\n    } // Allocate three typed arrays pointing at same memory\n\n\n    var data = new Float32Array(this.size);\n    this.typedArray = (_this$typedArray = {}, (0, _defineProperty2.default)(_this$typedArray, GL_FLOAT, data), (0, _defineProperty2.default)(_this$typedArray, GL_INT, new Int32Array(data.buffer)), (0, _defineProperty2.default)(_this$typedArray, GL_UNSIGNED_INT, new Uint32Array(data.buffer)), _this$typedArray);\n  } // Get number of bytes needed for buffer allocation\n\n\n  (0, _createClass2.default)(UniformBufferLayout, [{\n    key: \"getBytes\",\n    value: function getBytes() {\n      return this.size * 4;\n    } // Get the current data as Float32Array, for bufferSubData\n\n  }, {\n    key: \"getData\",\n    value: function getData() {\n      return this.typedArray[GL_FLOAT];\n    } // Get offset and data for one object (for bufferSubData)\n\n  }, {\n    key: \"getSubData\",\n    value: function getSubData(index) {\n      var data;\n      var offset;\n\n      if (index === undefined) {\n        data = this.data;\n        offset = 0;\n      } else {\n        var begin = this.offsets[index];\n        var end = begin + this.sizes[index];\n        data = this.data.subarray(begin, end);\n        offset = begin * 4;\n      }\n\n      return {\n        data: data,\n        offset: offset\n      };\n    } // Set a map of values\n\n  }, {\n    key: \"setUniforms\",\n    value: function setUniforms(values) {\n      for (var key in values) {\n        this._setValue(key, values[key]);\n      }\n\n      return this;\n    }\n  }, {\n    key: \"_setValue\",\n    value: function _setValue(key, value) {\n      var layout = this.layout[key];\n      (0, _assert.default)(layout, 'UniformLayoutStd140 illegal argument');\n      var typedArray = this.typedArray[layout.type];\n\n      if (layout.size === 1) {\n        // single value -> just set it\n        typedArray[layout.offset] = value;\n      } else {\n        // vector/matrix -> copy the supplied (typed) array, starting from offset\n        typedArray.set(value, layout.offset);\n      }\n    }\n  }, {\n    key: \"_addUniform\",\n    value: function _addUniform(key, uniformType) {\n      var typeAndComponents = (0, _attributeUtils.decomposeCompositeGLType)(uniformType);\n      (0, _assert.default)(typeAndComponents, ERR_ARGUMENT);\n      var type = typeAndComponents.type,\n          count = typeAndComponents.components; // First, align (bump) current offset to an even multiple of current object (1, 2, 4)\n\n      this.size = this._alignTo(this.size, count); // Use the aligned size as the offset of the current uniform.\n\n      var offset = this.size; // Then, add our object's padded size ((1, 2, multiple of 4) to the current offset\n\n      this.size += count;\n      this.layout[key] = {\n        type: type,\n        size: count,\n        offset: offset\n      };\n    } // Align offset to 1, 2 or 4 elements (4, 8 or 16 bytes)\n\n  }, {\n    key: \"_alignTo\",\n    value: function _alignTo(size, count) {\n      switch (count) {\n        case 1:\n          return size;\n        // Pad upwards to even multiple of 2\n\n        case 2:\n          return size + size % 2;\n        // Pad upwards to even multiple of 2\n\n        default:\n          return size + (4 - size % 4) % 4;\n        // Pad upwards to even multiple of 4\n      }\n    }\n  }]);\n  return UniformBufferLayout;\n}();\n\nexports.default = UniformBufferLayout;\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../webgl-utils/attribute-utils\":\"q52h\",\"../utils/assert\":\"iVaU\"}],\"HvpW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _isNativeFunction;\n\nfunction _isNativeFunction(fn) {\n  return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n},{}],\"le0z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _wrapNativeSuper;\n\nvar _getPrototypeOf = _interopRequireDefault(require(\"./getPrototypeOf\"));\n\nvar _setPrototypeOf = _interopRequireDefault(require(\"./setPrototypeOf\"));\n\nvar _isNativeFunction = _interopRequireDefault(require(\"./isNativeFunction\"));\n\nvar _construct = _interopRequireDefault(require(\"./construct\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _wrapNativeSuper(Class) {\n  var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n  exports.default = _wrapNativeSuper = function _wrapNativeSuper(Class) {\n    if (Class === null || !(0, _isNativeFunction.default)(Class)) return Class;\n\n    if (typeof Class !== \"function\") {\n      throw new TypeError(\"Super expression must either be null or a function\");\n    }\n\n    if (typeof _cache !== \"undefined\") {\n      if (_cache.has(Class)) return _cache.get(Class);\n\n      _cache.set(Class, Wrapper);\n    }\n\n    function Wrapper() {\n      return (0, _construct.default)(Class, arguments, (0, _getPrototypeOf.default)(this).constructor);\n    }\n\n    Wrapper.prototype = Object.create(Class.prototype, {\n      constructor: {\n        value: Wrapper,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n    return (0, _setPrototypeOf.default)(Wrapper, Class);\n  };\n\n  return _wrapNativeSuper(Class);\n}\n},{\"./getPrototypeOf\":\"QQCW\",\"./setPrototypeOf\":\"hewo\",\"./isNativeFunction\":\"HvpW\",\"./construct\":\"M7j4\"}],\"U3d7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.configure = configure;\nexports.checkNumber = checkNumber;\nexports.formatValue = formatValue;\nexports.formatAngle = formatAngle;\nexports.isArray = isArray;\nexports.clone = clone;\nexports.radians = radians;\nexports.degrees = degrees;\nexports.sin = sin;\nexports.cos = cos;\nexports.tan = tan;\nexports.asin = asin;\nexports.acos = acos;\nexports.atan = atan;\nexports.clamp = clamp;\nexports.lerp = lerp;\nexports.equals = equals;\nexports.config = void 0;\nvar config = {};\nexports.config = config;\nconfig.EPSILON = 1e-12;\nconfig.debug = true;\nconfig.precision = 4;\nconfig.printTypes = false;\nconfig.printDegrees = false;\nconfig.printRowMajor = true;\n\nfunction configure(options) {\n  if ('epsilon' in options) {\n    config.EPSILON = options.epsilon;\n  }\n\n  if ('debug' in options) {\n    config.debug = options.debug;\n  }\n}\n\nfunction checkNumber(value) {\n  if (!Number.isFinite(value)) {\n    throw new Error(\"Invalid number \".concat(value));\n  }\n\n  return value;\n}\n\nfunction round(value) {\n  return Math.round(value / config.EPSILON) * config.EPSILON;\n}\n\nfunction formatValue(value) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$precision = _ref.precision,\n      precision = _ref$precision === void 0 ? config.precision || 4 : _ref$precision;\n\n  value = round(value);\n  return parseFloat(value.toPrecision(precision));\n}\n\nfunction formatAngle(value) {\n  var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref2$precision = _ref2.precision,\n      precision = _ref2$precision === void 0 ? config.precision || 4 : _ref2$precision,\n      _ref2$printDegrees = _ref2.printDegrees,\n      printDegrees = _ref2$printDegrees === void 0 ? config.printAngles : _ref2$printDegrees;\n\n  value = printDegrees ? degrees(value) : value;\n  value = round(value);\n  return \"\".concat(parseFloat(value.toPrecision(precision))).concat(printDegrees ? '°' : '');\n}\n\nfunction isArray(value) {\n  return Array.isArray(value) || ArrayBuffer.isView(value) && value.length !== undefined;\n}\n\nfunction clone(array) {\n  return array.clone ? array.clone() : new Array(array);\n}\n\nfunction map(value, func) {\n  if (isArray(value)) {\n    var result = clone(value);\n\n    for (var i = 0; i < result.length; ++i) {\n      result[i] = func(result[i], i, result);\n    }\n\n    return result;\n  }\n\n  return func(value);\n}\n\nfunction radians(degrees) {\n  return map(degrees, function (degrees) {\n    return degrees / 180 * Math.PI;\n  });\n}\n\nfunction degrees(radians) {\n  return map(radians, function (radians) {\n    return radians * 180 / Math.PI;\n  });\n}\n\nfunction sin(radians) {\n  return map(radians, function (angle) {\n    return Math.sin(angle);\n  });\n}\n\nfunction cos(radians) {\n  return map(radians, function (angle) {\n    return Math.cos(angle);\n  });\n}\n\nfunction tan(radians) {\n  return map(radians, function (angle) {\n    return Math.tan(angle);\n  });\n}\n\nfunction asin(radians) {\n  return map(radians, function (angle) {\n    return Math.asin(angle);\n  });\n}\n\nfunction acos(radians) {\n  return map(radians, function (angle) {\n    return Math.acos(angle);\n  });\n}\n\nfunction atan(radians) {\n  return map(radians, function (angle) {\n    return Math.atan(angle);\n  });\n}\n\nfunction clamp(value, min, max) {\n  return map(value, function (value) {\n    return Math.max(min, Math.min(max, value));\n  });\n}\n\nfunction lerp(a, b, t) {\n  if (isArray(a)) {\n    return a.map(function (ai, i) {\n      return lerp(ai, b[i], t);\n    });\n  }\n\n  return t * b + (1 - t) * a;\n}\n\nfunction equals(a, b) {\n  if (isArray(a) && isArray(b)) {\n    if (a === b) {\n      return true;\n    }\n\n    if (a.length !== b.length) {\n      return false;\n    }\n\n    for (var i = 0; i < a.length; ++i) {\n      if (!equals(a[i], b[i])) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return Math.abs(a - b) <= config.EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\n},{}],\"qq7E\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _wrapNativeSuper2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/wrapNativeSuper\"));\n\nvar _common = require(\"./common\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MathArray = function (_Array) {\n  (0, _inherits2.default)(MathArray, _Array);\n\n  function MathArray() {\n    (0, _classCallCheck2.default)(this, MathArray);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(MathArray).apply(this, arguments));\n  }\n\n  (0, _createClass2.default)(MathArray, [{\n    key: \"clone\",\n    value: function clone() {\n      return new this.constructor().copy(this).check();\n    }\n  }, {\n    key: \"copy\",\n    value: function copy(array) {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = array[i];\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"set\",\n    value: function set() {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = (i < 0 || arguments.length <= i ? undefined : arguments[i]) || 0;\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"fromArray\",\n    value: function fromArray(array) {\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = array[i + offset];\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"toString\",\n    value: function toString() {\n      return this.formatString(_common.config);\n    }\n  }, {\n    key: \"formatString\",\n    value: function formatString(opts) {\n      var string = '';\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        string += (i > 0 ? ', ' : '') + (0, _common.formatValue)(this[i], opts);\n      }\n\n      return \"\".concat(opts.printTypes ? this.constructor.name : '', \"[\").concat(string, \"]\");\n    }\n  }, {\n    key: \"toArray\",\n    value: function toArray() {\n      var array = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        array[offset + i] = this[i];\n      }\n\n      return array;\n    }\n  }, {\n    key: \"toFloat32Array\",\n    value: function toFloat32Array() {\n      return new Float32Array(this);\n    }\n  }, {\n    key: \"equals\",\n    value: function equals(array) {\n      if (!array || this.length !== array.length) {\n        return false;\n      }\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        if (!(0, _common.equals)(this[i], array[i])) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n  }, {\n    key: \"exactEquals\",\n    value: function exactEquals(array) {\n      if (!array || this.length !== array.length) {\n        return false;\n      }\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        if (this[i] !== array[i]) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n  }, {\n    key: \"negate\",\n    value: function negate() {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = -this[i];\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"inverse\",\n    value: function inverse() {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = 1 / this[i];\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"lerp\",\n    value: function lerp(a, b, t) {\n      if (t === undefined) {\n        t = b;\n        b = a;\n        a = this;\n      }\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        var ai = a[i];\n        this[i] = ai + t * (b[i] - ai);\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"min\",\n    value: function min(vector) {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = Math.min(vector[i], this[i]);\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"max\",\n    value: function max(vector) {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = Math.max(vector[i], this[i]);\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"clamp\",\n    value: function clamp(minVector, maxVector) {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = Math.min(Math.max(this[i], minVector[i]), maxVector[i]);\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"validate\",\n    value: function validate() {\n      var valid = this.length === this.ELEMENTS;\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        valid = valid && Number.isFinite(this[i]);\n      }\n\n      return valid;\n    }\n  }, {\n    key: \"check\",\n    value: function check() {\n      if (_common.config.debug && !this.validate(this)) {\n        throw new Error(\"math.gl: \".concat(this.constructor.name, \" some fields set to invalid numbers'\"));\n      }\n\n      return this;\n    }\n  }, {\n    key: \"sub\",\n    value: function sub(a) {\n      return this.subtract(a);\n    }\n  }, {\n    key: \"setScalar\",\n    value: function setScalar(a) {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = a;\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"addScalar\",\n    value: function addScalar(a) {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] += a;\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"subScalar\",\n    value: function subScalar(a) {\n      return this.addScalar(-a);\n    }\n  }, {\n    key: \"multiplyScalar\",\n    value: function multiplyScalar(a) {\n      return this.scale(a);\n    }\n  }, {\n    key: \"divideScalar\",\n    value: function divideScalar(a) {\n      return this.scale(1 / a);\n    }\n  }, {\n    key: \"clampScalar\",\n    value: function clampScalar(min, max) {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = Math.min(Math.max(this[i], min), max);\n      }\n\n      return this.check();\n    }\n  }]);\n  return MathArray;\n}((0, _wrapNativeSuper2.default)(Array));\n\nexports.default = MathArray;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/wrapNativeSuper\":\"le0z\",\"./common\":\"U3d7\"}],\"HGuI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _mathArray = _interopRequireDefault(require(\"./math-array\"));\n\nvar _common = require(\"./common\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar assert = function assert(x, m) {\n  if (!x) {\n    throw new Error(m);\n  }\n};\n\nvar Vector = function (_MathArray) {\n  (0, _inherits2.default)(Vector, _MathArray);\n\n  function Vector() {\n    (0, _classCallCheck2.default)(this, Vector);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Vector).apply(this, arguments));\n  }\n\n  (0, _createClass2.default)(Vector, [{\n    key: \"len\",\n    value: function len() {\n      return Math.sqrt(this.lengthSquared());\n    }\n  }, {\n    key: \"magnitude\",\n    value: function magnitude() {\n      return Math.sqrt(this.lengthSquared());\n    }\n  }, {\n    key: \"lengthSquared\",\n    value: function lengthSquared() {\n      var length = 0;\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        length += this[i] * this[i];\n      }\n\n      return length;\n    }\n  }, {\n    key: \"distance\",\n    value: function distance(mathArray) {\n      return Math.sqrt(this.distanceSquared(mathArray));\n    }\n  }, {\n    key: \"distanceSquared\",\n    value: function distanceSquared(mathArray) {\n      var length = 0;\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        var dist = this[i] - mathArray[i];\n        length += dist * dist;\n      }\n\n      return (0, _common.checkNumber)(length);\n    }\n  }, {\n    key: \"dot\",\n    value: function dot(mathArray) {\n      var product = 0;\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        product += this[i] * mathArray[i];\n      }\n\n      return (0, _common.checkNumber)(product);\n    }\n  }, {\n    key: \"normalize\",\n    value: function normalize() {\n      var length = this.magnitude();\n\n      if (length !== 0) {\n        for (var i = 0; i < this.ELEMENTS; ++i) {\n          this[i] /= length;\n        }\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"add\",\n    value: function add() {\n      for (var _len = arguments.length, vectors = new Array(_len), _key = 0; _key < _len; _key++) {\n        vectors[_key] = arguments[_key];\n      }\n\n      for (var _i = 0; _i < vectors.length; _i++) {\n        var vector = vectors[_i];\n\n        for (var i = 0; i < this.ELEMENTS; ++i) {\n          this[i] += vector[i];\n        }\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"subtract\",\n    value: function subtract() {\n      for (var _len2 = arguments.length, vectors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        vectors[_key2] = arguments[_key2];\n      }\n\n      for (var _i2 = 0; _i2 < vectors.length; _i2++) {\n        var vector = vectors[_i2];\n\n        for (var i = 0; i < this.ELEMENTS; ++i) {\n          this[i] -= vector[i];\n        }\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"multiply\",\n    value: function multiply() {\n      for (var _len3 = arguments.length, vectors = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        vectors[_key3] = arguments[_key3];\n      }\n\n      for (var _i3 = 0; _i3 < vectors.length; _i3++) {\n        var vector = vectors[_i3];\n\n        for (var i = 0; i < this.ELEMENTS; ++i) {\n          this[i] *= vector[i];\n        }\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"divide\",\n    value: function divide() {\n      for (var _len4 = arguments.length, vectors = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        vectors[_key4] = arguments[_key4];\n      }\n\n      for (var _i4 = 0; _i4 < vectors.length; _i4++) {\n        var vector = vectors[_i4];\n\n        for (var i = 0; i < this.ELEMENTS; ++i) {\n          this[i] /= vector[i];\n        }\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"scale\",\n    value: function scale(_scale) {\n      if (Array.isArray(_scale)) {\n        return this.multiply(_scale);\n      }\n\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] *= _scale;\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"scaleAndAdd\",\n    value: function scaleAndAdd(vector, scale) {\n      for (var i = 0; i < this.ELEMENTS; ++i) {\n        this[i] = this[i] * scale + vector[i];\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"lengthSq\",\n    value: function lengthSq() {\n      return this.lengthSquared();\n    }\n  }, {\n    key: \"distanceTo\",\n    value: function distanceTo(vector) {\n      return this.distance(vector);\n    }\n  }, {\n    key: \"distanceToSquared\",\n    value: function distanceToSquared(vector) {\n      return this.distanceSquared(vector);\n    }\n  }, {\n    key: \"getComponent\",\n    value: function getComponent(i) {\n      assert(i >= 0 && i < this.ELEMENTS, 'index is out of range');\n      return (0, _common.checkNumber)(this[i]);\n    }\n  }, {\n    key: \"setComponent\",\n    value: function setComponent(i, value) {\n      assert(i >= 0 && i < this.ELEMENTS, 'index is out of range');\n      this[i] = value;\n      return this.check();\n    }\n  }, {\n    key: \"addVectors\",\n    value: function addVectors(a, b) {\n      return this.copy(a).add(b);\n    }\n  }, {\n    key: \"subVectors\",\n    value: function subVectors(a, b) {\n      return this.copy(a).subtract(b);\n    }\n  }, {\n    key: \"multiplyVectors\",\n    value: function multiplyVectors(a, b) {\n      return this.copy(a).multiply(b);\n    }\n  }, {\n    key: \"addScaledVector\",\n    value: function addScaledVector(a, b) {\n      return this.add(new this.constructor(a).multiplyScalar(b));\n    }\n  }, {\n    key: \"x\",\n    get: function get() {\n      return this[0];\n    },\n    set: function set(value) {\n      return this[0] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"y\",\n    get: function get() {\n      return this[1];\n    },\n    set: function set(value) {\n      return this[1] = (0, _common.checkNumber)(value);\n    }\n  }]);\n  return Vector;\n}(_mathArray.default);\n\nexports.default = Vector;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./math-array\":\"qq7E\",\"./common\":\"U3d7\"}],\"PxDr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setMatrixArrayType = setMatrixArrayType;\nexports.toRadian = toRadian;\nexports.equals = equals;\nexports.RANDOM = exports.ARRAY_TYPE = exports.EPSILON = void 0;\n\n/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nvar EPSILON = 0.000001;\nexports.EPSILON = EPSILON;\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nexports.ARRAY_TYPE = ARRAY_TYPE;\nvar RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Type} type Array type, such as Float32Array or Array\n */\n\nexports.RANDOM = RANDOM;\n\nfunction setMatrixArrayType(type) {\n  exports.ARRAY_TYPE = ARRAY_TYPE = type;\n}\n\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nfunction toRadian(a) {\n  return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\n\nif (!Math.hypot) Math.hypot = function () {\n  var y = 0,\n      i = arguments.length;\n\n  while (i--) {\n    y += arguments[i] * arguments[i];\n  }\n\n  return Math.sqrt(y);\n};\n},{}],\"cHtt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.fromValues = fromValues;\nexports.copy = copy;\nexports.set = set;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiply = multiply;\nexports.divide = divide;\nexports.ceil = ceil;\nexports.floor = floor;\nexports.min = min;\nexports.max = max;\nexports.round = round;\nexports.scale = scale;\nexports.scaleAndAdd = scaleAndAdd;\nexports.distance = distance;\nexports.squaredDistance = squaredDistance;\nexports.length = length;\nexports.squaredLength = squaredLength;\nexports.negate = negate;\nexports.inverse = inverse;\nexports.normalize = normalize;\nexports.dot = dot;\nexports.cross = cross;\nexports.lerp = lerp;\nexports.random = random;\nexports.transformMat2 = transformMat2;\nexports.transformMat2d = transformMat2d;\nexports.transformMat3 = transformMat3;\nexports.transformMat4 = transformMat4;\nexports.rotate = rotate;\nexports.angle = angle;\nexports.zero = zero;\nexports.str = str;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.forEach = exports.sqrLen = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = exports.len = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(2);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n  }\n\n  return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {vec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(2);\n  out[0] = a[0];\n  out[1] = a[1];\n  return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\n\nfunction fromValues(x, y) {\n  var out = new glMatrix.ARRAY_TYPE(2);\n  out[0] = x;\n  out[1] = y;\n  return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\n\nfunction set(out, x, y) {\n  out[0] = x;\n  out[1] = y;\n  return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to ceil\n * @returns {vec2} out\n */\n\n\nfunction ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to floor\n * @returns {vec2} out\n */\n\n\nfunction floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\n\n\nfunction max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to round\n * @returns {vec2} out\n */\n\n\nfunction round(out, a) {\n  out[0] = Math.round(a[0]);\n  out[1] = Math.round(a[1]);\n  return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\n\nfunction scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\n\nfunction scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\n\nfunction distance(a, b) {\n  var x = b[0] - a[0],\n      y = b[1] - a[1];\n  return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\n\nfunction squaredDistance(a, b) {\n  var x = b[0] - a[0],\n      y = b[1] - a[1];\n  return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\n\nfunction length(a) {\n  var x = a[0],\n      y = a[1];\n  return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\n\nfunction squaredLength(a) {\n  var x = a[0],\n      y = a[1];\n  return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\n\n\nfunction negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to invert\n * @returns {vec2} out\n */\n\n\nfunction inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\n\n\nfunction normalize(out, a) {\n  var x = a[0],\n      y = a[1];\n  var len = x * x + y * y;\n\n  if (len > 0) {\n    //TODO: evaluate use of glm_invsqrt here?\n    len = 1 / Math.sqrt(len);\n  }\n\n  out[0] = a[0] * len;\n  out[1] = a[1] * len;\n  return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\n\nfunction dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction cross(out, a, b) {\n  var z = a[0] * b[1] - a[1] * b[0];\n  out[0] = out[1] = 0;\n  out[2] = z;\n  return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\n\nfunction lerp(out, a, b, t) {\n  var ax = a[0],\n      ay = a[1];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\n\nfunction random(out, scale) {\n  scale = scale || 1.0;\n  var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n  out[0] = Math.cos(r) * scale;\n  out[1] = Math.sin(r) * scale;\n  return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\n\n\nfunction transformMat2(out, a, m) {\n  var x = a[0],\n      y = a[1];\n  out[0] = m[0] * x + m[2] * y;\n  out[1] = m[1] * x + m[3] * y;\n  return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\n\nfunction transformMat2d(out, a, m) {\n  var x = a[0],\n      y = a[1];\n  out[0] = m[0] * x + m[2] * y + m[4];\n  out[1] = m[1] * x + m[3] * y + m[5];\n  return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\n\n\nfunction transformMat3(out, a, m) {\n  var x = a[0],\n      y = a[1];\n  out[0] = m[0] * x + m[3] * y + m[6];\n  out[1] = m[1] * x + m[4] * y + m[7];\n  return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\n\n\nfunction transformMat4(out, a, m) {\n  var x = a[0];\n  var y = a[1];\n  out[0] = m[0] * x + m[4] * y + m[12];\n  out[1] = m[1] * x + m[5] * y + m[13];\n  return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {vec2} a The vec2 point to rotate\n * @param {vec2} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec2} out\n */\n\n\nfunction rotate(out, a, b, c) {\n  //Translate point to the origin\n  var p0 = a[0] - b[0],\n      p1 = a[1] - b[1],\n      sinC = Math.sin(c),\n      cosC = Math.cos(c); //perform rotation and translate to correct position\n\n  out[0] = p0 * cosC - p1 * sinC + b[0];\n  out[1] = p0 * sinC + p1 * cosC + b[1];\n  return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {vec2} a The first operand\n * @param {vec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\n\nfunction angle(a, b) {\n  var x1 = a[0],\n      y1 = a[1],\n      x2 = b[0],\n      y2 = b[1];\n  var len1 = x1 * x1 + y1 * y1;\n\n  if (len1 > 0) {\n    //TODO: evaluate use of glm_invsqrt here?\n    len1 = 1 / Math.sqrt(len1);\n  }\n\n  var len2 = x2 * x2 + y2 * y2;\n\n  if (len2 > 0) {\n    //TODO: evaluate use of glm_invsqrt here?\n    len2 = 1 / Math.sqrt(len2);\n  }\n\n  var cosine = (x1 * x2 + y1 * y2) * len1 * len2;\n\n  if (cosine > 1.0) {\n    return 0;\n  } else if (cosine < -1.0) {\n    return Math.PI;\n  } else {\n    return Math.acos(cosine);\n  }\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\n\nfunction zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {vec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\n\nfunction str(a) {\n  return 'vec2(' + a[0] + ', ' + a[1] + ')';\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1];\n  var b0 = b[0],\n      b1 = b[1];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\n\nvar len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nexports.len = len;\nvar sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nexports.sub = sub;\nvar mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nexports.mul = mul;\nvar div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nexports.div = div;\nvar dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nexports.dist = dist;\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nexports.sqrDist = sqrDist;\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexports.sqrLen = sqrLen;\n\nvar forEach = function () {\n  var vec = create();\n  return function (a, stride, offset, count, fn, arg) {\n    var i, l;\n\n    if (!stride) {\n      stride = 2;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n    }\n\n    return a;\n  };\n}();\n\nexports.forEach = forEach;\n},{\"./common.js\":\"PxDr\"}],\"lyC9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _vector = _interopRequireDefault(require(\"./lib/vector\"));\n\nvar vec2 = _interopRequireWildcard(require(\"gl-matrix/vec2\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Vector2 = function (_Vector) {\n  (0, _inherits2.default)(Vector2, _Vector);\n\n  function Vector2() {\n    var _this;\n\n    var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n    var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    (0, _classCallCheck2.default)(this, Vector2);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Vector2).call(this, 2));\n\n    if (Array.isArray(x) && arguments.length === 1) {\n      _this.copy(x);\n    } else {\n      _this.set(x, y);\n    }\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Vector2, [{\n    key: \"cross\",\n    value: function cross(vector) {\n      vec2.cross(this, this, vector);\n      return this.check();\n    }\n  }, {\n    key: \"horizontalAngle\",\n    value: function horizontalAngle() {\n      return Math.atan2(this.y, this.x);\n    }\n  }, {\n    key: \"verticalAngle\",\n    value: function verticalAngle() {\n      return Math.atan2(this.x, this.y);\n    }\n  }, {\n    key: \"operation\",\n    value: function operation(_operation) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      _operation.apply(void 0, [this, this].concat(args));\n\n      return this.check();\n    }\n  }, {\n    key: \"ELEMENTS\",\n    get: function get() {\n      return 2;\n    }\n  }]);\n  return Vector2;\n}(_vector.default);\n\nexports.default = Vector2;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./lib/vector\":\"HGuI\",\"gl-matrix/vec2\":\"cHtt\"}],\"Ijz7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.length = length;\nexports.fromValues = fromValues;\nexports.copy = copy;\nexports.set = set;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiply = multiply;\nexports.divide = divide;\nexports.ceil = ceil;\nexports.floor = floor;\nexports.min = min;\nexports.max = max;\nexports.round = round;\nexports.scale = scale;\nexports.scaleAndAdd = scaleAndAdd;\nexports.distance = distance;\nexports.squaredDistance = squaredDistance;\nexports.squaredLength = squaredLength;\nexports.negate = negate;\nexports.inverse = inverse;\nexports.normalize = normalize;\nexports.dot = dot;\nexports.cross = cross;\nexports.lerp = lerp;\nexports.hermite = hermite;\nexports.bezier = bezier;\nexports.random = random;\nexports.transformMat4 = transformMat4;\nexports.transformMat3 = transformMat3;\nexports.transformQuat = transformQuat;\nexports.rotateX = rotateX;\nexports.rotateY = rotateY;\nexports.rotateZ = rotateZ;\nexports.angle = angle;\nexports.zero = zero;\nexports.str = str;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.forEach = exports.sqrLen = exports.len = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(3);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n  }\n\n  return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {vec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(3);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\n\nfunction length(a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\n\nfunction fromValues(x, y, z) {\n  var out = new glMatrix.ARRAY_TYPE(3);\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the source vector\n * @returns {vec3} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\n\nfunction set(out, x, y, z) {\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  out[2] = a[2] * b[2];\n  return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  out[2] = a[2] / b[2];\n  return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to ceil\n * @returns {vec3} out\n */\n\n\nfunction ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  out[2] = Math.ceil(a[2]);\n  return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to floor\n * @returns {vec3} out\n */\n\n\nfunction floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  out[2] = Math.floor(a[2]);\n  return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  out[2] = Math.min(a[2], b[2]);\n  return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  out[2] = Math.max(a[2], b[2]);\n  return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to round\n * @returns {vec3} out\n */\n\n\nfunction round(out, a) {\n  out[0] = Math.round(a[0]);\n  out[1] = Math.round(a[1]);\n  out[2] = Math.round(a[2]);\n  return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\n\nfunction scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\n\nfunction scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\n\nfunction distance(a, b) {\n  var x = b[0] - a[0];\n  var y = b[1] - a[1];\n  var z = b[2] - a[2];\n  return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\n\nfunction squaredDistance(a, b) {\n  var x = b[0] - a[0];\n  var y = b[1] - a[1];\n  var z = b[2] - a[2];\n  return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {vec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\n\nfunction squaredLength(a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to negate\n * @returns {vec3} out\n */\n\n\nfunction negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to invert\n * @returns {vec3} out\n */\n\n\nfunction inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\n\n\nfunction normalize(out, a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  var len = x * x + y * y + z * z;\n\n  if (len > 0) {\n    //TODO: evaluate use of glm_invsqrt here?\n    len = 1 / Math.sqrt(len);\n  }\n\n  out[0] = a[0] * len;\n  out[1] = a[1] * len;\n  out[2] = a[2] * len;\n  return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\n\nfunction dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\n\n\nfunction cross(out, a, b) {\n  var ax = a[0],\n      ay = a[1],\n      az = a[2];\n  var bx = b[0],\n      by = b[1],\n      bz = b[2];\n  out[0] = ay * bz - az * by;\n  out[1] = az * bx - ax * bz;\n  out[2] = ax * by - ay * bx;\n  return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\n\nfunction lerp(out, a, b, t) {\n  var ax = a[0];\n  var ay = a[1];\n  var az = a[2];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  out[2] = az + t * (b[2] - az);\n  return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\n\nfunction hermite(out, a, b, c, d, t) {\n  var factorTimes2 = t * t;\n  var factor1 = factorTimes2 * (2 * t - 3) + 1;\n  var factor2 = factorTimes2 * (t - 2) + t;\n  var factor3 = factorTimes2 * (t - 1);\n  var factor4 = factorTimes2 * (3 - 2 * t);\n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\n\nfunction bezier(out, a, b, c, d, t) {\n  var inverseFactor = 1 - t;\n  var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n  var factorTimes2 = t * t;\n  var factor1 = inverseFactorTimesTwo * inverseFactor;\n  var factor2 = 3 * t * inverseFactorTimesTwo;\n  var factor3 = 3 * factorTimes2 * inverseFactor;\n  var factor4 = factorTimes2 * t;\n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\n\nfunction random(out, scale) {\n  scale = scale || 1.0;\n  var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n  var z = glMatrix.RANDOM() * 2.0 - 1.0;\n  var zScale = Math.sqrt(1.0 - z * z) * scale;\n  out[0] = Math.cos(r) * zScale;\n  out[1] = Math.sin(r) * zScale;\n  out[2] = z * scale;\n  return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\n\n\nfunction transformMat4(out, a, m) {\n  var x = a[0],\n      y = a[1],\n      z = a[2];\n  var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n  w = w || 1.0;\n  out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n  out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n  out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n  return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\n\nfunction transformMat3(out, a, m) {\n  var x = a[0],\n      y = a[1],\n      z = a[2];\n  out[0] = x * m[0] + y * m[3] + z * m[6];\n  out[1] = x * m[1] + y * m[4] + z * m[7];\n  out[2] = x * m[2] + y * m[5] + z * m[8];\n  return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\n\n\nfunction transformQuat(out, a, q) {\n  // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n  var qx = q[0],\n      qy = q[1],\n      qz = q[2],\n      qw = q[3];\n  var x = a[0],\n      y = a[1],\n      z = a[2]; // var qvec = [qx, qy, qz];\n  // var uv = vec3.cross([], qvec, a);\n\n  var uvx = qy * z - qz * y,\n      uvy = qz * x - qx * z,\n      uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n  var uuvx = qy * uvz - qz * uvy,\n      uuvy = qz * uvx - qx * uvz,\n      uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n  var w2 = qw * 2;\n  uvx *= w2;\n  uvy *= w2;\n  uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n  uuvx *= 2;\n  uuvy *= 2;\n  uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n  out[0] = x + uvx + uuvx;\n  out[1] = y + uvy + uuvy;\n  out[2] = z + uvz + uuvz;\n  return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\n\n\nfunction rotateX(out, a, b, c) {\n  var p = [],\n      r = []; //Translate point to the origin\n\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2]; //perform rotation\n\n  r[0] = p[0];\n  r[1] = p[1] * Math.cos(c) - p[2] * Math.sin(c);\n  r[2] = p[1] * Math.sin(c) + p[2] * Math.cos(c); //translate to correct position\n\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n  return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\n\n\nfunction rotateY(out, a, b, c) {\n  var p = [],\n      r = []; //Translate point to the origin\n\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2]; //perform rotation\n\n  r[0] = p[2] * Math.sin(c) + p[0] * Math.cos(c);\n  r[1] = p[1];\n  r[2] = p[2] * Math.cos(c) - p[0] * Math.sin(c); //translate to correct position\n\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n  return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\n\n\nfunction rotateZ(out, a, b, c) {\n  var p = [],\n      r = []; //Translate point to the origin\n\n  p[0] = a[0] - b[0];\n  p[1] = a[1] - b[1];\n  p[2] = a[2] - b[2]; //perform rotation\n\n  r[0] = p[0] * Math.cos(c) - p[1] * Math.sin(c);\n  r[1] = p[0] * Math.sin(c) + p[1] * Math.cos(c);\n  r[2] = p[2]; //translate to correct position\n\n  out[0] = r[0] + b[0];\n  out[1] = r[1] + b[1];\n  out[2] = r[2] + b[2];\n  return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {vec3} a The first operand\n * @param {vec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\n\nfunction angle(a, b) {\n  var tempA = fromValues(a[0], a[1], a[2]);\n  var tempB = fromValues(b[0], b[1], b[2]);\n  normalize(tempA, tempA);\n  normalize(tempB, tempB);\n  var cosine = dot(tempA, tempB);\n\n  if (cosine > 1.0) {\n    return 0;\n  } else if (cosine < -1.0) {\n    return Math.PI;\n  } else {\n    return Math.acos(cosine);\n  }\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\n\nfunction zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {vec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\n\nfunction str(a) {\n  return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\n\nvar sub = subtract;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nexports.sub = sub;\nvar mul = multiply;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nexports.mul = mul;\nvar div = divide;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nexports.div = div;\nvar dist = distance;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nexports.dist = dist;\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nexports.sqrDist = sqrDist;\nvar len = length;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nexports.len = len;\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexports.sqrLen = sqrLen;\n\nvar forEach = function () {\n  var vec = create();\n  return function (a, stride, offset, count, fn, arg) {\n    var i, l;\n\n    if (!stride) {\n      stride = 3;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      vec[2] = a[i + 2];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n      a[i + 2] = vec[2];\n    }\n\n    return a;\n  };\n}();\n\nexports.forEach = forEach;\n},{\"./common.js\":\"PxDr\"}],\"zmVD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _vector = _interopRequireDefault(require(\"./lib/vector\"));\n\nvar _common = require(\"./lib/common\");\n\nvar vec3 = _interopRequireWildcard(require(\"gl-matrix/vec3\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ORIGIN = [0, 0, 0];\n\nvar Vector3 = function (_Vector) {\n  (0, _inherits2.default)(Vector3, _Vector);\n\n  function Vector3() {\n    var _this;\n\n    var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n    var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n    (0, _classCallCheck2.default)(this, Vector3);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Vector3).call(this, 3));\n\n    if (Array.isArray(x) && arguments.length === 1) {\n      _this.copy(x);\n    } else {\n      _this.set(x, y, z);\n    }\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Vector3, [{\n    key: \"angle\",\n    value: function angle(vector) {\n      return vec3.angle(this, vector);\n    }\n  }, {\n    key: \"cross\",\n    value: function cross(vector) {\n      vec3.cross(this, this, vector);\n      return this.check();\n    }\n  }, {\n    key: \"rotateX\",\n    value: function rotateX(_ref) {\n      var radians = _ref.radians,\n          _ref$origin = _ref.origin,\n          origin = _ref$origin === void 0 ? ORIGIN : _ref$origin;\n      vec3.rotateX(this, this, origin, radians);\n      return this.check();\n    }\n  }, {\n    key: \"rotateY\",\n    value: function rotateY(_ref2) {\n      var radians = _ref2.radians,\n          _ref2$origin = _ref2.origin,\n          origin = _ref2$origin === void 0 ? ORIGIN : _ref2$origin;\n      vec3.rotateY(this, this, origin, radians);\n      return this.check();\n    }\n  }, {\n    key: \"rotateZ\",\n    value: function rotateZ(_ref3) {\n      var radians = _ref3.radians,\n          _ref3$origin = _ref3.origin,\n          origin = _ref3$origin === void 0 ? ORIGIN : _ref3$origin;\n      vec3.rotateZ(this, this, origin, radians);\n      return this.check();\n    }\n  }, {\n    key: \"operation\",\n    value: function operation(_operation) {\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      _operation.apply(void 0, [this, this].concat(args));\n\n      return this.check();\n    }\n  }, {\n    key: \"ELEMENTS\",\n    get: function get() {\n      return 3;\n    }\n  }, {\n    key: \"z\",\n    get: function get() {\n      return this[2];\n    },\n    set: function set(value) {\n      return this[2] = (0, _common.checkNumber)(value);\n    }\n  }]);\n  return Vector3;\n}(_vector.default);\n\nexports.default = Vector3;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./lib/vector\":\"HGuI\",\"./lib/common\":\"U3d7\",\"gl-matrix/vec3\":\"Ijz7\"}],\"kOPg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _vector = _interopRequireDefault(require(\"./lib/vector\"));\n\nvar _common = require(\"./lib/common\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Vector4 = function (_Vector) {\n  (0, _inherits2.default)(Vector4, _Vector);\n\n  function Vector4() {\n    var _this;\n\n    var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n    var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n    var w = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n    (0, _classCallCheck2.default)(this, Vector4);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Vector4).call(this, 4));\n\n    if (Array.isArray(x) && arguments.length === 1) {\n      _this.copy(x);\n    } else {\n      _this.set(x, y, z, w);\n    }\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Vector4, [{\n    key: \"applyMatrix4\",\n    value: function applyMatrix4(m) {\n      m.transformVector(this, this);\n      return this;\n    }\n  }, {\n    key: \"ELEMENTS\",\n    get: function get() {\n      return 4;\n    }\n  }, {\n    key: \"z\",\n    get: function get() {\n      return this[2];\n    },\n    set: function set(value) {\n      return this[2] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"w\",\n    get: function get() {\n      return this[3];\n    },\n    set: function set(value) {\n      return this[3] = (0, _common.checkNumber)(value);\n    }\n  }]);\n  return Vector4;\n}(_vector.default);\n\nexports.default = Vector4;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./lib/vector\":\"HGuI\",\"./lib/common\":\"U3d7\"}],\"PGPh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.validateVector = validateVector;\n\nfunction validateVector(v, length) {\n  if (v.length !== length) {\n    return false;\n  }\n\n  return v.every(Number.isFinite);\n}\n},{}],\"SRDq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.fromMat4 = fromMat4;\nexports.clone = clone;\nexports.copy = copy;\nexports.fromValues = fromValues;\nexports.set = set;\nexports.identity = identity;\nexports.transpose = transpose;\nexports.invert = invert;\nexports.adjoint = adjoint;\nexports.determinant = determinant;\nexports.multiply = multiply;\nexports.translate = translate;\nexports.rotate = rotate;\nexports.scale = scale;\nexports.fromTranslation = fromTranslation;\nexports.fromRotation = fromRotation;\nexports.fromScaling = fromScaling;\nexports.fromMat2d = fromMat2d;\nexports.fromQuat = fromQuat;\nexports.normalFromMat4 = normalFromMat4;\nexports.projection = projection;\nexports.str = str;\nexports.frob = frob;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiplyScalar = multiplyScalar;\nexports.multiplyScalarAndAdd = multiplyScalarAndAdd;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.sub = exports.mul = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(9);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n  }\n\n  out[0] = 1;\n  out[4] = 1;\n  out[8] = 1;\n  return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {mat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */\n\n\nfunction fromMat4(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[4];\n  out[4] = a[5];\n  out[5] = a[6];\n  out[6] = a[8];\n  out[7] = a[9];\n  out[8] = a[10];\n  return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {mat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(9);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\n\nfunction fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n  var out = new glMatrix.ARRAY_TYPE(9);\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m10;\n  out[4] = m11;\n  out[5] = m12;\n  out[6] = m20;\n  out[7] = m21;\n  out[8] = m22;\n  return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\n\nfunction set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m10;\n  out[4] = m11;\n  out[5] = m12;\n  out[6] = m20;\n  out[7] = m21;\n  out[8] = m22;\n  return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\n\nfunction identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 1;\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\n\n\nfunction transpose(out, a) {\n  // If we are transposing ourselves we can skip a few steps but have to cache some values\n  if (out === a) {\n    var a01 = a[1],\n        a02 = a[2],\n        a12 = a[5];\n    out[1] = a[3];\n    out[2] = a[6];\n    out[3] = a01;\n    out[5] = a[7];\n    out[6] = a02;\n    out[7] = a12;\n  } else {\n    out[0] = a[0];\n    out[1] = a[3];\n    out[2] = a[6];\n    out[3] = a[1];\n    out[4] = a[4];\n    out[5] = a[7];\n    out[6] = a[2];\n    out[7] = a[5];\n    out[8] = a[8];\n  }\n\n  return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\n\n\nfunction invert(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2];\n  var a10 = a[3],\n      a11 = a[4],\n      a12 = a[5];\n  var a20 = a[6],\n      a21 = a[7],\n      a22 = a[8];\n  var b01 = a22 * a11 - a12 * a21;\n  var b11 = -a22 * a10 + a12 * a20;\n  var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n  var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = b01 * det;\n  out[1] = (-a22 * a01 + a02 * a21) * det;\n  out[2] = (a12 * a01 - a02 * a11) * det;\n  out[3] = b11 * det;\n  out[4] = (a22 * a00 - a02 * a20) * det;\n  out[5] = (-a12 * a00 + a02 * a10) * det;\n  out[6] = b21 * det;\n  out[7] = (-a21 * a00 + a01 * a20) * det;\n  out[8] = (a11 * a00 - a01 * a10) * det;\n  return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\n\n\nfunction adjoint(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2];\n  var a10 = a[3],\n      a11 = a[4],\n      a12 = a[5];\n  var a20 = a[6],\n      a21 = a[7],\n      a22 = a[8];\n  out[0] = a11 * a22 - a12 * a21;\n  out[1] = a02 * a21 - a01 * a22;\n  out[2] = a01 * a12 - a02 * a11;\n  out[3] = a12 * a20 - a10 * a22;\n  out[4] = a00 * a22 - a02 * a20;\n  out[5] = a02 * a10 - a00 * a12;\n  out[6] = a10 * a21 - a11 * a20;\n  out[7] = a01 * a20 - a00 * a21;\n  out[8] = a00 * a11 - a01 * a10;\n  return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {mat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\n\nfunction determinant(a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2];\n  var a10 = a[3],\n      a11 = a[4],\n      a12 = a[5];\n  var a20 = a[6],\n      a21 = a[7],\n      a22 = a[8];\n  return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\n\n\nfunction multiply(out, a, b) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2];\n  var a10 = a[3],\n      a11 = a[4],\n      a12 = a[5];\n  var a20 = a[6],\n      a21 = a[7],\n      a22 = a[8];\n  var b00 = b[0],\n      b01 = b[1],\n      b02 = b[2];\n  var b10 = b[3],\n      b11 = b[4],\n      b12 = b[5];\n  var b20 = b[6],\n      b21 = b[7],\n      b22 = b[8];\n  out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n  out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n  out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n  out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n  out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n  out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n  out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n  out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n  out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n  return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to translate\n * @param {vec2} v vector to translate by\n * @returns {mat3} out\n */\n\n\nfunction translate(out, a, v) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a10 = a[3],\n      a11 = a[4],\n      a12 = a[5],\n      a20 = a[6],\n      a21 = a[7],\n      a22 = a[8],\n      x = v[0],\n      y = v[1];\n  out[0] = a00;\n  out[1] = a01;\n  out[2] = a02;\n  out[3] = a10;\n  out[4] = a11;\n  out[5] = a12;\n  out[6] = x * a00 + y * a10 + a20;\n  out[7] = x * a01 + y * a11 + a21;\n  out[8] = x * a02 + y * a12 + a22;\n  return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\n\nfunction rotate(out, a, rad) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a10 = a[3],\n      a11 = a[4],\n      a12 = a[5],\n      a20 = a[6],\n      a21 = a[7],\n      a22 = a[8],\n      s = Math.sin(rad),\n      c = Math.cos(rad);\n  out[0] = c * a00 + s * a10;\n  out[1] = c * a01 + s * a11;\n  out[2] = c * a02 + s * a12;\n  out[3] = c * a10 - s * a00;\n  out[4] = c * a11 - s * a01;\n  out[5] = c * a12 - s * a02;\n  out[6] = a20;\n  out[7] = a21;\n  out[8] = a22;\n  return out;\n}\n\n;\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nfunction scale(out, a, v) {\n  var x = v[0],\n      y = v[1];\n  out[0] = x * a[0];\n  out[1] = x * a[1];\n  out[2] = x * a[2];\n  out[3] = y * a[3];\n  out[4] = y * a[4];\n  out[5] = y * a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat3} out\n */\n\n\nfunction fromTranslation(out, v) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 1;\n  out[5] = 0;\n  out[6] = v[0];\n  out[7] = v[1];\n  out[8] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\n\nfunction fromRotation(out, rad) {\n  var s = Math.sin(rad),\n      c = Math.cos(rad);\n  out[0] = c;\n  out[1] = s;\n  out[2] = 0;\n  out[3] = -s;\n  out[4] = c;\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat3} out\n */\n\n\nfunction fromScaling(out, v) {\n  out[0] = v[0];\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = v[1];\n  out[5] = 0;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 1;\n  return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\n\nfunction fromMat2d(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = 0;\n  out[3] = a[2];\n  out[4] = a[3];\n  out[5] = 0;\n  out[6] = a[4];\n  out[7] = a[5];\n  out[8] = 1;\n  return out;\n}\n/**\n* Calculates a 3x3 matrix from the given quaternion\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {quat} q Quaternion to create matrix from\n*\n* @returns {mat3} out\n*/\n\n\nfunction fromQuat(out, q) {\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var yx = y * x2;\n  var yy = y * y2;\n  var zx = z * x2;\n  var zy = z * y2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  out[0] = 1 - yy - zz;\n  out[3] = yx - wz;\n  out[6] = zx + wy;\n  out[1] = yx + wz;\n  out[4] = 1 - xx - zz;\n  out[7] = zy - wx;\n  out[2] = zx - wy;\n  out[5] = zy + wx;\n  out[8] = 1 - xx - yy;\n  return out;\n}\n/**\n* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {mat4} a Mat4 to derive the normal matrix from\n*\n* @returns {mat3} out\n*/\n\n\nfunction normalFromMat4(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15];\n  var b00 = a00 * a11 - a01 * a10;\n  var b01 = a00 * a12 - a02 * a10;\n  var b02 = a00 * a13 - a03 * a10;\n  var b03 = a01 * a12 - a02 * a11;\n  var b04 = a01 * a13 - a03 * a11;\n  var b05 = a02 * a13 - a03 * a12;\n  var b06 = a20 * a31 - a21 * a30;\n  var b07 = a20 * a32 - a22 * a30;\n  var b08 = a20 * a33 - a23 * a30;\n  var b09 = a21 * a32 - a22 * a31;\n  var b10 = a21 * a33 - a23 * a31;\n  var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n  var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n  out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n  out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n  out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n  out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n  out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n  out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n  out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n  out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n  return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\n\nfunction projection(out, width, height) {\n  out[0] = 2 / width;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = -2 / height;\n  out[5] = 0;\n  out[6] = -1;\n  out[7] = 1;\n  out[8] = 1;\n  return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {mat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\n\nfunction str(a) {\n  return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ')';\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {mat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\n\nfunction frob(a) {\n  return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  out[4] = a[4] + b[4];\n  out[5] = a[5] + b[5];\n  out[6] = a[6] + b[6];\n  out[7] = a[7] + b[7];\n  out[8] = a[8] + b[8];\n  return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  out[4] = a[4] - b[4];\n  out[5] = a[5] - b[5];\n  out[6] = a[6] - b[6];\n  out[7] = a[7] - b[7];\n  out[8] = a[8] - b[8];\n  return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\n\nfunction multiplyScalar(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  out[4] = a[4] * b;\n  out[5] = a[5] * b;\n  out[6] = a[6] * b;\n  out[7] = a[7] * b;\n  out[8] = a[8] * b;\n  return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  out[4] = a[4] + b[4] * scale;\n  out[5] = a[5] + b[5] * scale;\n  out[6] = a[6] + b[6] * scale;\n  out[7] = a[7] + b[7] * scale;\n  out[8] = a[8] + b[8] * scale;\n  return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3],\n      a4 = a[4],\n      a5 = a[5],\n      a6 = a[6],\n      a7 = a[7],\n      a8 = a[8];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3],\n      b4 = b[4],\n      b5 = b[5],\n      b6 = b[6],\n      b7 = b[7],\n      b8 = b[8];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\n\nvar mul = multiply;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nexports.mul = mul;\nvar sub = subtract;\nexports.sub = sub;\n},{\"./common.js\":\"PxDr\"}],\"JMDE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.validateMatrix3 = validateMatrix3;\nexports.default = void 0;\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/toConsumableArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _mathArray = _interopRequireDefault(require(\"./lib/math-array\"));\n\nvar _validators = require(\"./lib/validators\");\n\nvar _common = require(\"./lib/common\");\n\nvar _vector = _interopRequireDefault(require(\"./vector2\"));\n\nvar _vector2 = _interopRequireDefault(require(\"./vector3\"));\n\nvar mat3 = _interopRequireWildcard(require(\"gl-matrix/mat3\"));\n\nvar vec2 = _interopRequireWildcard(require(\"gl-matrix/vec2\"));\n\nvar vec3 = _interopRequireWildcard(require(\"gl-matrix/vec3\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IDENTITY = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n\nfunction validateMatrix3(m) {\n  return m.length === 9 && Number.isFinite(m[0]) && Number.isFinite(m[1]) && Number.isFinite(m[2]) && Number.isFinite(m[3]) && Number.isFinite(m[4]) && Number.isFinite(m[5]) && Number.isFinite(m[6]) && Number.isFinite(m[7]) && Number.isFinite(m[8]);\n}\n\nvar Matrix3 = function (_MathArray) {\n  (0, _inherits2.default)(Matrix3, _MathArray);\n\n  function Matrix3() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    (0, _classCallCheck2.default)(this, Matrix3);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Matrix3).call(this, 9));\n\n    if (Array.isArray(args[0]) && arguments.length === 1) {\n      _this.copy(args[0]);\n    } else {\n      _this.identity();\n    }\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Matrix3, [{\n    key: \"setRowMajor\",\n    value: function setRowMajor() {\n      var m00 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n      var m01 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var m02 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n      var m10 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n      var m11 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;\n      var m12 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n      var m20 = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;\n      var m21 = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 0;\n      var m22 = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 1;\n      this[0] = m00;\n      this[1] = m10;\n      this[2] = m20;\n      this[3] = m01;\n      this[4] = m11;\n      this[5] = m21;\n      this[6] = m02;\n      this[7] = m12;\n      this[8] = m22;\n      return this.check();\n    }\n  }, {\n    key: \"setColumnMajor\",\n    value: function setColumnMajor() {\n      var m00 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n      var m10 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var m20 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n      var m01 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n      var m11 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;\n      var m21 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n      var m02 = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;\n      var m12 = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 0;\n      var m22 = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 1;\n      this[0] = m00;\n      this[1] = m10;\n      this[2] = m20;\n      this[3] = m01;\n      this[4] = m11;\n      this[5] = m21;\n      this[6] = m02;\n      this[7] = m12;\n      this[8] = m22;\n      return this.check();\n    }\n  }, {\n    key: \"copy\",\n    value: function copy(array) {\n      return this.setColumnMajor.apply(this, (0, _toConsumableArray2.default)(array));\n    }\n  }, {\n    key: \"set\",\n    value: function set() {\n      return this.setColumnMajor.apply(this, arguments);\n    }\n  }, {\n    key: \"getElement\",\n    value: function getElement(i, j) {\n      var columnMajor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      return columnMajor ? this[i * 3 + j] : this[j * 3 + i];\n    }\n  }, {\n    key: \"setElement\",\n    value: function setElement(i, j, value) {\n      var columnMajor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n      if (columnMajor) {\n        this[i * 3 + j] = (0, _common.checkNumber)(value);\n      } else {\n        this[j * 3 + i] = (0, _common.checkNumber)(value);\n      }\n\n      return this;\n    }\n  }, {\n    key: \"determinant\",\n    value: function determinant() {\n      return mat3.determinant(this);\n    }\n  }, {\n    key: \"identity\",\n    value: function identity() {\n      for (var i = 0; i < IDENTITY.length; ++i) {\n        this[i] = IDENTITY[i];\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"fromQuaternion\",\n    value: function fromQuaternion(q) {\n      mat3.fromQuat(this, q);\n      return this.check();\n    }\n  }, {\n    key: \"transpose\",\n    value: function transpose() {\n      mat3.transpose(this, this);\n      return this.check();\n    }\n  }, {\n    key: \"invert\",\n    value: function invert() {\n      mat3.invert(this, this);\n      return this.check();\n    }\n  }, {\n    key: \"multiplyLeft\",\n    value: function multiplyLeft(a) {\n      mat3.multiply(this, a, this);\n      return this.check();\n    }\n  }, {\n    key: \"multiplyRight\",\n    value: function multiplyRight(a) {\n      mat3.multiply(this, this, a);\n      return this.check();\n    }\n  }, {\n    key: \"rotate\",\n    value: function rotate(radians) {\n      mat3.rotate(this, this, radians);\n      return this.check();\n    }\n  }, {\n    key: \"scale\",\n    value: function scale(factor) {\n      if (Array.isArray(factor)) {\n        mat3.scale(this, this, factor);\n      } else {\n        mat3.scale(this, this, [factor, factor, factor]);\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"translate\",\n    value: function translate(vec) {\n      mat3.translate(this, this, vec);\n      return this.check();\n    }\n  }, {\n    key: \"transformVector2\",\n    value: function transformVector2(vector, out) {\n      out = out || new _vector.default();\n      vec2.transformMat3(out, vector, this);\n      (0, _validators.validateVector)(out, 2);\n      return out;\n    }\n  }, {\n    key: \"transformVector3\",\n    value: function transformVector3(vector, out) {\n      out = out || new _vector2.default();\n      vec3.transformMat3(out, vector, this);\n      (0, _validators.validateVector)(out, 3);\n      return out;\n    }\n  }, {\n    key: \"transformVector\",\n    value: function transformVector(vector, out) {\n      switch (vector.length) {\n        case 2:\n          return this.transformVector2(vector, out);\n\n        case 3:\n          return this.transformVector3(vector, out);\n\n        default:\n          throw new Error('Illegal vector');\n      }\n    }\n  }, {\n    key: \"ELEMENTS\",\n    get: function get() {\n      return 9;\n    }\n  }]);\n  return Matrix3;\n}(_mathArray.default);\n\nexports.default = Matrix3;\n},{\"@babel/runtime/helpers/esm/toConsumableArray\":\"Qv3s\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./lib/math-array\":\"qq7E\",\"./lib/validators\":\"PGPh\",\"./lib/common\":\"U3d7\",\"./vector2\":\"lyC9\",\"./vector3\":\"zmVD\",\"gl-matrix/mat3\":\"SRDq\",\"gl-matrix/vec2\":\"cHtt\",\"gl-matrix/vec3\":\"Ijz7\"}],\"WdlT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.copy = copy;\nexports.fromValues = fromValues;\nexports.set = set;\nexports.identity = identity;\nexports.transpose = transpose;\nexports.invert = invert;\nexports.adjoint = adjoint;\nexports.determinant = determinant;\nexports.multiply = multiply;\nexports.translate = translate;\nexports.scale = scale;\nexports.rotate = rotate;\nexports.rotateX = rotateX;\nexports.rotateY = rotateY;\nexports.rotateZ = rotateZ;\nexports.fromTranslation = fromTranslation;\nexports.fromScaling = fromScaling;\nexports.fromRotation = fromRotation;\nexports.fromXRotation = fromXRotation;\nexports.fromYRotation = fromYRotation;\nexports.fromZRotation = fromZRotation;\nexports.fromRotationTranslation = fromRotationTranslation;\nexports.fromQuat2 = fromQuat2;\nexports.getTranslation = getTranslation;\nexports.getScaling = getScaling;\nexports.getRotation = getRotation;\nexports.fromRotationTranslationScale = fromRotationTranslationScale;\nexports.fromRotationTranslationScaleOrigin = fromRotationTranslationScaleOrigin;\nexports.fromQuat = fromQuat;\nexports.frustum = frustum;\nexports.perspective = perspective;\nexports.perspectiveFromFieldOfView = perspectiveFromFieldOfView;\nexports.ortho = ortho;\nexports.lookAt = lookAt;\nexports.targetTo = targetTo;\nexports.str = str;\nexports.frob = frob;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiplyScalar = multiplyScalar;\nexports.multiplyScalarAndAdd = multiplyScalarAndAdd;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.sub = exports.mul = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(16);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n  }\n\n  out[0] = 1;\n  out[5] = 1;\n  out[10] = 1;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {mat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(16);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  out[9] = a[9];\n  out[10] = a[10];\n  out[11] = a[11];\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  out[4] = a[4];\n  out[5] = a[5];\n  out[6] = a[6];\n  out[7] = a[7];\n  out[8] = a[8];\n  out[9] = a[9];\n  out[10] = a[10];\n  out[11] = a[11];\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\n\nfunction fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n  var out = new glMatrix.ARRAY_TYPE(16);\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m03;\n  out[4] = m10;\n  out[5] = m11;\n  out[6] = m12;\n  out[7] = m13;\n  out[8] = m20;\n  out[9] = m21;\n  out[10] = m22;\n  out[11] = m23;\n  out[12] = m30;\n  out[13] = m31;\n  out[14] = m32;\n  out[15] = m33;\n  return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\n\nfunction set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n  out[0] = m00;\n  out[1] = m01;\n  out[2] = m02;\n  out[3] = m03;\n  out[4] = m10;\n  out[5] = m11;\n  out[6] = m12;\n  out[7] = m13;\n  out[8] = m20;\n  out[9] = m21;\n  out[10] = m22;\n  out[11] = m23;\n  out[12] = m30;\n  out[13] = m31;\n  out[14] = m32;\n  out[15] = m33;\n  return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\n\nfunction identity(out) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\n\n\nfunction transpose(out, a) {\n  // If we are transposing ourselves we can skip a few steps but have to cache some values\n  if (out === a) {\n    var a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    var a12 = a[6],\n        a13 = a[7];\n    var a23 = a[11];\n    out[1] = a[4];\n    out[2] = a[8];\n    out[3] = a[12];\n    out[4] = a01;\n    out[6] = a[9];\n    out[7] = a[13];\n    out[8] = a02;\n    out[9] = a12;\n    out[11] = a[14];\n    out[12] = a03;\n    out[13] = a13;\n    out[14] = a23;\n  } else {\n    out[0] = a[0];\n    out[1] = a[4];\n    out[2] = a[8];\n    out[3] = a[12];\n    out[4] = a[1];\n    out[5] = a[5];\n    out[6] = a[9];\n    out[7] = a[13];\n    out[8] = a[2];\n    out[9] = a[6];\n    out[10] = a[10];\n    out[11] = a[14];\n    out[12] = a[3];\n    out[13] = a[7];\n    out[14] = a[11];\n    out[15] = a[15];\n  }\n\n  return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\n\n\nfunction invert(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15];\n  var b00 = a00 * a11 - a01 * a10;\n  var b01 = a00 * a12 - a02 * a10;\n  var b02 = a00 * a13 - a03 * a10;\n  var b03 = a01 * a12 - a02 * a11;\n  var b04 = a01 * a13 - a03 * a11;\n  var b05 = a02 * a13 - a03 * a12;\n  var b06 = a20 * a31 - a21 * a30;\n  var b07 = a20 * a32 - a22 * a30;\n  var b08 = a20 * a33 - a23 * a30;\n  var b09 = a21 * a32 - a22 * a31;\n  var b10 = a21 * a33 - a23 * a31;\n  var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n  var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  if (!det) {\n    return null;\n  }\n\n  det = 1.0 / det;\n  out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n  out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n  out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n  out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n  out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n  out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n  out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n  out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n  out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n  out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n  out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n  out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n  out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n  out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n  out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n  out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n  return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\n\n\nfunction adjoint(out, a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15];\n  out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n  out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n  out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n  out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n  out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n  out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n  out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n  out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n  out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n  out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n  out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n  out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n  out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n  out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n  out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n  out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n  return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\n\nfunction determinant(a) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15];\n  var b00 = a00 * a11 - a01 * a10;\n  var b01 = a00 * a12 - a02 * a10;\n  var b02 = a00 * a13 - a03 * a10;\n  var b03 = a01 * a12 - a02 * a11;\n  var b04 = a01 * a13 - a03 * a11;\n  var b05 = a02 * a13 - a03 * a12;\n  var b06 = a20 * a31 - a21 * a30;\n  var b07 = a20 * a32 - a22 * a30;\n  var b08 = a20 * a33 - a23 * a30;\n  var b09 = a21 * a32 - a22 * a31;\n  var b10 = a21 * a33 - a23 * a31;\n  var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n  return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\n\n\nfunction multiply(out, a, b) {\n  var a00 = a[0],\n      a01 = a[1],\n      a02 = a[2],\n      a03 = a[3];\n  var a10 = a[4],\n      a11 = a[5],\n      a12 = a[6],\n      a13 = a[7];\n  var a20 = a[8],\n      a21 = a[9],\n      a22 = a[10],\n      a23 = a[11];\n  var a30 = a[12],\n      a31 = a[13],\n      a32 = a[14],\n      a33 = a[15]; // Cache only the current line of the second matrix\n\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3];\n  out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  b0 = b[4];\n  b1 = b[5];\n  b2 = b[6];\n  b3 = b[7];\n  out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  b0 = b[8];\n  b1 = b[9];\n  b2 = b[10];\n  b3 = b[11];\n  out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  b0 = b[12];\n  b1 = b[13];\n  b2 = b[14];\n  b3 = b[15];\n  out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n  out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n  out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n  out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n  return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\n\n\nfunction translate(out, a, v) {\n  var x = v[0],\n      y = v[1],\n      z = v[2];\n  var a00, a01, a02, a03;\n  var a10, a11, a12, a13;\n  var a20, a21, a22, a23;\n\n  if (a === out) {\n    out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n    out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n    out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n    out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n  } else {\n    a00 = a[0];\n    a01 = a[1];\n    a02 = a[2];\n    a03 = a[3];\n    a10 = a[4];\n    a11 = a[5];\n    a12 = a[6];\n    a13 = a[7];\n    a20 = a[8];\n    a21 = a[9];\n    a22 = a[10];\n    a23 = a[11];\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n    out[3] = a03;\n    out[4] = a10;\n    out[5] = a11;\n    out[6] = a12;\n    out[7] = a13;\n    out[8] = a20;\n    out[9] = a21;\n    out[10] = a22;\n    out[11] = a23;\n    out[12] = a00 * x + a10 * y + a20 * z + a[12];\n    out[13] = a01 * x + a11 * y + a21 * z + a[13];\n    out[14] = a02 * x + a12 * y + a22 * z + a[14];\n    out[15] = a03 * x + a13 * y + a23 * z + a[15];\n  }\n\n  return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\n\nfunction scale(out, a, v) {\n  var x = v[0],\n      y = v[1],\n      z = v[2];\n  out[0] = a[0] * x;\n  out[1] = a[1] * x;\n  out[2] = a[2] * x;\n  out[3] = a[3] * x;\n  out[4] = a[4] * y;\n  out[5] = a[5] * y;\n  out[6] = a[6] * y;\n  out[7] = a[7] * y;\n  out[8] = a[8] * z;\n  out[9] = a[9] * z;\n  out[10] = a[10] * z;\n  out[11] = a[11] * z;\n  out[12] = a[12];\n  out[13] = a[13];\n  out[14] = a[14];\n  out[15] = a[15];\n  return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\n\nfunction rotate(out, a, rad, axis) {\n  var x = axis[0],\n      y = axis[1],\n      z = axis[2];\n  var len = Math.hypot(x, y, z);\n  var s, c, t;\n  var a00, a01, a02, a03;\n  var a10, a11, a12, a13;\n  var a20, a21, a22, a23;\n  var b00, b01, b02;\n  var b10, b11, b12;\n  var b20, b21, b22;\n\n  if (len < glMatrix.EPSILON) {\n    return null;\n  }\n\n  len = 1 / len;\n  x *= len;\n  y *= len;\n  z *= len;\n  s = Math.sin(rad);\n  c = Math.cos(rad);\n  t = 1 - c;\n  a00 = a[0];\n  a01 = a[1];\n  a02 = a[2];\n  a03 = a[3];\n  a10 = a[4];\n  a11 = a[5];\n  a12 = a[6];\n  a13 = a[7];\n  a20 = a[8];\n  a21 = a[9];\n  a22 = a[10];\n  a23 = a[11]; // Construct the elements of the rotation matrix\n\n  b00 = x * x * t + c;\n  b01 = y * x * t + z * s;\n  b02 = z * x * t - y * s;\n  b10 = x * y * t - z * s;\n  b11 = y * y * t + c;\n  b12 = z * y * t + x * s;\n  b20 = x * z * t + y * s;\n  b21 = y * z * t - x * s;\n  b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n  out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n  out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n  out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n  out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n  out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n  out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n  out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n  out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n  out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n  out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n  out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n  out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged last row\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  }\n\n  return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction rotateX(out, a, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  var a10 = a[4];\n  var a11 = a[5];\n  var a12 = a[6];\n  var a13 = a[7];\n  var a20 = a[8];\n  var a21 = a[9];\n  var a22 = a[10];\n  var a23 = a[11];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged rows\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  } // Perform axis-specific matrix multiplication\n\n\n  out[4] = a10 * c + a20 * s;\n  out[5] = a11 * c + a21 * s;\n  out[6] = a12 * c + a22 * s;\n  out[7] = a13 * c + a23 * s;\n  out[8] = a20 * c - a10 * s;\n  out[9] = a21 * c - a11 * s;\n  out[10] = a22 * c - a12 * s;\n  out[11] = a23 * c - a13 * s;\n  return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction rotateY(out, a, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  var a00 = a[0];\n  var a01 = a[1];\n  var a02 = a[2];\n  var a03 = a[3];\n  var a20 = a[8];\n  var a21 = a[9];\n  var a22 = a[10];\n  var a23 = a[11];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged rows\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  } // Perform axis-specific matrix multiplication\n\n\n  out[0] = a00 * c - a20 * s;\n  out[1] = a01 * c - a21 * s;\n  out[2] = a02 * c - a22 * s;\n  out[3] = a03 * c - a23 * s;\n  out[8] = a00 * s + a20 * c;\n  out[9] = a01 * s + a21 * c;\n  out[10] = a02 * s + a22 * c;\n  out[11] = a03 * s + a23 * c;\n  return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction rotateZ(out, a, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad);\n  var a00 = a[0];\n  var a01 = a[1];\n  var a02 = a[2];\n  var a03 = a[3];\n  var a10 = a[4];\n  var a11 = a[5];\n  var a12 = a[6];\n  var a13 = a[7];\n\n  if (a !== out) {\n    // If the source and destination differ, copy the unchanged last row\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n  } // Perform axis-specific matrix multiplication\n\n\n  out[0] = a00 * c + a10 * s;\n  out[1] = a01 * c + a11 * s;\n  out[2] = a02 * c + a12 * s;\n  out[3] = a03 * c + a13 * s;\n  out[4] = a10 * c - a00 * s;\n  out[5] = a11 * c - a01 * s;\n  out[6] = a12 * c - a02 * s;\n  out[7] = a13 * c - a03 * s;\n  return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\n\n\nfunction fromTranslation(out, v) {\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Scaling vector\n * @returns {mat4} out\n */\n\n\nfunction fromScaling(out, v) {\n  out[0] = v[0];\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = v[1];\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = v[2];\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\n\nfunction fromRotation(out, rad, axis) {\n  var x = axis[0],\n      y = axis[1],\n      z = axis[2];\n  var len = Math.hypot(x, y, z);\n  var s, c, t;\n\n  if (len < glMatrix.EPSILON) {\n    return null;\n  }\n\n  len = 1 / len;\n  x *= len;\n  y *= len;\n  z *= len;\n  s = Math.sin(rad);\n  c = Math.cos(rad);\n  t = 1 - c; // Perform rotation-specific matrix multiplication\n\n  out[0] = x * x * t + c;\n  out[1] = y * x * t + z * s;\n  out[2] = z * x * t - y * s;\n  out[3] = 0;\n  out[4] = x * y * t - z * s;\n  out[5] = y * y * t + c;\n  out[6] = z * y * t + x * s;\n  out[7] = 0;\n  out[8] = x * z * t + y * s;\n  out[9] = y * z * t - x * s;\n  out[10] = z * z * t + c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction fromXRotation(out, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n  out[0] = 1;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = c;\n  out[6] = s;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = -s;\n  out[10] = c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction fromYRotation(out, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n  out[0] = c;\n  out[1] = 0;\n  out[2] = -s;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = 1;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = s;\n  out[9] = 0;\n  out[10] = c;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\n\nfunction fromZRotation(out, rad) {\n  var s = Math.sin(rad);\n  var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n  out[0] = c;\n  out[1] = s;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = -s;\n  out[5] = c;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 1;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\n\n\nfunction fromRotationTranslation(out, q, v) {\n  // Quaternion math\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  out[0] = 1 - (yy + zz);\n  out[1] = xy + wz;\n  out[2] = xz - wy;\n  out[3] = 0;\n  out[4] = xy - wz;\n  out[5] = 1 - (xx + zz);\n  out[6] = yz + wx;\n  out[7] = 0;\n  out[8] = xz + wy;\n  out[9] = yz - wx;\n  out[10] = 1 - (xx + yy);\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {quat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\n\nfunction fromQuat2(out, a) {\n  var translation = new glMatrix.ARRAY_TYPE(3);\n  var bx = -a[0],\n      by = -a[1],\n      bz = -a[2],\n      bw = a[3],\n      ax = a[4],\n      ay = a[5],\n      az = a[6],\n      aw = a[7];\n  var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n  if (magnitude > 0) {\n    translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n    translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n    translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n  } else {\n    translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n    translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n    translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n  }\n\n  fromRotationTranslation(out, a, translation);\n  return out;\n}\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\n\nfunction getTranslation(out, mat) {\n  out[0] = mat[12];\n  out[1] = mat[13];\n  out[2] = mat[14];\n  return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslationScale\n *  with a normalized Quaternion paramter, the returned vector will be\n *  the same as the scaling vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive scaling factor component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\n\nfunction getScaling(out, mat) {\n  var m11 = mat[0];\n  var m12 = mat[1];\n  var m13 = mat[2];\n  var m21 = mat[4];\n  var m22 = mat[5];\n  var m23 = mat[6];\n  var m31 = mat[8];\n  var m32 = mat[9];\n  var m33 = mat[10];\n  out[0] = Math.hypot(m11, m12, m13);\n  out[1] = Math.hypot(m21, m22, m23);\n  out[2] = Math.hypot(m31, m32, m33);\n  return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {mat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\n\nfunction getRotation(out, mat) {\n  var scaling = new glMatrix.ARRAY_TYPE(3);\n  getScaling(scaling, mat);\n  var is1 = 1 / scaling[0];\n  var is2 = 1 / scaling[1];\n  var is3 = 1 / scaling[2];\n  var sm11 = mat[0] * is1;\n  var sm12 = mat[1] * is2;\n  var sm13 = mat[2] * is3;\n  var sm21 = mat[4] * is1;\n  var sm22 = mat[5] * is2;\n  var sm23 = mat[6] * is3;\n  var sm31 = mat[8] * is1;\n  var sm32 = mat[9] * is2;\n  var sm33 = mat[10] * is3;\n  var trace = sm11 + sm22 + sm33;\n  var S = 0;\n\n  if (trace > 0) {\n    S = Math.sqrt(trace + 1.0) * 2;\n    out[3] = 0.25 * S;\n    out[0] = (sm23 - sm32) / S;\n    out[1] = (sm31 - sm13) / S;\n    out[2] = (sm12 - sm21) / S;\n  } else if (sm11 > sm22 && sm11 > sm33) {\n    S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n    out[3] = (sm23 - sm32) / S;\n    out[0] = 0.25 * S;\n    out[1] = (sm12 + sm21) / S;\n    out[2] = (sm31 + sm13) / S;\n  } else if (sm22 > sm33) {\n    S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n    out[3] = (sm31 - sm13) / S;\n    out[0] = (sm12 + sm21) / S;\n    out[1] = 0.25 * S;\n    out[2] = (sm23 + sm32) / S;\n  } else {\n    S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n    out[3] = (sm12 - sm21) / S;\n    out[0] = (sm31 + sm13) / S;\n    out[1] = (sm23 + sm32) / S;\n    out[2] = 0.25 * S;\n  }\n\n  return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @returns {mat4} out\n */\n\n\nfunction fromRotationTranslationScale(out, q, v, s) {\n  // Quaternion math\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  var sx = s[0];\n  var sy = s[1];\n  var sz = s[2];\n  out[0] = (1 - (yy + zz)) * sx;\n  out[1] = (xy + wz) * sx;\n  out[2] = (xz - wy) * sx;\n  out[3] = 0;\n  out[4] = (xy - wz) * sy;\n  out[5] = (1 - (xx + zz)) * sy;\n  out[6] = (yz + wx) * sy;\n  out[7] = 0;\n  out[8] = (xz + wy) * sz;\n  out[9] = (yz - wx) * sz;\n  out[10] = (1 - (xx + yy)) * sz;\n  out[11] = 0;\n  out[12] = v[0];\n  out[13] = v[1];\n  out[14] = v[2];\n  out[15] = 1;\n  return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     mat4.translate(dest, origin);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *     mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @param {vec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\n\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n  // Quaternion math\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  var sx = s[0];\n  var sy = s[1];\n  var sz = s[2];\n  var ox = o[0];\n  var oy = o[1];\n  var oz = o[2];\n  var out0 = (1 - (yy + zz)) * sx;\n  var out1 = (xy + wz) * sx;\n  var out2 = (xz - wy) * sx;\n  var out4 = (xy - wz) * sy;\n  var out5 = (1 - (xx + zz)) * sy;\n  var out6 = (yz + wx) * sy;\n  var out8 = (xz + wy) * sz;\n  var out9 = (yz - wx) * sz;\n  var out10 = (1 - (xx + yy)) * sz;\n  out[0] = out0;\n  out[1] = out1;\n  out[2] = out2;\n  out[3] = 0;\n  out[4] = out4;\n  out[5] = out5;\n  out[6] = out6;\n  out[7] = 0;\n  out[8] = out8;\n  out[9] = out9;\n  out[10] = out10;\n  out[11] = 0;\n  out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n  out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n  out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n  out[15] = 1;\n  return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\n\nfunction fromQuat(out, q) {\n  var x = q[0],\n      y = q[1],\n      z = q[2],\n      w = q[3];\n  var x2 = x + x;\n  var y2 = y + y;\n  var z2 = z + z;\n  var xx = x * x2;\n  var yx = y * x2;\n  var yy = y * y2;\n  var zx = z * x2;\n  var zy = z * y2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  out[0] = 1 - yy - zz;\n  out[1] = yx + wz;\n  out[2] = zx - wy;\n  out[3] = 0;\n  out[4] = yx - wz;\n  out[5] = 1 - xx - zz;\n  out[6] = zy + wx;\n  out[7] = 0;\n  out[8] = zx + wy;\n  out[9] = zy - wx;\n  out[10] = 1 - xx - yy;\n  out[11] = 0;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = 0;\n  out[15] = 1;\n  return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\n\nfunction frustum(out, left, right, bottom, top, near, far) {\n  var rl = 1 / (right - left);\n  var tb = 1 / (top - bottom);\n  var nf = 1 / (near - far);\n  out[0] = near * 2 * rl;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = near * 2 * tb;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = (right + left) * rl;\n  out[9] = (top + bottom) * tb;\n  out[10] = (far + near) * nf;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[14] = far * near * 2 * nf;\n  out[15] = 0;\n  return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\n\nfunction perspective(out, fovy, aspect, near, far) {\n  var f = 1.0 / Math.tan(fovy / 2),\n      nf;\n  out[0] = f / aspect;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = f;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[11] = -1;\n  out[12] = 0;\n  out[13] = 0;\n  out[15] = 0;\n\n  if (far != null && far !== Infinity) {\n    nf = 1 / (near - far);\n    out[10] = (far + near) * nf;\n    out[14] = 2 * far * near * nf;\n  } else {\n    out[10] = -1;\n    out[14] = -2 * near;\n  }\n\n  return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\n\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n  var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n  var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n  var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n  var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n  var xScale = 2.0 / (leftTan + rightTan);\n  var yScale = 2.0 / (upTan + downTan);\n  out[0] = xScale;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  out[3] = 0.0;\n  out[4] = 0.0;\n  out[5] = yScale;\n  out[6] = 0.0;\n  out[7] = 0.0;\n  out[8] = -((leftTan - rightTan) * xScale * 0.5);\n  out[9] = (upTan - downTan) * yScale * 0.5;\n  out[10] = far / (near - far);\n  out[11] = -1.0;\n  out[12] = 0.0;\n  out[13] = 0.0;\n  out[14] = far * near / (near - far);\n  out[15] = 0.0;\n  return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\n\nfunction ortho(out, left, right, bottom, top, near, far) {\n  var lr = 1 / (left - right);\n  var bt = 1 / (bottom - top);\n  var nf = 1 / (near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 2 * nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = (far + near) * nf;\n  out[15] = 1;\n  return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} center Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\n\nfunction lookAt(out, eye, center, up) {\n  var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n  var eyex = eye[0];\n  var eyey = eye[1];\n  var eyez = eye[2];\n  var upx = up[0];\n  var upy = up[1];\n  var upz = up[2];\n  var centerx = center[0];\n  var centery = center[1];\n  var centerz = center[2];\n\n  if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n    return identity(out);\n  }\n\n  z0 = eyex - centerx;\n  z1 = eyey - centery;\n  z2 = eyez - centerz;\n  len = 1 / Math.hypot(z0, z1, z2);\n  z0 *= len;\n  z1 *= len;\n  z2 *= len;\n  x0 = upy * z2 - upz * z1;\n  x1 = upz * z0 - upx * z2;\n  x2 = upx * z1 - upy * z0;\n  len = Math.hypot(x0, x1, x2);\n\n  if (!len) {\n    x0 = 0;\n    x1 = 0;\n    x2 = 0;\n  } else {\n    len = 1 / len;\n    x0 *= len;\n    x1 *= len;\n    x2 *= len;\n  }\n\n  y0 = z1 * x2 - z2 * x1;\n  y1 = z2 * x0 - z0 * x2;\n  y2 = z0 * x1 - z1 * x0;\n  len = Math.hypot(y0, y1, y2);\n\n  if (!len) {\n    y0 = 0;\n    y1 = 0;\n    y2 = 0;\n  } else {\n    len = 1 / len;\n    y0 *= len;\n    y1 *= len;\n    y2 *= len;\n  }\n\n  out[0] = x0;\n  out[1] = y0;\n  out[2] = z0;\n  out[3] = 0;\n  out[4] = x1;\n  out[5] = y1;\n  out[6] = z1;\n  out[7] = 0;\n  out[8] = x2;\n  out[9] = y2;\n  out[10] = z2;\n  out[11] = 0;\n  out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n  out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n  out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n  out[15] = 1;\n  return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} center Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\n\nfunction targetTo(out, eye, target, up) {\n  var eyex = eye[0],\n      eyey = eye[1],\n      eyez = eye[2],\n      upx = up[0],\n      upy = up[1],\n      upz = up[2];\n  var z0 = eyex - target[0],\n      z1 = eyey - target[1],\n      z2 = eyez - target[2];\n  var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n  }\n\n  var x0 = upy * z2 - upz * z1,\n      x1 = upz * z0 - upx * z2,\n      x2 = upx * z1 - upy * z0;\n  len = x0 * x0 + x1 * x1 + x2 * x2;\n\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n    x0 *= len;\n    x1 *= len;\n    x2 *= len;\n  }\n\n  out[0] = x0;\n  out[1] = x1;\n  out[2] = x2;\n  out[3] = 0;\n  out[4] = z1 * x2 - z2 * x1;\n  out[5] = z2 * x0 - z0 * x2;\n  out[6] = z0 * x1 - z1 * x0;\n  out[7] = 0;\n  out[8] = z0;\n  out[9] = z1;\n  out[10] = z2;\n  out[11] = 0;\n  out[12] = eyex;\n  out[13] = eyey;\n  out[14] = eyez;\n  out[15] = 1;\n  return out;\n}\n\n;\n/**\n * Returns a string representation of a mat4\n *\n * @param {mat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nfunction str(a) {\n  return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' + a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' + a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {mat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\n\nfunction frob(a) {\n  return Math.hypot(a[0], a[1], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  out[4] = a[4] + b[4];\n  out[5] = a[5] + b[5];\n  out[6] = a[6] + b[6];\n  out[7] = a[7] + b[7];\n  out[8] = a[8] + b[8];\n  out[9] = a[9] + b[9];\n  out[10] = a[10] + b[10];\n  out[11] = a[11] + b[11];\n  out[12] = a[12] + b[12];\n  out[13] = a[13] + b[13];\n  out[14] = a[14] + b[14];\n  out[15] = a[15] + b[15];\n  return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  out[4] = a[4] - b[4];\n  out[5] = a[5] - b[5];\n  out[6] = a[6] - b[6];\n  out[7] = a[7] - b[7];\n  out[8] = a[8] - b[8];\n  out[9] = a[9] - b[9];\n  out[10] = a[10] - b[10];\n  out[11] = a[11] - b[11];\n  out[12] = a[12] - b[12];\n  out[13] = a[13] - b[13];\n  out[14] = a[14] - b[14];\n  out[15] = a[15] - b[15];\n  return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\n\nfunction multiplyScalar(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  out[4] = a[4] * b;\n  out[5] = a[5] * b;\n  out[6] = a[6] * b;\n  out[7] = a[7] * b;\n  out[8] = a[8] * b;\n  out[9] = a[9] * b;\n  out[10] = a[10] * b;\n  out[11] = a[11] * b;\n  out[12] = a[12] * b;\n  out[13] = a[13] * b;\n  out[14] = a[14] * b;\n  out[15] = a[15] * b;\n  return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  out[4] = a[4] + b[4] * scale;\n  out[5] = a[5] + b[5] * scale;\n  out[6] = a[6] + b[6] * scale;\n  out[7] = a[7] + b[7] * scale;\n  out[8] = a[8] + b[8] * scale;\n  out[9] = a[9] + b[9] * scale;\n  out[10] = a[10] + b[10] * scale;\n  out[11] = a[11] + b[11] * scale;\n  out[12] = a[12] + b[12] * scale;\n  out[13] = a[13] + b[13] * scale;\n  out[14] = a[14] + b[14] * scale;\n  out[15] = a[15] + b[15] * scale;\n  return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var a4 = a[4],\n      a5 = a[5],\n      a6 = a[6],\n      a7 = a[7];\n  var a8 = a[8],\n      a9 = a[9],\n      a10 = a[10],\n      a11 = a[11];\n  var a12 = a[12],\n      a13 = a[13],\n      a14 = a[14],\n      a15 = a[15];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3];\n  var b4 = b[4],\n      b5 = b[5],\n      b6 = b[6],\n      b7 = b[7];\n  var b8 = b[8],\n      b9 = b[9],\n      b10 = b[10],\n      b11 = b[11];\n  var b12 = b[12],\n      b13 = b[13],\n      b14 = b[14],\n      b15 = b[15];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\n\nvar mul = multiply;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nexports.mul = mul;\nvar sub = subtract;\nexports.sub = sub;\n},{\"./common.js\":\"PxDr\"}],\"QGfo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.clone = clone;\nexports.fromValues = fromValues;\nexports.copy = copy;\nexports.set = set;\nexports.add = add;\nexports.subtract = subtract;\nexports.multiply = multiply;\nexports.divide = divide;\nexports.ceil = ceil;\nexports.floor = floor;\nexports.min = min;\nexports.max = max;\nexports.round = round;\nexports.scale = scale;\nexports.scaleAndAdd = scaleAndAdd;\nexports.distance = distance;\nexports.squaredDistance = squaredDistance;\nexports.length = length;\nexports.squaredLength = squaredLength;\nexports.negate = negate;\nexports.inverse = inverse;\nexports.normalize = normalize;\nexports.dot = dot;\nexports.cross = cross;\nexports.lerp = lerp;\nexports.random = random;\nexports.transformMat4 = transformMat4;\nexports.transformQuat = transformQuat;\nexports.zero = zero;\nexports.str = str;\nexports.exactEquals = exactEquals;\nexports.equals = equals;\nexports.forEach = exports.sqrLen = exports.len = exports.sqrDist = exports.dist = exports.div = exports.mul = exports.sub = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(4);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n  }\n\n  return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {vec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\n\nfunction clone(a) {\n  var out = new glMatrix.ARRAY_TYPE(4);\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\n\nfunction fromValues(x, y, z, w) {\n  var out = new glMatrix.ARRAY_TYPE(4);\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = w;\n  return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the source vector\n * @returns {vec4} out\n */\n\n\nfunction copy(out, a) {\n  out[0] = a[0];\n  out[1] = a[1];\n  out[2] = a[2];\n  out[3] = a[3];\n  return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\n\nfunction set(out, x, y, z, w) {\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = w;\n  return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction add(out, a, b) {\n  out[0] = a[0] + b[0];\n  out[1] = a[1] + b[1];\n  out[2] = a[2] + b[2];\n  out[3] = a[3] + b[3];\n  return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction subtract(out, a, b) {\n  out[0] = a[0] - b[0];\n  out[1] = a[1] - b[1];\n  out[2] = a[2] - b[2];\n  out[3] = a[3] - b[3];\n  return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction multiply(out, a, b) {\n  out[0] = a[0] * b[0];\n  out[1] = a[1] * b[1];\n  out[2] = a[2] * b[2];\n  out[3] = a[3] * b[3];\n  return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction divide(out, a, b) {\n  out[0] = a[0] / b[0];\n  out[1] = a[1] / b[1];\n  out[2] = a[2] / b[2];\n  out[3] = a[3] / b[3];\n  return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to ceil\n * @returns {vec4} out\n */\n\n\nfunction ceil(out, a) {\n  out[0] = Math.ceil(a[0]);\n  out[1] = Math.ceil(a[1]);\n  out[2] = Math.ceil(a[2]);\n  out[3] = Math.ceil(a[3]);\n  return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to floor\n * @returns {vec4} out\n */\n\n\nfunction floor(out, a) {\n  out[0] = Math.floor(a[0]);\n  out[1] = Math.floor(a[1]);\n  out[2] = Math.floor(a[2]);\n  out[3] = Math.floor(a[3]);\n  return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction min(out, a, b) {\n  out[0] = Math.min(a[0], b[0]);\n  out[1] = Math.min(a[1], b[1]);\n  out[2] = Math.min(a[2], b[2]);\n  out[3] = Math.min(a[3], b[3]);\n  return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\n\n\nfunction max(out, a, b) {\n  out[0] = Math.max(a[0], b[0]);\n  out[1] = Math.max(a[1], b[1]);\n  out[2] = Math.max(a[2], b[2]);\n  out[3] = Math.max(a[3], b[3]);\n  return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to round\n * @returns {vec4} out\n */\n\n\nfunction round(out, a) {\n  out[0] = Math.round(a[0]);\n  out[1] = Math.round(a[1]);\n  out[2] = Math.round(a[2]);\n  out[3] = Math.round(a[3]);\n  return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\n\nfunction scale(out, a, b) {\n  out[0] = a[0] * b;\n  out[1] = a[1] * b;\n  out[2] = a[2] * b;\n  out[3] = a[3] * b;\n  return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\n\nfunction scaleAndAdd(out, a, b, scale) {\n  out[0] = a[0] + b[0] * scale;\n  out[1] = a[1] + b[1] * scale;\n  out[2] = a[2] + b[2] * scale;\n  out[3] = a[3] + b[3] * scale;\n  return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\n\nfunction distance(a, b) {\n  var x = b[0] - a[0];\n  var y = b[1] - a[1];\n  var z = b[2] - a[2];\n  var w = b[3] - a[3];\n  return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\n\nfunction squaredDistance(a, b) {\n  var x = b[0] - a[0];\n  var y = b[1] - a[1];\n  var z = b[2] - a[2];\n  var w = b[3] - a[3];\n  return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {vec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\n\nfunction length(a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  var w = a[3];\n  return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {vec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\n\nfunction squaredLength(a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  var w = a[3];\n  return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to negate\n * @returns {vec4} out\n */\n\n\nfunction negate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  out[3] = -a[3];\n  return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to invert\n * @returns {vec4} out\n */\n\n\nfunction inverse(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  out[3] = 1.0 / a[3];\n  return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to normalize\n * @returns {vec4} out\n */\n\n\nfunction normalize(out, a) {\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n  var w = a[3];\n  var len = x * x + y * y + z * z + w * w;\n\n  if (len > 0) {\n    len = 1 / Math.sqrt(len);\n  }\n\n  out[0] = x * len;\n  out[1] = y * len;\n  out[2] = z * len;\n  out[3] = w * len;\n  return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\n\nfunction dot(a, b) {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {vec4} result the receiving vector\n * @param {vec4} U the first vector\n * @param {vec4} V the second vector\n * @param {vec4} W the third vector\n * @returns {vec4} result\n */\n\n\nfunction cross(out, u, v, w) {\n  var A = v[0] * w[1] - v[1] * w[0],\n      B = v[0] * w[2] - v[2] * w[0],\n      C = v[0] * w[3] - v[3] * w[0],\n      D = v[1] * w[2] - v[2] * w[1],\n      E = v[1] * w[3] - v[3] * w[1],\n      F = v[2] * w[3] - v[3] * w[2];\n  var G = u[0];\n  var H = u[1];\n  var I = u[2];\n  var J = u[3];\n  out[0] = H * F - I * E + J * D;\n  out[1] = -(G * F) + I * C - J * B;\n  out[2] = G * E - H * C + J * A;\n  out[3] = -(G * D) + H * B - I * A;\n  return out;\n}\n\n;\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nfunction lerp(out, a, b, t) {\n  var ax = a[0];\n  var ay = a[1];\n  var az = a[2];\n  var aw = a[3];\n  out[0] = ax + t * (b[0] - ax);\n  out[1] = ay + t * (b[1] - ay);\n  out[2] = az + t * (b[2] - az);\n  out[3] = aw + t * (b[3] - aw);\n  return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\n\nfunction random(out, scale) {\n  scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n  // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n  // http://projecteuclid.org/euclid.aoms/1177692644;\n\n  var v1, v2, v3, v4;\n  var s1, s2;\n\n  do {\n    v1 = glMatrix.RANDOM() * 2 - 1;\n    v2 = glMatrix.RANDOM() * 2 - 1;\n    s1 = v1 * v1 + v2 * v2;\n  } while (s1 >= 1);\n\n  do {\n    v3 = glMatrix.RANDOM() * 2 - 1;\n    v4 = glMatrix.RANDOM() * 2 - 1;\n    s2 = v3 * v3 + v4 * v4;\n  } while (s2 >= 1);\n\n  var d = Math.sqrt((1 - s1) / s2);\n  out[0] = scale * v1;\n  out[1] = scale * v2;\n  out[2] = scale * v3 * d;\n  out[3] = scale * v4 * d;\n  return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec4} out\n */\n\n\nfunction transformMat4(out, a, m) {\n  var x = a[0],\n      y = a[1],\n      z = a[2],\n      w = a[3];\n  out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n  out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n  out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n  out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n  return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec4} out\n */\n\n\nfunction transformQuat(out, a, q) {\n  var x = a[0],\n      y = a[1],\n      z = a[2];\n  var qx = q[0],\n      qy = q[1],\n      qz = q[2],\n      qw = q[3]; // calculate quat * vec\n\n  var ix = qw * x + qy * z - qz * y;\n  var iy = qw * y + qz * x - qx * z;\n  var iz = qw * z + qx * y - qy * x;\n  var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n  out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n  out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n  out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n  out[3] = a[3];\n  return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\n\nfunction zero(out) {\n  out[0] = 0.0;\n  out[1] = 0.0;\n  out[2] = 0.0;\n  out[3] = 0.0;\n  return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {vec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\n\nfunction str(a) {\n  return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction exactEquals(a, b) {\n  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\n\nfunction equals(a, b) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var b0 = b[0],\n      b1 = b[1],\n      b2 = b[2],\n      b3 = b[3];\n  return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\n\nvar sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nexports.sub = sub;\nvar mul = multiply;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nexports.mul = mul;\nvar div = divide;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nexports.div = div;\nvar dist = distance;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nexports.dist = dist;\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nexports.sqrDist = sqrDist;\nvar len = length;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nexports.len = len;\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nexports.sqrLen = sqrLen;\n\nvar forEach = function () {\n  var vec = create();\n  return function (a, stride, offset, count, fn, arg) {\n    var i, l;\n\n    if (!stride) {\n      stride = 4;\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    if (count) {\n      l = Math.min(count * stride + offset, a.length);\n    } else {\n      l = a.length;\n    }\n\n    for (i = offset; i < l; i += stride) {\n      vec[0] = a[i];\n      vec[1] = a[i + 1];\n      vec[2] = a[i + 2];\n      vec[3] = a[i + 3];\n      fn(vec, vec, arg);\n      a[i] = vec[0];\n      a[i + 1] = vec[1];\n      a[i + 2] = vec[2];\n      a[i + 3] = vec[3];\n    }\n\n    return a;\n  };\n}();\n\nexports.forEach = forEach;\n},{\"./common.js\":\"PxDr\"}],\"Lu1q\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.validateMatrix4 = validateMatrix4;\nexports.default = void 0;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _mathArray = _interopRequireDefault(require(\"./lib/math-array\"));\n\nvar _common = require(\"./lib/common\");\n\nvar _validators = require(\"./lib/validators\");\n\nvar _vector = _interopRequireDefault(require(\"./vector2\"));\n\nvar _vector2 = _interopRequireDefault(require(\"./vector3\"));\n\nvar _vector3 = _interopRequireDefault(require(\"./vector4\"));\n\nvar mat4 = _interopRequireWildcard(require(\"gl-matrix/mat4\"));\n\nvar vec2 = _interopRequireWildcard(require(\"gl-matrix/vec2\"));\n\nvar vec3 = _interopRequireWildcard(require(\"gl-matrix/vec3\"));\n\nvar vec4 = _interopRequireWildcard(require(\"gl-matrix/vec4\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IDENTITY = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n\nfunction validateMatrix4(m) {\n  return m.length === 16 && Number.isFinite(m[0]) && Number.isFinite(m[1]) && Number.isFinite(m[2]) && Number.isFinite(m[3]) && Number.isFinite(m[4]) && Number.isFinite(m[5]) && Number.isFinite(m[6]) && Number.isFinite(m[7]) && Number.isFinite(m[8]) && Number.isFinite(m[9]) && Number.isFinite(m[10]) && Number.isFinite(m[11]) && Number.isFinite(m[12]) && Number.isFinite(m[13]) && Number.isFinite(m[14]) && Number.isFinite(m[15]);\n}\n\nvar Matrix4 = function (_MathArray) {\n  (0, _inherits2.default)(Matrix4, _MathArray);\n\n  function Matrix4() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    (0, _classCallCheck2.default)(this, Matrix4);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Matrix4).call(this, 16));\n\n    if (Array.isArray(args[0]) && arguments.length === 1) {\n      _this.copy(args[0]);\n    } else {\n      _this.identity();\n    }\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Matrix4, [{\n    key: \"setRowMajor\",\n    value: function setRowMajor() {\n      var m00 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n      var m01 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var m02 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n      var m03 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n      var m10 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n      var m11 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1;\n      var m12 = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;\n      var m13 = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 0;\n      var m20 = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 0;\n      var m21 = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 0;\n      var m22 = arguments.length > 10 && arguments[10] !== undefined ? arguments[10] : 1;\n      var m23 = arguments.length > 11 && arguments[11] !== undefined ? arguments[11] : 0;\n      var m30 = arguments.length > 12 && arguments[12] !== undefined ? arguments[12] : 0;\n      var m31 = arguments.length > 13 && arguments[13] !== undefined ? arguments[13] : 0;\n      var m32 = arguments.length > 14 && arguments[14] !== undefined ? arguments[14] : 0;\n      var m33 = arguments.length > 15 && arguments[15] !== undefined ? arguments[15] : 1;\n      this[0] = m00;\n      this[1] = m10;\n      this[2] = m20;\n      this[3] = m30;\n      this[4] = m01;\n      this[5] = m11;\n      this[6] = m21;\n      this[7] = m31;\n      this[8] = m02;\n      this[9] = m12;\n      this[10] = m22;\n      this[11] = m32;\n      this[12] = m03;\n      this[13] = m13;\n      this[14] = m23;\n      this[15] = m33;\n      return this.check();\n    }\n  }, {\n    key: \"setColumnMajor\",\n    value: function setColumnMajor() {\n      var m00 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n      var m10 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var m20 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n      var m30 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n      var m01 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n      var m11 = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 1;\n      var m21 = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;\n      var m31 = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 0;\n      var m02 = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : 0;\n      var m12 = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : 0;\n      var m22 = arguments.length > 10 && arguments[10] !== undefined ? arguments[10] : 1;\n      var m32 = arguments.length > 11 && arguments[11] !== undefined ? arguments[11] : 0;\n      var m03 = arguments.length > 12 && arguments[12] !== undefined ? arguments[12] : 0;\n      var m13 = arguments.length > 13 && arguments[13] !== undefined ? arguments[13] : 0;\n      var m23 = arguments.length > 14 && arguments[14] !== undefined ? arguments[14] : 0;\n      var m33 = arguments.length > 15 && arguments[15] !== undefined ? arguments[15] : 1;\n      this[0] = m00;\n      this[1] = m10;\n      this[2] = m20;\n      this[3] = m30;\n      this[4] = m01;\n      this[5] = m11;\n      this[6] = m21;\n      this[7] = m31;\n      this[8] = m02;\n      this[9] = m12;\n      this[10] = m22;\n      this[11] = m32;\n      this[12] = m03;\n      this[13] = m13;\n      this[14] = m23;\n      this[15] = m33;\n      return this.check();\n    }\n  }, {\n    key: \"set\",\n    value: function set() {\n      return this.setColumnMajor.apply(this, arguments);\n    }\n  }, {\n    key: \"getElement\",\n    value: function getElement(i, j) {\n      var columnMajor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n      return columnMajor ? this[i][j] : this[j][i];\n    }\n  }, {\n    key: \"setElement\",\n    value: function setElement(i, j, value) {\n      var columnMajor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n      if (columnMajor) {\n        this[i][j] = (0, _common.checkNumber)(value);\n      } else {\n        this[j][i] = (0, _common.checkNumber)(value);\n      }\n\n      return this;\n    }\n  }, {\n    key: \"determinant\",\n    value: function determinant() {\n      return mat4.determinant(this);\n    }\n  }, {\n    key: \"identity\",\n    value: function identity() {\n      return this.copy(IDENTITY);\n    }\n  }, {\n    key: \"fromQuaternion\",\n    value: function fromQuaternion(q) {\n      mat4.fromQuat(this, q);\n      return this.check();\n    }\n  }, {\n    key: \"frustum\",\n    value: function frustum(_ref) {\n      var left = _ref.left,\n          right = _ref.right,\n          bottom = _ref.bottom,\n          top = _ref.top,\n          near = _ref.near,\n          far = _ref.far;\n      mat4.frustum(this, left, right, bottom, top, near, far);\n      return this.check();\n    }\n  }, {\n    key: \"lookAt\",\n    value: function lookAt(_ref2) {\n      var eye = _ref2.eye,\n          _ref2$center = _ref2.center,\n          center = _ref2$center === void 0 ? [0, 0, 0] : _ref2$center,\n          _ref2$up = _ref2.up,\n          up = _ref2$up === void 0 ? [0, 1, 0] : _ref2$up;\n      mat4.lookAt(this, eye, center, up);\n      return this.check();\n    }\n  }, {\n    key: \"ortho\",\n    value: function ortho(_ref3) {\n      var left = _ref3.left,\n          right = _ref3.right,\n          bottom = _ref3.bottom,\n          top = _ref3.top,\n          _ref3$near = _ref3.near,\n          near = _ref3$near === void 0 ? 0.1 : _ref3$near,\n          _ref3$far = _ref3.far,\n          far = _ref3$far === void 0 ? 500 : _ref3$far;\n      mat4.ortho(this, left, right, bottom, top, near, far);\n      return this.check();\n    }\n  }, {\n    key: \"orthographic\",\n    value: function orthographic(_ref4) {\n      var _ref4$fovy = _ref4.fovy,\n          fovy = _ref4$fovy === void 0 ? 45 * Math.PI / 180 : _ref4$fovy,\n          _ref4$aspect = _ref4.aspect,\n          aspect = _ref4$aspect === void 0 ? 1 : _ref4$aspect,\n          _ref4$focalDistance = _ref4.focalDistance,\n          focalDistance = _ref4$focalDistance === void 0 ? 1 : _ref4$focalDistance,\n          _ref4$near = _ref4.near,\n          near = _ref4$near === void 0 ? 0.1 : _ref4$near,\n          _ref4$far = _ref4.far,\n          far = _ref4$far === void 0 ? 500 : _ref4$far;\n\n      if (fovy > Math.PI * 2) {\n        throw Error('radians');\n      }\n\n      var halfY = fovy / 2;\n      var top = focalDistance * Math.tan(halfY);\n      var right = top * aspect;\n      return new Matrix4().ortho({\n        left: -right,\n        right: right,\n        bottom: -top,\n        top: top,\n        near: near,\n        far: far\n      });\n    }\n  }, {\n    key: \"perspective\",\n    value: function perspective() {\n      var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          fovy = _ref5.fovy,\n          _ref5$fov = _ref5.fov,\n          fov = _ref5$fov === void 0 ? 45 * Math.PI / 180 : _ref5$fov,\n          _ref5$aspect = _ref5.aspect,\n          aspect = _ref5$aspect === void 0 ? 1 : _ref5$aspect,\n          _ref5$near = _ref5.near,\n          near = _ref5$near === void 0 ? 0.1 : _ref5$near,\n          _ref5$far = _ref5.far,\n          far = _ref5$far === void 0 ? 500 : _ref5$far;\n\n      fovy = fovy || fov;\n\n      if (fovy > Math.PI * 2) {\n        throw Error('radians');\n      }\n\n      mat4.perspective(this, fovy, aspect, near, far);\n      return this.check();\n    }\n  }, {\n    key: \"transpose\",\n    value: function transpose() {\n      mat4.transpose(this, this);\n      return this.check();\n    }\n  }, {\n    key: \"invert\",\n    value: function invert() {\n      mat4.invert(this, this);\n      return this.check();\n    }\n  }, {\n    key: \"multiplyLeft\",\n    value: function multiplyLeft(a) {\n      mat4.multiply(this, a, this);\n      return this.check();\n    }\n  }, {\n    key: \"multiplyRight\",\n    value: function multiplyRight(a) {\n      mat4.multiply(this, this, a);\n      return this.check();\n    }\n  }, {\n    key: \"rotateX\",\n    value: function rotateX(radians) {\n      mat4.rotateX(this, this, radians);\n      return this.check();\n    }\n  }, {\n    key: \"rotateY\",\n    value: function rotateY(radians) {\n      mat4.rotateY(this, this, radians);\n      return this.check();\n    }\n  }, {\n    key: \"rotateZ\",\n    value: function rotateZ(radians) {\n      mat4.rotateZ(this, this, radians);\n      return this.check();\n    }\n  }, {\n    key: \"rotateXYZ\",\n    value: function rotateXYZ(_ref6) {\n      var _ref7 = (0, _slicedToArray2.default)(_ref6, 3),\n          rx = _ref7[0],\n          ry = _ref7[1],\n          rz = _ref7[2];\n\n      return this.rotateX(rx).rotateY(ry).rotateZ(rz);\n    }\n  }, {\n    key: \"rotateAxis\",\n    value: function rotateAxis(radians, axis) {\n      mat4.rotate(this, this, radians, axis);\n      return this.check();\n    }\n  }, {\n    key: \"scale\",\n    value: function scale(factor) {\n      if (Array.isArray(factor)) {\n        mat4.scale(this, this, factor);\n      } else {\n        mat4.scale(this, this, [factor, factor, factor]);\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"translate\",\n    value: function translate(vec) {\n      mat4.translate(this, this, vec);\n      return this.check();\n    }\n  }, {\n    key: \"transformVector2\",\n    value: function transformVector2(vector, out) {\n      out = out || new _vector.default();\n      vec2.transformMat4(out, vector, this);\n      (0, _validators.validateVector)(out, 2);\n      return out;\n    }\n  }, {\n    key: \"transformVector3\",\n    value: function transformVector3(vector, out) {\n      out = out || new _vector2.default();\n      vec3.transformMat4(out, vector, this);\n      (0, _validators.validateVector)(out, 3);\n      return out;\n    }\n  }, {\n    key: \"transformVector4\",\n    value: function transformVector4(vector, out) {\n      out = out || new _vector3.default();\n      vec4.transformMat4(out, vector, this);\n      (0, _validators.validateVector)(out, 4);\n      return out.check();\n    }\n  }, {\n    key: \"transformVector\",\n    value: function transformVector(vector, out) {\n      switch (vector.length) {\n        case 2:\n          return this.transformVector2(vector, out);\n\n        case 3:\n          return this.transformVector3(vector, out);\n\n        case 4:\n          return this.transformVector4(vector, out);\n\n        default:\n          throw new Error('Illegal vector');\n      }\n    }\n  }, {\n    key: \"transformDirection\",\n    value: function transformDirection(vector, out) {\n      return this._transformVector(vector, out, 0);\n    }\n  }, {\n    key: \"transformPoint\",\n    value: function transformPoint(vector, out) {\n      return this._transformVector(vector, out, 1);\n    }\n  }, {\n    key: \"_transformVector\",\n    value: function _transformVector(vector, out, w) {\n      switch (vector.length) {\n        case 2:\n          out = out || new _vector.default();\n          vec4.transformMat4(out, [vector[0], vector[1], 0, w], this);\n          out.length = 2;\n          (0, _validators.validateVector)(out, 2);\n          break;\n\n        case 3:\n          out = out || new _vector2.default();\n          vec4.transformMat4(out, [vector[0], vector[1], vector[2], w], this);\n          out.length = 3;\n          (0, _validators.validateVector)(out, 3);\n          break;\n\n        case 4:\n          if (Boolean(w) !== Boolean(vector[3])) {\n            throw new Error('math.gl: Matrix4.transformPoint - invalid vector');\n          }\n\n          out = out || new _vector3.default();\n          vec4.transformMat4(out, vector, this);\n          (0, _validators.validateVector)(out, 4);\n          break;\n\n        default:\n          throw new Error('Illegal vector');\n      }\n\n      return out;\n    }\n  }, {\n    key: \"makeRotationX\",\n    value: function makeRotationX(radians) {\n      return this.identity().rotateX(radians);\n    }\n  }, {\n    key: \"makeTranslation\",\n    value: function makeTranslation(x, y, z) {\n      return this.identity().translate([x, y, z]);\n    }\n  }, {\n    key: \"ELEMENTS\",\n    get: function get() {\n      return 16;\n    }\n  }]);\n  return Matrix4;\n}(_mathArray.default);\n\nexports.default = Matrix4;\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./lib/math-array\":\"qq7E\",\"./lib/common\":\"U3d7\",\"./lib/validators\":\"PGPh\",\"./vector2\":\"lyC9\",\"./vector3\":\"zmVD\",\"./vector4\":\"kOPg\",\"gl-matrix/mat4\":\"WdlT\",\"gl-matrix/vec2\":\"cHtt\",\"gl-matrix/vec3\":\"Ijz7\",\"gl-matrix/vec4\":\"QGfo\"}],\"PXH2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.identity = identity;\nexports.setAxisAngle = setAxisAngle;\nexports.getAxisAngle = getAxisAngle;\nexports.getAngle = getAngle;\nexports.multiply = multiply;\nexports.rotateX = rotateX;\nexports.rotateY = rotateY;\nexports.rotateZ = rotateZ;\nexports.calculateW = calculateW;\nexports.exp = exp;\nexports.ln = ln;\nexports.pow = pow;\nexports.slerp = slerp;\nexports.random = random;\nexports.invert = invert;\nexports.conjugate = conjugate;\nexports.fromMat3 = fromMat3;\nexports.fromEuler = fromEuler;\nexports.str = str;\nexports.setAxes = exports.sqlerp = exports.rotationTo = exports.equals = exports.exactEquals = exports.normalize = exports.sqrLen = exports.squaredLength = exports.len = exports.length = exports.lerp = exports.dot = exports.scale = exports.mul = exports.add = exports.set = exports.copy = exports.fromValues = exports.clone = void 0;\n\nvar glMatrix = _interopRequireWildcard(require(\"./common.js\"));\n\nvar mat3 = _interopRequireWildcard(require(\"./mat3.js\"));\n\nvar vec3 = _interopRequireWildcard(require(\"./vec3.js\"));\n\nvar vec4 = _interopRequireWildcard(require(\"./vec4.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nfunction create() {\n  var out = new glMatrix.ARRAY_TYPE(4);\n\n  if (glMatrix.ARRAY_TYPE != Float32Array) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n  }\n\n  out[3] = 1;\n  return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\n\nfunction identity(out) {\n  out[0] = 0;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 1;\n  return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\n\nfunction setAxisAngle(out, axis, rad) {\n  rad = rad * 0.5;\n  var s = Math.sin(rad);\n  out[0] = s * axis[0];\n  out[1] = s * axis[1];\n  out[2] = s * axis[2];\n  out[3] = Math.cos(rad);\n  return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @param  {quat} q     Quaternion to be decomposed\n * @return {Number}     Angle, in radians, of the rotation\n */\n\n\nfunction getAxisAngle(out_axis, q) {\n  var rad = Math.acos(q[3]) * 2.0;\n  var s = Math.sin(rad / 2.0);\n\n  if (s > glMatrix.EPSILON) {\n    out_axis[0] = q[0] / s;\n    out_axis[1] = q[1] / s;\n    out_axis[2] = q[2] / s;\n  } else {\n    // If s is zero, return any axis (no rotation - axis does not matter)\n    out_axis[0] = 1;\n    out_axis[1] = 0;\n    out_axis[2] = 0;\n  }\n\n  return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param  {quat} a     Origin unit quaternion \n * @param  {quat} b     Destination unit quaternion\n * @return {Number}     Angle, in radians, between the two quaternions\n */\n\n\nfunction getAngle(a, b) {\n  var dotproduct = dot(a, b);\n  return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n */\n\n\nfunction multiply(out, a, b) {\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var bx = b[0],\n      by = b[1],\n      bz = b[2],\n      bw = b[3];\n  out[0] = ax * bw + aw * bx + ay * bz - az * by;\n  out[1] = ay * bw + aw * by + az * bx - ax * bz;\n  out[2] = az * bw + aw * bz + ax * by - ay * bx;\n  out[3] = aw * bw - ax * bx - ay * by - az * bz;\n  return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\n\nfunction rotateX(out, a, rad) {\n  rad *= 0.5;\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var bx = Math.sin(rad),\n      bw = Math.cos(rad);\n  out[0] = ax * bw + aw * bx;\n  out[1] = ay * bw + az * bx;\n  out[2] = az * bw - ay * bx;\n  out[3] = aw * bw - ax * bx;\n  return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\n\nfunction rotateY(out, a, rad) {\n  rad *= 0.5;\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var by = Math.sin(rad),\n      bw = Math.cos(rad);\n  out[0] = ax * bw - az * by;\n  out[1] = ay * bw + aw * by;\n  out[2] = az * bw + ax * by;\n  out[3] = aw * bw - ay * by;\n  return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\n\nfunction rotateZ(out, a, rad) {\n  rad *= 0.5;\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var bz = Math.sin(rad),\n      bw = Math.cos(rad);\n  out[0] = ax * bw + ay * bz;\n  out[1] = ay * bw - ax * bz;\n  out[2] = az * bw + aw * bz;\n  out[3] = aw * bw - az * bz;\n  return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate W component of\n * @returns {quat} out\n */\n\n\nfunction calculateW(out, a) {\n  var x = a[0],\n      y = a[1],\n      z = a[2];\n  out[0] = x;\n  out[1] = y;\n  out[2] = z;\n  out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n  return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\n\nfunction exp(out, a) {\n  var x = a[0],\n      y = a[1],\n      z = a[2],\n      w = a[3];\n  var r = Math.sqrt(x * x + y * y + z * z);\n  var et = Math.exp(w);\n  var s = r > 0 ? et * Math.sin(r) / r : 0;\n  out[0] = x * s;\n  out[1] = y * s;\n  out[2] = z * s;\n  out[3] = et * Math.cos(r);\n  return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\n\nfunction ln(out, a) {\n  var x = a[0],\n      y = a[1],\n      z = a[2],\n      w = a[3];\n  var r = Math.sqrt(x * x + y * y + z * z);\n  var t = r > 0 ? Math.atan2(r, w) / r : 0;\n  out[0] = x * t;\n  out[1] = y * t;\n  out[2] = z * t;\n  out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n  return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\n\nfunction pow(out, a, b) {\n  ln(out, a);\n  scale(out, out, b);\n  exp(out, out);\n  return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\n\nfunction slerp(out, a, b, t) {\n  // benchmarks:\n  //    http://jsperf.com/quaternion-slerp-implementations\n  var ax = a[0],\n      ay = a[1],\n      az = a[2],\n      aw = a[3];\n  var bx = b[0],\n      by = b[1],\n      bz = b[2],\n      bw = b[3];\n  var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n  cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n  if (cosom < 0.0) {\n    cosom = -cosom;\n    bx = -bx;\n    by = -by;\n    bz = -bz;\n    bw = -bw;\n  } // calculate coefficients\n\n\n  if (1.0 - cosom > glMatrix.EPSILON) {\n    // standard case (slerp)\n    omega = Math.acos(cosom);\n    sinom = Math.sin(omega);\n    scale0 = Math.sin((1.0 - t) * omega) / sinom;\n    scale1 = Math.sin(t * omega) / sinom;\n  } else {\n    // \"from\" and \"to\" quaternions are very close\n    //  ... so we can do a linear interpolation\n    scale0 = 1.0 - t;\n    scale1 = t;\n  } // calculate final values\n\n\n  out[0] = scale0 * ax + scale1 * bx;\n  out[1] = scale0 * ay + scale1 * by;\n  out[2] = scale0 * az + scale1 * bz;\n  out[3] = scale0 * aw + scale1 * bw;\n  return out;\n}\n/**\n * Generates a random unit quaternion\n * \n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\n\nfunction random(out) {\n  // Implementation of http://planning.cs.uiuc.edu/node198.html\n  // TODO: Calling random 3 times is probably not the fastest solution\n  var u1 = glMatrix.RANDOM();\n  var u2 = glMatrix.RANDOM();\n  var u3 = glMatrix.RANDOM();\n  var sqrt1MinusU1 = Math.sqrt(1 - u1);\n  var sqrtU1 = Math.sqrt(u1);\n  out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n  out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n  out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n  out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n  return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\n\nfunction invert(out, a) {\n  var a0 = a[0],\n      a1 = a[1],\n      a2 = a[2],\n      a3 = a[3];\n  var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n  var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n  out[0] = -a0 * invDot;\n  out[1] = -a1 * invDot;\n  out[2] = -a2 * invDot;\n  out[3] = a3 * invDot;\n  return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\n\nfunction conjugate(out, a) {\n  out[0] = -a[0];\n  out[1] = -a[1];\n  out[2] = -a[2];\n  out[3] = a[3];\n  return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {mat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\n\nfunction fromMat3(out, m) {\n  // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n  // article \"Quaternion Calculus and Fast Animation\".\n  var fTrace = m[0] + m[4] + m[8];\n  var fRoot;\n\n  if (fTrace > 0.0) {\n    // |w| > 1/2, may as well choose w > 1/2\n    fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n    out[3] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot; // 1/(4w)\n\n    out[0] = (m[5] - m[7]) * fRoot;\n    out[1] = (m[6] - m[2]) * fRoot;\n    out[2] = (m[1] - m[3]) * fRoot;\n  } else {\n    // |w| <= 1/2\n    var i = 0;\n    if (m[4] > m[0]) i = 1;\n    if (m[8] > m[i * 3 + i]) i = 2;\n    var j = (i + 1) % 3;\n    var k = (i + 2) % 3;\n    fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n    out[i] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot;\n    out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n    out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n    out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n  }\n\n  return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\n\nfunction fromEuler(out, x, y, z) {\n  var halfToRad = 0.5 * Math.PI / 180.0;\n  x *= halfToRad;\n  y *= halfToRad;\n  z *= halfToRad;\n  var sx = Math.sin(x);\n  var cx = Math.cos(x);\n  var sy = Math.sin(y);\n  var cy = Math.cos(y);\n  var sz = Math.sin(z);\n  var cz = Math.cos(z);\n  out[0] = sx * cy * cz - cx * sy * sz;\n  out[1] = cx * sy * cz + sx * cy * sz;\n  out[2] = cx * cy * sz - sx * sy * cz;\n  out[3] = cx * cy * cz + sx * sy * sz;\n  return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {quat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\n\nfunction str(a) {\n  return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {quat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\n\nvar clone = vec4.clone;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nexports.clone = clone;\nvar fromValues = vec4.fromValues;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nexports.fromValues = fromValues;\nvar copy = vec4.copy;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nexports.copy = copy;\nvar set = vec4.set;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nexports.set = set;\nvar add = vec4.add;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nexports.add = add;\nvar mul = multiply;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {quat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nexports.mul = mul;\nvar scale = vec4.scale;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nexports.scale = scale;\nvar dot = vec4.dot;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nexports.dot = dot;\nvar lerp = vec4.lerp;\n/**\n * Calculates the length of a quat\n *\n * @param {quat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nexports.lerp = lerp;\nvar length = vec4.length;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nexports.length = length;\nvar len = length;\n/**\n * Calculates the squared length of a quat\n *\n * @param {quat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nexports.len = len;\nvar squaredLength = vec4.squaredLength;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nexports.squaredLength = squaredLength;\nvar sqrLen = squaredLength;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nexports.sqrLen = sqrLen;\nvar normalize = vec4.normalize;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {quat} a The first quaternion.\n * @param {quat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexports.normalize = normalize;\nvar exactEquals = vec4.exactEquals;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {quat} a The first vector.\n * @param {quat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nexports.exactEquals = exactEquals;\nvar equals = vec4.equals;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {vec3} a the initial vector\n * @param {vec3} b the destination vector\n * @returns {quat} out\n */\n\nexports.equals = equals;\n\nvar rotationTo = function () {\n  var tmpvec3 = vec3.create();\n  var xUnitVec3 = vec3.fromValues(1, 0, 0);\n  var yUnitVec3 = vec3.fromValues(0, 1, 0);\n  return function (out, a, b) {\n    var dot = vec3.dot(a, b);\n\n    if (dot < -0.999999) {\n      vec3.cross(tmpvec3, xUnitVec3, a);\n      if (vec3.len(tmpvec3) < 0.000001) vec3.cross(tmpvec3, yUnitVec3, a);\n      vec3.normalize(tmpvec3, tmpvec3);\n      setAxisAngle(out, tmpvec3, Math.PI);\n      return out;\n    } else if (dot > 0.999999) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 1;\n      return out;\n    } else {\n      vec3.cross(tmpvec3, a, b);\n      out[0] = tmpvec3[0];\n      out[1] = tmpvec3[1];\n      out[2] = tmpvec3[2];\n      out[3] = 1 + dot;\n      return normalize(out, out);\n    }\n  };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {quat} c the third operand\n * @param {quat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\n\nexports.rotationTo = rotationTo;\n\nvar sqlerp = function () {\n  var temp1 = create();\n  var temp2 = create();\n  return function (out, a, b, c, d, t) {\n    slerp(temp1, a, d, t);\n    slerp(temp2, b, c, t);\n    slerp(out, temp1, temp2, 2 * t * (1 - t));\n    return out;\n  };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {vec3} view  the vector representing the viewing direction\n * @param {vec3} right the vector representing the local \"right\" direction\n * @param {vec3} up    the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\n\nexports.sqlerp = sqlerp;\n\nvar setAxes = function () {\n  var matr = mat3.create();\n  return function (out, view, right, up) {\n    matr[0] = right[0];\n    matr[3] = right[1];\n    matr[6] = right[2];\n    matr[1] = up[0];\n    matr[4] = up[1];\n    matr[7] = up[2];\n    matr[2] = -view[0];\n    matr[5] = -view[1];\n    matr[8] = -view[2];\n    return normalize(out, fromMat3(out, matr));\n  };\n}();\n\nexports.setAxes = setAxes;\n},{\"./common.js\":\"PxDr\",\"./mat3.js\":\"SRDq\",\"./vec3.js\":\"Ijz7\",\"./vec4.js\":\"QGfo\"}],\"Gbka\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.validateQuaternion = validateQuaternion;\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _mathArray = _interopRequireDefault(require(\"./lib/math-array\"));\n\nvar _common = require(\"./lib/common\");\n\nvar quat = _interopRequireWildcard(require(\"gl-matrix/quat\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IDENTITY_QUATERNION = [0, 0, 0, 1];\n\nfunction validateQuaternion(q) {\n  return q.length === 4 && Number.isFinite(q[0]) && Number.isFinite(q[1]) && Number.isFinite(q[2]) && Number.isFinite(q[3]);\n}\n\nvar Quaternion = function (_MathArray) {\n  (0, _inherits2.default)(Quaternion, _MathArray);\n\n  function Quaternion() {\n    var _this;\n\n    var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n    var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n    var w = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;\n    (0, _classCallCheck2.default)(this, Quaternion);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Quaternion).call(this, 4));\n\n    if (Array.isArray(x) && arguments.length === 1) {\n      _this.copy(x);\n    } else {\n      _this.set(x, y, z, w);\n    }\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Quaternion, [{\n    key: \"fromMatrix3\",\n    value: function fromMatrix3(m) {\n      quat.fromMat3(this, m);\n      return this.check();\n    }\n  }, {\n    key: \"fromValues\",\n    value: function fromValues(x, y, z, w) {\n      return this.set(x, y, z, w);\n    }\n  }, {\n    key: \"identity\",\n    value: function identity() {\n      quat.identity(this);\n      return this.check();\n    }\n  }, {\n    key: \"length\",\n    value: function length() {\n      return quat.length(this);\n    }\n  }, {\n    key: \"squaredLength\",\n    value: function squaredLength(a) {\n      return quat.squaredLength(this);\n    }\n  }, {\n    key: \"dot\",\n    value: function dot(a, b) {\n      if (b !== undefined) {\n        throw new Error('Quaternion.dot only takes one argument');\n      }\n\n      return quat.dot(this, a);\n    }\n  }, {\n    key: \"rotationTo\",\n    value: function rotationTo(vectorA, vectorB) {\n      quat.rotationTo(this, vectorA, vectorB);\n      return this.check();\n    }\n  }, {\n    key: \"add\",\n    value: function add(a, b) {\n      if (b !== undefined) {\n        throw new Error('Quaternion.add only takes one argument');\n      }\n\n      quat.add(this, a);\n      return this.check();\n    }\n  }, {\n    key: \"calculateW\",\n    value: function calculateW() {\n      quat.calculateW(this, this);\n      return this.check();\n    }\n  }, {\n    key: \"conjugate\",\n    value: function conjugate() {\n      quat.conjugate(this, this);\n      return this.check();\n    }\n  }, {\n    key: \"invert\",\n    value: function invert() {\n      quat.invert(this, this);\n      return this.check();\n    }\n  }, {\n    key: \"lerp\",\n    value: function lerp(a, b, t) {\n      quat.lerp(this, a, b, t);\n      return this.check();\n    }\n  }, {\n    key: \"multiply\",\n    value: function multiply(a, b) {\n      if (b !== undefined) {\n        throw new Error('Quaternion.multiply only takes one argument');\n      }\n\n      quat.multiply(this, this, a);\n      return this.check();\n    }\n  }, {\n    key: \"normalize\",\n    value: function normalize() {\n      quat.normalize(this, this);\n      return this.check();\n    }\n  }, {\n    key: \"rotateX\",\n    value: function rotateX(rad) {\n      quat.rotateX(this, this, rad);\n      return this.check();\n    }\n  }, {\n    key: \"rotateY\",\n    value: function rotateY(rad) {\n      quat.rotateY(this, this, rad);\n      return this.check();\n    }\n  }, {\n    key: \"rotateZ\",\n    value: function rotateZ(rad) {\n      quat.rotateZ(this, this, rad);\n      return this.check();\n    }\n  }, {\n    key: \"scale\",\n    value: function scale(b) {\n      quat.scale(this, this, b);\n      return this.check();\n    }\n  }, {\n    key: \"set\",\n    value: function set(i, j, k, l) {\n      quat.set(this, i, j, k, l);\n      return this.check();\n    }\n  }, {\n    key: \"setAxisAngle\",\n    value: function setAxisAngle(axis, rad) {\n      quat.setAxisAngle(this, axis, rad);\n      return this.check();\n    }\n  }, {\n    key: \"slerp\",\n    value: function slerp(_ref) {\n      var _ref$start = _ref.start,\n          start = _ref$start === void 0 ? IDENTITY_QUATERNION : _ref$start,\n          target = _ref.target,\n          ratio = _ref.ratio;\n      quat.slerp(this, start, target, ratio);\n      return this.check();\n    }\n  }, {\n    key: \"ELEMENTS\",\n    get: function get() {\n      return 4;\n    }\n  }, {\n    key: \"x\",\n    get: function get() {\n      return this[0];\n    },\n    set: function set(value) {\n      return this[0] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"y\",\n    get: function get() {\n      return this[1];\n    },\n    set: function set(value) {\n      return this[1] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"z\",\n    get: function get() {\n      return this[2];\n    },\n    set: function set(value) {\n      return this[2] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"w\",\n    get: function get() {\n      return this[3];\n    },\n    set: function set(value) {\n      return this[3] = (0, _common.checkNumber)(value);\n    }\n  }]);\n  return Quaternion;\n}(_mathArray.default);\n\nexports.default = Quaternion;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./lib/math-array\":\"qq7E\",\"./lib/common\":\"U3d7\",\"gl-matrix/quat\":\"PXH2\"}],\"xA9F\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _common = require(\"./lib/common\");\n\nvar _vector = _interopRequireDefault(require(\"./vector3\"));\n\nvar vec3 = _interopRequireWildcard(require(\"gl-matrix/vec3\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar EPSILON = 0.000001;\nvar EARTH_RADIUS_METERS = 6.371e6;\n\nvar SphericalCoordinates = function () {\n  function SphericalCoordinates() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        phi = _ref.phi,\n        theta = _ref.theta,\n        radius = _ref.radius,\n        bearing = _ref.bearing,\n        pitch = _ref.pitch,\n        altitude = _ref.altitude,\n        _ref$radiusScale = _ref.radiusScale,\n        radiusScale = _ref$radiusScale === void 0 ? EARTH_RADIUS_METERS : _ref$radiusScale;\n\n    (0, _classCallCheck2.default)(this, SphericalCoordinates);\n\n    if (arguments.length === 0) {\n      this.phi = 0;\n      this.theta = 0;\n      this.radius = 1;\n    } else if (Number.isFinite(phi) || Number.isFinite(theta)) {\n      this.phi = phi || 0;\n      this.theta = theta || 0;\n    } else if (Number.isFinite(bearing) || Number.isFinite(pitch)) {\n      this.bearing = bearing || 0;\n      this.pitch = pitch || 0;\n    }\n\n    this.radius = radius || 1;\n    this.radiusScale = radiusScale || 1;\n    this.check();\n  }\n\n  (0, _createClass2.default)(SphericalCoordinates, [{\n    key: \"toString\",\n    value: function toString() {\n      return this.formatString(_common.config);\n    }\n  }, {\n    key: \"formatString\",\n    value: function formatString(_ref2) {\n      var printTypes = _ref2.printTypes,\n          printDegrees = _ref2.printDegrees;\n      var f = _common.formatValue;\n      return \"\".concat(printTypes ? 'Spherical' : '', \"[rho:\").concat(f(this.radius), \",theta:\").concat(f(this.theta), \",phi:\").concat(f(this.phi), \"]\");\n    }\n  }, {\n    key: \"equals\",\n    value: function equals(other) {\n      return (0, _common.equals)(this.radius, other.radius) && (0, _common.equals)(this.theta, other.theta) && (0, _common.equals)(this.phi, other.phi);\n    }\n  }, {\n    key: \"exactEquals\",\n    value: function exactEquals(other) {\n      return this.radius === other.radius && this.theta === other.theta && this.phi === other.phi;\n    }\n  }, {\n    key: \"set\",\n    value: function set(radius, phi, theta) {\n      this.radius = radius;\n      this.phi = phi;\n      this.theta = theta;\n      return this.check();\n    }\n  }, {\n    key: \"clone\",\n    value: function clone() {\n      return new this.constructor().copy(this);\n    }\n  }, {\n    key: \"copy\",\n    value: function copy(other) {\n      this.radius = other.radius;\n      this.phi = other.phi;\n      this.theta = other.theta;\n      return this.check();\n    }\n  }, {\n    key: \"fromLngLatZ\",\n    value: function fromLngLatZ(_ref3) {\n      var _ref4 = (0, _slicedToArray2.default)(_ref3, 3),\n          lng = _ref4[0],\n          lat = _ref4[1],\n          z = _ref4[2];\n\n      this.radius = 1 + z / this.radiusScale;\n      this.phi = (0, _common.radians)(lat);\n      this.theta = (0, _common.radians)(lng);\n    }\n  }, {\n    key: \"fromVector3\",\n    value: function fromVector3(v) {\n      this.radius = vec3.length(v);\n\n      if (this.radius === 0) {\n        this.theta = 0;\n        this.phi = 0;\n      } else {\n        this.theta = Math.atan2(v[0], v[1]);\n        this.phi = Math.acos((0, _common.clamp)(v[2] / this.radius, -1, 1));\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"toVector3\",\n    value: function toVector3() {\n      return new _vector.default(0, 0, this.radius).rotateX({\n        radians: this.theta\n      }).rotateZ({\n        radians: this.phi\n      });\n    }\n  }, {\n    key: \"makeSafe\",\n    value: function makeSafe() {\n      this.phi = Math.max(EPSILON, Math.min(Math.PI - EPSILON, this.phi));\n    }\n  }, {\n    key: \"check\",\n    value: function check() {\n      if (!Number.isFinite(this.phi) || !Number.isFinite(this.theta) || !(this.radius > 0)) {\n        throw new Error('SphericalCoordinates: some fields set to invalid numbers');\n      }\n\n      return this;\n    }\n  }, {\n    key: \"bearing\",\n    get: function get() {\n      return 180 - (0, _common.degrees)(this.phi);\n    },\n    set: function set(v) {\n      this.phi = Math.PI - (0, _common.radians)(v);\n    }\n  }, {\n    key: \"pitch\",\n    get: function get() {\n      return (0, _common.degrees)(this.theta);\n    },\n    set: function set(v) {\n      this.theta = (0, _common.radians)(v);\n    }\n  }, {\n    key: \"longitude\",\n    get: function get() {\n      return (0, _common.degrees)(this.phi);\n    }\n  }, {\n    key: \"latitude\",\n    get: function get() {\n      return (0, _common.degrees)(this.theta);\n    }\n  }, {\n    key: \"lng\",\n    get: function get() {\n      return (0, _common.degrees)(this.phi);\n    }\n  }, {\n    key: \"lat\",\n    get: function get() {\n      return (0, _common.degrees)(this.theta);\n    }\n  }, {\n    key: \"z\",\n    get: function get() {\n      return (this.radius - 1) * this.radiusScale;\n    }\n  }]);\n  return SphericalCoordinates;\n}();\n\nexports.default = SphericalCoordinates;\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./lib/common\":\"U3d7\",\"./vector3\":\"zmVD\",\"gl-matrix/vec3\":\"Ijz7\"}],\"OeUI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _mathArray = _interopRequireDefault(require(\"./lib/math-array\"));\n\nvar _common = require(\"./lib/common\");\n\nvar _matrix = _interopRequireDefault(require(\"./matrix4\"));\n\nvar _quaternion2 = _interopRequireDefault(require(\"./quaternion\"));\n\nvar _vector = _interopRequireDefault(require(\"./vector3\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ERR_UNKNOWN_ORDER = 'Unknown Euler angle order';\nvar ALMOST_ONE = 0.99999;\n\nfunction validateOrder(value) {\n  return value >= 0 && value < 6;\n}\n\nfunction checkOrder(value) {\n  if (value < 0 && value >= 6) {\n    throw new Error(ERR_UNKNOWN_ORDER);\n  }\n\n  return value;\n}\n\nvar Euler = function (_MathArray) {\n  (0, _inherits2.default)(Euler, _MathArray);\n  (0, _createClass2.default)(Euler, [{\n    key: \"ELEMENTS\",\n    get: function get() {\n      return 4;\n    }\n  }], [{\n    key: \"rotationOrder\",\n    value: function rotationOrder(order) {\n      return Euler.RotationOrders[order];\n    }\n  }, {\n    key: \"ZYX\",\n    get: function get() {\n      return 0;\n    }\n  }, {\n    key: \"YXZ\",\n    get: function get() {\n      return 1;\n    }\n  }, {\n    key: \"XZY\",\n    get: function get() {\n      return 2;\n    }\n  }, {\n    key: \"ZXY\",\n    get: function get() {\n      return 3;\n    }\n  }, {\n    key: \"YZX\",\n    get: function get() {\n      return 4;\n    }\n  }, {\n    key: \"XYZ\",\n    get: function get() {\n      return 5;\n    }\n  }, {\n    key: \"RollPitchYaw\",\n    get: function get() {\n      return 0;\n    }\n  }, {\n    key: \"DefaultOrder\",\n    get: function get() {\n      return Euler.ZYX;\n    }\n  }, {\n    key: \"RotationOrders\",\n    get: function get() {\n      return ['ZYX', 'YXZ', 'XZY', 'ZXY', 'YZX', 'XYZ'];\n    }\n  }]);\n\n  function Euler() {\n    var _this;\n\n    var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n    var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n    var order = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Euler.DefaultOrder;\n    (0, _classCallCheck2.default)(this, Euler);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Euler).call(this, 4));\n\n    if (arguments.length > 0 && Array.isArray(arguments[0])) {\n      var _this2;\n\n      (_this2 = _this).fromVector3.apply(_this2, arguments);\n    } else {\n      _this.set(x, y, z, order);\n    }\n\n    return _this;\n  }\n\n  (0, _createClass2.default)(Euler, [{\n    key: \"fromQuaternion\",\n    value: function fromQuaternion(quaternion) {\n      var _quaternion = (0, _slicedToArray2.default)(quaternion, 4),\n          x = _quaternion[0],\n          y = _quaternion[1],\n          z = _quaternion[2],\n          w = _quaternion[3];\n\n      var ysqr = y * y;\n      var t0 = -2.0 * (ysqr + z * z) + 1.0;\n      var t1 = +2.0 * (x * y + w * z);\n      var t2 = -2.0 * (x * z - w * y);\n      var t3 = +2.0 * (y * z + w * x);\n      var t4 = -2.0 * (x * x + ysqr) + 1.0;\n      t2 = t2 > 1.0 ? 1.0 : t2;\n      t2 = t2 < -1.0 ? -1.0 : t2;\n      var roll = Math.atan2(t3, t4);\n      var pitch = Math.asin(t2);\n      var yaw = Math.atan2(t1, t0);\n      return new Euler(roll, pitch, yaw, Euler.RollPitchYaw);\n    }\n  }, {\n    key: \"copy\",\n    value: function copy(array) {\n      for (var i = 0; i < 3; ++i) {\n        this[i] = array[i];\n      }\n\n      this[3] = Number.isFinite(array[3]) || this.order;\n      return this.check();\n    }\n  }, {\n    key: \"set\",\n    value: function set() {\n      var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n      var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n      var order = arguments.length > 3 ? arguments[3] : undefined;\n      this[0] = x;\n      this[1] = y;\n      this[2] = z;\n      this[3] = Number.isFinite(order) ? order : this[3];\n      return this.check();\n    }\n  }, {\n    key: \"validate\",\n    value: function validate() {\n      return validateOrder(this[3]) && Number.isFinite(this[0]) && Number.isFinite(this[1]) && Number.isFinite(this[2]);\n    }\n  }, {\n    key: \"toArray\",\n    value: function toArray() {\n      var array = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      array[offset] = this[0];\n      array[offset + 1] = this[1];\n      array[offset + 2] = this[2];\n      return array;\n    }\n  }, {\n    key: \"toArray4\",\n    value: function toArray4() {\n      var array = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      array[offset] = this[0];\n      array[offset + 1] = this[1];\n      array[offset + 2] = this[2];\n      array[offset + 3] = this[3];\n      return array;\n    }\n  }, {\n    key: \"toVector3\",\n    value: function toVector3(optionalResult) {\n      if (optionalResult) {\n        return optionalResult.set(this[0], this[1], this[2]);\n      }\n\n      return new _vector.default(this[0], this[1], this[2]);\n    }\n  }, {\n    key: \"fromVector3\",\n    value: function fromVector3(v, order) {\n      return this.set(v[0], v[1], v[2], Number.isFinite(order) ? order : this[3]);\n    }\n  }, {\n    key: \"fromArray\",\n    value: function fromArray(array) {\n      var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n      this[0] = array[0 + offset];\n      this[1] = array[1 + offset];\n      this[2] = array[2 + offset];\n\n      if (array[3] !== undefined) {\n        this[3] = array[3];\n      }\n\n      return this.check();\n    }\n  }, {\n    key: \"fromRollPitchYaw\",\n    value: function fromRollPitchYaw(roll, pitch, yaw) {\n      return this.set(roll, pitch, yaw, Euler.ZYX);\n    }\n  }, {\n    key: \"fromRotationMatrix\",\n    value: function fromRotationMatrix(m) {\n      var order = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Euler.DefaultOrder;\n\n      this._fromRotationMatrix(m, order);\n\n      return this.check();\n    }\n  }, {\n    key: \"getRotationMatrix\",\n    value: function getRotationMatrix() {\n      var m = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new _matrix.default();\n\n      this._getRotationMatrix(m);\n\n      return m;\n    }\n  }, {\n    key: \"getQuaternion\",\n    value: function getQuaternion() {\n      var q = new _quaternion2.default();\n\n      switch (this[4]) {\n        case Euler.XYZ:\n          return q.rotateX(this[0]).rotateY(this[1]).rotateZ(this[2]);\n\n        case Euler.YXZ:\n          return q.rotateY(this[0]).rotateX(this[1]).rotateZ(this[2]);\n\n        case Euler.ZXY:\n          return q.rotateZ(this[0]).rotateX(this[1]).rotateY(this[2]);\n\n        case Euler.ZYX:\n          return q.rotateZ(this[0]).rotateY(this[1]).rotateX(this[2]);\n\n        case Euler.YZX:\n          return q.rotateY(this[0]).rotateZ(this[1]).rotateX(this[2]);\n\n        case Euler.XZY:\n          return q.rotateX(this[0]).rotateZ(this[1]).rotateY(this[2]);\n\n        default:\n          throw new Error(ERR_UNKNOWN_ORDER);\n      }\n    }\n  }, {\n    key: \"_fromRotationMatrix\",\n    value: function _fromRotationMatrix(m) {\n      var order = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Euler.DefaultOrder;\n      var te = m.elements;\n      var m11 = te[0],\n          m12 = te[4],\n          m13 = te[8];\n      var m21 = te[1],\n          m22 = te[5],\n          m23 = te[9];\n      var m31 = te[2],\n          m32 = te[6],\n          m33 = te[10];\n      order = order || this[3];\n\n      switch (order) {\n        case Euler.XYZ:\n          this[1] = Math.asin((0, _common.clamp)(m13, -1, 1));\n\n          if (Math.abs(m13) < ALMOST_ONE) {\n            this[0] = Math.atan2(-m23, m33);\n            this[2] = Math.atan2(-m12, m11);\n          } else {\n            this[0] = Math.atan2(m32, m22);\n            this[2] = 0;\n          }\n\n          break;\n\n        case Euler.YXZ:\n          this[0] = Math.asin(-(0, _common.clamp)(m23, -1, 1));\n\n          if (Math.abs(m23) < ALMOST_ONE) {\n            this[1] = Math.atan2(m13, m33);\n            this[2] = Math.atan2(m21, m22);\n          } else {\n            this[1] = Math.atan2(-m31, m11);\n            this[2] = 0;\n          }\n\n          break;\n\n        case Euler.ZXY:\n          this[0] = Math.asin((0, _common.clamp)(m32, -1, 1));\n\n          if (Math.abs(m32) < ALMOST_ONE) {\n            this[1] = Math.atan2(-m31, m33);\n            this[2] = Math.atan2(-m12, m22);\n          } else {\n            this[1] = 0;\n            this[2] = Math.atan2(m21, m11);\n          }\n\n          break;\n\n        case Euler.ZYX:\n          this[1] = Math.asin(-(0, _common.clamp)(m31, -1, 1));\n\n          if (Math.abs(m31) < ALMOST_ONE) {\n            this[0] = Math.atan2(m32, m33);\n            this[2] = Math.atan2(m21, m11);\n          } else {\n            this[0] = 0;\n            this[2] = Math.atan2(-m12, m22);\n          }\n\n          break;\n\n        case Euler.YZX:\n          this[2] = Math.asin((0, _common.clamp)(m21, -1, 1));\n\n          if (Math.abs(m21) < ALMOST_ONE) {\n            this[0] = Math.atan2(-m23, m22);\n            this[1] = Math.atan2(-m31, m11);\n          } else {\n            this[0] = 0;\n            this[1] = Math.atan2(m13, m33);\n          }\n\n          break;\n\n        case Euler.XZY:\n          this[2] = Math.asin(-(0, _common.clamp)(m12, -1, 1));\n\n          if (Math.abs(m12) < ALMOST_ONE) {\n            this[0] = Math.atan2(m32, m22);\n            this[1] = Math.atan2(m13, m11);\n          } else {\n            this[0] = Math.atan2(-m23, m33);\n            this[1] = 0;\n          }\n\n          break;\n\n        default:\n          throw new Error(ERR_UNKNOWN_ORDER);\n      }\n\n      this[3] = order;\n      return this;\n    }\n  }, {\n    key: \"_getRotationMatrix\",\n    value: function _getRotationMatrix() {\n      var te = new _matrix.default();\n      var x = this.x,\n          y = this.y,\n          z = this.z;\n      var a = Math.cos(x);\n      var c = Math.cos(y);\n      var e = Math.cos(z);\n      var b = Math.sin(x);\n      var d = Math.sin(y);\n      var f = Math.sin(z);\n\n      switch (this[3]) {\n        case Euler.XYZ:\n          {\n            var ae = a * e,\n                af = a * f,\n                be = b * e,\n                bf = b * f;\n            te[0] = c * e;\n            te[4] = -c * f;\n            te[8] = d;\n            te[1] = af + be * d;\n            te[5] = ae - bf * d;\n            te[9] = -b * c;\n            te[2] = bf - ae * d;\n            te[6] = be + af * d;\n            te[10] = a * c;\n            break;\n          }\n\n        case Euler.YXZ:\n          {\n            var ce = c * e,\n                cf = c * f,\n                de = d * e,\n                df = d * f;\n            te[0] = ce + df * b;\n            te[4] = de * b - cf;\n            te[8] = a * d;\n            te[1] = a * f;\n            te[5] = a * e;\n            te[9] = -b;\n            te[2] = cf * b - de;\n            te[6] = df + ce * b;\n            te[10] = a * c;\n            break;\n          }\n\n        case Euler.ZXY:\n          {\n            var _ce = c * e,\n                _cf = c * f,\n                _de = d * e,\n                _df = d * f;\n\n            te[0] = _ce - _df * b;\n            te[4] = -a * f;\n            te[8] = _de + _cf * b;\n            te[1] = _cf + _de * b;\n            te[5] = a * e;\n            te[9] = _df - _ce * b;\n            te[2] = -a * d;\n            te[6] = b;\n            te[10] = a * c;\n            break;\n          }\n\n        case Euler.ZYX:\n          {\n            var _ae = a * e,\n                _af = a * f,\n                _be = b * e,\n                _bf = b * f;\n\n            te[0] = c * e;\n            te[4] = _be * d - _af;\n            te[8] = _ae * d + _bf;\n            te[1] = c * f;\n            te[5] = _bf * d + _ae;\n            te[9] = _af * d - _be;\n            te[2] = -d;\n            te[6] = b * c;\n            te[10] = a * c;\n            break;\n          }\n\n        case Euler.YZX:\n          {\n            var ac = a * c,\n                ad = a * d,\n                bc = b * c,\n                bd = b * d;\n            te[0] = c * e;\n            te[4] = bd - ac * f;\n            te[8] = bc * f + ad;\n            te[1] = f;\n            te[5] = a * e;\n            te[9] = -b * e;\n            te[2] = -d * e;\n            te[6] = ad * f + bc;\n            te[10] = ac - bd * f;\n            break;\n          }\n\n        case Euler.XZY:\n          {\n            var _ac = a * c,\n                _ad = a * d,\n                _bc = b * c,\n                _bd = b * d;\n\n            te[0] = c * e;\n            te[4] = -f;\n            te[8] = d * e;\n            te[1] = _ac * f + _bd;\n            te[5] = a * e;\n            te[9] = _ad * f - _bc;\n            te[2] = _bc * f - _ad;\n            te[6] = b * e;\n            te[10] = _bd * f + _ac;\n            break;\n          }\n\n        default:\n          throw new Error(ERR_UNKNOWN_ORDER);\n      }\n\n      te[3] = 0;\n      te[7] = 0;\n      te[11] = 0;\n      te[12] = 0;\n      te[13] = 0;\n      te[14] = 0;\n      te[15] = 1;\n      return this;\n    }\n  }, {\n    key: \"toQuaternion\",\n    value: function toQuaternion() {\n      var cy = Math.cos(this.yaw * 0.5);\n      var sy = Math.sin(this.yaw * 0.5);\n      var cr = Math.cos(this.roll * 0.5);\n      var sr = Math.sin(this.roll * 0.5);\n      var cp = Math.cos(this.pitch * 0.5);\n      var sp = Math.sin(this.pitch * 0.5);\n      var w = cy * cr * cp + sy * sr * sp;\n      var x = cy * sr * cp - sy * cr * sp;\n      var y = cy * cr * sp + sy * sr * cp;\n      var z = sy * cr * cp - cy * sr * sp;\n      return new _quaternion2.default(x, y, z, w);\n    }\n  }, {\n    key: \"x\",\n    get: function get() {\n      return this[0];\n    },\n    set: function set(value) {\n      return this[0] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"y\",\n    get: function get() {\n      return this[1];\n    },\n    set: function set(value) {\n      return this[1] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"z\",\n    get: function get() {\n      return this[2];\n    },\n    set: function set(value) {\n      return this[2] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"alpha\",\n    get: function get() {\n      return this[0];\n    },\n    set: function set(value) {\n      return this[0] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"beta\",\n    get: function get() {\n      return this[1];\n    },\n    set: function set(value) {\n      return this[1] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"gamma\",\n    get: function get() {\n      return this[2];\n    },\n    set: function set(value) {\n      return this[2] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"phi\",\n    get: function get() {\n      return this[0];\n    },\n    set: function set(value) {\n      return this[0] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"theta\",\n    get: function get() {\n      return this[1];\n    },\n    set: function set(value) {\n      return this[1] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"psi\",\n    get: function get() {\n      return this[2];\n    },\n    set: function set(value) {\n      return this[2] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"roll\",\n    get: function get() {\n      return this[0];\n    },\n    set: function set(value) {\n      return this[0] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"pitch\",\n    get: function get() {\n      return this[1];\n    },\n    set: function set(value) {\n      return this[1] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"yaw\",\n    get: function get() {\n      return this[2];\n    },\n    set: function set(value) {\n      return this[2] = (0, _common.checkNumber)(value);\n    }\n  }, {\n    key: \"order\",\n    get: function get() {\n      return this[3];\n    },\n    set: function set(value) {\n      return this[3] = checkOrder(value);\n    }\n  }]);\n  return Euler;\n}(_mathArray.default);\n\nexports.default = Euler;\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./lib/math-array\":\"qq7E\",\"./lib/common\":\"U3d7\",\"./matrix4\":\"Lu1q\",\"./quaternion\":\"Gbka\",\"./vector3\":\"zmVD\"}],\"KsCJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _matrix = _interopRequireDefault(require(\"./matrix4\"));\n\nvar _vector = _interopRequireDefault(require(\"./vector3\"));\n\nvar _euler = _interopRequireDefault(require(\"./euler\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Pose = function () {\n  function Pose(_ref) {\n    var _ref$x = _ref.x,\n        x = _ref$x === void 0 ? 0 : _ref$x,\n        _ref$y = _ref.y,\n        y = _ref$y === void 0 ? 0 : _ref$y,\n        _ref$z = _ref.z,\n        z = _ref$z === void 0 ? 0 : _ref$z,\n        _ref$roll = _ref.roll,\n        roll = _ref$roll === void 0 ? 0 : _ref$roll,\n        _ref$pitch = _ref.pitch,\n        pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n        _ref$yaw = _ref.yaw,\n        yaw = _ref$yaw === void 0 ? 0 : _ref$yaw,\n        position = _ref.position,\n        orientation = _ref.orientation;\n    (0, _classCallCheck2.default)(this, Pose);\n\n    if (Array.isArray(position) && position.length === 3) {\n      this.position = new _vector.default(position);\n    } else {\n      this.position = new _vector.default(x, y, z);\n    }\n\n    if (Array.isArray(orientation) && orientation.length === 4) {\n      this.orientation = new _euler.default(orientation, orientation[3]);\n    } else {\n      this.orientation = new _euler.default(roll, pitch, yaw, _euler.default.RollPitchYaw);\n    }\n  }\n\n  (0, _createClass2.default)(Pose, [{\n    key: \"getPosition\",\n    value: function getPosition() {\n      return this.position;\n    }\n  }, {\n    key: \"getOrientation\",\n    value: function getOrientation() {\n      return this.orientation;\n    }\n  }, {\n    key: \"equals\",\n    value: function equals(pose) {\n      if (!pose) {\n        return false;\n      }\n\n      return this.position.equals(pose.position) && this.orientation.equals(pose.orientation);\n    }\n  }, {\n    key: \"exactEquals\",\n    value: function exactEquals(pose) {\n      if (!pose) {\n        return false;\n      }\n\n      return this.position.exactEquals(pose.position) && this.orientation.exactEquals(pose.orientation);\n    }\n  }, {\n    key: \"getTransformationMatrix\",\n    value: function getTransformationMatrix() {\n      var sr = Math.sin(this.roll);\n      var sp = Math.sin(this.pitch);\n      var sw = Math.sin(this.yaw);\n      var cr = Math.cos(this.roll);\n      var cp = Math.cos(this.pitch);\n      var cw = Math.cos(this.yaw);\n      var matrix = new _matrix.default().setRowMajor(cw * cp, -sw * cr + cw * sp * sr, sw * sr + cw * sp * cr, this.x, sw * cp, cw * cr + sw * sp * sr, -cw * sr + sw * sp * cr, this.y, -sp, cp * sr, cp * cr, this.z, 0, 0, 0, 1);\n      return matrix;\n    }\n  }, {\n    key: \"getTransformationMatrixFromPose\",\n    value: function getTransformationMatrixFromPose(pose) {\n      return new _matrix.default().multiplyRight(this.getTransformationMatrix()).multiplyRight(pose.getTransformationMatrix().invert());\n    }\n  }, {\n    key: \"getTransformationMatrixToPose\",\n    value: function getTransformationMatrixToPose(pose) {\n      return new _matrix.default().multiplyRight(pose.getTransformationMatrix()).multiplyRight(this.getTransformationMatrix().invert());\n    }\n  }, {\n    key: \"x\",\n    get: function get() {\n      return this.position.x;\n    },\n    set: function set(value) {\n      return this.position.x = value;\n    }\n  }, {\n    key: \"y\",\n    get: function get() {\n      return this.position.y;\n    },\n    set: function set(value) {\n      return this.position.y = value;\n    }\n  }, {\n    key: \"z\",\n    get: function get() {\n      return this.position.z;\n    },\n    set: function set(value) {\n      return this.position.z = value;\n    }\n  }, {\n    key: \"roll\",\n    get: function get() {\n      return this.orientation.roll;\n    },\n    set: function set(value) {\n      return this.orientation.roll = value;\n    }\n  }, {\n    key: \"pitch\",\n    get: function get() {\n      return this.orientation.pitch;\n    },\n    set: function set(value) {\n      return this.orientation.pitch = value;\n    }\n  }, {\n    key: \"yaw\",\n    get: function get() {\n      return this.orientation.yaw;\n    },\n    set: function set(value) {\n      return this.orientation.yaw = value;\n    }\n  }]);\n  return Pose;\n}();\n\nexports.default = Pose;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./matrix4\":\"Lu1q\",\"./vector3\":\"zmVD\",\"./euler\":\"OeUI\"}],\"NkGT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _common = require(\"../lib/common\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Polygon = function () {\n  function Polygon(points) {\n    (0, _classCallCheck2.default)(this, Polygon);\n    this.points = points;\n    this.isClosed = (0, _common.equals)(this.points[this.points.length - 1], this.points[0]);\n    Object.freeze(this);\n  }\n\n  (0, _createClass2.default)(Polygon, [{\n    key: \"getSignedArea\",\n    value: function getSignedArea() {\n      var area = 0;\n      this.forEachSegment(function (p1, p2) {\n        area += (p1[0] + p2[0]) * (p1[1] - p2[1]);\n      });\n      return area / 2;\n    }\n  }, {\n    key: \"getArea\",\n    value: function getArea() {\n      return Math.abs(this.getSignedArea());\n    }\n  }, {\n    key: \"getWindingDirection\",\n    value: function getWindingDirection() {\n      return Math.sign(this.getSignedArea());\n    }\n  }, {\n    key: \"forEachSegment\",\n    value: function forEachSegment(visitor) {\n      var length = this.points.length;\n\n      for (var i = 0; i < length - 1; i++) {\n        visitor(this.points[i], this.points[i + 1], i, i + 1);\n      }\n\n      if (this.isPolygon && !this.isClosed()) {\n        visitor(this.points[length - 1], this.points[0], length - 1, 0);\n      }\n    }\n  }]);\n  return Polygon;\n}();\n\nexports.default = Polygon;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../lib/common\":\"U3d7\"}],\"o5CE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Vector2\", {\n  enumerable: true,\n  get: function () {\n    return _vector.default;\n  }\n});\nObject.defineProperty(exports, \"Vector3\", {\n  enumerable: true,\n  get: function () {\n    return _vector2.default;\n  }\n});\nObject.defineProperty(exports, \"Vector4\", {\n  enumerable: true,\n  get: function () {\n    return _vector3.default;\n  }\n});\nObject.defineProperty(exports, \"Matrix3\", {\n  enumerable: true,\n  get: function () {\n    return _matrix.default;\n  }\n});\nObject.defineProperty(exports, \"Matrix4\", {\n  enumerable: true,\n  get: function () {\n    return _matrix2.default;\n  }\n});\nObject.defineProperty(exports, \"Quaternion\", {\n  enumerable: true,\n  get: function () {\n    return _quaternion.default;\n  }\n});\nObject.defineProperty(exports, \"config\", {\n  enumerable: true,\n  get: function () {\n    return _common.config;\n  }\n});\nObject.defineProperty(exports, \"checkNumber\", {\n  enumerable: true,\n  get: function () {\n    return _common.checkNumber;\n  }\n});\nObject.defineProperty(exports, \"configure\", {\n  enumerable: true,\n  get: function () {\n    return _common.configure;\n  }\n});\nObject.defineProperty(exports, \"formatValue\", {\n  enumerable: true,\n  get: function () {\n    return _common.formatValue;\n  }\n});\nObject.defineProperty(exports, \"isArray\", {\n  enumerable: true,\n  get: function () {\n    return _common.isArray;\n  }\n});\nObject.defineProperty(exports, \"clone\", {\n  enumerable: true,\n  get: function () {\n    return _common.clone;\n  }\n});\nObject.defineProperty(exports, \"radians\", {\n  enumerable: true,\n  get: function () {\n    return _common.radians;\n  }\n});\nObject.defineProperty(exports, \"degrees\", {\n  enumerable: true,\n  get: function () {\n    return _common.degrees;\n  }\n});\nObject.defineProperty(exports, \"sin\", {\n  enumerable: true,\n  get: function () {\n    return _common.sin;\n  }\n});\nObject.defineProperty(exports, \"cos\", {\n  enumerable: true,\n  get: function () {\n    return _common.cos;\n  }\n});\nObject.defineProperty(exports, \"tan\", {\n  enumerable: true,\n  get: function () {\n    return _common.tan;\n  }\n});\nObject.defineProperty(exports, \"asin\", {\n  enumerable: true,\n  get: function () {\n    return _common.asin;\n  }\n});\nObject.defineProperty(exports, \"acos\", {\n  enumerable: true,\n  get: function () {\n    return _common.acos;\n  }\n});\nObject.defineProperty(exports, \"atan\", {\n  enumerable: true,\n  get: function () {\n    return _common.atan;\n  }\n});\nObject.defineProperty(exports, \"clamp\", {\n  enumerable: true,\n  get: function () {\n    return _common.clamp;\n  }\n});\nObject.defineProperty(exports, \"lerp\", {\n  enumerable: true,\n  get: function () {\n    return _common.lerp;\n  }\n});\nObject.defineProperty(exports, \"equals\", {\n  enumerable: true,\n  get: function () {\n    return _common.equals;\n  }\n});\nObject.defineProperty(exports, \"_SphericalCoordinates\", {\n  enumerable: true,\n  get: function () {\n    return _sphericalCoordinates.default;\n  }\n});\nObject.defineProperty(exports, \"_Pose\", {\n  enumerable: true,\n  get: function () {\n    return _pose.default;\n  }\n});\nObject.defineProperty(exports, \"_Euler\", {\n  enumerable: true,\n  get: function () {\n    return _euler.default;\n  }\n});\nObject.defineProperty(exports, \"_Polygon\", {\n  enumerable: true,\n  get: function () {\n    return _polygon.default;\n  }\n});\n\nvar _vector = _interopRequireDefault(require(\"./vector2\"));\n\nvar _vector2 = _interopRequireDefault(require(\"./vector3\"));\n\nvar _vector3 = _interopRequireDefault(require(\"./vector4\"));\n\nvar _matrix = _interopRequireDefault(require(\"./matrix3\"));\n\nvar _matrix2 = _interopRequireDefault(require(\"./matrix4\"));\n\nvar _quaternion = _interopRequireDefault(require(\"./quaternion\"));\n\nvar _common = require(\"./lib/common\");\n\nvar _sphericalCoordinates = _interopRequireDefault(require(\"./spherical-coordinates\"));\n\nvar _pose = _interopRequireDefault(require(\"./pose\"));\n\nvar _euler = _interopRequireDefault(require(\"./euler\"));\n\nvar _polygon = _interopRequireDefault(require(\"./addons/polygon\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./vector2\":\"lyC9\",\"./vector3\":\"zmVD\",\"./vector4\":\"kOPg\",\"./matrix3\":\"JMDE\",\"./matrix4\":\"Lu1q\",\"./quaternion\":\"Gbka\",\"./lib/common\":\"U3d7\",\"./spherical-coordinates\":\"xA9F\",\"./pose\":\"KsCJ\",\"./euler\":\"OeUI\",\"./addons/polygon\":\"NkGT\"}],\"WDVo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _utils = require(\"../utils\");\n\nvar _math = require(\"math.gl\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Object3D =\n/*#__PURE__*/\nfunction () {\n  function Object3D(_ref) {\n    var id = _ref.id,\n        _ref$display = _ref.display,\n        display = _ref$display === void 0 ? true : _ref$display;\n    (0, _classCallCheck2.default)(this, Object3D); // whether to display the object at all\n\n    this.id = id || (0, _utils.uid)(this.constructor.name);\n    this.display = true; // model position, rotation, scale and all in all matrix\n\n    this.position = new _math.Vector3();\n    this.rotation = new _math.Vector3();\n    this.scale = new _math.Vector3(1, 1, 1);\n    this.matrix = new _math.Matrix4();\n    this.userData = {};\n  }\n\n  (0, _createClass2.default)(Object3D, [{\n    key: \"toString\",\n    value: function toString() {\n      return \"{id: \".concat(this.id, \", children: \").concat(this.children, \")}\");\n    }\n  }, {\n    key: \"setPosition\",\n    value: function setPosition(position) {\n      (0, _assert.default)(position.length === 3, 'setPosition requires vector argument');\n      this.position = position;\n      return this;\n    }\n  }, {\n    key: \"setRotation\",\n    value: function setRotation(rotation) {\n      (0, _assert.default)(rotation.length === 3, 'setRotation requires vector argument');\n      this.rotation = rotation;\n      return this;\n    }\n  }, {\n    key: \"setScale\",\n    value: function setScale(scale) {\n      (0, _assert.default)(scale.length === 3, 'setScale requires vector argument');\n      this.scale = scale;\n      return this;\n    }\n  }, {\n    key: \"setMatrixComponents\",\n    value: function setMatrixComponents(_ref2) {\n      var position = _ref2.position,\n          rotation = _ref2.rotation,\n          scale = _ref2.scale,\n          _ref2$update = _ref2.update,\n          update = _ref2$update === void 0 ? true : _ref2$update;\n\n      if (position) {\n        this.setPosition(position);\n      }\n\n      if (rotation) {\n        this.setRotation(rotation);\n      }\n\n      if (scale) {\n        this.setScale(scale);\n      }\n\n      if (update) {\n        this.updateMatrix();\n      }\n\n      return this;\n    }\n  }, {\n    key: \"updateMatrix\",\n    value: function updateMatrix() {\n      var pos = this.position;\n      var rot = this.rotation;\n      var scale = this.scale;\n      this.matrix.identity();\n      this.matrix.translate(pos);\n      this.matrix.rotateXYZ(rot);\n      this.matrix.scale(scale);\n      return this;\n    }\n  }, {\n    key: \"update\",\n    value: function update() {\n      var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          position = _ref3.position,\n          rotation = _ref3.rotation,\n          scale = _ref3.scale;\n\n      if (position) {\n        this.setPosition(position);\n      }\n\n      if (rotation) {\n        this.setRotation(rotation);\n      }\n\n      if (scale) {\n        this.setScale(scale);\n      }\n\n      this.updateMatrix();\n      return this;\n    }\n  }, {\n    key: \"getCoordinateUniforms\",\n    value: function getCoordinateUniforms(viewMatrix, modelMatrix) {\n      // TODO - solve multiple class problem\n      // assert(viewMatrix instanceof Matrix4);\n      (0, _assert.default)(viewMatrix);\n      modelMatrix = modelMatrix || this.matrix;\n      var worldMatrix = new _math.Matrix4(viewMatrix).multiplyRight(modelMatrix);\n      var worldInverse = worldMatrix.invert();\n      var worldInverseTranspose = worldInverse.transpose();\n      return {\n        viewMatrix: viewMatrix,\n        modelMatrix: modelMatrix,\n        objectMatrix: modelMatrix,\n        worldMatrix: worldMatrix,\n        worldInverseMatrix: worldInverse,\n        worldInverseTransposeMatrix: worldInverseTranspose\n      };\n    } // TODO - copied code, not yet vetted\n\n  }, {\n    key: \"transform\",\n    value: function transform() {\n      if (!this.parent) {\n        this.endPosition.set(this.position);\n        this.endRotation.set(this.rotation);\n        this.endScale.set(this.scale);\n      } else {\n        var parent = this.parent;\n        this.endPosition.set(this.position.add(parent.endPosition));\n        this.endRotation.set(this.rotation.add(parent.endRotation));\n        this.endScale.set(this.scale.add(parent.endScale));\n      }\n\n      var ch = this.children;\n\n      for (var i = 0; i < ch.length; ++i) {\n        ch[i].transform();\n      }\n\n      return this;\n    }\n  }]);\n  return Object3D;\n}();\n\nexports.default = Object3D;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../utils\":\"B7AM\",\"math.gl\":\"o5CE\",\"../utils/assert\":\"iVaU\"}],\"Sm8u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _toConsumableArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/toConsumableArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _object3d = _interopRequireDefault(require(\"./object-3d\"));\n\nvar _math = require(\"math.gl\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Group =\n/*#__PURE__*/\nfunction (_Object3D) {\n  (0, _inherits2.default)(Group, _Object3D);\n\n  function Group() {\n    var _this;\n\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, Group);\n    opts = Array.isArray(opts) ? {\n      children: opts\n    } : opts;\n    var _opts = opts,\n        _opts$children = _opts.children,\n        children = _opts$children === void 0 ? [] : _opts$children;\n    children.every(function (child) {\n      return (0, _assert.default)(child instanceof _object3d.default);\n    });\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Group).call(this, opts));\n    _this.children = children;\n    return _this;\n  } // Unpacks arrays and nested arrays of children\n\n\n  (0, _createClass2.default)(Group, [{\n    key: \"add\",\n    value: function add() {\n      for (var _len = arguments.length, children = new Array(_len), _key = 0; _key < _len; _key++) {\n        children[_key] = arguments[_key];\n      }\n\n      for (var _i = 0; _i < children.length; _i++) {\n        var child = children[_i];\n\n        if (Array.isArray(child)) {\n          this.add.apply(this, (0, _toConsumableArray2.default)(child));\n        } else {\n          this.children.push(child);\n        }\n      }\n\n      return this;\n    }\n  }, {\n    key: \"remove\",\n    value: function remove(child) {\n      var children = this.children;\n      var indexOf = children.indexOf(child);\n\n      if (indexOf > -1) {\n        children.splice(indexOf, 1);\n      }\n\n      return this;\n    }\n  }, {\n    key: \"removeAll\",\n    value: function removeAll() {\n      this.children = [];\n      return this;\n    } // If visitor returns a truthy value, traversal will be aborted and that value\n    // will be returned from `traverse`. Otherwise `traverse` will return null.\n\n  }, {\n    key: \"traverse\",\n    value: function traverse(visitor) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref$modelMatrix = _ref.modelMatrix,\n          modelMatrix = _ref$modelMatrix === void 0 ? new _math.Matrix4() : _ref$modelMatrix;\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = this.children[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var child = _step.value;\n          var matrix = child.matrix;\n          modelMatrix = modelMatrix.multiplyRight(matrix);\n          var result = void 0;\n\n          if (child instanceof Group) {\n            result = child.traverse(visitor, {\n              modelMatrix: modelMatrix\n            });\n          } else {\n            // child.setUniforms({modelMatrix});\n            result = visitor(child, {});\n          } // Abort if a result was returned\n\n\n          if (result) {\n            return result;\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return null;\n    } // If visitor returns a truthy value, traversal will be aborted and that value\n    // will be returned from `traverseReverse`. Otherwise `traverseReverse` will return null.\n\n  }, {\n    key: \"traverseReverse\",\n    value: function traverseReverse(visitor) {\n      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref2$modelMatrix = _ref2.modelMatrix,\n          modelMatrix = _ref2$modelMatrix === void 0 ? new _math.Matrix4() : _ref2$modelMatrix;\n\n      for (var i = this.children.length - 1; i >= 0; --i) {\n        var child = this.children[i];\n        var matrix = child.matrix;\n        modelMatrix = modelMatrix.multiplyRight(matrix);\n        var result = void 0;\n\n        if (child instanceof Group) {\n          result = child.traverseReverse(visitor, {\n            modelMatrix: modelMatrix\n          });\n        } else {\n          // child.setUniforms({modelMatrix});\n          result = visitor(child, {});\n        } // Abort if a result was returned\n\n\n        if (result) {\n          return result;\n        }\n      }\n\n      return null;\n    }\n  }]);\n  return Group;\n}(_object3d.default);\n\nexports.default = Group;\n},{\"@babel/runtime/helpers/esm/toConsumableArray\":\"Qv3s\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./object-3d\":\"WDVo\",\"math.gl\":\"o5CE\",\"../utils/assert\":\"iVaU\"}],\"yQJr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Image\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.Image;\n  }\n});\nObject.defineProperty(exports, \"WebGLRenderingContext\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLRenderingContext;\n  }\n});\nObject.defineProperty(exports, \"WebGLProgram\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLProgram;\n  }\n});\nObject.defineProperty(exports, \"WebGLShader\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLShader;\n  }\n});\nObject.defineProperty(exports, \"WebGLBuffer\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLBuffer;\n  }\n});\nObject.defineProperty(exports, \"WebGLFramebuffer\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLFramebuffer;\n  }\n});\nObject.defineProperty(exports, \"WebGLRenderbuffer\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLRenderbuffer;\n  }\n});\nObject.defineProperty(exports, \"WebGLTexture\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLTexture;\n  }\n});\nObject.defineProperty(exports, \"WebGLUniformLocation\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLUniformLocation;\n  }\n});\nObject.defineProperty(exports, \"WebGLActiveInfo\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLActiveInfo;\n  }\n});\nObject.defineProperty(exports, \"WebGLShaderPrecisionFormat\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGLShaderPrecisionFormat;\n  }\n});\nObject.defineProperty(exports, \"WebGL2RenderingContext\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.WebGL2RenderingContext;\n  }\n});\nObject.defineProperty(exports, \"webGLTypesAvailable\", {\n  enumerable: true,\n  get: function () {\n    return _webglUtils.webGLTypesAvailable;\n  }\n});\nObject.defineProperty(exports, \"isWebGL\", {\n  enumerable: true,\n  get: function () {\n    return _context.isWebGL;\n  }\n});\nObject.defineProperty(exports, \"isWebGL2\", {\n  enumerable: true,\n  get: function () {\n    return _context.isWebGL2;\n  }\n});\nObject.defineProperty(exports, \"createGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.createGLContext;\n  }\n});\nObject.defineProperty(exports, \"destroyGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.destroyGLContext;\n  }\n});\nObject.defineProperty(exports, \"withParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.withParameters;\n  }\n});\nObject.defineProperty(exports, \"resetParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.resetParameters;\n  }\n});\nObject.defineProperty(exports, \"getContextInfo\", {\n  enumerable: true,\n  get: function () {\n    return _contextLimits.getContextInfo;\n  }\n});\nObject.defineProperty(exports, \"clear\", {\n  enumerable: true,\n  get: function () {\n    return _clear.clear;\n  }\n});\nObject.defineProperty(exports, \"parseUniformName\", {\n  enumerable: true,\n  get: function () {\n    return _uniforms.parseUniformName;\n  }\n});\nObject.defineProperty(exports, \"getUniformSetter\", {\n  enumerable: true,\n  get: function () {\n    return _uniforms.getUniformSetter;\n  }\n});\nObject.defineProperty(exports, \"Buffer\", {\n  enumerable: true,\n  get: function () {\n    return _buffer.default;\n  }\n});\nObject.defineProperty(exports, \"Shader\", {\n  enumerable: true,\n  get: function () {\n    return _shader.Shader;\n  }\n});\nObject.defineProperty(exports, \"VertexShader\", {\n  enumerable: true,\n  get: function () {\n    return _shader.VertexShader;\n  }\n});\nObject.defineProperty(exports, \"FragmentShader\", {\n  enumerable: true,\n  get: function () {\n    return _shader.FragmentShader;\n  }\n});\nObject.defineProperty(exports, \"Program\", {\n  enumerable: true,\n  get: function () {\n    return _program.default;\n  }\n});\nObject.defineProperty(exports, \"Framebuffer\", {\n  enumerable: true,\n  get: function () {\n    return _framebuffer.default;\n  }\n});\nObject.defineProperty(exports, \"Renderbuffer\", {\n  enumerable: true,\n  get: function () {\n    return _renderbuffer.default;\n  }\n});\nObject.defineProperty(exports, \"Texture2D\", {\n  enumerable: true,\n  get: function () {\n    return _texture2d.default;\n  }\n});\nObject.defineProperty(exports, \"TextureCube\", {\n  enumerable: true,\n  get: function () {\n    return _textureCube.default;\n  }\n});\nObject.defineProperty(exports, \"VertexArray\", {\n  enumerable: true,\n  get: function () {\n    return _vertexArray.default;\n  }\n});\nObject.defineProperty(exports, \"TransformFeedback\", {\n  enumerable: true,\n  get: function () {\n    return _transformFeedback.default;\n  }\n});\nObject.defineProperty(exports, \"Query\", {\n  enumerable: true,\n  get: function () {\n    return _query.default;\n  }\n});\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _context = require(\"../webgl-context/context\");\n\nvar _contextState = require(\"../webgl-context/context-state\");\n\nvar _contextLimits = require(\"../webgl-context/context-limits\");\n\nvar _clear = require(\"./clear\");\n\nvar _uniforms = require(\"./uniforms\");\n\nvar _buffer = _interopRequireDefault(require(\"./buffer\"));\n\nvar _shader = require(\"./shader\");\n\nvar _program = _interopRequireDefault(require(\"./program\"));\n\nvar _framebuffer = _interopRequireDefault(require(\"./framebuffer\"));\n\nvar _renderbuffer = _interopRequireDefault(require(\"./renderbuffer\"));\n\nvar _texture2d = _interopRequireDefault(require(\"./texture-2d\"));\n\nvar _textureCube = _interopRequireDefault(require(\"./texture-cube\"));\n\nvar _vertexArray = _interopRequireDefault(require(\"./vertex-array\"));\n\nvar _transformFeedback = _interopRequireDefault(require(\"./transform-feedback\"));\n\nvar _query = _interopRequireDefault(require(\"./query\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"../webgl-utils\":\"CTd0\",\"../webgl-context/context\":\"LFBw\",\"../webgl-context/context-state\":\"ON2o\",\"../webgl-context/context-limits\":\"aTuQ\",\"./clear\":\"mZdw\",\"./uniforms\":\"InTr\",\"./buffer\":\"IZPG\",\"./shader\":\"Y9vu\",\"./program\":\"xVcT\",\"./framebuffer\":\"V5nt\",\"./renderbuffer\":\"OYcf\",\"./texture-2d\":\"aCs7\",\"./texture-cube\":\"NgPC\",\"./vertex-array\":\"yRin\",\"./transform-feedback\":\"vegQ\",\"./query\":\"pbPK\"}],\"VJC6\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _webgl = require(\"../webgl\");\n\nvar _utils = require(\"../utils\");\n\nvar _contextFeatures = require(\"../webgl-context/context-features\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable complexity */\nvar Attribute =\n/*#__PURE__*/\nfunction () {\n  function Attribute(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Attribute);\n    var _opts$id = opts.id,\n        id = _opts$id === void 0 ? (0, _utils.uid)('attribute') : _opts$id,\n        type = opts.type,\n        _opts$isIndexed = opts.isIndexed,\n        isIndexed = _opts$isIndexed === void 0 ? false : _opts$isIndexed; // Options that cannot be changed later\n\n    this.gl = gl;\n    this.id = id;\n    this.isIndexed = isIndexed;\n    this.target = isIndexed ? 34963 : 34962;\n    this.type = type;\n\n    if (isIndexed && !type) {\n      // If the attribute is indices, auto infer the correct type\n      // WebGL2 and WebGL1 w/ uint32 index extension support accepts Uint32Array, otherwise Uint16Array\n      this.type = gl && (0, _contextFeatures.hasFeature)(gl, _contextFeatures.FEATURES.ELEMENT_INDEX_UINT32) ? 5125 : 5123;\n    } // Initialize the attribute descriptor, with WebGL and metadata fields\n\n\n    this.value = null;\n    this.externalBuffer = null;\n    this.buffer = null;\n    this.userData = {}; // Reserved for application\n\n    this.update(opts); // Sanity - no app fields on our attributes. Use userData instead.\n\n    Object.seal(this); // Check all fields and generate helpful error messages\n\n    this._validateAttributeDefinition();\n  }\n\n  (0, _createClass2.default)(Attribute, [{\n    key: \"delete\",\n    value: function _delete() {\n      if (this.buffer) {\n        this.buffer.delete();\n        this.buffer = null;\n      }\n    }\n  }, {\n    key: \"update\",\n    value: function update(opts) {\n      var value = opts.value,\n          buffer = opts.buffer,\n          _opts$constant = opts.constant,\n          constant = _opts$constant === void 0 ? this.constant || false : _opts$constant;\n      this.constant = constant;\n\n      if (buffer) {\n        this.externalBuffer = buffer;\n        this.constant = false;\n        this.type = buffer.accessor.type;\n\n        if (buffer.accessor.divisor !== undefined) {\n          this.divisor = buffer.accessor.divisor;\n        }\n      } else if (value) {\n        this.externalBuffer = null;\n        this.value = value;\n\n        if (!constant && this.gl) {\n          // Create buffer if needed\n          this.buffer = this.buffer || new _webgl.Buffer(this.gl, Object.assign({}, opts, {\n            id: this.id,\n            target: this.target,\n            type: this.type\n          }));\n          this.buffer.setData({\n            data: value\n          });\n          this.type = this.buffer.accessor.type;\n        }\n      }\n\n      this._setAccessor(opts);\n    }\n  }, {\n    key: \"getBuffer\",\n    value: function getBuffer() {\n      if (this.constant) {\n        return null;\n      }\n\n      return this.externalBuffer || this.buffer;\n    }\n  }, {\n    key: \"getValue\",\n    value: function getValue() {\n      if (this.constant) {\n        return this.value;\n      }\n\n      var buffer = this.externalBuffer || this.buffer;\n\n      if (buffer) {\n        return [buffer, this];\n      }\n\n      return null;\n    } // Sets all accessor props except type\n    // TODO - store on `this.accessor`\n\n  }, {\n    key: \"_setAccessor\",\n    value: function _setAccessor(opts) {\n      var _opts$size = opts.size,\n          size = _opts$size === void 0 ? this.size : _opts$size,\n          _opts$offset = opts.offset,\n          offset = _opts$offset === void 0 ? this.offset || 0 : _opts$offset,\n          _opts$stride = opts.stride,\n          stride = _opts$stride === void 0 ? this.stride || 0 : _opts$stride,\n          _opts$normalized = opts.normalized,\n          normalized = _opts$normalized === void 0 ? this.normalized || false : _opts$normalized,\n          _opts$integer = opts.integer,\n          integer = _opts$integer === void 0 ? this.integer || false : _opts$integer,\n          _opts$divisor = opts.divisor,\n          divisor = _opts$divisor === void 0 ? this.divisor || 0 : _opts$divisor,\n          instanced = opts.instanced,\n          isInstanced = opts.isInstanced;\n      this.size = size;\n      this.offset = offset;\n      this.stride = stride;\n      this.normalized = normalized;\n      this.integer = integer;\n      this.divisor = divisor;\n\n      if (isInstanced !== undefined) {\n        _utils.log.deprecated('Attribute.isInstanced');\n\n        this.divisor = isInstanced ? 1 : 0;\n      }\n\n      if (instanced !== undefined) {\n        _utils.log.deprecated('Attribute.instanced');\n\n        this.divisor = instanced ? 1 : 0;\n      }\n    }\n  }, {\n    key: \"_validateAttributeDefinition\",\n    value: function _validateAttributeDefinition() {// Can be undefined for buffers (auto deduced from shaders)\n      // or larger than 4 for uniform arrays\n      // assert(\n      //   this.size >= 1 && this.size <= 4,\n      //   `Attribute definition for ${this.id} invalid size`\n      // );\n    }\n  }]);\n  return Attribute;\n}();\n\nexports.default = Attribute;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../webgl\":\"yQJr\",\"../utils\":\"B7AM\",\"../webgl-context/context-features\":\"T1Gu\"}],\"a3Eh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getDrawMode = getDrawMode;\nexports.default = exports.DRAW_MODE = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Rendering primitives - specify how to extract primitives from vertices.\n// NOTE: These are numerically identical to the corresponding WebGL/OpenGL constants\nvar DRAW_MODE = {\n  POINTS: 0x0000,\n  // draw single points.\n  LINES: 0x0001,\n  // draw lines. Each vertex connects to the one after it.\n  LINE_LOOP: 0x0002,\n  // draw lines. Each set of two vertices is treated as a separate line segment.\n  LINE_STRIP: 0x0003,\n  // draw a connected group of line segments from the first vertex to the last\n  TRIANGLES: 0x0004,\n  // draw triangles. Each set of three vertices creates a separate triangle.\n  TRIANGLE_STRIP: 0x0005,\n  // draw a connected group of triangles.\n  TRIANGLE_FAN: 0x0006 // draw a connected group of triangles.\n  // Each vertex connects to the previous and the first vertex in the fan.\n\n}; // Helper function to handle string draw modes - when using this library without WebGL constants\n\nexports.DRAW_MODE = DRAW_MODE;\n\nfunction getDrawMode(drawMode) {\n  var mode = typeof drawMode === 'string' ? DRAW_MODE[drawMode] || DRAW_MODE.TRIANGLES : drawMode;\n  (0, _assert.default)(mode >= 0 && mode <= DRAW_MODE.TRIANGLE_FAN, 'Illegal drawMode');\n  return mode;\n}\n\nvar Geometry =\n/*#__PURE__*/\nfunction () {\n  function Geometry() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, Geometry);\n    var id = opts.id,\n        _opts$drawMode = opts.drawMode,\n        drawMode = _opts$drawMode === void 0 ? DRAW_MODE.TRIANGLES : _opts$drawMode,\n        _opts$vertexCount = opts.vertexCount,\n        vertexCount = _opts$vertexCount === void 0 ? undefined : _opts$vertexCount,\n        attributes = opts.attributes;\n    this.id = id || (0, _utils.uid)(this.constructor.name);\n    this.drawMode = getDrawMode(drawMode);\n    this.vertexCount = vertexCount;\n    this.attributes = {};\n    this.needsRedraw = true;\n    this.userData = {};\n    Object.seal(this);\n\n    if (attributes) {\n      this.setAttributes(attributes);\n    }\n  }\n\n  (0, _createClass2.default)(Geometry, [{\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw() {\n      var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n      this.needsRedraw = redraw;\n      return this;\n    }\n  }, {\n    key: \"getNeedsRedraw\",\n    value: function getNeedsRedraw() {\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref$clearRedrawFlags = _ref.clearRedrawFlags,\n          clearRedrawFlags = _ref$clearRedrawFlags === void 0 ? false : _ref$clearRedrawFlags;\n\n      var redraw = false;\n      redraw = redraw || this.needsRedraw;\n      this.needsRedraw = this.needsRedraw && !clearRedrawFlags;\n      return redraw;\n    }\n  }, {\n    key: \"setVertexCount\",\n    value: function setVertexCount(vertexCount) {\n      this.vertexCount = vertexCount;\n    }\n  }, {\n    key: \"getVertexCount\",\n    value: function getVertexCount() {\n      if (this.vertexCount !== undefined) {\n        return this.vertexCount;\n      } else if (this.attributes.indices) {\n        return this.attributes.indices.value.length;\n      } else if (this.attributes.vertices) {\n        return this.attributes.vertices.value.length / 3;\n      } else if (this.attributes.positions) {\n        return this.attributes.positions.value.length / 3;\n      }\n\n      return false;\n    }\n  }, {\n    key: \"hasAttribute\",\n    value: function hasAttribute(attributeName) {\n      return Boolean(this.attributes[attributeName]);\n    }\n  }, {\n    key: \"getAttribute\",\n    value: function getAttribute(attributeName) {\n      var attribute = this.attributes[attributeName];\n      (0, _assert.default)(attribute);\n      return attribute.value;\n    }\n  }, {\n    key: \"getArray\",\n    value: function getArray(attributeName) {\n      var attribute = this.attributes[attributeName];\n      (0, _assert.default)(attribute);\n      return attribute.value;\n    }\n  }, {\n    key: \"getAttributes\",\n    value: function getAttributes() {\n      return this.attributes;\n    } // Attribute\n    // value: typed array\n    // type: indices, vertices, uvs\n    // size: elements per vertex\n    // target: WebGL buffer type (string or constant)\n\n  }, {\n    key: \"setAttributes\",\n    value: function setAttributes(attributes) {\n      for (var attributeName in attributes) {\n        var attribute = attributes[attributeName]; // Wrap \"unwrapped\" arrays and try to autodetect their type\n\n        attribute = ArrayBuffer.isView(attribute) ? {\n          value: attribute\n        } : attribute;\n        (0, _assert.default)(ArrayBuffer.isView(attribute.value), \"\".concat(this._print(attributeName), \": must be typed array or object with value as typed array\"));\n\n        this._autoDetectAttribute(attributeName, attribute);\n\n        this.attributes[attributeName] = attribute;\n      }\n\n      this.setNeedsRedraw();\n      return this;\n    } // Check for well known attribute names\n\n    /* eslint-disable default-case, complexity */\n\n  }, {\n    key: \"_autoDetectAttribute\",\n    value: function _autoDetectAttribute(attributeName, attribute) {\n      var category;\n\n      switch (attributeName) {\n        case 'indices':\n          category = category || 'indices';\n          break;\n\n        case 'texCoords':\n        case 'texCoord1':\n        case 'texCoord2':\n        case 'texCoord3':\n          category = 'uvs';\n          break;\n\n        case 'vertices':\n        case 'positions':\n        case 'normals':\n        case 'pickingColors':\n          category = 'vectors';\n          break;\n      } // Check for categorys\n\n\n      switch (category) {\n        case 'vectors':\n          attribute.size = attribute.size || 3;\n          break;\n\n        case 'uvs':\n          attribute.size = attribute.size || 2;\n          break;\n\n        case 'indices':\n          attribute.size = attribute.size || 1;\n          attribute.isIndexed = attribute.isIndexed === undefined ? true : attribute.isIndexed;\n          (0, _assert.default)(attribute.value instanceof Uint16Array || attribute.value instanceof Uint32Array, 'attribute array for \"indices\" must be of integer type');\n          break;\n      }\n\n      (0, _assert.default)(attribute.size, \"attribute \".concat(attributeName, \" needs size\"));\n    }\n    /* eslint-enable default-case, complexity */\n\n  }, {\n    key: \"_print\",\n    value: function _print(attributeName) {\n      return \"Geometry \".concat(this.id, \" attribute \").concat(attributeName);\n    }\n  }]);\n  return Geometry;\n}();\n\nexports.default = Geometry;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"LjhN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = \"#define SHADER_NAME luma_modular_vertex\\n\\n// object attributes\\nattribute vec3 positions;\\nattribute vec3 normals;\\nattribute vec4 colors;\\nattribute vec2 texCoords;\\nattribute vec3 pickingColors;\\n\\nvoid main(void) {\\n\\n  // Set up position\\n#ifdef MODULE_GEOMETRY\\n  geometry_setPosition(positions);\\n  geometry_setNormal(normals);\\n#endif\\n\\n#ifdef MODULE_PROJECT\\n  project_setPositionAndNormal_Model(positions, normals);\\n  gl_Position = project_model_to_clipspace(positions);\\n#endif\\n\\n  // Set up depth\\n#ifdef MODULE_LOGDEPTH\\n  logdepth_adjustPosition(gl_Position);\\n#endif\\n\\n#ifdef MODULE_DIFFUSE\\n  diffuse_setTextureCoordinate(texCoords);\\n#endif\\n\\n  // Set up color calculations\\n#ifdef MODULE_MATERIAL\\n  material_setDiffuseColor(colors);\\n  material_setDiffuseTextureCoordinates(texCoords);\\n#endif\\n\\n#ifdef MODULE_LIGHTING\\n  lighting_setPositionAndNormal(positions, normals);\\n  lighting_apply_light(positions);\\n  lighting_apply_reflection(positions);\\n#endif\\n\\n#ifdef MODULE_PICKING\\n  picking_setPickingColor(pickingColors);\\n#endif\\n\\n}\\n\";\nexports.default = _default;\n},{}],\"aNoM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = \"#define SHADER_NAME luma-modular-fragment\\n\\nprecision highp float;\\n\\n// varyings\\nvarying vec4 vColor;\\n\\nvoid main(){\\n  gl_FragColor = vec4(1., 0., 1., 1.);\\n\\n#ifdef MODULE_DIFFUSE\\n  gl_FragColor = diffuse_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_MATERIAL\\n  gl_FragColor = material_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_LIGHTING\\n  gl_FragColor = lighting_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_FOG\\n  gl_FragColor = fog_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_PICKING\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_LOGDEPTH\\n  logdepth_setFragDepth(gl_Position);\\n#endif\\n}\\n\";\nexports.default = _default;\n},{}],\"va5x\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MODULAR_SHADERS = void 0;\n\nvar _modularVertex = _interopRequireDefault(require(\"./modular-vertex.glsl\"));\n\nvar _modularFragment = _interopRequireDefault(require(\"./modular-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Default Shaders\n// A set of base shaders that leverage the shader module system,\n// dynamically enabling features depending on which modules are included\nvar MODULAR_SHADERS = {\n  vs: _modularVertex.default,\n  fs: _modularFragment.default,\n  defaultUniforms: {}\n};\nexports.MODULAR_SHADERS = MODULAR_SHADERS;\n},{\"./modular-vertex.glsl\":\"LjhN\",\"./modular-fragment.glsl\":\"aNoM\"}],\"fyRe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FRAGMENT_SHADER = exports.VERTEX_SHADER = void 0;\nvar VERTEX_SHADER = 'vs';\nexports.VERTEX_SHADER = VERTEX_SHADER;\nvar FRAGMENT_SHADER = 'fs';\nexports.FRAGMENT_SHADER = FRAGMENT_SHADER;\n},{}],\"foPU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = transpileShader;\n\n// Transpiles shader source code to target GLSL version\n// Note: We always run transpiler even if same version e.g. 3.00 => 3.00\n// RFC: https://github.com/uber/luma.gl/blob/master/dev-docs/RFCs/v6.0/portable-glsl-300-rfc.md\nfunction transpileShader(source, targetGLSLVersion, isVertex) {\n  switch (targetGLSLVersion) {\n    case 300:\n      return isVertex ? convertVertexShaderTo300(source) : convertFragmentShaderTo300(source);\n\n    case 100:\n      return isVertex ? convertVertexShaderTo100(source) : convertFragmentShaderTo100(source);\n\n    default:\n      throw new Error(\"unknown GLSL version \".concat(targetGLSLVersion));\n  }\n}\n\nfunction convertVertexShaderTo300(source) {\n  return source.replace(/attribute\\s+/g, 'in ').replace(/varying\\s+/g, 'out ').replace(/texture2D\\(/g, 'texture(').replace(/textureCube\\(+/g, 'texture('); // Deal with fragColor\n  // .replace(/gl_fragColor/g, 'fragColor ');\n}\n\nfunction convertFragmentShaderTo300(source) {\n  return source.replace(/varying\\s+/g, 'in ').replace(/texture2D\\(/g, 'texture(').replace(/textureCube\\(/g, 'texture('); // Deal with fragColor\n  // .replace(/gl_fragColor/g, 'fragColor ');\n}\n\nfunction convertVertexShaderTo100(source) {\n  // /gm - treats each line as a string, so that ^ matches after newlines\n  return source.replace(/^in\\s+/gm, 'attribute ').replace(/^out\\s+/gm, 'varying ').replace(/texture\\(/g, 'texture2D(');\n}\n\nfunction convertFragmentShaderTo100(source) {\n  // /gm - treats each line as a string, so that ^ matches after newlines\n  return source.replace(/^in\\s+/gm, 'varying ').replace(/texture\\(/g, 'texture2D('); // Deal with fragColor\n  // .replace(/^out\\s+/g, 'varying ')\n}\n},{}],\"ubhX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = assert;\n\n// Recommendation is to ignore message but current test suite checks agains the\n// message so keep it for now.\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(message || 'shadertools: assertion failed.');\n  }\n}\n},{}],\"US3q\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _transpileShader = _interopRequireDefault(require(\"./transpile-shader\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar VERTEX_SHADER = 'vs';\nvar FRAGMENT_SHADER = 'fs';\n\nvar ShaderModule =\n/*#__PURE__*/\nfunction () {\n  function ShaderModule(_ref) {\n    var name = _ref.name,\n        vs = _ref.vs,\n        fs = _ref.fs,\n        _ref$dependencies = _ref.dependencies,\n        dependencies = _ref$dependencies === void 0 ? [] : _ref$dependencies,\n        _ref$getUniforms = _ref.getUniforms,\n        getUniforms = _ref$getUniforms === void 0 ? function () {\n      return {};\n    } : _ref$getUniforms,\n        _ref$deprecations = _ref.deprecations,\n        deprecations = _ref$deprecations === void 0 ? [] : _ref$deprecations,\n        vertexShader = _ref.vertexShader,\n        fragmentShader = _ref.fragmentShader;\n    (0, _classCallCheck2.default)(this, ShaderModule);\n    (0, _assert.default)(typeof name === 'string');\n    this.name = name;\n    this.vs = vs || vertexShader;\n    this.fs = fs || fragmentShader;\n    this.getModuleUniforms = getUniforms;\n    this.dependencies = dependencies;\n    this.deprecations = this._parseDeprecationDefinitions(deprecations);\n  } // Extracts the source code chunk for the specified shader type from the named shader module\n\n\n  (0, _createClass2.default)(ShaderModule, [{\n    key: \"getModuleSource\",\n    value: function getModuleSource(type, targetGLSLVersion) {\n      var moduleSource;\n\n      switch (type) {\n        case VERTEX_SHADER:\n          moduleSource = (0, _transpileShader.default)(this.vs || '', targetGLSLVersion, true);\n          break;\n\n        case FRAGMENT_SHADER:\n          moduleSource = (0, _transpileShader.default)(this.fs || '', targetGLSLVersion, false);\n          break;\n\n        default:\n          (0, _assert.default)(false);\n      }\n\n      if (typeof moduleSource !== 'string') {\n        return '';\n      }\n\n      return \"#define MODULE_\".concat(this.name.toUpperCase(), \"\\n\").concat(moduleSource, \"// END MODULE_\").concat(this.name, \"\\n\\n\");\n    }\n  }, {\n    key: \"getUniforms\",\n    value: function getUniforms(opts, uniforms) {\n      return this.getModuleUniforms(opts, uniforms);\n    } // Warn about deprecated uniforms or functions\n\n  }, {\n    key: \"checkDeprecations\",\n    value: function checkDeprecations(shaderSource, log) {\n      this.deprecations.forEach(function (def) {\n        if (def.regex.test(shaderSource)) {\n          if (def.deprecated && log) {\n            log.deprecated(def.old, def.new)();\n          } else if (log) {\n            log.removed(def.old, def.new)();\n          }\n        }\n      });\n    }\n  }, {\n    key: \"_parseDeprecationDefinitions\",\n    value: function _parseDeprecationDefinitions() {\n      var deprecations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      deprecations.forEach(function (def) {\n        switch (def.type) {\n          case 'function':\n            def.regex = new RegExp(\"\\\\b\".concat(def.old, \"\\\\(\"));\n            break;\n\n          default:\n            def.regex = new RegExp(\"\".concat(def.type, \" \").concat(def.old, \";\"));\n        }\n      });\n      return deprecations;\n    }\n  }]);\n  return ShaderModule;\n}();\n\nexports.default = ShaderModule;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./transpile-shader\":\"foPU\",\"../utils/assert\":\"ubhX\"}],\"WAoP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _shaderModule = _interopRequireDefault(require(\"./shader-module\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ShaderModuleRegistry =\n/*#__PURE__*/\nfunction () {\n  function ShaderModuleRegistry() {\n    (0, _classCallCheck2.default)(this, ShaderModuleRegistry);\n    this.shaderModules = {};\n    this.defaultShaderModules = [];\n  }\n\n  (0, _createClass2.default)(ShaderModuleRegistry, [{\n    key: \"setDefaultShaderModules\",\n    value: function setDefaultShaderModules(modules) {\n      this.defaultShaderModules = this.resolveModules(modules);\n    }\n  }, {\n    key: \"registerShaderModules\",\n    value: function registerShaderModules(shaderModuleList) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref$ignoreMultipleRe = _ref.ignoreMultipleRegistrations,\n          ignoreMultipleRegistrations = _ref$ignoreMultipleRe === void 0 ? false : _ref$ignoreMultipleRe;\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = shaderModuleList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var shaderModule = _step.value;\n\n          this._registerShaderModule(shaderModule, ignoreMultipleRegistrations);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"getShaderModule\",\n    value: function getShaderModule(moduleOrName) {\n      // Check if \"inline\" module, return it\n      if (moduleOrName instanceof _shaderModule.default) {\n        return moduleOrName;\n      } // Check if module descriptor\n\n\n      if (typeof moduleOrName !== 'string') {\n        return this._registerShaderModule(moduleOrName, true);\n      } // Module name - Look up module\n\n\n      var module = this.shaderModules[moduleOrName];\n\n      if (!module) {\n        (0, _assert.default)(false, \"Unknown shader module \".concat(moduleOrName));\n      }\n\n      return module;\n    } // registers any supplied modules, resolves any names into modules\n    // returns a list of modules\n\n  }, {\n    key: \"resolveModules\",\n    value: function resolveModules(modules) {\n      var _this = this;\n\n      return modules.map(function (moduleOrName) {\n        return _this.getShaderModule(moduleOrName);\n      });\n    } // PRIVATE API\n\n  }, {\n    key: \"_registerShaderModule\",\n    value: function _registerShaderModule(module) {\n      var ignoreMultipleRegistrations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; // Check if \"inline\" module, return it\n\n      if (module instanceof _shaderModule.default) {\n        return module;\n      }\n\n      (0, _assert.default)(module.name, 'shader module has no name');\n\n      if (!this.shaderModules[module.name] || ignoreMultipleRegistrations) {\n        // if ignoreMultipleRegistrations = true, we allow module to be re-registered\n        module = new _shaderModule.default(module);\n        module.dependencies = this.resolveModules(module.dependencies);\n        this.shaderModules[module.name] = module;\n      } else {\n        // TODO - instead verify that definition is not changing...\n        throw new Error(\"shader module \".concat(module.name, \" already registered\"));\n      }\n\n      return this.shaderModules[module.name];\n    }\n  }]);\n  return ShaderModuleRegistry;\n}();\n\nexports.default = ShaderModuleRegistry;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./shader-module\":\"US3q\",\"../utils/assert\":\"ubhX\"}],\"iN6G\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setDefaultShaderModules = setDefaultShaderModules;\nexports.registerShaderModules = registerShaderModules;\nexports.resolveModules = resolveModules;\nexports.getShaderModule = getShaderModule;\nexports.TEST_EXPORTS = void 0;\n\nvar _shaderModuleRegistry = _interopRequireDefault(require(\"./shader-module-registry\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar shaderModuleRegistry = new _shaderModuleRegistry.default();\n/**\n * Registers an array of default shader modules. These will be concatenated\n * automatically at the end of any shader module list passed to\n * `assembleShaders` (plus `resolveModules` and `getShaderDependencies`)\n * @param {Object[]} modules - Array of shader modules\n */\n\nfunction setDefaultShaderModules(modules) {\n  shaderModuleRegistry.setDefaultShaderModules(modules);\n}\n/**\n * Registers an array of shader modules\n * @param {Object[]} shaderModuleList - Array of shader modules\n */\n\n\nfunction registerShaderModules(shaderModuleList) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$ignoreMultipleRe = _ref.ignoreMultipleRegistrations,\n      ignoreMultipleRegistrations = _ref$ignoreMultipleRe === void 0 ? false : _ref$ignoreMultipleRe;\n\n  shaderModuleRegistry.registerShaderModules(shaderModuleList, {\n    ignoreMultipleRegistrations: ignoreMultipleRegistrations\n  });\n} // registers any supplied modules and returns a list of module names\n\n\nfunction resolveModules(modules) {\n  modules = modules.concat(shaderModuleRegistry.defaultShaderModules);\n  modules = shaderModuleRegistry.resolveModules(modules);\n  return getShaderDependencies(modules);\n} // Looks up a moduleName among registered modules and returns definition.\n// If \"inline\" module, returns it directly\n\n\nfunction getShaderModule(moduleOrName) {\n  return shaderModuleRegistry.getShaderModule(moduleOrName);\n}\n/**\n * Takes a list of shader module names and returns a new list of\n * shader module names that includes all dependencies, sorted so\n * that modules that are dependencies of other modules come first.\n *\n * If the shader glsl code from the returned modules is concatenated\n * in the reverse order, it is guaranteed that all functions be resolved and\n * that all function and variable definitions come before use.\n *\n * @param {String[]} modules - Array of modules (inline modules or module names)\n * @return {String[]} - Array of modules\n */\n\n\nfunction getShaderDependencies(modules) {\n  var moduleMap = {};\n  var moduleDepth = {};\n  getDependencyGraph({\n    modules: modules,\n    level: 0,\n    moduleMap: moduleMap,\n    moduleDepth: moduleDepth\n  }); // Return a reverse sort so that dependencies come before the modules that use them\n\n  return Object.keys(moduleDepth).sort(function (a, b) {\n    return moduleDepth[b] - moduleDepth[a];\n  }).map(function (name) {\n    return moduleMap[name];\n  });\n}\n/**\n * Recursively checks module dpendencies to calculate dependency\n * level of each module.\n *\n * @param {String[]} modules - Array of modules\n * @param {Number} level - Current level\n * @return {result} - Map of module name to its level\n */\n// Adds another level of dependencies to the result map\n\n\nfunction getDependencyGraph(_ref2) {\n  var modules = _ref2.modules,\n      level = _ref2.level,\n      moduleMap = _ref2.moduleMap,\n      moduleDepth = _ref2.moduleDepth;\n\n  if (level >= 5) {\n    throw new Error('Possible loop in shader dependency graph');\n  } // Update level on all current modules\n\n\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = modules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var module = _step.value;\n      moduleMap[module.name] = module;\n\n      if (moduleDepth[module.name] === undefined || moduleDepth[module.name] < level) {\n        moduleDepth[module.name] = level;\n      }\n    } // Recurse\n\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  var _iteratorNormalCompletion2 = true;\n  var _didIteratorError2 = false;\n  var _iteratorError2 = undefined;\n\n  try {\n    for (var _iterator2 = modules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n      var _module = _step2.value;\n\n      if (_module.dependencies) {\n        getDependencyGraph({\n          modules: _module.dependencies,\n          level: level + 1,\n          moduleMap: moduleMap,\n          moduleDepth: moduleDepth\n        });\n      }\n    }\n  } catch (err) {\n    _didIteratorError2 = true;\n    _iteratorError2 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n        _iterator2.return();\n      }\n    } finally {\n      if (_didIteratorError2) {\n        throw _iteratorError2;\n      }\n    }\n  }\n}\n\nvar TEST_EXPORTS = {\n  getShaderDependencies: getShaderDependencies,\n  getDependencyGraph: getDependencyGraph\n};\nexports.TEST_EXPORTS = TEST_EXPORTS;\n},{\"./shader-module-registry\":\"WAoP\"}],\"TOhE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = isOldIE;\n\n/* global window */\n// opts allows user agent to be overridden for testing\nfunction isOldIE() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var navigator = typeof window !== 'undefined' ? window.navigator || {} : {};\n  var userAgent = opts.userAgent || navigator.userAgent || ''; // We only care about older versions of IE (IE 11 and below). Newer versions of IE (Edge)\n  // have much better web standards support.\n\n  var isMSIE = userAgent.indexOf('MSIE ') !== -1;\n  var isTrident = userAgent.indexOf('Trident/') !== -1;\n  return isMSIE || isTrident;\n}\n},{}],\"rYgN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getContextInfo = getContextInfo;\nexports.canCompileGLGSExtension = canCompileGLGSExtension;\nexports.hasFeatures = hasFeatures;\nexports.FEATURES = void 0;\n\nvar _isOldIe = _interopRequireDefault(require(\"./is-old-ie\"));\n\nvar _assert = _interopRequireDefault(require(\"./assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Feature detection for WebGL\n//\n// Provides a function that enables simple checking of which WebGL features are\n// available in an WebGL1 or WebGL2 environment.\n\n/* eslint-disable no-inline-comments, max-len */\n\n/* global WebGL2RenderingContext */\nvar GL_TEXTURE_BINDING_3D = 0x806a;\nvar GL_VENDOR = 0x1f00;\nvar GL_RENDERER = 0x1f01;\nvar GL_VERSION = 0x1f02;\nvar GL_SHADING_LANGUAGE_VERSION = 0x8b8c; // Defines luma.gl \"feature\" names and semantics\n\nvar WEBGL_FEATURES = {\n  // GLSL extensions\n  GLSL_FRAG_DATA: ['WEBGL_draw_buffers', true],\n  // TODO - name makes no sense in GLSL 3.00\n  GLSL_FRAG_DEPTH: ['EXT_frag_depth', true],\n  GLSL_DERIVATIVES: ['OES_standard_derivatives', true],\n  GLSL_TEXTURE_LOD: ['EXT_shader_texture_lod', true]\n}; // Create a key-mirrored FEATURES array\n\nvar FEATURES = {};\nexports.FEATURES = FEATURES;\nObject.keys(WEBGL_FEATURES).forEach(function (key) {\n  FEATURES[key] = key;\n});\n\nfunction isWebGL2(gl) {\n  return Boolean(gl && (typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext || 32874 === GL_TEXTURE_BINDING_3D));\n}\n\nfunction getContextInfo(gl) {\n  var info = gl.getExtension('WEBGL_debug_renderer_info');\n  var vendor = gl.getParameter(info && info.UNMASKED_VENDOR_WEBGL || GL_VENDOR);\n  var renderer = gl.getParameter(info && info.UNMASKED_RENDERER_WEBGL || GL_RENDERER);\n  var gpuVendor = identifyGPUVendor(vendor, renderer);\n  var gpuInfo = {\n    gpuVendor: gpuVendor,\n    vendor: vendor,\n    renderer: renderer,\n    version: gl.getParameter(GL_VERSION),\n    shadingLanguageVersion: gl.getParameter(GL_SHADING_LANGUAGE_VERSION)\n  };\n  return gpuInfo;\n}\n\nfunction identifyGPUVendor(vendor, renderer) {\n  if (vendor.match(/NVIDIA/i) || renderer.match(/NVIDIA/i)) {\n    return 'NVIDIA';\n  }\n\n  if (vendor.match(/INTEL/i) || renderer.match(/INTEL/i)) {\n    return 'INTEL';\n  }\n\n  if (vendor.match(/AMD/i) || renderer.match(/AMD/i) || vendor.match(/ATI/i) || renderer.match(/ATI/i)) {\n    return 'AMD';\n  }\n\n  return 'UNKNOWN GPU';\n}\n\nvar compiledGlslExtensions = {}; // Enables feature detection in IE11 due to a bug where gl.getExtension may return true\n// but fail to compile when the extension is enabled in the shader. Specifically,\n// the OES_standard_derivatives and WEBGL_draw_buffers extensions fails to compile in IE11 even though its included\n// in the list of supported extensions.\n// opts allows user agent to be overridden for testing\n\n/*\n* Inputs :\n*  gl : WebGL context\n*  cap : Key of WEBGL_FEATURES object identifying the extension\n*  opts :\n*   behavior : behavor of extension to be tested, by defualt `enable` is used\n* Returns : true, if shader is compiled successfully, false otherwise\n*/\n\nfunction canCompileGLGSExtension(gl, cap) {\n  var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var feature = WEBGL_FEATURES[cap];\n  (0, _assert.default)(feature, cap);\n\n  if (!(0, _isOldIe.default)(opts)) {\n    return true;\n  }\n\n  if (cap in compiledGlslExtensions) {\n    return compiledGlslExtensions[cap];\n  }\n\n  var extensionName = feature[0];\n  var behavior = opts.behavior || 'enable';\n  var source = \"#extension GL_\".concat(extensionName, \" : \").concat(behavior, \"\\nvoid main(void) {}\");\n  var shader = gl.createShader(35633);\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  var canCompile = gl.getShaderParameter(shader, 35713);\n  gl.deleteShader(shader);\n  compiledGlslExtensions[cap] = canCompile;\n  return canCompile;\n} // TODO - cache the value\n\n\nfunction getFeature(gl, cap) {\n  var feature = WEBGL_FEATURES[cap];\n  (0, _assert.default)(feature, cap); // Get extension name from table\n\n  var extensionName = isWebGL2(gl) ? feature[1] || feature[0] : feature[0]; // Check if the value is dependent on checking an extension\n\n  var value = typeof extensionName === 'string' ? Boolean(gl.getExtension(extensionName)) : extensionName;\n  (0, _assert.default)(value === false || value === true);\n  return value;\n}\n\nfunction hasFeatures(gl, features) {\n  features = Array.isArray(features) ? features : [features];\n  return features.every(function (feature) {\n    return getFeature(gl, feature);\n  });\n}\n},{\"./is-old-ie\":\"TOhE\",\"./assert\":\"ubhX\"}],\"KV9d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPlatformShaderDefines = getPlatformShaderDefines;\nexports.getVersionDefines = getVersionDefines;\n\nvar _webglInfo = require(\"../utils/webgl-info\");\n\nfunction getPlatformShaderDefines(gl) {\n  var debugInfo = (0, _webglInfo.getContextInfo)(gl);\n\n  switch (debugInfo.gpuVendor.toLowerCase()) {\n    case 'nvidia':\n      return \"#define NVIDIA_GPU\\n// Nvidia optimizes away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n\";\n\n    case 'intel':\n      return \"#define INTEL_GPU\\n// Intel optimizes away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n// Intel's built-in 'tan' function doesn't have acceptable precision\\n#define LUMA_FP32_TAN_PRECISION_WORKAROUND 1\\n// Intel GPU doesn't have full 32 bits precision in same cases, causes overflow\\n#define LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND 1\\n\";\n\n    case 'amd':\n      // AMD Does not eliminate fp64 code\n      return \"#define AMD_GPU\\n\";\n\n    default:\n      // We don't know what GPU it is, could be that the GPU driver or\n      // browser is not implementing UNMASKED_RENDERER constant and not\n      // reporting a correct name\n      return \"#define DEFAULT_GPU\\n// Prevent driver from optimizing away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n// Intel's built-in 'tan' function doesn't have acceptable precision\\n#define LUMA_FP32_TAN_PRECISION_WORKAROUND 1\\n// Intel GPU doesn't have full 32 bits precision in same cases, causes overflow\\n#define LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND 1\\n\";\n  }\n}\n\nfunction getVersionDefines(gl, glslVersion, isFragment) {\n  // Add shadertools defines to let shaders portably v1/v3 check for features\n  var versionDefines = \"#if (__VERSION__ > 120)\\n\\n# define FRAG_DEPTH\\n# define DERIVATIVES\\n# define DRAW_BUFFERS\\n# define TEXTURE_LOD\\n\\n#endif // __VERSION\\n\";\n\n  if ((0, _webglInfo.hasFeatures)(gl, _webglInfo.FEATURES.GLSL_FRAG_DEPTH)) {\n    versionDefines += \"// FRAG_DEPTH => gl_FragDepth is available\\n#ifdef GL_EXT_frag_depth\\n#extension GL_EXT_frag_depth : enable\\n# define FRAG_DEPTH\\n# define gl_FragDepth gl_FragDepthEXT\\n#endif\\n\";\n  }\n\n  if ((0, _webglInfo.hasFeatures)(gl, _webglInfo.FEATURES.GLSL_DERIVATIVES) && (0, _webglInfo.canCompileGLGSExtension)(gl, _webglInfo.FEATURES.GLSL_DERIVATIVES)) {\n    versionDefines += \"// DERIVATIVES => dxdF, dxdY and fwidth are available\\n#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n# define DERIVATIVES\\n#endif\\n\";\n  }\n\n  if ((0, _webglInfo.hasFeatures)(gl, _webglInfo.FEATURES.GLSL_FRAG_DATA) && (0, _webglInfo.canCompileGLGSExtension)(gl, _webglInfo.FEATURES.GLSL_FRAG_DATA, {\n    behavior: 'require'\n  })) {\n    versionDefines += \"// DRAW_BUFFERS => gl_FragData[] is available\\n#ifdef GL_EXT_draw_buffers\\n#extension GL_EXT_draw_buffers : require\\n#define DRAW_BUFFERS\\n#endif\\n\";\n  }\n\n  if ((0, _webglInfo.hasFeatures)(gl, _webglInfo.FEATURES.GLSL_TEXTURE_LOD)) {\n    versionDefines += \"// TEXTURE_LOD => texture2DLod etc are available\\n#ifdef GL_EXT_shader_texture_lod\\n#extension GL_EXT_shader_texture_lod : enable\\n# define TEXTURE_LOD\\n#define texture2DLod texture2DLodEXT\\n#define texture2DProjLod texture2DProjLodEXT\\n#define texture2DProjLod texture2DProjLodEXT\\n#define textureCubeLod textureCubeLodEXT\\n#define texture2DGrad texture2DGradEXT\\n#define texture2DProjGrad texture2DProjGradEXT\\n#define texture2DProjGrad texture2DProjGradEXT\\n#define textureCubeGrad textureCubeGradEXT\\n#endif\\n\";\n  }\n\n  return versionDefines;\n}\n},{\"../utils/webgl-info\":\"rYgN\"}],\"dbvX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MODULE_INJECTORS_FS = exports.MODULE_INJECTORS_VS = void 0;\nvar MODULE_INJECTORS_VS = \"#ifdef MODULE_LOGDEPTH\\n  logdepth_adjustPosition(gl_Position);\\n#endif\\n\";\nexports.MODULE_INJECTORS_VS = MODULE_INJECTORS_VS;\nvar MODULE_INJECTORS_FS = \"#ifdef MODULE_MATERIAL\\n  gl_FragColor = material_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_LIGHTING\\n  gl_FragColor = lighting_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_FOG\\n  gl_FragColor = fog_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_PICKING\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_LOGDEPTH\\n  logdepth_setFragDepth();\\n#endif\\n\";\nexports.MODULE_INJECTORS_FS = MODULE_INJECTORS_FS;\n},{}],\"gZC3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = injectShader;\nexports.combineInjects = combineInjects;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _moduleInjectors = require(\"../modules/module-injectors\");\n\nvar _constants = require(\"./constants\");\n\nvar _assert = _interopRequireDefault(require(\"assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _MODULE_INJECTORS;\n\n// TODO - experimental\nvar MODULE_INJECTORS = (_MODULE_INJECTORS = {}, (0, _defineProperty2.default)(_MODULE_INJECTORS, _constants.VERTEX_SHADER, _moduleInjectors.MODULE_INJECTORS_VS), (0, _defineProperty2.default)(_MODULE_INJECTORS, _constants.FRAGMENT_SHADER, _moduleInjectors.MODULE_INJECTORS_FS), _MODULE_INJECTORS);\nvar REGEX_START_OF_MAIN = /void main\\s*\\([^\\)]*\\)\\s*\\{\\n?/; // Beginning of main\n\nvar REGEX_END_OF_MAIN = /}\\n?[^{}]*$/; // End of main, assumes main is last function\n// A minimal shader injection/templating system.\n// RFC: https://github.com/uber/luma.gl/blob/master/dev-docs/RFCs/v6.0/shader-injection-rfc.md\n\n/* eslint-disable complexity */\n\nfunction injectShader(source, type, inject, injectStandardStubs) {\n  var isVertex = type === _constants.VERTEX_SHADER;\n\n  var _loop = function _loop(key) {\n    var fragment = inject[key];\n\n    switch (key) {\n      // declarations are injected before the main function\n      case 'vs:#decl':\n        if (isVertex) {\n          source = source.replace(REGEX_START_OF_MAIN, function (match) {\n            return \"\".concat(fragment, \"\\n\").concat(match);\n          });\n        }\n\n        break;\n      // main code is injected at the end of main function\n\n      case 'vs:#main-start':\n        if (isVertex) {\n          source = source.replace(REGEX_START_OF_MAIN, function (match) {\n            return match + fragment;\n          });\n        }\n\n        break;\n\n      case 'vs:#main-end':\n        if (isVertex) {\n          source = source.replace(REGEX_END_OF_MAIN, function (match) {\n            return fragment + match;\n          });\n        }\n\n        break;\n\n      case 'fs:#decl':\n        if (!isVertex) {\n          source = source.replace(REGEX_START_OF_MAIN, function (match) {\n            return \"\".concat(fragment, \"\\n\").concat(match);\n          });\n        }\n\n        break;\n\n      case 'fs:#main-start':\n        if (!isVertex) {\n          source = source.replace(REGEX_START_OF_MAIN, function (match) {\n            return match + fragment;\n          });\n        }\n\n        break;\n\n      case 'fs:#main-end':\n        if (!isVertex) {\n          source = source.replace(REGEX_END_OF_MAIN, function (match) {\n            return fragment + match;\n          });\n        }\n\n        break;\n\n      default:\n        // inject code after key, leaving key in place\n        source = source.replace(key, function (match) {\n          return match + fragment;\n        });\n    }\n  };\n\n  for (var key in inject) {\n    _loop(key);\n  } // Finally, if requested, insert an automatic module injector chunk\n\n\n  if (injectStandardStubs) {\n    source = source.replace('}s*$', function (match) {\n      return match + MODULE_INJECTORS[type];\n    });\n  }\n\n  return source;\n}\n/* eslint-enable complexity */\n// Takes an array of inject objects and combines them into one\n\n\nfunction combineInjects(injects) {\n  var result = {};\n  (0, _assert.default)(Array.isArray(injects) && injects.length > 1);\n  injects.forEach(function (inject) {\n    for (var key in inject) {\n      result[key] = result[key] ? \"\".concat(result[key], \"\\n\").concat(inject[key]) : inject[key];\n    }\n  });\n  return result;\n}\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"../modules/module-injectors\":\"dbvX\",\"./constants\":\"fyRe\",\"assert\":\"azYr\"}],\"FVsj\":[function(require,module,exports) {\nvar define;\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.assembleShaders = assembleShaders;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _constants = require(\"./constants\");\n\nvar _resolveModules = require(\"./resolve-modules\");\n\nvar _platformDefines = require(\"./platform-defines\");\n\nvar _injectShader = _interopRequireDefault(require(\"./inject-shader\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _SHADER_TYPE;\n\nvar SHADER_TYPE = (_SHADER_TYPE = {}, (0, _defineProperty2.default)(_SHADER_TYPE, _constants.VERTEX_SHADER, 'vertex'), (0, _defineProperty2.default)(_SHADER_TYPE, _constants.FRAGMENT_SHADER, 'fragment'), _SHADER_TYPE); // Precision prologue to inject before functions are injected in shader\n// TODO - extract any existing prologue in the fragment source and move it up...\n\nvar FRAGMENT_SHADER_PROLOGUE = \"precision highp float;\\n\\n\"; // Inject a list of modules\n\nfunction assembleShaders(gl) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var vs = opts.vs,\n      fs = opts.fs;\n  var modules = (0, _resolveModules.resolveModules)(opts.modules || []);\n  return {\n    gl: gl,\n    vs: assembleShader(gl, Object.assign({}, opts, {\n      source: vs,\n      type: _constants.VERTEX_SHADER,\n      modules: modules\n    })),\n    fs: assembleShader(gl, Object.assign({}, opts, {\n      source: fs,\n      type: _constants.FRAGMENT_SHADER,\n      modules: modules\n    })),\n    getUniforms: assembleGetUniforms(modules),\n    modules: assembleModuleMap(modules)\n  };\n} // Pulls together complete source code for either a vertex or a fragment shader\n// adding prologues, requested module chunks, and any final injections.\n\n\nfunction assembleShader(gl, _ref) {\n  var id = _ref.id,\n      source = _ref.source,\n      type = _ref.type,\n      _ref$modules = _ref.modules,\n      modules = _ref$modules === void 0 ? [] : _ref$modules,\n      _ref$defines = _ref.defines,\n      defines = _ref$defines === void 0 ? {} : _ref$defines,\n      _ref$inject = _ref.inject,\n      inject = _ref$inject === void 0 ? {} : _ref$inject,\n      _ref$prologue = _ref.prologue,\n      prologue = _ref$prologue === void 0 ? true : _ref$prologue,\n      log = _ref.log;\n  (0, _assert.default)(typeof source === 'string', 'shader source must be a string');\n  var isVertex = type === _constants.VERTEX_SHADER;\n  var sourceLines = source.split('\\n');\n  var glslVersion = 100;\n  var versionLine = '';\n  var coreSource = source; // Extract any version directive string from source.\n  // TODO : keep all pre-processor statements at the begining of the shader.\n\n  if (sourceLines[0].indexOf('#version ') === 0) {\n    glslVersion = 300; // TODO - regexp that matches atual version number\n\n    versionLine = sourceLines[0];\n    coreSource = sourceLines.slice(1).join('\\n');\n  } // Add platform defines (use these to work around platform-specific bugs and limitations)\n  // Add common defines (GLSL version compatibility, feature detection)\n  // Add precision declaration for fragment shaders\n\n\n  var assembledSource = prologue ? \"\".concat(versionLine, \"\\n\").concat(getShaderName({\n    id: id,\n    source: source,\n    type: type\n  }), \"\\n\").concat((0, _platformDefines.getPlatformShaderDefines)(gl), \"\\n\").concat((0, _platformDefines.getVersionDefines)(gl, glslVersion, !isVertex), \"\\n\").concat(getApplicationDefines(defines), \"\\n\").concat(isVertex ? '' : FRAGMENT_SHADER_PROLOGUE, \"\\n\") : \"\".concat(versionLine, \"\\n\"); // Add source of dependent modules in resolved order\n\n  var injectStandardStubs = false;\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = modules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var module = _step.value;\n\n      switch (module.name) {\n        case 'inject':\n          injectStandardStubs = true;\n          break;\n\n        default:\n          module.checkDeprecations(coreSource, log);\n          var moduleSource = module.getModuleSource(type, glslVersion); // Add the module source, and a #define that declares it presence\n\n          assembledSource += moduleSource;\n      }\n    } // Add the version directive and actual source of this shader\n\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  assembledSource += coreSource; // Apply any requested shader injections\n\n  assembledSource = (0, _injectShader.default)(assembledSource, type, inject, injectStandardStubs);\n  return assembledSource;\n} // Returns a combined `getUniforms` covering the options for all the modules,\n// the created function will pass on options to the inidividual `getUniforms`\n// function of each shader module and combine the results into one object that\n// can be passed to setUniforms.\n\n\nfunction assembleGetUniforms(modules) {\n  return function getUniforms(opts) {\n    var uniforms = {};\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n\n    try {\n      for (var _iterator2 = modules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n        var module = _step2.value; // `modules` is already sorted by dependency level. This guarantees that\n        // modules have access to the uniforms that are generated by their dependencies.\n\n        var moduleUniforms = module.getUniforms(opts, uniforms);\n        Object.assign(uniforms, moduleUniforms);\n      }\n    } catch (err) {\n      _didIteratorError2 = true;\n      _iteratorError2 = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n          _iterator2.return();\n        }\n      } finally {\n        if (_didIteratorError2) {\n          throw _iteratorError2;\n        }\n      }\n    }\n\n    return uniforms;\n  };\n} // Returns a map with module names as keys, resolving to their module definitions\n// The presence of a key indicates that the module is available in this program,\n// whether directly included, or through a dependency of some other module\n\n\nfunction assembleModuleMap(modules) {\n  var result = {};\n  var _iteratorNormalCompletion3 = true;\n  var _didIteratorError3 = false;\n  var _iteratorError3 = undefined;\n\n  try {\n    for (var _iterator3 = modules[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n      var moduleName = _step3.value;\n      var shaderModule = (0, _resolveModules.getShaderModule)(moduleName);\n      result[moduleName] = shaderModule;\n    }\n  } catch (err) {\n    _didIteratorError3 = true;\n    _iteratorError3 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion3 && _iterator3.return != null) {\n        _iterator3.return();\n      }\n    } finally {\n      if (_didIteratorError3) {\n        throw _iteratorError3;\n      }\n    }\n  }\n\n  return result;\n} // Generate \"glslify-compatible\" SHADER_NAME defines\n// These are understood by the GLSL error parsing function\n// If id is provided and no SHADER_NAME constant is present in source, create one\n\n\nfunction getShaderName(_ref2) {\n  var id = _ref2.id,\n      source = _ref2.source,\n      type = _ref2.type;\n  var injectShaderName = id && typeof id === 'string' && source.indexOf('SHADER_NAME') === -1;\n  return injectShaderName ? \"\\n#define SHADER_NAME \".concat(id, \"_\").concat(SHADER_TYPE[type], \"\\n\\n\") : '';\n} // Generates application defines from an object\n\n\nfunction getApplicationDefines() {\n  var defines = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var count = 0;\n  var sourceText = '';\n\n  for (var define in defines) {\n    if (count === 0) {\n      sourceText += '\\n// APPLICATION DEFINES\\n';\n    }\n\n    count++;\n    var value = defines[define];\n\n    if (value || Number.isFinite(value)) {\n      sourceText += \"#define \".concat(define.toUpperCase(), \" \").concat(defines[define], \"\\n\");\n    }\n  }\n\n  if (count === 0) {\n    sourceText += '\\n';\n  }\n\n  return sourceText;\n}\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"./constants\":\"fyRe\",\"./resolve-modules\":\"iN6G\",\"./platform-defines\":\"KV9d\",\"./inject-shader\":\"gZC3\",\"../utils/assert\":\"ubhX\"}],\"AmUH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar fp32shader = \"#ifdef LUMA_FP32_TAN_PRECISION_WORKAROUND\\nconst float TWO_PI = 6.2831854820251465;\\nconst float PI_2 = 1.5707963705062866;\\nconst float PI_16 = 0.1963495463132858;\\n\\nconst float SIN_TABLE_0 = 0.19509032368659973;\\nconst float SIN_TABLE_1 = 0.3826834261417389;\\nconst float SIN_TABLE_2 = 0.5555702447891235;\\nconst float SIN_TABLE_3 = 0.7071067690849304;\\n\\nconst float COS_TABLE_0 = 0.9807852506637573;\\nconst float COS_TABLE_1 = 0.9238795042037964;\\nconst float COS_TABLE_2 = 0.8314695954322815;\\nconst float COS_TABLE_3 = 0.7071067690849304;\\n\\nconst float INVERSE_FACTORIAL_3 = 1.666666716337204e-01;\\nconst float INVERSE_FACTORIAL_5 = 8.333333767950535e-03;\\nconst float INVERSE_FACTORIAL_7 = 1.9841270113829523e-04;\\nconst float INVERSE_FACTORIAL_9 = 2.75573188446287533e-06;\\n\\nfloat sin_taylor_fp32(float a) {\\n  float r, s, t, x;\\n\\n  if (a == 0.0) {\\n    return 0.0;\\n  }\\n\\n  x = -a * a;\\n  s = a;\\n  r = a;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_3;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_5;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_7;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_9;\\n  s = s + t;\\n\\n  return s;\\n}\\n\\nvoid sincos_taylor_fp32(float a, out float sin_t, out float cos_t) {\\n  if (a == 0.0) {\\n    sin_t = 0.0;\\n    cos_t = 1.0;\\n  }\\n  sin_t = sin_taylor_fp32(a);\\n  cos_t = sqrt(1.0 - sin_t * sin_t);\\n}\\n\\nfloat tan_taylor_fp32(float a) {\\n    float sin_a;\\n    float cos_a;\\n\\n    if (a == 0.0) {\\n        return 0.0;\\n    }\\n    float z = floor(a / TWO_PI);\\n    float r = a - TWO_PI * z;\\n\\n    float t;\\n    float q = floor(r / PI_2 + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return 0.0 / 0.0;\\n    }\\n\\n    t = r - PI_2 * q;\\n\\n    q = floor(t / PI_16 + 0.5);\\n    int k = int(q);\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return 0.0 / 0.0;\\n    } else {\\n        t = t - PI_16 * q;\\n    }\\n\\n    float u = 0.0;\\n    float v = 0.0;\\n\\n    float sin_t, cos_t;\\n    float s, c;\\n    sincos_taylor_fp32(t, sin_t, cos_t);\\n\\n    if (k == 0) {\\n        s = sin_t;\\n        c = cos_t;\\n    } else {\\n        if (abs(float(abs_k) - 1.0) < 0.5) {\\n            u = COS_TABLE_0;\\n            v = SIN_TABLE_0;\\n        } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n            u = COS_TABLE_1;\\n            v = SIN_TABLE_1;\\n        } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n            u = COS_TABLE_2;\\n            v = SIN_TABLE_2;\\n        } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n            u = COS_TABLE_3;\\n            v = SIN_TABLE_3;\\n        }\\n        if (k > 0) {\\n            s = u * sin_t + v * cos_t;\\n            c = u * cos_t - v * sin_t;\\n        } else {\\n            s = u * sin_t - v * cos_t;\\n            c = u * cos_t + v * sin_t;\\n        }\\n    }\\n\\n    if (j == 0) {\\n        sin_a = s;\\n        cos_a = c;\\n    } else if (j == 1) {\\n        sin_a = c;\\n        cos_a = -s;\\n    } else if (j == -1) {\\n        sin_a = -c;\\n        cos_a = s;\\n    } else {\\n        sin_a = -s;\\n        cos_a = -c;\\n    }\\n    return sin_a / cos_a;\\n}\\n#endif\\n\\nfloat tan_fp32(float a) {\\n#ifdef LUMA_FP32_TAN_PRECISION_WORKAROUND\\n  return tan_taylor_fp32(a);\\n#else\\n  return tan(a);\\n#endif\\n}\\n\";\nvar _default = {\n  name: 'fp32',\n  vs: fp32shader,\n  fs: null\n};\nexports.default = _default;\n},{}],\"cDh0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fp64ify = fp64ify;\nexports.fp64LowPart = fp64LowPart;\nexports.fp64ifyMatrix4 = fp64ifyMatrix4;\n\n/**\n * Calculate WebGL 64 bit float\n * @param a {number} - the input float number\n * @param out {array, optional} - the output array. If not supplied, a new array is created.\n * @param startIndex {integer, optional} - the index in the output array to fill from. Default 0.\n * @returns {array} - the fp64 representation of the input number\n */\nfunction fp64ify(a) {\n  var out = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  var hiPart = Math.fround(a);\n  var loPart = a - hiPart;\n  out[startIndex] = hiPart;\n  out[startIndex + 1] = loPart;\n  return out;\n}\n/**\n * Calculate the low part of a WebGL 64 bit float\n * @param a {number} - the input float number\n * @returns {number} - the lower 32 bit of the number\n */\n\n\nfunction fp64LowPart(a) {\n  return a - Math.fround(a);\n}\n/**\n * Calculate WebGL 64 bit matrix (transposed \"Float64Array\")\n * @param matrix {Matrix4} - the input matrix\n * @returns {array} - the fp64 representation of the input matrix\n */\n\n\nfunction fp64ifyMatrix4(matrix) {\n  // Transpose the projection matrix to column major for GLSL.\n  var matrixFP64 = new Float32Array(32);\n\n  for (var i = 0; i < 4; ++i) {\n    for (var j = 0; j < 4; ++j) {\n      var index = i * 4 + j;\n      fp64ify(matrix[j * 4 + i], matrixFP64, index * 2);\n    }\n  }\n\n  return matrixFP64;\n}\n},{}],\"fCH6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"uniform float ONE;\\nvec2 split(float a) {\\n  const float SPLIT = 4097.0;\\n  float t = a * SPLIT;\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float a_hi = t * ONE - (t - a);\\n  float a_lo = a * ONE - a_hi;\\n#else\\n  float a_hi = t - (t - a);\\n  float a_lo = a - a_hi;\\n#endif\\n  return vec2(a_hi, a_lo);\\n}\\nvec2 split2(vec2 a) {\\n  vec2 b = split(a.x);\\n  b.y += a.y;\\n  return b;\\n}\\nvec2 quickTwoSum(float a, float b) {\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float sum = (a + b) * ONE;\\n  float err = b - (sum - a) * ONE;\\n#else\\n  float sum = a + b;\\n  float err = b - (sum - a);\\n#endif\\n  return vec2(sum, err);\\n}\\nvec2 twoSum(float a, float b) {\\n  float s = (a + b);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float v = (s * ONE - a) * ONE;\\n  float err = (a - (s - v) * ONE) * ONE * ONE * ONE + (b - v);\\n#else\\n  float v = s - a;\\n  float err = (a - (s - v)) + (b - v);\\n#endif\\n  return vec2(s, err);\\n}\\n\\nvec2 twoSub(float a, float b) {\\n  float s = (a - b);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float v = (s * ONE - a) * ONE;\\n  float err = (a - (s - v) * ONE) * ONE * ONE * ONE - (b + v);\\n#else\\n  float v = s - a;\\n  float err = (a - (s - v)) - (b + v);\\n#endif\\n  return vec2(s, err);\\n}\\n\\nvec2 twoSqr(float a) {\\n  float prod = a * a;\\n  vec2 a_fp64 = split(a);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float err = ((a_fp64.x * a_fp64.x - prod) * ONE + 2.0 * a_fp64.x *\\n    a_fp64.y * ONE * ONE) + a_fp64.y * a_fp64.y * ONE * ONE * ONE;\\n#else\\n  float err = ((a_fp64.x * a_fp64.x - prod) + 2.0 * a_fp64.x * a_fp64.y) + a_fp64.y * a_fp64.y;\\n#endif\\n  return vec2(prod, err);\\n}\\n\\nvec2 twoProd(float a, float b) {\\n  float prod = a * b;\\n  vec2 a_fp64 = split(a);\\n  vec2 b_fp64 = split(b);\\n  float err = ((a_fp64.x * b_fp64.x - prod) + a_fp64.x * b_fp64.y +\\n    a_fp64.y * b_fp64.x) + a_fp64.y * b_fp64.y;\\n  return vec2(prod, err);\\n}\\n\\nvec2 sum_fp64(vec2 a, vec2 b) {\\n  vec2 s, t;\\n  s = twoSum(a.x, b.x);\\n  t = twoSum(a.y, b.y);\\n  s.y += t.x;\\n  s = quickTwoSum(s.x, s.y);\\n  s.y += t.y;\\n  s = quickTwoSum(s.x, s.y);\\n  return s;\\n}\\n\\nvec2 sub_fp64(vec2 a, vec2 b) {\\n  vec2 s, t;\\n  s = twoSub(a.x, b.x);\\n  t = twoSub(a.y, b.y);\\n  s.y += t.x;\\n  s = quickTwoSum(s.x, s.y);\\n  s.y += t.y;\\n  s = quickTwoSum(s.x, s.y);\\n  return s;\\n}\\n\\nvec2 mul_fp64(vec2 a, vec2 b) {\\n  vec2 prod = twoProd(a.x, b.x);\\n  prod.y += a.x * b.y;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  prod = split2(prod);\\n#endif\\n  prod = quickTwoSum(prod.x, prod.y);\\n  prod.y += a.y * b.x;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  prod = split2(prod);\\n#endif\\n  prod = quickTwoSum(prod.x, prod.y);\\n  return prod;\\n}\\n\\nvec2 div_fp64(vec2 a, vec2 b) {\\n  float xn = 1.0 / b.x;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  vec2 yn = mul_fp64(a, vec2(xn, 0));\\n#else\\n  vec2 yn = a * xn;\\n#endif\\n  float diff = (sub_fp64(a, mul_fp64(b, yn))).x;\\n  vec2 prod = twoProd(xn, diff);\\n  return sum_fp64(yn, prod);\\n}\\n\\nvec2 sqrt_fp64(vec2 a) {\\n  if (a.x == 0.0 && a.y == 0.0) return vec2(0.0, 0.0);\\n  if (a.x < 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);\\n\\n  float x = 1.0 / sqrt(a.x);\\n  float yn = a.x * x;\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  vec2 yn_sqr = twoSqr(yn) * ONE;\\n#else\\n  vec2 yn_sqr = twoSqr(yn);\\n#endif\\n  float diff = sub_fp64(a, yn_sqr).x;\\n  vec2 prod = twoProd(x * 0.5, diff);\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  return sum_fp64(split(yn), prod);\\n#else\\n  return sum_fp64(vec2(yn, 0.0), prod);\\n#endif\\n}\\n\";\nexports.default = _default;\n},{}],\"AVzP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);\\nconst vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);\\nconst vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);\\nconst vec2 TWO_PI_FP64 = vec2(6.2831854820251465, -1.7484556025237907e-7);\\nconst vec2 PI_2_FP64 = vec2(1.5707963705062866, -4.371139006309477e-8);\\nconst vec2 PI_4_FP64 = vec2(0.7853981852531433, -2.1855695031547384e-8);\\nconst vec2 PI_16_FP64 = vec2(0.19634954631328583, -5.463923757886846e-9);\\nconst vec2 PI_16_2_FP64 = vec2(0.39269909262657166, -1.0927847515773692e-8);\\nconst vec2 PI_16_3_FP64 = vec2(0.5890486240386963, -1.4906100798128818e-9);\\nconst vec2 PI_180_FP64 = vec2(0.01745329238474369, 1.3519960498364902e-10);\\n\\nconst vec2 SIN_TABLE_0_FP64 = vec2(0.19509032368659973, -1.6704714833615242e-9);\\nconst vec2 SIN_TABLE_1_FP64 = vec2(0.3826834261417389, 6.22335089017767e-9);\\nconst vec2 SIN_TABLE_2_FP64 = vec2(0.5555702447891235, -1.1769521357507529e-8);\\nconst vec2 SIN_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617041793133e-8);\\n\\nconst vec2 COS_TABLE_0_FP64 = vec2(0.9807852506637573, 2.9739473106360492e-8);\\nconst vec2 COS_TABLE_1_FP64 = vec2(0.9238795042037964, 2.8307490351764386e-8);\\nconst vec2 COS_TABLE_2_FP64 = vec2(0.8314695954322815, 1.6870263741530778e-8);\\nconst vec2 COS_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617152815436e-8);\\n\\nconst vec2 INVERSE_FACTORIAL_3_FP64 = vec2(1.666666716337204e-01, -4.967053879312289e-09);\\nconst vec2 INVERSE_FACTORIAL_4_FP64 = vec2(4.16666679084301e-02, -1.2417634698280722e-09);\\nconst vec2 INVERSE_FACTORIAL_5_FP64 = vec2(8.333333767950535e-03, -4.34617203337595e-10);\\nconst vec2 INVERSE_FACTORIAL_6_FP64 = vec2(1.3888889225199819e-03, -3.3631094437103215e-11);\\nconst vec2 INVERSE_FACTORIAL_7_FP64 = vec2(1.9841270113829523e-04,  -2.725596874933456e-12);\\nconst vec2 INVERSE_FACTORIAL_8_FP64 = vec2(2.4801587642286904e-05, -3.406996025904184e-13);\\nconst vec2 INVERSE_FACTORIAL_9_FP64 = vec2(2.75573188446287533e-06, 3.7935713937038186e-14);\\nconst vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15);\\n\\nfloat nint(float d) {\\n    if (d == floor(d)) return d;\\n    return floor(d + 0.5);\\n}\\n\\nvec2 nint_fp64(vec2 a) {\\n    float hi = nint(a.x);\\n    float lo;\\n    vec2 tmp;\\n    if (hi == a.x) {\\n        lo = nint(a.y);\\n        tmp = quickTwoSum(hi, lo);\\n    } else {\\n        lo = 0.0;\\n        if (abs(hi - a.x) == 0.5 && a.y < 0.0) {\\n            hi -= 1.0;\\n        }\\n        tmp = vec2(hi, lo);\\n    }\\n    return tmp;\\n}\\n\\nvec2 exp_fp64(vec2 a) {\\n\\n  const int k_power = 4;\\n  const float k = 16.0;\\n\\n  const float inv_k = 1.0 / k;\\n\\n  if (a.x <= -88.0) return vec2(0.0, 0.0);\\n  if (a.x >= 88.0) return vec2(1.0 / 0.0, 1.0 / 0.0);\\n  if (a.x == 0.0 && a.y == 0.0) return vec2(1.0, 0.0);\\n  if (a.x == 1.0 && a.y == 0.0) return E_FP64;\\n\\n  float m = floor(a.x / LOG2_FP64.x + 0.5);\\n  vec2 r = sub_fp64(a, mul_fp64(LOG2_FP64, vec2(m, 0.0))) * inv_k;\\n  vec2 s, t, p;\\n\\n  p = mul_fp64(r, r);\\n  s = sum_fp64(r, p * 0.5);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_3_FP64);\\n\\n  s = sum_fp64(s, t);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_4_FP64);\\n\\n  s = sum_fp64(s, t);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);\\n\\n\\n\\n\\n\\n\\n  s = sum_fp64(s, t);\\n  for (int i = 0; i < k_power; i++) {\\n    s = sum_fp64(s * 2.0, mul_fp64(s, s));\\n  }\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n  s = sum_fp64(s, vec2(ONE, 0.0));\\n#else\\n  s = sum_fp64(s, vec2(1.0, 0.0));\\n#endif\\n\\n  return s * pow(2.0, m);\\n}\\n\\nvec2 log_fp64(vec2 a)\\n{\\n  if (a.x == 1.0 && a.y == 0.0) return vec2(0.0, 0.0);\\n  if (a.x <= 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);\\n  vec2 x = vec2(log(a.x), 0.0);\\n  vec2 s;\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n  s = vec2(ONE, 0.0);\\n#else\\n  s = vec2(1.0, 0.0);\\n#endif\\n\\n  x = sub_fp64(sum_fp64(x, mul_fp64(a, exp_fp64(-x))), s);\\n  return x;\\n}\\n\\nvec2 sin_taylor_fp64(vec2 a) {\\n  vec2 r, s, t, x;\\n\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    return vec2(0.0, 0.0);\\n  }\\n\\n  x = -mul_fp64(a, a);\\n  s = a;\\n  r = a;\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_3_FP64);\\n  s = sum_fp64(s, t);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);\\n  s = sum_fp64(s, t);\\n\\n\\n\\n\\n\\n\\n  return s;\\n}\\n\\nvec2 cos_taylor_fp64(vec2 a) {\\n  vec2 r, s, t, x;\\n\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    return vec2(1.0, 0.0);\\n  }\\n\\n  x = -mul_fp64(a, a);\\n  r = x;\\n  s = sum_fp64(vec2(1.0, 0.0), r * 0.5);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_4_FP64);\\n  s = sum_fp64(s, t);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);\\n  s = sum_fp64(s, t);\\n\\n\\n\\n\\n\\n\\n  return s;\\n}\\n\\nvoid sincos_taylor_fp64(vec2 a, out vec2 sin_t, out vec2 cos_t) {\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    sin_t = vec2(0.0, 0.0);\\n    cos_t = vec2(1.0, 0.0);\\n  }\\n\\n  sin_t = sin_taylor_fp64(a);\\n  cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));\\n}\\n\\nvec2 sin_fp64(vec2 a) {\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(0.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n\\n    if (k == 0) {\\n        if (j == 0) {\\n            return sin_taylor_fp64(t);\\n        } else if (j == 1) {\\n            return cos_taylor_fp64(t);\\n        } else if (j == -1) {\\n            return -cos_taylor_fp64(t);\\n        } else {\\n            return -sin_taylor_fp64(t);\\n        }\\n    }\\n\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n    if (abs(float(abs_k) - 1.0) < 0.5) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#else\\n    if (abs_k == 1) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs_k == 2) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs_k == 3) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs_k == 4) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#endif\\n\\n    vec2 sin_t, cos_t;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n\\n\\n    vec2 result = vec2(0.0, 0.0);\\n    if (j == 0) {\\n        if (k > 0) {\\n            result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        }\\n    } else if (j == 1) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    } else if (j == -1) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        } else {\\n            result = -sum_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        }\\n    } else {\\n        if (k > 0) {\\n            result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));\\n        }\\n    }\\n\\n    return result;\\n}\\n\\nvec2 cos_fp64(vec2 a) {\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(1.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n\\n    if (k == 0) {\\n        if (j == 0) {\\n            return cos_taylor_fp64(t);\\n        } else if (j == 1) {\\n            return -sin_taylor_fp64(t);\\n        } else if (j == -1) {\\n            return sin_taylor_fp64(t);\\n        } else {\\n            return -cos_taylor_fp64(t);\\n        }\\n    }\\n\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n    if (abs(float(abs_k) - 1.0) < 0.5) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#else\\n    if (abs_k == 1) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs_k == 2) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs_k == 3) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs_k == 4) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#endif\\n\\n    vec2 sin_t, cos_t;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n    vec2 result = vec2(0.0, 0.0);\\n    if (j == 0) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    } else if (j == 1) {\\n        if (k > 0) {\\n            result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));\\n        }\\n    } else if (j == -1) {\\n        if (k > 0) {\\n            result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        }\\n    } else {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        } else {\\n            result = -sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    }\\n\\n    return result;\\n}\\n\\nvec2 tan_fp64(vec2 a) {\\n    vec2 sin_a;\\n    vec2 cos_a;\\n\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(0.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n    vec2 sin_t, cos_t;\\n    vec2 s, c;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n    if (k == 0) {\\n        s = sin_t;\\n        c = cos_t;\\n    } else {\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n        if (abs(float(abs_k) - 1.0) < 0.5) {\\n            u = COS_TABLE_0_FP64;\\n            v = SIN_TABLE_0_FP64;\\n        } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n            u = COS_TABLE_1_FP64;\\n            v = SIN_TABLE_1_FP64;\\n        } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n            u = COS_TABLE_2_FP64;\\n            v = SIN_TABLE_2_FP64;\\n        } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n            u = COS_TABLE_3_FP64;\\n            v = SIN_TABLE_3_FP64;\\n        }\\n#else\\n        if (abs_k == 1) {\\n            u = COS_TABLE_0_FP64;\\n            v = SIN_TABLE_0_FP64;\\n        } else if (abs_k == 2) {\\n            u = COS_TABLE_1_FP64;\\n            v = SIN_TABLE_1_FP64;\\n        } else if (abs_k == 3) {\\n            u = COS_TABLE_2_FP64;\\n            v = SIN_TABLE_2_FP64;\\n        } else if (abs_k == 4) {\\n            u = COS_TABLE_3_FP64;\\n            v = SIN_TABLE_3_FP64;\\n        }\\n#endif\\n        if (k > 0) {\\n            s = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n            c = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            s = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n            c = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    }\\n\\n    if (j == 0) {\\n        sin_a = s;\\n        cos_a = c;\\n    } else if (j == 1) {\\n        sin_a = c;\\n        cos_a = -s;\\n    } else if (j == -1) {\\n        sin_a = -c;\\n        cos_a = s;\\n    } else {\\n        sin_a = -s;\\n        cos_a = -c;\\n    }\\n    return div_fp64(sin_a, cos_a);\\n}\\n\\nvec2 radians_fp64(vec2 degree) {\\n  return mul_fp64(degree, PI_180_FP64);\\n}\\n\\nvec2 mix_fp64(vec2 a, vec2 b, float x) {\\n  vec2 range = sub_fp64(b, a);\\n  return sum_fp64(a, mul_fp64(range, vec2(x, 0.0)));\\n}\\n\\nvoid vec2_sum_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = sum_fp64(a[0], b[0]);\\n    out_val[1] = sum_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_sub_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = sub_fp64(a[0], b[0]);\\n    out_val[1] = sub_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_mul_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = mul_fp64(a[0], b[0]);\\n    out_val[1] = mul_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_div_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = div_fp64(a[0], b[0]);\\n    out_val[1] = div_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_mix_fp64(vec2 x[2], vec2 y[2], float a, out vec2 out_val[2]) {\\n  vec2 range[2];\\n  vec2_sub_fp64(y, x, range);\\n  vec2 portion[2];\\n  portion[0] = range[0] * a;\\n  portion[1] = range[1] * a;\\n  vec2_sum_fp64(x, portion, out_val);\\n}\\n\\nvec2 vec2_length_fp64(vec2 x[2]) {\\n  return sqrt_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])));\\n}\\n\\nvoid vec2_normalize_fp64(vec2 x[2], out vec2 out_val[2]) {\\n  vec2 length = vec2_length_fp64(x);\\n  vec2 length_vec2[2];\\n  length_vec2[0] = length;\\n  length_vec2[1] = length;\\n\\n  vec2_div_fp64(x, length_vec2, out_val);\\n}\\n\\nvec2 vec2_distance_fp64(vec2 x[2], vec2 y[2]) {\\n  vec2 diff[2];\\n  vec2_sub_fp64(x, y, diff);\\n  return vec2_length_fp64(diff);\\n}\\n\\nvec2 vec2_dot_fp64(vec2 a[2], vec2 b[2]) {\\n  vec2 v[2];\\n\\n  v[0] = mul_fp64(a[0], b[0]);\\n  v[1] = mul_fp64(a[1], b[1]);\\n\\n  return sum_fp64(v[0], v[1]);\\n}\\nvoid vec3_sub_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {\\n  for (int i = 0; i < 3; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvoid vec3_sum_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {\\n  for (int i = 0; i < 3; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvec2 vec3_length_fp64(vec2 x[3]) {\\n  return sqrt_fp64(sum_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])),\\n    mul_fp64(x[2], x[2])));\\n}\\n\\nvec2 vec3_distance_fp64(vec2 x[3], vec2 y[3]) {\\n  vec2 diff[3];\\n  vec3_sub_fp64(x, y, diff);\\n  return vec3_length_fp64(diff);\\n}\\nvoid vec4_fp64(vec4 a, out vec2 out_val[4]) {\\n  out_val[0].x = a[0];\\n  out_val[0].y = 0.0;\\n\\n  out_val[1].x = a[1];\\n  out_val[1].y = 0.0;\\n\\n  out_val[2].x = a[2];\\n  out_val[2].y = 0.0;\\n\\n  out_val[3].x = a[3];\\n  out_val[3].y = 0.0;\\n}\\n\\nvoid vec4_scalar_mul_fp64(vec2 a[4], vec2 b, out vec2 out_val[4]) {\\n  out_val[0] = mul_fp64(a[0], b);\\n  out_val[1] = mul_fp64(a[1], b);\\n  out_val[2] = mul_fp64(a[2], b);\\n  out_val[3] = mul_fp64(a[3], b);\\n}\\n\\nvoid vec4_sum_fp64(vec2 a[4], vec2 b[4], out vec2 out_val[4]) {\\n  for (int i = 0; i < 4; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvoid vec4_dot_fp64(vec2 a[4], vec2 b[4], out vec2 out_val) {\\n  vec2 v[4];\\n\\n  v[0] = mul_fp64(a[0], b[0]);\\n  v[1] = mul_fp64(a[1], b[1]);\\n  v[2] = mul_fp64(a[2], b[2]);\\n  v[3] = mul_fp64(a[3], b[3]);\\n\\n  out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));\\n}\\n\\nvoid mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {\\n  vec2 tmp[4];\\n\\n  for (int i = 0; i < 4; i++)\\n  {\\n    for (int j = 0; j < 4; j++)\\n    {\\n      tmp[j] = b[j + i * 4];\\n    }\\n    vec4_dot_fp64(a, tmp, out_val[i]);\\n  }\\n}\\n\";\nexports.default = _default;\n},{}],\"YiWl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"fp64ify\", {\n  enumerable: true,\n  get: function () {\n    return _fp64Utils.fp64ify;\n  }\n});\nObject.defineProperty(exports, \"fp64LowPart\", {\n  enumerable: true,\n  get: function () {\n    return _fp64Utils.fp64LowPart;\n  }\n});\nObject.defineProperty(exports, \"fp64ifyMatrix4\", {\n  enumerable: true,\n  get: function () {\n    return _fp64Utils.fp64ifyMatrix4;\n  }\n});\nexports.fp64fs = exports.fp64arithmetic = exports.default = void 0;\n\nvar _fp64Utils = require(\"./fp64-utils\");\n\nvar _fp64Arithmetic = _interopRequireDefault(require(\"./fp64-arithmetic.glsl\"));\n\nvar _fp64Functions = _interopRequireDefault(require(\"./fp64-functions.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar fp64shader = \"\".concat(_fp64Arithmetic.default, \"\\n\").concat(_fp64Functions.default);\nvar CONST_UNIFORMS = {\n  // Used in LUMA_FP64_CODE_ELIMINATION_WORKAROUND\n  ONE: 1.0\n};\n\nfunction getUniforms() {\n  return Object.assign({}, CONST_UNIFORMS);\n}\n\nvar _default = {\n  name: 'fp64',\n  vs: fp64shader,\n  fs: null,\n  fp64ify: _fp64Utils.fp64ify,\n  fp64LowPart: _fp64Utils.fp64LowPart,\n  fp64ifyMatrix4: _fp64Utils.fp64ifyMatrix4,\n  getUniforms: getUniforms\n}; // Arithmetic only\n\nexports.default = _default;\nvar fp64arithmetic = {\n  name: 'fp64-arithmetic',\n  vs: \"\".concat(_fp64Arithmetic.default),\n  fs: null\n}; // Fragment shader fp64\n\nexports.fp64arithmetic = fp64arithmetic;\nvar fp64fs = {\n  name: 'fp64-fs',\n  vs: null,\n  fs: fp64shader\n};\nexports.fp64fs = fp64fs;\n},{\"./fp64-utils\":\"cDh0\",\"./fp64-arithmetic.glsl\":\"fCH6\",\"./fp64-functions.glsl\":\"AVzP\"}],\"NP0n\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _math = require(\"math.gl\");\n\nvar IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\nvar DEFAULT_MODULE_OPTIONS = {\n  modelMatrix: IDENTITY_MATRIX,\n  viewMatrix: IDENTITY_MATRIX,\n  projectionMatrix: IDENTITY_MATRIX,\n  cameraPositionWorld: [0, 0, 0]\n};\n\nfunction getUniforms() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n  var prevUniforms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // const viewProjectionInverse = viewProjection.invert();\n  // viewInverseMatrix: view.invert(),\n  // viewProjectionInverseMatrix: viewProjectionInverse\n\n  var uniforms = {};\n\n  if (opts.modelMatrix !== undefined) {\n    uniforms.modelMatrix = opts.modelMatrix;\n  }\n\n  if (opts.viewMatrix !== undefined) {\n    uniforms.viewMatrix = opts.viewMatrix;\n  }\n\n  if (opts.projectionMatrix !== undefined) {\n    uniforms.projectionMatrix = opts.projectionMatrix;\n  }\n\n  if (opts.cameraPositionWorld !== undefined) {\n    uniforms.cameraPositionWorld = opts.cameraPositionWorld;\n  } // COMPOSITE UNIFORMS\n\n\n  if (opts.projectionMatrix !== undefined || opts.viewMatrix !== undefined) {\n    uniforms.viewProjectionMatrix = new _math.Matrix4(opts.projectionMatrix).multiplyRight(opts.viewMatrix);\n  }\n\n  return uniforms;\n}\n\nvar common = \"varying vec4 project_vPositionWorld;\\nvarying vec3 project_vNormalWorld;\\n\\nvec4 project_getPosition_World() {\\n  return project_vPositionWorld;\\n}\\n\\nvec3 project_getNormal_World() {\\n  return project_vNormalWorld;\\n}\\n\";\nvar vs = \"\".concat(common, \"\\nuniform mat4 modelMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewProjectionMatrix;\\nuniform vec3 cameraPositionWorld;\\n\\nstruct World {\\n  vec3 position;\\n  vec3 normal;\\n};\\n\\nWorld world;\\n\\nvoid project_setPosition(vec4 position) {\\n  project_vPositionWorld = position;\\n}\\n\\nvoid project_setNormal(vec3 normal) {\\n  project_vNormalWorld = normal;\\n}\\n\\nvoid project_setPositionAndNormal_World(vec3 position, vec3 normal) {\\n  world.position = position;\\n  world.normal = normal;\\n}\\n\\nvoid project_setPositionAndNormal_Model(vec3 position, vec3 normal) {\\n  world.position = (modelMatrix * vec4(position, 1.)).xyz;\\n  world.normal = mat3(modelMatrix) * normal;\\n}\\n\\nvec4 project_model_to_clipspace(vec4 position) {\\n  return viewProjectionMatrix * modelMatrix * position;\\n}\\n\\nvec4 project_model_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * modelMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_world_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_view_to_clipspace(vec3 position) {\\n  return projectionMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * vec4(position, 1.);\\n}\\n\");\nvar fs = \"\\n\".concat(common);\nvar _default = {\n  name: 'project',\n  getUniforms: getUniforms,\n  vs: vs,\n  fs: fs\n};\nexports.default = _default;\n},{\"math.gl\":\"o5CE\"}],\"VJ2O\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = \"\\n\";\nexports.default = _default;\n},{}],\"vSv5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = \"#define LIGHT_MAX 4\\n\\nuniform bool lighting_uEnableLights;\\nuniform vec3 lighting_uAmbientColor;\\nuniform vec3 lighting_uDirection;\\nuniform vec3 lighting_uDirectionalColor;\\nuniform int  lighting_uPointCount;\\nuniform vec3 lighting_uPointLocation[LIGHT_MAX];\\nuniform vec3 lighting_uPointColor[LIGHT_MAX];\\nuniform bool lighting_uEnableReflections;\\nvarying vec4 lighting_vPosition;\\nvarying vec4 lighting_vNormal;\\nvarying vec3 lighting_vColor;\\nvarying vec3 lighting_vLightWeighting;\\nvarying vec3 lighting_vReflection;\\n\\nvoid lighting_setPositionAndNormal(vec3 position, vec3 normal) {\\n  lighting_vPosition = worldMatrix * vec4(position, 1.);\\n  lighting_vNormal = worldInverseTransposeMatrix * vec4(normal, 1.);;\\n}\\n\\nvoid lighting__getLightWeigting() {\\n  float directionalLightWeighting = max(dot(lighting_vNormal.xyz, lighting_uDirection), 0.);\\n  vec3 pointWeight = vec3(0., 0., 0.);\\n  for (int i = 0; i < LIGHT_MAX; i++) {\\n    if (i < numberPoints) {\\n      vec4 mvLightPosition = viewMatrix * vec4(lighting_uPointLocation[i], 1.);\\n      vec3 pointLightDirection = normalize(mvLightPosition.xyz - lighting_vPosition.xyz);\\n      pointWeight += max(dot(lighting_vNormal.xyz, pointLightDirection), 0.) * pointColor[i];\\n     } else {\\n       break;\\n     }\\n   }\\n   return ambientColor + (directionalColor * directionalLightWeighting) + pointWeight;\\n}\\n\\nvoid lighting_apply(vec3 position, vec3 normal) {\\n  lighting_setPositionAndNormal(position, normal);\\n  if(!lighting_uEnableLights) {\\n    lighting_vLightWeighting = vec3(1., 1., 1.);\\n  } else {\\n    lighting_vLightWeighting = lighting__getLightWeighting();\\n  }\\n}\\n\\nvoid lighting_set_reflection(vec3 position) {\\n  if (lighting_uEnableReflections) {\\n    lighting_vReflection = (viewInverseMatrix[3] - (worldMatrix * vec4(position, 1.))).xyz;\\n  } else {\\n    lighting_vReflection = vec3(1., 1., 1.);\\n  }\\n}\\n\";\nexports.default = _default;\n},{}],\"PVPS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = \"precision highp float;\\n\\n#define LIGHT_MAX 4\\n\\nvarying vec3 lighting_vLightWeighting;\\n\\nvec4 lighting_apply(vec4 color) {\\n  return vec4(color.rgb * lighting_vLightWeighting, color.a);\\n}\\n\\nuniform mat4 viewMatrix;\\n\\n\\nvarying vec4 lighting_vColor;\\nvarying vec4 lighting_vTransformedNormal;\\nvarying vec4 lighting_vPosition;\\n\\nuniform float shininess;\\nuniform bool enableSpecularMap;\\nuniform bool enableLights;\\n\\nuniform vec3 ambientColor;\\nuniform vec3 directionalColor;\\nuniform vec3 lightingDirection;\\n\\nuniform vec3 lighting_uPointLocation[LIGHT_MAX];\\nuniform vec3 lighting_uPointColor[LIGHT_MAX];\\nuniform float lighting_uPointSpecularEnable[LIGHT_MAX];\\nuniform vec3 lighting_uPointSpecularColor[LIGHT_MAX];\\nuniform int numberPoints;\\n\\n\\nvec3 lighting__calculate_light_weighting() {\\n\\treturn lighting__calculate_light_weighting(shininess);\\n}\\n\\nvec3 lighting__calculate_light_weighting(shininess) {\\n  vec3 normal = vTransformedNormal.xyz;\\n  vec3 eyeDirection = normalize(-vPosition.xyz);\\n\\n  vec3 specularLight = vec3(0., 0., 0.);\\n  vec3 diffuseLight = vec3(0., 0., 0.);\\n\\n  for (int i = 0; i < LIGHT_MAX; i++) {\\n    if (i < numberPoints) {\\n      vec3 transformedPointLocation = (viewMatrix * vec4(lighting_uPointLocation[i], 1.0)).xyz;\\n      vec3 lightDirection = normalize(transformedPointLocation - vPosition.xyz);\\n\\n      if (lighting_uPointSpecularEnable > 0.) {\\n        vec3 reflectionDirection = reflect(-lightDirection, normal);\\n        float specularLightWeighting =\\n          pow(max(dot(reflectionDirection, eyeDirection), 0.0), shininessVal);\\n        specularLight += specularLightWeighting * lighting_uPointSpecularColor[i];\\n      }\\n\\n      float diffuseLightWeighting = max(dot(normal, lightDirection), 0.0);\\n      diffuseLight += diffuseLightWeighting * lighting_uPointColor[i];\\n    } else {\\n      break;\\n    }\\n  }\\n\\n  return ambientColor + diffuseLight + specularLight;\\n}\\n\\nvoid lighting_filterColor(fragmentColor) {\\n  if (!lighting_enable) {\\n  \\treturn fragmentColor;\\n  } else {\\n  \\tvec3 lightWeighting = lighting__calculate_light_weighting();\\n  \\treturn vec4(fragmentColor.rgb * lightWeighting, fragmentColor.a);\\n  }\\n}\\n\\nuniform vec3 material_uAmbientColor;\\nuniform vec3 material_uDiffuseColor;\\nuniform vec3 material_uSpecularColor;\\nuniform vec3 material_uEmissiveColor;\\n\\nuniform bool hasTexture1;\\nuniform sampler2D sampler1;\\n\\nuniform mat4 viewMatrix;\\n\\nvoid apply_lighting(color) {\\n  vec3 ambientLightWeighting = ambientColor;\\n\\n  vec3 normal = vTransformedNormal.xyz;\\n  vec3 eyeDirection = normalize(-vPosition.xyz);\\n\\n  vec3 specularLight = vec3(0.0, 0.0, 0.0);\\n  vec3 diffuseLight = vec3(0.0, 0.0, 0.0);\\n\\n  for (int i = 0; i < LIGHT_MAX; i++) {\\n    if (i < numberPoints) {\\n      vec3 transformedPointLocation = (viewMatrix * vec4(pointLocation[i], 1.0)).xyz;\\n      vec3 lightDirection = normalize(transformedPointLocation - vPosition.xyz);\\n\\n      if (enableSpecularHighlights) {\\n        vec3 reflectionDirection = reflect(-lightDirection, normal);\\n        float specularLightWeighting =\\n          pow(max(dot(reflectionDirection, eyeDirection), 0.0), shininess);\\n        specularLight += specularLightWeighting * pointSpecularColor[i];\\n      }\\n\\n      float diffuseLightWeighting = max(dot(normal, lightDirection), 0.0);\\n      diffuseLight += diffuseLightWeighting * pointColor[i];\\n    } else {\\n        break;\\n    }\\n  }\\n\\n  vec3 matAmbientColor = material_uAmbientColor * color.rgb;\\n  vec3 matDiffuseColor = material_uDiffuseColor * color.rgb;\\n  vec3 matSpecularColor = material_uSpecularColor * color.rgb;\\n  vec3 matEmissiveColor = material_uEmissiveColor * color.rgb;\\n  gl_FragColor = vec4(\\n    matAmbientColor * ambientLightWeighting\\n    + matDiffuseColor * diffuseLightWeighting\\n    + matSpecularColor * specularLightWeighting\\n    + matEmissiveColor,\\n    color.a\\n  );\\n}\\n\\n  vec3 lightWeighting;\\n  if (!enableLights) {\\n    lightWeighting = vec3(1.0, 1.0, 1.0);\\n  } else {\\n    vec3 lightDirection;\\n    float specularLightWeighting = 0.0;\\n    float diffuseLightWeighting = 0.0;\\n    vec3  specularLight = vec3(0.0, 0.0, 0.0);\\n    vec3  diffuseLight = vec3(0.0, 0.0, 0.0);\\n\\n    vec3 transformedPointLocation;\\n    vec3 normal = vTransformedNormal.xyz;\\n\\n    vec3 eyeDirection = normalize(-vPosition.xyz);\\n    vec3 reflectionDirection;\\n\\n    vec3 pointWeight = vec3(0.0, 0.0, 0.0);\\n\\n    for (int i = 0; i < LIGHT_MAX; i++) {\\n      if (i < numberPoints) {\\n        transformedPointLocation = (viewMatrix * vec4(pointLocation[i], 1.0)).xyz;\\n        lightDirection = normalize(transformedPointLocation - vPosition.xyz);\\n\\n        if (enableSpecular[i] > 0.0) {\\n          reflectionDirection = reflect(-lightDirection, normal);\\n          specularLightWeighting = pow(max(dot(reflectionDirection, eyeDirection), 0.0), shininess);\\n          specularLight += specularLightWeighting * pointSpecularColor[i];\\n        }\\n\\n        diffuseLightWeighting = max(dot(normal, lightDirection), 0.0);\\n        diffuseLight += diffuseLightWeighting * pointColor[i];\\n      } else {\\n        break;\\n      }\\n    }\\n\\n    lightWeighting = ambientColor + diffuseLight + specularLight;\\n  }\\nuniform float reflection;\\nuniform float refraction;\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\";\nexports.default = _default;\n},{}],\"fUvV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getUniforms = getUniforms;\nexports.default = exports.config = exports.name = exports.fragmentShader = exports.vertexShader = void 0;\n\nvar _math = require(\"math.gl\");\n\nvar _lightingCommon = _interopRequireDefault(require(\"./lighting-common.glsl\"));\n\nvar _lightingVertex = _interopRequireDefault(require(\"./lighting-vertex.glsl\"));\n\nvar _lightingFragment = _interopRequireDefault(require(\"./lighting-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar vertexShader = \"\".concat(_lightingCommon.default, \"\\n\").concat(_lightingVertex.default, \"\\n\");\nexports.vertexShader = vertexShader;\nvar fragmentShader = \"\".concat(_lightingCommon.default, \"\\n\").concat(_lightingFragment.default, \"\\n\");\nexports.fragmentShader = fragmentShader;\nvar name = 'lighting';\nexports.name = name;\nvar config = {\n  MAX_POINT_LIGHTS: 4\n}; // Setup the lighting system: ambient, directional, point lights.\n\nexports.config = config;\n\nfunction getUniforms(_ref) {\n  var _ref$lightingEnable = _ref.lightingEnable,\n      lightingEnable = _ref$lightingEnable === void 0 ? false : _ref$lightingEnable,\n      _ref$lightingAmbientC = _ref.lightingAmbientColor,\n      lightingAmbientColor = _ref$lightingAmbientC === void 0 ? [0.2, 0.2, 0.2] : _ref$lightingAmbientC,\n      _ref$lightingDirectio = _ref.lightingDirection,\n      lightingDirection = _ref$lightingDirectio === void 0 ? [1, 1, 1] : _ref$lightingDirectio,\n      _ref$lightingDirectio2 = _ref.lightingDirectionalColor,\n      lightingDirectionalColor = _ref$lightingDirectio2 === void 0 ? [0, 0, 0] : _ref$lightingDirectio2,\n      _ref$lightingPointLig = _ref.lightingPointLights,\n      lightingPointLights = _ref$lightingPointLig === void 0 ? [] : _ref$lightingPointLig; // Set light uniforms. Ambient, directional and point lights.\n\n  return Object.assign({\n    lightingEnable: lightingEnable,\n    // Ambient\n    lightingAmbientColor: lightingAmbientColor\n  }, getDirectionalUniforms(lightingDirection), getPointUniforms(lightingPointLights));\n}\n\nfunction getDirectionalUniforms(_ref2) {\n  var color = _ref2.color,\n      direction = _ref2.direction; // Normalize lighting direction vector\n\n  var dir = new _math.Vector3(direction.x, direction.y, direction.z).normalize().scale(-1, -1, -1);\n  return {\n    directionalColor: [color.r, color.g, color.b],\n    lightingDirection: [dir.x, dir.y, dir.z]\n  };\n}\n\nfunction getPointUniforms(points) {\n  points = points instanceof Array ? points : [points];\n  var numberPoints = points.length;\n  var pointLocations = [];\n  var pointColors = [];\n  var enableSpecular = [];\n  var pointSpecularColors = [];\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = points[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var point = _step.value;\n      var position = point.position,\n          color = point.color,\n          diffuse = point.diffuse,\n          specular = point.specular;\n      var pointColor = color || diffuse;\n      pointLocations.push(position.x, position.y, position.z);\n      pointColors.push(pointColor.r, pointColor.g, pointColor.b); // Add specular color\n\n      enableSpecular.push(Number(Boolean(specular)));\n\n      if (specular) {\n        pointSpecularColors.push(specular.r, specular.g, specular.b);\n      } else {\n        pointSpecularColors.push(0, 0, 0);\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  return {\n    numberPoints: numberPoints,\n    pointLocation: pointLocations,\n    pointColor: pointColors,\n    enableSpecular: enableSpecular,\n    pointSpecularColor: pointSpecularColors\n  };\n}\n\nvar _default = {\n  name: name,\n  vs: vertexShader,\n  fs: fragmentShader,\n  getUniforms: getUniforms\n};\nexports.default = _default;\n},{\"math.gl\":\"o5CE\",\"./lighting-common.glsl\":\"VJ2O\",\"./lighting-vertex.glsl\":\"vSv5\",\"./lighting-fragment.glsl\":\"PVPS\"}],\"bOxq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _project = _interopRequireDefault(require(\"../project/project\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Cheap lighting - single directional light, single dot product, one uniform\n\n/* eslint-disable camelcase */\nvar DEFAULT_LIGHT_DIRECTION = new Float32Array([1, 1, 2]);\nvar DEFAULT_MODULE_OPTIONS = {\n  lightDirection: DEFAULT_LIGHT_DIRECTION\n};\n\nfunction getUniforms() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n  var uniforms = {};\n\n  if (opts.lightDirection) {\n    uniforms.dirlight_uLightDirection = opts.lightDirection;\n  }\n\n  return uniforms;\n} // TODO - reuse normal from geometry module\n\n\nvar vs = null;\nvar fs = \"uniform vec3 dirlight_uLightDirection;\\nvec4 dirlight_filterColor(vec4 color) {\\n  vec3 normal = project_getNormal_World();\\n  float d = abs(dot(normalize(normal), normalize(dirlight_uLightDirection)));\\n  return vec4(color.rgb * d, color.a);\\n}\\n\";\nvar _default = {\n  name: 'dirlight',\n  vs: vs,\n  fs: fs,\n  getUniforms: getUniforms,\n  dependencies: [_project.default]\n};\nexports.default = _default;\n},{\"../project/project\":\"NP0n\"}],\"ib9Y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar DEFAULT_HIGHLIGHT_COLOR = new Uint8Array([0, 255, 255, 255]);\nvar DEFAULT_MODULE_OPTIONS = {\n  pickingSelectedColor: null,\n  //  Set to a picking color to visually highlight that item\n  pickingHighlightColor: DEFAULT_HIGHLIGHT_COLOR,\n  // Color of visual highlight of \"selected\" item\n  pickingThreshold: 1.0,\n  pickingActive: false // Set to true when rendering to off-screen \"picking\" buffer\n\n};\n/* eslint-disable camelcase */\n\nfunction getUniforms() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n  var uniforms = {};\n\n  if (opts.pickingSelectedColor !== undefined) {\n    if (opts.pickingSelectedColor === null) {\n      uniforms.picking_uSelectedColorValid = 0;\n    } else {\n      var selectedColor = [opts.pickingSelectedColor[0], opts.pickingSelectedColor[1], opts.pickingSelectedColor[2]];\n      uniforms.picking_uSelectedColorValid = 1;\n      uniforms.picking_uSelectedColor = selectedColor;\n    }\n  }\n\n  if (opts.pickingHighlightColor !== undefined) {\n    uniforms.picking_uHighlightColor = opts.pickingHighlightColor;\n  } // TODO - major hack - decide on normalization and remove\n\n\n  if (opts.pickingThreshold !== undefined) {\n    uniforms.picking_uThreshold = opts.pickingThreshold;\n  }\n\n  if (opts.pickingActive !== undefined) {\n    uniforms.picking_uActive = opts.pickingActive ? 1 : 0;\n  }\n\n  return uniforms;\n}\n\nvar vs = \"uniform vec3 picking_uSelectedColor;\\nuniform float picking_uThreshold;\\nuniform bool picking_uSelectedColorValid;\\n\\nout vec4 picking_vRGBcolor_Aselected;\\n\\nconst float COLOR_SCALE = 1. / 255.;\\n\\nbool isVertexPicked(vec3 vertexColor) {\\n  return\\n    picking_uSelectedColorValid &&\\n    abs(vertexColor.r - picking_uSelectedColor.r) < picking_uThreshold &&\\n    abs(vertexColor.g - picking_uSelectedColor.g) < picking_uThreshold &&\\n    abs(vertexColor.b - picking_uSelectedColor.b) < picking_uThreshold;\\n}\\n\\nvoid picking_setPickingColor(vec3 pickingColor) {\\n  picking_vRGBcolor_Aselected.a =\\n    float(isVertexPicked(pickingColor));\\n  picking_vRGBcolor_Aselected.rgb = pickingColor * COLOR_SCALE;\\n}\\n\";\nvar fs = \"uniform bool picking_uActive;\\nuniform vec3 picking_uSelectedColor;\\nuniform vec4 picking_uHighlightColor;\\n\\nin vec4 picking_vRGBcolor_Aselected;\\n\\nconst float COLOR_SCALE = 1. / 255.;\\nvec4 picking_filterHighlightColor(vec4 color) {\\n  bool selected = bool(picking_vRGBcolor_Aselected.a);\\n\\n  if (selected) {\\n    vec4 highLightColor = picking_uHighlightColor * COLOR_SCALE;\\n\\n    float highLightAlpha = highLightColor.a;\\n    float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\\n    float highLightRatio = highLightAlpha / blendedAlpha;\\n\\n    vec3 blendedRGB = mix(color.rgb, highLightColor.rgb, highLightRatio);\\n    return vec4(blendedRGB, blendedAlpha);\\n  } else {\\n    return color;\\n  }\\n}\\nvec4 picking_filterPickingColor(vec4 color) {\\n  vec3 pickingColor = picking_vRGBcolor_Aselected.rgb;\\n  if (picking_uActive && length(pickingColor) < 0.001) {\\n    discard;\\n  }\\n  return picking_uActive ? vec4(pickingColor, 1.0) : color;\\n}\\nvec4 picking_filterColor(vec4 color) {\\n  vec4 highightColor = picking_filterHighlightColor(color);\\n  return picking_filterPickingColor(highightColor);\\n}\\n\\n\";\nvar _default = {\n  name: 'picking',\n  vs: vs,\n  fs: fs,\n  getUniforms: getUniforms\n};\nexports.default = _default;\n},{}],\"NxmS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Minimal texture (diffuse map) support\n\n/* eslint-disable camelcase */\nvar DEFAULT_MODULE_OPTIONS = {\n  diffuseTexture: null,\n  diffuseColor: [0.5, 0.5, 0.5, 1]\n};\n\nfunction getUniforms() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n  var uniforms = {};\n\n  if (opts.diffuseTexture !== undefined) {\n    uniforms.diffuse_uHasTexture = Boolean(opts.diffuseTexture);\n    uniforms.diffuse_uTexture = opts.diffuseTexture;\n  }\n\n  if (opts.diffuseColor !== undefined) {\n    uniforms.diffuse_uColor = opts.diffuseColor;\n  }\n\n  return uniforms;\n}\n\nvar vs = \"out vec2 diffuse_vTexCoord;\\nvoid diffuse_setTextureCoordinate(vec2 uv) {\\n  diffuse_vTexCoord = uv;\\n}\\n\";\nvar fs = \"uniform vec4 diffuse_uColor;\\nuniform bool diffuse_uHasTexture;\\nuniform sampler2D diffuse_uTexture;\\n\\nin vec2 diffuse_vTexCoord;\\n\\n\\n\\nvec4 diffuse_getColor() {\\n  vec2 texCoord = diffuse_vTexCoord;\\n  return diffuse_uHasTexture ?\\n    texture2D(diffuse_uTexture, vec2(texCoord.s, texCoord.t)) :\\n    diffuse_uColor;\\n}\\n\\nvec4 diffuse_filterColor(vec4 color) {\\n  return diffuse_getColor();\\n}\\n\";\nvar _default = {\n  name: 'diffuse',\n  getUniforms: getUniforms,\n  vs: vs,\n  fs: fs\n};\nexports.default = _default;\n},{}],\"fKAZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getQualifierDetails = getQualifierDetails;\nexports.getPassthroughFS = getPassthroughFS;\nexports.typeToChannelSuffix = typeToChannelSuffix;\nexports.typeToChannelCount = typeToChannelCount;\nexports.convertToVec4 = convertToVec4;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _assert = _interopRequireDefault(require(\"assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar FS100 = 'void main() {}';\nvar FS300 = \"#version 300 es\\n\".concat(FS100); // Prase given glsl line and return qualifier details or null\n\nfunction getQualifierDetails(line, qualifiers) {\n  qualifiers = Array.isArray(qualifiers) ? qualifiers : [qualifiers];\n  var words = line.replace(/^\\s+/, '').split(/\\s+/); // TODO add support for precession qualifiers (highp, mediump and lowp)\n\n  var _words = (0, _slicedToArray2.default)(words, 3),\n      qualifier = _words[0],\n      type = _words[1],\n      definition = _words[2];\n\n  if (!qualifiers.includes(qualifier) || !type || !definition) {\n    return null;\n  }\n\n  var name = definition.split(';')[0];\n  return {\n    qualifier: qualifier,\n    type: type,\n    name: name\n  };\n} // Given the shader version, input and output variable names,\n// builds and return a pass through fragment shader.\n\n\nfunction getPassthroughFS() {\n  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      _ref$version = _ref.version,\n      version = _ref$version === void 0 ? 100 : _ref$version,\n      input = _ref.input,\n      inputType = _ref.inputType,\n      output = _ref.output;\n\n  if (!input) {\n    return version === 300 ? FS300 : FS100;\n  }\n\n  var outputValue = convertToVec4(input, inputType);\n\n  if (version === 300) {\n    return \"#version 300 es\\nin \".concat(inputType, \" \").concat(input, \";\\nout vec4 \").concat(output, \";\\nvoid main() {\\n  \").concat(output, \" = \").concat(outputValue, \";\\n}\");\n  } // version 100\n\n\n  return \"varying \".concat(inputType, \" \").concat(input, \";\\nvoid main() {\\n  gl_FragColor = \").concat(outputValue, \";\\n}\");\n} // convert glsl type to suffix\n\n\nfunction typeToChannelSuffix(type) {\n  switch (type) {\n    case 'float':\n      return 'x';\n\n    case 'vec2':\n      return 'xy';\n\n    case 'vec3':\n      return 'xyz';\n\n    case 'vec4':\n      return 'xyzw';\n\n    default:\n      (0, _assert.default)(false);\n      return null;\n  }\n} // convert glsl type to channel count\n\n\nfunction typeToChannelCount(type) {\n  switch (type) {\n    case 'float':\n      return 1;\n\n    case 'vec2':\n      return 2;\n\n    case 'vec3':\n      return 3;\n\n    case 'vec4':\n      return 4;\n\n    default:\n      (0, _assert.default)(false);\n      return null;\n  }\n} // Returns glsl instruction for converting to vec4\n\n\nfunction convertToVec4(variable, type) {\n  switch (type) {\n    case 'float':\n      return \"vec4(\".concat(variable, \", 0.0, 0.0, 1.0)\");\n\n    case 'vec2':\n      return \"vec4(\".concat(variable, \", 0.0, 1.0)\");\n\n    case 'vec3':\n      return \"vec4(\".concat(variable, \", 1.0)\");\n\n    case 'vec4':\n      return variable;\n\n    default:\n      (0, _assert.default)(false);\n      return null;\n  }\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"assert\":\"azYr\"}],\"mp0U\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Private shader module used by `Transform`\nvar vs = \"attribute float transform_elementID;\\nvec2 transform_getPixelSizeHalf(vec2 size) {\\n  return vec2(1.) / (2. * size);\\n}\\n\\nvec2 transform_getPixelIndices(vec2 texSize, vec2 pixelSizeHalf) {\\n  float yIndex = floor((transform_elementID / texSize[0]) + pixelSizeHalf[1]);\\n  float xIndex = transform_elementID - (yIndex * texSize[0]);\\n  return vec2(xIndex, yIndex);\\n}\\nvec2 transform_getTexCoord(vec2 size) {\\n  vec2 pixelSizeHalf = transform_getPixelSizeHalf(size);\\n  vec2 indices = transform_getPixelIndices(size, pixelSizeHalf);\\n  vec2 coord = indices / size + pixelSizeHalf;\\n  return coord;\\n}\\nvec2 transform_getPos(vec2 size) {\\n  vec2 texCoord = transform_getTexCoord(size);\\n  vec2 pos = (texCoord * (2.0, 2.0)) - (1., 1.);\\n  return pos;\\n}\\nvec4 transform_getInput(sampler2D texSampler, vec2 size) {\\n  vec2 texCoord = transform_getTexCoord(size);\\n  vec4 textureColor = texture2D(texSampler, texCoord);\\n  return textureColor;\\n}\\n\";\nvar _default = {\n  name: 'transform',\n  vs: vs,\n  fs: null\n};\nexports.default = _default;\n},{}],\"H4AH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"assembleShaders\", {\n  enumerable: true,\n  get: function () {\n    return _assembleShaders.assembleShaders;\n  }\n});\nObject.defineProperty(exports, \"registerShaderModules\", {\n  enumerable: true,\n  get: function () {\n    return _resolveModules.registerShaderModules;\n  }\n});\nObject.defineProperty(exports, \"setDefaultShaderModules\", {\n  enumerable: true,\n  get: function () {\n    return _resolveModules.setDefaultShaderModules;\n  }\n});\nObject.defineProperty(exports, \"combineInjects\", {\n  enumerable: true,\n  get: function () {\n    return _injectShader.combineInjects;\n  }\n});\nObject.defineProperty(exports, \"fp32\", {\n  enumerable: true,\n  get: function () {\n    return _fp.default;\n  }\n});\nObject.defineProperty(exports, \"fp64\", {\n  enumerable: true,\n  get: function () {\n    return _fp2.default;\n  }\n});\nObject.defineProperty(exports, \"project\", {\n  enumerable: true,\n  get: function () {\n    return _project.default;\n  }\n});\nObject.defineProperty(exports, \"lighting\", {\n  enumerable: true,\n  get: function () {\n    return _lighting.default;\n  }\n});\nObject.defineProperty(exports, \"dirlight\", {\n  enumerable: true,\n  get: function () {\n    return _dirlight.default;\n  }\n});\nObject.defineProperty(exports, \"picking\", {\n  enumerable: true,\n  get: function () {\n    return _picking.default;\n  }\n});\nObject.defineProperty(exports, \"diffuse\", {\n  enumerable: true,\n  get: function () {\n    return _diffuse.default;\n  }\n});\nObject.defineProperty(exports, \"getQualifierDetails\", {\n  enumerable: true,\n  get: function () {\n    return _shaderUtils.getQualifierDetails;\n  }\n});\nObject.defineProperty(exports, \"getPassthroughFS\", {\n  enumerable: true,\n  get: function () {\n    return _shaderUtils.getPassthroughFS;\n  }\n});\nObject.defineProperty(exports, \"typeToChannelSuffix\", {\n  enumerable: true,\n  get: function () {\n    return _shaderUtils.typeToChannelSuffix;\n  }\n});\nObject.defineProperty(exports, \"typeToChannelCount\", {\n  enumerable: true,\n  get: function () {\n    return _shaderUtils.typeToChannelCount;\n  }\n});\nObject.defineProperty(exports, \"convertToVec4\", {\n  enumerable: true,\n  get: function () {\n    return _shaderUtils.convertToVec4;\n  }\n});\nObject.defineProperty(exports, \"_transform\", {\n  enumerable: true,\n  get: function () {\n    return _transform.default;\n  }\n});\n\nvar _assembleShaders = require(\"./lib/assemble-shaders\");\n\nvar _resolveModules = require(\"./lib/resolve-modules\");\n\nvar _injectShader = require(\"./lib/inject-shader\");\n\nvar _fp = _interopRequireDefault(require(\"./modules/fp32/fp32\"));\n\nvar _fp2 = _interopRequireDefault(require(\"./modules/fp64/fp64\"));\n\nvar _project = _interopRequireDefault(require(\"./modules/project/project\"));\n\nvar _lighting = _interopRequireDefault(require(\"./modules/lighting/lighting\"));\n\nvar _dirlight = _interopRequireDefault(require(\"./modules/dirlight/dirlight\"));\n\nvar _picking = _interopRequireDefault(require(\"./modules/picking/picking\"));\n\nvar _diffuse = _interopRequireDefault(require(\"./modules/diffuse/diffuse\"));\n\nvar _shaderUtils = require(\"./utils/shader-utils\");\n\nvar _transform = _interopRequireDefault(require(\"./modules/transform/transform\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./lib/assemble-shaders\":\"FVsj\",\"./lib/resolve-modules\":\"iN6G\",\"./lib/inject-shader\":\"gZC3\",\"./modules/fp32/fp32\":\"AmUH\",\"./modules/fp64/fp64\":\"YiWl\",\"./modules/project/project\":\"NP0n\",\"./modules/lighting/lighting\":\"fUvV\",\"./modules/dirlight/dirlight\":\"bOxq\",\"./modules/picking/picking\":\"ib9Y\",\"./modules/diffuse/diffuse\":\"NxmS\",\"./utils/shader-utils\":\"fKAZ\",\"./modules/transform/transform\":\"mp0U\"}],\"a0ak\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nvar isBrowser = typeof window !== 'undefined' && window.addEventListener;\n\nvar timers = new Map();\n\n/**\n * Ready check for Seer initialization\n *\n * @returns {Boolean}\n */\nvar isReady = function isReady() {\n  return isBrowser && window.__SEER_INITIALIZED__;\n};\n\n/**\n * Utility method allowing to throttle a user action based on a key and a minimun delay.\n *\n * @param key {String} A unique key\n * @param delay {Number} The minimal delay to throttle\n * @returns {Boolean}\n */\nvar throttle = function throttle(key, delay) {\n  var time = timers.get(key);\n  var now = Date.now();\n  if (time && now - time < delay) {\n    return true;\n  }\n  timers.set(key, now);\n  return false;\n};\n\nvar replacer = function replacer(seen) {\n  return function (key, value) {\n    if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && seen.has(value)) {\n      return;\n    }\n    seen.add(value);\n    var isArray = Object.prototype.toString.call(value).slice(8, -1).includes('Array');\n    if (isArray) {\n      return Array.prototype.slice.call(value, 0, 20);\n    }\n    return value;\n  };\n};\n\n/**\n * Low-level api leveraging window.postMessage\n *\n * @param type {String} The action type\n * @param payload {Any} The action payload\n */\nvar send = function send(type) {\n  var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (!isBrowser || !isReady()) {\n    return;\n  }\n\n  var seen = new Set();\n  var payload = JSON.stringify(data, replacer(seen));\n\n  try {\n    window.postMessage({ type: type, payload: payload, source: 'seer-agent' }, '*');\n  } catch (e) {\n    if (throttle('seer-log', 2E3)) {\n      return;\n    }\n    console.log(e); // eslint-disable-line\n  }\n};\n\nvar listeners = new Map();\n\nvar listener = function listener(message) {\n  if (!message || !message.data || message.data.source !== 'seer-core') {\n    return;\n  }\n  var _message$data = message.data,\n      type = _message$data.type,\n      payload = _message$data.payload;\n\n\n  var typeListeners = listeners.get(type);\n  if (typeListeners) {\n    typeListeners.forEach(function (cb) {\n      return cb(payload);\n    });\n  }\n};\n\n/**\n * Initilize window listener. There will be only one for the whole process\n * to prevent too many registrations.\n *\n * This method will be called automatically if you use the `listenFor` method.\n */\nvar init = function init() {\n  if (!isBrowser || window.__SEER_LISTENER__) {\n    return;\n  }\n  window.addEventListener('message', listener);\n  window.__SEER_LISTENER__ = true;\n};\n\n/**\n * Clean listener. Can be useful in case you want to unregister upcoming events\n * or liberate memory.\n */\nvar clean = function clean() {\n  if (!isBrowser || !window.__SEER_LISTENER__) {\n    return;\n  }\n  window.removeEventListener('message', listener);\n  delete window.__SEER_LISTENER__;\n};\n\n/**\n * Create a listener that will be called upon events of the given key.\n *\n * @param key {String} The unique tab key\n * @param cb {Function} A callback that will receive the message payload\n */\nvar listenFor = function listenFor(type, cb) {\n  if (!isBrowser) {\n    return;\n  }\n  if (!type || !cb) {\n    throw new Error('Please provide a type and callback');\n  }\n  if (!listeners.has(type)) {\n    listeners.set(type, []);\n  }\n  if (!window.__SEER_LISTENER__) {\n    init();\n  }\n  listeners.get(type).push(cb);\n};\n\n/**\n * Remove an identity listener\n *\n * @param cb {Function} The callback to remove\n */\nvar removeListener = function removeListener(cb) {\n  listeners.forEach(function (typeListeners, key) {\n    listeners.set(key, typeListeners.filter(function (l) {\n      return l !== cb;\n    }));\n  });\n};\n\n/**\n * Creates a new indexed list.\n * It works by index to get O(1) accessing and performance.\n *\n * @param key {String} The key of the tab\n * @param data {Object} The indexed object\n */\nvar list = function list(key, data) {\n  return send('LIST', { key: key, data: data });\n};\n\n/**\n * Creates an element in the indexed list, based on the itemKey.\n *\n * @param key {String} The key of the tab\n * @param itemKey {String} The key of the item\n * @param data {Any} The value of the item\n */\nvar listItem = function listItem(key, itemKey) {\n  var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  return send('LIST_ITEM', { key: key, itemKey: itemKey, data: data });\n};\n\n/**\n * Update an item property, can be deeply nested.\n *\n * @param key {String} The key of the tab\n * @param itemKey {String} The key of the item\n * @param path {String} The path of the variable you want to update\n * @param data {Object} The new value\n */\nvar updateItem = function updateItem(key, itemKey, path, data) {\n  return send('UPDATE_ITEM', { key: key, itemKey: itemKey, path: path, data: data });\n};\n\n/**\n * Similar to updateItem, but allows to pass an array with {path,data} pairs for\n * multiple update of the same item without having to send multiple messages.\n *\n * @param key {String} The key of the tab\n * @param itemKey {String} The key of the item\n * @param array {Array} The array of updates\n * @param array.path {String} The path for this update\n * @param array.data {Object} The value of this update\n */\nvar multiUpdate = function multiUpdate(key, itemKey, array) {\n  return send('MULTI_UPDATE_ITEM', { key: key, itemKey: itemKey, array: array });\n};\n\n/**\n * Remove a specific item in a specific tab.\n *\n * @param key {String} They key of the tab\n * @param itemKey {String} The key of the item\n */\nvar deleteItem = function deleteItem(key, itemKey) {\n  return send('DELETE_ITEM', { key: key, itemKey: itemKey });\n};\n\n/**\n * Will create a log message to an item, that will be displayde with the current time.\n *\n * @param key {String} The key of the tab\n * @param itemKey {String} The key of the item\n * @param msg {String} The message to display\n */\nvar addLog = function addLog(key, itemKey, msg) {\n  return send('ADD_LOG', { key: key, itemKey: itemKey, msg: msg });\n};\n\nexports.default = {\n\n  send: send,\n  throttle: throttle,\n  isReady: isReady,\n\n  list: list,\n  listItem: listItem,\n  updateItem: updateItem,\n  multiUpdate: multiUpdate,\n  deleteItem: deleteItem,\n  addLog: addLog,\n\n  listeners: listeners,\n  listenFor: listenFor,\n  removeListener: removeListener,\n  init: init,\n  clean: clean\n\n};\n\n},{}],\"YDMM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getOverrides = exports.setOverride = exports.removeModel = exports.logModel = exports.addModel = void 0;\n\nvar _seer = _interopRequireDefault(require(\"seer\"));\n\nvar _globals = require(\"../utils/globals\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar models = {};\n/**\n * Add a model to our cache indexed by id\n */\n\nvar addModel = function addModel(model) {\n  if (models[model.id]) {\n    return;\n  }\n\n  models[model.id] = model;\n\n  _seer.default.listItem('luma.gl', model.id);\n};\n/**\n * Log a model uniforms and attributes.\n */\n\n\nexports.addModel = addModel;\n\nvar logModel = function logModel(model, uniforms) {\n  if (!_seer.default.isReady() || _seer.default.throttle(\"luma.gl:\".concat(model.id), 1e3)) {\n    return;\n  }\n\n  var attributesObject = model.geometry ? Object.assign({}, model.geometry.attributes, model.attributes) : model.attributes;\n  var uniformsObject = Object.assign({}, model.uniforms, uniforms);\n\n  _seer.default.multiUpdate('luma.gl', model.id, [{\n    path: 'objects.uniforms',\n    data: uniformsObject\n  }, {\n    path: 'objects.attributes',\n    data: attributesObject\n  }]);\n};\n/**\n * Remove a previously set model from the cache\n */\n\n\nexports.logModel = logModel;\n\nvar removeModel = function removeModel(id) {\n  delete models[id];\n\n  _seer.default.deleteItem('luma.gl', id);\n};\n/**\n * Recursively traverse an object given a path of properties and set the given value\n */\n\n\nexports.removeModel = removeModel;\n\nvar recursiveSet = function recursiveSet(obj, path, value) {\n  if (!obj) {\n    return;\n  }\n\n  if (path.length > 1) {\n    recursiveSet(obj[path[0]], path.slice(1), value);\n  } else {\n    obj[path[0]] = value;\n  }\n};\n\nvar overrides = new Map();\n/**\n * Create an override on the specify layer, indexed by a valuePath array.\n * Do nothing in case Seer as not been initialized to prevent any preformance drawback.\n */\n\nvar setOverride = function setOverride(id, valuePath, value) {\n  if (!_globals.window.__SEER_INITIALIZED__) {\n    return;\n  }\n\n  if (!overrides.has(id)) {\n    overrides.set(id, new Map());\n  }\n\n  var uniforms = overrides.get(id);\n  uniforms.set(valuePath, value);\n};\n/**\n * Apply overrides to a specific model's uniforms\n */\n\n\nexports.setOverride = setOverride;\n\nvar getOverrides = function getOverrides(id, uniforms) {\n  if (!_globals.window.__SEER_INITIALIZED__ || !id) {\n    return;\n  }\n\n  var overs = overrides.get(id);\n\n  if (!overs) {\n    return;\n  }\n\n  overs.forEach(function (value, valuePath) {\n    recursiveSet(uniforms, valuePath, value);\n  });\n};\n/**\n * Listen for luma.gl edit events\n */\n\n\nexports.getOverrides = getOverrides;\n\n_seer.default.listenFor('luma.gl', function (payload) {\n  var model = models[payload.itemKey];\n\n  if (!model || payload.type !== 'edit' || payload.valuePath[0] !== 'uniforms') {\n    return;\n  }\n\n  var valuePath = payload.valuePath.slice(1);\n  setOverride(payload.itemKey, valuePath, payload.value);\n  var uniforms = model.getUniforms();\n  recursiveSet(uniforms, valuePath, payload.value);\n  model.setUniforms(uniforms);\n});\n},{\"seer\":\"a0ak\",\"../utils/globals\":\"zU4q\"}],\"cLMs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getDebugTableForUniforms = getDebugTableForUniforms;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Prepares a table suitable for console.table\n\n/* eslint-disable max-statements, complexity */\nfunction getDebugTableForUniforms() {\n  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      _ref$header = _ref.header,\n      header = _ref$header === void 0 ? 'Uniforms' : _ref$header,\n      program = _ref.program,\n      uniforms = _ref.uniforms,\n      _ref$undefinedOnly = _ref.undefinedOnly,\n      undefinedOnly = _ref$undefinedOnly === void 0 ? false : _ref$undefinedOnly;\n\n  (0, _assert.default)(program);\n  var SHADER_MODULE_UNIFORM_REGEXP = '.*_.*';\n  var PROJECT_MODULE_UNIFORM_REGEXP = '.*Matrix'; // TODO - Use explicit list\n\n  var uniformLocations = program._uniformSetters;\n  var table = {}; // {[header]: {}};\n  // Add program's provided uniforms (in alphabetical order)\n\n  var uniformNames = Object.keys(uniformLocations).sort();\n  var count = 0; // First add non-underscored uniforms (assumed not coming from shader modules)\n\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = uniformNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var _uniformName = _step.value;\n\n      if (!_uniformName.match(SHADER_MODULE_UNIFORM_REGEXP) && !_uniformName.match(PROJECT_MODULE_UNIFORM_REGEXP)) {\n        if (addUniformToTable({\n          table: table,\n          header: header,\n          uniforms: uniforms,\n          uniformName: _uniformName,\n          undefinedOnly: undefinedOnly\n        })) {\n          count++;\n        }\n      }\n    } // add underscored uniforms (assumed from shader modules)\n\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  var _iteratorNormalCompletion2 = true;\n  var _didIteratorError2 = false;\n  var _iteratorError2 = undefined;\n\n  try {\n    for (var _iterator2 = uniformNames[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n      var _uniformName2 = _step2.value;\n\n      if (_uniformName2.match(PROJECT_MODULE_UNIFORM_REGEXP)) {\n        if (addUniformToTable({\n          table: table,\n          header: header,\n          uniforms: uniforms,\n          uniformName: _uniformName2,\n          undefinedOnly: undefinedOnly\n        })) {\n          count++;\n        }\n      }\n    }\n  } catch (err) {\n    _didIteratorError2 = true;\n    _iteratorError2 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n        _iterator2.return();\n      }\n    } finally {\n      if (_didIteratorError2) {\n        throw _iteratorError2;\n      }\n    }\n  }\n\n  var _iteratorNormalCompletion3 = true;\n  var _didIteratorError3 = false;\n  var _iteratorError3 = undefined;\n\n  try {\n    for (var _iterator3 = uniformNames[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n      var _uniformName3 = _step3.value;\n\n      if (!table[_uniformName3]) {\n        if (addUniformToTable({\n          table: table,\n          header: header,\n          uniforms: uniforms,\n          uniformName: _uniformName3,\n          undefinedOnly: undefinedOnly\n        })) {\n          count++;\n        }\n      }\n    } // Create a table of unused uniforms\n\n  } catch (err) {\n    _didIteratorError3 = true;\n    _iteratorError3 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion3 && _iterator3.return != null) {\n        _iterator3.return();\n      }\n    } finally {\n      if (_didIteratorError3) {\n        throw _iteratorError3;\n      }\n    }\n  }\n\n  var unusedCount = 0;\n  var unusedTable = {};\n\n  if (!undefinedOnly) {\n    for (var uniformName in uniforms) {\n      var uniform = uniforms[uniformName];\n\n      if (!table[uniformName]) {\n        unusedCount++;\n        unusedTable[uniformName] = (0, _defineProperty2.default)({\n          Type: \"NOT USED: \".concat(uniform)\n        }, header, (0, _utils.formatValue)(uniform));\n      }\n    }\n  }\n\n  return {\n    table: table,\n    count: count,\n    unusedTable: unusedTable,\n    unusedCount: unusedCount\n  };\n} // Helper\n\n\nfunction addUniformToTable(_ref2) {\n  var table = _ref2.table,\n      header = _ref2.header,\n      uniforms = _ref2.uniforms,\n      uniformName = _ref2.uniformName,\n      undefinedOnly = _ref2.undefinedOnly;\n  var value = uniforms[uniformName];\n  var isDefined = isUniformDefined(value);\n\n  if (!undefinedOnly || !isDefined) {\n    var _table$uniformName;\n\n    table[uniformName] = (_table$uniformName = {}, (0, _defineProperty2.default)(_table$uniformName, header, isDefined ? (0, _utils.formatValue)(value) : 'N/A'), (0, _defineProperty2.default)(_table$uniformName, 'Uniform Type', isDefined ? value : 'NOT PROVIDED'), _table$uniformName);\n    return true;\n  }\n\n  return false;\n}\n\nfunction isUniformDefined(value) {\n  return value !== undefined && value !== null;\n}\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"JrRU\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getDebugTableForVertexArray = getDebugTableForVertexArray;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _buffer = _interopRequireDefault(require(\"../webgl/buffer\"));\n\nvar _constantsToKeys = require(\"../webgl-utils/constants-to-keys\");\n\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Creates object suitable as input for console.table\nfunction getDebugTableForVertexArray() {\n  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      vertexArray = _ref.vertexArray,\n      _ref$header = _ref.header,\n      header = _ref$header === void 0 ? 'Attributes' : _ref$header;\n\n  if (!vertexArray.configuration) {\n    return {};\n  }\n\n  var table = {}; // {[header]: {}};\n  // Add index (elements) if available\n\n  if (vertexArray.elements) {\n    // const elements = Object.assign({size: 1}, vertexArray.elements);\n    table.ELEMENT_ARRAY_BUFFER = getDebugTableRow(vertexArray, vertexArray.elements, null, header);\n  } // Add used attributes\n\n\n  var attributes = vertexArray.values;\n\n  for (var attributeLocation in attributes) {\n    var info = vertexArray._getAttributeInfo(attributeLocation);\n\n    if (info) {\n      var rowHeader = \"\".concat(attributeLocation, \": \").concat(info.name);\n      var accessor = vertexArray.accessors[info.location];\n\n      if (accessor) {\n        rowHeader = \"\".concat(attributeLocation, \": \").concat(getGLSLDeclaration(info.name, accessor));\n      }\n\n      table[rowHeader] = getDebugTableRow(vertexArray, attributes[attributeLocation], accessor, header);\n    }\n  }\n\n  return table;\n}\n/* eslint-disable max-statements */\n\n\nfunction getDebugTableRow(vertexArray, attribute, accessor, header) {\n  var _ref3; // const round = xnum => Math.round(num * 10) / 10;\n\n\n  var gl = vertexArray.gl;\n  var type = 'NOT PROVIDED';\n  var size = 'N/A';\n  var verts = 'N/A';\n  var bytes = 'N/A';\n  var isInteger;\n  var marker;\n  var value;\n\n  if (accessor) {\n    type = accessor.type;\n    size = accessor.size; // Generate a type name by dropping Array from Float32Array etc.\n\n    type = String(type).replace('Array', ''); // Look for 'nt' to detect integer types, e.g. Int32Array, Uint32Array\n\n    isInteger = type.indexOf('nt') !== -1;\n  }\n\n  if (attribute instanceof _buffer.default) {\n    var _ref2;\n\n    var buffer = attribute;\n\n    var _buffer$getDebugData = buffer.getDebugData(),\n        data = _buffer$getDebugData.data,\n        modified = _buffer$getDebugData.modified;\n\n    marker = modified ? '*' : '';\n    value = data;\n    bytes = buffer.byteLength;\n    verts = bytes / data.BYTES_PER_ELEMENT / size;\n    var format;\n\n    if (accessor) {\n      var instanced = accessor.divisor > 0;\n      format = \"\".concat(instanced ? 'I ' : 'P ', \" \").concat(verts, \" (x\").concat(size, \"=\").concat(bytes, \" bytes \").concat((0, _constantsToKeys.glKey)(gl, type), \")\");\n    } else {\n      // element buffer\n      isInteger = true;\n      format = \"\".concat(bytes, \" bytes\");\n    }\n\n    return _ref2 = {}, (0, _defineProperty2.default)(_ref2, header, \"\".concat(marker).concat((0, _utils.formatValue)(value, {\n      size: size,\n      isInteger: isInteger\n    }))), (0, _defineProperty2.default)(_ref2, 'Format ', format), _ref2;\n  } // CONSTANT VALUE\n\n\n  value = attribute;\n  size = attribute.length; // Generate a type name by dropping Array from Float32Array etc.\n\n  type = String(attribute.constructor.name).replace('Array', ''); // Look for 'nt' to detect integer types, e.g. Int32Array, Uint32Array\n\n  isInteger = type.indexOf('nt') !== -1;\n  return _ref3 = {}, (0, _defineProperty2.default)(_ref3, header, \"\".concat((0, _utils.formatValue)(value, {\n    size: size,\n    isInteger: isInteger\n  }), \" (constant)\")), (0, _defineProperty2.default)(_ref3, 'Format ', \"\".concat(size, \"x\").concat(type, \" (constant)\")), _ref3;\n}\n/* eslint-ensable max-statements */\n\n\nfunction getGLSLDeclaration(name, accessor) {\n  var type = accessor.type,\n      size = accessor.size;\n  var typeAndName = (0, _attributeUtils.getCompositeGLType)(type, size);\n\n  if (typeAndName) {\n    return \"\".concat(name, \" (\").concat(typeAndName.name, \")\");\n  }\n\n  return name;\n}\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"../webgl/buffer\":\"IZPG\",\"../webgl-utils/constants-to-keys\":\"d71e\",\"../webgl-utils/attribute-utils\":\"q52h\",\"../utils\":\"B7AM\"}],\"Nc8y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getDebugTableForProgramConfiguration = getDebugTableForProgramConfiguration;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getDebugTableForProgramConfiguration(config) {\n  var table = {};\n  var header = \"Accessors for \".concat(config.id);\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = config.attributeInfos[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var attributeInfo = _step.value;\n\n      if (attributeInfo) {\n        var glslDeclaration = getGLSLDeclaration(attributeInfo);\n        table[\"in \".concat(glslDeclaration)] = (0, _defineProperty2.default)({}, header, JSON.stringify(attributeInfo.accessor));\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  var _iteratorNormalCompletion2 = true;\n  var _didIteratorError2 = false;\n  var _iteratorError2 = undefined;\n\n  try {\n    for (var _iterator2 = config.varyingInfos[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n      var varyingInfo = _step2.value;\n\n      if (varyingInfo) {\n        var _glslDeclaration = getGLSLDeclaration(varyingInfo);\n\n        table[\"out \".concat(_glslDeclaration)] = (0, _defineProperty2.default)({}, header, JSON.stringify(varyingInfo.accessor));\n      }\n    }\n  } catch (err) {\n    _didIteratorError2 = true;\n    _iteratorError2 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n        _iterator2.return();\n      }\n    } finally {\n      if (_didIteratorError2) {\n        throw _iteratorError2;\n      }\n    }\n  }\n\n  return table;\n}\n\nfunction getGLSLDeclaration(attributeInfo) {\n  var _attributeInfo$access = attributeInfo.accessor,\n      type = _attributeInfo$access.type,\n      size = _attributeInfo$access.size;\n  var typeAndName = (0, _attributeUtils.getCompositeGLType)(type, size);\n\n  if (typeAndName) {\n    return \"\".concat(typeAndName.name, \" \").concat(attributeInfo.name);\n  }\n\n  return attributeInfo.name;\n}\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"../webgl-utils/attribute-utils\":\"q52h\"}],\"DSwH\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _attribute = _interopRequireDefault(require(\"./attribute\"));\n\nvar _object3d = _interopRequireDefault(require(\"./object-3d\"));\n\nvar _geometry = require(\"../geometry/geometry\");\n\nvar _webgl = require(\"../webgl\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _shaders = require(\"../shadertools/src/shaders\");\n\nvar _src = require(\"../shadertools/src\");\n\nvar _seerIntegration = require(\"../debug/seer-integration\");\n\nvar _debugUniforms = require(\"../webgl-debug/debug-uniforms\");\n\nvar _debugVertexArray = require(\"../webgl-debug/debug-vertex-array\");\n\nvar _debugProgramConfiguration = require(\"../webgl-debug/debug-program-configuration\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ERR_MODEL_PARAMS = 'Model needs drawMode and vertexCount';\nvar LOG_DRAW_PRIORITY = 2;\nvar LOG_DRAW_TIMEOUT = 10000; // These old picking uniforms should be avoided and we should use picking module\n// and set uniforms using Model class 'updateModuleSettings()'\n// TODO - move to shader modules\n\nvar DEPRECATED_PICKING_UNIFORMS = ['renderPickingBuffer', 'pickingEnabled']; // Model abstract O3D Class\n\nvar Model =\n/*#__PURE__*/\nfunction (_Object3D) {\n  (0, _inherits2.default)(Model, _Object3D);\n\n  function Model(gl) {\n    var _this;\n\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Model);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Model).call(this, props));\n    (0, _assert.default)((0, _webglUtils.isWebGL)(gl));\n    _this.gl = gl;\n    _this.lastLogTime = 0; // TODO - move to probe.gl\n\n    _this.initialize(props); // intended to be subclassed, do not seal\n\n\n    return _this;\n  }\n  /* eslint-disable max-statements  */\n\n  /* eslint-disable complexity  */\n\n\n  (0, _createClass2.default)(Model, [{\n    key: \"initialize\",\n    value: function initialize() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this.props = {};\n      this.program = this._createProgram(props); // Create a vertex array configured after this program\n\n      this.vertexArray = new _webgl.VertexArray(this.gl, {\n        program: this.program\n      }); // Initialize state\n\n      this.userData = {};\n      this.needsRedraw = true; // Model manages auto Buffer creation from typed arrays\n\n      this._attributes = {}; // All attributes\n\n      this.attributes = {}; // User defined attributes\n      // Model manages uniform animation\n\n      this.animatedUniforms = {};\n      this.animated = false;\n      this.animationLoop = null; // if set, used as source for animationProps\n\n      this.timerQueryEnabled = false;\n      this.timeElapsedQuery = undefined;\n      this.lastQueryReturned = true;\n      this.stats = {\n        accumulatedFrameTime: 0,\n        averageFrameTime: 0,\n        profileFrameCount: 0\n      }; // picking options\n\n      this.pickable = true; // this.pick = pick || (() => false);\n\n      this.setProps(props); // Make sure we have some reasonable default uniforms in place\n\n      this.setUniforms(Object.assign({}, this.getModuleUniforms(), // Get all default uniforms\n      this.getModuleUniforms(props.moduleSettings) // Get unforms for supplied parameters\n      )); // Attributes and buffers\n      // geometry might have set drawMode and vertexCount\n\n      this.isInstanced = props.isInstanced || props.instanced;\n\n      this.onBeforeRender = props.onBeforeRender || function () {};\n\n      this.onAfterRender = props.onAfterRender || function () {}; // assert(program || program instanceof Program);\n\n\n      (0, _assert.default)(this.drawMode !== undefined && Number.isFinite(this.vertexCount), ERR_MODEL_PARAMS);\n    }\n    /* eslint-enable max-statements */\n\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      Object.assign(this.props, props); // params\n      // if ('drawMode' in props) {\n      //   this.drawMode = getDrawMode(props.drawMode);\n      // }\n      // if ('vertexCount' in props) {\n      //   this.vertexCount = props.vertexCount;\n      // }\n\n      if ('instanceCount' in props) {\n        this.instanceCount = props.instanceCount;\n      }\n\n      if ('geometry' in props) {\n        this.setGeometry(props.geometry);\n      } // webgl settings\n\n\n      if ('attributes' in props) {\n        this.setAttributes(props.attributes);\n      }\n\n      if ('uniforms' in props) {\n        this.setUniforms(props.uniforms, props.samplers);\n      }\n\n      if ('pickable' in props) {\n        this.pickable = props.pickable;\n      } // Experimental props\n\n\n      if ('timerQueryEnabled' in props) {\n        this.timerQueryEnabled = props.timerQueryEnabled && _webgl.Query.isSupported(this.gl, ['timers']);\n\n        if (props.timerQueryEnabled && !this.timerQueryEnabled) {\n          _utils.log.warn('GPU timer not supported')();\n        }\n      }\n\n      if ('_feedbackBuffers' in props) {\n        this._setFeedbackBuffers(props._feedbackBuffers);\n      }\n\n      if ('_animationProps' in props) {\n        this._setAnimationProps(props._animationProps);\n      }\n\n      if ('_animationLoop' in props) {\n        this.animationLoop = props._animationLoop;\n      }\n    }\n  }, {\n    key: \"delete\",\n    value: function _delete() {\n      // delete all attributes created by this model\n      // TODO - should buffer deletes be handled by vertex array?\n      for (var key in this._attributes) {\n        if (this._attributes[key] !== this.attributes[key]) {\n          this._attributes[key].delete();\n        }\n      }\n\n      this.program.delete();\n      this.vertexArray.delete();\n      (0, _seerIntegration.removeModel)(this.id);\n    }\n  }, {\n    key: \"destroy\",\n    value: function destroy() {\n      this.delete();\n    } // GETTERS\n\n  }, {\n    key: \"getNeedsRedraw\",\n    value: function getNeedsRedraw() {\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref$clearRedrawFlags = _ref.clearRedrawFlags,\n          clearRedrawFlags = _ref$clearRedrawFlags === void 0 ? false : _ref$clearRedrawFlags;\n\n      var redraw = false;\n      redraw = redraw || this.needsRedraw;\n      this.needsRedraw = this.needsRedraw && !clearRedrawFlags;\n\n      if (this.geometry) {\n        redraw = redraw || this.geometry.getNeedsRedraw({\n          clearRedrawFlags: clearRedrawFlags\n        });\n      }\n\n      if (this.animated) {\n        redraw = redraw || \"animated model \".concat(this.id);\n      }\n\n      return redraw;\n    }\n  }, {\n    key: \"getDrawMode\",\n    value: function getDrawMode() {\n      return this.drawMode;\n    }\n  }, {\n    key: \"getVertexCount\",\n    value: function getVertexCount() {\n      return this.vertexCount;\n    }\n  }, {\n    key: \"getInstanceCount\",\n    value: function getInstanceCount() {\n      return this.instanceCount;\n    }\n  }, {\n    key: \"getProgram\",\n    value: function getProgram() {\n      return this.program;\n    }\n  }, {\n    key: \"getAttributes\",\n    value: function getAttributes() {\n      return this.attributes;\n    }\n  }, {\n    key: \"getUniforms\",\n    value: function getUniforms() {\n      return this.program.getUniforms;\n    } // SETTERS\n\n  }, {\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw() {\n      var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n      this.needsRedraw = redraw;\n      return this;\n    }\n  }, {\n    key: \"setDrawMode\",\n    value: function setDrawMode(drawMode) {\n      this.props.drawMode = (0, _geometry.getDrawMode)(drawMode);\n      return this;\n    }\n  }, {\n    key: \"setVertexCount\",\n    value: function setVertexCount(vertexCount) {\n      (0, _assert.default)(Number.isFinite(vertexCount));\n      this.props.vertexCount = vertexCount;\n      return this;\n    }\n  }, {\n    key: \"setInstanceCount\",\n    value: function setInstanceCount(instanceCount) {\n      (0, _assert.default)(Number.isFinite(instanceCount));\n      this.instanceCount = instanceCount;\n      return this;\n    } // TODO - just set attributes, don't hold on to geometry\n\n  }, {\n    key: \"setGeometry\",\n    value: function setGeometry(geometry) {\n      this.geometry = geometry;\n\n      var buffers = this._createBuffersFromAttributeDescriptors(this.geometry.getAttributes());\n\n      this.vertexArray.setAttributes(buffers);\n      this.setNeedsRedraw();\n      return this;\n    }\n  }, {\n    key: \"setAttributes\",\n    value: function setAttributes() {\n      var attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; // Avoid setting needsRedraw if no attributes\n\n      if ((0, _utils.isObjectEmpty)(attributes)) {\n        return this;\n      }\n\n      Object.assign(this.attributes, attributes);\n\n      var buffers = this._createBuffersFromAttributeDescriptors(attributes); // Object.assign(this.attributes, buffers);\n\n\n      this.vertexArray.setAttributes(buffers);\n      this.setNeedsRedraw();\n      return this;\n    } // TODO - should actually set the uniforms\n\n  }, {\n    key: \"setUniforms\",\n    value: function setUniforms() {\n      var _this2 = this;\n\n      var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var samplers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // Let Seer override edited uniforms\n\n      uniforms = Object.assign({}, uniforms);\n      (0, _seerIntegration.getOverrides)(this.id, uniforms); // Resolve any animated uniforms so that we have an initial value\n\n      uniforms = this._extractAnimatedUniforms(uniforms);\n      this.program.setUniforms(uniforms, samplers, function () {\n        // if something changed\n        _this2._checkForDeprecatedUniforms(uniforms);\n\n        _this2.setNeedsRedraw();\n      });\n    } // Updates (evaluates) all function valued uniforms based on a new set of animationProps\n    // experimental\n\n  }, {\n    key: \"_setAnimationProps\",\n    value: function _setAnimationProps(animationProps) {\n      var _this3 = this;\n\n      if (this.animated) {\n        (0, _assert.default)(animationProps, 'Model.draw(): animated uniforms but no animationProps');\n\n        var animatedUniforms = this._evaluateAnimateUniforms(animationProps);\n\n        this.program.setUniforms(animatedUniforms, {}, function () {\n          // if something changed\n          _this3._checkForDeprecatedUniforms(animatedUniforms);\n\n          _this3.setNeedsRedraw();\n        });\n      }\n    }\n  }, {\n    key: \"updateModuleSettings\",\n    value: function updateModuleSettings(opts) {\n      var uniforms = this.getModuleUniforms(opts || {});\n      return this.setUniforms(uniforms);\n    } // DRAW CALLS\n\n  }, {\n    key: \"clear\",\n    value: function clear(opts) {\n      (0, _webgl.clear)(this.program.gl, opts);\n      return this;\n    }\n    /* eslint-disable max-statements  */\n\n  }, {\n    key: \"draw\",\n    value: function draw() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _opts$moduleSettings = opts.moduleSettings,\n          moduleSettings = _opts$moduleSettings === void 0 ? null : _opts$moduleSettings,\n          framebuffer = opts.framebuffer,\n          _opts$uniforms = opts.uniforms,\n          uniforms = _opts$uniforms === void 0 ? {} : _opts$uniforms,\n          _opts$attributes = opts.attributes,\n          attributes = _opts$attributes === void 0 ? {} : _opts$attributes,\n          _opts$samplers = opts.samplers,\n          samplers = _opts$samplers === void 0 ? {} : _opts$samplers,\n          _opts$transformFeedba = opts.transformFeedback,\n          transformFeedback = _opts$transformFeedba === void 0 ? this.transformFeedback : _opts$transformFeedba,\n          _opts$parameters = opts.parameters,\n          parameters = _opts$parameters === void 0 ? {} : _opts$parameters,\n          _opts$vertexArray = opts.vertexArray,\n          vertexArray = _opts$vertexArray === void 0 ? this.vertexArray : _opts$vertexArray,\n          animationProps = opts.animationProps; // Update module settings\n\n      (0, _seerIntegration.addModel)(this); // Update model with any just provided attributes, settings or uniforms\n\n      this.setAttributes(attributes);\n      this.updateModuleSettings(moduleSettings);\n      this.setUniforms(uniforms, samplers); // Animate any function valued uniforms\n\n      this._refreshAnimationProps(animationProps);\n\n      var logPriority = this._logDrawCallStart(2);\n\n      var drawParams = this.vertexArray.getDrawParams(this.props);\n\n      if (drawParams.isInstanced && !this.isInstanced) {\n        _utils.log.warn('Found instanced attributes on non-instanced model', this.id)();\n      }\n\n      var isIndexed = drawParams.isIndexed,\n          indexType = drawParams.indexType;\n      var isInstanced = this.isInstanced,\n          instanceCount = this.instanceCount;\n      this.onBeforeRender();\n\n      this._timerQueryStart();\n\n      this.program.draw(Object.assign({}, opts, {\n        logPriority: logPriority,\n        uniforms: null,\n        // Already set (may contain \"function values\" not understood by Program)\n        framebuffer: framebuffer,\n        parameters: parameters,\n        drawMode: this.getDrawMode(),\n        vertexCount: this.getVertexCount(),\n        vertexArray: vertexArray,\n        transformFeedback: transformFeedback,\n        isIndexed: isIndexed,\n        indexType: indexType,\n        isInstanced: isInstanced,\n        instanceCount: instanceCount\n      }));\n\n      this._timerQueryEnd();\n\n      this.onAfterRender();\n      this.setNeedsRedraw(false);\n\n      this._logDrawCallEnd(logPriority, vertexArray, framebuffer);\n\n      return this;\n    }\n    /* eslint-enable max-statements  */\n    // Draw call for transform feedback\n\n  }, {\n    key: \"transform\",\n    value: function transform() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _opts$discard = opts.discard,\n          discard = _opts$discard === void 0 ? true : _opts$discard,\n          feedbackBuffers = opts.feedbackBuffers,\n          _opts$unbindModels = opts.unbindModels,\n          unbindModels = _opts$unbindModels === void 0 ? [] : _opts$unbindModels;\n      var parameters = opts.parameters;\n\n      if (feedbackBuffers) {\n        this._setFeedbackBuffers(feedbackBuffers);\n      }\n\n      if (discard) {\n        parameters = Object.assign({}, parameters, (0, _defineProperty2.default)({}, 35977, discard));\n      }\n\n      unbindModels.forEach(function (model) {\n        return model.vertexArray.unbindBuffers();\n      });\n\n      try {\n        this.draw(Object.assign({}, opts, {\n          parameters: parameters\n        }));\n      } finally {\n        unbindModels.forEach(function (model) {\n          return model.vertexArray.bindBuffers();\n        });\n      }\n\n      return this;\n    } // DEPRECATED METHODS\n\n  }, {\n    key: \"render\",\n    value: function render() {\n      var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      (0, _assert.default)(arguments.length <= 1); // log.deprecated('Model.render()', 'Model.draw()')();\n\n      return this.draw({\n        uniforms: uniforms\n      });\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_createProgram\",\n    value: function _createProgram(_ref2) {\n      var _ref2$vs = _ref2.vs,\n          vs = _ref2$vs === void 0 ? null : _ref2$vs,\n          _ref2$fs = _ref2.fs,\n          fs = _ref2$fs === void 0 ? null : _ref2$fs,\n          _ref2$modules = _ref2.modules,\n          modules = _ref2$modules === void 0 ? null : _ref2$modules,\n          _ref2$defines = _ref2.defines,\n          defines = _ref2$defines === void 0 ? {} : _ref2$defines,\n          _ref2$inject = _ref2.inject,\n          inject = _ref2$inject === void 0 ? {} : _ref2$inject,\n          _ref2$shaderCache = _ref2.shaderCache,\n          shaderCache = _ref2$shaderCache === void 0 ? null : _ref2$shaderCache,\n          _ref2$varyings = _ref2.varyings,\n          varyings = _ref2$varyings === void 0 ? null : _ref2$varyings,\n          _ref2$bufferMode = _ref2.bufferMode,\n          bufferMode = _ref2$bufferMode === void 0 ? 35981 : _ref2$bufferMode,\n          _ref2$program = _ref2.program,\n          program = _ref2$program === void 0 ? null : _ref2$program;\n\n      this.getModuleUniforms = function (x) {};\n\n      var id = this.id;\n\n      if (!program) {\n        // Assign default shaders if none are provided\n        vs = vs || _shaders.MODULAR_SHADERS.vs;\n        fs = fs || _shaders.MODULAR_SHADERS.fs;\n        var assembleResult = (0, _src.assembleShaders)(this.gl, {\n          vs: vs,\n          fs: fs,\n          modules: modules,\n          inject: inject,\n          defines: defines,\n          log: _utils.log\n        });\n        vs = assembleResult.vs;\n        fs = assembleResult.fs;\n\n        if (shaderCache) {\n          program = shaderCache.getProgram(this.gl, {\n            id: id,\n            vs: vs,\n            fs: fs\n          });\n        } else {\n          program = new _webgl.Program(this.gl, {\n            id: id,\n            vs: vs,\n            fs: fs,\n            varyings: varyings,\n            bufferMode: bufferMode\n          });\n        }\n\n        this.getModuleUniforms = assembleResult.getUniforms || function (x) {};\n      }\n\n      (0, _assert.default)(program instanceof _webgl.Program, 'Model needs a program');\n      return program;\n    }\n    /* eslint-enable complexity */\n    // Uniforms\n\n  }, {\n    key: \"_checkForDeprecatedUniforms\",\n    value: function _checkForDeprecatedUniforms(uniforms) {\n      // deprecated picking uniforms\n      DEPRECATED_PICKING_UNIFORMS.forEach(function (uniform) {\n        if (uniform in uniforms) {\n          _utils.log.deprecated(uniform, 'use picking shader module and Model class updateModuleSettings()')();\n        }\n      });\n    } // Refreshes animated uniforms, attempting to get animated props from animationLoop if registered\n\n  }, {\n    key: \"_refreshAnimationProps\",\n    value: function _refreshAnimationProps(animationProps) {\n      // Try to read animationProps\n      animationProps = animationProps || this.animationLoop && this.animationLoop.animationProps;\n\n      if (animationProps) {\n        this._setAnimationProps(animationProps);\n      }\n    } // Calculate new values for any function uniforms based on supplied animationProps\n\n  }, {\n    key: \"_evaluateAnimateUniforms\",\n    value: function _evaluateAnimateUniforms(animationProps) {\n      if (!this.animated) {\n        return {};\n      }\n\n      var animatedUniforms = {};\n\n      for (var uniformName in this.animatedUniforms) {\n        var valueFunction = this.animatedUniforms[uniformName];\n        animatedUniforms[uniformName] = valueFunction(animationProps);\n      }\n\n      return animatedUniforms;\n    } // Extracts a list of function valued uniforms, so we can update them before each draw call\n    // Also removes such uniforms from the returned list\n\n  }, {\n    key: \"_extractAnimatedUniforms\",\n    value: function _extractAnimatedUniforms(uniforms) {\n      var foundAnimated = false; // Keep our animatedUniforms map up-to-date\n\n      for (var uniformName in uniforms) {\n        var newValue = uniforms[uniformName];\n\n        if (typeof newValue === 'function') {\n          this.animatedUniforms[uniformName] = newValue;\n          foundAnimated = true;\n        } else {\n          delete this.animatedUniforms[uniformName];\n        }\n      } // Update animated flag: `Model` is animated if any uniforms are animated (i.e. functions)\n\n\n      this.animated = !(0, _utils.isObjectEmpty)(this.animatedUniforms);\n\n      if (!foundAnimated) {\n        return uniforms;\n      } // If animated uniforms were found, remove them from ordinary uniform list\n      // `Program` class can't (and shouldn't) handle function valued uniforms\n\n\n      var staticUniforms = {};\n\n      for (var _uniformName in uniforms) {\n        if (!this.animatedUniforms[_uniformName]) {\n          staticUniforms[_uniformName] = uniforms[_uniformName];\n        }\n      }\n\n      return staticUniforms;\n    } // Transform Feedback\n\n  }, {\n    key: \"_setFeedbackBuffers\",\n    value: function _setFeedbackBuffers() {\n      var feedbackBuffers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; // Avoid setting needsRedraw if no feedbackBuffers\n\n      if ((0, _utils.isObjectEmpty)(feedbackBuffers)) {\n        return this;\n      }\n\n      var gl = this.program.gl;\n      this.transformFeedback = this.transformFeedback || new _webgl.TransformFeedback(gl, {\n        program: this.program\n      });\n      this.transformFeedback.setBuffers(feedbackBuffers);\n      this.setNeedsRedraw();\n      return this;\n    } // Timer Queries\n\n  }, {\n    key: \"_timerQueryStart\",\n    value: function _timerQueryStart() {\n      if (this.timerQueryEnabled === true) {\n        if (!this.timeElapsedQuery) {\n          this.timeElapsedQuery = new _webgl.Query(this.gl);\n        }\n\n        if (this.lastQueryReturned) {\n          this.lastQueryReturned = false;\n          this.timeElapsedQuery.beginTimeElapsedQuery();\n        }\n      }\n    }\n  }, {\n    key: \"_timerQueryEnd\",\n    value: function _timerQueryEnd() {\n      if (this.timerQueryEnabled === true) {\n        this.timeElapsedQuery.end(); // TODO: Skip results if 'gl.getParameter(this.ext.GPU_DISJOINT_EXT)' returns false\n        // should this be incorporated into Query object?\n\n        if (this.timeElapsedQuery.isResultAvailable()) {\n          this.lastQueryReturned = true;\n          var elapsedTime = this.timeElapsedQuery.getResult(); // Update stats (e.g. for seer)\n\n          this.stats.lastFrameTime = elapsedTime;\n          this.stats.accumulatedFrameTime += elapsedTime;\n          this.stats.profileFrameCount++;\n          this.stats.averageFrameTime = this.stats.accumulatedFrameTime / this.stats.profileFrameCount; // Log stats\n\n          _utils.log.log(LOG_DRAW_PRIORITY, \"GPU time \".concat(this.program.id, \": \").concat(this.stats.lastFrameTime, \"ms average \").concat(this.stats.averageFrameTime, \"ms accumulated: \").concat(this.stats.accumulatedFrameTime, \"ms count: \").concat(this.stats.profileFrameCount))();\n        }\n      }\n    } // Makes sure buffers are created for all attributes\n    // and that the program is updated with those buffers\n    // TODO - do we need the separation between \"attributes\" and \"buffers\"\n    // couldn't apps just create buffers directly?\n\n  }, {\n    key: \"_createBuffersFromAttributeDescriptors\",\n    value: function _createBuffersFromAttributeDescriptors(attributes) {\n      var gl = this.program.gl; // const attributes = {};\n\n      var buffers = {};\n\n      for (var attributeName in attributes) {\n        var descriptor = attributes[attributeName];\n        var attribute = this._attributes[attributeName];\n\n        if (descriptor instanceof _attribute.default) {\n          attribute = descriptor;\n        } else if (descriptor instanceof _webgl.Buffer) {\n          attribute = attribute || new _attribute.default(gl, Object.assign({}, descriptor, descriptor.layout, {\n            id: attributeName\n          }));\n          attribute.update({\n            buffer: descriptor\n          });\n        } else if (attribute) {\n          attribute.update(descriptor);\n        } else {\n          attribute = new _attribute.default(gl, Object.assign({}, descriptor, {\n            id: attributeName\n          }));\n        }\n\n        this._attributes[attributeName] = attribute;\n        buffers[attributeName] = attribute.getValue();\n      }\n\n      return buffers;\n    }\n  }, {\n    key: \"_logDrawCallStart\",\n    value: function _logDrawCallStart(priority) {\n      var logDrawTimeout = priority > 3 ? 0 : LOG_DRAW_TIMEOUT;\n\n      if (_utils.log.priority < priority || Date.now() - this.lastLogTime < logDrawTimeout) {\n        return undefined;\n      }\n\n      this.lastLogTime = Date.now();\n\n      _utils.log.group(LOG_DRAW_PRIORITY, \">>> DRAWING MODEL \".concat(this.id), {\n        collapsed: _utils.log.priority <= 2\n      })();\n\n      return priority;\n    }\n  }, {\n    key: \"_logDrawCallEnd\",\n    value: function _logDrawCallEnd(priority, vertexArray, uniforms, framebuffer) {\n      // HACK: priority === undefined means logDrawCallStart didn't run\n      if (priority === undefined) {\n        return;\n      }\n\n      var attributeTable = (0, _debugVertexArray.getDebugTableForVertexArray)({\n        vertexArray: vertexArray,\n        header: \"\".concat(this.id, \" attributes\"),\n        attributes: this._attributes\n      });\n\n      var _getDebugTableForUnif = (0, _debugUniforms.getDebugTableForUniforms)({\n        header: \"\".concat(this.id, \" uniforms\"),\n        program: this.program,\n        uniforms: Object.assign({}, this.program.uniforms, uniforms)\n      }),\n          uniformTable = _getDebugTableForUnif.table,\n          unusedTable = _getDebugTableForUnif.unusedTable,\n          unusedCount = _getDebugTableForUnif.unusedCount; // log missing uniforms\n\n\n      var _getDebugTableForUnif2 = (0, _debugUniforms.getDebugTableForUniforms)({\n        header: \"\".concat(this.id, \" uniforms\"),\n        program: this.program,\n        uniforms: Object.assign({}, this.program.uniforms, uniforms),\n        undefinedOnly: true\n      }),\n          missingTable = _getDebugTableForUnif2.table,\n          missingCount = _getDebugTableForUnif2.count;\n\n      if (missingCount > 0) {\n        _utils.log.log('MISSING UNIFORMS', Object.keys(missingTable))(); // log.table(priority, missingTable)();\n\n      }\n\n      if (unusedCount > 0) {\n        _utils.log.log('UNUSED UNIFORMS', Object.keys(unusedTable))(); // log.log(priority, 'Unused uniforms ', unusedTable)();\n\n      }\n\n      var configTable = (0, _debugProgramConfiguration.getDebugTableForProgramConfiguration)(this.vertexArray.configuration);\n\n      _utils.log.table(priority, attributeTable)();\n\n      _utils.log.table(priority, uniformTable)();\n\n      _utils.log.table(priority + 1, configTable)();\n\n      (0, _seerIntegration.logModel)(this, uniforms);\n\n      if (framebuffer) {\n        framebuffer.log({\n          priority: LOG_DRAW_PRIORITY,\n          message: \"Rendered to \".concat(framebuffer.id)\n        });\n      }\n\n      _utils.log.groupEnd(LOG_DRAW_PRIORITY, \">>> DRAWING MODEL \".concat(this.id))();\n    }\n  }, {\n    key: \"vertexCount\",\n    get: function get() {\n      if (Number.isFinite(this.props.vertexCount)) {\n        return this.props.vertexCount;\n      }\n\n      return this.geometry && this.geometry.getVertexCount();\n    }\n  }, {\n    key: \"drawMode\",\n    get: function get() {\n      if (Number.isFinite(this.props.drawMode)) {\n        return this.props.drawMode;\n      }\n\n      return this.geometry && this.geometry.drawMode;\n    }\n  }]);\n  return Model;\n}(_object3d.default);\n\nexports.default = Model;\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./attribute\":\"VJC6\",\"./object-3d\":\"WDVo\",\"../geometry/geometry\":\"a3Eh\",\"../webgl\":\"yQJr\",\"../webgl-utils\":\"CTd0\",\"../shadertools/src/shaders\":\"va5x\",\"../shadertools/src\":\"H4AH\",\"../debug/seer-integration\":\"YDMM\",\"../webgl-debug/debug-uniforms\":\"cLMs\",\"../webgl-debug/debug-vertex-array\":\"JrRU\",\"../webgl-debug/debug-program-configuration\":\"Nc8y\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"GBRt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _webglContext = require(\"../webgl-context\");\n\nvar _debugContext = require(\"../webgl-context/debug-context\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _webgl = require(\"../webgl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* global OffscreenCanvas */\n// TODO - remove dependency on webgl classes\nvar DEFAULT_GL_OPTIONS = {\n  preserveDrawingBuffer: true\n};\n\nvar AnimationLoop =\n/*#__PURE__*/\nfunction () {\n  /*\n   * @param {HTMLCanvasElement} canvas - if provided, width and height will be passed to context\n   */\n  function AnimationLoop() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, AnimationLoop);\n    var _props$onCreateContex = props.onCreateContext,\n        onCreateContext = _props$onCreateContex === void 0 ? function (opts) {\n      return (0, _webglContext.createGLContext)(opts);\n    } : _props$onCreateContex,\n        _props$onAddHTML = props.onAddHTML,\n        onAddHTML = _props$onAddHTML === void 0 ? null : _props$onAddHTML,\n        _props$onInitialize = props.onInitialize,\n        onInitialize = _props$onInitialize === void 0 ? function () {} : _props$onInitialize,\n        _props$onRender = props.onRender,\n        onRender = _props$onRender === void 0 ? function () {} : _props$onRender,\n        _props$onFinalize = props.onFinalize,\n        onFinalize = _props$onFinalize === void 0 ? function () {} : _props$onFinalize,\n        _props$gl = props.gl,\n        gl = _props$gl === void 0 ? null : _props$gl,\n        _props$glOptions = props.glOptions,\n        glOptions = _props$glOptions === void 0 ? {} : _props$glOptions,\n        _props$debug = props.debug,\n        debug = _props$debug === void 0 ? false : _props$debug,\n        _props$createFramebuf = props.createFramebuffer,\n        createFramebuffer = _props$createFramebuf === void 0 ? false : _props$createFramebuf,\n        _props$autoResizeView = props.autoResizeViewport,\n        autoResizeViewport = _props$autoResizeView === void 0 ? true : _props$autoResizeView,\n        _props$autoResizeDraw = props.autoResizeDrawingBuffer,\n        autoResizeDrawingBuffer = _props$autoResizeDraw === void 0 ? true : _props$autoResizeDraw;\n    var _props$useDevicePixel = props.useDevicePixels,\n        useDevicePixels = _props$useDevicePixel === void 0 ? true : _props$useDevicePixel;\n\n    if ('useDevicePixelRatio' in props) {\n      _utils.log.deprecated('useDevicePixelRatio', 'useDevicePixels')();\n\n      useDevicePixels = props.useDevicePixelRatio;\n    }\n\n    this.props = {\n      onCreateContext: onCreateContext,\n      onAddHTML: onAddHTML,\n      onInitialize: onInitialize,\n      onRender: onRender,\n      onFinalize: onFinalize,\n      gl: gl,\n      glOptions: glOptions,\n      debug: debug,\n      createFramebuffer: createFramebuffer\n    }; // state\n\n    this.gl = gl;\n    this.needsRedraw = null;\n    this._initialized = false;\n    this._running = false;\n    this._animationFrameId = null;\n    this._startPromise = null;\n    this.setProps({\n      autoResizeViewport: autoResizeViewport,\n      autoResizeDrawingBuffer: autoResizeDrawingBuffer,\n      useDevicePixels: useDevicePixels\n    }); // Bind methods\n\n    this.start = this.start.bind(this);\n    this.stop = this.stop.bind(this);\n    this._onMousemove = this._onMousemove.bind(this);\n    this._onMouseleave = this._onMouseleave.bind(this);\n    return this;\n  }\n\n  (0, _createClass2.default)(AnimationLoop, [{\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw(reason) {\n      (0, _assert.default)(typeof reason === 'string');\n      this.needsRedraw = this.needsRedraw || reason;\n      return this;\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('autoResizeViewport' in props) {\n        this.autoResizeViewport = props.autoResizeViewport;\n      }\n\n      if ('autoResizeDrawingBuffer' in props) {\n        this.autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;\n      }\n\n      if ('useDevicePixels' in props) {\n        this.useDevicePixels = props.useDevicePixels;\n      }\n\n      return this;\n    } // Starts a render loop if not already running\n    // @param {Object} context - contains frame specific info (E.g. tick, width, height, etc)\n\n  }, {\n    key: \"start\",\n    value: function start() {\n      var _this = this;\n\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      if (this._running) {\n        return this;\n      }\n\n      this._running = true; // console.debug(`Starting ${this.constructor.name}`);\n      // Wait for start promise before rendering frame\n\n      this._startPromise = (0, _webglContext.getPageLoadPromise)().then(function () {\n        if (!_this._running || _this._initialized) {\n          return null;\n        } // Create the WebGL context\n\n\n        _this._createWebGLContext(opts);\n\n        _this._createFramebuffer();\n\n        _this._startEventHandling(); // Initialize the callback data\n\n\n        _this._initializeCallbackData();\n\n        _this._updateCallbackData(); // Default viewport setup, in case onInitialize wants to render\n\n\n        _this._resizeCanvasDrawingBuffer();\n\n        _this._resizeViewport(); // Note: onIntialize can return a promise (in case it needs to load resources)\n\n\n        var initializationPromise = _this.onInitialize(_this.animationProps);\n\n        _this._initialized = true;\n        return initializationPromise;\n      }).then(function (appContext) {\n        if (_this._running) {\n          _this._addCallbackData(appContext || {});\n\n          if (appContext !== false) {\n            _this._startLoop();\n          }\n        }\n      });\n      return this;\n    } // Redraw now\n\n  }, {\n    key: \"redraw\",\n    value: function redraw() {\n      this._setupFrame();\n\n      this._updateCallbackData(); // call callback\n\n\n      this.onRender(this.animationProps); // end callback\n      // clear needsRedraw flag\n\n      this._clearNeedsRedraw(); // https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/commit\n      // Chrome's offscreen canvas does not require gl.commit\n\n\n      if (this.offScreen && this.gl.commit) {\n        this.gl.commit();\n      }\n\n      return this;\n    } // Stops a render loop if already running, finalizing\n\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      // console.debug(`Stopping ${this.constructor.name}`);\n      if (this._running) {\n        this._finalizeCallbackData();\n\n        (0, _webglUtils.cancelAnimationFrame)(this._animationFrameId);\n        this._animationFrameId = null;\n        this._running = false;\n      }\n\n      return this;\n    }\n  }, {\n    key: \"onCreateContext\",\n    value: function onCreateContext() {\n      var _this$props;\n\n      return (_this$props = this.props).onCreateContext.apply(_this$props, arguments);\n    }\n  }, {\n    key: \"onInitialize\",\n    value: function onInitialize() {\n      var _this$props2;\n\n      return (_this$props2 = this.props).onInitialize.apply(_this$props2, arguments);\n    }\n  }, {\n    key: \"onRender\",\n    value: function onRender() {\n      var _this$props3;\n\n      return (_this$props3 = this.props).onRender.apply(_this$props3, arguments);\n    }\n  }, {\n    key: \"onFinalize\",\n    value: function onFinalize() {\n      var _this$props4;\n\n      return (_this$props4 = this.props).onFinalize.apply(_this$props4, arguments);\n    } // DEPRECATED/REMOVED METHODS\n\n  }, {\n    key: \"getHTMLControlValue\",\n    value: function getHTMLControlValue(id) {\n      var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n      var element = document.getElementById(id);\n      return element ? Number(element.value) : defaultValue;\n    } // Update parameters\n\n  }, {\n    key: \"setViewParameters\",\n    value: function setViewParameters() {\n      _utils.log.removed('AnimationLoop.setViewParameters', 'AnimationLoop.setProps')();\n\n      return this;\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_startLoop\",\n    value: function _startLoop() {\n      var _this2 = this;\n\n      var renderFrame = function renderFrame() {\n        if (!_this2._running) {\n          return;\n        }\n\n        _this2.redraw();\n\n        _this2._animationFrameId = (0, _webglUtils.requestAnimationFrame)(renderFrame);\n      }; // cancel any pending renders to ensure only one loop can ever run\n\n\n      (0, _webglUtils.cancelAnimationFrame)(this._animationFrameId);\n      this._animationFrameId = (0, _webglUtils.requestAnimationFrame)(renderFrame);\n    }\n  }, {\n    key: \"_clearNeedsRedraw\",\n    value: function _clearNeedsRedraw() {\n      this.needsRedraw = null;\n    }\n  }, {\n    key: \"_setupFrame\",\n    value: function _setupFrame() {\n      if (this._onSetupFrame) {\n        // call callback\n        this._onSetupFrame(this.animationProps); // end callback\n\n      } else {\n        this._resizeCanvasDrawingBuffer();\n\n        this._resizeViewport();\n\n        this._resizeFramebuffer();\n      }\n    } // Initialize the  object that will be passed to app callbacks\n\n  }, {\n    key: \"_initializeCallbackData\",\n    value: function _initializeCallbackData() {\n      this.animationProps = {\n        gl: this.gl,\n        stop: this.stop,\n        canvas: this.gl.canvas,\n        framebuffer: this.framebuffer,\n        // Initial values\n        useDevicePixels: this.useDevicePixels,\n        needsRedraw: null,\n        // Animation props\n        startTime: Date.now(),\n        time: 0,\n        tick: 0,\n        tock: 0,\n        // canvas\n        // Experimental\n        _loop: this,\n        _animationLoop: this,\n        _mousePosition: null // Event props\n\n      };\n    } // Update the context object that will be passed to app callbacks\n\n  }, {\n    key: \"_updateCallbackData\",\n    value: function _updateCallbackData() {\n      var _this$_getSizeAndAspe = this._getSizeAndAspect(),\n          width = _this$_getSizeAndAspe.width,\n          height = _this$_getSizeAndAspe.height,\n          aspect = _this$_getSizeAndAspe.aspect;\n\n      if (width !== this.animationProps.width || height !== this.animationProps.height) {\n        this.setNeedsRedraw('drawing buffer resized');\n      }\n\n      if (aspect !== this.animationProps.aspect) {\n        this.setNeedsRedraw('drawing buffer aspect changed');\n      }\n\n      this.animationProps.width = width;\n      this.animationProps.height = height;\n      this.animationProps.aspect = aspect;\n      this.animationProps.needsRedraw = this.needsRedraw; // Increment tick\n\n      this.animationProps.time = Date.now() - this.animationProps.startTime;\n      this.animationProps.tick = Math.floor(this.animationProps.time / 1000 * 60);\n      this.animationProps.tock++; // experimental\n\n      this.animationProps._offScreen = this.offScreen;\n    }\n  }, {\n    key: \"_finalizeCallbackData\",\n    value: function _finalizeCallbackData() {\n      // call callback\n      this.onFinalize(this.animationProps); // end callback\n    } // Add application's data to the app context object\n\n  }, {\n    key: \"_addCallbackData\",\n    value: function _addCallbackData(appContext) {\n      if ((0, _typeof2.default)(appContext) === 'object' && appContext !== null) {\n        this.animationProps = Object.assign({}, this.animationProps, appContext);\n      }\n    } // Either uses supplied or existing context, or calls provided callback to create one\n\n  }, {\n    key: \"_createWebGLContext\",\n    value: function _createWebGLContext(opts) {\n      this.offScreen = opts.canvas && typeof OffscreenCanvas !== 'undefined' && opts.canvas instanceof OffscreenCanvas; // Create the WebGL context if necessary\n\n      opts = Object.assign({}, opts, DEFAULT_GL_OPTIONS, this.props.glOptions);\n      this.gl = this.props.gl || this.onCreateContext(opts);\n\n      if (!(0, _webglUtils.isWebGL)(this.gl)) {\n        throw new Error('AnimationLoop.onCreateContext - illegal context returned');\n      }\n\n      if (this.props.debug) {\n        this.gl = (0, _debugContext.makeDebugContext)(this.gl);\n      } // Reset the WebGL context.\n\n\n      (0, _webglContext.resetParameters)(this.gl);\n\n      this._createInfoDiv();\n    }\n  }, {\n    key: \"_createInfoDiv\",\n    value: function _createInfoDiv() {\n      if (this.gl.canvas && this.props.onAddHTML) {\n        /* global document */\n        var wrapperDiv = document.createElement('div');\n        document.body.appendChild(wrapperDiv);\n        wrapperDiv.style.position = 'relative';\n        var div = document.createElement('div');\n        div.style.position = 'absolute';\n        div.style.left = '10px';\n        div.style.bottom = '10px';\n        div.style.width = '300px';\n        div.style.background = 'white';\n        wrapperDiv.appendChild(this.gl.canvas);\n        wrapperDiv.appendChild(div);\n        var html = this.props.onAddHTML(div);\n\n        if (html) {\n          div.innerHTML = html;\n        }\n      }\n    }\n  }, {\n    key: \"_getSizeAndAspect\",\n    value: function _getSizeAndAspect() {\n      // https://webglfundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html\n      var width = this.gl.drawingBufferWidth;\n      var height = this.gl.drawingBufferHeight; // https://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html\n\n      var aspect = 1;\n      var _this$gl$canvas = this.gl.canvas,\n          clientWidth = _this$gl$canvas.clientWidth,\n          clientHeight = _this$gl$canvas.clientHeight;\n\n      if (clientWidth >= 0 && clientHeight >= 0) {\n        aspect = height > 0 ? clientWidth / clientHeight : 1;\n      } else if (width > 0 && height > 0) {\n        aspect = width / height;\n      }\n\n      return {\n        width: width,\n        height: height,\n        aspect: aspect\n      };\n    } // Default viewport setup\n\n  }, {\n    key: \"_resizeViewport\",\n    value: function _resizeViewport() {\n      if (this.autoResizeViewport) {\n        this.gl.viewport(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight);\n      }\n    } // Resize the render buffer of the canvas to match canvas client size\n    // Optionally multiplying with devicePixel ratio\n\n  }, {\n    key: \"_resizeCanvasDrawingBuffer\",\n    value: function _resizeCanvasDrawingBuffer() {\n      if (this.autoResizeDrawingBuffer) {\n        (0, _webglContext.resizeGLContext)(this.gl, {\n          useDevicePixels: this.useDevicePixels\n        });\n      }\n    } // TBD - deprecated?\n\n  }, {\n    key: \"_createFramebuffer\",\n    value: function _createFramebuffer() {\n      // Setup default framebuffer\n      if (this.props.createFramebuffer) {\n        this.framebuffer = new _webgl.Framebuffer(this.gl);\n      }\n    }\n  }, {\n    key: \"_resizeFramebuffer\",\n    value: function _resizeFramebuffer() {\n      if (this.framebuffer) {\n        this.framebuffer.resize({\n          width: this.gl.drawingBufferWidth,\n          height: this.gl.drawingBufferHeight\n        });\n      }\n    } // Event handling\n\n  }, {\n    key: \"_startEventHandling\",\n    value: function _startEventHandling() {\n      this.gl.canvas.addEventListener('mousemove', this._onMousemove);\n      this.gl.canvas.addEventListener('mouseleave', this._onMouseleave);\n    }\n  }, {\n    key: \"_onMousemove\",\n    value: function _onMousemove(e) {\n      this.animationProps._mousePosition = [e.offsetX, e.offsetY];\n    }\n  }, {\n    key: \"_onMouseleave\",\n    value: function _onMouseleave(e) {\n      this.animationProps._mousePosition = null;\n    }\n  }]);\n  return AnimationLoop;\n}();\n\nexports.default = AnimationLoop;\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../webgl-context\":\"rNTT\",\"../webgl-context/debug-context\":\"GOH4\",\"../webgl-utils\":\"CTd0\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\",\"../webgl\":\"yQJr\"}],\"WAG5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = pickModels;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _webgl = require(\"../webgl\");\n\nvar _group = _interopRequireDefault(require(\"./group\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* global window */\nfunction getDevicePixelRatio() {\n  return typeof window !== 'undefined' ? window.devicePixelRatio : 1;\n}\n\nfunction pickModels(gl, props) {\n  var models = props.models,\n      position = props.position,\n      _props$uniforms = props.uniforms,\n      uniforms = _props$uniforms === void 0 ? {} : _props$uniforms,\n      _props$parameters = props.parameters,\n      parameters = _props$parameters === void 0 ? {} : _props$parameters,\n      settings = props.settings,\n      _props$useDevicePixel = props.useDevicePixels,\n      useDevicePixels = _props$useDevicePixel === void 0 ? true : _props$useDevicePixel,\n      framebuffer = props.framebuffer,\n      context = props.context;\n  (0, _assert.default)((0, _webgl.isWebGL)(gl) && framebuffer && position);\n\n  var _position = (0, _slicedToArray2.default)(position, 2),\n      x = _position[0],\n      y = _position[1]; // Match our picking framebuffer with the size of the canvas drawing buffer\n\n\n  framebuffer.resize({\n    width: gl.canvas.width,\n    height: gl.canvas.height\n  }); // Compensate for devicePixelRatio\n  // Note: this assumes the canvas framebuffer has been matched\n\n  var dpr = useDevicePixels ? getDevicePixelRatio() : 1; // Reverse the y coordinate\n\n  var deviceX = x * dpr;\n  var deviceY = gl.canvas.height - y * dpr; // return withParameters(gl, {\n  //   // framebuffer,\n  //   // // We are only interested in one pixel, no need to render anything else\n  //   // scissorTest: {x: deviceX, y: deviceY, w: 1, h: 1}\n  // }, () => {\n\n  var group = new _group.default({\n    children: models\n  });\n  return group.traverseReverse(function (model) {\n    if (model.pickable) {\n      // Clear the frame buffer\n      (0, _webgl.clear)(gl, {\n        framebuffer: framebuffer,\n        color: true,\n        depth: true\n      }); // Render picking colors\n\n      /* eslint-disable camelcase */\n\n      model.setUniforms({\n        picking_uActive: 1\n      });\n      model.draw(Object.assign({}, props, {\n        uniforms: uniforms,\n        parameters: parameters,\n        settings: settings,\n        framebuffer: framebuffer,\n        context: context\n      }));\n      model.setUniforms({\n        picking_uActive: 0\n      }); // Sample Read color in the central pixel, to be mapped as a picking color\n\n      var color = framebuffer.readPixels({\n        x: deviceX,\n        y: deviceY,\n        width: 1,\n        height: 1,\n        format: 6408,\n        type: 5121\n      });\n      var isPicked = color[0] !== 0 || color[1] !== 0 || color[2] !== 0; // Add the information to the stack\n\n      if (isPicked) {\n        return {\n          model: model,\n          color: color,\n          x: x,\n          y: y,\n          deviceX: deviceX,\n          deviceY: deviceY\n        };\n      }\n    }\n\n    return null;\n  }); // });\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"../webgl\":\"yQJr\",\"./group\":\"Sm8u\",\"../utils/assert\":\"iVaU\"}],\"eHdi\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.encodePickingColor = encodePickingColor;\nexports.decodePickingColor = decodePickingColor;\nexports.getNullPickingColor = getNullPickingColor;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NULL_PICKING_COLOR = new Uint8Array([0, 0, 0]); // Encodes an index as a Uint8Array([r, g, b]) format picking color\n\nfunction encodePickingColor(i) {\n  return [i + 1 & 255, i + 1 >> 8 & 255, i + 1 >> 16 & 255];\n} // Decodes a picking color in [r, g, b] format to an index\n\n\nfunction decodePickingColor(color) {\n  // assert(color instanceof Uint8Array);\n  var _color = (0, _slicedToArray2.default)(color, 3),\n      i1 = _color[0],\n      i2 = _color[1],\n      i3 = _color[2]; // 1 was added to seperate from no selection\n\n\n  var index = i1 + i2 * 256 + i3 * 65536 - 1;\n  return index;\n} // Return picking color representing no item at that pixel\n\n\nfunction getNullPickingColor() {\n  return NULL_PICKING_COLOR;\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\"}],\"Fhcd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.updateForTextures = updateForTextures;\nexports.getSizeUniforms = getSizeUniforms;\nexports.getVaryingType = getVaryingType;\nexports.processAttributeDefinition = processAttributeDefinition;\n\nvar _assert = _interopRequireDefault(require(\"assert\"));\n\nvar _src = require(\"../shadertools/src\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SAMPLER_UNIFORM_PREFIX = 'transform_uSampler_';\nvar SIZE_UNIFORM_PREFIX = 'transform_uSize_';\nvar VS_POS_VARIABLE = 'transform_position'; // Scan provided vertex shader\n// for each texture attribute, inject sampler instructions and build uniforms for sampler\n// for texture target, get varying type and inject position instruction\n\nfunction updateForTextures(_ref) {\n  var vs = _ref.vs,\n      sourceTextureMap = _ref.sourceTextureMap,\n      targetTextureVarying = _ref.targetTextureVarying,\n      targetTexture = _ref.targetTexture;\n  var texAttributeNames = Object.keys(sourceTextureMap);\n  var sourceCount = texAttributeNames.length;\n  var targetTextureType = null;\n  var samplerTextureMap = {};\n  var updatedVs = vs;\n  var finalInject = {};\n\n  if (sourceCount > 0 || targetTextureVarying) {\n    var vsLines = updatedVs.split('\\n');\n    var updateVsLines = vsLines.slice();\n    vsLines.forEach(function (line, index, lines) {\n      // TODO add early exit\n      if (sourceCount > 0) {\n        var updated = processAttributeDefinition(line, sourceTextureMap);\n\n        if (updated) {\n          var updatedLine = updated.updatedLine,\n              inject = updated.inject;\n          updateVsLines[index] = updatedLine; // sampleInstructions.push(sampleInstruction);\n\n          finalInject = (0, _src.combineInjects)([finalInject, inject]);\n          Object.assign(samplerTextureMap, updated.samplerTextureMap);\n          sourceCount--;\n        }\n      }\n\n      if (targetTextureVarying && !targetTextureType) {\n        targetTextureType = getVaryingType(line, targetTextureVarying);\n      }\n    });\n\n    if (targetTextureVarying) {\n      (0, _assert.default)(targetTexture);\n      var sizeName = \"\".concat(SIZE_UNIFORM_PREFIX).concat(targetTextureVarying);\n      var uniformDeclaration = \"uniform vec2 \".concat(sizeName, \";\\n\");\n      var posInstructions = \"     vec2 \".concat(VS_POS_VARIABLE, \" = transform_getPos(\").concat(sizeName, \");\\n     gl_Position = vec4(\").concat(VS_POS_VARIABLE, \", 0, 1.);\\n\");\n      var inject = {\n        'vs:#decl': uniformDeclaration,\n        'vs:#main-start': posInstructions\n      };\n      finalInject = (0, _src.combineInjects)([finalInject, inject]);\n    }\n\n    updatedVs = updateVsLines.join('\\n');\n  }\n\n  return {\n    // updated vertex shader (commented texture attribute definition)\n    vs: updatedVs,\n    // type (float, vec2, vec3 of vec4) target texture varying\n    targetTextureType: targetTextureType,\n    // required vertex and fragment shader injects\n    inject: finalInject,\n    // map of sampler name to texture name, can be used to set attributes\n    // usefull when swapping textures, as source and destination texture change when swap is called.\n    samplerTextureMap: samplerTextureMap\n  };\n} // builds and returns an object contaning size uniform for each texture\n\n\nfunction getSizeUniforms(_ref2) {\n  var sourceTextureMap = _ref2.sourceTextureMap,\n      targetTextureVarying = _ref2.targetTextureVarying,\n      targetTexture = _ref2.targetTexture;\n  var uniforms = {};\n  var width;\n  var height;\n\n  if (targetTextureVarying) {\n    width = targetTexture.width;\n    height = targetTexture.height;\n    uniforms[\"\".concat(SIZE_UNIFORM_PREFIX).concat(targetTextureVarying)] = [width, height];\n  }\n\n  for (var textureName in sourceTextureMap) {\n    var _sourceTextureMap$tex = sourceTextureMap[textureName];\n    width = _sourceTextureMap$tex.width;\n    height = _sourceTextureMap$tex.height;\n    uniforms[\"\".concat(SIZE_UNIFORM_PREFIX).concat(textureName)] = [width, height];\n  }\n\n  return uniforms;\n} // Checks if provided line is defining an attribute, if so returns details otherwise null\n\n\nfunction getAttributeDefinition(line) {\n  return (0, _src.getQualifierDetails)(line, ['attribute', 'in']);\n}\n\nfunction getSamplerDeclerations(textureName) {\n  var samplerName = \"\".concat(SAMPLER_UNIFORM_PREFIX).concat(textureName);\n  var sizeName = \"\".concat(SIZE_UNIFORM_PREFIX).concat(textureName);\n  var uniformDeclerations = \"  uniform sampler2D \".concat(samplerName, \";\\n  uniform vec2 \").concat(sizeName, \";\");\n  return {\n    samplerName: samplerName,\n    sizeName: sizeName,\n    uniformDeclerations: uniformDeclerations\n  };\n} // Return size (float, vec2 etc) of a given varying, null if doens't exist.\n\n\nfunction getVaryingType(line, varying) {\n  var qualaiferDetails = (0, _src.getQualifierDetails)(line, ['varying', 'out']);\n\n  if (!qualaiferDetails) {\n    return null;\n  }\n\n  return qualaiferDetails.name === varying ? qualaiferDetails.type : null;\n} // build required definitions, sample instructions for each texture attribute\n\n\nfunction processAttributeDefinition(line, textureMap) {\n  var samplerTextureMap = {};\n  var attributeData = getAttributeDefinition(line);\n\n  if (!attributeData) {\n    return null;\n  }\n\n  var type = attributeData.type,\n      name = attributeData.name;\n\n  if (name && textureMap[name]) {\n    var updatedLine = \"// \".concat(line, \" => Replaced by Transform with a sampler\");\n\n    var _getSamplerDecleratio = getSamplerDeclerations(name),\n        samplerName = _getSamplerDecleratio.samplerName,\n        sizeName = _getSamplerDecleratio.sizeName,\n        uniformDeclerations = _getSamplerDecleratio.uniformDeclerations;\n\n    var channels = (0, _src.typeToChannelSuffix)(type);\n    var sampleInstruction = \"  \".concat(type, \" \").concat(name, \" = transform_getInput(\").concat(samplerName, \", \").concat(sizeName, \").\").concat(channels, \";\\n\");\n    samplerTextureMap[samplerName] = name;\n    var inject = {\n      'vs:#decl': uniformDeclerations,\n      'vs:#main-start': sampleInstruction\n    }; // samplerNameMap\n\n    return {\n      // update vertex shader line.\n      updatedLine: updatedLine,\n      // inject object with sampler instructions.\n      inject: inject,\n      // sampler name to texture name map\n      samplerTextureMap: samplerTextureMap\n    };\n  }\n\n  return null;\n}\n},{\"assert\":\"azYr\",\"../shadertools/src\":\"H4AH\"}],\"TTgu\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/defineProperty\"));\n\nvar _model = _interopRequireDefault(require(\"./model\"));\n\nvar _buffer = _interopRequireDefault(require(\"../webgl/buffer\"));\n\nvar _framebuffer = _interopRequireDefault(require(\"../webgl/framebuffer\"));\n\nvar _texture2d = _interopRequireDefault(require(\"../webgl/texture-2d\"));\n\nvar _transformFeedback = _interopRequireDefault(require(\"../webgl/transform-feedback\"));\n\nvar _injectShader = require(\"../shadertools/src/lib/inject-shader\");\n\nvar _src = require(\"../shadertools/src\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _utils = require(\"../utils\");\n\nvar _transformShaderUtils = require(\"./transform-shader-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _SRC_TEX_PARAMETER_OV;\n\n// Texture parameters needed so sample can precisely pick pixel for given element id.\nvar SRC_TEX_PARAMETER_OVERRIDES = (_SRC_TEX_PARAMETER_OV = {}, (0, _defineProperty2.default)(_SRC_TEX_PARAMETER_OV, 10241, 9728), (0, _defineProperty2.default)(_SRC_TEX_PARAMETER_OV, 10240, 9728), (0, _defineProperty2.default)(_SRC_TEX_PARAMETER_OV, 10242, 33071), (0, _defineProperty2.default)(_SRC_TEX_PARAMETER_OV, 10243, 33071), _SRC_TEX_PARAMETER_OV);\nvar FS_OUTPUT_VARIABLE = 'transform_output';\n\nvar Transform =\n/*#__PURE__*/\nfunction () {\n  (0, _createClass2.default)(Transform, null, [{\n    key: \"isSupported\",\n    value: function isSupported(gl) {\n      // For now WebGL2 only\n      return (0, _webglUtils.isWebGL2)(gl);\n    }\n  }]);\n\n  function Transform(gl) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Transform);\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    this.gl = gl;\n    this.model = null;\n    this.elementCount = 0;\n    this.currentIndex = 0; // Source and destination resources are stored in two element Arrays for easier swapping when\n    // 'feedbackMap' is provided. If not only the first array elment is used.\n    // Each array element is an object with attribute name as Key and Buffer object as value.\n\n    this.sourceBuffers = new Array(2); // Each array element is an object with attribute name as Key and Texture object as value.\n\n    this.sourceTextures = new Array(2); // Each array element is an object with varying name as Key and Buffer object as value.\n\n    this.feedbackBuffers = new Array(2); // Each array element is a Texture object used as color attachment for framebuffer.\n\n    this.targetTextures = new Array(2); // Each array element is a TransformFeedback object.\n\n    this.transformFeedbacks = new Array(2); // Each array element is a Framebuffer object.\n\n    this.framebuffers = new Array(2);\n    this._createdBuffers = {};\n    this.elementIDBuffer = null; // reference source texture name for target texture\n\n    this._targetRefTexName = null;\n\n    this._initialize(props);\n\n    Object.seal(this);\n  } // Delete owned resources.\n\n\n  (0, _createClass2.default)(Transform, [{\n    key: \"delete\",\n    value: function _delete() {\n      for (var name in this._createdBuffers) {\n        this._createdBuffers[name].delete();\n      }\n\n      this.model.delete();\n    } // Return Buffer object for given varying name.\n\n  }, {\n    key: \"getBuffer\",\n    value: function getBuffer() {\n      var varyingName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n      var bufferOrParams = varyingName ? this.feedbackBuffers[this.currentIndex][varyingName] : null;\n\n      if (!bufferOrParams) {\n        return null;\n      }\n\n      return bufferOrParams instanceof _buffer.default ? bufferOrParams : bufferOrParams.buffer;\n    } // Returns the color attachment textuer from current framebuffer target\n\n  }, {\n    key: \"_getTargetTexture\",\n    value: function _getTargetTexture() {\n      if (this.framebuffers[this.currentIndex]) {\n        return this.framebuffers[this.currentIndex].attachments[36064];\n      }\n\n      return null;\n    } // Return data either from Buffer or from Texture\n\n  }, {\n    key: \"getData\",\n    value: function getData() {\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref$varyingName = _ref.varyingName,\n          varyingName = _ref$varyingName === void 0 ? null : _ref$varyingName,\n          _ref$packed = _ref.packed,\n          packed = _ref$packed === void 0 ? false : _ref$packed; // Either there should be specified feedbackBuffer or we should be rendering to a texture\n\n\n      var buffer = this.getBuffer(varyingName);\n\n      if (buffer) {\n        return buffer.getData();\n      } // When varyingName is not provided return data from framebuffer object.\n\n\n      (0, _assert.default)(!varyingName || varyingName === this.targetTextureVarying);\n      var pixels = this.framebuffers[this.currentIndex].readPixels();\n\n      if (!packed) {\n        return pixels;\n      } // readPixels returns 4 elements for each pixel, pack the elements when requested\n\n\n      var ArrayType = pixels.constructor;\n      var channelCount = (0, _src.typeToChannelCount)(this.targetTextureType);\n      var packedPixels = new ArrayType(pixels.length * channelCount / 4);\n      var packCount = 0;\n\n      for (var i = 0; i < pixels.length; i += 4) {\n        for (var j = 0; j < channelCount; j++) {\n          packedPixels[packCount++] = pixels[i + j];\n        }\n      }\n\n      return packedPixels;\n    } // returns current framebuffer object that is being used.\n\n  }, {\n    key: \"getFramebuffer\",\n    value: function getFramebuffer() {\n      return this.framebuffers[this.currentIndex];\n    }\n  }, {\n    key: \"_getInputs\",\n    value: function _getInputs() {\n      var uniforms = {};\n      var current = this.currentIndex; // Buffer inputs\n\n      var attributes = Object.assign({}, this.sourceBuffers[current]); // Texture inputs\n\n      if (this.hasSourceTextures || this.targetTextureVarying) {\n        // TODO: add option not generate position using element id.\n        attributes.transform_elementID = this.elementIDBuffer;\n\n        for (var sampler in this.samplerTextureMap) {\n          var textureName = this.samplerTextureMap[sampler];\n          uniforms[sampler] = this.sourceTextures[current][textureName];\n        } // Also update size uniforms , add samplerSizeMap\n\n\n        this._setSourceTextureParameters(); // get texture size uniforms\n\n\n        var sizeUniforms = (0, _transformShaderUtils.getSizeUniforms)({\n          sourceTextureMap: this.sourceTextures[current],\n          targetTextureVarying: this.targetTextureVarying,\n          targetTexture: this.targetTextures[current]\n        });\n        Object.assign(uniforms, sizeUniforms);\n      }\n\n      return {\n        attributes: attributes,\n        uniforms: uniforms\n      };\n    } // Run one transform feedback loop.\n\n  }, {\n    key: \"run\",\n    value: function run() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      var _this$_getInputs = this._getInputs(),\n          attributes = _this$_getInputs.attributes,\n          uniforms = _this$_getInputs.uniforms;\n\n      Object.assign(uniforms, opts.uniforms);\n      var parameters = Object.assign({}, opts.parameters);\n      var _opts$clearRenderTarg = opts.clearRenderTarget,\n          clearRenderTarget = _opts$clearRenderTarg === void 0 ? true : _opts$clearRenderTarg;\n      var framebuffer = null;\n      var discard = true;\n\n      if (this.renderingToTexture) {\n        discard = false;\n        framebuffer = this.framebuffers[this.currentIndex];\n        (0, _assert.default)(framebuffer);\n        parameters.viewport = [0, 0, framebuffer.width, framebuffer.height];\n\n        if (clearRenderTarget) {\n          this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n        }\n      }\n\n      this.model.setAttributes(attributes);\n      this.model.transform(Object.assign({}, opts, {\n        transformFeedback: this.transformFeedbacks[this.currentIndex],\n        uniforms: uniforms,\n        discard: discard,\n        framebuffer: framebuffer,\n        parameters: parameters\n      }));\n    } // Swap source and destination buffers and textures.\n\n  }, {\n    key: \"swapBuffers\",\n    value: function swapBuffers() {\n      _utils.log.deprecated('swapBuffers()', 'swap()');\n\n      this.swap();\n    } // Swap source and destination buffers and textures.\n\n  }, {\n    key: \"swap\",\n    value: function swap() {\n      (0, _assert.default)(this.feedbackMap || this._swapTexture);\n      this.currentIndex = (this.currentIndex + 1) % 2;\n    } // Update some or all buffer bindings.\n\n  }, {\n    key: \"update\",\n    value: function update() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      if (opts.elementCount) {\n        this._setElementCount(opts.elementCount);\n      }\n\n      var _opts$sourceBuffers = opts.sourceBuffers,\n          sourceBuffers = _opts$sourceBuffers === void 0 ? null : _opts$sourceBuffers,\n          _opts$feedbackBuffers = opts.feedbackBuffers,\n          feedbackBuffers = _opts$feedbackBuffers === void 0 ? null : _opts$feedbackBuffers;\n      var currentIndex = this.currentIndex;\n\n      if (sourceBuffers || feedbackBuffers) {\n        for (var bufferName in feedbackBuffers) {\n          (0, _assert.default)(feedbackBuffers[bufferName] instanceof _buffer.default || feedbackBuffers[bufferName].buffer instanceof _buffer.default);\n        }\n\n        Object.assign(this.sourceBuffers[currentIndex], sourceBuffers);\n        Object.assign(this.feedbackBuffers[currentIndex], feedbackBuffers);\n\n        this._createFeedbackBuffers({\n          feedbackBuffers: feedbackBuffers\n        });\n\n        if (this.transformFeedbacks[currentIndex]) {\n          this.transformFeedbacks[currentIndex].setBuffers(this.feedbackBuffers[currentIndex]);\n        } // Buffers have changed, need to re-setup swap buffers.\n\n\n        this._setupSwapBuffers();\n      }\n\n      var _sourceTextures = opts._sourceTextures,\n          _targetTexture = opts._targetTexture;\n\n      if (_sourceTextures || _targetTexture) {\n        Object.assign(this.sourceTextures[currentIndex], _sourceTextures); // if _targetTexture specified use it, other wise rebuild traget texture using\n        // '_targetRefTexName' as coresponding source texture may have been update.\n\n        this._updateTargetTexture(_targetTexture || this._targetRefTexName, currentIndex); // textures have changed, need to re-setup swap textures.\n\n\n        this._setupSwapTextures();\n      }\n    } // set texture filtering parameters on source textures.\n\n  }, {\n    key: \"_setSourceTextureParameters\",\n    value: function _setSourceTextureParameters() {\n      var index = this.currentIndex;\n\n      for (var name in this.sourceTextures[index]) {\n        this.sourceTextures[index][name].setParameters(SRC_TEX_PARAMETER_OVERRIDES);\n      }\n    } // set element count and updated elementID buffer if needed.\n\n  }, {\n    key: \"_setElementCount\",\n    value: function _setElementCount(elementCount) {\n      if (this.elementCount === elementCount) {\n        return;\n      }\n\n      if (this.elementCount < elementCount) {\n        this._updateElementIDBuffer(elementCount);\n      }\n\n      this.model.setVertexCount(elementCount);\n      this.elementCount = elementCount;\n    } // sets target texture for rendering by updating framebuffer\n\n  }, {\n    key: \"_updateTargetTexture\",\n    value: function _updateTargetTexture(texture, index) {\n      var targetTexture = this._buildTargetTexture(texture);\n\n      if (targetTexture) {\n        this.targetTextures[index] = targetTexture;\n\n        if (this.framebuffers[index]) {\n          // First update texture without re-sizing attachments\n          this.framebuffers[index].update({\n            attachments: (0, _defineProperty2.default)({}, 36064, this.targetTextures[index]),\n            resizeAttachments: false\n          }); // Resize to new taget texture size\n\n          this.framebuffers[index].resize({\n            width: targetTexture.width,\n            height: targetTexture.height\n          });\n        }\n      }\n    } // Private\n\n  }, {\n    key: \"_initialize\",\n    value: function _initialize() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      var _this$_validateProps = this._validateProps(props),\n          feedbackBuffers = _this$_validateProps.feedbackBuffers,\n          feedbackMap = _this$_validateProps.feedbackMap;\n\n      var sourceBuffers = props.sourceBuffers,\n          varyings = props.varyings,\n          _targetTexture = props._targetTexture,\n          _targetTextureVarying = props._targetTextureVarying,\n          _swapTexture = props._swapTexture;\n      var varyingsArray = varyings;\n\n      if (feedbackMap && !Array.isArray(varyings)) {\n        varyingsArray = Object.values(feedbackMap);\n      }\n\n      this.varyingsArray = varyingsArray;\n      this.feedbackMap = feedbackMap;\n      this._swapTexture = _swapTexture;\n\n      if (_targetTexture) {\n        this.targetTextureVarying = _targetTextureVarying;\n        this.renderingToTexture = true;\n        (0, _assert.default)(this.targetTextureVarying);\n      }\n\n      this._setupBuffers({\n        sourceBuffers: sourceBuffers,\n        feedbackBuffers: feedbackBuffers\n      });\n\n      this._setupTextures(props);\n\n      this._setupSwapBuffers();\n\n      this._setupSwapTextures();\n\n      this._buildModel(Object.assign({}, props, {\n        id: props.id || 'transform-model',\n        drawMode: props.drawMode || 0,\n        varyings: varyingsArray\n      }));\n    } // assert on required parameters\n\n    /* eslint-disable complexity */\n\n  }, {\n    key: \"_validateProps\",\n    value: function _validateProps(props) {\n      var feedbackBuffers = props.feedbackBuffers,\n          feedbackMap = props.feedbackMap; // backward compitability\n\n      var destinationBuffers = props.destinationBuffers,\n          sourceDestinationMap = props.sourceDestinationMap;\n\n      if (destinationBuffers) {\n        _utils.log.deprecated('destinationBuffers', 'feedbackBuffers')();\n\n        feedbackBuffers = feedbackBuffers || destinationBuffers;\n      }\n\n      if (sourceDestinationMap) {\n        _utils.log.deprecated('sourceDestinationMap', 'feedbackMap')();\n\n        feedbackMap = feedbackMap || sourceDestinationMap;\n      } // assert on required parameters\n\n\n      var vs = props.vs,\n          elementCount = props.elementCount,\n          varyings = props.varyings;\n      var _sourceTextures = props._sourceTextures,\n          _targetTexture = props._targetTexture,\n          _targetTextureVarying = props._targetTextureVarying,\n          _swapTexture = props._swapTexture;\n      (0, _assert.default)(vs && ( // destinations are provided\n      varyings || feedbackMap || _targetTexture) && // when only writting to textures auto-duduce from texture dimenstions\n      elementCount);\n\n      for (var bufferName in feedbackBuffers || {}) {\n        (0, _assert.default)(feedbackBuffers[bufferName] instanceof _buffer.default || feedbackBuffers[bufferName].buffer instanceof _buffer.default);\n      }\n\n      for (var textureName in _sourceTextures || {}) {\n        (0, _assert.default)(_sourceTextures[textureName] instanceof _texture2d.default);\n      } // If rendering to texture , varying is provided\n\n\n      (0, _assert.default)(!_targetTexture || _targetTextureVarying); // swap texture must be a valid source texture\n\n      (0, _assert.default)(!_swapTexture || _sourceTextures[_swapTexture]);\n      return {\n        feedbackBuffers: feedbackBuffers,\n        feedbackMap: feedbackMap\n      };\n    }\n    /* eslint-enable complexity */\n    // setup source and destination buffers\n\n  }, {\n    key: \"_setupBuffers\",\n    value: function _setupBuffers(_ref2) {\n      var _ref2$sourceBuffers = _ref2.sourceBuffers,\n          sourceBuffers = _ref2$sourceBuffers === void 0 ? null : _ref2$sourceBuffers,\n          _ref2$feedbackBuffers = _ref2.feedbackBuffers,\n          feedbackBuffers = _ref2$feedbackBuffers === void 0 ? null : _ref2$feedbackBuffers;\n      this.sourceBuffers[0] = Object.assign({}, sourceBuffers);\n      this.feedbackBuffers[0] = Object.assign({}, feedbackBuffers);\n\n      this._createFeedbackBuffers({\n        feedbackBuffers: feedbackBuffers\n      });\n\n      this.sourceBuffers[1] = {};\n      this.feedbackBuffers[1] = {};\n    } // setup source and destination textures\n\n  }, {\n    key: \"_setupTextures\",\n    value: function _setupTextures() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var _sourceTextures = props._sourceTextures,\n          _targetTexture = props._targetTexture; // Setup source texture\n\n      this.sourceTextures[0] = Object.assign({}, _sourceTextures);\n      this.sourceTextures[1] = {};\n      this.hasSourceTextures = Object.keys(this.sourceTextures[0]).length > 0;\n\n      if (this.targetTextureVarying) {\n        var texture = this._buildTargetTexture(_targetTexture); // Either a texture or refAttribute must be provided\n\n\n        (0, _assert.default)(texture);\n        this.targetTextures[0] = texture;\n        this.targetTextures[1] = null;\n      }\n    } // Builds target texture using source reference or provided texture object.\n\n  }, {\n    key: \"_buildTargetTexture\",\n    value: function _buildTargetTexture(textureOrAttribute) {\n      var _parameters;\n\n      if (textureOrAttribute instanceof _texture2d.default) {\n        return textureOrAttribute;\n      }\n\n      var refTexture = this.sourceTextures[0][textureOrAttribute];\n\n      if (!refTexture) {\n        return null;\n      } // save reference texture name, when corresponding source texture is updated\n      // we also update target texture.\n\n\n      this._targetRefTexName = textureOrAttribute;\n      return (0, _webglUtils.cloneTextureFrom)(refTexture, {\n        parameters: (_parameters = {}, (0, _defineProperty2.default)(_parameters, 10241, 9728), (0, _defineProperty2.default)(_parameters, 10240, 9728), (0, _defineProperty2.default)(_parameters, 10242, 33071), (0, _defineProperty2.default)(_parameters, 10243, 33071), _parameters),\n        pixelStore: (0, _defineProperty2.default)({}, 37440, false)\n      });\n    } // auto create any feedback buffers\n\n  }, {\n    key: \"_createFeedbackBuffers\",\n    value: function _createFeedbackBuffers(_ref3) {\n      var feedbackBuffers = _ref3.feedbackBuffers;\n\n      if (!this.feedbackMap) {\n        // feedbackMap required to auto create buffers.\n        return;\n      }\n\n      var current = this.currentIndex;\n\n      for (var sourceBufferName in this.feedbackMap) {\n        var feedbackBufferName = this.feedbackMap[sourceBufferName];\n\n        if (feedbackBufferName !== this.targetTextureVarying && (!feedbackBuffers || !feedbackBuffers[feedbackBufferName])) {\n          // Create new buffer with same layout and settings as source buffer\n          var sourceBuffer = this.sourceBuffers[current][sourceBufferName];\n          var bytes = sourceBuffer.bytes,\n              type = sourceBuffer.type,\n              usage = sourceBuffer.usage,\n              accessor = sourceBuffer.accessor;\n          var buffer = new _buffer.default(this.gl, {\n            bytes: bytes,\n            type: type,\n            usage: usage,\n            accessor: accessor\n          });\n\n          if (this._createdBuffers[feedbackBufferName]) {\n            this._createdBuffers[feedbackBufferName].delete();\n          }\n\n          this._createdBuffers[feedbackBufferName] = buffer;\n          this.feedbackBuffers[current][feedbackBufferName] = buffer;\n        }\n      }\n    } // Create a buffer and add to list of buffers to be deleted.\n\n  }, {\n    key: \"_createNewBuffer\",\n    value: function _createNewBuffer(name, opts) {\n      var buffer = new _buffer.default(this.gl, opts);\n\n      if (this._createdBuffers[name]) {\n        this._createdBuffers[name].delete();\n\n        this._createdBuffers[name] = buffer;\n      }\n\n      return buffer;\n    } // setup buffers for swapping.\n    // Second set of source and feedback objects are setup to point\n    // to corresponding feedback and source buffers.\n\n  }, {\n    key: \"_setupSwapBuffers\",\n    value: function _setupSwapBuffers() {\n      if (!this.feedbackMap) {\n        // feedbackMap required set up swap buffers.\n        return;\n      }\n\n      var current = this.currentIndex;\n      var next = (current + 1) % 2; // Copy all buffers/textures so un-mapped sources will remain same\n\n      Object.assign(this.sourceBuffers[next], this.sourceBuffers[current]);\n      Object.assign(this.feedbackBuffers[next], this.feedbackBuffers[current]);\n\n      for (var srcName in this.feedbackMap) {\n        var dstName = this.feedbackMap[srcName]; // TODO: add textureMap and remove this if loop\n\n        if (dstName !== this.targetTextureVarying) {\n          this.sourceBuffers[next][srcName] = this.feedbackBuffers[current][dstName];\n          this.feedbackBuffers[next][dstName] = this.sourceBuffers[current][srcName]; // make sure the new destination buffer is a Buffer object\n\n          (0, _assert.default)(this.feedbackBuffers[next][dstName] instanceof _buffer.default);\n        }\n      } // When triggered by `update()` TranformFeedback objects are already set up,\n      // if so update buffers\n\n\n      if (this.transformFeedbacks[next]) {\n        this.transformFeedbacks[next].setBuffers(this.feedbackBuffers[next]);\n      } // TODO: add swap support for targetTexture and framebuffers\n\n    } // setup textures for swapping.\n\n  }, {\n    key: \"_setupSwapTextures\",\n    value: function _setupSwapTextures() {\n      if (!this._swapTexture || !this.targetTextureVarying) {\n        // Must be rendering to a texture and _swapTexture is provided\n        return;\n      }\n\n      var current = this.currentIndex;\n      var next = (current + 1) % 2;\n      Object.assign(this.sourceTextures[next], this.sourceTextures[current]);\n      this.sourceTextures[next][this._swapTexture] = this.targetTextures[current];\n\n      this._updateTargetTexture(this.sourceTextures[current][this._swapTexture], next);\n    } // build Model and TransformFeedback objects\n\n  }, {\n    key: \"_buildModel\",\n    value: function _buildModel() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      var _this$_getShaders = this._getShaders(props),\n          vs = _this$_getShaders.vs,\n          fs = _this$_getShaders.fs,\n          modules = _this$_getShaders.modules,\n          uniforms = _this$_getShaders.uniforms,\n          inject = _this$_getShaders.inject,\n          samplerTextureMap = _this$_getShaders.samplerTextureMap;\n\n      this.model = new _model.default(this.gl, Object.assign({}, props, {\n        vs: vs,\n        fs: fs,\n        vertexCount: props.elementCount,\n        modules: modules,\n        uniforms: uniforms,\n        inject: inject\n      }));\n      this.samplerTextureMap = samplerTextureMap; // setup TF to capture varyings.\n\n      this._setupTransformFeedback(); // setup Framebuffer object for rendering to Texture.\n\n\n      this._setupFramebuffers(); // create buffer to access source texture pixesl.\n\n\n      this._setElementCount(props.elementCount);\n    } // setup TransformFeedback objects to capture the results\n\n  }, {\n    key: \"_setupTransformFeedback\",\n    value: function _setupTransformFeedback() {\n      if ((0, _utils.isObjectEmpty)(this.feedbackBuffers[0])) {\n        return;\n      }\n\n      this.transformFeedbacks[0] = new _transformFeedback.default(this.gl, {\n        program: this.model.program,\n        buffers: this.feedbackBuffers[0]\n      }); // If buffers are swappable setup second transform feedback object.\n\n      if (this.feedbackMap) {\n        this.transformFeedbacks[1] = new _transformFeedback.default(this.gl, {\n          program: this.model.program,\n          buffers: this.feedbackBuffers[1]\n        });\n      }\n    } // setup framebuffers with texture attachments, to which results are rendered\n\n  }, {\n    key: \"_setupFramebuffers\",\n    value: function _setupFramebuffers() {\n      if (!this.renderingToTexture) {\n        return;\n      }\n\n      var _this$targetTextures$ = this.targetTextures[0],\n          width = _this$targetTextures$.width,\n          height = _this$targetTextures$.height;\n      this.framebuffers[0] = new _framebuffer.default(this.gl, {\n        id: \"\".concat(this.id || 'transform', \"-framebuffer-0\"),\n        width: width,\n        height: height,\n        attachments: (0, _defineProperty2.default)({}, 36064, this.targetTextures[0])\n      });\n\n      if (this._swapTexture) {\n        var _this$targetTextures$2 = this.targetTextures[1];\n        width = _this$targetTextures$2.width;\n        height = _this$targetTextures$2.height;\n        this.framebuffers[1] = new _framebuffer.default(this.gl, {\n          id: \"\".concat(this.id || 'transform', \"-framebuffer-1\"),\n          width: width,\n          height: height,\n          attachments: (0, _defineProperty2.default)({}, 36064, this.targetTextures[1])\n        });\n      }\n    } // create/update buffer to access source texture's individual pixels.\n\n  }, {\n    key: \"_updateElementIDBuffer\",\n    value: function _updateElementIDBuffer(elementCount) {\n      if (!this.hasSourceTextures && !this.targetTextureVarying) {\n        return;\n      } // NOTE: using float so this will work with GLSL 1.0 shaders.\n\n\n      var elementIds = new Float32Array(elementCount);\n      elementIds.forEach(function (_, index, array) {\n        array[index] = index;\n      });\n\n      if (!this.elementIDBuffer) {\n        this.elementIDBuffer = new _buffer.default(this.gl, {\n          data: elementIds,\n          size: 1\n        });\n      } else {\n        this.elementIDBuffer.setData({\n          data: elementIds\n        });\n      }\n    } // build and return shader releated parameters\n\n  }, {\n    key: \"_getShaders\",\n    value: function _getShaders() {\n      var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      var _this$_processVertexS = this._processVertexShader(props.vs),\n          vs = _this$_processVertexS.vs,\n          uniforms = _this$_processVertexS.uniforms,\n          targetTextureType = _this$_processVertexS.targetTextureType,\n          inject = _this$_processVertexS.inject,\n          samplerTextureMap = _this$_processVertexS.samplerTextureMap;\n\n      var combinedInject = (0, _injectShader.combineInjects)([props.inject || {}, inject]);\n      this.targetTextureType = targetTextureType;\n      var fs = (0, _src.getPassthroughFS)({\n        version: (0, _webglUtils.getShaderVersion)(vs),\n        input: this.targetTextureVarying,\n        inputType: targetTextureType,\n        output: FS_OUTPUT_VARIABLE\n      });\n      var modules = this.hasSourceTextures || this.targetTextureVarying ? [_src._transform].concat(props.modules || []) : props.modules;\n      return {\n        vs: vs,\n        fs: fs,\n        modules: modules,\n        uniforms: uniforms,\n        inject: combinedInject,\n        samplerTextureMap: samplerTextureMap\n      };\n    } // scan and update vertex shader for texture atrributes.\n\n  }, {\n    key: \"_processVertexShader\",\n    value: function _processVertexShader(vs) {\n      return (0, _transformShaderUtils.updateForTextures)({\n        vs: vs,\n        sourceTextureMap: this.sourceTextures[this.currentIndex],\n        targetTextureVarying: this.targetTextureVarying,\n        targetTexture: this.targetTextures[this.currentIndex]\n      });\n    }\n  }]);\n  return Transform;\n}();\n\nexports.default = Transform;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/defineProperty\":\"gpd2\",\"./model\":\"DSwH\",\"../webgl/buffer\":\"IZPG\",\"../webgl/framebuffer\":\"V5nt\",\"../webgl/texture-2d\":\"aCs7\",\"../webgl/transform-feedback\":\"vegQ\",\"../shadertools/src/lib/inject-shader\":\"gZC3\",\"../shadertools/src\":\"H4AH\",\"../webgl-utils\":\"CTd0\",\"../utils/assert\":\"iVaU\",\"../utils\":\"B7AM\",\"./transform-shader-utils\":\"Fhcd\"}],\"VTa7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _shader = require(\"../webgl/shader\");\n\nvar _program = _interopRequireDefault(require(\"../webgl/program\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ShaderCache =\n/*#__PURE__*/\nfunction () {\n  /**\n   * A cache of compiled shaders, keyed by shader source strings.\n   * Compilation of long shaders can be time consuming.\n   * By using this class, the application can ensure that each shader\n   * is only compiled once.\n   */\n  function ShaderCache() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        gl = _ref.gl,\n        _ref$_cachePrograms = _ref._cachePrograms,\n        _cachePrograms = _ref$_cachePrograms === void 0 ? false : _ref$_cachePrograms;\n\n    (0, _classCallCheck2.default)(this, ShaderCache);\n    (0, _assert.default)(gl);\n    this.gl = gl;\n    this.vertexShaders = {};\n    this.fragmentShaders = {};\n    this.programs = {};\n    this._cachePrograms = _cachePrograms;\n  }\n  /**\n   * Deletes shader references\n   * @return {ShaderCache} - returns this for chaining\n   */\n\n\n  (0, _createClass2.default)(ShaderCache, [{\n    key: \"delete\",\n    value: function _delete() {\n      // TODO - requires reference counting to avoid deleting shaders in use\n      return this;\n    }\n    /**\n     * Returns a compiled `VertexShader` object corresponding to the supplied\n     * GLSL source code string, if possible from cache.\n     *\n     * @param {WebGLRenderingContext} gl - gl context\n     * @param {String} source - Source code for shader\n     * @return {VertexShader} - a compiled vertex shader\n     */\n\n  }, {\n    key: \"getVertexShader\",\n    value: function getVertexShader(gl, source) {\n      (0, _assert.default)(typeof source === 'string');\n      (0, _assert.default)(this._compareContexts(gl, this.gl));\n      var shader = this.vertexShaders[source];\n\n      if (!shader) {\n        shader = new _shader.VertexShader(gl, source);\n        this.vertexShaders[source] = shader;\n      }\n\n      return shader;\n    }\n    /**\n     * Returns a compiled `VertexShader` object corresponding to the supplied\n     * GLSL source code string, if possible from cache.\n     * @param {WebGLRenderingContext} gl - gl context\n     * @param {String} source - Source code for shader\n     * @return {FragmentShader} - a compiled fragment shader, possibly from chache\n     */\n\n  }, {\n    key: \"getFragmentShader\",\n    value: function getFragmentShader(gl, source) {\n      (0, _assert.default)(typeof source === 'string');\n      (0, _assert.default)(this._compareContexts(gl, this.gl));\n      var shader = this.fragmentShaders[source];\n\n      if (!shader) {\n        shader = new _shader.FragmentShader(gl, source);\n        this.fragmentShaders[source] = shader;\n      }\n\n      return shader;\n    } // Retrive Shaders from cache if exists, otherwise create new instance.\n\n  }, {\n    key: \"getProgram\",\n    value: function getProgram(gl, opts) {\n      (0, _assert.default)(this._compareContexts(gl, this.gl));\n      (0, _assert.default)(typeof opts.vs === 'string');\n      (0, _assert.default)(typeof opts.fs === 'string');\n      (0, _assert.default)(typeof opts.id === 'string');\n\n      var cacheKey = this._getProgramKey(opts);\n\n      var program = this.programs[cacheKey];\n\n      if (program) {\n        this._resetProgram(program);\n\n        return program;\n      }\n\n      program = this._createNewProgram(gl, opts); // Check if program can be cached\n      // Program caching is experimental and expects\n      // each Model to have a unique-id (wich is used in key generation)\n\n      if (this._cachePrograms && this._checkProgramProp(program)) {\n        program._isCached = true;\n        this.programs[cacheKey] = program;\n      }\n\n      return program;\n    }\n  }, {\n    key: \"_getProgramKey\",\n    value: function _getProgramKey(opts) {\n      return \"\".concat(opts.id, \"-\").concat(opts.vs, \"-\").concat(opts.fs);\n    }\n  }, {\n    key: \"_checkProgramProp\",\n    value: function _checkProgramProp(program) {\n      // Check for transform feedback props (varyings, etc), we can't key such programs for now\n      return !program.varyings;\n    }\n  }, {\n    key: \"_createNewProgram\",\n    value: function _createNewProgram(gl, opts) {\n      var vs = opts.vs,\n          fs = opts.fs;\n      var vertexShader = this.getVertexShader(gl, vs);\n      var fragmentShader = this.getFragmentShader(gl, fs);\n      return new _program.default(this.gl, Object.assign({}, opts, {\n        vs: vertexShader,\n        fs: fragmentShader\n      }));\n    }\n  }, {\n    key: \"_resetProgram\",\n    value: function _resetProgram(program, opts) {\n      program.reset();\n    } // Handle debug contexts\n\n  }, {\n    key: \"_compareContexts\",\n    value: function _compareContexts(gl1, gl2) {\n      return (gl1.gl || gl1) === (gl2.gl || gl2);\n    }\n  }]);\n  return ShaderCache;\n}();\n\nexports.default = ShaderCache;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../webgl/shader\":\"Y9vu\",\"../webgl/program\":\"xVcT\",\"../utils/assert\":\"iVaU\"}],\"eWAK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _webglContext = require(\"../webgl-context\");\n\nvar _webglUtils = require(\"../webgl-utils\");\n\nvar _utils = require(\"../utils\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* global window, Worker */\nvar AnimationLoopProxy =\n/*#__PURE__*/\nfunction () {\n  (0, _createClass2.default)(AnimationLoopProxy, null, [{\n    key: \"createWorker\",\n    // Create the script for the rendering worker.\n    // @param opts {object} - options to construct an AnimationLoop instance\n    value: function createWorker(animationLoop) {\n      return function (self) {\n        animationLoop.setProps({\n          // Prevent the animation loop from trying to access DOM properties\n          useDevicePixels: false,\n          autoResizeDrawingBuffer: false\n        });\n        self.canvas = null;\n\n        function initializeCanvas(canvas) {\n          var eventHandlers = new Map();\n\n          canvas.addEventListener = function (type, handler) {\n            self.postMessage({\n              command: 'addEventListener',\n              type: type\n            });\n\n            if (!eventHandlers.has(type)) {\n              eventHandlers.set(type, []);\n            }\n\n            eventHandlers.get(type).push(handler);\n          };\n\n          canvas.removeEventListener = function (type, handler) {\n            self.postMessage({\n              command: 'removeEventListener',\n              type: type\n            });\n            var handlers = eventHandlers.get(type);\n\n            if (handlers) {\n              handlers.splice(handlers.indexOf(handler), 1);\n            }\n          };\n\n          canvas.dispatchEvent = function (type, event) {\n            var handlers = eventHandlers.get(type);\n\n            if (handlers) {\n              handlers.forEach(function (handler) {\n                return handler(event);\n              });\n            }\n          };\n\n          self.canvas = canvas;\n        }\n\n        self.addEventListener('message', function (evt) {\n          switch (evt.data.command) {\n            case 'start':\n              initializeCanvas(evt.data.opts.canvas);\n              animationLoop.start(evt.data.opts);\n              break;\n\n            case 'stop':\n              animationLoop.stop();\n              break;\n\n            case 'resize':\n              self.canvas.width = evt.data.width;\n              self.canvas.height = evt.data.height;\n              break;\n\n            case 'event':\n              self.canvas.dispatchEvent(evt.data.type, evt.data.event);\n              break;\n\n            default:\n          }\n        });\n      };\n    }\n    /*\n     * @param {HTMLCanvasElement} canvas - if provided, width and height will be passed to context\n     */\n\n  }]);\n\n  function AnimationLoopProxy(worker) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, AnimationLoopProxy);\n    var _opts$onInitialize = opts.onInitialize,\n        onInitialize = _opts$onInitialize === void 0 ? function () {} : _opts$onInitialize,\n        _opts$onFinalize = opts.onFinalize,\n        onFinalize = _opts$onFinalize === void 0 ? function () {} : _opts$onFinalize,\n        _opts$useDevicePixels = opts.useDevicePixels,\n        useDevicePixels = _opts$useDevicePixels === void 0 ? true : _opts$useDevicePixels,\n        _opts$autoResizeDrawi = opts.autoResizeDrawingBuffer,\n        autoResizeDrawingBuffer = _opts$autoResizeDrawi === void 0 ? true : _opts$autoResizeDrawi;\n    this.props = {\n      onInitialize: onInitialize,\n      onFinalize: onFinalize\n    };\n    this.setProps({\n      autoResizeDrawingBuffer: autoResizeDrawingBuffer,\n      useDevicePixels: useDevicePixels\n    }); // state\n\n    (0, _assert.default)(worker instanceof Worker);\n    this.worker = worker;\n    this.canvas = null;\n    this.width = null;\n    this.height = null;\n    this._stopped = true;\n    this._animationFrameId = null;\n    this._startPromise = null; // bind methods\n\n    this._onMessage = this._onMessage.bind(this);\n    this._onEvent = this._onEvent.bind(this);\n    this._updateFrame = this._updateFrame.bind(this);\n  }\n\n  (0, _createClass2.default)(AnimationLoopProxy, [{\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('autoResizeDrawingBuffer' in props) {\n        this.autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;\n      }\n\n      if ('useDevicePixels' in props) {\n        this.useDevicePixels = props.useDevicePixels;\n      }\n\n      return this;\n    }\n    /* Public methods */\n    // Starts a render loop if not already running\n\n  }, {\n    key: \"start\",\n    value: function start() {\n      var _this = this;\n\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      this._stopped = false; // console.debug(`Starting ${this.constructor.name}`);\n\n      if (!this._animationFrameId) {\n        this.worker.onmessage = this._onMessage; // Wait for start promise before rendering frame\n\n        this._startPromise = (0, _webglContext.getPageLoadPromise)().then(function () {\n          _this._createAndTransferCanvas(opts);\n\n          return _this.props.onInitialize(_this);\n        }).then(function () {\n          if (!_this._stopped) {\n            _this._animationFrameId = (0, _webglUtils.requestAnimationFrame)(_this._updateFrame);\n          }\n        });\n      }\n\n      return this;\n    } // Stops a render loop if already running, finalizing\n\n  }, {\n    key: \"stop\",\n    value: function stop() {\n      if (this._animationFrameId) {\n        (0, _webglUtils.cancelAnimationFrame)(this._animationFrameId);\n        this._animationFrameId = null;\n        this._stopped = true;\n        this.props.onFinalize(this);\n      }\n\n      this.worker.postMessage({\n        command: 'stop'\n      });\n      return this;\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_onMessage\",\n    value: function _onMessage(evt) {\n      switch (evt.data.command) {\n        case 'addEventListener':\n          this.canvas.addEventListener(evt.data.type, this._onEvent);\n          break;\n\n        case 'removeEventListener':\n          this.canvas.removeEventListener(evt.data.type, this._onEvent);\n          break;\n\n        default:\n      }\n    }\n  }, {\n    key: \"_onEvent\",\n    value: function _onEvent(evt) {\n      var devicePixelRatio = this.useDevicePixels ? window.devicePixelRatio || 1 : 1;\n      var type = evt.type;\n      var safeEvent = {};\n\n      for (var key in evt) {\n        var value = evt[key];\n        var valueType = (0, _typeof2.default)(value);\n\n        if (key === 'offsetX' || key === 'offsetY') {\n          value *= devicePixelRatio;\n        }\n\n        if (valueType === 'number' || valueType === 'boolean' || valueType === 'string') {\n          safeEvent[key] = value;\n        }\n      }\n\n      this.worker.postMessage({\n        command: 'event',\n        type: type,\n        event: safeEvent\n      });\n    }\n  }, {\n    key: \"_updateFrame\",\n    value: function _updateFrame() {\n      this._resizeCanvasDrawingBuffer();\n\n      this._animationFrameId = (0, _webglUtils.requestAnimationFrame)(this._updateFrame);\n    }\n  }, {\n    key: \"_createAndTransferCanvas\",\n    value: function _createAndTransferCanvas(opts) {\n      // Create a canvas on the main thread\n      var screenCanvas = (0, _webglContext.getCanvas)(opts); // Create an offscreen canvas controlling the main canvas\n\n      if (!screenCanvas.transferControlToOffscreen) {\n        _utils.log.error('OffscreenCanvas is not available in your browser.')(); // eslint-disable-line\n\n      }\n\n      var offscreenCanvas = screenCanvas.transferControlToOffscreen(); // Transfer the offscreen canvas to the worker\n\n      this.worker.postMessage({\n        command: 'start',\n        opts: Object.assign({}, opts, {\n          canvas: offscreenCanvas\n        })\n      }, [offscreenCanvas]); // store the main canvas on the local thread\n\n      this.canvas = screenCanvas;\n    }\n  }, {\n    key: \"_resizeCanvasDrawingBuffer\",\n    value: function _resizeCanvasDrawingBuffer() {\n      if (this.autoResizeDrawingBuffer) {\n        var devicePixelRatio = this.useDevicePixels ? window.devicePixelRatio || 1 : 1;\n        var width = this.canvas.clientWidth * devicePixelRatio;\n        var height = this.canvas.clientHeight * devicePixelRatio;\n\n        if (this.width !== width || this.height !== height) {\n          this.width = width;\n          this.height = height;\n          this.worker.postMessage({\n            command: 'resize',\n            width: width,\n            height: height\n          });\n        }\n      }\n    }\n  }]);\n  return AnimationLoopProxy;\n}();\n\nexports.default = AnimationLoopProxy;\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../webgl-context\":\"rNTT\",\"../webgl-utils\":\"CTd0\",\"../utils\":\"B7AM\",\"../utils/assert\":\"iVaU\"}],\"En7M\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _webgl = require(\"../webgl\");\n\nvar _webglContext = require(\"../webgl-context\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A base render pass.\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar Pass =\n/*#__PURE__*/\nfunction () {\n  function Pass(gl, props) {\n    (0, _classCallCheck2.default)(this, Pass);\n    var _props$id = props.id,\n        id = _props$id === void 0 ? 'pass' : _props$id;\n    this.id = id; // id of this pass\n\n    this.gl = gl;\n    this.props = {\n      enabled: true,\n      screen: false,\n      swap: false\n    };\n    Object.assign(this.props, props);\n  }\n\n  (0, _createClass2.default)(Pass, [{\n    key: \"setProps\",\n    value: function setProps(props) {\n      Object.assign(this.props, props);\n    }\n  }, {\n    key: \"render\",\n    value: function render(renderState, animationProps) {\n      var _this = this;\n\n      if (!this.props.enabled) {\n        return;\n      }\n\n      var gl = this.gl;\n      var renderParams = {\n        gl: gl,\n        outputBuffer: renderState.writeBuffer,\n        inputBuffer: renderState.readBuffer,\n        animationProps: animationProps,\n        swapBuffers: function swapBuffers() {\n          return renderState._swapFramebuffers();\n        }\n      };\n\n      if (this.props.screen) {\n        renderParams.inputBuffer = renderParams.outputBuffer;\n        renderParams.outputBuffer = _webgl.Framebuffer.getDefaultFramebuffer(gl);\n      } else if (this.props.swap) {\n        renderParams.inputBuffer = renderState.writeBuffer;\n        renderParams.outputBuffer = renderState.readBuffer;\n      }\n\n      (0, _webglContext.withParameters)(gl, {\n        framebuffer: renderParams.outputBuffer\n      }, function () {\n        return _this._renderPass(renderParams);\n      });\n\n      if (this.props.debug) {\n        renderParams.outputBuffer.log(0, this.id);\n      }\n\n      if (this.props.swap) {\n        renderState._swapFramebuffers();\n      }\n    }\n    /**\n     * Renders the effect.\n     * This is an abstract method that should be overridden.\n     * @param {Framebuffer} inputBuffer - Frame buffer that contains the result of the previous pass\n     * @param {Framebuffer} outputBuffer - Frame buffer that serves as the output render target\n     */\n\n  }, {\n    key: \"_renderPass\",\n    value: function _renderPass(_ref) {\n      // assert(false, 'Draw/render methods not implemented!');\n      var gl = _ref.gl,\n          inputBuffer = _ref.inputBuffer,\n          outputBuffer = _ref.outputBuffer,\n          animationProps = _ref.animationProps;\n    }\n  }]);\n  return Pass;\n}();\n\nexports.default = Pass;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../webgl\":\"yQJr\",\"../webgl-context\":\"rNTT\"}],\"BMzv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _pass = _interopRequireDefault(require(\"./pass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A composite render pass.\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar CompositePass =\n/*#__PURE__*/\nfunction (_Pass) {\n  (0, _inherits2.default)(CompositePass, _Pass);\n\n  function CompositePass(gl, props) {\n    (0, _classCallCheck2.default)(this, CompositePass);\n    props = Array.isArray(props) ? {\n      passes: props\n    } : props;\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(CompositePass).call(this, gl, Object.assign({\n      id: 'composite-pass'\n    }, props)));\n  } // Override render() to just forward the call\n\n\n  (0, _createClass2.default)(CompositePass, [{\n    key: \"render\",\n    value: function render() {\n      var _this$props$passes = this.props.passes,\n          passes = _this$props$passes === void 0 ? [] : _this$props$passes;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = passes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var pass = _step.value;\n          pass.render.apply(pass, arguments);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }]);\n  return CompositePass;\n}(_pass.default);\n\nexports.default = CompositePass;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./pass\":\"En7M\"}],\"Q43F\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _webgl = require(\"../webgl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// Render state helper class for the multi pass system\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar RenderState =\n/*#__PURE__*/\nfunction () {\n  function RenderState(gl) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, RenderState);\n    this.gl = gl;\n    this.framebuffer1 = new _webgl.Framebuffer(gl, {\n      id: 'multi-pass-1',\n      stencil: true\n    });\n    this.framebuffer2 = new _webgl.Framebuffer(gl, {\n      id: 'multi-pass-2',\n      stencil: true\n    });\n    this.reset();\n  }\n\n  (0, _createClass2.default)(RenderState, [{\n    key: \"reset\",\n    value: function reset() {\n      this.framebuffer1.resize();\n      this.framebuffer2.resize();\n      this.writeBuffer = this.framebuffer1;\n      this.readBuffer = this.framebuffer2;\n      this.maskActive = false;\n    }\n  }, {\n    key: \"_swapFramebuffers\",\n    value: function _swapFramebuffers() {\n      var tmp = this.readBuffer;\n      this.readBuffer = this.writeBuffer;\n      this.writeBuffer = tmp;\n    }\n  }]);\n  return RenderState;\n}();\n\nexports.default = RenderState;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../webgl\":\"yQJr\"}],\"c48i\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _compositePass = _interopRequireDefault(require(\"./composite-pass\"));\n\nvar _renderState = _interopRequireDefault(require(\"./render-state\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A top-level composite render pass, that manages render state\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar MultiPassRenderer =\n/*#__PURE__*/\nfunction (_CompositePass) {\n  (0, _inherits2.default)(MultiPassRenderer, _CompositePass);\n\n  function MultiPassRenderer(gl, props) {\n    var _this;\n\n    (0, _classCallCheck2.default)(this, MultiPassRenderer);\n    props = Array.isArray(props) ? {\n      passes: props\n    } : props;\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(MultiPassRenderer).call(this, gl, Object.assign({\n      id: 'multi-pass'\n    }, props)));\n    _this.renderState = new _renderState.default(gl, props);\n    return _this;\n  } // Override render() to just forward the call\n\n\n  (0, _createClass2.default)(MultiPassRenderer, [{\n    key: \"render\",\n    value: function render(animationProps) {\n      this.renderState.reset();\n      var _this$props$passes = this.props.passes,\n          passes = _this$props$passes === void 0 ? [] : _this$props$passes;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = passes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var pass = _step.value;\n          pass.render(this.renderState, animationProps);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return this;\n    }\n  }]);\n  return MultiPassRenderer;\n}(_compositePass.default);\n\nexports.default = MultiPassRenderer;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./composite-pass\":\"BMzv\",\"./render-state\":\"Q43F\"}],\"DldW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _pass = _interopRequireDefault(require(\"./pass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A pass that clears the input buffer or the screen.\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar ClearPass =\n/*#__PURE__*/\nfunction (_Pass) {\n  (0, _inherits2.default)(ClearPass, _Pass);\n\n  function ClearPass(gl) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, ClearPass);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(ClearPass).call(this, gl, Object.assign({\n      id: 'clear-pass'\n    }, props)));\n  } // TODO - add support for colors, align with model.clear and framebuffer.clear\n  // TODO - integrate with luma.gl clear, make sure right buffer is cleared\n\n\n  (0, _createClass2.default)(ClearPass, [{\n    key: \"_renderPass\",\n    value: function _renderPass(_ref) {\n      var gl = _ref.gl;\n      var _this$props$clearBits = this.props.clearBits,\n          clearBits = _this$props$clearBits === void 0 ? 16384 | 256 : _this$props$clearBits;\n      gl.clear(clearBits);\n    }\n  }]);\n  return ClearPass;\n}(_pass.default);\n\nexports.default = ClearPass;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./pass\":\"En7M\"}],\"rHPl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _pass = _interopRequireDefault(require(\"./pass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A pass that renders a given scene directly on screen or into the read buffer\n// for further processing.\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar RenderPass =\n/*#__PURE__*/\nfunction (_Pass) {\n  (0, _inherits2.default)(RenderPass, _Pass);\n\n  function RenderPass(gl) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, RenderPass);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(RenderPass).call(this, gl, Object.assign({\n      id: 'render-pass'\n    }, props)));\n  }\n\n  (0, _createClass2.default)(RenderPass, [{\n    key: \"_renderPass\",\n    value: function _renderPass(_ref) {\n      var animationProps = _ref.animationProps;\n      var _this$props = this.props,\n          _this$props$models = _this$props.models,\n          models = _this$props$models === void 0 ? [] : _this$props$models,\n          drawParams = _this$props.drawParams;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = models[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var model = _step.value;\n          model.draw(Object.assign({}, drawParams, {\n            animationProps: animationProps\n          }));\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }]);\n  return RenderPass;\n}(_pass.default);\n\nexports.default = RenderPass;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./pass\":\"En7M\"}],\"p6lX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = _interopRequireDefault(require(\"./geometry\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar INDEX_OFFSETS = {\n  x: [2, 0, 1],\n  y: [0, 1, 2],\n  z: [1, 2, 0]\n};\n\nvar TruncatedConeGeometry =\n/*#__PURE__*/\nfunction (_Geometry) {\n  (0, _inherits2.default)(TruncatedConeGeometry, _Geometry); // Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n  // copyright 2011 Google Inc. new BSD License\n  // (http://www.opensource.org/licenses/bsd-license.php).\n\n  /* eslint-disable max-statements, complexity */\n\n  function TruncatedConeGeometry() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, TruncatedConeGeometry);\n    var _opts$bottomRadius = opts.bottomRadius,\n        bottomRadius = _opts$bottomRadius === void 0 ? 0 : _opts$bottomRadius,\n        _opts$topRadius = opts.topRadius,\n        topRadius = _opts$topRadius === void 0 ? 0 : _opts$topRadius,\n        _opts$height = opts.height,\n        height = _opts$height === void 0 ? 1 : _opts$height,\n        _opts$nradial = opts.nradial,\n        nradial = _opts$nradial === void 0 ? 10 : _opts$nradial,\n        _opts$nvertical = opts.nvertical,\n        nvertical = _opts$nvertical === void 0 ? 10 : _opts$nvertical,\n        _opts$verticalAxis = opts.verticalAxis,\n        verticalAxis = _opts$verticalAxis === void 0 ? 'y' : _opts$verticalAxis,\n        _opts$topCap = opts.topCap,\n        topCap = _opts$topCap === void 0 ? false : _opts$topCap,\n        _opts$bottomCap = opts.bottomCap,\n        bottomCap = _opts$bottomCap === void 0 ? false : _opts$bottomCap;\n    var extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);\n    var numVertices = (nradial + 1) * (nvertical + 1 + extra);\n    var slant = Math.atan2(bottomRadius - topRadius, height);\n    var msin = Math.sin;\n    var mcos = Math.cos;\n    var mpi = Math.PI;\n    var cosSlant = mcos(slant);\n    var sinSlant = msin(slant);\n    var start = topCap ? -2 : 0;\n    var end = nvertical + (bottomCap ? 2 : 0);\n    var vertsAroundEdge = nradial + 1;\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var texCoords = new Float32Array(numVertices * 2);\n    var indices = new Uint16Array(nradial * (nvertical + extra) * 6);\n    var indexOffset = INDEX_OFFSETS[verticalAxis];\n    var i3 = 0;\n    var i2 = 0;\n\n    for (var i = start; i <= end; i++) {\n      var v = i / nvertical;\n      var y = height * v;\n      var ringRadius = void 0;\n\n      if (i < 0) {\n        y = 0;\n        v = 1;\n        ringRadius = bottomRadius;\n      } else if (i > nvertical) {\n        y = height;\n        v = 1;\n        ringRadius = topRadius;\n      } else {\n        ringRadius = bottomRadius + (topRadius - bottomRadius) * (i / nvertical);\n      }\n\n      if (i === -2 || i === nvertical + 2) {\n        ringRadius = 0;\n        v = 0;\n      }\n\n      y -= height / 2;\n\n      for (var j = 0; j < vertsAroundEdge; j++) {\n        var sin = msin(j * mpi * 2 / nradial);\n        var cos = mcos(j * mpi * 2 / nradial);\n        positions[i3 + indexOffset[0]] = sin * ringRadius;\n        positions[i3 + indexOffset[1]] = y;\n        positions[i3 + indexOffset[2]] = cos * ringRadius;\n        normals[i3 + indexOffset[0]] = i < 0 || i > nvertical ? 0 : sin * cosSlant;\n        normals[i3 + indexOffset[1]] = i < 0 ? -1 : i > nvertical ? 1 : sinSlant;\n        normals[i3 + indexOffset[2]] = i < 0 || i > nvertical ? 0 : cos * cosSlant;\n        texCoords[i2 + 0] = j / nradial;\n        texCoords[i2 + 1] = v;\n        i2 += 2;\n        i3 += 3;\n      }\n    }\n\n    for (var _i = 0; _i < nvertical + extra; _i++) {\n      for (var _j = 0; _j < nradial; _j++) {\n        var index = (_i * nradial + _j) * 6;\n        indices[index + 0] = vertsAroundEdge * (_i + 0) + 0 + _j;\n        indices[index + 1] = vertsAroundEdge * (_i + 0) + 1 + _j;\n        indices[index + 2] = vertsAroundEdge * (_i + 1) + 1 + _j;\n        indices[index + 3] = vertsAroundEdge * (_i + 0) + 0 + _j;\n        indices[index + 4] = vertsAroundEdge * (_i + 1) + 1 + _j;\n        indices[index + 5] = vertsAroundEdge * (_i + 1) + 0 + _j;\n      }\n    }\n\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TruncatedConeGeometry).call(this, Object.assign({}, opts, {\n      attributes: {\n        positions: positions,\n        normals: normals,\n        texCoords: texCoords,\n        indices: indices\n      }\n    })));\n  }\n\n  return TruncatedConeGeometry;\n}(_geometry.default);\n\nexports.default = TruncatedConeGeometry;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./geometry\":\"a3Eh\"}],\"QBo7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _truncatedConeGeometry = _interopRequireDefault(require(\"./truncated-cone-geometry\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ConeGeometry =\n/*#__PURE__*/\nfunction (_TruncatedConeGeometr) {\n  (0, _inherits2.default)(ConeGeometry, _TruncatedConeGeometr);\n\n  function ConeGeometry() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, ConeGeometry);\n    var _opts$radius = opts.radius,\n        radius = _opts$radius === void 0 ? 1 : _opts$radius,\n        _opts$cap = opts.cap,\n        cap = _opts$cap === void 0 ? true : _opts$cap;\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(ConeGeometry).call(this, Object.assign({}, opts, {\n      topRadius: 0,\n      topCap: Boolean(cap),\n      bottomCap: Boolean(cap),\n      bottomRadius: radius\n    })));\n  }\n\n  return ConeGeometry;\n}(_truncatedConeGeometry.default);\n\nexports.default = ConeGeometry;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./truncated-cone-geometry\":\"p6lX\"}],\"XAxe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = _interopRequireDefault(require(\"./geometry\"));\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar CubeGeometry =\n/*#__PURE__*/\nfunction (_Geometry) {\n  (0, _inherits2.default)(CubeGeometry, _Geometry);\n\n  function CubeGeometry() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, CubeGeometry);\n    var _opts$id = opts.id,\n        id = _opts$id === void 0 ? (0, _utils.uid)('cube-geometry') : _opts$id;\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(CubeGeometry).call(this, Object.assign({}, opts, {\n      id: id,\n      attributes: getCubeAttributes()\n    })));\n  }\n\n  return CubeGeometry;\n}(_geometry.default);\n/* eslint-disable no-multi-spaces, indent */\n\n\nexports.default = CubeGeometry;\nvar CUBE_INDICES = new Uint16Array([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23]);\nvar CUBE_POSITIONS = new Float32Array([-1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1]);\nvar CUBE_NORMALS = new Float32Array([// Front face\n0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, // Back face\n0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, // Top face\n0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Bottom face\n0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, // Right face\n1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, // Left face\n-1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0]);\nvar CUBE_TEX_COORDS = new Float32Array([// Front face\n0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, // Back face\n1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // Top face\n0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, // Bottom face\n1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, // Right face\n1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // Left face\n0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0]);\n/* eslint-enable no-multi-spaces, indent */\n\nfunction getCubeAttributes() {\n  return {\n    indices: new Uint16Array(CUBE_INDICES),\n    positions: new Float32Array(CUBE_POSITIONS),\n    normals: new Float32Array(CUBE_NORMALS),\n    texCoords: new Float32Array(CUBE_TEX_COORDS)\n  };\n}\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./geometry\":\"a3Eh\",\"../utils\":\"B7AM\"}],\"KijP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _truncatedConeGeometry = _interopRequireDefault(require(\"./truncated-cone-geometry\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar CylinderGeometry =\n/*#__PURE__*/\nfunction (_TruncatedConeGeometr) {\n  (0, _inherits2.default)(CylinderGeometry, _TruncatedConeGeometr);\n\n  function CylinderGeometry() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, CylinderGeometry);\n    var _opts$radius = opts.radius,\n        radius = _opts$radius === void 0 ? 1 : _opts$radius;\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(CylinderGeometry).call(this, Object.assign({}, opts, {\n      bottomRadius: radius,\n      topRadius: radius\n    })));\n  }\n\n  return CylinderGeometry;\n}(_truncatedConeGeometry.default);\n\nexports.default = CylinderGeometry;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./truncated-cone-geometry\":\"p6lX\"}],\"g0h0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = _interopRequireDefault(require(\"./geometry\"));\n\nvar _math = require(\"math.gl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable comma-spacing, max-statements, complexity */\nvar ICO_POSITIONS = [-1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 1, 0, -1, 0, 1, 0, 0];\nvar ICO_INDICES = [3, 4, 5, 3, 5, 1, 3, 1, 0, 3, 0, 4, 4, 0, 2, 4, 2, 5, 2, 0, 1, 5, 2, 1];\n\nvar IcoSphereGeometry =\n/*#__PURE__*/\nfunction (_Geometry) {\n  (0, _inherits2.default)(IcoSphereGeometry, _Geometry);\n\n  function IcoSphereGeometry() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, IcoSphereGeometry);\n    var _opts$iterations = opts.iterations,\n        iterations = _opts$iterations === void 0 ? 0 : _opts$iterations;\n    var PI = Math.PI;\n    var PI2 = PI * 2;\n    var positions = ICO_POSITIONS.concat();\n    var indices = ICO_INDICES.concat();\n    positions.push();\n    indices.push();\n\n    var getMiddlePoint = function () {\n      var pointMemo = {};\n      return function (i1, i2) {\n        i1 *= 3;\n        i2 *= 3;\n        var mini = i1 < i2 ? i1 : i2;\n        var maxi = i1 > i2 ? i1 : i2;\n        var key = \"\".concat(mini, \"|\").concat(maxi);\n\n        if (key in pointMemo) {\n          return pointMemo[key];\n        }\n\n        var x1 = positions[i1];\n        var y1 = positions[i1 + 1];\n        var z1 = positions[i1 + 2];\n        var x2 = positions[i2];\n        var y2 = positions[i2 + 1];\n        var z2 = positions[i2 + 2];\n        var xm = (x1 + x2) / 2;\n        var ym = (y1 + y2) / 2;\n        var zm = (z1 + z2) / 2;\n        var len = Math.sqrt(xm * xm + ym * ym + zm * zm);\n        xm /= len;\n        ym /= len;\n        zm /= len;\n        positions.push(xm, ym, zm);\n        return pointMemo[key] = positions.length / 3 - 1;\n      };\n    }();\n\n    for (var i = 0; i < iterations; i++) {\n      var indices2 = [];\n\n      for (var j = 0; j < indices.length; j += 3) {\n        var a = getMiddlePoint(indices[j + 0], indices[j + 1]);\n        var b = getMiddlePoint(indices[j + 1], indices[j + 2]);\n        var c = getMiddlePoint(indices[j + 2], indices[j + 0]);\n        indices2.push(c, indices[j + 0], a, a, indices[j + 1], b, b, indices[j + 2], c, a, b, c);\n      }\n\n      indices = indices2;\n    } // Calculate texCoords and normals\n\n\n    var normals = new Array(indices.length * 3);\n    var texCoords = new Array(indices.length * 2);\n    var l = indices.length;\n\n    for (var _i = l - 3; _i >= 0; _i -= 3) {\n      var i1 = indices[_i + 0];\n      var i2 = indices[_i + 1];\n      var i3 = indices[_i + 2];\n      var in1 = i1 * 3;\n      var in2 = i2 * 3;\n      var in3 = i3 * 3;\n      var iu1 = i1 * 2;\n      var iu2 = i2 * 2;\n      var iu3 = i3 * 2;\n      var x1 = positions[in1 + 0];\n      var y1 = positions[in1 + 1];\n      var z1 = positions[in1 + 2];\n      var theta1 = Math.acos(z1 / Math.sqrt(x1 * x1 + y1 * y1 + z1 * z1));\n      var phi1 = Math.atan2(y1, x1) + PI;\n      var v1 = theta1 / PI;\n      var u1 = 1 - phi1 / PI2;\n      var x2 = positions[in2 + 0];\n      var y2 = positions[in2 + 1];\n      var z2 = positions[in2 + 2];\n      var theta2 = Math.acos(z2 / Math.sqrt(x2 * x2 + y2 * y2 + z2 * z2));\n      var phi2 = Math.atan2(y2, x2) + PI;\n      var v2 = theta2 / PI;\n      var u2 = 1 - phi2 / PI2;\n      var x3 = positions[in3 + 0];\n      var y3 = positions[in3 + 1];\n      var z3 = positions[in3 + 2];\n      var theta3 = Math.acos(z3 / Math.sqrt(x3 * x3 + y3 * y3 + z3 * z3));\n      var phi3 = Math.atan2(y3, x3) + PI;\n      var v3 = theta3 / PI;\n      var u3 = 1 - phi3 / PI2;\n      var vec1 = [x3 - x2, y3 - y2, z3 - z2];\n      var vec2 = [x1 - x2, y1 - y2, z1 - z2];\n      var normal = new _math.Vector3(vec1).cross(vec2).normalize();\n      var newIndex = void 0;\n\n      if ((u1 === 0 || u2 === 0 || u3 === 0) && (u1 === 0 || u1 > 0.5) && (u2 === 0 || u2 > 0.5) && (u3 === 0 || u3 > 0.5)) {\n        positions.push(positions[in1 + 0], positions[in1 + 1], positions[in1 + 2]);\n        newIndex = positions.length / 3 - 1;\n        indices.push(newIndex);\n        texCoords[newIndex * 2 + 0] = 1;\n        texCoords[newIndex * 2 + 1] = v1;\n        normals[newIndex * 3 + 0] = normal.x;\n        normals[newIndex * 3 + 1] = normal.y;\n        normals[newIndex * 3 + 2] = normal.z;\n        positions.push(positions[in2 + 0], positions[in2 + 1], positions[in2 + 2]);\n        newIndex = positions.length / 3 - 1;\n        indices.push(newIndex);\n        texCoords[newIndex * 2 + 0] = 1;\n        texCoords[newIndex * 2 + 1] = v2;\n        normals[newIndex * 3 + 0] = normal.x;\n        normals[newIndex * 3 + 1] = normal.y;\n        normals[newIndex * 3 + 2] = normal.z;\n        positions.push(positions[in3 + 0], positions[in3 + 1], positions[in3 + 2]);\n        newIndex = positions.length / 3 - 1;\n        indices.push(newIndex);\n        texCoords[newIndex * 2 + 0] = 1;\n        texCoords[newIndex * 2 + 1] = v3;\n        normals[newIndex * 3 + 0] = normal.x;\n        normals[newIndex * 3 + 1] = normal.y;\n        normals[newIndex * 3 + 2] = normal.z;\n      }\n\n      normals[in1 + 0] = normals[in2 + 0] = normals[in3 + 0] = normal.x;\n      normals[in1 + 1] = normals[in2 + 1] = normals[in3 + 1] = normal.y;\n      normals[in1 + 2] = normals[in2 + 2] = normals[in3 + 2] = normal.z;\n      texCoords[iu1 + 0] = u1;\n      texCoords[iu1 + 1] = v1;\n      texCoords[iu2 + 0] = u2;\n      texCoords[iu2 + 1] = v2;\n      texCoords[iu3 + 0] = u3;\n      texCoords[iu3 + 1] = v3;\n    }\n\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(IcoSphereGeometry).call(this, Object.assign({}, opts, {\n      attributes: {\n        positions: new Float32Array(positions),\n        normals: new Float32Array(normals),\n        texCoords: new Float32Array(texCoords),\n        indices: new Uint16Array(indices)\n      }\n    })));\n  }\n\n  return IcoSphereGeometry;\n}(_geometry.default);\n\nexports.default = IcoSphereGeometry;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./geometry\":\"a3Eh\",\"math.gl\":\"o5CE\"}],\"KcWt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = _interopRequireDefault(require(\"./geometry\"));\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar PlaneGeometry =\n/*#__PURE__*/\nfunction (_Geometry) {\n  (0, _inherits2.default)(PlaneGeometry, _Geometry); // Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n  // copyright 2011 Google Inc. new BSD License\n  // (http://www.opensource.org/licenses/bsd-license.php).\n\n  /* eslint-disable max-statements, complexity */\n\n  /* eslint-disable complexity, max-statements */\n\n  function PlaneGeometry() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, PlaneGeometry);\n    var _opts$type = opts.type,\n        type = _opts$type === void 0 ? 'x,y' : _opts$type,\n        _opts$offset = opts.offset,\n        offset = _opts$offset === void 0 ? 0 : _opts$offset,\n        _opts$flipCull = opts.flipCull,\n        flipCull = _opts$flipCull === void 0 ? false : _opts$flipCull,\n        _opts$unpack = opts.unpack,\n        unpack = _opts$unpack === void 0 ? false : _opts$unpack,\n        _opts$id = opts.id,\n        id = _opts$id === void 0 ? (0, _utils.uid)('plane-geometry') : _opts$id;\n    var coords = type.split(','); // width, height\n\n    var c1len = opts[\"\".concat(coords[0], \"len\")];\n    var c2len = opts[\"\".concat(coords[1], \"len\")]; // subdivisionsWidth, subdivisionsDepth\n\n    var subdivisions1 = opts[\"n\".concat(coords[0])] || 1;\n    var subdivisions2 = opts[\"n\".concat(coords[1])] || 1;\n    var numVertices = (subdivisions1 + 1) * (subdivisions2 + 1);\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var texCoords = new Float32Array(numVertices * 2);\n\n    if (flipCull) {\n      c1len = -c1len;\n    }\n\n    var i2 = 0;\n    var i3 = 0;\n\n    for (var z = 0; z <= subdivisions2; z++) {\n      for (var x = 0; x <= subdivisions1; x++) {\n        var u = x / subdivisions1;\n        var v = z / subdivisions2;\n        texCoords[i2 + 0] = flipCull ? 1 - u : u;\n        texCoords[i2 + 1] = v;\n\n        switch (type) {\n          case 'x,y':\n            positions[i3 + 0] = c1len * u - c1len * 0.5;\n            positions[i3 + 1] = c2len * v - c2len * 0.5;\n            positions[i3 + 2] = offset;\n            normals[i3 + 0] = 0;\n            normals[i3 + 1] = 0;\n            normals[i3 + 2] = flipCull ? 1 : -1;\n            break;\n\n          case 'x,z':\n            positions[i3 + 0] = c1len * u - c1len * 0.5;\n            positions[i3 + 1] = offset;\n            positions[i3 + 2] = c2len * v - c2len * 0.5;\n            normals[i3 + 0] = 0;\n            normals[i3 + 1] = flipCull ? 1 : -1;\n            normals[i3 + 2] = 0;\n            break;\n\n          case 'y,z':\n            positions[i3 + 0] = offset;\n            positions[i3 + 1] = c1len * u - c1len * 0.5;\n            positions[i3 + 2] = c2len * v - c2len * 0.5;\n            normals[i3 + 0] = flipCull ? 1 : -1;\n            normals[i3 + 1] = 0;\n            normals[i3 + 2] = 0;\n            break;\n\n          default:\n            break;\n        }\n\n        i2 += 2;\n        i3 += 3;\n      }\n    }\n\n    var numVertsAcross = subdivisions1 + 1;\n    var indices = new Uint16Array(subdivisions1 * subdivisions2 * 6);\n\n    for (var _z = 0; _z < subdivisions2; _z++) {\n      for (var _x = 0; _x < subdivisions1; _x++) {\n        var index = (_z * subdivisions1 + _x) * 6; // Make triangle 1 of quad.\n\n        indices[index + 0] = (_z + 0) * numVertsAcross + _x;\n        indices[index + 1] = (_z + 1) * numVertsAcross + _x;\n        indices[index + 2] = (_z + 0) * numVertsAcross + _x + 1; // Make triangle 2 of quad.\n\n        indices[index + 3] = (_z + 1) * numVertsAcross + _x;\n        indices[index + 4] = (_z + 1) * numVertsAcross + _x + 1;\n        indices[index + 5] = (_z + 0) * numVertsAcross + _x + 1;\n      }\n    } // Optionally, unpack indexed geometry\n\n\n    if (unpack) {\n      var positions2 = new Float32Array(indices.length * 3);\n      var normals2 = new Float32Array(indices.length * 3);\n      var texCoords2 = new Float32Array(indices.length * 2);\n\n      for (var _x2 = 0; _x2 < indices.length; ++_x2) {\n        var _index = indices[_x2];\n        positions2[_x2 * 3 + 0] = positions[_index * 3 + 0];\n        positions2[_x2 * 3 + 1] = positions[_index * 3 + 1];\n        positions2[_x2 * 3 + 2] = positions[_index * 3 + 2];\n        normals2[_x2 * 3 + 0] = normals[_index * 3 + 0];\n        normals2[_x2 * 3 + 1] = normals[_index * 3 + 1];\n        normals2[_x2 * 3 + 2] = normals[_index * 3 + 2];\n        texCoords2[_x2 * 2 + 0] = texCoords[_index * 2 + 0];\n        texCoords2[_x2 * 2 + 1] = texCoords[_index * 2 + 1];\n      }\n\n      positions = positions2;\n      normals = normals2;\n      texCoords = texCoords2;\n      indices = undefined;\n    }\n\n    var attributes = {\n      positions: positions,\n      normals: normals,\n      texCoords: texCoords\n    };\n\n    if (indices) {\n      attributes.indices = indices;\n    }\n\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(PlaneGeometry).call(this, Object.assign({}, opts, {\n      attributes: attributes,\n      id: id\n    })));\n  }\n\n  return PlaneGeometry;\n}(_geometry.default);\n\nexports.default = PlaneGeometry;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./geometry\":\"a3Eh\",\"../utils\":\"B7AM\"}],\"S3rS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = _interopRequireDefault(require(\"./geometry\"));\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SphereGeometry =\n/*#__PURE__*/\nfunction (_Geometry) {\n  (0, _inherits2.default)(SphereGeometry, _Geometry);\n\n  function SphereGeometry() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheck2.default)(this, SphereGeometry);\n    var _opts$nlat = opts.nlat,\n        nlat = _opts$nlat === void 0 ? 10 : _opts$nlat,\n        _opts$nlong = opts.nlong,\n        nlong = _opts$nlong === void 0 ? 10 : _opts$nlong,\n        _opts$radius = opts.radius,\n        radius = _opts$radius === void 0 ? 1 : _opts$radius,\n        _opts$id = opts.id,\n        id = _opts$id === void 0 ? (0, _utils.uid)('sphere-geometry') : _opts$id;\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(SphereGeometry).call(this, Object.assign({}, opts, {\n      id: id,\n      attributes: getSphereAttributes(nlat, nlong, radius)\n    })));\n  }\n\n  return SphereGeometry;\n}(_geometry.default); // Primitives inspired by TDL http://code.google.com/p/webglsamples/,\n// copyright 2011 Google Inc. new BSD License\n// (http://www.opensource.org/licenses/bsd-license.php).\n\n/* eslint-disable max-statements, complexity */\n\n\nexports.default = SphereGeometry;\n\nfunction getSphereAttributes(nlat, nlong, radius) {\n  var startLat = 0;\n  var endLat = Math.PI;\n  var latRange = endLat - startLat;\n  var startLong = 0;\n  var endLong = 2 * Math.PI;\n  var longRange = endLong - startLong;\n  var numVertices = (nlat + 1) * (nlong + 1);\n\n  if (typeof radius === 'number') {\n    var value = radius;\n\n    radius = function radius(n1, n2, n3, u, v) {\n      return value;\n    };\n  }\n\n  var positions = new Float32Array(numVertices * 3);\n  var normals = new Float32Array(numVertices * 3);\n  var texCoords = new Float32Array(numVertices * 2);\n  var indices = new Uint16Array(nlat * nlong * 6); // Create positions, normals and texCoords\n\n  for (var y = 0; y <= nlat; y++) {\n    for (var x = 0; x <= nlong; x++) {\n      var u = x / nlong;\n      var v = y / nlat;\n      var index = x + y * (nlong + 1);\n      var i2 = index * 2;\n      var i3 = index * 3;\n      var theta = longRange * u;\n      var phi = latRange * v;\n      var sinTheta = Math.sin(theta);\n      var cosTheta = Math.cos(theta);\n      var sinPhi = Math.sin(phi);\n      var cosPhi = Math.cos(phi);\n      var ux = cosTheta * sinPhi;\n      var uy = cosPhi;\n      var uz = sinTheta * sinPhi;\n      var r = radius(ux, uy, uz, u, v);\n      positions[i3 + 0] = r * ux;\n      positions[i3 + 1] = r * uy;\n      positions[i3 + 2] = r * uz;\n      normals[i3 + 0] = ux;\n      normals[i3 + 1] = uy;\n      normals[i3 + 2] = uz;\n      texCoords[i2 + 0] = u;\n      texCoords[i2 + 1] = v;\n    }\n  } // Create indices\n\n\n  var numVertsAround = nlat + 1;\n\n  for (var _x = 0; _x < nlat; _x++) {\n    for (var _y = 0; _y < nlong; _y++) {\n      var _index = (_x * nlong + _y) * 6;\n\n      indices[_index + 0] = _y * numVertsAround + _x;\n      indices[_index + 1] = _y * numVertsAround + _x + 1;\n      indices[_index + 2] = (_y + 1) * numVertsAround + _x;\n      indices[_index + 3] = (_y + 1) * numVertsAround + _x;\n      indices[_index + 4] = _y * numVertsAround + _x + 1;\n      indices[_index + 5] = (_y + 1) * numVertsAround + _x + 1;\n    }\n  }\n\n  return {\n    positions: positions,\n    indices: indices,\n    normals: normals,\n    texCoords: texCoords\n  };\n}\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./geometry\":\"a3Eh\",\"../utils\":\"B7AM\"}],\"EJCl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Geometry\", {\n  enumerable: true,\n  get: function () {\n    return _geometry.default;\n  }\n});\nObject.defineProperty(exports, \"ConeGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _coneGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"CubeGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _cubeGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"CylinderGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _cylinderGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"IcoSphereGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _icoSphereGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"PlaneGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _planeGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"SphereGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _sphereGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"TruncatedConeGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _truncatedConeGeometry.default;\n  }\n});\n\nvar _geometry = _interopRequireDefault(require(\"./geometry\"));\n\nvar _coneGeometry = _interopRequireDefault(require(\"./cone-geometry\"));\n\nvar _cubeGeometry = _interopRequireDefault(require(\"./cube-geometry\"));\n\nvar _cylinderGeometry = _interopRequireDefault(require(\"./cylinder-geometry\"));\n\nvar _icoSphereGeometry = _interopRequireDefault(require(\"./ico-sphere-geometry\"));\n\nvar _planeGeometry = _interopRequireDefault(require(\"./plane-geometry\"));\n\nvar _sphereGeometry = _interopRequireDefault(require(\"./sphere-geometry\"));\n\nvar _truncatedConeGeometry = _interopRequireDefault(require(\"./truncated-cone-geometry\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./geometry\":\"a3Eh\",\"./cone-geometry\":\"QBo7\",\"./cube-geometry\":\"XAxe\",\"./cylinder-geometry\":\"KijP\",\"./ico-sphere-geometry\":\"g0h0\",\"./plane-geometry\":\"KcWt\",\"./sphere-geometry\":\"S3rS\",\"./truncated-cone-geometry\":\"p6lX\"}],\"fdK2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"AnimationLoop\", {\n  enumerable: true,\n  get: function () {\n    return _animationLoop.default;\n  }\n});\nObject.defineProperty(exports, \"AnimationLoopProxy\", {\n  enumerable: true,\n  get: function () {\n    return _animationLoopProxy.default;\n  }\n});\nObject.defineProperty(exports, \"Model\", {\n  enumerable: true,\n  get: function () {\n    return _model.default;\n  }\n});\n\nvar _animationLoop = _interopRequireDefault(require(\"./animation-loop\"));\n\nvar _animationLoopProxy = _interopRequireDefault(require(\"./animation-loop-proxy\"));\n\nvar _model = _interopRequireDefault(require(\"./model\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./animation-loop\":\"GBRt\",\"./animation-loop-proxy\":\"eWAK\",\"./model\":\"DSwH\"}],\"VaYO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = require(\"../geometry\");\n\nvar _core = require(\"../core\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Cone =\n/*#__PURE__*/\nfunction (_Model) {\n  (0, _inherits2.default)(Cone, _Model);\n\n  function Cone(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Cone);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Cone).call(this, gl, Object.assign({}, opts, {\n      geometry: new _geometry.ConeGeometry(opts)\n    })));\n  }\n\n  return Cone;\n}(_core.Model);\n\nexports.default = Cone;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../geometry\":\"EJCl\",\"../core\":\"fdK2\"}],\"dBtY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = require(\"../geometry\");\n\nvar _core = require(\"../core\");\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Cube =\n/*#__PURE__*/\nfunction (_Model) {\n  (0, _inherits2.default)(Cube, _Model);\n\n  function Cube(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Cube);\n    var _opts$id = opts.id,\n        id = _opts$id === void 0 ? (0, _utils.uid)('cube') : _opts$id;\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Cube).call(this, gl, Object.assign({}, opts, {\n      id: id,\n      geometry: new _geometry.CubeGeometry(opts)\n    })));\n  }\n\n  return Cube;\n}(_core.Model);\n\nexports.default = Cube;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../geometry\":\"EJCl\",\"../core\":\"fdK2\",\"../utils\":\"B7AM\"}],\"li8i\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = require(\"../geometry\");\n\nvar _model = _interopRequireDefault(require(\"../core/model\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Cylinder =\n/*#__PURE__*/\nfunction (_Model) {\n  (0, _inherits2.default)(Cylinder, _Model);\n\n  function Cylinder(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Cylinder);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Cylinder).call(this, gl, Object.assign({}, opts, {\n      geometry: new _geometry.CylinderGeometry(opts)\n    })));\n  }\n\n  return Cylinder;\n}(_model.default);\n\nexports.default = Cylinder;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../geometry\":\"EJCl\",\"../core/model\":\"DSwH\"}],\"SIDC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _core = require(\"../core\");\n\nvar _geometry = require(\"../geometry\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IcoSphere =\n/*#__PURE__*/\nfunction (_Model) {\n  (0, _inherits2.default)(IcoSphere, _Model);\n\n  function IcoSphere(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, IcoSphere);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(IcoSphere).call(this, gl, Object.assign({}, opts, {\n      geometry: new _geometry.IcoSphereGeometry(opts)\n    })));\n  }\n\n  return IcoSphere;\n}(_core.Model);\n\nexports.default = IcoSphere;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../core\":\"fdK2\",\"../geometry\":\"EJCl\"}],\"plnG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = require(\"../geometry\");\n\nvar _model = _interopRequireDefault(require(\"../core/model\"));\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Plane =\n/*#__PURE__*/\nfunction (_Model) {\n  (0, _inherits2.default)(Plane, _Model);\n\n  function Plane(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Plane);\n    var _opts$id = opts.id,\n        id = _opts$id === void 0 ? (0, _utils.uid)('plane') : _opts$id;\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Plane).call(this, gl, Object.assign({}, opts, {\n      id: id,\n      geometry: new _geometry.PlaneGeometry(opts)\n    })));\n  }\n\n  return Plane;\n}(_model.default);\n\nexports.default = Plane;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../geometry\":\"EJCl\",\"../core/model\":\"DSwH\",\"../utils\":\"B7AM\"}],\"Wvbg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _core = require(\"../core\");\n\nvar _geometry = require(\"../geometry\");\n\nvar _utils = require(\"../utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Sphere =\n/*#__PURE__*/\nfunction (_Model) {\n  (0, _inherits2.default)(Sphere, _Model);\n\n  function Sphere(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, Sphere);\n    var _opts$id = opts.id,\n        id = _opts$id === void 0 ? (0, _utils.uid)('sphere') : _opts$id;\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Sphere).call(this, gl, Object.assign({}, opts, {\n      id: id,\n      geometry: new _geometry.SphereGeometry(opts)\n    })));\n  }\n\n  return Sphere;\n}(_core.Model);\n\nexports.default = Sphere;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../core\":\"fdK2\",\"../geometry\":\"EJCl\",\"../utils\":\"B7AM\"}],\"r5jt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _geometry = require(\"../geometry\");\n\nvar _core = require(\"../core\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TruncatedCone =\n/*#__PURE__*/\nfunction (_Model) {\n  (0, _inherits2.default)(TruncatedCone, _Model);\n\n  function TruncatedCone(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, TruncatedCone);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TruncatedCone).call(this, gl, Object.assign({}, opts, {\n      geometry: new _geometry.TruncatedConeGeometry(opts)\n    })));\n  }\n\n  return TruncatedCone;\n}(_core.Model);\n\nexports.default = TruncatedCone;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../geometry\":\"EJCl\",\"../core\":\"fdK2\"}],\"fvbP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _core = require(\"../core\");\n\nvar _geometry = require(\"../geometry\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// ClipSpace\nvar CLIPSPACE_VERTEX_SHADER = \"attribute vec2 aClipSpacePosition;\\nattribute vec2 aTexCoord;\\nattribute vec2 aCoordinate;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  gl_Position = vec4(aClipSpacePosition, 0., 1.);\\n  position = aClipSpacePosition;\\n  coordinate = aCoordinate;\\n  uv = aTexCoord;\\n}\\n\";\n/* eslint-disable indent, no-multi-spaces */\n\nvar POSITIONS = [-1, -1, 1, -1, -1, 1, 1, 1];\n\nvar ClipSpace =\n/*#__PURE__*/\nfunction (_Model) {\n  (0, _inherits2.default)(ClipSpace, _Model);\n\n  function ClipSpace(gl, opts) {\n    var _this;\n\n    (0, _classCallCheck2.default)(this, ClipSpace);\n    var TEX_COORDS = POSITIONS.map(function (coord) {\n      return coord === -1 ? 0 : coord;\n    });\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(ClipSpace).call(this, gl, Object.assign({}, opts, {\n      vs: CLIPSPACE_VERTEX_SHADER,\n      geometry: new _geometry.Geometry({\n        drawMode: 5,\n        vertexCount: 4,\n        attributes: {\n          aClipSpacePosition: {\n            size: 2,\n            value: new Float32Array(POSITIONS)\n          },\n          aTexCoord: {\n            size: 2,\n            value: new Float32Array(TEX_COORDS)\n          },\n          aCoordinate: {\n            size: 2,\n            value: new Float32Array(TEX_COORDS)\n          }\n        }\n      })\n    })));\n\n    _this.setVertexCount(4);\n\n    return _this;\n  }\n\n  return ClipSpace;\n}(_core.Model);\n\nexports.default = ClipSpace;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../core\":\"fdK2\",\"../geometry\":\"EJCl\"}],\"WOdR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Cone\", {\n  enumerable: true,\n  get: function () {\n    return _cone.default;\n  }\n});\nObject.defineProperty(exports, \"Cube\", {\n  enumerable: true,\n  get: function () {\n    return _cube.default;\n  }\n});\nObject.defineProperty(exports, \"Cylinder\", {\n  enumerable: true,\n  get: function () {\n    return _cylinder.default;\n  }\n});\nObject.defineProperty(exports, \"IcoSphere\", {\n  enumerable: true,\n  get: function () {\n    return _icoSphere.default;\n  }\n});\nObject.defineProperty(exports, \"Plane\", {\n  enumerable: true,\n  get: function () {\n    return _plane.default;\n  }\n});\nObject.defineProperty(exports, \"Sphere\", {\n  enumerable: true,\n  get: function () {\n    return _sphere.default;\n  }\n});\nObject.defineProperty(exports, \"TruncatedCone\", {\n  enumerable: true,\n  get: function () {\n    return _truncatedCone.default;\n  }\n});\nObject.defineProperty(exports, \"ClipSpace\", {\n  enumerable: true,\n  get: function () {\n    return _clipSpace.default;\n  }\n});\n\nvar _cone = _interopRequireDefault(require(\"./cone\"));\n\nvar _cube = _interopRequireDefault(require(\"./cube\"));\n\nvar _cylinder = _interopRequireDefault(require(\"./cylinder\"));\n\nvar _icoSphere = _interopRequireDefault(require(\"./ico-sphere\"));\n\nvar _plane = _interopRequireDefault(require(\"./plane\"));\n\nvar _sphere = _interopRequireDefault(require(\"./sphere\"));\n\nvar _truncatedCone = _interopRequireDefault(require(\"./truncated-cone\"));\n\nvar _clipSpace = _interopRequireDefault(require(\"./clip-space\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./cone\":\"VaYO\",\"./cube\":\"dBtY\",\"./cylinder\":\"li8i\",\"./ico-sphere\":\"SIDC\",\"./plane\":\"plnG\",\"./sphere\":\"Wvbg\",\"./truncated-cone\":\"r5jt\",\"./clip-space\":\"fvbP\"}],\"UPkb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _models = require(\"../models\");\n\nvar _pass = _interopRequireDefault(require(\"./pass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A pass that disables stencil test.\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar fs = \"uniform sampler2D uDiffuseSampler;\\nuniform float uOpacity;\\n\\nvarying vec2 uv;\\n\\nvoid main() {\\n  vec4 texel = texture2D(uDiffuseSampler, uv);\\n  gl_FragColor = uOpacity * texel;\\n}\\n\";\n\nvar CopyPass =\n/*#__PURE__*/\nfunction (_Pass) {\n  (0, _inherits2.default)(CopyPass, _Pass);\n\n  function CopyPass(gl) {\n    var _this;\n\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, CopyPass);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(CopyPass).call(this, gl, Object.assign({\n      id: 'copy-pass',\n      swap: true\n    }, props)));\n    _this.clipspace = new _models.ClipSpace(gl, {\n      id: 'copy-pass',\n      fs: fs\n    });\n    return _this;\n  }\n\n  (0, _createClass2.default)(CopyPass, [{\n    key: \"_renderPass\",\n    value: function _renderPass(_ref) {\n      var inputBuffer = _ref.inputBuffer;\n      var _this$props$opacity = this.props.opacity,\n          opacity = _this$props$opacity === void 0 ? 1.0 : _this$props$opacity;\n      this.clipspace.draw({\n        uniforms: {\n          uDiffuseSampler: inputBuffer,\n          uOpacity: opacity\n        },\n        parameters: {\n          depthWrite: false,\n          depthTest: false\n        }\n      });\n    }\n  }]);\n  return CopyPass;\n}(_pass.default);\n\nexports.default = CopyPass;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../models\":\"WOdR\",\"./pass\":\"En7M\"}],\"twB5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _models = require(\"../models\");\n\nvar _pass = _interopRequireDefault(require(\"./pass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A pass that renders a given texture into screen space\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar fs = \"uniform sampler2D uDiffuseSampler;\\nuniform float uOpacity;\\nvarying vec2 uv;\\n\\nvoid main() {\\n  vec4 texel = texture2D(uDiffuseSampler, uv);\\n  gl_FragColor = uOpacity * texel;\\n}\\n\";\n\nvar TexturePass =\n/*#__PURE__*/\nfunction (_Pass) {\n  (0, _inherits2.default)(TexturePass, _Pass);\n\n  function TexturePass(gl) {\n    var _this;\n\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, TexturePass);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(TexturePass).call(this, gl, Object.assign({\n      id: 'texture-pass'\n    }, options)));\n    var texture = options.texture,\n        _options$opacity = options.opacity,\n        opacity = _options$opacity === void 0 ? 1.0 : _options$opacity;\n    _this.clipspace = new _models.ClipSpace(gl, {\n      id: 'texture-pass',\n      fs: fs,\n      uniforms: {\n        uDiffuseSampler: texture,\n        uOpacity: opacity\n      }\n    });\n    return _this;\n  }\n\n  (0, _createClass2.default)(TexturePass, [{\n    key: \"_renderPass\",\n    value: function _renderPass() {\n      this.clipspace.draw({\n        parameters: {\n          depthWrite: false,\n          depthTest: false\n        }\n      });\n    }\n  }]);\n  return TexturePass;\n}(_pass.default);\n\nexports.default = TexturePass;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"../models\":\"WOdR\",\"./pass\":\"En7M\"}],\"ATXS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _pass = _interopRequireDefault(require(\"./pass\"));\n\nvar _pickModels = _interopRequireDefault(require(\"../core/pick-models\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A pass that renders a given scene directly on screen or into the read buffer\n// for further processing.\n//\n// Attribution: This class and the multipass system were inspired by\n// the THREE.js EffectComposer and *Pass classes\nvar PickingPass =\n/*#__PURE__*/\nfunction (_Pass) {\n  (0, _inherits2.default)(PickingPass, _Pass);\n\n  function PickingPass(gl) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, PickingPass);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(PickingPass).call(this, gl, Object.assign({\n      id: 'picking-pass'\n    }, props)));\n  }\n\n  (0, _createClass2.default)(PickingPass, [{\n    key: \"_renderPass\",\n    value: function _renderPass(_ref) {\n      var gl = _ref.gl,\n          inputBuffer = _ref.inputBuffer,\n          animationProps = _ref.animationProps;\n      var props = this.props;\n      var pickPosition = animationProps ? animationProps._mousePosition : props.mousePosition;\n      var useDevicePixels = animationProps ? animationProps.useDevicePixels : props.useDevicePixels; // Clear picking position if not available\n\n      if (!pickPosition) {\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n\n        try {\n          for (var _iterator = this.props.models[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n            var model = _step.value;\n            model.updateModuleSettings({\n              pickingSelectedColor: null\n            });\n          }\n        } catch (err) {\n          _didIteratorError = true;\n          _iteratorError = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion && _iterator.return != null) {\n              _iterator.return();\n            }\n          } finally {\n            if (_didIteratorError) {\n              throw _iteratorError;\n            }\n          }\n        }\n\n        return;\n      }\n\n      var pickInfo = (0, _pickModels.default)(gl, {\n        models: this.props.models,\n        position: pickPosition,\n        useDevicePixels: useDevicePixels,\n        framebuffer: inputBuffer // Use as temporary frame buffer\n\n      }); // Highlight it\n\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = this.props.models[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var _model = _step2.value;\n\n          if (pickInfo && pickInfo.model === _model) {\n            var pickingSelectedColor = pickInfo && pickInfo.color || null;\n\n            _model.updateModuleSettings({\n              pickingSelectedColor: pickingSelectedColor\n            });\n          }\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n    }\n  }]);\n  return PickingPass;\n}(_pass.default);\n\nexports.default = PickingPass;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./pass\":\"En7M\",\"../core/pick-models\":\"WAG5\"}],\"bVtr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.parsePropTypes = parsePropTypes;\n\nvar _typeof2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/typeof\"));\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// // import assert from 'assert'; // TODO\nvar TYPE_DEFINITIONS = {\n  boolean: {\n    validate: function validate(value, propType) {\n      return true;\n    }\n  },\n  number: {\n    validateType: function validateType(value, propType) {\n      return 'value' in propType && (!('max' in propType) || Number.isFinite(propType.max)) && (!('min' in propType) || Number.isFinite(propType.min));\n    },\n    validate: function validate(value, propType) {\n      return Number.isFinite(value) && (!('max' in propType) || value <= propType.max) && (!('min' in propType) || value >= propType.min);\n    }\n  }\n};\n\nfunction parsePropTypes(propDefs) {\n  var propTypes = {};\n  var defaultProps = {};\n\n  var _arr = Object.entries(propDefs);\n\n  for (var _i = 0; _i < _arr.length; _i++) {\n    var _arr$_i = (0, _slicedToArray2.default)(_arr[_i], 2),\n        propName = _arr$_i[0],\n        propDef = _arr$_i[1];\n\n    var propType = parsePropType(propName, propDef);\n    propTypes[propName] = propType;\n    defaultProps[propName] = propType.value;\n  }\n\n  return {\n    propTypes: propTypes,\n    defaultProps: defaultProps\n  };\n} // Parses one property definition entry. Either contains:\n// * a valid prop type object ({type, ...})\n// * or just a default value, in which case type and name inference is used\n\n\nfunction parsePropType(name, propDef) {\n  switch (getTypeOf(propDef)) {\n    case 'object':\n      propDef = normalizePropType(name, propDef);\n      return parsePropDefinition(propDef);\n\n    case 'array':\n      return guessArrayType(name, propDef);\n\n    case 'boolean':\n      return {\n        name: name,\n        type: 'boolean',\n        value: propDef\n      };\n\n    case 'number':\n      return guessNumberType(name, propDef);\n\n    case 'function':\n      return {\n        name: name,\n        type: 'function',\n        value: propDef\n      };\n    // return guessFunctionType(name, propDef);\n\n    default:\n      return {\n        name: name,\n        type: 'unknown',\n        value: propDef\n      };\n  }\n}\n\nfunction guessArrayType(name, array) {\n  if (/color/i.test(name) && (array.length === 3 || array.length === 4)) {\n    return {\n      name: name,\n      type: 'color',\n      value: array\n    };\n  }\n\n  return {\n    name: name,\n    type: 'array',\n    value: array\n  };\n}\n\nfunction normalizePropType(name, propDef) {\n  if (!('type' in propDef)) {\n    if (!('value' in propDef)) {\n      // If no type and value this object is likely the value\n      return {\n        name: name,\n        type: 'object',\n        value: propDef\n      };\n    }\n\n    return Object.assign({\n      name: name,\n      type: getTypeOf(propDef.value)\n    }, propDef);\n  }\n\n  return Object.assign({\n    name: name\n  }, propDef);\n}\n\nfunction parsePropDefinition(propDef) {\n  var type = propDef.type;\n  var typeDefinition = TYPE_DEFINITIONS[type] || {};\n  var typeValidator = typeDefinition.typeValidator;\n\n  if (typeValidator) {// assert(typeValidator(propDef), 'Illegal prop type');\n  }\n\n  return propDef;\n}\n\nfunction guessNumberType(name, value) {\n  var isKnownProp = /radius|scale|width|height|pixel|size|miter/i.test(name) && /^((?!scale).)*$/.test(name);\n  var max = isKnownProp ? 100 : 1;\n  var min = 0;\n  return {\n    name: name,\n    type: 'number',\n    max: Math.max(value, max),\n    min: Math.min(value, min),\n    value: value\n  };\n} // improved version of javascript typeof that can distinguish arrays and null values\n\n\nfunction getTypeOf(value) {\n  if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n    return 'array';\n  }\n\n  if (value === null) {\n    return 'null';\n  }\n\n  return (0, _typeof2.default)(value);\n}\n},{\"@babel/runtime/helpers/esm/typeof\":\"xLw6\",\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\"}],\"nL5W\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.normalizeShaderModule = normalizeShaderModule;\n\nvar _propTypes = require(\"./prop-types\");\n\nfunction defaultGetUniforms(module, props) {\n  var uniforms = {};\n\n  if (props === undefined) {\n    for (var key in module.uniforms) {\n      uniforms[key] = module.uniforms[key].value;\n    }\n\n    return uniforms;\n  }\n\n  for (var _key in props) {\n    // TODO validate, clamp etc\n    uniforms[_key] = props[_key];\n  }\n\n  return uniforms;\n} // Note: modifies and returns the same module\n\n\nfunction normalizeShaderModule(module) {\n  if (!module.normalized) {\n    module.normalized = true; // Normalize uniforms\n\n    if (module.uniforms) {\n      var _parsePropTypes = (0, _propTypes.parsePropTypes)(module.uniforms),\n          propTypes = _parsePropTypes.propTypes;\n\n      module.uniforms = propTypes;\n    } // Build a getUniforms from the uniforms array\n\n\n    if (module.uniforms && !module.getUniforms) {\n      module.getUniforms = defaultGetUniforms.bind(null, module);\n    }\n  }\n\n  return module;\n}\n},{\"./prop-types\":\"bVtr\"}],\"FnHc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _pass = _interopRequireDefault(require(\"./pass\"));\n\nvar _compositePass = _interopRequireDefault(require(\"./composite-pass\"));\n\nvar _clipSpace = _interopRequireDefault(require(\"../models/clip-space\"));\n\nvar _normalizeModule = require(\"../shadertools/src/lib/filters/normalize-module\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n// A pass that renders a given texture into screen space\n//\nvar ShaderModuleSinglePass =\n/*#__PURE__*/\nfunction (_Pass) {\n  (0, _inherits2.default)(ShaderModuleSinglePass, _Pass);\n\n  function ShaderModuleSinglePass(gl) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, ShaderModuleSinglePass);\n    return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(ShaderModuleSinglePass).call(this, gl, Object.assign({\n      swap: true\n    }, props)));\n  }\n\n  (0, _createClass2.default)(ShaderModuleSinglePass, [{\n    key: \"_renderPass\",\n    value: function _renderPass(_ref) {\n      var inputBuffer = _ref.inputBuffer,\n          swapBuffers = _ref.swapBuffers;\n      this.props.model.setUniforms(this.props); // swapBuffers();\n\n      this.props.model.draw({\n        uniforms: {\n          texture: inputBuffer,\n          texSize: [inputBuffer.width, inputBuffer.height]\n        },\n        parameters: {\n          depthWrite: false,\n          depthTest: false\n        }\n      });\n    }\n  }]);\n  return ShaderModuleSinglePass;\n}(_pass.default);\n\nvar ShaderModulePass =\n/*#__PURE__*/\nfunction (_CompositePass) {\n  (0, _inherits2.default)(ShaderModulePass, _CompositePass);\n\n  function ShaderModulePass(gl, module) {\n    var _this;\n\n    var props = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    (0, _classCallCheck2.default)(this, ShaderModulePass);\n    var id = \"\".concat(module.name, \"-pass\");\n    (0, _normalizeModule.normalizeShaderModule)(module);\n    var passes = normalizePasses(gl, module, id, props);\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(ShaderModulePass).call(this, gl, Object.assign({\n      id: id,\n      passes: passes\n    }, props)));\n    _this.module = module;\n    return _this;\n  }\n\n  (0, _createClass2.default)(ShaderModulePass, [{\n    key: \"_renderPass\",\n    value: function _renderPass(_ref2) {\n      var inputBuffer = _ref2.inputBuffer,\n          swapBuffers = _ref2.swapBuffers;\n      var first = true;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = this.module.passes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var pass = _step.value;\n\n          if (!first) {\n            swapBuffers();\n          }\n\n          first = false;\n\n          if (pass.uniforms) {\n            pass.model.setUniforms(pass.uniforms);\n          } // swapBuffers();\n\n\n          pass.model.draw({\n            uniforms: {\n              texture: inputBuffer,\n              texSize: [inputBuffer.width, inputBuffer.height]\n            },\n            parameters: {\n              depthWrite: false,\n              depthTest: false\n            }\n          });\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }]);\n  return ShaderModulePass;\n}(_compositePass.default);\n\nexports.default = ShaderModulePass;\n\nfunction normalizePasses(gl, module, id, props) {\n  if (module.filter || module.sampler) {\n    var fs = getFragmentShaderForRenderPass(module);\n    var pass = new ShaderModuleSinglePass(gl, {\n      id: id,\n      model: getModel(gl, module, fs, id, props),\n      uniforms: null\n    });\n    return [pass];\n  }\n\n  var passes = module.passes || [];\n  return passes.map(function (pass) {\n    var fs = getFragmentShaderForRenderPass(module, pass);\n    var idn = \"\".concat(id, \"-\").concat(passes.length + 1);\n    return new ShaderModuleSinglePass(gl, Object.assign({\n      id: idn,\n      model: getModel(gl, module, fs, idn, props),\n      uniforms: pass.uniforms\n    }, props));\n  });\n}\n\nfunction getModel(gl, module, fs, id, props) {\n  var model = new _clipSpace.default(gl, {\n    id: id,\n    fs: fs,\n    modules: [module]\n  });\n  var uniforms = Object.assign(module.getUniforms(), module.getUniforms(props));\n  model.setUniforms(uniforms);\n  return model;\n}\n\nvar FILTER_FS_TEMPLATE = function FILTER_FS_TEMPLATE(func) {\n  return \"uniform sampler2D texture;\\nuniform vec2 texSize;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main() {\\n  vec2 texCoord = coordinate;\\n\\n  gl_FragColor = texture2D(texture, texCoord);\\n  gl_FragColor = \".concat(func, \"(gl_FragColor, texSize, texCoord);\\n}\\n\");\n};\n\nvar SAMPLER_FS_TEMPLATE = function SAMPLER_FS_TEMPLATE(func) {\n  return \"uniform sampler2D texture;\\nuniform vec2 texSize;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main() {\\n  vec2 texCoord = coordinate;\\n\\n  gl_FragColor = \".concat(func, \"(texture, texSize, texCoord);\\n}\\n\");\n};\n\nfunction getFragmentShaderForRenderPass(module) {\n  var pass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : module;\n\n  if (pass.filter) {\n    var func = typeof pass.filter === 'string' ? pass.filter : \"\".concat(module.name, \"_filterColor\");\n    return FILTER_FS_TEMPLATE(func);\n  }\n\n  if (pass.sampler) {\n    var _func = typeof pass.sampler === 'string' ? pass.sampler : \"\".concat(module.name, \"_sampleColor\");\n\n    return SAMPLER_FS_TEMPLATE(_func);\n  } // console.error(`${module.name} no fragment shader generated`);\n\n\n  return null;\n}\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"./pass\":\"En7M\",\"./composite-pass\":\"BMzv\",\"../models/clip-space\":\"fvbP\",\"../shadertools/src/lib/filters/normalize-module\":\"nL5W\"}],\"SpGf\":[function(require,module,exports) {\nfunction _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;\n},{}],\"IxO8\":[function(require,module,exports) {\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nmodule.exports = _defineProperty;\n},{}],\"EaTi\":[function(require,module,exports) {\n\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.installParameterDefinitions = installParameterDefinitions;\nexports.TEXTURE_PARAMETERS = exports.SAMPLER_PARAMETERS = exports.RENDERBUFFER_PARAMETERS = exports.PROGRAM_PARAMETERS = exports.FRAMEBUFFER_STATUS = exports.FRAMEBUFFER_ATTACHMENT_PARAMETERS = exports.FENCE_SYNC_PARAMETERS = exports.BUFFER_PARAMETERS = exports.GLboolean = exports.GLuint = exports.GLint = exports.GLfloat = exports.GLenum = void 0;\n\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n\nvar _BUFFER_PARAMETERS, _FRAMEBUFFER_STATUS, _PROGRAM_PARAMETERS, _RENDERBUFFER_PARAMET, _SAMPLER_PARAMETERS, _TEXTURE_PARAMETERS;\n\n// Parameter support.\n// Installs definitions that enable querying an object for all its parameters\n// with resource.getParameters(). This is mainly useful during debugging.\n// Note: Kept separate to avoid bundling in production applications\n// WebGL specification 'types'\nvar GLenum = 'GLenum';\nexports.GLenum = GLenum;\nvar GLfloat = 'GLfloat';\nexports.GLfloat = GLfloat;\nvar GLint = 'GLint';\nexports.GLint = GLint;\nvar GLuint = 'GLint';\nexports.GLuint = GLuint;\nvar GLboolean = 'GLboolean';\n/*\n TODO - will most likely remove some of these fields from the main struct\n but they can be useful for debugging/seer integration, so keep them here for now\nexport const DBG_PARAMETERS = {\n  blend: {\n    type: GLboolean,\n    params: GL.BLEND,\n    value: false,\n    setter: (gl, value) => value ? gl.enable(GL.BLEND) : gl.disable(GL.BLEND)\n  },\n\n  blendColor: {\n    type: new Float32Array(4),\n    value: new Float32Array([0, 0, 0, 0]),\n    params: GL.BLEND_COLOR,\n    setter: (gl, value) => gl.blendColor(...value)\n  },\n\n  blendEquation: {\n    type: [GLenum, GLenum],\n    object: ['rgb', 'alpha'],\n    alias: 'blendEquationSeparate',\n    value: [GL.FUNC_ADD, GL.FUNC_ADD],\n    params: [GL.BLEND_EQUATION_RGB, GL.BLEND_EQUATION_ALPHA],\n    setter: (gl, value) => gl.blendEquationSeparate(...value),\n    normalizeArgs: args => isArray(args) ? args : [args, args]\n  },\n\n  // blend func\n  blendFunc: {\n    type: [GLenum, GLenum, GLenum, GLenum],\n    object: ['srcRgb', 'dstRgb', 'srcAlpha', 'dstAlpha'],\n    value: [GL.ONE, GL.ZERO, GL.ONE, GL.ZERO],\n    params: [GL.BLEND_SRC_RGB, GL.BLEND_DST_RGB, GL.BLEND_SRC_ALPHA, GL.BLEND_DST_ALPHA],\n    setter: (gl, value) => gl.blendFuncSeparate(...value),\n    normalizeArgs: args => isArray(args) && args.length === 3 ? [...args, ...args] : args\n  },\n\n  clearColor: {\n    type: new Float32Array(4),\n    params: GL.COLOR_CLEAR_VALUE,\n    value: new Float32Array([0, 0, 0, 0]), // TBD\n    setter: (gl, value) => gl.clearColor(...value)\n  },\n\n  colorMask: {\n    type: [GLboolean, GLboolean, GLboolean, GLboolean],\n    params: GL.COLOR_WRITEMASK,\n    value: [true, true, true, true],\n    setter: (gl, value) => gl.colorMask(...value)\n  },\n\n  // TODO - We have a name clash here\n  cullFace: {\n    type: GLboolean,\n    params: GL.CULL_FACE,\n    value: false,\n    setter: (gl, value) => value ? gl.enable(GL.CULL_FACE) : gl.disable(GL.CULL_FACE)\n  },\n\n  cullFaceMode: {\n    type: GLenum,\n    params: GL.CULL_FACE_MODE,\n    value: GL.BACK,\n    setter: (gl, value) => gl.cullFace(value)\n  },\n\n  depthTest: {\n    type: GLboolean,\n    params: GL.DEPTH_TEST,\n    value: false,\n    setter: (gl, value) => value ? gl.enable(GL.DEPTH_TEST) : gl.disable(GL.DEPTH_TEST)\n  },\n\n  depthClearValue: {\n    type: GLfloat,\n    params: GL.DEPTH_CLEAR_VALUE,\n    value: 1,\n    setter: (gl, value) => gl.clearDepth(value)\n  },\n\n  depthFunc: {\n    type: GLenum,\n    params: GL.DEPTH_FUNC,\n    value: GL.LESS,\n    setter: (gl, value) => gl.depthFunc(value)\n  },\n\n  depthRange: {\n    type: new Float32Array(2),\n    object: ['min', 'max'],\n    params: GL.DEPTH_RANGE,\n    value: new Float32Array([0, 1]), // TBD\n    setter: (gl, value) => gl.depthRange(...value)\n  },\n\n  depthWritemask: {\n    type: GLboolean,\n    params: GL.DEPTH_WRITEMASK,\n    value: true,\n    setter: (gl, value) => gl.depthMask(value)\n  },\n\n  dither: {\n    type: GLboolean,\n    params: GL.DITHER,\n    value: true,\n    setter: (gl, value) => value ? gl.enable(GL.DITHER) : gl.disable(GL.DITHER)\n  },\n\n  fragmentShaderDerivativeHint: {\n    type: GLenum,\n    params: GL.FRAGMENT_SHADER_DERIVATIVE_HINT,\n    value: GL.DONT_CARE,\n    setter: (gl, value) => gl.hint(GL.FRAGMENT_SHADER_DERIVATIVE_HINT, value),\n    gl1: 'OES_standard_derivatives'\n  },\n\n  frontFace: {\n    type: GLenum,\n    params: GL.FRONT_FACE,\n    value: GL.CCW,\n    setter: (gl, value) => gl.frontFace(value)\n  },\n\n  // Hint for quality of images generated with glGenerateMipmap\n  generateMipmapHint: {\n    type: GLenum,\n    params: GL.GENERATE_MIPMAP_HINT,\n    value: GL.DONT_CARE,\n    setter: (gl, value) => gl.hint(GL.GENERATE_MIPMAP_HINT, value)\n  },\n\n  lineWidth: {\n    type: GLfloat,\n    params: GL.LINE_WIDTH,\n    value: 1,\n    setter: (gl, value) => gl.lineWidth(value)\n  },\n\n  polygonOffsetFill: {\n    type: GLboolean,\n    params: GL.POLYGON_OFFSET_FILL,\n    value: false,\n    setter: (gl, value) =>\n      value ? gl.enable(GL.POLYGON_OFFSET_FILL) : gl.disable(GL.POLYGON_OFFSET_FILL)\n  },\n\n  // Add small offset to fragment depth values (by factor × DZ + r × units)\n  // Useful for rendering hidden-line images, for applying decals to surfaces,\n  // and for rendering solids with highlighted edges.\n  // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glPolygonOffset.xml\n  polygonOffset: {\n    type: [GLfloat, GLfloat],\n    object: ['factor', 'units'],\n    params: [GL.POLYGON_OFFSET_FACTOR, GL.POLYGON_OFFSET_UNITS],\n    value: [0, 0],\n    setter: (gl, value) => gl.polygonOffset(...value)\n  },\n\n  // TODO - enabling multisampling\n  // glIsEnabled with argument GL_SAMPLE_ALPHA_TO_COVERAGE\n  // glIsEnabled with argument GL_SAMPLE_COVERAGE\n\n  // specify multisample coverage parameters\n  // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glSampleCoverage.xml\n  sampleCoverage: {\n    type: [GLfloat, GLboolean],\n    object: ['value', 'invert'],\n    params: [GL.SAMPLE_COVERAGE_VALUE, GL.SAMPLE_COVERAGE_INVERT],\n    value: [1.0, false],\n    setter: (gl, value) => gl.sampleCoverage(...value)\n  },\n\n  scissorTest: {\n    type: GLboolean,\n    params: GL.SCISSOR_TEST,\n    value: false,\n    setter: (gl, value) => value ? gl.enable(GL.SCISSOR_TEST) : gl.disable(GL.SCISSOR_TEST)\n  },\n\n  scissorBox: {\n    type: new Int32Array(4),\n    object: ['x', 'y', 'width', 'height'],\n    // When scissor test enabled we expect users to set correct scissor box,\n    // otherwise we default to following value array.\n    params: GL.SCISSOR_BOX,\n    value: new Int32Array([0, 0, 1024, 1024]),\n    setter: (gl, value) => gl.scissor(...value)\n  },\n\n  stencilTest: {\n    type: GLboolean,\n    params: GL.STENCIL_TEST,\n    value: false,\n    setter: (gl, value) => value ? gl.enable(GL.STENCIL_TEST) : gl.disable(GL.STENCIL_TEST)\n  },\n\n  // Sets index used when stencil buffer is cleared.\n  stencilClearValue: {\n    type: GLint,\n    params: GL.STENCIL_CLEAR_VALUE,\n    value: 0,\n    setter: (gl, value) => gl.clearStencil(value)\n  },\n\n  // Sets bit mask enabling writing of individual bits in the stencil planes\n  // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glStencilMaskSeparate.xml\n  stencilMask: {\n    type: [GLuint, GLuint],\n    object: ['mask', 'backMask'],\n    value: [0xFFFFFFFF, 0xFFFFFFFF],\n    params: [GL.STENCIL_WRITEMASK, GL.STENCIL_BACK_WRITEMASK],\n    setter: (gl, value) => {\n      value = isArray(value) ? value : [value, value];\n      const [mask, backMask] = value;\n      gl.stencilMaskSeparate(GL.FRONT, mask);\n      gl.stencilMaskSeparate(GL.BACK, backMask);\n    }\n  },\n\n  // Set stencil testing function, reference value and mask for front and back\n  // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glStencilFuncSeparate.xml\n  stencilFunc: {\n    type: [GLenum, GLint, GLuint, GLenum, GLint, GLuint],\n    object: [\n      'func', 'ref', 'valueMask', 'backFunc', 'backRef', 'backValueMask'\n    ],\n    value: [GL.ALWAYS, 0, 0xFFFFFFFF, GL.ALWAYS, 0, 0xFFFFFFFF],\n    params: [\n      // front\n      GL.STENCIL_FUNC,\n      GL.STENCIL_REF,\n      GL.STENCIL_VALUE_MASK,\n      // back\n      GL.STENCIL_BACK_FUNC,\n      GL.STENCIL_BACK_REF,\n      GL.STENCIL_BACK_VALUE_MASK\n    ],\n    setter: (gl, value) => {\n      const [func, ref, mask, backFunc, backRef, backMask] = value;\n      gl.stencilFuncSeparate(GL.FRONT, func, ref, mask);\n      gl.stencilFuncSeparate(GL.BACK, backFunc, backRef, backMask);\n    }\n  },\n\n  // Specifies the action to take when the stencil test fails, front and back.\n  // Stencil test fail action, depth test fail action, pass action\n  // GL.KEEP, GL.ZERO, GL.REPLACE, GL.INCR, GL.INCR_WRAP, GL.DECR, GL.DECR_WRAP,\n  // and GL.INVERT\n  // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glStencilOpSeparate.xml\n  stencilOp: {\n    type: [GLenum, GLenum, GLenum, GLenum, GLenum, GLenum],\n    object: [\n      'fail', 'passDepthFail', 'passDepthPass',\n      'backFail', 'backPassDepthFail', 'backPassDepthPass'\n    ],\n    params: [\n      // front\n      GL.STENCIL_FAIL,\n      GL.STENCIL_PASS_DEPTH_FAIL,\n      GL.STENCIL_PASS_DEPTH_PASS,\n      // back\n      GL.STENCIL_BACK_FAIL,\n      GL.STENCIL_BACK_PASS_DEPTH_FAIL,\n      GL.STENCIL_BACK_PASS_DEPTH_PASS\n    ],\n    value: [GL.KEEP, GL.KEEP, GL.KEEP, GL.KEEP, GL.KEEP, GL.KEEP],\n    setter: (gl, value) => {\n      const [sfail, dpfail, dppass, backSfail, backDpfail, backDppass] = value;\n      gl.stencilOpSeparate(GL.FRONT, sfail, dpfail, dppass);\n      gl.stencilOpSeparate(GL.BACK, backSfail, backDpfail, backDppass);\n    }\n  },\n\n  viewport: {\n    type: new Int32Array(4),\n    object: ['x', 'y', 'width', 'height'],\n    // We use [0, 0, 1024, 1024] as default, but usually this is updated in each frame.\n    params: GL.VIEWPORT,\n    value: new Int32Array([0, 0, 1024, 1024]),\n    setter: (gl, value) => gl.viewport(...value)\n  },\n\n  // WEBGL1 PIXEL PACK/UNPACK MODES\n\n  // Packing of pixel data in memory (1,2,4,8)\n  [GL.PACK_ALIGNMENT]: {\n    type: GLint,\n    params: GL.PACK_ALIGNMENT,\n    value: 4,\n    setter: (gl, value) => gl.pixelStorei(GL.PACK_ALIGNMENT, value)\n  },\n  // Unpacking pixel data from memory(1,2,4,8)\n  [GL.UNPACK_ALIGNMENT]: {\n    type: GLint,\n    params: GL.UNPACK_ALIGNMENT,\n    value: 4,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_ALIGNMENT, value)\n  },\n  // Flip source data along its vertical axis\n  [GL.UNPACK_FLIP_Y_WEBGL]: {\n    type: GLboolean,\n    params: GL.UNPACK_FLIP_Y_WEBGL,\n    value: false,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_FLIP_Y_WEBGL, value)\n  },\n  // Multiplies the alpha channel into the other color channels\n  [GL.UNPACK_PREMULTIPLY_ALPHA_WEBGL]: {\n    type: GLboolean,\n    params: GL.UNPACK_PREMULTIPLY_ALPHA_WEBGL,\n    value: false,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_PREMULTIPLY_ALPHA_WEBGL, value)\n  },\n  // Default color space conversion or no color space conversion.\n  [GL.UNPACK_COLORSPACE_CONVERSION_WEBGL]: {\n    type: GLenum,\n    params: GL.UNPACK_COLORSPACE_CONVERSION_WEBGL,\n    value: GL.BROWSER_DEFAULT_WEBGL,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_COLORSPACE_CONVERSION_WEBGL, value)\n  },\n\n  // WEBGL2 PIXEL PACK/UNPACK MODES\n\n  // Number of pixels in a row.\n  [GL.PACK_ROW_LENGTH]: {\n    type: GLint,\n    params: GL.PACK_ROW_LENGTH,\n    value: 0,\n    setter: (gl, value) => gl.pixelStorei(GL.PACK_ROW_LENGTH, value),\n    webgl2: true\n  },\n  // Number of pixels skipped before the first pixel is written into memory.\n  [GL.PACK_SKIP_PIXELS]: {\n    type: GLint,\n    params: GL.PACK_SKIP_PIXELS,\n    value: 0,\n    setter: (gl, value) => gl.pixelStorei(GL.PACK_SKIP_PIXELS, value),\n    webgl2: true\n  },\n  // Number of rows of pixels skipped before first pixel is written to memory.\n  [GL.PACK_SKIP_ROWS]: {\n    type: GLint,\n    params: GL.PACK_SKIP_ROWS,\n    value: 0,\n    setter: (gl, value) => gl.pixelStorei(GL.PACK_SKIP_ROWS, value),\n    webgl2: true\n  },\n  // Number of pixels in a row.\n  [GL.UNPACK_ROW_LENGTH]: {\n    type: GLint,\n    params: GL.UNPACK_ROW_LENGTH,\n    value: 0,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_ROW_LENGTH, value),\n    webgl2: true\n  },\n  // Image height used for reading pixel data from memory\n  [GL.UNPACK_IMAGE_HEIGHT]: {\n    type: GLint,\n    params: GL.UNPACK_IMAGE_HEIGHT,\n    value: 0,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_IMAGE_HEIGHT, value),\n    webgl2: true\n  },\n  // Number of pixel images skipped before first pixel is read from memory\n  [GL.UNPACK_SKIP_PIXELS]: {\n    type: GLint,\n    params: GL.UNPACK_SKIP_PIXELS,\n    value: 0,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_SKIP_PIXELS, value),\n    webgl2: true\n  },\n  // Number of rows of pixels skipped before first pixel is read from memory\n  [GL.UNPACK_SKIP_ROWS]: {\n    type: GLint,\n    params: GL.UNPACK_SKIP_ROWS,\n    value: 0,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_SKIP_ROWS, value),\n    webgl2: true\n  },\n  // Number of pixel images skipped before first pixel is read from memory\n  [GL.UNPACK_SKIP_IMAGES]: {\n    type: GLint,\n    params: GL.UNPACK_SKIP_IMAGES,\n    value: 0,\n    setter: (gl, value) => gl.pixelStorei(GL.UNPACK_SKIP_IMAGES, value),\n    webgl2: true\n  }\n};\n*/\n\nexports.GLboolean = GLboolean;\nvar BUFFER_PARAMETERS = (_BUFFER_PARAMETERS = {}, (0, _defineProperty2.default)(_BUFFER_PARAMETERS, 34660, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_BUFFER_PARAMETERS, 34661, {\n  webgl1: 0 // GLenum indicating the usage pattern of the buffer.\n\n}), _BUFFER_PARAMETERS);\nexports.BUFFER_PARAMETERS = BUFFER_PARAMETERS;\nvar FENCE_SYNC_PARAMETERS = [37138, // GLenum, type of sync object (always GL.SYNC_FENCE).\n37140, // GLenum, status of sync object (GL.SIGNALED/GL.UNSIGNALED)\n37139, // GLenum. object condition (always GL.SYNC_GPU_COMMANDS_COMPLETE).\n37141 // GLenum, flags sync object was created with (always 0)\n];\nexports.FENCE_SYNC_PARAMETERS = FENCE_SYNC_PARAMETERS;\nvar FRAMEBUFFER_ATTACHMENT_PARAMETERS = [36049, // WebGLRenderbuffer or WebGLTexture\n36048, // GL.RENDERBUFFER, GL.TEXTURE, GL.NONE\n36051, // GL.TEXTURE_CUBE_MAP_POSITIVE_X, etc.\n36050, // GLint\n// EXT_sRGB or WebGL2\n33296, // GL.LINEAR, GL.SRBG\n// WebGL2\n36052, // GLint\n33298, // GLint\n33299, // GLint\n33300, // GLint\n33301, // GLint\n33302, // GLint\n33303, // GLint\n33297 // GL.FLOAT, GL.INT, GL.UNSIGNED_INT, GL.SIGNED_NORMALIZED, OR GL.UNSIGNED_NORMALIZED.\n];\nexports.FRAMEBUFFER_ATTACHMENT_PARAMETERS = FRAMEBUFFER_ATTACHMENT_PARAMETERS;\nvar FRAMEBUFFER_STATUS = (_FRAMEBUFFER_STATUS = {}, (0, _defineProperty2.default)(_FRAMEBUFFER_STATUS, 36053, 'Success. Framebuffer is correctly set up'), (0, _defineProperty2.default)(_FRAMEBUFFER_STATUS, 36054, 'Framebuffer attachment types mismatched or some attachment point not attachment complete'), (0, _defineProperty2.default)(_FRAMEBUFFER_STATUS, 36055, 'Framebuffer has no attachment'), (0, _defineProperty2.default)(_FRAMEBUFFER_STATUS, 36057, 'Framebuffer attachments do not have the same size'), (0, _defineProperty2.default)(_FRAMEBUFFER_STATUS, 36061, 'Framebuffer attachment format not supported or depth and stencil attachments are not same'), (0, _defineProperty2.default)(_FRAMEBUFFER_STATUS, 36182, 'Framebuffer attachement SAMPLES differs among renderbuffers, or are mixed with textures'), _FRAMEBUFFER_STATUS);\nexports.FRAMEBUFFER_STATUS = FRAMEBUFFER_STATUS;\nvar PROGRAM_PARAMETERS = (_PROGRAM_PARAMETERS = {}, (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35712, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35714, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35715, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35717, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35721, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35718, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35967, {\n  webgl2: 0\n}), (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35971, {\n  webgl2: 0\n}), (0, _defineProperty2.default)(_PROGRAM_PARAMETERS, 35382, {\n  webgl2: 0 // GLint\n\n}), _PROGRAM_PARAMETERS); //  parameters\n\nexports.PROGRAM_PARAMETERS = PROGRAM_PARAMETERS;\nvar RENDERBUFFER_PARAMETERS = (_RENDERBUFFER_PARAMET = {}, (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36162, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36163, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36164, {\n  type: 'GLenum',\n  webgl1: 32854\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36177, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36178, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36176, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36179, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36180, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36181, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_RENDERBUFFER_PARAMET, 36011, {\n  webgl2: 1\n}), _RENDERBUFFER_PARAMET);\nexports.RENDERBUFFER_PARAMETERS = RENDERBUFFER_PARAMETERS;\nvar SAMPLER_PARAMETERS = (_SAMPLER_PARAMETERS = {}, (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 10240, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 10241, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 10242, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 10243, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 32882, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 33084, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 33085, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 34893, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 34892, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 33082, {\n  webgl2: true\n}), (0, _defineProperty2.default)(_SAMPLER_PARAMETERS, 33083, {\n  webgl2: true // maximum level-of-detail value\n  // [GL.TEXTURE_MAX_ANISOTROPY_EXT]: {webgl2: 'EXT_texture_filter_anisotropic'}\n\n}), _SAMPLER_PARAMETERS); // const SHADER_PARAMETERS = [\n//   GL.DELETE_STATUS, // GLboolean - whether shader is flagged for deletion.\n//   GL.COMPILE_STATUS, // GLboolean - was last shader compilation successful.\n//   GL.SHADER_TYPE // GLenum - GL.VERTEX_SHADER or GL.FRAGMENT_SHADER.\n// ];\n\nexports.SAMPLER_PARAMETERS = SAMPLER_PARAMETERS;\nvar TEXTURE_PARAMETERS = (_TEXTURE_PARAMETERS = {}, (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 10240, {\n  type: 'GLenum',\n  webgl1: 9729\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 10241, {\n  type: 'GLenum',\n  webgl1: 9986\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 10242, {\n  type: 'GLenum',\n  webgl1: 10497\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 10243, {\n  type: 'GLenum',\n  webgl1: 10497\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 32882, {\n  type: 'GLenum',\n  webgl2: 10497\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 33084, {\n  webgl2: 0\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 33085, {\n  webgl2: 1000\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 34893, {\n  type: 'GLenum',\n  webgl2: 515\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 34892, {\n  type: 'GLenum',\n  webgl2: 0\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 33082, {\n  webgl2: -1000\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 33083, {\n  webgl2: 1000\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 4096, {\n  webgl1: 0\n}), (0, _defineProperty2.default)(_TEXTURE_PARAMETERS, 4097, {\n  webgl1: 0\n}), _TEXTURE_PARAMETERS); // TODO - separate install parameter definitions function from api metadata\n\n/*\nimport Buffer from '../buffer';\nimport FenceSync from '../fence-sync';\nimport Framebuffer from '../framebuffer';\nimport Program from '../program';\nimport Renderbuffer from '../renderbuffer';\nimport Sampler from '../sampler';\n// import Shader from './shader';\nimport Texture from '../texture';\n*/\n\nexports.TEXTURE_PARAMETERS = TEXTURE_PARAMETERS;\n\nfunction installParameterDefinitions() {// Buffer.PARAMETERS = BUFFER_PARAMETERS;\n  // FenceSync.PARAMETERS = FENCE_SYNC_PARAMETERS;\n  // Framebuffer.ATTACHMENT_PARAMETERS = FRAMEBUFFER_ATTACHMENT_PARAMETERS;\n  // Framebuffer.STATUS = FRAMEBUFFER_STATUS;\n  // Program.PARAMETERS = PROGRAM_PARAMETERS;\n  // Renderbuffer.PARAMETERS = RENDERBUFFER_PARAMETERS;\n  // Sampler.PARAMETERS = SAMPLER_PARAMETERS;\n  // // Shader.PARAMETERS = SHADER_PARAMETERS;\n  // Texture.PARAMETERS = TEXTURE_PARAMETERS;\n}\n//# sourceMappingURL=debug-parameters.js.map\n},{\"@babel/runtime/helpers/interopRequireDefault\":\"SpGf\",\"@babel/runtime/helpers/defineProperty\":\"IxO8\"}],\"SFHu\":[function(require,module,exports) {\nvar global = arguments[3];\n/*\n** Copyright (c) 2012 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n//Ported to node by Marcin Ignac on 2016-05-20\n\n// Various functions for helping debug WebGL apps.\n\nWebGLDebugUtils = function() {\nvar window\n\n//polyfill window in node\nif (typeof(window) == 'undefined') {\n    window = global;\n}\n\n/**\n * Wrapped logging function.\n * @param {string} msg Message to log.\n */\nvar log = function(msg) {\n  if (window.console && window.console.log) {\n    window.console.log(msg);\n  }\n};\n\n/**\n * Wrapped error logging function.\n * @param {string} msg Message to log.\n */\nvar error = function(msg) {\n  if (window.console && window.console.error) {\n    window.console.error(msg);\n  } else {\n    log(msg);\n  }\n};\n\n\n/**\n * Which arguments are enums based on the number of arguments to the function.\n * So\n *    'texImage2D': {\n *       9: { 0:true, 2:true, 6:true, 7:true },\n *       6: { 0:true, 2:true, 3:true, 4:true },\n *    },\n *\n * means if there are 9 arguments then 6 and 7 are enums, if there are 6\n * arguments 3 and 4 are enums\n *\n * @type {!Object.<number, !Object.<number, string>}\n */\nvar glValidEnumContexts = {\n  // Generic setters and getters\n\n  'enable': {1: { 0:true }},\n  'disable': {1: { 0:true }},\n  'getParameter': {1: { 0:true }},\n\n  // Rendering\n\n  'drawArrays': {3:{ 0:true }},\n  'drawElements': {4:{ 0:true, 2:true }},\n\n  // Shaders\n\n  'createShader': {1: { 0:true }},\n  'getShaderParameter': {2: { 1:true }},\n  'getProgramParameter': {2: { 1:true }},\n  'getShaderPrecisionFormat': {2: { 0: true, 1:true }},\n\n  // Vertex attributes\n\n  'getVertexAttrib': {2: { 1:true }},\n  'vertexAttribPointer': {6: { 2:true }},\n\n  // Textures\n\n  'bindTexture': {2: { 0:true }},\n  'activeTexture': {1: { 0:true }},\n  'getTexParameter': {2: { 0:true, 1:true }},\n  'texParameterf': {3: { 0:true, 1:true }},\n  'texParameteri': {3: { 0:true, 1:true, 2:true }},\n  // texImage2D and texSubImage2D are defined below with WebGL 2 entrypoints\n  'copyTexImage2D': {8: { 0:true, 2:true }},\n  'copyTexSubImage2D': {8: { 0:true }},\n  'generateMipmap': {1: { 0:true }},\n  // compressedTexImage2D and compressedTexSubImage2D are defined below with WebGL 2 entrypoints\n\n  // Buffer objects\n\n  'bindBuffer': {2: { 0:true }},\n  // bufferData and bufferSubData are defined below with WebGL 2 entrypoints\n  'getBufferParameter': {2: { 0:true, 1:true }},\n\n  // Renderbuffers and framebuffers\n\n  'pixelStorei': {2: { 0:true, 1:true }},\n  // readPixels is defined below with WebGL 2 entrypoints\n  'bindRenderbuffer': {2: { 0:true }},\n  'bindFramebuffer': {2: { 0:true }},\n  'checkFramebufferStatus': {1: { 0:true }},\n  'framebufferRenderbuffer': {4: { 0:true, 1:true, 2:true }},\n  'framebufferTexture2D': {5: { 0:true, 1:true, 2:true }},\n  'getFramebufferAttachmentParameter': {3: { 0:true, 1:true, 2:true }},\n  'getRenderbufferParameter': {2: { 0:true, 1:true }},\n  'renderbufferStorage': {4: { 0:true, 1:true }},\n\n  // Frame buffer operations (clear, blend, depth test, stencil)\n\n  'clear': {1: { 0: { 'enumBitwiseOr': ['COLOR_BUFFER_BIT', 'DEPTH_BUFFER_BIT', 'STENCIL_BUFFER_BIT'] }}},\n  'depthFunc': {1: { 0:true }},\n  'blendFunc': {2: { 0:true, 1:true }},\n  'blendFuncSeparate': {4: { 0:true, 1:true, 2:true, 3:true }},\n  'blendEquation': {1: { 0:true }},\n  'blendEquationSeparate': {2: { 0:true, 1:true }},\n  'stencilFunc': {3: { 0:true }},\n  'stencilFuncSeparate': {4: { 0:true, 1:true }},\n  'stencilMaskSeparate': {2: { 0:true }},\n  'stencilOp': {3: { 0:true, 1:true, 2:true }},\n  'stencilOpSeparate': {4: { 0:true, 1:true, 2:true, 3:true }},\n\n  // Culling\n\n  'cullFace': {1: { 0:true }},\n  'frontFace': {1: { 0:true }},\n\n  // ANGLE_instanced_arrays extension\n\n  'drawArraysInstancedANGLE': {4: { 0:true }},\n  'drawElementsInstancedANGLE': {5: { 0:true, 2:true }},\n\n  // EXT_blend_minmax extension\n\n  'blendEquationEXT': {1: { 0:true }},\n\n  // WebGL 2 Buffer objects\n\n  'bufferData': {\n    3: { 0:true, 2:true }, // WebGL 1\n    4: { 0:true, 2:true }, // WebGL 2\n    5: { 0:true, 2:true }  // WebGL 2\n  },\n  'bufferSubData': {\n    3: { 0:true }, // WebGL 1\n    4: { 0:true }, // WebGL 2\n    5: { 0:true }  // WebGL 2\n  },\n  'copyBufferSubData': {5: { 0:true, 1:true }},\n  'getBufferSubData': {3: { 0:true }, 4: { 0:true }, 5: { 0:true }},\n\n  // WebGL 2 Framebuffer objects\n\n  'blitFramebuffer': {10: { 8: { 'enumBitwiseOr': ['COLOR_BUFFER_BIT', 'DEPTH_BUFFER_BIT', 'STENCIL_BUFFER_BIT'] }, 9:true }},\n  'framebufferTextureLayer': {5: { 0:true, 1:true }},\n  'invalidateFramebuffer': {2: { 0:true }},\n  'invalidateSubFramebuffer': {6: { 0:true }},\n  'readBuffer': {1: { 0:true }},\n\n  // WebGL 2 Renderbuffer objects\n\n  'getInternalformatParameter': {3: { 0:true, 1:true, 2:true }},\n  'renderbufferStorageMultisample': {5: { 0:true, 2:true }},\n\n  // WebGL 2 Texture objects\n\n  'texStorage2D': {5: { 0:true, 2:true }},\n  'texStorage3D': {6: { 0:true, 2:true }},\n  'texImage2D': {\n    9: { 0:true, 2:true, 6:true, 7:true }, // WebGL 1 & 2\n    6: { 0:true, 2:true, 3:true, 4:true }, // WebGL 1\n    10: { 0:true, 2:true, 6:true, 7:true } // WebGL 2\n  },\n  'texImage3D': {\n    10: { 0:true, 2:true, 7:true, 8:true },\n    11: { 0:true, 2:true, 7:true, 8:true }\n  },\n  'texSubImage2D': {\n    9: { 0:true, 6:true, 7:true }, // WebGL 1 & 2\n    7: { 0:true, 4:true, 5:true }, // WebGL 1\n    10: { 0:true, 6:true, 7:true } // WebGL 2\n  },\n  'texSubImage3D': {\n    11: { 0:true, 8:true, 9:true },\n    12: { 0:true, 8:true, 9:true }\n  },\n  'copyTexSubImage3D': {9: { 0:true }},\n  'compressedTexImage2D': {\n    7: { 0: true, 2:true }, // WebGL 1 & 2\n    8: { 0: true, 2:true }, // WebGL 2\n    9: { 0: true, 2:true }  // WebGL 2\n  },\n  'compressedTexImage3D': {\n    8: { 0: true, 2:true },\n    9: { 0: true, 2:true },\n    10: { 0: true, 2:true }\n  },\n  'compressedTexSubImage2D': {\n    8: { 0: true, 6:true }, // WebGL 1 & 2\n    9: { 0: true, 6:true }, // WebGL 2\n    10: { 0: true, 6:true } // WebGL 2\n  },\n  'compressedTexSubImage3D': {\n    10: { 0: true, 8:true },\n    11: { 0: true, 8:true },\n    12: { 0: true, 8:true }\n  },\n\n  // WebGL 2 Vertex attribs\n\n  'vertexAttribIPointer': {5: { 2:true }},\n\n  // WebGL 2 Writing to the drawing buffer\n\n  'drawArraysInstanced': {4: { 0:true }},\n  'drawElementsInstanced': {5: { 0:true, 2:true }},\n  'drawRangeElements': {6: { 0:true, 4:true }},\n\n  // WebGL 2 Reading back pixels\n\n  'readPixels': {\n    7: { 4:true, 5:true }, // WebGL 1 & 2\n    8: { 4:true, 5:true }  // WebGL 2\n  },\n\n  // WebGL 2 Multiple Render Targets\n\n  'clearBufferfv': {3: { 0:true }, 4: { 0:true }},\n  'clearBufferiv': {3: { 0:true }, 4: { 0:true }},\n  'clearBufferuiv': {3: { 0:true }, 4: { 0:true }},\n  'clearBufferfi': {4: { 0:true }},\n\n  // WebGL 2 Query objects\n\n  'beginQuery': {2: { 0:true }},\n  'endQuery': {1: { 0:true }},\n  'getQuery': {2: { 0:true, 1:true }},\n  'getQueryParameter': {2: { 1:true }},\n\n  // WebGL 2 Sampler objects\n\n  'samplerParameteri': {3: { 1:true, 2:true }},\n  'samplerParameterf': {3: { 1:true }},\n  'getSamplerParameter': {2: { 1:true }},\n\n  // WebGL 2 Sync objects\n\n  'fenceSync': {2: { 0:true, 1: { 'enumBitwiseOr': [] } }},\n  'clientWaitSync': {3: { 1: { 'enumBitwiseOr': ['SYNC_FLUSH_COMMANDS_BIT'] } }},\n  'waitSync': {3: { 1: { 'enumBitwiseOr': [] } }},\n  'getSyncParameter': {2: { 1:true }},\n\n  // WebGL 2 Transform Feedback\n\n  'bindTransformFeedback': {2: { 0:true }},\n  'beginTransformFeedback': {1: { 0:true }},\n  'transformFeedbackVaryings': {3: { 2:true }},\n\n  // WebGL2 Uniform Buffer Objects and Transform Feedback Buffers\n\n  'bindBufferBase': {3: { 0:true }},\n  'bindBufferRange': {5: { 0:true }},\n  'getIndexedParameter': {2: { 0:true }},\n  'getActiveUniforms': {3: { 2:true }},\n  'getActiveUniformBlockParameter': {3: { 2:true }}\n};\n\n/**\n * Map of numbers to names.\n * @type {Object}\n */\nvar glEnums = null;\n\n/**\n * Map of names to numbers.\n * @type {Object}\n */\nvar enumStringToValue = null;\n\n/**\n * Initializes this module. Safe to call more than once.\n * @param {!WebGLRenderingContext} ctx A WebGL context. If\n *    you have more than one context it doesn't matter which one\n *    you pass in, it is only used to pull out constants.\n */\nfunction init(ctx) {\n  if (glEnums == null) {\n    glEnums = { };\n    enumStringToValue = { };\n    for (var propertyName in ctx) {\n      if (typeof ctx[propertyName] == 'number') {\n        glEnums[ctx[propertyName]] = propertyName;\n        enumStringToValue[propertyName] = ctx[propertyName];\n      }\n    }\n  }\n}\n\n/**\n * Checks the utils have been initialized.\n */\nfunction checkInit() {\n  if (glEnums == null) {\n    throw 'WebGLDebugUtils.init(ctx) not called';\n  }\n}\n\n/**\n * Returns true or false if value matches any WebGL enum\n * @param {*} value Value to check if it might be an enum.\n * @return {boolean} True if value matches one of the WebGL defined enums\n */\nfunction mightBeEnum(value) {\n  checkInit();\n  return (glEnums[value] !== undefined);\n}\n\n/**\n * Gets an string version of an WebGL enum.\n *\n * Example:\n *   var str = WebGLDebugUtil.glEnumToString(ctx.getError());\n *\n * @param {number} value Value to return an enum for\n * @return {string} The string version of the enum.\n */\nfunction glEnumToString(value) {\n  checkInit();\n  var name = glEnums[value];\n  return (name !== undefined) ? (\"gl.\" + name) :\n      (\"/*UNKNOWN WebGL ENUM*/ 0x\" + value.toString(16) + \"\");\n}\n\n/**\n * Returns the string version of a WebGL argument.\n * Attempts to convert enum arguments to strings.\n * @param {string} functionName the name of the WebGL function.\n * @param {number} numArgs the number of arguments passed to the function.\n * @param {number} argumentIndx the index of the argument.\n * @param {*} value The value of the argument.\n * @return {string} The value as a string.\n */\nfunction glFunctionArgToString(functionName, numArgs, argumentIndex, value) {\n  var funcInfo = glValidEnumContexts[functionName];\n  if (funcInfo !== undefined) {\n    var funcInfo = funcInfo[numArgs];\n    if (funcInfo !== undefined) {\n      if (funcInfo[argumentIndex]) {\n        if (typeof funcInfo[argumentIndex] === 'object' &&\n            funcInfo[argumentIndex]['enumBitwiseOr'] !== undefined) {\n          var enums = funcInfo[argumentIndex]['enumBitwiseOr'];\n          var orResult = 0;\n          var orEnums = [];\n          for (var i = 0; i < enums.length; ++i) {\n            var enumValue = enumStringToValue[enums[i]];\n            if ((value & enumValue) !== 0) {\n              orResult |= enumValue;\n              orEnums.push(glEnumToString(enumValue));\n            }\n          }\n          if (orResult === value) {\n            return orEnums.join(' | ');\n          } else {\n            return glEnumToString(value);\n          }\n        } else {\n          return glEnumToString(value);\n        }\n      }\n    }\n  }\n  if (value === null) {\n    return \"null\";\n  } else if (value === undefined) {\n    return \"undefined\";\n  } else {\n    return value.toString();\n  }\n}\n\n/**\n * Converts the arguments of a WebGL function to a string.\n * Attempts to convert enum arguments to strings.\n *\n * @param {string} functionName the name of the WebGL function.\n * @param {number} args The arguments.\n * @return {string} The arguments as a string.\n */\nfunction glFunctionArgsToString(functionName, args) {\n  // apparently we can't do args.join(\",\");\n  var argStr = \"\";\n  var numArgs = args.length;\n  for (var ii = 0; ii < numArgs; ++ii) {\n    argStr += ((ii == 0) ? '' : ', ') +\n        glFunctionArgToString(functionName, numArgs, ii, args[ii]);\n  }\n  return argStr;\n};\n\n\nfunction makePropertyWrapper(wrapper, original, propertyName) {\n  //log(\"wrap prop: \" + propertyName);\n  wrapper.__defineGetter__(propertyName, function() {\n    return original[propertyName];\n  });\n  // TODO(gmane): this needs to handle properties that take more than\n  // one value?\n  wrapper.__defineSetter__(propertyName, function(value) {\n    //log(\"set: \" + propertyName);\n    original[propertyName] = value;\n  });\n}\n\n// Makes a function that calls a function on another object.\nfunction makeFunctionWrapper(original, functionName) {\n  //log(\"wrap fn: \" + functionName);\n  var f = original[functionName];\n  return function() {\n    //log(\"call: \" + functionName);\n    var result = f.apply(original, arguments);\n    return result;\n  };\n}\n\n/**\n * Given a WebGL context returns a wrapped context that calls\n * gl.getError after every command and calls a function if the\n * result is not gl.NO_ERROR.\n *\n * @param {!WebGLRenderingContext} ctx The webgl context to\n *        wrap.\n * @param {!function(err, funcName, args): void} opt_onErrorFunc\n *        The function to call when gl.getError returns an\n *        error. If not specified the default function calls\n *        console.log with a message.\n * @param {!function(funcName, args): void} opt_onFunc The\n *        function to call when each webgl function is called.\n *        You can use this to log all calls for example.\n * @param {!WebGLRenderingContext} opt_err_ctx The webgl context\n *        to call getError on if different than ctx.\n */\nfunction makeDebugContext(ctx, opt_onErrorFunc, opt_onFunc, opt_err_ctx) {\n  opt_err_ctx = opt_err_ctx || ctx;\n  init(ctx);\n  opt_onErrorFunc = opt_onErrorFunc || function(err, functionName, args) {\n        // apparently we can't do args.join(\",\");\n        var argStr = \"\";\n        var numArgs = args.length;\n        for (var ii = 0; ii < numArgs; ++ii) {\n          argStr += ((ii == 0) ? '' : ', ') +\n              glFunctionArgToString(functionName, numArgs, ii, args[ii]);\n        }\n        error(\"WebGL error \"+ glEnumToString(err) + \" in \"+ functionName +\n              \"(\" + argStr + \")\");\n      };\n\n  // Holds booleans for each GL error so after we get the error ourselves\n  // we can still return it to the client app.\n  var glErrorShadow = { };\n\n  // Makes a function that calls a WebGL function and then calls getError.\n  function makeErrorWrapper(ctx, functionName) {\n    return function() {\n      if (opt_onFunc) {\n        opt_onFunc(functionName, arguments);\n      }\n      var result = ctx[functionName].apply(ctx, arguments);\n      var err = opt_err_ctx.getError();\n      if (err != 0) {\n        glErrorShadow[err] = true;\n        opt_onErrorFunc(err, functionName, arguments);\n      }\n      return result;\n    };\n  }\n\n  // Make a an object that has a copy of every property of the WebGL context\n  // but wraps all functions.\n  var wrapper = {};\n  for (var propertyName in ctx) {\n    if (typeof ctx[propertyName] == 'function') {\n      if (propertyName != 'getExtension') {\n        wrapper[propertyName] = makeErrorWrapper(ctx, propertyName);\n      } else {\n        var wrapped = makeErrorWrapper(ctx, propertyName);\n        wrapper[propertyName] = function () {\n          var result = wrapped.apply(ctx, arguments);\n          if (!result) {\n            return null;\n          }\n          return makeDebugContext(result, opt_onErrorFunc, opt_onFunc, opt_err_ctx);\n        };\n      }\n    } else {\n      makePropertyWrapper(wrapper, ctx, propertyName);\n    }\n  }\n\n  // Override the getError function with one that returns our saved results.\n  wrapper.getError = function() {\n    for (var err in glErrorShadow) {\n      if (glErrorShadow.hasOwnProperty(err)) {\n        if (glErrorShadow[err]) {\n          glErrorShadow[err] = false;\n          return err;\n        }\n      }\n    }\n    return ctx.NO_ERROR;\n  };\n\n  return wrapper;\n}\n\nfunction resetToInitialState(ctx) {\n  var isWebGL2RenderingContext = !!ctx.createTransformFeedback;\n\n  if (isWebGL2RenderingContext) {\n    ctx.bindVertexArray(null);\n  }\n\n  var numAttribs = ctx.getParameter(ctx.MAX_VERTEX_ATTRIBS);\n  var tmp = ctx.createBuffer();\n  ctx.bindBuffer(ctx.ARRAY_BUFFER, tmp);\n  for (var ii = 0; ii < numAttribs; ++ii) {\n    ctx.disableVertexAttribArray(ii);\n    ctx.vertexAttribPointer(ii, 4, ctx.FLOAT, false, 0, 0);\n    ctx.vertexAttrib1f(ii, 0);\n    if (isWebGL2RenderingContext) {\n      ctx.vertexAttribDivisor(ii, 0);\n    }\n  }\n  ctx.deleteBuffer(tmp);\n\n  var numTextureUnits = ctx.getParameter(ctx.MAX_TEXTURE_IMAGE_UNITS);\n  for (var ii = 0; ii < numTextureUnits; ++ii) {\n    ctx.activeTexture(ctx.TEXTURE0 + ii);\n    ctx.bindTexture(ctx.TEXTURE_CUBE_MAP, null);\n    ctx.bindTexture(ctx.TEXTURE_2D, null);\n    if (isWebGL2RenderingContext) {\n      ctx.bindTexture(ctx.TEXTURE_2D_ARRAY, null);\n      ctx.bindTexture(ctx.TEXTURE_3D, null);\n      ctx.bindSampler(ii, null);\n    }\n  }\n\n  ctx.activeTexture(ctx.TEXTURE0);\n  ctx.useProgram(null);\n  ctx.bindBuffer(ctx.ARRAY_BUFFER, null);\n  ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, null);\n  ctx.bindFramebuffer(ctx.FRAMEBUFFER, null);\n  ctx.bindRenderbuffer(ctx.RENDERBUFFER, null);\n  ctx.disable(ctx.BLEND);\n  ctx.disable(ctx.CULL_FACE);\n  ctx.disable(ctx.DEPTH_TEST);\n  ctx.disable(ctx.DITHER);\n  ctx.disable(ctx.SCISSOR_TEST);\n  ctx.blendColor(0, 0, 0, 0);\n  ctx.blendEquation(ctx.FUNC_ADD);\n  ctx.blendFunc(ctx.ONE, ctx.ZERO);\n  ctx.clearColor(0, 0, 0, 0);\n  ctx.clearDepth(1);\n  ctx.clearStencil(-1);\n  ctx.colorMask(true, true, true, true);\n  ctx.cullFace(ctx.BACK);\n  ctx.depthFunc(ctx.LESS);\n  ctx.depthMask(true);\n  ctx.depthRange(0, 1);\n  ctx.frontFace(ctx.CCW);\n  ctx.hint(ctx.GENERATE_MIPMAP_HINT, ctx.DONT_CARE);\n  ctx.lineWidth(1);\n  ctx.pixelStorei(ctx.PACK_ALIGNMENT, 4);\n  ctx.pixelStorei(ctx.UNPACK_ALIGNMENT, 4);\n  ctx.pixelStorei(ctx.UNPACK_FLIP_Y_WEBGL, false);\n  ctx.pixelStorei(ctx.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n  // TODO: Delete this IF.\n  if (ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL) {\n    ctx.pixelStorei(ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL, ctx.BROWSER_DEFAULT_WEBGL);\n  }\n  ctx.polygonOffset(0, 0);\n  ctx.sampleCoverage(1, false);\n  ctx.scissor(0, 0, ctx.canvas.width, ctx.canvas.height);\n  ctx.stencilFunc(ctx.ALWAYS, 0, 0xFFFFFFFF);\n  ctx.stencilMask(0xFFFFFFFF);\n  ctx.stencilOp(ctx.KEEP, ctx.KEEP, ctx.KEEP);\n  ctx.viewport(0, 0, ctx.canvas.width, ctx.canvas.height);\n  ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT | ctx.STENCIL_BUFFER_BIT);\n\n  if (isWebGL2RenderingContext) {\n    ctx.drawBuffers([ctx.BACK]);\n    ctx.readBuffer(ctx.BACK);\n    ctx.bindBuffer(ctx.COPY_READ_BUFFER, null);\n    ctx.bindBuffer(ctx.COPY_WRITE_BUFFER, null);\n    ctx.bindBuffer(ctx.PIXEL_PACK_BUFFER, null);\n    ctx.bindBuffer(ctx.PIXEL_UNPACK_BUFFER, null);\n    var numTransformFeedbacks = ctx.getParameter(ctx.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS);\n    for (var ii = 0; ii < numTransformFeedbacks; ++ii) {\n      ctx.bindBufferBase(ctx.TRANSFORM_FEEDBACK_BUFFER, ii, null);\n    }\n    var numUBOs = ctx.getParameter(ctx.MAX_UNIFORM_BUFFER_BINDINGS);\n    for (var ii = 0; ii < numUBOs; ++ii) {\n      ctx.bindBufferBase(ctx.UNIFORM_BUFFER, ii, null);\n    }\n    ctx.disable(ctx.RASTERIZER_DISCARD);\n    ctx.pixelStorei(ctx.UNPACK_IMAGE_HEIGHT, 0);\n    ctx.pixelStorei(ctx.UNPACK_SKIP_IMAGES, 0);\n    ctx.pixelStorei(ctx.UNPACK_ROW_LENGTH, 0);\n    ctx.pixelStorei(ctx.UNPACK_SKIP_ROWS, 0);\n    ctx.pixelStorei(ctx.UNPACK_SKIP_PIXELS, 0);\n    ctx.pixelStorei(ctx.PACK_ROW_LENGTH, 0);\n    ctx.pixelStorei(ctx.PACK_SKIP_ROWS, 0);\n    ctx.pixelStorei(ctx.PACK_SKIP_PIXELS, 0);\n    ctx.hint(ctx.FRAGMENT_SHADER_DERIVATIVE_HINT, ctx.DONT_CARE);\n  }\n\n  // TODO: This should NOT be needed but Firefox fails with 'hint'\n  while(ctx.getError());\n}\n\nfunction makeLostContextSimulatingCanvas(canvas) {\n  var unwrappedContext_;\n  var wrappedContext_;\n  var onLost_ = [];\n  var onRestored_ = [];\n  var wrappedContext_ = {};\n  var contextId_ = 1;\n  var contextLost_ = false;\n  var resourceId_ = 0;\n  var resourceDb_ = [];\n  var numCallsToLoseContext_ = 0;\n  var numCalls_ = 0;\n  var canRestore_ = false;\n  var restoreTimeout_ = 0;\n  var isWebGL2RenderingContext;\n\n  // Holds booleans for each GL error so can simulate errors.\n  var glErrorShadow_ = { };\n\n  canvas.getContext = function(f) {\n    return function() {\n      var ctx = f.apply(canvas, arguments);\n      // Did we get a context and is it a WebGL context?\n      if ((ctx instanceof WebGLRenderingContext) || (window.WebGL2RenderingContext && (ctx instanceof WebGL2RenderingContext))) {\n        if (ctx != unwrappedContext_) {\n          if (unwrappedContext_) {\n            throw \"got different context\"\n          }\n          isWebGL2RenderingContext = window.WebGL2RenderingContext && (ctx instanceof WebGL2RenderingContext);\n          unwrappedContext_ = ctx;\n          wrappedContext_ = makeLostContextSimulatingContext(unwrappedContext_);\n        }\n        return wrappedContext_;\n      }\n      return ctx;\n    }\n  }(canvas.getContext);\n\n  function wrapEvent(listener) {\n    if (typeof(listener) == \"function\") {\n      return listener;\n    } else {\n      return function(info) {\n        listener.handleEvent(info);\n      }\n    }\n  }\n\n  var addOnContextLostListener = function(listener) {\n    onLost_.push(wrapEvent(listener));\n  };\n\n  var addOnContextRestoredListener = function(listener) {\n    onRestored_.push(wrapEvent(listener));\n  };\n\n\n  function wrapAddEventListener(canvas) {\n    var f = canvas.addEventListener;\n    canvas.addEventListener = function(type, listener, bubble) {\n      switch (type) {\n        case 'webglcontextlost':\n          addOnContextLostListener(listener);\n          break;\n        case 'webglcontextrestored':\n          addOnContextRestoredListener(listener);\n          break;\n        default:\n          f.apply(canvas, arguments);\n      }\n    };\n  }\n\n  wrapAddEventListener(canvas);\n\n  canvas.loseContext = function() {\n    if (!contextLost_) {\n      contextLost_ = true;\n      numCallsToLoseContext_ = 0;\n      ++contextId_;\n      while (unwrappedContext_.getError());\n      clearErrors();\n      glErrorShadow_[unwrappedContext_.CONTEXT_LOST_WEBGL] = true;\n      var event = makeWebGLContextEvent(\"context lost\");\n      var callbacks = onLost_.slice();\n      setTimeout(function() {\n          //log(\"numCallbacks:\" + callbacks.length);\n          for (var ii = 0; ii < callbacks.length; ++ii) {\n            //log(\"calling callback:\" + ii);\n            callbacks[ii](event);\n          }\n          if (restoreTimeout_ >= 0) {\n            setTimeout(function() {\n                canvas.restoreContext();\n              }, restoreTimeout_);\n          }\n        }, 0);\n    }\n  };\n\n  canvas.restoreContext = function() {\n    if (contextLost_) {\n      if (onRestored_.length) {\n        setTimeout(function() {\n            if (!canRestore_) {\n              throw \"can not restore. webglcontestlost listener did not call event.preventDefault\";\n            }\n            freeResources();\n            resetToInitialState(unwrappedContext_);\n            contextLost_ = false;\n            numCalls_ = 0;\n            canRestore_ = false;\n            var callbacks = onRestored_.slice();\n            var event = makeWebGLContextEvent(\"context restored\");\n            for (var ii = 0; ii < callbacks.length; ++ii) {\n              callbacks[ii](event);\n            }\n          }, 0);\n      }\n    }\n  };\n\n  canvas.loseContextInNCalls = function(numCalls) {\n    if (contextLost_) {\n      throw \"You can not ask a lost contet to be lost\";\n    }\n    numCallsToLoseContext_ = numCalls_ + numCalls;\n  };\n\n  canvas.getNumCalls = function() {\n    return numCalls_;\n  };\n\n  canvas.setRestoreTimeout = function(timeout) {\n    restoreTimeout_ = timeout;\n  };\n\n  function isWebGLObject(obj) {\n    //return false;\n    return (obj instanceof WebGLBuffer ||\n            obj instanceof WebGLFramebuffer ||\n            obj instanceof WebGLProgram ||\n            obj instanceof WebGLRenderbuffer ||\n            obj instanceof WebGLShader ||\n            obj instanceof WebGLTexture);\n  }\n\n  function checkResources(args) {\n    for (var ii = 0; ii < args.length; ++ii) {\n      var arg = args[ii];\n      if (isWebGLObject(arg)) {\n        return arg.__webglDebugContextLostId__ == contextId_;\n      }\n    }\n    return true;\n  }\n\n  function clearErrors() {\n    var k = Object.keys(glErrorShadow_);\n    for (var ii = 0; ii < k.length; ++ii) {\n      delete glErrorShadow_[k[ii]];\n    }\n  }\n\n  function loseContextIfTime() {\n    ++numCalls_;\n    if (!contextLost_) {\n      if (numCallsToLoseContext_ == numCalls_) {\n        canvas.loseContext();\n      }\n    }\n  }\n\n  // Makes a function that simulates WebGL when out of context.\n  function makeLostContextFunctionWrapper(ctx, functionName) {\n    var f = ctx[functionName];\n    return function() {\n      // log(\"calling:\" + functionName);\n      // Only call the functions if the context is not lost.\n      loseContextIfTime();\n      if (!contextLost_) {\n        //if (!checkResources(arguments)) {\n        //  glErrorShadow_[wrappedContext_.INVALID_OPERATION] = true;\n        //  return;\n        //}\n        var result = f.apply(ctx, arguments);\n        return result;\n      }\n    };\n  }\n\n  function freeResources() {\n    for (var ii = 0; ii < resourceDb_.length; ++ii) {\n      var resource = resourceDb_[ii];\n      if (resource instanceof WebGLBuffer) {\n        unwrappedContext_.deleteBuffer(resource);\n      } else if (resource instanceof WebGLFramebuffer) {\n        unwrappedContext_.deleteFramebuffer(resource);\n      } else if (resource instanceof WebGLProgram) {\n        unwrappedContext_.deleteProgram(resource);\n      } else if (resource instanceof WebGLRenderbuffer) {\n        unwrappedContext_.deleteRenderbuffer(resource);\n      } else if (resource instanceof WebGLShader) {\n        unwrappedContext_.deleteShader(resource);\n      } else if (resource instanceof WebGLTexture) {\n        unwrappedContext_.deleteTexture(resource);\n      }\n      else if (isWebGL2RenderingContext) {\n        if (resource instanceof WebGLQuery) {\n          unwrappedContext_.deleteQuery(resource);\n        } else if (resource instanceof WebGLSampler) {\n          unwrappedContext_.deleteSampler(resource);\n        } else if (resource instanceof WebGLSync) {\n          unwrappedContext_.deleteSync(resource);\n        } else if (resource instanceof WebGLTransformFeedback) {\n          unwrappedContext_.deleteTransformFeedback(resource);\n        } else if (resource instanceof WebGLVertexArrayObject) {\n          unwrappedContext_.deleteVertexArray(resource);\n        }\n      }\n    }\n  }\n\n  function makeWebGLContextEvent(statusMessage) {\n    return {\n      statusMessage: statusMessage,\n      preventDefault: function() {\n          canRestore_ = true;\n        }\n    };\n  }\n\n  return canvas;\n\n  function makeLostContextSimulatingContext(ctx) {\n    // copy all functions and properties to wrapper\n    for (var propertyName in ctx) {\n      if (typeof ctx[propertyName] == 'function') {\n         wrappedContext_[propertyName] = makeLostContextFunctionWrapper(\n             ctx, propertyName);\n       } else {\n         makePropertyWrapper(wrappedContext_, ctx, propertyName);\n       }\n    }\n\n    // Wrap a few functions specially.\n    wrappedContext_.getError = function() {\n      loseContextIfTime();\n      if (!contextLost_) {\n        var err;\n        while (err = unwrappedContext_.getError()) {\n          glErrorShadow_[err] = true;\n        }\n      }\n      for (var err in glErrorShadow_) {\n        if (glErrorShadow_[err]) {\n          delete glErrorShadow_[err];\n          return err;\n        }\n      }\n      return wrappedContext_.NO_ERROR;\n    };\n\n    var creationFunctions = [\n      \"createBuffer\",\n      \"createFramebuffer\",\n      \"createProgram\",\n      \"createRenderbuffer\",\n      \"createShader\",\n      \"createTexture\"\n    ];\n    if (isWebGL2RenderingContext) {\n      creationFunctions.push(\n        \"createQuery\",\n        \"createSampler\",\n        \"fenceSync\",\n        \"createTransformFeedback\",\n        \"createVertexArray\"\n      );\n    }\n    for (var ii = 0; ii < creationFunctions.length; ++ii) {\n      var functionName = creationFunctions[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return null;\n          }\n          var obj = f.apply(ctx, arguments);\n          obj.__webglDebugContextLostId__ = contextId_;\n          resourceDb_.push(obj);\n          return obj;\n        };\n      }(ctx[functionName]);\n    }\n\n    var functionsThatShouldReturnNull = [\n      \"getActiveAttrib\",\n      \"getActiveUniform\",\n      \"getBufferParameter\",\n      \"getContextAttributes\",\n      \"getAttachedShaders\",\n      \"getFramebufferAttachmentParameter\",\n      \"getParameter\",\n      \"getProgramParameter\",\n      \"getProgramInfoLog\",\n      \"getRenderbufferParameter\",\n      \"getShaderParameter\",\n      \"getShaderInfoLog\",\n      \"getShaderSource\",\n      \"getTexParameter\",\n      \"getUniform\",\n      \"getUniformLocation\",\n      \"getVertexAttrib\"\n    ];\n    if (isWebGL2RenderingContext) {\n      functionsThatShouldReturnNull.push(\n        \"getInternalformatParameter\",\n        \"getQuery\",\n        \"getQueryParameter\",\n        \"getSamplerParameter\",\n        \"getSyncParameter\",\n        \"getTransformFeedbackVarying\",\n        \"getIndexedParameter\",\n        \"getUniformIndices\",\n        \"getActiveUniforms\",\n        \"getActiveUniformBlockParameter\",\n        \"getActiveUniformBlockName\"\n      );\n    }\n    for (var ii = 0; ii < functionsThatShouldReturnNull.length; ++ii) {\n      var functionName = functionsThatShouldReturnNull[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return null;\n          }\n          return f.apply(ctx, arguments);\n        }\n      }(wrappedContext_[functionName]);\n    }\n\n    var isFunctions = [\n      \"isBuffer\",\n      \"isEnabled\",\n      \"isFramebuffer\",\n      \"isProgram\",\n      \"isRenderbuffer\",\n      \"isShader\",\n      \"isTexture\"\n    ];\n    if (isWebGL2RenderingContext) {\n      isFunctions.push(\n        \"isQuery\",\n        \"isSampler\",\n        \"isSync\",\n        \"isTransformFeedback\",\n        \"isVertexArray\"\n      );\n    }\n    for (var ii = 0; ii < isFunctions.length; ++ii) {\n      var functionName = isFunctions[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return false;\n          }\n          return f.apply(ctx, arguments);\n        }\n      }(wrappedContext_[functionName]);\n    }\n\n    wrappedContext_.checkFramebufferStatus = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return wrappedContext_.FRAMEBUFFER_UNSUPPORTED;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.checkFramebufferStatus);\n\n    wrappedContext_.getAttribLocation = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return -1;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.getAttribLocation);\n\n    wrappedContext_.getVertexAttribOffset = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return 0;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.getVertexAttribOffset);\n\n    wrappedContext_.isContextLost = function() {\n      return contextLost_;\n    };\n\n    if (isWebGL2RenderingContext) {\n      wrappedContext_.getFragDataLocation = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return -1;\n          }\n          return f.apply(ctx, arguments);\n        };\n      }(wrappedContext_.getFragDataLocation);\n\n      wrappedContext_.clientWaitSync = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return wrappedContext_.WAIT_FAILED;\n          }\n          return f.apply(ctx, arguments);\n        };\n      }(wrappedContext_.clientWaitSync);\n\n      wrappedContext_.getUniformBlockIndex = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return wrappedContext_.INVALID_INDEX;\n          }\n          return f.apply(ctx, arguments);\n        };\n      }(wrappedContext_.getUniformBlockIndex);\n    }\n\n    return wrappedContext_;\n  }\n}\n\nreturn {\n  /**\n   * Initializes this module. Safe to call more than once.\n   * @param {!WebGLRenderingContext} ctx A WebGL context. If\n   *    you have more than one context it doesn't matter which one\n   *    you pass in, it is only used to pull out constants.\n   */\n  'init': init,\n\n  /**\n   * Returns true or false if value matches any WebGL enum\n   * @param {*} value Value to check if it might be an enum.\n   * @return {boolean} True if value matches one of the WebGL defined enums\n   */\n  'mightBeEnum': mightBeEnum,\n\n  /**\n   * Gets an string version of an WebGL enum.\n   *\n   * Example:\n   *   WebGLDebugUtil.init(ctx);\n   *   var str = WebGLDebugUtil.glEnumToString(ctx.getError());\n   *\n   * @param {number} value Value to return an enum for\n   * @return {string} The string version of the enum.\n   */\n  'glEnumToString': glEnumToString,\n\n  /**\n   * Converts the argument of a WebGL function to a string.\n   * Attempts to convert enum arguments to strings.\n   *\n   * Example:\n   *   WebGLDebugUtil.init(ctx);\n   *   var str = WebGLDebugUtil.glFunctionArgToString('bindTexture', 2, 0, gl.TEXTURE_2D);\n   *\n   * would return 'TEXTURE_2D'\n   *\n   * @param {string} functionName the name of the WebGL function.\n   * @param {number} numArgs The number of arguments\n   * @param {number} argumentIndx the index of the argument.\n   * @param {*} value The value of the argument.\n   * @return {string} The value as a string.\n   */\n  'glFunctionArgToString': glFunctionArgToString,\n\n  /**\n   * Converts the arguments of a WebGL function to a string.\n   * Attempts to convert enum arguments to strings.\n   *\n   * @param {string} functionName the name of the WebGL function.\n   * @param {number} args The arguments.\n   * @return {string} The arguments as a string.\n   */\n  'glFunctionArgsToString': glFunctionArgsToString,\n\n  /**\n   * Given a WebGL context returns a wrapped context that calls\n   * gl.getError after every command and calls a function if the\n   * result is not NO_ERROR.\n   *\n   * You can supply your own function if you want. For example, if you'd like\n   * an exception thrown on any GL error you could do this\n   *\n   *    function throwOnGLError(err, funcName, args) {\n   *      throw WebGLDebugUtils.glEnumToString(err) +\n   *            \" was caused by call to \" + funcName;\n   *    };\n   *\n   *    ctx = WebGLDebugUtils.makeDebugContext(\n   *        canvas.getContext(\"webgl\"), throwOnGLError);\n   *\n   * @param {!WebGLRenderingContext} ctx The webgl context to wrap.\n   * @param {!function(err, funcName, args): void} opt_onErrorFunc The function\n   *     to call when gl.getError returns an error. If not specified the default\n   *     function calls console.log with a message.\n   * @param {!function(funcName, args): void} opt_onFunc The\n   *     function to call when each webgl function is called. You\n   *     can use this to log all calls for example.\n   */\n  'makeDebugContext': makeDebugContext,\n\n  /**\n   * Given a canvas element returns a wrapped canvas element that will\n   * simulate lost context. The canvas returned adds the following functions.\n   *\n   * loseContext:\n   *   simulates a lost context event.\n   *\n   * restoreContext:\n   *   simulates the context being restored.\n   *\n   * lostContextInNCalls:\n   *   loses the context after N gl calls.\n   *\n   * getNumCalls:\n   *   tells you how many gl calls there have been so far.\n   *\n   * setRestoreTimeout:\n   *   sets the number of milliseconds until the context is restored\n   *   after it has been lost. Defaults to 0. Pass -1 to prevent\n   *   automatic restoring.\n   *\n   * @param {!Canvas} canvas The canvas element to wrap.\n   */\n  'makeLostContextSimulatingCanvas': makeLostContextSimulatingCanvas,\n\n  /**\n   * Resets a context to the initial state.\n   * @param {!WebGLRenderingContext} ctx The webgl context to\n   *     reset.\n   */\n  'resetToInitialState': resetToInitialState\n};\n\n}();\n\nmodule.exports = WebGLDebugUtils;\n\n},{}],\"iuKp\":[function(require,module,exports) {\nvar global = arguments[3];\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = installDebugger;\n\nvar _debugParameters = require(\"./webgl-debug/debug-parameters\");\n\n// Expose Khronos Debug support module on global context\n\n/* global window, global */\nvar WebGLDebug = require('webgl-debug');\n\nvar global_ = typeof global !== 'undefined' ? global : window;\nglobal_.WebGLDebug = WebGLDebug;\nconsole.log('luma.gl: WebGL debug support imported'); // eslint-disable-line\n// eslint-disable-next-line\n\nfunction installDebugger() {\n  (0, _debugParameters.installParameterDefinitions)();\n  console.log('luma.gl: WebGL debug support installed'); // eslint-disable-line\n}\n//# sourceMappingURL=debug.js.map\n},{\"./webgl-debug/debug-parameters\":\"EaTi\",\"webgl-debug\":\"SFHu\"}],\"L8kj\":[function(require,module,exports) {\n// eslint-disable-next-line\nmodule.exports = require('./dist/es5/debug');\n\n},{\"./dist/es5/debug\":\"iuKp\"}],\"tfwo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nrequire(\"luma.gl/debug\");\n\nvar _luma = require(\"luma.gl\");\n\nvar _shaderModulePass = _interopRequireDefault(require(\"./shader-module-pass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* global document */\nvar DEFAULT_VS = \"attribute vec2 vertex;\\nattribute vec2 _texCoord;\\nvarying vec2 texCoord;\\nvoid main() {\\n  texCoord = _texCoord;\\n  gl_Position = vec4(vertex * 2.0 - 1.0, 0.0, 1.0);\\n}\\n\";\n\nvar Canvas =\n/*#__PURE__*/\nfunction () {\n  function Canvas() {\n    (0, _classCallCheck2.default)(this, Canvas);\n    this.canvas = document.createElement('canvas');\n    this.width = this.canvas.clientWidth;\n    this.height = this.canvas.clientHeight;\n    this.gl = (0, _luma.createGLContext)({\n      canvas: this.canvas,\n      opts: {\n        premultipliedAlpha: false\n      }\n    });\n\n    if (!this.gl) {\n      throw new Error('This browser does not support WebGL');\n    }\n\n    this.texture = null;\n    this.spareTexture = null;\n    this.flippedModel = null;\n  }\n\n  (0, _createClass2.default)(Canvas, [{\n    key: \"installFiltersAsMethods\",\n    value: function installFiltersAsMethods(filters) {\n      var _this = this;\n\n      var _loop = function _loop(key) {\n        if (key !== 'canvas') {\n          _this[key] = function (props) {\n            return _this.filter(filters[key], props).bind(_this);\n          };\n        }\n      }; // // Filter methods\n\n\n      for (var key in filters) {\n        _loop(key);\n      }\n    }\n  }, {\n    key: \"setTexture\",\n    value: function setTexture(element) {\n      this.texture = new _luma.Texture2D(this.gl, {\n        pixels: element\n      });\n      this.resize(this.gl, this.texture.width, this.texture.height);\n      return this;\n    }\n  }, {\n    key: \"resize\",\n    value: function resize(gl, width, height) {\n      var realToCSSPixels = 1; // window.devicePixelRatio || 1;\n      // Check if the canvas is not the same size.\n\n      if (gl.canvas.width !== width || gl.canvas.height !== height) {\n        // Make the canvas the same size\n        gl.canvas.width = width;\n        gl.canvas.height = height; // Lookup the size the browser is displaying the canvas in CSS pixels\n        // and compute a size needed to make our drawingbuffer match it in\n        // device pixels.\n\n        var displayWidth = Math.floor(width / realToCSSPixels);\n        var displayHeight = Math.floor(height / realToCSSPixels);\n        gl.canvas.style.width = \"\".concat(displayWidth, \"px\");\n        gl.canvas.style.height = \"\".concat(displayHeight, \"px\");\n        gl.viewport(0, 0, width, height);\n        this.width = displayWidth;\n        this.height = displayHeight;\n      }\n    }\n  }, {\n    key: \"replace\",\n    value: function replace(node) {\n      node.parentNode.insertBefore(this.canvas, node);\n      node.parentNode.removeChild(node);\n      return this;\n    } // Draw a texture to the canvas, with an optional width and height to scale to.\n    // If no width and height are given then the original texture width and height\n    // are used.\n\n  }, {\n    key: \"draw\",\n    value: function draw() {\n      this.multiPassRenderer = new _luma._MultiPassRenderer(this.gl, [new _luma._ClearPass(this.gl), new _luma._TexturePass(this.gl, {\n        texture: this.texture\n      }), new _luma._CopyPass(this.gl, {\n        screen: true\n      })]);\n      this.multiPassRenderer.render();\n      return this;\n    }\n  }, {\n    key: \"update\",\n    value: function update() {\n      this.multiPassRenderer.render({});\n      return this;\n    }\n  }, {\n    key: \"filter\",\n    value: function filter(shaderModule, props) {\n      this.multiPassRenderer = new _luma._MultiPassRenderer(this.gl, [new _luma._ClearPass(this.gl), new _luma._TexturePass(this.gl, {\n        texture: this.texture\n      }), new _shaderModulePass.default(this.gl, shaderModule, props), new _luma._CopyPass(this.gl, {\n        screen: true\n      })]);\n      this.multiPassRenderer.render();\n      return this;\n    }\n    /*\n    contents() {\n      // const gl = this.gl;\n      // const texture = new Texture2D(this.gl, {\n      //   width: this.texture.width,\n      //   height: this.texture.height,\n      //   format: gl.RGBA,\n      //   type: gl.UNSIGNED_BYTE\n      // });\n      // this.texture.use();\n      // texture.drawTo(() => this.getDefaultModel(this.gl).drawRect());\n      // return wrapTexture(texture);\n    }\n    */\n    // Get a Uint8 array of pixel values: [r, g, b, a, r, g, b, a, ...]\n    // Length of the array will be width * height * 4.\n\n  }, {\n    key: \"getPixelArray\",\n    value: function getPixelArray() {\n      var gl = this.gl;\n      var w = this.texture.width;\n      var h = this.texture.height;\n      var array = new Uint8Array(w * h * 4);\n      this.texture.drawTo(function () {\n        return gl.readPixels(0, 0, w, h, 6408, 5121, array);\n      });\n      return array;\n    }\n  }, {\n    key: \"_initialize\",\n    value: function _initialize(width, height) {\n      var gl = this.gl;\n      var type = 5121; // Go for floating point buffer textures if we can, it'll make the bokeh\n      // filter look a lot better. Note that on Windows, ANGLE does not let you\n      // render to a floating-point texture when linear filtering is enabled.\n      // See http://crbug.com/172278 for more information.\n\n      if (this.gl.getExtension('OES_texture_float') && gl.getExtension('OES_texture_float_linear')) {\n        var testTexture = new _luma.Texture2D(this.gl, {\n          width: 100,\n          height: 100,\n          format: 6408,\n          type: 5126\n        });\n\n        try {\n          // Only use gl.FLOAT if we can render to it\n          testTexture.drawTo(function () {\n            type = 5126;\n          });\n        } catch (error) {// ignore\n        }\n\n        testTexture.destroy();\n      }\n\n      if (this.spareTexture) {\n        this.spareTexture.destroy();\n      }\n\n      this.width = width;\n      this.height = height;\n      this.texture = new _luma.Texture2D(this.gl, {\n        width: width,\n        height: height,\n        format: 6408,\n        type: type\n      });\n      this.spareTexture = new _luma.Texture2D(this.gl, {\n        width: width,\n        height: height,\n        format: 6408,\n        type: type\n      });\n      this.extraTexture = this.extraTexture || new _luma.Texture2D(this.gl, {\n        width: 0,\n        height: 0,\n        format: 6408,\n        type: type\n      });\n      this.flippedModel = this.flippedModel || new _luma.Model(this.gl, {\n        vs: DEFAULT_VS,\n        fs: \"uniform sampler2D texture;\\nvarying vec2 texCoord;\\nvoid main() {\\n  gl_FragColor = texture2D(texture, vec2(texCoord.x, 1.0 - texCoord.y));\\n}\\n\"\n      });\n      this.isInitialized = true;\n    }\n  }]);\n  return Canvas;\n}();\n\nexports.default = Canvas;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"luma.gl/debug\":\"L8kj\",\"luma.gl\":\"iiNl\",\"./shader-module-pass\":\"FnHc\"}],\"y9P3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.requestFile = requestFile;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Supports loading (requesting) assets with XHR (XmlHttpRequest)\n\n/* eslint-disable guard-for-in, complexity, no-try-catch */\n\n/* global XMLHttpRequest */\nfunction noop() {}\n\nvar XHR_STATES = {\n  UNINITIALIZED: 0,\n  LOADING: 1,\n  LOADED: 2,\n  INTERACTIVE: 3,\n  COMPLETED: 4\n};\n\nvar XHR =\n/*#__PURE__*/\nfunction () {\n  function XHR(_ref) {\n    var url = _ref.url,\n        _ref$path = _ref.path,\n        path = _ref$path === void 0 ? null : _ref$path,\n        _ref$method = _ref.method,\n        method = _ref$method === void 0 ? 'GET' : _ref$method,\n        _ref$asynchronous = _ref.asynchronous,\n        asynchronous = _ref$asynchronous === void 0 ? true : _ref$asynchronous,\n        _ref$noCache = _ref.noCache,\n        noCache = _ref$noCache === void 0 ? false : _ref$noCache,\n        _ref$sendAsBinary = _ref.sendAsBinary,\n        sendAsBinary = _ref$sendAsBinary === void 0 ? false : _ref$sendAsBinary,\n        _ref$responseType = _ref.responseType,\n        responseType = _ref$responseType === void 0 ? false : _ref$responseType,\n        _ref$onProgress = _ref.onProgress,\n        onProgress = _ref$onProgress === void 0 ? noop : _ref$onProgress,\n        _ref$onError = _ref.onError,\n        onError = _ref$onError === void 0 ? noop : _ref$onError,\n        _ref$onAbort = _ref.onAbort,\n        onAbort = _ref$onAbort === void 0 ? noop : _ref$onAbort,\n        _ref$onComplete = _ref.onComplete,\n        onComplete = _ref$onComplete === void 0 ? noop : _ref$onComplete;\n    (0, _classCallCheck2.default)(this, XHR);\n    this.url = path ? path.join(path, url) : url;\n    this.method = method;\n    this.async = asynchronous;\n    this.noCache = noCache;\n    this.sendAsBinary = sendAsBinary;\n    this.responseType = responseType;\n    this.req = new XMLHttpRequest();\n\n    this.req.onload = function (e) {\n      return onComplete(e);\n    };\n\n    this.req.onerror = function (e) {\n      return onError(e);\n    };\n\n    this.req.onabort = function (e) {\n      return onAbort(e);\n    };\n\n    this.req.onprogress = function (e) {\n      if (e.lengthComputable) {\n        onProgress(e, Math.round(e.loaded / e.total * 100));\n      } else {\n        onProgress(e, -1);\n      }\n    };\n  }\n\n  (0, _createClass2.default)(XHR, [{\n    key: \"setRequestHeader\",\n    value: function setRequestHeader(header, value) {\n      this.req.setRequestHeader(header, value);\n      return this;\n    } // /* eslint-disable max-statements */\n\n  }, {\n    key: \"sendAsync\",\n    value: function sendAsync() {\n      var _this = this;\n\n      var body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.body || null;\n      return new Promise(function (resolve, reject) {\n        try {\n          var req = _this.req,\n              method = _this.method,\n              noCache = _this.noCache,\n              sendAsBinary = _this.sendAsBinary,\n              responseType = _this.responseType;\n          var url = noCache ? _this.url + (_this.url.indexOf('?') >= 0 ? '&' : '?') + Date.now() : _this.url;\n          req.open(method, url, _this.async);\n\n          if (responseType) {\n            req.responseType = responseType;\n          }\n\n          if (_this.async) {\n            req.onreadystatechange = function (e) {\n              if (req.readyState === XHR_STATES.COMPLETED) {\n                if (req.status === 200) {\n                  resolve(req.responseType ? req.response : req.responseText);\n                } else {\n                  reject(new Error(\"\".concat(req.status, \": \").concat(url)));\n                }\n              }\n            };\n          }\n\n          if (sendAsBinary) {\n            req.sendAsBinary(body);\n          } else {\n            req.send(body);\n          }\n\n          if (!_this.async) {\n            if (req.status === 200) {\n              resolve(req.responseType ? req.response : req.responseText);\n            } else {\n              reject(new Error(\"\".concat(req.status, \": \").concat(url)));\n            }\n          }\n        } catch (error) {\n          reject(error);\n        }\n      });\n    }\n    /* eslint-enable max-statements */\n\n  }]);\n  return XHR;\n}();\n\nfunction requestFile(opts) {\n  var xhr = new XHR(opts);\n  return xhr.sendAsync();\n}\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\"}],\"WFKF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setPathPrefix = setPathPrefix;\nexports.loadFile = loadFile;\nexports.loadImage = loadImage;\n\nvar _browserRequestFile = require(\"./browser-request-file\");\n\nvar pathPrefix = '';\n/*\n * Set a relative path prefix\n */\n\nfunction setPathPrefix(prefix) {\n  pathPrefix = prefix;\n}\n\nfunction loadFile(url, opts) {\n  if (typeof url !== 'string' && !opts) {\n    // TODO - warn for deprecated mode\n    opts = url;\n    url = opts.url;\n  }\n\n  opts.url = pathPrefix ? pathPrefix + url : url;\n  return (0, _browserRequestFile.requestFile)(opts);\n}\n/* global Image, Blob, URL, createImageBitmap, location */\n\n/*\n * Loads images asynchronously\n * image.crossOrigin can be set via opts.crossOrigin, default to 'anonymous'\n * returns a promise tracking the load\n */\n\n\nfunction loadImage(url, opts) {\n  url = pathPrefix ? pathPrefix + url : url;\n\n  if (typeof Image === 'undefined') {\n    // In a web worker\n    // XMLHttpRequest throws invalid URL error if using relative path\n    // resolve url relative to original base\n    url = new URL(url, location.pathname).href;\n    return (0, _browserRequestFile.requestFile)({\n      url: url,\n      responseType: 'arraybuffer'\n    }).then(function (arraybuffer) {\n      var blob = new Blob([new Uint8Array(arraybuffer)]);\n      return createImageBitmap(blob);\n    });\n  }\n\n  return new Promise(function (resolve, reject) {\n    try {\n      var image = new Image();\n\n      image.onload = function () {\n        return resolve(image);\n      };\n\n      image.onerror = function () {\n        return reject(new Error(\"Could not load image \".concat(url, \".\")));\n      };\n\n      image.crossOrigin = opts && opts.crossOrigin || 'anonymous';\n      image.src = url;\n    } catch (error) {\n      reject(error);\n    }\n  });\n}\n},{\"./browser-request-file\":\"y9P3\"}],\"vSY5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.loadTexture = loadTexture;\nexports.loadFiles = loadFiles;\nexports.loadImages = loadImages;\nexports.loadTextures = loadTextures;\nexports.loadProgram = loadProgram;\nexports.loadModel = loadModel;\nexports.parseModel = parseModel;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _browserLoad = require(\"./browser-load\");\n\nvar _webgl = require(\"../webgl\");\n\nvar _core = require(\"../core\");\n\nvar _geometry = require(\"../geometry\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable guard-for-in, complexity, no-try-catch */\nfunction noop() {}\n\nfunction loadTexture(gl, url) {\n  var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  (0, _assert.default)(typeof url === 'string', 'loadTexture: url must be string');\n  return (0, _browserLoad.loadImage)(url, opts).then(function (image) {\n    return new _webgl.Texture2D(gl, Object.assign({\n      id: url\n    }, opts, {\n      data: image\n    }));\n  });\n}\n/*\n * Loads (Requests) multiple files asynchronously\n */\n\n\nfunction loadFiles() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var urls = opts.urls,\n      _opts$onProgress = opts.onProgress,\n      onProgress = _opts$onProgress === void 0 ? noop : _opts$onProgress;\n  (0, _assert.default)(urls.every(function (url) {\n    return typeof url === 'string';\n  }), 'loadImages: {urls} must be array of strings');\n  var count = 0;\n  return Promise.all(urls.map(function (url) {\n    var promise = (0, _browserLoad.loadFile)(Object.assign({\n      url: url\n    }, opts));\n    promise.then(function (file) {\n      return onProgress({\n        progress: ++count / urls.length,\n        count: count,\n        total: urls.length,\n        url: url\n      });\n    });\n    return promise;\n  }));\n}\n/*\n * Loads (requests) multiple images asynchronously\n */\n\n\nfunction loadImages() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var urls = opts.urls,\n      _opts$onProgress2 = opts.onProgress,\n      onProgress = _opts$onProgress2 === void 0 ? noop : _opts$onProgress2;\n  (0, _assert.default)(urls.every(function (url) {\n    return typeof url === 'string';\n  }), 'loadImages: {urls} must be array of strings');\n  var count = 0;\n  return Promise.all(urls.map(function (url) {\n    var promise = (0, _browserLoad.loadImage)(url, opts);\n    promise.then(function (file) {\n      return onProgress({\n        progress: ++count / urls.length,\n        count: count,\n        total: urls.length,\n        url: url\n      });\n    });\n    return promise;\n  }));\n}\n\nfunction loadTextures(gl) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var urls = opts.urls,\n      _opts$onProgress3 = opts.onProgress,\n      onProgress = _opts$onProgress3 === void 0 ? noop : _opts$onProgress3;\n  (0, _assert.default)(urls.every(function (url) {\n    return typeof url === 'string';\n  }), 'loadTextures: {urls} must be array of strings');\n  return loadImages(Object.assign({\n    urls: urls,\n    onProgress: onProgress\n  }, opts)).then(function (images) {\n    return images.map(function (img, i) {\n      return new _webgl.Texture2D(gl, Object.assign({\n        id: urls[i]\n      }, opts, {\n        data: img\n      }));\n    });\n  });\n}\n\nfunction loadProgram(gl) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var vs = opts.vs,\n      fs = opts.fs,\n      _opts$onProgress4 = opts.onProgress,\n      onProgress = _opts$onProgress4 === void 0 ? noop : _opts$onProgress4;\n  return loadFiles(Object.assign({\n    urls: [vs, fs],\n    onProgress: onProgress\n  }, opts)).then(function (_ref) {\n    var _ref2 = (0, _slicedToArray2.default)(_ref, 2),\n        vsText = _ref2[0],\n        fsText = _ref2[1];\n\n    return new _webgl.Program(gl, Object.assign({\n      vs: vsText,\n      fs: fsText\n    }, opts));\n  });\n} // Loads a simple JSON format\n\n\nfunction loadModel(gl) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var url = opts.url,\n      _opts$onProgress5 = opts.onProgress,\n      onProgress = _opts$onProgress5 === void 0 ? noop : _opts$onProgress5;\n  return loadFiles(Object.assign({\n    urls: [url],\n    onProgress: onProgress\n  }, opts)).then(function (_ref3) {\n    var _ref4 = (0, _slicedToArray2.default)(_ref3, 1),\n        file = _ref4[0];\n\n    return parseModel(gl, Object.assign({\n      file: file\n    }, opts));\n  });\n}\n\nfunction parseModel(gl) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var file = opts.file,\n      _opts$program = opts.program,\n      program = _opts$program === void 0 ? new _webgl.Program(gl) : _opts$program;\n  var json = typeof file === 'string' ? parseJSON(file) : file; // Remove any attributes so that we can create a geometry\n  // TODO - change format to put these in geometry sub object?\n\n  var attributes = {};\n  var modelOptions = {};\n\n  for (var key in json) {\n    var value = json[key];\n\n    if (Array.isArray(value)) {\n      attributes[key] = key === 'indices' ? new Uint16Array(value) : new Float32Array(value);\n    } else {\n      modelOptions[key] = value;\n    }\n  }\n\n  return new _core.Model(gl, Object.assign({\n    program: program,\n    geometry: new _geometry.Geometry({\n      attributes: attributes\n    })\n  }, modelOptions, opts));\n}\n\nfunction parseJSON(file) {\n  try {\n    return JSON.parse(file);\n  } catch (error) {\n    throw new Error(\"Failed to parse JSON: \".concat(error));\n  }\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"../utils/assert\":\"iVaU\",\"./browser-load\":\"WFKF\",\"../webgl\":\"yQJr\",\"../core\":\"fdK2\",\"../geometry\":\"EJCl\"}],\"HSmR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"setPathPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _browserLoad.setPathPrefix;\n  }\n});\nObject.defineProperty(exports, \"loadFile\", {\n  enumerable: true,\n  get: function () {\n    return _browserLoad.loadFile;\n  }\n});\nObject.defineProperty(exports, \"loadImage\", {\n  enumerable: true,\n  get: function () {\n    return _browserLoad.loadImage;\n  }\n});\nObject.defineProperty(exports, \"loadTexture\", {\n  enumerable: true,\n  get: function () {\n    return _loadFiles.loadTexture;\n  }\n});\nObject.defineProperty(exports, \"loadFiles\", {\n  enumerable: true,\n  get: function () {\n    return _loadFiles.loadFiles;\n  }\n});\nObject.defineProperty(exports, \"loadImages\", {\n  enumerable: true,\n  get: function () {\n    return _loadFiles.loadImages;\n  }\n});\nObject.defineProperty(exports, \"loadTextures\", {\n  enumerable: true,\n  get: function () {\n    return _loadFiles.loadTextures;\n  }\n});\nObject.defineProperty(exports, \"loadProgram\", {\n  enumerable: true,\n  get: function () {\n    return _loadFiles.loadProgram;\n  }\n});\nObject.defineProperty(exports, \"loadModel\", {\n  enumerable: true,\n  get: function () {\n    return _loadFiles.loadModel;\n  }\n});\nObject.defineProperty(exports, \"parseModel\", {\n  enumerable: true,\n  get: function () {\n    return _loadFiles.parseModel;\n  }\n});\n\nvar _browserLoad = require(\"./browser-load\");\n\nvar _loadFiles = require(\"./load-files\");\n},{\"./browser-load\":\"WFKF\",\"./load-files\":\"vSY5\"}],\"GhHJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = \"uniform mat4 u_MVPMatrix;\\nuniform mat4 u_ModelMatrix;\\nuniform mat4 u_NormalMatrix;\\n\";\nexports.default = _default;\n},{}],\"cfpJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _project2Vertex = _interopRequireDefault(require(\"./project2.vertex.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n  name: 'project2',\n  vs: _project2Vertex.default,\n  fs: _project2Vertex.default\n};\nexports.default = _default;\n},{\"./project2.vertex.glsl\":\"GhHJ\"}],\"CgeL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = \"varying vec3 pbr_vPosition;\\nvarying vec2 pbr_vUV;\\n\\n#ifdef HAS_NORMALS\\n# ifdef HAS_TANGENTS\\nvarying mat3 pbr_vTBN;\\n# else\\nvarying vec3 pbr_vNormal;\\n# endif\\n#endif\\n\\nvoid pbr_setPositionNormalTangentUV(vec4 position, vec4 normal, vec4 tangent, vec2 uv)\\n{\\n  vec4 pos = u_ModelMatrix * position;\\n  pbr_vPosition = vec3(pos.xyz) / pos.w;\\n\\n#ifdef HAS_NORMALS\\n#ifdef HAS_TANGENTS\\n  vec3 normalW = normalize(vec3(u_NormalMatrix * vec4(normal.xyz, 0.0)));\\n  vec3 tangentW = normalize(vec3(u_ModelMatrix * vec4(tangent.xyz, 0.0)));\\n  vec3 bitangentW = cross(normalW, tangentW) * tangent.w;\\n  pbr_vTBN = mat3(tangentW, bitangentW, normalW);\\n#else\\n  pbr_vNormal = normalize(vec3(u_ModelMatrix * vec4(normal.xyz, 0.0)));\\n#endif\\n#endif\\n\\n#ifdef HAS_UV\\n  pbr_vUV = uv;\\n#else\\n  pbr_vUV = vec2(0.,0.);\\n#endif\\n}\\n\";\nexports.default = _default;\n},{}],\"MS4w\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// This fragment shader defines a reference implementation for Physically Based Shading of\n// a microfacet surface material defined by a glTF model.\n//\n// Attribution:\n// MIT license, Copyright (c) 2016-2017 Mohamad Moneimne and Contributors\nvar _default = \"#extension GL_EXT_shader_texture_lod: enable\\n#extension GL_OES_standard_derivatives : enable\\n\\nprecision highp float;\\n\\nuniform vec3 u_LightDirection;\\nuniform vec3 u_LightColor;\\n\\n#ifdef USE_IBL\\nuniform samplerCube u_DiffuseEnvSampler;\\nuniform samplerCube u_SpecularEnvSampler;\\nuniform sampler2D u_brdfLUT;\\n#endif\\n\\n#ifdef HAS_BASECOLORMAP\\nuniform sampler2D u_BaseColorSampler;\\n#endif\\n#ifdef HAS_NORMALMAP\\nuniform sampler2D u_NormalSampler;\\nuniform float u_NormalScale;\\n#endif\\n#ifdef HAS_EMISSIVEMAP\\nuniform sampler2D u_EmissiveSampler;\\nuniform vec3 u_EmissiveFactor;\\n#endif\\n#ifdef HAS_METALROUGHNESSMAP\\nuniform sampler2D u_MetallicRoughnessSampler;\\n#endif\\n#ifdef HAS_OCCLUSIONMAP\\nuniform sampler2D u_OcclusionSampler;\\nuniform float u_OcclusionStrength;\\n#endif\\n\\nuniform vec2 u_MetallicRoughnessValues;\\nuniform vec4 u_BaseColorFactor;\\n\\nuniform vec3 u_Camera;\\nuniform vec4 u_ScaleDiffBaseMR;\\nuniform vec4 u_ScaleFGDSpec;\\nuniform vec4 u_ScaleIBLAmbient;\\n\\nvarying vec3 pbr_vPosition;\\n\\nvarying vec2 pbr_vUV;\\n\\n#ifdef HAS_NORMALS\\n#ifdef HAS_TANGENTS\\nvarying mat3 pbr_vTBN;\\n#else\\nvarying vec3 pbr_vNormal;\\n#endif\\n#endif\\n\\n\\nstruct PBRInfo\\n{\\n  float NdotL;\\n  float NdotV;\\n  float NdotH;\\n  float LdotH;\\n  float VdotH;\\n  float perceptualRoughness;\\n  float metalness;\\n  vec3 reflectance0;\\n  vec3 reflectance90;\\n  float alphaRoughness;\\n  vec3 diffuseColor;\\n  vec3 specularColor;\\n};\\n\\nconst float M_PI = 3.141592653589793;\\nconst float c_MinRoughness = 0.04;\\n\\nvec4 SRGBtoLINEAR(vec4 srgbIn)\\n{\\n  #ifdef MANUAL_SRGB\\n  #ifdef SRGB_FAST_APPROXIMATION\\n  vec3 linOut = pow(srgbIn.xyz,vec3(2.2));\\n  #else\\n  vec3 bLess = step(vec3(0.04045),srgbIn.xyz);\\n  vec3 linOut = mix( srgbIn.xyz/vec3(12.92), pow((srgbIn.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), bLess );\\n  #endif\\n  return vec4(linOut,srgbIn.w);;\\n  #else\\n  return srgbIn;\\n  #endif\\n}\\n\\nvec3 getNormal()\\n{\\n#ifndef HAS_TANGENTS\\n  vec3 pos_dx = dFdx(pbr_vPosition);\\n  vec3 pos_dy = dFdy(pbr_vPosition);\\n  vec3 tex_dx = dFdx(vec3(pbr_vUV, 0.0));\\n  vec3 tex_dy = dFdy(vec3(pbr_vUV, 0.0));\\n  vec3 t = (tex_dy.t * pos_dx - tex_dx.t * pos_dy) / (tex_dx.s * tex_dy.t - tex_dy.s * tex_dx.t);\\n\\n#ifdef HAS_NORMALS\\n  vec3 ng = normalize(pbr_vNormal);\\n#else\\n  vec3 ng = cross(pos_dx, pos_dy);\\n#endif\\n\\n  t = normalize(t - ng * dot(ng, t));\\n  vec3 b = normalize(cross(ng, t));\\n  mat3 tbn = mat3(t, b, ng);\\n#else\\n  mat3 tbn = pbr_vTBN;\\n#endif\\n\\n#ifdef HAS_NORMALMAP\\n  vec3 n = texture2D(u_NormalSampler, pbr_vUV).rgb;\\n  n = normalize(tbn * ((2.0 * n - 1.0) * vec3(u_NormalScale, u_NormalScale, 1.0)));\\n#else\\n  vec3 n = normalize(tbn[2].xyz);\\n#endif\\n\\n  return n;\\n}\\n\\n\\n#ifdef USE_IBL\\nvec3 getIBLContribution(PBRInfo pbrInputs, vec3 n, vec3 reflection)\\n{\\n  float mipCount = 9.0;\\n  float lod = (pbrInputs.perceptualRoughness * mipCount);\\n  vec3 brdf = SRGBtoLINEAR(texture2D(u_brdfLUT,\\n    vec2(pbrInputs.NdotV, 1.0 - pbrInputs.perceptualRoughness))).rgb;\\n  vec3 diffuseLight = SRGBtoLINEAR(textureCube(u_DiffuseEnvSampler, n)).rgb;\\n\\n#ifdef USE_TEX_LOD\\n  vec3 specularLight = SRGBtoLINEAR(textureCubeLodEXT(u_SpecularEnvSampler, reflection, lod)).rgb;\\n#else\\n  vec3 specularLight = SRGBtoLINEAR(textureCube(u_SpecularEnvSampler, reflection)).rgb;\\n#endif\\n\\n  vec3 diffuse = diffuseLight * pbrInputs.diffuseColor;\\n  vec3 specular = specularLight * (pbrInputs.specularColor * brdf.x + brdf.y);\\n  diffuse *= u_ScaleIBLAmbient.x;\\n  specular *= u_ScaleIBLAmbient.y;\\n\\n  return diffuse + specular;\\n}\\n#endif\\n\\n\\nvec3 diffuse(PBRInfo pbrInputs)\\n{\\n  return pbrInputs.diffuseColor / M_PI;\\n}\\n\\nvec3 specularReflection(PBRInfo pbrInputs)\\n{\\n  return pbrInputs.reflectance0 +\\n    (pbrInputs.reflectance90 - pbrInputs.reflectance0) *\\n    pow(clamp(1.0 - pbrInputs.VdotH, 0.0, 1.0), 5.0);\\n}\\n\\n\\n\\nfloat geometricOcclusion(PBRInfo pbrInputs)\\n{\\n  float NdotL = pbrInputs.NdotL;\\n  float NdotV = pbrInputs.NdotV;\\n  float r = pbrInputs.alphaRoughness;\\n\\n  float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL)));\\n  float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV)));\\n  return attenuationL * attenuationV;\\n}\\n\\n\\n\\n\\n\\nfloat microfacetDistribution(PBRInfo pbrInputs)\\n{\\n  float roughnessSq = pbrInputs.alphaRoughness * pbrInputs.alphaRoughness;\\n  float f = (pbrInputs.NdotH * roughnessSq - pbrInputs.NdotH) * pbrInputs.NdotH + 1.0;\\n  return roughnessSq / (M_PI * f * f);\\n}\\n\\nvec4 pbr_filterColor(vec4 colorUnused)\\n{\\n\\n\\n  float perceptualRoughness = u_MetallicRoughnessValues.y;\\n  float metallic = u_MetallicRoughnessValues.x;\\n#ifdef HAS_METALROUGHNESSMAP\\n\\n  vec4 mrSample = texture2D(u_MetallicRoughnessSampler, pbr_vUV);\\n  perceptualRoughness = mrSample.g * perceptualRoughness;\\n  metallic = mrSample.b * metallic;\\n#endif\\n  perceptualRoughness = clamp(perceptualRoughness, c_MinRoughness, 1.0);\\n  metallic = clamp(metallic, 0.0, 1.0);\\n\\n  float alphaRoughness = perceptualRoughness * perceptualRoughness;\\n#ifdef HAS_BASECOLORMAP\\n  vec4 baseColor = SRGBtoLINEAR(texture2D(u_BaseColorSampler, pbr_vUV)) * u_BaseColorFactor;\\n#else\\n  vec4 baseColor = u_BaseColorFactor;\\n#endif\\n\\n  vec3 f0 = vec3(0.04);\\n  vec3 diffuseColor = baseColor.rgb * (vec3(1.0) - f0);\\n  diffuseColor *= 1.0 - metallic;\\n  vec3 specularColor = mix(f0, baseColor.rgb, metallic);\\n  float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);\\n\\n\\n\\n  float reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0);\\n  vec3 specularEnvironmentR0 = specularColor.rgb;\\n  vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0) * reflectance90;\\n\\n  vec3 n = getNormal();\\n  vec3 v = normalize(u_Camera - pbr_vPosition);\\n  vec3 l = normalize(u_LightDirection);\\n  vec3 h = normalize(l+v);\\n  vec3 reflection = -normalize(reflect(v, n));\\n\\n  float NdotL = clamp(dot(n, l), 0.001, 1.0);\\n  float NdotV = clamp(abs(dot(n, v)), 0.001, 1.0);\\n  float NdotH = clamp(dot(n, h), 0.0, 1.0);\\n  float LdotH = clamp(dot(l, h), 0.0, 1.0);\\n  float VdotH = clamp(dot(v, h), 0.0, 1.0);\\n\\n  PBRInfo pbrInputs = PBRInfo(\\n    NdotL,\\n    NdotV,\\n    NdotH,\\n    LdotH,\\n    VdotH,\\n    perceptualRoughness,\\n    metallic,\\n    specularEnvironmentR0,\\n    specularEnvironmentR90,\\n    alphaRoughness,\\n    diffuseColor,\\n    specularColor\\n  );\\n  vec3 F = specularReflection(pbrInputs);\\n  float G = geometricOcclusion(pbrInputs);\\n  float D = microfacetDistribution(pbrInputs);\\n  vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs);\\n  vec3 specContrib = F * G * D / (4.0 * NdotL * NdotV);\\n  vec3 color = NdotL * u_LightColor * (diffuseContrib + specContrib);\\n#ifdef USE_IBL\\n  color += getIBLContribution(pbrInputs, n, reflection);\\n#endif\\n#ifdef HAS_OCCLUSIONMAP\\n  float ao = texture2D(u_OcclusionSampler, pbr_vUV).r;\\n  color = mix(color, color * ao, u_OcclusionStrength);\\n#endif\\n\\n#ifdef HAS_EMISSIVEMAP\\n  vec3 emissive = SRGBtoLINEAR(texture2D(u_EmissiveSampler, pbr_vUV)).rgb * u_EmissiveFactor;\\n  color += emissive;\\n#endif\\n\\n  color = mix(color, F, u_ScaleFGDSpec.x);\\n  color = mix(color, vec3(G), u_ScaleFGDSpec.y);\\n  color = mix(color, vec3(D), u_ScaleFGDSpec.z);\\n  color = mix(color, specContrib, u_ScaleFGDSpec.w);\\n\\n  color = mix(color, diffuseContrib, u_ScaleDiffBaseMR.x);\\n  color = mix(color, baseColor.rgb, u_ScaleDiffBaseMR.y);\\n  color = mix(color, vec3(metallic), u_ScaleDiffBaseMR.z);\\n  color = mix(color, vec3(perceptualRoughness), u_ScaleDiffBaseMR.w);\\n\\n  return vec4(pow(color,vec3(1.0/2.2)), baseColor.a);\\n}\\n\";\nexports.default = _default;\n},{}],\"grsJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _project = _interopRequireDefault(require(\"../project2/project2\"));\n\nvar _pbrVertex = _interopRequireDefault(require(\"./pbr-vertex.glsl\"));\n\nvar _pbrFragment = _interopRequireDefault(require(\"./pbr-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n  name: 'pbr',\n  vs: _pbrVertex.default,\n  fs: _pbrFragment.default,\n  dependencies: [_project.default] // getUniforms\n\n};\nexports.default = _default;\n},{\"../project2/project2\":\"cfpJ\",\"./pbr-vertex.glsl\":\"CgeL\",\"./pbr-fragment.glsl\":\"MS4w\"}],\"iiNl\":[function(require,module,exports) {\nvar global = arguments[3];\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"isWebGL\", {\n  enumerable: true,\n  get: function () {\n    return _webglChecks.isWebGL;\n  }\n});\nObject.defineProperty(exports, \"isWebGL2\", {\n  enumerable: true,\n  get: function () {\n    return _webglChecks.isWebGL2;\n  }\n});\nObject.defineProperty(exports, \"cloneTextureFrom\", {\n  enumerable: true,\n  get: function () {\n    return _textureUtils.cloneTextureFrom;\n  }\n});\nObject.defineProperty(exports, \"getKeyValue\", {\n  enumerable: true,\n  get: function () {\n    return _constantsToKeys.getKeyValue;\n  }\n});\nObject.defineProperty(exports, \"getKey\", {\n  enumerable: true,\n  get: function () {\n    return _constantsToKeys.getKey;\n  }\n});\nObject.defineProperty(exports, \"glGet\", {\n  enumerable: true,\n  get: function () {\n    return _constantsToKeys.glGet;\n  }\n});\nObject.defineProperty(exports, \"glKey\", {\n  enumerable: true,\n  get: function () {\n    return _constantsToKeys.glKey;\n  }\n});\nObject.defineProperty(exports, \"glKeyType\", {\n  enumerable: true,\n  get: function () {\n    return _constantsToKeys.glKeyType;\n  }\n});\nObject.defineProperty(exports, \"createGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.createGLContext;\n  }\n});\nObject.defineProperty(exports, \"destroyGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.destroyGLContext;\n  }\n});\nObject.defineProperty(exports, \"resizeGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.resizeGLContext;\n  }\n});\nObject.defineProperty(exports, \"pollGLContext\", {\n  enumerable: true,\n  get: function () {\n    return _context.pollGLContext;\n  }\n});\nObject.defineProperty(exports, \"setContextDefaults\", {\n  enumerable: true,\n  get: function () {\n    return _context.setContextDefaults;\n  }\n});\nObject.defineProperty(exports, \"trackContextState\", {\n  enumerable: true,\n  get: function () {\n    return _webglContext.trackContextState;\n  }\n});\nObject.defineProperty(exports, \"resetParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.resetParameters;\n  }\n});\nObject.defineProperty(exports, \"getParameter\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.getParameter;\n  }\n});\nObject.defineProperty(exports, \"getParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.getParameters;\n  }\n});\nObject.defineProperty(exports, \"setParameter\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.setParameter;\n  }\n});\nObject.defineProperty(exports, \"setParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.setParameters;\n  }\n});\nObject.defineProperty(exports, \"withParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.withParameters;\n  }\n});\nObject.defineProperty(exports, \"getModifiedParameters\", {\n  enumerable: true,\n  get: function () {\n    return _contextState.getModifiedParameters;\n  }\n});\nObject.defineProperty(exports, \"getContextInfo\", {\n  enumerable: true,\n  get: function () {\n    return _contextLimits.getContextInfo;\n  }\n});\nObject.defineProperty(exports, \"getGLContextInfo\", {\n  enumerable: true,\n  get: function () {\n    return _contextLimits.getGLContextInfo;\n  }\n});\nObject.defineProperty(exports, \"getContextLimits\", {\n  enumerable: true,\n  get: function () {\n    return _contextLimits.getContextLimits;\n  }\n});\nObject.defineProperty(exports, \"glGetDebugInfo\", {\n  enumerable: true,\n  get: function () {\n    return _contextLimits.glGetDebugInfo;\n  }\n});\nObject.defineProperty(exports, \"FEATURES\", {\n  enumerable: true,\n  get: function () {\n    return _contextFeatures.FEATURES;\n  }\n});\nObject.defineProperty(exports, \"hasFeature\", {\n  enumerable: true,\n  get: function () {\n    return _contextFeatures.hasFeature;\n  }\n});\nObject.defineProperty(exports, \"hasFeatures\", {\n  enumerable: true,\n  get: function () {\n    return _contextFeatures.hasFeatures;\n  }\n});\nObject.defineProperty(exports, \"getFeatures\", {\n  enumerable: true,\n  get: function () {\n    return _contextFeatures.getFeatures;\n  }\n});\nObject.defineProperty(exports, \"canCompileGLGSExtension\", {\n  enumerable: true,\n  get: function () {\n    return _contextFeatures.canCompileGLGSExtension;\n  }\n});\nObject.defineProperty(exports, \"Buffer\", {\n  enumerable: true,\n  get: function () {\n    return _buffer.default;\n  }\n});\nObject.defineProperty(exports, \"Shader\", {\n  enumerable: true,\n  get: function () {\n    return _shader.Shader;\n  }\n});\nObject.defineProperty(exports, \"VertexShader\", {\n  enumerable: true,\n  get: function () {\n    return _shader.VertexShader;\n  }\n});\nObject.defineProperty(exports, \"FragmentShader\", {\n  enumerable: true,\n  get: function () {\n    return _shader.FragmentShader;\n  }\n});\nObject.defineProperty(exports, \"Program\", {\n  enumerable: true,\n  get: function () {\n    return _program.default;\n  }\n});\nObject.defineProperty(exports, \"Framebuffer\", {\n  enumerable: true,\n  get: function () {\n    return _framebuffer.default;\n  }\n});\nObject.defineProperty(exports, \"Renderbuffer\", {\n  enumerable: true,\n  get: function () {\n    return _renderbuffer.default;\n  }\n});\nObject.defineProperty(exports, \"Texture2D\", {\n  enumerable: true,\n  get: function () {\n    return _texture2d.default;\n  }\n});\nObject.defineProperty(exports, \"TextureCube\", {\n  enumerable: true,\n  get: function () {\n    return _textureCube.default;\n  }\n});\nObject.defineProperty(exports, \"clear\", {\n  enumerable: true,\n  get: function () {\n    return _clear.clear;\n  }\n});\nObject.defineProperty(exports, \"clearBuffer\", {\n  enumerable: true,\n  get: function () {\n    return _clear.clearBuffer;\n  }\n});\nObject.defineProperty(exports, \"_clearBuffer\", {\n  enumerable: true,\n  get: function () {\n    return _clear.clearBuffer;\n  }\n});\nObject.defineProperty(exports, \"FenceSync\", {\n  enumerable: true,\n  get: function () {\n    return _fenceSync.default;\n  }\n});\nObject.defineProperty(exports, \"Query\", {\n  enumerable: true,\n  get: function () {\n    return _query.default;\n  }\n});\nObject.defineProperty(exports, \"Sampler\", {\n  enumerable: true,\n  get: function () {\n    return _sampler.default;\n  }\n});\nObject.defineProperty(exports, \"Texture3D\", {\n  enumerable: true,\n  get: function () {\n    return _texture3d.default;\n  }\n});\nObject.defineProperty(exports, \"Texture2DArray\", {\n  enumerable: true,\n  get: function () {\n    return _texture2dArray.default;\n  }\n});\nObject.defineProperty(exports, \"TransformFeedback\", {\n  enumerable: true,\n  get: function () {\n    return _transformFeedback.default;\n  }\n});\nObject.defineProperty(exports, \"VertexArrayObject\", {\n  enumerable: true,\n  get: function () {\n    return _vertexArrayObject.default;\n  }\n});\nObject.defineProperty(exports, \"VertexArray\", {\n  enumerable: true,\n  get: function () {\n    return _vertexArray.default;\n  }\n});\nObject.defineProperty(exports, \"UniformBufferLayout\", {\n  enumerable: true,\n  get: function () {\n    return _uniformBufferLayout.default;\n  }\n});\nObject.defineProperty(exports, \"_Accessor\", {\n  enumerable: true,\n  get: function () {\n    return _accessor.default;\n  }\n});\nObject.defineProperty(exports, \"Object3D\", {\n  enumerable: true,\n  get: function () {\n    return _object3d.default;\n  }\n});\nObject.defineProperty(exports, \"Group\", {\n  enumerable: true,\n  get: function () {\n    return _group.default;\n  }\n});\nObject.defineProperty(exports, \"Model\", {\n  enumerable: true,\n  get: function () {\n    return _model.default;\n  }\n});\nObject.defineProperty(exports, \"AnimationLoop\", {\n  enumerable: true,\n  get: function () {\n    return _animationLoop.default;\n  }\n});\nObject.defineProperty(exports, \"pickModels\", {\n  enumerable: true,\n  get: function () {\n    return _pickModels.default;\n  }\n});\nObject.defineProperty(exports, \"encodePickingColor\", {\n  enumerable: true,\n  get: function () {\n    return _pickingColors.encodePickingColor;\n  }\n});\nObject.defineProperty(exports, \"decodePickingColor\", {\n  enumerable: true,\n  get: function () {\n    return _pickingColors.decodePickingColor;\n  }\n});\nObject.defineProperty(exports, \"getNullPickingColor\", {\n  enumerable: true,\n  get: function () {\n    return _pickingColors.getNullPickingColor;\n  }\n});\nObject.defineProperty(exports, \"Transform\", {\n  enumerable: true,\n  get: function () {\n    return _transform.default;\n  }\n});\nObject.defineProperty(exports, \"_Attribute\", {\n  enumerable: true,\n  get: function () {\n    return _attribute.default;\n  }\n});\nObject.defineProperty(exports, \"_ShaderCache\", {\n  enumerable: true,\n  get: function () {\n    return _shaderCache.default;\n  }\n});\nObject.defineProperty(exports, \"_AnimationLoopProxy\", {\n  enumerable: true,\n  get: function () {\n    return _animationLoopProxy.default;\n  }\n});\nObject.defineProperty(exports, \"_MultiPassRenderer\", {\n  enumerable: true,\n  get: function () {\n    return _multiPassRenderer.default;\n  }\n});\nObject.defineProperty(exports, \"_RenderState\", {\n  enumerable: true,\n  get: function () {\n    return _renderState.default;\n  }\n});\nObject.defineProperty(exports, \"_Pass\", {\n  enumerable: true,\n  get: function () {\n    return _pass.default;\n  }\n});\nObject.defineProperty(exports, \"_CompositePass\", {\n  enumerable: true,\n  get: function () {\n    return _compositePass.default;\n  }\n});\nObject.defineProperty(exports, \"_ClearPass\", {\n  enumerable: true,\n  get: function () {\n    return _clearPass.default;\n  }\n});\nObject.defineProperty(exports, \"_RenderPass\", {\n  enumerable: true,\n  get: function () {\n    return _renderPass.default;\n  }\n});\nObject.defineProperty(exports, \"_CopyPass\", {\n  enumerable: true,\n  get: function () {\n    return _copyPass.default;\n  }\n});\nObject.defineProperty(exports, \"_TexturePass\", {\n  enumerable: true,\n  get: function () {\n    return _texturePass.default;\n  }\n});\nObject.defineProperty(exports, \"_PickingPass\", {\n  enumerable: true,\n  get: function () {\n    return _pickingPass.default;\n  }\n});\nObject.defineProperty(exports, \"_ShaderModulePass\", {\n  enumerable: true,\n  get: function () {\n    return _shaderModulePass.default;\n  }\n});\nObject.defineProperty(exports, \"_Canvas\", {\n  enumerable: true,\n  get: function () {\n    return _canvas.default;\n  }\n});\nObject.defineProperty(exports, \"Geometry\", {\n  enumerable: true,\n  get: function () {\n    return _geometry.default;\n  }\n});\nObject.defineProperty(exports, \"ConeGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _coneGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"CubeGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _cubeGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"CylinderGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _cylinderGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"IcoSphereGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _icoSphereGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"PlaneGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _planeGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"SphereGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _sphereGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"TruncatedConeGeometry\", {\n  enumerable: true,\n  get: function () {\n    return _truncatedConeGeometry.default;\n  }\n});\nObject.defineProperty(exports, \"Cone\", {\n  enumerable: true,\n  get: function () {\n    return _cone.default;\n  }\n});\nObject.defineProperty(exports, \"Cube\", {\n  enumerable: true,\n  get: function () {\n    return _cube.default;\n  }\n});\nObject.defineProperty(exports, \"Cylinder\", {\n  enumerable: true,\n  get: function () {\n    return _cylinder.default;\n  }\n});\nObject.defineProperty(exports, \"IcoSphere\", {\n  enumerable: true,\n  get: function () {\n    return _icoSphere.default;\n  }\n});\nObject.defineProperty(exports, \"Plane\", {\n  enumerable: true,\n  get: function () {\n    return _plane.default;\n  }\n});\nObject.defineProperty(exports, \"Sphere\", {\n  enumerable: true,\n  get: function () {\n    return _sphere.default;\n  }\n});\nObject.defineProperty(exports, \"TruncatedCone\", {\n  enumerable: true,\n  get: function () {\n    return _truncatedCone.default;\n  }\n});\nObject.defineProperty(exports, \"ClipSpace\", {\n  enumerable: true,\n  get: function () {\n    return _clipSpace.default;\n  }\n});\nObject.defineProperty(exports, \"ClipSpaceQuad\", {\n  enumerable: true,\n  get: function () {\n    return _clipSpace.default;\n  }\n});\nObject.defineProperty(exports, \"setPathPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _io.setPathPrefix;\n  }\n});\nObject.defineProperty(exports, \"loadFile\", {\n  enumerable: true,\n  get: function () {\n    return _io.loadFile;\n  }\n});\nObject.defineProperty(exports, \"loadImage\", {\n  enumerable: true,\n  get: function () {\n    return _io.loadImage;\n  }\n});\nObject.defineProperty(exports, \"loadTexture\", {\n  enumerable: true,\n  get: function () {\n    return _io.loadTexture;\n  }\n});\nObject.defineProperty(exports, \"loadFiles\", {\n  enumerable: true,\n  get: function () {\n    return _io.loadFiles;\n  }\n});\nObject.defineProperty(exports, \"loadImages\", {\n  enumerable: true,\n  get: function () {\n    return _io.loadImages;\n  }\n});\nObject.defineProperty(exports, \"loadTextures\", {\n  enumerable: true,\n  get: function () {\n    return _io.loadTextures;\n  }\n});\nObject.defineProperty(exports, \"loadProgram\", {\n  enumerable: true,\n  get: function () {\n    return _io.loadProgram;\n  }\n});\nObject.defineProperty(exports, \"loadModel\", {\n  enumerable: true,\n  get: function () {\n    return _io.loadModel;\n  }\n});\nObject.defineProperty(exports, \"parseModel\", {\n  enumerable: true,\n  get: function () {\n    return _io.parseModel;\n  }\n});\nObject.defineProperty(exports, \"setDefaultShaderModules\", {\n  enumerable: true,\n  get: function () {\n    return _resolveModules.setDefaultShaderModules;\n  }\n});\nObject.defineProperty(exports, \"registerShaderModules\", {\n  enumerable: true,\n  get: function () {\n    return _resolveModules.registerShaderModules;\n  }\n});\nObject.defineProperty(exports, \"assembleShaders\", {\n  enumerable: true,\n  get: function () {\n    return _assembleShaders.assembleShaders;\n  }\n});\nObject.defineProperty(exports, \"normalizeShaderModule\", {\n  enumerable: true,\n  get: function () {\n    return _normalizeModule.normalizeShaderModule;\n  }\n});\nObject.defineProperty(exports, \"fp32\", {\n  enumerable: true,\n  get: function () {\n    return _fp.default;\n  }\n});\nObject.defineProperty(exports, \"fp64\", {\n  enumerable: true,\n  get: function () {\n    return _fp2.default;\n  }\n});\nObject.defineProperty(exports, \"project\", {\n  enumerable: true,\n  get: function () {\n    return _project.default;\n  }\n});\nObject.defineProperty(exports, \"lighting\", {\n  enumerable: true,\n  get: function () {\n    return _lighting.default;\n  }\n});\nObject.defineProperty(exports, \"dirlight\", {\n  enumerable: true,\n  get: function () {\n    return _dirlight.default;\n  }\n});\nObject.defineProperty(exports, \"picking\", {\n  enumerable: true,\n  get: function () {\n    return _picking.default;\n  }\n});\nObject.defineProperty(exports, \"diffuse\", {\n  enumerable: true,\n  get: function () {\n    return _diffuse.default;\n  }\n});\nObject.defineProperty(exports, \"pbr\", {\n  enumerable: true,\n  get: function () {\n    return _pbr.default;\n  }\n});\nObject.defineProperty(exports, \"assert\", {\n  enumerable: true,\n  get: function () {\n    return _assert.default;\n  }\n});\nObject.defineProperty(exports, \"log\", {\n  enumerable: true,\n  get: function () {\n    return _log.default;\n  }\n});\nObject.defineProperty(exports, \"global\", {\n  enumerable: true,\n  get: function () {\n    return _globals.global;\n  }\n});\nObject.defineProperty(exports, \"window\", {\n  enumerable: true,\n  get: function () {\n    return _globals.window;\n  }\n});\nObject.defineProperty(exports, \"document\", {\n  enumerable: true,\n  get: function () {\n    return _globals.document;\n  }\n});\nObject.defineProperty(exports, \"self\", {\n  enumerable: true,\n  get: function () {\n    return _globals.self;\n  }\n});\nObject.defineProperty(exports, \"isBrowser\", {\n  enumerable: true,\n  get: function () {\n    return _isBrowser.default;\n  }\n});\nObject.defineProperty(exports, \"isOldIE\", {\n  enumerable: true,\n  get: function () {\n    return _isOldIe.default;\n  }\n});\nObject.defineProperty(exports, \"stubRemovedMethods\", {\n  enumerable: true,\n  get: function () {\n    return _stubMethods.stubRemovedMethods;\n  }\n});\nObject.defineProperty(exports, \"makeDebugContext\", {\n  enumerable: true,\n  get: function () {\n    return _debugContext.makeDebugContext;\n  }\n});\n\nvar _webglChecks = require(\"./webgl-utils/webgl-checks\");\n\nvar _textureUtils = require(\"./webgl-utils/texture-utils\");\n\nvar _constantsToKeys = require(\"./webgl-utils/constants-to-keys\");\n\nvar _context = require(\"./webgl-context/context\");\n\nvar _webglContext = require(\"./webgl-context\");\n\nvar _contextState = require(\"./webgl-context/context-state\");\n\nvar _contextLimits = require(\"./webgl-context/context-limits\");\n\nvar _contextFeatures = require(\"./webgl-context/context-features\");\n\nvar _buffer = _interopRequireDefault(require(\"./webgl/buffer\"));\n\nvar _shader = require(\"./webgl/shader\");\n\nvar _program = _interopRequireDefault(require(\"./webgl/program\"));\n\nvar _framebuffer = _interopRequireDefault(require(\"./webgl/framebuffer\"));\n\nvar _renderbuffer = _interopRequireDefault(require(\"./webgl/renderbuffer\"));\n\nvar _texture2d = _interopRequireDefault(require(\"./webgl/texture-2d\"));\n\nvar _textureCube = _interopRequireDefault(require(\"./webgl/texture-cube\"));\n\nvar _clear = require(\"./webgl/clear\");\n\nvar _fenceSync = _interopRequireDefault(require(\"./webgl/fence-sync\"));\n\nvar _query = _interopRequireDefault(require(\"./webgl/query\"));\n\nvar _sampler = _interopRequireDefault(require(\"./webgl/sampler\"));\n\nvar _texture3d = _interopRequireDefault(require(\"./webgl/texture-3d\"));\n\nvar _texture2dArray = _interopRequireDefault(require(\"./webgl/texture-2d-array\"));\n\nvar _transformFeedback = _interopRequireDefault(require(\"./webgl/transform-feedback\"));\n\nvar _vertexArrayObject = _interopRequireDefault(require(\"./webgl/vertex-array-object\"));\n\nvar _vertexArray = _interopRequireDefault(require(\"./webgl/vertex-array\"));\n\nvar _uniformBufferLayout = _interopRequireDefault(require(\"./webgl/uniform-buffer-layout\"));\n\nvar _accessor = _interopRequireDefault(require(\"./webgl/accessor\"));\n\nvar _object3d = _interopRequireDefault(require(\"./core/object-3d\"));\n\nvar _group = _interopRequireDefault(require(\"./core/group\"));\n\nvar _model = _interopRequireDefault(require(\"./core/model\"));\n\nvar _animationLoop = _interopRequireDefault(require(\"./core/animation-loop\"));\n\nvar _pickModels = _interopRequireDefault(require(\"./core/pick-models\"));\n\nvar _pickingColors = require(\"./core/picking-colors\");\n\nvar _transform = _interopRequireDefault(require(\"./core/transform\"));\n\nvar _attribute = _interopRequireDefault(require(\"./core/attribute\"));\n\nvar _shaderCache = _interopRequireDefault(require(\"./core/shader-cache\"));\n\nvar _animationLoopProxy = _interopRequireDefault(require(\"./core/animation-loop-proxy\"));\n\nvar _multiPassRenderer = _interopRequireDefault(require(\"./multipass/multi-pass-renderer\"));\n\nvar _renderState = _interopRequireDefault(require(\"./multipass/render-state\"));\n\nvar _pass = _interopRequireDefault(require(\"./multipass/pass\"));\n\nvar _compositePass = _interopRequireDefault(require(\"./multipass/composite-pass\"));\n\nvar _clearPass = _interopRequireDefault(require(\"./multipass/clear-pass\"));\n\nvar _renderPass = _interopRequireDefault(require(\"./multipass/render-pass\"));\n\nvar _copyPass = _interopRequireDefault(require(\"./multipass/copy-pass\"));\n\nvar _texturePass = _interopRequireDefault(require(\"./multipass/texture-pass\"));\n\nvar _pickingPass = _interopRequireDefault(require(\"./multipass/picking-pass\"));\n\nvar _shaderModulePass = _interopRequireDefault(require(\"./multipass/shader-module-pass\"));\n\nvar _canvas = _interopRequireDefault(require(\"./multipass/canvas\"));\n\nvar _geometry = _interopRequireDefault(require(\"./geometry/geometry\"));\n\nvar _coneGeometry = _interopRequireDefault(require(\"./geometry/cone-geometry\"));\n\nvar _cubeGeometry = _interopRequireDefault(require(\"./geometry/cube-geometry\"));\n\nvar _cylinderGeometry = _interopRequireDefault(require(\"./geometry/cylinder-geometry\"));\n\nvar _icoSphereGeometry = _interopRequireDefault(require(\"./geometry/ico-sphere-geometry\"));\n\nvar _planeGeometry = _interopRequireDefault(require(\"./geometry/plane-geometry\"));\n\nvar _sphereGeometry = _interopRequireDefault(require(\"./geometry/sphere-geometry\"));\n\nvar _truncatedConeGeometry = _interopRequireDefault(require(\"./geometry/truncated-cone-geometry\"));\n\nvar _cone = _interopRequireDefault(require(\"./models/cone\"));\n\nvar _cube = _interopRequireDefault(require(\"./models/cube\"));\n\nvar _cylinder = _interopRequireDefault(require(\"./models/cylinder\"));\n\nvar _icoSphere = _interopRequireDefault(require(\"./models/ico-sphere\"));\n\nvar _plane = _interopRequireDefault(require(\"./models/plane\"));\n\nvar _sphere = _interopRequireDefault(require(\"./models/sphere\"));\n\nvar _truncatedCone = _interopRequireDefault(require(\"./models/truncated-cone\"));\n\nvar _clipSpace = _interopRequireDefault(require(\"./models/clip-space\"));\n\nvar _io = require(\"./io\");\n\nvar _resolveModules = require(\"./shadertools/src/lib/resolve-modules\");\n\nvar _assembleShaders = require(\"./shadertools/src/lib/assemble-shaders\");\n\nvar _normalizeModule = require(\"./shadertools/src/lib/filters/normalize-module\");\n\nvar _fp = _interopRequireDefault(require(\"./shadertools/src/modules/fp32/fp32\"));\n\nvar _fp2 = _interopRequireDefault(require(\"./shadertools/src/modules/fp64/fp64\"));\n\nvar _project = _interopRequireDefault(require(\"./shadertools/src/modules/project/project\"));\n\nvar _lighting = _interopRequireDefault(require(\"./shadertools/src/modules/lighting/lighting\"));\n\nvar _dirlight = _interopRequireDefault(require(\"./shadertools/src/modules/dirlight/dirlight\"));\n\nvar _picking = _interopRequireDefault(require(\"./shadertools/src/modules/picking/picking\"));\n\nvar _diffuse = _interopRequireDefault(require(\"./shadertools/src/modules/diffuse/diffuse\"));\n\nvar _pbr = _interopRequireDefault(require(\"./shadertools/src/modules/pbr/pbr\"));\n\nvar _assert = _interopRequireDefault(require(\"./utils/assert\"));\n\nvar _log = _interopRequireDefault(require(\"./utils/log\"));\n\nvar _globals = require(\"./utils/globals\");\n\nvar _isBrowser = _interopRequireDefault(require(\"./utils/is-browser\"));\n\nvar _isOldIe = _interopRequireDefault(require(\"./utils/is-old-ie\"));\n\nvar _stubMethods = require(\"./utils/stub-methods\");\n\nvar _debugContext = require(\"./webgl-context/debug-context\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Export core modules for luma.gl\n// Initialize any global state\nrequire('./init'); // WebGL\n},{\"./init\":\"aXVf\",\"./webgl-utils/webgl-checks\":\"it7h\",\"./webgl-utils/texture-utils\":\"i2kP\",\"./webgl-utils/constants-to-keys\":\"d71e\",\"./webgl-context/context\":\"LFBw\",\"./webgl-context\":\"rNTT\",\"./webgl-context/context-state\":\"ON2o\",\"./webgl-context/context-limits\":\"aTuQ\",\"./webgl-context/context-features\":\"T1Gu\",\"./webgl/buffer\":\"IZPG\",\"./webgl/shader\":\"Y9vu\",\"./webgl/program\":\"xVcT\",\"./webgl/framebuffer\":\"V5nt\",\"./webgl/renderbuffer\":\"OYcf\",\"./webgl/texture-2d\":\"aCs7\",\"./webgl/texture-cube\":\"NgPC\",\"./webgl/clear\":\"mZdw\",\"./webgl/fence-sync\":\"MCxn\",\"./webgl/query\":\"pbPK\",\"./webgl/sampler\":\"MaRe\",\"./webgl/texture-3d\":\"PSN1\",\"./webgl/texture-2d-array\":\"sERP\",\"./webgl/transform-feedback\":\"vegQ\",\"./webgl/vertex-array-object\":\"ntIB\",\"./webgl/vertex-array\":\"yRin\",\"./webgl/uniform-buffer-layout\":\"hoFY\",\"./webgl/accessor\":\"E5yL\",\"./core/object-3d\":\"WDVo\",\"./core/group\":\"Sm8u\",\"./core/model\":\"DSwH\",\"./core/animation-loop\":\"GBRt\",\"./core/pick-models\":\"WAG5\",\"./core/picking-colors\":\"eHdi\",\"./core/transform\":\"TTgu\",\"./core/attribute\":\"VJC6\",\"./core/shader-cache\":\"VTa7\",\"./core/animation-loop-proxy\":\"eWAK\",\"./multipass/multi-pass-renderer\":\"c48i\",\"./multipass/render-state\":\"Q43F\",\"./multipass/pass\":\"En7M\",\"./multipass/composite-pass\":\"BMzv\",\"./multipass/clear-pass\":\"DldW\",\"./multipass/render-pass\":\"rHPl\",\"./multipass/copy-pass\":\"UPkb\",\"./multipass/texture-pass\":\"twB5\",\"./multipass/picking-pass\":\"ATXS\",\"./multipass/shader-module-pass\":\"FnHc\",\"./multipass/canvas\":\"tfwo\",\"./geometry/geometry\":\"a3Eh\",\"./geometry/cone-geometry\":\"QBo7\",\"./geometry/cube-geometry\":\"XAxe\",\"./geometry/cylinder-geometry\":\"KijP\",\"./geometry/ico-sphere-geometry\":\"g0h0\",\"./geometry/plane-geometry\":\"KcWt\",\"./geometry/sphere-geometry\":\"S3rS\",\"./geometry/truncated-cone-geometry\":\"p6lX\",\"./models/cone\":\"VaYO\",\"./models/cube\":\"dBtY\",\"./models/cylinder\":\"li8i\",\"./models/ico-sphere\":\"SIDC\",\"./models/plane\":\"plnG\",\"./models/sphere\":\"Wvbg\",\"./models/truncated-cone\":\"r5jt\",\"./models/clip-space\":\"fvbP\",\"./io\":\"HSmR\",\"./shadertools/src/lib/resolve-modules\":\"iN6G\",\"./shadertools/src/lib/assemble-shaders\":\"FVsj\",\"./shadertools/src/lib/filters/normalize-module\":\"nL5W\",\"./shadertools/src/modules/fp32/fp32\":\"AmUH\",\"./shadertools/src/modules/fp64/fp64\":\"YiWl\",\"./shadertools/src/modules/project/project\":\"NP0n\",\"./shadertools/src/modules/lighting/lighting\":\"fUvV\",\"./shadertools/src/modules/dirlight/dirlight\":\"bOxq\",\"./shadertools/src/modules/picking/picking\":\"ib9Y\",\"./shadertools/src/modules/diffuse/diffuse\":\"NxmS\",\"./shadertools/src/modules/pbr/pbr\":\"grsJ\",\"./utils/assert\":\"iVaU\",\"./utils/log\":\"YuHO\",\"./utils/globals\":\"zU4q\",\"./utils/is-browser\":\"WplP\",\"./utils/is-old-ie\":\"IB2l\",\"./utils/stub-methods\":\"bzQS\",\"./webgl-context/debug-context\":\"GOH4\"}],\"PzAR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PROJECT_COORDINATE_SYSTEM = void 0;\nvar PROJECT_COORDINATE_SYSTEM = {\n  // Underscore required because GLSL code expects COORDINATE_SYSTEM_LNG_LAT\n  LNG_LAT: 1.0,\n  // Previously known as LNGLAT_EXPERIMENTAL (in 6.0)\n  LNGLAT_AUTO_OFFSET: 4.0,\n  METER_OFFSETS: 2.0,\n  LNGLAT_OFFSETS: 3.0,\n  IDENTITY: 0.0\n};\nexports.PROJECT_COORDINATE_SYSTEM = PROJECT_COORDINATE_SYSTEM;\n},{}],\"g9uc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"./constants\");\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// We are generating these from the js code in constants.js\nvar COORDINATE_SYSTEM_GLSL_CONSTANTS = Object.keys(_constants.PROJECT_COORDINATE_SYSTEM).map(function (key) {\n  return \"const float COORDINATE_SYSTEM_\".concat(key, \" = \").concat(_constants.PROJECT_COORDINATE_SYSTEM[key], \".;\");\n}).join('');\n\nvar _default = \"\".concat(COORDINATE_SYSTEM_GLSL_CONSTANTS, \"\\n\\nuniform float project_uCoordinateSystem;\\nuniform float project_uScale;\\nuniform bool project_uWrapLongitude;\\nuniform float project_uAntimeridian;\\nuniform vec3 project_uPixelsPerMeter;\\nuniform vec3 project_uPixelsPerDegree;\\nuniform vec3 project_uPixelsPerUnit;\\nuniform vec3 project_uPixelsPerUnit2;\\nuniform vec4 project_uCenter;\\nuniform mat4 project_uModelMatrix;\\nuniform mat4 project_uViewProjectionMatrix;\\nuniform vec2 project_uViewportSize;\\nuniform float project_uDevicePixelRatio;\\nuniform float project_uFocalDistance;\\nuniform vec3 project_uCameraPosition;\\nuniform vec2 project_coordinate_origin;\\n\\nconst float TILE_SIZE = 512.0;\\nconst float PI = 3.1415926536;\\nconst float WORLD_SCALE = TILE_SIZE / (PI * 2.0);\\nconst vec2 ZERO_64_XY_LOW = vec2(0.0, 0.0);\\n\\n//\\n// Scaling offsets - scales meters to \\\"pixels\\\"\\n// Note the scalar version of project_scale is for scaling the z component only\\n//\\nfloat project_scale(float meters) {\\n  return meters * project_uPixelsPerMeter.z;\\n}\\n\\nvec2 project_scale(vec2 meters) {\\n  return meters * project_uPixelsPerMeter.xy;\\n}\\n\\nvec3 project_scale(vec3 meters) {\\n  return meters * project_uPixelsPerMeter;\\n}\\n\\nvec4 project_scale(vec4 meters) {\\n  return vec4(meters.xyz * project_uPixelsPerMeter, meters.w);\\n}\\n\\n//\\n// Projecting normal - transform deltas from current coordinate system to\\n// normals in the worldspace\\n//\\nvec3 project_normal(vec3 vector) {\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNG_LAT ||\\n    project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSETS) {\\n    return normalize(vector * project_uPixelsPerDegree);\\n  }\\n  // Apply model matrix\\n  vec4 normal_modelspace = project_uModelMatrix * vec4(vector, 0.0);\\n  return normalize(normal_modelspace.xyz * project_uPixelsPerMeter);\\n}\\n\\nvec4 project_offset_(vec4 offset) {\\n  float dy = offset.y;\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_AUTO_OFFSET) {\\n    dy = clamp(dy, -1., 1.);\\n  }\\n  vec3 pixelsPerUnit = project_uPixelsPerUnit + project_uPixelsPerUnit2 * dy;\\n  return vec4(offset.xyz * pixelsPerUnit, offset.w);\\n}\\n\\n//\\n// Projecting positions - non-linear projection: lnglats => unit tile [0-1, 0-1]\\n//\\nvec2 project_mercator_(vec2 lnglat) {\\n  float x = lnglat.x;\\n  if (project_uWrapLongitude) {\\n    x = mod(x - project_uAntimeridian, 360.0) + project_uAntimeridian;\\n  }\\n  return vec2(\\n    radians(x) + PI,\\n    PI - log(tan_fp32(PI * 0.25 + radians(lnglat.y) * 0.5))\\n  );\\n}\\n\\n//\\n// Projects lnglats (or meter offsets, depending on mode) to pixels\\n//\\nvec4 project_position(vec4 position, vec2 position64xyLow) {\\n  // TODO - why not simply subtract center and fall through?\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNG_LAT) {\\n    return project_uModelMatrix * vec4(\\n      project_mercator_(position.xy) * WORLD_SCALE * project_uScale,\\n      project_scale(position.z),\\n      position.w\\n    );\\n  }\\n\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_AUTO_OFFSET) {\\n    // Subtract high part of 64 bit value. Convert remainder to float32, preserving precision.\\n    float X = position.x - project_coordinate_origin.x;\\n    float Y = position.y - project_coordinate_origin.y;\\n    return project_offset_(vec4(X + position64xyLow.x, Y + position64xyLow.y, position.z, position.w));\\n  }\\n\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSETS) {\\n    return project_offset_(position);\\n  }\\n\\n  // METER_OFFSETS or IDENTITY\\n  // Apply model matrix\\n  vec4 position_modelspace = project_uModelMatrix * position;\\n  return project_offset_(position_modelspace);\\n}\\n\\nvec4 project_position(vec4 position) {\\n  return project_position(position, ZERO_64_XY_LOW);\\n}\\n\\nvec3 project_position(vec3 position, vec2 position64xyLow) {\\n  vec4 projected_position = project_position(vec4(position, 1.0), position64xyLow);\\n  return projected_position.xyz;\\n}\\n\\nvec3 project_position(vec3 position) {\\n  vec4 projected_position = project_position(vec4(position, 1.0), ZERO_64_XY_LOW);\\n  return projected_position.xyz;\\n}\\n\\nvec2 project_position(vec2 position) {\\n  vec4 projected_position = project_position(vec4(position, 0.0, 1.0), ZERO_64_XY_LOW);\\n  return projected_position.xy;\\n}\\n\\n//\\n// Projects from \\\"world\\\" coordinates to clip space.\\n// Uses project_uViewProjectionMatrix\\n//\\nvec4 project_to_clipspace(vec4 position) {\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_METER_OFFSETS ||\\n    project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSETS) {\\n    // Needs to be divided with project_uPixelsPerMeter\\n    position.w *= project_uPixelsPerMeter.z;\\n  }\\n  return project_uViewProjectionMatrix * position + project_uCenter;\\n}\\n\\n// Returns a clip space offset that corresponds to a given number of **non-device** pixels\\nvec4 project_pixel_to_clipspace(vec2 pixels) {\\n  vec2 offset = pixels / project_uViewportSize * project_uDevicePixelRatio * 2.0;\\n  return vec4(offset * project_uFocalDistance, 0.0, 0.0);\\n}\\n\");\n\nexports.default = _default;\n},{\"./constants\":\"PzAR\"}],\"hXbg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.EVENTS = exports.COORDINATE_SYSTEM = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Note: The numeric values here are matched by shader code in the\n// \"project\" and \"project64\" shader modules. Both places need to be\n// updated.\n// TODO: Maybe \"POSITIONS\" would be a better name?\nvar COORDINATE_SYSTEM = {\n  // Positions are interpreted as [lng, lat, elevation]\n  // lng lat are degrees, elevation is meters. distances as meters.\n  LNGLAT: 1,\n  LNGLAT_EXPERIMENTAL: 1,\n  LNGLAT_DEPRECATED: 5,\n  // Positions are interpreted as meter offsets, distances as meters\n  METER_OFFSETS: 2,\n  // Planned to deprecate in later versions, in favor of METER_OFFSETS\n  METERS: 2,\n  // Positions are interpreted as lng lat offsets: [deltaLng, deltaLat, elevation]\n  // deltaLng, deltaLat are delta degrees, elevation is meters.\n  // distances as meters.\n  LNGLAT_OFFSETS: 3,\n  // Positions and distances are not transformed: [x, y, z] in unit coordinates\n  IDENTITY: 0\n};\nexports.COORDINATE_SYSTEM = COORDINATE_SYSTEM;\nvar EVENTS = {\n  panstart: {\n    handler: 'onDragStart'\n  },\n  panmove: {\n    handler: 'onDrag'\n  },\n  panend: {\n    handler: 'onDragEnd'\n  }\n};\nexports.EVENTS = EVENTS;\n},{}],\"GsX0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = memoize;\n\nfunction isEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n\n  if (Array.isArray(a)) {\n    // Special treatment for arrays: compare 1-level deep\n    // This is to support equality of matrix/coordinate props\n    var len = a.length;\n\n    if (!b || b.length !== len) {\n      return false;\n    }\n\n    for (var i = 0; i < len; i++) {\n      if (a[i] !== b[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  return false;\n}\n/**\n * Speed up consecutive function calls by caching the result of calls with identical input\n * https://en.wikipedia.org/wiki/Memoization\n * @param {function} compute - the function to be memoized\n */\n\n\nfunction memoize(compute) {\n  var cachedArgs = {};\n  var cachedResult;\n  return function (args) {\n    for (var key in args) {\n      if (!isEqual(args[key], cachedArgs[key])) {\n        cachedResult = compute(args);\n        cachedArgs = args;\n        break;\n      }\n    }\n\n    return cachedResult;\n  };\n}\n},{}],\"R2tg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = assert;\n\n// Replacement for the external assert method to reduce bundle size\n// Note: We don't use the second \"message\" argument in calling code,\n// so no need to support it here\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(message || 'deck.gl: assertion failed.');\n  }\n}\n},{}],\"aNiS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getUniformsFromViewport = getUniformsFromViewport;\nexports.LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD = void 0;\n\nvar mat4 = _interopRequireWildcard(require(\"gl-matrix/mat4\"));\n\nvar vec4 = _interopRequireWildcard(require(\"gl-matrix/vec4\"));\n\nvar _constants = require(\"../../lib/constants\");\n\nvar _memoize = _interopRequireDefault(require(\"../../utils/memoize\"));\n\nvar _log = _interopRequireDefault(require(\"../../utils/log\"));\n\nvar _assert = _interopRequireDefault(require(\"../../utils/assert\"));\n\nvar _constants2 = require(\"./constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// To quickly set a vector to zero\nvar ZERO_VECTOR = [0, 0, 0, 0]; // 4x4 matrix that drops 4th component of vector\n\nvar VECTOR_TO_POINT_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0];\nvar IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\nvar DEFAULT_PIXELS_PER_UNIT2 = [0, 0, 0];\nvar DEFAULT_COORDINATE_ORIGIN = [0, 0, 0]; // Based on viewport-mercator-project/test/fp32-limits.js\n\nvar LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD = 12;\nexports.LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD = LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD;\nvar getMemoizedViewportUniforms = (0, _memoize.default)(calculateViewportUniforms);\n\nfunction getShaderCoordinateSystem(coordinateSystem) {\n  switch (coordinateSystem) {\n    case _constants.COORDINATE_SYSTEM.LNGLAT:\n    case _constants.COORDINATE_SYSTEM.LNGLAT_EXPERIMENTAL:\n    default:\n      return _constants2.PROJECT_COORDINATE_SYSTEM.LNGLAT_AUTO_OFFSET;\n\n    case _constants.COORDINATE_SYSTEM.LNGLAT_DEPRECATED:\n      return _constants2.PROJECT_COORDINATE_SYSTEM.LNG_LAT;\n\n    case _constants.COORDINATE_SYSTEM.METER_OFFSETS:\n    case _constants.COORDINATE_SYSTEM.METERS:\n      return _constants2.PROJECT_COORDINATE_SYSTEM.METER_OFFSETS;\n\n    case _constants.COORDINATE_SYSTEM.LNGLAT_OFFSETS:\n      return _constants2.PROJECT_COORDINATE_SYSTEM.LNGLAT_OFFSETS;\n\n    case _constants.COORDINATE_SYSTEM.IDENTITY:\n      return _constants2.PROJECT_COORDINATE_SYSTEM.IDENTITY;\n  }\n} // The code that utilizes Matrix4 does the same calculation as their mat4 counterparts,\n// has lower performance but provides error checking.\n// Uncomment when debugging\n\n\nfunction calculateMatrixAndOffset(_ref) {\n  var viewport = _ref.viewport,\n      coordinateSystem = _ref.coordinateSystem,\n      coordinateOrigin = _ref.coordinateOrigin,\n      coordinateZoom = _ref.coordinateZoom;\n  var viewMatrixUncentered = viewport.viewMatrixUncentered;\n  var viewMatrix = viewport.viewMatrix;\n  var projectionMatrix = viewport.projectionMatrix;\n  var viewProjectionMatrix = viewport.viewProjectionMatrix;\n  var projectionCenter;\n  var shaderCoordinateSystem = getShaderCoordinateSystem(coordinateSystem);\n  var shaderCoordinateOrigin = coordinateOrigin;\n\n  if (shaderCoordinateSystem === _constants2.PROJECT_COORDINATE_SYSTEM.LNGLAT_AUTO_OFFSET) {\n    if (coordinateZoom < LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD) {\n      // Use LNG_LAT projection if not zooming\n      shaderCoordinateSystem = _constants2.PROJECT_COORDINATE_SYSTEM.LNG_LAT;\n    } else {\n      // Use LNGLAT_AUTO_OFFSET\n      var lng = Math.fround(viewport.longitude);\n      var lat = Math.fround(viewport.latitude);\n      shaderCoordinateOrigin = [lng, lat];\n    }\n  }\n\n  switch (shaderCoordinateSystem) {\n    case _constants2.PROJECT_COORDINATE_SYSTEM.IDENTITY:\n    case _constants2.PROJECT_COORDINATE_SYSTEM.LNG_LAT:\n      projectionCenter = ZERO_VECTOR;\n      break;\n    // TODO: make lighting work for meter offset mode\n\n    case _constants2.PROJECT_COORDINATE_SYSTEM.LNGLAT_OFFSETS:\n    case _constants2.PROJECT_COORDINATE_SYSTEM.METER_OFFSETS:\n    case _constants2.PROJECT_COORDINATE_SYSTEM.LNGLAT_AUTO_OFFSET:\n      // Calculate transformed projectionCenter (using 64 bit precision JS)\n      // This is the key to offset mode precision\n      // (avoids doing this addition in 32 bit precision in GLSL)\n      var positionPixels = viewport.projectFlat(shaderCoordinateOrigin, Math.pow(2, coordinateZoom)); // projectionCenter = new Matrix4(viewProjectionMatrix)\n      //   .transformVector([positionPixels[0], positionPixels[1], 0.0, 1.0]);\n\n      projectionCenter = vec4.transformMat4([], [positionPixels[0], positionPixels[1], 0.0, 1.0], viewProjectionMatrix); // Always apply uncentered projection matrix if available (shader adds center)\n\n      viewMatrix = viewMatrixUncentered || viewMatrix; // Zero out 4th coordinate (\"after\" model matrix) - avoids further translations\n      // viewMatrix = new Matrix4(viewMatrixUncentered || viewMatrix)\n      //   .multiplyRight(VECTOR_TO_POINT_MATRIX);\n\n      viewProjectionMatrix = mat4.multiply([], projectionMatrix, viewMatrix);\n      viewProjectionMatrix = mat4.multiply([], viewProjectionMatrix, VECTOR_TO_POINT_MATRIX);\n      break;\n\n    default:\n      throw new Error('Unknown projection mode');\n  }\n\n  return {\n    viewMatrix: viewMatrix,\n    viewProjectionMatrix: viewProjectionMatrix,\n    projectionCenter: projectionCenter,\n    cameraPos: viewport.cameraPosition,\n    shaderCoordinateSystem: shaderCoordinateSystem,\n    shaderCoordinateOrigin: shaderCoordinateOrigin\n  };\n}\n/**\n * Returns uniforms for shaders based on current projection\n * includes: projection matrix suitable for shaders\n *\n * TODO - Ensure this works with any viewport, not just WebMercatorViewports\n *\n * @param {WebMercatorViewport} viewport -\n * @return {Float32Array} - 4x4 projection matrix that can be used in shaders\n */\n\n\nfunction getUniformsFromViewport() {\n  var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      viewport = _ref2.viewport,\n      _ref2$devicePixelRati = _ref2.devicePixelRatio,\n      devicePixelRatio = _ref2$devicePixelRati === void 0 ? 1 : _ref2$devicePixelRati,\n      _ref2$modelMatrix = _ref2.modelMatrix,\n      modelMatrix = _ref2$modelMatrix === void 0 ? null : _ref2$modelMatrix,\n      _ref2$coordinateSyste = _ref2.coordinateSystem,\n      coordinateSystem = _ref2$coordinateSyste === void 0 ? _constants.COORDINATE_SYSTEM.LNGLAT : _ref2$coordinateSyste,\n      _ref2$coordinateOrigi = _ref2.coordinateOrigin,\n      coordinateOrigin = _ref2$coordinateOrigi === void 0 ? DEFAULT_COORDINATE_ORIGIN : _ref2$coordinateOrigi,\n      _ref2$wrapLongitude = _ref2.wrapLongitude,\n      wrapLongitude = _ref2$wrapLongitude === void 0 ? false : _ref2$wrapLongitude,\n      projectionMode = _ref2.projectionMode,\n      positionOrigin = _ref2.positionOrigin;\n\n  (0, _assert.default)(viewport);\n\n  if (projectionMode !== undefined) {\n    _log.default.removed('projectionMode', 'coordinateSystem')();\n  }\n\n  if (positionOrigin !== undefined) {\n    _log.default.removed('positionOrigin', 'coordinateOrigin')();\n  }\n\n  return Object.assign({\n    project_uModelMatrix: modelMatrix || IDENTITY_MATRIX\n  }, getMemoizedViewportUniforms({\n    viewport: viewport,\n    devicePixelRatio: devicePixelRatio,\n    coordinateSystem: coordinateSystem,\n    coordinateOrigin: coordinateOrigin,\n    wrapLongitude: wrapLongitude\n  }));\n}\n\nfunction calculateViewportUniforms(_ref3) {\n  var viewport = _ref3.viewport,\n      devicePixelRatio = _ref3.devicePixelRatio,\n      coordinateSystem = _ref3.coordinateSystem,\n      coordinateOrigin = _ref3.coordinateOrigin,\n      wrapLongitude = _ref3.wrapLongitude;\n  var coordinateZoom = viewport.zoom;\n\n  var _calculateMatrixAndOf = calculateMatrixAndOffset({\n    coordinateSystem: coordinateSystem,\n    coordinateOrigin: coordinateOrigin,\n    coordinateZoom: coordinateZoom,\n    viewport: viewport\n  }),\n      projectionCenter = _calculateMatrixAndOf.projectionCenter,\n      viewProjectionMatrix = _calculateMatrixAndOf.viewProjectionMatrix,\n      cameraPos = _calculateMatrixAndOf.cameraPos,\n      shaderCoordinateSystem = _calculateMatrixAndOf.shaderCoordinateSystem,\n      shaderCoordinateOrigin = _calculateMatrixAndOf.shaderCoordinateOrigin;\n\n  (0, _assert.default)(viewProjectionMatrix, 'Viewport missing modelViewProjectionMatrix'); // Calculate projection pixels per unit\n\n  var distanceScales = viewport.getDistanceScales();\n  var viewportSize = [viewport.width * devicePixelRatio, viewport.height * devicePixelRatio];\n  var uniforms = {\n    // Projection mode values\n    project_uCoordinateSystem: shaderCoordinateSystem,\n    project_uCenter: projectionCenter,\n    project_uWrapLongitude: wrapLongitude,\n    project_uAntimeridian: (viewport.longitude || 0) - 180,\n    // Screen size\n    project_uViewportSize: viewportSize,\n    project_uDevicePixelRatio: devicePixelRatio,\n    // Distance at which screen pixels are projected\n    project_uFocalDistance: viewport.focalDistance || 1,\n    project_uPixelsPerMeter: distanceScales.pixelsPerMeter,\n    project_uPixelsPerDegree: distanceScales.pixelsPerDegree,\n    project_uPixelsPerUnit: distanceScales.pixelsPerMeter,\n    project_uPixelsPerUnit2: DEFAULT_PIXELS_PER_UNIT2,\n    project_uScale: viewport.scale,\n    // This is the mercator scale (2 ** zoom)\n    project_uViewProjectionMatrix: viewProjectionMatrix,\n    // This is for lighting calculations\n    project_uCameraPosition: cameraPos\n  };\n  var distanceScalesAtOrigin = viewport.getDistanceScales(shaderCoordinateOrigin);\n\n  switch (shaderCoordinateSystem) {\n    case _constants2.PROJECT_COORDINATE_SYSTEM.METER_OFFSETS:\n      uniforms.project_uPixelsPerUnit = distanceScalesAtOrigin.pixelsPerMeter;\n      uniforms.project_uPixelsPerUnit2 = distanceScalesAtOrigin.pixelsPerMeter2;\n      break;\n\n    case _constants2.PROJECT_COORDINATE_SYSTEM.LNGLAT_AUTO_OFFSET:\n      uniforms.project_coordinate_origin = shaderCoordinateOrigin;\n    // eslint-disable-line no-fallthrough\n\n    case _constants2.PROJECT_COORDINATE_SYSTEM.LNGLAT_OFFSETS:\n      uniforms.project_uPixelsPerUnit = distanceScalesAtOrigin.pixelsPerDegree;\n      uniforms.project_uPixelsPerUnit2 = distanceScalesAtOrigin.pixelsPerDegree2;\n      break;\n\n    default:\n      break;\n  }\n\n  return uniforms;\n}\n},{\"gl-matrix/mat4\":\"WdlT\",\"gl-matrix/vec4\":\"QGfo\",\"../../lib/constants\":\"hXbg\",\"../../utils/memoize\":\"GsX0\",\"../../utils/log\":\"mqAj\",\"../../utils/assert\":\"R2tg\",\"./constants\":\"PzAR\"}],\"CzyJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _luma = require(\"luma.gl\");\n\nvar _project = _interopRequireDefault(require(\"./project.glsl\"));\n\nvar _viewportUniforms = require(\"./viewport-uniforms\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar INITIAL_MODULE_OPTIONS = {};\n\nfunction getUniforms() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_MODULE_OPTIONS;\n\n  if (opts.viewport) {\n    return (0, _viewportUniforms.getUniformsFromViewport)(opts);\n  }\n\n  return {};\n}\n\nvar _default = {\n  name: 'project',\n  dependencies: [_luma.fp32],\n  vs: _project.default,\n  getUniforms: getUniforms,\n  deprecations: [// Removed custom picking uinforms\n  // These don't really belong here but we need to check them for all shaders\n  // the project module is by default included for all\n  {\n    type: 'uniform vec3',\n    old: 'selectedPickingColor',\n    new: \"luma.gl's picking module\"\n  }, {\n    type: 'uniform float',\n    old: 'renderPickingBuffer',\n    new: \"luma.gl's picking module\"\n  }, {\n    type: 'uniform float',\n    old: 'pickingEnabled',\n    new: \"luma.gl's picking module\"\n  }, // Removed project uniforms\n  {\n    type: 'uniform float',\n    old: 'projectionMode',\n    new: 'project_uCoordinateSystem'\n  }, {\n    type: 'uniform vec4',\n    old: 'projectionCenter',\n    new: 'project_uCenter'\n  }, {\n    type: 'uniform vec2',\n    old: 'projectionOrigin'\n  }, {\n    type: 'uniform mat4',\n    old: 'modelMatrix',\n    new: 'project_uModelMatrix'\n  }, {\n    type: 'uniform mat4',\n    old: 'viewMatrix'\n  }, {\n    type: 'uniform mat4',\n    old: 'projectionMatrix',\n    new: 'project_uViewProjectionMatrix'\n  }, {\n    type: 'uniform vec3',\n    old: 'projectionPixelsPerUnit',\n    new: 'project_uPixelsPerUnit'\n  }, {\n    type: 'uniform float',\n    old: 'projectionScale',\n    new: 'project_uScale'\n  }, {\n    type: 'uniform vec2',\n    old: 'viewportSize',\n    new: 'project_uViewportSize'\n  }, {\n    type: 'uniform float',\n    old: 'devicePixelRatio',\n    new: 'project_uDevicePixelRatio'\n  }, {\n    type: 'uniform vec3',\n    old: 'cameraPos',\n    new: 'project_uCameraPosition'\n  }, // Removed project functions\n  {\n    type: 'function',\n    old: 'scale',\n    new: 'project_scale'\n  }, {\n    type: 'function',\n    old: 'preproject',\n    new: 'project_position'\n  }, {\n    type: 'function',\n    old: 'project',\n    new: 'project_to_clipspace'\n  }]\n};\nexports.default = _default;\n},{\"luma.gl\":\"iiNl\",\"./project.glsl\":\"g9uc\",\"./viewport-uniforms\":\"aNiS\"}],\"LHSP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _project = _interopRequireDefault(require(\"../project/project\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar vs = \"\\nvec4 project_position_to_clipspace(\\n  vec3 position, vec2 position64xyLow, vec3 offset, out vec4 worldPosition\\n) {\\n  vec3 projectedPosition = project_position(position, position64xyLow);\\n  worldPosition = vec4(projectedPosition + offset, 1.0);\\n  return project_to_clipspace(worldPosition);\\n}\\n\\nvec4 project_position_to_clipspace(\\n  vec3 position, vec2 position64xyLow, vec3 offset\\n) {\\n  vec4 worldPosition;\\n  return project_position_to_clipspace(position, position64xyLow, offset, worldPosition);\\n}\\n\";\nvar _default = {\n  name: 'project32',\n  dependencies: [_project.default],\n  vs: vs\n};\nexports.default = _default;\n},{\"../project/project\":\"CzyJ\"}],\"csgA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"\\nconst vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);\\n\\nuniform vec2 project64_uScale;\\nuniform vec2 project_uViewProjectionMatrixFP64[16];\\n\\n// longitude: lnglat_fp64.xy; latitude: lnglat_fp64.zw\\nvoid mercatorProject_fp64(vec4 lnglat_fp64, out vec2 out_val[2]) {\\n\\n#if defined(NVIDIA_FP64_WORKAROUND)\\n  out_val[0] = sum_fp64(radians_fp64(lnglat_fp64.xy), PI_FP64 * ONE);\\n#else\\n  out_val[0] = sum_fp64(radians_fp64(lnglat_fp64.xy), PI_FP64);\\n#endif\\n  out_val[1] = sub_fp64(PI_FP64,\\n    log_fp64(tan_fp64(sum_fp64(PI_4_FP64, radians_fp64(lnglat_fp64.zw) / 2.0))));\\n  return;\\n}\\n\\nvoid project_position_fp64(vec4 position_fp64, out vec2 out_val[2]) {\\n  vec2 pos_fp64[2];\\n  mercatorProject_fp64(position_fp64, pos_fp64);\\n  vec2 x_fp64 = mul_fp64(pos_fp64[0], project64_uScale);\\n  vec2 y_fp64 = mul_fp64(pos_fp64[1], project64_uScale);\\n  out_val[0] = mul_fp64(x_fp64, WORLD_SCALE_FP64);\\n  out_val[1] = mul_fp64(y_fp64, WORLD_SCALE_FP64);\\n\\n  return;\\n}\\n\\nvoid project_position_fp64(vec2 position, vec2 position64xyLow, out vec2 out_val[2]) {\\n  vec4 position64xy = vec4(\\n    position.x, position64xyLow.x,\\n    position.y, position64xyLow.y);\\n\\n  project_position_fp64(position64xy, out_val);\\n}\\n\\nvec4 project_to_clipspace_fp64(vec2 vertex_pos_modelspace[4]) {\\n  vec2 vertex_pos_clipspace[4];\\n  mat4_vec4_mul_fp64(project_uViewProjectionMatrixFP64, vertex_pos_modelspace,\\n    vertex_pos_clipspace);\\n  return vec4(\\n    vertex_pos_clipspace[0].x,\\n    vertex_pos_clipspace[1].x,\\n    vertex_pos_clipspace[2].x,\\n    vertex_pos_clipspace[3].x\\n    );\\n}\\n\\nvec4 project_position_to_clipspace(\\n  vec3 position, vec2 position64xyLow, vec3 offset, out vec4 worldPosition\\n) {\\n  // This is the local offset to the instance position\\n  vec2 offset64[4];\\n  vec4_fp64(vec4(offset, 0.0), offset64);\\n\\n  float z = project_scale(position.z);\\n\\n  // Apply web mercator projection (depends on coordinate system imn use)\\n  vec2 projectedPosition64xy[2];\\n  project_position_fp64(position.xy, position64xyLow, projectedPosition64xy);\\n\\n  vec2 worldPosition64[4];\\n  worldPosition64[0] = sum_fp64(offset64[0], projectedPosition64xy[0]);\\n  worldPosition64[1] = sum_fp64(offset64[1], projectedPosition64xy[1]);\\n  worldPosition64[2] = sum_fp64(offset64[2], vec2(z, 0.0));\\n  worldPosition64[3] = vec2(1.0, 0.0);\\n\\n  worldPosition = vec4(projectedPosition64xy[0].x, projectedPosition64xy[1].x, z, 1.0);\\n\\n  return project_to_clipspace_fp64(worldPosition64);\\n}\\n\\nvec4 project_position_to_clipspace(\\n  vec3 position, vec2 position64xyLow, vec3 offset\\n) {\\n  vec4 worldPosition;\\n  return project_position_to_clipspace(\\n    position, position64xyLow, offset, worldPosition\\n  );\\n}\\n\";\nexports.default = _default;\n},{}],\"kXBR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _luma = require(\"luma.gl\");\n\nvar _project = _interopRequireDefault(require(\"../project/project\"));\n\nvar _memoize = _interopRequireDefault(require(\"../../utils/memoize\"));\n\nvar _project2 = _interopRequireDefault(require(\"./project64.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar fp64ify = _luma.fp64.fp64ify,\n    fp64ifyMatrix4 = _luma.fp64.fp64ifyMatrix4;\nvar _default = {\n  name: 'project64',\n  dependencies: [_project.default, _luma.fp64],\n  vs: _project2.default,\n  getUniforms: getUniforms,\n  deprecations: [{\n    type: 'uniform vec2',\n    old: 'projectionFP64[16]',\n    new: 'project_uViewProjectionMatrixFP64'\n  }, {\n    type: 'uniform vec2',\n    old: 'projectionScaleFP64',\n    new: 'project64_uScale'\n  }]\n}; // TODO - this module should calculate the 64 bit uniforms\n// It is currently done by project to minimize duplicated work\n\nexports.default = _default;\nvar DEFAULT_MODULE_OPTIONS = {};\nvar getMemoizedUniforms = (0, _memoize.default)(calculateUniforms);\n\nfunction getUniforms() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n  var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; // These two uniforms are generated by the fp32 project module\n\n  var project_uViewProjectionMatrix = context.project_uViewProjectionMatrix,\n      project_uScale = context.project_uScale;\n\n  if (project_uViewProjectionMatrix && project_uScale) {\n    // We only need to update fp64 uniforms if fp32 projection is being updated\n    return getMemoizedUniforms({\n      project_uViewProjectionMatrix: project_uViewProjectionMatrix,\n      project_uScale: project_uScale\n    });\n  }\n\n  return {};\n}\n\nfunction calculateUniforms(_ref) {\n  var project_uViewProjectionMatrix = _ref.project_uViewProjectionMatrix,\n      project_uScale = _ref.project_uScale;\n  var glViewProjectionMatrixFP64 = fp64ifyMatrix4(project_uViewProjectionMatrix);\n  var scaleFP64 = fp64ify(project_uScale);\n  return {\n    project_uViewProjectionMatrixFP64: glViewProjectionMatrixFP64,\n    project64_uViewProjectionMatrix: glViewProjectionMatrixFP64,\n    project64_uScale: scaleFP64\n  };\n}\n},{\"luma.gl\":\"iiNl\",\"../project/project\":\"CzyJ\",\"../../utils/memoize\":\"GsX0\",\"./project64.glsl\":\"csgA\"}],\"jEBv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// lighting\nvar _default = \"#define MAX_NUM_OF_LIGHTS 5\\n\\n// TODO these should be using lighting_ prefix\\nuniform vec3 lighting_lightPositions[MAX_NUM_OF_LIGHTS];\\nuniform vec2 lighting_lightStrengths[MAX_NUM_OF_LIGHTS];\\nuniform float lighting_ambientRatio;\\nuniform float lighting_diffuseRatio;\\nuniform float lighting_specularRatio;\\nuniform int lighting_numberOfLights;\\n\\nfloat lighting_getLightWeight(vec3 position_worldspace_vec3, vec3 normals_worldspace) {\\n  float lightWeight = 0.0;\\n\\n  vec3 normals_worldspace_vec3 = normals_worldspace.xyz;\\n\\n  vec3 camera_pos_worldspace = project_uCameraPosition;\\n  vec3 view_direction = normalize(camera_pos_worldspace - position_worldspace_vec3);\\n\\n  for (int i = 0; i < MAX_NUM_OF_LIGHTS; i++) {\\n    if (i >= lighting_numberOfLights) {\\n      break;\\n    }\\n    vec3 light_position_worldspace = lighting_lightPositions[i];\\n    vec3 light_direction = normalize(light_position_worldspace - position_worldspace_vec3);\\n\\n    vec3 halfway_direction = normalize(light_direction + view_direction);\\n    float lambertian = dot(light_direction, normals_worldspace_vec3);\\n    float specular = 0.0;\\n    if (lambertian > 0.0) {\\n      float specular_angle = max(dot(normals_worldspace_vec3, halfway_direction), 0.0);\\n      specular = pow(specular_angle, 32.0);\\n    }\\n    lambertian = max(lambertian, 0.0);\\n    lightWeight += (lighting_ambientRatio + lambertian * lighting_diffuseRatio + specular * lighting_specularRatio) *\\n      lighting_lightStrengths[i].x;\\n  }\\n\\n  return lightWeight;\\n}\\n\\n// DEPRECATED - Backwards compatibility\\n\\nfloat getLightWeight(vec3 position_worldspace_vec3, vec3 normals_worldspace) {\\n  return lighting_getLightWeight(position_worldspace_vec3, normals_worldspace);\\n}\\n\";\nexports.default = _default;\n},{}],\"A2l4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createMat4 = createMat4;\nexports.transformVector = transformVector;\nexports.mod = mod;\nexports.lerp = lerp;\n\nvar vec4 = _interopRequireWildcard(require(\"gl-matrix/vec4\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction createMat4() {\n  return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\nfunction transformVector(matrix, vector) {\n  var result = vec4.transformMat4([], vector, matrix);\n  vec4.scale(result, result, 1 / result[3]);\n  return result;\n}\n\nfunction mod(value, divisor) {\n  var modulus = value % divisor;\n  return modulus < 0 ? divisor + modulus : modulus;\n}\n\nfunction lerp(start, end, step) {\n  return step * end + (1 - step) * start;\n}\n},{\"gl-matrix/vec4\":\"QGfo\"}],\"YhXv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = assert;\n\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(message || 'viewport-mercator-project: assertion failed.');\n  }\n}\n},{}],\"L5RO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.zoomToScale = zoomToScale;\nexports.scaleToZoom = scaleToZoom;\nexports.lngLatToWorld = lngLatToWorld;\nexports.worldToLngLat = worldToLngLat;\nexports.getMeterZoom = getMeterZoom;\nexports.getDistanceScales = getDistanceScales;\nexports.addMetersToLngLat = addMetersToLngLat;\nexports.getViewMatrix = getViewMatrix;\nexports.getProjectionParameters = getProjectionParameters;\nexports.getProjectionMatrix = getProjectionMatrix;\nexports.worldToPixels = worldToPixels;\nexports.pixelsToWorld = pixelsToWorld;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _mathUtils = require(\"./math-utils\");\n\nvar mat4 = _interopRequireWildcard(require(\"gl-matrix/mat4\"));\n\nvar vec2 = _interopRequireWildcard(require(\"gl-matrix/vec2\"));\n\nvar vec3 = _interopRequireWildcard(require(\"gl-matrix/vec3\"));\n\nvar _assert = _interopRequireDefault(require(\"./assert\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar PI = Math.PI;\nvar PI_4 = PI / 4;\nvar DEGREES_TO_RADIANS = PI / 180;\nvar RADIANS_TO_DEGREES = 180 / PI;\nvar TILE_SIZE = 512;\nvar EARTH_CIRCUMFERENCE = 40.03e6;\nvar DEFAULT_ALTITUDE = 1.5;\n\nfunction zoomToScale(zoom) {\n  return Math.pow(2, zoom);\n}\n\nfunction scaleToZoom(scale) {\n  return Math.log2(scale);\n}\n\nfunction lngLatToWorld(_ref, scale) {\n  var _ref2 = (0, _slicedToArray2.default)(_ref, 2),\n      lng = _ref2[0],\n      lat = _ref2[1];\n\n  (0, _assert.default)(Number.isFinite(lng) && Number.isFinite(scale));\n  (0, _assert.default)(Number.isFinite(lat) && lat >= -90 && lat <= 90, 'invalid latitude');\n  scale *= TILE_SIZE;\n  var lambda2 = lng * DEGREES_TO_RADIANS;\n  var phi2 = lat * DEGREES_TO_RADIANS;\n  var x = scale * (lambda2 + PI) / (2 * PI);\n  var y = scale * (PI - Math.log(Math.tan(PI_4 + phi2 * 0.5))) / (2 * PI);\n  return [x, y];\n}\n\nfunction worldToLngLat(_ref3, scale) {\n  var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),\n      x = _ref4[0],\n      y = _ref4[1];\n\n  scale *= TILE_SIZE;\n  var lambda2 = x / scale * (2 * PI) - PI;\n  var phi2 = 2 * (Math.atan(Math.exp(PI - y / scale * (2 * PI))) - PI_4);\n  return [lambda2 * RADIANS_TO_DEGREES, phi2 * RADIANS_TO_DEGREES];\n}\n\nfunction getMeterZoom(_ref5) {\n  var latitude = _ref5.latitude;\n  (0, _assert.default)(Number.isFinite(latitude));\n  var latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n  return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\n\nfunction getDistanceScales(_ref6) {\n  var latitude = _ref6.latitude,\n      longitude = _ref6.longitude,\n      zoom = _ref6.zoom,\n      scale = _ref6.scale,\n      _ref6$highPrecision = _ref6.highPrecision,\n      highPrecision = _ref6$highPrecision === void 0 ? false : _ref6$highPrecision;\n  scale = scale !== undefined ? scale : zoomToScale(zoom);\n  (0, _assert.default)(Number.isFinite(latitude) && Number.isFinite(longitude) && Number.isFinite(scale));\n  var result = {};\n  var worldSize = TILE_SIZE * scale;\n  var latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n  var pixelsPerDegreeX = worldSize / 360;\n  var pixelsPerDegreeY = pixelsPerDegreeX / latCosine;\n  var altPixelsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n  result.pixelsPerMeter = [altPixelsPerMeter, -altPixelsPerMeter, altPixelsPerMeter];\n  result.metersPerPixel = [1 / altPixelsPerMeter, -1 / altPixelsPerMeter, 1 / altPixelsPerMeter];\n  result.pixelsPerDegree = [pixelsPerDegreeX, -pixelsPerDegreeY, altPixelsPerMeter];\n  result.degreesPerPixel = [1 / pixelsPerDegreeX, -1 / pixelsPerDegreeY, 1 / altPixelsPerMeter];\n\n  if (highPrecision) {\n    var latCosine2 = DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS) / latCosine;\n    var pixelsPerDegreeY2 = pixelsPerDegreeX * latCosine2 / 2;\n    var altPixelsPerDegree2 = worldSize / EARTH_CIRCUMFERENCE * latCosine2;\n    var altPixelsPerMeter2 = altPixelsPerDegree2 / pixelsPerDegreeY * altPixelsPerMeter;\n    result.pixelsPerDegree2 = [0, -pixelsPerDegreeY2, altPixelsPerDegree2];\n    result.pixelsPerMeter2 = [altPixelsPerMeter2, 0, altPixelsPerMeter2];\n  }\n\n  return result;\n}\n\nfunction addMetersToLngLat(lngLatZ, xyz) {\n  var _lngLatZ = (0, _slicedToArray2.default)(lngLatZ, 3),\n      longitude = _lngLatZ[0],\n      latitude = _lngLatZ[1],\n      z0 = _lngLatZ[2];\n\n  var _xyz = (0, _slicedToArray2.default)(xyz, 3),\n      x = _xyz[0],\n      y = _xyz[1],\n      z = _xyz[2];\n\n  var scale = 1;\n\n  var _getDistanceScales = getDistanceScales({\n    longitude: longitude,\n    latitude: latitude,\n    scale: scale,\n    highPrecision: true\n  }),\n      pixelsPerMeter = _getDistanceScales.pixelsPerMeter,\n      pixelsPerMeter2 = _getDistanceScales.pixelsPerMeter2;\n\n  var worldspace = lngLatToWorld(lngLatZ, scale);\n  worldspace[0] += x * (pixelsPerMeter[0] + pixelsPerMeter2[0] * y);\n  worldspace[1] += y * (pixelsPerMeter[1] + pixelsPerMeter2[1] * y);\n  var newLngLat = worldToLngLat(worldspace, scale);\n  var newZ = (z0 || 0) + (z || 0);\n  return Number.isFinite(z0) || Number.isFinite(z) ? [newLngLat[0], newLngLat[1], newZ] : newLngLat;\n}\n\nfunction getViewMatrix(_ref7) {\n  var height = _ref7.height,\n      pitch = _ref7.pitch,\n      bearing = _ref7.bearing,\n      altitude = _ref7.altitude,\n      _ref7$center = _ref7.center,\n      center = _ref7$center === void 0 ? null : _ref7$center,\n      _ref7$flipY = _ref7.flipY,\n      flipY = _ref7$flipY === void 0 ? false : _ref7$flipY;\n  var vm = (0, _mathUtils.createMat4)();\n  mat4.translate(vm, vm, [0, 0, -altitude]);\n  mat4.scale(vm, vm, [1, 1, 1 / height]);\n  mat4.rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n  mat4.rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n\n  if (flipY) {\n    mat4.scale(vm, vm, [1, -1, 1]);\n  }\n\n  if (center) {\n    mat4.translate(vm, vm, vec3.negate([], center));\n  }\n\n  return vm;\n}\n\nfunction getProjectionParameters(_ref8) {\n  var width = _ref8.width,\n      height = _ref8.height,\n      _ref8$altitude = _ref8.altitude,\n      altitude = _ref8$altitude === void 0 ? DEFAULT_ALTITUDE : _ref8$altitude,\n      _ref8$pitch = _ref8.pitch,\n      pitch = _ref8$pitch === void 0 ? 0 : _ref8$pitch,\n      _ref8$nearZMultiplier = _ref8.nearZMultiplier,\n      nearZMultiplier = _ref8$nearZMultiplier === void 0 ? 1 : _ref8$nearZMultiplier,\n      _ref8$farZMultiplier = _ref8.farZMultiplier,\n      farZMultiplier = _ref8$farZMultiplier === void 0 ? 1 : _ref8$farZMultiplier;\n  var pitchRadians = pitch * DEGREES_TO_RADIANS;\n  var halfFov = Math.atan(0.5 / altitude);\n  var topHalfSurfaceDistance = Math.sin(halfFov) * altitude / Math.sin(Math.PI / 2 - pitchRadians - halfFov);\n  var farZ = Math.cos(Math.PI / 2 - pitchRadians) * topHalfSurfaceDistance + altitude;\n  return {\n    fov: 2 * Math.atan(height / 2 / altitude),\n    aspect: width / height,\n    focalDistance: altitude,\n    near: nearZMultiplier,\n    far: farZ * farZMultiplier\n  };\n}\n\nfunction getProjectionMatrix(_ref9) {\n  var width = _ref9.width,\n      height = _ref9.height,\n      pitch = _ref9.pitch,\n      altitude = _ref9.altitude,\n      nearZMultiplier = _ref9.nearZMultiplier,\n      farZMultiplier = _ref9.farZMultiplier;\n\n  var _getProjectionParamet = getProjectionParameters({\n    width: width,\n    height: height,\n    altitude: altitude,\n    pitch: pitch,\n    nearZMultiplier: nearZMultiplier,\n    farZMultiplier: farZMultiplier\n  }),\n      fov = _getProjectionParamet.fov,\n      aspect = _getProjectionParamet.aspect,\n      near = _getProjectionParamet.near,\n      far = _getProjectionParamet.far;\n\n  var projectionMatrix = mat4.perspective([], fov, aspect, near, far);\n  return projectionMatrix;\n}\n\nfunction worldToPixels(xyz, pixelProjectionMatrix) {\n  var _xyz2 = (0, _slicedToArray2.default)(xyz, 3),\n      x = _xyz2[0],\n      y = _xyz2[1],\n      _xyz2$ = _xyz2[2],\n      z = _xyz2$ === void 0 ? 0 : _xyz2$;\n\n  (0, _assert.default)(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n  return (0, _mathUtils.transformVector)(pixelProjectionMatrix, [x, y, z, 1]);\n}\n\nfunction pixelsToWorld(xyz, pixelUnprojectionMatrix) {\n  var targetZ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n  var _xyz3 = (0, _slicedToArray2.default)(xyz, 3),\n      x = _xyz3[0],\n      y = _xyz3[1],\n      z = _xyz3[2];\n\n  (0, _assert.default)(Number.isFinite(x) && Number.isFinite(y), 'invalid pixel coordinate');\n\n  if (Number.isFinite(z)) {\n    var coord = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [x, y, z, 1]);\n    return coord;\n  }\n\n  var coord0 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [x, y, 0, 1]);\n  var coord1 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [x, y, 1, 1]);\n  var z0 = coord0[2];\n  var z1 = coord1[2];\n  var t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n  return vec2.lerp([], coord0, coord1, t);\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"./math-utils\":\"A2l4\",\"gl-matrix/mat4\":\"WdlT\",\"gl-matrix/vec2\":\"cHtt\",\"gl-matrix/vec3\":\"Ijz7\",\"./assert\":\"YhXv\"}],\"jWSc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _mathUtils = require(\"./math-utils\");\n\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\n\nvar mat4 = _interopRequireWildcard(require(\"gl-matrix/mat4\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar IDENTITY = (0, _mathUtils.createMat4)();\n\nvar Viewport = function () {\n  function Viewport() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        width = _ref.width,\n        height = _ref.height,\n        _ref$viewMatrix = _ref.viewMatrix,\n        viewMatrix = _ref$viewMatrix === void 0 ? IDENTITY : _ref$viewMatrix,\n        _ref$projectionMatrix = _ref.projectionMatrix,\n        projectionMatrix = _ref$projectionMatrix === void 0 ? IDENTITY : _ref$projectionMatrix;\n\n    (0, _classCallCheck2.default)(this, Viewport);\n    this.width = width || 1;\n    this.height = height || 1;\n    this.scale = 1;\n    this.pixelsPerMeter = 1;\n    this.viewMatrix = viewMatrix;\n    this.projectionMatrix = projectionMatrix;\n    var vpm = (0, _mathUtils.createMat4)();\n    mat4.multiply(vpm, vpm, this.projectionMatrix);\n    mat4.multiply(vpm, vpm, this.viewMatrix);\n    this.viewProjectionMatrix = vpm;\n    var m = (0, _mathUtils.createMat4)();\n    mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]);\n    mat4.translate(m, m, [1, -1, 0]);\n    mat4.multiply(m, m, this.viewProjectionMatrix);\n    var mInverse = mat4.invert((0, _mathUtils.createMat4)(), m);\n\n    if (!mInverse) {\n      throw new Error('Pixel project matrix not invertible');\n    }\n\n    this.pixelProjectionMatrix = m;\n    this.pixelUnprojectionMatrix = mInverse;\n    this.equals = this.equals.bind(this);\n    this.project = this.project.bind(this);\n    this.unproject = this.unproject.bind(this);\n    this.projectPosition = this.projectPosition.bind(this);\n    this.unprojectPosition = this.unprojectPosition.bind(this);\n    this.projectFlat = this.projectFlat.bind(this);\n    this.unprojectFlat = this.unprojectFlat.bind(this);\n  }\n\n  (0, _createClass2.default)(Viewport, [{\n    key: \"equals\",\n    value: function equals(viewport) {\n      if (!(viewport instanceof Viewport)) {\n        return false;\n      }\n\n      return viewport.width === this.width && viewport.height === this.height && mat4.equals(viewport.projectionMatrix, this.projectionMatrix) && mat4.equals(viewport.viewMatrix, this.viewMatrix);\n    }\n  }, {\n    key: \"project\",\n    value: function project(xyz) {\n      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref2$topLeft = _ref2.topLeft,\n          topLeft = _ref2$topLeft === void 0 ? true : _ref2$topLeft;\n\n      var worldPosition = this.projectPosition(xyz);\n      var coord = (0, _webMercatorUtils.worldToPixels)(worldPosition, this.pixelProjectionMatrix);\n\n      var _coord = (0, _slicedToArray2.default)(coord, 2),\n          x = _coord[0],\n          y = _coord[1];\n\n      var y2 = topLeft ? y : this.height - y;\n      return xyz.length === 2 ? [x, y2] : [x, y2, coord[2]];\n    }\n  }, {\n    key: \"unproject\",\n    value: function unproject(xyz) {\n      var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref3$topLeft = _ref3.topLeft,\n          topLeft = _ref3$topLeft === void 0 ? true : _ref3$topLeft,\n          targetZ = _ref3.targetZ;\n\n      var _xyz = (0, _slicedToArray2.default)(xyz, 3),\n          x = _xyz[0],\n          y = _xyz[1],\n          z = _xyz[2];\n\n      var y2 = topLeft ? y : this.height - y;\n      var targetZWorld = targetZ && targetZ * this.pixelsPerMeter;\n      var coord = (0, _webMercatorUtils.pixelsToWorld)([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n\n      var _this$unprojectPositi = this.unprojectPosition(coord),\n          _this$unprojectPositi2 = (0, _slicedToArray2.default)(_this$unprojectPositi, 3),\n          X = _this$unprojectPositi2[0],\n          Y = _this$unprojectPositi2[1],\n          Z = _this$unprojectPositi2[2];\n\n      if (Number.isFinite(z)) {\n        return [X, Y, Z];\n      }\n\n      return Number.isFinite(targetZ) ? [X, Y, targetZ] : [X, Y];\n    }\n  }, {\n    key: \"projectPosition\",\n    value: function projectPosition(xyz) {\n      var _this$projectFlat = this.projectFlat(xyz),\n          _this$projectFlat2 = (0, _slicedToArray2.default)(_this$projectFlat, 2),\n          X = _this$projectFlat2[0],\n          Y = _this$projectFlat2[1];\n\n      var Z = (xyz[2] || 0) * this.pixelsPerMeter;\n      return [X, Y, Z];\n    }\n  }, {\n    key: \"unprojectPosition\",\n    value: function unprojectPosition(xyz) {\n      var _this$unprojectFlat = this.unprojectFlat(xyz),\n          _this$unprojectFlat2 = (0, _slicedToArray2.default)(_this$unprojectFlat, 2),\n          X = _this$unprojectFlat2[0],\n          Y = _this$unprojectFlat2[1];\n\n      var Z = (xyz[2] || 0) / this.pixelsPerMeter;\n      return [X, Y, Z];\n    }\n  }, {\n    key: \"projectFlat\",\n    value: function projectFlat(xyz) {\n      var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.scale;\n      return xyz;\n    }\n  }, {\n    key: \"unprojectFlat\",\n    value: function unprojectFlat(xyz) {\n      var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.scale;\n      return xyz;\n    }\n  }]);\n  return Viewport;\n}();\n\nexports.default = Viewport;\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./math-utils\":\"A2l4\",\"./web-mercator-utils\":\"L5RO\",\"gl-matrix/mat4\":\"WdlT\"}],\"Zc28\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = fitBounds;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _webMercatorViewport = _interopRequireDefault(require(\"./web-mercator-viewport\"));\n\nvar _assert = _interopRequireDefault(require(\"./assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction fitBounds(_ref) {\n  var width = _ref.width,\n      height = _ref.height,\n      bounds = _ref.bounds,\n      _ref$minExtent = _ref.minExtent,\n      minExtent = _ref$minExtent === void 0 ? 0 : _ref$minExtent,\n      _ref$maxZoom = _ref.maxZoom,\n      maxZoom = _ref$maxZoom === void 0 ? 24 : _ref$maxZoom,\n      _ref$padding = _ref.padding,\n      padding = _ref$padding === void 0 ? 0 : _ref$padding,\n      _ref$offset = _ref.offset,\n      offset = _ref$offset === void 0 ? [0, 0] : _ref$offset;\n\n  var _bounds = (0, _slicedToArray2.default)(bounds, 2),\n      _bounds$ = (0, _slicedToArray2.default)(_bounds[0], 2),\n      west = _bounds$[0],\n      south = _bounds$[1],\n      _bounds$2 = (0, _slicedToArray2.default)(_bounds[1], 2),\n      east = _bounds$2[0],\n      north = _bounds$2[1];\n\n  if (Number.isFinite(padding)) {\n    var p = padding;\n    padding = {\n      top: p,\n      bottom: p,\n      left: p,\n      right: p\n    };\n  } else {\n    (0, _assert.default)(Number.isFinite(padding.top) && Number.isFinite(padding.bottom) && Number.isFinite(padding.left) && Number.isFinite(padding.right));\n  }\n\n  var viewport = new _webMercatorViewport.default({\n    width: width,\n    height: height,\n    longitude: 0,\n    latitude: 0,\n    zoom: 0\n  });\n  var nw = viewport.project([west, north]);\n  var se = viewport.project([east, south]);\n  var size = [Math.max(Math.abs(se[0] - nw[0]), minExtent), Math.max(Math.abs(se[1] - nw[1]), minExtent)];\n  var targetSize = [width - padding.left - padding.right - Math.abs(offset[0]) * 2, height - padding.top - padding.bottom - Math.abs(offset[1]) * 2];\n  (0, _assert.default)(targetSize[0] > 0 && targetSize[1] > 0);\n  var scaleX = targetSize[0] / size[0];\n  var scaleY = targetSize[1] / size[1];\n  var offsetX = (padding.right - padding.left) / 2 / scaleX;\n  var offsetY = (padding.bottom - padding.top) / 2 / scaleY;\n  var center = [(se[0] + nw[0]) / 2 + offsetX, (se[1] + nw[1]) / 2 + offsetY];\n  var centerLngLat = viewport.unproject(center);\n  var zoom = viewport.zoom + Math.log2(Math.abs(Math.min(scaleX, scaleY)));\n  return {\n    longitude: centerLngLat[0],\n    latitude: centerLngLat[1],\n    zoom: Math.min(zoom, maxZoom)\n  };\n}\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"./web-mercator-viewport\":\"q1mr\",\"./assert\":\"YhXv\"}],\"q1mr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _possibleConstructorReturn2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\"));\n\nvar _getPrototypeOf2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/getPrototypeOf\"));\n\nvar _inherits2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/inherits\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/assertThisInitialized\"));\n\nvar _viewport = _interopRequireDefault(require(\"./viewport\"));\n\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\n\nvar _fitBounds3 = _interopRequireDefault(require(\"./fit-bounds\"));\n\nvar vec2 = _interopRequireWildcard(require(\"gl-matrix/vec2\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WebMercatorViewport = function (_Viewport) {\n  (0, _inherits2.default)(WebMercatorViewport, _Viewport);\n\n  function WebMercatorViewport() {\n    var _this;\n\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        width = _ref.width,\n        height = _ref.height,\n        _ref$latitude = _ref.latitude,\n        latitude = _ref$latitude === void 0 ? 0 : _ref$latitude,\n        _ref$longitude = _ref.longitude,\n        longitude = _ref$longitude === void 0 ? 0 : _ref$longitude,\n        _ref$zoom = _ref.zoom,\n        zoom = _ref$zoom === void 0 ? 0 : _ref$zoom,\n        _ref$pitch = _ref.pitch,\n        pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n        _ref$bearing = _ref.bearing,\n        bearing = _ref$bearing === void 0 ? 0 : _ref$bearing,\n        _ref$altitude = _ref.altitude,\n        altitude = _ref$altitude === void 0 ? 1.5 : _ref$altitude,\n        nearZMultiplier = _ref.nearZMultiplier,\n        farZMultiplier = _ref.farZMultiplier;\n\n    (0, _classCallCheck2.default)(this, WebMercatorViewport);\n    width = width || 1;\n    height = height || 1;\n    var scale = (0, _webMercatorUtils.zoomToScale)(zoom);\n    altitude = Math.max(0.75, altitude);\n    var center = (0, _webMercatorUtils.lngLatToWorld)([longitude, latitude], scale);\n    center[2] = 0;\n    var projectionMatrix = (0, _webMercatorUtils.getProjectionMatrix)({\n      width: width,\n      height: height,\n      pitch: pitch,\n      bearing: bearing,\n      altitude: altitude,\n      nearZMultiplier: nearZMultiplier || 1 / height,\n      farZMultiplier: farZMultiplier || 1.01\n    });\n    var viewMatrix = (0, _webMercatorUtils.getViewMatrix)({\n      height: height,\n      center: center,\n      pitch: pitch,\n      bearing: bearing,\n      altitude: altitude,\n      flipY: true\n    });\n    _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(WebMercatorViewport).call(this, {\n      width: width,\n      height: height,\n      viewMatrix: viewMatrix,\n      projectionMatrix: projectionMatrix\n    }));\n    _this.latitude = latitude;\n    _this.longitude = longitude;\n    _this.zoom = zoom;\n    _this.pitch = pitch;\n    _this.bearing = bearing;\n    _this.altitude = altitude;\n    _this.scale = scale;\n    _this.center = center;\n    _this.pixelsPerMeter = (0, _webMercatorUtils.getDistanceScales)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))).pixelsPerMeter[2];\n    Object.freeze((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));\n    return _this;\n  }\n\n  (0, _createClass2.default)(WebMercatorViewport, [{\n    key: \"projectFlat\",\n    value: function projectFlat(lngLat) {\n      var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.scale;\n      return (0, _webMercatorUtils.lngLatToWorld)(lngLat, scale);\n    }\n  }, {\n    key: \"unprojectFlat\",\n    value: function unprojectFlat(xy) {\n      var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.scale;\n      return (0, _webMercatorUtils.worldToLngLat)(xy, scale);\n    }\n  }, {\n    key: \"getMapCenterByLngLatPosition\",\n    value: function getMapCenterByLngLatPosition(_ref2) {\n      var lngLat = _ref2.lngLat,\n          pos = _ref2.pos;\n      var fromLocation = (0, _webMercatorUtils.pixelsToWorld)(pos, this.pixelUnprojectionMatrix);\n      var toLocation = (0, _webMercatorUtils.lngLatToWorld)(lngLat, this.scale);\n      var translate = vec2.add([], toLocation, vec2.negate([], fromLocation));\n      var newCenter = vec2.add([], this.center, translate);\n      return (0, _webMercatorUtils.worldToLngLat)(newCenter, this.scale);\n    }\n  }, {\n    key: \"getLocationAtPoint\",\n    value: function getLocationAtPoint(_ref3) {\n      var lngLat = _ref3.lngLat,\n          pos = _ref3.pos;\n      return this.getMapCenterByLngLatPosition({\n        lngLat: lngLat,\n        pos: pos\n      });\n    }\n  }, {\n    key: \"fitBounds\",\n    value: function fitBounds(bounds) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var width = this.width,\n          height = this.height;\n\n      var _fitBounds2 = (0, _fitBounds3.default)(Object.assign({\n        width: width,\n        height: height,\n        bounds: bounds\n      }, options)),\n          longitude = _fitBounds2.longitude,\n          latitude = _fitBounds2.latitude,\n          zoom = _fitBounds2.zoom;\n\n      return new WebMercatorViewport({\n        width: width,\n        height: height,\n        longitude: longitude,\n        latitude: latitude,\n        zoom: zoom\n      });\n    }\n  }]);\n  return WebMercatorViewport;\n}(_viewport.default);\n\nexports.default = WebMercatorViewport;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"aBEI\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"QQCW\",\"@babel/runtime/helpers/esm/inherits\":\"NT06\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"bk0i\",\"./viewport\":\"jWSc\",\"./web-mercator-utils\":\"L5RO\",\"./fit-bounds\":\"Zc28\",\"gl-matrix/vec2\":\"cHtt\"}],\"vOym\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = normalizeViewportProps;\n\nvar _webMercatorViewport = _interopRequireDefault(require(\"./web-mercator-viewport\"));\n\nvar _mathUtils = require(\"./math-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MAX_LATITUDE = 85.05113;\nvar MIN_LATITUDE = -85.05113;\n\nfunction normalizeViewportProps(_ref) {\n  var width = _ref.width,\n      height = _ref.height,\n      longitude = _ref.longitude,\n      latitude = _ref.latitude,\n      zoom = _ref.zoom,\n      _ref$pitch = _ref.pitch,\n      pitch = _ref$pitch === void 0 ? 0 : _ref$pitch,\n      _ref$bearing = _ref.bearing,\n      bearing = _ref$bearing === void 0 ? 0 : _ref$bearing;\n\n  if (longitude < -180 || longitude > 180) {\n    longitude = (0, _mathUtils.mod)(longitude + 180, 360) - 180;\n  }\n\n  if (bearing < -180 || bearing > 180) {\n    bearing = (0, _mathUtils.mod)(bearing + 180, 360) - 180;\n  }\n\n  var flatViewport = new _webMercatorViewport.default({\n    width: width,\n    height: height,\n    longitude: longitude,\n    latitude: latitude,\n    zoom: zoom\n  });\n  var topY = flatViewport.project([longitude, MAX_LATITUDE])[1];\n  var bottomY = flatViewport.project([longitude, MIN_LATITUDE])[1];\n  var shiftY = 0;\n\n  if (bottomY - topY < height) {\n    zoom += Math.log2(height / (bottomY - topY));\n    flatViewport = new _webMercatorViewport.default({\n      width: width,\n      height: height,\n      longitude: longitude,\n      latitude: latitude,\n      zoom: zoom\n    });\n    topY = flatViewport.project([longitude, MAX_LATITUDE])[1];\n    bottomY = flatViewport.project([longitude, MIN_LATITUDE])[1];\n  }\n\n  if (topY > 0) {\n    shiftY = topY;\n  } else if (bottomY < height) {\n    shiftY = bottomY - height;\n  }\n\n  if (shiftY) {\n    latitude = flatViewport.unproject([width / 2, height / 2 + shiftY])[1];\n  }\n\n  return {\n    width: width,\n    height: height,\n    longitude: longitude,\n    latitude: latitude,\n    zoom: zoom,\n    pitch: pitch,\n    bearing: bearing\n  };\n}\n},{\"./web-mercator-viewport\":\"q1mr\",\"./math-utils\":\"A2l4\"}],\"WGVX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = flyToViewport;\nexports.getFlyToDuration = getFlyToDuration;\n\nvar _mathUtils = require(\"./math-utils\");\n\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\n\nvar vec2 = _interopRequireWildcard(require(\"gl-matrix/vec2\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar EPSILON = 0.01;\nvar VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom'];\nvar DEFAULT_OPTS = {\n  curve: 1.414,\n  speed: 1.2\n};\n\nfunction flyToViewport(startProps, endProps, t) {\n  var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n  var viewport = {};\n\n  var _getFlyToTransitionPa = getFlyToTransitionParams(startProps, endProps, opts),\n      startZoom = _getFlyToTransitionPa.startZoom,\n      startCenterXY = _getFlyToTransitionPa.startCenterXY,\n      uDelta = _getFlyToTransitionPa.uDelta,\n      w0 = _getFlyToTransitionPa.w0,\n      u1 = _getFlyToTransitionPa.u1,\n      S = _getFlyToTransitionPa.S,\n      rho = _getFlyToTransitionPa.rho,\n      rho2 = _getFlyToTransitionPa.rho2,\n      r0 = _getFlyToTransitionPa.r0;\n\n  if (Math.abs(u1) < EPSILON) {\n    for (var _i = 0; _i < VIEWPORT_TRANSITION_PROPS.length; _i++) {\n      var key = VIEWPORT_TRANSITION_PROPS[_i];\n      var startValue = startProps[key];\n      var endValue = endProps[key];\n      viewport[key] = (0, _mathUtils.lerp)(startValue, endValue, t);\n    }\n\n    return viewport;\n  }\n\n  var s = t * S;\n  var w = Math.cosh(r0) / Math.cosh(r0 + rho * s);\n  var u = w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2) / u1;\n  var scaleIncrement = 1 / w;\n  var newZoom = startZoom + (0, _webMercatorUtils.scaleToZoom)(scaleIncrement);\n  var newCenterWorld = vec2.scale([], uDelta, u);\n  vec2.add(newCenterWorld, newCenterWorld, startCenterXY);\n  vec2.scale(newCenterWorld, newCenterWorld, scaleIncrement);\n  var newCenter = (0, _webMercatorUtils.worldToLngLat)(newCenterWorld, (0, _webMercatorUtils.zoomToScale)(newZoom));\n  viewport.longitude = newCenter[0];\n  viewport.latitude = newCenter[1];\n  viewport.zoom = newZoom;\n  return viewport;\n}\n\nfunction getFlyToDuration(startProps, endProps) {\n  var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  opts = Object.assign({}, DEFAULT_OPTS, opts);\n  var _opts = opts,\n      screenSpeed = _opts.screenSpeed,\n      speed = _opts.speed,\n      maxDuration = _opts.maxDuration;\n\n  var _getFlyToTransitionPa2 = getFlyToTransitionParams(startProps, endProps, opts),\n      S = _getFlyToTransitionPa2.S,\n      rho = _getFlyToTransitionPa2.rho;\n\n  var length = 1000 * S;\n  var duration;\n\n  if (Number.isFinite(screenSpeed)) {\n    duration = length / (screenSpeed / rho);\n  } else {\n    duration = length / speed;\n  }\n\n  return Number.isFinite(maxDuration) && duration > maxDuration ? 0 : duration;\n}\n\nfunction getFlyToTransitionParams(startProps, endProps, opts) {\n  opts = Object.assign({}, DEFAULT_OPTS, opts);\n  var rho = opts.curve;\n  var startZoom = startProps.zoom;\n  var startCenter = [startProps.longitude, startProps.latitude];\n  var startScale = (0, _webMercatorUtils.zoomToScale)(startZoom);\n  var endZoom = endProps.zoom;\n  var endCenter = [endProps.longitude, endProps.latitude];\n  var scale = (0, _webMercatorUtils.zoomToScale)(endZoom - startZoom);\n  var startCenterXY = (0, _webMercatorUtils.lngLatToWorld)(startCenter, startScale);\n  var endCenterXY = (0, _webMercatorUtils.lngLatToWorld)(endCenter, startScale);\n  var uDelta = vec2.sub([], endCenterXY, startCenterXY);\n  var w0 = Math.max(startProps.width, startProps.height);\n  var w1 = w0 / scale;\n  var u1 = vec2.length(uDelta);\n  var rho2 = rho * rho;\n  var b0 = (w1 * w1 - w0 * w0 + rho2 * rho2 * u1 * u1) / (2 * w0 * rho2 * u1);\n  var b1 = (w1 * w1 - w0 * w0 - rho2 * rho2 * u1 * u1) / (2 * w1 * rho2 * u1);\n  var r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);\n  var r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n  var S = (r1 - r0) / rho;\n  return {\n    startZoom: startZoom,\n    startCenterXY: startCenterXY,\n    uDelta: uDelta,\n    w0: w0,\n    u1: u1,\n    S: S,\n    rho: rho,\n    rho2: rho2,\n    r0: r0,\n    r1: r1\n  };\n}\n},{\"./math-utils\":\"A2l4\",\"./web-mercator-utils\":\"L5RO\",\"gl-matrix/vec2\":\"cHtt\"}],\"ha5B\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"default\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorViewport.default;\n  }\n});\nObject.defineProperty(exports, \"WebMercatorViewport\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorViewport.default;\n  }\n});\nObject.defineProperty(exports, \"PerspectiveMercatorViewport\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorViewport.default;\n  }\n});\nObject.defineProperty(exports, \"fitBounds\", {\n  enumerable: true,\n  get: function () {\n    return _fitBounds.default;\n  }\n});\nObject.defineProperty(exports, \"normalizeViewportProps\", {\n  enumerable: true,\n  get: function () {\n    return _normalizeViewportProps.default;\n  }\n});\nObject.defineProperty(exports, \"flyToViewport\", {\n  enumerable: true,\n  get: function () {\n    return _flyToViewport.default;\n  }\n});\nObject.defineProperty(exports, \"getFlyToDuration\", {\n  enumerable: true,\n  get: function () {\n    return _flyToViewport.getFlyToDuration;\n  }\n});\nObject.defineProperty(exports, \"lngLatToWorld\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.lngLatToWorld;\n  }\n});\nObject.defineProperty(exports, \"worldToLngLat\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.worldToLngLat;\n  }\n});\nObject.defineProperty(exports, \"worldToPixels\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.worldToPixels;\n  }\n});\nObject.defineProperty(exports, \"pixelsToWorld\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.pixelsToWorld;\n  }\n});\nObject.defineProperty(exports, \"getMeterZoom\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.getMeterZoom;\n  }\n});\nObject.defineProperty(exports, \"getDistanceScales\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.getDistanceScales;\n  }\n});\nObject.defineProperty(exports, \"addMetersToLngLat\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.addMetersToLngLat;\n  }\n});\nObject.defineProperty(exports, \"getViewMatrix\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.getViewMatrix;\n  }\n});\nObject.defineProperty(exports, \"getProjectionMatrix\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.getProjectionMatrix;\n  }\n});\nObject.defineProperty(exports, \"getProjectionParameters\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.getProjectionParameters;\n  }\n});\nObject.defineProperty(exports, \"getUncenteredViewMatrix\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.getViewMatrix;\n  }\n});\nObject.defineProperty(exports, \"projectFlat\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.lngLatToWorld;\n  }\n});\nObject.defineProperty(exports, \"unprojectFlat\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorUtils.worldToLngLat;\n  }\n});\n\nvar _webMercatorViewport = _interopRequireDefault(require(\"./web-mercator-viewport\"));\n\nvar _fitBounds = _interopRequireDefault(require(\"./fit-bounds\"));\n\nvar _normalizeViewportProps = _interopRequireDefault(require(\"./normalize-viewport-props\"));\n\nvar _flyToViewport = _interopRequireWildcard(require(\"./fly-to-viewport\"));\n\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./web-mercator-viewport\":\"q1mr\",\"./fit-bounds\":\"Zc28\",\"./normalize-viewport-props\":\"vOym\",\"./fly-to-viewport\":\"WGVX\",\"./web-mercator-utils\":\"L5RO\"}],\"gPUa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getWorldPosition = getWorldPosition;\nexports.projectPosition = projectPosition;\n\nvar _constants = require(\"../../lib/constants\");\n\nvar _viewportUniforms = require(\"./viewport-uniforms\");\n\nvar vec4 = _interopRequireWildcard(require(\"gl-matrix/vec4\"));\n\nvar vec3 = _interopRequireWildcard(require(\"gl-matrix/vec3\"));\n\nvar _viewportMercatorProject = require(\"viewport-mercator-project\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n/**\n * Projection utils\n * TODO: move to Viewport class?\n */\n\n\n// In project.glsl, offset modes calculate z differently from LNG_LAT mode.\n// offset modes apply the y adjustment (pixelsPerMeter2) when projecting z\n// LNG_LAT mode only use the linear scale.\nfunction lngLatZToWorldPosition(lngLatZ, viewport) {\n  var offsetMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var _lngLatZ = _slicedToArray(lngLatZ, 3),\n      longitude = _lngLatZ[0],\n      latitude = _lngLatZ[1],\n      _lngLatZ$ = _lngLatZ[2],\n      z = _lngLatZ$ === void 0 ? 0 : _lngLatZ$;\n\n  var _viewport$projectFlat = viewport.projectFlat(lngLatZ),\n      _viewport$projectFlat2 = _slicedToArray(_viewport$projectFlat, 2),\n      X = _viewport$projectFlat2[0],\n      Y = _viewport$projectFlat2[1];\n\n  var distanceScales = offsetMode ? (0, _viewportMercatorProject.getDistanceScales)({\n    longitude: longitude,\n    latitude: latitude,\n    scale: viewport.scale\n  }) : viewport.getDistanceScales();\n  var Z = z * distanceScales.pixelsPerMeter[2];\n  return [X, Y, Z];\n}\n\nfunction normalizeParameters(opts) {\n  var normalizedParams = Object.assign({}, opts);\n  var viewport = opts.viewport,\n      coordinateSystem = opts.coordinateSystem,\n      coordinateOrigin = opts.coordinateOrigin,\n      fromCoordinateSystem = opts.fromCoordinateSystem,\n      fromCoordinateOrigin = opts.fromCoordinateOrigin;\n\n  if (fromCoordinateSystem === undefined) {\n    normalizedParams.fromCoordinateSystem = coordinateSystem;\n  }\n\n  if (fromCoordinateOrigin === undefined) {\n    normalizedParams.fromCoordinateOrigin = coordinateOrigin;\n  }\n\n  if (coordinateSystem === _constants.COORDINATE_SYSTEM.LNGLAT && viewport.zoom >= _viewportUniforms.LNGLAT_AUTO_OFFSET_ZOOM_THRESHOLD) {\n    normalizedParams.coordinateSystem = _constants.COORDINATE_SYSTEM.LNGLAT_OFFSETS;\n    normalizedParams.coordinateOrigin = [Math.fround(viewport.longitude), Math.fround(viewport.latitude)];\n  }\n\n  return normalizedParams;\n}\n\nfunction getWorldPosition(position, _ref) {\n  var viewport = _ref.viewport,\n      modelMatrix = _ref.modelMatrix,\n      coordinateSystem = _ref.coordinateSystem,\n      coordinateOrigin = _ref.coordinateOrigin,\n      offsetMode = _ref.offsetMode;\n\n  var _position = _slicedToArray(position, 3),\n      x = _position[0],\n      y = _position[1],\n      z = _position[2];\n\n  if (modelMatrix) {\n    var _vec4$transformMat = vec4.transformMat4([], [x, y, z, 1.0], modelMatrix);\n\n    var _vec4$transformMat2 = _slicedToArray(_vec4$transformMat, 3);\n\n    x = _vec4$transformMat2[0];\n    y = _vec4$transformMat2[1];\n    z = _vec4$transformMat2[2];\n  }\n\n  switch (coordinateSystem) {\n    case _constants.COORDINATE_SYSTEM.LNGLAT:\n    case _constants.COORDINATE_SYSTEM.LNGLAT_DEPRECATED:\n      return lngLatZToWorldPosition([x, y, z], viewport, offsetMode);\n\n    case _constants.COORDINATE_SYSTEM.LNGLAT_OFFSETS:\n      return lngLatZToWorldPosition([x + coordinateOrigin[0], y + coordinateOrigin[1], z + (coordinateOrigin[2] || 0)], viewport, offsetMode);\n\n    case _constants.COORDINATE_SYSTEM.METER_OFFSETS:\n      return lngLatZToWorldPosition((0, _viewportMercatorProject.addMetersToLngLat)(coordinateOrigin, [x, y, z]), viewport, offsetMode);\n\n    case _constants.COORDINATE_SYSTEM.IDENTITY:\n    default:\n      return [x, y, z];\n  }\n}\n/**\n * Equivalent to project_position in project.glsl\n * projects a user supplied position to world position in the target coordinates system\n * @param {array} position - [x, y, z]\n * @param {object} params\n * @param {Viewport} params.viewport - the current viewport\n * @param {number} params.coordinateSystem - the coordinate system to project into\n * @param {array} params.coordinateOrigin - the coordinate origin to project into\n * @param {Matrix4} [params.modelMatrix] - the model matrix of the supplied position\n * @param {number} [params.fromCoordinateSystem] - the coordinate system that the\n *   supplied position is in. Default to the same as `coordinateSystem`.\n * @param {array} [params.fromCoordinateOrigin] - the coordinate origin that the\n *   supplied position is in. Default to the same as `coordinateOrigin`.\n */\n\n\nfunction projectPosition(position, params) {\n  var _normalizeParameters = normalizeParameters(params),\n      viewport = _normalizeParameters.viewport,\n      coordinateSystem = _normalizeParameters.coordinateSystem,\n      coordinateOrigin = _normalizeParameters.coordinateOrigin,\n      modelMatrix = _normalizeParameters.modelMatrix,\n      fromCoordinateSystem = _normalizeParameters.fromCoordinateSystem,\n      fromCoordinateOrigin = _normalizeParameters.fromCoordinateOrigin;\n\n  switch (coordinateSystem) {\n    case _constants.COORDINATE_SYSTEM.LNGLAT_OFFSETS:\n    case _constants.COORDINATE_SYSTEM.METER_OFFSETS:\n      {\n        var worldPosition = getWorldPosition(position, {\n          viewport: viewport,\n          modelMatrix: modelMatrix,\n          coordinateSystem: fromCoordinateSystem,\n          coordinateOrigin: fromCoordinateOrigin,\n          offsetMode: true\n        });\n        var originWorld = lngLatZToWorldPosition(coordinateOrigin, viewport, true);\n        vec3.sub(worldPosition, worldPosition, originWorld);\n        return worldPosition;\n      }\n\n    case _constants.COORDINATE_SYSTEM.LNGLAT:\n    case _constants.COORDINATE_SYSTEM.LNGLAT_DEPRECATED:\n    case _constants.COORDINATE_SYSTEM.IDENTITY:\n    default:\n      return getWorldPosition(position, {\n        viewport: viewport,\n        modelMatrix: modelMatrix,\n        coordinateSystem: fromCoordinateSystem,\n        coordinateOrigin: fromCoordinateOrigin,\n        offsetMode: false\n      });\n  }\n}\n},{\"../../lib/constants\":\"hXbg\",\"./viewport-uniforms\":\"aNiS\",\"gl-matrix/vec4\":\"QGfo\",\"gl-matrix/vec3\":\"Ijz7\",\"viewport-mercator-project\":\"ha5B\"}],\"vVxT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _lighting = _interopRequireDefault(require(\"./lighting.glsl\"));\n\nvar _project = _interopRequireDefault(require(\"../project/project\"));\n\nvar _projectFunctions = require(\"../project/project-functions\");\n\nvar _memoize = _interopRequireDefault(require(\"../../utils/memoize\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = {\n  name: 'lighting',\n  dependencies: [_project.default],\n  vs: _lighting.default,\n  getUniforms: getUniforms,\n  deprecations: [// Deprecated lighting functions\n  {\n    type: 'function',\n    old: 'getLightWeight',\n    new: 'lighting_getLightWeight',\n    deprecated: true\n  }]\n};\nexports.default = _default;\nvar INITIAL_MODULE_OPTIONS = {};\nvar DEFAULT_LIGHTS_POSITION = [-122.45, 37.75, 8000];\nvar DEFAULT_LIGHTS_STRENGTH = [2.0, 0.0];\nvar DEFAULT_AMBIENT_RATIO = 0.4;\nvar DEFAULT_DIFFUSE_RATIO = 0.6;\nvar DEFAULT_SPECULAR_RATIO = 0.8;\nvar getMemoizedLightPositions = (0, _memoize.default)(preprojectLightPositions); // TODO: support partial update, e.g.\n// `lightedModel.setModuleParameters({diffuseRatio: 0.3});`\n\nfunction getUniforms() {\n  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_MODULE_OPTIONS;\n\n  if (!opts.lightSettings) {\n    return {};\n  }\n\n  var coordinateSystem = opts.coordinateSystem,\n      coordinateOrigin = opts.coordinateOrigin,\n      _opts$lightSettings = opts.lightSettings,\n      _opts$lightSettings$n = _opts$lightSettings.numberOfLights,\n      numberOfLights = _opts$lightSettings$n === void 0 ? 1 : _opts$lightSettings$n,\n      _opts$lightSettings$l = _opts$lightSettings.lightsPosition,\n      lightsPosition = _opts$lightSettings$l === void 0 ? DEFAULT_LIGHTS_POSITION : _opts$lightSettings$l,\n      _opts$lightSettings$l2 = _opts$lightSettings.lightsStrength,\n      lightsStrength = _opts$lightSettings$l2 === void 0 ? DEFAULT_LIGHTS_STRENGTH : _opts$lightSettings$l2,\n      fromCoordinateSystem = _opts$lightSettings.coordinateSystem,\n      fromCoordinateOrigin = _opts$lightSettings.coordinateOrigin,\n      _opts$lightSettings$m = _opts$lightSettings.modelMatrix,\n      modelMatrix = _opts$lightSettings$m === void 0 ? null : _opts$lightSettings$m,\n      _opts$lightSettings$a = _opts$lightSettings.ambientRatio,\n      ambientRatio = _opts$lightSettings$a === void 0 ? DEFAULT_AMBIENT_RATIO : _opts$lightSettings$a,\n      _opts$lightSettings$d = _opts$lightSettings.diffuseRatio,\n      diffuseRatio = _opts$lightSettings$d === void 0 ? DEFAULT_DIFFUSE_RATIO : _opts$lightSettings$d,\n      _opts$lightSettings$s = _opts$lightSettings.specularRatio,\n      specularRatio = _opts$lightSettings$s === void 0 ? DEFAULT_SPECULAR_RATIO : _opts$lightSettings$s; // Pre-project light positions\n\n  var lightsPositionWorld = getMemoizedLightPositions({\n    lightsPosition: lightsPosition,\n    numberOfLights: numberOfLights,\n    viewport: opts.viewport,\n    modelMatrix: modelMatrix,\n    coordinateSystem: coordinateSystem,\n    coordinateOrigin: coordinateOrigin,\n    fromCoordinateSystem: fromCoordinateSystem,\n    fromCoordinateOrigin: fromCoordinateOrigin\n  });\n  return {\n    lighting_lightPositions: lightsPositionWorld,\n    lighting_lightStrengths: lightsStrength,\n    lighting_ambientRatio: ambientRatio,\n    lighting_diffuseRatio: diffuseRatio,\n    lighting_specularRatio: specularRatio,\n    lighting_numberOfLights: numberOfLights\n  };\n} // Pre-project light positions\n\n\nfunction preprojectLightPositions(_ref) {\n  var lightsPosition = _ref.lightsPosition,\n      numberOfLights = _ref.numberOfLights,\n      viewport = _ref.viewport,\n      modelMatrix = _ref.modelMatrix,\n      coordinateSystem = _ref.coordinateSystem,\n      coordinateOrigin = _ref.coordinateOrigin,\n      fromCoordinateSystem = _ref.fromCoordinateSystem,\n      fromCoordinateOrigin = _ref.fromCoordinateOrigin;\n  var projectionParameters = {\n    viewport: viewport,\n    modelMatrix: modelMatrix,\n    coordinateSystem: coordinateSystem,\n    coordinateOrigin: coordinateOrigin,\n    fromCoordinateSystem: fromCoordinateSystem,\n    fromCoordinateOrigin: fromCoordinateOrigin\n  };\n  var lightsPositionWorld = [];\n\n  for (var i = 0; i < numberOfLights; i++) {\n    var position = (0, _projectFunctions.projectPosition)(lightsPosition.slice(i * 3, i * 3 + 3), projectionParameters);\n    lightsPositionWorld[i * 3] = position[0];\n    lightsPositionWorld[i * 3 + 1] = position[1];\n    lightsPositionWorld[i * 3 + 2] = position[2];\n  }\n\n  return lightsPositionWorld;\n}\n},{\"./lighting.glsl\":\"jEBv\",\"../project/project\":\"CzyJ\",\"../project/project-functions\":\"gPUa\",\"../../utils/memoize\":\"GsX0\"}],\"iQYg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initializeShaderModules = initializeShaderModules;\nObject.defineProperty(exports, \"fp32\", {\n  enumerable: true,\n  get: function () {\n    return _luma.fp32;\n  }\n});\nObject.defineProperty(exports, \"fp64\", {\n  enumerable: true,\n  get: function () {\n    return _luma.fp64;\n  }\n});\nObject.defineProperty(exports, \"picking\", {\n  enumerable: true,\n  get: function () {\n    return _luma.picking;\n  }\n});\nObject.defineProperty(exports, \"project\", {\n  enumerable: true,\n  get: function () {\n    return _project.default;\n  }\n});\nObject.defineProperty(exports, \"project64\", {\n  enumerable: true,\n  get: function () {\n    return _project3.default;\n  }\n});\nObject.defineProperty(exports, \"lighting\", {\n  enumerable: true,\n  get: function () {\n    return _lighting.default;\n  }\n});\n\nvar _luma = require(\"luma.gl\");\n\nvar _project = _interopRequireDefault(require(\"../shaderlib/project/project\"));\n\nvar _project2 = _interopRequireDefault(require(\"../shaderlib/project32/project32\"));\n\nvar _project3 = _interopRequireDefault(require(\"../shaderlib/project64/project64\"));\n\nvar _lighting = _interopRequireDefault(require(\"../shaderlib/lighting/lighting\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nfunction initializeShaderModules() {\n  (0, _luma.registerShaderModules)([_luma.fp32, _luma.fp64, _project.default, _project2.default, _project3.default, _lighting.default, _luma.picking]);\n  (0, _luma.setDefaultShaderModules)([_project.default]);\n}\n\ninitializeShaderModules();\n},{\"luma.gl\":\"iiNl\",\"../shaderlib/project/project\":\"CzyJ\",\"../shaderlib/project32/project32\":\"LHSP\",\"../shaderlib/project64/project64\":\"kXBR\",\"../shaderlib/lighting/lighting\":\"vVxT\"}],\"uYRW\":[function(require,module,exports) {\n\"use strict\";\n\n// GL constants, copied from Mozilla documentation\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n// Standard WebGL 1 constants\n// These constants are defined on the WebGLRenderingContext interface.\n\n/* eslint-disable key-spacing, max-len, no-inline-comments, camelcase */\n// eslint-disable-next-line\nmodule.exports = {\n  // Clearing buffers\n  // Constants passed to clear() to clear buffer masks.\n  DEPTH_BUFFER_BIT: 0x00000100,\n  STENCIL_BUFFER_BIT: 0x00000400,\n  COLOR_BUFFER_BIT: 0x00004000,\n  // Rendering primitives\n  // Constants passed to drawElements() or drawArrays() to specify what kind of primitive to render.\n  POINTS: 0x0000,\n  LINES: 0x0001,\n  LINE_LOOP: 0x0002,\n  LINE_STRIP: 0x0003,\n  TRIANGLES: 0x0004,\n  TRIANGLE_STRIP: 0x0005,\n  TRIANGLE_FAN: 0x0006,\n  // Blending modes\n  // Constants passed to blendFunc() or blendFuncSeparate() to specify the blending mode (for both, RBG and alpha, or separately).\n  ZERO: 0,\n  ONE: 1,\n  SRC_COLOR: 0x0300,\n  ONE_MINUS_SRC_COLOR: 0x0301,\n  SRC_ALPHA: 0x0302,\n  ONE_MINUS_SRC_ALPHA: 0x0303,\n  DST_ALPHA: 0x0304,\n  ONE_MINUS_DST_ALPHA: 0x0305,\n  DST_COLOR: 0x0306,\n  ONE_MINUS_DST_COLOR: 0x0307,\n  SRC_ALPHA_SATURATE: 0x0308,\n  CONSTANT_COLOR: 0x8001,\n  ONE_MINUS_CONSTANT_COLOR: 0x8002,\n  CONSTANT_ALPHA: 0x8003,\n  ONE_MINUS_CONSTANT_ALPHA: 0x8004,\n  // Blending equations\n  // Constants passed to blendEquation() or blendEquationSeparate() to control\n  // how the blending is calculated (for both, RBG and alpha, or separately).\n  FUNC_ADD: 0x8006,\n  FUNC_SUBTRACT: 0x800a,\n  FUNC_REVERSE_SUBTRACT: 0x800b,\n  // Getting GL parameter information\n  // Constants passed to getParameter() to specify what information to return.\n  BLEND_EQUATION: 0x8009,\n  BLEND_EQUATION_RGB: 0x8009,\n  BLEND_EQUATION_ALPHA: 0x883d,\n  BLEND_DST_RGB: 0x80c8,\n  BLEND_SRC_RGB: 0x80c9,\n  BLEND_DST_ALPHA: 0x80ca,\n  BLEND_SRC_ALPHA: 0x80cb,\n  BLEND_COLOR: 0x8005,\n  ARRAY_BUFFER_BINDING: 0x8894,\n  ELEMENT_ARRAY_BUFFER_BINDING: 0x8895,\n  LINE_WIDTH: 0x0b21,\n  ALIASED_POINT_SIZE_RANGE: 0x846d,\n  ALIASED_LINE_WIDTH_RANGE: 0x846e,\n  CULL_FACE_MODE: 0x0b45,\n  FRONT_FACE: 0x0b46,\n  DEPTH_RANGE: 0x0b70,\n  DEPTH_WRITEMASK: 0x0b72,\n  DEPTH_CLEAR_VALUE: 0x0b73,\n  DEPTH_FUNC: 0x0b74,\n  STENCIL_CLEAR_VALUE: 0x0b91,\n  STENCIL_FUNC: 0x0b92,\n  STENCIL_FAIL: 0x0b94,\n  STENCIL_PASS_DEPTH_FAIL: 0x0b95,\n  STENCIL_PASS_DEPTH_PASS: 0x0b96,\n  STENCIL_REF: 0x0b97,\n  STENCIL_VALUE_MASK: 0x0b93,\n  STENCIL_WRITEMASK: 0x0b98,\n  STENCIL_BACK_FUNC: 0x8800,\n  STENCIL_BACK_FAIL: 0x8801,\n  STENCIL_BACK_PASS_DEPTH_FAIL: 0x8802,\n  STENCIL_BACK_PASS_DEPTH_PASS: 0x8803,\n  STENCIL_BACK_REF: 0x8ca3,\n  STENCIL_BACK_VALUE_MASK: 0x8ca4,\n  STENCIL_BACK_WRITEMASK: 0x8ca5,\n  VIEWPORT: 0x0ba2,\n  SCISSOR_BOX: 0x0c10,\n  COLOR_CLEAR_VALUE: 0x0c22,\n  COLOR_WRITEMASK: 0x0c23,\n  UNPACK_ALIGNMENT: 0x0cf5,\n  PACK_ALIGNMENT: 0x0d05,\n  MAX_TEXTURE_SIZE: 0x0d33,\n  MAX_VIEWPORT_DIMS: 0x0d3a,\n  SUBPIXEL_BITS: 0x0d50,\n  RED_BITS: 0x0d52,\n  GREEN_BITS: 0x0d53,\n  BLUE_BITS: 0x0d54,\n  ALPHA_BITS: 0x0d55,\n  DEPTH_BITS: 0x0d56,\n  STENCIL_BITS: 0x0d57,\n  POLYGON_OFFSET_UNITS: 0x2a00,\n  POLYGON_OFFSET_FACTOR: 0x8038,\n  TEXTURE_BINDING_2D: 0x8069,\n  SAMPLE_BUFFERS: 0x80a8,\n  SAMPLES: 0x80a9,\n  SAMPLE_COVERAGE_VALUE: 0x80aa,\n  SAMPLE_COVERAGE_INVERT: 0x80ab,\n  COMPRESSED_TEXTURE_FORMATS: 0x86a3,\n  VENDOR: 0x1f00,\n  RENDERER: 0x1f01,\n  VERSION: 0x1f02,\n  IMPLEMENTATION_COLOR_READ_TYPE: 0x8b9a,\n  IMPLEMENTATION_COLOR_READ_FORMAT: 0x8b9b,\n  BROWSER_DEFAULT_WEBGL: 0x9244,\n  // Buffers\n  // Constants passed to bufferData(), bufferSubData(), bindBuffer(), or\n  // getBufferParameter().\n  STATIC_DRAW: 0x88e4,\n  STREAM_DRAW: 0x88e0,\n  DYNAMIC_DRAW: 0x88e8,\n  ARRAY_BUFFER: 0x8892,\n  ELEMENT_ARRAY_BUFFER: 0x8893,\n  BUFFER_SIZE: 0x8764,\n  BUFFER_USAGE: 0x8765,\n  // Vertex attributes\n  // Constants passed to getVertexAttrib().\n  CURRENT_VERTEX_ATTRIB: 0x8626,\n  VERTEX_ATTRIB_ARRAY_ENABLED: 0x8622,\n  VERTEX_ATTRIB_ARRAY_SIZE: 0x8623,\n  VERTEX_ATTRIB_ARRAY_STRIDE: 0x8624,\n  VERTEX_ATTRIB_ARRAY_TYPE: 0x8625,\n  VERTEX_ATTRIB_ARRAY_NORMALIZED: 0x886a,\n  VERTEX_ATTRIB_ARRAY_POINTER: 0x8645,\n  VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 0x889f,\n  // Culling\n  // Constants passed to cullFace().\n  CULL_FACE: 0x0b44,\n  FRONT: 0x0404,\n  BACK: 0x0405,\n  FRONT_AND_BACK: 0x0408,\n  // Enabling and disabling\n  // Constants passed to enable() or disable().\n  BLEND: 0x0be2,\n  DEPTH_TEST: 0x0b71,\n  DITHER: 0x0bd0,\n  POLYGON_OFFSET_FILL: 0x8037,\n  SAMPLE_ALPHA_TO_COVERAGE: 0x809e,\n  SAMPLE_COVERAGE: 0x80a0,\n  SCISSOR_TEST: 0x0c11,\n  STENCIL_TEST: 0x0b90,\n  // Errors\n  // Constants returned from getError().\n  NO_ERROR: 0,\n  INVALID_ENUM: 0x0500,\n  INVALID_VALUE: 0x0501,\n  INVALID_OPERATION: 0x0502,\n  OUT_OF_MEMORY: 0x0505,\n  CONTEXT_LOST_WEBGL: 0x9242,\n  // Front face directions\n  // Constants passed to frontFace().\n  CW: 0x0900,\n  CCW: 0x0901,\n  // Hints\n  // Constants passed to hint()\n  DONT_CARE: 0x1100,\n  FASTEST: 0x1101,\n  NICEST: 0x1102,\n  GENERATE_MIPMAP_HINT: 0x8192,\n  // Data types\n  BYTE: 0x1400,\n  UNSIGNED_BYTE: 0x1401,\n  SHORT: 0x1402,\n  UNSIGNED_SHORT: 0x1403,\n  INT: 0x1404,\n  UNSIGNED_INT: 0x1405,\n  FLOAT: 0x1406,\n  // Pixel formats\n  DEPTH_COMPONENT: 0x1902,\n  ALPHA: 0x1906,\n  RGB: 0x1907,\n  RGBA: 0x1908,\n  LUMINANCE: 0x1909,\n  LUMINANCE_ALPHA: 0x190a,\n  // Pixel types\n  // UNSIGNED_BYTE: 0x1401,\n  UNSIGNED_SHORT_4_4_4_4: 0x8033,\n  UNSIGNED_SHORT_5_5_5_1: 0x8034,\n  UNSIGNED_SHORT_5_6_5: 0x8363,\n  // Shaders\n  // Constants passed to createShader() or getShaderParameter()\n  FRAGMENT_SHADER: 0x8b30,\n  VERTEX_SHADER: 0x8b31,\n  COMPILE_STATUS: 0x8b81,\n  DELETE_STATUS: 0x8b80,\n  LINK_STATUS: 0x8b82,\n  VALIDATE_STATUS: 0x8b83,\n  ATTACHED_SHADERS: 0x8b85,\n  ACTIVE_ATTRIBUTES: 0x8b89,\n  ACTIVE_UNIFORMS: 0x8b86,\n  MAX_VERTEX_ATTRIBS: 0x8869,\n  MAX_VERTEX_UNIFORM_VECTORS: 0x8dfb,\n  MAX_VARYING_VECTORS: 0x8dfc,\n  MAX_COMBINED_TEXTURE_IMAGE_UNITS: 0x8b4d,\n  MAX_VERTEX_TEXTURE_IMAGE_UNITS: 0x8b4c,\n  MAX_TEXTURE_IMAGE_UNITS: 0x8872,\n  MAX_FRAGMENT_UNIFORM_VECTORS: 0x8dfd,\n  SHADER_TYPE: 0x8b4f,\n  SHADING_LANGUAGE_VERSION: 0x8b8c,\n  CURRENT_PROGRAM: 0x8b8d,\n  // Depth or stencil tests\n  // Constants passed to depthFunc() or stencilFunc().\n  NEVER: 0x0200,\n  ALWAYS: 0x0207,\n  LESS: 0x0201,\n  EQUAL: 0x0202,\n  LEQUAL: 0x0203,\n  GREATER: 0x0204,\n  GEQUAL: 0x0206,\n  NOTEQUAL: 0x0205,\n  // Stencil actions\n  // Constants passed to stencilOp().\n  KEEP: 0x1e00,\n  REPLACE: 0x1e01,\n  INCR: 0x1e02,\n  DECR: 0x1e03,\n  INVERT: 0x150a,\n  INCR_WRAP: 0x8507,\n  DECR_WRAP: 0x8508,\n  // Textures\n  // Constants passed to texParameteri(),\n  // texParameterf(), bindTexture(), texImage2D(), and others.\n  NEAREST: 0x2600,\n  LINEAR: 0x2601,\n  NEAREST_MIPMAP_NEAREST: 0x2700,\n  LINEAR_MIPMAP_NEAREST: 0x2701,\n  NEAREST_MIPMAP_LINEAR: 0x2702,\n  LINEAR_MIPMAP_LINEAR: 0x2703,\n  TEXTURE_MAG_FILTER: 0x2800,\n  TEXTURE_MIN_FILTER: 0x2801,\n  TEXTURE_WRAP_S: 0x2802,\n  TEXTURE_WRAP_T: 0x2803,\n  TEXTURE_2D: 0x0de1,\n  TEXTURE: 0x1702,\n  TEXTURE_CUBE_MAP: 0x8513,\n  TEXTURE_BINDING_CUBE_MAP: 0x8514,\n  TEXTURE_CUBE_MAP_POSITIVE_X: 0x8515,\n  TEXTURE_CUBE_MAP_NEGATIVE_X: 0x8516,\n  TEXTURE_CUBE_MAP_POSITIVE_Y: 0x8517,\n  TEXTURE_CUBE_MAP_NEGATIVE_Y: 0x8518,\n  TEXTURE_CUBE_MAP_POSITIVE_Z: 0x8519,\n  TEXTURE_CUBE_MAP_NEGATIVE_Z: 0x851a,\n  MAX_CUBE_MAP_TEXTURE_SIZE: 0x851c,\n  // TEXTURE0 - 31 0x84C0 - 0x84DF A texture unit.\n  TEXTURE0: 0x84c0,\n  ACTIVE_TEXTURE: 0x84e0,\n  REPEAT: 0x2901,\n  CLAMP_TO_EDGE: 0x812f,\n  MIRRORED_REPEAT: 0x8370,\n  // Emulation\n  TEXTURE_WIDTH: 0x1000,\n  TEXTURE_HEIGHT: 0x1001,\n  // Uniform types\n  FLOAT_VEC2: 0x8b50,\n  FLOAT_VEC3: 0x8b51,\n  FLOAT_VEC4: 0x8b52,\n  INT_VEC2: 0x8b53,\n  INT_VEC3: 0x8b54,\n  INT_VEC4: 0x8b55,\n  BOOL: 0x8b56,\n  BOOL_VEC2: 0x8b57,\n  BOOL_VEC3: 0x8b58,\n  BOOL_VEC4: 0x8b59,\n  FLOAT_MAT2: 0x8b5a,\n  FLOAT_MAT3: 0x8b5b,\n  FLOAT_MAT4: 0x8b5c,\n  SAMPLER_2D: 0x8b5e,\n  SAMPLER_CUBE: 0x8b60,\n  // Shader precision-specified types\n  LOW_FLOAT: 0x8df0,\n  MEDIUM_FLOAT: 0x8df1,\n  HIGH_FLOAT: 0x8df2,\n  LOW_INT: 0x8df3,\n  MEDIUM_INT: 0x8df4,\n  HIGH_INT: 0x8df5,\n  // Framebuffers and renderbuffers\n  FRAMEBUFFER: 0x8d40,\n  RENDERBUFFER: 0x8d41,\n  RGBA4: 0x8056,\n  RGB5_A1: 0x8057,\n  RGB565: 0x8d62,\n  DEPTH_COMPONENT16: 0x81a5,\n  STENCIL_INDEX: 0x1901,\n  STENCIL_INDEX8: 0x8d48,\n  DEPTH_STENCIL: 0x84f9,\n  RENDERBUFFER_WIDTH: 0x8d42,\n  RENDERBUFFER_HEIGHT: 0x8d43,\n  RENDERBUFFER_INTERNAL_FORMAT: 0x8d44,\n  RENDERBUFFER_RED_SIZE: 0x8d50,\n  RENDERBUFFER_GREEN_SIZE: 0x8d51,\n  RENDERBUFFER_BLUE_SIZE: 0x8d52,\n  RENDERBUFFER_ALPHA_SIZE: 0x8d53,\n  RENDERBUFFER_DEPTH_SIZE: 0x8d54,\n  RENDERBUFFER_STENCIL_SIZE: 0x8d55,\n  FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 0x8cd0,\n  FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 0x8cd1,\n  FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 0x8cd2,\n  FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 0x8cd3,\n  COLOR_ATTACHMENT0: 0x8ce0,\n  DEPTH_ATTACHMENT: 0x8d00,\n  STENCIL_ATTACHMENT: 0x8d20,\n  DEPTH_STENCIL_ATTACHMENT: 0x821a,\n  NONE: 0,\n  FRAMEBUFFER_COMPLETE: 0x8cd5,\n  FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 0x8cd6,\n  FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 0x8cd7,\n  FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 0x8cd9,\n  FRAMEBUFFER_UNSUPPORTED: 0x8cdd,\n  FRAMEBUFFER_BINDING: 0x8ca6,\n  RENDERBUFFER_BINDING: 0x8ca7,\n  READ_FRAMEBUFFER: 0x8ca8,\n  DRAW_FRAMEBUFFER: 0x8ca9,\n  MAX_RENDERBUFFER_SIZE: 0x84e8,\n  INVALID_FRAMEBUFFER_OPERATION: 0x0506,\n  // Pixel storage modes\n  // Constants passed to pixelStorei().\n  UNPACK_FLIP_Y_WEBGL: 0x9240,\n  UNPACK_PREMULTIPLY_ALPHA_WEBGL: 0x9241,\n  UNPACK_COLORSPACE_CONVERSION_WEBGL: 0x9243,\n  // /////////////////////////////////////////////////////\n  // Additional constants defined WebGL 2\n  // These constants are defined on the WebGL2RenderingContext interface.\n  // All WebGL 1 constants are also available in a WebGL 2 context.\n  // /////////////////////////////////////////////////////\n  // Getting GL parameter information\n  // Constants passed to getParameter()\n  // to specify what information to return.\n  READ_BUFFER: 0x0c02,\n  UNPACK_ROW_LENGTH: 0x0cf2,\n  UNPACK_SKIP_ROWS: 0x0cf3,\n  UNPACK_SKIP_PIXELS: 0x0cf4,\n  PACK_ROW_LENGTH: 0x0d02,\n  PACK_SKIP_ROWS: 0x0d03,\n  PACK_SKIP_PIXELS: 0x0d04,\n  TEXTURE_BINDING_3D: 0x806a,\n  UNPACK_SKIP_IMAGES: 0x806d,\n  UNPACK_IMAGE_HEIGHT: 0x806e,\n  MAX_3D_TEXTURE_SIZE: 0x8073,\n  MAX_ELEMENTS_VERTICES: 0x80e8,\n  MAX_ELEMENTS_INDICES: 0x80e9,\n  MAX_TEXTURE_LOD_BIAS: 0x84fd,\n  MAX_FRAGMENT_UNIFORM_COMPONENTS: 0x8b49,\n  MAX_VERTEX_UNIFORM_COMPONENTS: 0x8b4a,\n  MAX_ARRAY_TEXTURE_LAYERS: 0x88ff,\n  MIN_PROGRAM_TEXEL_OFFSET: 0x8904,\n  MAX_PROGRAM_TEXEL_OFFSET: 0x8905,\n  MAX_VARYING_COMPONENTS: 0x8b4b,\n  FRAGMENT_SHADER_DERIVATIVE_HINT: 0x8b8b,\n  RASTERIZER_DISCARD: 0x8c89,\n  VERTEX_ARRAY_BINDING: 0x85b5,\n  MAX_VERTEX_OUTPUT_COMPONENTS: 0x9122,\n  MAX_FRAGMENT_INPUT_COMPONENTS: 0x9125,\n  MAX_SERVER_WAIT_TIMEOUT: 0x9111,\n  MAX_ELEMENT_INDEX: 0x8d6b,\n  // Textures\n  // Constants passed to texParameteri(),\n  // texParameterf(), bindTexture(), texImage2D(), and others.\n  RED: 0x1903,\n  RGB8: 0x8051,\n  RGBA8: 0x8058,\n  RGB10_A2: 0x8059,\n  TEXTURE_3D: 0x806f,\n  TEXTURE_WRAP_R: 0x8072,\n  TEXTURE_MIN_LOD: 0x813a,\n  TEXTURE_MAX_LOD: 0x813b,\n  TEXTURE_BASE_LEVEL: 0x813c,\n  TEXTURE_MAX_LEVEL: 0x813d,\n  TEXTURE_COMPARE_MODE: 0x884c,\n  TEXTURE_COMPARE_FUNC: 0x884d,\n  SRGB: 0x8c40,\n  SRGB8: 0x8c41,\n  SRGB8_ALPHA8: 0x8c43,\n  COMPARE_REF_TO_TEXTURE: 0x884e,\n  RGBA32F: 0x8814,\n  RGB32F: 0x8815,\n  RGBA16F: 0x881a,\n  RGB16F: 0x881b,\n  TEXTURE_2D_ARRAY: 0x8c1a,\n  TEXTURE_BINDING_2D_ARRAY: 0x8c1d,\n  R11F_G11F_B10F: 0x8c3a,\n  RGB9_E5: 0x8c3d,\n  RGBA32UI: 0x8d70,\n  RGB32UI: 0x8d71,\n  RGBA16UI: 0x8d76,\n  RGB16UI: 0x8d77,\n  RGBA8UI: 0x8d7c,\n  RGB8UI: 0x8d7d,\n  RGBA32I: 0x8d82,\n  RGB32I: 0x8d83,\n  RGBA16I: 0x8d88,\n  RGB16I: 0x8d89,\n  RGBA8I: 0x8d8e,\n  RGB8I: 0x8d8f,\n  RED_INTEGER: 0x8d94,\n  RGB_INTEGER: 0x8d98,\n  RGBA_INTEGER: 0x8d99,\n  R8: 0x8229,\n  RG8: 0x822b,\n  R16F: 0x822d,\n  R32F: 0x822e,\n  RG16F: 0x822f,\n  RG32F: 0x8230,\n  R8I: 0x8231,\n  R8UI: 0x8232,\n  R16I: 0x8233,\n  R16UI: 0x8234,\n  R32I: 0x8235,\n  R32UI: 0x8236,\n  RG8I: 0x8237,\n  RG8UI: 0x8238,\n  RG16I: 0x8239,\n  RG16UI: 0x823a,\n  RG32I: 0x823b,\n  RG32UI: 0x823c,\n  R8_SNORM: 0x8f94,\n  RG8_SNORM: 0x8f95,\n  RGB8_SNORM: 0x8f96,\n  RGBA8_SNORM: 0x8f97,\n  RGB10_A2UI: 0x906f,\n\n  /* covered by extension\n  COMPRESSED_R11_EAC : 0x9270,\n  COMPRESSED_SIGNED_R11_EAC: 0x9271,\n  COMPRESSED_RG11_EAC: 0x9272,\n  COMPRESSED_SIGNED_RG11_EAC : 0x9273,\n  COMPRESSED_RGB8_ETC2 : 0x9274,\n  COMPRESSED_SRGB8_ETC2: 0x9275,\n  COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9276,\n  COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC : 0x9277,\n  COMPRESSED_RGBA8_ETC2_EAC: 0x9278,\n  COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : 0x9279,\n  */\n  TEXTURE_IMMUTABLE_FORMAT: 0x912f,\n  TEXTURE_IMMUTABLE_LEVELS: 0x82df,\n  // Pixel types\n  UNSIGNED_INT_2_10_10_10_REV: 0x8368,\n  UNSIGNED_INT_10F_11F_11F_REV: 0x8c3b,\n  UNSIGNED_INT_5_9_9_9_REV: 0x8c3e,\n  FLOAT_32_UNSIGNED_INT_24_8_REV: 0x8dad,\n  UNSIGNED_INT_24_8: 0x84fa,\n  HALF_FLOAT: 0x140b,\n  RG: 0x8227,\n  RG_INTEGER: 0x8228,\n  INT_2_10_10_10_REV: 0x8d9f,\n  // Queries\n  CURRENT_QUERY: 0x8865,\n  QUERY_RESULT: 0x8866,\n  QUERY_RESULT_AVAILABLE: 0x8867,\n  ANY_SAMPLES_PASSED: 0x8c2f,\n  ANY_SAMPLES_PASSED_CONSERVATIVE: 0x8d6a,\n  // Draw buffers\n  MAX_DRAW_BUFFERS: 0x8824,\n  DRAW_BUFFER0: 0x8825,\n  DRAW_BUFFER1: 0x8826,\n  DRAW_BUFFER2: 0x8827,\n  DRAW_BUFFER3: 0x8828,\n  DRAW_BUFFER4: 0x8829,\n  DRAW_BUFFER5: 0x882a,\n  DRAW_BUFFER6: 0x882b,\n  DRAW_BUFFER7: 0x882c,\n  DRAW_BUFFER8: 0x882d,\n  DRAW_BUFFER9: 0x882e,\n  DRAW_BUFFER10: 0x882f,\n  DRAW_BUFFER11: 0x8830,\n  DRAW_BUFFER12: 0x8831,\n  DRAW_BUFFER13: 0x8832,\n  DRAW_BUFFER14: 0x8833,\n  DRAW_BUFFER15: 0x8834,\n  MAX_COLOR_ATTACHMENTS: 0x8cdf,\n  COLOR_ATTACHMENT1: 0x8ce1,\n  COLOR_ATTACHMENT2: 0x8ce2,\n  COLOR_ATTACHMENT3: 0x8ce3,\n  COLOR_ATTACHMENT4: 0x8ce4,\n  COLOR_ATTACHMENT5: 0x8ce5,\n  COLOR_ATTACHMENT6: 0x8ce6,\n  COLOR_ATTACHMENT7: 0x8ce7,\n  COLOR_ATTACHMENT8: 0x8ce8,\n  COLOR_ATTACHMENT9: 0x8ce9,\n  COLOR_ATTACHMENT10: 0x8cea,\n  COLOR_ATTACHMENT11: 0x8ceb,\n  COLOR_ATTACHMENT12: 0x8cec,\n  COLOR_ATTACHMENT13: 0x8ced,\n  COLOR_ATTACHMENT14: 0x8cee,\n  COLOR_ATTACHMENT15: 0x8cef,\n  // Samplers\n  SAMPLER_3D: 0x8b5f,\n  SAMPLER_2D_SHADOW: 0x8b62,\n  SAMPLER_2D_ARRAY: 0x8dc1,\n  SAMPLER_2D_ARRAY_SHADOW: 0x8dc4,\n  SAMPLER_CUBE_SHADOW: 0x8dc5,\n  INT_SAMPLER_2D: 0x8dca,\n  INT_SAMPLER_3D: 0x8dcb,\n  INT_SAMPLER_CUBE: 0x8dcc,\n  INT_SAMPLER_2D_ARRAY: 0x8dcf,\n  UNSIGNED_INT_SAMPLER_2D: 0x8dd2,\n  UNSIGNED_INT_SAMPLER_3D: 0x8dd3,\n  UNSIGNED_INT_SAMPLER_CUBE: 0x8dd4,\n  UNSIGNED_INT_SAMPLER_2D_ARRAY: 0x8dd7,\n  MAX_SAMPLES: 0x8d57,\n  SAMPLER_BINDING: 0x8919,\n  // Buffers\n  PIXEL_PACK_BUFFER: 0x88eb,\n  PIXEL_UNPACK_BUFFER: 0x88ec,\n  PIXEL_PACK_BUFFER_BINDING: 0x88ed,\n  PIXEL_UNPACK_BUFFER_BINDING: 0x88ef,\n  COPY_READ_BUFFER: 0x8f36,\n  COPY_WRITE_BUFFER: 0x8f37,\n  COPY_READ_BUFFER_BINDING: 0x8f36,\n  COPY_WRITE_BUFFER_BINDING: 0x8f37,\n  // Data types\n  FLOAT_MAT2x3: 0x8b65,\n  FLOAT_MAT2x4: 0x8b66,\n  FLOAT_MAT3x2: 0x8b67,\n  FLOAT_MAT3x4: 0x8b68,\n  FLOAT_MAT4x2: 0x8b69,\n  FLOAT_MAT4x3: 0x8b6a,\n  UNSIGNED_INT_VEC2: 0x8dc6,\n  UNSIGNED_INT_VEC3: 0x8dc7,\n  UNSIGNED_INT_VEC4: 0x8dc8,\n  UNSIGNED_NORMALIZED: 0x8c17,\n  SIGNED_NORMALIZED: 0x8f9c,\n  // Vertex attributes\n  VERTEX_ATTRIB_ARRAY_INTEGER: 0x88fd,\n  VERTEX_ATTRIB_ARRAY_DIVISOR: 0x88fe,\n  // Transform feedback\n  TRANSFORM_FEEDBACK_BUFFER_MODE: 0x8c7f,\n  MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: 0x8c80,\n  TRANSFORM_FEEDBACK_VARYINGS: 0x8c83,\n  TRANSFORM_FEEDBACK_BUFFER_START: 0x8c84,\n  TRANSFORM_FEEDBACK_BUFFER_SIZE: 0x8c85,\n  TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: 0x8c88,\n  MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: 0x8c8a,\n  MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: 0x8c8b,\n  INTERLEAVED_ATTRIBS: 0x8c8c,\n  SEPARATE_ATTRIBS: 0x8c8d,\n  TRANSFORM_FEEDBACK_BUFFER: 0x8c8e,\n  TRANSFORM_FEEDBACK_BUFFER_BINDING: 0x8c8f,\n  TRANSFORM_FEEDBACK: 0x8e22,\n  TRANSFORM_FEEDBACK_PAUSED: 0x8e23,\n  TRANSFORM_FEEDBACK_ACTIVE: 0x8e24,\n  TRANSFORM_FEEDBACK_BINDING: 0x8e25,\n  // Framebuffers and renderbuffers\n  FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: 0x8210,\n  FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: 0x8211,\n  FRAMEBUFFER_ATTACHMENT_RED_SIZE: 0x8212,\n  FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 0x8213,\n  FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 0x8214,\n  FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 0x8215,\n  FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 0x8216,\n  FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 0x8217,\n  FRAMEBUFFER_DEFAULT: 0x8218,\n  // DEPTH_STENCIL_ATTACHMENT : 0x821A,\n  // DEPTH_STENCIL: 0x84F9,\n  DEPTH24_STENCIL8: 0x88f0,\n  DRAW_FRAMEBUFFER_BINDING: 0x8ca6,\n  READ_FRAMEBUFFER_BINDING: 0x8caa,\n  RENDERBUFFER_SAMPLES: 0x8cab,\n  FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: 0x8cd4,\n  FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: 0x8d56,\n  // Uniforms\n  UNIFORM_BUFFER: 0x8a11,\n  UNIFORM_BUFFER_BINDING: 0x8a28,\n  UNIFORM_BUFFER_START: 0x8a29,\n  UNIFORM_BUFFER_SIZE: 0x8a2a,\n  MAX_VERTEX_UNIFORM_BLOCKS: 0x8a2b,\n  MAX_FRAGMENT_UNIFORM_BLOCKS: 0x8a2d,\n  MAX_COMBINED_UNIFORM_BLOCKS: 0x8a2e,\n  MAX_UNIFORM_BUFFER_BINDINGS: 0x8a2f,\n  MAX_UNIFORM_BLOCK_SIZE: 0x8a30,\n  MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: 0x8a31,\n  MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: 0x8a33,\n  UNIFORM_BUFFER_OFFSET_ALIGNMENT: 0x8a34,\n  ACTIVE_UNIFORM_BLOCKS: 0x8a36,\n  UNIFORM_TYPE: 0x8a37,\n  UNIFORM_SIZE: 0x8a38,\n  UNIFORM_BLOCK_INDEX: 0x8a3a,\n  UNIFORM_OFFSET: 0x8a3b,\n  UNIFORM_ARRAY_STRIDE: 0x8a3c,\n  UNIFORM_MATRIX_STRIDE: 0x8a3d,\n  UNIFORM_IS_ROW_MAJOR: 0x8a3e,\n  UNIFORM_BLOCK_BINDING: 0x8a3f,\n  UNIFORM_BLOCK_DATA_SIZE: 0x8a40,\n  UNIFORM_BLOCK_ACTIVE_UNIFORMS: 0x8a42,\n  UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: 0x8a43,\n  UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: 0x8a44,\n  UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: 0x8a46,\n  // Sync objects\n  OBJECT_TYPE: 0x9112,\n  SYNC_CONDITION: 0x9113,\n  SYNC_STATUS: 0x9114,\n  SYNC_FLAGS: 0x9115,\n  SYNC_FENCE: 0x9116,\n  SYNC_GPU_COMMANDS_COMPLETE: 0x9117,\n  UNSIGNALED: 0x9118,\n  SIGNALED: 0x9119,\n  ALREADY_SIGNALED: 0x911a,\n  TIMEOUT_EXPIRED: 0x911b,\n  CONDITION_SATISFIED: 0x911c,\n  WAIT_FAILED: 0x911d,\n  SYNC_FLUSH_COMMANDS_BIT: 0x00000001,\n  // Miscellaneous constants\n  COLOR: 0x1800,\n  DEPTH: 0x1801,\n  STENCIL: 0x1802,\n  MIN: 0x8007,\n  MAX: 0x8008,\n  DEPTH_COMPONENT24: 0x81a6,\n  STREAM_READ: 0x88e1,\n  STREAM_COPY: 0x88e2,\n  STATIC_READ: 0x88e5,\n  STATIC_COPY: 0x88e6,\n  DYNAMIC_READ: 0x88e9,\n  DYNAMIC_COPY: 0x88ea,\n  DEPTH_COMPONENT32F: 0x8cac,\n  DEPTH32F_STENCIL8: 0x8cad,\n  INVALID_INDEX: 0xffffffff,\n  TIMEOUT_IGNORED: -1,\n  MAX_CLIENT_WAIT_TIMEOUT_WEBGL: 0x9247,\n  // Constants defined in WebGL extensions\n  // ANGLE_instanced_arrays\n  VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 0x88fe,\n  // WEBGL_debug_renderer_info\n  UNMASKED_VENDOR_WEBGL: 0x9245,\n  UNMASKED_RENDERER_WEBGL: 0x9246,\n  // EXT_texture_filter_anisotropic\n  MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0x84ff,\n  TEXTURE_MAX_ANISOTROPY_EXT: 0x84fe,\n  // WEBGL_compressed_texture_s3tc\n  COMPRESSED_RGB_S3TC_DXT1_EXT: 0x83f0,\n  COMPRESSED_RGBA_S3TC_DXT1_EXT: 0x83f1,\n  COMPRESSED_RGBA_S3TC_DXT3_EXT: 0x83f2,\n  COMPRESSED_RGBA_S3TC_DXT5_EXT: 0x83f3,\n  // WEBGL_compressed_texture_es3\n  COMPRESSED_R11_EAC: 0x9270,\n  COMPRESSED_SIGNED_R11_EAC: 0x9271,\n  COMPRESSED_RG11_EAC: 0x9272,\n  COMPRESSED_SIGNED_RG11_EAC: 0x9273,\n  COMPRESSED_RGB8_ETC2: 0x9274,\n  COMPRESSED_RGBA8_ETC2_EAC: 0x9275,\n  COMPRESSED_SRGB8_ETC2: 0x9276,\n  COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 0x9277,\n  COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9278,\n  COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 0x9279,\n  // WEBGL_compressed_texture_pvrtc\n  COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 0x8c00,\n  COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 0x8c02,\n  COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 0x8c01,\n  COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 0x8c03,\n  // WEBGL_compressed_texture_etc1\n  COMPRESSED_RGB_ETC1_WEBGL: 0x8d64,\n  // WEBGL_compressed_texture_atc\n  COMPRESSED_RGB_ATC_WEBGL: 0x8c92,\n  COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: 0x8c92,\n  COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: 0x87ee,\n  // WEBGL_depth_texture\n  UNSIGNED_INT_24_8_WEBGL: 0x84fa,\n  // OES_texture_half_float\n  HALF_FLOAT_OES: 0x8d61,\n  // WEBGL_color_buffer_float\n  RGBA32F_EXT: 0x8814,\n  RGB32F_EXT: 0x8815,\n  FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0x8211,\n  UNSIGNED_NORMALIZED_EXT: 0x8c17,\n  // EXT_blend_minmax\n  MIN_EXT: 0x8007,\n  MAX_EXT: 0x8008,\n  // EXT_sRGB\n  SRGB_EXT: 0x8c40,\n  SRGB_ALPHA_EXT: 0x8c42,\n  SRGB8_ALPHA8_EXT: 0x8c43,\n  FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: 0x8210,\n  // OES_standard_derivatives\n  FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 0x8b8b,\n  // WEBGL_draw_buffers\n  COLOR_ATTACHMENT0_WEBGL: 0x8ce0,\n  COLOR_ATTACHMENT1_WEBGL: 0x8ce1,\n  COLOR_ATTACHMENT2_WEBGL: 0x8ce2,\n  COLOR_ATTACHMENT3_WEBGL: 0x8ce3,\n  COLOR_ATTACHMENT4_WEBGL: 0x8ce4,\n  COLOR_ATTACHMENT5_WEBGL: 0x8ce5,\n  COLOR_ATTACHMENT6_WEBGL: 0x8ce6,\n  COLOR_ATTACHMENT7_WEBGL: 0x8ce7,\n  COLOR_ATTACHMENT8_WEBGL: 0x8ce8,\n  COLOR_ATTACHMENT9_WEBGL: 0x8ce9,\n  COLOR_ATTACHMENT10_WEBGL: 0x8cea,\n  COLOR_ATTACHMENT11_WEBGL: 0x8ceb,\n  COLOR_ATTACHMENT12_WEBGL: 0x8cec,\n  COLOR_ATTACHMENT13_WEBGL: 0x8ced,\n  COLOR_ATTACHMENT14_WEBGL: 0x8cee,\n  COLOR_ATTACHMENT15_WEBGL: 0x8cef,\n  DRAW_BUFFER0_WEBGL: 0x8825,\n  DRAW_BUFFER1_WEBGL: 0x8826,\n  DRAW_BUFFER2_WEBGL: 0x8827,\n  DRAW_BUFFER3_WEBGL: 0x8828,\n  DRAW_BUFFER4_WEBGL: 0x8829,\n  DRAW_BUFFER5_WEBGL: 0x882a,\n  DRAW_BUFFER6_WEBGL: 0x882b,\n  DRAW_BUFFER7_WEBGL: 0x882c,\n  DRAW_BUFFER8_WEBGL: 0x882d,\n  DRAW_BUFFER9_WEBGL: 0x882e,\n  DRAW_BUFFER10_WEBGL: 0x882f,\n  DRAW_BUFFER11_WEBGL: 0x8830,\n  DRAW_BUFFER12_WEBGL: 0x8831,\n  DRAW_BUFFER13_WEBGL: 0x8832,\n  DRAW_BUFFER14_WEBGL: 0x8833,\n  DRAW_BUFFER15_WEBGL: 0x8834,\n  MAX_COLOR_ATTACHMENTS_WEBGL: 0x8cdf,\n  MAX_DRAW_BUFFERS_WEBGL: 0x8824,\n  // OES_vertex_array_object\n  VERTEX_ARRAY_BINDING_OES: 0x85b5,\n  // EXT_disjoint_timer_query\n  QUERY_COUNTER_BITS_EXT: 0x8864,\n  CURRENT_QUERY_EXT: 0x8865,\n  QUERY_RESULT_EXT: 0x8866,\n  QUERY_RESULT_AVAILABLE_EXT: 0x8867,\n  TIME_ELAPSED_EXT: 0x88bf,\n  TIMESTAMP_EXT: 0x8e28,\n  GPU_DISJOINT_EXT: 0x8fbb // A Boolean indicating whether or not the GPU performed any disjoint operation.\n\n};\n//# sourceMappingURL=constants.js.map\n},{}],\"zLGf\":[function(require,module,exports) {\n// eslint-disable-next-line\nmodule.exports = require('./dist/es5/constants');\n\n},{\"./dist/es5/constants\":\"uYRW\"}],\"kLc7\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.glArrayFromType = glArrayFromType;\nexports.default = void 0;\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n/* eslint-disable complexity */\n\n\nvar DEFAULT_STATE = {\n  isExternalBuffer: false,\n  needsUpdate: true,\n  needsRedraw: false,\n  allocedInstances: -1\n};\n\nvar LayerAttribute =\n/*#__PURE__*/\nfunction (_Attribute) {\n  _inherits(LayerAttribute, _Attribute);\n\n  function LayerAttribute(gl) {\n    var _this;\n\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, LayerAttribute);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(LayerAttribute).call(this, gl, opts));\n    var _opts$transition = opts.transition,\n        transition = _opts$transition === void 0 ? false : _opts$transition,\n        _opts$noAlloc = opts.noAlloc,\n        noAlloc = _opts$noAlloc === void 0 ? false : _opts$noAlloc,\n        _opts$update = opts.update,\n        update = _opts$update === void 0 ? null : _opts$update,\n        _opts$accessor = opts.accessor,\n        accessor = _opts$accessor === void 0 ? null : _opts$accessor,\n        _opts$bufferLayout = opts.bufferLayout,\n        bufferLayout = _opts$bufferLayout === void 0 ? null : _opts$bufferLayout;\n    var _opts$defaultValue = opts.defaultValue,\n        defaultValue = _opts$defaultValue === void 0 ? [0, 0, 0, 0] : _opts$defaultValue;\n    defaultValue = Array.isArray(defaultValue) ? defaultValue : [defaultValue];\n    Object.assign(_this.userData, DEFAULT_STATE, opts, {\n      transition: transition,\n      noAlloc: noAlloc,\n      update: update,\n      accessor: accessor,\n      defaultValue: defaultValue,\n      bufferLayout: bufferLayout\n    });\n    Object.seal(_this.userData); // Check all fields and generate helpful error messages\n\n    _this._validateAttributeUpdaters();\n\n    return _this;\n  }\n\n  _createClass(LayerAttribute, [{\n    key: \"needsUpdate\",\n    value: function needsUpdate() {\n      return this.userData.needsUpdate;\n    }\n  }, {\n    key: \"needsRedraw\",\n    value: function needsRedraw() {\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref$clearChangedFlag = _ref.clearChangedFlags,\n          clearChangedFlags = _ref$clearChangedFlag === void 0 ? false : _ref$clearChangedFlag;\n\n      var needsRedraw = this.userData.needsRedraw;\n      this.userData.needsRedraw = this.userData.needsRedraw && !clearChangedFlags;\n      return needsRedraw;\n    }\n  }, {\n    key: \"getInstanceCount\",\n    value: function getInstanceCount() {\n      return this.value !== null ? this.value.length / this.size : 0;\n    }\n  }, {\n    key: \"getUpdateTriggers\",\n    value: function getUpdateTriggers() {\n      var accessor = this.userData.accessor; // Backards compatibility: allow attribute name to be used as update trigger key\n\n      return [this.id].concat(accessor || []);\n    }\n  }, {\n    key: \"getAccessor\",\n    value: function getAccessor() {\n      return this.userData.accessor;\n    }\n  }, {\n    key: \"supportsTransition\",\n    value: function supportsTransition() {\n      return this.userData.transition;\n    } // Resolve transition settings object if transition is enabled, otherwise `null`\n\n  }, {\n    key: \"getTransitionSetting\",\n    value: function getTransitionSetting(opts) {\n      var _this$userData = this.userData,\n          transition = _this$userData.transition,\n          accessor = _this$userData.accessor;\n\n      if (!transition) {\n        return null;\n      }\n\n      var settings = Array.isArray(accessor) ? opts[accessor.find(function (a) {\n        return opts[a];\n      })] : opts[accessor]; // Shorthand: use duration instead of parameter object\n\n      if (Number.isFinite(settings)) {\n        settings = {\n          duration: settings\n        };\n      }\n\n      if (settings && settings.duration > 0) {\n        return Object.assign({}, transition, settings);\n      }\n\n      return null;\n    } // Checks that typed arrays for attributes are big enough\n    // sets alloc flag if not\n    // @return {Boolean} whether any updates are needed\n\n  }, {\n    key: \"setNeedsUpdate\",\n    value: function setNeedsUpdate() {\n      var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.id;\n      this.userData.needsUpdate = this.userData.needsUpdate || reason;\n    }\n  }, {\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw() {\n      var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.id;\n      this.userData.needsRedraw = this.userData.needsRedraw || reason;\n    }\n  }, {\n    key: \"allocate\",\n    value: function allocate(numInstances) {\n      var state = this.userData;\n\n      if (state.isExternalBuffer || state.noAlloc) {\n        // Data is provided through a Buffer object.\n        return false;\n      } // Do we need to reallocate the attribute's typed array?\n\n\n      var instanceCount = this.getInstanceCount();\n      var needsAlloc = instanceCount === 0 || instanceCount < numInstances;\n\n      if (needsAlloc && (state.update || state.accessor)) {\n        (0, _assert.default)(Number.isFinite(numInstances)); // Allocate at least one element to ensure a valid buffer\n\n        var allocCount = Math.max(numInstances, 1);\n        var ArrayType = glArrayFromType(this.type || _constants.default.FLOAT);\n        this.constant = false;\n        this.value = new ArrayType(this.size * allocCount);\n        state.needsUpdate = true;\n        state.allocedInstances = allocCount;\n        return true;\n      }\n\n      return false;\n    }\n  }, {\n    key: \"updateBuffer\",\n    value: function updateBuffer(_ref2) {\n      var numInstances = _ref2.numInstances,\n          data = _ref2.data,\n          props = _ref2.props,\n          context = _ref2.context;\n\n      if (!this.needsUpdate()) {\n        return false;\n      }\n\n      var state = this.userData;\n      var update = state.update,\n          accessor = state.accessor;\n      var updated = true;\n\n      if (update) {\n        // Custom updater - typically for non-instanced layers\n        update.call(context, this, {\n          data: data,\n          props: props,\n          numInstances: numInstances\n        });\n        this.update({\n          value: this.value,\n          constant: this.constant\n        });\n\n        this._checkAttributeArray();\n      } else if (accessor) {\n        // Standard updater\n        this._updateBufferViaStandardAccessor(data, props);\n\n        this._checkAttributeArray();\n      } else {\n        updated = false;\n      }\n\n      state.needsUpdate = false;\n      state.needsRedraw = true;\n      return updated;\n    } // Use generic value\n    // Returns true if successful\n\n  }, {\n    key: \"setGenericValue\",\n    value: function setGenericValue(value) {\n      var state = this.userData;\n\n      if (value === undefined || typeof value === 'function') {\n        // ignore if this attribute has no accessor\n        // ignore if accessor is function, will be used in updateBuffer\n        state.isExternalBuffer = false;\n        return false;\n      }\n\n      value = this._normalizeValue(value);\n      var hasChanged = !this.constant || !this._areValuesEqual(value, this.value);\n\n      if (hasChanged) {\n        this.update({\n          constant: true,\n          value: value\n        });\n      }\n\n      state.needsRedraw = state.needsUpdate || hasChanged;\n      state.needsUpdate = false;\n      state.isExternalBuffer = true;\n      return true;\n    } // Use external buffer\n    // Returns true if successful\n\n  }, {\n    key: \"setExternalBuffer\",\n    value: function setExternalBuffer(buffer, numInstances) {\n      var state = this.userData;\n\n      if (buffer) {\n        state.isExternalBuffer = true;\n        state.needsUpdate = false;\n\n        if (buffer instanceof _luma.Buffer) {\n          if (this.externalBuffer !== buffer) {\n            this.update({\n              constant: false,\n              buffer: buffer\n            });\n            state.needsRedraw = true;\n          }\n        } else if (this.value !== buffer) {\n          if (!ArrayBuffer.isView(buffer)) {\n            throw new Error('Attribute prop must be typed array');\n          }\n\n          if (state.auto && buffer.length <= numInstances * this.size) {\n            throw new Error('Attribute prop array must match length and size');\n          }\n\n          var ArrayType = glArrayFromType(this.type || _constants.default.FLOAT);\n\n          if (buffer instanceof ArrayType) {\n            this.update({\n              constant: false,\n              value: buffer\n            });\n          } else {\n            _log.default.warn(\"Attribute prop \".concat(this.id, \" is casted to \").concat(ArrayType.name))(); // Cast to proper type\n\n\n            this.update({\n              constant: false,\n              value: new ArrayType(buffer)\n            });\n          } // Save original typed array\n\n\n          this.value = buffer;\n          state.needsRedraw = true;\n        }\n\n        return true;\n      }\n\n      state.isExternalBuffer = false;\n      return false;\n    } // PRIVATE HELPER METHODS\n\n    /* check user supplied values and apply fallback */\n\n  }, {\n    key: \"_normalizeValue\",\n    value: function _normalizeValue(value) {\n      var out = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n      var start = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n      var defaultValue = this.userData.defaultValue;\n\n      if (!Array.isArray(value) && !ArrayBuffer.isView(value)) {\n        out[start] = Number.isFinite(value) ? value : defaultValue[0];\n        return out;\n      }\n      /* eslint-disable no-fallthrough, default-case */\n\n\n      switch (this.size) {\n        case 4:\n          out[start + 3] = Number.isFinite(value[3]) ? value[3] : defaultValue[3];\n\n        case 3:\n          out[start + 2] = Number.isFinite(value[2]) ? value[2] : defaultValue[2];\n\n        case 2:\n          out[start + 1] = Number.isFinite(value[1]) ? value[1] : defaultValue[1];\n\n        case 1:\n          out[start + 0] = Number.isFinite(value[0]) ? value[0] : defaultValue[0];\n      }\n\n      return out;\n    }\n  }, {\n    key: \"_areValuesEqual\",\n    value: function _areValuesEqual(value1, value2) {\n      var size = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.size;\n\n      for (var i = 0; i < size; i++) {\n        if (value1[i] !== value2[i]) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n  }, {\n    key: \"_updateBufferViaStandardAccessor\",\n    value: function _updateBufferViaStandardAccessor(data, props) {\n      var state = this.userData;\n      var accessor = state.accessor;\n      var value = this.value,\n          size = this.size;\n      var accessorFunc = props[accessor];\n      (0, _assert.default)(typeof accessorFunc === 'function', \"accessor \\\"\".concat(accessor, \"\\\" is not a function\"));\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n          var objectValue = accessorFunc(object);\n\n          this._normalizeValue(objectValue, value, i);\n\n          i += size;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      this.update({\n        value: value\n      });\n    } // Validate deck.gl level fields\n\n  }, {\n    key: \"_validateAttributeUpdaters\",\n    value: function _validateAttributeUpdaters() {\n      var state = this.userData; // Check that either 'accessor' or 'update' is a valid function\n\n      var hasUpdater = state.noAlloc || typeof state.update === 'function' || typeof state.accessor === 'string';\n\n      if (!hasUpdater) {\n        throw new Error(\"Attribute \".concat(this.id, \" missing update or accessor\"));\n      }\n    }\n  }, {\n    key: \"_checkAttributeArray\",\n    value: function _checkAttributeArray() {\n      var value = this.value;\n\n      if (value && value.length >= 4) {\n        var valid = Number.isFinite(value[0]) && Number.isFinite(value[1]) && Number.isFinite(value[2]) && Number.isFinite(value[3]);\n\n        if (!valid) {\n          throw new Error(\"Illegal attribute generated for \".concat(this.id));\n        }\n      }\n    }\n  }, {\n    key: \"bufferLayout\",\n    get: function get() {\n      return this.userData.bufferLayout;\n    },\n    set: function set(layout) {\n      this.userData.bufferLayout = layout;\n    }\n  }]);\n\n  return LayerAttribute;\n}(_luma._Attribute);\n/* eslint-disable complexity */\n\n\nexports.default = LayerAttribute;\n\nfunction glArrayFromType(glType) {\n  var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref3$clamped = _ref3.clamped,\n      clamped = _ref3$clamped === void 0 ? true : _ref3$clamped; // Sorted in some order of likelihood to reduce amount of comparisons\n\n\n  switch (glType) {\n    case _constants.default.FLOAT:\n      return Float32Array;\n\n    case _constants.default.UNSIGNED_SHORT:\n    case _constants.default.UNSIGNED_SHORT_5_6_5:\n    case _constants.default.UNSIGNED_SHORT_4_4_4_4:\n    case _constants.default.UNSIGNED_SHORT_5_5_5_1:\n      return Uint16Array;\n\n    case _constants.default.UNSIGNED_INT:\n      return Uint32Array;\n\n    case _constants.default.UNSIGNED_BYTE:\n      return clamped ? Uint8ClampedArray : Uint8Array;\n\n    case _constants.default.BYTE:\n      return Int8Array;\n\n    case _constants.default.SHORT:\n      return Int16Array;\n\n    case _constants.default.INT:\n      return Int32Array;\n\n    default:\n      throw new Error('Failed to deduce type from array');\n  }\n}\n/* eslint-enable complexity */\n},{\"../utils/assert\":\"R2tg\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"../utils/log\":\"mqAj\"}],\"WdYA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.padArray = padArray;\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/*\n * Helper function for padArray\n */\nfunction padArrayChunk(_ref) {\n  var source = _ref.source,\n      target = _ref.target,\n      _ref$start = _ref.start,\n      start = _ref$start === void 0 ? 0 : _ref$start,\n      end = _ref.end,\n      getData = _ref.getData;\n  end = end || target.length;\n  var sourceLength = source.length;\n  var targetLength = end - start;\n\n  if (sourceLength > targetLength) {\n    target.set(source.subarray(0, targetLength), start);\n    return;\n  }\n\n  target.set(source, start);\n\n  if (!getData) {\n    return;\n  } // source is not large enough to fill target space, call `getData` to get filler data\n\n\n  var i = sourceLength;\n\n  while (i < targetLength) {\n    var datum = getData(i, source);\n\n    for (var j = 0; j < datum.length; j++) {\n      target[start + i] = datum[j];\n      i++;\n    }\n  }\n}\n/*\n * The padArray function stretches a source array to the size of a target array.\n   The arrays can have internal structures (like the attributes of PathLayer and\n   SolidPolygonLayer), defined by the optional sourceLayout and targetLayout parameters.\n   If the target array is larger, the getData callback is used to fill in the blanks.\n * @params {TypedArray} source - original data\n * @params {TypedArray} target - output data\n * @params {Number} size - length per datum\n * @params {Function} getData - callback to get new data when source is short\n * @params {Array<Number>} [sourceLayout] - subdivision of the original data in [chunkSize0, chunkSize1, ...]\n * @params {Array<Number>} [targetLayout] - subdivision of the output data in [chunkSize0, chunkSize1, ...]\n */\n\n\nfunction padArray(_ref2) {\n  var source = _ref2.source,\n      target = _ref2.target,\n      size = _ref2.size,\n      getData = _ref2.getData,\n      sourceLayout = _ref2.sourceLayout,\n      targetLayout = _ref2.targetLayout;\n\n  if (!Array.isArray(targetLayout)) {\n    // Flat arrays\n    padArrayChunk({\n      source: source,\n      target: target,\n      getData: getData\n    });\n    return target;\n  } // Arrays have internal structure\n\n\n  var sourceIndex = 0;\n  var targetIndex = 0;\n\n  var getChunkData = getData && function (i, chunk) {\n    return getData(i + targetIndex, chunk);\n  };\n\n  var n = Math.min(sourceLayout.length, targetLayout.length);\n\n  for (var i = 0; i < n; i++) {\n    var sourceChunkLength = sourceLayout[i] * size;\n    var targetChunkLength = targetLayout[i] * size;\n    padArrayChunk({\n      source: source.subarray(sourceIndex, sourceIndex + sourceChunkLength),\n      target: target,\n      start: targetIndex,\n      end: targetIndex + targetChunkLength,\n      getData: getChunkData\n    });\n    sourceIndex += sourceChunkLength;\n    targetIndex += targetChunkLength;\n  }\n\n  if (targetIndex < target.length) {\n    padArrayChunk({\n      source: [],\n      target: target,\n      start: targetIndex,\n      getData: getChunkData\n    });\n  }\n\n  return target;\n}\n},{}],\"EB5M\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getShaders = getShaders;\nexports.getBuffers = getBuffers;\nexports.padBuffer = padBuffer;\n\nvar _luma = require(\"luma.gl\");\n\nvar _arrayUtils = require(\"../utils/array-utils\");\n\nvar ATTRIBUTE_MAPPING = {\n  1: 'float',\n  2: 'vec2',\n  3: 'vec3',\n  4: 'vec4'\n};\n\nfunction getShaders(transitions) {\n  // Build shaders\n  var varyings = [];\n  var attributeDeclarations = [];\n  var uniformsDeclarations = [];\n  var varyingDeclarations = [];\n  var calculations = [];\n\n  for (var attributeName in transitions) {\n    var transition = transitions[attributeName];\n    var attributeType = ATTRIBUTE_MAPPING[transition.attribute.size];\n\n    if (attributeType) {\n      transition.bufferIndex = varyings.length;\n      varyings.push(attributeName);\n      attributeDeclarations.push(\"attribute \".concat(attributeType, \" \").concat(attributeName, \"From;\"));\n      attributeDeclarations.push(\"attribute \".concat(attributeType, \" \").concat(attributeName, \"To;\"));\n      uniformsDeclarations.push(\"uniform float \".concat(attributeName, \"Time;\"));\n      varyingDeclarations.push(\"varying \".concat(attributeType, \" \").concat(attributeName, \";\"));\n      calculations.push(\"\".concat(attributeName, \" = mix(\").concat(attributeName, \"From, \").concat(attributeName, \"To,\\n        \").concat(attributeName, \"Time);\"));\n    }\n  }\n\n  var vs = \"\\n#define SHADER_NAME feedback-vertex-shader\\n\".concat(attributeDeclarations.join('\\n'), \"\\n\").concat(uniformsDeclarations.join('\\n'), \"\\n\").concat(varyingDeclarations.join('\\n'), \"\\n\\nvoid main(void) {\\n  \").concat(calculations.join('\\n'), \"\\n  gl_Position = vec4(0.0);\\n}\\n\");\n  var fs = \"#define SHADER_NAME feedback-fragment-shader\\n\\nprecision highp float;\\n\\n\".concat(varyingDeclarations.join('\\n'), \"\\n\\nvoid main(void) {\\n  gl_FragColor = vec4(0.0);\\n}\\n\");\n  return {\n    vs: vs,\n    fs: fs,\n    varyings: varyings\n  };\n}\n\nfunction getBuffers(transitions) {\n  var sourceBuffers = {};\n  var feedbackBuffers = {};\n\n  for (var attributeName in transitions) {\n    var _transitions$attribut = transitions[attributeName],\n        fromState = _transitions$attribut.fromState,\n        toState = _transitions$attribut.toState,\n        buffer = _transitions$attribut.buffer;\n    sourceBuffers[\"\".concat(attributeName, \"From\")] = fromState;\n    sourceBuffers[\"\".concat(attributeName, \"To\")] = toState;\n    feedbackBuffers[\"\".concat(attributeName)] = buffer;\n  }\n\n  return {\n    sourceBuffers: sourceBuffers,\n    feedbackBuffers: feedbackBuffers\n  };\n}\n\nfunction padBuffer(_ref) {\n  var fromState = _ref.fromState,\n      toState = _ref.toState,\n      fromLength = _ref.fromLength,\n      toLength = _ref.toLength,\n      fromBufferLayout = _ref.fromBufferLayout,\n      toBufferLayout = _ref.toBufferLayout,\n      _ref$getData = _ref.getData,\n      getData = _ref$getData === void 0 ? function (x) {\n    return x;\n  } : _ref$getData;\n  var hasBufferLayout = fromBufferLayout && toBufferLayout; // check if buffer needs to be padded\n\n  if (!hasBufferLayout && fromLength >= toLength || !(fromState instanceof _luma.Buffer)) {\n    return;\n  }\n\n  var data = new Float32Array(toLength);\n  var fromData = fromState.getData({});\n  var value = toState.value,\n      buffer = toState.buffer,\n      size = toState.size,\n      constant = toState.constant;\n  var toData = value || buffer.getData({});\n  var getMissingData = constant ? function (i, chunk) {\n    return getData(value, chunk);\n  } : function (i, chunk) {\n    return getData(toData.subarray(i, i + size), chunk);\n  };\n  (0, _arrayUtils.padArray)({\n    source: fromData,\n    target: data,\n    sourceLayout: fromBufferLayout,\n    targetLayout: toBufferLayout,\n    size: toState.size,\n    getData: getMissingData\n  });\n  fromState.setData({\n    data: data\n  });\n}\n},{\"luma.gl\":\"iiNl\",\"../utils/array-utils\":\"WdYA\"}],\"fVmt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.TRANSITION_STATE = void 0;\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nvar TRANSITION_STATE = {\n  NONE: 'none',\n  PENDING: 'pending',\n  IN_PROGRESS: 'in_progress',\n  ENDED: 'ended'\n};\nexports.TRANSITION_STATE = TRANSITION_STATE;\n\nfunction noop() {}\n\nvar Transition =\n/*#__PURE__*/\nfunction () {\n  /**\n   * @params props {object} - properties of the transition.\n   *\n   * @params props.duration {number} - total time to complete the transition\n   * @params props.easing {func} - easing function\n   * @params props.onStart {func} - callback when transition starts\n   * @params props.onUpdate {func} - callback when transition updates\n   * @params props.onInterrupt {func} - callback when transition is interrupted\n   * @params props.onEnd {func} - callback when transition ends\n   *\n   * Any additional properties are also saved on the instance but have no effect.\n   */\n  function Transition(props) {\n    _classCallCheck(this, Transition);\n\n    this._startTime = null;\n    this._state = TRANSITION_STATE.NONE; // Defaults\n\n    this.duration = 1;\n\n    this.easing = function (t) {\n      return t;\n    };\n\n    this.onStart = noop;\n    this.onUpdate = noop;\n    this.onInterrupt = noop;\n    this.onEnd = noop;\n    Object.assign(this, props);\n  }\n  /* Public API */\n\n\n  _createClass(Transition, [{\n    key: \"start\",\n\n    /**\n     * (re)start this transition.\n     * @params props {object} - optional overriding props. see constructor\n     */\n    value: function start(props) {\n      if (this.inProgress) {\n        this.onInterrupt(this);\n      }\n\n      Object.assign(this, props);\n\n      this._setState(TRANSITION_STATE.PENDING);\n    }\n    /**\n     * cancel this transition if it is in progress.\n     */\n\n  }, {\n    key: \"cancel\",\n    value: function cancel() {\n      if (this.inProgress) {\n        this.onInterrupt(this);\n\n        this._setState(TRANSITION_STATE.NONE);\n      }\n    }\n    /**\n     * update this transition.\n     * @params currentTime {number} - timestamp of the update. should be in the same unit as `duration`.\n     */\n\n  }, {\n    key: \"update\",\n    value: function update(currentTime) {\n      if (this.state === TRANSITION_STATE.PENDING) {\n        this._startTime = currentTime;\n\n        this._setState(TRANSITION_STATE.IN_PROGRESS);\n      }\n\n      if (this.state === TRANSITION_STATE.IN_PROGRESS) {\n        var shouldEnd = false;\n        var time = (currentTime - this._startTime) / this.duration;\n\n        if (time >= 1) {\n          time = 1;\n          shouldEnd = true;\n        }\n\n        this.time = this.easing(time);\n        this.onUpdate(this);\n\n        if (shouldEnd) {\n          this._setState(TRANSITION_STATE.ENDED);\n        }\n\n        return true;\n      }\n\n      return false;\n    }\n    /* Private API */\n\n  }, {\n    key: \"_setState\",\n    value: function _setState(newState) {\n      if (this._state === newState) {\n        return;\n      }\n\n      this._state = newState;\n\n      switch (newState) {\n        case TRANSITION_STATE.PENDING:\n          this.onStart(this);\n          break;\n\n        case TRANSITION_STATE.ENDED:\n          this.onEnd(this);\n          break;\n\n        default:\n      }\n    }\n  }, {\n    key: \"state\",\n    get: function get() {\n      return this._state;\n    }\n  }, {\n    key: \"inProgress\",\n    get: function get() {\n      return this._state === TRANSITION_STATE.PENDING || this._state === TRANSITION_STATE.IN_PROGRESS;\n    }\n  }]);\n\n  return Transition;\n}();\n\nexports.default = Transition;\n},{}],\"GCyh\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _attributeTransitionUtils = require(\"./attribute-transition-utils\");\n\nvar _attribute = _interopRequireDefault(require(\"./attribute\"));\n\nvar _transition = _interopRequireDefault(require(\"../transitions/transition\"));\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nvar noop = function noop() {};\n\nvar DEFAULT_TRANSITION_SETTINGS = {\n  duration: 0,\n  easing: function easing(t) {\n    return t;\n  },\n  onStart: noop,\n  onEnd: noop,\n  onInterrupt: noop\n};\n\nvar AttributeTransitionManager =\n/*#__PURE__*/\nfunction () {\n  function AttributeTransitionManager(gl, _ref) {\n    var id = _ref.id;\n\n    _classCallCheck(this, AttributeTransitionManager);\n\n    this.id = id;\n    this.gl = gl;\n    this.attributeTransitions = {};\n    this.needsRedraw = false;\n    this.transform = null;\n    this.numInstances = 0;\n\n    if (_luma.Transform.isSupported(gl)) {\n      this.isSupported = true;\n    } else if (gl) {\n      // This class may be instantiated without a WebGL context (e.g. web worker)\n      _log.default.warn('WebGL2 not supported by this browser. Transition animation is disabled.')();\n    }\n  }\n\n  _createClass(AttributeTransitionManager, [{\n    key: \"finalize\",\n    value: function finalize() {\n      if (this.transform) {\n        this.transform.delete();\n      }\n\n      for (var attributeName in this.attributeTransitions) {\n        this._removeTransition(attributeName);\n      }\n    }\n    /* Public methods */\n    // Called when attribute manager updates\n    // Check the latest attributes for updates.\n\n  }, {\n    key: \"update\",\n    value: function update(_ref2) {\n      var attributes = _ref2.attributes,\n          _ref2$transitions = _ref2.transitions,\n          transitions = _ref2$transitions === void 0 ? {} : _ref2$transitions,\n          numInstances = _ref2.numInstances;\n      this.opts = transitions; // Transform class will crash if elementCount is 0\n\n      this.numInstances = numInstances || 1;\n\n      if (!this.isSupported) {\n        return;\n      }\n\n      var attributeTransitions = this.attributeTransitions;\n      var changedTransitions = {};\n\n      for (var attributeName in attributes) {\n        var hasChanged = this._updateAttribute(attributeName, attributes[attributeName]);\n\n        if (hasChanged) {\n          changedTransitions[attributeName] = attributeTransitions[attributeName];\n        }\n      }\n\n      for (var _attributeName in attributeTransitions) {\n        var attribute = attributes[_attributeName];\n\n        if (!attribute || !attribute.supportsTransition()) {\n          // Animated attribute has been removed\n          this._removeTransition(_attributeName);\n        }\n      }\n\n      if (!this.transform) {\n        this._createModel();\n      } else if (this.transform) {\n        var _getBuffers = (0, _attributeTransitionUtils.getBuffers)(changedTransitions),\n            sourceBuffers = _getBuffers.sourceBuffers,\n            feedbackBuffers = _getBuffers.feedbackBuffers;\n\n        this.transform.update({\n          elementCount: this.numInstances,\n          sourceBuffers: sourceBuffers,\n          feedbackBuffers: feedbackBuffers\n        });\n      }\n    } // Returns `true` if attribute is transition-enabled\n\n  }, {\n    key: \"hasAttribute\",\n    value: function hasAttribute(attributeName) {\n      return attributeName in this.attributeTransitions;\n    } // Get all the animated attributes\n\n  }, {\n    key: \"getAttributes\",\n    value: function getAttributes() {\n      var animatedAttributes = {};\n\n      for (var attributeName in this.attributeTransitions) {\n        var transition = this.attributeTransitions[attributeName];\n\n        if (transition.buffer) {\n          animatedAttributes[attributeName] = transition.attributeInTransition;\n        }\n      }\n\n      return animatedAttributes;\n    }\n    /* eslint-disable max-statements */\n    // Called every render cycle, run transform feedback\n    // Returns `true` if anything changes\n\n  }, {\n    key: \"setCurrentTime\",\n    value: function setCurrentTime(currentTime) {\n      if (!this.transform || this.numInstances === 0) {\n        return false;\n      }\n\n      var uniforms = {};\n      var needsRedraw = this.needsRedraw;\n      this.needsRedraw = false;\n\n      for (var attributeName in this.attributeTransitions) {\n        var transition = this.attributeTransitions[attributeName];\n        var updated = transition.update(currentTime);\n\n        if (updated) {\n          uniforms[\"\".concat(attributeName, \"Time\")] = transition.time;\n          needsRedraw = true;\n        }\n      }\n\n      if (needsRedraw) {\n        this.transform.run({\n          uniforms: uniforms\n        });\n      }\n\n      return needsRedraw;\n    }\n    /* eslint-enable max-statements */\n\n    /* Private methods */\n\n  }, {\n    key: \"_createTransition\",\n    value: function _createTransition(attributeName, attribute) {\n      var transition = this.attributeTransitions[attributeName];\n\n      if (!transition) {\n        transition = new _transition.default({\n          name: attributeName,\n          attribute: attribute,\n          attributeInTransition: new _attribute.default(this.gl, attribute),\n          bufferLayout: attribute.bufferLayout\n        });\n        this.attributeTransitions[attributeName] = transition;\n\n        this._invalidateModel();\n\n        return transition;\n      }\n\n      return null;\n    }\n  }, {\n    key: \"_removeTransition\",\n    value: function _removeTransition(attributeName) {\n      var transition = this.attributeTransitions[attributeName];\n\n      if (transition) {\n        if (transition.buffer) {\n          transition.buffer.delete();\n        }\n\n        if (transition._swapBuffer) {\n          transition._swapBuffer.delete();\n        }\n\n        delete this.attributeTransitions[attributeName];\n\n        this._invalidateModel();\n      }\n    } // Check an attributes for updates\n    // Returns a transition object if a new transition is triggered.\n\n  }, {\n    key: \"_updateAttribute\",\n    value: function _updateAttribute(attributeName, attribute) {\n      var settings = attribute.getTransitionSetting(this.opts);\n\n      if (settings) {\n        var hasChanged;\n        var transition = this.attributeTransitions[attributeName];\n\n        if (transition) {\n          hasChanged = attribute.needsRedraw();\n        } else {\n          // New animated attributes have been added\n          transition = this._createTransition(attributeName, attribute);\n          hasChanged = true;\n        }\n\n        if (hasChanged) {\n          this._triggerTransition(transition, settings);\n\n          return true;\n        }\n      }\n\n      return false;\n    } // Invalidates the current model\n\n  }, {\n    key: \"_invalidateModel\",\n    value: function _invalidateModel() {\n      if (this.transform) {\n        this.transform.delete();\n        this.transform = null;\n      }\n    } // Create a model for the transform feedback\n\n  }, {\n    key: \"_createModel\",\n    value: function _createModel() {\n      if (Object.keys(this.attributeTransitions).length === 0) {\n        // no transitions\n        return;\n      }\n\n      this.transform = new _luma.Transform(this.gl, Object.assign({\n        elementCount: this.numInstances\n      }, (0, _attributeTransitionUtils.getBuffers)(this.attributeTransitions), (0, _attributeTransitionUtils.getShaders)(this.attributeTransitions)));\n    } // get current values of an attribute, clipped/padded to the size of the new buffer\n\n  }, {\n    key: \"_getNextTransitionStates\",\n    value: function _getNextTransitionStates(transition, settings) {\n      var attribute = transition.attribute;\n      var size = attribute.size;\n      var toState;\n\n      if (attribute.constant) {\n        toState = {\n          constant: true,\n          value: attribute.value,\n          size: size\n        };\n      } else {\n        toState = {\n          constant: false,\n          buffer: attribute.getBuffer(),\n          size: size,\n          // attribute's `value` does not match the content of external buffer,\n          // will need to call buffer.getData if needed\n          value: attribute.externalBuffer ? null : attribute.value\n        };\n      }\n\n      var fromState = transition.buffer || toState;\n      var toLength = this.numInstances * size;\n      var fromLength = fromState instanceof _luma.Buffer && fromState.getElementCount() || toLength; // Alternate between two buffers when new transitions start.\n      // Last destination buffer is used as an attribute (from state),\n      // And the other buffer is now the destination buffer.\n\n      var buffer = transition._swapBuffer;\n      transition._swapBuffer = transition.buffer;\n\n      if (!buffer) {\n        buffer = new _luma.Buffer(this.gl, {\n          data: new Float32Array(toLength),\n          usage: _constants.default.DYNAMIC_COPY\n        });\n      } else if (buffer.getElementCount() < toLength) {\n        // Pad buffers to be the same length\n        buffer.setData({\n          data: new Float32Array(toLength)\n        });\n      }\n\n      transition.attributeInTransition.update({\n        buffer: buffer\n      });\n      (0, _attributeTransitionUtils.padBuffer)({\n        fromState: fromState,\n        toState: toState,\n        fromLength: fromLength,\n        toLength: toLength,\n        fromBufferLayout: transition.bufferLayout,\n        toBufferLayout: attribute.bufferLayout,\n        getData: settings.enter\n      });\n      transition.bufferLayout = attribute.bufferLayout;\n      return {\n        fromState: fromState,\n        toState: toState,\n        buffer: buffer\n      };\n    } // Start a new transition using the current settings\n    // Updates transition state and from/to buffer\n\n  }, {\n    key: \"_triggerTransition\",\n    value: function _triggerTransition(transition, settings) {\n      // Check if settings is valid\n      (0, _assert.default)(settings && settings.duration > 0);\n      this.needsRedraw = true;\n      var transitionSettings = Object.assign({}, DEFAULT_TRANSITION_SETTINGS, settings); // Attribute descriptor to transition from\n\n      transition.start(Object.assign({}, this._getNextTransitionStates(transition, settings), transitionSettings));\n    }\n  }]);\n\n  return AttributeTransitionManager;\n}();\n\nexports.default = AttributeTransitionManager;\n},{\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./attribute-transition-utils\":\"EB5M\",\"./attribute\":\"kLc7\",\"../transitions/transition\":\"fVmt\",\"../utils/log\":\"mqAj\",\"../utils/assert\":\"R2tg\"}],\"c12z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _attribute = _interopRequireDefault(require(\"./attribute\"));\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _attributeTransitionManager = _interopRequireDefault(require(\"./attribute-transition-manager\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* eslint-disable guard-for-in */\n\n\nvar LOG_START_END_PRIORITY = 2;\nvar LOG_DETAIL_PRIORITY = 3;\n\nfunction noop() {} // Default loggers\n\n\nvar logFunctions = {\n  savedMessages: null,\n  timeStart: null,\n  onLog: function onLog(_ref) {\n    var level = _ref.level,\n        message = _ref.message;\n\n    _log.default.log(level, message)();\n  },\n  onUpdateStart: function onUpdateStart(_ref2) {\n    var level = _ref2.level,\n        numInstances = _ref2.numInstances;\n    logFunctions.savedMessages = [];\n    logFunctions.timeStart = new Date();\n  },\n  onUpdate: function onUpdate(_ref3) {\n    var level = _ref3.level,\n        message = _ref3.message;\n\n    if (logFunctions.savedMessages) {\n      logFunctions.savedMessages.push(message);\n    }\n  },\n  onUpdateEnd: function onUpdateEnd(_ref4) {\n    var level = _ref4.level,\n        id = _ref4.id,\n        numInstances = _ref4.numInstances;\n    var timeMs = Math.round(new Date() - logFunctions.timeStart);\n    var time = \"\".concat(timeMs, \"ms\");\n\n    _log.default.group(level, \"Updated attributes for \".concat(numInstances, \" instances in \").concat(id, \" in \").concat(time), {\n      collapsed: true\n    })();\n\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n\n    try {\n      for (var _iterator = logFunctions.savedMessages[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n        var message = _step.value;\n\n        _log.default.log(level, message)();\n      }\n    } catch (err) {\n      _didIteratorError = true;\n      _iteratorError = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion && _iterator.return != null) {\n          _iterator.return();\n        }\n      } finally {\n        if (_didIteratorError) {\n          throw _iteratorError;\n        }\n      }\n    }\n\n    _log.default.groupEnd(level, \"Updated attributes for \".concat(numInstances, \" instances in \").concat(id, \" in \").concat(time))();\n\n    logFunctions.savedMessages = null;\n  }\n};\n\nvar AttributeManager =\n/*#__PURE__*/\nfunction () {\n  _createClass(AttributeManager, null, [{\n    key: \"setDefaultLogFunctions\",\n\n    /**\n     * Sets log functions to help trace or time attribute updates.\n     * Default logging uses deck logger.\n     *\n     * `onLog` is called for each attribute.\n     *\n     * To enable detailed control of timming and e.g. hierarchical logging,\n     * hooks are also provided for update start and end.\n     *\n     * @param {Object} [opts]\n     * @param {String} [onLog=] - called to print\n     * @param {String} [onUpdateStart=] - called before update() starts\n     * @param {String} [onUpdateEnd=] - called after update() ends\n     */\n    value: function setDefaultLogFunctions() {\n      var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          onLog = _ref5.onLog,\n          onUpdateStart = _ref5.onUpdateStart,\n          onUpdate = _ref5.onUpdate,\n          onUpdateEnd = _ref5.onUpdateEnd;\n\n      if (onLog !== undefined) {\n        logFunctions.onLog = onLog || noop;\n      }\n\n      if (onUpdateStart !== undefined) {\n        logFunctions.onUpdateStart = onUpdateStart || noop;\n      }\n\n      if (onUpdate !== undefined) {\n        logFunctions.onUpdate = onUpdate || noop;\n      }\n\n      if (onUpdateEnd !== undefined) {\n        logFunctions.onUpdateEnd = onUpdateEnd || noop;\n      }\n    }\n    /**\n     * @classdesc\n     * Automated attribute generation and management. Suitable when a set of\n     * vertex shader attributes are generated by iteration over a data array,\n     * and updates to these attributes are needed either when the data itself\n     * changes, or when other data relevant to the calculations change.\n     *\n     * - First the application registers descriptions of its dynamic vertex\n     *   attributes using AttributeManager.add().\n     * - Then, when any change that affects attributes is detected by the\n     *   application, the app will call AttributeManager.invalidate().\n     * - Finally before it renders, it calls AttributeManager.update() to\n     *   ensure that attributes are automatically rebuilt if anything has been\n     *   invalidated.\n     *\n     * The application provided update functions describe how attributes\n     * should be updated from a data array and are expected to traverse\n     * that data array (or iterable) and fill in the attribute's typed array.\n     *\n     * Note that the attribute manager intentionally does not do advanced\n     * change detection, but instead makes it easy to build such detection\n     * by offering the ability to \"invalidate\" each attribute separately.\n     */\n\n  }]);\n\n  function AttributeManager(gl) {\n    var _ref6 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        _ref6$id = _ref6.id,\n        id = _ref6$id === void 0 ? 'attribute-manager' : _ref6$id,\n        stats = _ref6.stats;\n\n    _classCallCheck(this, AttributeManager);\n\n    this.id = id;\n    this.gl = gl;\n    this.attributes = {};\n    this.updateTriggers = {};\n    this.accessors = {};\n    this.needsRedraw = true;\n    this.userData = {};\n    this.stats = stats;\n    this.attributeTransitionManager = new _attributeTransitionManager.default(gl, {\n      id: \"\".concat(id, \"-transitions\")\n    }); // For debugging sanity, prevent uninitialized members\n\n    Object.seal(this);\n  }\n\n  _createClass(AttributeManager, [{\n    key: \"finalize\",\n    value: function finalize() {\n      for (var attributeName in this.attributes) {\n        this.attributes[attributeName].delete();\n      }\n\n      this.attributeTransitionManager.finalize();\n    } // Returns the redraw flag, optionally clearing it.\n    // Redraw flag will be set if any attributes attributes changed since\n    // flag was last cleared.\n    //\n    // @param {String} [clearRedrawFlags=false] - whether to clear the flag\n    // @return {false|String} - reason a redraw is needed.\n\n  }, {\n    key: \"getNeedsRedraw\",\n    value: function getNeedsRedraw() {\n      var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref7$clearRedrawFlag = _ref7.clearRedrawFlags,\n          clearRedrawFlags = _ref7$clearRedrawFlag === void 0 ? false : _ref7$clearRedrawFlag;\n\n      var redraw = this.needsRedraw;\n      this.needsRedraw = this.needsRedraw && !clearRedrawFlags;\n      return redraw && this.id;\n    } // Sets the redraw flag.\n    // @param {Boolean} redraw=true\n    // @return {AttributeManager} - for chaining\n\n  }, {\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw() {\n      var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n      this.needsRedraw = true;\n      return this;\n    } // Adds attributes\n\n  }, {\n    key: \"add\",\n    value: function add(attributes, updaters) {\n      this._add(attributes, updaters);\n    } // Adds attributes\n\n  }, {\n    key: \"addInstanced\",\n    value: function addInstanced(attributes, updaters) {\n      this._add(attributes, updaters, {\n        instanced: 1\n      });\n    }\n    /**\n     * Removes attributes\n     * Takes an array of attribute names and delete them from\n     * the attribute map if they exists\n     *\n     * @example\n     * attributeManager.remove(['position']);\n     *\n     * @param {Object} attributeNameArray - attribute name array (see above)\n     */\n\n  }, {\n    key: \"remove\",\n    value: function remove(attributeNameArray) {\n      for (var i = 0; i < attributeNameArray.length; i++) {\n        var name = attributeNameArray[i];\n\n        if (this.attributes[name] !== undefined) {\n          this.attributes[name].delete();\n          delete this.attributes[name];\n        }\n      }\n    } // Marks an attribute for update\n\n  }, {\n    key: \"invalidate\",\n    value: function invalidate(triggerName) {\n      var invalidatedAttributes = this._invalidateTrigger(triggerName); // For performance tuning\n\n\n      logFunctions.onLog({\n        level: LOG_DETAIL_PRIORITY,\n        message: \"invalidated attributes \".concat(invalidatedAttributes, \" (\").concat(triggerName, \") for \").concat(this.id)\n      });\n    }\n  }, {\n    key: \"invalidateAll\",\n    value: function invalidateAll() {\n      for (var attributeName in this.attributes) {\n        this.attributes[attributeName].setNeedsUpdate();\n      } // For performance tuning\n\n\n      logFunctions.onLog({\n        level: LOG_DETAIL_PRIORITY,\n        message: \"invalidated all attributes for \".concat(this.id)\n      });\n    } // Ensure all attribute buffers are updated from props or data.\n\n  }, {\n    key: \"update\",\n    value: function update() {\n      var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          data = _ref8.data,\n          numInstances = _ref8.numInstances,\n          transitions = _ref8.transitions,\n          _ref8$props = _ref8.props,\n          props = _ref8$props === void 0 ? {} : _ref8$props,\n          _ref8$buffers = _ref8.buffers,\n          buffers = _ref8$buffers === void 0 ? {} : _ref8$buffers,\n          _ref8$context = _ref8.context,\n          context = _ref8$context === void 0 ? {} : _ref8$context; // keep track of whether some attributes are updated\n\n\n      var updated = false;\n      logFunctions.onUpdateStart({\n        level: LOG_START_END_PRIORITY,\n        id: this.id,\n        numInstances: numInstances\n      });\n\n      if (this.stats) {\n        this.stats.timeStart('attribute updates', this.id);\n      }\n\n      for (var attributeName in this.attributes) {\n        var attribute = this.attributes[attributeName];\n\n        if (attribute.setExternalBuffer(buffers[attributeName], this.numInstances)) {// Attribute is using external buffer from the props\n        } else if (attribute.setGenericValue(props[attribute.getAccessor()])) {// Attribute is using generic value from the props\n        } else if (attribute.needsUpdate()) {\n          updated = true;\n\n          this._updateAttribute({\n            attribute: attribute,\n            numInstances: numInstances,\n            data: data,\n            props: props,\n            context: context\n          });\n        }\n\n        this.needsRedraw |= attribute.needsRedraw();\n      }\n\n      if (updated) {\n        // Only initiate alloc/update (and logging) if actually needed\n        if (this.stats) {\n          this.stats.timeEnd('attribute updates', this.id);\n        }\n\n        logFunctions.onUpdateEnd({\n          level: LOG_START_END_PRIORITY,\n          id: this.id,\n          numInstances: numInstances\n        });\n      }\n\n      this.attributeTransitionManager.update({\n        attributes: this.attributes,\n        numInstances: numInstances,\n        transitions: transitions\n      });\n    } // Update attribute transition to the current timestamp\n    // Returns `true` if any transition is in progress\n\n  }, {\n    key: \"updateTransition\",\n    value: function updateTransition() {\n      var attributeTransitionManager = this.attributeTransitionManager;\n      var transitionUpdated = attributeTransitionManager.setCurrentTime(Date.now());\n      this.needsRedraw = this.needsRedraw || transitionUpdated;\n      return transitionUpdated;\n    }\n    /**\n     * Returns all attribute descriptors\n     * Note: Format matches luma.gl Model/Program.setAttributes()\n     * @return {Object} attributes - descriptors\n     */\n\n  }, {\n    key: \"getAttributes\",\n    value: function getAttributes() {\n      return this.attributes;\n    }\n    /**\n     * Returns changed attribute descriptors\n     * This indicates which WebGLBuggers need to be updated\n     * @return {Object} attributes - descriptors\n     */\n\n  }, {\n    key: \"getChangedAttributes\",\n    value: function getChangedAttributes(_ref9) {\n      var _ref9$clearChangedFla = _ref9.clearChangedFlags,\n          clearChangedFlags = _ref9$clearChangedFla === void 0 ? false : _ref9$clearChangedFla;\n      var attributes = this.attributes,\n          attributeTransitionManager = this.attributeTransitionManager;\n      var changedAttributes = Object.assign({}, attributeTransitionManager.getAttributes());\n\n      for (var attributeName in attributes) {\n        var attribute = attributes[attributeName];\n\n        if (attribute.needsRedraw({\n          clearChangedFlags: true\n        })) {\n          // Only return non-transition attributes\n          if (!attributeTransitionManager.hasAttribute(attributeName)) {\n            changedAttributes[attributeName] = attribute;\n          }\n        }\n      }\n\n      return changedAttributes;\n    } // PROTECTED METHODS - Only to be used by collaborating classes, not by apps\n    // Returns object containing all accessors as keys, with non-null values\n    // @return {Object} - accessors object\n\n  }, {\n    key: \"getAccessors\",\n    value: function getAccessors() {\n      return this.updateTriggers;\n    } // PRIVATE METHODS\n    // Used to register an attribute\n\n  }, {\n    key: \"_add\",\n    value: function _add(attributes, updaters) {\n      var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n      if (updaters) {\n        _log.default.warn('AttributeManager.add({updaters}) - updater map no longer supported')();\n      }\n\n      var newAttributes = {};\n\n      for (var attributeName in attributes) {\n        var attribute = attributes[attributeName]; // Initialize the attribute descriptor, with WebGL and metadata fields\n\n        newAttributes[attributeName] = new _attribute.default(this.gl, Object.assign({}, attribute, {\n          id: attributeName,\n          // Luma fields\n          constant: attribute.constant || false,\n          isIndexed: attribute.isIndexed || attribute.elements,\n          size: attribute.elements && 1 || attribute.size,\n          value: attribute.value || null,\n          instanced: attribute.instanced || extraProps.instanced\n        }));\n      }\n\n      Object.assign(this.attributes, newAttributes);\n\n      this._mapUpdateTriggersToAttributes();\n    }\n    /* eslint-enable max-statements */\n    // build updateTrigger name to attribute name mapping\n\n  }, {\n    key: \"_mapUpdateTriggersToAttributes\",\n    value: function _mapUpdateTriggersToAttributes() {\n      var _this = this;\n\n      var triggers = {};\n\n      var _loop = function _loop(attributeName) {\n        var attribute = _this.attributes[attributeName];\n        attribute.getUpdateTriggers().forEach(function (triggerName) {\n          if (!triggers[triggerName]) {\n            triggers[triggerName] = [];\n          }\n\n          triggers[triggerName].push(attributeName);\n        });\n      };\n\n      for (var attributeName in this.attributes) {\n        _loop(attributeName);\n      }\n\n      this.updateTriggers = triggers;\n    }\n  }, {\n    key: \"_invalidateTrigger\",\n    value: function _invalidateTrigger(triggerName) {\n      var attributes = this.attributes,\n          updateTriggers = this.updateTriggers;\n      var invalidatedAttributes = updateTriggers[triggerName];\n\n      if (invalidatedAttributes) {\n        invalidatedAttributes.forEach(function (name) {\n          var attribute = attributes[name];\n\n          if (attribute) {\n            attribute.setNeedsUpdate();\n          }\n        });\n      } else {\n        var message = \"invalidating non-existent trigger \".concat(triggerName, \" for \").concat(this.id, \"\\n\");\n        message += \"Valid triggers: \".concat(Object.keys(attributes).join(', '));\n\n        _log.default.warn(message, invalidatedAttributes)();\n      }\n\n      return invalidatedAttributes;\n    }\n  }, {\n    key: \"_updateAttribute\",\n    value: function _updateAttribute(_ref10) {\n      var attribute = _ref10.attribute,\n          numInstances = _ref10.numInstances,\n          data = _ref10.data,\n          props = _ref10.props,\n          context = _ref10.context;\n\n      if (attribute.allocate(numInstances)) {\n        logFunctions.onUpdate({\n          level: LOG_DETAIL_PRIORITY,\n          message: \"\".concat(attribute.id, \" allocated \").concat(numInstances),\n          id: this.id\n        });\n      } // Calls update on any buffers that need update\n\n\n      var timeStart = Date.now();\n      var updated = attribute.updateBuffer({\n        numInstances: numInstances,\n        data: data,\n        props: props,\n        context: context\n      });\n\n      if (updated) {\n        this.needsRedraw = true;\n        var timeMs = Math.round(Date.now() - timeStart);\n        logFunctions.onUpdate({\n          level: LOG_DETAIL_PRIORITY,\n          message: \"\".concat(attribute.id, \" updated \").concat(numInstances, \" in \").concat(timeMs, \"ms\")\n        });\n      }\n    }\n  }]);\n\n  return AttributeManager;\n}();\n\nexports.default = AttributeManager;\n},{\"./attribute\":\"kLc7\",\"../utils/log\":\"mqAj\",\"./attribute-transition-manager\":\"GCyh\"}],\"ht98\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.removeLayerInSeer = exports.updateLayerInSeer = exports.initLayerInSeer = exports.seerInitListener = exports.layerEditListener = exports.applyPropOverrides = exports.setPropOverrides = void 0;\n\nvar _seer = _interopRequireDefault(require(\"seer\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _iterableToArray(iter) {\n  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  }\n}\n\n/**\n * Recursively set a nested property of an object given a properties array and a value\n */\nvar recursiveSet = function recursiveSet(obj, path, value) {\n  if (!obj) {\n    return;\n  }\n\n  if (path.length > 1) {\n    recursiveSet(obj[path[0]], path.slice(1), value);\n  } else {\n    obj[path[0]] = value;\n  }\n};\n\nvar overrides = new Map();\n/**\n * Create an override on the specify layer, indexed by a valuePath array.\n * Do nothing in case Seer as not been initialized to prevent any preformance drawback.\n */\n\nvar setPropOverrides = function setPropOverrides(id, valuePath, value) {\n  if (!_seer.default.isReady()) {\n    return;\n  }\n\n  if (!overrides.has(id)) {\n    overrides.set(id, new Map());\n  }\n\n  var props = overrides.get(id);\n  props.set(valuePath, value);\n};\n/**\n * Get the props overrides of a specific layer if Seer as been initialized\n * Invalidates the data to be sure new ones are always picked up.\n */\n\n\nexports.setPropOverrides = setPropOverrides;\n\nvar applyPropOverrides = function applyPropOverrides(props) {\n  if (!_seer.default.isReady() || !props.id) {\n    return;\n  }\n\n  var overs = overrides.get(props.id);\n\n  if (!overs) {\n    return;\n  }\n\n  overs.forEach(function (value, valuePath) {\n    recursiveSet(props, valuePath, value); // Invalidate data array if we have a data override\n\n    if (valuePath[0] === 'data') {\n      props.data = _toConsumableArray(props.data);\n    }\n  });\n};\n/**\n * Listen for deck.gl edit events\n */\n\n\nexports.applyPropOverrides = applyPropOverrides;\n\nvar layerEditListener = function layerEditListener(cb) {\n  if (!_seer.default.isReady()) {\n    return;\n  }\n\n  _seer.default.listenFor('deck.gl', cb);\n};\n/**\n * Listen for seer init events to resend data\n */\n\n\nexports.layerEditListener = layerEditListener;\n\nvar seerInitListener = function seerInitListener(cb) {\n  if (!_seer.default.isReady()) {\n    return;\n  }\n\n  _seer.default.listenFor('init', cb);\n};\n\nexports.seerInitListener = seerInitListener;\n\nvar initLayerInSeer = function initLayerInSeer(layer) {\n  if (!_seer.default.isReady() || !layer) {\n    return;\n  }\n\n  var badges = [layer.constructor.layerName];\n\n  _seer.default.listItem('deck.gl', layer.id, {\n    badges: badges,\n    // TODO: Seer currently only handles single model layers\n    links: layer.state && layer.state.model ? [\"luma.gl:\".concat(layer.state.model.id)] : undefined,\n    parent: layer.parent ? layer.parent.id : undefined\n  });\n};\n/**\n * Log layer's properties to Seer\n */\n\n\nexports.initLayerInSeer = initLayerInSeer;\n\nvar updateLayerInSeer = function updateLayerInSeer(layer) {\n  if (!_seer.default.isReady() || _seer.default.throttle(\"deck.gl:\".concat(layer.id), 1e3)) {\n    return;\n  }\n\n  var data = logPayload(layer);\n\n  _seer.default.multiUpdate('deck.gl', layer.id, data);\n};\n/**\n * On finalize of a specify layer, remove it from seer\n */\n\n\nexports.updateLayerInSeer = updateLayerInSeer;\n\nvar removeLayerInSeer = function removeLayerInSeer(id) {\n  if (!_seer.default.isReady() || !id) {\n    return;\n  }\n\n  _seer.default.deleteItem('deck.gl', id);\n};\n\nexports.removeLayerInSeer = removeLayerInSeer;\n\nfunction logPayload(layer) {\n  var data = [{\n    path: 'objects.props',\n    data: layer.props\n  }];\n  var badges = [layer.constructor.layerName];\n\n  if (layer.state) {\n    if (layer.getAttributeManager()) {\n      var attrs = layer.getAttributeManager().getAttributes();\n      data.push({\n        path: 'objects.attributes',\n        data: attrs\n      });\n      badges.push(layer.getAttributeManager().stats.getTimeString());\n    } // TODO: Seer currently only handles single model layers\n\n\n    if (layer.state.model) {\n      layer.state.model.setProps({\n        timerQueryEnabled: true\n      });\n      var lastFrameTime = layer.state.model.stats.lastFrameTime;\n\n      if (lastFrameTime) {\n        badges.push(\"\".concat((lastFrameTime * 1000).toFixed(0), \"\\u03BCs\"));\n      }\n    }\n  }\n\n  data.push({\n    path: 'badges',\n    data: badges\n  });\n  return data;\n}\n},{\"seer\":\"a0ak\"}],\"IyuU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.validateProps = validateProps;\nexports.diffProps = diffProps;\nexports.compareProps = compareProps;\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction validateProps(props) {\n  var propTypes = getPropTypes(props);\n\n  for (var propName in propTypes) {\n    var propType = propTypes[propName];\n    var validate = propType.validate;\n\n    if (validate && !validate(props[propName], propType)) {\n      throw new Error(\"Invalid prop \".concat(propName, \": \").concat(props[propName]));\n    }\n  }\n} // Returns an object with \"change flags\", either false or strings indicating reason for change\n\n\nfunction diffProps(props, oldProps) {\n  // First check if any props have changed (ignore props that will be examined separately)\n  var propsChangedReason = compareProps({\n    newProps: props,\n    oldProps: oldProps,\n    propTypes: getPropTypes(props),\n    ignoreProps: {\n      data: null,\n      updateTriggers: null\n    }\n  }); // Now check if any data related props have changed\n\n  var dataChangedReason = diffDataProps(props, oldProps); // Check update triggers to determine if any attributes need regeneration\n  // Note - if data has changed, all attributes will need regeneration, so skip this step\n\n  var updateTriggersChangedReason = false;\n\n  if (!dataChangedReason) {\n    updateTriggersChangedReason = diffUpdateTriggers(props, oldProps);\n  }\n\n  return {\n    dataChanged: dataChangedReason,\n    propsChanged: propsChangedReason,\n    updateTriggersChanged: updateTriggersChangedReason\n  };\n}\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * @param {Object} opt.oldProps - object with old key/value pairs\n * @param {Object} opt.newProps - object with new key/value pairs\n * @param {Object} opt.ignoreProps={} - object, keys that should not be compared\n * @returns {null|String} - null when values of all keys are strictly equal.\n *   if unequal, returns a string explaining what changed.\n */\n\n/* eslint-disable max-statements, max-depth, complexity */\n\n\nfunction compareProps() {\n  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n      newProps = _ref.newProps,\n      oldProps = _ref.oldProps,\n      _ref$ignoreProps = _ref.ignoreProps,\n      ignoreProps = _ref$ignoreProps === void 0 ? {} : _ref$ignoreProps,\n      _ref$propTypes = _ref.propTypes,\n      propTypes = _ref$propTypes === void 0 ? {} : _ref$propTypes,\n      _ref$triggerName = _ref.triggerName,\n      triggerName = _ref$triggerName === void 0 ? 'props' : _ref$triggerName;\n\n  (0, _assert.default)(oldProps !== undefined && newProps !== undefined, 'compareProps args'); // shallow equality => deep equality\n\n  if (oldProps === newProps) {\n    return null;\n  } // TODO - do we need these checks? Should never happen...\n\n\n  if (_typeof(newProps) !== 'object' || newProps === null) {\n    return \"\".concat(triggerName, \" changed shallowly\");\n  }\n\n  if (_typeof(oldProps) !== 'object' || oldProps === null) {\n    return \"\".concat(triggerName, \" changed shallowly\");\n  } // Test if new props different from old props\n\n\n  for (var key in oldProps) {\n    if (!(key in ignoreProps)) {\n      if (!(key in newProps)) {\n        return \"\".concat(triggerName, \".\").concat(key, \" dropped\");\n      }\n\n      var newProp = newProps[key];\n      var oldProp = oldProps[key];\n      var propType = propTypes[key]; // If prop type has an equal function, invoke it\n\n      var equal = propType && propType.equal;\n\n      if (equal && !equal(newProp, oldProp, propType)) {\n        return \"\".concat(triggerName, \".\").concat(key, \" changed deeply\");\n      }\n\n      if (!equal) {\n        // If object has an equals function, invoke it\n        equal = newProp && oldProp && newProp.equals;\n\n        if (equal && !equal.call(newProp, oldProp)) {\n          return \"\".concat(triggerName, \".\").concat(key, \" changed deeply\");\n        }\n      }\n\n      if (!equal && oldProp !== newProp) {\n        return \"\".concat(triggerName, \".\").concat(key, \" changed shallowly\");\n      }\n    }\n  } // Test if any new props have been added\n\n\n  for (var _key in newProps) {\n    if (!(_key in ignoreProps)) {\n      if (!(_key in oldProps)) {\n        return \"\".concat(triggerName, \".\").concat(_key, \" added: undefined -> \").concat(newProps[_key]);\n      }\n    }\n  }\n\n  return null;\n}\n/* eslint-enable max-statements, max-depth, complexity */\n// HELPERS\n// The comparison of the data prop requires special handling\n// the dataComparator should be used if supplied\n\n\nfunction diffDataProps(props, oldProps) {\n  if (oldProps === null) {\n    return 'oldProps is null, initial diff';\n  } // Support optional app defined comparison of data\n\n\n  var dataComparator = props.dataComparator;\n\n  if (dataComparator) {\n    if (!dataComparator(props.data, oldProps.data)) {\n      return 'Data comparator detected a change';\n    } // Otherwise, do a shallow equal on props\n\n  } else if (props.data !== oldProps.data) {\n    return 'A new data container was supplied';\n  }\n\n  return null;\n} // Checks if any update triggers have changed\n// also calls callback to invalidate attributes accordingly.\n\n\nfunction diffUpdateTriggers(props, oldProps) {\n  if (oldProps === null) {\n    return 'oldProps is null, initial diff';\n  } // If the 'all' updateTrigger fires, ignore testing others\n\n\n  if ('all' in props.updateTriggers) {\n    var diffReason = diffUpdateTrigger(props, oldProps, 'all');\n\n    if (diffReason) {\n      return {\n        all: true\n      };\n    }\n  }\n\n  var triggerChanged = {};\n  var reason = false; // If the 'all' updateTrigger didn't fire, need to check all others\n\n  for (var triggerName in props.updateTriggers) {\n    if (triggerName !== 'all') {\n      var _diffReason = diffUpdateTrigger(props, oldProps, triggerName);\n\n      if (_diffReason) {\n        triggerChanged[triggerName] = true;\n        reason = triggerChanged;\n      }\n    }\n  }\n\n  return reason;\n}\n\nfunction diffUpdateTrigger(props, oldProps, triggerName) {\n  var newTriggers = props.updateTriggers[triggerName];\n  newTriggers = newTriggers === undefined || newTriggers === null ? {} : newTriggers;\n  var oldTriggers = oldProps.updateTriggers[triggerName];\n  oldTriggers = oldTriggers === undefined || oldTriggers === null ? {} : oldTriggers;\n  var diffReason = compareProps({\n    oldProps: oldTriggers,\n    newProps: newTriggers,\n    triggerName: triggerName\n  });\n  return diffReason;\n}\n\nfunction getPropTypes(props) {\n  var layer = props._component;\n  var LayerType = layer && layer.constructor;\n  return LayerType ? LayerType._propTypes : {};\n}\n},{\"../utils/assert\":\"R2tg\"}],\"frIP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.count = count;\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar ERR_NOT_OBJECT = 'count(): argument not an object';\nvar ERR_NOT_CONTAINER = 'count(): argument not a container';\n/**\n * Deduces numer of elements in a JavaScript container.\n * - Auto-deduction for ES6 containers that define a count() method\n * - Auto-deduction for ES6 containers that define a size member\n * - Auto-deduction for Classic Arrays via the built-in length attribute\n * - Also handles objects, although note that this an O(N) operation\n */\n\nfunction count(container) {\n  if (!isObject(container)) {\n    throw new Error(ERR_NOT_OBJECT);\n  } // Check if ES6 collection \"count\" function is available\n\n\n  if (typeof container.count === 'function') {\n    return container.count();\n  } // Check if ES6 collection \"size\" attribute is set\n\n\n  if (Number.isFinite(container.size)) {\n    return container.size;\n  } // Check if array length attribute is set\n  // Note: checking this last since some ES6 collections (Immutable.js)\n  // emit profuse warnings when trying to access `length` attribute\n\n\n  if (Number.isFinite(container.length)) {\n    return container.length;\n  } // Note that getting the count of an object is O(N)\n\n\n  if (isPlainObject(container)) {\n    return Object.keys(container).length;\n  }\n\n  throw new Error(ERR_NOT_CONTAINER);\n}\n/**\n * Checks if argument is a plain object (not a class or array etc)\n * @param {*} value - JavaScript value to be tested\n * @return {Boolean} - true if argument is a plain JavaScript object\n */\n\n\nfunction isPlainObject(value) {\n  return value !== null && _typeof(value) === 'object' && value.constructor === Object;\n}\n/**\n * Checks if argument is an indexable object (not a primitive value, nor null)\n * @param {*} value - JavaScript value to be tested\n * @return {Boolean} - true if argument is a JavaScript object\n */\n\n\nfunction isObject(value) {\n  return value !== null && _typeof(value) === 'object';\n}\n},{}],\"TpVk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LIFECYCLE = void 0;\nvar LIFECYCLE = {\n  NO_STATE: 'Awaiting state',\n  MATCHED: 'Matched. State transferred from previous layer',\n  INITIALIZED: 'Initialized',\n  AWAITING_GC: 'Discarded. Awaiting garbage collection',\n  AWAITING_FINALIZATION: 'No longer matched. Awaiting garbage collection',\n  FINALIZED: 'Finalized! Awaiting garbage collection'\n};\nexports.LIFECYCLE = LIFECYCLE;\n},{}],\"C8vu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.parsePropTypes = parsePropTypes;\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nvar TYPE_DEFINITIONS = {\n  boolean: {\n    validate: function validate(value, propType) {\n      return true;\n    },\n    equal: function equal(value1, value2, propType) {\n      return Boolean(value1) === Boolean(value2);\n    }\n  },\n  number: {\n    validate: function validate(value, propType) {\n      return Number.isFinite(value) && (!('max' in propType) || value <= propType.max) && (!('min' in propType) || value >= propType.min);\n    }\n  },\n  color: {\n    validate: function validate(value, propType) {\n      return isArray(value) && (value.length === 3 || value.length === 4);\n    },\n    equal: function equal(value1, value2, propType) {\n      return arrayEqual(value1, value2);\n    }\n  },\n  accessor: {\n    validate: function validate(value, propType) {\n      var valueType = getTypeOf(value);\n      return valueType === 'function' || valueType === getTypeOf(propType.value);\n    },\n    equal: function equal(value1, value2, propType) {\n      if (typeof value2 === 'function') {\n        return true;\n      }\n\n      return arrayEqual(value1, value2);\n    }\n  },\n  array: {\n    validate: function validate(value, propType) {\n      return propType.optional && !value || isArray(value);\n    },\n    equal: function equal(value1, value2, propType) {\n      return propType.compare ? arrayEqual(value1, value2) : value1 === value2;\n    }\n  },\n  function: {\n    validate: function validate(value, propType) {\n      return propType.optional && !value || typeof value === 'function';\n    },\n    equal: function equal(value1, value2, propType) {\n      return !propType.compare || value1 === value2;\n    }\n  }\n};\n\nfunction arrayEqual(array1, array2) {\n  if (array1 === array2) {\n    return true;\n  }\n\n  if (!isArray(array1) || !isArray(array2)) {\n    return false;\n  }\n\n  var len = array1.length;\n\n  if (len !== array2.length) {\n    return false;\n  }\n\n  for (var i = 0; i < len; i++) {\n    if (array1[i] !== array2[i]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction parsePropTypes(propDefs) {\n  var propTypes = {};\n  var defaultProps = {};\n  var deprecatedProps = {};\n\n  var _arr = Object.entries(propDefs);\n\n  for (var _i = 0; _i < _arr.length; _i++) {\n    var _arr$_i = _slicedToArray(_arr[_i], 2),\n        propName = _arr$_i[0],\n        propDef = _arr$_i[1];\n\n    if (propDef && propDef.deprecatedFor) {\n      deprecatedProps[propName] = Array.isArray(propDef.deprecatedFor) ? propDef.deprecatedFor : [propDef.deprecatedFor];\n    } else {\n      var propType = parsePropType(propName, propDef);\n      propTypes[propName] = propType;\n      defaultProps[propName] = propType.value;\n    }\n  }\n\n  return {\n    propTypes: propTypes,\n    defaultProps: defaultProps,\n    deprecatedProps: deprecatedProps\n  };\n} // Parses one property definition entry. Either contains:\n// * a valid prop type object ({type, ...})\n// * or just a default value, in which case type and name inference is used\n\n\nfunction parsePropType(name, propDef) {\n  switch (getTypeOf(propDef)) {\n    case 'object':\n      return normalizePropDefinition(name, propDef);\n\n    case 'array':\n      return normalizePropDefinition(name, {\n        type: 'array',\n        value: propDef,\n        compare: false\n      });\n\n    case 'boolean':\n      return normalizePropDefinition(name, {\n        type: 'boolean',\n        value: propDef\n      });\n\n    case 'number':\n      return normalizePropDefinition(name, {\n        type: 'number',\n        value: propDef\n      });\n\n    case 'function':\n      return normalizePropDefinition(name, {\n        type: 'function',\n        value: propDef,\n        compare: true\n      });\n    // return guessFunctionType(name, propDef);\n\n    default:\n      return {\n        name: name,\n        type: 'unknown',\n        value: propDef\n      };\n  }\n}\n\nfunction normalizePropDefinition(name, propDef) {\n  if (!('type' in propDef)) {\n    if (!('value' in propDef)) {\n      // If no type and value this object is likely the value\n      return {\n        name: name,\n        type: 'object',\n        value: propDef\n      };\n    }\n\n    return Object.assign({\n      name: name,\n      type: getTypeOf(propDef.value)\n    }, propDef);\n  }\n\n  return Object.assign({\n    name: name\n  }, TYPE_DEFINITIONS[propDef.type], propDef);\n}\n\nfunction isArray(value) {\n  return Array.isArray(value) || ArrayBuffer.isView(value);\n} // improved version of javascript typeof that can distinguish arrays and null values\n\n\nfunction getTypeOf(value) {\n  if (isArray(value)) {\n    return 'array';\n  }\n\n  if (value === null) {\n    return 'null';\n  }\n\n  return _typeof(value);\n}\n},{}],\"QDeO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createProps = createProps;\n\nvar _seerIntegration = require(\"../lib/seer-integration\");\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _propTypes = require(\"./prop-types\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Create a property object\nfunction createProps() {\n  var component = this; // eslint-disable-line\n  // Get default prop object (a prototype chain for now)\n\n  var propTypeDefs = getPropsPrototypeAndTypes(component.constructor);\n  var propsPrototype = propTypeDefs.defaultProps; // Create a new prop object with default props object in prototype chain\n\n  var propsInstance = Object.create(propsPrototype, {\n    // Props need a back pointer to the owning component\n    _component: {\n      enumerable: false,\n      value: component\n    },\n    // The supplied (original) values for those async props that are set to url strings or Promises.\n    // In this case, the actual (i.e. resolved) values are looked up from component.internalState\n    _asyncPropOriginalValues: {\n      enumerable: false,\n      value: {}\n    },\n    // Note: the actual (resolved) values for props that are NOT set to urls or Promises.\n    // in this case the values are served directly from this map\n    _asyncPropResolvedValues: {\n      enumerable: false,\n      value: {}\n    }\n  }); // \"Copy\" all sync props\n\n  for (var i = 0; i < arguments.length; ++i) {\n    Object.assign(propsInstance, arguments[i]);\n  }\n\n  var layerName = component.constructor.layerName;\n  var deprecatedProps = propTypeDefs.deprecatedProps;\n  checkDeprecatedProps(layerName, propsInstance, deprecatedProps);\n  checkDeprecatedProps(layerName, propsInstance.updateTriggers, deprecatedProps);\n  checkDeprecatedProps(layerName, propsInstance.transitions, deprecatedProps); // SEER: Apply any overrides from the seer debug extension if it is active\n\n  (0, _seerIntegration.applyPropOverrides)(propsInstance); // Props must be immutable\n\n  Object.freeze(propsInstance);\n  return propsInstance;\n}\n/* eslint-disable max-depth */\n\n\nfunction checkDeprecatedProps(layerName, propsInstance, deprecatedProps) {\n  if (!propsInstance) {\n    return;\n  }\n\n  for (var name in deprecatedProps) {\n    if (hasOwnProperty(propsInstance, name)) {\n      var nameStr = \"\".concat(layerName || 'Layer', \": \").concat(name);\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = deprecatedProps[name][Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var newPropName = _step.value;\n\n          if (!hasOwnProperty(propsInstance, newPropName)) {\n            propsInstance[newPropName] = propsInstance[name];\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      _log.default.deprecated(nameStr, deprecatedProps[name].join('/'))();\n    }\n  }\n}\n/* eslint-enable max-depth */\n// Return precalculated defaultProps and propType objects if available\n// build them if needed\n\n\nfunction getPropsPrototypeAndTypes(componentClass) {\n  var props = getOwnProperty(componentClass, '_mergedDefaultProps');\n\n  if (props) {\n    return {\n      defaultProps: props,\n      propTypes: getOwnProperty(componentClass, '_propTypes'),\n      deprecatedProps: getOwnProperty(componentClass, '_deprecatedProps')\n    };\n  }\n\n  return createPropsPrototypeAndTypes(componentClass);\n} // Build defaultProps and propType objects by walking component prototype chain\n\n\nfunction createPropsPrototypeAndTypes(componentClass) {\n  var parent = componentClass.prototype;\n\n  if (!parent) {\n    return {\n      defaultProps: {}\n    };\n  }\n\n  var parentClass = Object.getPrototypeOf(componentClass);\n  var parentPropDefs = parent && getPropsPrototypeAndTypes(parentClass) || null; // Parse propTypes from Component.defaultProps\n\n  var componentDefaultProps = getOwnProperty(componentClass, 'defaultProps') || {};\n  var componentPropDefs = (0, _propTypes.parsePropTypes)(componentDefaultProps); // Create a merged type object\n\n  var propTypes = Object.assign({}, parentPropDefs && parentPropDefs.propTypes, componentPropDefs.propTypes); // Create any necessary property descriptors and create the default prop object\n  // Assign merged default props\n\n  var defaultProps = createPropsPrototype(componentPropDefs.defaultProps, parentPropDefs && parentPropDefs.defaultProps, propTypes, componentClass); // Create a map for prop whose default value is a callback\n\n  var deprecatedProps = Object.assign({}, parentPropDefs && parentPropDefs.deprecatedProps, componentPropDefs.deprecatedProps); // Store the precalculated props\n\n  componentClass._mergedDefaultProps = defaultProps;\n  componentClass._propTypes = propTypes;\n  componentClass._deprecatedProps = deprecatedProps;\n  return {\n    propTypes: propTypes,\n    defaultProps: defaultProps,\n    deprecatedProps: deprecatedProps\n  };\n} // Builds a pre-merged default props object that component props can inherit from\n\n\nfunction createPropsPrototype(props, parentProps, propTypes, componentClass) {\n  var defaultProps = Object.create(null);\n  Object.assign(defaultProps, parentProps, props); // Avoid freezing `id` prop\n\n  var id = getComponentName(componentClass);\n  delete props.id; // Add getters/setters for async prop properties\n\n  Object.defineProperties(defaultProps, {\n    // `id` is treated specially because layer might need to override it\n    id: {\n      configurable: false,\n      writable: true,\n      value: id\n    }\n  }); // Add getters/setters for async prop properties\n\n  addAsyncPropsToPropPrototype(defaultProps, propTypes);\n  return defaultProps;\n} // Create descriptors for overridable props\n\n\nfunction addAsyncPropsToPropPrototype(defaultProps, propTypes) {\n  var defaultValues = {};\n  var descriptors = {\n    // Default \"resolved\" values for async props, returned if value not yet resolved/set.\n    _asyncPropDefaultValues: {\n      enumerable: false,\n      value: defaultValues\n    },\n    // Shadowed object, just to make sure \"early indexing\" into the instance does not fail\n    _asyncPropOriginalValues: {\n      enumerable: false,\n      value: {}\n    }\n  }; // Move async props into shadow values\n\n  for (var propName in propTypes) {\n    var propType = propTypes[propName];\n    var name = propType.name,\n        value = propType.value; // Note: async is ES7 keyword, can't destructure\n\n    if (propType.async) {\n      defaultValues[name] = value;\n      descriptors[name] = getDescriptorForAsyncProp(name, value);\n    }\n  }\n\n  Object.defineProperties(defaultProps, descriptors);\n} // Helper: Configures getter and setter for one async prop\n\n\nfunction getDescriptorForAsyncProp(name) {\n  return {\n    configurable: false,\n    enumerable: true,\n    // Save the provided value for async props in a special map\n    set: function set(newValue) {\n      if (typeof newValue === 'string' || newValue instanceof Promise) {\n        this._asyncPropOriginalValues[name] = newValue;\n      } else {\n        this._asyncPropResolvedValues[name] = newValue;\n      }\n    },\n    // Only the component's state knows the true value of async prop\n    get: function get() {\n      if (this._asyncPropResolvedValues) {\n        // Prop value isn't async, so just return it\n        if (name in this._asyncPropResolvedValues) {\n          var value = this._asyncPropResolvedValues[name]; // Special handling - components expect null `data` prop expects to be replaced with `[]`\n\n          if (name === 'data') {\n            return value || this._asyncPropDefaultValues[name];\n          }\n\n          return value;\n        }\n\n        if (name in this._asyncPropOriginalValues) {\n          // It's an async prop value: look into component state\n          var state = this._component && this._component.internalState;\n\n          if (state && state.hasAsyncProp(name)) {\n            return state.getAsyncProp(name);\n          }\n        }\n      } // the prop is not supplied, or\n      // component not yet initialized/matched, return the component's default value for the prop\n\n\n      return this._asyncPropDefaultValues[name];\n    }\n  };\n} // HELPER METHODS\n\n\nfunction hasOwnProperty(object, prop) {\n  return Object.prototype.hasOwnProperty.call(object, prop);\n} // Constructors have their super class constructors as prototypes\n\n\nfunction getOwnProperty(object, prop) {\n  return hasOwnProperty(object, prop) && object[prop];\n}\n\nfunction getComponentName(componentClass) {\n  var componentName = getOwnProperty(componentClass, 'layerName') || getOwnProperty(componentClass, 'componentName');\n\n  if (!componentName) {\n    _log.default.once(0, \"\".concat(componentClass.name, \".componentName not specified\"))();\n  }\n\n  return componentName || componentClass.name;\n}\n},{\"../lib/seer-integration\":\"ht98\",\"../utils/log\":\"mqAj\",\"./prop-types\":\"C8vu\"}],\"VENQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar EMPTY_PROPS = Object.freeze({});\n\nvar ComponentState =\n/*#__PURE__*/\nfunction () {\n  function ComponentState() {\n    var component = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n    _classCallCheck(this, ComponentState);\n\n    this.component = component;\n    this.asyncProps = {}; // Prop values that the layer sees\n\n    this.onAsyncPropUpdated = function () {};\n\n    this.oldProps = EMPTY_PROPS; // Last props before update\n\n    this.oldAsyncProps = null; // Last props before update, with async values copied.\n  }\n\n  _createClass(ComponentState, [{\n    key: \"getOldProps\",\n    value: function getOldProps() {\n      return this.oldAsyncProps || this.oldProps;\n    }\n  }, {\n    key: \"resetOldProps\",\n    value: function resetOldProps() {\n      this.oldAsyncProps = null;\n      this.oldProps = this.component.props;\n    } // Whenever async props are changing, we need to make a copy of oldProps\n    // otherwise the prop rewriting will affect the value both in props and oldProps.\n    // While the copy is relatively expensive, this only happens on load completion.\n\n  }, {\n    key: \"freezeAsyncOldProps\",\n    value: function freezeAsyncOldProps() {\n      if (!this.oldAsyncProps) {\n        // Make sure oldProps is set\n        this.oldProps = this.oldProps || this.component.props; // Deep copy props (Object.assign only handles shallow props)\n        // TODO - Alternatively, just reconfigure the async prop descriptors to fixed values?\n\n        this.oldAsyncProps = {};\n\n        for (var propName in this.oldProps) {\n          this.oldAsyncProps[propName] = this.oldProps[propName];\n        }\n      }\n    } // ASYNC PROP HANDLING\n    //\n    // Checks if a prop is overridden\n\n  }, {\n    key: \"hasAsyncProp\",\n    value: function hasAsyncProp(propName) {\n      return propName in this.asyncProps;\n    } // Returns value of an overriden prop\n\n  }, {\n    key: \"getAsyncProp\",\n    value: function getAsyncProp(propName) {\n      var asyncProp = this.asyncProps[propName];\n      return asyncProp && asyncProp.resolvedValue;\n    }\n  }, {\n    key: \"isAsyncPropLoading\",\n    value: function isAsyncPropLoading(propName) {\n      var asyncProp = this.asyncProps[propName];\n      return Boolean(asyncProp && asyncProp.pendingLoadCount > 0 && asyncProp.pendingLoadCount !== asyncProp.resolvedLoadCount);\n    } // Updates all async/overridden props (when new props come in)\n    // Checks if urls have changed, starts loading, or removes override\n\n  }, {\n    key: \"setAsyncProps\",\n    value: function setAsyncProps(props) {\n      // NOTE: prop param and default values are only support for testing\n      var resolvedValues = props._asyncPropResolvedValues || {};\n      var originalValues = props._asyncPropOriginalValues || props;\n      var defaultValues = props._asyncPropDefaultValues || {}; // TODO - use async props from the layer's prop types\n\n      for (var propName in resolvedValues) {\n        var value = resolvedValues[propName];\n\n        this._createAsyncPropData(propName, value, defaultValues[propName]);\n\n        this._updateAsyncProp(propName, value);\n      }\n\n      for (var _propName in originalValues) {\n        var _value = originalValues[_propName]; // Makes sure a record exists for this prop\n\n        this._createAsyncPropData(_propName, _value, defaultValues[_propName]);\n\n        this._updateAsyncProp(_propName, _value);\n      }\n    } // Intercept strings (URLs) and Promises and activates loading and prop rewriting\n\n  }, {\n    key: \"_updateAsyncProp\",\n    value: function _updateAsyncProp(propName, value) {\n      if (!this._didAsyncInputValueChange(propName, value)) {\n        return;\n      } // interpret value string as url and start a new load tracked by a promise\n\n\n      if (typeof value === 'string') {\n        var fetch = this.layer.props.fetch;\n        var url = value;\n        value = fetch(url);\n      } // interprets promise and track the \"loading\"\n\n\n      if (value instanceof Promise) {\n        this._watchPromise(propName, value);\n\n        return;\n      } // else, normal, non-async value. Just store value for now\n\n\n      this._setPropValue(propName, value);\n    } // Checks if an input value actually changed (to avoid reloading/rewatching promises/urls)\n\n  }, {\n    key: \"_didAsyncInputValueChange\",\n    value: function _didAsyncInputValueChange(propName, value) {\n      var asyncProp = this.asyncProps[propName];\n\n      if (value === asyncProp.lastValue) {\n        return false;\n      }\n\n      asyncProp.lastValue = value;\n      return true;\n    } // Set normal, non-async value\n\n  }, {\n    key: \"_setPropValue\",\n    value: function _setPropValue(propName, value) {\n      var asyncProp = this.asyncProps[propName];\n      asyncProp.value = value;\n      asyncProp.resolvedValue = value;\n      asyncProp.pendingLoadCount++;\n      asyncProp.resolvedLoadCount = asyncProp.pendingLoadCount;\n    } // Set a just resolved async value, calling onAsyncPropUpdates if value changes asynchronously\n\n  }, {\n    key: \"_setAsyncPropValue\",\n    value: function _setAsyncPropValue(propName, value, loadCount) {\n      // Only update if loadCount is larger or equal to resolvedLoadCount\n      // otherwise a more recent load has already completed\n      var asyncProp = this.asyncProps[propName];\n\n      if (asyncProp && loadCount >= asyncProp.resolvedLoadCount) {\n        (0, _assert.default)(value !== undefined); // A chance to copy old props before updating\n\n        this.freezeAsyncOldProps();\n        value = this._postProcessValue(propName, value);\n        asyncProp.resolvedValue = value;\n        asyncProp.resolvedLoadCount = loadCount; // Call callback to inform listener\n\n        this.onAsyncPropUpdated(propName, value);\n      }\n    } // Tracks a promise, sets the prop when loaded, handles load count\n\n  }, {\n    key: \"_watchPromise\",\n    value: function _watchPromise(propName, promise) {\n      var _this = this;\n\n      var asyncProp = this.asyncProps[propName];\n      asyncProp.pendingLoadCount++;\n      var loadCount = asyncProp.pendingLoadCount;\n      promise.then(function (data) {\n        return _this._setAsyncPropValue(propName, data, loadCount);\n      }).catch(function (error) {\n        return _log.default.error(error)();\n      });\n    } // Give the app a chance to post process the loaded data\n\n  }, {\n    key: \"_postProcessValue\",\n    value: function _postProcessValue(propName, value) {\n      var _ref = this.component ? this.component.props : {},\n          dataTransform = _ref.dataTransform;\n\n      if (propName === 'data' && dataTransform) {\n        value = dataTransform(value);\n      }\n\n      return value;\n    } // Creating an asyncProp record if needed\n\n  }, {\n    key: \"_createAsyncPropData\",\n    value: function _createAsyncPropData(propName, value, defaultValue) {\n      var asyncProp = this.asyncProps[propName];\n\n      if (!asyncProp) {\n        // assert(defaultValue !== undefined);\n        this.asyncProps[propName] = {\n          lastValue: null,\n          // Supplied prop value (can be url/promise, not visible to layer)\n          resolvedValue: defaultValue,\n          // Resolved prop value (valid data, can be \"shown\" to layer)\n          pendingLoadCount: 0,\n          // How many loads have been issued\n          resolvedLoadCount: 0 // Latest resolved load, (earlier loads will be ignored)\n\n        };\n      }\n    }\n  }]);\n\n  return ComponentState;\n}();\n\nexports.default = ComponentState;\n},{\"../utils/log\":\"mqAj\",\"../utils/assert\":\"R2tg\"}],\"pir1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"../lifecycle/constants\");\n\nvar _createProps = require(\"../lifecycle/create-props\");\n\nvar _componentState = _interopRequireDefault(require(\"./component-state\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nvar defaultProps = {};\nvar counter = 0;\n\nvar Component =\n/*#__PURE__*/\nfunction () {\n  function Component()\n  /* ...propObjects */\n  {\n    _classCallCheck(this, Component); // Merge supplied props with default props and freeze them.\n\n    /* eslint-disable prefer-spread */\n\n\n    this.props = _createProps.createProps.apply(this, arguments);\n    /* eslint-enable prefer-spread */\n    // Define all members before layer is sealed\n\n    this.id = this.props.id; // The layer's id, used for matching with layers from last render cycle\n\n    this.count = counter++; // Keep track of how many layer instances you are generating\n\n    this.lifecycle = _constants.LIFECYCLE.NO_STATE; // Helps track and debug the life cycle of the layers\n\n    this.parent = null; // reference to the composite layer parent that rendered this layer\n\n    this.context = null; // Will reference layer manager's context, contains state shared by layers\n\n    this.state = null; // Will be set to the shared layer state object during layer matching\n\n    this.internalState = null; // Seal the layer\n\n    Object.seal(this);\n  } // clone this layer with modified props\n\n\n  _createClass(Component, [{\n    key: \"clone\",\n    value: function clone(newProps) {\n      var props = this.props; // Async props cannot be copied with Object.assign, copy them separately\n\n      var asyncProps = {}; // See async props definition in create-props.js\n\n      for (var key in props._asyncPropDefaultValues) {\n        if (key in props._asyncPropResolvedValues) {\n          asyncProps[key] = props._asyncPropResolvedValues[key];\n        } else if (key in props._asyncPropOriginalValues) {\n          asyncProps[key] = props._asyncPropOriginalValues[key];\n        }\n      } // Some custom layer implementation may not support multiple arguments in the constructor\n\n\n      return new this.constructor(Object.assign({}, props, asyncProps, newProps));\n    }\n  }, {\n    key: \"_initState\",\n    // PROTECTED METHODS, override in subclass\n    value: function _initState() {\n      this.internalState = new _componentState.default({});\n    }\n  }, {\n    key: \"stats\",\n    get: function get() {\n      return this.internalState.stats;\n    }\n  }]);\n\n  return Component;\n}();\n\nexports.default = Component;\nComponent.defaultProps = defaultProps;\n},{\"../lifecycle/constants\":\"TpVk\",\"../lifecycle/create-props\":\"QDeO\",\"./component-state\":\"VENQ\"}],\"hMc6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _componentState = _interopRequireDefault(require(\"../lifecycle/component-state\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar LayerState =\n/*#__PURE__*/\nfunction (_ComponentState) {\n  _inherits(LayerState, _ComponentState);\n\n  function LayerState(_ref) {\n    var _this;\n\n    var attributeManager = _ref.attributeManager,\n        layer = _ref.layer;\n\n    _classCallCheck(this, LayerState);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(LayerState).call(this, layer));\n    _this.attributeManager = attributeManager;\n    _this.model = null;\n    _this.needsRedraw = true;\n    _this.subLayers = null; // reference to sublayers rendered in a previous cycle\n\n    return _this;\n  }\n\n  _createClass(LayerState, [{\n    key: \"layer\",\n    get: function get() {\n      return this.component;\n    },\n    set: function set(layer) {\n      this.component = layer;\n    }\n  }]);\n\n  return LayerState;\n}(_componentState.default);\n\nexports.default = LayerState;\n},{\"../lifecycle/component-state\":\"VENQ\"}],\"Cvfw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _attributeManager = _interopRequireDefault(require(\"./attribute-manager\"));\n\nvar _seerIntegration = require(\"./seer-integration\");\n\nvar _props = require(\"../lifecycle/props\");\n\nvar _count = require(\"../utils/count\");\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _constants2 = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _projectFunctions = require(\"../shaderlib/project/project-functions\");\n\nvar _component = _interopRequireDefault(require(\"../lifecycle/component\"));\n\nvar _layerState = _interopRequireDefault(require(\"./layer-state\"));\n\nvar _viewportMercatorProject = require(\"viewport-mercator-project\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* eslint-disable react/no-direct-mutation-state */\n\n/* global fetch */\n\n/* global window */\n\n\nvar LOG_PRIORITY_UPDATE = 1;\nvar EMPTY_ARRAY = Object.freeze([]);\nvar pickingColorCache = new Uint8ClampedArray(0);\nvar defaultProps = {\n  // data: Special handling for null, see below\n  data: {\n    type: 'data',\n    value: EMPTY_ARRAY,\n    async: true\n  },\n  dataComparator: null,\n  dataTransform: {\n    type: 'function',\n    value: function value(data) {\n      return data;\n    },\n    compare: false\n  },\n  fetch: {\n    type: 'function',\n    value: function value(url) {\n      return fetch(url).then(function (response) {\n        return response.json();\n      });\n    },\n    compare: false\n  },\n  updateTriggers: {},\n  // Update triggers: a core change detection mechanism in deck.gl\n  numInstances: undefined,\n  visible: true,\n  pickable: false,\n  opacity: {\n    type: 'number',\n    min: 0,\n    max: 1,\n    value: 0.8\n  },\n  onHover: {\n    type: 'function',\n    value: null,\n    compare: false,\n    optional: true\n  },\n  onClick: {\n    type: 'function',\n    value: null,\n    compare: false,\n    optional: true\n  },\n  onDragStart: {\n    type: 'function',\n    value: null,\n    compare: false,\n    optional: true\n  },\n  onDrag: {\n    type: 'function',\n    value: null,\n    compare: false,\n    optional: true\n  },\n  onDragEnd: {\n    type: 'function',\n    value: null,\n    compare: false,\n    optional: true\n  },\n  coordinateSystem: _constants.COORDINATE_SYSTEM.LNGLAT,\n  coordinateOrigin: {\n    type: 'array',\n    value: [0, 0, 0],\n    compare: true\n  },\n  modelMatrix: {\n    type: 'array',\n    value: null,\n    compare: true,\n    optional: true\n  },\n  wrapLongitude: false,\n  parameters: {},\n  uniforms: {},\n  framebuffer: null,\n  animation: null,\n  // Passed prop animation functions to evaluate props\n  // Offset depth based on layer index to avoid z-fighting.\n  // Negative values pull layer towards the camera\n  // https://www.opengl.org/archives/resources/faq/technical/polygonoffset.htm\n  getPolygonOffset: {\n    type: 'function',\n    value: function value(_ref) {\n      var layerIndex = _ref.layerIndex;\n      return [0, -layerIndex * 100];\n    },\n    compare: false\n  },\n  // Selection/Highlighting\n  highlightedObjectIndex: null,\n  autoHighlight: false,\n  highlightColor: {\n    type: 'color',\n    value: [0, 0, 128, 128]\n  }\n};\n\nvar Layer =\n/*#__PURE__*/\nfunction (_Component) {\n  _inherits(Layer, _Component);\n\n  function Layer() {\n    _classCallCheck(this, Layer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(Layer).apply(this, arguments));\n  }\n\n  _createClass(Layer, [{\n    key: \"toString\",\n    value: function toString() {\n      var className = this.constructor.layerName || this.constructor.name;\n      return \"\".concat(className, \"({id: '\").concat(this.props.id, \"'})\");\n    } // Public API\n    // Updates selected state members and marks the object for redraw\n\n  }, {\n    key: \"setState\",\n    value: function setState(updateObject) {\n      this.setChangeFlags({\n        stateChanged: true\n      });\n      Object.assign(this.state, updateObject);\n      this.setNeedsRedraw();\n    } // Sets the redraw flag for this layer, will trigger a redraw next animation frame\n\n  }, {\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw() {\n      var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n      if (this.internalState) {\n        this.internalState.needsRedraw = redraw;\n      }\n    } // This layer needs a deep update\n    // TODO - Need to align with existing needsUpdate before uncommenting\n    // For now async props will call layerManager directly\n\n  }, {\n    key: \"setLayerNeedsUpdate\",\n    value: function setLayerNeedsUpdate() {\n      this.context.layerManager.setNeedsUpdate(String(this));\n    } // Checks state of attributes and model\n\n  }, {\n    key: \"getNeedsRedraw\",\n    value: function getNeedsRedraw() {\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref2$clearRedrawFlag = _ref2.clearRedrawFlags,\n          clearRedrawFlags = _ref2$clearRedrawFlag === void 0 ? false : _ref2$clearRedrawFlag;\n\n      return this._getNeedsRedraw(clearRedrawFlags);\n    } // Checks if layer attributes needs updating\n\n  }, {\n    key: \"needsUpdate\",\n    value: function needsUpdate() {\n      // Call subclass lifecycle method\n      return this.shouldUpdateState(this._getUpdateParams()); // End lifecycle method\n    } // Returns true if the layer is pickable and visible.\n\n  }, {\n    key: \"isPickable\",\n    value: function isPickable() {\n      return this.props.pickable && this.props.visible;\n    } // Return an array of models used by this layer, can be overriden by layer subclass\n\n  }, {\n    key: \"getModels\",\n    value: function getModels() {\n      return this.state && (this.state.models || (this.state.model ? [this.state.model] : []));\n    } // TODO - Gradually phase out, does not support multi model layers\n\n  }, {\n    key: \"getSingleModel\",\n    value: function getSingleModel() {\n      return this.state && this.state.model;\n    }\n  }, {\n    key: \"getAttributeManager\",\n    value: function getAttributeManager() {\n      return this.internalState && this.internalState.attributeManager;\n    } // Returns the most recent layer that matched to this state\n    // (When reacting to an async event, this layer may no longer be the latest)\n\n  }, {\n    key: \"getCurrentLayer\",\n    value: function getCurrentLayer() {\n      return this.internalState && this.internalState.layer;\n    } // Use iteration (the only required capability on data) to get first element\n    // deprecated since we are effectively only supporting Arrays\n\n  }, {\n    key: \"getFirstObject\",\n    value: function getFirstObject() {\n      var data = this.props.data;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n          return object;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return null;\n    } // PROJECTION METHODS\n    // Projects a point with current map state (lat, lon, zoom, pitch, bearing)\n    // From the current layer's coordinate system to screen\n\n  }, {\n    key: \"project\",\n    value: function project(xyz) {\n      var viewport = this.context.viewport;\n      var worldPosition = (0, _projectFunctions.getWorldPosition)(xyz, {\n        viewport: viewport,\n        modelMatrix: this.props.modelMatrix,\n        coordinateOrigin: this.props.coordinateOrigin,\n        coordinateSystem: this.props.coordinateSystem\n      });\n\n      var _worldToPixels = (0, _viewportMercatorProject.worldToPixels)(worldPosition, viewport.pixelProjectionMatrix),\n          _worldToPixels2 = _slicedToArray(_worldToPixels, 3),\n          x = _worldToPixels2[0],\n          y = _worldToPixels2[1],\n          z = _worldToPixels2[2];\n\n      return xyz.length === 2 ? [x, y] : [x, y, z];\n    } // Note: this does not reverse `project`.\n    // Always unprojects to the viewport's coordinate system\n\n  }, {\n    key: \"unproject\",\n    value: function unproject(xy) {\n      var viewport = this.context.viewport;\n      (0, _assert.default)(Array.isArray(xy));\n      return viewport.unproject(xy);\n    }\n  }, {\n    key: \"projectPosition\",\n    value: function projectPosition(xyz) {\n      (0, _assert.default)(Array.isArray(xyz));\n      return (0, _projectFunctions.projectPosition)(xyz, {\n        viewport: this.context.viewport,\n        modelMatrix: this.props.modelMatrix,\n        coordinateOrigin: this.props.coordinateOrigin,\n        coordinateSystem: this.props.coordinateSystem\n      });\n    } // DEPRECATE: This does not handle offset modes\n\n  }, {\n    key: \"projectFlat\",\n    value: function projectFlat(lngLat) {\n      _log.default.deprecated('layer.projectFlat', 'layer.projectPosition')();\n\n      var viewport = this.context.viewport;\n      (0, _assert.default)(Array.isArray(lngLat));\n      return viewport.projectFlat(lngLat);\n    } // DEPRECATE: This is not meaningful in offset modes\n\n  }, {\n    key: \"unprojectFlat\",\n    value: function unprojectFlat(xy) {\n      _log.default.deprecated('layer.unprojectFlat')();\n\n      var viewport = this.context.viewport;\n      (0, _assert.default)(Array.isArray(xy));\n      return viewport.unprojectFlat(xy);\n    }\n  }, {\n    key: \"use64bitProjection\",\n    value: function use64bitProjection() {\n      if (this.props.fp64) {\n        if (this.props.coordinateSystem === _constants.COORDINATE_SYSTEM.LNGLAT_DEPRECATED) {\n          return true;\n        }\n\n        _log.default.once(0, \"Legacy 64-bit mode only works with coordinateSystem set to\\n        COORDINATE_SYSTEM.LNGLAT_DEPRECATED. Rendering in 32-bit mode instead\")();\n      }\n\n      return false;\n    }\n  }, {\n    key: \"use64bitPositions\",\n    value: function use64bitPositions() {\n      return this.props.fp64 || this.props.coordinateSystem === _constants.COORDINATE_SYSTEM.LNGLAT;\n    } // TODO - needs to refer to context for devicePixels setting\n\n  }, {\n    key: \"screenToDevicePixels\",\n    value: function screenToDevicePixels(screenPixels) {\n      _log.default.deprecated('screenToDevicePixels', 'DeckGL prop useDevicePixels for conversion')();\n\n      var devicePixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio : 1;\n      return screenPixels * devicePixelRatio;\n    } // Event handling\n\n  }, {\n    key: \"onHover\",\n    value: function onHover(info) {\n      if (this.props.onHover) {\n        return this.props.onHover(info, this.context.pickingEvent);\n      }\n\n      return false;\n    }\n  }, {\n    key: \"onClick\",\n    value: function onClick(info) {\n      if (this.props.onClick) {\n        return this.props.onClick(info, this.context.pickingEvent);\n      }\n\n      return false;\n    } // Returns the picking color that doesn't match any subfeature\n    // Use if some graphics do not belong to any pickable subfeature\n    // @return {Array} - a black color\n\n  }, {\n    key: \"nullPickingColor\",\n    value: function nullPickingColor() {\n      return [0, 0, 0];\n    } // Returns the picking color that doesn't match any subfeature\n    // Use if some graphics do not belong to any pickable subfeature\n\n  }, {\n    key: \"encodePickingColor\",\n    value: function encodePickingColor(i) {\n      var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n      (0, _assert.default)(i < 16777215, 'index out of picking color range');\n      target[0] = i + 1 & 255;\n      target[1] = i + 1 >> 8 & 255;\n      target[2] = i + 1 >> 8 >> 8 & 255;\n      return target;\n    } // Returns the index corresponding to a picking color that doesn't match any subfeature\n    // @param {Uint8Array} color - color array to be decoded\n    // @return {Array} - the decoded picking color\n\n  }, {\n    key: \"decodePickingColor\",\n    value: function decodePickingColor(color) {\n      (0, _assert.default)(color instanceof Uint8Array);\n\n      var _color = _slicedToArray(color, 3),\n          i1 = _color[0],\n          i2 = _color[1],\n          i3 = _color[2]; // 1 was added to seperate from no selection\n\n\n      var index = i1 + i2 * 256 + i3 * 65536 - 1;\n      return index;\n    } // //////////////////////////////////////////////////\n    // LIFECYCLE METHODS, overridden by the layer subclasses\n    // Called once to set up the initial state\n    // App can create WebGL resources\n\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      throw new Error(\"Layer \".concat(this, \" has not defined initializeState\"));\n    } // Let's layer control if updateState should be called\n\n  }, {\n    key: \"shouldUpdateState\",\n    value: function shouldUpdateState(_ref3) {\n      var oldProps = _ref3.oldProps,\n          props = _ref3.props,\n          context = _ref3.context,\n          changeFlags = _ref3.changeFlags;\n      return changeFlags.propsOrDataChanged;\n    } // Default implementation, all attributes will be invalidated and updated\n    // when data changes\n\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref4) {\n      var oldProps = _ref4.oldProps,\n          props = _ref4.props,\n          context = _ref4.context,\n          changeFlags = _ref4.changeFlags;\n      var attributeManager = this.getAttributeManager();\n\n      if (changeFlags.dataChanged && attributeManager) {\n        attributeManager.invalidateAll();\n      }\n    } // Called once when layer is no longer matched and state will be discarded\n    // App can destroy WebGL resources here\n\n  }, {\n    key: \"finalizeState\",\n    value: function finalizeState() {\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = this.getModels()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var model = _step2.value;\n          model.delete();\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n\n      var attributeManager = this.getAttributeManager();\n\n      if (attributeManager) {\n        attributeManager.finalize();\n      }\n    } // If state has a model, draw it with supplied uniforms\n\n  }, {\n    key: \"draw\",\n    value: function draw(opts) {\n      var _iteratorNormalCompletion3 = true;\n      var _didIteratorError3 = false;\n      var _iteratorError3 = undefined;\n\n      try {\n        for (var _iterator3 = this.getModels()[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n          var model = _step3.value;\n          model.draw(opts);\n        }\n      } catch (err) {\n        _didIteratorError3 = true;\n        _iteratorError3 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {\n            _iterator3.return();\n          }\n        } finally {\n          if (_didIteratorError3) {\n            throw _iteratorError3;\n          }\n        }\n      }\n    } // called to populate the info object that is passed to the event handler\n    // @return null to cancel event\n\n  }, {\n    key: \"getPickingInfo\",\n    value: function getPickingInfo(_ref5) {\n      var info = _ref5.info,\n          mode = _ref5.mode;\n      var index = info.index;\n\n      if (index >= 0) {\n        // If props.data is an indexable array, get the object\n        if (Array.isArray(this.props.data)) {\n          info.object = this.props.data[index];\n        }\n      }\n\n      return info;\n    } // END LIFECYCLE METHODS\n    // //////////////////////////////////////////////////\n    // INTERNAL METHODS\n    // Default implementation of attribute invalidation, can be redefined\n\n  }, {\n    key: \"invalidateAttribute\",\n    value: function invalidateAttribute() {\n      var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'all';\n      var diffReason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n      var attributeManager = this.getAttributeManager();\n\n      if (!attributeManager) {\n        return;\n      }\n\n      if (name === 'all') {\n        _log.default.log(LOG_PRIORITY_UPDATE, \"updateTriggers invalidating all attributes: \".concat(diffReason))();\n\n        attributeManager.invalidateAll();\n      } else {\n        _log.default.log(LOG_PRIORITY_UPDATE, \"updateTriggers invalidating attribute \".concat(name, \": \").concat(diffReason))();\n\n        attributeManager.invalidate(name);\n      }\n    } // Calls attribute manager to update any WebGL attributes\n\n  }, {\n    key: \"updateAttributes\",\n    value: function updateAttributes(props) {\n      var attributeManager = this.getAttributeManager();\n\n      if (!attributeManager) {\n        return;\n      } // Figure out data length\n\n\n      var numInstances = this.getNumInstances(props);\n      attributeManager.update({\n        data: props.data,\n        numInstances: numInstances,\n        props: props,\n        transitions: props.transitions,\n        buffers: props,\n        context: this,\n        // Don't worry about non-attribute props\n        ignoreUnknownAttributes: true\n      });\n      var model = this.getSingleModel();\n\n      if (model) {\n        var changedAttributes = attributeManager.getChangedAttributes({\n          clearChangedFlags: true\n        });\n        model.setAttributes(changedAttributes);\n      }\n    } // Update attribute transition\n\n  }, {\n    key: \"updateTransition\",\n    value: function updateTransition() {\n      var attributeManager = this.getAttributeManager();\n\n      if (attributeManager) {\n        attributeManager.updateTransition();\n      }\n    }\n  }, {\n    key: \"calculateInstancePickingColors\",\n    value: function calculateInstancePickingColors(attribute, _ref6) {\n      var numInstances = _ref6.numInstances;\n      var value = attribute.value,\n          size = attribute.size;\n\n      if (value[0] === 1) {\n        // This can happen when data has changed, but the attribute value typed array\n        // has sufficient size and does not need to be re-allocated.\n        // This attribute is already populated, we do not have to recalculate it\n        return;\n      } // calculateInstancePickingColors always generates the same sequence.\n      // pickingColorCache saves the largest generated sequence for reuse\n\n\n      var cacheSize = pickingColorCache.length / size;\n\n      if (cacheSize < numInstances) {\n        // If the attribute is larger than the cache, resize the cache and populate the missing chunk\n        var newPickingColorCache = new Uint8ClampedArray(numInstances * size);\n        newPickingColorCache.set(pickingColorCache);\n        var pickingColor = [];\n\n        for (var i = cacheSize; i < numInstances; i++) {\n          this.encodePickingColor(i, pickingColor);\n          newPickingColorCache[i * size + 0] = pickingColor[0];\n          newPickingColorCache[i * size + 1] = pickingColor[1];\n          newPickingColorCache[i * size + 2] = pickingColor[2];\n        }\n\n        pickingColorCache = newPickingColorCache;\n      } // Copy the last calculated picking color sequence into the attribute\n\n\n      value.set(numInstances < cacheSize ? pickingColorCache.subarray(0, numInstances * size) : pickingColorCache);\n    } // Sets the specified instanced picking color to null picking color. Used for multi picking.\n\n  }, {\n    key: \"_clearInstancePickingColor\",\n    value: function _clearInstancePickingColor(color) {\n      var instancePickingColors = this.getAttributeManager().attributes.instancePickingColors;\n      var value = instancePickingColors.value,\n          size = instancePickingColors.size;\n      var i = this.decodePickingColor(color);\n      value[i * size + 0] = 0;\n      value[i * size + 1] = 0;\n      value[i * size + 2] = 0; // TODO: Optimize this to use sub-buffer update!\n\n      instancePickingColors.update({\n        value: value\n      });\n    } // Sets all occurrences of the specified picking color to null picking color. Used for multi picking.\n\n  }, {\n    key: \"_clearPickingColor\",\n    value: function _clearPickingColor(color) {\n      var pickingColors = this.getAttributeManager().attributes.pickingColors;\n      var value = pickingColors.value;\n\n      for (var i = 0; i < value.length; i += 3) {\n        if (value[i + 0] === color[0] && value[i + 1] === color[1] && value[i + 2] === color[2]) {\n          value[i + 0] = 0;\n          value[i + 1] = 0;\n          value[i + 2] = 0;\n        }\n      } // TODO: Optimize this to use sub-buffer update!\n\n\n      pickingColors.update({\n        value: value\n      });\n    } // This method figures out if we use instance colors or not\n    // and calls _clearInstancePickingColor or _clearPickingColor\n\n  }, {\n    key: \"clearPickingColor\",\n    value: function clearPickingColor(color) {\n      if (this.getAttributeManager().attributes.pickingColors) {\n        this._clearPickingColor(color);\n      } else {\n        this._clearInstancePickingColor(color);\n      }\n    }\n  }, {\n    key: \"copyPickingColors\",\n    value: function copyPickingColors() {\n      var _this$getAttributeMan = this.getAttributeManager().attributes,\n          pickingColors = _this$getAttributeMan.pickingColors,\n          instancePickingColors = _this$getAttributeMan.instancePickingColors;\n      var colors = pickingColors || instancePickingColors;\n      return new Uint8ClampedArray(colors.value);\n    }\n  }, {\n    key: \"restorePickingColors\",\n    value: function restorePickingColors(value) {\n      var _this$getAttributeMan2 = this.getAttributeManager().attributes,\n          pickingColors = _this$getAttributeMan2.pickingColors,\n          instancePickingColors = _this$getAttributeMan2.instancePickingColors;\n      var colors = pickingColors || instancePickingColors;\n      colors.update({\n        value: value\n      });\n    } // Deduces numer of instances. Intention is to support:\n    // - Explicit setting of numInstances\n    // - Auto-deduction for ES6 containers that define a size member\n    // - Auto-deduction for Classic Arrays via the built-in length attribute\n    // - Auto-deduction via arrays\n\n  }, {\n    key: \"getNumInstances\",\n    value: function getNumInstances(props) {\n      props = props || this.props; // First Check if app has provided an explicit value\n\n      if (props.numInstances !== undefined) {\n        return props.numInstances;\n      } // Second check if the layer has set its own value\n\n\n      if (this.state && this.state.numInstances !== undefined) {\n        return this.state.numInstances;\n      } // Use container library to get a count for any ES6 container or object\n\n\n      var data = this.props.data;\n      return (0, _count.count)(data);\n    } // LAYER MANAGER API\n    // Should only be called by the deck.gl LayerManager class\n    // Called by layer manager when a new layer is found\n\n    /* eslint-disable max-statements */\n\n  }, {\n    key: \"_initialize\",\n    value: function _initialize() {\n      this._initState(); // Call subclass lifecycle methods\n\n\n      this.initializeState(this.context); // End subclass lifecycle methods\n      // TODO deprecated, for backwards compatibility with older layers\n      // in case layer resets state\n\n      this.state.attributeManager = this.getAttributeManager(); // initializeState callback tends to clear state\n\n      this.setChangeFlags({\n        dataChanged: true,\n        propsChanged: true,\n        viewportChanged: true\n      });\n\n      this._updateState();\n\n      var model = this.getSingleModel();\n\n      if (model) {\n        model.id = this.props.id;\n        model.program.id = \"\".concat(this.props.id, \"-program\");\n        model.geometry.id = \"\".concat(this.props.id, \"-geometry\");\n      }\n    } // Called by layer manager\n    // if this layer is new (not matched with an existing layer) oldProps will be empty object\n\n  }, {\n    key: \"_update\",\n    value: function _update() {\n      // Call subclass lifecycle method\n      var stateNeedsUpdate = this.needsUpdate(); // End lifecycle method\n\n      if (stateNeedsUpdate) {\n        this._updateState();\n      }\n    }\n    /* eslint-enable max-statements */\n    // Common code for _initialize and _update\n\n  }, {\n    key: \"_updateState\",\n    value: function _updateState() {\n      var updateParams = this._getUpdateParams(); // Safely call subclass lifecycle methods\n\n\n      if (this.context.gl) {\n        this.updateState(updateParams);\n      } else {\n        try {\n          this.updateState(updateParams);\n        } catch (error) {// ignore error if gl context is missing\n        }\n      } // End subclass lifecycle methods\n\n\n      if (this.isComposite) {\n        // Render or update previously rendered sublayers\n        this._renderLayers(updateParams);\n      } else {\n        this.setNeedsRedraw(); // Add any subclass attributes\n\n        this.updateAttributes(this.props);\n\n        this._updateBaseUniforms(); // Note: Automatic instance count update only works for single layers\n\n\n        if (this.state.model) {\n          this.state.model.setInstanceCount(this.getNumInstances());\n        }\n      }\n\n      this.clearChangeFlags();\n      this.internalState.resetOldProps();\n    } // Called by manager when layer is about to be disposed\n    // Note: not guaranteed to be called on application shutdown\n\n  }, {\n    key: \"_finalize\",\n    value: function _finalize() {\n      (0, _assert.default)(this.internalState && this.state); // Call subclass lifecycle method\n\n      this.finalizeState(this.context); // End lifecycle method\n\n      (0, _seerIntegration.removeLayerInSeer)(this.id);\n    } // Calculates uniforms\n\n  }, {\n    key: \"drawLayer\",\n    value: function drawLayer(_ref7) {\n      var _this = this;\n\n      var _ref7$moduleParameter = _ref7.moduleParameters,\n          moduleParameters = _ref7$moduleParameter === void 0 ? null : _ref7$moduleParameter,\n          _ref7$uniforms = _ref7.uniforms,\n          uniforms = _ref7$uniforms === void 0 ? {} : _ref7$uniforms,\n          _ref7$parameters = _ref7.parameters,\n          parameters = _ref7$parameters === void 0 ? {} : _ref7$parameters;\n\n      if (!uniforms.picking_uActive) {\n        this.updateTransition();\n      } // TODO/ib - hack move to luma Model.draw\n\n\n      if (moduleParameters) {\n        this.setModuleParameters(moduleParameters);\n      } // Hack/ib - define a public luma function\n\n\n      var animationProps = this.context.animationProps;\n\n      if (animationProps) {\n        var _iteratorNormalCompletion4 = true;\n        var _didIteratorError4 = false;\n        var _iteratorError4 = undefined;\n\n        try {\n          for (var _iterator4 = this.getModels()[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n            var model = _step4.value;\n\n            model._setAnimationProps(animationProps);\n          }\n        } catch (err) {\n          _didIteratorError4 = true;\n          _iteratorError4 = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion4 && _iterator4.return != null) {\n              _iterator4.return();\n            }\n          } finally {\n            if (_didIteratorError4) {\n              throw _iteratorError4;\n            }\n          }\n        }\n      } // Apply polygon offset to avoid z-fighting\n      // TODO - move to draw-layers\n\n\n      var getPolygonOffset = this.props.getPolygonOffset;\n      var offsets = getPolygonOffset && getPolygonOffset(uniforms) || [0, 0];\n      parameters.polygonOffset = offsets; // Call subclass lifecycle method\n\n      (0, _luma.withParameters)(this.context.gl, parameters, function () {\n        _this.draw({\n          moduleParameters: moduleParameters,\n          uniforms: uniforms,\n          parameters: parameters,\n          context: _this.context\n        });\n      }); // End lifecycle method\n    } // {uniforms = {}, ...opts}\n\n  }, {\n    key: \"pickLayer\",\n    value: function pickLayer(opts) {\n      // Call subclass lifecycle method\n      return this.getPickingInfo(opts); // End lifecycle method\n    } // Helper methods\n\n  }, {\n    key: \"getChangeFlags\",\n    value: function getChangeFlags() {\n      return this.internalState.changeFlags;\n    } // Dirty some change flags, will be handled by updateLayer\n\n    /* eslint-disable complexity */\n\n  }, {\n    key: \"setChangeFlags\",\n    value: function setChangeFlags(flags) {\n      var _this2 = this;\n\n      this.internalState.changeFlags = this.internalState.changeFlags || {};\n      var changeFlags = this.internalState.changeFlags; // Update primary flags\n\n      if (flags.dataChanged && !changeFlags.dataChanged) {\n        changeFlags.dataChanged = flags.dataChanged;\n\n        _log.default.log(LOG_PRIORITY_UPDATE + 1, function () {\n          return \"dataChanged: \".concat(flags.dataChanged, \" in \").concat(_this2.id);\n        })();\n      }\n\n      if (flags.updateTriggersChanged && !changeFlags.updateTriggersChanged) {\n        changeFlags.updateTriggersChanged = changeFlags.updateTriggersChanged && flags.updateTriggersChanged ? Object.assign({}, flags.updateTriggersChanged, changeFlags.updateTriggersChanged) : flags.updateTriggersChanged || changeFlags.updateTriggersChanged;\n\n        _log.default.log(LOG_PRIORITY_UPDATE + 1, function () {\n          return 'updateTriggersChanged: ' + \"\".concat(Object.keys(flags.updateTriggersChanged).join(', '), \" in \").concat(_this2.id);\n        })();\n      }\n\n      if (flags.propsChanged && !changeFlags.propsChanged) {\n        changeFlags.propsChanged = flags.propsChanged;\n\n        _log.default.log(LOG_PRIORITY_UPDATE + 1, function () {\n          return \"propsChanged: \".concat(flags.propsChanged, \" in \").concat(_this2.id);\n        })();\n      }\n\n      if (flags.viewportChanged && !changeFlags.viewportChanged) {\n        changeFlags.viewportChanged = flags.viewportChanged;\n\n        _log.default.log(LOG_PRIORITY_UPDATE + 2, function () {\n          return \"viewportChanged: \".concat(flags.viewportChanged, \" in \").concat(_this2.id);\n        })();\n      }\n\n      if (flags.stateChanged && !changeFlags.stateChanged) {\n        changeFlags.stateChanged = flags.stateChanged;\n\n        _log.default.log(LOG_PRIORITY_UPDATE + 1, function () {\n          return \"stateChanged: \".concat(flags.stateChanged, \" in \").concat(_this2.id);\n        })();\n      } // Update composite flags\n\n\n      var propsOrDataChanged = flags.dataChanged || flags.updateTriggersChanged || flags.propsChanged;\n      changeFlags.propsOrDataChanged = changeFlags.propsOrDataChanged || propsOrDataChanged;\n      changeFlags.somethingChanged = changeFlags.somethingChanged || propsOrDataChanged || flags.viewportChanged || flags.stateChanged;\n    }\n    /* eslint-enable complexity */\n    // Clear all changeFlags, typically after an update\n\n  }, {\n    key: \"clearChangeFlags\",\n    value: function clearChangeFlags() {\n      this.internalState.changeFlags = {\n        // Primary changeFlags, can be strings stating reason for change\n        dataChanged: false,\n        propsChanged: false,\n        updateTriggersChanged: false,\n        viewportChanged: false,\n        stateChanged: false,\n        // Derived changeFlags\n        propsOrDataChanged: false,\n        somethingChanged: false\n      };\n    }\n  }, {\n    key: \"printChangeFlags\",\n    value: function printChangeFlags() {\n      var flags = this.internalState.changeFlags;\n      return \"\".concat(flags.dataChanged ? 'data ' : '').concat(flags.propsChanged ? 'props ' : '').concat(flags.updateTriggersChanged ? 'triggers ' : '').concat(flags.viewportChanged ? 'viewport' : '');\n    } // Compares the layers props with old props from a matched older layer\n    // and extracts change flags that describe what has change so that state\n    // can be update correctly with minimal effort\n\n  }, {\n    key: \"diffProps\",\n    value: function diffProps(newProps, oldProps) {\n      var changeFlags = (0, _props.diffProps)(newProps, oldProps); // iterate over changedTriggers\n\n      if (changeFlags.updateTriggersChanged) {\n        for (var key in changeFlags.updateTriggersChanged) {\n          if (changeFlags.updateTriggersChanged[key]) {\n            this._activeUpdateTrigger(key);\n          }\n        }\n      }\n\n      return this.setChangeFlags(changeFlags);\n    } // Called by layer manager to validate props (in development)\n\n  }, {\n    key: \"validateProps\",\n    value: function validateProps() {\n      (0, _props.validateProps)(this.props);\n    }\n  }, {\n    key: \"setModuleParameters\",\n    value: function setModuleParameters(moduleParameters) {\n      var _iteratorNormalCompletion5 = true;\n      var _didIteratorError5 = false;\n      var _iteratorError5 = undefined;\n\n      try {\n        for (var _iterator5 = this.getModels()[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n          var model = _step5.value;\n          model.updateModuleSettings(moduleParameters);\n        }\n      } catch (err) {\n        _didIteratorError5 = true;\n        _iteratorError5 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion5 && _iterator5.return != null) {\n            _iterator5.return();\n          }\n        } finally {\n          if (_didIteratorError5) {\n            throw _iteratorError5;\n          }\n        }\n      }\n    } // PRIVATE METHODS\n\n  }, {\n    key: \"_getUpdateParams\",\n    value: function _getUpdateParams() {\n      return {\n        props: this.props,\n        oldProps: this.internalState.getOldProps(),\n        context: this.context,\n        changeFlags: this.internalState.changeFlags\n      };\n    } // Checks state of attributes and model\n\n  }, {\n    key: \"_getNeedsRedraw\",\n    value: function _getNeedsRedraw(clearRedrawFlags) {\n      // this method may be called by the render loop as soon a the layer\n      // has been created, so guard against uninitialized state\n      if (!this.internalState) {\n        return false;\n      }\n\n      var redraw = false;\n      redraw = redraw || this.internalState.needsRedraw && this.id;\n      this.internalState.needsRedraw = this.internalState.needsRedraw && !clearRedrawFlags; // TODO - is attribute manager needed? - Model should be enough.\n\n      var attributeManager = this.getAttributeManager();\n      var attributeManagerNeedsRedraw = attributeManager && attributeManager.getNeedsRedraw({\n        clearRedrawFlags: clearRedrawFlags\n      });\n      redraw = redraw || attributeManagerNeedsRedraw;\n      return redraw;\n    } // Create new attribute manager\n\n  }, {\n    key: \"_getAttributeManager\",\n    value: function _getAttributeManager() {\n      return new _attributeManager.default(this.context.gl, {\n        id: this.props.id,\n        stats: this.context.stats\n      });\n    }\n  }, {\n    key: \"_initState\",\n    value: function _initState() {\n      (0, _assert.default)(!this.internalState && !this.state);\n\n      var attributeManager = this._getAttributeManager();\n\n      if (attributeManager) {\n        // All instanced layers get instancePickingColors attribute by default\n        // Their shaders can use it to render a picking scene\n        // TODO - this slightly slows down non instanced layers\n        attributeManager.addInstanced({\n          instancePickingColors: {\n            type: _constants2.default.UNSIGNED_BYTE,\n            size: 3,\n            update: this.calculateInstancePickingColors\n          }\n        });\n      }\n\n      this.internalState = new _layerState.default({\n        attributeManager: attributeManager,\n        layer: this\n      });\n      this.state = {}; // TODO deprecated, for backwards compatibility with older layers\n\n      this.state.attributeManager = attributeManager;\n      this.internalState.onAsyncPropUpdated = this._onAsyncPropUpdated.bind(this); // Ensure any async props are updated\n\n      this.internalState.setAsyncProps(this.props);\n    } // Called by layer manager to transfer state from an old layer\n\n  }, {\n    key: \"_transferState\",\n    value: function _transferState(oldLayer) {\n      var state = oldLayer.state,\n          internalState = oldLayer.internalState;\n      (0, _assert.default)(state && internalState);\n\n      if (this === oldLayer) {\n        return;\n      } // Move internalState\n\n\n      this.internalState = internalState;\n      this.internalState.component = this; // Move state\n\n      this.state = state; // Deprecated: layer references on `state`\n\n      state.layer = this; // We keep the state ref on old layers to support async actions\n      // oldLayer.state = null;\n      // Ensure any async props are updated\n\n      this.internalState.setAsyncProps(this.props); // Update model layer reference\n\n      var _iteratorNormalCompletion6 = true;\n      var _didIteratorError6 = false;\n      var _iteratorError6 = undefined;\n\n      try {\n        for (var _iterator6 = this.getModels()[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {\n          var model = _step6.value;\n          model.userData.layer = this;\n        }\n      } catch (err) {\n        _didIteratorError6 = true;\n        _iteratorError6 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion6 && _iterator6.return != null) {\n            _iterator6.return();\n          }\n        } finally {\n          if (_didIteratorError6) {\n            throw _iteratorError6;\n          }\n        }\n      }\n\n      this.diffProps(this.props, this.internalState.getOldProps());\n    }\n  }, {\n    key: \"_onAsyncPropUpdated\",\n    value: function _onAsyncPropUpdated() {\n      this.diffProps(this.props, this.internalState.getOldProps());\n      this.setLayerNeedsUpdate();\n    } // Operate on each changed triggers, will be called when an updateTrigger changes\n\n  }, {\n    key: \"_activeUpdateTrigger\",\n    value: function _activeUpdateTrigger(propName) {\n      this.invalidateAttribute(propName);\n    }\n  }, {\n    key: \"_updateBaseUniforms\",\n    value: function _updateBaseUniforms() {\n      var _this3 = this;\n\n      var uniforms = {\n        // apply gamma to opacity to make it visually \"linear\"\n        opacity: typeof this.props.opacity === 'function' ? function (animationProps) {\n          return Math.pow(_this3.props.opacity(animationProps), 1 / 2.2);\n        } : Math.pow(this.props.opacity, 1 / 2.2)\n      };\n      var _iteratorNormalCompletion7 = true;\n      var _didIteratorError7 = false;\n      var _iteratorError7 = undefined;\n\n      try {\n        for (var _iterator7 = this.getModels()[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {\n          var model = _step7.value;\n          model.setUniforms(uniforms);\n        }\n      } catch (err) {\n        _didIteratorError7 = true;\n        _iteratorError7 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion7 && _iterator7.return != null) {\n            _iterator7.return();\n          }\n        } finally {\n          if (_didIteratorError7) {\n            throw _iteratorError7;\n          }\n        }\n      }\n    } // DEPRECATED METHODS\n    // Updates selected state members and marks the object for redraw\n\n  }, {\n    key: \"setUniforms\",\n    value: function setUniforms(uniformMap) {\n      var _iteratorNormalCompletion8 = true;\n      var _didIteratorError8 = false;\n      var _iteratorError8 = undefined;\n\n      try {\n        for (var _iterator8 = this.getModels()[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {\n          var model = _step8.value;\n          model.setUniforms(uniformMap);\n        } // TODO - set needsRedraw on the model(s)?\n\n      } catch (err) {\n        _didIteratorError8 = true;\n        _iteratorError8 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion8 && _iterator8.return != null) {\n            _iterator8.return();\n          }\n        } finally {\n          if (_didIteratorError8) {\n            throw _iteratorError8;\n          }\n        }\n      }\n\n      this.setNeedsRedraw();\n\n      _log.default.deprecated('layer.setUniforms', 'model.setUniforms')();\n    }\n  }, {\n    key: \"is64bitEnabled\",\n    value: function is64bitEnabled() {\n      _log.default.deprecated('is64bitEnabled', 'use64bitProjection')();\n\n      return this.use64bitProjection();\n    }\n  }]);\n\n  return Layer;\n}(_component.default);\n\nexports.default = Layer;\nLayer.layerName = 'Layer';\nLayer.defaultProps = defaultProps;\n},{\"./constants\":\"hXbg\",\"./attribute-manager\":\"c12z\",\"./seer-integration\":\"ht98\",\"../lifecycle/props\":\"IyuU\",\"../utils/count\":\"frIP\",\"../utils/log\":\"mqAj\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"../utils/assert\":\"R2tg\",\"../shaderlib/project/project-functions\":\"gPUa\",\"../lifecycle/component\":\"pir1\",\"./layer-state\":\"hMc6\",\"viewport-mercator-project\":\"ha5B\"}],\"bFdC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.drawLayers = drawLayers;\nexports.drawPickingBuffer = drawPickingBuffer;\nexports.getPixelRatio = void 0;\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* global window */\nvar LOG_PRIORITY_DRAW = 2;\nvar renderCount = 0; // TODO - Exported for pick-layers.js - Move to util?\n\nvar getPixelRatio = function getPixelRatio(_ref) {\n  var useDevicePixels = _ref.useDevicePixels;\n  (0, _assert.default)(typeof useDevicePixels === 'boolean', 'Invalid useDevicePixels');\n  return useDevicePixels && typeof window !== 'undefined' ? window.devicePixelRatio : 1;\n}; // Convert viewport top-left CSS coordinates to bottom up WebGL coordinates\n\n\nexports.getPixelRatio = getPixelRatio;\n\nvar getGLViewport = function getGLViewport(gl, _ref2) {\n  var viewport = _ref2.viewport,\n      pixelRatio = _ref2.pixelRatio; // TODO - dummy default for node\n  // Fallback to width/height when clientWidth/clientHeight are 0 or undefined.\n\n  var height = gl.canvas ? gl.canvas.clientHeight || gl.canvas.height : 100; // Convert viewport top-left CSS coordinates to bottom up WebGL coordinates\n\n  var dimensions = viewport;\n  return [dimensions.x * pixelRatio, (height - dimensions.y - dimensions.height) * pixelRatio, dimensions.width * pixelRatio, dimensions.height * pixelRatio];\n}; // Helper functions\n\n\nfunction clearCanvas(gl, _ref3) {\n  var useDevicePixels = _ref3.useDevicePixels; // const pixelRatio = getPixelRatio({useDevicePixels});\n\n  var width = gl.drawingBufferWidth;\n  var height = gl.drawingBufferHeight; // clear depth and color buffers, restoring transparency\n\n  (0, _luma.withParameters)(gl, {\n    viewport: [0, 0, width, height]\n  }, function () {\n    gl.clear(_constants.default.COLOR_BUFFER_BIT | _constants.default.DEPTH_BUFFER_BIT);\n  });\n} // Draw a list of layers in a list of viewports\n\n\nfunction drawLayers(gl, _ref4) {\n  var layers = _ref4.layers,\n      viewports = _ref4.viewports,\n      views = _ref4.views,\n      onViewportActive = _ref4.onViewportActive,\n      useDevicePixels = _ref4.useDevicePixels,\n      _ref4$drawPickingColo = _ref4.drawPickingColors,\n      drawPickingColors = _ref4$drawPickingColo === void 0 ? false : _ref4$drawPickingColo,\n      _ref4$deviceRect = _ref4.deviceRect,\n      deviceRect = _ref4$deviceRect === void 0 ? null : _ref4$deviceRect,\n      _ref4$parameters = _ref4.parameters,\n      parameters = _ref4$parameters === void 0 ? {} : _ref4$parameters,\n      _ref4$layerFilter = _ref4.layerFilter,\n      layerFilter = _ref4$layerFilter === void 0 ? null : _ref4$layerFilter,\n      _ref4$pass = _ref4.pass,\n      pass = _ref4$pass === void 0 ? 'draw' : _ref4$pass,\n      _ref4$redrawReason = _ref4.redrawReason,\n      redrawReason = _ref4$redrawReason === void 0 ? '' : _ref4$redrawReason,\n      stats = _ref4.stats,\n      customRender = _ref4.customRender;\n\n  if (!customRender) {\n    clearCanvas(gl, {\n      useDevicePixels: useDevicePixels\n    });\n  } // effectManager.preDraw();\n\n\n  viewports.forEach(function (viewportOrDescriptor, i) {\n    var viewport = getViewportFromDescriptor(viewportOrDescriptor);\n    var view = views && views[viewport.id]; // Update context to point to this viewport\n\n    onViewportActive(viewport); // render this viewport\n\n    drawLayersInViewport(gl, {\n      layers: layers,\n      viewport: viewport,\n      view: view,\n      useDevicePixels: useDevicePixels,\n      drawPickingColors: drawPickingColors,\n      deviceRect: deviceRect,\n      parameters: parameters,\n      layerFilter: layerFilter,\n      pass: pass,\n      redrawReason: redrawReason,\n      stats: stats\n    });\n  }); // effectManager.draw();\n} // Draws list of layers and viewports into the picking buffer\n// Note: does not sample the buffer, that has to be done by the caller\n\n\nfunction drawPickingBuffer(gl, _ref5) {\n  var layers = _ref5.layers,\n      viewports = _ref5.viewports,\n      onViewportActive = _ref5.onViewportActive,\n      useDevicePixels = _ref5.useDevicePixels,\n      pickingFBO = _ref5.pickingFBO,\n      _ref5$deviceRect = _ref5.deviceRect,\n      x = _ref5$deviceRect.x,\n      y = _ref5$deviceRect.y,\n      width = _ref5$deviceRect.width,\n      height = _ref5$deviceRect.height,\n      _ref5$layerFilter = _ref5.layerFilter,\n      layerFilter = _ref5$layerFilter === void 0 ? null : _ref5$layerFilter,\n      _ref5$redrawReason = _ref5.redrawReason,\n      redrawReason = _ref5$redrawReason === void 0 ? '' : _ref5$redrawReason; // Make sure we clear scissor test and fbo bindings in case of exceptions\n  // We are only interested in one pixel, no need to render anything else\n  // Note that the callback here is called synchronously.\n  // Set blend mode for picking\n  // always overwrite existing pixel with [r,g,b,layerIndex]\n\n  return (0, _luma.withParameters)(gl, {\n    framebuffer: pickingFBO,\n    scissorTest: true,\n    scissor: [x, y, width, height],\n    clearColor: [0, 0, 0, 0]\n  }, function () {\n    drawLayers(gl, {\n      layers: layers,\n      viewports: viewports,\n      onViewportActive: onViewportActive,\n      useDevicePixels: useDevicePixels,\n      drawPickingColors: true,\n      layerFilter: layerFilter,\n      pass: 'picking',\n      redrawReason: redrawReason,\n      parameters: {\n        blend: true,\n        blendFunc: [gl.ONE, gl.ZERO, gl.CONSTANT_ALPHA, gl.ZERO],\n        blendEquation: gl.FUNC_ADD,\n        blendColor: [0, 0, 0, 0]\n      }\n    });\n  });\n} // Draws a list of layers in one viewport\n// TODO - when picking we could completely skip rendering viewports that dont\n// intersect with the picking rect\n\n\nfunction drawLayersInViewport(gl, _ref6) {\n  var layers = _ref6.layers,\n      viewport = _ref6.viewport,\n      view = _ref6.view,\n      useDevicePixels = _ref6.useDevicePixels,\n      _ref6$drawPickingColo = _ref6.drawPickingColors,\n      drawPickingColors = _ref6$drawPickingColo === void 0 ? false : _ref6$drawPickingColo,\n      _ref6$deviceRect = _ref6.deviceRect,\n      deviceRect = _ref6$deviceRect === void 0 ? null : _ref6$deviceRect,\n      _ref6$parameters = _ref6.parameters,\n      parameters = _ref6$parameters === void 0 ? {} : _ref6$parameters,\n      layerFilter = _ref6.layerFilter,\n      _ref6$pass = _ref6.pass,\n      pass = _ref6$pass === void 0 ? 'draw' : _ref6$pass,\n      _ref6$redrawReason = _ref6.redrawReason,\n      redrawReason = _ref6$redrawReason === void 0 ? '' : _ref6$redrawReason,\n      stats = _ref6.stats;\n  var pixelRatio = getPixelRatio({\n    useDevicePixels: useDevicePixels\n  });\n  var glViewport = getGLViewport(gl, {\n    viewport: viewport,\n    pixelRatio: pixelRatio\n  });\n\n  if (view && view.props.clear) {\n    var clearOpts = view.props.clear === true ? {\n      color: true,\n      depth: true\n    } : view.props.clear;\n    (0, _luma.withParameters)(gl, {\n      scissorTest: true,\n      scissor: glViewport\n    }, function () {\n      return (0, _luma.clear)(gl, clearOpts);\n    });\n  } // render layers in normal colors\n\n\n  var renderStats = {\n    totalCount: layers.length,\n    visibleCount: 0,\n    compositeCount: 0,\n    pickableCount: 0\n  }; // const {x, y, width, height} = deviceRect || [];\n\n  (0, _luma.setParameters)(gl, parameters || {}); // render layers in normal colors\n\n  layers.forEach(function (layer, layerIndex) {\n    // Check if we should draw layer\n    var shouldDrawLayer = !layer.isComposite && layer.props.visible;\n\n    if (drawPickingColors) {\n      shouldDrawLayer = shouldDrawLayer && layer.props.pickable;\n    }\n\n    if (shouldDrawLayer && layerFilter) {\n      shouldDrawLayer = layerFilter({\n        layer: layer,\n        viewport: viewport,\n        isPicking: drawPickingColors\n      });\n    } // Calculate stats\n\n\n    if (shouldDrawLayer && layer.props.pickable) {\n      renderStats.pickableCount++;\n    }\n\n    if (layer.isComposite) {\n      renderStats.compositeCount++;\n    } // Draw the layer\n\n\n    if (shouldDrawLayer) {\n      renderStats.visibleCount++;\n      drawLayerInViewport({\n        gl: gl,\n        layer: layer,\n        layerIndex: layerIndex,\n        drawPickingColors: drawPickingColors,\n        pixelRatio: pixelRatio,\n        glViewport: glViewport,\n        parameters: parameters\n      });\n    }\n  });\n  renderCount++;\n  logRenderStats({\n    renderStats: renderStats,\n    pass: pass,\n    redrawReason: redrawReason,\n    stats: stats\n  });\n}\n\nfunction drawLayerInViewport(_ref7) {\n  var gl = _ref7.gl,\n      layer = _ref7.layer,\n      layerIndex = _ref7.layerIndex,\n      drawPickingColors = _ref7.drawPickingColors,\n      pixelRatio = _ref7.pixelRatio,\n      glViewport = _ref7.glViewport,\n      parameters = _ref7.parameters;\n  var moduleParameters = Object.assign(Object.create(layer.props), {\n    viewport: layer.context.viewport,\n    pickingActive: drawPickingColors ? 1 : 0,\n    devicePixelRatio: pixelRatio\n  });\n  var uniforms = Object.assign({}, layer.context.uniforms, {\n    layerIndex: layerIndex\n  }); // All parameter resolving is done here instead of the layer\n  // Blend parameters must not be overriden\n\n  var layerParameters = Object.assign({}, layer.props.parameters || {}, parameters);\n  Object.assign(layerParameters, {\n    viewport: glViewport\n  });\n\n  if (drawPickingColors) {\n    Object.assign(layerParameters, {\n      blendColor: [0, 0, 0, (layerIndex + 1) / 255]\n    });\n  } else {\n    Object.assign(moduleParameters, getObjectHighlightParameters(layer));\n  }\n\n  layer.drawLayer({\n    moduleParameters: moduleParameters,\n    uniforms: uniforms,\n    parameters: layerParameters\n  });\n}\n\nfunction logRenderStats(_ref8) {\n  var renderStats = _ref8.renderStats,\n      pass = _ref8.pass,\n      redrawReason = _ref8.redrawReason,\n      stats = _ref8.stats;\n\n  if (_log.default.priority >= LOG_PRIORITY_DRAW) {\n    var totalCount = renderStats.totalCount,\n        visibleCount = renderStats.visibleCount,\n        compositeCount = renderStats.compositeCount,\n        pickableCount = renderStats.pickableCount;\n    var primitiveCount = totalCount - compositeCount;\n    var hiddenCount = primitiveCount - visibleCount;\n    var message = '';\n    message += \"RENDER #\".concat(renderCount, \" \").concat(visibleCount, \" (of \").concat(totalCount, \" layers) to \").concat(pass, \" because \").concat(redrawReason, \" \");\n\n    if (_log.default.priority > LOG_PRIORITY_DRAW) {\n      message += \"(\".concat(hiddenCount, \" hidden, \").concat(compositeCount, \" composite \").concat(pickableCount, \" pickable)\");\n    }\n\n    _log.default.log(LOG_PRIORITY_DRAW, message)();\n\n    if (stats) {\n      stats.increment('redraw layers', visibleCount);\n    }\n  }\n} // Get a viewport from a viewport descriptor (which can be a plain viewport)\n\n\nfunction getViewportFromDescriptor(viewportOrDescriptor) {\n  return viewportOrDescriptor.viewport ? viewportOrDescriptor.viewport : viewportOrDescriptor;\n}\n/**\n * Returns the picking color of currenlty selected object of the given 'layer'.\n * @return {Array} - the picking color or null if layers selected object is invalid.\n */\n\n\nfunction getObjectHighlightParameters(layer) {\n  // TODO - inefficient to update settings every render?\n  // TODO: Add warning if 'highlightedObjectIndex' is > numberOfInstances of the model.\n  var _layer$props = layer.props,\n      highlightedObjectIndex = _layer$props.highlightedObjectIndex,\n      highlightColor = _layer$props.highlightColor;\n  var parameters = {\n    pickingHighlightColor: [highlightColor[0], highlightColor[1], highlightColor[2], highlightColor[3] || 255]\n  }; // Update picking module settings if highlightedObjectIndex is set.\n  // This will overwrite any settings from auto highlighting.\n\n  if (Number.isInteger(highlightedObjectIndex)) {\n    parameters.pickingSelectedColor = highlightedObjectIndex >= 0 ? layer.encodePickingColor(highlightedObjectIndex) : null;\n  }\n\n  return parameters;\n}\n},{\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"../utils/log\":\"mqAj\",\"../utils/assert\":\"R2tg\"}],\"uOUz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.pickObject = pickObject;\nexports.pickVisibleObjects = pickVisibleObjects;\nexports.getClosestFromPickingBuffer = getClosestFromPickingBuffer;\n\nvar _drawLayers = require(\"./draw-layers\");\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar NO_PICKED_OBJECT = {\n  pickedColor: null,\n  pickedLayer: null,\n  pickedObjectIndex: -1\n};\n/* eslint-disable max-depth, max-statements */\n// Pick the closest object at the given (x,y) coordinate\n\nfunction pickObject(gl, _ref) {\n  var layers = _ref.layers,\n      viewports = _ref.viewports,\n      x = _ref.x,\n      y = _ref.y,\n      radius = _ref.radius,\n      layerFilter = _ref.layerFilter,\n      _ref$depth = _ref.depth,\n      depth = _ref$depth === void 0 ? 1 : _ref$depth,\n      mode = _ref.mode,\n      onViewportActive = _ref.onViewportActive,\n      pickingFBO = _ref.pickingFBO,\n      lastPickedInfo = _ref.lastPickedInfo,\n      useDevicePixels = _ref.useDevicePixels; // Convert from canvas top-left to WebGL bottom-left coordinates\n  // And compensate for pixelRatio\n\n  var pixelRatio = (0, _drawLayers.getPixelRatio)({\n    useDevicePixels: useDevicePixels\n  });\n  var deviceX = Math.round(x * pixelRatio);\n  var deviceY = Math.round(gl.canvas.height - y * pixelRatio);\n  var deviceRadius = Math.round(radius * pixelRatio);\n  var deviceRect = getPickingRect({\n    deviceX: deviceX,\n    deviceY: deviceY,\n    deviceRadius: deviceRadius,\n    deviceWidth: pickingFBO.width,\n    deviceHeight: pickingFBO.height\n  });\n  var result = [];\n  var affectedLayers = {};\n\n  for (var i = 0; i < depth; i++) {\n    var pickedColors = deviceRect && drawAndSamplePickingBuffer(gl, {\n      layers: layers,\n      viewports: viewports,\n      onViewportActive: onViewportActive,\n      useDevicePixels: useDevicePixels,\n      pickingFBO: pickingFBO,\n      deviceRect: deviceRect,\n      layerFilter: layerFilter,\n      redrawReason: mode\n    });\n    var pickInfo = pickedColors && getClosestFromPickingBuffer(gl, {\n      pickedColors: pickedColors,\n      layers: layers,\n      deviceX: deviceX,\n      deviceY: deviceY,\n      deviceRadius: deviceRadius,\n      deviceRect: deviceRect\n    }) || NO_PICKED_OBJECT; // Only exclude if we need to run picking again.\n    // We need to run picking again if an object is detected AND\n    // we have not exhausted the requested depth.\n\n    if (pickInfo.pickedColor && i + 1 < depth) {\n      var layerId = pickInfo.pickedColor[3] - 1;\n\n      if (!affectedLayers[layerId]) {\n        // backup original colors\n        affectedLayers[layerId] = layers[layerId].copyPickingColors();\n      }\n\n      layers[layerId].clearPickingColor(pickInfo.pickedColor);\n    } // This logic needs to run even if no object is picked.\n\n\n    var processedPickInfos = processPickInfo({\n      pickInfo: pickInfo,\n      lastPickedInfo: lastPickedInfo,\n      mode: mode,\n      layers: layers,\n      viewports: viewports,\n      x: x,\n      y: y,\n      deviceX: deviceX,\n      deviceY: deviceY,\n      pixelRatio: pixelRatio\n    });\n\n    if (processedPickInfos) {\n      processedPickInfos.forEach(function (info) {\n        return result.push(info);\n      });\n    } // If no object is picked stop.\n\n\n    if (!pickInfo.pickedColor) {\n      break;\n    }\n  } // reset only affected buffers\n\n\n  Object.keys(affectedLayers).forEach(function (layerId) {\n    return layers[layerId].restorePickingColors(affectedLayers[layerId]);\n  });\n  return result;\n} // Pick all objects within the given bounding box\n\n\nfunction pickVisibleObjects(gl, _ref2) {\n  var layers = _ref2.layers,\n      viewports = _ref2.viewports,\n      x = _ref2.x,\n      y = _ref2.y,\n      width = _ref2.width,\n      height = _ref2.height,\n      mode = _ref2.mode,\n      layerFilter = _ref2.layerFilter,\n      onViewportActive = _ref2.onViewportActive,\n      pickingFBO = _ref2.pickingFBO,\n      useDevicePixels = _ref2.useDevicePixels; // Convert from canvas top-left to WebGL bottom-left coordinates\n  // And compensate for pixelRatio\n\n  var pixelRatio = (0, _drawLayers.getPixelRatio)({\n    useDevicePixels: useDevicePixels\n  });\n  var deviceLeft = Math.round(x * pixelRatio);\n  var deviceBottom = Math.round(gl.canvas.height - y * pixelRatio);\n  var deviceRight = Math.round((x + width) * pixelRatio);\n  var deviceTop = Math.round(gl.canvas.height - (y + height) * pixelRatio);\n  var deviceRect = {\n    x: deviceLeft,\n    y: deviceTop,\n    width: deviceRight - deviceLeft,\n    height: deviceBottom - deviceTop\n  };\n  var pickedColors = drawAndSamplePickingBuffer(gl, {\n    layers: layers,\n    viewports: viewports,\n    onViewportActive: onViewportActive,\n    pickingFBO: pickingFBO,\n    useDevicePixels: useDevicePixels,\n    deviceRect: deviceRect,\n    layerFilter: layerFilter,\n    redrawReason: mode\n  });\n  var pickInfos = getUniquesFromPickingBuffer(gl, {\n    pickedColors: pickedColors,\n    layers: layers\n  }); // Only return unique infos, identified by info.object\n\n  var uniqueInfos = new Map();\n  pickInfos.forEach(function (pickInfo) {\n    var info = {\n      color: pickInfo.pickedColor,\n      layer: null,\n      index: pickInfo.pickedObjectIndex,\n      picked: true,\n      x: x,\n      y: y,\n      width: width,\n      height: height,\n      pixelRatio: pixelRatio\n    };\n    info = getLayerPickingInfo({\n      layer: pickInfo.pickedLayer,\n      info: info,\n      mode: mode\n    });\n\n    if (!uniqueInfos.has(info.object)) {\n      uniqueInfos.set(info.object, info);\n    }\n  });\n  return Array.from(uniqueInfos.values());\n} // HELPER METHODS\n// returns pickedColor or null if no pickable layers found.\n\n\nfunction drawAndSamplePickingBuffer(gl, _ref3) {\n  var layers = _ref3.layers,\n      viewports = _ref3.viewports,\n      onViewportActive = _ref3.onViewportActive,\n      useDevicePixels = _ref3.useDevicePixels,\n      pickingFBO = _ref3.pickingFBO,\n      deviceRect = _ref3.deviceRect,\n      layerFilter = _ref3.layerFilter,\n      redrawReason = _ref3.redrawReason;\n  (0, _assert.default)(deviceRect);\n  (0, _assert.default)(Number.isFinite(deviceRect.width) && deviceRect.width > 0, '`width` must be > 0');\n  (0, _assert.default)(Number.isFinite(deviceRect.height) && deviceRect.height > 0, '`height` must be > 0');\n  var pickableLayers = layers.filter(function (layer) {\n    return layer.isPickable();\n  });\n\n  if (pickableLayers.length < 1) {\n    return null;\n  }\n\n  (0, _drawLayers.drawPickingBuffer)(gl, {\n    layers: layers,\n    viewports: viewports,\n    onViewportActive: onViewportActive,\n    useDevicePixels: useDevicePixels,\n    pickingFBO: pickingFBO,\n    deviceRect: deviceRect,\n    layerFilter: layerFilter,\n    redrawReason: redrawReason\n  }); // Read from an already rendered picking buffer\n  // Returns an Uint8ClampedArray of picked pixels\n\n  var x = deviceRect.x,\n      y = deviceRect.y,\n      width = deviceRect.width,\n      height = deviceRect.height;\n  var pickedColors = new Uint8Array(width * height * 4);\n  pickingFBO.readPixels({\n    x: x,\n    y: y,\n    width: width,\n    height: height,\n    pixelArray: pickedColors\n  });\n  return pickedColors;\n} // Indentifies which viewport, if any corresponds to x and y\n// Returns first viewport if no match\n// TODO - need to determine which viewport we are in\n// TODO - document concept of \"primary viewport\" that matches all coords?\n// TODO - static method on Viewport class?\n\n\nfunction getViewportFromCoordinates(_ref4) {\n  var viewports = _ref4.viewports;\n  var viewport = viewports[0];\n  return viewport;\n} // Calculate a picking rect centered on deviceX and deviceY and clipped to device\n// Returns null if pixel is outside of device\n\n\nfunction getPickingRect(_ref5) {\n  var deviceX = _ref5.deviceX,\n      deviceY = _ref5.deviceY,\n      deviceRadius = _ref5.deviceRadius,\n      deviceWidth = _ref5.deviceWidth,\n      deviceHeight = _ref5.deviceHeight;\n  var valid = deviceX >= 0 && deviceY >= 0 && deviceX < deviceWidth && deviceY < deviceHeight; // x, y out of bounds.\n\n  if (!valid) {\n    return null;\n  } // Create a box of size `radius * 2 + 1` centered at [deviceX, deviceY]\n\n\n  var x = Math.max(0, deviceX - deviceRadius);\n  var y = Math.max(0, deviceY - deviceRadius);\n  var width = Math.min(deviceWidth, deviceX + deviceRadius) - x + 1;\n  var height = Math.min(deviceHeight, deviceY + deviceRadius) - y + 1;\n  return {\n    x: x,\n    y: y,\n    width: width,\n    height: height\n  };\n} // TODO - break this monster function into 3+ parts\n\n\nfunction processPickInfo(_ref6) {\n  var pickInfo = _ref6.pickInfo,\n      lastPickedInfo = _ref6.lastPickedInfo,\n      mode = _ref6.mode,\n      layers = _ref6.layers,\n      viewports = _ref6.viewports,\n      x = _ref6.x,\n      y = _ref6.y,\n      deviceX = _ref6.deviceX,\n      deviceY = _ref6.deviceY,\n      pixelRatio = _ref6.pixelRatio;\n  var pickedColor = pickInfo.pickedColor,\n      pickedLayer = pickInfo.pickedLayer,\n      pickedObjectIndex = pickInfo.pickedObjectIndex;\n  var affectedLayers = pickedLayer ? [pickedLayer] : [];\n\n  if (mode === 'hover') {\n    // only invoke onHover events if picked object has changed\n    var lastPickedObjectIndex = lastPickedInfo.index;\n    var lastPickedLayerId = lastPickedInfo.layerId;\n    var pickedLayerId = pickedLayer && pickedLayer.props.id; // proceed only if picked object changed\n\n    if (pickedLayerId !== lastPickedLayerId || pickedObjectIndex !== lastPickedObjectIndex) {\n      if (pickedLayerId !== lastPickedLayerId) {\n        // We cannot store a ref to lastPickedLayer in the context because\n        // the state of an outdated layer is no longer valid\n        // and the props may have changed\n        var lastPickedLayer = layers.find(function (layer) {\n          return layer.props.id === lastPickedLayerId;\n        });\n\n        if (lastPickedLayer) {\n          // Let leave event fire before enter event\n          affectedLayers.unshift(lastPickedLayer);\n        }\n      } // Update layer manager context\n\n\n      lastPickedInfo.layerId = pickedLayerId;\n      lastPickedInfo.index = pickedObjectIndex;\n      lastPickedInfo.info = null;\n    }\n  }\n\n  var viewport = getViewportFromCoordinates({\n    viewports: viewports\n  }); // TODO - add coords\n\n  var coordinate = viewport && viewport.unproject([x, y]);\n  var baseInfo = {\n    color: null,\n    layer: null,\n    index: -1,\n    picked: false,\n    x: x,\n    y: y,\n    pixel: [x, y],\n    coordinate: coordinate,\n    // TODO remove the lngLat prop after compatibility check\n    lngLat: coordinate,\n    devicePixel: [deviceX, deviceY],\n    pixelRatio: pixelRatio\n  }; // Use a Map to store all picking infos.\n  // The following two forEach loops are the result of\n  // https://github.com/uber/deck.gl/issues/443\n  // Please be very careful when changing this pattern\n\n  var infos = new Map();\n  affectedLayers.forEach(function (layer) {\n    var info = Object.assign({}, baseInfo);\n\n    if (layer === pickedLayer) {\n      info.color = pickedColor;\n      info.index = pickedObjectIndex;\n      info.picked = true;\n    }\n\n    info = getLayerPickingInfo({\n      layer: layer,\n      info: info,\n      mode: mode\n    });\n\n    if (layer === pickedLayer && mode === 'hover') {\n      lastPickedInfo.info = info;\n    }\n\n    if (mode === 'hover') {\n      var pickingSelectedColor = layer.props.autoHighlight && pickedLayer === layer ? pickedColor : null;\n      layer.setModuleParameters({\n        pickingSelectedColor: pickingSelectedColor\n      }); // TODO this needsRedraw logic should be fixed in layer\n\n      layer.setNeedsRedraw();\n    } // This guarantees that there will be only one copy of info for\n    // one composite layer\n\n\n    if (info) {\n      infos.set(info.layer.id, info);\n    }\n  });\n  var unhandledPickInfos = callLayerPickingCallbacks(infos, mode);\n  return unhandledPickInfos;\n} // Per-layer event handlers (e.g. onClick, onHover) are provided by the\n// user and out of deck.gl's control. It's very much possible that\n// the user calls React lifecycle methods in these function, such as\n// ReactComponent.setState(). React lifecycle methods sometimes induce\n// a re-render and re-generation of props of deck.gl and its layers,\n// which invalidates all layers currently passed to this very function.\n// Therefore, per-layer event handlers must be invoked at the end\n// of the picking operation. NO operation that relies on the states of current\n// layers should be called after this code.\n\n\nfunction callLayerPickingCallbacks(infos, mode) {\n  var unhandledPickInfos = [];\n  infos.forEach(function (info) {\n    var handled = false;\n\n    switch (mode) {\n      case 'click':\n        handled = info.layer.onClick(info);\n        break;\n\n      case 'hover':\n        handled = info.layer.onHover(info);\n        break;\n\n      case 'query':\n        break;\n\n      default:\n        throw new Error('unknown pick type');\n    }\n\n    if (!handled) {\n      unhandledPickInfos.push(info);\n    }\n  });\n  return unhandledPickInfos;\n}\n/**\n * Pick at a specified pixel with a tolerance radius\n * Returns the closest object to the pixel in shape `{pickedColor, pickedLayer, pickedObjectIndex}`\n */\n\n\nfunction getClosestFromPickingBuffer(gl, _ref7) {\n  var pickedColors = _ref7.pickedColors,\n      layers = _ref7.layers,\n      deviceX = _ref7.deviceX,\n      deviceY = _ref7.deviceY,\n      deviceRadius = _ref7.deviceRadius,\n      deviceRect = _ref7.deviceRect;\n  (0, _assert.default)(pickedColors); // Traverse all pixels in picking results and find the one closest to the supplied\n  // [deviceX, deviceY]\n\n  var x = deviceRect.x,\n      y = deviceRect.y,\n      width = deviceRect.width,\n      height = deviceRect.height;\n  var minSquareDistanceToCenter = deviceRadius * deviceRadius;\n  var closestPixelIndex = -1;\n  var i = 0;\n\n  for (var row = 0; row < height; row++) {\n    var dy = row + y - deviceY;\n    var dy2 = dy * dy;\n\n    if (dy2 > minSquareDistanceToCenter) {\n      // skip this row\n      i += 4 * width;\n    } else {\n      for (var col = 0; col < width; col++) {\n        // Decode picked layer from color\n        var pickedLayerIndex = pickedColors[i + 3] - 1;\n\n        if (pickedLayerIndex >= 0) {\n          var dx = col + x - deviceX;\n          var d2 = dx * dx + dy2;\n\n          if (d2 <= minSquareDistanceToCenter) {\n            minSquareDistanceToCenter = d2;\n            closestPixelIndex = i;\n          }\n        }\n\n        i += 4;\n      }\n    }\n  }\n\n  if (closestPixelIndex >= 0) {\n    // Decode picked object index from color\n    var _pickedLayerIndex = pickedColors[closestPixelIndex + 3] - 1;\n\n    var pickedColor = pickedColors.slice(closestPixelIndex, closestPixelIndex + 4);\n    var pickedLayer = layers[_pickedLayerIndex];\n\n    if (pickedLayer) {\n      var pickedObjectIndex = pickedLayer.decodePickingColor(pickedColor);\n      return {\n        pickedColor: pickedColor,\n        pickedLayer: pickedLayer,\n        pickedObjectIndex: pickedObjectIndex\n      };\n    }\n\n    _log.default.error('Picked non-existent layer. Is picking buffer corrupt?')();\n  }\n\n  return NO_PICKED_OBJECT;\n}\n/* eslint-enable max-depth, max-statements */\n\n/**\n * Examines a picking buffer for unique colors\n * Returns array of unique objects in shape `{x, y, pickedColor, pickedLayer, pickedObjectIndex}`\n */\n\n\nfunction getUniquesFromPickingBuffer(gl, _ref8) {\n  var pickedColors = _ref8.pickedColors,\n      layers = _ref8.layers;\n  var uniqueColors = new Map(); // Traverse all pixels in picking results and get unique colors\n\n  if (pickedColors) {\n    for (var i = 0; i < pickedColors.length; i += 4) {\n      // Decode picked layer from color\n      var pickedLayerIndex = pickedColors[i + 3] - 1;\n\n      if (pickedLayerIndex >= 0) {\n        var pickedColor = pickedColors.slice(i, i + 4);\n        var colorKey = pickedColor.join(','); // eslint-disable-next-line\n\n        if (!uniqueColors.has(colorKey)) {\n          var pickedLayer = layers[pickedLayerIndex]; // eslint-disable-next-line\n\n          if (pickedLayer) {\n            uniqueColors.set(colorKey, {\n              pickedColor: pickedColor,\n              pickedLayer: pickedLayer,\n              pickedObjectIndex: pickedLayer.decodePickingColor(pickedColor)\n            });\n          } else {\n            _log.default.error('Picked non-existent layer. Is picking buffer corrupt?')();\n          }\n        }\n      }\n    }\n  }\n\n  return Array.from(uniqueColors.values());\n} // Walk up the layer composite chain to populate the info object\n\n\nfunction getLayerPickingInfo(_ref9) {\n  var layer = _ref9.layer,\n      info = _ref9.info,\n      mode = _ref9.mode;\n\n  while (layer && info) {\n    // For a composite layer, sourceLayer will point to the sublayer\n    // where the event originates from.\n    // It provides additional context for the composite layer's\n    // getPickingInfo() method to populate the info object\n    var sourceLayer = info.layer || layer;\n    info.layer = layer; // layer.pickLayer() function requires a non-null ```layer.state```\n    // object to funtion properly. So the layer refereced here\n    // must be the \"current\" layer, not an \"out-dated\" / \"invalidated\" layer\n\n    info = layer.pickLayer({\n      info: info,\n      mode: mode,\n      sourceLayer: sourceLayer\n    });\n    layer = layer.parent;\n  }\n\n  return info;\n}\n},{\"./draw-layers\":\"bFdC\",\"../utils/log\":\"mqAj\",\"../utils/assert\":\"R2tg\"}],\"XKEb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.flatten = flatten;\nexports.countVertices = countVertices;\nexports.flattenVertices = flattenVertices;\nexports.fillArray = fillArray;\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/**\n * Flattens a nested array into a single level array,\n * or a single value into an array with one value\n * @example flatten([[1, [2]], [3], 4]) => [1, 2, 3, 4]\n * @example flatten(1) => [1]\n * @param {Array} array The array to flatten.\n * @param {Function} filter= - Optional predicate called on each `value` to\n *   determine if it should be included (pushed onto) the resulting array.\n * @param {Function} map= - Optional transform applied to each array elements.\n * @param {Array} result=[] - Optional array to push value into\n * @return {Array} Returns the new flattened array (new array or `result` if provided)\n */\nfunction flatten(array) {\n  var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref$filter = _ref.filter,\n      filter = _ref$filter === void 0 ? function () {\n    return true;\n  } : _ref$filter,\n      _ref$map = _ref.map,\n      map = _ref$map === void 0 ? function (x) {\n    return x;\n  } : _ref$map,\n      _ref$result = _ref.result,\n      result = _ref$result === void 0 ? [] : _ref$result; // Wrap single object in array\n\n\n  if (!Array.isArray(array)) {\n    return filter(array) ? [map(array)] : [];\n  } // Deep flatten and filter the array\n\n\n  return flattenArray(array, filter, map, result);\n} // Deep flattens an array. Helper to `flatten`, see its parameters\n\n\nfunction flattenArray(array, filter, map, result) {\n  var index = -1;\n\n  while (++index < array.length) {\n    var value = array[index];\n\n    if (Array.isArray(value)) {\n      flattenArray(value, filter, map, result);\n    } else if (filter(value)) {\n      result.push(map(value));\n    }\n  }\n\n  return result;\n}\n\nfunction countVertices(nestedArray) {\n  var count = 0;\n  var index = -1;\n\n  while (++index < nestedArray.length) {\n    var value = nestedArray[index];\n\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n      count += countVertices(value);\n    } else {\n      count++;\n    }\n  }\n\n  return count;\n} // Flattens nested array of vertices, padding third coordinate as needed\n\n\nfunction flattenVertices(nestedArray) {\n  var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref2$result = _ref2.result,\n      result = _ref2$result === void 0 ? [] : _ref2$result,\n      _ref2$dimensions = _ref2.dimensions,\n      dimensions = _ref2$dimensions === void 0 ? 3 : _ref2$dimensions;\n\n  var index = -1;\n  var vertexLength = 0;\n\n  while (++index < nestedArray.length) {\n    var value = nestedArray[index];\n\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n      flattenVertices(value, {\n        result: result,\n        dimensions: dimensions\n      });\n    } else {\n      // eslint-disable-next-line\n      if (vertexLength < dimensions) {\n        result.push(value);\n        vertexLength++;\n      }\n    }\n  } // Add a third coordinate if needed\n\n\n  if (vertexLength > 0 && vertexLength < dimensions) {\n    result.push(0);\n  }\n\n  return result;\n} // Uses copyWithin to significantly speed up typed array value filling\n\n\nfunction fillArray(_ref3) {\n  var target = _ref3.target,\n      source = _ref3.source,\n      _ref3$start = _ref3.start,\n      start = _ref3$start === void 0 ? 0 : _ref3$start,\n      _ref3$count = _ref3.count,\n      count = _ref3$count === void 0 ? 1 : _ref3$count;\n  var length = source.length;\n  var total = count * length;\n  var copied = 0;\n\n  for (var i = start; copied < length; copied++) {\n    target[i++] = source[copied];\n  }\n\n  while (copied < total) {\n    // If we have copied less than half, copy everything we got\n    // else copy remaining in one operation\n    if (copied < total - copied) {\n      target.copyWithin(start + copied, start, start + copied);\n      copied *= 2;\n    } else {\n      target.copyWithin(start + copied, start, start + total - copied);\n      copied = total;\n    }\n  }\n\n  return target;\n} // Flattens nested array of vertices, padding third coordinate as needed\n\n/*\nexport function flattenTypedVertices(nestedArray, {\n  result = [],\n  Type = Float32Array,\n  start = 0,\n  dimensions = 3\n} = {}) {\n  let index = -1;\n  let vertexLength = 0;\n  while (++index < nestedArray.length) {\n    const value = nestedArray[index];\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n      start = flattenTypedVertices(value, {result, start, dimensions});\n    } else {\n      if (vertexLength < dimensions) { // eslint-disable-line\n        result[start++] = value;\n        vertexLength++;\n      }\n    }\n  }\n  // Add a third coordinate if needed\n  if (vertexLength > 0 && vertexLength < dimensions) {\n    result[start++] = 0;\n  }\n  return start;\n}\n*/\n},{}],\"ocTz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.transformVector = transformVector;\nexports.createMat4 = createMat4;\nexports.extractCameraVectors = extractCameraVectors;\nexports.mod = mod;\n\nvar vec4 = _interopRequireWildcard(require(\"gl-matrix/vec4\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Extensions to math.gl library. Intended to be folded back.\nfunction transformVector(matrix, vector) {\n  // Handle non-invertible matrix\n  if (!matrix) {\n    return null;\n  }\n\n  var result = vec4.transformMat4([0, 0, 0, 0], vector, matrix);\n  var scale = 1 / result[3];\n  vec4.multiply(result, result, [scale, scale, scale, scale]);\n  return result;\n} // Helper, avoids low-precision 32 bit matrices from gl-matrix mat4.create()\n\n\nfunction createMat4() {\n  return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n} // Extract camera vectors (move to math library?)\n\n\nfunction extractCameraVectors(_ref) {\n  var viewMatrix = _ref.viewMatrix,\n      viewMatrixInverse = _ref.viewMatrixInverse; // Read the translation from the inverse view matrix\n\n  return {\n    eye: [viewMatrixInverse[12], viewMatrixInverse[13], viewMatrixInverse[14]],\n    direction: [viewMatrix[2], viewMatrix[6], viewMatrix[10]],\n    up: [viewMatrix[1], viewMatrix[5], viewMatrix[9]]\n  };\n}\n\nfunction mod(value, divisor) {\n  (0, _assert.default)(Number.isFinite(value) && Number.isFinite(divisor));\n  var modulus = value % divisor;\n  return modulus < 0 ? divisor + modulus : modulus;\n}\n},{\"gl-matrix/vec4\":\"QGfo\",\"../utils/assert\":\"R2tg\"}],\"sjPB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _mathUtils = require(\"../utils/math-utils\");\n\nvar _math = require(\"math.gl\");\n\nvar mat4 = _interopRequireWildcard(require(\"gl-matrix/mat4\"));\n\nvar _viewportMercatorProject = require(\"viewport-mercator-project\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nvar IDENTITY = (0, _mathUtils.createMat4)();\nvar ZERO_VECTOR = [0, 0, 0];\nvar DEFAULT_DISTANCE_SCALES = {\n  pixelsPerMeter: [1, 1, 1],\n  metersPerPixel: [1, 1, 1],\n  pixelsPerDegree: [1, 1, 1],\n  degreesPerPixel: [1, 1, 1]\n};\nvar DEFAULT_ZOOM = 0;\nvar ERR_ARGUMENT = 'Illegal argument to Viewport';\n\nvar Viewport =\n/*#__PURE__*/\nfunction () {\n  /**\n   * @classdesc\n   * Manages coordinate system transformations for deck.gl.\n   *\n   * Note: The Viewport is immutable in the sense that it only has accessors.\n   * A new viewport instance should be created if any parameters have changed.\n   */\n  function Viewport() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, Viewport);\n\n    var _opts$id = opts.id,\n        id = _opts$id === void 0 ? null : _opts$id,\n        _opts$x = opts.x,\n        x = _opts$x === void 0 ? 0 : _opts$x,\n        _opts$y = opts.y,\n        y = _opts$y === void 0 ? 0 : _opts$y,\n        _opts$width = opts.width,\n        width = _opts$width === void 0 ? 1 : _opts$width,\n        _opts$height = opts.height,\n        height = _opts$height === void 0 ? 1 : _opts$height;\n    this.id = id || this.constructor.displayName || 'viewport';\n    this.x = x;\n    this.y = y; // Silently allow apps to send in w,h = 0,0\n\n    this.width = width || 1;\n    this.height = height || 1;\n\n    this._initViewMatrix(opts);\n\n    this._initProjectionMatrix(opts);\n\n    this._initPixelMatrices(); // Bind methods for easy access\n\n\n    this.equals = this.equals.bind(this);\n    this.project = this.project.bind(this);\n    this.unproject = this.unproject.bind(this);\n    this.projectPosition = this.projectPosition.bind(this);\n    this.unprojectPosition = this.unprojectPosition.bind(this);\n    this.projectFlat = this.projectFlat.bind(this);\n    this.unprojectFlat = this.unprojectFlat.bind(this);\n    this.getMatrices = this.getMatrices.bind(this);\n  } // Two viewports are equal if width and height are identical, and if\n  // their view and projection matrices are (approximately) equal.\n\n\n  _createClass(Viewport, [{\n    key: \"equals\",\n    value: function equals(viewport) {\n      if (!(viewport instanceof Viewport)) {\n        return false;\n      }\n\n      return viewport.width === this.width && viewport.height === this.height && (0, _math.equals)(viewport.projectionMatrix, this.projectionMatrix) && (0, _math.equals)(viewport.viewMatrix, this.viewMatrix); // TODO - check distance scales?\n    }\n    /**\n     * Projects xyz (possibly latitude and longitude) to pixel coordinates in window\n     * using viewport projection parameters\n     * - [longitude, latitude] to [x, y]\n     * - [longitude, latitude, Z] => [x, y, z]\n     * Note: By default, returns top-left coordinates for canvas/SVG type render\n     *\n     * @param {Array} lngLatZ - [lng, lat] or [lng, lat, Z]\n     * @param {Object} opts - options\n     * @param {Object} opts.topLeft=true - Whether projected coords are top left\n     * @return {Array} - [x, y] or [x, y, z] in top left coords\n     */\n\n  }, {\n    key: \"project\",\n    value: function project(xyz) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref$topLeft = _ref.topLeft,\n          topLeft = _ref$topLeft === void 0 ? true : _ref$topLeft;\n\n      var worldPosition = this.projectPosition(xyz);\n      var coord = (0, _viewportMercatorProject.worldToPixels)(worldPosition, this.pixelProjectionMatrix);\n\n      var _coord = _slicedToArray(coord, 2),\n          x = _coord[0],\n          y = _coord[1];\n\n      var y2 = topLeft ? y : this.height - y;\n      return xyz.length === 2 ? [x, y2] : [x, y2, coord[2]];\n    }\n    /**\n     * Unproject pixel coordinates on screen onto world coordinates,\n     * (possibly [lon, lat]) on map.\n     * - [x, y] => [lng, lat]\n     * - [x, y, z] => [lng, lat, Z]\n     * @param {Array} xyz -\n     * @param {Object} opts - options\n     * @param {Object} opts.topLeft=true - Whether origin is top left\n     * @return {Array|null} - [lng, lat, Z] or [X, Y, Z]\n     */\n\n  }, {\n    key: \"unproject\",\n    value: function unproject(xyz) {\n      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref2$topLeft = _ref2.topLeft,\n          topLeft = _ref2$topLeft === void 0 ? true : _ref2$topLeft,\n          targetZ = _ref2.targetZ;\n\n      var _xyz = _slicedToArray(xyz, 3),\n          x = _xyz[0],\n          y = _xyz[1],\n          z = _xyz[2];\n\n      var y2 = topLeft ? y : this.height - y;\n      var targetZWorld = targetZ && targetZ * this.distanceScales.pixelsPerMeter[2];\n      var coord = (0, _viewportMercatorProject.pixelsToWorld)([x, y2, z], this.pixelUnprojectionMatrix, targetZWorld);\n\n      var _this$unprojectPositi = this.unprojectPosition(coord),\n          _this$unprojectPositi2 = _slicedToArray(_this$unprojectPositi, 3),\n          X = _this$unprojectPositi2[0],\n          Y = _this$unprojectPositi2[1],\n          Z = _this$unprojectPositi2[2];\n\n      if (Number.isFinite(z)) {\n        return [X, Y, Z];\n      }\n\n      return Number.isFinite(targetZ) ? [X, Y, targetZ] : [X, Y];\n    } // NON_LINEAR PROJECTION HOOKS\n    // Used for web meractor projection\n\n  }, {\n    key: \"projectPosition\",\n    value: function projectPosition(xyz) {\n      var _this$projectFlat = this.projectFlat(xyz),\n          _this$projectFlat2 = _slicedToArray(_this$projectFlat, 2),\n          X = _this$projectFlat2[0],\n          Y = _this$projectFlat2[1];\n\n      var Z = (xyz[2] || 0) * this.distanceScales.pixelsPerMeter[2];\n      return [X, Y, Z];\n    }\n  }, {\n    key: \"unprojectPosition\",\n    value: function unprojectPosition(xyz) {\n      var _this$unprojectFlat = this.unprojectFlat(xyz),\n          _this$unprojectFlat2 = _slicedToArray(_this$unprojectFlat, 2),\n          X = _this$unprojectFlat2[0],\n          Y = _this$unprojectFlat2[1];\n\n      var Z = (xyz[2] || 0) * this.distanceScales.metersPerPixel[2];\n      return [X, Y, Z];\n    }\n    /**\n     * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.\n     * Performs the nonlinear part of the web mercator projection.\n     * Remaining projection is done with 4x4 matrices which also handles\n     * perspective.\n     * @param {Array} lngLat - [lng, lat] coordinates\n     *   Specifies a point on the sphere to project onto the map.\n     * @return {Array} [x,y] coordinates.\n     */\n\n  }, {\n    key: \"projectFlat\",\n    value: function projectFlat(xyz) {\n      var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.scale;\n\n      if (this.isGeospatial) {\n        return (0, _viewportMercatorProject.lngLatToWorld)(xyz, scale);\n      }\n\n      return xyz;\n    }\n    /**\n     * Unproject world point [x,y] on map onto {lat, lon} on sphere\n     * @param {object|Vector} xy - object with {x,y} members\n     *  representing point on projected map plane\n     * @return {GeoCoordinates} - object with {lat,lon} of point on sphere.\n     *   Has toArray method if you need a GeoJSON Array.\n     *   Per cartographic tradition, lat and lon are specified as degrees.\n     */\n\n  }, {\n    key: \"unprojectFlat\",\n    value: function unprojectFlat(xyz) {\n      var scale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.scale;\n\n      if (this.isGeospatial) {\n        return (0, _viewportMercatorProject.worldToLngLat)(xyz, scale);\n      }\n\n      return xyz;\n    }\n  }, {\n    key: \"getDistanceScales\",\n    value: function getDistanceScales() {\n      var coordinateOrigin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n      if (coordinateOrigin) {\n        return (0, _viewportMercatorProject.getDistanceScales)({\n          longitude: coordinateOrigin[0],\n          latitude: coordinateOrigin[1],\n          scale: this.scale,\n          highPrecision: true\n        });\n      }\n\n      return this.distanceScales;\n    }\n  }, {\n    key: \"getMatrices\",\n    value: function getMatrices() {\n      var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref3$modelMatrix = _ref3.modelMatrix,\n          modelMatrix = _ref3$modelMatrix === void 0 ? null : _ref3$modelMatrix;\n\n      var modelViewProjectionMatrix = this.viewProjectionMatrix;\n      var pixelProjectionMatrix = this.pixelProjectionMatrix;\n      var pixelUnprojectionMatrix = this.pixelUnprojectionMatrix;\n\n      if (modelMatrix) {\n        modelViewProjectionMatrix = mat4.multiply([], this.viewProjectionMatrix, modelMatrix);\n        pixelProjectionMatrix = mat4.multiply([], this.pixelProjectionMatrix, modelMatrix);\n        pixelUnprojectionMatrix = mat4.invert([], pixelProjectionMatrix);\n      }\n\n      var matrices = Object.assign({\n        modelViewProjectionMatrix: modelViewProjectionMatrix,\n        viewProjectionMatrix: this.viewProjectionMatrix,\n        viewMatrix: this.viewMatrix,\n        projectionMatrix: this.projectionMatrix,\n        // project/unproject between pixels and world\n        pixelProjectionMatrix: pixelProjectionMatrix,\n        pixelUnprojectionMatrix: pixelUnprojectionMatrix,\n        width: this.width,\n        height: this.height,\n        scale: this.scale\n      });\n      return matrices;\n    }\n  }, {\n    key: \"containsPixel\",\n    value: function containsPixel(_ref4) {\n      var x = _ref4.x,\n          y = _ref4.y,\n          _ref4$width = _ref4.width,\n          width = _ref4$width === void 0 ? 1 : _ref4$width,\n          _ref4$height = _ref4.height,\n          height = _ref4$height === void 0 ? 1 : _ref4$height;\n      return x < this.x + this.width && this.x < x + width && y < this.y + this.height && this.y < y + height;\n    } // EXPERIMENTAL METHODS\n\n  }, {\n    key: \"getCameraPosition\",\n    value: function getCameraPosition() {\n      return this.cameraPosition;\n    }\n  }, {\n    key: \"getCameraDirection\",\n    value: function getCameraDirection() {\n      return this.cameraDirection;\n    }\n  }, {\n    key: \"getCameraUp\",\n    value: function getCameraUp() {\n      return this.cameraUp;\n    } // INTERNAL METHODS\n    // TODO - these are duplicating WebMercator methods\n\n  }, {\n    key: \"_addMetersToLngLat\",\n    value: function _addMetersToLngLat(lngLatZ, xyz) {\n      var _lngLatZ = _slicedToArray(lngLatZ, 3),\n          lng = _lngLatZ[0],\n          lat = _lngLatZ[1],\n          _lngLatZ$ = _lngLatZ[2],\n          Z = _lngLatZ$ === void 0 ? 0 : _lngLatZ$;\n\n      var _this$_metersToLngLat = this._metersToLngLatDelta(xyz),\n          _this$_metersToLngLat2 = _slicedToArray(_this$_metersToLngLat, 3),\n          deltaLng = _this$_metersToLngLat2[0],\n          deltaLat = _this$_metersToLngLat2[1],\n          _this$_metersToLngLat3 = _this$_metersToLngLat2[2],\n          deltaZ = _this$_metersToLngLat3 === void 0 ? 0 : _this$_metersToLngLat3;\n\n      return lngLatZ.length === 2 ? [lng + deltaLng, lat + deltaLat] : [lng + deltaLng, lat + deltaLat, Z + deltaZ];\n    }\n  }, {\n    key: \"_metersToLngLatDelta\",\n    value: function _metersToLngLatDelta(xyz) {\n      var _xyz2 = _slicedToArray(xyz, 3),\n          x = _xyz2[0],\n          y = _xyz2[1],\n          _xyz2$ = _xyz2[2],\n          z = _xyz2$ === void 0 ? 0 : _xyz2$;\n\n      (0, _assert.default)(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z), ERR_ARGUMENT);\n      var _this$distanceScales = this.distanceScales,\n          pixelsPerMeter = _this$distanceScales.pixelsPerMeter,\n          degreesPerPixel = _this$distanceScales.degreesPerPixel;\n      var deltaLng = x * pixelsPerMeter[0] * degreesPerPixel[0];\n      var deltaLat = y * pixelsPerMeter[1] * degreesPerPixel[1];\n      return xyz.length === 2 ? [deltaLng, deltaLat] : [deltaLng, deltaLat, z];\n    }\n  }, {\n    key: \"_createProjectionMatrix\",\n    value: function _createProjectionMatrix(_ref5) {\n      var orthographic = _ref5.orthographic,\n          fovyRadians = _ref5.fovyRadians,\n          aspect = _ref5.aspect,\n          focalDistance = _ref5.focalDistance,\n          near = _ref5.near,\n          far = _ref5.far;\n      (0, _assert.default)(Number.isFinite(fovyRadians));\n      return orthographic ? new _math.Matrix4().orthographic({\n        fovy: fovyRadians,\n        aspect: aspect,\n        focalDistance: focalDistance,\n        near: near,\n        far: far\n      }) : new _math.Matrix4().perspective({\n        fovy: fovyRadians,\n        aspect: aspect,\n        near: near,\n        far: far\n      });\n    }\n    /* eslint-disable complexity, max-statements */\n\n  }, {\n    key: \"_initViewMatrix\",\n    value: function _initViewMatrix(opts) {\n      var _opts$viewMatrix = opts.viewMatrix,\n          viewMatrix = _opts$viewMatrix === void 0 ? IDENTITY : _opts$viewMatrix,\n          _opts$longitude = opts.longitude,\n          longitude = _opts$longitude === void 0 ? null : _opts$longitude,\n          _opts$latitude = opts.latitude,\n          latitude = _opts$latitude === void 0 ? null : _opts$latitude,\n          _opts$zoom = opts.zoom,\n          zoom = _opts$zoom === void 0 ? null : _opts$zoom,\n          _opts$position = opts.position,\n          position = _opts$position === void 0 ? null : _opts$position,\n          _opts$modelMatrix = opts.modelMatrix,\n          modelMatrix = _opts$modelMatrix === void 0 ? null : _opts$modelMatrix,\n          _opts$focalDistance = opts.focalDistance,\n          focalDistance = _opts$focalDistance === void 0 ? 1 : _opts$focalDistance,\n          _opts$distanceScales = opts.distanceScales,\n          distanceScales = _opts$distanceScales === void 0 ? null : _opts$distanceScales; // Check if we have a geospatial anchor\n\n      this.isGeospatial = Number.isFinite(latitude) && Number.isFinite(longitude);\n      this.zoom = zoom;\n\n      if (!Number.isFinite(this.zoom)) {\n        this.zoom = this.isGeospatial ? (0, _viewportMercatorProject.getMeterZoom)({\n          latitude: latitude\n        }) + Math.log2(focalDistance) : DEFAULT_ZOOM;\n      }\n\n      this.scale = Math.pow(2, this.zoom); // Calculate distance scales if lng/lat/zoom are provided\n\n      this.distanceScales = this.isGeospatial ? (0, _viewportMercatorProject.getDistanceScales)({\n        latitude: latitude,\n        longitude: longitude,\n        scale: this.scale\n      }) : distanceScales || DEFAULT_DISTANCE_SCALES;\n      this.focalDistance = focalDistance;\n      this.distanceScales.metersPerPixel = new _math.Vector3(this.distanceScales.metersPerPixel);\n      this.distanceScales.pixelsPerMeter = new _math.Vector3(this.distanceScales.pixelsPerMeter);\n      this.position = ZERO_VECTOR;\n      this.meterOffset = ZERO_VECTOR;\n\n      if (position) {\n        // Apply model matrix if supplied\n        this.position = position;\n        this.modelMatrix = modelMatrix;\n        this.meterOffset = modelMatrix ? modelMatrix.transformVector(position) : position;\n      }\n\n      if (this.isGeospatial) {\n        // Determine camera center\n        this.longitude = longitude;\n        this.latitude = latitude;\n        this.center = this._getCenterInWorld({\n          longitude: longitude,\n          latitude: latitude\n        }); // Flip Y to match the orientation of the Mercator plane\n\n        this.viewMatrixUncentered = mat4.scale([], viewMatrix, [1, -1, 1]); // Make a centered version of the matrix for projection modes without an offset\n\n        this.viewMatrix = new _math.Matrix4() // Apply the uncentered view matrix\n        .multiplyRight(this.viewMatrixUncentered) // And center it\n        .translate(new _math.Vector3(this.center || ZERO_VECTOR).negate());\n      } else {\n        this.center = position;\n        this.viewMatrixUncentered = viewMatrix;\n        this.viewMatrix = viewMatrix;\n      }\n    }\n    /* eslint-enable complexity, max-statements */\n\n  }, {\n    key: \"_getCenterInWorld\",\n    value: function _getCenterInWorld(_ref6) {\n      var longitude = _ref6.longitude,\n          latitude = _ref6.latitude;\n      var meterOffset = this.meterOffset,\n          scale = this.scale,\n          distanceScales = this.distanceScales; // Make a centered version of the matrix for projection modes without an offset\n\n      var center2d = this.projectFlat([longitude, latitude], scale);\n      var center = new _math.Vector3(center2d[0], center2d[1], 0);\n\n      if (meterOffset) {\n        var pixelPosition = new _math.Vector3(meterOffset) // Convert to pixels in current zoom\n        .scale(distanceScales.pixelsPerMeter);\n        center.add(pixelPosition);\n      }\n\n      return center;\n    }\n  }, {\n    key: \"_initProjectionMatrix\",\n    value: function _initProjectionMatrix(opts) {\n      var _opts$projectionMatri = opts.projectionMatrix,\n          projectionMatrix = _opts$projectionMatri === void 0 ? null : _opts$projectionMatri,\n          _opts$orthographic = opts.orthographic,\n          orthographic = _opts$orthographic === void 0 ? false : _opts$orthographic,\n          fovyRadians = opts.fovyRadians,\n          fovyDegrees = opts.fovyDegrees,\n          fovy = opts.fovy,\n          _opts$near = opts.near,\n          near = _opts$near === void 0 ? 0.1 : _opts$near,\n          _opts$far = opts.far,\n          far = _opts$far === void 0 ? 1000 : _opts$far,\n          _opts$focalDistance2 = opts.focalDistance,\n          focalDistance = _opts$focalDistance2 === void 0 ? 1 : _opts$focalDistance2,\n          orthographicFocalDistance = opts.orthographicFocalDistance;\n      var radians = fovyRadians || (fovyDegrees || fovy || 75) * DEGREES_TO_RADIANS;\n      this.projectionMatrix = projectionMatrix || this._createProjectionMatrix({\n        orthographic: orthographic,\n        fovyRadians: radians,\n        aspect: this.width / this.height,\n        focalDistance: orthographicFocalDistance || focalDistance,\n        near: near,\n        far: far\n      });\n    }\n  }, {\n    key: \"_initPixelMatrices\",\n    value: function _initPixelMatrices() {\n      // Note: As usual, matrix operations should be applied in \"reverse\" order\n      // since vectors will be multiplied in from the right during transformation\n      var vpm = (0, _mathUtils.createMat4)();\n      mat4.multiply(vpm, vpm, this.projectionMatrix);\n      mat4.multiply(vpm, vpm, this.viewMatrix);\n      this.viewProjectionMatrix = vpm; // console.log('VPM', this.viewMatrix, this.projectionMatrix, this.viewProjectionMatrix);\n      // Calculate inverse view matrix\n\n      this.viewMatrixInverse = mat4.invert([], this.viewMatrix) || this.viewMatrix; // Decompose camera directions\n\n      var _extractCameraVectors = (0, _mathUtils.extractCameraVectors)({\n        viewMatrix: this.viewMatrix,\n        viewMatrixInverse: this.viewMatrixInverse\n      }),\n          eye = _extractCameraVectors.eye,\n          direction = _extractCameraVectors.direction,\n          up = _extractCameraVectors.up;\n\n      this.cameraPosition = eye;\n      this.cameraDirection = direction;\n      this.cameraUp = up; // console.log(this.cameraPosition, this.cameraDirection, this.cameraUp);\n\n      /*\n       * Builds matrices that converts preprojected lngLats to screen pixels\n       * and vice versa.\n       * Note: Currently returns bottom-left coordinates!\n       * Note: Starts with the GL projection matrix and adds steps to the\n       *       scale and translate that matrix onto the window.\n       * Note: WebGL controls clip space to screen projection with gl.viewport\n       *       and does not need this step.\n       */\n      // matrix for conversion from world location to screen (pixel) coordinates\n\n      var viewportMatrix = (0, _mathUtils.createMat4)(); // matrix from NDC to viewport.\n\n      var pixelProjectionMatrix = (0, _mathUtils.createMat4)(); // matrix from world space to viewport.\n\n      mat4.scale(viewportMatrix, viewportMatrix, [this.width / 2, -this.height / 2, 1]);\n      mat4.translate(viewportMatrix, viewportMatrix, [1, -1, 0]);\n      mat4.multiply(pixelProjectionMatrix, viewportMatrix, this.viewProjectionMatrix);\n      this.pixelProjectionMatrix = pixelProjectionMatrix;\n      this.viewportMatrix = viewportMatrix;\n      this.pixelUnprojectionMatrix = mat4.invert((0, _mathUtils.createMat4)(), this.pixelProjectionMatrix);\n\n      if (!this.pixelUnprojectionMatrix) {\n        _log.default.warn('Pixel project matrix not invertible')(); // throw new Error('Pixel project matrix not invertible');\n\n      }\n    }\n  }]);\n\n  return Viewport;\n}();\n\nexports.default = Viewport;\nViewport.displayName = 'Viewport';\n},{\"../utils/log\":\"mqAj\",\"../utils/math-utils\":\"ocTz\",\"math.gl\":\"o5CE\",\"gl-matrix/mat4\":\"WdlT\",\"viewport-mercator-project\":\"ha5B\",\"../utils/assert\":\"R2tg\"}],\"D2hL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _seer = _interopRequireDefault(require(\"seer\"));\n\nvar _layer = _interopRequireDefault(require(\"./layer\"));\n\nvar _drawLayers2 = require(\"./draw-layers\");\n\nvar _pickLayers = require(\"./pick-layers\");\n\nvar _constants = require(\"../lifecycle/constants\");\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _flatten = require(\"../utils/flatten\");\n\nvar _probe = require(\"probe.gl\");\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar _seerIntegration = require(\"./seer-integration\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _iterableToArray(iter) {\n  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  }\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar LOG_PRIORITY_LIFECYCLE = 2;\nvar LOG_PRIORITY_LIFECYCLE_MINOR = 4; // CONTEXT IS EXPOSED TO LAYERS\n\nvar INITIAL_CONTEXT = Object.seal({\n  layerManager: null,\n  gl: null,\n  // Settings\n  useDevicePixels: true,\n  // Exposed in case custom layers need to adjust sizes\n  // General resources\n  stats: null,\n  // for tracking lifecycle performance\n  // GL Resources\n  shaderCache: null,\n  pickingFBO: null,\n  // Screen-size framebuffer that layers can reuse\n  // State\n  pickingEvent: null,\n  lastPickedInfo: null,\n  animationProps: null,\n  userData: {} // Place for any custom app `context`\n\n});\n\nvar layerName = function layerName(layer) {\n  return layer instanceof _layer.default ? \"\".concat(layer) : !layer ? 'null' : 'invalid';\n};\n\nvar LayerManager =\n/*#__PURE__*/\nfunction () {\n  // eslint-disable-next-line\n  function LayerManager(gl) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        stats = _ref.stats,\n        _ref$viewport = _ref.viewport,\n        viewport = _ref$viewport === void 0 ? null : _ref$viewport;\n\n    _classCallCheck(this, LayerManager); // Currently deck.gl expects the DeckGL.layers array to be different\n    // whenever React rerenders. If the same layers array is used, the\n    // LayerManager's diffing algorithm will generate a fatal error and\n    // break the rendering.\n    // `this.lastRenderedLayers` stores the UNFILTERED layers sent\n    // down to LayerManager, so that `layers` reference can be compared.\n    // If it's the same across two React render calls, the diffing logic\n    // will be skipped.\n\n\n    this.lastRenderedLayers = [];\n    this.layers = [];\n    this.context = Object.assign({}, INITIAL_CONTEXT, {\n      layerManager: this,\n      gl: gl,\n      // Enabling luma.gl Program caching using private API (_cachePrograms)\n      shaderCache: gl && new _luma._ShaderCache({\n        gl: gl,\n        _cachePrograms: true\n      }),\n      stats: stats || new _probe.Stats({\n        id: 'deck.gl'\n      }),\n      lastPickedInfo: {\n        // For callback tracking and autohighlight\n        index: -1,\n        layerId: null,\n        info: null\n      },\n      // Make sure context.viewport is not empty on the first layer initialization\n      viewport: viewport || new _viewport.default({\n        id: 'DEFAULT-INITIAL-VIEWPORT'\n      }) // Current viewport, exposed to layers for project* function\n\n    });\n    this.layerFilter = null;\n    this.drawPickingColors = false;\n    this._needsRedraw = 'Initial render';\n    this._needsUpdate = false;\n    this._debug = false;\n    this._activateViewport = this._activateViewport.bind(this); // Seer integration\n\n    this._initSeer = this._initSeer.bind(this);\n    this._editSeer = this._editSeer.bind(this);\n    Object.seal(this);\n    (0, _seerIntegration.seerInitListener)(this._initSeer);\n    (0, _seerIntegration.layerEditListener)(this._editSeer);\n  } // Method to call when the layer manager is not needed anymore.\n  // Currently used in the <DeckGL> componentWillUnmount lifecycle to unbind Seer listeners.\n\n\n  _createClass(LayerManager, [{\n    key: \"finalize\",\n    value: function finalize() {\n      _seer.default.removeListener(this._initSeer);\n\n      _seer.default.removeListener(this._editSeer);\n    } // Check if a redraw is needed\n\n  }, {\n    key: \"needsRedraw\",\n    value: function needsRedraw() {\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref2$clearRedrawFlag = _ref2.clearRedrawFlags,\n          clearRedrawFlags = _ref2$clearRedrawFlag === void 0 ? true : _ref2$clearRedrawFlag;\n\n      return this._checkIfNeedsRedraw(clearRedrawFlags);\n    } // Check if a deep update of all layers is needed\n\n  }, {\n    key: \"needsUpdate\",\n    value: function needsUpdate() {\n      return this._needsUpdate;\n    } // Layers will be redrawn (in next animation frame)\n\n  }, {\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw(reason) {\n      this._needsRedraw = this._needsRedraw || reason;\n    } // Layers will be updated deeply (in next animation frame)\n    // Potentially regenerating attributes and sub layers\n\n  }, {\n    key: \"setNeedsUpdate\",\n    value: function setNeedsUpdate(reason) {\n      this._needsUpdate = this._needsUpdate || reason;\n    } // Gets an (optionally) filtered list of layers\n\n  }, {\n    key: \"getLayers\",\n    value: function getLayers() {\n      var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref3$layerIds = _ref3.layerIds,\n          layerIds = _ref3$layerIds === void 0 ? null : _ref3$layerIds; // Filtering by layerId compares beginning of strings, so that sublayers will be included\n      // Dependes on the convention of adding suffixes to the parent's layer name\n\n\n      return layerIds ? this.layers.filter(function (layer) {\n        return layerIds.find(function (layerId) {\n          return layer.id.indexOf(layerId) === 0;\n        });\n      }) : this.layers;\n    }\n    /**\n     * Set props needed for layer rendering and picking.\n     * Parameters are to be passed as a single object, with the following values:\n     * @param {Boolean} useDevicePixels\n     */\n\n    /* eslint-disable complexity, max-statements */\n\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('debug' in props) {\n        this._debug = props.debug;\n      } // A way for apps to add data to context that can be accessed in layers\n\n\n      if ('userData' in props) {\n        this.context.userData = props.userData;\n      }\n\n      if ('useDevicePixels' in props) {\n        this.context.useDevicePixels = props.useDevicePixels;\n      } // TODO - For now we set layers before viewports to preserve changeFlags\n\n\n      if ('layers' in props) {\n        this.setLayers(props.layers);\n      }\n\n      if ('layerFilter' in props) {\n        if (this.layerFilter !== props.layerFilter) {\n          this.layerFilter = props.layerFilter;\n          this.setNeedsRedraw('layerFilter changed');\n        }\n      }\n\n      if ('drawPickingColors' in props) {\n        if (props.drawPickingColors !== this.drawPickingColors) {\n          this.drawPickingColors = props.drawPickingColors;\n          this.setNeedsRedraw('drawPickingColors changed');\n        }\n      }\n    }\n    /* eslint-enable complexity, max-statements */\n    // Supply a new layer list, initiating sublayer generation and layer matching\n\n  }, {\n    key: \"setLayers\",\n    value: function setLayers(newLayers) {\n      // TODO - something is generating state updates that cause rerender of the same\n      if (newLayers === this.lastRenderedLayers) {\n        _log.default.log(3, 'Ignoring layer update due to layer array not changed')();\n\n        return this;\n      }\n\n      this.lastRenderedLayers = newLayers;\n      newLayers = (0, _flatten.flatten)(newLayers, {\n        filter: Boolean\n      });\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = newLayers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var layer = _step.value;\n          layer.context = this.context;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      var _this$_updateLayers = this._updateLayers({\n        oldLayers: this.layers,\n        newLayers: newLayers\n      }),\n          error = _this$_updateLayers.error,\n          generatedLayers = _this$_updateLayers.generatedLayers;\n\n      this.layers = generatedLayers; // Throw first error found, if any\n\n      if (error) {\n        throw error;\n      }\n\n      return this;\n    } // Update layers from last cycle if `setNeedsUpdate()` has been called\n\n  }, {\n    key: \"updateLayers\",\n    value: function updateLayers() {\n      // NOTE: For now, even if only some layer has changed, we update all layers\n      // to ensure that layer id maps etc remain consistent even if different\n      // sublayers are rendered\n      var reason = this.needsUpdate();\n\n      if (reason) {\n        this.setNeedsRedraw(\"updating layers: \".concat(reason)); // HACK - Call with a copy of lastRenderedLayers to trigger a full update\n\n        this.setLayers(_toConsumableArray(this.lastRenderedLayers));\n      }\n    } //\n    // METHODS FOR LAYERS\n    //\n    // Draw all layers in all views\n\n  }, {\n    key: \"drawLayers\",\n    value: function drawLayers(_ref4) {\n      var _ref4$pass = _ref4.pass,\n          pass = _ref4$pass === void 0 ? 'render to screen' : _ref4$pass,\n          viewports = _ref4.viewports,\n          views = _ref4.views,\n          _ref4$redrawReason = _ref4.redrawReason,\n          redrawReason = _ref4$redrawReason === void 0 ? 'unknown reason' : _ref4$redrawReason,\n          _ref4$customRender = _ref4.customRender,\n          customRender = _ref4$customRender === void 0 ? false : _ref4$customRender;\n      var drawPickingColors = this.drawPickingColors;\n      var _this$context = this.context,\n          gl = _this$context.gl,\n          useDevicePixels = _this$context.useDevicePixels; // render this viewport\n\n      (0, _drawLayers2.drawLayers)(gl, {\n        layers: this.layers,\n        viewports: viewports,\n        views: views,\n        onViewportActive: this._activateViewport,\n        useDevicePixels: useDevicePixels,\n        drawPickingColors: drawPickingColors,\n        pass: pass,\n        layerFilter: this.layerFilter,\n        redrawReason: redrawReason,\n        customRender: customRender\n      });\n    } // Returns a new picking info object by assuming the last picked object is still picked\n\n  }, {\n    key: \"getLastPickedObject\",\n    value: function getLastPickedObject(_ref5) {\n      var x = _ref5.x,\n          y = _ref5.y,\n          viewports = _ref5.viewports;\n      var lastPickedInfo = this.context.lastPickedInfo.info;\n      var lastPickedLayerId = lastPickedInfo && lastPickedInfo.layer && lastPickedInfo.layer.id;\n      var layer = lastPickedLayerId ? this.layers.find(function (l) {\n        return l.id === lastPickedLayerId;\n      }) : null;\n      var coordinate = viewports[0] && viewports[0].unproject([x, y]);\n      var info = {\n        x: x,\n        y: y,\n        coordinate: coordinate,\n        // TODO remove the lngLat prop after compatibility check\n        lngLat: coordinate,\n        layer: layer\n      };\n\n      if (layer) {\n        return Object.assign({}, lastPickedInfo, info);\n      }\n\n      return Object.assign(info, {\n        color: null,\n        object: null,\n        index: -1\n      });\n    } // Pick the closest info at given coordinate\n\n  }, {\n    key: \"pickObject\",\n    value: function pickObject(_ref6) {\n      var x = _ref6.x,\n          y = _ref6.y,\n          mode = _ref6.mode,\n          _ref6$radius = _ref6.radius,\n          radius = _ref6$radius === void 0 ? 0 : _ref6$radius,\n          layerIds = _ref6.layerIds,\n          viewports = _ref6.viewports,\n          _ref6$depth = _ref6.depth,\n          depth = _ref6$depth === void 0 ? 1 : _ref6$depth,\n          _ref6$event = _ref6.event,\n          event = _ref6$event === void 0 ? null : _ref6$event;\n      var _this$context2 = this.context,\n          gl = _this$context2.gl,\n          useDevicePixels = _this$context2.useDevicePixels; // Allow layers to access the event\n\n      this.context.pickingEvent = event;\n      var layers = this.getLayers({\n        layerIds: layerIds\n      });\n      var result = (0, _pickLayers.pickObject)(gl, {\n        // User params\n        x: x,\n        y: y,\n        radius: radius,\n        layers: layers,\n        mode: mode,\n        layerFilter: this.layerFilter,\n        depth: depth,\n        // Injected params\n        viewports: viewports,\n        onViewportActive: this._activateViewport,\n        pickingFBO: this._getPickingBuffer(),\n        lastPickedInfo: this.context.lastPickedInfo,\n        useDevicePixels: useDevicePixels\n      }); // Clear the current event\n\n      this.context.pickingEvent = null;\n      return result;\n    } // Get all unique infos within a bounding box\n\n  }, {\n    key: \"pickObjects\",\n    value: function pickObjects(_ref7) {\n      var x = _ref7.x,\n          y = _ref7.y,\n          width = _ref7.width,\n          height = _ref7.height,\n          layerIds = _ref7.layerIds,\n          viewports = _ref7.viewports;\n      var _this$context3 = this.context,\n          gl = _this$context3.gl,\n          useDevicePixels = _this$context3.useDevicePixels;\n      var layers = this.getLayers({\n        layerIds: layerIds\n      });\n      return (0, _pickLayers.pickVisibleObjects)(gl, {\n        x: x,\n        y: y,\n        width: width,\n        height: height,\n        layers: layers,\n        layerFilter: this.layerFilter,\n        mode: 'pickObjects',\n        viewports: viewports,\n        onViewportActive: this._activateViewport,\n        pickingFBO: this._getPickingBuffer(),\n        useDevicePixels: useDevicePixels\n      });\n    } //\n    // PRIVATE METHODS\n    //\n\n  }, {\n    key: \"_checkIfNeedsRedraw\",\n    value: function _checkIfNeedsRedraw(clearRedrawFlags) {\n      var redraw = this._needsRedraw;\n\n      if (clearRedrawFlags) {\n        this._needsRedraw = false;\n      } // This layers list doesn't include sublayers, relying on composite layers\n\n\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = this.layers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var layer = _step2.value; // Call every layer to clear their flags\n\n          var layerNeedsRedraw = layer.getNeedsRedraw({\n            clearRedrawFlags: clearRedrawFlags\n          });\n          redraw = redraw || layerNeedsRedraw;\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n\n      return redraw;\n    } // Make a viewport \"current\" in layer context, updating viewportChanged flags\n\n  }, {\n    key: \"_activateViewport\",\n    value: function _activateViewport(viewport) {\n      var oldViewport = this.context.viewport;\n      var viewportChanged = !oldViewport || !viewport.equals(oldViewport);\n\n      if (viewportChanged) {\n        _log.default.log(4, 'Viewport changed', viewport)();\n\n        this.context.viewport = viewport; // Update layers states\n        // Let screen space layers update their state based on viewport\n\n        var _iteratorNormalCompletion3 = true;\n        var _didIteratorError3 = false;\n        var _iteratorError3 = undefined;\n\n        try {\n          for (var _iterator3 = this.layers[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n            var layer = _step3.value;\n            layer.setChangeFlags({\n              viewportChanged: 'Viewport changed'\n            });\n\n            this._updateLayer(layer);\n          }\n        } catch (err) {\n          _didIteratorError3 = true;\n          _iteratorError3 = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion3 && _iterator3.return != null) {\n              _iterator3.return();\n            }\n          } finally {\n            if (_didIteratorError3) {\n              throw _iteratorError3;\n            }\n          }\n        }\n      }\n\n      (0, _assert.default)(this.context.viewport, 'LayerManager: viewport not set');\n      return this;\n    }\n  }, {\n    key: \"_getPickingBuffer\",\n    value: function _getPickingBuffer() {\n      var gl = this.context.gl; // Create a frame buffer if not already available\n\n      this.context.pickingFBO = this.context.pickingFBO || new _luma.Framebuffer(gl); // Resize it to current canvas size (this is a noop if size hasn't changed)\n\n      this.context.pickingFBO.resize({\n        width: gl.canvas.width,\n        height: gl.canvas.height\n      });\n      return this.context.pickingFBO;\n    } // Match all layers, checking for caught errors\n    // To avoid having an exception in one layer disrupt other layers\n    // TODO - mark layers with exceptions as bad and remove from rendering cycle?\n\n  }, {\n    key: \"_updateLayers\",\n    value: function _updateLayers(_ref8) {\n      var oldLayers = _ref8.oldLayers,\n          newLayers = _ref8.newLayers; // Create old layer map\n\n      var oldLayerMap = {};\n      var _iteratorNormalCompletion4 = true;\n      var _didIteratorError4 = false;\n      var _iteratorError4 = undefined;\n\n      try {\n        for (var _iterator4 = oldLayers[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n          var oldLayer = _step4.value;\n\n          if (oldLayerMap[oldLayer.id]) {\n            _log.default.warn(\"Multiple old layers with same id \".concat(layerName(oldLayer)))();\n          } else {\n            oldLayerMap[oldLayer.id] = oldLayer;\n          }\n        } // Allocate array for generated layers\n\n      } catch (err) {\n        _didIteratorError4 = true;\n        _iteratorError4 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion4 && _iterator4.return != null) {\n            _iterator4.return();\n          }\n        } finally {\n          if (_didIteratorError4) {\n            throw _iteratorError4;\n          }\n        }\n      }\n\n      var generatedLayers = []; // Match sublayers\n\n      var error = this._updateSublayersRecursively({\n        newLayers: newLayers,\n        oldLayerMap: oldLayerMap,\n        generatedLayers: generatedLayers\n      }); // Finalize unmatched layers\n\n\n      var error2 = this._finalizeOldLayers(oldLayerMap);\n\n      this._needsUpdate = false;\n      var firstError = error || error2;\n      return {\n        error: firstError,\n        generatedLayers: generatedLayers\n      };\n    } // Note: adds generated layers to `generatedLayers` array parameter\n\n  }, {\n    key: \"_updateSublayersRecursively\",\n    value: function _updateSublayersRecursively(_ref9) {\n      var newLayers = _ref9.newLayers,\n          oldLayerMap = _ref9.oldLayerMap,\n          generatedLayers = _ref9.generatedLayers;\n      var error = null;\n      var _iteratorNormalCompletion5 = true;\n      var _didIteratorError5 = false;\n      var _iteratorError5 = undefined;\n\n      try {\n        for (var _iterator5 = newLayers[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {\n          var newLayer = _step5.value;\n          newLayer.context = this.context; // Given a new coming layer, find its matching old layer (if any)\n\n          var oldLayer = oldLayerMap[newLayer.id];\n\n          if (oldLayer === null) {\n            // null, rather than undefined, means this id was originally there\n            _log.default.warn(\"Multiple new layers with same id \".concat(layerName(newLayer)))();\n          } // Remove the old layer from candidates, as it has been matched with this layer\n\n\n          oldLayerMap[newLayer.id] = null;\n          var sublayers = null; // We must not generate exceptions until after layer matching is complete\n\n          try {\n            if (this._debug && oldLayer !== newLayer) {\n              newLayer.validateProps();\n            }\n\n            if (!oldLayer) {\n              this._initializeLayer(newLayer);\n\n              (0, _seerIntegration.initLayerInSeer)(newLayer); // Initializes layer in seer chrome extension (if connected)\n            } else {\n              this._transferLayerState(oldLayer, newLayer);\n\n              this._updateLayer(newLayer);\n\n              (0, _seerIntegration.updateLayerInSeer)(newLayer); // Updates layer in seer chrome extension (if connected)\n            }\n\n            generatedLayers.push(newLayer); // Call layer lifecycle method: render sublayers\n\n            sublayers = newLayer.isComposite && newLayer.getSubLayers(); // End layer lifecycle method: render sublayers\n          } catch (err) {\n            _log.default.warn(\"error during matching of \".concat(layerName(newLayer)), err)();\n\n            error = error || err; // Record first exception\n          }\n\n          if (sublayers) {\n            this._updateSublayersRecursively({\n              newLayers: sublayers,\n              oldLayerMap: oldLayerMap,\n              generatedLayers: generatedLayers\n            });\n          }\n        }\n      } catch (err) {\n        _didIteratorError5 = true;\n        _iteratorError5 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion5 && _iterator5.return != null) {\n            _iterator5.return();\n          }\n        } finally {\n          if (_didIteratorError5) {\n            throw _iteratorError5;\n          }\n        }\n      }\n\n      return error;\n    } // Finalize any old layers that were not matched\n\n  }, {\n    key: \"_finalizeOldLayers\",\n    value: function _finalizeOldLayers(oldLayerMap) {\n      var error = null;\n\n      for (var layerId in oldLayerMap) {\n        var layer = oldLayerMap[layerId];\n\n        if (layer) {\n          error = error || this._finalizeLayer(layer);\n        }\n      }\n\n      return error;\n    } // EXCEPTION SAFE LAYER ACCESS\n    // Initializes a single layer, calling layer methods\n\n  }, {\n    key: \"_initializeLayer\",\n    value: function _initializeLayer(layer) {\n      _log.default.log(LOG_PRIORITY_LIFECYCLE, \"initializing \".concat(layerName(layer)))();\n\n      var error = null;\n\n      try {\n        layer._initialize();\n\n        layer.lifecycle = _constants.LIFECYCLE.INITIALIZED;\n      } catch (err) {\n        _log.default.warn(\"error while initializing \".concat(layerName(layer), \"\\n\"), err)();\n\n        error = error || err; // TODO - what should the lifecycle state be here? LIFECYCLE.INITIALIZATION_FAILED?\n      } // Set back pointer (used in picking)\n\n\n      layer.internalState.layer = layer; // Save layer on model for picking purposes\n      // store on model.userData rather than directly on model\n\n      var _iteratorNormalCompletion6 = true;\n      var _didIteratorError6 = false;\n      var _iteratorError6 = undefined;\n\n      try {\n        for (var _iterator6 = layer.getModels()[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {\n          var model = _step6.value;\n          model.userData.layer = layer;\n        }\n      } catch (err) {\n        _didIteratorError6 = true;\n        _iteratorError6 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion6 && _iterator6.return != null) {\n            _iterator6.return();\n          }\n        } finally {\n          if (_didIteratorError6) {\n            throw _iteratorError6;\n          }\n        }\n      }\n\n      return error;\n    }\n  }, {\n    key: \"_transferLayerState\",\n    value: function _transferLayerState(oldLayer, newLayer) {\n      newLayer._transferState(oldLayer);\n\n      newLayer.lifecycle = _constants.LIFECYCLE.MATCHED;\n\n      if (newLayer !== oldLayer) {\n        _log.default.log(LOG_PRIORITY_LIFECYCLE_MINOR, \"matched \".concat(layerName(newLayer)), oldLayer, '->', newLayer)();\n\n        oldLayer.lifecycle = _constants.LIFECYCLE.AWAITING_GC;\n      } else {\n        _log.default.log(LOG_PRIORITY_LIFECYCLE_MINOR, \"Matching layer is unchanged \".concat(newLayer.id))();\n      }\n    } // Updates a single layer, cleaning all flags\n\n  }, {\n    key: \"_updateLayer\",\n    value: function _updateLayer(layer) {\n      _log.default.log(LOG_PRIORITY_LIFECYCLE_MINOR, \"updating \".concat(layer, \" because: \").concat(layer.printChangeFlags()))();\n\n      var error = null;\n\n      try {\n        layer._update();\n      } catch (err) {\n        _log.default.warn(\"error during update of \".concat(layerName(layer)), err)(); // Save first error\n\n\n        error = err;\n      }\n\n      return error;\n    } // Finalizes a single layer\n\n  }, {\n    key: \"_finalizeLayer\",\n    value: function _finalizeLayer(layer) {\n      (0, _assert.default)(layer.lifecycle !== _constants.LIFECYCLE.AWAITING_FINALIZATION);\n      layer.lifecycle = _constants.LIFECYCLE.AWAITING_FINALIZATION;\n      var error = null;\n      this.setNeedsRedraw(\"finalized \".concat(layerName(layer)));\n\n      try {\n        layer._finalize();\n      } catch (err) {\n        _log.default.warn(\"error during finalization of \".concat(layerName(layer)), err)();\n\n        error = err;\n      }\n\n      layer.lifecycle = _constants.LIFECYCLE.FINALIZED;\n\n      _log.default.log(LOG_PRIORITY_LIFECYCLE, \"finalizing \".concat(layerName(layer)))();\n\n      return error;\n    } // SEER INTEGRATION\n\n    /**\n     * Called upon Seer initialization, manually sends layers data.\n     */\n\n  }, {\n    key: \"_initSeer\",\n    value: function _initSeer() {\n      this.layers.forEach(function (layer) {\n        (0, _seerIntegration.initLayerInSeer)(layer);\n        (0, _seerIntegration.updateLayerInSeer)(layer);\n      });\n    }\n    /**\n     * On Seer property edition, set override and update layers.\n     */\n\n  }, {\n    key: \"_editSeer\",\n    value: function _editSeer(payload) {\n      if (payload.type !== 'edit' || payload.valuePath[0] !== 'props') {\n        return;\n      }\n\n      (0, _seerIntegration.setPropOverrides)(payload.itemKey, payload.valuePath.slice(1), payload.value);\n      var newLayers = this.layers.map(function (layer) {\n        return new layer.constructor(layer.props);\n      });\n      this.updateLayers({\n        newLayers: newLayers\n      });\n    }\n  }]);\n\n  return LayerManager;\n}();\n\nexports.default = LayerManager;\n},{\"../utils/assert\":\"R2tg\",\"luma.gl\":\"iiNl\",\"seer\":\"a0ak\",\"./layer\":\"Cvfw\",\"./draw-layers\":\"bFdC\",\"./pick-layers\":\"uOUz\",\"../lifecycle/constants\":\"TpVk\",\"../utils/log\":\"mqAj\",\"../utils/flatten\":\"XKEb\",\"probe.gl\":\"z0g1\",\"../viewports/viewport\":\"sjPB\",\"./seer-integration\":\"ht98\"}],\"oaod\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.deepEqual = deepEqual;\n\n// Compare two objects, partial deep equal\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  } // TODO - implement deep equal on view descriptors\n\n\n  return Object.keys(a).every(function (key) {\n    if (Array.isArray(a[key]) && Array.isArray(b[key])) {\n      return deepEqual(a[key], b[key]);\n    }\n\n    return a[key] === b[key];\n  });\n}\n},{}],\"isEb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.parsePosition = parsePosition;\nexports.getPosition = getPosition;\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nvar PERCENT_OR_PIXELS_REGEX = /([0-9]+\\.?[0-9]*)(%|px)/; // Takes a number or a string of formats `50%`, `33.3%` or `200px`\n\nfunction parsePosition(value) {\n  switch (_typeof(value)) {\n    case 'number':\n      return {\n        position: value,\n        relative: false\n      };\n\n    case 'string':\n      var match = value.match(PERCENT_OR_PIXELS_REGEX);\n\n      if (match && match.length >= 3) {\n        var relative = match[2] === '%';\n        var position = parseFloat(match[1]);\n        return {\n          position: relative ? position / 100 : position,\n          relative: relative\n        };\n      }\n\n    // fallthrough\n\n    default:\n      // eslint-disable-line\n      throw new Error(\"Could not parse position string \".concat(value));\n  }\n}\n\nfunction getPosition(position, extent) {\n  return position.relative ? Math.round(position.position * extent) : position.position;\n}\n},{}],\"Xp7T\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar _positions = require(\"../utils/positions\");\n\nvar _deepEqual = require(\"../utils/deep-equal\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nvar View =\n/*#__PURE__*/\nfunction () {\n  function View() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, View);\n\n    var _props$id = props.id,\n        id = _props$id === void 0 ? null : _props$id,\n        _props$x = props.x,\n        x = _props$x === void 0 ? 0 : _props$x,\n        _props$y = props.y,\n        y = _props$y === void 0 ? 0 : _props$y,\n        _props$width = props.width,\n        width = _props$width === void 0 ? '100%' : _props$width,\n        _props$height = props.height,\n        height = _props$height === void 0 ? '100%' : _props$height,\n        _props$projectionMatr = props.projectionMatrix,\n        projectionMatrix = _props$projectionMatr === void 0 ? null : _props$projectionMatr,\n        _props$fovy = props.fovy,\n        fovy = _props$fovy === void 0 ? 75 : _props$fovy,\n        _props$near = props.near,\n        near = _props$near === void 0 ? 0.1 : _props$near,\n        _props$far = props.far,\n        far = _props$far === void 0 ? 1000 : _props$far,\n        _props$modelMatrix = props.modelMatrix,\n        modelMatrix = _props$modelMatrix === void 0 ? null : _props$modelMatrix,\n        _props$viewportInstan = props.viewportInstance,\n        viewportInstance = _props$viewportInstan === void 0 ? null : _props$viewportInstan,\n        _props$type = props.type,\n        type = _props$type === void 0 ? _viewport.default : _props$type;\n    (0, _assert.default)(!viewportInstance || viewportInstance instanceof _viewport.default);\n    this.viewportInstance = viewportInstance; // Id\n\n    this.id = id || this.constructor.displayName || 'view';\n    this.type = type;\n    this.props = Object.assign({}, props, {\n      projectionMatrix: projectionMatrix,\n      fovy: fovy,\n      near: near,\n      far: far,\n      modelMatrix: modelMatrix\n    }); // Extents\n\n    this._parseDimensions({\n      x: x,\n      y: y,\n      width: width,\n      height: height\n    }); // Bind methods for easy access\n\n\n    this.equals = this.equals.bind(this);\n    Object.seal(this);\n  }\n\n  _createClass(View, [{\n    key: \"equals\",\n    value: function equals(view) {\n      if (this === view) {\n        return true;\n      } // if `viewportInstance` is set, it is the only prop that is used\n      // Delegate to `Viewport.equals`\n\n\n      if (this.viewportInstance) {\n        return view.viewportInstance && this.viewportInstance.equals(view.viewportInstance);\n      }\n\n      var viewChanged = (0, _deepEqual.deepEqual)(this.props, view.props);\n      return viewChanged;\n    } // Build a `Viewport` from a view descriptor\n    // TODO - add support for autosizing viewports using width and height\n\n  }, {\n    key: \"makeViewport\",\n    value: function makeViewport(_ref) {\n      var width = _ref.width,\n          height = _ref.height,\n          viewState = _ref.viewState;\n\n      if (this.viewportInstance) {\n        return this.viewportInstance;\n      }\n\n      viewState = this.filterViewState(viewState); // Resolve relative viewport dimensions\n\n      var viewportDimensions = this.getDimensions({\n        width: width,\n        height: height\n      });\n      var props = Object.assign({\n        viewState: viewState\n      }, viewState, this.props, viewportDimensions);\n      return this._getViewport(props);\n    }\n  }, {\n    key: \"getViewStateId\",\n    value: function getViewStateId() {\n      switch (_typeof(this.props.viewState)) {\n        case 'string':\n          // if View.viewState is a string, return it\n          return this.props.viewState;\n\n        case 'object':\n          // If it is an object, return its id component\n          return this.props.viewState && this.props.viewState.id;\n\n        default:\n          return this.id;\n      }\n    } // Allows view to override (or completely define) viewState\n\n  }, {\n    key: \"filterViewState\",\n    value: function filterViewState(viewState) {\n      if (this.props.viewState && _typeof(this.props.viewState) === 'object') {\n        // If we have specified an id, then intent is to override,\n        // If not, completely specify the view state\n        if (!this.props.viewState.id) {\n          return this.props.viewState;\n        } // Merge in all props from View's viewState, except id\n\n\n        var newViewState = Object.assign({}, viewState);\n\n        for (var key in this.props.viewState) {\n          if (key !== 'id') {\n            newViewState[key] = this.props.viewState[key];\n          }\n        }\n\n        return newViewState;\n      }\n\n      return viewState;\n    } // Resolve relative viewport dimensions into actual dimensions (y='50%', width=800 => y=400)\n\n  }, {\n    key: \"getDimensions\",\n    value: function getDimensions(_ref2) {\n      var width = _ref2.width,\n          height = _ref2.height;\n      return {\n        x: (0, _positions.getPosition)(this._x, width),\n        y: (0, _positions.getPosition)(this._y, height),\n        width: (0, _positions.getPosition)(this._width, width),\n        height: (0, _positions.getPosition)(this._height, height)\n      };\n    } // Used by sub classes to resolve controller props\n\n  }, {\n    key: \"_getControllerProps\",\n    value: function _getControllerProps(defaultOpts) {\n      var opts = this.props.controller;\n\n      if (!opts) {\n        return null;\n      }\n\n      if (opts === true) {\n        return defaultOpts;\n      }\n\n      if (typeof opts === 'function') {\n        opts = {\n          type: opts\n        };\n      }\n\n      return Object.assign({}, defaultOpts, opts);\n    } // Overridable method\n\n  }, {\n    key: \"_getViewport\",\n    value: function _getViewport(props) {\n      // Get the type of the viewport\n      var ViewportType = this.type;\n      return new ViewportType(props);\n    } // Parse relative viewport dimension descriptors (e.g {y: '50%', height: '50%'})\n\n  }, {\n    key: \"_parseDimensions\",\n    value: function _parseDimensions(_ref3) {\n      var x = _ref3.x,\n          y = _ref3.y,\n          width = _ref3.width,\n          height = _ref3.height;\n      this._x = (0, _positions.parsePosition)(x);\n      this._y = (0, _positions.parsePosition)(y);\n      this._width = (0, _positions.parsePosition)(width);\n      this._height = (0, _positions.parsePosition)(height);\n    }\n  }]);\n\n  return View;\n}();\n\nexports.default = View;\n},{\"../viewports/viewport\":\"sjPB\",\"../utils/positions\":\"isEb\",\"../utils/deep-equal\":\"oaod\",\"../utils/assert\":\"R2tg\"}],\"THBY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _deepEqual = require(\"../utils/deep-equal\");\n\nvar _view = _interopRequireDefault(require(\"../views/view\"));\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _flatten = require(\"../utils/flatten\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar ViewManager =\n/*#__PURE__*/\nfunction () {\n  function ViewManager() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, ViewManager); // List of view descriptors, gets re-evaluated when width/height changes\n\n\n    this.views = [];\n    this.width = 100;\n    this.height = 100;\n    this.viewState = {};\n    this.controllers = {};\n    this._viewports = []; // Generated viewports\n\n    this._viewportMap = {};\n    this._isUpdating = false;\n    this._needsRedraw = 'Initial render';\n    this._needsUpdate = true;\n    this._eventManager = props.eventManager;\n    this._eventCallbacks = {\n      onViewStateChange: props.onViewStateChange,\n      onInteractiveStateChange: props.onInteractiveStateChange\n    };\n    Object.seal(this); // Init with default map viewport\n\n    this.setProps(props);\n  }\n\n  _createClass(ViewManager, [{\n    key: \"finalize\",\n    value: function finalize() {\n      for (var key in this.controllers) {\n        if (this.controllers[key]) {\n          this.controllers[key].finalize();\n        }\n      }\n\n      this.controllers = {};\n    } // Check if a redraw is needed\n\n  }, {\n    key: \"needsRedraw\",\n    value: function needsRedraw() {\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref$clearRedrawFlags = _ref.clearRedrawFlags,\n          clearRedrawFlags = _ref$clearRedrawFlags === void 0 ? true : _ref$clearRedrawFlags;\n\n      var redraw = this._needsRedraw;\n\n      if (clearRedrawFlags) {\n        this._needsRedraw = false;\n      }\n\n      return redraw;\n    } // Layers will be redrawn (in next animation frame)\n\n  }, {\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw(reason) {\n      this._needsRedraw = this._needsRedraw || reason;\n    } // Layers will be updated deeply (in next animation frame)\n    // Potentially regenerating attributes and sub layers\n\n  }, {\n    key: \"setNeedsUpdate\",\n    value: function setNeedsUpdate(reason) {\n      this._needsUpdate = this._needsUpdate || reason;\n      this._needsRedraw = this._needsRedraw || reason;\n    }\n    /** Get a set of viewports for a given width and height\n     * TODO - Intention is for deck.gl to autodeduce width and height and drop the need for props\n     * @param rect (object, optional) - filter the viewports\n     *   + not provided - return all viewports\n     *   + {x, y} - only return viewports that contain this pixel\n     *   + {x, y, width, height} - only return viewports that overlap with this rectangle\n     */\n\n  }, {\n    key: \"getViewports\",\n    value: function getViewports(rect) {\n      if (rect) {\n        return this._viewports.filter(function (viewport) {\n          return viewport.containsPixel(rect);\n        });\n      }\n\n      return this._viewports;\n    }\n  }, {\n    key: \"getViews\",\n    value: function getViews() {\n      var viewMap = {};\n      this.views.forEach(function (view) {\n        viewMap[view.id] = view;\n      });\n      return viewMap;\n    } // Resolves a viewId string to a View, if already a View returns it.\n\n  }, {\n    key: \"getView\",\n    value: function getView(viewOrViewId) {\n      return typeof viewOrViewId === 'string' ? this.views.find(function (view) {\n        return view.id === viewOrViewId;\n      }) : viewOrViewId;\n    } // Returns the viewState for a specific viewId. Matches the viewState by\n    // 1. view.viewStateId\n    // 2. view.id\n    // 3. root viewState\n    // then applies the view's filter if any\n\n  }, {\n    key: \"getViewState\",\n    value: function getViewState(viewId) {\n      var view = this.getView(viewId); // Backward compatibility: view state for single view\n\n      var viewState = view && this.viewState[view.getViewStateId()] || this.viewState;\n      return view ? view.filterViewState(viewState) : viewState;\n    }\n  }, {\n    key: \"getViewport\",\n    value: function getViewport(viewId) {\n      return this._viewportMap[viewId];\n    }\n    /**\n     * Projects xyz (possibly latitude and longitude) to pixel coordinates in window\n     * using viewport projection parameters\n     * - [longitude, latitude] to [x, y]\n     * - [longitude, latitude, Z] => [x, y, z]\n     * Note: By default, returns top-left coordinates for canvas/SVG type render\n     *\n     * @param {Array} lngLatZ - [lng, lat] or [lng, lat, Z]\n     * @param {Object} opts - options\n     * @param {Object} opts.topLeft=true - Whether projected coords are top left\n     * @return {Array} - [x, y] or [x, y, z] in top left coords\n     */\n\n  }, {\n    key: \"project\",\n    value: function project(xyz) {\n      var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n        topLeft: true\n      };\n      var viewports = this.getViewports();\n\n      for (var i = viewports.length - 1; i >= 0; --i) {\n        var viewport = viewports[i];\n\n        if (viewport.contains(xyz, opts)) {\n          return viewport.project(xyz, opts);\n        }\n      }\n\n      return null;\n    }\n    /**\n     * Unproject pixel coordinates on screen onto world coordinates,\n     * (possibly [lon, lat]) on map.\n     * - [x, y] => [lng, lat]\n     * - [x, y, z] => [lng, lat, Z]\n     * @param {Array} xyz -\n     * @param {Object} opts - options\n     * @param {Object} opts.topLeft=true - Whether origin is top left\n     * @return {Array|null} - [lng, lat, Z] or [X, Y, Z]\n     */\n\n  }, {\n    key: \"unproject\",\n    value: function unproject(xyz, opts) {\n      var viewports = this.getViewports();\n\n      for (var i = viewports.length - 1; i >= 0; --i) {\n        var viewport = viewports[i];\n\n        if (viewport.containsPixel(xyz, opts)) {\n          return viewport.unproject(xyz);\n        }\n      }\n\n      return null;\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('views' in props) {\n        this._setViews(props.views);\n      } // TODO - support multiple view states\n\n\n      if ('viewState' in props) {\n        this._setViewState(props.viewState);\n      }\n\n      if ('width' in props || 'height' in props) {\n        this._setSize(props.width, props.height);\n      } // Important: avoid invoking _update() inside itself\n      // Nested updates result in unexpected side effects inside _rebuildViewports()\n      // when using auto control in pure-js\n\n\n      if (!this._isUpdating) {\n        this._update();\n      }\n    }\n  }, {\n    key: \"_update\",\n    value: function _update() {\n      this._isUpdating = true; // Only rebuild viewports if the update flag is set\n\n      if (this._needsUpdate) {\n        this._needsUpdate = false;\n\n        this._rebuildViewports();\n      } // If viewport transition(s) are triggered during viewports update, controller(s)\n      // will immediately call `onViewStateChange` which calls `viewManager.setProps` again.\n\n\n      if (this._needsUpdate) {\n        this._needsUpdate = false;\n\n        this._rebuildViewports();\n      }\n\n      this._isUpdating = false;\n    }\n  }, {\n    key: \"_setSize\",\n    value: function _setSize(width, height) {\n      (0, _assert.default)(Number.isFinite(width) && Number.isFinite(height));\n\n      if (width !== this.width || height !== this.height) {\n        this.width = width;\n        this.height = height;\n        this.setNeedsUpdate('Size changed');\n      }\n    } // Update the view descriptor list and set change flag if needed\n    // Does not actually rebuild the `Viewport`s until `getViewports` is called\n\n  }, {\n    key: \"_setViews\",\n    value: function _setViews(views) {\n      // DEPRECATED: Ensure any \"naked\" Viewports are wrapped in View instances\n      views = (0, _flatten.flatten)(views, {\n        filter: Boolean\n      }).map(function (view) {\n        return view instanceof _viewport.default ? new _view.default({\n          viewportInstance: view\n        }) : view;\n      });\n\n      var viewsChanged = this._diffViews(views, this.views);\n\n      if (viewsChanged) {\n        this.setNeedsUpdate('views changed');\n      }\n\n      this.views = views;\n    }\n  }, {\n    key: \"_setViewState\",\n    value: function _setViewState(viewState) {\n      if (viewState) {\n        var viewStateChanged = !(0, _deepEqual.deepEqual)(viewState, this.viewState);\n\n        if (viewStateChanged) {\n          this.setNeedsUpdate('viewState changed');\n        }\n\n        this.viewState = viewState;\n      } else {\n        _log.default.warn('setting null viewState')();\n      }\n    } //\n    // PRIVATE METHODS\n    //\n\n  }, {\n    key: \"_onViewStateChange\",\n    value: function _onViewStateChange(viewId, event) {\n      event.viewId = viewId;\n\n      this._eventCallbacks.onViewStateChange(event);\n    }\n  }, {\n    key: \"_createController\",\n    value: function _createController(props) {\n      var Controller = props.type;\n      var controller = new Controller(Object.assign({\n        eventManager: this._eventManager,\n        // Set an internal callback that calls the prop callback if provided\n        onViewStateChange: this._onViewStateChange.bind(this, props.id),\n        onStateChange: this._eventCallbacks.onInteractiveStateChange\n      }, props));\n      return controller;\n    }\n  }, {\n    key: \"_updateController\",\n    value: function _updateController(view, viewState, viewport, controller) {\n      if (view.controller) {\n        var controllerProps = Object.assign({}, view.controller, viewState, {\n          id: view.id,\n          x: viewport.x,\n          y: viewport.y,\n          width: viewport.width,\n          height: viewport.height\n        }); // TODO - check if view / controller type has changed, and replace the controller\n\n        if (controller) {\n          controller.setProps(controllerProps);\n        } else {\n          controller = this._createController(controllerProps);\n        }\n\n        return controller;\n      }\n\n      return null;\n    } // Rebuilds viewports from descriptors towards a certain window size\n\n  }, {\n    key: \"_rebuildViewports\",\n    value: function _rebuildViewports() {\n      var _this = this;\n\n      var width = this.width,\n          height = this.height,\n          views = this.views;\n      var oldControllers = this.controllers;\n      this.controllers = {};\n      this._viewports = views.map(function (view) {\n        var viewState = _this.getViewState(view);\n\n        var viewport = view.makeViewport({\n          width: width,\n          height: height,\n          viewState: viewState\n        }); // Update the controller\n\n        _this.controllers[view.id] = _this._updateController(view, viewState, viewport, oldControllers[view.id]);\n        return viewport;\n      }); // Remove unused controllers\n\n      for (var id in oldControllers) {\n        if (oldControllers[id] && !this.controllers[id]) {\n          oldControllers[id].finalize();\n        }\n      }\n\n      this._buildViewportMap();\n    }\n  }, {\n    key: \"_buildViewportMap\",\n    value: function _buildViewportMap() {\n      var _this2 = this; // Build a view id to view index\n\n\n      this._viewportMap = {};\n\n      this._viewports.forEach(function (viewport) {\n        if (viewport.id) {\n          // TODO - issue warning if multiple viewports use same id\n          _this2._viewportMap[viewport.id] = _this2._viewportMap[viewport.id] || viewport;\n        }\n      });\n    } // Check if viewport array has changed, returns true if any change\n    // Note that descriptors can be the same\n\n  }, {\n    key: \"_diffViews\",\n    value: function _diffViews(newViews, oldViews) {\n      if (newViews.length !== oldViews.length) {\n        return true;\n      }\n\n      return newViews.some(function (_, i) {\n        return !newViews[i].equals(oldViews[i]);\n      });\n    }\n  }]);\n\n  return ViewManager;\n}();\n\nexports.default = ViewManager;\n},{\"../utils/assert\":\"R2tg\",\"../utils/deep-equal\":\"oaod\",\"../views/view\":\"Xp7T\",\"../viewports/viewport\":\"sjPB\",\"../utils/log\":\"mqAj\",\"../utils/flatten\":\"XKEb\"}],\"RWhD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _viewport = _interopRequireDefault(require(\"./viewport\"));\n\nvar _viewportMercatorProject = require(\"viewport-mercator-project\");\n\nvar vec2 = _interopRequireWildcard(require(\"gl-matrix/vec2\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// View and Projection Matrix calculations for mapbox-js style\n// map view properties\n\n\nvar ERR_ARGUMENT = 'Illegal argument to WebMercatorViewport';\n\nvar WebMercatorViewport =\n/*#__PURE__*/\nfunction (_Viewport) {\n  _inherits(WebMercatorViewport, _Viewport);\n  /**\n   * @classdesc\n   * Creates view/projection matrices from mercator params\n   * Note: The Viewport is immutable in the sense that it only has accessors.\n   * A new viewport instance should be created if any parameters have changed.\n   */\n\n  /* eslint-disable complexity, max-statements */\n\n\n  function WebMercatorViewport() {\n    var _this;\n\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, WebMercatorViewport);\n\n    var _opts$latitude = opts.latitude,\n        latitude = _opts$latitude === void 0 ? 0 : _opts$latitude,\n        _opts$longitude = opts.longitude,\n        longitude = _opts$longitude === void 0 ? 0 : _opts$longitude,\n        _opts$zoom = opts.zoom,\n        zoom = _opts$zoom === void 0 ? 11 : _opts$zoom,\n        _opts$pitch = opts.pitch,\n        pitch = _opts$pitch === void 0 ? 0 : _opts$pitch,\n        _opts$bearing = opts.bearing,\n        bearing = _opts$bearing === void 0 ? 0 : _opts$bearing,\n        _opts$nearZMultiplier = opts.nearZMultiplier,\n        nearZMultiplier = _opts$nearZMultiplier === void 0 ? 0.1 : _opts$nearZMultiplier,\n        _opts$farZMultiplier = opts.farZMultiplier,\n        farZMultiplier = _opts$farZMultiplier === void 0 ? 10 : _opts$farZMultiplier,\n        _opts$orthographic = opts.orthographic,\n        orthographic = _opts$orthographic === void 0 ? false : _opts$orthographic;\n    var width = opts.width,\n        height = opts.height,\n        _opts$altitude = opts.altitude,\n        altitude = _opts$altitude === void 0 ? 1.5 : _opts$altitude; // Silently allow apps to send in 0,0 to facilitate isomorphic render etc\n\n    width = width || 1;\n    height = height || 1; // Altitude - prevent division by 0\n    // TODO - just throw an Error instead?\n\n    altitude = Math.max(0.75, altitude);\n\n    var _getProjectionParamet = (0, _viewportMercatorProject.getProjectionParameters)({\n      width: width,\n      height: height,\n      pitch: pitch,\n      altitude: altitude,\n      nearZMultiplier: nearZMultiplier,\n      farZMultiplier: farZMultiplier\n    }),\n        fov = _getProjectionParamet.fov,\n        aspect = _getProjectionParamet.aspect,\n        focalDistance = _getProjectionParamet.focalDistance,\n        near = _getProjectionParamet.near,\n        far = _getProjectionParamet.far; // The uncentered matrix allows us two move the center addition to the\n    // shader (cheap) which gives a coordinate system that has its center in\n    // the layer's center position. This makes rotations and other modelMatrx\n    // transforms much more useful.\n\n\n    var viewMatrixUncentered = (0, _viewportMercatorProject.getViewMatrix)({\n      height: height,\n      pitch: pitch,\n      bearing: bearing,\n      altitude: altitude\n    }); // TODO / hack - prevent vertical offsets if not FirstPersonViewport\n\n    var position = opts.position && [opts.position[0], opts.position[1], 0];\n    var viewportOpts = Object.assign({}, opts, {\n      // x, y,\n      width: width,\n      height: height,\n      // view matrix\n      viewMatrix: viewMatrixUncentered,\n      longitude: longitude,\n      latitude: latitude,\n      zoom: zoom,\n      position: position,\n      // projection matrix parameters\n      orthographic: orthographic,\n      fovyRadians: fov,\n      aspect: aspect,\n      // TODO Viewport is already carefully set up to \"focus\" on ground, so can't use focal distance\n      orthographicFocalDistance: focalDistance,\n      near: near,\n      far: far\n    });\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(WebMercatorViewport).call(this, viewportOpts)); // Save parameters\n\n    _this.latitude = latitude;\n    _this.longitude = longitude;\n    _this.zoom = zoom;\n    _this.pitch = pitch;\n    _this.bearing = bearing;\n    _this.altitude = altitude;\n    _this.orthographic = orthographic; // Bind methods\n\n    _this.metersToLngLatDelta = _this.metersToLngLatDelta.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n    _this.lngLatDeltaToMeters = _this.lngLatDeltaToMeters.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n    _this.addMetersToLngLat = _this.addMetersToLngLat.bind(_assertThisInitialized(_assertThisInitialized(_this)));\n    Object.freeze(_assertThisInitialized(_assertThisInitialized(_this)));\n    return _this;\n  }\n  /* eslint-enable complexity, max-statements */\n\n  /**\n   * Converts a meter offset to a lnglat offset\n   *\n   * Note: Uses simple linear approximation around the viewport center\n   * Error increases with size of offset (roughly 1% per 100km)\n   *\n   * @param {[Number,Number]|[Number,Number,Number]) xyz - array of meter deltas\n   * @return {[Number,Number]|[Number,Number,Number]) - array of [lng,lat,z] deltas\n   */\n\n\n  _createClass(WebMercatorViewport, [{\n    key: \"metersToLngLatDelta\",\n    value: function metersToLngLatDelta(xyz) {\n      var _xyz = _slicedToArray(xyz, 3),\n          x = _xyz[0],\n          y = _xyz[1],\n          _xyz$ = _xyz[2],\n          z = _xyz$ === void 0 ? 0 : _xyz$;\n\n      (0, _assert.default)(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z), ERR_ARGUMENT);\n      var _this$distanceScales = this.distanceScales,\n          pixelsPerMeter = _this$distanceScales.pixelsPerMeter,\n          degreesPerPixel = _this$distanceScales.degreesPerPixel;\n      var deltaLng = x * pixelsPerMeter[0] * degreesPerPixel[0];\n      var deltaLat = y * pixelsPerMeter[1] * degreesPerPixel[1];\n      return xyz.length === 2 ? [deltaLng, deltaLat] : [deltaLng, deltaLat, z];\n    }\n    /**\n     * Converts a lnglat offset to a meter offset\n     *\n     * Note: Uses simple linear approximation around the viewport center\n     * Error increases with size of offset (roughly 1% per 100km)\n     *\n     * @param {[Number,Number]|[Number,Number,Number]) deltaLngLatZ - array of [lng,lat,z] deltas\n     * @return {[Number,Number]|[Number,Number,Number]) - array of meter deltas\n     */\n\n  }, {\n    key: \"lngLatDeltaToMeters\",\n    value: function lngLatDeltaToMeters(deltaLngLatZ) {\n      var _deltaLngLatZ = _slicedToArray(deltaLngLatZ, 3),\n          deltaLng = _deltaLngLatZ[0],\n          deltaLat = _deltaLngLatZ[1],\n          _deltaLngLatZ$ = _deltaLngLatZ[2],\n          deltaZ = _deltaLngLatZ$ === void 0 ? 0 : _deltaLngLatZ$;\n\n      (0, _assert.default)(Number.isFinite(deltaLng) && Number.isFinite(deltaLat) && Number.isFinite(deltaZ), ERR_ARGUMENT);\n      var _this$distanceScales2 = this.distanceScales,\n          pixelsPerDegree = _this$distanceScales2.pixelsPerDegree,\n          metersPerPixel = _this$distanceScales2.metersPerPixel;\n      var deltaX = deltaLng * pixelsPerDegree[0] * metersPerPixel[0];\n      var deltaY = deltaLat * pixelsPerDegree[1] * metersPerPixel[1];\n      return deltaLngLatZ.length === 2 ? [deltaX, deltaY] : [deltaX, deltaY, deltaZ];\n    }\n    /**\n     * Add a meter delta to a base lnglat coordinate, returning a new lnglat array\n     *\n     * Note: Uses simple linear approximation around the viewport center\n     * Error increases with size of offset (roughly 1% per 100km)\n     *\n     * @param {[Number,Number]|[Number,Number,Number]) lngLatZ - base coordinate\n     * @param {[Number,Number]|[Number,Number,Number]) xyz - array of meter deltas\n     * @return {[Number,Number]|[Number,Number,Number]) array of [lng,lat,z] deltas\n     */\n\n  }, {\n    key: \"addMetersToLngLat\",\n    value: function addMetersToLngLat(lngLatZ, xyz) {\n      return (0, _viewportMercatorProject.addMetersToLngLat)(lngLatZ, xyz);\n    }\n    /**\n     * Get the map center that place a given [lng, lat] coordinate at screen\n     * point [x, y]\n     *\n     * @param {Array} lngLat - [lng,lat] coordinates\n     *   Specifies a point on the sphere.\n     * @param {Array} pos - [x,y] coordinates\n     *   Specifies a point on the screen.\n     * @return {Array} [lng,lat] new map center.\n     */\n\n  }, {\n    key: \"getMapCenterByLngLatPosition\",\n    value: function getMapCenterByLngLatPosition(_ref) {\n      var lngLat = _ref.lngLat,\n          pos = _ref.pos;\n      var fromLocation = (0, _viewportMercatorProject.pixelsToWorld)(pos, this.pixelUnprojectionMatrix);\n      var toLocation = this.projectFlat(lngLat);\n      var translate = vec2.add([], toLocation, vec2.negate([], fromLocation));\n      var newCenter = vec2.add([], this.center, translate);\n      return this.unprojectFlat(newCenter);\n    } // Legacy method name\n\n  }, {\n    key: \"getLocationAtPoint\",\n    value: function getLocationAtPoint(_ref2) {\n      var lngLat = _ref2.lngLat,\n          pos = _ref2.pos;\n      return this.getMapCenterByLngLatPosition({\n        lngLat: lngLat,\n        pos: pos\n      });\n    }\n    /**\n     * Returns a new viewport that fit around the given rectangle.\n     * Only supports non-perspective mode.\n     * @param {Array} bounds - [[lon, lat], [lon, lat]]\n     * @param {Number} [options.padding] - The amount of padding in pixels to add to the given bounds.\n     * @param {Array} [options.offset] - The center of the given bounds relative to the map's center,\n     *    [x, y] measured in pixels.\n     * @returns {WebMercatorViewport}\n     */\n\n  }, {\n    key: \"fitBounds\",\n    value: function fitBounds(bounds) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var width = this.width,\n          height = this.height;\n\n      var _fitBounds2 = (0, _viewportMercatorProject.fitBounds)(Object.assign({\n        width: width,\n        height: height,\n        bounds: bounds\n      }, options)),\n          longitude = _fitBounds2.longitude,\n          latitude = _fitBounds2.latitude,\n          zoom = _fitBounds2.zoom;\n\n      return new WebMercatorViewport({\n        width: width,\n        height: height,\n        longitude: longitude,\n        latitude: latitude,\n        zoom: zoom\n      });\n    }\n  }]);\n\n  return WebMercatorViewport;\n}(_viewport.default);\n\nexports.default = WebMercatorViewport;\nWebMercatorViewport.displayName = 'WebMercatorViewport';\n},{\"./viewport\":\"sjPB\",\"viewport-mercator-project\":\"ha5B\",\"gl-matrix/vec2\":\"cHtt\",\"../utils/assert\":\"R2tg\"}],\"JVWZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _math = require(\"math.gl\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nvar TransitionInterpolator =\n/*#__PURE__*/\nfunction () {\n  /**\n   * @param opts {array|object}\n   * @param opts.compare {array} - prop names used in equality check\n   * @param opts.extract {array} - prop names needed for interpolation\n   * @param opts.required {array} - prop names that must be supplied\n   * alternatively, supply one list of prop names as `opts` if all of the above are the same.\n   */\n  function TransitionInterpolator() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, TransitionInterpolator);\n\n    if (Array.isArray(opts)) {\n      opts = {\n        compare: opts,\n        extract: opts,\n        required: opts\n      };\n    }\n\n    var _opts = opts,\n        compare = _opts.compare,\n        extract = _opts.extract,\n        required = _opts.required;\n    this._propsToCompare = compare;\n    this._propsToExtract = extract;\n    this._requiredProps = required;\n  }\n  /**\n   * Checks if two sets of props need transition in between\n   * @param currentProps {object} - a list of viewport props\n   * @param nextProps {object} - a list of viewport props\n   * @returns {bool} - true if two props are equivalent\n   */\n\n\n  _createClass(TransitionInterpolator, [{\n    key: \"arePropsEqual\",\n    value: function arePropsEqual(currentProps, nextProps) {\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = (this._propsToCompare || Object.keys(nextProps))[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var key = _step.value;\n\n          if (!(0, _math.equals)(currentProps[key], nextProps[key])) {\n            return false;\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return true;\n    }\n    /**\n     * Called before transition starts to validate/pre-process start and end props\n     * @param startProps {object} - a list of starting viewport props\n     * @param endProps {object} - a list of target viewport props\n     * @returns {Object} {start, end} - start and end props to be passed\n     *   to `interpolateProps`\n     */\n\n  }, {\n    key: \"initializeProps\",\n    value: function initializeProps(startProps, endProps) {\n      var result;\n\n      if (this._propsToExtract) {\n        var startViewStateProps = {};\n        var endViewStateProps = {};\n        var _iteratorNormalCompletion2 = true;\n        var _didIteratorError2 = false;\n        var _iteratorError2 = undefined;\n\n        try {\n          for (var _iterator2 = this._propsToExtract[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n            var key = _step2.value;\n            startViewStateProps[key] = startProps[key];\n            endViewStateProps[key] = endProps[key];\n          }\n        } catch (err) {\n          _didIteratorError2 = true;\n          _iteratorError2 = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n              _iterator2.return();\n            }\n          } finally {\n            if (_didIteratorError2) {\n              throw _iteratorError2;\n            }\n          }\n        }\n\n        result = {\n          start: startViewStateProps,\n          end: endViewStateProps\n        };\n      } else {\n        result = {\n          start: startProps,\n          end: endProps\n        };\n      }\n\n      this._checkRequiredProps(result.start);\n\n      this._checkRequiredProps(result.end);\n\n      return result;\n    }\n    /**\n     * Returns viewport props in transition\n     * @param startProps {object} - a list of starting viewport props\n     * @param endProps {object} - a list of target viewport props\n     * @param t {number} - a time factor between [0, 1]\n     * @returns {object} - a list of interpolated viewport props\n     */\n\n  }, {\n    key: \"interpolateProps\",\n    value: function interpolateProps(startProps, endProps, t) {\n      (0, _assert.default)(false, 'interpolateProps is not implemented');\n    }\n  }, {\n    key: \"_checkRequiredProps\",\n    value: function _checkRequiredProps(props) {\n      if (!this._requiredProps) {\n        return;\n      }\n\n      this._requiredProps.forEach(function (propName) {\n        var value = props[propName];\n        (0, _assert.default)(Number.isFinite(value) || Array.isArray(value), \"\".concat(propName, \" is required for transition\"));\n      });\n    }\n  }]);\n\n  return TransitionInterpolator;\n}();\n\nexports.default = TransitionInterpolator;\n},{\"math.gl\":\"o5CE\",\"../utils/assert\":\"R2tg\"}],\"Xz4u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _transitionInterpolator = _interopRequireDefault(require(\"./transition-interpolator\"));\n\nvar _math = require(\"math.gl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar VIEWPORT_TRANSITION_PROPS = ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'];\n/**\n * Performs linear interpolation of two view states.\n */\n\nvar LinearInterpolator =\n/*#__PURE__*/\nfunction (_TransitionInterpolat) {\n  _inherits(LinearInterpolator, _TransitionInterpolat);\n  /**\n   * @param {Array} transitionProps - list of props to apply linear transition to.\n   */\n\n\n  function LinearInterpolator() {\n    var transitionProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : VIEWPORT_TRANSITION_PROPS;\n\n    _classCallCheck(this, LinearInterpolator);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(LinearInterpolator).call(this, transitionProps));\n  }\n\n  _createClass(LinearInterpolator, [{\n    key: \"interpolateProps\",\n    value: function interpolateProps(startProps, endProps, t) {\n      var viewport = {};\n\n      for (var key in endProps) {\n        viewport[key] = (0, _math.lerp)(startProps[key], endProps[key], t);\n      }\n\n      return viewport;\n    }\n  }]);\n\n  return LinearInterpolator;\n}(_transitionInterpolator.default);\n\nexports.default = LinearInterpolator;\n},{\"./transition-interpolator\":\"JVWZ\",\"math.gl\":\"o5CE\"}],\"nTOp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.TRANSITION_EVENTS = void 0;\n\nvar _linearInterpolator = _interopRequireDefault(require(\"../transitions/linear-interpolator\"));\n\nvar _transition = _interopRequireDefault(require(\"../transitions/transition\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n/* global requestAnimationFrame, cancelAnimationFrame */\n\n\nvar noop = function noop() {};\n\nvar TRANSITION_EVENTS = {\n  BREAK: 1,\n  SNAP_TO_END: 2,\n  IGNORE: 3\n};\nexports.TRANSITION_EVENTS = TRANSITION_EVENTS;\nvar DEFAULT_PROPS = {\n  transitionDuration: 0,\n  transitionEasing: function transitionEasing(t) {\n    return t;\n  },\n  transitionInterpolator: new _linearInterpolator.default(),\n  transitionInterruption: TRANSITION_EVENTS.BREAK,\n  onTransitionStart: noop,\n  onTransitionInterrupt: noop,\n  onTransitionEnd: noop\n};\n\nvar TransitionManager =\n/*#__PURE__*/\nfunction () {\n  function TransitionManager(ControllerState) {\n    var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, TransitionManager);\n\n    (0, _assert.default)(ControllerState);\n    this.ControllerState = ControllerState;\n    this.props = Object.assign({}, DEFAULT_PROPS, props);\n    this.animation = null;\n    this.propsInTransition = null;\n    this.transition = new _transition.default();\n    this.onViewStateChange = props.onViewStateChange;\n    this._onTransitionFrame = this._onTransitionFrame.bind(this);\n    this._onTransitionUpdate = this._onTransitionUpdate.bind(this);\n  }\n\n  _createClass(TransitionManager, [{\n    key: \"finalize\",\n    value: function finalize() {\n      cancelAnimationFrame(this.animation);\n    } // Returns current transitioned viewport.\n\n  }, {\n    key: \"getViewportInTransition\",\n    value: function getViewportInTransition() {\n      return this.propsInTransition;\n    } // Process the vewiport change, either ignore or trigger a new transition.\n    // Return true if a new transition is triggered, false otherwise.\n\n  }, {\n    key: \"processViewStateChange\",\n    value: function processViewStateChange(nextProps) {\n      var transitionTriggered = false;\n      var currentProps = this.props; // Set this.props here as '_triggerTransition' calls '_updateViewport' that uses this.props.\n\n      nextProps = Object.assign({}, DEFAULT_PROPS, nextProps);\n      this.props = nextProps; // NOTE: Be cautious re-ordering statements in this function.\n\n      if (this._shouldIgnoreViewportChange(currentProps, nextProps)) {\n        return transitionTriggered;\n      }\n\n      if (this._isTransitionEnabled(nextProps)) {\n        var startProps = Object.assign({}, currentProps, this.transition.interruption === TRANSITION_EVENTS.SNAP_TO_END ? this.transition.endProps : this.propsInTransition || currentProps);\n\n        this._triggerTransition(startProps, nextProps);\n\n        transitionTriggered = true;\n      } else {\n        this.transition.cancel();\n      }\n\n      return transitionTriggered;\n    } // Helper methods\n\n  }, {\n    key: \"_isTransitionEnabled\",\n    value: function _isTransitionEnabled(props) {\n      return props.transitionDuration > 0 && props.transitionInterpolator;\n    }\n  }, {\n    key: \"_isUpdateDueToCurrentTransition\",\n    value: function _isUpdateDueToCurrentTransition(props) {\n      if (this.transition.inProgress) {\n        return this.transition.interpolator.arePropsEqual(props, this.propsInTransition);\n      }\n\n      return false;\n    }\n  }, {\n    key: \"_shouldIgnoreViewportChange\",\n    value: function _shouldIgnoreViewportChange(currentProps, nextProps) {\n      if (this.transition.inProgress) {\n        // Ignore update if it is requested to be ignored\n        return this.transition.interruption === TRANSITION_EVENTS.IGNORE || // Ignore update if it is due to current active transition.\n        this._isUpdateDueToCurrentTransition(nextProps);\n      } else if (this._isTransitionEnabled(nextProps)) {\n        // Ignore if none of the viewport props changed.\n        return nextProps.transitionInterpolator.arePropsEqual(currentProps, nextProps);\n      }\n\n      return true;\n    }\n  }, {\n    key: \"_triggerTransition\",\n    value: function _triggerTransition(startProps, endProps) {\n      (0, _assert.default)(this._isTransitionEnabled(endProps), 'Transition is not enabled');\n      cancelAnimationFrame(this.animation);\n      var startViewstate = new this.ControllerState(startProps);\n      var endViewStateProps = new this.ControllerState(endProps).shortestPathFrom(startViewstate);\n      var initialProps = endProps.transitionInterpolator.initializeProps(startProps, endViewStateProps);\n      this.propsInTransition = {};\n      this.transition.start({\n        duration: endProps.transitionDuration,\n        easing: endProps.transitionEasing,\n        interpolator: endProps.transitionInterpolator,\n        interruption: endProps.transitionInterruption,\n        startProps: initialProps.start,\n        endProps: initialProps.end,\n        onStart: endProps.onTransitionStart,\n        onUpdate: this._onTransitionUpdate,\n        onInterrupt: this._onTransitionEnd(endProps.onTransitionInterrupt),\n        onEnd: this._onTransitionEnd(endProps.onTransitionEnd)\n      });\n\n      this._onTransitionFrame();\n    }\n  }, {\n    key: \"_onTransitionFrame\",\n    value: function _onTransitionFrame() {\n      // _updateViewport() may cancel the animation\n      this.animation = requestAnimationFrame(this._onTransitionFrame);\n      this.transition.update(Date.now());\n    }\n  }, {\n    key: \"_onTransitionEnd\",\n    value: function _onTransitionEnd(callback) {\n      var _this = this;\n\n      return function (transition) {\n        cancelAnimationFrame(_this.animation);\n        _this.propsInTransition = null;\n        callback(transition);\n      };\n    }\n  }, {\n    key: \"_onTransitionUpdate\",\n    value: function _onTransitionUpdate(transition) {\n      // NOTE: Be cautious re-ordering statements in this function.\n      var interpolator = transition.interpolator,\n          startProps = transition.startProps,\n          endProps = transition.endProps,\n          time = transition.time;\n      var viewport = interpolator.interpolateProps(startProps, endProps, time); // This gurantees all props (e.g. bearing, longitude) are normalized\n      // So when viewports are compared they are in same range.\n\n      this.propsInTransition = new this.ControllerState(Object.assign({}, this.props, viewport)).getViewportProps();\n\n      if (this.onViewStateChange) {\n        this.onViewStateChange({\n          viewState: this.propsInTransition,\n          interactionState: {\n            inTransition: true\n          }\n        });\n      }\n    }\n  }]);\n\n  return TransitionManager;\n}();\n\nexports.default = TransitionManager;\nTransitionManager.defaultProps = DEFAULT_PROPS;\n},{\"../transitions/linear-interpolator\":\"Xz4u\",\"../transitions/transition\":\"fVmt\",\"../utils/assert\":\"R2tg\"}],\"SwtL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _transitionManager = _interopRequireDefault(require(\"./transition-manager\"));\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 Uber Technologies, Inc.\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar NO_TRANSITION_PROPS = {\n  transitionDuration: 0\n}; // EVENT HANDLING PARAMETERS\n\nvar PITCH_MOUSE_THRESHOLD = 5;\nvar PITCH_ACCEL = 1.2;\nvar ZOOM_ACCEL = 0.01;\nvar EVENT_TYPES = {\n  WHEEL: ['wheel'],\n  PAN: ['panstart', 'panmove', 'panend'],\n  PINCH: ['pinchstart', 'pinchmove', 'pinchend'],\n  DOUBLE_TAP: ['doubletap'],\n  KEYBOARD: ['keydown']\n};\n\nvar Controller =\n/*#__PURE__*/\nfunction () {\n  function Controller(ControllerState) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, Controller);\n\n    (0, _assert.default)(ControllerState);\n    this.ControllerState = ControllerState;\n    this.controllerState = null;\n    this.controllerStateProps = null;\n    this.eventManager = null;\n    this.transitionManager = new _transitionManager.default(ControllerState, options);\n    this._events = null;\n    this._state = {\n      isDragging: false\n    };\n    this.events = [];\n    this.onViewStateChange = null;\n    this.onStateChange = null;\n    this.invertPan = false;\n    this.handleEvent = this.handleEvent.bind(this);\n    this.setProps(options);\n  }\n\n  _createClass(Controller, [{\n    key: \"finalize\",\n    value: function finalize() {\n      for (var eventName in this._events) {\n        if (this._events[eventName]) {\n          this.eventManager.off(eventName, this.handleEvent);\n        }\n      }\n\n      this.transitionManager.finalize();\n    }\n    /**\n     * Callback for events\n     * @param {hammer.Event} event\n     */\n\n  }, {\n    key: \"handleEvent\",\n    value: function handleEvent(event) {\n      var ControllerState = this.ControllerState;\n      this.controllerState = new ControllerState(Object.assign({}, this.controllerStateProps, this._state));\n\n      switch (event.type) {\n        case 'panstart':\n          return this._onPanStart(event);\n\n        case 'panmove':\n          return this._onPan(event);\n\n        case 'panend':\n          return this._onPanEnd(event);\n\n        case 'pinchstart':\n          return this._onPinchStart(event);\n\n        case 'pinchmove':\n          return this._onPinch(event);\n\n        case 'pinchend':\n          return this._onPinchEnd(event);\n\n        case 'doubletap':\n          return this._onDoubleTap(event);\n\n        case 'wheel':\n          return this._onWheel(event);\n\n        case 'keydown':\n          return this._onKeyDown(event);\n\n        default:\n          return false;\n      }\n    }\n    /* Event utils */\n    // Event object: http://hammerjs.github.io/api/#event-object\n\n  }, {\n    key: \"getCenter\",\n    value: function getCenter(event) {\n      var _this$controllerState = this.controllerStateProps,\n          x = _this$controllerState.x,\n          y = _this$controllerState.y;\n      var offsetCenter = event.offsetCenter;\n      return [offsetCenter.x - x, offsetCenter.y - y];\n    }\n  }, {\n    key: \"isPointInBounds\",\n    value: function isPointInBounds(pos) {\n      var _this$controllerState2 = this.controllerStateProps,\n          width = _this$controllerState2.width,\n          height = _this$controllerState2.height;\n      return pos[0] >= 0 && pos[0] <= width && pos[1] >= 0 && pos[1] <= height;\n    }\n  }, {\n    key: \"isFunctionKeyPressed\",\n    value: function isFunctionKeyPressed(event) {\n      var srcEvent = event.srcEvent;\n      return Boolean(srcEvent.metaKey || srcEvent.altKey || srcEvent.ctrlKey || srcEvent.shiftKey);\n    }\n  }, {\n    key: \"isDragging\",\n    value: function isDragging() {\n      return this._state.isDragging;\n    }\n    /**\n     * Extract interactivity options\n     */\n\n    /* eslint-disable complexity, max-statements */\n\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      if ('onViewportChange' in props) {\n        _log.default.removed('onViewportChange')();\n      }\n\n      if ('onViewStateChange' in props) {\n        this.onViewStateChange = props.onViewStateChange;\n      }\n\n      if ('onStateChange' in props) {\n        this.onStateChange = props.onStateChange;\n      }\n\n      this.controllerStateProps = props;\n\n      if ('eventManager' in props && this.eventManager !== props.eventManager) {\n        // EventManager has changed\n        this.eventManager = props.eventManager;\n        this._events = {};\n        this.toggleEvents(this.events, true);\n      }\n\n      this.transitionManager.processViewStateChange(this.controllerStateProps); // TODO - make sure these are not reset on every setProps\n\n      var _props$scrollZoom = props.scrollZoom,\n          scrollZoom = _props$scrollZoom === void 0 ? true : _props$scrollZoom,\n          _props$dragPan = props.dragPan,\n          dragPan = _props$dragPan === void 0 ? true : _props$dragPan,\n          _props$dragRotate = props.dragRotate,\n          dragRotate = _props$dragRotate === void 0 ? true : _props$dragRotate,\n          _props$doubleClickZoo = props.doubleClickZoom,\n          doubleClickZoom = _props$doubleClickZoo === void 0 ? true : _props$doubleClickZoo,\n          _props$touchZoom = props.touchZoom,\n          touchZoom = _props$touchZoom === void 0 ? true : _props$touchZoom,\n          _props$touchRotate = props.touchRotate,\n          touchRotate = _props$touchRotate === void 0 ? false : _props$touchRotate,\n          _props$keyboard = props.keyboard,\n          keyboard = _props$keyboard === void 0 ? true : _props$keyboard; // Register/unregister events\n\n      var isInteractive = Boolean(this.onViewStateChange);\n      this.toggleEvents(EVENT_TYPES.WHEEL, isInteractive && scrollZoom);\n      this.toggleEvents(EVENT_TYPES.PAN, isInteractive && (dragPan || dragRotate));\n      this.toggleEvents(EVENT_TYPES.PINCH, isInteractive && (touchZoom || touchRotate));\n      this.toggleEvents(EVENT_TYPES.DOUBLE_TAP, isInteractive && doubleClickZoom);\n      this.toggleEvents(EVENT_TYPES.KEYBOARD, isInteractive && keyboard); // Interaction toggles\n\n      this.scrollZoom = scrollZoom;\n      this.dragPan = dragPan;\n      this.dragRotate = dragRotate;\n      this.doubleClickZoom = doubleClickZoom;\n      this.touchZoom = touchZoom;\n      this.touchRotate = touchRotate;\n      this.keyboard = keyboard;\n    }\n    /* eslint-enable complexity, max-statements */\n\n  }, {\n    key: \"toggleEvents\",\n    value: function toggleEvents(eventNames, enabled) {\n      var _this = this;\n\n      if (this.eventManager) {\n        eventNames.forEach(function (eventName) {\n          if (_this._events[eventName] !== enabled) {\n            _this._events[eventName] = enabled;\n\n            if (enabled) {\n              _this.eventManager.on(eventName, _this.handleEvent);\n            } else {\n              _this.eventManager.off(eventName, _this.handleEvent);\n            }\n          }\n        });\n      }\n    } // DEPRECATED\n\n  }, {\n    key: \"setOptions\",\n    value: function setOptions(props) {\n      return this.setProps(props);\n    } // Private Methods\n\n    /* Callback util */\n    // formats map state and invokes callback function\n\n  }, {\n    key: \"updateViewport\",\n    value: function updateViewport(newControllerState) {\n      var extraProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var interactionState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      var viewState = Object.assign({}, newControllerState.getViewportProps(), extraProps); // TODO - to restore diffing, we need to include interactionState\n\n      var changed = this.controllerState !== newControllerState; // const oldViewState = this.controllerState.getViewportProps();\n      // const changed = Object.keys(viewState).some(key => oldViewState[key] !== viewState[key]);\n\n      if (changed) {\n        var oldViewState = this.controllerState ? this.controllerState.getViewportProps() : null;\n\n        if (this.onViewStateChange) {\n          this.onViewStateChange({\n            viewState: viewState,\n            interactionState: interactionState,\n            oldViewState: oldViewState\n          });\n        }\n      }\n\n      Object.assign(this._state, Object.assign({}, newControllerState.getInteractiveState(), interactionState));\n\n      if (this.onStateChange) {\n        this.onStateChange(this._state);\n      } // this.setState(Object.assign({}, newControllerState.getInteractiveState(), extraState));\n\n    }\n    /* Event handlers */\n    // Default handler for the `panstart` event.\n\n  }, {\n    key: \"_onPanStart\",\n    value: function _onPanStart(event) {\n      var pos = this.getCenter(event);\n\n      if (!this.isPointInBounds(pos)) {\n        return false;\n      }\n\n      var newControllerState = this.controllerState.panStart({\n        pos: pos\n      }).rotateStart({\n        pos: pos\n      });\n      return this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n        isDragging: true\n      });\n    } // Default handler for the `panmove` event.\n\n  }, {\n    key: \"_onPan\",\n    value: function _onPan(event) {\n      var alternateMode = this.isFunctionKeyPressed(event) || event.rightButton;\n      alternateMode = this.invertPan ? !alternateMode : alternateMode;\n      return alternateMode ? this._onPanMove(event) : this._onPanRotate(event);\n    } // Default handler for the `panend` event.\n\n  }, {\n    key: \"_onPanEnd\",\n    value: function _onPanEnd(event) {\n      var newControllerState = this.controllerState.panEnd().rotateEnd();\n      return this.updateViewport(newControllerState, null, {\n        isDragging: false\n      });\n    } // Default handler for panning to move.\n    // Called by `_onPan` when panning without function key pressed.\n\n  }, {\n    key: \"_onPanMove\",\n    value: function _onPanMove(event) {\n      if (!this.dragPan) {\n        return false;\n      }\n\n      var pos = this.getCenter(event);\n\n      if (!this.isDragging()) {\n        return false;\n      }\n\n      var newControllerState = this.controllerState.pan({\n        pos: pos\n      });\n      return this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n        isDragging: true\n      });\n    } // Default handler for panning to rotate.\n    // Called by `_onPan` when panning with function key pressed.\n\n  }, {\n    key: \"_onPanRotate\",\n    value: function _onPanRotate(event) {\n      if (!this.dragRotate) {\n        return false;\n      }\n\n      return this._onPanRotateStandard(event);\n    } // Normal pan to rotate\n\n  }, {\n    key: \"_onPanRotateStandard\",\n    value: function _onPanRotateStandard(event) {\n      var deltaX = event.deltaX,\n          deltaY = event.deltaY;\n\n      var _this$controllerState3 = this.controllerState.getViewportProps(),\n          width = _this$controllerState3.width,\n          height = _this$controllerState3.height;\n\n      var deltaScaleX = deltaX / width;\n      var deltaScaleY = deltaY / height;\n      var newControllerState = this.controllerState.rotate({\n        deltaScaleX: deltaScaleX,\n        deltaScaleY: deltaScaleY\n      });\n      return this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n        isDragging: true\n      });\n    }\n  }, {\n    key: \"_onPanRotateMap\",\n    value: function _onPanRotateMap(event) {\n      var deltaX = event.deltaX,\n          deltaY = event.deltaY;\n\n      var _this$getCenter = this.getCenter(event),\n          _this$getCenter2 = _slicedToArray(_this$getCenter, 2),\n          centerY = _this$getCenter2[1];\n\n      var startY = centerY - deltaY;\n\n      var _this$controllerState4 = this.controllerState.getViewportProps(),\n          width = _this$controllerState4.width,\n          height = _this$controllerState4.height;\n\n      var deltaScaleX = deltaX / width;\n      var deltaScaleY = 0;\n\n      if (deltaY > 0) {\n        if (Math.abs(height - startY) > PITCH_MOUSE_THRESHOLD) {\n          // Move from 0 to -1 as we drag upwards\n          deltaScaleY = deltaY / (startY - height) * PITCH_ACCEL;\n        }\n      } else if (deltaY < 0) {\n        if (startY > PITCH_MOUSE_THRESHOLD) {\n          // Move from 0 to 1 as we drag upwards\n          deltaScaleY = 1 - centerY / startY;\n        }\n      }\n\n      deltaScaleY = Math.min(1, Math.max(-1, deltaScaleY));\n      var newControllerState = this.controllerState.rotate({\n        deltaScaleX: deltaScaleX,\n        deltaScaleY: deltaScaleY\n      });\n      return this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n        isDragging: true\n      });\n    } // Default handler for the `wheel` event.\n\n  }, {\n    key: \"_onWheel\",\n    value: function _onWheel(event) {\n      if (!this.scrollZoom) {\n        return false;\n      }\n\n      event.preventDefault();\n      var pos = this.getCenter(event);\n\n      if (!this.isPointInBounds(pos)) {\n        return false;\n      }\n\n      var delta = event.delta; // Map wheel delta to relative scale\n\n      var scale = 2 / (1 + Math.exp(-Math.abs(delta * ZOOM_ACCEL)));\n\n      if (delta < 0 && scale !== 0) {\n        scale = 1 / scale;\n      }\n\n      var newControllerState = this.controllerState.zoom({\n        pos: pos,\n        scale: scale\n      });\n      return this.updateViewport(newControllerState, NO_TRANSITION_PROPS);\n    } // Default handler for the `pinchstart` event.\n\n  }, {\n    key: \"_onPinchStart\",\n    value: function _onPinchStart(event) {\n      var pos = this.getCenter(event);\n\n      if (!this.isPointInBounds(pos)) {\n        return false;\n      }\n\n      var newControllerState = this.controllerState.zoomStart({\n        pos: pos\n      }).rotateStart({\n        pos: pos\n      }); // hack - hammer's `rotation` field doesn't seem to produce the correct angle\n\n      this._state.startPinchRotation = event.rotation;\n      return this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n        isDragging: true\n      });\n    } // Default handler for the `pinch` event.\n\n  }, {\n    key: \"_onPinch\",\n    value: function _onPinch(event) {\n      if (!this.touchZoom && !this.touchRotate) {\n        return false;\n      }\n\n      var newControllerState = this.controllerState;\n\n      if (this.touchZoom) {\n        var scale = event.scale;\n        var pos = this.getCenter(event);\n        newControllerState = newControllerState.zoom({\n          pos: pos,\n          scale: scale\n        });\n      }\n\n      if (this.touchRotate) {\n        var rotation = event.rotation;\n        var startPinchRotation = this._state.startPinchRotation;\n        newControllerState = newControllerState.rotate({\n          deltaScaleX: -(rotation - startPinchRotation) / 180\n        });\n      }\n\n      return this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n        isDragging: true\n      });\n    } // Default handler for the `pinchend` event.\n\n  }, {\n    key: \"_onPinchEnd\",\n    value: function _onPinchEnd(event) {\n      var newControllerState = this.controllerState.zoomEnd().rotateEnd();\n      this._state.startPinchRotation = 0;\n      return this.updateViewport(newControllerState, null, {\n        isDragging: false\n      });\n    } // Default handler for the `doubletap` event.\n\n  }, {\n    key: \"_onDoubleTap\",\n    value: function _onDoubleTap(event) {\n      if (!this.doubleClickZoom) {\n        return false;\n      }\n\n      var pos = this.getCenter(event);\n\n      if (!this.isPointInBounds(pos)) {\n        return false;\n      }\n\n      var isZoomOut = this.isFunctionKeyPressed(event);\n      var newControllerState = this.controllerState.zoom({\n        pos: pos,\n        scale: isZoomOut ? 0.5 : 2\n      });\n      return this.updateViewport(newControllerState, this._getTransitionProps());\n    }\n    /* eslint-disable complexity */\n    // Default handler for the `keydown` event\n\n  }, {\n    key: \"_onKeyDown\",\n    value: function _onKeyDown(event) {\n      if (!this.keyboard) {\n        return false;\n      }\n\n      var funcKey = this.isFunctionKeyPressed(event);\n      var controllerState = this.controllerState;\n      var newControllerState;\n\n      switch (event.srcEvent.keyCode) {\n        case 189:\n          // -\n          newControllerState = funcKey ? controllerState.zoomOut().zoomOut() : controllerState.zoomOut();\n          break;\n\n        case 187:\n          // +\n          newControllerState = funcKey ? controllerState.zoomIn().zoomIn() : controllerState.zoomIn();\n          break;\n\n        case 37:\n          // left\n          newControllerState = funcKey ? controllerState.rotateLeft() : controllerState.moveLeft();\n          break;\n\n        case 39:\n          // right\n          newControllerState = funcKey ? controllerState.rotateRight() : controllerState.moveRight();\n          break;\n\n        case 38:\n          // up\n          newControllerState = funcKey ? controllerState.rotateUp() : controllerState.moveUp();\n          break;\n\n        case 40:\n          // down\n          newControllerState = funcKey ? controllerState.rotateDown() : controllerState.moveDown();\n          break;\n\n        default:\n          return false;\n      }\n\n      return this.updateViewport(newControllerState, this._getTransitionProps());\n    }\n    /* eslint-enable complexity */\n\n  }, {\n    key: \"_getTransitionProps\",\n    value: function _getTransitionProps() {\n      // Transitions on double-tap and key-down are only supported by MapController\n      return NO_TRANSITION_PROPS;\n    }\n  }]);\n\n  return Controller;\n}();\n\nexports.default = Controller;\n},{\"./transition-manager\":\"nTOp\",\"../utils/log\":\"mqAj\",\"../utils/assert\":\"R2tg\"}],\"VX0j\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _math = require(\"math.gl\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nvar defaultState = {\n  position: [0, 0, 0],\n  lookAt: [0, 0, 0],\n  up: [0, 0, 1],\n  rotationX: 0,\n  rotationY: 0,\n  fov: 50,\n  near: 1,\n  far: 100\n};\n/* Helpers */\n\nvar ViewState =\n/*#__PURE__*/\nfunction () {\n  function ViewState(opts) {\n    _classCallCheck(this, ViewState);\n\n    var width = opts.width,\n        height = opts.height,\n        _opts$position = opts.position,\n        position = _opts$position === void 0 ? defaultState.position : _opts$position;\n    (0, _assert.default)(Number.isFinite(width), '`width` must be supplied');\n    (0, _assert.default)(Number.isFinite(height), '`height` must be supplied');\n    this._viewportProps = this._applyConstraints(Object.assign({}, opts, {\n      position: new _math.Vector3(position)\n    }));\n  }\n\n  _createClass(ViewState, [{\n    key: \"getViewportProps\",\n    value: function getViewportProps() {\n      return this._viewportProps;\n    }\n  }, {\n    key: \"getDirection\",\n    value: function getDirection() {\n      var spherical = new _math._SphericalCoordinates({\n        bearing: this._viewportProps.bearing,\n        pitch: this._viewportProps.pitch\n      });\n      var direction = spherical.toVector3().normalize();\n      return direction;\n    }\n  }, {\n    key: \"getDirectionFromBearing\",\n    value: function getDirectionFromBearing(bearing) {\n      var spherical = new _math._SphericalCoordinates({\n        bearing: bearing,\n        pitch: 90\n      });\n      var direction = spherical.toVector3().normalize();\n      return direction;\n    }\n  }, {\n    key: \"shortestPathFrom\",\n    value: function shortestPathFrom(viewState) {\n      return this._viewportProps;\n    } // Redefined by subclass\n    // Apply any constraints (mathematical or defined by _viewportProps) to map state\n\n  }, {\n    key: \"_applyConstraints\",\n    value: function _applyConstraints(props) {\n      return props;\n    }\n  }]);\n\n  return ViewState;\n}();\n\nexports.default = ViewState;\n},{\"math.gl\":\"o5CE\",\"../utils/assert\":\"R2tg\"}],\"RiRd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.testExports = exports.default = exports.MAPBOX_LIMITS = void 0;\n\nvar _math = require(\"math.gl\");\n\nvar _controller = _interopRequireDefault(require(\"./controller\"));\n\nvar _viewState = _interopRequireDefault(require(\"./view-state\"));\n\nvar _viewportMercatorProject = _interopRequireWildcard(require(\"viewport-mercator-project\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _linearInterpolator = _interopRequireDefault(require(\"../transitions/linear-interpolator\"));\n\nvar _transitionManager = require(\"./transition-manager\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar LINEAR_TRANSITION_PROPS = {\n  transitionDuration: 300,\n  transitionEasing: function transitionEasing(t) {\n    return t;\n  },\n  transitionInterpolator: new _linearInterpolator.default(),\n  transitionInterruption: _transitionManager.TRANSITION_EVENTS.BREAK\n}; // MAPBOX LIMITS\n\nvar MAPBOX_LIMITS = {\n  minZoom: 0,\n  maxZoom: 20,\n  minPitch: 0,\n  maxPitch: 60\n};\nexports.MAPBOX_LIMITS = MAPBOX_LIMITS;\nvar DEFAULT_STATE = {\n  pitch: 0,\n  bearing: 0,\n  altitude: 1.5\n};\n/* Utils */\n\nvar MapState =\n/*#__PURE__*/\nfunction (_ViewState) {\n  _inherits(MapState, _ViewState);\n\n  function MapState() {\n    var _this;\n\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        width = _ref.width,\n        height = _ref.height,\n        latitude = _ref.latitude,\n        longitude = _ref.longitude,\n        zoom = _ref.zoom,\n        _ref$bearing = _ref.bearing,\n        bearing = _ref$bearing === void 0 ? DEFAULT_STATE.bearing : _ref$bearing,\n        _ref$pitch = _ref.pitch,\n        pitch = _ref$pitch === void 0 ? DEFAULT_STATE.pitch : _ref$pitch,\n        _ref$altitude = _ref.altitude,\n        altitude = _ref$altitude === void 0 ? DEFAULT_STATE.altitude : _ref$altitude,\n        _ref$maxZoom = _ref.maxZoom,\n        maxZoom = _ref$maxZoom === void 0 ? MAPBOX_LIMITS.maxZoom : _ref$maxZoom,\n        _ref$minZoom = _ref.minZoom,\n        minZoom = _ref$minZoom === void 0 ? MAPBOX_LIMITS.minZoom : _ref$minZoom,\n        _ref$maxPitch = _ref.maxPitch,\n        maxPitch = _ref$maxPitch === void 0 ? MAPBOX_LIMITS.maxPitch : _ref$maxPitch,\n        _ref$minPitch = _ref.minPitch,\n        minPitch = _ref$minPitch === void 0 ? MAPBOX_LIMITS.minPitch : _ref$minPitch,\n        startPanLngLat = _ref.startPanLngLat,\n        startZoomLngLat = _ref.startZoomLngLat,\n        startBearing = _ref.startBearing,\n        startPitch = _ref.startPitch,\n        startZoom = _ref.startZoom;\n\n    _classCallCheck(this, MapState);\n\n    (0, _assert.default)(Number.isFinite(longitude), '`longitude` must be supplied');\n    (0, _assert.default)(Number.isFinite(latitude), '`latitude` must be supplied');\n    (0, _assert.default)(Number.isFinite(zoom), '`zoom` must be supplied');\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(MapState).call(this, {\n      width: width,\n      height: height,\n      latitude: latitude,\n      longitude: longitude,\n      zoom: zoom,\n      bearing: bearing,\n      pitch: pitch,\n      altitude: altitude,\n      maxZoom: maxZoom,\n      minZoom: minZoom,\n      maxPitch: maxPitch,\n      minPitch: minPitch\n    }));\n    _this._interactiveState = {\n      startPanLngLat: startPanLngLat,\n      startZoomLngLat: startZoomLngLat,\n      startBearing: startBearing,\n      startPitch: startPitch,\n      startZoom: startZoom\n    };\n    return _this;\n  }\n  /* Public API */\n\n\n  _createClass(MapState, [{\n    key: \"getViewportProps\",\n    value: function getViewportProps() {\n      return this._viewportProps;\n    }\n  }, {\n    key: \"getInteractiveState\",\n    value: function getInteractiveState() {\n      return this._interactiveState;\n    }\n    /**\n     * Start panning\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"panStart\",\n    value: function panStart(_ref2) {\n      var pos = _ref2.pos;\n      return this._getUpdatedState({\n        startPanLngLat: this._unproject(pos)\n      });\n    }\n    /**\n     * Pan\n     * @param {[Number, Number]} pos - position on screen where the pointer is\n     * @param {[Number, Number], optional} startPos - where the pointer grabbed at\n     *   the start of the operation. Must be supplied of `panStart()` was not called\n     */\n\n  }, {\n    key: \"pan\",\n    value: function pan(_ref3) {\n      var pos = _ref3.pos,\n          startPos = _ref3.startPos;\n\n      var startPanLngLat = this._interactiveState.startPanLngLat || this._unproject(startPos);\n\n      if (!startPanLngLat) {\n        return this;\n      }\n\n      var _this$_calculateNewLn = this._calculateNewLngLat({\n        startPanLngLat: startPanLngLat,\n        pos: pos\n      }),\n          _this$_calculateNewLn2 = _slicedToArray(_this$_calculateNewLn, 2),\n          longitude = _this$_calculateNewLn2[0],\n          latitude = _this$_calculateNewLn2[1];\n\n      return this._getUpdatedState({\n        longitude: longitude,\n        latitude: latitude\n      });\n    }\n    /**\n     * End panning\n     * Must call if `panStart()` was called\n     */\n\n  }, {\n    key: \"panEnd\",\n    value: function panEnd() {\n      return this._getUpdatedState({\n        startPanLngLat: null\n      });\n    }\n    /**\n     * Start rotating\n     * @param {[Number, Number]} pos - position on screen where the center is\n     */\n\n  }, {\n    key: \"rotateStart\",\n    value: function rotateStart(_ref4) {\n      var pos = _ref4.pos;\n      return this._getUpdatedState({\n        startBearing: this._viewportProps.bearing,\n        startPitch: this._viewportProps.pitch\n      });\n    }\n    /**\n     * Rotate\n     * @param {Number} deltaScaleX - a number between [-1, 1] specifying the\n     *   change to bearing.\n     * @param {Number} deltaScaleY - a number between [-1, 1] specifying the\n     *   change to pitch. -1 sets to minPitch and 1 sets to maxPitch.\n     */\n\n  }, {\n    key: \"rotate\",\n    value: function rotate(_ref5) {\n      var _ref5$deltaScaleX = _ref5.deltaScaleX,\n          deltaScaleX = _ref5$deltaScaleX === void 0 ? 0 : _ref5$deltaScaleX,\n          _ref5$deltaScaleY = _ref5.deltaScaleY,\n          deltaScaleY = _ref5$deltaScaleY === void 0 ? 0 : _ref5$deltaScaleY;\n      var _this$_interactiveSta = this._interactiveState,\n          startBearing = _this$_interactiveSta.startBearing,\n          startPitch = _this$_interactiveSta.startPitch;\n\n      if (!Number.isFinite(startBearing) || !Number.isFinite(startPitch)) {\n        return this;\n      }\n\n      var _this$_calculateNewPi = this._calculateNewPitchAndBearing({\n        deltaScaleX: deltaScaleX,\n        deltaScaleY: deltaScaleY,\n        startBearing: startBearing,\n        startPitch: startPitch\n      }),\n          pitch = _this$_calculateNewPi.pitch,\n          bearing = _this$_calculateNewPi.bearing;\n\n      return this._getUpdatedState({\n        bearing: bearing,\n        pitch: pitch\n      });\n    }\n    /**\n     * End rotating\n     * Must call if `rotateStart()` was called\n     */\n\n  }, {\n    key: \"rotateEnd\",\n    value: function rotateEnd() {\n      return this._getUpdatedState({\n        startBearing: null,\n        startPitch: null\n      });\n    }\n    /**\n     * Start zooming\n     * @param {[Number, Number]} pos - position on screen where the center is\n     */\n\n  }, {\n    key: \"zoomStart\",\n    value: function zoomStart(_ref6) {\n      var pos = _ref6.pos;\n      return this._getUpdatedState({\n        startZoomLngLat: this._unproject(pos),\n        startZoom: this._viewportProps.zoom\n      });\n    }\n    /**\n     * Zoom\n     * @param {[Number, Number]} pos - position on screen where the current center is\n     * @param {[Number, Number]} startPos - the center position at\n     *   the start of the operation. Must be supplied of `zoomStart()` was not called\n     * @param {Number} scale - a number between [0, 1] specifying the accumulated\n     *   relative scale.\n     */\n\n  }, {\n    key: \"zoom\",\n    value: function zoom(_ref7) {\n      var pos = _ref7.pos,\n          startPos = _ref7.startPos,\n          scale = _ref7.scale;\n      (0, _assert.default)(scale > 0, '`scale` must be a positive number'); // Make sure we zoom around the current mouse position rather than map center\n\n      var _this$_interactiveSta2 = this._interactiveState,\n          startZoom = _this$_interactiveSta2.startZoom,\n          startZoomLngLat = _this$_interactiveSta2.startZoomLngLat;\n\n      if (!Number.isFinite(startZoom)) {\n        // We have two modes of zoom:\n        // scroll zoom that are discrete events (transform from the current zoom level),\n        // and pinch zoom that are continuous events (transform from the zoom level when\n        // pinch started).\n        // If startZoom state is defined, then use the startZoom state;\n        // otherwise assume discrete zooming\n        startZoom = this._viewportProps.zoom;\n        startZoomLngLat = this._unproject(startPos) || this._unproject(pos);\n      } // take the start lnglat and put it where the mouse is down.\n\n\n      (0, _assert.default)(startZoomLngLat, '`startZoomLngLat` prop is required ' + 'for zoom behavior to calculate where to position the map.');\n\n      var zoom = this._calculateNewZoom({\n        scale: scale,\n        startZoom: startZoom\n      });\n\n      var zoomedViewport = new _viewportMercatorProject.default(Object.assign({}, this._viewportProps, {\n        zoom: zoom\n      }));\n\n      var _zoomedViewport$getLo = zoomedViewport.getLocationAtPoint({\n        lngLat: startZoomLngLat,\n        pos: pos\n      }),\n          _zoomedViewport$getLo2 = _slicedToArray(_zoomedViewport$getLo, 2),\n          longitude = _zoomedViewport$getLo2[0],\n          latitude = _zoomedViewport$getLo2[1];\n\n      return this._getUpdatedState({\n        zoom: zoom,\n        longitude: longitude,\n        latitude: latitude\n      });\n    }\n    /**\n     * End zooming\n     * Must call if `zoomStart()` was called\n     */\n\n  }, {\n    key: \"zoomEnd\",\n    value: function zoomEnd() {\n      return this._getUpdatedState({\n        startZoomLngLat: null,\n        startZoom: null\n      });\n    }\n  }, {\n    key: \"zoomIn\",\n    value: function zoomIn() {\n      return this._zoomFromCenter(2);\n    }\n  }, {\n    key: \"zoomOut\",\n    value: function zoomOut() {\n      return this._zoomFromCenter(0.5);\n    }\n  }, {\n    key: \"moveLeft\",\n    value: function moveLeft() {\n      return this._panFromCenter([100, 0]);\n    }\n  }, {\n    key: \"moveRight\",\n    value: function moveRight() {\n      return this._panFromCenter([-100, 0]);\n    }\n  }, {\n    key: \"moveUp\",\n    value: function moveUp() {\n      return this._panFromCenter([0, 100]);\n    }\n  }, {\n    key: \"moveDown\",\n    value: function moveDown() {\n      return this._panFromCenter([0, -100]);\n    }\n  }, {\n    key: \"rotateLeft\",\n    value: function rotateLeft() {\n      return this._getUpdatedState({\n        bearing: this._viewportProps.bearing - 15\n      });\n    }\n  }, {\n    key: \"rotateRight\",\n    value: function rotateRight() {\n      return this._getUpdatedState({\n        bearing: this._viewportProps.bearing + 15\n      });\n    }\n  }, {\n    key: \"rotateUp\",\n    value: function rotateUp() {\n      return this._getUpdatedState({\n        pitch: this._viewportProps.pitch + 10\n      });\n    }\n  }, {\n    key: \"rotateDown\",\n    value: function rotateDown() {\n      return this._getUpdatedState({\n        pitch: this._viewportProps.pitch - 10\n      });\n    }\n  }, {\n    key: \"shortestPathFrom\",\n    value: function shortestPathFrom(viewState) {\n      // const endViewStateProps = new this.ControllerState(endProps).shortestPathFrom(startViewstate);\n      var fromProps = viewState.getViewportProps();\n      var props = Object.assign({}, this._viewportProps);\n      var bearing = props.bearing,\n          longitude = props.longitude;\n\n      if (Math.abs(bearing - fromProps.bearing) > 180) {\n        props.bearing = bearing < 0 ? bearing + 360 : bearing - 360;\n      }\n\n      if (Math.abs(longitude - fromProps.longitude) > 180) {\n        props.longitude = longitude < 0 ? longitude + 360 : longitude - 360;\n      }\n\n      return props;\n    }\n    /* Private methods */\n\n  }, {\n    key: \"_zoomFromCenter\",\n    value: function _zoomFromCenter(scale) {\n      var _this$_viewportProps = this._viewportProps,\n          width = _this$_viewportProps.width,\n          height = _this$_viewportProps.height;\n      return this.zoom({\n        pos: [width / 2, height / 2],\n        scale: scale\n      });\n    }\n  }, {\n    key: \"_panFromCenter\",\n    value: function _panFromCenter(offset) {\n      var _this$_viewportProps2 = this._viewportProps,\n          width = _this$_viewportProps2.width,\n          height = _this$_viewportProps2.height;\n      return this.pan({\n        startPos: [width / 2, height / 2],\n        pos: [width / 2 + offset[0], height / 2 + offset[1]]\n      });\n    }\n  }, {\n    key: \"_getUpdatedState\",\n    value: function _getUpdatedState(newProps) {\n      // Update _viewportProps\n      return new MapState(Object.assign({}, this._viewportProps, this._interactiveState, newProps));\n    } // Apply any constraints (mathematical or defined by _viewportProps) to map state\n\n  }, {\n    key: \"_applyConstraints\",\n    value: function _applyConstraints(props) {\n      // Ensure zoom is within specified range\n      var maxZoom = props.maxZoom,\n          minZoom = props.minZoom,\n          zoom = props.zoom;\n      props.zoom = (0, _math.clamp)(zoom, minZoom, maxZoom); // Ensure pitch is within specified range\n\n      var maxPitch = props.maxPitch,\n          minPitch = props.minPitch,\n          pitch = props.pitch;\n      props.pitch = (0, _math.clamp)(pitch, minPitch, maxPitch);\n      Object.assign(props, (0, _viewportMercatorProject.normalizeViewportProps)(props));\n      return props;\n    }\n  }, {\n    key: \"_unproject\",\n    value: function _unproject(pos) {\n      var viewport = new _viewportMercatorProject.default(this._viewportProps);\n      return pos && viewport.unproject(pos);\n    } // Calculate a new lnglat based on pixel dragging position\n\n  }, {\n    key: \"_calculateNewLngLat\",\n    value: function _calculateNewLngLat(_ref8) {\n      var startPanLngLat = _ref8.startPanLngLat,\n          pos = _ref8.pos;\n      var viewport = new _viewportMercatorProject.default(this._viewportProps);\n      return viewport.getMapCenterByLngLatPosition({\n        lngLat: startPanLngLat,\n        pos: pos\n      });\n    } // Calculates new zoom\n\n  }, {\n    key: \"_calculateNewZoom\",\n    value: function _calculateNewZoom(_ref9) {\n      var scale = _ref9.scale,\n          startZoom = _ref9.startZoom;\n      var _this$_viewportProps3 = this._viewportProps,\n          maxZoom = _this$_viewportProps3.maxZoom,\n          minZoom = _this$_viewportProps3.minZoom;\n      var zoom = startZoom + Math.log2(scale);\n      return (0, _math.clamp)(zoom, minZoom, maxZoom);\n    } // Calculates a new pitch and bearing from a position (coming from an event)\n\n  }, {\n    key: \"_calculateNewPitchAndBearing\",\n    value: function _calculateNewPitchAndBearing(_ref10) {\n      var deltaScaleX = _ref10.deltaScaleX,\n          deltaScaleY = _ref10.deltaScaleY,\n          startBearing = _ref10.startBearing,\n          startPitch = _ref10.startPitch; // clamp deltaScaleY to [-1, 1] so that rotation is constrained between minPitch and maxPitch.\n      // deltaScaleX does not need to be clamped as bearing does not have constraints.\n\n      deltaScaleY = (0, _math.clamp)(deltaScaleY, -1, 1);\n      var _this$_viewportProps4 = this._viewportProps,\n          minPitch = _this$_viewportProps4.minPitch,\n          maxPitch = _this$_viewportProps4.maxPitch;\n      var bearing = startBearing + 180 * deltaScaleX;\n      var pitch = startPitch;\n\n      if (deltaScaleY > 0) {\n        // Gradually increase pitch\n        pitch = startPitch + deltaScaleY * (maxPitch - startPitch);\n      } else if (deltaScaleY < 0) {\n        // Gradually decrease pitch\n        pitch = startPitch - deltaScaleY * (minPitch - startPitch);\n      }\n\n      return {\n        pitch: pitch,\n        bearing: bearing\n      };\n    }\n  }]);\n\n  return MapState;\n}(_viewState.default);\n\nvar MapController =\n/*#__PURE__*/\nfunction (_Controller) {\n  _inherits(MapController, _Controller);\n\n  function MapController(props) {\n    var _this2;\n\n    _classCallCheck(this, MapController);\n\n    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(MapController).call(this, MapState, props));\n    _this2.invertPan = true;\n    return _this2;\n  }\n\n  _createClass(MapController, [{\n    key: \"_getTransitionProps\",\n    value: function _getTransitionProps() {\n      // Enables Transitions on double-tap and key-down events.\n      return LINEAR_TRANSITION_PROPS;\n    }\n  }, {\n    key: \"_onPanRotate\",\n    value: function _onPanRotate(event) {\n      if (!this.dragRotate) {\n        return false;\n      }\n\n      return this._onPanRotateMap(event);\n    }\n  }]);\n\n  return MapController;\n}(_controller.default);\n\nexports.default = MapController;\nvar testExports = {\n  MapState: MapState\n};\nexports.testExports = testExports;\n},{\"math.gl\":\"o5CE\",\"./controller\":\"SwtL\",\"./view-state\":\"VX0j\",\"viewport-mercator-project\":\"ha5B\",\"../utils/assert\":\"R2tg\",\"../transitions/linear-interpolator\":\"Xz4u\",\"./transition-manager\":\"nTOp\"}],\"tu7Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _view = _interopRequireDefault(require(\"./view\"));\n\nvar _webMercatorViewport = _interopRequireDefault(require(\"../viewports/web-mercator-viewport\"));\n\nvar _mapController = _interopRequireDefault(require(\"../controllers/map-controller\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar MapView =\n/*#__PURE__*/\nfunction (_View) {\n  _inherits(MapView, _View);\n\n  function MapView(props) {\n    _classCallCheck(this, MapView);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(MapView).call(this, Object.assign({}, props, {\n      type: _webMercatorViewport.default\n    })));\n  }\n\n  _createClass(MapView, [{\n    key: \"controller\",\n    get: function get() {\n      return this._getControllerProps({\n        type: _mapController.default\n      });\n    }\n  }]);\n\n  return MapView;\n}(_view.default);\n\nexports.default = MapView;\nMapView.displayName = 'MapView';\n},{\"./view\":\"Xp7T\",\"../viewports/web-mercator-viewport\":\"RWhD\",\"../controllers/map-controller\":\"RiRd\"}],\"LRuT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* eslint-disable no-try-catch */\n\n\nvar EffectManager =\n/*#__PURE__*/\nfunction () {\n  function EffectManager(_ref) {\n    var gl = _ref.gl,\n        layerManager = _ref.layerManager;\n\n    _classCallCheck(this, EffectManager);\n\n    this.gl = gl;\n    this.layerManager = layerManager;\n    this._effects = [];\n  }\n  /**\n   * Adds an effect to be managed.  That effect's initialize function will\n   * be called, and the effect's preDraw and draw callbacks will be\n   * called at the appropriate times in the render loop\n   * @param {Effect} effect - the effect to be added\n   */\n\n\n  _createClass(EffectManager, [{\n    key: \"addEffect\",\n    value: function addEffect(effect) {\n      this._effects.push(effect);\n\n      this._sortEffects();\n\n      effect.initialize({\n        gl: this.gl,\n        layerManager: this.layerManager\n      });\n    }\n    /**\n     * Removes an effect that is already being managed.  That effect's\n     * finalize function will be called, and its callbacks will no longer\n     * be envoked in the render loop\n     * @param {Effect} effect - the effect to be removed\n     * @return {bool} - True if the effect was already being managed, and\n     * thus successfully removed; false otherwise\n     */\n\n  }, {\n    key: \"removeEffect\",\n    value: function removeEffect(effect) {\n      var i = this._effects.indexOf(effect);\n\n      if (i >= 0) {\n        effect.finalize({\n          gl: this.gl,\n          layerManager: this.layerManager\n        });\n\n        this._effects.splice(i, 1);\n\n        return true;\n      }\n\n      return false;\n    }\n    /**\n     * Envoke the preDraw callback of all managed events, in order of\n     * decreasing priority\n     */\n\n  }, {\n    key: \"preDraw\",\n    value: function preDraw() {\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = this._effects[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var effect = _step.value;\n\n          if (effect.needsRedraw) {\n            effect.preDraw({\n              gl: this.gl,\n              layerManager: this.layerManager\n            });\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n    /**\n     * Envoke the draw callback of all managed events, in order of\n     * decreasing priority\n     */\n\n  }, {\n    key: \"draw\",\n    value: function draw() {\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = this._effects[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var effect = _step2.value;\n\n          if (effect.needsRedraw) {\n            effect.draw({\n              gl: this.gl,\n              layerManager: this.layerManager\n            });\n          }\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"_sortEffects\",\n    value: function _sortEffects() {\n      this._effects.sort(function (a, b) {\n        if (a.priority > b.priority) {\n          return -1;\n        } else if (a.priority < b.priority) {\n          return 1;\n        }\n\n        return a.count - b.count;\n      });\n    }\n  }]);\n\n  return EffectManager;\n}();\n\nexports.default = EffectManager;\n},{}],\"bkMp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar counter = 0;\n\nvar Effect =\n/*#__PURE__*/\nfunction () {\n  function Effect() {\n    _classCallCheck(this, Effect);\n\n    this.id = 'effect';\n    this.count = counter++;\n    this.visible = true;\n    this.priority = 0;\n    this.needsRedraw = false;\n  }\n  /**\n   * subclasses should override to set up any resources needed\n   */\n\n\n  _createClass(Effect, [{\n    key: \"initialize\",\n    value: function initialize(_ref) {\n      var gl = _ref.gl,\n          layerManager = _ref.layerManager;\n    }\n    /**\n     * and subclasses should free those resources here\n     */\n\n  }, {\n    key: \"finalize\",\n    value: function finalize(_ref2) {\n      var gl = _ref2.gl,\n          layerManager = _ref2.layerManager;\n    }\n    /**\n     * override for a callback immediately before drawing each frame\n     */\n\n  }, {\n    key: \"preDraw\",\n    value: function preDraw(_ref3) {\n      var gl = _ref3.gl,\n          layerManager = _ref3.layerManager;\n    }\n    /**\n     * override for a callback immediately after drawing a frame's layers\n     */\n\n  }, {\n    key: \"draw\",\n    value: function draw(_ref4) {\n      var gl = _ref4.gl,\n          layerManager = _ref4.layerManager;\n    }\n  }, {\n    key: \"setNeedsRedraw\",\n    value: function setNeedsRedraw() {\n      var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n      this.needsRedraw = redraw;\n    }\n  }]);\n\n  return Effect;\n}();\n\nexports.default = Effect;\n},{}],\"vhjd\":[function(require,module,exports) {\nvar define;\n/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function (window, document, exportName, undefined) {\n  'use strict';\n\n  var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n  var TEST_ELEMENT = document.createElement('div');\n  var TYPE_FUNCTION = 'function';\n  var round = Math.round;\n  var abs = Math.abs;\n  var now = Date.now;\n  /**\n   * set a timeout with a given scope\n   * @param {Function} fn\n   * @param {Number} timeout\n   * @param {Object} context\n   * @returns {number}\n   */\n\n  function setTimeoutContext(fn, timeout, context) {\n    return setTimeout(bindFn(fn, context), timeout);\n  }\n  /**\n   * if the argument is an array, we want to execute the fn on each entry\n   * if it aint an array we don't want to do a thing.\n   * this is used by all the methods that accept a single and array argument.\n   * @param {*|Array} arg\n   * @param {String} fn\n   * @param {Object} [context]\n   * @returns {Boolean}\n   */\n\n\n  function invokeArrayArg(arg, fn, context) {\n    if (Array.isArray(arg)) {\n      each(arg, context[fn], context);\n      return true;\n    }\n\n    return false;\n  }\n  /**\n   * walk objects and arrays\n   * @param {Object} obj\n   * @param {Function} iterator\n   * @param {Object} context\n   */\n\n\n  function each(obj, iterator, context) {\n    var i;\n\n    if (!obj) {\n      return;\n    }\n\n    if (obj.forEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length !== undefined) {\n      i = 0;\n\n      while (i < obj.length) {\n        iterator.call(context, obj[i], i, obj);\n        i++;\n      }\n    } else {\n      for (i in obj) {\n        obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n      }\n    }\n  }\n  /**\n   * wrap a method with a deprecation warning and stack trace\n   * @param {Function} method\n   * @param {String} name\n   * @param {String} message\n   * @returns {Function} A new function wrapping the supplied method.\n   */\n\n\n  function deprecate(method, name, message) {\n    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n    return function () {\n      var e = new Error('get-stack-trace');\n      var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '').replace(/^\\s+at\\s+/gm, '').replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n      var log = window.console && (window.console.warn || window.console.log);\n\n      if (log) {\n        log.call(window.console, deprecationMessage, stack);\n      }\n\n      return method.apply(this, arguments);\n    };\n  }\n  /**\n   * extend object.\n   * means that properties in dest will be overwritten by the ones in src.\n   * @param {Object} target\n   * @param {...Object} objects_to_assign\n   * @returns {Object} target\n   */\n\n\n  var assign;\n\n  if (typeof Object.assign !== 'function') {\n    assign = function assign(target) {\n      if (target === undefined || target === null) {\n        throw new TypeError('Cannot convert undefined or null to object');\n      }\n\n      var output = Object(target);\n\n      for (var index = 1; index < arguments.length; index++) {\n        var source = arguments[index];\n\n        if (source !== undefined && source !== null) {\n          for (var nextKey in source) {\n            if (source.hasOwnProperty(nextKey)) {\n              output[nextKey] = source[nextKey];\n            }\n          }\n        }\n      }\n\n      return output;\n    };\n  } else {\n    assign = Object.assign;\n  }\n  /**\n   * extend object.\n   * means that properties in dest will be overwritten by the ones in src.\n   * @param {Object} dest\n   * @param {Object} src\n   * @param {Boolean} [merge=false]\n   * @returns {Object} dest\n   */\n\n\n  var extend = deprecate(function extend(dest, src, merge) {\n    var keys = Object.keys(src);\n    var i = 0;\n\n    while (i < keys.length) {\n      if (!merge || merge && dest[keys[i]] === undefined) {\n        dest[keys[i]] = src[keys[i]];\n      }\n\n      i++;\n    }\n\n    return dest;\n  }, 'extend', 'Use `assign`.');\n  /**\n   * merge the values from src in the dest.\n   * means that properties that exist in dest will not be overwritten by src\n   * @param {Object} dest\n   * @param {Object} src\n   * @returns {Object} dest\n   */\n\n  var merge = deprecate(function merge(dest, src) {\n    return extend(dest, src, true);\n  }, 'merge', 'Use `assign`.');\n  /**\n   * simple class inheritance\n   * @param {Function} child\n   * @param {Function} base\n   * @param {Object} [properties]\n   */\n\n  function inherit(child, base, properties) {\n    var baseP = base.prototype,\n        childP;\n    childP = child.prototype = Object.create(baseP);\n    childP.constructor = child;\n    childP._super = baseP;\n\n    if (properties) {\n      assign(childP, properties);\n    }\n  }\n  /**\n   * simple function bind\n   * @param {Function} fn\n   * @param {Object} context\n   * @returns {Function}\n   */\n\n\n  function bindFn(fn, context) {\n    return function boundFn() {\n      return fn.apply(context, arguments);\n    };\n  }\n  /**\n   * let a boolean value also be a function that must return a boolean\n   * this first item in args will be used as the context\n   * @param {Boolean|Function} val\n   * @param {Array} [args]\n   * @returns {Boolean}\n   */\n\n\n  function boolOrFn(val, args) {\n    if (typeof val == TYPE_FUNCTION) {\n      return val.apply(args ? args[0] || undefined : undefined, args);\n    }\n\n    return val;\n  }\n  /**\n   * use the val2 when val1 is undefined\n   * @param {*} val1\n   * @param {*} val2\n   * @returns {*}\n   */\n\n\n  function ifUndefined(val1, val2) {\n    return val1 === undefined ? val2 : val1;\n  }\n  /**\n   * addEventListener with multiple events at once\n   * @param {EventTarget} target\n   * @param {String} types\n   * @param {Function} handler\n   */\n\n\n  function addEventListeners(target, types, handler) {\n    each(splitStr(types), function (type) {\n      target.addEventListener(type, handler, false);\n    });\n  }\n  /**\n   * removeEventListener with multiple events at once\n   * @param {EventTarget} target\n   * @param {String} types\n   * @param {Function} handler\n   */\n\n\n  function removeEventListeners(target, types, handler) {\n    each(splitStr(types), function (type) {\n      target.removeEventListener(type, handler, false);\n    });\n  }\n  /**\n   * find if a node is in the given parent\n   * @method hasParent\n   * @param {HTMLElement} node\n   * @param {HTMLElement} parent\n   * @return {Boolean} found\n   */\n\n\n  function hasParent(node, parent) {\n    while (node) {\n      if (node == parent) {\n        return true;\n      }\n\n      node = node.parentNode;\n    }\n\n    return false;\n  }\n  /**\n   * small indexOf wrapper\n   * @param {String} str\n   * @param {String} find\n   * @returns {Boolean} found\n   */\n\n\n  function inStr(str, find) {\n    return str.indexOf(find) > -1;\n  }\n  /**\n   * split string on whitespace\n   * @param {String} str\n   * @returns {Array} words\n   */\n\n\n  function splitStr(str) {\n    return str.trim().split(/\\s+/g);\n  }\n  /**\n   * find if a array contains the object using indexOf or a simple polyFill\n   * @param {Array} src\n   * @param {String} find\n   * @param {String} [findByKey]\n   * @return {Boolean|Number} false when not found, or the index\n   */\n\n\n  function inArray(src, find, findByKey) {\n    if (src.indexOf && !findByKey) {\n      return src.indexOf(find);\n    } else {\n      var i = 0;\n\n      while (i < src.length) {\n        if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) {\n          return i;\n        }\n\n        i++;\n      }\n\n      return -1;\n    }\n  }\n  /**\n   * convert array-like objects to real arrays\n   * @param {Object} obj\n   * @returns {Array}\n   */\n\n\n  function toArray(obj) {\n    return Array.prototype.slice.call(obj, 0);\n  }\n  /**\n   * unique array with objects based on a key (like 'id') or just by the array's value\n   * @param {Array} src [{id:1},{id:2},{id:1}]\n   * @param {String} [key]\n   * @param {Boolean} [sort=False]\n   * @returns {Array} [{id:1},{id:2}]\n   */\n\n\n  function uniqueArray(src, key, sort) {\n    var results = [];\n    var values = [];\n    var i = 0;\n\n    while (i < src.length) {\n      var val = key ? src[i][key] : src[i];\n\n      if (inArray(values, val) < 0) {\n        results.push(src[i]);\n      }\n\n      values[i] = val;\n      i++;\n    }\n\n    if (sort) {\n      if (!key) {\n        results = results.sort();\n      } else {\n        results = results.sort(function sortUniqueArray(a, b) {\n          return a[key] > b[key];\n        });\n      }\n    }\n\n    return results;\n  }\n  /**\n   * get the prefixed property\n   * @param {Object} obj\n   * @param {String} property\n   * @returns {String|Undefined} prefixed\n   */\n\n\n  function prefixed(obj, property) {\n    var prefix, prop;\n    var camelProp = property[0].toUpperCase() + property.slice(1);\n    var i = 0;\n\n    while (i < VENDOR_PREFIXES.length) {\n      prefix = VENDOR_PREFIXES[i];\n      prop = prefix ? prefix + camelProp : property;\n\n      if (prop in obj) {\n        return prop;\n      }\n\n      i++;\n    }\n\n    return undefined;\n  }\n  /**\n   * get a unique id\n   * @returns {number} uniqueId\n   */\n\n\n  var _uniqueId = 1;\n\n  function uniqueId() {\n    return _uniqueId++;\n  }\n  /**\n   * get the window object of an element\n   * @param {HTMLElement} element\n   * @returns {DocumentView|Window}\n   */\n\n\n  function getWindowForElement(element) {\n    var doc = element.ownerDocument || element;\n    return doc.defaultView || doc.parentWindow || window;\n  }\n\n  var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n  var SUPPORT_TOUCH = 'ontouchstart' in window;\n  var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\n  var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n  var INPUT_TYPE_TOUCH = 'touch';\n  var INPUT_TYPE_PEN = 'pen';\n  var INPUT_TYPE_MOUSE = 'mouse';\n  var INPUT_TYPE_KINECT = 'kinect';\n  var COMPUTE_INTERVAL = 25;\n  var INPUT_START = 1;\n  var INPUT_MOVE = 2;\n  var INPUT_END = 4;\n  var INPUT_CANCEL = 8;\n  var DIRECTION_NONE = 1;\n  var DIRECTION_LEFT = 2;\n  var DIRECTION_RIGHT = 4;\n  var DIRECTION_UP = 8;\n  var DIRECTION_DOWN = 16;\n  var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n  var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n  var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n  var PROPS_XY = ['x', 'y'];\n  var PROPS_CLIENT_XY = ['clientX', 'clientY'];\n  /**\n   * create new input type manager\n   * @param {Manager} manager\n   * @param {Function} callback\n   * @returns {Input}\n   * @constructor\n   */\n\n  function Input(manager, callback) {\n    var self = this;\n    this.manager = manager;\n    this.callback = callback;\n    this.element = manager.element;\n    this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n    // so when disabled the input events are completely bypassed.\n\n    this.domHandler = function (ev) {\n      if (boolOrFn(manager.options.enable, [manager])) {\n        self.handler(ev);\n      }\n    };\n\n    this.init();\n  }\n\n  Input.prototype = {\n    /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */\n    handler: function () {},\n\n    /**\n     * bind the events\n     */\n    init: function () {\n      this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n      this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n      this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    },\n\n    /**\n     * unbind the events\n     */\n    destroy: function () {\n      this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n      this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n      this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    }\n  };\n  /**\n   * create new input type manager\n   * called by the Manager constructor\n   * @param {Hammer} manager\n   * @returns {Input}\n   */\n\n  function createInputInstance(manager) {\n    var Type;\n    var inputClass = manager.options.inputClass;\n\n    if (inputClass) {\n      Type = inputClass;\n    } else if (SUPPORT_POINTER_EVENTS) {\n      Type = PointerEventInput;\n    } else if (SUPPORT_ONLY_TOUCH) {\n      Type = TouchInput;\n    } else if (!SUPPORT_TOUCH) {\n      Type = MouseInput;\n    } else {\n      Type = TouchMouseInput;\n    }\n\n    return new Type(manager, inputHandler);\n  }\n  /**\n   * handle input events\n   * @param {Manager} manager\n   * @param {String} eventType\n   * @param {Object} input\n   */\n\n\n  function inputHandler(manager, eventType, input) {\n    var pointersLen = input.pointers.length;\n    var changedPointersLen = input.changedPointers.length;\n    var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;\n    var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;\n    input.isFirst = !!isFirst;\n    input.isFinal = !!isFinal;\n\n    if (isFirst) {\n      manager.session = {};\n    } // source event is the normalized value of the domEvents\n    // like 'touchstart, mouseup, pointerdown'\n\n\n    input.eventType = eventType; // compute scale, rotation etc\n\n    computeInputData(manager, input); // emit secret event\n\n    manager.emit('hammer.input', input);\n    manager.recognize(input);\n    manager.session.prevInput = input;\n  }\n  /**\n   * extend the data with some usable properties like scale, rotate, velocity etc\n   * @param {Object} manager\n   * @param {Object} input\n   */\n\n\n  function computeInputData(manager, input) {\n    var session = manager.session;\n    var pointers = input.pointers;\n    var pointersLength = pointers.length; // store the first input to calculate the distance and direction\n\n    if (!session.firstInput) {\n      session.firstInput = simpleCloneInputData(input);\n    } // to compute scale and rotation we need to store the multiple touches\n\n\n    if (pointersLength > 1 && !session.firstMultiple) {\n      session.firstMultiple = simpleCloneInputData(input);\n    } else if (pointersLength === 1) {\n      session.firstMultiple = false;\n    }\n\n    var firstInput = session.firstInput;\n    var firstMultiple = session.firstMultiple;\n    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n    var center = input.center = getCenter(pointers);\n    input.timeStamp = now();\n    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n    input.angle = getAngle(offsetCenter, center);\n    input.distance = getDistance(offsetCenter, center);\n    computeDeltaXY(session, input);\n    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n    input.overallVelocityX = overallVelocity.x;\n    input.overallVelocityY = overallVelocity.y;\n    input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;\n    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n    input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;\n    computeIntervalInputData(session, input); // find the correct target\n\n    var target = manager.element;\n\n    if (hasParent(input.srcEvent.target, target)) {\n      target = input.srcEvent.target;\n    }\n\n    input.target = target;\n  }\n\n  function computeDeltaXY(session, input) {\n    var center = input.center;\n    var offset = session.offsetDelta || {};\n    var prevDelta = session.prevDelta || {};\n    var prevInput = session.prevInput || {};\n\n    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n      prevDelta = session.prevDelta = {\n        x: prevInput.deltaX || 0,\n        y: prevInput.deltaY || 0\n      };\n      offset = session.offsetDelta = {\n        x: center.x,\n        y: center.y\n      };\n    }\n\n    input.deltaX = prevDelta.x + (center.x - offset.x);\n    input.deltaY = prevDelta.y + (center.y - offset.y);\n  }\n  /**\n   * velocity is calculated every x ms\n   * @param {Object} session\n   * @param {Object} input\n   */\n\n\n  function computeIntervalInputData(session, input) {\n    var last = session.lastInterval || input,\n        deltaTime = input.timeStamp - last.timeStamp,\n        velocity,\n        velocityX,\n        velocityY,\n        direction;\n\n    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n      var deltaX = input.deltaX - last.deltaX;\n      var deltaY = input.deltaY - last.deltaY;\n      var v = getVelocity(deltaTime, deltaX, deltaY);\n      velocityX = v.x;\n      velocityY = v.y;\n      velocity = abs(v.x) > abs(v.y) ? v.x : v.y;\n      direction = getDirection(deltaX, deltaY);\n      session.lastInterval = input;\n    } else {\n      // use latest velocity info if it doesn't overtake a minimum period\n      velocity = last.velocity;\n      velocityX = last.velocityX;\n      velocityY = last.velocityY;\n      direction = last.direction;\n    }\n\n    input.velocity = velocity;\n    input.velocityX = velocityX;\n    input.velocityY = velocityY;\n    input.direction = direction;\n  }\n  /**\n   * create a simple clone from the input used for storage of firstInput and firstMultiple\n   * @param {Object} input\n   * @returns {Object} clonedInputData\n   */\n\n\n  function simpleCloneInputData(input) {\n    // make a simple copy of the pointers because we will get a reference if we don't\n    // we only need clientXY for the calculations\n    var pointers = [];\n    var i = 0;\n\n    while (i < input.pointers.length) {\n      pointers[i] = {\n        clientX: round(input.pointers[i].clientX),\n        clientY: round(input.pointers[i].clientY)\n      };\n      i++;\n    }\n\n    return {\n      timeStamp: now(),\n      pointers: pointers,\n      center: getCenter(pointers),\n      deltaX: input.deltaX,\n      deltaY: input.deltaY\n    };\n  }\n  /**\n   * get the center of all the pointers\n   * @param {Array} pointers\n   * @return {Object} center contains `x` and `y` properties\n   */\n\n\n  function getCenter(pointers) {\n    var pointersLength = pointers.length; // no need to loop when only one touch\n\n    if (pointersLength === 1) {\n      return {\n        x: round(pointers[0].clientX),\n        y: round(pointers[0].clientY)\n      };\n    }\n\n    var x = 0,\n        y = 0,\n        i = 0;\n\n    while (i < pointersLength) {\n      x += pointers[i].clientX;\n      y += pointers[i].clientY;\n      i++;\n    }\n\n    return {\n      x: round(x / pointersLength),\n      y: round(y / pointersLength)\n    };\n  }\n  /**\n   * calculate the velocity between two points. unit is in px per ms.\n   * @param {Number} deltaTime\n   * @param {Number} x\n   * @param {Number} y\n   * @return {Object} velocity `x` and `y`\n   */\n\n\n  function getVelocity(deltaTime, x, y) {\n    return {\n      x: x / deltaTime || 0,\n      y: y / deltaTime || 0\n    };\n  }\n  /**\n   * get the direction between two points\n   * @param {Number} x\n   * @param {Number} y\n   * @return {Number} direction\n   */\n\n\n  function getDirection(x, y) {\n    if (x === y) {\n      return DIRECTION_NONE;\n    }\n\n    if (abs(x) >= abs(y)) {\n      return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n\n    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n  }\n  /**\n   * calculate the absolute distance between two points\n   * @param {Object} p1 {x, y}\n   * @param {Object} p2 {x, y}\n   * @param {Array} [props] containing x and y keys\n   * @return {Number} distance\n   */\n\n\n  function getDistance(p1, p2, props) {\n    if (!props) {\n      props = PROPS_XY;\n    }\n\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.sqrt(x * x + y * y);\n  }\n  /**\n   * calculate the angle between two coordinates\n   * @param {Object} p1\n   * @param {Object} p2\n   * @param {Array} [props] containing x and y keys\n   * @return {Number} angle\n   */\n\n\n  function getAngle(p1, p2, props) {\n    if (!props) {\n      props = PROPS_XY;\n    }\n\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.atan2(y, x) * 180 / Math.PI;\n  }\n  /**\n   * calculate the rotation degrees between two pointersets\n   * @param {Array} start array of pointers\n   * @param {Array} end array of pointers\n   * @return {Number} rotation\n   */\n\n\n  function getRotation(start, end) {\n    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n  }\n  /**\n   * calculate the scale factor between two pointersets\n   * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n   * @param {Array} start array of pointers\n   * @param {Array} end array of pointers\n   * @return {Number} scale\n   */\n\n\n  function getScale(start, end) {\n    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n  }\n\n  var MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n  };\n  var MOUSE_ELEMENT_EVENTS = 'mousedown';\n  var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n  /**\n   * Mouse events input\n   * @constructor\n   * @extends Input\n   */\n\n  function MouseInput() {\n    this.evEl = MOUSE_ELEMENT_EVENTS;\n    this.evWin = MOUSE_WINDOW_EVENTS;\n    this.pressed = false; // mousedown state\n\n    Input.apply(this, arguments);\n  }\n\n  inherit(MouseInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function MEhandler(ev) {\n      var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down\n\n      if (eventType & INPUT_START && ev.button === 0) {\n        this.pressed = true;\n      }\n\n      if (eventType & INPUT_MOVE && ev.which !== 1) {\n        eventType = INPUT_END;\n      } // mouse must be down\n\n\n      if (!this.pressed) {\n        return;\n      }\n\n      if (eventType & INPUT_END) {\n        this.pressed = false;\n      }\n\n      this.callback(this.manager, eventType, {\n        pointers: [ev],\n        changedPointers: [ev],\n        pointerType: INPUT_TYPE_MOUSE,\n        srcEvent: ev\n      });\n    }\n  });\n  var POINTER_INPUT_MAP = {\n    pointerdown: INPUT_START,\n    pointermove: INPUT_MOVE,\n    pointerup: INPUT_END,\n    pointercancel: INPUT_CANCEL,\n    pointerout: INPUT_CANCEL\n  }; // in IE10 the pointer types is defined as an enum\n\n  var IE10_POINTER_TYPE_ENUM = {\n    2: INPUT_TYPE_TOUCH,\n    3: INPUT_TYPE_PEN,\n    4: INPUT_TYPE_MOUSE,\n    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n\n  };\n  var POINTER_ELEMENT_EVENTS = 'pointerdown';\n  var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive\n\n  if (window.MSPointerEvent && !window.PointerEvent) {\n    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n  }\n  /**\n   * Pointer events input\n   * @constructor\n   * @extends Input\n   */\n\n\n  function PointerEventInput() {\n    this.evEl = POINTER_ELEMENT_EVENTS;\n    this.evWin = POINTER_WINDOW_EVENTS;\n    Input.apply(this, arguments);\n    this.store = this.manager.session.pointerEvents = [];\n  }\n\n  inherit(PointerEventInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function PEhandler(ev) {\n      var store = this.store;\n      var removePointer = false;\n      var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n      var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n      var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n      var isTouch = pointerType == INPUT_TYPE_TOUCH; // get index of the event in the store\n\n      var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down\n\n      if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n        if (storeIndex < 0) {\n          store.push(ev);\n          storeIndex = store.length - 1;\n        }\n      } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n        removePointer = true;\n      } // it not found, so the pointer hasn't been down (so it's probably a hover)\n\n\n      if (storeIndex < 0) {\n        return;\n      } // update the event in the store\n\n\n      store[storeIndex] = ev;\n      this.callback(this.manager, eventType, {\n        pointers: store,\n        changedPointers: [ev],\n        pointerType: pointerType,\n        srcEvent: ev\n      });\n\n      if (removePointer) {\n        // remove from the store\n        store.splice(storeIndex, 1);\n      }\n    }\n  });\n  var SINGLE_TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n  };\n  var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\n  var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n  /**\n   * Touch events input\n   * @constructor\n   * @extends Input\n   */\n\n  function SingleTouchInput() {\n    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n    this.started = false;\n    Input.apply(this, arguments);\n  }\n\n  inherit(SingleTouchInput, Input, {\n    handler: function TEhandler(ev) {\n      var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; // should we handle the touch events?\n\n      if (type === INPUT_START) {\n        this.started = true;\n      }\n\n      if (!this.started) {\n        return;\n      }\n\n      var touches = normalizeSingleTouches.call(this, ev, type); // when done, reset the started state\n\n      if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n        this.started = false;\n      }\n\n      this.callback(this.manager, type, {\n        pointers: touches[0],\n        changedPointers: touches[1],\n        pointerType: INPUT_TYPE_TOUCH,\n        srcEvent: ev\n      });\n    }\n  });\n  /**\n   * @this {TouchInput}\n   * @param {Object} ev\n   * @param {Number} type flag\n   * @returns {undefined|Array} [all, changed]\n   */\n\n  function normalizeSingleTouches(ev, type) {\n    var all = toArray(ev.touches);\n    var changed = toArray(ev.changedTouches);\n\n    if (type & (INPUT_END | INPUT_CANCEL)) {\n      all = uniqueArray(all.concat(changed), 'identifier', true);\n    }\n\n    return [all, changed];\n  }\n\n  var TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n  };\n  var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n  /**\n   * Multi-user touch events input\n   * @constructor\n   * @extends Input\n   */\n\n  function TouchInput() {\n    this.evTarget = TOUCH_TARGET_EVENTS;\n    this.targetIds = {};\n    Input.apply(this, arguments);\n  }\n\n  inherit(TouchInput, Input, {\n    handler: function MTEhandler(ev) {\n      var type = TOUCH_INPUT_MAP[ev.type];\n      var touches = getTouches.call(this, ev, type);\n\n      if (!touches) {\n        return;\n      }\n\n      this.callback(this.manager, type, {\n        pointers: touches[0],\n        changedPointers: touches[1],\n        pointerType: INPUT_TYPE_TOUCH,\n        srcEvent: ev\n      });\n    }\n  });\n  /**\n   * @this {TouchInput}\n   * @param {Object} ev\n   * @param {Number} type flag\n   * @returns {undefined|Array} [all, changed]\n   */\n\n  function getTouches(ev, type) {\n    var allTouches = toArray(ev.touches);\n    var targetIds = this.targetIds; // when there is only one touch, the process can be simplified\n\n    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n      targetIds[allTouches[0].identifier] = true;\n      return [allTouches, allTouches];\n    }\n\n    var i,\n        targetTouches,\n        changedTouches = toArray(ev.changedTouches),\n        changedTargetTouches = [],\n        target = this.target; // get target touches from touches\n\n    targetTouches = allTouches.filter(function (touch) {\n      return hasParent(touch.target, target);\n    }); // collect touches\n\n    if (type === INPUT_START) {\n      i = 0;\n\n      while (i < targetTouches.length) {\n        targetIds[targetTouches[i].identifier] = true;\n        i++;\n      }\n    } // filter changed touches to only contain touches that exist in the collected target ids\n\n\n    i = 0;\n\n    while (i < changedTouches.length) {\n      if (targetIds[changedTouches[i].identifier]) {\n        changedTargetTouches.push(changedTouches[i]);\n      } // cleanup removed touches\n\n\n      if (type & (INPUT_END | INPUT_CANCEL)) {\n        delete targetIds[changedTouches[i].identifier];\n      }\n\n      i++;\n    }\n\n    if (!changedTargetTouches.length) {\n      return;\n    }\n\n    return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n    uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches];\n  }\n  /**\n   * Combined touch and mouse input\n   *\n   * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n   * This because touch devices also emit mouse events while doing a touch.\n   *\n   * @constructor\n   * @extends Input\n   */\n\n\n  var DEDUP_TIMEOUT = 2500;\n  var DEDUP_DISTANCE = 25;\n\n  function TouchMouseInput() {\n    Input.apply(this, arguments);\n    var handler = bindFn(this.handler, this);\n    this.touch = new TouchInput(this.manager, handler);\n    this.mouse = new MouseInput(this.manager, handler);\n    this.primaryTouch = null;\n    this.lastTouches = [];\n  }\n\n  inherit(TouchMouseInput, Input, {\n    /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */\n    handler: function TMEhandler(manager, inputEvent, inputData) {\n      var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH,\n          isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;\n\n      if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n        return;\n      } // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n\n\n      if (isTouch) {\n        recordTouches.call(this, inputEvent, inputData);\n      } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n        return;\n      }\n\n      this.callback(manager, inputEvent, inputData);\n    },\n\n    /**\n     * remove the event listeners\n     */\n    destroy: function destroy() {\n      this.touch.destroy();\n      this.mouse.destroy();\n    }\n  });\n\n  function recordTouches(eventType, eventData) {\n    if (eventType & INPUT_START) {\n      this.primaryTouch = eventData.changedPointers[0].identifier;\n      setLastTouch.call(this, eventData);\n    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n      setLastTouch.call(this, eventData);\n    }\n  }\n\n  function setLastTouch(eventData) {\n    var touch = eventData.changedPointers[0];\n\n    if (touch.identifier === this.primaryTouch) {\n      var lastTouch = {\n        x: touch.clientX,\n        y: touch.clientY\n      };\n      this.lastTouches.push(lastTouch);\n      var lts = this.lastTouches;\n\n      var removeLastTouch = function () {\n        var i = lts.indexOf(lastTouch);\n\n        if (i > -1) {\n          lts.splice(i, 1);\n        }\n      };\n\n      setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n    }\n  }\n\n  function isSyntheticEvent(eventData) {\n    var x = eventData.srcEvent.clientX,\n        y = eventData.srcEvent.clientY;\n\n    for (var i = 0; i < this.lastTouches.length; i++) {\n      var t = this.lastTouches[i];\n      var dx = Math.abs(x - t.x),\n          dy = Math.abs(y - t.y);\n\n      if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\n  var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; // magical touchAction value\n\n  var TOUCH_ACTION_COMPUTE = 'compute';\n  var TOUCH_ACTION_AUTO = 'auto';\n  var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\n\n  var TOUCH_ACTION_NONE = 'none';\n  var TOUCH_ACTION_PAN_X = 'pan-x';\n  var TOUCH_ACTION_PAN_Y = 'pan-y';\n  var TOUCH_ACTION_MAP = getTouchActionProps();\n  /**\n   * Touch Action\n   * sets the touchAction property or uses the js alternative\n   * @param {Manager} manager\n   * @param {String} value\n   * @constructor\n   */\n\n  function TouchAction(manager, value) {\n    this.manager = manager;\n    this.set(value);\n  }\n\n  TouchAction.prototype = {\n    /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */\n    set: function (value) {\n      // find out the touch-action by the event handlers\n      if (value == TOUCH_ACTION_COMPUTE) {\n        value = this.compute();\n      }\n\n      if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n        this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n      }\n\n      this.actions = value.toLowerCase().trim();\n    },\n\n    /**\n     * just re-set the touchAction value\n     */\n    update: function () {\n      this.set(this.manager.options.touchAction);\n    },\n\n    /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */\n    compute: function () {\n      var actions = [];\n      each(this.manager.recognizers, function (recognizer) {\n        if (boolOrFn(recognizer.options.enable, [recognizer])) {\n          actions = actions.concat(recognizer.getTouchAction());\n        }\n      });\n      return cleanTouchActions(actions.join(' '));\n    },\n\n    /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */\n    preventDefaults: function (input) {\n      var srcEvent = input.srcEvent;\n      var direction = input.offsetDirection; // if the touch action did prevented once this session\n\n      if (this.manager.session.prevented) {\n        srcEvent.preventDefault();\n        return;\n      }\n\n      var actions = this.actions;\n      var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n      var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n      var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n      if (hasNone) {\n        //do not prevent defaults if this is a tap gesture\n        var isTapPointer = input.pointers.length === 1;\n        var isTapMovement = input.distance < 2;\n        var isTapTouchTime = input.deltaTime < 250;\n\n        if (isTapPointer && isTapMovement && isTapTouchTime) {\n          return;\n        }\n      }\n\n      if (hasPanX && hasPanY) {\n        // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n        return;\n      }\n\n      if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) {\n        return this.preventSrc(srcEvent);\n      }\n    },\n\n    /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */\n    preventSrc: function (srcEvent) {\n      this.manager.session.prevented = true;\n      srcEvent.preventDefault();\n    }\n  };\n  /**\n   * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n   * @param {String} actions\n   * @returns {*}\n   */\n\n  function cleanTouchActions(actions) {\n    // none\n    if (inStr(actions, TOUCH_ACTION_NONE)) {\n      return TOUCH_ACTION_NONE;\n    }\n\n    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers\n    // for different directions, e.g. horizontal pan but vertical swipe?)\n    // we need none (as otherwise with pan-x pan-y combined none of these\n    // recognizers will work, since the browser would handle all panning\n\n    if (hasPanX && hasPanY) {\n      return TOUCH_ACTION_NONE;\n    } // pan-x OR pan-y\n\n\n    if (hasPanX || hasPanY) {\n      return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n    } // manipulation\n\n\n    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n      return TOUCH_ACTION_MANIPULATION;\n    }\n\n    return TOUCH_ACTION_AUTO;\n  }\n\n  function getTouchActionProps() {\n    if (!NATIVE_TOUCH_ACTION) {\n      return false;\n    }\n\n    var touchMap = {};\n    var cssSupports = window.CSS && window.CSS.supports;\n    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) {\n      // If css.supports is not supported but there is native touch-action assume it supports\n      // all values. This is the case for IE 10 and 11.\n      touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n    });\n    return touchMap;\n  }\n  /**\n   * Recognizer flow explained; *\n   * All recognizers have the initial state of POSSIBLE when a input session starts.\n   * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n   * Example session for mouse-input: mousedown -> mousemove -> mouseup\n   *\n   * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n   * which determines with state it should be.\n   *\n   * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n   * POSSIBLE to give it another change on the next cycle.\n   *\n   *               Possible\n   *                  |\n   *            +-----+---------------+\n   *            |                     |\n   *      +-----+-----+               |\n   *      |           |               |\n   *   Failed      Cancelled          |\n   *                          +-------+------+\n   *                          |              |\n   *                      Recognized       Began\n   *                                         |\n   *                                      Changed\n   *                                         |\n   *                                  Ended/Recognized\n   */\n\n\n  var STATE_POSSIBLE = 1;\n  var STATE_BEGAN = 2;\n  var STATE_CHANGED = 4;\n  var STATE_ENDED = 8;\n  var STATE_RECOGNIZED = STATE_ENDED;\n  var STATE_CANCELLED = 16;\n  var STATE_FAILED = 32;\n  /**\n   * Recognizer\n   * Every recognizer needs to extend from this class.\n   * @constructor\n   * @param {Object} options\n   */\n\n  function Recognizer(options) {\n    this.options = assign({}, this.defaults, options || {});\n    this.id = uniqueId();\n    this.manager = null; // default is enable true\n\n    this.options.enable = ifUndefined(this.options.enable, true);\n    this.state = STATE_POSSIBLE;\n    this.simultaneous = {};\n    this.requireFail = [];\n  }\n\n  Recognizer.prototype = {\n    /**\n     * @virtual\n     * @type {Object}\n     */\n    defaults: {},\n\n    /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */\n    set: function (options) {\n      assign(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state\n\n      this.manager && this.manager.touchAction.update();\n      return this;\n    },\n\n    /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    recognizeWith: function (otherRecognizer) {\n      if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n        return this;\n      }\n\n      var simultaneous = this.simultaneous;\n      otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n      if (!simultaneous[otherRecognizer.id]) {\n        simultaneous[otherRecognizer.id] = otherRecognizer;\n        otherRecognizer.recognizeWith(this);\n      }\n\n      return this;\n    },\n\n    /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRecognizeWith: function (otherRecognizer) {\n      if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n        return this;\n      }\n\n      otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n      delete this.simultaneous[otherRecognizer.id];\n      return this;\n    },\n\n    /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    requireFailure: function (otherRecognizer) {\n      if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n        return this;\n      }\n\n      var requireFail = this.requireFail;\n      otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\n      if (inArray(requireFail, otherRecognizer) === -1) {\n        requireFail.push(otherRecognizer);\n        otherRecognizer.requireFailure(this);\n      }\n\n      return this;\n    },\n\n    /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRequireFailure: function (otherRecognizer) {\n      if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n        return this;\n      }\n\n      otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n      var index = inArray(this.requireFail, otherRecognizer);\n\n      if (index > -1) {\n        this.requireFail.splice(index, 1);\n      }\n\n      return this;\n    },\n\n    /**\n     * has require failures boolean\n     * @returns {boolean}\n     */\n    hasRequireFailures: function () {\n      return this.requireFail.length > 0;\n    },\n\n    /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */\n    canRecognizeWith: function (otherRecognizer) {\n      return !!this.simultaneous[otherRecognizer.id];\n    },\n\n    /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */\n    emit: function (input) {\n      var self = this;\n      var state = this.state;\n\n      function emit(event) {\n        self.manager.emit(event, input);\n      } // 'panstart' and 'panmove'\n\n\n      if (state < STATE_ENDED) {\n        emit(self.options.event + stateStr(state));\n      }\n\n      emit(self.options.event); // simple 'eventName' events\n\n      if (input.additionalEvent) {\n        // additional event(panleft, panright, pinchin, pinchout...)\n        emit(input.additionalEvent);\n      } // panend and pancancel\n\n\n      if (state >= STATE_ENDED) {\n        emit(self.options.event + stateStr(state));\n      }\n    },\n\n    /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */\n    tryEmit: function (input) {\n      if (this.canEmit()) {\n        return this.emit(input);\n      } // it's failing anyway\n\n\n      this.state = STATE_FAILED;\n    },\n\n    /**\n     * can we emit?\n     * @returns {boolean}\n     */\n    canEmit: function () {\n      var i = 0;\n\n      while (i < this.requireFail.length) {\n        if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n          return false;\n        }\n\n        i++;\n      }\n\n      return true;\n    },\n\n    /**\n     * update the recognizer\n     * @param {Object} inputData\n     */\n    recognize: function (inputData) {\n      // make a new copy of the inputData\n      // so we can change the inputData without messing up the other recognizers\n      var inputDataClone = assign({}, inputData); // is is enabled and allow recognizing?\n\n      if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n        this.reset();\n        this.state = STATE_FAILED;\n        return;\n      } // reset when we've reached the end\n\n\n      if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n        this.state = STATE_POSSIBLE;\n      }\n\n      this.state = this.process(inputDataClone); // the recognizer has recognized a gesture\n      // so trigger an event\n\n      if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n        this.tryEmit(inputDataClone);\n      }\n    },\n\n    /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */\n    process: function (inputData) {},\n    // jshint ignore:line\n\n    /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */\n    getTouchAction: function () {},\n\n    /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */\n    reset: function () {}\n  };\n  /**\n   * get a usable string, used as event postfix\n   * @param {Const} state\n   * @returns {String} state\n   */\n\n  function stateStr(state) {\n    if (state & STATE_CANCELLED) {\n      return 'cancel';\n    } else if (state & STATE_ENDED) {\n      return 'end';\n    } else if (state & STATE_CHANGED) {\n      return 'move';\n    } else if (state & STATE_BEGAN) {\n      return 'start';\n    }\n\n    return '';\n  }\n  /**\n   * direction cons to string\n   * @param {Const} direction\n   * @returns {String}\n   */\n\n\n  function directionStr(direction) {\n    if (direction == DIRECTION_DOWN) {\n      return 'down';\n    } else if (direction == DIRECTION_UP) {\n      return 'up';\n    } else if (direction == DIRECTION_LEFT) {\n      return 'left';\n    } else if (direction == DIRECTION_RIGHT) {\n      return 'right';\n    }\n\n    return '';\n  }\n  /**\n   * get a recognizer by name if it is bound to a manager\n   * @param {Recognizer|String} otherRecognizer\n   * @param {Recognizer} recognizer\n   * @returns {Recognizer}\n   */\n\n\n  function getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n    var manager = recognizer.manager;\n\n    if (manager) {\n      return manager.get(otherRecognizer);\n    }\n\n    return otherRecognizer;\n  }\n  /**\n   * This recognizer is just used as a base for the simple attribute recognizers.\n   * @constructor\n   * @extends Recognizer\n   */\n\n\n  function AttrRecognizer() {\n    Recognizer.apply(this, arguments);\n  }\n\n  inherit(AttrRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */\n    defaults: {\n      /**\n       * @type {Number}\n       * @default 1\n       */\n      pointers: 1\n    },\n\n    /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */\n    attrTest: function (input) {\n      var optionPointers = this.options.pointers;\n      return optionPointers === 0 || input.pointers.length === optionPointers;\n    },\n\n    /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */\n    process: function (input) {\n      var state = this.state;\n      var eventType = input.eventType;\n      var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n      var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED\n\n      if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n        return state | STATE_CANCELLED;\n      } else if (isRecognized || isValid) {\n        if (eventType & INPUT_END) {\n          return state | STATE_ENDED;\n        } else if (!(state & STATE_BEGAN)) {\n          return STATE_BEGAN;\n        }\n\n        return state | STATE_CHANGED;\n      }\n\n      return STATE_FAILED;\n    }\n  });\n  /**\n   * Pan\n   * Recognized when the pointer is down and moved in the allowed direction.\n   * @constructor\n   * @extends AttrRecognizer\n   */\n\n  function PanRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n    this.pX = null;\n    this.pY = null;\n  }\n\n  inherit(PanRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PanRecognizer\n     */\n    defaults: {\n      event: 'pan',\n      threshold: 10,\n      pointers: 1,\n      direction: DIRECTION_ALL\n    },\n    getTouchAction: function () {\n      var direction = this.options.direction;\n      var actions = [];\n\n      if (direction & DIRECTION_HORIZONTAL) {\n        actions.push(TOUCH_ACTION_PAN_Y);\n      }\n\n      if (direction & DIRECTION_VERTICAL) {\n        actions.push(TOUCH_ACTION_PAN_X);\n      }\n\n      return actions;\n    },\n    directionTest: function (input) {\n      var options = this.options;\n      var hasMoved = true;\n      var distance = input.distance;\n      var direction = input.direction;\n      var x = input.deltaX;\n      var y = input.deltaY; // lock to axis?\n\n      if (!(direction & options.direction)) {\n        if (options.direction & DIRECTION_HORIZONTAL) {\n          direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n          hasMoved = x != this.pX;\n          distance = Math.abs(input.deltaX);\n        } else {\n          direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n          hasMoved = y != this.pY;\n          distance = Math.abs(input.deltaY);\n        }\n      }\n\n      input.direction = direction;\n      return hasMoved && distance > options.threshold && direction & options.direction;\n    },\n    attrTest: function (input) {\n      return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));\n    },\n    emit: function (input) {\n      this.pX = input.deltaX;\n      this.pY = input.deltaY;\n      var direction = directionStr(input.direction);\n\n      if (direction) {\n        input.additionalEvent = this.options.event + direction;\n      }\n\n      this._super.emit.call(this, input);\n    }\n  });\n  /**\n   * Pinch\n   * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n   * @constructor\n   * @extends AttrRecognizer\n   */\n\n  function PinchRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n  }\n\n  inherit(PinchRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n      event: 'pinch',\n      threshold: 0,\n      pointers: 2\n    },\n    getTouchAction: function () {\n      return [TOUCH_ACTION_NONE];\n    },\n    attrTest: function (input) {\n      return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n    },\n    emit: function (input) {\n      if (input.scale !== 1) {\n        var inOut = input.scale < 1 ? 'in' : 'out';\n        input.additionalEvent = this.options.event + inOut;\n      }\n\n      this._super.emit.call(this, input);\n    }\n  });\n  /**\n   * Press\n   * Recognized when the pointer is down for x ms without any movement.\n   * @constructor\n   * @extends Recognizer\n   */\n\n  function PressRecognizer() {\n    Recognizer.apply(this, arguments);\n    this._timer = null;\n    this._input = null;\n  }\n\n  inherit(PressRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PressRecognizer\n     */\n    defaults: {\n      event: 'press',\n      pointers: 1,\n      time: 251,\n      // minimal time of the pointer to be pressed\n      threshold: 9 // a minimal movement is ok, but keep it low\n\n    },\n    getTouchAction: function () {\n      return [TOUCH_ACTION_AUTO];\n    },\n    process: function (input) {\n      var options = this.options;\n      var validPointers = input.pointers.length === options.pointers;\n      var validMovement = input.distance < options.threshold;\n      var validTime = input.deltaTime > options.time;\n      this._input = input; // we only allow little movement\n      // and we've reached an end event, so a tap is possible\n\n      if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) {\n        this.reset();\n      } else if (input.eventType & INPUT_START) {\n        this.reset();\n        this._timer = setTimeoutContext(function () {\n          this.state = STATE_RECOGNIZED;\n          this.tryEmit();\n        }, options.time, this);\n      } else if (input.eventType & INPUT_END) {\n        return STATE_RECOGNIZED;\n      }\n\n      return STATE_FAILED;\n    },\n    reset: function () {\n      clearTimeout(this._timer);\n    },\n    emit: function (input) {\n      if (this.state !== STATE_RECOGNIZED) {\n        return;\n      }\n\n      if (input && input.eventType & INPUT_END) {\n        this.manager.emit(this.options.event + 'up', input);\n      } else {\n        this._input.timeStamp = now();\n        this.manager.emit(this.options.event, this._input);\n      }\n    }\n  });\n  /**\n   * Rotate\n   * Recognized when two or more pointer are moving in a circular motion.\n   * @constructor\n   * @extends AttrRecognizer\n   */\n\n  function RotateRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n  }\n\n  inherit(RotateRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */\n    defaults: {\n      event: 'rotate',\n      threshold: 0,\n      pointers: 2\n    },\n    getTouchAction: function () {\n      return [TOUCH_ACTION_NONE];\n    },\n    attrTest: function (input) {\n      return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n    }\n  });\n  /**\n   * Swipe\n   * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n   * @constructor\n   * @extends AttrRecognizer\n   */\n\n  function SwipeRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n  }\n\n  inherit(SwipeRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */\n    defaults: {\n      event: 'swipe',\n      threshold: 10,\n      velocity: 0.3,\n      direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n      pointers: 1\n    },\n    getTouchAction: function () {\n      return PanRecognizer.prototype.getTouchAction.call(this);\n    },\n    attrTest: function (input) {\n      var direction = this.options.direction;\n      var velocity;\n\n      if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n        velocity = input.overallVelocity;\n      } else if (direction & DIRECTION_HORIZONTAL) {\n        velocity = input.overallVelocityX;\n      } else if (direction & DIRECTION_VERTICAL) {\n        velocity = input.overallVelocityY;\n      }\n\n      return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n    },\n    emit: function (input) {\n      var direction = directionStr(input.offsetDirection);\n\n      if (direction) {\n        this.manager.emit(this.options.event + direction, input);\n      }\n\n      this.manager.emit(this.options.event, input);\n    }\n  });\n  /**\n   * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n   * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n   * a single tap.\n   *\n   * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n   * multi-taps being recognized.\n   * @constructor\n   * @extends Recognizer\n   */\n\n  function TapRecognizer() {\n    Recognizer.apply(this, arguments); // previous time and center,\n    // used for tap counting\n\n    this.pTime = false;\n    this.pCenter = false;\n    this._timer = null;\n    this._input = null;\n    this.count = 0;\n  }\n\n  inherit(TapRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n      event: 'tap',\n      pointers: 1,\n      taps: 1,\n      interval: 300,\n      // max time between the multi-tap taps\n      time: 250,\n      // max time of the pointer to be down (like finger on the screen)\n      threshold: 9,\n      // a minimal movement is ok, but keep it low\n      posThreshold: 10 // a multi-tap can be a bit off the initial position\n\n    },\n    getTouchAction: function () {\n      return [TOUCH_ACTION_MANIPULATION];\n    },\n    process: function (input) {\n      var options = this.options;\n      var validPointers = input.pointers.length === options.pointers;\n      var validMovement = input.distance < options.threshold;\n      var validTouchTime = input.deltaTime < options.time;\n      this.reset();\n\n      if (input.eventType & INPUT_START && this.count === 0) {\n        return this.failTimeout();\n      } // we only allow little movement\n      // and we've reached an end event, so a tap is possible\n\n\n      if (validMovement && validTouchTime && validPointers) {\n        if (input.eventType != INPUT_END) {\n          return this.failTimeout();\n        }\n\n        var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;\n        var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n        this.pTime = input.timeStamp;\n        this.pCenter = input.center;\n\n        if (!validMultiTap || !validInterval) {\n          this.count = 1;\n        } else {\n          this.count += 1;\n        }\n\n        this._input = input; // if tap count matches we have recognized it,\n        // else it has began recognizing...\n\n        var tapCount = this.count % options.taps;\n\n        if (tapCount === 0) {\n          // no failing requirements, immediately trigger the tap event\n          // or wait as long as the multitap interval to trigger\n          if (!this.hasRequireFailures()) {\n            return STATE_RECOGNIZED;\n          } else {\n            this._timer = setTimeoutContext(function () {\n              this.state = STATE_RECOGNIZED;\n              this.tryEmit();\n            }, options.interval, this);\n            return STATE_BEGAN;\n          }\n        }\n      }\n\n      return STATE_FAILED;\n    },\n    failTimeout: function () {\n      this._timer = setTimeoutContext(function () {\n        this.state = STATE_FAILED;\n      }, this.options.interval, this);\n      return STATE_FAILED;\n    },\n    reset: function () {\n      clearTimeout(this._timer);\n    },\n    emit: function () {\n      if (this.state == STATE_RECOGNIZED) {\n        this._input.tapCount = this.count;\n        this.manager.emit(this.options.event, this._input);\n      }\n    }\n  });\n  /**\n   * Simple way to create a manager with a default set of recognizers.\n   * @param {HTMLElement} element\n   * @param {Object} [options]\n   * @constructor\n   */\n\n  function Hammer(element, options) {\n    options = options || {};\n    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n    return new Manager(element, options);\n  }\n  /**\n   * @const {string}\n   */\n\n\n  Hammer.VERSION = '2.0.7';\n  /**\n   * default settings\n   * @namespace\n   */\n\n  Hammer.defaults = {\n    /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */\n    domEvents: false,\n\n    /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */\n    touchAction: TOUCH_ACTION_COMPUTE,\n\n    /**\n     * @type {Boolean}\n     * @default true\n     */\n    enable: true,\n\n    /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */\n    inputTarget: null,\n\n    /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */\n    inputClass: null,\n\n    /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */\n    preset: [// RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n    [RotateRecognizer, {\n      enable: false\n    }], [PinchRecognizer, {\n      enable: false\n    }, ['rotate']], [SwipeRecognizer, {\n      direction: DIRECTION_HORIZONTAL\n    }], [PanRecognizer, {\n      direction: DIRECTION_HORIZONTAL\n    }, ['swipe']], [TapRecognizer], [TapRecognizer, {\n      event: 'doubletap',\n      taps: 2\n    }, ['tap']], [PressRecognizer]],\n\n    /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */\n    cssProps: {\n      /**\n       * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n       * @type {String}\n       * @default 'none'\n       */\n      userSelect: 'none',\n\n      /**\n       * Disable the Windows Phone grippers when pressing an element.\n       * @type {String}\n       * @default 'none'\n       */\n      touchSelect: 'none',\n\n      /**\n       * Disables the default callout shown when you touch and hold a touch target.\n       * On iOS, when you touch and hold a touch target such as a link, Safari displays\n       * a callout containing information about the link. This property allows you to disable that callout.\n       * @type {String}\n       * @default 'none'\n       */\n      touchCallout: 'none',\n\n      /**\n       * Specifies whether zooming is enabled. Used by IE10>\n       * @type {String}\n       * @default 'none'\n       */\n      contentZooming: 'none',\n\n      /**\n       * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n       * @type {String}\n       * @default 'none'\n       */\n      userDrag: 'none',\n\n      /**\n       * Overrides the highlight color shown when the user taps a link or a JavaScript\n       * clickable element in iOS. This property obeys the alpha value, if specified.\n       * @type {String}\n       * @default 'rgba(0,0,0,0)'\n       */\n      tapHighlightColor: 'rgba(0,0,0,0)'\n    }\n  };\n  var STOP = 1;\n  var FORCED_STOP = 2;\n  /**\n   * Manager\n   * @param {HTMLElement} element\n   * @param {Object} [options]\n   * @constructor\n   */\n\n  function Manager(element, options) {\n    this.options = assign({}, Hammer.defaults, options || {});\n    this.options.inputTarget = this.options.inputTarget || element;\n    this.handlers = {};\n    this.session = {};\n    this.recognizers = [];\n    this.oldCssProps = {};\n    this.element = element;\n    this.input = createInputInstance(this);\n    this.touchAction = new TouchAction(this, this.options.touchAction);\n    toggleCssProps(this, true);\n    each(this.options.recognizers, function (item) {\n      var recognizer = this.add(new item[0](item[1]));\n      item[2] && recognizer.recognizeWith(item[2]);\n      item[3] && recognizer.requireFailure(item[3]);\n    }, this);\n  }\n\n  Manager.prototype = {\n    /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */\n    set: function (options) {\n      assign(this.options, options); // Options that need a little more setup\n\n      if (options.touchAction) {\n        this.touchAction.update();\n      }\n\n      if (options.inputTarget) {\n        // Clean up existing event listeners and reinitialize\n        this.input.destroy();\n        this.input.target = options.inputTarget;\n        this.input.init();\n      }\n\n      return this;\n    },\n\n    /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */\n    stop: function (force) {\n      this.session.stopped = force ? FORCED_STOP : STOP;\n    },\n\n    /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */\n    recognize: function (inputData) {\n      var session = this.session;\n\n      if (session.stopped) {\n        return;\n      } // run the touch-action polyfill\n\n\n      this.touchAction.preventDefaults(inputData);\n      var recognizer;\n      var recognizers = this.recognizers; // this holds the recognizer that is being recognized.\n      // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n      // if no recognizer is detecting a thing, it is set to `null`\n\n      var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized\n      // or when we're in a new session\n\n      if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) {\n        curRecognizer = session.curRecognizer = null;\n      }\n\n      var i = 0;\n\n      while (i < recognizers.length) {\n        recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one.\n        // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n        // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n        //      that is being recognized.\n        // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n        //      this can be setup with the `recognizeWith()` method on the recognizer.\n\n        if (session.stopped !== FORCED_STOP && ( // 1\n        !curRecognizer || recognizer == curRecognizer || // 2\n        recognizer.canRecognizeWith(curRecognizer))) {\n          // 3\n          recognizer.recognize(inputData);\n        } else {\n          recognizer.reset();\n        } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n        // current active recognizer. but only if we don't already have an active recognizer\n\n\n        if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n          curRecognizer = session.curRecognizer = recognizer;\n        }\n\n        i++;\n      }\n    },\n\n    /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */\n    get: function (recognizer) {\n      if (recognizer instanceof Recognizer) {\n        return recognizer;\n      }\n\n      var recognizers = this.recognizers;\n\n      for (var i = 0; i < recognizers.length; i++) {\n        if (recognizers[i].options.event == recognizer) {\n          return recognizers[i];\n        }\n      }\n\n      return null;\n    },\n\n    /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */\n    add: function (recognizer) {\n      if (invokeArrayArg(recognizer, 'add', this)) {\n        return this;\n      } // remove existing\n\n\n      var existing = this.get(recognizer.options.event);\n\n      if (existing) {\n        this.remove(existing);\n      }\n\n      this.recognizers.push(recognizer);\n      recognizer.manager = this;\n      this.touchAction.update();\n      return recognizer;\n    },\n\n    /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */\n    remove: function (recognizer) {\n      if (invokeArrayArg(recognizer, 'remove', this)) {\n        return this;\n      }\n\n      recognizer = this.get(recognizer); // let's make sure this recognizer exists\n\n      if (recognizer) {\n        var recognizers = this.recognizers;\n        var index = inArray(recognizers, recognizer);\n\n        if (index !== -1) {\n          recognizers.splice(index, 1);\n          this.touchAction.update();\n        }\n      }\n\n      return this;\n    },\n\n    /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */\n    on: function (events, handler) {\n      if (events === undefined) {\n        return;\n      }\n\n      if (handler === undefined) {\n        return;\n      }\n\n      var handlers = this.handlers;\n      each(splitStr(events), function (event) {\n        handlers[event] = handlers[event] || [];\n        handlers[event].push(handler);\n      });\n      return this;\n    },\n\n    /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */\n    off: function (events, handler) {\n      if (events === undefined) {\n        return;\n      }\n\n      var handlers = this.handlers;\n      each(splitStr(events), function (event) {\n        if (!handler) {\n          delete handlers[event];\n        } else {\n          handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n        }\n      });\n      return this;\n    },\n\n    /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */\n    emit: function (event, data) {\n      // we also want to trigger dom events\n      if (this.options.domEvents) {\n        triggerDomEvent(event, data);\n      } // no handlers, so skip it all\n\n\n      var handlers = this.handlers[event] && this.handlers[event].slice();\n\n      if (!handlers || !handlers.length) {\n        return;\n      }\n\n      data.type = event;\n\n      data.preventDefault = function () {\n        data.srcEvent.preventDefault();\n      };\n\n      var i = 0;\n\n      while (i < handlers.length) {\n        handlers[i](data);\n        i++;\n      }\n    },\n\n    /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */\n    destroy: function () {\n      this.element && toggleCssProps(this, false);\n      this.handlers = {};\n      this.session = {};\n      this.input.destroy();\n      this.element = null;\n    }\n  };\n  /**\n   * add/remove the css properties as defined in manager.options.cssProps\n   * @param {Manager} manager\n   * @param {Boolean} add\n   */\n\n  function toggleCssProps(manager, add) {\n    var element = manager.element;\n\n    if (!element.style) {\n      return;\n    }\n\n    var prop;\n    each(manager.options.cssProps, function (value, name) {\n      prop = prefixed(element.style, name);\n\n      if (add) {\n        manager.oldCssProps[prop] = element.style[prop];\n        element.style[prop] = value;\n      } else {\n        element.style[prop] = manager.oldCssProps[prop] || '';\n      }\n    });\n\n    if (!add) {\n      manager.oldCssProps = {};\n    }\n  }\n  /**\n   * trigger dom event\n   * @param {String} event\n   * @param {Object} data\n   */\n\n\n  function triggerDomEvent(event, data) {\n    var gestureEvent = document.createEvent('Event');\n    gestureEvent.initEvent(event, true, true);\n    gestureEvent.gesture = data;\n    data.target.dispatchEvent(gestureEvent);\n  }\n\n  assign(Hammer, {\n    INPUT_START: INPUT_START,\n    INPUT_MOVE: INPUT_MOVE,\n    INPUT_END: INPUT_END,\n    INPUT_CANCEL: INPUT_CANCEL,\n    STATE_POSSIBLE: STATE_POSSIBLE,\n    STATE_BEGAN: STATE_BEGAN,\n    STATE_CHANGED: STATE_CHANGED,\n    STATE_ENDED: STATE_ENDED,\n    STATE_RECOGNIZED: STATE_RECOGNIZED,\n    STATE_CANCELLED: STATE_CANCELLED,\n    STATE_FAILED: STATE_FAILED,\n    DIRECTION_NONE: DIRECTION_NONE,\n    DIRECTION_LEFT: DIRECTION_LEFT,\n    DIRECTION_RIGHT: DIRECTION_RIGHT,\n    DIRECTION_UP: DIRECTION_UP,\n    DIRECTION_DOWN: DIRECTION_DOWN,\n    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n    DIRECTION_ALL: DIRECTION_ALL,\n    Manager: Manager,\n    Input: Input,\n    TouchAction: TouchAction,\n    TouchInput: TouchInput,\n    MouseInput: MouseInput,\n    PointerEventInput: PointerEventInput,\n    TouchMouseInput: TouchMouseInput,\n    SingleTouchInput: SingleTouchInput,\n    Recognizer: Recognizer,\n    AttrRecognizer: AttrRecognizer,\n    Tap: TapRecognizer,\n    Pan: PanRecognizer,\n    Swipe: SwipeRecognizer,\n    Pinch: PinchRecognizer,\n    Rotate: RotateRecognizer,\n    Press: PressRecognizer,\n    on: addEventListeners,\n    off: removeEventListeners,\n    each: each,\n    merge: merge,\n    extend: extend,\n    assign: assign,\n    inherit: inherit,\n    bindFn: bindFn,\n    prefixed: prefixed\n  }); // this prevents errors when Hammer is loaded in the presence of an AMD\n  //  style loader but by script tag, not by the loader.\n\n  var freeGlobal = typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}; // jshint ignore:line\n\n  freeGlobal.Hammer = Hammer;\n\n  if (typeof define === 'function' && define.amd) {\n    define(function () {\n      return Hammer;\n    });\n  } else if (typeof module != 'undefined' && module.exports) {\n    module.exports = Hammer;\n  } else {\n    window[exportName] = Hammer;\n  }\n})(window, document, 'Hammer');\n},{}],\"Dvka\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.enhancePointerEventInput = enhancePointerEventInput;\nexports.enhanceMouseInput = enhanceMouseInput;\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar MOUSE_INPUT_MAP = {\n  mousedown: INPUT_START,\n  mousemove: INPUT_MOVE,\n  mouseup: INPUT_END\n};\n\nfunction some(array, predict) {\n  for (var i = 0; i < array.length; i++) {\n    if (predict(array[i])) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction enhancePointerEventInput(PointerEventInput) {\n  var oldHandler = PointerEventInput.prototype.handler;\n\n  PointerEventInput.prototype.handler = function handler(ev) {\n    var store = this.store;\n\n    if (ev.button > 0) {\n      if (!some(store, function (e) {\n        return e.pointerId === ev.pointerId;\n      })) {\n        store.push(ev);\n      }\n    }\n\n    oldHandler.call(this, ev);\n  };\n}\n\nfunction enhanceMouseInput(MouseInput) {\n  MouseInput.prototype.handler = function handler(ev) {\n    var eventType = MOUSE_INPUT_MAP[ev.type];\n\n    if (eventType & INPUT_START && ev.button >= 0) {\n      this.pressed = true;\n    }\n\n    if (eventType & INPUT_MOVE && ev.which === 0) {\n      eventType = INPUT_END;\n    }\n\n    if (!this.pressed) {\n      return;\n    }\n\n    if (eventType & INPUT_END) {\n      this.pressed = false;\n    }\n\n    this.callback(this.manager, eventType, {\n      pointers: [ev],\n      changedPointers: [ev],\n      pointerType: 'mouse',\n      srcEvent: ev\n    });\n  };\n}\n},{}],\"Pow2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.Manager = void 0;\n\nvar _hammerjs = _interopRequireDefault(require(\"hammerjs\"));\n\nvar _hammerOverrides = require(\"./hammer-overrides\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _hammerOverrides.enhancePointerEventInput)(_hammerjs.default.PointerEventInput);\n(0, _hammerOverrides.enhanceMouseInput)(_hammerjs.default.MouseInput);\nvar Manager = _hammerjs.default.Manager;\nexports.Manager = Manager;\nvar _default = _hammerjs.default;\nexports.default = _default;\n},{\"hammerjs\":\"vhjd\",\"./hammer-overrides\":\"Dvka\"}],\"lgZl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.GESTURE_EVENT_ALIASES = exports.EVENT_RECOGNIZER_MAP = exports.INPUT_EVENT_TYPES = exports.BASIC_EVENT_ALIASES = exports.RECOGNIZER_FALLBACK_MAP = exports.RECOGNIZER_COMPATIBLE_MAP = exports.RECOGNIZERS = void 0;\n\nvar _hammer = _interopRequireDefault(require(\"./utils/hammer\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar RECOGNIZERS = _hammer.default ? [[_hammer.default.Rotate, {\n  enable: false\n}], [_hammer.default.Pinch, {\n  enable: false\n}], [_hammer.default.Swipe, {\n  enable: false\n}], [_hammer.default.Pan, {\n  threshold: 0,\n  enable: false\n}], [_hammer.default.Press, {\n  enable: false\n}], [_hammer.default.Tap, {\n  event: 'doubletap',\n  taps: 2,\n  enable: false\n}], [_hammer.default.Tap, {\n  event: 'anytap',\n  enable: false\n}], [_hammer.default.Tap, {\n  enable: false\n}]] : null;\nexports.RECOGNIZERS = RECOGNIZERS;\nvar RECOGNIZER_COMPATIBLE_MAP = {\n  rotate: ['pinch'],\n  pan: ['press', 'doubletap', 'anytap', 'tap'],\n  doubletap: ['anytap'],\n  anytap: ['tap']\n};\nexports.RECOGNIZER_COMPATIBLE_MAP = RECOGNIZER_COMPATIBLE_MAP;\nvar RECOGNIZER_FALLBACK_MAP = {\n  doubletap: ['tap']\n};\nexports.RECOGNIZER_FALLBACK_MAP = RECOGNIZER_FALLBACK_MAP;\nvar BASIC_EVENT_ALIASES = {\n  pointerdown: 'pointerdown',\n  pointermove: 'pointermove',\n  pointerup: 'pointerup',\n  touchstart: 'pointerdown',\n  touchmove: 'pointermove',\n  touchend: 'pointerup',\n  mousedown: 'pointerdown',\n  mousemove: 'pointermove',\n  mouseup: 'pointerup'\n};\nexports.BASIC_EVENT_ALIASES = BASIC_EVENT_ALIASES;\nvar INPUT_EVENT_TYPES = {\n  KEY_EVENTS: ['keydown', 'keyup'],\n  MOUSE_EVENTS: ['mousedown', 'mousemove', 'mouseup', 'mouseover', 'mouseout', 'mouseleave'],\n  WHEEL_EVENTS: ['wheel', 'mousewheel', 'DOMMouseScroll']\n};\nexports.INPUT_EVENT_TYPES = INPUT_EVENT_TYPES;\nvar EVENT_RECOGNIZER_MAP = {\n  tap: 'tap',\n  anytap: 'anytap',\n  doubletap: 'doubletap',\n  press: 'press',\n  pinch: 'pinch',\n  pinchin: 'pinch',\n  pinchout: 'pinch',\n  pinchstart: 'pinch',\n  pinchmove: 'pinch',\n  pinchend: 'pinch',\n  pinchcancel: 'pinch',\n  rotate: 'rotate',\n  rotatestart: 'rotate',\n  rotatemove: 'rotate',\n  rotateend: 'rotate',\n  rotatecancel: 'rotate',\n  pan: 'pan',\n  panstart: 'pan',\n  panmove: 'pan',\n  panup: 'pan',\n  pandown: 'pan',\n  panleft: 'pan',\n  panright: 'pan',\n  panend: 'pan',\n  pancancel: 'pan',\n  swipe: 'swipe',\n  swipeleft: 'swipe',\n  swiperight: 'swipe',\n  swipeup: 'swipe',\n  swipedown: 'swipe'\n};\nexports.EVENT_RECOGNIZER_MAP = EVENT_RECOGNIZER_MAP;\nvar GESTURE_EVENT_ALIASES = {\n  click: 'tap',\n  anyclick: 'anytap',\n  dblclick: 'doubletap',\n  mousedown: 'pointerdown',\n  mousemove: 'pointermove',\n  mouseup: 'pointerup',\n  mouseover: 'pointerover',\n  mouseout: 'pointerout',\n  mouseleave: 'pointerleave'\n};\nexports.GESTURE_EVENT_ALIASES = GESTURE_EVENT_ALIASES;\n},{\"./utils/hammer\":\"Pow2\"}],\"Ycw6\":[function(require,module,exports) {\nvar global = arguments[3];\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.passiveSupported = exports.document = exports.global = exports.window = exports.userAgent = void 0;\nvar userAgent = typeof navigator !== 'undefined' && navigator.userAgent ? navigator.userAgent.toLowerCase() : '';\nexports.userAgent = userAgent;\nvar window_ = typeof window !== 'undefined' ? window : global;\nexports.window = window_;\nvar global_ = typeof global !== 'undefined' ? global : window;\nexports.global = global_;\nvar document_ = typeof document !== 'undefined' ? document : {};\nexports.document = document_;\nvar passiveSupported = false;\nexports.passiveSupported = passiveSupported;\n\ntry {\n  var options = {\n    get passive() {\n      exports.passiveSupported = passiveSupported = true;\n      return true;\n    }\n\n  };\n  window_.addEventListener('test', options, options);\n  window_.removeEventListener('test', options, options);\n} catch (err) {}\n},{}],\"xRAA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _constants = require(\"../constants\");\n\nvar _globals = require(\"../utils/globals\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar firefox = _globals.userAgent.indexOf('firefox') !== -1;\nvar WHEEL_EVENTS = _constants.INPUT_EVENT_TYPES.WHEEL_EVENTS;\nvar EVENT_TYPE = 'wheel';\nvar WHEEL_DELTA_MAGIC_SCALER = 4.000244140625;\nvar WHEEL_DELTA_PER_LINE = 40;\nvar SHIFT_MULTIPLIER = 0.25;\n\nvar WheelInput = function () {\n  function WheelInput(element, callback) {\n    var _this = this;\n\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    (0, _classCallCheck2.default)(this, WheelInput);\n    this.element = element;\n    this.callback = callback;\n    this.options = Object.assign({\n      enable: true\n    }, options);\n    this.events = WHEEL_EVENTS.concat(options.events || []);\n    this.handleEvent = this.handleEvent.bind(this);\n    this.events.forEach(function (event) {\n      return element.addEventListener(event, _this.handleEvent, _globals.passiveSupported ? {\n        passive: false\n      } : false);\n    });\n  }\n\n  (0, _createClass2.default)(WheelInput, [{\n    key: \"destroy\",\n    value: function destroy() {\n      var _this2 = this;\n\n      this.events.forEach(function (event) {\n        return _this2.element.removeEventListener(event, _this2.handleEvent);\n      });\n    }\n  }, {\n    key: \"enableEventType\",\n    value: function enableEventType(eventType, enabled) {\n      if (eventType === EVENT_TYPE) {\n        this.options.enable = enabled;\n      }\n    }\n  }, {\n    key: \"handleEvent\",\n    value: function handleEvent(event) {\n      if (!this.options.enable) {\n        return;\n      }\n\n      var value = event.deltaY;\n\n      if (_globals.window.WheelEvent) {\n        if (firefox && event.deltaMode === _globals.window.WheelEvent.DOM_DELTA_PIXEL) {\n          value /= _globals.window.devicePixelRatio;\n        }\n\n        if (event.deltaMode === _globals.window.WheelEvent.DOM_DELTA_LINE) {\n          value *= WHEEL_DELTA_PER_LINE;\n        }\n      }\n\n      var wheelPosition = {\n        x: event.clientX,\n        y: event.clientY\n      };\n\n      if (value !== 0 && value % WHEEL_DELTA_MAGIC_SCALER === 0) {\n        value = Math.floor(value / WHEEL_DELTA_MAGIC_SCALER);\n      }\n\n      if (event.shiftKey && value) {\n        value = value * SHIFT_MULTIPLIER;\n      }\n\n      this._onWheel(event, -value, wheelPosition);\n    }\n  }, {\n    key: \"_onWheel\",\n    value: function _onWheel(srcEvent, delta, position) {\n      this.callback({\n        type: EVENT_TYPE,\n        center: position,\n        delta: delta,\n        srcEvent: srcEvent,\n        pointerType: 'mouse',\n        target: srcEvent.target\n      });\n    }\n  }]);\n  return WheelInput;\n}();\n\nexports.default = WheelInput;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../constants\":\"lgZl\",\"../utils/globals\":\"Ycw6\"}],\"uAV0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MOUSE_EVENTS = _constants.INPUT_EVENT_TYPES.MOUSE_EVENTS;\nvar MOVE_EVENT_TYPE = 'pointermove';\nvar OVER_EVENT_TYPE = 'pointerover';\nvar OUT_EVENT_TYPE = 'pointerout';\nvar LEAVE_EVENT_TYPE = 'pointerleave';\n\nvar MoveInput = function () {\n  function MoveInput(element, callback) {\n    var _this = this;\n\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    (0, _classCallCheck2.default)(this, MoveInput);\n    this.element = element;\n    this.callback = callback;\n    this.pressed = false;\n    this.options = Object.assign({\n      enable: true\n    }, options);\n    this.enableMoveEvent = this.options.enable;\n    this.enableLeaveEvent = this.options.enable;\n    this.enableOutEvent = this.options.enable;\n    this.enableOverEvent = this.options.enable;\n    this.events = MOUSE_EVENTS.concat(options.events || []);\n    this.handleEvent = this.handleEvent.bind(this);\n    this.events.forEach(function (event) {\n      return element.addEventListener(event, _this.handleEvent);\n    });\n  }\n\n  (0, _createClass2.default)(MoveInput, [{\n    key: \"destroy\",\n    value: function destroy() {\n      var _this2 = this;\n\n      this.events.forEach(function (event) {\n        return _this2.element.removeEventListener(event, _this2.handleEvent);\n      });\n    }\n  }, {\n    key: \"enableEventType\",\n    value: function enableEventType(eventType, enabled) {\n      if (eventType === MOVE_EVENT_TYPE) {\n        this.enableMoveEvent = enabled;\n      }\n\n      if (eventType === OVER_EVENT_TYPE) {\n        this.enableOverEvent = enabled;\n      }\n\n      if (eventType === OUT_EVENT_TYPE) {\n        this.enableOutEvent = enabled;\n      }\n\n      if (eventType === LEAVE_EVENT_TYPE) {\n        this.enableLeaveEvent = enabled;\n      }\n    }\n  }, {\n    key: \"handleEvent\",\n    value: function handleEvent(event) {\n      this.handleOverEvent(event);\n      this.handleOutEvent(event);\n      this.handleLeaveEvent(event);\n      this.handleMoveEvent(event);\n    }\n  }, {\n    key: \"handleOverEvent\",\n    value: function handleOverEvent(event) {\n      if (this.enableOverEvent) {\n        if (event.type === 'mouseover') {\n          this.callback({\n            type: OVER_EVENT_TYPE,\n            srcEvent: event,\n            pointerType: 'mouse',\n            target: event.target\n          });\n        }\n      }\n    }\n  }, {\n    key: \"handleOutEvent\",\n    value: function handleOutEvent(event) {\n      if (this.enableOutEvent) {\n        if (event.type === 'mouseout') {\n          this.callback({\n            type: OUT_EVENT_TYPE,\n            srcEvent: event,\n            pointerType: 'mouse',\n            target: event.target\n          });\n        }\n      }\n    }\n  }, {\n    key: \"handleLeaveEvent\",\n    value: function handleLeaveEvent(event) {\n      if (this.enableLeaveEvent) {\n        if (event.type === 'mouseleave') {\n          this.callback({\n            type: LEAVE_EVENT_TYPE,\n            srcEvent: event,\n            pointerType: 'mouse',\n            target: event.target\n          });\n        }\n      }\n    }\n  }, {\n    key: \"handleMoveEvent\",\n    value: function handleMoveEvent(event) {\n      if (this.enableMoveEvent) {\n        switch (event.type) {\n          case 'mousedown':\n            if (event.button >= 0) {\n              this.pressed = true;\n            }\n\n            break;\n\n          case 'mousemove':\n            if (event.which === 0) {\n              this.pressed = false;\n            }\n\n            if (!this.pressed) {\n              this.callback({\n                type: MOVE_EVENT_TYPE,\n                srcEvent: event,\n                pointerType: 'mouse',\n                target: event.target\n              });\n            }\n\n            break;\n\n          case 'mouseup':\n            this.pressed = false;\n            break;\n\n          default:\n        }\n      }\n    }\n  }]);\n  return MoveInput;\n}();\n\nexports.default = MoveInput;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../constants\":\"lgZl\"}],\"t3rk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar KEY_EVENTS = _constants.INPUT_EVENT_TYPES.KEY_EVENTS;\nvar DOWN_EVENT_TYPE = 'keydown';\nvar UP_EVENT_TYPE = 'keyup';\n\nvar KeyInput = function () {\n  function KeyInput(element, callback) {\n    var _this = this;\n\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    (0, _classCallCheck2.default)(this, KeyInput);\n    this.element = element;\n    this.callback = callback;\n    this.options = Object.assign({\n      enable: true\n    }, options);\n    this.enableDownEvent = this.options.enable;\n    this.enableUpEvent = this.options.enable;\n    this.events = KEY_EVENTS.concat(options.events || []);\n    this.handleEvent = this.handleEvent.bind(this);\n    element.tabIndex = 1;\n    element.style.outline = 'none';\n    this.events.forEach(function (event) {\n      return element.addEventListener(event, _this.handleEvent);\n    });\n  }\n\n  (0, _createClass2.default)(KeyInput, [{\n    key: \"destroy\",\n    value: function destroy() {\n      var _this2 = this;\n\n      this.events.forEach(function (event) {\n        return _this2.element.removeEventListener(event, _this2.handleEvent);\n      });\n    }\n  }, {\n    key: \"enableEventType\",\n    value: function enableEventType(eventType, enabled) {\n      if (eventType === DOWN_EVENT_TYPE) {\n        this.enableDownEvent = enabled;\n      }\n\n      if (eventType === UP_EVENT_TYPE) {\n        this.enableUpEvent = enabled;\n      }\n    }\n  }, {\n    key: \"handleEvent\",\n    value: function handleEvent(event) {\n      var targetElement = event.target || event.srcElement;\n\n      if (targetElement.tagName === 'INPUT' && targetElement.type === 'text' || targetElement.tagName === 'TEXTAREA') {\n        return;\n      }\n\n      if (this.enableDownEvent && event.type === 'keydown') {\n        this.callback({\n          type: DOWN_EVENT_TYPE,\n          srcEvent: event,\n          key: event.key,\n          target: event.target\n        });\n      }\n\n      if (this.enableUpEvent && event.type === 'keyup') {\n        this.callback({\n          type: UP_EVENT_TYPE,\n          srcEvent: event,\n          key: event.key,\n          target: event.target\n        });\n      }\n    }\n  }]);\n  return KeyInput;\n}();\n\nexports.default = KeyInput;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"../constants\":\"lgZl\"}],\"F88w\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar EVENT_TYPE = 'contextmenu';\n\nvar ContextmenuInput = function () {\n  function ContextmenuInput(element, callback) {\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    (0, _classCallCheck2.default)(this, ContextmenuInput);\n    this.element = element;\n    this.callback = callback;\n    this.options = Object.assign({\n      enable: true\n    }, options);\n    this.handleEvent = this.handleEvent.bind(this);\n    element.addEventListener('contextmenu', this.handleEvent);\n  }\n\n  (0, _createClass2.default)(ContextmenuInput, [{\n    key: \"destroy\",\n    value: function destroy() {\n      this.element.removeEventListener('contextmenu', this.handleEvent);\n    }\n  }, {\n    key: \"enableEventType\",\n    value: function enableEventType(eventType, enabled) {\n      if (eventType === EVENT_TYPE) {\n        this.options.enable = enabled;\n      }\n    }\n  }, {\n    key: \"handleEvent\",\n    value: function handleEvent(event) {\n      if (!this.options.enable) {\n        return;\n      }\n\n      this.callback({\n        type: EVENT_TYPE,\n        center: {\n          x: event.clientX,\n          y: event.clientY\n        },\n        srcEvent: event,\n        pointerType: 'mouse',\n        target: event.target\n      });\n    }\n  }]);\n  return ContextmenuInput;\n}();\n\nexports.default = ContextmenuInput;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\"}],\"cw2o\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.whichButtons = whichButtons;\nexports.getOffsetPosition = getOffsetPosition;\nvar DOWN_EVENT = 1;\nvar MOVE_EVENT = 2;\nvar UP_EVENT = 4;\nvar MOUSE_EVENTS = {\n  pointerdown: DOWN_EVENT,\n  pointermove: MOVE_EVENT,\n  pointerup: UP_EVENT,\n  mousedown: DOWN_EVENT,\n  mousemove: MOVE_EVENT,\n  mouseup: UP_EVENT\n};\nvar MOUSE_EVENT_WHICH_LEFT = 1;\nvar MOUSE_EVENT_WHICH_MIDDLE = 2;\nvar MOUSE_EVENT_WHICH_RIGHT = 3;\nvar MOUSE_EVENT_BUTTON_LEFT = 0;\nvar MOUSE_EVENT_BUTTON_MIDDLE = 1;\nvar MOUSE_EVENT_BUTTON_RIGHT = 2;\nvar MOUSE_EVENT_BUTTONS_LEFT_MASK = 1;\nvar MOUSE_EVENT_BUTTONS_RIGHT_MASK = 2;\nvar MOUSE_EVENT_BUTTONS_MIDDLE_MASK = 4;\n\nfunction whichButtons(event) {\n  var eventType = MOUSE_EVENTS[event.srcEvent.type];\n\n  if (!eventType) {\n    return null;\n  }\n\n  var _event$srcEvent = event.srcEvent,\n      buttons = _event$srcEvent.buttons,\n      button = _event$srcEvent.button,\n      which = _event$srcEvent.which;\n  var leftButton = false;\n  var middleButton = false;\n  var rightButton = false;\n\n  if (eventType === UP_EVENT || eventType === MOVE_EVENT && !Number.isFinite(buttons)) {\n    leftButton = which === MOUSE_EVENT_WHICH_LEFT;\n    middleButton = which === MOUSE_EVENT_WHICH_MIDDLE;\n    rightButton = which === MOUSE_EVENT_WHICH_RIGHT;\n  } else if (eventType === MOVE_EVENT) {\n    leftButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_LEFT_MASK);\n    middleButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_MIDDLE_MASK);\n    rightButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_RIGHT_MASK);\n  } else if (eventType === DOWN_EVENT) {\n    leftButton = button === MOUSE_EVENT_BUTTON_LEFT;\n    middleButton = button === MOUSE_EVENT_BUTTON_MIDDLE;\n    rightButton = button === MOUSE_EVENT_BUTTON_RIGHT;\n  }\n\n  return {\n    leftButton: leftButton,\n    middleButton: middleButton,\n    rightButton: rightButton\n  };\n}\n\nfunction getOffsetPosition(event, rootElement) {\n  var srcEvent = event.srcEvent;\n\n  if (!event.center && !Number.isFinite(srcEvent.clientX)) {\n    return null;\n  }\n\n  var center = event.center || {\n    x: srcEvent.clientX,\n    y: srcEvent.clientY\n  };\n  var rect = rootElement.getBoundingClientRect();\n  var scaleX = rect.width / rootElement.offsetWidth;\n  var scaleY = rect.height / rootElement.offsetHeight;\n  var offsetCenter = {\n    x: (center.x - rect.left - rootElement.clientLeft) / scaleX,\n    y: (center.y - rect.top - rootElement.clientTop) / scaleY\n  };\n  return {\n    center: center,\n    offsetCenter: offsetCenter\n  };\n}\n},{}],\"daW9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _eventUtils = require(\"./event-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar EventRegistrar = function () {\n  function EventRegistrar(eventManager) {\n    (0, _classCallCheck2.default)(this, EventRegistrar);\n    this.eventManager = eventManager;\n    this.handlers = [];\n    this.handlersByElement = new Map();\n    this.handleEvent = this.handleEvent.bind(this);\n  }\n\n  (0, _createClass2.default)(EventRegistrar, [{\n    key: \"isEmpty\",\n    value: function isEmpty() {\n      return this.handlers.length === 0;\n    }\n  }, {\n    key: \"add\",\n    value: function add(type, handler) {\n      var srcElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'root';\n      var once = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n      var handlers = this.handlers,\n          handlersByElement = this.handlersByElement;\n\n      if (!handlersByElement.has(srcElement)) {\n        handlersByElement.set(srcElement, []);\n      }\n\n      var entry = {\n        type: type,\n        handler: handler,\n        srcElement: srcElement,\n        once: once\n      };\n      handlers.push(entry);\n      handlersByElement.get(srcElement).push(entry);\n    }\n  }, {\n    key: \"remove\",\n    value: function remove(type, handler) {\n      var handlers = this.handlers,\n          handlersByElement = this.handlersByElement;\n\n      for (var i = handlers.length - 1; i >= 0; i--) {\n        var entry = handlers[i];\n\n        if (entry.type === type && entry.handler === handler) {\n          handlers.splice(i, 1);\n          var entries = handlersByElement.get(entry.srcElement);\n          entries.splice(entries.indexOf(entry), 1);\n\n          if (entries.length === 0) {\n            handlersByElement[\"delete\"](entry.srcElement);\n          }\n        }\n      }\n    }\n  }, {\n    key: \"handleEvent\",\n    value: function handleEvent(event) {\n      if (this.isEmpty()) {\n        return;\n      }\n\n      var mjolnirEvent = this._normalizeEvent(event);\n\n      var target = event.srcEvent.target;\n\n      while (target && target !== mjolnirEvent.rootElement) {\n        this._emit(mjolnirEvent, target);\n\n        if (mjolnirEvent.handled) {\n          return;\n        }\n\n        target = target.parentNode;\n      }\n\n      this._emit(mjolnirEvent, 'root');\n    }\n  }, {\n    key: \"_emit\",\n    value: function _emit(event, srcElement) {\n      var entries = this.handlersByElement.get(srcElement);\n\n      if (entries) {\n        var immediatePropagationStopped = false;\n\n        var stopPropagation = function stopPropagation() {\n          event.handled = true;\n        };\n\n        var stopImmediatePropagation = function stopImmediatePropagation() {\n          event.handled = true;\n          immediatePropagationStopped = true;\n        };\n\n        var entriesToRemove = [];\n\n        for (var i = 0; i < entries.length; i++) {\n          var _entries$i = entries[i],\n              type = _entries$i.type,\n              handler = _entries$i.handler,\n              once = _entries$i.once;\n          handler(Object.assign({}, event, {\n            type: type,\n            stopPropagation: stopPropagation,\n            stopImmediatePropagation: stopImmediatePropagation\n          }));\n\n          if (once) {\n            entriesToRemove.push(entries[i]);\n          }\n\n          if (immediatePropagationStopped) {\n            break;\n          }\n        }\n\n        for (var _i = 0; _i < entriesToRemove.length; _i++) {\n          var _entriesToRemove$_i = entriesToRemove[_i],\n              type = _entriesToRemove$_i.type,\n              handler = _entriesToRemove$_i.handler;\n          this.remove(type, handler);\n        }\n      }\n    }\n  }, {\n    key: \"_normalizeEvent\",\n    value: function _normalizeEvent(event) {\n      var rootElement = this.eventManager.element;\n      return Object.assign({}, event, (0, _eventUtils.whichButtons)(event), (0, _eventUtils.getOffsetPosition)(event, rootElement), {\n        handled: false,\n        rootElement: rootElement\n      });\n    }\n  }]);\n  return EventRegistrar;\n}();\n\nexports.default = EventRegistrar;\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./event-utils\":\"cw2o\"}],\"vLSQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _slicedToArray2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/slicedToArray\"));\n\nvar _classCallCheck2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/classCallCheck\"));\n\nvar _createClass2 = _interopRequireDefault(require(\"@babel/runtime/helpers/esm/createClass\"));\n\nvar _hammer = require(\"./utils/hammer\");\n\nvar _wheelInput = _interopRequireDefault(require(\"./inputs/wheel-input\"));\n\nvar _moveInput = _interopRequireDefault(require(\"./inputs/move-input\"));\n\nvar _keyInput = _interopRequireDefault(require(\"./inputs/key-input\"));\n\nvar _contextmenuInput = _interopRequireDefault(require(\"./inputs/contextmenu-input\"));\n\nvar _eventRegistrar = _interopRequireDefault(require(\"./utils/event-registrar\"));\n\nvar _constants = require(\"./constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DEFAULT_OPTIONS = {\n  events: null,\n  recognizers: null,\n  recognizerOptions: {},\n  Manager: _hammer.Manager,\n  touchAction: 'none'\n};\n\nvar EventManager = function () {\n  function EventManager() {\n    var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _classCallCheck2.default)(this, EventManager);\n    this.options = Object.assign({}, DEFAULT_OPTIONS, options);\n    this.events = new Map();\n    this._onBasicInput = this._onBasicInput.bind(this);\n    this._onOtherEvent = this._onOtherEvent.bind(this);\n    this.setElement(element);\n    var events = options.events;\n\n    if (events) {\n      this.on(events);\n    }\n  }\n\n  (0, _createClass2.default)(EventManager, [{\n    key: \"setElement\",\n    value: function setElement(element) {\n      var _this = this;\n\n      if (this.element) {\n        this.destroy();\n      }\n\n      this.element = element;\n\n      if (!element) {\n        return;\n      }\n\n      var options = this.options;\n      var ManagerClass = options.Manager;\n      this.manager = new ManagerClass(element, {\n        touchAction: options.touchAction,\n        recognizers: options.recognizers || _constants.RECOGNIZERS\n      }).on('hammer.input', this._onBasicInput);\n\n      if (!options.recognizers) {\n        Object.keys(_constants.RECOGNIZER_COMPATIBLE_MAP).forEach(function (name) {\n          var recognizer = _this.manager.get(name);\n\n          if (recognizer) {\n            _constants.RECOGNIZER_COMPATIBLE_MAP[name].forEach(function (otherName) {\n              recognizer.recognizeWith(otherName);\n            });\n          }\n        });\n      }\n\n      for (var recognizerName in options.recognizerOptions) {\n        var recognizer = this.manager.get(recognizerName);\n\n        if (recognizer) {\n          var recognizerOption = options.recognizerOptions[recognizerName];\n          delete recognizerOption.enable;\n          recognizer.set(recognizerOption);\n        }\n      }\n\n      this.wheelInput = new _wheelInput.default(element, this._onOtherEvent, {\n        enable: false\n      });\n      this.moveInput = new _moveInput.default(element, this._onOtherEvent, {\n        enable: false\n      });\n      this.keyInput = new _keyInput.default(element, this._onOtherEvent, {\n        enable: false\n      });\n      this.contextmenuInput = new _contextmenuInput.default(element, this._onOtherEvent, {\n        enable: false\n      });\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = this.events[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var _step$value = (0, _slicedToArray2.default)(_step.value, 2),\n              eventAlias = _step$value[0],\n              eventRegistrar = _step$value[1];\n\n          if (!eventRegistrar.isEmpty()) {\n            this._toggleRecognizer(eventRegistrar.recognizerName, true);\n\n            this.manager.on(eventAlias, eventRegistrar.handleEvent);\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) {\n            _iterator[\"return\"]();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"destroy\",\n    value: function destroy() {\n      if (this.element) {\n        this.wheelInput.destroy();\n        this.moveInput.destroy();\n        this.keyInput.destroy();\n        this.contextmenuInput.destroy();\n        this.manager.destroy();\n        this.wheelInput = null;\n        this.moveInput = null;\n        this.keyInput = null;\n        this.contextmenuInput = null;\n        this.manager = null;\n        this.element = null;\n      }\n    }\n  }, {\n    key: \"on\",\n    value: function on(event, handler, srcElement) {\n      this._addEventHandler(event, handler, srcElement, false);\n    }\n  }, {\n    key: \"once\",\n    value: function once(event, handler, srcElement) {\n      this._addEventHandler(event, handler, srcElement, true);\n    }\n  }, {\n    key: \"off\",\n    value: function off(event, handler) {\n      this._removeEventHandler(event, handler);\n    }\n  }, {\n    key: \"_toggleRecognizer\",\n    value: function _toggleRecognizer(name, enabled) {\n      var manager = this.manager;\n\n      if (!manager) {\n        return;\n      }\n\n      var recognizer = manager.get(name);\n\n      if (recognizer && recognizer.options.enable !== enabled) {\n        recognizer.set({\n          enable: enabled\n        });\n        var fallbackRecognizers = _constants.RECOGNIZER_FALLBACK_MAP[name];\n\n        if (fallbackRecognizers && !this.options.recognizers) {\n          fallbackRecognizers.forEach(function (otherName) {\n            var otherRecognizer = manager.get(otherName);\n\n            if (enabled) {\n              otherRecognizer.requireFailure(name);\n              recognizer.dropRequireFailure(otherName);\n            } else {\n              otherRecognizer.dropRequireFailure(name);\n            }\n          });\n        }\n      }\n\n      this.wheelInput.enableEventType(name, enabled);\n      this.moveInput.enableEventType(name, enabled);\n      this.keyInput.enableEventType(name, enabled);\n      this.contextmenuInput.enableEventType(name, enabled);\n    }\n  }, {\n    key: \"_addEventHandler\",\n    value: function _addEventHandler(event, handler, srcElement, once) {\n      if (typeof event !== 'string') {\n        srcElement = handler;\n\n        for (var eventName in event) {\n          this._addEventHandler(eventName, event[eventName], srcElement, once);\n        }\n\n        return;\n      }\n\n      var manager = this.manager,\n          events = this.events;\n      var eventAlias = _constants.GESTURE_EVENT_ALIASES[event] || event;\n      var eventRegistrar = events.get(eventAlias);\n\n      if (!eventRegistrar) {\n        eventRegistrar = new _eventRegistrar.default(this);\n        events.set(eventAlias, eventRegistrar);\n        eventRegistrar.recognizerName = _constants.EVENT_RECOGNIZER_MAP[eventAlias] || eventAlias;\n\n        if (manager) {\n          manager.on(eventAlias, eventRegistrar.handleEvent);\n        }\n      }\n\n      this._toggleRecognizer(eventRegistrar.recognizerName, true);\n\n      eventRegistrar.add(event, handler, srcElement, once);\n    }\n  }, {\n    key: \"_removeEventHandler\",\n    value: function _removeEventHandler(event, handler) {\n      if (typeof event !== 'string') {\n        for (var eventName in event) {\n          this._removeEventHandler(eventName, event[eventName]);\n        }\n\n        return;\n      }\n\n      var events = this.events;\n      var eventAlias = _constants.GESTURE_EVENT_ALIASES[event] || event;\n      var eventRegistrar = events.get(eventAlias);\n\n      if (!eventRegistrar) {\n        return;\n      }\n\n      eventRegistrar.remove(event, handler);\n\n      if (eventRegistrar.isEmpty()) {\n        var recognizerName = eventRegistrar.recognizerName;\n        var isRecognizerUsed = false;\n        var _iteratorNormalCompletion2 = true;\n        var _didIteratorError2 = false;\n        var _iteratorError2 = undefined;\n\n        try {\n          for (var _iterator2 = events.values()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n            var eh = _step2.value;\n\n            if (eh.recognizerName === recognizerName && !eh.isEmpty()) {\n              isRecognizerUsed = true;\n              break;\n            }\n          }\n        } catch (err) {\n          _didIteratorError2 = true;\n          _iteratorError2 = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) {\n              _iterator2[\"return\"]();\n            }\n          } finally {\n            if (_didIteratorError2) {\n              throw _iteratorError2;\n            }\n          }\n        }\n\n        if (!isRecognizerUsed) {\n          this._toggleRecognizer(recognizerName, false);\n        }\n      }\n    }\n  }, {\n    key: \"_onBasicInput\",\n    value: function _onBasicInput(event) {\n      var srcEvent = event.srcEvent;\n      var alias = _constants.BASIC_EVENT_ALIASES[srcEvent.type];\n\n      if (alias) {\n        this.manager.emit(alias, event);\n      }\n    }\n  }, {\n    key: \"_onOtherEvent\",\n    value: function _onOtherEvent(event) {\n      this.manager.emit(event.type, event);\n    }\n  }]);\n  return EventManager;\n}();\n\nexports.default = EventManager;\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"T12H\",\"@babel/runtime/helpers/esm/classCallCheck\":\"VEjx\",\"@babel/runtime/helpers/esm/createClass\":\"l5p4\",\"./utils/hammer\":\"Pow2\",\"./inputs/wheel-input\":\"xRAA\",\"./inputs/move-input\":\"uAV0\",\"./inputs/key-input\":\"t3rk\",\"./inputs/contextmenu-input\":\"F88w\",\"./utils/event-registrar\":\"daW9\",\"./constants\":\"lgZl\"}],\"WUuw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"EventManager\", {\n  enumerable: true,\n  get: function () {\n    return _eventManager.default;\n  }\n});\n\nvar _eventManager = _interopRequireDefault(require(\"./event-manager\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./event-manager\":\"vLSQ\"}],\"KCP5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _layerManager = _interopRequireDefault(require(\"./layer-manager\"));\n\nvar _viewManager = _interopRequireDefault(require(\"./view-manager\"));\n\nvar _mapView = _interopRequireDefault(require(\"../views/map-view\"));\n\nvar _effectManager = _interopRequireDefault(require(\"../experimental/lib/effect-manager\"));\n\nvar _effect = _interopRequireDefault(require(\"../experimental/lib/effect\"));\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _probe = require(\"probe.gl\");\n\nvar _mjolnir = require(\"mjolnir.js\");\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _constants2 = require(\"./constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n/* global document */\nfunction noop() {}\n\nvar getCursor = function getCursor(_ref) {\n  var isDragging = _ref.isDragging;\n  return isDragging ? 'grabbing' : 'grab';\n};\n\nfunction getPropTypes(PropTypes) {\n  // Note: Arrays (layers, views, ) can contain falsy values\n  return {\n    id: PropTypes.string,\n    width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n    height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n    // layer/view/controller settings\n    layers: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\n    layerFilter: PropTypes.func,\n    views: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),\n    viewState: PropTypes.object,\n    effects: PropTypes.arrayOf(PropTypes.instanceOf(_effect.default)),\n    controller: PropTypes.oneOfType([PropTypes.func, PropTypes.bool, PropTypes.object]),\n    // GL settings\n    gl: PropTypes.object,\n    glOptions: PropTypes.object,\n    parameters: PropTypes.object,\n    pickingRadius: PropTypes.number,\n    useDevicePixels: PropTypes.bool,\n    // Callbacks\n    onWebGLInitialized: PropTypes.func,\n    onResize: PropTypes.func,\n    onViewStateChange: PropTypes.func,\n    onBeforeRender: PropTypes.func,\n    onAfterRender: PropTypes.func,\n    onLayerClick: PropTypes.func,\n    onLayerHover: PropTypes.func,\n    onLoad: PropTypes.func,\n    // Debug settings\n    debug: PropTypes.bool,\n    drawPickingColors: PropTypes.bool,\n    // Experimental props\n    // Forces a redraw every animation frame\n    _animate: PropTypes.bool\n  };\n}\n\nvar defaultProps = {\n  id: 'deckgl-overlay',\n  width: '100%',\n  height: '100%',\n  pickingRadius: 0,\n  layerFilter: null,\n  glOptions: {},\n  gl: null,\n  layers: [],\n  effects: [],\n  views: null,\n  controller: null,\n  // Rely on external controller, e.g. react-map-gl\n  useDevicePixels: true,\n  _animate: false,\n  onWebGLInitialized: noop,\n  onResize: noop,\n  onViewStateChange: noop,\n  onBeforeRender: noop,\n  onAfterRender: noop,\n  onLayerClick: null,\n  onLayerHover: null,\n  onLoad: noop,\n  _onMetrics: null,\n  getCursor: getCursor,\n  debug: false,\n  drawPickingColors: false\n};\n\nvar Deck =\n/*#__PURE__*/\nfunction () {\n  function Deck(props) {\n    _classCallCheck(this, Deck);\n\n    props = Object.assign({}, defaultProps, props);\n    this.width = 0; // \"read-only\", auto-updated from canvas\n\n    this.height = 0; // \"read-only\", auto-updated from canvas\n    // Maps view descriptors to vieports, rebuilds when width/height/viewState/views change\n\n    this.viewManager = null;\n    this.layerManager = null;\n    this.effectManager = null;\n    this.stats = new _probe.Stats({\n      id: 'deck.gl'\n    });\n    this._needsRedraw = true;\n    this.viewState = props.initialViewState || null; // Internal view state if no callback is supplied\n\n    this.interactiveState = {\n      isDragging: false // Whether the cursor is down\n\n    }; // Bind methods\n\n    this._onEvent = this._onEvent.bind(this);\n    this._onClick = this._onClick.bind(this);\n    this._onPointerMove = this._onPointerMove.bind(this);\n    this._onPointerLeave = this._onPointerLeave.bind(this);\n    this._pickAndCallback = this._pickAndCallback.bind(this);\n    this._onRendererInitialized = this._onRendererInitialized.bind(this);\n    this._onRenderFrame = this._onRenderFrame.bind(this);\n    this._onViewStateChange = this._onViewStateChange.bind(this);\n    this._onInteractiveStateChange = this._onInteractiveStateChange.bind(this);\n\n    if (!props.gl) {\n      // Note: LayerManager creation deferred until gl context available\n      if (typeof document !== 'undefined') {\n        this.canvas = this._createCanvas(props);\n      }\n    }\n\n    this.animationLoop = this._createAnimationLoop(props);\n    this.setProps(props);\n    this.animationLoop.start();\n  }\n\n  _createClass(Deck, [{\n    key: \"finalize\",\n    value: function finalize() {\n      this.animationLoop.stop();\n      this.animationLoop = null;\n\n      if (this.layerManager) {\n        this.layerManager.finalize();\n        this.layerManager = null;\n      }\n\n      if (this.viewManager) {\n        this.viewManager.finalize();\n        this.viewManager = null;\n      }\n\n      if (this.eventManager) {\n        this.eventManager.destroy();\n      }\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(props) {\n      this.stats.timeStart('deck.setProps');\n      props = Object.assign({}, this.props, props);\n      this.props = props; // Update CSS size of canvas\n\n      this._setCanvasSize(props); // We need to overwrite CSS style width and height with actual, numeric values\n\n\n      var newProps = Object.assign({}, props, {\n        views: this._getViews(props),\n        width: this.width,\n        height: this.height\n      });\n\n      var viewState = this._getViewState(props);\n\n      if (viewState) {\n        newProps.viewState = viewState;\n      } // Update view manager props\n\n\n      if (this.viewManager) {\n        this.viewManager.setProps(newProps);\n      } // Update layer manager props (but not size)\n\n\n      if (this.layerManager) {\n        this.layerManager.setProps(newProps);\n      } // Update animation loop\n\n\n      if (this.animationLoop) {\n        this.animationLoop.setProps(newProps);\n      }\n\n      this.stats.timeEnd('deck.setProps');\n    } // Public API\n    // Check if a redraw is needed\n    // Returns `false` or a string summarizing the redraw reason\n\n  }, {\n    key: \"needsRedraw\",\n    value: function needsRedraw() {\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref2$clearRedrawFlag = _ref2.clearRedrawFlags,\n          clearRedrawFlags = _ref2$clearRedrawFlag === void 0 ? true : _ref2$clearRedrawFlag;\n\n      if (this.props._animate) {\n        return 'Deck._animate';\n      }\n\n      var redraw = this._needsRedraw;\n\n      if (clearRedrawFlags) {\n        this._needsRedraw = false;\n      }\n\n      var viewManagerNeedsRedraw = this.viewManager.needsRedraw({\n        clearRedrawFlags: clearRedrawFlags\n      });\n      var layerManagerNeedsRedraw = this.layerManager.needsRedraw({\n        clearRedrawFlags: clearRedrawFlags\n      });\n      redraw = redraw || viewManagerNeedsRedraw || layerManagerNeedsRedraw;\n      return redraw;\n    }\n  }, {\n    key: \"getViews\",\n    value: function getViews() {\n      return this.viewManager.views;\n    } // Get a set of viewports for a given width and height\n\n  }, {\n    key: \"getViewports\",\n    value: function getViewports(rect) {\n      return this.viewManager.getViewports(rect);\n    }\n  }, {\n    key: \"pickObject\",\n    value: function pickObject(_ref3) {\n      var x = _ref3.x,\n          y = _ref3.y,\n          _ref3$radius = _ref3.radius,\n          radius = _ref3$radius === void 0 ? 0 : _ref3$radius,\n          _ref3$layerIds = _ref3.layerIds,\n          layerIds = _ref3$layerIds === void 0 ? null : _ref3$layerIds;\n      this.stats.timeStart('deck.pickObject');\n      var selectedInfos = this.layerManager.pickObject({\n        x: x,\n        y: y,\n        radius: radius,\n        layerIds: layerIds,\n        viewports: this.getViewports({\n          x: x,\n          y: y\n        }),\n        mode: 'query',\n        depth: 1\n      });\n      this.stats.timeEnd('deck.pickObject');\n      return selectedInfos.length ? selectedInfos[0] : null;\n    }\n  }, {\n    key: \"pickMultipleObjects\",\n    value: function pickMultipleObjects(_ref4) {\n      var x = _ref4.x,\n          y = _ref4.y,\n          _ref4$radius = _ref4.radius,\n          radius = _ref4$radius === void 0 ? 0 : _ref4$radius,\n          _ref4$layerIds = _ref4.layerIds,\n          layerIds = _ref4$layerIds === void 0 ? null : _ref4$layerIds,\n          _ref4$depth = _ref4.depth,\n          depth = _ref4$depth === void 0 ? 10 : _ref4$depth;\n      this.stats.timeStart('deck.pickMultipleObjects');\n      var selectedInfos = this.layerManager.pickObject({\n        x: x,\n        y: y,\n        radius: radius,\n        layerIds: layerIds,\n        viewports: this.getViewports({\n          x: x,\n          y: y\n        }),\n        mode: 'query',\n        depth: depth\n      });\n      this.stats.timeEnd('deck.pickMultipleObjects');\n      return selectedInfos;\n    }\n  }, {\n    key: \"pickObjects\",\n    value: function pickObjects(_ref5) {\n      var x = _ref5.x,\n          y = _ref5.y,\n          _ref5$width = _ref5.width,\n          width = _ref5$width === void 0 ? 1 : _ref5$width,\n          _ref5$height = _ref5.height,\n          height = _ref5$height === void 0 ? 1 : _ref5$height,\n          _ref5$layerIds = _ref5.layerIds,\n          layerIds = _ref5$layerIds === void 0 ? null : _ref5$layerIds;\n      this.stats.timeStart('deck.pickObjects');\n      var infos = this.layerManager.pickObjects({\n        x: x,\n        y: y,\n        width: width,\n        height: height,\n        layerIds: layerIds,\n        viewports: this.getViewports({\n          x: x,\n          y: y,\n          width: width,\n          height: height\n        })\n      });\n      this.stats.timeEnd('deck.pickObjects');\n      return infos;\n    } // Private Methods\n    // canvas, either string, canvas or `null`\n\n  }, {\n    key: \"_createCanvas\",\n    value: function _createCanvas(props) {\n      var canvas = props.canvas; // TODO EventManager should accept element id\n\n      if (typeof canvas === 'string') {\n        /* global document */\n        canvas = document.getElementById(canvas);\n        (0, _assert.default)(canvas);\n      }\n\n      if (!canvas) {\n        canvas = document.createElement('canvas');\n        var parent = props.parent || document.body;\n        parent.appendChild(canvas);\n      }\n\n      var id = props.id,\n          style = props.style;\n      canvas.id = id;\n      Object.assign(canvas.style, style);\n      return canvas;\n    } // Updates canvas width and/or height, if provided as props\n\n  }, {\n    key: \"_setCanvasSize\",\n    value: function _setCanvasSize(props) {\n      if (!this.canvas) {\n        return;\n      }\n\n      var width = props.width,\n          height = props.height; // Set size ONLY if props are being provided, otherwise let canvas be layouted freely\n\n      if (width || width === 0) {\n        width = Number.isFinite(width) ? \"\".concat(width, \"px\") : width;\n        this.canvas.style.width = width;\n      }\n\n      if (height || height === 0) {\n        height = Number.isFinite(height) ? \"\".concat(height, \"px\") : height; // Note: position==='absolute' required for height 100% to work\n\n        this.canvas.style.position = 'absolute';\n        this.canvas.style.height = height;\n      }\n    } // If canvas size has changed, updates\n\n  }, {\n    key: \"_updateCanvasSize\",\n    value: function _updateCanvasSize() {\n      if (this._checkForCanvasSizeChange()) {\n        var width = this.width,\n            height = this.height;\n        this.viewManager.setProps({\n          width: width,\n          height: height\n        });\n        this.props.onResize({\n          width: this.width,\n          height: this.height\n        });\n      }\n    } // If canvas size has changed, reads out the new size and returns true\n\n  }, {\n    key: \"_checkForCanvasSizeChange\",\n    value: function _checkForCanvasSizeChange() {\n      var canvas = this.canvas;\n\n      if (!canvas) {\n        return false;\n      } // Fallback to width/height when clientWidth/clientHeight are 0 or undefined.\n\n\n      var newWidth = canvas.clientWidth || canvas.width;\n      var newHeight = canvas.clientHeight || canvas.height;\n\n      if (newWidth !== this.width || newHeight !== this.height) {\n        this.width = newWidth;\n        this.height = newHeight;\n        return true;\n      }\n\n      return false;\n    }\n  }, {\n    key: \"_createAnimationLoop\",\n    value: function _createAnimationLoop(props) {\n      var _this = this;\n\n      var width = props.width,\n          height = props.height,\n          gl = props.gl,\n          glOptions = props.glOptions,\n          debug = props.debug,\n          useDevicePixels = props.useDevicePixels,\n          autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;\n      return new _luma.AnimationLoop({\n        width: width,\n        height: height,\n        useDevicePixels: useDevicePixels,\n        autoResizeDrawingBuffer: autoResizeDrawingBuffer,\n        onCreateContext: function onCreateContext(opts) {\n          return gl || (0, _luma.createGLContext)(Object.assign({}, glOptions, opts, {\n            canvas: _this.canvas,\n            debug: debug\n          }));\n        },\n        onInitialize: this._onRendererInitialized,\n        onRender: this._onRenderFrame,\n        onBeforeRender: props.onBeforeRender,\n        onAfterRender: props.onAfterRender\n      });\n    } // Get the most relevant view state: props.viewState, if supplied, shadows internal viewState\n    // TODO: For backwards compatibility ensure numeric width and height is added to the viewState\n\n  }, {\n    key: \"_getViewState\",\n    value: function _getViewState(props) {\n      return props.viewState || this.viewState;\n    } // Get the view descriptor list\n\n  }, {\n    key: \"_getViews\",\n    value: function _getViews(props) {\n      // Default to a full screen map view port\n      var views = props.views || [new _mapView.default({\n        id: 'default-view'\n      })];\n      views = Array.isArray(views) ? views : [views];\n\n      if (views.length && props.controller) {\n        // Backward compatibility: support controller prop\n        views[0].props.controller = props.controller;\n      }\n\n      return views;\n    }\n  }, {\n    key: \"_pickAndCallback\",\n    value: function _pickAndCallback(options) {\n      var pos = options.event.offsetCenter; // Do not trigger callbacks when click/hover position is invalid. Doing so will cause a\n      // assertion error when attempting to unproject the position.\n\n      if (!pos) {\n        return;\n      }\n\n      var radius = this.props.pickingRadius;\n      var selectedInfos = this.layerManager.pickObject({\n        x: pos.x,\n        y: pos.y,\n        radius: radius,\n        viewports: this.getViewports(pos),\n        mode: options.mode,\n        depth: 1,\n        event: options.event\n      });\n\n      if (options.callback && selectedInfos) {\n        var firstInfo = selectedInfos.find(function (info) {\n          return info.index >= 0;\n        }) || null; // As per documentation, send null value when no valid object is picked.\n\n        options.callback(firstInfo, selectedInfos, options.event.srcEvent);\n      }\n    }\n  }, {\n    key: \"_updateCursor\",\n    value: function _updateCursor() {\n      if (this.canvas) {\n        this.canvas.style.cursor = this.props.getCursor(this.interactiveState);\n      }\n    } // Updates animation props on the layer context\n\n  }, {\n    key: \"_updateAnimationProps\",\n    value: function _updateAnimationProps(animationProps) {\n      this.layerManager.context.animationProps = animationProps;\n    } // Deep integration (Mapbox styles)\n\n  }, {\n    key: \"_setGLContext\",\n    value: function _setGLContext(gl) {\n      if (this.layerManager) {\n        return;\n      } // if external context...\n\n\n      if (!this.canvas) {\n        this.canvas = gl.canvas;\n        (0, _luma.trackContextState)(gl, {\n          enable: true,\n          copyState: true\n        });\n      }\n\n      (0, _luma.setParameters)(gl, {\n        blend: true,\n        blendFunc: [_constants.default.SRC_ALPHA, _constants.default.ONE_MINUS_SRC_ALPHA, _constants.default.ONE, _constants.default.ONE_MINUS_SRC_ALPHA],\n        polygonOffsetFill: true,\n        depthTest: true,\n        depthFunc: _constants.default.LEQUAL\n      });\n      this.props.onWebGLInitialized(gl);\n\n      if (!this.props._customRender) {\n        this.eventManager = new _mjolnir.EventManager(gl.canvas, {\n          events: {\n            click: this._onClick,\n            pointermove: this._onPointerMove,\n            pointerleave: this._onPointerLeave\n          }\n        });\n\n        for (var eventType in _constants2.EVENTS) {\n          this.eventManager.on(eventType, this._onEvent);\n        }\n      }\n\n      this.viewManager = new _viewManager.default({\n        eventManager: this.eventManager,\n        onViewStateChange: this._onViewStateChange,\n        onInteractiveStateChange: this._onInteractiveStateChange,\n        views: this._getViews(this.props),\n        viewState: this._getViewState(this.props),\n        width: this.width,\n        height: this.height\n      }); // viewManager must be initialized before layerManager\n      // layerManager depends on viewport created by viewManager.\n\n      (0, _assert.default)(this.viewManager);\n      var viewport = this.viewManager.getViewports()[0]; // Note: avoid React setState due GL animation loop / setState timing issue\n\n      this.layerManager = new _layerManager.default(gl, {\n        stats: this.stats,\n        viewport: viewport\n      });\n      this.effectManager = new _effectManager.default({\n        gl: gl,\n        layerManager: this.layerManager\n      });\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = this.props.effects[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var effect = _step.value;\n          this.effectManager.addEffect(effect);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      this.setProps(this.props);\n\n      this._updateCanvasSize();\n\n      this.props.onLoad();\n    }\n  }, {\n    key: \"_drawLayers\",\n    value: function _drawLayers(redrawReason) {\n      var gl = this.layerManager.context.gl;\n      (0, _luma.setParameters)(gl, this.props.parameters);\n      this.props.onBeforeRender({\n        gl: gl\n      });\n      this.layerManager.drawLayers({\n        pass: 'screen',\n        viewports: this.viewManager.getViewports(),\n        views: this.viewManager.getViews(),\n        redrawReason: redrawReason,\n        drawPickingColors: this.props.drawPickingColors,\n        // Debug picking, helps in framebuffered layers\n        customRender: Boolean(this.props._customRender)\n      });\n      this.props.onAfterRender({\n        gl: gl\n      });\n    } // Callbacks\n\n  }, {\n    key: \"_onRendererInitialized\",\n    value: function _onRendererInitialized(_ref6) {\n      var gl = _ref6.gl;\n\n      this._setGLContext(gl);\n    }\n  }, {\n    key: \"_onRenderFrame\",\n    value: function _onRenderFrame(animationProps) {\n      // Log perf stats every second\n      if (this.stats.oneSecondPassed()) {\n        var table = this.stats.getStatsTable();\n        this.stats.reset();\n\n        _log.default.table(3, table)(); // Experimental: report metrics\n\n\n        if (this.props._onMetrics) {\n          for (var key in table) {\n            table[key] = table[key].total;\n          }\n\n          this.props._onMetrics(table);\n        }\n      }\n\n      this._updateCanvasSize();\n\n      this._updateCursor(); // Update layers if needed (e.g. some async prop has loaded)\n      // Note: This can trigger a redraw\n\n\n      this.layerManager.updateLayers();\n      this.stats.bump('fps'); // Needs to be done before drawing\n\n      this._updateAnimationProps(animationProps); // Check if we need to redraw\n\n\n      var redrawReason = this.needsRedraw({\n        clearRedrawFlags: true\n      });\n\n      if (!redrawReason) {\n        return;\n      }\n\n      this.stats.bump('redraw');\n\n      if (this.props._customRender) {\n        this.props._customRender();\n      } else {\n        this._drawLayers(redrawReason);\n      }\n    } // Callbacks\n\n  }, {\n    key: \"_onViewStateChange\",\n    value: function _onViewStateChange(params) {\n      // Let app know that view state is changing, and give it a chance to change it\n      var viewState = this.props.onViewStateChange(params) || params.viewState; // If initialViewState was set on creation, auto track position\n\n      if (this.viewState) {\n        this.viewState[params.viewId] = viewState;\n        this.viewManager.setProps({\n          viewState: viewState\n        });\n      }\n    }\n  }, {\n    key: \"_onInteractiveStateChange\",\n    value: function _onInteractiveStateChange(_ref7) {\n      var _ref7$isDragging = _ref7.isDragging,\n          isDragging = _ref7$isDragging === void 0 ? false : _ref7$isDragging;\n\n      if (isDragging !== this.interactiveState.isDragging) {\n        this.interactiveState.isDragging = isDragging;\n      }\n    } // Route move events to layers. call the `onHover` prop of any picked layer,\n    // and `onLayerHover` is called directly from here with any picking info generated by `pickLayer`.\n    // @param {Object} event  A mjolnir.js event\n\n  }, {\n    key: \"_onClick\",\n    value: function _onClick(event) {\n      this._pickAndCallback({\n        callback: this.props.onLayerClick,\n        event: event,\n        mode: 'click'\n      });\n    }\n  }, {\n    key: \"_onEvent\",\n    value: function _onEvent(event) {\n      var eventOptions = _constants2.EVENTS[event.type];\n      var pos = event.offsetCenter;\n\n      if (!eventOptions || !pos) {\n        return;\n      } // Reuse last picked object\n\n\n      var info = this.layerManager.getLastPickedObject({\n        x: pos.x,\n        y: pos.y,\n        viewports: this.getViewports(pos)\n      });\n      var layer = info.layer;\n      var layerHandler = layer && (layer[eventOptions.handler] || layer.props[eventOptions.handler]);\n      var rootHandler = this.props[eventOptions.handler];\n      var handled = false;\n\n      if (layerHandler) {\n        handled = layerHandler.call(layer, info, event);\n      }\n\n      if (!handled && rootHandler) {\n        rootHandler(info, event);\n      }\n    }\n  }, {\n    key: \"_onPointerMove\",\n    value: function _onPointerMove(event) {\n      if (event.leftButton || event.rightButton) {\n        // Do not trigger onHover callbacks if mouse button is down.\n        return;\n      }\n\n      this._pickAndCallback({\n        callback: this.props.onLayerHover,\n        event: event,\n        mode: 'hover'\n      });\n    }\n  }, {\n    key: \"_onPointerLeave\",\n    value: function _onPointerLeave(event) {\n      this.layerManager.pickObject({\n        x: -1,\n        y: -1,\n        viewports: [],\n        radius: 1,\n        mode: 'hover'\n      });\n\n      if (this.props.onLayerHover) {\n        this.props.onLayerHover(null, [], event.srcEvent);\n      }\n    }\n  }]);\n\n  return Deck;\n}();\n\nexports.default = Deck;\nDeck.getPropTypes = getPropTypes;\nDeck.defaultProps = defaultProps;\n},{\"./layer-manager\":\"D2hL\",\"./view-manager\":\"THBY\",\"../views/map-view\":\"tu7Z\",\"../experimental/lib/effect-manager\":\"LRuT\",\"../experimental/lib/effect\":\"bkMp\",\"../utils/log\":\"mqAj\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"probe.gl\":\"z0g1\",\"mjolnir.js\":\"WUuw\",\"../utils/assert\":\"R2tg\",\"./constants\":\"hXbg\"}],\"kfDy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _layer = _interopRequireDefault(require(\"./layer\"));\n\nvar _log = _interopRequireDefault(require(\"../utils/log\"));\n\nvar _flatten = require(\"../utils/flatten\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar CompositeLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(CompositeLayer, _Layer);\n\n  function CompositeLayer() {\n    _classCallCheck(this, CompositeLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(CompositeLayer).apply(this, arguments));\n  }\n\n  _createClass(CompositeLayer, [{\n    key: \"getSubLayers\",\n    value: function getSubLayers() {\n      return this.internalState && this.internalState.subLayers || [];\n    } // initializeState is usually not needed for composite layers\n    // Provide empty definition to disable check for missing definition\n\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {} // Updates selected state members and marks the composite layer to need rerender\n\n  }, {\n    key: \"setState\",\n    value: function setState(updateObject) {\n      _get(_getPrototypeOf(CompositeLayer.prototype), \"setState\", this).call(this, updateObject);\n\n      this.setLayerNeedsUpdate();\n    } // called to augment the info object that is bubbled up from a sublayer\n    // override Layer.getPickingInfo() because decoding / setting uniform do\n    // not apply to a composite layer.\n    // @return null to cancel event\n\n  }, {\n    key: \"getPickingInfo\",\n    value: function getPickingInfo(_ref) {\n      var info = _ref.info;\n      return info;\n    } // Implement to generate subLayers\n\n  }, {\n    key: \"renderLayers\",\n    value: function renderLayers() {\n      return null;\n    } // Returns true if sub layer needs to be rendered\n\n  }, {\n    key: \"shouldRenderSubLayer\",\n    value: function shouldRenderSubLayer(id, data) {\n      var overridingProps = this.props._subLayerProps;\n      return data && data.length || overridingProps && overridingProps[id];\n    } // Returns sub layer class for a specific sublayer\n\n  }, {\n    key: \"getSubLayerClass\",\n    value: function getSubLayerClass(id, DefaultLayerClass) {\n      var overridingProps = this.props._subLayerProps;\n      return overridingProps && overridingProps[id] && overridingProps[id].type || DefaultLayerClass;\n    } // Returns sub layer props for a specific sublayer\n\n  }, {\n    key: \"getSubLayerProps\",\n    value: function getSubLayerProps(sublayerProps) {\n      var _this$props = this.props,\n          opacity = _this$props.opacity,\n          pickable = _this$props.pickable,\n          visible = _this$props.visible,\n          parameters = _this$props.parameters,\n          getPolygonOffset = _this$props.getPolygonOffset,\n          highlightedObjectIndex = _this$props.highlightedObjectIndex,\n          autoHighlight = _this$props.autoHighlight,\n          highlightColor = _this$props.highlightColor,\n          coordinateSystem = _this$props.coordinateSystem,\n          coordinateOrigin = _this$props.coordinateOrigin,\n          wrapLongitude = _this$props.wrapLongitude,\n          positionFormat = _this$props.positionFormat,\n          modelMatrix = _this$props.modelMatrix,\n          overridingProps = _this$props._subLayerProps;\n      var newProps = {\n        opacity: opacity,\n        pickable: pickable,\n        visible: visible,\n        parameters: parameters,\n        getPolygonOffset: getPolygonOffset,\n        highlightedObjectIndex: highlightedObjectIndex,\n        autoHighlight: autoHighlight,\n        highlightColor: highlightColor,\n        coordinateSystem: coordinateSystem,\n        coordinateOrigin: coordinateOrigin,\n        wrapLongitude: wrapLongitude,\n        positionFormat: positionFormat,\n        modelMatrix: modelMatrix\n      };\n\n      if (sublayerProps) {\n        Object.assign(newProps, sublayerProps, // experimental feature that allows users to override sublayer props via parent layer prop\n        overridingProps && overridingProps[sublayerProps.id], {\n          id: \"\".concat(this.props.id, \"-\").concat(sublayerProps.id),\n          updateTriggers: Object.assign({\n            all: this.props.updateTriggers.all\n          }, sublayerProps.updateTriggers)\n        });\n      }\n\n      return newProps;\n    }\n  }, {\n    key: \"_getAttributeManager\",\n    value: function _getAttributeManager() {\n      return null;\n    } // Called by layer manager to render subLayers\n\n  }, {\n    key: \"_renderLayers\",\n    value: function _renderLayers() {\n      var subLayers = this.internalState.subLayers;\n\n      if (subLayers && !this.needsUpdate()) {\n        _log.default.log(3, \"Composite layer reused subLayers \".concat(this), this.internalState.subLayers)();\n      } else {\n        subLayers = this.renderLayers(); // Flatten the returned array, removing any null, undefined or false\n        // this allows layers to render sublayers conditionally\n        // (see CompositeLayer.renderLayers docs)\n\n        subLayers = (0, _flatten.flatten)(subLayers, {\n          filter: Boolean\n        });\n        this.internalState.subLayers = subLayers;\n\n        _log.default.log(2, \"Composite layer rendered new subLayers \".concat(this), subLayers)();\n      } // populate reference to parent layer (this layer)\n      // NOTE: needs to be done even when reusing layers as the parent may have changed\n\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = subLayers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var layer = _step.value;\n          layer.parent = this;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"isComposite\",\n    get: function get() {\n      return true;\n    }\n  }]);\n\n  return CompositeLayer;\n}(_layer.default);\n\nexports.default = CompositeLayer;\nCompositeLayer.layerName = 'CompositeLayer';\n},{\"./layer\":\"Cvfw\",\"../utils/log\":\"mqAj\",\"../utils/flatten\":\"XKEb\"}],\"H7iY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _controller = _interopRequireDefault(require(\"./controller\"));\n\nvar _viewState = _interopRequireDefault(require(\"./view-state\"));\n\nvar _math = require(\"math.gl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar MOVEMENT_SPEED = 1; // 1 meter per keyboard click\n\nvar ROTATION_STEP_DEGREES = 2;\n/* Helpers */\n\nfunction ensureFinite(value, fallbackValue) {\n  return Number.isFinite(value) ? value : fallbackValue;\n}\n\nvar FirstPersonState =\n/*#__PURE__*/\nfunction (_ViewState) {\n  _inherits(FirstPersonState, _ViewState);\n\n  function FirstPersonState(_ref) {\n    var _this;\n\n    var width = _ref.width,\n        height = _ref.height,\n        position = _ref.position,\n        bearing = _ref.bearing,\n        pitch = _ref.pitch,\n        longitude = _ref.longitude,\n        latitude = _ref.latitude,\n        zoom = _ref.zoom,\n        _ref$syncBearing = _ref.syncBearing,\n        syncBearing = _ref$syncBearing === void 0 ? true : _ref$syncBearing,\n        bounds = _ref.bounds,\n        startPanEventPosition = _ref.startPanEventPosition,\n        startPanPosition = _ref.startPanPosition,\n        startRotateCenter = _ref.startRotateCenter,\n        startRotateViewport = _ref.startRotateViewport,\n        startZoomPos = _ref.startZoomPos,\n        startZoom = _ref.startZoom;\n\n    _classCallCheck(this, FirstPersonState);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(FirstPersonState).call(this, {\n      width: width,\n      height: height,\n      position: position,\n      bearing: bearing,\n      pitch: pitch,\n      longitude: longitude,\n      latitude: latitude,\n      zoom: zoom\n    }));\n    _this._interactiveState = {\n      startPanEventPosition: startPanEventPosition,\n      startPanPosition: startPanPosition,\n      startRotateCenter: startRotateCenter,\n      startRotateViewport: startRotateViewport,\n      startZoomPos: startZoomPos,\n      startZoom: startZoom\n    };\n    return _this;\n  }\n  /* Public API */\n\n\n  _createClass(FirstPersonState, [{\n    key: \"getInteractiveState\",\n    value: function getInteractiveState() {\n      return this._interactiveState;\n    }\n    /**\n     * Start panning\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"panStart\",\n    value: function panStart(_ref2) {\n      var pos = _ref2.pos;\n      var _this$_viewportProps = this._viewportProps,\n          translationX = _this$_viewportProps.translationX,\n          translationY = _this$_viewportProps.translationY;\n      return this._getUpdatedState({\n        startPanPosition: [translationX, translationY],\n        startPanEventPosition: pos\n      });\n    }\n    /**\n     * Pan\n     * @param {[Number, Number]} pos - position on screen where the pointer is\n     */\n\n  }, {\n    key: \"pan\",\n    value: function pan(_ref3) {\n      var pos = _ref3.pos,\n          startPos = _ref3.startPos;\n      var startPanEventPosition = this._interactiveState.startPanEventPosition || startPos; // when the mouse starts dragging outside of this viewport, then drags over it.\n      // TODO - use interactionState flag instead\n\n      if (!startPanEventPosition) {\n        return this;\n      }\n\n      var _ref4 = this._interactiveState.startPanPosition || [],\n          _ref5 = _slicedToArray(_ref4, 2),\n          translationX = _ref5[0],\n          translationY = _ref5[1];\n\n      translationX = ensureFinite(translationX, this._viewportProps.translationX);\n      translationY = ensureFinite(translationY, this._viewportProps.translationY);\n      var deltaX = pos[0] - startPanEventPosition[0];\n      var deltaY = pos[1] - startPanEventPosition[1];\n      return this._getUpdatedState({\n        translationX: translationX + deltaX,\n        translationY: translationY - deltaY\n      });\n    }\n    /**\n     * End panning\n     * Must call if `panStart()` was called\n     */\n\n  }, {\n    key: \"panEnd\",\n    value: function panEnd() {\n      return this._getUpdatedState({\n        startPanPosition: null,\n        startPanPos: null\n      });\n    }\n    /**\n     * Start rotating\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"rotateStart\",\n    value: function rotateStart(_ref6) {\n      var pos = _ref6.pos;\n      return this._getUpdatedState({\n        startRotateCenter: this._viewportProps.position,\n        startRotateViewport: this._viewportProps\n      });\n    }\n    /**\n     * Rotate\n     * @param {[Number, Number]} pos - position on screen where the pointer is\n     */\n\n  }, {\n    key: \"rotate\",\n    value: function rotate(_ref7) {\n      var deltaScaleX = _ref7.deltaScaleX,\n          deltaScaleY = _ref7.deltaScaleY; // when the mouse starts dragging outside of this viewport, then drags over it.\n      // TODO - use interactionState flag instead\n\n      if (!this._interactiveState.startRotateCenter) {\n        return this;\n      }\n\n      var _this$_viewportProps2 = this._viewportProps,\n          bearing = _this$_viewportProps2.bearing,\n          pitch = _this$_viewportProps2.pitch;\n      return this._getUpdatedState({\n        bearing: bearing + deltaScaleX * 10,\n        pitch: pitch - deltaScaleY * 10\n      });\n    }\n    /**\n     * End rotating\n     * Must call if `rotateStart()` was called\n     */\n\n  }, {\n    key: \"rotateEnd\",\n    value: function rotateEnd() {\n      return this._getUpdatedState({\n        startRotateCenter: null,\n        startRotateViewport: null\n      });\n    }\n    /**\n     * Start zooming\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"zoomStart\",\n    value: function zoomStart(_ref8) {\n      var pos = _ref8.pos;\n      return this._getUpdatedState({\n        startZoomPos: pos,\n        startZoom: this._viewportProps.zoom\n      });\n    }\n    /**\n     * Zoom\n     * @param {[Number, Number]} pos - position on screen where the current center is\n     * @param {[Number, Number]} startPos - the center position at\n     *   the start of the operation. Must be supplied of `zoomStart()` was not called\n     * @param {Number} scale - a number between [0, 1] specifying the accumulated\n     *   relative scale.\n     */\n\n  }, {\n    key: \"zoom\",\n    value: function zoom(_ref9) {\n      var pos = _ref9.pos,\n          startPos = _ref9.startPos,\n          scale = _ref9.scale;\n      var _this$_viewportProps3 = this._viewportProps,\n          zoom = _this$_viewportProps3.zoom,\n          minZoom = _this$_viewportProps3.minZoom,\n          maxZoom = _this$_viewportProps3.maxZoom,\n          width = _this$_viewportProps3.width,\n          height = _this$_viewportProps3.height,\n          translationX = _this$_viewportProps3.translationX,\n          translationY = _this$_viewportProps3.translationY;\n      var startZoomPos = this._interactiveState.startZoomPos || startPos || pos;\n      var newZoom = (0, _math.clamp)(zoom * scale, minZoom, maxZoom);\n      var deltaX = pos[0] - startZoomPos[0];\n      var deltaY = pos[1] - startZoomPos[1]; // Zoom around the center position\n\n      var cx = startZoomPos[0] - width / 2;\n      var cy = height / 2 - startZoomPos[1];\n      /* eslint-disable no-unused-vars */\n\n      var newTranslationX = cx - (cx - translationX) * newZoom / zoom + deltaX;\n      var newTranslationY = cy - (cy - translationY) * newZoom / zoom - deltaY;\n      /* eslint-enable no-unused-vars */\n      // return this._getUpdatedState({\n      //   position\n      //   translationX: newTranslationX,\n      //   translationY: newTranslationY\n      // });\n      // TODO HACK\n\n      return newZoom / zoom < 1 ? this.moveBackward() : this.moveForward();\n    }\n    /**\n     * End zooming\n     * Must call if `zoomStart()` was called\n     */\n\n  }, {\n    key: \"zoomEnd\",\n    value: function zoomEnd() {\n      return this._getUpdatedState({\n        startZoomPos: null,\n        startZoom: null\n      });\n    }\n  }, {\n    key: \"moveLeft\",\n    value: function moveLeft() {\n      var bearing = this._viewportProps.bearing;\n      var newBearing = bearing - ROTATION_STEP_DEGREES;\n      return this._getUpdatedState({\n        bearing: newBearing\n      });\n    }\n  }, {\n    key: \"moveRight\",\n    value: function moveRight() {\n      var bearing = this._viewportProps.bearing;\n      var newBearing = bearing + ROTATION_STEP_DEGREES;\n      return this._getUpdatedState({\n        bearing: newBearing\n      });\n    }\n  }, {\n    key: \"moveForward\",\n    value: function moveForward() {\n      var position = this._viewportProps.position;\n      var direction = this.getDirection();\n      var delta = new _math.Vector3(direction).normalize().scale(MOVEMENT_SPEED);\n      return this._getUpdatedState({\n        position: new _math.Vector3(position).add(delta)\n      });\n    }\n  }, {\n    key: \"moveBackward\",\n    value: function moveBackward() {\n      var position = this._viewportProps.position;\n      var direction = this.getDirection();\n      var delta = new _math.Vector3(direction).normalize().scale(-MOVEMENT_SPEED);\n      return this._getUpdatedState({\n        position: new _math.Vector3(position).add(delta)\n      });\n    }\n  }, {\n    key: \"moveUp\",\n    value: function moveUp() {\n      var position = this._viewportProps.position;\n      var delta = [0, 0, 1];\n      return this._getUpdatedState({\n        position: new _math.Vector3(position).add(delta)\n      });\n    }\n  }, {\n    key: \"moveDown\",\n    value: function moveDown() {\n      var position = this._viewportProps.position;\n      var delta = position[2] >= 1 ? [0, 0, -1] : [0, 0, 0];\n      return this._getUpdatedState({\n        position: new _math.Vector3(position).add(delta)\n      });\n    }\n  }, {\n    key: \"zoomIn\",\n    value: function zoomIn() {\n      return this._getUpdatedState({\n        zoom: this._viewportProps.zoom + 0.2\n      });\n    }\n  }, {\n    key: \"zoomOut\",\n    value: function zoomOut() {\n      return this._getUpdatedState({\n        zoom: this._viewportProps.zoom - 0.2\n      });\n    }\n    /* Private methods */\n\n  }, {\n    key: \"_getUpdatedState\",\n    value: function _getUpdatedState(newProps) {\n      // Update _viewportProps\n      return new FirstPersonState(Object.assign({}, this._viewportProps, this._interactiveState, newProps));\n    }\n  }]);\n\n  return FirstPersonState;\n}(_viewState.default);\n\nvar FirstPersonController =\n/*#__PURE__*/\nfunction (_Controller) {\n  _inherits(FirstPersonController, _Controller);\n\n  function FirstPersonController(props) {\n    _classCallCheck(this, FirstPersonController);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(FirstPersonController).call(this, FirstPersonState, props));\n  }\n\n  return FirstPersonController;\n}(_controller.default);\n\nexports.default = FirstPersonController;\n},{\"./controller\":\"SwtL\",\"./view-state\":\"VX0j\",\"math.gl\":\"o5CE\"}],\"svAd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _view = _interopRequireDefault(require(\"./view\"));\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar _math = require(\"math.gl\");\n\nvar _firstPersonController = _interopRequireDefault(require(\"../controllers/first-person-controller\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction getDirectionFromBearingAndPitch(_ref) {\n  var bearing = _ref.bearing,\n      pitch = _ref.pitch;\n  var spherical = new _math._SphericalCoordinates({\n    bearing: bearing,\n    pitch: pitch\n  });\n  var direction = spherical.toVector3().normalize();\n  return direction;\n}\n\nvar FirstPersonView =\n/*#__PURE__*/\nfunction (_View) {\n  _inherits(FirstPersonView, _View);\n\n  function FirstPersonView() {\n    _classCallCheck(this, FirstPersonView);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(FirstPersonView).apply(this, arguments));\n  }\n\n  _createClass(FirstPersonView, [{\n    key: \"_getViewport\",\n    value: function _getViewport(props) {\n      // TODO - push direction handling into Matrix4.lookAt\n      var _props$viewState = props.viewState,\n          _props$viewState$mode = _props$viewState.modelMatrix,\n          modelMatrix = _props$viewState$mode === void 0 ? null : _props$viewState$mode,\n          bearing = _props$viewState.bearing,\n          _props$viewState$up = _props$viewState.up,\n          up = _props$viewState$up === void 0 ? [0, 0, 1] : _props$viewState$up; // Always calculate direction from bearing and pitch\n\n      var dir = getDirectionFromBearingAndPitch({\n        bearing: bearing,\n        pitch: 89\n      }); // Direction is relative to model coordinates, of course\n\n      var center = modelMatrix ? modelMatrix.transformDirection(dir) : dir; // Just the direction. All the positioning is done in viewport.js\n\n      var viewMatrix = new _math.Matrix4().lookAt({\n        eye: [0, 0, 0],\n        center: center,\n        up: up\n      });\n      return new _viewport.default(Object.assign({}, props, {\n        zoom: null,\n        // triggers meter level zoom\n        viewMatrix: viewMatrix\n      }));\n    }\n  }, {\n    key: \"controller\",\n    get: function get() {\n      return this._getControllerProps({\n        type: _firstPersonController.default\n      });\n    }\n  }]);\n\n  return FirstPersonView;\n}(_view.default);\n\nexports.default = FirstPersonView;\nFirstPersonView.displayName = 'FirstPersonView';\n},{\"./view\":\"Xp7T\",\"../viewports/viewport\":\"sjPB\",\"math.gl\":\"o5CE\",\"../controllers/first-person-controller\":\"H7iY\"}],\"q7Dh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _view = _interopRequireDefault(require(\"./view\"));\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar _math = require(\"math.gl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction getDirectionFromBearingAndPitch(_ref) {\n  var bearing = _ref.bearing,\n      pitch = _ref.pitch;\n  var spherical = new _math._SphericalCoordinates({\n    bearing: bearing,\n    pitch: pitch\n  });\n  return spherical.toVector3().normalize();\n}\n\nvar ThirdPersonView =\n/*#__PURE__*/\nfunction (_View) {\n  _inherits(ThirdPersonView, _View);\n\n  function ThirdPersonView() {\n    _classCallCheck(this, ThirdPersonView);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(ThirdPersonView).apply(this, arguments));\n  }\n\n  _createClass(ThirdPersonView, [{\n    key: \"_getViewport\",\n    value: function _getViewport(props) {\n      var _props$viewState = props.viewState,\n          bearing = _props$viewState.bearing,\n          pitch = _props$viewState.pitch,\n          position = _props$viewState.position,\n          up = _props$viewState.up,\n          zoom = _props$viewState.zoom;\n      var direction = getDirectionFromBearingAndPitch({\n        bearing: bearing,\n        pitch: pitch\n      });\n      var distance = zoom * 50; // TODO somehow need to flip z to make it work\n      // check if the position offset is done in the base viewport\n\n      var eye = direction.scale(-distance).multiply(new _math.Vector3(1, 1, -1));\n      var viewMatrix = new _math.Matrix4().multiplyRight(new _math.Matrix4().lookAt({\n        eye: eye,\n        center: position,\n        up: up\n      }));\n      return new _viewport.default(Object.assign({}, props, {\n        id: this.id,\n        zoom: null,\n        // triggers meter level zoom\n        viewMatrix: viewMatrix\n      }));\n    }\n  }]);\n\n  return ThirdPersonView;\n}(_view.default);\n\nexports.default = ThirdPersonView;\nThirdPersonView.displayName = 'ThirdPersonView';\n},{\"./view\":\"Xp7T\",\"../viewports/viewport\":\"sjPB\",\"math.gl\":\"o5CE\"}],\"ebMd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar _mathUtils = require(\"../utils/math-utils\");\n\nvar mat4 = _interopRequireWildcard(require(\"gl-matrix/mat4\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _iterableToArray(iter) {\n  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  }\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar DEGREES_TO_RADIANS = Math.PI / 180;\n/*\n * A deck.gl Viewport class used by OrbitController\n * Adds zoom and pixel translation on top of the PerspectiveViewport\n */\n\nvar OrbitViewport =\n/*#__PURE__*/\nfunction (_Viewport) {\n  _inherits(OrbitViewport, _Viewport);\n\n  function OrbitViewport(_ref) {\n    var _this;\n\n    var _ref$id = _ref.id,\n        id = _ref$id === void 0 ? 'orbit-viewport' : _ref$id,\n        width = _ref.width,\n        height = _ref.height,\n        distance = _ref.distance,\n        _ref$rotationX = _ref.rotationX,\n        rotationX = _ref$rotationX === void 0 ? 0 : _ref$rotationX,\n        _ref$rotationOrbit = _ref.rotationOrbit,\n        rotationOrbit = _ref$rotationOrbit === void 0 ? 0 : _ref$rotationOrbit,\n        _ref$orbitAxis = _ref.orbitAxis,\n        orbitAxis = _ref$orbitAxis === void 0 ? 'Z' : _ref$orbitAxis,\n        _ref$lookAt = _ref.lookAt,\n        lookAt = _ref$lookAt === void 0 ? [0, 0, 0] : _ref$lookAt,\n        _ref$up = _ref.up,\n        up = _ref$up === void 0 ? [0, 1, 0] : _ref$up,\n        _ref$fov = _ref.fov,\n        fov = _ref$fov === void 0 ? 75 : _ref$fov,\n        _ref$near = _ref.near,\n        near = _ref$near === void 0 ? 1 : _ref$near,\n        _ref$far = _ref.far,\n        far = _ref$far === void 0 ? 100 : _ref$far,\n        _ref$zoom = _ref.zoom,\n        zoom = _ref$zoom === void 0 ? 1 : _ref$zoom;\n\n    _classCallCheck(this, OrbitViewport); // TODO - Once OrbitViewport is aligned with the View system, deprecated it\n    // log.deprecated('OrbitViewport', 'OrbitView')();\n\n\n    var rotationMatrix = mat4.rotateX([], (0, _mathUtils.createMat4)(), -rotationX / 180 * Math.PI);\n\n    if (orbitAxis === 'Z') {\n      mat4.rotateZ(rotationMatrix, rotationMatrix, -rotationOrbit / 180 * Math.PI);\n    } else {\n      mat4.rotateY(rotationMatrix, rotationMatrix, -rotationOrbit / 180 * Math.PI);\n    }\n\n    var translateMatrix = (0, _mathUtils.createMat4)();\n    mat4.scale(translateMatrix, translateMatrix, [zoom, zoom, zoom]);\n    mat4.translate(translateMatrix, translateMatrix, [-lookAt[0], -lookAt[1], -lookAt[2]]);\n    var viewMatrix = mat4.lookAt([], [0, 0, distance], [0, 0, 0], up);\n    var fovRadians = fov * DEGREES_TO_RADIANS;\n    var aspect = width / height;\n    var perspectiveMatrix = mat4.perspective([], fovRadians, aspect, near, far);\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(OrbitViewport).call(this, {\n      id: id,\n      viewMatrix: mat4.multiply(viewMatrix, viewMatrix, mat4.multiply(rotationMatrix, rotationMatrix, translateMatrix)),\n      projectionMatrix: perspectiveMatrix,\n      width: width,\n      height: height\n    }));\n    _this.width = width;\n    _this.height = height;\n    _this.distance = distance;\n    _this.rotationX = rotationX;\n    _this.rotationOrbit = rotationOrbit;\n    _this.orbitAxis = orbitAxis;\n    _this.lookAt = lookAt;\n    _this.up = up;\n    _this.fov = fov;\n    _this.near = near;\n    _this.far = far;\n    _this.zoom = zoom;\n    return _this;\n  }\n\n  _createClass(OrbitViewport, [{\n    key: \"project\",\n    value: function project(xyz) {\n      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref2$topLeft = _ref2.topLeft,\n          topLeft = _ref2$topLeft === void 0 ? false : _ref2$topLeft;\n\n      var v = (0, _mathUtils.transformVector)(this.pixelProjectionMatrix, [].concat(_toConsumableArray(xyz), [1]));\n\n      var _v = _slicedToArray(v, 3),\n          x = _v[0],\n          y = _v[1],\n          z = _v[2];\n\n      var y2 = topLeft ? this.height - y : y;\n      return [x, y2, z];\n    }\n  }, {\n    key: \"unproject\",\n    value: function unproject(xyz) {\n      var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref3$topLeft = _ref3.topLeft,\n          topLeft = _ref3$topLeft === void 0 ? false : _ref3$topLeft;\n\n      var _xyz = _slicedToArray(xyz, 3),\n          x = _xyz[0],\n          y = _xyz[1],\n          z = _xyz[2];\n\n      var y2 = topLeft ? this.height - y : y;\n      return (0, _mathUtils.transformVector)(this.pixelUnprojectionMatrix, [x, y2, z, 1]);\n    }\n    /** Get camera `distance` to make view fit a box centered at lookat position in the viewport.\n     * @param {Array} sizes - [sizeX, sizeY, sizeZ]], define the dimensions of bounding box\n     * @returns {Nunber} the new distance parameter\n     */\n\n  }, {\n    key: \"getDistance\",\n    value: function getDistance(_ref4) {\n      var boundingBox = _ref4.boundingBox,\n          fov = _ref4.fov;\n      var halfMaxSide = Math.max(boundingBox[0], boundingBox[1], boundingBox[2]) / 2;\n      var distance = halfMaxSide / Math.tan(fov / 180 * Math.PI / 2);\n      return distance;\n    }\n    /** Move camera to make a model bounding box centered at lookat position fit in the viewport.\n     * @param {Array} boundingBox - [sizeX, sizeY, sizeZ]], define the dimensions of bounding box\n     * @returns a new OrbitViewport object\n     */\n\n  }, {\n    key: \"fitBounds\",\n    value: function fitBounds(boundingBox) {\n      var width = this.width,\n          height = this.height,\n          rotationX = this.rotationX,\n          rotationOrbit = this.rotationOrbit,\n          orbitAxis = this.orbitAxis,\n          lookAt = this.lookAt,\n          up = this.up,\n          fov = this.fov,\n          near = this.near,\n          far = this.far,\n          zoom = this.zoom;\n      return new OrbitViewport({\n        width: width,\n        height: height,\n        rotationX: rotationX,\n        rotationOrbit: rotationOrbit,\n        orbitAxis: orbitAxis,\n        up: up,\n        fov: fov,\n        near: near,\n        far: far,\n        zoom: zoom,\n        lookAt: lookAt,\n        distance: this.getDistance({\n          boundingBox: boundingBox,\n          fov: fov\n        })\n      });\n    }\n  }]);\n\n  return OrbitViewport;\n}(_viewport.default);\n\nexports.default = OrbitViewport;\nOrbitViewport.displayName = 'OrbitViewport';\n},{\"../viewports/viewport\":\"sjPB\",\"../utils/math-utils\":\"ocTz\",\"gl-matrix/mat4\":\"WdlT\"}],\"w9Ay\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _math = require(\"math.gl\");\n\nvar _controller = _interopRequireDefault(require(\"./controller\"));\n\nvar _orbitViewport = _interopRequireDefault(require(\"../deprecated/orbit-viewport\"));\n\nvar _assert = _interopRequireDefault(require(\"../utils/assert\"));\n\nvar _linearInterpolator = _interopRequireDefault(require(\"../transitions/linear-interpolator\"));\n\nvar _transitionManager = require(\"./transition-manager\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nvar ZOOM_TRANSITION_PROPS = {\n  transitionDuration: 300,\n  transitionEasing: function transitionEasing(t) {\n    return t;\n  },\n  transitionInterpolator: new _linearInterpolator.default(['zoom']),\n  transitionInterruption: _transitionManager.TRANSITION_EVENTS.BREAK\n};\nvar defaultState = {\n  lookAt: [0, 0, 0],\n  rotationX: 0,\n  rotationOrbit: 0,\n  fov: 50,\n  near: 1,\n  far: 100,\n  translationX: 0,\n  translationY: 0,\n  zoom: 1\n};\nvar defaultConstraints = {\n  minZoom: 0,\n  maxZoom: Infinity\n};\n/* Helpers */\n\nfunction ensureFinite(value, fallbackValue) {\n  return Number.isFinite(value) ? value : fallbackValue;\n}\n\nvar OrbitState =\n/*#__PURE__*/\nfunction () {\n  function OrbitState(_ref) {\n    var width = _ref.width,\n        height = _ref.height,\n        distance = _ref.distance,\n        rotationX = _ref.rotationX,\n        rotationOrbit = _ref.rotationOrbit,\n        orbitAxis = _ref.orbitAxis,\n        bounds = _ref.bounds,\n        lookAt = _ref.lookAt,\n        fov = _ref.fov,\n        near = _ref.near,\n        far = _ref.far,\n        translationX = _ref.translationX,\n        translationY = _ref.translationY,\n        zoom = _ref.zoom,\n        minZoom = _ref.minZoom,\n        maxZoom = _ref.maxZoom,\n        startPanViewport = _ref.startPanViewport,\n        startPanPos = _ref.startPanPos,\n        isPanning = _ref.isPanning,\n        startRotateViewport = _ref.startRotateViewport,\n        isRotating = _ref.isRotating,\n        startZoomViewport = _ref.startZoomViewport,\n        startZoomPos = _ref.startZoomPos;\n\n    _classCallCheck(this, OrbitState);\n\n    (0, _assert.default)(Number.isFinite(width), '`width` must be supplied');\n    (0, _assert.default)(Number.isFinite(height), '`height` must be supplied');\n    (0, _assert.default)(Number.isFinite(distance), '`distance` must be supplied');\n    this._viewportProps = this._applyConstraints({\n      width: width,\n      height: height,\n      distance: distance,\n      rotationX: ensureFinite(rotationX, defaultState.rotationX),\n      rotationOrbit: ensureFinite(rotationOrbit, defaultState.rotationOrbit),\n      orbitAxis: orbitAxis,\n      bounds: bounds,\n      lookAt: lookAt || defaultState.lookAt,\n      fov: ensureFinite(fov, defaultState.fov),\n      near: ensureFinite(near, defaultState.near),\n      far: ensureFinite(far, defaultState.far),\n      translationX: ensureFinite(translationX, defaultState.translationX),\n      translationY: ensureFinite(translationY, defaultState.translationY),\n      zoom: ensureFinite(zoom, defaultState.zoom),\n      minZoom: ensureFinite(minZoom, defaultConstraints.minZoom),\n      maxZoom: ensureFinite(maxZoom, defaultConstraints.maxZoom)\n    });\n    this._interactiveState = {\n      startPanViewport: startPanViewport,\n      startPanPos: startPanPos,\n      isPanning: isPanning,\n      startRotateViewport: startRotateViewport,\n      isRotating: isRotating,\n      startZoomViewport: startZoomViewport,\n      startZoomPos: startZoomPos\n    };\n  }\n  /* Public API */\n\n\n  _createClass(OrbitState, [{\n    key: \"getViewportProps\",\n    value: function getViewportProps() {\n      return this._viewportProps;\n    }\n  }, {\n    key: \"getInteractiveState\",\n    value: function getInteractiveState() {\n      return this._interactiveState;\n    }\n    /**\n     * Start panning\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"panStart\",\n    value: function panStart(_ref2) {\n      var pos = _ref2.pos;\n      var viewport = new _orbitViewport.default(this._viewportProps);\n      return this._getUpdatedOrbitState({\n        startPanPos: pos,\n        startPanViewport: viewport\n      });\n    }\n    /**\n     * Pan\n     * @param {[Number, Number]} pos - position on screen where the pointer is\n     */\n\n  }, {\n    key: \"pan\",\n    value: function pan(_ref3) {\n      var pos = _ref3.pos,\n          startPos = _ref3.startPos;\n\n      if (this._interactiveState.isRotating) {\n        return this._getUpdatedOrbitState();\n      }\n\n      var startPanPos = this._interactiveState.startPanPos || startPos;\n      (0, _assert.default)(startPanPos, '`startPanPos` props is required');\n      var viewport = this._interactiveState.startPanViewport || new _orbitViewport.default(this._viewportProps);\n      var deltaX = pos[0] - startPanPos[0];\n      var deltaY = pos[1] - startPanPos[1];\n      var center = viewport.project(viewport.lookAt);\n      var newLookAt = viewport.unproject([center[0] - deltaX, center[1] - deltaY, center[2]]);\n      return this._getUpdatedOrbitState({\n        lookAt: newLookAt,\n        isPanning: true\n      });\n    }\n    /**\n     * End panning\n     * Must call if `panStart()` was called\n     */\n\n  }, {\n    key: \"panEnd\",\n    value: function panEnd() {\n      return this._getUpdatedOrbitState({\n        startPanViewport: null,\n        startPanPos: null,\n        isPanning: null\n      });\n    }\n    /**\n     * Start rotating\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"rotateStart\",\n    value: function rotateStart(_ref4) {\n      var pos = _ref4.pos; // Rotation center should be the worldspace position at the center of the\n      // the screen. If not found, use the last one.\n\n      var viewport = new _orbitViewport.default(this._viewportProps);\n      return this._getUpdatedOrbitState({\n        startRotateViewport: viewport\n      });\n    }\n    /**\n     * Rotate\n     * @param {[Number, Number]} pos - position on screen where the pointer is\n     */\n\n  }, {\n    key: \"rotate\",\n    value: function rotate(_ref5) {\n      var deltaScaleX = _ref5.deltaScaleX,\n          deltaScaleY = _ref5.deltaScaleY;\n\n      if (this._interactiveState.isPanning) {\n        return this._getUpdatedOrbitState();\n      }\n\n      var startRotateViewport = this._interactiveState.startRotateViewport;\n\n      var _ref6 = startRotateViewport || {},\n          rotationX = _ref6.rotationX,\n          rotationOrbit = _ref6.rotationOrbit;\n\n      rotationX = ensureFinite(rotationX, this._viewportProps.rotationX);\n      rotationOrbit = ensureFinite(rotationOrbit, this._viewportProps.rotationOrbit);\n      var newRotationX = (0, _math.clamp)(rotationX - deltaScaleY * 180, -89.999, 89.999);\n      var newRotationOrbit = (rotationOrbit - deltaScaleX * 180) % 360;\n      return this._getUpdatedOrbitState({\n        rotationX: newRotationX,\n        rotationOrbit: newRotationOrbit,\n        isRotating: true\n      });\n    }\n    /**\n     * End rotating\n     * Must call if `rotateStart()` was called\n     */\n\n  }, {\n    key: \"rotateEnd\",\n    value: function rotateEnd() {\n      return this._getUpdatedOrbitState({\n        startRotateViewport: null,\n        isRotating: null\n      });\n    } // default implementation of shortest path between two view states\n\n  }, {\n    key: \"shortestPathFrom\",\n    value: function shortestPathFrom(viewState) {\n      var props = Object.assign({}, this._viewportProps);\n      return props;\n    }\n    /**\n     * Start zooming\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"zoomStart\",\n    value: function zoomStart(_ref7) {\n      var pos = _ref7.pos;\n      var viewport = new _orbitViewport.default(this._viewportProps);\n      return this._getUpdatedOrbitState({\n        startZoomViewport: viewport,\n        startZoomPos: pos\n      });\n    }\n    /**\n     * Zoom\n     * @param {[Number, Number]} pos - position on screen where the current center is\n     * @param {[Number, Number]} startPos - the center position at\n     *   the start of the operation. Must be supplied of `zoomStart()` was not called\n     * @param {Number} scale - a number between [0, 1] specifying the accumulated\n     *   relative scale.\n     */\n\n  }, {\n    key: \"zoom\",\n    value: function zoom(_ref8) {\n      var pos = _ref8.pos,\n          startPos = _ref8.startPos,\n          scale = _ref8.scale;\n      var _this$_viewportProps = this._viewportProps,\n          zoom = _this$_viewportProps.zoom,\n          minZoom = _this$_viewportProps.minZoom,\n          maxZoom = _this$_viewportProps.maxZoom,\n          width = _this$_viewportProps.width,\n          height = _this$_viewportProps.height;\n      var startZoomPos = this._interactiveState.startZoomPos || startPos || pos;\n      var viewport = this._interactiveState.startZoomViewport || new _orbitViewport.default(this._viewportProps);\n      var newZoom = (0, _math.clamp)(zoom * scale, minZoom, maxZoom);\n      var deltaX = pos[0] - startZoomPos[0];\n      var deltaY = pos[1] - startZoomPos[1]; // Zoom around the center position\n\n      var cx = startZoomPos[0] - width / 2;\n      var cy = height / 2 - startZoomPos[1];\n      var center = viewport.project(viewport.lookAt);\n      var newCenterX = center[0] - cx + cx * newZoom / zoom + deltaX;\n      var newCenterY = center[1] + cy - cy * newZoom / zoom - deltaY;\n      var newLookAt = viewport.unproject([newCenterX, newCenterY, center[2]]);\n      return this._getUpdatedOrbitState({\n        lookAt: newLookAt,\n        zoom: newZoom\n      });\n    }\n    /**\n     * End zooming\n     * Must call if `zoomStart()` was called\n     */\n\n  }, {\n    key: \"zoomEnd\",\n    value: function zoomEnd() {\n      return this._getUpdatedOrbitState({\n        startZoomPos: null\n      });\n    }\n    /* Private methods */\n\n  }, {\n    key: \"_getUpdatedOrbitState\",\n    value: function _getUpdatedOrbitState(newProps) {\n      // Update _viewportProps\n      return new OrbitState(Object.assign({}, this._viewportProps, this._interactiveState, newProps));\n    } // Apply any constraints (mathematical or defined by _viewportProps) to map state\n\n  }, {\n    key: \"_applyConstraints\",\n    value: function _applyConstraints(props) {\n      // Ensure zoom is within specified range\n      var maxZoom = props.maxZoom,\n          minZoom = props.minZoom,\n          zoom = props.zoom;\n      props.zoom = zoom > maxZoom ? maxZoom : zoom;\n      props.zoom = zoom < minZoom ? minZoom : zoom;\n      return props;\n    }\n  }]);\n\n  return OrbitState;\n}();\n\nvar OrbitController =\n/*#__PURE__*/\nfunction (_Controller) {\n  _inherits(OrbitController, _Controller);\n\n  function OrbitController(props) {\n    _classCallCheck(this, OrbitController);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(OrbitController).call(this, OrbitState, props));\n  }\n\n  _createClass(OrbitController, [{\n    key: \"_getTransitionProps\",\n    value: function _getTransitionProps() {\n      // Enable transitions for zoom change\n      return ZOOM_TRANSITION_PROPS;\n    }\n  }]);\n\n  return OrbitController;\n}(_controller.default);\n\nexports.default = OrbitController;\n},{\"math.gl\":\"o5CE\",\"./controller\":\"SwtL\",\"../deprecated/orbit-viewport\":\"ebMd\",\"../utils/assert\":\"R2tg\",\"../transitions/linear-interpolator\":\"Xz4u\",\"./transition-manager\":\"nTOp\"}],\"LV3A\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _view = _interopRequireDefault(require(\"./view\"));\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar _mathUtils = require(\"../utils/math-utils\");\n\nvar mat4 = _interopRequireWildcard(require(\"gl-matrix/mat4\"));\n\nvar _orbitController = _interopRequireDefault(require(\"../controllers/orbit-controller\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}\n\nfunction _iterableToArray(iter) {\n  if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n}\n\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n\n    return arr2;\n  }\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar DEGREES_TO_RADIANS = Math.PI / 180; // TODO - remove need for custom project overrides\n\nvar OrbitViewport =\n/*#__PURE__*/\nfunction (_Viewport) {\n  _inherits(OrbitViewport, _Viewport);\n\n  function OrbitViewport() {\n    _classCallCheck(this, OrbitViewport);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(OrbitViewport).apply(this, arguments));\n  }\n\n  _createClass(OrbitViewport, [{\n    key: \"project\",\n    value: function project(xyz) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref$topLeft = _ref.topLeft,\n          topLeft = _ref$topLeft === void 0 ? false : _ref$topLeft;\n\n      var v = (0, _mathUtils.transformVector)(this.pixelProjectionMatrix, [].concat(_toConsumableArray(xyz), [1]));\n\n      var _v = _slicedToArray(v, 3),\n          x = _v[0],\n          y = _v[1],\n          z = _v[2];\n\n      var y2 = topLeft ? this.height - y : y;\n      return [x, y2, z];\n    }\n  }, {\n    key: \"unproject\",\n    value: function unproject(xyz) {\n      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref2$topLeft = _ref2.topLeft,\n          topLeft = _ref2$topLeft === void 0 ? false : _ref2$topLeft;\n\n      var _xyz = _slicedToArray(xyz, 3),\n          x = _xyz[0],\n          y = _xyz[1],\n          z = _xyz[2];\n\n      var y2 = topLeft ? this.height - y : y;\n      return (0, _mathUtils.transformVector)(this.pixelUnprojectionMatrix, [x, y2, z, 1]);\n    }\n  }]);\n\n  return OrbitViewport;\n}(_viewport.default);\n\nvar OrbitView =\n/*#__PURE__*/\nfunction (_View) {\n  _inherits(OrbitView, _View);\n\n  function OrbitView() {\n    _classCallCheck(this, OrbitView);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(OrbitView).apply(this, arguments));\n  }\n\n  _createClass(OrbitView, [{\n    key: \"_getViewport\",\n\n    /* eslint-disable complexity, max-statements */\n    value: function _getViewport(props) {\n      var viewState = props.viewState;\n      var width = props.width || 1;\n      var height = props.height || 1; // Get view matrix parameters from view state\n      // Projection matrix arguments\n      // TODO - Extracting from viewState is deprecated\n\n      var fovy = props.fov || props.fovy || viewState.fovy || 75; // Field of view covered by camera\n\n      var near = props.near || viewState.near || 1; // Distance of near clipping plane\n\n      var far = props.far || viewState.far || 100; // Distance of far clipping plane\n\n      var aspect = Number.isFinite(viewState.aspect) ? viewState.aspect : width / height;\n      var fovyRadians = fovy * DEGREES_TO_RADIANS;\n      return new OrbitViewport({\n        id: this.id,\n        viewMatrix: this._getViewMatrix(props.viewState),\n        projectionMatrix: mat4.perspective([], fovyRadians, aspect, near, far),\n        x: props.x,\n        y: props.y,\n        width: width,\n        height: height\n      });\n    }\n    /* eslint-enable complexity, max-statements */\n\n  }, {\n    key: \"_getViewMatrix\",\n    value: function _getViewMatrix(viewState) {\n      var distance = viewState.distance,\n          _viewState$rotationX = viewState.rotationX,\n          rotationX = _viewState$rotationX === void 0 ? 0 : _viewState$rotationX,\n          _viewState$rotationOr = viewState.rotationOrbit,\n          rotationOrbit = _viewState$rotationOr === void 0 ? 0 : _viewState$rotationOr,\n          _viewState$orbitAxis = viewState.orbitAxis,\n          orbitAxis = _viewState$orbitAxis === void 0 ? 'Z' : _viewState$orbitAxis,\n          _viewState$lookAt = viewState.lookAt,\n          lookAt = _viewState$lookAt === void 0 ? [0, 0, 0] : _viewState$lookAt,\n          _viewState$up = viewState.up,\n          up = _viewState$up === void 0 ? [0, 1, 0] : _viewState$up,\n          _viewState$zoom = viewState.zoom,\n          zoom = _viewState$zoom === void 0 ? 1 : _viewState$zoom;\n      var rotationMatrix = mat4.rotateX([], (0, _mathUtils.createMat4)(), -rotationX / 180 * Math.PI);\n\n      if (orbitAxis === 'Z') {\n        mat4.rotateZ(rotationMatrix, rotationMatrix, -rotationOrbit / 180 * Math.PI);\n      } else {\n        mat4.rotateY(rotationMatrix, rotationMatrix, -rotationOrbit / 180 * Math.PI);\n      }\n\n      var translateMatrix = (0, _mathUtils.createMat4)();\n      mat4.scale(translateMatrix, translateMatrix, [zoom, zoom, zoom]);\n      mat4.translate(translateMatrix, translateMatrix, [-lookAt[0], -lookAt[1], -lookAt[2]]);\n      var viewMatrix = mat4.lookAt([], [0, 0, distance], [0, 0, 0], up);\n      mat4.multiply(viewMatrix, viewMatrix, mat4.multiply(rotationMatrix, rotationMatrix, translateMatrix));\n      return viewMatrix;\n    }\n    /** Move camera to make a model bounding box centered at lookat position fit in the viewport.\n     * @param {Array} boundingBox - [sizeX, sizeY, sizeZ]], define the dimensions of bounding box\n     * @returns a new OrbitViewport object\n     */\n\n  }, {\n    key: \"fitBounds\",\n    value: function fitBounds(boundingBox, viewState) {\n      var width = this.width,\n          height = this.height,\n          fov = this.fov,\n          near = this.near,\n          far = this.far;\n      return this._getViewport({\n        width: width,\n        height: height,\n        fov: fov,\n        near: near,\n        far: far\n      });\n    }\n  }, {\n    key: \"controller\",\n    get: function get() {\n      return this._getControllerProps({\n        type: _orbitController.default\n      });\n    }\n  }], [{\n    key: \"getDistance\",\n    // Get camera `distance` to make view fit a box centered at lookat position in the viewport.\n    // @param {Array} boundingBox - [sizeX, sizeY, sizeZ]], defines the dimensions of bounding box\n    value: function getDistance(_ref3) {\n      var boundingBox = _ref3.boundingBox,\n          fov = _ref3.fov;\n      var halfMaxSide = Math.max(boundingBox[0], boundingBox[1], boundingBox[2]) / 2;\n      var distance = halfMaxSide / Math.tan(fov / 180 * Math.PI / 2);\n      return distance;\n    }\n  }]);\n\n  return OrbitView;\n}(_view.default);\n\nexports.default = OrbitView;\nOrbitView.displayName = 'OrbitView';\n},{\"./view\":\"Xp7T\",\"../viewports/viewport\":\"sjPB\",\"../utils/math-utils\":\"ocTz\",\"gl-matrix/mat4\":\"WdlT\",\"../controllers/orbit-controller\":\"w9Ay\"}],\"DBqP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _view = _interopRequireDefault(require(\"./view\"));\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar mat4 = _interopRequireWildcard(require(\"gl-matrix/mat4\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar DEGREES_TO_RADIANS = Math.PI / 180;\n\nvar PerspectiveView =\n/*#__PURE__*/\nfunction (_View) {\n  _inherits(PerspectiveView, _View);\n\n  function PerspectiveView() {\n    _classCallCheck(this, PerspectiveView);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(PerspectiveView).apply(this, arguments));\n  }\n\n  _createClass(PerspectiveView, [{\n    key: \"_getViewport\",\n    value: function _getViewport(props) {\n      var x = props.x,\n          y = props.y,\n          width = props.width,\n          height = props.height,\n          viewState = props.viewState;\n      var eye = viewState.eye,\n          _viewState$lookAt = viewState.lookAt,\n          lookAt = _viewState$lookAt === void 0 ? [0, 0, 0] : _viewState$lookAt,\n          _viewState$up = viewState.up,\n          up = _viewState$up === void 0 ? [0, 1, 0] : _viewState$up; // Projection matrix arguments\n      // TODO - Extracting from viewState is deprecated\n\n      var fovy = props.fovy || viewState.fovy || 75; // Field of view covered by camera\n\n      var near = props.near || viewState.near || 1; // Distance of near clipping plane\n\n      var far = props.far || viewState.far || 100; // Distance of far clipping plane\n\n      var aspect = Number.isFinite(viewState.aspect) ? viewState.aspect : width / height;\n      var fovyRadians = fovy * DEGREES_TO_RADIANS;\n      return new _viewport.default({\n        id: this.id,\n        x: x,\n        y: y,\n        width: width,\n        height: height,\n        viewMatrix: mat4.lookAt([], eye, lookAt, up),\n        projectionMatrix: mat4.perspective([], fovyRadians, aspect, near, far)\n      });\n    }\n  }]);\n\n  return PerspectiveView;\n}(_view.default);\n\nexports.default = PerspectiveView;\nPerspectiveView.displayName = 'PerspectiveView';\n},{\"./view\":\"Xp7T\",\"../viewports/viewport\":\"sjPB\",\"gl-matrix/mat4\":\"WdlT\"}],\"UtQX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _controller = _interopRequireDefault(require(\"./controller\"));\n\nvar _viewState = _interopRequireDefault(require(\"./view-state\"));\n\nvar _math = require(\"math.gl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar MOVEMENT_SPEED = 10; // per keyboard click\n\nvar DEFAULT_STATE = {\n  zoom: 0,\n  offset: [0, 0],\n  minZoom: -10,\n  maxZoom: 10\n};\n\nvar zoom2Scale = function zoom2Scale(zoom) {\n  return Math.pow(2, zoom);\n};\n\nvar OrthographicState =\n/*#__PURE__*/\nfunction (_ViewState) {\n  _inherits(OrthographicState, _ViewState);\n\n  function OrthographicState(_ref) {\n    var _this;\n\n    var width = _ref.width,\n        height = _ref.height,\n        _ref$offset = _ref.offset,\n        offset = _ref$offset === void 0 ? DEFAULT_STATE.offset : _ref$offset,\n        _ref$zoom = _ref.zoom,\n        zoom = _ref$zoom === void 0 ? DEFAULT_STATE.zoom : _ref$zoom,\n        _ref$minZoom = _ref.minZoom,\n        minZoom = _ref$minZoom === void 0 ? DEFAULT_STATE.minZoom : _ref$minZoom,\n        _ref$maxZoom = _ref.maxZoom,\n        maxZoom = _ref$maxZoom === void 0 ? DEFAULT_STATE.maxZoom : _ref$maxZoom,\n        startPanPosition = _ref.startPanPosition,\n        startPanOffset = _ref.startPanOffset,\n        startZoomPosition = _ref.startZoomPosition,\n        startZoom = _ref.startZoom;\n\n    _classCallCheck(this, OrthographicState);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(OrthographicState).call(this, {\n      width: width,\n      height: height,\n      offset: offset,\n      zoom: zoom,\n      minZoom: minZoom,\n      maxZoom: maxZoom\n    }));\n    _this._interactiveState = {\n      startPanPosition: startPanPosition,\n      startPanOffset: startPanOffset,\n      startZoomPosition: startZoomPosition,\n      startZoom: startZoom\n    };\n    return _this;\n  }\n  /* Public API */\n\n\n  _createClass(OrthographicState, [{\n    key: \"getInteractiveState\",\n    value: function getInteractiveState() {\n      return this._interactiveState;\n    }\n    /**\n     * Start panning\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"panStart\",\n    value: function panStart(_ref2) {\n      var pos = _ref2.pos;\n      var offset = this._viewportProps.offset;\n      return this._getUpdatedState({\n        startPanPosition: pos,\n        startPanOffset: offset\n      });\n    }\n    /**\n     * Pan\n     * @param {[Number, Number]} pos - position on screen where the pointer is\n     */\n\n  }, {\n    key: \"pan\",\n    value: function pan(_ref3) {\n      var pos = _ref3.pos;\n      var _this$_interactiveSta = this._interactiveState,\n          startPanPosition = _this$_interactiveSta.startPanPosition,\n          startPanOffset = _this$_interactiveSta.startPanOffset;\n      var delta = new _math.Vector2(pos).subtract(startPanPosition);\n      return this._getUpdatedState({\n        offset: new _math.Vector2(startPanOffset).subtract(delta)\n      });\n    }\n    /**\n     * End panning\n     * Must call if `panStart()` was called\n     */\n\n  }, {\n    key: \"panEnd\",\n    value: function panEnd() {\n      return this._getUpdatedState({\n        startPanPosition: null,\n        startPanOffset: null\n      });\n    }\n    /**\n     * Start rotating\n     * @param {[Number, Number]} pos - position on screen where the pointer grabs\n     */\n\n  }, {\n    key: \"rotateStart\",\n    value: function rotateStart(_ref4) {\n      var pos = _ref4.pos;\n      return this;\n    }\n    /**\n     * Rotate\n     * @param {[Number, Number]} pos - position on screen where the pointer is\n     */\n\n  }, {\n    key: \"rotate\",\n    value: function rotate(_ref5) {\n      var deltaScaleX = _ref5.deltaScaleX,\n          deltaScaleY = _ref5.deltaScaleY;\n      return this;\n    }\n    /**\n     * End rotating\n     * Must call if `rotateStart()` was called\n     */\n\n  }, {\n    key: \"rotateEnd\",\n    value: function rotateEnd() {\n      return this;\n    } // Calculates new zoom\n\n  }, {\n    key: \"_calculateNewZoom\",\n    value: function _calculateNewZoom(_ref6) {\n      var scale = _ref6.scale,\n          startZoom = _ref6.startZoom;\n      var _this$_viewportProps = this._viewportProps,\n          maxZoom = _this$_viewportProps.maxZoom,\n          minZoom = _this$_viewportProps.minZoom;\n      var zoom = startZoom + Math.log2(scale);\n      return (0, _math.clamp)(zoom, minZoom, maxZoom);\n    }\n    /**\n     * Start zooming\n     * @param {[Number, Number]} pos - position on screen where the center is\n     */\n\n  }, {\n    key: \"zoomStart\",\n    value: function zoomStart(_ref7) {\n      var pos = _ref7.pos;\n      return this._getUpdatedState({\n        startZoomPosition: pos,\n        startZoom: this._viewportProps.zoom\n      });\n    }\n    /**\n     * Zoom\n     * @param {Number} scale - a number between [0, 1] specifying the accumulated\n     *   relative scale.\n     * @param {[number, number]} pos - current mouse cursor screen position\n     */\n\n  }, {\n    key: \"zoom\",\n    value: function zoom(_ref8) {\n      var pos = _ref8.pos,\n          startPos = _ref8.startPos,\n          scale = _ref8.scale;\n      var _this$_viewportProps2 = this._viewportProps,\n          zoom = _this$_viewportProps2.zoom,\n          width = _this$_viewportProps2.width,\n          height = _this$_viewportProps2.height,\n          offset = _this$_viewportProps2.offset;\n      var _this$_interactiveSta2 = this._interactiveState,\n          startZoom = _this$_interactiveSta2.startZoom,\n          startZoomPosition = _this$_interactiveSta2.startZoomPosition;\n\n      if (!Number.isFinite(startZoom)) {\n        // We have two modes of zoom:\n        // scroll zoom that are discrete events (transform from the current zoom level),\n        // and pinch zoom that are continuous events (transform from the zoom level when\n        // pinch started).\n        // If startZoom state is defined, then use the startZoom state;\n        // otherwise assume discrete zooming\n        startZoom = zoom;\n        startZoomPosition = startPos || pos;\n      }\n\n      var newZoom = this._calculateNewZoom({\n        scale: scale,\n        startZoom: startZoom\n      });\n\n      var startScale = zoom2Scale(startZoom);\n      var newScale = zoom2Scale(newZoom);\n      var centerX = width / 2 - offset[0];\n      var centerY = height / 2 - offset[1];\n      var dX = (startZoomPosition[0] - centerX) * (newScale / startScale - 1);\n      var dY = (startZoomPosition[1] - centerY) * (newScale / startScale - 1);\n      return this._getUpdatedState({\n        zoom: newZoom,\n        offset: [offset[0] + dX, offset[1] + dY]\n      });\n    }\n    /**\n     * End zooming\n     * Must call if `zoomStart()` was called\n     */\n\n  }, {\n    key: \"zoomEnd\",\n    value: function zoomEnd() {\n      return this._getUpdatedState({\n        startZoomPosition: null,\n        startZoom: null\n      });\n    }\n  }, {\n    key: \"_zoomFromCenter\",\n    value: function _zoomFromCenter(scale) {\n      var _this$_viewportProps3 = this._viewportProps,\n          width = _this$_viewportProps3.width,\n          height = _this$_viewportProps3.height,\n          offset = _this$_viewportProps3.offset;\n      return this.zoom({\n        pos: [width / 2 - offset[0], height / 2 - offset[1]],\n        scale: scale\n      });\n    }\n  }, {\n    key: \"zoomIn\",\n    value: function zoomIn() {\n      return this._zoomFromCenter(2);\n    }\n  }, {\n    key: \"zoomOut\",\n    value: function zoomOut() {\n      return this._zoomFromCenter(0.5);\n    }\n  }, {\n    key: \"moveLeft\",\n    value: function moveLeft() {\n      var offset = this._viewportProps.offset;\n      var delta = [MOVEMENT_SPEED, 0];\n      return this._getUpdatedState({\n        offset: new _math.Vector2(offset).add(delta)\n      });\n    }\n  }, {\n    key: \"moveRight\",\n    value: function moveRight() {\n      var offset = this._viewportProps.offset;\n      var delta = [-MOVEMENT_SPEED, 0];\n      return this._getUpdatedState({\n        offset: new _math.Vector2(offset).add(delta)\n      });\n    }\n  }, {\n    key: \"moveUp\",\n    value: function moveUp() {\n      var offset = this._viewportProps.offset;\n      var delta = [0, MOVEMENT_SPEED];\n      return this._getUpdatedState({\n        offset: new _math.Vector2(offset).add(delta)\n      });\n    }\n  }, {\n    key: \"moveDown\",\n    value: function moveDown() {\n      var offset = this._viewportProps.offset;\n      var delta = [0, -MOVEMENT_SPEED];\n      return this._getUpdatedState({\n        offset: new _math.Vector2(offset).add(delta)\n      });\n    }\n    /* Private methods */\n\n  }, {\n    key: \"_getUpdatedState\",\n    value: function _getUpdatedState(newProps) {\n      // Update _viewportProps\n      return new OrthographicState(Object.assign({}, this._viewportProps, this._interactiveState, newProps));\n    }\n  }]);\n\n  return OrthographicState;\n}(_viewState.default);\n\nvar OrthographicController =\n/*#__PURE__*/\nfunction (_Controller) {\n  _inherits(OrthographicController, _Controller);\n\n  function OrthographicController(props) {\n    var _this2;\n\n    _classCallCheck(this, OrthographicController);\n\n    _this2 = _possibleConstructorReturn(this, _getPrototypeOf(OrthographicController).call(this, OrthographicState, props));\n    _this2.invertPan = true;\n    return _this2;\n  }\n\n  _createClass(OrthographicController, [{\n    key: \"_onPanRotate\",\n    value: function _onPanRotate(event) {\n      if (!this.dragRotate) {\n        return false;\n      }\n\n      return this._onPanRotateMap(event);\n    }\n  }]);\n\n  return OrthographicController;\n}(_controller.default);\n\nexports.default = OrthographicController;\n},{\"./controller\":\"SwtL\",\"./view-state\":\"VX0j\",\"math.gl\":\"o5CE\"}],\"j3nR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _view = _interopRequireDefault(require(\"./view\"));\n\nvar _viewport = _interopRequireDefault(require(\"../viewports/viewport\"));\n\nvar _math = require(\"math.gl\");\n\nvar _orthographicController = _interopRequireDefault(require(\"../controllers/orthographic-controller\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar OrthographicView =\n/*#__PURE__*/\nfunction (_View) {\n  _inherits(OrthographicView, _View);\n\n  function OrthographicView() {\n    _classCallCheck(this, OrthographicView);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(OrthographicView).apply(this, arguments));\n  }\n\n  _createClass(OrthographicView, [{\n    key: \"_getViewport\",\n    value: function _getViewport(_ref) {\n      var x = _ref.x,\n          y = _ref.y,\n          width = _ref.width,\n          height = _ref.height,\n          viewState = _ref.viewState; // Get view matrix parameters from view state\n\n      var _viewState$offset = viewState.offset,\n          offset = _viewState$offset === void 0 ? [0, 0] : _viewState$offset,\n          _viewState$zoom = viewState.zoom,\n          zoom = _viewState$zoom === void 0 ? 0 : _viewState$zoom; // Make sure Matrix4.ortho doesn't crash on 0 width/height\n\n      width = width || 1;\n      height = height || 1;\n      var scale = Math.pow(2, zoom); // Get projection matrix parameters from the view itself\n      // NOTE: automatically calculated from width and height if not provided\n\n      var _this$props = this.props,\n          _this$props$eye = _this$props.eye,\n          eye = _this$props$eye === void 0 ? [0, 0, 1] : _this$props$eye,\n          _this$props$lookAt = _this$props.lookAt,\n          lookAt = _this$props$lookAt === void 0 ? [0, 0, 0] : _this$props$lookAt,\n          _this$props$up = _this$props.up,\n          up = _this$props$up === void 0 ? [0, 1, 0] : _this$props$up,\n          _this$props$left = _this$props.left,\n          left = _this$props$left === void 0 ? (-width / 2 + offset[0]) / scale : _this$props$left,\n          _this$props$top = _this$props.top,\n          top = _this$props$top === void 0 ? (-height / 2 + offset[1]) / scale : _this$props$top,\n          _this$props$right = _this$props.right,\n          right = _this$props$right === void 0 ? (width / 2 + offset[0]) / scale : _this$props$right,\n          _this$props$bottom = _this$props.bottom,\n          bottom = _this$props$bottom === void 0 ? (height / 2 + offset[1]) / scale : _this$props$bottom,\n          _this$props$near = _this$props.near,\n          near = _this$props$near === void 0 ? 1 : _this$props$near,\n          _this$props$far = _this$props.far,\n          far = _this$props$far === void 0 ? 100 : _this$props$far;\n      return new _viewport.default({\n        id: this.id,\n        x: x,\n        y: y,\n        width: width,\n        height: height,\n        viewMatrix: new _math.Matrix4().lookAt({\n          eye: eye,\n          lookAt: lookAt,\n          up: up\n        }),\n        projectionMatrix: new _math.Matrix4().ortho({\n          left: left,\n          right: right,\n          bottom: bottom,\n          top: top,\n          near: near,\n          far: far\n        }),\n        zoom: zoom\n      });\n    }\n  }, {\n    key: \"controller\",\n    get: function get() {\n      return this._getControllerProps({\n        type: _orthographicController.default\n      });\n    }\n  }]);\n\n  return OrthographicView;\n}(_view.default);\n\nexports.default = OrthographicView;\nOrthographicView.displayName = 'OrthographicView';\n},{\"./view\":\"Xp7T\",\"../viewports/viewport\":\"sjPB\",\"math.gl\":\"o5CE\",\"../controllers/orthographic-controller\":\"UtQX\"}],\"UdFb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME reflection-effect-vs\\n\\nattribute vec3 vertices;\\n\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  uv = vertices.xy;\\n  gl_Position = vec4(2. * vertices.xy - vec2(1., 1.), 1., 1.);\\n}\\n\";\nexports.default = _default;\n},{}],\"UTNB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME reflection-effect-fs\\n\\nprecision highp float;\\n\\nuniform sampler2D reflectionTexture;\\nuniform int reflectionTextureWidth;\\nuniform int reflectionTextureHeight;\\n\\nuniform float reflectivity;\\nuniform float blur;\\n\\n\\nvarying vec2 uv;\\n\\n#define KERNEL_SIZE 7\\n\\n/*\\n * Samples from tex with a gaussian-shaped patch, centered at uv and\\n * with standard deviation sigma.  The size of the texture in\\n * pixels must be specified by dim\\n */\\nvec4 sample_gaussian(sampler2D tex, vec2 dim, vec2 uv, float sigma) {\\n  if (sigma == 0.0) {\\n    return texture2D(tex, uv);\\n  }\\n\\n  vec2 delta = 1.0 / dim;\\n  vec2 top_left = uv - delta * float(KERNEL_SIZE+1) / 2.0;\\n\\n  vec4 color = vec4(0);\\n  float sum = 0.0;\\n  for (int i = 0; i <  KERNEL_SIZE; ++i) {\\n    for (int j = 0; j < KERNEL_SIZE; ++j) {\\n      vec2 uv2 = top_left + vec2(i, j) * delta;\\n      float d = length((uv2 - uv) * dim);\\n      float f = exp(-(d*d) / (2.0*sigma * sigma));\\n      color += f * texture2D(tex, uv2);\\n      sum += f;\\n    }\\n  }\\n  return color / sum;\\n}\\n\\nvoid main(void) {\\n  //map blur in [0, 1] to sigma in [0, inf]\\n  //alpha will determine the \\\"steepness\\\" of our curve.\\n  //this was picked just to make the scale feel \\\"natural\\\"\\n  //if our image is 1000 pixels wide, a blur of 0.5 should correspond\\n  //to a sigma of 1 pixels\\n  float alpha = 1000.0;\\n  float sigma = blur / (alpha * (1.0 - blur));\\n  //let this be our standard deviation in terms of screen-widths.\\n  //rewrite this in terms of pixels.\\n  sigma *= float(reflectionTextureWidth);\\n\\n\\n  gl_FragColor = sample_gaussian(reflectionTexture, vec2(reflectionTextureWidth,\\n    reflectionTextureHeight), vec2(uv.x, 1. - uv.y), sigma);\\n  //because our canvas expects alphas to be pre-multiplied, we multiply by whole\\n  //color vector by reflectivity, not just the alpha channel\\n  gl_FragColor *= reflectivity;\\n}\\n\";\nexports.default = _default;\n},{}],\"mNRu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _effect = _interopRequireDefault(require(\"../lib/effect\"));\n\nvar _webMercatorViewport = _interopRequireDefault(require(\"../../viewports/web-mercator-viewport\"));\n\nvar _reflectionEffectVertex = _interopRequireDefault(require(\"./reflection-effect-vertex.glsl\"));\n\nvar _reflectionEffectFragment = _interopRequireDefault(require(\"./reflection-effect-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* global window */\n\n\nvar ReflectionEffect =\n/*#__PURE__*/\nfunction (_Effect) {\n  _inherits(ReflectionEffect, _Effect);\n  /**\n   * @classdesc\n   * ReflectionEffect\n   *\n   * @class\n   * @param reflectivity How visible reflections should be over the map, between 0 and 1\n   * @param blur how blurry the reflection should be, between 0 and 1\n   */\n\n\n  function ReflectionEffect() {\n    var _this;\n\n    var reflectivity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0.5;\n    var blur = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.5;\n\n    _classCallCheck(this, ReflectionEffect);\n\n    _this = _possibleConstructorReturn(this, _getPrototypeOf(ReflectionEffect).call(this));\n    _this.reflectivity = reflectivity;\n    _this.blur = blur;\n    _this.framebuffer = null;\n\n    _this.setNeedsRedraw();\n\n    return _this;\n  }\n\n  _createClass(ReflectionEffect, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      return {\n        vs: _reflectionEffectVertex.default,\n        fs: _reflectionEffectFragment.default,\n        modules: [],\n        shaderCache: this.context.shaderCache\n      };\n    }\n  }, {\n    key: \"initialize\",\n    value: function initialize(_ref) {\n      var gl = _ref.gl,\n          layerManager = _ref.layerManager;\n      this.unitQuad = new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: 'reflection-effect',\n        geometry: new _luma.Geometry({\n          drawMode: _constants.default.TRIANGLE_FAN,\n          vertices: new Float32Array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0])\n        })\n      }));\n      this.framebuffer = new _luma.Framebuffer(gl, {\n        depth: true\n      });\n    }\n  }, {\n    key: \"preDraw\",\n    value: function preDraw(_ref2) {\n      var gl = _ref2.gl,\n          layerManager = _ref2.layerManager;\n      var viewport = layerManager.context.viewport;\n      /*\n       * the renderer already has a reference to this, but we don't have a reference to the renderer.\n       * when we refactor the camera code, we should make sure we get a reference to the renderer so\n       * that we can keep this in one place.\n       */\n\n      var dpi = typeof window !== 'undefined' && window.devicePixelRatio || 1;\n      this.framebuffer.resize({\n        width: dpi * viewport.width,\n        height: dpi * viewport.height\n      });\n      var pitch = viewport.pitch;\n      this.framebuffer.bind();\n      /* this is a huge hack around the existing viewport class.\n       * TODO in the future, once we implement bona-fide cameras, we really need to fix this.\n       */\n\n      layerManager.setViewport(new _webMercatorViewport.default(Object.assign({}, viewport, {\n        pitch: -180 - pitch\n      })));\n      gl.clear(_constants.default.COLOR_BUFFER_BIT | _constants.default.DEPTH_BUFFER_BIT);\n      layerManager.drawLayers({\n        pass: 'reflection'\n      });\n      layerManager.setViewport(viewport);\n      this.framebuffer.unbind();\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref3) {\n      var gl = _ref3.gl,\n          layerManager = _ref3.layerManager;\n      /*\n       * Render our unit quad.\n       * This will cover the entire screen, but will lie behind all other geometry.\n       * This quad will sample the previously generated reflection texture\n       * in order to create the reflection effect\n       */\n\n      this.unitQuad.render({\n        reflectionTexture: this.framebuffer.texture,\n        reflectionTextureWidth: this.framebuffer.width,\n        reflectionTextureHeight: this.framebuffer.height,\n        reflectivity: this.reflectivity,\n        blur: this.blur\n      });\n    }\n  }, {\n    key: \"finalize\",\n    value: function finalize(_ref4) {\n      /* TODO: Free resources? */\n      var gl = _ref4.gl,\n          layerManager = _ref4.layerManager;\n    }\n  }]);\n\n  return ReflectionEffect;\n}(_effect.default);\n\nexports.default = ReflectionEffect;\n},{\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"../lib/effect\":\"bkMp\",\"../../viewports/web-mercator-viewport\":\"RWhD\",\"./reflection-effect-vertex.glsl\":\"UdFb\",\"./reflection-effect-fragment.glsl\":\"UTNB\"}],\"WZGr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _transitionInterpolator = _interopRequireDefault(require(\"./transition-interpolator\"));\n\nvar _math = require(\"math.gl\");\n\nvar _viewportMercatorProject = require(\"viewport-mercator-project\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nvar LINEARLY_INTERPOLATED_PROPS = ['bearing', 'pitch'];\n/**\n * This class adapts mapbox-gl-js Map#flyTo animation so it can be used in\n * react/redux architecture.\n * mapbox-gl-js flyTo : https://www.mapbox.com/mapbox-gl-js/api/#map#flyto.\n * It implements “Smooth and efficient zooming and panning.” algorithm by\n * \"Jarke J. van Wijk and Wim A.A. Nuij\"\n */\n\nvar FlyToInterpolator =\n/*#__PURE__*/\nfunction (_TransitionInterpolat) {\n  _inherits(FlyToInterpolator, _TransitionInterpolat);\n\n  function FlyToInterpolator() {\n    _classCallCheck(this, FlyToInterpolator);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(FlyToInterpolator).call(this, {\n      compare: ['longitude', 'latitude', 'zoom', 'bearing', 'pitch'],\n      extract: ['width', 'height', 'longitude', 'latitude', 'zoom', 'bearing', 'pitch'],\n      required: ['width', 'height', 'latitude', 'longitude', 'zoom']\n    }));\n  }\n\n  _createClass(FlyToInterpolator, [{\n    key: \"interpolateProps\",\n    value: function interpolateProps(startProps, endProps, t) {\n      var viewport = (0, _viewportMercatorProject.flyToViewport)(startProps, endProps, t); // Linearly interpolate 'bearing' and 'pitch'.\n      // If pitch/bearing are not supplied, they are interpreted as zeros in viewport calculation\n      // (fallback defined in WebMercatorViewport)\n      // Because there is no guarantee that the current controller's ViewState normalizes\n      // these props, safe guard is needed to avoid generating NaNs\n\n      for (var _i = 0; _i < LINEARLY_INTERPOLATED_PROPS.length; _i++) {\n        var key = LINEARLY_INTERPOLATED_PROPS[_i];\n        viewport[key] = (0, _math.lerp)(startProps[key] || 0, endProps[key] || 0, t);\n      }\n\n      return viewport;\n    }\n  }]);\n\n  return FlyToInterpolator;\n}(_transitionInterpolator.default);\n\nexports.default = FlyToInterpolator;\n},{\"./transition-interpolator\":\"JVWZ\",\"math.gl\":\"o5CE\",\"viewport-mercator-project\":\"ha5B\"}],\"XSeO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// getValue takes an array of points returns a value to sort the bins on.\n// by default it returns the number of points\n// this is where to pass in a function to color the bins by\n// avg/mean/max of specific value of the point\n\n\nvar defaultGetValue = function defaultGetValue(points) {\n  return points.length;\n};\n\nvar BinSorter =\n/*#__PURE__*/\nfunction () {\n  function BinSorter() {\n    var bins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n    var getValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultGetValue;\n\n    _classCallCheck(this, BinSorter);\n\n    this.sortedBins = this.getSortedBins(bins, getValue);\n    this.maxCount = this.getMaxCount();\n    this.binMap = this.getBinMap();\n  }\n  /**\n   * Get an array of object with sorted values and index of bins\n   * @param {Array} bins\n   * @param {Function} getValue\n   * @return {Array} array of values and index lookup\n   */\n\n\n  _createClass(BinSorter, [{\n    key: \"getSortedBins\",\n    value: function getSortedBins(bins, getValue) {\n      return bins.reduce(function (accu, h, i) {\n        var value = getValue(h.points);\n\n        if (value !== null && value !== undefined) {\n          // filter bins if value is null or undefined\n          accu.push({\n            i: Number.isFinite(h.index) ? h.index : i,\n            value: value,\n            counts: h.points.length\n          });\n        }\n\n        return accu;\n      }, []).sort(function (a, b) {\n        return a.value - b.value;\n      });\n    }\n    /**\n     * Get range of values of all bins\n     * @param {Number[]} range\n     * @param {Number} range[0] - lower bound\n     * @param {Number} range[1] - upper bound\n     * @return {Array} array of new value range\n     */\n\n  }, {\n    key: \"getValueRange\",\n    value: function getValueRange(_ref) {\n      var _ref2 = _slicedToArray(_ref, 2),\n          lower = _ref2[0],\n          upper = _ref2[1];\n\n      var len = this.sortedBins.length;\n\n      if (!len) {\n        return [0, 0];\n      }\n\n      var lowerIdx = Math.ceil(lower / 100 * (len - 1));\n      var upperIdx = Math.floor(upper / 100 * (len - 1));\n      return [this.sortedBins[lowerIdx].value, this.sortedBins[upperIdx].value];\n    }\n    /**\n     * Get ths max count of all bins\n     * @return {Number | Boolean} max count\n     */\n\n  }, {\n    key: \"getMaxCount\",\n    value: function getMaxCount() {\n      var maxCount = 0;\n      this.sortedBins.forEach(function (x) {\n        return maxCount = maxCount > x.counts ? maxCount : x.counts;\n      });\n      return maxCount;\n    }\n    /**\n     * Get a mapping from cell/hexagon index to sorted bin\n     * This is used to retrieve bin value for color calculation\n     * @return {Object} bin index to sortedBins\n     */\n\n  }, {\n    key: \"getBinMap\",\n    value: function getBinMap() {\n      return this.sortedBins.reduce(function (mapper, curr) {\n        return Object.assign(mapper, _defineProperty({}, curr.i, curr));\n      }, {});\n    }\n  }]);\n\n  return BinSorter;\n}();\n\nexports.default = BinSorter;\n},{}],\"kR6g\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _flatten = require(\"./flatten\");\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar TypedArrayManager =\n/*#__PURE__*/\nfunction () {\n  function TypedArrayManager() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        _ref$overAlloc = _ref.overAlloc,\n        overAlloc = _ref$overAlloc === void 0 ? 1 : _ref$overAlloc;\n\n    _classCallCheck(this, TypedArrayManager);\n\n    this.overAlloc = overAlloc;\n  }\n\n  _createClass(TypedArrayManager, [{\n    key: \"allocate\",\n    value: function allocate(typedArray, count, _ref2) {\n      var size = _ref2.size,\n          type = _ref2.type,\n          _ref2$copy = _ref2.copy,\n          copy = _ref2$copy === void 0 ? false : _ref2$copy;\n      var newSize = count * size;\n\n      if (typedArray && newSize <= typedArray.length) {\n        return typedArray;\n      } // Allocate at least one element to ensure a valid buffer\n\n\n      var allocSize = Math.max(Math.ceil(newSize * this.overAlloc), 1);\n\n      var newArray = this._allocate(type, allocSize);\n\n      if (typedArray && copy) {\n        newArray.set(typedArray);\n      }\n\n      this._release(typedArray);\n\n      return newArray;\n    }\n  }, {\n    key: \"_allocate\",\n    value: function _allocate() {\n      var Type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Float32Array;\n      var size = arguments.length > 1 ? arguments[1] : undefined;\n\n      if (Type === Uint16Array && size > 65535) {\n        throw new Error('Vertex count exceeds browser index limit');\n      } // TODO - check if available in pool\n\n\n      return new Type(size);\n    }\n  }, {\n    key: \"_release\",\n    value: function _release(typedArray) {// TODO - add to pool\n      // logFunctions.onUpdate({\n      //   level: LOG_DETAIL_PRIORITY,\n      //   message: `${attributeName} allocated ${allocCount}`,\n      //   id: this.id\n      // });\n    }\n  }]);\n\n  return TypedArrayManager;\n}();\n\nvar Tesselator =\n/*#__PURE__*/\nfunction () {\n  function Tesselator() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, Tesselator);\n\n    var _opts$attributes = opts.attributes,\n        attributes = _opts$attributes === void 0 ? {} : _opts$attributes;\n    this.typedArrayManager = new TypedArrayManager();\n    this.indexLayout = null;\n    this.bufferLayout = null;\n    this.vertexCount = 0;\n    this.instanceCount = 0;\n    this.attributes = {};\n    this._attributeDefs = attributes;\n    this.updateGeometry(opts);\n    Object.seal(this);\n  }\n  /* Public methods */\n\n\n  _createClass(Tesselator, [{\n    key: \"updateGeometry\",\n    value: function updateGeometry(_ref3) {\n      var data = _ref3.data,\n          getGeometry = _ref3.getGeometry,\n          positionFormat = _ref3.positionFormat,\n          fp64 = _ref3.fp64;\n      this.data = data;\n      this.getGeometry = getGeometry;\n      this.fp64 = fp64;\n      this.positionSize = positionFormat === 'XY' ? 2 : 3;\n\n      this._rebuildGeometry();\n    }\n  }, {\n    key: \"updatePartialGeometry\",\n    value: function updatePartialGeometry(_ref4) {\n      var start = _ref4.start,\n          count = _ref4.count,\n          objects = _ref4.objects;\n    } // TODO\n\n    /* Subclass interface */\n    // Update the positions of a single geometry\n\n  }, {\n    key: \"updateGeometryAttributes\",\n    value: function updateGeometryAttributes(geometry, startIndex, size) {\n      throw new Error('Not implemented');\n    } // Returns the number of vertices in a geometry\n\n  }, {\n    key: \"getGeometrySize\",\n    value: function getGeometrySize(geometry) {\n      throw new Error('Not implemented');\n    }\n    /* Private utility methods */\n\n    /**\n     * Visit all objects\n     * `data` is expected to be an iterable consistent with the base Layer expectation\n     */\n\n  }, {\n    key: \"_forEachGeometry\",\n    value: function _forEachGeometry(visitor) {\n      var data = this.data,\n          getGeometry = this.getGeometry;\n      var dataIndex = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n          var geometry = getGeometry(object);\n          visitor(geometry, dataIndex++);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"_updateAttribute\",\n    value: function _updateAttribute(_ref5) {\n      var target = _ref5.target,\n          size = _ref5.size,\n          getValue = _ref5.getValue;\n      var data = this.data,\n          bufferLayout = this.bufferLayout;\n      var i = 0;\n      var dataIndex = 0;\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = data[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var object = _step2.value;\n          var value = getValue(object, dataIndex);\n          var numVertices = bufferLayout[dataIndex++];\n          (0, _flatten.fillArray)({\n            target: target,\n            source: value,\n            start: i,\n            count: numVertices\n          });\n          i += numVertices * size;\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n\n      return target;\n    }\n  }, {\n    key: \"_rebuildGeometry\",\n    value: function _rebuildGeometry() {\n      var _this = this;\n\n      if (!this.data || !this.getGeometry) {\n        return;\n      } // count instances\n\n\n      var indexLayout = [];\n      var bufferLayout = [];\n      var instanceCount = 0;\n\n      this._forEachGeometry(function (geometry, dataIndex) {\n        var count = _this.getGeometrySize(geometry);\n\n        instanceCount += count;\n        bufferLayout[dataIndex] = count;\n      }); // allocate attributes\n\n\n      var attributes = this.attributes,\n          _attributeDefs = this._attributeDefs,\n          typedArrayManager = this.typedArrayManager,\n          fp64 = this.fp64;\n\n      for (var name in _attributeDefs) {\n        var def = _attributeDefs[name]; // do not create fp64-only attributes unless in fp64 mode\n\n        if (!def.fp64Only || fp64) {\n          attributes[name] = typedArrayManager.allocate(attributes[name], instanceCount, def);\n        }\n      }\n\n      this.indexLayout = indexLayout;\n      this.bufferLayout = bufferLayout;\n      this.instanceCount = instanceCount;\n      var context = {\n        vertexStart: 0,\n        indexStart: 0\n      };\n\n      this._forEachGeometry(function (geometry, dataIndex) {\n        var geometrySize = bufferLayout[dataIndex];\n        context.geometryIndex = dataIndex;\n        context.geometrySize = geometrySize;\n\n        _this.updateGeometryAttributes(geometry, context);\n\n        context.vertexStart += geometrySize;\n        context.indexStart += indexLayout[dataIndex] || 0;\n      });\n\n      this.vertexCount = context.indexStart;\n    }\n  }]);\n\n  return Tesselator;\n}();\n\nexports.default = Tesselator;\n},{\"./flatten\":\"XKEb\"}],\"beCw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.defaultColorRange = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar defaultColorRange = [[255, 255, 178], [254, 217, 118], [254, 178, 76], [253, 141, 60], [240, 59, 32], [189, 0, 38]];\nexports.defaultColorRange = defaultColorRange;\n},{}],\"HrU0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linearScale = linearScale;\nexports.quantizeScale = quantizeScale;\nexports.getQuantizeScale = getQuantizeScale;\nexports.getLinearScale = getLinearScale;\n\nvar _log = _interopRequireDefault(require(\"./log\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Linear scale maps continuous domain to continuous range\nfunction linearScale(domain, range, value) {\n  return (value - domain[0]) / (domain[1] - domain[0]) * (range[1] - range[0]) + range[0];\n} // Quantize scale is similar to linear scales,\n// except it uses a discrete rather than continuous range\n\n\nfunction quantizeScale(domain, range, value) {\n  var domainRange = domain[1] - domain[0];\n\n  if (domainRange <= 0) {\n    _log.default.warn('quantizeScale: invalid domain, returning range[0]')();\n\n    return range[0];\n  }\n\n  var step = domainRange / range.length;\n  var idx = Math.floor((value - domain[0]) / step);\n  var clampIdx = Math.max(Math.min(idx, range.length - 1), 0);\n  return range[clampIdx];\n} // return a quantize scale function\n\n\nfunction getQuantizeScale(domain, range) {\n  return function (value) {\n    return quantizeScale(domain, range, value);\n  };\n} // return a linear scale funciton\n\n\nfunction getLinearScale(domain, range) {\n  return function (value) {\n    return (value - domain[0]) / (domain[1] - domain[0]) * (range[1] - range[0]) + range[0];\n  };\n}\n},{\"./log\":\"mqAj\"}],\"ReP4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WEIGHT_SIZE = exports.PIXEL_SIZE = exports.IDENTITY_MATRIX = exports.DEFAULT_WEIGHT_PARAMS = exports.ELEMENTCOUNT = exports.EQUATION_MAP = exports.MAX_MIN_BLEND_EQUATION = exports.MAX_BLEND_EQUATION = exports.MIN_BLEND_EQUATION = exports.MAX_32_BIT_FLOAT = exports.DEFAULT_RUN_PARAMS = exports.DEFAULT_CHANGE_FLAGS = exports.AGGREGATION_OPERATION = void 0;\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _EQUATION_MAP;\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\n// public\nvar AGGREGATION_OPERATION = {\n  SUM: 1,\n  MEAN: 2,\n  MIN: 3,\n  MAX: 4\n}; // private\n\nexports.AGGREGATION_OPERATION = AGGREGATION_OPERATION;\nvar DEFAULT_CHANGE_FLAGS = {\n  dataChanged: true,\n  viewportChanged: true,\n  cellSizeChanged: true\n};\nexports.DEFAULT_CHANGE_FLAGS = DEFAULT_CHANGE_FLAGS;\nvar DEFAULT_RUN_PARAMS = {\n  changeFlags: DEFAULT_CHANGE_FLAGS,\n  projectPoints: false,\n  useGPU: true,\n  fp64: false,\n  viewport: null,\n  gridTransformMatrix: null,\n  createBufferObjects: true\n};\nexports.DEFAULT_RUN_PARAMS = DEFAULT_RUN_PARAMS;\nvar MAX_32_BIT_FLOAT = 3.402823466e38;\nexports.MAX_32_BIT_FLOAT = MAX_32_BIT_FLOAT;\nvar MIN_BLEND_EQUATION = [_constants.default.MIN, _constants.default.FUNC_ADD];\nexports.MIN_BLEND_EQUATION = MIN_BLEND_EQUATION;\nvar MAX_BLEND_EQUATION = [_constants.default.MAX, _constants.default.FUNC_ADD];\nexports.MAX_BLEND_EQUATION = MAX_BLEND_EQUATION;\nvar MAX_MIN_BLEND_EQUATION = [_constants.default.MAX, _constants.default.MIN];\nexports.MAX_MIN_BLEND_EQUATION = MAX_MIN_BLEND_EQUATION;\nvar EQUATION_MAP = (_EQUATION_MAP = {}, _defineProperty(_EQUATION_MAP, AGGREGATION_OPERATION.SUM, _constants.default.FUNC_ADD), _defineProperty(_EQUATION_MAP, AGGREGATION_OPERATION.MEAN, _constants.default.FUNC_ADD), _defineProperty(_EQUATION_MAP, AGGREGATION_OPERATION.MIN, MIN_BLEND_EQUATION), _defineProperty(_EQUATION_MAP, AGGREGATION_OPERATION.MAX, MAX_BLEND_EQUATION), _EQUATION_MAP);\nexports.EQUATION_MAP = EQUATION_MAP;\nvar ELEMENTCOUNT = 4;\nexports.ELEMENTCOUNT = ELEMENTCOUNT;\nvar DEFAULT_WEIGHT_PARAMS = {\n  size: 1,\n  operation: AGGREGATION_OPERATION.SUM,\n  needMin: false,\n  needMax: false,\n  combineMaxMin: false\n};\nexports.DEFAULT_WEIGHT_PARAMS = DEFAULT_WEIGHT_PARAMS;\nvar IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\nexports.IDENTITY_MATRIX = IDENTITY_MATRIX;\nvar PIXEL_SIZE = 4; // RGBA32F\n\nexports.PIXEL_SIZE = PIXEL_SIZE;\nvar WEIGHT_SIZE = 3;\nexports.WEIGHT_SIZE = WEIGHT_SIZE;\n},{\"luma.gl/constants\":\"zLGf\"}],\"uZbe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2018 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME gpu-aggregation-to-grid-vs\\n\\nattribute vec2 positions;\\nattribute vec3 weights;\\nuniform vec2 windowSize;\\nuniform vec2 cellSize;\\nuniform vec2 gridSize;\\nuniform mat4 uProjectionMatrix;\\nuniform bool projectPoints;\\n\\nvarying vec3 vWeights;\\n\\nvec2 project_to_pixel(vec4 pos) {\\n  vec4 result =  uProjectionMatrix * pos;\\n  return result.xy/result.w;\\n}\\n\\nvoid main(void) {\\n\\n  vWeights = weights;\\n\\n  vec4 windowPos = vec4(positions, 0, 1.);\\n  if (projectPoints) {\\n    windowPos = project_position_to_clipspace(vec3(positions, 0), vec2(0, 0), vec3(0, 0, 0));\\n  }\\n\\n  vec2 pos = project_to_pixel(windowPos);\\n\\n  // Transform (0,0):windowSize -> (0, 0): gridSize\\n  pos = floor(pos / cellSize);\\n\\n  // Transform (0,0):gridSize -> (-1, -1):(1,1)\\n  pos = (pos * (2., 2.) / (gridSize)) - (1., 1.);\\n\\n  // Move to pixel center, pixel-size in screen sapce (2/gridSize) * 0.5 => 1/gridSize\\n  vec2 offset = 1.0 / gridSize;\\n  pos = pos + offset;\\n\\n  gl_Position = vec4(pos, 0.0, 1.0);\\n}\\n\";\nexports.default = _default;\n},{}],\"J8nj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2018 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME gpu-aggregation-to-grid-vs-64\\n\\nattribute vec2 positions;\\nattribute vec2 positions64xyLow;\\nattribute vec3 weights;\\nuniform vec2 windowSize;\\nuniform vec2 cellSize;\\nuniform vec2 gridSize;\\nuniform vec2 uProjectionMatrixFP64[16];\\nuniform bool projectPoints;\\n\\nvarying vec3 vWeights;\\n\\nvoid project_to_pixel(vec2 pos, vec2 pos64xyLow, out vec2 pixelXY64[2]) {\\n\\n  vec2 result64[4];\\n  vec2 position64[4];\\n  position64[0] = vec2(pos.x, pos64xyLow.x);\\n  position64[1] = vec2(pos.y, pos64xyLow.y);\\n  position64[2] = vec2(0., 0.);\\n  position64[3] = vec2(1., 0.);\\n  mat4_vec4_mul_fp64(uProjectionMatrixFP64, position64,\\n  result64);\\n\\n  pixelXY64[0] = div_fp64(result64[0], result64[3]);\\n  pixelXY64[1] = div_fp64(result64[1], result64[3]);\\n}\\n\\nvoid main(void) {\\n\\n  vWeights = weights;\\n\\n  vec2 windowPos = positions;\\n  vec2 windowPos64xyLow = positions64xyLow;\\n  if (projectPoints) {\\n    vec2 projectedXY[2];\\n    project_position_fp64(windowPos, windowPos64xyLow, projectedXY);\\n    windowPos.x = projectedXY[0].x;\\n    windowPos.y = projectedXY[1].x;\\n    windowPos64xyLow.x = projectedXY[0].y;\\n    windowPos64xyLow.y = projectedXY[1].y;\\n  }\\n\\n  vec2 pixelXY64[2];\\n  project_to_pixel(windowPos, windowPos64xyLow, pixelXY64);\\n\\n  // Transform (0,0):windowSize -> (0, 0): gridSize\\n  vec2 gridXY64[2];\\n  gridXY64[0] = div_fp64(pixelXY64[0], vec2(cellSize.x, 0));\\n  gridXY64[1] = div_fp64(pixelXY64[1], vec2(cellSize.y, 0));\\n  float x = floor(gridXY64[0].x);\\n  float y = floor(gridXY64[1].x);\\n  vec2 pos = vec2(x, y);\\n\\n  // Transform (0,0):gridSize -> (-1, -1):(1,1)\\n  pos = (pos * (2., 2.) / (gridSize)) - (1., 1.);\\n\\n  // Move to pixel center, pixel-size in screen sapce (2/gridSize) * 0.5 => 1/gridSize\\n  vec2 offset = 1.0 / gridSize;\\n  pos = pos + offset;\\n\\n  gl_Position = vec4(pos, 0.0, 1.0);\\n}\\n\";\nexports.default = _default;\n},{}],\"ilwU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2018 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME gpu-aggregation-to-grid-fs\\n\\nprecision highp float;\\n\\nvarying vec3 vWeights;\\n\\nvoid main(void) {\\n  gl_FragColor = vec4(vWeights, 1.0);\\n}\\n\";\nexports.default = _default;\n},{}],\"SnxL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2018 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#version 300 es\\n#define SHADER_NAME gpu-aggregation-all-vs-64\\n\\nin vec2 position;\\nuniform vec2 gridSize;\\n\\nout vec2 vTextureCoord;\\nvoid main(void) {\\n  // Map each position to single pixel\\n  vec2 pos = vec2(-1.0, -1.0);\\n\\n  // Move to pixel center, pixel-size in screen sapce (2/gridSize) * 0.5 => 1/gridSize\\n  vec2 offset = 1.0 / gridSize;\\n  pos = pos + offset;\\n\\n  gl_Position = vec4(pos, 0.0, 1.0);\\n\\n  float yIndex = floor(float(gl_InstanceID) / gridSize[0]);\\n  float xIndex = float(gl_InstanceID) - (yIndex * gridSize[0]);\\n\\n  vec2 yIndexFP64 = vec2(yIndex, 0.);\\n  vec2 xIndexFP64 = vec2(xIndex, 0.);\\n  vec2 gridSizeYFP64 = vec2(gridSize[1], 0.);\\n  vec2 gridSizeXFP64 = vec2(gridSize[0], 0.);\\n\\n  vec2 texCoordXFP64 = div_fp64(yIndexFP64, gridSizeYFP64);\\n  vec2 texCoordYFP64 = div_fp64(xIndexFP64, gridSizeXFP64);\\n\\n  vTextureCoord = vec2(texCoordYFP64.x, texCoordXFP64.x);\\n}\\n\";\nexports.default = _default;\n},{}],\"dBcx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2018 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#version 300 es\\n#define SHADER_NAME gpu-aggregation-all-fs\\n\\nprecision highp float;\\n\\nin vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform bool combineMaxMin;\\nout vec4 fragColor;\\nvoid main(void) {\\n  vec4 textureColor = texture(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));\\n  if (textureColor.a == 0.) {\\n    discard;\\n  }\\n  fragColor.rgb = textureColor.rgb;\\n  // if combineMinMax is true, use Alpha channel for first weights min value.\\n  fragColor.a = combineMaxMin ? textureColor.r : textureColor.a;\\n}\\n\";\nexports.default = _default;\n},{}],\"GULU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2018 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME gpu-aggregation-transform-mean-vs\\nattribute vec4 aggregationValues;\\nvarying vec4 meanValues;\\n\\nvoid main()\\n{\\n  // TODO: Use 64-bit division ?? not needed given this is aggregation ??\\n  bool isCellValid = bool(aggregationValues.w > 0.);\\n  // aggregationValues:  XYZ contain aggregated values, W contains count\\n  meanValues.xyz = isCellValid ? aggregationValues.xyz/aggregationValues.w : vec3(0, 0, 0);\\n  meanValues.w = aggregationValues.w;\\n}\\n\";\nexports.default = _default;\n},{}],\"l4yu\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getFloatTexture = getFloatTexture;\nexports.getFramebuffer = getFramebuffer;\nexports.getFloatArray = getFloatArray;\nexports.updateBuffer = updateBuffer;\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n} // Helper methods used by GPUGridAggregator.\n\n\nfunction getFloatTexture(gl, opts) {\n  var _parameters;\n\n  var _opts$width = opts.width,\n      width = _opts$width === void 0 ? 1 : _opts$width,\n      _opts$height = opts.height,\n      height = _opts$height === void 0 ? 1 : _opts$height;\n  var texture = new _luma.Texture2D(gl, {\n    data: null,\n    format: _constants.default.RGBA32F,\n    type: _constants.default.FLOAT,\n    border: 0,\n    mipmaps: false,\n    parameters: (_parameters = {}, _defineProperty(_parameters, _constants.default.TEXTURE_MAG_FILTER, _constants.default.NEAREST), _defineProperty(_parameters, _constants.default.TEXTURE_MIN_FILTER, _constants.default.NEAREST), _parameters),\n    dataFormat: _constants.default.RGBA,\n    width: width,\n    height: height\n  });\n  return texture;\n}\n\nfunction getFramebuffer(gl, opts) {\n  var id = opts.id,\n      _opts$width2 = opts.width,\n      width = _opts$width2 === void 0 ? 1 : _opts$width2,\n      _opts$height2 = opts.height,\n      height = _opts$height2 === void 0 ? 1 : _opts$height2;\n  var texture = opts.texture || getFloatTexture(gl, opts);\n  var fb = new _luma.Framebuffer(gl, {\n    id: id,\n    width: width,\n    height: height,\n    attachments: _defineProperty({}, _constants.default.COLOR_ATTACHMENT0, texture)\n  });\n  return fb;\n}\n\nfunction getFloatArray(array, size) {\n  var fillValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n  if (!array || array.length < size) {\n    return new Float32Array(size).fill(fillValue);\n  }\n\n  return array;\n}\n\nfunction updateBuffer(_ref) {\n  var gl = _ref.gl,\n      bufferName = _ref.bufferName,\n      data = _ref.data,\n      result = _ref.result;\n\n  if (result[bufferName]) {\n    result[bufferName].subData({\n      data: data\n    });\n  } else {\n    result[bufferName] = new _luma.Buffer(gl, data);\n  }\n}\n},{\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\"}],\"fjaA\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _assert = _interopRequireDefault(require(\"../../../utils/assert\"));\n\nvar _viewportMercatorProject = require(\"viewport-mercator-project\");\n\nvar _gpuGridAggregatorConstants = require(\"./gpu-grid-aggregator-constants\");\n\nvar _aggregateToGridVs = _interopRequireDefault(require(\"./aggregate-to-grid-vs.glsl\"));\n\nvar _aggregateToGridVs2 = _interopRequireDefault(require(\"./aggregate-to-grid-vs-64.glsl\"));\n\nvar _aggregateToGridFs = _interopRequireDefault(require(\"./aggregate-to-grid-fs.glsl\"));\n\nvar _aggregateAllVs = _interopRequireDefault(require(\"./aggregate-all-vs-64.glsl\"));\n\nvar _aggregateAllFs = _interopRequireDefault(require(\"./aggregate-all-fs.glsl\"));\n\nvar _transformMeanVs = _interopRequireDefault(require(\"./transform-mean-vs.glsl\"));\n\nvar _gpuGridAggregatorUtils = require(\"./gpu-grid-aggregator-utils.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nvar fp64ifyMatrix4 = _luma.fp64.fp64ifyMatrix4;\n\nvar GPUGridAggregator =\n/*#__PURE__*/\nfunction () {\n  _createClass(GPUGridAggregator, null, [{\n    key: \"getAggregationData\",\n    // Decode and return aggregation data of given pixel.\n    value: function getAggregationData(_ref) {\n      var aggregationData = _ref.aggregationData,\n          maxData = _ref.maxData,\n          pixelIndex = _ref.pixelIndex;\n      (0, _assert.default)(aggregationData.length >= (pixelIndex + 1) * _gpuGridAggregatorConstants.PIXEL_SIZE);\n      (0, _assert.default)(maxData.length === _gpuGridAggregatorConstants.PIXEL_SIZE);\n      var index = pixelIndex * _gpuGridAggregatorConstants.PIXEL_SIZE;\n      var cellCount = aggregationData[index + 3];\n      var cellWeight = aggregationData[index];\n      var totalCount = maxData[3];\n      var maxCellWieght = maxData[0];\n      return {\n        cellCount: cellCount,\n        cellWeight: cellWeight,\n        totalCount: totalCount,\n        maxCellWieght: maxCellWieght\n      };\n    } // Decodes and retuns counts and weights of all cells\n\n  }, {\n    key: \"getCellData\",\n    value: function getCellData(_ref2) {\n      var countsData = _ref2.countsData,\n          _ref2$size = _ref2.size,\n          size = _ref2$size === void 0 ? 1 : _ref2$size;\n      var numCells = countsData.length / 4;\n      var cellWeights = new Float32Array(numCells * size);\n      var cellCounts = new Uint32Array(numCells);\n\n      for (var i = 0; i < numCells; i++) {\n        // weights in RGB channels\n        for (var sizeIndex = 0; sizeIndex < size; sizeIndex++) {\n          cellWeights[i * size + sizeIndex] = countsData[i * 4 + sizeIndex];\n        } // count in Alpha channel\n\n\n        cellCounts[i] = countsData[i * 4 + 3];\n      }\n\n      return {\n        cellCounts: cellCounts,\n        cellWeights: cellWeights\n      };\n    } // DEBUG ONLY\n    // static logData({aggregationBuffer, minBuffer, maxBuffer, maxMinBuffer}) {\n    //   const agrData = aggregationBuffer.getData();\n    //   for (let index = 0; index < agrData.length; index += 4) {\n    //     if (agrData[index + 3] > 0) {\n    //       console.log(\n    //         `index: ${index} weights: ${agrData[index]} ${agrData[index + 1]} ${\n    //           agrData[index + 2]\n    //         } count: ${agrData[index + 3]}`\n    //       );\n    //     }\n    //   }\n    // }\n\n  }]);\n\n  function GPUGridAggregator(gl) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, GPUGridAggregator);\n\n    this.id = opts.id || 'gpu-grid-aggregator';\n    this.shaderCache = opts.shaderCache || null;\n    this.gl = gl;\n    this.state = {\n      // cache weights and position data to process when data is not changed\n      weights: null,\n      gridPositions: null,\n      positionsBuffer: null,\n      positions64xyLowBuffer: null,\n      vertexCount: 0,\n      // flags/variables that affect the aggregation\n      fp64: null,\n      useGPU: null,\n      numCol: 0,\n      numRow: 0,\n      windowSize: null,\n      cellSize: null,\n      // per weight GPU resources\n      weightAttributes: {},\n      textures: {},\n      meanTextures: {},\n      buffers: {},\n      framebuffers: {},\n      maxMinFramebuffers: {},\n      minFramebuffers: {},\n      maxFramebuffers: {},\n      equations: {}\n    };\n    this._hasGPUSupport = (0, _luma.isWebGL2)(gl) && // gl_InstanceID usage in min/max calculation shaders\n    (0, _luma.hasFeatures)(this.gl, _luma.FEATURES.BLEND_EQUATION_MINMAX, // set min/max blend modes\n    _luma.FEATURES.COLOR_ATTACHMENT_RGBA32F, // render to float texture\n    _luma.FEATURES.TEXTURE_FLOAT // sample from a float texture\n    );\n  } // Delete owned resources.\n\n  /* eslint no-unused-expressions: [\"error\", { \"allowShortCircuit\": true }] */\n\n\n  _createClass(GPUGridAggregator, [{\n    key: \"delete\",\n    value: function _delete() {\n      var gridAggregationModel = this.gridAggregationModel,\n          allAggregationModel = this.allAggregationModel,\n          meanTransform = this.meanTransform;\n      var _this$state = this.state,\n          positionsBuffer = _this$state.positionsBuffer,\n          position64Buffer = _this$state.position64Buffer,\n          framebuffers = _this$state.framebuffers,\n          maxMinFramebuffers = _this$state.maxMinFramebuffers,\n          minFramebuffers = _this$state.minFramebuffers,\n          maxFramebuffers = _this$state.maxFramebuffers,\n          meanTextures = _this$state.meanTextures;\n      gridAggregationModel && gridAggregationModel.delete();\n      allAggregationModel && allAggregationModel.delete();\n      meanTransform && meanTransform.delete();\n      positionsBuffer && positionsBuffer.delete();\n      position64Buffer && position64Buffer.delete();\n      this.deleteResources(framebuffers);\n      this.deleteResources(maxMinFramebuffers);\n      this.deleteResources(minFramebuffers);\n      this.deleteResources(maxFramebuffers);\n      this.deleteResources(meanTextures);\n    } // Perform aggregation and retun the results\n\n  }, {\n    key: \"run\",\n    value: function run() {\n      var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n      var aggregationParams = this.getAggregationParams(opts);\n      this.updateGridSize(aggregationParams);\n      var useGPU = aggregationParams.useGPU;\n\n      if (this._hasGPUSupport && useGPU) {\n        return this.runAggregationOnGPU(aggregationParams);\n      }\n\n      if (useGPU) {\n        _core.log.warn('ScreenGridAggregator: GPU Aggregation not supported, falling back to CPU')();\n      }\n\n      return this.runAggregationOnCPU(aggregationParams);\n    } // PRIVATE\n    // Common methods\n\n  }, {\n    key: \"deleteResources\",\n    value: function deleteResources(obj) {\n      for (var name in obj) {\n        obj[name].delete();\n      }\n    }\n  }, {\n    key: \"getAggregationParams\",\n    value: function getAggregationParams(opts) {\n      var aggregationParams = Object.assign({}, _gpuGridAggregatorConstants.DEFAULT_RUN_PARAMS, opts);\n      var useGPU = aggregationParams.useGPU,\n          gridTransformMatrix = aggregationParams.gridTransformMatrix,\n          viewport = aggregationParams.viewport,\n          weights = aggregationParams.weights,\n          projectPoints = aggregationParams.projectPoints,\n          cellSize = aggregationParams.cellSize;\n\n      if (this.state.useGPU !== useGPU) {\n        // CPU/GPU resources need to reinitialized, force set the change flags.\n        aggregationParams.changeFlags = Object.assign({}, aggregationParams.changeFlags, _gpuGridAggregatorConstants.DEFAULT_CHANGE_FLAGS);\n      }\n\n      if (cellSize && (!this.state.cellSize || this.state.cellSize[0] !== cellSize[0] || this.state.cellSize[1] !== cellSize[1])) {\n        aggregationParams.changeFlags.cellSizeChanged = true; // For GridLayer aggregation, cellSize is calculated by parsing all input data as it depends\n        // on bounding box, cache cellSize\n\n        this.setState({\n          cellSize: cellSize\n        });\n      }\n\n      this.validateProps(aggregationParams, opts);\n      this.setState({\n        useGPU: useGPU\n      });\n      aggregationParams.gridTransformMatrix = (projectPoints ? viewport.viewportMatrix : gridTransformMatrix) || _gpuGridAggregatorConstants.IDENTITY_MATRIX;\n\n      if (weights) {\n        aggregationParams.weights = this.normalizeWeightParams(weights); // cache weights to process when only cellSize or viewport is changed.\n        // position data is cached in Buffers for GPU case and in 'gridPositions' for CPU case.\n\n        this.setState({\n          weights: aggregationParams.weights\n        });\n      }\n\n      return aggregationParams;\n    }\n  }, {\n    key: \"normalizeWeightParams\",\n    value: function normalizeWeightParams(weights) {\n      var result = {};\n\n      for (var id in weights) {\n        result[id] = Object.assign({}, _gpuGridAggregatorConstants.DEFAULT_WEIGHT_PARAMS, weights[id]);\n      }\n\n      return result;\n    } // Update priveate state\n\n  }, {\n    key: \"setState\",\n    value: function setState(updateObject) {\n      Object.assign(this.state, updateObject);\n    }\n  }, {\n    key: \"shouldTransformToGrid\",\n    value: function shouldTransformToGrid(opts) {\n      var projectPoints = opts.projectPoints,\n          changeFlags = opts.changeFlags;\n\n      if (!this.state.gridPositions || changeFlags.dataChanged || projectPoints && changeFlags.viewportChanged // world space aggregation (GridLayer) doesn't change when viewport is changed.\n      ) {\n          return true;\n        }\n\n      return false;\n    }\n  }, {\n    key: \"updateGridSize\",\n    value: function updateGridSize(opts) {\n      var viewport = opts.viewport,\n          cellSize = opts.cellSize;\n      var width = opts.width || viewport.width;\n      var height = opts.height || viewport.height;\n      var numCol = Math.ceil(width / cellSize[0]);\n      var numRow = Math.ceil(height / cellSize[1]);\n      this.setState({\n        numCol: numCol,\n        numRow: numRow,\n        windowSize: [width, height]\n      });\n    } // validate and assert\n\n  }, {\n    key: \"validateProps\",\n    value: function validateProps(aggregationParams, opts) {\n      var changeFlags = aggregationParams.changeFlags,\n          projectPoints = aggregationParams.projectPoints,\n          gridTransformMatrix = aggregationParams.gridTransformMatrix;\n      (0, _assert.default)(changeFlags.dataChanged || changeFlags.viewportChanged || changeFlags.cellSizeChanged); // assert for required options\n\n      (0, _assert.default)(!changeFlags.dataChanged || opts.positions && opts.weights && (!opts.projectPositions || opts.viewport) && opts.cellSize);\n      (0, _assert.default)(!changeFlags.cellSizeChanged || opts.cellSize); // viewport need only when performing screen space aggregation (projectPoints is true)\n\n      (0, _assert.default)(!(changeFlags.viewportChanged && projectPoints) || opts.viewport);\n\n      if (projectPoints && gridTransformMatrix) {\n        _core.log.warn('projectPoints is true, gridTransformMatrix is ignored')();\n      }\n    } // CPU Aggregation methods\n    // aggregated weight value to a cell\n\n    /* eslint-disable max-depth */\n\n  }, {\n    key: \"calculateAggregationData\",\n    value: function calculateAggregationData(opts) {\n      var weights = opts.weights,\n          results = opts.results,\n          cellIndex = opts.cellIndex,\n          posIndex = opts.posIndex;\n\n      for (var id in weights) {\n        var _weights$id = weights[id],\n            values = _weights$id.values,\n            size = _weights$id.size,\n            operation = _weights$id.operation;\n        var aggregationData = results[id].aggregationData; // Fill RGB with weights\n\n        for (var sizeIndex = 0; sizeIndex < size; sizeIndex++) {\n          var cellElementIndex = cellIndex + sizeIndex;\n          var weightComponent = values[posIndex * _gpuGridAggregatorConstants.WEIGHT_SIZE + sizeIndex];\n\n          if (aggregationData[cellIndex + 3] === 0) {\n            // if the cell is getting update the first time, set the value directly.\n            aggregationData[cellElementIndex] = weightComponent;\n          } else {\n            switch (operation) {\n              case _gpuGridAggregatorConstants.AGGREGATION_OPERATION.SUM:\n              case _gpuGridAggregatorConstants.AGGREGATION_OPERATION.MEAN:\n                aggregationData[cellElementIndex] += weightComponent; // MEAN value is calculated during 'calculateMeanMaxMinData'\n\n                break;\n\n              case _gpuGridAggregatorConstants.AGGREGATION_OPERATION.MIN:\n                aggregationData[cellElementIndex] = Math.min(aggregationData[cellElementIndex], weightComponent);\n                break;\n\n              case _gpuGridAggregatorConstants.AGGREGATION_OPERATION.MAX:\n                aggregationData[cellElementIndex] = Math.max(aggregationData[cellElementIndex], weightComponent);\n                break;\n\n              default:\n                // Not a valid operation enum.\n                (0, _assert.default)(false);\n                break;\n            }\n          }\n        } // Track the count per grid-cell\n\n\n        aggregationData[cellIndex + 3]++;\n      }\n    }\n    /* eslint-disable max-depth, complexity */\n\n  }, {\n    key: \"calculateMeanMaxMinData\",\n    value: function calculateMeanMaxMinData(opts) {\n      var validCellIndices = opts.validCellIndices,\n          results = opts.results,\n          weights = opts.weights; // collect max/min values\n\n      validCellIndices.forEach(function (cellIndex) {\n        for (var id in results) {\n          var _weights$id2 = weights[id],\n              size = _weights$id2.size,\n              needMin = _weights$id2.needMin,\n              needMax = _weights$id2.needMax,\n              operation = _weights$id2.operation;\n          var _results$id = results[id],\n              aggregationData = _results$id.aggregationData,\n              minData = _results$id.minData,\n              maxData = _results$id.maxData,\n              maxMinData = _results$id.maxMinData;\n          var calculateMinMax = needMin || needMax;\n          var calculateMean = operation === _gpuGridAggregatorConstants.AGGREGATION_OPERATION.MEAN;\n          var combineMaxMin = needMin && needMax && weights[id].combineMaxMin;\n          var count = aggregationData[cellIndex + _gpuGridAggregatorConstants.ELEMENTCOUNT - 1];\n\n          for (var sizeIndex = 0; sizeIndex < size && (calculateMinMax || calculateMean); sizeIndex++) {\n            var cellElementIndex = cellIndex + sizeIndex;\n            var weight = aggregationData[cellElementIndex];\n\n            if (calculateMean) {\n              aggregationData[cellElementIndex] /= count;\n              weight = aggregationData[cellElementIndex];\n            }\n\n            if (combineMaxMin) {\n              // use RGB for max values for 3 weights.\n              maxMinData[sizeIndex] = Math.max(maxMinData[sizeIndex], weight);\n            } else {\n              if (needMin) {\n                minData[sizeIndex] = Math.min(minData[sizeIndex], weight);\n              }\n\n              if (needMax) {\n                maxData[sizeIndex] = Math.max(maxData[sizeIndex], weight);\n              }\n            }\n          } // update total aggregation values.\n\n\n          if (combineMaxMin) {\n            // Use Alpha channel to store total min value for weight#0\n            maxMinData[_gpuGridAggregatorConstants.ELEMENTCOUNT - 1] = Math.min(maxMinData[_gpuGridAggregatorConstants.ELEMENTCOUNT - 1], aggregationData[cellIndex + 0]);\n          } else {\n            // Use Alpha channel to store total counts.\n            if (needMin) {\n              minData[_gpuGridAggregatorConstants.ELEMENTCOUNT - 1] += count;\n            }\n\n            if (needMax) {\n              maxData[_gpuGridAggregatorConstants.ELEMENTCOUNT - 1] += count;\n            }\n          }\n        }\n      });\n    }\n    /* eslint-enable max-depth */\n\n  }, {\n    key: \"initCPUResults\",\n    value: function initCPUResults(opts) {\n      var weights = opts.weights || this.state.weights;\n      var _this$state2 = this.state,\n          numCol = _this$state2.numCol,\n          numRow = _this$state2.numRow;\n      var results = {}; // setup results object\n\n      for (var id in weights) {\n        var _weights$id3 = weights[id],\n            aggregationData = _weights$id3.aggregationData,\n            minData = _weights$id3.minData,\n            maxData = _weights$id3.maxData,\n            maxMinData = _weights$id3.maxMinData;\n        var _weights$id4 = weights[id],\n            needMin = _weights$id4.needMin,\n            needMax = _weights$id4.needMax;\n        var combineMaxMin = needMin && needMax && weights[id].combineMaxMin;\n        var aggregationSize = numCol * numRow * _gpuGridAggregatorConstants.ELEMENTCOUNT;\n        aggregationData = (0, _gpuGridAggregatorUtils.getFloatArray)(aggregationData, aggregationSize);\n\n        if (combineMaxMin) {\n          maxMinData = (0, _gpuGridAggregatorUtils.getFloatArray)(maxMinData, _gpuGridAggregatorConstants.ELEMENTCOUNT); // RGB for max value\n\n          maxMinData.fill(-Infinity, 0, _gpuGridAggregatorConstants.ELEMENTCOUNT - 1); // Alpha for min value\n\n          maxMinData[_gpuGridAggregatorConstants.ELEMENTCOUNT - 1] = Infinity;\n        } else {\n          // RGB for min/max values\n          // Alpha for total count\n          if (needMin) {\n            minData = (0, _gpuGridAggregatorUtils.getFloatArray)(minData, _gpuGridAggregatorConstants.ELEMENTCOUNT, Infinity);\n            minData[_gpuGridAggregatorConstants.ELEMENTCOUNT - 1] = 0;\n          }\n\n          if (needMax) {\n            maxData = (0, _gpuGridAggregatorUtils.getFloatArray)(maxData, _gpuGridAggregatorConstants.ELEMENTCOUNT, -Infinity);\n            maxData[_gpuGridAggregatorConstants.ELEMENTCOUNT - 1] = 0;\n          }\n        }\n\n        results[id] = Object.assign({}, weights[id], {\n          aggregationData: aggregationData,\n          minData: minData,\n          maxData: maxData,\n          maxMinData: maxMinData\n        });\n      }\n\n      return results;\n    }\n    /* eslint-disable max-statements */\n\n  }, {\n    key: \"runAggregationOnCPU\",\n    value: function runAggregationOnCPU(opts) {\n      var positions = opts.positions,\n          cellSize = opts.cellSize,\n          gridTransformMatrix = opts.gridTransformMatrix,\n          viewport = opts.viewport,\n          projectPoints = opts.projectPoints;\n      var weights = opts.weights;\n      var _this$state3 = this.state,\n          numCol = _this$state3.numCol,\n          numRow = _this$state3.numRow;\n      var results = this.initCPUResults(opts); // screen space or world space projection required\n\n      var gridTransformRequired = this.shouldTransformToGrid(opts);\n      var gridPositions;\n      var pos = [0, 0, 0];\n      (0, _assert.default)(gridTransformRequired || opts.changeFlags.cellSizeChanged);\n      var posCount;\n\n      if (gridTransformRequired) {\n        posCount = positions.length / 2;\n        gridPositions = new Float64Array(positions.length);\n        this.setState({\n          gridPositions: gridPositions\n        });\n      } else {\n        gridPositions = this.state.gridPositions;\n        weights = this.state.weights;\n        posCount = gridPositions.length / 2;\n      }\n\n      var validCellIndices = new Set();\n\n      for (var posIndex = 0; posIndex < posCount; posIndex++) {\n        var x = void 0;\n        var y = void 0;\n\n        if (gridTransformRequired) {\n          pos[0] = positions[posIndex * 2];\n          pos[1] = positions[posIndex * 2 + 1];\n\n          if (projectPoints) {\n            var _viewport$project = viewport.project(pos);\n\n            var _viewport$project2 = _slicedToArray(_viewport$project, 2);\n\n            x = _viewport$project2[0];\n            y = _viewport$project2[1];\n          } else {\n            var _worldToPixels = (0, _viewportMercatorProject.worldToPixels)(pos, gridTransformMatrix);\n\n            var _worldToPixels2 = _slicedToArray(_worldToPixels, 2);\n\n            x = _worldToPixels2[0];\n            y = _worldToPixels2[1];\n          }\n\n          gridPositions[posIndex * 2] = x;\n          gridPositions[posIndex * 2 + 1] = y;\n        } else {\n          x = gridPositions[posIndex * 2];\n          y = gridPositions[posIndex * 2 + 1];\n        }\n\n        var colId = Math.floor(x / cellSize[0]);\n        var rowId = Math.floor(y / cellSize[1]);\n\n        if (colId >= 0 && colId < numCol && rowId >= 0 && rowId < numRow) {\n          var cellIndex = (colId + rowId * numCol) * _gpuGridAggregatorConstants.ELEMENTCOUNT;\n          validCellIndices.add(cellIndex);\n          this.calculateAggregationData({\n            weights: weights,\n            results: results,\n            cellIndex: cellIndex,\n            posIndex: posIndex\n          });\n        }\n      }\n\n      this.calculateMeanMaxMinData({\n        validCellIndices: validCellIndices,\n        results: results,\n        weights: weights\n      }); // Update buffer objects.\n\n      this.updateAggregationBuffers(opts, results);\n      return results;\n    }\n    /* eslint-disable max-statements */\n\n  }, {\n    key: \"updateAggregationBuffers\",\n    value: function updateAggregationBuffers(opts, results) {\n      if (!opts.createBufferObjects) {\n        return;\n      }\n\n      var weights = opts.weights || this.state.weights;\n\n      for (var id in results) {\n        var _results$id2 = results[id],\n            aggregationData = _results$id2.aggregationData,\n            minData = _results$id2.minData,\n            maxData = _results$id2.maxData,\n            maxMinData = _results$id2.maxMinData;\n        var _weights$id5 = weights[id],\n            needMin = _weights$id5.needMin,\n            needMax = _weights$id5.needMax;\n        var combineMaxMin = needMin && needMax && weights[id].combineMaxMin;\n        (0, _gpuGridAggregatorUtils.updateBuffer)({\n          gl: this.gl,\n          bufferName: 'aggregationBuffer',\n          data: aggregationData,\n          result: results[id]\n        });\n\n        if (combineMaxMin) {\n          (0, _gpuGridAggregatorUtils.updateBuffer)({\n            gl: this.gl,\n            bufferName: 'maxMinBuffer',\n            data: maxMinData,\n            result: results[id]\n          });\n        } else {\n          if (needMin) {\n            (0, _gpuGridAggregatorUtils.updateBuffer)({\n              gl: this.gl,\n              bufferName: 'minBuffer',\n              data: minData,\n              result: results[id]\n            });\n          }\n\n          if (needMax) {\n            (0, _gpuGridAggregatorUtils.updateBuffer)({\n              gl: this.gl,\n              bufferName: 'maxBuffer',\n              data: maxData,\n              result: results[id]\n            });\n          }\n        }\n      }\n    } // GPU Aggregation methods\n\n  }, {\n    key: \"getAggregateData\",\n    value: function getAggregateData(opts) {\n      var results = {};\n      var _this$state4 = this.state,\n          textures = _this$state4.textures,\n          framebuffers = _this$state4.framebuffers,\n          maxMinFramebuffers = _this$state4.maxMinFramebuffers,\n          minFramebuffers = _this$state4.minFramebuffers,\n          maxFramebuffers = _this$state4.maxFramebuffers,\n          weights = _this$state4.weights;\n\n      for (var id in weights) {\n        results[id] = {};\n        var _weights$id6 = weights[id],\n            needMin = _weights$id6.needMin,\n            needMax = _weights$id6.needMax,\n            combineMaxMin = _weights$id6.combineMaxMin;\n        results[id].aggregationTexture = textures[id];\n        results[id].aggregationBuffer = framebuffers[id].readPixelsToBuffer({\n          buffer: weights[id].aggregationBuffer,\n          // update if a buffer is provided\n          type: _constants.default.FLOAT\n        });\n\n        if (needMin && needMax && combineMaxMin) {\n          results[id].maxMinBuffer = maxMinFramebuffers[id].readPixelsToBuffer({\n            buffer: weights[id].maxMinBuffer,\n            // update if a buffer is provided\n            type: _constants.default.FLOAT\n          });\n        } else {\n          if (needMin) {\n            results[id].minBuffer = minFramebuffers[id].readPixelsToBuffer({\n              buffer: weights[id].minBuffer,\n              // update if a buffer is provided\n              type: _constants.default.FLOAT\n            });\n          }\n\n          if (needMax) {\n            results[id].maxBuffer = maxFramebuffers[id].readPixelsToBuffer({\n              buffer: weights[id].maxBuffer,\n              // update if a buffer is provided\n              type: _constants.default.FLOAT\n            });\n          }\n        }\n      }\n\n      return results;\n    }\n  }, {\n    key: \"getAggregationModel\",\n    value: function getAggregationModel() {\n      var fp64 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var gl = this.gl,\n          shaderCache = this.shaderCache;\n      return new _luma.Model(gl, {\n        id: 'Gird-Aggregation-Model',\n        vs: fp64 ? _aggregateToGridVs2.default : _aggregateToGridVs.default,\n        fs: _aggregateToGridFs.default,\n        modules: fp64 ? ['fp64', 'project64'] : ['project32'],\n        shaderCache: shaderCache,\n        vertexCount: 0,\n        drawMode: _constants.default.POINTS\n      });\n    }\n  }, {\n    key: \"getAllAggregationModel\",\n    value: function getAllAggregationModel() {\n      var fp64 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n      var gl = this.gl,\n          shaderCache = this.shaderCache;\n      return new _luma.Model(gl, {\n        id: 'All-Aggregation-Model',\n        vs: _aggregateAllVs.default,\n        fs: _aggregateAllFs.default,\n        modules: ['fp64'],\n        shaderCache: shaderCache,\n        vertexCount: 1,\n        drawMode: _constants.default.POINTS,\n        isInstanced: true,\n        instanceCount: 0,\n        attributes: {\n          position: new _luma.Buffer(gl, {\n            size: 2,\n            data: new Float32Array([0, 0])\n          })\n        }\n      });\n    }\n  }, {\n    key: \"getMeanTransform\",\n    value: function getMeanTransform(opts) {\n      if (this.meanTransform) {\n        this.meanTransform.update(opts);\n      } else {\n        this.meanTransform = new _luma.Transform(this.gl, Object.assign({}, {\n          vs: _transformMeanVs.default,\n          _targetTextureVarying: 'meanValues'\n        }, opts));\n      }\n\n      return this.meanTransform;\n    }\n  }, {\n    key: \"renderAggregateData\",\n    value: function renderAggregateData(opts) {\n      var cellSize = opts.cellSize,\n          viewport = opts.viewport,\n          gridTransformMatrix = opts.gridTransformMatrix,\n          projectPoints = opts.projectPoints;\n      var _this$state5 = this.state,\n          numCol = _this$state5.numCol,\n          numRow = _this$state5.numRow,\n          windowSize = _this$state5.windowSize,\n          maxMinFramebuffers = _this$state5.maxMinFramebuffers,\n          minFramebuffers = _this$state5.minFramebuffers,\n          maxFramebuffers = _this$state5.maxFramebuffers,\n          weights = _this$state5.weights;\n      var uProjectionMatrixFP64 = fp64ifyMatrix4(gridTransformMatrix);\n      var gridSize = [numCol, numRow];\n      var parameters = {\n        blend: true,\n        depthTest: false,\n        blendFunc: [_constants.default.ONE, _constants.default.ONE]\n      };\n      var moduleSettings = {\n        viewport: viewport\n      };\n      var uniforms = {\n        windowSize: windowSize,\n        cellSize: cellSize,\n        gridSize: gridSize,\n        uProjectionMatrix: gridTransformMatrix,\n        uProjectionMatrixFP64: uProjectionMatrixFP64,\n        projectPoints: projectPoints\n      };\n\n      for (var id in weights) {\n        var _weights$id7 = weights[id],\n            needMin = _weights$id7.needMin,\n            needMax = _weights$id7.needMax;\n        var combineMaxMin = needMin && needMax && weights[id].combineMaxMin;\n        this.renderToWeightsTexture({\n          id: id,\n          parameters: parameters,\n          moduleSettings: moduleSettings,\n          uniforms: uniforms,\n          gridSize: gridSize\n        });\n\n        if (combineMaxMin) {\n          this.renderToMaxMinTexture({\n            id: id,\n            parameters: Object.assign({}, parameters, {\n              blendEquation: _gpuGridAggregatorConstants.MAX_MIN_BLEND_EQUATION\n            }),\n            gridSize: gridSize,\n            minOrMaxFb: maxMinFramebuffers[id],\n            clearParams: {\n              clearColor: [0, 0, 0, _gpuGridAggregatorConstants.MAX_32_BIT_FLOAT]\n            },\n            combineMaxMin: combineMaxMin\n          });\n        } else {\n          if (needMin) {\n            this.renderToMaxMinTexture({\n              id: id,\n              parameters: Object.assign({}, parameters, {\n                blendEquation: _gpuGridAggregatorConstants.MIN_BLEND_EQUATION\n              }),\n              gridSize: gridSize,\n              minOrMaxFb: minFramebuffers[id],\n              clearParams: {\n                clearColor: [_gpuGridAggregatorConstants.MAX_32_BIT_FLOAT, _gpuGridAggregatorConstants.MAX_32_BIT_FLOAT, _gpuGridAggregatorConstants.MAX_32_BIT_FLOAT, 0]\n              },\n              combineMaxMin: combineMaxMin\n            });\n          }\n\n          if (needMax) {\n            this.renderToMaxMinTexture({\n              id: id,\n              parameters: Object.assign({}, parameters, {\n                blendEquation: _gpuGridAggregatorConstants.MAX_BLEND_EQUATION\n              }),\n              gridSize: gridSize,\n              minOrMaxFb: maxFramebuffers[id],\n              combineMaxMin: combineMaxMin\n            });\n          }\n        }\n      }\n    } // render all aggregated grid-cells to generate Min, Max or MaxMin data texture\n\n  }, {\n    key: \"renderToMaxMinTexture\",\n    value: function renderToMaxMinTexture(opts) {\n      var id = opts.id,\n          parameters = opts.parameters,\n          gridSize = opts.gridSize,\n          minOrMaxFb = opts.minOrMaxFb,\n          combineMaxMin = opts.combineMaxMin,\n          _opts$clearParams = opts.clearParams,\n          clearParams = _opts$clearParams === void 0 ? {} : _opts$clearParams;\n      var framebuffers = this.state.framebuffers;\n      var gl = this.gl,\n          allAggregationModel = this.allAggregationModel;\n      minOrMaxFb.bind();\n      gl.viewport(0, 0, gridSize[0], gridSize[1]);\n      (0, _luma.withParameters)(gl, clearParams, function () {\n        gl.clear(gl.COLOR_BUFFER_BIT);\n      });\n      allAggregationModel.draw({\n        parameters: parameters,\n        uniforms: {\n          uSampler: framebuffers[id].texture,\n          gridSize: gridSize,\n          combineMaxMin: combineMaxMin\n        }\n      });\n      minOrMaxFb.unbind();\n    } // render all data points to aggregate weights\n\n  }, {\n    key: \"renderToWeightsTexture\",\n    value: function renderToWeightsTexture(opts) {\n      var id = opts.id,\n          parameters = opts.parameters,\n          moduleSettings = opts.moduleSettings,\n          uniforms = opts.uniforms,\n          gridSize = opts.gridSize;\n      var _this$state6 = this.state,\n          framebuffers = _this$state6.framebuffers,\n          equations = _this$state6.equations,\n          weightAttributes = _this$state6.weightAttributes,\n          weights = _this$state6.weights;\n      var gl = this.gl,\n          gridAggregationModel = this.gridAggregationModel;\n      var operation = weights[id].operation;\n      framebuffers[id].bind();\n      gl.viewport(0, 0, gridSize[0], gridSize[1]);\n      var clearColor = operation === _gpuGridAggregatorConstants.AGGREGATION_OPERATION.MIN ? [_gpuGridAggregatorConstants.MAX_32_BIT_FLOAT, _gpuGridAggregatorConstants.MAX_32_BIT_FLOAT, _gpuGridAggregatorConstants.MAX_32_BIT_FLOAT, 0] : [0, 0, 0, 0];\n      (0, _luma.withParameters)(gl, {\n        clearColor: clearColor\n      }, function () {\n        gl.clear(gl.COLOR_BUFFER_BIT);\n      });\n      var attributes = {\n        weights: weightAttributes[id]\n      };\n      gridAggregationModel.draw({\n        parameters: Object.assign({}, parameters, {\n          blendEquation: equations[id]\n        }),\n        moduleSettings: moduleSettings,\n        uniforms: uniforms,\n        attributes: attributes\n      });\n      framebuffers[id].unbind();\n\n      if (operation === _gpuGridAggregatorConstants.AGGREGATION_OPERATION.MEAN) {\n        var _this$state7 = this.state,\n            meanTextures = _this$state7.meanTextures,\n            textures = _this$state7.textures;\n        var transformOptions = {\n          _sourceTextures: {\n            aggregationValues: meanTextures[id]\n          },\n          // contains aggregated data\n          _targetTexture: textures[id],\n          // store mean values,\n          elementCount: textures[id].width * textures[id].height\n        };\n        var meanTransform = this.getMeanTransform(transformOptions);\n        meanTransform.run({\n          parameters: {\n            blend: false,\n            depthTest: false\n          }\n        }); // update framebuffer with mean results so readPixelsToBuffer returns mean values\n\n        framebuffers[id].attach(_defineProperty({}, _constants.default.COLOR_ATTACHMENT0, textures[id]));\n      }\n    }\n  }, {\n    key: \"runAggregationOnGPU\",\n    value: function runAggregationOnGPU(opts) {\n      this.updateModels(opts);\n      this.setupFramebuffers(opts);\n      this.renderAggregateData(opts);\n      return this.getAggregateData(opts);\n    } // set up framebuffer for each weight\n\n    /* eslint-disable complexity, max-depth */\n\n  }, {\n    key: \"setupFramebuffers\",\n    value: function setupFramebuffers(opts) {\n      var _this$state8 = this.state,\n          numCol = _this$state8.numCol,\n          numRow = _this$state8.numRow,\n          textures = _this$state8.textures,\n          framebuffers = _this$state8.framebuffers,\n          maxMinFramebuffers = _this$state8.maxMinFramebuffers,\n          minFramebuffers = _this$state8.minFramebuffers,\n          maxFramebuffers = _this$state8.maxFramebuffers,\n          meanTextures = _this$state8.meanTextures,\n          equations = _this$state8.equations,\n          weights = _this$state8.weights;\n      var framebufferSize = {\n        width: numCol,\n        height: numRow\n      };\n\n      for (var id in weights) {\n        var _weights$id8 = weights[id],\n            needMin = _weights$id8.needMin,\n            needMax = _weights$id8.needMax,\n            combineMaxMin = _weights$id8.combineMaxMin,\n            operation = _weights$id8.operation;\n        textures[id] = weights[id].aggregationTexture || textures[id] || (0, _gpuGridAggregatorUtils.getFloatTexture)(this.gl, {\n          id: \"\".concat(id, \"-texture\"),\n          width: numCol,\n          height: numRow\n        });\n        textures[id].resize(framebufferSize);\n        var texture = textures[id];\n\n        if (operation === _gpuGridAggregatorConstants.AGGREGATION_OPERATION.MEAN) {\n          // For MEAN, we first aggregatet into a temp texture\n          meanTextures[id] = meanTextures[id] || (0, _gpuGridAggregatorUtils.getFloatTexture)(this.gl, {\n            id: \"\".concat(id, \"-mean-texture\"),\n            width: numCol,\n            height: numRow\n          });\n          meanTextures[id].resize(framebufferSize);\n          texture = meanTextures[id];\n        }\n\n        if (framebuffers[id]) {\n          framebuffers[id].attach(_defineProperty({}, _constants.default.COLOR_ATTACHMENT0, texture));\n        } else {\n          framebuffers[id] = (0, _gpuGridAggregatorUtils.getFramebuffer)(this.gl, {\n            id: \"\".concat(id, \"-fb\"),\n            width: numCol,\n            height: numRow,\n            texture: texture\n          });\n        }\n\n        framebuffers[id].resize(framebufferSize);\n        equations[id] = _gpuGridAggregatorConstants.EQUATION_MAP[operation]; // For min/max framebuffers will use default size 1X1\n\n        if (needMin || needMax) {\n          if (needMin && needMax && combineMaxMin) {\n            maxMinFramebuffers[id] = maxMinFramebuffers[id] || (0, _gpuGridAggregatorUtils.getFramebuffer)(this.gl, {\n              id: \"\".concat(id, \"-maxMinFb\")\n            });\n          } else {\n            if (needMin) {\n              minFramebuffers[id] = minFramebuffers[id] || (0, _gpuGridAggregatorUtils.getFramebuffer)(this.gl, {\n                id: \"\".concat(id, \"-minFb\")\n              });\n            }\n\n            if (needMax) {\n              maxFramebuffers[id] = maxFramebuffers[id] || (0, _gpuGridAggregatorUtils.getFramebuffer)(this.gl, {\n                id: \"\".concat(id, \"-maxFb\")\n              });\n            }\n          }\n        }\n      }\n    }\n    /* eslint-enable complexity, max-depth */\n\n  }, {\n    key: \"setupModels\",\n    value: function setupModels() {\n      var fp64 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (this.gridAggregationModel) {\n        this.gridAggregationModel.delete();\n      }\n\n      this.gridAggregationModel = this.getAggregationModel(fp64);\n\n      if (this.allAggregationModel) {\n        this.allAggregationModel.delete();\n      }\n\n      this.allAggregationModel = this.getAllAggregationModel(fp64);\n    } // set up buffers for all weights\n\n  }, {\n    key: \"setupWeightAttributes\",\n    value: function setupWeightAttributes(opts) {\n      var _this$state9 = this.state,\n          weightAttributes = _this$state9.weightAttributes,\n          vertexCount = _this$state9.vertexCount,\n          weights = _this$state9.weights;\n\n      for (var id in weights) {\n        var values = weights[id].values; // values can be Array, Float32Array or Buffer\n\n        if (Array.isArray(values) || values.constructor === Float32Array) {\n          (0, _assert.default)(values.length / 3 === vertexCount);\n          var typedArray = Array.isArray(values) ? new Float32Array(values) : values;\n\n          if (weightAttributes[id] instanceof _luma.Buffer) {\n            weightAttributes[id].setData(typedArray);\n          } else {\n            weightAttributes[id] = new _luma.Buffer(this.gl, typedArray);\n          }\n        } else {\n          // assert((values instanceof Attribute) || (values instanceof Buffer));\n          (0, _assert.default)(values instanceof _luma.Buffer);\n          weightAttributes[id] = values;\n        }\n      }\n    }\n    /* eslint-disable max-statements */\n\n  }, {\n    key: \"updateModels\",\n    value: function updateModels(opts) {\n      var gl = this.gl;\n      var positions = opts.positions,\n          positions64xyLow = opts.positions64xyLow,\n          changeFlags = opts.changeFlags;\n      var _this$state10 = this.state,\n          numCol = _this$state10.numCol,\n          numRow = _this$state10.numRow;\n      var _this$state11 = this.state,\n          positionsBuffer = _this$state11.positionsBuffer,\n          positions64xyLowBuffer = _this$state11.positions64xyLowBuffer;\n      var aggregationModelAttributes = {};\n      var createPos64xyLow = false;\n\n      if (opts.fp64 !== this.state.fp64) {\n        this.setupModels(opts.fp64);\n        this.setState({\n          fp64: opts.fp64\n        });\n\n        if (opts.fp64) {\n          createPos64xyLow = true;\n        }\n      }\n\n      if (changeFlags.dataChanged || !positionsBuffer) {\n        if (positionsBuffer) {\n          positionsBuffer.delete();\n        }\n\n        var vertexCount = positions.length / 2; // positionsBuffer = new Buffer(gl, {size: 2, data: new Float32Array(positions)});\n\n        positionsBuffer = new _luma.Buffer(gl, new Float32Array(positions));\n        createPos64xyLow = opts.fp64;\n        Object.assign(aggregationModelAttributes, {\n          positions: positionsBuffer\n        });\n        this.setState({\n          positionsBuffer: positionsBuffer,\n          vertexCount: vertexCount\n        });\n        this.setupWeightAttributes(opts);\n        this.gridAggregationModel.setVertexCount(vertexCount);\n      }\n\n      if (createPos64xyLow) {\n        (0, _assert.default)(positions64xyLow);\n\n        if (positions64xyLowBuffer) {\n          positions64xyLowBuffer.delete();\n        }\n\n        positions64xyLowBuffer = new _luma.Buffer(gl, {\n          size: 2,\n          data: new Float32Array(positions64xyLow)\n        });\n        Object.assign(aggregationModelAttributes, {\n          positions64xyLow: positions64xyLowBuffer\n        });\n        this.setState({\n          positions64xyLowBuffer: positions64xyLowBuffer\n        });\n      }\n\n      this.gridAggregationModel.setAttributes(aggregationModelAttributes);\n\n      if (changeFlags.cellSizeChanged || changeFlags.viewportChanged) {\n        this.allAggregationModel.setInstanceCount(numCol * numRow);\n      }\n    }\n    /* eslint-enable max-statements */\n\n  }]);\n\n  return GPUGridAggregator;\n}();\n\nexports.default = GPUGridAggregator;\n},{\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"@deck.gl/core\":\"P3tH\",\"../../../utils/assert\":\"R2tg\",\"viewport-mercator-project\":\"ha5B\",\"./gpu-grid-aggregator-constants\":\"ReP4\",\"./aggregate-to-grid-vs.glsl\":\"uZbe\",\"./aggregate-to-grid-vs-64.glsl\":\"J8nj\",\"./aggregate-to-grid-fs.glsl\":\"ilwU\",\"./aggregate-all-vs-64.glsl\":\"SnxL\",\"./aggregate-all-fs.glsl\":\"dBcx\",\"./transform-mean-vs.glsl\":\"GULU\",\"./gpu-grid-aggregator-utils.js\":\"l4yu\"}],\"ZNUc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createIterable = createIterable;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar EMPTY_ARRAY = [];\nvar placeholderArray = [];\n/*\n * Create an Iterable\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n * and a \"context\" tracker from the given data\n */\n\nfunction createIterable(data) {\n  var iterable = EMPTY_ARRAY;\n  var objectInfo = {\n    index: -1,\n    data: data,\n    // visitor can optionally utilize this to avoid constructing a new array for every object\n    target: []\n  };\n\n  if (!data) {\n    iterable = EMPTY_ARRAY;\n  } else if (typeof data[Symbol.iterator] === 'function') {\n    // data is already an iterable\n    iterable = data;\n  } else if (data.length > 0) {\n    placeholderArray.length = data.length;\n    iterable = placeholderArray;\n  }\n\n  return {\n    iterable: iterable,\n    objectInfo: objectInfo\n  };\n}\n},{}],\"mZUr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.pointToDensityGridData = pointToDensityGridData;\nexports.alignToCell = alignToCell;\n\nvar _assert = _interopRequireDefault(require(\"../../../utils/assert\"));\n\nvar _math = require(\"math.gl\");\n\nvar _luma = require(\"luma.gl\");\n\nvar _constants = require(\"../../../lib/constants\");\n\nvar _iterableUtils = require(\"../../../utils/iterable-utils\");\n\nvar _count = require(\"../../../utils/count\");\n\nvar _gpuGridAggregatorConstants = require(\"./gpu-grid-aggregator-constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar fp64LowPart = _luma.fp64.fp64LowPart;\nvar R_EARTH = 6378000;\nvar DEFAULT_WEIGHT = [1, 0, 0]; // Takes data and aggregation params and returns aggregated data.\n\nfunction pointToDensityGridData(_ref) {\n  var data = _ref.data,\n      getPosition = _ref.getPosition,\n      cellSizeMeters = _ref.cellSizeMeters,\n      gpuGridAggregator = _ref.gpuGridAggregator,\n      gpuAggregation = _ref.gpuAggregation,\n      aggregationFlags = _ref.aggregationFlags,\n      getWeight = _ref.getWeight,\n      _ref$fp = _ref.fp64,\n      fp64 = _ref$fp === void 0 ? false : _ref$fp,\n      _ref$coordinateSystem = _ref.coordinateSystem,\n      coordinateSystem = _ref$coordinateSystem === void 0 ? _constants.COORDINATE_SYSTEM.LNGLAT : _ref$coordinateSystem,\n      _ref$viewport = _ref.viewport,\n      viewport = _ref$viewport === void 0 ? null : _ref$viewport,\n      _ref$boundingBox = _ref.boundingBox,\n      boundingBox = _ref$boundingBox === void 0 ? null : _ref$boundingBox;\n  var gridData = {};\n  (0, _assert.default)(aggregationFlags.dataChanged || aggregationFlags.cellSizeChanged || aggregationFlags.viewportChanged);\n\n  if (aggregationFlags.dataChanged) {\n    gridData = parseGridData(data, getPosition, getWeight);\n    boundingBox = gridData.boundingBox;\n  }\n\n  var cellSize = [cellSizeMeters, cellSizeMeters];\n  var worldOrigin = [0, 0];\n  (0, _assert.default)(coordinateSystem === _constants.COORDINATE_SYSTEM.LNGLAT || coordinateSystem === _constants.COORDINATE_SYSTEM.IDENTITY);\n\n  switch (coordinateSystem) {\n    case _constants.COORDINATE_SYSTEM.LNGLAT:\n    case _constants.COORDINATE_SYSTEM.LNGLAT_DEPRECATED:\n      var gridOffset = getGridOffset(boundingBox, cellSizeMeters);\n      cellSize = [gridOffset.xOffset, gridOffset.yOffset];\n      worldOrigin = [-180, -90]; // Origin used to define grid cell boundaries\n\n      break;\n\n    case _constants.COORDINATE_SYSTEM.IDENTITY:\n      var width = viewport.width,\n          height = viewport.height;\n      worldOrigin = [-width / 2, -height / 2]; // Origin used to define grid cell boundaries\n\n      break;\n\n    default:\n      // Currently other coodinate systems not supported/verified.\n      (0, _assert.default)(false);\n  }\n\n  var opts = getGPUAggregationParams({\n    boundingBox: boundingBox,\n    cellSize: cellSize,\n    worldOrigin: worldOrigin\n  });\n  var aggregatedData = gpuGridAggregator.run({\n    positions: gridData.positions,\n    positions64xyLow: gridData.positions64xyLow,\n    weights: gridData.weights,\n    cellSize: cellSize,\n    width: opts.width,\n    height: opts.height,\n    gridTransformMatrix: opts.gridTransformMatrix,\n    useGPU: gpuAggregation,\n    changeFlags: aggregationFlags,\n    fp64: fp64\n  });\n  return {\n    countsBuffer: aggregatedData.weight1.aggregationBuffer,\n    maxCountBuffer: aggregatedData.weight1.maxBuffer,\n    countsData: aggregatedData.weight1.aggregationData,\n    maxCountData: aggregatedData.weight1.maxData,\n    gridSize: opts.gridSize,\n    gridOrigin: opts.gridOrigin,\n    cellSize: cellSize,\n    boundingBox: boundingBox\n  };\n} // Parse input data to build positions, wights and bounding box.\n\n/* eslint-disable max-statements */\n\n\nfunction parseGridData(data, getPosition) {\n  var getWeight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n  var pointCount = (0, _count.count)(data);\n  var positions = new Float32Array(pointCount * 2);\n  var positions64xyLow = new Float32Array(pointCount * 2);\n  var weightValues = new Float32Array(pointCount * 3);\n  var yMin = Infinity;\n  var yMax = -Infinity;\n  var xMin = Infinity;\n  var xMax = -Infinity;\n  var y;\n  var x;\n\n  var _createIterable = (0, _iterableUtils.createIterable)(data),\n      iterable = _createIterable.iterable,\n      objectInfo = _createIterable.objectInfo;\n\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = iterable[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var object = _step.value;\n      objectInfo.index++;\n      var position = getPosition(object, objectInfo);\n      var index = objectInfo.index;\n      x = position[0];\n      y = position[1];\n      positions[index * 2] = x;\n      positions[index * 2 + 1] = y;\n      positions64xyLow[index * 2] = fp64LowPart(x);\n      positions64xyLow[index * 2 + 1] = fp64LowPart(y);\n      var weight = getWeight ? getWeight(object, objectInfo) : DEFAULT_WEIGHT; // Aggregator expects each weight is an array of size 3\n\n      if (Array.isArray(weight)) {\n        weightValues[index * 3] = weight[0];\n        weightValues[index * 3 + 1] = weight[1];\n        weightValues[index * 3 + 2] = weight[2];\n      } else {\n        // backward compitability\n        weightValues[index * 3] = weight;\n      }\n\n      if (Number.isFinite(y) && Number.isFinite(x)) {\n        yMin = y < yMin ? y : yMin;\n        yMax = y > yMax ? y : yMax;\n        xMin = x < xMin ? x : xMin;\n        xMax = x > xMax ? x : xMax;\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  var weights = {\n    weight1: {\n      size: 1,\n      operation: _gpuGridAggregatorConstants.AGGREGATION_OPERATION.SUM,\n      needMax: true,\n      values: weightValues\n    }\n  };\n  var boundingBox = {\n    xMin: xMin,\n    xMax: xMax,\n    yMin: yMin,\n    yMax: yMax\n  };\n  return {\n    positions: positions,\n    positions64xyLow: positions64xyLow,\n    weights: weights,\n    boundingBox: boundingBox\n  };\n}\n/* eslint-enable max-statements */\n\n/**\n * Based on geometric center of sample points, calculate cellSize in lng/lat (degree) space\n * @param {object} gridData - contains bounding box of data\n * @param {number} cellSize - grid cell size in meters\n * @returns {yOffset, xOffset} - cellSize size lng/lat (degree) space.\n */\n\n\nfunction getGridOffset(boundingBox, cellSize) {\n  var yMin = boundingBox.yMin,\n      yMax = boundingBox.yMax;\n  var latMin = yMin;\n  var latMax = yMax;\n  var centerLat = (latMin + latMax) / 2;\n  return calculateGridLatLonOffset(cellSize, centerLat);\n}\n/**\n * calculate grid layer cell size in lat lon based on world unit size\n * and current latitude\n * @param {number} cellSize\n * @param {number} latitude\n * @returns {object} - lat delta and lon delta\n */\n\n\nfunction calculateGridLatLonOffset(cellSize, latitude) {\n  var yOffset = calculateLatOffset(cellSize);\n  var xOffset = calculateLonOffset(latitude, cellSize);\n  return {\n    yOffset: yOffset,\n    xOffset: xOffset\n  };\n}\n/**\n * with a given x-km change, calculate the increment of latitude\n * based on stackoverflow http://stackoverflow.com/questions/7477003\n * @param {number} dy - change in km\n * @return {number} - increment in latitude\n */\n\n\nfunction calculateLatOffset(dy) {\n  return dy / R_EARTH * (180 / Math.PI);\n}\n/**\n * with a given x-km change, and current latitude\n * calculate the increment of longitude\n * based on stackoverflow http://stackoverflow.com/questions/7477003\n * @param {number} lat - latitude of current location (based on city)\n * @param {number} dx - change in km\n * @return {number} - increment in longitude\n */\n\n\nfunction calculateLonOffset(lat, dx) {\n  return dx / R_EARTH * (180 / Math.PI) / Math.cos(lat * Math.PI / 180);\n} // Aligns `inValue` to given `cellSize`\n\n\nfunction alignToCell(inValue, cellSize) {\n  var sign = inValue < 0 ? -1 : 1;\n  var value = sign < 0 ? Math.abs(inValue) + cellSize : Math.abs(inValue);\n  value = Math.floor(value / cellSize) * cellSize;\n  return value * sign;\n} // Calculate grid parameters\n\n\nfunction getGPUAggregationParams(_ref2) {\n  var boundingBox = _ref2.boundingBox,\n      cellSize = _ref2.cellSize,\n      worldOrigin = _ref2.worldOrigin;\n  var yMin = boundingBox.yMin,\n      yMax = boundingBox.yMax,\n      xMin = boundingBox.xMin,\n      xMax = boundingBox.xMax; // NOTE: this alignment will match grid cell boundaries with existing CPU implementation\n  // this gurantees identical aggregation results when switching between CPU and GPU aggregation.\n  // Also gurantees same cell boundaries, when overlapping between two different layers (like ScreenGrid and Contour)\n  // We first move worldOrigin to [0, 0], align the lower bounding box , then move worldOrigin to its original value.\n\n  var originX = alignToCell(xMin - worldOrigin[0], cellSize[0]) + worldOrigin[0];\n  var originY = alignToCell(yMin - worldOrigin[1], cellSize[1]) + worldOrigin[1]; // Setup transformation matrix so that every point is in +ve range\n\n  var gridTransformMatrix = new _math.Matrix4().translate([-1 * originX, -1 * originY, 0]); // const cellSize = [gridOffset.xOffset, gridOffset.yOffset];\n\n  var gridOrigin = [originX, originY];\n  var width = xMax - xMin + cellSize[0];\n  var height = yMax - yMin + cellSize[1];\n  var gridSize = [Math.ceil(width / cellSize[0]), Math.ceil(height / cellSize[1])];\n  return {\n    gridOrigin: gridOrigin,\n    gridSize: gridSize,\n    width: width,\n    height: height,\n    gridTransformMatrix: gridTransformMatrix\n  };\n}\n},{\"../../../utils/assert\":\"R2tg\",\"math.gl\":\"o5CE\",\"luma.gl\":\"iiNl\",\"../../../lib/constants\":\"hXbg\",\"../../../utils/iterable-utils\":\"ZNUc\",\"../../../utils/count\":\"frIP\",\"./gpu-grid-aggregator-constants\":\"ReP4\"}],\"P3tH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"COORDINATE_SYSTEM\", {\n  enumerable: true,\n  get: function () {\n    return _constants.COORDINATE_SYSTEM;\n  }\n});\nObject.defineProperty(exports, \"Deck\", {\n  enumerable: true,\n  get: function () {\n    return _deck.default;\n  }\n});\nObject.defineProperty(exports, \"LayerManager\", {\n  enumerable: true,\n  get: function () {\n    return _layerManager.default;\n  }\n});\nObject.defineProperty(exports, \"AttributeManager\", {\n  enumerable: true,\n  get: function () {\n    return _attributeManager.default;\n  }\n});\nObject.defineProperty(exports, \"Layer\", {\n  enumerable: true,\n  get: function () {\n    return _layer.default;\n  }\n});\nObject.defineProperty(exports, \"CompositeLayer\", {\n  enumerable: true,\n  get: function () {\n    return _compositeLayer.default;\n  }\n});\nObject.defineProperty(exports, \"Viewport\", {\n  enumerable: true,\n  get: function () {\n    return _viewport.default;\n  }\n});\nObject.defineProperty(exports, \"WebMercatorViewport\", {\n  enumerable: true,\n  get: function () {\n    return _webMercatorViewport.default;\n  }\n});\nObject.defineProperty(exports, \"project\", {\n  enumerable: true,\n  get: function () {\n    return _project.default;\n  }\n});\nObject.defineProperty(exports, \"project64\", {\n  enumerable: true,\n  get: function () {\n    return _project2.default;\n  }\n});\nObject.defineProperty(exports, \"lighting\", {\n  enumerable: true,\n  get: function () {\n    return _lighting.default;\n  }\n});\nObject.defineProperty(exports, \"View\", {\n  enumerable: true,\n  get: function () {\n    return _view.default;\n  }\n});\nObject.defineProperty(exports, \"MapView\", {\n  enumerable: true,\n  get: function () {\n    return _mapView.default;\n  }\n});\nObject.defineProperty(exports, \"FirstPersonView\", {\n  enumerable: true,\n  get: function () {\n    return _firstPersonView.default;\n  }\n});\nObject.defineProperty(exports, \"ThirdPersonView\", {\n  enumerable: true,\n  get: function () {\n    return _thirdPersonView.default;\n  }\n});\nObject.defineProperty(exports, \"OrbitView\", {\n  enumerable: true,\n  get: function () {\n    return _orbitView.default;\n  }\n});\nObject.defineProperty(exports, \"PerspectiveView\", {\n  enumerable: true,\n  get: function () {\n    return _perspectiveView.default;\n  }\n});\nObject.defineProperty(exports, \"OrthographicView\", {\n  enumerable: true,\n  get: function () {\n    return _orthographicView.default;\n  }\n});\nObject.defineProperty(exports, \"Controller\", {\n  enumerable: true,\n  get: function () {\n    return _controller.default;\n  }\n});\nObject.defineProperty(exports, \"MapController\", {\n  enumerable: true,\n  get: function () {\n    return _mapController.default;\n  }\n});\nObject.defineProperty(exports, \"_FirstPersonController\", {\n  enumerable: true,\n  get: function () {\n    return _firstPersonController.default;\n  }\n});\nObject.defineProperty(exports, \"_OrbitController\", {\n  enumerable: true,\n  get: function () {\n    return _orbitController.default;\n  }\n});\nObject.defineProperty(exports, \"_OrthographicController\", {\n  enumerable: true,\n  get: function () {\n    return _orthographicController.default;\n  }\n});\nObject.defineProperty(exports, \"_EffectManager\", {\n  enumerable: true,\n  get: function () {\n    return _effectManager.default;\n  }\n});\nObject.defineProperty(exports, \"_Effect\", {\n  enumerable: true,\n  get: function () {\n    return _effect.default;\n  }\n});\nObject.defineProperty(exports, \"_ReflectionEffect\", {\n  enumerable: true,\n  get: function () {\n    return _reflectionEffect.default;\n  }\n});\nObject.defineProperty(exports, \"TRANSITION_EVENTS\", {\n  enumerable: true,\n  get: function () {\n    return _transitionManager.TRANSITION_EVENTS;\n  }\n});\nObject.defineProperty(exports, \"LinearInterpolator\", {\n  enumerable: true,\n  get: function () {\n    return _linearInterpolator.default;\n  }\n});\nObject.defineProperty(exports, \"FlyToInterpolator\", {\n  enumerable: true,\n  get: function () {\n    return _viewportFlyToInterpolator.default;\n  }\n});\nObject.defineProperty(exports, \"log\", {\n  enumerable: true,\n  get: function () {\n    return _log.default;\n  }\n});\nObject.defineProperty(exports, \"_GPUGridAggregator\", {\n  enumerable: true,\n  get: function () {\n    return _gpuGridAggregator.default;\n  }\n});\nObject.defineProperty(exports, \"AGGREGATION_OPERATION\", {\n  enumerable: true,\n  get: function () {\n    return _gpuGridAggregatorConstants.AGGREGATION_OPERATION;\n  }\n});\nObject.defineProperty(exports, \"_pointToDensityGridData\", {\n  enumerable: true,\n  get: function () {\n    return _gridAggregationUtils.pointToDensityGridData;\n  }\n});\nObject.defineProperty(exports, \"createIterable\", {\n  enumerable: true,\n  get: function () {\n    return _iterableUtils.createIterable;\n  }\n});\nexports.experimental = void 0;\n\nrequire(\"./lib/init\");\n\nrequire(\"./shaderlib\");\n\nvar _constants = require(\"./lib/constants\");\n\nvar _deck = _interopRequireDefault(require(\"./lib/deck\"));\n\nvar _layerManager = _interopRequireDefault(require(\"./lib/layer-manager\"));\n\nvar _attributeManager = _interopRequireDefault(require(\"./lib/attribute-manager\"));\n\nvar _layer = _interopRequireDefault(require(\"./lib/layer\"));\n\nvar _compositeLayer = _interopRequireDefault(require(\"./lib/composite-layer\"));\n\nvar _viewport = _interopRequireDefault(require(\"./viewports/viewport\"));\n\nvar _webMercatorViewport = _interopRequireDefault(require(\"./viewports/web-mercator-viewport\"));\n\nvar _project = _interopRequireDefault(require(\"./shaderlib/project/project\"));\n\nvar _project2 = _interopRequireDefault(require(\"./shaderlib/project64/project64\"));\n\nvar _lighting = _interopRequireDefault(require(\"./shaderlib/lighting/lighting\"));\n\nvar _view = _interopRequireDefault(require(\"./views/view\"));\n\nvar _mapView = _interopRequireDefault(require(\"./views/map-view\"));\n\nvar _firstPersonView = _interopRequireDefault(require(\"./views/first-person-view\"));\n\nvar _thirdPersonView = _interopRequireDefault(require(\"./views/third-person-view\"));\n\nvar _orbitView = _interopRequireDefault(require(\"./views/orbit-view\"));\n\nvar _perspectiveView = _interopRequireDefault(require(\"./views/perspective-view\"));\n\nvar _orthographicView = _interopRequireDefault(require(\"./views/orthographic-view\"));\n\nvar _controller = _interopRequireDefault(require(\"./controllers/controller\"));\n\nvar _mapController = _interopRequireDefault(require(\"./controllers/map-controller\"));\n\nvar _firstPersonController = _interopRequireDefault(require(\"./controllers/first-person-controller\"));\n\nvar _orbitController = _interopRequireDefault(require(\"./controllers/orbit-controller\"));\n\nvar _orthographicController = _interopRequireDefault(require(\"./controllers/orthographic-controller\"));\n\nvar _effectManager = _interopRequireDefault(require(\"./experimental/lib/effect-manager\"));\n\nvar _effect = _interopRequireDefault(require(\"./experimental/lib/effect\"));\n\nvar _reflectionEffect = _interopRequireDefault(require(\"./experimental/reflection-effect/reflection-effect\"));\n\nvar _transitionManager = require(\"./controllers/transition-manager\");\n\nvar _linearInterpolator = _interopRequireDefault(require(\"./transitions/linear-interpolator\"));\n\nvar _viewportFlyToInterpolator = _interopRequireDefault(require(\"./transitions/viewport-fly-to-interpolator\"));\n\nvar _log = _interopRequireDefault(require(\"./utils/log\"));\n\nvar _flatten = require(\"./utils/flatten\");\n\nvar _binSorter = _interopRequireDefault(require(\"./utils/bin-sorter\"));\n\nvar _tesselator = _interopRequireDefault(require(\"./utils/tesselator\"));\n\nvar _colorUtils = require(\"./utils/color-utils\");\n\nvar _scaleUtils = require(\"./utils/scale-utils\");\n\nvar _gpuGridAggregator = _interopRequireDefault(require(\"./experimental/utils/gpu-grid-aggregation/gpu-grid-aggregator\"));\n\nvar _gpuGridAggregatorConstants = require(\"./experimental/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants\");\n\nvar _gridAggregationUtils = require(\"./experimental/utils/gpu-grid-aggregation/grid-aggregation-utils\");\n\nvar _iterableUtils = require(\"./utils/iterable-utils\");\n\nvar _count = require(\"./utils/count\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* eslint-disable max-len */\n// Intialize globals, check version\n// Import shaderlib to make sure shader modules are initialized\n// Core Library\n// Experimental Pure JS (non-React) bindings\n// Viewports\n// Shader modules\n// Controllers\n// Experimental Controllers\n// EXPERIMENTAL EXPORTS\n// Experimental Effects (non-React) bindings\n// Eperimental Transitions\n// Layer utilities\n// Export? move to luma.gl or math.gl?\n// Export? move to luma.gl or math.gl?\n// Exports for layers\n// Experimental Features may change in minor version bumps, use at your own risk)\nvar experimental = {\n  BinSorter: _binSorter.default,\n  Tesselator: _tesselator.default,\n  linearScale: _scaleUtils.linearScale,\n  getLinearScale: _scaleUtils.getLinearScale,\n  quantizeScale: _scaleUtils.quantizeScale,\n  getQuantizeScale: _scaleUtils.getQuantizeScale,\n  defaultColorRange: _colorUtils.defaultColorRange,\n  flattenVertices: _flatten.flattenVertices,\n  fillArray: _flatten.fillArray,\n  count: _count.count\n};\nexports.experimental = experimental;\n},{\"./lib/init\":\"HIsG\",\"./shaderlib\":\"iQYg\",\"./lib/constants\":\"hXbg\",\"./lib/deck\":\"KCP5\",\"./lib/layer-manager\":\"D2hL\",\"./lib/attribute-manager\":\"c12z\",\"./lib/layer\":\"Cvfw\",\"./lib/composite-layer\":\"kfDy\",\"./viewports/viewport\":\"sjPB\",\"./viewports/web-mercator-viewport\":\"RWhD\",\"./shaderlib/project/project\":\"CzyJ\",\"./shaderlib/project64/project64\":\"kXBR\",\"./shaderlib/lighting/lighting\":\"vVxT\",\"./views/view\":\"Xp7T\",\"./views/map-view\":\"tu7Z\",\"./views/first-person-view\":\"svAd\",\"./views/third-person-view\":\"q7Dh\",\"./views/orbit-view\":\"LV3A\",\"./views/perspective-view\":\"DBqP\",\"./views/orthographic-view\":\"j3nR\",\"./controllers/controller\":\"SwtL\",\"./controllers/map-controller\":\"RiRd\",\"./controllers/first-person-controller\":\"H7iY\",\"./controllers/orbit-controller\":\"w9Ay\",\"./controllers/orthographic-controller\":\"UtQX\",\"./experimental/lib/effect-manager\":\"LRuT\",\"./experimental/lib/effect\":\"bkMp\",\"./experimental/reflection-effect/reflection-effect\":\"mNRu\",\"./controllers/transition-manager\":\"nTOp\",\"./transitions/linear-interpolator\":\"Xz4u\",\"./transitions/viewport-fly-to-interpolator\":\"WZGr\",\"./utils/log\":\"mqAj\",\"./utils/flatten\":\"XKEb\",\"./utils/bin-sorter\":\"XSeO\",\"./utils/tesselator\":\"kR6g\",\"./utils/color-utils\":\"beCw\",\"./utils/scale-utils\":\"HrU0\",\"./experimental/utils/gpu-grid-aggregation/gpu-grid-aggregator\":\"fjaA\",\"./experimental/utils/gpu-grid-aggregation/gpu-grid-aggregator-constants\":\"ReP4\",\"./experimental/utils/gpu-grid-aggregation/grid-aggregation-utils\":\"mZUr\",\"./utils/iterable-utils\":\"ZNUc\",\"./utils/count\":\"frIP\"}],\"igD4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME arc-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec4 instanceSourceColors;\\nattribute vec4 instanceTargetColors;\\nattribute vec4 instancePositions;\\nattribute vec4 instancePositions64Low;\\nattribute vec3 instancePickingColors;\\nattribute float instanceWidths;\\n\\nuniform float numSegments;\\nuniform float opacity;\\nuniform float widthScale;\\n\\nvarying vec4 vColor;\\n\\nfloat paraboloid(vec2 source, vec2 target, float ratio) {\\n\\n  vec2 x = mix(source, target, ratio);\\n  vec2 center = mix(source, target, 0.5);\\n\\n  float dSourceCenter = distance(source, center);\\n  float dXCenter = distance(x, center);\\n  return (dSourceCenter + dXCenter) * (dSourceCenter - dXCenter);\\n}\\n\\n// offset vector by strokeWidth pixels\\n// offset_direction is -1 (left) or 1 (right)\\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction) {\\n  // normalized direction of the line\\n  vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\\n  // rotate by 90 degrees\\n  dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\\n\\n  vec2 offset_screenspace = dir_screenspace * offset_direction * instanceWidths * widthScale / 2.0;\\n  vec2 offset_clipspace = project_pixel_to_clipspace(offset_screenspace).xy;\\n\\n  return offset_clipspace;\\n}\\n\\nfloat getSegmentRatio(float index) {\\n  return smoothstep(0.0, 1.0, index / (numSegments - 1.0));\\n}\\n\\nvec3 getPos(vec2 source, vec2 target, float segmentRatio) {\\n  float vertex_height = paraboloid(source, target, segmentRatio);\\n\\n  return vec3(\\n    mix(source, target, segmentRatio),\\n    sqrt(max(0.0, vertex_height))\\n  );\\n}\\n\\nvoid main(void) {\\n  vec2 source = project_position(vec3(instancePositions.xy, 0.0), instancePositions64Low.xy).xy;\\n  vec2 target = project_position(vec3(instancePositions.zw, 0.0), instancePositions64Low.zw).xy;\\n\\n  float segmentIndex = positions.x;\\n  float segmentRatio = getSegmentRatio(segmentIndex);\\n  // if it's the first point, use next - current as direction\\n  // otherwise use current - prev\\n  float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0));\\n  float nextSegmentRatio = getSegmentRatio(segmentIndex + indexDir);\\n\\n  vec3 currPos = getPos(source, target, segmentRatio);\\n  vec3 nextPos = getPos(source, target, nextSegmentRatio);\\n  vec4 curr = project_to_clipspace(vec4(currPos, 1.0));\\n  vec4 next = project_to_clipspace(vec4(nextPos, 1.0));\\n\\n  // extrude\\n  vec2 offset = getExtrusionOffset((next.xy - curr.xy) * indexDir, positions.y);\\n  gl_Position = curr + vec4(offset, 0.0, 0.0);\\n\\n  vec4 color = mix(instanceSourceColors, instanceTargetColors, segmentRatio) / 255.;\\n  vColor = vec4(color.rgb, color.a * opacity);\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"rQ5K\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME arc-layer-vertex-shader-64\\n\\nattribute vec3 positions;\\nattribute vec4 instanceSourceColors;\\nattribute vec4 instanceTargetColors;\\n\\nattribute vec4 instancePositions;\\nattribute vec4 instancePositions64Low;\\n\\nattribute vec3 instancePickingColors;\\nattribute float instanceWidths;\\n\\nuniform float numSegments;\\nuniform float opacity;\\nuniform float widthScale;\\n\\nvarying vec4 vColor;\\n\\nvec2 paraboloid_fp64(vec2 source[2], vec2 target[2], float ratio) {\\n\\n  vec2 x[2];\\n  vec2_mix_fp64(source, target, ratio, x);\\n  vec2 center[2];\\n  vec2_mix_fp64(source, target, 0.5, center);\\n\\n  vec2 dSourceCenter = vec2_distance_fp64(source, center);\\n  vec2 dXCenter = vec2_distance_fp64(x, center);\\n  return mul_fp64(sum_fp64(dSourceCenter, dXCenter), sub_fp64(dSourceCenter, dXCenter));\\n}\\n\\n// offset vector by strokeWidth pixels\\n// offset_direction is -1 (left) or 1 (right)\\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction) {\\n  // normalized direction of the line\\n  vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\\n  // rotate by 90 degrees\\n  dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\\n\\n  vec2 offset_screenspace = dir_screenspace * offset_direction * instanceWidths * widthScale / 2.0;\\n  vec2 offset_clipspace = project_pixel_to_clipspace(offset_screenspace).xy;\\n\\n  return offset_clipspace;\\n}\\n\\nfloat getSegmentRatio(float index) {\\n  return smoothstep(0.0, 1.0, index / (numSegments - 1.0));\\n}\\n\\nvoid get_pos_fp64(vec2 source[2], vec2 target[2], float segmentRatio, out vec2 position[4]) {\\n\\n  vec2 vertex_height = paraboloid_fp64(source, target, segmentRatio);\\n\\n  vec2 position_temp[2];\\n\\n  vec2_mix_fp64(source, target, segmentRatio, position_temp);\\n\\n  position[0] = position_temp[0];\\n  position[1] = position_temp[1];\\n\\n  if (vertex_height.x < 0.0 || (vertex_height.x == 0.0 && vertex_height.y <= 0.0)) {\\n    vertex_height = vec2(0.0, 0.0);\\n  }\\n\\n  position[2] = sqrt_fp64(vertex_height);\\n  position[3] = vec2(1.0, 0.0);\\n}\\n\\nvoid main(void) {\\n  vec2 projected_source_coord[2];\\n  vec2 projected_target_coord[2];\\n\\n  project_position_fp64(instancePositions.xy, instancePositions64Low.xy, projected_source_coord);\\n  project_position_fp64(instancePositions.zw, instancePositions64Low.zw, projected_target_coord);\\n\\n  float segmentIndex = positions.x;\\n  float segmentRatio = getSegmentRatio(segmentIndex);\\n\\n  // if it's the first point, use next - current as direction\\n  // otherwise use current - prev\\n  float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0));\\n  float nextSegmentRatio = getSegmentRatio(segmentIndex + indexDir);\\n\\n  vec2 curr_pos_modelspace[4];\\n\\n  get_pos_fp64(projected_source_coord, projected_target_coord, segmentRatio,\\n    curr_pos_modelspace);\\n\\n  vec2 next_pos_modelspace[4];\\n\\n  get_pos_fp64(projected_source_coord, projected_target_coord, nextSegmentRatio,\\n    next_pos_modelspace);\\n\\n  vec4 curr_pos_clipspace = project_to_clipspace_fp64(curr_pos_modelspace);\\n  vec4 next_pos_clipspace = project_to_clipspace_fp64(next_pos_modelspace);\\n\\n  vec2 offset = getExtrusionOffset(next_pos_clipspace.xy - curr_pos_clipspace.xy, positions.y);\\n\\n  gl_Position = curr_pos_clipspace + vec4(offset, 0.0, 0.0);\\n\\n  vec4 color = mix(instanceSourceColors, instanceTargetColors, segmentRatio) / 255.;\\n  vColor = vec4(color.rgb, color.a * opacity);\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"lW4I\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME arc-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n  gl_FragColor = vColor;\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"ub4U\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _arcLayerVertex = _interopRequireDefault(require(\"./arc-layer-vertex.glsl\"));\n\nvar _arcLayerVertex2 = _interopRequireDefault(require(\"./arc-layer-vertex-64.glsl\"));\n\nvar _arcLayerFragment = _interopRequireDefault(require(\"./arc-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar fp64LowPart = _luma.fp64.fp64LowPart;\nvar DEFAULT_COLOR = [0, 0, 0, 255];\nvar defaultProps = {\n  fp64: false,\n  getSourcePosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.sourcePosition;\n    }\n  },\n  getTargetPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.targetPosition;\n    }\n  },\n  getSourceColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getTargetColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getStrokeWidth: {\n    type: 'accessor',\n    value: 1\n  },\n  widthScale: {\n    type: 'number',\n    value: 1,\n    min: 0\n  },\n  // deprecated\n  strokeWidth: {\n    deprecatedFor: 'getStrokeWidth'\n  }\n};\n\nvar ArcLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(ArcLayer, _Layer);\n\n  function ArcLayer() {\n    _classCallCheck(this, ArcLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(ArcLayer).apply(this, arguments));\n  }\n\n  _createClass(ArcLayer, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      return this.use64bitProjection() ? {\n        vs: _arcLayerVertex2.default,\n        fs: _arcLayerFragment.default,\n        modules: ['project64', 'picking']\n      } : {\n        vs: _arcLayerVertex.default,\n        fs: _arcLayerFragment.default,\n        modules: ['picking']\n      }; // 'project' module added by default.\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      var attributeManager = this.getAttributeManager();\n      /* eslint-disable max-len */\n\n      attributeManager.addInstanced({\n        instancePositions: {\n          size: 4,\n          transition: true,\n          accessor: ['getSourcePosition', 'getTargetPosition'],\n          update: this.calculateInstancePositions\n        },\n        instancePositions64Low: {\n          size: 4,\n          accessor: ['getSourcePosition', 'getTargetPosition'],\n          update: this.calculateInstancePositions64Low\n        },\n        instanceSourceColors: {\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getSourceColor',\n          defaultValue: DEFAULT_COLOR\n        },\n        instanceTargetColors: {\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getTargetColor',\n          defaultValue: DEFAULT_COLOR\n        },\n        instanceWidths: {\n          size: 1,\n          transition: true,\n          accessor: 'getStrokeWidth',\n          defaultValue: 1\n        }\n      });\n      /* eslint-enable max-len */\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var props = _ref.props,\n          oldProps = _ref.oldProps,\n          changeFlags = _ref.changeFlags;\n\n      _get(_getPrototypeOf(ArcLayer.prototype), \"updateState\", this).call(this, {\n        props: props,\n        oldProps: oldProps,\n        changeFlags: changeFlags\n      }); // Re-generate model if geometry changed\n\n\n      if (props.fp64 !== oldProps.fp64) {\n        var gl = this.context.gl;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n\n      this.state.model.setUniforms({\n        widthScale: props.widthScale\n      });\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      var positions = [];\n      var NUM_SEGMENTS = 50;\n      /*\n       *  (0, -1)-------------_(1, -1)\n       *       |          _,-\"  |\n       *       o      _,-\"      o\n       *       |  _,-\"          |\n       *   (0, 1)\"-------------(1, 1)\n       */\n\n      for (var i = 0; i < NUM_SEGMENTS; i++) {\n        positions = positions.concat([i, -1, 0, i, 1, 0]);\n      }\n\n      var model = new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _luma.Geometry({\n          drawMode: _constants.default.TRIANGLE_STRIP,\n          attributes: {\n            positions: new Float32Array(positions)\n          }\n        }),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n      model.setUniforms({\n        numSegments: NUM_SEGMENTS\n      });\n      return model;\n    }\n  }, {\n    key: \"calculateInstancePositions\",\n    value: function calculateInstancePositions(attribute) {\n      var _this$props = this.props,\n          data = _this$props.data,\n          getSourcePosition = _this$props.getSourcePosition,\n          getTargetPosition = _this$props.getTargetPosition;\n      var value = attribute.value,\n          size = attribute.size;\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n          var sourcePosition = getSourcePosition(object);\n          var targetPosition = getTargetPosition(object);\n          value[i + 0] = sourcePosition[0];\n          value[i + 1] = sourcePosition[1];\n          value[i + 2] = targetPosition[0];\n          value[i + 3] = targetPosition[1];\n          i += size;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"calculateInstancePositions64Low\",\n    value: function calculateInstancePositions64Low(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(4);\n        return;\n      }\n\n      var _this$props2 = this.props,\n          data = _this$props2.data,\n          getSourcePosition = _this$props2.getSourcePosition,\n          getTargetPosition = _this$props2.getTargetPosition;\n      var value = attribute.value,\n          size = attribute.size;\n      var i = 0;\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = data[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var object = _step2.value;\n          var sourcePosition = getSourcePosition(object);\n          var targetPosition = getTargetPosition(object);\n          value[i + 0] = fp64LowPart(sourcePosition[0]);\n          value[i + 1] = fp64LowPart(sourcePosition[1]);\n          value[i + 2] = fp64LowPart(targetPosition[0]);\n          value[i + 3] = fp64LowPart(targetPosition[1]);\n          i += size;\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n    }\n  }]);\n\n  return ArcLayer;\n}(_core.Layer);\n\nexports.default = ArcLayer;\nArcLayer.layerName = 'ArcLayer';\nArcLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./arc-layer-vertex.glsl\":\"igD4\",\"./arc-layer-vertex-64.glsl\":\"rQ5K\",\"./arc-layer-fragment.glsl\":\"lW4I\"}],\"Iu5b\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME icon-layer-vertex-shader\\n\\nattribute vec2 positions;\\n\\nattribute vec3 instancePositions;\\nattribute vec2 instancePositions64xyLow;\\nattribute float instanceSizes;\\nattribute float instanceAngles;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute vec4 instanceIconFrames;\\nattribute float instanceColorModes;\\nattribute vec2 instanceOffsets;\\n\\nuniform float sizeScale;\\nuniform vec2 iconsTextureDim;\\n\\nvarying float vColorMode;\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\n\\nvec2 rotate_by_angle(vec2 vertex, float angle) {\\n  float angle_radian = angle * PI / 180.0;\\n  float cos_angle = cos(angle_radian);\\n  float sin_angle = sin(angle_radian);\\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\\n  return rotationMatrix * vertex;\\n}\\n\\nvoid main(void) {\\n  vec2 iconSize = instanceIconFrames.zw;\\n  // scale icon height to match instanceSize\\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : instanceSizes / iconSize.y;\\n\\n  // scale and rotate vertex in \\\"pixel\\\" value and convert back to fraction in clipspace\\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * sizeScale * instanceScale;\\n  pixelOffset.y *= -1.0;\\n\\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.0));\\n  gl_Position += project_pixel_to_clipspace(pixelOffset);\\n\\n  vTextureCoords = mix(\\n    instanceIconFrames.xy,\\n    instanceIconFrames.xy + iconSize,\\n    (positions.xy + 1.0) / 2.0\\n  ) / iconsTextureDim;\\n\\n  vTextureCoords.y = 1.0 - vTextureCoords.y;\\n\\n  vColor = instanceColors / 255.;\\n\\n  vColorMode = instanceColorModes;\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"WU4n\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME icon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform float opacity;\\nuniform sampler2D iconsTexture;\\n\\nvarying float vColorMode;\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\n\\nconst float MIN_ALPHA = 0.05;\\n\\nvoid main(void) {\\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\\n\\n  // if colorMode == 0, use pixel color from the texture\\n  // if colorMode == 1 or rendering picking buffer, use texture as transparency mask\\n  vec3 color = mix(texColor.rgb, vColor.rgb, vColorMode);\\n  // Take the global opacity and the alpha from vColor into account for the alpha component\\n  float a = texColor.a * opacity * vColor.a;\\n\\n  if (a < MIN_ALPHA) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vec4(color, a);\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"qRa2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.buildMapping = buildMapping;\nexports.default = void 0;\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _slicedToArray(arr, i) {\n  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n}\n\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nfunction _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n/* global document */\n\n\nvar MAX_CANVAS_WIDTH = 1024;\nvar DEFAULT_BUFFER = 4;\nvar DEFAULT_TEXTURE_MIN_FILTER = _constants.default.LINEAR_MIPMAP_LINEAR; // GL.LINEAR is the default value but explicitly set it here\n\nvar DEFAULT_TEXTURE_MAG_FILTER = _constants.default.LINEAR;\n\nvar noop = function noop() {};\n\nfunction nextPowOfTwo(number) {\n  return Math.pow(2, Math.ceil(Math.log2(number)));\n} // resize image to given width and height\n\n\nfunction resizeImage(ctx, imageData, width, height) {\n  var naturalWidth = imageData.naturalWidth,\n      naturalHeight = imageData.naturalHeight;\n\n  if (width === naturalWidth && height === naturalHeight) {\n    return imageData;\n  }\n\n  ctx.canvas.height = height;\n  ctx.canvas.width = width;\n  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); // image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight\n\n  ctx.drawImage(imageData, 0, 0, naturalWidth, naturalHeight, 0, 0, width, height);\n  return ctx.canvas;\n} // traverse icons in a row of icon atlas\n// extend each icon with left-top coordinates\n\n\nfunction buildRowMapping(mapping, columns, yOffset) {\n  for (var i = 0; i < columns.length; i++) {\n    var _columns$i = columns[i],\n        icon = _columns$i.icon,\n        xOffset = _columns$i.xOffset;\n    mapping[icon.url] = Object.assign({}, icon, {\n      x: xOffset,\n      y: yOffset\n    });\n  }\n}\n/**\n * Generate coordinate mapping to retrieve icon left-top position from an icon atlas\n * @param icons {Array<Object>} list of icons, each icon requires url, width, height\n * @param buffer {Number} add buffer to the right and bottom side of the image\n * @param maxCanvasHeight {Number}\n * @returns {{mapping: {'/icon/1': {url, width, height, ...}},, canvasHeight: {Number}}}\n */\n\n\nfunction buildMapping(_ref) {\n  var icons = _ref.icons,\n      buffer = _ref.buffer,\n      maxCanvasWidth = _ref.maxCanvasWidth; // x position till current column\n\n  var xOffset = 0; // y position till current row\n\n  var yOffset = 0; // height of current row\n\n  var rowHeight = 0;\n  var columns = [];\n  var mapping = {}; // Strategy to layout all the icons into a texture:\n  // traverse the icons sequentially, layout the icons from left to right, top to bottom\n  // when the sum of the icons width is equal or larger than maxCanvasWidth,\n  // move to next row starting from total height so far plus max height of the icons in previous row\n  // row width is equal to maxCanvasWidth\n  // row height is decided by the max height of the icons in that row\n  // mapping coordinates of each icon is its left-top position in the texture\n\n  for (var i = 0; i < icons.length; i++) {\n    var icon = icons[i];\n\n    if (!mapping[icon.url]) {\n      var height = icon.height,\n          width = icon.width; // fill one row\n\n      if (xOffset + width + buffer > maxCanvasWidth) {\n        buildRowMapping(mapping, columns, yOffset);\n        xOffset = 0;\n        yOffset = rowHeight + yOffset + buffer;\n        rowHeight = 0;\n        columns = [];\n      }\n\n      columns.push({\n        icon: icon,\n        xOffset: xOffset\n      });\n      xOffset = xOffset + width + buffer;\n      rowHeight = Math.max(rowHeight, height);\n    }\n  }\n\n  if (columns.length > 0) {\n    buildRowMapping(mapping, columns, yOffset);\n  }\n\n  var canvasHeight = nextPowOfTwo(rowHeight + yOffset + buffer);\n  return {\n    mapping: mapping,\n    canvasHeight: canvasHeight\n  };\n} // extract unique icons from data\n\n\nfunction getIcons(data, getIcon) {\n  if (!data || !getIcon) {\n    return null;\n  }\n\n  var icons = {};\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var point = _step.value;\n      var icon = getIcon(point);\n\n      if (!icon) {\n        throw new Error('Icon is missing.');\n      }\n\n      if (!icon.url) {\n        throw new Error('Icon url is missing.');\n      }\n\n      if (!icons[icon.url]) {\n        icons[icon.url] = icon;\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  return icons;\n}\n\nvar IconManager =\n/*#__PURE__*/\nfunction () {\n  function IconManager(gl, _ref2) {\n    var _ref2$onUpdate = _ref2.onUpdate,\n        onUpdate = _ref2$onUpdate === void 0 ? noop : _ref2$onUpdate;\n\n    _classCallCheck(this, IconManager);\n\n    this.gl = gl;\n    this.onUpdate = onUpdate;\n    this._getIcon = null;\n    this._mapping = {};\n    this._texture = null;\n    this._autoPacking = false;\n    this._canvas = null;\n  }\n\n  _createClass(IconManager, [{\n    key: \"getTexture\",\n    value: function getTexture() {\n      return this._texture;\n    }\n  }, {\n    key: \"getIconMapping\",\n    value: function getIconMapping(dataPoint) {\n      var icon = this._getIcon(dataPoint);\n\n      var name = this._autoPacking ? icon.url : icon;\n      return this._mapping[name] || {};\n    }\n  }, {\n    key: \"setProps\",\n    value: function setProps(_ref3) {\n      var autoPacking = _ref3.autoPacking,\n          iconAtlas = _ref3.iconAtlas,\n          iconMapping = _ref3.iconMapping,\n          data = _ref3.data,\n          getIcon = _ref3.getIcon;\n\n      if (autoPacking !== undefined) {\n        this._autoPacking = autoPacking;\n      }\n\n      if (getIcon) {\n        this._getIcon = getIcon;\n      }\n\n      if (iconMapping) {\n        this._mapping = iconMapping;\n      }\n\n      if (iconAtlas) {\n        this._updateIconAtlas(iconAtlas);\n      }\n\n      if (this._autoPacking && (data || getIcon)) {\n        this._canvas = this._canvas || document.createElement('canvas');\n\n        this._updateAutoPacking({\n          data: data,\n          buffer: DEFAULT_BUFFER,\n          maxCanvasWidth: MAX_CANVAS_WIDTH\n        });\n      }\n    }\n  }, {\n    key: \"_updateIconAtlas\",\n    value: function _updateIconAtlas(iconAtlas) {\n      var _this = this;\n\n      if (iconAtlas instanceof _luma.Texture2D) {\n        var _iconAtlas$setParamet;\n\n        iconAtlas.setParameters((_iconAtlas$setParamet = {}, _defineProperty(_iconAtlas$setParamet, _constants.default.TEXTURE_MIN_FILTER, DEFAULT_TEXTURE_MIN_FILTER), _defineProperty(_iconAtlas$setParamet, _constants.default.TEXTURE_MAG_FILTER, DEFAULT_TEXTURE_MAG_FILTER), _iconAtlas$setParamet));\n        this._texture = iconAtlas;\n        this.onUpdate();\n      } else if (typeof iconAtlas === 'string') {\n        var _parameters;\n\n        (0, _luma.loadTextures)(this.gl, {\n          urls: [iconAtlas],\n          parameters: (_parameters = {}, _defineProperty(_parameters, _constants.default.TEXTURE_MIN_FILTER, DEFAULT_TEXTURE_MIN_FILTER), _defineProperty(_parameters, _constants.default.TEXTURE_MAG_FILTER, DEFAULT_TEXTURE_MAG_FILTER), _parameters)\n        }).then(function (_ref4) {\n          var _ref5 = _slicedToArray(_ref4, 1),\n              texture = _ref5[0];\n\n          _this._texture = texture;\n\n          _this.onUpdate();\n        });\n      }\n    }\n  }, {\n    key: \"_updateAutoPacking\",\n    value: function _updateAutoPacking(_ref6) {\n      var data = _ref6.data,\n          buffer = _ref6.buffer,\n          maxCanvasWidth = _ref6.maxCanvasWidth;\n      var icons = Object.values(getIcons(data, this._getIcon) || {});\n\n      if (icons.length > 0) {\n        // generate icon mapping\n        var _buildMapping = buildMapping({\n          icons: icons,\n          buffer: buffer,\n          maxCanvasWidth: maxCanvasWidth\n        }),\n            mapping = _buildMapping.mapping,\n            canvasHeight = _buildMapping.canvasHeight;\n\n        this._mapping = mapping; // create new texture\n\n        this._texture = new _luma.Texture2D(this.gl, {\n          width: maxCanvasWidth,\n          height: canvasHeight\n        });\n        this.onUpdate(); // load images\n\n        this._loadImages(icons);\n      }\n    }\n  }, {\n    key: \"_loadImages\",\n    value: function _loadImages(icons) {\n      var _this2 = this;\n\n      var ctx = this._canvas.getContext('2d');\n\n      var canvasHeight = this._texture.height;\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        var _loop = function _loop() {\n          var icon = _step2.value;\n          (0, _luma.loadImages)({\n            urls: [icon.url]\n          }).then(function (_ref7) {\n            var _parameters2;\n\n            var _ref8 = _slicedToArray(_ref7, 1),\n                imageData = _ref8[0];\n\n            var iconMapping = _this2._mapping[icon.url];\n            var x = iconMapping.x,\n                y = iconMapping.y,\n                width = iconMapping.width,\n                height = iconMapping.height;\n            var data = resizeImage(ctx, imageData, width, height);\n\n            _this2._texture.setSubImageData({\n              data: data,\n              x: x,\n              y: canvasHeight - y - height,\n              // flip Y as texture stored as reversed Y\n              width: width,\n              height: height,\n              parameters: (_parameters2 = {}, _defineProperty(_parameters2, _constants.default.TEXTURE_MIN_FILTER, DEFAULT_TEXTURE_MIN_FILTER), _defineProperty(_parameters2, _constants.default.TEXTURE_MAG_FILTER, DEFAULT_TEXTURE_MAG_FILTER), _defineProperty(_parameters2, _constants.default.UNPACK_FLIP_Y_WEBGL, true), _parameters2)\n            }); // Call to regenerate mipmaps after modifying texture(s)\n\n\n            _this2._texture.generateMipmap();\n\n            _this2.onUpdate();\n          });\n        };\n\n        for (var _iterator2 = icons[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          _loop();\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n    }\n  }]);\n\n  return IconManager;\n}();\n\nexports.default = IconManager;\n},{\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\"}],\"BUSa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _iconLayerVertex = _interopRequireDefault(require(\"./icon-layer-vertex.glsl\"));\n\nvar _iconLayerFragment = _interopRequireDefault(require(\"./icon-layer-fragment.glsl\"));\n\nvar _iconManager = _interopRequireDefault(require(\"./icon-manager\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar fp64LowPart = _luma.fp64.fp64LowPart;\nvar DEFAULT_COLOR = [0, 0, 0, 255];\n/*\n * @param {object} props\n * @param {Texture2D | string} props.iconAtlas - atlas image url or texture\n * @param {object} props.iconMapping - icon names mapped to icon definitions\n * @param {object} props.iconMapping[icon_name].x - x position of icon on the atlas image\n * @param {object} props.iconMapping[icon_name].y - y position of icon on the atlas image\n * @param {object} props.iconMapping[icon_name].width - width of icon on the atlas image\n * @param {object} props.iconMapping[icon_name].height - height of icon on the atlas image\n * @param {object} props.iconMapping[icon_name].anchorX - x anchor of icon on the atlas image,\n *   default to width / 2\n * @param {object} props.iconMapping[icon_name].anchorY - y anchor of icon on the atlas image,\n *   default to height / 2\n * @param {object} props.iconMapping[icon_name].mask - whether icon is treated as a transparency\n *   mask. If true, user defined color is applied. If false, original color from the image is\n *   applied. Default to false.\n * @param {number} props.size - icon size in pixels\n * @param {func} props.getPosition - returns anchor position of the icon, in [lng, lat, z]\n * @param {func} props.getIcon - returns icon name as a string\n * @param {func} props.getSize - returns icon size multiplier as a number\n * @param {func} props.getColor - returns color of the icon in [r, g, b, a]. Only works on icons\n *   with mask: true.\n * @param {func} props.getAngle - returns rotating angle (in degree) of the icon.\n */\n\nvar defaultProps = {\n  iconAtlas: null,\n  iconMapping: {\n    type: 'object',\n    value: {},\n    async: true\n  },\n  sizeScale: {\n    type: 'number',\n    value: 1,\n    min: 0\n  },\n  fp64: false,\n  getPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.position;\n    }\n  },\n  getIcon: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.icon;\n    }\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getSize: {\n    type: 'accessor',\n    value: 1\n  },\n  getAngle: {\n    type: 'accessor',\n    value: 0\n  }\n};\n\nvar IconLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(IconLayer, _Layer);\n\n  function IconLayer() {\n    _classCallCheck(this, IconLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(IconLayer).apply(this, arguments));\n  }\n\n  _createClass(IconLayer, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      var projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _iconLayerVertex.default,\n        fs: _iconLayerFragment.default,\n        modules: [projectModule, 'picking']\n      };\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      var _this = this;\n\n      this.state = {\n        iconManager: new _iconManager.default(this.context.gl, {\n          onUpdate: function onUpdate() {\n            return _this._onUpdate();\n          }\n        })\n      };\n      var attributeManager = this.getAttributeManager();\n      /* eslint-disable max-len */\n\n      attributeManager.addInstanced({\n        instancePositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getPosition'\n        },\n        instancePositions64xyLow: {\n          size: 2,\n          accessor: 'getPosition',\n          update: this.calculateInstancePositions64xyLow\n        },\n        instanceSizes: {\n          size: 1,\n          transition: true,\n          accessor: 'getSize',\n          defaultValue: 1\n        },\n        instanceOffsets: {\n          size: 2,\n          accessor: 'getIcon',\n          update: this.calculateInstanceOffsets\n        },\n        instanceIconFrames: {\n          size: 4,\n          accessor: 'getIcon',\n          update: this.calculateInstanceIconFrames\n        },\n        instanceColorModes: {\n          size: 1,\n          type: _constants.default.UNSIGNED_BYTE,\n          accessor: 'getIcon',\n          update: this.calculateInstanceColorMode\n        },\n        instanceColors: {\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getColor',\n          defaultValue: DEFAULT_COLOR\n        },\n        instanceAngles: {\n          size: 1,\n          transition: true,\n          accessor: 'getAngle',\n          defaultValue: 0\n        }\n      });\n      /* eslint-enable max-len */\n    }\n    /* eslint-disable max-statements, complexity */\n\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var oldProps = _ref.oldProps,\n          props = _ref.props,\n          changeFlags = _ref.changeFlags;\n\n      _get(_getPrototypeOf(IconLayer.prototype), \"updateState\", this).call(this, {\n        props: props,\n        oldProps: oldProps,\n        changeFlags: changeFlags\n      });\n\n      var attributeManager = this.getAttributeManager();\n      var iconManager = this.state.iconManager;\n      var iconAtlas = props.iconAtlas,\n          iconMapping = props.iconMapping,\n          data = props.data,\n          getIcon = props.getIcon;\n      var iconMappingChanged = false; // prepacked iconAtlas from user\n\n      if (iconAtlas) {\n        if (oldProps.iconAtlas !== props.iconAtlas) {\n          iconManager.setProps({\n            iconAtlas: iconAtlas,\n            autoPacking: false\n          });\n        }\n\n        if (oldProps.iconMapping !== props.iconMapping) {\n          iconManager.setProps({\n            iconMapping: iconMapping\n          });\n          iconMappingChanged = true;\n        }\n      } else {\n        // otherwise, use autoPacking\n        iconManager.setProps({\n          autoPacking: true\n        });\n      }\n\n      if (changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getIcon)) {\n        iconManager.setProps({\n          data: data,\n          getIcon: getIcon\n        });\n        iconMappingChanged = true;\n      }\n\n      if (iconMappingChanged) {\n        attributeManager.invalidate('instanceOffsets');\n        attributeManager.invalidate('instanceIconFrames');\n        attributeManager.invalidate('instanceColorModes');\n      }\n\n      if (props.fp64 !== oldProps.fp64) {\n        var gl = this.context.gl;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        attributeManager.invalidateAll();\n      }\n    }\n    /* eslint-enable max-statements, complexity */\n\n  }, {\n    key: \"draw\",\n    value: function draw(_ref2) {\n      var uniforms = _ref2.uniforms;\n      var sizeScale = this.props.sizeScale;\n      var iconManager = this.state.iconManager;\n      var iconsTexture = iconManager.getTexture();\n\n      if (iconsTexture) {\n        this.state.model.render(Object.assign({}, uniforms, {\n          iconsTexture: iconsTexture,\n          iconsTextureDim: [iconsTexture.width, iconsTexture.height],\n          sizeScale: sizeScale\n        }));\n      }\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      var positions = [-1, -1, 0, -1, 1, 0, 1, 1, 0, 1, -1, 0];\n      return new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _luma.Geometry({\n          drawMode: _constants.default.TRIANGLE_FAN,\n          attributes: {\n            positions: new Float32Array(positions)\n          }\n        }),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n  }, {\n    key: \"_onUpdate\",\n    value: function _onUpdate() {\n      this.setNeedsRedraw();\n    }\n  }, {\n    key: \"calculateInstancePositions64xyLow\",\n    value: function calculateInstancePositions64xyLow(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      var _this$props = this.props,\n          data = _this$props.data,\n          getPosition = _this$props.getPosition;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var point = _step.value;\n          var position = getPosition(point);\n          value[i++] = fp64LowPart(position[0]);\n          value[i++] = fp64LowPart(position[1]);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"calculateInstanceOffsets\",\n    value: function calculateInstanceOffsets(attribute) {\n      var data = this.props.data;\n      var iconManager = this.state.iconManager;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = data[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var object = _step2.value;\n          var rect = iconManager.getIconMapping(object);\n          value[i++] = rect.width / 2 - rect.anchorX || 0;\n          value[i++] = rect.height / 2 - rect.anchorY || 0;\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"calculateInstanceColorMode\",\n    value: function calculateInstanceColorMode(attribute) {\n      var data = this.props.data;\n      var iconManager = this.state.iconManager;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion3 = true;\n      var _didIteratorError3 = false;\n      var _iteratorError3 = undefined;\n\n      try {\n        for (var _iterator3 = data[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {\n          var object = _step3.value;\n          var mapping = iconManager.getIconMapping(object);\n          var colorMode = mapping.mask;\n          value[i++] = colorMode ? 1 : 0;\n        }\n      } catch (err) {\n        _didIteratorError3 = true;\n        _iteratorError3 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion3 && _iterator3.return != null) {\n            _iterator3.return();\n          }\n        } finally {\n          if (_didIteratorError3) {\n            throw _iteratorError3;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"calculateInstanceIconFrames\",\n    value: function calculateInstanceIconFrames(attribute) {\n      var data = this.props.data;\n      var iconManager = this.state.iconManager;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion4 = true;\n      var _didIteratorError4 = false;\n      var _iteratorError4 = undefined;\n\n      try {\n        for (var _iterator4 = data[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {\n          var object = _step4.value;\n          var rect = iconManager.getIconMapping(object);\n          value[i++] = rect.x || 0;\n          value[i++] = rect.y || 0;\n          value[i++] = rect.width || 0;\n          value[i++] = rect.height || 0;\n        }\n      } catch (err) {\n        _didIteratorError4 = true;\n        _iteratorError4 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion4 && _iterator4.return != null) {\n            _iterator4.return();\n          }\n        } finally {\n          if (_didIteratorError4) {\n            throw _iteratorError4;\n          }\n        }\n      }\n    }\n  }]);\n\n  return IconLayer;\n}(_core.Layer);\n\nexports.default = IconLayer;\nIconLayer.layerName = 'IconLayer';\nIconLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./icon-layer-vertex.glsl\":\"Iu5b\",\"./icon-layer-fragment.glsl\":\"WU4n\",\"./icon-manager\":\"qRa2\"}],\"Y4S4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME line-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 instanceSourcePositions;\\nattribute vec3 instanceTargetPositions;\\nattribute vec4 instanceSourceTargetPositions64xyLow;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute float instanceWidths;\\n\\nuniform float opacity;\\n\\nvarying vec4 vColor;\\n\\n// offset vector by strokeWidth pixels\\n// offset_direction is -1 (left) or 1 (right)\\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction) {\\n  // normalized direction of the line\\n  vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\\n  // rotate by 90 degrees\\n  dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\\n\\n  vec2 offset_screenspace = dir_screenspace * offset_direction * instanceWidths / 2.0;\\n  vec2 offset_clipspace = project_pixel_to_clipspace(offset_screenspace).xy;\\n\\n  return offset_clipspace;\\n}\\n\\nvoid main(void) {\\n  // Position\\n  vec4 source = project_position_to_clipspace(instanceSourcePositions, instanceSourceTargetPositions64xyLow.xy, vec3(0.));\\n  vec4 target = project_position_to_clipspace(instanceTargetPositions, instanceSourceTargetPositions64xyLow.zw, vec3(0.));\\n\\n  // linear interpolation of source & target to pick right coord\\n  float segmentIndex = positions.x;\\n  vec4 p = mix(source, target, segmentIndex);\\n\\n  // extrude\\n  vec2 offset = getExtrusionOffset(target.xy - source.xy, positions.y);\\n  gl_Position = p + vec4(offset, 0.0, 0.0);\\n\\n  // Color\\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"Drow\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME line-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n  gl_FragColor = vColor;\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"ooLf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _lineLayerVertex = _interopRequireDefault(require(\"./line-layer-vertex.glsl\"));\n\nvar _lineLayerFragment = _interopRequireDefault(require(\"./line-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar fp64LowPart = _luma.fp64.fp64LowPart;\nvar DEFAULT_COLOR = [0, 0, 0, 255];\nvar defaultProps = {\n  fp64: false,\n  getSourcePosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.sourcePosition;\n    }\n  },\n  getTargetPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.targetPosition;\n    }\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getStrokeWidth: {\n    type: 'accessor',\n    value: 1\n  },\n  // deprecated\n  strokeWidth: {\n    deprecatedFor: 'getStrokeWidth'\n  }\n};\n\nvar LineLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(LineLayer, _Layer);\n\n  function LineLayer() {\n    _classCallCheck(this, LineLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(LineLayer).apply(this, arguments));\n  }\n\n  _createClass(LineLayer, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      var projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _lineLayerVertex.default,\n        fs: _lineLayerFragment.default,\n        modules: [projectModule, 'picking']\n      };\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      var attributeManager = this.getAttributeManager();\n      /* eslint-disable max-len */\n\n      attributeManager.addInstanced({\n        instanceSourcePositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getSourcePosition'\n        },\n        instanceTargetPositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getTargetPosition'\n        },\n        instanceSourceTargetPositions64xyLow: {\n          size: 4,\n          accessor: ['getSourcePosition', 'getTargetPosition'],\n          update: this.calculateInstanceSourceTargetPositions64xyLow\n        },\n        instanceColors: {\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getColor',\n          defaultValue: [0, 0, 0, 255]\n        },\n        instanceWidths: {\n          size: 1,\n          transition: true,\n          accessor: 'getStrokeWidth',\n          defaultValue: 1\n        }\n      });\n      /* eslint-enable max-len */\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var props = _ref.props,\n          oldProps = _ref.oldProps,\n          changeFlags = _ref.changeFlags;\n\n      _get(_getPrototypeOf(LineLayer.prototype), \"updateState\", this).call(this, {\n        props: props,\n        oldProps: oldProps,\n        changeFlags: changeFlags\n      });\n\n      if (props.fp64 !== oldProps.fp64) {\n        var gl = this.context.gl;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      /*\n       *  (0, -1)-------------_(1, -1)\n       *       |          _,-\"  |\n       *       o      _,-\"      o\n       *       |  _,-\"          |\n       *   (0, 1)\"-------------(1, 1)\n       */\n      var positions = [0, -1, 0, 0, 1, 0, 1, -1, 0, 1, 1, 0];\n      return new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _luma.Geometry({\n          drawMode: _constants.default.TRIANGLE_STRIP,\n          attributes: {\n            positions: new Float32Array(positions)\n          }\n        }),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n  }, {\n    key: \"calculateInstanceSourceTargetPositions64xyLow\",\n    value: function calculateInstanceSourceTargetPositions64xyLow(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(4);\n        return;\n      }\n\n      var _this$props = this.props,\n          data = _this$props.data,\n          getSourcePosition = _this$props.getSourcePosition,\n          getTargetPosition = _this$props.getTargetPosition;\n      var value = attribute.value,\n          size = attribute.size;\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n          var sourcePosition = getSourcePosition(object);\n          var targetPosition = getTargetPosition(object);\n          value[i + 0] = fp64LowPart(sourcePosition[0]);\n          value[i + 1] = fp64LowPart(sourcePosition[1]);\n          value[i + 2] = fp64LowPart(targetPosition[0]);\n          value[i + 3] = fp64LowPart(targetPosition[1]);\n          i += size;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }]);\n\n  return LineLayer;\n}(_core.Layer);\n\nexports.default = LineLayer;\nLineLayer.layerName = 'LineLayer';\nLineLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./line-layer-vertex.glsl\":\"Y4S4\",\"./line-layer-fragment.glsl\":\"Drow\"}],\"TWI5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME point-cloud-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 instanceNormals;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePositions;\\nattribute vec2 instancePositions64xyLow;\\nattribute vec3 instancePickingColors;\\n\\nuniform float opacity;\\nuniform float radiusPixels;\\n\\nvarying vec4 vColor;\\nvarying vec2 unitPosition;\\n\\nvoid main(void) {\\n  // position on the containing square in [-1, 1] space\\n  unitPosition = positions.xy;\\n\\n  // Find the center of the point and add the current vertex\\n  vec4 position_worldspace;\\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.), position_worldspace);\\n  gl_Position += project_pixel_to_clipspace(positions.xy * radiusPixels);\\n\\n  // Apply lighting\\n  float lightWeight = lighting_getLightWeight(position_worldspace.xyz, // the w component is always 1.0\\n    project_normal(instanceNormals));\\n\\n  // Apply opacity to instance color, or return instance picking color\\n  vColor = vec4(lightWeight * instanceColors.rgb, instanceColors.a * opacity) / 255.;\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"Skhi\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME point-cloud-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying vec2 unitPosition;\\n\\nvoid main(void) {\\n\\n  float distToCenter = length(unitPosition);\\n\\n  if (distToCenter > 1.0) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vColor;\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"t7iL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _pointCloudLayerVertex = _interopRequireDefault(require(\"./point-cloud-layer-vertex.glsl\"));\n\nvar _pointCloudLayerFragment = _interopRequireDefault(require(\"./point-cloud-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar fp64LowPart = _luma.fp64.fp64LowPart;\nvar DEFAULT_COLOR = [0, 0, 0, 255];\nvar DEFAULT_NORMAL = [0, 0, 1];\nvar defaultProps = {\n  radiusPixels: {\n    type: 'number',\n    min: 0,\n    value: 10\n  },\n  //  point radius in pixels\n  fp64: false,\n  getPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.position;\n    }\n  },\n  getNormal: {\n    type: 'accessor',\n    value: DEFAULT_NORMAL\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  lightSettings: {}\n};\n\nvar PointCloudLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(PointCloudLayer, _Layer);\n\n  function PointCloudLayer() {\n    _classCallCheck(this, PointCloudLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(PointCloudLayer).apply(this, arguments));\n  }\n\n  _createClass(PointCloudLayer, [{\n    key: \"getShaders\",\n    value: function getShaders(id) {\n      var projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _pointCloudLayerVertex.default,\n        fs: _pointCloudLayerFragment.default,\n        modules: [projectModule, 'lighting', 'picking']\n      };\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      /* eslint-disable max-len */\n      this.getAttributeManager().addInstanced({\n        instancePositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getPosition'\n        },\n        instancePositions64xyLow: {\n          size: 2,\n          accessor: 'getPosition',\n          update: this.calculateInstancePositions64xyLow\n        },\n        instanceNormals: {\n          size: 3,\n          transition: true,\n          accessor: 'getNormal',\n          defaultValue: DEFAULT_NORMAL\n        },\n        instanceColors: {\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getColor',\n          defaultValue: DEFAULT_COLOR\n        }\n      });\n      /* eslint-enable max-len */\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var props = _ref.props,\n          oldProps = _ref.oldProps,\n          changeFlags = _ref.changeFlags;\n\n      _get(_getPrototypeOf(PointCloudLayer.prototype), \"updateState\", this).call(this, {\n        props: props,\n        oldProps: oldProps,\n        changeFlags: changeFlags\n      });\n\n      if (props.fp64 !== oldProps.fp64) {\n        var gl = this.context.gl;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref2) {\n      var uniforms = _ref2.uniforms;\n      var radiusPixels = this.props.radiusPixels;\n      this.state.model.render(Object.assign({}, uniforms, {\n        radiusPixels: radiusPixels\n      }));\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      // a triangle that minimally cover the unit circle\n      var positions = [];\n\n      for (var i = 0; i < 3; i++) {\n        var angle = i / 3 * Math.PI * 2;\n        positions.push(Math.cos(angle) * 2, Math.sin(angle) * 2, 0);\n      }\n\n      return new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _luma.Geometry({\n          drawMode: _constants.default.TRIANGLES,\n          attributes: {\n            positions: new Float32Array(positions)\n          }\n        }),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n  }, {\n    key: \"calculateInstancePositions64xyLow\",\n    value: function calculateInstancePositions64xyLow(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      var _this$props = this.props,\n          data = _this$props.data,\n          getPosition = _this$props.getPosition;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var point = _step.value;\n          var position = getPosition(point);\n          value[i++] = fp64LowPart(position[0]);\n          value[i++] = fp64LowPart(position[1]);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }]);\n\n  return PointCloudLayer;\n}(_core.Layer);\n\nexports.default = PointCloudLayer;\nPointCloudLayer.layerName = 'PointCloudLayer';\nPointCloudLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./point-cloud-layer-vertex.glsl\":\"TWI5\",\"./point-cloud-layer-fragment.glsl\":\"Skhi\"}],\"zZ70\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME scatterplot-layer-vertex-shader\\n\\nattribute vec3 positions;\\n\\nattribute vec3 instancePositions;\\nattribute vec2 instancePositions64xyLow;\\nattribute float instanceRadius;\\nattribute float instanceLineWidths;\\nattribute vec4 instanceFillColors;\\nattribute vec4 instanceLineColors;\\nattribute vec3 instancePickingColors;\\n\\nuniform float opacity;\\nuniform float radiusScale;\\nuniform float radiusMinPixels;\\nuniform float radiusMaxPixels;\\nuniform float lineWidthScale;\\nuniform float lineWidthMinPixels;\\nuniform float lineWidthMaxPixels;\\nuniform float stroked;\\nuniform bool filled;\\n\\nvarying vec4 vFillColor;\\nvarying vec4 vLineColor;\\nvarying vec2 unitPosition;\\nvarying float innerUnitRadius;\\n\\nvoid main(void) {\\n  // Multiply out radius and clamp to limits\\n  float outerRadiusPixels = clamp(\\n    project_scale(radiusScale * instanceRadius),\\n    radiusMinPixels, radiusMaxPixels\\n  );\\n  \\n  // Multiply out line width and clamp to limits\\n  float lineWidth = clamp(\\n    project_scale(lineWidthScale * instanceLineWidths), \\n    lineWidthMinPixels, lineWidthMaxPixels\\n  );\\n\\n  // outer radius needs to offset by half stroke width\\n  outerRadiusPixels += stroked * lineWidth / 2.0;\\n\\n  // position on the containing square in [-1, 1] space\\n  unitPosition = positions.xy;\\n\\n  innerUnitRadius = 1.0 - stroked * lineWidth / outerRadiusPixels;\\n  \\n  vec3 offset = positions * outerRadiusPixels;\\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, offset);\\n\\n  // Apply opacity to instance color, or return instance picking color\\n  vFillColor = vec4(instanceFillColors.rgb, instanceFillColors.a * opacity) / 255.;\\n  vLineColor = vec4(instanceLineColors.rgb, instanceLineColors.a * opacity) / 255.;\\n  \\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"D04x\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME scatterplot-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform bool filled;\\n\\nvarying vec4 vFillColor;\\nvarying vec4 vLineColor;\\nvarying vec2 unitPosition;\\nvarying float innerUnitRadius;\\n\\nvoid main(void) {\\n\\n  float distToCenter = length(unitPosition);\\n\\n  if (distToCenter > 1.0) {\\n    discard;\\n  } \\n  if (distToCenter > innerUnitRadius) {\\n    gl_FragColor = vLineColor;\\n  } else if (filled) {\\n    gl_FragColor = vFillColor;\\n  } else {\\n    discard;\\n  }\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"mZQa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _scatterplotLayerVertex = _interopRequireDefault(require(\"./scatterplot-layer-vertex.glsl\"));\n\nvar _scatterplotLayerFragment = _interopRequireDefault(require(\"./scatterplot-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar fp64LowPart = _luma.fp64.fp64LowPart;\nvar DEFAULT_COLOR = [0, 0, 0, 255];\nvar defaultProps = {\n  radiusScale: {\n    type: 'number',\n    min: 0,\n    value: 1\n  },\n  radiusMinPixels: {\n    type: 'number',\n    min: 0,\n    value: 0\n  },\n  //  min point radius in pixels\n  radiusMaxPixels: {\n    type: 'number',\n    min: 0,\n    value: Number.MAX_SAFE_INTEGER\n  },\n  // max point radius in pixels\n  lineWidthScale: {\n    type: 'number',\n    min: 0,\n    value: 1\n  },\n  lineWidthMinPixels: {\n    type: 'number',\n    min: 0,\n    value: 0\n  },\n  lineWidthMaxPixels: {\n    type: 'number',\n    min: 0,\n    value: Number.MAX_SAFE_INTEGER\n  },\n  stroked: false,\n  fp64: false,\n  filled: true,\n  getPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.position;\n    }\n  },\n  getRadius: {\n    type: 'accessor',\n    value: 1\n  },\n  getFillColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getLineColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getLineWidth: {\n    type: 'accessor',\n    value: 1\n  },\n  // deprecated\n  strokeWidth: {\n    deprecatedFor: 'getLineWidth'\n  },\n  outline: {\n    deprecatedFor: 'stroked'\n  },\n  getColor: {\n    deprecatedFor: ['getFillColor', 'getLineColor']\n  }\n};\n\nvar ScatterplotLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(ScatterplotLayer, _Layer);\n\n  function ScatterplotLayer() {\n    _classCallCheck(this, ScatterplotLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(ScatterplotLayer).apply(this, arguments));\n  }\n\n  _createClass(ScatterplotLayer, [{\n    key: \"getShaders\",\n    value: function getShaders(id) {\n      var projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _scatterplotLayerVertex.default,\n        fs: _scatterplotLayerFragment.default,\n        modules: [projectModule, 'picking']\n      };\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      this.getAttributeManager().addInstanced({\n        instancePositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getPosition'\n        },\n        instancePositions64xyLow: {\n          size: 2,\n          accessor: 'getPosition',\n          update: this.calculateInstancePositions64xyLow\n        },\n        instanceRadius: {\n          size: 1,\n          transition: true,\n          accessor: 'getRadius',\n          defaultValue: 1\n        },\n        instanceFillColors: {\n          size: 4,\n          transition: true,\n          type: _constants.default.UNSIGNED_BYTE,\n          accessor: 'getFillColor',\n          defaultValue: [0, 0, 0, 255]\n        },\n        instanceLineColors: {\n          size: 4,\n          transition: true,\n          type: _constants.default.UNSIGNED_BYTE,\n          accessor: 'getLineColor',\n          defaultValue: [0, 0, 0, 255]\n        },\n        instanceLineWidths: {\n          size: 1,\n          transition: true,\n          accessor: 'getLineWidth',\n          defaultValue: 1\n        }\n      });\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var props = _ref.props,\n          oldProps = _ref.oldProps,\n          changeFlags = _ref.changeFlags;\n\n      _get(_getPrototypeOf(ScatterplotLayer.prototype), \"updateState\", this).call(this, {\n        props: props,\n        oldProps: oldProps,\n        changeFlags: changeFlags\n      });\n\n      if (props.fp64 !== oldProps.fp64) {\n        var gl = this.context.gl;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref2) {\n      var uniforms = _ref2.uniforms;\n      var _this$props = this.props,\n          radiusScale = _this$props.radiusScale,\n          radiusMinPixels = _this$props.radiusMinPixels,\n          radiusMaxPixels = _this$props.radiusMaxPixels,\n          stroked = _this$props.stroked,\n          filled = _this$props.filled,\n          lineWidthScale = _this$props.lineWidthScale,\n          lineWidthMinPixels = _this$props.lineWidthMinPixels,\n          lineWidthMaxPixels = _this$props.lineWidthMaxPixels;\n      this.state.model.render(Object.assign({}, uniforms, {\n        stroked: stroked ? 1 : 0,\n        filled: filled,\n        radiusScale: radiusScale,\n        radiusMinPixels: radiusMinPixels,\n        radiusMaxPixels: radiusMaxPixels,\n        lineWidthScale: lineWidthScale,\n        lineWidthMinPixels: lineWidthMinPixels,\n        lineWidthMaxPixels: lineWidthMaxPixels\n      }));\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      // a square that minimally cover the unit circle\n      var positions = [-1, -1, 0, -1, 1, 0, 1, 1, 0, 1, -1, 0];\n      return new _luma.Model(gl, Object.assign(this.getShaders(), {\n        id: this.props.id,\n        geometry: new _luma.Geometry({\n          drawMode: _constants.default.TRIANGLE_FAN,\n          attributes: {\n            positions: new Float32Array(positions)\n          }\n        }),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n  }, {\n    key: \"calculateInstancePositions64xyLow\",\n    value: function calculateInstancePositions64xyLow(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      var _this$props2 = this.props,\n          data = _this$props2.data,\n          getPosition = _this$props2.getPosition;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var point = _step.value;\n          var position = getPosition(point);\n          value[i++] = fp64LowPart(position[0]);\n          value[i++] = fp64LowPart(position[1]);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }]);\n\n  return ScatterplotLayer;\n}(_core.Layer);\n\nexports.default = ScatterplotLayer;\nScatterplotLayer.layerName = 'ScatterplotLayer';\nScatterplotLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./scatterplot-layer-vertex.glsl\":\"zZ70\",\"./scatterplot-layer-fragment.glsl\":\"D04x\"}],\"iikU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#version 300 es\\n#define SHADER_NAME screen-grid-layer-vertex-shader\\n#define RANGE_COUNT 6\\n\\nin vec3 vertices;\\nin vec3 instancePositions;\\nin vec4 instanceCounts;\\nin vec3 instancePickingColors;\\n\\nlayout(std140) uniform;\\nuniform float opacity;\\nuniform vec3 cellScale;\\nuniform vec4 minColor;\\nuniform vec4 maxColor;\\nuniform AggregationData\\n{\\n  vec4 maxCount;\\n} aggregationData;\\n\\nuniform vec4 colorRange[RANGE_COUNT];\\nuniform vec2 colorDomain;\\nuniform bool shouldUseMinMax;\\n\\nout vec4 vColor;\\nout float vSampleCount;\\n\\nvec4 quantizeScale(vec2 domain, vec4 range[RANGE_COUNT], float value) {\\n  vec4 outColor = vec4(0., 0., 0., 0.);\\n  if (value >= domain.x && value <= domain.y) {\\n    float domainRange = domain.y - domain.x;\\n    if (domainRange <= 0.) {\\n      outColor = colorRange[0];\\n    } else {\\n      float rangeCount = float(RANGE_COUNT);\\n      float rangeStep = domainRange / rangeCount;\\n      float idx = floor((value - domain.x) / rangeStep);\\n      idx = clamp(idx, 0., rangeCount - 1.);\\n      int intIdx = int(idx);\\n      outColor = colorRange[intIdx];\\n    }\\n  }\\n  outColor = outColor / 255.;\\n  return outColor;\\n}\\n\\nvoid main(void) {\\n  vSampleCount = instanceCounts.a;\\n\\n  float weight = instanceCounts.r ;\\n  float maxWeight = aggregationData.maxCount.r;\\n  float step = weight / maxWeight;\\n  vec4 minMaxColor = mix(minColor, maxColor, step) / 255.;\\n\\n  vec2 domain = colorDomain;\\n  float domainMaxValid = float(colorDomain.y != 0.);\\n  domain.y = mix(maxWeight, colorDomain.y, domainMaxValid);\\n  vec4 rangeColor = quantizeScale(domain, colorRange, weight);\\n\\n  float rangeMinMax = float(shouldUseMinMax);\\n  vec4 color = mix(rangeColor, minMaxColor, rangeMinMax);\\n  vColor = vec4(color.rgb, color.a * opacity);\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n\\n  gl_Position = vec4(instancePositions + vertices * cellScale, 1.);\\n}\\n\";\nexports.default = _default;\n},{}],\"R8HC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME screen-grid-layer-vertex-shader-webgl1\\n#define RANGE_COUNT 6\\n\\nattribute vec3 vertices;\\nattribute vec3 instancePositions;\\nattribute vec4 instanceCounts;\\nattribute vec3 instancePickingColors;\\n\\nuniform float opacity;\\nuniform vec3 cellScale;\\nuniform vec4 minColor;\\nuniform vec4 maxColor;\\nuniform float maxWeight;\\nuniform vec4 colorRange[RANGE_COUNT];\\nuniform vec2 colorDomain;\\nuniform bool shouldUseMinMax;\\n\\nvarying vec4 vColor;\\nvarying float vSampleCount;\\n\\nvec4 quantizeScale(vec2 domain, vec4 range[RANGE_COUNT], float value) {\\n  vec4 outColor = vec4(0., 0., 0., 0.);\\n  if (value >= domain.x && value <= domain.y) {\\n    float domainRange = domain.y - domain.x;\\n    if (domainRange <= 0.) {\\n      outColor = colorRange[0];\\n    } else {\\n      float rangeCount = float(RANGE_COUNT);\\n      float rangeStep = domainRange / rangeCount;\\n      float idx = floor((value - domain.x) / rangeStep);\\n      idx = clamp(idx, 0., rangeCount - 1.);\\n      int intIdx = int(idx);\\n      outColor = colorRange[intIdx];\\n    }\\n  }\\n  outColor = outColor / 255.;\\n  return outColor;\\n}\\n\\nvoid main(void) {\\n  vSampleCount = instanceCounts.a;\\n\\n  float weight = instanceCounts.r;\\n  float step = weight / maxWeight;\\n  vec4 minMaxColor = mix(minColor, maxColor, step) / 255.;\\n\\n  vec2 domain = colorDomain;\\n  float domainMaxValid = float(colorDomain.y != 0.);\\n  domain.y = mix(maxWeight, colorDomain.y, domainMaxValid);\\n  vec4 rangeColor = quantizeScale(domain, colorRange, weight);\\n\\n  float rangeMinMax = float(shouldUseMinMax);\\n  vec4 color = mix(rangeColor, minMaxColor, rangeMinMax);\\n  vColor = vec4(color.rgb, color.a * opacity);\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n\\n  gl_Position = vec4(instancePositions + vertices * cellScale, 1.);\\n}\\n\";\nexports.default = _default;\n},{}],\"eEJl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* fragment shader for the grid-layer */\nvar _default = \"#version 300 es\\n#define SHADER_NAME screen-grid-layer-fragment-shader\\n\\nprecision highp float;\\n\\nin vec4 vColor;\\nin float vSampleCount;\\nout vec4 fragColor;\\n\\nvoid main(void) {\\n  if (vSampleCount <= 0.0) {\\n    discard;\\n  }\\n  fragColor = vColor;\\n\\n  fragColor = picking_filterColor(fragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"H6eZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* fragment shader for the grid-layer */\nvar _default = \"#define SHADER_NAME screen-grid-layer-fragment-shader-webgl1\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying float vSampleCount;\\n\\nvoid main(void) {\\n  if (vSampleCount <= 0.0) {\\n    discard;\\n  }\\n  gl_FragColor = vColor;\\n\\n  gl_FragColor = picking_filterColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"hHAZ\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _screenGridLayerVertex = _interopRequireDefault(require(\"./screen-grid-layer-vertex.glsl\"));\n\nvar _screenGridLayerVertexWebgl = _interopRequireDefault(require(\"./screen-grid-layer-vertex-webgl1.glsl\"));\n\nvar _screenGridLayerFragment = _interopRequireDefault(require(\"./screen-grid-layer-fragment.glsl\"));\n\nvar _screenGridLayerFragmentWebgl = _interopRequireDefault(require(\"./screen-grid-layer-fragment-webgl1.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// import {Layer, WebMercatorViewport, createIterable, log, experimental} from '@deck.gl/core';\n\n\nvar count = _core.experimental.count,\n    defaultColorRange = _core.experimental.defaultColorRange;\nvar DEFAULT_MINCOLOR = [0, 0, 0, 0];\nvar DEFAULT_MAXCOLOR = [0, 255, 0, 255];\nvar AGGREGATION_DATA_UBO_INDEX = 0;\nvar COLOR_PROPS = [\"minColor\", \"maxColor\", \"colorRange\", \"colorDomain\"];\nvar defaultProps = {\n  cellSizePixels: {\n    value: 100,\n    min: 1\n  },\n  cellMarginPixels: {\n    value: 2,\n    min: 0,\n    max: 5\n  },\n  colorDomain: null,\n  colorRange: defaultColorRange,\n  getPosition: {\n    type: 'accessor',\n    value: function value(d) {\n      return d.position;\n    }\n  },\n  getWeight: {\n    type: 'accessor',\n    value: function value(d) {\n      return [1, 0, 0];\n    }\n  },\n  gpuAggregation: true,\n  aggregation: 'SUM'\n};\n\nvar ScreenGridLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(ScreenGridLayer, _Layer);\n\n  function ScreenGridLayer() {\n    _classCallCheck(this, ScreenGridLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(ScreenGridLayer).apply(this, arguments));\n  }\n\n  _createClass(ScreenGridLayer, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      var shaders = (0, _luma.isWebGL2)(this.context.gl) ? {\n        vs: _screenGridLayerVertex.default,\n        fs: _screenGridLayerFragment.default\n      } : {\n        vs: _screenGridLayerVertexWebgl.default,\n        fs: _screenGridLayerFragmentWebgl.default\n      };\n      shaders.modules = ['picking'];\n      return shaders;\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      var attributeManager = this.getAttributeManager();\n      var gl = this.context.gl;\n      /* eslint-disable max-len */\n\n      attributeManager.addInstanced({\n        instancePositions: {\n          size: 3,\n          update: this.calculateInstancePositions\n        },\n        instanceCounts: {\n          size: 4,\n          transition: true,\n          accessor: ['getPosition', 'getWeight'],\n          update: this.calculateInstanceCounts,\n          noAlloc: true\n        }\n      });\n      /* eslint-disable max-len */\n\n      var options = {\n        id: \"\".concat(this.id, \"-aggregator\"),\n        shaderCache: this.context.shaderCache\n      };\n\n      var maxBuffer = this._getMaxCountBuffer(gl);\n\n      var weights = {\n        color: {\n          size: 1,\n          operation: _core.AGGREGATION_OPERATION.SUM,\n          needMax: true,\n          maxBuffer: maxBuffer\n        }\n      };\n      this.setState({\n        model: this._getModel(gl),\n        gpuGridAggregator: new _core._GPUGridAggregator(gl, options),\n        maxBuffer: maxBuffer,\n        weights: weights,\n        aggregationResults: null\n      });\n\n      this._setupUniformBuffer();\n    }\n  }, {\n    key: \"shouldUpdateState\",\n    value: function shouldUpdateState(_ref) {\n      var changeFlags = _ref.changeFlags;\n      return changeFlags.somethingChanged;\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(opts) {\n      _get(_getPrototypeOf(ScreenGridLayer.prototype), \"updateState\", this).call(this, opts);\n\n      this._updateUniforms(opts);\n\n      if (opts.changeFlags.dataChanged) {\n        this._processData();\n      }\n\n      var changeFlags = this._getAggregationChangeFlags(opts);\n\n      if (changeFlags) {\n        this._updateAggregation(changeFlags);\n      }\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref2) {\n      var uniforms = _ref2.uniforms;\n      var gl = this.context.gl;\n      var _this$props$parameter = this.props.parameters,\n          parameters = _this$props$parameter === void 0 ? {} : _this$props$parameter;\n      var minColor = this.props.minColor || DEFAULT_MINCOLOR;\n      var maxColor = this.props.maxColor || DEFAULT_MAXCOLOR; // If colorDomain not specified we use default domain [1, maxCount]\n      // maxCount value will be deduced from aggregated buffer in the vertex shader.\n\n      var colorDomain = this.props.colorDomain || [1, 0];\n      var _this$state = this.state,\n          model = _this$state.model,\n          maxBuffer = _this$state.maxBuffer,\n          cellScale = _this$state.cellScale,\n          shouldUseMinMax = _this$state.shouldUseMinMax,\n          colorRange = _this$state.colorRange,\n          maxWeight = _this$state.maxWeight;\n      var layerUniforms = {\n        minColor: minColor,\n        maxColor: maxColor,\n        cellScale: cellScale,\n        colorRange: colorRange,\n        colorDomain: colorDomain,\n        shouldUseMinMax: shouldUseMinMax\n      };\n\n      if ((0, _luma.isWebGL2)(gl)) {\n        maxBuffer.bind({\n          target: _constants.default.UNIFORM_BUFFER\n        });\n      } else {\n        layerUniforms.maxWeight = maxWeight;\n      }\n\n      uniforms = Object.assign(layerUniforms, uniforms);\n      model.draw({\n        uniforms: uniforms,\n        parameters: Object.assign({\n          depthTest: false,\n          depthMask: false\n        }, parameters)\n      });\n\n      if ((0, _luma.isWebGL2)(gl)) {\n        maxBuffer.unbind();\n      }\n    }\n  }, {\n    key: \"calculateInstancePositions\",\n    value: function calculateInstancePositions(attribute, _ref3) {\n      var numInstances = _ref3.numInstances;\n      var _this$context$viewpor = this.context.viewport,\n          width = _this$context$viewpor.width,\n          height = _this$context$viewpor.height;\n      var cellSizePixels = this.props.cellSizePixels;\n      var numCol = this.state.numCol;\n      var value = attribute.value,\n          size = attribute.size;\n\n      for (var i = 0; i < numInstances; i++) {\n        var x = i % numCol;\n        var y = Math.floor(i / numCol);\n        value[i * size + 0] = x * cellSizePixels / width * 2 - 1;\n        value[i * size + 1] = 1 - y * cellSizePixels / height * 2;\n        value[i * size + 2] = 0;\n      }\n    }\n  }, {\n    key: \"calculateInstanceCounts\",\n    value: function calculateInstanceCounts(attribute, _ref4) {\n      var numInstances = _ref4.numInstances;\n      var aggregationBuffer = this.state.aggregationBuffer;\n      attribute.update({\n        buffer: aggregationBuffer\n      });\n    }\n  }, {\n    key: \"getPickingInfo\",\n    value: function getPickingInfo(_ref5) {\n      var info = _ref5.info,\n          mode = _ref5.mode;\n      var index = info.index;\n\n      if (index >= 0) {\n        var aggregationResults = this.state.aggregationResults; // Cache aggregationResults to avoid multiple buffer reads.\n\n        aggregationResults.aggregationData = aggregationResults.aggregationData || this.state.aggregationBuffer.getData();\n        aggregationResults.maxData = aggregationResults.maxData || this.state.maxBuffer.getData();\n        var aggregationData = aggregationResults.aggregationData,\n            maxData = aggregationResults.maxData; // Each instance (one cell) is aggregated into single pixel,\n        // Get current instance's aggregation details.\n\n        info.object = _core._GPUGridAggregator.getAggregationData({\n          aggregationData: aggregationData,\n          maxData: maxData,\n          pixelIndex: index\n        });\n      }\n\n      return info;\n    } // HELPER Methods\n\n  }, {\n    key: \"_getAggregationChangeFlags\",\n    value: function _getAggregationChangeFlags(_ref6) {\n      var oldProps = _ref6.oldProps,\n          props = _ref6.props,\n          changeFlags = _ref6.changeFlags;\n      var cellSizeChanged = props.cellSizePixels !== oldProps.cellSizePixels || props.cellMarginPixels !== oldProps.cellMarginPixels;\n      var dataChanged = changeFlags.dataChanged || props.aggregation !== oldProps.aggregation;\n      var viewportChanged = changeFlags.viewportChanged;\n\n      if (cellSizeChanged || dataChanged || viewportChanged) {\n        return {\n          cellSizeChanged: cellSizeChanged,\n          dataChanged: dataChanged,\n          viewportChanged: viewportChanged\n        };\n      }\n\n      return null;\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      return new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _luma.Geometry({\n          drawMode: _constants.default.TRIANGLE_FAN,\n          attributes: {\n            vertices: new Float32Array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0])\n          }\n        }),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    } // Creates and returns a Uniform Buffer object to hold maxCount value.\n\n  }, {\n    key: \"_getMaxCountBuffer\",\n    value: function _getMaxCountBuffer(gl) {\n      return new _luma.Buffer(gl, {\n        bytes: 4 * 4,\n        // Four floats\n        size: 4,\n        index: AGGREGATION_DATA_UBO_INDEX\n      });\n    } // Process 'data' and build positions and weights Arrays.\n\n  }, {\n    key: \"_processData\",\n    value: function _processData() {\n      var _this$props = this.props,\n          data = _this$props.data,\n          getPosition = _this$props.getPosition,\n          getWeight = _this$props.getWeight;\n      var pointCount = count(data);\n      var positions = new Float64Array(pointCount * 2);\n      var colorWeights = new Float32Array(pointCount * 3);\n      var weights = this.state.weights;\n\n      var _createIterable = (0, _core.createIterable)(data),\n          iterable = _createIterable.iterable,\n          objectInfo = _createIterable.objectInfo;\n\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = iterable[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n          objectInfo.index++;\n          var position = getPosition(object, objectInfo);\n          var weight = getWeight(object, objectInfo);\n          var index = objectInfo.index;\n          positions[index * 2] = position[0];\n          positions[index * 2 + 1] = position[1];\n\n          if (Array.isArray(weight)) {\n            colorWeights[index * 3] = weight[0];\n            colorWeights[index * 3 + 1] = weight[1];\n            colorWeights[index * 3 + 2] = weight[2];\n          } else {\n            // backward compitability\n            colorWeights[index * 3] = weight;\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      weights.color.values = colorWeights;\n      this.setState({\n        positions: positions\n      });\n    } // Set a binding point for the aggregation uniform block index\n\n  }, {\n    key: \"_setupUniformBuffer\",\n    value: function _setupUniformBuffer() {\n      var gl = this.context.gl; // For WebGL1, uniform buffer is not used.\n\n      if (!(0, _luma.isWebGL2)(gl)) {\n        return;\n      }\n\n      var programHandle = this.state.model.program.handle; // TODO: Replace with luma.gl api when ready.\n\n      var uniformBlockIndex = gl.getUniformBlockIndex(programHandle, 'AggregationData');\n      gl.uniformBlockBinding(programHandle, uniformBlockIndex, AGGREGATION_DATA_UBO_INDEX);\n    }\n  }, {\n    key: \"_shouldUseMinMax\",\n    value: function _shouldUseMinMax() {\n      var _this$props2 = this.props,\n          minColor = _this$props2.minColor,\n          maxColor = _this$props2.maxColor,\n          colorDomain = _this$props2.colorDomain,\n          colorRange = _this$props2.colorRange;\n\n      if (minColor || maxColor) {\n        _core.log.deprecated('ScreenGridLayer props: minColor and maxColor', 'colorRange, colorDomain')();\n\n        return true;\n      } // minColor and maxColor not supplied, check if colorRange or colorDomain supplied.\n      // NOTE: colorDomain and colorRange are experimental features, use them only when supplied.\n\n\n      if (colorDomain || colorRange) {\n        return false;\n      } // None specified, use default minColor and maxColor\n\n\n      return true;\n    }\n  }, {\n    key: \"_updateAggregation\",\n    value: function _updateAggregation(changeFlags) {\n      var attributeManager = this.getAttributeManager();\n\n      if (changeFlags.cellSizeChanged || changeFlags.viewportChanged) {\n        this._updateGridParams();\n\n        attributeManager.invalidateAll();\n      }\n\n      var _this$props3 = this.props,\n          cellSizePixels = _this$props3.cellSizePixels,\n          gpuAggregation = _this$props3.gpuAggregation;\n      var _this$state2 = this.state,\n          positions = _this$state2.positions,\n          weights = _this$state2.weights;\n      var viewport = this.context.viewport;\n      weights.color.operation = _core.AGGREGATION_OPERATION[this.props.aggregation.toUpperCase()] || _core.AGGREGATION_OPERATION.SUM;\n      var projectPoints = false;\n      var gridTransformMatrix = null;\n\n      if (this.context.viewport instanceof _core.WebMercatorViewport) {\n        // project points from world space (lng/lat) to viewport (screen) space.\n        projectPoints = true;\n      } else {\n        projectPoints = false; // Use pixelProjectionMatrix to transform points to viewport (screen) space.\n\n        gridTransformMatrix = viewport.pixelProjectionMatrix;\n      }\n\n      var results = this.state.gpuGridAggregator.run({\n        positions: positions,\n        weights: weights,\n        cellSize: [cellSizePixels, cellSizePixels],\n        viewport: viewport,\n        changeFlags: changeFlags,\n        useGPU: gpuAggregation,\n        projectPoints: projectPoints,\n        gridTransformMatrix: gridTransformMatrix\n      });\n      var maxWeight = results.color.maxData && Number.isFinite(results.color.maxData[0]) ? results.color.maxData[0] : 0; // Under WebGL1 results are available in JS Arrays\n      // For WebGL2, data is in Buffer objects and will be read on demand (like picking)\n\n      var aggregationResults = {\n        aggregationData: results.color.aggregationData,\n        maxData: results.color.maxData\n      };\n      this.setState({\n        aggregationResults: aggregationResults,\n        maxWeight: maxWeight // uniform to use under WebGL1\n\n      });\n      attributeManager.invalidate('instanceCounts');\n    }\n  }, {\n    key: \"_updateUniforms\",\n    value: function _updateUniforms(_ref7) {\n      var oldProps = _ref7.oldProps,\n          props = _ref7.props,\n          changeFlags = _ref7.changeFlags;\n      var newState = {};\n\n      if (COLOR_PROPS.some(function (key) {\n        return oldProps[key] !== props[key];\n      })) {\n        newState.shouldUseMinMax = this._shouldUseMinMax();\n      }\n\n      if (oldProps.colorRange !== props.colorRange) {\n        var colorRangeUniform = [];\n        props.colorRange.forEach(function (color) {\n          colorRangeUniform.push(color[0], color[1], color[2], color[3] || 255);\n        });\n        newState.colorRange = colorRangeUniform;\n      }\n\n      if (oldProps.cellMarginPixels !== props.cellMarginPixels || oldProps.cellSizePixels !== props.cellSizePixels || changeFlags.viewportChanged) {\n        var _this$context$viewpor2 = this.context.viewport,\n            width = _this$context$viewpor2.width,\n            height = _this$context$viewpor2.height;\n        var _this$props4 = this.props,\n            cellSizePixels = _this$props4.cellSizePixels,\n            cellMarginPixels = _this$props4.cellMarginPixels;\n        var margin = cellSizePixels > cellMarginPixels ? cellMarginPixels : 0;\n        newState.cellScale = new Float32Array([(cellSizePixels - margin) / width * 2, -(cellSizePixels - margin) / height * 2, 1]);\n      }\n\n      this.setState(newState);\n    }\n  }, {\n    key: \"_updateGridParams\",\n    value: function _updateGridParams() {\n      var _this$context$viewpor3 = this.context.viewport,\n          width = _this$context$viewpor3.width,\n          height = _this$context$viewpor3.height;\n      var cellSizePixels = this.props.cellSizePixels;\n      var gl = this.context.gl;\n      var numCol = Math.ceil(width / cellSizePixels);\n      var numRow = Math.ceil(height / cellSizePixels);\n      var numInstances = numCol * numRow;\n      var dataBytes = numInstances * 4 * 4;\n      var aggregationBuffer = this.state.aggregationBuffer;\n\n      if (aggregationBuffer) {\n        aggregationBuffer.delete();\n      }\n\n      aggregationBuffer = new _luma.Buffer(gl, {\n        size: 4,\n        bytes: dataBytes,\n        type: _constants.default.FLOAT,\n        instanced: 1\n      });\n      this.state.weights.color.aggregationBuffer = aggregationBuffer;\n      this.setState({\n        numCol: numCol,\n        numRow: numRow,\n        numInstances: numInstances,\n        aggregationBuffer: aggregationBuffer\n      });\n    }\n  }]);\n\n  return ScreenGridLayer;\n}(_core.Layer);\n\nexports.default = ScreenGridLayer;\nScreenGridLayer.layerName = 'ScreenGridLayer';\nScreenGridLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./screen-grid-layer-vertex.glsl\":\"iikU\",\"./screen-grid-layer-vertex-webgl1.glsl\":\"R8HC\",\"./screen-grid-layer-fragment.glsl\":\"eEJl\",\"./screen-grid-layer-fragment-webgl1.glsl\":\"H6eZ\"}],\"k0Cw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Inspired by screen-grid-layer vertex shader in deck.gl\nvar _default = \"#define SHADER_NAME grid-cell-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 normals;\\n\\nattribute vec3 instancePositions;\\nattribute vec2 instancePositions64xyLow;\\nattribute float instanceElevations;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\n\\n// Custom uniforms\\nuniform float extruded;\\nuniform float cellSize;\\nuniform float coverage;\\nuniform float opacity;\\nuniform float elevationScale;\\n\\n// A magic number to scale elevation so that 1 unit approximate to 1 meter\\n#define ELEVATION_SCALE 0.8\\n\\n// Result\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n\\n  // if ahpha == 0.0 or z < 0.0, do not render element\\n  float noRender = float(instanceColors.a == 0.0 || instanceElevations < 0.0);\\n  float finalCellSize = project_scale(cellSize) * mix(1.0, 0.0, noRender);\\n\\n  float elevation = 0.0;\\n\\n  if (extruded > 0.5) {\\n    elevation = instanceElevations  * (positions.z + 1.0) *\\n      ELEVATION_SCALE * elevationScale;\\n  }\\n\\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\\n  vec3 extrudedPosition = vec3(instancePositions.xy, elevation);\\n  vec2 extrudedPosition64xyLow = instancePositions64xyLow;\\n  vec3 offset = vec3(\\n    (positions.x * coverage + 1.0) / 2.0 * finalCellSize,\\n    (positions.y * coverage - 1.0) / 2.0 * finalCellSize,\\n    1.0);\\n\\n  // extrude positions\\n  vec4 position_worldspace;\\n  gl_Position = project_position_to_clipspace(extrudedPosition, extrudedPosition64xyLow, offset, position_worldspace);\\n\\n  float lightWeight = 1.0;\\n\\n  if (extruded > 0.5) {\\n    lightWeight = lighting_getLightWeight(\\n      position_worldspace.xyz, // the w component is always 1.0\\n      normals\\n    );\\n  }\\n\\n  vec3 lightWeightedColor = lightWeight * instanceColors.rgb;\\n  vec4 color = vec4(lightWeightedColor, instanceColors.a * opacity) / 255.0;\\n  vColor = color;\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"ZOFk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME grid-cell-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n  gl_FragColor = vColor;\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"sdvT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _gridCellLayerVertex = _interopRequireDefault(require(\"./grid-cell-layer-vertex.glsl\"));\n\nvar _gridCellLayerFragment = _interopRequireDefault(require(\"./grid-cell-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar fp64LowPart = _luma.fp64.fp64LowPart;\nvar DEFAULT_COLOR = [255, 0, 255, 255];\nvar defaultProps = {\n  cellSize: {\n    type: 'number',\n    min: 0,\n    max: 1000,\n    value: 1000\n  },\n  coverage: {\n    type: 'number',\n    min: 0,\n    max: 1,\n    value: 1\n  },\n  elevationScale: {\n    type: 'number',\n    min: 0,\n    value: 1\n  },\n  extruded: true,\n  fp64: false,\n  getPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.position;\n    }\n  },\n  getElevation: {\n    type: 'accessor',\n    value: 1000\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  lightSettings: {}\n};\n\nvar GridCellLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(GridCellLayer, _Layer);\n\n  function GridCellLayer() {\n    _classCallCheck(this, GridCellLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(GridCellLayer).apply(this, arguments));\n  }\n\n  _createClass(GridCellLayer, [{\n    key: \"getShaders\",\n\n    /**\n     * A generic GridLayer that takes latitude longitude delta of cells as a uniform\n     * and the min lat lng of cells. grid can be 3d when pass in a height\n     * and set enable3d to true\n     *\n     * @param {array} props.data -\n     * @param {boolean} props.extruded - enable grid elevation\n     * @param {number} props.cellSize - grid cell size in meters\n     * @param {function} props.getPosition - position accessor, returned as [minLng, minLat]\n     * @param {function} props.getElevation - elevation accessor\n     * @param {function} props.getColor - color accessor, returned as [r, g, b, a]\n     */\n    value: function getShaders() {\n      var projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _gridCellLayerVertex.default,\n        fs: _gridCellLayerFragment.default,\n        modules: [projectModule, 'lighting', 'picking']\n      };\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      var attributeManager = this.getAttributeManager();\n      attributeManager.addInstanced({\n        instancePositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getPosition'\n        },\n        instanceElevations: {\n          size: 1,\n          transition: true,\n          accessor: 'getElevation'\n        },\n        instancePositions64xyLow: {\n          size: 2,\n          accessor: 'getPosition',\n          update: this.calculateInstancePositions64xyLow\n        },\n        instanceColors: {\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getColor',\n          defaultValue: DEFAULT_COLOR\n        }\n      });\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var props = _ref.props,\n          oldProps = _ref.oldProps,\n          changeFlags = _ref.changeFlags;\n\n      _get(_getPrototypeOf(GridCellLayer.prototype), \"updateState\", this).call(this, {\n        props: props,\n        oldProps: oldProps,\n        changeFlags: changeFlags\n      }); // Re-generate model if geometry changed\n\n\n      if (props.fp64 !== oldProps.fp64) {\n        var gl = this.context.gl;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      return new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _luma.CubeGeometry(),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref2) {\n      var uniforms = _ref2.uniforms;\n      var _this$props = this.props,\n          cellSize = _this$props.cellSize,\n          extruded = _this$props.extruded,\n          elevationScale = _this$props.elevationScale,\n          coverage = _this$props.coverage;\n      this.state.model.render(Object.assign({}, uniforms, {\n        cellSize: cellSize,\n        extruded: extruded,\n        elevationScale: elevationScale,\n        coverage: coverage\n      }));\n    }\n  }, {\n    key: \"calculateInstancePositions64xyLow\",\n    value: function calculateInstancePositions64xyLow(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      var _this$props2 = this.props,\n          data = _this$props2.data,\n          getPosition = _this$props2.getPosition;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var point = _step.value;\n          var position = getPosition(point);\n          value[i++] = fp64LowPart(position[0]);\n          value[i++] = fp64LowPart(position[1]);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }]);\n\n  return GridCellLayer;\n}(_core.Layer);\n\nexports.default = GridCellLayer;\nGridCellLayer.layerName = 'GridCellLayer';\nGridCellLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./grid-cell-layer-vertex.glsl\":\"k0Cw\",\"./grid-cell-layer-fragment.glsl\":\"ZOFk\"}],\"dkVN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.pointToDensityGridData = pointToDensityGridData;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar R_EARTH = 6378000;\n/**\n * Calculate density grid from an array of points\n * @param {Iterable} points\n * @param {number} cellSize - cell size in meters\n * @param {function} getPosition - position accessor\n * @returns {object} - grid data, cell dimension\n */\n\nfunction pointToDensityGridData(points, cellSize, getPosition) {\n  var _pointsToGridHashing2 = _pointsToGridHashing(points, cellSize, getPosition),\n      gridHash = _pointsToGridHashing2.gridHash,\n      gridOffset = _pointsToGridHashing2.gridOffset;\n\n  var layerData = _getGridLayerDataFromGridHash(gridHash, gridOffset);\n\n  return {\n    gridOffset: gridOffset,\n    layerData: layerData\n  };\n}\n/**\n * Project points into each cell, return a hash table of cells\n * @param {Iterable} points\n * @param {number} cellSize - unit size in meters\n * @param {function} getPosition - position accessor\n * @returns {object} - grid hash and cell dimension\n */\n\n\nfunction _pointsToGridHashing() {\n  var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  var cellSize = arguments.length > 1 ? arguments[1] : undefined;\n  var getPosition = arguments.length > 2 ? arguments[2] : undefined; // find the geometric center of sample points\n\n  var latMin = Infinity;\n  var latMax = -Infinity;\n  var pLat;\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = points[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var pt = _step.value;\n      pLat = getPosition(pt)[1];\n\n      if (Number.isFinite(pLat)) {\n        latMin = pLat < latMin ? pLat : latMin;\n        latMax = pLat > latMax ? pLat : latMax;\n      }\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  var centerLat = (latMin + latMax) / 2;\n\n  var gridOffset = _calculateGridLatLonOffset(cellSize, centerLat);\n\n  if (gridOffset.xOffset <= 0 || gridOffset.yOffset <= 0) {\n    return {\n      gridHash: {},\n      gridOffset: gridOffset\n    };\n  } // calculate count per cell\n\n\n  var gridHash = {};\n  var _iteratorNormalCompletion2 = true;\n  var _didIteratorError2 = false;\n  var _iteratorError2 = undefined;\n\n  try {\n    for (var _iterator2 = points[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n      var _pt = _step2.value;\n      var lat = getPosition(_pt)[1];\n      var lng = getPosition(_pt)[0];\n\n      if (Number.isFinite(lat) && Number.isFinite(lng)) {\n        var latIdx = Math.floor((lat + 90) / gridOffset.yOffset);\n        var lonIdx = Math.floor((lng + 180) / gridOffset.xOffset);\n        var key = \"\".concat(latIdx, \"-\").concat(lonIdx);\n        gridHash[key] = gridHash[key] || {\n          count: 0,\n          points: []\n        };\n        gridHash[key].count += 1;\n        gridHash[key].points.push(_pt);\n      }\n    }\n  } catch (err) {\n    _didIteratorError2 = true;\n    _iteratorError2 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n        _iterator2.return();\n      }\n    } finally {\n      if (_didIteratorError2) {\n        throw _iteratorError2;\n      }\n    }\n  }\n\n  return {\n    gridHash: gridHash,\n    gridOffset: gridOffset\n  };\n}\n\nfunction _getGridLayerDataFromGridHash(gridHash, gridOffset) {\n  return Object.keys(gridHash).reduce(function (accu, key, i) {\n    var idxs = key.split('-');\n    var latIdx = parseInt(idxs[0], 10);\n    var lonIdx = parseInt(idxs[1], 10);\n    accu.push(Object.assign({\n      index: i,\n      position: [-180 + gridOffset.xOffset * lonIdx, -90 + gridOffset.yOffset * latIdx]\n    }, gridHash[key]));\n    return accu;\n  }, []);\n}\n/**\n * calculate grid layer cell size in lat lon based on world unit size\n * and current latitude\n * @param {number} cellSize\n * @param {number} latitude\n * @returns {object} - lat delta and lon delta\n */\n\n\nfunction _calculateGridLatLonOffset(cellSize, latitude) {\n  var yOffset = _calculateLatOffset(cellSize);\n\n  var xOffset = _calculateLonOffset(latitude, cellSize);\n\n  return {\n    yOffset: yOffset,\n    xOffset: xOffset\n  };\n}\n/**\n * with a given x-km change, calculate the increment of latitude\n * based on stackoverflow http://stackoverflow.com/questions/7477003\n * @param {number} dy - change in km\n * @return {number} - increment in latitude\n */\n\n\nfunction _calculateLatOffset(dy) {\n  return dy / R_EARTH * (180 / Math.PI);\n}\n/**\n * with a given x-km change, and current latitude\n * calculate the increment of longitude\n * based on stackoverflow http://stackoverflow.com/questions/7477003\n * @param {number} lat - latitude of current location (based on city)\n * @param {number} dx - change in km\n * @return {number} - increment in longitude\n */\n\n\nfunction _calculateLonOffset(lat, dx) {\n  return dx / R_EARTH * (180 / Math.PI) / Math.cos(lat * Math.PI / 180);\n}\n},{}],\"qUvr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _gridCellLayer = _interopRequireDefault(require(\"../grid-cell-layer/grid-cell-layer\"));\n\nvar _gridAggregator = require(\"./grid-aggregator\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar BinSorter = _core.experimental.BinSorter,\n    defaultColorRange = _core.experimental.defaultColorRange,\n    getQuantizeScale = _core.experimental.getQuantizeScale,\n    getLinearScale = _core.experimental.getLinearScale;\n\nfunction nop() {}\n\nvar defaultProps = {\n  // color\n  colorDomain: null,\n  colorRange: defaultColorRange,\n  getColorValue: {\n    type: 'accessor',\n    value: function value(points) {\n      return points.length;\n    }\n  },\n  lowerPercentile: {\n    type: 'number',\n    min: 0,\n    max: 100,\n    value: 0\n  },\n  upperPercentile: {\n    type: 'number',\n    min: 0,\n    max: 100,\n    value: 100\n  },\n  onSetColorDomain: nop,\n  // elevation\n  elevationDomain: null,\n  elevationRange: [0, 1000],\n  getElevationValue: {\n    type: 'accessor',\n    value: function value(points) {\n      return points.length;\n    }\n  },\n  elevationLowerPercentile: {\n    type: 'number',\n    min: 0,\n    max: 100,\n    value: 0\n  },\n  elevationUpperPercentile: {\n    type: 'number',\n    min: 0,\n    max: 100,\n    value: 100\n  },\n  elevationScale: 1,\n  onSetElevationDomain: nop,\n  // grid\n  cellSize: {\n    type: 'number',\n    min: 0,\n    max: 1000,\n    value: 1000\n  },\n  coverage: {\n    type: 'number',\n    min: 0,\n    max: 1,\n    value: 1\n  },\n  getPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.position;\n    }\n  },\n  extruded: false,\n  fp64: false,\n  // Optional settings for 'lighting' shader module\n  lightSettings: {}\n};\n\nvar GridLayer =\n/*#__PURE__*/\nfunction (_CompositeLayer) {\n  _inherits(GridLayer, _CompositeLayer);\n\n  function GridLayer() {\n    _classCallCheck(this, GridLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(GridLayer).apply(this, arguments));\n  }\n\n  _createClass(GridLayer, [{\n    key: \"initializeState\",\n    value: function initializeState() {\n      this.state = {\n        layerData: [],\n        sortedColorBins: null,\n        sortedElevationBins: null,\n        colorValueDomain: null,\n        elevationValueDomain: null,\n        colorScaleFunc: nop,\n        elevationScaleFunc: nop,\n        dimensionUpdaters: this.getDimensionUpdaters()\n      };\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var _this = this;\n\n      var oldProps = _ref.oldProps,\n          props = _ref.props,\n          changeFlags = _ref.changeFlags;\n      var reprojectNeeded = this.needsReProjectPoints(oldProps, props, changeFlags);\n\n      if (changeFlags.dataChanged || reprojectNeeded) {\n        // project data into hexagons, and get sortedBins\n        this.getLayerData();\n      } else {\n        var dimensionChanges = this.getDimensionChanges(oldProps, props) || [];\n        dimensionChanges.forEach(function (f) {\n          return typeof f === 'function' && f.apply(_this);\n        });\n      }\n    }\n  }, {\n    key: \"needsReProjectPoints\",\n    value: function needsReProjectPoints(oldProps, props, changeFlags) {\n      return oldProps.cellSize !== props.cellSize || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPosition);\n    }\n  }, {\n    key: \"getDimensionUpdaters\",\n    value: function getDimensionUpdaters() {\n      // dimension updaters are sequential,\n      // if the first one needs to be called, the 2nd and 3rd one will automatically\n      // be called. e.g. if ColorValue needs to be updated, getColorValueDomain and getColorScale\n      // will automatically be called\n      return {\n        getColor: [{\n          id: 'value',\n          triggers: ['getColorValue'],\n          updater: this.getSortedColorBins\n        }, {\n          id: 'domain',\n          triggers: ['lowerPercentile', 'upperPercentile'],\n          updater: this.getColorValueDomain\n        }, {\n          id: 'scaleFunc',\n          triggers: ['colorDomain', 'colorRange'],\n          updater: this.getColorScale\n        }],\n        getElevation: [{\n          id: 'value',\n          triggers: ['getElevationValue'],\n          updater: this.getSortedElevationBins\n        }, {\n          id: 'domain',\n          triggers: ['elevationLowerPercentile', 'elevationUpperPercentile'],\n          updater: this.getElevationValueDomain\n        }, {\n          id: 'scaleFunc',\n          triggers: ['elevationDomain', 'elevationRange'],\n          updater: this.getElevationScale\n        }]\n      };\n    }\n  }, {\n    key: \"getDimensionChanges\",\n    value: function getDimensionChanges(oldProps, props) {\n      var dimensionUpdaters = this.state.dimensionUpdaters;\n      var updaters = []; // get dimension to be updated\n\n      for (var dimensionKey in dimensionUpdaters) {\n        // return the first triggered updater for each dimension\n        var needUpdate = dimensionUpdaters[dimensionKey].find(function (item) {\n          return item.triggers.some(function (t) {\n            return oldProps[t] !== props[t];\n          });\n        });\n\n        if (needUpdate) {\n          updaters.push(needUpdate.updater);\n        }\n      }\n\n      return updaters.length ? updaters : null;\n    }\n  }, {\n    key: \"getPickingInfo\",\n    value: function getPickingInfo(_ref2) {\n      var info = _ref2.info;\n      var _this$state = this.state,\n          sortedColorBins = _this$state.sortedColorBins,\n          sortedElevationBins = _this$state.sortedElevationBins;\n      var isPicked = info.picked && info.index > -1;\n      var object = null;\n\n      if (isPicked) {\n        var cell = this.state.layerData[info.index];\n        var colorValue = sortedColorBins.binMap[cell.index] && sortedColorBins.binMap[cell.index].value;\n        var elevationValue = sortedElevationBins.binMap[cell.index] && sortedElevationBins.binMap[cell.index].value;\n        object = Object.assign({\n          colorValue: colorValue,\n          elevationValue: elevationValue\n        }, cell);\n      } // add bin colorValue and elevationValue to info\n\n\n      return Object.assign(info, {\n        picked: Boolean(object),\n        // override object with picked cell\n        object: object\n      });\n    }\n  }, {\n    key: \"getUpdateTriggers\",\n    value: function getUpdateTriggers() {\n      var _this2 = this;\n\n      var dimensionUpdaters = this.state.dimensionUpdaters; // merge all dimension triggers\n\n      var updateTriggers = {};\n\n      var _loop = function _loop(dimensionKey) {\n        updateTriggers[dimensionKey] = {};\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n\n        try {\n          for (var _iterator = dimensionUpdaters[dimensionKey][Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n            var step = _step.value;\n            step.triggers.forEach(function (prop) {\n              updateTriggers[dimensionKey][prop] = _this2.props[prop];\n            });\n          }\n        } catch (err) {\n          _didIteratorError = true;\n          _iteratorError = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion && _iterator.return != null) {\n              _iterator.return();\n            }\n          } finally {\n            if (_didIteratorError) {\n              throw _iteratorError;\n            }\n          }\n        }\n      };\n\n      for (var dimensionKey in dimensionUpdaters) {\n        _loop(dimensionKey);\n      }\n\n      return updateTriggers;\n    }\n  }, {\n    key: \"getLayerData\",\n    value: function getLayerData() {\n      var _this$props = this.props,\n          data = _this$props.data,\n          cellSize = _this$props.cellSize,\n          getPosition = _this$props.getPosition;\n\n      var _pointToDensityGridDa = (0, _gridAggregator.pointToDensityGridData)(data, cellSize, getPosition),\n          layerData = _pointToDensityGridDa.layerData;\n\n      this.setState({\n        layerData: layerData\n      });\n      this.getSortedBins();\n    }\n  }, {\n    key: \"getValueDomain\",\n    value: function getValueDomain() {\n      this.getColorValueDomain();\n      this.getElevationValueDomain();\n    }\n  }, {\n    key: \"getSortedBins\",\n    value: function getSortedBins() {\n      this.getSortedColorBins();\n      this.getSortedElevationBins();\n    }\n  }, {\n    key: \"getSortedColorBins\",\n    value: function getSortedColorBins() {\n      var getColorValue = this.props.getColorValue;\n      var sortedColorBins = new BinSorter(this.state.layerData || [], getColorValue);\n      this.setState({\n        sortedColorBins: sortedColorBins\n      });\n      this.getColorValueDomain();\n    }\n  }, {\n    key: \"getSortedElevationBins\",\n    value: function getSortedElevationBins() {\n      var getElevationValue = this.props.getElevationValue;\n      var sortedElevationBins = new BinSorter(this.state.layerData || [], getElevationValue);\n      this.setState({\n        sortedElevationBins: sortedElevationBins\n      });\n      this.getElevationValueDomain();\n    }\n  }, {\n    key: \"getColorValueDomain\",\n    value: function getColorValueDomain() {\n      var _this$props2 = this.props,\n          lowerPercentile = _this$props2.lowerPercentile,\n          upperPercentile = _this$props2.upperPercentile,\n          onSetColorDomain = _this$props2.onSetColorDomain;\n      this.state.colorValueDomain = this.state.sortedColorBins.getValueRange([lowerPercentile, upperPercentile]);\n\n      if (typeof onSetColorDomain === 'function') {\n        onSetColorDomain(this.state.colorValueDomain);\n      }\n\n      this.getColorScale();\n    }\n  }, {\n    key: \"getElevationValueDomain\",\n    value: function getElevationValueDomain() {\n      var _this$props3 = this.props,\n          elevationLowerPercentile = _this$props3.elevationLowerPercentile,\n          elevationUpperPercentile = _this$props3.elevationUpperPercentile,\n          onSetElevationDomain = _this$props3.onSetElevationDomain;\n      this.state.elevationValueDomain = this.state.sortedElevationBins.getValueRange([elevationLowerPercentile, elevationUpperPercentile]);\n\n      if (typeof onSetElevationDomain === 'function') {\n        onSetElevationDomain(this.state.elevationValueDomain);\n      }\n\n      this.getElevationScale();\n    }\n  }, {\n    key: \"getColorScale\",\n    value: function getColorScale() {\n      var colorRange = this.props.colorRange;\n      var colorDomain = this.props.colorDomain || this.state.colorValueDomain;\n      this.state.colorScaleFunc = getQuantizeScale(colorDomain, colorRange);\n    }\n  }, {\n    key: \"getElevationScale\",\n    value: function getElevationScale() {\n      var elevationRange = this.props.elevationRange;\n      var elevationDomain = this.props.elevationDomain || this.state.elevationValueDomain;\n      this.state.elevationScaleFunc = getLinearScale(elevationDomain, elevationRange);\n    }\n  }, {\n    key: \"_onGetSublayerColor\",\n    value: function _onGetSublayerColor(cell) {\n      var _this$state2 = this.state,\n          sortedColorBins = _this$state2.sortedColorBins,\n          colorScaleFunc = _this$state2.colorScaleFunc,\n          colorValueDomain = _this$state2.colorValueDomain;\n      var cv = sortedColorBins.binMap[cell.index] && sortedColorBins.binMap[cell.index].value;\n      var colorDomain = this.props.colorDomain || colorValueDomain;\n      var isColorValueInDomain = cv >= colorDomain[0] && cv <= colorDomain[colorDomain.length - 1]; // if cell value is outside domain, set alpha to 0\n\n      var color = isColorValueInDomain ? colorScaleFunc(cv) : [0, 0, 0, 0]; // add alpha to color if not defined in colorRange\n\n      color[3] = Number.isFinite(color[3]) ? color[3] : 255;\n      return color;\n    }\n  }, {\n    key: \"_onGetSublayerElevation\",\n    value: function _onGetSublayerElevation(cell) {\n      var _this$state3 = this.state,\n          sortedElevationBins = _this$state3.sortedElevationBins,\n          elevationScaleFunc = _this$state3.elevationScaleFunc,\n          elevationValueDomain = _this$state3.elevationValueDomain;\n      var ev = sortedElevationBins.binMap[cell.index] && sortedElevationBins.binMap[cell.index].value;\n      var elevationDomain = this.props.elevationDomain || elevationValueDomain;\n      var isElevationValueInDomain = ev >= elevationDomain[0] && ev <= elevationDomain[elevationDomain.length - 1]; // if cell value is outside domain, set elevation to -1\n\n      return isElevationValueInDomain ? elevationScaleFunc(ev) : -1;\n    }\n  }, {\n    key: \"renderLayers\",\n    value: function renderLayers() {\n      var _this$props4 = this.props,\n          elevationScale = _this$props4.elevationScale,\n          fp64 = _this$props4.fp64,\n          extruded = _this$props4.extruded,\n          cellSize = _this$props4.cellSize,\n          coverage = _this$props4.coverage,\n          lightSettings = _this$props4.lightSettings,\n          transitions = _this$props4.transitions;\n      var SubLayerClass = this.getSubLayerClass('grid-cell', _gridCellLayer.default);\n      return new SubLayerClass({\n        fp64: fp64,\n        cellSize: cellSize,\n        coverage: coverage,\n        lightSettings: lightSettings,\n        elevationScale: elevationScale,\n        extruded: extruded,\n        getColor: this._onGetSublayerColor.bind(this),\n        getElevation: this._onGetSublayerElevation.bind(this),\n        transitions: transitions && {\n          getColor: transitions.getColorValue,\n          getElevation: transitions.getElevationValue\n        }\n      }, this.getSubLayerProps({\n        id: 'grid-cell',\n        updateTriggers: this.getUpdateTriggers()\n      }), {\n        data: this.state.layerData\n      });\n    }\n  }]);\n\n  return GridLayer;\n}(_core.CompositeLayer);\n\nexports.default = GridLayer;\nGridLayer.layerName = 'GridLayer';\nGridLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"../grid-cell-layer/grid-cell-layer\":\"sdvT\",\"./grid-aggregator\":\"dkVN\"}],\"lhEz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"\\n#define SHADER_NAME hexagon-cell-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 normals;\\n\\nattribute vec2 instancePositions;\\nattribute float instanceElevations;\\nattribute vec2 instancePositions64xyLow;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\n\\n// Custom uniforms\\nuniform float opacity;\\nuniform float radius;\\nuniform float angle;\\nuniform float extruded;\\nuniform float coverage;\\nuniform float elevationScale;\\n\\n// Result\\nvarying vec4 vColor;\\n\\n// A magic number to scale elevation so that 1 unit approximate to 1 meter.\\n#define ELEVATION_SCALE 0.8\\n\\nvoid main(void) {\\n\\n  // rotate primitive position and normal\\n  mat2 rotationMatrix = mat2(cos(angle), sin(angle), -sin(angle), cos(angle));\\n\\n  // calculate elevation, if 3d not enabled set to 0\\n  // cylindar gemoetry height are between -0.5 to 0.5, transform it to between 0, 1\\n  float elevation = 0.0;\\n\\n  if (extruded > 0.5) {\\n    elevation = instanceElevations * (positions.z + 0.5) *\\n      ELEVATION_SCALE * elevationScale;\\n  }\\n\\n  // if ahpha == 0.0 or z < 0.0, do not render element\\n  float noRender = float(instanceColors.a == 0.0 || instanceElevations < 0.0);\\n  float dotRadius = project_scale(radius) * mix(coverage, 0.0, noRender);\\n\\n  // project center of hexagon\\n  vec3 centroidPosition = vec3(instancePositions, elevation);\\n  vec2 centroidPosition64xyLow = instancePositions64xyLow;\\n  vec3 offset = vec3(rotationMatrix * positions.xy * dotRadius, 0.);\\n\\n  vec4 position_worldspace;\\n  gl_Position = project_position_to_clipspace(centroidPosition, centroidPosition64xyLow, offset, position_worldspace);\\n\\n  // Light calculations\\n  // Worldspace is the linear space after Mercator projection\\n\\n  vec3 normals_worldspace = vec3(rotationMatrix * normals.xy, normals.z);\\n\\n  float lightWeight = 1.0;\\n\\n  if (extruded > 0.5) {\\n    lightWeight = lighting_getLightWeight(\\n      position_worldspace.xyz, // the w component is always 1.0\\n      normals_worldspace\\n    );\\n  }\\n\\n  vec3 lightWeightedColor = lightWeight * instanceColors.rgb;\\n\\n  // opacity-multiplied instance color\\n  vColor = vec4(lightWeightedColor, opacity * instanceColors.a) / 255.0;\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"A53b\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME hexagon-cell-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n  gl_FragColor = vColor;\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"i560\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _hexagonCellLayerVertex = _interopRequireDefault(require(\"./hexagon-cell-layer-vertex.glsl\"));\n\nvar _hexagonCellLayerFragment = _interopRequireDefault(require(\"./hexagon-cell-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar fp64LowPart = _luma.fp64.fp64LowPart;\nvar DEFAULT_COLOR = [255, 0, 255, 255];\nvar defaultProps = {\n  hexagonVertices: null,\n  radius: {\n    type: 'number',\n    min: 0,\n    value: 1000\n  },\n  angle: {\n    type: 'number',\n    value: 0\n  },\n  coverage: {\n    type: 'number',\n    min: 0,\n    max: 1,\n    value: 1\n  },\n  elevationScale: {\n    type: 'number',\n    min: 0,\n    value: 1\n  },\n  extruded: true,\n  fp64: false,\n  getCentroid: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.centroid;\n    }\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getElevation: {\n    type: 'accessor',\n    value: 1000\n  },\n  lightSettings: {}\n};\n\nvar HexagonCellLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(HexagonCellLayer, _Layer);\n\n  function HexagonCellLayer() {\n    _classCallCheck(this, HexagonCellLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(HexagonCellLayer).apply(this, arguments));\n  }\n\n  _createClass(HexagonCellLayer, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      var projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _hexagonCellLayerVertex.default,\n        fs: _hexagonCellLayerFragment.default,\n        modules: [projectModule, 'lighting', 'picking']\n      };\n    }\n    /**\n     * DeckGL calls initializeState when GL context is available\n     * Essentially a deferred constructor\n     */\n\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      var attributeManager = this.getAttributeManager();\n      /* eslint-disable max-len */\n\n      attributeManager.addInstanced({\n        instancePositions: {\n          size: 2,\n          transition: true,\n          accessor: 'getCentroid'\n        },\n        instanceElevations: {\n          size: 1,\n          transition: true,\n          accessor: 'getElevation'\n        },\n        instancePositions64xyLow: {\n          size: 2,\n          accessor: 'getCentroid',\n          update: this.calculateInstancePositions64xyLow\n        },\n        instanceColors: {\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getColor',\n          defaultValue: DEFAULT_COLOR\n        }\n      });\n      /* eslint-enable max-len */\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var props = _ref.props,\n          oldProps = _ref.oldProps,\n          changeFlags = _ref.changeFlags;\n\n      _get(_getPrototypeOf(HexagonCellLayer.prototype), \"updateState\", this).call(this, {\n        props: props,\n        oldProps: oldProps,\n        changeFlags: changeFlags\n      });\n\n      if (props.fp64 !== oldProps.fp64) {\n        var gl = this.context.gl;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n\n      if (props.hexagonVertices !== oldProps.hexagonVertices || props.radius !== oldProps.radius || props.angle !== oldProps.angle) {\n        this.updateRadiusAngle();\n      }\n    }\n  }, {\n    key: \"updateRadiusAngle\",\n    value: function updateRadiusAngle() {\n      var _this$props = this.props,\n          angle = _this$props.angle,\n          radius = _this$props.radius;\n      var hexagonVertices = this.props.hexagonVertices;\n\n      if (Array.isArray(hexagonVertices)) {\n        if (hexagonVertices.length < 6) {\n          _core.log.error('HexagonCellLayer: hexagonVertices needs to be an array of 6 points')();\n        } // calculate angle and vertices from hexagonVertices if provided\n\n\n        var vertices = this.props.hexagonVertices;\n        var vertex0 = vertices[0];\n        var vertex3 = vertices[3]; // transform to space coordinates\n\n        var viewport = this.context.viewport;\n\n        var _viewport$getDistance = viewport.getDistanceScales(),\n            pixelsPerMeter = _viewport$getDistance.pixelsPerMeter;\n\n        var spaceCoord0 = this.projectFlat(vertex0);\n        var spaceCoord3 = this.projectFlat(vertex3); // distance between two close centroids\n\n        var dx = spaceCoord0[0] - spaceCoord3[0];\n        var dy = spaceCoord0[1] - spaceCoord3[1];\n        var dxy = Math.sqrt(dx * dx + dy * dy); // Calculate angle that the perpendicular hexagon vertex axis is tilted\n\n        angle = Math.acos(dx / dxy) * -Math.sign(dy) + Math.PI / 2;\n        radius = dxy / 2 / pixelsPerMeter[0];\n      }\n\n      this.setState({\n        angle: angle,\n        radius: radius\n      });\n    }\n  }, {\n    key: \"getCylinderGeometry\",\n    value: function getCylinderGeometry(radius) {\n      return new _luma.CylinderGeometry({\n        radius: radius,\n        topRadius: radius,\n        bottomRadius: radius,\n        topCap: true,\n        bottomCap: true,\n        height: 1,\n        verticalAxis: 'z',\n        nradial: 6,\n        nvertical: 1\n      });\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      return new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: this.getCylinderGeometry(1),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref2) {\n      var uniforms = _ref2.uniforms;\n      var _this$props2 = this.props,\n          elevationScale = _this$props2.elevationScale,\n          extruded = _this$props2.extruded,\n          coverage = _this$props2.coverage;\n      var _this$state = this.state,\n          radius = _this$state.radius,\n          angle = _this$state.angle;\n      this.state.model.render(Object.assign({}, uniforms, {\n        radius: radius,\n        angle: angle,\n        extruded: extruded,\n        coverage: coverage,\n        elevationScale: elevationScale\n      }));\n    }\n  }, {\n    key: \"calculateInstancePositions64xyLow\",\n    value: function calculateInstancePositions64xyLow(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      var _this$props3 = this.props,\n          data = _this$props3.data,\n          getCentroid = _this$props3.getCentroid;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n          var position = getCentroid(object);\n          value[i++] = fp64LowPart(position[0]);\n          value[i++] = fp64LowPart(position[1]);\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }]);\n\n  return HexagonCellLayer;\n}(_core.Layer);\n\nexports.default = HexagonCellLayer;\nHexagonCellLayer.layerName = 'HexagonCellLayer';\nHexagonCellLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./hexagon-cell-layer-vertex.glsl\":\"lhEz\",\"./hexagon-cell-layer-fragment.glsl\":\"A53b\"}],\"x161\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nvar thirdPi = Math.PI / 3,\n    angles = [0, thirdPi, 2 * thirdPi, 3 * thirdPi, 4 * thirdPi, 5 * thirdPi];\n\nfunction pointX(d) {\n  return d[0];\n}\n\nfunction pointY(d) {\n  return d[1];\n}\n\nfunction _default() {\n  var x0 = 0,\n      y0 = 0,\n      x1 = 1,\n      y1 = 1,\n      x = pointX,\n      y = pointY,\n      r,\n      dx,\n      dy;\n\n  function hexbin(points) {\n    var binsById = {},\n        bins = [],\n        i,\n        n = points.length;\n\n    for (i = 0; i < n; ++i) {\n      if (isNaN(px = +x.call(null, point = points[i], i, points)) || isNaN(py = +y.call(null, point, i, points))) continue;\n      var point,\n          px,\n          py,\n          pj = Math.round(py = py / dy),\n          pi = Math.round(px = px / dx - (pj & 1) / 2),\n          py1 = py - pj;\n\n      if (Math.abs(py1) * 3 > 1) {\n        var px1 = px - pi,\n            pi2 = pi + (px < pi ? -1 : 1) / 2,\n            pj2 = pj + (py < pj ? -1 : 1),\n            px2 = px - pi2,\n            py2 = py - pj2;\n        if (px1 * px1 + py1 * py1 > px2 * px2 + py2 * py2) pi = pi2 + (pj & 1 ? 1 : -1) / 2, pj = pj2;\n      }\n\n      var id = pi + \"-\" + pj,\n          bin = binsById[id];\n      if (bin) bin.push(point);else {\n        bins.push(bin = binsById[id] = [point]);\n        bin.x = (pi + (pj & 1) / 2) * dx;\n        bin.y = pj * dy;\n      }\n    }\n\n    return bins;\n  }\n\n  function hexagon(radius) {\n    var x0 = 0,\n        y0 = 0;\n    return angles.map(function (angle) {\n      var x1 = Math.sin(angle) * radius,\n          y1 = -Math.cos(angle) * radius,\n          dx = x1 - x0,\n          dy = y1 - y0;\n      x0 = x1, y0 = y1;\n      return [dx, dy];\n    });\n  }\n\n  hexbin.hexagon = function (radius) {\n    return \"m\" + hexagon(radius == null ? r : +radius).join(\"l\") + \"z\";\n  };\n\n  hexbin.centers = function () {\n    var centers = [],\n        j = Math.round(y0 / dy),\n        i = Math.round(x0 / dx);\n\n    for (var y = j * dy; y < y1 + r; y += dy, ++j) {\n      for (var x = i * dx + (j & 1) * dx / 2; x < x1 + dx / 2; x += dx) {\n        centers.push([x, y]);\n      }\n    }\n\n    return centers;\n  };\n\n  hexbin.mesh = function () {\n    var fragment = hexagon(r).slice(0, 4).join(\"l\");\n    return hexbin.centers().map(function (p) {\n      return \"M\" + p + \"m\" + fragment;\n    }).join(\"\");\n  };\n\n  hexbin.x = function (_) {\n    return arguments.length ? (x = _, hexbin) : x;\n  };\n\n  hexbin.y = function (_) {\n    return arguments.length ? (y = _, hexbin) : y;\n  };\n\n  hexbin.radius = function (_) {\n    return arguments.length ? (r = +_, dx = r * 2 * Math.sin(thirdPi), dy = r * 1.5, hexbin) : r;\n  };\n\n  hexbin.size = function (_) {\n    return arguments.length ? (x0 = y0 = 0, x1 = +_[0], y1 = +_[1], hexbin) : [x1 - x0, y1 - y0];\n  };\n\n  hexbin.extent = function (_) {\n    return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], hexbin) : [[x0, y0], [x1, y1]];\n  };\n\n  return hexbin.radius(1);\n}\n},{}],\"fkf2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"hexbin\", {\n  enumerable: true,\n  get: function () {\n    return _hexbin.default;\n  }\n});\n\nvar _hexbin = _interopRequireDefault(require(\"./src/hexbin\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/hexbin\":\"x161\"}],\"jNnM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.pointToHexbin = pointToHexbin;\nexports.getRadiusInPixel = getRadiusInPixel;\n\nvar _d3Hexbin = require(\"d3-hexbin\");\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/**\n * Use d3-hexbin to performs hexagonal binning from geo points to hexagons\n * @param {Iterable} data - array of points\n * @param {Number} radius - hexagon radius in meter\n * @param {function} getPosition - get points lon lat\n * @param {Object} viewport - current viewport object\n\n * @return {Object} - hexagons and countRange\n */\nfunction pointToHexbin(_ref, viewport) {\n  var data = _ref.data,\n      radius = _ref.radius,\n      getPosition = _ref.getPosition; // get hexagon radius in mercator world unit\n\n  var radiusInPixel = getRadiusInPixel(radius, viewport); // add world space coordinates to points\n\n  var screenPoints = [];\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var pt = _step.value;\n      screenPoints.push(Object.assign({\n        screenCoord: viewport.projectFlat(getPosition(pt))\n      }, pt));\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return != null) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  var newHexbin = (0, _d3Hexbin.hexbin)().radius(radiusInPixel).x(function (d) {\n    return d.screenCoord[0];\n  }).y(function (d) {\n    return d.screenCoord[1];\n  });\n  var hexagonBins = newHexbin(screenPoints);\n  return {\n    hexagons: hexagonBins.map(function (hex, index) {\n      return {\n        centroid: viewport.unprojectFlat([hex.x, hex.y]),\n        points: hex,\n        index: index\n      };\n    })\n  };\n}\n/**\n * Get radius in mercator world space coordinates from meter\n * @param {Number} radius - in meter\n * @param {Object} viewport - current viewport object\n\n * @return {Number} radius in mercator world spcae coordinates\n */\n\n\nfunction getRadiusInPixel(radius, viewport) {\n  var _viewport$getDistance = viewport.getDistanceScales(),\n      pixelsPerMeter = _viewport$getDistance.pixelsPerMeter; // x, y distance should be the same\n\n\n  return radius * pixelsPerMeter[0];\n}\n},{\"d3-hexbin\":\"fkf2\"}],\"OBJs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _hexagonCellLayer = _interopRequireDefault(require(\"../hexagon-cell-layer/hexagon-cell-layer\"));\n\nvar _hexagonAggregator2 = require(\"./hexagon-aggregator\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar BinSorter = _core.experimental.BinSorter,\n    getQuantizeScale = _core.experimental.getQuantizeScale,\n    getLinearScale = _core.experimental.getLinearScale,\n    defaultColorRange = _core.experimental.defaultColorRange;\n\nfunction nop() {}\n\nvar defaultProps = {\n  // color\n  colorDomain: null,\n  colorRange: defaultColorRange,\n  getColorValue: {\n    type: 'accessor',\n    value: function value(points) {\n      return points.length;\n    }\n  },\n  lowerPercentile: {\n    type: 'number',\n    value: 0,\n    min: 0,\n    max: 100\n  },\n  upperPercentile: {\n    type: 'number',\n    value: 100,\n    min: 0,\n    max: 100\n  },\n  onSetColorDomain: nop,\n  // elevation\n  elevationDomain: null,\n  elevationRange: [0, 1000],\n  getElevationValue: {\n    type: 'accessor',\n    value: function value(points) {\n      return points.length;\n    }\n  },\n  elevationLowerPercentile: {\n    type: 'number',\n    value: 0,\n    min: 0,\n    max: 100\n  },\n  elevationUpperPercentile: {\n    type: 'number',\n    value: 100,\n    min: 0,\n    max: 100\n  },\n  elevationScale: {\n    type: 'number',\n    min: 0,\n    value: 1\n  },\n  onSetElevationDomain: nop,\n  radius: {\n    type: 'number',\n    value: 1000,\n    min: 1\n  },\n  coverage: {\n    type: 'number',\n    min: 0,\n    max: 1,\n    value: 1\n  },\n  extruded: false,\n  hexagonAggregator: _hexagonAggregator2.pointToHexbin,\n  getPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.position;\n    }\n  },\n  fp64: false,\n  // Optional settings for 'lighting' shader module\n  lightSettings: {}\n};\n\nvar HexagonLayer =\n/*#__PURE__*/\nfunction (_CompositeLayer) {\n  _inherits(HexagonLayer, _CompositeLayer);\n\n  function HexagonLayer() {\n    _classCallCheck(this, HexagonLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(HexagonLayer).apply(this, arguments));\n  }\n\n  _createClass(HexagonLayer, [{\n    key: \"initializeState\",\n    value: function initializeState() {\n      this.state = {\n        hexagons: [],\n        hexagonVertices: null,\n        sortedColorBins: null,\n        sortedElevationBins: null,\n        colorValueDomain: null,\n        elevationValueDomain: null,\n        colorScaleFunc: nop,\n        elevationScaleFunc: nop,\n        dimensionUpdaters: this.getDimensionUpdaters()\n      };\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var _this = this;\n\n      var oldProps = _ref.oldProps,\n          props = _ref.props,\n          changeFlags = _ref.changeFlags;\n      var dimensionChanges = this.getDimensionChanges(oldProps, props);\n\n      if (changeFlags.dataChanged || this.needsReProjectPoints(oldProps, props)) {\n        // project data into hexagons, and get sortedColorBins\n        this.getHexagons();\n      } else if (dimensionChanges) {\n        dimensionChanges.forEach(function (f) {\n          return typeof f === 'function' && f.apply(_this);\n        });\n      }\n    }\n  }, {\n    key: \"needsReProjectPoints\",\n    value: function needsReProjectPoints(oldProps, props) {\n      return oldProps.radius !== props.radius || oldProps.hexagonAggregator !== props.hexagonAggregator;\n    }\n  }, {\n    key: \"getDimensionUpdaters\",\n    value: function getDimensionUpdaters() {\n      // dimension updaters are sequential,\n      // if the first one needs to be called, the 2nd and 3rd one will automatically\n      // be called. e.g. if ColorValue needs to be updated, getColorValueDomain and getColorScale\n      // will automatically be called\n      return {\n        getColor: [{\n          id: 'value',\n          triggers: ['getColorValue'],\n          updater: this.getSortedColorBins\n        }, {\n          id: 'domain',\n          triggers: ['lowerPercentile', 'upperPercentile'],\n          updater: this.getColorValueDomain\n        }, {\n          id: 'scaleFunc',\n          triggers: ['colorDomain', 'colorRange'],\n          updater: this.getColorScale\n        }],\n        getElevation: [{\n          id: 'value',\n          triggers: ['getElevationValue'],\n          updater: this.getSortedElevationBins\n        }, {\n          id: 'domain',\n          triggers: ['elevationLowerPercentile', 'elevationUpperPercentile'],\n          updater: this.getElevationValueDomain\n        }, {\n          id: 'scaleFunc',\n          triggers: ['elevationDomain', 'elevationRange'],\n          updater: this.getElevationScale\n        }]\n      };\n    }\n  }, {\n    key: \"getDimensionChanges\",\n    value: function getDimensionChanges(oldProps, props) {\n      var dimensionUpdaters = this.state.dimensionUpdaters;\n      var updaters = []; // get dimension to be updated\n\n      for (var dimensionKey in dimensionUpdaters) {\n        // return the first triggered updater for each dimension\n        var needUpdate = dimensionUpdaters[dimensionKey].find(function (item) {\n          return item.triggers.some(function (t) {\n            return oldProps[t] !== props[t];\n          });\n        });\n\n        if (needUpdate) {\n          updaters.push(needUpdate.updater);\n        }\n      }\n\n      return updaters.length ? updaters : null;\n    }\n  }, {\n    key: \"getHexagons\",\n    value: function getHexagons() {\n      var hexagonAggregator = this.props.hexagonAggregator;\n      var viewport = this.context.viewport;\n\n      var _hexagonAggregator = hexagonAggregator(this.props, viewport),\n          hexagons = _hexagonAggregator.hexagons,\n          hexagonVertices = _hexagonAggregator.hexagonVertices;\n\n      this.setState({\n        hexagons: hexagons,\n        hexagonVertices: hexagonVertices\n      });\n      this.getSortedBins();\n    }\n  }, {\n    key: \"getPickingInfo\",\n    value: function getPickingInfo(_ref2) {\n      var info = _ref2.info;\n      var _this$state = this.state,\n          sortedColorBins = _this$state.sortedColorBins,\n          sortedElevationBins = _this$state.sortedElevationBins;\n      var isPicked = info.picked && info.index > -1;\n      var object = null;\n\n      if (isPicked) {\n        var cell = this.state.hexagons[info.index];\n        var colorValue = sortedColorBins.binMap[cell.index] && sortedColorBins.binMap[cell.index].value;\n        var elevationValue = sortedElevationBins.binMap[cell.index] && sortedElevationBins.binMap[cell.index].value;\n        object = Object.assign({\n          colorValue: colorValue,\n          elevationValue: elevationValue\n        }, cell);\n      } // add bin colorValue and elevationValue to info\n\n\n      return Object.assign(info, {\n        picked: Boolean(object),\n        // override object with picked cell\n        object: object\n      });\n    }\n  }, {\n    key: \"getUpdateTriggers\",\n    value: function getUpdateTriggers() {\n      var _this2 = this;\n\n      var dimensionUpdaters = this.state.dimensionUpdaters; // merge all dimension triggers\n\n      var updateTriggers = {};\n\n      var _loop = function _loop(dimensionKey) {\n        updateTriggers[dimensionKey] = {};\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n\n        try {\n          for (var _iterator = dimensionUpdaters[dimensionKey][Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n            var step = _step.value;\n            step.triggers.forEach(function (prop) {\n              updateTriggers[dimensionKey][prop] = _this2.props[prop];\n            });\n          }\n        } catch (err) {\n          _didIteratorError = true;\n          _iteratorError = err;\n        } finally {\n          try {\n            if (!_iteratorNormalCompletion && _iterator.return != null) {\n              _iterator.return();\n            }\n          } finally {\n            if (_didIteratorError) {\n              throw _iteratorError;\n            }\n          }\n        }\n      };\n\n      for (var dimensionKey in dimensionUpdaters) {\n        _loop(dimensionKey);\n      }\n\n      return updateTriggers;\n    }\n  }, {\n    key: \"getValueDomain\",\n    value: function getValueDomain() {\n      this.getColorValueDomain();\n      this.getElevationValueDomain();\n    }\n  }, {\n    key: \"getSortedBins\",\n    value: function getSortedBins() {\n      this.getSortedColorBins();\n      this.getSortedElevationBins();\n    }\n  }, {\n    key: \"getSortedColorBins\",\n    value: function getSortedColorBins() {\n      var getColorValue = this.props.getColorValue;\n      var sortedColorBins = new BinSorter(this.state.hexagons || [], getColorValue);\n      this.setState({\n        sortedColorBins: sortedColorBins\n      });\n      this.getColorValueDomain();\n    }\n  }, {\n    key: \"getSortedElevationBins\",\n    value: function getSortedElevationBins() {\n      var getElevationValue = this.props.getElevationValue;\n      var sortedElevationBins = new BinSorter(this.state.hexagons || [], getElevationValue);\n      this.setState({\n        sortedElevationBins: sortedElevationBins\n      });\n      this.getElevationValueDomain();\n    }\n  }, {\n    key: \"getColorValueDomain\",\n    value: function getColorValueDomain() {\n      var _this$props = this.props,\n          lowerPercentile = _this$props.lowerPercentile,\n          upperPercentile = _this$props.upperPercentile,\n          onSetColorDomain = _this$props.onSetColorDomain;\n\n      if (lowerPercentile > upperPercentile) {\n        _core.log.warn('HexagonLayer: lowerPercentile is bigger than upperPercentile')();\n      }\n\n      this.state.colorValueDomain = this.state.sortedColorBins.getValueRange([lowerPercentile, upperPercentile]);\n\n      if (typeof onSetColorDomain === 'function') {\n        onSetColorDomain(this.state.colorValueDomain);\n      }\n\n      this.getColorScale();\n    }\n  }, {\n    key: \"getElevationValueDomain\",\n    value: function getElevationValueDomain() {\n      var _this$props2 = this.props,\n          elevationLowerPercentile = _this$props2.elevationLowerPercentile,\n          elevationUpperPercentile = _this$props2.elevationUpperPercentile,\n          onSetElevationDomain = _this$props2.onSetElevationDomain;\n      this.state.elevationValueDomain = this.state.sortedElevationBins.getValueRange([elevationLowerPercentile, elevationUpperPercentile]);\n\n      if (typeof onSetElevationDomain === 'function') {\n        onSetElevationDomain(this.state.elevationValueDomain);\n      }\n\n      this.getElevationScale();\n    }\n  }, {\n    key: \"getColorScale\",\n    value: function getColorScale() {\n      var colorRange = this.props.colorRange;\n      var colorDomain = this.props.colorDomain || this.state.colorValueDomain;\n      this.state.colorScaleFunc = getQuantizeScale(colorDomain, colorRange);\n    }\n  }, {\n    key: \"getElevationScale\",\n    value: function getElevationScale() {\n      var elevationRange = this.props.elevationRange;\n      var elevationDomain = this.props.elevationDomain || this.state.elevationValueDomain;\n      this.state.elevationScaleFunc = getLinearScale(elevationDomain, elevationRange);\n    }\n  }, {\n    key: \"_onGetSublayerColor\",\n    value: function _onGetSublayerColor(cell) {\n      var _this$state2 = this.state,\n          sortedColorBins = _this$state2.sortedColorBins,\n          colorScaleFunc = _this$state2.colorScaleFunc,\n          colorValueDomain = _this$state2.colorValueDomain;\n      var cv = sortedColorBins.binMap[cell.index] && sortedColorBins.binMap[cell.index].value;\n      var colorDomain = this.props.colorDomain || colorValueDomain;\n      var isColorValueInDomain = cv >= colorDomain[0] && cv <= colorDomain[colorDomain.length - 1]; // if cell value is outside domain, set alpha to 0\n\n      var color = isColorValueInDomain ? colorScaleFunc(cv) : [0, 0, 0, 0]; // add alpha to color if not defined in colorRange\n\n      color[3] = Number.isFinite(color[3]) ? color[3] : 255;\n      return color;\n    }\n  }, {\n    key: \"_onGetSublayerElevation\",\n    value: function _onGetSublayerElevation(cell) {\n      var _this$state3 = this.state,\n          sortedElevationBins = _this$state3.sortedElevationBins,\n          elevationScaleFunc = _this$state3.elevationScaleFunc,\n          elevationValueDomain = _this$state3.elevationValueDomain;\n      var ev = sortedElevationBins.binMap[cell.index] && sortedElevationBins.binMap[cell.index].value;\n      var elevationDomain = this.props.elevationDomain || elevationValueDomain;\n      var isElevationValueInDomain = ev >= elevationDomain[0] && ev <= elevationDomain[elevationDomain.length - 1]; // if cell value is outside domain, set elevation to -1\n\n      return isElevationValueInDomain ? elevationScaleFunc(ev) : -1;\n    }\n  }, {\n    key: \"renderLayers\",\n    value: function renderLayers() {\n      var _this$props3 = this.props,\n          radius = _this$props3.radius,\n          elevationScale = _this$props3.elevationScale,\n          extruded = _this$props3.extruded,\n          coverage = _this$props3.coverage,\n          lightSettings = _this$props3.lightSettings,\n          fp64 = _this$props3.fp64,\n          transitions = _this$props3.transitions;\n      var SubLayerClass = this.getSubLayerClass('hexagon-cell', _hexagonCellLayer.default);\n      return new SubLayerClass({\n        fp64: fp64,\n        radius: radius,\n        elevationScale: elevationScale,\n        angle: Math.PI / 2,\n        extruded: extruded,\n        coverage: coverage,\n        lightSettings: lightSettings,\n        getColor: this._onGetSublayerColor.bind(this),\n        getElevation: this._onGetSublayerElevation.bind(this),\n        transitions: transitions && {\n          getColor: transitions.getColorValue,\n          getElevation: transitions.getElevationValue\n        }\n      }, this.getSubLayerProps({\n        id: 'hexagon-cell',\n        updateTriggers: this.getUpdateTriggers()\n      }), {\n        data: this.state.hexagons,\n        hexagonVertices: this.state.hexagonVertices\n      });\n    }\n  }]);\n\n  return HexagonLayer;\n}(_core.CompositeLayer);\n\nexports.default = HexagonLayer;\nHexagonLayer.layerName = 'HexagonLayer';\nHexagonLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"../hexagon-cell-layer/hexagon-cell-layer\":\"i560\",\"./hexagon-aggregator\":\"jNnM\"}],\"fnsa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _luma = require(\"luma.gl\");\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar Tesselator = _core.experimental.Tesselator;\nvar fp64LowPart = _luma.fp64.fp64LowPart; // colorArray is used to copy over color values if the passed color is an RGB\n// array instead of RGBA\n\nvar colorArray = [0, 0, 0, 255]; // This class is set up to allow querying one attribute at a time\n// the way the AttributeManager expects it\n\nvar PathTesselator =\n/*#__PURE__*/\nfunction (_Tesselator) {\n  _inherits(PathTesselator, _Tesselator);\n\n  function PathTesselator(_ref) {\n    var data = _ref.data,\n        getGeometry = _ref.getGeometry,\n        positionFormat = _ref.positionFormat,\n        fp64 = _ref.fp64;\n\n    _classCallCheck(this, PathTesselator);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(PathTesselator).call(this, {\n      data: data,\n      getGeometry: getGeometry,\n      fp64: fp64,\n      positionFormat: positionFormat,\n      attributes: {\n        startPositions: {\n          size: 3\n        },\n        endPositions: {\n          size: 3\n        },\n        leftDeltas: {\n          size: 3\n        },\n        rightDeltas: {\n          size: 3\n        },\n        startEndPositions64XyLow: {\n          size: 4,\n          fp64Only: true\n        }\n      }\n    }));\n  }\n  /* Getters */\n\n\n  _createClass(PathTesselator, [{\n    key: \"get\",\n    value: function get(attributeName, target, accessor) {\n      if (this.attributes[attributeName]) {\n        return this.attributes[attributeName];\n      }\n\n      switch (attributeName) {\n        case 'strokeWidths':\n          return this._updateAttribute({\n            target: target,\n            size: 1,\n            getValue: function getValue(object) {\n              return [accessor(object)];\n            }\n          });\n\n        case 'dashArrays':\n          return this._updateAttribute({\n            target: target,\n            size: 2,\n            getValue: accessor\n          });\n\n        case 'colors':\n          return this._updateAttribute({\n            target: target,\n            size: 4,\n            getValue: function getValue(object) {\n              var color = accessor(object);\n\n              if (color.length === 4) {\n                return color;\n              }\n\n              colorArray[0] = color[0];\n              colorArray[1] = color[1];\n              colorArray[2] = color[2];\n              return colorArray;\n            }\n          });\n\n        case 'pickingColors':\n          return this._updateAttribute({\n            target: target,\n            size: 3,\n            getValue: function getValue(object, index) {\n              return accessor(index);\n            }\n          });\n\n        default:\n          return null;\n      }\n    }\n    /* Implement base Tesselator interface */\n\n  }, {\n    key: \"getGeometrySize\",\n    value: function getGeometrySize(path) {\n      return Math.max(0, this.getPathLength(path) - 1);\n    }\n    /* eslint-disable max-statements, complexity */\n\n  }, {\n    key: \"updateGeometryAttributes\",\n    value: function updateGeometryAttributes(path, context) {\n      var _this$attributes = this.attributes,\n          startPositions = _this$attributes.startPositions,\n          endPositions = _this$attributes.endPositions,\n          leftDeltas = _this$attributes.leftDeltas,\n          rightDeltas = _this$attributes.rightDeltas,\n          startEndPositions64XyLow = _this$attributes.startEndPositions64XyLow,\n          fp64 = this.fp64;\n      var numPoints = context.geometrySize + 1;\n\n      if (numPoints < 2) {\n        // ignore invalid path\n        return;\n      }\n\n      var isPathClosed = this.isClosed(path);\n      var startPoint = this.getPointOnPath(path, 0);\n      var endPoint = this.getPointOnPath(path, 1);\n      var prevPoint = isPathClosed ? this.getPointOnPath(path, numPoints - 2) : startPoint;\n      var nextPoint;\n\n      for (var i = context.vertexStart, ptIndex = 1; ptIndex < numPoints; i++, ptIndex++) {\n        if (ptIndex + 1 < numPoints) {\n          nextPoint = this.getPointOnPath(path, ptIndex + 1);\n        } else {\n          nextPoint = isPathClosed ? this.getPointOnPath(path, 1) : endPoint;\n        }\n\n        startPositions[i * 3] = startPoint[0];\n        startPositions[i * 3 + 1] = startPoint[1];\n        startPositions[i * 3 + 2] = startPoint[2] || 0;\n        endPositions[i * 3] = endPoint[0];\n        endPositions[i * 3 + 1] = endPoint[1];\n        endPositions[i * 3 + 2] = endPoint[2] || 0;\n        leftDeltas[i * 3] = startPoint[0] - prevPoint[0];\n        leftDeltas[i * 3 + 1] = startPoint[1] - prevPoint[1];\n        leftDeltas[i * 3 + 2] = startPoint[2] - prevPoint[2] || 0;\n        rightDeltas[i * 3] = nextPoint[0] - endPoint[0];\n        rightDeltas[i * 3 + 1] = nextPoint[1] - endPoint[1];\n        rightDeltas[i * 3 + 2] = nextPoint[2] - endPoint[2] || 0;\n\n        if (fp64) {\n          startEndPositions64XyLow[i * 4] = fp64LowPart(startPoint[0]);\n          startEndPositions64XyLow[i * 4 + 1] = fp64LowPart(startPoint[1]);\n          startEndPositions64XyLow[i * 4 + 2] = fp64LowPart(endPoint[0]);\n          startEndPositions64XyLow[i * 4 + 3] = fp64LowPart(endPoint[1]);\n        }\n\n        prevPoint = startPoint;\n        startPoint = endPoint;\n        endPoint = nextPoint;\n      }\n    }\n    /* eslint-enable max-statements, complexity */\n\n    /* Utilities */\n\n  }, {\n    key: \"getPathLength\",\n    value: function getPathLength(path) {\n      if (Number.isFinite(path[0])) {\n        // flat format\n        return path.length / this.positionSize;\n      }\n\n      return path.length;\n    }\n  }, {\n    key: \"getPointOnPath\",\n    value: function getPointOnPath(path, index) {\n      if (Number.isFinite(path[0])) {\n        // flat format\n        var positionSize = this.positionSize; // TODO - avoid creating new arrays when using binary\n\n        return [path[index * positionSize], path[index * positionSize + 1], positionSize === 3 ? path[index * positionSize + 2] : 0];\n      }\n\n      return path[index];\n    }\n  }, {\n    key: \"isClosed\",\n    value: function isClosed(path) {\n      var numPoints = this.getPathLength(path);\n      var firstPoint = this.getPointOnPath(path, 0);\n      var lastPoint = this.getPointOnPath(path, numPoints - 1);\n      return firstPoint[0] === lastPoint[0] && firstPoint[1] === lastPoint[1] && firstPoint[2] === lastPoint[2];\n    }\n  }]);\n\n  return PathTesselator;\n}(Tesselator);\n\nexports.default = PathTesselator;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl\":\"iiNl\"}],\"CWgV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME path-layer-vertex-shader-64\\n\\nattribute vec3 positions;\\n\\nattribute vec3 instanceStartPositions;\\nattribute vec3 instanceEndPositions;\\nattribute vec4 instanceStartEndPositions64xyLow;\\nattribute vec3 instanceLeftDeltas;\\nattribute vec3 instanceRightDeltas;\\nattribute float instanceStrokeWidths;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute vec2 instanceDashArrays;\\n\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\nuniform float jointType;\\nuniform float miterLimit;\\n\\nuniform float opacity;\\n\\nvarying vec4 vColor;\\nvarying vec2 vCornerOffset;\\nvarying float vMiterLength;\\nvarying vec2 vDashArray;\\nvarying vec2 vPathPosition;\\nvarying float vPathLength;\\n\\nconst float EPSILON = 0.001;\\n\\nfloat flipIfTrue(bool flag) {\\n  return -(float(flag) * 2. - 1.);\\n}\\n\\n// calculate line join positions\\nvec3 lineJoin(\\n  vec3 prevPoint, vec3 currPoint, vec3 nextPoint,\\n  float relativePosition, bool isEnd, bool isJoint,\\n  float width\\n) {\\n  vec2 deltaA = currPoint.xy - prevPoint.xy;\\n  vec2 deltaB = nextPoint.xy - currPoint.xy;\\n\\n  float lenA = length(deltaA);\\n  float lenB = length(deltaB);\\n\\n  // when two points are closer than PIXEL_EPSILON in pixels,\\n  // assume they are the same point to avoid precision issue\\n  lenA = lenA / width > EPSILON ? lenA : 0.0;\\n  lenB = lenB / width > EPSILON ? lenB : 0.0;\\n\\n  vec2 dirA = lenA > 0. ? normalize(deltaA) : vec2(0.0, 0.0);\\n  vec2 dirB = lenB > 0. ? normalize(deltaB) : vec2(0.0, 0.0);\\n\\n  vec2 perpA = vec2(-dirA.y, dirA.x);\\n  vec2 perpB = vec2(-dirB.y, dirB.x);\\n\\n  // tangent of the corner\\n  vec2 tangent = vec2(dirA + dirB);\\n  tangent = length(tangent) > 0. ? normalize(tangent) : perpA;\\n  // direction of the corner\\n  vec2 miterVec = vec2(-tangent.y, tangent.x);\\n  // width offset from current position\\n  vec2 perp = isEnd ? perpA : perpB;\\n  float L = isEnd ? lenA : lenB;\\n\\n  // cap super sharp angles\\n  float sinHalfA = abs(dot(miterVec, perp));\\n  float cosHalfA = abs(dot(dirA, miterVec));\\n\\n  bool turnsRight = dirA.x * dirB.y > dirA.y * dirB.x;\\n\\n  float offsetScale = 1.0 / max(sinHalfA, EPSILON);\\n\\n  float cornerPosition = isJoint ?\\n    0.0 :\\n    flipIfTrue(turnsRight == (relativePosition > 0.0));\\n\\n  // do not bevel if line segment is too short\\n  cornerPosition *=\\n    float(cornerPosition <= 0.0 || sinHalfA < min(lenA, lenB) / width * cosHalfA);\\n\\n  // trim if inside corner extends further than the line segment\\n  if (cornerPosition < 0.0) {\\n    offsetScale = min(offsetScale, L / width / max(cosHalfA, EPSILON));\\n  }\\n\\n  vMiterLength = cornerPosition >= 0.0 ?\\n    mix(offsetScale, 0.0, cornerPosition) :\\n    offsetScale * cornerPosition;\\n  vMiterLength -= sinHalfA * jointType;\\n\\n  float offsetDirection = mix(\\n    positions.y,\\n    mix(\\n      flipIfTrue(turnsRight),\\n      positions.y * flipIfTrue(turnsRight == (positions.x == 1.)),\\n      cornerPosition\\n    ),\\n    step(0.0, cornerPosition)\\n  );\\n\\n  vec2 offsetVec = mix(miterVec, -tangent, step(0.5, cornerPosition));\\n  offsetScale = mix(offsetScale, 1.0 / max(cosHalfA, 0.001), step(0.5, cornerPosition));\\n\\n  // special treatment for start cap and end cap\\n  // TODO - This has an issue. len is always positive because it is length.\\n  // Step returns zero if -lenA<0, so practically this is a comparison of\\n  // lenA with zero, with lots of problems because of the -lenA. Can we use EPSILON?\\n  bool isStartCap = step(0.0, -lenA) > 0.5;\\n  bool isEndCap = step(0.0, -lenB) > 0.5;\\n  bool isCap = isStartCap || isEndCap;\\n\\n  // 0: center, 1: side\\n  cornerPosition = isCap ? (1.0 - positions.z) : 0.;\\n\\n  // start of path: use next - curr\\n  if (isStartCap) {\\n    offsetVec = mix(dirB, perpB, cornerPosition);\\n  }\\n\\n  // end of path: use curr - prev\\n  if (isEndCap) {\\n    offsetVec = mix(dirA, perpA, cornerPosition);\\n  }\\n\\n  // extend out a triangle to envelope the round cap\\n  if (isCap) {\\n    offsetScale = mix(4.0 * jointType, 1.0, cornerPosition);\\n    vMiterLength = 1.0 - cornerPosition;\\n    offsetDirection = mix(flipIfTrue(isStartCap), positions.y, cornerPosition);\\n  }\\n\\n  vCornerOffset = offsetVec * offsetDirection * offsetScale;\\n\\n  // Generate variables for dash calculation\\n  vDashArray = instanceDashArrays;\\n  vPathLength = L / width;\\n  // vec2 offsetFromStartOfPath = isEnd ? vCornerOffset + deltaA / width : vCornerOffset;\\n  vec2 offsetFromStartOfPath = vCornerOffset;\\n  if (isEnd) {\\n    offsetFromStartOfPath += deltaA / width;\\n  }\\n  vec2 dir = isEnd ? dirA : dirB;\\n  vPathPosition = vec2(\\n    positions.y + positions.z * offsetDirection,\\n    dot(offsetFromStartOfPath, dir)\\n  );\\n\\n  return currPoint + vec3(vCornerOffset * width, 0.0);\\n}\\n\\n// calculate line join positions\\n// extract params from attributes and uniforms\\nvec3 lineJoin(vec3 prevPoint, vec3 currPoint, vec3 nextPoint) {\\n\\n  // relative position to the corner:\\n  // -1: inside (smaller side of the angle)\\n  // 0: center\\n  // 1: outside (bigger side of the angle)\\n\\n  float relativePosition = positions.y;\\n  bool isEnd = positions.x > EPSILON;\\n  bool isJoint = positions.z > EPSILON;\\n\\n  float width = clamp(project_scale(instanceStrokeWidths * widthScale),\\n    widthMinPixels, widthMaxPixels) / 2.0;\\n\\n  return lineJoin(\\n    prevPoint, currPoint, nextPoint,\\n    relativePosition, isEnd, isJoint,\\n    width\\n  );\\n}\\n\\nvoid main() {\\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n\\n  float isEnd = positions.x;\\n\\n  vec3 prevPosition = instanceStartPositions;\\n  vec2 prevPosition64xyLow = instanceStartEndPositions64xyLow.xy;\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_AUTO_OFFSET) {\\n    // In auto offset mode, add delta to low part of the positions for better precision\\n    prevPosition64xyLow += mix(-instanceLeftDeltas, vec3(0.0), isEnd).xy;\\n  } else {\\n    prevPosition += mix(-instanceLeftDeltas, vec3(0.0), isEnd);\\n  }\\n  prevPosition = project_position(prevPosition, prevPosition64xyLow);\\n\\n  vec3 currPosition = mix(instanceStartPositions, instanceEndPositions, isEnd);\\n  vec2 currPosition64xyLow = mix(instanceStartEndPositions64xyLow.xy, instanceStartEndPositions64xyLow.zw, isEnd);\\n  currPosition = project_position(currPosition, currPosition64xyLow);\\n\\n  vec3 nextPosition = instanceEndPositions;\\n  vec2 nextPosition64xyLow = instanceStartEndPositions64xyLow.zw;\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_AUTO_OFFSET) {\\n    // In auto offset mode, add delta to low part of the positions for better precision\\n    nextPosition64xyLow += mix(vec3(0.0), instanceRightDeltas, isEnd).xy;\\n  } else {\\n    nextPosition += mix(vec3(0.0), instanceRightDeltas, isEnd);\\n  }\\n  nextPosition = project_position(nextPosition, nextPosition64xyLow);\\n\\n  vec3 pos = lineJoin(prevPosition, currPosition, nextPosition);\\n\\n  gl_Position = project_to_clipspace(vec4(pos, 1.0));\\n}\\n\";\nexports.default = _default;\n},{}],\"gfil\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"\\n#define SHADER_NAME path-layer-vertex-shader\\n\\nattribute vec3 positions;\\n\\nattribute vec3 instanceStartPositions;\\nattribute vec3 instanceEndPositions;\\nattribute vec4 instanceStartEndPositions64xyLow;\\nattribute vec3 instanceLeftDeltas;\\nattribute vec3 instanceRightDeltas;\\nattribute float instanceStrokeWidths;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute vec2 instanceDashArrays;\\n\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\nuniform float jointType;\\nuniform float miterLimit;\\n\\nuniform float opacity;\\n\\nvarying vec4 vColor;\\nvarying vec2 vCornerOffset;\\nvarying float vMiterLength;\\nvarying vec2 vDashArray;\\nvarying vec2 vPathPosition;\\nvarying float vPathLength;\\n\\nconst float EPSILON = 0.001;\\n\\nfloat flipIfTrue(bool flag) {\\n  return -(float(flag) * 2. - 1.);\\n}\\n\\nvec3 lineJoin(vec2 prevPoint64[2], vec2 currPoint64[2], vec2 nextPoint64[2]) {\\n\\n  float width = clamp(project_scale(instanceStrokeWidths * widthScale),\\n    widthMinPixels, widthMaxPixels) / 2.0;\\n\\n  vec2 deltaA64[2];\\n  vec2 deltaB64[2];\\n\\n  vec2_sub_fp64(currPoint64, prevPoint64, deltaA64);\\n  vec2_sub_fp64(nextPoint64, currPoint64, deltaB64);\\n\\n  vec2 lengthA64 = vec2_length_fp64(deltaA64);\\n  vec2 lengthB64 = vec2_length_fp64(deltaB64);\\n\\n  vec2 deltaA = vec2(deltaA64[0].x, deltaA64[1].x);\\n  vec2 deltaB = vec2(deltaB64[0].x, deltaB64[1].x);\\n\\n  float lenA = lengthA64.x;\\n  float lenB = lengthB64.x;\\n\\n  vec2 offsetVec;\\n  float offsetScale;\\n  float offsetDirection;\\n\\n  // when two points are closer than PIXEL_EPSILON in pixels,\\n  // assume they are the same point to avoid precision issue\\n  lenA = lenA / width > EPSILON ? lenA : 0.0;\\n  lenB = lenB / width > EPSILON ? lenB : 0.0;\\n  vec2 dirA = lenA > 0. ? deltaA / lenA : vec2(0.0, 0.0);\\n  vec2 dirB = lenB > 0. ? deltaB / lenB : vec2(0.0, 0.0);\\n\\n  vec2 perpA = vec2(-dirA.y, dirA.x);\\n  vec2 perpB = vec2(-dirB.y, dirB.x);\\n\\n  // tangent of the corner\\n  vec2 tangent = vec2(dirA + dirB);\\n  tangent = length(tangent) > 0. ? normalize(tangent) : perpA;\\n  // direction of the corner\\n  vec2 miterVec = vec2(-tangent.y, tangent.x);\\n  // width offset from current position\\n  vec2 perp = mix(perpB, perpA, positions.x);\\n  float L = mix(lenB, lenA, positions.x);\\n\\n  // cap super sharp angles\\n  float sinHalfA = abs(dot(miterVec, perp));\\n  float cosHalfA = abs(dot(dirA, miterVec));\\n  bool turnsRight = dirA.x * dirB.y > dirA.y * dirB.x;\\n\\n  // relative position to the corner:\\n  // -1: inside (smaller side of the angle)\\n  // 0: center\\n  // 1: outside (bigger side of the angle)\\n  float cornerPosition = mix(\\n    flipIfTrue(turnsRight == (positions.y > 0.0)),\\n    0.0,\\n    positions.z\\n  );\\n\\n  offsetScale = 1.0 / max(sinHalfA, EPSILON);\\n\\n  // do not bevel if line segment is too short\\n  cornerPosition *= float(cornerPosition <= 0.0 || sinHalfA < min(lenA, lenB) / width * cosHalfA);\\n  // trim if inside corner extends further than the line segment\\n  offsetScale = mix(\\n    offsetScale,\\n    min(offsetScale, L / width / max(cosHalfA, EPSILON)),\\n    float(cornerPosition < 0.0)\\n  );\\n\\n  vMiterLength = mix(\\n    offsetScale * cornerPosition,\\n    mix(offsetScale, 0.0, cornerPosition),\\n    step(0.0, cornerPosition)\\n  ) - sinHalfA * jointType;\\n  offsetDirection = mix(\\n    positions.y,\\n    mix(\\n      flipIfTrue(turnsRight),\\n      positions.y * flipIfTrue(turnsRight == (positions.x == 1.)),\\n      cornerPosition\\n    ),\\n    step(0.0, cornerPosition)\\n  );\\n  offsetVec = mix(miterVec, -tangent, step(0.5, cornerPosition));\\n  offsetScale = mix(offsetScale, 1.0 / max(cosHalfA, 0.001), step(0.5, cornerPosition));\\n\\n  // special treatment for start cap and end cap\\n  // using a small number as the limit for determining if the lenA or lenB is 0\\n  float isStartCap = step(lenA, 1.0e-5);\\n  float isEndCap = step(lenB, 1.0e-5);\\n  float isCap = max(isStartCap, isEndCap);\\n\\n  // 0: center, 1: side\\n  cornerPosition = isCap * (1.0 - positions.z);\\n\\n  // start of path: use next - curr\\n  offsetVec = mix(offsetVec, mix(dirB, perpB, cornerPosition), isStartCap);\\n  // end of path: use curr - prev\\n  offsetVec = mix(offsetVec, mix(dirA, perpA, cornerPosition), isEndCap);\\n\\n  // extend out a triangle to envelope the round cap\\n  offsetScale = mix(\\n    offsetScale,\\n    mix(4.0 * jointType, 1.0, cornerPosition),\\n    isCap\\n  );\\n  vMiterLength = mix(vMiterLength, 1.0 - cornerPosition, isCap);\\n\\n  offsetDirection = mix(\\n    offsetDirection,\\n    mix(flipIfTrue(isStartCap > 0.), positions.y, cornerPosition),\\n    isCap\\n  );\\n\\n  vCornerOffset = offsetVec * offsetDirection * offsetScale;\\n\\n  // Generate variables for dash calculation\\n  vDashArray = instanceDashArrays;\\n  vPathLength = L / width;\\n  float isEnd = positions.x;\\n  vec2 offsetFromStartOfPath = mix(vCornerOffset, vCornerOffset + deltaA / width, isEnd);\\n  vec2 dir = mix(dirB, dirA, isEnd);\\n  vPathPosition = vec2(\\n    positions.y + positions.z * offsetDirection,\\n    dot(offsetFromStartOfPath, dir)\\n  );\\n\\n  return vec3(vCornerOffset * width, 0.0);\\n}\\n\\nvoid main() {\\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(instancePickingColors);\\n\\n  float isEnd = positions.x;\\n\\n  // Calculate current position 64bit\\n\\n  vec3 currPosition = mix(instanceStartPositions, instanceEndPositions, isEnd);\\n  vec2 currPosition64xyLow = mix(instanceStartEndPositions64xyLow.xy, instanceStartEndPositions64xyLow.zw, isEnd);\\n  vec2 projected_curr_position[2];\\n  project_position_fp64(currPosition.xy, currPosition64xyLow, projected_curr_position);\\n  float projected_curr_position_z = project_scale(currPosition.z);\\n\\n  // Calculate previous position\\n\\n  vec3 prevPosition = mix(-instanceLeftDeltas, vec3(0.0), isEnd) + instanceStartPositions;\\n\\n  // Calculate prev position 64bit\\n\\n  vec2 projected_prev_position[2];\\n  project_position_fp64(prevPosition.xy, instanceStartEndPositions64xyLow.xy, projected_prev_position);\\n\\n  // Calculate next positions\\n  vec3 nextPosition = mix(vec3(0.0), instanceRightDeltas, isEnd) + instanceEndPositions;\\n\\n  // Calculate next position 64bit\\n\\n  vec2 projected_next_position[2];\\n  project_position_fp64(nextPosition.xy, instanceStartEndPositions64xyLow.zw, projected_next_position);\\n\\n  vec3 pos = lineJoin(projected_prev_position, projected_curr_position, projected_next_position);\\n  vec2 vertex_pos_modelspace[4];\\n\\n  vertex_pos_modelspace[0] = sum_fp64(vec2(pos.x, 0.0), projected_curr_position[0]);\\n  vertex_pos_modelspace[1] = sum_fp64(vec2(pos.y, 0.0), projected_curr_position[1]);\\n  vertex_pos_modelspace[2] = vec2(pos.z + projected_curr_position_z, 0.0);\\n  vertex_pos_modelspace[3] = vec2(1.0, 0.0);\\n\\n  gl_Position = project_to_clipspace_fp64(vertex_pos_modelspace);\\n}\\n\";\nexports.default = _default;\n},{}],\"uJxq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME path-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform float jointType;\\nuniform float miterLimit;\\nuniform float alignMode;\\n\\nvarying vec4 vColor;\\nvarying vec2 vCornerOffset;\\nvarying float vMiterLength;\\nvarying vec2 vDashArray;\\n/*\\n * vPathPosition represents the relative coordinates of the current fragment on the path segment.\\n * vPathPosition.x - position along the width of the path, between [-1, 1]. 0 is the center line.\\n * vPathPosition.y - position along the length of the path, between [0, L / width].\\n */\\nvarying vec2 vPathPosition;\\nvarying float vPathLength;\\n\\n// mod doesn't work correctly for negative numbers\\nfloat mod2(float a, float b) {\\n  return a - floor(a / b) * b;\\n}\\n\\nfloat round(float x) {\\n  return floor(x + 0.5);\\n}\\n\\n// if given position is in the gap part of the dashed line\\n// dashArray.x: solid stroke length, relative to width\\n// dashArray.y: gap length, relative to width\\n// alignMode:\\n// 0 - no adjustment\\n// o----     ----     ----     ---- o----     -o----     ----     o\\n// 1 - stretch to fit, draw half dash at each end for nicer joints\\n// o--    ----    ----    ----    --o--      --o--     ----     --o\\nbool dash_isFragInGap() {\\n  float solidLength = vDashArray.x;\\n  float gapLength = vDashArray.y;\\n\\n  float unitLength = solidLength + gapLength;\\n\\n  if (unitLength == 0.0) {\\n    return false;\\n  }\\n\\n  unitLength = mix(\\n    unitLength,\\n    vPathLength / round(vPathLength / unitLength),\\n    alignMode\\n  );\\n\\n  float offset = alignMode * solidLength / 2.0;\\n\\n  return gapLength > 0.0 &&\\n    vPathPosition.y >= 0.0 &&\\n    vPathPosition.y <= vPathLength &&\\n    mod2(vPathPosition.y + offset, unitLength) > solidLength;\\n}\\n\\nvoid main(void) {\\n  // if joint is rounded, test distance from the corner\\n  if (jointType > 0.0 && vMiterLength > 0.0 && length(vCornerOffset) > 1.0) {\\n    // Enable to debug joints\\n    // gl_FragColor = vec4(0., 1., 0., 1.);\\n    // return;\\n    discard;\\n  }\\n  if (jointType == 0.0 && vMiterLength > miterLimit) {\\n    // Enable to debug joints\\n    // gl_FragColor = vec4(0., 0., 1., 1.);\\n    // return;\\n    discard;\\n  }\\n  if (vColor.a == 0.0 || dash_isFragInGap()) {\\n    // Enable to debug joints\\n    // gl_FragColor = vec4(0., 1., 1., 1.);\\n    // return;\\n    discard;\\n  }\\n  gl_FragColor = vColor;\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"n0i7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _pathTesselator = _interopRequireDefault(require(\"./path-tesselator\"));\n\nvar _pathLayerVertex = _interopRequireDefault(require(\"./path-layer-vertex.glsl\"));\n\nvar _pathLayerVertex2 = _interopRequireDefault(require(\"./path-layer-vertex-64.glsl\"));\n\nvar _pathLayerFragment = _interopRequireDefault(require(\"./path-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar DEFAULT_COLOR = [0, 0, 0, 255];\nvar defaultProps = {\n  widthScale: {\n    type: 'number',\n    min: 0,\n    value: 1\n  },\n  // stroke width in meters\n  widthMinPixels: {\n    type: 'number',\n    min: 0,\n    value: 0\n  },\n  //  min stroke width in pixels\n  widthMaxPixels: {\n    type: 'number',\n    min: 0,\n    value: Number.MAX_SAFE_INTEGER\n  },\n  // max stroke width in pixels\n  rounded: false,\n  miterLimit: {\n    type: 'number',\n    min: 0,\n    value: 4\n  },\n  fp64: false,\n  dashJustified: false,\n  getPath: {\n    type: 'accessor',\n    value: function value(object) {\n      return object.path;\n    }\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getWidth: {\n    type: 'accessor',\n    value: 1\n  },\n  getDashArray: {\n    type: 'accessor',\n    value: [0, 0]\n  }\n};\nvar ATTRIBUTE_TRANSITION = {\n  enter: function enter(value, chunk) {\n    return chunk.length ? chunk.subarray(chunk.length - value.length) : value;\n  }\n};\n\nvar PathLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(PathLayer, _Layer);\n\n  function PathLayer() {\n    _classCallCheck(this, PathLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(PathLayer).apply(this, arguments));\n  }\n\n  _createClass(PathLayer, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      return this.use64bitProjection() ? {\n        vs: _pathLayerVertex2.default,\n        fs: _pathLayerFragment.default,\n        modules: ['project64', 'picking']\n      } : {\n        vs: _pathLayerVertex.default,\n        fs: _pathLayerFragment.default,\n        modules: ['picking']\n      }; // 'project' module added by default.\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      var noAlloc = true;\n      var attributeManager = this.getAttributeManager();\n      /* eslint-disable max-len */\n\n      attributeManager.addInstanced({\n        instanceStartPositions: {\n          size: 3,\n          transition: ATTRIBUTE_TRANSITION,\n          accessor: 'getPath',\n          update: this.calculateStartPositions,\n          noAlloc: noAlloc\n        },\n        instanceEndPositions: {\n          size: 3,\n          transition: ATTRIBUTE_TRANSITION,\n          accessor: 'getPath',\n          update: this.calculateEndPositions,\n          noAlloc: noAlloc\n        },\n        instanceStartEndPositions64xyLow: {\n          size: 4,\n          update: this.calculateInstanceStartEndPositions64xyLow,\n          noAlloc: noAlloc\n        },\n        instanceLeftDeltas: {\n          size: 3,\n          update: this.calculateLeftDeltas,\n          noAlloc: noAlloc\n        },\n        instanceRightDeltas: {\n          size: 3,\n          update: this.calculateRightDeltas,\n          noAlloc: noAlloc\n        },\n        instanceStrokeWidths: {\n          size: 1,\n          accessor: 'getWidth',\n          transition: ATTRIBUTE_TRANSITION,\n          update: this.calculateStrokeWidths,\n          defaultValue: 1\n        },\n        instanceDashArrays: {\n          size: 2,\n          accessor: 'getDashArray',\n          update: this.calculateDashArrays\n        },\n        instanceColors: {\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          accessor: 'getColor',\n          transition: ATTRIBUTE_TRANSITION,\n          update: this.calculateColors,\n          defaultValue: DEFAULT_COLOR\n        },\n        instancePickingColors: {\n          size: 3,\n          type: _constants.default.UNSIGNED_BYTE,\n          update: this.calculatePickingColors\n        }\n      });\n      /* eslint-enable max-len */\n\n      this.setState({\n        pathTesselator: new _pathTesselator.default({})\n      });\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var oldProps = _ref.oldProps,\n          props = _ref.props,\n          changeFlags = _ref.changeFlags;\n\n      _get(_getPrototypeOf(PathLayer.prototype), \"updateState\", this).call(this, {\n        props: props,\n        oldProps: oldProps,\n        changeFlags: changeFlags\n      });\n\n      var attributeManager = this.getAttributeManager();\n      var geometryChanged = changeFlags.dataChanged || props.fp64 !== oldProps.fp64 || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPath);\n\n      if (geometryChanged) {\n        this.state.pathTesselator.updateGeometry({\n          data: props.data,\n          getGeometry: props.getPath,\n          positionFormat: props.positionFormat,\n          fp64: this.use64bitPositions()\n        });\n        this.setState({\n          numInstances: this.state.pathTesselator.instanceCount\n        });\n        attributeManager.invalidateAll();\n      }\n\n      if (props.fp64 !== oldProps.fp64) {\n        var gl = this.context.gl;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        attributeManager.invalidateAll();\n      }\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref2) {\n      var uniforms = _ref2.uniforms;\n      var _this$props = this.props,\n          rounded = _this$props.rounded,\n          miterLimit = _this$props.miterLimit,\n          widthScale = _this$props.widthScale,\n          widthMinPixels = _this$props.widthMinPixels,\n          widthMaxPixels = _this$props.widthMaxPixels,\n          dashJustified = _this$props.dashJustified;\n      this.state.model.render(Object.assign({}, uniforms, {\n        jointType: Number(rounded),\n        alignMode: Number(dashJustified),\n        widthScale: widthScale,\n        miterLimit: miterLimit,\n        widthMinPixels: widthMinPixels,\n        widthMaxPixels: widthMaxPixels\n      }));\n    }\n  }, {\n    key: \"_getModel\",\n    value: function _getModel(gl) {\n      /*\n       *       _\n       *        \"-_ 1                   3                       5\n       *     _     \"o---------------------o-------------------_-o\n       *       -   / \"\"--..__              '.             _.-' /\n       *   _     \"@- - - - - \"\"--..__- - - - x - - - -_.@'    /\n       *    \"-_  /                   \"\"--..__ '.  _,-` :     /\n       *       \"o----------------------------\"\"-o'    :     /\n       *      0,2                            4 / '.  :     /\n       *                                      /   '.:     /\n       *                                     /     :'.   /\n       *                                    /     :  ', /\n       *                                   /     :     o\n       */\n      var SEGMENT_INDICES = [// start corner\n      0, 2, 1, // body\n      1, 2, 4, 1, 4, 3, // end corner\n      3, 4, 5]; // [0] position on segment - 0: start, 1: end\n      // [1] side of path - -1: left, 0: center, 1: right\n      // [2] role - 0: offset point 1: joint point\n\n      var SEGMENT_POSITIONS = [// bevel start corner\n      0, 0, 1, // start inner corner\n      0, -1, 0, // start outer corner\n      0, 1, 0, // end inner corner\n      1, -1, 0, // end outer corner\n      1, 1, 0, // bevel end corner\n      1, 0, 1];\n      return new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _luma.Geometry({\n          drawMode: _constants.default.TRIANGLES,\n          attributes: {\n            indices: new Uint16Array(SEGMENT_INDICES),\n            positions: new Float32Array(SEGMENT_POSITIONS)\n          }\n        }),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n  }, {\n    key: \"calculateStartPositions\",\n    value: function calculateStartPositions(attribute) {\n      var pathTesselator = this.state.pathTesselator;\n      attribute.bufferLayout = pathTesselator.bufferLayout;\n      attribute.value = pathTesselator.get('startPositions');\n    }\n  }, {\n    key: \"calculateEndPositions\",\n    value: function calculateEndPositions(attribute) {\n      var pathTesselator = this.state.pathTesselator;\n      attribute.bufferLayout = pathTesselator.bufferLayout;\n      attribute.value = pathTesselator.get('endPositions');\n    }\n  }, {\n    key: \"calculateInstanceStartEndPositions64xyLow\",\n    value: function calculateInstanceStartEndPositions64xyLow(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (isFP64) {\n        attribute.value = this.state.pathTesselator.get('startEndPositions64XyLow');\n      } else {\n        attribute.value = new Float32Array(4);\n      }\n    }\n  }, {\n    key: \"calculateLeftDeltas\",\n    value: function calculateLeftDeltas(attribute) {\n      var pathTesselator = this.state.pathTesselator;\n      attribute.value = pathTesselator.get('leftDeltas');\n    }\n  }, {\n    key: \"calculateRightDeltas\",\n    value: function calculateRightDeltas(attribute) {\n      var pathTesselator = this.state.pathTesselator;\n      attribute.value = pathTesselator.get('rightDeltas');\n    }\n  }, {\n    key: \"calculateStrokeWidths\",\n    value: function calculateStrokeWidths(attribute) {\n      var getWidth = this.props.getWidth;\n      var pathTesselator = this.state.pathTesselator;\n      attribute.bufferLayout = pathTesselator.bufferLayout;\n      attribute.value = pathTesselator.get('strokeWidths', attribute.value, getWidth);\n    }\n  }, {\n    key: \"calculateDashArrays\",\n    value: function calculateDashArrays(attribute) {\n      var getDashArray = this.props.getDashArray;\n      var pathTesselator = this.state.pathTesselator;\n      attribute.value = pathTesselator.get('dashArrays', attribute.value, getDashArray);\n    }\n  }, {\n    key: \"calculateColors\",\n    value: function calculateColors(attribute) {\n      var getColor = this.props.getColor;\n      var pathTesselator = this.state.pathTesselator;\n      attribute.bufferLayout = pathTesselator.bufferLayout;\n      attribute.value = pathTesselator.get('colors', attribute.value, getColor);\n    } // Override the default picking colors calculation\n\n  }, {\n    key: \"calculatePickingColors\",\n    value: function calculatePickingColors(attribute) {\n      var _this = this;\n\n      var pathTesselator = this.state.pathTesselator;\n      var pickingColor = [];\n      attribute.value = pathTesselator.get('pickingColors', attribute.value, function (index) {\n        return _this.encodePickingColor(index, pickingColor);\n      });\n    }\n  }, {\n    key: \"clearPickingColor\",\n    value: function clearPickingColor(color) {\n      var pickedPathIndex = this.decodePickingColor(color);\n      var bufferLayout = this.state.pathTesselator.bufferLayout;\n      var numVertices = bufferLayout[pickedPathIndex];\n      var startInstanceIndex = 0;\n\n      for (var pathIndex = 0; pathIndex < pickedPathIndex; pathIndex++) {\n        startInstanceIndex += bufferLayout[pathIndex];\n      }\n\n      var instancePickingColors = this.getAttributeManager().attributes.instancePickingColors;\n      var value = instancePickingColors.value;\n      var endInstanceIndex = startInstanceIndex + numVertices;\n      value.fill(0, startInstanceIndex * 3, endInstanceIndex * 3);\n      instancePickingColors.update({\n        value: value\n      });\n    }\n  }]);\n\n  return PathLayer;\n}(_core.Layer);\n\nexports.default = PathLayer;\nPathLayer.layerName = 'PathLayer';\nPathLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./path-tesselator\":\"fnsa\",\"./path-layer-vertex.glsl\":\"CWgV\",\"./path-layer-vertex-64.glsl\":\"gfil\",\"./path-layer-fragment.glsl\":\"uJxq\"}],\"vwhv\":[function(require,module,exports) {\n'use strict';\n\nmodule.exports = earcut;\nmodule.exports.default = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n    dim = dim || 2;\n\n    var hasHoles = holeIndices && holeIndices.length,\n        outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n        outerNode = linkedList(data, 0, outerLen, dim, true),\n        triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    var minX, minY, maxX, maxY, x, y, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n\n        for (var i = dim; i < outerLen; i += dim) {\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 1 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n    } else {\n        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    var p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    var stop = ear,\n        prev, next;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        prev = ear.prev;\n        next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    var p = ear.next.next;\n\n    while (p !== ear.prev) {\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // triangle bbox; min & max are calculated like this for speed\n    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(minTX, minTY, minX, minY, invSize),\n        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n\n    var p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n !== ear.prev && n !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n            area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n !== ear.prev && n !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n            area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize);\n                earcutLinked(c, triangles, dim, minX, minY, invSize);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [],\n        i, len, start, end, list;\n\n    for (i = 0, len = holeIndices.length; i < len; i++) {\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareX);\n\n    // process holes from left to right\n    for (i = 0; i < queue.length; i++) {\n        eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n\n    return outerNode;\n}\n\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    outerNode = findHoleBridge(hole, outerNode);\n    if (outerNode) {\n        var b = splitPolygon(outerNode, hole);\n        filterPoints(b, b.next);\n    }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode,\n        hx = hole.x,\n        hy = hole.y,\n        qx = -Infinity,\n        m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    var stop = m,\n        mx = m.x,\n        my = m.y,\n        tanMin = Infinity,\n        tan;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    var p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize,\n        inSize = 1;\n\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for (i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = 32767 * (x - minX) * invSize;\n    y = 32767 * (y - minY) * invSize;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n           (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n           (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    var o1 = sign(area(p1, q1, p2));\n    var o2 = sign(area(p1, q1, q2));\n    var o3 = sign(area(p2, q2, p1));\n    var o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a,\n        inside = false,\n        px = (a.x + b.x) / 2,\n        py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y),\n        b2 = new Node(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n    // vertex index in coordinates array\n    this.i = i;\n\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n\n    // previous and next vertex nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n\n    // z-order curve value\n    this.z = null;\n\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) {\n        for (var i = 0, len = holeIndices.length; i < len; i++) {\n            var start = holeIndices[i] * dim;\n            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n            polygonArea -= Math.abs(signedArea(data, start, end, dim));\n        }\n    }\n\n    var trianglesArea = 0;\n    for (i = 0; i < triangles.length; i += 3) {\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs(\n            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n\n    return polygonArea === 0 && trianglesArea === 0 ? 0 :\n        Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for (var i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n    var dim = data[0][0].length,\n        result = {vertices: [], holes: [], dimensions: dim},\n        holeIndex = 0;\n\n    for (var i = 0; i < data.length; i++) {\n        for (var j = 0; j < data[i].length; j++) {\n            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n        }\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n\n},{}],\"LoIe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getVertexCount = getVertexCount;\nexports.normalize = normalize;\nexports.getSurfaceIndices = getSurfaceIndices;\n\nvar _earcut = _interopRequireDefault(require(\"earcut\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* eslint-disable max-params */\n// 4 data formats are supported:\n// Simple Polygon: an array of points\n// Complex Polygon: an array of array of points (array of rings)\n//   with the first ring representing the outer hull and other rings representing holes\n// Simple Flat: an array of numbers (flattened \"simple polygon\")\n// Complex Flat: {position: array<number>, holeIndices: array<number>}\n//   (flattened \"complex polygon\")\n\n/**\n * Ensure a polygon is valid format\n * @param {Array|Object} polygon\n */\nfunction validate(polygon) {\n  polygon = polygon && polygon.positions || polygon;\n\n  if (!Array.isArray(polygon) && !ArrayBuffer.isView(polygon)) {\n    throw new Error('invalid polygon');\n  }\n}\n/**\n * Check if a polygon is simple or complex\n * @param {Array} polygon - either a complex or simple polygon\n * @return {Boolean} - true if the polygon is a simple polygon (i.e. not an array of polygons)\n */\n\n\nfunction isSimple(polygon) {\n  return polygon.length >= 1 && polygon[0].length >= 2 && Number.isFinite(polygon[0][0]);\n}\n/**\n * Check if a simple polygon is a closed ring\n * @param {Array} simplePolygon - array of points\n * @return {Boolean} - true if the simple polygon is a closed ring\n */\n\n\nfunction isNestedRingClosed(simplePolygon) {\n  // check if first and last vertex are the same\n  var p0 = simplePolygon[0];\n  var p1 = simplePolygon[simplePolygon.length - 1];\n  return p0[0] === p1[0] && p0[1] === p1[1] && p0[2] === p1[2];\n}\n/**\n * Check if a simple flat array is a closed ring\n * @param {Array} positions - array of numbers\n * @param {Number} size - size of a position, 2 (xy) or 3 (xyz)\n * @param {Number} startIndex - start index of the path in the positions array\n * @param {Number} endIndex - end index of the path in the positions array\n * @return {Boolean} - true if the simple flat array is a closed ring\n */\n\n\nfunction isFlatRingClosed(positions, size, startIndex, endIndex) {\n  for (var i = 0; i < size; i++) {\n    if (positions[startIndex + i] !== positions[endIndex - size + i]) {\n      return false;\n    }\n  }\n\n  return true;\n}\n/**\n * Copy a simple polygon coordinates into a flat array, closes the ring if needed.\n * @param {Float64Array} target - destination\n * @param {Number} targetStartIndex - index in the destination to start copying into\n * @param {Array} simplePolygon - array of points\n * @param {Number} size - size of a position, 2 (xy) or 3 (xyz)\n * @returns {Number} - the index of the write head in the destination\n */\n\n\nfunction copyNestedRing(target, targetStartIndex, simplePolygon, size) {\n  var targetIndex = targetStartIndex;\n  var len = simplePolygon.length;\n\n  for (var i = 0; i < len; i++) {\n    for (var j = 0; j < size; j++) {\n      target[targetIndex++] = simplePolygon[i][j] || 0;\n    }\n  }\n\n  if (!isNestedRingClosed(simplePolygon)) {\n    for (var _j = 0; _j < size; _j++) {\n      target[targetIndex++] = simplePolygon[0][_j] || 0;\n    }\n  }\n\n  return targetIndex;\n}\n/**\n * Copy a simple flat array into another flat array, closes the ring if needed.\n * @param {Float64Array} target - destination\n * @param {Number} targetStartIndex - index in the destination to start copying into\n * @param {Array} positions - array of numbers\n * @param {Number} size - size of a position, 2 (xy) or 3 (xyz)\n * @param {Number} [srcStartIndex] - start index of the path in the positions array\n * @param {Number} [srcEndIndex] - end index of the path in the positions array\n * @returns {Number} - the index of the write head in the destination\n */\n\n\nfunction copyFlatRing(target, targetStartIndex, positions, size) {\n  var srcStartIndex = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n  var srcEndIndex = arguments.length > 5 ? arguments[5] : undefined;\n  srcEndIndex = srcEndIndex || positions.length;\n  var srcLength = srcEndIndex - srcStartIndex;\n\n  if (srcLength <= 0) {\n    return targetStartIndex;\n  }\n\n  var targetIndex = targetStartIndex;\n\n  for (var i = 0; i < srcLength; i++) {\n    target[targetIndex++] = positions[srcStartIndex + i];\n  }\n\n  if (!isFlatRingClosed(positions, size, srcStartIndex, srcEndIndex)) {\n    for (var _i = 0; _i < size; _i++) {\n      target[targetIndex++] = positions[srcStartIndex + _i];\n    }\n  }\n\n  return targetIndex;\n}\n/**\n * Counts the number of vertices in a simple polygon, closes the polygon if needed.\n * @param {Array} simplePolygon - array of points\n * @returns {Number} vertex count\n */\n\n\nfunction getNestedVertexCount(simplePolygon) {\n  return (isNestedRingClosed(simplePolygon) ? 0 : 1) + simplePolygon.length;\n}\n/**\n * Counts the number of vertices in a simple flat array, closes the polygon if needed.\n * @param {Array} positions - array of numbers\n * @param {Number} size - size of a position, 2 (xy) or 3 (xyz)\n * @param {Number} [startIndex] - start index of the path in the positions array\n * @param {Number} [endIndex] - end index of the path in the positions array\n * @returns {Number} vertex count\n */\n\n\nfunction getFlatVertexCount(positions, size) {\n  var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  var endIndex = arguments.length > 3 ? arguments[3] : undefined;\n  endIndex = endIndex || positions.length;\n\n  if (startIndex >= endIndex) {\n    return 0;\n  }\n\n  return (isFlatRingClosed(positions, size, startIndex, endIndex) ? 0 : 1) + (endIndex - startIndex) / size;\n}\n/**\n * Counts the number of vertices in any polygon representation.\n * @param {Array|Object} polygon\n * @param {Number} positionSize - size of a position, 2 (xy) or 3 (xyz)\n * @returns {Number} vertex count\n */\n\n\nfunction getVertexCount(polygon, positionSize) {\n  validate(polygon);\n\n  if (polygon.positions) {\n    // complex flat\n    var _polygon = polygon,\n        positions = _polygon.positions,\n        holeIndices = _polygon.holeIndices;\n\n    if (holeIndices) {\n      var vertexCount = 0; // split the positions array into `holeIndices.length + 1` rings\n      // holeIndices[-1] falls back to 0\n      // holeIndices[holeIndices.length] falls back to positions.length\n\n      for (var i = 0; i <= holeIndices.length; i++) {\n        vertexCount += getFlatVertexCount(polygon.positions, positionSize, holeIndices[i - 1], holeIndices[i]);\n      }\n\n      return vertexCount;\n    }\n\n    polygon = positions;\n  }\n\n  if (Number.isFinite(polygon[0])) {\n    // simple flat\n    return getFlatVertexCount(polygon, positionSize);\n  }\n\n  if (!isSimple(polygon)) {\n    // complex polygon\n    var _vertexCount = 0;\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n\n    try {\n      for (var _iterator = polygon[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n        var simplePolygon = _step.value;\n        _vertexCount += getNestedVertexCount(simplePolygon);\n      }\n    } catch (err) {\n      _didIteratorError = true;\n      _iteratorError = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion && _iterator.return != null) {\n          _iterator.return();\n        }\n      } finally {\n        if (_didIteratorError) {\n          throw _iteratorError;\n        }\n      }\n    }\n\n    return _vertexCount;\n  } // simple polygon\n\n\n  return getNestedVertexCount(polygon);\n}\n/**\n * Normalize any polygon representation into the \"complex flat\" format\n * @param {Array|Object} polygon\n * @param {Number} positionSize - size of a position, 2 (xy) or 3 (xyz)\n * @param {Number} [vertexCount] - pre-computed vertex count in the polygon.\n *   If provided, will skip counting.\n * @return {Object} - {positions: <Float64Array>, holeIndices: <Array|null>}\n */\n\n/* eslint-disable max-statements */\n\n\nfunction normalize(polygon, positionSize, vertexCount) {\n  validate(polygon);\n  vertexCount = vertexCount || getVertexCount(polygon, positionSize);\n  var positions = new Float64Array(vertexCount * positionSize);\n  var holeIndices = [];\n\n  if (polygon.positions) {\n    // complex flat\n    var _polygon2 = polygon,\n        srcPositions = _polygon2.positions,\n        srcHoleIndices = _polygon2.holeIndices;\n\n    if (srcHoleIndices) {\n      var targetIndex = 0; // split the positions array into `holeIndices.length + 1` rings\n      // holeIndices[-1] falls back to 0\n      // holeIndices[holeIndices.length] falls back to positions.length\n\n      for (var i = 0; i <= srcHoleIndices.length; i++) {\n        targetIndex = copyFlatRing(positions, targetIndex, srcPositions, positionSize, srcHoleIndices[i - 1], srcHoleIndices[i]);\n        holeIndices.push(targetIndex);\n      } // The last one is not a starting index of a hole, remove\n\n\n      holeIndices.pop();\n      return {\n        positions: positions,\n        holeIndices: holeIndices\n      };\n    }\n\n    polygon = srcPositions;\n  }\n\n  if (Number.isFinite(polygon[0])) {\n    // simple flat\n    copyFlatRing(positions, 0, polygon, positionSize);\n    return {\n      positions: positions,\n      holeIndices: null\n    };\n  }\n\n  if (!isSimple(polygon)) {\n    // complex polygon\n    var _targetIndex = 0;\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n\n    try {\n      for (var _iterator2 = polygon[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n        var simplePolygon = _step2.value;\n        _targetIndex = copyNestedRing(positions, _targetIndex, simplePolygon, positionSize);\n        holeIndices.push(_targetIndex);\n      } // The last one is not a starting index of a hole, remove\n\n    } catch (err) {\n      _didIteratorError2 = true;\n      _iteratorError2 = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n          _iterator2.return();\n        }\n      } finally {\n        if (_didIteratorError2) {\n          throw _iteratorError2;\n        }\n      }\n    }\n\n    holeIndices.pop(); // last index points to the end of the array, remove it\n\n    return {\n      positions: positions,\n      holeIndices: holeIndices\n    };\n  } // simple polygon\n\n\n  copyNestedRing(positions, 0, polygon, positionSize);\n  return {\n    positions: positions,\n    holeIndices: null\n  };\n}\n/* eslint-enable max-statements */\n\n/*\n * Get vertex indices for drawing polygon mesh\n * @param {Object} normalizedPolygon - {positions, holeIndices}\n * @param {Number} positionSize - size of a position, 2 (xy) or 3 (xyz)\n * @returns {Array} array of indices\n */\n\n\nfunction getSurfaceIndices(normalizedPolygon, positionSize) {\n  var holeIndices = null;\n\n  if (normalizedPolygon.holeIndices) {\n    holeIndices = normalizedPolygon.holeIndices.map(function (positionIndex) {\n      return positionIndex / positionSize;\n    });\n  } // Let earcut triangulate the polygon\n\n\n  return (0, _earcut.default)(normalizedPolygon.positions, holeIndices, positionSize);\n}\n},{\"earcut\":\"vwhv\"}],\"IXX7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar Polygon = _interopRequireWildcard(require(\"./polygon\"));\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _luma = require(\"luma.gl\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Handles tesselation of polygons with holes\n// - 2D surfaces\n// - 2D outlines\n// - 3D surfaces (top and sides only)\n// - 3D wireframes (not yet)\n\n\nvar Tesselator = _core.experimental.Tesselator;\nvar fp64LowPart = _luma.fp64.fp64LowPart; // colorArray is used to copy over color values if the passed color is an RGB\n// array instead of RGBA\n\nvar colorArray = [0, 0, 0, 255]; // This class is set up to allow querying one attribute at a time\n// the way the AttributeManager expects it\n\nvar PolygonTesselator =\n/*#__PURE__*/\nfunction (_Tesselator) {\n  _inherits(PolygonTesselator, _Tesselator);\n\n  function PolygonTesselator(_ref) {\n    var data = _ref.data,\n        getGeometry = _ref.getGeometry,\n        fp64 = _ref.fp64,\n        positionFormat = _ref.positionFormat,\n        _ref$IndexType = _ref.IndexType,\n        IndexType = _ref$IndexType === void 0 ? Uint32Array : _ref$IndexType;\n\n    _classCallCheck(this, PolygonTesselator);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(PolygonTesselator).call(this, {\n      data: data,\n      getGeometry: getGeometry,\n      fp64: fp64,\n      positionFormat: positionFormat,\n      attributes: {\n        positions: {\n          size: 3\n        },\n        positions64xyLow: {\n          size: 2,\n          fp64Only: true\n        },\n        vertexValid: {\n          type: Uint8ClampedArray,\n          size: 1\n        },\n        indices: {\n          type: IndexType,\n          size: 1\n        }\n      }\n    }));\n  }\n  /* Getters */\n\n\n  _createClass(PolygonTesselator, [{\n    key: \"get\",\n    value: function get(attributeName, target, accessor) {\n      if (attributeName === 'indices') {\n        return this.attributes.indices.subarray(0, this.vertexCount);\n      }\n\n      if (this.attributes[attributeName]) {\n        return this.attributes[attributeName];\n      }\n\n      switch (attributeName) {\n        case 'elevations':\n          return this._updateAttribute({\n            target: target,\n            size: 1,\n            getValue: function getValue(object) {\n              return [accessor(object)];\n            }\n          });\n\n        case 'colors':\n          return this._updateAttribute({\n            target: target,\n            size: 4,\n            getValue: function getValue(object) {\n              var color = accessor(object);\n\n              if (color.length === 4) {\n                return color;\n              }\n\n              colorArray[0] = color[0];\n              colorArray[1] = color[1];\n              colorArray[2] = color[2];\n              return colorArray;\n            }\n          });\n\n        case 'pickingColors':\n          return this._updateAttribute({\n            target: target,\n            size: 3,\n            getValue: function getValue(object, index) {\n              return accessor(index);\n            }\n          });\n\n        default:\n          return null;\n      }\n    }\n    /* Implement base Tesselator interface */\n\n  }, {\n    key: \"getGeometrySize\",\n    value: function getGeometrySize(polygon) {\n      return Polygon.getVertexCount(polygon, this.positionSize);\n    }\n  }, {\n    key: \"updateGeometryAttributes\",\n    value: function updateGeometryAttributes(polygon, context) {\n      polygon = Polygon.normalize(polygon, this.positionSize, context.geometrySize);\n\n      this._updateIndices(polygon, context);\n\n      this._updatePositions(polygon, context);\n    } // Flatten the indices array\n\n  }, {\n    key: \"_updateIndices\",\n    value: function _updateIndices(polygon, _ref2) {\n      var geometryIndex = _ref2.geometryIndex,\n          offset = _ref2.vertexStart,\n          indexStart = _ref2.indexStart;\n      var attributes = this.attributes,\n          indexLayout = this.indexLayout,\n          typedArrayManager = this.typedArrayManager;\n      var target = attributes.indices;\n      var currentLength = target.length;\n      var i = indexStart; // 1. get triangulated indices for the internal areas\n\n      var indices = Polygon.getSurfaceIndices(polygon, this.positionSize); // make sure the buffer is large enough\n\n      if (currentLength < i + indices.length) {\n        currentLength = (i + indices.length) * 2;\n        target = typedArrayManager.allocate(target, currentLength, {\n          type: target.constructor,\n          size: 1,\n          copy: true\n        });\n      } // 2. offset each index by the number of indices in previous polygons\n\n\n      for (var j = 0; j < indices.length; j++) {\n        target[i++] = indices[j] + offset;\n      }\n\n      indexLayout[geometryIndex] = indices.length;\n      attributes.indices = target;\n    } // Flatten out all the vertices of all the sub subPolygons\n\n  }, {\n    key: \"_updatePositions\",\n    value: function _updatePositions(polygon, _ref3) {\n      var vertexStart = _ref3.vertexStart,\n          geometrySize = _ref3.geometrySize;\n      var _this$attributes = this.attributes,\n          positions = _this$attributes.positions,\n          positions64xyLow = _this$attributes.positions64xyLow,\n          vertexValid = _this$attributes.vertexValid,\n          fp64 = this.fp64,\n          positionSize = this.positionSize;\n      var i = vertexStart;\n      var polygonPositions = polygon.positions,\n          holeIndices = polygon.holeIndices;\n\n      for (var j = 0; j < geometrySize; j++) {\n        var x = polygonPositions[j * positionSize];\n        var y = polygonPositions[j * positionSize + 1];\n        var z = positionSize > 2 ? polygonPositions[j * positionSize + 2] : 0;\n        positions[i * 3] = x;\n        positions[i * 3 + 1] = y;\n        positions[i * 3 + 2] = z;\n\n        if (fp64) {\n          positions64xyLow[i * 2] = fp64LowPart(x);\n          positions64xyLow[i * 2 + 1] = fp64LowPart(y);\n        }\n\n        vertexValid[i] = 1;\n        i++;\n      }\n      /* We are reusing the some buffer for `nextPositions` by offseting one vertex\n       * to the left. As a result,\n       * the last vertex of each ring overlaps with the first vertex of the next ring.\n       * `vertexValid` is used to mark the end of each ring so we don't draw these\n       * segments:\n        positions      A0 A1 A2 A3 A4 B0 B1 B2 C0 ...\n        nextPositions  A1 A2 A3 A4 B0 B1 B2 C0 C1 ...\n        vertexValid    1  1  1  1  0  1  1  0  1 ...\n       */\n\n\n      if (holeIndices) {\n        for (var _j = 0; _j < holeIndices.length; _j++) {\n          vertexValid[vertexStart + holeIndices[_j] / positionSize - 1] = 0;\n        }\n      }\n\n      vertexValid[vertexStart + geometrySize - 1] = 0;\n    }\n  }]);\n\n  return PolygonTesselator;\n}(Tesselator);\n\nexports.default = PolygonTesselator;\n},{\"./polygon\":\"LoIe\",\"@deck.gl/core\":\"P3tH\",\"luma.gl\":\"iiNl\"}],\"DzD5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME solid-polygon-layer-vertex-shader\\n\\nattribute vec2 vertexPositions;\\nattribute float vertexValid;\\nattribute vec3 positions;\\nattribute vec2 positions64xyLow;\\nattribute vec3 nextPositions;\\nattribute vec2 nextPositions64xyLow;\\nattribute float elevations;\\nattribute vec4 fillColors;\\nattribute vec4 lineColors;\\nattribute vec3 pickingColors;\\n\\nuniform bool isSideVertex;\\nuniform bool extruded;\\nuniform bool isWireframe;\\nuniform float elevationScale;\\nuniform float opacity;\\n\\nvarying vec4 vColor;\\nvarying float isValid;\\n\\nvoid main(void) {\\n  vec3 pos;\\n  vec2 pos64xyLow;\\n  vec3 normal;\\n  vec4 colors = isWireframe ? lineColors : fillColors;\\n\\n  if (isSideVertex) {\\n    pos = mix(positions, nextPositions, vertexPositions.x);\\n    pos64xyLow = mix(positions64xyLow, nextPositions64xyLow, vertexPositions.x);\\n    isValid = vertexValid;\\n  } else {\\n    pos = positions;\\n    pos64xyLow = positions64xyLow;\\n    isValid = 1.0;\\n  }\\n  if (extruded) {\\n    pos.z += elevations * vertexPositions.y;\\n  }\\n  pos.z *= elevationScale;\\n\\n  vec4 position_worldspace;\\n  gl_Position = project_position_to_clipspace(pos, pos64xyLow, vec3(0.), position_worldspace);\\n\\n  float lightWeight = 1.0;\\n  \\n  if (extruded) {\\n    if (isSideVertex) {\\n      normal = vec3(positions.y - nextPositions.y, nextPositions.x - positions.x, 0.0);\\n      normal = project_normal(normal);\\n    } else {\\n      normal = vec3(0.0, 0.0, 1.0);\\n    }\\n\\n    lightWeight = lighting_getLightWeight(position_worldspace.xyz, normal);\\n  }\\n\\n  vec3 lightWeightedColor = lightWeight * colors.rgb;\\n  vColor = vec4(lightWeightedColor, colors.a * opacity) / 255.0;\\n\\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\\n  picking_setPickingColor(pickingColors);\\n}\\n\";\nexports.default = _default;\n},{}],\"ycNl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME solid-polygon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying float isValid;\\n\\nvoid main(void) {\\n  if (isValid < 0.5) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vColor;\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"w2SP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _constants = _interopRequireDefault(require(\"luma.gl/constants\"));\n\nvar _luma = require(\"luma.gl\");\n\nvar _polygonTesselator = _interopRequireDefault(require(\"./polygon-tesselator\"));\n\nvar _solidPolygonLayerVertex = _interopRequireDefault(require(\"./solid-polygon-layer-vertex.glsl\"));\n\nvar _solidPolygonLayerFragment = _interopRequireDefault(require(\"./solid-polygon-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar DEFAULT_COLOR = [0, 0, 0, 255];\nvar defaultProps = {\n  filled: true,\n  // Whether to extrude\n  extruded: false,\n  // Whether to draw a GL.LINES wireframe of the polygon\n  wireframe: false,\n  fp64: false,\n  // elevation multiplier\n  elevationScale: {\n    type: 'number',\n    min: 0,\n    value: 1\n  },\n  // Accessor for polygon geometry\n  getPolygon: {\n    type: 'accessor',\n    value: function value(f) {\n      return f.polygon;\n    }\n  },\n  // Accessor for extrusion height\n  getElevation: {\n    type: 'accessor',\n    value: 1000\n  },\n  // Accessor for colors\n  getFillColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getLineColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  // Optional settings for 'lighting' shader module\n  lightSettings: {}\n};\nvar ATTRIBUTE_TRANSITION = {\n  enter: function enter(value, chunk) {\n    return chunk.length ? chunk.subarray(chunk.length - value.length) : value;\n  }\n};\n\nvar SolidPolygonLayer =\n/*#__PURE__*/\nfunction (_Layer) {\n  _inherits(SolidPolygonLayer, _Layer);\n\n  function SolidPolygonLayer() {\n    _classCallCheck(this, SolidPolygonLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(SolidPolygonLayer).apply(this, arguments));\n  }\n\n  _createClass(SolidPolygonLayer, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      var projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _solidPolygonLayerVertex.default,\n        fs: _solidPolygonLayerFragment.default,\n        modules: [projectModule, 'lighting', 'picking']\n      };\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      var gl = this.context.gl;\n      this.setState({\n        numInstances: 0,\n        polygonTesselator: new _polygonTesselator.default({\n          IndexType: !gl || (0, _luma.hasFeature)(gl, _luma.FEATURES.ELEMENT_INDEX_UINT32) ? Uint32Array : Uint16Array\n        })\n      });\n      var attributeManager = this.getAttributeManager();\n      var noAlloc = true;\n      attributeManager.remove(['instancePickingColors']);\n      /* eslint-disable max-len */\n\n      attributeManager.add({\n        indices: {\n          size: 1,\n          isIndexed: true,\n          update: this.calculateIndices,\n          noAlloc: noAlloc\n        },\n        positions: {\n          size: 3,\n          transition: ATTRIBUTE_TRANSITION,\n          accessor: 'getPolygon',\n          update: this.calculatePositions,\n          noAlloc: noAlloc\n        },\n        positions64xyLow: {\n          size: 2,\n          update: this.calculatePositionsLow,\n          noAlloc: noAlloc\n        },\n        vertexValid: {\n          size: 1,\n          type: _constants.default.UNSIGNED_BYTE,\n          update: this.calculateVertexValid,\n          noAlloc: noAlloc\n        },\n        elevations: {\n          size: 1,\n          transition: ATTRIBUTE_TRANSITION,\n          accessor: 'getElevation',\n          update: this.calculateElevations\n        },\n        fillColors: {\n          alias: 'colors',\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: ATTRIBUTE_TRANSITION,\n          accessor: 'getFillColor',\n          update: this.calculateFillColors,\n          defaultValue: DEFAULT_COLOR\n        },\n        lineColors: {\n          alias: 'colors',\n          size: 4,\n          type: _constants.default.UNSIGNED_BYTE,\n          transition: ATTRIBUTE_TRANSITION,\n          accessor: 'getLineColor',\n          update: this.calculateLineColors,\n          defaultValue: DEFAULT_COLOR\n        },\n        pickingColors: {\n          size: 3,\n          type: _constants.default.UNSIGNED_BYTE,\n          update: this.calculatePickingColors\n        }\n      });\n      /* eslint-enable max-len */\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref) {\n      var uniforms = _ref.uniforms;\n      var _this$props = this.props,\n          extruded = _this$props.extruded,\n          filled = _this$props.filled,\n          wireframe = _this$props.wireframe,\n          elevationScale = _this$props.elevationScale;\n      var _this$state = this.state,\n          topModel = _this$state.topModel,\n          sideModel = _this$state.sideModel;\n      var renderUniforms = Object.assign({}, uniforms, {\n        extruded: Boolean(extruded),\n        elevationScale: elevationScale\n      }); // Note: the order is important\n\n      if (sideModel) {\n        sideModel.setUniforms(renderUniforms);\n\n        if (wireframe) {\n          sideModel.setDrawMode(_constants.default.LINE_STRIP);\n          sideModel.render({\n            isWireframe: true\n          });\n        }\n\n        if (filled) {\n          sideModel.setDrawMode(_constants.default.TRIANGLE_FAN);\n          sideModel.render({\n            isWireframe: false\n          });\n        }\n      }\n\n      if (topModel) {\n        topModel.render(renderUniforms);\n      }\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(updateParams) {\n      _get(_getPrototypeOf(SolidPolygonLayer.prototype), \"updateState\", this).call(this, updateParams);\n\n      this.updateGeometry(updateParams);\n      var props = updateParams.props,\n          oldProps = updateParams.oldProps;\n      var attributeManager = this.getAttributeManager();\n      var regenerateModels = props.fp64 !== oldProps.fp64 || props.filled !== oldProps.filled || props.extruded !== oldProps.extruded;\n\n      if (regenerateModels) {\n        if (this.state.models) {\n          this.state.models.forEach(function (model) {\n            return model.delete();\n          });\n        }\n\n        this.setState(this._getModels(this.context.gl));\n        attributeManager.invalidateAll();\n      }\n    }\n  }, {\n    key: \"updateGeometry\",\n    value: function updateGeometry(_ref2) {\n      var props = _ref2.props,\n          oldProps = _ref2.oldProps,\n          changeFlags = _ref2.changeFlags;\n      var geometryConfigChanged = changeFlags.dataChanged || props.fp64 !== oldProps.fp64 || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPolygon); // When the geometry config  or the data is changed,\n      // tessellator needs to be invoked\n\n      if (geometryConfigChanged) {\n        var polygonTesselator = this.state.polygonTesselator;\n        polygonTesselator.updateGeometry({\n          data: props.data,\n          getGeometry: props.getPolygon,\n          positionFormat: props.positionFormat,\n          fp64: this.use64bitPositions()\n        });\n        this.setState({\n          numInstances: polygonTesselator.instanceCount\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n    }\n  }, {\n    key: \"updateAttributes\",\n    value: function updateAttributes(props) {\n      _get(_getPrototypeOf(SolidPolygonLayer.prototype), \"updateAttributes\", this).call(this, props);\n\n      var attributes = this.getAttributeManager().getChangedAttributes({\n        clearChangedFlags: true\n      });\n      var _this$state2 = this.state,\n          topModel = _this$state2.topModel,\n          sideModel = _this$state2.sideModel;\n      var numInstances = this.getNumInstances();\n\n      if (topModel) {\n        if (attributes.indices) {\n          var vertexCount = attributes.indices.value.length;\n          topModel.setVertexCount(vertexCount);\n        }\n\n        topModel.setAttributes(attributes);\n      }\n\n      if (sideModel) {\n        // Remove one to account for the offset\n        sideModel.setInstanceCount(numInstances - 1);\n        var newAttributes = {};\n\n        for (var attributeName in attributes) {\n          var attribute = attributes[attributeName];\n\n          if (attributeName !== 'indices') {\n            // Apply layout override to the attribute.\n            newAttributes[attributeName] = Object.assign({}, attribute, {\n              isInstanced: true,\n              buffer: attribute.getBuffer()\n            });\n          }\n        }\n\n        if (newAttributes.positions) {\n          newAttributes.nextPositions = Object.assign({}, newAttributes.positions, {\n            id: 'nextPositions',\n            offset: 12 // 1 vertex * 3 floats * 4 bits\n\n          });\n        }\n\n        if (newAttributes.positions64xyLow) {\n          newAttributes.nextPositions64xyLow = Object.assign({}, newAttributes.positions64xyLow, {\n            id: 'nextPositions64xyLow',\n            offset: 8 // 1 vertex * 2 floats * 4 bits\n\n          });\n        }\n\n        sideModel.setAttributes(newAttributes);\n      }\n    }\n  }, {\n    key: \"_getModels\",\n    value: function _getModels(gl) {\n      var _this$props2 = this.props,\n          id = _this$props2.id,\n          filled = _this$props2.filled,\n          extruded = _this$props2.extruded;\n      var topModel;\n      var sideModel;\n\n      if (filled) {\n        topModel = new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n          id: \"\".concat(id, \"-top\"),\n          geometry: new _luma.Geometry({\n            drawMode: _constants.default.TRIANGLES,\n            attributes: {\n              vertexPositions: {\n                size: 2,\n                constant: true,\n                value: new Float32Array([0, 1])\n              },\n              nextPositions: {\n                size: 3,\n                constant: true,\n                value: new Float32Array(3)\n              },\n              nextPositions64xyLow: {\n                size: 2,\n                constant: true,\n                value: new Float32Array(2)\n              }\n            }\n          }),\n          uniforms: {\n            isWireframe: false,\n            isSideVertex: false\n          },\n          vertexCount: 0,\n          isIndexed: true,\n          shaderCache: this.context.shaderCache\n        }));\n      }\n\n      if (extruded) {\n        sideModel = new _luma.Model(gl, Object.assign({}, this.getShaders(), {\n          id: \"\".concat(id, \"-side\"),\n          geometry: new _luma.Geometry({\n            drawMode: _constants.default.LINES,\n            vertexCount: 4,\n            attributes: {\n              // top right - top left - bootom left - bottom right\n              vertexPositions: {\n                size: 2,\n                value: new Float32Array([1, 1, 0, 1, 0, 0, 1, 0])\n              }\n            }\n          }),\n          uniforms: {\n            isSideVertex: true\n          },\n          isInstanced: 1,\n          shaderCache: this.context.shaderCache\n        }));\n      }\n\n      return {\n        models: [sideModel, topModel].filter(Boolean),\n        topModel: topModel,\n        sideModel: sideModel\n      };\n    }\n  }, {\n    key: \"calculateIndices\",\n    value: function calculateIndices(attribute) {\n      var polygonTesselator = this.state.polygonTesselator;\n      attribute.bufferLayout = polygonTesselator.indexLayout;\n      attribute.value = polygonTesselator.get('indices');\n    }\n  }, {\n    key: \"calculatePositions\",\n    value: function calculatePositions(attribute) {\n      var polygonTesselator = this.state.polygonTesselator;\n      attribute.bufferLayout = polygonTesselator.bufferLayout;\n      attribute.value = polygonTesselator.get('positions');\n    }\n  }, {\n    key: \"calculatePositionsLow\",\n    value: function calculatePositionsLow(attribute) {\n      var isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      attribute.value = this.state.polygonTesselator.get('positions64xyLow');\n    }\n  }, {\n    key: \"calculateVertexValid\",\n    value: function calculateVertexValid(attribute) {\n      attribute.value = this.state.polygonTesselator.get('vertexValid');\n    }\n  }, {\n    key: \"calculateElevations\",\n    value: function calculateElevations(attribute) {\n      var polygonTesselator = this.state.polygonTesselator;\n      attribute.bufferLayout = polygonTesselator.bufferLayout;\n      var _this$props3 = this.props,\n          extruded = _this$props3.extruded,\n          getElevation = _this$props3.getElevation;\n\n      if (extruded) {\n        attribute.constant = false;\n        attribute.value = polygonTesselator.get('elevations', attribute.value, getElevation);\n      } else {\n        attribute.constant = true;\n        attribute.value = new Float32Array(1);\n      }\n    }\n  }, {\n    key: \"calculateFillColors\",\n    value: function calculateFillColors(attribute) {\n      var polygonTesselator = this.state.polygonTesselator;\n      attribute.bufferLayout = polygonTesselator.bufferLayout;\n      attribute.value = polygonTesselator.get('colors', attribute.value, this.props.getFillColor);\n    }\n  }, {\n    key: \"calculateLineColors\",\n    value: function calculateLineColors(attribute) {\n      var polygonTesselator = this.state.polygonTesselator;\n      attribute.bufferLayout = polygonTesselator.bufferLayout;\n      attribute.value = polygonTesselator.get('colors', attribute.value, this.props.getLineColor);\n    } // Override the default picking colors calculation\n\n  }, {\n    key: \"calculatePickingColors\",\n    value: function calculatePickingColors(attribute) {\n      var _this = this;\n\n      var pickingColor = [];\n      attribute.value = this.state.polygonTesselator.get('pickingColors', attribute.value, function (index) {\n        return _this.encodePickingColor(index, pickingColor);\n      });\n    }\n  }, {\n    key: \"clearPickingColor\",\n    value: function clearPickingColor(color) {\n      var pickedPolygonIndex = this.decodePickingColor(color);\n      var bufferLayout = this.state.polygonTesselator.bufferLayout;\n      var numVertices = bufferLayout[pickedPolygonIndex];\n      var startInstanceIndex = 0;\n\n      for (var polygonIndex = 0; polygonIndex < pickedPolygonIndex; polygonIndex++) {\n        startInstanceIndex += bufferLayout[polygonIndex];\n      }\n\n      var pickingColors = this.getAttributeManager().attributes.pickingColors;\n      var value = pickingColors.value;\n      var endInstanceIndex = startInstanceIndex + numVertices;\n      value.fill(0, startInstanceIndex * 3, endInstanceIndex * 3);\n      pickingColors.update({\n        value: value\n      });\n    }\n  }]);\n\n  return SolidPolygonLayer;\n}(_core.Layer);\n\nexports.default = SolidPolygonLayer;\nSolidPolygonLayer.layerName = 'SolidPolygonLayer';\nSolidPolygonLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"luma.gl/constants\":\"zLGf\",\"luma.gl\":\"iiNl\",\"./polygon-tesselator\":\"IXX7\",\"./solid-polygon-layer-vertex.glsl\":\"DzD5\",\"./solid-polygon-layer-fragment.glsl\":\"ycNl\"}],\"UxaK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _solidPolygonLayer = _interopRequireDefault(require(\"../solid-polygon-layer/solid-polygon-layer\"));\n\nvar _pathLayer = _interopRequireDefault(require(\"../path-layer/path-layer\"));\n\nvar Polygon = _interopRequireWildcard(require(\"../solid-polygon-layer/polygon\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar defaultLineColor = [0, 0, 0, 255];\nvar defaultFillColor = [0, 0, 0, 255];\nvar defaultProps = {\n  stroked: true,\n  filled: true,\n  extruded: false,\n  elevationScale: 1,\n  wireframe: false,\n  lineWidthScale: 1,\n  lineWidthMinPixels: 0,\n  lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n  lineJointRounded: false,\n  lineMiterLimit: 4,\n  lineDashJustified: false,\n  fp64: false,\n  getPolygon: {\n    type: 'accessor',\n    value: function value(f) {\n      return f.polygon;\n    }\n  },\n  // Polygon fill color\n  getFillColor: {\n    type: 'accessor',\n    value: defaultFillColor\n  },\n  // Point, line and polygon outline color\n  getLineColor: {\n    type: 'accessor',\n    value: defaultLineColor\n  },\n  // Line and polygon outline accessors\n  getLineWidth: {\n    type: 'accessor',\n    value: 1\n  },\n  // Line dash array accessor\n  getLineDashArray: {\n    type: 'accessor',\n    value: [0, 0]\n  },\n  // Polygon extrusion accessor\n  getElevation: {\n    type: 'accessor',\n    value: 1000\n  },\n  // Optional settings for 'lighting' shader module\n  lightSettings: {}\n};\n\nvar PolygonLayer =\n/*#__PURE__*/\nfunction (_CompositeLayer) {\n  _inherits(PolygonLayer, _CompositeLayer);\n\n  function PolygonLayer() {\n    _classCallCheck(this, PolygonLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(PolygonLayer).apply(this, arguments));\n  }\n\n  _createClass(PolygonLayer, [{\n    key: \"initializeState\",\n    value: function initializeState() {\n      this.state = {\n        paths: []\n      };\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var oldProps = _ref.oldProps,\n          props = _ref.props,\n          changeFlags = _ref.changeFlags;\n      var geometryChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPolygon);\n\n      if (geometryChanged) {\n        this.state.paths = this._getPaths(props);\n      }\n    }\n  }, {\n    key: \"getPickingInfo\",\n    value: function getPickingInfo(_ref2) {\n      var info = _ref2.info;\n      return Object.assign(info, {\n        // override object with picked data\n        object: info.object && info.object.object || info.object\n      });\n    }\n  }, {\n    key: \"_getPaths\",\n    value: function _getPaths(_ref3) {\n      var data = _ref3.data,\n          getPolygon = _ref3.getPolygon,\n          positionFormat = _ref3.positionFormat;\n      var paths = [];\n      var positionSize = positionFormat === 'XY' ? 2 : 3;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n\n          var _Polygon$normalize = Polygon.normalize(getPolygon(object), positionSize),\n              positions = _Polygon$normalize.positions,\n              holeIndices = _Polygon$normalize.holeIndices;\n\n          if (holeIndices) {\n            // split the positions array into `holeIndices.length + 1` rings\n            // holeIndices[-1] falls back to 0\n            // holeIndices[holeIndices.length] falls back to positions.length\n            for (var i = 0; i <= holeIndices.length; i++) {\n              var path = positions.subarray(holeIndices[i - 1] || 0, holeIndices[i] || positions.length);\n              paths.push({\n                path: path,\n                object: object\n              });\n            }\n          } else {\n            paths.push({\n              path: positions,\n              object: object\n            });\n          }\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return paths;\n    }\n  }, {\n    key: \"_getAccessor\",\n    value: function _getAccessor(accessor) {\n      if (typeof accessor === 'function') {\n        return function (x) {\n          return accessor(x.object);\n        };\n      }\n\n      return accessor;\n    }\n    /* eslint-disable complexity */\n\n  }, {\n    key: \"renderLayers\",\n    value: function renderLayers() {\n      // Layer composition props\n      var _this$props = this.props,\n          data = _this$props.data,\n          stroked = _this$props.stroked,\n          filled = _this$props.filled,\n          extruded = _this$props.extruded,\n          wireframe = _this$props.wireframe,\n          elevationScale = _this$props.elevationScale,\n          transitions = _this$props.transitions; // Rendering props underlying layer\n\n      var _this$props2 = this.props,\n          lineWidthScale = _this$props2.lineWidthScale,\n          lineWidthMinPixels = _this$props2.lineWidthMinPixels,\n          lineWidthMaxPixels = _this$props2.lineWidthMaxPixels,\n          lineJointRounded = _this$props2.lineJointRounded,\n          lineMiterLimit = _this$props2.lineMiterLimit,\n          lineDashJustified = _this$props2.lineDashJustified,\n          fp64 = _this$props2.fp64; // Accessor props for underlying layers\n\n      var _this$props3 = this.props,\n          getFillColor = _this$props3.getFillColor,\n          getLineColor = _this$props3.getLineColor,\n          getLineWidth = _this$props3.getLineWidth,\n          getLineDashArray = _this$props3.getLineDashArray,\n          getElevation = _this$props3.getElevation,\n          getPolygon = _this$props3.getPolygon,\n          updateTriggers = _this$props3.updateTriggers,\n          lightSettings = _this$props3.lightSettings;\n      var paths = this.state.paths;\n      var FillLayer = this.getSubLayerClass('fill', _solidPolygonLayer.default);\n      var StrokeLayer = this.getSubLayerClass('stroke', _pathLayer.default); // Filled Polygon Layer\n\n      var polygonLayer = this.shouldRenderSubLayer('fill', paths) && new FillLayer({\n        extruded: extruded,\n        elevationScale: elevationScale,\n        fp64: fp64,\n        filled: filled,\n        wireframe: wireframe,\n        getElevation: getElevation,\n        getFillColor: getFillColor,\n        getLineColor: getLineColor,\n        lightSettings: lightSettings,\n        transitions: transitions\n      }, this.getSubLayerProps({\n        id: 'fill',\n        updateTriggers: {\n          getPolygon: updateTriggers.getPolygon,\n          getElevation: updateTriggers.getElevation,\n          getFillColor: updateTriggers.getFillColor,\n          getLineColor: updateTriggers.getLineColor\n        }\n      }), {\n        data: data,\n        getPolygon: getPolygon\n      }); // Polygon line layer\n\n      var polygonLineLayer = !extruded && stroked && this.shouldRenderSubLayer('stroke', paths) && new StrokeLayer({\n        fp64: fp64,\n        widthScale: lineWidthScale,\n        widthMinPixels: lineWidthMinPixels,\n        widthMaxPixels: lineWidthMaxPixels,\n        rounded: lineJointRounded,\n        miterLimit: lineMiterLimit,\n        dashJustified: lineDashJustified,\n        transitions: transitions && {\n          getWidth: transitions.getLineWidth,\n          getColor: transitions.getLineColor,\n          getPath: transitions.getPolygon\n        },\n        getColor: this._getAccessor(getLineColor),\n        getWidth: this._getAccessor(getLineWidth),\n        getDashArray: this._getAccessor(getLineDashArray)\n      }, this.getSubLayerProps({\n        id: 'stroke',\n        updateTriggers: {\n          getWidth: updateTriggers.getLineWidth,\n          getColor: updateTriggers.getLineColor,\n          getDashArray: updateTriggers.getLineDashArray\n        }\n      }), {\n        data: paths,\n        getPath: function getPath(x) {\n          return x.path;\n        }\n      });\n      return [// If not extruded: flat fill layer is drawn below outlines\n      !extruded && polygonLayer, polygonLineLayer, // If extruded: draw fill layer last for correct blending behavior\n      extruded && polygonLayer];\n    }\n    /* eslint-enable complexity */\n\n  }]);\n\n  return PolygonLayer;\n}(_core.CompositeLayer);\n\nexports.default = PolygonLayer;\nPolygonLayer.layerName = 'PolygonLayer';\nPolygonLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"../solid-polygon-layer/solid-polygon-layer\":\"w2SP\",\"../path-layer/path-layer\":\"n0i7\",\"../solid-polygon-layer/polygon\":\"LoIe\"}],\"W9Uo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = assert;\nexports.getGeojsonFeatures = getGeojsonFeatures;\nexports.separateGeojsonFeatures = separateGeojsonFeatures;\nexports.unwrapSourceFeature = unwrapSourceFeature;\nexports.unwrapSourceFeatureIndex = unwrapSourceFeatureIndex;\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Replacement for the external assert method to reduce bundle size\n// Since GeoJSON format issues are common to users we do show messages in\n// this case\nfunction assert(condition, message) {\n  if (!condition) {\n    throw new Error(\"deck.gl: \".concat(message));\n  }\n}\n/**\n * \"Normalizes\" complete or partial GeoJSON data into iterable list of features\n * Can accept GeoJSON geometry or \"Feature\", \"FeatureCollection\" in addition\n * to plain arrays and iterables.\n * Works by extracting the feature array or wrapping single objects in an array,\n * so that subsequent code can simply iterate over features.\n *\n * @param {object} geojson - geojson data\n * @param {Object|Array} data - geojson object (FeatureCollection, Feature or\n *  Geometry) or array of features\n * @return {Array|\"iteratable\"} - iterable list of features\n */\n\n\nfunction getGeojsonFeatures(geojson) {\n  // If array, assume this is a list of features\n  if (Array.isArray(geojson)) {\n    return geojson;\n  }\n\n  assert(geojson.type, 'GeoJSON does not have type');\n\n  switch (geojson.type) {\n    case 'Feature':\n      // Wrap the feature in a 'Features' array\n      return [geojson];\n\n    case 'FeatureCollection':\n      // Just return the 'Features' array from the collection\n      assert(Array.isArray(geojson.features), 'GeoJSON does not have features array');\n      return geojson.features;\n\n    default:\n      // Assume it's a geometry, we'll check type in separateGeojsonFeatures\n      // Wrap the geometry object in a 'Feature' object and wrap in an array\n      return [{\n        geometry: geojson\n      }];\n  }\n} // Linearize\n\n\nfunction separateGeojsonFeatures(features) {\n  var separated = {\n    pointFeatures: [],\n    lineFeatures: [],\n    polygonFeatures: [],\n    polygonOutlineFeatures: []\n  };\n\n  for (var featureIndex = 0; featureIndex < features.length; featureIndex++) {\n    var feature = features[featureIndex];\n    assert(feature && feature.geometry, 'GeoJSON does not have geometry');\n    var geometry = feature.geometry;\n    var sourceFeature = {\n      feature: feature,\n      index: featureIndex\n    };\n\n    if (geometry.type === 'GeometryCollection') {\n      assert(Array.isArray(geometry.geometries), 'GeoJSON does not have geometries array');\n      var geometries = geometry.geometries;\n\n      for (var i = 0; i < geometries.length; i++) {\n        var subGeometry = geometries[i];\n        separateGeometry(subGeometry, separated, sourceFeature);\n      }\n    } else {\n      separateGeometry(geometry, separated, sourceFeature);\n    }\n  }\n\n  return separated;\n}\n\nfunction separateGeometry(geometry, separated, sourceFeature) {\n  var type = geometry.type,\n      coordinates = geometry.coordinates;\n  var pointFeatures = separated.pointFeatures,\n      lineFeatures = separated.lineFeatures,\n      polygonFeatures = separated.polygonFeatures,\n      polygonOutlineFeatures = separated.polygonOutlineFeatures;\n  checkCoordinates(type, coordinates); // Split each feature, but keep track of the source feature and index (for Multi* geometries)\n\n  switch (type) {\n    case 'Point':\n      pointFeatures.push({\n        geometry: geometry,\n        sourceFeature: sourceFeature\n      });\n      break;\n\n    case 'MultiPoint':\n      coordinates.forEach(function (point) {\n        pointFeatures.push({\n          geometry: {\n            type: 'Point',\n            coordinates: point\n          },\n          sourceFeature: sourceFeature\n        });\n      });\n      break;\n\n    case 'LineString':\n      lineFeatures.push({\n        geometry: geometry,\n        sourceFeature: sourceFeature\n      });\n      break;\n\n    case 'MultiLineString':\n      // Break multilinestrings into multiple lines\n      coordinates.forEach(function (path) {\n        lineFeatures.push({\n          geometry: {\n            type: 'LineString',\n            coordinates: path\n          },\n          sourceFeature: sourceFeature\n        });\n      });\n      break;\n\n    case 'Polygon':\n      polygonFeatures.push({\n        geometry: geometry,\n        sourceFeature: sourceFeature\n      }); // Break polygon into multiple lines\n\n      coordinates.forEach(function (path) {\n        polygonOutlineFeatures.push({\n          geometry: {\n            type: 'LineString',\n            coordinates: path\n          },\n          sourceFeature: sourceFeature\n        });\n      });\n      break;\n\n    case 'MultiPolygon':\n      // Break multipolygons into multiple polygons\n      coordinates.forEach(function (polygon) {\n        polygonFeatures.push({\n          geometry: {\n            type: 'Polygon',\n            coordinates: polygon\n          },\n          sourceFeature: sourceFeature\n        }); // Break polygon into multiple lines\n\n        polygon.forEach(function (path) {\n          polygonOutlineFeatures.push({\n            geometry: {\n              type: 'LineString',\n              coordinates: path\n            },\n            sourceFeature: sourceFeature\n          });\n        });\n      });\n      break;\n\n    default:\n  }\n}\n/**\n * Returns the source feature that was passed to `separateGeojsonFeatures`\n */\n\n\nfunction unwrapSourceFeature(wrappedFeature) {\n  // The feature provided by the user is under `sourceFeature.feature`\n  return wrappedFeature.sourceFeature.feature;\n}\n/**\n * Returns the index of the source feature that was passed to `separateGeojsonFeatures`\n */\n\n\nfunction unwrapSourceFeatureIndex(wrappedFeature) {\n  // The index of the feature provided by the user is under `sourceFeature.index`\n  return wrappedFeature.sourceFeature.index;\n}\n/**\n * Simple GeoJSON validation util. For perf reasons we do not validate against the full spec,\n * only the following:\n   - geometry.type is supported\n   - geometry.coordinate has correct nesting level\n */\n\n\nvar COORDINATE_NEST_LEVEL = {\n  Point: 1,\n  MultiPoint: 2,\n  LineString: 2,\n  MultiLineString: 3,\n  Polygon: 3,\n  MultiPolygon: 4\n};\n\nfunction checkCoordinates(type, coordinates) {\n  var nestLevel = COORDINATE_NEST_LEVEL[type];\n  assert(nestLevel, \"Unknown GeoJSON type \".concat(type));\n\n  while (coordinates && --nestLevel > 0) {\n    coordinates = coordinates[0];\n  }\n\n  assert(coordinates && Number.isFinite(coordinates[0]), \"\".concat(type, \" coordinates are malformed\"));\n}\n},{}],\"ZH3t\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _scatterplotLayer = _interopRequireDefault(require(\"../scatterplot-layer/scatterplot-layer\"));\n\nvar _pathLayer = _interopRequireDefault(require(\"../path-layer/path-layer\"));\n\nvar _solidPolygonLayer = _interopRequireDefault(require(\"../solid-polygon-layer/solid-polygon-layer\"));\n\nvar _geojson = require(\"./geojson\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar defaultLineColor = [0, 0, 0, 255];\nvar defaultFillColor = [0, 0, 0, 255];\nvar defaultProps = {\n  stroked: true,\n  filled: true,\n  extruded: false,\n  wireframe: false,\n  lineWidthScale: 1,\n  lineWidthMinPixels: 0,\n  lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n  lineJointRounded: false,\n  lineMiterLimit: 4,\n  elevationScale: 1,\n  pointRadiusScale: 1,\n  pointRadiusMinPixels: 0,\n  //  min point radius in pixels\n  pointRadiusMaxPixels: Number.MAX_SAFE_INTEGER,\n  // max point radius in pixels\n  lineDashJustified: false,\n  fp64: false,\n  // Line and polygon outline color\n  getLineColor: {\n    type: 'accessor',\n    value: defaultLineColor\n  },\n  // Point and polygon fill color\n  getFillColor: {\n    type: 'accessor',\n    value: defaultFillColor\n  },\n  // Point radius\n  getRadius: {\n    type: 'accessor',\n    value: 1\n  },\n  // Line and polygon outline accessors\n  getLineWidth: {\n    type: 'accessor',\n    value: 1\n  },\n  // Line dash array accessor\n  getLineDashArray: {\n    type: 'accessor',\n    value: [0, 0]\n  },\n  // Polygon extrusion accessor\n  getElevation: {\n    type: 'accessor',\n    value: 1000\n  },\n  // Optional settings for 'lighting' shader module\n  lightSettings: {}\n};\n\nfunction getCoordinates(f) {\n  return f.geometry.coordinates;\n}\n/**\n * Unwraps the real source feature passed into props and passes as the argument to `accessor`.\n */\n\n\nfunction unwrappingAccessor(accessor) {\n  if (typeof accessor !== 'function') return accessor;\n  return function (feature) {\n    return accessor((0, _geojson.unwrapSourceFeature)(feature));\n  };\n}\n\nvar GeoJsonLayer =\n/*#__PURE__*/\nfunction (_CompositeLayer) {\n  _inherits(GeoJsonLayer, _CompositeLayer);\n\n  function GeoJsonLayer() {\n    _classCallCheck(this, GeoJsonLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(GeoJsonLayer).apply(this, arguments));\n  }\n\n  _createClass(GeoJsonLayer, [{\n    key: \"initializeState\",\n    value: function initializeState() {\n      this.state = {\n        features: {}\n      };\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var oldProps = _ref.oldProps,\n          props = _ref.props,\n          changeFlags = _ref.changeFlags;\n\n      if (changeFlags.dataChanged) {\n        var data = props.data;\n        var features = (0, _geojson.getGeojsonFeatures)(data);\n        this.state.features = (0, _geojson.separateGeojsonFeatures)(features);\n      }\n    }\n  }, {\n    key: \"getPickingInfo\",\n    value: function getPickingInfo(_ref2) {\n      var info = _ref2.info,\n          sourceLayer = _ref2.sourceLayer; // `info.index` is the index within the particular sub-layer\n      // We want to expose the index of the feature the user provided\n\n      return Object.assign(info, {\n        // override object with picked feature\n        object: info.object ? (0, _geojson.unwrapSourceFeature)(info.object) : info.object,\n        index: info.object ? (0, _geojson.unwrapSourceFeatureIndex)(info.object) : info.index\n      });\n    }\n    /* eslint-disable complexity */\n\n  }, {\n    key: \"renderLayers\",\n    value: function renderLayers() {\n      var features = this.state.features;\n      var pointFeatures = features.pointFeatures,\n          lineFeatures = features.lineFeatures,\n          polygonFeatures = features.polygonFeatures,\n          polygonOutlineFeatures = features.polygonOutlineFeatures; // Layer composition props\n\n      var _this$props = this.props,\n          stroked = _this$props.stroked,\n          filled = _this$props.filled,\n          extruded = _this$props.extruded,\n          wireframe = _this$props.wireframe,\n          lightSettings = _this$props.lightSettings,\n          transitions = _this$props.transitions; // Rendering props underlying layer\n\n      var _this$props2 = this.props,\n          lineWidthScale = _this$props2.lineWidthScale,\n          lineWidthMinPixels = _this$props2.lineWidthMinPixels,\n          lineWidthMaxPixels = _this$props2.lineWidthMaxPixels,\n          lineJointRounded = _this$props2.lineJointRounded,\n          lineMiterLimit = _this$props2.lineMiterLimit,\n          pointRadiusScale = _this$props2.pointRadiusScale,\n          pointRadiusMinPixels = _this$props2.pointRadiusMinPixels,\n          pointRadiusMaxPixels = _this$props2.pointRadiusMaxPixels,\n          elevationScale = _this$props2.elevationScale,\n          lineDashJustified = _this$props2.lineDashJustified,\n          fp64 = _this$props2.fp64; // Accessor props for underlying layers\n\n      var _this$props3 = this.props,\n          getLineColor = _this$props3.getLineColor,\n          getFillColor = _this$props3.getFillColor,\n          getRadius = _this$props3.getRadius,\n          getLineWidth = _this$props3.getLineWidth,\n          getLineDashArray = _this$props3.getLineDashArray,\n          getElevation = _this$props3.getElevation,\n          updateTriggers = _this$props3.updateTriggers;\n      var PolygonFillLayer = this.getSubLayerClass('polygons-fill', _solidPolygonLayer.default);\n      var PolygonStrokeLayer = this.getSubLayerClass('polygons-stroke', _pathLayer.default);\n      var LineStringsLayer = this.getSubLayerClass('line-strings', _pathLayer.default);\n      var PointsLayer = this.getSubLayerClass('points', _scatterplotLayer.default); // Filled Polygon Layer\n\n      var polygonFillLayer = this.shouldRenderSubLayer('polygons-fill', polygonFeatures) && new PolygonFillLayer({\n        fp64: fp64,\n        extruded: extruded,\n        elevationScale: elevationScale,\n        filled: filled,\n        wireframe: wireframe,\n        lightSettings: lightSettings,\n        getElevation: unwrappingAccessor(getElevation),\n        getFillColor: unwrappingAccessor(getFillColor),\n        getLineColor: unwrappingAccessor(getLineColor),\n        transitions: transitions && {\n          getPolygon: transitions.geometry,\n          getElevation: transitions.getElevation,\n          getFillColor: transitions.getFillColor,\n          getLineColor: transitions.getLineColor\n        }\n      }, this.getSubLayerProps({\n        id: 'polygons-fill',\n        updateTriggers: {\n          getElevation: updateTriggers.getElevation,\n          getFillColor: updateTriggers.getFillColor,\n          getLineColor: updateTriggers.getLineColor\n        }\n      }), {\n        data: polygonFeatures,\n        getPolygon: getCoordinates\n      });\n      var polygonLineLayer = !extruded && stroked && this.shouldRenderSubLayer('polygons-stroke', polygonOutlineFeatures) && new PolygonStrokeLayer({\n        fp64: fp64,\n        widthScale: lineWidthScale,\n        widthMinPixels: lineWidthMinPixels,\n        widthMaxPixels: lineWidthMaxPixels,\n        rounded: lineJointRounded,\n        miterLimit: lineMiterLimit,\n        dashJustified: lineDashJustified,\n        getColor: unwrappingAccessor(getLineColor),\n        getWidth: unwrappingAccessor(getLineWidth),\n        getDashArray: unwrappingAccessor(getLineDashArray),\n        transitions: transitions && {\n          getPath: transitions.geometry,\n          getColor: transitions.getLineColor,\n          getWidth: transitions.getLineWidth\n        }\n      }, this.getSubLayerProps({\n        id: 'polygons-stroke',\n        updateTriggers: {\n          getColor: updateTriggers.getLineColor,\n          getWidth: updateTriggers.getLineWidth,\n          getDashArray: updateTriggers.getLineDashArray\n        }\n      }), {\n        data: polygonOutlineFeatures,\n        getPath: getCoordinates\n      });\n      var pathLayer = this.shouldRenderSubLayer('linestrings', lineFeatures) && new LineStringsLayer({\n        fp64: fp64,\n        widthScale: lineWidthScale,\n        widthMinPixels: lineWidthMinPixels,\n        widthMaxPixels: lineWidthMaxPixels,\n        rounded: lineJointRounded,\n        miterLimit: lineMiterLimit,\n        dashJustified: lineDashJustified,\n        getColor: unwrappingAccessor(getLineColor),\n        getWidth: unwrappingAccessor(getLineWidth),\n        getDashArray: unwrappingAccessor(getLineDashArray),\n        transitions: transitions && {\n          getPath: transitions.geometry,\n          getColor: transitions.getLineColor,\n          getWidth: transitions.getLineWidth\n        }\n      }, this.getSubLayerProps({\n        id: 'line-strings',\n        updateTriggers: {\n          getColor: updateTriggers.getLineColor,\n          getWidth: updateTriggers.getLineWidth,\n          getDashArray: updateTriggers.getLineDashArray\n        }\n      }), {\n        data: lineFeatures,\n        getPath: getCoordinates\n      });\n      var pointLayer = this.shouldRenderSubLayer('points', pointFeatures) && new PointsLayer({\n        fp64: fp64,\n        stroked: stroked,\n        filled: filled,\n        radiusScale: pointRadiusScale,\n        radiusMinPixels: pointRadiusMinPixels,\n        radiusMaxPixels: pointRadiusMaxPixels,\n        lineWidthScale: lineWidthScale,\n        lineWidthMinPixels: lineWidthMinPixels,\n        lineWidthMaxPixels: lineWidthMaxPixels,\n        getFillColor: unwrappingAccessor(getFillColor),\n        getLineColor: unwrappingAccessor(getLineColor),\n        getRadius: unwrappingAccessor(getRadius),\n        getLineWidth: unwrappingAccessor(getLineWidth),\n        transitions: transitions && {\n          getPosition: transitions.geometry,\n          getFillColor: transitions.getFillColor,\n          getLineColor: transitions.getLineColor,\n          getRadius: transitions.getRadius,\n          getLineWidth: transitions.getLineWidth\n        }\n      }, this.getSubLayerProps({\n        id: 'points',\n        updateTriggers: {\n          getFillColor: updateTriggers.getFillColor,\n          getLineColor: updateTriggers.getLineColor,\n          getRadius: updateTriggers.getRadius,\n          getLineWidth: updateTriggers.getLineWidth\n        }\n      }), {\n        data: pointFeatures,\n        getPosition: getCoordinates\n      });\n      return [// If not extruded: flat fill layer is drawn below outlines\n      !extruded && polygonFillLayer, polygonLineLayer, pathLayer, pointLayer, // If extruded: draw fill layer last for correct blending behavior\n      extruded && polygonFillLayer];\n    }\n    /* eslint-enable complexity */\n\n  }]);\n\n  return GeoJsonLayer;\n}(_core.CompositeLayer);\n\nexports.default = GeoJsonLayer;\nGeoJsonLayer.layerName = 'GeoJsonLayer';\nGeoJsonLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"../scatterplot-layer/scatterplot-layer\":\"mZQa\",\"../path-layer/path-layer\":\"n0i7\",\"../solid-polygon-layer/solid-polygon-layer\":\"w2SP\",\"./geojson\":\"W9Uo\"}],\"Rdzl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME multi-icon-layer-vertex-shader\\n\\nattribute vec2 positions;\\n\\nattribute vec3 instancePositions;\\nattribute vec2 instancePositions64xyLow;\\nattribute float instanceSizes;\\nattribute float instanceAngles;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute vec4 instanceIconFrames;\\nattribute float instanceColorModes;\\nattribute vec2 instanceOffsets;\\n\\n// the following three attributes are for the multi-icon layer\\nattribute vec2 instancePixelOffset;\\n\\nuniform float sizeScale;\\nuniform vec2 iconsTextureDim;\\nuniform float gamma;\\nuniform float opacity;\\n\\nvarying float vColorMode;\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\nvarying float vGamma;\\n\\nvec2 rotate_by_angle(vec2 vertex, float angle) {\\n  float angle_radian = angle * PI / 180.0;\\n  float cos_angle = cos(angle_radian);\\n  float sin_angle = sin(angle_radian);\\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\\n  return rotationMatrix * vertex;\\n}\\n\\nvoid main(void) {\\n  vec2 iconSize = instanceIconFrames.zw;\\n  // scale icon height to match instanceSize\\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : instanceSizes / iconSize.y;\\n\\n  // scale and rotate vertex in \\\"pixel\\\" value and convert back to fraction in clipspace\\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\\n\\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * sizeScale * instanceScale;\\n  pixelOffset += instancePixelOffset;\\n  pixelOffset.y *= -1.0;\\n\\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.0));\\n  gl_Position += project_pixel_to_clipspace(pixelOffset);\\n\\n  vTextureCoords = mix(\\n    instanceIconFrames.xy,\\n    instanceIconFrames.xy + iconSize,\\n    (positions.xy + 1.0) / 2.0\\n  ) / iconsTextureDim;\\n\\n  vTextureCoords.y = 1.0 - vTextureCoords.y;\\n\\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\\n  picking_setPickingColor(instancePickingColors);\\n\\n  vGamma = gamma / (sizeScale * iconSize.y);\\n}\\n\";\nexports.default = _default;\n},{}],\"Byh8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = \"#define SHADER_NAME multi-icon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform sampler2D iconsTexture;\\nuniform float buffer;\\nuniform bool sdf;\\n\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\nvarying float vGamma;\\n\\nconst float MIN_ALPHA = 0.05;\\n\\nvoid main(void) {\\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\\n  \\n  float alpha = texColor.a;\\n  // if enable sdf (signed distance fields)\\n  if (sdf) {\\n    float distance = texture2D(iconsTexture, vTextureCoords).a;\\n    alpha = smoothstep(buffer - vGamma, buffer + vGamma, distance);\\n  }\\n\\n  // Take the global opacity and the alpha from vColor into account for the alpha component\\n  float a = alpha * vColor.a;\\n\\n  if (a < MIN_ALPHA) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vec4(vColor.rgb, a);\\n\\n  // use highlight color if this fragment belongs to the selected object.\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n\\n  // use picking color if rendering to picking FBO.\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n}\\n\";\nexports.default = _default;\n},{}],\"OSwK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _iconLayer = _interopRequireDefault(require(\"../../icon-layer/icon-layer\"));\n\nvar _multiIconLayerVertex = _interopRequireDefault(require(\"./multi-icon-layer-vertex.glsl\"));\n\nvar _multiIconLayerFragment = _interopRequireDefault(require(\"./multi-icon-layer-fragment.glsl\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n// TODO expose as layer properties\nvar DEFAULT_GAMMA = 0.2;\nvar DEFAULT_BUFFER = 192.0 / 256;\nvar defaultProps = {\n  getShiftInQueue: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.shift || 0;\n    }\n  },\n  getLengthOfQueue: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.len || 1;\n    }\n  },\n  // 1: left, 0: middle, -1: right\n  getAnchorX: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.anchorX || 0;\n    }\n  },\n  // 1: top, 0: center, -1: bottom\n  getAnchorY: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.anchorY || 0;\n    }\n  },\n  getPixelOffset: {\n    type: 'accessor',\n    value: [0, 0]\n  },\n  // object with the same pickingIndex will be picked when any one of them is being picked\n  getPickingIndex: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.objectIndex;\n    }\n  }\n};\n\nvar MultiIconLayer =\n/*#__PURE__*/\nfunction (_IconLayer) {\n  _inherits(MultiIconLayer, _IconLayer);\n\n  function MultiIconLayer() {\n    _classCallCheck(this, MultiIconLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(MultiIconLayer).apply(this, arguments));\n  }\n\n  _createClass(MultiIconLayer, [{\n    key: \"getShaders\",\n    value: function getShaders() {\n      return Object.assign({}, _get(_getPrototypeOf(MultiIconLayer.prototype), \"getShaders\", this).call(this), {\n        vs: _multiIconLayerVertex.default,\n        fs: _multiIconLayerFragment.default\n      });\n    }\n  }, {\n    key: \"initializeState\",\n    value: function initializeState() {\n      _get(_getPrototypeOf(MultiIconLayer.prototype), \"initializeState\", this).call(this);\n\n      var attributeManager = this.getAttributeManager();\n      attributeManager.addInstanced({\n        instancePixelOffset: {\n          size: 2,\n          transition: true,\n          accessor: 'getPixelOffset'\n        }\n      });\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(updateParams) {\n      _get(_getPrototypeOf(MultiIconLayer.prototype), \"updateState\", this).call(this, updateParams);\n\n      var changeFlags = updateParams.changeFlags;\n\n      if (changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.getAnchorX || changeFlags.updateTriggersChanged.getAnchorY)) {\n        this.getAttributeManager().invalidate('instanceOffsets');\n      }\n    }\n  }, {\n    key: \"draw\",\n    value: function draw(_ref) {\n      var uniforms = _ref.uniforms;\n      var sdf = this.props.sdf;\n\n      _get(_getPrototypeOf(MultiIconLayer.prototype), \"draw\", this).call(this, {\n        uniforms: Object.assign({}, uniforms, {\n          // Refer the following doc about gamma and buffer\n          // https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817\n          buffer: DEFAULT_BUFFER,\n          gamma: DEFAULT_GAMMA,\n          sdf: Boolean(sdf)\n        })\n      });\n    }\n  }, {\n    key: \"calculateInstanceOffsets\",\n    value: function calculateInstanceOffsets(attribute) {\n      var _this$props = this.props,\n          data = _this$props.data,\n          iconMapping = _this$props.iconMapping,\n          getIcon = _this$props.getIcon,\n          getAnchorX = _this$props.getAnchorX,\n          getAnchorY = _this$props.getAnchorY,\n          getLengthOfQueue = _this$props.getLengthOfQueue,\n          getShiftInQueue = _this$props.getShiftInQueue;\n      var value = attribute.value;\n      var i = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var object = _step.value;\n          var icon = getIcon(object);\n          var rect = iconMapping[icon] || {};\n          var len = getLengthOfQueue(object);\n          var shiftX = getShiftInQueue(object);\n          value[i++] = (getAnchorX(object) - 1) * len / 2 + rect.width / 2 + shiftX || 0;\n          value[i++] = rect.height / 2 * getAnchorY(object) || 0;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n    }\n  }, {\n    key: \"calculateInstancePickingColors\",\n    value: function calculateInstancePickingColors(attribute) {\n      var _this$props2 = this.props,\n          data = _this$props2.data,\n          getPickingIndex = _this$props2.getPickingIndex;\n      var value = attribute.value;\n      var i = 0;\n      var pickingColor = [];\n      var _iteratorNormalCompletion2 = true;\n      var _didIteratorError2 = false;\n      var _iteratorError2 = undefined;\n\n      try {\n        for (var _iterator2 = data[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n          var point = _step2.value;\n          var index = getPickingIndex(point);\n          this.encodePickingColor(index, pickingColor);\n          value[i++] = pickingColor[0];\n          value[i++] = pickingColor[1];\n          value[i++] = pickingColor[2];\n        }\n      } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n            _iterator2.return();\n          }\n        } finally {\n          if (_didIteratorError2) {\n            throw _iteratorError2;\n          }\n        }\n      }\n    }\n  }]);\n\n  return MultiIconLayer;\n}(_iconLayer.default);\n\nexports.default = MultiIconLayer;\nMultiIconLayer.layerName = 'MultiIconLayer';\nMultiIconLayer.defaultProps = defaultProps;\n},{\"../../icon-layer/icon-layer\":\"BUSa\",\"./multi-icon-layer-vertex.glsl\":\"Rdzl\",\"./multi-icon-layer-fragment.glsl\":\"Byh8\"}],\"TWhu\":[function(require,module,exports) {\n'use strict';\n\nmodule.exports = TinySDF;\nmodule.exports.default = TinySDF;\n\nvar INF = 1e20;\n\nfunction TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) {\n    this.fontSize = fontSize || 24;\n    this.buffer = buffer === undefined ? 3 : buffer;\n    this.cutoff = cutoff || 0.25;\n    this.fontFamily = fontFamily || 'sans-serif';\n    this.fontWeight = fontWeight || 'normal';\n    this.radius = radius || 8;\n    var size = this.size = this.fontSize + this.buffer * 2;\n\n    this.canvas = document.createElement('canvas');\n    this.canvas.width = this.canvas.height = size;\n\n    this.ctx = this.canvas.getContext('2d');\n    this.ctx.font = this.fontWeight + ' ' + this.fontSize + 'px ' + this.fontFamily;\n    this.ctx.textBaseline = 'middle';\n    this.ctx.fillStyle = 'black';\n\n    // temporary arrays for the distance transform\n    this.gridOuter = new Float64Array(size * size);\n    this.gridInner = new Float64Array(size * size);\n    this.f = new Float64Array(size);\n    this.d = new Float64Array(size);\n    this.z = new Float64Array(size + 1);\n    this.v = new Int16Array(size);\n\n    // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852\n    this.middle = Math.round((size / 2) * (navigator.userAgent.indexOf('Gecko/') >= 0 ? 1.2 : 1));\n}\n\nTinySDF.prototype.draw = function (char) {\n    this.ctx.clearRect(0, 0, this.size, this.size);\n    this.ctx.fillText(char, this.buffer, this.middle);\n\n    var imgData = this.ctx.getImageData(0, 0, this.size, this.size);\n    var alphaChannel = new Uint8ClampedArray(this.size * this.size);\n\n    for (var i = 0; i < this.size * this.size; i++) {\n        var a = imgData.data[i * 4 + 3] / 255; // alpha value\n        this.gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.pow(Math.max(0, 0.5 - a), 2);\n        this.gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.pow(Math.max(0, a - 0.5), 2);\n    }\n\n    edt(this.gridOuter, this.size, this.size, this.f, this.d, this.v, this.z);\n    edt(this.gridInner, this.size, this.size, this.f, this.d, this.v, this.z);\n\n    for (i = 0; i < this.size * this.size; i++) {\n        var d = this.gridOuter[i] - this.gridInner[i];\n        alphaChannel[i] = Math.max(0, Math.min(255, Math.round(255 - 255 * (d / this.radius + this.cutoff))));\n    }\n\n    return alphaChannel;\n};\n\n// 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\nfunction edt(data, width, height, f, d, v, z) {\n    for (var x = 0; x < width; x++) {\n        for (var y = 0; y < height; y++) {\n            f[y] = data[y * width + x];\n        }\n        edt1d(f, d, v, z, height);\n        for (y = 0; y < height; y++) {\n            data[y * width + x] = d[y];\n        }\n    }\n    for (y = 0; y < height; y++) {\n        for (x = 0; x < width; x++) {\n            f[x] = data[y * width + x];\n        }\n        edt1d(f, d, v, z, width);\n        for (x = 0; x < width; x++) {\n            data[y * width + x] = Math.sqrt(d[x]);\n        }\n    }\n}\n\n// 1D squared distance transform\nfunction edt1d(f, d, v, z, n) {\n    v[0] = 0;\n    z[0] = -INF;\n    z[1] = +INF;\n\n    for (var q = 1, k = 0; q < n; q++) {\n        var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n        while (s <= z[k]) {\n            k--;\n            s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n        }\n        k++;\n        v[k] = q;\n        z[k] = s;\n        z[k + 1] = +INF;\n    }\n\n    for (q = 0, k = 0; q < n; q++) {\n        while (z[k + 1] < q) k++;\n        d[q] = (q - v[k]) * (q - v[k]) + f[v[k]];\n    }\n}\n\n},{}],\"ZJEU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.makeFontAtlas = makeFontAtlas;\nexports.DEFAULT_FONT_SETTINGS = exports.DEFAULT_FONT_WEIGHT = exports.DEFAULT_FONT_FAMILY = exports.DEFAULT_CHAR_SET = void 0;\n\nvar _luma = require(\"luma.gl\");\n\nvar _tinySdf = _interopRequireDefault(require(\"@mapbox/tiny-sdf\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n/* global document */\n\n\nvar GL_TEXTURE_WRAP_S = 0x2802;\nvar GL_TEXTURE_WRAP_T = 0x2803;\nvar GL_CLAMP_TO_EDGE = 0x812f;\nvar MAX_CANVAS_WIDTH = 1024;\nvar BASELINE_SCALE = 0.9;\nvar HEIGHT_SCALE = 1.2;\n\nfunction getDefaultCharacterSet() {\n  var charSet = [];\n\n  for (var i = 32; i < 128; i++) {\n    charSet.push(String.fromCharCode(i));\n  }\n\n  return charSet;\n}\n\nvar DEFAULT_CHAR_SET = getDefaultCharacterSet();\nexports.DEFAULT_CHAR_SET = DEFAULT_CHAR_SET;\nvar DEFAULT_FONT_FAMILY = 'Monaco, monospace';\nexports.DEFAULT_FONT_FAMILY = DEFAULT_FONT_FAMILY;\nvar DEFAULT_FONT_WEIGHT = 'normal';\nexports.DEFAULT_FONT_WEIGHT = DEFAULT_FONT_WEIGHT;\nvar DEFAULT_FONT_SETTINGS = {\n  fontSize: 64,\n  buffer: 2,\n  sdf: false,\n  cutoff: 0.25,\n  radius: 3\n};\nexports.DEFAULT_FONT_SETTINGS = DEFAULT_FONT_SETTINGS;\n\nfunction populateAlphaChannel(alphaChannel, imageData) {\n  // populate distance value from tinySDF to image alpha channel\n  for (var i = 0; i < alphaChannel.length; i++) {\n    imageData.data[4 * i + 3] = alphaChannel[i];\n  }\n}\n\nfunction setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n  ctx.font = \"\".concat(fontWeight, \" \").concat(fontSize, \"px \").concat(fontFamily);\n  ctx.fillStyle = '#000';\n  ctx.textBaseline = 'baseline';\n  ctx.textAlign = 'left';\n}\n\nfunction buildMapping(_ref) {\n  var ctx = _ref.ctx,\n      fontHeight = _ref.fontHeight,\n      buffer = _ref.buffer,\n      characterSet = _ref.characterSet,\n      maxCanvasWidth = _ref.maxCanvasWidth;\n  var mapping = {};\n  var row = 0;\n  var x = 0;\n  Array.from(characterSet).forEach(function (char) {\n    // measure texts\n    // TODO - use Advanced text metrics when they are adopted:\n    // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n    var _ctx$measureText = ctx.measureText(char),\n        width = _ctx$measureText.width;\n\n    if (x + width + buffer * 2 > maxCanvasWidth) {\n      x = 0;\n      row++;\n    }\n\n    mapping[char] = {\n      x: x + buffer,\n      y: row * (fontHeight + buffer * 2) + buffer,\n      width: width,\n      height: fontHeight,\n      mask: true\n    };\n    x += width + buffer * 2;\n  });\n  var canvasHeight = (row + 1) * (fontHeight + buffer * 2);\n  return {\n    mapping: mapping,\n    canvasHeight: canvasHeight\n  };\n}\n\nfunction makeFontAtlas(gl, fontSettings) {\n  var _parameters;\n\n  var mergedFontSettings = Object.assign({\n    fontFamily: DEFAULT_FONT_FAMILY,\n    fontWeight: DEFAULT_FONT_WEIGHT,\n    characterSet: DEFAULT_CHAR_SET\n  }, DEFAULT_FONT_SETTINGS, fontSettings);\n  var fontFamily = mergedFontSettings.fontFamily,\n      fontWeight = mergedFontSettings.fontWeight,\n      characterSet = mergedFontSettings.characterSet,\n      fontSize = mergedFontSettings.fontSize,\n      buffer = mergedFontSettings.buffer,\n      sdf = mergedFontSettings.sdf,\n      radius = mergedFontSettings.radius,\n      cutoff = mergedFontSettings.cutoff;\n  var canvas = document.createElement('canvas');\n  var ctx = canvas.getContext('2d'); // build mapping\n\n  setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n  var fontHeight = fontSize * HEIGHT_SCALE;\n\n  var _buildMapping = buildMapping({\n    ctx: ctx,\n    fontHeight: fontHeight,\n    buffer: buffer,\n    characterSet: characterSet,\n    maxCanvasWidth: MAX_CANVAS_WIDTH\n  }),\n      canvasHeight = _buildMapping.canvasHeight,\n      mapping = _buildMapping.mapping;\n\n  canvas.width = MAX_CANVAS_WIDTH;\n  canvas.height = canvasHeight;\n  setTextStyle(ctx, fontFamily, fontSize, fontWeight); // layout characters\n\n  if (sdf) {\n    var tinySDF = new _tinySdf.default(fontSize, buffer, radius, cutoff, fontFamily, fontWeight); // used to store distance values from tinySDF\n\n    var imageData = ctx.createImageData(tinySDF.size, tinySDF.size);\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n\n    try {\n      for (var _iterator = characterSet[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n        var char = _step.value;\n        populateAlphaChannel(tinySDF.draw(char), imageData);\n        ctx.putImageData(imageData, mapping[char].x - buffer, mapping[char].y - buffer);\n      }\n    } catch (err) {\n      _didIteratorError = true;\n      _iteratorError = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion && _iterator.return != null) {\n          _iterator.return();\n        }\n      } finally {\n        if (_didIteratorError) {\n          throw _iteratorError;\n        }\n      }\n    }\n  } else {\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n\n    try {\n      for (var _iterator2 = characterSet[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n        var _char = _step2.value;\n        ctx.fillText(_char, mapping[_char].x, mapping[_char].y + fontSize * BASELINE_SCALE);\n      }\n    } catch (err) {\n      _didIteratorError2 = true;\n      _iteratorError2 = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n          _iterator2.return();\n        }\n      } finally {\n        if (_didIteratorError2) {\n          throw _iteratorError2;\n        }\n      }\n    }\n  }\n\n  return {\n    scale: HEIGHT_SCALE,\n    mapping: mapping,\n    texture: new _luma.Texture2D(gl, {\n      pixels: canvas,\n      // padding is added only between the characters but not for borders\n      // enforce CLAMP_TO_EDGE to avoid any artifacts.\n      parameters: (_parameters = {}, _defineProperty(_parameters, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE), _defineProperty(_parameters, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE), _parameters)\n    })\n  };\n}\n},{\"luma.gl\":\"iiNl\",\"@mapbox/tiny-sdf\":\"TWhu\"}],\"DEOk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _multiIconLayer = _interopRequireDefault(require(\"./multi-icon-layer/multi-icon-layer\"));\n\nvar _fontAtlas = require(\"./font-atlas\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar TEXT_ANCHOR = {\n  start: 1,\n  middle: 0,\n  end: -1\n};\nvar ALIGNMENT_BASELINE = {\n  top: 1,\n  center: 0,\n  bottom: -1\n};\nvar DEFAULT_COLOR = [0, 0, 0, 255];\nvar MISSING_CHAR_WIDTH = 32;\nvar FONT_SETTINGS_PROPS = ['fontSize', 'buffer', 'sdf', 'radius', 'cutoff'];\nvar defaultProps = {\n  fp64: false,\n  sizeScale: 1,\n  characterSet: _fontAtlas.DEFAULT_CHAR_SET,\n  fontFamily: _fontAtlas.DEFAULT_FONT_FAMILY,\n  fontWeight: _fontAtlas.DEFAULT_FONT_WEIGHT,\n  fontSettings: {},\n  getText: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.text;\n    }\n  },\n  getPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.position;\n    }\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getSize: {\n    type: 'accessor',\n    value: 32\n  },\n  getAngle: {\n    type: 'accessor',\n    value: 0\n  },\n  getTextAnchor: {\n    type: 'accessor',\n    value: 'middle'\n  },\n  getAlignmentBaseline: {\n    type: 'accessor',\n    value: 'center'\n  },\n  getPixelOffset: {\n    type: 'accessor',\n    value: [0, 0]\n  }\n};\n\nvar TextLayer =\n/*#__PURE__*/\nfunction (_CompositeLayer) {\n  _inherits(TextLayer, _CompositeLayer);\n\n  function TextLayer() {\n    _classCallCheck(this, TextLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(TextLayer).apply(this, arguments));\n  }\n\n  _createClass(TextLayer, [{\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var props = _ref.props,\n          oldProps = _ref.oldProps,\n          changeFlags = _ref.changeFlags;\n      var fontChanged = this.fontChanged(oldProps, props);\n\n      if (fontChanged) {\n        this.updateFontAtlas();\n      }\n\n      if (changeFlags.dataChanged || fontChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText)) {\n        this.transformStringToLetters();\n      }\n    }\n  }, {\n    key: \"updateFontAtlas\",\n    value: function updateFontAtlas() {\n      var gl = this.context.gl;\n      var _this$props = this.props,\n          fontSettings = _this$props.fontSettings,\n          fontFamily = _this$props.fontFamily,\n          fontWeight = _this$props.fontWeight,\n          characterSet = _this$props.characterSet;\n      var mergedFontSettings = Object.assign({}, _fontAtlas.DEFAULT_FONT_SETTINGS, fontSettings, {\n        fontFamily: fontFamily,\n        fontWeight: fontWeight,\n        characterSet: characterSet\n      });\n\n      var _makeFontAtlas = (0, _fontAtlas.makeFontAtlas)(gl, mergedFontSettings),\n          scale = _makeFontAtlas.scale,\n          mapping = _makeFontAtlas.mapping,\n          texture = _makeFontAtlas.texture;\n\n      this.setState({\n        scale: scale,\n        iconAtlas: texture,\n        iconMapping: mapping\n      });\n    }\n  }, {\n    key: \"fontChanged\",\n    value: function fontChanged(oldProps, props) {\n      if (oldProps.fontFamily !== props.fontFamily || oldProps.characterSet !== props.characterSet || oldProps.fontWeight !== props.fontWeight) {\n        return true;\n      }\n\n      if (oldProps.fontSettings === props.fontSettings) {\n        return false;\n      }\n\n      var oldFontSettings = oldProps.fontSettings || {};\n      var fontSettings = props.fontSettings || {};\n      return FONT_SETTINGS_PROPS.some(function (prop) {\n        return oldFontSettings[prop] !== fontSettings[prop];\n      });\n    }\n  }, {\n    key: \"getPickingInfo\",\n    value: function getPickingInfo(_ref2) {\n      var info = _ref2.info; // because `TextLayer` assign the same pickingInfoIndex for one text label,\n      // here info.index refers the index of text label in props.data\n\n      return Object.assign(info, {\n        // override object with original data\n        object: info.index >= 0 ? this.props.data[info.index] : null\n      });\n    }\n    /* eslint-disable no-loop-func */\n\n  }, {\n    key: \"transformStringToLetters\",\n    value: function transformStringToLetters() {\n      var _this$props2 = this.props,\n          data = _this$props2.data,\n          getText = _this$props2.getText;\n      var iconMapping = this.state.iconMapping;\n      var transformedData = [];\n      var objectIndex = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        var _loop = function _loop() {\n          var val = _step.value;\n          var text = getText(val);\n\n          if (text) {\n            var letters = Array.from(text);\n            var offsets = [0];\n            var offsetLeft = 0;\n            letters.forEach(function (letter, i) {\n              var datum = {\n                text: letter,\n                index: i,\n                offsets: offsets,\n                len: text.length,\n                // reference of original object and object index\n                object: val,\n                objectIndex: objectIndex\n              };\n              var frame = iconMapping[letter];\n\n              if (frame) {\n                offsetLeft += frame.width;\n              } else {\n                _core.log.warn(\"Missing character: \".concat(letter))();\n\n                offsetLeft += MISSING_CHAR_WIDTH;\n              }\n\n              offsets.push(offsetLeft);\n              transformedData.push(datum);\n            });\n          }\n\n          objectIndex++;\n        };\n\n        for (var _iterator = data[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          _loop();\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return != null) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      this.setState({\n        data: transformedData\n      });\n    }\n    /* eslint-enable no-loop-func */\n\n  }, {\n    key: \"getLetterOffset\",\n    value: function getLetterOffset(datum) {\n      return datum.offsets[datum.index];\n    }\n  }, {\n    key: \"getTextLength\",\n    value: function getTextLength(datum) {\n      return datum.offsets[datum.offsets.length - 1];\n    }\n  }, {\n    key: \"_getAccessor\",\n    value: function _getAccessor(accessor) {\n      if (typeof accessor === 'function') {\n        return function (x) {\n          return accessor(x.object);\n        };\n      }\n\n      return accessor;\n    }\n  }, {\n    key: \"getAnchorXFromTextAnchor\",\n    value: function getAnchorXFromTextAnchor(getTextAnchor) {\n      return function (x) {\n        var textAnchor = typeof getTextAnchor === 'function' ? getTextAnchor(x.object) : getTextAnchor;\n\n        if (!TEXT_ANCHOR.hasOwnProperty(textAnchor)) {\n          throw new Error(\"Invalid text anchor parameter: \".concat(textAnchor));\n        }\n\n        return TEXT_ANCHOR[textAnchor];\n      };\n    }\n  }, {\n    key: \"getAnchorYFromAlignmentBaseline\",\n    value: function getAnchorYFromAlignmentBaseline(getAlignmentBaseline) {\n      return function (x) {\n        var alignmentBaseline = typeof getAlignmentBaseline === 'function' ? getAlignmentBaseline(x.object) : getAlignmentBaseline;\n\n        if (!ALIGNMENT_BASELINE.hasOwnProperty(alignmentBaseline)) {\n          throw new Error(\"Invalid alignment baseline parameter: \".concat(alignmentBaseline));\n        }\n\n        return ALIGNMENT_BASELINE[alignmentBaseline];\n      };\n    }\n  }, {\n    key: \"renderLayers\",\n    value: function renderLayers() {\n      var _this = this;\n\n      var _this$state = this.state,\n          data = _this$state.data,\n          scale = _this$state.scale,\n          iconAtlas = _this$state.iconAtlas,\n          iconMapping = _this$state.iconMapping;\n      var _this$props3 = this.props,\n          _getPosition = _this$props3.getPosition,\n          getColor = _this$props3.getColor,\n          getSize = _this$props3.getSize,\n          getAngle = _this$props3.getAngle,\n          getTextAnchor = _this$props3.getTextAnchor,\n          getAlignmentBaseline = _this$props3.getAlignmentBaseline,\n          getPixelOffset = _this$props3.getPixelOffset,\n          fp64 = _this$props3.fp64,\n          sdf = _this$props3.sdf,\n          sizeScale = _this$props3.sizeScale,\n          transitions = _this$props3.transitions,\n          updateTriggers = _this$props3.updateTriggers;\n      var SubLayerClass = this.getSubLayerClass('characters', _multiIconLayer.default);\n      return new SubLayerClass({\n        sdf: sdf,\n        iconAtlas: iconAtlas,\n        iconMapping: iconMapping,\n        getPosition: function getPosition(d) {\n          return _getPosition(d.object);\n        },\n        getColor: this._getAccessor(getColor),\n        getSize: this._getAccessor(getSize),\n        getAngle: this._getAccessor(getAngle),\n        getAnchorX: this.getAnchorXFromTextAnchor(getTextAnchor),\n        getAnchorY: this.getAnchorYFromAlignmentBaseline(getAlignmentBaseline),\n        getPixelOffset: this._getAccessor(getPixelOffset),\n        fp64: fp64,\n        sizeScale: sizeScale * scale,\n        transitions: transitions && {\n          getPosition: transitions.getPosition,\n          getAngle: transitions.getAngle,\n          getColor: transitions.getColor,\n          getSize: transitions.getSize,\n          getPixelOffset: updateTriggers.getPixelOffset\n        }\n      }, this.getSubLayerProps({\n        id: 'characters',\n        updateTriggers: {\n          getPosition: updateTriggers.getPosition,\n          getAngle: updateTriggers.getAngle,\n          getColor: updateTriggers.getColor,\n          getSize: updateTriggers.getSize,\n          getPixelOffset: updateTriggers.getPixelOffset,\n          getAnchorX: updateTriggers.getTextAnchor,\n          getAnchorY: updateTriggers.getAlignmentBaseline\n        }\n      }), {\n        data: data,\n        getIcon: function getIcon(d) {\n          return d.text;\n        },\n        getShiftInQueue: function getShiftInQueue(d) {\n          return _this.getLetterOffset(d);\n        },\n        getLengthOfQueue: function getLengthOfQueue(d) {\n          return _this.getTextLength(d);\n        }\n      });\n    }\n  }]);\n\n  return TextLayer;\n}(_core.CompositeLayer);\n\nexports.default = TextLayer;\nTextLayer.layerName = 'TextLayer';\nTextLayer.defaultProps = defaultProps;\n},{\"@deck.gl/core\":\"P3tH\",\"./multi-icon-layer/multi-icon-layer\":\"OSwK\",\"./font-atlas\":\"ZJEU\"}],\"jzh9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ISOBANDS_CODE_OFFSET_MAP = exports.ISOLINES_CODE_OFFSET_MAP = void 0;\n\nvar _ISOBANDS_CODE_OFFSET;\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n} // Code to Offsets Map needed to implement Marching Squres algorithm\n// Ref: https://en.wikipedia.org/wiki/Marching_squares\n// Table to map code to the intersection offsets\n// All offsets are relative to the center of marching cell (which is top right corner of grid-cell, and center of marching-square)\n\n\nvar HALF = 0.5;\nvar ONE6TH = 1 / 6;\nvar OFFSET = {\n  N: [0, HALF],\n  // NORTH\n  E: [HALF, 0],\n  // EAST\n  S: [0, -HALF],\n  // SOUTH\n  W: [-HALF, 0],\n  // WEST\n  // CORNERS\n  NE: [HALF, HALF],\n  NW: [-HALF, HALF],\n  SE: [HALF, -HALF],\n  SW: [-HALF, -HALF]\n}; // NOTE: vertices are ordered in CCW direction, starting from NW corner\n// Triangles\n\nvar SW_TRIANGLE = [OFFSET.W, OFFSET.SW, OFFSET.S];\nvar SE_TRIANGLE = [OFFSET.S, OFFSET.SE, OFFSET.E];\nvar NE_TRIANGLE = [OFFSET.E, OFFSET.NE, OFFSET.N];\nvar NW_TRIANGLE = [OFFSET.NW, OFFSET.W, OFFSET.N]; // Trapezoids\n\nvar SW_TRAPEZOID = [[-HALF, ONE6TH], [-HALF, -ONE6TH], [-ONE6TH, -HALF], [ONE6TH, -HALF]];\nvar SE_TRAPEZOID = [[-ONE6TH, -HALF], [ONE6TH, -HALF], [HALF, -ONE6TH], [HALF, ONE6TH]];\nvar NE_TRAPEZOID = [[HALF, -ONE6TH], [HALF, ONE6TH], [ONE6TH, HALF], [-ONE6TH, HALF]];\nvar NW_TRAPEZOID = [[-HALF, ONE6TH], [-HALF, -ONE6TH], [ONE6TH, HALF], [-ONE6TH, HALF]]; // Rectangles\n\nvar S_RECTANGLE = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.E];\nvar E_RECTANGLE = [OFFSET.S, OFFSET.SE, OFFSET.NE, OFFSET.N];\nvar N_RECTANGLE = [OFFSET.NW, OFFSET.W, OFFSET.E, OFFSET.NE];\nvar W_RECTANGLE = [OFFSET.NW, OFFSET.SW, OFFSET.S, OFFSET.N];\nvar EW_RECTANGEL = [[-HALF, ONE6TH], [-HALF, -ONE6TH], [HALF, -ONE6TH], [HALF, ONE6TH]];\nvar SN_RECTANGEL = [[-ONE6TH, -HALF], [ONE6TH, -HALF], [ONE6TH, HALF], [-ONE6TH, HALF]]; // Square\n\nvar SQUARE = [OFFSET.NW, OFFSET.SW, OFFSET.SE, OFFSET.NE]; // Pentagons\n\nvar SW_PENTAGON = [OFFSET.NW, OFFSET.SW, OFFSET.SE, OFFSET.E, OFFSET.N];\nvar SE_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.NE, OFFSET.N];\nvar NE_PENTAGON = [OFFSET.NW, OFFSET.W, OFFSET.S, OFFSET.SE, OFFSET.NE];\nvar NW_PENTAGON = [OFFSET.NW, OFFSET.SW, OFFSET.S, OFFSET.E, OFFSET.NE];\nvar NW_N_PENTAGON = [OFFSET.NW, OFFSET.W, [HALF, -ONE6TH], [HALF, ONE6TH], OFFSET.N];\nvar NE_E_PENTAGON = [[-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.E, OFFSET.NE, OFFSET.N];\nvar SE_S_PENTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.S, OFFSET.SE, OFFSET.E];\nvar SW_W_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, [ONE6TH, HALF], [-ONE6TH, HALF]];\nvar NW_W_PENTAGON = [OFFSET.NW, OFFSET.W, [-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.N];\nvar NE_N_PENTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.E, OFFSET.NE, OFFSET.N];\nvar SE_E_PENTAGON = [OFFSET.S, OFFSET.SE, OFFSET.E, [ONE6TH, HALF], [-ONE6TH, HALF]];\nvar SW_S_PENTAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, [HALF, -ONE6TH], [HALF, ONE6TH]]; // Hexagon\n\nvar S_HEXAGON = [OFFSET.W, OFFSET.SW, OFFSET.SE, OFFSET.E, [ONE6TH, HALF], [-ONE6TH, HALF]];\nvar E_HEXAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.S, OFFSET.SE, OFFSET.NE, OFFSET.N];\nvar N_HEXAGON = [OFFSET.NW, OFFSET.W, [-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.E, OFFSET.NE];\nvar W_HEXAGON = [OFFSET.NW, OFFSET.SW, OFFSET.S, [HALF, -ONE6TH], [HALF, ONE6TH], OFFSET.N];\nvar SW_NE_HEXAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, OFFSET.E, OFFSET.NE, OFFSET.N];\nvar NW_SE_HEXAGON = [OFFSET.NW, OFFSET.W, OFFSET.S, OFFSET.SE, OFFSET.E, OFFSET.N]; // Heptagon (7-sided)\n\nvar NE_HEPTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], [-ONE6TH, -HALF], [ONE6TH, -HALF], OFFSET.E, OFFSET.NE, OFFSET.N];\nvar SW_HEPTAGON = [OFFSET.W, OFFSET.SW, OFFSET.S, [HALF, -ONE6TH], [HALF, ONE6TH], [ONE6TH, HALF], [-ONE6TH, HALF]];\nvar NW_HEPTAGON = [OFFSET.NW, OFFSET.W, [-ONE6TH, -HALF], [ONE6TH, -HALF], [HALF, -ONE6TH], [HALF, ONE6TH], OFFSET.N];\nvar SE_HEPTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], OFFSET.S, OFFSET.SE, OFFSET.E, [ONE6TH, HALF], [-ONE6TH, HALF]]; // Octagon\n\nvar OCTAGON = [[-HALF, ONE6TH], [-HALF, -ONE6TH], [-ONE6TH, -HALF], [ONE6TH, -HALF], [HALF, -ONE6TH], [HALF, ONE6TH], [ONE6TH, HALF], [-ONE6TH, HALF]]; // Note: above wiki page invertes white/black dots for generating the code, we don't\n\nvar ISOLINES_CODE_OFFSET_MAP = {\n  // key is equal to the code of 4 vertices (invert the code specified in wiki)\n  // value can be an array or an Object\n  // Array : [line] or [line, line], where each line is [start-point, end-point], and each point is [x, y]\n  // Object : to handle saddle cases, whos output depends on mean value of all 4 corners\n  //  key: code of mean value (0 or 1)\n  //  value: Array , as above defines one or two line segments\n  0: [],\n  1: [[OFFSET.W, OFFSET.S]],\n  2: [[OFFSET.S, OFFSET.E]],\n  3: [[OFFSET.W, OFFSET.E]],\n  4: [[OFFSET.N, OFFSET.E]],\n  5: {\n    0: [[OFFSET.W, OFFSET.S], [OFFSET.N, OFFSET.E]],\n    1: [[OFFSET.W, OFFSET.N], [OFFSET.S, OFFSET.E]]\n  },\n  6: [[OFFSET.N, OFFSET.S]],\n  7: [[OFFSET.W, OFFSET.N]],\n  8: [[OFFSET.W, OFFSET.N]],\n  9: [[OFFSET.N, OFFSET.S]],\n  10: {\n    0: [[OFFSET.W, OFFSET.N], [OFFSET.S, OFFSET.E]],\n    1: [[OFFSET.W, OFFSET.S], [OFFSET.N, OFFSET.E]]\n  },\n  11: [[OFFSET.N, OFFSET.E]],\n  12: [[OFFSET.W, OFFSET.E]],\n  13: [[OFFSET.S, OFFSET.E]],\n  14: [[OFFSET.W, OFFSET.S]],\n  15: []\n};\nexports.ISOLINES_CODE_OFFSET_MAP = ISOLINES_CODE_OFFSET_MAP;\n\nfunction ternaryToIndex(ternary) {\n  return parseInt(ternary, 4);\n}\n\nvar ISOBANDS_CODE_OFFSET_MAP = (_ISOBANDS_CODE_OFFSET = {}, _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0000'), []), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2222'), []), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2221'), [SW_TRIANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2212'), [SE_TRIANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2122'), [NE_TRIANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1222'), [NW_TRIANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0001'), [SW_TRIANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0010'), [SE_TRIANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0100'), [NE_TRIANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1000'), [NW_TRIANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2220'), [SW_TRAPEZOID]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2202'), [SE_TRAPEZOID]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2022'), [NE_TRAPEZOID]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0222'), [NW_TRAPEZOID]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0002'), [SW_TRAPEZOID]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0020'), [SE_TRAPEZOID]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0200'), [NE_TRAPEZOID]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2000'), [NW_TRAPEZOID]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0011'), [S_RECTANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0110'), [E_RECTANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1100'), [N_RECTANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1001'), [W_RECTANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2211'), [S_RECTANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2112'), [E_RECTANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1122'), [N_RECTANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1221'), [W_RECTANGLE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2200'), [EW_RECTANGEL]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2002'), [SN_RECTANGEL]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0022'), [EW_RECTANGEL]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0220'), [SN_RECTANGEL]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1111'), [SQUARE]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1211'), [SW_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2111'), [SE_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1112'), [NE_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1121'), [NW_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1011'), [SW_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0111'), [SE_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1110'), [NE_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1101'), [NW_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1200'), [NW_N_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0120'), [NE_E_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0012'), [SE_S_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2001'), [SW_W_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1022'), [NW_N_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2102'), [NE_E_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2210'), [SE_S_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0221'), [SW_W_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1002'), [NW_W_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2100'), [NE_N_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0210'), [SE_E_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0021'), [SW_S_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1220'), [NW_W_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0122'), [NE_N_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2012'), [SE_E_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2201'), [SW_S_PENTAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0211'), [S_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2110'), [E_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1102'), [N_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1021'), [W_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2011'), [S_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0112'), [E_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1120'), [N_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1201'), [W_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2101'), [SW_NE_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0121'), [SW_NE_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1012'), [NW_SE_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1210'), [NW_SE_HEXAGON]), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0101'), {\n  0: [SW_TRIANGLE, NE_TRIANGLE],\n  1: [SW_NE_HEXAGON],\n  2: [SW_NE_HEXAGON]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1010'), {\n  0: [NW_TRIANGLE, SE_TRIANGLE],\n  1: [NW_SE_HEXAGON],\n  2: [NW_SE_HEXAGON]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2121'), {\n  0: [SW_NE_HEXAGON],\n  1: [SW_NE_HEXAGON],\n  2: [SW_TRIANGLE, NE_TRIANGLE]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1212'), {\n  0: [NW_SE_HEXAGON],\n  1: [NW_SE_HEXAGON],\n  2: [NW_TRIANGLE, SE_TRIANGLE]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2120'), {\n  0: [NE_HEPTAGON],\n  1: [NE_HEPTAGON],\n  2: [SW_TRAPEZOID, NE_TRIANGLE]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2021'), {\n  0: [SW_HEPTAGON],\n  1: [SW_HEPTAGON],\n  2: [SW_TRIANGLE, NE_TRAPEZOID]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1202'), {\n  0: [NW_HEPTAGON],\n  1: [NW_HEPTAGON],\n  2: [NW_TRIANGLE, SE_TRAPEZOID]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0212'), {\n  0: [SE_HEPTAGON],\n  1: [SE_HEPTAGON],\n  2: [SE_TRIANGLE, NW_TRAPEZOID]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0102'), {\n  0: [SW_TRAPEZOID, NE_TRIANGLE],\n  1: [NE_HEPTAGON],\n  2: [NE_HEPTAGON]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0201'), {\n  0: [SW_TRIANGLE, NE_TRAPEZOID],\n  1: [SW_HEPTAGON],\n  2: [SW_HEPTAGON]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('1020'), {\n  0: [NW_TRIANGLE, SE_TRAPEZOID],\n  1: [NW_HEPTAGON],\n  2: [NW_HEPTAGON]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2010'), {\n  0: [SE_TRIANGLE, NW_TRAPEZOID],\n  1: [SE_HEPTAGON],\n  2: [SE_HEPTAGON]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('2020'), {\n  0: [NW_TRAPEZOID, SE_TRAPEZOID],\n  1: [OCTAGON],\n  2: [SW_TRAPEZOID, NE_TRAPEZOID]\n}), _defineProperty(_ISOBANDS_CODE_OFFSET, ternaryToIndex('0202'), {\n  0: [NE_TRAPEZOID, SW_TRAPEZOID],\n  1: [OCTAGON],\n  2: [NW_TRAPEZOID, SE_TRAPEZOID]\n}), _ISOBANDS_CODE_OFFSET);\nexports.ISOBANDS_CODE_OFFSET_MAP = ISOBANDS_CODE_OFFSET_MAP;\n},{}],\"lFiX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getCode = getCode;\nexports.getVertices = getVertices;\nexports.CONTOUR_TYPE = void 0;\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _marchingSquaresCodes = require(\"./marching-squares-codes\");\n\n// All utility mehtods needed to implement Marching Squres algorithm\n// Ref: https://en.wikipedia.org/wiki/Marching_squares\nvar CONTOUR_TYPE = {\n  ISO_LINES: 1,\n  ISO_BANDS: 2\n};\nexports.CONTOUR_TYPE = CONTOUR_TYPE;\nvar Z_OFFSET = 0.002;\nvar DEFAULT_THRESHOLD_DATA = {\n  zIndex: 0,\n  zOffsetScale: 1\n}; // Utility methods\n\nfunction getVertexCode(weight, threshold) {\n  // threshold must be a single value or a range (array of size 2)\n  // Iso-bands\n  if (Array.isArray(threshold)) {\n    if (weight < threshold[0]) {\n      return 0;\n    }\n\n    return weight < threshold[1] ? 1 : 2;\n  } // Iso-lines\n\n\n  return weight >= threshold ? 1 : 0;\n} // Returns marching square code for given cell\n\n/* eslint-disable complexity, max-statements*/\n\n\nfunction getCode(opts) {\n  // Assumptions\n  // Origin is on bottom-left , and X increase to right, Y to top\n  // When processing one cell, we process 4 cells, by extending row to top and on column to right\n  // to create a 2X2 cell grid\n  var cellWeights = opts.cellWeights,\n      x = opts.x,\n      y = opts.y,\n      width = opts.width,\n      height = opts.height;\n  var threshold = opts.threshold;\n\n  if (opts.thresholdValue) {\n    _core.log.deprecated('thresholdValue', 'threshold')();\n\n    threshold = opts.thresholdValue;\n  }\n\n  var isLeftBoundary = x < 0;\n  var isRightBoundary = x >= width - 1;\n  var isBottomBoundary = y < 0;\n  var isTopBoundary = y >= height - 1;\n  var isBoundary = isLeftBoundary || isRightBoundary || isBottomBoundary || isTopBoundary;\n  var weights = {};\n  var codes = {}; // TOP\n\n  if (isLeftBoundary || isTopBoundary) {\n    codes.top = 0;\n  } else {\n    weights.top = cellWeights[(y + 1) * width + x];\n    codes.top = getVertexCode(weights.top, threshold);\n  } // TOP-RIGHT\n\n\n  if (isRightBoundary || isTopBoundary) {\n    codes.topRight = 0;\n  } else {\n    weights.topRight = cellWeights[(y + 1) * width + x + 1];\n    codes.topRight = getVertexCode(weights.topRight, threshold);\n  } // RIGHT\n\n\n  if (isRightBoundary || isBottomBoundary) {\n    codes.right = 0;\n  } else {\n    weights.right = cellWeights[y * width + x + 1];\n    codes.right = getVertexCode(weights.right, threshold);\n  } // CURRENT\n\n\n  if (isLeftBoundary || isBottomBoundary) {\n    codes.current = 0;\n  } else {\n    weights.current = cellWeights[y * width + x];\n    codes.current = getVertexCode(weights.current, threshold);\n  }\n\n  var top = codes.top,\n      topRight = codes.topRight,\n      right = codes.right,\n      current = codes.current;\n  var code = -1;\n\n  if (Number.isFinite(threshold)) {\n    code = top << 3 | topRight << 2 | right << 1 | current;\n  }\n\n  if (Array.isArray(threshold)) {\n    code = top << 6 | topRight << 4 | right << 2 | current;\n  }\n\n  var meanCode = 0; // meanCode is only needed for saddle cases, and they should\n  // only occur when we are not processing a cell on boundary\n  // because when on a boundary either, bottom-row, top-row, left-column or right-column will have both 0 codes\n\n  if (!isBoundary) {\n    meanCode = getVertexCode((weights.top + weights.topRight + weights.right + weights.current) / 4, threshold);\n  }\n\n  return {\n    code: code,\n    meanCode: meanCode\n  };\n}\n/* eslint-enable complexity, max-statements*/\n// Returns intersection vertices for given cellindex\n// [x, y] refers current marchng cell, reference vertex is always top-right corner\n\n\nfunction getVertices(opts) {\n  var gridOrigin = opts.gridOrigin,\n      cellSize = opts.cellSize,\n      x = opts.x,\n      y = opts.y,\n      code = opts.code,\n      meanCode = opts.meanCode,\n      _opts$type = opts.type,\n      type = _opts$type === void 0 ? CONTOUR_TYPE.ISO_LINES : _opts$type;\n  var thresholdData = Object.assign({}, DEFAULT_THRESHOLD_DATA, opts.thresholdData);\n  var offsets = type === CONTOUR_TYPE.ISO_BANDS ? _marchingSquaresCodes.ISOBANDS_CODE_OFFSET_MAP[code] : _marchingSquaresCodes.ISOLINES_CODE_OFFSET_MAP[code]; // handle saddle cases\n\n  if (!Array.isArray(offsets)) {\n    offsets = offsets[meanCode];\n  } // Reference vertex is at top-right move to top-right corner\n\n\n  var vZ = thresholdData.zIndex * Z_OFFSET * thresholdData.zOffsetScale;\n  var rX = (x + 1) * cellSize[0];\n  var rY = (y + 1) * cellSize[1];\n  var refVertexX = gridOrigin[0] + rX;\n  var refVertexY = gridOrigin[1] + rY; // offsets format\n  // ISO_LINES: [[1A, 1B], [2A, 2B]],\n  // ISO_BANDS: [[1A, 1B, 1C, ...], [2A, 2B, 2C, ...]],\n  // vertices format\n  // ISO_LINES: [[x1A, y1A], [x1B, y1B], [x2A, x2B], ...],\n  // ISO_BANDS:  => confirms to SolidPolygonLayer's simple polygon format\n  //      [\n  //        [[x1A, y1A], [x1B, y1B], [x1C, y1C] ... ],\n  //        ...\n  //      ]\n\n  if (type === CONTOUR_TYPE.ISO_BANDS) {\n    var polygons = [];\n    offsets.forEach(function (polygonOffsets) {\n      var polygon = [];\n      polygonOffsets.forEach(function (xyOffset) {\n        var vX = refVertexX + xyOffset[0] * cellSize[0];\n        var vY = refVertexY + xyOffset[1] * cellSize[1];\n        polygon.push([vX, vY, vZ]);\n      });\n      polygons.push(polygon);\n    });\n    return polygons;\n  } // default case is ISO_LINES\n\n\n  var lines = [];\n  offsets.forEach(function (xyOffsets) {\n    xyOffsets.forEach(function (offset) {\n      var vX = refVertexX + offset[0] * cellSize[0];\n      var vY = refVertexY + offset[1] * cellSize[1];\n      lines.push([vX, vY, vZ]);\n    });\n  });\n  return lines;\n}\n},{\"@deck.gl/core\":\"P3tH\",\"./marching-squares-codes\":\"jzh9\"}],\"lob9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.generateContours = generateContours;\n\nvar _marchingSquares = require(\"./marching-squares\");\n\n// Given all the cell weights, generates contours for each threshold.\n\n/* eslint-disable max-depth */\nfunction generateContours(_ref) {\n  var thresholdData = _ref.thresholdData,\n      colors = _ref.colors,\n      cellWeights = _ref.cellWeights,\n      gridSize = _ref.gridSize,\n      gridOrigin = _ref.gridOrigin,\n      cellSize = _ref.cellSize;\n  var contourSegments = [];\n  var contourPolygons = [];\n  var width = gridSize[0];\n  var height = gridSize[1];\n  thresholdData.forEach(function (data, index) {\n    var threshold = data.threshold;\n\n    for (var x = -1; x < width; x++) {\n      for (var y = -1; y < height; y++) {\n        // Get the MarchingSquares code based on neighbor cell weights.\n        var _getCode = (0, _marchingSquares.getCode)({\n          cellWeights: cellWeights,\n          threshold: threshold,\n          x: x,\n          y: y,\n          width: width,\n          height: height\n        }),\n            code = _getCode.code,\n            meanCode = _getCode.meanCode;\n\n        var opts = {\n          gridOrigin: gridOrigin,\n          cellSize: cellSize,\n          x: x,\n          y: y,\n          width: width,\n          height: height,\n          code: code,\n          meanCode: meanCode,\n          thresholdData: data\n        };\n\n        if (Array.isArray(threshold)) {\n          opts.type = _marchingSquares.CONTOUR_TYPE.ISO_BANDS;\n          var polygons = (0, _marchingSquares.getVertices)(opts);\n          polygons.forEach(function (polygon) {\n            contourPolygons.push({\n              vertices: polygon,\n              threshold: threshold\n            });\n          });\n        } else {\n          // Get the intersection vertices based on MarchingSquares code.\n          opts.type = _marchingSquares.CONTOUR_TYPE.ISO_LINES;\n          var vertices = (0, _marchingSquares.getVertices)(opts);\n\n          for (var i = 0; i < vertices.length; i += 2) {\n            contourSegments.push({\n              start: vertices[i],\n              end: vertices[i + 1],\n              threshold: threshold\n            });\n          }\n        }\n      }\n    }\n  });\n  return {\n    contourSegments: contourSegments,\n    contourPolygons: contourPolygons\n  };\n}\n/* eslint-enable max-depth */\n},{\"./marching-squares\":\"lFiX\"}],\"oxEV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _math = require(\"math.gl\");\n\nvar _core = require(\"@deck.gl/core\");\n\nvar _lineLayer = _interopRequireDefault(require(\"../line-layer/line-layer\"));\n\nvar _solidPolygonLayer = _interopRequireDefault(require(\"../solid-polygon-layer/solid-polygon-layer\"));\n\nvar _contourUtils = require(\"./contour-utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) {\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _get(target, property, receiver) {\n  if (typeof Reflect !== \"undefined\" && Reflect.get) {\n    _get = Reflect.get;\n  } else {\n    _get = function _get(target, property, receiver) {\n      var base = _superPropBase(target, property);\n\n      if (!base) return;\n      var desc = Object.getOwnPropertyDescriptor(base, property);\n\n      if (desc.get) {\n        return desc.get.call(receiver);\n      }\n\n      return desc.value;\n    };\n  }\n\n  return _get(target, property, receiver || target);\n}\n\nfunction _superPropBase(object, property) {\n  while (!Object.prototype.hasOwnProperty.call(object, property)) {\n    object = _getPrototypeOf(object);\n    if (object === null) break;\n  }\n\n  return object;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n} // Copyright (c) 2015 - 2018 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nvar DEFAULT_COLOR = [255, 255, 255, 255];\nvar DEFAULT_STROKE_WIDTH = 1;\nvar DEFAULT_THRESHOLD = 1;\nvar defaultProps = {\n  // grid aggregation\n  cellSize: {\n    type: 'number',\n    min: 1,\n    max: 1000,\n    value: 1000\n  },\n  getPosition: {\n    type: 'accessor',\n    value: function value(x) {\n      return x.position;\n    }\n  },\n  getWeight: {\n    type: 'accessor',\n    value: function value(x) {\n      return 1;\n    }\n  },\n  // contour lines\n  contours: [{\n    threshold: DEFAULT_THRESHOLD\n  }],\n  fp64: false,\n  zOffsetScale: 1\n};\n\nvar ContourLayer =\n/*#__PURE__*/\nfunction (_CompositeLayer) {\n  _inherits(ContourLayer, _CompositeLayer);\n\n  function ContourLayer() {\n    _classCallCheck(this, ContourLayer);\n\n    return _possibleConstructorReturn(this, _getPrototypeOf(ContourLayer).apply(this, arguments));\n  }\n\n  _createClass(ContourLayer, [{\n    key: \"initializeState\",\n    value: function initializeState() {\n      var gl = this.context.gl;\n      var options = {\n        id: \"\".concat(this.id, \"-gpu-aggregator\"),\n        shaderCache: this.context.shaderCache\n      };\n      this.state = {\n        contourData: {},\n        gridAggregator: new _core._GPUGridAggregator(gl, options),\n        colorTrigger: 0,\n        strokeWidthTrigger: 0\n      };\n    }\n  }, {\n    key: \"updateState\",\n    value: function updateState(_ref) {\n      var oldProps = _ref.oldProps,\n          props = _ref.props,\n          changeFlags = _ref.changeFlags;\n      var dataChanged = false;\n      var contoursChanged = false;\n\n      var aggregationFlags = this._getAggregationFlags({\n        oldProps: oldProps,\n        props: props,\n        changeFlags: changeFlags\n      });\n\n      if (aggregationFlags) {\n        dataChanged = true; // Clear countsData cache\n\n        this.setState({\n          countsData: null\n        });\n\n        this._aggregateData(aggregationFlags);\n      }\n\n      if (this._shouldRebuildContours({\n        oldProps: oldProps,\n        props: props\n      })) {\n        contoursChanged = true;\n\n        this._updateThresholdData(props);\n      }\n\n      if (dataChanged || contoursChanged) {\n        this._generateContours();\n      } else {\n        // data for sublayers not changed check if color or strokeWidth need to be updated\n        this._updateSubLayerTriggers(oldProps, props);\n      }\n    }\n  }, {\n    key: \"renderLayers\",\n    value: function renderLayers() {\n      var _this$state$contourDa = this.state.contourData,\n          contourSegments = _this$state$contourDa.contourSegments,\n          contourPolygons = _this$state$contourDa.contourPolygons;\n      var hasIsolines = contourSegments && contourSegments.length > 0;\n      var hasIsobands = contourPolygons && contourPolygons.length > 0;\n      var lineLayer = hasIsolines && new _lineLayer.default(this._getLineLayerProps());\n      var solidPolygonLayer = hasIsobands && new _solidPolygonLayer.default(this._getSolidPolygonLayerProps());\n      return [lineLayer, solidPolygonLayer];\n    } // Private\n\n  }, {\n    key: \"_aggregateData\",\n    value: function _aggregateData(aggregationFlags) {\n      var _this$props = this.props,\n          data = _this$props.data,\n          cellSizeMeters = _this$props.cellSize,\n          getPosition = _this$props.getPosition,\n          getWeight = _this$props.getWeight,\n          gpuAggregation = _this$props.gpuAggregation,\n          fp64 = _this$props.fp64,\n          coordinateSystem = _this$props.coordinateSystem;\n\n      var _pointToDensityGridDa = (0, _core._pointToDensityGridData)({\n        data: data,\n        cellSizeMeters: cellSizeMeters,\n        getPosition: getPosition,\n        getWeight: getWeight,\n        gpuAggregation: gpuAggregation,\n        gpuGridAggregator: this.state.gridAggregator,\n        fp64: fp64,\n        coordinateSystem: coordinateSystem,\n        viewport: this.context.viewport,\n        boundingBox: this.state.boundingBox,\n        // avoid parsing data when it is not changed.\n        aggregationFlags: aggregationFlags\n      }),\n          countsData = _pointToDensityGridDa.countsData,\n          countsBuffer = _pointToDensityGridDa.countsBuffer,\n          gridSize = _pointToDensityGridDa.gridSize,\n          gridOrigin = _pointToDensityGridDa.gridOrigin,\n          cellSize = _pointToDensityGridDa.cellSize,\n          boundingBox = _pointToDensityGridDa.boundingBox;\n\n      this.setState({\n        countsData: countsData,\n        countsBuffer: countsBuffer,\n        gridSize: gridSize,\n        gridOrigin: gridOrigin,\n        cellSize: cellSize,\n        boundingBox: boundingBox\n      });\n    }\n  }, {\n    key: \"_generateContours\",\n    value: function _generateContours() {\n      var _this$state = this.state,\n          gridSize = _this$state.gridSize,\n          gridOrigin = _this$state.gridOrigin,\n          cellSize = _this$state.cellSize,\n          thresholdData = _this$state.thresholdData;\n      var countsData = this.state.countsData;\n\n      if (!countsData) {\n        var countsBuffer = this.state.countsBuffer;\n        countsData = countsBuffer.getData();\n        this.setState({\n          countsData: countsData\n        });\n      }\n\n      var _GPUGridAggregator$ge = _core._GPUGridAggregator.getCellData({\n        countsData: countsData\n      }),\n          cellWeights = _GPUGridAggregator$ge.cellWeights; // const thresholds = this.props.contours.map(x => x.threshold);\n\n\n      var contourData = (0, _contourUtils.generateContours)({\n        thresholdData: thresholdData,\n        cellWeights: cellWeights,\n        gridSize: gridSize,\n        gridOrigin: gridOrigin,\n        cellSize: cellSize\n      }); // contourData contains both iso-lines and iso-bands if requested.\n\n      this.setState({\n        contourData: contourData\n      });\n    }\n  }, {\n    key: \"_getAggregationFlags\",\n    value: function _getAggregationFlags(_ref2) {\n      var oldProps = _ref2.oldProps,\n          props = _ref2.props,\n          changeFlags = _ref2.changeFlags;\n      var aggregationFlags = null;\n\n      if (changeFlags.dataChanged || oldProps.gpuAggregation !== props.gpuAggregation || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPosition)) {\n        aggregationFlags = Object.assign({}, aggregationFlags, {\n          dataChanged: true\n        });\n      }\n\n      if (oldProps.cellSize !== props.cellSize) {\n        aggregationFlags = Object.assign({}, aggregationFlags, {\n          cellSizeChanged: true\n        });\n      }\n\n      return aggregationFlags;\n    }\n  }, {\n    key: \"_getLineLayerProps\",\n    value: function _getLineLayerProps() {\n      var fp64 = this.props.fp64;\n      var _this$state2 = this.state,\n          colorTrigger = _this$state2.colorTrigger,\n          strokeWidthTrigger = _this$state2.strokeWidthTrigger;\n      return _get(_getPrototypeOf(ContourLayer.prototype), \"getSubLayerProps\", this).call(this, {\n        id: 'contour-line-layer',\n        data: this.state.contourData.contourSegments,\n        fp64: fp64,\n        getSourcePosition: function getSourcePosition(d) {\n          return d.start;\n        },\n        getTargetPosition: function getTargetPosition(d) {\n          return d.end;\n        },\n        getColor: this._onGetSublayerColor.bind(this),\n        getStrokeWidth: this._onGetSublayerStrokeWidth.bind(this),\n        colorTrigger: colorTrigger,\n        strokeWidthTrigger: strokeWidthTrigger,\n        updateTriggers: {\n          getColor: colorTrigger,\n          getStrokeWidth: strokeWidthTrigger\n        }\n      });\n    }\n  }, {\n    key: \"_getSolidPolygonLayerProps\",\n    value: function _getSolidPolygonLayerProps() {\n      var fp64 = this.props.fp64;\n      var colorTrigger = this.state.colorTrigger;\n      return _get(_getPrototypeOf(ContourLayer.prototype), \"getSubLayerProps\", this).call(this, {\n        id: 'contour-solid-polygon-layer',\n        data: this.state.contourData.contourPolygons,\n        fp64: fp64,\n        getPolygon: function getPolygon(d) {\n          return d.vertices;\n        },\n        getFillColor: this._onGetSublayerColor.bind(this),\n        colorTrigger: colorTrigger,\n        updateTriggers: {\n          getFillColor: colorTrigger\n        }\n      });\n    }\n  }, {\n    key: \"_onGetSublayerColor\",\n    value: function _onGetSublayerColor(element) {\n      // element is either a line segment or polygon\n      var contours = this.props.contours;\n      var color = DEFAULT_COLOR;\n      contours.forEach(function (data) {\n        if ((0, _math.equals)(data.threshold, element.threshold)) {\n          color = data.color || DEFAULT_COLOR;\n        }\n      });\n      return color;\n    }\n  }, {\n    key: \"_onGetSublayerStrokeWidth\",\n    value: function _onGetSublayerStrokeWidth(segment) {\n      var contours = this.props.contours;\n      var strokeWidth = DEFAULT_STROKE_WIDTH; // Linearly searches the contours, but there should only be few contours\n\n      contours.some(function (contour) {\n        if (contour.threshold === segment.threshold) {\n          strokeWidth = contour.strokeWidth || DEFAULT_STROKE_WIDTH;\n          return true;\n        }\n\n        return false;\n      });\n      return strokeWidth;\n    }\n  }, {\n    key: \"_shouldRebuildContours\",\n    value: function _shouldRebuildContours(_ref3) {\n      var oldProps = _ref3.oldProps,\n          props = _ref3.props;\n\n      if (!oldProps.contours || !oldProps.zOffsetScale || oldProps.contours.length !== props.contours.length || oldProps.zOffsetScale !== props.zOffsetScale) {\n        return true;\n      }\n\n      var oldThresholds = oldProps.contours.map(function (x) {\n        return x.threshold;\n      });\n      var thresholds = props.contours.map(function (x) {\n        return x.threshold;\n      });\n      return thresholds.some(function (_, i) {\n        return !(0, _math.equals)(thresholds[i], oldThresholds[i]);\n      });\n    }\n  }, {\n    key: \"_updateSubLayerTriggers\",\n    value: function _updateSubLayerTriggers(oldProps, props) {\n      if (oldProps && oldProps.contours && props && props.contours) {\n        // threshold value change or count change will trigger data change for sublayers\n        // those cases are not handled here.\n        var oldColors = [];\n        var newColors = [];\n        var oldStrokeWidths = [];\n        var newStrokeWidths = [];\n        oldProps.contours.forEach(function (contour) {\n          oldColors = oldColors.concat(contour.color);\n          oldStrokeWidths.push(contour.strokeWidth || DEFAULT_STROKE_WIDTH);\n        });\n        props.contours.forEach(function (contour) {\n          newColors = newColors.concat(contour.color);\n          newStrokeWidths.push(contour.strokeWidth || DEFAULT_STROKE_WIDTH);\n        });\n\n        if (!(0, _math.equals)(oldColors, newColors)) {\n          this.state.colorTrigger++;\n        }\n\n        if (!(0, _math.equals)(oldStrokeWidths, newStrokeWidths)) {\n          this.state.strokeWidthTrigger++;\n        }\n      }\n    }\n  }, {\n    key: \"_updateThresholdData\",\n    value: function _updateThresholdData(props) {\n      var thresholdData = props.contours.map(function (x, index) {\n        return {\n          threshold: x.threshold,\n          zIndex: x.zIndex || index,\n          zOffsetScale: props.zOffsetScale\n        };\n      });\n      this.setState({\n        thresholdData: thresholdData\n      });\n    }\n  }]);\n\n  return ContourLayer;\n}(_core.CompositeLayer);\n\nexports.default = ContourLayer;\nContourLayer.layerName = 'ContourLayer';\nContourLayer.defaultProps = defaultProps;\n},{\"math.gl\":\"o5CE\",\"@deck.gl/core\":\"P3tH\",\"../line-layer/line-layer\":\"ooLf\",\"../solid-polygon-layer/solid-polygon-layer\":\"w2SP\",\"./contour-utils\":\"lob9\"}],\"cpXu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"ArcLayer\", {\n  enumerable: true,\n  get: function () {\n    return _arcLayer.default;\n  }\n});\nObject.defineProperty(exports, \"IconLayer\", {\n  enumerable: true,\n  get: function () {\n    return _iconLayer.default;\n  }\n});\nObject.defineProperty(exports, \"LineLayer\", {\n  enumerable: true,\n  get: function () {\n    return _lineLayer.default;\n  }\n});\nObject.defineProperty(exports, \"PointCloudLayer\", {\n  enumerable: true,\n  get: function () {\n    return _pointCloudLayer.default;\n  }\n});\nObject.defineProperty(exports, \"ScatterplotLayer\", {\n  enumerable: true,\n  get: function () {\n    return _scatterplotLayer.default;\n  }\n});\nObject.defineProperty(exports, \"ScreenGridLayer\", {\n  enumerable: true,\n  get: function () {\n    return _screenGridLayer.default;\n  }\n});\nObject.defineProperty(exports, \"GridLayer\", {\n  enumerable: true,\n  get: function () {\n    return _gridLayer.default;\n  }\n});\nObject.defineProperty(exports, \"GridCellLayer\", {\n  enumerable: true,\n  get: function () {\n    return _gridCellLayer.default;\n  }\n});\nObject.defineProperty(exports, \"HexagonLayer\", {\n  enumerable: true,\n  get: function () {\n    return _hexagonLayer.default;\n  }\n});\nObject.defineProperty(exports, \"HexagonCellLayer\", {\n  enumerable: true,\n  get: function () {\n    return _hexagonCellLayer.default;\n  }\n});\nObject.defineProperty(exports, \"PathLayer\", {\n  enumerable: true,\n  get: function () {\n    return _pathLayer.default;\n  }\n});\nObject.defineProperty(exports, \"PolygonLayer\", {\n  enumerable: true,\n  get: function () {\n    return _polygonLayer.default;\n  }\n});\nObject.defineProperty(exports, \"GeoJsonLayer\", {\n  enumerable: true,\n  get: function () {\n    return _geojsonLayer.default;\n  }\n});\nObject.defineProperty(exports, \"TextLayer\", {\n  enumerable: true,\n  get: function () {\n    return _textLayer.default;\n  }\n});\nObject.defineProperty(exports, \"ContourLayer\", {\n  enumerable: true,\n  get: function () {\n    return _contourLayer.default;\n  }\n});\nObject.defineProperty(exports, \"_SolidPolygonLayer\", {\n  enumerable: true,\n  get: function () {\n    return _solidPolygonLayer.default;\n  }\n});\nObject.defineProperty(exports, \"_MultiIconLayer\", {\n  enumerable: true,\n  get: function () {\n    return _multiIconLayer.default;\n  }\n});\n\nvar _arcLayer = _interopRequireDefault(require(\"./arc-layer/arc-layer\"));\n\nvar _iconLayer = _interopRequireDefault(require(\"./icon-layer/icon-layer\"));\n\nvar _lineLayer = _interopRequireDefault(require(\"./line-layer/line-layer\"));\n\nvar _pointCloudLayer = _interopRequireDefault(require(\"./point-cloud-layer/point-cloud-layer\"));\n\nvar _scatterplotLayer = _interopRequireDefault(require(\"./scatterplot-layer/scatterplot-layer\"));\n\nvar _screenGridLayer = _interopRequireDefault(require(\"./screen-grid-layer/screen-grid-layer\"));\n\nvar _gridLayer = _interopRequireDefault(require(\"./grid-layer/grid-layer\"));\n\nvar _gridCellLayer = _interopRequireDefault(require(\"./grid-cell-layer/grid-cell-layer\"));\n\nvar _hexagonLayer = _interopRequireDefault(require(\"./hexagon-layer/hexagon-layer\"));\n\nvar _hexagonCellLayer = _interopRequireDefault(require(\"./hexagon-cell-layer/hexagon-cell-layer\"));\n\nvar _pathLayer = _interopRequireDefault(require(\"./path-layer/path-layer\"));\n\nvar _polygonLayer = _interopRequireDefault(require(\"./polygon-layer/polygon-layer\"));\n\nvar _geojsonLayer = _interopRequireDefault(require(\"./geojson-layer/geojson-layer\"));\n\nvar _textLayer = _interopRequireDefault(require(\"./text-layer/text-layer\"));\n\nvar _contourLayer = _interopRequireDefault(require(\"./contour-layer/contour-layer\"));\n\nvar _solidPolygonLayer = _interopRequireDefault(require(\"./solid-polygon-layer/solid-polygon-layer\"));\n\nvar _multiIconLayer = _interopRequireDefault(require(\"./text-layer/multi-icon-layer/multi-icon-layer\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./arc-layer/arc-layer\":\"ub4U\",\"./icon-layer/icon-layer\":\"BUSa\",\"./line-layer/line-layer\":\"ooLf\",\"./point-cloud-layer/point-cloud-layer\":\"t7iL\",\"./scatterplot-layer/scatterplot-layer\":\"mZQa\",\"./screen-grid-layer/screen-grid-layer\":\"hHAZ\",\"./grid-layer/grid-layer\":\"qUvr\",\"./grid-cell-layer/grid-cell-layer\":\"sdvT\",\"./hexagon-layer/hexagon-layer\":\"OBJs\",\"./hexagon-cell-layer/hexagon-cell-layer\":\"i560\",\"./path-layer/path-layer\":\"n0i7\",\"./polygon-layer/polygon-layer\":\"UxaK\",\"./geojson-layer/geojson-layer\":\"ZH3t\",\"./text-layer/text-layer\":\"DEOk\",\"./contour-layer/contour-layer\":\"oxEV\",\"./solid-polygon-layer/solid-polygon-layer\":\"w2SP\",\"./text-layer/multi-icon-layer/multi-icon-layer\":\"OSwK\"}],\"BGyS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.accessorName = accessorName;\nexports.accessorFields = accessorFields;\n\nfunction _default(fn, fields, name) {\n  fn.fields = fields || [];\n  fn.fname = name;\n  return fn;\n}\n\nfunction accessorName(fn) {\n  return fn == null ? null : fn.fname;\n}\n\nfunction accessorFields(fn) {\n  return fn == null ? null : fn.fields;\n}\n},{}],\"s25t\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(message) {\n  throw Error(message);\n}\n},{}],\"xJ2K\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _error = _interopRequireDefault(require(\"./error\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(p) {\n  var path = [],\n      q = null,\n      b = 0,\n      n = p.length,\n      s = '',\n      i,\n      j,\n      c;\n  p = p + '';\n\n  function push() {\n    path.push(s + p.substring(i, j));\n    s = '';\n    i = j + 1;\n  }\n\n  for (i = j = 0; j < n; ++j) {\n    c = p[j];\n\n    if (c === '\\\\') {\n      s += p.substring(i, j);\n      i = ++j;\n    } else if (c === q) {\n      push();\n      q = null;\n      b = -1;\n    } else if (q) {\n      continue;\n    } else if (i === b && c === '\"') {\n      i = j + 1;\n      q = c;\n    } else if (i === b && c === \"'\") {\n      i = j + 1;\n      q = c;\n    } else if (c === '.' && !b) {\n      if (j > i) {\n        push();\n      } else {\n        i = j + 1;\n      }\n    } else if (c === '[') {\n      if (j > i) push();\n      b = i = j + 1;\n    } else if (c === ']') {\n      if (!b) (0, _error.default)('Access path missing open bracket: ' + p);\n      if (b > 0) push();\n      b = 0;\n      i = j + 1;\n    }\n  }\n\n  if (b) (0, _error.default)('Access path missing closing bracket: ' + p);\n  if (q) (0, _error.default)('Access path missing closing quote: ' + p);\n\n  if (j > i) {\n    j++;\n    push();\n  }\n\n  return path;\n}\n},{\"./error\":\"s25t\"}],\"PCQs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = Array.isArray;\nexports.default = _default;\n},{}],\"DbRQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return _ === Object(_);\n}\n},{}],\"VyNU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return typeof _ === 'string';\n}\n},{}],\"vRqJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = $;\n\nvar _isArray = _interopRequireDefault(require(\"./isArray\"));\n\nvar _isObject = _interopRequireDefault(require(\"./isObject\"));\n\nvar _isString = _interopRequireDefault(require(\"./isString\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction $(x) {\n  return (0, _isArray.default)(x) ? '[' + x.map($) + ']' : (0, _isObject.default)(x) || (0, _isString.default)(x) ? // Output valid JSON and JS source strings.\n  // See http://timelessrepo.com/json-isnt-a-javascript-subset\n  JSON.stringify(x).replace('\\u2028', '\\\\u2028').replace('\\u2029', '\\\\u2029') : x;\n}\n},{\"./isArray\":\"PCQs\",\"./isObject\":\"DbRQ\",\"./isString\":\"VyNU\"}],\"HNH3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _accessor = _interopRequireDefault(require(\"./accessor\"));\n\nvar _splitAccessPath = _interopRequireDefault(require(\"./splitAccessPath\"));\n\nvar _stringValue = _interopRequireDefault(require(\"./stringValue\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(field, name) {\n  var path = (0, _splitAccessPath.default)(field),\n      code = 'return _[' + path.map(_stringValue.default).join('][') + '];';\n  return (0, _accessor.default)(Function('_', code), [field = path.length === 1 ? path[0] : field], name || field);\n}\n},{\"./accessor\":\"BGyS\",\"./splitAccessPath\":\"xJ2K\",\"./stringValue\":\"vRqJ\"}],\"J93T\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.falsy = exports.truthy = exports.one = exports.zero = exports.identity = exports.id = void 0;\n\nvar _accessor = _interopRequireDefault(require(\"./accessor\"));\n\nvar _field = _interopRequireDefault(require(\"./field\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar empty = [];\nvar id = (0, _field.default)('id');\nexports.id = id;\nvar identity = (0, _accessor.default)(function (_) {\n  return _;\n}, empty, 'identity');\nexports.identity = identity;\nvar zero = (0, _accessor.default)(function () {\n  return 0;\n}, empty, 'zero');\nexports.zero = zero;\nvar one = (0, _accessor.default)(function () {\n  return 1;\n}, empty, 'one');\nexports.one = one;\nvar truthy = (0, _accessor.default)(function () {\n  return true;\n}, empty, 'true');\nexports.truthy = truthy;\nvar falsy = (0, _accessor.default)(function () {\n  return false;\n}, empty, 'false');\nexports.falsy = falsy;\n},{\"./accessor\":\"BGyS\",\"./field\":\"HNH3\"}],\"dAUM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.Debug = exports.Info = exports.Warn = exports.Error = exports.None = void 0;\n\nfunction log(method, level, input) {\n  var args = [level].concat([].slice.call(input));\n  console[method].apply(console, args); // eslint-disable-line no-console\n}\n\nvar None = 0;\nexports.None = None;\nvar Error = 1;\nexports.Error = Error;\nvar Warn = 2;\nexports.Warn = Warn;\nvar Info = 3;\nexports.Info = Info;\nvar Debug = 4;\nexports.Debug = Debug;\n\nfunction _default(_, method) {\n  var level = _ || None;\n  return {\n    level: function (_) {\n      if (arguments.length) {\n        level = +_;\n        return this;\n      } else {\n        return level;\n      }\n    },\n    error: function () {\n      if (level >= Error) log(method || 'error', 'ERROR', arguments);\n      return this;\n    },\n    warn: function () {\n      if (level >= Warn) log(method || 'warn', 'WARN', arguments);\n      return this;\n    },\n    info: function () {\n      if (level >= Info) log(method || 'log', 'INFO', arguments);\n      return this;\n    },\n    debug: function () {\n      if (level >= Debug) log(method || 'log', 'DEBUG', arguments);\n      return this;\n    }\n  };\n}\n},{}],\"rT7K\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.mergeConfig = mergeConfig;\nexports.writeConfig = writeConfig;\n\nvar _isArray = _interopRequireDefault(require(\"./isArray\"));\n\nvar _isObject = _interopRequireDefault(require(\"./isObject\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mergeConfig(...configs) {\n  return configs.reduce((out, source) => {\n    for (var key in source) {\n      if (key === 'signals') {\n        // for signals, we merge the signals arrays\n        // source signals take precedence over\n        // existing signals with the same name\n        out.signals = mergeNamed(out.signals, source.signals);\n      } else {\n        // otherwise, merge objects subject to recursion constraints\n        // for legend block, recurse for the layout entry only\n        // for style block, recurse for all properties\n        // otherwise, no recursion: objects overwrite, no merging\n        var r = key === 'legend' ? {\n          'layout': 1\n        } : key === 'style' ? true : null;\n        writeConfig(out, key, source[key], r);\n      }\n    }\n\n    return out;\n  }, {});\n}\n\nfunction writeConfig(output, key, value, recurse) {\n  var k, o;\n\n  if ((0, _isObject.default)(value) && !(0, _isArray.default)(value)) {\n    o = (0, _isObject.default)(output[key]) ? output[key] : output[key] = {};\n\n    for (k in value) {\n      if (recurse && (recurse === true || recurse[k])) {\n        writeConfig(o, k, value[k]);\n      } else {\n        o[k] = value[k];\n      }\n    }\n  } else {\n    output[key] = value;\n  }\n}\n\nfunction mergeNamed(a, b) {\n  if (a == null) return b;\n  const map = {},\n        out = [];\n\n  function add(_) {\n    if (!map[_.name]) {\n      map[_.name] = 1;\n      out.push(_);\n    }\n  }\n\n  b.forEach(add);\n  a.forEach(add);\n  return out;\n}\n},{\"./isArray\":\"PCQs\",\"./isObject\":\"DbRQ\"}],\"Wjec\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(array) {\n  return array[array.length - 1];\n}\n},{}],\"IqMN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return _ == null || _ === '' ? null : +_;\n}\n},{}],\"EmM0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.panLinear = panLinear;\nexports.panLog = panLog;\nexports.panPow = panPow;\nexports.panSymlog = panSymlog;\nexports.zoomLinear = zoomLinear;\nexports.zoomLog = zoomLog;\nexports.zoomPow = zoomPow;\nexports.zoomSymlog = zoomSymlog;\n\nvar _accessors = require(\"./accessors\");\n\nvar _peek = _interopRequireDefault(require(\"./peek\"));\n\nvar _toNumber = _interopRequireDefault(require(\"./toNumber\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction exp(sign) {\n  return function (x) {\n    return sign * Math.exp(x);\n  };\n}\n\nfunction log(sign) {\n  return function (x) {\n    return Math.log(sign * x);\n  };\n}\n\nfunction symlog(c) {\n  return function (x) {\n    return Math.sign(x) * Math.log1p(Math.abs(x / c));\n  };\n}\n\nfunction symexp(c) {\n  return function (x) {\n    return Math.sign(x) * Math.expm1(Math.abs(x)) * c;\n  };\n}\n\nfunction pow(exponent) {\n  return function (x) {\n    return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n  };\n}\n\nfunction pan(domain, delta, lift, ground) {\n  var d0 = lift(domain[0]),\n      d1 = lift((0, _peek.default)(domain)),\n      dd = (d1 - d0) * delta;\n  return [ground(d0 - dd), ground(d1 - dd)];\n}\n\nfunction panLinear(domain, delta) {\n  return pan(domain, delta, _toNumber.default, _accessors.identity);\n}\n\nfunction panLog(domain, delta) {\n  var sign = Math.sign(domain[0]);\n  return pan(domain, delta, log(sign), exp(sign));\n}\n\nfunction panPow(domain, delta, exponent) {\n  return pan(domain, delta, pow(exponent), pow(1 / exponent));\n}\n\nfunction panSymlog(domain, delta, constant) {\n  return pan(domain, delta, symlog(constant), symexp(constant));\n}\n\nfunction zoom(domain, anchor, scale, lift, ground) {\n  var d0 = lift(domain[0]),\n      d1 = lift((0, _peek.default)(domain)),\n      da = anchor != null ? lift(anchor) : (d0 + d1) / 2;\n  return [ground(da + (d0 - da) * scale), ground(da + (d1 - da) * scale)];\n}\n\nfunction zoomLinear(domain, anchor, scale) {\n  return zoom(domain, anchor, scale, _toNumber.default, _accessors.identity);\n}\n\nfunction zoomLog(domain, anchor, scale) {\n  var sign = Math.sign(domain[0]);\n  return zoom(domain, anchor, scale, log(sign), exp(sign));\n}\n\nfunction zoomPow(domain, anchor, scale, exponent) {\n  return zoom(domain, anchor, scale, pow(exponent), pow(1 / exponent));\n}\n\nfunction zoomSymlog(domain, anchor, scale, constant) {\n  return zoom(domain, anchor, scale, symlog(constant), symexp(constant));\n}\n},{\"./accessors\":\"J93T\",\"./peek\":\"Wjec\",\"./toNumber\":\"IqMN\"}],\"iZoX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.quarter = quarter;\nexports.utcquarter = utcquarter;\n\nfunction quarter(date) {\n  return 1 + ~~(new Date(date).getMonth() / 3);\n}\n\nfunction utcquarter(date) {\n  return 1 + ~~(new Date(date).getUTCMonth() / 3);\n}\n},{}],\"PdkY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _isArray = _interopRequireDefault(require(\"./isArray\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(_) {\n  return _ != null ? (0, _isArray.default)(_) ? _ : [_] : [];\n}\n},{\"./isArray\":\"PCQs\"}],\"jwZR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n/**\n * Span-preserving range clamp. If the span of the input range is less\n * than (max - min) and an endpoint exceeds either the min or max value,\n * the range is translated such that the span is preserved and one\n * endpoint touches the boundary of the min/max range.\n * If the span exceeds (max - min), the range [min, max] is returned.\n */\nfunction _default(range, min, max) {\n  var lo = range[0],\n      hi = range[1],\n      span;\n\n  if (hi < lo) {\n    span = hi;\n    hi = lo;\n    lo = span;\n  }\n\n  span = hi - lo;\n  return span >= max - min ? [min, max] : [lo = Math.min(Math.max(lo, min), max - span), lo + span];\n}\n},{}],\"AAFW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return typeof _ === 'function';\n}\n},{}],\"aK6Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _accessor = _interopRequireWildcard(require(\"./accessor\"));\n\nvar _array = _interopRequireDefault(require(\"./array\"));\n\nvar _isFunction = _interopRequireDefault(require(\"./isFunction\"));\n\nvar _splitAccessPath = _interopRequireDefault(require(\"./splitAccessPath\"));\n\nvar _stringValue = _interopRequireDefault(require(\"./stringValue\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _default(fields, orders) {\n  var idx = [],\n      cmp = (fields = (0, _array.default)(fields)).map(function (f, i) {\n    if (f == null) {\n      return null;\n    } else {\n      idx.push(i);\n      return (0, _isFunction.default)(f) ? f : (0, _splitAccessPath.default)(f).map(_stringValue.default).join('][');\n    }\n  }),\n      n = idx.length - 1,\n      ord = (0, _array.default)(orders),\n      code = 'var u,v;return ',\n      i,\n      j,\n      f,\n      u,\n      v,\n      d,\n      t,\n      lt,\n      gt;\n  if (n < 0) return null;\n\n  for (j = 0; j <= n; ++j) {\n    i = idx[j];\n    f = cmp[i];\n\n    if ((0, _isFunction.default)(f)) {\n      d = 'f' + i;\n      u = '(u=this.' + d + '(a))';\n      v = '(v=this.' + d + '(b))';\n      (t = t || {})[d] = f;\n    } else {\n      u = '(u=a[' + f + '])';\n      v = '(v=b[' + f + '])';\n    }\n\n    d = '((v=v instanceof Date?+v:v),(u=u instanceof Date?+u:u))';\n\n    if (ord[i] !== 'descending') {\n      gt = 1;\n      lt = -1;\n    } else {\n      gt = -1;\n      lt = 1;\n    }\n\n    code += '(' + u + '<' + v + '||u==null)&&v!=null?' + lt + ':(u>v||v==null)&&u!=null?' + gt + ':' + d + '!==u&&v===v?' + lt + ':v!==v&&u===u?' + gt + (i < n ? ':' : ':0');\n  }\n\n  f = Function('a', 'b', code + ';');\n  if (t) f = f.bind(t);\n  fields = fields.reduce(function (map, field) {\n    if ((0, _isFunction.default)(field)) {\n      ((0, _accessor.accessorFields)(field) || []).forEach(function (_) {\n        map[_] = 1;\n      });\n    } else if (field != null) {\n      map[field + ''] = 1;\n    }\n\n    return map;\n  }, {});\n  return (0, _accessor.default)(f, Object.keys(fields));\n}\n},{\"./accessor\":\"BGyS\",\"./array\":\"PdkY\",\"./isFunction\":\"AAFW\",\"./splitAccessPath\":\"xJ2K\",\"./stringValue\":\"vRqJ\"}],\"W5PT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _isFunction = _interopRequireDefault(require(\"./isFunction\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(_) {\n  return (0, _isFunction.default)(_) ? _ : function () {\n    return _;\n  };\n}\n},{\"./isFunction\":\"AAFW\"}],\"Ntmh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(delay, handler) {\n  var tid, evt;\n\n  function callback() {\n    handler(evt);\n    tid = evt = null;\n  }\n\n  return function (e) {\n    evt = e;\n    if (tid) clearTimeout(tid);\n    tid = setTimeout(callback, delay);\n  };\n}\n},{}],\"HQJV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  for (var x, k, i = 1, len = arguments.length; i < len; ++i) {\n    x = arguments[i];\n\n    for (k in x) {\n      _[k] = x[k];\n    }\n  }\n\n  return _;\n}\n},{}],\"OkrY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n/**\n * Return an array with minimum and maximum values, in the\n * form [min, max]. Ignores null, undefined, and NaN values.\n */\nfunction _default(array, f) {\n  var i = 0,\n      n,\n      v,\n      min,\n      max;\n\n  if (array && (n = array.length)) {\n    if (f == null) {\n      // find first valid value\n      for (v = array[i]; v == null || v !== v; v = array[++i]);\n\n      min = max = v; // visit all other values\n\n      for (; i < n; ++i) {\n        v = array[i]; // skip null/undefined; NaN will fail all comparisons\n\n        if (v != null) {\n          if (v < min) min = v;\n          if (v > max) max = v;\n        }\n      }\n    } else {\n      // find first valid value\n      for (v = f(array[i]); v == null || v !== v; v = f(array[++i]));\n\n      min = max = v; // visit all other values\n\n      for (; i < n; ++i) {\n        v = f(array[i]); // skip null/undefined; NaN will fail all comparisons\n\n        if (v != null) {\n          if (v < min) min = v;\n          if (v > max) max = v;\n        }\n      }\n    }\n  }\n\n  return [min, max];\n}\n},{}],\"Z8q2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(array, f) {\n  var i = -1,\n      n = array.length,\n      a,\n      b,\n      c,\n      u,\n      v;\n\n  if (f == null) {\n    while (++i < n) {\n      b = array[i];\n\n      if (b != null && b >= b) {\n        a = c = b;\n        break;\n      }\n    }\n\n    u = v = i;\n\n    while (++i < n) {\n      b = array[i];\n\n      if (b != null) {\n        if (a > b) {\n          a = b;\n          u = i;\n        }\n\n        if (c < b) {\n          c = b;\n          v = i;\n        }\n      }\n    }\n  } else {\n    while (++i < n) {\n      b = f(array[i], i, array);\n\n      if (b != null && b >= b) {\n        a = c = b;\n        break;\n      }\n    }\n\n    u = v = i;\n\n    while (++i < n) {\n      b = f(array[i], i, array);\n\n      if (b != null) {\n        if (a > b) {\n          a = b;\n          u = i;\n        }\n\n        if (c < b) {\n          c = b;\n          v = i;\n        }\n      }\n    }\n  }\n\n  return [u, v];\n}\n},{}],\"zib3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nconst hop = Object.prototype.hasOwnProperty;\n\nfunction _default(object, property) {\n  return hop.call(object, property);\n}\n},{}],\"RJuX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _hasOwnProperty = _interopRequireDefault(require(\"./hasOwnProperty\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NULL = {};\n\nfunction _default(input) {\n  var obj = {},\n      map,\n      test;\n\n  function has(key) {\n    return (0, _hasOwnProperty.default)(obj, key) && obj[key] !== NULL;\n  }\n\n  map = {\n    size: 0,\n    empty: 0,\n    object: obj,\n    has: has,\n    get: function (key) {\n      return has(key) ? obj[key] : undefined;\n    },\n    set: function (key, value) {\n      if (!has(key)) {\n        ++map.size;\n        if (obj[key] === NULL) --map.empty;\n      }\n\n      obj[key] = value;\n      return this;\n    },\n    delete: function (key) {\n      if (has(key)) {\n        --map.size;\n        ++map.empty;\n        obj[key] = NULL;\n      }\n\n      return this;\n    },\n    clear: function () {\n      map.size = map.empty = 0;\n      map.object = obj = {};\n    },\n    test: function (_) {\n      if (arguments.length) {\n        test = _;\n        return map;\n      } else {\n        return test;\n      }\n    },\n    clean: function () {\n      var next = {},\n          size = 0,\n          key,\n          value;\n\n      for (key in obj) {\n        value = obj[key];\n\n        if (value !== NULL && (!test || !test(value))) {\n          next[key] = value;\n          ++size;\n        }\n      }\n\n      map.size = size;\n      map.empty = 0;\n      map.object = obj = next;\n    }\n  };\n  if (input) Object.keys(input).forEach(function (key) {\n    map.set(key, input[key]);\n  });\n  return map;\n}\n},{\"./hasOwnProperty\":\"zib3\"}],\"pvel\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _peek = _interopRequireDefault(require(\"./peek\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(range, value, threshold, left, right, center) {\n  if (!threshold && threshold !== 0) return center;\n  var a = range[0],\n      b = (0, _peek.default)(range),\n      t = +threshold,\n      l,\n      r; // swap endpoints if range is reversed\n\n  if (b < a) {\n    l = a;\n    a = b;\n    b = l;\n  } // compare value to endpoints\n\n\n  l = Math.abs(value - a);\n  r = Math.abs(b - value); // adjust if value is within threshold distance of endpoint\n\n  return l < r && l <= t ? left : r <= t ? right : center;\n}\n},{\"./peek\":\"Wjec\"}],\"PRDm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(child, parent) {\n  var proto = child.prototype = Object.create(parent.prototype);\n  proto.constructor = child;\n  return proto;\n}\n},{}],\"sgyw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n/**\n * Predicate that returns true if the value lies within the span\n * of the given range. The left and right flags control the use\n * of inclusive (true) or exclusive (false) comparisons.\n */\nfunction _default(value, range, left, right) {\n  var r0 = range[0],\n      r1 = range[range.length - 1],\n      t;\n\n  if (r0 > r1) {\n    t = r0;\n    r0 = r1;\n    r1 = t;\n  }\n\n  left = left === undefined || left;\n  right = right === undefined || right;\n  return (left ? r0 <= value : r0 < value) && (right ? value <= r1 : value < r1);\n}\n},{}],\"AVr2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return typeof _ === 'boolean';\n}\n},{}],\"itJR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return Object.prototype.toString.call(_) === '[object Date]';\n}\n},{}],\"Zipk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return typeof _ === 'number';\n}\n},{}],\"ncKZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return Object.prototype.toString.call(_) === '[object RegExp]';\n}\n},{}],\"kSeI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _accessor = _interopRequireDefault(require(\"./accessor\"));\n\nvar _array = _interopRequireDefault(require(\"./array\"));\n\nvar _splitAccessPath = _interopRequireDefault(require(\"./splitAccessPath\"));\n\nvar _stringValue = _interopRequireDefault(require(\"./stringValue\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(fields, flat) {\n  if (fields) {\n    fields = flat ? (0, _array.default)(fields).map(function (f) {\n      return f.replace(/\\\\(.)/g, '$1');\n    }) : (0, _array.default)(fields);\n  }\n\n  var fn = !(fields && fields.length) ? function () {\n    return '';\n  } : Function('_', 'return \\'\\'+' + fields.map(function (f) {\n    return '_[' + (flat ? (0, _stringValue.default)(f) : (0, _splitAccessPath.default)(f).map(_stringValue.default).join('][')) + ']';\n  }).join('+\\'|\\'+') + ';');\n  return (0, _accessor.default)(fn, fields, 'key');\n}\n},{\"./accessor\":\"BGyS\",\"./array\":\"PdkY\",\"./splitAccessPath\":\"xJ2K\",\"./stringValue\":\"vRqJ\"}],\"m9fa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _peek = _interopRequireDefault(require(\"./peek\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(array, frac) {\n  const lo = array[0],\n        hi = (0, _peek.default)(array),\n        f = +frac;\n  return !f ? lo : f === 1 ? hi : lo + f * (hi - lo);\n}\n},{\"./peek\":\"Wjec\"}],\"HXuE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(compare, array0, array1, output) {\n  var n0 = array0.length,\n      n1 = array1.length;\n  if (!n1) return array0;\n  if (!n0) return array1;\n  var merged = output || new array0.constructor(n0 + n1),\n      i0 = 0,\n      i1 = 0,\n      i = 0;\n\n  for (; i0 < n0 && i1 < n1; ++i) {\n    merged[i] = compare(array0[i0], array1[i1]) > 0 ? array1[i1++] : array0[i0++];\n  }\n\n  for (; i0 < n0; ++i0, ++i) {\n    merged[i] = array0[i0];\n  }\n\n  for (; i1 < n1; ++i1, ++i) {\n    merged[i] = array1[i1];\n  }\n\n  return merged;\n}\n},{}],\"zPYV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(str, reps) {\n  var s = '';\n\n  while (--reps >= 0) s += str;\n\n  return s;\n}\n},{}],\"EKoi\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _repeat = _interopRequireDefault(require(\"./repeat\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(str, length, padchar, align) {\n  var c = padchar || ' ',\n      s = str + '',\n      n = length - s.length;\n  return n <= 0 ? s : align === 'left' ? (0, _repeat.default)(c, n) + s : align === 'center' ? (0, _repeat.default)(c, ~~(n / 2)) + s + (0, _repeat.default)(c, Math.ceil(n / 2)) : s + (0, _repeat.default)(c, n);\n}\n},{\"./repeat\":\"zPYV\"}],\"gzto\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _peek = _interopRequireDefault(require(\"./peek\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Return the numerical span of an array: the difference between\n * the last and first values.\n */\nfunction _default(array) {\n  return array && (0, _peek.default)(array) - array[0] || 0;\n}\n},{\"./peek\":\"Wjec\"}],\"okNa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return _ == null || _ === '' ? null : !_ || _ === 'false' || _ === '0' ? false : !!_;\n}\n},{}],\"TxK6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _isDate = _interopRequireDefault(require(\"./isDate\"));\n\nvar _isNumber = _interopRequireDefault(require(\"./isNumber\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction defaultParser(_) {\n  return (0, _isNumber.default)(_) ? _ : (0, _isDate.default)(_) ? _ : Date.parse(_);\n}\n\nfunction _default(_, parser) {\n  parser = parser || defaultParser;\n  return _ == null || _ === '' ? null : parser(_);\n}\n},{\"./isDate\":\"itJR\",\"./isNumber\":\"Zipk\"}],\"Dun4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return _ == null || _ === '' ? null : _ + '';\n}\n},{}],\"HtRL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  for (var s = {}, i = 0, n = _.length; i < n; ++i) s[_[i]] = true;\n\n  return s;\n}\n},{}],\"NLqU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(str, length, align, ellipsis) {\n  var e = ellipsis != null ? ellipsis : '\\u2026',\n      s = str + '',\n      n = s.length,\n      l = Math.max(0, length - e.length);\n  return n <= length ? s : align === 'left' ? e + s.slice(n - l) : align === 'center' ? s.slice(0, Math.ceil(l / 2)) + e + s.slice(n - ~~(l / 2)) : s.slice(0, l) + e;\n}\n},{}],\"ioJO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(array, filter, visitor) {\n  if (array) {\n    var i = 0,\n        n = array.length,\n        t;\n\n    if (filter) {\n      for (; i < n; ++i) {\n        if (t = filter(array[i])) visitor(t, i, array);\n      }\n    } else {\n      array.forEach(visitor);\n    }\n  }\n}\n},{}],\"d61Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"accessor\", {\n  enumerable: true,\n  get: function () {\n    return _accessor.default;\n  }\n});\nObject.defineProperty(exports, \"accessorName\", {\n  enumerable: true,\n  get: function () {\n    return _accessor.accessorName;\n  }\n});\nObject.defineProperty(exports, \"accessorFields\", {\n  enumerable: true,\n  get: function () {\n    return _accessor.accessorFields;\n  }\n});\nObject.defineProperty(exports, \"id\", {\n  enumerable: true,\n  get: function () {\n    return _accessors.id;\n  }\n});\nObject.defineProperty(exports, \"identity\", {\n  enumerable: true,\n  get: function () {\n    return _accessors.identity;\n  }\n});\nObject.defineProperty(exports, \"zero\", {\n  enumerable: true,\n  get: function () {\n    return _accessors.zero;\n  }\n});\nObject.defineProperty(exports, \"one\", {\n  enumerable: true,\n  get: function () {\n    return _accessors.one;\n  }\n});\nObject.defineProperty(exports, \"truthy\", {\n  enumerable: true,\n  get: function () {\n    return _accessors.truthy;\n  }\n});\nObject.defineProperty(exports, \"falsy\", {\n  enumerable: true,\n  get: function () {\n    return _accessors.falsy;\n  }\n});\nObject.defineProperty(exports, \"logger\", {\n  enumerable: true,\n  get: function () {\n    return _logger.default;\n  }\n});\nObject.defineProperty(exports, \"None\", {\n  enumerable: true,\n  get: function () {\n    return _logger.None;\n  }\n});\nObject.defineProperty(exports, \"Error\", {\n  enumerable: true,\n  get: function () {\n    return _logger.Error;\n  }\n});\nObject.defineProperty(exports, \"Warn\", {\n  enumerable: true,\n  get: function () {\n    return _logger.Warn;\n  }\n});\nObject.defineProperty(exports, \"Info\", {\n  enumerable: true,\n  get: function () {\n    return _logger.Info;\n  }\n});\nObject.defineProperty(exports, \"Debug\", {\n  enumerable: true,\n  get: function () {\n    return _logger.Debug;\n  }\n});\nObject.defineProperty(exports, \"mergeConfig\", {\n  enumerable: true,\n  get: function () {\n    return _mergeConfig.mergeConfig;\n  }\n});\nObject.defineProperty(exports, \"writeConfig\", {\n  enumerable: true,\n  get: function () {\n    return _mergeConfig.writeConfig;\n  }\n});\nObject.defineProperty(exports, \"panLinear\", {\n  enumerable: true,\n  get: function () {\n    return _transform.panLinear;\n  }\n});\nObject.defineProperty(exports, \"panLog\", {\n  enumerable: true,\n  get: function () {\n    return _transform.panLog;\n  }\n});\nObject.defineProperty(exports, \"panPow\", {\n  enumerable: true,\n  get: function () {\n    return _transform.panPow;\n  }\n});\nObject.defineProperty(exports, \"panSymlog\", {\n  enumerable: true,\n  get: function () {\n    return _transform.panSymlog;\n  }\n});\nObject.defineProperty(exports, \"zoomLinear\", {\n  enumerable: true,\n  get: function () {\n    return _transform.zoomLinear;\n  }\n});\nObject.defineProperty(exports, \"zoomLog\", {\n  enumerable: true,\n  get: function () {\n    return _transform.zoomLog;\n  }\n});\nObject.defineProperty(exports, \"zoomPow\", {\n  enumerable: true,\n  get: function () {\n    return _transform.zoomPow;\n  }\n});\nObject.defineProperty(exports, \"zoomSymlog\", {\n  enumerable: true,\n  get: function () {\n    return _transform.zoomSymlog;\n  }\n});\nObject.defineProperty(exports, \"quarter\", {\n  enumerable: true,\n  get: function () {\n    return _quarter.quarter;\n  }\n});\nObject.defineProperty(exports, \"utcquarter\", {\n  enumerable: true,\n  get: function () {\n    return _quarter.utcquarter;\n  }\n});\nObject.defineProperty(exports, \"array\", {\n  enumerable: true,\n  get: function () {\n    return _array.default;\n  }\n});\nObject.defineProperty(exports, \"clampRange\", {\n  enumerable: true,\n  get: function () {\n    return _clampRange.default;\n  }\n});\nObject.defineProperty(exports, \"compare\", {\n  enumerable: true,\n  get: function () {\n    return _compare.default;\n  }\n});\nObject.defineProperty(exports, \"constant\", {\n  enumerable: true,\n  get: function () {\n    return _constant.default;\n  }\n});\nObject.defineProperty(exports, \"debounce\", {\n  enumerable: true,\n  get: function () {\n    return _debounce.default;\n  }\n});\nObject.defineProperty(exports, \"error\", {\n  enumerable: true,\n  get: function () {\n    return _error.default;\n  }\n});\nObject.defineProperty(exports, \"extend\", {\n  enumerable: true,\n  get: function () {\n    return _extend.default;\n  }\n});\nObject.defineProperty(exports, \"extent\", {\n  enumerable: true,\n  get: function () {\n    return _extent.default;\n  }\n});\nObject.defineProperty(exports, \"extentIndex\", {\n  enumerable: true,\n  get: function () {\n    return _extentIndex.default;\n  }\n});\nObject.defineProperty(exports, \"fastmap\", {\n  enumerable: true,\n  get: function () {\n    return _fastmap.default;\n  }\n});\nObject.defineProperty(exports, \"field\", {\n  enumerable: true,\n  get: function () {\n    return _field.default;\n  }\n});\nObject.defineProperty(exports, \"flush\", {\n  enumerable: true,\n  get: function () {\n    return _flush.default;\n  }\n});\nObject.defineProperty(exports, \"hasOwnProperty\", {\n  enumerable: true,\n  get: function () {\n    return _hasOwnProperty.default;\n  }\n});\nObject.defineProperty(exports, \"inherits\", {\n  enumerable: true,\n  get: function () {\n    return _inherits.default;\n  }\n});\nObject.defineProperty(exports, \"inrange\", {\n  enumerable: true,\n  get: function () {\n    return _inrange.default;\n  }\n});\nObject.defineProperty(exports, \"isArray\", {\n  enumerable: true,\n  get: function () {\n    return _isArray.default;\n  }\n});\nObject.defineProperty(exports, \"isBoolean\", {\n  enumerable: true,\n  get: function () {\n    return _isBoolean.default;\n  }\n});\nObject.defineProperty(exports, \"isDate\", {\n  enumerable: true,\n  get: function () {\n    return _isDate.default;\n  }\n});\nObject.defineProperty(exports, \"isFunction\", {\n  enumerable: true,\n  get: function () {\n    return _isFunction.default;\n  }\n});\nObject.defineProperty(exports, \"isNumber\", {\n  enumerable: true,\n  get: function () {\n    return _isNumber.default;\n  }\n});\nObject.defineProperty(exports, \"isObject\", {\n  enumerable: true,\n  get: function () {\n    return _isObject.default;\n  }\n});\nObject.defineProperty(exports, \"isRegExp\", {\n  enumerable: true,\n  get: function () {\n    return _isRegExp.default;\n  }\n});\nObject.defineProperty(exports, \"isString\", {\n  enumerable: true,\n  get: function () {\n    return _isString.default;\n  }\n});\nObject.defineProperty(exports, \"key\", {\n  enumerable: true,\n  get: function () {\n    return _key.default;\n  }\n});\nObject.defineProperty(exports, \"lerp\", {\n  enumerable: true,\n  get: function () {\n    return _lerp.default;\n  }\n});\nObject.defineProperty(exports, \"merge\", {\n  enumerable: true,\n  get: function () {\n    return _merge.default;\n  }\n});\nObject.defineProperty(exports, \"pad\", {\n  enumerable: true,\n  get: function () {\n    return _pad.default;\n  }\n});\nObject.defineProperty(exports, \"peek\", {\n  enumerable: true,\n  get: function () {\n    return _peek.default;\n  }\n});\nObject.defineProperty(exports, \"repeat\", {\n  enumerable: true,\n  get: function () {\n    return _repeat.default;\n  }\n});\nObject.defineProperty(exports, \"span\", {\n  enumerable: true,\n  get: function () {\n    return _span.default;\n  }\n});\nObject.defineProperty(exports, \"splitAccessPath\", {\n  enumerable: true,\n  get: function () {\n    return _splitAccessPath.default;\n  }\n});\nObject.defineProperty(exports, \"stringValue\", {\n  enumerable: true,\n  get: function () {\n    return _stringValue.default;\n  }\n});\nObject.defineProperty(exports, \"toBoolean\", {\n  enumerable: true,\n  get: function () {\n    return _toBoolean.default;\n  }\n});\nObject.defineProperty(exports, \"toDate\", {\n  enumerable: true,\n  get: function () {\n    return _toDate.default;\n  }\n});\nObject.defineProperty(exports, \"toNumber\", {\n  enumerable: true,\n  get: function () {\n    return _toNumber.default;\n  }\n});\nObject.defineProperty(exports, \"toString\", {\n  enumerable: true,\n  get: function () {\n    return _toString.default;\n  }\n});\nObject.defineProperty(exports, \"toSet\", {\n  enumerable: true,\n  get: function () {\n    return _toSet.default;\n  }\n});\nObject.defineProperty(exports, \"truncate\", {\n  enumerable: true,\n  get: function () {\n    return _truncate.default;\n  }\n});\nObject.defineProperty(exports, \"visitArray\", {\n  enumerable: true,\n  get: function () {\n    return _visitArray.default;\n  }\n});\n\nvar _accessor = _interopRequireWildcard(require(\"./src/accessor\"));\n\nvar _accessors = require(\"./src/accessors\");\n\nvar _logger = _interopRequireWildcard(require(\"./src/logger\"));\n\nvar _mergeConfig = require(\"./src/mergeConfig\");\n\nvar _transform = require(\"./src/transform\");\n\nvar _quarter = require(\"./src/quarter\");\n\nvar _array = _interopRequireDefault(require(\"./src/array\"));\n\nvar _clampRange = _interopRequireDefault(require(\"./src/clampRange\"));\n\nvar _compare = _interopRequireDefault(require(\"./src/compare\"));\n\nvar _constant = _interopRequireDefault(require(\"./src/constant\"));\n\nvar _debounce = _interopRequireDefault(require(\"./src/debounce\"));\n\nvar _error = _interopRequireDefault(require(\"./src/error\"));\n\nvar _extend = _interopRequireDefault(require(\"./src/extend\"));\n\nvar _extent = _interopRequireDefault(require(\"./src/extent\"));\n\nvar _extentIndex = _interopRequireDefault(require(\"./src/extentIndex\"));\n\nvar _fastmap = _interopRequireDefault(require(\"./src/fastmap\"));\n\nvar _field = _interopRequireDefault(require(\"./src/field\"));\n\nvar _flush = _interopRequireDefault(require(\"./src/flush\"));\n\nvar _hasOwnProperty = _interopRequireDefault(require(\"./src/hasOwnProperty\"));\n\nvar _inherits = _interopRequireDefault(require(\"./src/inherits\"));\n\nvar _inrange = _interopRequireDefault(require(\"./src/inrange\"));\n\nvar _isArray = _interopRequireDefault(require(\"./src/isArray\"));\n\nvar _isBoolean = _interopRequireDefault(require(\"./src/isBoolean\"));\n\nvar _isDate = _interopRequireDefault(require(\"./src/isDate\"));\n\nvar _isFunction = _interopRequireDefault(require(\"./src/isFunction\"));\n\nvar _isNumber = _interopRequireDefault(require(\"./src/isNumber\"));\n\nvar _isObject = _interopRequireDefault(require(\"./src/isObject\"));\n\nvar _isRegExp = _interopRequireDefault(require(\"./src/isRegExp\"));\n\nvar _isString = _interopRequireDefault(require(\"./src/isString\"));\n\nvar _key = _interopRequireDefault(require(\"./src/key\"));\n\nvar _lerp = _interopRequireDefault(require(\"./src/lerp\"));\n\nvar _merge = _interopRequireDefault(require(\"./src/merge\"));\n\nvar _pad = _interopRequireDefault(require(\"./src/pad\"));\n\nvar _peek = _interopRequireDefault(require(\"./src/peek\"));\n\nvar _repeat = _interopRequireDefault(require(\"./src/repeat\"));\n\nvar _span = _interopRequireDefault(require(\"./src/span\"));\n\nvar _splitAccessPath = _interopRequireDefault(require(\"./src/splitAccessPath\"));\n\nvar _stringValue = _interopRequireDefault(require(\"./src/stringValue\"));\n\nvar _toBoolean = _interopRequireDefault(require(\"./src/toBoolean\"));\n\nvar _toDate = _interopRequireDefault(require(\"./src/toDate\"));\n\nvar _toNumber = _interopRequireDefault(require(\"./src/toNumber\"));\n\nvar _toString = _interopRequireDefault(require(\"./src/toString\"));\n\nvar _toSet = _interopRequireDefault(require(\"./src/toSet\"));\n\nvar _truncate = _interopRequireDefault(require(\"./src/truncate\"));\n\nvar _visitArray = _interopRequireDefault(require(\"./src/visitArray\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./src/accessor\":\"BGyS\",\"./src/accessors\":\"J93T\",\"./src/logger\":\"dAUM\",\"./src/mergeConfig\":\"rT7K\",\"./src/transform\":\"EmM0\",\"./src/quarter\":\"iZoX\",\"./src/array\":\"PdkY\",\"./src/clampRange\":\"jwZR\",\"./src/compare\":\"aK6Z\",\"./src/constant\":\"W5PT\",\"./src/debounce\":\"Ntmh\",\"./src/error\":\"s25t\",\"./src/extend\":\"HQJV\",\"./src/extent\":\"OkrY\",\"./src/extentIndex\":\"Z8q2\",\"./src/fastmap\":\"RJuX\",\"./src/field\":\"HNH3\",\"./src/flush\":\"pvel\",\"./src/hasOwnProperty\":\"zib3\",\"./src/inherits\":\"PRDm\",\"./src/inrange\":\"sgyw\",\"./src/isArray\":\"PCQs\",\"./src/isBoolean\":\"AVr2\",\"./src/isDate\":\"itJR\",\"./src/isFunction\":\"AAFW\",\"./src/isNumber\":\"Zipk\",\"./src/isObject\":\"DbRQ\",\"./src/isRegExp\":\"ncKZ\",\"./src/isString\":\"VyNU\",\"./src/key\":\"kSeI\",\"./src/lerp\":\"m9fa\",\"./src/merge\":\"HXuE\",\"./src/pad\":\"EKoi\",\"./src/peek\":\"Wjec\",\"./src/repeat\":\"zPYV\",\"./src/span\":\"gzto\",\"./src/splitAccessPath\":\"xJ2K\",\"./src/stringValue\":\"vRqJ\",\"./src/toBoolean\":\"okNa\",\"./src/toDate\":\"TxK6\",\"./src/toNumber\":\"IqMN\",\"./src/toString\":\"Dun4\",\"./src/toSet\":\"HtRL\",\"./src/truncate\":\"NLqU\",\"./src/visitArray\":\"ioJO\"}],\"O7PN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = UniqueList;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction UniqueList(idFunc) {\n  var $ = idFunc || _vegaUtil.identity,\n      list = [],\n      ids = {};\n\n  list.add = function (_) {\n    var id = $(_);\n\n    if (!ids[id]) {\n      ids[id] = 1;\n      list.push(_);\n    }\n\n    return list;\n  };\n\n  list.remove = function (_) {\n    var id = $(_),\n        idx;\n\n    if (ids[id]) {\n      ids[id] = 0;\n\n      if ((idx = list.indexOf(_)) >= 0) {\n        list.splice(idx, 1);\n      }\n    }\n\n    return list;\n  };\n\n  return list;\n}\n},{\"vega-util\":\"d61Z\"}],\"rHZf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n/**\n * Invoke and await a potentially async callback function. If\n * an error occurs, trap it and route to Dataflow.error.\n * @param {Dataflow} df - The dataflow instance\n * @param {function} callback - A callback function to invoke\n *   and then await. The dataflow will be passed as the single\n *   argument to the function.\n */\nasync function _default(df, callback) {\n  try {\n    await callback(df);\n  } catch (err) {\n    df.error(err);\n  }\n}\n},{}],\"KyIt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.reset = reset;\nexports.isTuple = isTuple;\nexports.tupleid = tupleid;\nexports.ingest = ingest;\nexports.derive = derive;\nexports.rederive = rederive;\nexports.replace = replace;\nexports.stableCompare = stableCompare;\nvar TUPLE_ID_KEY = Symbol('vega_id'),\n    TUPLE_ID = 1;\n/**\n * Resets the internal tuple id counter to one.\n */\n\nfunction reset() {\n  TUPLE_ID = 1;\n}\n/**\n * Checks if an input value is a registered tuple.\n * @param {*} t - The value to check.\n * @return {boolean} True if the input is a tuple, false otherwise.\n */\n\n\nfunction isTuple(t) {\n  return !!(t && tupleid(t));\n}\n/**\n * Returns the id of a tuple.\n * @param {object} t - The input tuple.\n * @return {*} the tuple id.\n */\n\n\nfunction tupleid(t) {\n  return t[TUPLE_ID_KEY];\n}\n/**\n * Sets the id of a tuple.\n * @param {object} t - The input tuple.\n * @param {*} id - The id value to set.\n * @return {object} the input tuple.\n */\n\n\nfunction setid(t, id) {\n  t[TUPLE_ID_KEY] = id;\n  return t;\n}\n/**\n * Ingest an object or value as a data tuple.\n * If the input value is an object, an id field will be added to it. For\n * efficiency, the input object is modified directly. A copy is not made.\n * If the input value is a literal, it will be wrapped in a new object\n * instance, with the value accessible as the 'data' property.\n * @param datum - The value to ingest.\n * @return {object} The ingested data tuple.\n */\n\n\nfunction ingest(datum) {\n  var t = datum === Object(datum) ? datum : {\n    data: datum\n  };\n  return tupleid(t) ? t : setid(t, TUPLE_ID++);\n}\n/**\n * Given a source tuple, return a derived copy.\n * @param {object} t - The source tuple.\n * @return {object} The derived tuple.\n */\n\n\nfunction derive(t) {\n  return rederive(t, ingest({}));\n}\n/**\n * Rederive a derived tuple by copying values from the source tuple.\n * @param {object} t - The source tuple.\n * @param {object} d - The derived tuple.\n * @return {object} The derived tuple.\n */\n\n\nfunction rederive(t, d) {\n  for (var k in t) d[k] = t[k];\n\n  return d;\n}\n/**\n * Replace an existing tuple with a new tuple.\n * @param {object} t - The existing data tuple.\n * @param {object} d - The new tuple that replaces the old.\n * @return {object} The new tuple.\n */\n\n\nfunction replace(t, d) {\n  return setid(d, tupleid(t));\n}\n/**\n * Generate an augmented comparator function that provides stable\n * sorting by tuple id when the given comparator produces ties.\n * @param {function} cmp - The comparator to augment.\n * @param {function} [f] - Optional tuple accessor function.\n * @return {function} An augmented comparator function.\n */\n\n\nfunction stableCompare(cmp, f) {\n  return !cmp ? null : f ? (a, b) => cmp(a, b) || tupleid(f(a)) - tupleid(f(b)) : (a, b) => cmp(a, b) || tupleid(a) - tupleid(b);\n}\n},{}],\"m0dW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isChangeSet = isChangeSet;\nexports.default = changeset;\n\nvar _Tuple = require(\"./Tuple\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction isChangeSet(v) {\n  return v && v.constructor === changeset;\n}\n\nfunction changeset() {\n  var add = [],\n      // insert tuples\n  rem = [],\n      // remove tuples\n  mod = [],\n      // modify tuples\n  remp = [],\n      // remove by predicate\n  modp = [],\n      // modify by predicate\n  reflow = false;\n  return {\n    constructor: changeset,\n    insert: function (t) {\n      var d = (0, _vegaUtil.array)(t),\n          i = 0,\n          n = d.length;\n\n      for (; i < n; ++i) add.push(d[i]);\n\n      return this;\n    },\n    remove: function (t) {\n      var a = (0, _vegaUtil.isFunction)(t) ? remp : rem,\n          d = (0, _vegaUtil.array)(t),\n          i = 0,\n          n = d.length;\n\n      for (; i < n; ++i) a.push(d[i]);\n\n      return this;\n    },\n    modify: function (t, field, value) {\n      var m = {\n        field: field,\n        value: (0, _vegaUtil.constant)(value)\n      };\n\n      if ((0, _vegaUtil.isFunction)(t)) {\n        m.filter = t;\n        modp.push(m);\n      } else {\n        m.tuple = t;\n        mod.push(m);\n      }\n\n      return this;\n    },\n    encode: function (t, set) {\n      if ((0, _vegaUtil.isFunction)(t)) modp.push({\n        filter: t,\n        field: set\n      });else mod.push({\n        tuple: t,\n        field: set\n      });\n      return this;\n    },\n    reflow: function () {\n      reflow = true;\n      return this;\n    },\n    pulse: function (pulse, tuples) {\n      var cur = {},\n          out = {},\n          i,\n          n,\n          m,\n          f,\n          t,\n          id; // build lookup table of current tuples\n\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        cur[(0, _Tuple.tupleid)(tuples[i])] = 1;\n      } // process individual tuples to remove\n\n\n      for (i = 0, n = rem.length; i < n; ++i) {\n        t = rem[i];\n        cur[(0, _Tuple.tupleid)(t)] = -1;\n      } // process predicate-based removals\n\n\n      for (i = 0, n = remp.length; i < n; ++i) {\n        f = remp[i];\n        tuples.forEach(function (t) {\n          if (f(t)) cur[(0, _Tuple.tupleid)(t)] = -1;\n        });\n      } // process all add tuples\n\n\n      for (i = 0, n = add.length; i < n; ++i) {\n        t = add[i];\n        id = (0, _Tuple.tupleid)(t);\n\n        if (cur[id]) {\n          // tuple already resides in dataset\n          // if flagged for both add and remove, cancel\n          cur[id] = 1;\n        } else {\n          // tuple does not reside in dataset, add\n          pulse.add.push((0, _Tuple.ingest)(add[i]));\n        }\n      } // populate pulse rem list\n\n\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        t = tuples[i];\n        if (cur[(0, _Tuple.tupleid)(t)] < 0) pulse.rem.push(t);\n      } // modify helper method\n\n\n      function modify(t, f, v) {\n        if (v) {\n          t[f] = v(t);\n        } else {\n          pulse.encode = f;\n        }\n\n        if (!reflow) out[(0, _Tuple.tupleid)(t)] = t;\n      } // process individual tuples to modify\n\n\n      for (i = 0, n = mod.length; i < n; ++i) {\n        m = mod[i];\n        t = m.tuple;\n        f = m.field;\n        id = cur[(0, _Tuple.tupleid)(t)];\n\n        if (id > 0) {\n          modify(t, f, m.value);\n          pulse.modifies(f);\n        }\n      } // process predicate-based modifications\n\n\n      for (i = 0, n = modp.length; i < n; ++i) {\n        m = modp[i];\n        f = m.filter;\n        tuples.forEach(function (t) {\n          if (f(t) && cur[(0, _Tuple.tupleid)(t)] > 0) {\n            modify(t, m.field, m.value);\n          }\n        });\n        pulse.modifies(m.field);\n      } // upon reflow request, populate mod with all non-removed tuples\n      // otherwise, populate mod with modified tuples only\n\n\n      if (reflow) {\n        pulse.mod = rem.length || remp.length ? tuples.filter(function (t) {\n          return cur[(0, _Tuple.tupleid)(t)] > 0;\n        }) : tuples.slice();\n      } else {\n        for (id in out) pulse.mod.push(out[id]);\n      }\n\n      return pulse;\n    }\n  };\n}\n},{\"./Tuple\":\"KyIt\",\"vega-util\":\"d61Z\"}],\"DM4c\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Parameters;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar CACHE = '_:mod:_';\n/**\n * Hash that tracks modifications to assigned values.\n * Callers *must* use the set method to update values.\n */\n\nfunction Parameters() {\n  Object.defineProperty(this, CACHE, {\n    writable: true,\n    value: {}\n  });\n}\n\nvar prototype = Parameters.prototype;\n/**\n * Set a parameter value. If the parameter value changes, the parameter\n * will be recorded as modified.\n * @param {string} name - The parameter name.\n * @param {number} index - The index into an array-value parameter. Ignored if\n *   the argument is undefined, null or less than zero.\n * @param {*} value - The parameter value to set.\n * @param {boolean} [force=false] - If true, records the parameter as modified\n *   even if the value is unchanged.\n * @return {Parameters} - This parameter object.\n */\n\nprototype.set = function (name, index, value, force) {\n  var o = this,\n      v = o[name],\n      mod = o[CACHE];\n\n  if (index != null && index >= 0) {\n    if (v[index] !== value || force) {\n      v[index] = value;\n      mod[index + ':' + name] = -1;\n      mod[name] = -1;\n    }\n  } else if (v !== value || force) {\n    o[name] = value;\n    mod[name] = (0, _vegaUtil.isArray)(value) ? 1 + value.length : -1;\n  }\n\n  return o;\n};\n/**\n * Tests if one or more parameters has been modified. If invoked with no\n * arguments, returns true if any parameter value has changed. If the first\n * argument is array, returns trues if any parameter name in the array has\n * changed. Otherwise, tests if the given name and optional array index has\n * changed.\n * @param {string} name - The parameter name to test.\n * @param {number} [index=undefined] - The parameter array index to test.\n * @return {boolean} - Returns true if a queried parameter was modified.\n */\n\n\nprototype.modified = function (name, index) {\n  var mod = this[CACHE],\n      k;\n\n  if (!arguments.length) {\n    for (k in mod) {\n      if (mod[k]) return true;\n    }\n\n    return false;\n  } else if ((0, _vegaUtil.isArray)(name)) {\n    for (k = 0; k < name.length; ++k) {\n      if (mod[name[k]]) return true;\n    }\n\n    return false;\n  }\n\n  return index != null && index >= 0 ? index + 1 < mod[name] || !!mod[index + ':' + name] : !!mod[name];\n};\n/**\n * Clears the modification records. After calling this method,\n * all parameters are considered unmodified.\n */\n\n\nprototype.clear = function () {\n  this[CACHE] = {};\n  return this;\n};\n},{\"vega-util\":\"d61Z\"}],\"Vr5X\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Operator;\n\nvar _Parameters = _interopRequireDefault(require(\"./Parameters\"));\n\nvar _UniqueList = _interopRequireDefault(require(\"./util/UniqueList\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar OP_ID = 0;\nvar PULSE = 'pulse';\nvar NO_PARAMS = new _Parameters.default(); // Boolean Flags\n\nvar SKIP = 1,\n    MODIFIED = 2;\n/**\n * An Operator is a processing node in a dataflow graph.\n * Each operator stores a value and an optional value update function.\n * Operators can accept a hash of named parameters. Parameter values can\n * either be direct (JavaScript literals, arrays, objects) or indirect\n * (other operators whose values will be pulled dynamically). Operators\n * included as parameters will have this operator added as a dependency.\n * @constructor\n * @param {*} [init] - The initial value for this operator.\n * @param {function(object, Pulse)} [update] - An update function. Upon\n *   evaluation of this operator, the update function will be invoked and the\n *   return value will be used as the new value of this operator.\n * @param {object} [params] - The parameters for this operator.\n * @param {boolean} [react=true] - Flag indicating if this operator should\n *   listen for changes to upstream operators included as parameters.\n * @see parameters\n */\n\nfunction Operator(init, update, params, react) {\n  this.id = ++OP_ID;\n  this.value = init;\n  this.stamp = -1;\n  this.rank = -1;\n  this.qrank = -1;\n  this.flags = 0;\n\n  if (update) {\n    this._update = update;\n  }\n\n  if (params) this.parameters(params, react);\n}\n\nvar prototype = Operator.prototype;\n/**\n * Returns a list of target operators dependent on this operator.\n * If this list does not exist, it is created and then returned.\n * @return {UniqueList}\n */\n\nprototype.targets = function () {\n  return this._targets || (this._targets = (0, _UniqueList.default)(_vegaUtil.id));\n};\n/**\n * Sets the value of this operator.\n * @param {*} value - the value to set.\n * @return {Number} Returns 1 if the operator value has changed\n *   according to strict equality, returns 0 otherwise.\n */\n\n\nprototype.set = function (value) {\n  if (this.value !== value) {\n    this.value = value;\n    return 1;\n  } else {\n    return 0;\n  }\n};\n\nfunction flag(bit) {\n  return function (state) {\n    var f = this.flags;\n    if (arguments.length === 0) return !!(f & bit);\n    this.flags = state ? f | bit : f & ~bit;\n    return this;\n  };\n}\n/**\n * Indicates that operator evaluation should be skipped on the next pulse.\n * This operator will still propagate incoming pulses, but its update function\n * will not be invoked. The skip flag is reset after every pulse, so calling\n * this method will affect processing of the next pulse only.\n */\n\n\nprototype.skip = flag(SKIP);\n/**\n * Indicates that this operator's value has been modified on its most recent\n * pulse. Normally modification is checked via strict equality; however, in\n * some cases it is more efficient to update the internal state of an object.\n * In those cases, the modified flag can be used to trigger propagation. Once\n * set, the modification flag persists across pulses until unset. The flag can\n * be used with the last timestamp to test if a modification is recent.\n */\n\nprototype.modified = flag(MODIFIED);\n/**\n * Sets the parameters for this operator. The parameter values are analyzed for\n * operator instances. If found, this operator will be added as a dependency\n * of the parameterizing operator. Operator values are dynamically marshalled\n * from each operator parameter prior to evaluation. If a parameter value is\n * an array, the array will also be searched for Operator instances. However,\n * the search does not recurse into sub-arrays or object properties.\n * @param {object} params - A hash of operator parameters.\n * @param {boolean} [react=true] - A flag indicating if this operator should\n *   automatically update (react) when parameter values change. In other words,\n *   this flag determines if the operator registers itself as a listener on\n *   any upstream operators included in the parameters.\n * @param {boolean} [initonly=false] - A flag indicating if this operator\n *   should calculate an update only upon its initiatal evaluation, then\n *   deregister dependencies and suppress all future update invocations.\n * @return {Operator[]} - An array of upstream dependencies.\n */\n\nprototype.parameters = function (params, react, initonly) {\n  react = react !== false;\n  var self = this,\n      argval = self._argval = self._argval || new _Parameters.default(),\n      argops = self._argops = self._argops || [],\n      deps = [],\n      name,\n      value,\n      n,\n      i;\n\n  function add(name, index, value) {\n    if (value instanceof Operator) {\n      if (value !== self) {\n        if (react) value.targets().add(self);\n        deps.push(value);\n      }\n\n      argops.push({\n        op: value,\n        name: name,\n        index: index\n      });\n    } else {\n      argval.set(name, index, value);\n    }\n  }\n\n  for (name in params) {\n    value = params[name];\n\n    if (name === PULSE) {\n      (0, _vegaUtil.array)(value).forEach(function (op) {\n        if (!(op instanceof Operator)) {\n          (0, _vegaUtil.error)('Pulse parameters must be operator instances.');\n        } else if (op !== self) {\n          op.targets().add(self);\n          deps.push(op);\n        }\n      });\n      self.source = value;\n    } else if ((0, _vegaUtil.isArray)(value)) {\n      argval.set(name, -1, Array(n = value.length));\n\n      for (i = 0; i < n; ++i) add(name, i, value[i]);\n    } else {\n      add(name, -1, value);\n    }\n  }\n\n  this.marshall().clear(); // initialize values\n\n  if (initonly) argops.initonly = true;\n  return deps;\n};\n/**\n * Internal method for marshalling parameter values.\n * Visits each operator dependency to pull the latest value.\n * @return {Parameters} A Parameters object to pass to the update function.\n */\n\n\nprototype.marshall = function (stamp) {\n  var argval = this._argval || NO_PARAMS,\n      argops = this._argops,\n      item,\n      i,\n      n,\n      op,\n      mod;\n\n  if (argops) {\n    for (i = 0, n = argops.length; i < n; ++i) {\n      item = argops[i];\n      op = item.op;\n      mod = op.modified() && op.stamp === stamp;\n      argval.set(item.name, item.index, op.value, mod);\n    }\n\n    if (argops.initonly) {\n      for (i = 0; i < n; ++i) {\n        item = argops[i];\n        item.op.targets().remove(this);\n      }\n\n      this._argops = null;\n      this._update = null;\n    }\n  }\n\n  return argval;\n};\n/**\n * Delegate method to perform operator processing.\n * Subclasses can override this method to perform custom processing.\n * By default, it marshalls parameters and calls the update function\n * if that function is defined. If the update function does not\n * change the operator value then StopPropagation is returned.\n * If no update function is defined, this method does nothing.\n * @param {Pulse} pulse - the current dataflow pulse.\n * @return The output pulse or StopPropagation. A falsy return value\n *   (including undefined) will let the input pulse pass through.\n */\n\n\nprototype.evaluate = function (pulse) {\n  var update = this._update;\n\n  if (update) {\n    var params = this.marshall(pulse.stamp),\n        v = update.call(this, params, pulse);\n    params.clear();\n\n    if (v !== this.value) {\n      this.value = v;\n    } else if (!this.modified()) {\n      return pulse.StopPropagation;\n    }\n  }\n};\n/**\n * Run this operator for the current pulse. If this operator has already\n * been run at (or after) the pulse timestamp, returns StopPropagation.\n * Internally, this method calls {@link evaluate} to perform processing.\n * If {@link evaluate} returns a falsy value, the input pulse is returned.\n * This method should NOT be overridden, instead overrride {@link evaluate}.\n * @param {Pulse} pulse - the current dataflow pulse.\n * @return the output pulse for this operator (or StopPropagation)\n */\n\n\nprototype.run = function (pulse) {\n  if (pulse.stamp < this.stamp) return pulse.StopPropagation;\n  var rv;\n\n  if (this.skip()) {\n    this.skip(false);\n    rv = 0;\n  } else {\n    rv = this.evaluate(pulse);\n  }\n\n  return this.pulse = rv || pulse;\n};\n},{\"./Parameters\":\"DM4c\",\"./util/UniqueList\":\"O7PN\",\"vega-util\":\"d61Z\"}],\"FcJj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _Operator = _interopRequireDefault(require(\"../Operator\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Add an operator to the dataflow graph. This function accepts a\n * variety of input argument types. The basic signature supports an\n * initial value, update function and parameters. If the first parameter\n * is an Operator instance, it will be added directly. If it is a\n * constructor for an Operator subclass, a new instance will be instantiated.\n * Otherwise, if the first parameter is a function instance, it will be used\n * as the update function and a null initial value is assumed.\n * @param {*} init - One of: the operator to add, the initial value of\n *   the operator, an operator class to instantiate, or an update function.\n * @param {function} [update] - The operator update function.\n * @param {object} [params] - The operator parameters.\n * @param {boolean} [react=true] - Flag indicating if this operator should\n *   listen for changes to upstream operators included as parameters.\n * @return {Operator} - The added operator.\n */\nfunction _default(init, update, params, react) {\n  var shift = 1,\n      op;\n\n  if (init instanceof _Operator.default) {\n    op = init;\n  } else if (init && init.prototype instanceof _Operator.default) {\n    op = new init();\n  } else if ((0, _vegaUtil.isFunction)(init)) {\n    op = new _Operator.default(null, init);\n  } else {\n    shift = 0;\n    op = new _Operator.default(init, update);\n  }\n\n  this.rank(op);\n\n  if (shift) {\n    react = params;\n    params = update;\n  }\n\n  if (params) this.connect(op, op.parameters(params, react));\n  this.touch(op);\n  return op;\n}\n},{\"../Operator\":\"Vr5X\",\"vega-util\":\"d61Z\"}],\"paSg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n/**\n * Connect a target operator as a dependent of source operators.\n * If necessary, this method will rerank the target operator and its\n * dependents to ensure propagation proceeds in a topologically sorted order.\n * @param {Operator} target - The target operator.\n * @param {Array<Operator>} - The source operators that should propagate\n *   to the target operator.\n */\nfunction _default(target, sources) {\n  var targetRank = target.rank,\n      i,\n      n;\n\n  for (i = 0, n = sources.length; i < n; ++i) {\n    if (targetRank < sources[i].rank) {\n      this.rerank(target);\n      return;\n    }\n  }\n}\n},{}],\"QOmR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = EventStream;\nexports.stream = stream;\n\nvar _UniqueList = _interopRequireDefault(require(\"./util/UniqueList\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar STREAM_ID = 0;\n/**\n * Models an event stream.\n * @constructor\n * @param {function(Object, number): boolean} [filter] - Filter predicate.\n *   Events pass through when truthy, events are suppressed when falsy.\n * @param {function(Object): *} [apply] - Applied to input events to produce\n *   new event values.\n * @param {function(Object)} [receive] - Event callback function to invoke\n *   upon receipt of a new event. Use to override standard event processing.\n */\n\nfunction EventStream(filter, apply, receive) {\n  this.id = ++STREAM_ID;\n  this.value = null;\n  if (receive) this.receive = receive;\n  if (filter) this._filter = filter;\n  if (apply) this._apply = apply;\n}\n/**\n * Creates a new event stream instance with the provided\n * (optional) filter, apply and receive functions.\n * @param {function(Object, number): boolean} [filter] - Filter predicate.\n *   Events pass through when truthy, events are suppressed when falsy.\n * @param {function(Object): *} [apply] - Applied to input events to produce\n *   new event values.\n * @see EventStream\n */\n\n\nfunction stream(filter, apply, receive) {\n  return new EventStream(filter, apply, receive);\n}\n\nvar prototype = EventStream.prototype;\nprototype._filter = _vegaUtil.truthy;\nprototype._apply = _vegaUtil.identity;\n\nprototype.targets = function () {\n  return this._targets || (this._targets = (0, _UniqueList.default)(_vegaUtil.id));\n};\n\nprototype.consume = function (_) {\n  if (!arguments.length) return !!this._consume;\n  this._consume = !!_;\n  return this;\n};\n\nprototype.receive = function (evt) {\n  if (this._filter(evt)) {\n    var val = this.value = this._apply(evt),\n        trg = this._targets,\n        n = trg ? trg.length : 0,\n        i = 0;\n\n    for (; i < n; ++i) trg[i].receive(val);\n\n    if (this._consume) {\n      evt.preventDefault();\n      evt.stopPropagation();\n    }\n  }\n};\n\nprototype.filter = function (filter) {\n  var s = stream(filter);\n  this.targets().add(s);\n  return s;\n};\n\nprototype.apply = function (apply) {\n  var s = stream(null, apply);\n  this.targets().add(s);\n  return s;\n};\n\nprototype.merge = function () {\n  var s = stream();\n  this.targets().add(s);\n\n  for (var i = 0, n = arguments.length; i < n; ++i) {\n    arguments[i].targets().add(s);\n  }\n\n  return s;\n};\n\nprototype.throttle = function (pause) {\n  var t = -1;\n  return this.filter(function () {\n    var now = Date.now();\n\n    if (now - t > pause) {\n      t = now;\n      return 1;\n    } else {\n      return 0;\n    }\n  });\n};\n\nprototype.debounce = function (delay) {\n  var s = stream();\n  this.targets().add(stream(null, null, (0, _vegaUtil.debounce)(delay, function (e) {\n    var df = e.dataflow;\n    s.receive(e);\n    if (df && df.run) df.run();\n  })));\n  return s;\n};\n\nprototype.between = function (a, b) {\n  var active = false;\n  a.targets().add(stream(null, null, function () {\n    active = true;\n  }));\n  b.targets().add(stream(null, null, function () {\n    active = false;\n  }));\n  return this.filter(function () {\n    return active;\n  });\n};\n},{\"./util/UniqueList\":\"O7PN\",\"vega-util\":\"d61Z\"}],\"XD2N\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _EventStream = require(\"../EventStream\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Create a new event stream from an event source.\n * @param {object} source - The event source to monitor. The input must\n *  support the addEventListener method.\n * @param {string} type - The event type.\n * @param {function(object): boolean} [filter] - Event filter function.\n * @param {function(object): *} [apply] - Event application function.\n *   If provided, this function will be invoked and the result will be\n *   used as the downstream event value.\n * @return {EventStream}\n */\nfunction _default(source, type, filter, apply) {\n  var df = this,\n      s = (0, _EventStream.stream)(filter, apply),\n      send = function (e) {\n    e.dataflow = df;\n\n    try {\n      s.receive(e);\n    } catch (error) {\n      df.error(error);\n    } finally {\n      df.run();\n    }\n  },\n      sources;\n\n  if (typeof source === 'string' && typeof document !== 'undefined') {\n    sources = document.querySelectorAll(source);\n  } else {\n    sources = (0, _vegaUtil.array)(source);\n  }\n\n  for (var i = 0, n = sources.length; i < n; ++i) {\n    sources[i].addEventListener(type, send);\n  }\n\n  return s;\n}\n},{\"../EventStream\":\"QOmR\",\"vega-util\":\"d61Z\"}],\"b5x5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\n// Matches absolute URLs with optional protocol\n//   https://...    file://...    //...\nconst protocol_re = /^([A-Za-z]+:)?\\/\\//; // Matches allowed URIs. From https://github.com/cure53/DOMPurify/blob/master/src/regexp.js with added file://\n\nconst allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i; // eslint-disable-line no-useless-escape\n\nconst whitespace_re = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205f\\u3000]/g; // eslint-disable-line no-control-regex\n// Special treatment in node.js for the file: protocol\n\nconst fileProtocol = 'file://';\n/**\n * Factory for a loader constructor that provides methods for requesting\n * files from either the network or disk, and for sanitizing request URIs.\n * @param {function} fetch - The Fetch API for HTTP network requests.\n *   If null or undefined, HTTP loading will be disabled.\n * @param {object} fs - The file system interface for file loading.\n *   If null or undefined, local file loading will be disabled.\n * @return {function} A loader constructor with the following signature:\n *   param {object} [options] - Optional default loading options to use.\n *   return {object} - A new loader instance.\n */\n\nfunction _default(fetch, fs) {\n  return function (options) {\n    return {\n      options: options || {},\n      sanitize: sanitize,\n      load: load,\n      fileAccess: !!fs,\n      file: fileLoader(fs),\n      http: httpLoader(fetch)\n    };\n  };\n}\n/**\n * Load an external resource, typically either from the web or from the local\n * filesystem. This function uses {@link sanitize} to first sanitize the uri,\n * then calls either {@link http} (for web requests) or {@link file} (for\n * filesystem loading).\n * @param {string} uri - The resource indicator (e.g., URL or filename).\n * @param {object} [options] - Optional loading options. These options will\n *   override any existing default options.\n * @return {Promise} - A promise that resolves to the loaded content.\n */\n\n\nasync function load(uri, options) {\n  const opt = await this.sanitize(uri, options),\n        url = opt.href;\n  return opt.localFile ? this.file(url) : this.http(url, options);\n}\n/**\n * URI sanitizer function.\n * @param {string} uri - The uri (url or filename) to sanity check.\n * @param {object} options - An options hash.\n * @return {Promise} - A promise that resolves to an object containing\n *  sanitized uri data, or rejects it the input uri is deemed invalid.\n *  The properties of the resolved object are assumed to be\n *  valid attributes for an HTML 'a' tag. The sanitized uri *must* be\n *  provided by the 'href' property of the returned object.\n */\n\n\nasync function sanitize(uri, options) {\n  options = (0, _vegaUtil.extend)({}, this.options, options);\n  const fileAccess = this.fileAccess,\n        result = {\n    href: null\n  };\n  let isFile, loadFile, base;\n  const isAllowed = allowed_re.test(uri.replace(whitespace_re, ''));\n\n  if (uri == null || typeof uri !== 'string' || !isAllowed) {\n    (0, _vegaUtil.error)('Sanitize failure, invalid URI: ' + (0, _vegaUtil.stringValue)(uri));\n  }\n\n  const hasProtocol = protocol_re.test(uri); // if relative url (no protocol/host), prepend baseURL\n\n  if ((base = options.baseURL) && !hasProtocol) {\n    // Ensure that there is a slash between the baseURL (e.g. hostname) and url\n    if (!uri.startsWith('/') && base[base.length - 1] !== '/') {\n      uri = '/' + uri;\n    }\n\n    uri = base + uri;\n  } // should we load from file system?\n\n\n  loadFile = (isFile = uri.startsWith(fileProtocol)) || options.mode === 'file' || options.mode !== 'http' && !hasProtocol && fileAccess;\n\n  if (isFile) {\n    // strip file protocol\n    uri = uri.slice(fileProtocol.length);\n  } else if (uri.startsWith('//')) {\n    if (options.defaultProtocol === 'file') {\n      // if is file, strip protocol and set loadFile flag\n      uri = uri.slice(2);\n      loadFile = true;\n    } else {\n      // if relative protocol (starts with '//'), prepend default protocol\n      uri = (options.defaultProtocol || 'http') + ':' + uri;\n    }\n  } // set non-enumerable mode flag to indicate local file load\n\n\n  Object.defineProperty(result, 'localFile', {\n    value: !!loadFile\n  }); // set uri\n\n  result.href = uri; // set default result target, if specified\n\n  if (options.target) {\n    result.target = options.target + '';\n  } // set default result rel, if specified (#1542)\n\n\n  if (options.rel) {\n    result.rel = options.rel + '';\n  } // return\n\n\n  return result;\n}\n/**\n * File system loader factory.\n * @param {object} fs - The file system interface.\n * @return {function} - A file loader with the following signature:\n *   param {string} filename - The file system path to load.\n *   param {string} filename - The file system path to load.\n *   return {Promise} A promise that resolves to the file contents.\n */\n\n\nfunction fileLoader(fs) {\n  return fs ? function (filename) {\n    return new Promise(function (accept, reject) {\n      fs.readFile(filename, function (error, data) {\n        if (error) reject(error);else accept(data);\n      });\n    });\n  } : fileReject;\n}\n/**\n * Default file system loader that simply rejects.\n */\n\n\nasync function fileReject() {\n  (0, _vegaUtil.error)('No file system access.');\n}\n/**\n * HTTP request handler factory.\n * @param {function} fetch - The Fetch API method.\n * @return {function} - An http loader with the following signature:\n *   param {string} url - The url to request.\n *   param {object} options - An options hash.\n *   return {Promise} - A promise that resolves to the file contents.\n */\n\n\nfunction httpLoader(fetch) {\n  return fetch ? async function (url, options) {\n    const opt = (0, _vegaUtil.extend)({}, this.options.http, options),\n          type = options && options.response,\n          response = await fetch(url, opt);\n    return !response.ok ? (0, _vegaUtil.error)(response.status + '' + response.statusText) : (0, _vegaUtil.isFunction)(response[type]) ? response[type]() : response.text();\n  } : httpReject;\n}\n/**\n * Default http request handler that simply rejects.\n */\n\n\nasync function httpReject() {\n  (0, _vegaUtil.error)('No HTTP fetch method available.');\n}\n},{\"vega-util\":\"d61Z\"}],\"CCeE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.inferType = inferType;\nexports.inferTypes = inferTypes;\nexports.typeParsers = void 0;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar typeParsers = {\n  boolean: _vegaUtil.toBoolean,\n  integer: _vegaUtil.toNumber,\n  number: _vegaUtil.toNumber,\n  date: _vegaUtil.toDate,\n  string: _vegaUtil.toString,\n  unknown: _vegaUtil.identity\n};\nexports.typeParsers = typeParsers;\nvar typeTests = [isBoolean, isInteger, isNumber, isDate];\nvar typeList = ['boolean', 'integer', 'number', 'date'];\n\nfunction inferType(values, field) {\n  if (!values || !values.length) return 'unknown';\n  var value,\n      i,\n      j,\n      t = 0,\n      n = values.length,\n      m = typeTests.length,\n      a = typeTests.map(function (_, i) {\n    return i + 1;\n  });\n\n  for (i = 0, n = values.length; i < n; ++i) {\n    value = field ? values[i][field] : values[i];\n\n    for (j = 0; j < m; ++j) {\n      if (a[j] && isValid(value) && !typeTests[j](value)) {\n        a[j] = 0;\n        ++t;\n        if (t === typeTests.length) return 'string';\n      }\n    }\n  }\n\n  t = a.reduce(function (u, v) {\n    return u === 0 ? v : u;\n  }, 0) - 1;\n  return typeList[t];\n}\n\nfunction inferTypes(data, fields) {\n  return fields.reduce(function (types, field) {\n    types[field] = inferType(data, field);\n    return types;\n  }, {});\n} // -- Type Checks ----\n\n\nfunction isValid(_) {\n  return _ != null && _ === _;\n}\n\nfunction isBoolean(_) {\n  return _ === 'true' || _ === 'false' || _ === true || _ === false;\n}\n\nfunction isDate(_) {\n  return !Number.isNaN(Date.parse(_));\n}\n\nfunction isNumber(_) {\n  return !Number.isNaN(+_) && !(_ instanceof Date);\n}\n\nfunction isInteger(_) {\n  return isNumber(_) && Number.isInteger(+_);\n}\n},{\"vega-util\":\"d61Z\"}],\"uRW4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nvar EOL = {},\n    EOF = {},\n    QUOTE = 34,\n    NEWLINE = 10,\n    RETURN = 13;\n\nfunction objectConverter(columns) {\n  return new Function(\"d\", \"return {\" + columns.map(function (name, i) {\n    return JSON.stringify(name) + \": d[\" + i + \"] || \\\"\\\"\";\n  }).join(\",\") + \"}\");\n}\n\nfunction customConverter(columns, f) {\n  var object = objectConverter(columns);\n  return function (row, i) {\n    return f(object(row), i, columns);\n  };\n} // Compute unique columns in order of discovery.\n\n\nfunction inferColumns(rows) {\n  var columnSet = Object.create(null),\n      columns = [];\n  rows.forEach(function (row) {\n    for (var column in row) {\n      if (!(column in columnSet)) {\n        columns.push(columnSet[column] = column);\n      }\n    }\n  });\n  return columns;\n}\n\nfunction pad(value, width) {\n  var s = value + \"\",\n      length = s.length;\n  return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\n\nfunction formatYear(year) {\n  return year < 0 ? \"-\" + pad(-year, 6) : year > 9999 ? \"+\" + pad(year, 6) : pad(year, 4);\n}\n\nfunction formatDate(date) {\n  var hours = date.getUTCHours(),\n      minutes = date.getUTCMinutes(),\n      seconds = date.getUTCSeconds(),\n      milliseconds = date.getUTCMilliseconds();\n  return isNaN(date) ? \"Invalid Date\" : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2) + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\" : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\" : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\" : \"\");\n}\n\nfunction _default(delimiter) {\n  var reFormat = new RegExp(\"[\\\"\" + delimiter + \"\\n\\r]\"),\n      DELIMITER = delimiter.charCodeAt(0);\n\n  function parse(text, f) {\n    var convert,\n        columns,\n        rows = parseRows(text, function (row, i) {\n      if (convert) return convert(row, i - 1);\n      columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n    });\n    rows.columns = columns || [];\n    return rows;\n  }\n\n  function parseRows(text, f) {\n    var rows = [],\n        // output rows\n    N = text.length,\n        I = 0,\n        // current character index\n    n = 0,\n        // current line number\n    t,\n        // current token\n    eof = N <= 0,\n        // current token followed by EOF?\n    eol = false; // current token followed by EOL?\n    // Strip the trailing newline.\n\n    if (text.charCodeAt(N - 1) === NEWLINE) --N;\n    if (text.charCodeAt(N - 1) === RETURN) --N;\n\n    function token() {\n      if (eof) return EOF;\n      if (eol) return eol = false, EOL; // Unescape quotes.\n\n      var i,\n          j = I,\n          c;\n\n      if (text.charCodeAt(j) === QUOTE) {\n        while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n\n        if ((i = I) >= N) eof = true;else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;else if (c === RETURN) {\n          eol = true;\n          if (text.charCodeAt(I) === NEWLINE) ++I;\n        }\n        return text.slice(j + 1, i - 1).replace(/\"\"/g, \"\\\"\");\n      } // Find next delimiter or newline.\n\n\n      while (I < N) {\n        if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;else if (c === RETURN) {\n          eol = true;\n          if (text.charCodeAt(I) === NEWLINE) ++I;\n        } else if (c !== DELIMITER) continue;\n        return text.slice(j, i);\n      } // Return last token before EOF.\n\n\n      return eof = true, text.slice(j, N);\n    }\n\n    while ((t = token()) !== EOF) {\n      var row = [];\n\n      while (t !== EOL && t !== EOF) row.push(t), t = token();\n\n      if (f && (row = f(row, n++)) == null) continue;\n      rows.push(row);\n    }\n\n    return rows;\n  }\n\n  function preformatBody(rows, columns) {\n    return rows.map(function (row) {\n      return columns.map(function (column) {\n        return formatValue(row[column]);\n      }).join(delimiter);\n    });\n  }\n\n  function format(rows, columns) {\n    if (columns == null) columns = inferColumns(rows);\n    return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n  }\n\n  function formatBody(rows, columns) {\n    if (columns == null) columns = inferColumns(rows);\n    return preformatBody(rows, columns).join(\"\\n\");\n  }\n\n  function formatRows(rows) {\n    return rows.map(formatRow).join(\"\\n\");\n  }\n\n  function formatRow(row) {\n    return row.map(formatValue).join(delimiter);\n  }\n\n  function formatValue(value) {\n    return value == null ? \"\" : value instanceof Date ? formatDate(value) : reFormat.test(value += \"\") ? \"\\\"\" + value.replace(/\"/g, \"\\\"\\\"\") + \"\\\"\" : value;\n  }\n\n  return {\n    parse: parse,\n    parseRows: parseRows,\n    format: format,\n    formatBody: formatBody,\n    formatRows: formatRows,\n    formatRow: formatRow,\n    formatValue: formatValue\n  };\n}\n},{}],\"yGbu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.csvFormatValue = exports.csvFormatRow = exports.csvFormatRows = exports.csvFormatBody = exports.csvFormat = exports.csvParseRows = exports.csvParse = void 0;\n\nvar _dsv = _interopRequireDefault(require(\"./dsv.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar csv = (0, _dsv.default)(\",\");\nvar csvParse = csv.parse;\nexports.csvParse = csvParse;\nvar csvParseRows = csv.parseRows;\nexports.csvParseRows = csvParseRows;\nvar csvFormat = csv.format;\nexports.csvFormat = csvFormat;\nvar csvFormatBody = csv.formatBody;\nexports.csvFormatBody = csvFormatBody;\nvar csvFormatRows = csv.formatRows;\nexports.csvFormatRows = csvFormatRows;\nvar csvFormatRow = csv.formatRow;\nexports.csvFormatRow = csvFormatRow;\nvar csvFormatValue = csv.formatValue;\nexports.csvFormatValue = csvFormatValue;\n},{\"./dsv.js\":\"uRW4\"}],\"Rica\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.tsvFormatValue = exports.tsvFormatRow = exports.tsvFormatRows = exports.tsvFormatBody = exports.tsvFormat = exports.tsvParseRows = exports.tsvParse = void 0;\n\nvar _dsv = _interopRequireDefault(require(\"./dsv.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar tsv = (0, _dsv.default)(\"\\t\");\nvar tsvParse = tsv.parse;\nexports.tsvParse = tsvParse;\nvar tsvParseRows = tsv.parseRows;\nexports.tsvParseRows = tsvParseRows;\nvar tsvFormat = tsv.format;\nexports.tsvFormat = tsvFormat;\nvar tsvFormatBody = tsv.formatBody;\nexports.tsvFormatBody = tsvFormatBody;\nvar tsvFormatRows = tsv.formatRows;\nexports.tsvFormatRows = tsvFormatRows;\nvar tsvFormatRow = tsv.formatRow;\nexports.tsvFormatRow = tsvFormatRow;\nvar tsvFormatValue = tsv.formatValue;\nexports.tsvFormatValue = tsvFormatValue;\n},{\"./dsv.js\":\"uRW4\"}],\"hdSA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = autoType;\n\nfunction autoType(object) {\n  for (var key in object) {\n    var value = object[key].trim(),\n        number,\n        m;\n    if (!value) value = null;else if (value === \"true\") value = true;else if (value === \"false\") value = false;else if (value === \"NaN\") value = NaN;else if (!isNaN(number = +value)) value = number;else if (m = value.match(/^([-+]\\d{2})?\\d{4}(-\\d{2}(-\\d{2})?)?(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{3})?)?(Z|[-+]\\d{2}:\\d{2})?)?$/)) {\n      if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, \"/\").replace(/T/, \" \");\n      value = new Date(value);\n    } else continue;\n    object[key] = value;\n  }\n\n  return object;\n} // https://github.com/d3/d3-dsv/issues/45\n\n\nvar fixtz = new Date(\"2019-01-01T00:00\").getHours() || new Date(\"2019-07-01T00:00\").getHours();\n},{}],\"EC2w\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"dsvFormat\", {\n  enumerable: true,\n  get: function () {\n    return _dsv.default;\n  }\n});\nObject.defineProperty(exports, \"csvParse\", {\n  enumerable: true,\n  get: function () {\n    return _csv.csvParse;\n  }\n});\nObject.defineProperty(exports, \"csvParseRows\", {\n  enumerable: true,\n  get: function () {\n    return _csv.csvParseRows;\n  }\n});\nObject.defineProperty(exports, \"csvFormat\", {\n  enumerable: true,\n  get: function () {\n    return _csv.csvFormat;\n  }\n});\nObject.defineProperty(exports, \"csvFormatBody\", {\n  enumerable: true,\n  get: function () {\n    return _csv.csvFormatBody;\n  }\n});\nObject.defineProperty(exports, \"csvFormatRows\", {\n  enumerable: true,\n  get: function () {\n    return _csv.csvFormatRows;\n  }\n});\nObject.defineProperty(exports, \"csvFormatRow\", {\n  enumerable: true,\n  get: function () {\n    return _csv.csvFormatRow;\n  }\n});\nObject.defineProperty(exports, \"csvFormatValue\", {\n  enumerable: true,\n  get: function () {\n    return _csv.csvFormatValue;\n  }\n});\nObject.defineProperty(exports, \"tsvParse\", {\n  enumerable: true,\n  get: function () {\n    return _tsv.tsvParse;\n  }\n});\nObject.defineProperty(exports, \"tsvParseRows\", {\n  enumerable: true,\n  get: function () {\n    return _tsv.tsvParseRows;\n  }\n});\nObject.defineProperty(exports, \"tsvFormat\", {\n  enumerable: true,\n  get: function () {\n    return _tsv.tsvFormat;\n  }\n});\nObject.defineProperty(exports, \"tsvFormatBody\", {\n  enumerable: true,\n  get: function () {\n    return _tsv.tsvFormatBody;\n  }\n});\nObject.defineProperty(exports, \"tsvFormatRows\", {\n  enumerable: true,\n  get: function () {\n    return _tsv.tsvFormatRows;\n  }\n});\nObject.defineProperty(exports, \"tsvFormatRow\", {\n  enumerable: true,\n  get: function () {\n    return _tsv.tsvFormatRow;\n  }\n});\nObject.defineProperty(exports, \"tsvFormatValue\", {\n  enumerable: true,\n  get: function () {\n    return _tsv.tsvFormatValue;\n  }\n});\nObject.defineProperty(exports, \"autoType\", {\n  enumerable: true,\n  get: function () {\n    return _autoType.default;\n  }\n});\n\nvar _dsv = _interopRequireDefault(require(\"./dsv.js\"));\n\nvar _csv = require(\"./csv.js\");\n\nvar _tsv = require(\"./tsv.js\");\n\nvar _autoType = _interopRequireDefault(require(\"./autoType.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./dsv.js\":\"uRW4\",\"./csv.js\":\"yGbu\",\"./tsv.js\":\"Rica\",\"./autoType.js\":\"hdSA\"}],\"h3Op\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.delimitedFormat = delimitedFormat;\nexports.default = dsv;\n\nvar _d3Dsv = require(\"d3-dsv\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction delimitedFormat(delimiter) {\n  const parse = function (data, format) {\n    const delim = {\n      delimiter: delimiter\n    };\n    return dsv(data, format ? (0, _vegaUtil.extend)(format, delim) : delim);\n  };\n\n  parse.responseType = 'text';\n  return parse;\n}\n\nfunction dsv(data, format) {\n  if (format.header) {\n    data = format.header.map(_vegaUtil.stringValue).join(format.delimiter) + '\\n' + data;\n  }\n\n  return (0, _d3Dsv.dsvFormat)(format.delimiter).parse(data + '');\n}\n\ndsv.responseType = 'text';\n},{\"d3-dsv\":\"EC2w\",\"vega-util\":\"d61Z\"}],\"cfBw\":[function(require,module,exports) {\n'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n\n},{}],\"hMTg\":[function(require,module,exports) {\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n},{}],\"fbtd\":[function(require,module,exports) {\nvar toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n},{}],\"HgFv\":[function(require,module,exports) {\n\nvar global = arguments[3];\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n},{\"base64-js\":\"cfBw\",\"ieee754\":\"hMTg\",\"isarray\":\"fbtd\",\"buffer\":\"HgFv\"}],\"DvxL\":[function(require,module,exports) {\nvar Buffer = require(\"buffer\").Buffer;\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = json;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction isBuffer(_) {\n  return typeof Buffer === 'function' && (0, _vegaUtil.isFunction)(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;\n}\n\nfunction json(data, format) {\n  const prop = format && format.property ? (0, _vegaUtil.field)(format.property) : _vegaUtil.identity;\n  return (0, _vegaUtil.isObject)(data) && !isBuffer(data) ? parseJSON(prop(data)) : prop(JSON.parse(data));\n}\n\njson.responseType = 'json';\n\nfunction parseJSON(data, format) {\n  return format && format.copy ? JSON.parse(JSON.stringify(data)) : data;\n}\n},{\"vega-util\":\"d61Z\",\"buffer\":\"HgFv\"}],\"n09v\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x) {\n  return x;\n}\n},{}],\"PG0d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(transform) {\n  if (transform == null) return _identity.default;\n  var x0,\n      y0,\n      kx = transform.scale[0],\n      ky = transform.scale[1],\n      dx = transform.translate[0],\n      dy = transform.translate[1];\n  return function (input, i) {\n    if (!i) x0 = y0 = 0;\n    var j = 2,\n        n = input.length,\n        output = new Array(n);\n    output[0] = (x0 += input[0]) * kx + dx;\n    output[1] = (y0 += input[1]) * ky + dy;\n\n    while (j < n) output[j] = input[j], ++j;\n\n    return output;\n  };\n}\n},{\"./identity.js\":\"n09v\"}],\"AUka\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _transform = _interopRequireDefault(require(\"./transform.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(topology) {\n  var t = (0, _transform.default)(topology.transform),\n      key,\n      x0 = Infinity,\n      y0 = x0,\n      x1 = -x0,\n      y1 = -x0;\n\n  function bboxPoint(p) {\n    p = t(p);\n    if (p[0] < x0) x0 = p[0];\n    if (p[0] > x1) x1 = p[0];\n    if (p[1] < y0) y0 = p[1];\n    if (p[1] > y1) y1 = p[1];\n  }\n\n  function bboxGeometry(o) {\n    switch (o.type) {\n      case \"GeometryCollection\":\n        o.geometries.forEach(bboxGeometry);\n        break;\n\n      case \"Point\":\n        bboxPoint(o.coordinates);\n        break;\n\n      case \"MultiPoint\":\n        o.coordinates.forEach(bboxPoint);\n        break;\n    }\n  }\n\n  topology.arcs.forEach(function (arc) {\n    var i = -1,\n        n = arc.length,\n        p;\n\n    while (++i < n) {\n      p = t(arc[i], i);\n      if (p[0] < x0) x0 = p[0];\n      if (p[0] > x1) x1 = p[0];\n      if (p[1] < y0) y0 = p[1];\n      if (p[1] > y1) y1 = p[1];\n    }\n  });\n\n  for (key in topology.objects) {\n    bboxGeometry(topology.objects[key]);\n  }\n\n  return [x0, y0, x1, y1];\n}\n},{\"./transform.js\":\"PG0d\"}],\"wvdD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(array, n) {\n  var t,\n      j = array.length,\n      i = j - n;\n\n  while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n}\n},{}],\"FNho\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.object = object;\n\nvar _reverse = _interopRequireDefault(require(\"./reverse.js\"));\n\nvar _transform = _interopRequireDefault(require(\"./transform.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(topology, o) {\n  if (typeof o === \"string\") o = topology.objects[o];\n  return o.type === \"GeometryCollection\" ? {\n    type: \"FeatureCollection\",\n    features: o.geometries.map(function (o) {\n      return feature(topology, o);\n    })\n  } : feature(topology, o);\n}\n\nfunction feature(topology, o) {\n  var id = o.id,\n      bbox = o.bbox,\n      properties = o.properties == null ? {} : o.properties,\n      geometry = object(topology, o);\n  return id == null && bbox == null ? {\n    type: \"Feature\",\n    properties: properties,\n    geometry: geometry\n  } : bbox == null ? {\n    type: \"Feature\",\n    id: id,\n    properties: properties,\n    geometry: geometry\n  } : {\n    type: \"Feature\",\n    id: id,\n    bbox: bbox,\n    properties: properties,\n    geometry: geometry\n  };\n}\n\nfunction object(topology, o) {\n  var transformPoint = (0, _transform.default)(topology.transform),\n      arcs = topology.arcs;\n\n  function arc(i, points) {\n    if (points.length) points.pop();\n\n    for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) {\n      points.push(transformPoint(a[k], k));\n    }\n\n    if (i < 0) (0, _reverse.default)(points, n);\n  }\n\n  function point(p) {\n    return transformPoint(p);\n  }\n\n  function line(arcs) {\n    var points = [];\n\n    for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n\n    if (points.length < 2) points.push(points[0]); // This should never happen per the specification.\n\n    return points;\n  }\n\n  function ring(arcs) {\n    var points = line(arcs);\n\n    while (points.length < 4) points.push(points[0]); // This may happen if an arc has only two points.\n\n\n    return points;\n  }\n\n  function polygon(arcs) {\n    return arcs.map(ring);\n  }\n\n  function geometry(o) {\n    var type = o.type,\n        coordinates;\n\n    switch (type) {\n      case \"GeometryCollection\":\n        return {\n          type: type,\n          geometries: o.geometries.map(geometry)\n        };\n\n      case \"Point\":\n        coordinates = point(o.coordinates);\n        break;\n\n      case \"MultiPoint\":\n        coordinates = o.coordinates.map(point);\n        break;\n\n      case \"LineString\":\n        coordinates = line(o.arcs);\n        break;\n\n      case \"MultiLineString\":\n        coordinates = o.arcs.map(line);\n        break;\n\n      case \"Polygon\":\n        coordinates = polygon(o.arcs);\n        break;\n\n      case \"MultiPolygon\":\n        coordinates = o.arcs.map(polygon);\n        break;\n\n      default:\n        return null;\n    }\n\n    return {\n      type: type,\n      coordinates: coordinates\n    };\n  }\n\n  return geometry(o);\n}\n},{\"./reverse.js\":\"wvdD\",\"./transform.js\":\"PG0d\"}],\"ycfC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(topology, arcs) {\n  var stitchedArcs = {},\n      fragmentByStart = {},\n      fragmentByEnd = {},\n      fragments = [],\n      emptyIndex = -1; // Stitch empty arcs first, since they may be subsumed by other arcs.\n\n  arcs.forEach(function (i, j) {\n    var arc = topology.arcs[i < 0 ? ~i : i],\n        t;\n\n    if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n      t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n    }\n  });\n  arcs.forEach(function (i) {\n    var e = ends(i),\n        start = e[0],\n        end = e[1],\n        f,\n        g;\n\n    if (f = fragmentByEnd[start]) {\n      delete fragmentByEnd[f.end];\n      f.push(i);\n      f.end = end;\n\n      if (g = fragmentByStart[end]) {\n        delete fragmentByStart[g.start];\n        var fg = g === f ? f : f.concat(g);\n        fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n      } else {\n        fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n      }\n    } else if (f = fragmentByStart[end]) {\n      delete fragmentByStart[f.start];\n      f.unshift(i);\n      f.start = start;\n\n      if (g = fragmentByEnd[start]) {\n        delete fragmentByEnd[g.end];\n        var gf = g === f ? f : g.concat(f);\n        fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n      } else {\n        fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n      }\n    } else {\n      f = [i];\n      fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n    }\n  });\n\n  function ends(i) {\n    var arc = topology.arcs[i < 0 ? ~i : i],\n        p0 = arc[0],\n        p1;\n    if (topology.transform) p1 = [0, 0], arc.forEach(function (dp) {\n      p1[0] += dp[0], p1[1] += dp[1];\n    });else p1 = arc[arc.length - 1];\n    return i < 0 ? [p1, p0] : [p0, p1];\n  }\n\n  function flush(fragmentByEnd, fragmentByStart) {\n    for (var k in fragmentByEnd) {\n      var f = fragmentByEnd[k];\n      delete fragmentByStart[f.start];\n      delete f.start;\n      delete f.end;\n      f.forEach(function (i) {\n        stitchedArcs[i < 0 ? ~i : i] = 1;\n      });\n      fragments.push(f);\n    }\n  }\n\n  flush(fragmentByEnd, fragmentByStart);\n  flush(fragmentByStart, fragmentByEnd);\n  arcs.forEach(function (i) {\n    if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]);\n  });\n  return fragments;\n}\n},{}],\"eNxS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.meshArcs = meshArcs;\n\nvar _feature = require(\"./feature.js\");\n\nvar _stitch = _interopRequireDefault(require(\"./stitch.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(topology) {\n  return (0, _feature.object)(topology, meshArcs.apply(this, arguments));\n}\n\nfunction meshArcs(topology, object, filter) {\n  var arcs, i, n;\n  if (arguments.length > 1) arcs = extractArcs(topology, object, filter);else for (i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i) arcs[i] = i;\n  return {\n    type: \"MultiLineString\",\n    arcs: (0, _stitch.default)(topology, arcs)\n  };\n}\n\nfunction extractArcs(topology, object, filter) {\n  var arcs = [],\n      geomsByArc = [],\n      geom;\n\n  function extract0(i) {\n    var j = i < 0 ? ~i : i;\n    (geomsByArc[j] || (geomsByArc[j] = [])).push({\n      i: i,\n      g: geom\n    });\n  }\n\n  function extract1(arcs) {\n    arcs.forEach(extract0);\n  }\n\n  function extract2(arcs) {\n    arcs.forEach(extract1);\n  }\n\n  function extract3(arcs) {\n    arcs.forEach(extract2);\n  }\n\n  function geometry(o) {\n    switch (geom = o, o.type) {\n      case \"GeometryCollection\":\n        o.geometries.forEach(geometry);\n        break;\n\n      case \"LineString\":\n        extract1(o.arcs);\n        break;\n\n      case \"MultiLineString\":\n      case \"Polygon\":\n        extract2(o.arcs);\n        break;\n\n      case \"MultiPolygon\":\n        extract3(o.arcs);\n        break;\n    }\n  }\n\n  geometry(object);\n  geomsByArc.forEach(filter == null ? function (geoms) {\n    arcs.push(geoms[0].i);\n  } : function (geoms) {\n    if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i);\n  });\n  return arcs;\n}\n},{\"./feature.js\":\"FNho\",\"./stitch.js\":\"ycfC\"}],\"vI6u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.mergeArcs = mergeArcs;\n\nvar _feature = require(\"./feature.js\");\n\nvar _stitch = _interopRequireDefault(require(\"./stitch.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction planarRingArea(ring) {\n  var i = -1,\n      n = ring.length,\n      a,\n      b = ring[n - 1],\n      area = 0;\n\n  while (++i < n) a = b, b = ring[i], area += a[0] * b[1] - a[1] * b[0];\n\n  return Math.abs(area); // Note: doubled area!\n}\n\nfunction _default(topology) {\n  return (0, _feature.object)(topology, mergeArcs.apply(this, arguments));\n}\n\nfunction mergeArcs(topology, objects) {\n  var polygonsByArc = {},\n      polygons = [],\n      groups = [];\n  objects.forEach(geometry);\n\n  function geometry(o) {\n    switch (o.type) {\n      case \"GeometryCollection\":\n        o.geometries.forEach(geometry);\n        break;\n\n      case \"Polygon\":\n        extract(o.arcs);\n        break;\n\n      case \"MultiPolygon\":\n        o.arcs.forEach(extract);\n        break;\n    }\n  }\n\n  function extract(polygon) {\n    polygon.forEach(function (ring) {\n      ring.forEach(function (arc) {\n        (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n      });\n    });\n    polygons.push(polygon);\n  }\n\n  function area(ring) {\n    return planarRingArea((0, _feature.object)(topology, {\n      type: \"Polygon\",\n      arcs: [ring]\n    }).coordinates[0]);\n  }\n\n  polygons.forEach(function (polygon) {\n    if (!polygon._) {\n      var group = [],\n          neighbors = [polygon];\n      polygon._ = 1;\n      groups.push(group);\n\n      while (polygon = neighbors.pop()) {\n        group.push(polygon);\n        polygon.forEach(function (ring) {\n          ring.forEach(function (arc) {\n            polygonsByArc[arc < 0 ? ~arc : arc].forEach(function (polygon) {\n              if (!polygon._) {\n                polygon._ = 1;\n                neighbors.push(polygon);\n              }\n            });\n          });\n        });\n      }\n    }\n  });\n  polygons.forEach(function (polygon) {\n    delete polygon._;\n  });\n  return {\n    type: \"MultiPolygon\",\n    arcs: groups.map(function (polygons) {\n      var arcs = [],\n          n; // Extract the exterior (unique) arcs.\n\n      polygons.forEach(function (polygon) {\n        polygon.forEach(function (ring) {\n          ring.forEach(function (arc) {\n            if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n              arcs.push(arc);\n            }\n          });\n        });\n      }); // Stitch the arcs into one or more rings.\n\n      arcs = (0, _stitch.default)(topology, arcs); // If more than one ring is returned,\n      // at most one of these rings can be the exterior;\n      // choose the one with the greatest absolute area.\n\n      if ((n = arcs.length) > 1) {\n        for (var i = 1, k = area(arcs[0]), ki, t; i < n; ++i) {\n          if ((ki = area(arcs[i])) > k) {\n            t = arcs[0], arcs[0] = arcs[i], arcs[i] = t, k = ki;\n          }\n        }\n      }\n\n      return arcs;\n    }).filter(function (arcs) {\n      return arcs.length > 0;\n    })\n  };\n}\n},{\"./feature.js\":\"FNho\",\"./stitch.js\":\"ycfC\"}],\"b9Vz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(a, x) {\n  var lo = 0,\n      hi = a.length;\n\n  while (lo < hi) {\n    var mid = lo + hi >>> 1;\n    if (a[mid] < x) lo = mid + 1;else hi = mid;\n  }\n\n  return lo;\n}\n},{}],\"ghmq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _bisect = _interopRequireDefault(require(\"./bisect.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(objects) {\n  var indexesByArc = {},\n      // arc index -> array of object indexes\n  neighbors = objects.map(function () {\n    return [];\n  });\n\n  function line(arcs, i) {\n    arcs.forEach(function (a) {\n      if (a < 0) a = ~a;\n      var o = indexesByArc[a];\n      if (o) o.push(i);else indexesByArc[a] = [i];\n    });\n  }\n\n  function polygon(arcs, i) {\n    arcs.forEach(function (arc) {\n      line(arc, i);\n    });\n  }\n\n  function geometry(o, i) {\n    if (o.type === \"GeometryCollection\") o.geometries.forEach(function (o) {\n      geometry(o, i);\n    });else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n  }\n\n  var geometryType = {\n    LineString: line,\n    MultiLineString: polygon,\n    Polygon: polygon,\n    MultiPolygon: function (arcs, i) {\n      arcs.forEach(function (arc) {\n        polygon(arc, i);\n      });\n    }\n  };\n  objects.forEach(geometry);\n\n  for (var i in indexesByArc) {\n    for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n      for (var k = j + 1; k < m; ++k) {\n        var ij = indexes[j],\n            ik = indexes[k],\n            n;\n        if ((n = neighbors[ij])[i = (0, _bisect.default)(n, ik)] !== ik) n.splice(i, 0, ik);\n        if ((n = neighbors[ik])[i = (0, _bisect.default)(n, ij)] !== ij) n.splice(i, 0, ij);\n      }\n    }\n  }\n\n  return neighbors;\n}\n},{\"./bisect.js\":\"b9Vz\"}],\"W1fX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(transform) {\n  if (transform == null) return _identity.default;\n  var x0,\n      y0,\n      kx = transform.scale[0],\n      ky = transform.scale[1],\n      dx = transform.translate[0],\n      dy = transform.translate[1];\n  return function (input, i) {\n    if (!i) x0 = y0 = 0;\n    var j = 2,\n        n = input.length,\n        output = new Array(n),\n        x1 = Math.round((input[0] - dx) / kx),\n        y1 = Math.round((input[1] - dy) / ky);\n    output[0] = x1 - x0, x0 = x1;\n    output[1] = y1 - y0, y0 = y1;\n\n    while (j < n) output[j] = input[j], ++j;\n\n    return output;\n  };\n}\n},{\"./identity.js\":\"n09v\"}],\"CZtQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _bbox = _interopRequireDefault(require(\"./bbox.js\"));\n\nvar _untransform = _interopRequireDefault(require(\"./untransform.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(topology, transform) {\n  if (topology.transform) throw new Error(\"already quantized\");\n\n  if (!transform || !transform.scale) {\n    if (!((n = Math.floor(transform)) >= 2)) throw new Error(\"n must be ≥2\");\n    box = topology.bbox || (0, _bbox.default)(topology);\n    var x0 = box[0],\n        y0 = box[1],\n        x1 = box[2],\n        y1 = box[3],\n        n;\n    transform = {\n      scale: [x1 - x0 ? (x1 - x0) / (n - 1) : 1, y1 - y0 ? (y1 - y0) / (n - 1) : 1],\n      translate: [x0, y0]\n    };\n  } else {\n    box = topology.bbox;\n  }\n\n  var t = (0, _untransform.default)(transform),\n      box,\n      key,\n      inputs = topology.objects,\n      outputs = {};\n\n  function quantizePoint(point) {\n    return t(point);\n  }\n\n  function quantizeGeometry(input) {\n    var output;\n\n    switch (input.type) {\n      case \"GeometryCollection\":\n        output = {\n          type: \"GeometryCollection\",\n          geometries: input.geometries.map(quantizeGeometry)\n        };\n        break;\n\n      case \"Point\":\n        output = {\n          type: \"Point\",\n          coordinates: quantizePoint(input.coordinates)\n        };\n        break;\n\n      case \"MultiPoint\":\n        output = {\n          type: \"MultiPoint\",\n          coordinates: input.coordinates.map(quantizePoint)\n        };\n        break;\n\n      default:\n        return input;\n    }\n\n    if (input.id != null) output.id = input.id;\n    if (input.bbox != null) output.bbox = input.bbox;\n    if (input.properties != null) output.properties = input.properties;\n    return output;\n  }\n\n  function quantizeArc(input) {\n    var i = 0,\n        j = 1,\n        n = input.length,\n        p,\n        output = new Array(n); // pessimistic\n\n    output[0] = t(input[0], 0);\n\n    while (++i < n) if ((p = t(input[i], i))[0] || p[1]) output[j++] = p; // non-coincident points\n\n\n    if (j === 1) output[j++] = [0, 0]; // an arc must have at least two points\n\n    output.length = j;\n    return output;\n  }\n\n  for (key in inputs) outputs[key] = quantizeGeometry(inputs[key]);\n\n  return {\n    type: \"Topology\",\n    bbox: box,\n    transform: transform,\n    objects: outputs,\n    arcs: topology.arcs.map(quantizeArc)\n  };\n}\n},{\"./bbox.js\":\"AUka\",\"./untransform.js\":\"W1fX\"}],\"oNcQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"bbox\", {\n  enumerable: true,\n  get: function () {\n    return _bbox.default;\n  }\n});\nObject.defineProperty(exports, \"feature\", {\n  enumerable: true,\n  get: function () {\n    return _feature.default;\n  }\n});\nObject.defineProperty(exports, \"mesh\", {\n  enumerable: true,\n  get: function () {\n    return _mesh.default;\n  }\n});\nObject.defineProperty(exports, \"meshArcs\", {\n  enumerable: true,\n  get: function () {\n    return _mesh.meshArcs;\n  }\n});\nObject.defineProperty(exports, \"merge\", {\n  enumerable: true,\n  get: function () {\n    return _merge.default;\n  }\n});\nObject.defineProperty(exports, \"mergeArcs\", {\n  enumerable: true,\n  get: function () {\n    return _merge.mergeArcs;\n  }\n});\nObject.defineProperty(exports, \"neighbors\", {\n  enumerable: true,\n  get: function () {\n    return _neighbors.default;\n  }\n});\nObject.defineProperty(exports, \"quantize\", {\n  enumerable: true,\n  get: function () {\n    return _quantize.default;\n  }\n});\nObject.defineProperty(exports, \"transform\", {\n  enumerable: true,\n  get: function () {\n    return _transform.default;\n  }\n});\nObject.defineProperty(exports, \"untransform\", {\n  enumerable: true,\n  get: function () {\n    return _untransform.default;\n  }\n});\n\nvar _bbox = _interopRequireDefault(require(\"./bbox.js\"));\n\nvar _feature = _interopRequireDefault(require(\"./feature.js\"));\n\nvar _mesh = _interopRequireWildcard(require(\"./mesh.js\"));\n\nvar _merge = _interopRequireWildcard(require(\"./merge.js\"));\n\nvar _neighbors = _interopRequireDefault(require(\"./neighbors.js\"));\n\nvar _quantize = _interopRequireDefault(require(\"./quantize.js\"));\n\nvar _transform = _interopRequireDefault(require(\"./transform.js\"));\n\nvar _untransform = _interopRequireDefault(require(\"./untransform.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./bbox.js\":\"AUka\",\"./feature.js\":\"FNho\",\"./mesh.js\":\"eNxS\",\"./merge.js\":\"vI6u\",\"./neighbors.js\":\"ghmq\",\"./quantize.js\":\"CZtQ\",\"./transform.js\":\"PG0d\",\"./untransform.js\":\"W1fX\"}],\"Kei5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = topojson;\n\nvar _json = _interopRequireDefault(require(\"./json\"));\n\nvar _topojsonClient = require(\"topojson-client\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst filters = {\n  interior: (a, b) => a !== b,\n  exterior: (a, b) => a === b\n};\n\nfunction topojson(data, format) {\n  let method, object, property, filter;\n  data = (0, _json.default)(data, format);\n\n  if (format && format.feature) {\n    method = _topojsonClient.feature;\n    property = format.feature;\n  } else if (format && format.mesh) {\n    method = _topojsonClient.mesh;\n    property = format.mesh;\n    filter = filters[format.filter];\n  } else {\n    (0, _vegaUtil.error)('Missing TopoJSON feature or mesh parameter.');\n  }\n\n  object = (object = data.objects[property]) ? method(data, object, filter) : (0, _vegaUtil.error)('Invalid TopoJSON object: ' + property);\n  return object && object.features || [object];\n}\n\ntopojson.responseType = 'json';\n},{\"./json\":\"DvxL\",\"topojson-client\":\"oNcQ\",\"vega-util\":\"d61Z\"}],\"O13M\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.formats = formats;\nexports.responseType = responseType;\nexports.format = void 0;\n\nvar _dsv = _interopRequireWildcard(require(\"./dsv\"));\n\nvar _json = _interopRequireDefault(require(\"./json\"));\n\nvar _topojson = _interopRequireDefault(require(\"./topojson\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nconst format = {\n  dsv: _dsv.default,\n  csv: (0, _dsv.delimitedFormat)(','),\n  tsv: (0, _dsv.delimitedFormat)('\\t'),\n  json: _json.default,\n  topojson: _topojson.default\n};\nexports.format = format;\n\nfunction formats(name, reader) {\n  if (arguments.length > 1) {\n    format[name] = reader;\n    return this;\n  } else {\n    return (0, _vegaUtil.hasOwnProperty)(format, name) ? format[name] : null;\n  }\n}\n\nfunction responseType(type) {\n  const f = formats(type);\n  return f && f.responseType || 'text';\n}\n},{\"./dsv\":\"h3Op\",\"./json\":\"DvxL\",\"./topojson\":\"Kei5\",\"vega-util\":\"d61Z\"}],\"QFUQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = newInterval;\nvar t0 = new Date(),\n    t1 = new Date();\n\nfunction newInterval(floori, offseti, count, field) {\n  function interval(date) {\n    return floori(date = arguments.length === 0 ? new Date() : new Date(+date)), date;\n  }\n\n  interval.floor = function (date) {\n    return floori(date = new Date(+date)), date;\n  };\n\n  interval.ceil = function (date) {\n    return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n  };\n\n  interval.round = function (date) {\n    var d0 = interval(date),\n        d1 = interval.ceil(date);\n    return date - d0 < d1 - date ? d0 : d1;\n  };\n\n  interval.offset = function (date, step) {\n    return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n  };\n\n  interval.range = function (start, stop, step) {\n    var range = [],\n        previous;\n    start = interval.ceil(start);\n    step = step == null ? 1 : Math.floor(step);\n    if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n\n    do range.push(previous = new Date(+start)), offseti(start, step), floori(start); while (previous < start && start < stop);\n\n    return range;\n  };\n\n  interval.filter = function (test) {\n    return newInterval(function (date) {\n      if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n    }, function (date, step) {\n      if (date >= date) {\n        if (step < 0) while (++step <= 0) {\n          while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n\n        } else while (--step >= 0) {\n          while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n\n        }\n      }\n    });\n  };\n\n  if (count) {\n    interval.count = function (start, end) {\n      t0.setTime(+start), t1.setTime(+end);\n      floori(t0), floori(t1);\n      return Math.floor(count(t0, t1));\n    };\n\n    interval.every = function (step) {\n      step = Math.floor(step);\n      return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval : interval.filter(field ? function (d) {\n        return field(d) % step === 0;\n      } : function (d) {\n        return interval.count(0, d) % step === 0;\n      });\n    };\n  }\n\n  return interval;\n}\n},{}],\"WVmH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.milliseconds = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar millisecond = (0, _interval.default)(function () {// noop\n}, function (date, step) {\n  date.setTime(+date + step);\n}, function (start, end) {\n  return end - start;\n}); // An optimized implementation for this simple case.\n\nmillisecond.every = function (k) {\n  k = Math.floor(k);\n  if (!isFinite(k) || !(k > 0)) return null;\n  if (!(k > 1)) return millisecond;\n  return (0, _interval.default)(function (date) {\n    date.setTime(Math.floor(date / k) * k);\n  }, function (date, step) {\n    date.setTime(+date + step * k);\n  }, function (start, end) {\n    return (end - start) / k;\n  });\n};\n\nvar _default = millisecond;\nexports.default = _default;\nvar milliseconds = millisecond.range;\nexports.milliseconds = milliseconds;\n},{\"./interval.js\":\"QFUQ\"}],\"Vnta\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.durationWeek = exports.durationDay = exports.durationHour = exports.durationMinute = exports.durationSecond = void 0;\nvar durationSecond = 1e3;\nexports.durationSecond = durationSecond;\nvar durationMinute = 6e4;\nexports.durationMinute = durationMinute;\nvar durationHour = 36e5;\nexports.durationHour = durationHour;\nvar durationDay = 864e5;\nexports.durationDay = durationDay;\nvar durationWeek = 6048e5;\nexports.durationWeek = durationWeek;\n},{}],\"AYLw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.seconds = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar second = (0, _interval.default)(function (date) {\n  date.setTime(date - date.getMilliseconds());\n}, function (date, step) {\n  date.setTime(+date + step * _duration.durationSecond);\n}, function (start, end) {\n  return (end - start) / _duration.durationSecond;\n}, function (date) {\n  return date.getUTCSeconds();\n});\nvar _default = second;\nexports.default = _default;\nvar seconds = second.range;\nexports.seconds = seconds;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"etD9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.minutes = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar minute = (0, _interval.default)(function (date) {\n  date.setTime(date - date.getMilliseconds() - date.getSeconds() * _duration.durationSecond);\n}, function (date, step) {\n  date.setTime(+date + step * _duration.durationMinute);\n}, function (start, end) {\n  return (end - start) / _duration.durationMinute;\n}, function (date) {\n  return date.getMinutes();\n});\nvar _default = minute;\nexports.default = _default;\nvar minutes = minute.range;\nexports.minutes = minutes;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"py4n\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.hours = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar hour = (0, _interval.default)(function (date) {\n  date.setTime(date - date.getMilliseconds() - date.getSeconds() * _duration.durationSecond - date.getMinutes() * _duration.durationMinute);\n}, function (date, step) {\n  date.setTime(+date + step * _duration.durationHour);\n}, function (start, end) {\n  return (end - start) / _duration.durationHour;\n}, function (date) {\n  return date.getHours();\n});\nvar _default = hour;\nexports.default = _default;\nvar hours = hour.range;\nexports.hours = hours;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"LWrz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.days = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar day = (0, _interval.default)(function (date) {\n  date.setHours(0, 0, 0, 0);\n}, function (date, step) {\n  date.setDate(date.getDate() + step);\n}, function (start, end) {\n  return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * _duration.durationMinute) / _duration.durationDay;\n}, function (date) {\n  return date.getDate() - 1;\n});\nvar _default = day;\nexports.default = _default;\nvar days = day.range;\nexports.days = days;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"Dweu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.saturdays = exports.fridays = exports.thursdays = exports.wednesdays = exports.tuesdays = exports.mondays = exports.sundays = exports.saturday = exports.friday = exports.thursday = exports.wednesday = exports.tuesday = exports.monday = exports.sunday = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction weekday(i) {\n  return (0, _interval.default)(function (date) {\n    date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n    date.setHours(0, 0, 0, 0);\n  }, function (date, step) {\n    date.setDate(date.getDate() + step * 7);\n  }, function (start, end) {\n    return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * _duration.durationMinute) / _duration.durationWeek;\n  });\n}\n\nvar sunday = weekday(0);\nexports.sunday = sunday;\nvar monday = weekday(1);\nexports.monday = monday;\nvar tuesday = weekday(2);\nexports.tuesday = tuesday;\nvar wednesday = weekday(3);\nexports.wednesday = wednesday;\nvar thursday = weekday(4);\nexports.thursday = thursday;\nvar friday = weekday(5);\nexports.friday = friday;\nvar saturday = weekday(6);\nexports.saturday = saturday;\nvar sundays = sunday.range;\nexports.sundays = sundays;\nvar mondays = monday.range;\nexports.mondays = mondays;\nvar tuesdays = tuesday.range;\nexports.tuesdays = tuesdays;\nvar wednesdays = wednesday.range;\nexports.wednesdays = wednesdays;\nvar thursdays = thursday.range;\nexports.thursdays = thursdays;\nvar fridays = friday.range;\nexports.fridays = fridays;\nvar saturdays = saturday.range;\nexports.saturdays = saturdays;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"gOAO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.months = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar month = (0, _interval.default)(function (date) {\n  date.setDate(1);\n  date.setHours(0, 0, 0, 0);\n}, function (date, step) {\n  date.setMonth(date.getMonth() + step);\n}, function (start, end) {\n  return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function (date) {\n  return date.getMonth();\n});\nvar _default = month;\nexports.default = _default;\nvar months = month.range;\nexports.months = months;\n},{\"./interval.js\":\"QFUQ\"}],\"kReM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.years = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar year = (0, _interval.default)(function (date) {\n  date.setMonth(0, 1);\n  date.setHours(0, 0, 0, 0);\n}, function (date, step) {\n  date.setFullYear(date.getFullYear() + step);\n}, function (start, end) {\n  return end.getFullYear() - start.getFullYear();\n}, function (date) {\n  return date.getFullYear();\n}); // An optimized implementation for this simple case.\n\nyear.every = function (k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : (0, _interval.default)(function (date) {\n    date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n    date.setMonth(0, 1);\n    date.setHours(0, 0, 0, 0);\n  }, function (date, step) {\n    date.setFullYear(date.getFullYear() + step * k);\n  });\n};\n\nvar _default = year;\nexports.default = _default;\nvar years = year.range;\nexports.years = years;\n},{\"./interval.js\":\"QFUQ\"}],\"O6lW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.utcMinutes = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar utcMinute = (0, _interval.default)(function (date) {\n  date.setUTCSeconds(0, 0);\n}, function (date, step) {\n  date.setTime(+date + step * _duration.durationMinute);\n}, function (start, end) {\n  return (end - start) / _duration.durationMinute;\n}, function (date) {\n  return date.getUTCMinutes();\n});\nvar _default = utcMinute;\nexports.default = _default;\nvar utcMinutes = utcMinute.range;\nexports.utcMinutes = utcMinutes;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"qnVA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.utcHours = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar utcHour = (0, _interval.default)(function (date) {\n  date.setUTCMinutes(0, 0, 0);\n}, function (date, step) {\n  date.setTime(+date + step * _duration.durationHour);\n}, function (start, end) {\n  return (end - start) / _duration.durationHour;\n}, function (date) {\n  return date.getUTCHours();\n});\nvar _default = utcHour;\nexports.default = _default;\nvar utcHours = utcHour.range;\nexports.utcHours = utcHours;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"HXiV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.utcDays = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar utcDay = (0, _interval.default)(function (date) {\n  date.setUTCHours(0, 0, 0, 0);\n}, function (date, step) {\n  date.setUTCDate(date.getUTCDate() + step);\n}, function (start, end) {\n  return (end - start) / _duration.durationDay;\n}, function (date) {\n  return date.getUTCDate() - 1;\n});\nvar _default = utcDay;\nexports.default = _default;\nvar utcDays = utcDay.range;\nexports.utcDays = utcDays;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"CRXo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.utcSaturdays = exports.utcFridays = exports.utcThursdays = exports.utcWednesdays = exports.utcTuesdays = exports.utcMondays = exports.utcSundays = exports.utcSaturday = exports.utcFriday = exports.utcThursday = exports.utcWednesday = exports.utcTuesday = exports.utcMonday = exports.utcSunday = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _duration = require(\"./duration.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction utcWeekday(i) {\n  return (0, _interval.default)(function (date) {\n    date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n    date.setUTCHours(0, 0, 0, 0);\n  }, function (date, step) {\n    date.setUTCDate(date.getUTCDate() + step * 7);\n  }, function (start, end) {\n    return (end - start) / _duration.durationWeek;\n  });\n}\n\nvar utcSunday = utcWeekday(0);\nexports.utcSunday = utcSunday;\nvar utcMonday = utcWeekday(1);\nexports.utcMonday = utcMonday;\nvar utcTuesday = utcWeekday(2);\nexports.utcTuesday = utcTuesday;\nvar utcWednesday = utcWeekday(3);\nexports.utcWednesday = utcWednesday;\nvar utcThursday = utcWeekday(4);\nexports.utcThursday = utcThursday;\nvar utcFriday = utcWeekday(5);\nexports.utcFriday = utcFriday;\nvar utcSaturday = utcWeekday(6);\nexports.utcSaturday = utcSaturday;\nvar utcSundays = utcSunday.range;\nexports.utcSundays = utcSundays;\nvar utcMondays = utcMonday.range;\nexports.utcMondays = utcMondays;\nvar utcTuesdays = utcTuesday.range;\nexports.utcTuesdays = utcTuesdays;\nvar utcWednesdays = utcWednesday.range;\nexports.utcWednesdays = utcWednesdays;\nvar utcThursdays = utcThursday.range;\nexports.utcThursdays = utcThursdays;\nvar utcFridays = utcFriday.range;\nexports.utcFridays = utcFridays;\nvar utcSaturdays = utcSaturday.range;\nexports.utcSaturdays = utcSaturdays;\n},{\"./interval.js\":\"QFUQ\",\"./duration.js\":\"Vnta\"}],\"EphR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.utcMonths = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar utcMonth = (0, _interval.default)(function (date) {\n  date.setUTCDate(1);\n  date.setUTCHours(0, 0, 0, 0);\n}, function (date, step) {\n  date.setUTCMonth(date.getUTCMonth() + step);\n}, function (start, end) {\n  return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function (date) {\n  return date.getUTCMonth();\n});\nvar _default = utcMonth;\nexports.default = _default;\nvar utcMonths = utcMonth.range;\nexports.utcMonths = utcMonths;\n},{\"./interval.js\":\"QFUQ\"}],\"Abfv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.utcYears = exports.default = void 0;\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar utcYear = (0, _interval.default)(function (date) {\n  date.setUTCMonth(0, 1);\n  date.setUTCHours(0, 0, 0, 0);\n}, function (date, step) {\n  date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function (start, end) {\n  return end.getUTCFullYear() - start.getUTCFullYear();\n}, function (date) {\n  return date.getUTCFullYear();\n}); // An optimized implementation for this simple case.\n\nutcYear.every = function (k) {\n  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : (0, _interval.default)(function (date) {\n    date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n    date.setUTCMonth(0, 1);\n    date.setUTCHours(0, 0, 0, 0);\n  }, function (date, step) {\n    date.setUTCFullYear(date.getUTCFullYear() + step * k);\n  });\n};\n\nvar _default = utcYear;\nexports.default = _default;\nvar utcYears = utcYear.range;\nexports.utcYears = utcYears;\n},{\"./interval.js\":\"QFUQ\"}],\"hQYG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"timeInterval\", {\n  enumerable: true,\n  get: function () {\n    return _interval.default;\n  }\n});\nObject.defineProperty(exports, \"timeMillisecond\", {\n  enumerable: true,\n  get: function () {\n    return _millisecond.default;\n  }\n});\nObject.defineProperty(exports, \"timeMilliseconds\", {\n  enumerable: true,\n  get: function () {\n    return _millisecond.milliseconds;\n  }\n});\nObject.defineProperty(exports, \"utcMillisecond\", {\n  enumerable: true,\n  get: function () {\n    return _millisecond.default;\n  }\n});\nObject.defineProperty(exports, \"utcMilliseconds\", {\n  enumerable: true,\n  get: function () {\n    return _millisecond.milliseconds;\n  }\n});\nObject.defineProperty(exports, \"timeSecond\", {\n  enumerable: true,\n  get: function () {\n    return _second.default;\n  }\n});\nObject.defineProperty(exports, \"timeSeconds\", {\n  enumerable: true,\n  get: function () {\n    return _second.seconds;\n  }\n});\nObject.defineProperty(exports, \"utcSecond\", {\n  enumerable: true,\n  get: function () {\n    return _second.default;\n  }\n});\nObject.defineProperty(exports, \"utcSeconds\", {\n  enumerable: true,\n  get: function () {\n    return _second.seconds;\n  }\n});\nObject.defineProperty(exports, \"timeMinute\", {\n  enumerable: true,\n  get: function () {\n    return _minute.default;\n  }\n});\nObject.defineProperty(exports, \"timeMinutes\", {\n  enumerable: true,\n  get: function () {\n    return _minute.minutes;\n  }\n});\nObject.defineProperty(exports, \"timeHour\", {\n  enumerable: true,\n  get: function () {\n    return _hour.default;\n  }\n});\nObject.defineProperty(exports, \"timeHours\", {\n  enumerable: true,\n  get: function () {\n    return _hour.hours;\n  }\n});\nObject.defineProperty(exports, \"timeDay\", {\n  enumerable: true,\n  get: function () {\n    return _day.default;\n  }\n});\nObject.defineProperty(exports, \"timeDays\", {\n  enumerable: true,\n  get: function () {\n    return _day.days;\n  }\n});\nObject.defineProperty(exports, \"timeWeek\", {\n  enumerable: true,\n  get: function () {\n    return _week.sunday;\n  }\n});\nObject.defineProperty(exports, \"timeWeeks\", {\n  enumerable: true,\n  get: function () {\n    return _week.sundays;\n  }\n});\nObject.defineProperty(exports, \"timeSunday\", {\n  enumerable: true,\n  get: function () {\n    return _week.sunday;\n  }\n});\nObject.defineProperty(exports, \"timeSundays\", {\n  enumerable: true,\n  get: function () {\n    return _week.sundays;\n  }\n});\nObject.defineProperty(exports, \"timeMonday\", {\n  enumerable: true,\n  get: function () {\n    return _week.monday;\n  }\n});\nObject.defineProperty(exports, \"timeMondays\", {\n  enumerable: true,\n  get: function () {\n    return _week.mondays;\n  }\n});\nObject.defineProperty(exports, \"timeTuesday\", {\n  enumerable: true,\n  get: function () {\n    return _week.tuesday;\n  }\n});\nObject.defineProperty(exports, \"timeTuesdays\", {\n  enumerable: true,\n  get: function () {\n    return _week.tuesdays;\n  }\n});\nObject.defineProperty(exports, \"timeWednesday\", {\n  enumerable: true,\n  get: function () {\n    return _week.wednesday;\n  }\n});\nObject.defineProperty(exports, \"timeWednesdays\", {\n  enumerable: true,\n  get: function () {\n    return _week.wednesdays;\n  }\n});\nObject.defineProperty(exports, \"timeThursday\", {\n  enumerable: true,\n  get: function () {\n    return _week.thursday;\n  }\n});\nObject.defineProperty(exports, \"timeThursdays\", {\n  enumerable: true,\n  get: function () {\n    return _week.thursdays;\n  }\n});\nObject.defineProperty(exports, \"timeFriday\", {\n  enumerable: true,\n  get: function () {\n    return _week.friday;\n  }\n});\nObject.defineProperty(exports, \"timeFridays\", {\n  enumerable: true,\n  get: function () {\n    return _week.fridays;\n  }\n});\nObject.defineProperty(exports, \"timeSaturday\", {\n  enumerable: true,\n  get: function () {\n    return _week.saturday;\n  }\n});\nObject.defineProperty(exports, \"timeSaturdays\", {\n  enumerable: true,\n  get: function () {\n    return _week.saturdays;\n  }\n});\nObject.defineProperty(exports, \"timeMonth\", {\n  enumerable: true,\n  get: function () {\n    return _month.default;\n  }\n});\nObject.defineProperty(exports, \"timeMonths\", {\n  enumerable: true,\n  get: function () {\n    return _month.months;\n  }\n});\nObject.defineProperty(exports, \"timeYear\", {\n  enumerable: true,\n  get: function () {\n    return _year.default;\n  }\n});\nObject.defineProperty(exports, \"timeYears\", {\n  enumerable: true,\n  get: function () {\n    return _year.years;\n  }\n});\nObject.defineProperty(exports, \"utcMinute\", {\n  enumerable: true,\n  get: function () {\n    return _utcMinute.default;\n  }\n});\nObject.defineProperty(exports, \"utcMinutes\", {\n  enumerable: true,\n  get: function () {\n    return _utcMinute.utcMinutes;\n  }\n});\nObject.defineProperty(exports, \"utcHour\", {\n  enumerable: true,\n  get: function () {\n    return _utcHour.default;\n  }\n});\nObject.defineProperty(exports, \"utcHours\", {\n  enumerable: true,\n  get: function () {\n    return _utcHour.utcHours;\n  }\n});\nObject.defineProperty(exports, \"utcDay\", {\n  enumerable: true,\n  get: function () {\n    return _utcDay.default;\n  }\n});\nObject.defineProperty(exports, \"utcDays\", {\n  enumerable: true,\n  get: function () {\n    return _utcDay.utcDays;\n  }\n});\nObject.defineProperty(exports, \"utcWeek\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcSunday;\n  }\n});\nObject.defineProperty(exports, \"utcWeeks\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcSundays;\n  }\n});\nObject.defineProperty(exports, \"utcSunday\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcSunday;\n  }\n});\nObject.defineProperty(exports, \"utcSundays\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcSundays;\n  }\n});\nObject.defineProperty(exports, \"utcMonday\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcMonday;\n  }\n});\nObject.defineProperty(exports, \"utcMondays\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcMondays;\n  }\n});\nObject.defineProperty(exports, \"utcTuesday\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcTuesday;\n  }\n});\nObject.defineProperty(exports, \"utcTuesdays\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcTuesdays;\n  }\n});\nObject.defineProperty(exports, \"utcWednesday\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcWednesday;\n  }\n});\nObject.defineProperty(exports, \"utcWednesdays\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcWednesdays;\n  }\n});\nObject.defineProperty(exports, \"utcThursday\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcThursday;\n  }\n});\nObject.defineProperty(exports, \"utcThursdays\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcThursdays;\n  }\n});\nObject.defineProperty(exports, \"utcFriday\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcFriday;\n  }\n});\nObject.defineProperty(exports, \"utcFridays\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcFridays;\n  }\n});\nObject.defineProperty(exports, \"utcSaturday\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcSaturday;\n  }\n});\nObject.defineProperty(exports, \"utcSaturdays\", {\n  enumerable: true,\n  get: function () {\n    return _utcWeek.utcSaturdays;\n  }\n});\nObject.defineProperty(exports, \"utcMonth\", {\n  enumerable: true,\n  get: function () {\n    return _utcMonth.default;\n  }\n});\nObject.defineProperty(exports, \"utcMonths\", {\n  enumerable: true,\n  get: function () {\n    return _utcMonth.utcMonths;\n  }\n});\nObject.defineProperty(exports, \"utcYear\", {\n  enumerable: true,\n  get: function () {\n    return _utcYear.default;\n  }\n});\nObject.defineProperty(exports, \"utcYears\", {\n  enumerable: true,\n  get: function () {\n    return _utcYear.utcYears;\n  }\n});\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nvar _millisecond = _interopRequireWildcard(require(\"./millisecond.js\"));\n\nvar _second = _interopRequireWildcard(require(\"./second.js\"));\n\nvar _minute = _interopRequireWildcard(require(\"./minute.js\"));\n\nvar _hour = _interopRequireWildcard(require(\"./hour.js\"));\n\nvar _day = _interopRequireWildcard(require(\"./day.js\"));\n\nvar _week = require(\"./week.js\");\n\nvar _month = _interopRequireWildcard(require(\"./month.js\"));\n\nvar _year = _interopRequireWildcard(require(\"./year.js\"));\n\nvar _utcMinute = _interopRequireWildcard(require(\"./utcMinute.js\"));\n\nvar _utcHour = _interopRequireWildcard(require(\"./utcHour.js\"));\n\nvar _utcDay = _interopRequireWildcard(require(\"./utcDay.js\"));\n\nvar _utcWeek = require(\"./utcWeek.js\");\n\nvar _utcMonth = _interopRequireWildcard(require(\"./utcMonth.js\"));\n\nvar _utcYear = _interopRequireWildcard(require(\"./utcYear.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./interval.js\":\"QFUQ\",\"./millisecond.js\":\"WVmH\",\"./second.js\":\"AYLw\",\"./minute.js\":\"etD9\",\"./hour.js\":\"py4n\",\"./day.js\":\"LWrz\",\"./week.js\":\"Dweu\",\"./month.js\":\"gOAO\",\"./year.js\":\"kReM\",\"./utcMinute.js\":\"O6lW\",\"./utcHour.js\":\"qnVA\",\"./utcDay.js\":\"HXiV\",\"./utcWeek.js\":\"CRXo\",\"./utcMonth.js\":\"EphR\",\"./utcYear.js\":\"Abfv\"}],\"UbHU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = formatLocale;\n\nvar _d3Time = require(\"d3-time\");\n\nfunction localDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n    date.setFullYear(d.y);\n    return date;\n  }\n\n  return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n  if (0 <= d.y && d.y < 100) {\n    var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n    date.setUTCFullYear(d.y);\n    return date;\n  }\n\n  return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n  return {\n    y: y,\n    m: m,\n    d: d,\n    H: 0,\n    M: 0,\n    S: 0,\n    L: 0\n  };\n}\n\nfunction formatLocale(locale) {\n  var locale_dateTime = locale.dateTime,\n      locale_date = locale.date,\n      locale_time = locale.time,\n      locale_periods = locale.periods,\n      locale_weekdays = locale.days,\n      locale_shortWeekdays = locale.shortDays,\n      locale_months = locale.months,\n      locale_shortMonths = locale.shortMonths;\n  var periodRe = formatRe(locale_periods),\n      periodLookup = formatLookup(locale_periods),\n      weekdayRe = formatRe(locale_weekdays),\n      weekdayLookup = formatLookup(locale_weekdays),\n      shortWeekdayRe = formatRe(locale_shortWeekdays),\n      shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n      monthRe = formatRe(locale_months),\n      monthLookup = formatLookup(locale_months),\n      shortMonthRe = formatRe(locale_shortMonths),\n      shortMonthLookup = formatLookup(locale_shortMonths);\n  var formats = {\n    \"a\": formatShortWeekday,\n    \"A\": formatWeekday,\n    \"b\": formatShortMonth,\n    \"B\": formatMonth,\n    \"c\": null,\n    \"d\": formatDayOfMonth,\n    \"e\": formatDayOfMonth,\n    \"f\": formatMicroseconds,\n    \"H\": formatHour24,\n    \"I\": formatHour12,\n    \"j\": formatDayOfYear,\n    \"L\": formatMilliseconds,\n    \"m\": formatMonthNumber,\n    \"M\": formatMinutes,\n    \"p\": formatPeriod,\n    \"q\": formatQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatSeconds,\n    \"u\": formatWeekdayNumberMonday,\n    \"U\": formatWeekNumberSunday,\n    \"V\": formatWeekNumberISO,\n    \"w\": formatWeekdayNumberSunday,\n    \"W\": formatWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatYear,\n    \"Y\": formatFullYear,\n    \"Z\": formatZone,\n    \"%\": formatLiteralPercent\n  };\n  var utcFormats = {\n    \"a\": formatUTCShortWeekday,\n    \"A\": formatUTCWeekday,\n    \"b\": formatUTCShortMonth,\n    \"B\": formatUTCMonth,\n    \"c\": null,\n    \"d\": formatUTCDayOfMonth,\n    \"e\": formatUTCDayOfMonth,\n    \"f\": formatUTCMicroseconds,\n    \"H\": formatUTCHour24,\n    \"I\": formatUTCHour12,\n    \"j\": formatUTCDayOfYear,\n    \"L\": formatUTCMilliseconds,\n    \"m\": formatUTCMonthNumber,\n    \"M\": formatUTCMinutes,\n    \"p\": formatUTCPeriod,\n    \"q\": formatUTCQuarter,\n    \"Q\": formatUnixTimestamp,\n    \"s\": formatUnixTimestampSeconds,\n    \"S\": formatUTCSeconds,\n    \"u\": formatUTCWeekdayNumberMonday,\n    \"U\": formatUTCWeekNumberSunday,\n    \"V\": formatUTCWeekNumberISO,\n    \"w\": formatUTCWeekdayNumberSunday,\n    \"W\": formatUTCWeekNumberMonday,\n    \"x\": null,\n    \"X\": null,\n    \"y\": formatUTCYear,\n    \"Y\": formatUTCFullYear,\n    \"Z\": formatUTCZone,\n    \"%\": formatLiteralPercent\n  };\n  var parses = {\n    \"a\": parseShortWeekday,\n    \"A\": parseWeekday,\n    \"b\": parseShortMonth,\n    \"B\": parseMonth,\n    \"c\": parseLocaleDateTime,\n    \"d\": parseDayOfMonth,\n    \"e\": parseDayOfMonth,\n    \"f\": parseMicroseconds,\n    \"H\": parseHour24,\n    \"I\": parseHour24,\n    \"j\": parseDayOfYear,\n    \"L\": parseMilliseconds,\n    \"m\": parseMonthNumber,\n    \"M\": parseMinutes,\n    \"p\": parsePeriod,\n    \"q\": parseQuarter,\n    \"Q\": parseUnixTimestamp,\n    \"s\": parseUnixTimestampSeconds,\n    \"S\": parseSeconds,\n    \"u\": parseWeekdayNumberMonday,\n    \"U\": parseWeekNumberSunday,\n    \"V\": parseWeekNumberISO,\n    \"w\": parseWeekdayNumberSunday,\n    \"W\": parseWeekNumberMonday,\n    \"x\": parseLocaleDate,\n    \"X\": parseLocaleTime,\n    \"y\": parseYear,\n    \"Y\": parseFullYear,\n    \"Z\": parseZone,\n    \"%\": parseLiteralPercent\n  }; // These recursive directive definitions must be deferred.\n\n  formats.x = newFormat(locale_date, formats);\n  formats.X = newFormat(locale_time, formats);\n  formats.c = newFormat(locale_dateTime, formats);\n  utcFormats.x = newFormat(locale_date, utcFormats);\n  utcFormats.X = newFormat(locale_time, utcFormats);\n  utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n  function newFormat(specifier, formats) {\n    return function (date) {\n      var string = [],\n          i = -1,\n          j = 0,\n          n = specifier.length,\n          c,\n          pad,\n          format;\n      if (!(date instanceof Date)) date = new Date(+date);\n\n      while (++i < n) {\n        if (specifier.charCodeAt(i) === 37) {\n          string.push(specifier.slice(j, i));\n          if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);else pad = c === \"e\" ? \" \" : \"0\";\n          if (format = formats[c]) c = format(date, pad);\n          string.push(c);\n          j = i + 1;\n        }\n      }\n\n      string.push(specifier.slice(j, i));\n      return string.join(\"\");\n    };\n  }\n\n  function newParse(specifier, Z) {\n    return function (string) {\n      var d = newDate(1900, undefined, 1),\n          i = parseSpecifier(d, specifier, string += \"\", 0),\n          week,\n          day;\n      if (i != string.length) return null; // If a UNIX timestamp is specified, return it.\n\n      if (\"Q\" in d) return new Date(d.Q);\n      if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0)); // If this is utcParse, never use the local timezone.\n\n      if (Z && !(\"Z\" in d)) d.Z = 0; // The am-pm flag is 0 for AM, and 1 for PM.\n\n      if (\"p\" in d) d.H = d.H % 12 + d.p * 12; // If the month was not specified, inherit from the quarter.\n\n      if (d.m === undefined) d.m = \"q\" in d ? d.q : 0; // Convert day-of-week and week-of-year to day-of-year.\n\n      if (\"V\" in d) {\n        if (d.V < 1 || d.V > 53) return null;\n        if (!(\"w\" in d)) d.w = 1;\n\n        if (\"Z\" in d) {\n          week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n          week = day > 4 || day === 0 ? _d3Time.utcMonday.ceil(week) : (0, _d3Time.utcMonday)(week);\n          week = _d3Time.utcDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getUTCFullYear();\n          d.m = week.getUTCMonth();\n          d.d = week.getUTCDate() + (d.w + 6) % 7;\n        } else {\n          week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n          week = day > 4 || day === 0 ? _d3Time.timeMonday.ceil(week) : (0, _d3Time.timeMonday)(week);\n          week = _d3Time.timeDay.offset(week, (d.V - 1) * 7);\n          d.y = week.getFullYear();\n          d.m = week.getMonth();\n          d.d = week.getDate() + (d.w + 6) % 7;\n        }\n      } else if (\"W\" in d || \"U\" in d) {\n        if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n        day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n        d.m = 0;\n        d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n      } // If a time zone is specified, all fields are interpreted as UTC and then\n      // offset according to the specified time zone.\n\n\n      if (\"Z\" in d) {\n        d.H += d.Z / 100 | 0;\n        d.M += d.Z % 100;\n        return utcDate(d);\n      } // Otherwise, all fields are in local time.\n\n\n      return localDate(d);\n    };\n  }\n\n  function parseSpecifier(d, specifier, string, j) {\n    var i = 0,\n        n = specifier.length,\n        m = string.length,\n        c,\n        parse;\n\n    while (i < n) {\n      if (j >= m) return -1;\n      c = specifier.charCodeAt(i++);\n\n      if (c === 37) {\n        c = specifier.charAt(i++);\n        parse = parses[c in pads ? specifier.charAt(i++) : c];\n        if (!parse || (j = parse(d, string, j)) < 0) return -1;\n      } else if (c != string.charCodeAt(j++)) {\n        return -1;\n      }\n    }\n\n    return j;\n  }\n\n  function parsePeriod(d, string, i) {\n    var n = periodRe.exec(string.slice(i));\n    return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseShortWeekday(d, string, i) {\n    var n = shortWeekdayRe.exec(string.slice(i));\n    return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseWeekday(d, string, i) {\n    var n = weekdayRe.exec(string.slice(i));\n    return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseShortMonth(d, string, i) {\n    var n = shortMonthRe.exec(string.slice(i));\n    return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseMonth(d, string, i) {\n    var n = monthRe.exec(string.slice(i));\n    return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n  }\n\n  function parseLocaleDateTime(d, string, i) {\n    return parseSpecifier(d, locale_dateTime, string, i);\n  }\n\n  function parseLocaleDate(d, string, i) {\n    return parseSpecifier(d, locale_date, string, i);\n  }\n\n  function parseLocaleTime(d, string, i) {\n    return parseSpecifier(d, locale_time, string, i);\n  }\n\n  function formatShortWeekday(d) {\n    return locale_shortWeekdays[d.getDay()];\n  }\n\n  function formatWeekday(d) {\n    return locale_weekdays[d.getDay()];\n  }\n\n  function formatShortMonth(d) {\n    return locale_shortMonths[d.getMonth()];\n  }\n\n  function formatMonth(d) {\n    return locale_months[d.getMonth()];\n  }\n\n  function formatPeriod(d) {\n    return locale_periods[+(d.getHours() >= 12)];\n  }\n\n  function formatQuarter(d) {\n    return 1 + ~~(d.getMonth() / 3);\n  }\n\n  function formatUTCShortWeekday(d) {\n    return locale_shortWeekdays[d.getUTCDay()];\n  }\n\n  function formatUTCWeekday(d) {\n    return locale_weekdays[d.getUTCDay()];\n  }\n\n  function formatUTCShortMonth(d) {\n    return locale_shortMonths[d.getUTCMonth()];\n  }\n\n  function formatUTCMonth(d) {\n    return locale_months[d.getUTCMonth()];\n  }\n\n  function formatUTCPeriod(d) {\n    return locale_periods[+(d.getUTCHours() >= 12)];\n  }\n\n  function formatUTCQuarter(d) {\n    return 1 + ~~(d.getUTCMonth() / 3);\n  }\n\n  return {\n    format: function (specifier) {\n      var f = newFormat(specifier += \"\", formats);\n\n      f.toString = function () {\n        return specifier;\n      };\n\n      return f;\n    },\n    parse: function (specifier) {\n      var p = newParse(specifier += \"\", false);\n\n      p.toString = function () {\n        return specifier;\n      };\n\n      return p;\n    },\n    utcFormat: function (specifier) {\n      var f = newFormat(specifier += \"\", utcFormats);\n\n      f.toString = function () {\n        return specifier;\n      };\n\n      return f;\n    },\n    utcParse: function (specifier) {\n      var p = newParse(specifier += \"\", true);\n\n      p.toString = function () {\n        return specifier;\n      };\n\n      return p;\n    }\n  };\n}\n\nvar pads = {\n  \"-\": \"\",\n  \"_\": \" \",\n  \"0\": \"0\"\n},\n    numberRe = /^\\s*\\d+/,\n    // note: ignores next directive\npercentRe = /^%/,\n    requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n  var sign = value < 0 ? \"-\" : \"\",\n      string = (sign ? -value : value) + \"\",\n      length = string.length;\n  return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n  return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n  return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n  var map = {},\n      i = -1,\n      n = names.length;\n\n  while (++i < n) map[names[i].toLowerCase()] = i;\n\n  return map;\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 4));\n  return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n  var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n  return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 1));\n  return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 2));\n  return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 3));\n  return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i, i + 6));\n  return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n  var n = percentRe.exec(string.slice(i, i + 1));\n  return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n  var n = numberRe.exec(string.slice(i));\n  return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n  return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n  return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n  return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n  return pad(1 + _d3Time.timeDay.count((0, _d3Time.timeYear)(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n  return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n  return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n  return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n  return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n  return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n  var day = d.getDay();\n  return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n  return pad(_d3Time.timeSunday.count((0, _d3Time.timeYear)(d) - 1, d), p, 2);\n}\n\nfunction formatWeekNumberISO(d, p) {\n  var day = d.getDay();\n  d = day >= 4 || day === 0 ? (0, _d3Time.timeThursday)(d) : _d3Time.timeThursday.ceil(d);\n  return pad(_d3Time.timeThursday.count((0, _d3Time.timeYear)(d), d) + ((0, _d3Time.timeYear)(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n  return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n  return pad(_d3Time.timeMonday.count((0, _d3Time.timeYear)(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n  return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n  return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n  var z = d.getTimezoneOffset();\n  return (z > 0 ? \"-\" : (z *= -1, \"+\")) + pad(z / 60 | 0, \"0\", 2) + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n  return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n  return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n  return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n  return pad(1 + _d3Time.utcDay.count((0, _d3Time.utcYear)(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n  return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n  return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n  return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n  return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n  return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n  var dow = d.getUTCDay();\n  return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n  return pad(_d3Time.utcSunday.count((0, _d3Time.utcYear)(d) - 1, d), p, 2);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n  var day = d.getUTCDay();\n  d = day >= 4 || day === 0 ? (0, _d3Time.utcThursday)(d) : _d3Time.utcThursday.ceil(d);\n  return pad(_d3Time.utcThursday.count((0, _d3Time.utcYear)(d), d) + ((0, _d3Time.utcYear)(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n  return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n  return pad(_d3Time.utcMonday.count((0, _d3Time.utcYear)(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n  return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n  return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n  return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n  return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n  return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n  return Math.floor(+d / 1000);\n}\n},{\"d3-time\":\"hQYG\"}],\"csjH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = defaultLocale;\nexports.utcParse = exports.utcFormat = exports.timeParse = exports.timeFormat = void 0;\n\nvar _locale = _interopRequireDefault(require(\"./locale.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar locale;\nvar timeFormat;\nexports.timeFormat = timeFormat;\nvar timeParse;\nexports.timeParse = timeParse;\nvar utcFormat;\nexports.utcFormat = utcFormat;\nvar utcParse;\nexports.utcParse = utcParse;\ndefaultLocale({\n  dateTime: \"%x, %X\",\n  date: \"%-m/%-d/%Y\",\n  time: \"%-I:%M:%S %p\",\n  periods: [\"AM\", \"PM\"],\n  days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n  shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n  months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n  shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nfunction defaultLocale(definition) {\n  locale = (0, _locale.default)(definition);\n  exports.timeFormat = timeFormat = locale.format;\n  exports.timeParse = timeParse = locale.parse;\n  exports.utcFormat = utcFormat = locale.utcFormat;\n  exports.utcParse = utcParse = locale.utcParse;\n  return locale;\n}\n},{\"./locale.js\":\"UbHU\"}],\"PKKZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.isoSpecifier = void 0;\n\nvar _defaultLocale = require(\"./defaultLocale.js\");\n\nvar isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\nexports.isoSpecifier = isoSpecifier;\n\nfunction formatIsoNative(date) {\n  return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString ? formatIsoNative : (0, _defaultLocale.utcFormat)(isoSpecifier);\nvar _default = formatIso;\nexports.default = _default;\n},{\"./defaultLocale.js\":\"csjH\"}],\"d4jk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _isoFormat = require(\"./isoFormat.js\");\n\nvar _defaultLocale = require(\"./defaultLocale.js\");\n\nfunction parseIsoNative(string) {\n  var date = new Date(string);\n  return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\") ? parseIsoNative : (0, _defaultLocale.utcParse)(_isoFormat.isoSpecifier);\nvar _default = parseIso;\nexports.default = _default;\n},{\"./isoFormat.js\":\"PKKZ\",\"./defaultLocale.js\":\"csjH\"}],\"UYpZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"timeFormatDefaultLocale\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.default;\n  }\n});\nObject.defineProperty(exports, \"timeFormat\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.timeFormat;\n  }\n});\nObject.defineProperty(exports, \"timeParse\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.timeParse;\n  }\n});\nObject.defineProperty(exports, \"utcFormat\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.utcFormat;\n  }\n});\nObject.defineProperty(exports, \"utcParse\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.utcParse;\n  }\n});\nObject.defineProperty(exports, \"timeFormatLocale\", {\n  enumerable: true,\n  get: function () {\n    return _locale.default;\n  }\n});\nObject.defineProperty(exports, \"isoFormat\", {\n  enumerable: true,\n  get: function () {\n    return _isoFormat.default;\n  }\n});\nObject.defineProperty(exports, \"isoParse\", {\n  enumerable: true,\n  get: function () {\n    return _isoParse.default;\n  }\n});\n\nvar _defaultLocale = _interopRequireWildcard(require(\"./defaultLocale.js\"));\n\nvar _locale = _interopRequireDefault(require(\"./locale.js\"));\n\nvar _isoFormat = _interopRequireDefault(require(\"./isoFormat.js\"));\n\nvar _isoParse = _interopRequireDefault(require(\"./isoParse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./defaultLocale.js\":\"csjH\",\"./locale.js\":\"UbHU\",\"./isoFormat.js\":\"PKKZ\",\"./isoParse.js\":\"d4jk\"}],\"CTKo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _type = require(\"./type\");\n\nvar _index = require(\"./formats/index\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3TimeFormat = require(\"d3-time-format\");\n\nfunction _default(data, schema, dateParse) {\n  schema = schema || {};\n  const reader = (0, _index.formats)(schema.type || 'json');\n  if (!reader) (0, _vegaUtil.error)('Unknown data format type: ' + schema.type);\n  data = reader(data, schema);\n  if (schema.parse) parse(data, schema.parse, dateParse);\n  if ((0, _vegaUtil.hasOwnProperty)(data, 'columns')) delete data.columns;\n  return data;\n}\n\nfunction parse(data, types, dateParse) {\n  if (!data.length) return; // early exit for empty data\n\n  dateParse = dateParse || _d3TimeFormat.timeParse;\n  var fields = data.columns || Object.keys(data[0]),\n      parsers,\n      datum,\n      field,\n      i,\n      j,\n      n,\n      m;\n  if (types === 'auto') types = (0, _type.inferTypes)(data, fields);\n  fields = Object.keys(types);\n  parsers = fields.map(function (field) {\n    var type = types[field],\n        parts,\n        pattern;\n\n    if (type && (type.indexOf('date:') === 0 || type.indexOf('utc:') === 0)) {\n      parts = type.split(/:(.+)?/, 2); // split on first :\n\n      pattern = parts[1];\n\n      if (pattern[0] === '\\'' && pattern[pattern.length - 1] === '\\'' || pattern[0] === '\"' && pattern[pattern.length - 1] === '\"') {\n        pattern = pattern.slice(1, -1);\n      }\n\n      return parts[0] === 'utc' ? (0, _d3TimeFormat.utcParse)(pattern) : dateParse(pattern);\n    }\n\n    if (!_type.typeParsers[type]) {\n      throw Error('Illegal format pattern: ' + field + ':' + type);\n    }\n\n    return _type.typeParsers[type];\n  });\n\n  for (i = 0, n = data.length, m = fields.length; i < n; ++i) {\n    datum = data[i];\n\n    for (j = 0; j < m; ++j) {\n      field = fields[j];\n      datum[field] = parsers[j](datum[field]);\n    }\n  }\n}\n},{\"./type\":\"CCeE\",\"./formats/index\":\"O13M\",\"vega-util\":\"d61Z\",\"d3-time-format\":\"UYpZ\"}],\"ELDD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"read\", {\n  enumerable: true,\n  get: function () {\n    return _read.default;\n  }\n});\nObject.defineProperty(exports, \"inferType\", {\n  enumerable: true,\n  get: function () {\n    return _type.inferType;\n  }\n});\nObject.defineProperty(exports, \"inferTypes\", {\n  enumerable: true,\n  get: function () {\n    return _type.inferTypes;\n  }\n});\nObject.defineProperty(exports, \"typeParsers\", {\n  enumerable: true,\n  get: function () {\n    return _type.typeParsers;\n  }\n});\nObject.defineProperty(exports, \"format\", {\n  enumerable: true,\n  get: function () {\n    return _index.format;\n  }\n});\nObject.defineProperty(exports, \"formats\", {\n  enumerable: true,\n  get: function () {\n    return _index.formats;\n  }\n});\nObject.defineProperty(exports, \"responseType\", {\n  enumerable: true,\n  get: function () {\n    return _index.responseType;\n  }\n});\nexports.loader = void 0;\n\nvar _loader = _interopRequireDefault(require(\"./src/loader\"));\n\nvar _read = _interopRequireDefault(require(\"./src/read\"));\n\nvar _type = require(\"./src/type\");\n\nvar _index = require(\"./src/formats/index\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar loader = (0, _loader.default)(typeof fetch !== 'undefined' && fetch, // use built-in fetch API\nnull // no file system access\n);\nexports.loader = loader;\n},{\"./src/loader\":\"b5x5\",\"./src/read\":\"CTKo\",\"./src/type\":\"CCeE\",\"./src/formats/index\":\"O13M\"}],\"YYff\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ingest = ingest;\nexports.request = request;\nexports.preload = preload;\nexports.parse = void 0;\n\nvar _vegaLoader = require(\"vega-loader\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nconst parse = _vegaLoader.read;\n/**\n * Ingests new data into the dataflow. First parses the data using the\n * vega-loader read method, then pulses a changeset to the target operator.\n * @param {Operator} target - The Operator to target with ingested data,\n *   typically a Collect transform instance.\n * @param {*} data - The input data, prior to parsing. For JSON this may\n *   be a string or an object. For CSV, TSV, etc should be a string.\n * @param {object} format - The data format description for parsing\n *   loaded data. This object is passed to the vega-loader read method.\n * @returns {Dataflow}\n */\n\nexports.parse = parse;\n\nfunction ingest(target, data, format) {\n  return this.pulse(target, this.changeset().insert(parse(data, format)));\n}\n/**\n * Request data from an external source, parse it, and return a Promise.\n * @param {string} url - The URL from which to load the data. This string\n *   is passed to the vega-loader load method.\n * @param {object} [format] - The data format description for parsing\n *   loaded data. This object is passed to the vega-loader read method.\n * @return {Promise} A Promise that resolves upon completion of the request.\n *   The resolved object contains the following properties:\n *   - data: an array of parsed data (or null upon error)\n *   - status: a code for success (0), load fail (-1), or parse fail (-2)\n */\n\n\nasync function request(url, format) {\n  const df = this;\n  let status = 0,\n      data;\n\n  try {\n    data = await df.loader().load(url, {\n      context: 'dataflow',\n      response: (0, _vegaLoader.responseType)(format && format.type)\n    });\n\n    try {\n      data = parse(data, format);\n    } catch (err) {\n      status = -2;\n      df.warn('Data ingestion failed', url, err);\n    }\n  } catch (err) {\n    status = -1;\n    df.warn('Loading failed', url, err);\n  }\n\n  return {\n    data,\n    status\n  };\n}\n\nasync function preload(target, url, format) {\n  const df = this,\n        pending = df._pending || loadPending(df);\n  pending.requests += 1;\n  const res = await df.request(url, format);\n  df.pulse(target, df.changeset().remove(_vegaUtil.truthy).insert(res.data || []));\n  pending.done();\n  return res;\n}\n\nfunction loadPending(df) {\n  var pending = new Promise(function (a) {\n    accept = a;\n  }),\n      accept;\n  pending.requests = 0;\n\n  pending.done = function () {\n    if (--pending.requests === 0) {\n      df._pending = null;\n      accept(df);\n    }\n  };\n\n  return df._pending = pending;\n}\n},{\"vega-loader\":\"ELDD\",\"vega-util\":\"d61Z\"}],\"LImI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _Operator = _interopRequireDefault(require(\"../Operator\"));\n\nvar _ChangeSet = require(\"../ChangeSet\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar SKIP = {\n  skip: true\n};\n/**\n * Perform operator updates in response to events. Applies an\n * update function to compute a new operator value. If the update function\n * returns a {@link ChangeSet}, the operator will be pulsed with those tuple\n * changes. Otherwise, the operator value will be updated to the return value.\n * @param {EventStream|Operator} source - The event source to react to.\n *   This argument can be either an EventStream or an Operator.\n * @param {Operator|function(object):Operator} target - The operator to update.\n *   This argument can either be an Operator instance or (if the source\n *   argument is an EventStream), a function that accepts an event object as\n *   input and returns an Operator to target.\n * @param {function(Parameters,Event): *} [update] - Optional update function\n *   to compute the new operator value, or a literal value to set. Update\n *   functions expect to receive a parameter object and event as arguments.\n *   This function can either return a new operator value or (if the source\n *   argument is an EventStream) a {@link ChangeSet} instance to pulse\n *   the target operator with tuple changes.\n * @param {object} [params] - The update function parameters.\n * @param {object} [options] - Additional options hash. If not overridden,\n *   updated operators will be skipped by default.\n * @param {boolean} [options.skip] - If true, the operator will\n *  be skipped: it will not be evaluated, but its dependents will be.\n * @param {boolean} [options.force] - If true, the operator will\n *   be re-evaluated even if its value has not changed.\n * @return {Dataflow}\n */\n\nfunction _default(source, target, update, params, options) {\n  var fn = source instanceof _Operator.default ? onOperator : onStream;\n  fn(this, source, target, update, params, options);\n  return this;\n}\n\nfunction onStream(df, stream, target, update, params, options) {\n  var opt = (0, _vegaUtil.extend)({}, options, SKIP),\n      func,\n      op;\n  if (!(0, _vegaUtil.isFunction)(target)) target = (0, _vegaUtil.constant)(target);\n\n  if (update === undefined) {\n    func = e => df.touch(target(e));\n  } else if ((0, _vegaUtil.isFunction)(update)) {\n    op = new _Operator.default(null, update, params, false);\n\n    func = e => {\n      op.evaluate(e);\n      const t = target(e),\n            v = op.value;\n      (0, _ChangeSet.isChangeSet)(v) ? df.pulse(t, v, options) : df.update(t, v, opt);\n    };\n  } else {\n    func = e => df.update(target(e), update, opt);\n  }\n\n  stream.apply(func);\n}\n\nfunction onOperator(df, source, target, update, params, options) {\n  if (update === undefined) {\n    source.targets().add(target);\n  } else {\n    const opt = options || {},\n          op = new _Operator.default(null, updater(target, update), params, false);\n    op.modified(opt.force);\n    op.rank = source.rank; // immediately follow source\n\n    source.targets().add(op); // add dependency\n\n    if (target) {\n      op.skip(true); // skip first invocation\n\n      op.value = target.value; // initialize value\n\n      op.targets().add(target); // chain dependencies\n\n      df.connect(target, [op]); // rerank as needed, #1672\n    }\n  }\n}\n\nfunction updater(target, update) {\n  update = (0, _vegaUtil.isFunction)(update) ? update : (0, _vegaUtil.constant)(update);\n  return target ? function (_, pulse) {\n    const value = update(_, pulse);\n\n    if (!target.skip()) {\n      target.skip(value !== this.value).value = value;\n    }\n\n    return value;\n  } : update;\n}\n},{\"../Operator\":\"Vr5X\",\"../ChangeSet\":\"m0dW\",\"vega-util\":\"d61Z\"}],\"pXq4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.rank = rank;\nexports.rerank = rerank;\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Assigns a rank to an operator. Ranks are assigned in increasing order\n * by incrementing an internal rank counter.\n * @param {Operator} op - The operator to assign a rank.\n */\nfunction rank(op) {\n  op.rank = ++this._rank;\n}\n/**\n * Re-ranks an operator and all downstream target dependencies. This\n * is necessary when upstream dependencies of higher rank are added to\n * a target operator.\n * @param {Operator} op - The operator to re-rank.\n */\n\n\nfunction rerank(op) {\n  var queue = [op],\n      cur,\n      list,\n      i;\n\n  while (queue.length) {\n    this.rank(cur = queue.pop());\n\n    if (list = cur._targets) {\n      for (i = list.length; --i >= 0;) {\n        queue.push(cur = list[i]);\n        if (cur === op) (0, _vegaUtil.error)('Cycle detected in dataflow graph.');\n      }\n    }\n  }\n}\n},{\"vega-util\":\"d61Z\"}],\"jy60\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Pulse;\nexports.StopPropagation = void 0;\n\nvar _Tuple = require(\"./Tuple\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Sentinel value indicating pulse propagation should stop.\n */\nvar StopPropagation = {}; // Pulse visit type flags\n\nexports.StopPropagation = StopPropagation;\nvar ADD = 1 << 0,\n    REM = 1 << 1,\n    MOD = 1 << 2,\n    ADD_REM = ADD | REM,\n    ADD_MOD = ADD | MOD,\n    ALL = ADD | REM | MOD,\n    REFLOW = 1 << 3,\n    SOURCE = 1 << 4,\n    NO_SOURCE = 1 << 5,\n    NO_FIELDS = 1 << 6;\n/**\n * A Pulse enables inter-operator communication during a run of the\n * dataflow graph. In addition to the current timestamp, a pulse may also\n * contain a change-set of added, removed or modified data tuples, as well as\n * a pointer to a full backing data source. Tuple change sets may not\n * be fully materialized; for example, to prevent needless array creation\n * a change set may include larger arrays and corresponding filter functions.\n * The pulse provides a {@link visit} method to enable proper and efficient\n * iteration over requested data tuples.\n *\n * In addition, each pulse can track modification flags for data tuple fields.\n * Responsible transform operators should call the {@link modifies} method to\n * indicate changes to data fields. The {@link modified} method enables\n * querying of this modification state.\n *\n * @constructor\n * @param {Dataflow} dataflow - The backing dataflow instance.\n * @param {number} stamp - The current propagation timestamp.\n * @param {string} [encode] - An optional encoding set name, which is then\n *   accessible as Pulse.encode. Operators can respond to (or ignore) this\n *   setting as appropriate. This parameter can be used in conjunction with\n *   the Encode transform in the vega-encode module.\n */\n\nfunction Pulse(dataflow, stamp, encode) {\n  this.dataflow = dataflow;\n  this.stamp = stamp == null ? -1 : stamp;\n  this.add = [];\n  this.rem = [];\n  this.mod = [];\n  this.fields = null;\n  this.encode = encode || null;\n}\n\nvar prototype = Pulse.prototype;\n/**\n * Sentinel value indicating pulse propagation should stop.\n */\n\nprototype.StopPropagation = StopPropagation;\n/**\n * Boolean flag indicating ADD (added) tuples.\n */\n\nprototype.ADD = ADD;\n/**\n * Boolean flag indicating REM (removed) tuples.\n */\n\nprototype.REM = REM;\n/**\n * Boolean flag indicating MOD (modified) tuples.\n */\n\nprototype.MOD = MOD;\n/**\n * Boolean flag indicating ADD (added) and REM (removed) tuples.\n */\n\nprototype.ADD_REM = ADD_REM;\n/**\n * Boolean flag indicating ADD (added) and MOD (modified) tuples.\n */\n\nprototype.ADD_MOD = ADD_MOD;\n/**\n * Boolean flag indicating ADD, REM and MOD tuples.\n */\n\nprototype.ALL = ALL;\n/**\n * Boolean flag indicating all tuples in a data source\n * except for the ADD, REM and MOD tuples.\n */\n\nprototype.REFLOW = REFLOW;\n/**\n * Boolean flag indicating a 'pass-through' to a\n * backing data source, ignoring ADD, REM and MOD tuples.\n */\n\nprototype.SOURCE = SOURCE;\n/**\n * Boolean flag indicating that source data should be\n * suppressed when creating a forked pulse.\n */\n\nprototype.NO_SOURCE = NO_SOURCE;\n/**\n * Boolean flag indicating that field modifications should be\n * suppressed when creating a forked pulse.\n */\n\nprototype.NO_FIELDS = NO_FIELDS;\n/**\n * Creates a new pulse based on the values of this pulse.\n * The dataflow, time stamp and field modification values are copied over.\n * By default, new empty ADD, REM and MOD arrays are created.\n * @param {number} flags - Integer of boolean flags indicating which (if any)\n *   tuple arrays should be copied to the new pulse. The supported flag values\n *   are ADD, REM and MOD. Array references are copied directly: new array\n *   instances are not created.\n * @return {Pulse} - The forked pulse instance.\n * @see init\n */\n\nprototype.fork = function (flags) {\n  return new Pulse(this.dataflow).init(this, flags);\n};\n/**\n * Creates a copy of this pulse with new materialized array\n * instances for the ADD, REM, MOD, and SOURCE arrays.\n * The dataflow, time stamp and field modification values are copied over.\n * @return {Pulse} - The cloned pulse instance.\n * @see init\n */\n\n\nprototype.clone = function () {\n  var p = this.fork(ALL);\n  p.add = p.add.slice();\n  p.rem = p.rem.slice();\n  p.mod = p.mod.slice();\n  if (p.source) p.source = p.source.slice();\n  return p.materialize(ALL | SOURCE);\n};\n/**\n * Returns a pulse that adds all tuples from a backing source. This is\n * useful for cases where operators are added to a dataflow after an\n * upstream data pipeline has already been processed, ensuring that\n * new operators can observe all tuples within a stream.\n * @return {Pulse} - A pulse instance with all source tuples included\n *   in the add array. If the current pulse already has all source\n *   tuples in its add array, it is returned directly. If the current\n *   pulse does not have a backing source, it is returned directly.\n */\n\n\nprototype.addAll = function () {\n  var p = this;\n\n  if (!this.source || this.source.length === this.add.length) {\n    return p;\n  } else {\n    p = new Pulse(this.dataflow).init(this);\n    p.add = p.source;\n    return p;\n  }\n};\n/**\n * Initialize this pulse based on the values of another pulse. This method\n * is used internally by {@link fork} to initialize a new forked tuple.\n * The dataflow, time stamp and field modification values are copied over.\n * By default, new empty ADD, REM and MOD arrays are created.\n * @param {Pulse} src - The source pulse to copy from.\n * @param {number} flags - Integer of boolean flags indicating which (if any)\n *   tuple arrays should be copied to the new pulse. The supported flag values\n *   are ADD, REM and MOD. Array references are copied directly: new array\n *   instances are not created. By default, source data arrays are copied\n *   to the new pulse. Use the NO_SOURCE flag to enforce a null source.\n * @return {Pulse} - Returns this Pulse instance.\n */\n\n\nprototype.init = function (src, flags) {\n  var p = this;\n  p.stamp = src.stamp;\n  p.encode = src.encode;\n\n  if (src.fields && !(flags & NO_FIELDS)) {\n    p.fields = src.fields;\n  }\n\n  if (flags & ADD) {\n    p.addF = src.addF;\n    p.add = src.add;\n  } else {\n    p.addF = null;\n    p.add = [];\n  }\n\n  if (flags & REM) {\n    p.remF = src.remF;\n    p.rem = src.rem;\n  } else {\n    p.remF = null;\n    p.rem = [];\n  }\n\n  if (flags & MOD) {\n    p.modF = src.modF;\n    p.mod = src.mod;\n  } else {\n    p.modF = null;\n    p.mod = [];\n  }\n\n  if (flags & NO_SOURCE) {\n    p.srcF = null;\n    p.source = null;\n  } else {\n    p.srcF = src.srcF;\n    p.source = src.source;\n  }\n\n  return p;\n};\n/**\n * Schedules a function to run after pulse propagation completes.\n * @param {function} func - The function to run.\n */\n\n\nprototype.runAfter = function (func) {\n  this.dataflow.runAfter(func);\n};\n/**\n * Indicates if tuples have been added, removed or modified.\n * @param {number} [flags] - The tuple types (ADD, REM or MOD) to query.\n *   Defaults to ALL, returning true if any tuple type has changed.\n * @return {boolean} - Returns true if one or more queried tuple types have\n *   changed, false otherwise.\n */\n\n\nprototype.changed = function (flags) {\n  var f = flags || ALL;\n  return f & ADD && this.add.length || f & REM && this.rem.length || f & MOD && this.mod.length;\n};\n/**\n * Forces a \"reflow\" of tuple values, such that all tuples in the backing\n * source are added to the MOD set, unless already present in the ADD set.\n * @param {boolean} [fork=false] - If true, returns a forked copy of this\n *   pulse, and invokes reflow on that derived pulse.\n * @return {Pulse} - The reflowed pulse instance.\n */\n\n\nprototype.reflow = function (fork) {\n  if (fork) return this.fork(ALL).reflow();\n  var len = this.add.length,\n      src = this.source && this.source.length;\n\n  if (src && src !== len) {\n    this.mod = this.source;\n    if (len) this.filter(MOD, filter(this, ADD));\n  }\n\n  return this;\n};\n/**\n * Marks one or more data field names as modified to assist dependency\n * tracking and incremental processing by transform operators.\n * @param {string|Array<string>} _ - The field(s) to mark as modified.\n * @return {Pulse} - This pulse instance.\n */\n\n\nprototype.modifies = function (_) {\n  var hash = this.fields || (this.fields = {});\n\n  if ((0, _vegaUtil.isArray)(_)) {\n    _.forEach(f => hash[f] = true);\n  } else {\n    hash[_] = true;\n  }\n\n  return this;\n};\n/**\n * Checks if one or more data fields have been modified during this pulse\n * propagation timestamp.\n * @param {string|Array<string>} _ - The field(s) to check for modified.\n * @param {boolean} nomod - If true, will check the modified flag even if\n *   no mod tuples exist. If false (default), mod tuples must be present.\n * @return {boolean} - Returns true if any of the provided fields has been\n *   marked as modified, false otherwise.\n */\n\n\nprototype.modified = function (_, nomod) {\n  var fields = this.fields;\n  return !((nomod || this.mod.length) && fields) ? false : !arguments.length ? !!fields : (0, _vegaUtil.isArray)(_) ? _.some(function (f) {\n    return fields[f];\n  }) : fields[_];\n};\n/**\n * Adds a filter function to one more tuple sets. Filters are applied to\n * backing tuple arrays, to determine the actual set of tuples considered\n * added, removed or modified. They can be used to delay materialization of\n * a tuple set in order to avoid expensive array copies. In addition, the\n * filter functions can serve as value transformers: unlike standard predicate\n * function (which return boolean values), Pulse filters should return the\n * actual tuple value to process. If a tuple set is already filtered, the\n * new filter function will be appended into a conjuntive ('and') query.\n * @param {number} flags - Flags indicating the tuple set(s) to filter.\n * @param {function(*):object} filter - Filter function that will be applied\n *   to the tuple set array, and should return a data tuple if the value\n *   should be included in the tuple set, and falsy (or null) otherwise.\n * @return {Pulse} - Returns this pulse instance.\n */\n\n\nprototype.filter = function (flags, filter) {\n  var p = this;\n  if (flags & ADD) p.addF = addFilter(p.addF, filter);\n  if (flags & REM) p.remF = addFilter(p.remF, filter);\n  if (flags & MOD) p.modF = addFilter(p.modF, filter);\n  if (flags & SOURCE) p.srcF = addFilter(p.srcF, filter);\n  return p;\n};\n\nfunction addFilter(a, b) {\n  return a ? function (t, i) {\n    return a(t, i) && b(t, i);\n  } : b;\n}\n/**\n * Materialize one or more tuple sets in this pulse. If the tuple set(s) have\n * a registered filter function, it will be applied and the tuple set(s) will\n * be replaced with materialized tuple arrays.\n * @param {number} flags - Flags indicating the tuple set(s) to materialize.\n * @return {Pulse} - Returns this pulse instance.\n */\n\n\nprototype.materialize = function (flags) {\n  flags = flags || ALL;\n  var p = this;\n\n  if (flags & ADD && p.addF) {\n    p.add = materialize(p.add, p.addF);\n    p.addF = null;\n  }\n\n  if (flags & REM && p.remF) {\n    p.rem = materialize(p.rem, p.remF);\n    p.remF = null;\n  }\n\n  if (flags & MOD && p.modF) {\n    p.mod = materialize(p.mod, p.modF);\n    p.modF = null;\n  }\n\n  if (flags & SOURCE && p.srcF) {\n    p.source = p.source.filter(p.srcF);\n    p.srcF = null;\n  }\n\n  return p;\n};\n\nfunction materialize(data, filter) {\n  var out = [];\n  (0, _vegaUtil.visitArray)(data, filter, function (_) {\n    out.push(_);\n  });\n  return out;\n}\n\nfunction filter(pulse, flags) {\n  var map = {};\n  pulse.visit(flags, function (t) {\n    map[(0, _Tuple.tupleid)(t)] = 1;\n  });\n  return function (t) {\n    return map[(0, _Tuple.tupleid)(t)] ? null : t;\n  };\n}\n/**\n * Visit one or more tuple sets in this pulse.\n * @param {number} flags - Flags indicating the tuple set(s) to visit.\n *   Legal values are ADD, REM, MOD and SOURCE (if a backing data source\n *   has been set).\n * @param {function(object):*} - Visitor function invoked per-tuple.\n * @return {Pulse} - Returns this pulse instance.\n */\n\n\nprototype.visit = function (flags, visitor) {\n  var p = this,\n      v = visitor,\n      src,\n      sum;\n\n  if (flags & SOURCE) {\n    (0, _vegaUtil.visitArray)(p.source, p.srcF, v);\n    return p;\n  }\n\n  if (flags & ADD) (0, _vegaUtil.visitArray)(p.add, p.addF, v);\n  if (flags & REM) (0, _vegaUtil.visitArray)(p.rem, p.remF, v);\n  if (flags & MOD) (0, _vegaUtil.visitArray)(p.mod, p.modF, v);\n\n  if (flags & REFLOW && (src = p.source)) {\n    sum = p.add.length + p.mod.length;\n\n    if (sum === src.length) {// do nothing\n    } else if (sum) {\n      (0, _vegaUtil.visitArray)(src, filter(p, ADD_MOD), v);\n    } else {\n      // if no add/rem/mod tuples, visit source\n      (0, _vegaUtil.visitArray)(src, p.srcF, v);\n    }\n  }\n\n  return p;\n};\n},{\"./Tuple\":\"KyIt\",\"vega-util\":\"d61Z\"}],\"SuEk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = MultiPulse;\n\nvar _Pulse = _interopRequireDefault(require(\"./Pulse\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Represents a set of multiple pulses. Used as input for operators\n * that accept multiple pulses at a time. Contained pulses are\n * accessible via the public \"pulses\" array property. This pulse doe\n * not carry added, removed or modified tuples directly. However,\n * the visit method can be used to traverse all such tuples contained\n * in sub-pulses with a timestamp matching this parent multi-pulse.\n * @constructor\n * @param {Dataflow} dataflow - The backing dataflow instance.\n * @param {number} stamp - The timestamp.\n * @param {Array<Pulse>} pulses - The sub-pulses for this multi-pulse.\n */\nfunction MultiPulse(dataflow, stamp, pulses, encode) {\n  var p = this,\n      c = 0,\n      pulse,\n      hash,\n      i,\n      n,\n      f;\n  this.dataflow = dataflow;\n  this.stamp = stamp;\n  this.fields = null;\n  this.encode = encode || null;\n  this.pulses = pulses;\n\n  for (i = 0, n = pulses.length; i < n; ++i) {\n    pulse = pulses[i];\n    if (pulse.stamp !== stamp) continue;\n\n    if (pulse.fields) {\n      hash = p.fields || (p.fields = {});\n\n      for (f in pulse.fields) {\n        hash[f] = 1;\n      }\n    }\n\n    if (pulse.changed(p.ADD)) c |= p.ADD;\n    if (pulse.changed(p.REM)) c |= p.REM;\n    if (pulse.changed(p.MOD)) c |= p.MOD;\n  }\n\n  this.changes = c;\n}\n\nvar prototype = (0, _vegaUtil.inherits)(MultiPulse, _Pulse.default);\n/**\n * Creates a new pulse based on the values of this pulse.\n * The dataflow, time stamp and field modification values are copied over.\n * @return {Pulse}\n */\n\nprototype.fork = function (flags) {\n  var p = new _Pulse.default(this.dataflow).init(this, flags & this.NO_FIELDS);\n\n  if (flags !== undefined) {\n    if (flags & p.ADD) {\n      this.visit(p.ADD, function (t) {\n        return p.add.push(t);\n      });\n    }\n\n    if (flags & p.REM) {\n      this.visit(p.REM, function (t) {\n        return p.rem.push(t);\n      });\n    }\n\n    if (flags & p.MOD) {\n      this.visit(p.MOD, function (t) {\n        return p.mod.push(t);\n      });\n    }\n  }\n\n  return p;\n};\n\nprototype.changed = function (flags) {\n  return this.changes & flags;\n};\n\nprototype.modified = function (_) {\n  var p = this,\n      fields = p.fields;\n  return !(fields && p.changes & p.MOD) ? 0 : (0, _vegaUtil.isArray)(_) ? _.some(function (f) {\n    return fields[f];\n  }) : fields[_];\n};\n\nprototype.filter = function () {\n  (0, _vegaUtil.error)('MultiPulse does not support filtering.');\n};\n\nprototype.materialize = function () {\n  (0, _vegaUtil.error)('MultiPulse does not support materialization.');\n};\n\nprototype.visit = function (flags, visitor) {\n  var p = this,\n      pulses = p.pulses,\n      n = pulses.length,\n      i = 0;\n\n  if (flags & p.SOURCE) {\n    for (; i < n; ++i) {\n      pulses[i].visit(flags, visitor);\n    }\n  } else {\n    for (; i < n; ++i) {\n      if (pulses[i].stamp === p.stamp) {\n        pulses[i].visit(flags, visitor);\n      }\n    }\n  }\n\n  return p;\n};\n},{\"./Pulse\":\"jy60\",\"vega-util\":\"d61Z\"}],\"qpUi\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.evaluate = evaluate;\nexports.runAsync = runAsync;\nexports.run = run;\nexports.runAfter = runAfter;\nexports.enqueue = enqueue;\nexports.getPulse = getPulse;\n\nvar _Pulse = _interopRequireWildcard(require(\"../Pulse\"));\n\nvar _MultiPulse = _interopRequireDefault(require(\"../MultiPulse\"));\n\nvar _asyncCallback = _interopRequireDefault(require(\"../util/asyncCallback\"));\n\nvar _UniqueList = _interopRequireDefault(require(\"../util/UniqueList\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/* eslint-disable require-atomic-updates */\n\n/**\n * Evaluates the dataflow and returns a Promise that resolves when pulse\n * propagation completes. This method will increment the current timestamp\n * and process all updated, pulsed and touched operators. When invoked for\n * the first time, all registered operators will be processed. This method\n * should not be invoked by third-party clients, use {@link runAsync} or\n * {@link run} instead.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode package.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Promise} - A promise that resolves to this dataflow after\n *   evaluation completes.\n */\nasync function evaluate(encode, prerun, postrun) {\n  const df = this,\n        level = df.logLevel(); // if the pulse value is set, this is a re-entrant call\n\n  if (df._pulse) return reentrant(df); // wait for pending datasets to load\n\n  if (df._pending) {\n    await df._pending;\n  } // invoke prerun function, if provided\n\n\n  if (prerun) await (0, _asyncCallback.default)(df, prerun); // exit early if there are no updates\n\n  if (!df._touched.length) {\n    df.info('Dataflow invoked, but nothing to do.');\n    return df;\n  } // increment timestamp clock\n\n\n  let stamp = ++df._clock,\n      count = 0,\n      op,\n      next,\n      dt,\n      error; // set the current pulse\n\n  df._pulse = new _Pulse.default(df, stamp, encode);\n\n  if (level >= _vegaUtil.Info) {\n    dt = Date.now();\n    df.debug('-- START PROPAGATION (' + stamp + ') -----');\n  } // initialize priority queue, reset touched operators\n\n\n  df._touched.forEach(op => df._enqueue(op, true));\n\n  df._touched = (0, _UniqueList.default)(_vegaUtil.id);\n\n  try {\n    while (df._heap.size() > 0) {\n      // dequeue operator with highest priority\n      op = df._heap.pop(); // re-queue if rank changed\n\n      if (op.rank !== op.qrank) {\n        df._enqueue(op, true);\n\n        continue;\n      } // otherwise, evaluate the operator\n\n\n      next = op.run(df._getPulse(op, encode)); // await if operator returned a promise\n\n      if (next.then) {\n        next = await next;\n      }\n\n      if (level >= _vegaUtil.Debug) {\n        df.debug(op.id, next === _Pulse.StopPropagation ? 'STOP' : next, op);\n      } // propagate evaluation, enqueue dependent operators\n\n\n      if (next !== _Pulse.StopPropagation) {\n        if (op._targets) op._targets.forEach(op => df._enqueue(op));\n      } // increment visit counter\n\n\n      ++count;\n    }\n  } catch (err) {\n    df._heap.clear();\n\n    error = err;\n  } // reset pulse map\n\n\n  df._input = {};\n  df._pulse = null;\n\n  if (level >= _vegaUtil.Info) {\n    dt = Date.now() - dt;\n    df.info('> Pulse ' + stamp + ': ' + count + ' operators; ' + dt + 'ms');\n  }\n\n  if (error) {\n    df._postrun = [];\n    df.error(error);\n  } // invoke callbacks queued via runAfter\n\n\n  if (df._postrun.length) {\n    const pr = df._postrun.sort((a, b) => b.priority - a.priority);\n\n    df._postrun = [];\n\n    for (let i = 0; i < pr.length; ++i) {\n      await (0, _asyncCallback.default)(df, pr[i].callback);\n    }\n  } // invoke postrun function, if provided\n\n\n  if (postrun) await (0, _asyncCallback.default)(df, postrun);\n  return df;\n}\n/**\n * Queues dataflow evaluation to run once any other queued evaluations have\n * completed and returns a Promise that resolves when the queued pulse\n * propagation completes. If provided, a callback function will be invoked\n * immediately before evaluation commences. This method will ensure a\n * separate evaluation is invoked for each time it is called.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode package.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Promise} - A promise that resolves to this dataflow after\n *   evaluation completes.\n */\n\n\nasync function runAsync(encode, prerun, postrun) {\n  // await previously queued functions\n  while (this._running) await this._running; // run dataflow, manage running promise\n\n\n  const clear = () => this._running = null;\n\n  (this._running = this.evaluate(encode, prerun, postrun)).then(clear, clear);\n  return this._running;\n}\n/**\n * Requests dataflow evaluation and the immediately returns this dataflow\n * instance. If there are pending data loading or other asynchronous\n * operations, the dataflow will evaluate asynchronously after this method\n * has been invoked. To track when dataflow evaluation completes, use the\n * {@link runAsync} method instead. This method will raise an error if\n * invoked while the dataflow is already in the midst of evaluation.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode module.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Dataflow} - This dataflow instance.\n */\n\n\nfunction run(encode, prerun, postrun) {\n  return this._pulse ? reentrant(this) : (this.evaluate(encode, prerun, postrun), this);\n}\n/**\n * Schedules a callback function to be invoked after the current pulse\n * propagation completes. If no propagation is currently occurring,\n * the function is invoked immediately. Callbacks scheduled via runAfter\n * are invoked immediately upon completion of the current cycle, before\n * any request queued via runAsync. This method is primarily intended for\n * internal use. Third-party callers using runAfter to schedule a callback\n * that invokes {@link run} or {@link runAsync} should not use this method,\n * but instead use {@link runAsync} with prerun or postrun arguments.\n * @param {function(Dataflow)} callback - The callback function to run.\n *   The callback will be invoked with this Dataflow instance as its\n *   sole argument.\n * @param {boolean} enqueue - A boolean flag indicating that the\n *   callback should be queued up to run after the next propagation\n *   cycle, suppressing immediate invocation when propagation is not\n *   currently occurring.\n * @param {number} [priority] - A priority value used to sort registered\n *   callbacks to determine execution order. This argument is intended\n *   for internal Vega use only.\n */\n\n\nfunction runAfter(callback, enqueue, priority) {\n  if (this._pulse || enqueue) {\n    // pulse propagation is currently running, queue to run after\n    this._postrun.push({\n      priority: priority || 0,\n      callback: callback\n    });\n  } else {\n    // pulse propagation already complete, invoke immediately\n    try {\n      callback(this);\n    } catch (err) {\n      this.error(err);\n    }\n  }\n}\n/**\n * Raise an error for re-entrant dataflow evaluation.\n */\n\n\nfunction reentrant(df) {\n  df.error('Dataflow already running. Use runAsync() to chain invocations.');\n  return df;\n}\n/**\n * Enqueue an operator into the priority queue for evaluation. The operator\n * will be enqueued if it has no registered pulse for the current cycle, or if\n * the force argument is true. Upon enqueue, this method also sets the\n * operator's qrank to the current rank value.\n * @param {Operator} op - The operator to enqueue.\n * @param {boolean} [force] - A flag indicating if the operator should be\n *   forceably added to the queue, even if it has already been previously\n *   enqueued during the current pulse propagation. This is useful when the\n *   dataflow graph is dynamically modified and the operator rank changes.\n */\n\n\nfunction enqueue(op, force) {\n  var q = op.stamp < this._clock;\n  if (q) op.stamp = this._clock;\n\n  if (q || force) {\n    op.qrank = op.rank;\n\n    this._heap.push(op);\n  }\n}\n/**\n * Provide a correct pulse for evaluating an operator. If the operator has an\n * explicit source operator, we will try to pull the pulse(s) from it.\n * If there is an array of source operators, we build a multi-pulse.\n * Otherwise, we return a current pulse with correct source data.\n * If the pulse is the pulse map has an explicit target set, we use that.\n * Else if the pulse on the upstream source operator is current, we use that.\n * Else we use the pulse from the pulse map, but copy the source tuple array.\n * @param {Operator} op - The operator for which to get an input pulse.\n * @param {string} [encode] - An (optional) encoding set name with which to\n *   annotate the returned pulse. See {@link run} for more information.\n */\n\n\nfunction getPulse(op, encode) {\n  var s = op.source,\n      stamp = this._clock;\n  return s && (0, _vegaUtil.isArray)(s) ? new _MultiPulse.default(this, stamp, s.map(_ => _.pulse), encode) : this._input[op.id] || singlePulse(this._pulse, s && s.pulse);\n}\n\nfunction singlePulse(p, s) {\n  if (s && s.stamp === p.stamp) {\n    return s;\n  }\n\n  p = p.fork();\n\n  if (s && s !== _Pulse.StopPropagation) {\n    p.source = s.source;\n  }\n\n  return p;\n}\n},{\"../Pulse\":\"jy60\",\"../MultiPulse\":\"SuEk\",\"../util/asyncCallback\":\"rHZf\",\"../util/UniqueList\":\"O7PN\",\"vega-util\":\"d61Z\"}],\"NK06\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.touch = touch;\nexports.update = update;\nexports.pulse = pulse;\n\nvar _Pulse = _interopRequireDefault(require(\"../Pulse\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar NO_OPT = {\n  skip: false,\n  force: false\n};\n/**\n * Touches an operator, scheduling it to be evaluated. If invoked outside of\n * a pulse propagation, the operator will be evaluated the next time this\n * dataflow is run. If invoked in the midst of pulse propagation, the operator\n * will be queued for evaluation if and only if the operator has not yet been\n * evaluated on the current propagation timestamp.\n * @param {Operator} op - The operator to touch.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */\n\nfunction touch(op, options) {\n  var opt = options || NO_OPT;\n\n  if (this._pulse) {\n    // if in midst of propagation, add to priority queue\n    this._enqueue(op);\n  } else {\n    // otherwise, queue for next propagation\n    this._touched.add(op);\n  }\n\n  if (opt.skip) op.skip(true);\n  return this;\n}\n/**\n * Updates the value of the given operator.\n * @param {Operator} op - The operator to update.\n * @param {*} value - The value to set.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.force] - If true, the operator will\n *   be re-evaluated even if its value has not changed.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */\n\n\nfunction update(op, value, options) {\n  var opt = options || NO_OPT;\n\n  if (op.set(value) || opt.force) {\n    this.touch(op, opt);\n  }\n\n  return this;\n}\n/**\n * Pulses an operator with a changeset of tuples. If invoked outside of\n * a pulse propagation, the pulse will be applied the next time this\n * dataflow is run. If invoked in the midst of pulse propagation, the pulse\n * will be added to the set of active pulses and will be applied if and\n * only if the target operator has not yet been evaluated on the current\n * propagation timestamp.\n * @param {Operator} op - The operator to pulse.\n * @param {ChangeSet} value - The tuple changeset to apply.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */\n\n\nfunction pulse(op, changeset, options) {\n  this.touch(op, options || NO_OPT);\n  var p = new _Pulse.default(this, this._clock + (this._pulse ? 0 : 1)),\n      t = op.pulse && op.pulse.source || [];\n  p.target = op;\n  this._input[op.id] = changeset.pulse(p, t);\n  return this;\n}\n},{\"../Pulse\":\"jy60\"}],\"NeHF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Heap;\n\nfunction Heap(cmp) {\n  var nodes = [];\n  return {\n    clear: () => nodes = [],\n    size: () => nodes.length,\n    peek: () => nodes[0],\n    push: x => {\n      nodes.push(x);\n      return siftdown(nodes, 0, nodes.length - 1, cmp);\n    },\n    pop: () => {\n      var last = nodes.pop(),\n          item;\n\n      if (nodes.length) {\n        item = nodes[0];\n        nodes[0] = last;\n        siftup(nodes, 0, cmp);\n      } else {\n        item = last;\n      }\n\n      return item;\n    }\n  };\n}\n\nfunction siftdown(array, start, idx, cmp) {\n  var item, parent, pidx;\n  item = array[idx];\n\n  while (idx > start) {\n    pidx = idx - 1 >> 1;\n    parent = array[pidx];\n\n    if (cmp(item, parent) < 0) {\n      array[idx] = parent;\n      idx = pidx;\n      continue;\n    }\n\n    break;\n  }\n\n  return array[idx] = item;\n}\n\nfunction siftup(array, idx, cmp) {\n  var start = idx,\n      end = array.length,\n      item = array[idx],\n      cidx = (idx << 1) + 1,\n      ridx;\n\n  while (cidx < end) {\n    ridx = cidx + 1;\n\n    if (ridx < end && cmp(array[cidx], array[ridx]) >= 0) {\n      cidx = ridx;\n    }\n\n    array[idx] = array[cidx];\n    idx = cidx;\n    cidx = (idx << 1) + 1;\n  }\n\n  array[idx] = item;\n  return siftdown(array, start, idx, cmp);\n}\n},{}],\"GPmm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Dataflow;\n\nvar _add = _interopRequireDefault(require(\"./add\"));\n\nvar _connect = _interopRequireDefault(require(\"./connect\"));\n\nvar _events = _interopRequireDefault(require(\"./events\"));\n\nvar _load = require(\"./load\");\n\nvar _on = _interopRequireDefault(require(\"./on\"));\n\nvar _rank = require(\"./rank\");\n\nvar _run = require(\"./run\");\n\nvar _update = require(\"./update\");\n\nvar _ChangeSet = _interopRequireDefault(require(\"../ChangeSet\"));\n\nvar _Heap = _interopRequireDefault(require(\"../util/Heap\"));\n\nvar _UniqueList = _interopRequireDefault(require(\"../util/UniqueList\"));\n\nvar _vegaLoader = require(\"vega-loader\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * A dataflow graph for reactive processing of data streams.\n * @constructor\n */\nfunction Dataflow() {\n  this.logger((0, _vegaUtil.logger)());\n  this.logLevel(_vegaUtil.Error);\n  this._clock = 0;\n  this._rank = 0;\n\n  try {\n    this._loader = (0, _vegaLoader.loader)();\n  } catch (e) {// do nothing if loader module is unavailable\n  }\n\n  this._touched = (0, _UniqueList.default)(_vegaUtil.id);\n  this._input = {};\n  this._pulse = null;\n  this._heap = (0, _Heap.default)((a, b) => a.qrank - b.qrank);\n  this._postrun = [];\n}\n\nvar prototype = Dataflow.prototype;\n/**\n * The current timestamp of this dataflow. This value reflects the\n * timestamp of the previous dataflow run. The dataflow is initialized\n * with a stamp value of 0. The initial run of the dataflow will have\n * a timestap of 1, and so on. This value will match the\n * {@link Pulse.stamp} property.\n * @return {number} - The current timestamp value.\n */\n\nprototype.stamp = function () {\n  return this._clock;\n};\n/**\n * Gets or sets the loader instance to use for data file loading. A\n * loader object must provide a \"load\" method for loading files and a\n * \"sanitize\" method for checking URL/filename validity. Both methods\n * should accept a URI and options hash as arguments, and return a Promise\n * that resolves to the loaded file contents (load) or a hash containing\n * sanitized URI data with the sanitized url assigned to the \"href\" property\n * (sanitize).\n * @param {object} _ - The loader instance to use.\n * @return {object|Dataflow} - If no arguments are provided, returns\n *   the current loader instance. Otherwise returns this Dataflow instance.\n */\n\n\nprototype.loader = function (_) {\n  if (arguments.length) {\n    this._loader = _;\n    return this;\n  } else {\n    return this._loader;\n  }\n};\n/**\n * Empty entry threshold for garbage cleaning. Map data structures will\n * perform cleaning once the number of empty entries exceeds this value.\n */\n\n\nprototype.cleanThreshold = 1e4; // OPERATOR REGISTRATION\n\nprototype.add = _add.default;\nprototype.connect = _connect.default;\nprototype.rank = _rank.rank;\nprototype.rerank = _rank.rerank; // OPERATOR UPDATES\n\nprototype.pulse = _update.pulse;\nprototype.touch = _update.touch;\nprototype.update = _update.update;\nprototype.changeset = _ChangeSet.default; // DATA LOADING\n\nprototype.ingest = _load.ingest;\nprototype.parse = _load.parse;\nprototype.preload = _load.preload;\nprototype.request = _load.request; // EVENT HANDLING\n\nprototype.events = _events.default;\nprototype.on = _on.default; // PULSE PROPAGATION\n\nprototype.evaluate = _run.evaluate;\nprototype.run = _run.run;\nprototype.runAsync = _run.runAsync;\nprototype.runAfter = _run.runAfter;\nprototype._enqueue = _run.enqueue;\nprototype._getPulse = _run.getPulse; // LOGGING AND ERROR HANDLING\n\nfunction logMethod(method) {\n  return function () {\n    return this._log[method].apply(this, arguments);\n  };\n}\n/**\n * Get or set the logger instance used to log messages. If no arguments are\n * provided, returns the current logger instance. Otherwise, sets the logger\n * and return this Dataflow instance. Provided loggers must support the full\n * API of logger objects generated by the vega-util logger method. Note that\n * by default the log level of the new logger will be used; use the logLevel\n * method to adjust the log level as needed.\n */\n\n\nprototype.logger = function (logger) {\n  if (arguments.length) {\n    this._log = logger;\n    return this;\n  } else {\n    return this._log;\n  }\n};\n/**\n * Logs an error message. By default, logged messages are written to console\n * output. The message will only be logged if the current log level is high\n * enough to permit error messages.\n */\n\n\nprototype.error = logMethod('error');\n/**\n * Logs a warning message. By default, logged messages are written to console\n * output. The message will only be logged if the current log level is high\n * enough to permit warning messages.\n */\n\nprototype.warn = logMethod('warn');\n/**\n * Logs a information message. By default, logged messages are written to\n * console output. The message will only be logged if the current log level is\n * high enough to permit information messages.\n */\n\nprototype.info = logMethod('info');\n/**\n * Logs a debug message. By default, logged messages are written to console\n * output. The message will only be logged if the current log level is high\n * enough to permit debug messages.\n */\n\nprototype.debug = logMethod('debug');\n/**\n * Get or set the current log level. If an argument is provided, it\n * will be used as the new log level.\n * @param {number} [level] - Should be one of None, Warn, Info\n * @return {number} - The current log level.\n */\n\nprototype.logLevel = logMethod('level');\n},{\"./add\":\"FcJj\",\"./connect\":\"paSg\",\"./events\":\"XD2N\",\"./load\":\"YYff\",\"./on\":\"LImI\",\"./rank\":\"pXq4\",\"./run\":\"qpUi\",\"./update\":\"NK06\",\"../ChangeSet\":\"m0dW\",\"../util/Heap\":\"NeHF\",\"../util/UniqueList\":\"O7PN\",\"vega-loader\":\"ELDD\",\"vega-util\":\"d61Z\"}],\"Ptab\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Transform;\n\nvar _Operator = _interopRequireDefault(require(\"./Operator\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Abstract class for operators that process data tuples.\n * Subclasses must provide a {@link transform} method for operator processing.\n * @constructor\n * @param {*} [init] - The initial value for this operator.\n * @param {object} [params] - The parameters for this operator.\n * @param {Operator} [source] - The operator from which to receive pulses.\n */\nfunction Transform(init, params) {\n  _Operator.default.call(this, init, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Transform, _Operator.default);\n/**\n * Overrides {@link Operator.evaluate} for transform operators.\n * Internally, this method calls {@link evaluate} to perform processing.\n * If {@link evaluate} returns a falsy value, the input pulse is returned.\n * This method should NOT be overridden, instead overrride {@link evaluate}.\n * @param {Pulse} pulse - the current dataflow pulse.\n * @return the output pulse for this operator (or StopPropagation)\n */\n\nprototype.run = function (pulse) {\n  if (pulse.stamp < this.stamp) return pulse.StopPropagation;\n  var rv;\n\n  if (this.skip()) {\n    this.skip(false);\n  } else {\n    rv = this.evaluate(pulse);\n  }\n\n  rv = rv || pulse;\n\n  if (rv.then) {\n    rv = rv.then(_ => this.pulse = _);\n  } else if (rv !== pulse.StopPropagation) {\n    this.pulse = rv;\n  }\n\n  return rv;\n};\n/**\n * Overrides {@link Operator.evaluate} for transform operators.\n * Marshalls parameter values and then invokes {@link transform}.\n * @param {Pulse} pulse - the current dataflow pulse.\n * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n     value (including undefined) will let the input pulse pass through.\n */\n\n\nprototype.evaluate = function (pulse) {\n  var params = this.marshall(pulse.stamp),\n      out = this.transform(params, pulse);\n  params.clear();\n  return out;\n};\n/**\n * Process incoming pulses.\n * Subclasses should override this method to implement transforms.\n * @param {Parameters} _ - The operator parameter values.\n * @param {Pulse} pulse - The current dataflow pulse.\n * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n *   value (including undefined) will let the input pulse pass through.\n */\n\n\nprototype.transform = function () {};\n},{\"./Operator\":\"Vr5X\",\"vega-util\":\"d61Z\"}],\"yXd4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.definition = definition;\nexports.transform = transform;\nexports.transforms = void 0;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar transforms = {};\nexports.transforms = transforms;\n\nfunction definition(type) {\n  var t = transform(type);\n  return t && t.Definition || null;\n}\n\nfunction transform(type) {\n  type = type && type.toLowerCase();\n  return (0, _vegaUtil.hasOwnProperty)(transforms, type) ? transforms[type] : null;\n}\n},{\"vega-util\":\"d61Z\"}],\"luN0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"UniqueList\", {\n  enumerable: true,\n  get: function () {\n    return _UniqueList.default;\n  }\n});\nObject.defineProperty(exports, \"asyncCallback\", {\n  enumerable: true,\n  get: function () {\n    return _asyncCallback.default;\n  }\n});\nObject.defineProperty(exports, \"changeset\", {\n  enumerable: true,\n  get: function () {\n    return _ChangeSet.default;\n  }\n});\nObject.defineProperty(exports, \"isChangeSet\", {\n  enumerable: true,\n  get: function () {\n    return _ChangeSet.isChangeSet;\n  }\n});\nObject.defineProperty(exports, \"Dataflow\", {\n  enumerable: true,\n  get: function () {\n    return _Dataflow.default;\n  }\n});\nObject.defineProperty(exports, \"EventStream\", {\n  enumerable: true,\n  get: function () {\n    return _EventStream.default;\n  }\n});\nObject.defineProperty(exports, \"Parameters\", {\n  enumerable: true,\n  get: function () {\n    return _Parameters.default;\n  }\n});\nObject.defineProperty(exports, \"Pulse\", {\n  enumerable: true,\n  get: function () {\n    return _Pulse.default;\n  }\n});\nObject.defineProperty(exports, \"MultiPulse\", {\n  enumerable: true,\n  get: function () {\n    return _MultiPulse.default;\n  }\n});\nObject.defineProperty(exports, \"Operator\", {\n  enumerable: true,\n  get: function () {\n    return _Operator.default;\n  }\n});\nObject.defineProperty(exports, \"Transform\", {\n  enumerable: true,\n  get: function () {\n    return _Transform.default;\n  }\n});\nObject.defineProperty(exports, \"derive\", {\n  enumerable: true,\n  get: function () {\n    return _Tuple.derive;\n  }\n});\nObject.defineProperty(exports, \"ingest\", {\n  enumerable: true,\n  get: function () {\n    return _Tuple.ingest;\n  }\n});\nObject.defineProperty(exports, \"isTuple\", {\n  enumerable: true,\n  get: function () {\n    return _Tuple.isTuple;\n  }\n});\nObject.defineProperty(exports, \"rederive\", {\n  enumerable: true,\n  get: function () {\n    return _Tuple.rederive;\n  }\n});\nObject.defineProperty(exports, \"replace\", {\n  enumerable: true,\n  get: function () {\n    return _Tuple.replace;\n  }\n});\nObject.defineProperty(exports, \"stableCompare\", {\n  enumerable: true,\n  get: function () {\n    return _Tuple.stableCompare;\n  }\n});\nObject.defineProperty(exports, \"tupleid\", {\n  enumerable: true,\n  get: function () {\n    return _Tuple.tupleid;\n  }\n});\nObject.defineProperty(exports, \"definition\", {\n  enumerable: true,\n  get: function () {\n    return _register.definition;\n  }\n});\nObject.defineProperty(exports, \"transform\", {\n  enumerable: true,\n  get: function () {\n    return _register.transform;\n  }\n});\nObject.defineProperty(exports, \"transforms\", {\n  enumerable: true,\n  get: function () {\n    return _register.transforms;\n  }\n});\n\nvar _UniqueList = _interopRequireDefault(require(\"./src/util/UniqueList\"));\n\nvar _asyncCallback = _interopRequireDefault(require(\"./src/util/asyncCallback\"));\n\nvar _ChangeSet = _interopRequireWildcard(require(\"./src/ChangeSet\"));\n\nvar _Dataflow = _interopRequireDefault(require(\"./src/dataflow/Dataflow\"));\n\nvar _EventStream = _interopRequireDefault(require(\"./src/EventStream\"));\n\nvar _Parameters = _interopRequireDefault(require(\"./src/Parameters\"));\n\nvar _Pulse = _interopRequireDefault(require(\"./src/Pulse\"));\n\nvar _MultiPulse = _interopRequireDefault(require(\"./src/MultiPulse\"));\n\nvar _Operator = _interopRequireDefault(require(\"./src/Operator\"));\n\nvar _Transform = _interopRequireDefault(require(\"./src/Transform\"));\n\nvar _Tuple = require(\"./src/Tuple\");\n\nvar _register = require(\"./src/register\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/util/UniqueList\":\"O7PN\",\"./src/util/asyncCallback\":\"rHZf\",\"./src/ChangeSet\":\"m0dW\",\"./src/dataflow/Dataflow\":\"GPmm\",\"./src/EventStream\":\"QOmR\",\"./src/Parameters\":\"DM4c\",\"./src/Pulse\":\"jy60\",\"./src/MultiPulse\":\"SuEk\",\"./src/Operator\":\"Vr5X\",\"./src/Transform\":\"Ptab\",\"./src/Tuple\":\"KyIt\",\"./src/register\":\"yXd4\"}],\"bY4j\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.multikey = multikey;\nexports.groupkey = groupkey;\n\nfunction multikey(f) {\n  return function (x) {\n    var n = f.length,\n        i = 1,\n        k = String(f[0](x));\n\n    for (; i < n; ++i) {\n      k += '|' + f[i](x);\n    }\n\n    return k;\n  };\n}\n\nfunction groupkey(fields) {\n  return !fields || !fields.length ? function () {\n    return '';\n  } : fields.length === 1 ? fields[0] : multikey(fields);\n}\n},{}],\"Fivq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.measureName = measureName;\nexports.createMeasure = createMeasure;\nexports.compileMeasures = compileMeasures;\nexports.ValidAggregateOps = exports.AggregateOps = void 0;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction measureName(op, field, as) {\n  return as || op + (!field ? '' : '_' + field);\n}\n\nvar AggregateOps = {\n  'values': measure({\n    name: 'values',\n    init: 'cell.store = true;',\n    set: 'cell.data.values()',\n    idx: -1\n  }),\n  'count': measure({\n    name: 'count',\n    set: 'cell.num'\n  }),\n  '__count__': measure({\n    name: 'count',\n    set: 'this.missing + this.valid'\n  }),\n  'missing': measure({\n    name: 'missing',\n    set: 'this.missing'\n  }),\n  'valid': measure({\n    name: 'valid',\n    set: 'this.valid'\n  }),\n  'sum': measure({\n    name: 'sum',\n    init: 'this.sum = 0;',\n    add: 'this.sum += +v;',\n    rem: 'this.sum -= v;',\n    set: 'this.sum'\n  }),\n  'mean': measure({\n    name: 'mean',\n    init: 'this.mean = 0;',\n    add: 'var d = v - this.mean; this.mean += d / this.valid;',\n    rem: 'var d = v - this.mean; this.mean -= this.valid ? d / this.valid : this.mean;',\n    set: 'this.valid ? this.mean : undefined'\n  }),\n  'average': measure({\n    name: 'average',\n    set: 'this.valid ? this.mean : undefined',\n    req: ['mean'],\n    idx: 1\n  }),\n  'variance': measure({\n    name: 'variance',\n    init: 'this.dev = 0;',\n    add: 'this.dev += d * (v - this.mean);',\n    rem: 'this.dev -= d * (v - this.mean);',\n    set: 'this.valid > 1 ? this.dev / (this.valid-1) : undefined',\n    req: ['mean'],\n    idx: 1\n  }),\n  'variancep': measure({\n    name: 'variancep',\n    set: 'this.valid > 1 ? this.dev / this.valid : undefined',\n    req: ['variance'],\n    idx: 2\n  }),\n  'stdev': measure({\n    name: 'stdev',\n    set: 'this.valid > 1 ? Math.sqrt(this.dev / (this.valid-1)) : undefined',\n    req: ['variance'],\n    idx: 2\n  }),\n  'stdevp': measure({\n    name: 'stdevp',\n    set: 'this.valid > 1 ? Math.sqrt(this.dev / this.valid) : undefined',\n    req: ['variance'],\n    idx: 2\n  }),\n  'stderr': measure({\n    name: 'stderr',\n    set: 'this.valid > 1 ? Math.sqrt(this.dev / (this.valid * (this.valid-1))) : undefined',\n    req: ['variance'],\n    idx: 2\n  }),\n  'distinct': measure({\n    name: 'distinct',\n    set: 'cell.data.distinct(this.get)',\n    req: ['values'],\n    idx: 3\n  }),\n  'ci0': measure({\n    name: 'ci0',\n    set: 'cell.data.ci0(this.get)',\n    req: ['values'],\n    idx: 3\n  }),\n  'ci1': measure({\n    name: 'ci1',\n    set: 'cell.data.ci1(this.get)',\n    req: ['values'],\n    idx: 3\n  }),\n  'median': measure({\n    name: 'median',\n    set: 'cell.data.q2(this.get)',\n    req: ['values'],\n    idx: 3\n  }),\n  'q1': measure({\n    name: 'q1',\n    set: 'cell.data.q1(this.get)',\n    req: ['values'],\n    idx: 3\n  }),\n  'q3': measure({\n    name: 'q3',\n    set: 'cell.data.q3(this.get)',\n    req: ['values'],\n    idx: 3\n  }),\n  'argmin': measure({\n    name: 'argmin',\n    init: 'this.argmin = undefined;',\n    add: 'if (v < this.min) this.argmin = t;',\n    rem: 'if (v <= this.min) this.argmin = undefined;',\n    set: 'this.argmin || cell.data.argmin(this.get)',\n    req: ['min'],\n    str: ['values'],\n    idx: 3\n  }),\n  'argmax': measure({\n    name: 'argmax',\n    init: 'this.argmax = undefined;',\n    add: 'if (v > this.max) this.argmax = t;',\n    rem: 'if (v >= this.max) this.argmax = undefined;',\n    set: 'this.argmax || cell.data.argmax(this.get)',\n    req: ['max'],\n    str: ['values'],\n    idx: 3\n  }),\n  'min': measure({\n    name: 'min',\n    init: 'this.min = undefined;',\n    add: 'if (v < this.min || this.min === undefined) this.min = v;',\n    rem: 'if (v <= this.min) this.min = NaN;',\n    set: 'this.min = (Number.isNaN(this.min) ? cell.data.min(this.get) : this.min)',\n    str: ['values'],\n    idx: 4\n  }),\n  'max': measure({\n    name: 'max',\n    init: 'this.max = undefined;',\n    add: 'if (v > this.max || this.max === undefined) this.max = v;',\n    rem: 'if (v >= this.max) this.max = NaN;',\n    set: 'this.max = (Number.isNaN(this.max) ? cell.data.max(this.get) : this.max)',\n    str: ['values'],\n    idx: 4\n  })\n};\nexports.AggregateOps = AggregateOps;\nvar ValidAggregateOps = Object.keys(AggregateOps);\nexports.ValidAggregateOps = ValidAggregateOps;\n\nfunction createMeasure(op, name) {\n  return AggregateOps[op](name);\n}\n\nfunction measure(base) {\n  return function (out) {\n    var m = (0, _vegaUtil.extend)({\n      init: '',\n      add: '',\n      rem: '',\n      idx: 0\n    }, base);\n    m.out = out || base.name;\n    return m;\n  };\n}\n\nfunction compareIndex(a, b) {\n  return a.idx - b.idx;\n}\n\nfunction resolve(agg, stream) {\n  function collect(m, a) {\n    function helper(r) {\n      if (!m[r]) collect(m, m[r] = AggregateOps[r]());\n    }\n\n    if (a.req) a.req.forEach(helper);\n    if (stream && a.str) a.str.forEach(helper);\n    return m;\n  }\n\n  var map = agg.reduce(collect, agg.reduce(function (m, a) {\n    m[a.name] = a;\n    return m;\n  }, {}));\n  var values = [],\n      key;\n\n  for (key in map) values.push(map[key]);\n\n  return values.sort(compareIndex);\n}\n\nfunction compileMeasures(agg, field) {\n  var get = field || _vegaUtil.identity,\n      all = resolve(agg, true),\n      // assume streaming removes may occur\n  init = 'var cell = this.cell; this.valid = 0; this.missing = 0;',\n      ctr = 'this.cell = cell; this.init();',\n      add = 'if(v==null){++this.missing; return;} if(v!==v) return; ++this.valid;',\n      rem = 'if(v==null){--this.missing; return;} if(v!==v) return; --this.valid;',\n      set = 'var cell = this.cell;';\n  all.forEach(function (a) {\n    init += a.init;\n    add += a.add;\n    rem += a.rem;\n  });\n  agg.slice().sort(compareIndex).forEach(function (a) {\n    set += 't[' + (0, _vegaUtil.stringValue)(a.out) + ']=' + a.set + ';';\n  });\n  set += 'return t;';\n  ctr = Function('cell', ctr);\n  ctr.prototype.init = Function(init);\n  ctr.prototype.add = Function('v', 't', add);\n  ctr.prototype.rem = Function('v', 't', rem);\n  ctr.prototype.set = Function('t', set);\n  ctr.prototype.get = get;\n  ctr.fields = agg.map(function (_) {\n    return _.out;\n  });\n  return ctr;\n}\n},{\"vega-util\":\"d61Z\"}],\"RWZg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction* _default(values, valueof) {\n  if (valueof === undefined) {\n    for (let value of values) {\n      if (value != null && (value = +value) >= value) {\n        yield value;\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n        yield value;\n      }\n    }\n  }\n}\n},{}],\"yJgn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(a, b) {\n  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n},{}],\"CQHQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(compare) {\n  if (compare.length === 1) compare = ascendingComparator(compare);\n  return {\n    left: function (a, x, lo, hi) {\n      if (lo == null) lo = 0;\n      if (hi == null) hi = a.length;\n\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (compare(a[mid], x) < 0) lo = mid + 1;else hi = mid;\n      }\n\n      return lo;\n    },\n    right: function (a, x, lo, hi) {\n      if (lo == null) lo = 0;\n      if (hi == null) hi = a.length;\n\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (compare(a[mid], x) > 0) hi = mid;else lo = mid + 1;\n      }\n\n      return lo;\n    }\n  };\n}\n\nfunction ascendingComparator(f) {\n  return function (d, x) {\n    return (0, _ascending.default)(f(d), x);\n  };\n}\n},{\"./ascending.js\":\"yJgn\"}],\"YrTP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.bisectLeft = exports.bisectRight = void 0;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nvar _bisector = _interopRequireDefault(require(\"./bisector.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ascendingBisect = (0, _bisector.default)(_ascending.default);\nvar bisectRight = ascendingBisect.right;\nexports.bisectRight = bisectRight;\nvar bisectLeft = ascendingBisect.left;\nexports.bisectLeft = bisectLeft;\nvar _default = bisectRight;\nexports.default = _default;\n},{\"./ascending.js\":\"yJgn\",\"./bisector.js\":\"CQHQ\"}],\"w45x\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = count;\n\nfunction count(values, valueof) {\n  let count = 0;\n\n  if (valueof === undefined) {\n    for (let value of values) {\n      if (value != null && (value = +value) >= value) {\n        ++count;\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n        ++count;\n      }\n    }\n  }\n\n  return count;\n}\n},{}],\"LKVk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cross;\n\nfunction length(array) {\n  return array.length | 0;\n}\n\nfunction empty(length) {\n  return !(length > 0);\n}\n\nfunction arrayify(values) {\n  return typeof values !== \"object\" || \"length\" in values ? values : Array.from(values);\n}\n\nfunction reducer(reduce) {\n  return values => reduce(...values);\n}\n\nfunction cross(...values) {\n  const reduce = typeof values[values.length - 1] === \"function\" && reducer(values.pop());\n  values = values.map(arrayify);\n  const lengths = values.map(length);\n  const j = values.length - 1;\n  const index = new Array(j + 1).fill(0);\n  const product = [];\n  if (j < 0 || lengths.some(empty)) return product;\n\n  while (true) {\n    product.push(index.map((j, i) => values[i][j]));\n    let i = j;\n\n    while (++index[i] === lengths[i]) {\n      if (i === 0) return reduce ? product.map(reduce) : product;\n      index[i--] = 0;\n    }\n  }\n}\n},{}],\"YSUD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cumsum;\n\nfunction cumsum(values, valueof) {\n  var sum = 0,\n      index = 0;\n  return Float64Array.from(values, valueof === undefined ? v => sum += +v || 0 : v => sum += +valueof(v, index++, values) || 0);\n}\n},{}],\"fBAz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(a, b) {\n  return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n},{}],\"Nh5Q\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = variance;\n\nfunction variance(values, valueof) {\n  let count = 0;\n  let delta;\n  let mean = 0;\n  let sum = 0;\n\n  if (valueof === undefined) {\n    for (let value of values) {\n      if (value != null && (value = +value) >= value) {\n        delta = value - mean;\n        mean += delta / ++count;\n        sum += delta * (value - mean);\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n        delta = value - mean;\n        mean += delta / ++count;\n        sum += delta * (value - mean);\n      }\n    }\n  }\n\n  if (count > 1) return sum / (count - 1);\n}\n},{}],\"WEAa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = deviation;\n\nvar _variance = _interopRequireDefault(require(\"./variance.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction deviation(values, valueof) {\n  const v = (0, _variance.default)(values, valueof);\n  return v ? Math.sqrt(v) : v;\n}\n},{\"./variance.js\":\"Nh5Q\"}],\"UaWb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(values, valueof) {\n  let min;\n  let max;\n\n  if (valueof === undefined) {\n    for (const value of values) {\n      if (value != null) {\n        if (min === undefined) {\n          if (value >= value) min = max = value;\n        } else {\n          if (min > value) min = value;\n          if (max < value) max = value;\n        }\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null) {\n        if (min === undefined) {\n          if (value >= value) min = max = value;\n        } else {\n          if (min > value) min = value;\n          if (max < value) max = value;\n        }\n      }\n    }\n  }\n\n  return [min, max];\n}\n},{}],\"zkcs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = group;\nexports.groups = groups;\nexports.rollup = rollup;\nexports.rollups = rollups;\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction group(values, ...keys) {\n  return nest(values, _identity.default, _identity.default, keys);\n}\n\nfunction groups(values, ...keys) {\n  return nest(values, Array.from, _identity.default, keys);\n}\n\nfunction rollup(values, reduce, ...keys) {\n  return nest(values, _identity.default, reduce, keys);\n}\n\nfunction rollups(values, reduce, ...keys) {\n  return nest(values, Array.from, reduce, keys);\n}\n\nfunction nest(values, map, reduce, keys) {\n  return function regroup(values, i) {\n    if (i >= keys.length) return reduce(values);\n    const groups = new Map();\n    const keyof = keys[i++];\n    let index = -1;\n\n    for (const value of values) {\n      const key = keyof(value, ++index, values);\n      const group = groups.get(key);\n      if (group) group.push(value);else groups.set(key, [value]);\n    }\n\n    for (const [key, values] of groups) {\n      groups.set(key, regroup(values, i));\n    }\n\n    return map(groups);\n  }(values, 0);\n}\n},{\"./identity.js\":\"n09v\"}],\"RkzJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.map = exports.slice = void 0;\nvar array = Array.prototype;\nvar slice = array.slice;\nexports.slice = slice;\nvar map = array.map;\nexports.map = map;\n},{}],\"aCvo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x) {\n  return function () {\n    return x;\n  };\n}\n},{}],\"wcAU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(start, stop, step) {\n  start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n  var i = -1,\n      n = Math.max(0, Math.ceil((stop - start) / step)) | 0,\n      range = new Array(n);\n\n  while (++i < n) {\n    range[i] = start + i * step;\n  }\n\n  return range;\n}\n},{}],\"EUzg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.tickIncrement = tickIncrement;\nexports.tickStep = tickStep;\nvar e10 = Math.sqrt(50),\n    e5 = Math.sqrt(10),\n    e2 = Math.sqrt(2);\n\nfunction _default(start, stop, count) {\n  var reverse,\n      i = -1,\n      n,\n      ticks,\n      step;\n  stop = +stop, start = +start, count = +count;\n  if (start === stop && count > 0) return [start];\n  if (reverse = stop < start) n = start, start = stop, stop = n;\n  if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n  if (step > 0) {\n    start = Math.ceil(start / step);\n    stop = Math.floor(stop / step);\n    ticks = new Array(n = Math.ceil(stop - start + 1));\n\n    while (++i < n) ticks[i] = (start + i) * step;\n  } else {\n    start = Math.floor(start * step);\n    stop = Math.ceil(stop * step);\n    ticks = new Array(n = Math.ceil(start - stop + 1));\n\n    while (++i < n) ticks[i] = (start - i) / step;\n  }\n\n  if (reverse) ticks.reverse();\n  return ticks;\n}\n\nfunction tickIncrement(start, stop, count) {\n  var step = (stop - start) / Math.max(0, count),\n      power = Math.floor(Math.log(step) / Math.LN10),\n      error = step / Math.pow(10, power);\n  return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nfunction tickStep(start, stop, count) {\n  var step0 = Math.abs(stop - start) / Math.max(0, count),\n      step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n      error = step0 / step1;\n  if (error >= e10) step1 *= 10;else if (error >= e5) step1 *= 5;else if (error >= e2) step1 *= 2;\n  return stop < start ? -step1 : step1;\n}\n},{}],\"J0XR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _count = _interopRequireDefault(require(\"../count.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values) {\n  return Math.ceil(Math.log((0, _count.default)(values)) / Math.LN2) + 1;\n}\n},{\"../count.js\":\"w45x\"}],\"bGH2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"./array.js\");\n\nvar _bisect = _interopRequireDefault(require(\"./bisect.js\"));\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _extent = _interopRequireDefault(require(\"./extent.js\"));\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nvar _range = _interopRequireDefault(require(\"./range.js\"));\n\nvar _ticks = require(\"./ticks.js\");\n\nvar _sturges = _interopRequireDefault(require(\"./threshold/sturges.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var value = _identity.default,\n      domain = _extent.default,\n      threshold = _sturges.default;\n\n  function histogram(data) {\n    if (!Array.isArray(data)) data = Array.from(data);\n    var i,\n        n = data.length,\n        x,\n        values = new Array(n);\n\n    for (i = 0; i < n; ++i) {\n      values[i] = value(data[i], i, data);\n    }\n\n    var xz = domain(values),\n        x0 = xz[0],\n        x1 = xz[1],\n        tz = threshold(values, x0, x1); // Convert number of thresholds into uniform thresholds.\n\n    if (!Array.isArray(tz)) {\n      tz = (0, _ticks.tickStep)(x0, x1, tz);\n      tz = (0, _range.default)(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\n    } // Remove any thresholds outside the domain.\n\n\n    var m = tz.length;\n\n    while (tz[0] <= x0) tz.shift(), --m;\n\n    while (tz[m - 1] > x1) tz.pop(), --m;\n\n    var bins = new Array(m + 1),\n        bin; // Initialize bins.\n\n    for (i = 0; i <= m; ++i) {\n      bin = bins[i] = [];\n      bin.x0 = i > 0 ? tz[i - 1] : x0;\n      bin.x1 = i < m ? tz[i] : x1;\n    } // Assign data to bins by value, ignoring any outside the domain.\n\n\n    for (i = 0; i < n; ++i) {\n      x = values[i];\n\n      if (x0 <= x && x <= x1) {\n        bins[(0, _bisect.default)(tz, x, 0, m)].push(data[i]);\n      }\n    }\n\n    return bins;\n  }\n\n  histogram.value = function (_) {\n    return arguments.length ? (value = typeof _ === \"function\" ? _ : (0, _constant.default)(_), histogram) : value;\n  };\n\n  histogram.domain = function (_) {\n    return arguments.length ? (domain = typeof _ === \"function\" ? _ : (0, _constant.default)([_[0], _[1]]), histogram) : domain;\n  };\n\n  histogram.thresholds = function (_) {\n    return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? (0, _constant.default)(_array.slice.call(_)) : (0, _constant.default)(_), histogram) : threshold;\n  };\n\n  return histogram;\n}\n},{\"./array.js\":\"RkzJ\",\"./bisect.js\":\"YrTP\",\"./constant.js\":\"aCvo\",\"./extent.js\":\"UaWb\",\"./identity.js\":\"n09v\",\"./range.js\":\"wcAU\",\"./ticks.js\":\"EUzg\",\"./threshold/sturges.js\":\"J0XR\"}],\"Ougw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = max;\n\nfunction max(values, valueof) {\n  let max;\n\n  if (valueof === undefined) {\n    for (const value of values) {\n      if (value != null && (max < value || max === undefined && value >= value)) {\n        max = value;\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (max < value || max === undefined && value >= value)) {\n        max = value;\n      }\n    }\n  }\n\n  return max;\n}\n},{}],\"kP8m\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = min;\n\nfunction min(values, valueof) {\n  let min;\n\n  if (valueof === undefined) {\n    for (const value of values) {\n      if (value != null && (min > value || min === undefined && value >= value)) {\n        min = value;\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (min > value || min === undefined && value >= value)) {\n        min = value;\n      }\n    }\n  }\n\n  return min;\n}\n},{}],\"v5AZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = quickselect;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Based on https://github.com/mourner/quickselect\n// ISC license, Copyright 2018 Vladimir Agafonkin.\nfunction quickselect(array, k, left = 0, right = array.length - 1, compare = _ascending.default) {\n  while (right > left) {\n    if (right - left > 600) {\n      const n = right - left + 1;\n      const m = k - left + 1;\n      const z = Math.log(n);\n      const s = 0.5 * Math.exp(2 * z / 3);\n      const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n      const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n      const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n      quickselect(array, k, newLeft, newRight, compare);\n    }\n\n    const t = array[k];\n    let i = left;\n    let j = right;\n    swap(array, left, k);\n    if (compare(array[right], t) > 0) swap(array, left, right);\n\n    while (i < j) {\n      swap(array, i, j), ++i, --j;\n\n      while (compare(array[i], t) < 0) ++i;\n\n      while (compare(array[j], t) > 0) --j;\n    }\n\n    if (compare(array[left], t) === 0) swap(array, left, j);else ++j, swap(array, j, right);\n    if (j <= k) left = j + 1;\n    if (k <= j) right = j - 1;\n  }\n\n  return array;\n}\n\nfunction swap(array, i, j) {\n  const t = array[i];\n  array[i] = array[j];\n  array[j] = t;\n}\n},{\"./ascending.js\":\"yJgn\"}],\"XWLP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.numbers = numbers;\n\nfunction _default(x) {\n  return x === null ? NaN : +x;\n}\n\nfunction* numbers(values, valueof) {\n  if (valueof === undefined) {\n    for (let value of values) {\n      if (value != null && (value = +value) >= value) {\n        yield value;\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n        yield value;\n      }\n    }\n  }\n}\n},{}],\"xM5B\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = quantile;\nexports.quantileSorted = quantileSorted;\n\nvar _max = _interopRequireDefault(require(\"./max.js\"));\n\nvar _min = _interopRequireDefault(require(\"./min.js\"));\n\nvar _quickselect = _interopRequireDefault(require(\"./quickselect.js\"));\n\nvar _number = _interopRequireWildcard(require(\"./number.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction quantile(values, p, valueof) {\n  values = Float64Array.from((0, _number.numbers)(values, valueof));\n  if (!(n = values.length)) return;\n  if ((p = +p) <= 0 || n < 2) return (0, _min.default)(values);\n  if (p >= 1) return (0, _max.default)(values);\n  var n,\n      i = (n - 1) * p,\n      i0 = Math.floor(i),\n      value0 = (0, _max.default)((0, _quickselect.default)(values, i0).subarray(0, i0 + 1)),\n      value1 = (0, _min.default)(values.subarray(i0 + 1));\n  return value0 + (value1 - value0) * (i - i0);\n}\n\nfunction quantileSorted(values, p, valueof = _number.default) {\n  if (!(n = values.length)) return;\n  if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n  if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n  var n,\n      i = (n - 1) * p,\n      i0 = Math.floor(i),\n      value0 = +valueof(values[i0], i0, values),\n      value1 = +valueof(values[i0 + 1], i0 + 1, values);\n  return value0 + (value1 - value0) * (i - i0);\n}\n},{\"./max.js\":\"Ougw\",\"./min.js\":\"kP8m\",\"./quickselect.js\":\"v5AZ\",\"./number.js\":\"XWLP\"}],\"nJJ4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _count = _interopRequireDefault(require(\"../count.js\"));\n\nvar _quantile = _interopRequireDefault(require(\"../quantile.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, min, max) {\n  return Math.ceil((max - min) / (2 * ((0, _quantile.default)(values, 0.75) - (0, _quantile.default)(values, 0.25)) * Math.pow((0, _count.default)(values), -1 / 3)));\n}\n},{\"../count.js\":\"w45x\",\"../quantile.js\":\"xM5B\"}],\"Rqev\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _count = _interopRequireDefault(require(\"../count.js\"));\n\nvar _deviation = _interopRequireDefault(require(\"../deviation.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, min, max) {\n  return Math.ceil((max - min) / (3.5 * (0, _deviation.default)(values) * Math.pow((0, _count.default)(values), -1 / 3)));\n}\n},{\"../count.js\":\"w45x\",\"../deviation.js\":\"WEAa\"}],\"IgNN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = maxIndex;\n\nfunction maxIndex(values, valueof) {\n  let max;\n  let maxIndex = -1;\n  let index = -1;\n\n  if (valueof === undefined) {\n    for (const value of values) {\n      ++index;\n\n      if (value != null && (max < value || max === undefined && value >= value)) {\n        max = value, maxIndex = index;\n      }\n    }\n  } else {\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (max < value || max === undefined && value >= value)) {\n        max = value, maxIndex = index;\n      }\n    }\n  }\n\n  return maxIndex;\n}\n},{}],\"YY5N\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = mean;\n\nfunction mean(values, valueof) {\n  let count = 0;\n  let sum = 0;\n\n  if (valueof === undefined) {\n    for (let value of values) {\n      if (value != null && (value = +value) >= value) {\n        ++count, sum += value;\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n        ++count, sum += value;\n      }\n    }\n  }\n\n  if (count) return sum / count;\n}\n},{}],\"CxwF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _quantile = _interopRequireDefault(require(\"./quantile.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, valueof) {\n  return (0, _quantile.default)(values, 0.5, valueof);\n}\n},{\"./quantile.js\":\"xM5B\"}],\"Getd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = merge;\n\nfunction* flatten(arrays) {\n  for (const array of arrays) {\n    yield* array;\n  }\n}\n\nfunction merge(arrays) {\n  return Array.from(flatten(arrays));\n}\n},{}],\"Fe03\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = minIndex;\n\nfunction minIndex(values, valueof) {\n  let min;\n  let minIndex = -1;\n  let index = -1;\n\n  if (valueof === undefined) {\n    for (const value of values) {\n      ++index;\n\n      if (value != null && (min > value || min === undefined && value >= value)) {\n        min = value, minIndex = index;\n      }\n    }\n  } else {\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null && (min > value || min === undefined && value >= value)) {\n        min = value, minIndex = index;\n      }\n    }\n  }\n\n  return minIndex;\n}\n},{}],\"DkXH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = pairs;\nexports.pair = pair;\n\nfunction pairs(values, pairof = pair) {\n  const pairs = [];\n  let previous;\n  let first = false;\n\n  for (const value of values) {\n    if (first) pairs.push(pairof(previous, value));\n    previous = value;\n    first = true;\n  }\n\n  return pairs;\n}\n\nfunction pair(a, b) {\n  return [a, b];\n}\n},{}],\"RhiG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(source, keys) {\n  return Array.from(keys, key => source[key]);\n}\n},{}],\"LCo4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = least;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction least(values, compare = _ascending.default) {\n  let min;\n  let defined = false;\n\n  if (compare.length === 1) {\n    let minValue;\n\n    for (const element of values) {\n      const value = compare(element);\n\n      if (defined ? (0, _ascending.default)(value, minValue) < 0 : (0, _ascending.default)(value, value) === 0) {\n        min = element;\n        minValue = value;\n        defined = true;\n      }\n    }\n  } else {\n    for (const value of values) {\n      if (defined ? compare(value, min) < 0 : compare(value, value) === 0) {\n        min = value;\n        defined = true;\n      }\n    }\n  }\n\n  return min;\n}\n},{\"./ascending.js\":\"yJgn\"}],\"JcRo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = leastIndex;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nvar _minIndex = _interopRequireDefault(require(\"./minIndex.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction leastIndex(values, compare = _ascending.default) {\n  if (compare.length === 1) return (0, _minIndex.default)(values, compare);\n  let minValue;\n  let min = -1;\n  let index = -1;\n\n  for (const value of values) {\n    ++index;\n\n    if (min < 0 ? compare(value, value) === 0 : compare(value, minValue) < 0) {\n      minValue = value;\n      min = index;\n    }\n  }\n\n  return min;\n}\n},{\"./ascending.js\":\"yJgn\",\"./minIndex.js\":\"Fe03\"}],\"P3UJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = greatest;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction greatest(values, compare = _ascending.default) {\n  let max;\n  let defined = false;\n\n  if (compare.length === 1) {\n    let maxValue;\n\n    for (const element of values) {\n      const value = compare(element);\n\n      if (defined ? (0, _ascending.default)(value, maxValue) > 0 : (0, _ascending.default)(value, value) === 0) {\n        max = element;\n        maxValue = value;\n        defined = true;\n      }\n    }\n  } else {\n    for (const value of values) {\n      if (defined ? compare(value, max) > 0 : compare(value, value) === 0) {\n        max = value;\n        defined = true;\n      }\n    }\n  }\n\n  return max;\n}\n},{\"./ascending.js\":\"yJgn\"}],\"Rv6z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = greatestIndex;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nvar _maxIndex = _interopRequireDefault(require(\"./maxIndex.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction greatestIndex(values, compare = _ascending.default) {\n  if (compare.length === 1) return (0, _maxIndex.default)(values, compare);\n  let maxValue;\n  let max = -1;\n  let index = -1;\n\n  for (const value of values) {\n    ++index;\n\n    if (max < 0 ? compare(value, value) === 0 : compare(value, maxValue) > 0) {\n      maxValue = value;\n      max = index;\n    }\n  }\n\n  return max;\n}\n},{\"./ascending.js\":\"yJgn\",\"./maxIndex.js\":\"IgNN\"}],\"swlo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = scan;\n\nvar _leastIndex = _interopRequireDefault(require(\"./leastIndex.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction scan(values, compare) {\n  const index = (0, _leastIndex.default)(values, compare);\n  return index < 0 ? undefined : index;\n}\n},{\"./leastIndex.js\":\"JcRo\"}],\"Xskt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = shuffle;\n\nfunction shuffle(array, i0 = 0, i1 = array.length) {\n  var m = i1 - (i0 = +i0),\n      t,\n      i;\n\n  while (m) {\n    i = Math.random() * m-- | 0;\n    t = array[m + i0];\n    array[m + i0] = array[i + i0];\n    array[i + i0] = t;\n  }\n\n  return array;\n}\n},{}],\"uFmM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = sum;\n\nfunction sum(values, valueof) {\n  let sum = 0;\n\n  if (valueof === undefined) {\n    for (let value of values) {\n      if (value = +value) {\n        sum += value;\n      }\n    }\n  } else {\n    let index = -1;\n\n    for (let value of values) {\n      if (value = +valueof(value, ++index, values)) {\n        sum += value;\n      }\n    }\n  }\n\n  return sum;\n}\n},{}],\"DmNI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _min = _interopRequireDefault(require(\"./min.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(matrix) {\n  if (!(n = matrix.length)) return [];\n\n  for (var i = -1, m = (0, _min.default)(matrix, length), transpose = new Array(m); ++i < m;) {\n    for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n      row[j] = matrix[j][i];\n    }\n  }\n\n  return transpose;\n}\n\nfunction length(d) {\n  return d.length;\n}\n},{\"./min.js\":\"kP8m\"}],\"ciZM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _transpose = _interopRequireDefault(require(\"./transpose.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  return (0, _transpose.default)(arguments);\n}\n},{\"./transpose.js\":\"DmNI\"}],\"K0bd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"bisect\", {\n  enumerable: true,\n  get: function () {\n    return _bisect.default;\n  }\n});\nObject.defineProperty(exports, \"bisectRight\", {\n  enumerable: true,\n  get: function () {\n    return _bisect.bisectRight;\n  }\n});\nObject.defineProperty(exports, \"bisectLeft\", {\n  enumerable: true,\n  get: function () {\n    return _bisect.bisectLeft;\n  }\n});\nObject.defineProperty(exports, \"ascending\", {\n  enumerable: true,\n  get: function () {\n    return _ascending.default;\n  }\n});\nObject.defineProperty(exports, \"bisector\", {\n  enumerable: true,\n  get: function () {\n    return _bisector.default;\n  }\n});\nObject.defineProperty(exports, \"count\", {\n  enumerable: true,\n  get: function () {\n    return _count.default;\n  }\n});\nObject.defineProperty(exports, \"cross\", {\n  enumerable: true,\n  get: function () {\n    return _cross.default;\n  }\n});\nObject.defineProperty(exports, \"cumsum\", {\n  enumerable: true,\n  get: function () {\n    return _cumsum.default;\n  }\n});\nObject.defineProperty(exports, \"descending\", {\n  enumerable: true,\n  get: function () {\n    return _descending.default;\n  }\n});\nObject.defineProperty(exports, \"deviation\", {\n  enumerable: true,\n  get: function () {\n    return _deviation.default;\n  }\n});\nObject.defineProperty(exports, \"extent\", {\n  enumerable: true,\n  get: function () {\n    return _extent.default;\n  }\n});\nObject.defineProperty(exports, \"group\", {\n  enumerable: true,\n  get: function () {\n    return _group.default;\n  }\n});\nObject.defineProperty(exports, \"groups\", {\n  enumerable: true,\n  get: function () {\n    return _group.groups;\n  }\n});\nObject.defineProperty(exports, \"rollup\", {\n  enumerable: true,\n  get: function () {\n    return _group.rollup;\n  }\n});\nObject.defineProperty(exports, \"rollups\", {\n  enumerable: true,\n  get: function () {\n    return _group.rollups;\n  }\n});\nObject.defineProperty(exports, \"bin\", {\n  enumerable: true,\n  get: function () {\n    return _bin.default;\n  }\n});\nObject.defineProperty(exports, \"histogram\", {\n  enumerable: true,\n  get: function () {\n    return _bin.default;\n  }\n});\nObject.defineProperty(exports, \"thresholdFreedmanDiaconis\", {\n  enumerable: true,\n  get: function () {\n    return _freedmanDiaconis.default;\n  }\n});\nObject.defineProperty(exports, \"thresholdScott\", {\n  enumerable: true,\n  get: function () {\n    return _scott.default;\n  }\n});\nObject.defineProperty(exports, \"thresholdSturges\", {\n  enumerable: true,\n  get: function () {\n    return _sturges.default;\n  }\n});\nObject.defineProperty(exports, \"max\", {\n  enumerable: true,\n  get: function () {\n    return _max.default;\n  }\n});\nObject.defineProperty(exports, \"maxIndex\", {\n  enumerable: true,\n  get: function () {\n    return _maxIndex.default;\n  }\n});\nObject.defineProperty(exports, \"mean\", {\n  enumerable: true,\n  get: function () {\n    return _mean.default;\n  }\n});\nObject.defineProperty(exports, \"median\", {\n  enumerable: true,\n  get: function () {\n    return _median.default;\n  }\n});\nObject.defineProperty(exports, \"merge\", {\n  enumerable: true,\n  get: function () {\n    return _merge.default;\n  }\n});\nObject.defineProperty(exports, \"min\", {\n  enumerable: true,\n  get: function () {\n    return _min.default;\n  }\n});\nObject.defineProperty(exports, \"minIndex\", {\n  enumerable: true,\n  get: function () {\n    return _minIndex.default;\n  }\n});\nObject.defineProperty(exports, \"pairs\", {\n  enumerable: true,\n  get: function () {\n    return _pairs.default;\n  }\n});\nObject.defineProperty(exports, \"permute\", {\n  enumerable: true,\n  get: function () {\n    return _permute.default;\n  }\n});\nObject.defineProperty(exports, \"quantile\", {\n  enumerable: true,\n  get: function () {\n    return _quantile.default;\n  }\n});\nObject.defineProperty(exports, \"quantileSorted\", {\n  enumerable: true,\n  get: function () {\n    return _quantile.quantileSorted;\n  }\n});\nObject.defineProperty(exports, \"quickselect\", {\n  enumerable: true,\n  get: function () {\n    return _quickselect.default;\n  }\n});\nObject.defineProperty(exports, \"range\", {\n  enumerable: true,\n  get: function () {\n    return _range.default;\n  }\n});\nObject.defineProperty(exports, \"least\", {\n  enumerable: true,\n  get: function () {\n    return _least.default;\n  }\n});\nObject.defineProperty(exports, \"leastIndex\", {\n  enumerable: true,\n  get: function () {\n    return _leastIndex.default;\n  }\n});\nObject.defineProperty(exports, \"greatest\", {\n  enumerable: true,\n  get: function () {\n    return _greatest.default;\n  }\n});\nObject.defineProperty(exports, \"greatestIndex\", {\n  enumerable: true,\n  get: function () {\n    return _greatestIndex.default;\n  }\n});\nObject.defineProperty(exports, \"scan\", {\n  enumerable: true,\n  get: function () {\n    return _scan.default;\n  }\n});\nObject.defineProperty(exports, \"shuffle\", {\n  enumerable: true,\n  get: function () {\n    return _shuffle.default;\n  }\n});\nObject.defineProperty(exports, \"sum\", {\n  enumerable: true,\n  get: function () {\n    return _sum.default;\n  }\n});\nObject.defineProperty(exports, \"ticks\", {\n  enumerable: true,\n  get: function () {\n    return _ticks.default;\n  }\n});\nObject.defineProperty(exports, \"tickIncrement\", {\n  enumerable: true,\n  get: function () {\n    return _ticks.tickIncrement;\n  }\n});\nObject.defineProperty(exports, \"tickStep\", {\n  enumerable: true,\n  get: function () {\n    return _ticks.tickStep;\n  }\n});\nObject.defineProperty(exports, \"transpose\", {\n  enumerable: true,\n  get: function () {\n    return _transpose.default;\n  }\n});\nObject.defineProperty(exports, \"variance\", {\n  enumerable: true,\n  get: function () {\n    return _variance.default;\n  }\n});\nObject.defineProperty(exports, \"zip\", {\n  enumerable: true,\n  get: function () {\n    return _zip.default;\n  }\n});\n\nvar _bisect = _interopRequireWildcard(require(\"./bisect.js\"));\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nvar _bisector = _interopRequireDefault(require(\"./bisector.js\"));\n\nvar _count = _interopRequireDefault(require(\"./count.js\"));\n\nvar _cross = _interopRequireDefault(require(\"./cross.js\"));\n\nvar _cumsum = _interopRequireDefault(require(\"./cumsum.js\"));\n\nvar _descending = _interopRequireDefault(require(\"./descending.js\"));\n\nvar _deviation = _interopRequireDefault(require(\"./deviation.js\"));\n\nvar _extent = _interopRequireDefault(require(\"./extent.js\"));\n\nvar _group = _interopRequireWildcard(require(\"./group.js\"));\n\nvar _bin = _interopRequireDefault(require(\"./bin.js\"));\n\nvar _freedmanDiaconis = _interopRequireDefault(require(\"./threshold/freedmanDiaconis.js\"));\n\nvar _scott = _interopRequireDefault(require(\"./threshold/scott.js\"));\n\nvar _sturges = _interopRequireDefault(require(\"./threshold/sturges.js\"));\n\nvar _max = _interopRequireDefault(require(\"./max.js\"));\n\nvar _maxIndex = _interopRequireDefault(require(\"./maxIndex.js\"));\n\nvar _mean = _interopRequireDefault(require(\"./mean.js\"));\n\nvar _median = _interopRequireDefault(require(\"./median.js\"));\n\nvar _merge = _interopRequireDefault(require(\"./merge.js\"));\n\nvar _min = _interopRequireDefault(require(\"./min.js\"));\n\nvar _minIndex = _interopRequireDefault(require(\"./minIndex.js\"));\n\nvar _pairs = _interopRequireDefault(require(\"./pairs.js\"));\n\nvar _permute = _interopRequireDefault(require(\"./permute.js\"));\n\nvar _quantile = _interopRequireWildcard(require(\"./quantile.js\"));\n\nvar _quickselect = _interopRequireDefault(require(\"./quickselect.js\"));\n\nvar _range = _interopRequireDefault(require(\"./range.js\"));\n\nvar _least = _interopRequireDefault(require(\"./least.js\"));\n\nvar _leastIndex = _interopRequireDefault(require(\"./leastIndex.js\"));\n\nvar _greatest = _interopRequireDefault(require(\"./greatest.js\"));\n\nvar _greatestIndex = _interopRequireDefault(require(\"./greatestIndex.js\"));\n\nvar _scan = _interopRequireDefault(require(\"./scan.js\"));\n\nvar _shuffle = _interopRequireDefault(require(\"./shuffle.js\"));\n\nvar _sum = _interopRequireDefault(require(\"./sum.js\"));\n\nvar _ticks = _interopRequireWildcard(require(\"./ticks.js\"));\n\nvar _transpose = _interopRequireDefault(require(\"./transpose.js\"));\n\nvar _variance = _interopRequireDefault(require(\"./variance.js\"));\n\nvar _zip = _interopRequireDefault(require(\"./zip.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./bisect.js\":\"YrTP\",\"./ascending.js\":\"yJgn\",\"./bisector.js\":\"CQHQ\",\"./count.js\":\"w45x\",\"./cross.js\":\"LKVk\",\"./cumsum.js\":\"YSUD\",\"./descending.js\":\"fBAz\",\"./deviation.js\":\"WEAa\",\"./extent.js\":\"UaWb\",\"./group.js\":\"zkcs\",\"./bin.js\":\"bGH2\",\"./threshold/freedmanDiaconis.js\":\"nJJ4\",\"./threshold/scott.js\":\"Rqev\",\"./threshold/sturges.js\":\"J0XR\",\"./max.js\":\"Ougw\",\"./maxIndex.js\":\"IgNN\",\"./mean.js\":\"YY5N\",\"./median.js\":\"CxwF\",\"./merge.js\":\"Getd\",\"./min.js\":\"kP8m\",\"./minIndex.js\":\"Fe03\",\"./pairs.js\":\"DkXH\",\"./permute.js\":\"RhiG\",\"./quantile.js\":\"xM5B\",\"./quickselect.js\":\"v5AZ\",\"./range.js\":\"wcAU\",\"./least.js\":\"LCo4\",\"./leastIndex.js\":\"JcRo\",\"./greatest.js\":\"P3UJ\",\"./greatestIndex.js\":\"Rv6z\",\"./scan.js\":\"swlo\",\"./shuffle.js\":\"Xskt\",\"./sum.js\":\"uFmM\",\"./ticks.js\":\"EUzg\",\"./transpose.js\":\"DmNI\",\"./variance.js\":\"Nh5Q\",\"./zip.js\":\"ciZM\"}],\"PSiw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _numbers = _interopRequireDefault(require(\"./numbers\"));\n\nvar _d3Array = require(\"d3-array\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(array, p, f) {\n  var values = Float64Array.from((0, _numbers.default)(array, f)); // don't depend on return value from typed array sort call\n  // protects against undefined sort results in Safari (vega/vega-lite#4964)\n\n  values.sort(_d3Array.ascending);\n  return p.map(_ => (0, _d3Array.quantileSorted)(values, _));\n}\n},{\"./numbers\":\"RWZg\",\"d3-array\":\"K0bd\"}],\"iRfw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _quantiles = _interopRequireDefault(require(\"./quantiles\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(array, f) {\n  return (0, _quantiles.default)(array, [0.25, 0.50, 0.75], f);\n}\n},{\"./quantiles\":\"PSiw\"}],\"F4yd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _quartiles = _interopRequireDefault(require(\"./quartiles\"));\n\nvar _d3Array = require(\"d3-array\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Scott, D. W. (1992) Multivariate Density Estimation:\n// Theory, Practice, and Visualization. Wiley.\nfunction _default(array, f) {\n  var n = array.length,\n      v = (0, _d3Array.deviation)(array, f),\n      q = (0, _quartiles.default)(array, f),\n      h = (q[2] - q[0]) / 1.34;\n  v = Math.min(v, h) || v || Math.abs(q[0]) || 1;\n  return 1.06 * v * Math.pow(n, -0.2);\n}\n},{\"./quartiles\":\"iRfw\",\"d3-array\":\"K0bd\"}],\"DV8S\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  // determine range\n  var maxb = _.maxbins || 20,\n      base = _.base || 10,\n      logb = Math.log(base),\n      div = _.divide || [5, 2],\n      min = _.extent[0],\n      max = _.extent[1],\n      span = _.span || max - min || Math.abs(min) || 1,\n      step,\n      level,\n      minstep,\n      precision,\n      v,\n      i,\n      n,\n      eps;\n\n  if (_.step) {\n    // if step size is explicitly given, use that\n    step = _.step;\n  } else if (_.steps) {\n    // if provided, limit choice to acceptable step sizes\n    v = span / maxb;\n\n    for (i = 0, n = _.steps.length; i < n && _.steps[i] < v; ++i);\n\n    step = _.steps[Math.max(0, i - 1)];\n  } else {\n    // else use span to determine step size\n    level = Math.ceil(Math.log(maxb) / logb);\n    minstep = _.minstep || 0;\n    step = Math.max(minstep, Math.pow(base, Math.round(Math.log(span) / logb) - level)); // increase step size if too many bins\n\n    while (Math.ceil(span / step) > maxb) {\n      step *= base;\n    } // decrease step size if allowed\n\n\n    for (i = 0, n = div.length; i < n; ++i) {\n      v = step / div[i];\n      if (v >= minstep && span / v <= maxb) step = v;\n    }\n  } // update precision, min and max\n\n\n  v = Math.log(step);\n  precision = v >= 0 ? 0 : ~~(-v / logb) + 1;\n  eps = Math.pow(base, -precision - 1);\n\n  if (_.nice || _.nice === undefined) {\n    v = Math.floor(min / step + eps) * step;\n    min = min < v ? v - step : v;\n    max = Math.ceil(max / step) * step;\n  }\n\n  return {\n    start: min,\n    stop: max === min ? min + step : max,\n    step: step\n  };\n}\n},{}],\"iLAe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setRandom = setRandom;\nexports.random = void 0;\nvar random = Math.random;\nexports.random = random;\n\nfunction setRandom(r) {\n  exports.random = random = r;\n}\n},{}],\"Rspz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _numbers = _interopRequireDefault(require(\"./numbers\"));\n\nvar _random = require(\"./random\");\n\nvar _d3Array = require(\"d3-array\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(array, samples, alpha, f) {\n  if (!array.length) return [undefined, undefined];\n  var values = Float64Array.from((0, _numbers.default)(array, f)),\n      n = values.length,\n      m = samples,\n      a,\n      i,\n      j,\n      mu;\n\n  for (j = 0, mu = Array(m); j < m; ++j) {\n    for (a = 0, i = 0; i < n; ++i) {\n      a += values[~~((0, _random.random)() * n)];\n    }\n\n    mu[j] = a / n;\n  }\n\n  mu.sort(_d3Array.ascending);\n  return [(0, _d3Array.quantile)(mu, alpha / 2), (0, _d3Array.quantile)(mu, 1 - alpha / 2)];\n}\n},{\"./numbers\":\"RWZg\",\"./random\":\"iLAe\",\"d3-array\":\"K0bd\"}],\"ul5j\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Dot density binning for dot plot construction.\n// Based on Leland Wilkinson, Dot Plots, The American Statistician, 1999.\n// https://www.cs.uic.edu/~wilkinson/Publications/dotplots.pdf\nfunction _default(array, step, smooth, f) {\n  f = f || (_ => _);\n\n  let i = 0,\n      j = 1,\n      n = array.length,\n      v = new Float64Array(n),\n      a = f(array[0]),\n      b = a,\n      w = a + step,\n      x;\n\n  for (; j < n; ++j) {\n    x = f(array[j]);\n\n    if (x >= w) {\n      b = (a + b) / 2;\n\n      for (; i < j; ++i) v[i] = b;\n\n      w = x + step;\n      a = x;\n    }\n\n    b = x;\n  }\n\n  b = (a + b) / 2;\n\n  for (; i < j; ++i) v[i] = b;\n\n  return smooth ? smoothing(v, step + step / 4) : v;\n} // perform smoothing to reduce variance\n// swap points between \"adjacent\" stacks\n// Wilkinson defines adjacent as within step/4 units\n\n\nfunction smoothing(v, thresh) {\n  let n = v.length,\n      a = 0,\n      b = 1,\n      c,\n      d; // get left stack\n\n  while (v[a] === v[b]) ++b;\n\n  while (b < n) {\n    // get right stack\n    c = b + 1;\n\n    while (v[b] === v[c]) ++c; // are stacks adjacent?\n    // if so, compare sizes and swap as needed\n\n\n    if (v[b] - v[b - 1] < thresh) {\n      d = b + (a + c - b - b >> 1);\n\n      while (d < b) v[d++] = v[b];\n\n      while (d > b) v[d--] = v[a];\n    } // update left stack indices\n\n\n    a = b;\n    b = c;\n  }\n\n  return v;\n}\n},{}],\"rIKu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(seed) {\n  // Random numbers using a Linear Congruential Generator with seed value\n  // Uses glibc values from https://en.wikipedia.org/wiki/Linear_congruential_generator\n  return function () {\n    seed = (1103515245 * seed + 12345) % 2147483647;\n    return seed / 2147483647;\n  };\n}\n},{}],\"ynIt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _random = require(\"./random\");\n\nfunction _default(min, max) {\n  if (max == null) {\n    max = min;\n    min = 0;\n  }\n\n  var dist = {},\n      a,\n      b,\n      d;\n\n  dist.min = function (_) {\n    if (arguments.length) {\n      a = _ || 0;\n      d = b - a;\n      return dist;\n    } else {\n      return a;\n    }\n  };\n\n  dist.max = function (_) {\n    if (arguments.length) {\n      b = _ || 0;\n      d = b - a;\n      return dist;\n    } else {\n      return b;\n    }\n  };\n\n  dist.sample = function () {\n    return a + Math.floor(d * (0, _random.random)());\n  };\n\n  dist.pdf = function (x) {\n    return x === Math.floor(x) && x >= a && x < b ? 1 / d : 0;\n  };\n\n  dist.cdf = function (x) {\n    var v = Math.floor(x);\n    return v < a ? 0 : v >= b ? 1 : (v - a + 1) / d;\n  };\n\n  dist.icdf = function (p) {\n    return p >= 0 && p <= 1 ? a - 1 + Math.floor(p * d) : NaN;\n  };\n\n  return dist.min(min).max(max);\n}\n},{\"./random\":\"iLAe\"}],\"oXNO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SQRT2 = exports.SQRT2PI = void 0;\nconst SQRT2PI = Math.sqrt(2 * Math.PI);\nexports.SQRT2PI = SQRT2PI;\nconst SQRT2 = Math.SQRT2;\nexports.SQRT2 = SQRT2;\n},{}],\"eSVR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sampleNormal = sampleNormal;\nexports.densityNormal = densityNormal;\nexports.cumulativeNormal = cumulativeNormal;\nexports.quantileNormal = quantileNormal;\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _random = require(\"./random\");\n\nlet nextSample = NaN;\n\nfunction sampleNormal(mean, stdev) {\n  mean = mean || 0;\n  stdev = stdev == null ? 1 : stdev;\n  let x = 0,\n      y = 0,\n      rds,\n      c;\n\n  if (nextSample === nextSample) {\n    x = nextSample;\n    nextSample = NaN;\n  } else {\n    do {\n      x = (0, _random.random)() * 2 - 1;\n      y = (0, _random.random)() * 2 - 1;\n      rds = x * x + y * y;\n    } while (rds === 0 || rds > 1);\n\n    c = Math.sqrt(-2 * Math.log(rds) / rds); // Box-Muller transform\n\n    x *= c;\n    nextSample = y * c;\n  }\n\n  return mean + x * stdev;\n}\n\nfunction densityNormal(value, mean, stdev) {\n  stdev = stdev == null ? 1 : stdev;\n  const z = (value - (mean || 0)) / stdev;\n  return Math.exp(-0.5 * z * z) / (stdev * _constants.SQRT2PI);\n} // Approximation from West (2009)\n// Better Approximations to Cumulative Normal Functions\n\n\nfunction cumulativeNormal(value, mean, stdev) {\n  mean = mean || 0;\n  stdev = stdev == null ? 1 : stdev;\n  let cd,\n      z = (value - mean) / stdev,\n      Z = Math.abs(z);\n\n  if (Z > 37) {\n    cd = 0;\n  } else {\n    let sum,\n        exp = Math.exp(-Z * Z / 2);\n\n    if (Z < 7.07106781186547) {\n      sum = 3.52624965998911e-02 * Z + 0.700383064443688;\n      sum = sum * Z + 6.37396220353165;\n      sum = sum * Z + 33.912866078383;\n      sum = sum * Z + 112.079291497871;\n      sum = sum * Z + 221.213596169931;\n      sum = sum * Z + 220.206867912376;\n      cd = exp * sum;\n      sum = 8.83883476483184e-02 * Z + 1.75566716318264;\n      sum = sum * Z + 16.064177579207;\n      sum = sum * Z + 86.7807322029461;\n      sum = sum * Z + 296.564248779674;\n      sum = sum * Z + 637.333633378831;\n      sum = sum * Z + 793.826512519948;\n      sum = sum * Z + 440.413735824752;\n      cd = cd / sum;\n    } else {\n      sum = Z + 0.65;\n      sum = Z + 4 / sum;\n      sum = Z + 3 / sum;\n      sum = Z + 2 / sum;\n      sum = Z + 1 / sum;\n      cd = exp / sum / 2.506628274631;\n    }\n  }\n\n  return z > 0 ? 1 - cd : cd;\n} // Approximation of Probit function using inverse error function.\n\n\nfunction quantileNormal(p, mean, stdev) {\n  if (p < 0 || p > 1) return NaN;\n  return (mean || 0) + (stdev == null ? 1 : stdev) * _constants.SQRT2 * erfinv(2 * p - 1);\n} // Approximate inverse error function. Implementation from \"Approximating\n// the erfinv function\" by Mike Giles, GPU Computing Gems, volume 2, 2010.\n// Ported from Apache Commons Math, http://www.apache.org/licenses/LICENSE-2.0\n\n\nfunction erfinv(x) {\n  // beware that the logarithm argument must be\n  // commputed as (1.0 - x) * (1.0 + x),\n  // it must NOT be simplified as 1.0 - x * x as this\n  // would induce rounding errors near the boundaries +/-1\n  let w = -Math.log((1 - x) * (1 + x)),\n      p;\n\n  if (w < 6.25) {\n    w -= 3.125;\n    p = -3.6444120640178196996e-21;\n    p = -1.685059138182016589e-19 + p * w;\n    p = 1.2858480715256400167e-18 + p * w;\n    p = 1.115787767802518096e-17 + p * w;\n    p = -1.333171662854620906e-16 + p * w;\n    p = 2.0972767875968561637e-17 + p * w;\n    p = 6.6376381343583238325e-15 + p * w;\n    p = -4.0545662729752068639e-14 + p * w;\n    p = -8.1519341976054721522e-14 + p * w;\n    p = 2.6335093153082322977e-12 + p * w;\n    p = -1.2975133253453532498e-11 + p * w;\n    p = -5.4154120542946279317e-11 + p * w;\n    p = 1.051212273321532285e-09 + p * w;\n    p = -4.1126339803469836976e-09 + p * w;\n    p = -2.9070369957882005086e-08 + p * w;\n    p = 4.2347877827932403518e-07 + p * w;\n    p = -1.3654692000834678645e-06 + p * w;\n    p = -1.3882523362786468719e-05 + p * w;\n    p = 0.0001867342080340571352 + p * w;\n    p = -0.00074070253416626697512 + p * w;\n    p = -0.0060336708714301490533 + p * w;\n    p = 0.24015818242558961693 + p * w;\n    p = 1.6536545626831027356 + p * w;\n  } else if (w < 16.0) {\n    w = Math.sqrt(w) - 3.25;\n    p = 2.2137376921775787049e-09;\n    p = 9.0756561938885390979e-08 + p * w;\n    p = -2.7517406297064545428e-07 + p * w;\n    p = 1.8239629214389227755e-08 + p * w;\n    p = 1.5027403968909827627e-06 + p * w;\n    p = -4.013867526981545969e-06 + p * w;\n    p = 2.9234449089955446044e-06 + p * w;\n    p = 1.2475304481671778723e-05 + p * w;\n    p = -4.7318229009055733981e-05 + p * w;\n    p = 6.8284851459573175448e-05 + p * w;\n    p = 2.4031110387097893999e-05 + p * w;\n    p = -0.0003550375203628474796 + p * w;\n    p = 0.00095328937973738049703 + p * w;\n    p = -0.0016882755560235047313 + p * w;\n    p = 0.0024914420961078508066 + p * w;\n    p = -0.0037512085075692412107 + p * w;\n    p = 0.005370914553590063617 + p * w;\n    p = 1.0052589676941592334 + p * w;\n    p = 3.0838856104922207635 + p * w;\n  } else if (Number.isFinite(w)) {\n    w = Math.sqrt(w) - 5.0;\n    p = -2.7109920616438573243e-11;\n    p = -2.5556418169965252055e-10 + p * w;\n    p = 1.5076572693500548083e-09 + p * w;\n    p = -3.7894654401267369937e-09 + p * w;\n    p = 7.6157012080783393804e-09 + p * w;\n    p = -1.4960026627149240478e-08 + p * w;\n    p = 2.9147953450901080826e-08 + p * w;\n    p = -6.7711997758452339498e-08 + p * w;\n    p = 2.2900482228026654717e-07 + p * w;\n    p = -9.9298272942317002539e-07 + p * w;\n    p = 4.5260625972231537039e-06 + p * w;\n    p = -1.9681778105531670567e-05 + p * w;\n    p = 7.5995277030017761139e-05 + p * w;\n    p = -0.00021503011930044477347 + p * w;\n    p = -0.00013871931833623122026 + p * w;\n    p = 1.0103004648645343977 + p * w;\n    p = 4.8499064014085844221 + p * w;\n  } else {\n    p = Infinity;\n  }\n\n  return p * x;\n}\n\nfunction _default(mean, stdev) {\n  var mu,\n      sigma,\n      dist = {\n    mean: function (_) {\n      if (arguments.length) {\n        mu = _ || 0;\n        return dist;\n      } else {\n        return mu;\n      }\n    },\n    stdev: function (_) {\n      if (arguments.length) {\n        sigma = _ == null ? 1 : _;\n        return dist;\n      } else {\n        return sigma;\n      }\n    },\n    sample: () => sampleNormal(mu, sigma),\n    pdf: value => densityNormal(value, mu, sigma),\n    cdf: value => cumulativeNormal(value, mu, sigma),\n    icdf: p => quantileNormal(p, mu, sigma)\n  };\n  return dist.mean(mean).stdev(stdev);\n}\n},{\"./constants\":\"oXNO\",\"./random\":\"iLAe\"}],\"VRjq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _bandwidth = _interopRequireDefault(require(\"./bandwidth\"));\n\nvar _normal = _interopRequireDefault(require(\"./normal\"));\n\nvar _random = require(\"./random\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// TODO: support for additional kernels?\nfunction _default(support, bandwidth) {\n  var kernel = (0, _normal.default)(),\n      dist = {},\n      n = 0;\n\n  dist.data = function (_) {\n    if (arguments.length) {\n      support = _;\n      n = _ ? _.length : 0;\n      return dist.bandwidth(bandwidth);\n    } else {\n      return support;\n    }\n  };\n\n  dist.bandwidth = function (_) {\n    if (!arguments.length) return bandwidth;\n    bandwidth = _;\n    if (!bandwidth && support) bandwidth = (0, _bandwidth.default)(support);\n    return dist;\n  };\n\n  dist.sample = function () {\n    return support[~~((0, _random.random)() * n)] + bandwidth * kernel.sample();\n  };\n\n  dist.pdf = function (x) {\n    for (var y = 0, i = 0; i < n; ++i) {\n      y += kernel.pdf((x - support[i]) / bandwidth);\n    }\n\n    return y / bandwidth / n;\n  };\n\n  dist.cdf = function (x) {\n    for (var y = 0, i = 0; i < n; ++i) {\n      y += kernel.cdf((x - support[i]) / bandwidth);\n    }\n\n    return y / n;\n  };\n\n  dist.icdf = function () {\n    throw Error('KDE icdf not supported.');\n  };\n\n  return dist.data(support);\n}\n},{\"./bandwidth\":\"F4yd\",\"./normal\":\"eSVR\",\"./random\":\"iLAe\"}],\"j6BT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sampleLogNormal = sampleLogNormal;\nexports.densityLogNormal = densityLogNormal;\nexports.cumulativeLogNormal = cumulativeLogNormal;\nexports.quantileLogNormal = quantileLogNormal;\nexports.default = _default;\n\nvar _normal = require(\"./normal\");\n\nvar _constants = require(\"./constants\");\n\nfunction sampleLogNormal(mean, stdev) {\n  mean = mean || 0;\n  stdev = stdev == null ? 1 : stdev;\n  return Math.exp(mean + (0, _normal.sampleNormal)() * stdev);\n}\n\nfunction densityLogNormal(value, mean, stdev) {\n  if (value <= 0) return 0;\n  mean = mean || 0;\n  stdev = stdev == null ? 1 : stdev;\n  const z = (Math.log(value) - mean) / stdev;\n  return Math.exp(-0.5 * z * z) / (stdev * _constants.SQRT2PI * value);\n}\n\nfunction cumulativeLogNormal(value, mean, stdev) {\n  return (0, _normal.cumulativeNormal)(Math.log(value), mean, stdev);\n}\n\nfunction quantileLogNormal(p, mean, stdev) {\n  return Math.exp((0, _normal.quantileNormal)(p, mean, stdev));\n}\n\nfunction _default(mean, stdev) {\n  var mu,\n      sigma,\n      dist = {\n    mean: function (_) {\n      if (arguments.length) {\n        mu = _ || 0;\n        return dist;\n      } else {\n        return mu;\n      }\n    },\n    stdev: function (_) {\n      if (arguments.length) {\n        sigma = _ == null ? 1 : _;\n        return dist;\n      } else {\n        return sigma;\n      }\n    },\n    sample: () => sampleLogNormal(mu, sigma),\n    pdf: value => densityLogNormal(value, mu, sigma),\n    cdf: value => cumulativeLogNormal(value, mu, sigma),\n    icdf: p => quantileLogNormal(p, mu, sigma)\n  };\n  return dist.mean(mean).stdev(stdev);\n}\n},{\"./normal\":\"eSVR\",\"./constants\":\"oXNO\"}],\"MgBP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _random = require(\"./random\");\n\nfunction _default(dists, weights) {\n  var dist = {},\n      m = 0,\n      w;\n\n  function normalize(x) {\n    var w = [],\n        sum = 0,\n        i;\n\n    for (i = 0; i < m; ++i) {\n      sum += w[i] = x[i] == null ? 1 : +x[i];\n    }\n\n    for (i = 0; i < m; ++i) {\n      w[i] /= sum;\n    }\n\n    return w;\n  }\n\n  dist.weights = function (_) {\n    if (arguments.length) {\n      w = normalize(weights = _ || []);\n      return dist;\n    }\n\n    return weights;\n  };\n\n  dist.distributions = function (_) {\n    if (arguments.length) {\n      if (_) {\n        m = _.length;\n        dists = _;\n      } else {\n        m = 0;\n        dists = [];\n      }\n\n      return dist.weights(weights);\n    }\n\n    return dists;\n  };\n\n  dist.sample = function () {\n    var r = (0, _random.random)(),\n        d = dists[m - 1],\n        v = w[0],\n        i = 0; // first select distribution\n\n    for (; i < m - 1; v += w[++i]) {\n      if (r < v) {\n        d = dists[i];\n        break;\n      }\n    } // then sample from it\n\n\n    return d.sample();\n  };\n\n  dist.pdf = function (x) {\n    for (var p = 0, i = 0; i < m; ++i) {\n      p += w[i] * dists[i].pdf(x);\n    }\n\n    return p;\n  };\n\n  dist.cdf = function (x) {\n    for (var p = 0, i = 0; i < m; ++i) {\n      p += w[i] * dists[i].cdf(x);\n    }\n\n    return p;\n  };\n\n  dist.icdf = function () {\n    throw Error('Mixture icdf not supported.');\n  };\n\n  return dist.distributions(dists).weights(weights);\n}\n},{\"./random\":\"iLAe\"}],\"bSQS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sampleUniform = sampleUniform;\nexports.densityUniform = densityUniform;\nexports.cumulativeUniform = cumulativeUniform;\nexports.quantileUniform = quantileUniform;\nexports.default = _default;\n\nvar _random = require(\"./random\");\n\nfunction sampleUniform(min, max) {\n  if (max == null) {\n    max = min == null ? 1 : min;\n    min = 0;\n  }\n\n  return min + (max - min) * (0, _random.random)();\n}\n\nfunction densityUniform(value, min, max) {\n  if (max == null) {\n    max = min == null ? 1 : min;\n    min = 0;\n  }\n\n  return value >= min && value <= max ? 1 / (max - min) : 0;\n}\n\nfunction cumulativeUniform(value, min, max) {\n  if (max == null) {\n    max = min == null ? 1 : min;\n    min = 0;\n  }\n\n  return value < min ? 0 : value > max ? 1 : (value - min) / (max - min);\n}\n\nfunction quantileUniform(p, min, max) {\n  if (max == null) {\n    max = min == null ? 1 : min;\n    min = 0;\n  }\n\n  return p >= 0 && p <= 1 ? min + p * (max - min) : NaN;\n}\n\nfunction _default(min, max) {\n  var a,\n      b,\n      dist = {\n    min: function (_) {\n      if (arguments.length) {\n        a = _ || 0;\n        return dist;\n      } else {\n        return a;\n      }\n    },\n    max: function (_) {\n      if (arguments.length) {\n        b = _ == null ? 1 : _;\n        return dist;\n      } else {\n        return b;\n      }\n    },\n    sample: () => sampleUniform(a, b),\n    pdf: value => densityUniform(value, a, b),\n    cdf: value => cumulativeUniform(value, a, b),\n    icdf: p => quantileUniform(p, a, b)\n  };\n\n  if (max == null) {\n    max = min == null ? 1 : min;\n    min = 0;\n  }\n\n  return dist.min(min).max(max);\n}\n},{\"./random\":\"iLAe\"}],\"Vjsr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Ordinary Least Squares\nfunction _default(uX, uY, uXY, uX2) {\n  const delta = uX2 - uX * uX,\n        slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta,\n        intercept = uY - slope * uX;\n  return [intercept, slope];\n}\n},{}],\"YY18\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.points = points;\nexports.visitPoints = visitPoints;\n\nfunction points(data, x, y, sort) {\n  data = data.filter(d => {\n    let u = x(d),\n        v = y(d);\n    return u != null && (u = +u) >= u && v != null && (v = +v) >= v;\n  });\n\n  if (sort) {\n    data.sort((a, b) => x(a) - x(b));\n  }\n\n  const X = new Float64Array(data.length),\n        Y = new Float64Array(data.length);\n  let i = 0;\n\n  for (let d of data) {\n    X[i] = x(d);\n    Y[i] = y(d);\n    ++i;\n  }\n\n  return [X, Y];\n}\n\nfunction visitPoints(data, x, y, callback) {\n  let index = -1,\n      i = -1,\n      u,\n      v;\n\n  for (let d of data) {\n    u = x(d, ++index, data);\n    v = y(d, index, data);\n\n    if (u != null && (u = +u) >= u && v != null && (v = +v) >= v) {\n      callback(u, v, ++i);\n    }\n  }\n}\n},{}],\"UhPG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _points = require(\"./points\");\n\n// Adapted from d3-regression by Harry Stevens\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction _default(data, x, y, uY, predict) {\n  let SSE = 0,\n      SST = 0;\n  (0, _points.visitPoints)(data, x, y, (dx, dy) => {\n    const sse = dy - predict(dx),\n          sst = dy - uY;\n    SSE += sse * sse;\n    SST += sst * sst;\n  });\n  return 1 - SSE / SST;\n}\n},{\"./points\":\"YY18\"}],\"EyC1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ols = _interopRequireDefault(require(\"./ols\"));\n\nvar _points = require(\"./points\");\n\nvar _rSquared = _interopRequireDefault(require(\"./r-squared\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Adapted from d3-regression by Harry Stevens\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction _default(data, x, y) {\n  let X = 0,\n      Y = 0,\n      XY = 0,\n      X2 = 0,\n      n = 0;\n  (0, _points.visitPoints)(data, x, y, (dx, dy) => {\n    X += dx;\n    Y += dy;\n    XY += dx * dy;\n    X2 += dx * dx;\n    ++n;\n  });\n\n  const coef = (0, _ols.default)(X / n, Y / n, XY / n, X2 / n),\n        predict = x => coef[0] + coef[1] * x;\n\n  return {\n    coef: coef,\n    predict: predict,\n    rSquared: (0, _rSquared.default)(data, x, y, Y / n, predict)\n  };\n}\n},{\"./ols\":\"Vjsr\",\"./points\":\"YY18\",\"./r-squared\":\"UhPG\"}],\"EMAj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ols = _interopRequireDefault(require(\"./ols\"));\n\nvar _points = require(\"./points\");\n\nvar _rSquared = _interopRequireDefault(require(\"./r-squared\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Adapted from d3-regression by Harry Stevens\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction _default(data, x, y) {\n  let X = 0,\n      Y = 0,\n      XY = 0,\n      X2 = 0,\n      n = 0;\n  (0, _points.visitPoints)(data, x, y, (dx, dy) => {\n    dx = Math.log(dx);\n    X += dx;\n    Y += dy;\n    XY += dx * dy;\n    X2 += dx * dx;\n    ++n;\n  });\n\n  const coef = (0, _ols.default)(X / n, Y / n, XY / n, X2 / n),\n        predict = x => coef[0] + coef[1] * Math.log(x);\n\n  return {\n    coef: coef,\n    predict: predict,\n    rSquared: (0, _rSquared.default)(data, x, y, Y / n, predict)\n  };\n}\n},{\"./ols\":\"Vjsr\",\"./points\":\"YY18\",\"./r-squared\":\"UhPG\"}],\"edzd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ols = _interopRequireDefault(require(\"./ols\"));\n\nvar _points = require(\"./points\");\n\nvar _rSquared = _interopRequireDefault(require(\"./r-squared\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(data, x, y) {\n  let Y = 0,\n      YL = 0,\n      XY = 0,\n      XYL = 0,\n      X2Y = 0,\n      n = 0;\n  (0, _points.visitPoints)(data, x, y, (dx, dy) => {\n    const ly = Math.log(dy),\n          xy = dx * dy;\n    Y += dy;\n    XY += xy;\n    X2Y += dx * xy;\n    YL += dy * ly;\n    XYL += xy * ly;\n    ++n;\n  });\n\n  const coef = (0, _ols.default)(XY / Y, YL / Y, XYL / Y, X2Y / Y),\n        predict = x => coef[0] * Math.exp(coef[1] * x);\n\n  coef[0] = Math.exp(coef[0]);\n  return {\n    coef: coef,\n    predict: predict,\n    rSquared: (0, _rSquared.default)(data, x, y, Y / n, predict)\n  };\n}\n},{\"./ols\":\"Vjsr\",\"./points\":\"YY18\",\"./r-squared\":\"UhPG\"}],\"Cyjw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ols = _interopRequireDefault(require(\"./ols\"));\n\nvar _points = require(\"./points\");\n\nvar _rSquared = _interopRequireDefault(require(\"./r-squared\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Adapted from d3-regression by Harry Stevens\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction _default(data, x, y) {\n  let X = 0,\n      Y = 0,\n      XY = 0,\n      X2 = 0,\n      YS = 0,\n      n = 0;\n  (0, _points.visitPoints)(data, x, y, (dx, dy) => {\n    const lx = Math.log(dx),\n          ly = Math.log(dy);\n    X += lx;\n    Y += ly;\n    XY += lx * ly;\n    X2 += lx * lx;\n    YS += dy;\n    ++n;\n  });\n\n  const coef = (0, _ols.default)(X / n, Y / n, XY / n, X2 / n),\n        predict = x => coef[0] * Math.pow(x, coef[1]);\n\n  coef[0] = Math.exp(coef[0]);\n  return {\n    coef: coef,\n    predict: predict,\n    rSquared: (0, _rSquared.default)(data, x, y, YS / n, predict)\n  };\n}\n},{\"./ols\":\"Vjsr\",\"./points\":\"YY18\",\"./r-squared\":\"UhPG\"}],\"sydl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _points = require(\"./points\");\n\nvar _rSquared = _interopRequireDefault(require(\"./r-squared\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(data, x, y) {\n  let X = 0,\n      Y = 0,\n      X2 = 0,\n      X3 = 0,\n      X4 = 0,\n      XY = 0,\n      X2Y = 0,\n      n = 0;\n  (0, _points.visitPoints)(data, x, y, (dx, dy) => {\n    const x2 = dx * dx;\n    X += dx;\n    Y += dy;\n    X2 += x2;\n    X3 += x2 * dx;\n    X4 += x2 * x2;\n    XY += dx * dy;\n    X2Y += x2 * dy;\n    ++n;\n  });\n  Y = Y / n;\n  XY = XY - X * Y;\n  X2Y = X2Y - X2 * Y;\n\n  const XX = X2 - X * X / n,\n        XX2 = X3 - X2 * X / n,\n        X2X2 = X4 - X2 * X2 / n,\n        d = XX * X2X2 - XX2 * XX2,\n        a = (X2Y * XX - XY * XX2) / d,\n        b = (XY * X2X2 - X2Y * XX2) / d,\n        c = Y - b * (X / n) - a * (X2 / n),\n        predict = x => a * x * x + b * x + c;\n\n  return {\n    coef: [c, b, a],\n    predict: predict,\n    rSquared: (0, _rSquared.default)(data, x, y, Y, predict)\n  };\n}\n},{\"./points\":\"YY18\",\"./r-squared\":\"UhPG\"}],\"iPG9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _linear = _interopRequireDefault(require(\"./linear\"));\n\nvar _points = require(\"./points\");\n\nvar _quad = _interopRequireDefault(require(\"./quad\"));\n\nvar _rSquared = _interopRequireDefault(require(\"./r-squared\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Adapted from d3-regression by Harry Stevens\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\n// ... which was adapted from regression-js by Tom Alexander\n// Source: https://github.com/Tom-Alexander/regression-js/blob/master/src/regression.js#L246\n// License: https://github.com/Tom-Alexander/regression-js/blob/master/LICENSE\nfunction _default(data, x, y, order) {\n  // use more efficient methods for lower orders\n  if (order === 1) return (0, _linear.default)(data, x, y);\n  if (order === 2) return (0, _quad.default)(data, x, y);\n  const [xv, yv] = (0, _points.points)(data, x, y),\n        n = xv.length,\n        lhs = [],\n        rhs = [],\n        k = order + 1;\n  let Y = 0,\n      i,\n      j,\n      l,\n      v,\n      c;\n\n  for (i = 0; i < n; ++i) {\n    Y += yv[i];\n  }\n\n  for (i = 0; i < k; ++i) {\n    for (l = 0, v = 0; l < n; ++l) {\n      v += Math.pow(xv[l], i) * yv[l];\n    }\n\n    lhs.push(v);\n    c = new Float64Array(k);\n\n    for (j = 0; j < k; ++j) {\n      for (l = 0, v = 0; l < n; ++l) {\n        v += Math.pow(xv[l], i + j);\n      }\n\n      c[j] = v;\n    }\n\n    rhs.push(c);\n  }\n\n  rhs.push(lhs);\n\n  const coef = gaussianElimination(rhs),\n        predict = x => {\n    let y = 0,\n        i = 0,\n        n = coef.length;\n\n    for (; i < n; ++i) y += coef[i] * Math.pow(x, i);\n\n    return y;\n  };\n\n  return {\n    coef: coef,\n    predict: predict,\n    rSquared: (0, _rSquared.default)(data, x, y, Y / n, predict)\n  };\n} // Given an array for a two-dimensional matrix and the polynomial order,\n// solve A * x = b using Gaussian elimination.\n\n\nfunction gaussianElimination(matrix) {\n  const n = matrix.length - 1,\n        coef = [];\n  let i, j, k, r, t;\n\n  for (i = 0; i < n; ++i) {\n    r = i; // max row\n\n    for (j = i + 1; j < n; ++j) {\n      if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) {\n        r = j;\n      }\n    }\n\n    for (k = i; k < n + 1; ++k) {\n      t = matrix[k][i];\n      matrix[k][i] = matrix[k][r];\n      matrix[k][r] = t;\n    }\n\n    for (j = i + 1; j < n; ++j) {\n      for (k = n; k >= i; k--) {\n        matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i];\n      }\n    }\n  }\n\n  for (j = n - 1; j >= 0; --j) {\n    t = 0;\n\n    for (k = j + 1; k < n; ++k) {\n      t += matrix[k][j] * coef[k];\n    }\n\n    coef[j] = (matrix[n][j] - t) / matrix[j][j];\n  }\n\n  return coef;\n}\n},{\"./linear\":\"EyC1\",\"./points\":\"YY18\",\"./quad\":\"sydl\",\"./r-squared\":\"UhPG\"}],\"GdHn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ols = _interopRequireDefault(require(\"./ols\"));\n\nvar _points = require(\"./points\");\n\nvar _d3Array = require(\"d3-array\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst maxiters = 2,\n      epsilon = 1e-12; // Adapted from science.js by Jason Davies\n// Source: https://github.com/jasondavies/science.js/blob/master/src/stats/loess.js\n// License: https://github.com/jasondavies/science.js/blob/master/LICENSE\n\nfunction _default(data, x, y, bandwidth) {\n  const [xv, yv] = (0, _points.points)(data, x, y, true),\n        n = xv.length,\n        bw = Math.max(2, ~~(bandwidth * n)),\n        // # nearest neighbors\n  yhat = new Float64Array(n),\n        residuals = new Float64Array(n),\n        robustWeights = new Float64Array(n).fill(1);\n\n  for (let iter = -1; ++iter <= maxiters;) {\n    const interval = [0, bw - 1];\n\n    for (let i = 0; i < n; ++i) {\n      const dx = xv[i],\n            i0 = interval[0],\n            i1 = interval[1],\n            edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;\n      let W = 0,\n          X = 0,\n          Y = 0,\n          XY = 0,\n          X2 = 0,\n          denom = 1 / Math.abs(xv[edge] - dx || 1); // avoid singularity!\n\n      for (let k = i0; k <= i1; ++k) {\n        const xk = xv[k],\n              yk = yv[k],\n              w = tricube(Math.abs(dx - xk) * denom) * robustWeights[k],\n              xkw = xk * w;\n        W += w;\n        X += xkw;\n        Y += yk * w;\n        XY += yk * xkw;\n        X2 += xk * xkw;\n      } // linear regression fit\n\n\n      const [a, b] = (0, _ols.default)(X / W, Y / W, XY / W, X2 / W);\n      yhat[i] = a + b * dx;\n      residuals[i] = Math.abs(yv[i] - yhat[i]);\n      updateInterval(xv, i + 1, interval);\n    }\n\n    if (iter === maxiters) {\n      break;\n    }\n\n    const medianResidual = (0, _d3Array.median)(residuals);\n    if (Math.abs(medianResidual) < epsilon) break;\n\n    for (let i = 0, arg, w; i < n; ++i) {\n      arg = residuals[i] / (6 * medianResidual); // default to epsilon (rather than zero) for large deviations\n      // keeping weights tiny but non-zero prevents singularites\n\n      robustWeights[i] = arg >= 1 ? epsilon : (w = 1 - arg * arg) * w;\n    }\n  }\n\n  return output(xv, yhat);\n} // weighting kernel for local regression\n\n\nfunction tricube(x) {\n  return (x = 1 - x * x * x) * x * x;\n} // advance sliding window interval of nearest neighbors\n\n\nfunction updateInterval(xv, i, interval) {\n  let val = xv[i],\n      left = interval[0],\n      right = interval[1] + 1;\n  if (right >= xv.length) return; // step right if distance to new right edge is <= distance to old left edge\n  // step when distance is equal to ensure movement over duplicate x values\n\n  while (i > left && xv[right] - val <= val - xv[left]) {\n    interval[0] = ++left;\n    interval[1] = right;\n    ++right;\n  }\n} // generate smoothed output points\n// average points with repeated x values\n\n\nfunction output(xv, yhat) {\n  const n = xv.length,\n        out = [];\n\n  for (let i = 0, cnt = 0, prev = [], v; i < n; ++i) {\n    v = xv[i];\n\n    if (prev[0] === v) {\n      // average output values via online update\n      prev[1] += (yhat[i] - prev[1]) / ++cnt;\n    } else {\n      // add new output point\n      cnt = 0;\n      prev = [v, yhat[i]];\n      out.push(prev);\n    }\n  }\n\n  return out;\n}\n},{\"./ols\":\"Vjsr\",\"./points\":\"YY18\",\"d3-array\":\"K0bd\"}],\"p1yX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n// subdivide up to accuracy of 0.1 degrees\nconst MIN_RADIANS = 0.1 * Math.PI / 180; // Adaptively sample an interpolated function over a domain extent\n\nfunction _default(f, extent, minSteps, maxSteps) {\n  minSteps = minSteps || 25;\n  maxSteps = Math.max(minSteps, maxSteps || 200);\n\n  const point = x => [x, f(x)],\n        minX = extent[0],\n        maxX = extent[1],\n        span = maxX - minX,\n        stop = span / maxSteps,\n        prev = [point(minX)],\n        next = [];\n\n  if (minSteps === maxSteps) {\n    // no adaptation, sample uniform grid directly and return\n    for (let i = 1; i < maxSteps; ++i) {\n      prev.push(point(minX + i / minSteps * span));\n    }\n\n    prev.push(point(maxX));\n    return prev;\n  } else {\n    // sample minimum points on uniform grid\n    // then move on to perform adaptive refinement\n    next.push(point(maxX));\n\n    for (let i = minSteps; --i > 0;) {\n      next.push(point(minX + i / minSteps * span));\n    }\n  }\n\n  let p0 = prev[0],\n      p1 = next[next.length - 1];\n\n  while (p1) {\n    // midpoint for potential curve subdivision\n    const pm = point((p0[0] + p1[0]) / 2);\n\n    if (pm[0] - p0[0] >= stop && angleDelta(p0, pm, p1) > MIN_RADIANS) {\n      // maximum resolution has not yet been met, and\n      // subdivision midpoint sufficiently different from endpoint\n      // save subdivision, push midpoint onto the visitation stack\n      next.push(pm);\n    } else {\n      // subdivision midpoint sufficiently similar to endpoint\n      // skip subdivision, store endpoint, move to next point on the stack\n      p0 = p1;\n      prev.push(p1);\n      next.pop();\n    }\n\n    p1 = next[next.length - 1];\n  }\n\n  return prev;\n}\n\nfunction angleDelta(p, q, r) {\n  const a0 = Math.atan2(r[1] - p[1], r[0] - p[0]),\n        a1 = Math.atan2(q[1] - p[1], q[0] - p[0]);\n  return Math.abs(a0 - a1);\n}\n},{}],\"Cvi0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"bandwidthNRD\", {\n  enumerable: true,\n  get: function () {\n    return _bandwidth.default;\n  }\n});\nObject.defineProperty(exports, \"bin\", {\n  enumerable: true,\n  get: function () {\n    return _bin.default;\n  }\n});\nObject.defineProperty(exports, \"bootstrapCI\", {\n  enumerable: true,\n  get: function () {\n    return _bootstrapCI.default;\n  }\n});\nObject.defineProperty(exports, \"dotbin\", {\n  enumerable: true,\n  get: function () {\n    return _dotbin.default;\n  }\n});\nObject.defineProperty(exports, \"quantiles\", {\n  enumerable: true,\n  get: function () {\n    return _quantiles.default;\n  }\n});\nObject.defineProperty(exports, \"quartiles\", {\n  enumerable: true,\n  get: function () {\n    return _quartiles.default;\n  }\n});\nObject.defineProperty(exports, \"random\", {\n  enumerable: true,\n  get: function () {\n    return _random.random;\n  }\n});\nObject.defineProperty(exports, \"setRandom\", {\n  enumerable: true,\n  get: function () {\n    return _random.setRandom;\n  }\n});\nObject.defineProperty(exports, \"randomLCG\", {\n  enumerable: true,\n  get: function () {\n    return _lcg.default;\n  }\n});\nObject.defineProperty(exports, \"randomInteger\", {\n  enumerable: true,\n  get: function () {\n    return _integer.default;\n  }\n});\nObject.defineProperty(exports, \"randomKDE\", {\n  enumerable: true,\n  get: function () {\n    return _kde.default;\n  }\n});\nObject.defineProperty(exports, \"randomLogNormal\", {\n  enumerable: true,\n  get: function () {\n    return _lognormal.default;\n  }\n});\nObject.defineProperty(exports, \"sampleLogNormal\", {\n  enumerable: true,\n  get: function () {\n    return _lognormal.sampleLogNormal;\n  }\n});\nObject.defineProperty(exports, \"densityLogNormal\", {\n  enumerable: true,\n  get: function () {\n    return _lognormal.densityLogNormal;\n  }\n});\nObject.defineProperty(exports, \"cumulativeLogNormal\", {\n  enumerable: true,\n  get: function () {\n    return _lognormal.cumulativeLogNormal;\n  }\n});\nObject.defineProperty(exports, \"quantileLogNormal\", {\n  enumerable: true,\n  get: function () {\n    return _lognormal.quantileLogNormal;\n  }\n});\nObject.defineProperty(exports, \"randomMixture\", {\n  enumerable: true,\n  get: function () {\n    return _mixture.default;\n  }\n});\nObject.defineProperty(exports, \"randomNormal\", {\n  enumerable: true,\n  get: function () {\n    return _normal.default;\n  }\n});\nObject.defineProperty(exports, \"sampleNormal\", {\n  enumerable: true,\n  get: function () {\n    return _normal.sampleNormal;\n  }\n});\nObject.defineProperty(exports, \"densityNormal\", {\n  enumerable: true,\n  get: function () {\n    return _normal.densityNormal;\n  }\n});\nObject.defineProperty(exports, \"cumulativeNormal\", {\n  enumerable: true,\n  get: function () {\n    return _normal.cumulativeNormal;\n  }\n});\nObject.defineProperty(exports, \"quantileNormal\", {\n  enumerable: true,\n  get: function () {\n    return _normal.quantileNormal;\n  }\n});\nObject.defineProperty(exports, \"randomUniform\", {\n  enumerable: true,\n  get: function () {\n    return _uniform.default;\n  }\n});\nObject.defineProperty(exports, \"sampleUniform\", {\n  enumerable: true,\n  get: function () {\n    return _uniform.sampleUniform;\n  }\n});\nObject.defineProperty(exports, \"densityUniform\", {\n  enumerable: true,\n  get: function () {\n    return _uniform.densityUniform;\n  }\n});\nObject.defineProperty(exports, \"cumulativeUniform\", {\n  enumerable: true,\n  get: function () {\n    return _uniform.cumulativeUniform;\n  }\n});\nObject.defineProperty(exports, \"quantileUniform\", {\n  enumerable: true,\n  get: function () {\n    return _uniform.quantileUniform;\n  }\n});\nObject.defineProperty(exports, \"regressionLinear\", {\n  enumerable: true,\n  get: function () {\n    return _linear.default;\n  }\n});\nObject.defineProperty(exports, \"regressionLog\", {\n  enumerable: true,\n  get: function () {\n    return _log.default;\n  }\n});\nObject.defineProperty(exports, \"regressionExp\", {\n  enumerable: true,\n  get: function () {\n    return _exp.default;\n  }\n});\nObject.defineProperty(exports, \"regressionPow\", {\n  enumerable: true,\n  get: function () {\n    return _pow.default;\n  }\n});\nObject.defineProperty(exports, \"regressionQuad\", {\n  enumerable: true,\n  get: function () {\n    return _quad.default;\n  }\n});\nObject.defineProperty(exports, \"regressionPoly\", {\n  enumerable: true,\n  get: function () {\n    return _poly.default;\n  }\n});\nObject.defineProperty(exports, \"regressionLoess\", {\n  enumerable: true,\n  get: function () {\n    return _loess.default;\n  }\n});\nObject.defineProperty(exports, \"sampleCurve\", {\n  enumerable: true,\n  get: function () {\n    return _sampleCurve.default;\n  }\n});\n\nvar _bandwidth = _interopRequireDefault(require(\"./src/bandwidth\"));\n\nvar _bin = _interopRequireDefault(require(\"./src/bin\"));\n\nvar _bootstrapCI = _interopRequireDefault(require(\"./src/bootstrapCI\"));\n\nvar _dotbin = _interopRequireDefault(require(\"./src/dotbin\"));\n\nvar _quantiles = _interopRequireDefault(require(\"./src/quantiles\"));\n\nvar _quartiles = _interopRequireDefault(require(\"./src/quartiles\"));\n\nvar _random = require(\"./src/random\");\n\nvar _lcg = _interopRequireDefault(require(\"./src/lcg\"));\n\nvar _integer = _interopRequireDefault(require(\"./src/integer\"));\n\nvar _kde = _interopRequireDefault(require(\"./src/kde\"));\n\nvar _lognormal = _interopRequireWildcard(require(\"./src/lognormal\"));\n\nvar _mixture = _interopRequireDefault(require(\"./src/mixture\"));\n\nvar _normal = _interopRequireWildcard(require(\"./src/normal\"));\n\nvar _uniform = _interopRequireWildcard(require(\"./src/uniform\"));\n\nvar _linear = _interopRequireDefault(require(\"./src/regression/linear\"));\n\nvar _log = _interopRequireDefault(require(\"./src/regression/log\"));\n\nvar _exp = _interopRequireDefault(require(\"./src/regression/exp\"));\n\nvar _pow = _interopRequireDefault(require(\"./src/regression/pow\"));\n\nvar _quad = _interopRequireDefault(require(\"./src/regression/quad\"));\n\nvar _poly = _interopRequireDefault(require(\"./src/regression/poly\"));\n\nvar _loess = _interopRequireDefault(require(\"./src/regression/loess\"));\n\nvar _sampleCurve = _interopRequireDefault(require(\"./src/sampleCurve\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/bandwidth\":\"F4yd\",\"./src/bin\":\"DV8S\",\"./src/bootstrapCI\":\"Rspz\",\"./src/dotbin\":\"ul5j\",\"./src/quantiles\":\"PSiw\",\"./src/quartiles\":\"iRfw\",\"./src/random\":\"iLAe\",\"./src/lcg\":\"rIKu\",\"./src/integer\":\"ynIt\",\"./src/kde\":\"VRjq\",\"./src/lognormal\":\"j6BT\",\"./src/mixture\":\"MgBP\",\"./src/normal\":\"eSVR\",\"./src/uniform\":\"bSQS\",\"./src/regression/linear\":\"EyC1\",\"./src/regression/log\":\"EMAj\",\"./src/regression/exp\":\"edzd\",\"./src/regression/pow\":\"Cyjw\",\"./src/regression/quad\":\"sydl\",\"./src/regression/poly\":\"iPG9\",\"./src/regression/loess\":\"GdHn\",\"./src/sampleCurve\":\"p1yX\"}],\"vdlC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = TupleStore;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction TupleStore(key) {\n  this._key = key ? (0, _vegaUtil.field)(key) : _vegaDataflow.tupleid;\n  this.reset();\n}\n\nvar prototype = TupleStore.prototype;\n\nprototype.reset = function () {\n  this._add = [];\n  this._rem = [];\n  this._ext = null;\n  this._get = null;\n  this._q = null;\n};\n\nprototype.add = function (v) {\n  this._add.push(v);\n};\n\nprototype.rem = function (v) {\n  this._rem.push(v);\n};\n\nprototype.values = function () {\n  this._get = null;\n  if (this._rem.length === 0) return this._add;\n  var a = this._add,\n      r = this._rem,\n      k = this._key,\n      n = a.length,\n      m = r.length,\n      x = Array(n - m),\n      map = {},\n      i,\n      j,\n      v; // use unique key field to clear removed values\n\n  for (i = 0; i < m; ++i) {\n    map[k(r[i])] = 1;\n  }\n\n  for (i = 0, j = 0; i < n; ++i) {\n    if (map[k(v = a[i])]) {\n      map[k(v)] = 0;\n    } else {\n      x[j++] = v;\n    }\n  }\n\n  this._rem = [];\n  return this._add = x;\n}; // memoizing statistics methods\n\n\nprototype.distinct = function (get) {\n  var v = this.values(),\n      n = v.length,\n      map = {},\n      count = 0,\n      s;\n\n  while (--n >= 0) {\n    s = get(v[n]) + '';\n\n    if (!(0, _vegaUtil.hasOwnProperty)(map, s)) {\n      map[s] = 1;\n      ++count;\n    }\n  }\n\n  return count;\n};\n\nprototype.extent = function (get) {\n  if (this._get !== get || !this._ext) {\n    var v = this.values(),\n        i = (0, _vegaUtil.extentIndex)(v, get);\n    this._ext = [v[i[0]], v[i[1]]];\n    this._get = get;\n  }\n\n  return this._ext;\n};\n\nprototype.argmin = function (get) {\n  return this.extent(get)[0] || {};\n};\n\nprototype.argmax = function (get) {\n  return this.extent(get)[1] || {};\n};\n\nprototype.min = function (get) {\n  var m = this.extent(get)[0];\n  return m != null ? get(m) : undefined;\n};\n\nprototype.max = function (get) {\n  var m = this.extent(get)[1];\n  return m != null ? get(m) : undefined;\n};\n\nprototype.quartile = function (get) {\n  if (this._get !== get || !this._q) {\n    this._q = (0, _vegaStatistics.quartiles)(this.values(), get);\n    this._get = get;\n  }\n\n  return this._q;\n};\n\nprototype.q1 = function (get) {\n  return this.quartile(get)[0];\n};\n\nprototype.q2 = function (get) {\n  return this.quartile(get)[1];\n};\n\nprototype.q3 = function (get) {\n  return this.quartile(get)[2];\n};\n\nprototype.ci = function (get) {\n  if (this._get !== get || !this._ci) {\n    this._ci = (0, _vegaStatistics.bootstrapCI)(this.values(), 1000, 0.05, get);\n    this._get = get;\n  }\n\n  return this._ci;\n};\n\nprototype.ci0 = function (get) {\n  return this.ci(get)[0];\n};\n\nprototype.ci1 = function (get) {\n  return this.ci(get)[1];\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\"}],\"aUqN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Aggregate;\n\nvar _AggregateKeys = require(\"./util/AggregateKeys\");\n\nvar _AggregateOps = require(\"./util/AggregateOps\");\n\nvar _TupleStore = _interopRequireDefault(require(\"./util/TupleStore\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Group-by aggregation operator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {Array<function(object): *>} [params.fields] - An array of accessors to aggregate.\n * @param {Array<string>} [params.ops] - An array of strings indicating aggregation operations.\n * @param {Array<string>} [params.as] - An array of output field names for aggregated values.\n * @param {boolean} [params.cross=false] - A flag indicating that the full\n *   cross-product of groupby values should be generated, including empty cells.\n *   If true, the drop parameter is ignored and empty cells are retained.\n * @param {boolean} [params.drop=true] - A flag indicating if empty cells should be removed.\n */\nfunction Aggregate(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n\n  this._adds = []; // array of added output tuples\n\n  this._mods = []; // array of modified output tuples\n\n  this._alen = 0; // number of active added tuples\n\n  this._mlen = 0; // number of active modified tuples\n\n  this._drop = true; // should empty aggregation cells be removed\n\n  this._cross = false; // produce full cross-product of group-by values\n\n  this._dims = []; // group-by dimension accessors\n\n  this._dnames = []; // group-by dimension names\n\n  this._measures = []; // collection of aggregation monoids\n\n  this._countOnly = false; // flag indicating only count aggregation\n\n  this._counts = null; // collection of count fields\n\n  this._prev = null; // previous aggregation cells\n\n  this._inputs = null; // array of dependent input tuple field names\n\n  this._outputs = null; // array of output tuple field names\n}\n\nAggregate.Definition = {\n  \"type\": \"Aggregate\",\n  \"metadata\": {\n    \"generates\": true,\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"ops\",\n    \"type\": \"enum\",\n    \"array\": true,\n    \"values\": _AggregateOps.ValidAggregateOps\n  }, {\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"null\": true,\n    \"array\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"null\": true,\n    \"array\": true\n  }, {\n    \"name\": \"drop\",\n    \"type\": \"boolean\",\n    \"default\": true\n  }, {\n    \"name\": \"cross\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"key\",\n    \"type\": \"field\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Aggregate, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var aggr = this,\n      out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      mod = _.modified();\n\n  aggr.stamp = out.stamp;\n\n  if (aggr.value && (mod || pulse.modified(aggr._inputs, true))) {\n    aggr._prev = aggr.value;\n    aggr.value = mod ? aggr.init(_) : {};\n    pulse.visit(pulse.SOURCE, t => aggr.add(t));\n  } else {\n    aggr.value = aggr.value || aggr.init(_);\n    pulse.visit(pulse.REM, t => aggr.rem(t));\n    pulse.visit(pulse.ADD, t => aggr.add(t));\n  } // Indicate output fields and return aggregate tuples.\n\n\n  out.modifies(aggr._outputs); // Should empty cells be dropped?\n\n  aggr._drop = _.drop !== false; // If domain cross-product requested, generate empty cells as needed\n  // and ensure that empty cells are not dropped\n\n  if (_.cross && aggr._dims.length > 1) {\n    aggr._drop = false;\n    aggr.cross();\n  }\n\n  return aggr.changes(out);\n};\n\nprototype.cross = function () {\n  var aggr = this,\n      curr = aggr.value,\n      dims = aggr._dnames,\n      vals = dims.map(function () {\n    return {};\n  }),\n      n = dims.length; // collect all group-by domain values\n\n  function collect(cells) {\n    var key, i, t, v;\n\n    for (key in cells) {\n      t = cells[key].tuple;\n\n      for (i = 0; i < n; ++i) {\n        vals[i][v = t[dims[i]]] = v;\n      }\n    }\n  }\n\n  collect(aggr._prev);\n  collect(curr); // iterate over key cross-product, create cells as needed\n\n  function generate(base, tuple, index) {\n    var name = dims[index],\n        v = vals[index++],\n        k,\n        key;\n\n    for (k in v) {\n      tuple[name] = v[k];\n      key = base ? base + '|' + k : k;\n      if (index < n) generate(key, tuple, index);else if (!curr[key]) aggr.cell(key, tuple);\n    }\n  }\n\n  generate('', {}, 0);\n};\n\nprototype.init = function (_) {\n  // initialize input and output fields\n  var inputs = this._inputs = [],\n      outputs = this._outputs = [],\n      inputMap = {};\n\n  function inputVisit(get) {\n    var fields = (0, _vegaUtil.array)((0, _vegaUtil.accessorFields)(get)),\n        i = 0,\n        n = fields.length,\n        f;\n\n    for (; i < n; ++i) {\n      if (!inputMap[f = fields[i]]) {\n        inputMap[f] = 1;\n        inputs.push(f);\n      }\n    }\n  } // initialize group-by dimensions\n\n\n  this._dims = (0, _vegaUtil.array)(_.groupby);\n  this._dnames = this._dims.map(function (d) {\n    var dname = (0, _vegaUtil.accessorName)(d);\n    inputVisit(d);\n    outputs.push(dname);\n    return dname;\n  });\n  this.cellkey = _.key ? _.key : (0, _AggregateKeys.groupkey)(this._dims); // initialize aggregate measures\n\n  this._countOnly = true;\n  this._counts = [];\n  this._measures = [];\n  var fields = _.fields || [null],\n      ops = _.ops || ['count'],\n      as = _.as || [],\n      n = fields.length,\n      map = {},\n      field,\n      op,\n      m,\n      mname,\n      outname,\n      i;\n\n  if (n !== ops.length) {\n    (0, _vegaUtil.error)('Unmatched number of fields and aggregate ops.');\n  }\n\n  for (i = 0; i < n; ++i) {\n    field = fields[i];\n    op = ops[i];\n\n    if (field == null && op !== 'count') {\n      (0, _vegaUtil.error)('Null aggregate field specified.');\n    }\n\n    mname = (0, _vegaUtil.accessorName)(field);\n    outname = (0, _AggregateOps.measureName)(op, mname, as[i]);\n    outputs.push(outname);\n\n    if (op === 'count') {\n      this._counts.push(outname);\n\n      continue;\n    }\n\n    m = map[mname];\n\n    if (!m) {\n      inputVisit(field);\n      m = map[mname] = [];\n      m.field = field;\n\n      this._measures.push(m);\n    }\n\n    if (op !== 'count') this._countOnly = false;\n    m.push((0, _AggregateOps.createMeasure)(op, outname));\n  }\n\n  this._measures = this._measures.map(function (m) {\n    return (0, _AggregateOps.compileMeasures)(m, m.field);\n  });\n  return {}; // aggregation cells (this.value)\n}; // -- Cell Management -----\n\n\nprototype.cellkey = (0, _AggregateKeys.groupkey)();\n\nprototype.cell = function (key, t) {\n  var cell = this.value[key];\n\n  if (!cell) {\n    cell = this.value[key] = this.newcell(key, t);\n    this._adds[this._alen++] = cell;\n  } else if (cell.num === 0 && this._drop && cell.stamp < this.stamp) {\n    cell.stamp = this.stamp;\n    this._adds[this._alen++] = cell;\n  } else if (cell.stamp < this.stamp) {\n    cell.stamp = this.stamp;\n    this._mods[this._mlen++] = cell;\n  }\n\n  return cell;\n};\n\nprototype.newcell = function (key, t) {\n  var cell = {\n    key: key,\n    num: 0,\n    agg: null,\n    tuple: this.newtuple(t, this._prev && this._prev[key]),\n    stamp: this.stamp,\n    store: false\n  };\n\n  if (!this._countOnly) {\n    var measures = this._measures,\n        n = measures.length,\n        i;\n    cell.agg = Array(n);\n\n    for (i = 0; i < n; ++i) {\n      cell.agg[i] = new measures[i](cell);\n    }\n  }\n\n  if (cell.store) {\n    cell.data = new _TupleStore.default();\n  }\n\n  return cell;\n};\n\nprototype.newtuple = function (t, p) {\n  var names = this._dnames,\n      dims = this._dims,\n      x = {},\n      i,\n      n;\n\n  for (i = 0, n = dims.length; i < n; ++i) {\n    x[names[i]] = dims[i](t);\n  }\n\n  return p ? (0, _vegaDataflow.replace)(p.tuple, x) : (0, _vegaDataflow.ingest)(x);\n}; // -- Process Tuples -----\n\n\nprototype.add = function (t) {\n  var key = this.cellkey(t),\n      cell = this.cell(key, t),\n      agg,\n      i,\n      n;\n  cell.num += 1;\n  if (this._countOnly) return;\n  if (cell.store) cell.data.add(t);\n  agg = cell.agg;\n\n  for (i = 0, n = agg.length; i < n; ++i) {\n    agg[i].add(agg[i].get(t), t);\n  }\n};\n\nprototype.rem = function (t) {\n  var key = this.cellkey(t),\n      cell = this.cell(key, t),\n      agg,\n      i,\n      n;\n  cell.num -= 1;\n  if (this._countOnly) return;\n  if (cell.store) cell.data.rem(t);\n  agg = cell.agg;\n\n  for (i = 0, n = agg.length; i < n; ++i) {\n    agg[i].rem(agg[i].get(t), t);\n  }\n};\n\nprototype.celltuple = function (cell) {\n  var tuple = cell.tuple,\n      counts = this._counts,\n      agg,\n      i,\n      n; // consolidate stored values\n\n  if (cell.store) {\n    cell.data.values();\n  } // update tuple properties\n\n\n  for (i = 0, n = counts.length; i < n; ++i) {\n    tuple[counts[i]] = cell.num;\n  }\n\n  if (!this._countOnly) {\n    agg = cell.agg;\n\n    for (i = 0, n = agg.length; i < n; ++i) {\n      agg[i].set(tuple);\n    }\n  }\n\n  return tuple;\n};\n\nprototype.changes = function (out) {\n  var adds = this._adds,\n      mods = this._mods,\n      prev = this._prev,\n      drop = this._drop,\n      add = out.add,\n      rem = out.rem,\n      mod = out.mod,\n      cell,\n      key,\n      i,\n      n;\n  if (prev) for (key in prev) {\n    cell = prev[key];\n    if (!drop || cell.num) rem.push(cell.tuple);\n  }\n\n  for (i = 0, n = this._alen; i < n; ++i) {\n    add.push(this.celltuple(adds[i]));\n    adds[i] = null; // for garbage collection\n  }\n\n  for (i = 0, n = this._mlen; i < n; ++i) {\n    cell = mods[i];\n    (cell.num === 0 && drop ? rem : mod).push(this.celltuple(cell));\n    mods[i] = null; // for garbage collection\n  }\n\n  this._alen = this._mlen = 0; // reset list of active cells\n\n  this._prev = null;\n  return out;\n};\n},{\"./util/AggregateKeys\":\"bY4j\",\"./util/AggregateOps\":\"Fivq\",\"./util/TupleStore\":\"vdlC\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"olTP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Bin;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n// epsilon bias to offset floating point error (#1737)\nconst EPSILON = 1e-14;\n/**\n * Generates a binning function for discretizing data.\n * @constructor\n * @param {object} params - The parameters for this operator. The\n *   provided values should be valid options for the {@link bin} function.\n * @param {function(object): *} params.field - The data field to bin.\n */\n\nfunction Bin(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nBin.Definition = {\n  \"type\": \"Bin\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"interval\",\n    \"type\": \"boolean\",\n    \"default\": true\n  }, {\n    \"name\": \"anchor\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"maxbins\",\n    \"type\": \"number\",\n    \"default\": 20\n  }, {\n    \"name\": \"base\",\n    \"type\": \"number\",\n    \"default\": 10\n  }, {\n    \"name\": \"divide\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"default\": [5, 2]\n  }, {\n    \"name\": \"extent\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2,\n    \"required\": true\n  }, {\n    \"name\": \"span\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"step\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"steps\",\n    \"type\": \"number\",\n    \"array\": true\n  }, {\n    \"name\": \"minstep\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"nice\",\n    \"type\": \"boolean\",\n    \"default\": true\n  }, {\n    \"name\": \"name\",\n    \"type\": \"string\"\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [\"bin0\", \"bin1\"]\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Bin, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var band = _.interval !== false,\n      bins = this._bins(_),\n      start = bins.start,\n      step = bins.step,\n      as = _.as || ['bin0', 'bin1'],\n      b0 = as[0],\n      b1 = as[1],\n      flag;\n\n  if (_.modified()) {\n    pulse = pulse.reflow(true);\n    flag = pulse.SOURCE;\n  } else {\n    flag = pulse.modified((0, _vegaUtil.accessorFields)(_.field)) ? pulse.ADD_MOD : pulse.ADD;\n  }\n\n  pulse.visit(flag, band ? function (t) {\n    var v = bins(t); // minimum bin value (inclusive)\n\n    t[b0] = v; // maximum bin value (exclusive)\n    // use convoluted math for better floating point agreement\n    // see https://github.com/vega/vega/issues/830\n\n    t[b1] = v == null ? null : start + step * (1 + (v - start) / step);\n  } : function (t) {\n    t[b0] = bins(t);\n  });\n  return pulse.modifies(band ? as : b0);\n};\n\nprototype._bins = function (_) {\n  if (this.value && !_.modified()) {\n    return this.value;\n  }\n\n  var field = _.field,\n      bins = (0, _vegaStatistics.bin)(_),\n      start = bins.start,\n      stop = bins.stop,\n      step = bins.step,\n      a,\n      d;\n\n  if ((a = _.anchor) != null) {\n    d = a - (start + step * Math.floor((a - start) / step));\n    start += d;\n    stop += d;\n  }\n\n  var f = function (t) {\n    var v = field(t);\n\n    if (v == null) {\n      return null;\n    } else {\n      v = Math.max(start, Math.min(+v, stop - step));\n      return start + step * Math.floor(EPSILON + (v - start) / step);\n    }\n  };\n\n  f.start = start;\n  f.stop = stop;\n  f.step = step;\n  return this.value = (0, _vegaUtil.accessor)(f, (0, _vegaUtil.accessorFields)(field), _.name || 'bin_' + (0, _vegaUtil.accessorName)(field));\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\"}],\"BJ5a\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(idFunc, source, input) {\n  var $ = idFunc,\n      data = source || [],\n      add = input || [],\n      rem = {},\n      cnt = 0;\n  return {\n    add: function (t) {\n      add.push(t);\n    },\n    remove: function (t) {\n      rem[$(t)] = ++cnt;\n    },\n    size: function () {\n      return data.length;\n    },\n    data: function (compare, resort) {\n      if (cnt) {\n        data = data.filter(function (t) {\n          return !rem[$(t)];\n        });\n        rem = {};\n        cnt = 0;\n      }\n\n      if (resort && compare) {\n        data.sort(compare);\n      }\n\n      if (add.length) {\n        data = compare ? (0, _vegaUtil.merge)(compare, data, add.sort(compare)) : data.concat(add);\n        add = [];\n      }\n\n      return data;\n    }\n  };\n}\n},{\"vega-util\":\"d61Z\"}],\"HIOI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Collect;\n\nvar _SortedList = _interopRequireDefault(require(\"./util/SortedList\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Collects all data tuples that pass through this operator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - An optional\n *   comparator function for additionally sorting the collected tuples.\n */\nfunction Collect(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n}\n\nCollect.Definition = {\n  \"type\": \"Collect\",\n  \"metadata\": {\n    \"source\": true\n  },\n  \"params\": [{\n    \"name\": \"sort\",\n    \"type\": \"compare\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Collect, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.ALL),\n      list = (0, _SortedList.default)(_vegaDataflow.tupleid, this.value, out.materialize(out.ADD).add),\n      sort = _.sort,\n      mod = pulse.changed() || sort && (_.modified('sort') || pulse.modified(sort.fields));\n  out.visit(out.REM, list.remove);\n  this.modified(mod);\n  this.value = out.source = list.data((0, _vegaDataflow.stableCompare)(sort), mod); // propagate tree root if defined\n\n  if (pulse.source && pulse.source.root) {\n    this.value.root = pulse.source.root;\n  }\n\n  return out;\n};\n},{\"./util/SortedList\":\"BJ5a\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"kbtQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Compare;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Generates a comparator function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<string|function>} params.fields - The fields to compare.\n * @param {Array<string>} [params.orders] - The sort orders.\n *   Each entry should be one of \"ascending\" (default) or \"descending\".\n */\nfunction Compare(params) {\n  _vegaDataflow.Operator.call(this, null, update, params);\n}\n\n(0, _vegaUtil.inherits)(Compare, _vegaDataflow.Operator);\n\nfunction update(_) {\n  return this.value && !_.modified() ? this.value : (0, _vegaUtil.compare)(_.fields, _.orders);\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"gpT4\":[function(require,module,exports) {\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = CountPattern;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Count regexp-defined pattern occurrences in a text field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - An accessor for the text field.\n * @param {string} [params.pattern] - RegExp string defining the text pattern.\n * @param {string} [params.case] - One of 'lower', 'upper' or null (mixed) case.\n * @param {string} [params.stopwords] - RegExp string of words to ignore.\n */\nfunction CountPattern(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nCountPattern.Definition = {\n  \"type\": \"CountPattern\",\n  \"metadata\": {\n    \"generates\": true,\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"case\",\n    \"type\": \"enum\",\n    \"values\": [\"upper\", \"lower\", \"mixed\"],\n    \"default\": \"mixed\"\n  }, {\n    \"name\": \"pattern\",\n    \"type\": \"string\",\n    \"default\": \"[\\\\w\\\"]+\"\n  }, {\n    \"name\": \"stopwords\",\n    \"type\": \"string\",\n    \"default\": \"\"\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [\"text\", \"count\"]\n  }]\n};\n\nfunction tokenize(text, tcase, match) {\n  switch (tcase) {\n    case 'upper':\n      text = text.toUpperCase();\n      break;\n\n    case 'lower':\n      text = text.toLowerCase();\n      break;\n  }\n\n  return text.match(match);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(CountPattern, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  function process(update) {\n    return function (tuple) {\n      var tokens = tokenize(get(tuple), _.case, match) || [],\n          t;\n\n      for (var i = 0, n = tokens.length; i < n; ++i) {\n        if (!stop.test(t = tokens[i])) update(t);\n      }\n    };\n  }\n\n  var init = this._parameterCheck(_, pulse),\n      counts = this._counts,\n      match = this._match,\n      stop = this._stop,\n      get = _.field,\n      as = _.as || ['text', 'count'],\n      add = process(function (t) {\n    counts[t] = 1 + (counts[t] || 0);\n  }),\n      rem = process(function (t) {\n    counts[t] -= 1;\n  });\n\n  if (init) {\n    pulse.visit(pulse.SOURCE, add);\n  } else {\n    pulse.visit(pulse.ADD, add);\n    pulse.visit(pulse.REM, rem);\n  }\n\n  return this._finish(pulse, as); // generate output tuples\n};\n\nprototype._parameterCheck = function (_, pulse) {\n  var init = false;\n\n  if (_.modified('stopwords') || !this._stop) {\n    this._stop = new RegExp('^' + (_.stopwords || '') + '$', 'i');\n    init = true;\n  }\n\n  if (_.modified('pattern') || !this._match) {\n    this._match = new RegExp(_.pattern || '[\\\\w\\']+', 'g');\n    init = true;\n  }\n\n  if (_.modified('field') || pulse.modified(_.field.fields)) {\n    init = true;\n  }\n\n  if (init) this._counts = {};\n  return init;\n};\n\nprototype._finish = function (pulse, as) {\n  var counts = this._counts,\n      tuples = this._tuples || (this._tuples = {}),\n      text = as[0],\n      count = as[1],\n      out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      w,\n      t,\n      c;\n\n  for (w in counts) {\n    t = tuples[w];\n    c = counts[w] || 0;\n\n    if (!t && c) {\n      tuples[w] = t = (0, _vegaDataflow.ingest)({});\n      t[text] = w;\n      t[count] = c;\n      out.add.push(t);\n    } else if (c === 0) {\n      if (t) out.rem.push(t);\n      counts[w] = null;\n      tuples[w] = null;\n    } else if (t[count] !== c) {\n      t[count] = c;\n      out.mod.push(t);\n    }\n  }\n\n  return out.modifies(as);\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"process\":\"FT5O\"}],\"pqh6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Cross;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Perform a cross-product of a tuple stream with itself.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object):boolean} [params.filter] - An optional filter\n *   function for selectively including tuples in the cross product.\n * @param {Array<string>} [params.as] - The names of the output fields.\n */\nfunction Cross(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nCross.Definition = {\n  \"type\": \"Cross\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"filter\",\n    \"type\": \"expr\"\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [\"a\", \"b\"]\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Cross, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE),\n      data = this.value,\n      as = _.as || ['a', 'b'],\n      a = as[0],\n      b = as[1],\n      reset = !data || pulse.changed(pulse.ADD_REM) || _.modified('as') || _.modified('filter');\n\n  if (reset) {\n    if (data) out.rem = data;\n    data = pulse.materialize(pulse.SOURCE).source;\n    out.add = this.value = cross(data, a, b, _.filter || _vegaUtil.truthy);\n  } else {\n    out.mod = data;\n  }\n\n  out.source = this.value;\n  return out.modifies(as);\n};\n\nfunction cross(input, a, b, filter) {\n  var data = [],\n      t = {},\n      n = input.length,\n      i = 0,\n      j,\n      left;\n\n  for (; i < n; ++i) {\n    t[a] = left = input[i];\n\n    for (j = 0; j < n; ++j) {\n      t[b] = input[j];\n\n      if (filter(t)) {\n        data.push((0, _vegaDataflow.ingest)(t));\n        t = {};\n        t[a] = left;\n      }\n    }\n  }\n\n  return data;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"rT3K\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parse;\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar Distributions = {\n  kde: _vegaStatistics.randomKDE,\n  mixture: _vegaStatistics.randomMixture,\n  normal: _vegaStatistics.randomNormal,\n  lognormal: _vegaStatistics.randomLogNormal,\n  uniform: _vegaStatistics.randomUniform\n};\nvar DISTRIBUTIONS = 'distributions',\n    FUNCTION = 'function',\n    FIELD = 'field';\n/**\n * Parse a parameter object for a probability distribution.\n * @param {object} def - The distribution parameter object.\n * @param {function():Array<object>} - A method for requesting\n *   source data. Used for distributions (such as KDE) that\n *   require sample data points. This method will only be\n *   invoked if the 'from' parameter for a target data source\n *   is not provided. Typically this method returns backing\n *   source data for a Pulse object.\n * @return {object} - The output distribution object.\n */\n\nfunction parse(def, data) {\n  var func = def[FUNCTION];\n\n  if (!(0, _vegaUtil.hasOwnProperty)(Distributions, func)) {\n    (0, _vegaUtil.error)('Unknown distribution function: ' + func);\n  }\n\n  var d = Distributions[func]();\n\n  for (var name in def) {\n    // if data field, extract values\n    if (name === FIELD) {\n      d.data((def.from || data()).map(def[name]));\n    } // if distribution mixture, recurse to parse each definition\n    else if (name === DISTRIBUTIONS) {\n        d[name](def[name].map(function (_) {\n          return parse(_, data);\n        }));\n      } // otherwise, simply set the parameter\n      else if (typeof d[name] === FUNCTION) {\n          d[name](def[name]);\n        }\n  }\n\n  return d;\n}\n},{\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\"}],\"D2sj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Density;\n\nvar _Distributions = _interopRequireDefault(require(\"./util/Distributions\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Grid sample points for a probability density. Given a distribution and\n * a sampling extent, will generate points suitable for plotting either\n * PDF (probability density function) or CDF (cumulative distribution\n * function) curves.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.distribution - The probability distribution. This\n *   is an object parameter dependent on the distribution type.\n * @param {string} [params.method='pdf'] - The distribution method to sample.\n *   One of 'pdf' or 'cdf'.\n * @param {Array<number>} [params.extent] - The [min, max] extent over which\n *   to sample the distribution. This argument is required in most cases, but\n *   can be omitted if the distribution (e.g., 'kde') supports a 'data' method\n *   that returns numerical sample points from which the extent can be deduced.\n * @param {number} [params.minsteps=25] - The minimum number of curve samples\n *   for plotting the density.\n * @param {number} [params.maxsteps=200] - The maximum number of curve samples\n *   for plotting the density.\n * @param {number} [params.steps] - The exact number of curve samples for\n *   plotting the density. If specified, overrides both minsteps and maxsteps\n *   to set an exact number of uniform samples. Useful in conjunction with\n *   a fixed extent to ensure consistent sample points for stacked densities.\n */\nfunction Density(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar distributions = [{\n  \"key\": {\n    \"function\": \"normal\"\n  },\n  \"params\": [{\n    \"name\": \"mean\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"stdev\",\n    \"type\": \"number\",\n    \"default\": 1\n  }]\n}, {\n  \"key\": {\n    \"function\": \"lognormal\"\n  },\n  \"params\": [{\n    \"name\": \"mean\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"stdev\",\n    \"type\": \"number\",\n    \"default\": 1\n  }]\n}, {\n  \"key\": {\n    \"function\": \"uniform\"\n  },\n  \"params\": [{\n    \"name\": \"min\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"max\",\n    \"type\": \"number\",\n    \"default\": 1\n  }]\n}, {\n  \"key\": {\n    \"function\": \"kde\"\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"from\",\n    \"type\": \"data\"\n  }, {\n    \"name\": \"bandwidth\",\n    \"type\": \"number\",\n    \"default\": 0\n  }]\n}];\nvar mixture = {\n  \"key\": {\n    \"function\": \"mixture\"\n  },\n  \"params\": [{\n    \"name\": \"distributions\",\n    \"type\": \"param\",\n    \"array\": true,\n    \"params\": distributions\n  }, {\n    \"name\": \"weights\",\n    \"type\": \"number\",\n    \"array\": true\n  }]\n};\nDensity.Definition = {\n  \"type\": \"Density\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"extent\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"steps\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"minsteps\",\n    \"type\": \"number\",\n    \"default\": 25\n  }, {\n    \"name\": \"maxsteps\",\n    \"type\": \"number\",\n    \"default\": 200\n  }, {\n    \"name\": \"method\",\n    \"type\": \"string\",\n    \"default\": \"pdf\",\n    \"values\": [\"pdf\", \"cdf\"]\n  }, {\n    \"name\": \"distribution\",\n    \"type\": \"param\",\n    \"params\": distributions.concat(mixture)\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"default\": [\"value\", \"density\"]\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Density, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n\n  if (!this.value || pulse.changed() || _.modified()) {\n    var dist = (0, _Distributions.default)(_.distribution, source(pulse)),\n        minsteps = _.steps || _.minsteps || 25,\n        maxsteps = _.steps || _.maxsteps || 200,\n        method = _.method || 'pdf';\n\n    if (method !== 'pdf' && method !== 'cdf') {\n      (0, _vegaUtil.error)('Invalid density method: ' + method);\n    }\n\n    if (!_.extent && !dist.data) {\n      (0, _vegaUtil.error)('Missing density extent parameter.');\n    }\n\n    method = dist[method];\n    var as = _.as || ['value', 'density'],\n        domain = _.extent || (0, _vegaUtil.extent)(dist.data()),\n        values = (0, _vegaStatistics.sampleCurve)(method, domain, minsteps, maxsteps).map(v => {\n      var tuple = {};\n      tuple[as[0]] = v[0];\n      tuple[as[1]] = v[1];\n      return (0, _vegaDataflow.ingest)(tuple);\n    });\n    if (this.value) out.rem = this.value;\n    this.value = out.add = out.source = values;\n  }\n\n  return out;\n};\n\nfunction source(pulse) {\n  return function () {\n    return pulse.materialize(pulse.SOURCE).source;\n  };\n}\n},{\"./util/Distributions\":\"rT3K\",\"vega-dataflow\":\"luN0\",\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\"}],\"hI6W\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fieldNames = fieldNames;\nexports.partition = partition;\n\nvar _vegaUtil = require(\"vega-util\");\n\n// use either provided alias or accessor field name\nfunction fieldNames(fields, as) {\n  if (!fields) return null;\n  return fields.map(function (f, i) {\n    return as[i] || (0, _vegaUtil.accessorName)(f);\n  });\n}\n\nfunction partition(data, groupby, field) {\n  var groups = [],\n      get = function (f) {\n    return f(t);\n  },\n      map,\n      i,\n      n,\n      t,\n      k,\n      g; // partition data points into groups\n\n\n  if (groupby == null) {\n    groups.push(data.map(field));\n  } else {\n    for (map = {}, i = 0, n = data.length; i < n; ++i) {\n      t = data[i];\n      k = groupby.map(get);\n      g = map[k];\n\n      if (!g) {\n        map[k] = g = [];\n        g.dims = k;\n        groups.push(g);\n      }\n\n      g.push(field(t));\n    }\n  }\n\n  return groups;\n}\n},{\"vega-util\":\"d61Z\"}],\"wdCE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = DotBin;\n\nvar _util = require(\"./util/util\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nconst Output = 'bin';\n/**\n * Dot density binning for dot plot construction.\n * Based on Leland Wilkinson, Dot Plots, The American Statistician, 1999.\n * https://www.cs.uic.edu/~wilkinson/Publications/dotplots.pdf\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to bin.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {number} [params.step] - The step size (bin width) within which dots should be\n *   stacked. Defaults to 1/30 of the extent of the data *field*.\n * @param {boolean} [params.smooth=false] - A boolean flag indicating if dot density\n *   stacks should be smoothed to reduce variance.\n */\n\nfunction DotBin(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nDotBin.Definition = {\n  \"type\": \"DotBin\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"step\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"smooth\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"default\": Output\n  }]\n};\nconst prototype = (0, _vegaUtil.inherits)(DotBin, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (this.value && !(_.modified() || pulse.changed())) {\n    return pulse; // early exit\n  }\n\n  const source = pulse.materialize(pulse.SOURCE).source,\n        groups = (0, _util.partition)(pulse.source, _.groupby, _vegaUtil.identity),\n        smooth = _.smooth || false,\n        field = _.field,\n        step = _.step || autostep(source, field),\n        sort = (0, _vegaDataflow.stableCompare)((a, b) => field(a) - field(b)),\n        as = _.as || Output,\n        n = groups.length; // compute dotplot bins per group\n\n  let min = Infinity,\n      max = -Infinity,\n      i = 0,\n      j;\n\n  for (; i < n; ++i) {\n    const g = groups[i].sort(sort);\n    j = -1;\n\n    for (const v of (0, _vegaStatistics.dotbin)(g, step, smooth, field)) {\n      if (v < min) min = v;\n      if (v > max) max = v;\n      g[++j][as] = v;\n    }\n  }\n\n  this.value = {\n    start: min,\n    stop: max,\n    step: step\n  };\n  return pulse.reflow(true).modifies(as);\n};\n\nfunction autostep(data, field) {\n  return (0, _vegaUtil.span)((0, _vegaUtil.extent)(data, field)) / 30;\n}\n},{\"./util/util\":\"hI6W\",\"vega-dataflow\":\"luN0\",\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\"}],\"Ggmv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Expression;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Wraps an expression function with access to external parameters.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function} params.expr - The expression function. The\n *  function should accept both a datum and a parameter object.\n *  This operator's value will be a new function that wraps the\n *  expression function with access to this operator's parameters.\n */\nfunction Expression(params) {\n  _vegaDataflow.Operator.call(this, null, update, params);\n\n  this.modified(true);\n}\n\n(0, _vegaUtil.inherits)(Expression, _vegaDataflow.Operator);\n\nfunction update(_) {\n  var expr = _.expr;\n  return this.value && !_.modified('expr') ? this.value : (0, _vegaUtil.accessor)(datum => expr(datum, _), (0, _vegaUtil.accessorFields)(expr), (0, _vegaUtil.accessorName)(expr));\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"hW43\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Extent;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Computes extents (min/max) for a data field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The field over which to compute extends.\n */\nfunction Extent(params) {\n  _vegaDataflow.Transform.call(this, [undefined, undefined], params);\n}\n\nExtent.Definition = {\n  \"type\": \"Extent\",\n  \"metadata\": {},\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Extent, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var extent = this.value,\n      field = _.field,\n      min = extent[0],\n      max = extent[1],\n      mod;\n  mod = pulse.changed() || pulse.modified(field.fields) || _.modified('field');\n\n  if (mod || min == null) {\n    min = +Infinity;\n    max = -Infinity;\n  }\n\n  pulse.visit(mod ? pulse.SOURCE : pulse.ADD, function (t) {\n    var v = field(t);\n\n    if (v != null) {\n      // coerce to number\n      v = +v; // NaNs will fail all comparisons!\n\n      if (v < min) min = v;\n      if (v > max) max = v;\n    }\n  });\n\n  if (!Number.isFinite(min) || !Number.isFinite(max)) {\n    let name = (0, _vegaUtil.accessorName)(field);\n    if (name) name = ` for field \"${name}\"`;\n    pulse.dataflow.warn(`Infinite extent${name}: [${min}, ${max}]`);\n    min = max = undefined;\n  }\n\n  this.value = [min, max];\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"p4yG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Subflow;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Provides a bridge between a parent transform and a target subflow that\n * consumes only a subset of the tuples that pass through the parent.\n * @constructor\n * @param {Pulse} pulse - A pulse to use as the value of this operator.\n * @param {Transform} parent - The parent transform (typically a Facet instance).\n * @param {Transform} target - A transform that receives the subflow of tuples.\n */\nfunction Subflow(pulse, parent) {\n  _vegaDataflow.Operator.call(this, pulse);\n\n  this.parent = parent;\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Subflow, _vegaDataflow.Operator);\n\nprototype.connect = function (target) {\n  this.targets().add(target);\n  return target.source = this;\n};\n/**\n * Add an 'add' tuple to the subflow pulse.\n * @param {Tuple} t - The tuple being added.\n */\n\n\nprototype.add = function (t) {\n  this.value.add.push(t);\n};\n/**\n * Add a 'rem' tuple to the subflow pulse.\n * @param {Tuple} t - The tuple being removed.\n */\n\n\nprototype.rem = function (t) {\n  this.value.rem.push(t);\n};\n/**\n * Add a 'mod' tuple to the subflow pulse.\n * @param {Tuple} t - The tuple being modified.\n */\n\n\nprototype.mod = function (t) {\n  this.value.mod.push(t);\n};\n/**\n * Re-initialize this operator's pulse value.\n * @param {Pulse} pulse - The pulse to copy from.\n * @see Pulse.init\n */\n\n\nprototype.init = function (pulse) {\n  this.value.init(pulse, pulse.NO_SOURCE);\n};\n/**\n * Evaluate this operator. This method overrides the\n * default behavior to simply return the contained pulse value.\n * @return {Pulse}\n */\n\n\nprototype.evaluate = function () {\n  // assert: this.value.stamp === pulse.stamp\n  return this.value;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"xWrR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Facet;\n\nvar _Subflow = _interopRequireDefault(require(\"./Subflow\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Facets a dataflow into a set of subflows based on a key.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Dataflow, string): Operator} params.subflow - A function\n *   that generates a subflow of operators and returns its root operator.\n * @param {function(object): *} params.key - The key field to facet by.\n */\nfunction Facet(params) {\n  _vegaDataflow.Transform.call(this, {}, params);\n\n  this._keys = (0, _vegaUtil.fastmap)(); // cache previously calculated key values\n  // keep track of active subflows, use as targets array for listeners\n  // this allows us to limit propagation to only updated subflows\n\n  var a = this._targets = [];\n  a.active = 0;\n\n  a.forEach = function (f) {\n    for (var i = 0, n = a.active; i < n; ++i) f(a[i], i, a);\n  };\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Facet, _vegaDataflow.Transform);\n\nprototype.activate = function (flow) {\n  this._targets[this._targets.active++] = flow;\n};\n\nprototype.subflow = function (key, flow, pulse, parent) {\n  var flows = this.value,\n      sf = (0, _vegaUtil.hasOwnProperty)(flows, key) && flows[key],\n      df,\n      p;\n\n  if (!sf) {\n    p = parent || (p = this._group[key]) && p.tuple;\n    df = pulse.dataflow;\n    sf = df.add(new _Subflow.default(pulse.fork(pulse.NO_SOURCE), this)).connect(flow(df, key, p));\n    flows[key] = sf;\n    this.activate(sf);\n  } else if (sf.value.stamp < pulse.stamp) {\n    sf.init(pulse);\n    this.activate(sf);\n  }\n\n  return sf;\n};\n\nprototype.transform = function (_, pulse) {\n  var df = pulse.dataflow,\n      self = this,\n      key = _.key,\n      flow = _.subflow,\n      cache = this._keys,\n      rekey = _.modified('key');\n\n  function subflow(key) {\n    return self.subflow(key, flow, pulse);\n  }\n\n  this._group = _.group || {};\n  this._targets.active = 0; // reset list of active subflows\n\n  pulse.visit(pulse.REM, function (t) {\n    var id = (0, _vegaDataflow.tupleid)(t),\n        k = cache.get(id);\n\n    if (k !== undefined) {\n      cache.delete(id);\n      subflow(k).rem(t);\n    }\n  });\n  pulse.visit(pulse.ADD, function (t) {\n    var k = key(t);\n    cache.set((0, _vegaDataflow.tupleid)(t), k);\n    subflow(k).add(t);\n  });\n\n  if (rekey || pulse.modified(key.fields)) {\n    pulse.visit(pulse.MOD, function (t) {\n      var id = (0, _vegaDataflow.tupleid)(t),\n          k0 = cache.get(id),\n          k1 = key(t);\n\n      if (k0 === k1) {\n        subflow(k1).mod(t);\n      } else {\n        cache.set(id, k1);\n        subflow(k0).rem(t);\n        subflow(k1).add(t);\n      }\n    });\n  } else if (pulse.changed(pulse.MOD)) {\n    pulse.visit(pulse.MOD, function (t) {\n      subflow(cache.get((0, _vegaDataflow.tupleid)(t))).mod(t);\n    });\n  }\n\n  if (rekey) {\n    pulse.visit(pulse.REFLOW, function (t) {\n      var id = (0, _vegaDataflow.tupleid)(t),\n          k0 = cache.get(id),\n          k1 = key(t);\n\n      if (k0 !== k1) {\n        cache.set(id, k1);\n        subflow(k0).rem(t);\n        subflow(k1).add(t);\n      }\n    });\n  }\n\n  if (cache.empty > df.cleanThreshold) df.runAfter(cache.clean);\n  return pulse;\n};\n},{\"./Subflow\":\"p4yG\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"eE4B\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Field;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Generates one or more field accessor functions.\n * If the 'name' parameter is an array, an array of field accessors\n * will be created and the 'as' parameter will be ignored.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.name - The field name(s) to access.\n * @param {string} params.as - The accessor function name.\n */\nfunction Field(params) {\n  _vegaDataflow.Operator.call(this, null, update, params);\n}\n\n(0, _vegaUtil.inherits)(Field, _vegaDataflow.Operator);\n\nfunction update(_) {\n  return this.value && !_.modified() ? this.value : (0, _vegaUtil.isArray)(_.name) ? (0, _vegaUtil.array)(_.name).map(function (f) {\n    return (0, _vegaUtil.field)(f);\n  }) : (0, _vegaUtil.field)(_.name, _.as);\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"clIN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Filter;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Filters data tuples according to a predicate function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.expr - The predicate expression function\n *   that determines a tuple's filter status. Truthy values pass the filter.\n */\nfunction Filter(params) {\n  _vegaDataflow.Transform.call(this, (0, _vegaUtil.fastmap)(), params);\n}\n\nFilter.Definition = {\n  \"type\": \"Filter\",\n  \"metadata\": {\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"expr\",\n    \"type\": \"expr\",\n    \"required\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Filter, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var df = pulse.dataflow,\n      cache = this.value,\n      // cache ids of filtered tuples\n  output = pulse.fork(),\n      add = output.add,\n      rem = output.rem,\n      mod = output.mod,\n      test = _.expr,\n      isMod = true;\n  pulse.visit(pulse.REM, function (t) {\n    var id = (0, _vegaDataflow.tupleid)(t);\n    if (!cache.has(id)) rem.push(t);else cache.delete(id);\n  });\n  pulse.visit(pulse.ADD, function (t) {\n    if (test(t, _)) add.push(t);else cache.set((0, _vegaDataflow.tupleid)(t), 1);\n  });\n\n  function revisit(t) {\n    var id = (0, _vegaDataflow.tupleid)(t),\n        b = test(t, _),\n        s = cache.get(id);\n\n    if (b && s) {\n      cache.delete(id);\n      add.push(t);\n    } else if (!b && !s) {\n      cache.set(id, 1);\n      rem.push(t);\n    } else if (isMod && b && !s) {\n      mod.push(t);\n    }\n  }\n\n  pulse.visit(pulse.MOD, revisit);\n\n  if (_.modified()) {\n    isMod = false;\n    pulse.visit(pulse.REFLOW, revisit);\n  }\n\n  if (cache.empty > df.cleanThreshold) df.runAfter(cache.clean);\n  return output;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"TXxA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Flatten;\n\nvar _util = require(\"./util/util\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Flattens array-typed field values into new data objects.\n * If multiple fields are specified, they are treated as parallel arrays,\n * with output values included for each matching index (or null if missing).\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.fields - An array of field\n *   accessors for the tuple fields that should be flattened.\n * @param {string} [params.index] - Optional output field name for index\n *   value. If unspecified, no index field is included in the output.\n * @param {Array<string>} [params.as] - Output field names for flattened\n *   array fields. Any unspecified fields will use the field name provided\n *   by the fields accessors.\n */\nfunction Flatten(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n}\n\nFlatten.Definition = {\n  \"type\": \"Flatten\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"array\": true,\n    \"required\": true\n  }, {\n    \"name\": \"index\",\n    \"type\": \"string\"\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Flatten, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE),\n      fields = _.fields,\n      as = (0, _util.fieldNames)(fields, _.as || []),\n      index = _.index || null,\n      m = as.length; // remove any previous results\n\n  out.rem = this.value; // generate flattened tuples\n\n  pulse.visit(pulse.SOURCE, function (t) {\n    var arrays = fields.map(f => f(t)),\n        maxlen = arrays.reduce((l, a) => Math.max(l, a.length), 0),\n        i = 0,\n        j,\n        d,\n        v;\n\n    for (; i < maxlen; ++i) {\n      d = (0, _vegaDataflow.derive)(t);\n\n      for (j = 0; j < m; ++j) {\n        d[as[j]] = (v = arrays[j][i]) == null ? null : v;\n      }\n\n      if (index) {\n        d[index] = i;\n      }\n\n      out.add.push(d);\n    }\n  });\n  this.value = out.source = out.add;\n  if (index) out.modifies(index);\n  return out.modifies(as);\n};\n},{\"./util/util\":\"hI6W\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"Xnj8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Fold;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Folds one more tuple fields into multiple tuples in which the field\n * name and values are available under new 'key' and 'value' fields.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.fields - An array of field accessors\n *   for the tuple fields that should be folded.\n * @param {Array<string>} [params.as] - Output field names for folded key\n *   and value fields, defaults to ['key', 'value'].\n */\nfunction Fold(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n}\n\nFold.Definition = {\n  \"type\": \"Fold\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"array\": true,\n    \"required\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [\"key\", \"value\"]\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Fold, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE),\n      fields = _.fields,\n      fnames = fields.map(_vegaUtil.accessorName),\n      as = _.as || ['key', 'value'],\n      k = as[0],\n      v = as[1],\n      n = fields.length;\n  out.rem = this.value;\n  pulse.visit(pulse.SOURCE, function (t) {\n    for (var i = 0, d; i < n; ++i) {\n      d = (0, _vegaDataflow.derive)(t);\n      d[k] = fnames[i];\n      d[v] = fields[i](t);\n      out.add.push(d);\n    }\n  });\n  this.value = out.source = out.add;\n  return out.modifies(as);\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"C0Ta\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Formula;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Invokes a function for each data tuple and saves the results as a new field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.expr - The formula function to invoke for each tuple.\n * @param {string} params.as - The field name under which to save the result.\n * @param {boolean} [params.initonly=false] - If true, the formula is applied to\n *   added tuples only, and does not update in response to modifications.\n */\nfunction Formula(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nFormula.Definition = {\n  \"type\": \"Formula\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"expr\",\n    \"type\": \"expr\",\n    \"required\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"required\": true\n  }, {\n    \"name\": \"initonly\",\n    \"type\": \"boolean\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Formula, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var func = _.expr,\n      as = _.as,\n      mod = _.modified(),\n      flag = _.initonly ? pulse.ADD : mod ? pulse.SOURCE : pulse.modified(func.fields) || pulse.modified(as) ? pulse.ADD_MOD : pulse.ADD;\n\n  if (mod) {\n    // parameters updated, need to reflow\n    pulse = pulse.materialize().reflow(true);\n  }\n\n  if (!_.initonly) {\n    pulse.modifies(as);\n  }\n\n  return pulse.visit(flag, t => t[as] = func(t, _));\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"z2uT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Generate;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Generates data tuples using a provided generator function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Parameters): object} params.generator - A tuple generator\n *   function. This function is given the operator parameters as input.\n *   Changes to any additional parameters will not trigger re-calculation\n *   of previously generated tuples. Only future tuples are affected.\n * @param {number} params.size - The number of tuples to produce.\n */\nfunction Generate(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Generate, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var data = this.value,\n      out = pulse.fork(pulse.ALL),\n      num = _.size - data.length,\n      gen = _.generator,\n      add,\n      rem,\n      t;\n\n  if (num > 0) {\n    // need more tuples, generate and add\n    for (add = []; --num >= 0;) {\n      add.push(t = (0, _vegaDataflow.ingest)(gen(_)));\n      data.push(t);\n    }\n\n    out.add = out.add.length ? out.materialize(out.ADD).add.concat(add) : add;\n  } else {\n    // need fewer tuples, remove\n    rem = data.slice(0, -num);\n    out.rem = out.rem.length ? out.materialize(out.REM).rem.concat(rem) : rem;\n    data = data.slice(-num);\n  }\n\n  out.source = this.value = data;\n  return out;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"zcbA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Impute;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\nvar Methods = {\n  value: 'value',\n  median: _d3Array.median,\n  mean: _d3Array.mean,\n  min: _d3Array.min,\n  max: _d3Array.max\n};\nvar Empty = [];\n/**\n * Impute missing values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to impute.\n * @param {Array<function(object): *>} [params.groupby] - An array of\n *   accessors to determine series within which to perform imputation.\n * @param {function(object): *} params.key - An accessor for a key value.\n *   Each key value should be unique within a group. New tuples will be\n *   imputed for any key values that are not found within a group.\n * @param {Array<*>} [params.keyvals] - Optional array of required key\n *   values. New tuples will be imputed for any key values that are not\n *   found within a group. In addition, these values will be automatically\n *   augmented with the key values observed in the input data.\n * @param {string} [method='value'] - The imputation method to use. One of\n *   'value', 'mean', 'median', 'max', 'min'.\n * @param {*} [value=0] - The constant value to use for imputation\n *   when using method 'value'.\n */\n\nfunction Impute(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n}\n\nImpute.Definition = {\n  \"type\": \"Impute\",\n  \"metadata\": {\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"key\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"keyvals\",\n    \"array\": true\n  }, {\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"method\",\n    \"type\": \"enum\",\n    \"default\": \"value\",\n    \"values\": [\"value\", \"mean\", \"median\", \"max\", \"min\"]\n  }, {\n    \"name\": \"value\",\n    \"default\": 0\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Impute, _vegaDataflow.Transform);\n\nfunction getValue(_) {\n  var m = _.method || Methods.value,\n      v;\n\n  if (Methods[m] == null) {\n    (0, _vegaUtil.error)('Unrecognized imputation method: ' + m);\n  } else if (m === Methods.value) {\n    v = _.value !== undefined ? _.value : 0;\n    return function () {\n      return v;\n    };\n  } else {\n    return Methods[m];\n  }\n}\n\nfunction getField(_) {\n  var f = _.field;\n  return function (t) {\n    return t ? f(t) : NaN;\n  };\n}\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.ALL),\n      impute = getValue(_),\n      field = getField(_),\n      fName = (0, _vegaUtil.accessorName)(_.field),\n      kName = (0, _vegaUtil.accessorName)(_.key),\n      gNames = (_.groupby || []).map(_vegaUtil.accessorName),\n      groups = partition(pulse.source, _.groupby, _.key, _.keyvals),\n      curr = [],\n      prev = this.value,\n      m = groups.domain.length,\n      group,\n      value,\n      gVals,\n      kVal,\n      g,\n      i,\n      j,\n      l,\n      n,\n      t;\n\n  for (g = 0, l = groups.length; g < l; ++g) {\n    group = groups[g];\n    gVals = group.values;\n    value = NaN; // add tuples for missing values\n\n    for (j = 0; j < m; ++j) {\n      if (group[j] != null) continue;\n      kVal = groups.domain[j];\n      t = {\n        _impute: true\n      };\n\n      for (i = 0, n = gVals.length; i < n; ++i) t[gNames[i]] = gVals[i];\n\n      t[kName] = kVal;\n      t[fName] = Number.isNaN(value) ? value = impute(group, field) : value;\n      curr.push((0, _vegaDataflow.ingest)(t));\n    }\n  } // update pulse with imputed tuples\n\n\n  if (curr.length) out.add = out.materialize(out.ADD).add.concat(curr);\n  if (prev.length) out.rem = out.materialize(out.REM).rem.concat(prev);\n  this.value = curr;\n  return out;\n};\n\nfunction partition(data, groupby, key, keyvals) {\n  var get = function (f) {\n    return f(t);\n  },\n      groups = [],\n      domain = keyvals ? keyvals.slice() : [],\n      kMap = {},\n      gMap = {},\n      gVals,\n      gKey,\n      group,\n      i,\n      j,\n      k,\n      n,\n      t;\n\n  domain.forEach(function (k, i) {\n    kMap[k] = i + 1;\n  });\n\n  for (i = 0, n = data.length; i < n; ++i) {\n    t = data[i];\n    k = key(t);\n    j = kMap[k] || (kMap[k] = domain.push(k));\n    gKey = (gVals = groupby ? groupby.map(get) : Empty) + '';\n\n    if (!(group = gMap[gKey])) {\n      group = gMap[gKey] = [];\n      groups.push(group);\n      group.values = gVals;\n    }\n\n    group[j - 1] = t;\n  }\n\n  groups.domain = domain;\n  return groups;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\"}],\"szfy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = JoinAggregate;\n\nvar _Aggregate = _interopRequireDefault(require(\"./Aggregate\"));\n\nvar _AggregateOps = require(\"./util/AggregateOps\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Extend input tuples with aggregate values.\n * Calcuates aggregate values and joins them with the input stream.\n * @constructor\n */\nfunction JoinAggregate(params) {\n  _Aggregate.default.call(this, params);\n}\n\nJoinAggregate.Definition = {\n  \"type\": \"JoinAggregate\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"null\": true,\n    \"array\": true\n  }, {\n    \"name\": \"ops\",\n    \"type\": \"enum\",\n    \"array\": true,\n    \"values\": _AggregateOps.ValidAggregateOps\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"null\": true,\n    \"array\": true\n  }, {\n    \"name\": \"key\",\n    \"type\": \"field\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(JoinAggregate, _Aggregate.default);\n\nprototype.transform = function (_, pulse) {\n  var aggr = this,\n      mod = _.modified(),\n      cells; // process all input tuples to calculate aggregates\n\n\n  if (aggr.value && (mod || pulse.modified(aggr._inputs, true))) {\n    cells = aggr.value = mod ? aggr.init(_) : {};\n    pulse.visit(pulse.SOURCE, function (t) {\n      aggr.add(t);\n    });\n  } else {\n    cells = aggr.value = aggr.value || this.init(_);\n    pulse.visit(pulse.REM, function (t) {\n      aggr.rem(t);\n    });\n    pulse.visit(pulse.ADD, function (t) {\n      aggr.add(t);\n    });\n  } // update aggregation cells\n\n\n  aggr.changes(); // write aggregate values to input tuples\n\n  pulse.visit(pulse.SOURCE, function (t) {\n    (0, _vegaUtil.extend)(t, cells[aggr.cellkey(t)].tuple);\n  });\n  return pulse.reflow(mod).modifies(this._outputs);\n};\n\nprototype.changes = function () {\n  var adds = this._adds,\n      mods = this._mods,\n      i,\n      n;\n\n  for (i = 0, n = this._alen; i < n; ++i) {\n    this.celltuple(adds[i]);\n    adds[i] = null; // for garbage collection\n  }\n\n  for (i = 0, n = this._mlen; i < n; ++i) {\n    this.celltuple(mods[i]);\n    mods[i] = null; // for garbage collection\n  }\n\n  this._alen = this._mlen = 0; // reset list of active cells\n};\n},{\"./Aggregate\":\"aUqN\",\"./util/AggregateOps\":\"Fivq\",\"vega-util\":\"d61Z\"}],\"JDVY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = KDE;\n\nvar _util = require(\"./util/util\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Compute kernel density estimates (KDE) for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {function(object): *} params.field - An accessor for the data field\n *   to estimate.\n * @param {number} [params.bandwidth=0] - The KDE kernel bandwidth.\n *   If zero or unspecified, the bandwidth is automatically determined.\n * @param {boolean} [params.counts=false] - A boolean flag indicating if the\n *   output values should be probability estimates (false, default) or\n *   smoothed counts (true).\n * @param {string} [params.cumulative=false] - A boolean flag indicating if a\n *   density (false) or cumulative distribution (true) should be generated.\n * @param {Array<number>} [params.extent] - The domain extent over which to\n *   plot the density. If unspecified, the [min, max] data extent is used.\n * @param {string} [params.resolve='independent'] - Indicates how parameters for\n *   multiple densities should be resolved. If \"independent\" (the default), each\n *   density may have its own domain extent and dynamic number of curve sample\n *   steps. If \"shared\", the KDE transform will ensure that all densities are\n *   defined over a shared domain and curve steps, enabling stacking.\n * @param {number} [params.minsteps=25] - The minimum number of curve samples\n *   for plotting the density.\n * @param {number} [params.maxsteps=200] - The maximum number of curve samples\n *   for plotting the density.\n * @param {number} [params.steps] - The exact number of curve samples for\n *   plotting the density. If specified, overrides both minsteps and maxsteps\n *   to set an exact number of uniform samples. Useful in conjunction with\n *   a fixed extent to ensure consistent sample points for stacked densities.\n */\nfunction KDE(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nKDE.Definition = {\n  \"type\": \"KDE\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"cumulative\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"counts\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"bandwidth\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"extent\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"resolve\",\n    \"type\": \"enum\",\n    \"values\": [\"shared\", \"independent\"],\n    \"default\": \"independent\"\n  }, {\n    \"name\": \"steps\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"minsteps\",\n    \"type\": \"number\",\n    \"default\": 25\n  }, {\n    \"name\": \"maxsteps\",\n    \"type\": \"number\",\n    \"default\": 200\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"default\": [\"value\", \"density\"]\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(KDE, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n\n  if (!this.value || pulse.changed() || _.modified()) {\n    const source = pulse.materialize(pulse.SOURCE).source,\n          groups = (0, _util.partition)(source, _.groupby, _.field),\n          names = (_.groupby || []).map(_vegaUtil.accessorName),\n          bandwidth = _.bandwidth,\n          method = _.cumulative ? 'cdf' : 'pdf',\n          as = _.as || ['value', 'density'],\n          values = [];\n    let domain = _.extent,\n        minsteps = _.steps || _.minsteps || 25,\n        maxsteps = _.steps || _.maxsteps || 200;\n\n    if (method !== 'pdf' && method !== 'cdf') {\n      (0, _vegaUtil.error)('Invalid density method: ' + method);\n    }\n\n    if (_.resolve === 'shared') {\n      if (!domain) domain = (0, _vegaUtil.extent)(source, _.field);\n      minsteps = maxsteps = _.steps || maxsteps;\n    }\n\n    groups.forEach(g => {\n      const density = (0, _vegaStatistics.randomKDE)(g, bandwidth)[method],\n            scale = _.counts ? g.length : 1,\n            local = domain || (0, _vegaUtil.extent)(g);\n      (0, _vegaStatistics.sampleCurve)(density, local, minsteps, maxsteps).forEach(v => {\n        const t = {};\n\n        for (let i = 0; i < names.length; ++i) {\n          t[names[i]] = g.dims[i];\n        }\n\n        t[as[0]] = v[0];\n        t[as[1]] = v[1] * scale;\n        values.push((0, _vegaDataflow.ingest)(t));\n      });\n    });\n    if (this.value) out.rem = this.value;\n    this.value = out.add = out.source = values;\n  }\n\n  return out;\n};\n},{\"./util/util\":\"hI6W\",\"vega-statistics\":\"Cvi0\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"GJ0r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Key;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Generates a key function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<string>} params.fields - The field name(s) for the key function.\n * @param {boolean} params.flat - A boolean flag indicating if the field names\n *  should be treated as flat property names, side-stepping nested field\n *  lookups normally indicated by dot or bracket notation.\n */\nfunction Key(params) {\n  _vegaDataflow.Operator.call(this, null, update, params);\n}\n\n(0, _vegaUtil.inherits)(Key, _vegaDataflow.Operator);\n\nfunction update(_) {\n  return this.value && !_.modified() ? this.value : (0, _vegaUtil.key)(_.fields, _.flat);\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"hlH5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Load;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Load and parse data from an external source. Marshalls parameter\n * values and then invokes the Dataflow request method.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.url - The URL to load from.\n * @param {object} params.format - The data format options.\n */\nfunction Load(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Load, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  const df = pulse.dataflow;\n\n  if (_.values) {\n    // parse and ingest values\n    return output(this, pulse, df.parse(_.values, _.format));\n  } else {\n    // return promise for async loading\n    return df.request(_.url, _.format).then(res => output(this, pulse, (0, _vegaUtil.array)(res.data)));\n  }\n};\n\nfunction output(op, pulse, data) {\n  data.forEach(_vegaDataflow.ingest);\n  const out = pulse.fork(pulse.NO_FIELDS & pulse.NO_SOURCE);\n  out.rem = op.value;\n  op.value = out.add = out.source = data;\n  return out;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"DF1U\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Lookup;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Extend tuples by joining them with values from a lookup table.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Map} params.index - The lookup table map.\n * @param {Array<function(object): *} params.fields - The fields to lookup.\n * @param {Array<string>} params.as - Output field names for each lookup value.\n * @param {*} [params.default] - A default value to use if lookup fails.\n */\nfunction Lookup(params) {\n  _vegaDataflow.Transform.call(this, {}, params);\n}\n\nLookup.Definition = {\n  \"type\": \"Lookup\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"index\",\n    \"type\": \"index\",\n    \"params\": [{\n      \"name\": \"from\",\n      \"type\": \"data\",\n      \"required\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  }, {\n    \"name\": \"values\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"array\": true,\n    \"required\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true\n  }, {\n    \"name\": \"default\",\n    \"default\": null\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Lookup, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse,\n      as = _.as,\n      keys = _.fields,\n      index = _.index,\n      values = _.values,\n      defaultValue = _.default == null ? null : _.default,\n      reset = _.modified(),\n      flag = reset ? pulse.SOURCE : pulse.ADD,\n      n = keys.length,\n      set,\n      m,\n      mods;\n\n  if (values) {\n    m = values.length;\n\n    if (n > 1 && !as) {\n      (0, _vegaUtil.error)('Multi-field lookup requires explicit \"as\" parameter.');\n    }\n\n    if (as && as.length !== n * m) {\n      (0, _vegaUtil.error)('The \"as\" parameter has too few output field names.');\n    }\n\n    as = as || values.map(_vegaUtil.accessorName);\n\n    set = function (t) {\n      for (var i = 0, k = 0, j, v; i < n; ++i) {\n        v = index.get(keys[i](t));\n        if (v == null) for (j = 0; j < m; ++j, ++k) t[as[k]] = defaultValue;else for (j = 0; j < m; ++j, ++k) t[as[k]] = values[j](v);\n      }\n    };\n  } else {\n    if (!as) {\n      (0, _vegaUtil.error)('Missing output field names.');\n    }\n\n    set = function (t) {\n      for (var i = 0, v; i < n; ++i) {\n        v = index.get(keys[i](t));\n        t[as[i]] = v == null ? defaultValue : v;\n      }\n    };\n  }\n\n  if (reset) {\n    out = pulse.reflow(true);\n  } else {\n    mods = keys.some(function (k) {\n      return pulse.modified(k.fields);\n    });\n    flag |= mods ? pulse.MOD : 0;\n  }\n\n  pulse.visit(flag, set);\n  return out.modifies(as);\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"eQPl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = MultiExtent;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Computes global min/max extents over a collection of extents.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<Array<number>>} params.extents - The input extents.\n */\nfunction MultiExtent(params) {\n  _vegaDataflow.Operator.call(this, null, update, params);\n}\n\n(0, _vegaUtil.inherits)(MultiExtent, _vegaDataflow.Operator);\n\nfunction update(_) {\n  if (this.value && !_.modified()) {\n    return this.value;\n  }\n\n  var min = +Infinity,\n      max = -Infinity,\n      ext = _.extents,\n      i,\n      n,\n      e;\n\n  for (i = 0, n = ext.length; i < n; ++i) {\n    e = ext[i];\n    if (e[0] < min) min = e[0];\n    if (e[1] > max) max = e[1];\n  }\n\n  return [min, max];\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"Q4vF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = MultiValues;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Merge a collection of value arrays.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<Array<*>>} params.values - The input value arrrays.\n */\nfunction MultiValues(params) {\n  _vegaDataflow.Operator.call(this, null, update, params);\n}\n\n(0, _vegaUtil.inherits)(MultiValues, _vegaDataflow.Operator);\n\nfunction update(_) {\n  return this.value && !_.modified() ? this.value : _.values.reduce(function (data, _) {\n    return data.concat(_);\n  }, []);\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"uxmI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Params;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Operator whose value is simply its parameter hash. This operator is\n * useful for enabling reactive updates to values of nested objects.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */\nfunction Params(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\n(0, _vegaUtil.inherits)(Params, _vegaDataflow.Transform);\n\nParams.prototype.transform = function (_, pulse) {\n  this.modified(_.modified());\n  this.value = _;\n  return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS); // do not pass tuples\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"Yq7C\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Pivot;\n\nvar _Aggregate = _interopRequireDefault(require(\"./Aggregate\"));\n\nvar _AggregateOps = require(\"./util/AggregateOps\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Aggregate and pivot selected field values to become new fields.\n * This operator is useful to construction cross-tabulations.\n * @constructor\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *  to groupby. These fields act just like groupby fields of an Aggregate transform.\n * @param {function(object): *} params.field - The field to pivot on. The unique\n *  values of this field become new field names in the output stream.\n * @param {function(object): *} params.value - The field to populate pivoted fields.\n *  The aggregate values of this field become the values of the new pivoted fields.\n * @param {string} [params.op] - The aggregation operation for the value field,\n *  applied per cell in the output stream. The default is \"sum\".\n * @param {number} [params.limit] - An optional parameter indicating the maximum\n *  number of pivoted fields to generate. The pivoted field names are sorted in\n *  ascending order prior to enforcing the limit.\n */\nfunction Pivot(params) {\n  _Aggregate.default.call(this, params);\n}\n\nPivot.Definition = {\n  \"type\": \"Pivot\",\n  \"metadata\": {\n    \"generates\": true,\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"value\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"op\",\n    \"type\": \"enum\",\n    \"values\": _AggregateOps.ValidAggregateOps,\n    \"default\": \"sum\"\n  }, {\n    \"name\": \"limit\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"key\",\n    \"type\": \"field\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Pivot, _Aggregate.default);\nprototype._transform = prototype.transform;\n\nprototype.transform = function (_, pulse) {\n  return this._transform(aggregateParams(_, pulse), pulse);\n}; // Shoehorn a pivot transform into an aggregate transform!\n// First collect all unique pivot field values.\n// Then generate aggregate fields for each output pivot field.\n\n\nfunction aggregateParams(_, pulse) {\n  var key = _.field,\n      value = _.value,\n      op = (_.op === 'count' ? '__count__' : _.op) || 'sum',\n      fields = (0, _vegaUtil.accessorFields)(key).concat((0, _vegaUtil.accessorFields)(value)),\n      keys = pivotKeys(key, _.limit || 0, pulse); // if data stream content changes, pivot fields may change\n  // flag parameter modification to ensure re-initialization\n\n  if (pulse.changed()) _.set('__pivot__', null, null, true);\n  return {\n    key: _.key,\n    groupby: _.groupby,\n    ops: keys.map(function () {\n      return op;\n    }),\n    fields: keys.map(function (k) {\n      return get(k, key, value, fields);\n    }),\n    as: keys.map(function (k) {\n      return k + '';\n    }),\n    modified: _.modified.bind(_)\n  };\n} // Generate aggregate field accessor.\n// Output NaN for non-existent values; aggregator will ignore!\n\n\nfunction get(k, key, value, fields) {\n  return (0, _vegaUtil.accessor)(function (d) {\n    return key(d) === k ? value(d) : NaN;\n  }, fields, k + '');\n} // Collect (and optionally limit) all unique pivot values.\n\n\nfunction pivotKeys(key, limit, pulse) {\n  var map = {},\n      list = [];\n  pulse.visit(pulse.SOURCE, function (t) {\n    var k = key(t);\n\n    if (!map[k]) {\n      map[k] = 1;\n      list.push(k);\n    }\n  }); // TODO? Move this comparator to vega-util?\n\n  list.sort(function (u, v) {\n    return (u < v || u == null) && v != null ? -1 : (u > v || v == null) && u != null ? 1 : (v = v instanceof Date ? +v : v, u = u instanceof Date ? +u : u) !== u && v === v ? -1 : v !== v && u === u ? 1 : 0;\n  });\n  return limit ? list.slice(0, limit) : list;\n}\n},{\"./Aggregate\":\"aUqN\",\"./util/AggregateOps\":\"Fivq\",\"vega-util\":\"d61Z\"}],\"nThC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = PreFacet;\n\nvar _Facet = _interopRequireDefault(require(\"./Facet\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Partitions pre-faceted data into tuple subflows.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Dataflow, string): Operator} params.subflow - A function\n *   that generates a subflow of operators and returns its root operator.\n * @param {function(object): Array<object>} params.field - The field\n *   accessor for an array of subflow tuple objects.\n */\nfunction PreFacet(params) {\n  _Facet.default.call(this, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(PreFacet, _Facet.default);\n\nprototype.transform = function (_, pulse) {\n  var self = this,\n      flow = _.subflow,\n      field = _.field;\n\n  if (_.modified('field') || field && pulse.modified((0, _vegaUtil.accessorFields)(field))) {\n    (0, _vegaUtil.error)('PreFacet does not support field modification.');\n  }\n\n  this._targets.active = 0; // reset list of active subflows\n\n  pulse.visit(pulse.MOD, function (t) {\n    var sf = self.subflow((0, _vegaDataflow.tupleid)(t), flow, pulse, t);\n    field ? field(t).forEach(function (_) {\n      sf.mod(_);\n    }) : sf.mod(t);\n  });\n  pulse.visit(pulse.ADD, function (t) {\n    var sf = self.subflow((0, _vegaDataflow.tupleid)(t), flow, pulse, t);\n    field ? field(t).forEach(function (_) {\n      sf.add((0, _vegaDataflow.ingest)(_));\n    }) : sf.add(t);\n  });\n  pulse.visit(pulse.REM, function (t) {\n    var sf = self.subflow((0, _vegaDataflow.tupleid)(t), flow, pulse, t);\n    field ? field(t).forEach(function (_) {\n      sf.rem(_);\n    }) : sf.rem(t);\n  });\n  return pulse;\n};\n},{\"./Facet\":\"xWrR\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"HdSy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Project;\n\nvar _util = require(\"./util/util\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Performs a relational projection, copying selected fields from source\n * tuples to a new set of derived tuples.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *} params.fields - The fields to project,\n *   as an array of field accessors. If unspecified, all fields will be\n *   copied with names unchanged.\n * @param {Array<string>} [params.as] - Output field names for each projected\n *   field. Any unspecified fields will use the field name provided by\n *   the field accessor.\n */\nfunction Project(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nProject.Definition = {\n  \"type\": \"Project\",\n  \"metadata\": {\n    \"generates\": true,\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"null\": true,\n    \"array\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Project, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var fields = _.fields,\n      as = (0, _util.fieldNames)(_.fields, _.as || []),\n      derive = fields ? function (s, t) {\n    return project(s, t, fields, as);\n  } : _vegaDataflow.rederive,\n      out,\n      lut;\n\n  if (this.value) {\n    lut = this.value;\n  } else {\n    pulse = pulse.addAll();\n    lut = this.value = {};\n  }\n\n  out = pulse.fork(pulse.NO_SOURCE);\n  pulse.visit(pulse.REM, function (t) {\n    var id = (0, _vegaDataflow.tupleid)(t);\n    out.rem.push(lut[id]);\n    lut[id] = null;\n  });\n  pulse.visit(pulse.ADD, function (t) {\n    var dt = derive(t, (0, _vegaDataflow.ingest)({}));\n    lut[(0, _vegaDataflow.tupleid)(t)] = dt;\n    out.add.push(dt);\n  });\n  pulse.visit(pulse.MOD, function (t) {\n    out.mod.push(derive(t, lut[(0, _vegaDataflow.tupleid)(t)]));\n  });\n  return out;\n};\n\nfunction project(s, t, fields, as) {\n  for (var i = 0, n = fields.length; i < n; ++i) {\n    t[as[i]] = fields[i](s);\n  }\n\n  return t;\n}\n},{\"./util/util\":\"hI6W\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"uRf7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Proxy;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Proxy the value of another operator as a pure signal value.\n * Ensures no tuples are propagated.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {*} params.value - The value to proxy, becomes the value of this operator.\n */\nfunction Proxy(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Proxy, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  this.value = _.value;\n  return _.modified('value') ? pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS) : pulse.StopPropagation;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"nqPw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Quantile;\n\nvar _util = require(\"./util/util\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\n/**\n * Generates sample quantile values from an input data stream.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - An accessor for the data field\n *   over which to calculate quantile values.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {Array<number>} [params.probs] - An array of probabilities in\n *   the range (0, 1) for which to compute quantile values. If not specified,\n *   the *step* parameter will be used.\n * @param {Array<number>} [params.step=0.01] - A probability step size for\n *   sampling quantile values. All values from one-half the step size up to\n *   1 (exclusive) will be sampled. This parameter is only used if the\n *   *quantiles* parameter is not provided.\n */\nfunction Quantile(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nQuantile.Definition = {\n  \"type\": \"Quantile\",\n  \"metadata\": {\n    \"generates\": true,\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"probs\",\n    \"type\": \"number\",\n    \"array\": true\n  }, {\n    \"name\": \"step\",\n    \"type\": \"number\",\n    \"default\": 0.01\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"default\": [\"prob\", \"value\"]\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Quantile, _vegaDataflow.Transform);\nvar EPSILON = 1e-14;\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      as = _.as || ['prob', 'value'];\n\n  if (this.value && !_.modified() && !pulse.changed()) {\n    out.source = this.value;\n    return out;\n  }\n\n  const source = pulse.materialize(pulse.SOURCE).source,\n        groups = (0, _util.partition)(source, _.groupby, _.field),\n        names = (_.groupby || []).map(_vegaUtil.accessorName),\n        values = [],\n        step = _.step || 0.01,\n        p = _.probs || (0, _d3Array.range)(step / 2, 1 - EPSILON, step),\n        n = p.length;\n  groups.forEach(g => {\n    const q = (0, _vegaStatistics.quantiles)(g, p);\n\n    for (let i = 0; i < n; ++i) {\n      const t = {};\n\n      for (let i = 0; i < names.length; ++i) {\n        t[names[i]] = g.dims[i];\n      }\n\n      t[as[0]] = p[i];\n      t[as[1]] = q[i];\n      values.push((0, _vegaDataflow.ingest)(t));\n    }\n  });\n  if (this.value) out.rem = this.value;\n  this.value = out.add = out.source = values;\n  return out;\n};\n},{\"./util/util\":\"hI6W\",\"vega-dataflow\":\"luN0\",\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\"}],\"PIyq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Relay;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Relays a data stream between data processing pipelines.\n * If the derive parameter is set, this transform will create derived\n * copies of observed tuples. This provides derived data streams in which\n * modifications to the tuples do not pollute an upstream data source.\n * @param {object} params - The parameters for this operator.\n * @param {number} [params.derive=false] - Boolean flag indicating if\n *   the transform should make derived copies of incoming tuples.\n * @constructor\n */\nfunction Relay(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Relay, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out, lut;\n\n  if (this.value) {\n    lut = this.value;\n  } else {\n    out = pulse = pulse.addAll();\n    lut = this.value = {};\n  }\n\n  if (_.derive) {\n    out = pulse.fork(pulse.NO_SOURCE);\n    pulse.visit(pulse.REM, t => {\n      var id = (0, _vegaDataflow.tupleid)(t);\n      out.rem.push(lut[id]);\n      lut[id] = null;\n    });\n    pulse.visit(pulse.ADD, t => {\n      var dt = (0, _vegaDataflow.derive)(t);\n      lut[(0, _vegaDataflow.tupleid)(t)] = dt;\n      out.add.push(dt);\n    });\n    pulse.visit(pulse.MOD, t => {\n      var dt = lut[(0, _vegaDataflow.tupleid)(t)],\n          k;\n\n      for (k in t) {\n        dt[k] = t[k]; // down stream writes may overwrite re-derived tuples\n        // conservatively mark all source fields as modified\n\n        out.modifies(k);\n      }\n\n      out.mod.push(dt);\n    });\n  }\n\n  return out;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"Vm8v\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Sample;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Samples tuples passing through this operator.\n * Uses reservoir sampling to maintain a representative sample.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {number} [params.size=1000] - The maximum number of samples.\n */\nfunction Sample(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n\n  this.count = 0;\n}\n\nSample.Definition = {\n  \"type\": \"Sample\",\n  \"metadata\": {},\n  \"params\": [{\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"default\": 1000\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Sample, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE),\n      mod = _.modified('size'),\n      num = _.size,\n      res = this.value,\n      cnt = this.count,\n      cap = 0,\n      map = res.reduce(function (m, t) {\n    m[(0, _vegaDataflow.tupleid)(t)] = 1;\n    return m;\n  }, {}); // sample reservoir update function\n\n\n  function update(t) {\n    var p, idx;\n\n    if (res.length < num) {\n      res.push(t);\n    } else {\n      idx = ~~((cnt + 1) * (0, _vegaStatistics.random)());\n\n      if (idx < res.length && idx >= cap) {\n        p = res[idx];\n        if (map[(0, _vegaDataflow.tupleid)(p)]) out.rem.push(p); // eviction\n\n        res[idx] = t;\n      }\n    }\n\n    ++cnt;\n  }\n\n  if (pulse.rem.length) {\n    // find all tuples that should be removed, add to output\n    pulse.visit(pulse.REM, function (t) {\n      var id = (0, _vegaDataflow.tupleid)(t);\n\n      if (map[id]) {\n        map[id] = -1;\n        out.rem.push(t);\n      }\n\n      --cnt;\n    }); // filter removed tuples out of the sample reservoir\n\n    res = res.filter(function (t) {\n      return map[(0, _vegaDataflow.tupleid)(t)] !== -1;\n    });\n  }\n\n  if ((pulse.rem.length || mod) && res.length < num && pulse.source) {\n    // replenish sample if backing data source is available\n    cap = cnt = res.length;\n    pulse.visit(pulse.SOURCE, function (t) {\n      // update, but skip previously sampled tuples\n      if (!map[(0, _vegaDataflow.tupleid)(t)]) update(t);\n    });\n    cap = -1;\n  }\n\n  if (mod && res.length > num) {\n    for (var i = 0, n = res.length - num; i < n; ++i) {\n      map[(0, _vegaDataflow.tupleid)(res[i])] = -1;\n      out.rem.push(res[i]);\n    }\n\n    res = res.slice(n);\n  }\n\n  if (pulse.mod.length) {\n    // propagate modified tuples in the sample reservoir\n    pulse.visit(pulse.MOD, function (t) {\n      if (map[(0, _vegaDataflow.tupleid)(t)]) out.mod.push(t);\n    });\n  }\n\n  if (pulse.add.length) {\n    // update sample reservoir\n    pulse.visit(pulse.ADD, update);\n  }\n\n  if (pulse.add.length || cap < 0) {\n    // output newly added tuples\n    out.add = res.filter(function (t) {\n      return !map[(0, _vegaDataflow.tupleid)(t)];\n    });\n  }\n\n  this.count = cnt;\n  this.value = out.source = res;\n  return out;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\"}],\"wp8w\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Sequence;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\n/**\n * Generates data tuples for a specified sequence range of numbers.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {number} params.start - The first number in the sequence.\n * @param {number} params.stop - The last number (exclusive) in the sequence.\n * @param {number} [params.step=1] - The step size between numbers in the sequence.\n */\nfunction Sequence(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nSequence.Definition = {\n  \"type\": \"Sequence\",\n  \"metadata\": {\n    \"generates\": true,\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"start\",\n    \"type\": \"number\",\n    \"required\": true\n  }, {\n    \"name\": \"stop\",\n    \"type\": \"number\",\n    \"required\": true\n  }, {\n    \"name\": \"step\",\n    \"type\": \"number\",\n    \"default\": 1\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"default\": \"data\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Sequence, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (this.value && !_.modified()) return;\n  var out = pulse.materialize().fork(pulse.MOD),\n      as = _.as || 'data';\n  out.rem = this.value ? pulse.rem.concat(this.value) : pulse.rem;\n  this.value = (0, _d3Array.range)(_.start, _.stop, _.step || 1).map(function (v) {\n    var t = {};\n    t[as] = v;\n    return (0, _vegaDataflow.ingest)(t);\n  });\n  out.add = pulse.add.concat(this.value);\n  return out;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\"}],\"NMRs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Sieve;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Propagates a new pulse without any tuples so long as the input\n * pulse contains some added, removed or modified tuples.\n * @param {object} params - The parameters for this operator.\n * @constructor\n */\nfunction Sieve(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n\n  this.modified(true); // always treat as modified\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Sieve, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  this.value = pulse.source;\n  return pulse.changed() ? pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS) : pulse.StopPropagation;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"tLSM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.timeUnits = timeUnits;\nexports.MILLISECONDS = exports.SECONDS = exports.MINUTES = exports.HOURS = exports.DAY = exports.DATE = exports.WEEK = exports.MONTH = exports.QUARTER = exports.YEAR = void 0;\n\nvar _vegaUtil = require(\"vega-util\");\n\nconst YEAR = 'year';\nexports.YEAR = YEAR;\nconst QUARTER = 'quarter';\nexports.QUARTER = QUARTER;\nconst MONTH = 'month';\nexports.MONTH = MONTH;\nconst WEEK = 'week';\nexports.WEEK = WEEK;\nconst DATE = 'date';\nexports.DATE = DATE;\nconst DAY = 'day';\nexports.DAY = DAY;\nconst HOURS = 'hours';\nexports.HOURS = HOURS;\nconst MINUTES = 'minutes';\nexports.MINUTES = MINUTES;\nconst SECONDS = 'seconds';\nexports.SECONDS = SECONDS;\nconst MILLISECONDS = 'milliseconds';\nexports.MILLISECONDS = MILLISECONDS;\nconst UNITS = [YEAR, QUARTER, MONTH, WEEK, DATE, DAY, HOURS, MINUTES, SECONDS, MILLISECONDS].reduce((o, u, i) => (o[u] = 1 + i, o), {});\n\nfunction timeUnits(units) {\n  const u = (0, _vegaUtil.array)(units).slice(),\n        m = {}; // check validity\n\n  if (!u.length) (0, _vegaUtil.error)('Missing time unit.');\n  u.forEach(unit => {\n    if ((0, _vegaUtil.hasOwnProperty)(UNITS, unit)) {\n      m[unit] = 1;\n    } else {\n      (0, _vegaUtil.error)(`Invalid time unit: ${unit}.`);\n    }\n  });\n\n  if ((m[WEEK] || m[DAY]) && (m[QUARTER] || m[MONTH] || m[DATE])) {\n    (0, _vegaUtil.error)(`Incompatible time units: ${units}`);\n  } // ensure proper sort order\n\n\n  u.sort((a, b) => UNITS[a] - UNITS[b]);\n  return u;\n}\n},{\"vega-util\":\"d61Z\"}],\"Fr5o\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.timeFloor = timeFloor;\nexports.utcFloor = utcFloor;\n\nvar _units = require(\"./units\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Time = require(\"d3-time\");\n\nconst t0 = new Date();\n\nfunction floor(units, step, fn, newDate) {\n  const s = step || 1,\n        b = (0, _vegaUtil.peek)(units),\n        _ = (unit, p, key) => skip(fn[key || unit], unit === b && s, p);\n\n  const t = new Date(),\n        u = (0, _vegaUtil.toSet)(units),\n        y = u[_units.YEAR] ? _(_units.YEAR) : (0, _vegaUtil.constant)(2012),\n        m = u[_units.MONTH] ? _(_units.MONTH) : u[_units.QUARTER] ? _(_units.QUARTER) : _vegaUtil.zero,\n        d = u[_units.WEEK] && u[_units.DAY] ? _(_units.DAY, 1, _units.WEEK + _units.DAY) : u[_units.WEEK] ? _(_units.WEEK, 1) : u[_units.DAY] ? _(_units.DAY, 1) : u[_units.DATE] ? _(_units.DATE, 1) : _vegaUtil.one,\n        H = u[_units.HOURS] ? _(_units.HOURS) : _vegaUtil.zero,\n        M = u[_units.MINUTES] ? _(_units.MINUTES) : _vegaUtil.zero,\n        S = u[_units.SECONDS] ? _(_units.SECONDS) : _vegaUtil.zero,\n        L = u[_units.MILLISECONDS] ? _(_units.MILLISECONDS) : _vegaUtil.zero;\n  return function (v) {\n    t.setTime(+v);\n    const year = y(t);\n    return newDate(year, m(t), d(t, year), H(t), M(t), S(t), L(t));\n  };\n}\n\nfunction skip(f, step, phase) {\n  return step <= 1 ? f : phase ? (d, y) => phase + step * Math.floor((f(d, y) - phase) / step) : (d, y) => step * Math.floor(f(d, y) / step);\n} // returns the day of the year based on week number, day of week,\n// and the day of the week for the first day of the year\n\n\nfunction weekday(week, day, firstDay) {\n  return day + week * 7 - (firstDay + 6) % 7;\n} // -- LOCAL TIME --\n\n\nconst localGet = {\n  [_units.YEAR]: d => d.getFullYear(),\n  [_units.QUARTER]: d => 3 * ~~(d.getMonth() / 3),\n  [_units.MONTH]: d => d.getMonth(),\n  [_units.DATE]: d => d.getDate(),\n  [_units.HOURS]: d => d.getHours(),\n  [_units.MINUTES]: d => d.getMinutes(),\n  [_units.SECONDS]: d => d.getSeconds(),\n  [_units.MILLISECONDS]: d => d.getMilliseconds(),\n  [_units.DAY]: (d, y) => weekday(1, d.getDay(), localFirst(y)),\n  [_units.WEEK]: (d, y) => weekday(localWeekNum(d), 0, localFirst(y)),\n  [_units.WEEK + _units.DAY]: (d, y) => weekday(localWeekNum(d), d.getDay(), localFirst(y))\n};\n\nfunction localYear(y) {\n  t0.setFullYear(y);\n  t0.setMonth(0);\n  t0.setDate(1);\n  t0.setHours(0, 0, 0, 0);\n  return t0;\n}\n\nfunction localWeekNum(d) {\n  return _d3Time.timeWeek.count(localYear(d.getFullYear()) - 1, d);\n}\n\nfunction localFirst(y) {\n  return localYear(y).getDay();\n}\n\nfunction localDate(y, m, d, H, M, S, L) {\n  if (0 <= y && y < 100) {\n    var date = new Date(-1, m, d, H, M, S, L);\n    date.setFullYear(y);\n    return date;\n  }\n\n  return new Date(y, m, d, H, M, S, L);\n}\n\nfunction timeFloor(units, step) {\n  return floor(units, step || 1, localGet, localDate);\n} // -- UTC TIME --\n\n\nconst utcGet = {\n  [_units.YEAR]: d => d.getUTCFullYear(),\n  [_units.QUARTER]: d => 3 * ~~(d.getUTCMonth() / 3),\n  [_units.MONTH]: d => d.getUTCMonth(),\n  [_units.DATE]: d => d.getUTCDate(),\n  [_units.HOURS]: d => d.getUTCHours(),\n  [_units.MINUTES]: d => d.getUTCMinutes(),\n  [_units.SECONDS]: d => d.getUTCSeconds(),\n  [_units.MILLISECONDS]: d => d.getUTCMilliseconds(),\n  [_units.DAY]: (d, y) => weekday(1, d.getUTCDay(), utcFirst(y)),\n  [_units.WEEK]: (d, y) => weekday(utcWeekNum(d), 0, utcFirst(y)),\n  [_units.WEEK + _units.DAY]: (d, y) => weekday(utcWeekNum(d), d.getUTCDay(), utcFirst(y))\n};\n\nfunction utcWeekNum(d) {\n  const y = Date.UTC(d.getUTCFullYear(), 0, 1);\n  return _d3Time.utcWeek.count(y - 1, d);\n}\n\nfunction utcFirst(y) {\n  t0.setTime(Date.UTC(y, 0, 1));\n  return t0.getUTCDay();\n}\n\nfunction utcDate(y, m, d, H, M, S, L) {\n  if (0 <= y && y < 100) {\n    var date = new Date(Date.UTC(-1, m, d, H, M, S, L));\n    date.setUTCFullYear(d.y);\n    return date;\n  }\n\n  return new Date(Date.UTC(y, m, d, H, M, S, L));\n}\n\nfunction utcFloor(units, step) {\n  return floor(units, step || 1, utcGet, utcDate);\n}\n},{\"./units\":\"tLSM\",\"vega-util\":\"d61Z\",\"d3-time\":\"hQYG\"}],\"eiOQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.timeInterval = timeInterval;\nexports.utcInterval = utcInterval;\nexports.timeOffset = timeOffset;\nexports.utcOffset = utcOffset;\nexports.timeSequence = timeSequence;\nexports.utcSequence = utcSequence;\n\nvar _units = require(\"./units\");\n\nvar _d3Time = require(\"d3-time\");\n\nconst timeIntervals = {\n  [_units.YEAR]: _d3Time.timeYear,\n  [_units.QUARTER]: _d3Time.timeMonth.every(3),\n  [_units.MONTH]: _d3Time.timeMonth,\n  [_units.WEEK]: _d3Time.timeWeek,\n  [_units.DATE]: _d3Time.timeDay,\n  [_units.DAY]: _d3Time.timeDay,\n  [_units.HOURS]: _d3Time.timeHour,\n  [_units.MINUTES]: _d3Time.timeMinute,\n  [_units.SECONDS]: _d3Time.timeSecond,\n  [_units.MILLISECONDS]: _d3Time.timeMillisecond\n};\nconst utcIntervals = {\n  [_units.YEAR]: _d3Time.utcYear,\n  [_units.QUARTER]: _d3Time.utcMonth.every(3),\n  [_units.MONTH]: _d3Time.utcMonth,\n  [_units.WEEK]: _d3Time.utcWeek,\n  [_units.DATE]: _d3Time.utcDay,\n  [_units.DAY]: _d3Time.utcDay,\n  [_units.HOURS]: _d3Time.utcHour,\n  [_units.MINUTES]: _d3Time.utcMinute,\n  [_units.SECONDS]: _d3Time.utcSecond,\n  [_units.MILLISECONDS]: _d3Time.utcMillisecond\n};\n\nfunction timeInterval(unit) {\n  return timeIntervals[unit];\n}\n\nfunction utcInterval(unit) {\n  return utcIntervals[unit];\n}\n\nfunction offset(ival, date, step) {\n  return ival ? ival.offset(date, step) : undefined;\n}\n\nfunction timeOffset(unit, date, step) {\n  return offset(timeInterval(unit), date, step);\n}\n\nfunction utcOffset(unit, date, step) {\n  return offset(utcInterval(unit), date, step);\n}\n\nfunction sequence(ival, start, stop, step) {\n  return ival ? ival.range(start, stop, step) : undefined;\n}\n\nfunction timeSequence(unit, start, stop, step) {\n  return sequence(timeInterval(unit), start, stop, step);\n}\n\nfunction utcSequence(unit, start, stop, step) {\n  return sequence(utcInterval(unit), start, stop, step);\n}\n},{\"./units\":\"tLSM\",\"d3-time\":\"hQYG\"}],\"lt6a\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.timeUnitSpecifier = timeUnitSpecifier;\nexports.timeFormat = timeFormat;\nexports.utcFormat = utcFormat;\n\nvar _units = require(\"./units\");\n\nvar _interval = require(\"./interval\");\n\nvar _d3TimeFormat = require(\"d3-time-format\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nconst defaultSpecifiers = {\n  [_units.YEAR]: '%Y ',\n  [_units.QUARTER]: 'Q%q ',\n  [_units.MONTH]: '%b ',\n  [_units.DATE]: '%d ',\n  [_units.WEEK]: 'W%U ',\n  [_units.DAY]: '%a ',\n  [_units.HOURS]: '%H:00',\n  [_units.MINUTES]: '00:%M',\n  [_units.SECONDS]: ':%S',\n  [_units.MILLISECONDS]: '.%L',\n  [`${_units.YEAR}-${_units.MONTH}`]: '%Y-%m ',\n  [`${_units.YEAR}-${_units.MONTH}-${_units.DATE}`]: '%Y-%m-%d ',\n  [`${_units.HOURS}-${_units.MINUTES}`]: '%H:%M'\n};\n\nfunction timeUnitSpecifier(units, specifiers) {\n  const s = (0, _vegaUtil.extend)({}, defaultSpecifiers, specifiers),\n        u = (0, _units.timeUnits)(units),\n        n = u.length;\n  let fmt = '',\n      start = 0,\n      end,\n      key;\n\n  for (start = 0; start < n;) {\n    for (end = u.length; end > start; --end) {\n      key = u.slice(start, end).join('-');\n\n      if (s[key] != null) {\n        fmt += s[key];\n        start = end;\n        break;\n      }\n    }\n  }\n\n  return fmt.trim();\n}\n\nfunction timeFormat(specifier) {\n  return formatter(_d3TimeFormat.timeFormat, _interval.timeInterval, specifier);\n}\n\nfunction utcFormat(specifier) {\n  return formatter(_d3TimeFormat.utcFormat, _interval.utcInterval, specifier);\n}\n\nfunction formatter(format, interval, specifier) {\n  return (0, _vegaUtil.isString)(specifier) ? format(specifier) : multiFormat(format, interval, specifier);\n}\n\nfunction multiFormat(format, interval, spec) {\n  spec = spec || {};\n\n  if (!(0, _vegaUtil.isObject)(spec)) {\n    (0, _vegaUtil.error)(`Invalid time multi-format specifier: ${spec}`);\n  }\n\n  const second = interval(_units.SECONDS),\n        minute = interval(_units.MINUTES),\n        hour = interval(_units.HOURS),\n        day = interval(_units.DATE),\n        week = interval(_units.WEEK),\n        month = interval(_units.MONTH),\n        quarter = interval(_units.QUARTER),\n        year = interval(_units.YEAR),\n        L = format(spec[_units.MILLISECONDS] || '.%L'),\n        S = format(spec[_units.SECONDS] || ':%S'),\n        M = format(spec[_units.MINUTES] || '%I:%M'),\n        H = format(spec[_units.HOURS] || '%I %p'),\n        d = format(spec[_units.DATE] || spec[_units.DAY] || '%a %d'),\n        w = format(spec[_units.WEEK] || '%b %d'),\n        m = format(spec[_units.MONTH] || '%B'),\n        q = format(spec[_units.QUARTER] || '%B'),\n        y = format(spec[_units.YEAR] || '%Y');\n  return function (date) {\n    return (second(date) < date ? L : minute(date) < date ? S : hour(date) < date ? M : day(date) < date ? H : month(date) < date ? week(date) < date ? d : w : year(date) < date ? quarter(date) < date ? m : q : y)(date);\n  };\n}\n},{\"./units\":\"tLSM\",\"./interval\":\"eiOQ\",\"d3-time-format\":\"UYpZ\",\"vega-util\":\"d61Z\"}],\"V256\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _units = require(\"./units\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\nconst durationSecond = 1000,\n      durationMinute = durationSecond * 60,\n      durationHour = durationMinute * 60,\n      durationDay = durationHour * 24,\n      durationWeek = durationDay * 7,\n      durationMonth = durationDay * 30,\n      durationYear = durationDay * 365;\nconst Milli = [_units.YEAR, _units.MONTH, _units.DATE, _units.HOURS, _units.MINUTES, _units.SECONDS, _units.MILLISECONDS],\n      Seconds = Milli.slice(0, -1),\n      Minutes = Seconds.slice(0, -1),\n      Hours = Minutes.slice(0, -1),\n      Day = Hours.slice(0, -1),\n      Week = [_units.YEAR, _units.WEEK],\n      Month = [_units.YEAR, _units.MONTH],\n      Year = [_units.YEAR];\nconst intervals = [[Seconds, 1, durationSecond], [Seconds, 5, 5 * durationSecond], [Seconds, 15, 15 * durationSecond], [Seconds, 30, 30 * durationSecond], [Minutes, 1, durationMinute], [Minutes, 5, 5 * durationMinute], [Minutes, 15, 15 * durationMinute], [Minutes, 30, 30 * durationMinute], [Hours, 1, durationHour], [Hours, 3, 3 * durationHour], [Hours, 6, 6 * durationHour], [Hours, 12, 12 * durationHour], [Day, 1, durationDay], [Week, 1, durationWeek], [Month, 1, durationMonth], [Month, 3, 3 * durationMonth], [Year, 1, durationYear]];\n\nfunction _default(opt) {\n  const ext = opt.extent,\n        max = opt.maxbins || 40,\n        target = Math.abs((0, _vegaUtil.span)(ext)) / max;\n  let i = (0, _d3Array.bisector)(i => i[2]).right(intervals, target),\n      units,\n      step;\n\n  if (i === intervals.length) {\n    units = Year, step = (0, _d3Array.tickStep)(ext[0] / durationYear, ext[1] / durationYear, max);\n  } else if (i) {\n    i = intervals[target / intervals[i - 1][2] < intervals[i][2] / target ? i - 1 : i];\n    units = i[0];\n    step = i[1];\n  } else {\n    units = Milli;\n    step = Math.max((0, _d3Array.tickStep)(ext[0], ext[1], max), 1);\n  }\n\n  return {\n    units,\n    step\n  };\n}\n},{\"./units\":\"tLSM\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\"}],\"ErfR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"timeUnits\", {\n  enumerable: true,\n  get: function () {\n    return _units.timeUnits;\n  }\n});\nObject.defineProperty(exports, \"timeFloor\", {\n  enumerable: true,\n  get: function () {\n    return _floor.timeFloor;\n  }\n});\nObject.defineProperty(exports, \"utcFloor\", {\n  enumerable: true,\n  get: function () {\n    return _floor.utcFloor;\n  }\n});\nObject.defineProperty(exports, \"timeUnitSpecifier\", {\n  enumerable: true,\n  get: function () {\n    return _format.timeUnitSpecifier;\n  }\n});\nObject.defineProperty(exports, \"timeFormat\", {\n  enumerable: true,\n  get: function () {\n    return _format.timeFormat;\n  }\n});\nObject.defineProperty(exports, \"utcFormat\", {\n  enumerable: true,\n  get: function () {\n    return _format.utcFormat;\n  }\n});\nObject.defineProperty(exports, \"timeInterval\", {\n  enumerable: true,\n  get: function () {\n    return _interval.timeInterval;\n  }\n});\nObject.defineProperty(exports, \"timeOffset\", {\n  enumerable: true,\n  get: function () {\n    return _interval.timeOffset;\n  }\n});\nObject.defineProperty(exports, \"timeSequence\", {\n  enumerable: true,\n  get: function () {\n    return _interval.timeSequence;\n  }\n});\nObject.defineProperty(exports, \"utcInterval\", {\n  enumerable: true,\n  get: function () {\n    return _interval.utcInterval;\n  }\n});\nObject.defineProperty(exports, \"utcOffset\", {\n  enumerable: true,\n  get: function () {\n    return _interval.utcOffset;\n  }\n});\nObject.defineProperty(exports, \"utcSequence\", {\n  enumerable: true,\n  get: function () {\n    return _interval.utcSequence;\n  }\n});\nObject.defineProperty(exports, \"timeBin\", {\n  enumerable: true,\n  get: function () {\n    return _bin.default;\n  }\n});\n\nvar _units = require(\"./src/units\");\n\nvar _floor = require(\"./src/floor\");\n\nvar _format = require(\"./src/format\");\n\nvar _interval = require(\"./src/interval\");\n\nvar _bin = _interopRequireDefault(require(\"./src/bin\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/units\":\"tLSM\",\"./src/floor\":\"Fr5o\",\"./src/format\":\"lt6a\",\"./src/interval\":\"eiOQ\",\"./src/bin\":\"V256\"}],\"CizL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = TimeUnit;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaTime = require(\"vega-time\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Discretize dates to specific time units.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The data field containing date/time values.\n */\nfunction TimeUnit(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nconst OUTPUT = ['unit0', 'unit1'];\nTimeUnit.Definition = {\n  \"type\": \"TimeUnit\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"interval\",\n    \"type\": \"boolean\",\n    \"default\": true\n  }, {\n    \"name\": \"units\",\n    \"type\": \"string\",\n    \"array\": true\n  }, {\n    \"name\": \"step\",\n    \"type\": \"number\",\n    \"default\": 1\n  }, {\n    \"name\": \"timezone\",\n    \"type\": \"enum\",\n    \"default\": \"local\",\n    \"values\": [\"local\", \"utc\"]\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": OUTPUT\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(TimeUnit, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var field = _.field,\n      band = _.interval !== false,\n      utc = _.timezone === 'utc',\n      floor = this._floor(_, pulse),\n      offset = (utc ? _vegaTime.utcInterval : _vegaTime.timeInterval)(floor.unit).offset,\n      as = _.as || OUTPUT,\n      u0 = as[0],\n      u1 = as[1],\n      min = floor.start || Infinity,\n      max = floor.stop || -Infinity,\n      step = floor.step,\n      flag = pulse.ADD;\n\n  if (_.modified() || pulse.modified((0, _vegaUtil.accessorFields)(_.field))) {\n    pulse = pulse.reflow(true);\n    flag = pulse.SOURCE;\n    min = Infinity;\n    max = -Infinity;\n  }\n\n  pulse.visit(flag, function (t) {\n    var v = field(t),\n        a,\n        b;\n\n    if (v == null) {\n      t[u0] = null;\n      if (band) t[u1] = null;\n    } else {\n      t[u0] = a = b = floor(v);\n      if (band) t[u1] = b = offset(a, step);\n      if (a < min) min = a;\n      if (b > max) max = b;\n    }\n  });\n  floor.start = min;\n  floor.stop = max;\n  return pulse.modifies(band ? as : u0);\n};\n\nprototype._floor = function (_, pulse) {\n  const utc = _.timezone === 'utc'; // get parameters\n\n  let {\n    units,\n    step\n  } = _.units ? {\n    units: _.units,\n    step: _.step || 1\n  } : (0, _vegaTime.timeBin)({\n    extent: (0, _vegaUtil.extent)(pulse.materialize(pulse.SOURCE).source, _.field),\n    maxbins: _.maxbins\n  }); // check / standardize time units\n\n  units = (0, _vegaTime.timeUnits)(units);\n  const prev = this.value || {},\n        floor = (utc ? _vegaTime.utcFloor : _vegaTime.timeFloor)(units, step);\n  floor.unit = (0, _vegaUtil.peek)(units);\n  floor.units = units;\n  floor.step = step;\n  floor.start = prev.start;\n  floor.stop = prev.stop;\n  return this.value = floor;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-time\":\"ErfR\",\"vega-util\":\"d61Z\"}],\"nLp8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = TupleIndex;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * An index that maps from unique, string-coerced, field values to tuples.\n * Assumes that the field serves as a unique key with no duplicate values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The field accessor to index.\n */\nfunction TupleIndex(params) {\n  _vegaDataflow.Transform.call(this, (0, _vegaUtil.fastmap)(), params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(TupleIndex, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var df = pulse.dataflow,\n      field = _.field,\n      index = this.value,\n      mod = true;\n\n  function set(t) {\n    index.set(field(t), t);\n  }\n\n  if (_.modified('field') || pulse.modified(field.fields)) {\n    index.clear();\n    pulse.visit(pulse.SOURCE, set);\n  } else if (pulse.changed()) {\n    pulse.visit(pulse.REM, function (t) {\n      index.delete(field(t));\n    });\n    pulse.visit(pulse.ADD, set);\n  } else {\n    mod = false;\n  }\n\n  this.modified(mod);\n  if (index.empty > df.cleanThreshold) df.runAfter(index.clean);\n  return pulse.fork();\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"zB9A\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Values;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Extracts an array of values. Assumes the source data has already been\n * reduced as needed (e.g., by an upstream Aggregate transform).\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The domain field to extract.\n * @param {function(*,*): number} [params.sort] - An optional\n *   comparator function for sorting the values. The comparator will be\n *   applied to backing tuples prior to value extraction.\n */\nfunction Values(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Values, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var run = !this.value || _.modified('field') || _.modified('sort') || pulse.changed() || _.sort && pulse.modified(_.sort.fields);\n\n  if (run) {\n    this.value = (_.sort ? pulse.source.slice().sort((0, _vegaDataflow.stableCompare)(_.sort)) : pulse.source).map(_.field);\n  }\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"qjDI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WindowOp = WindowOp;\nexports.ValidWindowOps = exports.WindowOps = void 0;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction WindowOp(op, field, param, as) {\n  let fn = WindowOps[op](field, param);\n  return {\n    init: fn.init || _vegaUtil.zero,\n    update: function (w, t) {\n      t[as] = fn.next(w);\n    }\n  };\n}\n\nconst WindowOps = {\n  row_number: function () {\n    return {\n      next: w => w.index + 1\n    };\n  },\n  rank: function () {\n    let rank;\n    return {\n      init: () => rank = 1,\n      next: w => {\n        let i = w.index,\n            data = w.data;\n        return i && w.compare(data[i - 1], data[i]) ? rank = i + 1 : rank;\n      }\n    };\n  },\n  dense_rank: function () {\n    let drank;\n    return {\n      init: () => drank = 1,\n      next: w => {\n        let i = w.index,\n            d = w.data;\n        return i && w.compare(d[i - 1], d[i]) ? ++drank : drank;\n      }\n    };\n  },\n  percent_rank: function () {\n    let rank = WindowOps.rank(),\n        next = rank.next;\n    return {\n      init: rank.init,\n      next: w => (next(w) - 1) / (w.data.length - 1)\n    };\n  },\n  cume_dist: function () {\n    let cume;\n    return {\n      init: () => cume = 0,\n      next: w => {\n        let i = w.index,\n            d = w.data,\n            c = w.compare;\n\n        if (cume < i) {\n          while (i + 1 < d.length && !c(d[i], d[i + 1])) ++i;\n\n          cume = i;\n        }\n\n        return (1 + cume) / d.length;\n      }\n    };\n  },\n  ntile: function (field, num) {\n    num = +num;\n    if (!(num > 0)) (0, _vegaUtil.error)('ntile num must be greater than zero.');\n    let cume = WindowOps.cume_dist(),\n        next = cume.next;\n    return {\n      init: cume.init,\n      next: w => Math.ceil(num * next(w))\n    };\n  },\n  lag: function (field, offset) {\n    offset = +offset || 1;\n    return {\n      next: w => {\n        let i = w.index - offset;\n        return i >= 0 ? field(w.data[i]) : null;\n      }\n    };\n  },\n  lead: function (field, offset) {\n    offset = +offset || 1;\n    return {\n      next: w => {\n        let i = w.index + offset,\n            d = w.data;\n        return i < d.length ? field(d[i]) : null;\n      }\n    };\n  },\n  first_value: function (field) {\n    return {\n      next: w => field(w.data[w.i0])\n    };\n  },\n  last_value: function (field) {\n    return {\n      next: w => field(w.data[w.i1 - 1])\n    };\n  },\n  nth_value: function (field, nth) {\n    nth = +nth;\n    if (!(nth > 0)) (0, _vegaUtil.error)('nth_value nth must be greater than zero.');\n    return {\n      next: w => {\n        let i = w.i0 + (nth - 1);\n        return i < w.i1 ? field(w.data[i]) : null;\n      }\n    };\n  },\n  prev_value: function (field) {\n    let prev = null;\n    return {\n      next: w => {\n        let v = field(w.data[w.index]);\n        return v != null ? prev = v : prev;\n      }\n    };\n  },\n  next_value: function (field) {\n    let v = null,\n        i = -1;\n    return {\n      next: w => {\n        let d = w.data;\n        return w.index <= i ? v : (i = find(field, d, w.index)) < 0 ? (i = d.length, v = null) : v = field(d[i]);\n      }\n    };\n  }\n};\nexports.WindowOps = WindowOps;\n\nfunction find(field, data, index) {\n  for (let n = data.length; index < n; ++index) {\n    let v = field(data[index]);\n    if (v != null) return index;\n  }\n\n  return -1;\n}\n\nvar ValidWindowOps = Object.keys(WindowOps);\nexports.ValidWindowOps = ValidWindowOps;\n},{\"vega-util\":\"d61Z\"}],\"W5Ja\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = WindowState;\n\nvar _AggregateOps = require(\"./AggregateOps\");\n\nvar _TupleStore = _interopRequireDefault(require(\"./TupleStore\"));\n\nvar _WindowOps = require(\"./WindowOps\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction WindowState(_) {\n  let self = this,\n      ops = (0, _vegaUtil.array)(_.ops),\n      fields = (0, _vegaUtil.array)(_.fields),\n      params = (0, _vegaUtil.array)(_.params),\n      as = (0, _vegaUtil.array)(_.as),\n      outputs = self.outputs = [],\n      windows = self.windows = [],\n      inputs = {},\n      map = {},\n      countOnly = true,\n      counts = [],\n      measures = [];\n\n  function visitInputs(f) {\n    (0, _vegaUtil.array)((0, _vegaUtil.accessorFields)(f)).forEach(_ => inputs[_] = 1);\n  }\n\n  visitInputs(_.sort);\n  ops.forEach(function (op, i) {\n    let field = fields[i],\n        mname = (0, _vegaUtil.accessorName)(field),\n        name = (0, _AggregateOps.measureName)(op, mname, as[i]);\n    visitInputs(field);\n    outputs.push(name); // Window operation\n\n    if ((0, _vegaUtil.hasOwnProperty)(_WindowOps.WindowOps, op)) {\n      windows.push((0, _WindowOps.WindowOp)(op, fields[i], params[i], name));\n    } // Aggregate operation\n    else {\n        if (field == null && op !== 'count') {\n          (0, _vegaUtil.error)('Null aggregate field specified.');\n        }\n\n        if (op === 'count') {\n          counts.push(name);\n          return;\n        }\n\n        countOnly = false;\n        let m = map[mname];\n\n        if (!m) {\n          m = map[mname] = [];\n          m.field = field;\n          measures.push(m);\n        }\n\n        m.push((0, _AggregateOps.createMeasure)(op, name));\n      }\n  });\n\n  if (counts.length || measures.length) {\n    self.cell = cell(measures, counts, countOnly);\n  }\n\n  self.inputs = Object.keys(inputs);\n}\n\nconst prototype = WindowState.prototype;\n\nprototype.init = function () {\n  this.windows.forEach(_ => _.init());\n  if (this.cell) this.cell.init();\n};\n\nprototype.update = function (w, t) {\n  let self = this,\n      cell = self.cell,\n      wind = self.windows,\n      data = w.data,\n      m = wind && wind.length,\n      j;\n\n  if (cell) {\n    for (j = w.p0; j < w.i0; ++j) cell.rem(data[j]);\n\n    for (j = w.p1; j < w.i1; ++j) cell.add(data[j]);\n\n    cell.set(t);\n  }\n\n  for (j = 0; j < m; ++j) wind[j].update(w, t);\n};\n\nfunction cell(measures, counts, countOnly) {\n  measures = measures.map(m => (0, _AggregateOps.compileMeasures)(m, m.field));\n  let cell = {\n    num: 0,\n    agg: null,\n    store: false,\n    count: counts\n  };\n\n  if (!countOnly) {\n    var n = measures.length,\n        a = cell.agg = Array(n),\n        i = 0;\n\n    for (; i < n; ++i) a[i] = new measures[i](cell);\n  }\n\n  if (cell.store) {\n    var store = cell.data = new _TupleStore.default();\n  }\n\n  cell.add = function (t) {\n    cell.num += 1;\n    if (countOnly) return;\n    if (store) store.add(t);\n\n    for (let i = 0; i < n; ++i) {\n      a[i].add(a[i].get(t), t);\n    }\n  };\n\n  cell.rem = function (t) {\n    cell.num -= 1;\n    if (countOnly) return;\n    if (store) store.rem(t);\n\n    for (let i = 0; i < n; ++i) {\n      a[i].rem(a[i].get(t), t);\n    }\n  };\n\n  cell.set = function (t) {\n    let i, n; // consolidate stored values\n\n    if (store) store.values(); // update tuple properties\n\n    for (i = 0, n = counts.length; i < n; ++i) t[counts[i]] = cell.num;\n\n    if (!countOnly) for (i = 0, n = a.length; i < n; ++i) a[i].set(t);\n  };\n\n  cell.init = function () {\n    cell.num = 0;\n    if (store) store.reset();\n\n    for (let i = 0; i < n; ++i) a[i].init();\n  };\n\n  return cell;\n}\n},{\"./AggregateOps\":\"Fivq\",\"./TupleStore\":\"vdlC\",\"./WindowOps\":\"qjDI\",\"vega-util\":\"d61Z\"}],\"mvKT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Window;\n\nvar _AggregateKeys = require(\"./util/AggregateKeys\");\n\nvar _AggregateOps = require(\"./util/AggregateOps\");\n\nvar _SortedList = _interopRequireDefault(require(\"./util/SortedList\"));\n\nvar _WindowOps = require(\"./util/WindowOps\");\n\nvar _WindowState = _interopRequireDefault(require(\"./util/WindowState\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Perform window calculations and write results to the input stream.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator function for sorting tuples within a window.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors by which to partition tuples into separate windows.\n * @param {Array<string>} params.ops - An array of strings indicating window operations to perform.\n * @param {Array<function(object): *>} [params.fields] - An array of accessors\n *   for data fields to use as inputs to window operations.\n * @param {Array<*>} [params.params] - An array of parameter values for window operations.\n * @param {Array<string>} [params.as] - An array of output field names for window operations.\n * @param {Array<number>} [params.frame] - Window frame definition as two-element array.\n * @param {boolean} [params.ignorePeers=false] - If true, base window frame boundaries on row\n *   number alone, ignoring peers with identical sort values. If false (default),\n *   the window boundaries will be adjusted to include peer values.\n */\nfunction Window(params) {\n  _vegaDataflow.Transform.call(this, {}, params);\n\n  this._mlen = 0;\n  this._mods = [];\n}\n\nWindow.Definition = {\n  \"type\": \"Window\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"sort\",\n    \"type\": \"compare\"\n  }, {\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"ops\",\n    \"type\": \"enum\",\n    \"array\": true,\n    \"values\": _WindowOps.ValidWindowOps.concat(_AggregateOps.ValidAggregateOps)\n  }, {\n    \"name\": \"params\",\n    \"type\": \"number\",\n    \"null\": true,\n    \"array\": true\n  }, {\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"null\": true,\n    \"array\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"null\": true,\n    \"array\": true\n  }, {\n    \"name\": \"frame\",\n    \"type\": \"number\",\n    \"null\": true,\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [null, 0]\n  }, {\n    \"name\": \"ignorePeers\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Window, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var self = this,\n      state = self.state,\n      mod = _.modified(),\n      cmp = (0, _vegaDataflow.stableCompare)(_.sort),\n      i,\n      n;\n\n  this.stamp = pulse.stamp; // initialize window state\n\n  if (!state || mod) {\n    state = self.state = new _WindowState.default(_);\n  } // retrieve group for a tuple\n\n\n  var key = (0, _AggregateKeys.groupkey)(_.groupby);\n\n  function group(t) {\n    return self.group(key(t));\n  } // partition input tuples\n\n\n  if (mod || pulse.modified(state.inputs)) {\n    self.value = {};\n    pulse.visit(pulse.SOURCE, function (t) {\n      group(t).add(t);\n    });\n  } else {\n    pulse.visit(pulse.REM, function (t) {\n      group(t).remove(t);\n    });\n    pulse.visit(pulse.ADD, function (t) {\n      group(t).add(t);\n    });\n  } // perform window calculations for each modified partition\n\n\n  for (i = 0, n = self._mlen; i < n; ++i) {\n    processPartition(self._mods[i], state, cmp, _);\n  }\n\n  self._mlen = 0;\n  self._mods = []; // TODO don't reflow everything?\n\n  return pulse.reflow(mod).modifies(state.outputs);\n};\n\nprototype.group = function (key) {\n  var self = this,\n      group = self.value[key];\n\n  if (!group) {\n    group = self.value[key] = (0, _SortedList.default)(_vegaDataflow.tupleid);\n    group.stamp = -1;\n  }\n\n  if (group.stamp < self.stamp) {\n    group.stamp = self.stamp;\n    self._mods[self._mlen++] = group;\n  }\n\n  return group;\n};\n\nfunction processPartition(list, state, cmp, _) {\n  var sort = _.sort,\n      range = sort && !_.ignorePeers,\n      frame = _.frame || [null, 0],\n      data = list.data(cmp),\n      // use cmp for stable sort\n  n = data.length,\n      i = 0,\n      b = range ? (0, _d3Array.bisector)(sort) : null,\n      w = {\n    i0: 0,\n    i1: 0,\n    p0: 0,\n    p1: 0,\n    index: 0,\n    data: data,\n    compare: sort || (0, _vegaUtil.constant)(-1)\n  };\n\n  for (state.init(); i < n; ++i) {\n    setWindow(w, frame, i, n);\n    if (range) adjustRange(w, b);\n    state.update(w, data[i]);\n  }\n}\n\nfunction setWindow(w, f, i, n) {\n  w.p0 = w.i0;\n  w.p1 = w.i1;\n  w.i0 = f[0] == null ? 0 : Math.max(0, i - Math.abs(f[0]));\n  w.i1 = f[1] == null ? n : Math.min(n, i + Math.abs(f[1]) + 1);\n  w.index = i;\n} // if frame type is 'range', adjust window for peer values\n\n\nfunction adjustRange(w, bisect) {\n  var r0 = w.i0,\n      r1 = w.i1 - 1,\n      c = w.compare,\n      d = w.data,\n      n = d.length - 1;\n  if (r0 > 0 && !c(d[r0], d[r0 - 1])) w.i0 = bisect.left(d, d[r0]);\n  if (r1 < n && !c(d[r1], d[r1 + 1])) w.i1 = bisect.right(d, d[r1]);\n}\n},{\"./util/AggregateKeys\":\"bY4j\",\"./util/AggregateOps\":\"Fivq\",\"./util/SortedList\":\"BJ5a\",\"./util/WindowOps\":\"qjDI\",\"./util/WindowState\":\"W5Ja\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\"}],\"hbKl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"aggregate\", {\n  enumerable: true,\n  get: function () {\n    return _Aggregate.default;\n  }\n});\nObject.defineProperty(exports, \"bin\", {\n  enumerable: true,\n  get: function () {\n    return _Bin.default;\n  }\n});\nObject.defineProperty(exports, \"collect\", {\n  enumerable: true,\n  get: function () {\n    return _Collect.default;\n  }\n});\nObject.defineProperty(exports, \"compare\", {\n  enumerable: true,\n  get: function () {\n    return _Compare.default;\n  }\n});\nObject.defineProperty(exports, \"countpattern\", {\n  enumerable: true,\n  get: function () {\n    return _CountPattern.default;\n  }\n});\nObject.defineProperty(exports, \"cross\", {\n  enumerable: true,\n  get: function () {\n    return _Cross.default;\n  }\n});\nObject.defineProperty(exports, \"density\", {\n  enumerable: true,\n  get: function () {\n    return _Density.default;\n  }\n});\nObject.defineProperty(exports, \"dotbin\", {\n  enumerable: true,\n  get: function () {\n    return _DotBin.default;\n  }\n});\nObject.defineProperty(exports, \"expression\", {\n  enumerable: true,\n  get: function () {\n    return _Expression.default;\n  }\n});\nObject.defineProperty(exports, \"extent\", {\n  enumerable: true,\n  get: function () {\n    return _Extent.default;\n  }\n});\nObject.defineProperty(exports, \"facet\", {\n  enumerable: true,\n  get: function () {\n    return _Facet.default;\n  }\n});\nObject.defineProperty(exports, \"field\", {\n  enumerable: true,\n  get: function () {\n    return _Field.default;\n  }\n});\nObject.defineProperty(exports, \"filter\", {\n  enumerable: true,\n  get: function () {\n    return _Filter.default;\n  }\n});\nObject.defineProperty(exports, \"flatten\", {\n  enumerable: true,\n  get: function () {\n    return _Flatten.default;\n  }\n});\nObject.defineProperty(exports, \"fold\", {\n  enumerable: true,\n  get: function () {\n    return _Fold.default;\n  }\n});\nObject.defineProperty(exports, \"formula\", {\n  enumerable: true,\n  get: function () {\n    return _Formula.default;\n  }\n});\nObject.defineProperty(exports, \"generate\", {\n  enumerable: true,\n  get: function () {\n    return _Generate.default;\n  }\n});\nObject.defineProperty(exports, \"impute\", {\n  enumerable: true,\n  get: function () {\n    return _Impute.default;\n  }\n});\nObject.defineProperty(exports, \"joinaggregate\", {\n  enumerable: true,\n  get: function () {\n    return _JoinAggregate.default;\n  }\n});\nObject.defineProperty(exports, \"kde\", {\n  enumerable: true,\n  get: function () {\n    return _KDE.default;\n  }\n});\nObject.defineProperty(exports, \"key\", {\n  enumerable: true,\n  get: function () {\n    return _Key.default;\n  }\n});\nObject.defineProperty(exports, \"load\", {\n  enumerable: true,\n  get: function () {\n    return _Load.default;\n  }\n});\nObject.defineProperty(exports, \"lookup\", {\n  enumerable: true,\n  get: function () {\n    return _Lookup.default;\n  }\n});\nObject.defineProperty(exports, \"multiextent\", {\n  enumerable: true,\n  get: function () {\n    return _MultiExtent.default;\n  }\n});\nObject.defineProperty(exports, \"multivalues\", {\n  enumerable: true,\n  get: function () {\n    return _MultiValues.default;\n  }\n});\nObject.defineProperty(exports, \"params\", {\n  enumerable: true,\n  get: function () {\n    return _Params.default;\n  }\n});\nObject.defineProperty(exports, \"pivot\", {\n  enumerable: true,\n  get: function () {\n    return _Pivot.default;\n  }\n});\nObject.defineProperty(exports, \"prefacet\", {\n  enumerable: true,\n  get: function () {\n    return _PreFacet.default;\n  }\n});\nObject.defineProperty(exports, \"project\", {\n  enumerable: true,\n  get: function () {\n    return _Project.default;\n  }\n});\nObject.defineProperty(exports, \"proxy\", {\n  enumerable: true,\n  get: function () {\n    return _Proxy.default;\n  }\n});\nObject.defineProperty(exports, \"quantile\", {\n  enumerable: true,\n  get: function () {\n    return _Quantile.default;\n  }\n});\nObject.defineProperty(exports, \"relay\", {\n  enumerable: true,\n  get: function () {\n    return _Relay.default;\n  }\n});\nObject.defineProperty(exports, \"sample\", {\n  enumerable: true,\n  get: function () {\n    return _Sample.default;\n  }\n});\nObject.defineProperty(exports, \"sequence\", {\n  enumerable: true,\n  get: function () {\n    return _Sequence.default;\n  }\n});\nObject.defineProperty(exports, \"sieve\", {\n  enumerable: true,\n  get: function () {\n    return _Sieve.default;\n  }\n});\nObject.defineProperty(exports, \"subflow\", {\n  enumerable: true,\n  get: function () {\n    return _Subflow.default;\n  }\n});\nObject.defineProperty(exports, \"timeunit\", {\n  enumerable: true,\n  get: function () {\n    return _TimeUnit.default;\n  }\n});\nObject.defineProperty(exports, \"tupleindex\", {\n  enumerable: true,\n  get: function () {\n    return _TupleIndex.default;\n  }\n});\nObject.defineProperty(exports, \"values\", {\n  enumerable: true,\n  get: function () {\n    return _Values.default;\n  }\n});\nObject.defineProperty(exports, \"window\", {\n  enumerable: true,\n  get: function () {\n    return _Window.default;\n  }\n});\n\nvar _Aggregate = _interopRequireDefault(require(\"./src/Aggregate\"));\n\nvar _Bin = _interopRequireDefault(require(\"./src/Bin\"));\n\nvar _Collect = _interopRequireDefault(require(\"./src/Collect\"));\n\nvar _Compare = _interopRequireDefault(require(\"./src/Compare\"));\n\nvar _CountPattern = _interopRequireDefault(require(\"./src/CountPattern\"));\n\nvar _Cross = _interopRequireDefault(require(\"./src/Cross\"));\n\nvar _Density = _interopRequireDefault(require(\"./src/Density\"));\n\nvar _DotBin = _interopRequireDefault(require(\"./src/DotBin\"));\n\nvar _Expression = _interopRequireDefault(require(\"./src/Expression\"));\n\nvar _Extent = _interopRequireDefault(require(\"./src/Extent\"));\n\nvar _Facet = _interopRequireDefault(require(\"./src/Facet\"));\n\nvar _Field = _interopRequireDefault(require(\"./src/Field\"));\n\nvar _Filter = _interopRequireDefault(require(\"./src/Filter\"));\n\nvar _Flatten = _interopRequireDefault(require(\"./src/Flatten\"));\n\nvar _Fold = _interopRequireDefault(require(\"./src/Fold\"));\n\nvar _Formula = _interopRequireDefault(require(\"./src/Formula\"));\n\nvar _Generate = _interopRequireDefault(require(\"./src/Generate\"));\n\nvar _Impute = _interopRequireDefault(require(\"./src/Impute\"));\n\nvar _JoinAggregate = _interopRequireDefault(require(\"./src/JoinAggregate\"));\n\nvar _KDE = _interopRequireDefault(require(\"./src/KDE\"));\n\nvar _Key = _interopRequireDefault(require(\"./src/Key\"));\n\nvar _Load = _interopRequireDefault(require(\"./src/Load\"));\n\nvar _Lookup = _interopRequireDefault(require(\"./src/Lookup\"));\n\nvar _MultiExtent = _interopRequireDefault(require(\"./src/MultiExtent\"));\n\nvar _MultiValues = _interopRequireDefault(require(\"./src/MultiValues\"));\n\nvar _Params = _interopRequireDefault(require(\"./src/Params\"));\n\nvar _Pivot = _interopRequireDefault(require(\"./src/Pivot\"));\n\nvar _PreFacet = _interopRequireDefault(require(\"./src/PreFacet\"));\n\nvar _Project = _interopRequireDefault(require(\"./src/Project\"));\n\nvar _Proxy = _interopRequireDefault(require(\"./src/Proxy\"));\n\nvar _Quantile = _interopRequireDefault(require(\"./src/Quantile\"));\n\nvar _Relay = _interopRequireDefault(require(\"./src/Relay\"));\n\nvar _Sample = _interopRequireDefault(require(\"./src/Sample\"));\n\nvar _Sequence = _interopRequireDefault(require(\"./src/Sequence\"));\n\nvar _Sieve = _interopRequireDefault(require(\"./src/Sieve\"));\n\nvar _Subflow = _interopRequireDefault(require(\"./src/Subflow\"));\n\nvar _TimeUnit = _interopRequireDefault(require(\"./src/TimeUnit\"));\n\nvar _TupleIndex = _interopRequireDefault(require(\"./src/TupleIndex\"));\n\nvar _Values = _interopRequireDefault(require(\"./src/Values\"));\n\nvar _Window = _interopRequireDefault(require(\"./src/Window\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Aggregate\":\"aUqN\",\"./src/Bin\":\"olTP\",\"./src/Collect\":\"HIOI\",\"./src/Compare\":\"kbtQ\",\"./src/CountPattern\":\"gpT4\",\"./src/Cross\":\"pqh6\",\"./src/Density\":\"D2sj\",\"./src/DotBin\":\"wdCE\",\"./src/Expression\":\"Ggmv\",\"./src/Extent\":\"hW43\",\"./src/Facet\":\"xWrR\",\"./src/Field\":\"eE4B\",\"./src/Filter\":\"clIN\",\"./src/Flatten\":\"TXxA\",\"./src/Fold\":\"Xnj8\",\"./src/Formula\":\"C0Ta\",\"./src/Generate\":\"z2uT\",\"./src/Impute\":\"zcbA\",\"./src/JoinAggregate\":\"szfy\",\"./src/KDE\":\"JDVY\",\"./src/Key\":\"GJ0r\",\"./src/Load\":\"hlH5\",\"./src/Lookup\":\"DF1U\",\"./src/MultiExtent\":\"eQPl\",\"./src/MultiValues\":\"Q4vF\",\"./src/Params\":\"uxmI\",\"./src/Pivot\":\"Yq7C\",\"./src/PreFacet\":\"nThC\",\"./src/Project\":\"HdSy\",\"./src/Proxy\":\"uRf7\",\"./src/Quantile\":\"nqPw\",\"./src/Relay\":\"PIyq\",\"./src/Sample\":\"Vm8v\",\"./src/Sequence\":\"wp8w\",\"./src/Sieve\":\"NMRs\",\"./src/Subflow\":\"p4yG\",\"./src/TimeUnit\":\"CizL\",\"./src/TupleIndex\":\"nLp8\",\"./src/Values\":\"zB9A\",\"./src/Window\":\"mvKT\"}],\"OeAt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Row = exports.Column = exports.Flush = exports.Each = exports.All = exports.None = exports.Pad = exports.FitY = exports.FitX = exports.Fit = exports.Symbols = exports.Padding = exports.ColTitle = exports.ColFooter = exports.ColHeader = exports.RowTitle = exports.RowFooter = exports.RowHeader = exports.LegendRole = exports.ScopeRole = exports.FrameRole = exports.TitleRole = exports.AxisRole = exports.Group = exports.Y = exports.X = exports.End = exports.Middle = exports.Start = exports.BottomRight = exports.BottomLeft = exports.TopRight = exports.TopLeft = exports.Bottom = exports.Right = exports.Left = exports.Top = void 0;\nconst Top = 'top';\nexports.Top = Top;\nconst Left = 'left';\nexports.Left = Left;\nconst Right = 'right';\nexports.Right = Right;\nconst Bottom = 'bottom';\nexports.Bottom = Bottom;\nconst TopLeft = 'top-left';\nexports.TopLeft = TopLeft;\nconst TopRight = 'top-right';\nexports.TopRight = TopRight;\nconst BottomLeft = 'bottom-left';\nexports.BottomLeft = BottomLeft;\nconst BottomRight = 'bottom-right';\nexports.BottomRight = BottomRight;\nconst Start = 'start';\nexports.Start = Start;\nconst Middle = 'middle';\nexports.Middle = Middle;\nconst End = 'end';\nexports.End = End;\nconst X = 'x';\nexports.X = X;\nconst Y = 'y';\nexports.Y = Y;\nconst Group = 'group';\nexports.Group = Group;\nconst AxisRole = 'axis';\nexports.AxisRole = AxisRole;\nconst TitleRole = 'title';\nexports.TitleRole = TitleRole;\nconst FrameRole = 'frame';\nexports.FrameRole = FrameRole;\nconst ScopeRole = 'scope';\nexports.ScopeRole = ScopeRole;\nconst LegendRole = 'legend';\nexports.LegendRole = LegendRole;\nconst RowHeader = 'row-header';\nexports.RowHeader = RowHeader;\nconst RowFooter = 'row-footer';\nexports.RowFooter = RowFooter;\nconst RowTitle = 'row-title';\nexports.RowTitle = RowTitle;\nconst ColHeader = 'column-header';\nexports.ColHeader = ColHeader;\nconst ColFooter = 'column-footer';\nexports.ColFooter = ColFooter;\nconst ColTitle = 'column-title';\nexports.ColTitle = ColTitle;\nconst Padding = 'padding';\nexports.Padding = Padding;\nconst Symbols = 'symbol';\nexports.Symbols = Symbols;\nconst Fit = 'fit';\nexports.Fit = Fit;\nconst FitX = 'fit-x';\nexports.FitX = FitX;\nconst FitY = 'fit-y';\nexports.FitY = FitY;\nconst Pad = 'pad';\nexports.Pad = Pad;\nconst None = 'none';\nexports.None = None;\nconst All = 'all';\nexports.All = All;\nconst Each = 'each';\nexports.Each = Each;\nconst Flush = 'flush';\nexports.Flush = Flush;\nconst Column = 'column';\nexports.Column = Column;\nconst Row = 'row';\nexports.Row = Row;\n},{}],\"qFnp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Bounds;\n\nfunction Bounds(b) {\n  this.clear();\n  if (b) this.union(b);\n}\n\nvar prototype = Bounds.prototype;\n\nprototype.clone = function () {\n  return new Bounds(this);\n};\n\nprototype.clear = function () {\n  this.x1 = +Number.MAX_VALUE;\n  this.y1 = +Number.MAX_VALUE;\n  this.x2 = -Number.MAX_VALUE;\n  this.y2 = -Number.MAX_VALUE;\n  return this;\n};\n\nprototype.empty = function () {\n  return this.x1 === +Number.MAX_VALUE && this.y1 === +Number.MAX_VALUE && this.x2 === -Number.MAX_VALUE && this.y2 === -Number.MAX_VALUE;\n};\n\nprototype.equals = function (b) {\n  return this.x1 === b.x1 && this.y1 === b.y1 && this.x2 === b.x2 && this.y2 === b.y2;\n};\n\nprototype.set = function (x1, y1, x2, y2) {\n  if (x2 < x1) {\n    this.x2 = x1;\n    this.x1 = x2;\n  } else {\n    this.x1 = x1;\n    this.x2 = x2;\n  }\n\n  if (y2 < y1) {\n    this.y2 = y1;\n    this.y1 = y2;\n  } else {\n    this.y1 = y1;\n    this.y2 = y2;\n  }\n\n  return this;\n};\n\nprototype.add = function (x, y) {\n  if (x < this.x1) this.x1 = x;\n  if (y < this.y1) this.y1 = y;\n  if (x > this.x2) this.x2 = x;\n  if (y > this.y2) this.y2 = y;\n  return this;\n};\n\nprototype.expand = function (d) {\n  this.x1 -= d;\n  this.y1 -= d;\n  this.x2 += d;\n  this.y2 += d;\n  return this;\n};\n\nprototype.round = function () {\n  this.x1 = Math.floor(this.x1);\n  this.y1 = Math.floor(this.y1);\n  this.x2 = Math.ceil(this.x2);\n  this.y2 = Math.ceil(this.y2);\n  return this;\n};\n\nprototype.translate = function (dx, dy) {\n  this.x1 += dx;\n  this.x2 += dx;\n  this.y1 += dy;\n  this.y2 += dy;\n  return this;\n};\n\nprototype.rotate = function (angle, x, y) {\n  const p = this.rotatedPoints(angle, x, y);\n  return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n};\n\nprototype.rotatedPoints = function (angle, x, y) {\n  var {\n    x1,\n    y1,\n    x2,\n    y2\n  } = this,\n      cos = Math.cos(angle),\n      sin = Math.sin(angle),\n      cx = x - x * cos + y * sin,\n      cy = y - x * sin - y * cos;\n  return [cos * x1 - sin * y1 + cx, sin * x1 + cos * y1 + cy, cos * x1 - sin * y2 + cx, sin * x1 + cos * y2 + cy, cos * x2 - sin * y1 + cx, sin * x2 + cos * y1 + cy, cos * x2 - sin * y2 + cx, sin * x2 + cos * y2 + cy];\n};\n\nprototype.union = function (b) {\n  if (b.x1 < this.x1) this.x1 = b.x1;\n  if (b.y1 < this.y1) this.y1 = b.y1;\n  if (b.x2 > this.x2) this.x2 = b.x2;\n  if (b.y2 > this.y2) this.y2 = b.y2;\n  return this;\n};\n\nprototype.intersect = function (b) {\n  if (b.x1 > this.x1) this.x1 = b.x1;\n  if (b.y1 > this.y1) this.y1 = b.y1;\n  if (b.x2 < this.x2) this.x2 = b.x2;\n  if (b.y2 < this.y2) this.y2 = b.y2;\n  return this;\n};\n\nprototype.encloses = function (b) {\n  return b && this.x1 <= b.x1 && this.x2 >= b.x2 && this.y1 <= b.y1 && this.y2 >= b.y2;\n};\n\nprototype.alignsWith = function (b) {\n  return b && (this.x1 == b.x1 || this.x2 == b.x2 || this.y1 == b.y1 || this.y2 == b.y2);\n};\n\nprototype.intersects = function (b) {\n  return b && !(this.x2 < b.x1 || this.x1 > b.x2 || this.y2 < b.y1 || this.y1 > b.y2);\n};\n\nprototype.contains = function (x, y) {\n  return !(x < this.x1 || x > this.x2 || y < this.y1 || y > this.y2);\n};\n\nprototype.width = function () {\n  return this.x2 - this.x1;\n};\n\nprototype.height = function () {\n  return this.y2 - this.y1;\n};\n},{}],\"ERld\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isGradient = isGradient;\nexports.gradientRef = gradientRef;\nexports.default = _default;\nexports.patternPrefix = void 0;\nvar gradient_id = 0;\nconst patternPrefix = 'p_';\nexports.patternPrefix = patternPrefix;\n\nfunction isGradient(value) {\n  return value && value.gradient;\n}\n\nfunction gradientRef(g, defs, base) {\n  let id = g.id,\n      type = g.gradient,\n      prefix = type === 'radial' ? patternPrefix : ''; // check id, assign default values as needed\n\n  if (!id) {\n    id = g.id = 'gradient_' + gradient_id++;\n\n    if (type === 'radial') {\n      g.x1 = get(g.x1, 0.5);\n      g.y1 = get(g.y1, 0.5);\n      g.r1 = get(g.r1, 0);\n      g.x2 = get(g.x2, 0.5);\n      g.y2 = get(g.y2, 0.5);\n      g.r2 = get(g.r2, 0.5);\n      prefix = patternPrefix;\n    } else {\n      g.x1 = get(g.x1, 0);\n      g.y1 = get(g.y1, 0);\n      g.x2 = get(g.x2, 1);\n      g.y2 = get(g.y2, 0);\n    }\n  } // register definition\n\n\n  defs[id] = g; // return url reference\n\n  return 'url(' + (base || '') + '#' + prefix + id + ')';\n}\n\nfunction get(val, def) {\n  return val != null ? val : def;\n}\n\nfunction _default(p0, p1) {\n  var stops = [],\n      gradient;\n  return gradient = {\n    gradient: 'linear',\n    x1: p0 ? p0[0] : 0,\n    y1: p0 ? p0[1] : 0,\n    x2: p1 ? p1[0] : 1,\n    y2: p1 ? p1[1] : 0,\n    stops: stops,\n    stop: function (offset, color) {\n      stops.push({\n        offset: offset,\n        color: color\n      });\n      return gradient;\n    }\n  };\n}\n},{}],\"AdWX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Item;\n\nvar _Bounds = _interopRequireDefault(require(\"./Bounds\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Item(mark) {\n  this.mark = mark;\n  this.bounds = this.bounds || new _Bounds.default();\n}\n},{\"./Bounds\":\"qFnp\"}],\"T9oK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = GroupItem;\n\nvar _Item = _interopRequireDefault(require(\"./Item\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction GroupItem(mark) {\n  _Item.default.call(this, mark);\n\n  this.items = this.items || [];\n}\n\n(0, _vegaUtil.inherits)(GroupItem, _Item.default);\n},{\"./Item\":\"AdWX\",\"vega-util\":\"d61Z\"}],\"SJoU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.domCanvas = domCanvas;\nexports.domImage = domImage;\n\nfunction domCanvas(w, h) {\n  if (typeof document !== 'undefined' && document.createElement) {\n    var c = document.createElement('canvas');\n\n    if (c && c.getContext) {\n      c.width = w;\n      c.height = h;\n      return c;\n    }\n  }\n\n  return null;\n}\n\nfunction domImage() {\n  return typeof Image !== 'undefined' ? Image : null;\n}\n},{}],\"r2P5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"domCanvas\", {\n  enumerable: true,\n  get: function () {\n    return _domCanvas.domCanvas;\n  }\n});\nObject.defineProperty(exports, \"canvas\", {\n  enumerable: true,\n  get: function () {\n    return _domCanvas.domCanvas;\n  }\n});\nObject.defineProperty(exports, \"image\", {\n  enumerable: true,\n  get: function () {\n    return _domCanvas.domImage;\n  }\n});\n\nvar _domCanvas = require(\"./src/domCanvas\");\n},{\"./src/domCanvas\":\"SJoU\"}],\"sifT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ResourceLoader;\n\nvar _vegaCanvas = require(\"vega-canvas\");\n\nvar _vegaLoader = require(\"vega-loader\");\n\nfunction ResourceLoader(customLoader) {\n  this._pending = 0;\n  this._loader = customLoader || (0, _vegaLoader.loader)();\n}\n\nvar prototype = ResourceLoader.prototype;\n\nprototype.pending = function () {\n  return this._pending;\n};\n\nfunction increment(loader) {\n  loader._pending += 1;\n}\n\nfunction decrement(loader) {\n  loader._pending -= 1;\n}\n\nprototype.sanitizeURL = function (uri) {\n  var loader = this;\n  increment(loader);\n  return loader._loader.sanitize(uri, {\n    context: 'href'\n  }).then(function (opt) {\n    decrement(loader);\n    return opt;\n  }).catch(function () {\n    decrement(loader);\n    return null;\n  });\n};\n\nprototype.loadImage = function (uri) {\n  var loader = this,\n      Image = (0, _vegaCanvas.image)();\n  increment(loader);\n  return loader._loader.sanitize(uri, {\n    context: 'image'\n  }).then(function (opt) {\n    var url = opt.href;\n    if (!url || !Image) throw {\n      url: url\n    };\n    var img = new Image();\n\n    img.onload = function () {\n      decrement(loader);\n    };\n\n    img.onerror = function () {\n      decrement(loader);\n    };\n\n    img.src = url;\n    return img;\n  }).catch(function (e) {\n    decrement(loader);\n    return {\n      complete: false,\n      width: 0,\n      height: 0,\n      src: e && e.url || ''\n    };\n  });\n};\n\nprototype.ready = function () {\n  var loader = this;\n  return new Promise(function (accept) {\n    function poll(value) {\n      if (!loader.pending()) accept(value);else setTimeout(function () {\n        poll(true);\n      }, 10);\n    }\n\n    poll(false);\n  });\n};\n},{\"vega-canvas\":\"r2P5\",\"vega-loader\":\"ELDD\"}],\"hMob\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar pi = Math.PI,\n    tau = 2 * pi,\n    epsilon = 1e-6,\n    tauEpsilon = tau - epsilon;\n\nfunction Path() {\n  this._x0 = this._y0 = // start of current subpath\n  this._x1 = this._y1 = null; // end of current subpath\n\n  this._ = \"\";\n}\n\nfunction path() {\n  return new Path();\n}\n\nPath.prototype = path.prototype = {\n  constructor: Path,\n  moveTo: function (x, y) {\n    this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n  },\n  closePath: function () {\n    if (this._x1 !== null) {\n      this._x1 = this._x0, this._y1 = this._y0;\n      this._ += \"Z\";\n    }\n  },\n  lineTo: function (x, y) {\n    this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  quadraticCurveTo: function (x1, y1, x, y) {\n    this._ += \"Q\" + +x1 + \",\" + +y1 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  bezierCurveTo: function (x1, y1, x2, y2, x, y) {\n    this._ += \"C\" + +x1 + \",\" + +y1 + \",\" + +x2 + \",\" + +y2 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n  },\n  arcTo: function (x1, y1, x2, y2, r) {\n    x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n    var x0 = this._x1,\n        y0 = this._y1,\n        x21 = x2 - x1,\n        y21 = y2 - y1,\n        x01 = x0 - x1,\n        y01 = y0 - y1,\n        l01_2 = x01 * x01 + y01 * y01; // Is the radius negative? Error.\n\n    if (r < 0) throw new Error(\"negative radius: \" + r); // Is this path empty? Move to (x1,y1).\n\n    if (this._x1 === null) {\n      this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n    } // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n    else if (!(l01_2 > epsilon)) ; // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n      // Equivalently, is (x1,y1) coincident with (x2,y2)?\n      // Or, is the radius zero? Line to (x1,y1).\n      else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n          this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n        } // Otherwise, draw an arc!\n        else {\n            var x20 = x2 - x0,\n                y20 = y2 - y0,\n                l21_2 = x21 * x21 + y21 * y21,\n                l20_2 = x20 * x20 + y20 * y20,\n                l21 = Math.sqrt(l21_2),\n                l01 = Math.sqrt(l01_2),\n                l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n                t01 = l / l01,\n                t21 = l / l21; // If the start tangent is not coincident with (x0,y0), line to.\n\n            if (Math.abs(t01 - 1) > epsilon) {\n              this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n            }\n\n            this._ += \"A\" + r + \",\" + r + \",0,0,\" + +(y01 * x20 > x01 * y20) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n          }\n  },\n  arc: function (x, y, r, a0, a1, ccw) {\n    x = +x, y = +y, r = +r, ccw = !!ccw;\n    var dx = r * Math.cos(a0),\n        dy = r * Math.sin(a0),\n        x0 = x + dx,\n        y0 = y + dy,\n        cw = 1 ^ ccw,\n        da = ccw ? a0 - a1 : a1 - a0; // Is the radius negative? Error.\n\n    if (r < 0) throw new Error(\"negative radius: \" + r); // Is this path empty? Move to (x0,y0).\n\n    if (this._x1 === null) {\n      this._ += \"M\" + x0 + \",\" + y0;\n    } // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n    else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n        this._ += \"L\" + x0 + \",\" + y0;\n      } // Is this arc empty? We’re done.\n\n\n    if (!r) return; // Does the angle go the wrong way? Flip the direction.\n\n    if (da < 0) da = da % tau + tau; // Is this a complete circle? Draw two arcs to complete the circle.\n\n    if (da > tauEpsilon) {\n      this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n    } // Is this arc non-empty? Draw an arc!\n    else if (da > epsilon) {\n        this._ += \"A\" + r + \",\" + r + \",0,\" + +(da >= pi) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n      }\n  },\n  rect: function (x, y, w, h) {\n    this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + +w + \"v\" + +h + \"h\" + -w + \"Z\";\n  },\n  toString: function () {\n    return this._;\n  }\n};\nvar _default = path;\nexports.default = _default;\n},{}],\"OTyq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"path\", {\n  enumerable: true,\n  get: function () {\n    return _path.default;\n  }\n});\n\nvar _path = _interopRequireDefault(require(\"./path.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./path.js\":\"hMob\"}],\"ezXE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x) {\n  return function constant() {\n    return x;\n  };\n}\n},{}],\"kIKs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.acos = acos;\nexports.asin = asin;\nexports.tau = exports.halfPi = exports.pi = exports.epsilon = exports.sqrt = exports.sin = exports.min = exports.max = exports.cos = exports.atan2 = exports.abs = void 0;\nvar abs = Math.abs;\nexports.abs = abs;\nvar atan2 = Math.atan2;\nexports.atan2 = atan2;\nvar cos = Math.cos;\nexports.cos = cos;\nvar max = Math.max;\nexports.max = max;\nvar min = Math.min;\nexports.min = min;\nvar sin = Math.sin;\nexports.sin = sin;\nvar sqrt = Math.sqrt;\nexports.sqrt = sqrt;\nvar epsilon = 1e-12;\nexports.epsilon = epsilon;\nvar pi = Math.PI;\nexports.pi = pi;\nvar halfPi = pi / 2;\nexports.halfPi = halfPi;\nvar tau = 2 * pi;\nexports.tau = tau;\n\nfunction acos(x) {\n  return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nfunction asin(x) {\n  return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n},{}],\"BL7I\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Path = require(\"d3-path\");\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _math = require(\"./math.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction arcInnerRadius(d) {\n  return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n  return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n  return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n  return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n  return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n  var x10 = x1 - x0,\n      y10 = y1 - y0,\n      x32 = x3 - x2,\n      y32 = y3 - y2,\n      t = y32 * x10 - x32 * y10;\n  if (t * t < _math.epsilon) return;\n  t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n  return [x0 + t * x10, y0 + t * y10];\n} // Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\n\n\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n  var x01 = x0 - x1,\n      y01 = y0 - y1,\n      lo = (cw ? rc : -rc) / (0, _math.sqrt)(x01 * x01 + y01 * y01),\n      ox = lo * y01,\n      oy = -lo * x01,\n      x11 = x0 + ox,\n      y11 = y0 + oy,\n      x10 = x1 + ox,\n      y10 = y1 + oy,\n      x00 = (x11 + x10) / 2,\n      y00 = (y11 + y10) / 2,\n      dx = x10 - x11,\n      dy = y10 - y11,\n      d2 = dx * dx + dy * dy,\n      r = r1 - rc,\n      D = x11 * y10 - x10 * y11,\n      d = (dy < 0 ? -1 : 1) * (0, _math.sqrt)((0, _math.max)(0, r * r * d2 - D * D)),\n      cx0 = (D * dy - dx * d) / d2,\n      cy0 = (-D * dx - dy * d) / d2,\n      cx1 = (D * dy + dx * d) / d2,\n      cy1 = (-D * dx + dy * d) / d2,\n      dx0 = cx0 - x00,\n      dy0 = cy0 - y00,\n      dx1 = cx1 - x00,\n      dy1 = cy1 - y00; // Pick the closer of the two intersection points.\n  // TODO Is there a faster way to determine which intersection to use?\n\n  if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n  return {\n    cx: cx0,\n    cy: cy0,\n    x01: -ox,\n    y01: -oy,\n    x11: cx0 * (r1 / r - 1),\n    y11: cy0 * (r1 / r - 1)\n  };\n}\n\nfunction _default() {\n  var innerRadius = arcInnerRadius,\n      outerRadius = arcOuterRadius,\n      cornerRadius = (0, _constant.default)(0),\n      padRadius = null,\n      startAngle = arcStartAngle,\n      endAngle = arcEndAngle,\n      padAngle = arcPadAngle,\n      context = null;\n\n  function arc() {\n    var buffer,\n        r,\n        r0 = +innerRadius.apply(this, arguments),\n        r1 = +outerRadius.apply(this, arguments),\n        a0 = startAngle.apply(this, arguments) - _math.halfPi,\n        a1 = endAngle.apply(this, arguments) - _math.halfPi,\n        da = (0, _math.abs)(a1 - a0),\n        cw = a1 > a0;\n\n    if (!context) context = buffer = (0, _d3Path.path)(); // Ensure that the outer radius is always larger than the inner radius.\n\n    if (r1 < r0) r = r1, r1 = r0, r0 = r; // Is it a point?\n\n    if (!(r1 > _math.epsilon)) context.moveTo(0, 0); // Or is it a circle or annulus?\n    else if (da > _math.tau - _math.epsilon) {\n        context.moveTo(r1 * (0, _math.cos)(a0), r1 * (0, _math.sin)(a0));\n        context.arc(0, 0, r1, a0, a1, !cw);\n\n        if (r0 > _math.epsilon) {\n          context.moveTo(r0 * (0, _math.cos)(a1), r0 * (0, _math.sin)(a1));\n          context.arc(0, 0, r0, a1, a0, cw);\n        }\n      } // Or is it a circular or annular sector?\n      else {\n          var a01 = a0,\n              a11 = a1,\n              a00 = a0,\n              a10 = a1,\n              da0 = da,\n              da1 = da,\n              ap = padAngle.apply(this, arguments) / 2,\n              rp = ap > _math.epsilon && (padRadius ? +padRadius.apply(this, arguments) : (0, _math.sqrt)(r0 * r0 + r1 * r1)),\n              rc = (0, _math.min)((0, _math.abs)(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n              rc0 = rc,\n              rc1 = rc,\n              t0,\n              t1; // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n\n          if (rp > _math.epsilon) {\n            var p0 = (0, _math.asin)(rp / r0 * (0, _math.sin)(ap)),\n                p1 = (0, _math.asin)(rp / r1 * (0, _math.sin)(ap));\n            if ((da0 -= p0 * 2) > _math.epsilon) p0 *= cw ? 1 : -1, a00 += p0, a10 -= p0;else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n            if ((da1 -= p1 * 2) > _math.epsilon) p1 *= cw ? 1 : -1, a01 += p1, a11 -= p1;else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n          }\n\n          var x01 = r1 * (0, _math.cos)(a01),\n              y01 = r1 * (0, _math.sin)(a01),\n              x10 = r0 * (0, _math.cos)(a10),\n              y10 = r0 * (0, _math.sin)(a10); // Apply rounded corners?\n\n          if (rc > _math.epsilon) {\n            var x11 = r1 * (0, _math.cos)(a11),\n                y11 = r1 * (0, _math.sin)(a11),\n                x00 = r0 * (0, _math.cos)(a00),\n                y00 = r0 * (0, _math.sin)(a00),\n                oc; // Restrict the corner radius according to the sector angle.\n\n            if (da < _math.pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n              var ax = x01 - oc[0],\n                  ay = y01 - oc[1],\n                  bx = x11 - oc[0],\n                  by = y11 - oc[1],\n                  kc = 1 / (0, _math.sin)((0, _math.acos)((ax * bx + ay * by) / ((0, _math.sqrt)(ax * ax + ay * ay) * (0, _math.sqrt)(bx * bx + by * by))) / 2),\n                  lc = (0, _math.sqrt)(oc[0] * oc[0] + oc[1] * oc[1]);\n              rc0 = (0, _math.min)(rc, (r0 - lc) / (kc - 1));\n              rc1 = (0, _math.min)(rc, (r1 - lc) / (kc + 1));\n            }\n          } // Is the sector collapsed to a line?\n\n\n          if (!(da1 > _math.epsilon)) context.moveTo(x01, y01); // Does the sector’s outer ring have rounded corners?\n          else if (rc1 > _math.epsilon) {\n              t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n              t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n              context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); // Have the corners merged?\n\n              if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, (0, _math.atan2)(t0.y01, t0.x01), (0, _math.atan2)(t1.y01, t1.x01), !cw); // Otherwise, draw the two corners and the ring.\n              else {\n                  context.arc(t0.cx, t0.cy, rc1, (0, _math.atan2)(t0.y01, t0.x01), (0, _math.atan2)(t0.y11, t0.x11), !cw);\n                  context.arc(0, 0, r1, (0, _math.atan2)(t0.cy + t0.y11, t0.cx + t0.x11), (0, _math.atan2)(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n                  context.arc(t1.cx, t1.cy, rc1, (0, _math.atan2)(t1.y11, t1.x11), (0, _math.atan2)(t1.y01, t1.x01), !cw);\n                }\n            } // Or is the outer ring just a circular arc?\n            else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); // Is there no inner ring, and it’s a circular sector?\n          // Or perhaps it’s an annular sector collapsed due to padding?\n\n          if (!(r0 > _math.epsilon) || !(da0 > _math.epsilon)) context.lineTo(x10, y10); // Does the sector’s inner ring (or point) have rounded corners?\n          else if (rc0 > _math.epsilon) {\n              t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n              t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n              context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); // Have the corners merged?\n\n              if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, (0, _math.atan2)(t0.y01, t0.x01), (0, _math.atan2)(t1.y01, t1.x01), !cw); // Otherwise, draw the two corners and the ring.\n              else {\n                  context.arc(t0.cx, t0.cy, rc0, (0, _math.atan2)(t0.y01, t0.x01), (0, _math.atan2)(t0.y11, t0.x11), !cw);\n                  context.arc(0, 0, r0, (0, _math.atan2)(t0.cy + t0.y11, t0.cx + t0.x11), (0, _math.atan2)(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n                  context.arc(t1.cx, t1.cy, rc0, (0, _math.atan2)(t1.y11, t1.x11), (0, _math.atan2)(t1.y01, t1.x01), !cw);\n                }\n            } // Or is the inner ring just a circular arc?\n            else context.arc(0, 0, r0, a10, a00, cw);\n        }\n    context.closePath();\n    if (buffer) return context = null, buffer + \"\" || null;\n  }\n\n  arc.centroid = function () {\n    var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n        a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - _math.pi / 2;\n    return [(0, _math.cos)(a) * r, (0, _math.sin)(a) * r];\n  };\n\n  arc.innerRadius = function (_) {\n    return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), arc) : innerRadius;\n  };\n\n  arc.outerRadius = function (_) {\n    return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), arc) : outerRadius;\n  };\n\n  arc.cornerRadius = function (_) {\n    return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), arc) : cornerRadius;\n  };\n\n  arc.padRadius = function (_) {\n    return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constant.default)(+_), arc) : padRadius;\n  };\n\n  arc.startAngle = function (_) {\n    return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), arc) : startAngle;\n  };\n\n  arc.endAngle = function (_) {\n    return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), arc) : endAngle;\n  };\n\n  arc.padAngle = function (_) {\n    return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), arc) : padAngle;\n  };\n\n  arc.context = function (_) {\n    return arguments.length ? (context = _ == null ? null : _, arc) : context;\n  };\n\n  return arc;\n}\n},{\"d3-path\":\"OTyq\",\"./constant.js\":\"ezXE\",\"./math.js\":\"kIKs\"}],\"L3Qx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction Linear(context) {\n  this._context = context;\n}\n\nLinear.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._point = 0;\n  },\n  lineEnd: function () {\n    if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n        break;\n\n      case 1:\n        this._point = 2;\n      // proceed\n\n      default:\n        this._context.lineTo(x, y);\n\n        break;\n    }\n  }\n};\n\nfunction _default(context) {\n  return new Linear(context);\n}\n},{}],\"LnI9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.x = x;\nexports.y = y;\n\nfunction x(p) {\n  return p[0];\n}\n\nfunction y(p) {\n  return p[1];\n}\n},{}],\"KhHE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Path = require(\"d3-path\");\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _linear = _interopRequireDefault(require(\"./curve/linear.js\"));\n\nvar _point = require(\"./point.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var x = _point.x,\n      y = _point.y,\n      defined = (0, _constant.default)(true),\n      context = null,\n      curve = _linear.default,\n      output = null;\n\n  function line(data) {\n    var i,\n        n = data.length,\n        d,\n        defined0 = false,\n        buffer;\n    if (context == null) output = curve(buffer = (0, _d3Path.path)());\n\n    for (i = 0; i <= n; ++i) {\n      if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n        if (defined0 = !defined0) output.lineStart();else output.lineEnd();\n      }\n\n      if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n    }\n\n    if (buffer) return output = null, buffer + \"\" || null;\n  }\n\n  line.x = function (_) {\n    return arguments.length ? (x = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), line) : x;\n  };\n\n  line.y = function (_) {\n    return arguments.length ? (y = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), line) : y;\n  };\n\n  line.defined = function (_) {\n    return arguments.length ? (defined = typeof _ === \"function\" ? _ : (0, _constant.default)(!!_), line) : defined;\n  };\n\n  line.curve = function (_) {\n    return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n  };\n\n  line.context = function (_) {\n    return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n  };\n\n  return line;\n}\n},{\"d3-path\":\"OTyq\",\"./constant.js\":\"ezXE\",\"./curve/linear.js\":\"L3Qx\",\"./point.js\":\"LnI9\"}],\"IYvJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Path = require(\"d3-path\");\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _linear = _interopRequireDefault(require(\"./curve/linear.js\"));\n\nvar _line = _interopRequireDefault(require(\"./line.js\"));\n\nvar _point = require(\"./point.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var x0 = _point.x,\n      x1 = null,\n      y0 = (0, _constant.default)(0),\n      y1 = _point.y,\n      defined = (0, _constant.default)(true),\n      context = null,\n      curve = _linear.default,\n      output = null;\n\n  function area(data) {\n    var i,\n        j,\n        k,\n        n = data.length,\n        d,\n        defined0 = false,\n        buffer,\n        x0z = new Array(n),\n        y0z = new Array(n);\n    if (context == null) output = curve(buffer = (0, _d3Path.path)());\n\n    for (i = 0; i <= n; ++i) {\n      if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n        if (defined0 = !defined0) {\n          j = i;\n          output.areaStart();\n          output.lineStart();\n        } else {\n          output.lineEnd();\n          output.lineStart();\n\n          for (k = i - 1; k >= j; --k) {\n            output.point(x0z[k], y0z[k]);\n          }\n\n          output.lineEnd();\n          output.areaEnd();\n        }\n      }\n\n      if (defined0) {\n        x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n        output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n      }\n    }\n\n    if (buffer) return output = null, buffer + \"\" || null;\n  }\n\n  function arealine() {\n    return (0, _line.default)().defined(defined).curve(curve).context(context);\n  }\n\n  area.x = function (_) {\n    return arguments.length ? (x0 = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), x1 = null, area) : x0;\n  };\n\n  area.x0 = function (_) {\n    return arguments.length ? (x0 = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), area) : x0;\n  };\n\n  area.x1 = function (_) {\n    return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constant.default)(+_), area) : x1;\n  };\n\n  area.y = function (_) {\n    return arguments.length ? (y0 = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), y1 = null, area) : y0;\n  };\n\n  area.y0 = function (_) {\n    return arguments.length ? (y0 = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), area) : y0;\n  };\n\n  area.y1 = function (_) {\n    return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constant.default)(+_), area) : y1;\n  };\n\n  area.lineX0 = area.lineY0 = function () {\n    return arealine().x(x0).y(y0);\n  };\n\n  area.lineY1 = function () {\n    return arealine().x(x0).y(y1);\n  };\n\n  area.lineX1 = function () {\n    return arealine().x(x1).y(y0);\n  };\n\n  area.defined = function (_) {\n    return arguments.length ? (defined = typeof _ === \"function\" ? _ : (0, _constant.default)(!!_), area) : defined;\n  };\n\n  area.curve = function (_) {\n    return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n  };\n\n  area.context = function (_) {\n    return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n  };\n\n  return area;\n}\n},{\"d3-path\":\"OTyq\",\"./constant.js\":\"ezXE\",\"./curve/linear.js\":\"L3Qx\",\"./line.js\":\"KhHE\",\"./point.js\":\"LnI9\"}],\"idkR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(d) {\n  return d;\n}\n},{}],\"bAZU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _descending = _interopRequireDefault(require(\"./descending.js\"));\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nvar _math = require(\"./math.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var value = _identity.default,\n      sortValues = _descending.default,\n      sort = null,\n      startAngle = (0, _constant.default)(0),\n      endAngle = (0, _constant.default)(_math.tau),\n      padAngle = (0, _constant.default)(0);\n\n  function pie(data) {\n    var i,\n        n = data.length,\n        j,\n        k,\n        sum = 0,\n        index = new Array(n),\n        arcs = new Array(n),\n        a0 = +startAngle.apply(this, arguments),\n        da = Math.min(_math.tau, Math.max(-_math.tau, endAngle.apply(this, arguments) - a0)),\n        a1,\n        p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),\n        pa = p * (da < 0 ? -1 : 1),\n        v;\n\n    for (i = 0; i < n; ++i) {\n      if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {\n        sum += v;\n      }\n    } // Optionally sort the arcs by previously-computed values or by data.\n\n\n    if (sortValues != null) index.sort(function (i, j) {\n      return sortValues(arcs[i], arcs[j]);\n    });else if (sort != null) index.sort(function (i, j) {\n      return sort(data[i], data[j]);\n    }); // Compute the arcs! They are stored in the original data's order.\n\n    for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {\n      j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {\n        data: data[j],\n        index: i,\n        value: v,\n        startAngle: a0,\n        endAngle: a1,\n        padAngle: p\n      };\n    }\n\n    return arcs;\n  }\n\n  pie.value = function (_) {\n    return arguments.length ? (value = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), pie) : value;\n  };\n\n  pie.sortValues = function (_) {\n    return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;\n  };\n\n  pie.sort = function (_) {\n    return arguments.length ? (sort = _, sortValues = null, pie) : sort;\n  };\n\n  pie.startAngle = function (_) {\n    return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), pie) : startAngle;\n  };\n\n  pie.endAngle = function (_) {\n    return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), pie) : endAngle;\n  };\n\n  pie.padAngle = function (_) {\n    return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), pie) : padAngle;\n  };\n\n  return pie;\n}\n},{\"./constant.js\":\"ezXE\",\"./descending.js\":\"fBAz\",\"./identity.js\":\"idkR\",\"./math.js\":\"kIKs\"}],\"LARK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = curveRadial;\nexports.curveRadialLinear = void 0;\n\nvar _linear = _interopRequireDefault(require(\"./linear.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar curveRadialLinear = curveRadial(_linear.default);\nexports.curveRadialLinear = curveRadialLinear;\n\nfunction Radial(curve) {\n  this._curve = curve;\n}\n\nRadial.prototype = {\n  areaStart: function () {\n    this._curve.areaStart();\n  },\n  areaEnd: function () {\n    this._curve.areaEnd();\n  },\n  lineStart: function () {\n    this._curve.lineStart();\n  },\n  lineEnd: function () {\n    this._curve.lineEnd();\n  },\n  point: function (a, r) {\n    this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n  }\n};\n\nfunction curveRadial(curve) {\n  function radial(context) {\n    return new Radial(curve(context));\n  }\n\n  radial._curve = curve;\n  return radial;\n}\n},{\"./linear.js\":\"L3Qx\"}],\"faWF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.lineRadial = lineRadial;\nexports.default = _default;\n\nvar _radial = _interopRequireWildcard(require(\"./curve/radial.js\"));\n\nvar _line = _interopRequireDefault(require(\"./line.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction lineRadial(l) {\n  var c = l.curve;\n  l.angle = l.x, delete l.x;\n  l.radius = l.y, delete l.y;\n\n  l.curve = function (_) {\n    return arguments.length ? c((0, _radial.default)(_)) : c()._curve;\n  };\n\n  return l;\n}\n\nfunction _default() {\n  return lineRadial((0, _line.default)().curve(_radial.curveRadialLinear));\n}\n},{\"./curve/radial.js\":\"LARK\",\"./line.js\":\"KhHE\"}],\"T5gn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _radial = _interopRequireWildcard(require(\"./curve/radial.js\"));\n\nvar _area = _interopRequireDefault(require(\"./area.js\"));\n\nvar _lineRadial = require(\"./lineRadial.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _default() {\n  var a = (0, _area.default)().curve(_radial.curveRadialLinear),\n      c = a.curve,\n      x0 = a.lineX0,\n      x1 = a.lineX1,\n      y0 = a.lineY0,\n      y1 = a.lineY1;\n  a.angle = a.x, delete a.x;\n  a.startAngle = a.x0, delete a.x0;\n  a.endAngle = a.x1, delete a.x1;\n  a.radius = a.y, delete a.y;\n  a.innerRadius = a.y0, delete a.y0;\n  a.outerRadius = a.y1, delete a.y1;\n  a.lineStartAngle = function () {\n    return (0, _lineRadial.lineRadial)(x0());\n  }, delete a.lineX0;\n  a.lineEndAngle = function () {\n    return (0, _lineRadial.lineRadial)(x1());\n  }, delete a.lineX1;\n  a.lineInnerRadius = function () {\n    return (0, _lineRadial.lineRadial)(y0());\n  }, delete a.lineY0;\n  a.lineOuterRadius = function () {\n    return (0, _lineRadial.lineRadial)(y1());\n  }, delete a.lineY1;\n\n  a.curve = function (_) {\n    return arguments.length ? c((0, _radial.default)(_)) : c()._curve;\n  };\n\n  return a;\n}\n},{\"./curve/radial.js\":\"LARK\",\"./area.js\":\"IYvJ\",\"./lineRadial.js\":\"faWF\"}],\"vzjT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x, y) {\n  return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];\n}\n},{}],\"mkFC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.slice = void 0;\nvar slice = Array.prototype.slice;\nexports.slice = slice;\n},{}],\"npGN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linkHorizontal = linkHorizontal;\nexports.linkVertical = linkVertical;\nexports.linkRadial = linkRadial;\n\nvar _d3Path = require(\"d3-path\");\n\nvar _array = require(\"../array.js\");\n\nvar _constant = _interopRequireDefault(require(\"../constant.js\"));\n\nvar _point = require(\"../point.js\");\n\nvar _pointRadial = _interopRequireDefault(require(\"../pointRadial.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction linkSource(d) {\n  return d.source;\n}\n\nfunction linkTarget(d) {\n  return d.target;\n}\n\nfunction link(curve) {\n  var source = linkSource,\n      target = linkTarget,\n      x = _point.x,\n      y = _point.y,\n      context = null;\n\n  function link() {\n    var buffer,\n        argv = _array.slice.call(arguments),\n        s = source.apply(this, argv),\n        t = target.apply(this, argv);\n\n    if (!context) context = buffer = (0, _d3Path.path)();\n    curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));\n    if (buffer) return context = null, buffer + \"\" || null;\n  }\n\n  link.source = function (_) {\n    return arguments.length ? (source = _, link) : source;\n  };\n\n  link.target = function (_) {\n    return arguments.length ? (target = _, link) : target;\n  };\n\n  link.x = function (_) {\n    return arguments.length ? (x = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), link) : x;\n  };\n\n  link.y = function (_) {\n    return arguments.length ? (y = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), link) : y;\n  };\n\n  link.context = function (_) {\n    return arguments.length ? (context = _ == null ? null : _, link) : context;\n  };\n\n  return link;\n}\n\nfunction curveHorizontal(context, x0, y0, x1, y1) {\n  context.moveTo(x0, y0);\n  context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\n}\n\nfunction curveVertical(context, x0, y0, x1, y1) {\n  context.moveTo(x0, y0);\n  context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\n}\n\nfunction curveRadial(context, x0, y0, x1, y1) {\n  var p0 = (0, _pointRadial.default)(x0, y0),\n      p1 = (0, _pointRadial.default)(x0, y0 = (y0 + y1) / 2),\n      p2 = (0, _pointRadial.default)(x1, y0),\n      p3 = (0, _pointRadial.default)(x1, y1);\n  context.moveTo(p0[0], p0[1]);\n  context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n}\n\nfunction linkHorizontal() {\n  return link(curveHorizontal);\n}\n\nfunction linkVertical() {\n  return link(curveVertical);\n}\n\nfunction linkRadial() {\n  var l = link(curveRadial);\n  l.angle = l.x, delete l.x;\n  l.radius = l.y, delete l.y;\n  return l;\n}\n},{\"d3-path\":\"OTyq\",\"../array.js\":\"mkFC\",\"../constant.js\":\"ezXE\",\"../point.js\":\"LnI9\",\"../pointRadial.js\":\"vzjT\"}],\"zjv7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _math = require(\"../math.js\");\n\nvar _default = {\n  draw: function (context, size) {\n    var r = Math.sqrt(size / _math.pi);\n    context.moveTo(r, 0);\n    context.arc(0, 0, r, 0, _math.tau);\n  }\n};\nexports.default = _default;\n},{\"../math.js\":\"kIKs\"}],\"PTh9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = {\n  draw: function (context, size) {\n    var r = Math.sqrt(size / 5) / 2;\n    context.moveTo(-3 * r, -r);\n    context.lineTo(-r, -r);\n    context.lineTo(-r, -3 * r);\n    context.lineTo(r, -3 * r);\n    context.lineTo(r, -r);\n    context.lineTo(3 * r, -r);\n    context.lineTo(3 * r, r);\n    context.lineTo(r, r);\n    context.lineTo(r, 3 * r);\n    context.lineTo(-r, 3 * r);\n    context.lineTo(-r, r);\n    context.lineTo(-3 * r, r);\n    context.closePath();\n  }\n};\nexports.default = _default;\n},{}],\"fuDX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar tan30 = Math.sqrt(1 / 3),\n    tan30_2 = tan30 * 2;\nvar _default = {\n  draw: function (context, size) {\n    var y = Math.sqrt(size / tan30_2),\n        x = y * tan30;\n    context.moveTo(0, -y);\n    context.lineTo(x, 0);\n    context.lineTo(0, y);\n    context.lineTo(-x, 0);\n    context.closePath();\n  }\n};\nexports.default = _default;\n},{}],\"L5Ql\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _math = require(\"../math.js\");\n\nvar ka = 0.89081309152928522810,\n    kr = Math.sin(_math.pi / 10) / Math.sin(7 * _math.pi / 10),\n    kx = Math.sin(_math.tau / 10) * kr,\n    ky = -Math.cos(_math.tau / 10) * kr;\nvar _default = {\n  draw: function (context, size) {\n    var r = Math.sqrt(size * ka),\n        x = kx * r,\n        y = ky * r;\n    context.moveTo(0, -r);\n    context.lineTo(x, y);\n\n    for (var i = 1; i < 5; ++i) {\n      var a = _math.tau * i / 5,\n          c = Math.cos(a),\n          s = Math.sin(a);\n      context.lineTo(s * r, -c * r);\n      context.lineTo(c * x - s * y, s * x + c * y);\n    }\n\n    context.closePath();\n  }\n};\nexports.default = _default;\n},{\"../math.js\":\"kIKs\"}],\"bj9s\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = {\n  draw: function (context, size) {\n    var w = Math.sqrt(size),\n        x = -w / 2;\n    context.rect(x, x, w, w);\n  }\n};\nexports.default = _default;\n},{}],\"owZx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar sqrt3 = Math.sqrt(3);\nvar _default = {\n  draw: function (context, size) {\n    var y = -Math.sqrt(size / (sqrt3 * 3));\n    context.moveTo(0, y * 2);\n    context.lineTo(-sqrt3 * y, -y);\n    context.lineTo(sqrt3 * y, -y);\n    context.closePath();\n  }\n};\nexports.default = _default;\n},{}],\"UZQY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar c = -0.5,\n    s = Math.sqrt(3) / 2,\n    k = 1 / Math.sqrt(12),\n    a = (k / 2 + 1) * 3;\nvar _default = {\n  draw: function (context, size) {\n    var r = Math.sqrt(size / a),\n        x0 = r / 2,\n        y0 = r * k,\n        x1 = x0,\n        y1 = r * k + r,\n        x2 = -x1,\n        y2 = y1;\n    context.moveTo(x0, y0);\n    context.lineTo(x1, y1);\n    context.lineTo(x2, y2);\n    context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n    context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n    context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n    context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n    context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n    context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n    context.closePath();\n  }\n};\nexports.default = _default;\n},{}],\"bBhM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.symbols = void 0;\n\nvar _d3Path = require(\"d3-path\");\n\nvar _circle = _interopRequireDefault(require(\"./symbol/circle.js\"));\n\nvar _cross = _interopRequireDefault(require(\"./symbol/cross.js\"));\n\nvar _diamond = _interopRequireDefault(require(\"./symbol/diamond.js\"));\n\nvar _star = _interopRequireDefault(require(\"./symbol/star.js\"));\n\nvar _square = _interopRequireDefault(require(\"./symbol/square.js\"));\n\nvar _triangle = _interopRequireDefault(require(\"./symbol/triangle.js\"));\n\nvar _wye = _interopRequireDefault(require(\"./symbol/wye.js\"));\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar symbols = [_circle.default, _cross.default, _diamond.default, _square.default, _star.default, _triangle.default, _wye.default];\nexports.symbols = symbols;\n\nfunction _default() {\n  var type = (0, _constant.default)(_circle.default),\n      size = (0, _constant.default)(64),\n      context = null;\n\n  function symbol() {\n    var buffer;\n    if (!context) context = buffer = (0, _d3Path.path)();\n    type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n    if (buffer) return context = null, buffer + \"\" || null;\n  }\n\n  symbol.type = function (_) {\n    return arguments.length ? (type = typeof _ === \"function\" ? _ : (0, _constant.default)(_), symbol) : type;\n  };\n\n  symbol.size = function (_) {\n    return arguments.length ? (size = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), symbol) : size;\n  };\n\n  symbol.context = function (_) {\n    return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n  };\n\n  return symbol;\n}\n},{\"d3-path\":\"OTyq\",\"./symbol/circle.js\":\"zjv7\",\"./symbol/cross.js\":\"PTh9\",\"./symbol/diamond.js\":\"fuDX\",\"./symbol/star.js\":\"L5Ql\",\"./symbol/square.js\":\"bj9s\",\"./symbol/triangle.js\":\"owZx\",\"./symbol/wye.js\":\"UZQY\",\"./constant.js\":\"ezXE\"}],\"Hgxp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {}\n},{}],\"cx05\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.point = point;\nexports.Basis = Basis;\nexports.default = _default;\n\nfunction point(that, x, y) {\n  that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x) / 6, (that._y0 + 4 * that._y1 + y) / 6);\n}\n\nfunction Basis(context) {\n  this._context = context;\n}\n\nBasis.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function () {\n    switch (this._point) {\n      case 3:\n        point(this, this._x1, this._y1);\n      // proceed\n\n      case 2:\n        this._context.lineTo(this._x1, this._y1);\n\n        break;\n    }\n\n    if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n        break;\n\n      case 1:\n        this._point = 2;\n        break;\n\n      case 2:\n        this._point = 3;\n\n        this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);\n\n      // proceed\n\n      default:\n        point(this, x, y);\n        break;\n    }\n\n    this._x0 = this._x1, this._x1 = x;\n    this._y0 = this._y1, this._y1 = y;\n  }\n};\n\nfunction _default(context) {\n  return new Basis(context);\n}\n},{}],\"FS5M\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nvar _basis = require(\"./basis.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction BasisClosed(context) {\n  this._context = context;\n}\n\nBasisClosed.prototype = {\n  areaStart: _noop.default,\n  areaEnd: _noop.default,\n  lineStart: function () {\n    this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function () {\n    switch (this._point) {\n      case 1:\n        {\n          this._context.moveTo(this._x2, this._y2);\n\n          this._context.closePath();\n\n          break;\n        }\n\n      case 2:\n        {\n          this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n\n          this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n\n          this._context.closePath();\n\n          break;\n        }\n\n      case 3:\n        {\n          this.point(this._x2, this._y2);\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          break;\n        }\n    }\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._x2 = x, this._y2 = y;\n        break;\n\n      case 1:\n        this._point = 2;\n        this._x3 = x, this._y3 = y;\n        break;\n\n      case 2:\n        this._point = 3;\n        this._x4 = x, this._y4 = y;\n\n        this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6);\n\n        break;\n\n      default:\n        (0, _basis.point)(this, x, y);\n        break;\n    }\n\n    this._x0 = this._x1, this._x1 = x;\n    this._y0 = this._y1, this._y1 = y;\n  }\n};\n\nfunction _default(context) {\n  return new BasisClosed(context);\n}\n},{\"../noop.js\":\"Hgxp\",\"./basis.js\":\"cx05\"}],\"feGb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _basis = require(\"./basis.js\");\n\nfunction BasisOpen(context) {\n  this._context = context;\n}\n\nBasisOpen.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function () {\n    if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        break;\n\n      case 1:\n        this._point = 2;\n        break;\n\n      case 2:\n        this._point = 3;\n        var x0 = (this._x0 + 4 * this._x1 + x) / 6,\n            y0 = (this._y0 + 4 * this._y1 + y) / 6;\n        this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0);\n        break;\n\n      case 3:\n        this._point = 4;\n      // proceed\n\n      default:\n        (0, _basis.point)(this, x, y);\n        break;\n    }\n\n    this._x0 = this._x1, this._x1 = x;\n    this._y0 = this._y1, this._y1 = y;\n  }\n};\n\nfunction _default(context) {\n  return new BasisOpen(context);\n}\n},{\"./basis.js\":\"cx05\"}],\"iAgm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _basis = require(\"./basis.js\");\n\nfunction Bundle(context, beta) {\n  this._basis = new _basis.Basis(context);\n  this._beta = beta;\n}\n\nBundle.prototype = {\n  lineStart: function () {\n    this._x = [];\n    this._y = [];\n\n    this._basis.lineStart();\n  },\n  lineEnd: function () {\n    var x = this._x,\n        y = this._y,\n        j = x.length - 1;\n\n    if (j > 0) {\n      var x0 = x[0],\n          y0 = y[0],\n          dx = x[j] - x0,\n          dy = y[j] - y0,\n          i = -1,\n          t;\n\n      while (++i <= j) {\n        t = i / j;\n\n        this._basis.point(this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y[i] + (1 - this._beta) * (y0 + t * dy));\n      }\n    }\n\n    this._x = this._y = null;\n\n    this._basis.lineEnd();\n  },\n  point: function (x, y) {\n    this._x.push(+x);\n\n    this._y.push(+y);\n  }\n};\n\nvar _default = function custom(beta) {\n  function bundle(context) {\n    return beta === 1 ? new _basis.Basis(context) : new Bundle(context, beta);\n  }\n\n  bundle.beta = function (beta) {\n    return custom(+beta);\n  };\n\n  return bundle;\n}(0.85);\n\nexports.default = _default;\n},{\"./basis.js\":\"cx05\"}],\"DORS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.point = point;\nexports.Cardinal = Cardinal;\nexports.default = void 0;\n\nfunction point(that, x, y) {\n  that._context.bezierCurveTo(that._x1 + that._k * (that._x2 - that._x0), that._y1 + that._k * (that._y2 - that._y0), that._x2 + that._k * (that._x1 - x), that._y2 + that._k * (that._y1 - y), that._x2, that._y2);\n}\n\nfunction Cardinal(context, tension) {\n  this._context = context;\n  this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function () {\n    switch (this._point) {\n      case 2:\n        this._context.lineTo(this._x2, this._y2);\n\n        break;\n\n      case 3:\n        point(this, this._x1, this._y1);\n        break;\n    }\n\n    if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n        break;\n\n      case 1:\n        this._point = 2;\n        this._x1 = x, this._y1 = y;\n        break;\n\n      case 2:\n        this._point = 3;\n      // proceed\n\n      default:\n        point(this, x, y);\n        break;\n    }\n\n    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n  }\n};\n\nvar _default = function custom(tension) {\n  function cardinal(context) {\n    return new Cardinal(context, tension);\n  }\n\n  cardinal.tension = function (tension) {\n    return custom(+tension);\n  };\n\n  return cardinal;\n}(0);\n\nexports.default = _default;\n},{}],\"FUQi\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CardinalClosed = CardinalClosed;\nexports.default = void 0;\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nvar _cardinal = require(\"./cardinal.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction CardinalClosed(context, tension) {\n  this._context = context;\n  this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n  areaStart: _noop.default,\n  areaEnd: _noop.default,\n  lineStart: function () {\n    this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function () {\n    switch (this._point) {\n      case 1:\n        {\n          this._context.moveTo(this._x3, this._y3);\n\n          this._context.closePath();\n\n          break;\n        }\n\n      case 2:\n        {\n          this._context.lineTo(this._x3, this._y3);\n\n          this._context.closePath();\n\n          break;\n        }\n\n      case 3:\n        {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n    }\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._x3 = x, this._y3 = y;\n        break;\n\n      case 1:\n        this._point = 2;\n\n        this._context.moveTo(this._x4 = x, this._y4 = y);\n\n        break;\n\n      case 2:\n        this._point = 3;\n        this._x5 = x, this._y5 = y;\n        break;\n\n      default:\n        (0, _cardinal.point)(this, x, y);\n        break;\n    }\n\n    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n  }\n};\n\nvar _default = function custom(tension) {\n  function cardinal(context) {\n    return new CardinalClosed(context, tension);\n  }\n\n  cardinal.tension = function (tension) {\n    return custom(+tension);\n  };\n\n  return cardinal;\n}(0);\n\nexports.default = _default;\n},{\"../noop.js\":\"Hgxp\",\"./cardinal.js\":\"DORS\"}],\"iWbK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CardinalOpen = CardinalOpen;\nexports.default = void 0;\n\nvar _cardinal = require(\"./cardinal.js\");\n\nfunction CardinalOpen(context, tension) {\n  this._context = context;\n  this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function () {\n    if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        break;\n\n      case 1:\n        this._point = 2;\n        break;\n\n      case 2:\n        this._point = 3;\n        this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n        break;\n\n      case 3:\n        this._point = 4;\n      // proceed\n\n      default:\n        (0, _cardinal.point)(this, x, y);\n        break;\n    }\n\n    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n  }\n};\n\nvar _default = function custom(tension) {\n  function cardinal(context) {\n    return new CardinalOpen(context, tension);\n  }\n\n  cardinal.tension = function (tension) {\n    return custom(+tension);\n  };\n\n  return cardinal;\n}(0);\n\nexports.default = _default;\n},{\"./cardinal.js\":\"DORS\"}],\"oFi9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.point = point;\nexports.default = void 0;\n\nvar _math = require(\"../math.js\");\n\nvar _cardinal = require(\"./cardinal.js\");\n\nfunction point(that, x, y) {\n  var x1 = that._x1,\n      y1 = that._y1,\n      x2 = that._x2,\n      y2 = that._y2;\n\n  if (that._l01_a > _math.epsilon) {\n    var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n        n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n    x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n    y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n  }\n\n  if (that._l23_a > _math.epsilon) {\n    var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n        m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n    x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n    y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n  }\n\n  that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n  this._context = context;\n  this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n    this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n  },\n  lineEnd: function () {\n    switch (this._point) {\n      case 2:\n        this._context.lineTo(this._x2, this._y2);\n\n        break;\n\n      case 3:\n        this.point(this._x2, this._y2);\n        break;\n    }\n\n    if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    if (this._point) {\n      var x23 = this._x2 - x,\n          y23 = this._y2 - y;\n      this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n    }\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n        break;\n\n      case 1:\n        this._point = 2;\n        break;\n\n      case 2:\n        this._point = 3;\n      // proceed\n\n      default:\n        point(this, x, y);\n        break;\n    }\n\n    this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n    this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n  }\n};\n\nvar _default = function custom(alpha) {\n  function catmullRom(context) {\n    return alpha ? new CatmullRom(context, alpha) : new _cardinal.Cardinal(context, 0);\n  }\n\n  catmullRom.alpha = function (alpha) {\n    return custom(+alpha);\n  };\n\n  return catmullRom;\n}(0.5);\n\nexports.default = _default;\n},{\"../math.js\":\"kIKs\",\"./cardinal.js\":\"DORS\"}],\"AW0P\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _cardinalClosed = require(\"./cardinalClosed.js\");\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nvar _catmullRom = require(\"./catmullRom.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction CatmullRomClosed(context, alpha) {\n  this._context = context;\n  this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n  areaStart: _noop.default,\n  areaEnd: _noop.default,\n  lineStart: function () {\n    this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n    this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n  },\n  lineEnd: function () {\n    switch (this._point) {\n      case 1:\n        {\n          this._context.moveTo(this._x3, this._y3);\n\n          this._context.closePath();\n\n          break;\n        }\n\n      case 2:\n        {\n          this._context.lineTo(this._x3, this._y3);\n\n          this._context.closePath();\n\n          break;\n        }\n\n      case 3:\n        {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n    }\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    if (this._point) {\n      var x23 = this._x2 - x,\n          y23 = this._y2 - y;\n      this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n    }\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._x3 = x, this._y3 = y;\n        break;\n\n      case 1:\n        this._point = 2;\n\n        this._context.moveTo(this._x4 = x, this._y4 = y);\n\n        break;\n\n      case 2:\n        this._point = 3;\n        this._x5 = x, this._y5 = y;\n        break;\n\n      default:\n        (0, _catmullRom.point)(this, x, y);\n        break;\n    }\n\n    this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n    this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n  }\n};\n\nvar _default = function custom(alpha) {\n  function catmullRom(context) {\n    return alpha ? new CatmullRomClosed(context, alpha) : new _cardinalClosed.CardinalClosed(context, 0);\n  }\n\n  catmullRom.alpha = function (alpha) {\n    return custom(+alpha);\n  };\n\n  return catmullRom;\n}(0.5);\n\nexports.default = _default;\n},{\"./cardinalClosed.js\":\"FUQi\",\"../noop.js\":\"Hgxp\",\"./catmullRom.js\":\"oFi9\"}],\"PGVM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _cardinalOpen = require(\"./cardinalOpen.js\");\n\nvar _catmullRom = require(\"./catmullRom.js\");\n\nfunction CatmullRomOpen(context, alpha) {\n  this._context = context;\n  this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n    this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n  },\n  lineEnd: function () {\n    if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    if (this._point) {\n      var x23 = this._x2 - x,\n          y23 = this._y2 - y;\n      this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n    }\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        break;\n\n      case 1:\n        this._point = 2;\n        break;\n\n      case 2:\n        this._point = 3;\n        this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n        break;\n\n      case 3:\n        this._point = 4;\n      // proceed\n\n      default:\n        (0, _catmullRom.point)(this, x, y);\n        break;\n    }\n\n    this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n    this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n  }\n};\n\nvar _default = function custom(alpha) {\n  function catmullRom(context) {\n    return alpha ? new CatmullRomOpen(context, alpha) : new _cardinalOpen.CardinalOpen(context, 0);\n  }\n\n  catmullRom.alpha = function (alpha) {\n    return custom(+alpha);\n  };\n\n  return catmullRom;\n}(0.5);\n\nexports.default = _default;\n},{\"./cardinalOpen.js\":\"iWbK\",\"./catmullRom.js\":\"oFi9\"}],\"c2vC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction LinearClosed(context) {\n  this._context = context;\n}\n\nLinearClosed.prototype = {\n  areaStart: _noop.default,\n  areaEnd: _noop.default,\n  lineStart: function () {\n    this._point = 0;\n  },\n  lineEnd: function () {\n    if (this._point) this._context.closePath();\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n    if (this._point) this._context.lineTo(x, y);else this._point = 1, this._context.moveTo(x, y);\n  }\n};\n\nfunction _default(context) {\n  return new LinearClosed(context);\n}\n},{\"../noop.js\":\"Hgxp\"}],\"DNx2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.monotoneX = monotoneX;\nexports.monotoneY = monotoneY;\n\nfunction sign(x) {\n  return x < 0 ? -1 : 1;\n} // Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\n\n\nfunction slope3(that, x2, y2) {\n  var h0 = that._x1 - that._x0,\n      h1 = x2 - that._x1,\n      s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n      s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n      p = (s0 * h1 + s1 * h0) / (h0 + h1);\n  return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n} // Calculate a one-sided slope.\n\n\nfunction slope2(that, t) {\n  var h = that._x1 - that._x0;\n  return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n} // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\n\n\nfunction point(that, t0, t1) {\n  var x0 = that._x0,\n      y0 = that._y0,\n      x1 = that._x1,\n      y1 = that._y1,\n      dx = (x1 - x0) / 3;\n\n  that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n  this._context = context;\n}\n\nMonotoneX.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;\n    this._point = 0;\n  },\n  lineEnd: function () {\n    switch (this._point) {\n      case 2:\n        this._context.lineTo(this._x1, this._y1);\n\n        break;\n\n      case 3:\n        point(this, this._t0, slope2(this, this._t0));\n        break;\n    }\n\n    if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    var t1 = NaN;\n    x = +x, y = +y;\n    if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n        break;\n\n      case 1:\n        this._point = 2;\n        break;\n\n      case 2:\n        this._point = 3;\n        point(this, slope2(this, t1 = slope3(this, x, y)), t1);\n        break;\n\n      default:\n        point(this, this._t0, t1 = slope3(this, x, y));\n        break;\n    }\n\n    this._x0 = this._x1, this._x1 = x;\n    this._y0 = this._y1, this._y1 = y;\n    this._t0 = t1;\n  }\n};\n\nfunction MonotoneY(context) {\n  this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function (x, y) {\n  MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n  this._context = context;\n}\n\nReflectContext.prototype = {\n  moveTo: function (x, y) {\n    this._context.moveTo(y, x);\n  },\n  closePath: function () {\n    this._context.closePath();\n  },\n  lineTo: function (x, y) {\n    this._context.lineTo(y, x);\n  },\n  bezierCurveTo: function (x1, y1, x2, y2, x, y) {\n    this._context.bezierCurveTo(y1, x1, y2, x2, y, x);\n  }\n};\n\nfunction monotoneX(context) {\n  return new MonotoneX(context);\n}\n\nfunction monotoneY(context) {\n  return new MonotoneY(context);\n}\n},{}],\"qyH2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction Natural(context) {\n  this._context = context;\n}\n\nNatural.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x = [];\n    this._y = [];\n  },\n  lineEnd: function () {\n    var x = this._x,\n        y = this._y,\n        n = x.length;\n\n    if (n) {\n      this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n\n      if (n === 2) {\n        this._context.lineTo(x[1], y[1]);\n      } else {\n        var px = controlPoints(x),\n            py = controlPoints(y);\n\n        for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n          this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n        }\n      }\n    }\n\n    if (this._line || this._line !== 0 && n === 1) this._context.closePath();\n    this._line = 1 - this._line;\n    this._x = this._y = null;\n  },\n  point: function (x, y) {\n    this._x.push(+x);\n\n    this._y.push(+y);\n  }\n}; // See https://www.particleincell.com/2012/bezier-splines/ for derivation.\n\nfunction controlPoints(x) {\n  var i,\n      n = x.length - 1,\n      m,\n      a = new Array(n),\n      b = new Array(n),\n      r = new Array(n);\n  a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n\n  for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n\n  a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n\n  for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n\n  a[n - 1] = r[n - 1] / b[n - 1];\n\n  for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n\n  b[n - 1] = (x[n] + a[n - 1]) / 2;\n\n  for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n\n  return [a, b];\n}\n\nfunction _default(context) {\n  return new Natural(context);\n}\n},{}],\"SIad\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.stepBefore = stepBefore;\nexports.stepAfter = stepAfter;\n\nfunction Step(context, t) {\n  this._context = context;\n  this._t = t;\n}\n\nStep.prototype = {\n  areaStart: function () {\n    this._line = 0;\n  },\n  areaEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._x = this._y = NaN;\n    this._point = 0;\n  },\n  lineEnd: function () {\n    if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n    if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n    if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n  },\n  point: function (x, y) {\n    x = +x, y = +y;\n\n    switch (this._point) {\n      case 0:\n        this._point = 1;\n        this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n        break;\n\n      case 1:\n        this._point = 2;\n      // proceed\n\n      default:\n        {\n          if (this._t <= 0) {\n            this._context.lineTo(this._x, y);\n\n            this._context.lineTo(x, y);\n          } else {\n            var x1 = this._x * (1 - this._t) + x * this._t;\n\n            this._context.lineTo(x1, this._y);\n\n            this._context.lineTo(x1, y);\n          }\n\n          break;\n        }\n    }\n\n    this._x = x, this._y = y;\n  }\n};\n\nfunction _default(context) {\n  return new Step(context, 0.5);\n}\n\nfunction stepBefore(context) {\n  return new Step(context, 0);\n}\n\nfunction stepAfter(context) {\n  return new Step(context, 1);\n}\n},{}],\"jW6Y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(series, order) {\n  if (!((n = series.length) > 1)) return;\n\n  for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {\n    s0 = s1, s1 = series[order[i]];\n\n    for (j = 0; j < m; ++j) {\n      s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n    }\n  }\n}\n},{}],\"NTwk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(series) {\n  var n = series.length,\n      o = new Array(n);\n\n  while (--n >= 0) o[n] = n;\n\n  return o;\n}\n},{}],\"k9Ur\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"./array.js\");\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _none = _interopRequireDefault(require(\"./offset/none.js\"));\n\nvar _none2 = _interopRequireDefault(require(\"./order/none.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction stackValue(d, key) {\n  return d[key];\n}\n\nfunction _default() {\n  var keys = (0, _constant.default)([]),\n      order = _none2.default,\n      offset = _none.default,\n      value = stackValue;\n\n  function stack(data) {\n    var kz = keys.apply(this, arguments),\n        i,\n        m = data.length,\n        n = kz.length,\n        sz = new Array(n),\n        oz;\n\n    for (i = 0; i < n; ++i) {\n      for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {\n        si[j] = sij = [0, +value(data[j], ki, j, data)];\n        sij.data = data[j];\n      }\n\n      si.key = ki;\n    }\n\n    for (i = 0, oz = order(sz); i < n; ++i) {\n      sz[oz[i]].index = i;\n    }\n\n    offset(sz, oz);\n    return sz;\n  }\n\n  stack.keys = function (_) {\n    return arguments.length ? (keys = typeof _ === \"function\" ? _ : (0, _constant.default)(_array.slice.call(_)), stack) : keys;\n  };\n\n  stack.value = function (_) {\n    return arguments.length ? (value = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), stack) : value;\n  };\n\n  stack.order = function (_) {\n    return arguments.length ? (order = _ == null ? _none2.default : typeof _ === \"function\" ? _ : (0, _constant.default)(_array.slice.call(_)), stack) : order;\n  };\n\n  stack.offset = function (_) {\n    return arguments.length ? (offset = _ == null ? _none.default : _, stack) : offset;\n  };\n\n  return stack;\n}\n},{\"./array.js\":\"mkFC\",\"./constant.js\":\"ezXE\",\"./offset/none.js\":\"jW6Y\",\"./order/none.js\":\"NTwk\"}],\"WOsM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _none = _interopRequireDefault(require(\"./none.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(series, order) {\n  if (!((n = series.length) > 0)) return;\n\n  for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {\n    for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n\n    if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n  }\n\n  (0, _none.default)(series, order);\n}\n},{\"./none.js\":\"jW6Y\"}],\"PS7K\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(series, order) {\n  if (!((n = series.length) > 0)) return;\n\n  for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {\n    for (yp = yn = 0, i = 0; i < n; ++i) {\n      if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) {\n        d[0] = yp, d[1] = yp += dy;\n      } else if (dy < 0) {\n        d[1] = yn, d[0] = yn += dy;\n      } else {\n        d[0] = 0, d[1] = dy;\n      }\n    }\n  }\n}\n},{}],\"UGaf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _none = _interopRequireDefault(require(\"./none.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(series, order) {\n  if (!((n = series.length) > 0)) return;\n\n  for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {\n    for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n\n    s0[j][1] += s0[j][0] = -y / 2;\n  }\n\n  (0, _none.default)(series, order);\n}\n},{\"./none.js\":\"jW6Y\"}],\"zv8R\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _none = _interopRequireDefault(require(\"./none.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(series, order) {\n  if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;\n\n  for (var y = 0, j = 1, s0, m, n; j < m; ++j) {\n    for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n      var si = series[order[i]],\n          sij0 = si[j][1] || 0,\n          sij1 = si[j - 1][1] || 0,\n          s3 = (sij0 - sij1) / 2;\n\n      for (var k = 0; k < i; ++k) {\n        var sk = series[order[k]],\n            skj0 = sk[j][1] || 0,\n            skj1 = sk[j - 1][1] || 0;\n        s3 += skj0 - skj1;\n      }\n\n      s1 += sij0, s2 += s3 * sij0;\n    }\n\n    s0[j - 1][1] += s0[j - 1][0] = y;\n    if (s1) y -= s2 / s1;\n  }\n\n  s0[j - 1][1] += s0[j - 1][0] = y;\n  (0, _none.default)(series, order);\n}\n},{\"./none.js\":\"jW6Y\"}],\"Uz9Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _none = _interopRequireDefault(require(\"./none.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(series) {\n  var peaks = series.map(peak);\n  return (0, _none.default)(series).sort(function (a, b) {\n    return peaks[a] - peaks[b];\n  });\n}\n\nfunction peak(series) {\n  var i = -1,\n      j = 0,\n      n = series.length,\n      vi,\n      vj = -Infinity;\n\n  while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;\n\n  return j;\n}\n},{\"./none.js\":\"NTwk\"}],\"Z1jP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.sum = sum;\n\nvar _none = _interopRequireDefault(require(\"./none.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(series) {\n  var sums = series.map(sum);\n  return (0, _none.default)(series).sort(function (a, b) {\n    return sums[a] - sums[b];\n  });\n}\n\nfunction sum(series) {\n  var s = 0,\n      i = -1,\n      n = series.length,\n      v;\n\n  while (++i < n) if (v = +series[i][1]) s += v;\n\n  return s;\n}\n},{\"./none.js\":\"NTwk\"}],\"oyxb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(series) {\n  return (0, _ascending.default)(series).reverse();\n}\n},{\"./ascending.js\":\"Z1jP\"}],\"cmz2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _appearance = _interopRequireDefault(require(\"./appearance.js\"));\n\nvar _ascending = require(\"./ascending.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(series) {\n  var n = series.length,\n      i,\n      j,\n      sums = series.map(_ascending.sum),\n      order = (0, _appearance.default)(series),\n      top = 0,\n      bottom = 0,\n      tops = [],\n      bottoms = [];\n\n  for (i = 0; i < n; ++i) {\n    j = order[i];\n\n    if (top < bottom) {\n      top += sums[j];\n      tops.push(j);\n    } else {\n      bottom += sums[j];\n      bottoms.push(j);\n    }\n  }\n\n  return bottoms.reverse().concat(tops);\n}\n},{\"./appearance.js\":\"Uz9Z\",\"./ascending.js\":\"Z1jP\"}],\"MoW7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _none = _interopRequireDefault(require(\"./none.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(series) {\n  return (0, _none.default)(series).reverse();\n}\n},{\"./none.js\":\"NTwk\"}],\"maww\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"arc\", {\n  enumerable: true,\n  get: function () {\n    return _arc.default;\n  }\n});\nObject.defineProperty(exports, \"area\", {\n  enumerable: true,\n  get: function () {\n    return _area.default;\n  }\n});\nObject.defineProperty(exports, \"line\", {\n  enumerable: true,\n  get: function () {\n    return _line.default;\n  }\n});\nObject.defineProperty(exports, \"pie\", {\n  enumerable: true,\n  get: function () {\n    return _pie.default;\n  }\n});\nObject.defineProperty(exports, \"areaRadial\", {\n  enumerable: true,\n  get: function () {\n    return _areaRadial.default;\n  }\n});\nObject.defineProperty(exports, \"radialArea\", {\n  enumerable: true,\n  get: function () {\n    return _areaRadial.default;\n  }\n});\nObject.defineProperty(exports, \"lineRadial\", {\n  enumerable: true,\n  get: function () {\n    return _lineRadial.default;\n  }\n});\nObject.defineProperty(exports, \"radialLine\", {\n  enumerable: true,\n  get: function () {\n    return _lineRadial.default;\n  }\n});\nObject.defineProperty(exports, \"pointRadial\", {\n  enumerable: true,\n  get: function () {\n    return _pointRadial.default;\n  }\n});\nObject.defineProperty(exports, \"linkHorizontal\", {\n  enumerable: true,\n  get: function () {\n    return _index.linkHorizontal;\n  }\n});\nObject.defineProperty(exports, \"linkVertical\", {\n  enumerable: true,\n  get: function () {\n    return _index.linkVertical;\n  }\n});\nObject.defineProperty(exports, \"linkRadial\", {\n  enumerable: true,\n  get: function () {\n    return _index.linkRadial;\n  }\n});\nObject.defineProperty(exports, \"symbol\", {\n  enumerable: true,\n  get: function () {\n    return _symbol.default;\n  }\n});\nObject.defineProperty(exports, \"symbols\", {\n  enumerable: true,\n  get: function () {\n    return _symbol.symbols;\n  }\n});\nObject.defineProperty(exports, \"symbolCircle\", {\n  enumerable: true,\n  get: function () {\n    return _circle.default;\n  }\n});\nObject.defineProperty(exports, \"symbolCross\", {\n  enumerable: true,\n  get: function () {\n    return _cross.default;\n  }\n});\nObject.defineProperty(exports, \"symbolDiamond\", {\n  enumerable: true,\n  get: function () {\n    return _diamond.default;\n  }\n});\nObject.defineProperty(exports, \"symbolSquare\", {\n  enumerable: true,\n  get: function () {\n    return _square.default;\n  }\n});\nObject.defineProperty(exports, \"symbolStar\", {\n  enumerable: true,\n  get: function () {\n    return _star.default;\n  }\n});\nObject.defineProperty(exports, \"symbolTriangle\", {\n  enumerable: true,\n  get: function () {\n    return _triangle.default;\n  }\n});\nObject.defineProperty(exports, \"symbolWye\", {\n  enumerable: true,\n  get: function () {\n    return _wye.default;\n  }\n});\nObject.defineProperty(exports, \"curveBasisClosed\", {\n  enumerable: true,\n  get: function () {\n    return _basisClosed.default;\n  }\n});\nObject.defineProperty(exports, \"curveBasisOpen\", {\n  enumerable: true,\n  get: function () {\n    return _basisOpen.default;\n  }\n});\nObject.defineProperty(exports, \"curveBasis\", {\n  enumerable: true,\n  get: function () {\n    return _basis.default;\n  }\n});\nObject.defineProperty(exports, \"curveBundle\", {\n  enumerable: true,\n  get: function () {\n    return _bundle.default;\n  }\n});\nObject.defineProperty(exports, \"curveCardinalClosed\", {\n  enumerable: true,\n  get: function () {\n    return _cardinalClosed.default;\n  }\n});\nObject.defineProperty(exports, \"curveCardinalOpen\", {\n  enumerable: true,\n  get: function () {\n    return _cardinalOpen.default;\n  }\n});\nObject.defineProperty(exports, \"curveCardinal\", {\n  enumerable: true,\n  get: function () {\n    return _cardinal.default;\n  }\n});\nObject.defineProperty(exports, \"curveCatmullRomClosed\", {\n  enumerable: true,\n  get: function () {\n    return _catmullRomClosed.default;\n  }\n});\nObject.defineProperty(exports, \"curveCatmullRomOpen\", {\n  enumerable: true,\n  get: function () {\n    return _catmullRomOpen.default;\n  }\n});\nObject.defineProperty(exports, \"curveCatmullRom\", {\n  enumerable: true,\n  get: function () {\n    return _catmullRom.default;\n  }\n});\nObject.defineProperty(exports, \"curveLinearClosed\", {\n  enumerable: true,\n  get: function () {\n    return _linearClosed.default;\n  }\n});\nObject.defineProperty(exports, \"curveLinear\", {\n  enumerable: true,\n  get: function () {\n    return _linear.default;\n  }\n});\nObject.defineProperty(exports, \"curveMonotoneX\", {\n  enumerable: true,\n  get: function () {\n    return _monotone.monotoneX;\n  }\n});\nObject.defineProperty(exports, \"curveMonotoneY\", {\n  enumerable: true,\n  get: function () {\n    return _monotone.monotoneY;\n  }\n});\nObject.defineProperty(exports, \"curveNatural\", {\n  enumerable: true,\n  get: function () {\n    return _natural.default;\n  }\n});\nObject.defineProperty(exports, \"curveStep\", {\n  enumerable: true,\n  get: function () {\n    return _step.default;\n  }\n});\nObject.defineProperty(exports, \"curveStepAfter\", {\n  enumerable: true,\n  get: function () {\n    return _step.stepAfter;\n  }\n});\nObject.defineProperty(exports, \"curveStepBefore\", {\n  enumerable: true,\n  get: function () {\n    return _step.stepBefore;\n  }\n});\nObject.defineProperty(exports, \"stack\", {\n  enumerable: true,\n  get: function () {\n    return _stack.default;\n  }\n});\nObject.defineProperty(exports, \"stackOffsetExpand\", {\n  enumerable: true,\n  get: function () {\n    return _expand.default;\n  }\n});\nObject.defineProperty(exports, \"stackOffsetDiverging\", {\n  enumerable: true,\n  get: function () {\n    return _diverging.default;\n  }\n});\nObject.defineProperty(exports, \"stackOffsetNone\", {\n  enumerable: true,\n  get: function () {\n    return _none.default;\n  }\n});\nObject.defineProperty(exports, \"stackOffsetSilhouette\", {\n  enumerable: true,\n  get: function () {\n    return _silhouette.default;\n  }\n});\nObject.defineProperty(exports, \"stackOffsetWiggle\", {\n  enumerable: true,\n  get: function () {\n    return _wiggle.default;\n  }\n});\nObject.defineProperty(exports, \"stackOrderAppearance\", {\n  enumerable: true,\n  get: function () {\n    return _appearance.default;\n  }\n});\nObject.defineProperty(exports, \"stackOrderAscending\", {\n  enumerable: true,\n  get: function () {\n    return _ascending.default;\n  }\n});\nObject.defineProperty(exports, \"stackOrderDescending\", {\n  enumerable: true,\n  get: function () {\n    return _descending.default;\n  }\n});\nObject.defineProperty(exports, \"stackOrderInsideOut\", {\n  enumerable: true,\n  get: function () {\n    return _insideOut.default;\n  }\n});\nObject.defineProperty(exports, \"stackOrderNone\", {\n  enumerable: true,\n  get: function () {\n    return _none2.default;\n  }\n});\nObject.defineProperty(exports, \"stackOrderReverse\", {\n  enumerable: true,\n  get: function () {\n    return _reverse.default;\n  }\n});\n\nvar _arc = _interopRequireDefault(require(\"./arc.js\"));\n\nvar _area = _interopRequireDefault(require(\"./area.js\"));\n\nvar _line = _interopRequireDefault(require(\"./line.js\"));\n\nvar _pie = _interopRequireDefault(require(\"./pie.js\"));\n\nvar _areaRadial = _interopRequireDefault(require(\"./areaRadial.js\"));\n\nvar _lineRadial = _interopRequireDefault(require(\"./lineRadial.js\"));\n\nvar _pointRadial = _interopRequireDefault(require(\"./pointRadial.js\"));\n\nvar _index = require(\"./link/index.js\");\n\nvar _symbol = _interopRequireWildcard(require(\"./symbol.js\"));\n\nvar _circle = _interopRequireDefault(require(\"./symbol/circle.js\"));\n\nvar _cross = _interopRequireDefault(require(\"./symbol/cross.js\"));\n\nvar _diamond = _interopRequireDefault(require(\"./symbol/diamond.js\"));\n\nvar _square = _interopRequireDefault(require(\"./symbol/square.js\"));\n\nvar _star = _interopRequireDefault(require(\"./symbol/star.js\"));\n\nvar _triangle = _interopRequireDefault(require(\"./symbol/triangle.js\"));\n\nvar _wye = _interopRequireDefault(require(\"./symbol/wye.js\"));\n\nvar _basisClosed = _interopRequireDefault(require(\"./curve/basisClosed.js\"));\n\nvar _basisOpen = _interopRequireDefault(require(\"./curve/basisOpen.js\"));\n\nvar _basis = _interopRequireDefault(require(\"./curve/basis.js\"));\n\nvar _bundle = _interopRequireDefault(require(\"./curve/bundle.js\"));\n\nvar _cardinalClosed = _interopRequireDefault(require(\"./curve/cardinalClosed.js\"));\n\nvar _cardinalOpen = _interopRequireDefault(require(\"./curve/cardinalOpen.js\"));\n\nvar _cardinal = _interopRequireDefault(require(\"./curve/cardinal.js\"));\n\nvar _catmullRomClosed = _interopRequireDefault(require(\"./curve/catmullRomClosed.js\"));\n\nvar _catmullRomOpen = _interopRequireDefault(require(\"./curve/catmullRomOpen.js\"));\n\nvar _catmullRom = _interopRequireDefault(require(\"./curve/catmullRom.js\"));\n\nvar _linearClosed = _interopRequireDefault(require(\"./curve/linearClosed.js\"));\n\nvar _linear = _interopRequireDefault(require(\"./curve/linear.js\"));\n\nvar _monotone = require(\"./curve/monotone.js\");\n\nvar _natural = _interopRequireDefault(require(\"./curve/natural.js\"));\n\nvar _step = _interopRequireWildcard(require(\"./curve/step.js\"));\n\nvar _stack = _interopRequireDefault(require(\"./stack.js\"));\n\nvar _expand = _interopRequireDefault(require(\"./offset/expand.js\"));\n\nvar _diverging = _interopRequireDefault(require(\"./offset/diverging.js\"));\n\nvar _none = _interopRequireDefault(require(\"./offset/none.js\"));\n\nvar _silhouette = _interopRequireDefault(require(\"./offset/silhouette.js\"));\n\nvar _wiggle = _interopRequireDefault(require(\"./offset/wiggle.js\"));\n\nvar _appearance = _interopRequireDefault(require(\"./order/appearance.js\"));\n\nvar _ascending = _interopRequireDefault(require(\"./order/ascending.js\"));\n\nvar _descending = _interopRequireDefault(require(\"./order/descending.js\"));\n\nvar _insideOut = _interopRequireDefault(require(\"./order/insideOut.js\"));\n\nvar _none2 = _interopRequireDefault(require(\"./order/none.js\"));\n\nvar _reverse = _interopRequireDefault(require(\"./order/reverse.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./arc.js\":\"BL7I\",\"./area.js\":\"IYvJ\",\"./line.js\":\"KhHE\",\"./pie.js\":\"bAZU\",\"./areaRadial.js\":\"T5gn\",\"./lineRadial.js\":\"faWF\",\"./pointRadial.js\":\"vzjT\",\"./link/index.js\":\"npGN\",\"./symbol.js\":\"bBhM\",\"./symbol/circle.js\":\"zjv7\",\"./symbol/cross.js\":\"PTh9\",\"./symbol/diamond.js\":\"fuDX\",\"./symbol/square.js\":\"bj9s\",\"./symbol/star.js\":\"L5Ql\",\"./symbol/triangle.js\":\"owZx\",\"./symbol/wye.js\":\"UZQY\",\"./curve/basisClosed.js\":\"FS5M\",\"./curve/basisOpen.js\":\"feGb\",\"./curve/basis.js\":\"cx05\",\"./curve/bundle.js\":\"iAgm\",\"./curve/cardinalClosed.js\":\"FUQi\",\"./curve/cardinalOpen.js\":\"iWbK\",\"./curve/cardinal.js\":\"DORS\",\"./curve/catmullRomClosed.js\":\"AW0P\",\"./curve/catmullRomOpen.js\":\"PGVM\",\"./curve/catmullRom.js\":\"oFi9\",\"./curve/linearClosed.js\":\"c2vC\",\"./curve/linear.js\":\"L3Qx\",\"./curve/monotone.js\":\"DNx2\",\"./curve/natural.js\":\"qyH2\",\"./curve/step.js\":\"SIad\",\"./stack.js\":\"k9Ur\",\"./offset/expand.js\":\"WOsM\",\"./offset/diverging.js\":\"PS7K\",\"./offset/none.js\":\"jW6Y\",\"./offset/silhouette.js\":\"UGaf\",\"./offset/wiggle.js\":\"zv8R\",\"./order/appearance.js\":\"Uz9Z\",\"./order/ascending.js\":\"Z1jP\",\"./order/descending.js\":\"oyxb\",\"./order/insideOut.js\":\"cmz2\",\"./order/none.js\":\"NTwk\",\"./order/reverse.js\":\"MoW7\"}],\"m19G\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = curves;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Shape = require(\"d3-shape\");\n\nvar lookup = {\n  'basis': {\n    curve: _d3Shape.curveBasis\n  },\n  'basis-closed': {\n    curve: _d3Shape.curveBasisClosed\n  },\n  'basis-open': {\n    curve: _d3Shape.curveBasisOpen\n  },\n  'bundle': {\n    curve: _d3Shape.curveBundle,\n    tension: 'beta',\n    value: 0.85\n  },\n  'cardinal': {\n    curve: _d3Shape.curveCardinal,\n    tension: 'tension',\n    value: 0\n  },\n  'cardinal-open': {\n    curve: _d3Shape.curveCardinalOpen,\n    tension: 'tension',\n    value: 0\n  },\n  'cardinal-closed': {\n    curve: _d3Shape.curveCardinalClosed,\n    tension: 'tension',\n    value: 0\n  },\n  'catmull-rom': {\n    curve: _d3Shape.curveCatmullRom,\n    tension: 'alpha',\n    value: 0.5\n  },\n  'catmull-rom-closed': {\n    curve: _d3Shape.curveCatmullRomClosed,\n    tension: 'alpha',\n    value: 0.5\n  },\n  'catmull-rom-open': {\n    curve: _d3Shape.curveCatmullRomOpen,\n    tension: 'alpha',\n    value: 0.5\n  },\n  'linear': {\n    curve: _d3Shape.curveLinear\n  },\n  'linear-closed': {\n    curve: _d3Shape.curveLinearClosed\n  },\n  'monotone': {\n    horizontal: _d3Shape.curveMonotoneY,\n    vertical: _d3Shape.curveMonotoneX\n  },\n  'natural': {\n    curve: _d3Shape.curveNatural\n  },\n  'step': {\n    curve: _d3Shape.curveStep\n  },\n  'step-after': {\n    curve: _d3Shape.curveStepAfter\n  },\n  'step-before': {\n    curve: _d3Shape.curveStepBefore\n  }\n};\n\nfunction curves(type, orientation, tension) {\n  var entry = (0, _vegaUtil.hasOwnProperty)(lookup, type) && lookup[type],\n      curve = null;\n\n  if (entry) {\n    curve = entry.curve || entry[orientation || 'vertical'];\n\n    if (entry.tension && tension != null) {\n      curve = curve[entry.tension](tension);\n    }\n  }\n\n  return curve;\n}\n},{\"vega-util\":\"d61Z\",\"d3-shape\":\"maww\"}],\"ANC8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n// Path parsing and rendering code adapted from fabric.js -- Thanks!\nvar cmdlen = {\n  m: 2,\n  l: 2,\n  h: 1,\n  v: 1,\n  c: 6,\n  s: 4,\n  q: 4,\n  t: 2,\n  a: 7\n},\n    regexp = [/([MLHVCSQTAZmlhvcsqtaz])/g, /###/, /(\\d)([-+])/g, /\\s|,|###/];\n\nfunction _default(pathstr) {\n  var result = [],\n      path,\n      curr,\n      chunks,\n      parsed,\n      param,\n      cmd,\n      len,\n      i,\n      j,\n      n,\n      m; // First, break path into command sequence\n\n  path = pathstr.slice().replace(regexp[0], '###$1').split(regexp[1]).slice(1); // Next, parse each command in turn\n\n  for (i = 0, n = path.length; i < n; ++i) {\n    curr = path[i];\n    chunks = curr.slice(1).trim().replace(regexp[2], '$1###$2').split(regexp[3]);\n    cmd = curr.charAt(0);\n    parsed = [cmd];\n\n    for (j = 0, m = chunks.length; j < m; ++j) {\n      if ((param = +chunks[j]) === param) {\n        // not NaN\n        parsed.push(param);\n      }\n    }\n\n    len = cmdlen[cmd.toLowerCase()];\n\n    if (parsed.length - 1 > len) {\n      for (j = 1, m = parsed.length; j < m; j += len) {\n        result.push([cmd].concat(parsed.slice(j, j + len)));\n      }\n    } else {\n      result.push(parsed);\n    }\n  }\n\n  return result;\n}\n},{}],\"Skbj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.HalfSqrt3 = exports.Tau = exports.HalfPi = exports.DegToRad = void 0;\nvar DegToRad = Math.PI / 180;\nexports.DegToRad = DegToRad;\nvar HalfPi = Math.PI / 2;\nexports.HalfPi = HalfPi;\nvar Tau = Math.PI * 2;\nexports.Tau = Tau;\nvar HalfSqrt3 = Math.sqrt(3) / 2;\nexports.HalfSqrt3 = HalfSqrt3;\n},{}],\"iKR3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.segments = segments;\nexports.bezier = bezier;\nexports.bezierCache = exports.segmentCache = void 0;\n\nvar _constants = require(\"../util/constants\");\n\nvar segmentCache = {};\nexports.segmentCache = segmentCache;\nvar bezierCache = {};\nexports.bezierCache = bezierCache;\nvar join = [].join; // Copied from Inkscape svgtopdf, thanks!\n\nfunction segments(x, y, rx, ry, large, sweep, rotateX, ox, oy) {\n  var key = join.call(arguments);\n\n  if (segmentCache[key]) {\n    return segmentCache[key];\n  }\n\n  var th = rotateX * _constants.DegToRad;\n  var sin_th = Math.sin(th);\n  var cos_th = Math.cos(th);\n  rx = Math.abs(rx);\n  ry = Math.abs(ry);\n  var px = cos_th * (ox - x) * 0.5 + sin_th * (oy - y) * 0.5;\n  var py = cos_th * (oy - y) * 0.5 - sin_th * (ox - x) * 0.5;\n  var pl = px * px / (rx * rx) + py * py / (ry * ry);\n\n  if (pl > 1) {\n    pl = Math.sqrt(pl);\n    rx *= pl;\n    ry *= pl;\n  }\n\n  var a00 = cos_th / rx;\n  var a01 = sin_th / rx;\n  var a10 = -sin_th / ry;\n  var a11 = cos_th / ry;\n  var x0 = a00 * ox + a01 * oy;\n  var y0 = a10 * ox + a11 * oy;\n  var x1 = a00 * x + a01 * y;\n  var y1 = a10 * x + a11 * y;\n  var d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);\n  var sfactor_sq = 1 / d - 0.25;\n  if (sfactor_sq < 0) sfactor_sq = 0;\n  var sfactor = Math.sqrt(sfactor_sq);\n  if (sweep == large) sfactor = -sfactor;\n  var xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);\n  var yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);\n  var th0 = Math.atan2(y0 - yc, x0 - xc);\n  var th1 = Math.atan2(y1 - yc, x1 - xc);\n  var th_arc = th1 - th0;\n\n  if (th_arc < 0 && sweep === 1) {\n    th_arc += _constants.Tau;\n  } else if (th_arc > 0 && sweep === 0) {\n    th_arc -= _constants.Tau;\n  }\n\n  var segs = Math.ceil(Math.abs(th_arc / (_constants.HalfPi + 0.001)));\n  var result = [];\n\n  for (var i = 0; i < segs; ++i) {\n    var th2 = th0 + i * th_arc / segs;\n    var th3 = th0 + (i + 1) * th_arc / segs;\n    result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];\n  }\n\n  return segmentCache[key] = result;\n}\n\nfunction bezier(params) {\n  var key = join.call(params);\n\n  if (bezierCache[key]) {\n    return bezierCache[key];\n  }\n\n  var cx = params[0],\n      cy = params[1],\n      th0 = params[2],\n      th1 = params[3],\n      rx = params[4],\n      ry = params[5],\n      sin_th = params[6],\n      cos_th = params[7];\n  var a00 = cos_th * rx;\n  var a01 = -sin_th * ry;\n  var a10 = sin_th * rx;\n  var a11 = cos_th * ry;\n  var cos_th0 = Math.cos(th0);\n  var sin_th0 = Math.sin(th0);\n  var cos_th1 = Math.cos(th1);\n  var sin_th1 = Math.sin(th1);\n  var th_half = 0.5 * (th1 - th0);\n  var sin_th_h2 = Math.sin(th_half * 0.5);\n  var t = 8 / 3 * sin_th_h2 * sin_th_h2 / Math.sin(th_half);\n  var x1 = cx + cos_th0 - t * sin_th0;\n  var y1 = cy + sin_th0 + t * cos_th0;\n  var x3 = cx + cos_th1;\n  var y3 = cy + sin_th1;\n  var x2 = x3 + t * sin_th1;\n  var y2 = y3 - t * cos_th1;\n  return bezierCache[key] = [a00 * x1 + a01 * y1, a10 * x1 + a11 * y1, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3];\n}\n},{\"../util/constants\":\"Skbj\"}],\"H11R\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _arc = require(\"./arc\");\n\nvar temp = ['l', 0, 0, 0, 0, 0, 0, 0];\n\nfunction scale(current, sX, sY) {\n  var c = temp[0] = current[0];\n\n  if (c === 'a' || c === 'A') {\n    temp[1] = sX * current[1];\n    temp[2] = sY * current[2];\n    temp[3] = current[3];\n    temp[4] = current[4];\n    temp[5] = current[5];\n    temp[6] = sX * current[6];\n    temp[7] = sY * current[7];\n  } else if (c === 'h' || c === 'H') {\n    temp[1] = sX * current[1];\n  } else if (c === 'v' || c === 'V') {\n    temp[1] = sY * current[1];\n  } else {\n    for (var i = 1, n = current.length; i < n; ++i) {\n      temp[i] = (i % 2 == 1 ? sX : sY) * current[i];\n    }\n  }\n\n  return temp;\n}\n\nfunction _default(context, path, l, t, sX, sY) {\n  var current,\n      // current instruction\n  previous = null,\n      x = 0,\n      // current x\n  y = 0,\n      // current y\n  controlX = 0,\n      // current control point x\n  controlY = 0,\n      // current control point y\n  tempX,\n      tempY,\n      tempControlX,\n      tempControlY;\n  if (l == null) l = 0;\n  if (t == null) t = 0;\n  if (sX == null) sX = 1;\n  if (sY == null) sY = sX;\n  if (context.beginPath) context.beginPath();\n\n  for (var i = 0, len = path.length; i < len; ++i) {\n    current = path[i];\n\n    if (sX !== 1 || sY !== 1) {\n      current = scale(current, sX, sY);\n    }\n\n    switch (current[0]) {\n      // first letter\n      case 'l':\n        // lineto, relative\n        x += current[1];\n        y += current[2];\n        context.lineTo(x + l, y + t);\n        break;\n\n      case 'L':\n        // lineto, absolute\n        x = current[1];\n        y = current[2];\n        context.lineTo(x + l, y + t);\n        break;\n\n      case 'h':\n        // horizontal lineto, relative\n        x += current[1];\n        context.lineTo(x + l, y + t);\n        break;\n\n      case 'H':\n        // horizontal lineto, absolute\n        x = current[1];\n        context.lineTo(x + l, y + t);\n        break;\n\n      case 'v':\n        // vertical lineto, relative\n        y += current[1];\n        context.lineTo(x + l, y + t);\n        break;\n\n      case 'V':\n        // verical lineto, absolute\n        y = current[1];\n        context.lineTo(x + l, y + t);\n        break;\n\n      case 'm':\n        // moveTo, relative\n        x += current[1];\n        y += current[2];\n        context.moveTo(x + l, y + t);\n        break;\n\n      case 'M':\n        // moveTo, absolute\n        x = current[1];\n        y = current[2];\n        context.moveTo(x + l, y + t);\n        break;\n\n      case 'c':\n        // bezierCurveTo, relative\n        tempX = x + current[5];\n        tempY = y + current[6];\n        controlX = x + current[3];\n        controlY = y + current[4];\n        context.bezierCurveTo(x + current[1] + l, // x1\n        y + current[2] + t, // y1\n        controlX + l, // x2\n        controlY + t, // y2\n        tempX + l, tempY + t);\n        x = tempX;\n        y = tempY;\n        break;\n\n      case 'C':\n        // bezierCurveTo, absolute\n        x = current[5];\n        y = current[6];\n        controlX = current[3];\n        controlY = current[4];\n        context.bezierCurveTo(current[1] + l, current[2] + t, controlX + l, controlY + t, x + l, y + t);\n        break;\n\n      case 's':\n        // shorthand cubic bezierCurveTo, relative\n        // transform to absolute x,y\n        tempX = x + current[3];\n        tempY = y + current[4]; // calculate reflection of previous control points\n\n        controlX = 2 * x - controlX;\n        controlY = 2 * y - controlY;\n        context.bezierCurveTo(controlX + l, controlY + t, x + current[1] + l, y + current[2] + t, tempX + l, tempY + t); // set control point to 2nd one of this command\n        // the first control point is assumed to be the reflection of\n        // the second control point on the previous command relative\n        // to the current point.\n\n        controlX = x + current[1];\n        controlY = y + current[2];\n        x = tempX;\n        y = tempY;\n        break;\n\n      case 'S':\n        // shorthand cubic bezierCurveTo, absolute\n        tempX = current[3];\n        tempY = current[4]; // calculate reflection of previous control points\n\n        controlX = 2 * x - controlX;\n        controlY = 2 * y - controlY;\n        context.bezierCurveTo(controlX + l, controlY + t, current[1] + l, current[2] + t, tempX + l, tempY + t);\n        x = tempX;\n        y = tempY; // set control point to 2nd one of this command\n        // the first control point is assumed to be the reflection of\n        // the second control point on the previous command relative\n        // to the current point.\n\n        controlX = current[1];\n        controlY = current[2];\n        break;\n\n      case 'q':\n        // quadraticCurveTo, relative\n        // transform to absolute x,y\n        tempX = x + current[3];\n        tempY = y + current[4];\n        controlX = x + current[1];\n        controlY = y + current[2];\n        context.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n        x = tempX;\n        y = tempY;\n        break;\n\n      case 'Q':\n        // quadraticCurveTo, absolute\n        tempX = current[3];\n        tempY = current[4];\n        context.quadraticCurveTo(current[1] + l, current[2] + t, tempX + l, tempY + t);\n        x = tempX;\n        y = tempY;\n        controlX = current[1];\n        controlY = current[2];\n        break;\n\n      case 't':\n        // shorthand quadraticCurveTo, relative\n        // transform to absolute x,y\n        tempX = x + current[1];\n        tempY = y + current[2];\n\n        if (previous[0].match(/[QqTt]/) === null) {\n          // If there is no previous command or if the previous command was not a Q, q, T or t,\n          // assume the control point is coincident with the current point\n          controlX = x;\n          controlY = y;\n        } else if (previous[0] === 't') {\n          // calculate reflection of previous control points for t\n          controlX = 2 * x - tempControlX;\n          controlY = 2 * y - tempControlY;\n        } else if (previous[0] === 'q') {\n          // calculate reflection of previous control points for q\n          controlX = 2 * x - controlX;\n          controlY = 2 * y - controlY;\n        }\n\n        tempControlX = controlX;\n        tempControlY = controlY;\n        context.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n        x = tempX;\n        y = tempY;\n        controlX = x + current[1];\n        controlY = y + current[2];\n        break;\n\n      case 'T':\n        tempX = current[1];\n        tempY = current[2]; // calculate reflection of previous control points\n\n        controlX = 2 * x - controlX;\n        controlY = 2 * y - controlY;\n        context.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n        x = tempX;\n        y = tempY;\n        break;\n\n      case 'a':\n        drawArc(context, x + l, y + t, [current[1], current[2], current[3], current[4], current[5], current[6] + x + l, current[7] + y + t]);\n        x += current[6];\n        y += current[7];\n        break;\n\n      case 'A':\n        drawArc(context, x + l, y + t, [current[1], current[2], current[3], current[4], current[5], current[6] + l, current[7] + t]);\n        x = current[6];\n        y = current[7];\n        break;\n\n      case 'z':\n      case 'Z':\n        context.closePath();\n        break;\n    }\n\n    previous = current;\n  }\n}\n\nfunction drawArc(context, x, y, coords) {\n  var seg = (0, _arc.segments)(coords[5], // end x\n  coords[6], // end y\n  coords[0], // radius x\n  coords[1], // radius y\n  coords[3], // large flag\n  coords[4], // sweep flag\n  coords[2], // rotation\n  x, y);\n\n  for (var i = 0; i < seg.length; ++i) {\n    var bez = (0, _arc.bezier)(seg[i]);\n    context.bezierCurveTo(bez[0], bez[1], bez[2], bez[3], bez[4], bez[5]);\n  }\n}\n},{\"./arc\":\"iKR3\"}],\"EeJn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = symbols;\n\nvar _parse = _interopRequireDefault(require(\"./parse\"));\n\nvar _render = _interopRequireDefault(require(\"./render\"));\n\nvar _constants = require(\"../util/constants\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Tan30 = 0.5773502691896257;\nvar builtins = {\n  'circle': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2;\n      context.moveTo(r, 0);\n      context.arc(0, 0, r, 0, _constants.Tau);\n    }\n  },\n  'cross': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2,\n          s = r / 2.5;\n      context.moveTo(-r, -s);\n      context.lineTo(-r, s);\n      context.lineTo(-s, s);\n      context.lineTo(-s, r);\n      context.lineTo(s, r);\n      context.lineTo(s, s);\n      context.lineTo(r, s);\n      context.lineTo(r, -s);\n      context.lineTo(s, -s);\n      context.lineTo(s, -r);\n      context.lineTo(-s, -r);\n      context.lineTo(-s, -s);\n      context.closePath();\n    }\n  },\n  'diamond': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2;\n      context.moveTo(-r, 0);\n      context.lineTo(0, -r);\n      context.lineTo(r, 0);\n      context.lineTo(0, r);\n      context.closePath();\n    }\n  },\n  'square': {\n    draw: function (context, size) {\n      var w = Math.sqrt(size),\n          x = -w / 2;\n      context.rect(x, x, w, w);\n    }\n  },\n  'arrow': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2,\n          s = r / 7,\n          t = r / 2.5,\n          v = r / 8;\n      context.moveTo(-s, r);\n      context.lineTo(s, r);\n      context.lineTo(s, -v);\n      context.lineTo(t, -v);\n      context.lineTo(0, -r);\n      context.lineTo(-t, -v);\n      context.lineTo(-s, -v);\n      context.closePath();\n    }\n  },\n  'wedge': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2,\n          h = _constants.HalfSqrt3 * r,\n          o = h - r * Tan30,\n          b = r / 4;\n      context.moveTo(0, -h - o);\n      context.lineTo(-b, h - o);\n      context.lineTo(b, h - o);\n      context.closePath();\n    }\n  },\n  'triangle': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2,\n          h = _constants.HalfSqrt3 * r,\n          o = h - r * Tan30;\n      context.moveTo(0, -h - o);\n      context.lineTo(-r, h - o);\n      context.lineTo(r, h - o);\n      context.closePath();\n    }\n  },\n  'triangle-up': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2,\n          h = _constants.HalfSqrt3 * r;\n      context.moveTo(0, -h);\n      context.lineTo(-r, h);\n      context.lineTo(r, h);\n      context.closePath();\n    }\n  },\n  'triangle-down': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2,\n          h = _constants.HalfSqrt3 * r;\n      context.moveTo(0, h);\n      context.lineTo(-r, -h);\n      context.lineTo(r, -h);\n      context.closePath();\n    }\n  },\n  'triangle-right': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2,\n          h = _constants.HalfSqrt3 * r;\n      context.moveTo(h, 0);\n      context.lineTo(-h, -r);\n      context.lineTo(-h, r);\n      context.closePath();\n    }\n  },\n  'triangle-left': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2,\n          h = _constants.HalfSqrt3 * r;\n      context.moveTo(-h, 0);\n      context.lineTo(h, -r);\n      context.lineTo(h, r);\n      context.closePath();\n    }\n  },\n  'stroke': {\n    draw: function (context, size) {\n      var r = Math.sqrt(size) / 2;\n      context.moveTo(-r, 0);\n      context.lineTo(r, 0);\n    }\n  }\n};\n\nfunction symbols(_) {\n  return (0, _vegaUtil.hasOwnProperty)(builtins, _) ? builtins[_] : customSymbol(_);\n}\n\nvar custom = {};\n\nfunction customSymbol(path) {\n  if (!(0, _vegaUtil.hasOwnProperty)(custom, path)) {\n    var parsed = (0, _parse.default)(path);\n    custom[path] = {\n      draw: function (context, size) {\n        (0, _render.default)(context, parsed, 0, 0, Math.sqrt(size) / 2);\n      }\n    };\n  }\n\n  return custom[path];\n}\n},{\"./parse\":\"ANC8\",\"./render\":\"H11R\",\"../util/constants\":\"Skbj\",\"vega-util\":\"d61Z\"}],\"zxxl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Path = require(\"d3-path\");\n\n// See http://spencermortensen.com/articles/bezier-circle/\nconst C = 0.448084975506; // C = 1 - c\n\nfunction rectangleX(d) {\n  return d.x;\n}\n\nfunction rectangleY(d) {\n  return d.y;\n}\n\nfunction rectangleWidth(d) {\n  return d.width;\n}\n\nfunction rectangleHeight(d) {\n  return d.height;\n}\n\nfunction number(_) {\n  return typeof _ === 'function' ? _ : () => +_;\n}\n\nfunction clamp(value, min, max) {\n  return Math.max(min, Math.min(value, max));\n}\n\nfunction _default() {\n  var x = rectangleX,\n      y = rectangleY,\n      width = rectangleWidth,\n      height = rectangleHeight,\n      crTL = number(0),\n      crTR = crTL,\n      crBL = crTL,\n      crBR = crTL,\n      context = null;\n\n  function rectangle(_, x0, y0) {\n    var buffer,\n        x1 = x0 != null ? x0 : +x.call(this, _),\n        y1 = y0 != null ? y0 : +y.call(this, _),\n        w = +width.call(this, _),\n        h = +height.call(this, _),\n        s = Math.min(w, h) / 2,\n        tl = clamp(+crTL.call(this, _), 0, s),\n        tr = clamp(+crTR.call(this, _), 0, s),\n        bl = clamp(+crBL.call(this, _), 0, s),\n        br = clamp(+crBR.call(this, _), 0, s);\n    if (!context) context = buffer = (0, _d3Path.path)();\n\n    if (tl <= 0 && tr <= 0 && bl <= 0 && br <= 0) {\n      context.rect(x1, y1, w, h);\n    } else {\n      var x2 = x1 + w,\n          y2 = y1 + h;\n      context.moveTo(x1 + tl, y1);\n      context.lineTo(x2 - tr, y1);\n      context.bezierCurveTo(x2 - C * tr, y1, x2, y1 + C * tr, x2, y1 + tr);\n      context.lineTo(x2, y2 - br);\n      context.bezierCurveTo(x2, y2 - C * br, x2 - C * br, y2, x2 - br, y2);\n      context.lineTo(x1 + bl, y2);\n      context.bezierCurveTo(x1 + C * bl, y2, x1, y2 - C * bl, x1, y2 - bl);\n      context.lineTo(x1, y1 + tl);\n      context.bezierCurveTo(x1, y1 + C * tl, x1 + C * tl, y1, x1 + tl, y1);\n      context.closePath();\n    }\n\n    if (buffer) {\n      context = null;\n      return buffer + '' || null;\n    }\n  }\n\n  rectangle.x = function (_) {\n    if (arguments.length) {\n      x = number(_);\n      return rectangle;\n    } else {\n      return x;\n    }\n  };\n\n  rectangle.y = function (_) {\n    if (arguments.length) {\n      y = number(_);\n      return rectangle;\n    } else {\n      return y;\n    }\n  };\n\n  rectangle.width = function (_) {\n    if (arguments.length) {\n      width = number(_);\n      return rectangle;\n    } else {\n      return width;\n    }\n  };\n\n  rectangle.height = function (_) {\n    if (arguments.length) {\n      height = number(_);\n      return rectangle;\n    } else {\n      return height;\n    }\n  };\n\n  rectangle.cornerRadius = function (tl, tr, br, bl) {\n    if (arguments.length) {\n      crTL = number(tl);\n      crTR = tr != null ? number(tr) : crTL;\n      crBR = br != null ? number(br) : crTL;\n      crBL = bl != null ? number(bl) : crTR;\n      return rectangle;\n    } else {\n      return crTL;\n    }\n  };\n\n  rectangle.context = function (_) {\n    if (arguments.length) {\n      context = _ == null ? null : _;\n      return rectangle;\n    } else {\n      return context;\n    }\n  };\n\n  return rectangle;\n}\n},{\"d3-path\":\"OTyq\"}],\"qISZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../util/constants\");\n\nvar _d3Path = require(\"d3-path\");\n\nfunction _default() {\n  var x,\n      y,\n      size,\n      defined,\n      context = null,\n      ready,\n      x1,\n      y1,\n      r1;\n\n  function point(x2, y2, w2) {\n    var r2 = w2 / 2;\n\n    if (ready) {\n      var ux = y1 - y2,\n          uy = x2 - x1;\n\n      if (ux || uy) {\n        // get normal vector\n        var ud = Math.sqrt(ux * ux + uy * uy),\n            rx = (ux /= ud) * r1,\n            ry = (uy /= ud) * r1,\n            t = Math.atan2(uy, ux); // draw segment\n\n        context.moveTo(x1 - rx, y1 - ry);\n        context.lineTo(x2 - ux * r2, y2 - uy * r2);\n        context.arc(x2, y2, r2, t - Math.PI, t);\n        context.lineTo(x1 + rx, y1 + ry);\n        context.arc(x1, y1, r1, t, t + Math.PI);\n      } else {\n        context.arc(x2, y2, r2, 0, _constants.Tau);\n      }\n\n      context.closePath();\n    } else {\n      ready = 1;\n    }\n\n    x1 = x2;\n    y1 = y2;\n    r1 = r2;\n  }\n\n  function trail(data) {\n    var i,\n        n = data.length,\n        d,\n        defined0 = false,\n        buffer;\n    if (context == null) context = buffer = (0, _d3Path.path)();\n\n    for (i = 0; i <= n; ++i) {\n      if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n        if (defined0 = !defined0) ready = 0;\n      }\n\n      if (defined0) point(+x(d, i, data), +y(d, i, data), +size(d, i, data));\n    }\n\n    if (buffer) {\n      context = null;\n      return buffer + '' || null;\n    }\n  }\n\n  trail.x = function (_) {\n    if (arguments.length) {\n      x = _;\n      return trail;\n    } else {\n      return x;\n    }\n  };\n\n  trail.y = function (_) {\n    if (arguments.length) {\n      y = _;\n      return trail;\n    } else {\n      return y;\n    }\n  };\n\n  trail.size = function (_) {\n    if (arguments.length) {\n      size = _;\n      return trail;\n    } else {\n      return size;\n    }\n  };\n\n  trail.defined = function (_) {\n    if (arguments.length) {\n      defined = _;\n      return trail;\n    } else {\n      return defined;\n    }\n  };\n\n  trail.context = function (_) {\n    if (arguments.length) {\n      if (_ == null) {\n        context = null;\n      } else {\n        context = _;\n      }\n\n      return trail;\n    } else {\n      return context;\n    }\n  };\n\n  return trail;\n}\n},{\"../util/constants\":\"Skbj\",\"d3-path\":\"OTyq\"}],\"uzF6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.hasCornerRadius = hasCornerRadius;\nexports.arc = arc;\nexports.area = area;\nexports.line = line;\nexports.rectangle = rectangle;\nexports.shape = shape;\nexports.symbol = symbol;\nexports.trail = trail;\n\nvar _curves = _interopRequireDefault(require(\"./curves\"));\n\nvar _symbols = _interopRequireDefault(require(\"./symbols\"));\n\nvar _rectangle = _interopRequireDefault(require(\"./rectangle\"));\n\nvar _trail = _interopRequireDefault(require(\"./trail\"));\n\nvar _d3Shape = require(\"d3-shape\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction value(a, b) {\n  return a != null ? a : b;\n}\n\nconst x = item => item.x || 0,\n      y = item => item.y || 0,\n      w = item => item.width || 0,\n      h = item => item.height || 0,\n      xw = item => (item.x || 0) + (item.width || 0),\n      yh = item => (item.y || 0) + (item.height || 0),\n      sa = item => item.startAngle || 0,\n      ea = item => item.endAngle || 0,\n      pa = item => item.padAngle || 0,\n      ir = item => item.innerRadius || 0,\n      or = item => item.outerRadius || 0,\n      cr = item => item.cornerRadius || 0,\n      tl = item => value(item.cornerRadiusTopLeft, item.cornerRadius) || 0,\n      tr = item => value(item.cornerRadiusTopRight, item.cornerRadius) || 0,\n      br = item => value(item.cornerRadiusBottomRight, item.cornerRadius) || 0,\n      bl = item => value(item.cornerRadiusBottomLeft, item.cornerRadius) || 0,\n      sz = item => value(item.size, 64),\n      ts = item => item.size || 1,\n      def = item => !(item.defined === false),\n      type = item => (0, _symbols.default)(item.shape || 'circle');\n\nconst arcShape = (0, _d3Shape.arc)().startAngle(sa).endAngle(ea).padAngle(pa).innerRadius(ir).outerRadius(or).cornerRadius(cr),\n      areavShape = (0, _d3Shape.area)().x(x).y1(y).y0(yh).defined(def),\n      areahShape = (0, _d3Shape.area)().y(y).x1(x).x0(xw).defined(def),\n      lineShape = (0, _d3Shape.line)().x(x).y(y).defined(def),\n      rectShape = (0, _rectangle.default)().x(x).y(y).width(w).height(h).cornerRadius(tl, tr, br, bl),\n      symbolShape = (0, _d3Shape.symbol)().type(type).size(sz),\n      trailShape = (0, _trail.default)().x(x).y(y).defined(def).size(ts);\n\nfunction hasCornerRadius(item) {\n  return item.cornerRadius || item.cornerRadiusTopLeft || item.cornerRadiusTopRight || item.cornerRadiusBottomRight || item.cornerRadiusBottomLeft;\n}\n\nfunction arc(context, item) {\n  return arcShape.context(context)(item);\n}\n\nfunction area(context, items) {\n  var item = items[0],\n      interp = item.interpolate || 'linear';\n  return (item.orient === 'horizontal' ? areahShape : areavShape).curve((0, _curves.default)(interp, item.orient, item.tension)).context(context)(items);\n}\n\nfunction line(context, items) {\n  var item = items[0],\n      interp = item.interpolate || 'linear';\n  return lineShape.curve((0, _curves.default)(interp, item.orient, item.tension)).context(context)(items);\n}\n\nfunction rectangle(context, item, x, y) {\n  return rectShape.context(context)(item, x, y);\n}\n\nfunction shape(context, item) {\n  return (item.mark.shape || item.shape).context(context)(item);\n}\n\nfunction symbol(context, item) {\n  return symbolShape.context(context)(item);\n}\n\nfunction trail(context, items) {\n  return trailShape.context(context)(items);\n}\n},{\"./curves\":\"m19G\",\"./symbols\":\"EeJn\",\"./rectangle\":\"zxxl\",\"./trail\":\"qISZ\",\"d3-shape\":\"maww\"}],\"a802\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(bounds, item, miter) {\n  if (item.stroke && item.opacity !== 0 && item.strokeOpacity !== 0) {\n    const sw = item.strokeWidth != null ? +item.strokeWidth : 1;\n    bounds.expand(sw + (miter ? miterAdjustment(item, sw) : 0));\n  }\n\n  return bounds;\n}\n\nfunction miterAdjustment(item, strokeWidth) {\n  // TODO: more sophisticated adjustment? Or miter support in boundContext?\n  return item.strokeJoin && item.strokeJoin !== 'miter' ? 0 : strokeWidth;\n}\n},{}],\"Kn7H\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = context;\n\nvar _constants = require(\"../util/constants\");\n\nvar bounds,\n    circleThreshold = _constants.Tau - 1e-8;\n\nfunction context(_) {\n  bounds = _;\n  return context;\n}\n\nfunction noop() {}\n\nfunction add(x, y) {\n  bounds.add(x, y);\n}\n\ncontext.beginPath = noop;\ncontext.closePath = noop;\ncontext.moveTo = add;\ncontext.lineTo = add;\n\ncontext.rect = function (x, y, w, h) {\n  add(x, y);\n  add(x + w, y + h);\n};\n\ncontext.quadraticCurveTo = function (x1, y1, x2, y2) {\n  add(x1, y1);\n  add(x2, y2);\n};\n\ncontext.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) {\n  add(x1, y1);\n  add(x2, y2);\n  add(x3, y3);\n};\n\ncontext.arc = function (cx, cy, r, sa, ea, ccw) {\n  if (Math.abs(ea - sa) > circleThreshold) {\n    add(cx - r, cy - r);\n    add(cx + r, cy + r);\n    return;\n  }\n\n  var xmin = Infinity,\n      xmax = -Infinity,\n      ymin = Infinity,\n      ymax = -Infinity,\n      s,\n      i,\n      x,\n      y;\n\n  function update(a) {\n    x = r * Math.cos(a);\n    y = r * Math.sin(a);\n    if (x < xmin) xmin = x;\n    if (x > xmax) xmax = x;\n    if (y < ymin) ymin = y;\n    if (y > ymax) ymax = y;\n  } // Sample end points and interior points aligned with 90 degrees\n\n\n  update(sa);\n  update(ea);\n\n  if (ea !== sa) {\n    sa = sa % _constants.Tau;\n    if (sa < 0) sa += _constants.Tau;\n    ea = ea % _constants.Tau;\n    if (ea < 0) ea += _constants.Tau;\n\n    if (ea < sa) {\n      ccw = !ccw; // flip direction\n\n      s = sa;\n      sa = ea;\n      ea = s; // swap end-points\n    }\n\n    if (ccw) {\n      ea -= _constants.Tau;\n      s = sa - sa % _constants.HalfPi;\n\n      for (i = 0; i < 4 && s > ea; ++i, s -= _constants.HalfPi) update(s);\n    } else {\n      s = sa - sa % _constants.HalfPi + _constants.HalfPi;\n\n      for (i = 0; i < 4 && s < ea; ++i, s = s + _constants.HalfPi) update(s);\n    }\n  }\n\n  add(cx + xmin, cy + ymin);\n  add(cx + xmax, cy + ymax);\n};\n},{\"../util/constants\":\"Skbj\"}],\"jnR2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.context = void 0;\n\nvar _vegaCanvas = require(\"vega-canvas\");\n\nvar context = (exports.context = context = (0, _vegaCanvas.canvas)(1, 1)) ? context.getContext('2d') : null;\nexports.context = context;\n},{\"vega-canvas\":\"r2P5\"}],\"pmRF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.intersectPath = intersectPath;\nexports.intersectPoint = intersectPoint;\nexports.intersectRect = intersectRect;\nexports.intersectRule = intersectRule;\nexports.intersectBoxLine = intersectBoxLine;\n\nvar _context = require(\"./canvas/context\");\n\nvar _Bounds = _interopRequireDefault(require(\"../Bounds\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst b = new _Bounds.default();\n\nfunction intersectPath(draw) {\n  return function (item, brush) {\n    // rely on (inaccurate) bounds intersection if no context\n    if (!_context.context) return true; // add path to offscreen graphics context\n\n    draw(_context.context, item); // get bounds intersection region\n\n    b.clear().union(item.bounds).intersect(brush).round();\n    const {\n      x1,\n      y1,\n      x2,\n      y2\n    } = b; // iterate over intersection region\n    // perform fine grained inclusion test\n\n    for (let y = y1; y <= y2; ++y) {\n      for (let x = x1; x <= x2; ++x) {\n        if (_context.context.isPointInPath(x, y)) {\n          return true;\n        }\n      }\n    } // false if no hits in intersection region\n\n\n    return false;\n  };\n}\n\nfunction intersectPoint(item, box) {\n  return box.contains(item.x || 0, item.y || 0);\n}\n\nfunction intersectRect(item, box) {\n  const x = item.x || 0,\n        y = item.y || 0,\n        w = item.width || 0,\n        h = item.height || 0;\n  return box.intersects(b.set(x, y, x + w, y + h));\n}\n\nfunction intersectRule(item, box) {\n  const x = item.x || 0,\n        y = item.y || 0,\n        x2 = item.x2 != null ? item.x2 : x,\n        y2 = item.y2 != null ? item.y2 : y;\n  return intersectBoxLine(box, x, y, x2, y2);\n}\n\nfunction intersectBoxLine(box, x, y, u, v) {\n  const {\n    x1,\n    y1,\n    x2,\n    y2\n  } = box,\n        dx = u - x,\n        dy = v - y;\n  let t0 = 0,\n      t1 = 1,\n      p,\n      q,\n      r,\n      e;\n\n  for (e = 0; e < 4; ++e) {\n    if (e === 0) {\n      p = -dx;\n      q = -(x1 - x);\n    }\n\n    if (e === 1) {\n      p = dx;\n      q = x2 - x;\n    }\n\n    if (e === 2) {\n      p = -dy;\n      q = -(y1 - y);\n    }\n\n    if (e === 3) {\n      p = dy;\n      q = y2 - y;\n    }\n\n    if (Math.abs(p) < 1e-10 && q < 0) return false;\n    r = q / p;\n\n    if (p < 0) {\n      if (r > t1) return false;else if (r > t0) t0 = r;\n    } else if (p > 0) {\n      if (r < t0) return false;else if (r < t1) t1 = r;\n    }\n  }\n\n  return true;\n}\n},{\"./canvas/context\":\"jnR2\",\"../Bounds\":\"qFnp\"}],\"bYPb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(context, gradient, bounds) {\n  const w = bounds.width(),\n        h = bounds.height(),\n        stop = gradient.stops,\n        n = stop.length;\n  const canvasGradient = gradient.gradient === 'radial' ? context.createRadialGradient(bounds.x1 + v(gradient.x1, 0.5) * w, bounds.y1 + v(gradient.y1, 0.5) * h, Math.max(w, h) * v(gradient.r1, 0), bounds.x1 + v(gradient.x2, 0.5) * w, bounds.y1 + v(gradient.y2, 0.5) * h, Math.max(w, h) * v(gradient.r2, 0.5)) : context.createLinearGradient(bounds.x1 + v(gradient.x1, 0) * w, bounds.y1 + v(gradient.y1, 0) * h, bounds.x1 + v(gradient.x2, 1) * w, bounds.y1 + v(gradient.y2, 0) * h);\n\n  for (let i = 0; i < n; ++i) {\n    canvasGradient.addColorStop(stop[i].offset, stop[i].color);\n  }\n\n  return canvasGradient;\n}\n\nfunction v(value, dflt) {\n  return value == null ? dflt : value;\n}\n},{}],\"Mtdq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _Gradient = require(\"../../Gradient\");\n\nvar _gradient = _interopRequireDefault(require(\"./gradient\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(context, item, value) {\n  return (0, _Gradient.isGradient)(value) ? (0, _gradient.default)(context, value, item.bounds) : value;\n}\n},{\"../../Gradient\":\"ERld\",\"./gradient\":\"bYPb\"}],\"jDkj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _color = _interopRequireDefault(require(\"./color\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(context, item, opacity) {\n  opacity *= item.fillOpacity == null ? 1 : item.fillOpacity;\n\n  if (opacity > 0) {\n    context.globalAlpha = opacity;\n    context.fillStyle = (0, _color.default)(context, item, item.fill);\n    return true;\n  } else {\n    return false;\n  }\n}\n},{\"./color\":\"Mtdq\"}],\"N1x5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _color = _interopRequireDefault(require(\"./color\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Empty = [];\n\nfunction _default(context, item, opacity) {\n  var lw = (lw = item.strokeWidth) != null ? lw : 1;\n  if (lw <= 0) return false;\n  opacity *= item.strokeOpacity == null ? 1 : item.strokeOpacity;\n\n  if (opacity > 0) {\n    context.globalAlpha = opacity;\n    context.strokeStyle = (0, _color.default)(context, item, item.stroke);\n    context.lineWidth = lw;\n    context.lineCap = item.strokeCap || 'butt';\n    context.lineJoin = item.strokeJoin || 'miter';\n    context.miterLimit = item.strokeMiterLimit || 10;\n\n    if (context.setLineDash) {\n      context.setLineDash(item.strokeDash || Empty);\n      context.lineDashOffset = item.strokeDashOffset || 0;\n    }\n\n    return true;\n  } else {\n    return false;\n  }\n}\n},{\"./color\":\"Mtdq\"}],\"k1ty\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.zorder = zorder;\nexports.visit = visit;\nexports.pickVisit = pickVisit;\n\nfunction compare(a, b) {\n  return a.zindex - b.zindex || a.index - b.index;\n}\n\nfunction zorder(scene) {\n  if (!scene.zdirty) return scene.zitems;\n  var items = scene.items,\n      output = [],\n      item,\n      i,\n      n;\n\n  for (i = 0, n = items.length; i < n; ++i) {\n    item = items[i];\n    item.index = i;\n    if (item.zindex) output.push(item);\n  }\n\n  scene.zdirty = false;\n  return scene.zitems = output.sort(compare);\n}\n\nfunction visit(scene, visitor) {\n  var items = scene.items,\n      i,\n      n;\n  if (!items || !items.length) return;\n  var zitems = zorder(scene);\n\n  if (zitems && zitems.length) {\n    for (i = 0, n = items.length; i < n; ++i) {\n      if (!items[i].zindex) visitor(items[i]);\n    }\n\n    items = zitems;\n  }\n\n  for (i = 0, n = items.length; i < n; ++i) {\n    visitor(items[i]);\n  }\n}\n\nfunction pickVisit(scene, visitor) {\n  var items = scene.items,\n      hit,\n      i;\n  if (!items || !items.length) return null;\n  var zitems = zorder(scene);\n  if (zitems && zitems.length) items = zitems;\n\n  for (i = items.length; --i >= 0;) {\n    if (hit = visitor(items[i])) return hit;\n  }\n\n  if (items === zitems) {\n    for (items = scene.items, i = items.length; --i >= 0;) {\n      if (!items[i].zindex) {\n        if (hit = visitor(items[i])) return hit;\n      }\n    }\n  }\n\n  return null;\n}\n},{}],\"wS12\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.drawAll = drawAll;\nexports.drawOne = drawOne;\n\nvar _fill = _interopRequireDefault(require(\"./fill\"));\n\nvar _stroke = _interopRequireDefault(require(\"./stroke\"));\n\nvar _visit = require(\"../visit\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction drawAll(path) {\n  return function (context, scene, bounds) {\n    (0, _visit.visit)(scene, function (item) {\n      if (!bounds || bounds.intersects(item.bounds)) {\n        drawPath(path, context, item, item);\n      }\n    });\n  };\n}\n\nfunction drawOne(path) {\n  return function (context, scene, bounds) {\n    if (scene.items.length && (!bounds || bounds.intersects(scene.bounds))) {\n      drawPath(path, context, scene.items[0], scene.items);\n    }\n  };\n}\n\nfunction drawPath(path, context, item, items) {\n  var opacity = item.opacity == null ? 1 : item.opacity;\n  if (opacity === 0) return;\n  if (path(context, items)) return;\n\n  if (item.fill && (0, _fill.default)(context, item, opacity)) {\n    context.fill();\n  }\n\n  if (item.stroke && (0, _stroke.default)(context, item, opacity)) {\n    context.stroke();\n  }\n}\n},{\"./fill\":\"jDkj\",\"./stroke\":\"N1x5\",\"../visit\":\"k1ty\"}],\"p67k\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.pick = pick;\nexports.hitPath = hitPath;\nexports.pickPath = pickPath;\n\nvar _visit = require(\"../visit\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction pick(test) {\n  test = test || _vegaUtil.truthy;\n  return function (context, scene, x, y, gx, gy) {\n    x *= context.pixelRatio;\n    y *= context.pixelRatio;\n    return (0, _visit.pickVisit)(scene, function (item) {\n      var b = item.bounds; // first hit test against bounding box\n\n      if (b && !b.contains(gx, gy) || !b) return; // if in bounding box, perform more careful test\n\n      if (test(context, item, x, y, gx, gy)) return item;\n    });\n  };\n}\n\nfunction hitPath(path, filled) {\n  return function (context, o, x, y) {\n    var item = Array.isArray(o) ? o[0] : o,\n        fill = filled == null ? item.fill : filled,\n        stroke = item.stroke && context.isPointInStroke,\n        lw,\n        lc;\n\n    if (stroke) {\n      lw = item.strokeWidth;\n      lc = item.strokeCap;\n      context.lineWidth = lw != null ? lw : 1;\n      context.lineCap = lc != null ? lc : 'butt';\n    }\n\n    return path(context, o) ? false : fill && context.isPointInPath(x, y) || stroke && context.isPointInStroke(x, y);\n  };\n}\n\nfunction pickPath(path) {\n  return pick(hitPath(path));\n}\n},{\"../visit\":\"k1ty\",\"vega-util\":\"d61Z\"}],\"R8yo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.translate = translate;\nexports.rotate = rotate;\nexports.scale = scale;\nexports.translateItem = translateItem;\nexports.transformItem = transformItem;\n\nfunction translate(x, y) {\n  return 'translate(' + x + ',' + y + ')';\n}\n\nfunction rotate(a) {\n  return 'rotate(' + a + ')';\n}\n\nfunction scale(scaleX, scaleY) {\n  return 'scale(' + scaleX + ',' + scaleY + ')';\n}\n\nfunction translateItem(item) {\n  return translate(item.x || 0, item.y || 0);\n}\n\nfunction transformItem(item) {\n  return translate(item.x || 0, item.y || 0) + (item.angle ? ' ' + rotate(item.angle) : '') + (item.scaleX || item.scaleY ? ' ' + scale(item.scaleX || 1, item.scaleY || 1) : '');\n}\n},{}],\"UuNj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _boundStroke = _interopRequireDefault(require(\"../bound/boundStroke\"));\n\nvar _boundContext = _interopRequireDefault(require(\"../bound/boundContext\"));\n\nvar _intersect = require(\"../util/intersect\");\n\nvar _draw = require(\"../util/canvas/draw\");\n\nvar _pick = require(\"../util/canvas/pick\");\n\nvar _transform = require(\"../util/svg/transform\");\n\nvar _constants = require(\"../util/constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(type, shape, isect) {\n  function attr(emit, item) {\n    emit('transform', (0, _transform.transformItem)(item));\n    emit('d', shape(null, item));\n  }\n\n  function bound(bounds, item) {\n    var x = item.x || 0,\n        y = item.y || 0;\n    shape((0, _boundContext.default)(bounds), item);\n    (0, _boundStroke.default)(bounds, item).translate(x, y);\n\n    if (item.angle) {\n      bounds.rotate(item.angle * _constants.DegToRad, x, y);\n    }\n\n    return bounds;\n  }\n\n  function draw(context, item) {\n    var x = item.x || 0,\n        y = item.y || 0,\n        a = item.angle || 0;\n    context.translate(x, y);\n    if (a) context.rotate(a *= _constants.DegToRad);\n    context.beginPath();\n    shape(context, item);\n    if (a) context.rotate(-a);\n    context.translate(-x, -y);\n  }\n\n  return {\n    type: type,\n    tag: 'path',\n    nested: false,\n    attr: attr,\n    bound: bound,\n    draw: (0, _draw.drawAll)(draw),\n    pick: (0, _pick.pickPath)(draw),\n    isect: isect || (0, _intersect.intersectPath)(draw)\n  };\n}\n},{\"../bound/boundStroke\":\"a802\",\"../bound/boundContext\":\"Kn7H\",\"../util/intersect\":\"pmRF\",\"../util/canvas/draw\":\"wS12\",\"../util/canvas/pick\":\"p67k\",\"../util/svg/transform\":\"R8yo\",\"../util/constants\":\"Skbj\"}],\"L9J7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _shapes = require(\"../path/shapes\");\n\nvar _markItemPath = _interopRequireDefault(require(\"./markItemPath\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = (0, _markItemPath.default)('arc', _shapes.arc);\n\nexports.default = _default;\n},{\"../path/shapes\":\"uzF6\",\"./markItemPath\":\"UuNj\"}],\"H07d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.pickArea = pickArea;\nexports.pickLine = pickLine;\nexports.pickTrail = pickTrail;\n\nfunction pickArea(a, p) {\n  var v = a[0].orient === 'horizontal' ? p[1] : p[0],\n      z = a[0].orient === 'horizontal' ? 'y' : 'x',\n      i = a.length,\n      min = +Infinity,\n      hit,\n      d;\n\n  while (--i >= 0) {\n    if (a[i].defined === false) continue;\n    d = Math.abs(a[i][z] - v);\n\n    if (d < min) {\n      min = d;\n      hit = a[i];\n    }\n  }\n\n  return hit;\n}\n\nfunction pickLine(a, p) {\n  var t = Math.pow(a[0].strokeWidth || 1, 2),\n      i = a.length,\n      dx,\n      dy,\n      dd;\n\n  while (--i >= 0) {\n    if (a[i].defined === false) continue;\n    dx = a[i].x - p[0];\n    dy = a[i].y - p[1];\n    dd = dx * dx + dy * dy;\n    if (dd < t) return a[i];\n  }\n\n  return null;\n}\n\nfunction pickTrail(a, p) {\n  var i = a.length,\n      dx,\n      dy,\n      dd;\n\n  while (--i >= 0) {\n    if (a[i].defined === false) continue;\n    dx = a[i].x - p[0];\n    dy = a[i].y - p[1];\n    dd = dx * dx + dy * dy;\n    dx = a[i].size || 1;\n    if (dd < dx * dx) return a[i];\n  }\n\n  return null;\n}\n},{}],\"jS3L\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _boundStroke = _interopRequireDefault(require(\"../bound/boundStroke\"));\n\nvar _boundContext = _interopRequireDefault(require(\"../bound/boundContext\"));\n\nvar _intersect = require(\"../util/intersect\");\n\nvar _draw = require(\"../util/canvas/draw\");\n\nvar _pick = require(\"../util/canvas/pick\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(type, shape, tip) {\n  function attr(emit, item) {\n    var items = item.mark.items;\n    if (items.length) emit('d', shape(null, items));\n  }\n\n  function bound(bounds, mark) {\n    var items = mark.items;\n\n    if (items.length === 0) {\n      return bounds;\n    } else {\n      shape((0, _boundContext.default)(bounds), items);\n      return (0, _boundStroke.default)(bounds, items[0]);\n    }\n  }\n\n  function draw(context, items) {\n    context.beginPath();\n    shape(context, items);\n  }\n\n  var hit = (0, _pick.hitPath)(draw);\n\n  function pick(context, scene, x, y, gx, gy) {\n    var items = scene.items,\n        b = scene.bounds;\n\n    if (!items || !items.length || b && !b.contains(gx, gy)) {\n      return null;\n    }\n\n    x *= context.pixelRatio;\n    y *= context.pixelRatio;\n    return hit(context, items, x, y) ? items[0] : null;\n  }\n\n  return {\n    type: type,\n    tag: 'path',\n    nested: true,\n    attr: attr,\n    bound: bound,\n    draw: (0, _draw.drawOne)(draw),\n    pick: pick,\n    isect: _intersect.intersectPoint,\n    tip: tip\n  };\n}\n},{\"../bound/boundStroke\":\"a802\",\"../bound/boundContext\":\"Kn7H\",\"../util/intersect\":\"pmRF\",\"../util/canvas/draw\":\"wS12\",\"../util/canvas/pick\":\"p67k\"}],\"ylN4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _shapes = require(\"../path/shapes\");\n\nvar _pickPath = require(\"../util/pickPath\");\n\nvar _markMultiItemPath = _interopRequireDefault(require(\"./markMultiItemPath\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = (0, _markMultiItemPath.default)('area', _shapes.area, _pickPath.pickArea);\n\nexports.default = _default;\n},{\"../path/shapes\":\"uzF6\",\"../util/pickPath\":\"H07d\",\"./markMultiItemPath\":\"jS3L\"}],\"N4qU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.clipGroup = clipGroup;\n\nvar _shapes = require(\"../../path/shapes\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(context, scene) {\n  var clip = scene.clip;\n  context.save();\n\n  if ((0, _vegaUtil.isFunction)(clip)) {\n    context.beginPath();\n    clip(context);\n    context.clip();\n  } else {\n    clipGroup(context, scene.group);\n  }\n}\n\nfunction clipGroup(context, group) {\n  context.beginPath();\n  (0, _shapes.hasCornerRadius)(group) ? (0, _shapes.rectangle)(context, group, 0, 0) : context.rect(0, 0, group.width || 0, group.height || 0);\n  context.clip();\n}\n},{\"../../path/shapes\":\"uzF6\",\"vega-util\":\"d61Z\"}],\"D6AO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.resetSVGClipId = resetSVGClipId;\nexports.default = _default;\n\nvar _shapes = require(\"../../path/shapes\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar clip_id = 1;\n\nfunction resetSVGClipId() {\n  clip_id = 1;\n}\n\nfunction _default(renderer, item, size) {\n  var clip = item.clip,\n      defs = renderer._defs,\n      id = item.clip_id || (item.clip_id = 'clip' + clip_id++),\n      c = defs.clipping[id] || (defs.clipping[id] = {\n    id: id\n  });\n\n  if ((0, _vegaUtil.isFunction)(clip)) {\n    c.path = clip(null);\n  } else if ((0, _shapes.hasCornerRadius)(size)) {\n    c.path = (0, _shapes.rectangle)(null, size, 0, 0);\n  } else {\n    c.width = size.width || 0;\n    c.height = size.height || 0;\n  }\n\n  return 'url(#' + id + ')';\n}\n},{\"../../path/shapes\":\"uzF6\",\"vega-util\":\"d61Z\"}],\"a54Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _shapes = require(\"../path/shapes\");\n\nvar _boundStroke = _interopRequireDefault(require(\"../bound/boundStroke\"));\n\nvar _intersect = require(\"../util/intersect\");\n\nvar _visit = require(\"../util/visit\");\n\nvar _clip = require(\"../util/canvas/clip\");\n\nvar _stroke = _interopRequireDefault(require(\"../util/canvas/stroke\"));\n\nvar _fill = _interopRequireDefault(require(\"../util/canvas/fill\"));\n\nvar _pick = require(\"../util/canvas/pick\");\n\nvar _clip2 = _interopRequireDefault(require(\"../util/svg/clip\"));\n\nvar _transform = require(\"../util/svg/transform\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar StrokeOffset = 0.5;\n\nfunction attr(emit, item) {\n  emit('transform', (0, _transform.translateItem)(item));\n}\n\nfunction background(emit, item) {\n  var offset = item.stroke ? StrokeOffset : 0;\n  emit('class', 'background');\n  emit('d', (0, _shapes.rectangle)(null, item, offset, offset));\n}\n\nfunction foreground(emit, item, renderer) {\n  var url = item.clip ? (0, _clip2.default)(renderer, item, item) : null;\n  emit('clip-path', url);\n}\n\nfunction bound(bounds, group) {\n  if (!group.clip && group.items) {\n    var items = group.items;\n\n    for (var j = 0, m = items.length; j < m; ++j) {\n      bounds.union(items[j].bounds);\n    }\n  }\n\n  if ((group.clip || group.width || group.height) && !group.noBound) {\n    bounds.add(0, 0).add(group.width || 0, group.height || 0);\n  }\n\n  (0, _boundStroke.default)(bounds, group);\n  return bounds.translate(group.x || 0, group.y || 0);\n}\n\nfunction backgroundPath(context, group) {\n  var offset = group.stroke ? StrokeOffset : 0;\n  context.beginPath();\n  (0, _shapes.rectangle)(context, group, offset, offset);\n}\n\nvar hitBackground = (0, _pick.hitPath)(backgroundPath);\n\nfunction draw(context, scene, bounds) {\n  var renderer = this;\n  (0, _visit.visit)(scene, function (group) {\n    var gx = group.x || 0,\n        gy = group.y || 0,\n        opacity; // setup graphics context\n\n    context.save();\n    context.translate(gx, gy); // draw group background\n\n    if (group.stroke || group.fill) {\n      opacity = group.opacity == null ? 1 : group.opacity;\n\n      if (opacity > 0) {\n        backgroundPath(context, group);\n\n        if (group.fill && (0, _fill.default)(context, group, opacity)) {\n          context.fill();\n        }\n\n        if (group.stroke && (0, _stroke.default)(context, group, opacity)) {\n          context.stroke();\n        }\n      }\n    } // set clip and bounds\n\n\n    if (group.clip) (0, _clip.clipGroup)(context, group);\n    if (bounds) bounds.translate(-gx, -gy); // draw group contents\n\n    (0, _visit.visit)(group, function (item) {\n      renderer.draw(context, item, bounds);\n    }); // restore graphics context\n\n    if (bounds) bounds.translate(gx, gy);\n    context.restore();\n  });\n}\n\nfunction pick(context, scene, x, y, gx, gy) {\n  if (scene.bounds && !scene.bounds.contains(gx, gy) || !scene.items) {\n    return null;\n  }\n\n  var handler = this,\n      cx = x * context.pixelRatio,\n      cy = y * context.pixelRatio;\n  return (0, _visit.pickVisit)(scene, function (group) {\n    var hit, dx, dy, dw, dh, b, c; // first hit test bounding box\n\n    b = group.bounds;\n    if (b && !b.contains(gx, gy)) return; // passed bounds check, test rectangular clip\n\n    dx = group.x || 0;\n    dy = group.y || 0;\n    dw = dx + (group.width || 0);\n    dh = dy + (group.height || 0);\n    c = group.clip;\n    if (c && (gx < dx || gx > dw || gy < dx || gy > dh)) return; // adjust coordinate system\n\n    context.save();\n    context.translate(dx, dy);\n    dx = gx - dx;\n    dy = gy - dy; // test background for rounded corner clip\n\n    if (c && (0, _shapes.hasCornerRadius)(group) && !hitBackground(context, group, cx, cy)) {\n      context.restore();\n      return;\n    } // hit test against contained marks\n\n\n    hit = (0, _visit.pickVisit)(group, function (mark) {\n      return pickMark(mark, dx, dy) ? handler.pick(mark, x, y, dx, dy) : null;\n    }); // hit test against group background\n\n    if (!hit && scene.interactive !== false && (group.fill || group.stroke) && hitBackground(context, group, cx, cy)) {\n      hit = group;\n    } // restore state and return\n\n\n    context.restore();\n    return hit || null;\n  });\n}\n\nfunction pickMark(mark, x, y) {\n  return (mark.interactive !== false || mark.marktype === 'group') && mark.bounds && mark.bounds.contains(x, y);\n}\n\nvar _default = {\n  type: 'group',\n  tag: 'g',\n  nested: false,\n  attr: attr,\n  bound: bound,\n  draw: draw,\n  pick: pick,\n  isect: _intersect.intersectRect,\n  background: background,\n  foreground: foreground\n};\nexports.default = _default;\n},{\"../path/shapes\":\"uzF6\",\"../bound/boundStroke\":\"a802\",\"../util/intersect\":\"pmRF\",\"../util/visit\":\"k1ty\",\"../util/canvas/clip\":\"N4qU\",\"../util/canvas/stroke\":\"N1x5\",\"../util/canvas/fill\":\"jDkj\",\"../util/canvas/pick\":\"p67k\",\"../util/svg/clip\":\"D6AO\",\"../util/svg/transform\":\"R8yo\"}],\"I3iY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _visit = require(\"../util/visit\");\n\nvar _pick = require(\"../util/canvas/pick\");\n\nvar _transform = require(\"../util/svg/transform\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction getImage(item, renderer) {\n  var image = item.image;\n\n  if (!image || item.url && item.url !== image.url) {\n    image = {\n      complete: false,\n      width: 0,\n      height: 0\n    };\n    renderer.loadImage(item.url).then(image => {\n      item.image = image;\n      item.image.url = item.url;\n    });\n  }\n\n  return image;\n}\n\nfunction imageWidth(item, image) {\n  return item.width != null ? item.width : !image || !image.width ? 0 : item.aspect !== false && item.height ? item.height * image.width / image.height : image.width;\n}\n\nfunction imageHeight(item, image) {\n  return item.height != null ? item.height : !image || !image.height ? 0 : item.aspect !== false && item.width ? item.width * image.height / image.width : image.height;\n}\n\nfunction imageXOffset(align, w) {\n  return align === 'center' ? w / 2 : align === 'right' ? w : 0;\n}\n\nfunction imageYOffset(baseline, h) {\n  return baseline === 'middle' ? h / 2 : baseline === 'bottom' ? h : 0;\n}\n\nfunction attr(emit, item, renderer) {\n  var image = getImage(item, renderer),\n      x = item.x || 0,\n      y = item.y || 0,\n      w = imageWidth(item, image),\n      h = imageHeight(item, image),\n      a = item.aspect === false ? 'none' : 'xMidYMid';\n  x -= imageXOffset(item.align, w);\n  y -= imageYOffset(item.baseline, h);\n\n  if (!image.src && image.toDataURL) {\n    emit('href', image.toDataURL(), 'http://www.w3.org/1999/xlink', 'xlink:href');\n  } else {\n    emit('href', image.src || '', 'http://www.w3.org/1999/xlink', 'xlink:href');\n  }\n\n  emit('transform', (0, _transform.translate)(x, y));\n  emit('width', w);\n  emit('height', h);\n  emit('preserveAspectRatio', a);\n}\n\nfunction bound(bounds, item) {\n  var image = item.image,\n      x = item.x || 0,\n      y = item.y || 0,\n      w = imageWidth(item, image),\n      h = imageHeight(item, image);\n  x -= imageXOffset(item.align, w);\n  y -= imageYOffset(item.baseline, h);\n  return bounds.set(x, y, x + w, y + h);\n}\n\nfunction draw(context, scene, bounds) {\n  var renderer = this;\n  (0, _visit.visit)(scene, function (item) {\n    if (bounds && !bounds.intersects(item.bounds)) return; // bounds check\n\n    var image = getImage(item, renderer),\n        x = item.x || 0,\n        y = item.y || 0,\n        w = imageWidth(item, image),\n        h = imageHeight(item, image),\n        opacity,\n        ar0,\n        ar1,\n        t;\n    x -= imageXOffset(item.align, w);\n    y -= imageYOffset(item.baseline, h);\n\n    if (item.aspect !== false) {\n      ar0 = image.width / image.height;\n      ar1 = item.width / item.height;\n\n      if (ar0 === ar0 && ar1 === ar1 && ar0 !== ar1) {\n        if (ar1 < ar0) {\n          t = w / ar0;\n          y += (h - t) / 2;\n          h = t;\n        } else {\n          t = h * ar0;\n          x += (w - t) / 2;\n          w = t;\n        }\n      }\n    }\n\n    if (image.complete || image.toDataURL) {\n      context.globalAlpha = (opacity = item.opacity) != null ? opacity : 1;\n      context.imageSmoothingEnabled = item.smooth !== false;\n      context.drawImage(image, x, y, w, h);\n    }\n  });\n}\n\nvar _default = {\n  type: 'image',\n  tag: 'image',\n  nested: false,\n  attr: attr,\n  bound: bound,\n  draw: draw,\n  pick: (0, _pick.pick)(),\n  isect: _vegaUtil.truthy,\n  // bounds check is sufficient\n  get: getImage,\n  xOffset: imageXOffset,\n  yOffset: imageYOffset\n};\nexports.default = _default;\n},{\"../util/visit\":\"k1ty\",\"../util/canvas/pick\":\"p67k\",\"../util/svg/transform\":\"R8yo\",\"vega-util\":\"d61Z\"}],\"V8lf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _shapes = require(\"../path/shapes\");\n\nvar _pickPath = require(\"../util/pickPath\");\n\nvar _markMultiItemPath = _interopRequireDefault(require(\"./markMultiItemPath\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = (0, _markMultiItemPath.default)('line', _shapes.line, _pickPath.pickLine);\n\nexports.default = _default;\n},{\"../path/shapes\":\"uzF6\",\"../util/pickPath\":\"H07d\",\"./markMultiItemPath\":\"jS3L\"}],\"HCTs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _boundStroke = _interopRequireDefault(require(\"../bound/boundStroke\"));\n\nvar _boundContext = _interopRequireDefault(require(\"../bound/boundContext\"));\n\nvar _parse = _interopRequireDefault(require(\"../path/parse\"));\n\nvar _render = _interopRequireDefault(require(\"../path/render\"));\n\nvar _intersect = require(\"../util/intersect\");\n\nvar _draw = require(\"../util/canvas/draw\");\n\nvar _pick = require(\"../util/canvas/pick\");\n\nvar _transform = require(\"../util/svg/transform\");\n\nvar _constants = require(\"../util/constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction attr(emit, item) {\n  var sx = item.scaleX || 1,\n      sy = item.scaleY || 1;\n\n  if (sx !== 1 || sy !== 1) {\n    emit('vector-effect', 'non-scaling-stroke');\n  }\n\n  emit('transform', (0, _transform.transformItem)(item));\n  emit('d', item.path);\n}\n\nfunction path(context, item) {\n  var path = item.path;\n  if (path == null) return true;\n  var x = item.x || 0,\n      y = item.y || 0,\n      sx = item.scaleX || 1,\n      sy = item.scaleY || 1,\n      a = (item.angle || 0) * _constants.DegToRad,\n      cache = item.pathCache;\n\n  if (!cache || cache.path !== path) {\n    (item.pathCache = cache = (0, _parse.default)(path)).path = path;\n  }\n\n  if (a && context.rotate && context.translate) {\n    context.translate(x, y);\n    context.rotate(a);\n    (0, _render.default)(context, cache, 0, 0, sx, sy);\n    context.rotate(-a);\n    context.translate(-x, -y);\n  } else {\n    (0, _render.default)(context, cache, x, y, sx, sy);\n  }\n}\n\nfunction bound(bounds, item) {\n  path((0, _boundContext.default)(bounds), item) ? bounds.set(0, 0, 0, 0) : (0, _boundStroke.default)(bounds, item, true);\n\n  if (item.angle) {\n    bounds.rotate(item.angle * _constants.DegToRad, item.x || 0, item.y || 0);\n  }\n\n  return bounds;\n}\n\nvar _default = {\n  type: 'path',\n  tag: 'path',\n  nested: false,\n  attr: attr,\n  bound: bound,\n  draw: (0, _draw.drawAll)(path),\n  pick: (0, _pick.pickPath)(path),\n  isect: (0, _intersect.intersectPath)(path)\n};\nexports.default = _default;\n},{\"../bound/boundStroke\":\"a802\",\"../bound/boundContext\":\"Kn7H\",\"../path/parse\":\"ANC8\",\"../path/render\":\"H11R\",\"../util/intersect\":\"pmRF\",\"../util/canvas/draw\":\"wS12\",\"../util/canvas/pick\":\"p67k\",\"../util/svg/transform\":\"R8yo\",\"../util/constants\":\"Skbj\"}],\"ouT1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _boundStroke = _interopRequireDefault(require(\"../bound/boundStroke\"));\n\nvar _shapes = require(\"../path/shapes\");\n\nvar _intersect = require(\"../util/intersect\");\n\nvar _draw = require(\"../util/canvas/draw\");\n\nvar _pick = require(\"../util/canvas/pick\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction attr(emit, item) {\n  emit('d', (0, _shapes.rectangle)(null, item));\n}\n\nfunction bound(bounds, item) {\n  var x, y;\n  return (0, _boundStroke.default)(bounds.set(x = item.x || 0, y = item.y || 0, x + item.width || 0, y + item.height || 0), item);\n}\n\nfunction draw(context, item) {\n  context.beginPath();\n  (0, _shapes.rectangle)(context, item);\n}\n\nvar _default = {\n  type: 'rect',\n  tag: 'path',\n  nested: false,\n  attr: attr,\n  bound: bound,\n  draw: (0, _draw.drawAll)(draw),\n  pick: (0, _pick.pickPath)(draw),\n  isect: _intersect.intersectRect\n};\nexports.default = _default;\n},{\"../bound/boundStroke\":\"a802\",\"../path/shapes\":\"uzF6\",\"../util/intersect\":\"pmRF\",\"../util/canvas/draw\":\"wS12\",\"../util/canvas/pick\":\"p67k\"}],\"uS8Z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _boundStroke = _interopRequireDefault(require(\"../bound/boundStroke\"));\n\nvar _intersect = require(\"../util/intersect\");\n\nvar _visit = require(\"../util/visit\");\n\nvar _pick = require(\"../util/canvas/pick\");\n\nvar _stroke = _interopRequireDefault(require(\"../util/canvas/stroke\"));\n\nvar _transform = require(\"../util/svg/transform\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction attr(emit, item) {\n  emit('transform', (0, _transform.translateItem)(item));\n  emit('x2', item.x2 != null ? item.x2 - (item.x || 0) : 0);\n  emit('y2', item.y2 != null ? item.y2 - (item.y || 0) : 0);\n}\n\nfunction bound(bounds, item) {\n  var x1, y1;\n  return (0, _boundStroke.default)(bounds.set(x1 = item.x || 0, y1 = item.y || 0, item.x2 != null ? item.x2 : x1, item.y2 != null ? item.y2 : y1), item);\n}\n\nfunction path(context, item, opacity) {\n  var x1, y1, x2, y2;\n\n  if (item.stroke && (0, _stroke.default)(context, item, opacity)) {\n    x1 = item.x || 0;\n    y1 = item.y || 0;\n    x2 = item.x2 != null ? item.x2 : x1;\n    y2 = item.y2 != null ? item.y2 : y1;\n    context.beginPath();\n    context.moveTo(x1, y1);\n    context.lineTo(x2, y2);\n    return true;\n  }\n\n  return false;\n}\n\nfunction draw(context, scene, bounds) {\n  (0, _visit.visit)(scene, function (item) {\n    if (bounds && !bounds.intersects(item.bounds)) return; // bounds check\n\n    var opacity = item.opacity == null ? 1 : item.opacity;\n\n    if (opacity && path(context, item, opacity)) {\n      context.stroke();\n    }\n  });\n}\n\nfunction hit(context, item, x, y) {\n  if (!context.isPointInStroke) return false;\n  return path(context, item, 1) && context.isPointInStroke(x, y);\n}\n\nvar _default = {\n  type: 'rule',\n  tag: 'line',\n  nested: false,\n  attr: attr,\n  bound: bound,\n  draw: draw,\n  pick: (0, _pick.pick)(hit),\n  isect: _intersect.intersectRule\n};\nexports.default = _default;\n},{\"../bound/boundStroke\":\"a802\",\"../util/intersect\":\"pmRF\",\"../util/visit\":\"k1ty\",\"../util/canvas/pick\":\"p67k\",\"../util/canvas/stroke\":\"N1x5\",\"../util/svg/transform\":\"R8yo\"}],\"a3aY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _shapes = require(\"../path/shapes\");\n\nvar _markItemPath = _interopRequireDefault(require(\"./markItemPath\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = (0, _markItemPath.default)('shape', _shapes.shape);\n\nexports.default = _default;\n},{\"../path/shapes\":\"uzF6\",\"./markItemPath\":\"UuNj\"}],\"HzXH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _shapes = require(\"../path/shapes\");\n\nvar _intersect = require(\"../util/intersect\");\n\nvar _markItemPath = _interopRequireDefault(require(\"./markItemPath\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = (0, _markItemPath.default)('symbol', _shapes.symbol, _intersect.intersectPoint);\n\nexports.default = _default;\n},{\"../path/shapes\":\"uzF6\",\"../util/intersect\":\"pmRF\",\"./markItemPath\":\"UuNj\"}],\"hv1J\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fontSize = fontSize;\nexports.lineHeight = lineHeight;\nexports.textLines = textLines;\nexports.multiLineOffset = multiLineOffset;\nexports.textValue = textValue;\nexports.fontFamily = fontFamily;\nexports.font = font;\nexports.offset = offset;\nexports.textMetrics = void 0;\n\nvar _context = require(\"./canvas/context\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar currFontHeight;\nvar textMetrics = {\n  height: fontSize,\n  measureWidth: measureWidth,\n  estimateWidth: estimateWidth,\n  width: estimateWidth,\n  canvas: useCanvas\n};\nexports.textMetrics = textMetrics;\nuseCanvas(true); // make dumb, simple estimate if no canvas is available\n\nfunction estimateWidth(item, text) {\n  currFontHeight = fontSize(item);\n  return estimate(textValue(item, text));\n}\n\nfunction estimate(text) {\n  return ~~(0.8 * text.length * currFontHeight);\n} // measure text width if canvas is available\n\n\nfunction measureWidth(item, text) {\n  return fontSize(item) <= 0 ? 0 : (_context.context.font = font(item), measure(textValue(item, text)));\n}\n\nfunction measure(text) {\n  return _context.context.measureText(text).width;\n}\n\nfunction fontSize(item) {\n  return item.fontSize != null ? item.fontSize : 11;\n}\n\nfunction useCanvas(use) {\n  textMetrics.width = use && _context.context ? measureWidth : estimateWidth;\n}\n\nfunction lineHeight(item) {\n  return item.lineHeight != null ? item.lineHeight : fontSize(item) + 2;\n}\n\nfunction lineArray(_) {\n  return (0, _vegaUtil.isArray)(_) ? _.length > 1 ? _ : _[0] : _;\n}\n\nfunction textLines(item) {\n  return lineArray(item.lineBreak && item.text && !(0, _vegaUtil.isArray)(item.text) ? item.text.split(item.lineBreak) : item.text);\n}\n\nfunction multiLineOffset(item) {\n  const tl = textLines(item);\n  return ((0, _vegaUtil.isArray)(tl) ? tl.length - 1 : 0) * lineHeight(item);\n}\n\nfunction textValue(item, line) {\n  return line == null ? '' : item.limit > 0 ? truncate(item, line) : line + '';\n}\n\nfunction truncate(item, line) {\n  var limit = +item.limit,\n      text = line + '',\n      width;\n\n  if (textMetrics.width === measureWidth) {\n    // we are using canvas\n    _context.context.font = font(item);\n    width = measure;\n  } else {\n    // we are relying on estimates\n    currFontHeight = fontSize(item);\n    width = estimate;\n  }\n\n  if (width(text) < limit) return text;\n  var ellipsis = item.ellipsis || '\\u2026',\n      rtl = item.dir === 'rtl',\n      lo = 0,\n      hi = text.length,\n      mid;\n  limit -= width(ellipsis);\n\n  if (rtl) {\n    while (lo < hi) {\n      mid = lo + hi >>> 1;\n      if (width(text.slice(mid)) > limit) lo = mid + 1;else hi = mid;\n    }\n\n    return ellipsis + text.slice(lo);\n  } else {\n    while (lo < hi) {\n      mid = 1 + (lo + hi >>> 1);\n      if (width(text.slice(0, mid)) < limit) lo = mid;else hi = mid - 1;\n    }\n\n    return text.slice(0, lo) + ellipsis;\n  }\n}\n\nfunction fontFamily(item, quote) {\n  var font = item.font;\n  return (quote && font ? String(font).replace(/\"/g, '\\'') : font) || 'sans-serif';\n}\n\nfunction font(item, quote) {\n  return '' + (item.fontStyle ? item.fontStyle + ' ' : '') + (item.fontVariant ? item.fontVariant + ' ' : '') + (item.fontWeight ? item.fontWeight + ' ' : '') + fontSize(item) + 'px ' + fontFamily(item, quote);\n}\n\nfunction offset(item) {\n  // perform our own font baseline calculation\n  // why? not all browsers support SVG 1.1 'alignment-baseline' :(\n  var baseline = item.baseline,\n      h = fontSize(item);\n  return Math.round(baseline === 'top' ? 0.79 * h : baseline === 'middle' ? 0.30 * h : baseline === 'bottom' ? -0.21 * h : 0);\n}\n},{\"./canvas/context\":\"jnR2\",\"vega-util\":\"d61Z\"}],\"MbC3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _Bounds = _interopRequireDefault(require(\"../Bounds\"));\n\nvar _constants = require(\"../util/constants\");\n\nvar _text = require(\"../util/text\");\n\nvar _intersect = require(\"../util/intersect\");\n\nvar _visit = require(\"../util/visit\");\n\nvar _fill = _interopRequireDefault(require(\"../util/canvas/fill\"));\n\nvar _pick = require(\"../util/canvas/pick\");\n\nvar _stroke = _interopRequireDefault(require(\"../util/canvas/stroke\"));\n\nvar _transform = require(\"../util/svg/transform\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar textAlign = {\n  'left': 'start',\n  'center': 'middle',\n  'right': 'end'\n};\nvar tempBounds = new _Bounds.default();\n\nfunction anchorPoint(item) {\n  var x = item.x || 0,\n      y = item.y || 0,\n      r = item.radius || 0,\n      t;\n\n  if (r) {\n    t = (item.theta || 0) - _constants.HalfPi;\n    x += r * Math.cos(t);\n    y += r * Math.sin(t);\n  }\n\n  tempBounds.x1 = x;\n  tempBounds.y1 = y;\n  return tempBounds;\n}\n\nfunction attr(emit, item) {\n  var dx = item.dx || 0,\n      dy = (item.dy || 0) + (0, _text.offset)(item),\n      p = anchorPoint(item),\n      x = p.x1,\n      y = p.y1,\n      a = item.angle || 0,\n      t;\n  emit('text-anchor', textAlign[item.align] || 'start');\n\n  if (a) {\n    t = (0, _transform.translate)(x, y) + ' ' + (0, _transform.rotate)(a);\n    if (dx || dy) t += ' ' + (0, _transform.translate)(dx, dy);\n  } else {\n    t = (0, _transform.translate)(x + dx, y + dy);\n  }\n\n  emit('transform', t);\n}\n\nfunction bound(bounds, item, mode) {\n  var h = _text.textMetrics.height(item),\n      a = item.align,\n      p = anchorPoint(item),\n      x = p.x1,\n      y = p.y1,\n      dx = item.dx || 0,\n      dy = (item.dy || 0) + (0, _text.offset)(item) - Math.round(0.8 * h),\n      // use 4/5 offset\n  tl = (0, _text.textLines)(item),\n      w; // get dimensions\n\n\n  if ((0, _vegaUtil.isArray)(tl)) {\n    // multi-line text\n    h += (0, _text.lineHeight)(item) * (tl.length - 1);\n    w = tl.reduce((w, t) => Math.max(w, _text.textMetrics.width(item, t)), 0);\n  } else {\n    // single-line text\n    w = _text.textMetrics.width(item, tl);\n  } // horizontal alignment\n\n\n  if (a === 'center') {\n    dx -= w / 2;\n  } else if (a === 'right') {\n    dx -= w;\n  } else {// left by default, do nothing\n  }\n\n  bounds.set(dx += x, dy += y, dx + w, dy + h);\n\n  if (item.angle && !mode) {\n    bounds.rotate(item.angle * _constants.DegToRad, x, y);\n  } else if (mode === 2) {\n    return bounds.rotatedPoints(item.angle * _constants.DegToRad, x, y);\n  }\n\n  return bounds;\n}\n\nfunction draw(context, scene, bounds) {\n  (0, _visit.visit)(scene, function (item) {\n    var opacity = item.opacity == null ? 1 : item.opacity,\n        p,\n        x,\n        y,\n        i,\n        lh,\n        tl,\n        str;\n    if (bounds && !bounds.intersects(item.bounds) || // bounds check\n    opacity === 0 || item.fontSize <= 0 || item.text == null || item.text.length === 0) return;\n    context.font = (0, _text.font)(item);\n    context.textAlign = item.align || 'left';\n    p = anchorPoint(item);\n    x = p.x1, y = p.y1;\n\n    if (item.angle) {\n      context.save();\n      context.translate(x, y);\n      context.rotate(item.angle * _constants.DegToRad);\n      x = y = 0; // reset x, y\n    }\n\n    x += item.dx || 0;\n    y += (item.dy || 0) + (0, _text.offset)(item);\n    tl = (0, _text.textLines)(item);\n\n    if ((0, _vegaUtil.isArray)(tl)) {\n      lh = (0, _text.lineHeight)(item);\n\n      for (i = 0; i < tl.length; ++i) {\n        str = (0, _text.textValue)(item, tl[i]);\n\n        if (item.fill && (0, _fill.default)(context, item, opacity)) {\n          context.fillText(str, x, y);\n        }\n\n        if (item.stroke && (0, _stroke.default)(context, item, opacity)) {\n          context.strokeText(str, x, y);\n        }\n\n        y += lh;\n      }\n    } else {\n      str = (0, _text.textValue)(item, tl);\n\n      if (item.fill && (0, _fill.default)(context, item, opacity)) {\n        context.fillText(str, x, y);\n      }\n\n      if (item.stroke && (0, _stroke.default)(context, item, opacity)) {\n        context.strokeText(str, x, y);\n      }\n    }\n\n    if (item.angle) context.restore();\n  });\n}\n\nfunction hit(context, item, x, y, gx, gy) {\n  if (item.fontSize <= 0) return false;\n  if (!item.angle) return true; // bounds sufficient if no rotation\n  // project point into space of unrotated bounds\n\n  var p = anchorPoint(item),\n      ax = p.x1,\n      ay = p.y1,\n      b = bound(tempBounds, item, 1),\n      a = -item.angle * _constants.DegToRad,\n      cos = Math.cos(a),\n      sin = Math.sin(a),\n      px = cos * gx - sin * gy + (ax - cos * ax + sin * ay),\n      py = sin * gx + cos * gy + (ay - sin * ax - cos * ay);\n  return b.contains(px, py);\n}\n\nfunction intersectText(item, box) {\n  var p = bound(tempBounds, item, 2);\n  return (0, _intersect.intersectBoxLine)(box, p[0], p[1], p[2], p[3]) || (0, _intersect.intersectBoxLine)(box, p[0], p[1], p[4], p[5]) || (0, _intersect.intersectBoxLine)(box, p[4], p[5], p[6], p[7]) || (0, _intersect.intersectBoxLine)(box, p[2], p[3], p[6], p[7]);\n}\n\nvar _default = {\n  type: 'text',\n  tag: 'text',\n  nested: false,\n  attr: attr,\n  bound: bound,\n  draw: draw,\n  pick: (0, _pick.pick)(hit),\n  isect: intersectText\n};\nexports.default = _default;\n},{\"../Bounds\":\"qFnp\",\"../util/constants\":\"Skbj\",\"../util/text\":\"hv1J\",\"../util/intersect\":\"pmRF\",\"../util/visit\":\"k1ty\",\"../util/canvas/fill\":\"jDkj\",\"../util/canvas/pick\":\"p67k\",\"../util/canvas/stroke\":\"N1x5\",\"../util/svg/transform\":\"R8yo\",\"vega-util\":\"d61Z\"}],\"TF3y\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _shapes = require(\"../path/shapes\");\n\nvar _pickPath = require(\"../util/pickPath\");\n\nvar _markMultiItemPath = _interopRequireDefault(require(\"./markMultiItemPath\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = (0, _markMultiItemPath.default)('trail', _shapes.trail, _pickPath.pickTrail);\n\nexports.default = _default;\n},{\"../path/shapes\":\"uzF6\",\"../util/pickPath\":\"H07d\",\"./markMultiItemPath\":\"jS3L\"}],\"Bm7B\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _arc = _interopRequireDefault(require(\"./arc\"));\n\nvar _area = _interopRequireDefault(require(\"./area\"));\n\nvar _group = _interopRequireDefault(require(\"./group\"));\n\nvar _image = _interopRequireDefault(require(\"./image\"));\n\nvar _line = _interopRequireDefault(require(\"./line\"));\n\nvar _path = _interopRequireDefault(require(\"./path\"));\n\nvar _rect = _interopRequireDefault(require(\"./rect\"));\n\nvar _rule = _interopRequireDefault(require(\"./rule\"));\n\nvar _shape = _interopRequireDefault(require(\"./shape\"));\n\nvar _symbol = _interopRequireDefault(require(\"./symbol\"));\n\nvar _text = _interopRequireDefault(require(\"./text\"));\n\nvar _trail = _interopRequireDefault(require(\"./trail\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n  arc: _arc.default,\n  area: _area.default,\n  group: _group.default,\n  image: _image.default,\n  line: _line.default,\n  path: _path.default,\n  rect: _rect.default,\n  rule: _rule.default,\n  shape: _shape.default,\n  symbol: _symbol.default,\n  text: _text.default,\n  trail: _trail.default\n};\nexports.default = _default;\n},{\"./arc\":\"L9J7\",\"./area\":\"ylN4\",\"./group\":\"a54Z\",\"./image\":\"I3iY\",\"./line\":\"V8lf\",\"./path\":\"HCTs\",\"./rect\":\"ouT1\",\"./rule\":\"uS8Z\",\"./shape\":\"a3aY\",\"./symbol\":\"HzXH\",\"./text\":\"MbC3\",\"./trail\":\"TF3y\"}],\"r4ur\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _Bounds = _interopRequireDefault(require(\"../Bounds\"));\n\nvar _index = _interopRequireDefault(require(\"../marks/index\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(item, func, opt) {\n  var type = _index.default[item.mark.marktype],\n      bound = func || type.bound;\n  if (type.nested) item = item.mark;\n  return bound(item.bounds || (item.bounds = new _Bounds.default()), item, opt);\n}\n},{\"../Bounds\":\"qFnp\",\"../marks/index\":\"Bm7B\"}],\"DoVp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _Bounds = _interopRequireDefault(require(\"../Bounds\"));\n\nvar _boundItem = _interopRequireDefault(require(\"./boundItem\"));\n\nvar _index = _interopRequireDefault(require(\"../marks/index\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar DUMMY = {\n  mark: null\n};\n\nfunction _default(mark, bounds, opt) {\n  var type = _index.default[mark.marktype],\n      bound = type.bound,\n      items = mark.items,\n      hasItems = items && items.length,\n      i,\n      n,\n      item,\n      b;\n\n  if (type.nested) {\n    if (hasItems) {\n      item = items[0];\n    } else {\n      // no items, fake it\n      DUMMY.mark = mark;\n      item = DUMMY;\n    }\n\n    b = (0, _boundItem.default)(item, bound, opt);\n    bounds = bounds && bounds.union(b) || b;\n    return bounds;\n  }\n\n  bounds = bounds || mark.bounds && mark.bounds.clear() || new _Bounds.default();\n\n  if (hasItems) {\n    for (i = 0, n = items.length; i < n; ++i) {\n      bounds.union((0, _boundItem.default)(items[i], bound, opt));\n    }\n  }\n\n  return mark.bounds = bounds;\n}\n},{\"../Bounds\":\"qFnp\",\"./boundItem\":\"r4ur\",\"../marks/index\":\"Bm7B\"}],\"tZoq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sceneToJSON = sceneToJSON;\nexports.sceneFromJSON = sceneFromJSON;\n\nvar _boundMark = _interopRequireDefault(require(\"../bound/boundMark\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar keys = ['marktype', 'name', 'role', 'interactive', 'clip', 'items', 'zindex', 'x', 'y', 'width', 'height', 'align', 'baseline', // layout\n'fill', 'fillOpacity', 'opacity', // fill\n'stroke', 'strokeOpacity', 'strokeWidth', 'strokeCap', // stroke\n'strokeDash', 'strokeDashOffset', // stroke dash\n'startAngle', 'endAngle', 'innerRadius', 'outerRadius', // arc\n'cornerRadius', 'padAngle', // arc, rect\n'cornerRadiusTopLeft', 'cornerRadiusTopRight', // rect, group\n'cornerRadiusBottomLeft', 'cornerRadiusBottomRight', 'interpolate', 'tension', 'orient', 'defined', // area, line\n'url', 'aspect', 'smooth', // image\n'path', 'scaleX', 'scaleY', // path\n'x2', 'y2', // rule\n'size', 'shape', // symbol\n'text', 'angle', 'theta', 'radius', 'dir', 'dx', 'dy', // text\n'ellipsis', 'limit', 'lineBreak', 'lineHeight', 'font', 'fontSize', 'fontWeight', 'fontStyle', 'fontVariant' // font\n];\n\nfunction sceneToJSON(scene, indent) {\n  return JSON.stringify(scene, keys, indent);\n}\n\nfunction sceneFromJSON(json) {\n  var scene = typeof json === 'string' ? JSON.parse(json) : json;\n  return initialize(scene);\n}\n\nfunction initialize(scene) {\n  var type = scene.marktype,\n      items = scene.items,\n      parent,\n      i,\n      n;\n\n  if (items) {\n    for (i = 0, n = items.length; i < n; ++i) {\n      parent = type ? 'mark' : 'group';\n      items[i][parent] = scene;\n      if (items[i].zindex) items[i][parent].zdirty = true;\n      if ('group' === (type || parent)) initialize(items[i]);\n    }\n  }\n\n  if (type) (0, _boundMark.default)(scene);\n  return scene;\n}\n},{\"../bound/boundMark\":\"DoVp\"}],\"hZw4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Scenegraph;\n\nvar _Bounds = _interopRequireDefault(require(\"./Bounds\"));\n\nvar _GroupItem = _interopRequireDefault(require(\"./GroupItem\"));\n\nvar _serialize = require(\"./util/serialize\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Scenegraph(scene) {\n  if (arguments.length) {\n    this.root = (0, _serialize.sceneFromJSON)(scene);\n  } else {\n    this.root = createMark({\n      marktype: 'group',\n      name: 'root',\n      role: 'frame'\n    });\n    this.root.items = [new _GroupItem.default(this.root)];\n  }\n}\n\nvar prototype = Scenegraph.prototype;\n\nprototype.toJSON = function (indent) {\n  return (0, _serialize.sceneToJSON)(this.root, indent || 0);\n};\n\nprototype.mark = function (markdef, group, index) {\n  group = group || this.root.items[0];\n  var mark = createMark(markdef, group);\n  group.items[index] = mark;\n  if (mark.zindex) mark.group.zdirty = true;\n  return mark;\n};\n\nfunction createMark(def, group) {\n  return {\n    bounds: new _Bounds.default(),\n    clip: !!def.clip,\n    group: group,\n    interactive: def.interactive === false ? false : true,\n    items: [],\n    marktype: def.marktype,\n    name: def.name || undefined,\n    role: def.role || undefined,\n    zindex: def.zindex || 0\n  };\n}\n},{\"./Bounds\":\"qFnp\",\"./GroupItem\":\"T9oK\",\"./util/serialize\":\"tZoq\"}],\"Mj7i\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.domCreate = domCreate;\nexports.domFind = domFind;\nexports.domChild = domChild;\nexports.domClear = domClear;\nexports.cssClass = cssClass;\n\n// create a new DOM element\nfunction domCreate(doc, tag, ns) {\n  if (!doc && typeof document !== 'undefined' && document.createElement) {\n    doc = document;\n  }\n\n  return doc ? ns ? doc.createElementNS(ns, tag) : doc.createElement(tag) : null;\n} // find first child element with matching tag\n\n\nfunction domFind(el, tag) {\n  tag = tag.toLowerCase();\n  var nodes = el.childNodes,\n      i = 0,\n      n = nodes.length;\n\n  for (; i < n; ++i) if (nodes[i].tagName.toLowerCase() === tag) {\n    return nodes[i];\n  }\n} // retrieve child element at given index\n// create & insert if doesn't exist or if tags do not match\n\n\nfunction domChild(el, index, tag, ns) {\n  var a = el.childNodes[index],\n      b;\n\n  if (!a || a.tagName.toLowerCase() !== tag.toLowerCase()) {\n    b = a || null;\n    a = domCreate(el.ownerDocument, tag, ns);\n    el.insertBefore(a, b);\n  }\n\n  return a;\n} // remove all child elements at or above the given index\n\n\nfunction domClear(el, index) {\n  var nodes = el.childNodes,\n      curr = nodes.length;\n\n  while (curr > index) el.removeChild(nodes[--curr]);\n\n  return el;\n} // generate css class name for mark\n\n\nfunction cssClass(mark) {\n  return 'mark-' + mark.marktype + (mark.role ? ' role-' + mark.role : '') + (mark.name ? ' ' + mark.name : '');\n}\n},{}],\"Z5Zq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(event, el) {\n  var rect = el.getBoundingClientRect();\n  return [event.clientX - rect.left - (el.clientLeft || 0), event.clientY - rect.top - (el.clientTop || 0)];\n}\n},{}],\"zTlJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _index = _interopRequireDefault(require(\"../marks/index\"));\n\nvar _point = _interopRequireDefault(require(\"./point\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(item, event, el, origin) {\n  var mark = item && item.mark,\n      mdef,\n      p;\n\n  if (mark && (mdef = _index.default[mark.marktype]).tip) {\n    p = (0, _point.default)(event, el);\n    p[0] -= origin[0];\n    p[1] -= origin[1];\n\n    while (item = item.mark.group) {\n      p[0] -= item.x || 0;\n      p[1] -= item.y || 0;\n    }\n\n    item = mdef.tip(mark.items, p);\n  }\n\n  return item;\n}\n},{\"../marks/index\":\"Bm7B\",\"./point\":\"Z5Zq\"}],\"wwV1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Handler;\n\nvar _dom = require(\"./util/dom\");\n\nvar _resolveItem = _interopRequireDefault(require(\"./util/resolveItem\"));\n\nvar _vegaLoader = require(\"vega-loader\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Create a new Handler instance.\n * @param {object} [customLoader] - Optional loader instance for\n *   href URL sanitization. If not specified, a standard loader\n *   instance will be generated.\n * @param {function} [customTooltip] - Optional tooltip handler\n *   function for custom tooltip display.\n * @constructor\n */\nfunction Handler(customLoader, customTooltip) {\n  this._active = null;\n  this._handlers = {};\n  this._loader = customLoader || (0, _vegaLoader.loader)();\n  this._tooltip = customTooltip || defaultTooltip;\n} // The default tooltip display handler.\n// Sets the HTML title attribute on the visualization container.\n\n\nfunction defaultTooltip(handler, event, item, value) {\n  handler.element().setAttribute('title', value || '');\n}\n\nvar prototype = Handler.prototype;\n/**\n * Initialize a new Handler instance.\n * @param {DOMElement} el - The containing DOM element for the display.\n * @param {Array<number>} origin - The origin of the display, in pixels.\n *   The coordinate system will be translated to this point.\n * @param {object} [obj] - Optional context object that should serve as\n *   the \"this\" context for event callbacks.\n * @return {Handler} - This handler instance.\n */\n\nprototype.initialize = function (el, origin, obj) {\n  this._el = el;\n  this._obj = obj || null;\n  return this.origin(origin);\n};\n/**\n * Returns the parent container element for a visualization.\n * @return {DOMElement} - The containing DOM element.\n */\n\n\nprototype.element = function () {\n  return this._el;\n};\n/**\n * Returns the scene element (e.g., canvas or SVG) of the visualization\n * Subclasses must override if the first child is not the scene element.\n * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n */\n\n\nprototype.canvas = function () {\n  return this._el && this._el.firstChild;\n};\n/**\n * Get / set the origin coordinates of the visualization.\n */\n\n\nprototype.origin = function (origin) {\n  if (arguments.length) {\n    this._origin = origin || [0, 0];\n    return this;\n  } else {\n    return this._origin.slice();\n  }\n};\n/**\n * Get / set the scenegraph root.\n */\n\n\nprototype.scene = function (scene) {\n  if (!arguments.length) return this._scene;\n  this._scene = scene;\n  return this;\n};\n/**\n * Add an event handler. Subclasses should override this method.\n */\n\n\nprototype.on = function ()\n/*type, handler*/\n{};\n/**\n * Remove an event handler. Subclasses should override this method.\n */\n\n\nprototype.off = function ()\n/*type, handler*/\n{};\n/**\n * Utility method for finding the array index of an event handler.\n * @param {Array} h - An array of registered event handlers.\n * @param {string} type - The event type.\n * @param {function} handler - The event handler instance to find.\n * @return {number} - The handler's array index or -1 if not registered.\n */\n\n\nprototype._handlerIndex = function (h, type, handler) {\n  for (var i = h ? h.length : 0; --i >= 0;) {\n    if (h[i].type === type && (!handler || h[i].handler === handler)) {\n      return i;\n    }\n  }\n\n  return -1;\n};\n/**\n * Returns an array with registered event handlers.\n * @param {string} [type] - The event type to query. Any annotations\n *   are ignored; for example, for the argument \"click.foo\", \".foo\" will\n *   be ignored and the method returns all \"click\" handlers. If type is\n *   null or unspecified, this method returns handlers for all types.\n * @return {Array} - A new array containing all registered event handlers.\n */\n\n\nprototype.handlers = function (type) {\n  var h = this._handlers,\n      a = [],\n      k;\n\n  if (type) {\n    a.push.apply(a, h[this.eventName(type)]);\n  } else {\n    for (k in h) {\n      a.push.apply(a, h[k]);\n    }\n  }\n\n  return a;\n};\n/**\n * Parses an event name string to return the specific event type.\n * For example, given \"click.foo\" returns \"click\"\n * @param {string} name - The input event type string.\n * @return {string} - A string with the event type only.\n */\n\n\nprototype.eventName = function (name) {\n  var i = name.indexOf('.');\n  return i < 0 ? name : name.slice(0, i);\n};\n/**\n * Handle hyperlink navigation in response to an item.href value.\n * @param {Event} event - The event triggering hyperlink navigation.\n * @param {Item} item - The scenegraph item.\n * @param {string} href - The URL to navigate to.\n */\n\n\nprototype.handleHref = function (event, item, href) {\n  this._loader.sanitize(href, {\n    context: 'href'\n  }).then(function (opt) {\n    var e = new MouseEvent(event.type, event),\n        a = (0, _dom.domCreate)(null, 'a');\n\n    for (var name in opt) a.setAttribute(name, opt[name]);\n\n    a.dispatchEvent(e);\n  }).catch(function () {\n    /* do nothing */\n  });\n};\n/**\n * Handle tooltip display in response to an item.tooltip value.\n * @param {Event} event - The event triggering tooltip display.\n * @param {Item} item - The scenegraph item.\n * @param {boolean} show - A boolean flag indicating whether\n *   to show or hide a tooltip for the given item.\n */\n\n\nprototype.handleTooltip = function (event, item, show) {\n  if (item && item.tooltip != null) {\n    item = (0, _resolveItem.default)(item, event, this.canvas(), this._origin);\n    var value = show && item && item.tooltip || null;\n\n    this._tooltip.call(this._obj, this, event, item, value);\n  }\n};\n/**\n * Returns the size of a scenegraph item and its position relative\n * to the viewport.\n * @param {Item} item - The scenegraph item.\n * @return {object} - A bounding box object (compatible with the\n *   DOMRect type) consisting of x, y, width, heigh, top, left,\n *   right, and bottom properties.\n */\n\n\nprototype.getItemBoundingClientRect = function (item) {\n  if (!(el = this.canvas())) return;\n  var el,\n      rect = el.getBoundingClientRect(),\n      origin = this._origin,\n      itemBounds = item.bounds,\n      x = itemBounds.x1 + origin[0] + rect.left,\n      y = itemBounds.y1 + origin[1] + rect.top,\n      w = itemBounds.width(),\n      h = itemBounds.height(); // translate coordinate for each parent group\n\n  while (item.mark && (item = item.mark.group)) {\n    x += item.x || 0;\n    y += item.y || 0;\n  } // return DOMRect-compatible bounding box\n\n\n  return {\n    x: x,\n    y: y,\n    width: w,\n    height: h,\n    left: x,\n    top: y,\n    right: x + w,\n    bottom: y + h\n  };\n};\n},{\"./util/dom\":\"Mj7i\",\"./util/resolveItem\":\"zTlJ\",\"vega-loader\":\"ELDD\"}],\"Kibh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Renderer;\n\nvar _ResourceLoader = _interopRequireDefault(require(\"./ResourceLoader\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Create a new Renderer instance.\n * @param {object} [loader] - Optional loader instance for\n *   image and href URL sanitization. If not specified, a\n *   standard loader instance will be generated.\n * @constructor\n */\nfunction Renderer(loader) {\n  this._el = null;\n  this._bgcolor = null;\n  this._loader = new _ResourceLoader.default(loader);\n}\n\nvar prototype = Renderer.prototype;\n/**\n * Initialize a new Renderer instance.\n * @param {DOMElement} el - The containing DOM element for the display.\n * @param {number} width - The coordinate width of the display, in pixels.\n * @param {number} height - The coordinate height of the display, in pixels.\n * @param {Array<number>} origin - The origin of the display, in pixels.\n *   The coordinate system will be translated to this point.\n * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n *   the width and height to determine the final pixel size.\n * @return {Renderer} - This renderer instance.\n */\n\nprototype.initialize = function (el, width, height, origin, scaleFactor) {\n  this._el = el;\n  return this.resize(width, height, origin, scaleFactor);\n};\n/**\n * Returns the parent container element for a visualization.\n * @return {DOMElement} - The containing DOM element.\n */\n\n\nprototype.element = function () {\n  return this._el;\n};\n/**\n * Returns the scene element (e.g., canvas or SVG) of the visualization\n * Subclasses must override if the first child is not the scene element.\n * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n */\n\n\nprototype.canvas = function () {\n  return this._el && this._el.firstChild;\n};\n/**\n * Get / set the background color.\n */\n\n\nprototype.background = function (bgcolor) {\n  if (arguments.length === 0) return this._bgcolor;\n  this._bgcolor = bgcolor;\n  return this;\n};\n/**\n * Resize the display.\n * @param {number} width - The new coordinate width of the display, in pixels.\n * @param {number} height - The new coordinate height of the display, in pixels.\n * @param {Array<number>} origin - The new origin of the display, in pixels.\n *   The coordinate system will be translated to this point.\n * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n *   the width and height to determine the final pixel size.\n * @return {Renderer} - This renderer instance;\n */\n\n\nprototype.resize = function (width, height, origin, scaleFactor) {\n  this._width = width;\n  this._height = height;\n  this._origin = origin || [0, 0];\n  this._scale = scaleFactor || 1;\n  return this;\n};\n/**\n * Report a dirty item whose bounds should be redrawn.\n * This base class method does nothing. Subclasses that perform\n * incremental should implement this method.\n * @param {Item} item - The dirty item whose bounds should be redrawn.\n */\n\n\nprototype.dirty = function ()\n/*item*/\n{};\n/**\n * Render an input scenegraph, potentially with a set of dirty items.\n * This method will perform an immediate rendering with available resources.\n * The renderer may also need to perform image loading to perform a complete\n * render. This process can lead to asynchronous re-rendering of the scene\n * after this method returns. To receive notification when rendering is\n * complete, use the renderAsync method instead.\n * @param {object} scene - The root mark of a scenegraph to render.\n * @return {Renderer} - This renderer instance.\n */\n\n\nprototype.render = function (scene) {\n  var r = this; // bind arguments into a render call, and cache it\n  // this function may be subsequently called for async redraw\n\n  r._call = function () {\n    r._render(scene);\n  }; // invoke the renderer\n\n\n  r._call(); // clear the cached call for garbage collection\n  // async redraws will stash their own copy\n\n\n  r._call = null;\n  return r;\n};\n/**\n * Internal rendering method. Renderer subclasses should override this\n * method to actually perform rendering.\n * @param {object} scene - The root mark of a scenegraph to render.\n */\n\n\nprototype._render = function ()\n/*scene*/\n{// subclasses to override\n};\n/**\n * Asynchronous rendering method. Similar to render, but returns a Promise\n * that resolves when all rendering is completed. Sometimes a renderer must\n * perform image loading to get a complete rendering. The returned\n * Promise will not resolve until this process completes.\n * @param {object} scene - The root mark of a scenegraph to render.\n * @return {Promise} - A Promise that resolves when rendering is complete.\n */\n\n\nprototype.renderAsync = function (scene) {\n  var r = this.render(scene);\n  return this._ready ? this._ready.then(function () {\n    return r;\n  }) : Promise.resolve(r);\n};\n/**\n * Internal method for asynchronous resource loading.\n * Proxies method calls to the ImageLoader, and tracks loading\n * progress to invoke a re-render once complete.\n * @param {string} method - The method name to invoke on the ImageLoader.\n * @param {string} uri - The URI for the requested resource.\n * @return {Promise} - A Promise that resolves to the requested resource.\n */\n\n\nprototype._load = function (method, uri) {\n  var r = this,\n      p = r._loader[method](uri);\n\n  if (!r._ready) {\n    // re-render the scene when loading completes\n    var call = r._call;\n    r._ready = r._loader.ready().then(function (redraw) {\n      if (redraw) call();\n      r._ready = null;\n    });\n  }\n\n  return p;\n};\n/**\n * Sanitize a URL to include as a hyperlink in the rendered scene.\n * This method proxies a call to ImageLoader.sanitizeURL, but also tracks\n * image loading progress and invokes a re-render once complete.\n * @param {string} uri - The URI string to sanitize.\n * @return {Promise} - A Promise that resolves to the sanitized URL.\n */\n\n\nprototype.sanitizeURL = function (uri) {\n  return this._load('sanitizeURL', uri);\n};\n/**\n * Requests an image to include in the rendered scene.\n * This method proxies a call to ImageLoader.loadImage, but also tracks\n * image loading progress and invokes a re-render once complete.\n * @param {string} uri - The URI string of the image.\n * @return {Promise} - A Promise that resolves to the loaded Image.\n */\n\n\nprototype.loadImage = function (uri) {\n  return this._load('loadImage', uri);\n};\n},{\"./ResourceLoader\":\"sifT\"}],\"GeqU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.HrefEvent = exports.TooltipHideEvent = exports.TooltipShowEvent = exports.Events = void 0;\nvar Events = ['keydown', 'keypress', 'keyup', 'dragenter', 'dragleave', 'dragover', 'mousedown', 'mouseup', 'mousemove', 'mouseout', 'mouseover', 'click', 'dblclick', 'wheel', 'mousewheel', 'touchstart', 'touchmove', 'touchend'];\nexports.Events = Events;\nvar TooltipShowEvent = 'mousemove';\nexports.TooltipShowEvent = TooltipShowEvent;\nvar TooltipHideEvent = 'mouseout';\nexports.TooltipHideEvent = TooltipHideEvent;\nvar HrefEvent = 'click';\nexports.HrefEvent = HrefEvent;\n},{}],\"cPWs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = CanvasHandler;\n\nvar _Handler = _interopRequireDefault(require(\"./Handler\"));\n\nvar _index = _interopRequireDefault(require(\"./marks/index\"));\n\nvar _events = require(\"./util/events\");\n\nvar _point = _interopRequireDefault(require(\"./util/point\"));\n\nvar _dom = require(\"./util/dom\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction CanvasHandler(loader, tooltip) {\n  _Handler.default.call(this, loader, tooltip);\n\n  this._down = null;\n  this._touch = null;\n  this._first = true;\n}\n\nvar prototype = (0, _vegaUtil.inherits)(CanvasHandler, _Handler.default);\n\nprototype.initialize = function (el, origin, obj) {\n  // add event listeners\n  var canvas = this._canvas = el && (0, _dom.domFind)(el, 'canvas');\n\n  if (canvas) {\n    var that = this;\n    this.events.forEach(function (type) {\n      canvas.addEventListener(type, function (evt) {\n        if (prototype[type]) {\n          prototype[type].call(that, evt);\n        } else {\n          that.fire(type, evt);\n        }\n      });\n    });\n  }\n\n  return _Handler.default.prototype.initialize.call(this, el, origin, obj);\n}; // return the backing canvas instance\n\n\nprototype.canvas = function () {\n  return this._canvas;\n}; // retrieve the current canvas context\n\n\nprototype.context = function () {\n  return this._canvas.getContext('2d');\n}; // supported events\n\n\nprototype.events = _events.Events; // to keep old versions of firefox happy\n\nprototype.DOMMouseScroll = function (evt) {\n  this.fire('mousewheel', evt);\n};\n\nfunction move(moveEvent, overEvent, outEvent) {\n  return function (evt) {\n    var a = this._active,\n        p = this.pickEvent(evt);\n\n    if (p === a) {\n      // active item and picked item are the same\n      this.fire(moveEvent, evt); // fire move\n    } else {\n      // active item and picked item are different\n      if (!a || !a.exit) {\n        // fire out for prior active item\n        // suppress if active item was removed from scene\n        this.fire(outEvent, evt);\n      }\n\n      this._active = p; // set new active item\n\n      this.fire(overEvent, evt); // fire over for new active item\n\n      this.fire(moveEvent, evt); // fire move for new active item\n    }\n  };\n}\n\nfunction inactive(type) {\n  return function (evt) {\n    this.fire(type, evt);\n    this._active = null;\n  };\n}\n\nprototype.mousemove = move('mousemove', 'mouseover', 'mouseout');\nprototype.dragover = move('dragover', 'dragenter', 'dragleave');\nprototype.mouseout = inactive('mouseout');\nprototype.dragleave = inactive('dragleave');\n\nprototype.mousedown = function (evt) {\n  this._down = this._active;\n  this.fire('mousedown', evt);\n};\n\nprototype.click = function (evt) {\n  if (this._down === this._active) {\n    this.fire('click', evt);\n    this._down = null;\n  }\n};\n\nprototype.touchstart = function (evt) {\n  this._touch = this.pickEvent(evt.changedTouches[0]);\n\n  if (this._first) {\n    this._active = this._touch;\n    this._first = false;\n  }\n\n  this.fire('touchstart', evt, true);\n};\n\nprototype.touchmove = function (evt) {\n  this.fire('touchmove', evt, true);\n};\n\nprototype.touchend = function (evt) {\n  this.fire('touchend', evt, true);\n  this._touch = null;\n}; // fire an event\n\n\nprototype.fire = function (type, evt, touch) {\n  var a = touch ? this._touch : this._active,\n      h = this._handlers[type],\n      i,\n      len; // set event type relative to scenegraph items\n\n  evt.vegaType = type; // handle hyperlinks and tooltips first\n\n  if (type === _events.HrefEvent && a && a.href) {\n    this.handleHref(evt, a, a.href);\n  } else if (type === _events.TooltipShowEvent || type === _events.TooltipHideEvent) {\n    this.handleTooltip(evt, a, type !== _events.TooltipHideEvent);\n  } // invoke all registered handlers\n\n\n  if (h) {\n    for (i = 0, len = h.length; i < len; ++i) {\n      h[i].handler.call(this._obj, evt, a);\n    }\n  }\n}; // add an event handler\n\n\nprototype.on = function (type, handler) {\n  var name = this.eventName(type),\n      h = this._handlers,\n      i = this._handlerIndex(h[name], type, handler);\n\n  if (i < 0) {\n    (h[name] || (h[name] = [])).push({\n      type: type,\n      handler: handler\n    });\n  }\n\n  return this;\n}; // remove an event handler\n\n\nprototype.off = function (type, handler) {\n  var name = this.eventName(type),\n      h = this._handlers[name],\n      i = this._handlerIndex(h, type, handler);\n\n  if (i >= 0) {\n    h.splice(i, 1);\n  }\n\n  return this;\n};\n\nprototype.pickEvent = function (evt) {\n  var p = (0, _point.default)(evt, this._canvas),\n      o = this._origin;\n  return this.pick(this._scene, p[0], p[1], p[0] - o[0], p[1] - o[1]);\n}; // find the scenegraph item at the current mouse position\n// x, y -- the absolute x, y mouse coordinates on the canvas element\n// gx, gy -- the relative coordinates within the current group\n\n\nprototype.pick = function (scene, x, y, gx, gy) {\n  var g = this.context(),\n      mark = _index.default[scene.marktype];\n  return mark.pick.call(this, g, scene, x, y, gx, gy);\n};\n},{\"./Handler\":\"wwV1\",\"./marks/index\":\"Bm7B\",\"./util/events\":\"GeqU\",\"./util/point\":\"Z5Zq\",\"./util/dom\":\"Mj7i\",\"vega-util\":\"d61Z\"}],\"MApW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction devicePixelRatio() {\n  return typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n}\n\nvar pixelRatio = devicePixelRatio();\n\nfunction _default(canvas, width, height, origin, scaleFactor, opt) {\n  var inDOM = typeof HTMLElement !== 'undefined' && canvas instanceof HTMLElement && canvas.parentNode != null;\n  var context = canvas.getContext('2d'),\n      ratio = inDOM ? pixelRatio : scaleFactor,\n      key;\n  canvas.width = width * ratio;\n  canvas.height = height * ratio;\n\n  for (key in opt) {\n    context[key] = opt[key];\n  }\n\n  if (inDOM && ratio !== 1) {\n    canvas.style.width = width + 'px';\n    canvas.style.height = height + 'px';\n  }\n\n  context.pixelRatio = ratio;\n  context.setTransform(ratio, 0, 0, ratio, ratio * origin[0], ratio * origin[1]);\n  return canvas;\n}\n},{}],\"d9z5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = CanvasRenderer;\n\nvar _Renderer = _interopRequireDefault(require(\"./Renderer\"));\n\nvar _Bounds = _interopRequireDefault(require(\"./Bounds\"));\n\nvar _index = _interopRequireDefault(require(\"./marks/index\"));\n\nvar _dom = require(\"./util/dom\");\n\nvar _clip = _interopRequireDefault(require(\"./util/canvas/clip\"));\n\nvar _resize = _interopRequireDefault(require(\"./util/canvas/resize\"));\n\nvar _vegaCanvas = require(\"vega-canvas\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction CanvasRenderer(loader) {\n  _Renderer.default.call(this, loader);\n\n  this._redraw = false;\n  this._dirty = new _Bounds.default();\n}\n\nvar prototype = (0, _vegaUtil.inherits)(CanvasRenderer, _Renderer.default),\n    base = _Renderer.default.prototype,\n    tempBounds = new _Bounds.default();\n\nprototype.initialize = function (el, width, height, origin, scaleFactor, options) {\n  this._options = options;\n  this._canvas = (0, _vegaCanvas.canvas)(1, 1, options && options.type); // instantiate a small canvas\n\n  if (el) {\n    (0, _dom.domClear)(el, 0).appendChild(this._canvas);\n\n    this._canvas.setAttribute('class', 'marks');\n  } // this method will invoke resize to size the canvas appropriately\n\n\n  return base.initialize.call(this, el, width, height, origin, scaleFactor);\n};\n\nprototype.resize = function (width, height, origin, scaleFactor) {\n  base.resize.call(this, width, height, origin, scaleFactor);\n  (0, _resize.default)(this._canvas, this._width, this._height, this._origin, this._scale, this._options && this._options.context);\n  this._redraw = true;\n  return this;\n};\n\nprototype.canvas = function () {\n  return this._canvas;\n};\n\nprototype.context = function () {\n  return this._canvas ? this._canvas.getContext('2d') : null;\n};\n\nprototype.dirty = function (item) {\n  var b = translate(item.bounds, item.mark.group);\n\n  this._dirty.union(b);\n};\n\nfunction clipToBounds(g, b, origin) {\n  // expand bounds by 1 pixel, then round to pixel boundaries\n  b.expand(1).round(); // to avoid artifacts translate if origin has fractional pixels\n\n  b.translate(-(origin[0] % 1), -(origin[1] % 1)); // set clipping path\n\n  g.beginPath();\n  g.rect(b.x1, b.y1, b.width(), b.height());\n  g.clip();\n  return b;\n}\n\nfunction viewBounds(origin, width, height) {\n  return tempBounds.set(0, 0, width, height).translate(-origin[0], -origin[1]);\n}\n\nfunction translate(bounds, group) {\n  if (group == null) return bounds;\n  var b = tempBounds.clear().union(bounds);\n\n  for (; group != null; group = group.mark.group) {\n    b.translate(group.x || 0, group.y || 0);\n  }\n\n  return b;\n}\n\nprototype._render = function (scene) {\n  var g = this.context(),\n      o = this._origin,\n      w = this._width,\n      h = this._height,\n      b = this._dirty; // setup\n\n  g.save();\n\n  if (this._redraw || b.empty()) {\n    this._redraw = false;\n    b = viewBounds(o, w, h).expand(1);\n  } else {\n    b = clipToBounds(g, b.intersect(viewBounds(o, w, h)), o, w, h);\n  }\n\n  this.clear(-o[0], -o[1], w, h); // render\n\n  this.draw(g, scene, b); // takedown\n\n  g.restore();\n\n  this._dirty.clear();\n\n  return this;\n};\n\nprototype.draw = function (ctx, scene, bounds) {\n  var mark = _index.default[scene.marktype];\n  if (scene.clip) (0, _clip.default)(ctx, scene);\n  mark.draw.call(this, ctx, scene, bounds);\n  if (scene.clip) ctx.restore();\n};\n\nprototype.clear = function (x, y, w, h) {\n  var g = this.context();\n  g.clearRect(x, y, w, h);\n\n  if (this._bgcolor != null) {\n    g.fillStyle = this._bgcolor;\n    g.fillRect(x, y, w, h);\n  }\n};\n},{\"./Renderer\":\"Kibh\",\"./Bounds\":\"qFnp\",\"./marks/index\":\"Bm7B\",\"./util/dom\":\"Mj7i\",\"./util/canvas/clip\":\"N4qU\",\"./util/canvas/resize\":\"MApW\",\"vega-canvas\":\"r2P5\",\"vega-util\":\"d61Z\"}],\"DAJc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = SVGHandler;\n\nvar _Handler = _interopRequireDefault(require(\"./Handler\"));\n\nvar _dom = require(\"./util/dom\");\n\nvar _events = require(\"./util/events\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction SVGHandler(loader, tooltip) {\n  _Handler.default.call(this, loader, tooltip);\n\n  var h = this;\n  h._hrefHandler = listener(h, function (evt, item) {\n    if (item && item.href) h.handleHref(evt, item, item.href);\n  });\n  h._tooltipHandler = listener(h, function (evt, item) {\n    h.handleTooltip(evt, item, evt.type !== _events.TooltipHideEvent);\n  });\n}\n\nvar prototype = (0, _vegaUtil.inherits)(SVGHandler, _Handler.default);\n\nprototype.initialize = function (el, origin, obj) {\n  var svg = this._svg;\n\n  if (svg) {\n    svg.removeEventListener(_events.HrefEvent, this._hrefHandler);\n    svg.removeEventListener(_events.TooltipShowEvent, this._tooltipHandler);\n    svg.removeEventListener(_events.TooltipHideEvent, this._tooltipHandler);\n  }\n\n  this._svg = svg = el && (0, _dom.domFind)(el, 'svg');\n\n  if (svg) {\n    svg.addEventListener(_events.HrefEvent, this._hrefHandler);\n    svg.addEventListener(_events.TooltipShowEvent, this._tooltipHandler);\n    svg.addEventListener(_events.TooltipHideEvent, this._tooltipHandler);\n  }\n\n  return _Handler.default.prototype.initialize.call(this, el, origin, obj);\n};\n\nprototype.canvas = function () {\n  return this._svg;\n}; // wrap an event listener for the SVG DOM\n\n\nfunction listener(context, handler) {\n  return function (evt) {\n    var target = evt.target,\n        item = target.__data__;\n    evt.vegaType = evt.type;\n    item = Array.isArray(item) ? item[0] : item;\n    handler.call(context._obj, evt, item);\n  };\n} // add an event handler\n\n\nprototype.on = function (type, handler) {\n  var name = this.eventName(type),\n      h = this._handlers,\n      i = this._handlerIndex(h[name], type, handler);\n\n  if (i < 0) {\n    var x = {\n      type: type,\n      handler: handler,\n      listener: listener(this, handler)\n    };\n    (h[name] || (h[name] = [])).push(x);\n\n    if (this._svg) {\n      this._svg.addEventListener(name, x.listener);\n    }\n  }\n\n  return this;\n}; // remove an event handler\n\n\nprototype.off = function (type, handler) {\n  var name = this.eventName(type),\n      h = this._handlers[name],\n      i = this._handlerIndex(h, type, handler);\n\n  if (i >= 0) {\n    if (this._svg) {\n      this._svg.removeEventListener(name, h[i].listener);\n    }\n\n    h.splice(i, 1);\n  }\n\n  return this;\n};\n},{\"./Handler\":\"wwV1\",\"./util/dom\":\"Mj7i\",\"./util/events\":\"GeqU\",\"vega-util\":\"d61Z\"}],\"uZYQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.openTag = openTag;\nexports.closeTag = closeTag;\n\n// generate string for an opening xml tag\n// tag: the name of the xml tag\n// attr: hash of attribute name-value pairs to include\n// raw: additional raw string to include in tag markup\nfunction openTag(tag, attr, raw) {\n  var s = '<' + tag,\n      key,\n      val;\n\n  if (attr) {\n    for (key in attr) {\n      val = attr[key];\n\n      if (val != null) {\n        s += ' ' + key + '=\"' + val + '\"';\n      }\n    }\n  }\n\n  if (raw) s += ' ' + raw;\n  return s + '>';\n} // generate string for closing xml tag\n// tag: the name of the xml tag\n\n\nfunction closeTag(tag) {\n  return '</' + tag + '>';\n}\n},{}],\"kxyB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = {\n  'version': '1.1',\n  'xmlns': 'http://www.w3.org/2000/svg',\n  'xmlns:xlink': 'http://www.w3.org/1999/xlink'\n};\nexports.default = _default;\n},{}],\"CPuT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.styleProperties = exports.styles = void 0;\nvar styles = {\n  'fill': 'fill',\n  'fillOpacity': 'fill-opacity',\n  'stroke': 'stroke',\n  'strokeOpacity': 'stroke-opacity',\n  'strokeWidth': 'stroke-width',\n  'strokeCap': 'stroke-linecap',\n  'strokeJoin': 'stroke-linejoin',\n  'strokeDash': 'stroke-dasharray',\n  'strokeDashOffset': 'stroke-dashoffset',\n  'strokeMiterLimit': 'stroke-miterlimit',\n  'opacity': 'opacity'\n};\nexports.styles = styles;\nvar styleProperties = Object.keys(styles);\nexports.styleProperties = styleProperties;\n},{}],\"udsH\":[function(require,module,exports) {\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = SVGRenderer;\n\nvar _Renderer = _interopRequireDefault(require(\"./Renderer\"));\n\nvar _Gradient = require(\"./Gradient\");\n\nvar _index = _interopRequireDefault(require(\"./marks/index\"));\n\nvar _dom = require(\"./util/dom\");\n\nvar _tags = require(\"./util/tags\");\n\nvar _text = require(\"./util/text\");\n\nvar _visit = require(\"./util/visit\");\n\nvar _clip = _interopRequireDefault(require(\"./util/svg/clip\"));\n\nvar _metadata = _interopRequireDefault(require(\"./util/svg/metadata\"));\n\nvar _styles = require(\"./util/svg/styles\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ns = _metadata.default.xmlns;\n\nfunction SVGRenderer(loader) {\n  _Renderer.default.call(this, loader);\n\n  this._dirtyID = 0;\n  this._dirty = [];\n  this._svg = null;\n  this._root = null;\n  this._defs = null;\n}\n\nvar prototype = (0, _vegaUtil.inherits)(SVGRenderer, _Renderer.default);\nvar base = _Renderer.default.prototype;\n\nprototype.initialize = function (el, width, height, padding) {\n  if (el) {\n    this._svg = (0, _dom.domChild)(el, 0, 'svg', ns);\n\n    this._svg.setAttribute('class', 'marks');\n\n    (0, _dom.domClear)(el, 1); // set the svg root group\n\n    this._root = (0, _dom.domChild)(this._svg, 0, 'g', ns);\n    (0, _dom.domClear)(this._svg, 1);\n  } // create the svg definitions cache\n\n\n  this._defs = {\n    gradient: {},\n    clipping: {}\n  }; // set background color if defined\n\n  this.background(this._bgcolor);\n  return base.initialize.call(this, el, width, height, padding);\n};\n\nprototype.background = function (bgcolor) {\n  if (arguments.length && this._svg) {\n    this._svg.style.setProperty('background-color', bgcolor);\n  }\n\n  return base.background.apply(this, arguments);\n};\n\nprototype.resize = function (width, height, origin, scaleFactor) {\n  base.resize.call(this, width, height, origin, scaleFactor);\n\n  if (this._svg) {\n    this._svg.setAttribute('width', this._width * this._scale);\n\n    this._svg.setAttribute('height', this._height * this._scale);\n\n    this._svg.setAttribute('viewBox', '0 0 ' + this._width + ' ' + this._height);\n\n    this._root.setAttribute('transform', 'translate(' + this._origin + ')');\n  }\n\n  this._dirty = [];\n  return this;\n};\n\nprototype.canvas = function () {\n  return this._svg;\n};\n\nprototype.svg = function () {\n  if (!this._svg) return null;\n  var attr = {\n    class: 'marks',\n    width: this._width * this._scale,\n    height: this._height * this._scale,\n    viewBox: '0 0 ' + this._width + ' ' + this._height\n  };\n\n  for (var key in _metadata.default) {\n    attr[key] = _metadata.default[key];\n  }\n\n  var bg = !this._bgcolor ? '' : (0, _tags.openTag)('rect', {\n    width: this._width,\n    height: this._height,\n    style: 'fill: ' + this._bgcolor + ';'\n  }) + (0, _tags.closeTag)('rect');\n  return (0, _tags.openTag)('svg', attr) + bg + this._svg.innerHTML + (0, _tags.closeTag)('svg');\n}; // -- Render entry point --\n\n\nprototype._render = function (scene) {\n  // perform spot updates and re-render markup\n  if (this._dirtyCheck()) {\n    if (this._dirtyAll) this._resetDefs();\n    this.draw(this._root, scene);\n    (0, _dom.domClear)(this._root, 1);\n  }\n\n  this.updateDefs();\n  this._dirty = [];\n  ++this._dirtyID;\n  return this;\n}; // -- Manage SVG definitions ('defs') block --\n\n\nprototype.updateDefs = function () {\n  var svg = this._svg,\n      defs = this._defs,\n      el = defs.el,\n      index = 0,\n      id;\n\n  for (id in defs.gradient) {\n    if (!el) defs.el = el = (0, _dom.domChild)(svg, 0, 'defs', ns);\n    index = updateGradient(el, defs.gradient[id], index);\n  }\n\n  for (id in defs.clipping) {\n    if (!el) defs.el = el = (0, _dom.domChild)(svg, 0, 'defs', ns);\n    index = updateClipping(el, defs.clipping[id], index);\n  } // clean-up\n\n\n  if (el) {\n    if (index === 0) {\n      svg.removeChild(el);\n      defs.el = null;\n    } else {\n      (0, _dom.domClear)(el, index);\n    }\n  }\n};\n\nfunction updateGradient(el, grad, index) {\n  var i, n, stop;\n\n  if (grad.gradient === 'radial') {\n    // SVG radial gradients automatically transform to normalized bbox\n    // coordinates, in a way that is cumbersome to replicate in canvas.\n    // So we wrap the radial gradient in a pattern element, allowing us\n    // to mantain a circular gradient that matches what canvas provides.\n    var pt = (0, _dom.domChild)(el, index++, 'pattern', ns);\n    pt.setAttribute('id', _Gradient.patternPrefix + grad.id);\n    pt.setAttribute('viewBox', '0,0,1,1');\n    pt.setAttribute('width', '100%');\n    pt.setAttribute('height', '100%');\n    pt.setAttribute('preserveAspectRatio', 'xMidYMid slice');\n    pt = (0, _dom.domChild)(pt, 0, 'rect', ns);\n    pt.setAttribute('width', '1');\n    pt.setAttribute('height', '1');\n    pt.setAttribute('fill', 'url(' + href() + '#' + grad.id + ')');\n    el = (0, _dom.domChild)(el, index++, 'radialGradient', ns);\n    el.setAttribute('id', grad.id);\n    el.setAttribute('fx', grad.x1);\n    el.setAttribute('fy', grad.y1);\n    el.setAttribute('fr', grad.r1);\n    el.setAttribute('cx', grad.x2);\n    el.setAttribute('cy', grad.y2);\n    el.setAttribute('r', grad.r2);\n  } else {\n    el = (0, _dom.domChild)(el, index++, 'linearGradient', ns);\n    el.setAttribute('id', grad.id);\n    el.setAttribute('x1', grad.x1);\n    el.setAttribute('x2', grad.x2);\n    el.setAttribute('y1', grad.y1);\n    el.setAttribute('y2', grad.y2);\n  }\n\n  for (i = 0, n = grad.stops.length; i < n; ++i) {\n    stop = (0, _dom.domChild)(el, i, 'stop', ns);\n    stop.setAttribute('offset', grad.stops[i].offset);\n    stop.setAttribute('stop-color', grad.stops[i].color);\n  }\n\n  (0, _dom.domClear)(el, i);\n  return index;\n}\n\nfunction updateClipping(el, clip, index) {\n  var mask;\n  el = (0, _dom.domChild)(el, index, 'clipPath', ns);\n  el.setAttribute('id', clip.id);\n\n  if (clip.path) {\n    mask = (0, _dom.domChild)(el, 0, 'path', ns);\n    mask.setAttribute('d', clip.path);\n  } else {\n    mask = (0, _dom.domChild)(el, 0, 'rect', ns);\n    mask.setAttribute('x', 0);\n    mask.setAttribute('y', 0);\n    mask.setAttribute('width', clip.width);\n    mask.setAttribute('height', clip.height);\n  }\n\n  return index + 1;\n}\n\nprototype._resetDefs = function () {\n  var def = this._defs;\n  def.gradient = {};\n  def.clipping = {};\n}; // -- Manage rendering of items marked as dirty --\n\n\nprototype.dirty = function (item) {\n  if (item.dirty !== this._dirtyID) {\n    item.dirty = this._dirtyID;\n\n    this._dirty.push(item);\n  }\n};\n\nprototype.isDirty = function (item) {\n  return this._dirtyAll || !item._svg || item.dirty === this._dirtyID;\n};\n\nprototype._dirtyCheck = function () {\n  this._dirtyAll = true;\n  var items = this._dirty;\n  if (!items.length || !this._dirtyID) return true;\n  var id = ++this._dirtyID,\n      item,\n      mark,\n      type,\n      mdef,\n      i,\n      n,\n      o;\n\n  for (i = 0, n = items.length; i < n; ++i) {\n    item = items[i];\n    mark = item.mark;\n\n    if (mark.marktype !== type) {\n      // memoize mark instance lookup\n      type = mark.marktype;\n      mdef = _index.default[type];\n    }\n\n    if (mark.zdirty && mark.dirty !== id) {\n      this._dirtyAll = false;\n      dirtyParents(item, id);\n      mark.items.forEach(function (i) {\n        i.dirty = id;\n      });\n    }\n\n    if (mark.zdirty) continue; // handle in standard drawing pass\n\n    if (item.exit) {\n      // EXIT\n      if (mdef.nested && mark.items.length) {\n        // if nested mark with remaining points, update instead\n        o = mark.items[0];\n        if (o._svg) this._update(mdef, o._svg, o);\n      } else if (item._svg) {\n        // otherwise remove from DOM\n        o = item._svg.parentNode;\n        if (o) o.removeChild(item._svg);\n      }\n\n      item._svg = null;\n      continue;\n    }\n\n    item = mdef.nested ? mark.items[0] : item;\n    if (item._update === id) continue; // already visited\n\n    if (!item._svg || !item._svg.ownerSVGElement) {\n      // ENTER\n      this._dirtyAll = false;\n      dirtyParents(item, id);\n    } else {\n      // IN-PLACE UPDATE\n      this._update(mdef, item._svg, item);\n    }\n\n    item._update = id;\n  }\n\n  return !this._dirtyAll;\n};\n\nfunction dirtyParents(item, id) {\n  for (; item && item.dirty !== id; item = item.mark.group) {\n    item.dirty = id;\n\n    if (item.mark && item.mark.dirty !== id) {\n      item.mark.dirty = id;\n    } else return;\n  }\n} // -- Construct & maintain scenegraph to SVG mapping ---\n// Draw a mark container.\n\n\nprototype.draw = function (el, scene, prev) {\n  if (!this.isDirty(scene)) return scene._svg;\n  var renderer = this,\n      svg = this._svg,\n      mdef = _index.default[scene.marktype],\n      events = scene.interactive === false ? 'none' : null,\n      isGroup = mdef.tag === 'g',\n      sibling = null,\n      i = 0,\n      parent;\n  parent = bind(scene, el, prev, 'g', svg);\n  parent.setAttribute('class', (0, _dom.cssClass)(scene));\n\n  if (!isGroup) {\n    parent.style.setProperty('pointer-events', events);\n  }\n\n  if (scene.clip) {\n    parent.setAttribute('clip-path', (0, _clip.default)(renderer, scene, scene.group));\n  } else {\n    parent.removeAttribute('clip-path');\n  }\n\n  function process(item) {\n    var dirty = renderer.isDirty(item),\n        node = bind(item, parent, sibling, mdef.tag, svg);\n\n    if (dirty) {\n      renderer._update(mdef, node, item);\n\n      if (isGroup) recurse(renderer, node, item);\n    }\n\n    sibling = node;\n    ++i;\n  }\n\n  if (mdef.nested) {\n    if (scene.items.length) process(scene.items[0]);\n  } else {\n    (0, _visit.visit)(scene, process);\n  }\n\n  (0, _dom.domClear)(parent, i);\n  return parent;\n}; // Recursively process group contents.\n\n\nfunction recurse(renderer, el, group) {\n  el = el.lastChild;\n  var prev,\n      idx = 0;\n  (0, _visit.visit)(group, function (item) {\n    prev = renderer.draw(el, item, prev);\n    ++idx;\n  }); // remove any extraneous DOM elements\n\n  (0, _dom.domClear)(el, 1 + idx);\n} // Bind a scenegraph item to an SVG DOM element.\n// Create new SVG elements as needed.\n\n\nfunction bind(item, el, sibling, tag, svg) {\n  var node = item._svg,\n      doc; // create a new dom node if needed\n\n  if (!node) {\n    doc = el.ownerDocument;\n    node = (0, _dom.domCreate)(doc, tag, ns);\n    item._svg = node;\n\n    if (item.mark) {\n      node.__data__ = item;\n      node.__values__ = {\n        fill: 'default'\n      }; // if group, create background and foreground elements\n\n      if (tag === 'g') {\n        var bg = (0, _dom.domCreate)(doc, 'path', ns);\n        bg.setAttribute('class', 'background');\n        node.appendChild(bg);\n        bg.__data__ = item;\n        var fg = (0, _dom.domCreate)(doc, 'g', ns);\n        node.appendChild(fg);\n        fg.__data__ = item;\n      }\n    }\n  } // (re-)insert if (a) not contained in SVG or (b) sibling order has changed\n\n\n  if (node.ownerSVGElement !== svg || siblingCheck(node, sibling)) {\n    el.insertBefore(node, sibling ? sibling.nextSibling : el.firstChild);\n  }\n\n  return node;\n}\n\nfunction siblingCheck(node, sibling) {\n  return node.parentNode && node.parentNode.childNodes.length > 1 && node.previousSibling != sibling; // treat null/undefined the same\n} // -- Set attributes & styles on SVG elements ---\n\n\nvar element = null,\n    // temp var for current SVG element\nvalues = null; // temp var for current values hash\n// Extra configuration for certain mark types\n\nvar mark_extras = {\n  group: function (mdef, el, item) {\n    values = el.__values__; // use parent's values hash\n\n    element = el.childNodes[1];\n    mdef.foreground(emit, item, this);\n    element = el.childNodes[0];\n    mdef.background(emit, item, this);\n    var value = item.mark.interactive === false ? 'none' : null;\n\n    if (value !== values.events) {\n      element.style.setProperty('pointer-events', value);\n      values.events = value;\n    }\n  },\n  image: function (mdef, el, item) {\n    if (item.smooth === false) {\n      setStyle(el, 'image-rendering', 'optimizeSpeed');\n      setStyle(el, 'image-rendering', 'pixelated');\n    } else {\n      setStyle(el, 'image-rendering', null);\n    }\n  },\n  text: function (mdef, el, item) {\n    var tl = (0, _text.textLines)(item),\n        key,\n        value,\n        doc,\n        lh;\n\n    if ((0, _vegaUtil.isArray)(tl)) {\n      // multi-line text\n      value = tl.map(_ => (0, _text.textValue)(item, _));\n      key = value.join('\\n'); // content cache key\n\n      if (key !== values.text) {\n        (0, _dom.domClear)(el, 0);\n        doc = el.ownerDocument;\n        lh = (0, _text.lineHeight)(item);\n        value.forEach((t, i) => {\n          const ts = (0, _dom.domCreate)(doc, 'tspan', ns);\n          ts.__data__ = item; // data binding\n\n          ts.textContent = t;\n\n          if (i) {\n            ts.setAttribute('x', 0);\n            ts.setAttribute('dy', lh);\n          }\n\n          el.appendChild(ts);\n        });\n        values.text = key;\n      }\n    } else {\n      // single-line text\n      value = (0, _text.textValue)(item, tl);\n\n      if (value !== values.text) {\n        el.textContent = value;\n        values.text = value;\n      }\n    }\n\n    setStyle(el, 'font-family', (0, _text.fontFamily)(item));\n    setStyle(el, 'font-size', (0, _text.fontSize)(item) + 'px');\n    setStyle(el, 'font-style', item.fontStyle);\n    setStyle(el, 'font-variant', item.fontVariant);\n    setStyle(el, 'font-weight', item.fontWeight);\n  }\n};\n\nfunction setStyle(el, name, value) {\n  if (value !== values[name]) {\n    if (value == null) {\n      el.style.removeProperty(name);\n    } else {\n      el.style.setProperty(name, value + '');\n    }\n\n    values[name] = value;\n  }\n}\n\nprototype._update = function (mdef, el, item) {\n  // set dom element and values cache\n  // provides access to emit method\n  element = el;\n  values = el.__values__; // apply svg attributes\n\n  mdef.attr(emit, item, this); // some marks need special treatment\n\n  var extra = mark_extras[mdef.type];\n  if (extra) extra.call(this, mdef, el, item); // apply svg css styles\n  // note: element may be modified by 'extra' method\n\n  this.style(element, item);\n};\n\nfunction emit(name, value, ns) {\n  // early exit if value is unchanged\n  if (value === values[name]) return;\n\n  if (value != null) {\n    // if value is provided, update DOM attribute\n    if (ns) {\n      element.setAttributeNS(ns, name, value);\n    } else {\n      element.setAttribute(name, value);\n    }\n  } else {\n    // else remove DOM attribute\n    if (ns) {\n      element.removeAttributeNS(ns, name);\n    } else {\n      element.removeAttribute(name);\n    }\n  } // note current value for future comparison\n\n\n  values[name] = value;\n}\n\nprototype.style = function (el, o) {\n  if (o == null) return;\n  var i, n, prop, name, value;\n\n  for (i = 0, n = _styles.styleProperties.length; i < n; ++i) {\n    prop = _styles.styleProperties[i];\n    value = o[prop];\n\n    if (prop === 'font') {\n      value = (0, _text.fontFamily)(o);\n    }\n\n    if (value === values[prop]) continue;\n    name = _styles.styles[prop];\n\n    if (value == null) {\n      if (name === 'fill') {\n        el.style.setProperty(name, 'none');\n      } else {\n        el.style.removeProperty(name);\n      }\n    } else {\n      if ((0, _Gradient.isGradient)(value)) {\n        value = (0, _Gradient.gradientRef)(value, this._defs.gradient, href());\n      }\n\n      el.style.setProperty(name, value + '');\n    }\n\n    values[prop] = value;\n  }\n};\n\nfunction href() {\n  var loc;\n  return typeof window === 'undefined' ? '' : (loc = window.location).hash ? loc.href.slice(0, -loc.hash.length) : loc.href;\n}\n},{\"./Renderer\":\"Kibh\",\"./Gradient\":\"ERld\",\"./marks/index\":\"Bm7B\",\"./util/dom\":\"Mj7i\",\"./util/tags\":\"uZYQ\",\"./util/text\":\"hv1J\",\"./util/visit\":\"k1ty\",\"./util/svg/clip\":\"D6AO\",\"./util/svg/metadata\":\"kxyB\",\"./util/svg/styles\":\"CPuT\",\"vega-util\":\"d61Z\",\"process\":\"FT5O\"}],\"Zggb\":[function(require,module,exports) {\nvar process = require(\"process\");\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = SVGStringRenderer;\n\nvar _Renderer = _interopRequireDefault(require(\"./Renderer\"));\n\nvar _Gradient = require(\"./Gradient\");\n\nvar _index = _interopRequireDefault(require(\"./marks/index\"));\n\nvar _dom = require(\"./util/dom\");\n\nvar _tags = require(\"./util/tags\");\n\nvar _text = require(\"./util/text\");\n\nvar _visit = require(\"./util/visit\");\n\nvar _clip = _interopRequireDefault(require(\"./util/svg/clip\"));\n\nvar _metadata = _interopRequireDefault(require(\"./util/svg/metadata\"));\n\nvar _styles = require(\"./util/svg/styles\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction SVGStringRenderer(loader) {\n  _Renderer.default.call(this, loader);\n\n  this._text = {\n    head: '',\n    bg: '',\n    root: '',\n    foot: '',\n    defs: '',\n    body: ''\n  };\n  this._defs = {\n    gradient: {},\n    clipping: {}\n  };\n}\n\nvar prototype = (0, _vegaUtil.inherits)(SVGStringRenderer, _Renderer.default);\nvar base = _Renderer.default.prototype;\n\nprototype.resize = function (width, height, origin, scaleFactor) {\n  base.resize.call(this, width, height, origin, scaleFactor);\n  var o = this._origin,\n      t = this._text;\n  var attr = {\n    class: 'marks',\n    width: this._width * this._scale,\n    height: this._height * this._scale,\n    viewBox: '0 0 ' + this._width + ' ' + this._height\n  };\n\n  for (var key in _metadata.default) {\n    attr[key] = _metadata.default[key];\n  }\n\n  t.head = (0, _tags.openTag)('svg', attr);\n  var bg = this._bgcolor;\n  if (bg === 'transparent' || bg === 'none') bg = null;\n\n  if (bg) {\n    t.bg = (0, _tags.openTag)('rect', {\n      width: this._width,\n      height: this._height,\n      style: 'fill: ' + bg + ';'\n    }) + (0, _tags.closeTag)('rect');\n  } else {\n    t.bg = '';\n  }\n\n  t.root = (0, _tags.openTag)('g', {\n    transform: 'translate(' + o + ')'\n  });\n  t.foot = (0, _tags.closeTag)('g') + (0, _tags.closeTag)('svg');\n  return this;\n};\n\nprototype.background = function () {\n  var rv = base.background.apply(this, arguments);\n\n  if (arguments.length && this._text.head) {\n    this.resize(this._width, this._height, this._origin, this._scale);\n  }\n\n  return rv;\n};\n\nprototype.svg = function () {\n  var t = this._text;\n  return t.head + t.bg + t.defs + t.root + t.body + t.foot;\n};\n\nprototype._render = function (scene) {\n  this._text.body = this.mark(scene);\n  this._text.defs = this.buildDefs();\n  return this;\n};\n\nprototype.buildDefs = function () {\n  var all = this._defs,\n      defs = '',\n      i,\n      id,\n      def,\n      tag,\n      stops;\n\n  for (id in all.gradient) {\n    def = all.gradient[id];\n    stops = def.stops;\n\n    if (def.gradient === 'radial') {\n      // SVG radial gradients automatically transform to normalized bbox\n      // coordinates, in a way that is cumbersome to replicate in canvas.\n      // So we wrap the radial gradient in a pattern element, allowing us\n      // to mantain a circular gradient that matches what canvas provides.\n      defs += (0, _tags.openTag)(tag = 'pattern', {\n        id: _Gradient.patternPrefix + id,\n        viewBox: '0,0,1,1',\n        width: '100%',\n        height: '100%',\n        preserveAspectRatio: 'xMidYMid slice'\n      });\n      defs += (0, _tags.openTag)('rect', {\n        width: '1',\n        height: '1',\n        fill: 'url(#' + id + ')'\n      }) + (0, _tags.closeTag)('rect');\n      defs += (0, _tags.closeTag)(tag);\n      defs += (0, _tags.openTag)(tag = 'radialGradient', {\n        id: id,\n        fx: def.x1,\n        fy: def.y1,\n        fr: def.r1,\n        cx: def.x2,\n        cy: def.y2,\n        r: def.r2\n      });\n    } else {\n      defs += (0, _tags.openTag)(tag = 'linearGradient', {\n        id: id,\n        x1: def.x1,\n        x2: def.x2,\n        y1: def.y1,\n        y2: def.y2\n      });\n    }\n\n    for (i = 0; i < stops.length; ++i) {\n      defs += (0, _tags.openTag)('stop', {\n        offset: stops[i].offset,\n        'stop-color': stops[i].color\n      }) + (0, _tags.closeTag)('stop');\n    }\n\n    defs += (0, _tags.closeTag)(tag);\n  }\n\n  for (id in all.clipping) {\n    def = all.clipping[id];\n    defs += (0, _tags.openTag)('clipPath', {\n      id: id\n    });\n\n    if (def.path) {\n      defs += (0, _tags.openTag)('path', {\n        d: def.path\n      }) + (0, _tags.closeTag)('path');\n    } else {\n      defs += (0, _tags.openTag)('rect', {\n        x: 0,\n        y: 0,\n        width: def.width,\n        height: def.height\n      }) + (0, _tags.closeTag)('rect');\n    }\n\n    defs += (0, _tags.closeTag)('clipPath');\n  }\n\n  return defs.length > 0 ? (0, _tags.openTag)('defs') + defs + (0, _tags.closeTag)('defs') : '';\n};\n\nvar object;\n\nfunction emit(name, value, ns, prefixed) {\n  object[prefixed || name] = value;\n}\n\nprototype.attributes = function (attr, item) {\n  object = {};\n  attr(emit, item, this);\n  return object;\n};\n\nprototype.href = function (item) {\n  var that = this,\n      href = item.href,\n      attr;\n\n  if (href) {\n    if (attr = that._hrefs && that._hrefs[href]) {\n      return attr;\n    } else {\n      that.sanitizeURL(href).then(function (attr) {\n        // rewrite to use xlink namespace\n        // note that this will be deprecated in SVG 2.0\n        attr['xlink:href'] = attr.href;\n        attr.href = null;\n        (that._hrefs || (that._hrefs = {}))[href] = attr;\n      });\n    }\n  }\n\n  return null;\n};\n\nprototype.mark = function (scene) {\n  var renderer = this,\n      mdef = _index.default[scene.marktype],\n      tag = mdef.tag,\n      defs = this._defs,\n      str = '',\n      style;\n\n  if (tag !== 'g' && scene.interactive === false) {\n    style = 'style=\"pointer-events: none;\"';\n  } // render opening group tag\n\n\n  str += (0, _tags.openTag)('g', {\n    'class': (0, _dom.cssClass)(scene),\n    'clip-path': scene.clip ? (0, _clip.default)(renderer, scene, scene.group) : null\n  }, style); // render contained elements\n\n  function process(item) {\n    var href = renderer.href(item);\n    if (href) str += (0, _tags.openTag)('a', href);\n    style = tag !== 'g' ? applyStyles(item, scene, tag, defs) : null;\n    str += (0, _tags.openTag)(tag, renderer.attributes(mdef.attr, item), style);\n\n    if (tag === 'text') {\n      const tl = (0, _text.textLines)(item);\n\n      if ((0, _vegaUtil.isArray)(tl)) {\n        // multi-line text\n        const attrs = {\n          x: 0,\n          dy: (0, _text.lineHeight)(item)\n        };\n\n        for (let i = 0; i < tl.length; ++i) {\n          str += (0, _tags.openTag)('tspan', i ? attrs : null) + escape_text((0, _text.textValue)(item, tl[i])) + (0, _tags.closeTag)('tspan');\n        }\n      } else {\n        // single-line text\n        str += escape_text((0, _text.textValue)(item, tl));\n      }\n    } else if (tag === 'g') {\n      str += (0, _tags.openTag)('path', renderer.attributes(mdef.background, item), applyStyles(item, scene, 'bgrect', defs)) + (0, _tags.closeTag)('path');\n      str += (0, _tags.openTag)('g', renderer.attributes(mdef.foreground, item)) + renderer.markGroup(item) + (0, _tags.closeTag)('g');\n    }\n\n    str += (0, _tags.closeTag)(tag);\n    if (href) str += (0, _tags.closeTag)('a');\n  }\n\n  if (mdef.nested) {\n    if (scene.items && scene.items.length) process(scene.items[0]);\n  } else {\n    (0, _visit.visit)(scene, process);\n  } // render closing group tag\n\n\n  return str + (0, _tags.closeTag)('g');\n};\n\nprototype.markGroup = function (scene) {\n  var renderer = this,\n      str = '';\n  (0, _visit.visit)(scene, function (item) {\n    str += renderer.mark(item);\n  });\n  return str;\n};\n\nfunction applyStyles(o, mark, tag, defs) {\n  if (o == null) return '';\n  var i,\n      n,\n      prop,\n      name,\n      value,\n      s = '';\n\n  if (tag === 'bgrect' && mark.interactive === false) {\n    s += 'pointer-events: none; ';\n  }\n\n  if (tag === 'image') {\n    if (o.smooth === false) {\n      s += 'image-rendering: optimizeSpeed; image-rendering: pixelated; ';\n    }\n  }\n\n  if (tag === 'text') {\n    s += 'font-family: ' + (0, _text.fontFamily)(o) + '; ';\n    s += 'font-size: ' + (0, _text.fontSize)(o) + 'px; ';\n    if (o.fontStyle) s += 'font-style: ' + o.fontStyle + '; ';\n    if (o.fontVariant) s += 'font-variant: ' + o.fontVariant + '; ';\n    if (o.fontWeight) s += 'font-weight: ' + o.fontWeight + '; ';\n  }\n\n  for (i = 0, n = _styles.styleProperties.length; i < n; ++i) {\n    prop = _styles.styleProperties[i];\n    name = _styles.styles[prop];\n    value = o[prop];\n\n    if (value == null) {\n      if (name === 'fill') {\n        s += 'fill: none; ';\n      }\n    } else if (value === 'transparent' && (name === 'fill' || name === 'stroke')) {\n      // transparent is not a legal SVG value, so map to none instead\n      s += name + ': none; ';\n    } else {\n      if ((0, _Gradient.isGradient)(value)) {\n        value = (0, _Gradient.gradientRef)(value, defs.gradient, '');\n      }\n\n      s += name + ': ' + value + '; ';\n    }\n  }\n\n  return s ? 'style=\"' + s.trim() + '\"' : null;\n}\n\nfunction escape_text(s) {\n  return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n},{\"./Renderer\":\"Kibh\",\"./Gradient\":\"ERld\",\"./marks/index\":\"Bm7B\",\"./util/dom\":\"Mj7i\",\"./util/tags\":\"uZYQ\",\"./util/text\":\"hv1J\",\"./util/visit\":\"k1ty\",\"./util/svg/clip\":\"D6AO\",\"./util/svg/metadata\":\"kxyB\",\"./util/svg/styles\":\"CPuT\",\"vega-util\":\"d61Z\",\"process\":\"FT5O\"}],\"zYwu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.renderModule = renderModule;\nexports.RenderType = void 0;\n\nvar _CanvasHandler = _interopRequireDefault(require(\"./CanvasHandler\"));\n\nvar _CanvasRenderer = _interopRequireDefault(require(\"./CanvasRenderer\"));\n\nvar _SVGHandler = _interopRequireDefault(require(\"./SVGHandler\"));\n\nvar _SVGRenderer = _interopRequireDefault(require(\"./SVGRenderer\"));\n\nvar _SVGStringRenderer = _interopRequireDefault(require(\"./SVGStringRenderer\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Canvas = 'canvas';\nvar PNG = 'png';\nvar SVG = 'svg';\nvar None = 'none';\nvar RenderType = {\n  Canvas: Canvas,\n  PNG: PNG,\n  SVG: SVG,\n  None: None\n};\nexports.RenderType = RenderType;\nvar modules = {};\nmodules[Canvas] = modules[PNG] = {\n  renderer: _CanvasRenderer.default,\n  headless: _CanvasRenderer.default,\n  handler: _CanvasHandler.default\n};\nmodules[SVG] = {\n  renderer: _SVGRenderer.default,\n  headless: _SVGStringRenderer.default,\n  handler: _SVGHandler.default\n};\nmodules[None] = {};\n\nfunction renderModule(name, _) {\n  name = String(name || '').toLowerCase();\n\n  if (arguments.length > 1) {\n    modules[name] = _;\n    return this;\n  } else {\n    return modules[name];\n  }\n}\n},{\"./CanvasHandler\":\"cPWs\",\"./CanvasRenderer\":\"d9z5\",\"./SVGHandler\":\"DAJc\",\"./SVGRenderer\":\"udsH\",\"./SVGStringRenderer\":\"Zggb\"}],\"hLJ6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.intersect = intersect;\n\nvar _index = _interopRequireDefault(require(\"./marks/index\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _Bounds = _interopRequireDefault(require(\"./Bounds\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction intersect(scene, bounds, filter) {\n  const hits = [],\n        // intersection results\n  box = new _Bounds.default().union(bounds),\n        // defensive copy\n  type = scene.marktype;\n  return type ? intersectMark(scene, box, filter, hits) : type === 'group' ? intersectGroup(scene, box, filter, hits) : (0, _vegaUtil.error)('Intersect scene must be mark node or group item.');\n}\n\nfunction intersectMark(mark, box, filter, hits) {\n  if (visitMark(mark, box, filter)) {\n    const items = mark.items,\n          type = mark.marktype,\n          n = items.length;\n    let i = 0;\n\n    if (type === 'group') {\n      for (; i < n; ++i) {\n        intersectGroup(items[i], box, filter, hits);\n      }\n    } else {\n      for (const test = _index.default[type].isect; i < n; ++i) {\n        let item = items[i];\n        if (intersectItem(item, box, test)) hits.push(item);\n      }\n    }\n  }\n\n  return hits;\n}\n\nfunction visitMark(mark, box, filter) {\n  // process if bounds intersect and if\n  // (1) mark is a group mark (so we must recurse), or\n  // (2) mark is interactive and passes filter\n  return mark.bounds && box.intersects(mark.bounds) && (mark.marktype === 'group' || mark.interactive !== false && (!filter || filter(mark)));\n}\n\nfunction intersectGroup(group, box, filter, hits) {\n  // test intersect against group\n  // skip groups by default unless filter says otherwise\n  if (filter && filter(group.mark) && intersectItem(group, box, _index.default.group.isect)) {\n    hits.push(group);\n  } // recursively test children marks\n  // translate box to group coordinate space\n\n\n  const marks = group.items,\n        n = marks && marks.length;\n\n  if (n) {\n    const x = group.x || 0,\n          y = group.y || 0;\n    box.translate(-x, -y);\n\n    for (let i = 0; i < n; ++i) {\n      intersectMark(marks[i], box, filter, hits);\n    }\n\n    box.translate(x, y);\n  }\n\n  return hits;\n}\n\nfunction intersectItem(item, box, test) {\n  // test bounds enclosure, bounds intersection, then detailed test\n  const bounds = item.bounds;\n  return box.encloses(bounds) || box.intersects(bounds) && test(item, box);\n}\n},{\"./marks/index\":\"Bm7B\",\"vega-util\":\"d61Z\",\"./Bounds\":\"qFnp\"}],\"avCF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _Bounds = _interopRequireDefault(require(\"../Bounds\"));\n\nvar _boundContext = _interopRequireDefault(require(\"./boundContext\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar clipBounds = new _Bounds.default();\n\nfunction _default(mark) {\n  var clip = mark.clip;\n\n  if ((0, _vegaUtil.isFunction)(clip)) {\n    clip((0, _boundContext.default)(clipBounds.clear()));\n  } else if (clip) {\n    clipBounds.set(0, 0, mark.group.width, mark.group.height);\n  } else return;\n\n  mark.bounds.intersect(clipBounds);\n}\n},{\"../Bounds\":\"qFnp\",\"./boundContext\":\"Kn7H\",\"vega-util\":\"d61Z\"}],\"jh7K\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sceneEqual = sceneEqual;\nexports.pathEqual = pathEqual;\n\nvar _parse = _interopRequireDefault(require(\"../path/parse\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TOLERANCE = 1e-9;\n\nfunction sceneEqual(a, b, key) {\n  return a === b ? true : key === 'path' ? pathEqual(a, b) : a instanceof Date && b instanceof Date ? +a === +b : (0, _vegaUtil.isNumber)(a) && (0, _vegaUtil.isNumber)(b) ? Math.abs(a - b) <= TOLERANCE : !a || !b || !(0, _vegaUtil.isObject)(a) && !(0, _vegaUtil.isObject)(b) ? a == b : a == null || b == null ? false : objectEqual(a, b);\n}\n\nfunction pathEqual(a, b) {\n  return sceneEqual((0, _parse.default)(a), (0, _parse.default)(b));\n}\n\nfunction objectEqual(a, b) {\n  var ka = Object.keys(a),\n      kb = Object.keys(b),\n      key,\n      i;\n  if (ka.length !== kb.length) return false;\n  ka.sort();\n  kb.sort();\n\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] != kb[i]) return false;\n  }\n\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!sceneEqual(a[key], b[key], key)) return false;\n  }\n\n  return typeof a === typeof b;\n}\n},{\"../path/parse\":\"ANC8\",\"vega-util\":\"d61Z\"}],\"AgKg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Bounds\", {\n  enumerable: true,\n  get: function () {\n    return _Bounds.default;\n  }\n});\nObject.defineProperty(exports, \"Gradient\", {\n  enumerable: true,\n  get: function () {\n    return _Gradient.default;\n  }\n});\nObject.defineProperty(exports, \"GroupItem\", {\n  enumerable: true,\n  get: function () {\n    return _GroupItem.default;\n  }\n});\nObject.defineProperty(exports, \"ResourceLoader\", {\n  enumerable: true,\n  get: function () {\n    return _ResourceLoader.default;\n  }\n});\nObject.defineProperty(exports, \"Item\", {\n  enumerable: true,\n  get: function () {\n    return _Item.default;\n  }\n});\nObject.defineProperty(exports, \"Scenegraph\", {\n  enumerable: true,\n  get: function () {\n    return _Scenegraph.default;\n  }\n});\nObject.defineProperty(exports, \"Handler\", {\n  enumerable: true,\n  get: function () {\n    return _Handler.default;\n  }\n});\nObject.defineProperty(exports, \"Renderer\", {\n  enumerable: true,\n  get: function () {\n    return _Renderer.default;\n  }\n});\nObject.defineProperty(exports, \"CanvasHandler\", {\n  enumerable: true,\n  get: function () {\n    return _CanvasHandler.default;\n  }\n});\nObject.defineProperty(exports, \"CanvasRenderer\", {\n  enumerable: true,\n  get: function () {\n    return _CanvasRenderer.default;\n  }\n});\nObject.defineProperty(exports, \"SVGHandler\", {\n  enumerable: true,\n  get: function () {\n    return _SVGHandler.default;\n  }\n});\nObject.defineProperty(exports, \"SVGRenderer\", {\n  enumerable: true,\n  get: function () {\n    return _SVGRenderer.default;\n  }\n});\nObject.defineProperty(exports, \"SVGStringRenderer\", {\n  enumerable: true,\n  get: function () {\n    return _SVGStringRenderer.default;\n  }\n});\nObject.defineProperty(exports, \"RenderType\", {\n  enumerable: true,\n  get: function () {\n    return _modules.RenderType;\n  }\n});\nObject.defineProperty(exports, \"renderModule\", {\n  enumerable: true,\n  get: function () {\n    return _modules.renderModule;\n  }\n});\nObject.defineProperty(exports, \"intersect\", {\n  enumerable: true,\n  get: function () {\n    return _intersect.intersect;\n  }\n});\nObject.defineProperty(exports, \"Marks\", {\n  enumerable: true,\n  get: function () {\n    return _index.default;\n  }\n});\nObject.defineProperty(exports, \"boundClip\", {\n  enumerable: true,\n  get: function () {\n    return _boundClip.default;\n  }\n});\nObject.defineProperty(exports, \"boundContext\", {\n  enumerable: true,\n  get: function () {\n    return _boundContext.default;\n  }\n});\nObject.defineProperty(exports, \"boundStroke\", {\n  enumerable: true,\n  get: function () {\n    return _boundStroke.default;\n  }\n});\nObject.defineProperty(exports, \"boundItem\", {\n  enumerable: true,\n  get: function () {\n    return _boundItem.default;\n  }\n});\nObject.defineProperty(exports, \"boundMark\", {\n  enumerable: true,\n  get: function () {\n    return _boundMark.default;\n  }\n});\nObject.defineProperty(exports, \"pathCurves\", {\n  enumerable: true,\n  get: function () {\n    return _curves.default;\n  }\n});\nObject.defineProperty(exports, \"pathSymbols\", {\n  enumerable: true,\n  get: function () {\n    return _symbols.default;\n  }\n});\nObject.defineProperty(exports, \"pathRectangle\", {\n  enumerable: true,\n  get: function () {\n    return _rectangle.default;\n  }\n});\nObject.defineProperty(exports, \"pathTrail\", {\n  enumerable: true,\n  get: function () {\n    return _trail.default;\n  }\n});\nObject.defineProperty(exports, \"pathParse\", {\n  enumerable: true,\n  get: function () {\n    return _parse.default;\n  }\n});\nObject.defineProperty(exports, \"pathRender\", {\n  enumerable: true,\n  get: function () {\n    return _render.default;\n  }\n});\nObject.defineProperty(exports, \"point\", {\n  enumerable: true,\n  get: function () {\n    return _point.default;\n  }\n});\nObject.defineProperty(exports, \"domCreate\", {\n  enumerable: true,\n  get: function () {\n    return _dom.domCreate;\n  }\n});\nObject.defineProperty(exports, \"domFind\", {\n  enumerable: true,\n  get: function () {\n    return _dom.domFind;\n  }\n});\nObject.defineProperty(exports, \"domChild\", {\n  enumerable: true,\n  get: function () {\n    return _dom.domChild;\n  }\n});\nObject.defineProperty(exports, \"domClear\", {\n  enumerable: true,\n  get: function () {\n    return _dom.domClear;\n  }\n});\nObject.defineProperty(exports, \"openTag\", {\n  enumerable: true,\n  get: function () {\n    return _tags.openTag;\n  }\n});\nObject.defineProperty(exports, \"closeTag\", {\n  enumerable: true,\n  get: function () {\n    return _tags.closeTag;\n  }\n});\nObject.defineProperty(exports, \"font\", {\n  enumerable: true,\n  get: function () {\n    return _text.font;\n  }\n});\nObject.defineProperty(exports, \"fontFamily\", {\n  enumerable: true,\n  get: function () {\n    return _text.fontFamily;\n  }\n});\nObject.defineProperty(exports, \"fontSize\", {\n  enumerable: true,\n  get: function () {\n    return _text.fontSize;\n  }\n});\nObject.defineProperty(exports, \"lineHeight\", {\n  enumerable: true,\n  get: function () {\n    return _text.lineHeight;\n  }\n});\nObject.defineProperty(exports, \"multiLineOffset\", {\n  enumerable: true,\n  get: function () {\n    return _text.multiLineOffset;\n  }\n});\nObject.defineProperty(exports, \"textMetrics\", {\n  enumerable: true,\n  get: function () {\n    return _text.textMetrics;\n  }\n});\nObject.defineProperty(exports, \"resetSVGClipId\", {\n  enumerable: true,\n  get: function () {\n    return _clip.resetSVGClipId;\n  }\n});\nObject.defineProperty(exports, \"sceneEqual\", {\n  enumerable: true,\n  get: function () {\n    return _equal.sceneEqual;\n  }\n});\nObject.defineProperty(exports, \"pathEqual\", {\n  enumerable: true,\n  get: function () {\n    return _equal.pathEqual;\n  }\n});\nObject.defineProperty(exports, \"sceneToJSON\", {\n  enumerable: true,\n  get: function () {\n    return _serialize.sceneToJSON;\n  }\n});\nObject.defineProperty(exports, \"sceneFromJSON\", {\n  enumerable: true,\n  get: function () {\n    return _serialize.sceneFromJSON;\n  }\n});\nObject.defineProperty(exports, \"intersectPath\", {\n  enumerable: true,\n  get: function () {\n    return _intersect2.intersectPath;\n  }\n});\nObject.defineProperty(exports, \"intersectPoint\", {\n  enumerable: true,\n  get: function () {\n    return _intersect2.intersectPoint;\n  }\n});\nObject.defineProperty(exports, \"intersectRule\", {\n  enumerable: true,\n  get: function () {\n    return _intersect2.intersectRule;\n  }\n});\nObject.defineProperty(exports, \"intersectBoxLine\", {\n  enumerable: true,\n  get: function () {\n    return _intersect2.intersectBoxLine;\n  }\n});\nObject.defineProperty(exports, \"sceneZOrder\", {\n  enumerable: true,\n  get: function () {\n    return _visit.zorder;\n  }\n});\nObject.defineProperty(exports, \"sceneVisit\", {\n  enumerable: true,\n  get: function () {\n    return _visit.visit;\n  }\n});\nObject.defineProperty(exports, \"scenePickVisit\", {\n  enumerable: true,\n  get: function () {\n    return _visit.pickVisit;\n  }\n});\n\nvar _Bounds = _interopRequireDefault(require(\"./src/Bounds\"));\n\nvar _Gradient = _interopRequireDefault(require(\"./src/Gradient\"));\n\nvar _GroupItem = _interopRequireDefault(require(\"./src/GroupItem\"));\n\nvar _ResourceLoader = _interopRequireDefault(require(\"./src/ResourceLoader\"));\n\nvar _Item = _interopRequireDefault(require(\"./src/Item\"));\n\nvar _Scenegraph = _interopRequireDefault(require(\"./src/Scenegraph\"));\n\nvar _Handler = _interopRequireDefault(require(\"./src/Handler\"));\n\nvar _Renderer = _interopRequireDefault(require(\"./src/Renderer\"));\n\nvar _CanvasHandler = _interopRequireDefault(require(\"./src/CanvasHandler\"));\n\nvar _CanvasRenderer = _interopRequireDefault(require(\"./src/CanvasRenderer\"));\n\nvar _SVGHandler = _interopRequireDefault(require(\"./src/SVGHandler\"));\n\nvar _SVGRenderer = _interopRequireDefault(require(\"./src/SVGRenderer\"));\n\nvar _SVGStringRenderer = _interopRequireDefault(require(\"./src/SVGStringRenderer\"));\n\nvar _modules = require(\"./src/modules\");\n\nvar _intersect = require(\"./src/intersect\");\n\nvar _index = _interopRequireDefault(require(\"./src/marks/index\"));\n\nvar _boundClip = _interopRequireDefault(require(\"./src/bound/boundClip\"));\n\nvar _boundContext = _interopRequireDefault(require(\"./src/bound/boundContext\"));\n\nvar _boundStroke = _interopRequireDefault(require(\"./src/bound/boundStroke\"));\n\nvar _boundItem = _interopRequireDefault(require(\"./src/bound/boundItem\"));\n\nvar _boundMark = _interopRequireDefault(require(\"./src/bound/boundMark\"));\n\nvar _curves = _interopRequireDefault(require(\"./src/path/curves\"));\n\nvar _symbols = _interopRequireDefault(require(\"./src/path/symbols\"));\n\nvar _rectangle = _interopRequireDefault(require(\"./src/path/rectangle\"));\n\nvar _trail = _interopRequireDefault(require(\"./src/path/trail\"));\n\nvar _parse = _interopRequireDefault(require(\"./src/path/parse\"));\n\nvar _render = _interopRequireDefault(require(\"./src/path/render\"));\n\nvar _point = _interopRequireDefault(require(\"./src/util/point\"));\n\nvar _dom = require(\"./src/util/dom\");\n\nvar _tags = require(\"./src/util/tags\");\n\nvar _text = require(\"./src/util/text\");\n\nvar _clip = require(\"./src/util/svg/clip\");\n\nvar _equal = require(\"./src/util/equal\");\n\nvar _serialize = require(\"./src/util/serialize\");\n\nvar _intersect2 = require(\"./src/util/intersect\");\n\nvar _visit = require(\"./src/util/visit\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Bounds\":\"qFnp\",\"./src/Gradient\":\"ERld\",\"./src/GroupItem\":\"T9oK\",\"./src/ResourceLoader\":\"sifT\",\"./src/Item\":\"AdWX\",\"./src/Scenegraph\":\"hZw4\",\"./src/Handler\":\"wwV1\",\"./src/Renderer\":\"Kibh\",\"./src/CanvasHandler\":\"cPWs\",\"./src/CanvasRenderer\":\"d9z5\",\"./src/SVGHandler\":\"DAJc\",\"./src/SVGRenderer\":\"udsH\",\"./src/SVGStringRenderer\":\"Zggb\",\"./src/modules\":\"zYwu\",\"./src/intersect\":\"hLJ6\",\"./src/marks/index\":\"Bm7B\",\"./src/bound/boundClip\":\"avCF\",\"./src/bound/boundContext\":\"Kn7H\",\"./src/bound/boundStroke\":\"a802\",\"./src/bound/boundItem\":\"r4ur\",\"./src/bound/boundMark\":\"DoVp\",\"./src/path/curves\":\"m19G\",\"./src/path/symbols\":\"EeJn\",\"./src/path/rectangle\":\"zxxl\",\"./src/path/trail\":\"qISZ\",\"./src/path/parse\":\"ANC8\",\"./src/path/render\":\"H11R\",\"./src/util/point\":\"Z5Zq\",\"./src/util/dom\":\"Mj7i\",\"./src/util/tags\":\"uZYQ\",\"./src/util/text\":\"hv1J\",\"./src/util/svg/clip\":\"D6AO\",\"./src/util/equal\":\"jh7K\",\"./src/util/serialize\":\"tZoq\",\"./src/util/intersect\":\"pmRF\",\"./src/util/visit\":\"k1ty\"}],\"L9Om\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Bound;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Calculate bounding boxes for scenegraph items.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.mark - The scenegraph mark instance to bound.\n */\nfunction Bound(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Bound, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var view = pulse.dataflow,\n      mark = _.mark,\n      type = mark.marktype,\n      entry = _vegaScenegraph.Marks[type],\n      bound = entry.bound,\n      markBounds = mark.bounds,\n      rebound;\n\n  if (entry.nested) {\n    // multi-item marks have a single bounds instance\n    if (mark.items.length) view.dirty(mark.items[0]);\n    markBounds = boundItem(mark, bound);\n    mark.items.forEach(function (item) {\n      item.bounds.clear().union(markBounds);\n    });\n  } else if (type === _constants.Group || _.modified()) {\n    // operator parameters modified -> re-bound all items\n    // updates group bounds in response to modified group content\n    pulse.visit(pulse.MOD, function (item) {\n      view.dirty(item);\n    });\n    markBounds.clear();\n    mark.items.forEach(function (item) {\n      markBounds.union(boundItem(item, bound));\n    }); // force reflow for axes/legends/titles to propagate any layout changes\n\n    switch (mark.role) {\n      case _constants.AxisRole:\n      case _constants.LegendRole:\n      case _constants.TitleRole:\n        pulse.reflow();\n    }\n  } else {\n    // incrementally update bounds, re-bound mark as needed\n    rebound = pulse.changed(pulse.REM);\n    pulse.visit(pulse.ADD, function (item) {\n      markBounds.union(boundItem(item, bound));\n    });\n    pulse.visit(pulse.MOD, function (item) {\n      rebound = rebound || markBounds.alignsWith(item.bounds);\n      view.dirty(item);\n      markBounds.union(boundItem(item, bound));\n    });\n\n    if (rebound) {\n      markBounds.clear();\n      mark.items.forEach(function (item) {\n        markBounds.union(item.bounds);\n      });\n    }\n  } // ensure mark bounds do not exceed any clipping region\n\n\n  (0, _vegaScenegraph.boundClip)(mark);\n  return pulse.modifies('bounds');\n};\n\nfunction boundItem(item, bound, opt) {\n  return bound(item.bounds.clear(), item, opt);\n}\n},{\"./constants\":\"OeAt\",\"vega-dataflow\":\"luN0\",\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"cGKX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Identifier;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar COUNTER_NAME = ':vega_identifier:';\n/**\n * Adds a unique identifier to all added tuples.\n * This transform creates a new signal that serves as an id counter.\n * As a result, the id counter is shared across all instances of this\n * transform, generating unique ids across multiple data streams. In\n * addition, this signal value can be included in a snapshot of the\n * dataflow state, enabling correct resumption of id allocation.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.as - The field name for the generated identifier.\n */\n\nfunction Identifier(params) {\n  _vegaDataflow.Transform.call(this, 0, params);\n}\n\nIdentifier.Definition = {\n  \"type\": \"Identifier\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"required\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Identifier, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var counter = getCounter(pulse.dataflow),\n      id = counter.value,\n      as = _.as;\n  pulse.visit(pulse.ADD, function (t) {\n    if (!t[as]) t[as] = ++id;\n  });\n  counter.set(this.value = id);\n  return pulse;\n};\n\nfunction getCounter(view) {\n  var counter = view._signals[COUNTER_NAME];\n\n  if (!counter) {\n    view._signals[COUNTER_NAME] = counter = view.add(0);\n  }\n\n  return counter;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"oYKW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Mark;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Bind scenegraph items to a scenegraph mark instance.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.markdef - The mark definition for creating the mark.\n *   This is an object of legal scenegraph mark properties which *must* include\n *   the 'marktype' property.\n */\nfunction Mark(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Mark, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var mark = this.value; // acquire mark on first invocation, bind context and group\n\n  if (!mark) {\n    mark = pulse.dataflow.scenegraph().mark(_.markdef, lookup(_), _.index);\n    mark.group.context = _.context;\n    if (!_.context.group) _.context.group = mark.group;\n    mark.source = this.source; // point to upstream collector\n\n    mark.clip = _.clip;\n    mark.interactive = _.interactive;\n    this.value = mark;\n  } // initialize entering items\n\n\n  var Init = mark.marktype === _constants.Group ? _vegaScenegraph.GroupItem : _vegaScenegraph.Item;\n  pulse.visit(pulse.ADD, function (item) {\n    Init.call(item, mark);\n  }); // update clipping and/or interactive status\n\n  if (_.modified('clip') || _.modified('interactive')) {\n    mark.clip = _.clip;\n    mark.interactive = !!_.interactive;\n    mark.zdirty = true; // force scenegraph re-eval\n\n    pulse.reflow();\n  } // bind items array to scenegraph mark\n\n\n  mark.items = pulse.source;\n  return pulse;\n};\n\nfunction lookup(_) {\n  var g = _.groups,\n      p = _.parent;\n  return g && g.size === 1 ? g.get(Object.keys(g.object)[0]) : g && p ? g.lookup(p) : null;\n}\n},{\"./constants\":\"OeAt\",\"vega-dataflow\":\"luN0\",\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"kKmz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Overlap;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Analyze items for overlap, changing opacity to hide items with\n * overlapping bounding boxes. This transform will preserve at least\n * two items (e.g., first and last) even if overlap persists.\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator\n *   function for sorting items.\n * @param {object} [params.method] - The overlap removal method to apply.\n *   One of 'parity' (default, hide every other item until there is no\n *   more overlap) or 'greedy' (sequentially scan and hide and items that\n *   overlap with the last visible item).\n * @param {object} [params.boundScale] - A scale whose range should be used\n *   to bound the items. Items exceeding the bounds of the scale range\n *   will be treated as overlapping. If null or undefined, no bounds check\n *   will be applied.\n * @param {object} [params.boundOrient] - The orientation of the scale\n *   (top, bottom, left, or right) used to bound items. This parameter is\n *   ignored if boundScale is null or undefined.\n * @param {object} [params.boundTolerance] - The tolerance in pixels for\n *   bound inclusion testing (default 1). This specifies by how many pixels\n *   an item's bounds may exceed the scale range bounds and not be culled.\n * @constructor\n */\nfunction Overlap(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Overlap, _vegaDataflow.Transform);\nvar methods = {\n  parity: function (items) {\n    return items.filter((item, i) => i % 2 ? item.opacity = 0 : 1);\n  },\n  greedy: function (items, sep) {\n    var a;\n    return items.filter((b, i) => {\n      if (!i || !intersect(a.bounds, b.bounds, sep)) {\n        a = b;\n        return 1;\n      } else {\n        return b.opacity = 0;\n      }\n    });\n  }\n}; // compute bounding box intersection\n// including padding pixels of separation\n\nfunction intersect(a, b, sep) {\n  return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);\n}\n\nfunction hasOverlap(items, pad) {\n  for (var i = 1, n = items.length, a = items[0].bounds, b; i < n; a = b, ++i) {\n    if (intersect(a, b = items[i].bounds, pad)) return true;\n  }\n}\n\nfunction hasBounds(item) {\n  var b = item.bounds;\n  return b.width() > 1 && b.height() > 1;\n}\n\nfunction boundTest(scale, orient, tolerance) {\n  var range = scale.range(),\n      b = new _vegaScenegraph.Bounds();\n\n  if (orient === _constants.Top || orient === _constants.Bottom) {\n    b.set(range[0], -Infinity, range[1], +Infinity);\n  } else {\n    b.set(-Infinity, range[0], +Infinity, range[1]);\n  }\n\n  b.expand(tolerance || 1);\n  return item => b.encloses(item.bounds);\n} // reset all items to be fully opaque\n\n\nfunction reset(source) {\n  source.forEach(item => item.opacity = 1);\n  return source;\n} // add all tuples to mod, fork pulse if parameters were modified\n// fork prevents cross-stream tuple pollution (e.g., pulse from scale)\n\n\nfunction reflow(pulse, _) {\n  return pulse.reflow(_.modified()).modifies('opacity');\n}\n\nprototype.transform = function (_, pulse) {\n  var reduce = methods[_.method] || methods.parity,\n      source = pulse.materialize(pulse.SOURCE).source,\n      sep = _.separation || 0,\n      items,\n      test,\n      bounds;\n  if (!source || !source.length) return;\n\n  if (!_.method) {\n    // early exit if method is falsy\n    if (_.modified('method')) {\n      reset(source);\n      pulse = reflow(pulse, _);\n    }\n\n    return pulse;\n  }\n\n  if (_.sort) {\n    source = source.slice().sort(_.sort);\n  } // skip labels with no content\n\n\n  source = source.filter(hasBounds);\n  items = reset(source);\n  pulse = reflow(pulse, _);\n\n  if (items.length >= 3 && hasOverlap(items, sep)) {\n    do {\n      items = reduce(items, sep);\n    } while (items.length >= 3 && hasOverlap(items, sep));\n\n    if (items.length < 3 && !(0, _vegaUtil.peek)(source).opacity) {\n      if (items.length > 1) (0, _vegaUtil.peek)(items).opacity = 0;\n      (0, _vegaUtil.peek)(source).opacity = 1;\n    }\n  }\n\n  if (_.boundScale && _.boundTolerance >= 0) {\n    test = boundTest(_.boundScale, _.boundOrient, +_.boundTolerance);\n    source.forEach(item => {\n      if (!test(item)) item.opacity = 0;\n    });\n  } // re-calculate mark bounds\n\n\n  bounds = items[0].mark.bounds.clear();\n  source.forEach(item => {\n    if (item.opacity) bounds.union(item.bounds);\n  });\n  return pulse;\n};\n},{\"./constants\":\"OeAt\",\"vega-dataflow\":\"luN0\",\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"DL8R\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Render;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Queue modified scenegraph items for rendering.\n * @constructor\n */\nfunction Render(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Render, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var view = pulse.dataflow;\n  pulse.visit(pulse.ALL, function (item) {\n    view.dirty(item);\n  }); // set z-index dirty flag as needed\n\n  if (pulse.fields && pulse.fields['zindex']) {\n    var item = pulse.source && pulse.source[0];\n    if (item) item.mark.zdirty = true;\n  }\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"A1Jj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.set = set;\nexports.tempBounds = void 0;\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nconst tempBounds = new _vegaScenegraph.Bounds();\nexports.tempBounds = tempBounds;\n\nfunction set(item, property, value) {\n  return item[property] === value ? 0 : (item[property] = value, 1);\n}\n},{\"vega-scenegraph\":\"AgKg\"}],\"CoCs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isYAxis = isYAxis;\nexports.axisLayout = axisLayout;\n\nvar _constants = require(\"../constants\");\n\nvar _util = require(\"./util\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nfunction isYAxis(mark) {\n  var orient = mark.items[0].datum.orient;\n  return orient === _constants.Left || orient === _constants.Right;\n}\n\nfunction axisIndices(datum) {\n  var index = +datum.grid;\n  return [datum.ticks ? index++ : -1, // ticks index\n  datum.labels ? index++ : -1, // labels index\n  index + +datum.domain // title index\n  ];\n}\n\nfunction axisLayout(view, axis, width, height) {\n  var item = axis.items[0],\n      datum = item.datum,\n      orient = datum.orient,\n      delta = datum.translate != null ? datum.translate : 0.5,\n      indices = axisIndices(datum),\n      range = item.range,\n      offset = item.offset,\n      position = item.position,\n      minExtent = item.minExtent,\n      maxExtent = item.maxExtent,\n      title = datum.title && item.items[indices[2]].items[0],\n      titlePadding = item.titlePadding,\n      bounds = item.bounds,\n      dl = title && (0, _vegaScenegraph.multiLineOffset)(title),\n      x = 0,\n      y = 0,\n      i,\n      s;\n\n  _util.tempBounds.clear().union(bounds);\n\n  bounds.clear();\n  if ((i = indices[0]) > -1) bounds.union(item.items[i].bounds);\n  if ((i = indices[1]) > -1) bounds.union(item.items[i].bounds); // position axis group and title\n\n  switch (orient) {\n    case _constants.Top:\n      x = position || 0;\n      y = -offset;\n      s = Math.max(minExtent, Math.min(maxExtent, -bounds.y1));\n      if (title) s = axisTitleLayout(view, title, s, titlePadding, dl, 0, -1, bounds);\n      bounds.add(0, -s).add(range, 0);\n      break;\n\n    case _constants.Left:\n      x = -offset;\n      y = position || 0;\n      s = Math.max(minExtent, Math.min(maxExtent, -bounds.x1));\n      if (title) s = axisTitleLayout(view, title, s, titlePadding, dl, 1, -1, bounds);\n      bounds.add(-s, 0).add(0, range);\n      break;\n\n    case _constants.Right:\n      x = width + offset;\n      y = position || 0;\n      s = Math.max(minExtent, Math.min(maxExtent, bounds.x2));\n      if (title) s = axisTitleLayout(view, title, s, titlePadding, dl, 1, 1, bounds);\n      bounds.add(0, 0).add(s, range);\n      break;\n\n    case _constants.Bottom:\n      x = position || 0;\n      y = height + offset;\n      s = Math.max(minExtent, Math.min(maxExtent, bounds.y2));\n      if (title) s = axisTitleLayout(view, title, s, titlePadding, 0, 0, 1, bounds);\n      bounds.add(0, 0).add(range, s);\n      break;\n\n    default:\n      x = item.x;\n      y = item.y;\n  } // update bounds\n\n\n  (0, _vegaScenegraph.boundStroke)(bounds.translate(x, y), item);\n\n  if ((0, _util.set)(item, 'x', x + delta) | (0, _util.set)(item, 'y', y + delta)) {\n    item.bounds = _util.tempBounds;\n    view.dirty(item);\n    item.bounds = bounds;\n    view.dirty(item);\n  }\n\n  return item.mark.bounds.clear().union(bounds);\n}\n\nfunction axisTitleLayout(view, title, offset, pad, dl, isYAxis, sign, bounds) {\n  var b = title.bounds,\n      dx = 0,\n      dy = 0;\n\n  if (title.auto) {\n    view.dirty(title);\n    offset += pad;\n    isYAxis ? dx = (title.x || 0) - (title.x = sign * (offset + dl)) : dy = (title.y || 0) - (title.y = sign * (offset + dl));\n    title.mark.bounds.clear().union(b.translate(-dx, -dy));\n    view.dirty(title);\n\n    if (isYAxis) {\n      bounds.add(0, b.y1).add(0, b.y2);\n      offset += b.width();\n    } else {\n      bounds.add(b.x1, 0).add(b.x2, 0);\n      offset += b.height();\n    }\n  } else {\n    bounds.union(b);\n  }\n\n  return offset;\n}\n},{\"../constants\":\"OeAt\",\"./util\":\"A1Jj\",\"vega-scenegraph\":\"AgKg\"}],\"PNHc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.gridLayout = gridLayout;\nexports.trellisLayout = trellisLayout;\n\nvar _constants = require(\"../constants\");\n\nvar _util = require(\"./util\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction gridLayoutGroups(group) {\n  var groups = group.items,\n      n = groups.length,\n      i = 0,\n      mark,\n      items;\n  var views = {\n    marks: [],\n    rowheaders: [],\n    rowfooters: [],\n    colheaders: [],\n    colfooters: [],\n    rowtitle: null,\n    coltitle: null\n  }; // layout axes, gather legends, collect bounds\n\n  for (; i < n; ++i) {\n    mark = groups[i];\n    items = mark.items;\n\n    if (mark.marktype === _constants.Group) {\n      switch (mark.role) {\n        case _constants.AxisRole:\n        case _constants.LegendRole:\n        case _constants.TitleRole:\n          break;\n\n        case _constants.RowHeader:\n          views.rowheaders.push(...items);\n          break;\n\n        case _constants.RowFooter:\n          views.rowfooters.push(...items);\n          break;\n\n        case _constants.ColHeader:\n          views.colheaders.push(...items);\n          break;\n\n        case _constants.ColFooter:\n          views.colfooters.push(...items);\n          break;\n\n        case _constants.RowTitle:\n          views.rowtitle = items[0];\n          break;\n\n        case _constants.ColTitle:\n          views.coltitle = items[0];\n          break;\n\n        default:\n          views.marks.push(...items);\n      }\n    }\n  }\n\n  return views;\n}\n\nfunction bboxFlush(item) {\n  return new _vegaScenegraph.Bounds().set(0, 0, item.width || 0, item.height || 0);\n}\n\nfunction bboxFull(item) {\n  var b = item.bounds.clone();\n  return b.empty() ? b.set(0, 0, 0, 0) : b.translate(-(item.x || 0), -(item.y || 0));\n}\n\nfunction get(opt, key, d) {\n  var v = (0, _vegaUtil.isObject)(opt) ? opt[key] : opt;\n  return v != null ? v : d !== undefined ? d : 0;\n}\n\nfunction offsetValue(v) {\n  return v < 0 ? Math.ceil(-v) : 0;\n}\n\nfunction gridLayout(view, groups, opt) {\n  var dirty = !opt.nodirty,\n      bbox = opt.bounds === _constants.Flush ? bboxFlush : bboxFull,\n      bounds = _util.tempBounds.set(0, 0, 0, 0),\n      alignCol = get(opt.align, _constants.Column),\n      alignRow = get(opt.align, _constants.Row),\n      padCol = get(opt.padding, _constants.Column),\n      padRow = get(opt.padding, _constants.Row),\n      ncols = opt.columns || groups.length,\n      nrows = ncols < 0 ? 1 : Math.ceil(groups.length / ncols),\n      n = groups.length,\n      xOffset = Array(n),\n      xExtent = Array(ncols),\n      xMax = 0,\n      yOffset = Array(n),\n      yExtent = Array(nrows),\n      yMax = 0,\n      dx = Array(n),\n      dy = Array(n),\n      boxes = Array(n),\n      m,\n      i,\n      c,\n      r,\n      b,\n      g,\n      px,\n      py,\n      x,\n      y,\n      offset;\n\n  for (i = 0; i < ncols; ++i) xExtent[i] = 0;\n\n  for (i = 0; i < nrows; ++i) yExtent[i] = 0; // determine offsets for each group\n\n\n  for (i = 0; i < n; ++i) {\n    g = groups[i];\n    b = boxes[i] = bbox(g);\n    g.x = g.x || 0;\n    dx[i] = 0;\n    g.y = g.y || 0;\n    dy[i] = 0;\n    c = i % ncols;\n    r = ~~(i / ncols);\n    xMax = Math.max(xMax, px = Math.ceil(b.x2));\n    yMax = Math.max(yMax, py = Math.ceil(b.y2));\n    xExtent[c] = Math.max(xExtent[c], px);\n    yExtent[r] = Math.max(yExtent[r], py);\n    xOffset[i] = padCol + offsetValue(b.x1);\n    yOffset[i] = padRow + offsetValue(b.y1);\n    if (dirty) view.dirty(groups[i]);\n  } // set initial alignment offsets\n\n\n  for (i = 0; i < n; ++i) {\n    if (i % ncols === 0) xOffset[i] = 0;\n    if (i < ncols) yOffset[i] = 0;\n  } // enforce column alignment constraints\n\n\n  if (alignCol === _constants.Each) {\n    for (c = 1; c < ncols; ++c) {\n      for (offset = 0, i = c; i < n; i += ncols) {\n        if (offset < xOffset[i]) offset = xOffset[i];\n      }\n\n      for (i = c; i < n; i += ncols) {\n        xOffset[i] = offset + xExtent[c - 1];\n      }\n    }\n  } else if (alignCol === _constants.All) {\n    for (offset = 0, i = 0; i < n; ++i) {\n      if (i % ncols && offset < xOffset[i]) offset = xOffset[i];\n    }\n\n    for (i = 0; i < n; ++i) {\n      if (i % ncols) xOffset[i] = offset + xMax;\n    }\n  } else {\n    for (alignCol = false, c = 1; c < ncols; ++c) {\n      for (i = c; i < n; i += ncols) {\n        xOffset[i] += xExtent[c - 1];\n      }\n    }\n  } // enforce row alignment constraints\n\n\n  if (alignRow === _constants.Each) {\n    for (r = 1; r < nrows; ++r) {\n      for (offset = 0, i = r * ncols, m = i + ncols; i < m; ++i) {\n        if (offset < yOffset[i]) offset = yOffset[i];\n      }\n\n      for (i = r * ncols; i < m; ++i) {\n        yOffset[i] = offset + yExtent[r - 1];\n      }\n    }\n  } else if (alignRow === _constants.All) {\n    for (offset = 0, i = ncols; i < n; ++i) {\n      if (offset < yOffset[i]) offset = yOffset[i];\n    }\n\n    for (i = ncols; i < n; ++i) {\n      yOffset[i] = offset + yMax;\n    }\n  } else {\n    for (alignRow = false, r = 1; r < nrows; ++r) {\n      for (i = r * ncols, m = i + ncols; i < m; ++i) {\n        yOffset[i] += yExtent[r - 1];\n      }\n    }\n  } // perform horizontal grid layout\n\n\n  for (x = 0, i = 0; i < n; ++i) {\n    x = xOffset[i] + (i % ncols ? x : 0);\n    dx[i] += x - groups[i].x;\n  } // perform vertical grid layout\n\n\n  for (c = 0; c < ncols; ++c) {\n    for (y = 0, i = c; i < n; i += ncols) {\n      y += yOffset[i];\n      dy[i] += y - groups[i].y;\n    }\n  } // perform horizontal centering\n\n\n  if (alignCol && get(opt.center, _constants.Column) && nrows > 1) {\n    for (i = 0; i < n; ++i) {\n      b = alignCol === _constants.All ? xMax : xExtent[i % ncols];\n      x = b - boxes[i].x2 - groups[i].x - dx[i];\n      if (x > 0) dx[i] += x / 2;\n    }\n  } // perform vertical centering\n\n\n  if (alignRow && get(opt.center, _constants.Row) && ncols !== 1) {\n    for (i = 0; i < n; ++i) {\n      b = alignRow === _constants.All ? yMax : yExtent[~~(i / ncols)];\n      y = b - boxes[i].y2 - groups[i].y - dy[i];\n      if (y > 0) dy[i] += y / 2;\n    }\n  } // position grid relative to anchor\n\n\n  for (i = 0; i < n; ++i) {\n    bounds.union(boxes[i].translate(dx[i], dy[i]));\n  }\n\n  x = get(opt.anchor, _constants.X);\n  y = get(opt.anchor, _constants.Y);\n\n  switch (get(opt.anchor, _constants.Column)) {\n    case _constants.End:\n      x -= bounds.width();\n      break;\n\n    case _constants.Middle:\n      x -= bounds.width() / 2;\n  }\n\n  switch (get(opt.anchor, _constants.Row)) {\n    case _constants.End:\n      y -= bounds.height();\n      break;\n\n    case _constants.Middle:\n      y -= bounds.height() / 2;\n  }\n\n  x = Math.round(x);\n  y = Math.round(y); // update mark positions, bounds, dirty\n\n  bounds.clear();\n\n  for (i = 0; i < n; ++i) {\n    groups[i].mark.bounds.clear();\n  }\n\n  for (i = 0; i < n; ++i) {\n    g = groups[i];\n    g.x += dx[i] += x;\n    g.y += dy[i] += y;\n    bounds.union(g.mark.bounds.union(g.bounds.translate(dx[i], dy[i])));\n    if (dirty) view.dirty(g);\n  }\n\n  return bounds;\n}\n\nfunction trellisLayout(view, group, opt) {\n  var views = gridLayoutGroups(group),\n      groups = views.marks,\n      bbox = opt.bounds === _constants.Flush ? boundFlush : boundFull,\n      off = opt.offset,\n      ncols = opt.columns || groups.length,\n      nrows = ncols < 0 ? 1 : Math.ceil(groups.length / ncols),\n      cells = nrows * ncols,\n      x,\n      y,\n      x2,\n      y2,\n      anchor,\n      band,\n      offset; // -- initial grid layout\n\n  const bounds = gridLayout(view, groups, opt); // -- layout grid headers and footers --\n  // perform row header layout\n\n  if (views.rowheaders) {\n    band = get(opt.headerBand, _constants.Row, null);\n    x = layoutHeaders(view, views.rowheaders, groups, ncols, nrows, -get(off, 'rowHeader'), min, 0, bbox, 'x1', 0, ncols, 1, band);\n  } // perform column header layout\n\n\n  if (views.colheaders) {\n    band = get(opt.headerBand, _constants.Column, null);\n    y = layoutHeaders(view, views.colheaders, groups, ncols, ncols, -get(off, 'columnHeader'), min, 1, bbox, 'y1', 0, 1, ncols, band);\n  } // perform row footer layout\n\n\n  if (views.rowfooters) {\n    band = get(opt.footerBand, _constants.Row, null);\n    x2 = layoutHeaders(view, views.rowfooters, groups, ncols, nrows, get(off, 'rowFooter'), max, 0, bbox, 'x2', ncols - 1, ncols, 1, band);\n  } // perform column footer layout\n\n\n  if (views.colfooters) {\n    band = get(opt.footerBand, _constants.Column, null);\n    y2 = layoutHeaders(view, views.colfooters, groups, ncols, ncols, get(off, 'columnFooter'), max, 1, bbox, 'y2', cells - ncols, 1, ncols, band);\n  } // perform row title layout\n\n\n  if (views.rowtitle) {\n    anchor = get(opt.titleAnchor, _constants.Row);\n    offset = get(off, 'rowTitle');\n    offset = anchor === _constants.End ? x2 + offset : x - offset;\n    band = get(opt.titleBand, _constants.Row, 0.5);\n    layoutTitle(view, views.rowtitle, offset, 0, bounds, band);\n  } // perform column title layout\n\n\n  if (views.coltitle) {\n    anchor = get(opt.titleAnchor, _constants.Column);\n    offset = get(off, 'columnTitle');\n    offset = anchor === _constants.End ? y2 + offset : y - offset;\n    band = get(opt.titleBand, _constants.Column, 0.5);\n    layoutTitle(view, views.coltitle, offset, 1, bounds, band);\n  }\n}\n\nfunction boundFlush(item, field) {\n  return field === 'x1' ? item.x || 0 : field === 'y1' ? item.y || 0 : field === 'x2' ? (item.x || 0) + (item.width || 0) : field === 'y2' ? (item.y || 0) + (item.height || 0) : undefined;\n}\n\nfunction boundFull(item, field) {\n  return item.bounds[field];\n} // aggregation functions for grid margin determination\n\n\nfunction min(a, b) {\n  return Math.floor(Math.min(a, b));\n}\n\nfunction max(a, b) {\n  return Math.ceil(Math.max(a, b));\n}\n\nfunction layoutHeaders(view, headers, groups, ncols, limit, offset, agg, isX, bound, bf, start, stride, back, band) {\n  var n = groups.length,\n      init = 0,\n      edge = 0,\n      i,\n      j,\n      k,\n      m,\n      b,\n      h,\n      g,\n      x,\n      y; // if no groups, early exit and return 0\n\n  if (!n) return init; // compute margin\n\n  for (i = start; i < n; i += stride) {\n    if (groups[i]) init = agg(init, bound(groups[i], bf));\n  } // if no headers, return margin calculation\n\n\n  if (!headers.length) return init; // check if number of headers exceeds number of rows or columns\n\n  if (headers.length > limit) {\n    view.warn('Grid headers exceed limit: ' + limit);\n    headers = headers.slice(0, limit);\n  } // apply offset\n\n\n  init += offset; // clear mark bounds for all headers\n\n  for (j = 0, m = headers.length; j < m; ++j) {\n    view.dirty(headers[j]);\n    headers[j].mark.bounds.clear();\n  } // layout each header\n\n\n  for (i = start, j = 0, m = headers.length; j < m; ++j, i += stride) {\n    h = headers[j];\n    b = h.mark.bounds; // search for nearest group to align to\n    // necessary if table has empty cells\n\n    for (k = i; k >= 0 && (g = groups[k]) == null; k -= back); // assign coordinates and update bounds\n\n\n    if (isX) {\n      x = band == null ? g.x : Math.round(g.bounds.x1 + band * g.bounds.width());\n      y = init;\n    } else {\n      x = init;\n      y = band == null ? g.y : Math.round(g.bounds.y1 + band * g.bounds.height());\n    }\n\n    b.union(h.bounds.translate(x - (h.x || 0), y - (h.y || 0)));\n    h.x = x;\n    h.y = y;\n    view.dirty(h); // update current edge of layout bounds\n\n    edge = agg(edge, b[bf]);\n  }\n\n  return edge;\n}\n\nfunction layoutTitle(view, g, offset, isX, bounds, band) {\n  if (!g) return;\n  view.dirty(g); // compute title coordinates\n\n  var x = offset,\n      y = offset;\n  isX ? x = Math.round(bounds.x1 + band * bounds.width()) : y = Math.round(bounds.y1 + band * bounds.height()); // assign coordinates and update bounds\n\n  g.bounds.translate(x - (g.x || 0), y - (g.y || 0));\n  g.mark.bounds.clear().union(g.bounds);\n  g.x = x;\n  g.y = y; // queue title for redraw\n\n  view.dirty(g);\n}\n},{\"../constants\":\"OeAt\",\"./util\":\"A1Jj\",\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"rbUP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.legendParams = legendParams;\nexports.legendLayout = legendLayout;\n\nvar _constants = require(\"../constants\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\n// utility for looking up legend layout configuration\nfunction lookup(config, orient) {\n  const opt = config[orient] || {};\n  return (key, d) => opt[key] != null ? opt[key] : config[key] != null ? config[key] : d;\n} // if legends specify offset directly, use the maximum specified value\n\n\nfunction offsets(legends, value) {\n  var max = -Infinity;\n  legends.forEach(item => {\n    if (item.offset != null) max = Math.max(max, item.offset);\n  });\n  return max > -Infinity ? max : value;\n}\n\nfunction legendParams(g, orient, config, xb, yb, w, h) {\n  const _ = lookup(config, orient),\n        offset = offsets(g, _('offset', 0)),\n        anchor = _('anchor', _constants.Start),\n        mult = anchor === _constants.End ? 1 : anchor === _constants.Middle ? 0.5 : 0;\n\n  const p = {\n    align: _constants.Each,\n    bounds: _('bounds', _constants.Flush),\n    columns: _('direction') === 'vertical' ? 1 : g.length,\n    padding: _('margin', 8),\n    center: _('center'),\n    nodirty: true\n  };\n\n  switch (orient) {\n    case _constants.Left:\n      p.anchor = {\n        x: Math.floor(xb.x1) - offset,\n        column: _constants.End,\n        y: mult * (h || xb.height() + 2 * xb.y1),\n        row: anchor\n      };\n      break;\n\n    case _constants.Right:\n      p.anchor = {\n        x: Math.ceil(xb.x2) + offset,\n        y: mult * (h || xb.height() + 2 * xb.y1),\n        row: anchor\n      };\n      break;\n\n    case _constants.Top:\n      p.anchor = {\n        y: Math.floor(yb.y1) - offset,\n        row: _constants.End,\n        x: mult * (w || yb.width() + 2 * yb.x1),\n        column: anchor\n      };\n      break;\n\n    case _constants.Bottom:\n      p.anchor = {\n        y: Math.ceil(yb.y2) + offset,\n        x: mult * (w || yb.width() + 2 * yb.x1),\n        column: anchor\n      };\n      break;\n\n    case _constants.TopLeft:\n      p.anchor = {\n        x: offset,\n        y: offset\n      };\n      break;\n\n    case _constants.TopRight:\n      p.anchor = {\n        x: w - offset,\n        y: offset,\n        column: _constants.End\n      };\n      break;\n\n    case _constants.BottomLeft:\n      p.anchor = {\n        x: offset,\n        y: h - offset,\n        row: _constants.End\n      };\n      break;\n\n    case _constants.BottomRight:\n      p.anchor = {\n        x: w - offset,\n        y: h - offset,\n        column: _constants.End,\n        row: _constants.End\n      };\n      break;\n  }\n\n  return p;\n}\n\nfunction legendLayout(view, legend) {\n  var item = legend.items[0],\n      datum = item.datum,\n      orient = item.orient,\n      bounds = item.bounds,\n      x = item.x,\n      y = item.y,\n      w,\n      h; // cache current bounds for later comparison\n\n  item._bounds ? item._bounds.clear().union(bounds) : item._bounds = bounds.clone();\n  bounds.clear(); // adjust legend to accommodate padding and title\n\n  legendGroupLayout(view, item, item.items[0].items[0]); // aggregate bounds to determine size, and include origin\n\n  bounds = legendBounds(item, bounds);\n  w = 2 * item.padding;\n  h = 2 * item.padding;\n\n  if (!bounds.empty()) {\n    w = Math.ceil(bounds.width() + w);\n    h = Math.ceil(bounds.height() + h);\n  }\n\n  if (datum.type === _constants.Symbols) {\n    legendEntryLayout(item.items[0].items[0].items[0].items);\n  }\n\n  if (orient !== _constants.None) {\n    item.x = x = 0;\n    item.y = y = 0;\n  }\n\n  item.width = w;\n  item.height = h;\n  (0, _vegaScenegraph.boundStroke)(bounds.set(x, y, x + w, y + h), item);\n  item.mark.bounds.clear().union(bounds);\n  return item;\n}\n\nfunction legendBounds(item, b) {\n  // aggregate item bounds\n  item.items.forEach(_ => b.union(_.bounds)); // anchor to legend origin\n\n  b.x1 = item.padding;\n  b.y1 = item.padding;\n  return b;\n}\n\nfunction legendGroupLayout(view, item, entry) {\n  var pad = item.padding,\n      ex = pad - entry.x,\n      ey = pad - entry.y;\n\n  if (!item.datum.title) {\n    if (ex || ey) translate(view, entry, ex, ey);\n  } else {\n    var title = item.items[1].items[0],\n        anchor = title.anchor,\n        tpad = item.titlePadding || 0,\n        tx = pad - title.x,\n        ty = pad - title.y;\n\n    switch (title.orient) {\n      case _constants.Left:\n        ex += Math.ceil(title.bounds.width()) + tpad;\n        break;\n\n      case _constants.Right:\n      case _constants.Bottom:\n        break;\n\n      default:\n        ey += title.bounds.height() + tpad;\n    }\n\n    if (ex || ey) translate(view, entry, ex, ey);\n\n    switch (title.orient) {\n      case _constants.Left:\n        ty += legendTitleOffset(item, entry, title, anchor, 1, 1);\n        break;\n\n      case _constants.Right:\n        tx += legendTitleOffset(item, entry, title, _constants.End, 0, 0) + tpad;\n        ty += legendTitleOffset(item, entry, title, anchor, 1, 1);\n        break;\n\n      case _constants.Bottom:\n        tx += legendTitleOffset(item, entry, title, anchor, 0, 0);\n        ty += legendTitleOffset(item, entry, title, _constants.End, -1, 0, 1) + tpad;\n        break;\n\n      default:\n        tx += legendTitleOffset(item, entry, title, anchor, 0, 0);\n    }\n\n    if (tx || ty) translate(view, title, tx, ty); // translate legend if title pushes into negative coordinates\n\n    if ((tx = Math.round(title.bounds.x1 - pad)) < 0) {\n      translate(view, entry, -tx, 0);\n      translate(view, title, -tx, 0);\n    }\n  }\n}\n\nfunction legendTitleOffset(item, entry, title, anchor, y, lr, noBar) {\n  const grad = item.datum.type !== 'symbol',\n        vgrad = title.datum.vgrad,\n        e = grad && (lr || !vgrad) && !noBar ? entry.items[0] : entry,\n        s = e.bounds[y ? 'y2' : 'x2'] - item.padding,\n        u = vgrad && lr ? s : 0,\n        v = vgrad && lr ? 0 : s,\n        o = y <= 0 ? 0 : (0, _vegaScenegraph.multiLineOffset)(title);\n  return Math.round(anchor === _constants.Start ? u : anchor === _constants.End ? v - o : 0.5 * (s - o));\n}\n\nfunction translate(view, item, dx, dy) {\n  item.x += dx;\n  item.y += dy;\n  item.bounds.translate(dx, dy);\n  item.mark.bounds.translate(dx, dy);\n  view.dirty(item);\n}\n\nfunction legendEntryLayout(entries) {\n  // get max widths for each column\n  var widths = entries.reduce(function (w, g) {\n    w[g.column] = Math.max(g.bounds.x2 - g.x, w[g.column] || 0);\n    return w;\n  }, {}); // set dimensions of legend entry groups\n\n  entries.forEach(function (g) {\n    g.width = widths[g.column];\n    g.height = g.bounds.y2 - g.y;\n  });\n}\n},{\"../constants\":\"OeAt\",\"vega-scenegraph\":\"AgKg\"}],\"Mnvo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.titleLayout = titleLayout;\n\nvar _constants = require(\"../constants\");\n\nvar _util = require(\"./util\");\n\nfunction titleLayout(view, mark, width, height, viewBounds) {\n  var group = mark.items[0],\n      frame = group.frame,\n      orient = group.orient,\n      anchor = group.anchor,\n      offset = group.offset,\n      padding = group.padding,\n      title = group.items[0].items[0],\n      subtitle = group.items[1] && group.items[1].items[0],\n      end = orient === _constants.Left || orient === _constants.Right ? height : width,\n      start = 0,\n      x = 0,\n      y = 0,\n      sx = 0,\n      sy = 0,\n      pos;\n\n  if (frame !== _constants.Group) {\n    orient === _constants.Left ? (start = viewBounds.y2, end = viewBounds.y1) : orient === _constants.Right ? (start = viewBounds.y1, end = viewBounds.y2) : (start = viewBounds.x1, end = viewBounds.x2);\n  } else if (orient === _constants.Left) {\n    start = height, end = 0;\n  }\n\n  pos = anchor === _constants.Start ? start : anchor === _constants.End ? end : (start + end) / 2;\n\n  if (subtitle && subtitle.text) {\n    // position subtitle\n    switch (orient) {\n      case _constants.Top:\n      case _constants.Bottom:\n        sy = title.bounds.height() + padding;\n        break;\n\n      case _constants.Left:\n        sx = title.bounds.width() + padding;\n        break;\n\n      case _constants.Right:\n        sx = -title.bounds.width() - padding;\n        break;\n    }\n\n    _util.tempBounds.clear().union(subtitle.bounds);\n\n    _util.tempBounds.translate(sx - (subtitle.x || 0), sy - (subtitle.y || 0));\n\n    if ((0, _util.set)(subtitle, 'x', sx) | (0, _util.set)(subtitle, 'y', sy)) {\n      view.dirty(subtitle);\n      subtitle.bounds.clear().union(_util.tempBounds);\n      subtitle.mark.bounds.clear().union(_util.tempBounds);\n      view.dirty(subtitle);\n    }\n\n    _util.tempBounds.clear().union(subtitle.bounds);\n  } else {\n    _util.tempBounds.clear();\n  }\n\n  _util.tempBounds.union(title.bounds); // position title group\n\n\n  switch (orient) {\n    case _constants.Top:\n      x = pos;\n      y = viewBounds.y1 - _util.tempBounds.height() - offset;\n      break;\n\n    case _constants.Left:\n      x = viewBounds.x1 - _util.tempBounds.width() - offset;\n      y = pos;\n      break;\n\n    case _constants.Right:\n      x = viewBounds.x2 + _util.tempBounds.width() + offset;\n      y = pos;\n      break;\n\n    case _constants.Bottom:\n      x = pos;\n      y = viewBounds.y2 + offset;\n      break;\n\n    default:\n      x = group.x;\n      y = group.y;\n  }\n\n  if ((0, _util.set)(group, 'x', x) | (0, _util.set)(group, 'y', y)) {\n    _util.tempBounds.translate(x, y);\n\n    view.dirty(group);\n    group.bounds.clear().union(_util.tempBounds);\n    mark.bounds.clear().union(_util.tempBounds);\n    view.dirty(group);\n  }\n\n  return group.bounds;\n}\n},{\"../constants\":\"OeAt\",\"./util\":\"A1Jj\"}],\"lCIU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ViewLayout;\n\nvar _constants = require(\"./constants\");\n\nvar _axis = require(\"./layout/axis\");\n\nvar _grid = require(\"./layout/grid\");\n\nvar _legend = require(\"./layout/legend\");\n\nvar _title = require(\"./layout/title\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Layout view elements such as axes and legends.\n * Also performs size adjustments.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.mark - Scenegraph mark of groups to layout.\n */\nfunction ViewLayout(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(ViewLayout, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  // TODO incremental update, output?\n  var view = pulse.dataflow;\n\n  _.mark.items.forEach(function (group) {\n    if (_.layout) (0, _grid.trellisLayout)(view, group, _.layout);\n    layoutGroup(view, group, _);\n  });\n\n  if (_.modified()) pulse.reflow();\n  return pulse;\n};\n\nfunction layoutGroup(view, group, _) {\n  var items = group.items,\n      width = Math.max(0, group.width || 0),\n      height = Math.max(0, group.height || 0),\n      viewBounds = new _vegaScenegraph.Bounds().set(0, 0, width, height),\n      xBounds = viewBounds.clone(),\n      yBounds = viewBounds.clone(),\n      legends = [],\n      title,\n      mark,\n      orient,\n      b,\n      i,\n      n; // layout axes, gather legends, collect bounds\n\n  for (i = 0, n = items.length; i < n; ++i) {\n    mark = items[i];\n\n    switch (mark.role) {\n      case _constants.AxisRole:\n        b = (0, _axis.isYAxis)(mark) ? xBounds : yBounds;\n        b.union((0, _axis.axisLayout)(view, mark, width, height));\n        break;\n\n      case _constants.TitleRole:\n        title = mark;\n        break;\n\n      case _constants.LegendRole:\n        legends.push((0, _legend.legendLayout)(view, mark));\n        break;\n\n      case _constants.FrameRole:\n      case _constants.ScopeRole:\n      case _constants.RowHeader:\n      case _constants.RowFooter:\n      case _constants.RowTitle:\n      case _constants.ColHeader:\n      case _constants.ColFooter:\n      case _constants.ColTitle:\n        xBounds.union(mark.bounds);\n        yBounds.union(mark.bounds);\n        break;\n\n      default:\n        viewBounds.union(mark.bounds);\n    }\n  } // layout legends, adjust viewBounds\n\n\n  if (legends.length) {\n    // group legends by orient\n    const l = {};\n    legends.forEach(item => {\n      orient = item.orient || _constants.Right;\n      if (orient !== _constants.None) (l[orient] || (l[orient] = [])).push(item);\n    }); // perform grid layout for each orient group\n\n    for (let orient in l) {\n      const g = l[orient];\n      (0, _grid.gridLayout)(view, g, (0, _legend.legendParams)(g, orient, _.legends, xBounds, yBounds, width, height));\n    } // update view bounds\n\n\n    legends.forEach(item => {\n      const b = item.bounds;\n\n      if (!b.equals(item._bounds)) {\n        item.bounds = item._bounds;\n        view.dirty(item); // dirty previous location\n\n        item.bounds = b;\n        view.dirty(item);\n      }\n\n      if (_.autosize && _.autosize.type === _constants.Fit) {\n        // For autosize fit, incorporate the orthogonal dimension only.\n        // Legends that overrun the chart area will then be clipped;\n        // otherwise the chart area gets reduced to nothing!\n        switch (item.orient) {\n          case _constants.Left:\n          case _constants.Right:\n            viewBounds.add(b.x1, 0).add(b.x2, 0);\n            break;\n\n          case _constants.Top:\n          case _constants.Bottom:\n            viewBounds.add(0, b.y1).add(0, b.y2);\n        }\n      } else {\n        viewBounds.union(b);\n      }\n    });\n  } // combine bounding boxes\n\n\n  viewBounds.union(xBounds).union(yBounds); // layout title, adjust bounds\n\n  if (title) {\n    viewBounds.union((0, _title.titleLayout)(view, title, width, height, viewBounds));\n  } // override aggregated view bounds if content is clipped\n\n\n  if (group.clip) {\n    viewBounds.set(0, 0, group.width || 0, group.height || 0);\n  } // perform size adjustment\n\n\n  viewSizeLayout(view, group, viewBounds, _);\n}\n\nfunction viewSizeLayout(view, group, viewBounds, _) {\n  var auto = _.autosize || {},\n      type = auto.type,\n      viewWidth = view._width,\n      viewHeight = view._height,\n      padding = view.padding();\n  if (view._autosize < 1 || !type) return;\n  var width = Math.max(0, group.width || 0),\n      left = Math.max(0, Math.ceil(-viewBounds.x1)),\n      right = Math.max(0, Math.ceil(viewBounds.x2 - width)),\n      height = Math.max(0, group.height || 0),\n      top = Math.max(0, Math.ceil(-viewBounds.y1)),\n      bottom = Math.max(0, Math.ceil(viewBounds.y2 - height));\n\n  if (auto.contains === _constants.Padding) {\n    viewWidth -= padding.left + padding.right;\n    viewHeight -= padding.top + padding.bottom;\n  }\n\n  if (type === _constants.None) {\n    left = 0;\n    top = 0;\n    width = viewWidth;\n    height = viewHeight;\n  } else if (type === _constants.Fit) {\n    width = Math.max(0, viewWidth - left - right);\n    height = Math.max(0, viewHeight - top - bottom);\n  } else if (type === _constants.FitX) {\n    width = Math.max(0, viewWidth - left - right);\n    viewHeight = height + top + bottom;\n  } else if (type === _constants.FitY) {\n    viewWidth = width + left + right;\n    height = Math.max(0, viewHeight - top - bottom);\n  } else if (type === _constants.Pad) {\n    viewWidth = width + left + right;\n    viewHeight = height + top + bottom;\n  }\n\n  view._resizeView(viewWidth, viewHeight, width, height, [left, top], auto.resize);\n}\n},{\"./constants\":\"OeAt\",\"./layout/axis\":\"CoCs\",\"./layout/grid\":\"PNHc\",\"./layout/legend\":\"rbUP\",\"./layout/title\":\"Mnvo\",\"vega-dataflow\":\"luN0\",\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"VlWy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"bound\", {\n  enumerable: true,\n  get: function () {\n    return _Bound.default;\n  }\n});\nObject.defineProperty(exports, \"identifier\", {\n  enumerable: true,\n  get: function () {\n    return _Identifier.default;\n  }\n});\nObject.defineProperty(exports, \"mark\", {\n  enumerable: true,\n  get: function () {\n    return _Mark.default;\n  }\n});\nObject.defineProperty(exports, \"overlap\", {\n  enumerable: true,\n  get: function () {\n    return _Overlap.default;\n  }\n});\nObject.defineProperty(exports, \"render\", {\n  enumerable: true,\n  get: function () {\n    return _Render.default;\n  }\n});\nObject.defineProperty(exports, \"viewlayout\", {\n  enumerable: true,\n  get: function () {\n    return _ViewLayout.default;\n  }\n});\n\nvar _Bound = _interopRequireDefault(require(\"./src/Bound\"));\n\nvar _Identifier = _interopRequireDefault(require(\"./src/Identifier\"));\n\nvar _Mark = _interopRequireDefault(require(\"./src/Mark\"));\n\nvar _Overlap = _interopRequireDefault(require(\"./src/Overlap\"));\n\nvar _Render = _interopRequireDefault(require(\"./src/Render\"));\n\nvar _ViewLayout = _interopRequireDefault(require(\"./src/ViewLayout\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Bound\":\"L9Om\",\"./src/Identifier\":\"cGKX\",\"./src/Mark\":\"oYKW\",\"./src/Overlap\":\"kKmz\",\"./src/Render\":\"DL8R\",\"./src/ViewLayout\":\"lCIU\"}],\"pQB2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(count, paddingInner, paddingOuter) {\n  var space = count - paddingInner + paddingOuter * 2;\n  return count ? space > 0 ? space : 1 : 0;\n}\n},{}],\"IeaR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isValidScaleType = isValidScaleType;\nexports.isTemporal = isTemporal;\nexports.isBinned = isBinned;\nexports.isQuantile = isQuantile;\nexports.isSequential = isSequential;\nexports.isDiverging = isDiverging;\nexports.isInterpolating = isInterpolating;\nexports.isLogarithmic = isLogarithmic;\nexports.isContinuous = isContinuous;\nexports.isDiscrete = isDiscrete;\nexports.isDiscretizing = isDiscretizing;\nexports.BinOrdinal = exports.Band = exports.Point = exports.Ordinal = exports.Threshold = exports.Quantize = exports.Quantile = exports.Diverging = exports.Sequential = exports.UTC = exports.Time = exports.Symlog = exports.Sqrt = exports.Pow = exports.Log = exports.Linear = exports.Identity = void 0;\nconst Identity = 'identity';\nexports.Identity = Identity;\nconst Linear = 'linear';\nexports.Linear = Linear;\nconst Log = 'log';\nexports.Log = Log;\nconst Pow = 'pow';\nexports.Pow = Pow;\nconst Sqrt = 'sqrt';\nexports.Sqrt = Sqrt;\nconst Symlog = 'symlog';\nexports.Symlog = Symlog;\nconst Time = 'time';\nexports.Time = Time;\nconst UTC = 'utc';\nexports.UTC = UTC;\nconst Sequential = 'sequential';\nexports.Sequential = Sequential;\nconst Diverging = 'diverging';\nexports.Diverging = Diverging;\nconst Quantile = 'quantile';\nexports.Quantile = Quantile;\nconst Quantize = 'quantize';\nexports.Quantize = Quantize;\nconst Threshold = 'threshold';\nexports.Threshold = Threshold;\nconst Ordinal = 'ordinal';\nexports.Ordinal = Ordinal;\nconst Point = 'point';\nexports.Point = Point;\nconst Band = 'band';\nexports.Band = Band;\nconst BinOrdinal = 'bin-ordinal';\nexports.BinOrdinal = BinOrdinal;\n\nfunction isValidScaleType(type) {\n  switch (type) {\n    case Identity:\n    case Linear:\n    case Log:\n    case Pow:\n    case Sqrt:\n    case Symlog:\n    case Time:\n    case UTC:\n    case Sequential:\n    case Quantile:\n    case Quantize:\n    case Threshold:\n    case Ordinal:\n    case Point:\n    case Band:\n    case BinOrdinal:\n      return true;\n  }\n\n  return false;\n}\n\nfunction isTemporal(key) {\n  return key === Time || key === UTC;\n}\n\nfunction isBinned(key) {\n  return key === BinOrdinal;\n}\n\nfunction isQuantile(key) {\n  return key === Quantile;\n}\n\nfunction isSequential(key) {\n  return key && key.startsWith(Sequential);\n}\n\nfunction isDiverging(key) {\n  return key && key.startsWith(Diverging);\n}\n\nfunction isInterpolating(key) {\n  return isSequential(key) || isDiverging(key);\n}\n\nfunction isLogarithmic(key) {\n  return key === Log || key.endsWith('-log');\n}\n\nfunction isContinuous(key) {\n  switch (key) {\n    case Linear:\n    case Log:\n    case Pow:\n    case Sqrt:\n    case Symlog:\n    case Time:\n    case UTC:\n    case Sequential:\n      return true;\n  }\n\n  return false;\n}\n\nfunction isDiscrete(key) {\n  return key === BinOrdinal || key === Ordinal || key === Band || key === Point;\n}\n\nfunction isDiscretizing(key) {\n  return key === BinOrdinal || key === Quantile || key === Quantize || key === Threshold;\n}\n},{}],\"aszk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(scale) {\n  return function (_) {\n    var lo = _[0],\n        hi = _[1],\n        t;\n\n    if (hi < lo) {\n      t = lo;\n      lo = hi;\n      hi = t;\n    }\n\n    return [scale.invert(lo), scale.invert(hi)];\n  };\n}\n},{}],\"iE4m\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(scale) {\n  return function (_) {\n    var range = scale.range(),\n        lo = _[0],\n        hi = _[1],\n        min = -1,\n        max,\n        t,\n        i,\n        n;\n\n    if (hi < lo) {\n      t = lo;\n      lo = hi;\n      hi = t;\n    }\n\n    for (i = 0, n = range.length; i < n; ++i) {\n      if (range[i] >= lo && range[i] <= hi) {\n        if (min < 0) min = i;\n        max = i;\n      }\n    }\n\n    if (min < 0) return undefined;\n    lo = scale.invertExtent(range[min]);\n    hi = scale.invertExtent(range[max]);\n    return [lo[0] === undefined ? lo[1] : lo[0], hi[1] === undefined ? hi[0] : hi[1]];\n  };\n}\n},{}],\"buZa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initRange = initRange;\nexports.initInterpolator = initInterpolator;\n\nfunction initRange(domain, range) {\n  switch (arguments.length) {\n    case 0:\n      break;\n\n    case 1:\n      this.range(domain);\n      break;\n\n    default:\n      this.range(range).domain(domain);\n      break;\n  }\n\n  return this;\n}\n\nfunction initInterpolator(domain, interpolator) {\n  switch (arguments.length) {\n    case 0:\n      break;\n\n    case 1:\n      {\n        if (typeof domain === \"function\") this.interpolator(domain);else this.range(domain);\n        break;\n      }\n\n    default:\n      {\n        this.domain(domain);\n        if (typeof interpolator === \"function\") this.interpolator(interpolator);else this.range(interpolator);\n        break;\n      }\n  }\n\n  return this;\n}\n},{}],\"GjLX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ordinal;\nexports.implicit = void 0;\n\nvar _init = require(\"./init.js\");\n\nconst implicit = Symbol(\"implicit\");\nexports.implicit = implicit;\n\nfunction ordinal() {\n  var index = new Map(),\n      domain = [],\n      range = [],\n      unknown = implicit;\n\n  function scale(d) {\n    var key = d + \"\",\n        i = index.get(key);\n\n    if (!i) {\n      if (unknown !== implicit) return unknown;\n      index.set(key, i = domain.push(d));\n    }\n\n    return range[(i - 1) % range.length];\n  }\n\n  scale.domain = function (_) {\n    if (!arguments.length) return domain.slice();\n    domain = [], index = new Map();\n\n    for (const value of _) {\n      const key = value + \"\";\n      if (index.has(key)) continue;\n      index.set(key, domain.push(value));\n    }\n\n    return scale;\n  };\n\n  scale.range = function (_) {\n    return arguments.length ? (range = Array.from(_), scale) : range.slice();\n  };\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  scale.copy = function () {\n    return ordinal(domain, range).unknown(unknown);\n  };\n\n  _init.initRange.apply(scale, arguments);\n\n  return scale;\n}\n},{\"./init.js\":\"buZa\"}],\"BAgl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = band;\nexports.point = point;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _init = require(\"./init.js\");\n\nvar _ordinal = _interopRequireDefault(require(\"./ordinal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction band() {\n  var scale = (0, _ordinal.default)().unknown(undefined),\n      domain = scale.domain,\n      ordinalRange = scale.range,\n      r0 = 0,\n      r1 = 1,\n      step,\n      bandwidth,\n      round = false,\n      paddingInner = 0,\n      paddingOuter = 0,\n      align = 0.5;\n  delete scale.unknown;\n\n  function rescale() {\n    var n = domain().length,\n        reverse = r1 < r0,\n        start = reverse ? r1 : r0,\n        stop = reverse ? r0 : r1;\n    step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);\n    if (round) step = Math.floor(step);\n    start += (stop - start - step * (n - paddingInner)) * align;\n    bandwidth = step * (1 - paddingInner);\n    if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);\n    var values = (0, _d3Array.range)(n).map(function (i) {\n      return start + step * i;\n    });\n    return ordinalRange(reverse ? values.reverse() : values);\n  }\n\n  scale.domain = function (_) {\n    return arguments.length ? (domain(_), rescale()) : domain();\n  };\n\n  scale.range = function (_) {\n    return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1];\n  };\n\n  scale.rangeRound = function (_) {\n    return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale();\n  };\n\n  scale.bandwidth = function () {\n    return bandwidth;\n  };\n\n  scale.step = function () {\n    return step;\n  };\n\n  scale.round = function (_) {\n    return arguments.length ? (round = !!_, rescale()) : round;\n  };\n\n  scale.padding = function (_) {\n    return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;\n  };\n\n  scale.paddingInner = function (_) {\n    return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;\n  };\n\n  scale.paddingOuter = function (_) {\n    return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;\n  };\n\n  scale.align = function (_) {\n    return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n  };\n\n  scale.copy = function () {\n    return band(domain(), [r0, r1]).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n  };\n\n  return _init.initRange.apply(rescale(), arguments);\n}\n\nfunction pointish(scale) {\n  var copy = scale.copy;\n  scale.padding = scale.paddingOuter;\n  delete scale.paddingInner;\n  delete scale.paddingOuter;\n\n  scale.copy = function () {\n    return pointish(copy());\n  };\n\n  return scale;\n}\n\nfunction point() {\n  return pointish(band.apply(null, arguments).paddingInner(1));\n}\n},{\"d3-array\":\"K0bd\",\"./init.js\":\"buZa\",\"./ordinal.js\":\"GjLX\"}],\"fV2I\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.extend = extend;\n\nfunction _default(constructor, factory, prototype) {\n  constructor.prototype = factory.prototype = prototype;\n  prototype.constructor = constructor;\n}\n\nfunction extend(parent, definition) {\n  var prototype = Object.create(parent.prototype);\n\n  for (var key in definition) prototype[key] = definition[key];\n\n  return prototype;\n}\n},{}],\"LIaf\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Color = Color;\nexports.default = color;\nexports.rgbConvert = rgbConvert;\nexports.rgb = rgb;\nexports.Rgb = Rgb;\nexports.hslConvert = hslConvert;\nexports.hsl = hsl;\nexports.brighter = exports.darker = void 0;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction Color() {}\n\nvar darker = 0.7;\nexports.darker = darker;\nvar brighter = 1 / darker;\nexports.brighter = brighter;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n    reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n    reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n    reHex = /^#([0-9a-f]{3,8})$/,\n    reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n    reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n    reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n    reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n    reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n    reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\nvar named = {\n  aliceblue: 0xf0f8ff,\n  antiquewhite: 0xfaebd7,\n  aqua: 0x00ffff,\n  aquamarine: 0x7fffd4,\n  azure: 0xf0ffff,\n  beige: 0xf5f5dc,\n  bisque: 0xffe4c4,\n  black: 0x000000,\n  blanchedalmond: 0xffebcd,\n  blue: 0x0000ff,\n  blueviolet: 0x8a2be2,\n  brown: 0xa52a2a,\n  burlywood: 0xdeb887,\n  cadetblue: 0x5f9ea0,\n  chartreuse: 0x7fff00,\n  chocolate: 0xd2691e,\n  coral: 0xff7f50,\n  cornflowerblue: 0x6495ed,\n  cornsilk: 0xfff8dc,\n  crimson: 0xdc143c,\n  cyan: 0x00ffff,\n  darkblue: 0x00008b,\n  darkcyan: 0x008b8b,\n  darkgoldenrod: 0xb8860b,\n  darkgray: 0xa9a9a9,\n  darkgreen: 0x006400,\n  darkgrey: 0xa9a9a9,\n  darkkhaki: 0xbdb76b,\n  darkmagenta: 0x8b008b,\n  darkolivegreen: 0x556b2f,\n  darkorange: 0xff8c00,\n  darkorchid: 0x9932cc,\n  darkred: 0x8b0000,\n  darksalmon: 0xe9967a,\n  darkseagreen: 0x8fbc8f,\n  darkslateblue: 0x483d8b,\n  darkslategray: 0x2f4f4f,\n  darkslategrey: 0x2f4f4f,\n  darkturquoise: 0x00ced1,\n  darkviolet: 0x9400d3,\n  deeppink: 0xff1493,\n  deepskyblue: 0x00bfff,\n  dimgray: 0x696969,\n  dimgrey: 0x696969,\n  dodgerblue: 0x1e90ff,\n  firebrick: 0xb22222,\n  floralwhite: 0xfffaf0,\n  forestgreen: 0x228b22,\n  fuchsia: 0xff00ff,\n  gainsboro: 0xdcdcdc,\n  ghostwhite: 0xf8f8ff,\n  gold: 0xffd700,\n  goldenrod: 0xdaa520,\n  gray: 0x808080,\n  green: 0x008000,\n  greenyellow: 0xadff2f,\n  grey: 0x808080,\n  honeydew: 0xf0fff0,\n  hotpink: 0xff69b4,\n  indianred: 0xcd5c5c,\n  indigo: 0x4b0082,\n  ivory: 0xfffff0,\n  khaki: 0xf0e68c,\n  lavender: 0xe6e6fa,\n  lavenderblush: 0xfff0f5,\n  lawngreen: 0x7cfc00,\n  lemonchiffon: 0xfffacd,\n  lightblue: 0xadd8e6,\n  lightcoral: 0xf08080,\n  lightcyan: 0xe0ffff,\n  lightgoldenrodyellow: 0xfafad2,\n  lightgray: 0xd3d3d3,\n  lightgreen: 0x90ee90,\n  lightgrey: 0xd3d3d3,\n  lightpink: 0xffb6c1,\n  lightsalmon: 0xffa07a,\n  lightseagreen: 0x20b2aa,\n  lightskyblue: 0x87cefa,\n  lightslategray: 0x778899,\n  lightslategrey: 0x778899,\n  lightsteelblue: 0xb0c4de,\n  lightyellow: 0xffffe0,\n  lime: 0x00ff00,\n  limegreen: 0x32cd32,\n  linen: 0xfaf0e6,\n  magenta: 0xff00ff,\n  maroon: 0x800000,\n  mediumaquamarine: 0x66cdaa,\n  mediumblue: 0x0000cd,\n  mediumorchid: 0xba55d3,\n  mediumpurple: 0x9370db,\n  mediumseagreen: 0x3cb371,\n  mediumslateblue: 0x7b68ee,\n  mediumspringgreen: 0x00fa9a,\n  mediumturquoise: 0x48d1cc,\n  mediumvioletred: 0xc71585,\n  midnightblue: 0x191970,\n  mintcream: 0xf5fffa,\n  mistyrose: 0xffe4e1,\n  moccasin: 0xffe4b5,\n  navajowhite: 0xffdead,\n  navy: 0x000080,\n  oldlace: 0xfdf5e6,\n  olive: 0x808000,\n  olivedrab: 0x6b8e23,\n  orange: 0xffa500,\n  orangered: 0xff4500,\n  orchid: 0xda70d6,\n  palegoldenrod: 0xeee8aa,\n  palegreen: 0x98fb98,\n  paleturquoise: 0xafeeee,\n  palevioletred: 0xdb7093,\n  papayawhip: 0xffefd5,\n  peachpuff: 0xffdab9,\n  peru: 0xcd853f,\n  pink: 0xffc0cb,\n  plum: 0xdda0dd,\n  powderblue: 0xb0e0e6,\n  purple: 0x800080,\n  rebeccapurple: 0x663399,\n  red: 0xff0000,\n  rosybrown: 0xbc8f8f,\n  royalblue: 0x4169e1,\n  saddlebrown: 0x8b4513,\n  salmon: 0xfa8072,\n  sandybrown: 0xf4a460,\n  seagreen: 0x2e8b57,\n  seashell: 0xfff5ee,\n  sienna: 0xa0522d,\n  silver: 0xc0c0c0,\n  skyblue: 0x87ceeb,\n  slateblue: 0x6a5acd,\n  slategray: 0x708090,\n  slategrey: 0x708090,\n  snow: 0xfffafa,\n  springgreen: 0x00ff7f,\n  steelblue: 0x4682b4,\n  tan: 0xd2b48c,\n  teal: 0x008080,\n  thistle: 0xd8bfd8,\n  tomato: 0xff6347,\n  turquoise: 0x40e0d0,\n  violet: 0xee82ee,\n  wheat: 0xf5deb3,\n  white: 0xffffff,\n  whitesmoke: 0xf5f5f5,\n  yellow: 0xffff00,\n  yellowgreen: 0x9acd32\n};\n(0, _define.default)(Color, color, {\n  copy: function (channels) {\n    return Object.assign(new this.constructor(), this, channels);\n  },\n  displayable: function () {\n    return this.rgb().displayable();\n  },\n  hex: color_formatHex,\n  // Deprecated! Use color.formatHex.\n  formatHex: color_formatHex,\n  formatHsl: color_formatHsl,\n  formatRgb: color_formatRgb,\n  toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n  return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n  return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n  return this.rgb().formatRgb();\n}\n\nfunction color(format) {\n  var m, l;\n  format = (format + \"\").trim().toLowerCase();\n  return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n  : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n  : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n  : l === 4 ? new Rgb(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n  : null // invalid hex\n  ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n  : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n  : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n  : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n  : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n  : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n  : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n  : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\n\nfunction rgbn(n) {\n  return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n  if (a <= 0) r = g = b = NaN;\n  return new Rgb(r, g, b, a);\n}\n\nfunction rgbConvert(o) {\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Rgb();\n  o = o.rgb();\n  return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nfunction rgb(r, g, b, opacity) {\n  return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nfunction Rgb(r, g, b, opacity) {\n  this.r = +r;\n  this.g = +g;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Rgb, rgb, (0, _define.extend)(Color, {\n  brighter: function (k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  rgb: function () {\n    return this;\n  },\n  displayable: function () {\n    return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n  },\n  hex: rgb_formatHex,\n  // Deprecated! Use color.formatHex.\n  formatHex: rgb_formatHex,\n  formatRgb: rgb_formatRgb,\n  toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n  return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n  var a = this.opacity;\n  a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n  return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n  value = Math.max(0, Math.min(255, Math.round(value) || 0));\n  return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n  if (a <= 0) h = s = l = NaN;else if (l <= 0 || l >= 1) h = s = NaN;else if (s <= 0) h = NaN;\n  return new Hsl(h, s, l, a);\n}\n\nfunction hslConvert(o) {\n  if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Hsl();\n  if (o instanceof Hsl) return o;\n  o = o.rgb();\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      h = NaN,\n      s = max - min,\n      l = (max + min) / 2;\n\n  if (s) {\n    if (r === max) h = (g - b) / s + (g < b) * 6;else if (g === max) h = (b - r) / s + 2;else h = (r - g) / s + 4;\n    s /= l < 0.5 ? max + min : 2 - max - min;\n    h *= 60;\n  } else {\n    s = l > 0 && l < 1 ? 0 : h;\n  }\n\n  return new Hsl(h, s, l, o.opacity);\n}\n\nfunction hsl(h, s, l, opacity) {\n  return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Hsl, hsl, (0, _define.extend)(Color, {\n  brighter: function (k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function () {\n    var h = this.h % 360 + (this.h < 0) * 360,\n        s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n        l = this.l,\n        m2 = l + (l < 0.5 ? l : 1 - l) * s,\n        m1 = 2 * l - m2;\n    return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n  },\n  displayable: function () {\n    return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n  },\n  formatHsl: function () {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n  }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */\n\nfunction hsl2rgb(h, m1, m2) {\n  return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n},{\"./define.js\":\"fV2I\"}],\"XzID\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.rad2deg = exports.deg2rad = void 0;\nvar deg2rad = Math.PI / 180;\nexports.deg2rad = deg2rad;\nvar rad2deg = 180 / Math.PI;\nexports.rad2deg = rad2deg;\n},{}],\"f7Av\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.gray = gray;\nexports.default = lab;\nexports.Lab = Lab;\nexports.lch = lch;\nexports.hcl = hcl;\nexports.Hcl = Hcl;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nvar _color = require(\"./color.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n    Xn = 0.96422,\n    Yn = 1,\n    Zn = 0.82521,\n    t0 = 4 / 29,\n    t1 = 6 / 29,\n    t2 = 3 * t1 * t1,\n    t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n  if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n  if (o instanceof Hcl) return hcl2lab(o);\n  if (!(o instanceof _color.Rgb)) o = (0, _color.rgbConvert)(o);\n  var r = rgb2lrgb(o.r),\n      g = rgb2lrgb(o.g),\n      b = rgb2lrgb(o.b),\n      y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn),\n      x,\n      z;\n  if (r === g && g === b) x = z = y;else {\n    x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n    z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n  }\n  return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nfunction gray(l, opacity) {\n  return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nfunction lab(l, a, b, opacity) {\n  return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nfunction Lab(l, a, b, opacity) {\n  this.l = +l;\n  this.a = +a;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Lab, lab, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n  },\n  darker: function (k) {\n    return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n  },\n  rgb: function () {\n    var y = (this.l + 16) / 116,\n        x = isNaN(this.a) ? y : y + this.a / 500,\n        z = isNaN(this.b) ? y : y - this.b / 200;\n    x = Xn * lab2xyz(x);\n    y = Yn * lab2xyz(y);\n    z = Zn * lab2xyz(z);\n    return new _color.Rgb(lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity);\n  }\n}));\n\nfunction xyz2lab(t) {\n  return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n  return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n  return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n  return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n  if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n  if (!(o instanceof Lab)) o = labConvert(o);\n  if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n\n  var h = Math.atan2(o.b, o.a) * _math.rad2deg;\n\n  return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nfunction lch(l, c, h, opacity) {\n  return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction hcl(h, c, l, opacity) {\n  return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hcl(h, c, l, opacity) {\n  this.h = +h;\n  this.c = +c;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n  if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n  var h = o.h * _math.deg2rad;\n  return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\n(0, _define.default)(Hcl, hcl, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n  },\n  darker: function (k) {\n    return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n  },\n  rgb: function () {\n    return hcl2lab(this).rgb();\n  }\n}));\n},{\"./define.js\":\"fV2I\",\"./color.js\":\"LIaf\",\"./math.js\":\"XzID\"}],\"CMX9\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cubehelix;\nexports.Cubehelix = Cubehelix;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nvar _color = require(\"./color.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar A = -0.14861,\n    B = +1.78277,\n    C = -0.29227,\n    D = -0.90649,\n    E = +1.97294,\n    ED = E * D,\n    EB = E * B,\n    BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n  if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof _color.Rgb)) o = (0, _color.rgbConvert)(o);\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n      bl = b - l,\n      k = (E * (g - l) - C * bl) / D,\n      s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)),\n      // NaN if l=0 or l=1\n  h = s ? Math.atan2(k, bl) * _math.rad2deg - 120 : NaN;\n  return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nfunction cubehelix(h, s, l, opacity) {\n  return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Cubehelix(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Cubehelix, cubehelix, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    k = k == null ? _color.brighter : Math.pow(_color.brighter, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? _color.darker : Math.pow(_color.darker, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function () {\n    var h = isNaN(this.h) ? 0 : (this.h + 120) * _math.deg2rad,\n        l = +this.l,\n        a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n        cosh = Math.cos(h),\n        sinh = Math.sin(h);\n    return new _color.Rgb(255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity);\n  }\n}));\n},{\"./define.js\":\"fV2I\",\"./color.js\":\"LIaf\",\"./math.js\":\"XzID\"}],\"Peej\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"color\", {\n  enumerable: true,\n  get: function () {\n    return _color.default;\n  }\n});\nObject.defineProperty(exports, \"rgb\", {\n  enumerable: true,\n  get: function () {\n    return _color.rgb;\n  }\n});\nObject.defineProperty(exports, \"hsl\", {\n  enumerable: true,\n  get: function () {\n    return _color.hsl;\n  }\n});\nObject.defineProperty(exports, \"lab\", {\n  enumerable: true,\n  get: function () {\n    return _lab.default;\n  }\n});\nObject.defineProperty(exports, \"hcl\", {\n  enumerable: true,\n  get: function () {\n    return _lab.hcl;\n  }\n});\nObject.defineProperty(exports, \"lch\", {\n  enumerable: true,\n  get: function () {\n    return _lab.lch;\n  }\n});\nObject.defineProperty(exports, \"gray\", {\n  enumerable: true,\n  get: function () {\n    return _lab.gray;\n  }\n});\nObject.defineProperty(exports, \"cubehelix\", {\n  enumerable: true,\n  get: function () {\n    return _cubehelix.default;\n  }\n});\n\nvar _color = _interopRequireWildcard(require(\"./color.js\"));\n\nvar _lab = _interopRequireWildcard(require(\"./lab.js\"));\n\nvar _cubehelix = _interopRequireDefault(require(\"./cubehelix.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./color.js\":\"LIaf\",\"./lab.js\":\"f7Av\",\"./cubehelix.js\":\"CMX9\"}],\"ElXH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.basis = basis;\nexports.default = _default;\n\nfunction basis(t1, v0, v1, v2, v3) {\n  var t2 = t1 * t1,\n      t3 = t2 * t1;\n  return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;\n}\n\nfunction _default(values) {\n  var n = values.length - 1;\n  return function (t) {\n    var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n        v1 = values[i],\n        v2 = values[i + 1],\n        v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n        v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n    return basis((t - i / n) * n, v0, v1, v2, v3);\n  };\n}\n},{}],\"hnXz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _basis = require(\"./basis.js\");\n\nfunction _default(values) {\n  var n = values.length;\n  return function (t) {\n    var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n        v0 = values[(i + n - 1) % n],\n        v1 = values[i % n],\n        v2 = values[(i + 1) % n],\n        v3 = values[(i + 2) % n];\n    return (0, _basis.basis)((t - i / n) * n, v0, v1, v2, v3);\n  };\n}\n},{\"./basis.js\":\"ElXH\"}],\"RhzI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.hue = hue;\nexports.gamma = gamma;\nexports.default = nogamma;\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction linear(a, d) {\n  return function (t) {\n    return a + t * d;\n  };\n}\n\nfunction exponential(a, b, y) {\n  return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function (t) {\n    return Math.pow(a + t * b, y);\n  };\n}\n\nfunction hue(a, b) {\n  var d = b - a;\n  return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : (0, _constant.default)(isNaN(a) ? b : a);\n}\n\nfunction gamma(y) {\n  return (y = +y) === 1 ? nogamma : function (a, b) {\n    return b - a ? exponential(a, b, y) : (0, _constant.default)(isNaN(a) ? b : a);\n  };\n}\n\nfunction nogamma(a, b) {\n  var d = b - a;\n  return d ? linear(a, d) : (0, _constant.default)(isNaN(a) ? b : a);\n}\n},{\"./constant.js\":\"aCvo\"}],\"rvVK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.rgbBasisClosed = exports.rgbBasis = exports.default = void 0;\n\nvar _d3Color = require(\"d3-color\");\n\nvar _basis = _interopRequireDefault(require(\"./basis.js\"));\n\nvar _basisClosed = _interopRequireDefault(require(\"./basisClosed.js\"));\n\nvar _color = _interopRequireWildcard(require(\"./color.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = function rgbGamma(y) {\n  var color = (0, _color.gamma)(y);\n\n  function rgb(start, end) {\n    var r = color((start = (0, _d3Color.rgb)(start)).r, (end = (0, _d3Color.rgb)(end)).r),\n        g = color(start.g, end.g),\n        b = color(start.b, end.b),\n        opacity = (0, _color.default)(start.opacity, end.opacity);\n    return function (t) {\n      start.r = r(t);\n      start.g = g(t);\n      start.b = b(t);\n      start.opacity = opacity(t);\n      return start + \"\";\n    };\n  }\n\n  rgb.gamma = rgbGamma;\n  return rgb;\n}(1);\n\nexports.default = _default;\n\nfunction rgbSpline(spline) {\n  return function (colors) {\n    var n = colors.length,\n        r = new Array(n),\n        g = new Array(n),\n        b = new Array(n),\n        i,\n        color;\n\n    for (i = 0; i < n; ++i) {\n      color = (0, _d3Color.rgb)(colors[i]);\n      r[i] = color.r || 0;\n      g[i] = color.g || 0;\n      b[i] = color.b || 0;\n    }\n\n    r = spline(r);\n    g = spline(g);\n    b = spline(b);\n    color.opacity = 1;\n    return function (t) {\n      color.r = r(t);\n      color.g = g(t);\n      color.b = b(t);\n      return color + \"\";\n    };\n  };\n}\n\nvar rgbBasis = rgbSpline(_basis.default);\nexports.rgbBasis = rgbBasis;\nvar rgbBasisClosed = rgbSpline(_basisClosed.default);\nexports.rgbBasisClosed = rgbBasisClosed;\n},{\"d3-color\":\"Peej\",\"./basis.js\":\"ElXH\",\"./basisClosed.js\":\"hnXz\",\"./color.js\":\"RhzI\"}],\"BOJ5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.isNumberArray = isNumberArray;\n\nfunction _default(a, b) {\n  if (!b) b = [];\n  var n = a ? Math.min(b.length, a.length) : 0,\n      c = b.slice(),\n      i;\n  return function (t) {\n    for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n\n    return c;\n  };\n}\n\nfunction isNumberArray(x) {\n  return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n},{}],\"TYZM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.genericArray = genericArray;\n\nvar _value = _interopRequireDefault(require(\"./value.js\"));\n\nvar _numberArray = _interopRequireWildcard(require(\"./numberArray.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(a, b) {\n  return ((0, _numberArray.isNumberArray)(b) ? _numberArray.default : genericArray)(a, b);\n}\n\nfunction genericArray(a, b) {\n  var nb = b ? b.length : 0,\n      na = a ? Math.min(nb, a.length) : 0,\n      x = new Array(na),\n      c = new Array(nb),\n      i;\n\n  for (i = 0; i < na; ++i) x[i] = (0, _value.default)(a[i], b[i]);\n\n  for (; i < nb; ++i) c[i] = b[i];\n\n  return function (t) {\n    for (i = 0; i < na; ++i) c[i] = x[i](t);\n\n    return c;\n  };\n}\n},{\"./value.js\":\"gzcD\",\"./numberArray.js\":\"BOJ5\"}],\"jEDF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(a, b) {\n  var d = new Date();\n  return a = +a, b = +b, function (t) {\n    return d.setTime(a * (1 - t) + b * t), d;\n  };\n}\n},{}],\"YNf8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(a, b) {\n  return a = +a, b = +b, function (t) {\n    return a * (1 - t) + b * t;\n  };\n}\n},{}],\"iJdZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _value = _interopRequireDefault(require(\"./value.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(a, b) {\n  var i = {},\n      c = {},\n      k;\n  if (a === null || typeof a !== \"object\") a = {};\n  if (b === null || typeof b !== \"object\") b = {};\n\n  for (k in b) {\n    if (k in a) {\n      i[k] = (0, _value.default)(a[k], b[k]);\n    } else {\n      c[k] = b[k];\n    }\n  }\n\n  return function (t) {\n    for (k in i) c[k] = i[k](t);\n\n    return c;\n  };\n}\n},{\"./value.js\":\"gzcD\"}],\"nK0E\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _number = _interopRequireDefault(require(\"./number.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n    reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n  return function () {\n    return b;\n  };\n}\n\nfunction one(b) {\n  return function (t) {\n    return b(t) + \"\";\n  };\n}\n\nfunction _default(a, b) {\n  var bi = reA.lastIndex = reB.lastIndex = 0,\n      // scan index for next number in b\n  am,\n      // current match in a\n  bm,\n      // current match in b\n  bs,\n      // string preceding current number in b, if any\n  i = -1,\n      // index in s\n  s = [],\n      // string constants and placeholders\n  q = []; // number interpolators\n  // Coerce inputs to strings.\n\n  a = a + \"\", b = b + \"\"; // Interpolate pairs of numbers in a & b.\n\n  while ((am = reA.exec(a)) && (bm = reB.exec(b))) {\n    if ((bs = bm.index) > bi) {\n      // a string precedes the next number in b\n      bs = b.slice(bi, bs);\n      if (s[i]) s[i] += bs; // coalesce with previous string\n      else s[++i] = bs;\n    }\n\n    if ((am = am[0]) === (bm = bm[0])) {\n      // numbers in a & b match\n      if (s[i]) s[i] += bm; // coalesce with previous string\n      else s[++i] = bm;\n    } else {\n      // interpolate non-matching numbers\n      s[++i] = null;\n      q.push({\n        i: i,\n        x: (0, _number.default)(am, bm)\n      });\n    }\n\n    bi = reB.lastIndex;\n  } // Add remains of b.\n\n\n  if (bi < b.length) {\n    bs = b.slice(bi);\n    if (s[i]) s[i] += bs; // coalesce with previous string\n    else s[++i] = bs;\n  } // Special optimization for only a single match.\n  // Otherwise, interpolate each of the numbers and rejoin the string.\n\n\n  return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function (t) {\n    for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n\n    return s.join(\"\");\n  });\n}\n},{\"./number.js\":\"YNf8\"}],\"gzcD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Color = require(\"d3-color\");\n\nvar _rgb = _interopRequireDefault(require(\"./rgb.js\"));\n\nvar _array = require(\"./array.js\");\n\nvar _date = _interopRequireDefault(require(\"./date.js\"));\n\nvar _number = _interopRequireDefault(require(\"./number.js\"));\n\nvar _object = _interopRequireDefault(require(\"./object.js\"));\n\nvar _string = _interopRequireDefault(require(\"./string.js\"));\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _numberArray = _interopRequireWildcard(require(\"./numberArray.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(a, b) {\n  var t = typeof b,\n      c;\n  return b == null || t === \"boolean\" ? (0, _constant.default)(b) : (t === \"number\" ? _number.default : t === \"string\" ? (c = (0, _d3Color.color)(b)) ? (b = c, _rgb.default) : _string.default : b instanceof _d3Color.color ? _rgb.default : b instanceof Date ? _date.default : (0, _numberArray.isNumberArray)(b) ? _numberArray.default : Array.isArray(b) ? _array.genericArray : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? _object.default : _number.default)(a, b);\n}\n},{\"d3-color\":\"Peej\",\"./rgb.js\":\"rvVK\",\"./array.js\":\"TYZM\",\"./date.js\":\"jEDF\",\"./number.js\":\"YNf8\",\"./object.js\":\"iJdZ\",\"./string.js\":\"nK0E\",\"./constant.js\":\"aCvo\",\"./numberArray.js\":\"BOJ5\"}],\"B1w8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(range) {\n  var n = range.length;\n  return function (t) {\n    return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n  };\n}\n},{}],\"ZrPS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _color = require(\"./color.js\");\n\nfunction _default(a, b) {\n  var i = (0, _color.hue)(+a, +b);\n  return function (t) {\n    var x = i(t);\n    return x - 360 * Math.floor(x / 360);\n  };\n}\n},{\"./color.js\":\"RhzI\"}],\"nXvs\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(a, b) {\n  return a = +a, b = +b, function (t) {\n    return Math.round(a * (1 - t) + b * t);\n  };\n}\n},{}],\"UXwK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.identity = void 0;\nvar degrees = 180 / Math.PI;\nvar identity = {\n  translateX: 0,\n  translateY: 0,\n  rotate: 0,\n  skewX: 0,\n  scaleX: 1,\n  scaleY: 1\n};\nexports.identity = identity;\n\nfunction _default(a, b, c, d, e, f) {\n  var scaleX, scaleY, skewX;\n  if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n  if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n  if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n  if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n  return {\n    translateX: e,\n    translateY: f,\n    rotate: Math.atan2(b, a) * degrees,\n    skewX: Math.atan(skewX) * degrees,\n    scaleX: scaleX,\n    scaleY: scaleY\n  };\n}\n},{}],\"LVjk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.parseCss = parseCss;\nexports.parseSvg = parseSvg;\n\nvar _decompose = _interopRequireWildcard(require(\"./decompose.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar cssNode, cssRoot, cssView, svgNode;\n\nfunction parseCss(value) {\n  if (value === \"none\") return _decompose.identity;\n  if (!cssNode) cssNode = document.createElement(\"DIV\"), cssRoot = document.documentElement, cssView = document.defaultView;\n  cssNode.style.transform = value;\n  value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\");\n  cssRoot.removeChild(cssNode);\n  value = value.slice(7, -1).split(\",\");\n  return (0, _decompose.default)(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);\n}\n\nfunction parseSvg(value) {\n  if (value == null) return _decompose.identity;\n  if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n  svgNode.setAttribute(\"transform\", value);\n  if (!(value = svgNode.transform.baseVal.consolidate())) return _decompose.identity;\n  value = value.matrix;\n  return (0, _decompose.default)(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n},{\"./decompose.js\":\"UXwK\"}],\"v4Xl\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.interpolateTransformSvg = exports.interpolateTransformCss = void 0;\n\nvar _number = _interopRequireDefault(require(\"../number.js\"));\n\nvar _parse = require(\"./parse.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n  function pop(s) {\n    return s.length ? s.pop() + \" \" : \"\";\n  }\n\n  function translate(xa, ya, xb, yb, s, q) {\n    if (xa !== xb || ya !== yb) {\n      var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n      q.push({\n        i: i - 4,\n        x: (0, _number.default)(xa, xb)\n      }, {\n        i: i - 2,\n        x: (0, _number.default)(ya, yb)\n      });\n    } else if (xb || yb) {\n      s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n    }\n  }\n\n  function rotate(a, b, s, q) {\n    if (a !== b) {\n      if (a - b > 180) b += 360;else if (b - a > 180) a += 360; // shortest path\n\n      q.push({\n        i: s.push(pop(s) + \"rotate(\", null, degParen) - 2,\n        x: (0, _number.default)(a, b)\n      });\n    } else if (b) {\n      s.push(pop(s) + \"rotate(\" + b + degParen);\n    }\n  }\n\n  function skewX(a, b, s, q) {\n    if (a !== b) {\n      q.push({\n        i: s.push(pop(s) + \"skewX(\", null, degParen) - 2,\n        x: (0, _number.default)(a, b)\n      });\n    } else if (b) {\n      s.push(pop(s) + \"skewX(\" + b + degParen);\n    }\n  }\n\n  function scale(xa, ya, xb, yb, s, q) {\n    if (xa !== xb || ya !== yb) {\n      var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: (0, _number.default)(xa, xb)\n      }, {\n        i: i - 2,\n        x: (0, _number.default)(ya, yb)\n      });\n    } else if (xb !== 1 || yb !== 1) {\n      s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n    }\n  }\n\n  return function (a, b) {\n    var s = [],\n        // string constants and placeholders\n    q = []; // number interpolators\n\n    a = parse(a), b = parse(b);\n    translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n    rotate(a.rotate, b.rotate, s, q);\n    skewX(a.skewX, b.skewX, s, q);\n    scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n    a = b = null; // gc\n\n    return function (t) {\n      var i = -1,\n          n = q.length,\n          o;\n\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n\n      return s.join(\"\");\n    };\n  };\n}\n\nvar interpolateTransformCss = interpolateTransform(_parse.parseCss, \"px, \", \"px)\", \"deg)\");\nexports.interpolateTransformCss = interpolateTransformCss;\nvar interpolateTransformSvg = interpolateTransform(_parse.parseSvg, \", \", \")\", \")\");\nexports.interpolateTransformSvg = interpolateTransformSvg;\n},{\"../number.js\":\"YNf8\",\"./parse.js\":\"LVjk\"}],\"jU1v\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nvar rho = Math.SQRT2,\n    rho2 = 2,\n    rho4 = 4,\n    epsilon2 = 1e-12;\n\nfunction cosh(x) {\n  return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n  return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n  return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n} // p0 = [ux0, uy0, w0]\n// p1 = [ux1, uy1, w1]\n\n\nfunction _default(p0, p1) {\n  var ux0 = p0[0],\n      uy0 = p0[1],\n      w0 = p0[2],\n      ux1 = p1[0],\n      uy1 = p1[1],\n      w1 = p1[2],\n      dx = ux1 - ux0,\n      dy = uy1 - uy0,\n      d2 = dx * dx + dy * dy,\n      i,\n      S; // Special case for u0 ≅ u1.\n\n  if (d2 < epsilon2) {\n    S = Math.log(w1 / w0) / rho;\n\n    i = function (t) {\n      return [ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(rho * t * S)];\n    };\n  } // General case.\n  else {\n      var d1 = Math.sqrt(d2),\n          b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n          b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n          r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n          r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n      S = (r1 - r0) / rho;\n\n      i = function (t) {\n        var s = t * S,\n            coshr0 = cosh(r0),\n            u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n        return [ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / cosh(rho * s + r0)];\n      };\n    }\n\n  i.duration = S * 1000;\n  return i;\n}\n},{}],\"LdeI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.hslLong = exports.default = void 0;\n\nvar _d3Color = require(\"d3-color\");\n\nvar _color = _interopRequireWildcard(require(\"./color.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction hsl(hue) {\n  return function (start, end) {\n    var h = hue((start = (0, _d3Color.hsl)(start)).h, (end = (0, _d3Color.hsl)(end)).h),\n        s = (0, _color.default)(start.s, end.s),\n        l = (0, _color.default)(start.l, end.l),\n        opacity = (0, _color.default)(start.opacity, end.opacity);\n    return function (t) {\n      start.h = h(t);\n      start.s = s(t);\n      start.l = l(t);\n      start.opacity = opacity(t);\n      return start + \"\";\n    };\n  };\n}\n\nvar _default = hsl(_color.hue);\n\nexports.default = _default;\nvar hslLong = hsl(_color.default);\nexports.hslLong = hslLong;\n},{\"d3-color\":\"Peej\",\"./color.js\":\"RhzI\"}],\"rghB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = lab;\n\nvar _d3Color = require(\"d3-color\");\n\nvar _color = _interopRequireDefault(require(\"./color.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction lab(start, end) {\n  var l = (0, _color.default)((start = (0, _d3Color.lab)(start)).l, (end = (0, _d3Color.lab)(end)).l),\n      a = (0, _color.default)(start.a, end.a),\n      b = (0, _color.default)(start.b, end.b),\n      opacity = (0, _color.default)(start.opacity, end.opacity);\n  return function (t) {\n    start.l = l(t);\n    start.a = a(t);\n    start.b = b(t);\n    start.opacity = opacity(t);\n    return start + \"\";\n  };\n}\n},{\"d3-color\":\"Peej\",\"./color.js\":\"RhzI\"}],\"dxPN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.hclLong = exports.default = void 0;\n\nvar _d3Color = require(\"d3-color\");\n\nvar _color = _interopRequireWildcard(require(\"./color.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction hcl(hue) {\n  return function (start, end) {\n    var h = hue((start = (0, _d3Color.hcl)(start)).h, (end = (0, _d3Color.hcl)(end)).h),\n        c = (0, _color.default)(start.c, end.c),\n        l = (0, _color.default)(start.l, end.l),\n        opacity = (0, _color.default)(start.opacity, end.opacity);\n    return function (t) {\n      start.h = h(t);\n      start.c = c(t);\n      start.l = l(t);\n      start.opacity = opacity(t);\n      return start + \"\";\n    };\n  };\n}\n\nvar _default = hcl(_color.hue);\n\nexports.default = _default;\nvar hclLong = hcl(_color.default);\nexports.hclLong = hclLong;\n},{\"d3-color\":\"Peej\",\"./color.js\":\"RhzI\"}],\"X3VV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cubehelixLong = exports.default = void 0;\n\nvar _d3Color = require(\"d3-color\");\n\nvar _color = _interopRequireWildcard(require(\"./color.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction cubehelix(hue) {\n  return function cubehelixGamma(y) {\n    y = +y;\n\n    function cubehelix(start, end) {\n      var h = hue((start = (0, _d3Color.cubehelix)(start)).h, (end = (0, _d3Color.cubehelix)(end)).h),\n          s = (0, _color.default)(start.s, end.s),\n          l = (0, _color.default)(start.l, end.l),\n          opacity = (0, _color.default)(start.opacity, end.opacity);\n      return function (t) {\n        start.h = h(t);\n        start.s = s(t);\n        start.l = l(Math.pow(t, y));\n        start.opacity = opacity(t);\n        return start + \"\";\n      };\n    }\n\n    cubehelix.gamma = cubehelixGamma;\n    return cubehelix;\n  }(1);\n}\n\nvar _default = cubehelix(_color.hue);\n\nexports.default = _default;\nvar cubehelixLong = cubehelix(_color.default);\nexports.cubehelixLong = cubehelixLong;\n},{\"d3-color\":\"Peej\",\"./color.js\":\"RhzI\"}],\"xtkP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = piecewise;\n\nfunction piecewise(interpolate, values) {\n  var i = 0,\n      n = values.length - 1,\n      v = values[0],\n      I = new Array(n < 0 ? 0 : n);\n\n  while (i < n) I[i] = interpolate(v, v = values[++i]);\n\n  return function (t) {\n    var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n    return I[i](t - i);\n  };\n}\n},{}],\"Oe1t\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(interpolator, n) {\n  var samples = new Array(n);\n\n  for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n\n  return samples;\n}\n},{}],\"k9aH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"interpolate\", {\n  enumerable: true,\n  get: function () {\n    return _value.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateArray\", {\n  enumerable: true,\n  get: function () {\n    return _array.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateBasis\", {\n  enumerable: true,\n  get: function () {\n    return _basis.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateBasisClosed\", {\n  enumerable: true,\n  get: function () {\n    return _basisClosed.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateDate\", {\n  enumerable: true,\n  get: function () {\n    return _date.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateDiscrete\", {\n  enumerable: true,\n  get: function () {\n    return _discrete.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateHue\", {\n  enumerable: true,\n  get: function () {\n    return _hue.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateNumber\", {\n  enumerable: true,\n  get: function () {\n    return _number.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateNumberArray\", {\n  enumerable: true,\n  get: function () {\n    return _numberArray.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateObject\", {\n  enumerable: true,\n  get: function () {\n    return _object.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateRound\", {\n  enumerable: true,\n  get: function () {\n    return _round.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateString\", {\n  enumerable: true,\n  get: function () {\n    return _string.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateTransformCss\", {\n  enumerable: true,\n  get: function () {\n    return _index.interpolateTransformCss;\n  }\n});\nObject.defineProperty(exports, \"interpolateTransformSvg\", {\n  enumerable: true,\n  get: function () {\n    return _index.interpolateTransformSvg;\n  }\n});\nObject.defineProperty(exports, \"interpolateZoom\", {\n  enumerable: true,\n  get: function () {\n    return _zoom.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateRgb\", {\n  enumerable: true,\n  get: function () {\n    return _rgb.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateRgbBasis\", {\n  enumerable: true,\n  get: function () {\n    return _rgb.rgbBasis;\n  }\n});\nObject.defineProperty(exports, \"interpolateRgbBasisClosed\", {\n  enumerable: true,\n  get: function () {\n    return _rgb.rgbBasisClosed;\n  }\n});\nObject.defineProperty(exports, \"interpolateHsl\", {\n  enumerable: true,\n  get: function () {\n    return _hsl.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateHslLong\", {\n  enumerable: true,\n  get: function () {\n    return _hsl.hslLong;\n  }\n});\nObject.defineProperty(exports, \"interpolateLab\", {\n  enumerable: true,\n  get: function () {\n    return _lab.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateHcl\", {\n  enumerable: true,\n  get: function () {\n    return _hcl.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateHclLong\", {\n  enumerable: true,\n  get: function () {\n    return _hcl.hclLong;\n  }\n});\nObject.defineProperty(exports, \"interpolateCubehelix\", {\n  enumerable: true,\n  get: function () {\n    return _cubehelix.default;\n  }\n});\nObject.defineProperty(exports, \"interpolateCubehelixLong\", {\n  enumerable: true,\n  get: function () {\n    return _cubehelix.cubehelixLong;\n  }\n});\nObject.defineProperty(exports, \"piecewise\", {\n  enumerable: true,\n  get: function () {\n    return _piecewise.default;\n  }\n});\nObject.defineProperty(exports, \"quantize\", {\n  enumerable: true,\n  get: function () {\n    return _quantize.default;\n  }\n});\n\nvar _value = _interopRequireDefault(require(\"./value.js\"));\n\nvar _array = _interopRequireDefault(require(\"./array.js\"));\n\nvar _basis = _interopRequireDefault(require(\"./basis.js\"));\n\nvar _basisClosed = _interopRequireDefault(require(\"./basisClosed.js\"));\n\nvar _date = _interopRequireDefault(require(\"./date.js\"));\n\nvar _discrete = _interopRequireDefault(require(\"./discrete.js\"));\n\nvar _hue = _interopRequireDefault(require(\"./hue.js\"));\n\nvar _number = _interopRequireDefault(require(\"./number.js\"));\n\nvar _numberArray = _interopRequireDefault(require(\"./numberArray.js\"));\n\nvar _object = _interopRequireDefault(require(\"./object.js\"));\n\nvar _round = _interopRequireDefault(require(\"./round.js\"));\n\nvar _string = _interopRequireDefault(require(\"./string.js\"));\n\nvar _index = require(\"./transform/index.js\");\n\nvar _zoom = _interopRequireDefault(require(\"./zoom.js\"));\n\nvar _rgb = _interopRequireWildcard(require(\"./rgb.js\"));\n\nvar _hsl = _interopRequireWildcard(require(\"./hsl.js\"));\n\nvar _lab = _interopRequireDefault(require(\"./lab.js\"));\n\nvar _hcl = _interopRequireWildcard(require(\"./hcl.js\"));\n\nvar _cubehelix = _interopRequireWildcard(require(\"./cubehelix.js\"));\n\nvar _piecewise = _interopRequireDefault(require(\"./piecewise.js\"));\n\nvar _quantize = _interopRequireDefault(require(\"./quantize.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./value.js\":\"gzcD\",\"./array.js\":\"TYZM\",\"./basis.js\":\"ElXH\",\"./basisClosed.js\":\"hnXz\",\"./date.js\":\"jEDF\",\"./discrete.js\":\"B1w8\",\"./hue.js\":\"ZrPS\",\"./number.js\":\"YNf8\",\"./numberArray.js\":\"BOJ5\",\"./object.js\":\"iJdZ\",\"./round.js\":\"nXvs\",\"./string.js\":\"nK0E\",\"./transform/index.js\":\"v4Xl\",\"./zoom.js\":\"jU1v\",\"./rgb.js\":\"rvVK\",\"./hsl.js\":\"LdeI\",\"./lab.js\":\"rghB\",\"./hcl.js\":\"dxPN\",\"./cubehelix.js\":\"X3VV\",\"./piecewise.js\":\"xtkP\",\"./quantize.js\":\"Oe1t\"}],\"FNaI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x) {\n  return +x;\n}\n},{}],\"CjJ5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.identity = identity;\nexports.copy = copy;\nexports.transformer = transformer;\nexports.default = continuous;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Interpolate = require(\"d3-interpolate\");\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _number = _interopRequireDefault(require(\"./number.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar unit = [0, 1];\n\nfunction identity(x) {\n  return x;\n}\n\nfunction normalize(a, b) {\n  return (b -= a = +a) ? function (x) {\n    return (x - a) / b;\n  } : (0, _constant.default)(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n  var t;\n  if (a > b) t = a, a = b, b = t;\n  return function (x) {\n    return Math.max(a, Math.min(b, x));\n  };\n} // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\n\n\nfunction bimap(domain, range, interpolate) {\n  var d0 = domain[0],\n      d1 = domain[1],\n      r0 = range[0],\n      r1 = range[1];\n  if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n  return function (x) {\n    return r0(d0(x));\n  };\n}\n\nfunction polymap(domain, range, interpolate) {\n  var j = Math.min(domain.length, range.length) - 1,\n      d = new Array(j),\n      r = new Array(j),\n      i = -1; // Reverse descending domains.\n\n  if (domain[j] < domain[0]) {\n    domain = domain.slice().reverse();\n    range = range.slice().reverse();\n  }\n\n  while (++i < j) {\n    d[i] = normalize(domain[i], domain[i + 1]);\n    r[i] = interpolate(range[i], range[i + 1]);\n  }\n\n  return function (x) {\n    var i = (0, _d3Array.bisect)(domain, x, 1, j) - 1;\n    return r[i](d[i](x));\n  };\n}\n\nfunction copy(source, target) {\n  return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());\n}\n\nfunction transformer() {\n  var domain = unit,\n      range = unit,\n      interpolate = _d3Interpolate.interpolate,\n      transform,\n      untransform,\n      unknown,\n      clamp = identity,\n      piecewise,\n      output,\n      input;\n\n  function rescale() {\n    var n = Math.min(domain.length, range.length);\n    if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n    piecewise = n > 2 ? polymap : bimap;\n    output = input = null;\n    return scale;\n  }\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n  }\n\n  scale.invert = function (y) {\n    return clamp(untransform((input || (input = piecewise(range, domain.map(transform), _d3Interpolate.interpolateNumber)))(y)));\n  };\n\n  scale.domain = function (_) {\n    return arguments.length ? (domain = Array.from(_, _number.default), rescale()) : domain.slice();\n  };\n\n  scale.range = function (_) {\n    return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n  };\n\n  scale.rangeRound = function (_) {\n    return range = Array.from(_), interpolate = _d3Interpolate.interpolateRound, rescale();\n  };\n\n  scale.clamp = function (_) {\n    return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n  };\n\n  scale.interpolate = function (_) {\n    return arguments.length ? (interpolate = _, rescale()) : interpolate;\n  };\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  return function (t, u) {\n    transform = t, untransform = u;\n    return rescale();\n  };\n}\n\nfunction continuous() {\n  return transformer()(identity, identity);\n}\n},{\"d3-array\":\"K0bd\",\"d3-interpolate\":\"k9aH\",\"./constant.js\":\"aCvo\",\"./number.js\":\"FNaI\"}],\"GAUC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimal(1.23) returns [\"123\", 0].\nfunction _default(x, p) {\n  if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n\n  var i,\n      coefficient = x.slice(0, i); // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n  // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n\n  return [coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, +x.slice(i + 1)];\n}\n},{}],\"tXBB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(x) {\n  return x = (0, _formatDecimal.default)(Math.abs(x)), x ? x[1] : NaN;\n}\n},{\"./formatDecimal.js\":\"GAUC\"}],\"rbAM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(grouping, thousands) {\n  return function (value, width) {\n    var i = value.length,\n        t = [],\n        j = 0,\n        g = grouping[0],\n        length = 0;\n\n    while (i > 0 && g > 0) {\n      if (length + g + 1 > width) g = Math.max(1, width - length);\n      t.push(value.substring(i -= g, i + g));\n      if ((length += g + 1) > width) break;\n      g = grouping[j = (j + 1) % grouping.length];\n    }\n\n    return t.reverse().join(thousands);\n  };\n}\n},{}],\"hTcF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(numerals) {\n  return function (value) {\n    return value.replace(/[0-9]/g, function (i) {\n      return numerals[+i];\n    });\n  };\n}\n},{}],\"aibL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = formatSpecifier;\nexports.FormatSpecifier = FormatSpecifier;\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nfunction formatSpecifier(specifier) {\n  if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n  var match;\n  return new FormatSpecifier({\n    fill: match[1],\n    align: match[2],\n    sign: match[3],\n    symbol: match[4],\n    zero: match[5],\n    width: match[6],\n    comma: match[7],\n    precision: match[8] && match[8].slice(1),\n    trim: match[9],\n    type: match[10]\n  });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nfunction FormatSpecifier(specifier) {\n  this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n  this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n  this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n  this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n  this.zero = !!specifier.zero;\n  this.width = specifier.width === undefined ? undefined : +specifier.width;\n  this.comma = !!specifier.comma;\n  this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n  this.trim = !!specifier.trim;\n  this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function () {\n  return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n},{}],\"SUnU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nfunction _default(s) {\n  out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n    switch (s[i]) {\n      case \".\":\n        i0 = i1 = i;\n        break;\n\n      case \"0\":\n        if (i0 === 0) i0 = i;\n        i1 = i;\n        break;\n\n      default:\n        if (i0 > 0) {\n          if (!+s[i]) break out;\n          i0 = 0;\n        }\n\n        break;\n    }\n  }\n\n  return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n},{}],\"fBpa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.prefixExponent = void 0;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar prefixExponent;\nexports.prefixExponent = prefixExponent;\n\nfunction _default(x, p) {\n  var d = (0, _formatDecimal.default)(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1],\n      i = exponent - (exports.prefixExponent = prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n      n = coefficient.length;\n  return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, _formatDecimal.default)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n},{\"./formatDecimal.js\":\"GAUC\"}],\"UDrw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _formatDecimal = _interopRequireDefault(require(\"./formatDecimal.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(x, p) {\n  var d = (0, _formatDecimal.default)(x, p);\n  if (!d) return x + \"\";\n  var coefficient = d[0],\n      exponent = d[1];\n  return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n},{\"./formatDecimal.js\":\"GAUC\"}],\"Wavi\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _formatPrefixAuto = _interopRequireDefault(require(\"./formatPrefixAuto.js\"));\n\nvar _formatRounded = _interopRequireDefault(require(\"./formatRounded.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = {\n  \"%\": function (x, p) {\n    return (x * 100).toFixed(p);\n  },\n  \"b\": function (x) {\n    return Math.round(x).toString(2);\n  },\n  \"c\": function (x) {\n    return x + \"\";\n  },\n  \"d\": function (x) {\n    return Math.round(x).toString(10);\n  },\n  \"e\": function (x, p) {\n    return x.toExponential(p);\n  },\n  \"f\": function (x, p) {\n    return x.toFixed(p);\n  },\n  \"g\": function (x, p) {\n    return x.toPrecision(p);\n  },\n  \"o\": function (x) {\n    return Math.round(x).toString(8);\n  },\n  \"p\": function (x, p) {\n    return (0, _formatRounded.default)(x * 100, p);\n  },\n  \"r\": _formatRounded.default,\n  \"s\": _formatPrefixAuto.default,\n  \"X\": function (x) {\n    return Math.round(x).toString(16).toUpperCase();\n  },\n  \"x\": function (x) {\n    return Math.round(x).toString(16);\n  }\n};\nexports.default = _default;\n},{\"./formatPrefixAuto.js\":\"fBpa\",\"./formatRounded.js\":\"UDrw\"}],\"IVmM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nvar _formatGroup = _interopRequireDefault(require(\"./formatGroup.js\"));\n\nvar _formatNumerals = _interopRequireDefault(require(\"./formatNumerals.js\"));\n\nvar _formatSpecifier = _interopRequireDefault(require(\"./formatSpecifier.js\"));\n\nvar _formatTrim = _interopRequireDefault(require(\"./formatTrim.js\"));\n\nvar _formatTypes = _interopRequireDefault(require(\"./formatTypes.js\"));\n\nvar _formatPrefixAuto = require(\"./formatPrefixAuto.js\");\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar map = Array.prototype.map,\n    prefixes = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n\nfunction _default(locale) {\n  var group = locale.grouping === undefined || locale.thousands === undefined ? _identity.default : (0, _formatGroup.default)(map.call(locale.grouping, Number), locale.thousands + \"\"),\n      currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n      currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n      decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n      numerals = locale.numerals === undefined ? _identity.default : (0, _formatNumerals.default)(map.call(locale.numerals, String)),\n      percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n      minus = locale.minus === undefined ? \"-\" : locale.minus + \"\",\n      nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n  function newFormat(specifier) {\n    specifier = (0, _formatSpecifier.default)(specifier);\n    var fill = specifier.fill,\n        align = specifier.align,\n        sign = specifier.sign,\n        symbol = specifier.symbol,\n        zero = specifier.zero,\n        width = specifier.width,\n        comma = specifier.comma,\n        precision = specifier.precision,\n        trim = specifier.trim,\n        type = specifier.type; // The \"n\" type is an alias for \",g\".\n\n    if (type === \"n\") comma = true, type = \"g\"; // The \"\" type, and any invalid type, is an alias for \".12~g\".\n    else if (!_formatTypes.default[type]) precision === undefined && (precision = 12), trim = true, type = \"g\"; // If zero fill is specified, padding goes after sign and before digits.\n\n    if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\"; // Compute the prefix and suffix.\n    // For SI-prefix, the suffix is lazily computed.\n\n    var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n        suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\"; // What format function should we use?\n    // Is this an integer type?\n    // Can this type generate exponential notation?\n\n    var formatType = _formatTypes.default[type],\n        maybeSuffix = /[defgprs%]/.test(type); // Set the default precision if not specified,\n    // or clamp the specified precision to the supported range.\n    // For significant precision, it must be in [1, 21].\n    // For fixed precision, it must be in [0, 20].\n\n    precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n\n    function format(value) {\n      var valuePrefix = prefix,\n          valueSuffix = suffix,\n          i,\n          n,\n          c;\n\n      if (type === \"c\") {\n        valueSuffix = formatType(value) + valueSuffix;\n        value = \"\";\n      } else {\n        value = +value; // Perform the initial formatting.\n\n        var valueNegative = value < 0;\n        value = isNaN(value) ? nan : formatType(Math.abs(value), precision); // Trim insignificant zeros.\n\n        if (trim) value = (0, _formatTrim.default)(value); // If a negative value rounds to zero during formatting, treat as positive.\n\n        if (valueNegative && +value === 0) valueNegative = false; // Compute the prefix and suffix.\n\n        valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n        valueSuffix = (type === \"s\" ? prefixes[8 + _formatPrefixAuto.prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\"); // Break the formatted value into the integer “value” part that can be\n        // grouped, and fractional or exponential “suffix” part that is not.\n\n        if (maybeSuffix) {\n          i = -1, n = value.length;\n\n          while (++i < n) {\n            if (c = value.charCodeAt(i), 48 > c || c > 57) {\n              valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n              value = value.slice(0, i);\n              break;\n            }\n          }\n        }\n      } // If the fill character is not \"0\", grouping is applied before padding.\n\n\n      if (comma && !zero) value = group(value, Infinity); // Compute the padding.\n\n      var length = valuePrefix.length + value.length + valueSuffix.length,\n          padding = length < width ? new Array(width - length + 1).join(fill) : \"\"; // If the fill character is \"0\", grouping is applied after padding.\n\n      if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\"; // Reconstruct the final output based on the desired alignment.\n\n      switch (align) {\n        case \"<\":\n          value = valuePrefix + value + valueSuffix + padding;\n          break;\n\n        case \"=\":\n          value = valuePrefix + padding + value + valueSuffix;\n          break;\n\n        case \"^\":\n          value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n          break;\n\n        default:\n          value = padding + valuePrefix + value + valueSuffix;\n          break;\n      }\n\n      return numerals(value);\n    }\n\n    format.toString = function () {\n      return specifier + \"\";\n    };\n\n    return format;\n  }\n\n  function formatPrefix(specifier, value) {\n    var f = newFormat((specifier = (0, _formatSpecifier.default)(specifier), specifier.type = \"f\", specifier)),\n        e = Math.max(-8, Math.min(8, Math.floor((0, _exponent.default)(value) / 3))) * 3,\n        k = Math.pow(10, -e),\n        prefix = prefixes[8 + e / 3];\n    return function (value) {\n      return f(k * value) + prefix;\n    };\n  }\n\n  return {\n    format: newFormat,\n    formatPrefix: formatPrefix\n  };\n}\n},{\"./exponent.js\":\"tXBB\",\"./formatGroup.js\":\"rbAM\",\"./formatNumerals.js\":\"hTcF\",\"./formatSpecifier.js\":\"aibL\",\"./formatTrim.js\":\"SUnU\",\"./formatTypes.js\":\"Wavi\",\"./formatPrefixAuto.js\":\"fBpa\",\"./identity.js\":\"n09v\"}],\"KaMm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = defaultLocale;\nexports.formatPrefix = exports.format = void 0;\n\nvar _locale = _interopRequireDefault(require(\"./locale.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar locale;\nvar format;\nexports.format = format;\nvar formatPrefix;\nexports.formatPrefix = formatPrefix;\ndefaultLocale({\n  decimal: \".\",\n  thousands: \",\",\n  grouping: [3],\n  currency: [\"$\", \"\"],\n  minus: \"-\"\n});\n\nfunction defaultLocale(definition) {\n  locale = (0, _locale.default)(definition);\n  exports.format = format = locale.format;\n  exports.formatPrefix = formatPrefix = locale.formatPrefix;\n  return locale;\n}\n},{\"./locale.js\":\"IVmM\"}],\"EyKk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step) {\n  return Math.max(0, -(0, _exponent.default)(Math.abs(step)));\n}\n},{\"./exponent.js\":\"tXBB\"}],\"VPkn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step, value) {\n  return Math.max(0, Math.max(-8, Math.min(8, Math.floor((0, _exponent.default)(value) / 3))) * 3 - (0, _exponent.default)(Math.abs(step)));\n}\n},{\"./exponent.js\":\"tXBB\"}],\"DMyZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _exponent = _interopRequireDefault(require(\"./exponent.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(step, max) {\n  step = Math.abs(step), max = Math.abs(max) - step;\n  return Math.max(0, (0, _exponent.default)(max) - (0, _exponent.default)(step)) + 1;\n}\n},{\"./exponent.js\":\"tXBB\"}],\"VuZR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"formatDefaultLocale\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.default;\n  }\n});\nObject.defineProperty(exports, \"format\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.format;\n  }\n});\nObject.defineProperty(exports, \"formatPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _defaultLocale.formatPrefix;\n  }\n});\nObject.defineProperty(exports, \"formatLocale\", {\n  enumerable: true,\n  get: function () {\n    return _locale.default;\n  }\n});\nObject.defineProperty(exports, \"formatSpecifier\", {\n  enumerable: true,\n  get: function () {\n    return _formatSpecifier.default;\n  }\n});\nObject.defineProperty(exports, \"FormatSpecifier\", {\n  enumerable: true,\n  get: function () {\n    return _formatSpecifier.FormatSpecifier;\n  }\n});\nObject.defineProperty(exports, \"precisionFixed\", {\n  enumerable: true,\n  get: function () {\n    return _precisionFixed.default;\n  }\n});\nObject.defineProperty(exports, \"precisionPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _precisionPrefix.default;\n  }\n});\nObject.defineProperty(exports, \"precisionRound\", {\n  enumerable: true,\n  get: function () {\n    return _precisionRound.default;\n  }\n});\n\nvar _defaultLocale = _interopRequireWildcard(require(\"./defaultLocale.js\"));\n\nvar _locale = _interopRequireDefault(require(\"./locale.js\"));\n\nvar _formatSpecifier = _interopRequireWildcard(require(\"./formatSpecifier.js\"));\n\nvar _precisionFixed = _interopRequireDefault(require(\"./precisionFixed.js\"));\n\nvar _precisionPrefix = _interopRequireDefault(require(\"./precisionPrefix.js\"));\n\nvar _precisionRound = _interopRequireDefault(require(\"./precisionRound.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./defaultLocale.js\":\"KaMm\",\"./locale.js\":\"IVmM\",\"./formatSpecifier.js\":\"aibL\",\"./precisionFixed.js\":\"EyKk\",\"./precisionPrefix.js\":\"VPkn\",\"./precisionRound.js\":\"DMyZ\"}],\"qjRa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Format = require(\"d3-format\");\n\nfunction _default(start, stop, count, specifier) {\n  var step = (0, _d3Array.tickStep)(start, stop, count),\n      precision;\n  specifier = (0, _d3Format.formatSpecifier)(specifier == null ? \",f\" : specifier);\n\n  switch (specifier.type) {\n    case \"s\":\n      {\n        var value = Math.max(Math.abs(start), Math.abs(stop));\n        if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionPrefix)(step, value))) specifier.precision = precision;\n        return (0, _d3Format.formatPrefix)(specifier, value);\n      }\n\n    case \"\":\n    case \"e\":\n    case \"g\":\n    case \"p\":\n    case \"r\":\n      {\n        if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionRound)(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n        break;\n      }\n\n    case \"f\":\n    case \"%\":\n      {\n        if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionFixed)(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n        break;\n      }\n  }\n\n  return (0, _d3Format.format)(specifier);\n}\n},{\"d3-array\":\"K0bd\",\"d3-format\":\"VuZR\"}],\"LIJk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linearish = linearish;\nexports.default = linear;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _continuous = _interopRequireWildcard(require(\"./continuous.js\"));\n\nvar _init = require(\"./init.js\");\n\nvar _tickFormat = _interopRequireDefault(require(\"./tickFormat.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction linearish(scale) {\n  var domain = scale.domain;\n\n  scale.ticks = function (count) {\n    var d = domain();\n    return (0, _d3Array.ticks)(d[0], d[d.length - 1], count == null ? 10 : count);\n  };\n\n  scale.tickFormat = function (count, specifier) {\n    var d = domain();\n    return (0, _tickFormat.default)(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n  };\n\n  scale.nice = function (count) {\n    if (count == null) count = 10;\n    var d = domain(),\n        i0 = 0,\n        i1 = d.length - 1,\n        start = d[i0],\n        stop = d[i1],\n        step;\n\n    if (stop < start) {\n      step = start, start = stop, stop = step;\n      step = i0, i0 = i1, i1 = step;\n    }\n\n    step = (0, _d3Array.tickIncrement)(start, stop, count);\n\n    if (step > 0) {\n      start = Math.floor(start / step) * step;\n      stop = Math.ceil(stop / step) * step;\n      step = (0, _d3Array.tickIncrement)(start, stop, count);\n    } else if (step < 0) {\n      start = Math.ceil(start * step) / step;\n      stop = Math.floor(stop * step) / step;\n      step = (0, _d3Array.tickIncrement)(start, stop, count);\n    }\n\n    if (step > 0) {\n      d[i0] = Math.floor(start / step) * step;\n      d[i1] = Math.ceil(stop / step) * step;\n      domain(d);\n    } else if (step < 0) {\n      d[i0] = Math.ceil(start * step) / step;\n      d[i1] = Math.floor(stop * step) / step;\n      domain(d);\n    }\n\n    return scale;\n  };\n\n  return scale;\n}\n\nfunction linear() {\n  var scale = (0, _continuous.default)();\n\n  scale.copy = function () {\n    return (0, _continuous.copy)(scale, linear());\n  };\n\n  _init.initRange.apply(scale, arguments);\n\n  return linearish(scale);\n}\n},{\"d3-array\":\"K0bd\",\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\",\"./tickFormat.js\":\"qjRa\"}],\"FKHe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = identity;\n\nvar _linear = require(\"./linear.js\");\n\nvar _number = _interopRequireDefault(require(\"./number.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction identity(domain) {\n  var unknown;\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : x;\n  }\n\n  scale.invert = scale;\n\n  scale.domain = scale.range = function (_) {\n    return arguments.length ? (domain = Array.from(_, _number.default), scale) : domain.slice();\n  };\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  scale.copy = function () {\n    return identity(domain).unknown(unknown);\n  };\n\n  domain = arguments.length ? Array.from(domain, _number.default) : [0, 1];\n  return (0, _linear.linearish)(scale);\n}\n},{\"./linear.js\":\"LIJk\",\"./number.js\":\"FNaI\"}],\"eMTM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(domain, interval) {\n  domain = domain.slice();\n  var i0 = 0,\n      i1 = domain.length - 1,\n      x0 = domain[i0],\n      x1 = domain[i1],\n      t;\n\n  if (x1 < x0) {\n    t = i0, i0 = i1, i1 = t;\n    t = x0, x0 = x1, x1 = t;\n  }\n\n  domain[i0] = interval.floor(x0);\n  domain[i1] = interval.ceil(x1);\n  return domain;\n}\n},{}],\"ea59\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.loggish = loggish;\nexports.default = log;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Format = require(\"d3-format\");\n\nvar _nice = _interopRequireDefault(require(\"./nice.js\"));\n\nvar _continuous = require(\"./continuous.js\");\n\nvar _init = require(\"./init.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction transformLog(x) {\n  return Math.log(x);\n}\n\nfunction transformExp(x) {\n  return Math.exp(x);\n}\n\nfunction transformLogn(x) {\n  return -Math.log(-x);\n}\n\nfunction transformExpn(x) {\n  return -Math.exp(-x);\n}\n\nfunction pow10(x) {\n  return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\n\nfunction powp(base) {\n  return base === 10 ? pow10 : base === Math.E ? Math.exp : function (x) {\n    return Math.pow(base, x);\n  };\n}\n\nfunction logp(base) {\n  return base === Math.E ? Math.log : base === 10 && Math.log10 || base === 2 && Math.log2 || (base = Math.log(base), function (x) {\n    return Math.log(x) / base;\n  });\n}\n\nfunction reflect(f) {\n  return function (x) {\n    return -f(-x);\n  };\n}\n\nfunction loggish(transform) {\n  var scale = transform(transformLog, transformExp),\n      domain = scale.domain,\n      base = 10,\n      logs,\n      pows;\n\n  function rescale() {\n    logs = logp(base), pows = powp(base);\n\n    if (domain()[0] < 0) {\n      logs = reflect(logs), pows = reflect(pows);\n      transform(transformLogn, transformExpn);\n    } else {\n      transform(transformLog, transformExp);\n    }\n\n    return scale;\n  }\n\n  scale.base = function (_) {\n    return arguments.length ? (base = +_, rescale()) : base;\n  };\n\n  scale.domain = function (_) {\n    return arguments.length ? (domain(_), rescale()) : domain();\n  };\n\n  scale.ticks = function (count) {\n    var d = domain(),\n        u = d[0],\n        v = d[d.length - 1],\n        r;\n    if (r = v < u) i = u, u = v, v = i;\n    var i = logs(u),\n        j = logs(v),\n        p,\n        k,\n        t,\n        n = count == null ? 10 : +count,\n        z = [];\n\n    if (!(base % 1) && j - i < n) {\n      i = Math.floor(i), j = Math.ceil(j);\n      if (u > 0) for (; i <= j; ++i) {\n        for (k = 1, p = pows(i); k < base; ++k) {\n          t = p * k;\n          if (t < u) continue;\n          if (t > v) break;\n          z.push(t);\n        }\n      } else for (; i <= j; ++i) {\n        for (k = base - 1, p = pows(i); k >= 1; --k) {\n          t = p * k;\n          if (t < u) continue;\n          if (t > v) break;\n          z.push(t);\n        }\n      }\n      if (z.length * 2 < n) z = (0, _d3Array.ticks)(u, v, n);\n    } else {\n      z = (0, _d3Array.ticks)(i, j, Math.min(j - i, n)).map(pows);\n    }\n\n    return r ? z.reverse() : z;\n  };\n\n  scale.tickFormat = function (count, specifier) {\n    if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n    if (typeof specifier !== \"function\") specifier = (0, _d3Format.format)(specifier);\n    if (count === Infinity) return specifier;\n    if (count == null) count = 10;\n    var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n\n    return function (d) {\n      var i = d / pows(Math.round(logs(d)));\n      if (i * base < base - 0.5) i *= base;\n      return i <= k ? specifier(d) : \"\";\n    };\n  };\n\n  scale.nice = function () {\n    return domain((0, _nice.default)(domain(), {\n      floor: function (x) {\n        return pows(Math.floor(logs(x)));\n      },\n      ceil: function (x) {\n        return pows(Math.ceil(logs(x)));\n      }\n    }));\n  };\n\n  return scale;\n}\n\nfunction log() {\n  var scale = loggish((0, _continuous.transformer)()).domain([1, 10]);\n\n  scale.copy = function () {\n    return (0, _continuous.copy)(scale, log()).base(scale.base());\n  };\n\n  _init.initRange.apply(scale, arguments);\n\n  return scale;\n}\n},{\"d3-array\":\"K0bd\",\"d3-format\":\"VuZR\",\"./nice.js\":\"eMTM\",\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\"}],\"nanU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.symlogish = symlogish;\nexports.default = symlog;\n\nvar _linear = require(\"./linear.js\");\n\nvar _continuous = require(\"./continuous.js\");\n\nvar _init = require(\"./init.js\");\n\nfunction transformSymlog(c) {\n  return function (x) {\n    return Math.sign(x) * Math.log1p(Math.abs(x / c));\n  };\n}\n\nfunction transformSymexp(c) {\n  return function (x) {\n    return Math.sign(x) * Math.expm1(Math.abs(x)) * c;\n  };\n}\n\nfunction symlogish(transform) {\n  var c = 1,\n      scale = transform(transformSymlog(c), transformSymexp(c));\n\n  scale.constant = function (_) {\n    return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;\n  };\n\n  return (0, _linear.linearish)(scale);\n}\n\nfunction symlog() {\n  var scale = symlogish((0, _continuous.transformer)());\n\n  scale.copy = function () {\n    return (0, _continuous.copy)(scale, symlog()).constant(scale.constant());\n  };\n\n  return _init.initRange.apply(scale, arguments);\n}\n},{\"./linear.js\":\"LIJk\",\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\"}],\"xeRN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.powish = powish;\nexports.default = pow;\nexports.sqrt = sqrt;\n\nvar _linear = require(\"./linear.js\");\n\nvar _continuous = require(\"./continuous.js\");\n\nvar _init = require(\"./init.js\");\n\nfunction transformPow(exponent) {\n  return function (x) {\n    return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n  };\n}\n\nfunction transformSqrt(x) {\n  return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n  return x < 0 ? -x * x : x * x;\n}\n\nfunction powish(transform) {\n  var scale = transform(_continuous.identity, _continuous.identity),\n      exponent = 1;\n\n  function rescale() {\n    return exponent === 1 ? transform(_continuous.identity, _continuous.identity) : exponent === 0.5 ? transform(transformSqrt, transformSquare) : transform(transformPow(exponent), transformPow(1 / exponent));\n  }\n\n  scale.exponent = function (_) {\n    return arguments.length ? (exponent = +_, rescale()) : exponent;\n  };\n\n  return (0, _linear.linearish)(scale);\n}\n\nfunction pow() {\n  var scale = powish((0, _continuous.transformer)());\n\n  scale.copy = function () {\n    return (0, _continuous.copy)(scale, pow()).exponent(scale.exponent());\n  };\n\n  _init.initRange.apply(scale, arguments);\n\n  return scale;\n}\n\nfunction sqrt() {\n  return pow.apply(null, arguments).exponent(0.5);\n}\n},{\"./linear.js\":\"LIJk\",\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\"}],\"mhod\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = radial;\n\nvar _continuous = _interopRequireDefault(require(\"./continuous.js\"));\n\nvar _init = require(\"./init.js\");\n\nvar _linear = require(\"./linear.js\");\n\nvar _number = _interopRequireDefault(require(\"./number.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction square(x) {\n  return Math.sign(x) * x * x;\n}\n\nfunction unsquare(x) {\n  return Math.sign(x) * Math.sqrt(Math.abs(x));\n}\n\nfunction radial() {\n  var squared = (0, _continuous.default)(),\n      range = [0, 1],\n      round = false,\n      unknown;\n\n  function scale(x) {\n    var y = unsquare(squared(x));\n    return isNaN(y) ? unknown : round ? Math.round(y) : y;\n  }\n\n  scale.invert = function (y) {\n    return squared.invert(square(y));\n  };\n\n  scale.domain = function (_) {\n    return arguments.length ? (squared.domain(_), scale) : squared.domain();\n  };\n\n  scale.range = function (_) {\n    return arguments.length ? (squared.range((range = Array.from(_, _number.default)).map(square)), scale) : range.slice();\n  };\n\n  scale.rangeRound = function (_) {\n    return scale.range(_).round(true);\n  };\n\n  scale.round = function (_) {\n    return arguments.length ? (round = !!_, scale) : round;\n  };\n\n  scale.clamp = function (_) {\n    return arguments.length ? (squared.clamp(_), scale) : squared.clamp();\n  };\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  scale.copy = function () {\n    return radial(squared.domain(), range).round(round).clamp(squared.clamp()).unknown(unknown);\n  };\n\n  _init.initRange.apply(scale, arguments);\n\n  return (0, _linear.linearish)(scale);\n}\n},{\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\",\"./linear.js\":\"LIJk\",\"./number.js\":\"FNaI\"}],\"AGCd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = quantile;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _init = require(\"./init.js\");\n\nfunction quantile() {\n  var domain = [],\n      range = [],\n      thresholds = [],\n      unknown;\n\n  function rescale() {\n    var i = 0,\n        n = Math.max(1, range.length);\n    thresholds = new Array(n - 1);\n\n    while (++i < n) thresholds[i - 1] = (0, _d3Array.quantile)(domain, i / n);\n\n    return scale;\n  }\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : range[(0, _d3Array.bisect)(thresholds, x)];\n  }\n\n  scale.invertExtent = function (y) {\n    var i = range.indexOf(y);\n    return i < 0 ? [NaN, NaN] : [i > 0 ? thresholds[i - 1] : domain[0], i < thresholds.length ? thresholds[i] : domain[domain.length - 1]];\n  };\n\n  scale.domain = function (_) {\n    if (!arguments.length) return domain.slice();\n    domain = [];\n\n    for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d);\n\n    domain.sort(_d3Array.ascending);\n    return rescale();\n  };\n\n  scale.range = function (_) {\n    return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n  };\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  scale.quantiles = function () {\n    return thresholds.slice();\n  };\n\n  scale.copy = function () {\n    return quantile().domain(domain).range(range).unknown(unknown);\n  };\n\n  return _init.initRange.apply(scale, arguments);\n}\n},{\"d3-array\":\"K0bd\",\"./init.js\":\"buZa\"}],\"d6Xk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = quantize;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _linear = require(\"./linear.js\");\n\nvar _init = require(\"./init.js\");\n\nfunction quantize() {\n  var x0 = 0,\n      x1 = 1,\n      n = 1,\n      domain = [0.5],\n      range = [0, 1],\n      unknown;\n\n  function scale(x) {\n    return x <= x ? range[(0, _d3Array.bisect)(domain, x, 0, n)] : unknown;\n  }\n\n  function rescale() {\n    var i = -1;\n    domain = new Array(n);\n\n    while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n\n    return scale;\n  }\n\n  scale.domain = function (_) {\n    return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1];\n  };\n\n  scale.range = function (_) {\n    return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();\n  };\n\n  scale.invertExtent = function (y) {\n    var i = range.indexOf(y);\n    return i < 0 ? [NaN, NaN] : i < 1 ? [x0, domain[0]] : i >= n ? [domain[n - 1], x1] : [domain[i - 1], domain[i]];\n  };\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : scale;\n  };\n\n  scale.thresholds = function () {\n    return domain.slice();\n  };\n\n  scale.copy = function () {\n    return quantize().domain([x0, x1]).range(range).unknown(unknown);\n  };\n\n  return _init.initRange.apply((0, _linear.linearish)(scale), arguments);\n}\n},{\"d3-array\":\"K0bd\",\"./linear.js\":\"LIJk\",\"./init.js\":\"buZa\"}],\"I63C\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = threshold;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _init = require(\"./init.js\");\n\nfunction threshold() {\n  var domain = [0.5],\n      range = [0, 1],\n      unknown,\n      n = 1;\n\n  function scale(x) {\n    return x <= x ? range[(0, _d3Array.bisect)(domain, x, 0, n)] : unknown;\n  }\n\n  scale.domain = function (_) {\n    return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n  };\n\n  scale.range = function (_) {\n    return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n  };\n\n  scale.invertExtent = function (y) {\n    var i = range.indexOf(y);\n    return [domain[i - 1], domain[i]];\n  };\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  scale.copy = function () {\n    return threshold().domain(domain).range(range).unknown(unknown);\n  };\n\n  return _init.initRange.apply(scale, arguments);\n}\n},{\"d3-array\":\"K0bd\",\"./init.js\":\"buZa\"}],\"kVXt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.calendar = calendar;\nexports.default = _default;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Time = require(\"d3-time\");\n\nvar _d3TimeFormat = require(\"d3-time-format\");\n\nvar _continuous = _interopRequireWildcard(require(\"./continuous.js\"));\n\nvar _init = require(\"./init.js\");\n\nvar _nice = _interopRequireDefault(require(\"./nice.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar durationSecond = 1000,\n    durationMinute = durationSecond * 60,\n    durationHour = durationMinute * 60,\n    durationDay = durationHour * 24,\n    durationWeek = durationDay * 7,\n    durationMonth = durationDay * 30,\n    durationYear = durationDay * 365;\n\nfunction date(t) {\n  return new Date(t);\n}\n\nfunction number(t) {\n  return t instanceof Date ? +t : +new Date(+t);\n}\n\nfunction calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n  var scale = (0, _continuous.default)(),\n      invert = scale.invert,\n      domain = scale.domain;\n  var formatMillisecond = format(\".%L\"),\n      formatSecond = format(\":%S\"),\n      formatMinute = format(\"%I:%M\"),\n      formatHour = format(\"%I %p\"),\n      formatDay = format(\"%a %d\"),\n      formatWeek = format(\"%b %d\"),\n      formatMonth = format(\"%B\"),\n      formatYear = format(\"%Y\");\n  var tickIntervals = [[second, 1, durationSecond], [second, 5, 5 * durationSecond], [second, 15, 15 * durationSecond], [second, 30, 30 * durationSecond], [minute, 1, durationMinute], [minute, 5, 5 * durationMinute], [minute, 15, 15 * durationMinute], [minute, 30, 30 * durationMinute], [hour, 1, durationHour], [hour, 3, 3 * durationHour], [hour, 6, 6 * durationHour], [hour, 12, 12 * durationHour], [day, 1, durationDay], [day, 2, 2 * durationDay], [week, 1, durationWeek], [month, 1, durationMonth], [month, 3, 3 * durationMonth], [year, 1, durationYear]];\n\n  function tickFormat(date) {\n    return (second(date) < date ? formatMillisecond : minute(date) < date ? formatSecond : hour(date) < date ? formatMinute : day(date) < date ? formatHour : month(date) < date ? week(date) < date ? formatDay : formatWeek : year(date) < date ? formatMonth : formatYear)(date);\n  }\n\n  function tickInterval(interval, start, stop) {\n    if (interval == null) interval = 10; // If a desired tick count is specified, pick a reasonable tick interval\n    // based on the extent of the domain and a rough estimate of tick size.\n    // Otherwise, assume interval is already a time interval and use it.\n\n    if (typeof interval === \"number\") {\n      var target = Math.abs(stop - start) / interval,\n          i = (0, _d3Array.bisector)(function (i) {\n        return i[2];\n      }).right(tickIntervals, target),\n          step;\n\n      if (i === tickIntervals.length) {\n        step = (0, _d3Array.tickStep)(start / durationYear, stop / durationYear, interval);\n        interval = year;\n      } else if (i) {\n        i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n        step = i[1];\n        interval = i[0];\n      } else {\n        step = Math.max((0, _d3Array.tickStep)(start, stop, interval), 1);\n        interval = millisecond;\n      }\n\n      return interval.every(step);\n    }\n\n    return interval;\n  }\n\n  scale.invert = function (y) {\n    return new Date(invert(y));\n  };\n\n  scale.domain = function (_) {\n    return arguments.length ? domain(Array.from(_, number)) : domain().map(date);\n  };\n\n  scale.ticks = function (interval) {\n    var d = domain(),\n        t0 = d[0],\n        t1 = d[d.length - 1],\n        r = t1 < t0,\n        t;\n    if (r) t = t0, t0 = t1, t1 = t;\n    t = tickInterval(interval, t0, t1);\n    t = t ? t.range(t0, t1 + 1) : []; // inclusive stop\n\n    return r ? t.reverse() : t;\n  };\n\n  scale.tickFormat = function (count, specifier) {\n    return specifier == null ? tickFormat : format(specifier);\n  };\n\n  scale.nice = function (interval) {\n    var d = domain();\n    return (interval = tickInterval(interval, d[0], d[d.length - 1])) ? domain((0, _nice.default)(d, interval)) : scale;\n  };\n\n  scale.copy = function () {\n    return (0, _continuous.copy)(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n  };\n\n  return scale;\n}\n\nfunction _default() {\n  return _init.initRange.apply(calendar(_d3Time.timeYear, _d3Time.timeMonth, _d3Time.timeWeek, _d3Time.timeDay, _d3Time.timeHour, _d3Time.timeMinute, _d3Time.timeSecond, _d3Time.timeMillisecond, _d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);\n}\n},{\"d3-array\":\"K0bd\",\"d3-time\":\"hQYG\",\"d3-time-format\":\"UYpZ\",\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\",\"./nice.js\":\"eMTM\"}],\"WrbA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _time = require(\"./time.js\");\n\nvar _d3TimeFormat = require(\"d3-time-format\");\n\nvar _d3Time = require(\"d3-time\");\n\nvar _init = require(\"./init.js\");\n\nfunction _default() {\n  return _init.initRange.apply((0, _time.calendar)(_d3Time.utcYear, _d3Time.utcMonth, _d3Time.utcWeek, _d3Time.utcDay, _d3Time.utcHour, _d3Time.utcMinute, _d3Time.utcSecond, _d3Time.utcMillisecond, _d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);\n}\n},{\"./time.js\":\"kVXt\",\"d3-time-format\":\"UYpZ\",\"d3-time\":\"hQYG\",\"./init.js\":\"buZa\"}],\"J7VY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.copy = copy;\nexports.default = sequential;\nexports.sequentialLog = sequentialLog;\nexports.sequentialSymlog = sequentialSymlog;\nexports.sequentialPow = sequentialPow;\nexports.sequentialSqrt = sequentialSqrt;\n\nvar _d3Interpolate = require(\"d3-interpolate\");\n\nvar _continuous = require(\"./continuous.js\");\n\nvar _init = require(\"./init.js\");\n\nvar _linear = require(\"./linear.js\");\n\nvar _log = require(\"./log.js\");\n\nvar _symlog = require(\"./symlog.js\");\n\nvar _pow = require(\"./pow.js\");\n\nfunction transformer() {\n  var x0 = 0,\n      x1 = 1,\n      t0,\n      t1,\n      k10,\n      transform,\n      interpolator = _continuous.identity,\n      clamp = false,\n      unknown;\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n  }\n\n  scale.domain = function (_) {\n    return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];\n  };\n\n  scale.clamp = function (_) {\n    return arguments.length ? (clamp = !!_, scale) : clamp;\n  };\n\n  scale.interpolator = function (_) {\n    return arguments.length ? (interpolator = _, scale) : interpolator;\n  };\n\n  function range(interpolate) {\n    return function (_) {\n      var r0, r1;\n      return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)];\n    };\n  }\n\n  scale.range = range(_d3Interpolate.interpolate);\n  scale.rangeRound = range(_d3Interpolate.interpolateRound);\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  return function (t) {\n    transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n    return scale;\n  };\n}\n\nfunction copy(source, target) {\n  return target.domain(source.domain()).interpolator(source.interpolator()).clamp(source.clamp()).unknown(source.unknown());\n}\n\nfunction sequential() {\n  var scale = (0, _linear.linearish)(transformer()(_continuous.identity));\n\n  scale.copy = function () {\n    return copy(scale, sequential());\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n\nfunction sequentialLog() {\n  var scale = (0, _log.loggish)(transformer()).domain([1, 10]);\n\n  scale.copy = function () {\n    return copy(scale, sequentialLog()).base(scale.base());\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n\nfunction sequentialSymlog() {\n  var scale = (0, _symlog.symlogish)(transformer());\n\n  scale.copy = function () {\n    return copy(scale, sequentialSymlog()).constant(scale.constant());\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n\nfunction sequentialPow() {\n  var scale = (0, _pow.powish)(transformer());\n\n  scale.copy = function () {\n    return copy(scale, sequentialPow()).exponent(scale.exponent());\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n\nfunction sequentialSqrt() {\n  return sequentialPow.apply(null, arguments).exponent(0.5);\n}\n},{\"d3-interpolate\":\"k9aH\",\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\",\"./linear.js\":\"LIJk\",\"./log.js\":\"ea59\",\"./symlog.js\":\"nanU\",\"./pow.js\":\"xeRN\"}],\"XYTZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = sequentialQuantile;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _continuous = require(\"./continuous.js\");\n\nvar _init = require(\"./init.js\");\n\nfunction sequentialQuantile() {\n  var domain = [],\n      interpolator = _continuous.identity;\n\n  function scale(x) {\n    if (!isNaN(x = +x)) return interpolator(((0, _d3Array.bisect)(domain, x, 1) - 1) / (domain.length - 1));\n  }\n\n  scale.domain = function (_) {\n    if (!arguments.length) return domain.slice();\n    domain = [];\n\n    for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d);\n\n    domain.sort(_d3Array.ascending);\n    return scale;\n  };\n\n  scale.interpolator = function (_) {\n    return arguments.length ? (interpolator = _, scale) : interpolator;\n  };\n\n  scale.range = function () {\n    return domain.map((d, i) => interpolator(i / (domain.length - 1)));\n  };\n\n  scale.quantiles = function (n) {\n    return Array.from({\n      length: n + 1\n    }, (_, i) => (0, _d3Array.quantile)(domain, i / n));\n  };\n\n  scale.copy = function () {\n    return sequentialQuantile(interpolator).domain(domain);\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n},{\"d3-array\":\"K0bd\",\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\"}],\"CLse\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = diverging;\nexports.divergingLog = divergingLog;\nexports.divergingSymlog = divergingSymlog;\nexports.divergingPow = divergingPow;\nexports.divergingSqrt = divergingSqrt;\n\nvar _d3Interpolate = require(\"d3-interpolate\");\n\nvar _continuous = require(\"./continuous.js\");\n\nvar _init = require(\"./init.js\");\n\nvar _linear = require(\"./linear.js\");\n\nvar _log = require(\"./log.js\");\n\nvar _sequential = require(\"./sequential.js\");\n\nvar _symlog = require(\"./symlog.js\");\n\nvar _pow = require(\"./pow.js\");\n\nfunction transformer() {\n  var x0 = 0,\n      x1 = 0.5,\n      x2 = 1,\n      s = 1,\n      t0,\n      t1,\n      t2,\n      k10,\n      k21,\n      interpolator = _continuous.identity,\n      transform,\n      clamp = false,\n      unknown;\n\n  function scale(x) {\n    return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));\n  }\n\n  scale.domain = function (_) {\n    return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2];\n  };\n\n  scale.clamp = function (_) {\n    return arguments.length ? (clamp = !!_, scale) : clamp;\n  };\n\n  scale.interpolator = function (_) {\n    return arguments.length ? (interpolator = _, scale) : interpolator;\n  };\n\n  function range(interpolate) {\n    return function (_) {\n      var r0, r1, r2;\n      return arguments.length ? ([r0, r1, r2] = _, interpolator = (0, _d3Interpolate.piecewise)(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)];\n    };\n  }\n\n  scale.range = range(_d3Interpolate.interpolate);\n  scale.rangeRound = range(_d3Interpolate.interpolateRound);\n\n  scale.unknown = function (_) {\n    return arguments.length ? (unknown = _, scale) : unknown;\n  };\n\n  return function (t) {\n    transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1;\n    return scale;\n  };\n}\n\nfunction diverging() {\n  var scale = (0, _linear.linearish)(transformer()(_continuous.identity));\n\n  scale.copy = function () {\n    return (0, _sequential.copy)(scale, diverging());\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n\nfunction divergingLog() {\n  var scale = (0, _log.loggish)(transformer()).domain([0.1, 1, 10]);\n\n  scale.copy = function () {\n    return (0, _sequential.copy)(scale, divergingLog()).base(scale.base());\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n\nfunction divergingSymlog() {\n  var scale = (0, _symlog.symlogish)(transformer());\n\n  scale.copy = function () {\n    return (0, _sequential.copy)(scale, divergingSymlog()).constant(scale.constant());\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n\nfunction divergingPow() {\n  var scale = (0, _pow.powish)(transformer());\n\n  scale.copy = function () {\n    return (0, _sequential.copy)(scale, divergingPow()).exponent(scale.exponent());\n  };\n\n  return _init.initInterpolator.apply(scale, arguments);\n}\n\nfunction divergingSqrt() {\n  return divergingPow.apply(null, arguments).exponent(0.5);\n}\n},{\"d3-interpolate\":\"k9aH\",\"./continuous.js\":\"CjJ5\",\"./init.js\":\"buZa\",\"./linear.js\":\"LIJk\",\"./log.js\":\"ea59\",\"./sequential.js\":\"J7VY\",\"./symlog.js\":\"nanU\",\"./pow.js\":\"xeRN\"}],\"zL2z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"scaleBand\", {\n  enumerable: true,\n  get: function () {\n    return _band.default;\n  }\n});\nObject.defineProperty(exports, \"scalePoint\", {\n  enumerable: true,\n  get: function () {\n    return _band.point;\n  }\n});\nObject.defineProperty(exports, \"scaleIdentity\", {\n  enumerable: true,\n  get: function () {\n    return _identity.default;\n  }\n});\nObject.defineProperty(exports, \"scaleLinear\", {\n  enumerable: true,\n  get: function () {\n    return _linear.default;\n  }\n});\nObject.defineProperty(exports, \"scaleLog\", {\n  enumerable: true,\n  get: function () {\n    return _log.default;\n  }\n});\nObject.defineProperty(exports, \"scaleSymlog\", {\n  enumerable: true,\n  get: function () {\n    return _symlog.default;\n  }\n});\nObject.defineProperty(exports, \"scaleOrdinal\", {\n  enumerable: true,\n  get: function () {\n    return _ordinal.default;\n  }\n});\nObject.defineProperty(exports, \"scaleImplicit\", {\n  enumerable: true,\n  get: function () {\n    return _ordinal.implicit;\n  }\n});\nObject.defineProperty(exports, \"scalePow\", {\n  enumerable: true,\n  get: function () {\n    return _pow.default;\n  }\n});\nObject.defineProperty(exports, \"scaleSqrt\", {\n  enumerable: true,\n  get: function () {\n    return _pow.sqrt;\n  }\n});\nObject.defineProperty(exports, \"scaleRadial\", {\n  enumerable: true,\n  get: function () {\n    return _radial.default;\n  }\n});\nObject.defineProperty(exports, \"scaleQuantile\", {\n  enumerable: true,\n  get: function () {\n    return _quantile.default;\n  }\n});\nObject.defineProperty(exports, \"scaleQuantize\", {\n  enumerable: true,\n  get: function () {\n    return _quantize.default;\n  }\n});\nObject.defineProperty(exports, \"scaleThreshold\", {\n  enumerable: true,\n  get: function () {\n    return _threshold.default;\n  }\n});\nObject.defineProperty(exports, \"scaleTime\", {\n  enumerable: true,\n  get: function () {\n    return _time.default;\n  }\n});\nObject.defineProperty(exports, \"scaleUtc\", {\n  enumerable: true,\n  get: function () {\n    return _utcTime.default;\n  }\n});\nObject.defineProperty(exports, \"scaleSequential\", {\n  enumerable: true,\n  get: function () {\n    return _sequential.default;\n  }\n});\nObject.defineProperty(exports, \"scaleSequentialLog\", {\n  enumerable: true,\n  get: function () {\n    return _sequential.sequentialLog;\n  }\n});\nObject.defineProperty(exports, \"scaleSequentialPow\", {\n  enumerable: true,\n  get: function () {\n    return _sequential.sequentialPow;\n  }\n});\nObject.defineProperty(exports, \"scaleSequentialSqrt\", {\n  enumerable: true,\n  get: function () {\n    return _sequential.sequentialSqrt;\n  }\n});\nObject.defineProperty(exports, \"scaleSequentialSymlog\", {\n  enumerable: true,\n  get: function () {\n    return _sequential.sequentialSymlog;\n  }\n});\nObject.defineProperty(exports, \"scaleSequentialQuantile\", {\n  enumerable: true,\n  get: function () {\n    return _sequentialQuantile.default;\n  }\n});\nObject.defineProperty(exports, \"scaleDiverging\", {\n  enumerable: true,\n  get: function () {\n    return _diverging.default;\n  }\n});\nObject.defineProperty(exports, \"scaleDivergingLog\", {\n  enumerable: true,\n  get: function () {\n    return _diverging.divergingLog;\n  }\n});\nObject.defineProperty(exports, \"scaleDivergingPow\", {\n  enumerable: true,\n  get: function () {\n    return _diverging.divergingPow;\n  }\n});\nObject.defineProperty(exports, \"scaleDivergingSqrt\", {\n  enumerable: true,\n  get: function () {\n    return _diverging.divergingSqrt;\n  }\n});\nObject.defineProperty(exports, \"scaleDivergingSymlog\", {\n  enumerable: true,\n  get: function () {\n    return _diverging.divergingSymlog;\n  }\n});\nObject.defineProperty(exports, \"tickFormat\", {\n  enumerable: true,\n  get: function () {\n    return _tickFormat.default;\n  }\n});\n\nvar _band = _interopRequireWildcard(require(\"./band.js\"));\n\nvar _identity = _interopRequireDefault(require(\"./identity.js\"));\n\nvar _linear = _interopRequireDefault(require(\"./linear.js\"));\n\nvar _log = _interopRequireDefault(require(\"./log.js\"));\n\nvar _symlog = _interopRequireDefault(require(\"./symlog.js\"));\n\nvar _ordinal = _interopRequireWildcard(require(\"./ordinal.js\"));\n\nvar _pow = _interopRequireWildcard(require(\"./pow.js\"));\n\nvar _radial = _interopRequireDefault(require(\"./radial.js\"));\n\nvar _quantile = _interopRequireDefault(require(\"./quantile.js\"));\n\nvar _quantize = _interopRequireDefault(require(\"./quantize.js\"));\n\nvar _threshold = _interopRequireDefault(require(\"./threshold.js\"));\n\nvar _time = _interopRequireDefault(require(\"./time.js\"));\n\nvar _utcTime = _interopRequireDefault(require(\"./utcTime.js\"));\n\nvar _sequential = _interopRequireWildcard(require(\"./sequential.js\"));\n\nvar _sequentialQuantile = _interopRequireDefault(require(\"./sequentialQuantile.js\"));\n\nvar _diverging = _interopRequireWildcard(require(\"./diverging.js\"));\n\nvar _tickFormat = _interopRequireDefault(require(\"./tickFormat.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./band.js\":\"BAgl\",\"./identity.js\":\"FKHe\",\"./linear.js\":\"LIJk\",\"./log.js\":\"ea59\",\"./symlog.js\":\"nanU\",\"./ordinal.js\":\"GjLX\",\"./pow.js\":\"xeRN\",\"./radial.js\":\"mhod\",\"./quantile.js\":\"AGCd\",\"./quantize.js\":\"d6Xk\",\"./threshold.js\":\"I63C\",\"./time.js\":\"kVXt\",\"./utcTime.js\":\"WrbA\",\"./sequential.js\":\"J7VY\",\"./sequentialQuantile.js\":\"XYTZ\",\"./diverging.js\":\"CLse\",\"./tickFormat.js\":\"qjRa\"}],\"i1zw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.band = band;\nexports.point = point;\n\nvar _bandSpace = _interopRequireDefault(require(\"./bandSpace\"));\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Scale = require(\"d3-scale\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction band() {\n  var scale = (0, _d3Scale.scaleOrdinal)().unknown(undefined),\n      domain = scale.domain,\n      ordinalRange = scale.range,\n      range = [0, 1],\n      step,\n      bandwidth,\n      round = false,\n      paddingInner = 0,\n      paddingOuter = 0,\n      align = 0.5;\n  delete scale.unknown;\n\n  function rescale() {\n    var n = domain().length,\n        reverse = range[1] < range[0],\n        start = range[reverse - 0],\n        stop = range[1 - reverse],\n        space = (0, _bandSpace.default)(n, paddingInner, paddingOuter);\n    step = (stop - start) / (space || 1);\n\n    if (round) {\n      step = Math.floor(step);\n    }\n\n    start += (stop - start - step * (n - paddingInner)) * align;\n    bandwidth = step * (1 - paddingInner);\n\n    if (round) {\n      start = Math.round(start);\n      bandwidth = Math.round(bandwidth);\n    }\n\n    var values = (0, _d3Array.range)(n).map(function (i) {\n      return start + step * i;\n    });\n    return ordinalRange(reverse ? values.reverse() : values);\n  }\n\n  scale.domain = function (_) {\n    if (arguments.length) {\n      domain(_);\n      return rescale();\n    } else {\n      return domain();\n    }\n  };\n\n  scale.range = function (_) {\n    if (arguments.length) {\n      range = [+_[0], +_[1]];\n      return rescale();\n    } else {\n      return range.slice();\n    }\n  };\n\n  scale.rangeRound = function (_) {\n    range = [+_[0], +_[1]];\n    round = true;\n    return rescale();\n  };\n\n  scale.bandwidth = function () {\n    return bandwidth;\n  };\n\n  scale.step = function () {\n    return step;\n  };\n\n  scale.round = function (_) {\n    if (arguments.length) {\n      round = !!_;\n      return rescale();\n    } else {\n      return round;\n    }\n  };\n\n  scale.padding = function (_) {\n    if (arguments.length) {\n      paddingOuter = Math.max(0, Math.min(1, _));\n      paddingInner = paddingOuter;\n      return rescale();\n    } else {\n      return paddingInner;\n    }\n  };\n\n  scale.paddingInner = function (_) {\n    if (arguments.length) {\n      paddingInner = Math.max(0, Math.min(1, _));\n      return rescale();\n    } else {\n      return paddingInner;\n    }\n  };\n\n  scale.paddingOuter = function (_) {\n    if (arguments.length) {\n      paddingOuter = Math.max(0, Math.min(1, _));\n      return rescale();\n    } else {\n      return paddingOuter;\n    }\n  };\n\n  scale.align = function (_) {\n    if (arguments.length) {\n      align = Math.max(0, Math.min(1, _));\n      return rescale();\n    } else {\n      return align;\n    }\n  };\n\n  scale.invertRange = function (_) {\n    // bail if range has null or undefined values\n    if (_[0] == null || _[1] == null) return;\n    var lo = +_[0],\n        hi = +_[1],\n        reverse = range[1] < range[0],\n        values = reverse ? ordinalRange().reverse() : ordinalRange(),\n        n = values.length - 1,\n        a,\n        b,\n        t; // bail if either range endpoint is invalid\n\n    if (lo !== lo || hi !== hi) return; // order range inputs, bail if outside of scale range\n\n    if (hi < lo) {\n      t = lo;\n      lo = hi;\n      hi = t;\n    }\n\n    if (hi < values[0] || lo > range[1 - reverse]) return; // binary search to index into scale range\n\n    a = Math.max(0, (0, _d3Array.bisectRight)(values, lo) - 1);\n    b = lo === hi ? a : (0, _d3Array.bisectRight)(values, hi) - 1; // increment index a if lo is within padding gap\n\n    if (lo - values[a] > bandwidth + 1e-10) ++a;\n\n    if (reverse) {\n      // map + swap\n      t = a;\n      a = n - b;\n      b = n - t;\n    }\n\n    return a > b ? undefined : domain().slice(a, b + 1);\n  };\n\n  scale.invert = function (_) {\n    var value = scale.invertRange([_, _]);\n    return value ? value[0] : value;\n  };\n\n  scale.copy = function () {\n    return band().domain(domain()).range(range).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n  };\n\n  return rescale();\n}\n\nfunction pointish(scale) {\n  var copy = scale.copy;\n  scale.padding = scale.paddingOuter;\n  delete scale.paddingInner;\n\n  scale.copy = function () {\n    return pointish(copy());\n  };\n\n  return scale;\n}\n\nfunction point() {\n  return pointish(band().paddingInner(1));\n}\n},{\"./bandSpace\":\"pQB2\",\"d3-array\":\"K0bd\",\"d3-scale\":\"zL2z\"}],\"f15w\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.numbers = numbers;\nvar map = Array.prototype.map;\n\nfunction numbers(_) {\n  return map.call(_, function (x) {\n    return +x;\n  });\n}\n},{}],\"wAze\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.scaleBinOrdinal = scaleBinOrdinal;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Scale = require(\"d3-scale\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _numbers = require(\"./numbers\");\n\nvar _slice = require(\"./slice\");\n\nfunction scaleBinOrdinal() {\n  var domain = [],\n      range = [];\n\n  function scale(x) {\n    return x == null || x !== x ? undefined : range[((0, _d3Array.bisect)(domain, x) - 1) % range.length];\n  }\n\n  scale.domain = function (_) {\n    if (arguments.length) {\n      domain = (0, _numbers.numbers)(_);\n      return scale;\n    } else {\n      return domain.slice();\n    }\n  };\n\n  scale.range = function (_) {\n    if (arguments.length) {\n      range = _slice.slice.call(_);\n      return scale;\n    } else {\n      return range.slice();\n    }\n  };\n\n  scale.tickFormat = function (count, specifier) {\n    return (0, _d3Scale.tickFormat)(domain[0], (0, _vegaUtil.peek)(domain), count == null ? 10 : count, specifier);\n  };\n\n  scale.copy = function () {\n    return scaleBinOrdinal().domain(scale.domain()).range(scale.range());\n  };\n\n  return scale;\n}\n},{\"d3-array\":\"K0bd\",\"d3-scale\":\"zL2z\",\"vega-util\":\"d61Z\",\"./numbers\":\"f15w\",\"./slice\":\"mkFC\"}],\"XuJh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = scale;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _invertRange = _interopRequireDefault(require(\"./scales/invertRange\"));\n\nvar _invertRangeExtent = _interopRequireDefault(require(\"./scales/invertRangeExtent\"));\n\nvar _types = require(\"./scales/types\");\n\nvar _scaleBand = require(\"./scales/scaleBand\");\n\nvar _scaleBinOrdinal = require(\"./scales/scaleBinOrdinal\");\n\nvar $ = _interopRequireWildcard(require(\"d3-scale\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Augment scales with their type and needed inverse methods.\n */\nfunction create(type, constructor) {\n  return function scale() {\n    var s = constructor();\n\n    if (!s.invertRange) {\n      s.invertRange = s.invert ? (0, _invertRange.default)(s) : s.invertExtent ? (0, _invertRangeExtent.default)(s) : undefined;\n    }\n\n    s.type = type;\n    return s;\n  };\n}\n\nfunction scale(type, scale) {\n  if (arguments.length > 1) {\n    scales[type] = create(type, scale);\n    return this;\n  } else {\n    return (0, _vegaUtil.hasOwnProperty)(scales, type) ? scales[type] : undefined;\n  }\n}\n\nvar scales = {\n  // identity scale\n  [_types.Identity]: $.scaleIdentity,\n  // continuous scales\n  [_types.Linear]: $.scaleLinear,\n  [_types.Log]: $.scaleLog,\n  [_types.Pow]: $.scalePow,\n  [_types.Sqrt]: $.scaleSqrt,\n  [_types.Symlog]: $.scaleSymlog,\n  [_types.Time]: $.scaleTime,\n  [_types.UTC]: $.scaleUtc,\n  // sequential scales\n  [_types.Sequential]: $.scaleSequential,\n  // backwards compat\n  [_types.Sequential + '-' + _types.Linear]: $.scaleSequential,\n  [_types.Sequential + '-' + _types.Log]: $.scaleSequentialLog,\n  [_types.Sequential + '-' + _types.Pow]: $.scaleSequentialPow,\n  [_types.Sequential + '-' + _types.Sqrt]: $.scaleSequentialSqrt,\n  [_types.Sequential + '-' + _types.Symlog]: $.scaleSequentialSymlog,\n  // diverging scales\n  [_types.Diverging + '-' + _types.Linear]: $.scaleDiverging,\n  [_types.Diverging + '-' + _types.Log]: $.scaleDivergingLog,\n  [_types.Diverging + '-' + _types.Pow]: $.scaleDivergingPow,\n  [_types.Diverging + '-' + _types.Sqrt]: $.scaleDivergingSqrt,\n  [_types.Diverging + '-' + _types.Symlog]: $.scaleDivergingSymlog,\n  // discretizing scales\n  [_types.Quantile]: $.scaleQuantile,\n  [_types.Quantize]: $.scaleQuantize,\n  [_types.Threshold]: $.scaleThreshold,\n  // discrete scales\n  [_types.BinOrdinal]: _scaleBinOrdinal.scaleBinOrdinal,\n  [_types.Ordinal]: $.scaleOrdinal,\n  [_types.Band]: _scaleBand.band,\n  [_types.Point]: _scaleBand.point\n};\n\nfor (var key in scales) {\n  scale(key, scales[key]);\n}\n},{\"vega-util\":\"d61Z\",\"./scales/invertRange\":\"aszk\",\"./scales/invertRangeExtent\":\"iE4m\",\"./scales/types\":\"IeaR\",\"./scales/scaleBand\":\"i1zw\",\"./scales/scaleBinOrdinal\":\"wAze\",\"d3-scale\":\"zL2z\"}],\"gOHz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.interpolateRange = interpolateRange;\nexports.interpolateColors = interpolateColors;\nexports.quantizeInterpolator = quantizeInterpolator;\nexports.scaleCopy = scaleCopy;\nexports.scaleFraction = scaleFraction;\nexports.interpolate = interpolate;\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar $ = _interopRequireWildcard(require(\"d3-interpolate\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst scaleProps = ['clamp', 'base', 'constant', 'exponent'];\n\nfunction interpolateRange(interpolator, range) {\n  var start = range[0],\n      span = (0, _vegaUtil.peek)(range) - start;\n  return function (i) {\n    return interpolator(start + i * span);\n  };\n}\n\nfunction interpolateColors(colors, type, gamma) {\n  return $.piecewise(interpolate(type || 'rgb', gamma), colors);\n}\n\nfunction quantizeInterpolator(interpolator, count) {\n  var samples = new Array(count),\n      n = count + 1;\n\n  for (var i = 0; i < count;) samples[i] = interpolator(++i / n);\n\n  return samples;\n}\n\nfunction scaleCopy(scale) {\n  const t = scale.type,\n        s = scale.copy();\n  s.type = t;\n  return s;\n}\n\nfunction scaleFraction(scale, min, max) {\n  var delta = max - min,\n      i,\n      t,\n      s;\n\n  if (!delta || !Number.isFinite(delta)) {\n    return (0, _vegaUtil.constant)(0.5);\n  } else {\n    i = (t = scale.type).indexOf('-');\n    t = i < 0 ? t : t.slice(i + 1);\n    s = (0, _scales.default)(t)().domain([min, max]).range([0, 1]);\n    scaleProps.forEach(m => scale[m] ? s[m](scale[m]()) : 0);\n    return s;\n  }\n}\n\nfunction interpolate(type, gamma) {\n  var interp = $[method(type)];\n  return gamma != null && interp && interp.gamma ? interp.gamma(gamma) : interp;\n}\n\nfunction method(type) {\n  return 'interpolate' + type.toLowerCase().split('-').map(function (s) {\n    return s[0].toUpperCase() + s.slice(1);\n  }).join('');\n}\n},{\"./scales\":\"XuJh\",\"vega-util\":\"d61Z\",\"d3-interpolate\":\"k9aH\"}],\"uZPe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.discrete = exports.continuous = void 0;\nconst continuous = {\n  blues: 'cfe1f2bed8eca8cee58fc1de74b2d75ba3cf4592c63181bd206fb2125ca40a4a90',\n  greens: 'd3eecdc0e6baabdda594d3917bc77d60ba6c46ab5e329a512089430e7735036429',\n  greys: 'e2e2e2d4d4d4c4c4c4b1b1b19d9d9d8888887575756262624d4d4d3535351e1e1e',\n  oranges: 'fdd8b3fdc998fdb87bfda55efc9244f87f2cf06b18e4580bd14904b93d029f3303',\n  purples: 'e2e1efd4d4e8c4c5e0b4b3d6a3a0cc928ec3827cb97566ae684ea25c3696501f8c',\n  reds: 'fdc9b4fcb49afc9e80fc8767fa7051f6573fec3f2fdc2a25c81b1db21218970b13',\n  blueGreen: 'd5efedc1e8e0a7ddd18bd2be70c6a958ba9144ad77319c5d2089460e7736036429',\n  bluePurple: 'ccddecbad0e4a8c2dd9ab0d4919cc98d85be8b6db28a55a6873c99822287730f71',\n  greenBlue: 'd3eecec5e8c3b1e1bb9bd8bb82cec269c2ca51b2cd3c9fc7288abd1675b10b60a1',\n  orangeRed: 'fddcaffdcf9bfdc18afdad77fb9562f67d53ee6545e24932d32d1ebf130da70403',\n  purpleBlue: 'dbdaebc8cee4b1c3de97b7d87bacd15b9fc93a90c01e7fb70b70ab056199045281',\n  purpleBlueGreen: 'dbd8eac8cee4b0c3de93b7d872acd1549fc83892bb1c88a3097f8702736b016353',\n  purpleRed: 'dcc9e2d3b3d7ce9eccd186c0da6bb2e14da0e23189d91e6fc61159ab07498f023a',\n  redPurple: 'fccfccfcbec0faa9b8f98faff571a5ec539ddb3695c41b8aa908808d0179700174',\n  yellowGreen: 'e4f4acd1eca0b9e2949ed68880c97c62bb6e47aa5e3297502083440e723b036034',\n  yellowOrangeBrown: 'feeaa1fedd84fecc63feb746fca031f68921eb7215db5e0bc54c05ab3d038f3204',\n  yellowOrangeRed: 'fee087fed16ffebd59fea849fd903efc7335f9522bee3423de1b20ca0b22af0225',\n  blueOrange: '134b852f78b35da2cb9dcae1d2e5eff2f0ebfce0bafbbf74e8932fc5690d994a07',\n  brownBlueGreen: '704108a0651ac79548e3c78af3e6c6eef1eac9e9e48ed1c74da79e187a72025147',\n  purpleGreen: '5b1667834792a67fb6c9aed3e6d6e8eff0efd9efd5aedda971bb75368e490e5e29',\n  purpleOrange: '4114696647968f83b7b9b4d6dadbebf3eeeafce0bafbbf74e8932fc5690d994a07',\n  redBlue: '8c0d25bf363adf745ef4ae91fbdbc9f2efeed2e5ef9dcae15da2cb2f78b3134b85',\n  redGrey: '8c0d25bf363adf745ef4ae91fcdccbfaf4f1e2e2e2c0c0c0969696646464343434',\n  yellowGreenBlue: 'eff9bddbf1b4bde5b594d5b969c5be45b4c22c9ec02182b82163aa23479c1c3185',\n  redYellowBlue: 'a50026d4322cf16e43fcac64fedd90faf8c1dcf1ecabd6e875abd04a74b4313695',\n  redYellowGreen: 'a50026d4322cf16e43fcac63fedd8df9f7aed7ee8ea4d86e64bc6122964f006837',\n  pinkYellowGreen: '8e0152c0267edd72adf0b3d6faddedf5f3efe1f2cab6de8780bb474f9125276419',\n  spectral: '9e0142d13c4bf0704afcac63fedd8dfbf8b0e0f3a1a9dda269bda94288b55e4fa2',\n  viridis: '440154470e61481a6c482575472f7d443a834144873d4e8a39568c35608d31688e2d708e2a788e27818e23888e21918d1f988b1fa08822a8842ab07f35b77943bf7154c56866cc5d7ad1518fd744a5db36bcdf27d2e21be9e51afde725',\n  magma: '0000040404130b0924150e3720114b2c11603b0f704a107957157e651a80721f817f24828c29819a2e80a8327db6377ac43c75d1426fde4968e95462f1605df76f5cfa7f5efc8f65fe9f6dfeaf78febf84fece91fddea0fcedaffcfdbf',\n  inferno: '0000040403130c0826170c3b240c4f330a5f420a68500d6c5d126e6b176e781c6d86216b932667a12b62ae305cbb3755c73e4cd24644dd513ae65c30ed6925f3771af8850ffb9506fca50afcb519fac62df6d645f2e661f3f484fcffa4',\n  plasma: '0d088723069033059742039d5002a25d01a66a00a87801a88405a7900da49c179ea72198b12a90ba3488c33d80cb4779d35171da5a69e16462e76e5bed7953f2834cf68f44fa9a3dfca636fdb32ffec029fcce25f9dc24f5ea27f0f921',\n  rainbow: '6e40aa883eb1a43db3bf3cafd83fa4ee4395fe4b83ff576eff6659ff7847ff8c38f3a130e2b72fcfcc36bee044aff05b8ff4576ff65b52f6673af27828ea8d1ddfa319d0b81cbecb23abd82f96e03d82e14c6edb5a5dd0664dbf6e40aa',\n  sinebow: 'ff4040fc582af47218e78d0bd5a703bfbf00a7d5038de70b72f41858fc2a40ff402afc5818f4720be78d03d5a700bfbf03a7d50b8de71872f42a58fc4040ff582afc7218f48d0be7a703d5bf00bfd503a7e70b8df41872fc2a58ff4040',\n  browns: 'eedbbdecca96e9b97ae4a865dc9856d18954c7784cc0673fb85536ad44339f3632',\n  tealBlues: 'bce4d89dd3d181c3cb65b3c245a2b9368fae347da0306a932c5985',\n  teals: 'bbdfdfa2d4d58ac9c975bcbb61b0af4da5a43799982b8b8c1e7f7f127273006667',\n  warmGreys: 'dcd4d0cec5c1c0b8b4b3aaa7a59c9998908c8b827f7e7673726866665c5a59504e',\n  goldGreen: 'f4d166d5ca60b6c35c98bb597cb25760a6564b9c533f8f4f33834a257740146c36',\n  goldOrange: 'f4d166f8be5cf8aa4cf5983bf3852aef701be2621fd65322c54923b142239e3a26',\n  goldRed: 'f4d166f6be59f9aa51fc964ef6834bee734ae56249db5247cf4244c43141b71d3e',\n  lightGreyRed: 'efe9e6e1dad7d5cbc8c8bdb9bbaea9cd967ddc7b43e15f19df4011dc000b',\n  lightGreyTeal: 'e4eaead6dcddc8ced2b7c2c7a6b4bc64b0bf22a6c32295c11f85be1876bc',\n  lightMulti: 'e0f1f2c4e9d0b0de9fd0e181f6e072f6c053f3993ef77440ef4a3c',\n  lightOrange: 'f2e7daf7d5baf9c499fab184fa9c73f68967ef7860e8645bde515bd43d5b',\n  lightTealBlue: 'e3e9e0c0dccf9aceca7abfc859afc0389fb9328dad2f7ca0276b95255988',\n  darkBlue: '3232322d46681a5c930074af008cbf05a7ce25c0dd38daed50f3faffffff',\n  darkGold: '3c3c3c584b37725e348c7631ae8b2bcfa424ecc31ef9de30fff184ffffff',\n  darkGreen: '3a3a3a215748006f4d048942489e4276b340a6c63dd2d836ffeb2cffffaa',\n  darkMulti: '3737371f5287197d8c29a86995ce3fffe800ffffff',\n  darkRed: '3434347036339e3c38cc4037e75d1eec8620eeab29f0ce32ffeb2c'\n};\nexports.continuous = continuous;\nconst discrete = {\n  category10: '1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf',\n  category20: '1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5',\n  category20b: '393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6',\n  category20c: '3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9',\n  tableau10: '4c78a8f58518e4575672b7b254a24beeca3bb279a2ff9da69d755dbab0ac',\n  tableau20: '4c78a89ecae9f58518ffbf7954a24b88d27ab79a20f2cf5b43989483bcb6e45756ff9d9879706ebab0acd67195fcbfd2b279a2d6a5c99e765fd8b5a5',\n  accent: '7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666',\n  dark2: '1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666',\n  paired: 'a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928',\n  pastel1: 'fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2',\n  pastel2: 'b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc',\n  set1: 'e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999',\n  set2: '66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3',\n  set3: '8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f'\n};\nexports.discrete = discrete;\n},{}],\"WWd4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.scheme = scheme;\n\nvar _palettes = require(\"./palettes\");\n\nvar _interpolate = require(\"./interpolate\");\n\nfunction colors(palette) {\n  var n = palette.length / 6 | 0,\n      c = new Array(n),\n      i = 0;\n\n  while (i < n) c[i] = '#' + palette.slice(i * 6, ++i * 6);\n\n  return c;\n}\n\nfunction apply(_, f) {\n  for (let k in _) scheme(k, f(_[k]));\n}\n\nconst schemes = {};\napply(_palettes.discrete, colors);\napply(_palettes.continuous, _ => (0, _interpolate.interpolateColors)(colors(_)));\n\nfunction scheme(name, scheme) {\n  name = name && name.toLowerCase();\n\n  if (arguments.length > 1) {\n    schemes[name] = scheme;\n    return this;\n  } else {\n    return schemes[name];\n  }\n}\n},{\"./palettes\":\"uZPe\",\"./interpolate\":\"gOHz\"}],\"N8iK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"bandSpace\", {\n  enumerable: true,\n  get: function () {\n    return _bandSpace.default;\n  }\n});\nObject.defineProperty(exports, \"Identity\", {\n  enumerable: true,\n  get: function () {\n    return _types.Identity;\n  }\n});\nObject.defineProperty(exports, \"Linear\", {\n  enumerable: true,\n  get: function () {\n    return _types.Linear;\n  }\n});\nObject.defineProperty(exports, \"Log\", {\n  enumerable: true,\n  get: function () {\n    return _types.Log;\n  }\n});\nObject.defineProperty(exports, \"Pow\", {\n  enumerable: true,\n  get: function () {\n    return _types.Pow;\n  }\n});\nObject.defineProperty(exports, \"Sqrt\", {\n  enumerable: true,\n  get: function () {\n    return _types.Sqrt;\n  }\n});\nObject.defineProperty(exports, \"Symlog\", {\n  enumerable: true,\n  get: function () {\n    return _types.Symlog;\n  }\n});\nObject.defineProperty(exports, \"Time\", {\n  enumerable: true,\n  get: function () {\n    return _types.Time;\n  }\n});\nObject.defineProperty(exports, \"UTC\", {\n  enumerable: true,\n  get: function () {\n    return _types.UTC;\n  }\n});\nObject.defineProperty(exports, \"Sequential\", {\n  enumerable: true,\n  get: function () {\n    return _types.Sequential;\n  }\n});\nObject.defineProperty(exports, \"Diverging\", {\n  enumerable: true,\n  get: function () {\n    return _types.Diverging;\n  }\n});\nObject.defineProperty(exports, \"Quantile\", {\n  enumerable: true,\n  get: function () {\n    return _types.Quantile;\n  }\n});\nObject.defineProperty(exports, \"Quantize\", {\n  enumerable: true,\n  get: function () {\n    return _types.Quantize;\n  }\n});\nObject.defineProperty(exports, \"Threshold\", {\n  enumerable: true,\n  get: function () {\n    return _types.Threshold;\n  }\n});\nObject.defineProperty(exports, \"BinOrdinal\", {\n  enumerable: true,\n  get: function () {\n    return _types.BinOrdinal;\n  }\n});\nObject.defineProperty(exports, \"Ordinal\", {\n  enumerable: true,\n  get: function () {\n    return _types.Ordinal;\n  }\n});\nObject.defineProperty(exports, \"Band\", {\n  enumerable: true,\n  get: function () {\n    return _types.Band;\n  }\n});\nObject.defineProperty(exports, \"Point\", {\n  enumerable: true,\n  get: function () {\n    return _types.Point;\n  }\n});\nObject.defineProperty(exports, \"isValidScaleType\", {\n  enumerable: true,\n  get: function () {\n    return _types.isValidScaleType;\n  }\n});\nObject.defineProperty(exports, \"isTemporal\", {\n  enumerable: true,\n  get: function () {\n    return _types.isTemporal;\n  }\n});\nObject.defineProperty(exports, \"isQuantile\", {\n  enumerable: true,\n  get: function () {\n    return _types.isQuantile;\n  }\n});\nObject.defineProperty(exports, \"isSequential\", {\n  enumerable: true,\n  get: function () {\n    return _types.isSequential;\n  }\n});\nObject.defineProperty(exports, \"isDiverging\", {\n  enumerable: true,\n  get: function () {\n    return _types.isDiverging;\n  }\n});\nObject.defineProperty(exports, \"isInterpolating\", {\n  enumerable: true,\n  get: function () {\n    return _types.isInterpolating;\n  }\n});\nObject.defineProperty(exports, \"isContinuous\", {\n  enumerable: true,\n  get: function () {\n    return _types.isContinuous;\n  }\n});\nObject.defineProperty(exports, \"isLogarithmic\", {\n  enumerable: true,\n  get: function () {\n    return _types.isLogarithmic;\n  }\n});\nObject.defineProperty(exports, \"isDiscrete\", {\n  enumerable: true,\n  get: function () {\n    return _types.isDiscrete;\n  }\n});\nObject.defineProperty(exports, \"isDiscretizing\", {\n  enumerable: true,\n  get: function () {\n    return _types.isDiscretizing;\n  }\n});\nObject.defineProperty(exports, \"interpolate\", {\n  enumerable: true,\n  get: function () {\n    return _interpolate.interpolate;\n  }\n});\nObject.defineProperty(exports, \"interpolateColors\", {\n  enumerable: true,\n  get: function () {\n    return _interpolate.interpolateColors;\n  }\n});\nObject.defineProperty(exports, \"interpolateRange\", {\n  enumerable: true,\n  get: function () {\n    return _interpolate.interpolateRange;\n  }\n});\nObject.defineProperty(exports, \"scaleCopy\", {\n  enumerable: true,\n  get: function () {\n    return _interpolate.scaleCopy;\n  }\n});\nObject.defineProperty(exports, \"scaleFraction\", {\n  enumerable: true,\n  get: function () {\n    return _interpolate.scaleFraction;\n  }\n});\nObject.defineProperty(exports, \"quantizeInterpolator\", {\n  enumerable: true,\n  get: function () {\n    return _interpolate.quantizeInterpolator;\n  }\n});\nObject.defineProperty(exports, \"scale\", {\n  enumerable: true,\n  get: function () {\n    return _scales.default;\n  }\n});\nObject.defineProperty(exports, \"scheme\", {\n  enumerable: true,\n  get: function () {\n    return _schemes.scheme;\n  }\n});\nObject.defineProperty(exports, \"scaleImplicit\", {\n  enumerable: true,\n  get: function () {\n    return _d3Scale.scaleImplicit;\n  }\n});\nObject.defineProperty(exports, \"tickFormat\", {\n  enumerable: true,\n  get: function () {\n    return _d3Scale.tickFormat;\n  }\n});\n\nvar _bandSpace = _interopRequireDefault(require(\"./src/scales/bandSpace\"));\n\nvar _types = require(\"./src/scales/types\");\n\nvar _interpolate = require(\"./src/interpolate\");\n\nvar _scales = _interopRequireDefault(require(\"./src/scales\"));\n\nvar _schemes = require(\"./src/schemes\");\n\nvar _d3Scale = require(\"d3-scale\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/scales/bandSpace\":\"pQB2\",\"./src/scales/types\":\"IeaR\",\"./src/interpolate\":\"gOHz\",\"./src/scales\":\"XuJh\",\"./src/schemes\":\"WWd4\",\"d3-scale\":\"zL2z\"}],\"x5Ab\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.tickCount = tickCount;\nexports.validTicks = validTicks;\nexports.tickValues = tickValues;\nexports.tickFormat = tickFormat;\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _vegaTime = require(\"vega-time\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Format = require(\"d3-format\");\n\n/**\n * Determine the tick count or interval function.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {*} count - The desired tick count or interval specifier.\n * @param {number} minStep - The desired minimum step between tick values.\n * @return {*} - The tick count or interval function.\n */\nfunction tickCount(scale, count, minStep) {\n  var step;\n\n  if ((0, _vegaUtil.isNumber)(count)) {\n    if (scale.bins) {\n      count = Math.max(count, scale.bins.length);\n    }\n\n    if (minStep != null) {\n      count = Math.min(count, ~~((0, _vegaUtil.span)(scale.domain()) / minStep) || 1);\n    }\n  }\n\n  if ((0, _vegaUtil.isObject)(count)) {\n    step = count.step;\n    count = count.interval;\n  }\n\n  if ((0, _vegaUtil.isString)(count)) {\n    count = scale.type === _vegaScale.Time ? (0, _vegaTime.timeInterval)(count) : scale.type == _vegaScale.UTC ? (0, _vegaTime.utcInterval)(count) : (0, _vegaUtil.error)('Only time and utc scales accept interval strings.');\n    if (step) count = count.every(step);\n  }\n\n  return count;\n}\n/**\n * Filter a set of candidate tick values, ensuring that only tick values\n * that lie within the scale range are included.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {Array<*>} ticks - The candidate tick values.\n * @param {*} count - The tick count or interval function.\n * @return {Array<*>} - The filtered tick values.\n */\n\n\nfunction validTicks(scale, ticks, count) {\n  var range = scale.range(),\n      lo = Math.floor(range[0]),\n      hi = Math.ceil((0, _vegaUtil.peek)(range));\n\n  if (lo > hi) {\n    range = hi;\n    hi = lo;\n    lo = range;\n  }\n\n  ticks = ticks.filter(function (v) {\n    v = scale(v);\n    return lo <= v && v <= hi;\n  });\n\n  if (count > 0 && ticks.length > 1) {\n    var endpoints = [ticks[0], (0, _vegaUtil.peek)(ticks)];\n\n    while (ticks.length > count && ticks.length >= 3) {\n      ticks = ticks.filter(function (_, i) {\n        return !(i % 2);\n      });\n    }\n\n    if (ticks.length < 3) {\n      ticks = endpoints;\n    }\n  }\n\n  return ticks;\n}\n/**\n * Generate tick values for the given scale and approximate tick count or\n * interval value. If the scale has a 'ticks' method, it will be used to\n * generate the ticks, with the count argument passed as a parameter. If the\n * scale lacks a 'ticks' method, the full scale domain will be returned.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {*} [count] - The approximate number of desired ticks.\n * @return {Array<*>} - The generated tick values.\n */\n\n\nfunction tickValues(scale, count) {\n  return scale.bins ? validTicks(scale, scale.bins) : scale.ticks ? scale.ticks(count) : scale.domain();\n}\n/**\n * Generate a label format function for a scale. If the scale has a\n * 'tickFormat' method, it will be used to generate the formatter, with the\n * count and specifier arguments passed as parameters. If the scale lacks a\n * 'tickFormat' method, the returned formatter performs simple string coercion.\n * If the input scale is a logarithmic scale and the format specifier does not\n * indicate a desired decimal precision, a special variable precision formatter\n * that automatically trims trailing zeroes will be generated.\n * @param {Scale} scale - The scale for which to generate the label formatter.\n * @param {*} [count] - The approximate number of desired ticks.\n * @param {string} [specifier] - The format specifier. Must be a legal d3\n *   specifier string (see https://github.com/d3/d3-format#formatSpecifier) or\n *   time multi-format specifier object.\n * @return {function(*):string} - The generated label formatter.\n */\n\n\nfunction tickFormat(scale, count, specifier, formatType, noSkip) {\n  var type = scale.type,\n      format = type === _vegaScale.Time || formatType === _vegaScale.Time ? (0, _vegaTime.timeFormat)(specifier) : type === _vegaScale.UTC || formatType === _vegaScale.UTC ? (0, _vegaTime.utcFormat)(specifier) : scale.tickFormat ? scale.tickFormat(count, specifier) : specifier ? (0, _d3Format.format)(specifier) : String;\n\n  if ((0, _vegaScale.isLogarithmic)(type)) {\n    var logfmt = variablePrecision(specifier);\n    format = noSkip || scale.bins ? logfmt : filter(format, logfmt);\n  }\n\n  return format;\n}\n\nfunction filter(sourceFormat, targetFormat) {\n  return _ => sourceFormat(_) ? targetFormat(_) : '';\n}\n\nfunction variablePrecision(specifier) {\n  var s = (0, _d3Format.formatSpecifier)(specifier || ',');\n\n  if (s.precision == null) {\n    s.precision = 12;\n\n    switch (s.type) {\n      case '%':\n        s.precision -= 2;\n        break;\n\n      case 'e':\n        s.precision -= 1;\n        break;\n    }\n\n    return trimZeroes((0, _d3Format.format)(s), // number format\n    (0, _d3Format.format)('.1f')(1)[1] // decimal point character\n    );\n  } else {\n    return (0, _d3Format.format)(s);\n  }\n}\n\nfunction trimZeroes(format, decimalChar) {\n  return function (x) {\n    var str = format(x),\n        dec = str.indexOf(decimalChar),\n        idx,\n        end;\n    if (dec < 0) return str;\n    idx = rightmostDigit(str, dec);\n    end = idx < str.length ? str.slice(idx) : '';\n\n    while (--idx > dec) if (str[idx] !== '0') {\n      ++idx;\n      break;\n    }\n\n    return str.slice(0, idx) + end;\n  };\n}\n\nfunction rightmostDigit(str, dec) {\n  var i = str.lastIndexOf('e'),\n      c;\n  if (i > 0) return i;\n\n  for (i = str.length; --i > dec;) {\n    c = str.charCodeAt(i);\n    if (c >= 48 && c <= 57) return i + 1; // is digit\n  }\n}\n},{\"vega-scale\":\"N8iK\",\"vega-time\":\"ErfR\",\"vega-util\":\"d61Z\",\"d3-format\":\"VuZR\"}],\"yZNT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = AxisTicks;\n\nvar _ticks = require(\"./ticks\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Generates axis ticks for visualizing a spatial scale.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Scale} params.scale - The scale to generate ticks for.\n * @param {*} [params.count=10] - The approximate number of ticks, or\n *   desired tick interval, to use.\n * @param {Array<*>} [params.values] - The exact tick values to use.\n *   These must be legal domain values for the provided scale.\n *   If provided, the count argument is ignored.\n * @param {function(*):string} [params.formatSpecifier] - A format specifier\n *   to use in conjunction with scale.tickFormat. Legal values are\n *   any valid d3 4.0 format specifier.\n * @param {function(*):string} [params.format] - The format function to use.\n *   If provided, the formatSpecifier argument is ignored.\n */\nfunction AxisTicks(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(AxisTicks, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (this.value && !_.modified()) {\n    return pulse.StopPropagation;\n  }\n\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      ticks = this.value,\n      scale = _.scale,\n      tally = _.count == null ? _.values ? _.values.length : 10 : _.count,\n      count = (0, _ticks.tickCount)(scale, tally, _.minstep),\n      format = _.format || (0, _ticks.tickFormat)(scale, count, _.formatSpecifier, _.formatType, !!_.values),\n      values = _.values ? (0, _ticks.validTicks)(scale, _.values, count) : (0, _ticks.tickValues)(scale, count);\n  if (ticks) out.rem = ticks;\n  ticks = values.map(function (value, i) {\n    return (0, _vegaDataflow.ingest)({\n      index: i / (values.length - 1 || 1),\n      value: value,\n      label: format(value)\n    });\n  });\n\n  if (_.extra && ticks.length) {\n    // add an extra tick pegged to the initial domain value\n    // this is used to generate axes with 'binned' domains\n    ticks.push((0, _vegaDataflow.ingest)({\n      index: -1,\n      extra: {\n        value: ticks[0].value\n      },\n      label: ''\n    }));\n  }\n\n  out.source = ticks;\n  out.add = ticks;\n  this.value = ticks;\n  return out;\n};\n},{\"./ticks\":\"x5Ab\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"YewA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = DataJoin;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Joins a set of data elements against a set of visual items.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): object} [params.item] - An item generator function.\n * @param {function(object): *} [params.key] - The key field associating data and visual items.\n */\nfunction DataJoin(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(DataJoin, _vegaDataflow.Transform);\n\nfunction defaultItemCreate() {\n  return (0, _vegaDataflow.ingest)({});\n}\n\nfunction isExit(t) {\n  return t.exit;\n}\n\nprototype.transform = function (_, pulse) {\n  var df = pulse.dataflow,\n      out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      item = _.item || defaultItemCreate,\n      key = _.key || _vegaDataflow.tupleid,\n      map = this.value; // prevent transient (e.g., hover) requests from\n  // cascading across marks derived from marks\n\n  if ((0, _vegaUtil.isArray)(out.encode)) {\n    out.encode = null;\n  }\n\n  if (map && (_.modified('key') || pulse.modified(key))) {\n    (0, _vegaUtil.error)('DataJoin does not support modified key function or fields.');\n  }\n\n  if (!map) {\n    pulse = pulse.addAll();\n    this.value = map = (0, _vegaUtil.fastmap)().test(isExit);\n\n    map.lookup = function (t) {\n      return map.get(key(t));\n    };\n  }\n\n  pulse.visit(pulse.ADD, function (t) {\n    var k = key(t),\n        x = map.get(k);\n\n    if (x) {\n      if (x.exit) {\n        map.empty--;\n        out.add.push(x);\n      } else {\n        out.mod.push(x);\n      }\n    } else {\n      map.set(k, x = item(t));\n      out.add.push(x);\n    }\n\n    x.datum = t;\n    x.exit = false;\n  });\n  pulse.visit(pulse.MOD, function (t) {\n    var k = key(t),\n        x = map.get(k);\n\n    if (x) {\n      x.datum = t;\n      out.mod.push(x);\n    }\n  });\n  pulse.visit(pulse.REM, function (t) {\n    var k = key(t),\n        x = map.get(k);\n\n    if (t === x.datum && !x.exit) {\n      out.rem.push(x);\n      x.exit = true;\n      ++map.empty;\n    }\n  });\n  if (pulse.changed(pulse.ADD_MOD)) out.modifies('datum');\n  if (_.clean && map.empty > df.cleanThreshold) df.runAfter(map.clean);\n  return out;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"lme1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Encode;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Invokes encoding functions for visual items.\n * @constructor\n * @param {object} params - The parameters to the encoding functions. This\n *   parameter object will be passed through to all invoked encoding functions.\n * @param {object} [params.mod=false] - Flag indicating if tuples in the input\n *   mod set that are unmodified by encoders should be included in the output.\n * @param {object} param.encoders - The encoding functions\n * @param {function(object, object): boolean} [param.encoders.update] - Update encoding set\n * @param {function(object, object): boolean} [param.encoders.enter] - Enter encoding set\n * @param {function(object, object): boolean} [param.encoders.exit] - Exit encoding set\n */\nfunction Encode(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Encode, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.ADD_REM),\n      fmod = _.mod || false,\n      encoders = _.encoders,\n      encode = pulse.encode; // if an array, the encode directive includes additional sets\n  // that must be defined in order for the primary set to be invoked\n  // e.g., only run the update set if the hover set is defined\n\n  if ((0, _vegaUtil.isArray)(encode)) {\n    if (out.changed() || encode.every(function (e) {\n      return encoders[e];\n    })) {\n      encode = encode[0];\n      out.encode = null; // consume targeted encode directive\n    } else {\n      return pulse.StopPropagation;\n    }\n  } // marshall encoder functions\n\n\n  var reenter = encode === 'enter',\n      update = encoders.update || _vegaUtil.falsy,\n      enter = encoders.enter || _vegaUtil.falsy,\n      exit = encoders.exit || _vegaUtil.falsy,\n      set = (encode && !reenter ? encoders[encode] : update) || _vegaUtil.falsy;\n\n  if (pulse.changed(pulse.ADD)) {\n    pulse.visit(pulse.ADD, function (t) {\n      enter(t, _);\n      update(t, _);\n    });\n    out.modifies(enter.output);\n    out.modifies(update.output);\n\n    if (set !== _vegaUtil.falsy && set !== update) {\n      pulse.visit(pulse.ADD, function (t) {\n        set(t, _);\n      });\n      out.modifies(set.output);\n    }\n  }\n\n  if (pulse.changed(pulse.REM) && exit !== _vegaUtil.falsy) {\n    pulse.visit(pulse.REM, function (t) {\n      exit(t, _);\n    });\n    out.modifies(exit.output);\n  }\n\n  if (reenter || set !== _vegaUtil.falsy) {\n    var flag = pulse.MOD | (_.modified() ? pulse.REFLOW : 0);\n\n    if (reenter) {\n      pulse.visit(flag, function (t) {\n        var mod = enter(t, _) || fmod;\n        if (set(t, _) || mod) out.mod.push(t);\n      });\n      if (out.mod.length) out.modifies(enter.output);\n    } else {\n      pulse.visit(flag, function (t) {\n        if (set(t, _) || fmod) out.mod.push(t);\n      });\n    }\n\n    if (out.mod.length) out.modifies(set.output);\n  }\n\n  return out.changed() ? out : pulse.StopPropagation;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"BvY5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Gradient = exports.Discrete = exports.Symbols = void 0;\nvar Symbols = 'symbol';\nexports.Symbols = Symbols;\nvar Discrete = 'discrete';\nexports.Discrete = Discrete;\nvar Gradient = 'gradient';\nexports.Gradient = Gradient;\n},{}],\"YuoA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.labelValues = labelValues;\nexports.thresholdFormat = thresholdFormat;\nexports.labelFormat = labelFormat;\nexports.labelFraction = labelFraction;\n\nvar _legendTypes = require(\"./legend-types\");\n\nvar _ticks = require(\"./ticks\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _vegaScale = require(\"vega-scale\");\n\nconst symbols = {\n  [_vegaScale.Quantile]: 'quantiles',\n  [_vegaScale.Quantize]: 'thresholds',\n  [_vegaScale.Threshold]: 'domain'\n};\nconst formats = {\n  [_vegaScale.Quantile]: 'quantiles',\n  [_vegaScale.Quantize]: 'domain'\n};\n\nfunction labelValues(scale, count) {\n  return scale.bins ? binValues(scale.bins) : symbols[scale.type] ? thresholdValues(scale[symbols[scale.type]]()) : (0, _ticks.tickValues)(scale, count);\n}\n\nfunction thresholdFormat(scale, specifier) {\n  var _ = scale[formats[scale.type]](),\n      n = _.length,\n      d = n > 1 ? _[1] - _[0] : _[0],\n      i;\n\n  for (i = 1; i < n; ++i) {\n    d = Math.min(d, _[i] - _[i - 1]);\n  } // 3 ticks times 10 for increased resolution\n\n\n  return (0, _vegaScale.tickFormat)(0, d, 3 * 10, specifier);\n}\n\nfunction thresholdValues(thresholds) {\n  const values = [-Infinity].concat(thresholds);\n  values.max = +Infinity;\n  return values;\n}\n\nfunction binValues(bins) {\n  const values = bins.slice(0, -1);\n  values.max = (0, _vegaUtil.peek)(bins);\n  return values;\n}\n\nfunction isDiscreteRange(scale) {\n  return symbols[scale.type] || scale.bins;\n}\n\nfunction labelFormat(scale, count, type, specifier, formatType, noSkip) {\n  const format = formats[scale.type] && formatType !== _vegaScale.Time && formatType !== _vegaScale.UTC ? thresholdFormat(scale, specifier) : (0, _ticks.tickFormat)(scale, count, specifier, formatType, noSkip);\n  return type === _legendTypes.Symbols && isDiscreteRange(scale) ? formatRange(format) : type === _legendTypes.Discrete ? formatDiscrete(format) : formatPoint(format);\n}\n\nfunction formatRange(format) {\n  return function (value, index, array) {\n    var limit = array[index + 1] || array.max || +Infinity,\n        lo = formatValue(value, format),\n        hi = formatValue(limit, format);\n    return lo && hi ? lo + '\\u2013' + hi : hi ? '< ' + hi : '\\u2265 ' + lo;\n  };\n}\n\nfunction formatDiscrete(format) {\n  return function (value, index) {\n    return index ? format(value) : null;\n  };\n}\n\nfunction formatPoint(format) {\n  return function (value) {\n    return format(value);\n  };\n}\n\nfunction formatValue(value, format) {\n  return Number.isFinite(value) ? format(value) : null;\n}\n\nfunction labelFraction(scale) {\n  var domain = scale.domain(),\n      count = domain.length - 1,\n      lo = +domain[0],\n      hi = +(0, _vegaUtil.peek)(domain),\n      span = hi - lo;\n\n  if (scale.type === _vegaScale.Threshold) {\n    var adjust = count ? span / count : 0.1;\n    lo -= adjust;\n    hi += adjust;\n    span = hi - lo;\n  }\n\n  return function (value) {\n    return (value - lo) / span;\n  };\n}\n},{\"./legend-types\":\"BvY5\",\"./ticks\":\"x5Ab\",\"vega-util\":\"d61Z\",\"vega-scale\":\"N8iK\"}],\"UnBD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = LegendEntries;\n\nvar _labels = require(\"./labels\");\n\nvar _legendTypes = require(\"./legend-types\");\n\nvar _ticks = require(\"./ticks\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Generates legend entries for visualizing a scale.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Scale} params.scale - The scale to generate items for.\n * @param {*} [params.count=5] - The approximate number of items, or\n *   desired tick interval, to use.\n * @param {*} [params.limit] - The maximum number of entries to\n *   include in a symbol legend.\n * @param {Array<*>} [params.values] - The exact tick values to use.\n *   These must be legal domain values for the provided scale.\n *   If provided, the count argument is ignored.\n * @param {string} [params.formatSpecifier] - A format specifier\n *   to use in conjunction with scale.tickFormat. Legal values are\n *   any valid D3 format specifier string.\n * @param {function(*):string} [params.format] - The format function to use.\n *   If provided, the formatSpecifier argument is ignored.\n */\nfunction LegendEntries(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(LegendEntries, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (this.value != null && !_.modified()) {\n    return pulse.StopPropagation;\n  }\n\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      items = this.value,\n      type = _.type || _legendTypes.Symbols,\n      scale = _.scale,\n      limit = +_.limit,\n      count = (0, _ticks.tickCount)(scale, _.count == null ? 5 : _.count, _.minstep),\n      format = _.format || (0, _labels.labelFormat)(scale, count, type, _.formatSpecifier, _.formatType, !!_.values),\n      values = _.values || (0, _labels.labelValues)(scale, count, type),\n      domain,\n      fraction,\n      size,\n      offset,\n      ellipsis;\n  if (items) out.rem = items;\n\n  if (type === _legendTypes.Symbols) {\n    if (limit && values.length > limit) {\n      pulse.dataflow.warn('Symbol legend count exceeds limit, filtering items.');\n      items = values.slice(0, limit - 1);\n      ellipsis = true;\n    } else {\n      items = values;\n    }\n\n    if ((0, _vegaUtil.isFunction)(size = _.size)) {\n      // if first value maps to size zero, remove from list (vega#717)\n      if (!_.values && scale(items[0]) === 0) {\n        items = items.slice(1);\n      } // compute size offset for legend entries\n\n\n      offset = items.reduce(function (max, value) {\n        return Math.max(max, size(value, _));\n      }, 0);\n    } else {\n      size = (0, _vegaUtil.constant)(offset = size || 8);\n    }\n\n    items = items.map(function (value, index) {\n      return (0, _vegaDataflow.ingest)({\n        index: index,\n        label: format(value, index, values),\n        value: value,\n        offset: offset,\n        size: size(value, _)\n      });\n    });\n\n    if (ellipsis) {\n      ellipsis = values[items.length];\n      items.push((0, _vegaDataflow.ingest)({\n        index: items.length,\n        label: `\\u2026${values.length - items.length} entries`,\n        value: ellipsis,\n        offset: offset,\n        size: size(ellipsis, _)\n      }));\n    }\n  } else if (type === _legendTypes.Gradient) {\n    domain = scale.domain(), fraction = (0, _vegaScale.scaleFraction)(scale, domain[0], (0, _vegaUtil.peek)(domain)); // if automatic label generation produces 2 or fewer values,\n    // use the domain end points instead (fixes vega/vega#1364)\n\n    if (values.length < 3 && !_.values && domain[0] !== (0, _vegaUtil.peek)(domain)) {\n      values = [domain[0], (0, _vegaUtil.peek)(domain)];\n    }\n\n    items = values.map(function (value, index) {\n      return (0, _vegaDataflow.ingest)({\n        index: index,\n        label: format(value, index, values),\n        value: value,\n        perc: fraction(value)\n      });\n    });\n  } else {\n    size = values.length - 1;\n    fraction = (0, _labels.labelFraction)(scale);\n    items = values.map(function (value, index) {\n      return (0, _vegaDataflow.ingest)({\n        index: index,\n        label: format(value, index, values),\n        value: value,\n        perc: index ? fraction(value) : 0,\n        perc2: index === size ? 1 : fraction(values[index + 1])\n      });\n    });\n  }\n\n  out.source = items;\n  out.add = items;\n  this.value = items;\n  return out;\n};\n},{\"./labels\":\"YuoA\",\"./legend-types\":\"BvY5\",\"./ticks\":\"x5Ab\",\"vega-dataflow\":\"luN0\",\"vega-scale\":\"N8iK\",\"vega-util\":\"d61Z\"}],\"kX6e\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = LinkPath;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar Paths = (0, _vegaUtil.fastmap)({\n  'line': line,\n  'line-radial': lineR,\n  'arc': arc,\n  'arc-radial': arcR,\n  'curve': curve,\n  'curve-radial': curveR,\n  'orthogonal-horizontal': orthoX,\n  'orthogonal-vertical': orthoY,\n  'orthogonal-radial': orthoR,\n  'diagonal-horizontal': diagonalX,\n  'diagonal-vertical': diagonalY,\n  'diagonal-radial': diagonalR\n});\n\nfunction sourceX(t) {\n  return t.source.x;\n}\n\nfunction sourceY(t) {\n  return t.source.y;\n}\n\nfunction targetX(t) {\n  return t.target.x;\n}\n\nfunction targetY(t) {\n  return t.target.y;\n}\n/**\n * Layout paths linking source and target elements.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */\n\n\nfunction LinkPath(params) {\n  _vegaDataflow.Transform.call(this, {}, params);\n}\n\nLinkPath.Definition = {\n  \"type\": \"LinkPath\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"sourceX\",\n    \"type\": \"field\",\n    \"default\": \"source.x\"\n  }, {\n    \"name\": \"sourceY\",\n    \"type\": \"field\",\n    \"default\": \"source.y\"\n  }, {\n    \"name\": \"targetX\",\n    \"type\": \"field\",\n    \"default\": \"target.x\"\n  }, {\n    \"name\": \"targetY\",\n    \"type\": \"field\",\n    \"default\": \"target.y\"\n  }, {\n    \"name\": \"orient\",\n    \"type\": \"enum\",\n    \"default\": \"vertical\",\n    \"values\": [\"horizontal\", \"vertical\", \"radial\"]\n  }, {\n    \"name\": \"shape\",\n    \"type\": \"enum\",\n    \"default\": \"line\",\n    \"values\": [\"line\", \"arc\", \"curve\", \"diagonal\", \"orthogonal\"]\n  }, {\n    \"name\": \"require\",\n    \"type\": \"signal\"\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"default\": \"path\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(LinkPath, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var sx = _.sourceX || sourceX,\n      sy = _.sourceY || sourceY,\n      tx = _.targetX || targetX,\n      ty = _.targetY || targetY,\n      as = _.as || 'path',\n      orient = _.orient || 'vertical',\n      shape = _.shape || 'line',\n      path = Paths.get(shape + '-' + orient) || Paths.get(shape);\n\n  if (!path) {\n    (0, _vegaUtil.error)('LinkPath unsupported type: ' + _.shape + (_.orient ? '-' + _.orient : ''));\n  }\n\n  pulse.visit(pulse.SOURCE, function (t) {\n    t[as] = path(sx(t), sy(t), tx(t), ty(t));\n  });\n  return pulse.reflow(_.modified()).modifies(as);\n}; // -- Link Path Generation Methods -----\n\n\nfunction line(sx, sy, tx, ty) {\n  return 'M' + sx + ',' + sy + 'L' + tx + ',' + ty;\n}\n\nfunction lineR(sa, sr, ta, tr) {\n  return line(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\n}\n\nfunction arc(sx, sy, tx, ty) {\n  var dx = tx - sx,\n      dy = ty - sy,\n      rr = Math.sqrt(dx * dx + dy * dy) / 2,\n      ra = 180 * Math.atan2(dy, dx) / Math.PI;\n  return 'M' + sx + ',' + sy + 'A' + rr + ',' + rr + ' ' + ra + ' 0 1' + ' ' + tx + ',' + ty;\n}\n\nfunction arcR(sa, sr, ta, tr) {\n  return arc(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\n}\n\nfunction curve(sx, sy, tx, ty) {\n  var dx = tx - sx,\n      dy = ty - sy,\n      ix = 0.2 * (dx + dy),\n      iy = 0.2 * (dy - dx);\n  return 'M' + sx + ',' + sy + 'C' + (sx + ix) + ',' + (sy + iy) + ' ' + (tx + iy) + ',' + (ty - ix) + ' ' + tx + ',' + ty;\n}\n\nfunction curveR(sa, sr, ta, tr) {\n  return curve(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\n}\n\nfunction orthoX(sx, sy, tx, ty) {\n  return 'M' + sx + ',' + sy + 'V' + ty + 'H' + tx;\n}\n\nfunction orthoY(sx, sy, tx, ty) {\n  return 'M' + sx + ',' + sy + 'H' + tx + 'V' + ty;\n}\n\nfunction orthoR(sa, sr, ta, tr) {\n  var sc = Math.cos(sa),\n      ss = Math.sin(sa),\n      tc = Math.cos(ta),\n      ts = Math.sin(ta),\n      sf = Math.abs(ta - sa) > Math.PI ? ta <= sa : ta > sa;\n  return 'M' + sr * sc + ',' + sr * ss + 'A' + sr + ',' + sr + ' 0 0,' + (sf ? 1 : 0) + ' ' + sr * tc + ',' + sr * ts + 'L' + tr * tc + ',' + tr * ts;\n}\n\nfunction diagonalX(sx, sy, tx, ty) {\n  var m = (sx + tx) / 2;\n  return 'M' + sx + ',' + sy + 'C' + m + ',' + sy + ' ' + m + ',' + ty + ' ' + tx + ',' + ty;\n}\n\nfunction diagonalY(sx, sy, tx, ty) {\n  var m = (sy + ty) / 2;\n  return 'M' + sx + ',' + sy + 'C' + sx + ',' + m + ' ' + tx + ',' + m + ' ' + tx + ',' + ty;\n}\n\nfunction diagonalR(sa, sr, ta, tr) {\n  var sc = Math.cos(sa),\n      ss = Math.sin(sa),\n      tc = Math.cos(ta),\n      ts = Math.sin(ta),\n      mr = (sr + tr) / 2;\n  return 'M' + sr * sc + ',' + sr * ss + 'C' + mr * sc + ',' + mr * ss + ' ' + mr * tc + ',' + mr * ts + ' ' + tr * tc + ',' + tr * ts;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"vXQB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Pie;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\n/**\n * Pie and donut chart layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size pie segments.\n * @param {number} [params.startAngle=0] - The start angle (in radians) of the layout.\n * @param {number} [params.endAngle=2π] - The end angle (in radians) of the layout.\n * @param {boolean} [params.sort] - Boolean flag for sorting sectors by value.\n */\nfunction Pie(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nPie.Definition = {\n  \"type\": \"Pie\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"startAngle\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"endAngle\",\n    \"type\": \"number\",\n    \"default\": 6.283185307179586\n  }, {\n    \"name\": \"sort\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [\"startAngle\", \"endAngle\"]\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Pie, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var as = _.as || ['startAngle', 'endAngle'],\n      startAngle = as[0],\n      endAngle = as[1],\n      field = _.field || _vegaUtil.one,\n      start = _.startAngle || 0,\n      stop = _.endAngle != null ? _.endAngle : 2 * Math.PI,\n      data = pulse.source,\n      values = data.map(field),\n      n = values.length,\n      a = start,\n      k = (stop - start) / (0, _d3Array.sum)(values),\n      index = (0, _d3Array.range)(n),\n      i,\n      t,\n      v;\n\n  if (_.sort) {\n    index.sort(function (a, b) {\n      return values[a] - values[b];\n    });\n  }\n\n  for (i = 0; i < n; ++i) {\n    v = values[index[i]];\n    t = data[index[i]];\n    t[startAngle] = a;\n    t[endAngle] = a += v * k;\n  }\n\n  this.value = values;\n  return pulse.reflow(_.modified()).modifies(as);\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\"}],\"qO5O\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Scale;\n\nvar _ticks = require(\"./ticks\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Interpolate = require(\"d3-interpolate\");\n\nvar DEFAULT_COUNT = 5;\n\nfunction includeZero(scale) {\n  const type = scale.type;\n  return !scale.bins && (type === _vegaScale.Linear || type === _vegaScale.Pow || type === _vegaScale.Sqrt);\n}\n\nfunction includePad(type) {\n  return (0, _vegaScale.isContinuous)(type) && type !== _vegaScale.Sequential;\n}\n\nvar SKIP = (0, _vegaUtil.toSet)(['set', 'modified', 'clear', 'type', 'scheme', 'schemeExtent', 'schemeCount', 'domain', 'domainMin', 'domainMid', 'domainMax', 'domainRaw', 'domainImplicit', 'nice', 'zero', 'bins', 'range', 'rangeStep', 'round', 'reverse', 'interpolate', 'interpolateGamma']);\n/**\n * Maintains a scale function mapping data values to visual channels.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */\n\nfunction Scale(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n\n  this.modified(true); // always treat as modified\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Scale, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var df = pulse.dataflow,\n      scale = this.value,\n      key = scaleKey(_);\n\n  if (!scale || key !== scale.type) {\n    this.value = scale = (0, _vegaScale.scale)(key)();\n  }\n\n  for (key in _) if (!SKIP[key]) {\n    // padding is a scale property for band/point but not others\n    if (key === 'padding' && includePad(scale.type)) continue; // invoke scale property setter, raise warning if not found\n\n    (0, _vegaUtil.isFunction)(scale[key]) ? scale[key](_[key]) : df.warn('Unsupported scale property: ' + key);\n  }\n\n  configureRange(scale, _, configureBins(scale, _, configureDomain(scale, _, df)));\n  return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n};\n\nfunction scaleKey(_) {\n  var t = _.type,\n      d = '',\n      n; // backwards compatibility pre Vega 5.\n\n  if (t === _vegaScale.Sequential) return _vegaScale.Sequential + '-' + _vegaScale.Linear;\n\n  if (isContinuousColor(_)) {\n    n = _.rawDomain ? _.rawDomain.length : _.domain ? _.domain.length + +(_.domainMid != null) : 0;\n    d = n === 2 ? _vegaScale.Sequential + '-' : n === 3 ? _vegaScale.Diverging + '-' : '';\n  }\n\n  return (d + t || _vegaScale.Linear).toLowerCase();\n}\n\nfunction isContinuousColor(_) {\n  const t = _.type;\n  return (0, _vegaScale.isContinuous)(t) && t !== _vegaScale.Time && t !== _vegaScale.UTC && (_.scheme || _.range && _.range.length && _.range.every(_vegaUtil.isString));\n}\n\nfunction configureDomain(scale, _, df) {\n  // check raw domain, if provided use that and exit early\n  var raw = rawDomain(scale, _.domainRaw, df);\n  if (raw > -1) return raw;\n  var domain = _.domain,\n      type = scale.type,\n      zero = _.zero || _.zero === undefined && includeZero(scale),\n      n,\n      mid;\n  if (!domain) return 0; // adjust continuous domain for minimum pixel padding\n\n  if (includePad(type) && _.padding && domain[0] !== (0, _vegaUtil.peek)(domain)) {\n    domain = padDomain(type, domain, _.range, _.padding, _.exponent, _.constant);\n  } // adjust domain based on zero, min, max settings\n\n\n  if (zero || _.domainMin != null || _.domainMax != null || _.domainMid != null) {\n    n = (domain = domain.slice()).length - 1 || 1;\n\n    if (zero) {\n      if (domain[0] > 0) domain[0] = 0;\n      if (domain[n] < 0) domain[n] = 0;\n    }\n\n    if (_.domainMin != null) domain[0] = _.domainMin;\n    if (_.domainMax != null) domain[n] = _.domainMax;\n\n    if (_.domainMid != null) {\n      mid = _.domainMid;\n\n      if (mid < domain[0] || mid > domain[n]) {\n        df.warn('Scale domainMid exceeds domain min or max.', mid);\n      }\n\n      domain.splice(n, 0, mid);\n    }\n  } // set the scale domain\n\n\n  scale.domain(domainCheck(type, domain, df)); // if ordinal scale domain is defined, prevent implicit\n  // domain construction as side-effect of scale lookup\n\n  if (type === _vegaScale.Ordinal) {\n    scale.unknown(_.domainImplicit ? _vegaScale.scaleImplicit : undefined);\n  } // perform 'nice' adjustment as requested\n\n\n  if (_.nice && scale.nice) {\n    scale.nice(_.nice !== true && (0, _ticks.tickCount)(scale, _.nice) || null);\n  } // return the cardinality of the domain\n\n\n  return domain.length;\n}\n\nfunction rawDomain(scale, raw, df) {\n  if (raw) {\n    scale.domain(domainCheck(scale.type, raw, df));\n    return raw.length;\n  } else {\n    return -1;\n  }\n}\n\nfunction padDomain(type, domain, range, pad, exponent, constant) {\n  var span = Math.abs((0, _vegaUtil.peek)(range) - range[0]),\n      frac = span / (span - 2 * pad),\n      d = type === _vegaScale.Log ? (0, _vegaUtil.zoomLog)(domain, null, frac) : type === _vegaScale.Sqrt ? (0, _vegaUtil.zoomPow)(domain, null, frac, 0.5) : type === _vegaScale.Pow ? (0, _vegaUtil.zoomPow)(domain, null, frac, exponent || 1) : type === _vegaScale.Symlog ? (0, _vegaUtil.zoomSymlog)(domain, null, frac, constant || 1) : (0, _vegaUtil.zoomLinear)(domain, null, frac);\n  domain = domain.slice();\n  domain[0] = d[0];\n  domain[domain.length - 1] = d[1];\n  return domain;\n}\n\nfunction domainCheck(type, domain, df) {\n  if ((0, _vegaScale.isLogarithmic)(type)) {\n    // sum signs of domain values\n    // if all pos or all neg, abs(sum) === domain.length\n    var s = Math.abs(domain.reduce(function (s, v) {\n      return s + (v < 0 ? -1 : v > 0 ? 1 : 0);\n    }, 0));\n\n    if (s !== domain.length) {\n      df.warn('Log scale domain includes zero: ' + (0, _vegaUtil.stringValue)(domain));\n    }\n  }\n\n  return domain;\n}\n\nfunction configureBins(scale, _, count) {\n  let bins = _.bins;\n\n  if (bins && !(0, _vegaUtil.isArray)(bins)) {\n    // generate bin boundary array\n    let domain = scale.domain(),\n        lo = domain[0],\n        hi = (0, _vegaUtil.peek)(domain),\n        start = bins.start == null ? lo : bins.start,\n        stop = bins.stop == null ? hi : bins.stop,\n        step = bins.step;\n    if (!step) (0, _vegaUtil.error)('Scale bins parameter missing step property.');\n    if (start < lo) start = step * Math.ceil(lo / step);\n    if (stop > hi) stop = step * Math.floor(hi / step);\n    bins = (0, _d3Array.range)(start, stop + step / 2, step);\n  }\n\n  if (bins) {\n    // assign bin boundaries to scale instance\n    scale.bins = bins;\n  } else if (scale.bins) {\n    // no current bins, remove bins if previously set\n    delete scale.bins;\n  } // special handling for bin-ordinal scales\n\n\n  if (scale.type === _vegaScale.BinOrdinal) {\n    if (!bins) {\n      // the domain specifies the bins\n      scale.bins = scale.domain();\n    } else if (!_.domain && !_.domainRaw) {\n      // the bins specify the domain\n      scale.domain(bins);\n      count = bins.length;\n    }\n  } // return domain cardinality\n\n\n  return count;\n}\n\nfunction configureRange(scale, _, count) {\n  var type = scale.type,\n      round = _.round || false,\n      range = _.range; // if range step specified, calculate full range extent\n\n  if (_.rangeStep != null) {\n    range = configureRangeStep(type, _, count);\n  } // else if a range scheme is defined, use that\n  else if (_.scheme) {\n      range = configureScheme(type, _, count);\n\n      if ((0, _vegaUtil.isFunction)(range)) {\n        if (scale.interpolator) {\n          return scale.interpolator(range);\n        } else {\n          (0, _vegaUtil.error)(`Scale type ${type} does not support interpolating color schemes.`);\n        }\n      }\n    } // given a range array for an interpolating scale, convert to interpolator\n\n\n  if (range && (0, _vegaScale.isInterpolating)(type)) {\n    return scale.interpolator((0, _vegaScale.interpolateColors)(flip(range, _.reverse), _.interpolate, _.interpolateGamma));\n  } // configure rounding / interpolation\n\n\n  if (range && _.interpolate && scale.interpolate) {\n    scale.interpolate((0, _vegaScale.interpolate)(_.interpolate, _.interpolateGamma));\n  } else if ((0, _vegaUtil.isFunction)(scale.round)) {\n    scale.round(round);\n  } else if ((0, _vegaUtil.isFunction)(scale.rangeRound)) {\n    scale.interpolate(round ? _d3Interpolate.interpolateRound : _d3Interpolate.interpolate);\n  }\n\n  if (range) scale.range(flip(range, _.reverse));\n}\n\nfunction configureRangeStep(type, _, count) {\n  if (type !== _vegaScale.Band && type !== _vegaScale.Point) {\n    (0, _vegaUtil.error)('Only band and point scales support rangeStep.');\n  } // calculate full range based on requested step size and padding\n\n\n  var outer = (_.paddingOuter != null ? _.paddingOuter : _.padding) || 0,\n      inner = type === _vegaScale.Point ? 1 : (_.paddingInner != null ? _.paddingInner : _.padding) || 0;\n  return [0, _.rangeStep * (0, _vegaScale.bandSpace)(count, inner, outer)];\n}\n\nfunction configureScheme(type, _, count) {\n  var extent = _.schemeExtent,\n      name,\n      scheme;\n\n  if ((0, _vegaUtil.isArray)(_.scheme)) {\n    scheme = (0, _vegaScale.interpolateColors)(_.scheme, _.interpolate, _.interpolateGamma);\n  } else {\n    name = _.scheme.toLowerCase();\n    scheme = (0, _vegaScale.scheme)(name);\n    if (!scheme) (0, _vegaUtil.error)(`Unrecognized scheme name: ${_.scheme}`);\n  } // determine size for potential discrete range\n\n\n  count = type === _vegaScale.Threshold ? count + 1 : type === _vegaScale.BinOrdinal ? count - 1 : type === _vegaScale.Quantile || type === _vegaScale.Quantize ? +_.schemeCount || DEFAULT_COUNT : count; // adjust and/or quantize scheme as appropriate\n\n  return (0, _vegaScale.isInterpolating)(type) ? adjustScheme(scheme, extent, _.reverse) : (0, _vegaUtil.isFunction)(scheme) ? (0, _vegaScale.quantizeInterpolator)(adjustScheme(scheme, extent), count) : type === _vegaScale.Ordinal ? scheme : scheme.slice(0, count);\n}\n\nfunction adjustScheme(scheme, extent, reverse) {\n  return (0, _vegaUtil.isFunction)(scheme) && (extent || reverse) ? (0, _vegaScale.interpolateRange)(scheme, flip(extent || [0, 1], reverse)) : scheme;\n}\n\nfunction flip(array, reverse) {\n  return reverse ? array.slice().reverse() : array;\n}\n},{\"./ticks\":\"x5Ab\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"vega-scale\":\"N8iK\",\"d3-array\":\"K0bd\",\"d3-interpolate\":\"k9aH\"}],\"OBXf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = SortItems;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Sorts scenegraph items in the pulse source array.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator\n *   function for sorting tuples.\n */\nfunction SortItems(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(SortItems, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var mod = _.modified('sort') || pulse.changed(pulse.ADD) || pulse.modified(_.sort.fields) || pulse.modified('datum');\n  if (mod) pulse.source.sort((0, _vegaDataflow.stableCompare)(_.sort));\n  this.modified(mod);\n  return pulse;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"wZAN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Stack;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar Zero = 'zero',\n    Center = 'center',\n    Normalize = 'normalize',\n    DefOutput = ['y0', 'y1'];\n/**\n * Stack layout for visualization elements.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to stack.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {function(object,object): number} [params.sort] - A comparator for stack sorting.\n * @param {string} [offset='zero'] - Stack baseline offset. One of 'zero', 'center', 'normalize'.\n */\n\nfunction Stack(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nStack.Definition = {\n  \"type\": \"Stack\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"sort\",\n    \"type\": \"compare\"\n  }, {\n    \"name\": \"offset\",\n    \"type\": \"enum\",\n    \"default\": Zero,\n    \"values\": [Zero, Center, Normalize]\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": DefOutput\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Stack, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var as = _.as || DefOutput,\n      y0 = as[0],\n      y1 = as[1],\n      sort = (0, _vegaDataflow.stableCompare)(_.sort),\n      field = _.field || _vegaUtil.one,\n      stack = _.offset === Center ? stackCenter : _.offset === Normalize ? stackNormalize : stackZero,\n      groups,\n      i,\n      n,\n      max; // partition, sum, and sort the stack groups\n\n  groups = partition(pulse.source, _.groupby, sort, field); // compute stack layouts per group\n\n  for (i = 0, n = groups.length, max = groups.max; i < n; ++i) {\n    stack(groups[i], max, field, y0, y1);\n  }\n\n  return pulse.reflow(_.modified()).modifies(as);\n};\n\nfunction stackCenter(group, max, field, y0, y1) {\n  var last = (max - group.sum) / 2,\n      m = group.length,\n      j = 0,\n      t;\n\n  for (; j < m; ++j) {\n    t = group[j];\n    t[y0] = last;\n    t[y1] = last += Math.abs(field(t));\n  }\n}\n\nfunction stackNormalize(group, max, field, y0, y1) {\n  var scale = 1 / group.sum,\n      last = 0,\n      m = group.length,\n      j = 0,\n      v = 0,\n      t;\n\n  for (; j < m; ++j) {\n    t = group[j];\n    t[y0] = last;\n    t[y1] = last = scale * (v += Math.abs(field(t)));\n  }\n}\n\nfunction stackZero(group, max, field, y0, y1) {\n  var lastPos = 0,\n      lastNeg = 0,\n      m = group.length,\n      j = 0,\n      v,\n      t;\n\n  for (; j < m; ++j) {\n    t = group[j];\n    v = +field(t);\n\n    if (v < 0) {\n      t[y0] = lastNeg;\n      t[y1] = lastNeg += v;\n    } else {\n      t[y0] = lastPos;\n      t[y1] = lastPos += v;\n    }\n  }\n}\n\nfunction partition(data, groupby, sort, field) {\n  var groups = [],\n      get = function (f) {\n    return f(t);\n  },\n      map,\n      i,\n      n,\n      m,\n      t,\n      k,\n      g,\n      s,\n      max; // partition data points into stack groups\n\n\n  if (groupby == null) {\n    groups.push(data.slice());\n  } else {\n    for (map = {}, i = 0, n = data.length; i < n; ++i) {\n      t = data[i];\n      k = groupby.map(get);\n      g = map[k];\n\n      if (!g) {\n        map[k] = g = [];\n        groups.push(g);\n      }\n\n      g.push(t);\n    }\n  } // compute sums of groups, sort groups as needed\n\n\n  for (k = 0, max = 0, m = groups.length; k < m; ++k) {\n    g = groups[k];\n\n    for (i = 0, s = 0, n = g.length; i < n; ++i) {\n      s += Math.abs(field(g[i]));\n    }\n\n    g.sum = s;\n    if (s > max) max = s;\n    if (sort) g.sort(sort);\n  }\n\n  groups.max = max;\n  return groups;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"AlcT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"axisticks\", {\n  enumerable: true,\n  get: function () {\n    return _AxisTicks.default;\n  }\n});\nObject.defineProperty(exports, \"datajoin\", {\n  enumerable: true,\n  get: function () {\n    return _DataJoin.default;\n  }\n});\nObject.defineProperty(exports, \"encode\", {\n  enumerable: true,\n  get: function () {\n    return _Encode.default;\n  }\n});\nObject.defineProperty(exports, \"legendentries\", {\n  enumerable: true,\n  get: function () {\n    return _LegendEntries.default;\n  }\n});\nObject.defineProperty(exports, \"linkpath\", {\n  enumerable: true,\n  get: function () {\n    return _LinkPath.default;\n  }\n});\nObject.defineProperty(exports, \"pie\", {\n  enumerable: true,\n  get: function () {\n    return _Pie.default;\n  }\n});\nObject.defineProperty(exports, \"scale\", {\n  enumerable: true,\n  get: function () {\n    return _Scale.default;\n  }\n});\nObject.defineProperty(exports, \"sortitems\", {\n  enumerable: true,\n  get: function () {\n    return _SortItems.default;\n  }\n});\nObject.defineProperty(exports, \"stack\", {\n  enumerable: true,\n  get: function () {\n    return _Stack.default;\n  }\n});\nObject.defineProperty(exports, \"validTicks\", {\n  enumerable: true,\n  get: function () {\n    return _ticks.validTicks;\n  }\n});\n\nvar _AxisTicks = _interopRequireDefault(require(\"./src/AxisTicks\"));\n\nvar _DataJoin = _interopRequireDefault(require(\"./src/DataJoin\"));\n\nvar _Encode = _interopRequireDefault(require(\"./src/Encode\"));\n\nvar _LegendEntries = _interopRequireDefault(require(\"./src/LegendEntries\"));\n\nvar _LinkPath = _interopRequireDefault(require(\"./src/LinkPath\"));\n\nvar _Pie = _interopRequireDefault(require(\"./src/Pie\"));\n\nvar _Scale = _interopRequireDefault(require(\"./src/Scale\"));\n\nvar _SortItems = _interopRequireDefault(require(\"./src/SortItems\"));\n\nvar _Stack = _interopRequireDefault(require(\"./src/Stack\"));\n\nvar _ticks = require(\"./src/ticks\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/AxisTicks\":\"yZNT\",\"./src/DataJoin\":\"YewA\",\"./src/Encode\":\"lme1\",\"./src/LegendEntries\":\"UnBD\",\"./src/LinkPath\":\"kX6e\",\"./src/Pie\":\"vXQB\",\"./src/Scale\":\"qO5O\",\"./src/SortItems\":\"OBXf\",\"./src/Stack\":\"wZAN\",\"./src/ticks\":\"x5Ab\"}],\"zyGn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction noop() {}\n\nconst cases = [[], [[[1.0, 1.5], [0.5, 1.0]]], [[[1.5, 1.0], [1.0, 1.5]]], [[[1.5, 1.0], [0.5, 1.0]]], [[[1.0, 0.5], [1.5, 1.0]]], [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], [[[1.0, 0.5], [1.0, 1.5]]], [[[1.0, 0.5], [0.5, 1.0]]], [[[0.5, 1.0], [1.0, 0.5]]], [[[1.0, 1.5], [1.0, 0.5]]], [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], [[[1.5, 1.0], [1.0, 0.5]]], [[[0.5, 1.0], [1.5, 1.0]]], [[[1.0, 1.5], [1.5, 1.0]]], [[[0.5, 1.0], [1.0, 1.5]]], []]; // Implementation adapted from d3/d3-contour. Thanks!\n\nfunction _default() {\n  var dx = 1,\n      dy = 1,\n      smooth = smoothLinear;\n\n  function contours(values, tz) {\n    return tz.map(value => contour(values, value));\n  } // Accumulate, smooth contour rings, assign holes to exterior rings.\n  // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js\n\n\n  function contour(values, value) {\n    var polygons = [],\n        holes = [];\n    isorings(values, value, function (ring) {\n      smooth(ring, values, value);\n      if (area(ring) > 0) polygons.push([ring]);else holes.push(ring);\n    });\n    holes.forEach(function (hole) {\n      for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\n        if (contains((polygon = polygons[i])[0], hole) !== -1) {\n          polygon.push(hole);\n          return;\n        }\n      }\n    });\n    return {\n      type: 'MultiPolygon',\n      value: value,\n      coordinates: polygons\n    };\n  } // Marching squares with isolines stitched into rings.\n  // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js\n\n\n  function isorings(values, value, callback) {\n    var fragmentByStart = new Array(),\n        fragmentByEnd = new Array(),\n        x,\n        y,\n        t0,\n        t1,\n        t2,\n        t3; // Special case for the first row (y = -1, t2 = t3 = 0).\n\n    x = y = -1;\n    t1 = values[0] >= value;\n    cases[t1 << 1].forEach(stitch);\n\n    while (++x < dx - 1) {\n      t0 = t1, t1 = values[x + 1] >= value;\n      cases[t0 | t1 << 1].forEach(stitch);\n    }\n\n    cases[t1 << 0].forEach(stitch); // General case for the intermediate rows.\n\n    while (++y < dy - 1) {\n      x = -1;\n      t1 = values[y * dx + dx] >= value;\n      t2 = values[y * dx] >= value;\n      cases[t1 << 1 | t2 << 2].forEach(stitch);\n\n      while (++x < dx - 1) {\n        t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;\n        t3 = t2, t2 = values[y * dx + x + 1] >= value;\n        cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);\n      }\n\n      cases[t1 | t2 << 3].forEach(stitch);\n    } // Special case for the last row (y = dy - 1, t0 = t1 = 0).\n\n\n    x = -1;\n    t2 = values[y * dx] >= value;\n    cases[t2 << 2].forEach(stitch);\n\n    while (++x < dx - 1) {\n      t3 = t2, t2 = values[y * dx + x + 1] >= value;\n      cases[t2 << 2 | t3 << 3].forEach(stitch);\n    }\n\n    cases[t2 << 3].forEach(stitch);\n\n    function stitch(line) {\n      var start = [line[0][0] + x, line[0][1] + y],\n          end = [line[1][0] + x, line[1][1] + y],\n          startIndex = index(start),\n          endIndex = index(end),\n          f,\n          g;\n\n      if (f = fragmentByEnd[startIndex]) {\n        if (g = fragmentByStart[endIndex]) {\n          delete fragmentByEnd[f.end];\n          delete fragmentByStart[g.start];\n\n          if (f === g) {\n            f.ring.push(end);\n            callback(f.ring);\n          } else {\n            fragmentByStart[f.start] = fragmentByEnd[g.end] = {\n              start: f.start,\n              end: g.end,\n              ring: f.ring.concat(g.ring)\n            };\n          }\n        } else {\n          delete fragmentByEnd[f.end];\n          f.ring.push(end);\n          fragmentByEnd[f.end = endIndex] = f;\n        }\n      } else if (f = fragmentByStart[endIndex]) {\n        if (g = fragmentByEnd[startIndex]) {\n          delete fragmentByStart[f.start];\n          delete fragmentByEnd[g.end];\n\n          if (f === g) {\n            f.ring.push(end);\n            callback(f.ring);\n          } else {\n            fragmentByStart[g.start] = fragmentByEnd[f.end] = {\n              start: g.start,\n              end: f.end,\n              ring: g.ring.concat(f.ring)\n            };\n          }\n        } else {\n          delete fragmentByStart[f.start];\n          f.ring.unshift(start);\n          fragmentByStart[f.start = startIndex] = f;\n        }\n      } else {\n        fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {\n          start: startIndex,\n          end: endIndex,\n          ring: [start, end]\n        };\n      }\n    }\n  }\n\n  function index(point) {\n    return point[0] * 2 + point[1] * (dx + 1) * 4;\n  }\n\n  function smoothLinear(ring, values, value) {\n    ring.forEach(function (point) {\n      var x = point[0],\n          y = point[1],\n          xt = x | 0,\n          yt = y | 0,\n          v0,\n          v1 = values[yt * dx + xt];\n\n      if (x > 0 && x < dx && xt === x) {\n        v0 = values[yt * dx + xt - 1];\n        point[0] = x + (value - v0) / (v1 - v0) - 0.5;\n      }\n\n      if (y > 0 && y < dy && yt === y) {\n        v0 = values[(yt - 1) * dx + xt];\n        point[1] = y + (value - v0) / (v1 - v0) - 0.5;\n      }\n    });\n  }\n\n  contours.contour = contour;\n\n  contours.size = function (_) {\n    if (!arguments.length) return [dx, dy];\n\n    var _0 = Math.ceil(_[0]),\n        _1 = Math.ceil(_[1]);\n\n    if (!(_0 > 0) || !(_1 > 0)) (0, _vegaUtil.error)('invalid size');\n    return dx = _0, dy = _1, contours;\n  };\n\n  contours.smooth = function (_) {\n    return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear;\n  };\n\n  return contours;\n}\n\nfunction area(ring) {\n  var i = 0,\n      n = ring.length,\n      area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n\n  while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n\n  return area;\n}\n\nfunction contains(ring, hole) {\n  var i = -1,\n      n = hole.length,\n      c;\n\n  while (++i < n) if (c = ringContains(ring, hole[i])) return c;\n\n  return 0;\n}\n\nfunction ringContains(ring, point) {\n  var x = point[0],\n      y = point[1],\n      contains = -1;\n\n  for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\n    var pi = ring[i],\n        xi = pi[0],\n        yi = pi[1],\n        pj = ring[j],\n        xj = pj[0],\n        yj = pj[1];\n    if (segmentContains(pi, pj, point)) return 0;\n    if (yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi) contains = -contains;\n  }\n\n  return contains;\n}\n\nfunction segmentContains(a, b, c) {\n  var i;\n  return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);\n}\n\nfunction collinear(a, b, c) {\n  return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);\n}\n\nfunction within(p, q, r) {\n  return p <= q && q <= r || r <= q && q <= p;\n}\n},{\"vega-util\":\"d61Z\"}],\"FmeN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(k, nice, zero) {\n  return function (values) {\n    var ex = (0, _vegaUtil.extent)(values),\n        start = zero ? Math.min(ex[0], 0) : ex[0],\n        stop = ex[1],\n        span = stop - start,\n        step = nice ? (0, _d3Array.tickStep)(start, stop, k) : span / (k + 1);\n    return (0, _d3Array.range)(step, stop, step);\n  };\n}\n},{\"d3-array\":\"K0bd\",\"vega-util\":\"d61Z\"}],\"zTBn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Isocontour;\nexports.transform = transform;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _contours = _interopRequireDefault(require(\"./util/contours\"));\n\nvar _quantize = _interopRequireDefault(require(\"./util/quantize\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Generate isocontours (level sets) based on input raster grid data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} [params.field] - The field with raster grid\n *   data. If unspecified, the tuple itself is interpreted as a raster grid.\n * @param {Array<number>} [params.thresholds] - Contour threshold array. If\n *   specified, the levels, nice, resolve, and zero parameters are ignored.\n * @param {number} [params.levels] - The desired number of contour levels.\n * @param {boolean} [params.nice] - Boolean flag indicating if the contour\n *   threshold values should be automatically aligned to \"nice\"\n *   human-friendly values. Setting this flag may cause the number of\n *   thresholds to deviate from the specified levels.\n * @param {string} [params.resolve] - The method for resolving thresholds\n *   across multiple input grids. If 'independent' (the default), threshold\n *   calculation will be performed separately for each grid. If 'shared', a\n *   single set of threshold values will be used for all input grids.\n * @param {boolean} [params.zero] - Boolean flag indicating if the contour\n *   threshold values should include zero.\n * @param {boolean} [params.smooth] - Boolean flag indicating if the contour\n *   polygons should be smoothed using linear interpolation. The default is\n *   true. The parameter is ignored when using density estimation.\n * @param {boolean} [params.scale] - Optional numerical value by which to\n *   scale the output isocontour coordinates. This parameter can be useful\n *   to scale the contours to match a desired output resolution.\n * @param {string} [params.as='contour'] - The output field in which to store\n *   the generated isocontour data (default 'contour').\n */\nfunction Isocontour(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nIsocontour.Definition = {\n  \"type\": \"Isocontour\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"thresholds\",\n    \"type\": \"number\",\n    \"array\": true\n  }, {\n    \"name\": \"levels\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"nice\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"resolve\",\n    \"type\": \"enum\",\n    \"values\": [\"shared\", \"independent\"],\n    \"default\": \"independent\"\n  }, {\n    \"name\": \"zero\",\n    \"type\": \"boolean\",\n    \"default\": true\n  }, {\n    \"name\": \"smooth\",\n    \"type\": \"boolean\",\n    \"default\": true\n  }, {\n    \"name\": \"scale\",\n    \"type\": \"number\",\n    \"expr\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"null\": true,\n    \"default\": \"contour\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Isocontour, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (this.value && !pulse.changed() && !_.modified()) {\n    return pulse.StopPropagation;\n  }\n\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      source = pulse.materialize(pulse.SOURCE).source,\n      field = _.field || _vegaUtil.identity,\n      contour = (0, _contours.default)().smooth(_.smooth !== false),\n      tz = _.thresholds || levels(source, field, _),\n      as = _.as === null ? null : _.as || 'contour',\n      values = [];\n  source.forEach(t => {\n    const grid = field(t); // generate contour paths in GeoJSON format\n\n    const paths = contour.size([grid.width, grid.height])(grid.values, (0, _vegaUtil.isArray)(tz) ? tz : tz(grid.values)); // adjust contour path coordinates as needed\n\n    if (_.scale || grid.x1 || grid.y1 || grid.scale) {\n      var s = _.scale;\n      paths.forEach(transform(grid, (0, _vegaUtil.isFunction)(s) ? s(t, _) : s));\n    } // ingest; copy source data properties to output\n\n\n    paths.forEach(p => {\n      values.push((0, _vegaDataflow.rederive)(t, (0, _vegaDataflow.ingest)(as != null ? {\n        [as]: p\n      } : p)));\n    });\n  });\n  if (this.value) out.rem = this.value;\n  this.value = out.source = out.add = values;\n  return out;\n};\n\nfunction levels(values, f, _) {\n  const q = (0, _quantize.default)(_.levels || 10, _.nice, _.zero !== false);\n  return _.resolve !== 'shared' ? q : q(values.map(t => (0, _d3Array.max)(f(t).values)));\n}\n\nfunction transform(grid, scale) {\n  const x1 = grid.x1 || 0,\n        y1 = grid.y1 || 0,\n        s = scale != null ? scale : grid.scale || 1;\n\n  function transformPolygon(coordinates) {\n    coordinates.forEach(transformRing);\n  }\n\n  function transformRing(coordinates) {\n    coordinates.forEach(transformPoint);\n  }\n\n  function transformPoint(coordinates) {\n    coordinates[0] = (coordinates[0] - x1) * s;\n    coordinates[1] = (coordinates[1] - y1) * s;\n  }\n\n  return function (geometry) {\n    geometry.coordinates.forEach(transformPolygon);\n    return geometry;\n  };\n}\n},{\"d3-array\":\"K0bd\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"./util/contours\":\"zyGn\",\"./util/quantize\":\"FmeN\"}],\"iqlf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\nfunction radius(bw, data, f) {\n  const v = bw >= 0 ? bw : (0, _vegaStatistics.bandwidthNRD)(data, f);\n  return Math.round((Math.sqrt(4 * v * v + 1) - 1) / 2);\n}\n\nfunction number(_) {\n  return (0, _vegaUtil.isFunction)(_) ? _ : (0, _vegaUtil.constant)(+_);\n} // Implementation adapted from d3/d3-contour. Thanks!\n\n\nfunction _default() {\n  var x = d => d[0],\n      y = d => d[1],\n      weight = _vegaUtil.one,\n      bandwidth = [-1, -1],\n      dx = 960,\n      dy = 500,\n      k = 2; // log2(cellSize)\n\n\n  function density(data, counts) {\n    const rx = radius(bandwidth[0], data, x) >> k,\n          // blur x-radius\n    ry = radius(bandwidth[1], data, y) >> k,\n          // blur y-radius\n    ox = rx ? rx + 2 : 0,\n          // x-offset padding for blur\n    oy = ry ? ry + 2 : 0,\n          // y-offset padding for blur\n    n = 2 * ox + (dx >> k),\n          // grid width\n    m = 2 * oy + (dy >> k),\n          // grid height\n    values0 = new Float32Array(n * m),\n          values1 = new Float32Array(n * m);\n    let values = values0;\n    data.forEach(d => {\n      const xi = ox + (+x(d) >> k),\n            yi = oy + (+y(d) >> k);\n\n      if (xi >= 0 && xi < n && yi >= 0 && yi < m) {\n        values0[xi + yi * n] += +weight(d);\n      }\n    });\n\n    if (rx > 0 && ry > 0) {\n      blurX(n, m, values0, values1, rx);\n      blurY(n, m, values1, values0, ry);\n      blurX(n, m, values0, values1, rx);\n      blurY(n, m, values1, values0, ry);\n      blurX(n, m, values0, values1, rx);\n      blurY(n, m, values1, values0, ry);\n    } else if (rx > 0) {\n      blurX(n, m, values0, values1, rx);\n      blurX(n, m, values1, values0, rx);\n      blurX(n, m, values0, values1, rx);\n      values = values1;\n    } else if (ry > 0) {\n      blurY(n, m, values0, values1, ry);\n      blurY(n, m, values1, values0, ry);\n      blurY(n, m, values0, values1, ry);\n      values = values1;\n    } // scale density estimates\n    // density in points per square pixel or probability density\n\n\n    let s = counts ? Math.pow(2, -2 * k) : 1 / (0, _d3Array.sum)(values);\n\n    for (let i = 0, sz = n * m; i < sz; ++i) values[i] *= s;\n\n    return {\n      values: values,\n      scale: 1 << k,\n      width: n,\n      height: m,\n      x1: ox,\n      y1: oy,\n      x2: ox + (dx >> k),\n      y2: oy + (dy >> k)\n    };\n  }\n\n  density.x = function (_) {\n    return arguments.length ? (x = number(_), density) : x;\n  };\n\n  density.y = function (_) {\n    return arguments.length ? (y = number(_), density) : y;\n  };\n\n  density.weight = function (_) {\n    return arguments.length ? (weight = number(_), density) : weight;\n  };\n\n  density.size = function (_) {\n    if (!arguments.length) return [dx, dy];\n\n    var _0 = Math.ceil(_[0]),\n        _1 = Math.ceil(_[1]);\n\n    if (!(_0 >= 0) && !(_0 >= 0)) (0, _vegaUtil.error)('invalid size');\n    return dx = _0, dy = _1, density;\n  };\n\n  density.cellSize = function (_) {\n    if (!arguments.length) return 1 << k;\n    if (!((_ = +_) >= 1)) (0, _vegaUtil.error)('invalid cell size');\n    k = Math.floor(Math.log(_) / Math.LN2);\n    return density;\n  };\n\n  density.bandwidth = function (_) {\n    if (!arguments.length) return bandwidth;\n    _ = (0, _vegaUtil.array)(_);\n    if (_.length === 1) _ = [+_[0], +_[0]];\n    if (_.length !== 2) (0, _vegaUtil.error)('invalid bandwidth');\n    return bandwidth = _, density;\n  };\n\n  return density;\n}\n\nfunction blurX(n, m, source, target, r) {\n  const w = (r << 1) + 1;\n\n  for (let j = 0; j < m; ++j) {\n    for (let i = 0, sr = 0; i < n + r; ++i) {\n      if (i < n) {\n        sr += source[i + j * n];\n      }\n\n      if (i >= r) {\n        if (i >= w) {\n          sr -= source[i - w + j * n];\n        }\n\n        target[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);\n      }\n    }\n  }\n}\n\nfunction blurY(n, m, source, target, r) {\n  const w = (r << 1) + 1;\n\n  for (let i = 0; i < n; ++i) {\n    for (let j = 0, sr = 0; j < m + r; ++j) {\n      if (j < m) {\n        sr += source[i + j * n];\n      }\n\n      if (j >= r) {\n        if (j >= w) {\n          sr -= source[i + (j - w) * n];\n        }\n\n        target[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);\n      }\n    }\n  }\n}\n},{\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\"}],\"gQ9n\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = KDE2D;\nexports.params = params;\nexports.partition = partition;\n\nvar _density2D = _interopRequireDefault(require(\"./util/density2D\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Perform 2D kernel-density estimation of point data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<number>} params.size - The [width, height] extent (in\n *   units of input pixels) over which to perform density estimation.\n * @param {function(object): number} params.x - The x-coordinate accessor.\n * @param {function(object): number} params.y - The y-coordinate accessor.\n * @param {function(object): number} [params.weight] - The weight accessor.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {number} [params.cellSize] - Contour density calculation cell size.\n *   This parameter determines the level of spatial approximation. For example,\n *   the default value of 4 maps to 2x reductions in both x- and y- dimensions.\n *   A value of 1 will result in an output raster grid whose dimensions exactly\n *   matches the size parameter.\n * @param {Array<number>} [params.bandwidth] - The KDE kernel bandwidths,\n *   in pixels. The input can be a two-element array specifying separate\n *   x and y bandwidths, or a single-element array specifying both. If the\n *   bandwidth is unspecified or less than zero, the bandwidth will be\n *   automatically determined.\n * @param {boolean} [params.counts=false] - A boolean flag indicating if the\n *   output values should be probability estimates (false, default) or\n *   smoothed counts (true).\n * @param {string} [params.as='grid'] - The output field in which to store\n *   the generated raster grid (default 'grid').\n */\nfunction KDE2D(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nKDE2D.Definition = {\n  \"type\": \"KDE2D\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2,\n    \"required\": true\n  }, {\n    \"name\": \"x\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"y\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"weight\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"cellSize\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"bandwidth\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"counts\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"default\": \"grid\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(KDE2D, _vegaDataflow.Transform);\nconst PARAMS = ['x', 'y', 'weight', 'size', 'cellSize', 'bandwidth'];\n\nfunction params(obj, _) {\n  PARAMS.forEach(param => _[param] != null ? obj[param](_[param]) : 0);\n  return obj;\n}\n\nprototype.transform = function (_, pulse) {\n  if (this.value && !pulse.changed() && !_.modified()) return pulse.StopPropagation;\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      source = pulse.materialize(pulse.SOURCE).source,\n      groups = partition(source, _.groupby),\n      names = (_.groupby || []).map(_vegaUtil.accessorName),\n      kde = params((0, _density2D.default)(), _),\n      as = _.as || 'grid',\n      values = [];\n\n  function set(t, vals) {\n    for (let i = 0; i < names.length; ++i) t[names[i]] = vals[i];\n\n    return t;\n  } // generate density raster grids\n\n\n  values = groups.map(g => (0, _vegaDataflow.ingest)(set({\n    [as]: kde(g, _.counts)\n  }, g.dims)));\n  if (this.value) out.rem = this.value;\n  this.value = out.source = out.add = values;\n  return out;\n};\n\nfunction partition(data, groupby) {\n  var groups = [],\n      get = f => f(t),\n      map,\n      i,\n      n,\n      t,\n      k,\n      g; // partition data points into groups\n\n\n  if (groupby == null) {\n    groups.push(data);\n  } else {\n    for (map = {}, i = 0, n = data.length; i < n; ++i) {\n      t = data[i];\n      k = groupby.map(get);\n      g = map[k];\n\n      if (!g) {\n        map[k] = g = [];\n        g.dims = k;\n        groups.push(g);\n      }\n\n      g.push(t);\n    }\n  }\n\n  return groups;\n}\n},{\"./util/density2D\":\"iqlf\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"QzBe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Contour;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _Isocontour = require(\"./Isocontour\");\n\nvar _KDE2D = require(\"./KDE2D\");\n\nvar _contours = _interopRequireDefault(require(\"./util/contours\"));\n\nvar _density2D = _interopRequireDefault(require(\"./util/density2D\"));\n\nvar _quantize = _interopRequireDefault(require(\"./util/quantize\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Generate contours based on kernel-density estimation of point data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<number>} params.size - The dimensions [width, height] over which to compute contours.\n *  If the values parameter is provided, this must be the dimensions of the input data.\n *  If density estimation is performed, this is the output view dimensions in pixels.\n * @param {Array<number>} [params.values] - An array of numeric values representing an\n *  width x height grid of values over which to compute contours. If unspecified, this\n *  transform will instead attempt to compute contours for the kernel density estimate\n *  using values drawn from data tuples in the input pulse.\n * @param {function(object): number} [params.x] - The pixel x-coordinate accessor for density estimation.\n * @param {function(object): number} [params.y] - The pixel y-coordinate accessor for density estimation.\n * @param {function(object): number} [params.weight] - The data point weight accessor for density estimation.\n * @param {number} [params.cellSize] - Contour density calculation cell size.\n * @param {number} [params.bandwidth] - Kernel density estimation bandwidth.\n * @param {Array<number>} [params.thresholds] - Contour threshold array. If\n *   this parameter is set, the count and nice parameters will be ignored.\n * @param {number} [params.count] - The desired number of contours.\n * @param {boolean} [params.nice] - Boolean flag indicating if the contour\n *   threshold values should be automatically aligned to \"nice\"\n *   human-friendly values. Setting this flag may cause the number of\n *   thresholds to deviate from the specified count.\n * @param {boolean} [params.smooth] - Boolean flag indicating if the contour\n *   polygons should be smoothed using linear interpolation. The default is\n *   true. The parameter is ignored when using density estimation.\n */\nfunction Contour(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nContour.Definition = {\n  \"type\": \"Contour\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2,\n    \"required\": true\n  }, {\n    \"name\": \"values\",\n    \"type\": \"number\",\n    \"array\": true\n  }, {\n    \"name\": \"x\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"y\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"weight\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"cellSize\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"bandwidth\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"count\",\n    \"type\": \"number\"\n  }, {\n    \"name\": \"nice\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"thresholds\",\n    \"type\": \"number\",\n    \"array\": true\n  }, {\n    \"name\": \"smooth\",\n    \"type\": \"boolean\",\n    \"default\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Contour, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (this.value && !pulse.changed() && !_.modified()) {\n    return pulse.StopPropagation;\n  }\n\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS),\n      contour = (0, _contours.default)().smooth(_.smooth !== false),\n      values = _.values,\n      thresh = _.thresholds || (0, _quantize.default)(_.count || 10, _.nice, !!values),\n      size = _.size,\n      grid,\n      post;\n\n  if (!values) {\n    values = pulse.materialize(pulse.SOURCE).source;\n    grid = (0, _KDE2D.params)((0, _density2D.default)(), _)(values, true);\n    post = (0, _Isocontour.transform)(grid);\n    size = [grid.width, grid.height];\n    values = grid.values;\n  }\n\n  thresh = (0, _vegaUtil.isArray)(thresh) ? thresh : thresh(values);\n  values = contour.size(size)(values, thresh);\n  if (post) values.forEach(post);\n  if (this.value) out.rem = this.value;\n  this.value = out.source = out.add = (values || []).map(_vegaDataflow.ingest);\n  return out;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"./Isocontour\":\"zTBn\",\"./KDE2D\":\"gQ9n\",\"./util/contours\":\"zyGn\",\"./util/density2D\":\"iqlf\",\"./util/quantize\":\"FmeN\"}],\"PN9h\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MultiPoint = exports.FeatureCollection = exports.Feature = void 0;\nvar Feature = 'Feature';\nexports.Feature = Feature;\nvar FeatureCollection = 'FeatureCollection';\nexports.FeatureCollection = FeatureCollection;\nvar MultiPoint = 'MultiPoint';\nexports.MultiPoint = MultiPoint;\n},{}],\"t2xF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = GeoJSON;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Consolidate an array of [longitude, latitude] points or GeoJSON features\n * into a combined GeoJSON object. This transform is particularly useful for\n * combining geo data for a Projection's fit argument. The resulting GeoJSON\n * data is available as this transform's value. Input pulses are unchanged.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.fields] - A two-element array\n *   of field accessors for the longitude and latitude values.\n * @param {function(object): *} params.geojson - A field accessor for\n *   retrieving GeoJSON feature data.\n */\nfunction GeoJSON(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nGeoJSON.Definition = {\n  \"type\": \"GeoJSON\",\n  \"metadata\": {},\n  \"params\": [{\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"geojson\",\n    \"type\": \"field\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(GeoJSON, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var features = this._features,\n      points = this._points,\n      fields = _.fields,\n      lon = fields && fields[0],\n      lat = fields && fields[1],\n      geojson = _.geojson || !fields && _vegaUtil.identity,\n      flag = pulse.ADD,\n      mod;\n  mod = _.modified() || pulse.changed(pulse.REM) || pulse.modified((0, _vegaUtil.accessorFields)(geojson)) || lon && pulse.modified((0, _vegaUtil.accessorFields)(lon)) || lat && pulse.modified((0, _vegaUtil.accessorFields)(lat));\n\n  if (!this.value || mod) {\n    flag = pulse.SOURCE;\n    this._features = features = [];\n    this._points = points = [];\n  }\n\n  if (geojson) {\n    pulse.visit(flag, function (t) {\n      features.push(geojson(t));\n    });\n  }\n\n  if (lon && lat) {\n    pulse.visit(flag, function (t) {\n      var x = lon(t),\n          y = lat(t);\n\n      if (x != null && y != null && (x = +x) === x && (y = +y) === y) {\n        points.push([x, y]);\n      }\n    });\n    features = features.concat({\n      type: _constants.Feature,\n      geometry: {\n        type: _constants.MultiPoint,\n        coordinates: points\n      }\n    });\n  }\n\n  this.value = {\n    type: _constants.FeatureCollection,\n    features: features\n  };\n};\n},{\"./constants\":\"PN9h\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"fG8A\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Adds floating point numbers with twice the normal precision.\n// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and\n// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)\n// 305–363 (1997).\n// Code adapted from GeographicLib by Charles F. F. Karney,\n// http://geographiclib.sourceforge.net/\nfunction _default() {\n  return new Adder();\n}\n\nfunction Adder() {\n  this.reset();\n}\n\nAdder.prototype = {\n  constructor: Adder,\n  reset: function () {\n    this.s = // rounded value\n    this.t = 0; // exact error\n  },\n  add: function (y) {\n    add(temp, y, this.t);\n    add(this, temp.s, this.s);\n    if (this.s) this.t += temp.t;else this.s = temp.t;\n  },\n  valueOf: function () {\n    return this.s;\n  }\n};\nvar temp = new Adder();\n\nfunction add(adder, a, b) {\n  var x = adder.s = a + b,\n      bv = x - a,\n      av = x - bv;\n  adder.t = a - av + (b - bv);\n}\n},{}],\"JQgf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.acos = acos;\nexports.asin = asin;\nexports.haversin = haversin;\nexports.tan = exports.sqrt = exports.sign = exports.sin = exports.pow = exports.log = exports.floor = exports.exp = exports.ceil = exports.cos = exports.atan2 = exports.atan = exports.abs = exports.radians = exports.degrees = exports.tau = exports.quarterPi = exports.halfPi = exports.pi = exports.epsilon2 = exports.epsilon = void 0;\nvar epsilon = 1e-6;\nexports.epsilon = epsilon;\nvar epsilon2 = 1e-12;\nexports.epsilon2 = epsilon2;\nvar pi = Math.PI;\nexports.pi = pi;\nvar halfPi = pi / 2;\nexports.halfPi = halfPi;\nvar quarterPi = pi / 4;\nexports.quarterPi = quarterPi;\nvar tau = pi * 2;\nexports.tau = tau;\nvar degrees = 180 / pi;\nexports.degrees = degrees;\nvar radians = pi / 180;\nexports.radians = radians;\nvar abs = Math.abs;\nexports.abs = abs;\nvar atan = Math.atan;\nexports.atan = atan;\nvar atan2 = Math.atan2;\nexports.atan2 = atan2;\nvar cos = Math.cos;\nexports.cos = cos;\nvar ceil = Math.ceil;\nexports.ceil = ceil;\nvar exp = Math.exp;\nexports.exp = exp;\nvar floor = Math.floor;\nexports.floor = floor;\nvar log = Math.log;\nexports.log = log;\nvar pow = Math.pow;\nexports.pow = pow;\nvar sin = Math.sin;\nexports.sin = sin;\n\nvar sign = Math.sign || function (x) {\n  return x > 0 ? 1 : x < 0 ? -1 : 0;\n};\n\nexports.sign = sign;\nvar sqrt = Math.sqrt;\nexports.sqrt = sqrt;\nvar tan = Math.tan;\nexports.tan = tan;\n\nfunction acos(x) {\n  return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nfunction asin(x) {\n  return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\n\nfunction haversin(x) {\n  return (x = sin(x / 2)) * x;\n}\n},{}],\"DUih\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = noop;\n\nfunction noop() {}\n},{}],\"XQuq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction streamGeometry(geometry, stream) {\n  if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n    streamGeometryType[geometry.type](geometry, stream);\n  }\n}\n\nvar streamObjectType = {\n  Feature: function (object, stream) {\n    streamGeometry(object.geometry, stream);\n  },\n  FeatureCollection: function (object, stream) {\n    var features = object.features,\n        i = -1,\n        n = features.length;\n\n    while (++i < n) streamGeometry(features[i].geometry, stream);\n  }\n};\nvar streamGeometryType = {\n  Sphere: function (object, stream) {\n    stream.sphere();\n  },\n  Point: function (object, stream) {\n    object = object.coordinates;\n    stream.point(object[0], object[1], object[2]);\n  },\n  MultiPoint: function (object, stream) {\n    var coordinates = object.coordinates,\n        i = -1,\n        n = coordinates.length;\n\n    while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);\n  },\n  LineString: function (object, stream) {\n    streamLine(object.coordinates, stream, 0);\n  },\n  MultiLineString: function (object, stream) {\n    var coordinates = object.coordinates,\n        i = -1,\n        n = coordinates.length;\n\n    while (++i < n) streamLine(coordinates[i], stream, 0);\n  },\n  Polygon: function (object, stream) {\n    streamPolygon(object.coordinates, stream);\n  },\n  MultiPolygon: function (object, stream) {\n    var coordinates = object.coordinates,\n        i = -1,\n        n = coordinates.length;\n\n    while (++i < n) streamPolygon(coordinates[i], stream);\n  },\n  GeometryCollection: function (object, stream) {\n    var geometries = object.geometries,\n        i = -1,\n        n = geometries.length;\n\n    while (++i < n) streamGeometry(geometries[i], stream);\n  }\n};\n\nfunction streamLine(coordinates, stream, closed) {\n  var i = -1,\n      n = coordinates.length - closed,\n      coordinate;\n  stream.lineStart();\n\n  while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n\n  stream.lineEnd();\n}\n\nfunction streamPolygon(coordinates, stream) {\n  var i = -1,\n      n = coordinates.length;\n  stream.polygonStart();\n\n  while (++i < n) streamLine(coordinates[i], stream, 1);\n\n  stream.polygonEnd();\n}\n\nfunction _default(object, stream) {\n  if (object && streamObjectType.hasOwnProperty(object.type)) {\n    streamObjectType[object.type](object, stream);\n  } else {\n    streamGeometry(object, stream);\n  }\n}\n},{}],\"rKta\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.areaStream = exports.areaRingSum = void 0;\n\nvar _adder = _interopRequireDefault(require(\"./adder.js\"));\n\nvar _math = require(\"./math.js\");\n\nvar _noop = _interopRequireDefault(require(\"./noop.js\"));\n\nvar _stream = _interopRequireDefault(require(\"./stream.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar areaRingSum = (0, _adder.default)();\nexports.areaRingSum = areaRingSum;\nvar areaSum = (0, _adder.default)(),\n    lambda00,\n    phi00,\n    lambda0,\n    cosPhi0,\n    sinPhi0;\nvar areaStream = {\n  point: _noop.default,\n  lineStart: _noop.default,\n  lineEnd: _noop.default,\n  polygonStart: function () {\n    areaRingSum.reset();\n    areaStream.lineStart = areaRingStart;\n    areaStream.lineEnd = areaRingEnd;\n  },\n  polygonEnd: function () {\n    var areaRing = +areaRingSum;\n    areaSum.add(areaRing < 0 ? _math.tau + areaRing : areaRing);\n    this.lineStart = this.lineEnd = this.point = _noop.default;\n  },\n  sphere: function () {\n    areaSum.add(_math.tau);\n  }\n};\nexports.areaStream = areaStream;\n\nfunction areaRingStart() {\n  areaStream.point = areaPointFirst;\n}\n\nfunction areaRingEnd() {\n  areaPoint(lambda00, phi00);\n}\n\nfunction areaPointFirst(lambda, phi) {\n  areaStream.point = areaPoint;\n  lambda00 = lambda, phi00 = phi;\n  lambda *= _math.radians, phi *= _math.radians;\n  lambda0 = lambda, cosPhi0 = (0, _math.cos)(phi = phi / 2 + _math.quarterPi), sinPhi0 = (0, _math.sin)(phi);\n}\n\nfunction areaPoint(lambda, phi) {\n  lambda *= _math.radians, phi *= _math.radians;\n  phi = phi / 2 + _math.quarterPi; // half the angular distance from south pole\n  // Spherical excess E for a spherical triangle with vertices: south pole,\n  // previous point, current point.  Uses a formula derived from Cagnoli’s\n  // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n\n  var dLambda = lambda - lambda0,\n      sdLambda = dLambda >= 0 ? 1 : -1,\n      adLambda = sdLambda * dLambda,\n      cosPhi = (0, _math.cos)(phi),\n      sinPhi = (0, _math.sin)(phi),\n      k = sinPhi0 * sinPhi,\n      u = cosPhi0 * cosPhi + k * (0, _math.cos)(adLambda),\n      v = k * sdLambda * (0, _math.sin)(adLambda);\n  areaRingSum.add((0, _math.atan2)(v, u)); // Advance the previous points.\n\n  lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\n\nfunction _default(object) {\n  areaSum.reset();\n  (0, _stream.default)(object, areaStream);\n  return areaSum * 2;\n}\n},{\"./adder.js\":\"fG8A\",\"./math.js\":\"JQgf\",\"./noop.js\":\"DUih\",\"./stream.js\":\"XQuq\"}],\"V83Q\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.spherical = spherical;\nexports.cartesian = cartesian;\nexports.cartesianDot = cartesianDot;\nexports.cartesianCross = cartesianCross;\nexports.cartesianAddInPlace = cartesianAddInPlace;\nexports.cartesianScale = cartesianScale;\nexports.cartesianNormalizeInPlace = cartesianNormalizeInPlace;\n\nvar _math = require(\"./math.js\");\n\nfunction spherical(cartesian) {\n  return [(0, _math.atan2)(cartesian[1], cartesian[0]), (0, _math.asin)(cartesian[2])];\n}\n\nfunction cartesian(spherical) {\n  var lambda = spherical[0],\n      phi = spherical[1],\n      cosPhi = (0, _math.cos)(phi);\n  return [cosPhi * (0, _math.cos)(lambda), cosPhi * (0, _math.sin)(lambda), (0, _math.sin)(phi)];\n}\n\nfunction cartesianDot(a, b) {\n  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nfunction cartesianCross(a, b) {\n  return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];\n} // TODO return a\n\n\nfunction cartesianAddInPlace(a, b) {\n  a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\n\nfunction cartesianScale(vector, k) {\n  return [vector[0] * k, vector[1] * k, vector[2] * k];\n} // TODO return d\n\n\nfunction cartesianNormalizeInPlace(d) {\n  var l = (0, _math.sqrt)(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n  d[0] /= l, d[1] /= l, d[2] /= l;\n}\n},{\"./math.js\":\"JQgf\"}],\"rw3L\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _adder = _interopRequireDefault(require(\"./adder.js\"));\n\nvar _area = require(\"./area.js\");\n\nvar _cartesian = require(\"./cartesian.js\");\n\nvar _math = require(\"./math.js\");\n\nvar _stream = _interopRequireDefault(require(\"./stream.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar lambda0,\n    phi0,\n    lambda1,\n    phi1,\n    // bounds\nlambda2,\n    // previous lambda-coordinate\nlambda00,\n    phi00,\n    // first point\np0,\n    // previous 3D point\ndeltaSum = (0, _adder.default)(),\n    ranges,\n    range;\nvar boundsStream = {\n  point: boundsPoint,\n  lineStart: boundsLineStart,\n  lineEnd: boundsLineEnd,\n  polygonStart: function () {\n    boundsStream.point = boundsRingPoint;\n    boundsStream.lineStart = boundsRingStart;\n    boundsStream.lineEnd = boundsRingEnd;\n    deltaSum.reset();\n\n    _area.areaStream.polygonStart();\n  },\n  polygonEnd: function () {\n    _area.areaStream.polygonEnd();\n\n    boundsStream.point = boundsPoint;\n    boundsStream.lineStart = boundsLineStart;\n    boundsStream.lineEnd = boundsLineEnd;\n    if (_area.areaRingSum < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);else if (deltaSum > _math.epsilon) phi1 = 90;else if (deltaSum < -_math.epsilon) phi0 = -90;\n    range[0] = lambda0, range[1] = lambda1;\n  },\n  sphere: function () {\n    lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n  }\n};\n\nfunction boundsPoint(lambda, phi) {\n  ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n  if (phi < phi0) phi0 = phi;\n  if (phi > phi1) phi1 = phi;\n}\n\nfunction linePoint(lambda, phi) {\n  var p = (0, _cartesian.cartesian)([lambda * _math.radians, phi * _math.radians]);\n\n  if (p0) {\n    var normal = (0, _cartesian.cartesianCross)(p0, p),\n        equatorial = [normal[1], -normal[0], 0],\n        inflection = (0, _cartesian.cartesianCross)(equatorial, normal);\n    (0, _cartesian.cartesianNormalizeInPlace)(inflection);\n    inflection = (0, _cartesian.spherical)(inflection);\n    var delta = lambda - lambda2,\n        sign = delta > 0 ? 1 : -1,\n        lambdai = inflection[0] * _math.degrees * sign,\n        phii,\n        antimeridian = (0, _math.abs)(delta) > 180;\n\n    if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n      phii = inflection[1] * _math.degrees;\n      if (phii > phi1) phi1 = phii;\n    } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n      phii = -inflection[1] * _math.degrees;\n      if (phii < phi0) phi0 = phii;\n    } else {\n      if (phi < phi0) phi0 = phi;\n      if (phi > phi1) phi1 = phi;\n    }\n\n    if (antimeridian) {\n      if (lambda < lambda2) {\n        if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n      } else {\n        if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n      }\n    } else {\n      if (lambda1 >= lambda0) {\n        if (lambda < lambda0) lambda0 = lambda;\n        if (lambda > lambda1) lambda1 = lambda;\n      } else {\n        if (lambda > lambda2) {\n          if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n        } else {\n          if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        }\n      }\n    }\n  } else {\n    ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);\n  }\n\n  if (phi < phi0) phi0 = phi;\n  if (phi > phi1) phi1 = phi;\n  p0 = p, lambda2 = lambda;\n}\n\nfunction boundsLineStart() {\n  boundsStream.point = linePoint;\n}\n\nfunction boundsLineEnd() {\n  range[0] = lambda0, range[1] = lambda1;\n  boundsStream.point = boundsPoint;\n  p0 = null;\n}\n\nfunction boundsRingPoint(lambda, phi) {\n  if (p0) {\n    var delta = lambda - lambda2;\n    deltaSum.add((0, _math.abs)(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n  } else {\n    lambda00 = lambda, phi00 = phi;\n  }\n\n  _area.areaStream.point(lambda, phi);\n\n  linePoint(lambda, phi);\n}\n\nfunction boundsRingStart() {\n  _area.areaStream.lineStart();\n}\n\nfunction boundsRingEnd() {\n  boundsRingPoint(lambda00, phi00);\n\n  _area.areaStream.lineEnd();\n\n  if ((0, _math.abs)(deltaSum) > _math.epsilon) lambda0 = -(lambda1 = 180);\n  range[0] = lambda0, range[1] = lambda1;\n  p0 = null;\n} // Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want\n// the distance between ±180° to be 360°.\n\n\nfunction angle(lambda0, lambda1) {\n  return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;\n}\n\nfunction rangeCompare(a, b) {\n  return a[0] - b[0];\n}\n\nfunction rangeContains(range, x) {\n  return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n}\n\nfunction _default(feature) {\n  var i, n, a, b, merged, deltaMax, delta;\n  phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n  ranges = [];\n  (0, _stream.default)(feature, boundsStream); // First, sort ranges by their minimum longitudes.\n\n  if (n = ranges.length) {\n    ranges.sort(rangeCompare); // Then, merge any ranges that overlap.\n\n    for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {\n      b = ranges[i];\n\n      if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n        if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n        if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n      } else {\n        merged.push(a = b);\n      }\n    } // Finally, find the largest gap between the merged ranges.\n    // The final bounding box will be the inverse of this gap.\n\n\n    for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {\n      b = merged[i];\n      if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n    }\n  }\n\n  ranges = range = null;\n  return lambda0 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0, phi0], [lambda1, phi1]];\n}\n},{\"./adder.js\":\"fG8A\",\"./area.js\":\"rKta\",\"./cartesian.js\":\"V83Q\",\"./math.js\":\"JQgf\",\"./stream.js\":\"XQuq\"}],\"GCsQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _math = require(\"./math.js\");\n\nvar _noop = _interopRequireDefault(require(\"./noop.js\"));\n\nvar _stream = _interopRequireDefault(require(\"./stream.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar W0, W1, X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, lambda00, phi00, // first point\nx0, y0, z0; // previous point\n\nvar centroidStream = {\n  sphere: _noop.default,\n  point: centroidPoint,\n  lineStart: centroidLineStart,\n  lineEnd: centroidLineEnd,\n  polygonStart: function () {\n    centroidStream.lineStart = centroidRingStart;\n    centroidStream.lineEnd = centroidRingEnd;\n  },\n  polygonEnd: function () {\n    centroidStream.lineStart = centroidLineStart;\n    centroidStream.lineEnd = centroidLineEnd;\n  }\n}; // Arithmetic mean of Cartesian vectors.\n\nfunction centroidPoint(lambda, phi) {\n  lambda *= _math.radians, phi *= _math.radians;\n  var cosPhi = (0, _math.cos)(phi);\n  centroidPointCartesian(cosPhi * (0, _math.cos)(lambda), cosPhi * (0, _math.sin)(lambda), (0, _math.sin)(phi));\n}\n\nfunction centroidPointCartesian(x, y, z) {\n  ++W0;\n  X0 += (x - X0) / W0;\n  Y0 += (y - Y0) / W0;\n  Z0 += (z - Z0) / W0;\n}\n\nfunction centroidLineStart() {\n  centroidStream.point = centroidLinePointFirst;\n}\n\nfunction centroidLinePointFirst(lambda, phi) {\n  lambda *= _math.radians, phi *= _math.radians;\n  var cosPhi = (0, _math.cos)(phi);\n  x0 = cosPhi * (0, _math.cos)(lambda);\n  y0 = cosPhi * (0, _math.sin)(lambda);\n  z0 = (0, _math.sin)(phi);\n  centroidStream.point = centroidLinePoint;\n  centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidLinePoint(lambda, phi) {\n  lambda *= _math.radians, phi *= _math.radians;\n  var cosPhi = (0, _math.cos)(phi),\n      x = cosPhi * (0, _math.cos)(lambda),\n      y = cosPhi * (0, _math.sin)(lambda),\n      z = (0, _math.sin)(phi),\n      w = (0, _math.atan2)((0, _math.sqrt)((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n  W1 += w;\n  X1 += w * (x0 + (x0 = x));\n  Y1 += w * (y0 + (y0 = y));\n  Z1 += w * (z0 + (z0 = z));\n  centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidLineEnd() {\n  centroidStream.point = centroidPoint;\n} // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,\n// J. Applied Mechanics 42, 239 (1975).\n\n\nfunction centroidRingStart() {\n  centroidStream.point = centroidRingPointFirst;\n}\n\nfunction centroidRingEnd() {\n  centroidRingPoint(lambda00, phi00);\n  centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingPointFirst(lambda, phi) {\n  lambda00 = lambda, phi00 = phi;\n  lambda *= _math.radians, phi *= _math.radians;\n  centroidStream.point = centroidRingPoint;\n  var cosPhi = (0, _math.cos)(phi);\n  x0 = cosPhi * (0, _math.cos)(lambda);\n  y0 = cosPhi * (0, _math.sin)(lambda);\n  z0 = (0, _math.sin)(phi);\n  centroidPointCartesian(x0, y0, z0);\n}\n\nfunction centroidRingPoint(lambda, phi) {\n  lambda *= _math.radians, phi *= _math.radians;\n  var cosPhi = (0, _math.cos)(phi),\n      x = cosPhi * (0, _math.cos)(lambda),\n      y = cosPhi * (0, _math.sin)(lambda),\n      z = (0, _math.sin)(phi),\n      cx = y0 * z - z0 * y,\n      cy = z0 * x - x0 * z,\n      cz = x0 * y - y0 * x,\n      m = (0, _math.sqrt)(cx * cx + cy * cy + cz * cz),\n      w = (0, _math.asin)(m),\n      // line weight = angle\n  v = m && -w / m; // area weight multiplier\n\n  X2 += v * cx;\n  Y2 += v * cy;\n  Z2 += v * cz;\n  W1 += w;\n  X1 += w * (x0 + (x0 = x));\n  Y1 += w * (y0 + (y0 = y));\n  Z1 += w * (z0 + (z0 = z));\n  centroidPointCartesian(x0, y0, z0);\n}\n\nfunction _default(object) {\n  W0 = W1 = X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;\n  (0, _stream.default)(object, centroidStream);\n  var x = X2,\n      y = Y2,\n      z = Z2,\n      m = x * x + y * y + z * z; // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.\n\n  if (m < _math.epsilon2) {\n    x = X1, y = Y1, z = Z1; // If the feature has zero length, fall back to arithmetic mean of point vectors.\n\n    if (W1 < _math.epsilon) x = X0, y = Y0, z = Z0;\n    m = x * x + y * y + z * z; // If the feature still has an undefined ccentroid, then return.\n\n    if (m < _math.epsilon2) return [NaN, NaN];\n  }\n\n  return [(0, _math.atan2)(y, x) * _math.degrees, (0, _math.asin)(z / (0, _math.sqrt)(m)) * _math.degrees];\n}\n},{\"./math.js\":\"JQgf\",\"./noop.js\":\"DUih\",\"./stream.js\":\"XQuq\"}],\"tY9i\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(a, b) {\n  function compose(x, y) {\n    return x = a(x, y), b(x[0], x[1]);\n  }\n\n  if (a.invert && b.invert) compose.invert = function (x, y) {\n    return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n  };\n  return compose;\n}\n},{}],\"LqUY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.rotateRadians = rotateRadians;\nexports.default = _default;\n\nvar _compose = _interopRequireDefault(require(\"./compose.js\"));\n\nvar _math = require(\"./math.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction rotationIdentity(lambda, phi) {\n  return [(0, _math.abs)(lambda) > _math.pi ? lambda + Math.round(-lambda / _math.tau) * _math.tau : lambda, phi];\n}\n\nrotationIdentity.invert = rotationIdentity;\n\nfunction rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n  return (deltaLambda %= _math.tau) ? deltaPhi || deltaGamma ? (0, _compose.default)(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;\n}\n\nfunction forwardRotationLambda(deltaLambda) {\n  return function (lambda, phi) {\n    return lambda += deltaLambda, [lambda > _math.pi ? lambda - _math.tau : lambda < -_math.pi ? lambda + _math.tau : lambda, phi];\n  };\n}\n\nfunction rotationLambda(deltaLambda) {\n  var rotation = forwardRotationLambda(deltaLambda);\n  rotation.invert = forwardRotationLambda(-deltaLambda);\n  return rotation;\n}\n\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n  var cosDeltaPhi = (0, _math.cos)(deltaPhi),\n      sinDeltaPhi = (0, _math.sin)(deltaPhi),\n      cosDeltaGamma = (0, _math.cos)(deltaGamma),\n      sinDeltaGamma = (0, _math.sin)(deltaGamma);\n\n  function rotation(lambda, phi) {\n    var cosPhi = (0, _math.cos)(phi),\n        x = (0, _math.cos)(lambda) * cosPhi,\n        y = (0, _math.sin)(lambda) * cosPhi,\n        z = (0, _math.sin)(phi),\n        k = z * cosDeltaPhi + x * sinDeltaPhi;\n    return [(0, _math.atan2)(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), (0, _math.asin)(k * cosDeltaGamma + y * sinDeltaGamma)];\n  }\n\n  rotation.invert = function (lambda, phi) {\n    var cosPhi = (0, _math.cos)(phi),\n        x = (0, _math.cos)(lambda) * cosPhi,\n        y = (0, _math.sin)(lambda) * cosPhi,\n        z = (0, _math.sin)(phi),\n        k = z * cosDeltaGamma - y * sinDeltaGamma;\n    return [(0, _math.atan2)(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), (0, _math.asin)(k * cosDeltaPhi - x * sinDeltaPhi)];\n  };\n\n  return rotation;\n}\n\nfunction _default(rotate) {\n  rotate = rotateRadians(rotate[0] * _math.radians, rotate[1] * _math.radians, rotate.length > 2 ? rotate[2] * _math.radians : 0);\n\n  function forward(coordinates) {\n    coordinates = rotate(coordinates[0] * _math.radians, coordinates[1] * _math.radians);\n    return coordinates[0] *= _math.degrees, coordinates[1] *= _math.degrees, coordinates;\n  }\n\n  forward.invert = function (coordinates) {\n    coordinates = rotate.invert(coordinates[0] * _math.radians, coordinates[1] * _math.radians);\n    return coordinates[0] *= _math.degrees, coordinates[1] *= _math.degrees, coordinates;\n  };\n\n  return forward;\n}\n},{\"./compose.js\":\"tY9i\",\"./math.js\":\"JQgf\"}],\"KcOR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.circleStream = circleStream;\nexports.default = _default;\n\nvar _cartesian = require(\"./cartesian.js\");\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _math = require(\"./math.js\");\n\nvar _rotation = require(\"./rotation.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\nfunction circleStream(stream, radius, delta, direction, t0, t1) {\n  if (!delta) return;\n  var cosRadius = (0, _math.cos)(radius),\n      sinRadius = (0, _math.sin)(radius),\n      step = direction * delta;\n\n  if (t0 == null) {\n    t0 = radius + direction * _math.tau;\n    t1 = radius - step / 2;\n  } else {\n    t0 = circleRadius(cosRadius, t0);\n    t1 = circleRadius(cosRadius, t1);\n    if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * _math.tau;\n  }\n\n  for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {\n    point = (0, _cartesian.spherical)([cosRadius, -sinRadius * (0, _math.cos)(t), -sinRadius * (0, _math.sin)(t)]);\n    stream.point(point[0], point[1]);\n  }\n} // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\n\n\nfunction circleRadius(cosRadius, point) {\n  point = (0, _cartesian.cartesian)(point), point[0] -= cosRadius;\n  (0, _cartesian.cartesianNormalizeInPlace)(point);\n  var radius = (0, _math.acos)(-point[1]);\n  return ((-point[2] < 0 ? -radius : radius) + _math.tau - _math.epsilon) % _math.tau;\n}\n\nfunction _default() {\n  var center = (0, _constant.default)([0, 0]),\n      radius = (0, _constant.default)(90),\n      precision = (0, _constant.default)(6),\n      ring,\n      rotate,\n      stream = {\n    point: point\n  };\n\n  function point(x, y) {\n    ring.push(x = rotate(x, y));\n    x[0] *= _math.degrees, x[1] *= _math.degrees;\n  }\n\n  function circle() {\n    var c = center.apply(this, arguments),\n        r = radius.apply(this, arguments) * _math.radians,\n        p = precision.apply(this, arguments) * _math.radians;\n\n    ring = [];\n    rotate = (0, _rotation.rotateRadians)(-c[0] * _math.radians, -c[1] * _math.radians, 0).invert;\n    circleStream(stream, r, p, 1);\n    c = {\n      type: \"Polygon\",\n      coordinates: [ring]\n    };\n    ring = rotate = null;\n    return c;\n  }\n\n  circle.center = function (_) {\n    return arguments.length ? (center = typeof _ === \"function\" ? _ : (0, _constant.default)([+_[0], +_[1]]), circle) : center;\n  };\n\n  circle.radius = function (_) {\n    return arguments.length ? (radius = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), circle) : radius;\n  };\n\n  circle.precision = function (_) {\n    return arguments.length ? (precision = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), circle) : precision;\n  };\n\n  return circle;\n}\n},{\"./cartesian.js\":\"V83Q\",\"./constant.js\":\"aCvo\",\"./math.js\":\"JQgf\",\"./rotation.js\":\"LqUY\"}],\"jFd0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var lines = [],\n      line;\n  return {\n    point: function (x, y) {\n      line.push([x, y]);\n    },\n    lineStart: function () {\n      lines.push(line = []);\n    },\n    lineEnd: _noop.default,\n    rejoin: function () {\n      if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n    },\n    result: function () {\n      var result = lines;\n      lines = [];\n      line = null;\n      return result;\n    }\n  };\n}\n},{\"../noop.js\":\"DUih\"}],\"yH90\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _math = require(\"./math.js\");\n\nfunction _default(a, b) {\n  return (0, _math.abs)(a[0] - b[0]) < _math.epsilon && (0, _math.abs)(a[1] - b[1]) < _math.epsilon;\n}\n},{\"./math.js\":\"JQgf\"}],\"Nr15\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _pointEqual = _interopRequireDefault(require(\"../pointEqual.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Intersection(point, points, other, entry) {\n  this.x = point;\n  this.z = points;\n  this.o = other; // another intersection\n\n  this.e = entry; // is an entry?\n\n  this.v = false; // visited\n\n  this.n = this.p = null; // next & previous\n} // A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\n\n\nfunction _default(segments, compareIntersection, startInside, interpolate, stream) {\n  var subject = [],\n      clip = [],\n      i,\n      n;\n  segments.forEach(function (segment) {\n    if ((n = segment.length - 1) <= 0) return;\n    var n,\n        p0 = segment[0],\n        p1 = segment[n],\n        x; // If the first and last points of a segment are coincident, then treat as a\n    // closed ring. TODO if all rings are closed, then the winding order of the\n    // exterior ring should be checked.\n\n    if ((0, _pointEqual.default)(p0, p1)) {\n      stream.lineStart();\n\n      for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);\n\n      stream.lineEnd();\n      return;\n    }\n\n    subject.push(x = new Intersection(p0, segment, null, true));\n    clip.push(x.o = new Intersection(p0, null, x, false));\n    subject.push(x = new Intersection(p1, segment, null, false));\n    clip.push(x.o = new Intersection(p1, null, x, true));\n  });\n  if (!subject.length) return;\n  clip.sort(compareIntersection);\n  link(subject);\n  link(clip);\n\n  for (i = 0, n = clip.length; i < n; ++i) {\n    clip[i].e = startInside = !startInside;\n  }\n\n  var start = subject[0],\n      points,\n      point;\n\n  while (1) {\n    // Find first unvisited intersection.\n    var current = start,\n        isSubject = true;\n\n    while (current.v) if ((current = current.n) === start) return;\n\n    points = current.z;\n    stream.lineStart();\n\n    do {\n      current.v = current.o.v = true;\n\n      if (current.e) {\n        if (isSubject) {\n          for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);\n        } else {\n          interpolate(current.x, current.n.x, 1, stream);\n        }\n\n        current = current.n;\n      } else {\n        if (isSubject) {\n          points = current.p.z;\n\n          for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);\n        } else {\n          interpolate(current.x, current.p.x, -1, stream);\n        }\n\n        current = current.p;\n      }\n\n      current = current.o;\n      points = current.z;\n      isSubject = !isSubject;\n    } while (!current.v);\n\n    stream.lineEnd();\n  }\n}\n\nfunction link(array) {\n  if (!(n = array.length)) return;\n  var n,\n      i = 0,\n      a = array[0],\n      b;\n\n  while (++i < n) {\n    a.n = b = array[i];\n    b.p = a;\n    a = b;\n  }\n\n  a.n = b = array[0];\n  b.p = a;\n}\n},{\"../pointEqual.js\":\"yH90\"}],\"GrwB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _adder = _interopRequireDefault(require(\"./adder.js\"));\n\nvar _cartesian = require(\"./cartesian.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar sum = (0, _adder.default)();\n\nfunction longitude(point) {\n  if ((0, _math.abs)(point[0]) <= _math.pi) return point[0];else return (0, _math.sign)(point[0]) * (((0, _math.abs)(point[0]) + _math.pi) % _math.tau - _math.pi);\n}\n\nfunction _default(polygon, point) {\n  var lambda = longitude(point),\n      phi = point[1],\n      sinPhi = (0, _math.sin)(phi),\n      normal = [(0, _math.sin)(lambda), -(0, _math.cos)(lambda), 0],\n      angle = 0,\n      winding = 0;\n  sum.reset();\n  if (sinPhi === 1) phi = _math.halfPi + _math.epsilon;else if (sinPhi === -1) phi = -_math.halfPi - _math.epsilon;\n\n  for (var i = 0, n = polygon.length; i < n; ++i) {\n    if (!(m = (ring = polygon[i]).length)) continue;\n    var ring,\n        m,\n        point0 = ring[m - 1],\n        lambda0 = longitude(point0),\n        phi0 = point0[1] / 2 + _math.quarterPi,\n        sinPhi0 = (0, _math.sin)(phi0),\n        cosPhi0 = (0, _math.cos)(phi0);\n\n    for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {\n      var point1 = ring[j],\n          lambda1 = longitude(point1),\n          phi1 = point1[1] / 2 + _math.quarterPi,\n          sinPhi1 = (0, _math.sin)(phi1),\n          cosPhi1 = (0, _math.cos)(phi1),\n          delta = lambda1 - lambda0,\n          sign = delta >= 0 ? 1 : -1,\n          absDelta = sign * delta,\n          antimeridian = absDelta > _math.pi,\n          k = sinPhi0 * sinPhi1;\n      sum.add((0, _math.atan2)(k * sign * (0, _math.sin)(absDelta), cosPhi0 * cosPhi1 + k * (0, _math.cos)(absDelta)));\n      angle += antimeridian ? delta + sign * _math.tau : delta; // Are the longitudes either side of the point’s meridian (lambda),\n      // and are the latitudes smaller than the parallel (phi)?\n\n      if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n        var arc = (0, _cartesian.cartesianCross)((0, _cartesian.cartesian)(point0), (0, _cartesian.cartesian)(point1));\n        (0, _cartesian.cartesianNormalizeInPlace)(arc);\n        var intersection = (0, _cartesian.cartesianCross)(normal, arc);\n        (0, _cartesian.cartesianNormalizeInPlace)(intersection);\n        var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * (0, _math.asin)(intersection[2]);\n\n        if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {\n          winding += antimeridian ^ delta >= 0 ? 1 : -1;\n        }\n      }\n    }\n  } // First, determine whether the South pole is inside or outside:\n  //\n  // It is inside if:\n  // * the polygon winds around it in a clockwise direction.\n  // * the polygon does not (cumulatively) wind around it, but has a negative\n  //   (counter-clockwise) area.\n  //\n  // Second, count the (signed) number of times a segment crosses a lambda\n  // from the point to the South pole.  If it is zero, then the point is the\n  // same side as the South pole.\n\n\n  return (angle < -_math.epsilon || angle < _math.epsilon && sum < -_math.epsilon) ^ winding & 1;\n}\n},{\"./adder.js\":\"fG8A\",\"./cartesian.js\":\"V83Q\",\"./math.js\":\"JQgf\"}],\"zYBw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(compare) {\n  if (compare.length === 1) compare = ascendingComparator(compare);\n  return {\n    left: function (a, x, lo, hi) {\n      if (lo == null) lo = 0;\n      if (hi == null) hi = a.length;\n\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (compare(a[mid], x) < 0) lo = mid + 1;else hi = mid;\n      }\n\n      return lo;\n    },\n    right: function (a, x, lo, hi) {\n      if (lo == null) lo = 0;\n      if (hi == null) hi = a.length;\n\n      while (lo < hi) {\n        var mid = lo + hi >>> 1;\n        if (compare(a[mid], x) > 0) hi = mid;else lo = mid + 1;\n      }\n\n      return lo;\n    }\n  };\n}\n\nfunction ascendingComparator(f) {\n  return function (d, x) {\n    return (0, _ascending.default)(f(d), x);\n  };\n}\n},{\"./ascending\":\"yJgn\"}],\"WioU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.bisectLeft = exports.bisectRight = void 0;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending\"));\n\nvar _bisector = _interopRequireDefault(require(\"./bisector\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar ascendingBisect = (0, _bisector.default)(_ascending.default);\nvar bisectRight = ascendingBisect.right;\nexports.bisectRight = bisectRight;\nvar bisectLeft = ascendingBisect.left;\nexports.bisectLeft = bisectLeft;\nvar _default = bisectRight;\nexports.default = _default;\n},{\"./ascending\":\"yJgn\",\"./bisector\":\"zYBw\"}],\"VkLE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.pair = pair;\n\nfunction _default(array, f) {\n  if (f == null) f = pair;\n  var i = 0,\n      n = array.length - 1,\n      p = array[0],\n      pairs = new Array(n < 0 ? 0 : n);\n\n  while (i < n) pairs[i] = f(p, p = array[++i]);\n\n  return pairs;\n}\n\nfunction pair(a, b) {\n  return [a, b];\n}\n},{}],\"SOnF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _pairs = require(\"./pairs\");\n\nfunction _default(values0, values1, reduce) {\n  var n0 = values0.length,\n      n1 = values1.length,\n      values = new Array(n0 * n1),\n      i0,\n      i1,\n      i,\n      value0;\n  if (reduce == null) reduce = _pairs.pair;\n\n  for (i0 = i = 0; i0 < n0; ++i0) {\n    for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {\n      values[i] = reduce(value0, values1[i1]);\n    }\n  }\n\n  return values;\n}\n},{\"./pairs\":\"VkLE\"}],\"dVbB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x) {\n  return x === null ? NaN : +x;\n}\n},{}],\"lSZ0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _number = _interopRequireDefault(require(\"./number\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, valueof) {\n  var n = values.length,\n      m = 0,\n      i = -1,\n      mean = 0,\n      value,\n      delta,\n      sum = 0;\n\n  if (valueof == null) {\n    while (++i < n) {\n      if (!isNaN(value = (0, _number.default)(values[i]))) {\n        delta = value - mean;\n        mean += delta / ++m;\n        sum += delta * (value - mean);\n      }\n    }\n  } else {\n    while (++i < n) {\n      if (!isNaN(value = (0, _number.default)(valueof(values[i], i, values)))) {\n        delta = value - mean;\n        mean += delta / ++m;\n        sum += delta * (value - mean);\n      }\n    }\n  }\n\n  if (m > 1) return sum / (m - 1);\n}\n},{\"./number\":\"dVbB\"}],\"gW6D\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _variance = _interopRequireDefault(require(\"./variance\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(array, f) {\n  var v = (0, _variance.default)(array, f);\n  return v ? Math.sqrt(v) : v;\n}\n},{\"./variance\":\"lSZ0\"}],\"KOtx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      min,\n      max;\n\n  if (valueof == null) {\n    while (++i < n) {\n      // Find the first comparable value.\n      if ((value = values[i]) != null && value >= value) {\n        min = max = value;\n\n        while (++i < n) {\n          // Compare the remaining values.\n          if ((value = values[i]) != null) {\n            if (min > value) min = value;\n            if (max < value) max = value;\n          }\n        }\n      }\n    }\n  } else {\n    while (++i < n) {\n      // Find the first comparable value.\n      if ((value = valueof(values[i], i, values)) != null && value >= value) {\n        min = max = value;\n\n        while (++i < n) {\n          // Compare the remaining values.\n          if ((value = valueof(values[i], i, values)) != null) {\n            if (min > value) min = value;\n            if (max < value) max = value;\n          }\n        }\n      }\n    }\n  }\n\n  return [min, max];\n}\n},{}],\"g8om\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(values) {\n  return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n}\n},{}],\"JLft\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"./array\");\n\nvar _bisect = _interopRequireDefault(require(\"./bisect\"));\n\nvar _constant = _interopRequireDefault(require(\"./constant\"));\n\nvar _extent = _interopRequireDefault(require(\"./extent\"));\n\nvar _identity = _interopRequireDefault(require(\"./identity\"));\n\nvar _range = _interopRequireDefault(require(\"./range\"));\n\nvar _ticks = require(\"./ticks\");\n\nvar _sturges = _interopRequireDefault(require(\"./threshold/sturges\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var value = _identity.default,\n      domain = _extent.default,\n      threshold = _sturges.default;\n\n  function histogram(data) {\n    var i,\n        n = data.length,\n        x,\n        values = new Array(n);\n\n    for (i = 0; i < n; ++i) {\n      values[i] = value(data[i], i, data);\n    }\n\n    var xz = domain(values),\n        x0 = xz[0],\n        x1 = xz[1],\n        tz = threshold(values, x0, x1); // Convert number of thresholds into uniform thresholds.\n\n    if (!Array.isArray(tz)) {\n      tz = (0, _ticks.tickStep)(x0, x1, tz);\n      tz = (0, _range.default)(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive\n    } // Remove any thresholds outside the domain.\n\n\n    var m = tz.length;\n\n    while (tz[0] <= x0) tz.shift(), --m;\n\n    while (tz[m - 1] > x1) tz.pop(), --m;\n\n    var bins = new Array(m + 1),\n        bin; // Initialize bins.\n\n    for (i = 0; i <= m; ++i) {\n      bin = bins[i] = [];\n      bin.x0 = i > 0 ? tz[i - 1] : x0;\n      bin.x1 = i < m ? tz[i] : x1;\n    } // Assign data to bins by value, ignoring any outside the domain.\n\n\n    for (i = 0; i < n; ++i) {\n      x = values[i];\n\n      if (x0 <= x && x <= x1) {\n        bins[(0, _bisect.default)(tz, x, 0, m)].push(data[i]);\n      }\n    }\n\n    return bins;\n  }\n\n  histogram.value = function (_) {\n    return arguments.length ? (value = typeof _ === \"function\" ? _ : (0, _constant.default)(_), histogram) : value;\n  };\n\n  histogram.domain = function (_) {\n    return arguments.length ? (domain = typeof _ === \"function\" ? _ : (0, _constant.default)([_[0], _[1]]), histogram) : domain;\n  };\n\n  histogram.thresholds = function (_) {\n    return arguments.length ? (threshold = typeof _ === \"function\" ? _ : Array.isArray(_) ? (0, _constant.default)(_array.slice.call(_)) : (0, _constant.default)(_), histogram) : threshold;\n  };\n\n  return histogram;\n}\n},{\"./array\":\"RkzJ\",\"./bisect\":\"WioU\",\"./constant\":\"aCvo\",\"./extent\":\"KOtx\",\"./identity\":\"n09v\",\"./range\":\"wcAU\",\"./ticks\":\"EUzg\",\"./threshold/sturges\":\"g8om\"}],\"TjBh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _number = _interopRequireDefault(require(\"./number\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, p, valueof) {\n  if (valueof == null) valueof = _number.default;\n  if (!(n = values.length)) return;\n  if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n  if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n  var n,\n      i = (n - 1) * p,\n      i0 = Math.floor(i),\n      value0 = +valueof(values[i0], i0, values),\n      value1 = +valueof(values[i0 + 1], i0 + 1, values);\n  return value0 + (value1 - value0) * (i - i0);\n}\n},{\"./number\":\"dVbB\"}],\"R0wS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../array\");\n\nvar _ascending = _interopRequireDefault(require(\"../ascending\"));\n\nvar _number = _interopRequireDefault(require(\"../number\"));\n\nvar _quantile = _interopRequireDefault(require(\"../quantile\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, min, max) {\n  values = _array.map.call(values, _number.default).sort(_ascending.default);\n  return Math.ceil((max - min) / (2 * ((0, _quantile.default)(values, 0.75) - (0, _quantile.default)(values, 0.25)) * Math.pow(values.length, -1 / 3)));\n}\n},{\"../array\":\"RkzJ\",\"../ascending\":\"yJgn\",\"../number\":\"dVbB\",\"../quantile\":\"TjBh\"}],\"ZeZ8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _deviation = _interopRequireDefault(require(\"../deviation\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, min, max) {\n  return Math.ceil((max - min) / (3.5 * (0, _deviation.default)(values) * Math.pow(values.length, -1 / 3)));\n}\n},{\"../deviation\":\"gW6D\"}],\"P0ya\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      max;\n\n  if (valueof == null) {\n    while (++i < n) {\n      // Find the first comparable value.\n      if ((value = values[i]) != null && value >= value) {\n        max = value;\n\n        while (++i < n) {\n          // Compare the remaining values.\n          if ((value = values[i]) != null && value > max) {\n            max = value;\n          }\n        }\n      }\n    }\n  } else {\n    while (++i < n) {\n      // Find the first comparable value.\n      if ((value = valueof(values[i], i, values)) != null && value >= value) {\n        max = value;\n\n        while (++i < n) {\n          // Compare the remaining values.\n          if ((value = valueof(values[i], i, values)) != null && value > max) {\n            max = value;\n          }\n        }\n      }\n    }\n  }\n\n  return max;\n}\n},{}],\"qqtL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _number = _interopRequireDefault(require(\"./number\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, valueof) {\n  var n = values.length,\n      m = n,\n      i = -1,\n      value,\n      sum = 0;\n\n  if (valueof == null) {\n    while (++i < n) {\n      if (!isNaN(value = (0, _number.default)(values[i]))) sum += value;else --m;\n    }\n  } else {\n    while (++i < n) {\n      if (!isNaN(value = (0, _number.default)(valueof(values[i], i, values)))) sum += value;else --m;\n    }\n  }\n\n  if (m) return sum / m;\n}\n},{\"./number\":\"dVbB\"}],\"vqo6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending\"));\n\nvar _number = _interopRequireDefault(require(\"./number\"));\n\nvar _quantile = _interopRequireDefault(require(\"./quantile\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      numbers = [];\n\n  if (valueof == null) {\n    while (++i < n) {\n      if (!isNaN(value = (0, _number.default)(values[i]))) {\n        numbers.push(value);\n      }\n    }\n  } else {\n    while (++i < n) {\n      if (!isNaN(value = (0, _number.default)(valueof(values[i], i, values)))) {\n        numbers.push(value);\n      }\n    }\n  }\n\n  return (0, _quantile.default)(numbers.sort(_ascending.default), 0.5);\n}\n},{\"./ascending\":\"yJgn\",\"./number\":\"dVbB\",\"./quantile\":\"TjBh\"}],\"ghCG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(arrays) {\n  var n = arrays.length,\n      m,\n      i = -1,\n      j = 0,\n      merged,\n      array;\n\n  while (++i < n) j += arrays[i].length;\n\n  merged = new Array(j);\n\n  while (--n >= 0) {\n    array = arrays[n];\n    m = array.length;\n\n    while (--m >= 0) {\n      merged[--j] = array[m];\n    }\n  }\n\n  return merged;\n}\n},{}],\"vdsh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      min;\n\n  if (valueof == null) {\n    while (++i < n) {\n      // Find the first comparable value.\n      if ((value = values[i]) != null && value >= value) {\n        min = value;\n\n        while (++i < n) {\n          // Compare the remaining values.\n          if ((value = values[i]) != null && min > value) {\n            min = value;\n          }\n        }\n      }\n    }\n  } else {\n    while (++i < n) {\n      // Find the first comparable value.\n      if ((value = valueof(values[i], i, values)) != null && value >= value) {\n        min = value;\n\n        while (++i < n) {\n          // Compare the remaining values.\n          if ((value = valueof(values[i], i, values)) != null && min > value) {\n            min = value;\n          }\n        }\n      }\n    }\n  }\n\n  return min;\n}\n},{}],\"H6Dr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(array, indexes) {\n  var i = indexes.length,\n      permutes = new Array(i);\n\n  while (i--) permutes[i] = array[indexes[i]];\n\n  return permutes;\n}\n},{}],\"dTBq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ascending = _interopRequireDefault(require(\"./ascending\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(values, compare) {\n  if (!(n = values.length)) return;\n  var n,\n      i = 0,\n      j = 0,\n      xi,\n      xj = values[j];\n  if (compare == null) compare = _ascending.default;\n\n  while (++i < n) {\n    if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {\n      xj = xi, j = i;\n    }\n  }\n\n  if (compare(xj, xj) === 0) return j;\n}\n},{\"./ascending\":\"yJgn\"}],\"zD7a\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(array, i0, i1) {\n  var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),\n      t,\n      i;\n\n  while (m) {\n    i = Math.random() * m-- | 0;\n    t = array[m + i0];\n    array[m + i0] = array[i + i0];\n    array[i + i0] = t;\n  }\n\n  return array;\n}\n},{}],\"uTGw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(values, valueof) {\n  var n = values.length,\n      i = -1,\n      value,\n      sum = 0;\n\n  if (valueof == null) {\n    while (++i < n) {\n      if (value = +values[i]) sum += value; // Note: zero and null are equivalent.\n    }\n  } else {\n    while (++i < n) {\n      if (value = +valueof(values[i], i, values)) sum += value;\n    }\n  }\n\n  return sum;\n}\n},{}],\"FzEH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _min = _interopRequireDefault(require(\"./min\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(matrix) {\n  if (!(n = matrix.length)) return [];\n\n  for (var i = -1, m = (0, _min.default)(matrix, length), transpose = new Array(m); ++i < m;) {\n    for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n      row[j] = matrix[j][i];\n    }\n  }\n\n  return transpose;\n}\n\nfunction length(d) {\n  return d.length;\n}\n},{\"./min\":\"vdsh\"}],\"dlsj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _transpose = _interopRequireDefault(require(\"./transpose\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  return (0, _transpose.default)(arguments);\n}\n},{\"./transpose\":\"FzEH\"}],\"FeNa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"bisect\", {\n  enumerable: true,\n  get: function () {\n    return _bisect.default;\n  }\n});\nObject.defineProperty(exports, \"bisectRight\", {\n  enumerable: true,\n  get: function () {\n    return _bisect.bisectRight;\n  }\n});\nObject.defineProperty(exports, \"bisectLeft\", {\n  enumerable: true,\n  get: function () {\n    return _bisect.bisectLeft;\n  }\n});\nObject.defineProperty(exports, \"ascending\", {\n  enumerable: true,\n  get: function () {\n    return _ascending.default;\n  }\n});\nObject.defineProperty(exports, \"bisector\", {\n  enumerable: true,\n  get: function () {\n    return _bisector.default;\n  }\n});\nObject.defineProperty(exports, \"cross\", {\n  enumerable: true,\n  get: function () {\n    return _cross.default;\n  }\n});\nObject.defineProperty(exports, \"descending\", {\n  enumerable: true,\n  get: function () {\n    return _descending.default;\n  }\n});\nObject.defineProperty(exports, \"deviation\", {\n  enumerable: true,\n  get: function () {\n    return _deviation.default;\n  }\n});\nObject.defineProperty(exports, \"extent\", {\n  enumerable: true,\n  get: function () {\n    return _extent.default;\n  }\n});\nObject.defineProperty(exports, \"histogram\", {\n  enumerable: true,\n  get: function () {\n    return _histogram.default;\n  }\n});\nObject.defineProperty(exports, \"thresholdFreedmanDiaconis\", {\n  enumerable: true,\n  get: function () {\n    return _freedmanDiaconis.default;\n  }\n});\nObject.defineProperty(exports, \"thresholdScott\", {\n  enumerable: true,\n  get: function () {\n    return _scott.default;\n  }\n});\nObject.defineProperty(exports, \"thresholdSturges\", {\n  enumerable: true,\n  get: function () {\n    return _sturges.default;\n  }\n});\nObject.defineProperty(exports, \"max\", {\n  enumerable: true,\n  get: function () {\n    return _max.default;\n  }\n});\nObject.defineProperty(exports, \"mean\", {\n  enumerable: true,\n  get: function () {\n    return _mean.default;\n  }\n});\nObject.defineProperty(exports, \"median\", {\n  enumerable: true,\n  get: function () {\n    return _median.default;\n  }\n});\nObject.defineProperty(exports, \"merge\", {\n  enumerable: true,\n  get: function () {\n    return _merge.default;\n  }\n});\nObject.defineProperty(exports, \"min\", {\n  enumerable: true,\n  get: function () {\n    return _min.default;\n  }\n});\nObject.defineProperty(exports, \"pairs\", {\n  enumerable: true,\n  get: function () {\n    return _pairs.default;\n  }\n});\nObject.defineProperty(exports, \"permute\", {\n  enumerable: true,\n  get: function () {\n    return _permute.default;\n  }\n});\nObject.defineProperty(exports, \"quantile\", {\n  enumerable: true,\n  get: function () {\n    return _quantile.default;\n  }\n});\nObject.defineProperty(exports, \"range\", {\n  enumerable: true,\n  get: function () {\n    return _range.default;\n  }\n});\nObject.defineProperty(exports, \"scan\", {\n  enumerable: true,\n  get: function () {\n    return _scan.default;\n  }\n});\nObject.defineProperty(exports, \"shuffle\", {\n  enumerable: true,\n  get: function () {\n    return _shuffle.default;\n  }\n});\nObject.defineProperty(exports, \"sum\", {\n  enumerable: true,\n  get: function () {\n    return _sum.default;\n  }\n});\nObject.defineProperty(exports, \"ticks\", {\n  enumerable: true,\n  get: function () {\n    return _ticks.default;\n  }\n});\nObject.defineProperty(exports, \"tickIncrement\", {\n  enumerable: true,\n  get: function () {\n    return _ticks.tickIncrement;\n  }\n});\nObject.defineProperty(exports, \"tickStep\", {\n  enumerable: true,\n  get: function () {\n    return _ticks.tickStep;\n  }\n});\nObject.defineProperty(exports, \"transpose\", {\n  enumerable: true,\n  get: function () {\n    return _transpose.default;\n  }\n});\nObject.defineProperty(exports, \"variance\", {\n  enumerable: true,\n  get: function () {\n    return _variance.default;\n  }\n});\nObject.defineProperty(exports, \"zip\", {\n  enumerable: true,\n  get: function () {\n    return _zip.default;\n  }\n});\n\nvar _bisect = _interopRequireWildcard(require(\"./bisect\"));\n\nvar _ascending = _interopRequireDefault(require(\"./ascending\"));\n\nvar _bisector = _interopRequireDefault(require(\"./bisector\"));\n\nvar _cross = _interopRequireDefault(require(\"./cross\"));\n\nvar _descending = _interopRequireDefault(require(\"./descending\"));\n\nvar _deviation = _interopRequireDefault(require(\"./deviation\"));\n\nvar _extent = _interopRequireDefault(require(\"./extent\"));\n\nvar _histogram = _interopRequireDefault(require(\"./histogram\"));\n\nvar _freedmanDiaconis = _interopRequireDefault(require(\"./threshold/freedmanDiaconis\"));\n\nvar _scott = _interopRequireDefault(require(\"./threshold/scott\"));\n\nvar _sturges = _interopRequireDefault(require(\"./threshold/sturges\"));\n\nvar _max = _interopRequireDefault(require(\"./max\"));\n\nvar _mean = _interopRequireDefault(require(\"./mean\"));\n\nvar _median = _interopRequireDefault(require(\"./median\"));\n\nvar _merge = _interopRequireDefault(require(\"./merge\"));\n\nvar _min = _interopRequireDefault(require(\"./min\"));\n\nvar _pairs = _interopRequireDefault(require(\"./pairs\"));\n\nvar _permute = _interopRequireDefault(require(\"./permute\"));\n\nvar _quantile = _interopRequireDefault(require(\"./quantile\"));\n\nvar _range = _interopRequireDefault(require(\"./range\"));\n\nvar _scan = _interopRequireDefault(require(\"./scan\"));\n\nvar _shuffle = _interopRequireDefault(require(\"./shuffle\"));\n\nvar _sum = _interopRequireDefault(require(\"./sum\"));\n\nvar _ticks = _interopRequireWildcard(require(\"./ticks\"));\n\nvar _transpose = _interopRequireDefault(require(\"./transpose\"));\n\nvar _variance = _interopRequireDefault(require(\"./variance\"));\n\nvar _zip = _interopRequireDefault(require(\"./zip\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./bisect\":\"WioU\",\"./ascending\":\"yJgn\",\"./bisector\":\"zYBw\",\"./cross\":\"SOnF\",\"./descending\":\"fBAz\",\"./deviation\":\"gW6D\",\"./extent\":\"KOtx\",\"./histogram\":\"JLft\",\"./threshold/freedmanDiaconis\":\"R0wS\",\"./threshold/scott\":\"ZeZ8\",\"./threshold/sturges\":\"g8om\",\"./max\":\"P0ya\",\"./mean\":\"qqtL\",\"./median\":\"vqo6\",\"./merge\":\"ghCG\",\"./min\":\"vdsh\",\"./pairs\":\"VkLE\",\"./permute\":\"H6Dr\",\"./quantile\":\"TjBh\",\"./range\":\"wcAU\",\"./scan\":\"dTBq\",\"./shuffle\":\"zD7a\",\"./sum\":\"uTGw\",\"./ticks\":\"EUzg\",\"./transpose\":\"FzEH\",\"./variance\":\"lSZ0\",\"./zip\":\"dlsj\"}],\"J6h6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _buffer = _interopRequireDefault(require(\"./buffer.js\"));\n\nvar _rejoin = _interopRequireDefault(require(\"./rejoin.js\"));\n\nvar _math = require(\"../math.js\");\n\nvar _polygonContains = _interopRequireDefault(require(\"../polygonContains.js\"));\n\nvar _d3Array = require(\"d3-array\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(pointVisible, clipLine, interpolate, start) {\n  return function (sink) {\n    var line = clipLine(sink),\n        ringBuffer = (0, _buffer.default)(),\n        ringSink = clipLine(ringBuffer),\n        polygonStarted = false,\n        polygon,\n        segments,\n        ring;\n    var clip = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function () {\n        clip.point = pointRing;\n        clip.lineStart = ringStart;\n        clip.lineEnd = ringEnd;\n        segments = [];\n        polygon = [];\n      },\n      polygonEnd: function () {\n        clip.point = point;\n        clip.lineStart = lineStart;\n        clip.lineEnd = lineEnd;\n        segments = (0, _d3Array.merge)(segments);\n        var startInside = (0, _polygonContains.default)(polygon, start);\n\n        if (segments.length) {\n          if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n          (0, _rejoin.default)(segments, compareIntersection, startInside, interpolate, sink);\n        } else if (startInside) {\n          if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n          sink.lineStart();\n          interpolate(null, null, 1, sink);\n          sink.lineEnd();\n        }\n\n        if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n        segments = polygon = null;\n      },\n      sphere: function () {\n        sink.polygonStart();\n        sink.lineStart();\n        interpolate(null, null, 1, sink);\n        sink.lineEnd();\n        sink.polygonEnd();\n      }\n    };\n\n    function point(lambda, phi) {\n      if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n    }\n\n    function pointLine(lambda, phi) {\n      line.point(lambda, phi);\n    }\n\n    function lineStart() {\n      clip.point = pointLine;\n      line.lineStart();\n    }\n\n    function lineEnd() {\n      clip.point = point;\n      line.lineEnd();\n    }\n\n    function pointRing(lambda, phi) {\n      ring.push([lambda, phi]);\n      ringSink.point(lambda, phi);\n    }\n\n    function ringStart() {\n      ringSink.lineStart();\n      ring = [];\n    }\n\n    function ringEnd() {\n      pointRing(ring[0][0], ring[0][1]);\n      ringSink.lineEnd();\n      var clean = ringSink.clean(),\n          ringSegments = ringBuffer.result(),\n          i,\n          n = ringSegments.length,\n          m,\n          segment,\n          point;\n      ring.pop();\n      polygon.push(ring);\n      ring = null;\n      if (!n) return; // No intersections.\n\n      if (clean & 1) {\n        segment = ringSegments[0];\n\n        if ((m = segment.length - 1) > 0) {\n          if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n          sink.lineStart();\n\n          for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);\n\n          sink.lineEnd();\n        }\n\n        return;\n      } // Rejoin connected segments.\n      // TODO reuse ringBuffer.rejoin()?\n\n\n      if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n      segments.push(ringSegments.filter(validSegment));\n    }\n\n    return clip;\n  };\n}\n\nfunction validSegment(segment) {\n  return segment.length > 1;\n} // Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\n\n\nfunction compareIntersection(a, b) {\n  return ((a = a.x)[0] < 0 ? a[1] - _math.halfPi - _math.epsilon : _math.halfPi - a[1]) - ((b = b.x)[0] < 0 ? b[1] - _math.halfPi - _math.epsilon : _math.halfPi - b[1]);\n}\n},{\"./buffer.js\":\"jFd0\",\"./rejoin.js\":\"Nr15\",\"../math.js\":\"JQgf\",\"../polygonContains.js\":\"GrwB\",\"d3-array\":\"FeNa\"}],\"Gots\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nvar _math = require(\"../math.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = (0, _index.default)(function () {\n  return true;\n}, clipAntimeridianLine, clipAntimeridianInterpolate, [-_math.pi, -_math.halfPi]); // Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\n\n\nexports.default = _default;\n\nfunction clipAntimeridianLine(stream) {\n  var lambda0 = NaN,\n      phi0 = NaN,\n      sign0 = NaN,\n      clean; // no intersections\n\n  return {\n    lineStart: function () {\n      stream.lineStart();\n      clean = 1;\n    },\n    point: function (lambda1, phi1) {\n      var sign1 = lambda1 > 0 ? _math.pi : -_math.pi,\n          delta = (0, _math.abs)(lambda1 - lambda0);\n\n      if ((0, _math.abs)(delta - _math.pi) < _math.epsilon) {\n        // line crosses a pole\n        stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? _math.halfPi : -_math.halfPi);\n        stream.point(sign0, phi0);\n        stream.lineEnd();\n        stream.lineStart();\n        stream.point(sign1, phi0);\n        stream.point(lambda1, phi0);\n        clean = 0;\n      } else if (sign0 !== sign1 && delta >= _math.pi) {\n        // line crosses antimeridian\n        if ((0, _math.abs)(lambda0 - sign0) < _math.epsilon) lambda0 -= sign0 * _math.epsilon; // handle degeneracies\n\n        if ((0, _math.abs)(lambda1 - sign1) < _math.epsilon) lambda1 -= sign1 * _math.epsilon;\n        phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n        stream.point(sign0, phi0);\n        stream.lineEnd();\n        stream.lineStart();\n        stream.point(sign1, phi0);\n        clean = 0;\n      }\n\n      stream.point(lambda0 = lambda1, phi0 = phi1);\n      sign0 = sign1;\n    },\n    lineEnd: function () {\n      stream.lineEnd();\n      lambda0 = phi0 = NaN;\n    },\n    clean: function () {\n      return 2 - clean; // if intersections, rejoin first and last segments\n    }\n  };\n}\n\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n  var cosPhi0,\n      cosPhi1,\n      sinLambda0Lambda1 = (0, _math.sin)(lambda0 - lambda1);\n  return (0, _math.abs)(sinLambda0Lambda1) > _math.epsilon ? (0, _math.atan)(((0, _math.sin)(phi0) * (cosPhi1 = (0, _math.cos)(phi1)) * (0, _math.sin)(lambda1) - (0, _math.sin)(phi1) * (cosPhi0 = (0, _math.cos)(phi0)) * (0, _math.sin)(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi0 + phi1) / 2;\n}\n\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n  var phi;\n\n  if (from == null) {\n    phi = direction * _math.halfPi;\n    stream.point(-_math.pi, phi);\n    stream.point(0, phi);\n    stream.point(_math.pi, phi);\n    stream.point(_math.pi, 0);\n    stream.point(_math.pi, -phi);\n    stream.point(0, -phi);\n    stream.point(-_math.pi, -phi);\n    stream.point(-_math.pi, 0);\n    stream.point(-_math.pi, phi);\n  } else if ((0, _math.abs)(from[0] - to[0]) > _math.epsilon) {\n    var lambda = from[0] < to[0] ? _math.pi : -_math.pi;\n    phi = direction * lambda / 2;\n    stream.point(-lambda, phi);\n    stream.point(0, phi);\n    stream.point(lambda, phi);\n  } else {\n    stream.point(to[0], to[1]);\n  }\n}\n},{\"./index.js\":\"J6h6\",\"../math.js\":\"JQgf\"}],\"lcCJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _cartesian = require(\"../cartesian.js\");\n\nvar _circle = require(\"../circle.js\");\n\nvar _math = require(\"../math.js\");\n\nvar _pointEqual = _interopRequireDefault(require(\"../pointEqual.js\"));\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(radius) {\n  var cr = (0, _math.cos)(radius),\n      delta = 6 * _math.radians,\n      smallRadius = cr > 0,\n      notHemisphere = (0, _math.abs)(cr) > _math.epsilon; // TODO optimise for this common case\n\n\n  function interpolate(from, to, direction, stream) {\n    (0, _circle.circleStream)(stream, radius, delta, direction, from, to);\n  }\n\n  function visible(lambda, phi) {\n    return (0, _math.cos)(lambda) * (0, _math.cos)(phi) > cr;\n  } // Takes a line and cuts into visible segments. Return values used for polygon\n  // clipping: 0 - there were intersections or the line was empty; 1 - no\n  // intersections 2 - there were intersections, and the first and last segments\n  // should be rejoined.\n\n\n  function clipLine(stream) {\n    var point0, // previous point\n    c0, // code for previous point\n    v0, // visibility of previous point\n    v00, // visibility of first point\n    clean; // no intersections\n\n    return {\n      lineStart: function () {\n        v00 = v0 = false;\n        clean = 1;\n      },\n      point: function (lambda, phi) {\n        var point1 = [lambda, phi],\n            point2,\n            v = visible(lambda, phi),\n            c = smallRadius ? v ? 0 : code(lambda, phi) : v ? code(lambda + (lambda < 0 ? _math.pi : -_math.pi), phi) : 0;\n        if (!point0 && (v00 = v0 = v)) stream.lineStart(); // Handle degeneracies.\n        // TODO ignore if not clipping polygons.\n\n        if (v !== v0) {\n          point2 = intersect(point0, point1);\n\n          if (!point2 || (0, _pointEqual.default)(point0, point2) || (0, _pointEqual.default)(point1, point2)) {\n            point1[0] += _math.epsilon;\n            point1[1] += _math.epsilon;\n            v = visible(point1[0], point1[1]);\n          }\n        }\n\n        if (v !== v0) {\n          clean = 0;\n\n          if (v) {\n            // outside going in\n            stream.lineStart();\n            point2 = intersect(point1, point0);\n            stream.point(point2[0], point2[1]);\n          } else {\n            // inside going out\n            point2 = intersect(point0, point1);\n            stream.point(point2[0], point2[1]);\n            stream.lineEnd();\n          }\n\n          point0 = point2;\n        } else if (notHemisphere && point0 && smallRadius ^ v) {\n          var t; // If the codes for two points are different, or are both zero,\n          // and there this segment intersects with the small circle.\n\n          if (!(c & c0) && (t = intersect(point1, point0, true))) {\n            clean = 0;\n\n            if (smallRadius) {\n              stream.lineStart();\n              stream.point(t[0][0], t[0][1]);\n              stream.point(t[1][0], t[1][1]);\n              stream.lineEnd();\n            } else {\n              stream.point(t[1][0], t[1][1]);\n              stream.lineEnd();\n              stream.lineStart();\n              stream.point(t[0][0], t[0][1]);\n            }\n          }\n        }\n\n        if (v && (!point0 || !(0, _pointEqual.default)(point0, point1))) {\n          stream.point(point1[0], point1[1]);\n        }\n\n        point0 = point1, v0 = v, c0 = c;\n      },\n      lineEnd: function () {\n        if (v0) stream.lineEnd();\n        point0 = null;\n      },\n      // Rejoin first and last segments if there were intersections and the first\n      // and last points were visible.\n      clean: function () {\n        return clean | (v00 && v0) << 1;\n      }\n    };\n  } // Intersects the great circle between a and b with the clip circle.\n\n\n  function intersect(a, b, two) {\n    var pa = (0, _cartesian.cartesian)(a),\n        pb = (0, _cartesian.cartesian)(b); // We have two planes, n1.p = d1 and n2.p = d2.\n    // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).\n\n    var n1 = [1, 0, 0],\n        // normal\n    n2 = (0, _cartesian.cartesianCross)(pa, pb),\n        n2n2 = (0, _cartesian.cartesianDot)(n2, n2),\n        n1n2 = n2[0],\n        // cartesianDot(n1, n2),\n    determinant = n2n2 - n1n2 * n1n2; // Two polar points.\n\n    if (!determinant) return !two && a;\n    var c1 = cr * n2n2 / determinant,\n        c2 = -cr * n1n2 / determinant,\n        n1xn2 = (0, _cartesian.cartesianCross)(n1, n2),\n        A = (0, _cartesian.cartesianScale)(n1, c1),\n        B = (0, _cartesian.cartesianScale)(n2, c2);\n    (0, _cartesian.cartesianAddInPlace)(A, B); // Solve |p(t)|^2 = 1.\n\n    var u = n1xn2,\n        w = (0, _cartesian.cartesianDot)(A, u),\n        uu = (0, _cartesian.cartesianDot)(u, u),\n        t2 = w * w - uu * ((0, _cartesian.cartesianDot)(A, A) - 1);\n    if (t2 < 0) return;\n    var t = (0, _math.sqrt)(t2),\n        q = (0, _cartesian.cartesianScale)(u, (-w - t) / uu);\n    (0, _cartesian.cartesianAddInPlace)(q, A);\n    q = (0, _cartesian.spherical)(q);\n    if (!two) return q; // Two intersection points.\n\n    var lambda0 = a[0],\n        lambda1 = b[0],\n        phi0 = a[1],\n        phi1 = b[1],\n        z;\n    if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\n\n    var delta = lambda1 - lambda0,\n        polar = (0, _math.abs)(delta - _math.pi) < _math.epsilon,\n        meridian = polar || delta < _math.epsilon;\n\n    if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; // Check that the first point is between a and b.\n\n    if (meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < ((0, _math.abs)(q[0] - lambda0) < _math.epsilon ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 : delta > _math.pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\n      var q1 = (0, _cartesian.cartesianScale)(u, (-w + t) / uu);\n      (0, _cartesian.cartesianAddInPlace)(q1, A);\n      return [q, (0, _cartesian.spherical)(q1)];\n    }\n  } // Generates a 4-bit vector representing the location of a point relative to\n  // the small circle's bounding box.\n\n\n  function code(lambda, phi) {\n    var r = smallRadius ? radius : _math.pi - radius,\n        code = 0;\n    if (lambda < -r) code |= 1; // left\n    else if (lambda > r) code |= 2; // right\n\n    if (phi < -r) code |= 4; // below\n    else if (phi > r) code |= 8; // above\n\n    return code;\n  }\n\n  return (0, _index.default)(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-_math.pi, radius - _math.pi]);\n}\n},{\"../cartesian.js\":\"V83Q\",\"../circle.js\":\"KcOR\",\"../math.js\":\"JQgf\",\"../pointEqual.js\":\"yH90\",\"./index.js\":\"J6h6\"}],\"w1ni\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(a, b, x0, y0, x1, y1) {\n  var ax = a[0],\n      ay = a[1],\n      bx = b[0],\n      by = b[1],\n      t0 = 0,\n      t1 = 1,\n      dx = bx - ax,\n      dy = by - ay,\n      r;\n  r = x0 - ax;\n  if (!dx && r > 0) return;\n  r /= dx;\n\n  if (dx < 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  } else if (dx > 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  }\n\n  r = x1 - ax;\n  if (!dx && r < 0) return;\n  r /= dx;\n\n  if (dx < 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  } else if (dx > 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  }\n\n  r = y0 - ay;\n  if (!dy && r > 0) return;\n  r /= dy;\n\n  if (dy < 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  } else if (dy > 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  }\n\n  r = y1 - ay;\n  if (!dy && r < 0) return;\n  r /= dy;\n\n  if (dy < 0) {\n    if (r > t1) return;\n    if (r > t0) t0 = r;\n  } else if (dy > 0) {\n    if (r < t0) return;\n    if (r < t1) t1 = r;\n  }\n\n  if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n  if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n  return true;\n}\n},{}],\"jRQA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = clipRectangle;\n\nvar _math = require(\"../math.js\");\n\nvar _buffer = _interopRequireDefault(require(\"./buffer.js\"));\n\nvar _line = _interopRequireDefault(require(\"./line.js\"));\n\nvar _rejoin = _interopRequireDefault(require(\"./rejoin.js\"));\n\nvar _d3Array = require(\"d3-array\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar clipMax = 1e9,\n    clipMin = -clipMax; // TODO Use d3-polygon’s polygonContains here for the ring check?\n// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?\n\nfunction clipRectangle(x0, y0, x1, y1) {\n  function visible(x, y) {\n    return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n  }\n\n  function interpolate(from, to, direction, stream) {\n    var a = 0,\n        a1 = 0;\n\n    if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {\n      do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); while ((a = (a + direction + 4) % 4) !== a1);\n    } else {\n      stream.point(to[0], to[1]);\n    }\n  }\n\n  function corner(p, direction) {\n    return (0, _math.abs)(p[0] - x0) < _math.epsilon ? direction > 0 ? 0 : 3 : (0, _math.abs)(p[0] - x1) < _math.epsilon ? direction > 0 ? 2 : 1 : (0, _math.abs)(p[1] - y0) < _math.epsilon ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n  }\n\n  function compareIntersection(a, b) {\n    return comparePoint(a.x, b.x);\n  }\n\n  function comparePoint(a, b) {\n    var ca = corner(a, 1),\n        cb = corner(b, 1);\n    return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n  }\n\n  return function (stream) {\n    var activeStream = stream,\n        bufferStream = (0, _buffer.default)(),\n        segments,\n        polygon,\n        ring,\n        x__,\n        y__,\n        v__,\n        // first point\n    x_,\n        y_,\n        v_,\n        // previous point\n    first,\n        clean;\n    var clipStream = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: polygonStart,\n      polygonEnd: polygonEnd\n    };\n\n    function point(x, y) {\n      if (visible(x, y)) activeStream.point(x, y);\n    }\n\n    function polygonInside() {\n      var winding = 0;\n\n      for (var i = 0, n = polygon.length; i < n; ++i) {\n        for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {\n          a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n\n          if (a1 <= y1) {\n            if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding;\n          } else {\n            if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding;\n          }\n        }\n      }\n\n      return winding;\n    } // Buffer geometry within a polygon and then clip it en masse.\n\n\n    function polygonStart() {\n      activeStream = bufferStream, segments = [], polygon = [], clean = true;\n    }\n\n    function polygonEnd() {\n      var startInside = polygonInside(),\n          cleanInside = clean && startInside,\n          visible = (segments = (0, _d3Array.merge)(segments)).length;\n\n      if (cleanInside || visible) {\n        stream.polygonStart();\n\n        if (cleanInside) {\n          stream.lineStart();\n          interpolate(null, null, 1, stream);\n          stream.lineEnd();\n        }\n\n        if (visible) {\n          (0, _rejoin.default)(segments, compareIntersection, startInside, interpolate, stream);\n        }\n\n        stream.polygonEnd();\n      }\n\n      activeStream = stream, segments = polygon = ring = null;\n    }\n\n    function lineStart() {\n      clipStream.point = linePoint;\n      if (polygon) polygon.push(ring = []);\n      first = true;\n      v_ = false;\n      x_ = y_ = NaN;\n    } // TODO rather than special-case polygons, simply handle them separately.\n    // Ideally, coincident intersection points should be jittered to avoid\n    // clipping issues.\n\n\n    function lineEnd() {\n      if (segments) {\n        linePoint(x__, y__);\n        if (v__ && v_) bufferStream.rejoin();\n        segments.push(bufferStream.result());\n      }\n\n      clipStream.point = point;\n      if (v_) activeStream.lineEnd();\n    }\n\n    function linePoint(x, y) {\n      var v = visible(x, y);\n      if (polygon) ring.push([x, y]);\n\n      if (first) {\n        x__ = x, y__ = y, v__ = v;\n        first = false;\n\n        if (v) {\n          activeStream.lineStart();\n          activeStream.point(x, y);\n        }\n      } else {\n        if (v && v_) activeStream.point(x, y);else {\n          var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],\n              b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];\n\n          if ((0, _line.default)(a, b, x0, y0, x1, y1)) {\n            if (!v_) {\n              activeStream.lineStart();\n              activeStream.point(a[0], a[1]);\n            }\n\n            activeStream.point(b[0], b[1]);\n            if (!v) activeStream.lineEnd();\n            clean = false;\n          } else if (v) {\n            activeStream.lineStart();\n            activeStream.point(x, y);\n            clean = false;\n          }\n        }\n      }\n\n      x_ = x, y_ = y, v_ = v;\n    }\n\n    return clipStream;\n  };\n}\n},{\"../math.js\":\"JQgf\",\"./buffer.js\":\"jFd0\",\"./line.js\":\"w1ni\",\"./rejoin.js\":\"Nr15\",\"d3-array\":\"FeNa\"}],\"EodF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _rectangle = _interopRequireDefault(require(\"./rectangle.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var x0 = 0,\n      y0 = 0,\n      x1 = 960,\n      y1 = 500,\n      cache,\n      cacheStream,\n      clip;\n  return clip = {\n    stream: function (stream) {\n      return cache && cacheStream === stream ? cache : cache = (0, _rectangle.default)(x0, y0, x1, y1)(cacheStream = stream);\n    },\n    extent: function (_) {\n      return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];\n    }\n  };\n}\n},{\"./rectangle.js\":\"jRQA\"}],\"bXUe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _adder = _interopRequireDefault(require(\"./adder.js\"));\n\nvar _math = require(\"./math.js\");\n\nvar _noop = _interopRequireDefault(require(\"./noop.js\"));\n\nvar _stream = _interopRequireDefault(require(\"./stream.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar lengthSum = (0, _adder.default)(),\n    lambda0,\n    sinPhi0,\n    cosPhi0;\nvar lengthStream = {\n  sphere: _noop.default,\n  point: _noop.default,\n  lineStart: lengthLineStart,\n  lineEnd: _noop.default,\n  polygonStart: _noop.default,\n  polygonEnd: _noop.default\n};\n\nfunction lengthLineStart() {\n  lengthStream.point = lengthPointFirst;\n  lengthStream.lineEnd = lengthLineEnd;\n}\n\nfunction lengthLineEnd() {\n  lengthStream.point = lengthStream.lineEnd = _noop.default;\n}\n\nfunction lengthPointFirst(lambda, phi) {\n  lambda *= _math.radians, phi *= _math.radians;\n  lambda0 = lambda, sinPhi0 = (0, _math.sin)(phi), cosPhi0 = (0, _math.cos)(phi);\n  lengthStream.point = lengthPoint;\n}\n\nfunction lengthPoint(lambda, phi) {\n  lambda *= _math.radians, phi *= _math.radians;\n  var sinPhi = (0, _math.sin)(phi),\n      cosPhi = (0, _math.cos)(phi),\n      delta = (0, _math.abs)(lambda - lambda0),\n      cosDelta = (0, _math.cos)(delta),\n      sinDelta = (0, _math.sin)(delta),\n      x = cosPhi * sinDelta,\n      y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,\n      z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;\n  lengthSum.add((0, _math.atan2)((0, _math.sqrt)(x * x + y * y), z));\n  lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;\n}\n\nfunction _default(object) {\n  lengthSum.reset();\n  (0, _stream.default)(object, lengthStream);\n  return +lengthSum;\n}\n},{\"./adder.js\":\"fG8A\",\"./math.js\":\"JQgf\",\"./noop.js\":\"DUih\",\"./stream.js\":\"XQuq\"}],\"hTgK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _length = _interopRequireDefault(require(\"./length.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar coordinates = [null, null],\n    object = {\n  type: \"LineString\",\n  coordinates: coordinates\n};\n\nfunction _default(a, b) {\n  coordinates[0] = a;\n  coordinates[1] = b;\n  return (0, _length.default)(object);\n}\n},{\"./length.js\":\"bXUe\"}],\"tRhb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _polygonContains = _interopRequireDefault(require(\"./polygonContains.js\"));\n\nvar _distance = _interopRequireDefault(require(\"./distance.js\"));\n\nvar _math = require(\"./math.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar containsObjectType = {\n  Feature: function (object, point) {\n    return containsGeometry(object.geometry, point);\n  },\n  FeatureCollection: function (object, point) {\n    var features = object.features,\n        i = -1,\n        n = features.length;\n\n    while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;\n\n    return false;\n  }\n};\nvar containsGeometryType = {\n  Sphere: function () {\n    return true;\n  },\n  Point: function (object, point) {\n    return containsPoint(object.coordinates, point);\n  },\n  MultiPoint: function (object, point) {\n    var coordinates = object.coordinates,\n        i = -1,\n        n = coordinates.length;\n\n    while (++i < n) if (containsPoint(coordinates[i], point)) return true;\n\n    return false;\n  },\n  LineString: function (object, point) {\n    return containsLine(object.coordinates, point);\n  },\n  MultiLineString: function (object, point) {\n    var coordinates = object.coordinates,\n        i = -1,\n        n = coordinates.length;\n\n    while (++i < n) if (containsLine(coordinates[i], point)) return true;\n\n    return false;\n  },\n  Polygon: function (object, point) {\n    return containsPolygon(object.coordinates, point);\n  },\n  MultiPolygon: function (object, point) {\n    var coordinates = object.coordinates,\n        i = -1,\n        n = coordinates.length;\n\n    while (++i < n) if (containsPolygon(coordinates[i], point)) return true;\n\n    return false;\n  },\n  GeometryCollection: function (object, point) {\n    var geometries = object.geometries,\n        i = -1,\n        n = geometries.length;\n\n    while (++i < n) if (containsGeometry(geometries[i], point)) return true;\n\n    return false;\n  }\n};\n\nfunction containsGeometry(geometry, point) {\n  return geometry && containsGeometryType.hasOwnProperty(geometry.type) ? containsGeometryType[geometry.type](geometry, point) : false;\n}\n\nfunction containsPoint(coordinates, point) {\n  return (0, _distance.default)(coordinates, point) === 0;\n}\n\nfunction containsLine(coordinates, point) {\n  var ao, bo, ab;\n\n  for (var i = 0, n = coordinates.length; i < n; i++) {\n    bo = (0, _distance.default)(coordinates[i], point);\n    if (bo === 0) return true;\n\n    if (i > 0) {\n      ab = (0, _distance.default)(coordinates[i], coordinates[i - 1]);\n      if (ab > 0 && ao <= ab && bo <= ab && (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < _math.epsilon2 * ab) return true;\n    }\n\n    ao = bo;\n  }\n\n  return false;\n}\n\nfunction containsPolygon(coordinates, point) {\n  return !!(0, _polygonContains.default)(coordinates.map(ringRadians), pointRadians(point));\n}\n\nfunction ringRadians(ring) {\n  return ring = ring.map(pointRadians), ring.pop(), ring;\n}\n\nfunction pointRadians(point) {\n  return [point[0] * _math.radians, point[1] * _math.radians];\n}\n\nfunction _default(object, point) {\n  return (object && containsObjectType.hasOwnProperty(object.type) ? containsObjectType[object.type] : containsGeometry)(object, point);\n}\n},{\"./polygonContains.js\":\"GrwB\",\"./distance.js\":\"hTgK\",\"./math.js\":\"JQgf\"}],\"IdZ0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = graticule;\nexports.graticule10 = graticule10;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _math = require(\"./math.js\");\n\nfunction graticuleX(y0, y1, dy) {\n  var y = (0, _d3Array.range)(y0, y1 - _math.epsilon, dy).concat(y1);\n  return function (x) {\n    return y.map(function (y) {\n      return [x, y];\n    });\n  };\n}\n\nfunction graticuleY(x0, x1, dx) {\n  var x = (0, _d3Array.range)(x0, x1 - _math.epsilon, dx).concat(x1);\n  return function (y) {\n    return x.map(function (x) {\n      return [x, y];\n    });\n  };\n}\n\nfunction graticule() {\n  var x1,\n      x0,\n      X1,\n      X0,\n      y1,\n      y0,\n      Y1,\n      Y0,\n      dx = 10,\n      dy = dx,\n      DX = 90,\n      DY = 360,\n      x,\n      y,\n      X,\n      Y,\n      precision = 2.5;\n\n  function graticule() {\n    return {\n      type: \"MultiLineString\",\n      coordinates: lines()\n    };\n  }\n\n  function lines() {\n    return (0, _d3Array.range)((0, _math.ceil)(X0 / DX) * DX, X1, DX).map(X).concat((0, _d3Array.range)((0, _math.ceil)(Y0 / DY) * DY, Y1, DY).map(Y)).concat((0, _d3Array.range)((0, _math.ceil)(x0 / dx) * dx, x1, dx).filter(function (x) {\n      return (0, _math.abs)(x % DX) > _math.epsilon;\n    }).map(x)).concat((0, _d3Array.range)((0, _math.ceil)(y0 / dy) * dy, y1, dy).filter(function (y) {\n      return (0, _math.abs)(y % DY) > _math.epsilon;\n    }).map(y));\n  }\n\n  graticule.lines = function () {\n    return lines().map(function (coordinates) {\n      return {\n        type: \"LineString\",\n        coordinates: coordinates\n      };\n    });\n  };\n\n  graticule.outline = function () {\n    return {\n      type: \"Polygon\",\n      coordinates: [X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1))]\n    };\n  };\n\n  graticule.extent = function (_) {\n    if (!arguments.length) return graticule.extentMinor();\n    return graticule.extentMajor(_).extentMinor(_);\n  };\n\n  graticule.extentMajor = function (_) {\n    if (!arguments.length) return [[X0, Y0], [X1, Y1]];\n    X0 = +_[0][0], X1 = +_[1][0];\n    Y0 = +_[0][1], Y1 = +_[1][1];\n    if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n    if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n    return graticule.precision(precision);\n  };\n\n  graticule.extentMinor = function (_) {\n    if (!arguments.length) return [[x0, y0], [x1, y1]];\n    x0 = +_[0][0], x1 = +_[1][0];\n    y0 = +_[0][1], y1 = +_[1][1];\n    if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n    if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n    return graticule.precision(precision);\n  };\n\n  graticule.step = function (_) {\n    if (!arguments.length) return graticule.stepMinor();\n    return graticule.stepMajor(_).stepMinor(_);\n  };\n\n  graticule.stepMajor = function (_) {\n    if (!arguments.length) return [DX, DY];\n    DX = +_[0], DY = +_[1];\n    return graticule;\n  };\n\n  graticule.stepMinor = function (_) {\n    if (!arguments.length) return [dx, dy];\n    dx = +_[0], dy = +_[1];\n    return graticule;\n  };\n\n  graticule.precision = function (_) {\n    if (!arguments.length) return precision;\n    precision = +_;\n    x = graticuleX(y0, y1, 90);\n    y = graticuleY(x0, x1, precision);\n    X = graticuleX(Y0, Y1, 90);\n    Y = graticuleY(X0, X1, precision);\n    return graticule;\n  };\n\n  return graticule.extentMajor([[-180, -90 + _math.epsilon], [180, 90 - _math.epsilon]]).extentMinor([[-180, -80 - _math.epsilon], [180, 80 + _math.epsilon]]);\n}\n\nfunction graticule10() {\n  return graticule()();\n}\n},{\"d3-array\":\"FeNa\",\"./math.js\":\"JQgf\"}],\"uuLr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _math = require(\"./math.js\");\n\nfunction _default(a, b) {\n  var x0 = a[0] * _math.radians,\n      y0 = a[1] * _math.radians,\n      x1 = b[0] * _math.radians,\n      y1 = b[1] * _math.radians,\n      cy0 = (0, _math.cos)(y0),\n      sy0 = (0, _math.sin)(y0),\n      cy1 = (0, _math.cos)(y1),\n      sy1 = (0, _math.sin)(y1),\n      kx0 = cy0 * (0, _math.cos)(x0),\n      ky0 = cy0 * (0, _math.sin)(x0),\n      kx1 = cy1 * (0, _math.cos)(x1),\n      ky1 = cy1 * (0, _math.sin)(x1),\n      d = 2 * (0, _math.asin)((0, _math.sqrt)((0, _math.haversin)(y1 - y0) + cy0 * cy1 * (0, _math.haversin)(x1 - x0))),\n      k = (0, _math.sin)(d);\n  var interpolate = d ? function (t) {\n    var B = (0, _math.sin)(t *= d) / k,\n        A = (0, _math.sin)(d - t) / k,\n        x = A * kx0 + B * kx1,\n        y = A * ky0 + B * ky1,\n        z = A * sy0 + B * sy1;\n    return [(0, _math.atan2)(y, x) * _math.degrees, (0, _math.atan2)(z, (0, _math.sqrt)(x * x + y * y)) * _math.degrees];\n  } : function () {\n    return [x0 * _math.degrees, y0 * _math.degrees];\n  };\n  interpolate.distance = d;\n  return interpolate;\n}\n},{\"./math.js\":\"JQgf\"}],\"ueEe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _adder = _interopRequireDefault(require(\"../adder.js\"));\n\nvar _math = require(\"../math.js\");\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar areaSum = (0, _adder.default)(),\n    areaRingSum = (0, _adder.default)(),\n    x00,\n    y00,\n    x0,\n    y0;\nvar areaStream = {\n  point: _noop.default,\n  lineStart: _noop.default,\n  lineEnd: _noop.default,\n  polygonStart: function () {\n    areaStream.lineStart = areaRingStart;\n    areaStream.lineEnd = areaRingEnd;\n  },\n  polygonEnd: function () {\n    areaStream.lineStart = areaStream.lineEnd = areaStream.point = _noop.default;\n    areaSum.add((0, _math.abs)(areaRingSum));\n    areaRingSum.reset();\n  },\n  result: function () {\n    var area = areaSum / 2;\n    areaSum.reset();\n    return area;\n  }\n};\n\nfunction areaRingStart() {\n  areaStream.point = areaPointFirst;\n}\n\nfunction areaPointFirst(x, y) {\n  areaStream.point = areaPoint;\n  x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction areaPoint(x, y) {\n  areaRingSum.add(y0 * x - x0 * y);\n  x0 = x, y0 = y;\n}\n\nfunction areaRingEnd() {\n  areaPoint(x00, y00);\n}\n\nvar _default = areaStream;\nexports.default = _default;\n},{\"../adder.js\":\"fG8A\",\"../math.js\":\"JQgf\",\"../noop.js\":\"DUih\"}],\"tL3W\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar x0 = Infinity,\n    y0 = x0,\n    x1 = -x0,\n    y1 = x1;\nvar boundsStream = {\n  point: boundsPoint,\n  lineStart: _noop.default,\n  lineEnd: _noop.default,\n  polygonStart: _noop.default,\n  polygonEnd: _noop.default,\n  result: function () {\n    var bounds = [[x0, y0], [x1, y1]];\n    x1 = y1 = -(y0 = x0 = Infinity);\n    return bounds;\n  }\n};\n\nfunction boundsPoint(x, y) {\n  if (x < x0) x0 = x;\n  if (x > x1) x1 = x;\n  if (y < y0) y0 = y;\n  if (y > y1) y1 = y;\n}\n\nvar _default = boundsStream;\nexports.default = _default;\n},{\"../noop.js\":\"DUih\"}],\"PA8j\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _math = require(\"../math.js\");\n\n// TODO Enforce positive area for exterior, negative area for interior?\nvar X0 = 0,\n    Y0 = 0,\n    Z0 = 0,\n    X1 = 0,\n    Y1 = 0,\n    Z1 = 0,\n    X2 = 0,\n    Y2 = 0,\n    Z2 = 0,\n    x00,\n    y00,\n    x0,\n    y0;\nvar centroidStream = {\n  point: centroidPoint,\n  lineStart: centroidLineStart,\n  lineEnd: centroidLineEnd,\n  polygonStart: function () {\n    centroidStream.lineStart = centroidRingStart;\n    centroidStream.lineEnd = centroidRingEnd;\n  },\n  polygonEnd: function () {\n    centroidStream.point = centroidPoint;\n    centroidStream.lineStart = centroidLineStart;\n    centroidStream.lineEnd = centroidLineEnd;\n  },\n  result: function () {\n    var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];\n    X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;\n    return centroid;\n  }\n};\n\nfunction centroidPoint(x, y) {\n  X0 += x;\n  Y0 += y;\n  ++Z0;\n}\n\nfunction centroidLineStart() {\n  centroidStream.point = centroidPointFirstLine;\n}\n\nfunction centroidPointFirstLine(x, y) {\n  centroidStream.point = centroidPointLine;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidPointLine(x, y) {\n  var dx = x - x0,\n      dy = y - y0,\n      z = (0, _math.sqrt)(dx * dx + dy * dy);\n  X1 += z * (x0 + x) / 2;\n  Y1 += z * (y0 + y) / 2;\n  Z1 += z;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nfunction centroidLineEnd() {\n  centroidStream.point = centroidPoint;\n}\n\nfunction centroidRingStart() {\n  centroidStream.point = centroidPointFirstRing;\n}\n\nfunction centroidRingEnd() {\n  centroidPointRing(x00, y00);\n}\n\nfunction centroidPointFirstRing(x, y) {\n  centroidStream.point = centroidPointRing;\n  centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\n\nfunction centroidPointRing(x, y) {\n  var dx = x - x0,\n      dy = y - y0,\n      z = (0, _math.sqrt)(dx * dx + dy * dy);\n  X1 += z * (x0 + x) / 2;\n  Y1 += z * (y0 + y) / 2;\n  Z1 += z;\n  z = y0 * x - x0 * y;\n  X2 += z * (x0 + x);\n  Y2 += z * (y0 + y);\n  Z2 += z * 3;\n  centroidPoint(x0 = x, y0 = y);\n}\n\nvar _default = centroidStream;\nexports.default = _default;\n},{\"../math.js\":\"JQgf\"}],\"r69t\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = PathContext;\n\nvar _math = require(\"../math.js\");\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction PathContext(context) {\n  this._context = context;\n}\n\nPathContext.prototype = {\n  _radius: 4.5,\n  pointRadius: function (_) {\n    return this._radius = _, this;\n  },\n  polygonStart: function () {\n    this._line = 0;\n  },\n  polygonEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._point = 0;\n  },\n  lineEnd: function () {\n    if (this._line === 0) this._context.closePath();\n    this._point = NaN;\n  },\n  point: function (x, y) {\n    switch (this._point) {\n      case 0:\n        {\n          this._context.moveTo(x, y);\n\n          this._point = 1;\n          break;\n        }\n\n      case 1:\n        {\n          this._context.lineTo(x, y);\n\n          break;\n        }\n\n      default:\n        {\n          this._context.moveTo(x + this._radius, y);\n\n          this._context.arc(x, y, this._radius, 0, _math.tau);\n\n          break;\n        }\n    }\n  },\n  result: _noop.default\n};\n},{\"../math.js\":\"JQgf\",\"../noop.js\":\"DUih\"}],\"SjQK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _adder = _interopRequireDefault(require(\"../adder.js\"));\n\nvar _math = require(\"../math.js\");\n\nvar _noop = _interopRequireDefault(require(\"../noop.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar lengthSum = (0, _adder.default)(),\n    lengthRing,\n    x00,\n    y00,\n    x0,\n    y0;\nvar lengthStream = {\n  point: _noop.default,\n  lineStart: function () {\n    lengthStream.point = lengthPointFirst;\n  },\n  lineEnd: function () {\n    if (lengthRing) lengthPoint(x00, y00);\n    lengthStream.point = _noop.default;\n  },\n  polygonStart: function () {\n    lengthRing = true;\n  },\n  polygonEnd: function () {\n    lengthRing = null;\n  },\n  result: function () {\n    var length = +lengthSum;\n    lengthSum.reset();\n    return length;\n  }\n};\n\nfunction lengthPointFirst(x, y) {\n  lengthStream.point = lengthPoint;\n  x00 = x0 = x, y00 = y0 = y;\n}\n\nfunction lengthPoint(x, y) {\n  x0 -= x, y0 -= y;\n  lengthSum.add((0, _math.sqrt)(x0 * x0 + y0 * y0));\n  x0 = x, y0 = y;\n}\n\nvar _default = lengthStream;\nexports.default = _default;\n},{\"../adder.js\":\"fG8A\",\"../math.js\":\"JQgf\",\"../noop.js\":\"DUih\"}],\"cxj1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = PathString;\n\nfunction PathString() {\n  this._string = [];\n}\n\nPathString.prototype = {\n  _radius: 4.5,\n  _circle: circle(4.5),\n  pointRadius: function (_) {\n    if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n    return this;\n  },\n  polygonStart: function () {\n    this._line = 0;\n  },\n  polygonEnd: function () {\n    this._line = NaN;\n  },\n  lineStart: function () {\n    this._point = 0;\n  },\n  lineEnd: function () {\n    if (this._line === 0) this._string.push(\"Z\");\n    this._point = NaN;\n  },\n  point: function (x, y) {\n    switch (this._point) {\n      case 0:\n        {\n          this._string.push(\"M\", x, \",\", y);\n\n          this._point = 1;\n          break;\n        }\n\n      case 1:\n        {\n          this._string.push(\"L\", x, \",\", y);\n\n          break;\n        }\n\n      default:\n        {\n          if (this._circle == null) this._circle = circle(this._radius);\n\n          this._string.push(\"M\", x, \",\", y, this._circle);\n\n          break;\n        }\n    }\n  },\n  result: function () {\n    if (this._string.length) {\n      var result = this._string.join(\"\");\n\n      this._string = [];\n      return result;\n    } else {\n      return null;\n    }\n  }\n};\n\nfunction circle(radius) {\n  return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n}\n},{}],\"JRMk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _identity = _interopRequireDefault(require(\"../identity.js\"));\n\nvar _stream = _interopRequireDefault(require(\"../stream.js\"));\n\nvar _area = _interopRequireDefault(require(\"./area.js\"));\n\nvar _bounds = _interopRequireDefault(require(\"./bounds.js\"));\n\nvar _centroid = _interopRequireDefault(require(\"./centroid.js\"));\n\nvar _context = _interopRequireDefault(require(\"./context.js\"));\n\nvar _measure = _interopRequireDefault(require(\"./measure.js\"));\n\nvar _string = _interopRequireDefault(require(\"./string.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(projection, context) {\n  var pointRadius = 4.5,\n      projectionStream,\n      contextStream;\n\n  function path(object) {\n    if (object) {\n      if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n      (0, _stream.default)(object, projectionStream(contextStream));\n    }\n\n    return contextStream.result();\n  }\n\n  path.area = function (object) {\n    (0, _stream.default)(object, projectionStream(_area.default));\n    return _area.default.result();\n  };\n\n  path.measure = function (object) {\n    (0, _stream.default)(object, projectionStream(_measure.default));\n    return _measure.default.result();\n  };\n\n  path.bounds = function (object) {\n    (0, _stream.default)(object, projectionStream(_bounds.default));\n    return _bounds.default.result();\n  };\n\n  path.centroid = function (object) {\n    (0, _stream.default)(object, projectionStream(_centroid.default));\n    return _centroid.default.result();\n  };\n\n  path.projection = function (_) {\n    return arguments.length ? (projectionStream = _ == null ? (projection = null, _identity.default) : (projection = _).stream, path) : projection;\n  };\n\n  path.context = function (_) {\n    if (!arguments.length) return context;\n    contextStream = _ == null ? (context = null, new _string.default()) : new _context.default(context = _);\n    if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n    return path;\n  };\n\n  path.pointRadius = function (_) {\n    if (!arguments.length) return pointRadius;\n    pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n    return path;\n  };\n\n  return path.projection(projection).context(context);\n}\n},{\"../identity.js\":\"n09v\",\"../stream.js\":\"XQuq\",\"./area.js\":\"ueEe\",\"./bounds.js\":\"tL3W\",\"./centroid.js\":\"PA8j\",\"./context.js\":\"r69t\",\"./measure.js\":\"SjQK\",\"./string.js\":\"cxj1\"}],\"pfKH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.transformer = transformer;\n\nfunction _default(methods) {\n  return {\n    stream: transformer(methods)\n  };\n}\n\nfunction transformer(methods) {\n  return function (stream) {\n    var s = new TransformStream();\n\n    for (var key in methods) s[key] = methods[key];\n\n    s.stream = stream;\n    return s;\n  };\n}\n\nfunction TransformStream() {}\n\nTransformStream.prototype = {\n  constructor: TransformStream,\n  point: function (x, y) {\n    this.stream.point(x, y);\n  },\n  sphere: function () {\n    this.stream.sphere();\n  },\n  lineStart: function () {\n    this.stream.lineStart();\n  },\n  lineEnd: function () {\n    this.stream.lineEnd();\n  },\n  polygonStart: function () {\n    this.stream.polygonStart();\n  },\n  polygonEnd: function () {\n    this.stream.polygonEnd();\n  }\n};\n},{}],\"Ycma\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fitExtent = fitExtent;\nexports.fitSize = fitSize;\nexports.fitWidth = fitWidth;\nexports.fitHeight = fitHeight;\n\nvar _stream = _interopRequireDefault(require(\"../stream.js\"));\n\nvar _bounds = _interopRequireDefault(require(\"../path/bounds.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction fit(projection, fitBounds, object) {\n  var clip = projection.clipExtent && projection.clipExtent();\n  projection.scale(150).translate([0, 0]);\n  if (clip != null) projection.clipExtent(null);\n  (0, _stream.default)(object, projection.stream(_bounds.default));\n  fitBounds(_bounds.default.result());\n  if (clip != null) projection.clipExtent(clip);\n  return projection;\n}\n\nfunction fitExtent(projection, extent, object) {\n  return fit(projection, function (b) {\n    var w = extent[1][0] - extent[0][0],\n        h = extent[1][1] - extent[0][1],\n        k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),\n        x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,\n        y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n    projection.scale(150 * k).translate([x, y]);\n  }, object);\n}\n\nfunction fitSize(projection, size, object) {\n  return fitExtent(projection, [[0, 0], size], object);\n}\n\nfunction fitWidth(projection, width, object) {\n  return fit(projection, function (b) {\n    var w = +width,\n        k = w / (b[1][0] - b[0][0]),\n        x = (w - k * (b[1][0] + b[0][0])) / 2,\n        y = -k * b[0][1];\n    projection.scale(150 * k).translate([x, y]);\n  }, object);\n}\n\nfunction fitHeight(projection, height, object) {\n  return fit(projection, function (b) {\n    var h = +height,\n        k = h / (b[1][1] - b[0][1]),\n        x = -k * b[0][0],\n        y = (h - k * (b[1][1] + b[0][1])) / 2;\n    projection.scale(150 * k).translate([x, y]);\n  }, object);\n}\n},{\"../stream.js\":\"XQuq\",\"../path/bounds.js\":\"tL3W\"}],\"nAh8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _cartesian = require(\"../cartesian.js\");\n\nvar _math = require(\"../math.js\");\n\nvar _transform = require(\"../transform.js\");\n\nvar maxDepth = 16,\n    // maximum depth of subdivision\ncosMinDistance = (0, _math.cos)(30 * _math.radians); // cos(minimum angular distance)\n\nfunction _default(project, delta2) {\n  return +delta2 ? resample(project, delta2) : resampleNone(project);\n}\n\nfunction resampleNone(project) {\n  return (0, _transform.transformer)({\n    point: function (x, y) {\n      x = project(x, y);\n      this.stream.point(x[0], x[1]);\n    }\n  });\n}\n\nfunction resample(project, delta2) {\n  function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n    var dx = x1 - x0,\n        dy = y1 - y0,\n        d2 = dx * dx + dy * dy;\n\n    if (d2 > 4 * delta2 && depth--) {\n      var a = a0 + a1,\n          b = b0 + b1,\n          c = c0 + c1,\n          m = (0, _math.sqrt)(a * a + b * b + c * c),\n          phi2 = (0, _math.asin)(c /= m),\n          lambda2 = (0, _math.abs)((0, _math.abs)(c) - 1) < _math.epsilon || (0, _math.abs)(lambda0 - lambda1) < _math.epsilon ? (lambda0 + lambda1) / 2 : (0, _math.atan2)(b, a),\n          p = project(lambda2, phi2),\n          x2 = p[0],\n          y2 = p[1],\n          dx2 = x2 - x0,\n          dy2 = y2 - y0,\n          dz = dy * dx2 - dx * dy2;\n\n      if (dz * dz / d2 > delta2 // perpendicular projected distance\n      || (0, _math.abs)((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n      || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n        // angular distance\n        resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n        stream.point(x2, y2);\n        resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n      }\n    }\n  }\n\n  return function (stream) {\n    var lambda00, x00, y00, a00, b00, c00, // first point\n    lambda0, x0, y0, a0, b0, c0; // previous point\n\n    var resampleStream = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function () {\n        stream.polygonStart();\n        resampleStream.lineStart = ringStart;\n      },\n      polygonEnd: function () {\n        stream.polygonEnd();\n        resampleStream.lineStart = lineStart;\n      }\n    };\n\n    function point(x, y) {\n      x = project(x, y);\n      stream.point(x[0], x[1]);\n    }\n\n    function lineStart() {\n      x0 = NaN;\n      resampleStream.point = linePoint;\n      stream.lineStart();\n    }\n\n    function linePoint(lambda, phi) {\n      var c = (0, _cartesian.cartesian)([lambda, phi]),\n          p = project(lambda, phi);\n      resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n      stream.point(x0, y0);\n    }\n\n    function lineEnd() {\n      resampleStream.point = point;\n      stream.lineEnd();\n    }\n\n    function ringStart() {\n      lineStart();\n      resampleStream.point = ringPoint;\n      resampleStream.lineEnd = ringEnd;\n    }\n\n    function ringPoint(lambda, phi) {\n      linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n      resampleStream.point = linePoint;\n    }\n\n    function ringEnd() {\n      resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n      resampleStream.lineEnd = lineEnd;\n      lineEnd();\n    }\n\n    return resampleStream;\n  };\n}\n},{\"../cartesian.js\":\"V83Q\",\"../math.js\":\"JQgf\",\"../transform.js\":\"pfKH\"}],\"Ktpb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = projection;\nexports.projectionMutator = projectionMutator;\n\nvar _antimeridian = _interopRequireDefault(require(\"../clip/antimeridian.js\"));\n\nvar _circle = _interopRequireDefault(require(\"../clip/circle.js\"));\n\nvar _rectangle = _interopRequireDefault(require(\"../clip/rectangle.js\"));\n\nvar _compose = _interopRequireDefault(require(\"../compose.js\"));\n\nvar _identity = _interopRequireDefault(require(\"../identity.js\"));\n\nvar _math = require(\"../math.js\");\n\nvar _rotation = require(\"../rotation.js\");\n\nvar _transform = require(\"../transform.js\");\n\nvar _fit = require(\"./fit.js\");\n\nvar _resample = _interopRequireDefault(require(\"./resample.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar transformRadians = (0, _transform.transformer)({\n  point: function (x, y) {\n    this.stream.point(x * _math.radians, y * _math.radians);\n  }\n});\n\nfunction transformRotate(rotate) {\n  return (0, _transform.transformer)({\n    point: function (x, y) {\n      var r = rotate(x, y);\n      return this.stream.point(r[0], r[1]);\n    }\n  });\n}\n\nfunction scaleTranslate(k, dx, dy) {\n  function transform(x, y) {\n    return [dx + k * x, dy - k * y];\n  }\n\n  transform.invert = function (x, y) {\n    return [(x - dx) / k, (dy - y) / k];\n  };\n\n  return transform;\n}\n\nfunction scaleTranslateRotate(k, dx, dy, alpha) {\n  var cosAlpha = (0, _math.cos)(alpha),\n      sinAlpha = (0, _math.sin)(alpha),\n      a = cosAlpha * k,\n      b = sinAlpha * k,\n      ai = cosAlpha / k,\n      bi = sinAlpha / k,\n      ci = (sinAlpha * dy - cosAlpha * dx) / k,\n      fi = (sinAlpha * dx + cosAlpha * dy) / k;\n\n  function transform(x, y) {\n    return [a * x - b * y + dx, dy - b * x - a * y];\n  }\n\n  transform.invert = function (x, y) {\n    return [ai * x - bi * y + ci, fi - bi * x - ai * y];\n  };\n\n  return transform;\n}\n\nfunction projection(project) {\n  return projectionMutator(function () {\n    return project;\n  })();\n}\n\nfunction projectionMutator(projectAt) {\n  var project,\n      k = 150,\n      // scale\n  x = 480,\n      y = 250,\n      // translate\n  lambda = 0,\n      phi = 0,\n      // center\n  deltaLambda = 0,\n      deltaPhi = 0,\n      deltaGamma = 0,\n      rotate,\n      // pre-rotate\n  alpha = 0,\n      // post-rotate\n  theta = null,\n      preclip = _antimeridian.default,\n      // pre-clip angle\n  x0 = null,\n      y0,\n      x1,\n      y1,\n      postclip = _identity.default,\n      // post-clip extent\n  delta2 = 0.5,\n      // precision\n  projectResample,\n      projectTransform,\n      projectRotateTransform,\n      cache,\n      cacheStream;\n\n  function projection(point) {\n    return projectRotateTransform(point[0] * _math.radians, point[1] * _math.radians);\n  }\n\n  function invert(point) {\n    point = projectRotateTransform.invert(point[0], point[1]);\n    return point && [point[0] * _math.degrees, point[1] * _math.degrees];\n  }\n\n  projection.stream = function (stream) {\n    return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n  };\n\n  projection.preclip = function (_) {\n    return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n  };\n\n  projection.postclip = function (_) {\n    return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n  };\n\n  projection.clipAngle = function (_) {\n    return arguments.length ? (preclip = +_ ? (0, _circle.default)(theta = _ * _math.radians) : (theta = null, _antimeridian.default), reset()) : theta * _math.degrees;\n  };\n\n  projection.clipExtent = function (_) {\n    return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, _identity.default) : (0, _rectangle.default)(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n  };\n\n  projection.scale = function (_) {\n    return arguments.length ? (k = +_, recenter()) : k;\n  };\n\n  projection.translate = function (_) {\n    return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];\n  };\n\n  projection.center = function (_) {\n    return arguments.length ? (lambda = _[0] % 360 * _math.radians, phi = _[1] % 360 * _math.radians, recenter()) : [lambda * _math.degrees, phi * _math.degrees];\n  };\n\n  projection.rotate = function (_) {\n    return arguments.length ? (deltaLambda = _[0] % 360 * _math.radians, deltaPhi = _[1] % 360 * _math.radians, deltaGamma = _.length > 2 ? _[2] % 360 * _math.radians : 0, recenter()) : [deltaLambda * _math.degrees, deltaPhi * _math.degrees, deltaGamma * _math.degrees];\n  };\n\n  projection.angle = function (_) {\n    return arguments.length ? (alpha = _ % 360 * _math.radians, recenter()) : alpha * _math.degrees;\n  };\n\n  projection.precision = function (_) {\n    return arguments.length ? (projectResample = (0, _resample.default)(projectTransform, delta2 = _ * _), reset()) : (0, _math.sqrt)(delta2);\n  };\n\n  projection.fitExtent = function (extent, object) {\n    return (0, _fit.fitExtent)(projection, extent, object);\n  };\n\n  projection.fitSize = function (size, object) {\n    return (0, _fit.fitSize)(projection, size, object);\n  };\n\n  projection.fitWidth = function (width, object) {\n    return (0, _fit.fitWidth)(projection, width, object);\n  };\n\n  projection.fitHeight = function (height, object) {\n    return (0, _fit.fitHeight)(projection, height, object);\n  };\n\n  function recenter() {\n    var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),\n        transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);\n    rotate = (0, _rotation.rotateRadians)(deltaLambda, deltaPhi, deltaGamma);\n    projectTransform = (0, _compose.default)(project, transform);\n    projectRotateTransform = (0, _compose.default)(rotate, projectTransform);\n    projectResample = (0, _resample.default)(projectTransform, delta2);\n    return reset();\n  }\n\n  function reset() {\n    cache = cacheStream = null;\n    return projection;\n  }\n\n  return function () {\n    project = projectAt.apply(this, arguments);\n    projection.invert = project.invert && invert;\n    return recenter();\n  };\n}\n},{\"../clip/antimeridian.js\":\"Gots\",\"../clip/circle.js\":\"lcCJ\",\"../clip/rectangle.js\":\"jRQA\",\"../compose.js\":\"tY9i\",\"../identity.js\":\"n09v\",\"../math.js\":\"JQgf\",\"../rotation.js\":\"LqUY\",\"../transform.js\":\"pfKH\",\"./fit.js\":\"Ycma\",\"./resample.js\":\"nAh8\"}],\"Q2ed\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.conicProjection = conicProjection;\n\nvar _math = require(\"../math.js\");\n\nvar _index = require(\"./index.js\");\n\nfunction conicProjection(projectAt) {\n  var phi0 = 0,\n      phi1 = _math.pi / 3,\n      m = (0, _index.projectionMutator)(projectAt),\n      p = m(phi0, phi1);\n\n  p.parallels = function (_) {\n    return arguments.length ? m(phi0 = _[0] * _math.radians, phi1 = _[1] * _math.radians) : [phi0 * _math.degrees, phi1 * _math.degrees];\n  };\n\n  return p;\n}\n},{\"../math.js\":\"JQgf\",\"./index.js\":\"Ktpb\"}],\"JFau\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cylindricalEqualAreaRaw = cylindricalEqualAreaRaw;\n\nvar _math = require(\"../math.js\");\n\nfunction cylindricalEqualAreaRaw(phi0) {\n  var cosPhi0 = (0, _math.cos)(phi0);\n\n  function forward(lambda, phi) {\n    return [lambda * cosPhi0, (0, _math.sin)(phi) / cosPhi0];\n  }\n\n  forward.invert = function (x, y) {\n    return [x / cosPhi0, (0, _math.asin)(y * cosPhi0)];\n  };\n\n  return forward;\n}\n},{\"../math.js\":\"JQgf\"}],\"TNCf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.conicEqualAreaRaw = conicEqualAreaRaw;\nexports.default = _default;\n\nvar _math = require(\"../math.js\");\n\nvar _conic = require(\"./conic.js\");\n\nvar _cylindricalEqualArea = require(\"./cylindricalEqualArea.js\");\n\nfunction conicEqualAreaRaw(y0, y1) {\n  var sy0 = (0, _math.sin)(y0),\n      n = (sy0 + (0, _math.sin)(y1)) / 2; // Are the parallels symmetrical around the Equator?\n\n  if ((0, _math.abs)(n) < _math.epsilon) return (0, _cylindricalEqualArea.cylindricalEqualAreaRaw)(y0);\n  var c = 1 + sy0 * (2 * n - sy0),\n      r0 = (0, _math.sqrt)(c) / n;\n\n  function project(x, y) {\n    var r = (0, _math.sqrt)(c - 2 * n * (0, _math.sin)(y)) / n;\n    return [r * (0, _math.sin)(x *= n), r0 - r * (0, _math.cos)(x)];\n  }\n\n  project.invert = function (x, y) {\n    var r0y = r0 - y;\n    return [(0, _math.atan2)(x, (0, _math.abs)(r0y)) / n * (0, _math.sign)(r0y), (0, _math.asin)((c - (x * x + r0y * r0y) * n * n) / (2 * n))];\n  };\n\n  return project;\n}\n\nfunction _default() {\n  return (0, _conic.conicProjection)(conicEqualAreaRaw).scale(155.424).center([0, 33.6442]);\n}\n},{\"../math.js\":\"JQgf\",\"./conic.js\":\"Q2ed\",\"./cylindricalEqualArea.js\":\"JFau\"}],\"cpQd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _conicEqualArea = _interopRequireDefault(require(\"./conicEqualArea.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  return (0, _conicEqualArea.default)().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]);\n}\n},{\"./conicEqualArea.js\":\"TNCf\"}],\"RPZI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _math = require(\"../math.js\");\n\nvar _albers = _interopRequireDefault(require(\"./albers.js\"));\n\nvar _conicEqualArea = _interopRequireDefault(require(\"./conicEqualArea.js\"));\n\nvar _fit = require(\"./fit.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// The projections must have mutually exclusive clip regions on the sphere,\n// as this will avoid emitting interleaving lines and polygons.\nfunction multiplex(streams) {\n  var n = streams.length;\n  return {\n    point: function (x, y) {\n      var i = -1;\n\n      while (++i < n) streams[i].point(x, y);\n    },\n    sphere: function () {\n      var i = -1;\n\n      while (++i < n) streams[i].sphere();\n    },\n    lineStart: function () {\n      var i = -1;\n\n      while (++i < n) streams[i].lineStart();\n    },\n    lineEnd: function () {\n      var i = -1;\n\n      while (++i < n) streams[i].lineEnd();\n    },\n    polygonStart: function () {\n      var i = -1;\n\n      while (++i < n) streams[i].polygonStart();\n    },\n    polygonEnd: function () {\n      var i = -1;\n\n      while (++i < n) streams[i].polygonEnd();\n    }\n  };\n} // A composite projection for the United States, configured by default for\n// 960×500. The projection also works quite well at 960×600 if you change the\n// scale to 1285 and adjust the translate accordingly. The set of standard\n// parallels for each region comes from USGS, which is published here:\n// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers\n\n\nfunction _default() {\n  var cache,\n      cacheStream,\n      lower48 = (0, _albers.default)(),\n      lower48Point,\n      alaska = (0, _conicEqualArea.default)().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]),\n      alaskaPoint,\n      // EPSG:3338\n  hawaii = (0, _conicEqualArea.default)().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]),\n      hawaiiPoint,\n      // ESRI:102007\n  point,\n      pointStream = {\n    point: function (x, y) {\n      point = [x, y];\n    }\n  };\n\n  function albersUsa(coordinates) {\n    var x = coordinates[0],\n        y = coordinates[1];\n    return point = null, (lower48Point.point(x, y), point) || (alaskaPoint.point(x, y), point) || (hawaiiPoint.point(x, y), point);\n  }\n\n  albersUsa.invert = function (coordinates) {\n    var k = lower48.scale(),\n        t = lower48.translate(),\n        x = (coordinates[0] - t[0]) / k,\n        y = (coordinates[1] - t[1]) / k;\n    return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii : lower48).invert(coordinates);\n  };\n\n  albersUsa.stream = function (stream) {\n    return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);\n  };\n\n  albersUsa.precision = function (_) {\n    if (!arguments.length) return lower48.precision();\n    lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n    return reset();\n  };\n\n  albersUsa.scale = function (_) {\n    if (!arguments.length) return lower48.scale();\n    lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n    return albersUsa.translate(lower48.translate());\n  };\n\n  albersUsa.translate = function (_) {\n    if (!arguments.length) return lower48.translate();\n    var k = lower48.scale(),\n        x = +_[0],\n        y = +_[1];\n    lower48Point = lower48.translate(_).clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]).stream(pointStream);\n    alaskaPoint = alaska.translate([x - 0.307 * k, y + 0.201 * k]).clipExtent([[x - 0.425 * k + _math.epsilon, y + 0.120 * k + _math.epsilon], [x - 0.214 * k - _math.epsilon, y + 0.234 * k - _math.epsilon]]).stream(pointStream);\n    hawaiiPoint = hawaii.translate([x - 0.205 * k, y + 0.212 * k]).clipExtent([[x - 0.214 * k + _math.epsilon, y + 0.166 * k + _math.epsilon], [x - 0.115 * k - _math.epsilon, y + 0.234 * k - _math.epsilon]]).stream(pointStream);\n    return reset();\n  };\n\n  albersUsa.fitExtent = function (extent, object) {\n    return (0, _fit.fitExtent)(albersUsa, extent, object);\n  };\n\n  albersUsa.fitSize = function (size, object) {\n    return (0, _fit.fitSize)(albersUsa, size, object);\n  };\n\n  albersUsa.fitWidth = function (width, object) {\n    return (0, _fit.fitWidth)(albersUsa, width, object);\n  };\n\n  albersUsa.fitHeight = function (height, object) {\n    return (0, _fit.fitHeight)(albersUsa, height, object);\n  };\n\n  function reset() {\n    cache = cacheStream = null;\n    return albersUsa;\n  }\n\n  return albersUsa.scale(1070);\n}\n},{\"../math.js\":\"JQgf\",\"./albers.js\":\"cpQd\",\"./conicEqualArea.js\":\"TNCf\",\"./fit.js\":\"Ycma\"}],\"WksQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.azimuthalRaw = azimuthalRaw;\nexports.azimuthalInvert = azimuthalInvert;\n\nvar _math = require(\"../math.js\");\n\nfunction azimuthalRaw(scale) {\n  return function (x, y) {\n    var cx = (0, _math.cos)(x),\n        cy = (0, _math.cos)(y),\n        k = scale(cx * cy);\n    return [k * cy * (0, _math.sin)(x), k * (0, _math.sin)(y)];\n  };\n}\n\nfunction azimuthalInvert(angle) {\n  return function (x, y) {\n    var z = (0, _math.sqrt)(x * x + y * y),\n        c = angle(z),\n        sc = (0, _math.sin)(c),\n        cc = (0, _math.cos)(c);\n    return [(0, _math.atan2)(x * sc, z * cc), (0, _math.asin)(z && y * sc / z)];\n  };\n}\n},{\"../math.js\":\"JQgf\"}],\"OyGo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.azimuthalEqualAreaRaw = void 0;\n\nvar _math = require(\"../math.js\");\n\nvar _azimuthal = require(\"./azimuthal.js\");\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar azimuthalEqualAreaRaw = (0, _azimuthal.azimuthalRaw)(function (cxcy) {\n  return (0, _math.sqrt)(2 / (1 + cxcy));\n});\nexports.azimuthalEqualAreaRaw = azimuthalEqualAreaRaw;\nazimuthalEqualAreaRaw.invert = (0, _azimuthal.azimuthalInvert)(function (z) {\n  return 2 * (0, _math.asin)(z / 2);\n});\n\nfunction _default() {\n  return (0, _index.default)(azimuthalEqualAreaRaw).scale(124.75).clipAngle(180 - 1e-3);\n}\n},{\"../math.js\":\"JQgf\",\"./azimuthal.js\":\"WksQ\",\"./index.js\":\"Ktpb\"}],\"mwct\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.azimuthalEquidistantRaw = void 0;\n\nvar _math = require(\"../math.js\");\n\nvar _azimuthal = require(\"./azimuthal.js\");\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar azimuthalEquidistantRaw = (0, _azimuthal.azimuthalRaw)(function (c) {\n  return (c = (0, _math.acos)(c)) && c / (0, _math.sin)(c);\n});\nexports.azimuthalEquidistantRaw = azimuthalEquidistantRaw;\nazimuthalEquidistantRaw.invert = (0, _azimuthal.azimuthalInvert)(function (z) {\n  return z;\n});\n\nfunction _default() {\n  return (0, _index.default)(azimuthalEquidistantRaw).scale(79.4188).clipAngle(180 - 1e-3);\n}\n},{\"../math.js\":\"JQgf\",\"./azimuthal.js\":\"WksQ\",\"./index.js\":\"Ktpb\"}],\"n0Ot\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.mercatorRaw = mercatorRaw;\nexports.default = _default;\nexports.mercatorProjection = mercatorProjection;\n\nvar _math = require(\"../math.js\");\n\nvar _rotation = _interopRequireDefault(require(\"../rotation.js\"));\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mercatorRaw(lambda, phi) {\n  return [lambda, (0, _math.log)((0, _math.tan)((_math.halfPi + phi) / 2))];\n}\n\nmercatorRaw.invert = function (x, y) {\n  return [x, 2 * (0, _math.atan)((0, _math.exp)(y)) - _math.halfPi];\n};\n\nfunction _default() {\n  return mercatorProjection(mercatorRaw).scale(961 / _math.tau);\n}\n\nfunction mercatorProjection(project) {\n  var m = (0, _index.default)(project),\n      center = m.center,\n      scale = m.scale,\n      translate = m.translate,\n      clipExtent = m.clipExtent,\n      x0 = null,\n      y0,\n      x1,\n      y1; // clip extent\n\n  m.scale = function (_) {\n    return arguments.length ? (scale(_), reclip()) : scale();\n  };\n\n  m.translate = function (_) {\n    return arguments.length ? (translate(_), reclip()) : translate();\n  };\n\n  m.center = function (_) {\n    return arguments.length ? (center(_), reclip()) : center();\n  };\n\n  m.clipExtent = function (_) {\n    return arguments.length ? (_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n  };\n\n  function reclip() {\n    var k = _math.pi * scale(),\n        t = m((0, _rotation.default)(m.rotate()).invert([0, 0]));\n    return clipExtent(x0 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);\n  }\n\n  return reclip();\n}\n},{\"../math.js\":\"JQgf\",\"../rotation.js\":\"LqUY\",\"./index.js\":\"Ktpb\"}],\"kVD1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.conicConformalRaw = conicConformalRaw;\nexports.default = _default;\n\nvar _math = require(\"../math.js\");\n\nvar _conic = require(\"./conic.js\");\n\nvar _mercator = require(\"./mercator.js\");\n\nfunction tany(y) {\n  return (0, _math.tan)((_math.halfPi + y) / 2);\n}\n\nfunction conicConformalRaw(y0, y1) {\n  var cy0 = (0, _math.cos)(y0),\n      n = y0 === y1 ? (0, _math.sin)(y0) : (0, _math.log)(cy0 / (0, _math.cos)(y1)) / (0, _math.log)(tany(y1) / tany(y0)),\n      f = cy0 * (0, _math.pow)(tany(y0), n) / n;\n  if (!n) return _mercator.mercatorRaw;\n\n  function project(x, y) {\n    if (f > 0) {\n      if (y < -_math.halfPi + _math.epsilon) y = -_math.halfPi + _math.epsilon;\n    } else {\n      if (y > _math.halfPi - _math.epsilon) y = _math.halfPi - _math.epsilon;\n    }\n\n    var r = f / (0, _math.pow)(tany(y), n);\n    return [r * (0, _math.sin)(n * x), f - r * (0, _math.cos)(n * x)];\n  }\n\n  project.invert = function (x, y) {\n    var fy = f - y,\n        r = (0, _math.sign)(n) * (0, _math.sqrt)(x * x + fy * fy);\n    return [(0, _math.atan2)(x, (0, _math.abs)(fy)) / n * (0, _math.sign)(fy), 2 * (0, _math.atan)((0, _math.pow)(f / r, 1 / n)) - _math.halfPi];\n  };\n\n  return project;\n}\n\nfunction _default() {\n  return (0, _conic.conicProjection)(conicConformalRaw).scale(109.5).parallels([30, 30]);\n}\n},{\"../math.js\":\"JQgf\",\"./conic.js\":\"Q2ed\",\"./mercator.js\":\"n0Ot\"}],\"RMXQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.equirectangularRaw = equirectangularRaw;\nexports.default = _default;\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction equirectangularRaw(lambda, phi) {\n  return [lambda, phi];\n}\n\nequirectangularRaw.invert = equirectangularRaw;\n\nfunction _default() {\n  return (0, _index.default)(equirectangularRaw).scale(152.63);\n}\n},{\"./index.js\":\"Ktpb\"}],\"TJ85\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.conicEquidistantRaw = conicEquidistantRaw;\nexports.default = _default;\n\nvar _math = require(\"../math.js\");\n\nvar _conic = require(\"./conic.js\");\n\nvar _equirectangular = require(\"./equirectangular.js\");\n\nfunction conicEquidistantRaw(y0, y1) {\n  var cy0 = (0, _math.cos)(y0),\n      n = y0 === y1 ? (0, _math.sin)(y0) : (cy0 - (0, _math.cos)(y1)) / (y1 - y0),\n      g = cy0 / n + y0;\n  if ((0, _math.abs)(n) < _math.epsilon) return _equirectangular.equirectangularRaw;\n\n  function project(x, y) {\n    var gy = g - y,\n        nx = n * x;\n    return [gy * (0, _math.sin)(nx), g - gy * (0, _math.cos)(nx)];\n  }\n\n  project.invert = function (x, y) {\n    var gy = g - y;\n    return [(0, _math.atan2)(x, (0, _math.abs)(gy)) / n * (0, _math.sign)(gy), g - (0, _math.sign)(n) * (0, _math.sqrt)(x * x + gy * gy)];\n  };\n\n  return project;\n}\n\nfunction _default() {\n  return (0, _conic.conicProjection)(conicEquidistantRaw).scale(131.154).center([0, 13.9389]);\n}\n},{\"../math.js\":\"JQgf\",\"./conic.js\":\"Q2ed\",\"./equirectangular.js\":\"RMXQ\"}],\"qrWJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.equalEarthRaw = equalEarthRaw;\nexports.default = _default;\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nvar _math = require(\"../math.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar A1 = 1.340264,\n    A2 = -0.081106,\n    A3 = 0.000893,\n    A4 = 0.003796,\n    M = (0, _math.sqrt)(3) / 2,\n    iterations = 12;\n\nfunction equalEarthRaw(lambda, phi) {\n  var l = (0, _math.asin)(M * (0, _math.sin)(phi)),\n      l2 = l * l,\n      l6 = l2 * l2 * l2;\n  return [lambda * (0, _math.cos)(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))];\n}\n\nequalEarthRaw.invert = function (x, y) {\n  var l = y,\n      l2 = l * l,\n      l6 = l2 * l2 * l2;\n\n  for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n    fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;\n    fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n    l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n    if ((0, _math.abs)(delta) < _math.epsilon2) break;\n  }\n\n  return [M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / (0, _math.cos)(l), (0, _math.asin)((0, _math.sin)(l) / M)];\n};\n\nfunction _default() {\n  return (0, _index.default)(equalEarthRaw).scale(177.158);\n}\n},{\"./index.js\":\"Ktpb\",\"../math.js\":\"JQgf\"}],\"KVOo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.gnomonicRaw = gnomonicRaw;\nexports.default = _default;\n\nvar _math = require(\"../math.js\");\n\nvar _azimuthal = require(\"./azimuthal.js\");\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction gnomonicRaw(x, y) {\n  var cy = (0, _math.cos)(y),\n      k = (0, _math.cos)(x) * cy;\n  return [cy * (0, _math.sin)(x) / k, (0, _math.sin)(y) / k];\n}\n\ngnomonicRaw.invert = (0, _azimuthal.azimuthalInvert)(_math.atan);\n\nfunction _default() {\n  return (0, _index.default)(gnomonicRaw).scale(144.049).clipAngle(60);\n}\n},{\"../math.js\":\"JQgf\",\"./azimuthal.js\":\"WksQ\",\"./index.js\":\"Ktpb\"}],\"XK0T\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _rectangle = _interopRequireDefault(require(\"../clip/rectangle.js\"));\n\nvar _identity = _interopRequireDefault(require(\"../identity.js\"));\n\nvar _transform = require(\"../transform.js\");\n\nvar _fit = require(\"./fit.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction scaleTranslate(kx, ky, tx, ty) {\n  return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? _identity.default : (0, _transform.transformer)({\n    point: function (x, y) {\n      this.stream.point(x * kx + tx, y * ky + ty);\n    }\n  });\n}\n\nfunction _default() {\n  var k = 1,\n      tx = 0,\n      ty = 0,\n      sx = 1,\n      sy = 1,\n      transform = _identity.default,\n      // scale, translate and reflect\n  x0 = null,\n      y0,\n      x1,\n      y1,\n      // clip extent\n  postclip = _identity.default,\n      cache,\n      cacheStream,\n      projection;\n\n  function reset() {\n    cache = cacheStream = null;\n    return projection;\n  }\n\n  return projection = {\n    stream: function (stream) {\n      return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));\n    },\n    postclip: function (_) {\n      return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n    },\n    clipExtent: function (_) {\n      return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, _identity.default) : (0, _rectangle.default)(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];\n    },\n    scale: function (_) {\n      return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;\n    },\n    translate: function (_) {\n      return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];\n    },\n    reflectX: function (_) {\n      return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;\n    },\n    reflectY: function (_) {\n      return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;\n    },\n    fitExtent: function (extent, object) {\n      return (0, _fit.fitExtent)(projection, extent, object);\n    },\n    fitSize: function (size, object) {\n      return (0, _fit.fitSize)(projection, size, object);\n    },\n    fitWidth: function (width, object) {\n      return (0, _fit.fitWidth)(projection, width, object);\n    },\n    fitHeight: function (height, object) {\n      return (0, _fit.fitHeight)(projection, height, object);\n    }\n  };\n}\n},{\"../clip/rectangle.js\":\"jRQA\",\"../identity.js\":\"n09v\",\"../transform.js\":\"pfKH\",\"./fit.js\":\"Ycma\"}],\"Y5z7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.naturalEarth1Raw = naturalEarth1Raw;\nexports.default = _default;\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nvar _math = require(\"../math.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction naturalEarth1Raw(lambda, phi) {\n  var phi2 = phi * phi,\n      phi4 = phi2 * phi2;\n  return [lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))];\n}\n\nnaturalEarth1Raw.invert = function (x, y) {\n  var phi = y,\n      i = 25,\n      delta;\n\n  do {\n    var phi2 = phi * phi,\n        phi4 = phi2 * phi2;\n    phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));\n  } while ((0, _math.abs)(delta) > _math.epsilon && --i > 0);\n\n  return [x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), phi];\n};\n\nfunction _default() {\n  return (0, _index.default)(naturalEarth1Raw).scale(175.295);\n}\n},{\"./index.js\":\"Ktpb\",\"../math.js\":\"JQgf\"}],\"UMbg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.orthographicRaw = orthographicRaw;\nexports.default = _default;\n\nvar _math = require(\"../math.js\");\n\nvar _azimuthal = require(\"./azimuthal.js\");\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction orthographicRaw(x, y) {\n  return [(0, _math.cos)(y) * (0, _math.sin)(x), (0, _math.sin)(y)];\n}\n\northographicRaw.invert = (0, _azimuthal.azimuthalInvert)(_math.asin);\n\nfunction _default() {\n  return (0, _index.default)(orthographicRaw).scale(249.5).clipAngle(90 + _math.epsilon);\n}\n},{\"../math.js\":\"JQgf\",\"./azimuthal.js\":\"WksQ\",\"./index.js\":\"Ktpb\"}],\"vfE9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.stereographicRaw = stereographicRaw;\nexports.default = _default;\n\nvar _math = require(\"../math.js\");\n\nvar _azimuthal = require(\"./azimuthal.js\");\n\nvar _index = _interopRequireDefault(require(\"./index.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction stereographicRaw(x, y) {\n  var cy = (0, _math.cos)(y),\n      k = 1 + (0, _math.cos)(x) * cy;\n  return [cy * (0, _math.sin)(x) / k, (0, _math.sin)(y) / k];\n}\n\nstereographicRaw.invert = (0, _azimuthal.azimuthalInvert)(function (z) {\n  return 2 * (0, _math.atan)(z);\n});\n\nfunction _default() {\n  return (0, _index.default)(stereographicRaw).scale(250).clipAngle(142);\n}\n},{\"../math.js\":\"JQgf\",\"./azimuthal.js\":\"WksQ\",\"./index.js\":\"Ktpb\"}],\"o0eF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.transverseMercatorRaw = transverseMercatorRaw;\nexports.default = _default;\n\nvar _math = require(\"../math.js\");\n\nvar _mercator = require(\"./mercator.js\");\n\nfunction transverseMercatorRaw(lambda, phi) {\n  return [(0, _math.log)((0, _math.tan)((_math.halfPi + phi) / 2)), -lambda];\n}\n\ntransverseMercatorRaw.invert = function (x, y) {\n  return [-y, 2 * (0, _math.atan)((0, _math.exp)(x)) - _math.halfPi];\n};\n\nfunction _default() {\n  var m = (0, _mercator.mercatorProjection)(transverseMercatorRaw),\n      center = m.center,\n      rotate = m.rotate;\n\n  m.center = function (_) {\n    return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);\n  };\n\n  m.rotate = function (_) {\n    return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);\n  };\n\n  return rotate([0, 0, 90]).scale(159.155);\n}\n},{\"../math.js\":\"JQgf\",\"./mercator.js\":\"n0Ot\"}],\"Ah6W\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"geoArea\", {\n  enumerable: true,\n  get: function () {\n    return _area.default;\n  }\n});\nObject.defineProperty(exports, \"geoBounds\", {\n  enumerable: true,\n  get: function () {\n    return _bounds.default;\n  }\n});\nObject.defineProperty(exports, \"geoCentroid\", {\n  enumerable: true,\n  get: function () {\n    return _centroid.default;\n  }\n});\nObject.defineProperty(exports, \"geoCircle\", {\n  enumerable: true,\n  get: function () {\n    return _circle.default;\n  }\n});\nObject.defineProperty(exports, \"geoClipAntimeridian\", {\n  enumerable: true,\n  get: function () {\n    return _antimeridian.default;\n  }\n});\nObject.defineProperty(exports, \"geoClipCircle\", {\n  enumerable: true,\n  get: function () {\n    return _circle2.default;\n  }\n});\nObject.defineProperty(exports, \"geoClipExtent\", {\n  enumerable: true,\n  get: function () {\n    return _extent.default;\n  }\n});\nObject.defineProperty(exports, \"geoClipRectangle\", {\n  enumerable: true,\n  get: function () {\n    return _rectangle.default;\n  }\n});\nObject.defineProperty(exports, \"geoContains\", {\n  enumerable: true,\n  get: function () {\n    return _contains.default;\n  }\n});\nObject.defineProperty(exports, \"geoDistance\", {\n  enumerable: true,\n  get: function () {\n    return _distance.default;\n  }\n});\nObject.defineProperty(exports, \"geoGraticule\", {\n  enumerable: true,\n  get: function () {\n    return _graticule.default;\n  }\n});\nObject.defineProperty(exports, \"geoGraticule10\", {\n  enumerable: true,\n  get: function () {\n    return _graticule.graticule10;\n  }\n});\nObject.defineProperty(exports, \"geoInterpolate\", {\n  enumerable: true,\n  get: function () {\n    return _interpolate.default;\n  }\n});\nObject.defineProperty(exports, \"geoLength\", {\n  enumerable: true,\n  get: function () {\n    return _length.default;\n  }\n});\nObject.defineProperty(exports, \"geoPath\", {\n  enumerable: true,\n  get: function () {\n    return _index.default;\n  }\n});\nObject.defineProperty(exports, \"geoAlbers\", {\n  enumerable: true,\n  get: function () {\n    return _albers.default;\n  }\n});\nObject.defineProperty(exports, \"geoAlbersUsa\", {\n  enumerable: true,\n  get: function () {\n    return _albersUsa.default;\n  }\n});\nObject.defineProperty(exports, \"geoAzimuthalEqualArea\", {\n  enumerable: true,\n  get: function () {\n    return _azimuthalEqualArea.default;\n  }\n});\nObject.defineProperty(exports, \"geoAzimuthalEqualAreaRaw\", {\n  enumerable: true,\n  get: function () {\n    return _azimuthalEqualArea.azimuthalEqualAreaRaw;\n  }\n});\nObject.defineProperty(exports, \"geoAzimuthalEquidistant\", {\n  enumerable: true,\n  get: function () {\n    return _azimuthalEquidistant.default;\n  }\n});\nObject.defineProperty(exports, \"geoAzimuthalEquidistantRaw\", {\n  enumerable: true,\n  get: function () {\n    return _azimuthalEquidistant.azimuthalEquidistantRaw;\n  }\n});\nObject.defineProperty(exports, \"geoConicConformal\", {\n  enumerable: true,\n  get: function () {\n    return _conicConformal.default;\n  }\n});\nObject.defineProperty(exports, \"geoConicConformalRaw\", {\n  enumerable: true,\n  get: function () {\n    return _conicConformal.conicConformalRaw;\n  }\n});\nObject.defineProperty(exports, \"geoConicEqualArea\", {\n  enumerable: true,\n  get: function () {\n    return _conicEqualArea.default;\n  }\n});\nObject.defineProperty(exports, \"geoConicEqualAreaRaw\", {\n  enumerable: true,\n  get: function () {\n    return _conicEqualArea.conicEqualAreaRaw;\n  }\n});\nObject.defineProperty(exports, \"geoConicEquidistant\", {\n  enumerable: true,\n  get: function () {\n    return _conicEquidistant.default;\n  }\n});\nObject.defineProperty(exports, \"geoConicEquidistantRaw\", {\n  enumerable: true,\n  get: function () {\n    return _conicEquidistant.conicEquidistantRaw;\n  }\n});\nObject.defineProperty(exports, \"geoEqualEarth\", {\n  enumerable: true,\n  get: function () {\n    return _equalEarth.default;\n  }\n});\nObject.defineProperty(exports, \"geoEqualEarthRaw\", {\n  enumerable: true,\n  get: function () {\n    return _equalEarth.equalEarthRaw;\n  }\n});\nObject.defineProperty(exports, \"geoEquirectangular\", {\n  enumerable: true,\n  get: function () {\n    return _equirectangular.default;\n  }\n});\nObject.defineProperty(exports, \"geoEquirectangularRaw\", {\n  enumerable: true,\n  get: function () {\n    return _equirectangular.equirectangularRaw;\n  }\n});\nObject.defineProperty(exports, \"geoGnomonic\", {\n  enumerable: true,\n  get: function () {\n    return _gnomonic.default;\n  }\n});\nObject.defineProperty(exports, \"geoGnomonicRaw\", {\n  enumerable: true,\n  get: function () {\n    return _gnomonic.gnomonicRaw;\n  }\n});\nObject.defineProperty(exports, \"geoIdentity\", {\n  enumerable: true,\n  get: function () {\n    return _identity.default;\n  }\n});\nObject.defineProperty(exports, \"geoProjection\", {\n  enumerable: true,\n  get: function () {\n    return _index2.default;\n  }\n});\nObject.defineProperty(exports, \"geoProjectionMutator\", {\n  enumerable: true,\n  get: function () {\n    return _index2.projectionMutator;\n  }\n});\nObject.defineProperty(exports, \"geoMercator\", {\n  enumerable: true,\n  get: function () {\n    return _mercator.default;\n  }\n});\nObject.defineProperty(exports, \"geoMercatorRaw\", {\n  enumerable: true,\n  get: function () {\n    return _mercator.mercatorRaw;\n  }\n});\nObject.defineProperty(exports, \"geoNaturalEarth1\", {\n  enumerable: true,\n  get: function () {\n    return _naturalEarth.default;\n  }\n});\nObject.defineProperty(exports, \"geoNaturalEarth1Raw\", {\n  enumerable: true,\n  get: function () {\n    return _naturalEarth.naturalEarth1Raw;\n  }\n});\nObject.defineProperty(exports, \"geoOrthographic\", {\n  enumerable: true,\n  get: function () {\n    return _orthographic.default;\n  }\n});\nObject.defineProperty(exports, \"geoOrthographicRaw\", {\n  enumerable: true,\n  get: function () {\n    return _orthographic.orthographicRaw;\n  }\n});\nObject.defineProperty(exports, \"geoStereographic\", {\n  enumerable: true,\n  get: function () {\n    return _stereographic.default;\n  }\n});\nObject.defineProperty(exports, \"geoStereographicRaw\", {\n  enumerable: true,\n  get: function () {\n    return _stereographic.stereographicRaw;\n  }\n});\nObject.defineProperty(exports, \"geoTransverseMercator\", {\n  enumerable: true,\n  get: function () {\n    return _transverseMercator.default;\n  }\n});\nObject.defineProperty(exports, \"geoTransverseMercatorRaw\", {\n  enumerable: true,\n  get: function () {\n    return _transverseMercator.transverseMercatorRaw;\n  }\n});\nObject.defineProperty(exports, \"geoRotation\", {\n  enumerable: true,\n  get: function () {\n    return _rotation.default;\n  }\n});\nObject.defineProperty(exports, \"geoStream\", {\n  enumerable: true,\n  get: function () {\n    return _stream.default;\n  }\n});\nObject.defineProperty(exports, \"geoTransform\", {\n  enumerable: true,\n  get: function () {\n    return _transform.default;\n  }\n});\n\nvar _area = _interopRequireDefault(require(\"./area.js\"));\n\nvar _bounds = _interopRequireDefault(require(\"./bounds.js\"));\n\nvar _centroid = _interopRequireDefault(require(\"./centroid.js\"));\n\nvar _circle = _interopRequireDefault(require(\"./circle.js\"));\n\nvar _antimeridian = _interopRequireDefault(require(\"./clip/antimeridian.js\"));\n\nvar _circle2 = _interopRequireDefault(require(\"./clip/circle.js\"));\n\nvar _extent = _interopRequireDefault(require(\"./clip/extent.js\"));\n\nvar _rectangle = _interopRequireDefault(require(\"./clip/rectangle.js\"));\n\nvar _contains = _interopRequireDefault(require(\"./contains.js\"));\n\nvar _distance = _interopRequireDefault(require(\"./distance.js\"));\n\nvar _graticule = _interopRequireWildcard(require(\"./graticule.js\"));\n\nvar _interpolate = _interopRequireDefault(require(\"./interpolate.js\"));\n\nvar _length = _interopRequireDefault(require(\"./length.js\"));\n\nvar _index = _interopRequireDefault(require(\"./path/index.js\"));\n\nvar _albers = _interopRequireDefault(require(\"./projection/albers.js\"));\n\nvar _albersUsa = _interopRequireDefault(require(\"./projection/albersUsa.js\"));\n\nvar _azimuthalEqualArea = _interopRequireWildcard(require(\"./projection/azimuthalEqualArea.js\"));\n\nvar _azimuthalEquidistant = _interopRequireWildcard(require(\"./projection/azimuthalEquidistant.js\"));\n\nvar _conicConformal = _interopRequireWildcard(require(\"./projection/conicConformal.js\"));\n\nvar _conicEqualArea = _interopRequireWildcard(require(\"./projection/conicEqualArea.js\"));\n\nvar _conicEquidistant = _interopRequireWildcard(require(\"./projection/conicEquidistant.js\"));\n\nvar _equalEarth = _interopRequireWildcard(require(\"./projection/equalEarth.js\"));\n\nvar _equirectangular = _interopRequireWildcard(require(\"./projection/equirectangular.js\"));\n\nvar _gnomonic = _interopRequireWildcard(require(\"./projection/gnomonic.js\"));\n\nvar _identity = _interopRequireDefault(require(\"./projection/identity.js\"));\n\nvar _index2 = _interopRequireWildcard(require(\"./projection/index.js\"));\n\nvar _mercator = _interopRequireWildcard(require(\"./projection/mercator.js\"));\n\nvar _naturalEarth = _interopRequireWildcard(require(\"./projection/naturalEarth1.js\"));\n\nvar _orthographic = _interopRequireWildcard(require(\"./projection/orthographic.js\"));\n\nvar _stereographic = _interopRequireWildcard(require(\"./projection/stereographic.js\"));\n\nvar _transverseMercator = _interopRequireWildcard(require(\"./projection/transverseMercator.js\"));\n\nvar _rotation = _interopRequireDefault(require(\"./rotation.js\"));\n\nvar _stream = _interopRequireDefault(require(\"./stream.js\"));\n\nvar _transform = _interopRequireDefault(require(\"./transform.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./area.js\":\"rKta\",\"./bounds.js\":\"rw3L\",\"./centroid.js\":\"GCsQ\",\"./circle.js\":\"KcOR\",\"./clip/antimeridian.js\":\"Gots\",\"./clip/circle.js\":\"lcCJ\",\"./clip/extent.js\":\"EodF\",\"./clip/rectangle.js\":\"jRQA\",\"./contains.js\":\"tRhb\",\"./distance.js\":\"hTgK\",\"./graticule.js\":\"IdZ0\",\"./interpolate.js\":\"uuLr\",\"./length.js\":\"bXUe\",\"./path/index.js\":\"JRMk\",\"./projection/albers.js\":\"cpQd\",\"./projection/albersUsa.js\":\"RPZI\",\"./projection/azimuthalEqualArea.js\":\"OyGo\",\"./projection/azimuthalEquidistant.js\":\"mwct\",\"./projection/conicConformal.js\":\"kVD1\",\"./projection/conicEqualArea.js\":\"TNCf\",\"./projection/conicEquidistant.js\":\"TJ85\",\"./projection/equalEarth.js\":\"qrWJ\",\"./projection/equirectangular.js\":\"RMXQ\",\"./projection/gnomonic.js\":\"KVOo\",\"./projection/identity.js\":\"XK0T\",\"./projection/index.js\":\"Ktpb\",\"./projection/mercator.js\":\"n0Ot\",\"./projection/naturalEarth1.js\":\"Y5z7\",\"./projection/orthographic.js\":\"UMbg\",\"./projection/stereographic.js\":\"vfE9\",\"./projection/transverseMercator.js\":\"o0eF\",\"./rotation.js\":\"LqUY\",\"./stream.js\":\"XQuq\",\"./transform.js\":\"pfKH\"}],\"ORId\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.projection = projection;\nexports.getProjectionPath = getProjectionPath;\nexports.projectionProperties = void 0;\n\nvar _d3Geo = require(\"d3-geo\");\n\nvar defaultPath = (0, _d3Geo.geoPath)();\nvar projectionProperties = [// standard properties in d3-geo\n'clipAngle', 'clipExtent', 'scale', 'translate', 'center', 'rotate', 'parallels', 'precision', 'reflectX', 'reflectY', // extended properties in d3-geo-projections\n'coefficient', 'distance', 'fraction', 'lobes', 'parallel', 'radius', 'ratio', 'spacing', 'tilt'];\n/**\n * Augment projections with their type and a copy method.\n */\n\nexports.projectionProperties = projectionProperties;\n\nfunction create(type, constructor) {\n  return function projection() {\n    var p = constructor();\n    p.type = type;\n    p.path = (0, _d3Geo.geoPath)().projection(p);\n\n    p.copy = p.copy || function () {\n      var c = projection();\n      projectionProperties.forEach(function (prop) {\n        if (p[prop]) c[prop](p[prop]());\n      });\n      c.path.pointRadius(p.path.pointRadius());\n      return c;\n    };\n\n    return p;\n  };\n}\n\nfunction projection(type, proj) {\n  if (!type || typeof type !== 'string') {\n    throw new Error('Projection type must be a name string.');\n  }\n\n  type = type.toLowerCase();\n\n  if (arguments.length > 1) {\n    projections[type] = create(type, proj);\n    return this;\n  } else {\n    return projections[type] || null;\n  }\n}\n\nfunction getProjectionPath(proj) {\n  return proj && proj.path || defaultPath;\n}\n\nvar projections = {\n  // base d3-geo projection types\n  albers: _d3Geo.geoAlbers,\n  albersusa: _d3Geo.geoAlbersUsa,\n  azimuthalequalarea: _d3Geo.geoAzimuthalEqualArea,\n  azimuthalequidistant: _d3Geo.geoAzimuthalEquidistant,\n  conicconformal: _d3Geo.geoConicConformal,\n  conicequalarea: _d3Geo.geoConicEqualArea,\n  conicequidistant: _d3Geo.geoConicEquidistant,\n  equalEarth: _d3Geo.geoEqualEarth,\n  equirectangular: _d3Geo.geoEquirectangular,\n  gnomonic: _d3Geo.geoGnomonic,\n  identity: _d3Geo.geoIdentity,\n  mercator: _d3Geo.geoMercator,\n  naturalEarth1: _d3Geo.geoNaturalEarth1,\n  orthographic: _d3Geo.geoOrthographic,\n  stereographic: _d3Geo.geoStereographic,\n  transversemercator: _d3Geo.geoTransverseMercator\n};\n\nfor (var key in projections) {\n  projection(key, projections[key]);\n}\n},{\"d3-geo\":\"Ah6W\"}],\"WpLm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"projection\", {\n  enumerable: true,\n  get: function () {\n    return _projections.projection;\n  }\n});\nObject.defineProperty(exports, \"projectionProperties\", {\n  enumerable: true,\n  get: function () {\n    return _projections.projectionProperties;\n  }\n});\nObject.defineProperty(exports, \"getProjectionPath\", {\n  enumerable: true,\n  get: function () {\n    return _projections.getProjectionPath;\n  }\n});\n\nvar _projections = require(\"./src/projections\");\n},{\"./src/projections\":\"ORId\"}],\"C25E\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = GeoPath;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaProjection = require(\"vega-projection\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Map GeoJSON data to an SVG path string.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {function(object): *} [params.field] - The field with GeoJSON data,\n *   or null if the tuple itself is a GeoJSON feature.\n * @param {string} [params.as='path'] - The output field in which to store\n *   the generated path data (default 'path').\n */\nfunction GeoPath(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nGeoPath.Definition = {\n  \"type\": \"GeoPath\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"projection\",\n    \"type\": \"projection\"\n  }, {\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"pointRadius\",\n    \"type\": \"number\",\n    \"expr\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"default\": \"path\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(GeoPath, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.ALL),\n      path = this.value,\n      field = _.field || _vegaUtil.identity,\n      as = _.as || 'path',\n      flag = out.SOURCE;\n\n  function set(t) {\n    t[as] = path(field(t));\n  }\n\n  if (!path || _.modified()) {\n    // parameters updated, reset and reflow\n    this.value = path = (0, _vegaProjection.getProjectionPath)(_.projection);\n    out.materialize().reflow();\n  } else {\n    flag = field === _vegaUtil.identity || pulse.modified(field.fields) ? out.ADD_MOD : out.ADD;\n  }\n\n  var prev = initPath(path, _.pointRadius);\n  out.visit(flag, set);\n  path.pointRadius(prev);\n  return out.modifies(as);\n};\n\nfunction initPath(path, pointRadius) {\n  var prev = path.pointRadius();\n  path.context(null);\n\n  if (pointRadius != null) {\n    path.pointRadius(pointRadius);\n  }\n\n  return prev;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-projection\":\"WpLm\",\"vega-util\":\"d61Z\"}],\"zI1P\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = GeoPoint;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Geo-code a longitude/latitude point to an x/y coordinate.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {Array<function(object): *>} params.fields - A two-element array of\n *   field accessors for the longitude and latitude values.\n * @param {Array<string>} [params.as] - A two-element array of field names\n *   under which to store the result. Defaults to ['x','y'].\n */\nfunction GeoPoint(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nGeoPoint.Definition = {\n  \"type\": \"GeoPoint\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"projection\",\n    \"type\": \"projection\",\n    \"required\": true\n  }, {\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"array\": true,\n    \"required\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [\"x\", \"y\"]\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(GeoPoint, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var proj = _.projection,\n      lon = _.fields[0],\n      lat = _.fields[1],\n      as = _.as || ['x', 'y'],\n      x = as[0],\n      y = as[1],\n      mod;\n\n  function set(t) {\n    var xy = proj([lon(t), lat(t)]);\n\n    if (xy) {\n      t[x] = xy[0];\n      t[y] = xy[1];\n    } else {\n      t[x] = undefined;\n      t[y] = undefined;\n    }\n  }\n\n  if (_.modified()) {\n    // parameters updated, reflow\n    pulse = pulse.materialize().reflow(true).visit(pulse.SOURCE, set);\n  } else {\n    mod = pulse.modified(lon.fields) || pulse.modified(lat.fields);\n    pulse.visit(mod ? pulse.ADD_MOD : pulse.ADD, set);\n  }\n\n  return pulse.modifies(as);\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"P856\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = GeoShape;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaProjection = require(\"vega-projection\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Annotate items with a geopath shape generator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {function(object): *} [params.field] - The field with GeoJSON data,\n *   or null if the tuple itself is a GeoJSON feature.\n * @param {string} [params.as='shape'] - The output field in which to store\n *   the generated path data (default 'shape').\n */\nfunction GeoShape(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nGeoShape.Definition = {\n  \"type\": \"GeoShape\",\n  \"metadata\": {\n    \"modifies\": true,\n    \"nomod\": true\n  },\n  \"params\": [{\n    \"name\": \"projection\",\n    \"type\": \"projection\"\n  }, {\n    \"name\": \"field\",\n    \"type\": \"field\",\n    \"default\": \"datum\"\n  }, {\n    \"name\": \"pointRadius\",\n    \"type\": \"number\",\n    \"expr\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"default\": \"shape\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(GeoShape, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.ALL),\n      shape = this.value,\n      as = _.as || 'shape',\n      flag = out.ADD;\n\n  if (!shape || _.modified()) {\n    // parameters updated, reset and reflow\n    this.value = shape = shapeGenerator((0, _vegaProjection.getProjectionPath)(_.projection), _.field || (0, _vegaUtil.field)('datum'), _.pointRadius);\n    out.materialize().reflow();\n    flag = out.SOURCE;\n  }\n\n  out.visit(flag, function (t) {\n    t[as] = shape;\n  });\n  return out.modifies(as);\n};\n\nfunction shapeGenerator(path, field, pointRadius) {\n  var shape = pointRadius == null ? function (_) {\n    return path(field(_));\n  } : function (_) {\n    var prev = path.pointRadius(),\n        value = path.pointRadius(pointRadius)(field(_));\n    path.pointRadius(prev);\n    return value;\n  };\n\n  shape.context = function (_) {\n    path.context(_);\n    return shape;\n  };\n\n  return shape;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-projection\":\"WpLm\",\"vega-util\":\"d61Z\"}],\"SMWk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Graticule;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Geo = require(\"d3-geo\");\n\n/**\n * GeoJSON feature generator for creating graticules.\n * @constructor\n */\nfunction Graticule(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n\n  this.generator = (0, _d3Geo.geoGraticule)();\n}\n\nGraticule.Definition = {\n  \"type\": \"Graticule\",\n  \"metadata\": {\n    \"changes\": true,\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"extent\",\n    \"type\": \"array\",\n    \"array\": true,\n    \"length\": 2,\n    \"content\": {\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }\n  }, {\n    \"name\": \"extentMajor\",\n    \"type\": \"array\",\n    \"array\": true,\n    \"length\": 2,\n    \"content\": {\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }\n  }, {\n    \"name\": \"extentMinor\",\n    \"type\": \"array\",\n    \"array\": true,\n    \"length\": 2,\n    \"content\": {\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }\n  }, {\n    \"name\": \"step\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"stepMajor\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [90, 360]\n  }, {\n    \"name\": \"stepMinor\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [10, 10]\n  }, {\n    \"name\": \"precision\",\n    \"type\": \"number\",\n    \"default\": 2.5\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Graticule, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var src = this.value,\n      gen = this.generator,\n      t;\n\n  if (!src.length || _.modified()) {\n    for (var prop in _) {\n      if ((0, _vegaUtil.isFunction)(gen[prop])) {\n        gen[prop](_[prop]);\n      }\n    }\n  }\n\n  t = gen();\n\n  if (src.length) {\n    pulse.mod.push((0, _vegaDataflow.replace)(src[0], t));\n  } else {\n    pulse.add.push((0, _vegaDataflow.ingest)(t));\n  }\n\n  src[0] = t;\n  return pulse;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-geo\":\"Ah6W\"}],\"VS0b\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Heatmap;\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Color = require(\"d3-color\");\n\nvar _vegaCanvas = require(\"vega-canvas\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Render a heatmap image for input raster grid data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} [params.field] - The field with raster grid\n *   data. If unspecified, the tuple itself is interpreted as a raster grid.\n * @param {string} [params.color] - A constant color value or function for\n *   individual pixel color. If a function, it will be invoked with an input\n *   object that includes $x, $y, $value, and $max fields for the grid.\n * @param {number} [params.opacity] - A constant opacity value or function for\n *   individual pixel opacity. If a function, it will be invoked with an input\n *   object that includes $x, $y, $value, and $max fields for the grid.\n * @param {string} [params.resolve] - The method for resolving maximum values\n *   across multiple input grids. If 'independent' (the default), maximum\n *   calculation will be performed separately for each grid. If 'shared',\n *   a single global maximum will be used for all input grids.\n * @param {string} [params.as='image'] - The output field in which to store\n *   the generated bitmap canvas images (default 'image').\n */\nfunction Heatmap(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nHeatmap.Definition = {\n  \"type\": \"heatmap\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"color\",\n    \"type\": \"string\",\n    \"expr\": true\n  }, {\n    \"name\": \"opacity\",\n    \"type\": \"number\",\n    \"expr\": true\n  }, {\n    \"name\": \"resolve\",\n    \"type\": \"enum\",\n    \"values\": [\"shared\", \"independent\"],\n    \"default\": \"independent\"\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"default\": \"image\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Heatmap, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (!pulse.changed() && !_.modified()) {\n    return pulse.StopPropagation;\n  }\n\n  var source = pulse.materialize(pulse.SOURCE).source,\n      shared = _.resolve === 'shared',\n      field = _.field || _vegaUtil.identity,\n      opacity = opacity_(_.opacity, _),\n      color = color_(_.color, _),\n      as = _.as || 'image',\n      obj = {\n    $x: 0,\n    $y: 0,\n    $value: 0,\n    $max: shared ? (0, _d3Array.max)(source.map(t => (0, _d3Array.max)(field(t).values))) : 0\n  };\n  source.forEach(t => {\n    const v = field(t); // build proxy data object\n\n    const o = (0, _vegaUtil.extend)({}, t, obj); // set maximum value if not globally shared\n\n    if (!shared) o.$max = (0, _d3Array.max)(v.values || []); // generate canvas image\n    // optimize color/opacity if not pixel-dependent\n\n    t[as] = toCanvas(v, o, color.dep ? color : (0, _vegaUtil.constant)(color(o)), opacity.dep ? opacity : (0, _vegaUtil.constant)(opacity(o)));\n  });\n  return pulse.reflow(true).modifies(as);\n}; // get image color function\n\n\nfunction color_(color, _) {\n  let f;\n\n  if ((0, _vegaUtil.isFunction)(color)) {\n    f = obj => (0, _d3Color.rgb)(color(obj, _));\n\n    f.dep = dependency(color);\n  } else {\n    // default to mid-grey\n    f = (0, _vegaUtil.constant)((0, _d3Color.rgb)(color || '#888'));\n  }\n\n  return f;\n} // get image opacity function\n\n\nfunction opacity_(opacity, _) {\n  let f;\n\n  if ((0, _vegaUtil.isFunction)(opacity)) {\n    f = obj => opacity(obj, _);\n\n    f.dep = dependency(opacity);\n  } else if (opacity) {\n    f = (0, _vegaUtil.constant)(opacity);\n  } else {\n    // default to [0, max] opacity gradient\n    f = obj => obj.$value / obj.$max || 0;\n\n    f.dep = true;\n  }\n\n  return f;\n} // check if function depends on individual pixel data\n\n\nfunction dependency(f) {\n  if (!(0, _vegaUtil.isFunction)(f)) return false;\n  const set = (0, _vegaUtil.toSet)((0, _vegaUtil.accessorFields)(f));\n  return set.$x || set.$y || set.$value || set.$max;\n} // render raster grid to canvas\n\n\nfunction toCanvas(grid, obj, color, opacity) {\n  const n = grid.width,\n        m = grid.height,\n        x1 = grid.x1 || 0,\n        y1 = grid.y1 || 0,\n        x2 = grid.x2 || n,\n        y2 = grid.y2 || m,\n        val = grid.values,\n        value = val ? i => val[i] : _vegaUtil.zero,\n        can = (0, _vegaCanvas.canvas)(x2 - x1, y2 - y1),\n        ctx = can.getContext('2d'),\n        img = ctx.getImageData(0, 0, x2 - x1, y2 - y1),\n        pix = img.data;\n\n  for (let j = y1, k = 0; j < y2; ++j) {\n    obj.$y = j - y1;\n\n    for (let i = x1, r = j * n; i < x2; ++i, k += 4) {\n      obj.$x = i - x1;\n      obj.$value = value(i + r);\n      const v = color(obj);\n      pix[k + 0] = v.r;\n      pix[k + 1] = v.g;\n      pix[k + 2] = v.b;\n      pix[k + 3] = ~~(255 * opacity(obj));\n    }\n  }\n\n  ctx.putImageData(img, 0, 0);\n  return can;\n}\n},{\"d3-array\":\"K0bd\",\"d3-color\":\"Peej\",\"vega-canvas\":\"r2P5\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"P5Sn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Projection;\nexports.collectGeoJSON = collectGeoJSON;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaProjection = require(\"vega-projection\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Maintains a cartographic projection.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */\nfunction Projection(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n\n  this.modified(true); // always treat as modified\n}\n\nvar prototype = (0, _vegaUtil.inherits)(Projection, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var proj = this.value;\n\n  if (!proj || _.modified('type')) {\n    this.value = proj = create(_.type);\n\n    _vegaProjection.projectionProperties.forEach(function (prop) {\n      if (_[prop] != null) set(proj, prop, _[prop]);\n    });\n  } else {\n    _vegaProjection.projectionProperties.forEach(function (prop) {\n      if (_.modified(prop)) set(proj, prop, _[prop]);\n    });\n  }\n\n  if (_.pointRadius != null) proj.path.pointRadius(_.pointRadius);\n  if (_.fit) fit(proj, _);\n  return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n};\n\nfunction fit(proj, _) {\n  var data = collectGeoJSON(_.fit);\n  _.extent ? proj.fitExtent(_.extent, data) : _.size ? proj.fitSize(_.size, data) : 0;\n}\n\nfunction create(type) {\n  var constructor = (0, _vegaProjection.projection)((type || 'mercator').toLowerCase());\n  if (!constructor) (0, _vegaUtil.error)('Unrecognized projection type: ' + type);\n  return constructor();\n}\n\nfunction set(proj, key, value) {\n  if ((0, _vegaUtil.isFunction)(proj[key])) proj[key](value);\n}\n\nfunction collectGeoJSON(data) {\n  data = (0, _vegaUtil.array)(data);\n  return data.length === 1 ? data[0] : {\n    type: _constants.FeatureCollection,\n    features: data.reduce((a, f) => a.concat(featurize(f)), [])\n  };\n}\n\nfunction featurize(f) {\n  return f.type === _constants.FeatureCollection ? f.features : (0, _vegaUtil.array)(f).filter(d => d != null).map(d => d.type === _constants.Feature ? d : {\n    type: _constants.Feature,\n    geometry: d\n  });\n}\n},{\"./constants\":\"PN9h\",\"vega-dataflow\":\"luN0\",\"vega-projection\":\"WpLm\",\"vega-util\":\"d61Z\"}],\"pBvZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"contour\", {\n  enumerable: true,\n  get: function () {\n    return _Contour.default;\n  }\n});\nObject.defineProperty(exports, \"geojson\", {\n  enumerable: true,\n  get: function () {\n    return _GeoJSON.default;\n  }\n});\nObject.defineProperty(exports, \"geopath\", {\n  enumerable: true,\n  get: function () {\n    return _GeoPath.default;\n  }\n});\nObject.defineProperty(exports, \"geopoint\", {\n  enumerable: true,\n  get: function () {\n    return _GeoPoint.default;\n  }\n});\nObject.defineProperty(exports, \"geoshape\", {\n  enumerable: true,\n  get: function () {\n    return _GeoShape.default;\n  }\n});\nObject.defineProperty(exports, \"graticule\", {\n  enumerable: true,\n  get: function () {\n    return _Graticule.default;\n  }\n});\nObject.defineProperty(exports, \"heatmap\", {\n  enumerable: true,\n  get: function () {\n    return _Heatmap.default;\n  }\n});\nObject.defineProperty(exports, \"isocontour\", {\n  enumerable: true,\n  get: function () {\n    return _Isocontour.default;\n  }\n});\nObject.defineProperty(exports, \"kde2d\", {\n  enumerable: true,\n  get: function () {\n    return _KDE2D.default;\n  }\n});\nObject.defineProperty(exports, \"projection\", {\n  enumerable: true,\n  get: function () {\n    return _Projection.default;\n  }\n});\n\nvar _Contour = _interopRequireDefault(require(\"./src/Contour\"));\n\nvar _GeoJSON = _interopRequireDefault(require(\"./src/GeoJSON\"));\n\nvar _GeoPath = _interopRequireDefault(require(\"./src/GeoPath\"));\n\nvar _GeoPoint = _interopRequireDefault(require(\"./src/GeoPoint\"));\n\nvar _GeoShape = _interopRequireDefault(require(\"./src/GeoShape\"));\n\nvar _Graticule = _interopRequireDefault(require(\"./src/Graticule\"));\n\nvar _Heatmap = _interopRequireDefault(require(\"./src/Heatmap\"));\n\nvar _Isocontour = _interopRequireDefault(require(\"./src/Isocontour\"));\n\nvar _KDE2D = _interopRequireDefault(require(\"./src/KDE2D\"));\n\nvar _Projection = _interopRequireDefault(require(\"./src/Projection\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Contour\":\"QzBe\",\"./src/GeoJSON\":\"t2xF\",\"./src/GeoPath\":\"C25E\",\"./src/GeoPoint\":\"zI1P\",\"./src/GeoShape\":\"P856\",\"./src/Graticule\":\"SMWk\",\"./src/Heatmap\":\"VS0b\",\"./src/Isocontour\":\"zTBn\",\"./src/KDE2D\":\"gQ9n\",\"./src/Projection\":\"P5Sn\"}],\"i73m\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x, y) {\n  var nodes;\n  if (x == null) x = 0;\n  if (y == null) y = 0;\n\n  function force() {\n    var i,\n        n = nodes.length,\n        node,\n        sx = 0,\n        sy = 0;\n\n    for (i = 0; i < n; ++i) {\n      node = nodes[i], sx += node.x, sy += node.y;\n    }\n\n    for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {\n      node = nodes[i], node.x -= sx, node.y -= sy;\n    }\n  }\n\n  force.initialize = function (_) {\n    nodes = _;\n  };\n\n  force.x = function (_) {\n    return arguments.length ? (x = +_, force) : x;\n  };\n\n  force.y = function (_) {\n    return arguments.length ? (y = +_, force) : y;\n  };\n\n  return force;\n}\n},{}],\"ALzt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.addAll = addAll;\n\nfunction _default(d) {\n  var x = +this._x.call(null, d),\n      y = +this._y.call(null, d);\n  return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n  if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n  var parent,\n      node = tree._root,\n      leaf = {\n    data: d\n  },\n      x0 = tree._x0,\n      y0 = tree._y0,\n      x1 = tree._x1,\n      y1 = tree._y1,\n      xm,\n      ym,\n      xp,\n      yp,\n      right,\n      bottom,\n      i,\n      j; // If the tree is empty, initialize the root as a leaf.\n\n  if (!node) return tree._root = leaf, tree; // Find the existing leaf for the new point, or add it.\n\n  while (node.length) {\n    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;else x1 = xm;\n    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;else y1 = ym;\n    if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n  } // Is the new point is exactly coincident with the existing point?\n\n\n  xp = +tree._x.call(null, node.data);\n  yp = +tree._y.call(null, node.data);\n  if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; // Otherwise, split the leaf node until the old and new point are separated.\n\n  do {\n    parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;else x1 = xm;\n    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;else y1 = ym;\n  } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));\n\n  return parent[j] = node, parent[i] = leaf, tree;\n}\n\nfunction addAll(data) {\n  var d,\n      i,\n      n = data.length,\n      x,\n      y,\n      xz = new Array(n),\n      yz = new Array(n),\n      x0 = Infinity,\n      y0 = Infinity,\n      x1 = -Infinity,\n      y1 = -Infinity; // Compute the points and their extent.\n\n  for (i = 0; i < n; ++i) {\n    if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n    xz[i] = x;\n    yz[i] = y;\n    if (x < x0) x0 = x;\n    if (x > x1) x1 = x;\n    if (y < y0) y0 = y;\n    if (y > y1) y1 = y;\n  } // If there were no (valid) points, abort.\n\n\n  if (x0 > x1 || y0 > y1) return this; // Expand the tree to cover the new points.\n\n  this.cover(x0, y0).cover(x1, y1); // Add the new points.\n\n  for (i = 0; i < n; ++i) {\n    add(this, xz[i], yz[i], data[i]);\n  }\n\n  return this;\n}\n},{}],\"YvH0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(x, y) {\n  if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n  var x0 = this._x0,\n      y0 = this._y0,\n      x1 = this._x1,\n      y1 = this._y1; // If the quadtree has no extent, initialize them.\n  // Integer extent are necessary so that if we later double the extent,\n  // the existing quadrant boundaries don’t change due to floating point error!\n\n  if (isNaN(x0)) {\n    x1 = (x0 = Math.floor(x)) + 1;\n    y1 = (y0 = Math.floor(y)) + 1;\n  } // Otherwise, double repeatedly to cover.\n  else {\n      var z = x1 - x0,\n          node = this._root,\n          parent,\n          i;\n\n      while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n        i = (y < y0) << 1 | x < x0;\n        parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n\n        switch (i) {\n          case 0:\n            x1 = x0 + z, y1 = y0 + z;\n            break;\n\n          case 1:\n            x0 = x1 - z, y1 = y0 + z;\n            break;\n\n          case 2:\n            x1 = x0 + z, y0 = y1 - z;\n            break;\n\n          case 3:\n            x0 = x1 - z, y0 = y1 - z;\n            break;\n        }\n      }\n\n      if (this._root && this._root.length) this._root = node;\n    }\n\n  this._x0 = x0;\n  this._y0 = y0;\n  this._x1 = x1;\n  this._y1 = y1;\n  return this;\n}\n},{}],\"uVl3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {\n  var data = [];\n  this.visit(function (node) {\n    if (!node.length) do data.push(node.data); while (node = node.next);\n  });\n  return data;\n}\n},{}],\"wciv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(_) {\n  return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n},{}],\"HTh0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(node, x0, y0, x1, y1) {\n  this.node = node;\n  this.x0 = x0;\n  this.y0 = y0;\n  this.x1 = x1;\n  this.y1 = y1;\n}\n},{}],\"NXzM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _quad = _interopRequireDefault(require(\"./quad.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(x, y, radius) {\n  var data,\n      x0 = this._x0,\n      y0 = this._y0,\n      x1,\n      y1,\n      x2,\n      y2,\n      x3 = this._x1,\n      y3 = this._y1,\n      quads = [],\n      node = this._root,\n      q,\n      i;\n  if (node) quads.push(new _quad.default(node, x0, y0, x3, y3));\n  if (radius == null) radius = Infinity;else {\n    x0 = x - radius, y0 = y - radius;\n    x3 = x + radius, y3 = y + radius;\n    radius *= radius;\n  }\n\n  while (q = quads.pop()) {\n    // Stop searching if this quadrant can’t contain a closer node.\n    if (!(node = q.node) || (x1 = q.x0) > x3 || (y1 = q.y0) > y3 || (x2 = q.x1) < x0 || (y2 = q.y1) < y0) continue; // Bisect the current quadrant.\n\n    if (node.length) {\n      var xm = (x1 + x2) / 2,\n          ym = (y1 + y2) / 2;\n      quads.push(new _quad.default(node[3], xm, ym, x2, y2), new _quad.default(node[2], x1, ym, xm, y2), new _quad.default(node[1], xm, y1, x2, ym), new _quad.default(node[0], x1, y1, xm, ym)); // Visit the closest quadrant first.\n\n      if (i = (y >= ym) << 1 | x >= xm) {\n        q = quads[quads.length - 1];\n        quads[quads.length - 1] = quads[quads.length - 1 - i];\n        quads[quads.length - 1 - i] = q;\n      }\n    } // Visit this point. (Visiting coincident points isn’t necessary!)\n    else {\n        var dx = x - +this._x.call(null, node.data),\n            dy = y - +this._y.call(null, node.data),\n            d2 = dx * dx + dy * dy;\n\n        if (d2 < radius) {\n          var d = Math.sqrt(radius = d2);\n          x0 = x - d, y0 = y - d;\n          x3 = x + d, y3 = y + d;\n          data = node.data;\n        }\n      }\n  }\n\n  return data;\n}\n},{\"./quad.js\":\"HTh0\"}],\"qMQE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.removeAll = removeAll;\n\nfunction _default(d) {\n  if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n  var parent,\n      node = this._root,\n      retainer,\n      previous,\n      next,\n      x0 = this._x0,\n      y0 = this._y0,\n      x1 = this._x1,\n      y1 = this._y1,\n      x,\n      y,\n      xm,\n      ym,\n      right,\n      bottom,\n      i,\n      j; // If the tree is empty, initialize the root as a leaf.\n\n  if (!node) return this; // Find the leaf node for the point.\n  // While descending, also retain the deepest parent with a non-removed sibling.\n\n  if (node.length) while (true) {\n    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;else x1 = xm;\n    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;else y1 = ym;\n    if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n    if (!node.length) break;\n    if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) retainer = parent, j = i;\n  } // Find the point to remove.\n\n  while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n\n  if (next = node.next) delete node.next; // If there are multiple coincident points, remove just the point.\n\n  if (previous) return next ? previous.next = next : delete previous.next, this; // If this is the root point, remove it.\n\n  if (!parent) return this._root = next, this; // Remove this leaf.\n\n  next ? parent[i] = next : delete parent[i]; // If the parent now contains exactly one leaf, collapse superfluous parents.\n\n  if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {\n    if (retainer) retainer[j] = node;else this._root = node;\n  }\n\n  return this;\n}\n\nfunction removeAll(data) {\n  for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n\n  return this;\n}\n},{}],\"f6UW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {\n  return this._root;\n}\n},{}],\"hpwG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {\n  var size = 0;\n  this.visit(function (node) {\n    if (!node.length) do ++size; while (node = node.next);\n  });\n  return size;\n}\n},{}],\"NlIW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _quad = _interopRequireDefault(require(\"./quad.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(callback) {\n  var quads = [],\n      q,\n      node = this._root,\n      child,\n      x0,\n      y0,\n      x1,\n      y1;\n  if (node) quads.push(new _quad.default(node, this._x0, this._y0, this._x1, this._y1));\n\n  while (q = quads.pop()) {\n    if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n      var xm = (x0 + x1) / 2,\n          ym = (y0 + y1) / 2;\n      if (child = node[3]) quads.push(new _quad.default(child, xm, ym, x1, y1));\n      if (child = node[2]) quads.push(new _quad.default(child, x0, ym, xm, y1));\n      if (child = node[1]) quads.push(new _quad.default(child, xm, y0, x1, ym));\n      if (child = node[0]) quads.push(new _quad.default(child, x0, y0, xm, ym));\n    }\n  }\n\n  return this;\n}\n},{\"./quad.js\":\"HTh0\"}],\"mFQa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _quad = _interopRequireDefault(require(\"./quad.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(callback) {\n  var quads = [],\n      next = [],\n      q;\n  if (this._root) quads.push(new _quad.default(this._root, this._x0, this._y0, this._x1, this._y1));\n\n  while (q = quads.pop()) {\n    var node = q.node;\n\n    if (node.length) {\n      var child,\n          x0 = q.x0,\n          y0 = q.y0,\n          x1 = q.x1,\n          y1 = q.y1,\n          xm = (x0 + x1) / 2,\n          ym = (y0 + y1) / 2;\n      if (child = node[0]) quads.push(new _quad.default(child, x0, y0, xm, ym));\n      if (child = node[1]) quads.push(new _quad.default(child, xm, y0, x1, ym));\n      if (child = node[2]) quads.push(new _quad.default(child, x0, ym, xm, y1));\n      if (child = node[3]) quads.push(new _quad.default(child, xm, ym, x1, y1));\n    }\n\n    next.push(q);\n  }\n\n  while (q = next.pop()) {\n    callback(q.node, q.x0, q.y0, q.x1, q.y1);\n  }\n\n  return this;\n}\n},{\"./quad.js\":\"HTh0\"}],\"zEre\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.defaultX = defaultX;\nexports.default = _default;\n\nfunction defaultX(d) {\n  return d[0];\n}\n\nfunction _default(_) {\n  return arguments.length ? (this._x = _, this) : this._x;\n}\n},{}],\"C58w\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.defaultY = defaultY;\nexports.default = _default;\n\nfunction defaultY(d) {\n  return d[1];\n}\n\nfunction _default(_) {\n  return arguments.length ? (this._y = _, this) : this._y;\n}\n},{}],\"e6a1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = quadtree;\n\nvar _add = _interopRequireWildcard(require(\"./add.js\"));\n\nvar _cover = _interopRequireDefault(require(\"./cover.js\"));\n\nvar _data = _interopRequireDefault(require(\"./data.js\"));\n\nvar _extent = _interopRequireDefault(require(\"./extent.js\"));\n\nvar _find = _interopRequireDefault(require(\"./find.js\"));\n\nvar _remove = _interopRequireWildcard(require(\"./remove.js\"));\n\nvar _root = _interopRequireDefault(require(\"./root.js\"));\n\nvar _size = _interopRequireDefault(require(\"./size.js\"));\n\nvar _visit = _interopRequireDefault(require(\"./visit.js\"));\n\nvar _visitAfter = _interopRequireDefault(require(\"./visitAfter.js\"));\n\nvar _x = _interopRequireWildcard(require(\"./x.js\"));\n\nvar _y = _interopRequireWildcard(require(\"./y.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction quadtree(nodes, x, y) {\n  var tree = new Quadtree(x == null ? _x.defaultX : x, y == null ? _y.defaultY : y, NaN, NaN, NaN, NaN);\n  return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n  this._x = x;\n  this._y = y;\n  this._x0 = x0;\n  this._y0 = y0;\n  this._x1 = x1;\n  this._y1 = y1;\n  this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n  var copy = {\n    data: leaf.data\n  },\n      next = copy;\n\n  while (leaf = leaf.next) next = next.next = {\n    data: leaf.data\n  };\n\n  return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function () {\n  var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n      node = this._root,\n      nodes,\n      child;\n  if (!node) return copy;\n  if (!node.length) return copy._root = leaf_copy(node), copy;\n  nodes = [{\n    source: node,\n    target: copy._root = new Array(4)\n  }];\n\n  while (node = nodes.pop()) {\n    for (var i = 0; i < 4; ++i) {\n      if (child = node.source[i]) {\n        if (child.length) nodes.push({\n          source: child,\n          target: node.target[i] = new Array(4)\n        });else node.target[i] = leaf_copy(child);\n      }\n    }\n  }\n\n  return copy;\n};\n\ntreeProto.add = _add.default;\ntreeProto.addAll = _add.addAll;\ntreeProto.cover = _cover.default;\ntreeProto.data = _data.default;\ntreeProto.extent = _extent.default;\ntreeProto.find = _find.default;\ntreeProto.remove = _remove.default;\ntreeProto.removeAll = _remove.removeAll;\ntreeProto.root = _root.default;\ntreeProto.size = _size.default;\ntreeProto.visit = _visit.default;\ntreeProto.visitAfter = _visitAfter.default;\ntreeProto.x = _x.default;\ntreeProto.y = _y.default;\n},{\"./add.js\":\"ALzt\",\"./cover.js\":\"YvH0\",\"./data.js\":\"uVl3\",\"./extent.js\":\"wciv\",\"./find.js\":\"NXzM\",\"./remove.js\":\"qMQE\",\"./root.js\":\"f6UW\",\"./size.js\":\"hpwG\",\"./visit.js\":\"NlIW\",\"./visitAfter.js\":\"mFQa\",\"./x.js\":\"zEre\",\"./y.js\":\"C58w\"}],\"lUbg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"quadtree\", {\n  enumerable: true,\n  get: function () {\n    return _quadtree.default;\n  }\n});\n\nvar _quadtree = _interopRequireDefault(require(\"./quadtree.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./quadtree.js\":\"e6a1\"}],\"Efbf\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {\n  return (Math.random() - 0.5) * 1e-6;\n}\n},{}],\"vmaP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Quadtree = require(\"d3-quadtree\");\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _jiggle = _interopRequireDefault(require(\"./jiggle.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction x(d) {\n  return d.x + d.vx;\n}\n\nfunction y(d) {\n  return d.y + d.vy;\n}\n\nfunction _default(radius) {\n  var nodes,\n      radii,\n      strength = 1,\n      iterations = 1;\n  if (typeof radius !== \"function\") radius = (0, _constant.default)(radius == null ? 1 : +radius);\n\n  function force() {\n    var i,\n        n = nodes.length,\n        tree,\n        node,\n        xi,\n        yi,\n        ri,\n        ri2;\n\n    for (var k = 0; k < iterations; ++k) {\n      tree = (0, _d3Quadtree.quadtree)(nodes, x, y).visitAfter(prepare);\n\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        ri = radii[node.index], ri2 = ri * ri;\n        xi = node.x + node.vx;\n        yi = node.y + node.vy;\n        tree.visit(apply);\n      }\n    }\n\n    function apply(quad, x0, y0, x1, y1) {\n      var data = quad.data,\n          rj = quad.r,\n          r = ri + rj;\n\n      if (data) {\n        if (data.index > node.index) {\n          var x = xi - data.x - data.vx,\n              y = yi - data.y - data.vy,\n              l = x * x + y * y;\n\n          if (l < r * r) {\n            if (x === 0) x = (0, _jiggle.default)(), l += x * x;\n            if (y === 0) y = (0, _jiggle.default)(), l += y * y;\n            l = (r - (l = Math.sqrt(l))) / l * strength;\n            node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));\n            node.vy += (y *= l) * r;\n            data.vx -= x * (r = 1 - r);\n            data.vy -= y * r;\n          }\n        }\n\n        return;\n      }\n\n      return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;\n    }\n  }\n\n  function prepare(quad) {\n    if (quad.data) return quad.r = radii[quad.data.index];\n\n    for (var i = quad.r = 0; i < 4; ++i) {\n      if (quad[i] && quad[i].r > quad.r) {\n        quad.r = quad[i].r;\n      }\n    }\n  }\n\n  function initialize() {\n    if (!nodes) return;\n    var i,\n        n = nodes.length,\n        node;\n    radii = new Array(n);\n\n    for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);\n  }\n\n  force.initialize = function (_) {\n    nodes = _;\n    initialize();\n  };\n\n  force.iterations = function (_) {\n    return arguments.length ? (iterations = +_, force) : iterations;\n  };\n\n  force.strength = function (_) {\n    return arguments.length ? (strength = +_, force) : strength;\n  };\n\n  force.radius = function (_) {\n    return arguments.length ? (radius = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initialize(), force) : radius;\n  };\n\n  return force;\n}\n},{\"d3-quadtree\":\"lUbg\",\"./constant.js\":\"aCvo\",\"./jiggle.js\":\"Efbf\"}],\"zZLJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _jiggle = _interopRequireDefault(require(\"./jiggle.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction index(d) {\n  return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n  var node = nodeById.get(nodeId);\n  if (!node) throw new Error(\"missing: \" + nodeId);\n  return node;\n}\n\nfunction _default(links) {\n  var id = index,\n      strength = defaultStrength,\n      strengths,\n      distance = (0, _constant.default)(30),\n      distances,\n      nodes,\n      count,\n      bias,\n      iterations = 1;\n  if (links == null) links = [];\n\n  function defaultStrength(link) {\n    return 1 / Math.min(count[link.source.index], count[link.target.index]);\n  }\n\n  function force(alpha) {\n    for (var k = 0, n = links.length; k < iterations; ++k) {\n      for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {\n        link = links[i], source = link.source, target = link.target;\n        x = target.x + target.vx - source.x - source.vx || (0, _jiggle.default)();\n        y = target.y + target.vy - source.y - source.vy || (0, _jiggle.default)();\n        l = Math.sqrt(x * x + y * y);\n        l = (l - distances[i]) / l * alpha * strengths[i];\n        x *= l, y *= l;\n        target.vx -= x * (b = bias[i]);\n        target.vy -= y * b;\n        source.vx += x * (b = 1 - b);\n        source.vy += y * b;\n      }\n    }\n  }\n\n  function initialize() {\n    if (!nodes) return;\n    var i,\n        n = nodes.length,\n        m = links.length,\n        nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])),\n        link;\n\n    for (i = 0, count = new Array(n); i < m; ++i) {\n      link = links[i], link.index = i;\n      if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n      if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n      count[link.source.index] = (count[link.source.index] || 0) + 1;\n      count[link.target.index] = (count[link.target.index] || 0) + 1;\n    }\n\n    for (i = 0, bias = new Array(m); i < m; ++i) {\n      link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n    }\n\n    strengths = new Array(m), initializeStrength();\n    distances = new Array(m), initializeDistance();\n  }\n\n  function initializeStrength() {\n    if (!nodes) return;\n\n    for (var i = 0, n = links.length; i < n; ++i) {\n      strengths[i] = +strength(links[i], i, links);\n    }\n  }\n\n  function initializeDistance() {\n    if (!nodes) return;\n\n    for (var i = 0, n = links.length; i < n; ++i) {\n      distances[i] = +distance(links[i], i, links);\n    }\n  }\n\n  force.initialize = function (_) {\n    nodes = _;\n    initialize();\n  };\n\n  force.links = function (_) {\n    return arguments.length ? (links = _, initialize(), force) : links;\n  };\n\n  force.id = function (_) {\n    return arguments.length ? (id = _, force) : id;\n  };\n\n  force.iterations = function (_) {\n    return arguments.length ? (iterations = +_, force) : iterations;\n  };\n\n  force.strength = function (_) {\n    return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initializeStrength(), force) : strength;\n  };\n\n  force.distance = function (_) {\n    return arguments.length ? (distance = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initializeDistance(), force) : distance;\n  };\n\n  return force;\n}\n},{\"./constant.js\":\"aCvo\",\"./jiggle.js\":\"Efbf\"}],\"a3oC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar noop = {\n  value: function () {}\n};\n\nfunction dispatch() {\n  for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n    if (!(t = arguments[i] + \"\") || t in _ || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n    _[t] = [];\n  }\n\n  return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n  this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n  return typenames.trim().split(/^|\\s+/).map(function (t) {\n    var name = \"\",\n        i = t.indexOf(\".\");\n    if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n    if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n    return {\n      type: t,\n      name: name\n    };\n  });\n}\n\nDispatch.prototype = dispatch.prototype = {\n  constructor: Dispatch,\n  on: function (typename, callback) {\n    var _ = this._,\n        T = parseTypenames(typename + \"\", _),\n        t,\n        i = -1,\n        n = T.length; // If no callback was specified, return the callback of the given type and name.\n\n    if (arguments.length < 2) {\n      while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n\n      return;\n    } // If a type was specified, set the callback for the given type and name.\n    // Otherwise, if a null callback was specified, remove callbacks of the given name.\n\n\n    if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n\n    while (++i < n) {\n      if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n    }\n\n    return this;\n  },\n  copy: function () {\n    var copy = {},\n        _ = this._;\n\n    for (var t in _) copy[t] = _[t].slice();\n\n    return new Dispatch(copy);\n  },\n  call: function (type, that) {\n    if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n    if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n\n    for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n  },\n  apply: function (type, that, args) {\n    if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n\n    for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n  }\n};\n\nfunction get(type, name) {\n  for (var i = 0, n = type.length, c; i < n; ++i) {\n    if ((c = type[i]).name === name) {\n      return c.value;\n    }\n  }\n}\n\nfunction set(type, name, callback) {\n  for (var i = 0, n = type.length; i < n; ++i) {\n    if (type[i].name === name) {\n      type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n      break;\n    }\n  }\n\n  if (callback != null) type.push({\n    name: name,\n    value: callback\n  });\n  return type;\n}\n\nvar _default = dispatch;\nexports.default = _default;\n},{}],\"D3zY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"dispatch\", {\n  enumerable: true,\n  get: function () {\n    return _dispatch.default;\n  }\n});\n\nvar _dispatch = _interopRequireDefault(require(\"./dispatch.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./dispatch.js\":\"a3oC\"}],\"ea66\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.now = now;\nexports.Timer = Timer;\nexports.timer = timer;\nexports.timerFlush = timerFlush;\nvar frame = 0,\n    // is an animation frame pending?\ntimeout = 0,\n    // is a timeout pending?\ninterval = 0,\n    // are any timers active?\npokeDelay = 1000,\n    // how frequently we check for clock skew\ntaskHead,\n    taskTail,\n    clockLast = 0,\n    clockNow = 0,\n    clockSkew = 0,\n    clock = typeof performance === \"object\" && performance.now ? performance : Date,\n    setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) {\n  setTimeout(f, 17);\n};\n\nfunction now() {\n  return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n  clockNow = 0;\n}\n\nfunction Timer() {\n  this._call = this._time = this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n  constructor: Timer,\n  restart: function (callback, delay, time) {\n    if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n    time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n\n    if (!this._next && taskTail !== this) {\n      if (taskTail) taskTail._next = this;else taskHead = this;\n      taskTail = this;\n    }\n\n    this._call = callback;\n    this._time = time;\n    sleep();\n  },\n  stop: function () {\n    if (this._call) {\n      this._call = null;\n      this._time = Infinity;\n      sleep();\n    }\n  }\n};\n\nfunction timer(callback, delay, time) {\n  var t = new Timer();\n  t.restart(callback, delay, time);\n  return t;\n}\n\nfunction timerFlush() {\n  now(); // Get the current time, if not already set.\n\n  ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n\n  var t = taskHead,\n      e;\n\n  while (t) {\n    if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n    t = t._next;\n  }\n\n  --frame;\n}\n\nfunction wake() {\n  clockNow = (clockLast = clock.now()) + clockSkew;\n  frame = timeout = 0;\n\n  try {\n    timerFlush();\n  } finally {\n    frame = 0;\n    nap();\n    clockNow = 0;\n  }\n}\n\nfunction poke() {\n  var now = clock.now(),\n      delay = now - clockLast;\n  if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n  var t0,\n      t1 = taskHead,\n      t2,\n      time = Infinity;\n\n  while (t1) {\n    if (t1._call) {\n      if (time > t1._time) time = t1._time;\n      t0 = t1, t1 = t1._next;\n    } else {\n      t2 = t1._next, t1._next = null;\n      t1 = t0 ? t0._next = t2 : taskHead = t2;\n    }\n  }\n\n  taskTail = t0;\n  sleep(time);\n}\n\nfunction sleep(time) {\n  if (frame) return; // Soonest alarm already set, or will be.\n\n  if (timeout) timeout = clearTimeout(timeout);\n  var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n\n  if (delay > 24) {\n    if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n    if (interval) interval = clearInterval(interval);\n  } else {\n    if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n    frame = 1, setFrame(wake);\n  }\n}\n},{}],\"jIZm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _timer = require(\"./timer.js\");\n\nfunction _default(callback, delay, time) {\n  var t = new _timer.Timer();\n  delay = delay == null ? 0 : +delay;\n  t.restart(function (elapsed) {\n    t.stop();\n    callback(elapsed + delay);\n  }, delay, time);\n  return t;\n}\n},{\"./timer.js\":\"ea66\"}],\"QZ3s\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _timer = require(\"./timer.js\");\n\nfunction _default(callback, delay, time) {\n  var t = new _timer.Timer(),\n      total = delay;\n  if (delay == null) return t.restart(callback, delay, time), t;\n  delay = +delay, time = time == null ? (0, _timer.now)() : +time;\n  t.restart(function tick(elapsed) {\n    elapsed += total;\n    t.restart(tick, total += delay, time);\n    callback(elapsed);\n  }, delay, time);\n  return t;\n}\n},{\"./timer.js\":\"ea66\"}],\"rdzS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"now\", {\n  enumerable: true,\n  get: function () {\n    return _timer.now;\n  }\n});\nObject.defineProperty(exports, \"timer\", {\n  enumerable: true,\n  get: function () {\n    return _timer.timer;\n  }\n});\nObject.defineProperty(exports, \"timerFlush\", {\n  enumerable: true,\n  get: function () {\n    return _timer.timerFlush;\n  }\n});\nObject.defineProperty(exports, \"timeout\", {\n  enumerable: true,\n  get: function () {\n    return _timeout.default;\n  }\n});\nObject.defineProperty(exports, \"interval\", {\n  enumerable: true,\n  get: function () {\n    return _interval.default;\n  }\n});\n\nvar _timer = require(\"./timer.js\");\n\nvar _timeout = _interopRequireDefault(require(\"./timeout.js\"));\n\nvar _interval = _interopRequireDefault(require(\"./interval.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./timer.js\":\"ea66\",\"./timeout.js\":\"jIZm\",\"./interval.js\":\"QZ3s\"}],\"Jr7D\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.x = x;\nexports.y = y;\nexports.default = _default;\n\nvar _d3Dispatch = require(\"d3-dispatch\");\n\nvar _d3Timer = require(\"d3-timer\");\n\nfunction x(d) {\n  return d.x;\n}\n\nfunction y(d) {\n  return d.y;\n}\n\nvar initialRadius = 10,\n    initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nfunction _default(nodes) {\n  var simulation,\n      alpha = 1,\n      alphaMin = 0.001,\n      alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n      alphaTarget = 0,\n      velocityDecay = 0.6,\n      forces = new Map(),\n      stepper = (0, _d3Timer.timer)(step),\n      event = (0, _d3Dispatch.dispatch)(\"tick\", \"end\");\n  if (nodes == null) nodes = [];\n\n  function step() {\n    tick();\n    event.call(\"tick\", simulation);\n\n    if (alpha < alphaMin) {\n      stepper.stop();\n      event.call(\"end\", simulation);\n    }\n  }\n\n  function tick(iterations) {\n    var i,\n        n = nodes.length,\n        node;\n    if (iterations === undefined) iterations = 1;\n\n    for (var k = 0; k < iterations; ++k) {\n      alpha += (alphaTarget - alpha) * alphaDecay;\n      forces.forEach(function (force) {\n        force(alpha);\n      });\n\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        if (node.fx == null) node.x += node.vx *= velocityDecay;else node.x = node.fx, node.vx = 0;\n        if (node.fy == null) node.y += node.vy *= velocityDecay;else node.y = node.fy, node.vy = 0;\n      }\n    }\n\n    return simulation;\n  }\n\n  function initializeNodes() {\n    for (var i = 0, n = nodes.length, node; i < n; ++i) {\n      node = nodes[i], node.index = i;\n      if (node.fx != null) node.x = node.fx;\n      if (node.fy != null) node.y = node.fy;\n\n      if (isNaN(node.x) || isNaN(node.y)) {\n        var radius = initialRadius * Math.sqrt(i),\n            angle = i * initialAngle;\n        node.x = radius * Math.cos(angle);\n        node.y = radius * Math.sin(angle);\n      }\n\n      if (isNaN(node.vx) || isNaN(node.vy)) {\n        node.vx = node.vy = 0;\n      }\n    }\n  }\n\n  function initializeForce(force) {\n    if (force.initialize) force.initialize(nodes);\n    return force;\n  }\n\n  initializeNodes();\n  return simulation = {\n    tick: tick,\n    restart: function () {\n      return stepper.restart(step), simulation;\n    },\n    stop: function () {\n      return stepper.stop(), simulation;\n    },\n    nodes: function (_) {\n      return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n    },\n    alpha: function (_) {\n      return arguments.length ? (alpha = +_, simulation) : alpha;\n    },\n    alphaMin: function (_) {\n      return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n    },\n    alphaDecay: function (_) {\n      return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n    },\n    alphaTarget: function (_) {\n      return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n    },\n    velocityDecay: function (_) {\n      return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n    },\n    force: function (name, _) {\n      return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name);\n    },\n    find: function (x, y, radius) {\n      var i = 0,\n          n = nodes.length,\n          dx,\n          dy,\n          d2,\n          node,\n          closest;\n      if (radius == null) radius = Infinity;else radius *= radius;\n\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        dx = x - node.x;\n        dy = y - node.y;\n        d2 = dx * dx + dy * dy;\n        if (d2 < radius) closest = node, radius = d2;\n      }\n\n      return closest;\n    },\n    on: function (name, _) {\n      return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n    }\n  };\n}\n},{\"d3-dispatch\":\"D3zY\",\"d3-timer\":\"rdzS\"}],\"i5c4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Quadtree = require(\"d3-quadtree\");\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nvar _jiggle = _interopRequireDefault(require(\"./jiggle.js\"));\n\nvar _simulation = require(\"./simulation.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var nodes,\n      node,\n      alpha,\n      strength = (0, _constant.default)(-30),\n      strengths,\n      distanceMin2 = 1,\n      distanceMax2 = Infinity,\n      theta2 = 0.81;\n\n  function force(_) {\n    var i,\n        n = nodes.length,\n        tree = (0, _d3Quadtree.quadtree)(nodes, _simulation.x, _simulation.y).visitAfter(accumulate);\n\n    for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n  }\n\n  function initialize() {\n    if (!nodes) return;\n    var i,\n        n = nodes.length,\n        node;\n    strengths = new Array(n);\n\n    for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n  }\n\n  function accumulate(quad) {\n    var strength = 0,\n        q,\n        c,\n        weight = 0,\n        x,\n        y,\n        i; // For internal nodes, accumulate forces from child quadrants.\n\n    if (quad.length) {\n      for (x = y = i = 0; i < 4; ++i) {\n        if ((q = quad[i]) && (c = Math.abs(q.value))) {\n          strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n        }\n      }\n\n      quad.x = x / weight;\n      quad.y = y / weight;\n    } // For leaf nodes, accumulate forces from coincident quadrants.\n    else {\n        q = quad;\n        q.x = q.data.x;\n        q.y = q.data.y;\n\n        do strength += strengths[q.data.index]; while (q = q.next);\n      }\n\n    quad.value = strength;\n  }\n\n  function apply(quad, x1, _, x2) {\n    if (!quad.value) return true;\n    var x = quad.x - node.x,\n        y = quad.y - node.y,\n        w = x2 - x1,\n        l = x * x + y * y; // Apply the Barnes-Hut approximation if possible.\n    // Limit forces for very close nodes; randomize direction if coincident.\n\n    if (w * w / theta2 < l) {\n      if (l < distanceMax2) {\n        if (x === 0) x = (0, _jiggle.default)(), l += x * x;\n        if (y === 0) y = (0, _jiggle.default)(), l += y * y;\n        if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n        node.vx += x * quad.value * alpha / l;\n        node.vy += y * quad.value * alpha / l;\n      }\n\n      return true;\n    } // Otherwise, process points directly.\n    else if (quad.length || l >= distanceMax2) return; // Limit forces for very close nodes; randomize direction if coincident.\n\n\n    if (quad.data !== node || quad.next) {\n      if (x === 0) x = (0, _jiggle.default)(), l += x * x;\n      if (y === 0) y = (0, _jiggle.default)(), l += y * y;\n      if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n    }\n\n    do if (quad.data !== node) {\n      w = strengths[quad.data.index] * alpha / l;\n      node.vx += x * w;\n      node.vy += y * w;\n    } while (quad = quad.next);\n  }\n\n  force.initialize = function (_) {\n    nodes = _;\n    initialize();\n  };\n\n  force.strength = function (_) {\n    return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initialize(), force) : strength;\n  };\n\n  force.distanceMin = function (_) {\n    return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n  };\n\n  force.distanceMax = function (_) {\n    return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n  };\n\n  force.theta = function (_) {\n    return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n  };\n\n  return force;\n}\n},{\"d3-quadtree\":\"lUbg\",\"./constant.js\":\"aCvo\",\"./jiggle.js\":\"Efbf\",\"./simulation.js\":\"Jr7D\"}],\"UAq1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(radius, x, y) {\n  var nodes,\n      strength = (0, _constant.default)(0.1),\n      strengths,\n      radiuses;\n  if (typeof radius !== \"function\") radius = (0, _constant.default)(+radius);\n  if (x == null) x = 0;\n  if (y == null) y = 0;\n\n  function force(alpha) {\n    for (var i = 0, n = nodes.length; i < n; ++i) {\n      var node = nodes[i],\n          dx = node.x - x || 1e-6,\n          dy = node.y - y || 1e-6,\n          r = Math.sqrt(dx * dx + dy * dy),\n          k = (radiuses[i] - r) * strengths[i] * alpha / r;\n      node.vx += dx * k;\n      node.vy += dy * k;\n    }\n  }\n\n  function initialize() {\n    if (!nodes) return;\n    var i,\n        n = nodes.length;\n    strengths = new Array(n);\n    radiuses = new Array(n);\n\n    for (i = 0; i < n; ++i) {\n      radiuses[i] = +radius(nodes[i], i, nodes);\n      strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);\n    }\n  }\n\n  force.initialize = function (_) {\n    nodes = _, initialize();\n  };\n\n  force.strength = function (_) {\n    return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initialize(), force) : strength;\n  };\n\n  force.radius = function (_) {\n    return arguments.length ? (radius = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initialize(), force) : radius;\n  };\n\n  force.x = function (_) {\n    return arguments.length ? (x = +_, force) : x;\n  };\n\n  force.y = function (_) {\n    return arguments.length ? (y = +_, force) : y;\n  };\n\n  return force;\n}\n},{\"./constant.js\":\"aCvo\"}],\"ossL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(x) {\n  var strength = (0, _constant.default)(0.1),\n      nodes,\n      strengths,\n      xz;\n  if (typeof x !== \"function\") x = (0, _constant.default)(x == null ? 0 : +x);\n\n  function force(alpha) {\n    for (var i = 0, n = nodes.length, node; i < n; ++i) {\n      node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n    }\n  }\n\n  function initialize() {\n    if (!nodes) return;\n    var i,\n        n = nodes.length;\n    strengths = new Array(n);\n    xz = new Array(n);\n\n    for (i = 0; i < n; ++i) {\n      strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n    }\n  }\n\n  force.initialize = function (_) {\n    nodes = _;\n    initialize();\n  };\n\n  force.strength = function (_) {\n    return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initialize(), force) : strength;\n  };\n\n  force.x = function (_) {\n    return arguments.length ? (x = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initialize(), force) : x;\n  };\n\n  return force;\n}\n},{\"./constant.js\":\"aCvo\"}],\"GLsE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constant = _interopRequireDefault(require(\"./constant.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(y) {\n  var strength = (0, _constant.default)(0.1),\n      nodes,\n      strengths,\n      yz;\n  if (typeof y !== \"function\") y = (0, _constant.default)(y == null ? 0 : +y);\n\n  function force(alpha) {\n    for (var i = 0, n = nodes.length, node; i < n; ++i) {\n      node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n    }\n  }\n\n  function initialize() {\n    if (!nodes) return;\n    var i,\n        n = nodes.length;\n    strengths = new Array(n);\n    yz = new Array(n);\n\n    for (i = 0; i < n; ++i) {\n      strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n    }\n  }\n\n  force.initialize = function (_) {\n    nodes = _;\n    initialize();\n  };\n\n  force.strength = function (_) {\n    return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initialize(), force) : strength;\n  };\n\n  force.y = function (_) {\n    return arguments.length ? (y = typeof _ === \"function\" ? _ : (0, _constant.default)(+_), initialize(), force) : y;\n  };\n\n  return force;\n}\n},{\"./constant.js\":\"aCvo\"}],\"oYRE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"forceCenter\", {\n  enumerable: true,\n  get: function () {\n    return _center.default;\n  }\n});\nObject.defineProperty(exports, \"forceCollide\", {\n  enumerable: true,\n  get: function () {\n    return _collide.default;\n  }\n});\nObject.defineProperty(exports, \"forceLink\", {\n  enumerable: true,\n  get: function () {\n    return _link.default;\n  }\n});\nObject.defineProperty(exports, \"forceManyBody\", {\n  enumerable: true,\n  get: function () {\n    return _manyBody.default;\n  }\n});\nObject.defineProperty(exports, \"forceRadial\", {\n  enumerable: true,\n  get: function () {\n    return _radial.default;\n  }\n});\nObject.defineProperty(exports, \"forceSimulation\", {\n  enumerable: true,\n  get: function () {\n    return _simulation.default;\n  }\n});\nObject.defineProperty(exports, \"forceX\", {\n  enumerable: true,\n  get: function () {\n    return _x.default;\n  }\n});\nObject.defineProperty(exports, \"forceY\", {\n  enumerable: true,\n  get: function () {\n    return _y.default;\n  }\n});\n\nvar _center = _interopRequireDefault(require(\"./center\"));\n\nvar _collide = _interopRequireDefault(require(\"./collide\"));\n\nvar _link = _interopRequireDefault(require(\"./link\"));\n\nvar _manyBody = _interopRequireDefault(require(\"./manyBody\"));\n\nvar _radial = _interopRequireDefault(require(\"./radial\"));\n\nvar _simulation = _interopRequireDefault(require(\"./simulation\"));\n\nvar _x = _interopRequireDefault(require(\"./x\"));\n\nvar _y = _interopRequireDefault(require(\"./y\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./center\":\"i73m\",\"./collide\":\"vmaP\",\"./link\":\"zZLJ\",\"./manyBody\":\"i5c4\",\"./radial\":\"UAq1\",\"./simulation\":\"Jr7D\",\"./x\":\"ossL\",\"./y\":\"GLsE\"}],\"LX2G\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Force;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Force = require(\"d3-force\");\n\nvar ForceMap = {\n  center: _d3Force.forceCenter,\n  collide: _d3Force.forceCollide,\n  nbody: _d3Force.forceManyBody,\n  link: _d3Force.forceLink,\n  x: _d3Force.forceX,\n  y: _d3Force.forceY\n};\nvar Forces = 'forces',\n    ForceParams = ['alpha', 'alphaMin', 'alphaTarget', 'velocityDecay', 'forces'],\n    ForceConfig = ['static', 'iterations'],\n    ForceOutput = ['x', 'y', 'vx', 'vy'];\n/**\n * Force simulation layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<object>} params.forces - The forces to apply.\n */\n\nfunction Force(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nForce.Definition = {\n  \"type\": \"Force\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"static\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"restart\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"iterations\",\n    \"type\": \"number\",\n    \"default\": 300\n  }, {\n    \"name\": \"alpha\",\n    \"type\": \"number\",\n    \"default\": 1\n  }, {\n    \"name\": \"alphaMin\",\n    \"type\": \"number\",\n    \"default\": 0.001\n  }, {\n    \"name\": \"alphaTarget\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"velocityDecay\",\n    \"type\": \"number\",\n    \"default\": 0.4\n  }, {\n    \"name\": \"forces\",\n    \"type\": \"param\",\n    \"array\": true,\n    \"params\": [{\n      \"key\": {\n        \"force\": \"center\"\n      },\n      \"params\": [{\n        \"name\": \"x\",\n        \"type\": \"number\",\n        \"default\": 0\n      }, {\n        \"name\": \"y\",\n        \"type\": \"number\",\n        \"default\": 0\n      }]\n    }, {\n      \"key\": {\n        \"force\": \"collide\"\n      },\n      \"params\": [{\n        \"name\": \"radius\",\n        \"type\": \"number\",\n        \"expr\": true\n      }, {\n        \"name\": \"strength\",\n        \"type\": \"number\",\n        \"default\": 0.7\n      }, {\n        \"name\": \"iterations\",\n        \"type\": \"number\",\n        \"default\": 1\n      }]\n    }, {\n      \"key\": {\n        \"force\": \"nbody\"\n      },\n      \"params\": [{\n        \"name\": \"strength\",\n        \"type\": \"number\",\n        \"default\": -30\n      }, {\n        \"name\": \"theta\",\n        \"type\": \"number\",\n        \"default\": 0.9\n      }, {\n        \"name\": \"distanceMin\",\n        \"type\": \"number\",\n        \"default\": 1\n      }, {\n        \"name\": \"distanceMax\",\n        \"type\": \"number\"\n      }]\n    }, {\n      \"key\": {\n        \"force\": \"link\"\n      },\n      \"params\": [{\n        \"name\": \"links\",\n        \"type\": \"data\"\n      }, {\n        \"name\": \"id\",\n        \"type\": \"field\"\n      }, {\n        \"name\": \"distance\",\n        \"type\": \"number\",\n        \"default\": 30,\n        \"expr\": true\n      }, {\n        \"name\": \"strength\",\n        \"type\": \"number\",\n        \"expr\": true\n      }, {\n        \"name\": \"iterations\",\n        \"type\": \"number\",\n        \"default\": 1\n      }]\n    }, {\n      \"key\": {\n        \"force\": \"x\"\n      },\n      \"params\": [{\n        \"name\": \"strength\",\n        \"type\": \"number\",\n        \"default\": 0.1\n      }, {\n        \"name\": \"x\",\n        \"type\": \"field\"\n      }]\n    }, {\n      \"key\": {\n        \"force\": \"y\"\n      },\n      \"params\": [{\n        \"name\": \"strength\",\n        \"type\": \"number\",\n        \"default\": 0.1\n      }, {\n        \"name\": \"y\",\n        \"type\": \"field\"\n      }]\n    }]\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"modify\": false,\n    \"default\": ForceOutput\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Force, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var sim = this.value,\n      change = pulse.changed(pulse.ADD_REM),\n      params = _.modified(ForceParams),\n      iters = _.iterations || 300; // configure simulation\n\n\n  if (!sim) {\n    this.value = sim = simulation(pulse.source, _);\n    sim.on('tick', rerun(pulse.dataflow, this));\n\n    if (!_.static) {\n      change = true;\n      sim.tick(); // ensure we run on init\n    }\n\n    pulse.modifies('index');\n  } else {\n    if (change) {\n      pulse.modifies('index');\n      sim.nodes(pulse.source);\n    }\n\n    if (params || pulse.changed(pulse.MOD)) {\n      setup(sim, _, 0, pulse);\n    }\n  } // run simulation\n\n\n  if (params || change || _.modified(ForceConfig) || pulse.changed() && _.restart) {\n    sim.alpha(Math.max(sim.alpha(), _.alpha || 1)).alphaDecay(1 - Math.pow(sim.alphaMin(), 1 / iters));\n\n    if (_.static) {\n      for (sim.stop(); --iters >= 0;) sim.tick();\n    } else {\n      if (sim.stopped()) sim.restart();\n      if (!change) return pulse.StopPropagation; // defer to sim ticks\n    }\n  }\n\n  return this.finish(_, pulse);\n};\n\nprototype.finish = function (_, pulse) {\n  var dataflow = pulse.dataflow; // inspect dependencies, touch link source data\n\n  for (var args = this._argops, j = 0, m = args.length, arg; j < m; ++j) {\n    arg = args[j];\n\n    if (arg.name !== Forces || arg.op._argval.force !== 'link') {\n      continue;\n    }\n\n    for (var ops = arg.op._argops, i = 0, n = ops.length, op; i < n; ++i) {\n      if (ops[i].name === 'links' && (op = ops[i].op.source)) {\n        dataflow.pulse(op, dataflow.changeset().reflow());\n        break;\n      }\n    }\n  } // reflow all nodes\n\n\n  return pulse.reflow(_.modified()).modifies(ForceOutput);\n};\n\nfunction rerun(df, op) {\n  return function () {\n    df.touch(op).run();\n  };\n}\n\nfunction simulation(nodes, _) {\n  var sim = (0, _d3Force.forceSimulation)(nodes),\n      stopped = false,\n      stop = sim.stop,\n      restart = sim.restart;\n\n  sim.stopped = function () {\n    return stopped;\n  };\n\n  sim.restart = function () {\n    stopped = false;\n    return restart();\n  };\n\n  sim.stop = function () {\n    stopped = true;\n    return stop();\n  };\n\n  return setup(sim, _, true).on('end', function () {\n    stopped = true;\n  });\n}\n\nfunction setup(sim, _, init, pulse) {\n  var f = (0, _vegaUtil.array)(_.forces),\n      i,\n      n,\n      p,\n      name;\n\n  for (i = 0, n = ForceParams.length; i < n; ++i) {\n    p = ForceParams[i];\n    if (p !== Forces && _.modified(p)) sim[p](_[p]);\n  }\n\n  for (i = 0, n = f.length; i < n; ++i) {\n    name = Forces + i;\n    p = init || _.modified(Forces, i) ? getForce(f[i]) : pulse && modified(f[i], pulse) ? sim.force(name) : null;\n    if (p) sim.force(name, p);\n  }\n\n  for (n = sim.numForces || 0; i < n; ++i) {\n    sim.force(Forces + i, null); // remove\n  }\n\n  sim.numForces = f.length;\n  return sim;\n}\n\nfunction modified(f, pulse) {\n  var k, v;\n\n  for (k in f) {\n    if ((0, _vegaUtil.isFunction)(v = f[k]) && pulse.modified((0, _vegaUtil.accessorFields)(v))) return 1;\n  }\n\n  return 0;\n}\n\nfunction getForce(_) {\n  var f, p;\n\n  if (!(0, _vegaUtil.hasOwnProperty)(ForceMap, _.force)) {\n    (0, _vegaUtil.error)('Unrecognized force: ' + _.force);\n  }\n\n  f = ForceMap[_.force]();\n\n  for (p in _) {\n    if ((0, _vegaUtil.isFunction)(f[p])) setForceParam(f[p], _[p], _);\n  }\n\n  return f;\n}\n\nfunction setForceParam(f, v, _) {\n  f((0, _vegaUtil.isFunction)(v) ? function (d) {\n    return v(d, _);\n  } : v);\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-force\":\"oYRE\"}],\"HxNv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"force\", {\n  enumerable: true,\n  get: function () {\n    return _Force.default;\n  }\n});\n\nvar _Force = _interopRequireDefault(require(\"./src/Force\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Force\":\"LX2G\"}],\"vgug\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n// Build lookup table mapping tuple keys to tree node instances\nfunction _default(tree, key, filter) {\n  var map = {};\n  tree.each(function (node) {\n    var t = node.data;\n    if (filter(t)) map[key(t)] = node;\n  });\n  tree.lookup = map;\n  return tree;\n}\n},{}],\"JRxK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction defaultSeparation(a, b) {\n  return a.parent === b.parent ? 1 : 2;\n}\n\nfunction meanX(children) {\n  return children.reduce(meanXReduce, 0) / children.length;\n}\n\nfunction meanXReduce(x, c) {\n  return x + c.x;\n}\n\nfunction maxY(children) {\n  return 1 + children.reduce(maxYReduce, 0);\n}\n\nfunction maxYReduce(y, c) {\n  return Math.max(y, c.y);\n}\n\nfunction leafLeft(node) {\n  var children;\n\n  while (children = node.children) node = children[0];\n\n  return node;\n}\n\nfunction leafRight(node) {\n  var children;\n\n  while (children = node.children) node = children[children.length - 1];\n\n  return node;\n}\n\nfunction _default() {\n  var separation = defaultSeparation,\n      dx = 1,\n      dy = 1,\n      nodeSize = false;\n\n  function cluster(root) {\n    var previousNode,\n        x = 0; // First walk, computing the initial x & y values.\n\n    root.eachAfter(function (node) {\n      var children = node.children;\n\n      if (children) {\n        node.x = meanX(children);\n        node.y = maxY(children);\n      } else {\n        node.x = previousNode ? x += separation(node, previousNode) : 0;\n        node.y = 0;\n        previousNode = node;\n      }\n    });\n    var left = leafLeft(root),\n        right = leafRight(root),\n        x0 = left.x - separation(left, right) / 2,\n        x1 = right.x + separation(right, left) / 2; // Second walk, normalizing x & y to the desired size.\n\n    return root.eachAfter(nodeSize ? function (node) {\n      node.x = (node.x - root.x) * dx;\n      node.y = (root.y - node.y) * dy;\n    } : function (node) {\n      node.x = (node.x - x0) / (x1 - x0) * dx;\n      node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n    });\n  }\n\n  cluster.separation = function (x) {\n    return arguments.length ? (separation = x, cluster) : separation;\n  };\n\n  cluster.size = function (x) {\n    return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : nodeSize ? null : [dx, dy];\n  };\n\n  cluster.nodeSize = function (x) {\n    return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : nodeSize ? [dx, dy] : null;\n  };\n\n  return cluster;\n}\n},{}],\"FbP8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction count(node) {\n  var sum = 0,\n      children = node.children,\n      i = children && children.length;\n  if (!i) sum = 1;else while (--i >= 0) sum += children[i].value;\n  node.value = sum;\n}\n\nfunction _default() {\n  return this.eachAfter(count);\n}\n},{}],\"aoO7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(callback) {\n  var node = this,\n      current,\n      next = [node],\n      children,\n      i,\n      n;\n\n  do {\n    current = next.reverse(), next = [];\n\n    while (node = current.pop()) {\n      callback(node), children = node.children;\n      if (children) for (i = 0, n = children.length; i < n; ++i) {\n        next.push(children[i]);\n      }\n    }\n  } while (next.length);\n\n  return this;\n}\n},{}],\"vU7q\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(callback) {\n  var node = this,\n      nodes = [node],\n      children,\n      i;\n\n  while (node = nodes.pop()) {\n    callback(node), children = node.children;\n    if (children) for (i = children.length - 1; i >= 0; --i) {\n      nodes.push(children[i]);\n    }\n  }\n\n  return this;\n}\n},{}],\"bidz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(callback) {\n  var node = this,\n      nodes = [node],\n      next = [],\n      children,\n      i,\n      n;\n\n  while (node = nodes.pop()) {\n    next.push(node), children = node.children;\n    if (children) for (i = 0, n = children.length; i < n; ++i) {\n      nodes.push(children[i]);\n    }\n  }\n\n  while (node = next.pop()) {\n    callback(node);\n  }\n\n  return this;\n}\n},{}],\"tYQG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(value) {\n  return this.eachAfter(function (node) {\n    var sum = +value(node.data) || 0,\n        children = node.children,\n        i = children && children.length;\n\n    while (--i >= 0) sum += children[i].value;\n\n    node.value = sum;\n  });\n}\n},{}],\"l55u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(compare) {\n  return this.eachBefore(function (node) {\n    if (node.children) {\n      node.children.sort(compare);\n    }\n  });\n}\n},{}],\"Rfs8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(end) {\n  var start = this,\n      ancestor = leastCommonAncestor(start, end),\n      nodes = [start];\n\n  while (start !== ancestor) {\n    start = start.parent;\n    nodes.push(start);\n  }\n\n  var k = nodes.length;\n\n  while (end !== ancestor) {\n    nodes.splice(k, 0, end);\n    end = end.parent;\n  }\n\n  return nodes;\n}\n\nfunction leastCommonAncestor(a, b) {\n  if (a === b) return a;\n  var aNodes = a.ancestors(),\n      bNodes = b.ancestors(),\n      c = null;\n  a = aNodes.pop();\n  b = bNodes.pop();\n\n  while (a === b) {\n    c = a;\n    a = aNodes.pop();\n    b = bNodes.pop();\n  }\n\n  return c;\n}\n},{}],\"iENO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {\n  var node = this,\n      nodes = [node];\n\n  while (node = node.parent) {\n    nodes.push(node);\n  }\n\n  return nodes;\n}\n},{}],\"b4YN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {\n  var nodes = [];\n  this.each(function (node) {\n    nodes.push(node);\n  });\n  return nodes;\n}\n},{}],\"A1Sr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {\n  var leaves = [];\n  this.eachBefore(function (node) {\n    if (!node.children) {\n      leaves.push(node);\n    }\n  });\n  return leaves;\n}\n},{}],\"NfF5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default() {\n  var root = this,\n      links = [];\n  root.each(function (node) {\n    if (node !== root) {\n      // Don’t include the root’s parent, if any.\n      links.push({\n        source: node.parent,\n        target: node\n      });\n    }\n  });\n  return links;\n}\n},{}],\"xn1B\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = hierarchy;\nexports.computeHeight = computeHeight;\nexports.Node = Node;\n\nvar _count = _interopRequireDefault(require(\"./count.js\"));\n\nvar _each = _interopRequireDefault(require(\"./each.js\"));\n\nvar _eachBefore = _interopRequireDefault(require(\"./eachBefore.js\"));\n\nvar _eachAfter = _interopRequireDefault(require(\"./eachAfter.js\"));\n\nvar _sum = _interopRequireDefault(require(\"./sum.js\"));\n\nvar _sort = _interopRequireDefault(require(\"./sort.js\"));\n\nvar _path = _interopRequireDefault(require(\"./path.js\"));\n\nvar _ancestors = _interopRequireDefault(require(\"./ancestors.js\"));\n\nvar _descendants = _interopRequireDefault(require(\"./descendants.js\"));\n\nvar _leaves = _interopRequireDefault(require(\"./leaves.js\"));\n\nvar _links = _interopRequireDefault(require(\"./links.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction hierarchy(data, children) {\n  var root = new Node(data),\n      valued = +data.value && (root.value = data.value),\n      node,\n      nodes = [root],\n      child,\n      childs,\n      i,\n      n;\n  if (children == null) children = defaultChildren;\n\n  while (node = nodes.pop()) {\n    if (valued) node.value = +node.data.value;\n\n    if ((childs = children(node.data)) && (n = childs.length)) {\n      node.children = new Array(n);\n\n      for (i = n - 1; i >= 0; --i) {\n        nodes.push(child = node.children[i] = new Node(childs[i]));\n        child.parent = node;\n        child.depth = node.depth + 1;\n      }\n    }\n  }\n\n  return root.eachBefore(computeHeight);\n}\n\nfunction node_copy() {\n  return hierarchy(this).eachBefore(copyData);\n}\n\nfunction defaultChildren(d) {\n  return d.children;\n}\n\nfunction copyData(node) {\n  node.data = node.data.data;\n}\n\nfunction computeHeight(node) {\n  var height = 0;\n\n  do node.height = height; while ((node = node.parent) && node.height < ++height);\n}\n\nfunction Node(data) {\n  this.data = data;\n  this.depth = this.height = 0;\n  this.parent = null;\n}\n\nNode.prototype = hierarchy.prototype = {\n  constructor: Node,\n  count: _count.default,\n  each: _each.default,\n  eachAfter: _eachAfter.default,\n  eachBefore: _eachBefore.default,\n  sum: _sum.default,\n  sort: _sort.default,\n  path: _path.default,\n  ancestors: _ancestors.default,\n  descendants: _descendants.default,\n  leaves: _leaves.default,\n  links: _links.default,\n  copy: node_copy\n};\n},{\"./count.js\":\"FbP8\",\"./each.js\":\"aoO7\",\"./eachBefore.js\":\"vU7q\",\"./eachAfter.js\":\"bidz\",\"./sum.js\":\"tYQG\",\"./sort.js\":\"l55u\",\"./path.js\":\"Rfs8\",\"./ancestors.js\":\"iENO\",\"./descendants.js\":\"b4YN\",\"./leaves.js\":\"A1Sr\",\"./links.js\":\"NfF5\"}],\"aDgv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.shuffle = shuffle;\nexports.slice = void 0;\nvar slice = Array.prototype.slice;\nexports.slice = slice;\n\nfunction shuffle(array) {\n  var m = array.length,\n      t,\n      i;\n\n  while (m) {\n    i = Math.random() * m-- | 0;\n    t = array[m];\n    array[m] = array[i];\n    array[i] = t;\n  }\n\n  return array;\n}\n},{}],\"H7R8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../array.js\");\n\nfunction _default(circles) {\n  var i = 0,\n      n = (circles = (0, _array.shuffle)(_array.slice.call(circles))).length,\n      B = [],\n      p,\n      e;\n\n  while (i < n) {\n    p = circles[i];\n    if (e && enclosesWeak(e, p)) ++i;else e = encloseBasis(B = extendBasis(B, p)), i = 0;\n  }\n\n  return e;\n}\n\nfunction extendBasis(B, p) {\n  var i, j;\n  if (enclosesWeakAll(p, B)) return [p]; // If we get here then B must have at least one element.\n\n  for (i = 0; i < B.length; ++i) {\n    if (enclosesNot(p, B[i]) && enclosesWeakAll(encloseBasis2(B[i], p), B)) {\n      return [B[i], p];\n    }\n  } // If we get here then B must have at least two elements.\n\n\n  for (i = 0; i < B.length - 1; ++i) {\n    for (j = i + 1; j < B.length; ++j) {\n      if (enclosesNot(encloseBasis2(B[i], B[j]), p) && enclosesNot(encloseBasis2(B[i], p), B[j]) && enclosesNot(encloseBasis2(B[j], p), B[i]) && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {\n        return [B[i], B[j], p];\n      }\n    }\n  } // If we get here then something is very wrong.\n\n\n  throw new Error();\n}\n\nfunction enclosesNot(a, b) {\n  var dr = a.r - b.r,\n      dx = b.x - a.x,\n      dy = b.y - a.y;\n  return dr < 0 || dr * dr < dx * dx + dy * dy;\n}\n\nfunction enclosesWeak(a, b) {\n  var dr = a.r - b.r + 1e-6,\n      dx = b.x - a.x,\n      dy = b.y - a.y;\n  return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\n\nfunction enclosesWeakAll(a, B) {\n  for (var i = 0; i < B.length; ++i) {\n    if (!enclosesWeak(a, B[i])) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction encloseBasis(B) {\n  switch (B.length) {\n    case 1:\n      return encloseBasis1(B[0]);\n\n    case 2:\n      return encloseBasis2(B[0], B[1]);\n\n    case 3:\n      return encloseBasis3(B[0], B[1], B[2]);\n  }\n}\n\nfunction encloseBasis1(a) {\n  return {\n    x: a.x,\n    y: a.y,\n    r: a.r\n  };\n}\n\nfunction encloseBasis2(a, b) {\n  var x1 = a.x,\n      y1 = a.y,\n      r1 = a.r,\n      x2 = b.x,\n      y2 = b.y,\n      r2 = b.r,\n      x21 = x2 - x1,\n      y21 = y2 - y1,\n      r21 = r2 - r1,\n      l = Math.sqrt(x21 * x21 + y21 * y21);\n  return {\n    x: (x1 + x2 + x21 / l * r21) / 2,\n    y: (y1 + y2 + y21 / l * r21) / 2,\n    r: (l + r1 + r2) / 2\n  };\n}\n\nfunction encloseBasis3(a, b, c) {\n  var x1 = a.x,\n      y1 = a.y,\n      r1 = a.r,\n      x2 = b.x,\n      y2 = b.y,\n      r2 = b.r,\n      x3 = c.x,\n      y3 = c.y,\n      r3 = c.r,\n      a2 = x1 - x2,\n      a3 = x1 - x3,\n      b2 = y1 - y2,\n      b3 = y1 - y3,\n      c2 = r2 - r1,\n      c3 = r3 - r1,\n      d1 = x1 * x1 + y1 * y1 - r1 * r1,\n      d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,\n      d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,\n      ab = a3 * b2 - a2 * b3,\n      xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,\n      xb = (b3 * c2 - b2 * c3) / ab,\n      ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,\n      yb = (a2 * c3 - a3 * c2) / ab,\n      A = xb * xb + yb * yb - 1,\n      B = 2 * (r1 + xa * xb + ya * yb),\n      C = xa * xa + ya * ya - r1 * r1,\n      r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);\n  return {\n    x: x1 + xa + xb * r,\n    y: y1 + ya + yb * r,\n    r: r\n  };\n}\n},{\"../array.js\":\"aDgv\"}],\"ObEg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.packEnclose = packEnclose;\nexports.default = _default;\n\nvar _enclose = _interopRequireDefault(require(\"./enclose.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction place(b, a, c) {\n  var dx = b.x - a.x,\n      x,\n      a2,\n      dy = b.y - a.y,\n      y,\n      b2,\n      d2 = dx * dx + dy * dy;\n\n  if (d2) {\n    a2 = a.r + c.r, a2 *= a2;\n    b2 = b.r + c.r, b2 *= b2;\n\n    if (a2 > b2) {\n      x = (d2 + b2 - a2) / (2 * d2);\n      y = Math.sqrt(Math.max(0, b2 / d2 - x * x));\n      c.x = b.x - x * dx - y * dy;\n      c.y = b.y - x * dy + y * dx;\n    } else {\n      x = (d2 + a2 - b2) / (2 * d2);\n      y = Math.sqrt(Math.max(0, a2 / d2 - x * x));\n      c.x = a.x + x * dx - y * dy;\n      c.y = a.y + x * dy + y * dx;\n    }\n  } else {\n    c.x = a.x + c.r;\n    c.y = a.y;\n  }\n}\n\nfunction intersects(a, b) {\n  var dr = a.r + b.r - 1e-6,\n      dx = b.x - a.x,\n      dy = b.y - a.y;\n  return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\n\nfunction score(node) {\n  var a = node._,\n      b = node.next._,\n      ab = a.r + b.r,\n      dx = (a.x * b.r + b.x * a.r) / ab,\n      dy = (a.y * b.r + b.y * a.r) / ab;\n  return dx * dx + dy * dy;\n}\n\nfunction Node(circle) {\n  this._ = circle;\n  this.next = null;\n  this.previous = null;\n}\n\nfunction packEnclose(circles) {\n  if (!(n = circles.length)) return 0;\n  var a, b, c, n, aa, ca, i, j, k, sj, sk; // Place the first circle.\n\n  a = circles[0], a.x = 0, a.y = 0;\n  if (!(n > 1)) return a.r; // Place the second circle.\n\n  b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;\n  if (!(n > 2)) return a.r + b.r; // Place the third circle.\n\n  place(b, a, c = circles[2]); // Initialize the front-chain using the first three circles a, b and c.\n\n  a = new Node(a), b = new Node(b), c = new Node(c);\n  a.next = c.previous = b;\n  b.next = a.previous = c;\n  c.next = b.previous = a; // Attempt to place each remaining circle…\n\n  pack: for (i = 3; i < n; ++i) {\n    place(a._, b._, c = circles[i]), c = new Node(c); // Find the closest intersecting circle on the front-chain, if any.\n    // “Closeness” is determined by linear distance along the front-chain.\n    // “Ahead” or “behind” is likewise determined by linear distance.\n\n    j = b.next, k = a.previous, sj = b._.r, sk = a._.r;\n\n    do {\n      if (sj <= sk) {\n        if (intersects(j._, c._)) {\n          b = j, a.next = b, b.previous = a, --i;\n          continue pack;\n        }\n\n        sj += j._.r, j = j.next;\n      } else {\n        if (intersects(k._, c._)) {\n          a = k, a.next = b, b.previous = a, --i;\n          continue pack;\n        }\n\n        sk += k._.r, k = k.previous;\n      }\n    } while (j !== k.next); // Success! Insert the new circle c between a and b.\n\n\n    c.previous = a, c.next = b, a.next = b.previous = b = c; // Compute the new closest circle pair to the centroid.\n\n    aa = score(a);\n\n    while ((c = c.next) !== b) {\n      if ((ca = score(c)) < aa) {\n        a = c, aa = ca;\n      }\n    }\n\n    b = a.next;\n  } // Compute the enclosing circle of the front chain.\n\n\n  a = [b._], c = b;\n\n  while ((c = c.next) !== b) a.push(c._);\n\n  c = (0, _enclose.default)(a); // Translate the circles to put the enclosing circle around the origin.\n\n  for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;\n\n  return c.r;\n}\n\nfunction _default(circles) {\n  packEnclose(circles);\n  return circles;\n}\n},{\"./enclose.js\":\"H7R8\"}],\"kxuB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.optional = optional;\nexports.required = required;\n\nfunction optional(f) {\n  return f == null ? null : required(f);\n}\n\nfunction required(f) {\n  if (typeof f !== \"function\") throw new Error();\n  return f;\n}\n},{}],\"JuqG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.constantZero = constantZero;\nexports.default = _default;\n\nfunction constantZero() {\n  return 0;\n}\n\nfunction _default(x) {\n  return function () {\n    return x;\n  };\n}\n},{}],\"fIYd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _siblings = require(\"./siblings.js\");\n\nvar _accessors = require(\"../accessors.js\");\n\nvar _constant = _interopRequireWildcard(require(\"../constant.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction defaultRadius(d) {\n  return Math.sqrt(d.value);\n}\n\nfunction _default() {\n  var radius = null,\n      dx = 1,\n      dy = 1,\n      padding = _constant.constantZero;\n\n  function pack(root) {\n    root.x = dx / 2, root.y = dy / 2;\n\n    if (radius) {\n      root.eachBefore(radiusLeaf(radius)).eachAfter(packChildren(padding, 0.5)).eachBefore(translateChild(1));\n    } else {\n      root.eachBefore(radiusLeaf(defaultRadius)).eachAfter(packChildren(_constant.constantZero, 1)).eachAfter(packChildren(padding, root.r / Math.min(dx, dy))).eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n    }\n\n    return root;\n  }\n\n  pack.radius = function (x) {\n    return arguments.length ? (radius = (0, _accessors.optional)(x), pack) : radius;\n  };\n\n  pack.size = function (x) {\n    return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];\n  };\n\n  pack.padding = function (x) {\n    return arguments.length ? (padding = typeof x === \"function\" ? x : (0, _constant.default)(+x), pack) : padding;\n  };\n\n  return pack;\n}\n\nfunction radiusLeaf(radius) {\n  return function (node) {\n    if (!node.children) {\n      node.r = Math.max(0, +radius(node) || 0);\n    }\n  };\n}\n\nfunction packChildren(padding, k) {\n  return function (node) {\n    if (children = node.children) {\n      var children,\n          i,\n          n = children.length,\n          r = padding(node) * k || 0,\n          e;\n      if (r) for (i = 0; i < n; ++i) children[i].r += r;\n      e = (0, _siblings.packEnclose)(children);\n      if (r) for (i = 0; i < n; ++i) children[i].r -= r;\n      node.r = e + r;\n    }\n  };\n}\n\nfunction translateChild(k) {\n  return function (node) {\n    var parent = node.parent;\n    node.r *= k;\n\n    if (parent) {\n      node.x = parent.x + k * node.x;\n      node.y = parent.y + k * node.y;\n    }\n  };\n}\n},{\"./siblings.js\":\"ObEg\",\"../accessors.js\":\"kxuB\",\"../constant.js\":\"JuqG\"}],\"kcDz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(node) {\n  node.x0 = Math.round(node.x0);\n  node.y0 = Math.round(node.y0);\n  node.x1 = Math.round(node.x1);\n  node.y1 = Math.round(node.y1);\n}\n},{}],\"Z1AK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(parent, x0, y0, x1, y1) {\n  var nodes = parent.children,\n      node,\n      i = -1,\n      n = nodes.length,\n      k = parent.value && (x1 - x0) / parent.value;\n\n  while (++i < n) {\n    node = nodes[i], node.y0 = y0, node.y1 = y1;\n    node.x0 = x0, node.x1 = x0 += node.value * k;\n  }\n}\n},{}],\"ekbw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _round = _interopRequireDefault(require(\"./treemap/round.js\"));\n\nvar _dice = _interopRequireDefault(require(\"./treemap/dice.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var dx = 1,\n      dy = 1,\n      padding = 0,\n      round = false;\n\n  function partition(root) {\n    var n = root.height + 1;\n    root.x0 = root.y0 = padding;\n    root.x1 = dx;\n    root.y1 = dy / n;\n    root.eachBefore(positionNode(dy, n));\n    if (round) root.eachBefore(_round.default);\n    return root;\n  }\n\n  function positionNode(dy, n) {\n    return function (node) {\n      if (node.children) {\n        (0, _dice.default)(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);\n      }\n\n      var x0 = node.x0,\n          y0 = node.y0,\n          x1 = node.x1 - padding,\n          y1 = node.y1 - padding;\n      if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n      if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n      node.x0 = x0;\n      node.y0 = y0;\n      node.x1 = x1;\n      node.y1 = y1;\n    };\n  }\n\n  partition.round = function (x) {\n    return arguments.length ? (round = !!x, partition) : round;\n  };\n\n  partition.size = function (x) {\n    return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];\n  };\n\n  partition.padding = function (x) {\n    return arguments.length ? (padding = +x, partition) : padding;\n  };\n\n  return partition;\n}\n},{\"./treemap/round.js\":\"kcDz\",\"./treemap/dice.js\":\"Z1AK\"}],\"fM3r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _accessors = require(\"./accessors.js\");\n\nvar _index = require(\"./hierarchy/index.js\");\n\nvar keyPrefix = \"$\",\n    // Protect against keys like “__proto__”.\npreroot = {\n  depth: -1\n},\n    ambiguous = {};\n\nfunction defaultId(d) {\n  return d.id;\n}\n\nfunction defaultParentId(d) {\n  return d.parentId;\n}\n\nfunction _default() {\n  var id = defaultId,\n      parentId = defaultParentId;\n\n  function stratify(data) {\n    var d,\n        i,\n        n = data.length,\n        root,\n        parent,\n        node,\n        nodes = new Array(n),\n        nodeId,\n        nodeKey,\n        nodeByKey = {};\n\n    for (i = 0; i < n; ++i) {\n      d = data[i], node = nodes[i] = new _index.Node(d);\n\n      if ((nodeId = id(d, i, data)) != null && (nodeId += \"\")) {\n        nodeKey = keyPrefix + (node.id = nodeId);\n        nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;\n      }\n    }\n\n    for (i = 0; i < n; ++i) {\n      node = nodes[i], nodeId = parentId(data[i], i, data);\n\n      if (nodeId == null || !(nodeId += \"\")) {\n        if (root) throw new Error(\"multiple roots\");\n        root = node;\n      } else {\n        parent = nodeByKey[keyPrefix + nodeId];\n        if (!parent) throw new Error(\"missing: \" + nodeId);\n        if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n        if (parent.children) parent.children.push(node);else parent.children = [node];\n        node.parent = parent;\n      }\n    }\n\n    if (!root) throw new Error(\"no root\");\n    root.parent = preroot;\n    root.eachBefore(function (node) {\n      node.depth = node.parent.depth + 1;\n      --n;\n    }).eachBefore(_index.computeHeight);\n    root.parent = null;\n    if (n > 0) throw new Error(\"cycle\");\n    return root;\n  }\n\n  stratify.id = function (x) {\n    return arguments.length ? (id = (0, _accessors.required)(x), stratify) : id;\n  };\n\n  stratify.parentId = function (x) {\n    return arguments.length ? (parentId = (0, _accessors.required)(x), stratify) : parentId;\n  };\n\n  return stratify;\n}\n},{\"./accessors.js\":\"kxuB\",\"./hierarchy/index.js\":\"xn1B\"}],\"xQqP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _index = require(\"./hierarchy/index.js\");\n\nfunction defaultSeparation(a, b) {\n  return a.parent === b.parent ? 1 : 2;\n} // function radialSeparation(a, b) {\n//   return (a.parent === b.parent ? 1 : 2) / a.depth;\n// }\n// This function is used to traverse the left contour of a subtree (or\n// subforest). It returns the successor of v on this contour. This successor is\n// either given by the leftmost child of v or by the thread of v. The function\n// returns null if and only if v is on the highest level of its subtree.\n\n\nfunction nextLeft(v) {\n  var children = v.children;\n  return children ? children[0] : v.t;\n} // This function works analogously to nextLeft.\n\n\nfunction nextRight(v) {\n  var children = v.children;\n  return children ? children[children.length - 1] : v.t;\n} // Shifts the current subtree rooted at w+. This is done by increasing\n// prelim(w+) and mod(w+) by shift.\n\n\nfunction moveSubtree(wm, wp, shift) {\n  var change = shift / (wp.i - wm.i);\n  wp.c -= change;\n  wp.s += shift;\n  wm.c += change;\n  wp.z += shift;\n  wp.m += shift;\n} // All other shifts, applied to the smaller subtrees between w- and w+, are\n// performed by this function. To prepare the shifts, we have to adjust\n// change(w+), shift(w+), and change(w-).\n\n\nfunction executeShifts(v) {\n  var shift = 0,\n      change = 0,\n      children = v.children,\n      i = children.length,\n      w;\n\n  while (--i >= 0) {\n    w = children[i];\n    w.z += shift;\n    w.m += shift;\n    shift += w.s + (change += w.c);\n  }\n} // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,\n// returns the specified (default) ancestor.\n\n\nfunction nextAncestor(vim, v, ancestor) {\n  return vim.a.parent === v.parent ? vim.a : ancestor;\n}\n\nfunction TreeNode(node, i) {\n  this._ = node;\n  this.parent = null;\n  this.children = null;\n  this.A = null; // default ancestor\n\n  this.a = this; // ancestor\n\n  this.z = 0; // prelim\n\n  this.m = 0; // mod\n\n  this.c = 0; // change\n\n  this.s = 0; // shift\n\n  this.t = null; // thread\n\n  this.i = i; // number\n}\n\nTreeNode.prototype = Object.create(_index.Node.prototype);\n\nfunction treeRoot(root) {\n  var tree = new TreeNode(root, 0),\n      node,\n      nodes = [tree],\n      child,\n      children,\n      i,\n      n;\n\n  while (node = nodes.pop()) {\n    if (children = node._.children) {\n      node.children = new Array(n = children.length);\n\n      for (i = n - 1; i >= 0; --i) {\n        nodes.push(child = node.children[i] = new TreeNode(children[i], i));\n        child.parent = node;\n      }\n    }\n  }\n\n  (tree.parent = new TreeNode(null, 0)).children = [tree];\n  return tree;\n} // Node-link tree diagram using the Reingold-Tilford \"tidy\" algorithm\n\n\nfunction _default() {\n  var separation = defaultSeparation,\n      dx = 1,\n      dy = 1,\n      nodeSize = null;\n\n  function tree(root) {\n    var t = treeRoot(root); // Compute the layout using Buchheim et al.’s algorithm.\n\n    t.eachAfter(firstWalk), t.parent.m = -t.z;\n    t.eachBefore(secondWalk); // If a fixed node size is specified, scale x and y.\n\n    if (nodeSize) root.eachBefore(sizeNode); // If a fixed tree size is specified, scale x and y based on the extent.\n    // Compute the left-most, right-most, and depth-most nodes for extents.\n    else {\n        var left = root,\n            right = root,\n            bottom = root;\n        root.eachBefore(function (node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var s = left === right ? 1 : separation(left, right) / 2,\n            tx = s - left.x,\n            kx = dx / (right.x + s + tx),\n            ky = dy / (bottom.depth || 1);\n        root.eachBefore(function (node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n    return root;\n  } // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is\n  // applied recursively to the children of v, as well as the function\n  // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the\n  // node v is placed to the midpoint of its outermost children.\n\n\n  function firstWalk(v) {\n    var children = v.children,\n        siblings = v.parent.children,\n        w = v.i ? siblings[v.i - 1] : null;\n\n    if (children) {\n      executeShifts(v);\n      var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n\n      if (w) {\n        v.z = w.z + separation(v._, w._);\n        v.m = v.z - midpoint;\n      } else {\n        v.z = midpoint;\n      }\n    } else if (w) {\n      v.z = w.z + separation(v._, w._);\n    }\n\n    v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n  } // Computes all real x-coordinates by summing up the modifiers recursively.\n\n\n  function secondWalk(v) {\n    v._.x = v.z + v.parent.m;\n    v.m += v.parent.m;\n  } // The core of the algorithm. Here, a new subtree is combined with the\n  // previous subtrees. Threads are used to traverse the inside and outside\n  // contours of the left and right subtree up to the highest common level. The\n  // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the\n  // superscript o means outside and i means inside, the subscript - means left\n  // subtree and + means right subtree. For summing up the modifiers along the\n  // contour, we use respective variables si+, si-, so-, and so+. Whenever two\n  // nodes of the inside contours conflict, we compute the left one of the\n  // greatest uncommon ancestors using the function ANCESTOR and call MOVE\n  // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.\n  // Finally, we add a new thread (if necessary).\n\n\n  function apportion(v, w, ancestor) {\n    if (w) {\n      var vip = v,\n          vop = v,\n          vim = w,\n          vom = vip.parent.children[0],\n          sip = vip.m,\n          sop = vop.m,\n          sim = vim.m,\n          som = vom.m,\n          shift;\n\n      while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n        vom = nextLeft(vom);\n        vop = nextRight(vop);\n        vop.a = v;\n        shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n\n        if (shift > 0) {\n          moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n          sip += shift;\n          sop += shift;\n        }\n\n        sim += vim.m;\n        sip += vip.m;\n        som += vom.m;\n        sop += vop.m;\n      }\n\n      if (vim && !nextRight(vop)) {\n        vop.t = vim;\n        vop.m += sim - sop;\n      }\n\n      if (vip && !nextLeft(vom)) {\n        vom.t = vip;\n        vom.m += sip - som;\n        ancestor = v;\n      }\n    }\n\n    return ancestor;\n  }\n\n  function sizeNode(node) {\n    node.x *= dx;\n    node.y = node.depth * dy;\n  }\n\n  tree.separation = function (x) {\n    return arguments.length ? (separation = x, tree) : separation;\n  };\n\n  tree.size = function (x) {\n    return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : nodeSize ? null : [dx, dy];\n  };\n\n  tree.nodeSize = function (x) {\n    return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : nodeSize ? [dx, dy] : null;\n  };\n\n  return tree;\n}\n},{\"./hierarchy/index.js\":\"xn1B\"}],\"XP76\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(parent, x0, y0, x1, y1) {\n  var nodes = parent.children,\n      node,\n      i = -1,\n      n = nodes.length,\n      k = parent.value && (y1 - y0) / parent.value;\n\n  while (++i < n) {\n    node = nodes[i], node.x0 = x0, node.x1 = x1;\n    node.y0 = y0, node.y1 = y0 += node.value * k;\n  }\n}\n},{}],\"sjir\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.squarifyRatio = squarifyRatio;\nexports.default = exports.phi = void 0;\n\nvar _dice = _interopRequireDefault(require(\"./dice.js\"));\n\nvar _slice = _interopRequireDefault(require(\"./slice.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar phi = (1 + Math.sqrt(5)) / 2;\nexports.phi = phi;\n\nfunction squarifyRatio(ratio, parent, x0, y0, x1, y1) {\n  var rows = [],\n      nodes = parent.children,\n      row,\n      nodeValue,\n      i0 = 0,\n      i1 = 0,\n      n = nodes.length,\n      dx,\n      dy,\n      value = parent.value,\n      sumValue,\n      minValue,\n      maxValue,\n      newRatio,\n      minRatio,\n      alpha,\n      beta;\n\n  while (i0 < n) {\n    dx = x1 - x0, dy = y1 - y0; // Find the next non-empty node.\n\n    do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);\n\n    minValue = maxValue = sumValue;\n    alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\n    beta = sumValue * sumValue * alpha;\n    minRatio = Math.max(maxValue / beta, beta / minValue); // Keep adding nodes while the aspect ratio maintains or improves.\n\n    for (; i1 < n; ++i1) {\n      sumValue += nodeValue = nodes[i1].value;\n      if (nodeValue < minValue) minValue = nodeValue;\n      if (nodeValue > maxValue) maxValue = nodeValue;\n      beta = sumValue * sumValue * alpha;\n      newRatio = Math.max(maxValue / beta, beta / minValue);\n\n      if (newRatio > minRatio) {\n        sumValue -= nodeValue;\n        break;\n      }\n\n      minRatio = newRatio;\n    } // Position and record the row orientation.\n\n\n    rows.push(row = {\n      value: sumValue,\n      dice: dx < dy,\n      children: nodes.slice(i0, i1)\n    });\n    if (row.dice) (0, _dice.default)(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);else (0, _slice.default)(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\n    value -= sumValue, i0 = i1;\n  }\n\n  return rows;\n}\n\nvar _default = function custom(ratio) {\n  function squarify(parent, x0, y0, x1, y1) {\n    squarifyRatio(ratio, parent, x0, y0, x1, y1);\n  }\n\n  squarify.ratio = function (x) {\n    return custom((x = +x) > 1 ? x : 1);\n  };\n\n  return squarify;\n}(phi);\n\nexports.default = _default;\n},{\"./dice.js\":\"Z1AK\",\"./slice.js\":\"XP76\"}],\"dRX5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _round = _interopRequireDefault(require(\"./round.js\"));\n\nvar _squarify = _interopRequireDefault(require(\"./squarify.js\"));\n\nvar _accessors = require(\"../accessors.js\");\n\nvar _constant = _interopRequireWildcard(require(\"../constant.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default() {\n  var tile = _squarify.default,\n      round = false,\n      dx = 1,\n      dy = 1,\n      paddingStack = [0],\n      paddingInner = _constant.constantZero,\n      paddingTop = _constant.constantZero,\n      paddingRight = _constant.constantZero,\n      paddingBottom = _constant.constantZero,\n      paddingLeft = _constant.constantZero;\n\n  function treemap(root) {\n    root.x0 = root.y0 = 0;\n    root.x1 = dx;\n    root.y1 = dy;\n    root.eachBefore(positionNode);\n    paddingStack = [0];\n    if (round) root.eachBefore(_round.default);\n    return root;\n  }\n\n  function positionNode(node) {\n    var p = paddingStack[node.depth],\n        x0 = node.x0 + p,\n        y0 = node.y0 + p,\n        x1 = node.x1 - p,\n        y1 = node.y1 - p;\n    if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n    if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n    node.x0 = x0;\n    node.y0 = y0;\n    node.x1 = x1;\n    node.y1 = y1;\n\n    if (node.children) {\n      p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n      x0 += paddingLeft(node) - p;\n      y0 += paddingTop(node) - p;\n      x1 -= paddingRight(node) - p;\n      y1 -= paddingBottom(node) - p;\n      if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n      if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n      tile(node, x0, y0, x1, y1);\n    }\n  }\n\n  treemap.round = function (x) {\n    return arguments.length ? (round = !!x, treemap) : round;\n  };\n\n  treemap.size = function (x) {\n    return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];\n  };\n\n  treemap.tile = function (x) {\n    return arguments.length ? (tile = (0, _accessors.required)(x), treemap) : tile;\n  };\n\n  treemap.padding = function (x) {\n    return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();\n  };\n\n  treemap.paddingInner = function (x) {\n    return arguments.length ? (paddingInner = typeof x === \"function\" ? x : (0, _constant.default)(+x), treemap) : paddingInner;\n  };\n\n  treemap.paddingOuter = function (x) {\n    return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();\n  };\n\n  treemap.paddingTop = function (x) {\n    return arguments.length ? (paddingTop = typeof x === \"function\" ? x : (0, _constant.default)(+x), treemap) : paddingTop;\n  };\n\n  treemap.paddingRight = function (x) {\n    return arguments.length ? (paddingRight = typeof x === \"function\" ? x : (0, _constant.default)(+x), treemap) : paddingRight;\n  };\n\n  treemap.paddingBottom = function (x) {\n    return arguments.length ? (paddingBottom = typeof x === \"function\" ? x : (0, _constant.default)(+x), treemap) : paddingBottom;\n  };\n\n  treemap.paddingLeft = function (x) {\n    return arguments.length ? (paddingLeft = typeof x === \"function\" ? x : (0, _constant.default)(+x), treemap) : paddingLeft;\n  };\n\n  return treemap;\n}\n},{\"./round.js\":\"kcDz\",\"./squarify.js\":\"sjir\",\"../accessors.js\":\"kxuB\",\"../constant.js\":\"JuqG\"}],\"dNVH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(parent, x0, y0, x1, y1) {\n  var nodes = parent.children,\n      i,\n      n = nodes.length,\n      sum,\n      sums = new Array(n + 1);\n\n  for (sums[0] = sum = i = 0; i < n; ++i) {\n    sums[i + 1] = sum += nodes[i].value;\n  }\n\n  partition(0, n, parent.value, x0, y0, x1, y1);\n\n  function partition(i, j, value, x0, y0, x1, y1) {\n    if (i >= j - 1) {\n      var node = nodes[i];\n      node.x0 = x0, node.y0 = y0;\n      node.x1 = x1, node.y1 = y1;\n      return;\n    }\n\n    var valueOffset = sums[i],\n        valueTarget = value / 2 + valueOffset,\n        k = i + 1,\n        hi = j - 1;\n\n    while (k < hi) {\n      var mid = k + hi >>> 1;\n      if (sums[mid] < valueTarget) k = mid + 1;else hi = mid;\n    }\n\n    if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i + 1 < k) --k;\n    var valueLeft = sums[k] - valueOffset,\n        valueRight = value - valueLeft;\n\n    if (x1 - x0 > y1 - y0) {\n      var xk = (x0 * valueRight + x1 * valueLeft) / value;\n      partition(i, k, valueLeft, x0, y0, xk, y1);\n      partition(k, j, valueRight, xk, y0, x1, y1);\n    } else {\n      var yk = (y0 * valueRight + y1 * valueLeft) / value;\n      partition(i, k, valueLeft, x0, y0, x1, yk);\n      partition(k, j, valueRight, x0, yk, x1, y1);\n    }\n  }\n}\n},{}],\"rOuR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _dice = _interopRequireDefault(require(\"./dice.js\"));\n\nvar _slice = _interopRequireDefault(require(\"./slice.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(parent, x0, y0, x1, y1) {\n  (parent.depth & 1 ? _slice.default : _dice.default)(parent, x0, y0, x1, y1);\n}\n},{\"./dice.js\":\"Z1AK\",\"./slice.js\":\"XP76\"}],\"XhZ5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _dice = _interopRequireDefault(require(\"./dice.js\"));\n\nvar _slice = _interopRequireDefault(require(\"./slice.js\"));\n\nvar _squarify = require(\"./squarify.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _default = function custom(ratio) {\n  function resquarify(parent, x0, y0, x1, y1) {\n    if ((rows = parent._squarify) && rows.ratio === ratio) {\n      var rows,\n          row,\n          nodes,\n          i,\n          j = -1,\n          n,\n          m = rows.length,\n          value = parent.value;\n\n      while (++j < m) {\n        row = rows[j], nodes = row.children;\n\n        for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n\n        if (row.dice) (0, _dice.default)(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);else (0, _slice.default)(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);\n        value -= row.value;\n      }\n    } else {\n      parent._squarify = rows = (0, _squarify.squarifyRatio)(ratio, parent, x0, y0, x1, y1);\n      rows.ratio = ratio;\n    }\n  }\n\n  resquarify.ratio = function (x) {\n    return custom((x = +x) > 1 ? x : 1);\n  };\n\n  return resquarify;\n}(_squarify.phi);\n\nexports.default = _default;\n},{\"./dice.js\":\"Z1AK\",\"./slice.js\":\"XP76\",\"./squarify.js\":\"sjir\"}],\"Kps6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"cluster\", {\n  enumerable: true,\n  get: function () {\n    return _cluster.default;\n  }\n});\nObject.defineProperty(exports, \"hierarchy\", {\n  enumerable: true,\n  get: function () {\n    return _index.default;\n  }\n});\nObject.defineProperty(exports, \"pack\", {\n  enumerable: true,\n  get: function () {\n    return _index2.default;\n  }\n});\nObject.defineProperty(exports, \"packSiblings\", {\n  enumerable: true,\n  get: function () {\n    return _siblings.default;\n  }\n});\nObject.defineProperty(exports, \"packEnclose\", {\n  enumerable: true,\n  get: function () {\n    return _enclose.default;\n  }\n});\nObject.defineProperty(exports, \"partition\", {\n  enumerable: true,\n  get: function () {\n    return _partition.default;\n  }\n});\nObject.defineProperty(exports, \"stratify\", {\n  enumerable: true,\n  get: function () {\n    return _stratify.default;\n  }\n});\nObject.defineProperty(exports, \"tree\", {\n  enumerable: true,\n  get: function () {\n    return _tree.default;\n  }\n});\nObject.defineProperty(exports, \"treemap\", {\n  enumerable: true,\n  get: function () {\n    return _index3.default;\n  }\n});\nObject.defineProperty(exports, \"treemapBinary\", {\n  enumerable: true,\n  get: function () {\n    return _binary.default;\n  }\n});\nObject.defineProperty(exports, \"treemapDice\", {\n  enumerable: true,\n  get: function () {\n    return _dice.default;\n  }\n});\nObject.defineProperty(exports, \"treemapSlice\", {\n  enumerable: true,\n  get: function () {\n    return _slice.default;\n  }\n});\nObject.defineProperty(exports, \"treemapSliceDice\", {\n  enumerable: true,\n  get: function () {\n    return _sliceDice.default;\n  }\n});\nObject.defineProperty(exports, \"treemapSquarify\", {\n  enumerable: true,\n  get: function () {\n    return _squarify.default;\n  }\n});\nObject.defineProperty(exports, \"treemapResquarify\", {\n  enumerable: true,\n  get: function () {\n    return _resquarify.default;\n  }\n});\n\nvar _cluster = _interopRequireDefault(require(\"./cluster.js\"));\n\nvar _index = _interopRequireDefault(require(\"./hierarchy/index.js\"));\n\nvar _index2 = _interopRequireDefault(require(\"./pack/index.js\"));\n\nvar _siblings = _interopRequireDefault(require(\"./pack/siblings.js\"));\n\nvar _enclose = _interopRequireDefault(require(\"./pack/enclose.js\"));\n\nvar _partition = _interopRequireDefault(require(\"./partition.js\"));\n\nvar _stratify = _interopRequireDefault(require(\"./stratify.js\"));\n\nvar _tree = _interopRequireDefault(require(\"./tree.js\"));\n\nvar _index3 = _interopRequireDefault(require(\"./treemap/index.js\"));\n\nvar _binary = _interopRequireDefault(require(\"./treemap/binary.js\"));\n\nvar _dice = _interopRequireDefault(require(\"./treemap/dice.js\"));\n\nvar _slice = _interopRequireDefault(require(\"./treemap/slice.js\"));\n\nvar _sliceDice = _interopRequireDefault(require(\"./treemap/sliceDice.js\"));\n\nvar _squarify = _interopRequireDefault(require(\"./treemap/squarify.js\"));\n\nvar _resquarify = _interopRequireDefault(require(\"./treemap/resquarify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./cluster.js\":\"JRxK\",\"./hierarchy/index.js\":\"xn1B\",\"./pack/index.js\":\"fIYd\",\"./pack/siblings.js\":\"ObEg\",\"./pack/enclose.js\":\"H7R8\",\"./partition.js\":\"ekbw\",\"./stratify.js\":\"fM3r\",\"./tree.js\":\"xQqP\",\"./treemap/index.js\":\"dRX5\",\"./treemap/binary.js\":\"dNVH\",\"./treemap/dice.js\":\"Z1AK\",\"./treemap/slice.js\":\"XP76\",\"./treemap/sliceDice.js\":\"rOuR\",\"./treemap/squarify.js\":\"sjir\",\"./treemap/resquarify.js\":\"XhZ5\"}],\"LdLR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Nest;\n\nvar _lookup = _interopRequireDefault(require(\"./lookup\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Hierarchy = require(\"d3-hierarchy\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Nest tuples into a tree structure, grouped by key values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.keys - The key fields to nest by, in order.\n * @param {boolean} [params.generate=false] - A boolean flag indicating if\n *   non-leaf nodes generated by this transform should be included in the\n *   output. The default (false) includes only the input data (leaf nodes)\n *   in the data stream.\n */\nfunction Nest(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nNest.Definition = {\n  \"type\": \"Nest\",\n  \"metadata\": {\n    \"treesource\": true,\n    \"changes\": true\n  },\n  \"params\": [{\n    \"name\": \"keys\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"generate\",\n    \"type\": \"boolean\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Nest, _vegaDataflow.Transform);\n\nfunction children(n) {\n  return n.values;\n}\n\nprototype.transform = function (_, pulse) {\n  if (!pulse.source) {\n    (0, _vegaUtil.error)('Nest transform requires an upstream data source.');\n  }\n\n  var gen = _.generate,\n      mod = _.modified(),\n      out = pulse.clone(),\n      tree = this.value;\n\n  if (!tree || mod || pulse.changed()) {\n    // collect nodes to remove\n    if (tree) {\n      tree.each(node => {\n        if (node.children && (0, _vegaDataflow.isTuple)(node.data)) {\n          out.rem.push(node.data);\n        }\n      });\n    } // generate new tree structure\n\n\n    this.value = tree = (0, _d3Hierarchy.hierarchy)({\n      values: (0, _vegaUtil.array)(_.keys).reduce((n, k) => {\n        n.key(k);\n        return n;\n      }, nest()).entries(out.source)\n    }, children); // collect nodes to add\n\n    if (gen) {\n      tree.each(node => {\n        if (node.children) {\n          node = (0, _vegaDataflow.ingest)(node.data);\n          out.add.push(node);\n          out.source.push(node);\n        }\n      });\n    } // build lookup table\n\n\n    (0, _lookup.default)(tree, _vegaDataflow.tupleid, _vegaDataflow.tupleid);\n  }\n\n  out.source.root = tree;\n  return out;\n};\n\nfunction nest() {\n  var keys = [],\n      nest;\n\n  function apply(array, depth) {\n    if (depth >= keys.length) {\n      return array;\n    }\n\n    var i = -1,\n        n = array.length,\n        key = keys[depth++],\n        keyValue,\n        value,\n        valuesByKey = {},\n        values,\n        result = {};\n\n    while (++i < n) {\n      keyValue = key(value = array[i]) + '';\n\n      if (values = valuesByKey[keyValue]) {\n        values.push(value);\n      } else {\n        valuesByKey[keyValue] = [value];\n      }\n    }\n\n    for (keyValue in valuesByKey) {\n      result[keyValue] = apply(valuesByKey[keyValue], depth);\n    }\n\n    return result;\n  }\n\n  function entries(map, depth) {\n    if (++depth > keys.length) return map;\n    var array = [],\n        k;\n\n    for (k in map) {\n      array.push({\n        key: k,\n        values: entries(map[k], depth)\n      });\n    }\n\n    return array;\n  }\n\n  return nest = {\n    entries: array => entries(apply(array, 0), 0),\n    key: d => {\n      keys.push(d);\n      return nest;\n    }\n  };\n}\n},{\"./lookup\":\"vgug\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-hierarchy\":\"Kps6\"}],\"PZmU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = HierarchyLayout;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Abstract class for tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */\nfunction HierarchyLayout(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(HierarchyLayout, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (!pulse.source || !pulse.source.root) {\n    (0, _vegaUtil.error)(this.constructor.name + ' transform requires a backing tree data source.');\n  }\n\n  var layout = this.layout(_.method),\n      fields = this.fields,\n      root = pulse.source.root,\n      as = _.as || fields;\n  if (_.field) root.sum(_.field);else root.count();\n  if (_.sort) root.sort((0, _vegaDataflow.stableCompare)(_.sort, d => d.data));\n  setParams(layout, this.params, _);\n\n  if (layout.separation) {\n    layout.separation(_.separation !== false ? defaultSeparation : _vegaUtil.one);\n  }\n\n  try {\n    this.value = layout(root);\n  } catch (err) {\n    (0, _vegaUtil.error)(err);\n  }\n\n  root.each(function (node) {\n    setFields(node, fields, as);\n  });\n  return pulse.reflow(_.modified()).modifies(as).modifies('leaf');\n};\n\nfunction setParams(layout, params, _) {\n  for (var p, i = 0, n = params.length; i < n; ++i) {\n    p = params[i];\n    if (p in _) layout[p](_[p]);\n  }\n}\n\nfunction setFields(node, fields, as) {\n  var t = node.data;\n\n  for (var i = 0, n = fields.length - 1; i < n; ++i) {\n    t[as[i]] = node[fields[i]];\n  }\n\n  t[as[n]] = node.children ? node.children.length : 0;\n}\n\nfunction defaultSeparation(a, b) {\n  return a.parent === b.parent ? 1 : 2;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"gomE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Pack;\n\nvar _HierarchyLayout = _interopRequireDefault(require(\"./HierarchyLayout\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Hierarchy = require(\"d3-hierarchy\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Output = ['x', 'y', 'r', 'depth', 'children'];\n/**\n * Packed circle tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */\n\nfunction Pack(params) {\n  _HierarchyLayout.default.call(this, params);\n}\n\nPack.Definition = {\n  \"type\": \"Pack\",\n  \"metadata\": {\n    \"tree\": true,\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"sort\",\n    \"type\": \"compare\"\n  }, {\n    \"name\": \"padding\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"radius\",\n    \"type\": \"field\",\n    \"default\": null\n  }, {\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": Output.length,\n    \"default\": Output\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Pack, _HierarchyLayout.default);\nprototype.layout = _d3Hierarchy.pack;\nprototype.params = ['radius', 'size', 'padding'];\nprototype.fields = Output;\n},{\"./HierarchyLayout\":\"PZmU\",\"vega-util\":\"d61Z\",\"d3-hierarchy\":\"Kps6\"}],\"ctRG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Partition;\n\nvar _HierarchyLayout = _interopRequireDefault(require(\"./HierarchyLayout\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Hierarchy = require(\"d3-hierarchy\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Output = ['x0', 'y0', 'x1', 'y1', 'depth', 'children'];\n/**\n * Partition tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */\n\nfunction Partition(params) {\n  _HierarchyLayout.default.call(this, params);\n}\n\nPartition.Definition = {\n  \"type\": \"Partition\",\n  \"metadata\": {\n    \"tree\": true,\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"sort\",\n    \"type\": \"compare\"\n  }, {\n    \"name\": \"padding\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"round\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": Output.length,\n    \"default\": Output\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Partition, _HierarchyLayout.default);\nprototype.layout = _d3Hierarchy.partition;\nprototype.params = ['size', 'round', 'padding'];\nprototype.fields = Output;\n},{\"./HierarchyLayout\":\"PZmU\",\"vega-util\":\"d61Z\",\"d3-hierarchy\":\"Kps6\"}],\"Gvho\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Stratify;\n\nvar _lookup = _interopRequireDefault(require(\"./lookup\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Hierarchy = require(\"d3-hierarchy\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Stratify a collection of tuples into a tree structure based on\n * id and parent id fields.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.key - Unique key field for each tuple.\n * @param {function(object): *} params.parentKey - Field with key for parent tuple.\n */\nfunction Stratify(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nStratify.Definition = {\n  \"type\": \"Stratify\",\n  \"metadata\": {\n    \"treesource\": true\n  },\n  \"params\": [{\n    \"name\": \"key\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"parentKey\",\n    \"type\": \"field\",\n    \"required\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Stratify, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (!pulse.source) {\n    (0, _vegaUtil.error)('Stratify transform requires an upstream data source.');\n  }\n\n  var tree = this.value,\n      mod = _.modified(),\n      out = pulse.fork(pulse.ALL).materialize(pulse.SOURCE),\n      run = !this.value || mod || pulse.changed(pulse.ADD_REM) || pulse.modified(_.key.fields) || pulse.modified(_.parentKey.fields); // prevent upstream source pollution\n\n\n  out.source = out.source.slice();\n\n  if (run) {\n    if (out.source.length) {\n      tree = (0, _lookup.default)((0, _d3Hierarchy.stratify)().id(_.key).parentId(_.parentKey)(out.source), _.key, _vegaUtil.truthy);\n    } else {\n      tree = (0, _lookup.default)((0, _d3Hierarchy.stratify)()([{}]), _.key, _.key);\n    }\n  }\n\n  out.source.root = this.value = tree;\n  return out;\n};\n},{\"./lookup\":\"vgug\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-hierarchy\":\"Kps6\"}],\"r0FM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Tree;\n\nvar _HierarchyLayout = _interopRequireDefault(require(\"./HierarchyLayout\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Hierarchy = require(\"d3-hierarchy\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Layouts = {\n  tidy: _d3Hierarchy.tree,\n  cluster: _d3Hierarchy.cluster\n};\nvar Output = ['x', 'y', 'depth', 'children'];\n/**\n * Tree layout. Depending on the method parameter, performs either\n * Reingold-Tilford 'tidy' layout or dendrogram 'cluster' layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */\n\nfunction Tree(params) {\n  _HierarchyLayout.default.call(this, params);\n}\n\nTree.Definition = {\n  \"type\": \"Tree\",\n  \"metadata\": {\n    \"tree\": true,\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"sort\",\n    \"type\": \"compare\"\n  }, {\n    \"name\": \"method\",\n    \"type\": \"enum\",\n    \"default\": \"tidy\",\n    \"values\": [\"tidy\", \"cluster\"]\n  }, {\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"nodeSize\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"separation\",\n    \"type\": \"boolean\",\n    \"default\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": Output.length,\n    \"default\": Output\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Tree, _HierarchyLayout.default);\n/**\n * Tree layout generator. Supports both 'tidy' and 'cluster' layouts.\n */\n\nprototype.layout = function (method) {\n  var m = method || 'tidy';\n  if ((0, _vegaUtil.hasOwnProperty)(Layouts, m)) return Layouts[m]();else (0, _vegaUtil.error)('Unrecognized Tree layout method: ' + m);\n};\n\nprototype.params = ['size', 'nodeSize'];\nprototype.fields = Output;\n},{\"./HierarchyLayout\":\"PZmU\",\"vega-util\":\"d61Z\",\"d3-hierarchy\":\"Kps6\"}],\"Phch\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = TreeLinks;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Generate tuples representing links between tree nodes.\n * The resulting tuples will contain 'source' and 'target' fields,\n * which point to parent and child node tuples, respectively.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */\nfunction TreeLinks(params) {\n  _vegaDataflow.Transform.call(this, [], params);\n}\n\nTreeLinks.Definition = {\n  \"type\": \"TreeLinks\",\n  \"metadata\": {\n    \"tree\": true,\n    \"generates\": true,\n    \"changes\": true\n  },\n  \"params\": []\n};\nvar prototype = (0, _vegaUtil.inherits)(TreeLinks, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var links = this.value,\n      tree = pulse.source && pulse.source.root,\n      out = pulse.fork(pulse.NO_SOURCE),\n      lut = {};\n  if (!tree) (0, _vegaUtil.error)('TreeLinks transform requires a tree data source.');\n\n  if (pulse.changed(pulse.ADD_REM)) {\n    // remove previous links\n    out.rem = links; // build lookup table of valid tuples\n\n    pulse.visit(pulse.SOURCE, function (t) {\n      lut[(0, _vegaDataflow.tupleid)(t)] = 1;\n    }); // generate links for all edges incident on valid tuples\n\n    tree.each(function (node) {\n      var t = node.data,\n          p = node.parent && node.parent.data;\n\n      if (p && lut[(0, _vegaDataflow.tupleid)(t)] && lut[(0, _vegaDataflow.tupleid)(p)]) {\n        out.add.push((0, _vegaDataflow.ingest)({\n          source: p,\n          target: t\n        }));\n      }\n    });\n    this.value = out.add;\n  } else if (pulse.changed(pulse.MOD)) {\n    // build lookup table of modified tuples\n    pulse.visit(pulse.MOD, function (t) {\n      lut[(0, _vegaDataflow.tupleid)(t)] = 1;\n    }); // gather links incident on modified tuples\n\n    links.forEach(function (link) {\n      if (lut[(0, _vegaDataflow.tupleid)(link.source)] || lut[(0, _vegaDataflow.tupleid)(link.target)]) {\n        out.mod.push(link);\n      }\n    });\n  }\n\n  return out;\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"M7xq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Treemap;\n\nvar _HierarchyLayout = _interopRequireDefault(require(\"./HierarchyLayout\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Hierarchy = require(\"d3-hierarchy\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Tiles = {\n  binary: _d3Hierarchy.treemapBinary,\n  dice: _d3Hierarchy.treemapDice,\n  slice: _d3Hierarchy.treemapSlice,\n  slicedice: _d3Hierarchy.treemapSliceDice,\n  squarify: _d3Hierarchy.treemapSquarify,\n  resquarify: _d3Hierarchy.treemapResquarify\n};\nvar Output = ['x0', 'y0', 'x1', 'y1', 'depth', 'children'];\n/**\n * Treemap layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */\n\nfunction Treemap(params) {\n  _HierarchyLayout.default.call(this, params);\n}\n\nTreemap.Definition = {\n  \"type\": \"Treemap\",\n  \"metadata\": {\n    \"tree\": true,\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"field\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"sort\",\n    \"type\": \"compare\"\n  }, {\n    \"name\": \"method\",\n    \"type\": \"enum\",\n    \"default\": \"squarify\",\n    \"values\": [\"squarify\", \"resquarify\", \"binary\", \"dice\", \"slice\", \"slicedice\"]\n  }, {\n    \"name\": \"padding\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"paddingInner\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"paddingOuter\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"paddingTop\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"paddingRight\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"paddingBottom\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"paddingLeft\",\n    \"type\": \"number\",\n    \"default\": 0\n  }, {\n    \"name\": \"ratio\",\n    \"type\": \"number\",\n    \"default\": 1.618033988749895\n  }, {\n    \"name\": \"round\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": Output.length,\n    \"default\": Output\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Treemap, _HierarchyLayout.default);\n/**\n * Treemap layout generator. Adds 'method' and 'ratio' parameters\n * to configure the underlying tile method.\n */\n\nprototype.layout = function () {\n  var x = (0, _d3Hierarchy.treemap)();\n\n  x.ratio = function (_) {\n    var t = x.tile();\n    if (t.ratio) x.tile(t.ratio(_));\n  };\n\n  x.method = function (_) {\n    if ((0, _vegaUtil.hasOwnProperty)(Tiles, _)) x.tile(Tiles[_]);else (0, _vegaUtil.error)('Unrecognized Treemap layout method: ' + _);\n  };\n\n  return x;\n};\n\nprototype.params = ['method', 'ratio', 'size', 'round', 'padding', 'paddingInner', 'paddingOuter', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'];\nprototype.fields = Output;\n},{\"./HierarchyLayout\":\"PZmU\",\"vega-util\":\"d61Z\",\"d3-hierarchy\":\"Kps6\"}],\"FSAY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"nest\", {\n  enumerable: true,\n  get: function () {\n    return _Nest.default;\n  }\n});\nObject.defineProperty(exports, \"pack\", {\n  enumerable: true,\n  get: function () {\n    return _Pack.default;\n  }\n});\nObject.defineProperty(exports, \"partition\", {\n  enumerable: true,\n  get: function () {\n    return _Partition.default;\n  }\n});\nObject.defineProperty(exports, \"stratify\", {\n  enumerable: true,\n  get: function () {\n    return _Stratify.default;\n  }\n});\nObject.defineProperty(exports, \"tree\", {\n  enumerable: true,\n  get: function () {\n    return _Tree.default;\n  }\n});\nObject.defineProperty(exports, \"treelinks\", {\n  enumerable: true,\n  get: function () {\n    return _TreeLinks.default;\n  }\n});\nObject.defineProperty(exports, \"treemap\", {\n  enumerable: true,\n  get: function () {\n    return _Treemap.default;\n  }\n});\n\nvar _Nest = _interopRequireDefault(require(\"./src/Nest\"));\n\nvar _Pack = _interopRequireDefault(require(\"./src/Pack\"));\n\nvar _Partition = _interopRequireDefault(require(\"./src/Partition\"));\n\nvar _Stratify = _interopRequireDefault(require(\"./src/Stratify\"));\n\nvar _Tree = _interopRequireDefault(require(\"./src/Tree\"));\n\nvar _TreeLinks = _interopRequireDefault(require(\"./src/TreeLinks\"));\n\nvar _Treemap = _interopRequireDefault(require(\"./src/Treemap\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Nest\":\"LdLR\",\"./src/Pack\":\"gomE\",\"./src/Partition\":\"ctRG\",\"./src/Stratify\":\"Gvho\",\"./src/Tree\":\"r0FM\",\"./src/TreeLinks\":\"Phch\",\"./src/Treemap\":\"M7xq\"}],\"uUg0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(data, groupby) {\n  var groups = [],\n      get = function (f) {\n    return f(t);\n  },\n      map,\n      i,\n      n,\n      t,\n      k,\n      g; // partition data points into stack groups\n\n\n  if (groupby == null) {\n    groups.push(data);\n  } else {\n    for (map = {}, i = 0, n = data.length; i < n; ++i) {\n      t = data[i];\n      k = groupby.map(get);\n      g = map[k];\n\n      if (!g) {\n        map[k] = g = [];\n        g.dims = k;\n        groups.push(g);\n      }\n\n      g.push(t);\n    }\n  }\n\n  return groups;\n}\n},{}],\"XMaH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Loess;\n\nvar _partition = _interopRequireDefault(require(\"./partition\"));\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Compute locally-weighted regression fits for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.x - An accessor for the predictor data field.\n * @param {function(object): *} params.y - An accessor for the predicted data field.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {number} [params.bandwidth=0.3] - The loess bandwidth.\n */\nfunction Loess(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nLoess.Definition = {\n  \"type\": \"Loess\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"x\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"y\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"bandwidth\",\n    \"type\": \"number\",\n    \"default\": 0.3\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Loess, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n\n  if (!this.value || pulse.changed() || _.modified()) {\n    const source = pulse.materialize(pulse.SOURCE).source,\n          groups = (0, _partition.default)(source, _.groupby),\n          names = (_.groupby || []).map(_vegaUtil.accessorName),\n          m = names.length,\n          as = _.as || [(0, _vegaUtil.accessorName)(_.x), (0, _vegaUtil.accessorName)(_.y)],\n          values = [];\n    groups.forEach(g => {\n      (0, _vegaStatistics.regressionLoess)(g, _.x, _.y, _.bandwidth || 0.3).forEach(p => {\n        const t = {};\n\n        for (let i = 0; i < m; ++i) {\n          t[names[i]] = g.dims[i];\n        }\n\n        t[as[0]] = p[0];\n        t[as[1]] = p[1];\n        values.push((0, _vegaDataflow.ingest)(t));\n      });\n    });\n    if (this.value) out.rem = this.value;\n    this.value = out.add = out.source = values;\n  }\n\n  return out;\n};\n},{\"./partition\":\"uUg0\",\"vega-statistics\":\"Cvi0\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"q7R7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Regression;\n\nvar _partition = _interopRequireDefault(require(\"./partition\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst Methods = {\n  linear: _vegaStatistics.regressionLinear,\n  log: _vegaStatistics.regressionLog,\n  exp: _vegaStatistics.regressionExp,\n  pow: _vegaStatistics.regressionPow,\n  quad: _vegaStatistics.regressionQuad,\n  poly: _vegaStatistics.regressionPoly\n};\n\nfunction degreesOfFreedom(method, order) {\n  return method === 'poly' ? order : method === 'quad' ? 2 : 1;\n}\n/**\n * Compute regression fits for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.x - An accessor for the predictor data field.\n * @param {function(object): *} params.y - An accessor for the predicted data field.\n * @param {string} [params.method='linear'] - The regression method to apply.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {Array<number>} [params.extent] - The domain extent over which to plot the regression line.\n * @param {number} [params.order=3] - The polynomial order. Only applies to the 'poly' method.\n */\n\n\nfunction Regression(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nRegression.Definition = {\n  \"type\": \"Regression\",\n  \"metadata\": {\n    \"generates\": true\n  },\n  \"params\": [{\n    \"name\": \"x\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"y\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"groupby\",\n    \"type\": \"field\",\n    \"array\": true\n  }, {\n    \"name\": \"method\",\n    \"type\": \"string\",\n    \"default\": \"linear\",\n    \"values\": Object.keys(Methods)\n  }, {\n    \"name\": \"order\",\n    \"type\": \"number\",\n    \"default\": 3\n  }, {\n    \"name\": \"extent\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"params\",\n    \"type\": \"boolean\",\n    \"default\": false\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Regression, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n\n  if (!this.value || pulse.changed() || _.modified()) {\n    const source = pulse.materialize(pulse.SOURCE).source,\n          groups = (0, _partition.default)(source, _.groupby),\n          names = (_.groupby || []).map(_vegaUtil.accessorName),\n          method = _.method || 'linear',\n          order = _.order || 3,\n          dof = degreesOfFreedom(method, order),\n          as = _.as || [(0, _vegaUtil.accessorName)(_.x), (0, _vegaUtil.accessorName)(_.y)],\n          fit = Methods[method],\n          values = [];\n    let domain = _.extent;\n\n    if (!(0, _vegaUtil.hasOwnProperty)(Methods, method)) {\n      (0, _vegaUtil.error)('Invalid regression method: ' + method);\n    }\n\n    if (domain != null) {\n      if (method === 'log' && domain[0] <= 0) {\n        pulse.dataflow.warn('Ignoring extent with values <= 0 for log regression.');\n        domain = null;\n      }\n    }\n\n    groups.forEach(g => {\n      const n = g.length;\n\n      if (n <= dof) {\n        pulse.dataflow.warn('Skipping regression with more parameters than data points.');\n        return;\n      }\n\n      const model = fit(g, _.x, _.y, order);\n\n      if (_.params) {\n        // if parameter vectors requested return those\n        values.push((0, _vegaDataflow.ingest)({\n          keys: g.dims,\n          coef: model.coef,\n          rSquared: model.rSquared\n        }));\n        return;\n      }\n\n      const dom = domain || (0, _vegaUtil.extent)(g, _.x),\n            add = p => {\n        const t = {};\n\n        for (let i = 0; i < names.length; ++i) {\n          t[names[i]] = g.dims[i];\n        }\n\n        t[as[0]] = p[0];\n        t[as[1]] = p[1];\n        values.push((0, _vegaDataflow.ingest)(t));\n      };\n\n      if (method === 'linear') {\n        // for linear regression we only need the end points\n        dom.forEach(x => add([x, model.predict(x)]));\n      } else {\n        // otherwise return trend line sample points\n        (0, _vegaStatistics.sampleCurve)(model.predict, dom, 25, 200).forEach(add);\n      }\n    });\n    if (this.value) out.rem = this.value;\n    this.value = out.add = out.source = values;\n  }\n\n  return out;\n};\n},{\"./partition\":\"uUg0\",\"vega-dataflow\":\"luN0\",\"vega-statistics\":\"Cvi0\",\"vega-util\":\"d61Z\"}],\"c6kG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"loess\", {\n  enumerable: true,\n  get: function () {\n    return _Loess.default;\n  }\n});\nObject.defineProperty(exports, \"regression\", {\n  enumerable: true,\n  get: function () {\n    return _Regression.default;\n  }\n});\n\nvar _Loess = _interopRequireDefault(require(\"./src/Loess\"));\n\nvar _Regression = _interopRequireDefault(require(\"./src/Regression\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Loess\":\"XMaH\",\"./src/Regression\":\"q7R7\"}],\"GBJ0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nconst EPSILON = Math.pow(2, -52);\nconst EDGE_STACK = new Uint32Array(512);\n\nclass Delaunator {\n  static from(points, getX = defaultGetX, getY = defaultGetY) {\n    const n = points.length;\n    const coords = new Float64Array(n * 2);\n\n    for (let i = 0; i < n; i++) {\n      const p = points[i];\n      coords[2 * i] = getX(p);\n      coords[2 * i + 1] = getY(p);\n    }\n\n    return new Delaunator(coords);\n  }\n\n  constructor(coords) {\n    const n = coords.length >> 1;\n    if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.');\n    this.coords = coords; // arrays that will store the triangulation graph\n\n    const maxTriangles = Math.max(2 * n - 5, 0);\n    this._triangles = new Uint32Array(maxTriangles * 3);\n    this._halfedges = new Int32Array(maxTriangles * 3); // temporary arrays for tracking the edges of the advancing convex hull\n\n    this._hashSize = Math.ceil(Math.sqrt(n));\n    this._hullPrev = new Uint32Array(n); // edge to prev edge\n\n    this._hullNext = new Uint32Array(n); // edge to next edge\n\n    this._hullTri = new Uint32Array(n); // edge to adjacent triangle\n\n    this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash\n    // temporary arrays for sorting points\n\n    this._ids = new Uint32Array(n);\n    this._dists = new Float64Array(n);\n    this.update();\n  }\n\n  update() {\n    const {\n      coords,\n      _hullPrev: hullPrev,\n      _hullNext: hullNext,\n      _hullTri: hullTri,\n      _hullHash: hullHash\n    } = this;\n    const n = coords.length >> 1; // populate an array of point indices; calculate input data bbox\n\n    let minX = Infinity;\n    let minY = Infinity;\n    let maxX = -Infinity;\n    let maxY = -Infinity;\n\n    for (let i = 0; i < n; i++) {\n      const x = coords[2 * i];\n      const y = coords[2 * i + 1];\n      if (x < minX) minX = x;\n      if (y < minY) minY = y;\n      if (x > maxX) maxX = x;\n      if (y > maxY) maxY = y;\n      this._ids[i] = i;\n    }\n\n    const cx = (minX + maxX) / 2;\n    const cy = (minY + maxY) / 2;\n    let minDist = Infinity;\n    let i0, i1, i2; // pick a seed point close to the center\n\n    for (let i = 0; i < n; i++) {\n      const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);\n\n      if (d < minDist) {\n        i0 = i;\n        minDist = d;\n      }\n    }\n\n    const i0x = coords[2 * i0];\n    const i0y = coords[2 * i0 + 1];\n    minDist = Infinity; // find the point closest to the seed\n\n    for (let i = 0; i < n; i++) {\n      if (i === i0) continue;\n      const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);\n\n      if (d < minDist && d > 0) {\n        i1 = i;\n        minDist = d;\n      }\n    }\n\n    let i1x = coords[2 * i1];\n    let i1y = coords[2 * i1 + 1];\n    let minRadius = Infinity; // find the third point which forms the smallest circumcircle with the first two\n\n    for (let i = 0; i < n; i++) {\n      if (i === i0 || i === i1) continue;\n      const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);\n\n      if (r < minRadius) {\n        i2 = i;\n        minRadius = r;\n      }\n    }\n\n    let i2x = coords[2 * i2];\n    let i2y = coords[2 * i2 + 1];\n\n    if (minRadius === Infinity) {\n      // order collinear points by dx (or dy if all x are identical)\n      // and return the list as a hull\n      for (let i = 0; i < n; i++) {\n        this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];\n      }\n\n      quicksort(this._ids, this._dists, 0, n - 1);\n      const hull = new Uint32Array(n);\n      let j = 0;\n\n      for (let i = 0, d0 = -Infinity; i < n; i++) {\n        const id = this._ids[i];\n\n        if (this._dists[id] > d0) {\n          hull[j++] = id;\n          d0 = this._dists[id];\n        }\n      }\n\n      this.hull = hull.subarray(0, j);\n      this.triangles = new Uint32Array(0);\n      this.halfedges = new Uint32Array(0);\n      return;\n    } // swap the order of the seed points for counter-clockwise orientation\n\n\n    if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) {\n      const i = i1;\n      const x = i1x;\n      const y = i1y;\n      i1 = i2;\n      i1x = i2x;\n      i1y = i2y;\n      i2 = i;\n      i2x = x;\n      i2y = y;\n    }\n\n    const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n    this._cx = center.x;\n    this._cy = center.y;\n\n    for (let i = 0; i < n; i++) {\n      this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);\n    } // sort the points by distance from the seed triangle circumcenter\n\n\n    quicksort(this._ids, this._dists, 0, n - 1); // set up the seed triangle as the starting hull\n\n    this._hullStart = i0;\n    let hullSize = 3;\n    hullNext[i0] = hullPrev[i2] = i1;\n    hullNext[i1] = hullPrev[i0] = i2;\n    hullNext[i2] = hullPrev[i1] = i0;\n    hullTri[i0] = 0;\n    hullTri[i1] = 1;\n    hullTri[i2] = 2;\n    hullHash.fill(-1);\n    hullHash[this._hashKey(i0x, i0y)] = i0;\n    hullHash[this._hashKey(i1x, i1y)] = i1;\n    hullHash[this._hashKey(i2x, i2y)] = i2;\n    this.trianglesLen = 0;\n\n    this._addTriangle(i0, i1, i2, -1, -1, -1);\n\n    for (let k = 0, xp, yp; k < this._ids.length; k++) {\n      const i = this._ids[k];\n      const x = coords[2 * i];\n      const y = coords[2 * i + 1]; // skip near-duplicate points\n\n      if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue;\n      xp = x;\n      yp = y; // skip seed triangle points\n\n      if (i === i0 || i === i1 || i === i2) continue; // find a visible edge on the convex hull using edge hash\n\n      let start = 0;\n\n      for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) {\n        start = hullHash[(key + j) % this._hashSize];\n        if (start !== -1 && start !== hullNext[start]) break;\n      }\n\n      start = hullPrev[start];\n      let e = start,\n          q;\n\n      while (q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) {\n        e = q;\n\n        if (e === start) {\n          e = -1;\n          break;\n        }\n      }\n\n      if (e === -1) continue; // likely a near-duplicate point; skip it\n      // add the first triangle from the point\n\n      let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]); // recursively flip triangles from the point until they satisfy the Delaunay condition\n\n\n      hullTri[i] = this._legalize(t + 2);\n      hullTri[e] = t; // keep track of boundary triangles on the hull\n\n      hullSize++; // walk forward through the hull, adding more triangles and flipping recursively\n\n      let n = hullNext[e];\n\n      while (q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])) {\n        t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]);\n        hullTri[i] = this._legalize(t + 2);\n        hullNext[n] = n; // mark as removed\n\n        hullSize--;\n        n = q;\n      } // walk backward from the other side, adding more triangles and flipping\n\n\n      if (e === start) {\n        while (q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) {\n          t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n\n          this._legalize(t + 2);\n\n          hullTri[q] = t;\n          hullNext[e] = e; // mark as removed\n\n          hullSize--;\n          e = q;\n        }\n      } // update the hull indices\n\n\n      this._hullStart = hullPrev[i] = e;\n      hullNext[e] = hullPrev[n] = i;\n      hullNext[i] = n; // save the two new edges in the hash table\n\n      hullHash[this._hashKey(x, y)] = i;\n      hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n    }\n\n    this.hull = new Uint32Array(hullSize);\n\n    for (let i = 0, e = this._hullStart; i < hullSize; i++) {\n      this.hull[i] = e;\n      e = hullNext[e];\n    } // trim typed triangle mesh arrays\n\n\n    this.triangles = this._triangles.subarray(0, this.trianglesLen);\n    this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n  }\n\n  _hashKey(x, y) {\n    return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize;\n  }\n\n  _legalize(a) {\n    const {\n      _triangles: triangles,\n      _halfedges: halfedges,\n      coords\n    } = this;\n    let i = 0;\n    let ar = 0; // recursion eliminated with a fixed-size stack\n\n    while (true) {\n      const b = halfedges[a];\n      /* if the pair of triangles doesn't satisfy the Delaunay condition\n       * (p1 is inside the circumcircle of [p0, pl, pr]), flip them,\n       * then do the same check/flip recursively for the new pair of triangles\n       *\n       *           pl                    pl\n       *          /||\\                  /  \\\n       *       al/ || \\bl            al/    \\a\n       *        /  ||  \\              /      \\\n       *       /  a||b  \\    flip    /___ar___\\\n       *     p0\\   ||   /p1   =>   p0\\---bl---/p1\n       *        \\  ||  /              \\      /\n       *       ar\\ || /br             b\\    /br\n       *          \\||/                  \\  /\n       *           pr                    pr\n       */\n\n      const a0 = a - a % 3;\n      ar = a0 + (a + 2) % 3;\n\n      if (b === -1) {\n        // convex hull edge\n        if (i === 0) break;\n        a = EDGE_STACK[--i];\n        continue;\n      }\n\n      const b0 = b - b % 3;\n      const al = a0 + (a + 1) % 3;\n      const bl = b0 + (b + 2) % 3;\n      const p0 = triangles[ar];\n      const pr = triangles[a];\n      const pl = triangles[al];\n      const p1 = triangles[bl];\n      const illegal = inCircle(coords[2 * p0], coords[2 * p0 + 1], coords[2 * pr], coords[2 * pr + 1], coords[2 * pl], coords[2 * pl + 1], coords[2 * p1], coords[2 * p1 + 1]);\n\n      if (illegal) {\n        triangles[a] = p1;\n        triangles[b] = p0;\n        const hbl = halfedges[bl]; // edge swapped on the other side of the hull (rare); fix the halfedge reference\n\n        if (hbl === -1) {\n          let e = this._hullStart;\n\n          do {\n            if (this._hullTri[e] === bl) {\n              this._hullTri[e] = a;\n              break;\n            }\n\n            e = this._hullPrev[e];\n          } while (e !== this._hullStart);\n        }\n\n        this._link(a, hbl);\n\n        this._link(b, halfedges[ar]);\n\n        this._link(ar, bl);\n\n        const br = b0 + (b + 1) % 3; // don't worry about hitting the cap: it can only happen on extremely degenerate input\n\n        if (i < EDGE_STACK.length) {\n          EDGE_STACK[i++] = br;\n        }\n      } else {\n        if (i === 0) break;\n        a = EDGE_STACK[--i];\n      }\n    }\n\n    return ar;\n  }\n\n  _link(a, b) {\n    this._halfedges[a] = b;\n    if (b !== -1) this._halfedges[b] = a;\n  } // add a new triangle given vertex indices and adjacent half-edge ids\n\n\n  _addTriangle(i0, i1, i2, a, b, c) {\n    const t = this.trianglesLen;\n    this._triangles[t] = i0;\n    this._triangles[t + 1] = i1;\n    this._triangles[t + 2] = i2;\n\n    this._link(t, a);\n\n    this._link(t + 1, b);\n\n    this._link(t + 2, c);\n\n    this.trianglesLen += 3;\n    return t;\n  }\n\n} // monotonically increases with real angle, but doesn't need expensive trigonometry\n\n\nexports.default = Delaunator;\n\nfunction pseudoAngle(dx, dy) {\n  const p = dx / (Math.abs(dx) + Math.abs(dy));\n  return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1]\n}\n\nfunction dist(ax, ay, bx, by) {\n  const dx = ax - bx;\n  const dy = ay - by;\n  return dx * dx + dy * dy;\n} // return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check\n\n\nfunction orientIfSure(px, py, rx, ry, qx, qy) {\n  const l = (ry - py) * (qx - px);\n  const r = (rx - px) * (qy - py);\n  return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0;\n} // a more robust orientation test that's stable in a given triangle (to fix robustness issues)\n\n\nfunction orient(rx, ry, qx, qy, px, py) {\n  const sign = orientIfSure(px, py, rx, ry, qx, qy) || orientIfSure(rx, ry, qx, qy, px, py) || orientIfSure(qx, qy, px, py, rx, ry);\n  return sign < 0;\n}\n\nfunction inCircle(ax, ay, bx, by, cx, cy, px, py) {\n  const dx = ax - px;\n  const dy = ay - py;\n  const ex = bx - px;\n  const ey = by - py;\n  const fx = cx - px;\n  const fy = cy - py;\n  const ap = dx * dx + dy * dy;\n  const bp = ex * ex + ey * ey;\n  const cp = fx * fx + fy * fy;\n  return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n}\n\nfunction circumradius(ax, ay, bx, by, cx, cy) {\n  const dx = bx - ax;\n  const dy = by - ay;\n  const ex = cx - ax;\n  const ey = cy - ay;\n  const bl = dx * dx + dy * dy;\n  const cl = ex * ex + ey * ey;\n  const d = 0.5 / (dx * ey - dy * ex);\n  const x = (ey * bl - dy * cl) * d;\n  const y = (dx * cl - ex * bl) * d;\n  return x * x + y * y;\n}\n\nfunction circumcenter(ax, ay, bx, by, cx, cy) {\n  const dx = bx - ax;\n  const dy = by - ay;\n  const ex = cx - ax;\n  const ey = cy - ay;\n  const bl = dx * dx + dy * dy;\n  const cl = ex * ex + ey * ey;\n  const d = 0.5 / (dx * ey - dy * ex);\n  const x = ax + (ey * bl - dy * cl) * d;\n  const y = ay + (dx * cl - ex * bl) * d;\n  return {\n    x,\n    y\n  };\n}\n\nfunction quicksort(ids, dists, left, right) {\n  if (right - left <= 20) {\n    for (let i = left + 1; i <= right; i++) {\n      const temp = ids[i];\n      const tempDist = dists[temp];\n      let j = i - 1;\n\n      while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--];\n\n      ids[j + 1] = temp;\n    }\n  } else {\n    const median = left + right >> 1;\n    let i = left + 1;\n    let j = right;\n    swap(ids, median, i);\n    if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n    if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n    if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n    const temp = ids[i];\n    const tempDist = dists[temp];\n\n    while (true) {\n      do i++; while (dists[ids[i]] < tempDist);\n\n      do j--; while (dists[ids[j]] > tempDist);\n\n      if (j < i) break;\n      swap(ids, i, j);\n    }\n\n    ids[left + 1] = ids[j];\n    ids[j] = temp;\n\n    if (right - i + 1 >= j - left) {\n      quicksort(ids, dists, i, right);\n      quicksort(ids, dists, left, j - 1);\n    } else {\n      quicksort(ids, dists, left, j - 1);\n      quicksort(ids, dists, i, right);\n    }\n  }\n}\n\nfunction swap(arr, i, j) {\n  const tmp = arr[i];\n  arr[i] = arr[j];\n  arr[j] = tmp;\n}\n\nfunction defaultGetX(p) {\n  return p[0];\n}\n\nfunction defaultGetY(p) {\n  return p[1];\n}\n},{}],\"b21u\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nconst epsilon = 1e-6;\n\nclass Path {\n  constructor() {\n    this._x0 = this._y0 = // start of current subpath\n    this._x1 = this._y1 = null; // end of current subpath\n\n    this._ = \"\";\n  }\n\n  moveTo(x, y) {\n    this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n  }\n\n  closePath() {\n    if (this._x1 !== null) {\n      this._x1 = this._x0, this._y1 = this._y0;\n      this._ += \"Z\";\n    }\n  }\n\n  lineTo(x, y) {\n    this._ += `L${this._x1 = +x},${this._y1 = +y}`;\n  }\n\n  arc(x, y, r) {\n    x = +x, y = +y, r = +r;\n    const x0 = x + r;\n    const y0 = y;\n    if (r < 0) throw new Error(\"negative radius\");\n    if (this._x1 === null) this._ += `M${x0},${y0}`;else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += \"L\" + x0 + \",\" + y0;\n    if (!r) return;\n    this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`;\n  }\n\n  rect(x, y, w, h) {\n    this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`;\n  }\n\n  value() {\n    return this._ || null;\n  }\n\n}\n\nexports.default = Path;\n},{}],\"LwIm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nclass Polygon {\n  constructor() {\n    this._ = [];\n  }\n\n  moveTo(x, y) {\n    this._.push([x, y]);\n  }\n\n  closePath() {\n    this._.push(this._[0].slice());\n  }\n\n  lineTo(x, y) {\n    this._.push([x, y]);\n  }\n\n  value() {\n    return this._.length ? this._ : null;\n  }\n\n}\n\nexports.default = Polygon;\n},{}],\"WZ0m\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _path = _interopRequireDefault(require(\"./path.js\"));\n\nvar _polygon = _interopRequireDefault(require(\"./polygon.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass Voronoi {\n  constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) {\n    if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error(\"invalid bounds\");\n    this.delaunay = delaunay;\n    this._circumcenters = new Float64Array(delaunay.points.length * 2);\n    this.vectors = new Float64Array(delaunay.points.length * 2);\n    this.xmax = xmax, this.xmin = xmin;\n    this.ymax = ymax, this.ymin = ymin;\n\n    this._init();\n  }\n\n  update() {\n    this.delaunay.update();\n\n    this._init();\n\n    return this;\n  }\n\n  _init() {\n    const {\n      delaunay: {\n        points,\n        hull,\n        triangles\n      },\n      vectors\n    } = this; // Compute circumcenters.\n\n    const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);\n\n    for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) {\n      const t1 = triangles[i] * 2;\n      const t2 = triangles[i + 1] * 2;\n      const t3 = triangles[i + 2] * 2;\n      const x1 = points[t1];\n      const y1 = points[t1 + 1];\n      const x2 = points[t2];\n      const y2 = points[t2 + 1];\n      const x3 = points[t3];\n      const y3 = points[t3 + 1];\n      const dx = x2 - x1;\n      const dy = y2 - y1;\n      const ex = x3 - x1;\n      const ey = y3 - y1;\n      const bl = dx * dx + dy * dy;\n      const cl = ex * ex + ey * ey;\n      const ab = (dx * ey - dy * ex) * 2;\n\n      if (!ab) {\n        // degenerate case (collinear diagram)\n        x = (x1 + x3) / 2 - 1e8 * ey;\n        y = (y1 + y3) / 2 + 1e8 * ex;\n      } else if (Math.abs(ab) < 1e-8) {\n        // almost equal points (degenerate triangle)\n        x = (x1 + x3) / 2;\n        y = (y1 + y3) / 2;\n      } else {\n        const d = 1 / ab;\n        x = x1 + (ey * bl - dy * cl) * d;\n        y = y1 + (dx * cl - ex * bl) * d;\n      }\n\n      circumcenters[j] = x;\n      circumcenters[j + 1] = y;\n    } // Compute exterior cell rays.\n\n\n    let h = hull[hull.length - 1];\n    let p0,\n        p1 = h * 4;\n    let x0,\n        x1 = points[2 * h];\n    let y0,\n        y1 = points[2 * h + 1];\n    vectors.fill(0);\n\n    for (let i = 0; i < hull.length; ++i) {\n      h = hull[i];\n      p0 = p1, x0 = x1, y0 = y1;\n      p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1];\n      vectors[p0 + 2] = vectors[p1] = y0 - y1;\n      vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0;\n    }\n  }\n\n  render(context) {\n    const buffer = context == null ? context = new _path.default() : undefined;\n    const {\n      delaunay: {\n        halfedges,\n        inedges,\n        hull\n      },\n      circumcenters,\n      vectors\n    } = this;\n    if (hull.length <= 1) return null;\n\n    for (let i = 0, n = halfedges.length; i < n; ++i) {\n      const j = halfedges[i];\n      if (j < i) continue;\n      const ti = Math.floor(i / 3) * 2;\n      const tj = Math.floor(j / 3) * 2;\n      const xi = circumcenters[ti];\n      const yi = circumcenters[ti + 1];\n      const xj = circumcenters[tj];\n      const yj = circumcenters[tj + 1];\n\n      this._renderSegment(xi, yi, xj, yj, context);\n    }\n\n    let h0,\n        h1 = hull[hull.length - 1];\n\n    for (let i = 0; i < hull.length; ++i) {\n      h0 = h1, h1 = hull[i];\n      const t = Math.floor(inedges[h1] / 3) * 2;\n      const x = circumcenters[t];\n      const y = circumcenters[t + 1];\n      const v = h0 * 4;\n\n      const p = this._project(x, y, vectors[v + 2], vectors[v + 3]);\n\n      if (p) this._renderSegment(x, y, p[0], p[1], context);\n    }\n\n    return buffer && buffer.value();\n  }\n\n  renderBounds(context) {\n    const buffer = context == null ? context = new _path.default() : undefined;\n    context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin);\n    return buffer && buffer.value();\n  }\n\n  renderCell(i, context) {\n    const buffer = context == null ? context = new _path.default() : undefined;\n\n    const points = this._clip(i);\n\n    if (points === null) return;\n    context.moveTo(points[0], points[1]);\n    let n = points.length;\n\n    while (points[0] === points[n - 2] && points[1] === points[n - 1] && n > 1) n -= 2;\n\n    for (let i = 2; i < n; i += 2) {\n      if (points[i] !== points[i - 2] || points[i + 1] !== points[i - 1]) context.lineTo(points[i], points[i + 1]);\n    }\n\n    context.closePath();\n    return buffer && buffer.value();\n  }\n\n  *cellPolygons() {\n    const {\n      delaunay: {\n        points\n      }\n    } = this;\n\n    for (let i = 0, n = points.length / 2; i < n; ++i) {\n      const cell = this.cellPolygon(i);\n      if (cell) yield cell;\n    }\n  }\n\n  cellPolygon(i) {\n    const polygon = new _polygon.default();\n    this.renderCell(i, polygon);\n    return polygon.value();\n  }\n\n  _renderSegment(x0, y0, x1, y1, context) {\n    let S;\n\n    const c0 = this._regioncode(x0, y0);\n\n    const c1 = this._regioncode(x1, y1);\n\n    if (c0 === 0 && c1 === 0) {\n      context.moveTo(x0, y0);\n      context.lineTo(x1, y1);\n    } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) {\n      context.moveTo(S[0], S[1]);\n      context.lineTo(S[2], S[3]);\n    }\n  }\n\n  contains(i, x, y) {\n    if ((x = +x, x !== x) || (y = +y, y !== y)) return false;\n    return this.delaunay._step(i, x, y) === i;\n  }\n\n  _cell(i) {\n    const {\n      circumcenters,\n      delaunay: {\n        inedges,\n        halfedges,\n        triangles\n      }\n    } = this;\n    const e0 = inedges[i];\n    if (e0 === -1) return null; // coincident point\n\n    const points = [];\n    let e = e0;\n\n    do {\n      const t = Math.floor(e / 3);\n      points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]);\n      e = e % 3 === 2 ? e - 2 : e + 1;\n      if (triangles[e] !== i) break; // bad triangulation\n\n      e = halfedges[e];\n    } while (e !== e0 && e !== -1);\n\n    return points;\n  }\n\n  _clip(i) {\n    // degenerate case (1 valid point: return the box)\n    if (i === 0 && this.delaunay.hull.length === 1) {\n      return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n    }\n\n    const points = this._cell(i);\n\n    if (points === null) return null;\n    const {\n      vectors: V\n    } = this;\n    const v = i * 4;\n    return V[v] || V[v + 1] ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) : this._clipFinite(i, points);\n  }\n\n  _clipFinite(i, points) {\n    const n = points.length;\n    let P = null;\n    let x0,\n        y0,\n        x1 = points[n - 2],\n        y1 = points[n - 1];\n\n    let c0,\n        c1 = this._regioncode(x1, y1);\n\n    let e0, e1;\n\n    for (let j = 0; j < n; j += 2) {\n      x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1];\n      c0 = c1, c1 = this._regioncode(x1, y1);\n\n      if (c0 === 0 && c1 === 0) {\n        e0 = e1, e1 = 0;\n        if (P) P.push(x1, y1);else P = [x1, y1];\n      } else {\n        let S, sx0, sy0, sx1, sy1;\n\n        if (c0 === 0) {\n          if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue;\n          [sx0, sy0, sx1, sy1] = S;\n        } else {\n          if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue;\n          [sx1, sy1, sx0, sy0] = S;\n          e0 = e1, e1 = this._edgecode(sx0, sy0);\n          if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n          if (P) P.push(sx0, sy0);else P = [sx0, sy0];\n        }\n\n        e0 = e1, e1 = this._edgecode(sx1, sy1);\n        if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n        if (P) P.push(sx1, sy1);else P = [sx1, sy1];\n      }\n    }\n\n    if (P) {\n      e0 = e1, e1 = this._edgecode(P[0], P[1]);\n      if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n    } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n      return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n    }\n\n    return P;\n  }\n\n  _clipSegment(x0, y0, x1, y1, c0, c1) {\n    while (true) {\n      if (c0 === 0 && c1 === 0) return [x0, y0, x1, y1];\n      if (c0 & c1) return null;\n      let x,\n          y,\n          c = c0 || c1;\n      if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax;else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin;else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax;else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin;\n      if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0);else x1 = x, y1 = y, c1 = this._regioncode(x1, y1);\n    }\n  }\n\n  _clipInfinite(i, points, vx0, vy0, vxn, vyn) {\n    let P = Array.from(points),\n        p;\n    if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]);\n    if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]);\n\n    if (P = this._clipFinite(i, P)) {\n      for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) {\n        c0 = c1, c1 = this._edgecode(P[j], P[j + 1]);\n        if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length;\n      }\n    } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n      P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax];\n    }\n\n    return P;\n  }\n\n  _edge(i, e0, e1, P, j) {\n    while (e0 !== e1) {\n      let x, y;\n\n      switch (e0) {\n        case 0b0101:\n          e0 = 0b0100;\n          continue;\n        // top-left\n\n        case 0b0100:\n          e0 = 0b0110, x = this.xmax, y = this.ymin;\n          break;\n        // top\n\n        case 0b0110:\n          e0 = 0b0010;\n          continue;\n        // top-right\n\n        case 0b0010:\n          e0 = 0b1010, x = this.xmax, y = this.ymax;\n          break;\n        // right\n\n        case 0b1010:\n          e0 = 0b1000;\n          continue;\n        // bottom-right\n\n        case 0b1000:\n          e0 = 0b1001, x = this.xmin, y = this.ymax;\n          break;\n        // bottom\n\n        case 0b1001:\n          e0 = 0b0001;\n          continue;\n        // bottom-left\n\n        case 0b0001:\n          e0 = 0b0101, x = this.xmin, y = this.ymin;\n          break;\n        // left\n      }\n\n      if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) {\n        P.splice(j, 0, x, y), j += 2;\n      }\n    }\n\n    if (P.length > 4) {\n      for (let i = 0; i < P.length; i += 2) {\n        const j = (i + 2) % P.length,\n              k = (i + 4) % P.length;\n        if (P[i] === P[j] && P[j] === P[k] || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) P.splice(j, 2), i -= 2;\n      }\n    }\n\n    return j;\n  }\n\n  _project(x0, y0, vx, vy) {\n    let t = Infinity,\n        c,\n        x,\n        y;\n\n    if (vy < 0) {\n      // top\n      if (y0 <= this.ymin) return null;\n      if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx;\n    } else if (vy > 0) {\n      // bottom\n      if (y0 >= this.ymax) return null;\n      if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx;\n    }\n\n    if (vx > 0) {\n      // right\n      if (x0 >= this.xmax) return null;\n      if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy;\n    } else if (vx < 0) {\n      // left\n      if (x0 <= this.xmin) return null;\n      if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy;\n    }\n\n    return [x, y];\n  }\n\n  _edgecode(x, y) {\n    return (x === this.xmin ? 0b0001 : x === this.xmax ? 0b0010 : 0b0000) | (y === this.ymin ? 0b0100 : y === this.ymax ? 0b1000 : 0b0000);\n  }\n\n  _regioncode(x, y) {\n    return (x < this.xmin ? 0b0001 : x > this.xmax ? 0b0010 : 0b0000) | (y < this.ymin ? 0b0100 : y > this.ymax ? 0b1000 : 0b0000);\n  }\n\n}\n\nexports.default = Voronoi;\n},{\"./path.js\":\"b21u\",\"./polygon.js\":\"LwIm\"}],\"U7i6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _delaunator = _interopRequireDefault(require(\"delaunator\"));\n\nvar _path = _interopRequireDefault(require(\"./path.js\"));\n\nvar _polygon = _interopRequireDefault(require(\"./polygon.js\"));\n\nvar _voronoi = _interopRequireDefault(require(\"./voronoi.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst tau = 2 * Math.PI;\n\nfunction pointX(p) {\n  return p[0];\n}\n\nfunction pointY(p) {\n  return p[1];\n} // A triangulation is collinear if all its triangles have a non-null area\n\n\nfunction collinear(d) {\n  const {\n    triangles,\n    coords\n  } = d;\n\n  for (let i = 0; i < triangles.length; i += 3) {\n    const a = 2 * triangles[i],\n          b = 2 * triangles[i + 1],\n          c = 2 * triangles[i + 2],\n          cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]);\n    if (cross > 1e-10) return false;\n  }\n\n  return true;\n}\n\nfunction jitter(x, y, r) {\n  return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r];\n}\n\nclass Delaunay {\n  constructor(points) {\n    this._delaunator = new _delaunator.default(points);\n    this.inedges = new Int32Array(points.length / 2);\n    this._hullIndex = new Int32Array(points.length / 2);\n    this.points = this._delaunator.coords;\n\n    this._init();\n  }\n\n  update() {\n    this._delaunator.update();\n\n    this._init();\n\n    return this;\n  }\n\n  _init() {\n    const d = this._delaunator,\n          points = this.points; // check for collinear\n\n    if (d.hull && d.hull.length > 2 && collinear(d)) {\n      this.collinear = Int32Array.from({\n        length: points.length / 2\n      }, (_, i) => i).sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors\n\n      const e = this.collinear[0],\n            f = this.collinear[this.collinear.length - 1],\n            bounds = [points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1]],\n            r = 1e-8 * Math.sqrt((bounds[3] - bounds[1]) ** 2 + (bounds[2] - bounds[0]) ** 2);\n\n      for (let i = 0, n = points.length / 2; i < n; ++i) {\n        const p = jitter(points[2 * i], points[2 * i + 1], r);\n        points[2 * i] = p[0];\n        points[2 * i + 1] = p[1];\n      }\n\n      this._delaunator = new _delaunator.default(points);\n    } else {\n      delete this.collinear;\n    }\n\n    const halfedges = this.halfedges = this._delaunator.halfedges;\n    const hull = this.hull = this._delaunator.hull;\n    const triangles = this.triangles = this._delaunator.triangles;\n    const inedges = this.inedges.fill(-1);\n\n    const hullIndex = this._hullIndex.fill(-1); // Compute an index from each point to an (arbitrary) incoming halfedge\n    // Used to give the first neighbor of each point; for this reason,\n    // on the hull we give priority to exterior halfedges\n\n\n    for (let e = 0, n = halfedges.length; e < n; ++e) {\n      const p = triangles[e % 3 === 2 ? e - 2 : e + 1];\n      if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e;\n    }\n\n    for (let i = 0, n = hull.length; i < n; ++i) {\n      hullIndex[hull[i]] = i;\n    } // degenerate case: 1 or 2 (distinct) points\n\n\n    if (hull.length <= 2 && hull.length > 0) {\n      this.triangles = new Int32Array(3).fill(-1);\n      this.halfedges = new Int32Array(3).fill(-1);\n      this.triangles[0] = hull[0];\n      this.triangles[1] = hull[1];\n      this.triangles[2] = hull[1];\n      inedges[hull[0]] = 1;\n      if (hull.length === 2) inedges[hull[1]] = 0;\n    }\n  }\n\n  voronoi(bounds) {\n    return new _voronoi.default(this, bounds);\n  }\n\n  *neighbors(i) {\n    const {\n      inedges,\n      hull,\n      _hullIndex,\n      halfedges,\n      triangles\n    } = this; // degenerate case with several collinear points\n\n    if (this.collinear) {\n      const l = this.collinear.indexOf(i);\n      if (l > 0) yield this.collinear[l - 1];\n      if (l < this.collinear.length - 1) yield this.collinear[l + 1];\n      return;\n    }\n\n    const e0 = inedges[i];\n    if (e0 === -1) return; // coincident point\n\n    let e = e0,\n        p0 = -1;\n\n    do {\n      yield p0 = triangles[e];\n      e = e % 3 === 2 ? e - 2 : e + 1;\n      if (triangles[e] !== i) return; // bad triangulation\n\n      e = halfedges[e];\n\n      if (e === -1) {\n        const p = hull[(_hullIndex[i] + 1) % hull.length];\n        if (p !== p0) yield p;\n        return;\n      }\n    } while (e !== e0);\n  }\n\n  find(x, y, i = 0) {\n    if ((x = +x, x !== x) || (y = +y, y !== y)) return -1;\n    const i0 = i;\n    let c;\n\n    while ((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0) i = c;\n\n    return c;\n  }\n\n  _step(i, x, y) {\n    const {\n      inedges,\n      hull,\n      _hullIndex,\n      halfedges,\n      triangles,\n      points\n    } = this;\n    if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1);\n    let c = i;\n    let dc = (x - points[i * 2]) ** 2 + (y - points[i * 2 + 1]) ** 2;\n    const e0 = inedges[i];\n    let e = e0;\n\n    do {\n      let t = triangles[e];\n      const dt = (x - points[t * 2]) ** 2 + (y - points[t * 2 + 1]) ** 2;\n      if (dt < dc) dc = dt, c = t;\n      e = e % 3 === 2 ? e - 2 : e + 1;\n      if (triangles[e] !== i) break; // bad triangulation\n\n      e = halfedges[e];\n\n      if (e === -1) {\n        e = hull[(_hullIndex[i] + 1) % hull.length];\n\n        if (e !== t) {\n          if ((x - points[e * 2]) ** 2 + (y - points[e * 2 + 1]) ** 2 < dc) return e;\n        }\n\n        break;\n      }\n    } while (e !== e0);\n\n    return c;\n  }\n\n  render(context) {\n    const buffer = context == null ? context = new _path.default() : undefined;\n    const {\n      points,\n      halfedges,\n      triangles\n    } = this;\n\n    for (let i = 0, n = halfedges.length; i < n; ++i) {\n      const j = halfedges[i];\n      if (j < i) continue;\n      const ti = triangles[i] * 2;\n      const tj = triangles[j] * 2;\n      context.moveTo(points[ti], points[ti + 1]);\n      context.lineTo(points[tj], points[tj + 1]);\n    }\n\n    this.renderHull(context);\n    return buffer && buffer.value();\n  }\n\n  renderPoints(context, r = 2) {\n    const buffer = context == null ? context = new _path.default() : undefined;\n    const {\n      points\n    } = this;\n\n    for (let i = 0, n = points.length; i < n; i += 2) {\n      const x = points[i],\n            y = points[i + 1];\n      context.moveTo(x + r, y);\n      context.arc(x, y, r, 0, tau);\n    }\n\n    return buffer && buffer.value();\n  }\n\n  renderHull(context) {\n    const buffer = context == null ? context = new _path.default() : undefined;\n    const {\n      hull,\n      points\n    } = this;\n    const h = hull[0] * 2,\n          n = hull.length;\n    context.moveTo(points[h], points[h + 1]);\n\n    for (let i = 1; i < n; ++i) {\n      const h = 2 * hull[i];\n      context.lineTo(points[h], points[h + 1]);\n    }\n\n    context.closePath();\n    return buffer && buffer.value();\n  }\n\n  hullPolygon() {\n    const polygon = new _polygon.default();\n    this.renderHull(polygon);\n    return polygon.value();\n  }\n\n  renderTriangle(i, context) {\n    const buffer = context == null ? context = new _path.default() : undefined;\n    const {\n      points,\n      triangles\n    } = this;\n    const t0 = triangles[i *= 3] * 2;\n    const t1 = triangles[i + 1] * 2;\n    const t2 = triangles[i + 2] * 2;\n    context.moveTo(points[t0], points[t0 + 1]);\n    context.lineTo(points[t1], points[t1 + 1]);\n    context.lineTo(points[t2], points[t2 + 1]);\n    context.closePath();\n    return buffer && buffer.value();\n  }\n\n  *trianglePolygons() {\n    const {\n      triangles\n    } = this;\n\n    for (let i = 0, n = triangles.length / 3; i < n; ++i) {\n      yield this.trianglePolygon(i);\n    }\n  }\n\n  trianglePolygon(i) {\n    const polygon = new _polygon.default();\n    this.renderTriangle(i, polygon);\n    return polygon.value();\n  }\n\n}\n\nexports.default = Delaunay;\n\nDelaunay.from = function (points, fx = pointX, fy = pointY, that) {\n  return new Delaunay(\"length\" in points ? flatArray(points, fx, fy, that) : Float64Array.from(flatIterable(points, fx, fy, that)));\n};\n\nfunction flatArray(points, fx, fy, that) {\n  const n = points.length;\n  const array = new Float64Array(n * 2);\n\n  for (let i = 0; i < n; ++i) {\n    const p = points[i];\n    array[i * 2] = fx.call(that, p, i, points);\n    array[i * 2 + 1] = fy.call(that, p, i, points);\n  }\n\n  return array;\n}\n\nfunction* flatIterable(points, fx, fy, that) {\n  let i = 0;\n\n  for (const p of points) {\n    yield fx.call(that, p, i, points);\n    yield fy.call(that, p, i, points);\n    ++i;\n  }\n}\n},{\"delaunator\":\"GBJ0\",\"./path.js\":\"b21u\",\"./polygon.js\":\"LwIm\",\"./voronoi.js\":\"WZ0m\"}],\"fQOh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Delaunay\", {\n  enumerable: true,\n  get: function () {\n    return _delaunay.default;\n  }\n});\nObject.defineProperty(exports, \"Voronoi\", {\n  enumerable: true,\n  get: function () {\n    return _voronoi.default;\n  }\n});\n\nvar _delaunay = _interopRequireDefault(require(\"./delaunay.js\"));\n\nvar _voronoi = _interopRequireDefault(require(\"./voronoi.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./delaunay.js\":\"U7i6\",\"./voronoi.js\":\"WZ0m\"}],\"Dt2d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Voronoi;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Delaunay = require(\"d3-delaunay\");\n\nfunction Voronoi(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nVoronoi.Definition = {\n  \"type\": \"Voronoi\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"x\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"y\",\n    \"type\": \"field\",\n    \"required\": true\n  }, {\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"extent\",\n    \"type\": \"array\",\n    \"array\": true,\n    \"length\": 2,\n    \"default\": [[-1e5, -1e5], [1e5, 1e5]],\n    \"content\": {\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"default\": \"path\"\n  }]\n};\nconst prototype = (0, _vegaUtil.inherits)(Voronoi, _vegaDataflow.Transform);\nconst defaultExtent = [-1e5, -1e5, 1e5, 1e5];\n\nprototype.transform = function (_, pulse) {\n  const as = _.as || 'path',\n        data = pulse.source; // nothing to do if no data\n\n  if (!data || !data.length) return pulse; // configure and construct voronoi diagram\n\n  let s = _.size;\n  s = s ? [0, 0, s[0], s[1]] : (s = _.extent) ? [s[0][0], s[0][1], s[1][0], s[1][1]] : defaultExtent;\n\n  const voronoi = this.value = _d3Delaunay.Delaunay.from(data, _.x, _.y).voronoi(s); // map polygons to paths\n\n\n  for (let i = 0, n = data.length; i < n; ++i) {\n    const polygon = voronoi.cellPolygon(i);\n    data[i][as] = polygon ? toPathString(polygon) : null;\n  }\n\n  return pulse.reflow(_.modified()).modifies(as);\n}; // suppress duplicated end point vertices\n\n\nfunction toPathString(p) {\n  const x = p[0][0],\n        y = p[0][1];\n  let n = p.length - 1;\n\n  for (; p[n][0] === x && p[n][1] === y; --n);\n\n  return 'M' + p.slice(0, n + 1).join('L') + 'Z';\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"d3-delaunay\":\"fQOh\"}],\"Ys7f\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"voronoi\", {\n  enumerable: true,\n  get: function () {\n    return _Voronoi.default;\n  }\n});\n\nvar _Voronoi = _interopRequireDefault(require(\"./src/Voronoi\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Voronoi\":\"Dt2d\"}],\"VXXL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaCanvas = require(\"vega-canvas\");\n\n/*\nCopyright (c) 2013, Jason Davies.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n  * Redistributions of source code must retain the above copyright notice, this\n    list of conditions and the following disclaimer.\n\n  * Redistributions in binary form must reproduce the above copyright notice,\n    this list of conditions and the following disclaimer in the documentation\n    and/or other materials provided with the distribution.\n\n  * The name Jason Davies may not be used to endorse or promote products\n    derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL JASON DAVIES BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\nOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\nADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n// Word cloud layout by Jason Davies, https://www.jasondavies.com/wordcloud/\n// Algorithm due to Jonathan Feinberg, http://static.mrfeinberg.com/bv_ch03.pdf\nvar cloudRadians = Math.PI / 180,\n    cw = 1 << 11 >> 5,\n    ch = 1 << 11;\n\nfunction _default() {\n  var size = [256, 256],\n      text,\n      font,\n      fontSize,\n      fontStyle,\n      fontWeight,\n      rotate,\n      padding,\n      spiral = archimedeanSpiral,\n      words = [],\n      random = Math.random,\n      cloud = {};\n\n  cloud.layout = function () {\n    var contextAndRatio = getContext((0, _vegaCanvas.canvas)()),\n        board = zeroArray((size[0] >> 5) * size[1]),\n        bounds = null,\n        n = words.length,\n        i = -1,\n        tags = [],\n        data = words.map(function (d) {\n      return {\n        text: text(d),\n        font: font(d),\n        style: fontStyle(d),\n        weight: fontWeight(d),\n        rotate: rotate(d),\n        size: ~~fontSize(d),\n        padding: padding(d),\n        xoff: 0,\n        yoff: 0,\n        x1: 0,\n        y1: 0,\n        x0: 0,\n        y0: 0,\n        hasText: false,\n        sprite: null,\n        datum: d\n      };\n    }).sort(function (a, b) {\n      return b.size - a.size;\n    });\n\n    while (++i < n) {\n      var d = data[i];\n      d.x = size[0] * (random() + .5) >> 1;\n      d.y = size[1] * (random() + .5) >> 1;\n      cloudSprite(contextAndRatio, d, data, i);\n\n      if (d.hasText && place(board, d, bounds)) {\n        tags.push(d);\n        if (bounds) cloudBounds(bounds, d);else bounds = [{\n          x: d.x + d.x0,\n          y: d.y + d.y0\n        }, {\n          x: d.x + d.x1,\n          y: d.y + d.y1\n        }]; // Temporary hack\n\n        d.x -= size[0] >> 1;\n        d.y -= size[1] >> 1;\n      }\n    }\n\n    return tags;\n  };\n\n  function getContext(canvas) {\n    canvas.width = canvas.height = 1;\n    var ratio = Math.sqrt(canvas.getContext(\"2d\").getImageData(0, 0, 1, 1).data.length >> 2);\n    canvas.width = (cw << 5) / ratio;\n    canvas.height = ch / ratio;\n    var context = canvas.getContext(\"2d\");\n    context.fillStyle = context.strokeStyle = \"red\";\n    context.textAlign = \"center\";\n    return {\n      context: context,\n      ratio: ratio\n    };\n  }\n\n  function place(board, tag, bounds) {\n    var startX = tag.x,\n        startY = tag.y,\n        maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]),\n        s = spiral(size),\n        dt = random() < .5 ? 1 : -1,\n        t = -dt,\n        dxdy,\n        dx,\n        dy;\n\n    while (dxdy = s(t += dt)) {\n      dx = ~~dxdy[0];\n      dy = ~~dxdy[1];\n      if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break;\n      tag.x = startX + dx;\n      tag.y = startY + dy;\n      if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue; // TODO only check for collisions within current bounds.\n\n      if (!bounds || !cloudCollide(tag, board, size[0])) {\n        if (!bounds || collideRects(tag, bounds)) {\n          var sprite = tag.sprite,\n              w = tag.width >> 5,\n              sw = size[0] >> 5,\n              lx = tag.x - (w << 4),\n              sx = lx & 0x7f,\n              msx = 32 - sx,\n              h = tag.y1 - tag.y0,\n              x = (tag.y + tag.y0) * sw + (lx >> 5),\n              last;\n\n          for (var j = 0; j < h; j++) {\n            last = 0;\n\n            for (var i = 0; i <= w; i++) {\n              board[x + i] |= last << msx | (i < w ? (last = sprite[j * w + i]) >>> sx : 0);\n            }\n\n            x += sw;\n          }\n\n          tag.sprite = null;\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  cloud.words = function (_) {\n    if (arguments.length) {\n      words = _;\n      return cloud;\n    } else {\n      return words;\n    }\n  };\n\n  cloud.size = function (_) {\n    if (arguments.length) {\n      size = [+_[0], +_[1]];\n      return cloud;\n    } else {\n      return size;\n    }\n  };\n\n  cloud.font = function (_) {\n    if (arguments.length) {\n      font = functor(_);\n      return cloud;\n    } else {\n      return font;\n    }\n  };\n\n  cloud.fontStyle = function (_) {\n    if (arguments.length) {\n      fontStyle = functor(_);\n      return cloud;\n    } else {\n      return fontStyle;\n    }\n  };\n\n  cloud.fontWeight = function (_) {\n    if (arguments.length) {\n      fontWeight = functor(_);\n      return cloud;\n    } else {\n      return fontWeight;\n    }\n  };\n\n  cloud.rotate = function (_) {\n    if (arguments.length) {\n      rotate = functor(_);\n      return cloud;\n    } else {\n      return rotate;\n    }\n  };\n\n  cloud.text = function (_) {\n    if (arguments.length) {\n      text = functor(_);\n      return cloud;\n    } else {\n      return text;\n    }\n  };\n\n  cloud.spiral = function (_) {\n    if (arguments.length) {\n      spiral = spirals[_] || _;\n      return cloud;\n    } else {\n      return spiral;\n    }\n  };\n\n  cloud.fontSize = function (_) {\n    if (arguments.length) {\n      fontSize = functor(_);\n      return cloud;\n    } else {\n      return fontSize;\n    }\n  };\n\n  cloud.padding = function (_) {\n    if (arguments.length) {\n      padding = functor(_);\n      return cloud;\n    } else {\n      return padding;\n    }\n  };\n\n  cloud.random = function (_) {\n    if (arguments.length) {\n      random = _;\n      return cloud;\n    } else {\n      return random;\n    }\n  };\n\n  return cloud;\n} // Fetches a monochrome sprite bitmap for the specified text.\n// Load in batches for speed.\n\n\nfunction cloudSprite(contextAndRatio, d, data, di) {\n  if (d.sprite) return;\n  var c = contextAndRatio.context,\n      ratio = contextAndRatio.ratio;\n  c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);\n  var x = 0,\n      y = 0,\n      maxh = 0,\n      n = data.length,\n      w,\n      w32,\n      h,\n      i,\n      j;\n  --di;\n\n  while (++di < n) {\n    d = data[di];\n    c.save();\n    c.font = d.style + \" \" + d.weight + \" \" + ~~((d.size + 1) / ratio) + \"px \" + d.font;\n    w = c.measureText(d.text + \"m\").width * ratio;\n    h = d.size << 1;\n\n    if (d.rotate) {\n      var sr = Math.sin(d.rotate * cloudRadians),\n          cr = Math.cos(d.rotate * cloudRadians),\n          wcr = w * cr,\n          wsr = w * sr,\n          hcr = h * cr,\n          hsr = h * sr;\n      w = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f >> 5 << 5;\n      h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));\n    } else {\n      w = w + 0x1f >> 5 << 5;\n    }\n\n    if (h > maxh) maxh = h;\n\n    if (x + w >= cw << 5) {\n      x = 0;\n      y += maxh;\n      maxh = 0;\n    }\n\n    if (y + h >= ch) break;\n    c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio);\n    if (d.rotate) c.rotate(d.rotate * cloudRadians);\n    c.fillText(d.text, 0, 0);\n\n    if (d.padding) {\n      c.lineWidth = 2 * d.padding;\n      c.strokeText(d.text, 0, 0);\n    }\n\n    c.restore();\n    d.width = w;\n    d.height = h;\n    d.xoff = x;\n    d.yoff = y;\n    d.x1 = w >> 1;\n    d.y1 = h >> 1;\n    d.x0 = -d.x1;\n    d.y0 = -d.y1;\n    d.hasText = true;\n    x += w;\n  }\n\n  var pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data,\n      sprite = [];\n\n  while (--di >= 0) {\n    d = data[di];\n    if (!d.hasText) continue;\n    w = d.width;\n    w32 = w >> 5;\n    h = d.y1 - d.y0; // Zero the buffer\n\n    for (i = 0; i < h * w32; i++) sprite[i] = 0;\n\n    x = d.xoff;\n    if (x == null) return;\n    y = d.yoff;\n    var seen = 0,\n        seenRow = -1;\n\n    for (j = 0; j < h; j++) {\n      for (i = 0; i < w; i++) {\n        var k = w32 * j + (i >> 5),\n            m = pixels[(y + j) * (cw << 5) + (x + i) << 2] ? 1 << 31 - i % 32 : 0;\n        sprite[k] |= m;\n        seen |= m;\n      }\n\n      if (seen) seenRow = j;else {\n        d.y0++;\n        h--;\n        j--;\n        y++;\n      }\n    }\n\n    d.y1 = d.y0 + seenRow;\n    d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32);\n  }\n} // Use mask-based collision detection.\n\n\nfunction cloudCollide(tag, board, sw) {\n  sw >>= 5;\n  var sprite = tag.sprite,\n      w = tag.width >> 5,\n      lx = tag.x - (w << 4),\n      sx = lx & 0x7f,\n      msx = 32 - sx,\n      h = tag.y1 - tag.y0,\n      x = (tag.y + tag.y0) * sw + (lx >> 5),\n      last;\n\n  for (var j = 0; j < h; j++) {\n    last = 0;\n\n    for (var i = 0; i <= w; i++) {\n      if ((last << msx | (i < w ? (last = sprite[j * w + i]) >>> sx : 0)) & board[x + i]) return true;\n    }\n\n    x += sw;\n  }\n\n  return false;\n}\n\nfunction cloudBounds(bounds, d) {\n  var b0 = bounds[0],\n      b1 = bounds[1];\n  if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0;\n  if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0;\n  if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1;\n  if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1;\n}\n\nfunction collideRects(a, b) {\n  return a.x + a.x1 > b[0].x && a.x + a.x0 < b[1].x && a.y + a.y1 > b[0].y && a.y + a.y0 < b[1].y;\n}\n\nfunction archimedeanSpiral(size) {\n  var e = size[0] / size[1];\n  return function (t) {\n    return [e * (t *= .1) * Math.cos(t), t * Math.sin(t)];\n  };\n}\n\nfunction rectangularSpiral(size) {\n  var dy = 4,\n      dx = dy * size[0] / size[1],\n      x = 0,\n      y = 0;\n  return function (t) {\n    var sign = t < 0 ? -1 : 1; // See triangular numbers: T_n = n * (n + 1) / 2.\n\n    switch (Math.sqrt(1 + 4 * sign * t) - sign & 3) {\n      case 0:\n        x += dx;\n        break;\n\n      case 1:\n        y += dy;\n        break;\n\n      case 2:\n        x -= dx;\n        break;\n\n      default:\n        y -= dy;\n        break;\n    }\n\n    return [x, y];\n  };\n} // TODO reuse arrays?\n\n\nfunction zeroArray(n) {\n  var a = [],\n      i = -1;\n\n  while (++i < n) a[i] = 0;\n\n  return a;\n}\n\nfunction functor(d) {\n  return typeof d === \"function\" ? d : function () {\n    return d;\n  };\n}\n\nvar spirals = {\n  archimedean: archimedeanSpiral,\n  rectangular: rectangularSpiral\n};\n},{\"vega-canvas\":\"r2P5\"}],\"fNfL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Wordcloud;\n\nvar _CloudLayout = _interopRequireDefault(require(\"./CloudLayout\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Output = ['x', 'y', 'font', 'fontSize', 'fontStyle', 'fontWeight', 'angle'];\nvar Params = ['text', 'font', 'rotate', 'fontSize', 'fontStyle', 'fontWeight'];\n\nfunction Wordcloud(params) {\n  _vegaDataflow.Transform.call(this, (0, _CloudLayout.default)(), params);\n}\n\nWordcloud.Definition = {\n  \"type\": \"Wordcloud\",\n  \"metadata\": {\n    \"modifies\": true\n  },\n  \"params\": [{\n    \"name\": \"size\",\n    \"type\": \"number\",\n    \"array\": true,\n    \"length\": 2\n  }, {\n    \"name\": \"font\",\n    \"type\": \"string\",\n    \"expr\": true,\n    \"default\": \"sans-serif\"\n  }, {\n    \"name\": \"fontStyle\",\n    \"type\": \"string\",\n    \"expr\": true,\n    \"default\": \"normal\"\n  }, {\n    \"name\": \"fontWeight\",\n    \"type\": \"string\",\n    \"expr\": true,\n    \"default\": \"normal\"\n  }, {\n    \"name\": \"fontSize\",\n    \"type\": \"number\",\n    \"expr\": true,\n    \"default\": 14\n  }, {\n    \"name\": \"fontSizeRange\",\n    \"type\": \"number\",\n    \"array\": \"nullable\",\n    \"default\": [10, 50]\n  }, {\n    \"name\": \"rotate\",\n    \"type\": \"number\",\n    \"expr\": true,\n    \"default\": 0\n  }, {\n    \"name\": \"text\",\n    \"type\": \"field\"\n  }, {\n    \"name\": \"spiral\",\n    \"type\": \"string\",\n    \"values\": [\"archimedean\", \"rectangular\"]\n  }, {\n    \"name\": \"padding\",\n    \"type\": \"number\",\n    \"expr\": true\n  }, {\n    \"name\": \"as\",\n    \"type\": \"string\",\n    \"array\": true,\n    \"length\": 7,\n    \"default\": Output\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(Wordcloud, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (_.size && !(_.size[0] && _.size[1])) {\n    (0, _vegaUtil.error)('Wordcloud size dimensions must be non-zero.');\n  }\n\n  function modp(param) {\n    var p = _[param];\n    return (0, _vegaUtil.isFunction)(p) && pulse.modified(p.fields);\n  }\n\n  var mod = _.modified();\n\n  if (!(mod || pulse.changed(pulse.ADD_REM) || Params.some(modp))) return;\n  var data = pulse.materialize(pulse.SOURCE).source,\n      layout = this.value,\n      as = _.as || Output,\n      fontSize = _.fontSize || 14,\n      range;\n  (0, _vegaUtil.isFunction)(fontSize) ? range = _.fontSizeRange : fontSize = (0, _vegaUtil.constant)(fontSize); // create font size scaling function as needed\n\n  if (range) {\n    var fsize = fontSize,\n        sizeScale = (0, _vegaScale.scale)('sqrt')().domain((0, _vegaUtil.extent)(data, fsize)).range(range);\n\n    fontSize = function (x) {\n      return sizeScale(fsize(x));\n    };\n  }\n\n  data.forEach(function (t) {\n    t[as[0]] = NaN;\n    t[as[1]] = NaN;\n    t[as[3]] = 0;\n  }); // configure layout\n\n  var words = layout.words(data).text(_.text).size(_.size || [500, 500]).padding(_.padding || 1).spiral(_.spiral || 'archimedean').rotate(_.rotate || 0).font(_.font || 'sans-serif').fontStyle(_.fontStyle || 'normal').fontWeight(_.fontWeight || 'normal').fontSize(fontSize).random(_vegaStatistics.random).layout();\n  var size = layout.size(),\n      dx = size[0] >> 1,\n      dy = size[1] >> 1,\n      i = 0,\n      n = words.length,\n      w,\n      t;\n\n  for (; i < n; ++i) {\n    w = words[i];\n    t = w.datum;\n    t[as[0]] = w.x + dx;\n    t[as[1]] = w.y + dy;\n    t[as[2]] = w.font;\n    t[as[3]] = w.size;\n    t[as[4]] = w.style;\n    t[as[5]] = w.weight;\n    t[as[6]] = w.rotate;\n  }\n\n  return pulse.reflow(mod).modifies(as);\n};\n},{\"./CloudLayout\":\"VXXL\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"vega-scale\":\"N8iK\",\"vega-statistics\":\"Cvi0\"}],\"R2bD\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"wordcloud\", {\n  enumerable: true,\n  get: function () {\n    return _Wordcloud.default;\n  }\n});\n\nvar _Wordcloud = _interopRequireDefault(require(\"./src/Wordcloud\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/Wordcloud\":\"fNfL\"}],\"JpVw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.array8 = array8;\nexports.array16 = array16;\nexports.array32 = array32;\n\nfunction array8(n) {\n  return new Uint8Array(n);\n}\n\nfunction array16(n) {\n  return new Uint16Array(n);\n}\n\nfunction array32(n) {\n  return new Uint32Array(n);\n}\n},{}],\"lj21\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Bitmaps;\n\nvar _arrays = require(\"./arrays\");\n\n/**\n * Maintains CrossFilter state.\n */\nfunction Bitmaps() {\n  var width = 8,\n      data = [],\n      seen = (0, _arrays.array32)(0),\n      curr = array(0, width),\n      prev = array(0, width);\n  return {\n    data: function () {\n      return data;\n    },\n    seen: function () {\n      return seen = lengthen(seen, data.length);\n    },\n    add: function (array) {\n      for (var i = 0, j = data.length, n = array.length, t; i < n; ++i) {\n        t = array[i];\n        t._index = j++;\n        data.push(t);\n      }\n    },\n    remove: function (num, map) {\n      // map: index -> boolean (true => remove)\n      var n = data.length,\n          copy = Array(n - num),\n          reindex = data,\n          // reuse old data array for index map\n      t,\n          i,\n          j; // seek forward to first removal\n\n      for (i = 0; !map[i] && i < n; ++i) {\n        copy[i] = data[i];\n        reindex[i] = i;\n      } // condense arrays\n\n\n      for (j = i; i < n; ++i) {\n        t = data[i];\n\n        if (!map[i]) {\n          reindex[i] = j;\n          curr[j] = curr[i];\n          prev[j] = prev[i];\n          copy[j] = t;\n          t._index = j++;\n        } else {\n          reindex[i] = -1;\n        }\n\n        curr[i] = 0; // clear unused bits\n      }\n\n      data = copy;\n      return reindex;\n    },\n    size: function () {\n      return data.length;\n    },\n    curr: function () {\n      return curr;\n    },\n    prev: function () {\n      return prev;\n    },\n    reset: function (k) {\n      prev[k] = curr[k];\n    },\n    all: function () {\n      return width < 0x101 ? 0xff : width < 0x10001 ? 0xffff : 0xffffffff;\n    },\n    set: function (k, one) {\n      curr[k] |= one;\n    },\n    clear: function (k, one) {\n      curr[k] &= ~one;\n    },\n    resize: function (n, m) {\n      var k = curr.length;\n\n      if (n > k || m > width) {\n        width = Math.max(m, width);\n        curr = array(n, width, curr);\n        prev = array(n, width);\n      }\n    }\n  };\n}\n\nfunction lengthen(array, length, copy) {\n  if (array.length >= length) return array;\n  copy = copy || new array.constructor(length);\n  copy.set(array);\n  return copy;\n}\n\nfunction array(n, m, array) {\n  var copy = (m < 0x101 ? _arrays.array8 : m < 0x10001 ? _arrays.array16 : _arrays.array32)(n);\n  if (array) copy.set(array);\n  return copy;\n}\n},{\"./arrays\":\"JpVw\"}],\"PG74\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(index, i, query) {\n  var bit = 1 << i;\n  return {\n    one: bit,\n    zero: ~bit,\n    range: query.slice(),\n    bisect: index.bisect,\n    index: index.index,\n    size: index.size,\n    onAdd: function (added, curr) {\n      var dim = this,\n          range = dim.bisect(dim.range, added.value),\n          idx = added.index,\n          lo = range[0],\n          hi = range[1],\n          n1 = idx.length,\n          i;\n\n      for (i = 0; i < lo; ++i) curr[idx[i]] |= bit;\n\n      for (i = hi; i < n1; ++i) curr[idx[i]] |= bit;\n\n      return dim;\n    }\n  };\n}\n},{}],\"qH2J\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = SortedIndex;\n\nvar _arrays = require(\"./arrays\");\n\nvar _d3Array = require(\"d3-array\");\n\n/**\n * Maintains a list of values, sorted by key.\n */\nfunction SortedIndex() {\n  var index = (0, _arrays.array32)(0),\n      value = [],\n      size = 0;\n\n  function insert(key, data, base) {\n    if (!data.length) return [];\n    var n0 = size,\n        n1 = data.length,\n        addv = Array(n1),\n        addi = (0, _arrays.array32)(n1),\n        oldv,\n        oldi,\n        i;\n\n    for (i = 0; i < n1; ++i) {\n      addv[i] = key(data[i]);\n      addi[i] = i;\n    }\n\n    addv = sort(addv, addi);\n\n    if (n0) {\n      oldv = value;\n      oldi = index;\n      value = Array(n0 + n1);\n      index = (0, _arrays.array32)(n0 + n1);\n      merge(base, oldv, oldi, n0, addv, addi, n1, value, index);\n    } else {\n      if (base > 0) for (i = 0; i < n1; ++i) {\n        addi[i] += base;\n      }\n      value = addv;\n      index = addi;\n    }\n\n    size = n0 + n1;\n    return {\n      index: addi,\n      value: addv\n    };\n  }\n\n  function remove(num, map) {\n    // map: index -> remove\n    var n = size,\n        idx,\n        i,\n        j; // seek forward to first removal\n\n    for (i = 0; !map[index[i]] && i < n; ++i); // condense index and value arrays\n\n\n    for (j = i; i < n; ++i) {\n      if (!map[idx = index[i]]) {\n        index[j] = idx;\n        value[j] = value[i];\n        ++j;\n      }\n    }\n\n    size = n - num;\n  }\n\n  function reindex(map) {\n    for (var i = 0, n = size; i < n; ++i) {\n      index[i] = map[index[i]];\n    }\n  }\n\n  function bisect(range, array) {\n    var n;\n\n    if (array) {\n      n = array.length;\n    } else {\n      array = value;\n      n = size;\n    }\n\n    return [(0, _d3Array.bisectLeft)(array, range[0], 0, n), (0, _d3Array.bisectRight)(array, range[1], 0, n)];\n  }\n\n  return {\n    insert: insert,\n    remove: remove,\n    bisect: bisect,\n    reindex: reindex,\n    index: function () {\n      return index;\n    },\n    size: function () {\n      return size;\n    }\n  };\n}\n\nfunction sort(values, index) {\n  values.sort.call(index, function (a, b) {\n    var x = values[a],\n        y = values[b];\n    return x < y ? -1 : x > y ? 1 : 0;\n  });\n  return (0, _d3Array.permute)(values, index);\n}\n\nfunction merge(base, value0, index0, n0, value1, index1, n1, value, index) {\n  var i0 = 0,\n      i1 = 0,\n      i;\n\n  for (i = 0; i0 < n0 && i1 < n1; ++i) {\n    if (value0[i0] < value1[i1]) {\n      value[i] = value0[i0];\n      index[i] = index0[i0++];\n    } else {\n      value[i] = value1[i1];\n      index[i] = index1[i1++] + base;\n    }\n  }\n\n  for (; i0 < n0; ++i0, ++i) {\n    value[i] = value0[i0];\n    index[i] = index0[i0];\n  }\n\n  for (; i1 < n1; ++i1, ++i) {\n    value[i] = value1[i1];\n    index[i] = index1[i1] + base;\n  }\n}\n},{\"./arrays\":\"JpVw\",\"d3-array\":\"K0bd\"}],\"Ony7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = CrossFilter;\n\nvar _Bitmaps = _interopRequireDefault(require(\"./Bitmaps\"));\n\nvar _Dimension = _interopRequireDefault(require(\"./Dimension\"));\n\nvar _SortedIndex = _interopRequireDefault(require(\"./SortedIndex\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * An indexed multi-dimensional filter.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.fields - An array of dimension accessors to filter.\n * @param {Array} params.query - An array of per-dimension range queries.\n */\nfunction CrossFilter(params) {\n  _vegaDataflow.Transform.call(this, (0, _Bitmaps.default)(), params);\n\n  this._indices = null;\n  this._dims = null;\n}\n\nCrossFilter.Definition = {\n  \"type\": \"CrossFilter\",\n  \"metadata\": {},\n  \"params\": [{\n    \"name\": \"fields\",\n    \"type\": \"field\",\n    \"array\": true,\n    \"required\": true\n  }, {\n    \"name\": \"query\",\n    \"type\": \"array\",\n    \"array\": true,\n    \"required\": true,\n    \"content\": {\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(CrossFilter, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  if (!this._dims) {\n    return this.init(_, pulse);\n  } else {\n    var init = _.modified('fields') || _.fields.some(function (f) {\n      return pulse.modified(f.fields);\n    });\n\n    return init ? this.reinit(_, pulse) : this.eval(_, pulse);\n  }\n};\n\nprototype.init = function (_, pulse) {\n  var fields = _.fields,\n      query = _.query,\n      indices = this._indices = {},\n      dims = this._dims = [],\n      m = query.length,\n      i = 0,\n      key,\n      index; // instantiate indices and dimensions\n\n  for (; i < m; ++i) {\n    key = fields[i].fname;\n    index = indices[key] || (indices[key] = (0, _SortedIndex.default)());\n    dims.push((0, _Dimension.default)(index, i, query[i]));\n  }\n\n  return this.eval(_, pulse);\n};\n\nprototype.reinit = function (_, pulse) {\n  var output = pulse.materialize().fork(),\n      fields = _.fields,\n      query = _.query,\n      indices = this._indices,\n      dims = this._dims,\n      bits = this.value,\n      curr = bits.curr(),\n      prev = bits.prev(),\n      all = bits.all(),\n      out = output.rem = output.add,\n      mod = output.mod,\n      m = query.length,\n      adds = {},\n      add,\n      index,\n      key,\n      mods,\n      remMap,\n      modMap,\n      i,\n      n,\n      f; // set prev to current state\n\n  prev.set(curr); // if pulse has remove tuples, process them first\n\n  if (pulse.rem.length) {\n    remMap = this.remove(_, pulse, output);\n  } // if pulse has added tuples, add them to state\n\n\n  if (pulse.add.length) {\n    bits.add(pulse.add);\n  } // if pulse has modified tuples, create an index map\n\n\n  if (pulse.mod.length) {\n    modMap = {};\n\n    for (mods = pulse.mod, i = 0, n = mods.length; i < n; ++i) {\n      modMap[mods[i]._index] = 1;\n    }\n  } // re-initialize indices as needed, update curr bitmap\n\n\n  for (i = 0; i < m; ++i) {\n    f = fields[i];\n\n    if (!dims[i] || _.modified('fields', i) || pulse.modified(f.fields)) {\n      key = f.fname;\n\n      if (!(add = adds[key])) {\n        indices[key] = index = (0, _SortedIndex.default)();\n        adds[key] = add = index.insert(f, pulse.source, 0);\n      }\n\n      dims[i] = (0, _Dimension.default)(index, i, query[i]).onAdd(add, curr);\n    }\n  } // visit each tuple\n  // if filter state changed, push index to add/rem\n  // else if in mod and passes a filter, push index to mod\n\n\n  for (i = 0, n = bits.data().length; i < n; ++i) {\n    if (remMap[i]) {\n      // skip if removed tuple\n      continue;\n    } else if (prev[i] !== curr[i]) {\n      // add if state changed\n      out.push(i);\n    } else if (modMap[i] && curr[i] !== all) {\n      // otherwise, pass mods through\n      mod.push(i);\n    }\n  }\n\n  bits.mask = (1 << m) - 1;\n  return output;\n};\n\nprototype.eval = function (_, pulse) {\n  var output = pulse.materialize().fork(),\n      m = this._dims.length,\n      mask = 0;\n\n  if (pulse.rem.length) {\n    this.remove(_, pulse, output);\n    mask |= (1 << m) - 1;\n  }\n\n  if (_.modified('query') && !_.modified('fields')) {\n    mask |= this.update(_, pulse, output);\n  }\n\n  if (pulse.add.length) {\n    this.insert(_, pulse, output);\n    mask |= (1 << m) - 1;\n  }\n\n  if (pulse.mod.length) {\n    this.modify(pulse, output);\n    mask |= (1 << m) - 1;\n  }\n\n  this.value.mask = mask;\n  return output;\n};\n\nprototype.insert = function (_, pulse, output) {\n  var tuples = pulse.add,\n      bits = this.value,\n      dims = this._dims,\n      indices = this._indices,\n      fields = _.fields,\n      adds = {},\n      out = output.add,\n      k = bits.size(),\n      n = k + tuples.length,\n      m = dims.length,\n      j,\n      key,\n      add; // resize bitmaps and add tuples as needed\n\n  bits.resize(n, m);\n  bits.add(tuples);\n  var curr = bits.curr(),\n      prev = bits.prev(),\n      all = bits.all(); // add to dimensional indices\n\n  for (j = 0; j < m; ++j) {\n    key = fields[j].fname;\n    add = adds[key] || (adds[key] = indices[key].insert(fields[j], tuples, k));\n    dims[j].onAdd(add, curr);\n  } // set previous filters, output if passes at least one filter\n\n\n  for (; k < n; ++k) {\n    prev[k] = all;\n    if (curr[k] !== all) out.push(k);\n  }\n};\n\nprototype.modify = function (pulse, output) {\n  var out = output.mod,\n      bits = this.value,\n      curr = bits.curr(),\n      all = bits.all(),\n      tuples = pulse.mod,\n      i,\n      n,\n      k;\n\n  for (i = 0, n = tuples.length; i < n; ++i) {\n    k = tuples[i]._index;\n    if (curr[k] !== all) out.push(k);\n  }\n};\n\nprototype.remove = function (_, pulse, output) {\n  var indices = this._indices,\n      bits = this.value,\n      curr = bits.curr(),\n      prev = bits.prev(),\n      all = bits.all(),\n      map = {},\n      out = output.rem,\n      tuples = pulse.rem,\n      i,\n      n,\n      k,\n      f; // process tuples, output if passes at least one filter\n\n  for (i = 0, n = tuples.length; i < n; ++i) {\n    k = tuples[i]._index;\n    map[k] = 1; // build index map\n\n    prev[k] = f = curr[k];\n    curr[k] = all;\n    if (f !== all) out.push(k);\n  } // remove from dimensional indices\n\n\n  for (k in indices) {\n    indices[k].remove(n, map);\n  }\n\n  this.reindex(pulse, n, map);\n  return map;\n}; // reindex filters and indices after propagation completes\n\n\nprototype.reindex = function (pulse, num, map) {\n  var indices = this._indices,\n      bits = this.value;\n  pulse.runAfter(function () {\n    var indexMap = bits.remove(num, map);\n\n    for (var key in indices) indices[key].reindex(indexMap);\n  });\n};\n\nprototype.update = function (_, pulse, output) {\n  var dims = this._dims,\n      query = _.query,\n      stamp = pulse.stamp,\n      m = dims.length,\n      mask = 0,\n      i,\n      q; // survey how many queries have changed\n\n  output.filters = 0;\n\n  for (q = 0; q < m; ++q) {\n    if (_.modified('query', q)) {\n      i = q;\n      ++mask;\n    }\n  }\n\n  if (mask === 1) {\n    // only one query changed, use more efficient update\n    mask = dims[i].one;\n    this.incrementOne(dims[i], query[i], output.add, output.rem);\n  } else {\n    // multiple queries changed, perform full record keeping\n    for (q = 0, mask = 0; q < m; ++q) {\n      if (!_.modified('query', q)) continue;\n      mask |= dims[q].one;\n      this.incrementAll(dims[q], query[q], stamp, output.add);\n      output.rem = output.add; // duplicate add/rem for downstream resolve\n    }\n  }\n\n  return mask;\n};\n\nprototype.incrementAll = function (dim, query, stamp, out) {\n  var bits = this.value,\n      seen = bits.seen(),\n      curr = bits.curr(),\n      prev = bits.prev(),\n      index = dim.index(),\n      old = dim.bisect(dim.range),\n      range = dim.bisect(query),\n      lo1 = range[0],\n      hi1 = range[1],\n      lo0 = old[0],\n      hi0 = old[1],\n      one = dim.one,\n      i,\n      j,\n      k; // Fast incremental update based on previous lo index.\n\n  if (lo1 < lo0) {\n    for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n      k = index[i];\n\n      if (seen[k] !== stamp) {\n        prev[k] = curr[k];\n        seen[k] = stamp;\n        out.push(k);\n      }\n\n      curr[k] ^= one;\n    }\n  } else if (lo1 > lo0) {\n    for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n      k = index[i];\n\n      if (seen[k] !== stamp) {\n        prev[k] = curr[k];\n        seen[k] = stamp;\n        out.push(k);\n      }\n\n      curr[k] ^= one;\n    }\n  } // Fast incremental update based on previous hi index.\n\n\n  if (hi1 > hi0) {\n    for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n      k = index[i];\n\n      if (seen[k] !== stamp) {\n        prev[k] = curr[k];\n        seen[k] = stamp;\n        out.push(k);\n      }\n\n      curr[k] ^= one;\n    }\n  } else if (hi1 < hi0) {\n    for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n      k = index[i];\n\n      if (seen[k] !== stamp) {\n        prev[k] = curr[k];\n        seen[k] = stamp;\n        out.push(k);\n      }\n\n      curr[k] ^= one;\n    }\n  }\n\n  dim.range = query.slice();\n};\n\nprototype.incrementOne = function (dim, query, add, rem) {\n  var bits = this.value,\n      curr = bits.curr(),\n      index = dim.index(),\n      old = dim.bisect(dim.range),\n      range = dim.bisect(query),\n      lo1 = range[0],\n      hi1 = range[1],\n      lo0 = old[0],\n      hi0 = old[1],\n      one = dim.one,\n      i,\n      j,\n      k; // Fast incremental update based on previous lo index.\n\n  if (lo1 < lo0) {\n    for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n      k = index[i];\n      curr[k] ^= one;\n      add.push(k);\n    }\n  } else if (lo1 > lo0) {\n    for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n      k = index[i];\n      curr[k] ^= one;\n      rem.push(k);\n    }\n  } // Fast incremental update based on previous hi index.\n\n\n  if (hi1 > hi0) {\n    for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n      k = index[i];\n      curr[k] ^= one;\n      add.push(k);\n    }\n  } else if (hi1 < hi0) {\n    for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n      k = index[i];\n      curr[k] ^= one;\n      rem.push(k);\n    }\n  }\n\n  dim.range = query.slice();\n};\n},{\"./Bitmaps\":\"lj21\",\"./Dimension\":\"PG74\",\"./SortedIndex\":\"qH2J\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"Ik0p\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ResolveFilter;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Selectively filters tuples by resolving against a filter bitmap.\n * Useful for processing the output of a cross-filter transform.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.ignore - A bit mask indicating which filters to ignore.\n * @param {object} params.filter - The per-tuple filter bitmaps. Typically this\n *   parameter value is a reference to a {@link CrossFilter} transform.\n */\nfunction ResolveFilter(params) {\n  _vegaDataflow.Transform.call(this, null, params);\n}\n\nResolveFilter.Definition = {\n  \"type\": \"ResolveFilter\",\n  \"metadata\": {},\n  \"params\": [{\n    \"name\": \"ignore\",\n    \"type\": \"number\",\n    \"required\": true,\n    \"description\": \"A bit mask indicating which filters to ignore.\"\n  }, {\n    \"name\": \"filter\",\n    \"type\": \"object\",\n    \"required\": true,\n    \"description\": \"Per-tuple filter bitmaps from a CrossFilter transform.\"\n  }]\n};\nvar prototype = (0, _vegaUtil.inherits)(ResolveFilter, _vegaDataflow.Transform);\n\nprototype.transform = function (_, pulse) {\n  var ignore = ~(_.ignore || 0),\n      // bit mask where zeros -> dims to ignore\n  bitmap = _.filter,\n      mask = bitmap.mask; // exit early if no relevant filter changes\n\n  if ((mask & ignore) === 0) return pulse.StopPropagation;\n\n  var output = pulse.fork(pulse.ALL),\n      data = bitmap.data(),\n      curr = bitmap.curr(),\n      prev = bitmap.prev(),\n      pass = function (k) {\n    return !(curr[k] & ignore) ? data[k] : null;\n  }; // propagate all mod tuples that pass the filter\n\n\n  output.filter(output.MOD, pass); // determine add & rem tuples via filter functions\n  // for efficiency, we do *not* populate new arrays,\n  // instead we add filter functions applied downstream\n\n  if (!(mask & mask - 1)) {\n    // only one filter changed\n    output.filter(output.ADD, pass);\n    output.filter(output.REM, function (k) {\n      return (curr[k] & ignore) === mask ? data[k] : null;\n    });\n  } else {\n    // multiple filters changed\n    output.filter(output.ADD, function (k) {\n      var c = curr[k] & ignore,\n          f = !c && c ^ prev[k] & ignore;\n      return f ? data[k] : null;\n    });\n    output.filter(output.REM, function (k) {\n      var c = curr[k] & ignore,\n          f = c && !(c ^ (c ^ prev[k] & ignore));\n      return f ? data[k] : null;\n    });\n  } // add filter to source data in case of reflow...\n\n\n  return output.filter(output.SOURCE, function (t) {\n    return pass(t._index);\n  });\n};\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"g8BK\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"crossfilter\", {\n  enumerable: true,\n  get: function () {\n    return _CrossFilter.default;\n  }\n});\nObject.defineProperty(exports, \"resolvefilter\", {\n  enumerable: true,\n  get: function () {\n    return _ResolveFilter.default;\n  }\n});\n\nvar _CrossFilter = _interopRequireDefault(require(\"./src/CrossFilter\"));\n\nvar _ResolveFilter = _interopRequireDefault(require(\"./src/ResolveFilter\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/CrossFilter\":\"Ony7\",\"./src/ResolveFilter\":\"Ik0p\"}],\"tKoW\":[function(require,module,exports) {\nmodule.exports = {\n  \"_from\": \"vega@^5.8\",\n  \"_id\": \"vega@5.8.1\",\n  \"_inBundle\": false,\n  \"_integrity\": \"sha512-+3FN66ROsZdjg5e8ktyoXfdhxsQSCcGgr8vVTbJydqqkt5Qqp9gTDA5j7qutBk0d5/i5rIzN89XYGLRvBXYU0A==\",\n  \"_location\": \"/vega\",\n  \"_phantomChildren\": {},\n  \"_requested\": {\n    \"type\": \"range\",\n    \"registry\": true,\n    \"raw\": \"vega@^5.8\",\n    \"name\": \"vega\",\n    \"escapedName\": \"vega\",\n    \"rawSpec\": \"^5.8\",\n    \"saveSpec\": null,\n    \"fetchSpec\": \"^5.8\"\n  },\n  \"_requiredBy\": [\n    \"/\"\n  ],\n  \"_resolved\": \"https://registry.npmjs.org/vega/-/vega-5.8.1.tgz\",\n  \"_shasum\": \"86234c657958a2e229fbb1c47f82e9e07866ad18\",\n  \"_spec\": \"vega@^5.8\",\n  \"_where\": \"C:\\\\src\\\\SandDance-Master\\\\packages\\\\sanddance-test-es6\",\n  \"author\": {\n    \"name\": \"UW Interactive Data Lab\",\n    \"url\": \"http://idl.cs.washington.edu\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/vega/vega/issues\"\n  },\n  \"bundleDependencies\": false,\n  \"dependencies\": {\n    \"vega-crossfilter\": \"4.0.1\",\n    \"vega-dataflow\": \"5.4.1\",\n    \"vega-encode\": \"4.5.0\",\n    \"vega-event-selector\": \"2.0.1\",\n    \"vega-expression\": \"2.6.2\",\n    \"vega-force\": \"4.0.3\",\n    \"vega-functions\": \"5.5.0\",\n    \"vega-geo\": \"4.2.0\",\n    \"vega-hierarchy\": \"4.0.3\",\n    \"vega-loader\": \"4.1.3\",\n    \"vega-parser\": \"5.11.0\",\n    \"vega-projection\": \"1.3.0\",\n    \"vega-regression\": \"1.0.2\",\n    \"vega-runtime\": \"5.0.2\",\n    \"vega-scale\": \"5.0.0\",\n    \"vega-scenegraph\": \"4.4.1\",\n    \"vega-statistics\": \"1.7.0\",\n    \"vega-time\": \"1.0.0\",\n    \"vega-transforms\": \"4.5.0\",\n    \"vega-typings\": \"0.11.1\",\n    \"vega-util\": \"1.12.0\",\n    \"vega-view\": \"5.3.2\",\n    \"vega-view-transforms\": \"4.5.0\",\n    \"vega-voronoi\": \"4.1.1\",\n    \"vega-wordcloud\": \"4.0.3\"\n  },\n  \"deprecated\": false,\n  \"description\": \"The Vega visualization grammar.\",\n  \"devDependencies\": {\n    \"vega-schema\": \"*\"\n  },\n  \"gitHead\": \"b460f55b7bdf668e855ed2f00d9c88f4e836dcb9\",\n  \"homepage\": \"https://github.com/vega/vega#readme\",\n  \"jsdelivr\": \"build/vega.min.js\",\n  \"keywords\": [\n    \"vega\",\n    \"visualization\",\n    \"interaction\",\n    \"dataflow\",\n    \"library\",\n    \"data\",\n    \"d3\"\n  ],\n  \"license\": \"BSD-3-Clause\",\n  \"main\": \"build/vega-node.js\",\n  \"module\": \"index\",\n  \"name\": \"vega\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/vega/vega.git\"\n  },\n  \"scripts\": {\n    \"build\": \"yarn rollup && node rollup -e && node rollup -m\",\n    \"postbuild\": \"terser build/vega.js -c -m -o build/vega.min.js && terser build/vega-core.js -c -m -o build/vega-core.min.js\",\n    \"postpublish\": \"git push && git push --tags && ./schema-deploy.sh\",\n    \"prebuild\": \"rimraf build && mkdirp build\",\n    \"prepublishOnly\": \"yarn test && yarn build\",\n    \"pretest\": \"yarn prebuild && yarn rollup\",\n    \"rollup\": \"node rollup-node && node rollup && node schema-copy\",\n    \"test\": \"TZ=America/Los_Angeles tape 'test/**/*-test.js' && eslint index.js test\"\n  },\n  \"types\": \"index.d.ts\",\n  \"unpkg\": \"build/vega.min.js\",\n  \"version\": \"5.8.1\"\n}\n;\n},{}],\"RXfG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar Default = 'default';\n\nfunction _default(view) {\n  var cursor = view._signals.cursor; // add cursor signal to dataflow, if needed\n\n  if (!cursor) {\n    view._signals.cursor = cursor = view.add({\n      user: Default,\n      item: null\n    });\n  } // evaluate cursor on each mousemove event\n\n\n  view.on(view.events('view', 'mousemove'), cursor, function (_, event) {\n    var value = cursor.value,\n        user = value ? (0, _vegaUtil.isString)(value) ? value : value.user : Default,\n        item = event.item && event.item.cursor || null;\n    return value && user === value.user && item == value.item ? value : {\n      user: user,\n      item: item\n    };\n  }); // when cursor signal updates, set visible cursor\n\n  view.add(null, function (_) {\n    var user = _.cursor,\n        item = this.value;\n\n    if (!(0, _vegaUtil.isString)(user)) {\n      item = user.item;\n      user = user.user;\n    }\n\n    setCursor(user && user !== Default ? user : item || user);\n    return item;\n  }, {\n    cursor: cursor\n  });\n}\n\nfunction setCursor(cursor) {\n  // set cursor on document body\n  // this ensures cursor applies even if dragging out of view\n  if (typeof document !== 'undefined' && document.body) {\n    document.body.style.cursor = cursor;\n  }\n}\n},{\"vega-util\":\"d61Z\"}],\"TaKI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.dataref = dataref;\nexports.data = data;\nexports.change = change;\nexports.insert = insert;\nexports.remove = remove;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction dataref(view, name) {\n  var data = view._runtime.data;\n\n  if (!(0, _vegaUtil.hasOwnProperty)(data, name)) {\n    (0, _vegaUtil.error)('Unrecognized data set: ' + name);\n  }\n\n  return data[name];\n}\n\nfunction data(name, values) {\n  return arguments.length < 2 ? dataref(this, name).values.value : change.call(this, name, (0, _vegaDataflow.changeset)().remove(_vegaUtil.truthy).insert(values));\n}\n\nfunction change(name, changes) {\n  if (!(0, _vegaDataflow.isChangeSet)(changes)) {\n    (0, _vegaUtil.error)('Second argument to changes must be a changeset.');\n  }\n\n  var dataset = dataref(this, name);\n  dataset.modified = true;\n  return this.pulse(dataset.input, changes);\n}\n\nfunction insert(name, _) {\n  return change.call(this, name, (0, _vegaDataflow.changeset)().insert(_));\n}\n\nfunction remove(name, _) {\n  return change.call(this, name, (0, _vegaDataflow.changeset)().remove(_));\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"hR2H\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.width = width;\nexports.height = height;\nexports.offset = offset;\nexports.resizeRenderer = resizeRenderer;\n\nfunction width(view) {\n  var padding = view.padding();\n  return Math.max(0, view._viewWidth + padding.left + padding.right);\n}\n\nfunction height(view) {\n  var padding = view.padding();\n  return Math.max(0, view._viewHeight + padding.top + padding.bottom);\n}\n\nfunction offset(view) {\n  var padding = view.padding(),\n      origin = view._origin;\n  return [padding.left + origin[0], padding.top + origin[1]];\n}\n\nfunction resizeRenderer(view) {\n  var origin = offset(view),\n      w = width(view),\n      h = height(view);\n\n  view._renderer.background(view._background);\n\n  view._renderer.resize(w, h, origin);\n\n  view._handler.origin(origin);\n\n  view._resizeListeners.forEach(function (handler) {\n    try {\n      handler(w, h);\n    } catch (error) {\n      view.error(error);\n    }\n  });\n}\n},{}],\"IKvH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _renderSize = require(\"./render-size\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\n/**\n * Extend an event with additional view-specific methods.\n * Adds a new property ('vega') to an event that provides a number\n * of methods for querying information about the current interaction.\n * The vega object provides the following methods:\n *   view - Returns the backing View instance.\n *   item - Returns the currently active scenegraph item (if any).\n *   group - Returns the currently active scenegraph group (if any).\n *     This method accepts a single string-typed argument indicating the name\n *     of the desired parent group. The scenegraph will be traversed from\n *     the item up towards the root to search for a matching group. If no\n *     argument is provided the enclosing group for the active item is\n *     returned, unless the item it itself a group, in which case it is\n *     returned directly.\n *   xy - Returns a two-element array containing the x and y coordinates for\n *     mouse or touch events. For touch events, this is based on the first\n *     elements in the changedTouches array. This method accepts a single\n *     argument: either an item instance or mark name that should serve as\n *     the reference coordinate system. If no argument is provided the\n *     top-level view coordinate system is assumed.\n *   x - Returns the current x-coordinate, accepts the same arguments as xy.\n *   y - Returns the current y-coordinate, accepts the same arguments as xy.\n * @param {Event} event - The input event to extend.\n * @param {Item} item - The currently active scenegraph item (if any).\n * @return {Event} - The extended input event.\n */\nfunction _default(view, event, item) {\n  var r = view._renderer,\n      el = r && r.canvas(),\n      p,\n      e,\n      translate;\n\n  if (el) {\n    translate = (0, _renderSize.offset)(view);\n    e = event.changedTouches ? event.changedTouches[0] : event;\n    p = (0, _vegaScenegraph.point)(e, el);\n    p[0] -= translate[0];\n    p[1] -= translate[1];\n  }\n\n  event.dataflow = view;\n  event.item = item;\n  event.vega = extension(view, item, p);\n  return event;\n}\n\nfunction extension(view, item, point) {\n  var itemGroup = item ? item.mark.marktype === 'group' ? item : item.mark.group : null;\n\n  function group(name) {\n    var g = itemGroup,\n        i;\n    if (name) for (i = item; i; i = i.mark.group) {\n      if (i.mark.name === name) {\n        g = i;\n        break;\n      }\n    }\n    return g && g.mark && g.mark.interactive ? g : {};\n  }\n\n  function xy(item) {\n    if (!item) return point;\n    if ((0, _vegaUtil.isString)(item)) item = group(item);\n    var p = point.slice();\n\n    while (item) {\n      p[0] -= item.x || 0;\n      p[1] -= item.y || 0;\n      item = item.mark && item.mark.group;\n    }\n\n    return p;\n  }\n\n  return {\n    view: (0, _vegaUtil.constant)(view),\n    item: (0, _vegaUtil.constant)(item || {}),\n    group: group,\n    xy: xy,\n    x: function (item) {\n      return xy(item)[0];\n    },\n    y: function (item) {\n      return xy(item)[1];\n    }\n  };\n}\n},{\"./render-size\":\"hR2H\",\"vega-util\":\"d61Z\",\"vega-scenegraph\":\"AgKg\"}],\"dZD9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initializeEventConfig = initializeEventConfig;\nexports.events = events;\n\nvar _eventsExtend = _interopRequireDefault(require(\"./events-extend\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst VIEW = 'view',\n      TIMER = 'timer',\n      WINDOW = 'window',\n      NO_TRAP = {\n  trap: false\n};\n/**\n * Initialize event handling configuration.\n * @param {object} config - The configuration settings.\n * @return {object}\n */\n\nfunction initializeEventConfig(config) {\n  const events = (0, _vegaUtil.extend)({\n    defaults: {}\n  }, config);\n\n  const unpack = (obj, keys) => {\n    keys.forEach(k => {\n      if ((0, _vegaUtil.isArray)(obj[k])) obj[k] = (0, _vegaUtil.toSet)(obj[k]);\n    });\n  };\n\n  unpack(events.defaults, ['prevent', 'allow']);\n  unpack(events, ['view', 'window', 'selector']);\n  return events;\n}\n\nfunction prevent(view, type) {\n  var def = view._eventConfig.defaults,\n      prevent = def.prevent,\n      allow = def.allow;\n  return prevent === false || allow === true ? false : prevent === true || allow === false ? true : prevent ? prevent[type] : allow ? !allow[type] : view.preventDefault();\n}\n\nfunction permit(view, key, type) {\n  const rule = view._eventConfig && view._eventConfig[key];\n\n  if (rule === false || (0, _vegaUtil.isObject)(rule) && !rule[type]) {\n    view.warn(`Blocked ${key} ${type} event listener.`);\n    return false;\n  }\n\n  return true;\n}\n/**\n * Create a new event stream from an event source.\n * @param {object} source - The event source to monitor.\n * @param {string} type - The event type.\n * @param {function(object): boolean} [filter] - Event filter function.\n * @return {EventStream}\n */\n\n\nfunction events(source, type, filter) {\n  var view = this,\n      s = new _vegaDataflow.EventStream(filter),\n      send = function (e, item) {\n    view.runAsync(null, () => {\n      if (source === VIEW && prevent(view, type)) {\n        e.preventDefault();\n      }\n\n      s.receive((0, _eventsExtend.default)(view, e, item));\n    });\n  },\n      sources;\n\n  if (source === TIMER) {\n    if (permit(view, 'timer', type)) {\n      view.timer(send, type);\n    }\n  } else if (source === VIEW) {\n    if (permit(view, 'view', type)) {\n      // send traps errors, so use {trap: false} option\n      view.addEventListener(type, send, NO_TRAP);\n    }\n  } else {\n    if (source === WINDOW) {\n      if (permit(view, 'window', type) && typeof window !== 'undefined') {\n        sources = [window];\n      }\n    } else if (typeof document !== 'undefined') {\n      if (permit(view, 'selector', type)) {\n        sources = document.querySelectorAll(source);\n      }\n    }\n\n    if (!sources) {\n      view.warn('Can not resolve event source: ' + source);\n    } else {\n      for (var i = 0, n = sources.length; i < n; ++i) {\n        sources[i].addEventListener(type, send);\n      }\n\n      view._eventListeners.push({\n        type: type,\n        sources: sources,\n        handler: send\n      });\n    }\n  }\n\n  return s;\n}\n},{\"./events-extend\":\"IKvH\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"Kn2s\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction itemFilter(event) {\n  return event.item;\n}\n\nfunction markTarget(event) {\n  // grab upstream collector feeding the mark operator\n  return event.item.mark.source;\n}\n\nfunction invoke(name) {\n  return function (_, event) {\n    return event.vega.view().changeset().encode(event.item, name);\n  };\n}\n\nfunction _default(hoverSet, leaveSet) {\n  hoverSet = [hoverSet || 'hover'];\n  leaveSet = [leaveSet || 'update', hoverSet[0]]; // invoke hover set upon mouseover\n\n  this.on(this.events('view', 'mouseover', itemFilter), markTarget, invoke(hoverSet)); // invoke leave set upon mouseout\n\n  this.on(this.events('view', 'mouseout', itemFilter), markTarget, invoke(leaveSet));\n  return this;\n}\n},{}],\"CuVS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n/**\n * Finalize a View instance that is being removed.\n * Cancel any running timers.\n * Remove all external event listeners.\n * Remove any currently displayed tooltip.\n */\nfunction _default() {\n  var tooltip = this._tooltip,\n      timers = this._timers,\n      listeners = this._eventListeners,\n      n,\n      m,\n      e;\n  n = timers.length;\n\n  while (--n >= 0) {\n    timers[n].stop();\n  }\n\n  n = listeners.length;\n\n  while (--n >= 0) {\n    e = listeners[n];\n    m = e.sources.length;\n\n    while (--m >= 0) {\n      e.sources[m].removeEventListener(e.type, e.handler);\n    }\n  }\n\n  if (tooltip) {\n    tooltip.call(this, this._handler, null, null, null);\n  }\n\n  return this;\n}\n},{}],\"Nkh7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(tag, attr, text) {\n  var el = document.createElement(tag);\n\n  for (var key in attr) el.setAttribute(key, attr[key]);\n\n  if (text != null) el.textContent = text;\n  return el;\n}\n},{}],\"ozHb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _element = _interopRequireDefault(require(\"./element\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar BindClass = 'vega-bind',\n    NameClass = 'vega-bind-name',\n    RadioClass = 'vega-bind-radio',\n    OptionClass = 'vega-option-';\n/**\n * Bind a signal to an external HTML input element. The resulting two-way\n * binding will propagate input changes to signals, and propagate signal\n * changes to the input element state. If this view instance has no parent\n * element, we assume the view is headless and no bindings are created.\n * @param {Element|string} el - The parent DOM element to which the input\n *   element should be appended as a child. If string-valued, this argument\n *   will be treated as a CSS selector. If null or undefined, the parent\n *   element of this view will be used as the element.\n * @param {object} param - The binding parameters which specify the signal\n *   to bind to, the input element type, and type-specific configuration.\n * @return {View} - This view instance.\n */\n\nfunction _default(view, el, binding) {\n  if (!el) return;\n  var param = binding.param,\n      bind = binding.state;\n\n  if (!bind) {\n    bind = binding.state = {\n      elements: null,\n      active: false,\n      set: null,\n      update: function (value) {\n        if (value !== view.signal(param.signal)) {\n          view.runAsync(null, function () {\n            bind.source = true;\n            view.signal(param.signal, value);\n          });\n        }\n      }\n    };\n\n    if (param.debounce) {\n      bind.update = (0, _vegaUtil.debounce)(param.debounce, bind.update);\n    }\n  }\n\n  generate(bind, el, param, view.signal(param.signal));\n\n  if (!bind.active) {\n    view.on(view._signals[param.signal], null, function () {\n      bind.source ? bind.source = false : bind.set(view.signal(param.signal));\n    });\n    bind.active = true;\n  }\n\n  return bind;\n}\n/**\n * Generate an HTML input form element and bind it to a signal.\n */\n\n\nfunction generate(bind, el, param, value) {\n  var div = (0, _element.default)('div', {\n    'class': BindClass\n  });\n  div.appendChild((0, _element.default)('span', {\n    'class': NameClass\n  }, param.name || param.signal));\n  el.appendChild(div);\n  var input = form;\n\n  switch (param.input) {\n    case 'checkbox':\n      input = checkbox;\n      break;\n\n    case 'select':\n      input = select;\n      break;\n\n    case 'radio':\n      input = radio;\n      break;\n\n    case 'range':\n      input = range;\n      break;\n  }\n\n  input(bind, div, param, value);\n}\n/**\n * Generates an arbitrary input form element.\n * The input type is controlled via user-provided parameters.\n */\n\n\nfunction form(bind, el, param, value) {\n  var node = (0, _element.default)('input');\n\n  for (var key in param) {\n    if (key !== 'signal' && key !== 'element') {\n      node.setAttribute(key === 'input' ? 'type' : key, param[key]);\n    }\n  }\n\n  node.setAttribute('name', param.signal);\n  node.value = value;\n  el.appendChild(node);\n  node.addEventListener('input', function () {\n    bind.update(node.value);\n  });\n  bind.elements = [node];\n\n  bind.set = function (value) {\n    node.value = value;\n  };\n}\n/**\n * Generates a checkbox input element.\n */\n\n\nfunction checkbox(bind, el, param, value) {\n  var attr = {\n    type: 'checkbox',\n    name: param.signal\n  };\n  if (value) attr.checked = true;\n  var node = (0, _element.default)('input', attr);\n  el.appendChild(node);\n  node.addEventListener('change', function () {\n    bind.update(node.checked);\n  });\n  bind.elements = [node];\n\n  bind.set = function (value) {\n    node.checked = !!value || null;\n  };\n}\n/**\n * Generates a selection list input element.\n */\n\n\nfunction select(bind, el, param, value) {\n  var node = (0, _element.default)('select', {\n    name: param.signal\n  });\n  param.options.forEach(function (option) {\n    var attr = {\n      value: option\n    };\n    if (valuesEqual(option, value)) attr.selected = true;\n    node.appendChild((0, _element.default)('option', attr, option + ''));\n  });\n  el.appendChild(node);\n  node.addEventListener('change', function () {\n    bind.update(param.options[node.selectedIndex]);\n  });\n  bind.elements = [node];\n\n  bind.set = function (value) {\n    for (var i = 0, n = param.options.length; i < n; ++i) {\n      if (valuesEqual(param.options[i], value)) {\n        node.selectedIndex = i;\n        return;\n      }\n    }\n  };\n}\n/**\n * Generates a radio button group.\n */\n\n\nfunction radio(bind, el, param, value) {\n  var group = (0, _element.default)('span', {\n    'class': RadioClass\n  });\n  el.appendChild(group);\n  bind.elements = param.options.map(function (option) {\n    var id = OptionClass + param.signal + '-' + option;\n    var attr = {\n      id: id,\n      type: 'radio',\n      name: param.signal,\n      value: option\n    };\n    if (valuesEqual(option, value)) attr.checked = true;\n    var input = (0, _element.default)('input', attr);\n    input.addEventListener('change', function () {\n      bind.update(option);\n    });\n    group.appendChild(input);\n    group.appendChild((0, _element.default)('label', {\n      'for': id\n    }, option + ''));\n    return input;\n  });\n\n  bind.set = function (value) {\n    var nodes = bind.elements,\n        i = 0,\n        n = nodes.length;\n\n    for (; i < n; ++i) {\n      if (valuesEqual(nodes[i].value, value)) nodes[i].checked = true;\n    }\n  };\n}\n/**\n * Generates a slider input element.\n */\n\n\nfunction range(bind, el, param, value) {\n  value = value !== undefined ? value : (+param.max + +param.min) / 2;\n  var max = param.max != null ? param.max : Math.max(100, +value) || 100,\n      min = param.min || Math.min(0, max, +value) || 0,\n      step = param.step || (0, _d3Array.tickStep)(min, max, 100);\n  var node = (0, _element.default)('input', {\n    type: 'range',\n    name: param.signal,\n    min: min,\n    max: max,\n    step: step\n  });\n  node.value = value;\n  var label = (0, _element.default)('label', {}, +value);\n  el.appendChild(node);\n  el.appendChild(label);\n\n  function update() {\n    label.textContent = node.value;\n    bind.update(+node.value);\n  } // subscribe to both input and change\n\n\n  node.addEventListener('input', update);\n  node.addEventListener('change', update);\n  bind.elements = [node];\n\n  bind.set = function (value) {\n    node.value = value;\n    label.textContent = value;\n  };\n}\n\nfunction valuesEqual(a, b) {\n  return a === b || a + '' === b + '';\n}\n},{\"./element\":\"Nkh7\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\"}],\"XjlB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _renderSize = require(\"./render-size\");\n\nfunction _default(view, r, el, constructor, scaleFactor, opt) {\n  r = r || new constructor(view.loader());\n  return r.initialize(el, (0, _renderSize.width)(view), (0, _renderSize.height)(view), (0, _renderSize.offset)(view), scaleFactor, opt).background(view._background);\n}\n},{\"./render-size\":\"hR2H\"}],\"yjGJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(view, fn) {\n  return !fn ? null : function () {\n    try {\n      fn.apply(this, arguments);\n    } catch (error) {\n      view.error(error);\n    }\n  };\n}\n},{}],\"qREp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _renderSize = require(\"./render-size\");\n\nvar _trap = _interopRequireDefault(require(\"./trap\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(view, prevHandler, el, constructor) {\n  // instantiate scenegraph handler\n  var handler = new constructor(view.loader(), (0, _trap.default)(view, view.tooltip())).scene(view.scenegraph().root).initialize(el, (0, _renderSize.offset)(view), view); // transfer event handlers\n\n  if (prevHandler) {\n    prevHandler.handlers().forEach(function (h) {\n      handler.on(h.type, h.handler);\n    });\n  }\n\n  return handler;\n}\n},{\"./render-size\":\"hR2H\",\"./trap\":\"yjGJ\"}],\"i1hH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _bind = _interopRequireDefault(require(\"./bind\"));\n\nvar _element = _interopRequireDefault(require(\"./element\"));\n\nvar _initializeRenderer = _interopRequireDefault(require(\"./initialize-renderer\"));\n\nvar _initializeHandler = _interopRequireDefault(require(\"./initialize-handler\"));\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(el, elBind) {\n  var view = this,\n      type = view._renderType,\n      config = view._eventConfig.bind,\n      module = (0, _vegaScenegraph.renderModule)(type),\n      Handler,\n      Renderer; // containing dom element\n\n  el = view._el = el ? lookup(view, el) : null; // select appropriate renderer & handler\n\n  if (!module) view.error('Unrecognized renderer type: ' + type);\n  Handler = module.handler || _vegaScenegraph.CanvasHandler;\n  Renderer = el ? module.renderer : module.headless; // initialize renderer and input handler\n\n  view._renderer = !Renderer ? null : (0, _initializeRenderer.default)(view, view._renderer, el, Renderer);\n  view._handler = (0, _initializeHandler.default)(view, view._handler, el, Handler);\n  view._redraw = true; // initialize signal bindings\n\n  if (el && config !== 'none') {\n    elBind = elBind ? view._elBind = lookup(view, elBind) : el.appendChild((0, _element.default)('div', {\n      'class': 'vega-bindings'\n    }));\n\n    view._bind.forEach(function (_) {\n      if (_.param.element && config !== 'container') {\n        _.element = lookup(view, _.param.element);\n      }\n    });\n\n    view._bind.forEach(function (_) {\n      (0, _bind.default)(view, _.element || elBind, _);\n    });\n  }\n\n  return view;\n}\n\nfunction lookup(view, el) {\n  if (typeof el === 'string') {\n    if (typeof document !== 'undefined') {\n      el = document.querySelector(el);\n\n      if (!el) {\n        view.error('Signal bind element not found: ' + el);\n        return null;\n      }\n    } else {\n      view.error('DOM document instance not found.');\n      return null;\n    }\n  }\n\n  if (el) {\n    try {\n      el.innerHTML = '';\n    } catch (e) {\n      el = null;\n      view.error(e);\n    }\n  }\n\n  return el;\n}\n},{\"./bind\":\"ozHb\",\"./element\":\"Nkh7\",\"./initialize-renderer\":\"XjlB\",\"./initialize-handler\":\"qREp\",\"vega-scenegraph\":\"AgKg\"}],\"nVHV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _initializeRenderer = _interopRequireDefault(require(\"./initialize-renderer\"));\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Render the current scene in a headless fashion.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A Promise that resolves to a renderer.\n */\nasync function _default(view, type, scaleFactor, opt) {\n  const module = (0, _vegaScenegraph.renderModule)(type),\n        ctr = module && module.headless;\n  if (!ctr) (0, _vegaUtil.error)('Unrecognized renderer type: ' + type);\n  await view.runAsync();\n  return (0, _initializeRenderer.default)(view, null, null, ctr, scaleFactor, opt).renderAsync(view._scenegraph.root);\n}\n},{\"./initialize-renderer\":\"XjlB\",\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"QFZT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _renderHeadless = _interopRequireDefault(require(\"./render-headless\"));\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Produce an image URL for the visualization. Depending on the type\n * parameter, the generated URL contains data for either a PNG or SVG image.\n * The URL can be used (for example) to download images of the visualization.\n * This method is asynchronous, returning a Promise instance.\n * @param {string} type - The image type. One of 'svg', 'png' or 'canvas'.\n *   The 'canvas' and 'png' types are synonyms for a PNG image.\n * @return {Promise} - A promise that resolves to an image URL.\n */\nasync function _default(type, scaleFactor) {\n  if (type !== _vegaScenegraph.RenderType.Canvas && type !== _vegaScenegraph.RenderType.SVG && type !== _vegaScenegraph.RenderType.PNG) {\n    (0, _vegaUtil.error)('Unrecognized image type: ' + type);\n  }\n\n  const r = await (0, _renderHeadless.default)(this, type, scaleFactor);\n  return type === _vegaScenegraph.RenderType.SVG ? toBlobURL(r.svg(), 'image/svg+xml') : r.canvas().toDataURL('image/png');\n}\n\nfunction toBlobURL(data, mime) {\n  var blob = new Blob([data], {\n    type: mime\n  });\n  return window.URL.createObjectURL(blob);\n}\n},{\"./render-headless\":\"nVHV\",\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"Ubvp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _renderHeadless = _interopRequireDefault(require(\"./render-headless\"));\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Produce a Canvas instance containing a rendered visualization.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A promise that resolves to a Canvas instance.\n */\nasync function _default(scaleFactor, opt) {\n  const r = await (0, _renderHeadless.default)(this, _vegaScenegraph.RenderType.Canvas, scaleFactor, opt);\n  return r.canvas();\n}\n},{\"./render-headless\":\"nVHV\",\"vega-scenegraph\":\"AgKg\"}],\"mrgi\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _renderHeadless = _interopRequireDefault(require(\"./render-headless\"));\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Produce a rendered SVG string of the visualization.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A promise that resolves to an SVG string.\n */\nasync function _default(scaleFactor) {\n  const r = await (0, _renderHeadless.default)(this, _vegaScenegraph.RenderType.SVG, scaleFactor);\n  return r.svg();\n}\n},{\"./render-headless\":\"nVHV\",\"vega-scenegraph\":\"AgKg\"}],\"vfZA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = ASTNode;\nexports.UnaryExpression = exports.ObjectExpression = exports.MemberExpression = exports.LogicalExpression = exports.ConditionalExpression = exports.CallExpression = exports.BinaryExpression = exports.ArrayExpression = exports.Identifier = exports.Property = exports.Literal = exports.RawCode = void 0;\nvar RawCode = 'RawCode';\nexports.RawCode = RawCode;\nvar Literal = 'Literal';\nexports.Literal = Literal;\nvar Property = 'Property';\nexports.Property = Property;\nvar Identifier = 'Identifier';\nexports.Identifier = Identifier;\nvar ArrayExpression = 'ArrayExpression';\nexports.ArrayExpression = ArrayExpression;\nvar BinaryExpression = 'BinaryExpression';\nexports.BinaryExpression = BinaryExpression;\nvar CallExpression = 'CallExpression';\nexports.CallExpression = CallExpression;\nvar ConditionalExpression = 'ConditionalExpression';\nexports.ConditionalExpression = ConditionalExpression;\nvar LogicalExpression = 'LogicalExpression';\nexports.LogicalExpression = LogicalExpression;\nvar MemberExpression = 'MemberExpression';\nexports.MemberExpression = MemberExpression;\nvar ObjectExpression = 'ObjectExpression';\nexports.ObjectExpression = ObjectExpression;\nvar UnaryExpression = 'UnaryExpression';\nexports.UnaryExpression = UnaryExpression;\n\nfunction ASTNode(type) {\n  this.type = type;\n}\n\nASTNode.prototype.visit = function (visitor) {\n  var node = this,\n      c,\n      i,\n      n;\n  if (visitor(node)) return 1;\n\n  for (c = children(node), i = 0, n = c.length; i < n; ++i) {\n    if (c[i].visit(visitor)) return 1;\n  }\n};\n\nfunction children(node) {\n  switch (node.type) {\n    case ArrayExpression:\n      return node.elements;\n\n    case BinaryExpression:\n    case LogicalExpression:\n      return [node.left, node.right];\n\n    case CallExpression:\n      var args = node.arguments.slice();\n      args.unshift(node.callee);\n      return args;\n\n    case ConditionalExpression:\n      return [node.test, node.consequent, node.alternate];\n\n    case MemberExpression:\n      return [node.object, node.property];\n\n    case ObjectExpression:\n      return node.properties;\n\n    case Property:\n      return [node.key, node.value];\n\n    case UnaryExpression:\n      return [node.argument];\n\n    case Identifier:\n    case Literal:\n    case RawCode:\n    default:\n      return [];\n  }\n}\n},{}],\"HIn2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _ast = _interopRequireDefault(require(\"./ast\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n  The following expression parser is based on Esprima (http://esprima.org/).\n  Original header comment and license for Esprima is included here:\n\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\nvar TokenName, source, index, length, lookahead;\nvar TokenBooleanLiteral = 1,\n    TokenEOF = 2,\n    TokenIdentifier = 3,\n    TokenKeyword = 4,\n    TokenNullLiteral = 5,\n    TokenNumericLiteral = 6,\n    TokenPunctuator = 7,\n    TokenStringLiteral = 8,\n    TokenRegularExpression = 9;\nTokenName = {};\nTokenName[TokenBooleanLiteral] = 'Boolean';\nTokenName[TokenEOF] = '<end>';\nTokenName[TokenIdentifier] = 'Identifier';\nTokenName[TokenKeyword] = 'Keyword';\nTokenName[TokenNullLiteral] = 'Null';\nTokenName[TokenNumericLiteral] = 'Numeric';\nTokenName[TokenPunctuator] = 'Punctuator';\nTokenName[TokenStringLiteral] = 'String';\nTokenName[TokenRegularExpression] = 'RegularExpression';\nvar SyntaxArrayExpression = 'ArrayExpression',\n    SyntaxBinaryExpression = 'BinaryExpression',\n    SyntaxCallExpression = 'CallExpression',\n    SyntaxConditionalExpression = 'ConditionalExpression',\n    SyntaxIdentifier = 'Identifier',\n    SyntaxLiteral = 'Literal',\n    SyntaxLogicalExpression = 'LogicalExpression',\n    SyntaxMemberExpression = 'MemberExpression',\n    SyntaxObjectExpression = 'ObjectExpression',\n    SyntaxProperty = 'Property',\n    SyntaxUnaryExpression = 'UnaryExpression'; // Error messages should be identical to V8.\n\nvar MessageUnexpectedToken = 'Unexpected token %0',\n    MessageUnexpectedNumber = 'Unexpected number',\n    MessageUnexpectedString = 'Unexpected string',\n    MessageUnexpectedIdentifier = 'Unexpected identifier',\n    MessageUnexpectedReserved = 'Unexpected reserved word',\n    MessageUnexpectedEOS = 'Unexpected end of input',\n    MessageInvalidRegExp = 'Invalid regular expression',\n    MessageUnterminatedRegExp = 'Invalid regular expression: missing /',\n    MessageStrictOctalLiteral = 'Octal literals are not allowed in strict mode.',\n    MessageStrictDuplicateProperty = 'Duplicate data property in object literal not allowed in strict mode';\nvar ILLEGAL = 'ILLEGAL',\n    DISABLED = 'Disabled.'; // See also tools/generate-unicode-regex.py.\n\nvar RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"),\n    // eslint-disable-next-line no-misleading-character-class\nRegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"); // Ensure the condition is true, otherwise throw an error.\n// This is only to have a better contract semantic, i.e. another safety net\n// to catch a logic error. The condition shall be fulfilled in normal case.\n// Do NOT use this to enforce a certain condition on any user input.\n\nfunction assert(condition, message) {\n  /* istanbul ignore next */\n  if (!condition) {\n    throw new Error('ASSERT: ' + message);\n  }\n}\n\nfunction isDecimalDigit(ch) {\n  return ch >= 0x30 && ch <= 0x39; // 0..9\n}\n\nfunction isHexDigit(ch) {\n  return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;\n}\n\nfunction isOctalDigit(ch) {\n  return '01234567'.indexOf(ch) >= 0;\n} // 7.2 White Space\n\n\nfunction isWhiteSpace(ch) {\n  return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && [0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(ch) >= 0;\n} // 7.3 Line Terminators\n\n\nfunction isLineTerminator(ch) {\n  return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;\n} // 7.6 Identifier Names and Identifiers\n\n\nfunction isIdentifierStart(ch) {\n  return ch === 0x24 || ch === 0x5F || // $ (dollar) and _ (underscore)\n  ch >= 0x41 && ch <= 0x5A || // A..Z\n  ch >= 0x61 && ch <= 0x7A || // a..z\n  ch === 0x5C || // \\ (backslash)\n  ch >= 0x80 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch));\n}\n\nfunction isIdentifierPart(ch) {\n  return ch === 0x24 || ch === 0x5F || // $ (dollar) and _ (underscore)\n  ch >= 0x41 && ch <= 0x5A || // A..Z\n  ch >= 0x61 && ch <= 0x7A || // a..z\n  ch >= 0x30 && ch <= 0x39 || // 0..9\n  ch === 0x5C || // \\ (backslash)\n  ch >= 0x80 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch));\n} // 7.6.1.1 Keywords\n\n\nvar keywords = {\n  'if': 1,\n  'in': 1,\n  'do': 1,\n  'var': 1,\n  'for': 1,\n  'new': 1,\n  'try': 1,\n  'let': 1,\n  'this': 1,\n  'else': 1,\n  'case': 1,\n  'void': 1,\n  'with': 1,\n  'enum': 1,\n  'while': 1,\n  'break': 1,\n  'catch': 1,\n  'throw': 1,\n  'const': 1,\n  'yield': 1,\n  'class': 1,\n  'super': 1,\n  'return': 1,\n  'typeof': 1,\n  'delete': 1,\n  'switch': 1,\n  'export': 1,\n  'import': 1,\n  'public': 1,\n  'static': 1,\n  'default': 1,\n  'finally': 1,\n  'extends': 1,\n  'package': 1,\n  'private': 1,\n  'function': 1,\n  'continue': 1,\n  'debugger': 1,\n  'interface': 1,\n  'protected': 1,\n  'instanceof': 1,\n  'implements': 1\n};\n\nfunction skipComment() {\n  var ch;\n\n  while (index < length) {\n    ch = source.charCodeAt(index);\n\n    if (isWhiteSpace(ch) || isLineTerminator(ch)) {\n      ++index;\n    } else {\n      break;\n    }\n  }\n}\n\nfunction scanHexEscape(prefix) {\n  var i,\n      len,\n      ch,\n      code = 0;\n  len = prefix === 'u' ? 4 : 2;\n\n  for (i = 0; i < len; ++i) {\n    if (index < length && isHexDigit(source[index])) {\n      ch = source[index++];\n      code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());\n    } else {\n      throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n  }\n\n  return String.fromCharCode(code);\n}\n\nfunction scanUnicodeCodePointEscape() {\n  var ch, code, cu1, cu2;\n  ch = source[index];\n  code = 0; // At least, one hex digit is required.\n\n  if (ch === '}') {\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n  }\n\n  while (index < length) {\n    ch = source[index++];\n\n    if (!isHexDigit(ch)) {\n      break;\n    }\n\n    code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());\n  }\n\n  if (code > 0x10FFFF || ch !== '}') {\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n  } // UTF-16 Encoding\n\n\n  if (code <= 0xFFFF) {\n    return String.fromCharCode(code);\n  }\n\n  cu1 = (code - 0x10000 >> 10) + 0xD800;\n  cu2 = (code - 0x10000 & 1023) + 0xDC00;\n  return String.fromCharCode(cu1, cu2);\n}\n\nfunction getEscapedIdentifier() {\n  var ch, id;\n  ch = source.charCodeAt(index++);\n  id = String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n\n  if (ch === 0x5C) {\n    if (source.charCodeAt(index) !== 0x75) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n\n    ++index;\n    ch = scanHexEscape('u');\n\n    if (!ch || ch === '\\\\' || !isIdentifierStart(ch.charCodeAt(0))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n\n    id = ch;\n  }\n\n  while (index < length) {\n    ch = source.charCodeAt(index);\n\n    if (!isIdentifierPart(ch)) {\n      break;\n    }\n\n    ++index;\n    id += String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n\n    if (ch === 0x5C) {\n      id = id.substr(0, id.length - 1);\n\n      if (source.charCodeAt(index) !== 0x75) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL);\n      }\n\n      ++index;\n      ch = scanHexEscape('u');\n\n      if (!ch || ch === '\\\\' || !isIdentifierPart(ch.charCodeAt(0))) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL);\n      }\n\n      id += ch;\n    }\n  }\n\n  return id;\n}\n\nfunction getIdentifier() {\n  var start, ch;\n  start = index++;\n\n  while (index < length) {\n    ch = source.charCodeAt(index);\n\n    if (ch === 0x5C) {\n      // Blackslash (U+005C) marks Unicode escape sequence.\n      index = start;\n      return getEscapedIdentifier();\n    }\n\n    if (isIdentifierPart(ch)) {\n      ++index;\n    } else {\n      break;\n    }\n  }\n\n  return source.slice(start, index);\n}\n\nfunction scanIdentifier() {\n  var start, id, type;\n  start = index; // Backslash (U+005C) starts an escaped character.\n\n  id = source.charCodeAt(index) === 0x5C ? getEscapedIdentifier() : getIdentifier(); // There is no keyword or literal with only one character.\n  // Thus, it must be an identifier.\n\n  if (id.length === 1) {\n    type = TokenIdentifier;\n  } else if (keywords.hasOwnProperty(id)) {\n    // eslint-disable-line no-prototype-builtins\n    type = TokenKeyword;\n  } else if (id === 'null') {\n    type = TokenNullLiteral;\n  } else if (id === 'true' || id === 'false') {\n    type = TokenBooleanLiteral;\n  } else {\n    type = TokenIdentifier;\n  }\n\n  return {\n    type: type,\n    value: id,\n    start: start,\n    end: index\n  };\n} // 7.7 Punctuators\n\n\nfunction scanPunctuator() {\n  var start = index,\n      code = source.charCodeAt(index),\n      code2,\n      ch1 = source[index],\n      ch2,\n      ch3,\n      ch4;\n\n  switch (code) {\n    // Check for most common single-character punctuators.\n    case 0x2E: // . dot\n\n    case 0x28: // ( open bracket\n\n    case 0x29: // ) close bracket\n\n    case 0x3B: // ; semicolon\n\n    case 0x2C: // , comma\n\n    case 0x7B: // { open curly brace\n\n    case 0x7D: // } close curly brace\n\n    case 0x5B: // [\n\n    case 0x5D: // ]\n\n    case 0x3A: // :\n\n    case 0x3F: // ?\n\n    case 0x7E:\n      // ~\n      ++index;\n      return {\n        type: TokenPunctuator,\n        value: String.fromCharCode(code),\n        start: start,\n        end: index\n      };\n\n    default:\n      code2 = source.charCodeAt(index + 1); // '=' (U+003D) marks an assignment or comparison operator.\n\n      if (code2 === 0x3D) {\n        switch (code) {\n          case 0x2B: // +\n\n          case 0x2D: // -\n\n          case 0x2F: // /\n\n          case 0x3C: // <\n\n          case 0x3E: // >\n\n          case 0x5E: // ^\n\n          case 0x7C: // |\n\n          case 0x25: // %\n\n          case 0x26: // &\n\n          case 0x2A:\n            // *\n            index += 2;\n            return {\n              type: TokenPunctuator,\n              value: String.fromCharCode(code) + String.fromCharCode(code2),\n              start: start,\n              end: index\n            };\n\n          case 0x21: // !\n\n          case 0x3D:\n            // =\n            index += 2; // !== and ===\n\n            if (source.charCodeAt(index) === 0x3D) {\n              ++index;\n            }\n\n            return {\n              type: TokenPunctuator,\n              value: source.slice(start, index),\n              start: start,\n              end: index\n            };\n        }\n      }\n\n  } // 4-character punctuator: >>>=\n\n\n  ch4 = source.substr(index, 4);\n\n  if (ch4 === '>>>=') {\n    index += 4;\n    return {\n      type: TokenPunctuator,\n      value: ch4,\n      start: start,\n      end: index\n    };\n  } // 3-character punctuators: === !== >>> <<= >>=\n\n\n  ch3 = ch4.substr(0, 3);\n\n  if (ch3 === '>>>' || ch3 === '<<=' || ch3 === '>>=') {\n    index += 3;\n    return {\n      type: TokenPunctuator,\n      value: ch3,\n      start: start,\n      end: index\n    };\n  } // Other 2-character punctuators: ++ -- << >> && ||\n\n\n  ch2 = ch3.substr(0, 2);\n\n  if (ch1 === ch2[1] && '+-<>&|'.indexOf(ch1) >= 0 || ch2 === '=>') {\n    index += 2;\n    return {\n      type: TokenPunctuator,\n      value: ch2,\n      start: start,\n      end: index\n    };\n  } // 1-character punctuators: < > = ! + - * % & | ^ /\n\n\n  if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {\n    ++index;\n    return {\n      type: TokenPunctuator,\n      value: ch1,\n      start: start,\n      end: index\n    };\n  }\n\n  throwError({}, MessageUnexpectedToken, ILLEGAL);\n} // 7.8.3 Numeric Literals\n\n\nfunction scanHexLiteral(start) {\n  var number = '';\n\n  while (index < length) {\n    if (!isHexDigit(source[index])) {\n      break;\n    }\n\n    number += source[index++];\n  }\n\n  if (number.length === 0) {\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n  }\n\n  if (isIdentifierStart(source.charCodeAt(index))) {\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n  }\n\n  return {\n    type: TokenNumericLiteral,\n    value: parseInt('0x' + number, 16),\n    start: start,\n    end: index\n  };\n}\n\nfunction scanOctalLiteral(start) {\n  var number = '0' + source[index++];\n\n  while (index < length) {\n    if (!isOctalDigit(source[index])) {\n      break;\n    }\n\n    number += source[index++];\n  }\n\n  if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n  }\n\n  return {\n    type: TokenNumericLiteral,\n    value: parseInt(number, 8),\n    octal: true,\n    start: start,\n    end: index\n  };\n}\n\nfunction scanNumericLiteral() {\n  var number, start, ch;\n  ch = source[index];\n  assert(isDecimalDigit(ch.charCodeAt(0)) || ch === '.', 'Numeric literal must start with a decimal digit or a decimal point');\n  start = index;\n  number = '';\n\n  if (ch !== '.') {\n    number = source[index++];\n    ch = source[index]; // Hex number starts with '0x'.\n    // Octal number starts with '0'.\n\n    if (number === '0') {\n      if (ch === 'x' || ch === 'X') {\n        ++index;\n        return scanHexLiteral(start);\n      }\n\n      if (isOctalDigit(ch)) {\n        return scanOctalLiteral(start);\n      } // decimal number starts with '0' such as '09' is illegal.\n\n\n      if (ch && isDecimalDigit(ch.charCodeAt(0))) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL);\n      }\n    }\n\n    while (isDecimalDigit(source.charCodeAt(index))) {\n      number += source[index++];\n    }\n\n    ch = source[index];\n  }\n\n  if (ch === '.') {\n    number += source[index++];\n\n    while (isDecimalDigit(source.charCodeAt(index))) {\n      number += source[index++];\n    }\n\n    ch = source[index];\n  }\n\n  if (ch === 'e' || ch === 'E') {\n    number += source[index++];\n    ch = source[index];\n\n    if (ch === '+' || ch === '-') {\n      number += source[index++];\n    }\n\n    if (isDecimalDigit(source.charCodeAt(index))) {\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number += source[index++];\n      }\n    } else {\n      throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n  }\n\n  if (isIdentifierStart(source.charCodeAt(index))) {\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n  }\n\n  return {\n    type: TokenNumericLiteral,\n    value: parseFloat(number),\n    start: start,\n    end: index\n  };\n} // 7.8.4 String Literals\n\n\nfunction scanStringLiteral() {\n  var str = '',\n      quote,\n      start,\n      ch,\n      code,\n      octal = false;\n  quote = source[index];\n  assert(quote === '\\'' || quote === '\"', 'String literal must starts with a quote');\n  start = index;\n  ++index;\n\n  while (index < length) {\n    ch = source[index++];\n\n    if (ch === quote) {\n      quote = '';\n      break;\n    } else if (ch === '\\\\') {\n      ch = source[index++];\n\n      if (!ch || !isLineTerminator(ch.charCodeAt(0))) {\n        switch (ch) {\n          case 'u':\n          case 'x':\n            if (source[index] === '{') {\n              ++index;\n              str += scanUnicodeCodePointEscape();\n            } else {\n              str += scanHexEscape(ch);\n            }\n\n            break;\n\n          case 'n':\n            str += '\\n';\n            break;\n\n          case 'r':\n            str += '\\r';\n            break;\n\n          case 't':\n            str += '\\t';\n            break;\n\n          case 'b':\n            str += '\\b';\n            break;\n\n          case 'f':\n            str += '\\f';\n            break;\n\n          case 'v':\n            str += '\\x0B';\n            break;\n\n          default:\n            if (isOctalDigit(ch)) {\n              code = '01234567'.indexOf(ch); // \\0 is not octal escape sequence\n\n              if (code !== 0) {\n                octal = true;\n              }\n\n              if (index < length && isOctalDigit(source[index])) {\n                octal = true;\n                code = code * 8 + '01234567'.indexOf(source[index++]); // 3 digits are only allowed when string starts\n                // with 0, 1, 2, 3\n\n                if ('0123'.indexOf(ch) >= 0 && index < length && isOctalDigit(source[index])) {\n                  code = code * 8 + '01234567'.indexOf(source[index++]);\n                }\n              }\n\n              str += String.fromCharCode(code);\n            } else {\n              str += ch;\n            }\n\n            break;\n        }\n      } else {\n        if (ch === '\\r' && source[index] === '\\n') {\n          ++index;\n        }\n      }\n    } else if (isLineTerminator(ch.charCodeAt(0))) {\n      break;\n    } else {\n      str += ch;\n    }\n  }\n\n  if (quote !== '') {\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n  }\n\n  return {\n    type: TokenStringLiteral,\n    value: str,\n    octal: octal,\n    start: start,\n    end: index\n  };\n}\n\nfunction testRegExp(pattern, flags) {\n  var tmp = pattern;\n\n  if (flags.indexOf('u') >= 0) {\n    // Replace each astral symbol and every Unicode code point\n    // escape sequence with a single ASCII symbol to avoid throwing on\n    // regular expressions that are only valid in combination with the\n    // `/u` flag.\n    // Note: replacing with the ASCII symbol `x` might cause false\n    // negatives in unlikely scenarios. For example, `[\\u{61}-b]` is a\n    // perfectly valid pattern that is equivalent to `[a-b]`, but it\n    // would be replaced by `[x-b]` which throws an error.\n    tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, function ($0, $1) {\n      if (parseInt($1, 16) <= 0x10FFFF) {\n        return 'x';\n      }\n\n      throwError({}, MessageInvalidRegExp);\n    }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, 'x');\n  } // First, detect invalid regular expressions.\n\n\n  try {\n    new RegExp(tmp);\n  } catch (e) {\n    throwError({}, MessageInvalidRegExp);\n  } // Return a regular expression object for this pattern-flag pair, or\n  // `null` in case the current environment doesn't support the flags it\n  // uses.\n\n\n  try {\n    return new RegExp(pattern, flags);\n  } catch (exception) {\n    return null;\n  }\n}\n\nfunction scanRegExpBody() {\n  var ch, str, classMarker, terminated, body;\n  ch = source[index];\n  assert(ch === '/', 'Regular expression literal must start with a slash');\n  str = source[index++];\n  classMarker = false;\n  terminated = false;\n\n  while (index < length) {\n    ch = source[index++];\n    str += ch;\n\n    if (ch === '\\\\') {\n      ch = source[index++]; // ECMA-262 7.8.5\n\n      if (isLineTerminator(ch.charCodeAt(0))) {\n        throwError({}, MessageUnterminatedRegExp);\n      }\n\n      str += ch;\n    } else if (isLineTerminator(ch.charCodeAt(0))) {\n      throwError({}, MessageUnterminatedRegExp);\n    } else if (classMarker) {\n      if (ch === ']') {\n        classMarker = false;\n      }\n    } else {\n      if (ch === '/') {\n        terminated = true;\n        break;\n      } else if (ch === '[') {\n        classMarker = true;\n      }\n    }\n  }\n\n  if (!terminated) {\n    throwError({}, MessageUnterminatedRegExp);\n  } // Exclude leading and trailing slash.\n\n\n  body = str.substr(1, str.length - 2);\n  return {\n    value: body,\n    literal: str\n  };\n}\n\nfunction scanRegExpFlags() {\n  var ch, str, flags;\n  str = '';\n  flags = '';\n\n  while (index < length) {\n    ch = source[index];\n\n    if (!isIdentifierPart(ch.charCodeAt(0))) {\n      break;\n    }\n\n    ++index;\n\n    if (ch === '\\\\' && index < length) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL);\n    } else {\n      flags += ch;\n      str += ch;\n    }\n  }\n\n  if (flags.search(/[^gimuy]/g) >= 0) {\n    throwError({}, MessageInvalidRegExp, flags);\n  }\n\n  return {\n    value: flags,\n    literal: str\n  };\n}\n\nfunction scanRegExp() {\n  var start, body, flags, value;\n  lookahead = null;\n  skipComment();\n  start = index;\n  body = scanRegExpBody();\n  flags = scanRegExpFlags();\n  value = testRegExp(body.value, flags.value);\n  return {\n    literal: body.literal + flags.literal,\n    value: value,\n    regex: {\n      pattern: body.value,\n      flags: flags.value\n    },\n    start: start,\n    end: index\n  };\n}\n\nfunction isIdentifierName(token) {\n  return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n}\n\nfunction advance() {\n  var ch;\n  skipComment();\n\n  if (index >= length) {\n    return {\n      type: TokenEOF,\n      start: index,\n      end: index\n    };\n  }\n\n  ch = source.charCodeAt(index);\n\n  if (isIdentifierStart(ch)) {\n    return scanIdentifier();\n  } // Very common: ( and ) and ;\n\n\n  if (ch === 0x28 || ch === 0x29 || ch === 0x3B) {\n    return scanPunctuator();\n  } // String literal starts with single quote (U+0027) or double quote (U+0022).\n\n\n  if (ch === 0x27 || ch === 0x22) {\n    return scanStringLiteral();\n  } // Dot (.) U+002E can also start a floating-point number, hence the need\n  // to check the next character.\n\n\n  if (ch === 0x2E) {\n    if (isDecimalDigit(source.charCodeAt(index + 1))) {\n      return scanNumericLiteral();\n    }\n\n    return scanPunctuator();\n  }\n\n  if (isDecimalDigit(ch)) {\n    return scanNumericLiteral();\n  }\n\n  return scanPunctuator();\n}\n\nfunction lex() {\n  var token;\n  token = lookahead;\n  index = token.end;\n  lookahead = advance();\n  index = token.end;\n  return token;\n}\n\nfunction peek() {\n  var pos;\n  pos = index;\n  lookahead = advance();\n  index = pos;\n}\n\nfunction finishArrayExpression(elements) {\n  var node = new _ast.default(SyntaxArrayExpression);\n  node.elements = elements;\n  return node;\n}\n\nfunction finishBinaryExpression(operator, left, right) {\n  var node = new _ast.default(operator === '||' || operator === '&&' ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n  node.operator = operator;\n  node.left = left;\n  node.right = right;\n  return node;\n}\n\nfunction finishCallExpression(callee, args) {\n  var node = new _ast.default(SyntaxCallExpression);\n  node.callee = callee;\n  node.arguments = args;\n  return node;\n}\n\nfunction finishConditionalExpression(test, consequent, alternate) {\n  var node = new _ast.default(SyntaxConditionalExpression);\n  node.test = test;\n  node.consequent = consequent;\n  node.alternate = alternate;\n  return node;\n}\n\nfunction finishIdentifier(name) {\n  var node = new _ast.default(SyntaxIdentifier);\n  node.name = name;\n  return node;\n}\n\nfunction finishLiteral(token) {\n  var node = new _ast.default(SyntaxLiteral);\n  node.value = token.value;\n  node.raw = source.slice(token.start, token.end);\n\n  if (token.regex) {\n    if (node.raw === '//') {\n      node.raw = '/(?:)/';\n    }\n\n    node.regex = token.regex;\n  }\n\n  return node;\n}\n\nfunction finishMemberExpression(accessor, object, property) {\n  var node = new _ast.default(SyntaxMemberExpression);\n  node.computed = accessor === '[';\n  node.object = object;\n  node.property = property;\n  if (!node.computed) property.member = true;\n  return node;\n}\n\nfunction finishObjectExpression(properties) {\n  var node = new _ast.default(SyntaxObjectExpression);\n  node.properties = properties;\n  return node;\n}\n\nfunction finishProperty(kind, key, value) {\n  var node = new _ast.default(SyntaxProperty);\n  node.key = key;\n  node.value = value;\n  node.kind = kind;\n  return node;\n}\n\nfunction finishUnaryExpression(operator, argument) {\n  var node = new _ast.default(SyntaxUnaryExpression);\n  node.operator = operator;\n  node.argument = argument;\n  node.prefix = true;\n  return node;\n} // Throw an exception\n\n\nfunction throwError(token, messageFormat) {\n  var error,\n      args = Array.prototype.slice.call(arguments, 2),\n      msg = messageFormat.replace(/%(\\d)/g, function (whole, index) {\n    assert(index < args.length, 'Message reference must be in range');\n    return args[index];\n  });\n  error = new Error(msg);\n  error.index = index;\n  error.description = msg;\n  throw error;\n} // Throw an exception because of the token.\n\n\nfunction throwUnexpected(token) {\n  if (token.type === TokenEOF) {\n    throwError(token, MessageUnexpectedEOS);\n  }\n\n  if (token.type === TokenNumericLiteral) {\n    throwError(token, MessageUnexpectedNumber);\n  }\n\n  if (token.type === TokenStringLiteral) {\n    throwError(token, MessageUnexpectedString);\n  }\n\n  if (token.type === TokenIdentifier) {\n    throwError(token, MessageUnexpectedIdentifier);\n  }\n\n  if (token.type === TokenKeyword) {\n    throwError(token, MessageUnexpectedReserved);\n  } // BooleanLiteral, NullLiteral, or Punctuator.\n\n\n  throwError(token, MessageUnexpectedToken, token.value);\n} // Expect the next token to match the specified punctuator.\n// If not, an exception will be thrown.\n\n\nfunction expect(value) {\n  var token = lex();\n\n  if (token.type !== TokenPunctuator || token.value !== value) {\n    throwUnexpected(token);\n  }\n} // Return true if the next token matches the specified punctuator.\n\n\nfunction match(value) {\n  return lookahead.type === TokenPunctuator && lookahead.value === value;\n} // Return true if the next token matches the specified keyword\n\n\nfunction matchKeyword(keyword) {\n  return lookahead.type === TokenKeyword && lookahead.value === keyword;\n} // 11.1.4 Array Initialiser\n\n\nfunction parseArrayInitialiser() {\n  var elements = [];\n  index = lookahead.start;\n  expect('[');\n\n  while (!match(']')) {\n    if (match(',')) {\n      lex();\n      elements.push(null);\n    } else {\n      elements.push(parseConditionalExpression());\n\n      if (!match(']')) {\n        expect(',');\n      }\n    }\n  }\n\n  lex();\n  return finishArrayExpression(elements);\n} // 11.1.5 Object Initialiser\n\n\nfunction parseObjectPropertyKey() {\n  var token;\n  index = lookahead.start;\n  token = lex(); // Note: This function is called only from parseObjectProperty(), where\n  // EOF and Punctuator tokens are already filtered out.\n\n  if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n    if (token.octal) {\n      throwError(token, MessageStrictOctalLiteral);\n    }\n\n    return finishLiteral(token);\n  }\n\n  return finishIdentifier(token.value);\n}\n\nfunction parseObjectProperty() {\n  var token, key, id, value;\n  index = lookahead.start;\n  token = lookahead;\n\n  if (token.type === TokenIdentifier) {\n    id = parseObjectPropertyKey();\n    expect(':');\n    value = parseConditionalExpression();\n    return finishProperty('init', id, value);\n  }\n\n  if (token.type === TokenEOF || token.type === TokenPunctuator) {\n    throwUnexpected(token);\n  } else {\n    key = parseObjectPropertyKey();\n    expect(':');\n    value = parseConditionalExpression();\n    return finishProperty('init', key, value);\n  }\n}\n\nfunction parseObjectInitialiser() {\n  var properties = [],\n      property,\n      name,\n      key,\n      map = {},\n      toString = String;\n  index = lookahead.start;\n  expect('{');\n\n  while (!match('}')) {\n    property = parseObjectProperty();\n\n    if (property.key.type === SyntaxIdentifier) {\n      name = property.key.name;\n    } else {\n      name = toString(property.key.value);\n    }\n\n    key = '$' + name;\n\n    if (Object.prototype.hasOwnProperty.call(map, key)) {\n      throwError({}, MessageStrictDuplicateProperty);\n    } else {\n      map[key] = true;\n    }\n\n    properties.push(property);\n\n    if (!match('}')) {\n      expect(',');\n    }\n  }\n\n  expect('}');\n  return finishObjectExpression(properties);\n} // 11.1.6 The Grouping Operator\n\n\nfunction parseGroupExpression() {\n  var expr;\n  expect('(');\n  expr = parseExpression();\n  expect(')');\n  return expr;\n} // 11.1 Primary Expressions\n\n\nvar legalKeywords = {\n  \"if\": 1,\n  \"this\": 1\n};\n\nfunction parsePrimaryExpression() {\n  var type, token, expr;\n\n  if (match('(')) {\n    return parseGroupExpression();\n  }\n\n  if (match('[')) {\n    return parseArrayInitialiser();\n  }\n\n  if (match('{')) {\n    return parseObjectInitialiser();\n  }\n\n  type = lookahead.type;\n  index = lookahead.start;\n\n  if (type === TokenIdentifier || legalKeywords[lookahead.value]) {\n    expr = finishIdentifier(lex().value);\n  } else if (type === TokenStringLiteral || type === TokenNumericLiteral) {\n    if (lookahead.octal) {\n      throwError(lookahead, MessageStrictOctalLiteral);\n    }\n\n    expr = finishLiteral(lex());\n  } else if (type === TokenKeyword) {\n    throw new Error(DISABLED);\n  } else if (type === TokenBooleanLiteral) {\n    token = lex();\n    token.value = token.value === 'true';\n    expr = finishLiteral(token);\n  } else if (type === TokenNullLiteral) {\n    token = lex();\n    token.value = null;\n    expr = finishLiteral(token);\n  } else if (match('/') || match('/=')) {\n    expr = finishLiteral(scanRegExp());\n    peek();\n  } else {\n    throwUnexpected(lex());\n  }\n\n  return expr;\n} // 11.2 Left-Hand-Side Expressions\n\n\nfunction parseArguments() {\n  var args = [];\n  expect('(');\n\n  if (!match(')')) {\n    while (index < length) {\n      args.push(parseConditionalExpression());\n\n      if (match(')')) {\n        break;\n      }\n\n      expect(',');\n    }\n  }\n\n  expect(')');\n  return args;\n}\n\nfunction parseNonComputedProperty() {\n  var token;\n  index = lookahead.start;\n  token = lex();\n\n  if (!isIdentifierName(token)) {\n    throwUnexpected(token);\n  }\n\n  return finishIdentifier(token.value);\n}\n\nfunction parseNonComputedMember() {\n  expect('.');\n  return parseNonComputedProperty();\n}\n\nfunction parseComputedMember() {\n  var expr;\n  expect('[');\n  expr = parseExpression();\n  expect(']');\n  return expr;\n}\n\nfunction parseLeftHandSideExpressionAllowCall() {\n  var expr, args, property;\n  expr = parsePrimaryExpression();\n\n  for (;;) {\n    if (match('.')) {\n      property = parseNonComputedMember();\n      expr = finishMemberExpression('.', expr, property);\n    } else if (match('(')) {\n      args = parseArguments();\n      expr = finishCallExpression(expr, args);\n    } else if (match('[')) {\n      property = parseComputedMember();\n      expr = finishMemberExpression('[', expr, property);\n    } else {\n      break;\n    }\n  }\n\n  return expr;\n} // 11.3 Postfix Expressions\n\n\nfunction parsePostfixExpression() {\n  var expr = parseLeftHandSideExpressionAllowCall();\n\n  if (lookahead.type === TokenPunctuator) {\n    if (match('++') || match('--')) {\n      throw new Error(DISABLED);\n    }\n  }\n\n  return expr;\n} // 11.4 Unary Operators\n\n\nfunction parseUnaryExpression() {\n  var token, expr;\n\n  if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) {\n    expr = parsePostfixExpression();\n  } else if (match('++') || match('--')) {\n    throw new Error(DISABLED);\n  } else if (match('+') || match('-') || match('~') || match('!')) {\n    token = lex();\n    expr = parseUnaryExpression();\n    expr = finishUnaryExpression(token.value, expr);\n  } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {\n    throw new Error(DISABLED);\n  } else {\n    expr = parsePostfixExpression();\n  }\n\n  return expr;\n}\n\nfunction binaryPrecedence(token) {\n  var prec = 0;\n\n  if (token.type !== TokenPunctuator && token.type !== TokenKeyword) {\n    return 0;\n  }\n\n  switch (token.value) {\n    case '||':\n      prec = 1;\n      break;\n\n    case '&&':\n      prec = 2;\n      break;\n\n    case '|':\n      prec = 3;\n      break;\n\n    case '^':\n      prec = 4;\n      break;\n\n    case '&':\n      prec = 5;\n      break;\n\n    case '==':\n    case '!=':\n    case '===':\n    case '!==':\n      prec = 6;\n      break;\n\n    case '<':\n    case '>':\n    case '<=':\n    case '>=':\n    case 'instanceof':\n    case 'in':\n      prec = 7;\n      break;\n\n    case '<<':\n    case '>>':\n    case '>>>':\n      prec = 8;\n      break;\n\n    case '+':\n    case '-':\n      prec = 9;\n      break;\n\n    case '*':\n    case '/':\n    case '%':\n      prec = 11;\n      break;\n\n    default:\n      break;\n  }\n\n  return prec;\n} // 11.5 Multiplicative Operators\n// 11.6 Additive Operators\n// 11.7 Bitwise Shift Operators\n// 11.8 Relational Operators\n// 11.9 Equality Operators\n// 11.10 Binary Bitwise Operators\n// 11.11 Binary Logical Operators\n\n\nfunction parseBinaryExpression() {\n  var marker, markers, expr, token, prec, stack, right, operator, left, i;\n  marker = lookahead;\n  left = parseUnaryExpression();\n  token = lookahead;\n  prec = binaryPrecedence(token);\n\n  if (prec === 0) {\n    return left;\n  }\n\n  token.prec = prec;\n  lex();\n  markers = [marker, lookahead];\n  right = parseUnaryExpression();\n  stack = [left, token, right];\n\n  while ((prec = binaryPrecedence(lookahead)) > 0) {\n    // Reduce: make a binary expression from the three topmost entries.\n    while (stack.length > 2 && prec <= stack[stack.length - 2].prec) {\n      right = stack.pop();\n      operator = stack.pop().value;\n      left = stack.pop();\n      markers.pop();\n      expr = finishBinaryExpression(operator, left, right);\n      stack.push(expr);\n    } // Shift.\n\n\n    token = lex();\n    token.prec = prec;\n    stack.push(token);\n    markers.push(lookahead);\n    expr = parseUnaryExpression();\n    stack.push(expr);\n  } // Final reduce to clean-up the stack.\n\n\n  i = stack.length - 1;\n  expr = stack[i];\n  markers.pop();\n\n  while (i > 1) {\n    markers.pop();\n    expr = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n    i -= 2;\n  }\n\n  return expr;\n} // 11.12 Conditional Operator\n\n\nfunction parseConditionalExpression() {\n  var expr, consequent, alternate;\n  expr = parseBinaryExpression();\n\n  if (match('?')) {\n    lex();\n    consequent = parseConditionalExpression();\n    expect(':');\n    alternate = parseConditionalExpression();\n    expr = finishConditionalExpression(expr, consequent, alternate);\n  }\n\n  return expr;\n} // 11.14 Comma Operator\n\n\nfunction parseExpression() {\n  var expr = parseConditionalExpression();\n\n  if (match(',')) {\n    throw new Error(DISABLED); // no sequence expressions\n  }\n\n  return expr;\n}\n\nfunction _default(code) {\n  source = code;\n  index = 0;\n  length = source.length;\n  lookahead = null;\n  peek();\n  var expr = parseExpression();\n\n  if (lookahead.type !== TokenEOF) {\n    throw new Error(\"Unexpect token after expression.\");\n  }\n\n  return expr;\n}\n},{\"./ast\":\"vfZA\"}],\"zPFH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\nvar _default = {\n  NaN: 'NaN',\n  E: 'Math.E',\n  LN2: 'Math.LN2',\n  LN10: 'Math.LN10',\n  LOG2E: 'Math.LOG2E',\n  LOG10E: 'Math.LOG10E',\n  PI: 'Math.PI',\n  SQRT1_2: 'Math.SQRT1_2',\n  SQRT2: 'Math.SQRT2',\n  MIN_VALUE: 'Number.MIN_VALUE',\n  MAX_VALUE: 'Number.MAX_VALUE'\n};\nexports.default = _default;\n},{}],\"N5Bk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(codegen) {\n  function fncall(name, args, cast, type) {\n    var obj = codegen(args[0]);\n\n    if (cast) {\n      obj = cast + '(' + obj + ')';\n      if (cast.lastIndexOf('new ', 0) === 0) obj = '(' + obj + ')';\n    }\n\n    return obj + '.' + name + (type < 0 ? '' : type === 0 ? '()' : '(' + args.slice(1).map(codegen).join(',') + ')');\n  }\n\n  function fn(name, cast, type) {\n    return function (args) {\n      return fncall(name, args, cast, type);\n    };\n  }\n\n  var DATE = 'new Date',\n      STRING = 'String',\n      REGEXP = 'RegExp';\n  return {\n    // MATH functions\n    isNaN: 'Number.isNaN',\n    isFinite: 'Number.isFinite',\n    abs: 'Math.abs',\n    acos: 'Math.acos',\n    asin: 'Math.asin',\n    atan: 'Math.atan',\n    atan2: 'Math.atan2',\n    ceil: 'Math.ceil',\n    cos: 'Math.cos',\n    exp: 'Math.exp',\n    floor: 'Math.floor',\n    log: 'Math.log',\n    max: 'Math.max',\n    min: 'Math.min',\n    pow: 'Math.pow',\n    random: 'Math.random',\n    round: 'Math.round',\n    sin: 'Math.sin',\n    sqrt: 'Math.sqrt',\n    tan: 'Math.tan',\n    clamp: function (args) {\n      if (args.length < 3) (0, _vegaUtil.error)('Missing arguments to clamp function.');\n      if (args.length > 3) (0, _vegaUtil.error)('Too many arguments to clamp function.');\n      var a = args.map(codegen);\n      return 'Math.max(' + a[1] + ', Math.min(' + a[2] + ',' + a[0] + '))';\n    },\n    // DATE functions\n    now: 'Date.now',\n    utc: 'Date.UTC',\n    datetime: DATE,\n    date: fn('getDate', DATE, 0),\n    day: fn('getDay', DATE, 0),\n    year: fn('getFullYear', DATE, 0),\n    month: fn('getMonth', DATE, 0),\n    hours: fn('getHours', DATE, 0),\n    minutes: fn('getMinutes', DATE, 0),\n    seconds: fn('getSeconds', DATE, 0),\n    milliseconds: fn('getMilliseconds', DATE, 0),\n    time: fn('getTime', DATE, 0),\n    timezoneoffset: fn('getTimezoneOffset', DATE, 0),\n    utcdate: fn('getUTCDate', DATE, 0),\n    utcday: fn('getUTCDay', DATE, 0),\n    utcyear: fn('getUTCFullYear', DATE, 0),\n    utcmonth: fn('getUTCMonth', DATE, 0),\n    utchours: fn('getUTCHours', DATE, 0),\n    utcminutes: fn('getUTCMinutes', DATE, 0),\n    utcseconds: fn('getUTCSeconds', DATE, 0),\n    utcmilliseconds: fn('getUTCMilliseconds', DATE, 0),\n    // sequence functions\n    length: fn('length', null, -1),\n    join: fn('join', null),\n    indexof: fn('indexOf', null),\n    lastindexof: fn('lastIndexOf', null),\n    slice: fn('slice', null),\n    reverse: function (args) {\n      return '(' + codegen(args[0]) + ').slice().reverse()';\n    },\n    // STRING functions\n    parseFloat: 'parseFloat',\n    parseInt: 'parseInt',\n    upper: fn('toUpperCase', STRING, 0),\n    lower: fn('toLowerCase', STRING, 0),\n    substring: fn('substring', STRING),\n    split: fn('split', STRING),\n    replace: fn('replace', STRING),\n    trim: fn('trim', STRING, 0),\n    // REGEXP functions\n    regexp: REGEXP,\n    test: fn('test', REGEXP),\n    // Control Flow functions\n    if: function (args) {\n      if (args.length < 3) (0, _vegaUtil.error)('Missing arguments to if function.');\n      if (args.length > 3) (0, _vegaUtil.error)('Too many arguments to if function.');\n      var a = args.map(codegen);\n      return '(' + a[0] + '?' + a[1] + ':' + a[2] + ')';\n    }\n  };\n}\n},{\"vega-util\":\"d61Z\"}],\"v2Yj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = _interopRequireDefault(require(\"./constants\"));\n\nvar _functions = _interopRequireDefault(require(\"./functions\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction stripQuotes(s) {\n  var n = s && s.length - 1;\n  return n && (s[0] === '\"' && s[n] === '\"' || s[0] === '\\'' && s[n] === '\\'') ? s.slice(1, -1) : s;\n}\n\nfunction _default(opt) {\n  opt = opt || {};\n\n  var whitelist = opt.whitelist ? (0, _vegaUtil.toSet)(opt.whitelist) : {},\n      blacklist = opt.blacklist ? (0, _vegaUtil.toSet)(opt.blacklist) : {},\n      constants = opt.constants || _constants.default,\n      functions = (opt.functions || _functions.default)(visit),\n      globalvar = opt.globalvar,\n      fieldvar = opt.fieldvar,\n      globals = {},\n      fields = {},\n      memberDepth = 0;\n\n  var outputGlobal = (0, _vegaUtil.isFunction)(globalvar) ? globalvar : function (id) {\n    return globalvar + '[\"' + id + '\"]';\n  };\n\n  function visit(ast) {\n    if ((0, _vegaUtil.isString)(ast)) return ast;\n    var generator = Generators[ast.type];\n    if (generator == null) (0, _vegaUtil.error)('Unsupported type: ' + ast.type);\n    return generator(ast);\n  }\n\n  var Generators = {\n    Literal: function (n) {\n      return n.raw;\n    },\n    Identifier: function (n) {\n      var id = n.name;\n\n      if (memberDepth > 0) {\n        return id;\n      } else if ((0, _vegaUtil.hasOwnProperty)(blacklist, id)) {\n        return (0, _vegaUtil.error)('Illegal identifier: ' + id);\n      } else if ((0, _vegaUtil.hasOwnProperty)(constants, id)) {\n        return constants[id];\n      } else if ((0, _vegaUtil.hasOwnProperty)(whitelist, id)) {\n        return id;\n      } else {\n        globals[id] = 1;\n        return outputGlobal(id);\n      }\n    },\n    MemberExpression: function (n) {\n      var d = !n.computed;\n      var o = visit(n.object);\n      if (d) memberDepth += 1;\n      var p = visit(n.property);\n\n      if (o === fieldvar) {\n        // strip quotes to sanitize field name (#1653)\n        fields[stripQuotes(p)] = 1;\n      }\n\n      if (d) memberDepth -= 1;\n      return o + (d ? '.' + p : '[' + p + ']');\n    },\n    CallExpression: function (n) {\n      if (n.callee.type !== 'Identifier') {\n        (0, _vegaUtil.error)('Illegal callee type: ' + n.callee.type);\n      }\n\n      var callee = n.callee.name;\n      var args = n.arguments;\n      var fn = (0, _vegaUtil.hasOwnProperty)(functions, callee) && functions[callee];\n      if (!fn) (0, _vegaUtil.error)('Unrecognized function: ' + callee);\n      return (0, _vegaUtil.isFunction)(fn) ? fn(args) : fn + '(' + args.map(visit).join(',') + ')';\n    },\n    ArrayExpression: function (n) {\n      return '[' + n.elements.map(visit).join(',') + ']';\n    },\n    BinaryExpression: function (n) {\n      return '(' + visit(n.left) + n.operator + visit(n.right) + ')';\n    },\n    UnaryExpression: function (n) {\n      return '(' + n.operator + visit(n.argument) + ')';\n    },\n    ConditionalExpression: function (n) {\n      return '(' + visit(n.test) + '?' + visit(n.consequent) + ':' + visit(n.alternate) + ')';\n    },\n    LogicalExpression: function (n) {\n      return '(' + visit(n.left) + n.operator + visit(n.right) + ')';\n    },\n    ObjectExpression: function (n) {\n      return '{' + n.properties.map(visit).join(',') + '}';\n    },\n    Property: function (n) {\n      memberDepth += 1;\n      var k = visit(n.key);\n      memberDepth -= 1;\n      return k + ':' + visit(n.value);\n    }\n  };\n\n  function codegen(ast) {\n    var result = {\n      code: visit(ast),\n      globals: Object.keys(globals),\n      fields: Object.keys(fields)\n    };\n    globals = {};\n    fields = {};\n    return result;\n  }\n\n  codegen.functions = functions;\n  codegen.constants = constants;\n  return codegen;\n}\n},{\"./constants\":\"zPFH\",\"./functions\":\"N5Bk\",\"vega-util\":\"d61Z\"}],\"dgqb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"RawCode\", {\n  enumerable: true,\n  get: function () {\n    return _ast.RawCode;\n  }\n});\nObject.defineProperty(exports, \"Literal\", {\n  enumerable: true,\n  get: function () {\n    return _ast.Literal;\n  }\n});\nObject.defineProperty(exports, \"Property\", {\n  enumerable: true,\n  get: function () {\n    return _ast.Property;\n  }\n});\nObject.defineProperty(exports, \"Identifier\", {\n  enumerable: true,\n  get: function () {\n    return _ast.Identifier;\n  }\n});\nObject.defineProperty(exports, \"ArrayExpression\", {\n  enumerable: true,\n  get: function () {\n    return _ast.ArrayExpression;\n  }\n});\nObject.defineProperty(exports, \"BinaryExpression\", {\n  enumerable: true,\n  get: function () {\n    return _ast.BinaryExpression;\n  }\n});\nObject.defineProperty(exports, \"CallExpression\", {\n  enumerable: true,\n  get: function () {\n    return _ast.CallExpression;\n  }\n});\nObject.defineProperty(exports, \"ConditionalExpression\", {\n  enumerable: true,\n  get: function () {\n    return _ast.ConditionalExpression;\n  }\n});\nObject.defineProperty(exports, \"LogicalExpression\", {\n  enumerable: true,\n  get: function () {\n    return _ast.LogicalExpression;\n  }\n});\nObject.defineProperty(exports, \"MemberExpression\", {\n  enumerable: true,\n  get: function () {\n    return _ast.MemberExpression;\n  }\n});\nObject.defineProperty(exports, \"ObjectExpression\", {\n  enumerable: true,\n  get: function () {\n    return _ast.ObjectExpression;\n  }\n});\nObject.defineProperty(exports, \"UnaryExpression\", {\n  enumerable: true,\n  get: function () {\n    return _ast.UnaryExpression;\n  }\n});\nObject.defineProperty(exports, \"ASTNode\", {\n  enumerable: true,\n  get: function () {\n    return _ast.default;\n  }\n});\nObject.defineProperty(exports, \"parse\", {\n  enumerable: true,\n  get: function () {\n    return _parser.default;\n  }\n});\nObject.defineProperty(exports, \"codegen\", {\n  enumerable: true,\n  get: function () {\n    return _codegen.default;\n  }\n});\nObject.defineProperty(exports, \"functions\", {\n  enumerable: true,\n  get: function () {\n    return _functions.default;\n  }\n});\nObject.defineProperty(exports, \"constants\", {\n  enumerable: true,\n  get: function () {\n    return _constants.default;\n  }\n});\n\nvar _ast = _interopRequireWildcard(require(\"./src/ast\"));\n\nvar _parser = _interopRequireDefault(require(\"./src/parser\"));\n\nvar _codegen = _interopRequireDefault(require(\"./src/codegen\"));\n\nvar _functions = _interopRequireDefault(require(\"./src/functions\"));\n\nvar _constants = _interopRequireDefault(require(\"./src/constants\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./src/ast\":\"vfZA\",\"./src/parser\":\"HIn2\",\"./src/codegen\":\"v2Yj\",\"./src/functions\":\"N5Bk\",\"./src/constants\":\"zPFH\"}],\"yo2S\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.And = exports.Or = exports.VlMulti = exports.Union = exports.Intersect = void 0;\nconst Intersect = 'intersect';\nexports.Intersect = Intersect;\nconst Union = 'union';\nexports.Union = Union;\nconst VlMulti = 'vlMulti';\nexports.VlMulti = VlMulti;\nconst Or = 'or';\nexports.Or = Or;\nconst And = 'and';\nexports.And = And;\n},{}],\"xcxx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.selectionTest = selectionTest;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar TYPE_ENUM = 'E',\n    TYPE_RANGE_INC = 'R',\n    TYPE_RANGE_EXC = 'R-E',\n    TYPE_RANGE_LE = 'R-LE',\n    TYPE_RANGE_RE = 'R-RE',\n    UNIT_INDEX = 'index:unit'; // TODO: revisit date coercion?\n\nfunction testPoint(datum, entry) {\n  var fields = entry.fields,\n      values = entry.values,\n      n = fields.length,\n      i = 0,\n      dval,\n      f;\n\n  for (; i < n; ++i) {\n    f = fields[i];\n    f.getter = _vegaUtil.field.getter || (0, _vegaUtil.field)(f.field);\n    dval = f.getter(datum);\n    if ((0, _vegaUtil.isDate)(dval)) dval = (0, _vegaUtil.toNumber)(dval);\n    if ((0, _vegaUtil.isDate)(values[i])) values[i] = (0, _vegaUtil.toNumber)(values[i]);\n    if ((0, _vegaUtil.isDate)(values[i][0])) values[i] = values[i].map(_vegaUtil.toNumber);\n\n    if (f.type === TYPE_ENUM) {\n      // Enumerated fields can either specify individual values (single/multi selections)\n      // or an array of values (interval selections).\n      if ((0, _vegaUtil.isArray)(values[i]) ? values[i].indexOf(dval) < 0 : dval !== values[i]) {\n        return false;\n      }\n    } else {\n      if (f.type === TYPE_RANGE_INC) {\n        if (!(0, _vegaUtil.inrange)(dval, values[i])) return false;\n      } else if (f.type === TYPE_RANGE_RE) {\n        // Discrete selection of bins test within the range [bin_start, bin_end).\n        if (!(0, _vegaUtil.inrange)(dval, values[i], true, false)) return false;\n      } else if (f.type === TYPE_RANGE_EXC) {\n        // 'R-E'/'R-LE' included for completeness.\n        if (!(0, _vegaUtil.inrange)(dval, values[i], false, false)) return false;\n      } else if (f.type === TYPE_RANGE_LE) {\n        if (!(0, _vegaUtil.inrange)(dval, values[i], false, true)) return false;\n      }\n    }\n  }\n\n  return true;\n}\n/**\n * Tests if a tuple is contained within an interactive selection.\n * @param {string} name - The name of the data set representing the selection.\n *  Tuples in the dataset are of the form\n *  {unit: string, fields: array<fielddef>, values: array<*>}.\n *  Fielddef is of the form\n *  {field: string, channel: string, type: 'E' | 'R'} where\n *  'type' identifies whether tuples in the dataset enumerate\n *  values for the field, or specify a continuous range.\n * @param {object} datum - The tuple to test for inclusion.\n * @param {string} op - The set operation for combining selections.\n *   One of 'intersect' or 'union' (default).\n * @return {boolean} - True if the datum is in the selection, false otherwise.\n */\n\n\nfunction selectionTest(name, datum, op) {\n  var data = this.context.data[name],\n      entries = data ? data.values.value : [],\n      unitIdx = data ? data[UNIT_INDEX] && data[UNIT_INDEX].value : undefined,\n      intersect = op === _constants.Intersect,\n      n = entries.length,\n      i = 0,\n      entry,\n      miss,\n      count,\n      unit,\n      b;\n\n  for (; i < n; ++i) {\n    entry = entries[i];\n\n    if (unitIdx && intersect) {\n      // multi selections union within the same unit and intersect across units.\n      miss = miss || {};\n      count = miss[unit = entry.unit] || 0; // if we've already matched this unit, skip.\n\n      if (count === -1) continue;\n      b = testPoint(datum, entry);\n      miss[unit] = b ? -1 : ++count; // if we match and there are no other units return true\n      // if we've missed against all tuples in this unit return false\n\n      if (b && unitIdx.size === 1) return true;\n      if (!b && count === unitIdx.get(unit).count) return false;\n    } else {\n      b = testPoint(datum, entry); // if we find a miss and we do require intersection return false\n      // if we find a match and we don't require intersection return true\n\n      if (intersect ^ b) return b;\n    }\n  } // if intersecting and we made it here, then we saw no misses\n  // if not intersecting, then we saw no matches\n  // if no active selections, return false\n\n\n  return n && intersect;\n}\n},{\"./constants\":\"yo2S\",\"vega-util\":\"d61Z\"}],\"xQX1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.selectionResolve = selectionResolve;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Resolves selection for use as a scale domain or reads via the API.\n * @param {string} name - The name of the dataset representing the selection\n * @param {string} [op='union'] - The set operation for combining selections.\n *                 One of 'intersect' or 'union' (default).\n * @returns {object} An object of selected fields and values.\n */\nfunction selectionResolve(name, op, isMulti) {\n  var data = this.context.data[name],\n      entries = data ? data.values.value : [],\n      resolved = {},\n      multiRes = {},\n      types = {},\n      entry,\n      fields,\n      values,\n      unit,\n      field,\n      res,\n      resUnit,\n      type,\n      union,\n      n = entries.length,\n      i = 0,\n      j,\n      m; // First union all entries within the same unit.\n\n  for (; i < n; ++i) {\n    entry = entries[i];\n    unit = entry.unit;\n    fields = entry.fields;\n    values = entry.values;\n\n    for (j = 0, m = fields.length; j < m; ++j) {\n      field = fields[j];\n      res = resolved[field.field] || (resolved[field.field] = {});\n      resUnit = res[unit] || (res[unit] = []);\n      types[field.field] = type = field.type.charAt(0);\n      union = ops[type + '_union'];\n      res[unit] = union(resUnit, (0, _vegaUtil.array)(values[j]));\n    } // If the same multi-selection is repeated over views and projected over\n    // an encoding, it may operate over different fields making it especially\n    // tricky to reliably resolve it. At best, we can de-dupe identical entries\n    // but doing so may be more computationally expensive than it is worth.\n    // Instead, for now, we simply transform our store representation into\n    // a more human-friendly one.\n\n\n    if (isMulti) {\n      resUnit = multiRes[unit] || (multiRes[unit] = []);\n      resUnit.push((0, _vegaUtil.array)(values).reduce((obj, curr, j) => (obj[fields[j].field] = curr, obj), {}));\n    }\n  } // Then resolve fields across units as per the op.\n\n\n  op = op || _constants.Union;\n  Object.keys(resolved).forEach(function (field) {\n    resolved[field] = Object.keys(resolved[field]).map(unit => resolved[field][unit]).reduce((acc, curr) => acc === undefined ? curr : ops[types[field] + '_' + op](acc, curr));\n  });\n  entries = Object.keys(multiRes);\n\n  if (isMulti && entries.length) {\n    resolved[_constants.VlMulti] = op === _constants.Union ? {\n      [_constants.Or]: entries.reduce((acc, k) => (acc.push.apply(acc, multiRes[k]), acc), [])\n    } : {\n      [_constants.And]: entries.map(k => ({\n        [_constants.Or]: multiRes[k]\n      }))\n    };\n  }\n\n  return resolved;\n}\n\nvar ops = {\n  E_union: function (base, value) {\n    if (!base.length) return value;\n    var i = 0,\n        n = value.length;\n\n    for (; i < n; ++i) if (base.indexOf(value[i]) < 0) base.push(value[i]);\n\n    return base;\n  },\n  E_intersect: function (base, value) {\n    return !base.length ? value : base.filter(function (v) {\n      return value.indexOf(v) >= 0;\n    });\n  },\n  R_union: function (base, value) {\n    var lo = (0, _vegaUtil.toNumber)(value[0]),\n        hi = (0, _vegaUtil.toNumber)(value[1]);\n\n    if (lo > hi) {\n      lo = value[1];\n      hi = value[0];\n    }\n\n    if (!base.length) return [lo, hi];\n    if (base[0] > lo) base[0] = lo;\n    if (base[1] < hi) base[1] = hi;\n    return base;\n  },\n  R_intersect: function (base, value) {\n    var lo = (0, _vegaUtil.toNumber)(value[0]),\n        hi = (0, _vegaUtil.toNumber)(value[1]);\n\n    if (lo > hi) {\n      lo = value[1];\n      hi = value[0];\n    }\n\n    if (!base.length) return [lo, hi];\n\n    if (hi < base[0] || base[1] < lo) {\n      return [];\n    } else {\n      if (base[0] < lo) base[0] = lo;\n      if (base[1] > hi) base[1] = hi;\n    }\n\n    return base;\n  }\n};\n},{\"./constants\":\"yo2S\",\"vega-util\":\"d61Z\"}],\"a3Lq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.selectionVisitor = selectionVisitor;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaExpression = require(\"vega-expression\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nconst DataPrefix = ':',\n      IndexPrefix = '@';\n\nfunction selectionVisitor(name, args, scope, params) {\n  if (args[0].type !== _vegaExpression.Literal) (0, _vegaUtil.error)('First argument to selection functions must be a string literal.');\n  const data = args[0].value,\n        op = args.length >= 2 && (0, _vegaUtil.peek)(args).value,\n        field = 'unit',\n        indexName = IndexPrefix + field,\n        dataName = DataPrefix + data; // eslint-disable-next-line no-prototype-builtins\n\n  if (op === _constants.Intersect && !(0, _vegaUtil.hasOwnProperty)(params, indexName)) {\n    params[indexName] = scope.getData(data).indataRef(scope, field);\n  } // eslint-disable-next-line no-prototype-builtins\n\n\n  if (!(0, _vegaUtil.hasOwnProperty)(params, dataName)) {\n    params[dataName] = scope.getData(data).tuplesRef();\n  }\n}\n},{\"./constants\":\"yo2S\",\"vega-expression\":\"dgqb\",\"vega-util\":\"d61Z\"}],\"VLia\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"selectionTest\", {\n  enumerable: true,\n  get: function () {\n    return _selectionTest.selectionTest;\n  }\n});\nObject.defineProperty(exports, \"selectionResolve\", {\n  enumerable: true,\n  get: function () {\n    return _selectionResolve.selectionResolve;\n  }\n});\nObject.defineProperty(exports, \"selectionVisitor\", {\n  enumerable: true,\n  get: function () {\n    return _selectionVisitor.selectionVisitor;\n  }\n});\n\nvar _selectionTest = require(\"./src/selectionTest\");\n\nvar _selectionResolve = require(\"./src/selectionResolve\");\n\nvar _selectionVisitor = require(\"./src/selectionVisitor\");\n},{\"./src/selectionTest\":\"xcxx\",\"./src/selectionResolve\":\"xQX1\",\"./src/selectionVisitor\":\"a3Lq\"}],\"O27n\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.luminance = luminance;\nexports.contrast = contrast;\n\nvar _d3Color = require(\"d3-color\");\n\n// https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\nfunction channel_luminance_value(channelValue) {\n  const val = channelValue / 255;\n\n  if (val <= 0.03928) {\n    return val / 12.92;\n  }\n\n  return Math.pow((val + 0.055) / 1.055, 2.4);\n}\n\nfunction luminance(color) {\n  const c = (0, _d3Color.rgb)(color),\n        r = channel_luminance_value(c.r),\n        g = channel_luminance_value(c.g),\n        b = channel_luminance_value(c.b);\n  return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n} // https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n\n\nfunction contrast(color1, color2) {\n  const lum1 = luminance(color1),\n        lum2 = luminance(color2),\n        lumL = Math.max(lum1, lum2),\n        lumD = Math.min(lum1, lum2);\n  return (lumL + 0.05) / (lumD + 0.05);\n}\n},{\"d3-color\":\"Peej\"}],\"YL30\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.data = data;\nexports.indata = indata;\nexports.setdata = setdata;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction data(name) {\n  const data = this.context.data[name];\n  return data ? data.values.value : [];\n}\n\nfunction indata(name, field, value) {\n  const index = this.context.data[name]['index:' + field],\n        entry = index ? index.value.get(value) : undefined;\n  return entry ? entry.count : entry;\n}\n\nfunction setdata(name, tuples) {\n  const df = this.context.dataflow,\n        data = this.context.data[name],\n        input = data.input;\n  df.pulse(input, df.changeset().remove(_vegaUtil.truthy).insert(tuples));\n  return 1;\n}\n},{\"vega-util\":\"d61Z\"}],\"sXyN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(item, name, retval) {\n  if (item) {\n    const df = this.context.dataflow,\n          target = item.mark.source;\n    df.pulse(target, df.changeset().encode(item, name));\n  }\n\n  return retval !== undefined ? retval : item;\n}\n},{}],\"gjtr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.format = format;\nexports.timeFormat = timeFormat;\nexports.utcFormat = utcFormat;\nexports.timeParse = timeParse;\nexports.utcParse = utcParse;\nexports.monthFormat = monthFormat;\nexports.monthAbbrevFormat = monthAbbrevFormat;\nexports.dayFormat = dayFormat;\nexports.dayAbbrevFormat = dayAbbrevFormat;\n\nvar _vegaTime = require(\"vega-time\");\n\nvar _d3Format = require(\"d3-format\");\n\nvar _d3TimeFormat = require(\"d3-time-format\");\n\nconst formatCache = {};\n\nfunction formatter(type, method, specifier) {\n  let k = type + ':' + specifier,\n      e = formatCache[k];\n\n  if (!e || e[0] !== method) {\n    formatCache[k] = e = [method, method(specifier)];\n  }\n\n  return e[1];\n}\n\nfunction format(_, specifier) {\n  return formatter('format', _d3Format.format, specifier)(_);\n}\n\nfunction timeFormat(_, specifier) {\n  return formatter('timeFormat', _vegaTime.timeFormat, specifier)(_);\n}\n\nfunction utcFormat(_, specifier) {\n  return formatter('utcFormat', _vegaTime.utcFormat, specifier)(_);\n}\n\nfunction timeParse(_, specifier) {\n  return formatter('timeParse', _d3TimeFormat.timeParse, specifier)(_);\n}\n\nfunction utcParse(_, specifier) {\n  return formatter('utcParse', _d3TimeFormat.utcParse, specifier)(_);\n}\n\nvar dateObj = new Date(2000, 0, 1);\n\nfunction time(month, day, specifier) {\n  if (!Number.isInteger(month) || !Number.isInteger(day)) return '';\n  dateObj.setYear(2000);\n  dateObj.setMonth(month);\n  dateObj.setDate(day);\n  return timeFormat(dateObj, specifier);\n}\n\nfunction monthFormat(month) {\n  return time(month, 1, '%B');\n}\n\nfunction monthAbbrevFormat(month) {\n  return time(month, 1, '%b');\n}\n\nfunction dayFormat(day) {\n  return time(0, 2 + day, '%A');\n}\n\nfunction dayAbbrevFormat(day) {\n  return time(0, 2 + day, '%a');\n}\n},{\"vega-time\":\"ErfR\",\"d3-format\":\"VuZR\",\"d3-time-format\":\"UYpZ\"}],\"M5h0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getScale = getScale;\nexports.range = range;\nexports.domain = domain;\nexports.bandwidth = bandwidth;\nexports.bandspace = bandspace;\nexports.copy = copy;\nexports.scale = scale;\nexports.invert = invert;\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction getScale(name, ctx) {\n  let s;\n  return (0, _vegaUtil.isFunction)(name) ? name : (0, _vegaUtil.isString)(name) ? (s = ctx.scales[name]) && s.value : undefined;\n}\n\nfunction range(name, group) {\n  const s = getScale(name, (group || this).context);\n  return s && s.range ? s.range() : [];\n}\n\nfunction domain(name, group) {\n  const s = getScale(name, (group || this).context);\n  return s ? s.domain() : [];\n}\n\nfunction bandwidth(name, group) {\n  const s = getScale(name, (group || this).context);\n  return s && s.bandwidth ? s.bandwidth() : 0;\n}\n\nfunction bandspace(count, paddingInner, paddingOuter) {\n  return (0, _vegaScale.bandSpace)(count || 0, paddingInner || 0, paddingOuter || 0);\n}\n\nfunction copy(name, group) {\n  const s = getScale(name, (group || this).context);\n  return s ? s.copy() : undefined;\n}\n\nfunction scale(name, value, group) {\n  const s = getScale(name, (group || this).context);\n  return s && value !== undefined ? s(value) : undefined;\n}\n\nfunction invert(name, range, group) {\n  const s = getScale(name, (group || this).context);\n  return !s ? undefined : (0, _vegaUtil.isArray)(range) ? (s.invertRange || s.invert)(range) : (s.invert || s.invertExtent)(range);\n}\n},{\"vega-scale\":\"N8iK\",\"vega-util\":\"d61Z\"}],\"w4xQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.geoCentroid = exports.geoBounds = exports.geoArea = void 0;\n\nvar _scale = require(\"./scale\");\n\nvar _d3Geo = require(\"d3-geo\");\n\nfunction geoMethod(methodName, globalMethod) {\n  return function (projection, geojson, group) {\n    if (projection) {\n      // projection defined, use it\n      const p = (0, _scale.getScale)(projection, (group || this).context);\n      return p && p.path[methodName](geojson);\n    } else {\n      // projection undefined, use global method\n      return globalMethod(geojson);\n    }\n  };\n}\n\nconst geoArea = geoMethod('area', _d3Geo.geoArea);\nexports.geoArea = geoArea;\nconst geoBounds = geoMethod('bounds', _d3Geo.geoBounds);\nexports.geoBounds = geoBounds;\nconst geoCentroid = geoMethod('centroid', _d3Geo.geoCentroid);\nexports.geoCentroid = geoCentroid;\n},{\"./scale\":\"M5h0\",\"d3-geo\":\"Ah6W\"}],\"PPFk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(item) {\n  let group = this.context.group,\n      value = false;\n  if (group) while (item) {\n    if (item === group) {\n      value = true;\n      break;\n    }\n\n    item = item.mark.group;\n  }\n  return value;\n}\n},{}],\"DLl8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(b, opt, group) {\n  if (!b) return [];\n  const [u, v] = b,\n        box = new _vegaScenegraph.Bounds().set(u[0], u[1], v[0], v[1]),\n        scene = group || this.context.dataflow.scenegraph().root;\n  return (0, _vegaScenegraph.intersect)(scene, box, filter(opt));\n}\n\nfunction filter(opt) {\n  let p = null;\n\n  if (opt) {\n    const types = (0, _vegaUtil.array)(opt.marktype),\n          names = (0, _vegaUtil.array)(opt.markname);\n\n    p = _ => (!types.length || types.some(t => _.marktype === t)) && (!names.length || names.some(s => _.name === s));\n  }\n\n  return p;\n}\n},{\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"y8ug\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.warn = warn;\nexports.info = info;\nexports.debug = debug;\n\nfunction log(df, method, args) {\n  try {\n    df[method].apply(df, ['EXPRESSION'].concat([].slice.call(args)));\n  } catch (err) {\n    df.warn(err);\n  }\n\n  return args[args.length - 1];\n}\n\nfunction warn() {\n  return log(this.context.dataflow, 'warn', arguments);\n}\n\nfunction info() {\n  return log(this.context.dataflow, 'info', arguments);\n}\n\nfunction debug() {\n  return log(this.context.dataflow, 'debug', arguments);\n}\n},{}],\"QQPV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default() {\n  var args = [].slice.call(arguments);\n  args.unshift({});\n  return _vegaUtil.extend.apply(null, args);\n}\n},{\"vega-util\":\"d61Z\"}],\"VLON\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction equal(a, b) {\n  return a === b || a !== a && b !== b ? true : (0, _vegaUtil.isArray)(a) ? (0, _vegaUtil.isArray)(b) && a.length === b.length ? equalArray(a, b) : false : (0, _vegaUtil.isObject)(a) && (0, _vegaUtil.isObject)(b) ? equalObject(a, b) : false;\n}\n\nfunction equalArray(a, b) {\n  for (let i = 0, n = a.length; i < n; ++i) {\n    if (!equal(a[i], b[i])) return false;\n  }\n\n  return true;\n}\n\nfunction equalObject(a, b) {\n  for (let key in a) {\n    if (!equal(a[key], b[key])) return false;\n  }\n\n  return true;\n}\n\nfunction removePredicate(props) {\n  return _ => equalObject(props, _);\n}\n\nfunction _default(name, insert, remove, toggle, modify, values) {\n  let df = this.context.dataflow,\n      data = this.context.data[name],\n      input = data.input,\n      changes = data.changes,\n      stamp = df.stamp(),\n      predicate,\n      key;\n\n  if (df._trigger === false || !(input.value.length || insert || toggle)) {\n    // nothing to do!\n    return 0;\n  }\n\n  if (!changes || changes.stamp < stamp) {\n    data.changes = changes = df.changeset();\n    changes.stamp = stamp;\n    df.runAfter(function () {\n      data.modified = true;\n      df.pulse(input, changes).run();\n    }, true, 1);\n  }\n\n  if (remove) {\n    predicate = remove === true ? _vegaUtil.truthy : (0, _vegaUtil.isArray)(remove) || (0, _vegaDataflow.isTuple)(remove) ? remove : removePredicate(remove);\n    changes.remove(predicate);\n  }\n\n  if (insert) {\n    changes.insert(insert);\n  }\n\n  if (toggle) {\n    predicate = removePredicate(toggle);\n\n    if (input.value.some(predicate)) {\n      changes.remove(predicate);\n    } else {\n      changes.insert(toggle);\n    }\n  }\n\n  if (modify) {\n    for (key in values) {\n      changes.modify(modify, key, values[key]);\n    }\n  }\n\n  return 1;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"g9qR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.pinchDistance = pinchDistance;\nexports.pinchAngle = pinchAngle;\n\nfunction pinchDistance(event) {\n  const t = event.touches,\n        dx = t[0].clientX - t[1].clientX,\n        dy = t[0].clientY - t[1].clientY;\n  return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction pinchAngle(event) {\n  const t = event.touches;\n  return Math.atan2(t[0].clientY - t[1].clientY, t[0].clientX - t[1].clientX);\n}\n},{}],\"baq4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scale = require(\"./scale\");\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(scale, p0, p1, count, group) {\n  scale = (0, _scale.getScale)(scale, (group || this).context);\n  const gradient = (0, _vegaScenegraph.Gradient)(p0, p1);\n  let stops = scale.domain(),\n      min = stops[0],\n      max = (0, _vegaUtil.peek)(stops),\n      fraction = _vegaUtil.identity;\n\n  if (!(max - min)) {\n    // expand scale if domain has zero span, fix #1479\n    scale = (scale.interpolator ? (0, _vegaScale.scale)('sequential')().interpolator(scale.interpolator()) : (0, _vegaScale.scale)('linear')().interpolate(scale.interpolate()).range(scale.range())).domain([min = 0, max = 1]);\n  } else {\n    fraction = (0, _vegaScale.scaleFraction)(scale, min, max);\n  }\n\n  if (scale.ticks) {\n    stops = scale.ticks(+count || 15);\n    if (min !== stops[0]) stops.unshift(min);\n    if (max !== (0, _vegaUtil.peek)(stops)) stops.push(max);\n  }\n\n  stops.forEach(_ => gradient.stop(fraction(_), scale(_)));\n  return gradient;\n}\n},{\"./scale\":\"M5h0\",\"vega-scale\":\"N8iK\",\"vega-scenegraph\":\"AgKg\",\"vega-util\":\"d61Z\"}],\"Xqwq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.geoShape = geoShape;\nexports.pathShape = pathShape;\n\nvar _scale = require(\"./scale\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nfunction geoShape(projection, geojson, group) {\n  const p = (0, _scale.getScale)(projection, (group || this).context);\n  return function (context) {\n    return p ? p.path.context(context)(geojson) : '';\n  };\n}\n\nfunction pathShape(path) {\n  let p = null;\n  return function (context) {\n    return context ? (0, _vegaScenegraph.pathRender)(context, p = p || (0, _vegaScenegraph.pathParse)(path)) : path;\n  };\n}\n},{\"./scale\":\"M5h0\",\"vega-scenegraph\":\"AgKg\"}],\"onKZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.treePath = treePath;\nexports.treeAncestors = treeAncestors;\n\nvar _data = require(\"./data\");\n\nconst EMPTY = {};\n\nfunction datum(d) {\n  return d.data;\n}\n\nfunction treeNodes(name, context) {\n  const tree = _data.data.call(context, name);\n\n  return tree.root && tree.root.lookup || EMPTY;\n}\n\nfunction treePath(name, source, target) {\n  const nodes = treeNodes(name, this),\n        s = nodes[source],\n        t = nodes[target];\n  return s && t ? s.path(t).map(datum) : undefined;\n}\n\nfunction treeAncestors(name, node) {\n  const n = treeNodes(name, this)[node];\n  return n ? n.ancestors().map(datum) : undefined;\n}\n},{\"./data\":\"YL30\"}],\"qk1A\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.screen = screen;\nexports.windowSize = windowSize;\nexports.containerSize = containerSize;\n\nconst _window = typeof window !== 'undefined' && window || null;\n\nfunction screen() {\n  return _window ? _window.screen : {};\n}\n\nfunction windowSize() {\n  return _window ? [_window.innerWidth, _window.innerHeight] : [undefined, undefined];\n}\n\nfunction containerSize() {\n  const view = this.context.dataflow,\n        el = view.container && view.container();\n  return el ? [el.clientWidth, el.clientHeight] : [undefined, undefined];\n}\n},{}],\"IMMj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SignalPrefix = exports.ScalePrefix = exports.IndexPrefix = exports.DataPrefix = void 0;\nconst DataPrefix = ':';\nexports.DataPrefix = DataPrefix;\nconst IndexPrefix = '@';\nexports.IndexPrefix = IndexPrefix;\nconst ScalePrefix = '%';\nexports.ScalePrefix = ScalePrefix;\nconst SignalPrefix = '$';\nexports.SignalPrefix = SignalPrefix;\n},{}],\"VCgp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.dataVisitor = dataVisitor;\nexports.indataVisitor = indataVisitor;\nexports.scaleVisitor = scaleVisitor;\n\nvar _prefix = require(\"./prefix\");\n\nvar _vegaExpression = require(\"vega-expression\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction dataVisitor(name, args, scope, params) {\n  if (args[0].type !== _vegaExpression.Literal) {\n    (0, _vegaUtil.error)('First argument to data functions must be a string literal.');\n  }\n\n  const data = args[0].value,\n        dataName = _prefix.DataPrefix + data;\n\n  if (!(0, _vegaUtil.hasOwnProperty)(dataName, params)) {\n    try {\n      params[dataName] = scope.getData(data).tuplesRef();\n    } catch (err) {// if data set does not exist, there's nothing to track\n    }\n  }\n}\n\nfunction indataVisitor(name, args, scope, params) {\n  if (args[0].type !== _vegaExpression.Literal) (0, _vegaUtil.error)('First argument to indata must be a string literal.');\n  if (args[1].type !== _vegaExpression.Literal) (0, _vegaUtil.error)('Second argument to indata must be a string literal.');\n  const data = args[0].value,\n        field = args[1].value,\n        indexName = _prefix.IndexPrefix + field;\n\n  if (!(0, _vegaUtil.hasOwnProperty)(indexName, params)) {\n    params[indexName] = scope.getData(data).indataRef(scope, field);\n  }\n}\n\nfunction scaleVisitor(name, args, scope, params) {\n  if (args[0].type === _vegaExpression.Literal) {\n    // add scale dependency\n    addScaleDependency(scope, params, args[0].value);\n  } else if (args[0].type === _vegaExpression.Identifier) {\n    // indirect scale lookup; add all scales as parameters\n    for (name in scope.scales) {\n      addScaleDependency(scope, params, name);\n    }\n  }\n}\n\nfunction addScaleDependency(scope, params, name) {\n  const scaleName = _prefix.ScalePrefix + name;\n\n  if (!(0, _vegaUtil.hasOwnProperty)(params, scaleName)) {\n    try {\n      params[scaleName] = scope.scaleRef(name);\n    } catch (err) {// TODO: error handling? warning?\n    }\n  }\n}\n},{\"./prefix\":\"IMMj\",\"vega-expression\":\"dgqb\",\"vega-util\":\"d61Z\"}],\"nD6E\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.expressionFunction = expressionFunction;\nexports.codeGenerator = exports.codegenParams = exports.functionContext = void 0;\n\nvar _vegaExpression = require(\"vega-expression\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaSelections = require(\"vega-selections\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nvar _vegaTime = require(\"vega-time\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _d3Array = require(\"d3-array\");\n\nvar _d3Color = require(\"d3-color\");\n\nvar _luminance = require(\"./luminance\");\n\nvar _data = require(\"./data\");\n\nvar _encode = _interopRequireDefault(require(\"./encode\"));\n\nvar _format = require(\"./format\");\n\nvar _geo = require(\"./geo\");\n\nvar _inscope = _interopRequireDefault(require(\"./inscope\"));\n\nvar _intersect = _interopRequireDefault(require(\"./intersect\"));\n\nvar _log = require(\"./log\");\n\nvar _merge = _interopRequireDefault(require(\"./merge\"));\n\nvar _modify = _interopRequireDefault(require(\"./modify\"));\n\nvar _pinch = require(\"./pinch\");\n\nvar _scale = require(\"./scale\");\n\nvar _scaleGradient = _interopRequireDefault(require(\"./scale-gradient\"));\n\nvar _shape = require(\"./shape\");\n\nvar _tree = require(\"./tree\");\n\nvar _window = require(\"./window\");\n\nvar _visitors = require(\"./visitors\");\n\nvar _prefix = require(\"./prefix\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Expression function context object\nconst functionContext = {\n  random: function () {\n    return (0, _vegaStatistics.random)();\n  },\n  // override default\n  cumulativeNormal: _vegaStatistics.cumulativeNormal,\n  cumulativeLogNormal: _vegaStatistics.cumulativeLogNormal,\n  cumulativeUniform: _vegaStatistics.cumulativeUniform,\n  densityNormal: _vegaStatistics.densityNormal,\n  densityLogNormal: _vegaStatistics.densityLogNormal,\n  densityUniform: _vegaStatistics.densityUniform,\n  quantileNormal: _vegaStatistics.quantileNormal,\n  quantileLogNormal: _vegaStatistics.quantileLogNormal,\n  quantileUniform: _vegaStatistics.quantileUniform,\n  sampleNormal: _vegaStatistics.sampleNormal,\n  sampleLogNormal: _vegaStatistics.sampleLogNormal,\n  sampleUniform: _vegaStatistics.sampleUniform,\n  isArray: _vegaUtil.isArray,\n  isBoolean: _vegaUtil.isBoolean,\n  isDate: _vegaUtil.isDate,\n  isDefined: function (_) {\n    return _ !== undefined;\n  },\n  isNumber: _vegaUtil.isNumber,\n  isObject: _vegaUtil.isObject,\n  isRegExp: _vegaUtil.isRegExp,\n  isString: _vegaUtil.isString,\n  isTuple: _vegaDataflow.isTuple,\n  isValid: function (_) {\n    return _ != null && _ === _;\n  },\n  toBoolean: _vegaUtil.toBoolean,\n  toDate: _vegaUtil.toDate,\n  toNumber: _vegaUtil.toNumber,\n  toString: _vegaUtil.toString,\n  flush: _vegaUtil.flush,\n  lerp: _vegaUtil.lerp,\n  merge: _merge.default,\n  pad: _vegaUtil.pad,\n  peek: _vegaUtil.peek,\n  span: _vegaUtil.span,\n  inrange: _vegaUtil.inrange,\n  truncate: _vegaUtil.truncate,\n  rgb: _d3Color.rgb,\n  lab: _d3Color.lab,\n  hcl: _d3Color.hcl,\n  hsl: _d3Color.hsl,\n  luminance: _luminance.luminance,\n  contrast: _luminance.contrast,\n  sequence: _d3Array.range,\n  format: _format.format,\n  utcFormat: _format.utcFormat,\n  utcParse: _format.utcParse,\n  utcOffset: _vegaTime.utcOffset,\n  utcSequence: _vegaTime.utcSequence,\n  timeFormat: _format.timeFormat,\n  timeParse: _format.timeParse,\n  timeOffset: _vegaTime.timeOffset,\n  timeSequence: _vegaTime.timeSequence,\n  timeUnitSpecifier: _vegaTime.timeUnitSpecifier,\n  monthFormat: _format.monthFormat,\n  monthAbbrevFormat: _format.monthAbbrevFormat,\n  dayFormat: _format.dayFormat,\n  dayAbbrevFormat: _format.dayAbbrevFormat,\n  quarter: _vegaUtil.quarter,\n  utcquarter: _vegaUtil.utcquarter,\n  warn: _log.warn,\n  info: _log.info,\n  debug: _log.debug,\n  extent: _vegaUtil.extent,\n  inScope: _inscope.default,\n  intersect: _intersect.default,\n  clampRange: _vegaUtil.clampRange,\n  pinchDistance: _pinch.pinchDistance,\n  pinchAngle: _pinch.pinchAngle,\n  screen: _window.screen,\n  containerSize: _window.containerSize,\n  windowSize: _window.windowSize,\n  bandspace: _scale.bandspace,\n  setdata: _data.setdata,\n  pathShape: _shape.pathShape,\n  panLinear: _vegaUtil.panLinear,\n  panLog: _vegaUtil.panLog,\n  panPow: _vegaUtil.panPow,\n  panSymlog: _vegaUtil.panSymlog,\n  zoomLinear: _vegaUtil.zoomLinear,\n  zoomLog: _vegaUtil.zoomLog,\n  zoomPow: _vegaUtil.zoomPow,\n  zoomSymlog: _vegaUtil.zoomSymlog,\n  encode: _encode.default,\n  modify: _modify.default\n};\nexports.functionContext = functionContext;\nconst eventFunctions = ['view', 'item', 'group', 'xy', 'x', 'y'],\n      // event functions\neventPrefix = 'event.vega.',\n      // event function prefix\nthisPrefix = 'this.',\n      // function context prefix\nastVisitors = {}; // AST visitors for dependency analysis\n// Build expression function registry\n\nfunction buildFunctions(codegen) {\n  const fn = (0, _vegaExpression.functions)(codegen);\n  eventFunctions.forEach(name => fn[name] = eventPrefix + name);\n\n  for (let name in functionContext) {\n    fn[name] = thisPrefix + name;\n  }\n\n  return fn;\n} // Register an expression function\n\n\nfunction expressionFunction(name, fn, visitor) {\n  if (arguments.length === 1) {\n    return functionContext[name];\n  } // register with the functionContext\n\n\n  functionContext[name] = fn; // if there is an astVisitor register that, too\n\n  if (visitor) astVisitors[name] = visitor; // if the code generator has already been initialized,\n  // we need to also register the function with it\n\n  if (codeGenerator) codeGenerator.functions[name] = thisPrefix + name;\n  return this;\n} // register expression functions with ast visitors\n\n\nexpressionFunction('bandwidth', _scale.bandwidth, _visitors.scaleVisitor);\nexpressionFunction('copy', _scale.copy, _visitors.scaleVisitor);\nexpressionFunction('domain', _scale.domain, _visitors.scaleVisitor);\nexpressionFunction('range', _scale.range, _visitors.scaleVisitor);\nexpressionFunction('invert', _scale.invert, _visitors.scaleVisitor);\nexpressionFunction('scale', _scale.scale, _visitors.scaleVisitor);\nexpressionFunction('gradient', _scaleGradient.default, _visitors.scaleVisitor);\nexpressionFunction('geoArea', _geo.geoArea, _visitors.scaleVisitor);\nexpressionFunction('geoBounds', _geo.geoBounds, _visitors.scaleVisitor);\nexpressionFunction('geoCentroid', _geo.geoCentroid, _visitors.scaleVisitor);\nexpressionFunction('geoShape', _shape.geoShape, _visitors.scaleVisitor);\nexpressionFunction('indata', _data.indata, _visitors.indataVisitor);\nexpressionFunction('data', _data.data, _visitors.dataVisitor);\nexpressionFunction('treePath', _tree.treePath, _visitors.dataVisitor);\nexpressionFunction('treeAncestors', _tree.treeAncestors, _visitors.dataVisitor); // register Vega-Lite selection functions\n\nexpressionFunction('vlSelectionTest', _vegaSelections.selectionTest, _vegaSelections.selectionVisitor);\nexpressionFunction('vlSelectionResolve', _vegaSelections.selectionResolve, _vegaSelections.selectionVisitor); // Export code generator and parameters\n\nconst codegenParams = {\n  blacklist: ['_'],\n  whitelist: ['datum', 'event', 'item'],\n  fieldvar: 'datum',\n  globalvar: function (id) {\n    return '_[' + (0, _vegaUtil.stringValue)(_prefix.SignalPrefix + id) + ']';\n  },\n  functions: buildFunctions,\n  constants: _vegaExpression.constants,\n  visitors: astVisitors\n};\nexports.codegenParams = codegenParams;\nvar codeGenerator = (0, _vegaExpression.codegen)(codegenParams);\nexports.codeGenerator = codeGenerator;\n},{\"vega-expression\":\"dgqb\",\"vega-dataflow\":\"luN0\",\"vega-selections\":\"VLia\",\"vega-statistics\":\"Cvi0\",\"vega-time\":\"ErfR\",\"vega-util\":\"d61Z\",\"d3-array\":\"K0bd\",\"d3-color\":\"Peej\",\"./luminance\":\"O27n\",\"./data\":\"YL30\",\"./encode\":\"sXyN\",\"./format\":\"gjtr\",\"./geo\":\"w4xQ\",\"./inscope\":\"PPFk\",\"./intersect\":\"DLl8\",\"./log\":\"y8ug\",\"./merge\":\"QQPV\",\"./modify\":\"VLON\",\"./pinch\":\"g9qR\",\"./scale\":\"M5h0\",\"./scale-gradient\":\"baq4\",\"./shape\":\"Xqwq\",\"./tree\":\"onKZ\",\"./window\":\"qk1A\",\"./visitors\":\"VCgp\",\"./prefix\":\"IMMj\"}],\"FrXC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"codegenParams\", {\n  enumerable: true,\n  get: function () {\n    return _codegen.codegenParams;\n  }\n});\nObject.defineProperty(exports, \"codeGenerator\", {\n  enumerable: true,\n  get: function () {\n    return _codegen.codeGenerator;\n  }\n});\nObject.defineProperty(exports, \"expressionFunction\", {\n  enumerable: true,\n  get: function () {\n    return _codegen.expressionFunction;\n  }\n});\nObject.defineProperty(exports, \"functionContext\", {\n  enumerable: true,\n  get: function () {\n    return _codegen.functionContext;\n  }\n});\nObject.defineProperty(exports, \"data\", {\n  enumerable: true,\n  get: function () {\n    return _data.data;\n  }\n});\nObject.defineProperty(exports, \"indata\", {\n  enumerable: true,\n  get: function () {\n    return _data.indata;\n  }\n});\nObject.defineProperty(exports, \"setdata\", {\n  enumerable: true,\n  get: function () {\n    return _data.setdata;\n  }\n});\nObject.defineProperty(exports, \"encode\", {\n  enumerable: true,\n  get: function () {\n    return _encode.default;\n  }\n});\nObject.defineProperty(exports, \"format\", {\n  enumerable: true,\n  get: function () {\n    return _format.format;\n  }\n});\nObject.defineProperty(exports, \"utcFormat\", {\n  enumerable: true,\n  get: function () {\n    return _format.utcFormat;\n  }\n});\nObject.defineProperty(exports, \"timeFormat\", {\n  enumerable: true,\n  get: function () {\n    return _format.timeFormat;\n  }\n});\nObject.defineProperty(exports, \"utcParse\", {\n  enumerable: true,\n  get: function () {\n    return _format.utcParse;\n  }\n});\nObject.defineProperty(exports, \"timeParse\", {\n  enumerable: true,\n  get: function () {\n    return _format.timeParse;\n  }\n});\nObject.defineProperty(exports, \"monthFormat\", {\n  enumerable: true,\n  get: function () {\n    return _format.monthFormat;\n  }\n});\nObject.defineProperty(exports, \"monthAbbrevFormat\", {\n  enumerable: true,\n  get: function () {\n    return _format.monthAbbrevFormat;\n  }\n});\nObject.defineProperty(exports, \"dayFormat\", {\n  enumerable: true,\n  get: function () {\n    return _format.dayFormat;\n  }\n});\nObject.defineProperty(exports, \"dayAbbrevFormat\", {\n  enumerable: true,\n  get: function () {\n    return _format.dayAbbrevFormat;\n  }\n});\nObject.defineProperty(exports, \"geoArea\", {\n  enumerable: true,\n  get: function () {\n    return _geo.geoArea;\n  }\n});\nObject.defineProperty(exports, \"geoBounds\", {\n  enumerable: true,\n  get: function () {\n    return _geo.geoBounds;\n  }\n});\nObject.defineProperty(exports, \"geoCentroid\", {\n  enumerable: true,\n  get: function () {\n    return _geo.geoCentroid;\n  }\n});\nObject.defineProperty(exports, \"inScope\", {\n  enumerable: true,\n  get: function () {\n    return _inscope.default;\n  }\n});\nObject.defineProperty(exports, \"warn\", {\n  enumerable: true,\n  get: function () {\n    return _log.warn;\n  }\n});\nObject.defineProperty(exports, \"info\", {\n  enumerable: true,\n  get: function () {\n    return _log.info;\n  }\n});\nObject.defineProperty(exports, \"debug\", {\n  enumerable: true,\n  get: function () {\n    return _log.debug;\n  }\n});\nObject.defineProperty(exports, \"luminance\", {\n  enumerable: true,\n  get: function () {\n    return _luminance.luminance;\n  }\n});\nObject.defineProperty(exports, \"contrast\", {\n  enumerable: true,\n  get: function () {\n    return _luminance.contrast;\n  }\n});\nObject.defineProperty(exports, \"merge\", {\n  enumerable: true,\n  get: function () {\n    return _merge.default;\n  }\n});\nObject.defineProperty(exports, \"modify\", {\n  enumerable: true,\n  get: function () {\n    return _modify.default;\n  }\n});\nObject.defineProperty(exports, \"pinchDistance\", {\n  enumerable: true,\n  get: function () {\n    return _pinch.pinchDistance;\n  }\n});\nObject.defineProperty(exports, \"pinchAngle\", {\n  enumerable: true,\n  get: function () {\n    return _pinch.pinchAngle;\n  }\n});\nObject.defineProperty(exports, \"DataPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _prefix.DataPrefix;\n  }\n});\nObject.defineProperty(exports, \"IndexPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _prefix.IndexPrefix;\n  }\n});\nObject.defineProperty(exports, \"ScalePrefix\", {\n  enumerable: true,\n  get: function () {\n    return _prefix.ScalePrefix;\n  }\n});\nObject.defineProperty(exports, \"SignalPrefix\", {\n  enumerable: true,\n  get: function () {\n    return _prefix.SignalPrefix;\n  }\n});\nObject.defineProperty(exports, \"range\", {\n  enumerable: true,\n  get: function () {\n    return _scale.range;\n  }\n});\nObject.defineProperty(exports, \"domain\", {\n  enumerable: true,\n  get: function () {\n    return _scale.domain;\n  }\n});\nObject.defineProperty(exports, \"bandwidth\", {\n  enumerable: true,\n  get: function () {\n    return _scale.bandwidth;\n  }\n});\nObject.defineProperty(exports, \"bandspace\", {\n  enumerable: true,\n  get: function () {\n    return _scale.bandspace;\n  }\n});\nObject.defineProperty(exports, \"copy\", {\n  enumerable: true,\n  get: function () {\n    return _scale.copy;\n  }\n});\nObject.defineProperty(exports, \"scale\", {\n  enumerable: true,\n  get: function () {\n    return _scale.scale;\n  }\n});\nObject.defineProperty(exports, \"invert\", {\n  enumerable: true,\n  get: function () {\n    return _scale.invert;\n  }\n});\nObject.defineProperty(exports, \"scaleGradient\", {\n  enumerable: true,\n  get: function () {\n    return _scaleGradient.default;\n  }\n});\nObject.defineProperty(exports, \"geoShape\", {\n  enumerable: true,\n  get: function () {\n    return _shape.geoShape;\n  }\n});\nObject.defineProperty(exports, \"pathShape\", {\n  enumerable: true,\n  get: function () {\n    return _shape.pathShape;\n  }\n});\nObject.defineProperty(exports, \"treePath\", {\n  enumerable: true,\n  get: function () {\n    return _tree.treePath;\n  }\n});\nObject.defineProperty(exports, \"treeAncestors\", {\n  enumerable: true,\n  get: function () {\n    return _tree.treeAncestors;\n  }\n});\nObject.defineProperty(exports, \"containerSize\", {\n  enumerable: true,\n  get: function () {\n    return _window.containerSize;\n  }\n});\nObject.defineProperty(exports, \"screen\", {\n  enumerable: true,\n  get: function () {\n    return _window.screen;\n  }\n});\nObject.defineProperty(exports, \"windowSize\", {\n  enumerable: true,\n  get: function () {\n    return _window.windowSize;\n  }\n});\nObject.defineProperty(exports, \"dataVisitor\", {\n  enumerable: true,\n  get: function () {\n    return _visitors.dataVisitor;\n  }\n});\nObject.defineProperty(exports, \"indataVisitor\", {\n  enumerable: true,\n  get: function () {\n    return _visitors.indataVisitor;\n  }\n});\nObject.defineProperty(exports, \"scaleVisitor\", {\n  enumerable: true,\n  get: function () {\n    return _visitors.scaleVisitor;\n  }\n});\nObject.defineProperty(exports, \"formatLocale\", {\n  enumerable: true,\n  get: function () {\n    return _d3Format.formatDefaultLocale;\n  }\n});\nObject.defineProperty(exports, \"timeFormatLocale\", {\n  enumerable: true,\n  get: function () {\n    return _d3TimeFormat.timeFormatDefaultLocale;\n  }\n});\n\nvar _codegen = require(\"./src/codegen\");\n\nvar _data = require(\"./src/data\");\n\nvar _encode = _interopRequireDefault(require(\"./src/encode\"));\n\nvar _format = require(\"./src/format\");\n\nvar _geo = require(\"./src/geo\");\n\nvar _inscope = _interopRequireDefault(require(\"./src/inscope\"));\n\nvar _log = require(\"./src/log\");\n\nvar _luminance = require(\"./src/luminance\");\n\nvar _merge = _interopRequireDefault(require(\"./src/merge\"));\n\nvar _modify = _interopRequireDefault(require(\"./src/modify\"));\n\nvar _pinch = require(\"./src/pinch\");\n\nvar _prefix = require(\"./src/prefix.js\");\n\nvar _scale = require(\"./src/scale\");\n\nvar _scaleGradient = _interopRequireDefault(require(\"./src/scale-gradient\"));\n\nvar _shape = require(\"./src/shape\");\n\nvar _tree = require(\"./src/tree\");\n\nvar _window = require(\"./src/window\");\n\nvar _visitors = require(\"./src/visitors\");\n\nvar _d3Format = require(\"d3-format\");\n\nvar _d3TimeFormat = require(\"d3-time-format\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/codegen\":\"nD6E\",\"./src/data\":\"YL30\",\"./src/encode\":\"sXyN\",\"./src/format\":\"gjtr\",\"./src/geo\":\"w4xQ\",\"./src/inscope\":\"PPFk\",\"./src/log\":\"y8ug\",\"./src/luminance\":\"O27n\",\"./src/merge\":\"QQPV\",\"./src/modify\":\"VLON\",\"./src/pinch\":\"g9qR\",\"./src/prefix.js\":\"IMMj\",\"./src/scale\":\"M5h0\",\"./src/scale-gradient\":\"baq4\",\"./src/shape\":\"Xqwq\",\"./src/tree\":\"onKZ\",\"./src/window\":\"qk1A\",\"./src/visitors\":\"VCgp\",\"d3-format\":\"VuZR\",\"d3-time-format\":\"UYpZ\"}],\"EqyF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = expression;\nexports.operatorExpression = operatorExpression;\nexports.parameterExpression = parameterExpression;\nexports.eventExpression = eventExpression;\nexports.handlerExpression = handlerExpression;\nexports.encodeExpression = encodeExpression;\n\n/**\n * Parse an expression given the argument signature and body code.\n */\nfunction expression(args, code, ctx) {\n  // wrap code in return statement if expression does not terminate\n  if (code[code.length - 1] !== ';') {\n    code = 'return(' + code + ');';\n  }\n\n  var fn = Function.apply(null, args.concat(code));\n  return ctx && ctx.functions ? fn.bind(ctx.functions) : fn;\n}\n/**\n * Parse an expression used to update an operator value.\n */\n\n\nfunction operatorExpression(code, ctx) {\n  return expression(['_'], code, ctx);\n}\n/**\n * Parse an expression provided as an operator parameter value.\n */\n\n\nfunction parameterExpression(code, ctx) {\n  return expression(['datum', '_'], code, ctx);\n}\n/**\n * Parse an expression applied to an event stream.\n */\n\n\nfunction eventExpression(code, ctx) {\n  return expression(['event'], code, ctx);\n}\n/**\n * Parse an expression used to handle an event-driven operator update.\n */\n\n\nfunction handlerExpression(code, ctx) {\n  return expression(['_', 'event'], code, ctx);\n}\n/**\n * Parse an expression that performs visual encoding.\n */\n\n\nfunction encodeExpression(code, ctx) {\n  return expression(['item', '_'], code, ctx);\n}\n},{}],\"ypt2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parseParameters;\n\nvar _dataflow = _interopRequireDefault(require(\"./dataflow\"));\n\nvar _expression = require(\"./expression\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Parse a set of operator parameters.\n */\nfunction parseParameters(spec, ctx, params) {\n  params = params || {};\n  var key, value;\n\n  for (key in spec) {\n    value = spec[key];\n    params[key] = (0, _vegaUtil.isArray)(value) ? value.map(function (v) {\n      return parseParameter(v, ctx, params);\n    }) : parseParameter(value, ctx, params);\n  }\n\n  return params;\n}\n/**\n * Parse a single parameter.\n */\n\n\nfunction parseParameter(spec, ctx, params) {\n  if (!spec || !(0, _vegaUtil.isObject)(spec)) return spec;\n\n  for (var i = 0, n = PARSERS.length, p; i < n; ++i) {\n    p = PARSERS[i];\n\n    if ((0, _vegaUtil.hasOwnProperty)(spec, p.key)) {\n      return p.parse(spec, ctx, params);\n    }\n  }\n\n  return spec;\n}\n/** Reference parsers. */\n\n\nvar PARSERS = [{\n  key: '$ref',\n  parse: getOperator\n}, {\n  key: '$key',\n  parse: getKey\n}, {\n  key: '$expr',\n  parse: getExpression\n}, {\n  key: '$field',\n  parse: getField\n}, {\n  key: '$encode',\n  parse: getEncode\n}, {\n  key: '$compare',\n  parse: getCompare\n}, {\n  key: '$context',\n  parse: getContext\n}, {\n  key: '$subflow',\n  parse: getSubflow\n}, {\n  key: '$tupleid',\n  parse: getTupleId\n}];\n/**\n * Resolve an operator reference.\n */\n\nfunction getOperator(_, ctx) {\n  return ctx.get(_.$ref) || (0, _vegaUtil.error)('Operator not defined: ' + _.$ref);\n}\n/**\n * Resolve an expression reference.\n */\n\n\nfunction getExpression(_, ctx, params) {\n  if (_.$params) {\n    // parse expression parameters\n    parseParameters(_.$params, ctx, params);\n  }\n\n  var k = 'e:' + _.$expr + '_' + _.$name;\n  return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.accessor)((0, _expression.parameterExpression)(_.$expr, ctx), _.$fields, _.$name));\n}\n/**\n * Resolve a key accessor reference.\n */\n\n\nfunction getKey(_, ctx) {\n  var k = 'k:' + _.$key + '_' + !!_.$flat;\n  return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.key)(_.$key, _.$flat));\n}\n/**\n * Resolve a field accessor reference.\n */\n\n\nfunction getField(_, ctx) {\n  if (!_.$field) return null;\n  var k = 'f:' + _.$field + '_' + _.$name;\n  return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.field)(_.$field, _.$name));\n}\n/**\n * Resolve a comparator function reference.\n */\n\n\nfunction getCompare(_, ctx) {\n  var k = 'c:' + _.$compare + '_' + _.$order,\n      c = (0, _vegaUtil.array)(_.$compare).map(function (_) {\n    return _ && _.$tupleid ? _vegaDataflow.tupleid : _;\n  });\n  return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.compare)(c, _.$order));\n}\n/**\n * Resolve an encode operator reference.\n */\n\n\nfunction getEncode(_, ctx) {\n  var spec = _.$encode,\n      encode = {},\n      name,\n      enc;\n\n  for (name in spec) {\n    enc = spec[name];\n    encode[name] = (0, _vegaUtil.accessor)((0, _expression.encodeExpression)(enc.$expr, ctx), enc.$fields);\n    encode[name].output = enc.$output;\n  }\n\n  return encode;\n}\n/**\n * Resolve a context reference.\n */\n\n\nfunction getContext(_, ctx) {\n  return ctx;\n}\n/**\n * Resolve a recursive subflow specification.\n */\n\n\nfunction getSubflow(_, ctx) {\n  var spec = _.$subflow;\n  return function (dataflow, key, parent) {\n    var subctx = (0, _dataflow.default)(spec, ctx.fork()),\n        op = subctx.get(spec.operators[0].id),\n        p = subctx.signals.parent;\n    if (p) p.set(parent);\n    return op;\n  };\n}\n/**\n * Resolve a tuple id reference.\n */\n\n\nfunction getTupleId() {\n  return _vegaDataflow.tupleid;\n}\n},{\"./dataflow\":\"qaPB\",\"./expression\":\"EqyF\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"YER6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.canonicalType = canonicalType;\nexports.isOperator = isOperator;\nexports.isCollect = isCollect;\n\nfunction canonicalType(type) {\n  return (type + '').toLowerCase();\n}\n\nfunction isOperator(type) {\n  return canonicalType(type) === 'operator';\n}\n\nfunction isCollect(type) {\n  return canonicalType(type) === 'collect';\n}\n},{}],\"pylB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.parseOperatorParameters = parseOperatorParameters;\n\nvar _expression = require(\"./expression\");\n\nvar _parameters = _interopRequireDefault(require(\"./parameters\"));\n\nvar _util = require(\"./util\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Parse a dataflow operator.\n */\nfunction _default(spec, ctx) {\n  if ((0, _util.isOperator)(spec.type) || !spec.type) {\n    ctx.operator(spec, spec.update ? (0, _expression.operatorExpression)(spec.update, ctx) : null);\n  } else {\n    ctx.transform(spec, spec.type);\n  }\n}\n/**\n * Parse and assign operator parameters.\n */\n\n\nfunction parseOperatorParameters(spec, ctx) {\n  if (spec.params) {\n    var op = ctx.get(spec.id);\n    if (!op) (0, _vegaUtil.error)('Invalid operator id: ' + spec.id);\n    ctx.dataflow.connect(op, op.parameters((0, _parameters.default)(spec.params, ctx), spec.react, spec.initonly));\n  }\n}\n},{\"./expression\":\"EqyF\",\"./parameters\":\"ypt2\",\"./util\":\"YER6\",\"vega-util\":\"d61Z\"}],\"yTOr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _expression = require(\"./expression\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Parse an event stream specification.\n */\nfunction _default(spec, ctx) {\n  var filter = spec.filter != null ? (0, _expression.eventExpression)(spec.filter, ctx) : undefined,\n      stream = spec.stream != null ? ctx.get(spec.stream) : undefined,\n      args;\n\n  if (spec.source) {\n    stream = ctx.events(spec.source, spec.type, filter);\n  } else if (spec.merge) {\n    args = spec.merge.map(ctx.get.bind(ctx));\n    stream = args[0].merge.apply(args[0], args.slice(1));\n  }\n\n  if (spec.between) {\n    args = spec.between.map(ctx.get.bind(ctx));\n    stream = stream.between(args[0], args[1]);\n  }\n\n  if (spec.filter) {\n    stream = stream.filter(filter);\n  }\n\n  if (spec.throttle != null) {\n    stream = stream.throttle(+spec.throttle);\n  }\n\n  if (spec.debounce != null) {\n    stream = stream.debounce(+spec.debounce);\n  }\n\n  if (stream == null) {\n    (0, _vegaUtil.error)('Invalid stream definition: ' + JSON.stringify(spec));\n  }\n\n  if (spec.consume) stream.consume(true);\n  ctx.stream(spec, stream);\n}\n},{\"./expression\":\"EqyF\",\"vega-util\":\"d61Z\"}],\"xbie\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _expression = require(\"./expression\");\n\nvar _parameters = _interopRequireDefault(require(\"./parameters\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Parse an event-driven operator update.\n */\nfunction _default(spec, ctx) {\n  var srcid = (0, _vegaUtil.isObject)(srcid = spec.source) ? srcid.$ref : srcid,\n      source = ctx.get(srcid),\n      target = null,\n      update = spec.update,\n      params = undefined;\n  if (!source) (0, _vegaUtil.error)('Source not defined: ' + spec.source);\n\n  if (spec.target && spec.target.$expr) {\n    target = (0, _expression.eventExpression)(spec.target.$expr, ctx);\n  } else {\n    target = ctx.get(spec.target);\n  }\n\n  if (update && update.$expr) {\n    if (update.$params) {\n      params = (0, _parameters.default)(update.$params, ctx);\n    }\n\n    update = (0, _expression.handlerExpression)(update.$expr, ctx);\n  }\n\n  ctx.update(spec, source, target, update, params);\n}\n},{\"./expression\":\"EqyF\",\"./parameters\":\"ypt2\",\"vega-util\":\"d61Z\"}],\"qaPB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _operator = _interopRequireWildcard(require(\"./operator\"));\n\nvar _stream = _interopRequireDefault(require(\"./stream\"));\n\nvar _update = _interopRequireDefault(require(\"./update\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n/**\n * Parse a serialized dataflow specification.\n */\nfunction _default(spec, ctx) {\n  var operators = spec.operators || []; // parse background\n\n  if (spec.background) {\n    ctx.background = spec.background;\n  } // parse event configuration\n\n\n  if (spec.eventConfig) {\n    ctx.eventConfig = spec.eventConfig;\n  } // parse operators\n\n\n  operators.forEach(function (entry) {\n    (0, _operator.default)(entry, ctx);\n  }); // parse operator parameters\n\n  operators.forEach(function (entry) {\n    (0, _operator.parseOperatorParameters)(entry, ctx);\n  }); // parse streams\n\n  (spec.streams || []).forEach(function (entry) {\n    (0, _stream.default)(entry, ctx);\n  }); // parse updates\n\n  (spec.updates || []).forEach(function (entry) {\n    (0, _update.default)(entry, ctx);\n  });\n  return ctx.resolve();\n}\n},{\"./operator\":\"pylB\",\"./stream\":\"yTOr\",\"./update\":\"xbie\"}],\"n4NT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getState = getState;\nexports.setState = setState;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar SKIP = {\n  skip: true\n};\n\nfunction getState(options) {\n  var ctx = this,\n      state = {};\n\n  if (options.signals) {\n    var signals = state.signals = {};\n    Object.keys(ctx.signals).forEach(function (key) {\n      var op = ctx.signals[key];\n\n      if (options.signals(key, op)) {\n        signals[key] = op.value;\n      }\n    });\n  }\n\n  if (options.data) {\n    var data = state.data = {};\n    Object.keys(ctx.data).forEach(function (key) {\n      var dataset = ctx.data[key];\n\n      if (options.data(key, dataset)) {\n        data[key] = dataset.input.value;\n      }\n    });\n  }\n\n  if (ctx.subcontext && options.recurse !== false) {\n    state.subcontext = ctx.subcontext.map(function (ctx) {\n      return ctx.getState(options);\n    });\n  }\n\n  return state;\n}\n\nfunction setState(state) {\n  var ctx = this,\n      df = ctx.dataflow,\n      data = state.data,\n      signals = state.signals;\n  Object.keys(signals || {}).forEach(function (key) {\n    df.update(ctx.signals[key], signals[key], SKIP);\n  });\n  Object.keys(data || {}).forEach(function (key) {\n    df.pulse(ctx.data[key].input, df.changeset().remove(_vegaUtil.truthy).insert(data[key]));\n  });\n  (state.subcontext || []).forEach(function (substate, i) {\n    var subctx = ctx.subcontext[i];\n    if (subctx) subctx.setState(substate);\n  });\n}\n},{\"vega-util\":\"d61Z\"}],\"n22A\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _state = require(\"./state\");\n\nvar _util = require(\"./util\");\n\n/**\n * Context objects store the current parse state.\n * Enables lookup of parsed operators, event streams, accessors, etc.\n * Provides a 'fork' method for creating child contexts for subflows.\n */\nfunction _default(df, transforms, functions) {\n  return new Context(df, transforms, functions);\n}\n\nfunction Context(df, transforms, functions) {\n  this.dataflow = df;\n  this.transforms = transforms;\n  this.events = df.events.bind(df);\n  this.signals = {};\n  this.scales = {};\n  this.nodes = {};\n  this.data = {};\n  this.fn = {};\n\n  if (functions) {\n    this.functions = Object.create(functions);\n    this.functions.context = this;\n  }\n}\n\nfunction ContextFork(ctx) {\n  this.dataflow = ctx.dataflow;\n  this.transforms = ctx.transforms;\n  this.functions = ctx.functions;\n  this.events = ctx.events;\n  this.signals = Object.create(ctx.signals);\n  this.scales = Object.create(ctx.scales);\n  this.nodes = Object.create(ctx.nodes);\n  this.data = Object.create(ctx.data);\n  this.fn = Object.create(ctx.fn);\n\n  if (ctx.functions) {\n    this.functions = Object.create(ctx.functions);\n    this.functions.context = this;\n  }\n}\n\nContext.prototype = ContextFork.prototype = {\n  fork: function () {\n    var ctx = new ContextFork(this);\n    (this.subcontext || (this.subcontext = [])).push(ctx);\n    return ctx;\n  },\n  get: function (id) {\n    return this.nodes[id];\n  },\n  set: function (id, node) {\n    return this.nodes[id] = node;\n  },\n  add: function (spec, op) {\n    var ctx = this,\n        df = ctx.dataflow,\n        data;\n    ctx.set(spec.id, op);\n\n    if ((0, _util.isCollect)(spec.type) && (data = spec.value)) {\n      if (data.$ingest) {\n        df.ingest(op, data.$ingest, data.$format);\n      } else if (data.$request) {\n        df.preload(op, data.$request, data.$format);\n      } else {\n        df.pulse(op, df.changeset().insert(data));\n      }\n    }\n\n    if (spec.root) {\n      ctx.root = op;\n    }\n\n    if (spec.parent) {\n      var p = ctx.get(spec.parent.$ref);\n\n      if (p) {\n        df.connect(p, [op]);\n        op.targets().add(p);\n      } else {\n        (ctx.unresolved = ctx.unresolved || []).push(function () {\n          p = ctx.get(spec.parent.$ref);\n          df.connect(p, [op]);\n          op.targets().add(p);\n        });\n      }\n    }\n\n    if (spec.signal) {\n      ctx.signals[spec.signal] = op;\n    }\n\n    if (spec.scale) {\n      ctx.scales[spec.scale] = op;\n    }\n\n    if (spec.data) {\n      for (var name in spec.data) {\n        data = ctx.data[name] || (ctx.data[name] = {});\n        spec.data[name].forEach(function (role) {\n          data[role] = op;\n        });\n      }\n    }\n  },\n  resolve: function () {\n    (this.unresolved || []).forEach(function (fn) {\n      fn();\n    });\n    delete this.unresolved;\n    return this;\n  },\n  operator: function (spec, update) {\n    this.add(spec, this.dataflow.add(spec.value, update));\n  },\n  transform: function (spec, type) {\n    this.add(spec, this.dataflow.add(this.transforms[(0, _util.canonicalType)(type)]));\n  },\n  stream: function (spec, stream) {\n    this.set(spec.id, stream);\n  },\n  update: function (spec, stream, target, update, params) {\n    this.dataflow.on(stream, target, update, params, spec.options);\n  },\n  getState: _state.getState,\n  setState: _state.setState\n};\n},{\"./state\":\"n4NT\",\"./util\":\"YER6\"}],\"R9ZC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"parse\", {\n  enumerable: true,\n  get: function () {\n    return _dataflow.default;\n  }\n});\nObject.defineProperty(exports, \"context\", {\n  enumerable: true,\n  get: function () {\n    return _context.default;\n  }\n});\nObject.defineProperty(exports, \"expression\", {\n  enumerable: true,\n  get: function () {\n    return _expression.default;\n  }\n});\n\nvar _dataflow = _interopRequireDefault(require(\"./src/dataflow\"));\n\nvar _context = _interopRequireDefault(require(\"./src/context\"));\n\nvar _expression = _interopRequireDefault(require(\"./src/expression\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/dataflow\":\"qaPB\",\"./src/context\":\"n22A\",\"./src/expression\":\"EqyF\"}],\"eq01\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaFunctions = require(\"vega-functions\");\n\nvar _vegaRuntime = require(\"vega-runtime\");\n\nfunction _default(view, spec, functions) {\n  var fn = functions || _vegaFunctions.functionContext;\n  return (0, _vegaRuntime.parse)(spec, (0, _vegaRuntime.context)(view, _vegaDataflow.transforms, fn));\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-functions\":\"FrXC\",\"vega-runtime\":\"R9ZC\"}],\"Z4QG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.scale = scale;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction scale(name) {\n  var scales = this._runtime.scales;\n\n  if (!(0, _vegaUtil.hasOwnProperty)(scales, name)) {\n    (0, _vegaUtil.error)('Unrecognized scale or projection: ' + name);\n  }\n\n  return scales[name].value;\n}\n},{\"vega-util\":\"d61Z\"}],\"PRp5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.viewWidth = viewWidth;\nexports.viewHeight = viewHeight;\nexports.initializeResize = initializeResize;\nexports.resizeView = resizeView;\nvar Width = 'width',\n    Height = 'height',\n    Padding = 'padding',\n    Skip = {\n  skip: true\n};\n\nfunction viewWidth(view, width) {\n  var a = view.autosize(),\n      p = view.padding();\n  return width - (a && a.contains === Padding ? p.left + p.right : 0);\n}\n\nfunction viewHeight(view, height) {\n  var a = view.autosize(),\n      p = view.padding();\n  return height - (a && a.contains === Padding ? p.top + p.bottom : 0);\n}\n\nfunction initializeResize(view) {\n  var s = view._signals,\n      w = s[Width],\n      h = s[Height],\n      p = s[Padding];\n\n  function resetSize() {\n    view._autosize = view._resize = 1;\n  } // respond to width signal\n\n\n  view._resizeWidth = view.add(null, function (_) {\n    view._width = _.size;\n    view._viewWidth = viewWidth(view, _.size);\n    resetSize();\n  }, {\n    size: w\n  }); // respond to height signal\n\n  view._resizeHeight = view.add(null, function (_) {\n    view._height = _.size;\n    view._viewHeight = viewHeight(view, _.size);\n    resetSize();\n  }, {\n    size: h\n  }); // respond to padding signal\n\n  var resizePadding = view.add(null, resetSize, {\n    pad: p\n  }); // set rank to run immediately after source signal\n\n  view._resizeWidth.rank = w.rank + 1;\n  view._resizeHeight.rank = h.rank + 1;\n  resizePadding.rank = p.rank + 1;\n}\n\nfunction resizeView(viewWidth, viewHeight, width, height, origin, auto) {\n  this.runAfter(function (view) {\n    var rerun = 0; // reset autosize flag\n\n    view._autosize = 0; // width value changed: update signal, skip resize op\n\n    if (view.width() !== width) {\n      rerun = 1;\n      view.signal(Width, width, Skip); // set width, skip update calc\n\n      view._resizeWidth.skip(true); // skip width resize handler\n\n    } // height value changed: update signal, skip resize op\n\n\n    if (view.height() !== height) {\n      rerun = 1;\n      view.signal(Height, height, Skip); // set height, skip update calc\n\n      view._resizeHeight.skip(true); // skip height resize handler\n\n    } // view width changed: update view property, set resize flag\n\n\n    if (view._viewWidth !== viewWidth) {\n      view._resize = 1;\n      view._viewWidth = viewWidth;\n    } // view height changed: update view property, set resize flag\n\n\n    if (view._viewHeight !== viewHeight) {\n      view._resize = 1;\n      view._viewHeight = viewHeight;\n    } // origin changed: update view property, set resize flag\n\n\n    if (view._origin[0] !== origin[0] || view._origin[1] !== origin[1]) {\n      view._resize = 1;\n      view._origin = origin;\n    } // run dataflow on width/height signal change\n\n\n    if (rerun) view.run('enter');\n    if (auto) view.runAfter(v => v.resize());\n  }, false, 1);\n}\n},{}],\"m0Q3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getState = getState;\nexports.setState = setState;\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\n/**\n * Get the current view state, consisting of signal values and/or data sets.\n * @param {object} [options] - Options flags indicating which state to export.\n *   If unspecified, all signals and data sets will be exported.\n * @param {function(string, Operator):boolean} [options.signals] - Optional\n *   predicate function for testing if a signal should be included in the\n *   exported state. If unspecified, all signals will be included, except for\n *   those named 'parent' or those which refer to a Transform value.\n * @param {function(string, object):boolean} [options.data] - Optional\n *   predicate function for testing if a data set's input should be included\n *   in the exported state. If unspecified, all data sets that have been\n *   explicitly modified will be included.\n * @param {boolean} [options.recurse=true] - Flag indicating if the exported\n *   state should recursively include state from group mark sub-contexts.\n * @return {object} - An object containing the exported state values.\n */\nfunction getState(options) {\n  return this._runtime.getState(options || {\n    data: dataTest,\n    signals: signalTest,\n    recurse: true\n  });\n}\n\nfunction dataTest(name, data) {\n  return data.modified && (0, _vegaUtil.isArray)(data.input.value) && name.indexOf('_:vega:_');\n}\n\nfunction signalTest(name, op) {\n  return !(name === 'parent' || op instanceof _vegaDataflow.transforms.proxy);\n}\n/**\n * Sets the current view state and updates the view by invoking run.\n * @param {object} state - A state object containing signal and/or\n *   data set values, following the format used by the getState method.\n * @return {View} - This view instance.\n */\n\n\nfunction setState(state) {\n  this.runAsync(null, v => {\n    v._trigger = false;\n\n    v._runtime.setState(state);\n  }, v => {\n    v._trigger = true;\n  });\n  return this;\n}\n},{\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"QV0B\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _d3Timer = require(\"d3-timer\");\n\nfunction _default(callback, delay) {\n  function tick(elapsed) {\n    callback({\n      timestamp: Date.now(),\n      elapsed: elapsed\n    });\n  }\n\n  this._timers.push((0, _d3Timer.interval)(tick, delay));\n}\n},{\"d3-timer\":\"rdzS\"}],\"KUss\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(handler, event, item, value) {\n  var el = handler.element();\n  if (el) el.setAttribute('title', formatTooltip(value));\n}\n\nfunction formatTooltip(value) {\n  return value == null ? '' : (0, _vegaUtil.isArray)(value) ? formatArray(value) : (0, _vegaUtil.isObject)(value) && !(0, _vegaUtil.isDate)(value) ? formatObject(value) : value + '';\n}\n\nfunction formatObject(obj) {\n  return Object.keys(obj).map(function (key) {\n    var v = obj[key];\n    return key + ': ' + ((0, _vegaUtil.isArray)(v) ? formatArray(v) : formatValue(v));\n  }).join('\\n');\n}\n\nfunction formatArray(value) {\n  return '[' + value.map(formatValue).join(', ') + ']';\n}\n\nfunction formatValue(value) {\n  return (0, _vegaUtil.isArray)(value) ? '[\\u2026]' : (0, _vegaUtil.isObject)(value) && !(0, _vegaUtil.isDate)(value) ? '{\\u2026}' : value;\n}\n},{\"vega-util\":\"d61Z\"}],\"Z9U4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = View;\n\nvar _cursor = _interopRequireDefault(require(\"./cursor\"));\n\nvar _data = require(\"./data\");\n\nvar _events = require(\"./events\");\n\nvar _hover = _interopRequireDefault(require(\"./hover\"));\n\nvar _finalize = _interopRequireDefault(require(\"./finalize\"));\n\nvar _initialize = _interopRequireDefault(require(\"./initialize\"));\n\nvar _renderToImageUrl = _interopRequireDefault(require(\"./render-to-image-url\"));\n\nvar _renderToCanvas = _interopRequireDefault(require(\"./render-to-canvas\"));\n\nvar _renderToSvg = _interopRequireDefault(require(\"./render-to-svg\"));\n\nvar _renderSize = require(\"./render-size\");\n\nvar _runtime = _interopRequireDefault(require(\"./runtime\"));\n\nvar _scale = require(\"./scale\");\n\nvar _size = require(\"./size\");\n\nvar _state = require(\"./state\");\n\nvar _timer = _interopRequireDefault(require(\"./timer\"));\n\nvar _tooltip = _interopRequireDefault(require(\"./tooltip\"));\n\nvar _trap = _interopRequireDefault(require(\"./trap\"));\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Create a new View instance from a Vega dataflow runtime specification.\n * The generated View will not immediately be ready for display. Callers\n * should also invoke the initialize method (e.g., to set the parent\n * DOM element in browser-based deployment) and then invoke the run\n * method to evaluate the dataflow graph. Rendering will automatically\n * be peformed upon dataflow runs.\n * @constructor\n * @param {object} spec - The Vega dataflow runtime specification.\n */\nfunction View(spec, options) {\n  var view = this;\n  options = options || {};\n\n  _vegaDataflow.Dataflow.call(view);\n\n  if (options.loader) view.loader(options.loader);\n  if (options.logger) view.logger(options.logger);\n  if (options.logLevel != null) view.logLevel(options.logLevel);\n  view._el = null;\n  view._elBind = null;\n  view._renderType = options.renderer || _vegaScenegraph.RenderType.Canvas;\n  view._scenegraph = new _vegaScenegraph.Scenegraph();\n  var root = view._scenegraph.root; // initialize renderer, handler and event management\n\n  view._renderer = null;\n  view._tooltip = options.tooltip || _tooltip.default, view._redraw = true;\n  view._handler = new _vegaScenegraph.CanvasHandler().scene(root);\n  view._preventDefault = false;\n  view._timers = [];\n  view._eventListeners = [];\n  view._resizeListeners = []; // initialize event configuration\n\n  view._eventConfig = (0, _events.initializeEventConfig)(spec.eventConfig); // initialize dataflow graph\n\n  var ctx = (0, _runtime.default)(view, spec, options.functions);\n  view._runtime = ctx;\n  view._signals = ctx.signals;\n  view._bind = (spec.bindings || []).map(function (_) {\n    return {\n      state: null,\n      param: (0, _vegaUtil.extend)({}, _)\n    };\n  }); // initialize scenegraph\n\n  if (ctx.root) ctx.root.set(root);\n  root.source = ctx.data.root.input;\n  view.pulse(ctx.data.root.input, view.changeset().insert(root.items)); // initialize background color\n\n  view._background = options.background || ctx.background || null; // initialize view size\n\n  view._width = view.width();\n  view._height = view.height();\n  view._viewWidth = (0, _size.viewWidth)(view, view._width);\n  view._viewHeight = (0, _size.viewHeight)(view, view._height);\n  view._origin = [0, 0];\n  view._resize = 0;\n  view._autosize = 1;\n  (0, _size.initializeResize)(view); // initialize cursor\n\n  (0, _cursor.default)(view); // initialize hover proessing, if requested\n\n  if (options.hover) view.hover(); // initialize DOM container(s) and renderer\n\n  if (options.container) view.initialize(options.container, options.bind);\n}\n\nvar prototype = (0, _vegaUtil.inherits)(View, _vegaDataflow.Dataflow); // -- DATAFLOW / RENDERING ----\n\nprototype.evaluate = async function (encode, prerun, postrun) {\n  // evaluate dataflow and prerun\n  await _vegaDataflow.Dataflow.prototype.evaluate.call(this, encode, prerun); // render as needed\n\n  if (this._redraw || this._resize) {\n    try {\n      if (this._renderer) {\n        if (this._resize) {\n          this._resize = 0;\n          (0, _renderSize.resizeRenderer)(this);\n        }\n\n        await this._renderer.renderAsync(this._scenegraph.root);\n      }\n\n      this._redraw = false;\n    } catch (e) {\n      this.error(e);\n    }\n  } // evaluate postrun\n\n\n  if (postrun) (0, _vegaDataflow.asyncCallback)(this, postrun);\n  return this;\n};\n\nprototype.dirty = function (item) {\n  this._redraw = true;\n  this._renderer && this._renderer.dirty(item);\n}; // -- GET / SET ----\n\n\nprototype.container = function () {\n  return this._el;\n};\n\nprototype.scenegraph = function () {\n  return this._scenegraph;\n};\n\nprototype.origin = function () {\n  return this._origin.slice();\n};\n\nfunction lookupSignal(view, name) {\n  return (0, _vegaUtil.hasOwnProperty)(view._signals, name) ? view._signals[name] : (0, _vegaUtil.error)('Unrecognized signal name: ' + (0, _vegaUtil.stringValue)(name));\n}\n\nprototype.signal = function (name, value, options) {\n  var op = lookupSignal(this, name);\n  return arguments.length === 1 ? op.value : this.update(op, value, options);\n};\n\nprototype.background = function (_) {\n  if (arguments.length) {\n    this._background = _;\n    this._resize = 1;\n    return this;\n  } else {\n    return this._background;\n  }\n};\n\nprototype.width = function (_) {\n  return arguments.length ? this.signal('width', _) : this.signal('width');\n};\n\nprototype.height = function (_) {\n  return arguments.length ? this.signal('height', _) : this.signal('height');\n};\n\nprototype.padding = function (_) {\n  return arguments.length ? this.signal('padding', _) : this.signal('padding');\n};\n\nprototype.autosize = function (_) {\n  return arguments.length ? this.signal('autosize', _) : this.signal('autosize');\n};\n\nprototype.renderer = function (type) {\n  if (!arguments.length) return this._renderType;\n  if (!(0, _vegaScenegraph.renderModule)(type)) (0, _vegaUtil.error)('Unrecognized renderer type: ' + type);\n\n  if (type !== this._renderType) {\n    this._renderType = type;\n\n    this._resetRenderer();\n  }\n\n  return this;\n};\n\nprototype.tooltip = function (handler) {\n  if (!arguments.length) return this._tooltip;\n\n  if (handler !== this._tooltip) {\n    this._tooltip = handler;\n\n    this._resetRenderer();\n  }\n\n  return this;\n};\n\nprototype.loader = function (loader) {\n  if (!arguments.length) return this._loader;\n\n  if (loader !== this._loader) {\n    _vegaDataflow.Dataflow.prototype.loader.call(this, loader);\n\n    this._resetRenderer();\n  }\n\n  return this;\n};\n\nprototype.resize = function () {\n  // set flag to perform autosize\n  this._autosize = 1; // touch autosize signal to ensure top-level ViewLayout runs\n\n  return this.touch(lookupSignal(this, 'autosize'));\n};\n\nprototype._resetRenderer = function () {\n  if (this._renderer) {\n    this._renderer = null;\n    this.initialize(this._el, this._elBind);\n  }\n}; // -- SIZING ----\n\n\nprototype._resizeView = _size.resizeView; // -- EVENT HANDLING ----\n\nprototype.addEventListener = function (type, handler, options) {\n  var callback = handler;\n\n  if (!(options && options.trap === false)) {\n    // wrap callback in error handler\n    callback = (0, _trap.default)(this, handler);\n    callback.raw = handler;\n  }\n\n  this._handler.on(type, callback);\n\n  return this;\n};\n\nprototype.removeEventListener = function (type, handler) {\n  var handlers = this._handler.handlers(type),\n      i = handlers.length,\n      h,\n      t; // search registered handlers, remove if match found\n\n\n  while (--i >= 0) {\n    t = handlers[i].type;\n    h = handlers[i].handler;\n\n    if (type === t && (handler === h || handler === h.raw)) {\n      this._handler.off(t, h);\n\n      break;\n    }\n  }\n\n  return this;\n};\n\nprototype.addResizeListener = function (handler) {\n  var l = this._resizeListeners;\n\n  if (l.indexOf(handler) < 0) {\n    // add handler if it isn't already registered\n    // note: error trapping handled elsewhere, so\n    // no need to wrap handlers here\n    l.push(handler);\n  }\n\n  return this;\n};\n\nprototype.removeResizeListener = function (handler) {\n  var l = this._resizeListeners,\n      i = l.indexOf(handler);\n\n  if (i >= 0) {\n    l.splice(i, 1);\n  }\n\n  return this;\n};\n\nfunction findOperatorHandler(op, handler) {\n  var t = op._targets || [],\n      h = t.filter(function (op) {\n    var u = op._update;\n    return u && u.handler === handler;\n  });\n  return h.length ? h[0] : null;\n}\n\nfunction addOperatorListener(view, name, op, handler) {\n  var h = findOperatorHandler(op, handler);\n\n  if (!h) {\n    h = (0, _trap.default)(this, function () {\n      handler(name, op.value);\n    });\n    h.handler = handler;\n    view.on(op, null, h);\n  }\n\n  return view;\n}\n\nfunction removeOperatorListener(view, op, handler) {\n  var h = findOperatorHandler(op, handler);\n  if (h) op._targets.remove(h);\n  return view;\n}\n\nprototype.addSignalListener = function (name, handler) {\n  return addOperatorListener(this, name, lookupSignal(this, name), handler);\n};\n\nprototype.removeSignalListener = function (name, handler) {\n  return removeOperatorListener(this, lookupSignal(this, name), handler);\n};\n\nprototype.addDataListener = function (name, handler) {\n  return addOperatorListener(this, name, (0, _data.dataref)(this, name).values, handler);\n};\n\nprototype.removeDataListener = function (name, handler) {\n  return removeOperatorListener(this, (0, _data.dataref)(this, name).values, handler);\n};\n\nprototype.preventDefault = function (_) {\n  if (arguments.length) {\n    this._preventDefault = _;\n    return this;\n  } else {\n    return this._preventDefault;\n  }\n};\n\nprototype.timer = _timer.default;\nprototype.events = _events.events;\nprototype.finalize = _finalize.default;\nprototype.hover = _hover.default; // -- DATA ----\n\nprototype.data = _data.data;\nprototype.change = _data.change;\nprototype.insert = _data.insert;\nprototype.remove = _data.remove; // -- SCALES --\n\nprototype.scale = _scale.scale; // -- INITIALIZATION ----\n\nprototype.initialize = _initialize.default; // -- HEADLESS RENDERING ----\n\nprototype.toImageURL = _renderToImageUrl.default;\nprototype.toCanvas = _renderToCanvas.default;\nprototype.toSVG = _renderToSvg.default; // -- SAVE / RESTORE STATE ----\n\nprototype.getState = _state.getState;\nprototype.setState = _state.setState;\n},{\"./cursor\":\"RXfG\",\"./data\":\"TaKI\",\"./events\":\"dZD9\",\"./hover\":\"Kn2s\",\"./finalize\":\"CuVS\",\"./initialize\":\"i1hH\",\"./render-to-image-url\":\"QFZT\",\"./render-to-canvas\":\"Ubvp\",\"./render-to-svg\":\"mrgi\",\"./render-size\":\"hR2H\",\"./runtime\":\"eq01\",\"./scale\":\"Z4QG\",\"./size\":\"PRp5\",\"./state\":\"m0Q3\",\"./timer\":\"QV0B\",\"./tooltip\":\"KUss\",\"./trap\":\"yjGJ\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\",\"vega-scenegraph\":\"AgKg\"}],\"YdL8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"View\", {\n  enumerable: true,\n  get: function () {\n    return _View.default;\n  }\n});\n\nvar _View = _interopRequireDefault(require(\"./src/View\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/View\":\"Z9U4\"}],\"FFEQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(spec, config) {\n  spec = spec || config.autosize;\n  return (0, _vegaUtil.isObject)(spec) ? spec : {\n    type: spec || 'pad'\n  };\n}\n},{\"vega-util\":\"d61Z\"}],\"gaaC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(spec, config) {\n  spec = spec || config.padding;\n  return (0, _vegaUtil.isObject)(spec) ? {\n    top: number(spec.top),\n    bottom: number(spec.bottom),\n    left: number(spec.left),\n    right: number(spec.right)\n  } : paddingObject(number(spec));\n}\n\nfunction number(_) {\n  return +_ || 0;\n}\n\nfunction paddingObject(_) {\n  return {\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  };\n}\n},{\"vega-util\":\"d61Z\"}],\"HWh1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar OUTER = 'outer',\n    OUTER_INVALID = ['value', 'update', 'init', 'react', 'bind'];\n\nfunction outerError(prefix, name) {\n  (0, _vegaUtil.error)(prefix + ' for \"outer\" push: ' + (0, _vegaUtil.stringValue)(name));\n}\n\nfunction _default(signal, scope) {\n  var name = signal.name;\n\n  if (signal.push === OUTER) {\n    // signal must already be defined, raise error if not\n    if (!scope.signals[name]) outerError('No prior signal definition', name); // signal push must not use properties reserved for standard definition\n\n    OUTER_INVALID.forEach(function (prop) {\n      if (signal[prop] !== undefined) outerError('Invalid property ', prop);\n    });\n  } else {\n    // define a new signal in the current scope\n    var op = scope.addSignal(name, signal.value);\n    if (signal.react === false) op.react = false;\n    if (signal.bind) scope.addBinding(name, signal.bind);\n  }\n}\n},{\"vega-util\":\"d61Z\"}],\"TGrP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaExpression = require(\"vega-expression\");\n\nvar _vegaFunctions = require(\"vega-functions\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(expr, scope, preamble) {\n  var params = {},\n      ast,\n      gen; // parse the expression to an abstract syntax tree (ast)\n\n  try {\n    expr = (0, _vegaUtil.isString)(expr) ? expr : (0, _vegaUtil.stringValue)(expr) + '';\n    ast = (0, _vegaExpression.parse)(expr);\n  } catch (err) {\n    (0, _vegaUtil.error)('Expression parse error: ' + expr);\n  } // analyze ast function calls for dependencies\n\n\n  ast.visit(function visitor(node) {\n    if (node.type !== _vegaExpression.CallExpression) return;\n    var name = node.callee.name,\n        visit = _vegaFunctions.codegenParams.visitors[name];\n    if (visit) visit(name, node.arguments, scope, params);\n  }); // perform code generation\n\n  gen = (0, _vegaFunctions.codeGenerator)(ast); // collect signal dependencies\n\n  gen.globals.forEach(function (name) {\n    var signalName = _vegaFunctions.SignalPrefix + name;\n\n    if (!(0, _vegaUtil.hasOwnProperty)(params, signalName) && scope.getSignal(name)) {\n      params[signalName] = scope.signalRef(name);\n    }\n  }); // return generated expression code and dependencies\n\n  return {\n    $expr: preamble ? preamble + 'return(' + gen.code + ');' : gen.code,\n    $fields: gen.fields,\n    $params: params\n  };\n}\n},{\"vega-expression\":\"dgqb\",\"vega-functions\":\"FrXC\",\"vega-util\":\"d61Z\"}],\"bnG3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Entry = Entry;\nexports.entry = entry;\nexports.operator = operator;\nexports.ref = ref;\nexports.fieldRef = fieldRef;\nexports.compareRef = compareRef;\nexports.keyRef = keyRef;\nexports.sortKey = sortKey;\nexports.aggrField = aggrField;\nexports.isSignal = isSignal;\nexports.isExpr = isExpr;\nexports.hasSignal = hasSignal;\nexports.value = value;\nexports.deref = deref;\nexports.View = exports.Scope = exports.Descending = exports.Ascending = exports.keyFieldRef = exports.tupleidRef = void 0;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction Entry(type, value, params, parent) {\n  this.id = -1;\n  this.type = type;\n  this.value = value;\n  this.params = params;\n  if (parent) this.parent = parent;\n}\n\nfunction entry(type, value, params, parent) {\n  return new Entry(type, value, params, parent);\n}\n\nfunction operator(value, params) {\n  return entry('operator', value, params);\n} // -----\n\n\nfunction ref(op) {\n  var ref = {\n    $ref: op.id\n  }; // if operator not yet registered, cache ref to resolve later\n\n  if (op.id < 0) (op.refs = op.refs || []).push(ref);\n  return ref;\n}\n\nvar tupleidRef = {\n  $tupleid: 1,\n  toString: function () {\n    return ':_tupleid_:';\n  }\n};\nexports.tupleidRef = tupleidRef;\n\nfunction fieldRef(field, name) {\n  return name ? {\n    $field: field,\n    $name: name\n  } : {\n    $field: field\n  };\n}\n\nvar keyFieldRef = fieldRef('key');\nexports.keyFieldRef = keyFieldRef;\n\nfunction compareRef(fields, orders) {\n  return {\n    $compare: fields,\n    $order: orders\n  };\n}\n\nfunction keyRef(fields, flat) {\n  var ref = {\n    $key: fields\n  };\n  if (flat) ref.$flat = true;\n  return ref;\n} // -----\n\n\nvar Ascending = 'ascending';\nexports.Ascending = Ascending;\nvar Descending = 'descending';\nexports.Descending = Descending;\n\nfunction sortKey(sort) {\n  return !(0, _vegaUtil.isObject)(sort) ? '' : (sort.order === Descending ? '-' : '+') + aggrField(sort.op, sort.field);\n}\n\nfunction aggrField(op, field) {\n  return (op && op.signal ? '$' + op.signal : op || '') + (op && field ? '_' : '') + (field && field.signal ? '$' + field.signal : field || '');\n} // -----\n\n\nvar Scope = 'scope';\nexports.Scope = Scope;\nvar View = 'view';\nexports.View = View;\n\nfunction isSignal(_) {\n  return _ && _.signal;\n}\n\nfunction isExpr(_) {\n  return _ && _.expr;\n}\n\nfunction hasSignal(_) {\n  if (isSignal(_)) return true;\n  if ((0, _vegaUtil.isObject)(_)) for (var key in _) {\n    if (hasSignal(_[key])) return true;\n  }\n  return false;\n}\n\nfunction value(specValue, defaultValue) {\n  return specValue != null ? specValue : defaultValue;\n}\n\nfunction deref(v) {\n  return v && v.signal || v;\n}\n},{\"vega-util\":\"d61Z\"}],\"aoay\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parseStream;\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _util = require(\"../util\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar Timer = 'timer';\n\nfunction parseStream(stream, scope) {\n  var method = stream.merge ? mergeStream : stream.stream ? nestedStream : stream.type ? eventStream : (0, _vegaUtil.error)('Invalid stream specification: ' + (0, _vegaUtil.stringValue)(stream));\n  return method(stream, scope);\n}\n\nfunction eventSource(source) {\n  return source === _util.Scope ? _util.View : source || _util.View;\n}\n\nfunction mergeStream(stream, scope) {\n  var list = stream.merge.map(s => parseStream(s, scope)),\n      entry = streamParameters({\n    merge: list\n  }, stream, scope);\n  return scope.addStream(entry).id;\n}\n\nfunction nestedStream(stream, scope) {\n  var id = parseStream(stream.stream, scope),\n      entry = streamParameters({\n    stream: id\n  }, stream, scope);\n  return scope.addStream(entry).id;\n}\n\nfunction eventStream(stream, scope) {\n  var id, entry;\n\n  if (stream.type === Timer) {\n    id = scope.event(Timer, stream.throttle);\n    stream = {\n      between: stream.between,\n      filter: stream.filter\n    };\n  } else {\n    id = scope.event(eventSource(stream.source), stream.type);\n  }\n\n  entry = streamParameters({\n    stream: id\n  }, stream, scope);\n  return Object.keys(entry).length === 1 ? id : scope.addStream(entry).id;\n}\n\nfunction streamParameters(entry, stream, scope) {\n  var param = stream.between;\n\n  if (param) {\n    if (param.length !== 2) {\n      (0, _vegaUtil.error)('Stream \"between\" parameter must have 2 entries: ' + (0, _vegaUtil.stringValue)(stream));\n    }\n\n    entry.between = [parseStream(param[0], scope), parseStream(param[1], scope)];\n  }\n\n  param = stream.filter ? [].concat(stream.filter) : [];\n\n  if (stream.marktype || stream.markname || stream.markrole) {\n    // add filter for mark type, name and/or role\n    param.push(filterMark(stream.marktype, stream.markname, stream.markrole));\n  }\n\n  if (stream.source === _util.Scope) {\n    // add filter to limit events from sub-scope only\n    param.push('inScope(event.item)');\n  }\n\n  if (param.length) {\n    entry.filter = (0, _expression.default)('(' + param.join(')&&(') + ')').$expr;\n  }\n\n  if ((param = stream.throttle) != null) {\n    entry.throttle = +param;\n  }\n\n  if ((param = stream.debounce) != null) {\n    entry.debounce = +param;\n  }\n\n  if (stream.consume) {\n    entry.consume = true;\n  }\n\n  return entry;\n}\n\nfunction filterMark(type, name, role) {\n  var item = 'event.item';\n  return item + (type && type !== '*' ? '&&' + item + '.mark.marktype===\\'' + type + '\\'' : '') + (role ? '&&' + item + '.mark.role===\\'' + role + '\\'' : '') + (name ? '&&' + item + '.mark.name===\\'' + name + '\\'' : '');\n}\n},{\"./expression\":\"TGrP\",\"../util\":\"bnG3\",\"vega-util\":\"d61Z\"}],\"KGQ9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\n/**\n * Parse an event selector string.\n * Returns an array of event stream definitions.\n */\nfunction _default(selector, source, marks) {\n  DEFAULT_SOURCE = source || VIEW;\n  MARKS = marks || DEFAULT_MARKS;\n  return parseMerge(selector.trim()).map(parseSelector);\n}\n\nvar VIEW = 'view',\n    LBRACK = '[',\n    RBRACK = ']',\n    LBRACE = '{',\n    RBRACE = '}',\n    COLON = ':',\n    COMMA = ',',\n    NAME = '@',\n    GT = '>',\n    ILLEGAL = /[[\\]{}]/,\n    DEFAULT_SOURCE,\n    MARKS,\n    DEFAULT_MARKS = {\n  '*': 1,\n  arc: 1,\n  area: 1,\n  group: 1,\n  image: 1,\n  line: 1,\n  path: 1,\n  rect: 1,\n  rule: 1,\n  shape: 1,\n  symbol: 1,\n  text: 1,\n  trail: 1\n};\n\nfunction isMarkType(type) {\n  return MARKS[type];\n}\n\nfunction find(s, i, endChar, pushChar, popChar) {\n  var count = 0,\n      n = s.length,\n      c;\n\n  for (; i < n; ++i) {\n    c = s[i];\n    if (!count && c === endChar) return i;else if (popChar && popChar.indexOf(c) >= 0) --count;else if (pushChar && pushChar.indexOf(c) >= 0) ++count;\n  }\n\n  return i;\n}\n\nfunction parseMerge(s) {\n  var output = [],\n      start = 0,\n      n = s.length,\n      i = 0;\n\n  while (i < n) {\n    i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n    output.push(s.substring(start, i).trim());\n    start = ++i;\n  }\n\n  if (output.length === 0) {\n    throw 'Empty event selector: ' + s;\n  }\n\n  return output;\n}\n\nfunction parseSelector(s) {\n  return s[0] === '[' ? parseBetween(s) : parseStream(s);\n}\n\nfunction parseBetween(s) {\n  var n = s.length,\n      i = 1,\n      b,\n      stream;\n  i = find(s, i, RBRACK, LBRACK, RBRACK);\n\n  if (i === n) {\n    throw 'Empty between selector: ' + s;\n  }\n\n  b = parseMerge(s.substring(1, i));\n\n  if (b.length !== 2) {\n    throw 'Between selector must have two elements: ' + s;\n  }\n\n  s = s.slice(i + 1).trim();\n\n  if (s[0] !== GT) {\n    throw 'Expected \\'>\\' after between selector: ' + s;\n  }\n\n  b = b.map(parseSelector);\n  stream = parseSelector(s.slice(1).trim());\n\n  if (stream.between) {\n    return {\n      between: b,\n      stream: stream\n    };\n  } else {\n    stream.between = b;\n  }\n\n  return stream;\n}\n\nfunction parseStream(s) {\n  var stream = {\n    source: DEFAULT_SOURCE\n  },\n      source = [],\n      throttle = [0, 0],\n      markname = 0,\n      start = 0,\n      n = s.length,\n      i = 0,\n      j,\n      filter; // extract throttle from end\n\n  if (s[n - 1] === RBRACE) {\n    i = s.lastIndexOf(LBRACE);\n\n    if (i >= 0) {\n      try {\n        throttle = parseThrottle(s.substring(i + 1, n - 1));\n      } catch (e) {\n        throw 'Invalid throttle specification: ' + s;\n      }\n\n      s = s.slice(0, i).trim();\n      n = s.length;\n    } else throw 'Unmatched right brace: ' + s;\n\n    i = 0;\n  }\n\n  if (!n) throw s; // set name flag based on first char\n\n  if (s[0] === NAME) markname = ++i; // extract first part of multi-part stream selector\n\n  j = find(s, i, COLON);\n\n  if (j < n) {\n    source.push(s.substring(start, j).trim());\n    start = i = ++j;\n  } // extract remaining part of stream selector\n\n\n  i = find(s, i, LBRACK);\n\n  if (i === n) {\n    source.push(s.substring(start, n).trim());\n  } else {\n    source.push(s.substring(start, i).trim());\n    filter = [];\n    start = ++i;\n    if (start === n) throw 'Unmatched left bracket: ' + s;\n  } // extract filters\n\n\n  while (i < n) {\n    i = find(s, i, RBRACK);\n    if (i === n) throw 'Unmatched left bracket: ' + s;\n    filter.push(s.substring(start, i).trim());\n    if (i < n - 1 && s[++i] !== LBRACK) throw 'Expected left bracket: ' + s;\n    start = ++i;\n  } // marshall event stream specification\n\n\n  if (!(n = source.length) || ILLEGAL.test(source[n - 1])) {\n    throw 'Invalid event selector: ' + s;\n  }\n\n  if (n > 1) {\n    stream.type = source[1];\n\n    if (markname) {\n      stream.markname = source[0].slice(1);\n    } else if (isMarkType(source[0])) {\n      stream.marktype = source[0];\n    } else {\n      stream.source = source[0];\n    }\n  } else {\n    stream.type = source[0];\n  }\n\n  if (stream.type.slice(-1) === '!') {\n    stream.consume = true;\n    stream.type = stream.type.slice(0, -1);\n  }\n\n  if (filter != null) stream.filter = filter;\n  if (throttle[0]) stream.throttle = throttle[0];\n  if (throttle[1]) stream.debounce = throttle[1];\n  return stream;\n}\n\nfunction parseThrottle(s) {\n  var a = s.split(COMMA);\n  if (!s.length || a.length > 2) throw s;\n  return a.map(function (_) {\n    var x = +_;\n    if (x !== x) throw s;\n    return x;\n  });\n}\n},{}],\"jFIk\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"selector\", {\n  enumerable: true,\n  get: function () {\n    return _eventSelector.default;\n  }\n});\n\nvar _eventSelector = _interopRequireDefault(require(\"./src/event-selector\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/event-selector\":\"KGQ9\"}],\"FqRU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _stream = _interopRequireDefault(require(\"./stream\"));\n\nvar _util = require(\"../util\");\n\nvar _vegaEventSelector = require(\"vega-event-selector\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar preamble = 'var datum=event.item&&event.item.datum;';\n\nfunction _default(spec, scope, target) {\n  var events = spec.events,\n      update = spec.update,\n      encode = spec.encode,\n      sources = [],\n      entry = {\n    target: target\n  };\n\n  if (!events) {\n    (0, _vegaUtil.error)('Signal update missing events specification.');\n  } // interpret as an event selector string\n\n\n  if ((0, _vegaUtil.isString)(events)) {\n    events = (0, _vegaEventSelector.selector)(events, scope.isSubscope() ? _util.Scope : _util.View);\n  } // separate event streams from signal updates\n\n\n  events = (0, _vegaUtil.array)(events).filter(s => s.signal || s.scale ? (sources.push(s), 0) : 1); // merge internal operator listeners\n\n  if (sources.length > 1) {\n    sources = [mergeSources(sources)];\n  } // merge event streams, include as source\n\n\n  if (events.length) {\n    sources.push(events.length > 1 ? {\n      merge: events\n    } : events[0]);\n  }\n\n  if (encode != null) {\n    if (update) (0, _vegaUtil.error)('Signal encode and update are mutually exclusive.');\n    update = 'encode(item(),' + (0, _vegaUtil.stringValue)(encode) + ')';\n  } // resolve update value\n\n\n  entry.update = (0, _vegaUtil.isString)(update) ? (0, _expression.default)(update, scope, preamble) : update.expr != null ? (0, _expression.default)(update.expr, scope, preamble) : update.value != null ? update.value : update.signal != null ? {\n    $expr: '_.value',\n    $params: {\n      value: scope.signalRef(update.signal)\n    }\n  } : (0, _vegaUtil.error)('Invalid signal update specification.');\n\n  if (spec.force) {\n    entry.options = {\n      force: true\n    };\n  }\n\n  sources.forEach(function (source) {\n    scope.addUpdate((0, _vegaUtil.extend)(streamSource(source, scope), entry));\n  });\n}\n\nfunction streamSource(stream, scope) {\n  return {\n    source: stream.signal ? scope.signalRef(stream.signal) : stream.scale ? scope.scaleRef(stream.scale) : (0, _stream.default)(stream, scope)\n  };\n}\n\nfunction mergeSources(sources) {\n  return {\n    signal: '[' + sources.map(s => s.scale ? 'scale(\"' + s.scale + '\")' : s.signal) + ']'\n  };\n}\n},{\"./expression\":\"TGrP\",\"./stream\":\"aoay\",\"../util\":\"bnG3\",\"vega-event-selector\":\"jFIk\",\"vega-util\":\"d61Z\"}],\"T55v\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _update = _interopRequireDefault(require(\"./update\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(signal, scope) {\n  var op = scope.getSignal(signal.name),\n      expr = signal.update;\n\n  if (signal.init) {\n    if (expr) {\n      (0, _vegaUtil.error)('Signals can not include both init and update expressions.');\n    } else {\n      expr = signal.init;\n      op.initonly = true;\n    }\n  }\n\n  if (expr) {\n    expr = (0, _expression.default)(expr, scope);\n    op.update = expr.$expr;\n    op.params = expr.$params;\n  }\n\n  if (signal.on) {\n    signal.on.forEach(function (_) {\n      (0, _update.default)(_, scope, op.id);\n    });\n  }\n}\n},{\"./expression\":\"TGrP\",\"./update\":\"FqRU\",\"vega-util\":\"d61Z\"}],\"VbKC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Values = exports.ViewLayout = exports.SortItems = exports.Sieve = exports.Scale = exports.Render = exports.Relay = exports.Proxy = exports.Projection = exports.PreFacet = exports.Params = exports.Overlap = exports.MultiValues = exports.MultiExtent = exports.Mark = exports.Load = exports.LegendEntries = exports.Key = exports.Field = exports.Facet = exports.Extent = exports.Expression = exports.Encode = exports.DataJoin = exports.Compare = exports.Collect = exports.Bound = exports.AxisTicks = exports.Aggregate = void 0;\n\nvar _util = require(\"./util\");\n\nfunction transform(name) {\n  return function (params, value, parent) {\n    return (0, _util.entry)(name, value, params || undefined, parent);\n  };\n}\n\nvar Aggregate = transform('aggregate');\nexports.Aggregate = Aggregate;\nvar AxisTicks = transform('axisticks');\nexports.AxisTicks = AxisTicks;\nvar Bound = transform('bound');\nexports.Bound = Bound;\nvar Collect = transform('collect');\nexports.Collect = Collect;\nvar Compare = transform('compare');\nexports.Compare = Compare;\nvar DataJoin = transform('datajoin');\nexports.DataJoin = DataJoin;\nvar Encode = transform('encode');\nexports.Encode = Encode;\nvar Expression = transform('expression');\nexports.Expression = Expression;\nvar Extent = transform('extent');\nexports.Extent = Extent;\nvar Facet = transform('facet');\nexports.Facet = Facet;\nvar Field = transform('field');\nexports.Field = Field;\nvar Key = transform('key');\nexports.Key = Key;\nvar LegendEntries = transform('legendentries');\nexports.LegendEntries = LegendEntries;\nvar Load = transform('load');\nexports.Load = Load;\nvar Mark = transform('mark');\nexports.Mark = Mark;\nvar MultiExtent = transform('multiextent');\nexports.MultiExtent = MultiExtent;\nvar MultiValues = transform('multivalues');\nexports.MultiValues = MultiValues;\nvar Overlap = transform('overlap');\nexports.Overlap = Overlap;\nvar Params = transform('params');\nexports.Params = Params;\nvar PreFacet = transform('prefacet');\nexports.PreFacet = PreFacet;\nvar Projection = transform('projection');\nexports.Projection = Projection;\nvar Proxy = transform('proxy');\nexports.Proxy = Proxy;\nvar Relay = transform('relay');\nexports.Relay = Relay;\nvar Render = transform('render');\nexports.Render = Render;\nvar Scale = transform('scale');\nexports.Scale = Scale;\nvar Sieve = transform('sieve');\nexports.Sieve = Sieve;\nvar SortItems = transform('sortitems');\nexports.SortItems = SortItems;\nvar ViewLayout = transform('viewlayout');\nexports.ViewLayout = ViewLayout;\nvar Values = transform('values');\nexports.Values = Values;\n},{\"./util\":\"bnG3\"}],\"nGP3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initScale = initScale;\nexports.parseScale = parseScale;\n\nvar _util = require(\"../util\");\n\nvar _transforms = require(\"../transforms\");\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar FIELD_REF_ID = 0;\nvar MULTIDOMAIN_SORT_OPS = {\n  min: 'min',\n  max: 'max',\n  count: 'sum'\n};\n\nfunction initScale(spec, scope) {\n  var type = spec.type || 'linear';\n\n  if (!(0, _vegaScale.isValidScaleType)(type)) {\n    (0, _vegaUtil.error)('Unrecognized scale type: ' + (0, _vegaUtil.stringValue)(type));\n  }\n\n  scope.addScale(spec.name, {\n    type: type,\n    domain: undefined\n  });\n}\n\nfunction parseScale(spec, scope) {\n  var params = scope.getScale(spec.name).params,\n      key;\n  params.domain = parseScaleDomain(spec.domain, spec, scope);\n\n  if (spec.range != null) {\n    params.range = parseScaleRange(spec, scope, params);\n  }\n\n  if (spec.interpolate != null) {\n    parseScaleInterpolate(spec.interpolate, params);\n  }\n\n  if (spec.nice != null) {\n    params.nice = parseScaleNice(spec.nice);\n  }\n\n  if (spec.bins != null) {\n    params.bins = parseScaleBins(spec.bins, scope);\n  }\n\n  for (key in spec) {\n    if ((0, _vegaUtil.hasOwnProperty)(params, key) || key === 'name') continue;\n    params[key] = parseLiteral(spec[key], scope);\n  }\n}\n\nfunction parseLiteral(v, scope) {\n  return !(0, _vegaUtil.isObject)(v) ? v : v.signal ? scope.signalRef(v.signal) : (0, _vegaUtil.error)('Unsupported object: ' + (0, _vegaUtil.stringValue)(v));\n}\n\nfunction parseArray(v, scope) {\n  return v.signal ? scope.signalRef(v.signal) : v.map(v => parseLiteral(v, scope));\n}\n\nfunction dataLookupError(name) {\n  (0, _vegaUtil.error)('Can not find data set: ' + (0, _vegaUtil.stringValue)(name));\n} // -- SCALE DOMAIN ----\n\n\nfunction parseScaleDomain(domain, spec, scope) {\n  if (!domain) {\n    if (spec.domainMin != null || spec.domainMax != null) {\n      (0, _vegaUtil.error)('No scale domain defined for domainMin/domainMax to override.');\n    }\n\n    return; // default domain\n  }\n\n  return domain.signal ? scope.signalRef(domain.signal) : ((0, _vegaUtil.isArray)(domain) ? explicitDomain : domain.fields ? multipleDomain : singularDomain)(domain, spec, scope);\n}\n\nfunction explicitDomain(domain, spec, scope) {\n  return domain.map(function (v) {\n    return parseLiteral(v, scope);\n  });\n}\n\nfunction singularDomain(domain, spec, scope) {\n  var data = scope.getData(domain.data);\n  if (!data) dataLookupError(domain.data);\n  return (0, _vegaScale.isDiscrete)(spec.type) ? data.valuesRef(scope, domain.field, parseSort(domain.sort, false)) : (0, _vegaScale.isQuantile)(spec.type) ? data.domainRef(scope, domain.field) : data.extentRef(scope, domain.field);\n}\n\nfunction multipleDomain(domain, spec, scope) {\n  var data = domain.data,\n      fields = domain.fields.reduce(function (dom, d) {\n    d = (0, _vegaUtil.isString)(d) ? {\n      data: data,\n      field: d\n    } : (0, _vegaUtil.isArray)(d) || d.signal ? fieldRef(d, scope) : d;\n    dom.push(d);\n    return dom;\n  }, []);\n  return ((0, _vegaScale.isDiscrete)(spec.type) ? ordinalMultipleDomain : (0, _vegaScale.isQuantile)(spec.type) ? quantileMultipleDomain : numericMultipleDomain)(domain, scope, fields);\n}\n\nfunction fieldRef(data, scope) {\n  var name = '_:vega:_' + FIELD_REF_ID++,\n      coll = (0, _transforms.Collect)({});\n\n  if ((0, _vegaUtil.isArray)(data)) {\n    coll.value = {\n      $ingest: data\n    };\n  } else if (data.signal) {\n    var code = 'setdata(' + (0, _vegaUtil.stringValue)(name) + ',' + data.signal + ')';\n    coll.params.input = scope.signalRef(code);\n  }\n\n  scope.addDataPipeline(name, [coll, (0, _transforms.Sieve)({})]);\n  return {\n    data: name,\n    field: 'data'\n  };\n}\n\nfunction ordinalMultipleDomain(domain, scope, fields) {\n  var sort = parseSort(domain.sort, true),\n      counts,\n      p,\n      a,\n      c,\n      v; // get value counts for each domain field\n\n  counts = fields.map(function (f) {\n    var data = scope.getData(f.data);\n    if (!data) dataLookupError(f.data);\n    return data.countsRef(scope, f.field, sort);\n  }); // aggregate the results from each domain field\n\n  p = {\n    groupby: _util.keyFieldRef,\n    pulse: counts\n  };\n\n  if (sort) {\n    a = sort.op || 'count';\n    v = sort.field ? (0, _util.aggrField)(a, sort.field) : 'count';\n    p.ops = [MULTIDOMAIN_SORT_OPS[a]];\n    p.fields = [scope.fieldRef(v)];\n    p.as = [v];\n  }\n\n  a = scope.add((0, _transforms.Aggregate)(p)); // collect aggregate output\n\n  c = scope.add((0, _transforms.Collect)({\n    pulse: (0, _util.ref)(a)\n  })); // extract values for combined domain\n\n  v = scope.add((0, _transforms.Values)({\n    field: _util.keyFieldRef,\n    sort: scope.sortRef(sort),\n    pulse: (0, _util.ref)(c)\n  }));\n  return (0, _util.ref)(v);\n}\n\nfunction parseSort(sort, multidomain) {\n  if (sort) {\n    if (!sort.field && !sort.op) {\n      if ((0, _vegaUtil.isObject)(sort)) sort.field = 'key';else sort = {\n        field: 'key'\n      };\n    } else if (!sort.field && sort.op !== 'count') {\n      (0, _vegaUtil.error)('No field provided for sort aggregate op: ' + sort.op);\n    } else if (multidomain && sort.field) {\n      if (sort.op && !MULTIDOMAIN_SORT_OPS[sort.op]) {\n        (0, _vegaUtil.error)('Multiple domain scales can not be sorted using ' + sort.op);\n      }\n    }\n  }\n\n  return sort;\n}\n\nfunction quantileMultipleDomain(domain, scope, fields) {\n  // get value arrays for each domain field\n  var values = fields.map(function (f) {\n    var data = scope.getData(f.data);\n    if (!data) dataLookupError(f.data);\n    return data.domainRef(scope, f.field);\n  }); // combine value arrays\n\n  return (0, _util.ref)(scope.add((0, _transforms.MultiValues)({\n    values: values\n  })));\n}\n\nfunction numericMultipleDomain(domain, scope, fields) {\n  // get extents for each domain field\n  var extents = fields.map(function (f) {\n    var data = scope.getData(f.data);\n    if (!data) dataLookupError(f.data);\n    return data.extentRef(scope, f.field);\n  }); // combine extents\n\n  return (0, _util.ref)(scope.add((0, _transforms.MultiExtent)({\n    extents: extents\n  })));\n} // -- SCALE BINS -----\n\n\nfunction parseScaleBins(v, scope) {\n  return v.signal || (0, _vegaUtil.isArray)(v) ? parseArray(v, scope) : scope.objectProperty(v);\n} // -- SCALE NICE -----\n\n\nfunction parseScaleNice(nice) {\n  return (0, _vegaUtil.isObject)(nice) ? {\n    interval: parseLiteral(nice.interval),\n    step: parseLiteral(nice.step)\n  } : parseLiteral(nice);\n} // -- SCALE INTERPOLATION -----\n\n\nfunction parseScaleInterpolate(interpolate, params) {\n  params.interpolate = parseLiteral(interpolate.type || interpolate);\n\n  if (interpolate.gamma != null) {\n    params.interpolateGamma = parseLiteral(interpolate.gamma);\n  }\n} // -- SCALE RANGE -----\n\n\nfunction parseScaleRange(spec, scope, params) {\n  var range = spec.range,\n      config = scope.config.range;\n\n  if (range.signal) {\n    return scope.signalRef(range.signal);\n  } else if ((0, _vegaUtil.isString)(range)) {\n    if (config && (0, _vegaUtil.hasOwnProperty)(config, range)) {\n      spec = (0, _vegaUtil.extend)({}, spec, {\n        range: config[range]\n      });\n      return parseScaleRange(spec, scope, params);\n    } else if (range === 'width') {\n      range = [0, {\n        signal: 'width'\n      }];\n    } else if (range === 'height') {\n      range = (0, _vegaScale.isDiscrete)(spec.type) ? [0, {\n        signal: 'height'\n      }] : [{\n        signal: 'height'\n      }, 0];\n    } else {\n      (0, _vegaUtil.error)('Unrecognized scale range value: ' + (0, _vegaUtil.stringValue)(range));\n    }\n  } else if (range.scheme) {\n    params.scheme = (0, _vegaUtil.isArray)(range.scheme) ? parseArray(range.scheme, scope) : parseLiteral(range.scheme, scope);\n    if (range.extent) params.schemeExtent = parseArray(range.extent, scope);\n    if (range.count) params.schemeCount = parseLiteral(range.count, scope);\n    return;\n  } else if (range.step) {\n    params.rangeStep = parseLiteral(range.step, scope);\n    return;\n  } else if ((0, _vegaScale.isDiscrete)(spec.type) && !(0, _vegaUtil.isArray)(range)) {\n    return parseScaleDomain(range, spec, scope);\n  } else if (!(0, _vegaUtil.isArray)(range)) {\n    (0, _vegaUtil.error)('Unsupported range type: ' + (0, _vegaUtil.stringValue)(range));\n  }\n\n  return range.map(v => ((0, _vegaUtil.isArray)(v) ? parseArray : parseLiteral)(v, scope));\n}\n},{\"../util\":\"bnG3\",\"../transforms\":\"VbKC\",\"vega-scale\":\"N8iK\",\"vega-util\":\"d61Z\"}],\"zW5X\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(proj, scope) {\n  var config = scope.config.projection || {},\n      params = {};\n\n  for (var name in proj) {\n    if (name === 'name') continue;\n    params[name] = parseParameter(proj[name], name, scope);\n  } // apply projection defaults from config\n\n\n  for (name in config) {\n    if (params[name] == null) {\n      params[name] = parseParameter(config[name], name, scope);\n    }\n  }\n\n  scope.addProjection(proj.name, params);\n}\n\nfunction parseParameter(_, name, scope) {\n  return (0, _vegaUtil.isArray)(_) ? _.map(function (_) {\n    return parseParameter(_, name, scope);\n  }) : !(0, _vegaUtil.isObject)(_) ? _ : _.signal ? scope.signalRef(_.signal) : name === 'fit' ? _ : (0, _vegaUtil.error)('Unsupported parameter object: ' + (0, _vegaUtil.stringValue)(_));\n}\n},{\"vega-util\":\"d61Z\"}],\"uZ05\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.one = exports.zero = exports.Skip = exports.LegendScales = exports.Discrete = exports.Gradient = exports.Symbols = exports.GroupSubtitleStyle = exports.GroupTitleStyle = exports.GuideTitleStyle = exports.GuideLabelStyle = exports.Value = exports.Size = exports.Perc2 = exports.Perc = exports.Offset = exports.Label = exports.Index = exports.End = exports.Middle = exports.Start = exports.Vertical = exports.Center = exports.Bottom = exports.Right = exports.Left = exports.Top = void 0;\nconst Top = 'top';\nexports.Top = Top;\nconst Left = 'left';\nexports.Left = Left;\nconst Right = 'right';\nexports.Right = Right;\nconst Bottom = 'bottom';\nexports.Bottom = Bottom;\nconst Center = 'center';\nexports.Center = Center;\nconst Vertical = 'vertical';\nexports.Vertical = Vertical;\nconst Start = 'start';\nexports.Start = Start;\nconst Middle = 'middle';\nexports.Middle = Middle;\nconst End = 'end';\nexports.End = End;\nconst Index = 'index';\nexports.Index = Index;\nconst Label = 'label';\nexports.Label = Label;\nconst Offset = 'offset';\nexports.Offset = Offset;\nconst Perc = 'perc';\nexports.Perc = Perc;\nconst Perc2 = 'perc2';\nexports.Perc2 = Perc2;\nconst Size = 'size';\nexports.Size = Size;\nconst Value = 'value';\nexports.Value = Value;\nconst GuideLabelStyle = 'guide-label';\nexports.GuideLabelStyle = GuideLabelStyle;\nconst GuideTitleStyle = 'guide-title';\nexports.GuideTitleStyle = GuideTitleStyle;\nconst GroupTitleStyle = 'group-title';\nexports.GroupTitleStyle = GroupTitleStyle;\nconst GroupSubtitleStyle = 'group-subtitle';\nexports.GroupSubtitleStyle = GroupSubtitleStyle;\nconst Symbols = 'symbol';\nexports.Symbols = Symbols;\nconst Gradient = 'gradient';\nexports.Gradient = Gradient;\nconst Discrete = 'discrete'; // Encoding channels supported by legends\n// In priority order of 'canonical' scale\n\nexports.Discrete = Discrete;\nconst LegendScales = ['size', 'shape', 'fill', 'stroke', 'strokeWidth', 'strokeDash', 'opacity'];\nexports.LegendScales = LegendScales;\nconst Skip = {\n  name: 1,\n  style: 1,\n  interactive: 1\n};\nexports.Skip = Skip;\nconst zero = {\n  value: 0\n};\nexports.zero = zero;\nconst one = {\n  value: 1\n};\nexports.one = one;\n},{}],\"bIb3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar Skip = (0, _vegaUtil.toSet)(['rule']),\n    Swap = (0, _vegaUtil.toSet)(['group', 'image', 'rect']);\n\nfunction _default(encode, marktype) {\n  var code = '';\n  if (Skip[marktype]) return code;\n\n  if (encode.x2) {\n    if (encode.x) {\n      if (Swap[marktype]) {\n        code += 'if(o.x>o.x2)$=o.x,o.x=o.x2,o.x2=$;';\n      }\n\n      code += 'o.width=o.x2-o.x;';\n    } else {\n      code += 'o.x=o.x2-(o.width||0);';\n    }\n  }\n\n  if (encode.xc) {\n    code += 'o.x=o.xc-(o.width||0)/2;';\n  }\n\n  if (encode.y2) {\n    if (encode.y) {\n      if (Swap[marktype]) {\n        code += 'if(o.y>o.y2)$=o.y,o.y=o.y2,o.y2=$;';\n      }\n\n      code += 'o.height=o.y2-o.y;';\n    } else {\n      code += 'o.y=o.y2-(o.height||0);';\n    }\n  }\n\n  if (encode.yc) {\n    code += 'o.y=o.yc-(o.height||0)/2;';\n  }\n\n  return code;\n}\n},{\"vega-util\":\"d61Z\"}],\"Hw7z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _entry = _interopRequireDefault(require(\"./entry\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(enc, scope, params, fields) {\n  function color(type, x, y, z) {\n    var a = (0, _entry.default)(null, x, scope, params, fields),\n        b = (0, _entry.default)(null, y, scope, params, fields),\n        c = (0, _entry.default)(null, z, scope, params, fields);\n    return 'this.' + type + '(' + [a, b, c].join(',') + ').toString()';\n  }\n\n  return enc.c ? color('hcl', enc.h, enc.c, enc.l) : enc.h || enc.s ? color('hsl', enc.h, enc.s, enc.l) : enc.l || enc.a ? color('lab', enc.l, enc.a, enc.b) : enc.r || enc.g || enc.b ? color('rgb', enc.r, enc.g, enc.b) : null;\n}\n},{\"./entry\":\"K9Sq\"}],\"Dy59\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _expression = _interopRequireDefault(require(\"../expression\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(code, scope, params, fields) {\n  var expr = (0, _expression.default)(code, scope);\n  expr.$fields.forEach(function (name) {\n    fields[name] = 1;\n  });\n  (0, _vegaUtil.extend)(params, expr.$params);\n  return expr.$expr;\n}\n},{\"../expression\":\"TGrP\",\"vega-util\":\"d61Z\"}],\"uopV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(ref, scope, params, fields) {\n  return resolve((0, _vegaUtil.isObject)(ref) ? ref : {\n    datum: ref\n  }, scope, params, fields);\n}\n\nfunction resolve(ref, scope, params, fields) {\n  var object, level, field;\n\n  if (ref.signal) {\n    object = 'datum';\n    field = (0, _expression.default)(ref.signal, scope, params, fields);\n  } else if (ref.group || ref.parent) {\n    level = Math.max(1, ref.level || 1);\n    object = 'item';\n\n    while (level-- > 0) {\n      object += '.mark.group';\n    }\n\n    if (ref.parent) {\n      field = ref.parent;\n      object += '.datum';\n    } else {\n      field = ref.group;\n    }\n  } else if (ref.datum) {\n    object = 'datum';\n    field = ref.datum;\n  } else {\n    (0, _vegaUtil.error)('Invalid field reference: ' + (0, _vegaUtil.stringValue)(ref));\n  }\n\n  if (!ref.signal) {\n    if ((0, _vegaUtil.isString)(field)) {\n      fields[field] = 1; // TODO review field tracking?\n\n      field = (0, _vegaUtil.splitAccessPath)(field).map(_vegaUtil.stringValue).join('][');\n    } else {\n      field = resolve(field, scope, params, fields);\n    }\n  }\n\n  return object + '[' + field + ']';\n}\n},{\"./expression\":\"Dy59\",\"vega-util\":\"d61Z\"}],\"kYt5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _entry = _interopRequireDefault(require(\"./entry\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(property, scope, params, fields) {\n  return (0, _vegaUtil.isObject)(property) ? '(' + (0, _entry.default)(null, property, scope, params, fields) + ')' : property;\n}\n},{\"./entry\":\"K9Sq\",\"vega-util\":\"d61Z\"}],\"hD5b\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.getScale = getScale;\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _field = _interopRequireDefault(require(\"./field\"));\n\nvar _property = _interopRequireDefault(require(\"./property\"));\n\nvar _vegaFunctions = require(\"vega-functions\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(enc, value, scope, params, fields) {\n  var scale = getScale(enc.scale, scope, params, fields),\n      interp,\n      func,\n      flag;\n\n  if (enc.range != null) {\n    // pull value from scale range\n    interp = +enc.range;\n    func = scale + '.range()';\n    value = interp === 0 ? func + '[0]' : '($=' + func + ',' + (interp === 1 ? '$[$.length-1]' : '$[0]+' + interp + '*($[$.length-1]-$[0])') + ')';\n  } else {\n    // run value through scale and/or pull scale bandwidth\n    if (value !== undefined) value = scale + '(' + value + ')';\n\n    if (enc.band && (flag = hasBandwidth(enc.scale, scope))) {\n      func = scale + '.bandwidth';\n\n      if (enc.band.signal) {\n        interp = func + '()*' + (0, _property.default)(enc.band, scope, params, fields);\n      } else {\n        interp = +enc.band;\n        interp = func + '()' + (interp === 1 ? '' : '*' + interp);\n      } // if we don't know the scale type, check for bandwidth\n\n\n      if (flag < 0) interp = '(' + func + '?' + interp + ':0)';\n      value = (value ? value + '+' : '') + interp;\n\n      if (enc.extra) {\n        // include logic to handle extraneous elements\n        value = '(datum.extra?' + scale + '(datum.extra.value):' + value + ')';\n      }\n    }\n\n    if (value == null) value = '0';\n  }\n\n  return value;\n}\n\nfunction hasBandwidth(name, scope) {\n  if (!(0, _vegaUtil.isString)(name)) return -1;\n  var type = scope.scaleType(name);\n  return type === 'band' || type === 'point' ? 1 : 0;\n}\n\nfunction getScale(name, scope, params, fields) {\n  var scaleName;\n\n  if ((0, _vegaUtil.isString)(name)) {\n    // direct scale lookup; add scale as parameter\n    scaleName = _vegaFunctions.ScalePrefix + name;\n\n    if (!(0, _vegaUtil.hasOwnProperty)(params, scaleName)) {\n      params[scaleName] = scope.scaleRef(name);\n    }\n\n    scaleName = (0, _vegaUtil.stringValue)(scaleName);\n  } else {\n    // indirect scale lookup; add all scales as parameters\n    for (scaleName in scope.scales) {\n      params[_vegaFunctions.ScalePrefix + scaleName] = scope.scaleRef(scaleName);\n    }\n\n    scaleName = (0, _vegaUtil.stringValue)(_vegaFunctions.ScalePrefix) + '+' + (name.signal ? '(' + (0, _expression.default)(name.signal, scope, params, fields) + ')' : (0, _field.default)(name, scope, params, fields));\n  }\n\n  return '_[' + scaleName + ']';\n}\n},{\"./expression\":\"Dy59\",\"./field\":\"uopV\",\"./property\":\"kYt5\",\"vega-functions\":\"FrXC\",\"vega-util\":\"d61Z\"}],\"UaM2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scale = require(\"./scale\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(enc, scope, params, fields) {\n  return 'this.gradient(' + (0, _scale.getScale)(enc.gradient, scope, params, fields) + ',' + (0, _vegaUtil.stringValue)(enc.start) + ',' + (0, _vegaUtil.stringValue)(enc.stop) + ',' + (0, _vegaUtil.stringValue)(enc.count) + ')';\n}\n},{\"./scale\":\"hD5b\",\"vega-util\":\"d61Z\"}],\"K9Sq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _color = _interopRequireDefault(require(\"./color\"));\n\nvar _field = _interopRequireDefault(require(\"./field\"));\n\nvar _scale = _interopRequireDefault(require(\"./scale\"));\n\nvar _gradient = _interopRequireDefault(require(\"./gradient\"));\n\nvar _property = _interopRequireDefault(require(\"./property\"));\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(channel, enc, scope, params, fields) {\n  if (enc.gradient != null) {\n    return (0, _gradient.default)(enc, scope, params, fields);\n  }\n\n  var value = enc.signal ? (0, _expression.default)(enc.signal, scope, params, fields) : enc.color ? (0, _color.default)(enc.color, scope, params, fields) : enc.field != null ? (0, _field.default)(enc.field, scope, params, fields) : enc.value !== undefined ? (0, _vegaUtil.stringValue)(enc.value) : undefined;\n\n  if (enc.scale != null) {\n    value = (0, _scale.default)(enc, value, scope, params, fields);\n  }\n\n  if (value === undefined) {\n    value = null;\n  }\n\n  if (enc.exponent != null) {\n    value = 'Math.pow(' + value + ',' + (0, _property.default)(enc.exponent, scope, params, fields) + ')';\n  }\n\n  if (enc.mult != null) {\n    value += '*' + (0, _property.default)(enc.mult, scope, params, fields);\n  }\n\n  if (enc.offset != null) {\n    value += '+' + (0, _property.default)(enc.offset, scope, params, fields);\n  }\n\n  if (enc.round) {\n    value = 'Math.round(' + value + ')';\n  }\n\n  return value;\n}\n},{\"./color\":\"Hw7z\",\"./field\":\"uopV\",\"./scale\":\"hD5b\",\"./gradient\":\"UaM2\",\"./property\":\"kYt5\",\"./expression\":\"Dy59\",\"vega-util\":\"d61Z\"}],\"DjSG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(obj, key, value) {\n  const o = obj + '[' + (0, _vegaUtil.stringValue)(key) + ']';\n  return `$=${value};if(${o}!==$)${o}=$,m=1;`;\n}\n},{\"vega-util\":\"d61Z\"}],\"PRQj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _entry = _interopRequireDefault(require(\"./entry\"));\n\nvar _set = _interopRequireDefault(require(\"./set\"));\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(channel, rules, scope, params, fields) {\n  var code = '';\n  rules.forEach(function (rule) {\n    var value = (0, _entry.default)(channel, rule, scope, params, fields);\n    code += rule.test ? (0, _expression.default)(rule.test, scope, params, fields) + '?' + value + ':' : value;\n  }); // if no else clause, terminate with null (vega/vega#1366)\n\n  if ((0, _vegaUtil.peek)(code) === ':') {\n    code += 'null';\n  }\n\n  return (0, _set.default)('o', channel, code);\n}\n},{\"./entry\":\"K9Sq\",\"./set\":\"DjSG\",\"./expression\":\"Dy59\",\"vega-util\":\"d61Z\"}],\"Vxlv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parseEncode;\n\nvar _adjustSpatial = _interopRequireDefault(require(\"./encode/adjust-spatial\"));\n\nvar _entry = _interopRequireDefault(require(\"./encode/entry\"));\n\nvar _rule = _interopRequireDefault(require(\"./encode/rule\"));\n\nvar _set = _interopRequireDefault(require(\"./encode/set\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parseEncode(encode, marktype, params, scope) {\n  var fields = {},\n      code = 'var o=item,datum=o.datum,m=0,$;',\n      channel,\n      enc,\n      value;\n\n  for (channel in encode) {\n    enc = encode[channel];\n\n    if ((0, _vegaUtil.isArray)(enc)) {\n      // rule\n      code += (0, _rule.default)(channel, enc, scope, params, fields);\n    } else {\n      value = (0, _entry.default)(channel, enc, scope, params, fields);\n      code += (0, _set.default)('o', channel, value);\n    }\n  }\n\n  code += (0, _adjustSpatial.default)(encode, marktype);\n  code += 'return m;';\n  return {\n    $expr: code,\n    $fields: Object.keys(fields),\n    $output: Object.keys(encode)\n  };\n}\n},{\"./encode/adjust-spatial\":\"bIb3\",\"./encode/entry\":\"K9Sq\",\"./encode/rule\":\"PRQj\",\"./encode/set\":\"DjSG\",\"vega-util\":\"d61Z\"}],\"UXRt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.TitleSubtitleRole = exports.TitleTextRole = exports.TitleRole = exports.LegendTitleRole = exports.LegendSymbolRole = exports.LegendLabelRole = exports.LegendGradientRole = exports.LegendEntryRole = exports.LegendBandRole = exports.LegendRole = exports.AxisTitleRole = exports.AxisTickRole = exports.AxisLabelRole = exports.AxisGridRole = exports.AxisDomainRole = exports.AxisRole = exports.ScopeRole = exports.FrameRole = exports.MarkRole = void 0;\nvar MarkRole = 'mark';\nexports.MarkRole = MarkRole;\nvar FrameRole = 'frame';\nexports.FrameRole = FrameRole;\nvar ScopeRole = 'scope';\nexports.ScopeRole = ScopeRole;\nvar AxisRole = 'axis';\nexports.AxisRole = AxisRole;\nvar AxisDomainRole = 'axis-domain';\nexports.AxisDomainRole = AxisDomainRole;\nvar AxisGridRole = 'axis-grid';\nexports.AxisGridRole = AxisGridRole;\nvar AxisLabelRole = 'axis-label';\nexports.AxisLabelRole = AxisLabelRole;\nvar AxisTickRole = 'axis-tick';\nexports.AxisTickRole = AxisTickRole;\nvar AxisTitleRole = 'axis-title';\nexports.AxisTitleRole = AxisTitleRole;\nvar LegendRole = 'legend';\nexports.LegendRole = LegendRole;\nvar LegendBandRole = 'legend-band';\nexports.LegendBandRole = LegendBandRole;\nvar LegendEntryRole = 'legend-entry';\nexports.LegendEntryRole = LegendEntryRole;\nvar LegendGradientRole = 'legend-gradient';\nexports.LegendGradientRole = LegendGradientRole;\nvar LegendLabelRole = 'legend-label';\nexports.LegendLabelRole = LegendLabelRole;\nvar LegendSymbolRole = 'legend-symbol';\nexports.LegendSymbolRole = LegendSymbolRole;\nvar LegendTitleRole = 'legend-title';\nexports.LegendTitleRole = LegendTitleRole;\nvar TitleRole = 'title';\nexports.TitleRole = TitleRole;\nvar TitleTextRole = 'title-text';\nexports.TitleTextRole = TitleTextRole;\nvar TitleSubtitleRole = 'title-subtitle';\nexports.TitleSubtitleRole = TitleSubtitleRole;\n},{}],\"sfJ8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.encoder = encoder;\nexports.addEncode = addEncode;\nexports.addEncoders = addEncoders;\nexports.extendEncode = extendEncode;\nexports.encoders = encoders;\nexports.has = has;\n\nvar _encode = _interopRequireDefault(require(\"../encode\"));\n\nvar _roles = require(\"../marks/roles\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction encoder(_) {\n  return (0, _vegaUtil.isObject)(_) && !(0, _vegaUtil.isArray)(_) ? (0, _vegaUtil.extend)({}, _) : {\n    value: _\n  };\n}\n\nfunction addEncode(object, name, value, set) {\n  if (value != null) {\n    if ((0, _vegaUtil.isObject)(value) && !(0, _vegaUtil.isArray)(value)) {\n      object.update[name] = value;\n    } else {\n      object[set || 'enter'][name] = {\n        value: value\n      };\n    }\n\n    return 1;\n  } else {\n    return 0;\n  }\n}\n\nfunction addEncoders(object, enter, update) {\n  for (let name in enter) {\n    addEncode(object, name, enter[name]);\n  }\n\n  for (let name in update) {\n    addEncode(object, name, update[name], 'update');\n  }\n}\n\nfunction extendEncode(encode, extra, skip) {\n  for (var name in extra) {\n    if (skip && (0, _vegaUtil.hasOwnProperty)(skip, name)) continue;\n    encode[name] = (0, _vegaUtil.extend)(encode[name] || {}, extra[name]);\n  }\n\n  return encode;\n}\n\nfunction encoders(encode, type, role, style, scope, params) {\n  var enc, key;\n  params = params || {};\n  params.encoders = {\n    $encode: enc = {}\n  };\n  encode = applyDefaults(encode, type, role, style, scope.config);\n\n  for (key in encode) {\n    enc[key] = (0, _encode.default)(encode[key], type, params, scope);\n  }\n\n  return params;\n}\n\nfunction applyDefaults(encode, type, role, style, config) {\n  var defaults = {},\n      enter = {},\n      update,\n      key,\n      skip,\n      props; // ignore legend and axis\n\n  if (role == 'legend' || String(role).indexOf('axis') === 0) {\n    role = null;\n  } // resolve mark config\n\n\n  props = role === _roles.FrameRole ? config.group : role === _roles.MarkRole ? (0, _vegaUtil.extend)({}, config.mark, config[type]) : null;\n\n  for (key in props) {\n    // do not apply defaults if relevant fields are defined\n    skip = has(key, encode) || (key === 'fill' || key === 'stroke') && (has('fill', encode) || has('stroke', encode));\n    if (!skip) applyDefault(defaults, key, props[key]);\n  } // resolve styles, apply with increasing precedence\n\n\n  (0, _vegaUtil.array)(style).forEach(function (name) {\n    var props = config.style && config.style[name];\n\n    for (var key in props) {\n      if (!has(key, encode)) {\n        applyDefault(defaults, key, props[key]);\n      }\n    }\n  });\n  encode = (0, _vegaUtil.extend)({}, encode); // defensive copy\n\n  for (key in defaults) {\n    props = defaults[key];\n\n    if (props.signal) {\n      (update = update || {})[key] = props;\n    } else {\n      enter[key] = props;\n    }\n  }\n\n  encode.enter = (0, _vegaUtil.extend)(enter, encode.enter);\n  if (update) encode.update = (0, _vegaUtil.extend)(update, encode.update);\n  return encode;\n}\n\nfunction applyDefault(defaults, key, value) {\n  defaults[key] = value && value.signal ? {\n    signal: value.signal\n  } : {\n    value: value\n  };\n}\n\nfunction has(key, encode) {\n  return encode && (encode.enter && encode.enter[key] || encode.update && encode.update[key]);\n}\n},{\"../encode\":\"Vxlv\",\"../marks/roles\":\"UXRt\",\"vega-util\":\"d61Z\"}],\"VfcM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nfunction _default(type, role, style, key, dataRef, encode, extras) {\n  return {\n    type: type,\n    name: extras ? extras.name : undefined,\n    role: role,\n    style: extras && extras.style || style,\n    key: key,\n    from: dataRef,\n    interactive: !!(extras && extras.interactive),\n    encode: (0, _encodeUtil.extendEncode)(encode, extras, _constants.Skip)\n  };\n}\n},{\"./constants\":\"uZ05\",\"../encode/encode-util\":\"sfJ8\"}],\"XaVO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.lookup = lookup;\nexports.getEncoding = getEncoding;\nexports.getStyle = getStyle;\nexports.anchorExpr = anchorExpr;\nexports.tickBand = tickBand;\nexports.alignExpr = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _util = require(\"../../util\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction lookup(spec, config) {\n  const _ = (name, dflt) => (0, _util.value)(spec[name], (0, _util.value)(config[name], dflt));\n\n  _.isVertical = s => _constants.Vertical === (0, _util.value)(spec.direction, config.direction || (s ? config.symbolDirection : config.gradientDirection));\n\n  _.gradientLength = () => (0, _util.value)(spec.gradientLength, config.gradientLength || config.gradientWidth);\n\n  _.gradientThickness = () => (0, _util.value)(spec.gradientThickness, config.gradientThickness || config.gradientHeight);\n\n  _.entryColumns = () => (0, _util.value)(spec.columns, (0, _util.value)(config.columns, +_.isVertical(true)));\n\n  return _;\n}\n\nfunction getEncoding(name, encode) {\n  var v = encode && (encode.update && encode.update[name] || encode.enter && encode.enter[name]);\n  return v && v.signal ? v : v ? v.value : null;\n}\n\nfunction getStyle(name, scope, style) {\n  var s = scope.config.style[style];\n  return s && s[name];\n}\n\nfunction anchorExpr(s, e, m) {\n  return `item.anchor === \"${_constants.Start}\" ? ${s} : item.anchor === \"${_constants.End}\" ? ${e} : ${m}`;\n}\n\nconst alignExpr = anchorExpr((0, _vegaUtil.stringValue)(_constants.Left), (0, _vegaUtil.stringValue)(_constants.Right), (0, _vegaUtil.stringValue)(_constants.Center));\nexports.alignExpr = alignExpr;\n\nfunction tickBand(_) {\n  let v = _('tickBand'),\n      offset = _('tickOffset'),\n      band,\n      extra;\n\n  if (!v) {\n    // if no tick band entry, fall back on other properties\n    band = _('bandPosition');\n    extra = _('tickExtra');\n  } else if (v.signal) {\n    // if signal, augment code to interpret values\n    band = {\n      signal: `(${v.signal})==='extent'?1:0.5`\n    };\n    extra = {\n      signal: `(${v.signal})==='extent'?true:false`\n    };\n\n    if (!(0, _vegaUtil.isObject)(offset)) {\n      offset = {\n        signal: `(${v.signal})==='extent'?0:${offset}`\n      };\n    }\n  } else if (v === 'extent') {\n    // if constant, simply set values\n    band = 1;\n    extra = true;\n    offset = 0;\n  } else {\n    band = 0.5;\n    extra = false;\n  }\n\n  return {\n    extra,\n    band,\n    offset\n  };\n}\n},{\"./constants\":\"uZ05\",\"../../util\":\"bnG3\",\"vega-util\":\"d61Z\"}],\"M2D5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.TextMark = exports.SymbolMark = exports.RuleMark = exports.RectMark = exports.GroupMark = void 0;\nvar GroupMark = 'group';\nexports.GroupMark = GroupMark;\nvar RectMark = 'rect';\nexports.RectMark = RectMark;\nvar RuleMark = 'rule';\nexports.RuleMark = RuleMark;\nvar SymbolMark = 'symbol';\nexports.SymbolMark = SymbolMark;\nvar TextMark = 'text';\nexports.TextMark = TextMark;\n},{}],\"fPTH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scale, config, userEncode) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      vertical = _.isVertical(),\n      thickness = _.gradientThickness(),\n      length = _.gradientLength(),\n      encode,\n      enter,\n      start,\n      stop,\n      width,\n      height;\n\n  if (vertical) {\n    start = [0, 1];\n    stop = [0, 0];\n    width = thickness;\n    height = length;\n  } else {\n    start = [0, 0];\n    stop = [1, 0];\n    width = length;\n    height = thickness;\n  }\n\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero,\n      x: _constants.zero,\n      y: _constants.zero,\n      width: (0, _encodeUtil.encoder)(width),\n      height: (0, _encodeUtil.encoder)(height)\n    },\n    update: (0, _vegaUtil.extend)({}, enter, {\n      opacity: _constants.one,\n      fill: {\n        gradient: scale,\n        start: start,\n        stop: stop\n      }\n    }),\n    exit: {\n      opacity: _constants.zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    stroke: _('gradientStrokeColor'),\n    strokeWidth: _('gradientStrokeWidth')\n  }, {\n    // update\n    opacity: _('gradientOpacity')\n  });\n  return (0, _guideMark.default)(_marktypes.RectMark, _roles.LegendGradientRole, null, undefined, undefined, encode, userEncode);\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\",\"vega-util\":\"d61Z\"}],\"b4OI\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scale, config, userEncode, dataRef) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      vertical = _.isVertical(),\n      thickness = _.gradientThickness(),\n      length = _.gradientLength(),\n      encode,\n      enter,\n      u,\n      v,\n      uu,\n      vv,\n      adjust = '';\n\n  vertical ? (u = 'y', uu = 'y2', v = 'x', vv = 'width', adjust = '1-') : (u = 'x', uu = 'x2', v = 'y', vv = 'height');\n  enter = {\n    opacity: _constants.zero,\n    fill: {\n      scale: scale,\n      field: _constants.Value\n    }\n  };\n  enter[u] = {\n    signal: adjust + 'datum.' + _constants.Perc,\n    mult: length\n  };\n  enter[v] = _constants.zero;\n  enter[uu] = {\n    signal: adjust + 'datum.' + _constants.Perc2,\n    mult: length\n  };\n  enter[vv] = (0, _encodeUtil.encoder)(thickness);\n  encode = {\n    enter: enter,\n    update: (0, _vegaUtil.extend)({}, enter, {\n      opacity: _constants.one\n    }),\n    exit: {\n      opacity: _constants.zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    stroke: _('gradientStrokeColor'),\n    strokeWidth: _('gradientStrokeWidth')\n  }, {\n    // update\n    opacity: _('gradientOpacity')\n  });\n  return (0, _guideMark.default)(_marktypes.RectMark, _roles.LegendBandRole, null, _constants.Value, dataRef, encode, userEncode);\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\",\"vega-util\":\"d61Z\"}],\"sMK6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nvar _util = require(\"../../util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst alignExpr = `datum.${_constants.Perc}<=0?\"${_constants.Left}\":datum.${_constants.Perc}>=1?\"${_constants.Right}\":\"${_constants.Center}\"`,\n      baselineExpr = `datum.${_constants.Perc}<=0?\"${_constants.Bottom}\":datum.${_constants.Perc}>=1?\"${_constants.Top}\":\"${_constants.Middle}\"`;\n\nfunction _default(spec, config, userEncode, dataRef) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      vertical = _.isVertical(),\n      thickness = (0, _encodeUtil.encoder)(_.gradientThickness()),\n      length = _.gradientLength(),\n      overlap = _('labelOverlap'),\n      separation = _('labelSeparation'),\n      encode,\n      enter,\n      update,\n      u,\n      v,\n      adjust = '';\n\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero\n    },\n    update: update = {\n      opacity: _constants.one,\n      text: {\n        field: _constants.Label\n      }\n    },\n    exit: {\n      opacity: _constants.zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    fill: _('labelColor'),\n    fillOpacity: _('labelOpacity'),\n    font: _('labelFont'),\n    fontSize: _('labelFontSize'),\n    fontStyle: _('labelFontStyle'),\n    fontWeight: _('labelFontWeight'),\n    limit: (0, _util.value)(spec.labelLimit, config.gradientLabelLimit)\n  });\n\n  if (vertical) {\n    enter.align = {\n      value: 'left'\n    };\n    enter.baseline = update.baseline = {\n      signal: baselineExpr\n    };\n    u = 'y';\n    v = 'x';\n    adjust = '1-';\n  } else {\n    enter.align = update.align = {\n      signal: alignExpr\n    };\n    enter.baseline = {\n      value: 'top'\n    };\n    u = 'x';\n    v = 'y';\n  }\n\n  enter[u] = update[u] = {\n    signal: adjust + 'datum.' + _constants.Perc,\n    mult: length\n  };\n  enter[v] = update[v] = thickness;\n  thickness.offset = (0, _util.value)(spec.labelOffset, config.gradientLabelOffset) || 0;\n  spec = (0, _guideMark.default)(_marktypes.TextMark, _roles.LegendLabelRole, _constants.GuideLabelStyle, _constants.Value, dataRef, encode, userEncode);\n\n  if (overlap) {\n    spec.overlap = {\n      separation: separation,\n      method: overlap,\n      order: 'datum.' + _constants.Index\n    };\n  }\n\n  return spec;\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\",\"../../util\":\"bnG3\"}],\"cARw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nfunction _default(role, style, name, dataRef, interactive, encode, marks, layout) {\n  return {\n    type: _marktypes.GroupMark,\n    name: name,\n    role: role,\n    style: style,\n    from: dataRef,\n    interactive: interactive || false,\n    encode: encode,\n    marks: marks,\n    layout: layout\n  };\n}\n},{\"../marks/marktypes\":\"M2D5\"}],\"sSDp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.legendSymbolLayout = legendSymbolLayout;\n\nvar _constants = require(\"./constants\");\n\nvar _guideGroup = _interopRequireDefault(require(\"./guide-group\"));\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// userEncode is top-level, includes entries, symbols, labels\nfunction _default(spec, config, userEncode, dataRef, columns) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      entries = userEncode.entries,\n      interactive = !!(entries && entries.interactive),\n      name = entries ? entries.name : undefined,\n      height = _('clipHeight'),\n      symbolOffset = _('symbolOffset'),\n      valueRef = {\n    data: 'value'\n  },\n      encode = {},\n      xSignal = `${columns} ? datum.${_constants.Offset} : datum.${_constants.Size}`,\n      yEncode = height ? (0, _encodeUtil.encoder)(height) : {\n    field: _constants.Size\n  },\n      index = `datum.${_constants.Index}`,\n      ncols = `max(1, ${columns})`,\n      enter,\n      update,\n      labelOffset,\n      symbols,\n      labels,\n      nrows,\n      sort;\n\n  yEncode.mult = 0.5; // -- LEGEND SYMBOLS --\n\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero,\n      x: {\n        signal: xSignal,\n        mult: 0.5,\n        offset: symbolOffset\n      },\n      y: yEncode\n    },\n    update: update = {\n      opacity: _constants.one,\n      x: enter.x,\n      y: enter.y\n    },\n    exit: {\n      opacity: _constants.zero\n    }\n  };\n  var baseFill = null,\n      baseStroke = null;\n\n  if (!spec.fill) {\n    baseFill = config.symbolBaseFillColor;\n    baseStroke = config.symbolBaseStrokeColor;\n  }\n\n  (0, _encodeUtil.addEncoders)(encode, {\n    fill: _('symbolFillColor', baseFill),\n    shape: _('symbolType'),\n    size: _('symbolSize'),\n    stroke: _('symbolStrokeColor', baseStroke),\n    strokeDash: _('symbolDash'),\n    strokeDashOffset: _('symbolDashOffset'),\n    strokeWidth: _('symbolStrokeWidth')\n  }, {\n    // update\n    opacity: _('symbolOpacity')\n  });\n\n  _constants.LegendScales.forEach(function (scale) {\n    if (spec[scale]) {\n      update[scale] = enter[scale] = {\n        scale: spec[scale],\n        field: _constants.Value\n      };\n    }\n  });\n\n  symbols = (0, _guideMark.default)(_marktypes.SymbolMark, _roles.LegendSymbolRole, null, _constants.Value, valueRef, encode, userEncode.symbols);\n  if (height) symbols.clip = true; // -- LEGEND LABELS --\n\n  labelOffset = (0, _encodeUtil.encoder)(symbolOffset);\n  labelOffset.offset = _('labelOffset');\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero,\n      x: {\n        signal: xSignal,\n        offset: labelOffset\n      },\n      y: yEncode\n    },\n    update: update = {\n      opacity: _constants.one,\n      text: {\n        field: _constants.Label\n      },\n      x: enter.x,\n      y: enter.y\n    },\n    exit: {\n      opacity: _constants.zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    align: _('labelAlign'),\n    baseline: _('labelBaseline'),\n    fill: _('labelColor'),\n    fillOpacity: _('labelOpacity'),\n    font: _('labelFont'),\n    fontSize: _('labelFontSize'),\n    fontStyle: _('labelFontStyle'),\n    fontWeight: _('labelFontWeight'),\n    limit: _('labelLimit')\n  });\n  labels = (0, _guideMark.default)(_marktypes.TextMark, _roles.LegendLabelRole, _constants.GuideLabelStyle, _constants.Value, valueRef, encode, userEncode.labels); // -- LEGEND ENTRY GROUPS --\n\n  encode = {\n    enter: {\n      noBound: {\n        value: !height\n      },\n      // ignore width/height in bounds calc\n      width: _constants.zero,\n      height: height ? (0, _encodeUtil.encoder)(height) : _constants.zero,\n      opacity: _constants.zero\n    },\n    exit: {\n      opacity: _constants.zero\n    },\n    update: update = {\n      opacity: _constants.one,\n      row: {\n        signal: null\n      },\n      column: {\n        signal: null\n      }\n    }\n  }; // annotate and sort groups to ensure correct ordering\n\n  if (_.isVertical(true)) {\n    nrows = `ceil(item.mark.items.length / ${ncols})`;\n    update.row.signal = `${index}%${nrows}`;\n    update.column.signal = `floor(${index} / ${nrows})`;\n    sort = {\n      field: ['row', index]\n    };\n  } else {\n    update.row.signal = `floor(${index} / ${ncols})`;\n    update.column.signal = `${index} % ${ncols}`;\n    sort = {\n      field: index\n    };\n  } // handle zero column case (implies infinite columns)\n\n\n  update.column.signal = `${columns}?${update.column.signal}:${index}`; // facet legend entries into sub-groups\n\n  dataRef = {\n    facet: {\n      data: dataRef,\n      name: 'value',\n      groupby: _constants.Index\n    }\n  };\n  spec = (0, _guideGroup.default)(_roles.ScopeRole, null, name, dataRef, interactive, (0, _encodeUtil.extendEncode)(encode, entries, _constants.Skip), [symbols, labels]);\n  spec.sort = sort;\n  return spec;\n}\n\nfunction legendSymbolLayout(spec, config) {\n  const _ = (0, _guideUtil.lookup)(spec, config); // layout parameters for legend entries\n\n\n  return {\n    align: _('gridAlign'),\n    columns: _.entryColumns(),\n    center: {\n      row: true,\n      column: false\n    },\n    padding: {\n      row: _('rowPadding'),\n      column: _('columnPadding')\n    }\n  };\n}\n},{\"./constants\":\"uZ05\",\"./guide-group\":\"cARw\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\"}],\"aze4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// expression logic for align, anchor, angle, and baseline calculation\nconst isL = 'item.orient === \"left\"',\n      isR = 'item.orient === \"right\"',\n      isLR = `(${isL} || ${isR})`,\n      isVG = `datum.vgrad && ${isLR}`,\n      baseline = (0, _guideUtil.anchorExpr)('\"top\"', '\"bottom\"', '\"middle\"'),\n      alignFlip = (0, _guideUtil.anchorExpr)('\"right\"', '\"left\"', '\"center\"'),\n      exprAlign = `datum.vgrad && ${isR} ? (${alignFlip}) : (${isLR} && !(datum.vgrad && ${isL})) ? \"left\" : ${_guideUtil.alignExpr}`,\n      exprAnchor = `item._anchor || (${isLR} ? \"middle\" : \"start\")`,\n      exprAngle = `${isVG} ? (${isL} ? -90 : 90) : 0`,\n      exprBaseline = `${isLR} ? (datum.vgrad ? (${isR} ? \"bottom\" : \"top\") : ${baseline}) : \"top\"`;\n\nfunction _default(spec, config, userEncode, dataRef) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      encode;\n\n  encode = {\n    enter: {\n      opacity: _constants.zero\n    },\n    update: {\n      opacity: _constants.one,\n      x: {\n        field: {\n          group: 'padding'\n        }\n      },\n      y: {\n        field: {\n          group: 'padding'\n        }\n      }\n    },\n    exit: {\n      opacity: _constants.zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    orient: _('titleOrient'),\n    _anchor: _('titleAnchor'),\n    anchor: {\n      signal: exprAnchor\n    },\n    angle: {\n      signal: exprAngle\n    },\n    align: {\n      signal: exprAlign\n    },\n    baseline: {\n      signal: exprBaseline\n    },\n    text: spec.title,\n    fill: _('titleColor'),\n    fillOpacity: _('titleOpacity'),\n    font: _('titleFont'),\n    fontSize: _('titleFontSize'),\n    fontStyle: _('titleFontStyle'),\n    fontWeight: _('titleFontWeight'),\n    limit: _('titleLimit'),\n    lineHeight: _('titleLineHeight')\n  }, {\n    // require update\n    align: _('titleAlign'),\n    baseline: _('titleBaseline')\n  });\n  return (0, _guideMark.default)(_marktypes.TextMark, _roles.LegendTitleRole, _constants.GuideTitleStyle, null, dataRef, encode, userEncode);\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\"}],\"xNu9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(clip, scope) {\n  var expr;\n\n  if ((0, _vegaUtil.isObject)(clip)) {\n    if (clip.signal) {\n      expr = clip.signal;\n    } else if (clip.path) {\n      expr = 'pathShape(' + param(clip.path) + ')';\n    } else if (clip.sphere) {\n      expr = 'geoShape(' + param(clip.sphere) + ', {type: \"Sphere\"})';\n    }\n  }\n\n  return expr ? scope.signalRef(expr) : !!clip;\n}\n\nfunction param(value) {\n  return (0, _vegaUtil.isObject)(value) && value.signal ? value.signal : (0, _vegaUtil.stringValue)(value);\n}\n},{\"vega-util\":\"d61Z\"}],\"nWcy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _marktypes = require(\"./marktypes\");\n\nvar _roles = require(\"./roles\");\n\nfunction _default(spec) {\n  var role = spec.role || '';\n  return !role.indexOf('axis') || !role.indexOf('legend') || !role.indexOf('title') ? role : spec.type === _marktypes.GroupMark ? _roles.ScopeRole : role || _roles.MarkRole;\n}\n},{\"./marktypes\":\"M2D5\",\"./roles\":\"UXRt\"}],\"oQiN\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _role = _interopRequireDefault(require(\"./role\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec) {\n  return {\n    marktype: spec.type,\n    name: spec.name || undefined,\n    role: spec.role || (0, _role.default)(spec),\n    zindex: +spec.zindex || undefined\n  };\n}\n},{\"./role\":\"nWcy\"}],\"LrWd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nfunction _default(spec, scope) {\n  return spec && spec.signal ? scope.signalRef(spec.signal) : spec === false ? false : true;\n}\n},{}],\"v7J7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.outerExpr = outerExpr;\nexports.outerField = outerField;\nexports.isData = isData;\nexports.isExpr = isExpr;\nexports.isField = isField;\nexports.isCompare = isCompare;\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _util = require(\"../util\");\n\nvar _transforms = require(\"../transforms\");\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Parse a data transform specification.\n */\nfunction _default(spec, scope) {\n  var def = (0, _vegaDataflow.definition)(spec.type);\n  if (!def) (0, _vegaUtil.error)('Unrecognized transform type: ' + (0, _vegaUtil.stringValue)(spec.type));\n  var t = (0, _util.entry)(def.type.toLowerCase(), null, parseParameters(def, spec, scope));\n  if (spec.signal) scope.addSignal(spec.signal, scope.proxy(t));\n  t.metadata = def.metadata || {};\n  return t;\n}\n/**\n * Parse all parameters of a data transform.\n */\n\n\nfunction parseParameters(def, spec, scope) {\n  var params = {},\n      pdef,\n      i,\n      n;\n\n  for (i = 0, n = def.params.length; i < n; ++i) {\n    pdef = def.params[i];\n    params[pdef.name] = parseParameter(pdef, spec, scope);\n  }\n\n  return params;\n}\n/**\n * Parse a data transform parameter.\n */\n\n\nfunction parseParameter(def, spec, scope) {\n  var type = def.type,\n      value = spec[def.name];\n\n  if (type === 'index') {\n    return parseIndexParameter(def, spec, scope);\n  } else if (value === undefined) {\n    if (def.required) {\n      (0, _vegaUtil.error)('Missing required ' + (0, _vegaUtil.stringValue)(spec.type) + ' parameter: ' + (0, _vegaUtil.stringValue)(def.name));\n    }\n\n    return;\n  } else if (type === 'param') {\n    return parseSubParameters(def, spec, scope);\n  } else if (type === 'projection') {\n    return scope.projectionRef(spec[def.name]);\n  }\n\n  return def.array && !(0, _util.isSignal)(value) ? value.map(function (v) {\n    return parameterValue(def, v, scope);\n  }) : parameterValue(def, value, scope);\n}\n/**\n * Parse a single parameter value.\n */\n\n\nfunction parameterValue(def, value, scope) {\n  var type = def.type;\n\n  if ((0, _util.isSignal)(value)) {\n    return isExpr(type) ? (0, _vegaUtil.error)('Expression references can not be signals.') : isField(type) ? scope.fieldRef(value) : isCompare(type) ? scope.compareRef(value) : scope.signalRef(value.signal);\n  } else {\n    var expr = def.expr || isField(type);\n    return expr && outerExpr(value) ? scope.exprRef(value.expr, value.as) : expr && outerField(value) ? (0, _util.fieldRef)(value.field, value.as) : isExpr(type) ? (0, _expression.default)(value, scope) : isData(type) ? (0, _util.ref)(scope.getData(value).values) : isField(type) ? (0, _util.fieldRef)(value) : isCompare(type) ? scope.compareRef(value) : value;\n  }\n}\n/**\n * Parse parameter for accessing an index of another data set.\n */\n\n\nfunction parseIndexParameter(def, spec, scope) {\n  if (!(0, _vegaUtil.isString)(spec.from)) {\n    (0, _vegaUtil.error)('Lookup \"from\" parameter must be a string literal.');\n  }\n\n  return scope.getData(spec.from).lookupRef(scope, spec.key);\n}\n/**\n * Parse a parameter that contains one or more sub-parameter objects.\n */\n\n\nfunction parseSubParameters(def, spec, scope) {\n  var value = spec[def.name];\n\n  if (def.array) {\n    if (!(0, _vegaUtil.isArray)(value)) {\n      // signals not allowed!\n      (0, _vegaUtil.error)('Expected an array of sub-parameters. Instead: ' + (0, _vegaUtil.stringValue)(value));\n    }\n\n    return value.map(function (v) {\n      return parseSubParameter(def, v, scope);\n    });\n  } else {\n    return parseSubParameter(def, value, scope);\n  }\n}\n/**\n * Parse a sub-parameter object.\n */\n\n\nfunction parseSubParameter(def, value, scope) {\n  var params, pdef, k, i, n; // loop over defs to find matching key\n\n  for (i = 0, n = def.params.length; i < n; ++i) {\n    pdef = def.params[i];\n\n    for (k in pdef.key) {\n      if (pdef.key[k] !== value[k]) {\n        pdef = null;\n        break;\n      }\n    }\n\n    if (pdef) break;\n  } // raise error if matching key not found\n\n\n  if (!pdef) (0, _vegaUtil.error)('Unsupported parameter: ' + (0, _vegaUtil.stringValue)(value)); // parse params, create Params transform, return ref\n\n  params = (0, _vegaUtil.extend)(parseParameters(pdef, value, scope), pdef.key);\n  return (0, _util.ref)(scope.add((0, _transforms.Params)(params)));\n} // -- Utilities -----\n\n\nfunction outerExpr(_) {\n  return _ && _.expr;\n}\n\nfunction outerField(_) {\n  return _ && _.field;\n}\n\nfunction isData(_) {\n  return _ === 'data';\n}\n\nfunction isExpr(_) {\n  return _ === 'expr';\n}\n\nfunction isField(_) {\n  return _ === 'field';\n}\n\nfunction isCompare(_) {\n  return _ === 'compare';\n}\n},{\"./expression\":\"TGrP\",\"../util\":\"bnG3\",\"../transforms\":\"VbKC\",\"vega-dataflow\":\"luN0\",\"vega-util\":\"d61Z\"}],\"DIX1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.getDataRef = getDataRef;\n\nvar _transform = _interopRequireDefault(require(\"../transform\"));\n\nvar _util = require(\"../../util\");\n\nvar _transforms = require(\"../../transforms\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(from, group, scope) {\n  var facet, key, op, dataRef, parent; // if no source data, generate singleton datum\n\n  if (!from) {\n    dataRef = (0, _util.ref)(scope.add((0, _transforms.Collect)(null, [{}])));\n  } // if faceted, process facet specification\n  else if (facet = from.facet) {\n      if (!group) (0, _vegaUtil.error)('Only group marks can be faceted.'); // use pre-faceted source data, if available\n\n      if (facet.field != null) {\n        dataRef = parent = getDataRef(facet, scope);\n      } else {\n        // generate facet aggregates if no direct data specification\n        if (!from.data) {\n          op = (0, _transform.default)((0, _vegaUtil.extend)({\n            type: 'aggregate',\n            groupby: (0, _vegaUtil.array)(facet.groupby)\n          }, facet.aggregate), scope);\n          op.params.key = scope.keyRef(facet.groupby);\n          op.params.pulse = getDataRef(facet, scope);\n          dataRef = parent = (0, _util.ref)(scope.add(op));\n        } else {\n          parent = (0, _util.ref)(scope.getData(from.data).aggregate);\n        }\n\n        key = scope.keyRef(facet.groupby, true);\n      }\n    } // if not yet defined, get source data reference\n\n\n  if (!dataRef) {\n    dataRef = getDataRef(from, scope);\n  }\n\n  return {\n    key: key,\n    pulse: dataRef,\n    parent: parent\n  };\n}\n\nfunction getDataRef(from, scope) {\n  return from.$ref ? from : from.data && from.data.$ref ? from.data : (0, _util.ref)(scope.getData(from.data).output);\n}\n},{\"../transform\":\"v7J7\",\"../../util\":\"bnG3\",\"../../transforms\":\"VbKC\",\"vega-util\":\"d61Z\"}],\"rKjL\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = DataScope;\n\nvar _util = require(\"./util\");\n\nvar _transforms = require(\"./transforms\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction DataScope(scope, input, output, values, aggr) {\n  this.scope = scope; // parent scope object\n\n  this.input = input; // first operator in pipeline (tuple input)\n\n  this.output = output; // last operator in pipeline (tuple output)\n\n  this.values = values; // operator for accessing tuples (but not tuple flow)\n  // last aggregate in transform pipeline\n\n  this.aggregate = aggr; // lookup table of field indices\n\n  this.index = {};\n}\n\nDataScope.fromEntries = function (scope, entries) {\n  var n = entries.length,\n      i = 1,\n      input = entries[0],\n      values = entries[n - 1],\n      output = entries[n - 2],\n      aggr = null;\n\n  if (input && input.type === 'load') {\n    input = entries[1];\n  } // add operator entries to this scope, wire up pulse chain\n\n\n  scope.add(entries[0]);\n\n  for (; i < n; ++i) {\n    entries[i].params.pulse = (0, _util.ref)(entries[i - 1]);\n    scope.add(entries[i]);\n    if (entries[i].type === 'aggregate') aggr = entries[i];\n  }\n\n  return new DataScope(scope, input, output, values, aggr);\n};\n\nvar prototype = DataScope.prototype;\n\nprototype.countsRef = function (scope, field, sort) {\n  var ds = this,\n      cache = ds.counts || (ds.counts = {}),\n      k = fieldKey(field),\n      v,\n      a,\n      p;\n\n  if (k != null) {\n    scope = ds.scope;\n    v = cache[k];\n  }\n\n  if (!v) {\n    p = {\n      groupby: scope.fieldRef(field, 'key'),\n      pulse: (0, _util.ref)(ds.output)\n    };\n    if (sort && sort.field) addSortField(scope, p, sort);\n    a = scope.add((0, _transforms.Aggregate)(p));\n    v = scope.add((0, _transforms.Collect)({\n      pulse: (0, _util.ref)(a)\n    }));\n    v = {\n      agg: a,\n      ref: (0, _util.ref)(v)\n    };\n    if (k != null) cache[k] = v;\n  } else if (sort && sort.field) {\n    addSortField(scope, v.agg.params, sort);\n  }\n\n  return v.ref;\n};\n\nfunction fieldKey(field) {\n  return (0, _vegaUtil.isString)(field) ? field : null;\n}\n\nfunction addSortField(scope, p, sort) {\n  var as = (0, _util.aggrField)(sort.op, sort.field),\n      s;\n\n  if (p.ops) {\n    for (var i = 0, n = p.as.length; i < n; ++i) {\n      if (p.as[i] === as) return;\n    }\n  } else {\n    p.ops = ['count'];\n    p.fields = [null];\n    p.as = ['count'];\n  }\n\n  if (sort.op) {\n    p.ops.push((s = sort.op.signal) ? scope.signalRef(s) : sort.op);\n    p.fields.push(scope.fieldRef(sort.field));\n    p.as.push(as);\n  }\n}\n\nfunction cache(scope, ds, name, optype, field, counts, index) {\n  var cache = ds[name] || (ds[name] = {}),\n      sort = (0, _util.sortKey)(counts),\n      k = fieldKey(field),\n      v,\n      op;\n\n  if (k != null) {\n    scope = ds.scope;\n    k = k + (sort ? '|' + sort : '');\n    v = cache[k];\n  }\n\n  if (!v) {\n    var params = counts ? {\n      field: _util.keyFieldRef,\n      pulse: ds.countsRef(scope, field, counts)\n    } : {\n      field: scope.fieldRef(field),\n      pulse: (0, _util.ref)(ds.output)\n    };\n    if (sort) params.sort = scope.sortRef(counts);\n    op = scope.add((0, _util.entry)(optype, undefined, params));\n    if (index) ds.index[field] = op;\n    v = (0, _util.ref)(op);\n    if (k != null) cache[k] = v;\n  }\n\n  return v;\n}\n\nprototype.tuplesRef = function () {\n  return (0, _util.ref)(this.values);\n};\n\nprototype.extentRef = function (scope, field) {\n  return cache(scope, this, 'extent', 'extent', field, false);\n};\n\nprototype.domainRef = function (scope, field) {\n  return cache(scope, this, 'domain', 'values', field, false);\n};\n\nprototype.valuesRef = function (scope, field, sort) {\n  return cache(scope, this, 'vals', 'values', field, sort || true);\n};\n\nprototype.lookupRef = function (scope, field) {\n  return cache(scope, this, 'lookup', 'tupleindex', field, false);\n};\n\nprototype.indataRef = function (scope, field) {\n  return cache(scope, this, 'indata', 'tupleindex', field, true, true);\n};\n},{\"./util\":\"bnG3\",\"./transforms\":\"VbKC\",\"vega-util\":\"d61Z\"}],\"TcQm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _data = require(\"./data\");\n\nvar _spec = _interopRequireDefault(require(\"../spec\"));\n\nvar _DataScope = _interopRequireDefault(require(\"../../DataScope\"));\n\nvar _util = require(\"../../util\");\n\nvar _transforms = require(\"../../transforms\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scope, group) {\n  var facet = spec.from.facet,\n      name = facet.name,\n      data = (0, _data.getDataRef)(facet, scope),\n      subscope,\n      source,\n      values,\n      op;\n\n  if (!facet.name) {\n    (0, _vegaUtil.error)('Facet must have a name: ' + (0, _vegaUtil.stringValue)(facet));\n  }\n\n  if (!facet.data) {\n    (0, _vegaUtil.error)('Facet must reference a data set: ' + (0, _vegaUtil.stringValue)(facet));\n  }\n\n  if (facet.field) {\n    op = scope.add((0, _transforms.PreFacet)({\n      field: scope.fieldRef(facet.field),\n      pulse: data\n    }));\n  } else if (facet.groupby) {\n    op = scope.add((0, _transforms.Facet)({\n      key: scope.keyRef(facet.groupby),\n      group: (0, _util.ref)(scope.proxy(group.parent)),\n      pulse: data\n    }));\n  } else {\n    (0, _vegaUtil.error)('Facet must specify groupby or field: ' + (0, _vegaUtil.stringValue)(facet));\n  } // initialize facet subscope\n\n\n  subscope = scope.fork();\n  source = subscope.add((0, _transforms.Collect)());\n  values = subscope.add((0, _transforms.Sieve)({\n    pulse: (0, _util.ref)(source)\n  }));\n  subscope.addData(name, new _DataScope.default(subscope, source, source, values));\n  subscope.addSignal('parent', null); // parse faceted subflow\n\n  op.params.subflow = {\n    $subflow: (0, _spec.default)(spec, subscope).toRuntime()\n  };\n}\n},{\"./data\":\"DIX1\",\"../spec\":\"c8Qn\",\"../../DataScope\":\"rKjL\",\"../../util\":\"bnG3\",\"../../transforms\":\"VbKC\",\"vega-util\":\"d61Z\"}],\"LYbm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _spec = _interopRequireDefault(require(\"../spec\"));\n\nvar _transforms = require(\"../../transforms\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scope, input) {\n  var op = scope.add((0, _transforms.PreFacet)({\n    pulse: input.pulse\n  })),\n      subscope = scope.fork();\n  subscope.add((0, _transforms.Sieve)());\n  subscope.addSignal('parent', null); // parse group mark subflow\n\n  op.params.subflow = {\n    $subflow: (0, _spec.default)(spec, subscope).toRuntime()\n  };\n}\n},{\"../spec\":\"c8Qn\",\"../../transforms\":\"VbKC\"}],\"YeR3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _util = require(\"../util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scope, name) {\n  var remove = spec.remove,\n      insert = spec.insert,\n      toggle = spec.toggle,\n      modify = spec.modify,\n      values = spec.values,\n      op = scope.add((0, _util.operator)()),\n      update,\n      expr;\n  update = 'if(' + spec.trigger + ',modify(\"' + name + '\",' + [insert, remove, toggle, modify, values].map(function (_) {\n    return _ == null ? 'null' : _;\n  }).join(',') + '),0)';\n  expr = (0, _expression.default)(update, scope);\n  op.update = expr.$expr;\n  op.params = expr.$params;\n}\n},{\"./expression\":\"TGrP\",\"../util\":\"bnG3\"}],\"pD6s\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _clip = _interopRequireDefault(require(\"./marks/clip\"));\n\nvar _definition = _interopRequireDefault(require(\"./marks/definition\"));\n\nvar _interactive = _interopRequireDefault(require(\"./marks/interactive\"));\n\nvar _data = _interopRequireDefault(require(\"./marks/data\"));\n\nvar _facet = _interopRequireDefault(require(\"./marks/facet\"));\n\nvar _subflow = _interopRequireDefault(require(\"./marks/subflow\"));\n\nvar _role = _interopRequireDefault(require(\"./marks/role\"));\n\nvar _marktypes = require(\"./marks/marktypes\");\n\nvar _roles = require(\"./marks/roles\");\n\nvar _encodeUtil = require(\"./encode/encode-util\");\n\nvar _transform = _interopRequireDefault(require(\"./transform\"));\n\nvar _trigger = _interopRequireDefault(require(\"./trigger\"));\n\nvar _spec = _interopRequireDefault(require(\"./spec\"));\n\nvar _DataScope = _interopRequireDefault(require(\"../DataScope\"));\n\nvar _util = require(\"../util\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nvar _transforms = require(\"../transforms\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scope) {\n  var role = (0, _role.default)(spec),\n      group = spec.type === _marktypes.GroupMark,\n      facet = spec.from && spec.from.facet,\n      layout = spec.layout || role === _roles.ScopeRole || role === _roles.FrameRole,\n      nested = role === _roles.MarkRole || layout || facet,\n      overlap = spec.overlap,\n      ops,\n      op,\n      input,\n      store,\n      enc,\n      bound,\n      render,\n      sieve,\n      name,\n      joinRef,\n      markRef,\n      encodeRef,\n      layoutRef,\n      boundRef; // resolve input data\n\n  input = (0, _data.default)(spec.from, group, scope); // data join to map tuples to visual items\n\n  op = scope.add((0, _transforms.DataJoin)({\n    key: input.key || (spec.key ? (0, _util.fieldRef)(spec.key) : undefined),\n    pulse: input.pulse,\n    clean: !group\n  }));\n  joinRef = (0, _util.ref)(op); // collect visual items\n\n  op = store = scope.add((0, _transforms.Collect)({\n    pulse: joinRef\n  })); // connect visual items to scenegraph\n\n  op = scope.add((0, _transforms.Mark)({\n    markdef: (0, _definition.default)(spec),\n    interactive: (0, _interactive.default)(spec.interactive, scope),\n    clip: (0, _clip.default)(spec.clip, scope),\n    context: {\n      $context: true\n    },\n    groups: scope.lookup(),\n    parent: scope.signals.parent ? scope.signalRef('parent') : null,\n    index: scope.markpath(),\n    pulse: (0, _util.ref)(op)\n  }));\n  markRef = (0, _util.ref)(op); // add visual encoders\n\n  op = enc = scope.add((0, _transforms.Encode)((0, _encodeUtil.encoders)(spec.encode, spec.type, role, spec.style, scope, {\n    mod: false,\n    pulse: markRef\n  }))); // monitor parent marks to propagate changes\n\n  op.params.parent = scope.encode(); // add post-encoding transforms, if defined\n\n  if (spec.transform) {\n    spec.transform.forEach(function (_) {\n      const tx = (0, _transform.default)(_, scope),\n            md = tx.metadata;\n\n      if (md.generates || md.changes) {\n        (0, _vegaUtil.error)('Mark transforms should not generate new data.');\n      }\n\n      if (!md.nomod) enc.params.mod = true; // update encode mod handling\n\n      tx.params.pulse = (0, _util.ref)(op);\n      scope.add(op = tx);\n    });\n  } // if item sort specified, perform post-encoding\n\n\n  if (spec.sort) {\n    op = scope.add((0, _transforms.SortItems)({\n      sort: scope.compareRef(spec.sort),\n      pulse: (0, _util.ref)(op)\n    }));\n  }\n\n  encodeRef = (0, _util.ref)(op); // add view layout operator if needed\n\n  if (facet || layout) {\n    layout = scope.add((0, _transforms.ViewLayout)({\n      layout: scope.objectProperty(spec.layout),\n      legends: scope.legends,\n      mark: markRef,\n      pulse: encodeRef\n    }));\n    layoutRef = (0, _util.ref)(layout);\n  } // compute bounding boxes\n\n\n  bound = scope.add((0, _transforms.Bound)({\n    mark: markRef,\n    pulse: layoutRef || encodeRef\n  }));\n  boundRef = (0, _util.ref)(bound); // if group mark, recurse to parse nested content\n\n  if (group) {\n    // juggle layout & bounds to ensure they run *after* any faceting transforms\n    if (nested) {\n      ops = scope.operators;\n      ops.pop();\n      if (layout) ops.pop();\n    }\n\n    scope.pushState(encodeRef, layoutRef || boundRef, joinRef);\n    facet ? (0, _facet.default)(spec, scope, input) // explicit facet\n    : nested ? (0, _subflow.default)(spec, scope, input) // standard mark group\n    : (0, _spec.default)(spec, scope); // guide group, we can avoid nested scopes\n\n    scope.popState();\n\n    if (nested) {\n      if (layout) ops.push(layout);\n      ops.push(bound);\n    }\n  } // if requested, add overlap removal transform\n\n\n  if (overlap) {\n    boundRef = parseOverlap(overlap, boundRef, scope);\n  } // render / sieve items\n\n\n  render = scope.add((0, _transforms.Render)({\n    pulse: boundRef\n  }));\n  sieve = scope.add((0, _transforms.Sieve)({\n    pulse: (0, _util.ref)(render)\n  }, undefined, scope.parent())); // if mark is named, make accessible as reactive geometry\n  // add trigger updates if defined\n\n  if (spec.name != null) {\n    name = spec.name;\n    scope.addData(name, new _DataScope.default(scope, store, render, sieve));\n    if (spec.on) spec.on.forEach(function (on) {\n      if (on.insert || on.remove || on.toggle) {\n        (0, _vegaUtil.error)('Marks only support modify triggers.');\n      }\n\n      (0, _trigger.default)(on, scope, name);\n    });\n  }\n}\n\nfunction parseOverlap(overlap, source, scope) {\n  var method = overlap.method,\n      bound = overlap.bound,\n      sep = overlap.separation,\n      tol;\n  var params = {\n    separation: (0, _util.isSignal)(sep) ? scope.signalRef(sep.signal) : sep,\n    method: (0, _util.isSignal)(method) ? scope.signalRef(method.signal) : method,\n    pulse: source\n  };\n\n  if (overlap.order) {\n    params.sort = scope.compareRef({\n      field: overlap.order\n    });\n  }\n\n  if (bound) {\n    tol = bound.tolerance;\n    params.boundTolerance = (0, _util.isSignal)(tol) ? scope.signalRef(tol.signal) : +tol;\n    params.boundScale = scope.scaleRef(bound.scale);\n    params.boundOrient = bound.orient;\n  }\n\n  return (0, _util.ref)(scope.add((0, _transforms.Overlap)(params)));\n}\n},{\"./marks/clip\":\"xNu9\",\"./marks/definition\":\"oQiN\",\"./marks/interactive\":\"LrWd\",\"./marks/data\":\"DIX1\",\"./marks/facet\":\"TcQm\",\"./marks/subflow\":\"LYbm\",\"./marks/role\":\"nWcy\",\"./marks/marktypes\":\"M2D5\",\"./marks/roles\":\"UXRt\",\"./encode/encode-util\":\"sfJ8\",\"./transform\":\"v7J7\",\"./trigger\":\"YeR3\",\"./spec\":\"c8Qn\",\"../DataScope\":\"rKjL\",\"../util\":\"bnG3\",\"vega-util\":\"d61Z\",\"../transforms\":\"VbKC\"}],\"VuhQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./guides/constants\");\n\nvar _legendGradient = _interopRequireDefault(require(\"./guides/legend-gradient\"));\n\nvar _legendGradientDiscrete = _interopRequireDefault(require(\"./guides/legend-gradient-discrete\"));\n\nvar _legendGradientLabels = _interopRequireDefault(require(\"./guides/legend-gradient-labels\"));\n\nvar _legendSymbolGroups = _interopRequireWildcard(require(\"./guides/legend-symbol-groups\"));\n\nvar _legendTitle = _interopRequireDefault(require(\"./guides/legend-title\"));\n\nvar _guideGroup = _interopRequireDefault(require(\"./guides/guide-group\"));\n\nvar _guideUtil = require(\"./guides/guide-util\");\n\nvar _expression = _interopRequireDefault(require(\"./expression\"));\n\nvar _mark = _interopRequireDefault(require(\"./mark\"));\n\nvar _roles = require(\"./marks/roles\");\n\nvar _encodeUtil = require(\"./encode/encode-util\");\n\nvar _util = require(\"../util\");\n\nvar _transforms = require(\"../transforms\");\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scope) {\n  var config = scope.config.legend,\n      encode = spec.encode || {},\n      legendEncode = encode.legend || {},\n      name = legendEncode.name || undefined,\n      interactive = legendEncode.interactive,\n      style = legendEncode.style,\n      _ = (0, _guideUtil.lookup)(spec, config),\n      entryEncode,\n      entryLayout,\n      params,\n      children,\n      type,\n      datum,\n      dataRef,\n      entryRef,\n      group; // resolve 'canonical' scale name\n\n\n  var scale = _constants.LegendScales.reduce(function (a, b) {\n    return a || spec[b];\n  }, 0);\n\n  if (!scale) (0, _vegaUtil.error)('Missing valid scale for legend.'); // resolve legend type (symbol, gradient, or discrete gradient)\n\n  type = legendType(spec, scope.scaleType(scale)); // single-element data source for legend group\n\n  datum = {\n    title: spec.title != null,\n    type: type,\n    vgrad: type !== 'symbol' && _.isVertical()\n  };\n  dataRef = (0, _util.ref)(scope.add((0, _transforms.Collect)(null, [datum]))); // encoding properties for legend group\n\n  legendEncode = (0, _encodeUtil.extendEncode)(buildLegendEncode(_, config), legendEncode, _constants.Skip); // encoding properties for legend entry sub-group\n\n  entryEncode = {\n    enter: {\n      x: {\n        value: 0\n      },\n      y: {\n        value: 0\n      }\n    }\n  }; // data source for legend values\n\n  entryRef = (0, _util.ref)(scope.add((0, _transforms.LegendEntries)(params = {\n    type: type,\n    scale: scope.scaleRef(scale),\n    count: scope.objectProperty(_('tickCount')),\n    limit: scope.property(_('symbolLimit')),\n    values: scope.objectProperty(spec.values),\n    minstep: scope.property(spec.tickMinStep),\n    formatType: scope.property(spec.formatType),\n    formatSpecifier: scope.property(spec.format)\n  }))); // continuous gradient legend\n\n  if (type === _constants.Gradient) {\n    children = [(0, _legendGradient.default)(spec, scale, config, encode.gradient), (0, _legendGradientLabels.default)(spec, config, encode.labels, entryRef)]; // adjust default tick count based on the gradient length\n\n    params.count = params.count || scope.signalRef(`max(2,2*floor((${(0, _util.deref)(_.gradientLength())})/100))`);\n  } // discrete gradient legend\n  else if (type === _constants.Discrete) {\n      children = [(0, _legendGradientDiscrete.default)(spec, scale, config, encode.gradient, entryRef), (0, _legendGradientLabels.default)(spec, config, encode.labels, entryRef)];\n    } // symbol legend\n    else {\n        // determine legend symbol group layout\n        entryLayout = (0, _legendSymbolGroups.legendSymbolLayout)(spec, config);\n        children = [(0, _legendSymbolGroups.default)(spec, config, encode, entryRef, (0, _util.deref)(entryLayout.columns))]; // pass symbol size information to legend entry generator\n\n        params.size = sizeExpression(spec, scope, children[0].marks);\n      } // generate legend marks\n\n\n  children = [(0, _guideGroup.default)(_roles.LegendEntryRole, null, null, dataRef, interactive, entryEncode, children, entryLayout)]; // include legend title if defined\n\n  if (datum.title) {\n    children.push((0, _legendTitle.default)(spec, config, encode.title, dataRef));\n  } // build legend specification\n\n\n  group = (0, _guideGroup.default)(_roles.LegendRole, style, name, dataRef, interactive, legendEncode, children);\n  if (spec.zindex) group.zindex = spec.zindex; // parse legend specification\n\n  return (0, _mark.default)(group, scope);\n}\n\nfunction legendType(spec, scaleType) {\n  var type = spec.type || _constants.Symbols;\n\n  if (!spec.type && scaleCount(spec) === 1 && (spec.fill || spec.stroke)) {\n    type = (0, _vegaScale.isContinuous)(scaleType) ? _constants.Gradient : (0, _vegaScale.isDiscretizing)(scaleType) ? _constants.Discrete : _constants.Symbols;\n  }\n\n  return type !== _constants.Gradient ? type : (0, _vegaScale.isDiscretizing)(scaleType) ? _constants.Discrete : _constants.Gradient;\n}\n\nfunction scaleCount(spec) {\n  return _constants.LegendScales.reduce(function (count, type) {\n    return count + (spec[type] ? 1 : 0);\n  }, 0);\n}\n\nfunction buildLegendEncode(_, config) {\n  var encode = {\n    enter: {},\n    update: {}\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    orient: _('orient'),\n    offset: _('offset'),\n    padding: _('padding'),\n    titlePadding: _('titlePadding'),\n    cornerRadius: _('cornerRadius'),\n    fill: _('fillColor'),\n    stroke: _('strokeColor'),\n    strokeWidth: config.strokeWidth,\n    strokeDash: config.strokeDash,\n    x: _('legendX'),\n    y: _('legendY')\n  });\n  return encode;\n}\n\nfunction sizeExpression(spec, scope, marks) {\n  var size = (0, _util.deref)(getChannel('size', spec, marks)),\n      strokeWidth = (0, _util.deref)(getChannel('strokeWidth', spec, marks)),\n      fontSize = (0, _util.deref)(getFontSize(marks[1].encode, scope, _constants.GuideLabelStyle));\n  return (0, _expression.default)(`max(ceil(sqrt(${size})+${strokeWidth}),${fontSize})`, scope);\n}\n\nfunction getChannel(name, spec, marks) {\n  return spec[name] ? `scale(\"${spec[name]}\",datum)` : (0, _guideUtil.getEncoding)(name, marks[0].encode);\n}\n\nfunction getFontSize(encode, scope, style) {\n  return (0, _guideUtil.getEncoding)('fontSize', encode) || (0, _guideUtil.getStyle)('fontSize', scope, style);\n}\n},{\"./guides/constants\":\"uZ05\",\"./guides/legend-gradient\":\"fPTH\",\"./guides/legend-gradient-discrete\":\"b4OI\",\"./guides/legend-gradient-labels\":\"sMK6\",\"./guides/legend-symbol-groups\":\"sSDp\",\"./guides/legend-title\":\"aze4\",\"./guides/guide-group\":\"cARw\",\"./guides/guide-util\":\"XaVO\",\"./expression\":\"TGrP\",\"./mark\":\"pD6s\",\"./marks/roles\":\"UXRt\",\"./encode/encode-util\":\"sfJ8\",\"../util\":\"bnG3\",\"../transforms\":\"VbKC\",\"vega-scale\":\"N8iK\",\"vega-util\":\"d61Z\"}],\"LSvE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./guides/constants\");\n\nvar _guideGroup = _interopRequireDefault(require(\"./guides/guide-group\"));\n\nvar _guideMark = _interopRequireDefault(require(\"./guides/guide-mark\"));\n\nvar _guideUtil = require(\"./guides/guide-util\");\n\nvar _mark = _interopRequireDefault(require(\"./mark\"));\n\nvar _marktypes = require(\"./marks/marktypes\");\n\nvar _roles = require(\"./marks/roles\");\n\nvar _encodeUtil = require(\"./encode/encode-util\");\n\nvar _util = require(\"../util\");\n\nvar _transforms = require(\"../transforms\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst angleExpr = `item.orient===\"${_constants.Left}\"?-90:item.orient===\"${_constants.Right}\"?90:0`;\n\nfunction _default(spec, scope) {\n  spec = (0, _vegaUtil.isString)(spec) ? {\n    text: spec\n  } : spec;\n\n  var _ = (0, _guideUtil.lookup)(spec, scope.config.title),\n      encode = spec.encode || {},\n      userEncode = encode.group || {},\n      name = userEncode.name || undefined,\n      interactive = userEncode.interactive,\n      style = userEncode.style,\n      children = [],\n      dataRef,\n      group; // single-element data source for group title\n\n\n  dataRef = (0, _util.ref)(scope.add((0, _transforms.Collect)(null, [{}]))); // include title text\n\n  children.push(buildTitle(spec, _, titleEncode(spec), dataRef)); // include subtitle text\n\n  if (spec.subtitle) {\n    children.push(buildSubTitle(spec, _, encode.subtitle, dataRef));\n  } // build title specification\n\n\n  group = (0, _guideGroup.default)(_roles.TitleRole, style, name, dataRef, interactive, groupEncode(_, userEncode), children);\n  if (spec.zindex) group.zindex = spec.zindex; // parse title specification\n\n  return (0, _mark.default)(group, scope);\n} // provide backwards-compatibility for title custom encode;\n// the top-level encode block has been *deprecated*.\n\n\nfunction titleEncode(spec) {\n  const encode = spec.encode;\n  return encode && encode.title || (0, _vegaUtil.extend)({\n    name: spec.name,\n    interactive: spec.interactive,\n    style: spec.style\n  }, encode);\n}\n\nfunction groupEncode(_, userEncode) {\n  var encode = {\n    enter: {},\n    update: {}\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    orient: _('orient'),\n    anchor: _('anchor'),\n    align: {\n      signal: _guideUtil.alignExpr\n    },\n    angle: {\n      signal: angleExpr\n    },\n    limit: _('limit'),\n    frame: _('frame'),\n    offset: _('offset') || 0,\n    padding: _('subtitlePadding')\n  });\n  return (0, _encodeUtil.extendEncode)(encode, userEncode, _constants.Skip);\n}\n\nfunction buildTitle(spec, _, userEncode, dataRef) {\n  var zero = {\n    value: 0\n  },\n      text = spec.text,\n      encode = {\n    enter: {\n      opacity: zero\n    },\n    update: {\n      opacity: {\n        value: 1\n      }\n    },\n    exit: {\n      opacity: zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    text: text,\n    align: {\n      signal: 'item.mark.group.align'\n    },\n    angle: {\n      signal: 'item.mark.group.angle'\n    },\n    limit: {\n      signal: 'item.mark.group.limit'\n    },\n    baseline: 'top',\n    dx: _('dx'),\n    dy: _('dy'),\n    fill: _('color'),\n    font: _('font'),\n    fontSize: _('fontSize'),\n    fontStyle: _('fontStyle'),\n    fontWeight: _('fontWeight'),\n    lineHeight: _('lineHeight')\n  }, {\n    // update\n    align: _('align'),\n    angle: _('angle'),\n    baseline: _('baseline')\n  });\n  return (0, _guideMark.default)(_marktypes.TextMark, _roles.TitleTextRole, _constants.GroupTitleStyle, null, dataRef, encode, userEncode);\n}\n\nfunction buildSubTitle(spec, _, userEncode, dataRef) {\n  var zero = {\n    value: 0\n  },\n      text = spec.subtitle,\n      encode = {\n    enter: {\n      opacity: zero\n    },\n    update: {\n      opacity: {\n        value: 1\n      }\n    },\n    exit: {\n      opacity: zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    text: text,\n    align: {\n      signal: 'item.mark.group.align'\n    },\n    angle: {\n      signal: 'item.mark.group.angle'\n    },\n    limit: {\n      signal: 'item.mark.group.limit'\n    },\n    baseline: 'top',\n    dx: _('dx'),\n    dy: _('dy'),\n    fill: _('subtitleColor'),\n    font: _('subtitleFont'),\n    fontSize: _('subtitleFontSize'),\n    fontStyle: _('subtitleFontStyle'),\n    fontWeight: _('subtitleFontWeight'),\n    lineHeight: _('subtitleLineHeight')\n  }, {\n    // update\n    align: _('align'),\n    angle: _('angle'),\n    baseline: _('baseline')\n  });\n  return (0, _guideMark.default)(_marktypes.TextMark, _roles.TitleSubtitleRole, _constants.GroupSubtitleStyle, null, dataRef, encode, userEncode);\n}\n},{\"./guides/constants\":\"uZ05\",\"./guides/guide-group\":\"cARw\",\"./guides/guide-mark\":\"VfcM\",\"./guides/guide-util\":\"XaVO\",\"./mark\":\"pD6s\",\"./marks/marktypes\":\"M2D5\",\"./marks/roles\":\"UXRt\",\"./encode/encode-util\":\"sfJ8\",\"../util\":\"bnG3\",\"../transforms\":\"VbKC\",\"vega-util\":\"d61Z\"}],\"n1aF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parseData;\n\nvar _transform = _interopRequireDefault(require(\"./transform\"));\n\nvar _trigger = _interopRequireDefault(require(\"./trigger\"));\n\nvar _util = require(\"../util\");\n\nvar _transforms = require(\"../transforms\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parseData(data, scope) {\n  var transforms = [];\n\n  if (data.transform) {\n    data.transform.forEach(function (tx) {\n      transforms.push((0, _transform.default)(tx, scope));\n    });\n  }\n\n  if (data.on) {\n    data.on.forEach(function (on) {\n      (0, _trigger.default)(on, scope, data.name);\n    });\n  }\n\n  scope.addDataPipeline(data.name, analyze(data, scope, transforms));\n}\n/**\n * Analyze a data pipeline, add needed operators.\n */\n\n\nfunction analyze(data, scope, ops) {\n  var output = [],\n      source = null,\n      modify = false,\n      generate = false,\n      upstream,\n      i,\n      n,\n      t,\n      m;\n\n  if (data.values) {\n    // hard-wired input data set\n    if ((0, _util.hasSignal)(data.values) || (0, _util.hasSignal)(data.format)) {\n      // if either values or format has signal, use dynamic loader\n      output.push(load(scope, data));\n      output.push(source = collect());\n    } else {\n      // otherwise, ingest upon dataflow init\n      output.push(source = collect({\n        $ingest: data.values,\n        $format: data.format\n      }));\n    }\n  } else if (data.url) {\n    // load data from external source\n    if ((0, _util.hasSignal)(data.url) || (0, _util.hasSignal)(data.format)) {\n      // if either url or format has signal, use dynamic loader\n      output.push(load(scope, data));\n      output.push(source = collect());\n    } else {\n      // otherwise, request load upon dataflow init\n      output.push(source = collect({\n        $request: data.url,\n        $format: data.format\n      }));\n    }\n  } else if (data.source) {\n    // derives from one or more other data sets\n    source = upstream = (0, _vegaUtil.array)(data.source).map(function (d) {\n      return (0, _util.ref)(scope.getData(d).output);\n    });\n    output.push(null); // populate later\n  } // scan data transforms, add collectors as needed\n\n\n  for (i = 0, n = ops.length; i < n; ++i) {\n    t = ops[i];\n    m = t.metadata;\n\n    if (!source && !m.source) {\n      output.push(source = collect());\n    }\n\n    output.push(t);\n    if (m.generates) generate = true;\n    if (m.modifies && !generate) modify = true;\n    if (m.source) source = t;else if (m.changes) source = null;\n  }\n\n  if (upstream) {\n    n = upstream.length - 1;\n    output[0] = (0, _transforms.Relay)({\n      derive: modify,\n      pulse: n ? upstream : upstream[0]\n    });\n\n    if (modify || n) {\n      // collect derived and multi-pulse tuples\n      output.splice(1, 0, collect());\n    }\n  }\n\n  if (!source) output.push(collect());\n  output.push((0, _transforms.Sieve)({}));\n  return output;\n}\n\nfunction collect(values) {\n  var s = (0, _transforms.Collect)({}, values);\n  s.metadata = {\n    source: true\n  };\n  return s;\n}\n\nfunction load(scope, data) {\n  return (0, _transforms.Load)({\n    url: data.url ? scope.property(data.url) : undefined,\n    values: data.values ? scope.property(data.values) : undefined,\n    format: scope.objectProperty(data.format)\n  });\n}\n},{\"./transform\":\"v7J7\",\"./trigger\":\"YeR3\",\"../util\":\"bnG3\",\"../transforms\":\"VbKC\",\"vega-util\":\"d61Z\"}],\"NSQT\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _default(spec, scope) {\n  var config = scope.config,\n      orient = spec.orient,\n      xy = orient === _constants.Top || orient === _constants.Bottom ? config.axisX : config.axisY,\n      or = config['axis' + orient[0].toUpperCase() + orient.slice(1)],\n      band = scope.scaleType(spec.scale) === 'band' && config.axisBand;\n  return xy || or || band ? (0, _vegaUtil.extend)({}, config.axis, xy, or, band) : config.axis;\n}\n},{\"./constants\":\"uZ05\",\"vega-util\":\"d61Z\"}],\"qUyd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, config, userEncode, dataRef) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      orient = spec.orient,\n      encode,\n      enter,\n      update,\n      u,\n      u2,\n      v;\n\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero\n    },\n    update: update = {\n      opacity: _constants.one\n    },\n    exit: {\n      opacity: _constants.zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    stroke: _('domainColor'),\n    strokeDash: _('domainDash'),\n    strokeDashOffset: _('domainDashOffset'),\n    strokeWidth: _('domainWidth'),\n    strokeOpacity: _('domainOpacity')\n  });\n\n  if (orient === _constants.Top || orient === _constants.Bottom) {\n    u = 'x';\n    v = 'y';\n  } else {\n    u = 'y';\n    v = 'x';\n  }\n\n  u2 = u + '2';\n  enter[v] = _constants.zero;\n  update[u] = enter[u] = position(spec, 0);\n  update[u2] = enter[u2] = position(spec, 1);\n  return (0, _guideMark.default)(_marktypes.RuleMark, _roles.AxisDomainRole, null, null, dataRef, encode, userEncode);\n}\n\nfunction position(spec, pos) {\n  return {\n    scale: spec.scale,\n    range: pos\n  };\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\"}],\"HFqF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, config, userEncode, dataRef, band) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      orient = spec.orient,\n      vscale = spec.gridScale,\n      sign = orient === _constants.Left || orient === _constants.Top ? 1 : -1,\n      offset = offsetValue(spec.offset, sign),\n      encode,\n      enter,\n      exit,\n      update,\n      tickPos,\n      u,\n      v,\n      v2,\n      s;\n\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero\n    },\n    update: update = {\n      opacity: _constants.one\n    },\n    exit: exit = {\n      opacity: _constants.zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    stroke: _('gridColor'),\n    strokeDash: _('gridDash'),\n    strokeDashOffset: _('gridDashOffset'),\n    strokeOpacity: _('gridOpacity'),\n    strokeWidth: _('gridWidth')\n  });\n  tickPos = {\n    scale: spec.scale,\n    field: _constants.Value,\n    band: band.band,\n    extra: band.extra,\n    offset: band.offset,\n    round: _('tickRound')\n  };\n\n  if (orient === _constants.Top || orient === _constants.Bottom) {\n    u = 'x';\n    v = 'y';\n    s = 'height';\n  } else {\n    u = 'y';\n    v = 'x';\n    s = 'width';\n  }\n\n  v2 = v + '2';\n  update[u] = enter[u] = exit[u] = tickPos;\n\n  if (vscale) {\n    update[v] = enter[v] = {\n      scale: vscale,\n      range: 0,\n      mult: sign,\n      offset: offset\n    };\n    update[v2] = enter[v2] = {\n      scale: vscale,\n      range: 1,\n      mult: sign,\n      offset: offset\n    };\n  } else {\n    update[v] = enter[v] = {\n      value: 0,\n      offset: offset\n    };\n    update[v2] = enter[v2] = {\n      signal: s,\n      mult: sign,\n      offset: offset\n    };\n  }\n\n  return (0, _guideMark.default)(_marktypes.RuleMark, _roles.AxisGridRole, null, _constants.Value, dataRef, encode, userEncode);\n}\n\nfunction offsetValue(offset, sign) {\n  if (sign === 1) {// do nothing!\n  } else if (!(0, _vegaUtil.isObject)(offset)) {\n    offset = sign * (offset || 0);\n  } else {\n    var entry = offset = (0, _vegaUtil.extend)({}, offset);\n\n    while (entry.mult != null) {\n      if (!(0, _vegaUtil.isObject)(entry.mult)) {\n        entry.mult *= sign;\n        return offset;\n      } else {\n        entry = entry.mult = (0, _vegaUtil.extend)({}, entry.mult);\n      }\n    }\n\n    entry.mult = sign;\n  }\n\n  return offset;\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\",\"vega-util\":\"d61Z\"}],\"fdqn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, config, userEncode, dataRef, size, band) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      orient = spec.orient,\n      sign = orient === _constants.Left || orient === _constants.Top ? -1 : 1,\n      encode,\n      enter,\n      exit,\n      update,\n      tickSize,\n      tickPos;\n\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero\n    },\n    update: update = {\n      opacity: _constants.one\n    },\n    exit: exit = {\n      opacity: _constants.zero\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    stroke: _('tickColor'),\n    strokeDash: _('tickDash'),\n    strokeDashOffset: _('tickDashOffset'),\n    strokeOpacity: _('tickOpacity'),\n    strokeWidth: _('tickWidth')\n  });\n  tickSize = (0, _encodeUtil.encoder)(size);\n  tickSize.mult = sign;\n  tickPos = {\n    scale: spec.scale,\n    field: _constants.Value,\n    band: band.band,\n    extra: band.extra,\n    offset: band.offset,\n    round: _('tickRound')\n  };\n\n  if (orient === _constants.Top || orient === _constants.Bottom) {\n    update.y = enter.y = _constants.zero;\n    update.y2 = enter.y2 = tickSize;\n    update.x = enter.x = exit.x = tickPos;\n  } else {\n    update.x = enter.x = _constants.zero;\n    update.x2 = enter.x2 = tickSize;\n    update.y = enter.y = exit.y = tickPos;\n  }\n\n  return (0, _guideMark.default)(_marktypes.RuleMark, _roles.AxisTickRole, null, _constants.Value, dataRef, encode, userEncode);\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\"}],\"rbcm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nvar _util = require(\"../../util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction flushExpr(scale, threshold, a, b, c) {\n  return {\n    signal: 'flush(range(\"' + scale + '\"), ' + 'scale(\"' + scale + '\", datum.value), ' + threshold + ',' + a + ',' + b + ',' + c + ')'\n  };\n}\n\nfunction _default(spec, config, userEncode, dataRef, size, band) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      orient = spec.orient,\n      sign = orient === _constants.Left || orient === _constants.Top ? -1 : 1,\n      isXAxis = orient === _constants.Top || orient === _constants.Bottom,\n      scale = spec.scale,\n      flush = (0, _util.deref)(_('labelFlush')),\n      flushOffset = (0, _util.deref)(_('labelFlushOffset')),\n      flushOn = flush === 0 || !!flush,\n      labelAlign = _('labelAlign'),\n      labelBaseline = _('labelBaseline'),\n      encode,\n      enter,\n      tickSize,\n      tickPos,\n      align,\n      baseline,\n      offset,\n      bound,\n      overlap,\n      separation;\n\n  tickSize = (0, _encodeUtil.encoder)(size);\n  tickSize.mult = sign;\n  tickSize.offset = (0, _encodeUtil.encoder)(_('labelPadding') || 0);\n  tickSize.offset.mult = sign;\n  tickPos = {\n    scale: scale,\n    field: _constants.Value,\n    band: 0.5,\n    offset: band.offset\n  };\n\n  if (isXAxis) {\n    align = labelAlign || (flushOn ? flushExpr(scale, flush, '\"left\"', '\"right\"', '\"center\"') : 'center');\n    baseline = labelBaseline || (orient === _constants.Top ? 'bottom' : 'top');\n    offset = !labelAlign;\n  } else {\n    align = labelAlign || (orient === _constants.Right ? 'left' : 'right');\n    baseline = labelBaseline || (flushOn ? flushExpr(scale, flush, '\"top\"', '\"bottom\"', '\"middle\"') : 'middle');\n    offset = !labelBaseline;\n  }\n\n  offset = offset && flushOn && flushOffset ? flushExpr(scale, flush, '-(' + flushOffset + ')', flushOffset, 0) : null;\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero,\n      x: isXAxis ? tickPos : tickSize,\n      y: isXAxis ? tickSize : tickPos\n    },\n    update: {\n      opacity: _constants.one,\n      text: {\n        field: _constants.Label\n      },\n      x: enter.x,\n      y: enter.y\n    },\n    exit: {\n      opacity: _constants.zero,\n      x: enter.x,\n      y: enter.y\n    }\n  };\n  (0, _encodeUtil.addEncoders)(encode, {\n    [isXAxis ? 'dx' : 'dy']: offset,\n    align: align,\n    baseline: baseline,\n    angle: _('labelAngle'),\n    fill: _('labelColor'),\n    fillOpacity: _('labelOpacity'),\n    font: _('labelFont'),\n    fontSize: _('labelFontSize'),\n    fontWeight: _('labelFontWeight'),\n    fontStyle: _('labelFontStyle'),\n    limit: _('labelLimit')\n  });\n  bound = _('labelBound');\n  overlap = _('labelOverlap');\n  separation = _('labelSeparation');\n  spec = (0, _guideMark.default)(_marktypes.TextMark, _roles.AxisLabelRole, _constants.GuideLabelStyle, _constants.Value, dataRef, encode, userEncode); // if overlap method or bound defined, request label overlap removal\n\n  if (overlap || bound) {\n    spec.overlap = {\n      separation: separation,\n      method: overlap,\n      order: 'datum.index',\n      bound: bound ? {\n        scale: scale,\n        orient: orient,\n        tolerance: bound\n      } : null\n    };\n  }\n\n  return spec;\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"../encode/encode-util\":\"sfJ8\",\"../../util\":\"bnG3\"}],\"Xsho\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _guideMark = _interopRequireDefault(require(\"./guide-mark\"));\n\nvar _guideUtil = require(\"./guide-util\");\n\nvar _encodeUtil = require(\"../encode/encode-util\");\n\nvar _marktypes = require(\"../marks/marktypes\");\n\nvar _roles = require(\"../marks/roles\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, config, userEncode, dataRef) {\n  var _ = (0, _guideUtil.lookup)(spec, config),\n      orient = spec.orient,\n      sign = orient === _constants.Left || orient === _constants.Top ? -1 : 1,\n      horizontal = orient === _constants.Top || orient === _constants.Bottom,\n      encode,\n      enter,\n      update,\n      titlePos;\n\n  encode = {\n    enter: enter = {\n      opacity: _constants.zero,\n      anchor: (0, _encodeUtil.encoder)(_('titleAnchor')),\n      align: {\n        signal: _guideUtil.alignExpr\n      }\n    },\n    update: update = (0, _vegaUtil.extend)({}, enter, {\n      opacity: _constants.one,\n      text: (0, _encodeUtil.encoder)(spec.title)\n    }),\n    exit: {\n      opacity: _constants.zero\n    }\n  };\n  titlePos = {\n    signal: `lerp(range(\"${spec.scale}\"), ${(0, _guideUtil.anchorExpr)(0, 1, 0.5)})`\n  };\n\n  if (horizontal) {\n    update.x = titlePos;\n    enter.angle = {\n      value: 0\n    };\n    enter.baseline = {\n      value: orient === _constants.Top ? 'bottom' : 'top'\n    };\n  } else {\n    update.y = titlePos;\n    enter.angle = {\n      value: sign * 90\n    };\n    enter.baseline = {\n      value: 'bottom'\n    };\n  }\n\n  (0, _encodeUtil.addEncoders)(encode, {\n    angle: _('titleAngle'),\n    baseline: _('titleBaseline'),\n    fill: _('titleColor'),\n    fillOpacity: _('titleOpacity'),\n    font: _('titleFont'),\n    fontSize: _('titleFontSize'),\n    fontStyle: _('titleFontStyle'),\n    fontWeight: _('titleFontWeight'),\n    limit: _('titleLimit'),\n    lineHeight: _('titleLineHeight')\n  }, {\n    // require update\n    align: _('titleAlign')\n  });\n  !(0, _encodeUtil.addEncode)(encode, 'x', _('titleX'), 'update') && !horizontal && !(0, _encodeUtil.has)('x', userEncode) && (encode.enter.auto = {\n    value: true\n  });\n  !(0, _encodeUtil.addEncode)(encode, 'y', _('titleY'), 'update') && horizontal && !(0, _encodeUtil.has)('y', userEncode) && (encode.enter.auto = {\n    value: true\n  });\n  return (0, _guideMark.default)(_marktypes.TextMark, _roles.AxisTitleRole, _constants.GuideTitleStyle, null, dataRef, encode, userEncode);\n}\n},{\"./constants\":\"uZ05\",\"./guide-mark\":\"VfcM\",\"./guide-util\":\"XaVO\",\"../encode/encode-util\":\"sfJ8\",\"../marks/marktypes\":\"M2D5\",\"../marks/roles\":\"UXRt\",\"vega-util\":\"d61Z\"}],\"AMYo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axisConfig = _interopRequireDefault(require(\"./guides/axis-config\"));\n\nvar _axisDomain = _interopRequireDefault(require(\"./guides/axis-domain\"));\n\nvar _axisGrid = _interopRequireDefault(require(\"./guides/axis-grid\"));\n\nvar _axisTicks = _interopRequireDefault(require(\"./guides/axis-ticks\"));\n\nvar _axisLabels = _interopRequireDefault(require(\"./guides/axis-labels\"));\n\nvar _axisTitle = _interopRequireDefault(require(\"./guides/axis-title\"));\n\nvar _guideGroup = _interopRequireDefault(require(\"./guides/guide-group\"));\n\nvar _guideUtil = require(\"./guides/guide-util\");\n\nvar _roles = require(\"./marks/roles\");\n\nvar _mark = _interopRequireDefault(require(\"./mark\"));\n\nvar _encodeUtil = require(\"./encode/encode-util\");\n\nvar _constants = require(\"./guides/constants\");\n\nvar _util = require(\"../util\");\n\nvar _transforms = require(\"../transforms\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scope) {\n  var config = (0, _axisConfig.default)(spec, scope),\n      encode = spec.encode || {},\n      axisEncode = encode.axis || {},\n      name = axisEncode.name || undefined,\n      interactive = axisEncode.interactive,\n      style = axisEncode.style,\n      _ = (0, _guideUtil.lookup)(spec, config),\n      band = (0, _guideUtil.tickBand)(_),\n      datum,\n      dataRef,\n      ticksRef,\n      size,\n      group,\n      children; // single-element data source for axis group\n\n\n  datum = {\n    orient: spec.orient,\n    ticks: !!_('ticks'),\n    labels: !!_('labels'),\n    grid: !!_('grid'),\n    domain: !!_('domain'),\n    title: spec.title != null,\n    translate: _('translate')\n  };\n  dataRef = (0, _util.ref)(scope.add((0, _transforms.Collect)({}, [datum]))); // encoding properties for axis group item\n\n  axisEncode = (0, _encodeUtil.extendEncode)({\n    update: {\n      offset: (0, _encodeUtil.encoder)(_('offset') || 0),\n      position: (0, _encodeUtil.encoder)((0, _util.value)(spec.position, 0)),\n      titlePadding: (0, _encodeUtil.encoder)(_('titlePadding')),\n      minExtent: (0, _encodeUtil.encoder)(_('minExtent')),\n      maxExtent: (0, _encodeUtil.encoder)(_('maxExtent')),\n      range: {\n        signal: `abs(span(range(\"${spec.scale}\")))`\n      }\n    }\n  }, encode.axis, _constants.Skip); // data source for axis ticks\n\n  ticksRef = (0, _util.ref)(scope.add((0, _transforms.AxisTicks)({\n    scale: scope.scaleRef(spec.scale),\n    extra: scope.property(band.extra),\n    count: scope.objectProperty(spec.tickCount),\n    values: scope.objectProperty(spec.values),\n    minstep: scope.property(spec.tickMinStep),\n    formatType: scope.property(spec.formatType),\n    formatSpecifier: scope.property(spec.format)\n  }))); // generate axis marks\n\n  children = []; // include axis gridlines if requested\n\n  if (datum.grid) {\n    children.push((0, _axisGrid.default)(spec, config, encode.grid, ticksRef, band));\n  } // include axis ticks if requested\n\n\n  if (datum.ticks) {\n    size = _('tickSize');\n    children.push((0, _axisTicks.default)(spec, config, encode.ticks, ticksRef, size, band));\n  } // include axis labels if requested\n\n\n  if (datum.labels) {\n    size = datum.ticks ? size : 0;\n    children.push((0, _axisLabels.default)(spec, config, encode.labels, ticksRef, size, band));\n  } // include axis domain path if requested\n\n\n  if (datum.domain) {\n    children.push((0, _axisDomain.default)(spec, config, encode.domain, dataRef));\n  } // include axis title if defined\n\n\n  if (datum.title) {\n    children.push((0, _axisTitle.default)(spec, config, encode.title, dataRef));\n  } // build axis specification\n\n\n  group = (0, _guideGroup.default)(_roles.AxisRole, style, name, dataRef, interactive, axisEncode, children);\n  if (spec.zindex) group.zindex = spec.zindex; // parse axis specification\n\n  return (0, _mark.default)(group, scope);\n}\n},{\"./guides/axis-config\":\"NSQT\",\"./guides/axis-domain\":\"qUyd\",\"./guides/axis-grid\":\"HFqF\",\"./guides/axis-ticks\":\"fdqn\",\"./guides/axis-labels\":\"rbcm\",\"./guides/axis-title\":\"Xsho\",\"./guides/guide-group\":\"cARw\",\"./guides/guide-util\":\"XaVO\",\"./marks/roles\":\"UXRt\",\"./mark\":\"pD6s\",\"./encode/encode-util\":\"sfJ8\",\"./guides/constants\":\"uZ05\",\"../util\":\"bnG3\",\"../transforms\":\"VbKC\"}],\"c8Qn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _signalUpdates = _interopRequireDefault(require(\"./signal-updates\"));\n\nvar _scale = require(\"./scale\");\n\nvar _projection = _interopRequireDefault(require(\"./projection\"));\n\nvar _legend = _interopRequireDefault(require(\"./legend\"));\n\nvar _signal = _interopRequireDefault(require(\"./signal\"));\n\nvar _title = _interopRequireDefault(require(\"./title\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _mark = _interopRequireDefault(require(\"./mark\"));\n\nvar _axis = _interopRequireDefault(require(\"./axis\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, scope, preprocessed) {\n  var signals = (0, _vegaUtil.array)(spec.signals),\n      scales = (0, _vegaUtil.array)(spec.scales); // parse signal definitions, if not already preprocessed\n\n  if (!preprocessed) signals.forEach(_ => (0, _signal.default)(_, scope)); // parse cartographic projection definitions\n\n  (0, _vegaUtil.array)(spec.projections).forEach(_ => (0, _projection.default)(_, scope)); // initialize scale references\n\n  scales.forEach(_ => (0, _scale.initScale)(_, scope)); // parse data sources\n\n  (0, _vegaUtil.array)(spec.data).forEach(_ => (0, _data.default)(_, scope)); // parse scale definitions\n\n  scales.forEach(_ => (0, _scale.parseScale)(_, scope)); // parse signal updates\n\n  (preprocessed || signals).forEach(_ => (0, _signalUpdates.default)(_, scope)); // parse axis definitions\n\n  (0, _vegaUtil.array)(spec.axes).forEach(_ => (0, _axis.default)(_, scope)); // parse mark definitions\n\n  (0, _vegaUtil.array)(spec.marks).forEach(_ => (0, _mark.default)(_, scope)); // parse legend definitions\n\n  (0, _vegaUtil.array)(spec.legends).forEach(_ => (0, _legend.default)(_, scope)); // parse title, if defined\n\n  if (spec.title) (0, _title.default)(spec.title, scope); // parse collected lambda (anonymous) expressions\n\n  scope.parseLambdas();\n  return scope;\n}\n},{\"./signal-updates\":\"T55v\",\"./scale\":\"nGP3\",\"./projection\":\"zW5X\",\"./legend\":\"VuhQ\",\"./signal\":\"HWh1\",\"./title\":\"LSvE\",\"./data\":\"n1aF\",\"./mark\":\"pD6s\",\"./axis\":\"AMYo\",\"vega-util\":\"d61Z\"}],\"nQs9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parseView;\n\nvar _autosize = _interopRequireDefault(require(\"./autosize\"));\n\nvar _padding = _interopRequireDefault(require(\"./padding\"));\n\nvar _signal = _interopRequireDefault(require(\"./signal\"));\n\nvar _spec = _interopRequireDefault(require(\"./spec\"));\n\nvar _encodeUtil = require(\"./encode/encode-util\");\n\nvar _marktypes = require(\"./marks/marktypes\");\n\nvar _roles = require(\"./marks/roles\");\n\nvar _util = require(\"../util\");\n\nvar _DataScope = _interopRequireDefault(require(\"../DataScope\"));\n\nvar _transforms = require(\"../transforms\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar defined = (0, _vegaUtil.toSet)(['width', 'height', 'padding', 'autosize']);\n\nfunction parseView(spec, scope) {\n  var config = scope.config,\n      op,\n      input,\n      encode,\n      parent,\n      root,\n      signals;\n  scope.background = spec.background || config.background;\n  scope.eventConfig = config.events;\n  root = (0, _util.ref)(scope.root = scope.add((0, _util.operator)()));\n  scope.addSignal('width', spec.width || 0);\n  scope.addSignal('height', spec.height || 0);\n  scope.addSignal('padding', (0, _padding.default)(spec.padding, config));\n  scope.addSignal('autosize', (0, _autosize.default)(spec.autosize, config));\n  scope.legends = scope.objectProperty(config.legend && config.legend.layout); // parse signal definitions, including config entries\n\n  signals = addSignals(scope, spec.signals, config.signals); // Store root group item\n\n  input = scope.add((0, _transforms.Collect)()); // Encode root group item\n\n  encode = (0, _encodeUtil.extendEncode)({\n    enter: {\n      x: {\n        value: 0\n      },\n      y: {\n        value: 0\n      }\n    },\n    update: {\n      width: {\n        signal: 'width'\n      },\n      height: {\n        signal: 'height'\n      }\n    }\n  }, spec.encode);\n  encode = scope.add((0, _transforms.Encode)((0, _encodeUtil.encoders)(encode, _marktypes.GroupMark, _roles.FrameRole, spec.style, scope, {\n    pulse: (0, _util.ref)(input)\n  }))); // Perform view layout\n\n  parent = scope.add((0, _transforms.ViewLayout)({\n    layout: scope.objectProperty(spec.layout),\n    legends: scope.legends,\n    autosize: scope.signalRef('autosize'),\n    mark: root,\n    pulse: (0, _util.ref)(encode)\n  }));\n  scope.operators.pop(); // Parse remainder of specification\n\n  scope.pushState((0, _util.ref)(encode), (0, _util.ref)(parent), null);\n  (0, _spec.default)(spec, scope, signals);\n  scope.operators.push(parent); // Bound / render / sieve root item\n\n  op = scope.add((0, _transforms.Bound)({\n    mark: root,\n    pulse: (0, _util.ref)(parent)\n  }));\n  op = scope.add((0, _transforms.Render)({\n    pulse: (0, _util.ref)(op)\n  }));\n  op = scope.add((0, _transforms.Sieve)({\n    pulse: (0, _util.ref)(op)\n  })); // Track metadata for root item\n\n  scope.addData('root', new _DataScope.default(scope, input, input, op));\n  return scope;\n}\n\nfunction addSignals(scope, signals, config) {\n  // signals defined in the spec take priority\n  (0, _vegaUtil.array)(signals).forEach(_ => {\n    if (!defined[_.name]) (0, _signal.default)(_, scope);\n  });\n  if (!config) return signals;\n  const out = (0, _vegaUtil.array)(signals).slice(); // add config signals if not already defined\n\n  (0, _vegaUtil.array)(config).forEach(_ => {\n    if (!scope.hasOwnSignal(_.name)) {\n      (0, _signal.default)(_, scope);\n      out.push(_);\n    }\n  });\n  return out;\n}\n},{\"./autosize\":\"FFEQ\",\"./padding\":\"gaaC\",\"./signal\":\"HWh1\",\"./spec\":\"c8Qn\",\"./encode/encode-util\":\"sfJ8\",\"./marks/marktypes\":\"M2D5\",\"./marks/roles\":\"UXRt\",\"../util\":\"bnG3\",\"../DataScope\":\"rKjL\",\"../transforms\":\"VbKC\",\"vega-util\":\"d61Z\"}],\"Qfxt\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = Scope;\n\nvar _DataScope = _interopRequireDefault(require(\"./DataScope\"));\n\nvar _util = require(\"./util\");\n\nvar _expression = _interopRequireDefault(require(\"./parsers/expression\"));\n\nvar _transforms = require(\"./transforms\");\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Scope(config) {\n  this.config = config;\n  this.bindings = [];\n  this.field = {};\n  this.signals = {};\n  this.lambdas = {};\n  this.scales = {};\n  this.events = {};\n  this.data = {};\n  this.streams = [];\n  this.updates = [];\n  this.operators = [];\n  this.background = null;\n  this.eventConfig = null;\n  this._id = 0;\n  this._subid = 0;\n  this._nextsub = [0];\n  this._parent = [];\n  this._encode = [];\n  this._lookup = [];\n  this._markpath = [];\n}\n\nfunction Subscope(scope) {\n  this.config = scope.config;\n  this.legends = scope.legends;\n  this.field = Object.create(scope.field);\n  this.signals = Object.create(scope.signals);\n  this.lambdas = Object.create(scope.lambdas);\n  this.scales = Object.create(scope.scales);\n  this.events = Object.create(scope.events);\n  this.data = Object.create(scope.data);\n  this.streams = [];\n  this.updates = [];\n  this.operators = [];\n  this._id = 0;\n  this._subid = ++scope._nextsub[0];\n  this._nextsub = scope._nextsub;\n  this._parent = scope._parent.slice();\n  this._encode = scope._encode.slice();\n  this._lookup = scope._lookup.slice();\n  this._markpath = scope._markpath;\n}\n\nvar prototype = Scope.prototype = Subscope.prototype; // ----\n\nprototype.fork = function () {\n  return new Subscope(this);\n};\n\nprototype.isSubscope = function () {\n  return this._subid > 0;\n};\n\nprototype.toRuntime = function () {\n  this.finish();\n  return {\n    background: this.background,\n    operators: this.operators,\n    streams: this.streams,\n    updates: this.updates,\n    bindings: this.bindings,\n    eventConfig: this.eventConfig\n  };\n};\n\nprototype.id = function () {\n  return (this._subid ? this._subid + ':' : 0) + this._id++;\n};\n\nprototype.add = function (op) {\n  this.operators.push(op);\n  op.id = this.id(); // if pre-registration references exist, resolve them now\n\n  if (op.refs) {\n    op.refs.forEach(function (ref) {\n      ref.$ref = op.id;\n    });\n    op.refs = null;\n  }\n\n  return op;\n};\n\nprototype.proxy = function (op) {\n  var vref = op instanceof _util.Entry ? (0, _util.ref)(op) : op;\n  return this.add((0, _transforms.Proxy)({\n    value: vref\n  }));\n};\n\nprototype.addStream = function (stream) {\n  this.streams.push(stream);\n  stream.id = this.id();\n  return stream;\n};\n\nprototype.addUpdate = function (update) {\n  this.updates.push(update);\n  return update;\n}; // Apply metadata\n\n\nprototype.finish = function () {\n  var name, ds; // annotate root\n\n  if (this.root) this.root.root = true; // annotate signals\n\n  for (name in this.signals) {\n    this.signals[name].signal = name;\n  } // annotate scales\n\n\n  for (name in this.scales) {\n    this.scales[name].scale = name;\n  } // annotate data sets\n\n\n  function annotate(op, name, type) {\n    var data, list;\n\n    if (op) {\n      data = op.data || (op.data = {});\n      list = data[name] || (data[name] = []);\n      list.push(type);\n    }\n  }\n\n  for (name in this.data) {\n    ds = this.data[name];\n    annotate(ds.input, name, 'input');\n    annotate(ds.output, name, 'output');\n    annotate(ds.values, name, 'values');\n\n    for (var field in ds.index) {\n      annotate(ds.index[field], name, 'index:' + field);\n    }\n  }\n\n  return this;\n}; // ----\n\n\nprototype.pushState = function (encode, parent, lookup) {\n  this._encode.push((0, _util.ref)(this.add((0, _transforms.Sieve)({\n    pulse: encode\n  }))));\n\n  this._parent.push(parent);\n\n  this._lookup.push(lookup ? (0, _util.ref)(this.proxy(lookup)) : null);\n\n  this._markpath.push(-1);\n};\n\nprototype.popState = function () {\n  this._encode.pop();\n\n  this._parent.pop();\n\n  this._lookup.pop();\n\n  this._markpath.pop();\n};\n\nprototype.parent = function () {\n  return (0, _vegaUtil.peek)(this._parent);\n};\n\nprototype.encode = function () {\n  return (0, _vegaUtil.peek)(this._encode);\n};\n\nprototype.lookup = function () {\n  return (0, _vegaUtil.peek)(this._lookup);\n};\n\nprototype.markpath = function () {\n  var p = this._markpath;\n  return ++p[p.length - 1];\n}; // ----\n\n\nprototype.fieldRef = function (field, name) {\n  if ((0, _vegaUtil.isString)(field)) return (0, _util.fieldRef)(field, name);\n\n  if (!field.signal) {\n    (0, _vegaUtil.error)('Unsupported field reference: ' + (0, _vegaUtil.stringValue)(field));\n  }\n\n  var s = field.signal,\n      f = this.field[s],\n      params;\n\n  if (!f) {\n    params = {\n      name: this.signalRef(s)\n    };\n    if (name) params.as = name;\n    this.field[s] = f = (0, _util.ref)(this.add((0, _transforms.Field)(params)));\n  }\n\n  return f;\n};\n\nprototype.compareRef = function (cmp) {\n  function check(_) {\n    if ((0, _util.isSignal)(_)) {\n      signal = true;\n      return scope.signalRef(_.signal);\n    } else if ((0, _util.isExpr)(_)) {\n      signal = true;\n      return scope.exprRef(_.expr);\n    } else {\n      return _;\n    }\n  }\n\n  var scope = this,\n      signal = false,\n      fields = (0, _vegaUtil.array)(cmp.field).map(check),\n      orders = (0, _vegaUtil.array)(cmp.order).map(check);\n  return signal ? (0, _util.ref)(this.add((0, _transforms.Compare)({\n    fields: fields,\n    orders: orders\n  }))) : (0, _util.compareRef)(fields, orders);\n};\n\nprototype.keyRef = function (fields, flat) {\n  function check(_) {\n    if ((0, _util.isSignal)(_)) {\n      signal = true;\n      return (0, _util.ref)(sig[_.signal]);\n    } else {\n      return _;\n    }\n  }\n\n  var sig = this.signals,\n      signal = false;\n  fields = (0, _vegaUtil.array)(fields).map(check);\n  return signal ? (0, _util.ref)(this.add((0, _transforms.Key)({\n    fields: fields,\n    flat: flat\n  }))) : (0, _util.keyRef)(fields, flat);\n};\n\nprototype.sortRef = function (sort) {\n  if (!sort) return sort; // including id ensures stable sorting\n\n  var a = (0, _util.aggrField)(sort.op, sort.field),\n      o = sort.order || _util.Ascending;\n  return o.signal ? (0, _util.ref)(this.add((0, _transforms.Compare)({\n    fields: a,\n    orders: this.signalRef(o.signal)\n  }))) : (0, _util.compareRef)(a, o);\n}; // ----\n\n\nprototype.event = function (source, type) {\n  var key = source + ':' + type;\n\n  if (!this.events[key]) {\n    var id = this.id();\n    this.streams.push({\n      id: id,\n      source: source,\n      type: type\n    });\n    this.events[key] = id;\n  }\n\n  return this.events[key];\n}; // ----\n\n\nprototype.hasOwnSignal = function (name) {\n  return (0, _vegaUtil.hasOwnProperty)(this.signals, name);\n};\n\nprototype.addSignal = function (name, value) {\n  if (this.hasOwnSignal(name)) {\n    (0, _vegaUtil.error)('Duplicate signal name: ' + (0, _vegaUtil.stringValue)(name));\n  }\n\n  var op = value instanceof _util.Entry ? value : this.add((0, _util.operator)(value));\n  return this.signals[name] = op;\n};\n\nprototype.getSignal = function (name) {\n  if (!this.signals[name]) {\n    (0, _vegaUtil.error)('Unrecognized signal name: ' + (0, _vegaUtil.stringValue)(name));\n  }\n\n  return this.signals[name];\n};\n\nprototype.signalRef = function (s) {\n  if (this.signals[s]) {\n    return (0, _util.ref)(this.signals[s]);\n  } else if (!(0, _vegaUtil.hasOwnProperty)(this.lambdas, s)) {\n    this.lambdas[s] = this.add((0, _util.operator)(null));\n  }\n\n  return (0, _util.ref)(this.lambdas[s]);\n};\n\nprototype.parseLambdas = function () {\n  var code = Object.keys(this.lambdas);\n\n  for (var i = 0, n = code.length; i < n; ++i) {\n    var s = code[i],\n        e = (0, _expression.default)(s, this),\n        op = this.lambdas[s];\n    op.params = e.$params;\n    op.update = e.$expr;\n  }\n};\n\nprototype.property = function (spec) {\n  return spec && spec.signal ? this.signalRef(spec.signal) : spec;\n};\n\nprototype.objectProperty = function (spec) {\n  return !spec || !(0, _vegaUtil.isObject)(spec) ? spec : this.signalRef(spec.signal || propertyLambda(spec));\n};\n\nfunction propertyLambda(spec) {\n  return ((0, _vegaUtil.isArray)(spec) ? arrayLambda : objectLambda)(spec);\n}\n\nfunction arrayLambda(array) {\n  var code = '[',\n      i = 0,\n      n = array.length,\n      value;\n\n  for (; i < n; ++i) {\n    value = array[i];\n    code += (i > 0 ? ',' : '') + ((0, _vegaUtil.isObject)(value) ? value.signal || propertyLambda(value) : (0, _vegaUtil.stringValue)(value));\n  }\n\n  return code + ']';\n}\n\nfunction objectLambda(obj) {\n  var code = '{',\n      i = 0,\n      key,\n      value;\n\n  for (key in obj) {\n    value = obj[key];\n    code += (++i > 1 ? ',' : '') + (0, _vegaUtil.stringValue)(key) + ':' + ((0, _vegaUtil.isObject)(value) ? value.signal || propertyLambda(value) : (0, _vegaUtil.stringValue)(value));\n  }\n\n  return code + '}';\n}\n\nprototype.exprRef = function (code, name) {\n  var params = {\n    expr: (0, _expression.default)(code, this)\n  };\n  if (name) params.expr.$name = name;\n  return (0, _util.ref)(this.add((0, _transforms.Expression)(params)));\n};\n\nprototype.addBinding = function (name, bind) {\n  if (!this.bindings) {\n    (0, _vegaUtil.error)('Nested signals do not support binding: ' + (0, _vegaUtil.stringValue)(name));\n  }\n\n  this.bindings.push((0, _vegaUtil.extend)({\n    signal: name\n  }, bind));\n}; // ----\n\n\nprototype.addScaleProj = function (name, transform) {\n  if ((0, _vegaUtil.hasOwnProperty)(this.scales, name)) {\n    (0, _vegaUtil.error)('Duplicate scale or projection name: ' + (0, _vegaUtil.stringValue)(name));\n  }\n\n  this.scales[name] = this.add(transform);\n};\n\nprototype.addScale = function (name, params) {\n  this.addScaleProj(name, (0, _transforms.Scale)(params));\n};\n\nprototype.addProjection = function (name, params) {\n  this.addScaleProj(name, (0, _transforms.Projection)(params));\n};\n\nprototype.getScale = function (name) {\n  if (!this.scales[name]) {\n    (0, _vegaUtil.error)('Unrecognized scale name: ' + (0, _vegaUtil.stringValue)(name));\n  }\n\n  return this.scales[name];\n};\n\nprototype.projectionRef = prototype.scaleRef = function (name) {\n  return (0, _util.ref)(this.getScale(name));\n};\n\nprototype.projectionType = prototype.scaleType = function (name) {\n  return this.getScale(name).params.type;\n}; // ----\n\n\nprototype.addData = function (name, dataScope) {\n  if ((0, _vegaUtil.hasOwnProperty)(this.data, name)) {\n    (0, _vegaUtil.error)('Duplicate data set name: ' + (0, _vegaUtil.stringValue)(name));\n  }\n\n  return this.data[name] = dataScope;\n};\n\nprototype.getData = function (name) {\n  if (!this.data[name]) {\n    (0, _vegaUtil.error)('Undefined data set name: ' + (0, _vegaUtil.stringValue)(name));\n  }\n\n  return this.data[name];\n};\n\nprototype.addDataPipeline = function (name, entries) {\n  if ((0, _vegaUtil.hasOwnProperty)(this.data, name)) {\n    (0, _vegaUtil.error)('Duplicate data set name: ' + (0, _vegaUtil.stringValue)(name));\n  }\n\n  return this.addData(name, _DataScope.default.fromEntries(this, entries));\n};\n},{\"./DataScope\":\"rKjL\",\"./util\":\"bnG3\",\"./parsers/expression\":\"TGrP\",\"./transforms\":\"VbKC\",\"vega-util\":\"d61Z\"}],\"oxvw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nvar defaultFont = 'sans-serif',\n    defaultSymbolSize = 30,\n    defaultStrokeWidth = 2,\n    defaultColor = '#4c78a8',\n    black = '#000',\n    gray = '#888',\n    lightGray = '#ddd';\n/**\n * Standard configuration defaults for Vega specification parsing.\n * Users can provide their own (sub-)set of these default values\n * by passing in a config object to the top-level parse method.\n */\n\nfunction _default() {\n  return {\n    // default padding around visualization\n    padding: 0,\n    // default for automatic sizing; options: 'none', 'pad', 'fit'\n    // or provide an object (e.g., {'type': 'pad', 'resize': true})\n    autosize: 'pad',\n    // default view background color\n    // covers the entire view component\n    background: null,\n    // default event handling configuration\n    // preventDefault for view-sourced event types except 'wheel'\n    events: {\n      defaults: {\n        allow: ['wheel']\n      }\n    },\n    // defaults for top-level group marks\n    // accepts mark properties (fill, stroke, etc)\n    // covers the data rectangle within group width/height\n    group: null,\n    // defaults for basic mark types\n    // each subset accepts mark properties (fill, stroke, etc)\n    mark: null,\n    arc: {\n      fill: defaultColor\n    },\n    area: {\n      fill: defaultColor\n    },\n    image: null,\n    line: {\n      stroke: defaultColor,\n      strokeWidth: defaultStrokeWidth\n    },\n    path: {\n      stroke: defaultColor\n    },\n    rect: {\n      fill: defaultColor\n    },\n    rule: {\n      stroke: black\n    },\n    shape: {\n      stroke: defaultColor\n    },\n    symbol: {\n      fill: defaultColor,\n      size: 64\n    },\n    text: {\n      fill: black,\n      font: defaultFont,\n      fontSize: 11\n    },\n    // style definitions\n    style: {\n      // axis & legend labels\n      'guide-label': {\n        fill: black,\n        font: defaultFont,\n        fontSize: 10\n      },\n      // axis & legend titles\n      'guide-title': {\n        fill: black,\n        font: defaultFont,\n        fontSize: 11,\n        fontWeight: 'bold'\n      },\n      // headers, including chart title\n      'group-title': {\n        fill: black,\n        font: defaultFont,\n        fontSize: 13,\n        fontWeight: 'bold'\n      },\n      // chart subtitle\n      'group-subtitle': {\n        fill: black,\n        font: defaultFont,\n        fontSize: 12\n      },\n      // defaults for styled point marks in Vega-Lite\n      point: {\n        size: defaultSymbolSize,\n        strokeWidth: defaultStrokeWidth,\n        shape: 'circle'\n      },\n      circle: {\n        size: defaultSymbolSize,\n        strokeWidth: defaultStrokeWidth\n      },\n      square: {\n        size: defaultSymbolSize,\n        strokeWidth: defaultStrokeWidth,\n        shape: 'square'\n      },\n      // defaults for styled group marks in Vega-Lite\n      cell: {\n        fill: 'transparent',\n        stroke: lightGray\n      }\n    },\n    // defaults for title\n    title: {\n      orient: 'top',\n      anchor: 'middle',\n      offset: 4,\n      subtitlePadding: 3\n    },\n    // defaults for axes\n    axis: {\n      minExtent: 0,\n      maxExtent: 200,\n      bandPosition: 0.5,\n      domain: true,\n      domainWidth: 1,\n      domainColor: gray,\n      grid: false,\n      gridWidth: 1,\n      gridColor: lightGray,\n      labels: true,\n      labelAngle: 0,\n      labelLimit: 180,\n      labelPadding: 2,\n      ticks: true,\n      tickColor: gray,\n      tickOffset: 0,\n      tickRound: true,\n      tickSize: 5,\n      tickWidth: 1,\n      titlePadding: 4\n    },\n    // correction for centering bias\n    axisBand: {\n      tickOffset: -0.5\n    },\n    // defaults for cartographic projection\n    projection: {\n      type: 'mercator'\n    },\n    // defaults for legends\n    legend: {\n      orient: 'right',\n      padding: 0,\n      gridAlign: 'each',\n      columnPadding: 10,\n      rowPadding: 2,\n      symbolDirection: 'vertical',\n      gradientDirection: 'vertical',\n      gradientLength: 200,\n      gradientThickness: 16,\n      gradientStrokeColor: lightGray,\n      gradientStrokeWidth: 0,\n      gradientLabelOffset: 2,\n      labelAlign: 'left',\n      labelBaseline: 'middle',\n      labelLimit: 160,\n      labelOffset: 4,\n      labelOverlap: true,\n      symbolLimit: 30,\n      symbolType: 'circle',\n      symbolSize: 100,\n      symbolOffset: 0,\n      symbolStrokeWidth: 1.5,\n      symbolBaseFillColor: 'transparent',\n      symbolBaseStrokeColor: gray,\n      titleLimit: 180,\n      titleOrient: 'top',\n      titlePadding: 5,\n      layout: {\n        offset: 18,\n        direction: 'horizontal',\n        left: {\n          direction: 'vertical'\n        },\n        right: {\n          direction: 'vertical'\n        }\n      }\n    },\n    // defaults for scale ranges\n    range: {\n      category: {\n        scheme: 'tableau10'\n      },\n      ordinal: {\n        scheme: 'blues'\n      },\n      heatmap: {\n        scheme: 'yellowgreenblue'\n      },\n      ramp: {\n        scheme: 'blues'\n      },\n      diverging: {\n        scheme: 'blueorange',\n        extent: [1, 0]\n      },\n      symbol: ['circle', 'square', 'triangle-up', 'cross', 'diamond', 'triangle-right', 'triangle-down', 'triangle-left']\n    }\n  };\n}\n},{}],\"sCWC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _view = _interopRequireDefault(require(\"./parsers/view\"));\n\nvar _Scope = _interopRequireDefault(require(\"./Scope\"));\n\nvar _config = _interopRequireDefault(require(\"./config\"));\n\nvar _vegaUtil = require(\"vega-util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _default(spec, config) {\n  if (!(0, _vegaUtil.isObject)(spec)) {\n    (0, _vegaUtil.error)('Input Vega specification must be an object.');\n  }\n\n  config = (0, _vegaUtil.mergeConfig)((0, _config.default)(), config, spec.config);\n  return (0, _view.default)(spec, new _Scope.default(config)).toRuntime();\n}\n},{\"./parsers/view\":\"nQs9\",\"./Scope\":\"Qfxt\",\"./config\":\"oxvw\",\"vega-util\":\"d61Z\"}],\"nJiA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"parse\", {\n  enumerable: true,\n  get: function () {\n    return _parse.default;\n  }\n});\nObject.defineProperty(exports, \"config\", {\n  enumerable: true,\n  get: function () {\n    return _config.default;\n  }\n});\nObject.defineProperty(exports, \"signal\", {\n  enumerable: true,\n  get: function () {\n    return _signal.default;\n  }\n});\nObject.defineProperty(exports, \"signalUpdates\", {\n  enumerable: true,\n  get: function () {\n    return _signalUpdates.default;\n  }\n});\nObject.defineProperty(exports, \"stream\", {\n  enumerable: true,\n  get: function () {\n    return _stream.default;\n  }\n});\nObject.defineProperty(exports, \"MarkRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.MarkRole;\n  }\n});\nObject.defineProperty(exports, \"FrameRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.FrameRole;\n  }\n});\nObject.defineProperty(exports, \"ScopeRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.ScopeRole;\n  }\n});\nObject.defineProperty(exports, \"AxisRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.AxisRole;\n  }\n});\nObject.defineProperty(exports, \"AxisDomainRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.AxisDomainRole;\n  }\n});\nObject.defineProperty(exports, \"AxisGridRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.AxisGridRole;\n  }\n});\nObject.defineProperty(exports, \"AxisLabelRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.AxisLabelRole;\n  }\n});\nObject.defineProperty(exports, \"AxisTickRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.AxisTickRole;\n  }\n});\nObject.defineProperty(exports, \"AxisTitleRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.AxisTitleRole;\n  }\n});\nObject.defineProperty(exports, \"LegendRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.LegendRole;\n  }\n});\nObject.defineProperty(exports, \"LegendEntryRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.LegendEntryRole;\n  }\n});\nObject.defineProperty(exports, \"LegendLabelRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.LegendLabelRole;\n  }\n});\nObject.defineProperty(exports, \"LegendSymbolRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.LegendSymbolRole;\n  }\n});\nObject.defineProperty(exports, \"LegendTitleRole\", {\n  enumerable: true,\n  get: function () {\n    return _roles.LegendTitleRole;\n  }\n});\nObject.defineProperty(exports, \"Scope\", {\n  enumerable: true,\n  get: function () {\n    return _Scope.default;\n  }\n});\nObject.defineProperty(exports, \"DataScope\", {\n  enumerable: true,\n  get: function () {\n    return _DataScope.default;\n  }\n});\n\nvar _parse = _interopRequireDefault(require(\"./src/parse\"));\n\nvar _config = _interopRequireDefault(require(\"./src/config\"));\n\nvar _signal = _interopRequireDefault(require(\"./src/parsers/signal\"));\n\nvar _signalUpdates = _interopRequireDefault(require(\"./src/parsers/signal-updates\"));\n\nvar _stream = _interopRequireDefault(require(\"./src/parsers/stream\"));\n\nvar _roles = require(\"./src/parsers/marks/roles\");\n\nvar _Scope = _interopRequireDefault(require(\"./src/Scope\"));\n\nvar _DataScope = _interopRequireDefault(require(\"./src/DataScope\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n},{\"./src/parse\":\"sCWC\",\"./src/config\":\"oxvw\",\"./src/parsers/signal\":\"HWh1\",\"./src/parsers/signal-updates\":\"T55v\",\"./src/parsers/stream\":\"aoay\",\"./src/parsers/marks/roles\":\"UXRt\",\"./src/Scope\":\"Qfxt\",\"./src/DataScope\":\"rKjL\"}],\"k1MM\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar _exportNames = {\n  Dataflow: true,\n  EventStream: true,\n  Parameters: true,\n  Pulse: true,\n  MultiPulse: true,\n  Operator: true,\n  Transform: true,\n  changeset: true,\n  ingest: true,\n  isTuple: true,\n  definition: true,\n  transform: true,\n  transforms: true,\n  tupleid: true,\n  version: true,\n  scale: true,\n  scheme: true,\n  interpolate: true,\n  interpolateColors: true,\n  interpolateRange: true,\n  quantizeInterpolator: true,\n  projection: true,\n  View: true,\n  expressionFunction: true,\n  formatLocale: true,\n  timeFormatLocale: true,\n  parse: true,\n  runtime: true,\n  runtimeContext: true\n};\nObject.defineProperty(exports, \"Dataflow\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.Dataflow;\n  }\n});\nObject.defineProperty(exports, \"EventStream\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.EventStream;\n  }\n});\nObject.defineProperty(exports, \"Parameters\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.Parameters;\n  }\n});\nObject.defineProperty(exports, \"Pulse\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.Pulse;\n  }\n});\nObject.defineProperty(exports, \"MultiPulse\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.MultiPulse;\n  }\n});\nObject.defineProperty(exports, \"Operator\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.Operator;\n  }\n});\nObject.defineProperty(exports, \"Transform\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.Transform;\n  }\n});\nObject.defineProperty(exports, \"changeset\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.changeset;\n  }\n});\nObject.defineProperty(exports, \"ingest\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.ingest;\n  }\n});\nObject.defineProperty(exports, \"isTuple\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.isTuple;\n  }\n});\nObject.defineProperty(exports, \"definition\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.definition;\n  }\n});\nObject.defineProperty(exports, \"transform\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.transform;\n  }\n});\nObject.defineProperty(exports, \"transforms\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.transforms;\n  }\n});\nObject.defineProperty(exports, \"tupleid\", {\n  enumerable: true,\n  get: function () {\n    return _vegaDataflow.tupleid;\n  }\n});\nObject.defineProperty(exports, \"version\", {\n  enumerable: true,\n  get: function () {\n    return _package.version;\n  }\n});\nObject.defineProperty(exports, \"scale\", {\n  enumerable: true,\n  get: function () {\n    return _vegaScale.scale;\n  }\n});\nObject.defineProperty(exports, \"scheme\", {\n  enumerable: true,\n  get: function () {\n    return _vegaScale.scheme;\n  }\n});\nObject.defineProperty(exports, \"interpolate\", {\n  enumerable: true,\n  get: function () {\n    return _vegaScale.interpolate;\n  }\n});\nObject.defineProperty(exports, \"interpolateColors\", {\n  enumerable: true,\n  get: function () {\n    return _vegaScale.interpolateColors;\n  }\n});\nObject.defineProperty(exports, \"interpolateRange\", {\n  enumerable: true,\n  get: function () {\n    return _vegaScale.interpolateRange;\n  }\n});\nObject.defineProperty(exports, \"quantizeInterpolator\", {\n  enumerable: true,\n  get: function () {\n    return _vegaScale.quantizeInterpolator;\n  }\n});\nObject.defineProperty(exports, \"projection\", {\n  enumerable: true,\n  get: function () {\n    return _vegaProjection.projection;\n  }\n});\nObject.defineProperty(exports, \"View\", {\n  enumerable: true,\n  get: function () {\n    return _vegaView.View;\n  }\n});\nObject.defineProperty(exports, \"expressionFunction\", {\n  enumerable: true,\n  get: function () {\n    return _vegaFunctions.expressionFunction;\n  }\n});\nObject.defineProperty(exports, \"formatLocale\", {\n  enumerable: true,\n  get: function () {\n    return _vegaFunctions.formatLocale;\n  }\n});\nObject.defineProperty(exports, \"timeFormatLocale\", {\n  enumerable: true,\n  get: function () {\n    return _vegaFunctions.timeFormatLocale;\n  }\n});\nObject.defineProperty(exports, \"parse\", {\n  enumerable: true,\n  get: function () {\n    return _vegaParser.parse;\n  }\n});\nObject.defineProperty(exports, \"runtime\", {\n  enumerable: true,\n  get: function () {\n    return _vegaRuntime.parse;\n  }\n});\nObject.defineProperty(exports, \"runtimeContext\", {\n  enumerable: true,\n  get: function () {\n    return _vegaRuntime.context;\n  }\n});\n\nvar _vegaUtil = require(\"vega-util\");\n\nObject.keys(_vegaUtil).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _vegaUtil[key];\n    }\n  });\n});\n\nvar _vegaDataflow = require(\"vega-dataflow\");\n\nvar tx = _interopRequireWildcard(require(\"vega-transforms\"));\n\nvar vtx = _interopRequireWildcard(require(\"vega-view-transforms\"));\n\nvar encode = _interopRequireWildcard(require(\"vega-encode\"));\n\nvar geo = _interopRequireWildcard(require(\"vega-geo\"));\n\nvar force = _interopRequireWildcard(require(\"vega-force\"));\n\nvar tree = _interopRequireWildcard(require(\"vega-hierarchy\"));\n\nvar reg = _interopRequireWildcard(require(\"vega-regression\"));\n\nvar voronoi = _interopRequireWildcard(require(\"vega-voronoi\"));\n\nvar wordcloud = _interopRequireWildcard(require(\"vega-wordcloud\"));\n\nvar xf = _interopRequireWildcard(require(\"vega-crossfilter\"));\n\nvar _package = require(\"./package.json\");\n\nvar _vegaStatistics = require(\"vega-statistics\");\n\nObject.keys(_vegaStatistics).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _vegaStatistics[key];\n    }\n  });\n});\n\nvar _vegaTime = require(\"vega-time\");\n\nObject.keys(_vegaTime).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _vegaTime[key];\n    }\n  });\n});\n\nvar _vegaLoader = require(\"vega-loader\");\n\nObject.keys(_vegaLoader).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _vegaLoader[key];\n    }\n  });\n});\n\nvar _vegaScenegraph = require(\"vega-scenegraph\");\n\nObject.keys(_vegaScenegraph).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _vegaScenegraph[key];\n    }\n  });\n});\n\nvar _vegaScale = require(\"vega-scale\");\n\nvar _vegaProjection = require(\"vega-projection\");\n\nvar _vegaView = require(\"vega-view\");\n\nvar _vegaFunctions = require(\"vega-functions\");\n\nvar _vegaParser = require(\"vega-parser\");\n\nvar _vegaRuntime = require(\"vega-runtime\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// -- Transforms -----\n(0, _vegaUtil.extend)(_vegaDataflow.transforms, tx, vtx, encode, geo, force, tree, reg, voronoi, wordcloud, xf); // -- Exports -----\n},{\"vega-util\":\"d61Z\",\"vega-dataflow\":\"luN0\",\"vega-transforms\":\"hbKl\",\"vega-view-transforms\":\"VlWy\",\"vega-encode\":\"AlcT\",\"vega-geo\":\"pBvZ\",\"vega-force\":\"HxNv\",\"vega-hierarchy\":\"FSAY\",\"vega-regression\":\"c6kG\",\"vega-voronoi\":\"Ys7f\",\"vega-wordcloud\":\"R2bD\",\"vega-crossfilter\":\"g8BK\",\"./package.json\":\"tKoW\",\"vega-statistics\":\"Cvi0\",\"vega-time\":\"ErfR\",\"vega-loader\":\"ELDD\",\"vega-scenegraph\":\"AgKg\",\"vega-scale\":\"N8iK\",\"vega-projection\":\"WpLm\",\"vega-view\":\"YdL8\",\"vega-functions\":\"FrXC\",\"vega-parser\":\"nJiA\",\"vega-runtime\":\"R9ZC\"}],\"RaLA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ColorScaleNone = exports.Other = exports.BarChartSignalNames = exports.BarChartScaleNames = exports.SignalNames = exports.ScaleNames = exports.DataNames = exports.FieldNames = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst FieldNames = {\n  Active: '__SandDance__Active',\n  Collapsed: '__SandDance__Collapsed',\n  Selected: '__SandDance__Selected',\n  Top: '__SandDance__Top',\n  TopIndex: '__SandDance__TopIndex',\n  Index: '__SandDance__Index',\n  PowerBISelectionId: '__SandDance__PowerBISelectionId',\n  BarChartBin0: '__SandDance__BarChartBin0',\n  BarChartBin1: '__SandDance__BarChartBin1',\n  BarChartStack0: '__SandDance__BarChartStack0',\n  BarChartStack1: '__SandDance__BarChartStack1',\n  DensityCount: '__SandDance__DensityCount',\n  DensityRow: '__SandDance__DensityRow',\n  DensityXBin0: '__SandDance__DensityXBin0',\n  DensityXBin1: '__SandDance__DensityXBin1',\n  DensityYBin0: '__SandDance__DensityYBin0',\n  DensityYBin1: '__SandDance__DensityYBin1',\n  FacetBin0: '__SandDance__FacetBin0',\n  FacetBin1: '__SandDance__FacetBin1',\n  GridIndex: '__SandDance__GridIndex',\n  StacksLatBin0: '__SandDance__StacksLatBin0',\n  StacksLatBin1: '__SandDance__StacksLatBin1',\n  StacksLongBin0: '__SandDance__StacksLongBin0',\n  StacksLongBin1: '__SandDance__StacksLongBin1',\n  StacksStart: '__SandDance__StacksStart',\n  StacksEnd: '__SandDance__StacksEnd',\n  TreemapStackChildren: '__SandDance__TreemapStackChildren',\n  TreemapStackDepth: '__SandDance__TreemapStackDepth',\n  TreemapStackX0: '__SandDance__TreemapStackX0',\n  TreemapStackX1: '__SandDance__TreemapStackX1',\n  TreemapStackY0: '__SandDance__TreemapStackY0',\n  TreemapStackY1: '__SandDance__TreemapStackY1'\n};\nexports.FieldNames = FieldNames;\nconst DataNames = {\n  Pre: 'PreData',\n  Main: 'MainData',\n  EmptyBin: 'EmptyBinsData',\n  TopLookup: 'TopData',\n  Legend: 'LegendData',\n  FacetGroupCell: 'FacetGroupCellData',\n  FacetCellTitles: 'FacetCellTitlesData',\n  QuantitativeData: 'QuantitativeData'\n};\nexports.DataNames = DataNames;\nconst ScaleNames = {\n  Color: 'ColorScale',\n  X: 'MainXScale',\n  Y: 'MainYScale',\n  Z: 'MainZScale'\n}; //Signal names\n\nexports.ScaleNames = ScaleNames;\nconst SignalNames = {\n  ColorBinCount: 'RoleColor_BinCountSignal',\n  ColorReverse: 'RoleColor_ReverseSignal',\n  FacetColumns: 'RoleFacet_ColumnsSignal',\n  FacetRows: 'RoleFacet_RowsSignal',\n  InnerPadding: 'Chart_InnerPadding',\n  OuterPadding: 'Chart_OuterPadding',\n  MarkOpacity: 'Mark_OpacitySignal',\n  PointSize: 'Chart_PointSizeSignal',\n  TextAngleX: 'Text_AngleXSignal',\n  TextAngleY: 'Text_AngleYSignal',\n  TextScale: 'Text_ScaleSignal',\n  TextSize: 'Text_SizeSignal',\n  TextTitleSize: 'Text_TitleSizeSignal',\n  TreeMapMethod: 'Chart_TreeMapMethodSignal',\n  XDomain: 'RoleX_DomainSignal',\n  XBins: 'RoleX_BinsSignal',\n  XGridSize: 'Chart_XGridSize',\n  YBins: 'RoleY_BinsSignal',\n  YDomain: 'RoleY_DomainSignal',\n  YGridSize: 'Chart_YGridSize',\n  ZHeight: 'RoleZ_HeightSignal',\n  ZProportion: 'RoleZ_ProportionSignal'\n};\nexports.SignalNames = SignalNames;\nconst BarChartScaleNames = {\n  bucketScale: 'bucketScale',\n  levelScale: 'levelScale',\n  compartmentScale: 'compartmentScale'\n};\nexports.BarChartScaleNames = BarChartScaleNames;\nconst BarChartSignalNames = {\n  aspectRatioSignal: 'aspectRatioSignal',\n  compartmentsPerLevelSignal: 'compartmentsPerLevelSignal',\n  compartmentHeightSignal: 'compartmentHeightSignal',\n  compartmentWidthSignal: 'compartmentWidthSignal',\n  levelExtentSignal: 'levelExtentSignal',\n  quantitativeBinSignal: 'quantitativeBinSignal'\n}; //These are special formulaic data values\n\nexports.BarChartSignalNames = BarChartSignalNames;\nconst Other = '__Other'; //name of the \"no-color\" palette\n\nexports.Other = Other;\nconst ColorScaleNone = 'none';\nexports.ColorScaleNone = ColorScaleNone;\n},{}],\"Etci\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"ColorScaleNone\", {\n  enumerable: true,\n  get: function () {\n    return _constants.ColorScaleNone;\n  }\n});\nObject.defineProperty(exports, \"FieldNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.FieldNames;\n  }\n});\nObject.defineProperty(exports, \"ScaleNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.ScaleNames;\n  }\n});\nObject.defineProperty(exports, \"SignalNames\", {\n  enumerable: true,\n  get: function () {\n    return _constants.SignalNames;\n  }\n});\n\nvar _constants = require(\"./specs/constants\");\n},{\"./specs/constants\":\"RaLA\"}],\"JGSZ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isSearchExpressionGroup = isSearchExpressionGroup;\nexports.createGroupFromExpression = createGroupFromExpression;\nexports.ensureSearchExpressionGroupArray = ensureSearchExpressionGroupArray;\n\nfunction isSearchExpressionGroup(search) {\n  if (!search) {\n    return false;\n  }\n\n  return !!search.expressions;\n}\n\nfunction createGroupFromExpression(input) {\n  const output = {\n    expressions: [input]\n  };\n  return output;\n}\n\nfunction ensureSearchExpressionGroupArray(search) {\n  if (Array.isArray(search)) {\n    return [...search];\n  } else if (isSearchExpressionGroup(search)) {\n    return [search];\n  } else {\n    return [createGroupFromExpression(search)];\n  }\n}\n},{}],\"d1q6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.compareExpression = compareExpression;\nexports.compareGroup = compareGroup;\nexports.compare = compare;\nexports.startsWith = startsWith;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst expressionKeys = Object.keys({\n  clause: null,\n  name: null,\n  operator: null,\n  value: null\n});\n\nfunction compareExpression(a, b) {\n  if (a && b) {\n    for (let k = 0; k < expressionKeys.length; k++) {\n      let key = expressionKeys[k];\n      if (a[key] != b[key]) return false;\n    }\n  } else {\n    return !a && !b;\n  }\n\n  return true;\n}\n\nconst groupKeys = Object.keys({\n  clause: null\n});\n\nfunction compareGroup(a, b) {\n  for (let k = 0; k < groupKeys.length; k++) {\n    let key = groupKeys[k];\n    if (a[key] != b[key]) return false;\n  }\n\n  if (a.expressions.length != b.expressions.length) return false;\n\n  for (let i = 0; i < a.expressions.length; i++) {\n    if (!compareExpression(a.expressions[i], b.expressions[i])) return false;\n  }\n\n  return true;\n}\n\nfunction compare(a, b) {\n  if (a == b) return true;\n  if (!a || !b) return false;\n  let arrs = [a, b].map(_group.ensureSearchExpressionGroupArray);\n  let [arrA, arrB] = arrs;\n  if (arrA.length != arrB.length) return false;\n\n  for (let i = 0; i < arrA.length; i++) {\n    if (!compareGroup(arrA[i], arrB[i])) return false;\n  }\n\n  return true;\n}\n\nfunction startsWith(whole, part) {\n  if (!part) return true;\n  let arrs = [whole, part].map(_group.ensureSearchExpressionGroupArray);\n  let [wholeArray, partArray] = arrs;\n  if (partArray.length > wholeArray.length) return false;\n\n  for (let i = 0; i < partArray.length; i++) {\n    if (!compareGroup(wholeArray[i], partArray[i])) return false;\n  }\n\n  return true;\n}\n},{\"./group\":\"JGSZ\"}],\"EK6I\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.invert = invert;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction invertSearchExpressionGroup(input) {\n  //this only works if all expressions in this group have the same clause\n  const output = {\n    expressions: input.expressions.map(invertSearchExpression)\n  };\n\n  if (input.clause) {\n    output.clause = invertedClauses[input.clause];\n  }\n\n  return output;\n}\n\nconst invertedOperators = {\n  '!=': '==',\n  '==': '!=',\n  '<': '>=',\n  '>=': '<',\n  '<=': '>',\n  '>': '<=',\n  '!contains': 'contains',\n  'contains': '!contains',\n  '!isnullorEmpty': 'isnullorEmpty',\n  'isnullorEmpty': '!isnullorEmpty',\n  '!starts': 'starts',\n  'starts': '!starts'\n};\nconst invertedClauses = {\n  '&&': '||',\n  '||': '&&'\n};\n\nfunction invertSearchExpression(input) {\n  const operator = invertedOperators[input.operator];\n  const output = Object.assign(Object.assign({}, input), {\n    operator\n  });\n\n  if (input.clause) {\n    output.clause = invertedClauses[input.clause];\n  }\n\n  return output;\n}\n\nfunction invert(search) {\n  if (Array.isArray(search)) {\n    return search.map(invertSearchExpressionGroup);\n  } else if ((0, _group.isSearchExpressionGroup)(search)) {\n    return invertSearchExpressionGroup(search);\n  } else {\n    return invertSearchExpression(search);\n  }\n}\n},{\"./group\":\"JGSZ\"}],\"nUXz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.narrow = narrow;\n\nvar _group = require(\"./group\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction narrow(a, b) {\n  if (!a) {\n    return b;\n  }\n\n  let arrs = [a, b].map(_group.ensureSearchExpressionGroupArray);\n  let [arrA, arrB] = arrs;\n  arrB[0].clause = '&&';\n  return arrA.concat(arrB);\n}\n},{\"./group\":\"JGSZ\"}],\"tJXz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _compare = require(\"./compare\");\n\nObject.keys(_compare).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _compare[key];\n    }\n  });\n});\n\nvar _invert = require(\"./invert\");\n\nObject.keys(_invert).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _invert[key];\n    }\n  });\n});\n\nvar _narrow = require(\"./narrow\");\n\nObject.keys(_narrow).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _narrow[key];\n    }\n  });\n});\n},{\"./compare\":\"d1q6\",\"./invert\":\"EK6I\",\"./narrow\":\"nUXz\"}],\"dUjJ\":[function(require,module,exports) {\n\n},{}],\"Rva7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.layerNames = exports.GL_ORDINAL = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst GL_ORDINAL = 'GL_ORDINAL';\nexports.GL_ORDINAL = GL_ORDINAL;\nconst layerNames = {\n  cubes: 'LAYER_CUBES',\n  lines: 'LAYER_LINES',\n  text: 'LAYER_TEXT'\n};\nexports.layerNames = layerNames;\n},{}],\"khpo\":[function(require,module,exports) {\nvar global = arguments[3];\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n/*!\n * XRegExp 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2007-2017 MIT License\n */\n\n/**\n * XRegExp provides augmented, extensible regular expressions. You get additional regex syntax and\n * flags, beyond what browsers support natively. XRegExp is also a regex utility belt with tools to\n * make your client-side grepping simpler and more powerful, while freeing you from related\n * cross-browser inconsistencies.\n */\n\n// ==--------------------------==\n// Private stuff\n// ==--------------------------==\n\n// Property name used for extended regex instance data\nvar REGEX_DATA = 'xregexp';\n// Optional features that can be installed and uninstalled\nvar features = {\n    astral: false\n};\n// Native methods to use and restore ('native' is an ES3 reserved keyword)\nvar nativ = {\n    exec: RegExp.prototype.exec,\n    test: RegExp.prototype.test,\n    match: String.prototype.match,\n    replace: String.prototype.replace,\n    split: String.prototype.split\n};\n// Storage for fixed/extended native methods\nvar fixed = {};\n// Storage for regexes cached by `XRegExp.cache`\nvar regexCache = {};\n// Storage for pattern details cached by the `XRegExp` constructor\nvar patternCache = {};\n// Storage for regex syntax tokens added internally or by `XRegExp.addToken`\nvar tokens = [];\n// Token scopes\nvar defaultScope = 'default';\nvar classScope = 'class';\n// Regexes that match native regex syntax, including octals\nvar nativeTokens = {\n    // Any native multicharacter token in default scope, or any single character\n    'default': /\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|\\(\\?(?:[:=!]|<[=!])|[?*+]\\?|{\\d+(?:,\\d*)?}\\??|[\\s\\S]/,\n    // Any native multicharacter token in character class scope, or any single character\n    'class': /\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\dA-Fa-f]{2}|u(?:[\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|c[A-Za-z]|[\\s\\S])|[\\s\\S]/\n};\n// Any backreference or dollar-prefixed character in replacement strings\nvar replacementToken = /\\$(?:{([\\w$]+)}|<([\\w$]+)>|(\\d\\d?|[\\s\\S]))/g;\n// Check for correct `exec` handling of nonparticipating capturing groups\nvar correctExecNpcg = nativ.exec.call(/()??/, '')[1] === undefined;\n// Check for ES6 `flags` prop support\nvar hasFlagsProp = /x/.flags !== undefined;\n// Shortcut to `Object.prototype.toString`\nvar toString = {}.toString;\n\nfunction hasNativeFlag(flag) {\n    // Can't check based on the presence of properties/getters since browsers might support such\n    // properties even when they don't support the corresponding flag in regex construction (tested\n    // in Chrome 48, where `'unicode' in /x/` is true but trying to construct a regex with flag `u`\n    // throws an error)\n    var isSupported = true;\n    try {\n        // Can't use regex literals for testing even in a `try` because regex literals with\n        // unsupported flags cause a compilation error in IE\n        new RegExp('', flag);\n    } catch (exception) {\n        isSupported = false;\n    }\n    return isSupported;\n}\n// Check for ES6 `u` flag support\nvar hasNativeU = hasNativeFlag('u');\n// Check for ES6 `y` flag support\nvar hasNativeY = hasNativeFlag('y');\n// Tracker for known flags, including addon flags\nvar registeredFlags = {\n    g: true,\n    i: true,\n    m: true,\n    u: hasNativeU,\n    y: hasNativeY\n};\n\n/**\n * Attaches extended data and `XRegExp.prototype` properties to a regex object.\n *\n * @private\n * @param {RegExp} regex Regex to augment.\n * @param {Array} captureNames Array with capture names, or `null`.\n * @param {String} xSource XRegExp pattern used to generate `regex`, or `null` if N/A.\n * @param {String} xFlags XRegExp flags used to generate `regex`, or `null` if N/A.\n * @param {Boolean} [isInternalOnly=false] Whether the regex will be used only for internal\n *   operations, and never exposed to users. For internal-only regexes, we can improve perf by\n *   skipping some operations like attaching `XRegExp.prototype` properties.\n * @returns {RegExp} Augmented regex.\n */\nfunction augment(regex, captureNames, xSource, xFlags, isInternalOnly) {\n    var p = void 0;\n\n    regex[REGEX_DATA] = {\n        captureNames: captureNames\n    };\n\n    if (isInternalOnly) {\n        return regex;\n    }\n\n    // Can't auto-inherit these since the XRegExp constructor returns a nonprimitive value\n    if (regex.__proto__) {\n        regex.__proto__ = XRegExp.prototype;\n    } else {\n        for (p in XRegExp.prototype) {\n            // An `XRegExp.prototype.hasOwnProperty(p)` check wouldn't be worth it here, since this\n            // is performance sensitive, and enumerable `Object.prototype` or `RegExp.prototype`\n            // extensions exist on `regex.prototype` anyway\n            regex[p] = XRegExp.prototype[p];\n        }\n    }\n\n    regex[REGEX_DATA].source = xSource;\n    // Emulate the ES6 `flags` prop by ensuring flags are in alphabetical order\n    regex[REGEX_DATA].flags = xFlags ? xFlags.split('').sort().join('') : xFlags;\n\n    return regex;\n}\n\n/**\n * Removes any duplicate characters from the provided string.\n *\n * @private\n * @param {String} str String to remove duplicate characters from.\n * @returns {String} String with any duplicate characters removed.\n */\nfunction clipDuplicates(str) {\n    return nativ.replace.call(str, /([\\s\\S])(?=[\\s\\S]*\\1)/g, '');\n}\n\n/**\n * Copies a regex object while preserving extended data and augmenting with `XRegExp.prototype`\n * properties. The copy has a fresh `lastIndex` property (set to zero). Allows adding and removing\n * flags g and y while copying the regex.\n *\n * @private\n * @param {RegExp} regex Regex to copy.\n * @param {Object} [options] Options object with optional properties:\n *   - `addG` {Boolean} Add flag g while copying the regex.\n *   - `addY` {Boolean} Add flag y while copying the regex.\n *   - `removeG` {Boolean} Remove flag g while copying the regex.\n *   - `removeY` {Boolean} Remove flag y while copying the regex.\n *   - `isInternalOnly` {Boolean} Whether the copied regex will be used only for internal\n *     operations, and never exposed to users. For internal-only regexes, we can improve perf by\n *     skipping some operations like attaching `XRegExp.prototype` properties.\n *   - `source` {String} Overrides `<regex>.source`, for special cases.\n * @returns {RegExp} Copy of the provided regex, possibly with modified flags.\n */\nfunction copyRegex(regex, options) {\n    if (!XRegExp.isRegExp(regex)) {\n        throw new TypeError('Type RegExp expected');\n    }\n\n    var xData = regex[REGEX_DATA] || {};\n    var flags = getNativeFlags(regex);\n    var flagsToAdd = '';\n    var flagsToRemove = '';\n    var xregexpSource = null;\n    var xregexpFlags = null;\n\n    options = options || {};\n\n    if (options.removeG) {\n        flagsToRemove += 'g';\n    }\n    if (options.removeY) {\n        flagsToRemove += 'y';\n    }\n    if (flagsToRemove) {\n        flags = nativ.replace.call(flags, new RegExp('[' + flagsToRemove + ']+', 'g'), '');\n    }\n\n    if (options.addG) {\n        flagsToAdd += 'g';\n    }\n    if (options.addY) {\n        flagsToAdd += 'y';\n    }\n    if (flagsToAdd) {\n        flags = clipDuplicates(flags + flagsToAdd);\n    }\n\n    if (!options.isInternalOnly) {\n        if (xData.source !== undefined) {\n            xregexpSource = xData.source;\n        }\n        // null or undefined; don't want to add to `flags` if the previous value was null, since\n        // that indicates we're not tracking original precompilation flags\n        if (xData.flags != null) {\n            // Flags are only added for non-internal regexes by `XRegExp.globalize`. Flags are never\n            // removed for non-internal regexes, so don't need to handle it\n            xregexpFlags = flagsToAdd ? clipDuplicates(xData.flags + flagsToAdd) : xData.flags;\n        }\n    }\n\n    // Augment with `XRegExp.prototype` properties, but use the native `RegExp` constructor to avoid\n    // searching for special tokens. That would be wrong for regexes constructed by `RegExp`, and\n    // unnecessary for regexes constructed by `XRegExp` because the regex has already undergone the\n    // translation to native regex syntax\n    regex = augment(new RegExp(options.source || regex.source, flags), hasNamedCapture(regex) ? xData.captureNames.slice(0) : null, xregexpSource, xregexpFlags, options.isInternalOnly);\n\n    return regex;\n}\n\n/**\n * Converts hexadecimal to decimal.\n *\n * @private\n * @param {String} hex\n * @returns {Number}\n */\nfunction dec(hex) {\n    return parseInt(hex, 16);\n}\n\n/**\n * Returns a pattern that can be used in a native RegExp in place of an ignorable token such as an\n * inline comment or whitespace with flag x. This is used directly as a token handler function\n * passed to `XRegExp.addToken`.\n *\n * @private\n * @param {String} match Match arg of `XRegExp.addToken` handler\n * @param {String} scope Scope arg of `XRegExp.addToken` handler\n * @param {String} flags Flags arg of `XRegExp.addToken` handler\n * @returns {String} Either '' or '(?:)', depending on which is needed in the context of the match.\n */\nfunction getContextualTokenSeparator(match, scope, flags) {\n    if (\n    // No need to separate tokens if at the beginning or end of a group\n    match.input[match.index - 1] === '(' || match.input[match.index + match[0].length] === ')' ||\n    // Avoid separating tokens when the following token is a quantifier\n    isQuantifierNext(match.input, match.index + match[0].length, flags)) {\n        return '';\n    }\n    // Keep tokens separated. This avoids e.g. inadvertedly changing `\\1 1` or `\\1(?#)1` to `\\11`.\n    // This also ensures all tokens remain as discrete atoms, e.g. it avoids converting the syntax\n    // error `(? :` into `(?:`.\n    return '(?:)';\n}\n\n/**\n * Returns native `RegExp` flags used by a regex object.\n *\n * @private\n * @param {RegExp} regex Regex to check.\n * @returns {String} Native flags in use.\n */\nfunction getNativeFlags(regex) {\n    return hasFlagsProp ? regex.flags :\n    // Explicitly using `RegExp.prototype.toString` (rather than e.g. `String` or concatenation\n    // with an empty string) allows this to continue working predictably when\n    // `XRegExp.proptotype.toString` is overridden\n    nativ.exec.call(/\\/([a-z]*)$/i, RegExp.prototype.toString.call(regex))[1];\n}\n\n/**\n * Determines whether a regex has extended instance data used to track capture names.\n *\n * @private\n * @param {RegExp} regex Regex to check.\n * @returns {Boolean} Whether the regex uses named capture.\n */\nfunction hasNamedCapture(regex) {\n    return !!(regex[REGEX_DATA] && regex[REGEX_DATA].captureNames);\n}\n\n/**\n * Converts decimal to hexadecimal.\n *\n * @private\n * @param {Number|String} dec\n * @returns {String}\n */\nfunction hex(dec) {\n    return parseInt(dec, 10).toString(16);\n}\n\n/**\n * Checks whether the next nonignorable token after the specified position is a quantifier.\n *\n * @private\n * @param {String} pattern Pattern to search within.\n * @param {Number} pos Index in `pattern` to search at.\n * @param {String} flags Flags used by the pattern.\n * @returns {Boolean} Whether the next nonignorable token is a quantifier.\n */\nfunction isQuantifierNext(pattern, pos, flags) {\n    var inlineCommentPattern = '\\\\(\\\\?#[^)]*\\\\)';\n    var lineCommentPattern = '#[^#\\\\n]*';\n    var quantifierPattern = '[?*+]|{\\\\d+(?:,\\\\d*)?}';\n    return nativ.test.call(flags.indexOf('x') !== -1 ?\n    // Ignore any leading whitespace, line comments, and inline comments\n    /^(?:\\s|#[^#\\n]*|\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/ :\n    // Ignore any leading inline comments\n    /^(?:\\(\\?#[^)]*\\))*(?:[?*+]|{\\d+(?:,\\d*)?})/, pattern.slice(pos));\n}\n\n/**\n * Determines whether a value is of the specified type, by resolving its internal [[Class]].\n *\n * @private\n * @param {*} value Object to check.\n * @param {String} type Type to check for, in TitleCase.\n * @returns {Boolean} Whether the object matches the type.\n */\nfunction isType(value, type) {\n    return toString.call(value) === '[object ' + type + ']';\n}\n\n/**\n * Adds leading zeros if shorter than four characters. Used for fixed-length hexadecimal values.\n *\n * @private\n * @param {String} str\n * @returns {String}\n */\nfunction pad4(str) {\n    while (str.length < 4) {\n        str = '0' + str;\n    }\n    return str;\n}\n\n/**\n * Checks for flag-related errors, and strips/applies flags in a leading mode modifier. Offloads\n * the flag preparation logic from the `XRegExp` constructor.\n *\n * @private\n * @param {String} pattern Regex pattern, possibly with a leading mode modifier.\n * @param {String} flags Any combination of flags.\n * @returns {Object} Object with properties `pattern` and `flags`.\n */\nfunction prepareFlags(pattern, flags) {\n    var i = void 0;\n\n    // Recent browsers throw on duplicate flags, so copy this behavior for nonnative flags\n    if (clipDuplicates(flags) !== flags) {\n        throw new SyntaxError('Invalid duplicate regex flag ' + flags);\n    }\n\n    // Strip and apply a leading mode modifier with any combination of flags except g or y\n    pattern = nativ.replace.call(pattern, /^\\(\\?([\\w$]+)\\)/, function ($0, $1) {\n        if (nativ.test.call(/[gy]/, $1)) {\n            throw new SyntaxError('Cannot use flag g or y in mode modifier ' + $0);\n        }\n        // Allow duplicate flags within the mode modifier\n        flags = clipDuplicates(flags + $1);\n        return '';\n    });\n\n    // Throw on unknown native or nonnative flags\n    for (i = 0; i < flags.length; ++i) {\n        if (!registeredFlags[flags[i]]) {\n            throw new SyntaxError('Unknown regex flag ' + flags[i]);\n        }\n    }\n\n    return {\n        pattern: pattern,\n        flags: flags\n    };\n}\n\n/**\n * Prepares an options object from the given value.\n *\n * @private\n * @param {String|Object} value Value to convert to an options object.\n * @returns {Object} Options object.\n */\nfunction prepareOptions(value) {\n    var options = {};\n\n    if (isType(value, 'String')) {\n        XRegExp.forEach(value, /[^\\s,]+/, function (match) {\n            options[match] = true;\n        });\n\n        return options;\n    }\n\n    return value;\n}\n\n/**\n * Registers a flag so it doesn't throw an 'unknown flag' error.\n *\n * @private\n * @param {String} flag Single-character flag to register.\n */\nfunction registerFlag(flag) {\n    if (!/^[\\w$]$/.test(flag)) {\n        throw new Error('Flag must be a single character A-Za-z0-9_$');\n    }\n\n    registeredFlags[flag] = true;\n}\n\n/**\n * Runs built-in and custom regex syntax tokens in reverse insertion order at the specified\n * position, until a match is found.\n *\n * @private\n * @param {String} pattern Original pattern from which an XRegExp object is being built.\n * @param {String} flags Flags being used to construct the regex.\n * @param {Number} pos Position to search for tokens within `pattern`.\n * @param {Number} scope Regex scope to apply: 'default' or 'class'.\n * @param {Object} context Context object to use for token handler functions.\n * @returns {Object} Object with properties `matchLength`, `output`, and `reparse`; or `null`.\n */\nfunction runTokens(pattern, flags, pos, scope, context) {\n    var i = tokens.length;\n    var leadChar = pattern[pos];\n    var result = null;\n    var match = void 0;\n    var t = void 0;\n\n    // Run in reverse insertion order\n    while (i--) {\n        t = tokens[i];\n        if (t.leadChar && t.leadChar !== leadChar || t.scope !== scope && t.scope !== 'all' || t.flag && !(flags.indexOf(t.flag) !== -1)) {\n            continue;\n        }\n\n        match = XRegExp.exec(pattern, t.regex, pos, 'sticky');\n        if (match) {\n            result = {\n                matchLength: match[0].length,\n                output: t.handler.call(context, match, scope, flags),\n                reparse: t.reparse\n            };\n            // Finished with token tests\n            break;\n        }\n    }\n\n    return result;\n}\n\n/**\n * Enables or disables implicit astral mode opt-in. When enabled, flag A is automatically added to\n * all new regexes created by XRegExp. This causes an error to be thrown when creating regexes if\n * the Unicode Base addon is not available, since flag A is registered by that addon.\n *\n * @private\n * @param {Boolean} on `true` to enable; `false` to disable.\n */\nfunction setAstral(on) {\n    features.astral = on;\n}\n\n/**\n * Returns the object, or throws an error if it is `null` or `undefined`. This is used to follow\n * the ES5 abstract operation `ToObject`.\n *\n * @private\n * @param {*} value Object to check and return.\n * @returns {*} The provided object.\n */\nfunction toObject(value) {\n    // null or undefined\n    if (value == null) {\n        throw new TypeError('Cannot convert null or undefined to object');\n    }\n\n    return value;\n}\n\n// ==--------------------------==\n// Constructor\n// ==--------------------------==\n\n/**\n * Creates an extended regular expression object for matching text with a pattern. Differs from a\n * native regular expression in that additional syntax and flags are supported. The returned object\n * is in fact a native `RegExp` and works with all native methods.\n *\n * @class XRegExp\n * @constructor\n * @param {String|RegExp} pattern Regex pattern string, or an existing regex object to copy.\n * @param {String} [flags] Any combination of flags.\n *   Native flags:\n *     - `g` - global\n *     - `i` - ignore case\n *     - `m` - multiline anchors\n *     - `u` - unicode (ES6)\n *     - `y` - sticky (Firefox 3+, ES6)\n *   Additional XRegExp flags:\n *     - `n` - explicit capture\n *     - `s` - dot matches all (aka singleline)\n *     - `x` - free-spacing and line comments (aka extended)\n *     - `A` - astral (requires the Unicode Base addon)\n *   Flags cannot be provided when constructing one `RegExp` from another.\n * @returns {RegExp} Extended regular expression object.\n * @example\n *\n * // With named capture and flag x\n * XRegExp(`(?<year>  [0-9]{4} ) -?  # year\n *          (?<month> [0-9]{2} ) -?  # month\n *          (?<day>   [0-9]{2} )     # day`, 'x');\n *\n * // Providing a regex object copies it. Native regexes are recompiled using native (not XRegExp)\n * // syntax. Copies maintain extended data, are augmented with `XRegExp.prototype` properties, and\n * // have fresh `lastIndex` properties (set to zero).\n * XRegExp(/regex/);\n */\nfunction XRegExp(pattern, flags) {\n    if (XRegExp.isRegExp(pattern)) {\n        if (flags !== undefined) {\n            throw new TypeError('Cannot supply flags when copying a RegExp');\n        }\n        return copyRegex(pattern);\n    }\n\n    // Copy the argument behavior of `RegExp`\n    pattern = pattern === undefined ? '' : String(pattern);\n    flags = flags === undefined ? '' : String(flags);\n\n    if (XRegExp.isInstalled('astral') && !(flags.indexOf('A') !== -1)) {\n        // This causes an error to be thrown if the Unicode Base addon is not available\n        flags += 'A';\n    }\n\n    if (!patternCache[pattern]) {\n        patternCache[pattern] = {};\n    }\n\n    if (!patternCache[pattern][flags]) {\n        var context = {\n            hasNamedCapture: false,\n            captureNames: []\n        };\n        var scope = defaultScope;\n        var output = '';\n        var pos = 0;\n        var result = void 0;\n\n        // Check for flag-related errors, and strip/apply flags in a leading mode modifier\n        var applied = prepareFlags(pattern, flags);\n        var appliedPattern = applied.pattern;\n        var appliedFlags = applied.flags;\n\n        // Use XRegExp's tokens to translate the pattern to a native regex pattern.\n        // `appliedPattern.length` may change on each iteration if tokens use `reparse`\n        while (pos < appliedPattern.length) {\n            do {\n                // Check for custom tokens at the current position\n                result = runTokens(appliedPattern, appliedFlags, pos, scope, context);\n                // If the matched token used the `reparse` option, splice its output into the\n                // pattern before running tokens again at the same position\n                if (result && result.reparse) {\n                    appliedPattern = appliedPattern.slice(0, pos) + result.output + appliedPattern.slice(pos + result.matchLength);\n                }\n            } while (result && result.reparse);\n\n            if (result) {\n                output += result.output;\n                pos += result.matchLength || 1;\n            } else {\n                // Get the native token at the current position\n                var token = XRegExp.exec(appliedPattern, nativeTokens[scope], pos, 'sticky')[0];\n                output += token;\n                pos += token.length;\n                if (token === '[' && scope === defaultScope) {\n                    scope = classScope;\n                } else if (token === ']' && scope === classScope) {\n                    scope = defaultScope;\n                }\n            }\n        }\n\n        patternCache[pattern][flags] = {\n            // Use basic cleanup to collapse repeated empty groups like `(?:)(?:)` to `(?:)`. Empty\n            // groups are sometimes inserted during regex transpilation in order to keep tokens\n            // separated. However, more than one empty group in a row is never needed.\n            pattern: nativ.replace.call(output, /(?:\\(\\?:\\))+/g, '(?:)'),\n            // Strip all but native flags\n            flags: nativ.replace.call(appliedFlags, /[^gimuy]+/g, ''),\n            // `context.captureNames` has an item for each capturing group, even if unnamed\n            captures: context.hasNamedCapture ? context.captureNames : null\n        };\n    }\n\n    var generated = patternCache[pattern][flags];\n    return augment(new RegExp(generated.pattern, generated.flags), generated.captures, pattern, flags);\n}\n\n// Add `RegExp.prototype` to the prototype chain\nXRegExp.prototype = /(?:)/;\n\n// ==--------------------------==\n// Public properties\n// ==--------------------------==\n\n/**\n * The XRegExp version number as a string containing three dot-separated parts. For example,\n * '2.0.0-beta-3'.\n *\n * @static\n * @memberOf XRegExp\n * @type String\n */\nXRegExp.version = '4.0.0';\n\n// ==--------------------------==\n// Public methods\n// ==--------------------------==\n\n// Intentionally undocumented; used in tests and addons\nXRegExp._clipDuplicates = clipDuplicates;\nXRegExp._hasNativeFlag = hasNativeFlag;\nXRegExp._dec = dec;\nXRegExp._hex = hex;\nXRegExp._pad4 = pad4;\n\n/**\n * Extends XRegExp syntax and allows custom flags. This is used internally and can be used to\n * create XRegExp addons. If more than one token can match the same string, the last added wins.\n *\n * @memberOf XRegExp\n * @param {RegExp} regex Regex object that matches the new token.\n * @param {Function} handler Function that returns a new pattern string (using native regex syntax)\n *   to replace the matched token within all future XRegExp regexes. Has access to persistent\n *   properties of the regex being built, through `this`. Invoked with three arguments:\n *   - The match array, with named backreference properties.\n *   - The regex scope where the match was found: 'default' or 'class'.\n *   - The flags used by the regex, including any flags in a leading mode modifier.\n *   The handler function becomes part of the XRegExp construction process, so be careful not to\n *   construct XRegExps within the function or you will trigger infinite recursion.\n * @param {Object} [options] Options object with optional properties:\n *   - `scope` {String} Scope where the token applies: 'default', 'class', or 'all'.\n *   - `flag` {String} Single-character flag that triggers the token. This also registers the\n *     flag, which prevents XRegExp from throwing an 'unknown flag' error when the flag is used.\n *   - `optionalFlags` {String} Any custom flags checked for within the token `handler` that are\n *     not required to trigger the token. This registers the flags, to prevent XRegExp from\n *     throwing an 'unknown flag' error when any of the flags are used.\n *   - `reparse` {Boolean} Whether the `handler` function's output should not be treated as\n *     final, and instead be reparseable by other tokens (including the current token). Allows\n *     token chaining or deferring.\n *   - `leadChar` {String} Single character that occurs at the beginning of any successful match\n *     of the token (not always applicable). This doesn't change the behavior of the token unless\n *     you provide an erroneous value. However, providing it can increase the token's performance\n *     since the token can be skipped at any positions where this character doesn't appear.\n * @example\n *\n * // Basic usage: Add \\a for the ALERT control code\n * XRegExp.addToken(\n *   /\\\\a/,\n *   () => '\\\\x07',\n *   {scope: 'all'}\n * );\n * XRegExp('\\\\a[\\\\a-\\\\n]+').test('\\x07\\n\\x07'); // -> true\n *\n * // Add the U (ungreedy) flag from PCRE and RE2, which reverses greedy and lazy quantifiers.\n * // Since `scope` is not specified, it uses 'default' (i.e., transformations apply outside of\n * // character classes only)\n * XRegExp.addToken(\n *   /([?*+]|{\\d+(?:,\\d*)?})(\\??)/,\n *   (match) => `${match[1]}${match[2] ? '' : '?'}`,\n *   {flag: 'U'}\n * );\n * XRegExp('a+', 'U').exec('aaa')[0]; // -> 'a'\n * XRegExp('a+?', 'U').exec('aaa')[0]; // -> 'aaa'\n */\nXRegExp.addToken = function (regex, handler, options) {\n    options = options || {};\n    var optionalFlags = options.optionalFlags;\n    var i = void 0;\n\n    if (options.flag) {\n        registerFlag(options.flag);\n    }\n\n    if (optionalFlags) {\n        optionalFlags = nativ.split.call(optionalFlags, '');\n        for (i = 0; i < optionalFlags.length; ++i) {\n            registerFlag(optionalFlags[i]);\n        }\n    }\n\n    // Add to the private list of syntax tokens\n    tokens.push({\n        regex: copyRegex(regex, {\n            addG: true,\n            addY: hasNativeY,\n            isInternalOnly: true\n        }),\n        handler: handler,\n        scope: options.scope || defaultScope,\n        flag: options.flag,\n        reparse: options.reparse,\n        leadChar: options.leadChar\n    });\n\n    // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and flags\n    // might now produce different results\n    XRegExp.cache.flush('patterns');\n};\n\n/**\n * Caches and returns the result of calling `XRegExp(pattern, flags)`. On any subsequent call with\n * the same pattern and flag combination, the cached copy of the regex is returned.\n *\n * @memberOf XRegExp\n * @param {String} pattern Regex pattern string.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @returns {RegExp} Cached XRegExp object.\n * @example\n *\n * while (match = XRegExp.cache('.', 'gs').exec(str)) {\n *   // The regex is compiled once only\n * }\n */\nXRegExp.cache = function (pattern, flags) {\n    if (!regexCache[pattern]) {\n        regexCache[pattern] = {};\n    }\n    return regexCache[pattern][flags] || (regexCache[pattern][flags] = XRegExp(pattern, flags));\n};\n\n// Intentionally undocumented; used in tests\nXRegExp.cache.flush = function (cacheName) {\n    if (cacheName === 'patterns') {\n        // Flush the pattern cache used by the `XRegExp` constructor\n        patternCache = {};\n    } else {\n        // Flush the regex cache populated by `XRegExp.cache`\n        regexCache = {};\n    }\n};\n\n/**\n * Escapes any regular expression metacharacters, for use when matching literal strings. The result\n * can safely be used at any point within a regex that uses any flags.\n *\n * @memberOf XRegExp\n * @param {String} str String to escape.\n * @returns {String} String with regex metacharacters escaped.\n * @example\n *\n * XRegExp.escape('Escaped? <.>');\n * // -> 'Escaped\\?\\ <\\.>'\n */\nXRegExp.escape = function (str) {\n    return nativ.replace.call(toObject(str), /[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n};\n\n/**\n * Executes a regex search in a specified string. Returns a match array or `null`. If the provided\n * regex uses named capture, named backreference properties are included on the match array.\n * Optional `pos` and `sticky` arguments specify the search start position, and whether the match\n * must start at the specified position only. The `lastIndex` property of the provided regex is not\n * used, but is updated for compatibility. Also fixes browser bugs compared to the native\n * `RegExp.prototype.exec` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Number} [pos=0] Zero-based index at which to start the search.\n * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n *   only. The string `'sticky'` is accepted as an alternative to `true`.\n * @returns {Array} Match array with named backreference properties, or `null`.\n * @example\n *\n * // Basic use, with named backreference\n * let match = XRegExp.exec('U+2620', XRegExp('U\\\\+(?<hex>[0-9A-F]{4})'));\n * match.hex; // -> '2620'\n *\n * // With pos and sticky, in a loop\n * let pos = 2, result = [], match;\n * while (match = XRegExp.exec('<1><2><3><4>5<6>', /<(\\d)>/, pos, 'sticky')) {\n *   result.push(match[1]);\n *   pos = match.index + match[0].length;\n * }\n * // result -> ['2', '3', '4']\n */\nXRegExp.exec = function (str, regex, pos, sticky) {\n    var cacheKey = 'g';\n    var addY = false;\n    var fakeY = false;\n    var match = void 0;\n\n    addY = hasNativeY && !!(sticky || regex.sticky && sticky !== false);\n    if (addY) {\n        cacheKey += 'y';\n    } else if (sticky) {\n        // Simulate sticky matching by appending an empty capture to the original regex. The\n        // resulting regex will succeed no matter what at the current index (set with `lastIndex`),\n        // and will not search the rest of the subject string. We'll know that the original regex\n        // has failed if that last capture is `''` rather than `undefined` (i.e., if that last\n        // capture participated in the match).\n        fakeY = true;\n        cacheKey += 'FakeY';\n    }\n\n    regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n    // Shares cached copies with `XRegExp.match`/`replace`\n    var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n        addG: true,\n        addY: addY,\n        source: fakeY ? regex.source + '|()' : undefined,\n        removeY: sticky === false,\n        isInternalOnly: true\n    }));\n\n    pos = pos || 0;\n    r2.lastIndex = pos;\n\n    // Fixed `exec` required for `lastIndex` fix, named backreferences, etc.\n    match = fixed.exec.call(r2, str);\n\n    // Get rid of the capture added by the pseudo-sticky matcher if needed. An empty string means\n    // the original regexp failed (see above).\n    if (fakeY && match && match.pop() === '') {\n        match = null;\n    }\n\n    if (regex.global) {\n        regex.lastIndex = match ? r2.lastIndex : 0;\n    }\n\n    return match;\n};\n\n/**\n * Executes a provided function once per regex match. Searches always start at the beginning of the\n * string and continue until the end, regardless of the state of the regex's `global` property and\n * initial `lastIndex`.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Function} callback Function to execute for each match. Invoked with four arguments:\n *   - The match array, with named backreference properties.\n *   - The zero-based match index.\n *   - The string being traversed.\n *   - The regex object being used to traverse the string.\n * @example\n *\n * // Extracts every other digit from a string\n * const evens = [];\n * XRegExp.forEach('1a2345', /\\d/, (match, i) => {\n *   if (i % 2) evens.push(+match[0]);\n * });\n * // evens -> [2, 4]\n */\nXRegExp.forEach = function (str, regex, callback) {\n    var pos = 0;\n    var i = -1;\n    var match = void 0;\n\n    while (match = XRegExp.exec(str, regex, pos)) {\n        // Because `regex` is provided to `callback`, the function could use the deprecated/\n        // nonstandard `RegExp.prototype.compile` to mutate the regex. However, since `XRegExp.exec`\n        // doesn't use `lastIndex` to set the search position, this can't lead to an infinite loop,\n        // at least. Actually, because of the way `XRegExp.exec` caches globalized versions of\n        // regexes, mutating the regex will not have any effect on the iteration or matched strings,\n        // which is a nice side effect that brings extra safety.\n        callback(match, ++i, str, regex);\n\n        pos = match.index + (match[0].length || 1);\n    }\n};\n\n/**\n * Copies a regex object and adds flag `g`. The copy maintains extended data, is augmented with\n * `XRegExp.prototype` properties, and has a fresh `lastIndex` property (set to zero). Native\n * regexes are not recompiled using XRegExp syntax.\n *\n * @memberOf XRegExp\n * @param {RegExp} regex Regex to globalize.\n * @returns {RegExp} Copy of the provided regex with flag `g` added.\n * @example\n *\n * const globalCopy = XRegExp.globalize(/regex/);\n * globalCopy.global; // -> true\n */\nXRegExp.globalize = function (regex) {\n    return copyRegex(regex, { addG: true });\n};\n\n/**\n * Installs optional features according to the specified options. Can be undone using\n * `XRegExp.uninstall`.\n *\n * @memberOf XRegExp\n * @param {Object|String} options Options object or string.\n * @example\n *\n * // With an options object\n * XRegExp.install({\n *   // Enables support for astral code points in Unicode addons (implicitly sets flag A)\n *   astral: true\n * });\n *\n * // With an options string\n * XRegExp.install('astral');\n */\nXRegExp.install = function (options) {\n    options = prepareOptions(options);\n\n    if (!features.astral && options.astral) {\n        setAstral(true);\n    }\n};\n\n/**\n * Checks whether an individual optional feature is installed.\n *\n * @memberOf XRegExp\n * @param {String} feature Name of the feature to check. One of:\n *   - `astral`\n * @returns {Boolean} Whether the feature is installed.\n * @example\n *\n * XRegExp.isInstalled('astral');\n */\nXRegExp.isInstalled = function (feature) {\n    return !!features[feature];\n};\n\n/**\n * Returns `true` if an object is a regex; `false` if it isn't. This works correctly for regexes\n * created in another frame, when `instanceof` and `constructor` checks would fail.\n *\n * @memberOf XRegExp\n * @param {*} value Object to check.\n * @returns {Boolean} Whether the object is a `RegExp` object.\n * @example\n *\n * XRegExp.isRegExp('string'); // -> false\n * XRegExp.isRegExp(/regex/i); // -> true\n * XRegExp.isRegExp(RegExp('^', 'm')); // -> true\n * XRegExp.isRegExp(XRegExp('(?s).')); // -> true\n */\nXRegExp.isRegExp = function (value) {\n    return toString.call(value) === '[object RegExp]';\n}; // isType(value, 'RegExp');\n\n/**\n * Returns the first matched string, or in global mode, an array containing all matched strings.\n * This is essentially a more convenient re-implementation of `String.prototype.match` that gives\n * the result types you actually want (string instead of `exec`-style array in match-first mode,\n * and an empty array instead of `null` when no matches are found in match-all mode). It also lets\n * you override flag g and ignore `lastIndex`, and fixes browser bugs.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {String} [scope='one'] Use 'one' to return the first match as a string. Use 'all' to\n *   return an array of all matched strings. If not explicitly specified and `regex` uses flag g,\n *   `scope` is 'all'.\n * @returns {String|Array} In match-first mode: First match as a string, or `null`. In match-all\n *   mode: Array of all matched strings, or an empty array.\n * @example\n *\n * // Match first\n * XRegExp.match('abc', /\\w/); // -> 'a'\n * XRegExp.match('abc', /\\w/g, 'one'); // -> 'a'\n * XRegExp.match('abc', /x/g, 'one'); // -> null\n *\n * // Match all\n * XRegExp.match('abc', /\\w/g); // -> ['a', 'b', 'c']\n * XRegExp.match('abc', /\\w/, 'all'); // -> ['a', 'b', 'c']\n * XRegExp.match('abc', /x/, 'all'); // -> []\n */\nXRegExp.match = function (str, regex, scope) {\n    var global = regex.global && scope !== 'one' || scope === 'all';\n    var cacheKey = (global ? 'g' : '') + (regex.sticky ? 'y' : '') || 'noGY';\n\n    regex[REGEX_DATA] = regex[REGEX_DATA] || {};\n\n    // Shares cached copies with `XRegExp.exec`/`replace`\n    var r2 = regex[REGEX_DATA][cacheKey] || (regex[REGEX_DATA][cacheKey] = copyRegex(regex, {\n        addG: !!global,\n        removeG: scope === 'one',\n        isInternalOnly: true\n    }));\n\n    var result = nativ.match.call(toObject(str), r2);\n\n    if (regex.global) {\n        regex.lastIndex = scope === 'one' && result ?\n        // Can't use `r2.lastIndex` since `r2` is nonglobal in this case\n        result.index + result[0].length : 0;\n    }\n\n    return global ? result || [] : result && result[0];\n};\n\n/**\n * Retrieves the matches from searching a string using a chain of regexes that successively search\n * within previous matches. The provided `chain` array can contain regexes and or objects with\n * `regex` and `backref` properties. When a backreference is specified, the named or numbered\n * backreference is passed forward to the next regex or returned.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {Array} chain Regexes that each search for matches within preceding results.\n * @returns {Array} Matches by the last regex in the chain, or an empty array.\n * @example\n *\n * // Basic usage; matches numbers within <b> tags\n * XRegExp.matchChain('1 <b>2</b> 3 <b>4 a 56</b>', [\n *   XRegExp('(?is)<b>.*?</b>'),\n *   /\\d+/\n * ]);\n * // -> ['2', '4', '56']\n *\n * // Passing forward and returning specific backreferences\n * html = '<a href=\"http://xregexp.com/api/\">XRegExp</a>\\\n *         <a href=\"http://www.google.com/\">Google</a>';\n * XRegExp.matchChain(html, [\n *   {regex: /<a href=\"([^\"]+)\">/i, backref: 1},\n *   {regex: XRegExp('(?i)^https?://(?<domain>[^/?#]+)'), backref: 'domain'}\n * ]);\n * // -> ['xregexp.com', 'www.google.com']\n */\nXRegExp.matchChain = function (str, chain) {\n    return function recurseChain(values, level) {\n        var item = chain[level].regex ? chain[level] : { regex: chain[level] };\n        var matches = [];\n\n        function addMatch(match) {\n            if (item.backref) {\n                // Safari 4.0.5 (but not 5.0.5+) inappropriately uses sparse arrays to hold the\n                // `undefined`s for backreferences to nonparticipating capturing groups. In such\n                // cases, a `hasOwnProperty` or `in` check on its own would inappropriately throw\n                // the exception, so also check if the backreference is a number that is within the\n                // bounds of the array.\n                if (!(match.hasOwnProperty(item.backref) || +item.backref < match.length)) {\n                    throw new ReferenceError('Backreference to undefined group: ' + item.backref);\n                }\n\n                matches.push(match[item.backref] || '');\n            } else {\n                matches.push(match[0]);\n            }\n        }\n\n        for (var i = 0; i < values.length; ++i) {\n            XRegExp.forEach(values[i], item.regex, addMatch);\n        }\n\n        return level === chain.length - 1 || !matches.length ? matches : recurseChain(matches, level + 1);\n    }([str], 0);\n};\n\n/**\n * Returns a new string with one or all matches of a pattern replaced. The pattern can be a string\n * or regex, and the replacement can be a string or a function to be called for each match. To\n * perform a global search and replace, use the optional `scope` argument or include flag g if using\n * a regex. Replacement strings can use `${n}` or `$<n>` for named and numbered backreferences.\n * Replacement functions can use named backreferences via `arguments[0].name`. Also fixes browser\n * bugs compared to the native `String.prototype.replace` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp|String} search Search pattern to be replaced.\n * @param {String|Function} replacement Replacement string or a function invoked to create it.\n *   Replacement strings can include special replacement syntax:\n *     - $$ - Inserts a literal $ character.\n *     - $&, $0 - Inserts the matched substring.\n *     - $` - Inserts the string that precedes the matched substring (left context).\n *     - $' - Inserts the string that follows the matched substring (right context).\n *     - $n, $nn - Where n/nn are digits referencing an existent capturing group, inserts\n *       backreference n/nn.\n *     - ${n}, $<n> - Where n is a name or any number of digits that reference an existent capturing\n *       group, inserts backreference n.\n *   Replacement functions are invoked with three or more arguments:\n *     - The matched substring (corresponds to $& above). Named backreferences are accessible as\n *       properties of this first argument.\n *     - 0..n arguments, one for each backreference (corresponding to $1, $2, etc. above).\n *     - The zero-based index of the match within the total search string.\n *     - The total string being searched.\n * @param {String} [scope='one'] Use 'one' to replace the first match only, or 'all'. If not\n *   explicitly specified and using a regex with flag g, `scope` is 'all'.\n * @returns {String} New string with one or all matches replaced.\n * @example\n *\n * // Regex search, using named backreferences in replacement string\n * const name = XRegExp('(?<first>\\\\w+) (?<last>\\\\w+)');\n * XRegExp.replace('John Smith', name, '$<last>, $<first>');\n * // -> 'Smith, John'\n *\n * // Regex search, using named backreferences in replacement function\n * XRegExp.replace('John Smith', name, (match) => `${match.last}, ${match.first}`);\n * // -> 'Smith, John'\n *\n * // String search, with replace-all\n * XRegExp.replace('RegExp builds RegExps', 'RegExp', 'XRegExp', 'all');\n * // -> 'XRegExp builds XRegExps'\n */\nXRegExp.replace = function (str, search, replacement, scope) {\n    var isRegex = XRegExp.isRegExp(search);\n    var global = search.global && scope !== 'one' || scope === 'all';\n    var cacheKey = (global ? 'g' : '') + (search.sticky ? 'y' : '') || 'noGY';\n    var s2 = search;\n\n    if (isRegex) {\n        search[REGEX_DATA] = search[REGEX_DATA] || {};\n\n        // Shares cached copies with `XRegExp.exec`/`match`. Since a copy is used, `search`'s\n        // `lastIndex` isn't updated *during* replacement iterations\n        s2 = search[REGEX_DATA][cacheKey] || (search[REGEX_DATA][cacheKey] = copyRegex(search, {\n            addG: !!global,\n            removeG: scope === 'one',\n            isInternalOnly: true\n        }));\n    } else if (global) {\n        s2 = new RegExp(XRegExp.escape(String(search)), 'g');\n    }\n\n    // Fixed `replace` required for named backreferences, etc.\n    var result = fixed.replace.call(toObject(str), s2, replacement);\n\n    if (isRegex && search.global) {\n        // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n        search.lastIndex = 0;\n    }\n\n    return result;\n};\n\n/**\n * Performs batch processing of string replacements. Used like `XRegExp.replace`, but accepts an\n * array of replacement details. Later replacements operate on the output of earlier replacements.\n * Replacement details are accepted as an array with a regex or string to search for, the\n * replacement string or function, and an optional scope of 'one' or 'all'. Uses the XRegExp\n * replacement text syntax, which supports named backreference properties via `${name}` or\n * `$<name>`.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {Array} replacements Array of replacement detail arrays.\n * @returns {String} New string with all replacements.\n * @example\n *\n * str = XRegExp.replaceEach(str, [\n *   [XRegExp('(?<name>a)'), 'z${name}'],\n *   [/b/gi, 'y'],\n *   [/c/g, 'x', 'one'], // scope 'one' overrides /g\n *   [/d/, 'w', 'all'],  // scope 'all' overrides lack of /g\n *   ['e', 'v', 'all'],  // scope 'all' allows replace-all for strings\n *   [/f/g, ($0) => $0.toUpperCase()]\n * ]);\n */\nXRegExp.replaceEach = function (str, replacements) {\n    var i = void 0;\n    var r = void 0;\n\n    for (i = 0; i < replacements.length; ++i) {\n        r = replacements[i];\n        str = XRegExp.replace(str, r[0], r[1], r[2]);\n    }\n\n    return str;\n};\n\n/**\n * Splits a string into an array of strings using a regex or string separator. Matches of the\n * separator are not included in the result array. However, if `separator` is a regex that contains\n * capturing groups, backreferences are spliced into the result each time `separator` is matched.\n * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably\n * cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to split.\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {Array} Array of substrings.\n * @example\n *\n * // Basic use\n * XRegExp.split('a b c', ' ');\n * // -> ['a', 'b', 'c']\n *\n * // With limit\n * XRegExp.split('a b c', ' ', 2);\n * // -> ['a', 'b']\n *\n * // Backreferences in result array\n * XRegExp.split('..word1..', /([a-z]+)(\\d+)/i);\n * // -> ['..', 'word', '1', '..']\n */\nXRegExp.split = function (str, separator, limit) {\n    return fixed.split.call(toObject(str), separator, limit);\n};\n\n/**\n * Executes a regex search in a specified string. Returns `true` or `false`. Optional `pos` and\n * `sticky` arguments specify the search start position, and whether the match must start at the\n * specified position only. The `lastIndex` property of the provided regex is not used, but is\n * updated for compatibility. Also fixes browser bugs compared to the native\n * `RegExp.prototype.test` and can be used reliably cross-browser.\n *\n * @memberOf XRegExp\n * @param {String} str String to search.\n * @param {RegExp} regex Regex to search with.\n * @param {Number} [pos=0] Zero-based index at which to start the search.\n * @param {Boolean|String} [sticky=false] Whether the match must start at the specified position\n *   only. The string `'sticky'` is accepted as an alternative to `true`.\n * @returns {Boolean} Whether the regex matched the provided value.\n * @example\n *\n * // Basic use\n * XRegExp.test('abc', /c/); // -> true\n *\n * // With pos and sticky\n * XRegExp.test('abc', /c/, 0, 'sticky'); // -> false\n * XRegExp.test('abc', /c/, 2, 'sticky'); // -> true\n */\n// Do this the easy way :-)\nXRegExp.test = function (str, regex, pos, sticky) {\n    return !!XRegExp.exec(str, regex, pos, sticky);\n};\n\n/**\n * Uninstalls optional features according to the specified options. All optional features start out\n * uninstalled, so this is used to undo the actions of `XRegExp.install`.\n *\n * @memberOf XRegExp\n * @param {Object|String} options Options object or string.\n * @example\n *\n * // With an options object\n * XRegExp.uninstall({\n *   // Disables support for astral code points in Unicode addons\n *   astral: true\n * });\n *\n * // With an options string\n * XRegExp.uninstall('astral');\n */\nXRegExp.uninstall = function (options) {\n    options = prepareOptions(options);\n\n    if (features.astral && options.astral) {\n        setAstral(false);\n    }\n};\n\n/**\n * Returns an XRegExp object that is the union of the given patterns. Patterns can be provided as\n * regex objects or strings. Metacharacters are escaped in patterns provided as strings.\n * Backreferences in provided regex objects are automatically renumbered to work correctly within\n * the larger combined pattern. Native flags used by provided regexes are ignored in favor of the\n * `flags` argument.\n *\n * @memberOf XRegExp\n * @param {Array} patterns Regexes and strings to combine.\n * @param {String} [flags] Any combination of XRegExp flags.\n * @param {Object} [options] Options object with optional properties:\n *   - `conjunction` {String} Type of conjunction to use: 'or' (default) or 'none'.\n * @returns {RegExp} Union of the provided regexes and strings.\n * @example\n *\n * XRegExp.union(['a+b*c', /(dogs)\\1/, /(cats)\\1/], 'i');\n * // -> /a\\+b\\*c|(dogs)\\1|(cats)\\2/i\n *\n * XRegExp.union([/man/, /bear/, /pig/], 'i', {conjunction: 'none'});\n * // -> /manbearpig/i\n */\nXRegExp.union = function (patterns, flags, options) {\n    options = options || {};\n    var conjunction = options.conjunction || 'or';\n    var numCaptures = 0;\n    var numPriorCaptures = void 0;\n    var captureNames = void 0;\n\n    function rewrite(match, paren, backref) {\n        var name = captureNames[numCaptures - numPriorCaptures];\n\n        // Capturing group\n        if (paren) {\n            ++numCaptures;\n            // If the current capture has a name, preserve the name\n            if (name) {\n                return '(?<' + name + '>';\n            }\n            // Backreference\n        } else if (backref) {\n            // Rewrite the backreference\n            return '\\\\' + (+backref + numPriorCaptures);\n        }\n\n        return match;\n    }\n\n    if (!(isType(patterns, 'Array') && patterns.length)) {\n        throw new TypeError('Must provide a nonempty array of patterns to merge');\n    }\n\n    var parts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n    var output = [];\n    var pattern = void 0;\n    for (var i = 0; i < patterns.length; ++i) {\n        pattern = patterns[i];\n\n        if (XRegExp.isRegExp(pattern)) {\n            numPriorCaptures = numCaptures;\n            captureNames = pattern[REGEX_DATA] && pattern[REGEX_DATA].captureNames || [];\n\n            // Rewrite backreferences. Passing to XRegExp dies on octals and ensures patterns are\n            // independently valid; helps keep this simple. Named captures are put back\n            output.push(nativ.replace.call(XRegExp(pattern.source).source, parts, rewrite));\n        } else {\n            output.push(XRegExp.escape(pattern));\n        }\n    }\n\n    var separator = conjunction === 'none' ? '' : '|';\n    return XRegExp(output.join(separator), flags);\n};\n\n// ==--------------------------==\n// Fixed/extended native methods\n// ==--------------------------==\n\n/**\n * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n * bugs in the native `RegExp.prototype.exec`. Use via `XRegExp.exec`.\n *\n * @memberOf RegExp\n * @param {String} str String to search.\n * @returns {Array} Match array with named backreference properties, or `null`.\n */\nfixed.exec = function (str) {\n    var origLastIndex = this.lastIndex;\n    var match = nativ.exec.apply(this, arguments);\n\n    if (match) {\n        // Fix browsers whose `exec` methods don't return `undefined` for nonparticipating capturing\n        // groups. This fixes IE 5.5-8, but not IE 9's quirks mode or emulation of older IEs. IE 9\n        // in standards mode follows the spec.\n        if (!correctExecNpcg && match.length > 1 && match.indexOf('') !== -1) {\n            var r2 = copyRegex(this, {\n                removeG: true,\n                isInternalOnly: true\n            });\n            // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed\n            // matching due to characters outside the match\n            nativ.replace.call(String(str).slice(match.index), r2, function () {\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                    args[_key] = arguments[_key];\n                }\n\n                var len = args.length;\n                // Skip index 0 and the last 2\n                for (var i = 1; i < len - 2; ++i) {\n                    if (args[i] === undefined) {\n                        match[i] = undefined;\n                    }\n                }\n            });\n        }\n\n        // Attach named capture properties\n        if (this[REGEX_DATA] && this[REGEX_DATA].captureNames) {\n            // Skip index 0\n            for (var i = 1; i < match.length; ++i) {\n                var name = this[REGEX_DATA].captureNames[i - 1];\n                if (name) {\n                    match[name] = match[i];\n                }\n            }\n        }\n\n        // Fix browsers that increment `lastIndex` after zero-length matches\n        if (this.global && !match[0].length && this.lastIndex > match.index) {\n            this.lastIndex = match.index;\n        }\n    }\n\n    if (!this.global) {\n        // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n        this.lastIndex = origLastIndex;\n    }\n\n    return match;\n};\n\n/**\n * Fixes browser bugs in the native `RegExp.prototype.test`.\n *\n * @memberOf RegExp\n * @param {String} str String to search.\n * @returns {Boolean} Whether the regex matched the provided value.\n */\nfixed.test = function (str) {\n    // Do this the easy way :-)\n    return !!fixed.exec.call(this, str);\n};\n\n/**\n * Adds named capture support (with backreferences returned as `result.name`), and fixes browser\n * bugs in the native `String.prototype.match`.\n *\n * @memberOf String\n * @param {RegExp|*} regex Regex to search with. If not a regex object, it is passed to `RegExp`.\n * @returns {Array} If `regex` uses flag g, an array of match strings or `null`. Without flag g,\n *   the result of calling `regex.exec(this)`.\n */\nfixed.match = function (regex) {\n    if (!XRegExp.isRegExp(regex)) {\n        // Use the native `RegExp` rather than `XRegExp`\n        regex = new RegExp(regex);\n    } else if (regex.global) {\n        var result = nativ.match.apply(this, arguments);\n        // Fixes IE bug\n        regex.lastIndex = 0;\n\n        return result;\n    }\n\n    return fixed.exec.call(regex, toObject(this));\n};\n\n/**\n * Adds support for `${n}` (or `$<n>`) tokens for named and numbered backreferences in replacement\n * text, and provides named backreferences to replacement functions as `arguments[0].name`. Also\n * fixes browser bugs in replacement text syntax when performing a replacement using a nonregex\n * search value, and the value of a replacement regex's `lastIndex` property during replacement\n * iterations and upon completion. Note that this doesn't support SpiderMonkey's proprietary third\n * (`flags`) argument. Use via `XRegExp.replace`.\n *\n * @memberOf String\n * @param {RegExp|String} search Search pattern to be replaced.\n * @param {String|Function} replacement Replacement string or a function invoked to create it.\n * @returns {String} New string with one or all matches replaced.\n */\nfixed.replace = function (search, replacement) {\n    var isRegex = XRegExp.isRegExp(search);\n    var origLastIndex = void 0;\n    var captureNames = void 0;\n    var result = void 0;\n\n    if (isRegex) {\n        if (search[REGEX_DATA]) {\n            captureNames = search[REGEX_DATA].captureNames;\n        }\n        // Only needed if `search` is nonglobal\n        origLastIndex = search.lastIndex;\n    } else {\n        search += ''; // Type-convert\n    }\n\n    // Don't use `typeof`; some older browsers return 'function' for regex objects\n    if (isType(replacement, 'Function')) {\n        // Stringifying `this` fixes a bug in IE < 9 where the last argument in replacement\n        // functions isn't type-converted to a string\n        result = nativ.replace.call(String(this), search, function () {\n            for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n                args[_key2] = arguments[_key2];\n            }\n\n            if (captureNames) {\n                // Change the `args[0]` string primitive to a `String` object that can store\n                // properties. This really does need to use `String` as a constructor\n                args[0] = new String(args[0]);\n                // Store named backreferences on the first argument\n                for (var i = 0; i < captureNames.length; ++i) {\n                    if (captureNames[i]) {\n                        args[0][captureNames[i]] = args[i + 1];\n                    }\n                }\n            }\n            // Update `lastIndex` before calling `replacement`. Fixes IE, Chrome, Firefox, Safari\n            // bug (last tested IE 9, Chrome 17, Firefox 11, Safari 5.1)\n            if (isRegex && search.global) {\n                search.lastIndex = args[args.length - 2] + args[0].length;\n            }\n            // ES6 specs the context for replacement functions as `undefined`\n            return replacement.apply(undefined, args);\n        });\n    } else {\n        // Ensure that the last value of `args` will be a string when given nonstring `this`,\n        // while still throwing on null or undefined context\n        result = nativ.replace.call(this == null ? this : String(this), search, function () {\n            for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n                args[_key3] = arguments[_key3];\n            }\n\n            return nativ.replace.call(String(replacement), replacementToken, replacer);\n\n            function replacer($0, bracketed, angled, dollarToken) {\n                bracketed = bracketed || angled;\n                // Named or numbered backreference with curly or angled braces\n                if (bracketed) {\n                    // XRegExp behavior for `${n}` or `$<n>`:\n                    // 1. Backreference to numbered capture, if `n` is an integer. Use `0` for the\n                    //    entire match. Any number of leading zeros may be used.\n                    // 2. Backreference to named capture `n`, if it exists and is not an integer\n                    //    overridden by numbered capture. In practice, this does not overlap with\n                    //    numbered capture since XRegExp does not allow named capture to use a bare\n                    //    integer as the name.\n                    // 3. If the name or number does not refer to an existing capturing group, it's\n                    //    an error.\n                    var n = +bracketed; // Type-convert; drop leading zeros\n                    if (n <= args.length - 3) {\n                        return args[n] || '';\n                    }\n                    // Groups with the same name is an error, else would need `lastIndexOf`\n                    n = captureNames ? captureNames.indexOf(bracketed) : -1;\n                    if (n < 0) {\n                        throw new SyntaxError('Backreference to undefined group ' + $0);\n                    }\n                    return args[n + 1] || '';\n                }\n                // Else, special variable or numbered backreference without curly braces\n                if (dollarToken === '$') {\n                    // $$\n                    return '$';\n                }\n                if (dollarToken === '&' || +dollarToken === 0) {\n                    // $&, $0 (not followed by 1-9), $00\n                    return args[0];\n                }\n                if (dollarToken === '`') {\n                    // $` (left context)\n                    return args[args.length - 1].slice(0, args[args.length - 2]);\n                }\n                if (dollarToken === \"'\") {\n                    // $' (right context)\n                    return args[args.length - 1].slice(args[args.length - 2] + args[0].length);\n                }\n                // Else, numbered backreference without braces\n                dollarToken = +dollarToken; // Type-convert; drop leading zero\n                // XRegExp behavior for `$n` and `$nn`:\n                // - Backrefs end after 1 or 2 digits. Use `${..}` or `$<..>` for more digits.\n                // - `$1` is an error if no capturing groups.\n                // - `$10` is an error if less than 10 capturing groups. Use `${1}0` or `$<1>0`\n                //   instead.\n                // - `$01` is `$1` if at least one capturing group, else it's an error.\n                // - `$0` (not followed by 1-9) and `$00` are the entire match.\n                // Native behavior, for comparison:\n                // - Backrefs end after 1 or 2 digits. Cannot reference capturing group 100+.\n                // - `$1` is a literal `$1` if no capturing groups.\n                // - `$10` is `$1` followed by a literal `0` if less than 10 capturing groups.\n                // - `$01` is `$1` if at least one capturing group, else it's a literal `$01`.\n                // - `$0` is a literal `$0`.\n                if (!isNaN(dollarToken)) {\n                    if (dollarToken > args.length - 3) {\n                        throw new SyntaxError('Backreference to undefined group ' + $0);\n                    }\n                    return args[dollarToken] || '';\n                }\n                // `$` followed by an unsupported char is an error, unlike native JS\n                throw new SyntaxError('Invalid token ' + $0);\n            }\n        });\n    }\n\n    if (isRegex) {\n        if (search.global) {\n            // Fixes IE, Safari bug (last tested IE 9, Safari 5.1)\n            search.lastIndex = 0;\n        } else {\n            // Fixes IE, Opera bug (last tested IE 9, Opera 11.6)\n            search.lastIndex = origLastIndex;\n        }\n    }\n\n    return result;\n};\n\n/**\n * Fixes browser bugs in the native `String.prototype.split`. Use via `XRegExp.split`.\n *\n * @memberOf String\n * @param {RegExp|String} separator Regex or string to use for separating the string.\n * @param {Number} [limit] Maximum number of items to include in the result array.\n * @returns {Array} Array of substrings.\n */\nfixed.split = function (separator, limit) {\n    if (!XRegExp.isRegExp(separator)) {\n        // Browsers handle nonregex split correctly, so use the faster native method\n        return nativ.split.apply(this, arguments);\n    }\n\n    var str = String(this);\n    var output = [];\n    var origLastIndex = separator.lastIndex;\n    var lastLastIndex = 0;\n    var lastLength = void 0;\n\n    // Values for `limit`, per the spec:\n    // If undefined: pow(2,32) - 1\n    // If 0, Infinity, or NaN: 0\n    // If positive number: limit = floor(limit); if (limit >= pow(2,32)) limit -= pow(2,32);\n    // If negative number: pow(2,32) - floor(abs(limit))\n    // If other: Type-convert, then use the above rules\n    // This line fails in very strange ways for some values of `limit` in Opera 10.5-10.63, unless\n    // Opera Dragonfly is open (go figure). It works in at least Opera 9.5-10.1 and 11+\n    limit = (limit === undefined ? -1 : limit) >>> 0;\n\n    XRegExp.forEach(str, separator, function (match) {\n        // This condition is not the same as `if (match[0].length)`\n        if (match.index + match[0].length > lastLastIndex) {\n            output.push(str.slice(lastLastIndex, match.index));\n            if (match.length > 1 && match.index < str.length) {\n                Array.prototype.push.apply(output, match.slice(1));\n            }\n            lastLength = match[0].length;\n            lastLastIndex = match.index + lastLength;\n        }\n    });\n\n    if (lastLastIndex === str.length) {\n        if (!nativ.test.call(separator, '') || lastLength) {\n            output.push('');\n        }\n    } else {\n        output.push(str.slice(lastLastIndex));\n    }\n\n    separator.lastIndex = origLastIndex;\n    return output.length > limit ? output.slice(0, limit) : output;\n};\n\n// ==--------------------------==\n// Built-in syntax/flag tokens\n// ==--------------------------==\n\n/*\n * Letter escapes that natively match literal characters: `\\a`, `\\A`, etc. These should be\n * SyntaxErrors but are allowed in web reality. XRegExp makes them errors for cross-browser\n * consistency and to reserve their syntax, but lets them be superseded by addons.\n */\nXRegExp.addToken(/\\\\([ABCE-RTUVXYZaeg-mopqyz]|c(?![A-Za-z])|u(?![\\dA-Fa-f]{4}|{[\\dA-Fa-f]+})|x(?![\\dA-Fa-f]{2}))/, function (match, scope) {\n    // \\B is allowed in default scope only\n    if (match[1] === 'B' && scope === defaultScope) {\n        return match[0];\n    }\n    throw new SyntaxError('Invalid escape ' + match[0]);\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Unicode code point escape with curly braces: `\\u{N..}`. `N..` is any one or more digit\n * hexadecimal number from 0-10FFFF, and can include leading zeros. Requires the native ES6 `u` flag\n * to support code points greater than U+FFFF. Avoids converting code points above U+FFFF to\n * surrogate pairs (which could be done without flag `u`), since that could lead to broken behavior\n * if you follow a `\\u{N..}` token that references a code point above U+FFFF with a quantifier, or\n * if you use the same in a character class.\n */\nXRegExp.addToken(/\\\\u{([\\dA-Fa-f]+)}/, function (match, scope, flags) {\n    var code = dec(match[1]);\n    if (code > 0x10FFFF) {\n        throw new SyntaxError('Invalid Unicode code point ' + match[0]);\n    }\n    if (code <= 0xFFFF) {\n        // Converting to \\uNNNN avoids needing to escape the literal character and keep it\n        // separate from preceding tokens\n        return '\\\\u' + pad4(hex(code));\n    }\n    // If `code` is between 0xFFFF and 0x10FFFF, require and defer to native handling\n    if (hasNativeU && flags.indexOf('u') !== -1) {\n        return match[0];\n    }\n    throw new SyntaxError('Cannot use Unicode code point above \\\\u{FFFF} without flag u');\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Empty character class: `[]` or `[^]`. This fixes a critical cross-browser syntax inconsistency.\n * Unless this is standardized (per the ES spec), regex syntax can't be accurately parsed because\n * character class endings can't be determined.\n */\nXRegExp.addToken(/\\[(\\^?)\\]/,\n// For cross-browser compatibility with ES3, convert [] to \\b\\B and [^] to [\\s\\S].\n// (?!) should work like \\b\\B, but is unreliable in some versions of Firefox\n/* eslint-disable no-confusing-arrow */\nfunction (match) {\n    return match[1] ? '[\\\\s\\\\S]' : '\\\\b\\\\B';\n},\n/* eslint-enable no-confusing-arrow */\n{ leadChar: '[' });\n\n/*\n * Comment pattern: `(?# )`. Inline comments are an alternative to the line comments allowed in\n * free-spacing mode (flag x).\n */\nXRegExp.addToken(/\\(\\?#[^)]*\\)/, getContextualTokenSeparator, { leadChar: '(' });\n\n/*\n * Whitespace and line comments, in free-spacing mode (aka extended mode, flag x) only.\n */\nXRegExp.addToken(/\\s+|#[^\\n]*\\n?/, getContextualTokenSeparator, { flag: 'x' });\n\n/*\n * Dot, in dotall mode (aka singleline mode, flag s) only.\n */\nXRegExp.addToken(/\\./, function () {\n    return '[\\\\s\\\\S]';\n}, {\n    flag: 's',\n    leadChar: '.'\n});\n\n/*\n * Named backreference: `\\k<name>`. Backreference names can use the characters A-Z, a-z, 0-9, _,\n * and $ only. Also allows numbered backreferences as `\\k<n>`.\n */\nXRegExp.addToken(/\\\\k<([\\w$]+)>/, function (match) {\n    // Groups with the same name is an error, else would need `lastIndexOf`\n    var index = isNaN(match[1]) ? this.captureNames.indexOf(match[1]) + 1 : +match[1];\n    var endIndex = match.index + match[0].length;\n    if (!index || index > this.captureNames.length) {\n        throw new SyntaxError('Backreference to undefined group ' + match[0]);\n    }\n    // Keep backreferences separate from subsequent literal numbers. This avoids e.g.\n    // inadvertedly changing `(?<n>)\\k<n>1` to `()\\11`.\n    return '\\\\' + index + (endIndex === match.input.length || isNaN(match.input[endIndex]) ? '' : '(?:)');\n}, { leadChar: '\\\\' });\n\n/*\n * Numbered backreference or octal, plus any following digits: `\\0`, `\\11`, etc. Octals except `\\0`\n * not followed by 0-9 and backreferences to unopened capture groups throw an error. Other matches\n * are returned unaltered. IE < 9 doesn't support backreferences above `\\99` in regex syntax.\n */\nXRegExp.addToken(/\\\\(\\d+)/, function (match, scope) {\n    if (!(scope === defaultScope && /^[1-9]/.test(match[1]) && +match[1] <= this.captureNames.length) && match[1] !== '0') {\n        throw new SyntaxError('Cannot use octal escape or backreference to undefined group ' + match[0]);\n    }\n    return match[0];\n}, {\n    scope: 'all',\n    leadChar: '\\\\'\n});\n\n/*\n * Named capturing group; match the opening delimiter only: `(?<name>`. Capture names can use the\n * characters A-Z, a-z, 0-9, _, and $ only. Names can't be integers. Supports Python-style\n * `(?P<name>` as an alternate syntax to avoid issues in some older versions of Opera which natively\n * supported the Python-style syntax. Otherwise, XRegExp might treat numbered backreferences to\n * Python-style named capture as octals.\n */\nXRegExp.addToken(/\\(\\?P?<([\\w$]+)>/, function (match) {\n    // Disallow bare integers as names because named backreferences are added to match arrays\n    // and therefore numeric properties may lead to incorrect lookups\n    if (!isNaN(match[1])) {\n        throw new SyntaxError('Cannot use integer as capture name ' + match[0]);\n    }\n    if (match[1] === 'length' || match[1] === '__proto__') {\n        throw new SyntaxError('Cannot use reserved word as capture name ' + match[0]);\n    }\n    if (this.captureNames.indexOf(match[1]) !== -1) {\n        throw new SyntaxError('Cannot use same name for multiple groups ' + match[0]);\n    }\n    this.captureNames.push(match[1]);\n    this.hasNamedCapture = true;\n    return '(';\n}, { leadChar: '(' });\n\n/*\n * Capturing group; match the opening parenthesis only. Required for support of named capturing\n * groups. Also adds explicit capture mode (flag n).\n */\nXRegExp.addToken(/\\((?!\\?)/, function (match, scope, flags) {\n    if (flags.indexOf('n') !== -1) {\n        return '(?:';\n    }\n    this.captureNames.push(null);\n    return '(';\n}, {\n    optionalFlags: 'n',\n    leadChar: '('\n});\n\nexports.default = XRegExp;\nmodule.exports = exports['default'];\n},{}],\"gomO\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp.build 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2012-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n    var REGEX_DATA = 'xregexp';\n    var subParts = /(\\()(?!\\?)|\\\\([1-9]\\d*)|\\\\[\\s\\S]|\\[(?:[^\\\\\\]]|\\\\[\\s\\S])*\\]/g;\n    var parts = XRegExp.union([/\\({{([\\w$]+)}}\\)|{{([\\w$]+)}}/, subParts], 'g', {\n        conjunction: 'or'\n    });\n\n    /**\n     * Strips a leading `^` and trailing unescaped `$`, if both are present.\n     *\n     * @private\n     * @param {String} pattern Pattern to process.\n     * @returns {String} Pattern with edge anchors removed.\n     */\n    function deanchor(pattern) {\n        // Allow any number of empty noncapturing groups before/after anchors, because regexes\n        // built/generated by XRegExp sometimes include them\n        var leadingAnchor = /^(?:\\(\\?:\\))*\\^/;\n        var trailingAnchor = /\\$(?:\\(\\?:\\))*$/;\n\n        if (leadingAnchor.test(pattern) && trailingAnchor.test(pattern) &&\n        // Ensure that the trailing `$` isn't escaped\n        trailingAnchor.test(pattern.replace(/\\\\[\\s\\S]/g, ''))) {\n            return pattern.replace(leadingAnchor, '').replace(trailingAnchor, '');\n        }\n\n        return pattern;\n    }\n\n    /**\n     * Converts the provided value to an XRegExp. Native RegExp flags are not preserved.\n     *\n     * @private\n     * @param {String|RegExp} value Value to convert.\n     * @param {Boolean} [addFlagX] Whether to apply the `x` flag in cases when `value` is not\n     *   already a regex generated by XRegExp\n     * @returns {RegExp} XRegExp object with XRegExp syntax applied.\n     */\n    function asXRegExp(value, addFlagX) {\n        var flags = addFlagX ? 'x' : '';\n        return XRegExp.isRegExp(value) ? value[REGEX_DATA] && value[REGEX_DATA].captureNames ?\n        // Don't recompile, to preserve capture names\n        value :\n        // Recompile as XRegExp\n        XRegExp(value.source, flags) :\n        // Compile string as XRegExp\n        XRegExp(value, flags);\n    }\n\n    function interpolate(substitution) {\n        return substitution instanceof RegExp ? substitution : XRegExp.escape(substitution);\n    }\n\n    function reduceToSubpatternsObject(subpatterns, interpolated, subpatternIndex) {\n        subpatterns['subpattern' + subpatternIndex] = interpolated;\n        return subpatterns;\n    }\n\n    function embedSubpatternAfter(raw, subpatternIndex, rawLiterals) {\n        var hasSubpattern = subpatternIndex < rawLiterals.length - 1;\n        return raw + (hasSubpattern ? '{{subpattern' + subpatternIndex + '}}' : '');\n    }\n\n    /**\n     * Provides tagged template literals that create regexes with XRegExp syntax and flags. The\n     * provided pattern is handled as a raw string, so backslashes don't need to be escaped.\n     *\n     * Interpolation of strings and regexes shares the features of `XRegExp.build`. Interpolated\n     * patterns are treated as atomic units when quantified, interpolated strings have their special\n     * characters escaped, a leading `^` and trailing unescaped `$` are stripped from interpolated\n     * regexes if both are present, and any backreferences within an interpolated regex are\n     * rewritten to work within the overall pattern.\n     *\n     * @memberOf XRegExp\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {Function} Handler for template literals that construct regexes with XRegExp syntax.\n     * @example\n     *\n     * const h12 = /1[0-2]|0?[1-9]/;\n     * const h24 = /2[0-3]|[01][0-9]/;\n     * const hours = XRegExp.tag('x')`${h12} : | ${h24}`;\n     * const minutes = /^[0-5][0-9]$/;\n     * // Note that explicitly naming the 'minutes' group is required for named backreferences\n     * const time = XRegExp.tag('x')`^ ${hours} (?<minutes>${minutes}) $`;\n     * time.test('10:59'); // -> true\n     * XRegExp.exec('10:59', time).minutes; // -> '59'\n     */\n    XRegExp.tag = function (flags) {\n        return function (literals) {\n            for (var _len = arguments.length, substitutions = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n                substitutions[_key - 1] = arguments[_key];\n            }\n\n            var subpatterns = substitutions.map(interpolate).reduce(reduceToSubpatternsObject, {});\n            var pattern = literals.raw.map(embedSubpatternAfter).join('');\n            return XRegExp.build(pattern, subpatterns, flags);\n        };\n    };\n\n    /**\n     * Builds regexes using named subpatterns, for readability and pattern reuse. Backreferences in\n     * the outer pattern and provided subpatterns are automatically renumbered to work correctly.\n     * Native flags used by provided subpatterns are ignored in favor of the `flags` argument.\n     *\n     * @memberOf XRegExp\n     * @param {String} pattern XRegExp pattern using `{{name}}` for embedded subpatterns. Allows\n     *   `({{name}})` as shorthand for `(?<name>{{name}})`. Patterns cannot be embedded within\n     *   character classes.\n     * @param {Object} subs Lookup object for named subpatterns. Values can be strings or regexes. A\n     *   leading `^` and trailing unescaped `$` are stripped from subpatterns, if both are present.\n     * @param {String} [flags] Any combination of XRegExp flags.\n     * @returns {RegExp} Regex with interpolated subpatterns.\n     * @example\n     *\n     * const time = XRegExp.build('(?x)^ {{hours}} ({{minutes}}) $', {\n     *   hours: XRegExp.build('{{h12}} : | {{h24}}', {\n     *     h12: /1[0-2]|0?[1-9]/,\n     *     h24: /2[0-3]|[01][0-9]/\n     *   }, 'x'),\n     *   minutes: /^[0-5][0-9]$/\n     * });\n     * time.test('10:59'); // -> true\n     * XRegExp.exec('10:59', time).minutes; // -> '59'\n     */\n    XRegExp.build = function (pattern, subs, flags) {\n        flags = flags || '';\n        // Used with `asXRegExp` calls for `pattern` and subpatterns in `subs`, to work around how\n        // some browsers convert `RegExp('\\n')` to a regex that contains the literal characters `\\`\n        // and `n`. See more details at <https://github.com/slevithan/xregexp/pull/163>.\n        var addFlagX = flags.indexOf('x') !== -1;\n        var inlineFlags = /^\\(\\?([\\w$]+)\\)/.exec(pattern);\n        // Add flags within a leading mode modifier to the overall pattern's flags\n        if (inlineFlags) {\n            flags = XRegExp._clipDuplicates(flags + inlineFlags[1]);\n        }\n\n        var data = {};\n        for (var p in subs) {\n            if (subs.hasOwnProperty(p)) {\n                // Passing to XRegExp enables extended syntax and ensures independent validity,\n                // lest an unescaped `(`, `)`, `[`, or trailing `\\` breaks the `(?:)` wrapper. For\n                // subpatterns provided as native regexes, it dies on octals and adds the property\n                // used to hold extended regex instance data, for simplicity.\n                var sub = asXRegExp(subs[p], addFlagX);\n                data[p] = {\n                    // Deanchoring allows embedding independently useful anchored regexes. If you\n                    // really need to keep your anchors, double them (i.e., `^^...$$`).\n                    pattern: deanchor(sub.source),\n                    names: sub[REGEX_DATA].captureNames || []\n                };\n            }\n        }\n\n        // Passing to XRegExp dies on octals and ensures the outer pattern is independently valid;\n        // helps keep this simple. Named captures will be put back.\n        var patternAsRegex = asXRegExp(pattern, addFlagX);\n\n        // 'Caps' is short for 'captures'\n        var numCaps = 0;\n        var numPriorCaps = void 0;\n        var numOuterCaps = 0;\n        var outerCapsMap = [0];\n        var outerCapNames = patternAsRegex[REGEX_DATA].captureNames || [];\n        var output = patternAsRegex.source.replace(parts, function ($0, $1, $2, $3, $4) {\n            var subName = $1 || $2;\n            var capName = void 0;\n            var intro = void 0;\n            var localCapIndex = void 0;\n            // Named subpattern\n            if (subName) {\n                if (!data.hasOwnProperty(subName)) {\n                    throw new ReferenceError('Undefined property ' + $0);\n                }\n                // Named subpattern was wrapped in a capturing group\n                if ($1) {\n                    capName = outerCapNames[numOuterCaps];\n                    outerCapsMap[++numOuterCaps] = ++numCaps;\n                    // If it's a named group, preserve the name. Otherwise, use the subpattern name\n                    // as the capture name\n                    intro = '(?<' + (capName || subName) + '>';\n                } else {\n                    intro = '(?:';\n                }\n                numPriorCaps = numCaps;\n                var rewrittenSubpattern = data[subName].pattern.replace(subParts, function (match, paren, backref) {\n                    // Capturing group\n                    if (paren) {\n                        capName = data[subName].names[numCaps - numPriorCaps];\n                        ++numCaps;\n                        // If the current capture has a name, preserve the name\n                        if (capName) {\n                            return '(?<' + capName + '>';\n                        }\n                        // Backreference\n                    } else if (backref) {\n                        localCapIndex = +backref - 1;\n                        // Rewrite the backreference\n                        return data[subName].names[localCapIndex] ?\n                        // Need to preserve the backreference name in case using flag `n`\n                        '\\\\k<' + data[subName].names[localCapIndex] + '>' : '\\\\' + (+backref + numPriorCaps);\n                    }\n                    return match;\n                });\n                return '' + intro + rewrittenSubpattern + ')';\n            }\n            // Capturing group\n            if ($3) {\n                capName = outerCapNames[numOuterCaps];\n                outerCapsMap[++numOuterCaps] = ++numCaps;\n                // If the current capture has a name, preserve the name\n                if (capName) {\n                    return '(?<' + capName + '>';\n                }\n                // Backreference\n            } else if ($4) {\n                localCapIndex = +$4 - 1;\n                // Rewrite the backreference\n                return outerCapNames[localCapIndex] ?\n                // Need to preserve the backreference name in case using flag `n`\n                '\\\\k<' + outerCapNames[localCapIndex] + '>' : '\\\\' + outerCapsMap[+$4];\n            }\n            return $0;\n        });\n\n        return XRegExp(output, flags);\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"Ijgx\":[function(require,module,exports) {\nvar global = arguments[3];\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp.matchRecursive 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2009-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Returns a match detail object composed of the provided values.\n     *\n     * @private\n     */\n    function row(name, value, start, end) {\n        return {\n            name: name,\n            value: value,\n            start: start,\n            end: end\n        };\n    }\n\n    /**\n     * Returns an array of match strings between outermost left and right delimiters, or an array of\n     * objects with detailed match parts and position data. An error is thrown if delimiters are\n     * unbalanced within the data.\n     *\n     * @memberOf XRegExp\n     * @param {String} str String to search.\n     * @param {String} left Left delimiter as an XRegExp pattern.\n     * @param {String} right Right delimiter as an XRegExp pattern.\n     * @param {String} [flags] Any native or XRegExp flags, used for the left and right delimiters.\n     * @param {Object} [options] Lets you specify `valueNames` and `escapeChar` options.\n     * @returns {Array} Array of matches, or an empty array.\n     * @example\n     *\n     * // Basic usage\n     * let str = '(t((e))s)t()(ing)';\n     * XRegExp.matchRecursive(str, '\\\\(', '\\\\)', 'g');\n     * // -> ['t((e))s', '', 'ing']\n     *\n     * // Extended information mode with valueNames\n     * str = 'Here is <div> <div>an</div></div> example';\n     * XRegExp.matchRecursive(str, '<div\\\\s*>', '</div>', 'gi', {\n     *   valueNames: ['between', 'left', 'match', 'right']\n     * });\n     * // -> [\n     * // {name: 'between', value: 'Here is ',       start: 0,  end: 8},\n     * // {name: 'left',    value: '<div>',          start: 8,  end: 13},\n     * // {name: 'match',   value: ' <div>an</div>', start: 13, end: 27},\n     * // {name: 'right',   value: '</div>',         start: 27, end: 33},\n     * // {name: 'between', value: ' example',       start: 33, end: 41}\n     * // ]\n     *\n     * // Omitting unneeded parts with null valueNames, and using escapeChar\n     * str = '...{1}.\\\\{{function(x,y){return {y:x}}}';\n     * XRegExp.matchRecursive(str, '{', '}', 'g', {\n     *   valueNames: ['literal', null, 'value', null],\n     *   escapeChar: '\\\\'\n     * });\n     * // -> [\n     * // {name: 'literal', value: '...',  start: 0, end: 3},\n     * // {name: 'value',   value: '1',    start: 4, end: 5},\n     * // {name: 'literal', value: '.\\\\{', start: 6, end: 9},\n     * // {name: 'value',   value: 'function(x,y){return {y:x}}', start: 10, end: 37}\n     * // ]\n     *\n     * // Sticky mode via flag y\n     * str = '<1><<<2>>><3>4<5>';\n     * XRegExp.matchRecursive(str, '<', '>', 'gy');\n     * // -> ['1', '<<2>>', '3']\n     */\n    XRegExp.matchRecursive = function (str, left, right, flags, options) {\n        flags = flags || '';\n        options = options || {};\n        var global = flags.indexOf('g') !== -1;\n        var sticky = flags.indexOf('y') !== -1;\n        // Flag `y` is controlled internally\n        var basicFlags = flags.replace(/y/g, '');\n        var escapeChar = options.escapeChar;\n        var vN = options.valueNames;\n        var output = [];\n        var openTokens = 0;\n        var delimStart = 0;\n        var delimEnd = 0;\n        var lastOuterEnd = 0;\n        var outerStart = void 0;\n        var innerStart = void 0;\n        var leftMatch = void 0;\n        var rightMatch = void 0;\n        var esc = void 0;\n        left = XRegExp(left, basicFlags);\n        right = XRegExp(right, basicFlags);\n\n        if (escapeChar) {\n            if (escapeChar.length > 1) {\n                throw new Error('Cannot use more than one escape character');\n            }\n            escapeChar = XRegExp.escape(escapeChar);\n            // Example of concatenated `esc` regex:\n            // `escapeChar`: '%'\n            // `left`: '<'\n            // `right`: '>'\n            // Regex is: /(?:%[\\S\\s]|(?:(?!<|>)[^%])+)+/\n            esc = new RegExp('(?:' + escapeChar + '[\\\\S\\\\s]|(?:(?!' +\n            // Using `XRegExp.union` safely rewrites backreferences in `left` and `right`.\n            // Intentionally not passing `basicFlags` to `XRegExp.union` since any syntax\n            // transformation resulting from those flags was already applied to `left` and\n            // `right` when they were passed through the XRegExp constructor above.\n            XRegExp.union([left, right], '', { conjunction: 'or' }).source + ')[^' + escapeChar + '])+)+',\n            // Flags `gy` not needed here\n            flags.replace(/[^imu]+/g, ''));\n        }\n\n        while (true) {\n            // If using an escape character, advance to the delimiter's next starting position,\n            // skipping any escaped characters in between\n            if (escapeChar) {\n                delimEnd += (XRegExp.exec(str, esc, delimEnd, 'sticky') || [''])[0].length;\n            }\n            leftMatch = XRegExp.exec(str, left, delimEnd);\n            rightMatch = XRegExp.exec(str, right, delimEnd);\n            // Keep the leftmost match only\n            if (leftMatch && rightMatch) {\n                if (leftMatch.index <= rightMatch.index) {\n                    rightMatch = null;\n                } else {\n                    leftMatch = null;\n                }\n            }\n            // Paths (LM: leftMatch, RM: rightMatch, OT: openTokens):\n            // LM | RM | OT | Result\n            // 1  | 0  | 1  | loop\n            // 1  | 0  | 0  | loop\n            // 0  | 1  | 1  | loop\n            // 0  | 1  | 0  | throw\n            // 0  | 0  | 1  | throw\n            // 0  | 0  | 0  | break\n            // The paths above don't include the sticky mode special case. The loop ends after the\n            // first completed match if not `global`.\n            if (leftMatch || rightMatch) {\n                delimStart = (leftMatch || rightMatch).index;\n                delimEnd = delimStart + (leftMatch || rightMatch)[0].length;\n            } else if (!openTokens) {\n                break;\n            }\n            if (sticky && !openTokens && delimStart > lastOuterEnd) {\n                break;\n            }\n            if (leftMatch) {\n                if (!openTokens) {\n                    outerStart = delimStart;\n                    innerStart = delimEnd;\n                }\n                ++openTokens;\n            } else if (rightMatch && openTokens) {\n                if (! --openTokens) {\n                    if (vN) {\n                        if (vN[0] && outerStart > lastOuterEnd) {\n                            output.push(row(vN[0], str.slice(lastOuterEnd, outerStart), lastOuterEnd, outerStart));\n                        }\n                        if (vN[1]) {\n                            output.push(row(vN[1], str.slice(outerStart, innerStart), outerStart, innerStart));\n                        }\n                        if (vN[2]) {\n                            output.push(row(vN[2], str.slice(innerStart, delimStart), innerStart, delimStart));\n                        }\n                        if (vN[3]) {\n                            output.push(row(vN[3], str.slice(delimStart, delimEnd), delimStart, delimEnd));\n                        }\n                    } else {\n                        output.push(str.slice(innerStart, delimStart));\n                    }\n                    lastOuterEnd = delimEnd;\n                    if (!global) {\n                        break;\n                    }\n                }\n            } else {\n                throw new Error('Unbalanced delimiter found in string');\n            }\n            // If the delimiter matched an empty string, avoid an infinite loop\n            if (delimStart === delimEnd) {\n                ++delimEnd;\n            }\n        }\n\n        if (global && !sticky && vN && vN[0] && str.length > lastOuterEnd) {\n            output.push(row(vN[0], str.slice(lastOuterEnd), lastOuterEnd, str.length));\n        }\n\n        return output;\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"Ax1H\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Base 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2008-2017 MIT License\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds base support for Unicode matching:\n     * - Adds syntax `\\p{..}` for matching Unicode tokens. Tokens can be inverted using `\\P{..}` or\n     *   `\\p{^..}`. Token names ignore case, spaces, hyphens, and underscores. You can omit the\n     *   braces for token names that are a single letter (e.g. `\\pL` or `PL`).\n     * - Adds flag A (astral), which enables 21-bit Unicode support.\n     * - Adds the `XRegExp.addUnicodeData` method used by other addons to provide character data.\n     *\n     * Unicode Base relies on externally provided Unicode character data. Official addons are\n     * available to provide data for Unicode categories, scripts, blocks, and properties.\n     *\n     * @requires XRegExp\n     */\n\n    // ==--------------------------==\n    // Private stuff\n    // ==--------------------------==\n\n    // Storage for Unicode data\n    var unicode = {};\n\n    // Reuse utils\n    var dec = XRegExp._dec;\n    var hex = XRegExp._hex;\n    var pad4 = XRegExp._pad4;\n\n    // Generates a token lookup name: lowercase, with hyphens, spaces, and underscores removed\n    function normalize(name) {\n        return name.replace(/[- _]+/g, '').toLowerCase();\n    }\n\n    // Gets the decimal code of a literal code unit, \\xHH, \\uHHHH, or a backslash-escaped literal\n    function charCode(chr) {\n        var esc = /^\\\\[xu](.+)/.exec(chr);\n        return esc ? dec(esc[1]) : chr.charCodeAt(chr[0] === '\\\\' ? 1 : 0);\n    }\n\n    // Inverts a list of ordered BMP characters and ranges\n    function invertBmp(range) {\n        var output = '';\n        var lastEnd = -1;\n\n        XRegExp.forEach(range, /(\\\\x..|\\\\u....|\\\\?[\\s\\S])(?:-(\\\\x..|\\\\u....|\\\\?[\\s\\S]))?/, function (m) {\n            var start = charCode(m[1]);\n            if (start > lastEnd + 1) {\n                output += '\\\\u' + pad4(hex(lastEnd + 1));\n                if (start > lastEnd + 2) {\n                    output += '-\\\\u' + pad4(hex(start - 1));\n                }\n            }\n            lastEnd = charCode(m[2] || m[1]);\n        });\n\n        if (lastEnd < 0xFFFF) {\n            output += '\\\\u' + pad4(hex(lastEnd + 1));\n            if (lastEnd < 0xFFFE) {\n                output += '-\\\\uFFFF';\n            }\n        }\n\n        return output;\n    }\n\n    // Generates an inverted BMP range on first use\n    function cacheInvertedBmp(slug) {\n        var prop = 'b!';\n        return unicode[slug][prop] || (unicode[slug][prop] = invertBmp(unicode[slug].bmp));\n    }\n\n    // Combines and optionally negates BMP and astral data\n    function buildAstral(slug, isNegated) {\n        var item = unicode[slug];\n        var combined = '';\n\n        if (item.bmp && !item.isBmpLast) {\n            combined = '[' + item.bmp + ']' + (item.astral ? '|' : '');\n        }\n        if (item.astral) {\n            combined += item.astral;\n        }\n        if (item.isBmpLast && item.bmp) {\n            combined += (item.astral ? '|' : '') + '[' + item.bmp + ']';\n        }\n\n        // Astral Unicode tokens always match a code point, never a code unit\n        return isNegated ? '(?:(?!' + combined + ')(?:[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\0-\\uFFFF]))' : '(?:' + combined + ')';\n    }\n\n    // Builds a complete astral pattern on first use\n    function cacheAstral(slug, isNegated) {\n        var prop = isNegated ? 'a!' : 'a=';\n        return unicode[slug][prop] || (unicode[slug][prop] = buildAstral(slug, isNegated));\n    }\n\n    // ==--------------------------==\n    // Core functionality\n    // ==--------------------------==\n\n    /*\n     * Add astral mode (flag A) and Unicode token syntax: `\\p{..}`, `\\P{..}`, `\\p{^..}`, `\\pC`.\n     */\n    XRegExp.addToken(\n    // Use `*` instead of `+` to avoid capturing `^` as the token name in `\\p{^}`\n    /\\\\([pP])(?:{(\\^?)([^}]*)}|([A-Za-z]))/, function (match, scope, flags) {\n        var ERR_DOUBLE_NEG = 'Invalid double negation ';\n        var ERR_UNKNOWN_NAME = 'Unknown Unicode token ';\n        var ERR_UNKNOWN_REF = 'Unicode token missing data ';\n        var ERR_ASTRAL_ONLY = 'Astral mode required for Unicode token ';\n        var ERR_ASTRAL_IN_CLASS = 'Astral mode does not support Unicode tokens within character classes';\n        // Negated via \\P{..} or \\p{^..}\n        var isNegated = match[1] === 'P' || !!match[2];\n        // Switch from BMP (0-FFFF) to astral (0-10FFFF) mode via flag A\n        var isAstralMode = flags.indexOf('A') !== -1;\n        // Token lookup name. Check `[4]` first to avoid passing `undefined` via `\\p{}`\n        var slug = normalize(match[4] || match[3]);\n        // Token data object\n        var item = unicode[slug];\n\n        if (match[1] === 'P' && match[2]) {\n            throw new SyntaxError(ERR_DOUBLE_NEG + match[0]);\n        }\n        if (!unicode.hasOwnProperty(slug)) {\n            throw new SyntaxError(ERR_UNKNOWN_NAME + match[0]);\n        }\n\n        // Switch to the negated form of the referenced Unicode token\n        if (item.inverseOf) {\n            slug = normalize(item.inverseOf);\n            if (!unicode.hasOwnProperty(slug)) {\n                throw new ReferenceError(ERR_UNKNOWN_REF + match[0] + ' -> ' + item.inverseOf);\n            }\n            item = unicode[slug];\n            isNegated = !isNegated;\n        }\n\n        if (!(item.bmp || isAstralMode)) {\n            throw new SyntaxError(ERR_ASTRAL_ONLY + match[0]);\n        }\n        if (isAstralMode) {\n            if (scope === 'class') {\n                throw new SyntaxError(ERR_ASTRAL_IN_CLASS);\n            }\n\n            return cacheAstral(slug, isNegated);\n        }\n\n        return scope === 'class' ? isNegated ? cacheInvertedBmp(slug) : item.bmp : (isNegated ? '[^' : '[') + item.bmp + ']';\n    }, {\n        scope: 'all',\n        optionalFlags: 'A',\n        leadChar: '\\\\'\n    });\n\n    /**\n     * Adds to the list of Unicode tokens that XRegExp regexes can match via `\\p` or `\\P`.\n     *\n     * @memberOf XRegExp\n     * @param {Array} data Objects with named character ranges. Each object may have properties\n     *   `name`, `alias`, `isBmpLast`, `inverseOf`, `bmp`, and `astral`. All but `name` are\n     *   optional, although one of `bmp` or `astral` is required (unless `inverseOf` is set). If\n     *   `astral` is absent, the `bmp` data is used for BMP and astral modes. If `bmp` is absent,\n     *   the name errors in BMP mode but works in astral mode. If both `bmp` and `astral` are\n     *   provided, the `bmp` data only is used in BMP mode, and the combination of `bmp` and\n     *   `astral` data is used in astral mode. `isBmpLast` is needed when a token matches orphan\n     *   high surrogates *and* uses surrogate pairs to match astral code points. The `bmp` and\n     *   `astral` data should be a combination of literal characters and `\\xHH` or `\\uHHHH` escape\n     *   sequences, with hyphens to create ranges. Any regex metacharacters in the data should be\n     *   escaped, apart from range-creating hyphens. The `astral` data can additionally use\n     *   character classes and alternation, and should use surrogate pairs to represent astral code\n     *   points. `inverseOf` can be used to avoid duplicating character data if a Unicode token is\n     *   defined as the exact inverse of another token.\n     * @example\n     *\n     * // Basic use\n     * XRegExp.addUnicodeData([{\n     *   name: 'XDigit',\n     *   alias: 'Hexadecimal',\n     *   bmp: '0-9A-Fa-f'\n     * }]);\n     * XRegExp('\\\\p{XDigit}:\\\\p{Hexadecimal}+').test('0:3D'); // -> true\n     */\n    XRegExp.addUnicodeData = function (data) {\n        var ERR_NO_NAME = 'Unicode token requires name';\n        var ERR_NO_DATA = 'Unicode token has no character data ';\n        var item = void 0;\n\n        for (var i = 0; i < data.length; ++i) {\n            item = data[i];\n            if (!item.name) {\n                throw new Error(ERR_NO_NAME);\n            }\n            if (!(item.inverseOf || item.bmp || item.astral)) {\n                throw new Error(ERR_NO_DATA + item.name);\n            }\n            unicode[normalize(item.name)] = item;\n            if (item.alias) {\n                unicode[normalize(item.alias)] = item;\n            }\n        }\n\n        // Reset the pattern cache used by the `XRegExp` constructor, since the same pattern and\n        // flags might now produce different results\n        XRegExp.cache.flush('patterns');\n    };\n\n    /**\n     * @ignore\n     *\n     * Return a reference to the internal Unicode definition structure for the given Unicode\n     * Property if the given name is a legal Unicode Property for use in XRegExp `\\p` or `\\P` regex\n     * constructs.\n     *\n     * @memberOf XRegExp\n     * @param {String} name Name by which the Unicode Property may be recognized (case-insensitive),\n     *   e.g. `'N'` or `'Number'`. The given name is matched against all registered Unicode\n     *   Properties and Property Aliases.\n     * @returns {Object} Reference to definition structure when the name matches a Unicode Property.\n     *\n     * @note\n     * For more info on Unicode Properties, see also http://unicode.org/reports/tr18/#Categories.\n     *\n     * @note\n     * This method is *not* part of the officially documented API and may change or be removed in\n     * the future. It is meant for userland code that wishes to reuse the (large) internal Unicode\n     * structures set up by XRegExp.\n     */\n    XRegExp._getUnicodeProperty = function (name) {\n        var slug = normalize(name);\n        return unicode[slug];\n    };\n};\n\nmodule.exports = exports['default'];\n},{}],\"tuuI\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Blocks 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for all Unicode blocks. Block names use the prefix 'In'. E.g.,\n     * `\\p{InBasicLatin}`. Token names are case insensitive, and any spaces, hyphens, and\n     * underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Blocks');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'InAdlam',\n        astral: '\\uD83A[\\uDD00-\\uDD5F]'\n    }, {\n        name: 'InAegean_Numbers',\n        astral: '\\uD800[\\uDD00-\\uDD3F]'\n    }, {\n        name: 'InAhom',\n        astral: '\\uD805[\\uDF00-\\uDF3F]'\n    }, {\n        name: 'InAlchemical_Symbols',\n        astral: '\\uD83D[\\uDF00-\\uDF7F]'\n    }, {\n        name: 'InAlphabetic_Presentation_Forms',\n        bmp: '\\uFB00-\\uFB4F'\n    }, {\n        name: 'InAnatolian_Hieroglyphs',\n        astral: '\\uD811[\\uDC00-\\uDE7F]'\n    }, {\n        name: 'InAncient_Greek_Musical_Notation',\n        astral: '\\uD834[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InAncient_Greek_Numbers',\n        astral: '\\uD800[\\uDD40-\\uDD8F]'\n    }, {\n        name: 'InAncient_Symbols',\n        astral: '\\uD800[\\uDD90-\\uDDCF]'\n    }, {\n        name: 'InArabic',\n        bmp: '\\u0600-\\u06FF'\n    }, {\n        name: 'InArabic_Extended_A',\n        bmp: '\\u08A0-\\u08FF'\n    }, {\n        name: 'InArabic_Mathematical_Alphabetic_Symbols',\n        astral: '\\uD83B[\\uDE00-\\uDEFF]'\n    }, {\n        name: 'InArabic_Presentation_Forms_A',\n        bmp: '\\uFB50-\\uFDFF'\n    }, {\n        name: 'InArabic_Presentation_Forms_B',\n        bmp: '\\uFE70-\\uFEFF'\n    }, {\n        name: 'InArabic_Supplement',\n        bmp: '\\u0750-\\u077F'\n    }, {\n        name: 'InArmenian',\n        bmp: '\\u0530-\\u058F'\n    }, {\n        name: 'InArrows',\n        bmp: '\\u2190-\\u21FF'\n    }, {\n        name: 'InAvestan',\n        astral: '\\uD802[\\uDF00-\\uDF3F]'\n    }, {\n        name: 'InBalinese',\n        bmp: '\\u1B00-\\u1B7F'\n    }, {\n        name: 'InBamum',\n        bmp: '\\uA6A0-\\uA6FF'\n    }, {\n        name: 'InBamum_Supplement',\n        astral: '\\uD81A[\\uDC00-\\uDE3F]'\n    }, {\n        name: 'InBasic_Latin',\n        bmp: '\\0-\\x7F'\n    }, {\n        name: 'InBassa_Vah',\n        astral: '\\uD81A[\\uDED0-\\uDEFF]'\n    }, {\n        name: 'InBatak',\n        bmp: '\\u1BC0-\\u1BFF'\n    }, {\n        name: 'InBengali',\n        bmp: '\\u0980-\\u09FF'\n    }, {\n        name: 'InBhaiksuki',\n        astral: '\\uD807[\\uDC00-\\uDC6F]'\n    }, {\n        name: 'InBlock_Elements',\n        bmp: '\\u2580-\\u259F'\n    }, {\n        name: 'InBopomofo',\n        bmp: '\\u3100-\\u312F'\n    }, {\n        name: 'InBopomofo_Extended',\n        bmp: '\\u31A0-\\u31BF'\n    }, {\n        name: 'InBox_Drawing',\n        bmp: '\\u2500-\\u257F'\n    }, {\n        name: 'InBrahmi',\n        astral: '\\uD804[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InBraille_Patterns',\n        bmp: '\\u2800-\\u28FF'\n    }, {\n        name: 'InBuginese',\n        bmp: '\\u1A00-\\u1A1F'\n    }, {\n        name: 'InBuhid',\n        bmp: '\\u1740-\\u175F'\n    }, {\n        name: 'InByzantine_Musical_Symbols',\n        astral: '\\uD834[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InCJK_Compatibility',\n        bmp: '\\u3300-\\u33FF'\n    }, {\n        name: 'InCJK_Compatibility_Forms',\n        bmp: '\\uFE30-\\uFE4F'\n    }, {\n        name: 'InCJK_Compatibility_Ideographs',\n        bmp: '\\uF900-\\uFAFF'\n    }, {\n        name: 'InCJK_Compatibility_Ideographs_Supplement',\n        astral: '\\uD87E[\\uDC00-\\uDE1F]'\n    }, {\n        name: 'InCJK_Radicals_Supplement',\n        bmp: '\\u2E80-\\u2EFF'\n    }, {\n        name: 'InCJK_Strokes',\n        bmp: '\\u31C0-\\u31EF'\n    }, {\n        name: 'InCJK_Symbols_and_Punctuation',\n        bmp: '\\u3000-\\u303F'\n    }, {\n        name: 'InCJK_Unified_Ideographs',\n        bmp: '\\u4E00-\\u9FFF'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_A',\n        bmp: '\\u3400-\\u4DBF'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_B',\n        astral: '[\\uD840-\\uD868][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDEDF]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_C',\n        astral: '\\uD869[\\uDF00-\\uDFFF]|[\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF3F]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_D',\n        astral: '\\uD86D[\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1F]'\n    }, {\n        name: 'InCJK_Unified_Ideographs_Extension_E',\n        astral: '\\uD86E[\\uDC20-\\uDFFF]|[\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD873[\\uDC00-\\uDEAF]'\n    }, {\n        name: 'InCarian',\n        astral: '\\uD800[\\uDEA0-\\uDEDF]'\n    }, {\n        name: 'InCaucasian_Albanian',\n        astral: '\\uD801[\\uDD30-\\uDD6F]'\n    }, {\n        name: 'InChakma',\n        astral: '\\uD804[\\uDD00-\\uDD4F]'\n    }, {\n        name: 'InCham',\n        bmp: '\\uAA00-\\uAA5F'\n    }, {\n        name: 'InCherokee',\n        bmp: '\\u13A0-\\u13FF'\n    }, {\n        name: 'InCherokee_Supplement',\n        bmp: '\\uAB70-\\uABBF'\n    }, {\n        name: 'InCombining_Diacritical_Marks',\n        bmp: '\\u0300-\\u036F'\n    }, {\n        name: 'InCombining_Diacritical_Marks_Extended',\n        bmp: '\\u1AB0-\\u1AFF'\n    }, {\n        name: 'InCombining_Diacritical_Marks_Supplement',\n        bmp: '\\u1DC0-\\u1DFF'\n    }, {\n        name: 'InCombining_Diacritical_Marks_for_Symbols',\n        bmp: '\\u20D0-\\u20FF'\n    }, {\n        name: 'InCombining_Half_Marks',\n        bmp: '\\uFE20-\\uFE2F'\n    }, {\n        name: 'InCommon_Indic_Number_Forms',\n        bmp: '\\uA830-\\uA83F'\n    }, {\n        name: 'InControl_Pictures',\n        bmp: '\\u2400-\\u243F'\n    }, {\n        name: 'InCoptic',\n        bmp: '\\u2C80-\\u2CFF'\n    }, {\n        name: 'InCoptic_Epact_Numbers',\n        astral: '\\uD800[\\uDEE0-\\uDEFF]'\n    }, {\n        name: 'InCounting_Rod_Numerals',\n        astral: '\\uD834[\\uDF60-\\uDF7F]'\n    }, {\n        name: 'InCuneiform',\n        astral: '\\uD808[\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InCuneiform_Numbers_and_Punctuation',\n        astral: '\\uD809[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InCurrency_Symbols',\n        bmp: '\\u20A0-\\u20CF'\n    }, {\n        name: 'InCypriot_Syllabary',\n        astral: '\\uD802[\\uDC00-\\uDC3F]'\n    }, {\n        name: 'InCyrillic',\n        bmp: '\\u0400-\\u04FF'\n    }, {\n        name: 'InCyrillic_Extended_A',\n        bmp: '\\u2DE0-\\u2DFF'\n    }, {\n        name: 'InCyrillic_Extended_B',\n        bmp: '\\uA640-\\uA69F'\n    }, {\n        name: 'InCyrillic_Extended_C',\n        bmp: '\\u1C80-\\u1C8F'\n    }, {\n        name: 'InCyrillic_Supplement',\n        bmp: '\\u0500-\\u052F'\n    }, {\n        name: 'InDeseret',\n        astral: '\\uD801[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'InDevanagari',\n        bmp: '\\u0900-\\u097F'\n    }, {\n        name: 'InDevanagari_Extended',\n        bmp: '\\uA8E0-\\uA8FF'\n    }, {\n        name: 'InDingbats',\n        bmp: '\\u2700-\\u27BF'\n    }, {\n        name: 'InDomino_Tiles',\n        astral: '\\uD83C[\\uDC30-\\uDC9F]'\n    }, {\n        name: 'InDuployan',\n        astral: '\\uD82F[\\uDC00-\\uDC9F]'\n    }, {\n        name: 'InEarly_Dynastic_Cuneiform',\n        astral: '\\uD809[\\uDC80-\\uDD4F]'\n    }, {\n        name: 'InEgyptian_Hieroglyphs',\n        astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InElbasan',\n        astral: '\\uD801[\\uDD00-\\uDD2F]'\n    }, {\n        name: 'InEmoticons',\n        astral: '\\uD83D[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InEnclosed_Alphanumeric_Supplement',\n        astral: '\\uD83C[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InEnclosed_Alphanumerics',\n        bmp: '\\u2460-\\u24FF'\n    }, {\n        name: 'InEnclosed_CJK_Letters_and_Months',\n        bmp: '\\u3200-\\u32FF'\n    }, {\n        name: 'InEnclosed_Ideographic_Supplement',\n        astral: '\\uD83C[\\uDE00-\\uDEFF]'\n    }, {\n        name: 'InEthiopic',\n        bmp: '\\u1200-\\u137F'\n    }, {\n        name: 'InEthiopic_Extended',\n        bmp: '\\u2D80-\\u2DDF'\n    }, {\n        name: 'InEthiopic_Extended_A',\n        bmp: '\\uAB00-\\uAB2F'\n    }, {\n        name: 'InEthiopic_Supplement',\n        bmp: '\\u1380-\\u139F'\n    }, {\n        name: 'InGeneral_Punctuation',\n        bmp: '\\u2000-\\u206F'\n    }, {\n        name: 'InGeometric_Shapes',\n        bmp: '\\u25A0-\\u25FF'\n    }, {\n        name: 'InGeometric_Shapes_Extended',\n        astral: '\\uD83D[\\uDF80-\\uDFFF]'\n    }, {\n        name: 'InGeorgian',\n        bmp: '\\u10A0-\\u10FF'\n    }, {\n        name: 'InGeorgian_Supplement',\n        bmp: '\\u2D00-\\u2D2F'\n    }, {\n        name: 'InGlagolitic',\n        bmp: '\\u2C00-\\u2C5F'\n    }, {\n        name: 'InGlagolitic_Supplement',\n        astral: '\\uD838[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InGothic',\n        astral: '\\uD800[\\uDF30-\\uDF4F]'\n    }, {\n        name: 'InGrantha',\n        astral: '\\uD804[\\uDF00-\\uDF7F]'\n    }, {\n        name: 'InGreek_Extended',\n        bmp: '\\u1F00-\\u1FFF'\n    }, {\n        name: 'InGreek_and_Coptic',\n        bmp: '\\u0370-\\u03FF'\n    }, {\n        name: 'InGujarati',\n        bmp: '\\u0A80-\\u0AFF'\n    }, {\n        name: 'InGurmukhi',\n        bmp: '\\u0A00-\\u0A7F'\n    }, {\n        name: 'InHalfwidth_and_Fullwidth_Forms',\n        bmp: '\\uFF00-\\uFFEF'\n    }, {\n        name: 'InHangul_Compatibility_Jamo',\n        bmp: '\\u3130-\\u318F'\n    }, {\n        name: 'InHangul_Jamo',\n        bmp: '\\u1100-\\u11FF'\n    }, {\n        name: 'InHangul_Jamo_Extended_A',\n        bmp: '\\uA960-\\uA97F'\n    }, {\n        name: 'InHangul_Jamo_Extended_B',\n        bmp: '\\uD7B0-\\uD7FF'\n    }, {\n        name: 'InHangul_Syllables',\n        bmp: '\\uAC00-\\uD7AF'\n    }, {\n        name: 'InHanunoo',\n        bmp: '\\u1720-\\u173F'\n    }, {\n        name: 'InHatran',\n        astral: '\\uD802[\\uDCE0-\\uDCFF]'\n    }, {\n        name: 'InHebrew',\n        bmp: '\\u0590-\\u05FF'\n    }, {\n        name: 'InHigh_Private_Use_Surrogates',\n        bmp: '\\uDB80-\\uDBFF'\n    }, {\n        name: 'InHigh_Surrogates',\n        bmp: '\\uD800-\\uDB7F'\n    }, {\n        name: 'InHiragana',\n        bmp: '\\u3040-\\u309F'\n    }, {\n        name: 'InIPA_Extensions',\n        bmp: '\\u0250-\\u02AF'\n    }, {\n        name: 'InIdeographic_Description_Characters',\n        bmp: '\\u2FF0-\\u2FFF'\n    }, {\n        name: 'InIdeographic_Symbols_and_Punctuation',\n        astral: '\\uD81B[\\uDFE0-\\uDFFF]'\n    }, {\n        name: 'InImperial_Aramaic',\n        astral: '\\uD802[\\uDC40-\\uDC5F]'\n    }, {\n        name: 'InInscriptional_Pahlavi',\n        astral: '\\uD802[\\uDF60-\\uDF7F]'\n    }, {\n        name: 'InInscriptional_Parthian',\n        astral: '\\uD802[\\uDF40-\\uDF5F]'\n    }, {\n        name: 'InJavanese',\n        bmp: '\\uA980-\\uA9DF'\n    }, {\n        name: 'InKaithi',\n        astral: '\\uD804[\\uDC80-\\uDCCF]'\n    }, {\n        name: 'InKana_Supplement',\n        astral: '\\uD82C[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InKanbun',\n        bmp: '\\u3190-\\u319F'\n    }, {\n        name: 'InKangxi_Radicals',\n        bmp: '\\u2F00-\\u2FDF'\n    }, {\n        name: 'InKannada',\n        bmp: '\\u0C80-\\u0CFF'\n    }, {\n        name: 'InKatakana',\n        bmp: '\\u30A0-\\u30FF'\n    }, {\n        name: 'InKatakana_Phonetic_Extensions',\n        bmp: '\\u31F0-\\u31FF'\n    }, {\n        name: 'InKayah_Li',\n        bmp: '\\uA900-\\uA92F'\n    }, {\n        name: 'InKharoshthi',\n        astral: '\\uD802[\\uDE00-\\uDE5F]'\n    }, {\n        name: 'InKhmer',\n        bmp: '\\u1780-\\u17FF'\n    }, {\n        name: 'InKhmer_Symbols',\n        bmp: '\\u19E0-\\u19FF'\n    }, {\n        name: 'InKhojki',\n        astral: '\\uD804[\\uDE00-\\uDE4F]'\n    }, {\n        name: 'InKhudawadi',\n        astral: '\\uD804[\\uDEB0-\\uDEFF]'\n    }, {\n        name: 'InLao',\n        bmp: '\\u0E80-\\u0EFF'\n    }, {\n        name: 'InLatin_Extended_Additional',\n        bmp: '\\u1E00-\\u1EFF'\n    }, {\n        name: 'InLatin_Extended_A',\n        bmp: '\\u0100-\\u017F'\n    }, {\n        name: 'InLatin_Extended_B',\n        bmp: '\\u0180-\\u024F'\n    }, {\n        name: 'InLatin_Extended_C',\n        bmp: '\\u2C60-\\u2C7F'\n    }, {\n        name: 'InLatin_Extended_D',\n        bmp: '\\uA720-\\uA7FF'\n    }, {\n        name: 'InLatin_Extended_E',\n        bmp: '\\uAB30-\\uAB6F'\n    }, {\n        name: 'InLatin_1_Supplement',\n        bmp: '\\x80-\\xFF'\n    }, {\n        name: 'InLepcha',\n        bmp: '\\u1C00-\\u1C4F'\n    }, {\n        name: 'InLetterlike_Symbols',\n        bmp: '\\u2100-\\u214F'\n    }, {\n        name: 'InLimbu',\n        bmp: '\\u1900-\\u194F'\n    }, {\n        name: 'InLinear_A',\n        astral: '\\uD801[\\uDE00-\\uDF7F]'\n    }, {\n        name: 'InLinear_B_Ideograms',\n        astral: '\\uD800[\\uDC80-\\uDCFF]'\n    }, {\n        name: 'InLinear_B_Syllabary',\n        astral: '\\uD800[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InLisu',\n        bmp: '\\uA4D0-\\uA4FF'\n    }, {\n        name: 'InLow_Surrogates',\n        bmp: '\\uDC00-\\uDFFF'\n    }, {\n        name: 'InLycian',\n        astral: '\\uD800[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'InLydian',\n        astral: '\\uD802[\\uDD20-\\uDD3F]'\n    }, {\n        name: 'InMahajani',\n        astral: '\\uD804[\\uDD50-\\uDD7F]'\n    }, {\n        name: 'InMahjong_Tiles',\n        astral: '\\uD83C[\\uDC00-\\uDC2F]'\n    }, {\n        name: 'InMalayalam',\n        bmp: '\\u0D00-\\u0D7F'\n    }, {\n        name: 'InMandaic',\n        bmp: '\\u0840-\\u085F'\n    }, {\n        name: 'InManichaean',\n        astral: '\\uD802[\\uDEC0-\\uDEFF]'\n    }, {\n        name: 'InMarchen',\n        astral: '\\uD807[\\uDC70-\\uDCBF]'\n    }, {\n        name: 'InMathematical_Alphanumeric_Symbols',\n        astral: '\\uD835[\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InMathematical_Operators',\n        bmp: '\\u2200-\\u22FF'\n    }, {\n        name: 'InMeetei_Mayek',\n        bmp: '\\uABC0-\\uABFF'\n    }, {\n        name: 'InMeetei_Mayek_Extensions',\n        bmp: '\\uAAE0-\\uAAFF'\n    }, {\n        name: 'InMende_Kikakui',\n        astral: '\\uD83A[\\uDC00-\\uDCDF]'\n    }, {\n        name: 'InMeroitic_Cursive',\n        astral: '\\uD802[\\uDDA0-\\uDDFF]'\n    }, {\n        name: 'InMeroitic_Hieroglyphs',\n        astral: '\\uD802[\\uDD80-\\uDD9F]'\n    }, {\n        name: 'InMiao',\n        astral: '\\uD81B[\\uDF00-\\uDF9F]'\n    }, {\n        name: 'InMiscellaneous_Mathematical_Symbols_A',\n        bmp: '\\u27C0-\\u27EF'\n    }, {\n        name: 'InMiscellaneous_Mathematical_Symbols_B',\n        bmp: '\\u2980-\\u29FF'\n    }, {\n        name: 'InMiscellaneous_Symbols',\n        bmp: '\\u2600-\\u26FF'\n    }, {\n        name: 'InMiscellaneous_Symbols_and_Arrows',\n        bmp: '\\u2B00-\\u2BFF'\n    }, {\n        name: 'InMiscellaneous_Symbols_and_Pictographs',\n        astral: '\\uD83C[\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDDFF]'\n    }, {\n        name: 'InMiscellaneous_Technical',\n        bmp: '\\u2300-\\u23FF'\n    }, {\n        name: 'InModi',\n        astral: '\\uD805[\\uDE00-\\uDE5F]'\n    }, {\n        name: 'InModifier_Tone_Letters',\n        bmp: '\\uA700-\\uA71F'\n    }, {\n        name: 'InMongolian',\n        bmp: '\\u1800-\\u18AF'\n    }, {\n        name: 'InMongolian_Supplement',\n        astral: '\\uD805[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InMro',\n        astral: '\\uD81A[\\uDE40-\\uDE6F]'\n    }, {\n        name: 'InMultani',\n        astral: '\\uD804[\\uDE80-\\uDEAF]'\n    }, {\n        name: 'InMusical_Symbols',\n        astral: '\\uD834[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InMyanmar',\n        bmp: '\\u1000-\\u109F'\n    }, {\n        name: 'InMyanmar_Extended_A',\n        bmp: '\\uAA60-\\uAA7F'\n    }, {\n        name: 'InMyanmar_Extended_B',\n        bmp: '\\uA9E0-\\uA9FF'\n    }, {\n        name: 'InNKo',\n        bmp: '\\u07C0-\\u07FF'\n    }, {\n        name: 'InNabataean',\n        astral: '\\uD802[\\uDC80-\\uDCAF]'\n    }, {\n        name: 'InNew_Tai_Lue',\n        bmp: '\\u1980-\\u19DF'\n    }, {\n        name: 'InNewa',\n        astral: '\\uD805[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InNumber_Forms',\n        bmp: '\\u2150-\\u218F'\n    }, {\n        name: 'InOgham',\n        bmp: '\\u1680-\\u169F'\n    }, {\n        name: 'InOl_Chiki',\n        bmp: '\\u1C50-\\u1C7F'\n    }, {\n        name: 'InOld_Hungarian',\n        astral: '\\uD803[\\uDC80-\\uDCFF]'\n    }, {\n        name: 'InOld_Italic',\n        astral: '\\uD800[\\uDF00-\\uDF2F]'\n    }, {\n        name: 'InOld_North_Arabian',\n        astral: '\\uD802[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'InOld_Permic',\n        astral: '\\uD800[\\uDF50-\\uDF7F]'\n    }, {\n        name: 'InOld_Persian',\n        astral: '\\uD800[\\uDFA0-\\uDFDF]'\n    }, {\n        name: 'InOld_South_Arabian',\n        astral: '\\uD802[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InOld_Turkic',\n        astral: '\\uD803[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'InOptical_Character_Recognition',\n        bmp: '\\u2440-\\u245F'\n    }, {\n        name: 'InOriya',\n        bmp: '\\u0B00-\\u0B7F'\n    }, {\n        name: 'InOrnamental_Dingbats',\n        astral: '\\uD83D[\\uDE50-\\uDE7F]'\n    }, {\n        name: 'InOsage',\n        astral: '\\uD801[\\uDCB0-\\uDCFF]'\n    }, {\n        name: 'InOsmanya',\n        astral: '\\uD801[\\uDC80-\\uDCAF]'\n    }, {\n        name: 'InPahawh_Hmong',\n        astral: '\\uD81A[\\uDF00-\\uDF8F]'\n    }, {\n        name: 'InPalmyrene',\n        astral: '\\uD802[\\uDC60-\\uDC7F]'\n    }, {\n        name: 'InPau_Cin_Hau',\n        astral: '\\uD806[\\uDEC0-\\uDEFF]'\n    }, {\n        name: 'InPhags_pa',\n        bmp: '\\uA840-\\uA87F'\n    }, {\n        name: 'InPhaistos_Disc',\n        astral: '\\uD800[\\uDDD0-\\uDDFF]'\n    }, {\n        name: 'InPhoenician',\n        astral: '\\uD802[\\uDD00-\\uDD1F]'\n    }, {\n        name: 'InPhonetic_Extensions',\n        bmp: '\\u1D00-\\u1D7F'\n    }, {\n        name: 'InPhonetic_Extensions_Supplement',\n        bmp: '\\u1D80-\\u1DBF'\n    }, {\n        name: 'InPlaying_Cards',\n        astral: '\\uD83C[\\uDCA0-\\uDCFF]'\n    }, {\n        name: 'InPrivate_Use_Area',\n        bmp: '\\uE000-\\uF8FF'\n    }, {\n        name: 'InPsalter_Pahlavi',\n        astral: '\\uD802[\\uDF80-\\uDFAF]'\n    }, {\n        name: 'InRejang',\n        bmp: '\\uA930-\\uA95F'\n    }, {\n        name: 'InRumi_Numeral_Symbols',\n        astral: '\\uD803[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'InRunic',\n        bmp: '\\u16A0-\\u16FF'\n    }, {\n        name: 'InSamaritan',\n        bmp: '\\u0800-\\u083F'\n    }, {\n        name: 'InSaurashtra',\n        bmp: '\\uA880-\\uA8DF'\n    }, {\n        name: 'InSharada',\n        astral: '\\uD804[\\uDD80-\\uDDDF]'\n    }, {\n        name: 'InShavian',\n        astral: '\\uD801[\\uDC50-\\uDC7F]'\n    }, {\n        name: 'InShorthand_Format_Controls',\n        astral: '\\uD82F[\\uDCA0-\\uDCAF]'\n    }, {\n        name: 'InSiddham',\n        astral: '\\uD805[\\uDD80-\\uDDFF]'\n    }, {\n        name: 'InSinhala',\n        bmp: '\\u0D80-\\u0DFF'\n    }, {\n        name: 'InSinhala_Archaic_Numbers',\n        astral: '\\uD804[\\uDDE0-\\uDDFF]'\n    }, {\n        name: 'InSmall_Form_Variants',\n        bmp: '\\uFE50-\\uFE6F'\n    }, {\n        name: 'InSora_Sompeng',\n        astral: '\\uD804[\\uDCD0-\\uDCFF]'\n    }, {\n        name: 'InSpacing_Modifier_Letters',\n        bmp: '\\u02B0-\\u02FF'\n    }, {\n        name: 'InSpecials',\n        bmp: '\\uFFF0-\\uFFFF'\n    }, {\n        name: 'InSundanese',\n        bmp: '\\u1B80-\\u1BBF'\n    }, {\n        name: 'InSundanese_Supplement',\n        bmp: '\\u1CC0-\\u1CCF'\n    }, {\n        name: 'InSuperscripts_and_Subscripts',\n        bmp: '\\u2070-\\u209F'\n    }, {\n        name: 'InSupplemental_Arrows_A',\n        bmp: '\\u27F0-\\u27FF'\n    }, {\n        name: 'InSupplemental_Arrows_B',\n        bmp: '\\u2900-\\u297F'\n    }, {\n        name: 'InSupplemental_Arrows_C',\n        astral: '\\uD83E[\\uDC00-\\uDCFF]'\n    }, {\n        name: 'InSupplemental_Mathematical_Operators',\n        bmp: '\\u2A00-\\u2AFF'\n    }, {\n        name: 'InSupplemental_Punctuation',\n        bmp: '\\u2E00-\\u2E7F'\n    }, {\n        name: 'InSupplemental_Symbols_and_Pictographs',\n        astral: '\\uD83E[\\uDD00-\\uDDFF]'\n    }, {\n        name: 'InSupplementary_Private_Use_Area_A',\n        astral: '[\\uDB80-\\uDBBF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InSupplementary_Private_Use_Area_B',\n        astral: '[\\uDBC0-\\uDBFF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InSutton_SignWriting',\n        astral: '\\uD836[\\uDC00-\\uDEAF]'\n    }, {\n        name: 'InSyloti_Nagri',\n        bmp: '\\uA800-\\uA82F'\n    }, {\n        name: 'InSyriac',\n        bmp: '\\u0700-\\u074F'\n    }, {\n        name: 'InTagalog',\n        bmp: '\\u1700-\\u171F'\n    }, {\n        name: 'InTagbanwa',\n        bmp: '\\u1760-\\u177F'\n    }, {\n        name: 'InTags',\n        astral: '\\uDB40[\\uDC00-\\uDC7F]'\n    }, {\n        name: 'InTai_Le',\n        bmp: '\\u1950-\\u197F'\n    }, {\n        name: 'InTai_Tham',\n        bmp: '\\u1A20-\\u1AAF'\n    }, {\n        name: 'InTai_Viet',\n        bmp: '\\uAA80-\\uAADF'\n    }, {\n        name: 'InTai_Xuan_Jing_Symbols',\n        astral: '\\uD834[\\uDF00-\\uDF5F]'\n    }, {\n        name: 'InTakri',\n        astral: '\\uD805[\\uDE80-\\uDECF]'\n    }, {\n        name: 'InTamil',\n        bmp: '\\u0B80-\\u0BFF'\n    }, {\n        name: 'InTangut',\n        astral: '[\\uD81C-\\uD821][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'InTangut_Components',\n        astral: '\\uD822[\\uDC00-\\uDEFF]'\n    }, {\n        name: 'InTelugu',\n        bmp: '\\u0C00-\\u0C7F'\n    }, {\n        name: 'InThaana',\n        bmp: '\\u0780-\\u07BF'\n    }, {\n        name: 'InThai',\n        bmp: '\\u0E00-\\u0E7F'\n    }, {\n        name: 'InTibetan',\n        bmp: '\\u0F00-\\u0FFF'\n    }, {\n        name: 'InTifinagh',\n        bmp: '\\u2D30-\\u2D7F'\n    }, {\n        name: 'InTirhuta',\n        astral: '\\uD805[\\uDC80-\\uDCDF]'\n    }, {\n        name: 'InTransport_and_Map_Symbols',\n        astral: '\\uD83D[\\uDE80-\\uDEFF]'\n    }, {\n        name: 'InUgaritic',\n        astral: '\\uD800[\\uDF80-\\uDF9F]'\n    }, {\n        name: 'InUnified_Canadian_Aboriginal_Syllabics',\n        bmp: '\\u1400-\\u167F'\n    }, {\n        name: 'InUnified_Canadian_Aboriginal_Syllabics_Extended',\n        bmp: '\\u18B0-\\u18FF'\n    }, {\n        name: 'InVai',\n        bmp: '\\uA500-\\uA63F'\n    }, {\n        name: 'InVariation_Selectors',\n        bmp: '\\uFE00-\\uFE0F'\n    }, {\n        name: 'InVariation_Selectors_Supplement',\n        astral: '\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'InVedic_Extensions',\n        bmp: '\\u1CD0-\\u1CFF'\n    }, {\n        name: 'InVertical_Forms',\n        bmp: '\\uFE10-\\uFE1F'\n    }, {\n        name: 'InWarang_Citi',\n        astral: '\\uD806[\\uDCA0-\\uDCFF]'\n    }, {\n        name: 'InYi_Radicals',\n        bmp: '\\uA490-\\uA4CF'\n    }, {\n        name: 'InYi_Syllables',\n        bmp: '\\uA000-\\uA48F'\n    }, {\n        name: 'InYijing_Hexagram_Symbols',\n        bmp: '\\u4DC0-\\u4DFF'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"v78z\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Categories 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for Unicode's general categories. E.g., `\\p{Lu}` or `\\p{Uppercase Letter}`. See\n     * category descriptions in UAX #44 <http://unicode.org/reports/tr44/#GC_Values_Table>. Token\n     * names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Categories');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'C',\n        alias: 'Other',\n        isBmpLast: true,\n        bmp: '\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u08E2\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180E\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF',\n        astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCBD\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDBFF][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA0-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDD73-\\uDD7A\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00-\\uDCFF\\uDDF0-\\uDFFF]'\n    }, {\n        name: 'Cc',\n        alias: 'Control',\n        bmp: '\\0-\\x1F\\x7F-\\x9F'\n    }, {\n        name: 'Cf',\n        alias: 'Format',\n        bmp: '\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB',\n        astral: '\\uD804\\uDCBD|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n    }, {\n        name: 'Cn',\n        alias: 'Unassigned',\n        bmp: '\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B\\u058C\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u05FF\\u061D\\u070E\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08B5\\u08BE-\\u08D3\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0AF8\\u0AFA-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0BFF\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5B-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D00\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D50-\\u0D53\\u0D64\\u0D65\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DE5\\u0DF0\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F6\\u13F7\\u13FE\\u13FF\\u169D-\\u169F\\u16F9-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE\\u1AAF\\u1ABF-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C89-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7\\u1CFA-\\u1CFF\\u1DF6-\\u1DFA\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u2065\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BF-\\u20CF\\u20F1-\\u20FF\\u218C-\\u218F\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2B74\\u2B75\\u2B96\\u2B97\\u2BBA-\\u2BBC\\u2BC9\\u2BD2-\\u2BEB\\u2BF0-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E45-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FD6-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA6F8-\\uA6FF\\uA7AF\\uA7B8-\\uA7F6\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C6-\\uA8CD\\uA8DA-\\uA8DF\\uA8FE\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F\\uAB66-\\uAB6F\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uD7FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD\\uFEFE\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFF8\\uFFFE\\uFFFF',\n        astral: '\\uD800[\\uDC0C\\uDC27\\uDC3B\\uDC3E\\uDC4E\\uDC4F\\uDC5E-\\uDC7F\\uDCFB-\\uDCFF\\uDD03-\\uDD06\\uDD34-\\uDD36\\uDD8F\\uDD9C-\\uDD9F\\uDDA1-\\uDDCF\\uDDFE-\\uDE7F\\uDE9D-\\uDE9F\\uDED1-\\uDEDF\\uDEFC-\\uDEFF\\uDF24-\\uDF2F\\uDF4B-\\uDF4F\\uDF7B-\\uDF7F\\uDF9E\\uDFC4-\\uDFC7\\uDFD6-\\uDFFF]|\\uD801[\\uDC9E\\uDC9F\\uDCAA-\\uDCAF\\uDCD4-\\uDCD7\\uDCFC-\\uDCFF\\uDD28-\\uDD2F\\uDD64-\\uDD6E\\uDD70-\\uDDFF\\uDF37-\\uDF3F\\uDF56-\\uDF5F\\uDF68-\\uDFFF]|\\uD802[\\uDC06\\uDC07\\uDC09\\uDC36\\uDC39-\\uDC3B\\uDC3D\\uDC3E\\uDC56\\uDC9F-\\uDCA6\\uDCB0-\\uDCDF\\uDCF3\\uDCF6-\\uDCFA\\uDD1C-\\uDD1E\\uDD3A-\\uDD3E\\uDD40-\\uDD7F\\uDDB8-\\uDDBB\\uDDD0\\uDDD1\\uDE04\\uDE07-\\uDE0B\\uDE14\\uDE18\\uDE34-\\uDE37\\uDE3B-\\uDE3E\\uDE48-\\uDE4F\\uDE59-\\uDE5F\\uDEA0-\\uDEBF\\uDEE7-\\uDEEA\\uDEF7-\\uDEFF\\uDF36-\\uDF38\\uDF56\\uDF57\\uDF73-\\uDF77\\uDF92-\\uDF98\\uDF9D-\\uDFA8\\uDFB0-\\uDFFF]|\\uD803[\\uDC49-\\uDC7F\\uDCB3-\\uDCBF\\uDCF3-\\uDCF9\\uDD00-\\uDE5F\\uDE7F-\\uDFFF]|\\uD804[\\uDC4E-\\uDC51\\uDC70-\\uDC7E\\uDCC2-\\uDCCF\\uDCE9-\\uDCEF\\uDCFA-\\uDCFF\\uDD35\\uDD44-\\uDD4F\\uDD77-\\uDD7F\\uDDCE\\uDDCF\\uDDE0\\uDDF5-\\uDDFF\\uDE12\\uDE3F-\\uDE7F\\uDE87\\uDE89\\uDE8E\\uDE9E\\uDEAA-\\uDEAF\\uDEEB-\\uDEEF\\uDEFA-\\uDEFF\\uDF04\\uDF0D\\uDF0E\\uDF11\\uDF12\\uDF29\\uDF31\\uDF34\\uDF3A\\uDF3B\\uDF45\\uDF46\\uDF49\\uDF4A\\uDF4E\\uDF4F\\uDF51-\\uDF56\\uDF58-\\uDF5C\\uDF64\\uDF65\\uDF6D-\\uDF6F\\uDF75-\\uDFFF]|\\uD805[\\uDC5A\\uDC5C\\uDC5E-\\uDC7F\\uDCC8-\\uDCCF\\uDCDA-\\uDD7F\\uDDB6\\uDDB7\\uDDDE-\\uDDFF\\uDE45-\\uDE4F\\uDE5A-\\uDE5F\\uDE6D-\\uDE7F\\uDEB8-\\uDEBF\\uDECA-\\uDEFF\\uDF1A-\\uDF1C\\uDF2C-\\uDF2F\\uDF40-\\uDFFF]|\\uD806[\\uDC00-\\uDC9F\\uDCF3-\\uDCFE\\uDD00-\\uDEBF\\uDEF9-\\uDFFF]|\\uD807[\\uDC09\\uDC37\\uDC46-\\uDC4F\\uDC6D-\\uDC6F\\uDC90\\uDC91\\uDCA8\\uDCB7-\\uDFFF]|\\uD808[\\uDF9A-\\uDFFF]|\\uD809[\\uDC6F\\uDC75-\\uDC7F\\uDD44-\\uDFFF]|[\\uD80A\\uD80B\\uD80E-\\uD810\\uD812-\\uD819\\uD823-\\uD82B\\uD82D\\uD82E\\uD830-\\uD833\\uD837\\uD839\\uD83F\\uD874-\\uD87D\\uD87F-\\uDB3F\\uDB41-\\uDB7F][\\uDC00-\\uDFFF]|\\uD80D[\\uDC2F-\\uDFFF]|\\uD811[\\uDE47-\\uDFFF]|\\uD81A[\\uDE39-\\uDE3F\\uDE5F\\uDE6A-\\uDE6D\\uDE70-\\uDECF\\uDEEE\\uDEEF\\uDEF6-\\uDEFF\\uDF46-\\uDF4F\\uDF5A\\uDF62\\uDF78-\\uDF7C\\uDF90-\\uDFFF]|\\uD81B[\\uDC00-\\uDEFF\\uDF45-\\uDF4F\\uDF7F-\\uDF8E\\uDFA0-\\uDFDF\\uDFE1-\\uDFFF]|\\uD821[\\uDFED-\\uDFFF]|\\uD822[\\uDEF3-\\uDFFF]|\\uD82C[\\uDC02-\\uDFFF]|\\uD82F[\\uDC6B-\\uDC6F\\uDC7D-\\uDC7F\\uDC89-\\uDC8F\\uDC9A\\uDC9B\\uDCA4-\\uDFFF]|\\uD834[\\uDCF6-\\uDCFF\\uDD27\\uDD28\\uDDE9-\\uDDFF\\uDE46-\\uDEFF\\uDF57-\\uDF5F\\uDF72-\\uDFFF]|\\uD835[\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]|\\uD836[\\uDE8C-\\uDE9A\\uDEA0\\uDEB0-\\uDFFF]|\\uD838[\\uDC07\\uDC19\\uDC1A\\uDC22\\uDC25\\uDC2B-\\uDFFF]|\\uD83A[\\uDCC5\\uDCC6\\uDCD7-\\uDCFF\\uDD4B-\\uDD4F\\uDD5A-\\uDD5D\\uDD60-\\uDFFF]|\\uD83B[\\uDC00-\\uDDFF\\uDE04\\uDE20\\uDE23\\uDE25\\uDE26\\uDE28\\uDE33\\uDE38\\uDE3A\\uDE3C-\\uDE41\\uDE43-\\uDE46\\uDE48\\uDE4A\\uDE4C\\uDE50\\uDE53\\uDE55\\uDE56\\uDE58\\uDE5A\\uDE5C\\uDE5E\\uDE60\\uDE63\\uDE65\\uDE66\\uDE6B\\uDE73\\uDE78\\uDE7D\\uDE7F\\uDE8A\\uDE9C-\\uDEA0\\uDEA4\\uDEAA\\uDEBC-\\uDEEF\\uDEF2-\\uDFFF]|\\uD83C[\\uDC2C-\\uDC2F\\uDC94-\\uDC9F\\uDCAF\\uDCB0\\uDCC0\\uDCD0\\uDCF6-\\uDCFF\\uDD0D-\\uDD0F\\uDD2F\\uDD6C-\\uDD6F\\uDDAD-\\uDDE5\\uDE03-\\uDE0F\\uDE3C-\\uDE3F\\uDE49-\\uDE4F\\uDE52-\\uDEFF]|\\uD83D[\\uDED3-\\uDEDF\\uDEED-\\uDEEF\\uDEF7-\\uDEFF\\uDF74-\\uDF7F\\uDFD5-\\uDFFF]|\\uD83E[\\uDC0C-\\uDC0F\\uDC48-\\uDC4F\\uDC5A-\\uDC5F\\uDC88-\\uDC8F\\uDCAE-\\uDD0F\\uDD1F\\uDD28-\\uDD2F\\uDD31\\uDD32\\uDD3F\\uDD4C-\\uDD4F\\uDD5F-\\uDD7F\\uDD92-\\uDDBF\\uDDC1-\\uDFFF]|\\uD869[\\uDED7-\\uDEFF]|\\uD86D[\\uDF35-\\uDF3F]|\\uD86E[\\uDC1E\\uDC1F]|\\uD873[\\uDEA2-\\uDFFF]|\\uD87E[\\uDE1E-\\uDFFF]|\\uDB40[\\uDC00\\uDC02-\\uDC1F\\uDC80-\\uDCFF\\uDDF0-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n    }, {\n        name: 'Co',\n        alias: 'Private_Use',\n        bmp: '\\uE000-\\uF8FF',\n        astral: '[\\uDB80-\\uDBBE\\uDBC0-\\uDBFE][\\uDC00-\\uDFFF]|[\\uDBBF\\uDBFF][\\uDC00-\\uDFFD]'\n    }, {\n        name: 'Cs',\n        alias: 'Surrogate',\n        bmp: '\\uD800-\\uDFFF'\n    }, {\n        name: 'L',\n        alias: 'Letter',\n        bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Ll',\n        alias: 'Lowercase_Letter',\n        bmp: 'a-z\\xB5\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02AF\\u0371\\u0373\\u0377\\u037B-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1D2B\\u1D6B-\\u1D77\\u1D79-\\u1D9A\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2184\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7B\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F\\uA771-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7FA\\uAB30-\\uAB5A\\uAB60-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n        astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n    }, {\n        name: 'Lm',\n        alias: 'Modifier_Letter',\n        bmp: '\\u02B0-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0374\\u037A\\u0559\\u0640\\u06E5\\u06E6\\u07F4\\u07F5\\u07FA\\u081A\\u0824\\u0828\\u0971\\u0E46\\u0EC6\\u10FC\\u17D7\\u1843\\u1AA7\\u1C78-\\u1C7D\\u1D2C-\\u1D6A\\u1D78\\u1D9B-\\u1DBF\\u2071\\u207F\\u2090-\\u209C\\u2C7C\\u2C7D\\u2D6F\\u2E2F\\u3005\\u3031-\\u3035\\u303B\\u309D\\u309E\\u30FC-\\u30FE\\uA015\\uA4F8-\\uA4FD\\uA60C\\uA67F\\uA69C\\uA69D\\uA717-\\uA71F\\uA770\\uA788\\uA7F8\\uA7F9\\uA9CF\\uA9E6\\uAA70\\uAADD\\uAAF3\\uAAF4\\uAB5C-\\uAB5F\\uFF70\\uFF9E\\uFF9F',\n        astral: '\\uD81A[\\uDF40-\\uDF43]|\\uD81B[\\uDF93-\\uDF9F\\uDFE0]'\n    }, {\n        name: 'Lo',\n        alias: 'Other_Letter',\n        bmp: '\\xAA\\xBA\\u01BB\\u01C0-\\u01C3\\u0294\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u063F\\u0641-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u0800-\\u0815\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0972-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E45\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10D0-\\u10FA\\u10FD-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17DC\\u1820-\\u1842\\u1844-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C77\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u2135-\\u2138\\u2D30-\\u2D67\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3006\\u303C\\u3041-\\u3096\\u309F\\u30A1-\\u30FA\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA014\\uA016-\\uA48C\\uA4D0-\\uA4F7\\uA500-\\uA60B\\uA610-\\uA61F\\uA62A\\uA62B\\uA66E\\uA6A0-\\uA6E5\\uA78F\\uA7F7\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9E0-\\uA9E4\\uA9E7-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA6F\\uAA71-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB\\uAADC\\uAAE0-\\uAAEA\\uAAF2\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF66-\\uFF6F\\uFF71-\\uFF9D\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC50-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Lt',\n        alias: 'Titlecase_Letter',\n        bmp: '\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC'\n    }, {\n        name: 'Lu',\n        alias: 'Uppercase_Letter',\n        bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2183\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n        astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]'\n    }, {\n        name: 'M',\n        alias: 'Mark',\n        bmp: '\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n        astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDDCA-\\uDDCC\\uDE2C-\\uDE37\\uDE3E\\uDEDF-\\uDEEA\\uDF00-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC35-\\uDC46\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDDDC\\uDDDD\\uDE30-\\uDE40\\uDEAB-\\uDEB7\\uDF1D-\\uDF2B]|\\uD807[\\uDC2F-\\uDC36\\uDC38-\\uDC3F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'Mc',\n        alias: 'Spacing_Mark',\n        bmp: '\\u0903\\u093B\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u094F\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u1A19\\u1A1A\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1BE7\\u1BEA-\\u1BEC\\u1BEE\\u1BF2\\u1BF3\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\u1CF3\\u302E\\u302F\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uAA7D\\uAAEB\\uAAEE\\uAAEF\\uAAF5\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC',\n        astral: '\\uD804[\\uDC00\\uDC02\\uDC82\\uDCB0-\\uDCB2\\uDCB7\\uDCB8\\uDD2C\\uDD82\\uDDB3-\\uDDB5\\uDDBF\\uDDC0\\uDE2C-\\uDE2E\\uDE32\\uDE33\\uDE35\\uDEE0-\\uDEE2\\uDF02\\uDF03\\uDF3E\\uDF3F\\uDF41-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63]|\\uD805[\\uDC35-\\uDC37\\uDC40\\uDC41\\uDC45\\uDCB0-\\uDCB2\\uDCB9\\uDCBB-\\uDCBE\\uDCC1\\uDDAF-\\uDDB1\\uDDB8-\\uDDBB\\uDDBE\\uDE30-\\uDE32\\uDE3B\\uDE3C\\uDE3E\\uDEAC\\uDEAE\\uDEAF\\uDEB6\\uDF20\\uDF21\\uDF26]|\\uD807[\\uDC2F\\uDC3E\\uDCA9\\uDCB1\\uDCB4]|\\uD81B[\\uDF51-\\uDF7E]|\\uD834[\\uDD65\\uDD66\\uDD6D-\\uDD72]'\n    }, {\n        name: 'Me',\n        alias: 'Enclosing_Mark',\n        bmp: '\\u0488\\u0489\\u1ABE\\u20DD-\\u20E0\\u20E2-\\u20E4\\uA670-\\uA672'\n    }, {\n        name: 'Mn',\n        alias: 'Nonspacing_Mark',\n        bmp: '\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0902\\u093A\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0957\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C00\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D01\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4\\u17B5\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A1B\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1AB0-\\u1ABD\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1BAB-\\u1BAD\\u1BE6\\u1BE8\\u1BE9\\u1BED\\u1BEF-\\u1BF1\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302D\\u3099\\u309A\\uA66F\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uA9E5\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAA7C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEC\\uAAED\\uAAF6\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F',\n        astral: '\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC01\\uDC38-\\uDC46\\uDC7F-\\uDC81\\uDCB3-\\uDCB6\\uDCB9\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD2B\\uDD2D-\\uDD34\\uDD73\\uDD80\\uDD81\\uDDB6-\\uDDBE\\uDDCA-\\uDDCC\\uDE2F-\\uDE31\\uDE34\\uDE36\\uDE37\\uDE3E\\uDEDF\\uDEE3-\\uDEEA\\uDF00\\uDF01\\uDF3C\\uDF40\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC38-\\uDC3F\\uDC42-\\uDC44\\uDC46\\uDCB3-\\uDCB8\\uDCBA\\uDCBF\\uDCC0\\uDCC2\\uDCC3\\uDDB2-\\uDDB5\\uDDBC\\uDDBD\\uDDBF\\uDDC0\\uDDDC\\uDDDD\\uDE33-\\uDE3A\\uDE3D\\uDE3F\\uDE40\\uDEAB\\uDEAD\\uDEB0-\\uDEB5\\uDEB7\\uDF1D-\\uDF1F\\uDF22-\\uDF25\\uDF27-\\uDF2B]|\\uD807[\\uDC30-\\uDC36\\uDC38-\\uDC3D\\uDC3F\\uDC92-\\uDCA7\\uDCAA-\\uDCB0\\uDCB2\\uDCB3\\uDCB5\\uDCB6]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDCD0-\\uDCD6\\uDD44-\\uDD4A]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'N',\n        alias: 'Number',\n        bmp: '0-9\\xB2\\xB3\\xB9\\xBC-\\xBE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n        astral: '\\uD800[\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD801[\\uDCA0-\\uDCA9]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDDE1-\\uDDF4\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF3B]|\\uD806[\\uDCE0-\\uDCF2]|\\uD807[\\uDC50-\\uDC6C]|\\uD809[\\uDC00-\\uDC6E]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDCC7-\\uDCCF\\uDD50-\\uDD59]|\\uD83C[\\uDD00-\\uDD0C]'\n    }, {\n        name: 'Nd',\n        alias: 'Decimal_Number',\n        bmp: '0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19',\n        astral: '\\uD801[\\uDCA0-\\uDCA9]|\\uD804[\\uDC66-\\uDC6F\\uDCF0-\\uDCF9\\uDD36-\\uDD3F\\uDDD0-\\uDDD9\\uDEF0-\\uDEF9]|\\uD805[\\uDC50-\\uDC59\\uDCD0-\\uDCD9\\uDE50-\\uDE59\\uDEC0-\\uDEC9\\uDF30-\\uDF39]|\\uD806[\\uDCE0-\\uDCE9]|\\uD807[\\uDC50-\\uDC59]|\\uD81A[\\uDE60-\\uDE69\\uDF50-\\uDF59]|\\uD835[\\uDFCE-\\uDFFF]|\\uD83A[\\uDD50-\\uDD59]'\n    }, {\n        name: 'Nl',\n        alias: 'Letter_Number',\n        bmp: '\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF',\n        astral: '\\uD800[\\uDD40-\\uDD74\\uDF41\\uDF4A\\uDFD1-\\uDFD5]|\\uD809[\\uDC00-\\uDC6E]'\n    }, {\n        name: 'No',\n        alias: 'Other_Number',\n        bmp: '\\xB2\\xB3\\xB9\\xBC-\\xBE\\u09F4-\\u09F9\\u0B72-\\u0B77\\u0BF0-\\u0BF2\\u0C78-\\u0C7E\\u0D58-\\u0D5E\\u0D70-\\u0D78\\u0F2A-\\u0F33\\u1369-\\u137C\\u17F0-\\u17F9\\u19DA\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u215F\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA830-\\uA835',\n        astral: '\\uD800[\\uDD07-\\uDD33\\uDD75-\\uDD78\\uDD8A\\uDD8B\\uDEE1-\\uDEFB\\uDF20-\\uDF23]|\\uD802[\\uDC58-\\uDC5F\\uDC79-\\uDC7F\\uDCA7-\\uDCAF\\uDCFB-\\uDCFF\\uDD16-\\uDD1B\\uDDBC\\uDDBD\\uDDC0-\\uDDCF\\uDDD2-\\uDDFF\\uDE40-\\uDE47\\uDE7D\\uDE7E\\uDE9D-\\uDE9F\\uDEEB-\\uDEEF\\uDF58-\\uDF5F\\uDF78-\\uDF7F\\uDFA9-\\uDFAF]|\\uD803[\\uDCFA-\\uDCFF\\uDE60-\\uDE7E]|\\uD804[\\uDC52-\\uDC65\\uDDE1-\\uDDF4]|\\uD805[\\uDF3A\\uDF3B]|\\uD806[\\uDCEA-\\uDCF2]|\\uD807[\\uDC5A-\\uDC6C]|\\uD81A[\\uDF5B-\\uDF61]|\\uD834[\\uDF60-\\uDF71]|\\uD83A[\\uDCC7-\\uDCCF]|\\uD83C[\\uDD00-\\uDD0C]'\n    }, {\n        name: 'P',\n        alias: 'Punctuation',\n        bmp: '\\x21-\\x23\\x25-\\\\x2A\\x2C-\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5B-\\\\x5D\\x5F\\\\x7B\\x7D\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E44\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Pc',\n        alias: 'Connector_Punctuation',\n        bmp: '\\x5F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F'\n    }, {\n        name: 'Pd',\n        alias: 'Dash_Punctuation',\n        bmp: '\\\\x2D\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D'\n    }, {\n        name: 'Pe',\n        alias: 'Close_Punctuation',\n        bmp: '\\\\x29\\\\x5D\\x7D\\u0F3B\\u0F3D\\u169C\\u2046\\u207E\\u208E\\u2309\\u230B\\u232A\\u2769\\u276B\\u276D\\u276F\\u2771\\u2773\\u2775\\u27C6\\u27E7\\u27E9\\u27EB\\u27ED\\u27EF\\u2984\\u2986\\u2988\\u298A\\u298C\\u298E\\u2990\\u2992\\u2994\\u2996\\u2998\\u29D9\\u29DB\\u29FD\\u2E23\\u2E25\\u2E27\\u2E29\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\u3017\\u3019\\u301B\\u301E\\u301F\\uFD3E\\uFE18\\uFE36\\uFE38\\uFE3A\\uFE3C\\uFE3E\\uFE40\\uFE42\\uFE44\\uFE48\\uFE5A\\uFE5C\\uFE5E\\uFF09\\uFF3D\\uFF5D\\uFF60\\uFF63'\n    }, {\n        name: 'Pf',\n        alias: 'Final_Punctuation',\n        bmp: '\\xBB\\u2019\\u201D\\u203A\\u2E03\\u2E05\\u2E0A\\u2E0D\\u2E1D\\u2E21'\n    }, {\n        name: 'Pi',\n        alias: 'Initial_Punctuation',\n        bmp: '\\xAB\\u2018\\u201B\\u201C\\u201F\\u2039\\u2E02\\u2E04\\u2E09\\u2E0C\\u2E1C\\u2E20'\n    }, {\n        name: 'Po',\n        alias: 'Other_Punctuation',\n        bmp: '\\x21-\\x23\\x25-\\x27\\\\x2A\\x2C\\\\x2E\\x2F\\x3A\\x3B\\\\x3F\\x40\\\\x5C\\xA1\\xA7\\xB6\\xB7\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u166D\\u166E\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u1805\\u1807-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2016\\u2017\\u2020-\\u2027\\u2030-\\u2038\\u203B-\\u203E\\u2041-\\u2043\\u2047-\\u2051\\u2053\\u2055-\\u205E\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00\\u2E01\\u2E06-\\u2E08\\u2E0B\\u2E0E-\\u2E16\\u2E18\\u2E19\\u2E1B\\u2E1E\\u2E1F\\u2E2A-\\u2E2E\\u2E30-\\u2E39\\u2E3C-\\u2E3F\\u2E41\\u2E43\\u2E44\\u3001-\\u3003\\u303D\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFE10-\\uFE16\\uFE19\\uFE30\\uFE45\\uFE46\\uFE49-\\uFE4C\\uFE50-\\uFE52\\uFE54-\\uFE57\\uFE5F-\\uFE61\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF07\\uFF0A\\uFF0C\\uFF0E\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3C\\uFF61\\uFF64\\uFF65',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDC4B-\\uDC4F\\uDC5B\\uDC5D\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDE60-\\uDE6C\\uDF3C-\\uDF3E]|\\uD807[\\uDC41-\\uDC45\\uDC70\\uDC71]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]|\\uD83A[\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Ps',\n        alias: 'Open_Punctuation',\n        bmp: '\\\\x28\\\\x5B\\\\x7B\\u0F3A\\u0F3C\\u169B\\u201A\\u201E\\u2045\\u207D\\u208D\\u2308\\u230A\\u2329\\u2768\\u276A\\u276C\\u276E\\u2770\\u2772\\u2774\\u27C5\\u27E6\\u27E8\\u27EA\\u27EC\\u27EE\\u2983\\u2985\\u2987\\u2989\\u298B\\u298D\\u298F\\u2991\\u2993\\u2995\\u2997\\u29D8\\u29DA\\u29FC\\u2E22\\u2E24\\u2E26\\u2E28\\u2E42\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\u3016\\u3018\\u301A\\u301D\\uFD3F\\uFE17\\uFE35\\uFE37\\uFE39\\uFE3B\\uFE3D\\uFE3F\\uFE41\\uFE43\\uFE47\\uFE59\\uFE5B\\uFE5D\\uFF08\\uFF3B\\uFF5B\\uFF5F\\uFF62'\n    }, {\n        name: 'S',\n        alias: 'Symbol',\n        bmp: '\\\\x24\\\\x2B\\x3C-\\x3E\\\\x5E\\x60\\\\x7C\\x7E\\xA2-\\xA6\\xA8\\xA9\\xAC\\xAE-\\xB1\\xB4\\xB8\\xD7\\xF7\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u03F6\\u0482\\u058D-\\u058F\\u0606-\\u0608\\u060B\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09F2\\u09F3\\u09FA\\u09FB\\u0AF1\\u0B70\\u0BF3-\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0E3F\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u17DB\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u20A0-\\u20BE\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116-\\u2118\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u2140-\\u2144\\u214A-\\u214D\\u214F\\u218A\\u218B\\u2190-\\u2307\\u230C-\\u2328\\u232B-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u2767\\u2794-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u309B\\u309C\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uA828-\\uA82B\\uA836-\\uA839\\uAA77-\\uAA79\\uAB5B\\uFB29\\uFBB2-\\uFBC1\\uFDFC\\uFDFD\\uFE62\\uFE64-\\uFE66\\uFE69\\uFF04\\uFF0B\\uFF1C-\\uFF1E\\uFF3E\\uFF40\\uFF5C\\uFF5E\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFFC\\uFFFD',\n        astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83B[\\uDEF0\\uDEF1]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n    }, {\n        name: 'Sc',\n        alias: 'Currency_Symbol',\n        bmp: '\\\\x24\\xA2-\\xA5\\u058F\\u060B\\u09F2\\u09F3\\u09FB\\u0AF1\\u0BF9\\u0E3F\\u17DB\\u20A0-\\u20BE\\uA838\\uFDFC\\uFE69\\uFF04\\uFFE0\\uFFE1\\uFFE5\\uFFE6'\n    }, {\n        name: 'Sk',\n        alias: 'Modifier_Symbol',\n        bmp: '\\\\x5E\\x60\\xA8\\xAF\\xB4\\xB8\\u02C2-\\u02C5\\u02D2-\\u02DF\\u02E5-\\u02EB\\u02ED\\u02EF-\\u02FF\\u0375\\u0384\\u0385\\u1FBD\\u1FBF-\\u1FC1\\u1FCD-\\u1FCF\\u1FDD-\\u1FDF\\u1FED-\\u1FEF\\u1FFD\\u1FFE\\u309B\\u309C\\uA700-\\uA716\\uA720\\uA721\\uA789\\uA78A\\uAB5B\\uFBB2-\\uFBC1\\uFF3E\\uFF40\\uFFE3',\n        astral: '\\uD83C[\\uDFFB-\\uDFFF]'\n    }, {\n        name: 'Sm',\n        alias: 'Math_Symbol',\n        bmp: '\\\\x2B\\x3C-\\x3E\\\\x7C\\x7E\\xAC\\xB1\\xD7\\xF7\\u03F6\\u0606-\\u0608\\u2044\\u2052\\u207A-\\u207C\\u208A-\\u208C\\u2118\\u2140-\\u2144\\u214B\\u2190-\\u2194\\u219A\\u219B\\u21A0\\u21A3\\u21A6\\u21AE\\u21CE\\u21CF\\u21D2\\u21D4\\u21F4-\\u22FF\\u2320\\u2321\\u237C\\u239B-\\u23B3\\u23DC-\\u23E1\\u25B7\\u25C1\\u25F8-\\u25FF\\u266F\\u27C0-\\u27C4\\u27C7-\\u27E5\\u27F0-\\u27FF\\u2900-\\u2982\\u2999-\\u29D7\\u29DC-\\u29FB\\u29FE-\\u2AFF\\u2B30-\\u2B44\\u2B47-\\u2B4C\\uFB29\\uFE62\\uFE64-\\uFE66\\uFF0B\\uFF1C-\\uFF1E\\uFF5C\\uFF5E\\uFFE2\\uFFE9-\\uFFEC',\n        astral: '\\uD835[\\uDEC1\\uDEDB\\uDEFB\\uDF15\\uDF35\\uDF4F\\uDF6F\\uDF89\\uDFA9\\uDFC3]|\\uD83B[\\uDEF0\\uDEF1]'\n    }, {\n        name: 'So',\n        alias: 'Other_Symbol',\n        bmp: '\\xA6\\xA9\\xAE\\xB0\\u0482\\u058D\\u058E\\u060E\\u060F\\u06DE\\u06E9\\u06FD\\u06FE\\u07F6\\u09FA\\u0B70\\u0BF3-\\u0BF8\\u0BFA\\u0C7F\\u0D4F\\u0D79\\u0F01-\\u0F03\\u0F13\\u0F15-\\u0F17\\u0F1A-\\u0F1F\\u0F34\\u0F36\\u0F38\\u0FBE-\\u0FC5\\u0FC7-\\u0FCC\\u0FCE\\u0FCF\\u0FD5-\\u0FD8\\u109E\\u109F\\u1390-\\u1399\\u1940\\u19DE-\\u19FF\\u1B61-\\u1B6A\\u1B74-\\u1B7C\\u2100\\u2101\\u2103-\\u2106\\u2108\\u2109\\u2114\\u2116\\u2117\\u211E-\\u2123\\u2125\\u2127\\u2129\\u212E\\u213A\\u213B\\u214A\\u214C\\u214D\\u214F\\u218A\\u218B\\u2195-\\u2199\\u219C-\\u219F\\u21A1\\u21A2\\u21A4\\u21A5\\u21A7-\\u21AD\\u21AF-\\u21CD\\u21D0\\u21D1\\u21D3\\u21D5-\\u21F3\\u2300-\\u2307\\u230C-\\u231F\\u2322-\\u2328\\u232B-\\u237B\\u237D-\\u239A\\u23B4-\\u23DB\\u23E2-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u249C-\\u24E9\\u2500-\\u25B6\\u25B8-\\u25C0\\u25C2-\\u25F7\\u2600-\\u266E\\u2670-\\u2767\\u2794-\\u27BF\\u2800-\\u28FF\\u2B00-\\u2B2F\\u2B45\\u2B46\\u2B4D-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2CE5-\\u2CEA\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3004\\u3012\\u3013\\u3020\\u3036\\u3037\\u303E\\u303F\\u3190\\u3191\\u3196-\\u319F\\u31C0-\\u31E3\\u3200-\\u321E\\u322A-\\u3247\\u3250\\u3260-\\u327F\\u328A-\\u32B0\\u32C0-\\u32FE\\u3300-\\u33FF\\u4DC0-\\u4DFF\\uA490-\\uA4C6\\uA828-\\uA82B\\uA836\\uA837\\uA839\\uAA77-\\uAA79\\uFDFD\\uFFE4\\uFFE8\\uFFED\\uFFEE\\uFFFC\\uFFFD',\n        astral: '\\uD800[\\uDD37-\\uDD3F\\uDD79-\\uDD89\\uDD8C-\\uDD8E\\uDD90-\\uDD9B\\uDDA0\\uDDD0-\\uDDFC]|\\uD802[\\uDC77\\uDC78\\uDEC8]|\\uD805\\uDF3F|\\uD81A[\\uDF3C-\\uDF3F\\uDF45]|\\uD82F\\uDC9C|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD64\\uDD6A-\\uDD6C\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDE00-\\uDE41\\uDE45\\uDF00-\\uDF56]|\\uD836[\\uDC00-\\uDDFF\\uDE37-\\uDE3A\\uDE6D-\\uDE74\\uDE76-\\uDE83\\uDE85\\uDE86]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFA]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]'\n    }, {\n        name: 'Z',\n        alias: 'Separator',\n        bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n    }, {\n        name: 'Zl',\n        alias: 'Line_Separator',\n        bmp: '\\u2028'\n    }, {\n        name: 'Zp',\n        alias: 'Paragraph_Separator',\n        bmp: '\\u2029'\n    }, {\n        name: 'Zs',\n        alias: 'Space_Separator',\n        bmp: '\\x20\\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"TAal\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Properties 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2012-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds properties to meet the UTS #18 Level 1 RL1.2 requirements for Unicode regex support. See\n     * <http://unicode.org/reports/tr18/#RL1.2>. Following are definitions of these properties from\n     * UAX #44 <http://unicode.org/reports/tr44/>:\n     *\n     * - Alphabetic\n     *   Characters with the Alphabetic property. Generated from: Lowercase + Uppercase + Lt + Lm +\n     *   Lo + Nl + Other_Alphabetic.\n     *\n     * - Default_Ignorable_Code_Point\n     *   For programmatic determination of default ignorable code points. New characters that should\n     *   be ignored in rendering (unless explicitly supported) will be assigned in these ranges,\n     *   permitting programs to correctly handle the default rendering of such characters when not\n     *   otherwise supported.\n     *\n     * - Lowercase\n     *   Characters with the Lowercase property. Generated from: Ll + Other_Lowercase.\n     *\n     * - Noncharacter_Code_Point\n     *   Code points permanently reserved for internal use.\n     *\n     * - Uppercase\n     *   Characters with the Uppercase property. Generated from: Lu + Other_Uppercase.\n     *\n     * - White_Space\n     *   Spaces, separator characters and other control characters which should be treated by\n     *   programming languages as \"white space\" for the purpose of parsing elements.\n     *\n     * The properties ASCII, Any, and Assigned are also included but are not defined in UAX #44. UTS\n     * #18 RL1.2 additionally requires support for Unicode scripts and general categories. These are\n     * included in XRegExp's Unicode Categories and Unicode Scripts addons.\n     *\n     * Token names are case insensitive, and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Properties');\n    }\n\n    var unicodeData = [{\n        name: 'ASCII',\n        bmp: '\\0-\\x7F'\n    }, {\n        name: 'Alphabetic',\n        bmp: 'A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0345\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05B0-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0657\\u0659-\\u065F\\u066E-\\u06D3\\u06D5-\\u06DC\\u06E1-\\u06E8\\u06ED-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710-\\u073F\\u074D-\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0817\\u081A-\\u082C\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08DF\\u08E3-\\u08E9\\u08F0-\\u093B\\u093D-\\u094C\\u094E-\\u0950\\u0955-\\u0963\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD-\\u09C4\\u09C7\\u09C8\\u09CB\\u09CC\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09F0\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B\\u0A4C\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A70-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB\\u0ACC\\u0AD0\\u0AE0-\\u0AE3\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D-\\u0B44\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD0\\u0BD7\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4C\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCC\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E46\\u0E4D\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ECD\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F81\\u0F88-\\u0F97\\u0F99-\\u0FBC\\u1000-\\u1036\\u1038\\u103B-\\u103F\\u1050-\\u1062\\u1065-\\u1068\\u106E-\\u1086\\u108E\\u109C\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1713\\u1720-\\u1733\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17B3\\u17B6-\\u17C8\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u1938\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A61-\\u1A74\\u1AA7\\u1B00-\\u1B33\\u1B35-\\u1B43\\u1B45-\\u1B4B\\u1B80-\\u1BA9\\u1BAC-\\u1BAF\\u1BBA-\\u1BE5\\u1BE7-\\u1BF1\\u1C00-\\u1C35\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1DE7-\\u1DF4\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u24B6-\\u24E9\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA674-\\uA67B\\uA67F-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA827\\uA840-\\uA873\\uA880-\\uA8C3\\uA8C5\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA92A\\uA930-\\uA952\\uA960-\\uA97C\\uA980-\\uA9B2\\uA9B4-\\uA9BF\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAABE\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF5\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC45\\uDC82-\\uDCB8\\uDCD0-\\uDCE8\\uDD00-\\uDD32\\uDD50-\\uDD72\\uDD76\\uDD80-\\uDDBF\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE34\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEE8\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D-\\uDF44\\uDF47\\uDF48\\uDF4B\\uDF4C\\uDF50\\uDF57\\uDF5D-\\uDF63]|\\uD805[\\uDC00-\\uDC41\\uDC43-\\uDC45\\uDC47-\\uDC4A\\uDC80-\\uDCC1\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDB5\\uDDB8-\\uDDBE\\uDDD8-\\uDDDD\\uDE00-\\uDE3E\\uDE40\\uDE44\\uDE80-\\uDEB5\\uDF00-\\uDF19\\uDF1D-\\uDF2A]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC3E\\uDC40\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF93-\\uDF9F\\uDFE0]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9E]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD47]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Any',\n        isBmpLast: true,\n        bmp: '\\0-\\uFFFF',\n        astral: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'Default_Ignorable_Code_Point',\n        bmp: '\\xAD\\u034F\\u061C\\u115F\\u1160\\u17B4\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8',\n        astral: '\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|[\\uDB40-\\uDB43][\\uDC00-\\uDFFF]'\n    }, {\n        name: 'Lowercase',\n        bmp: 'a-z\\xAA\\xB5\\xBA\\xDF-\\xF6\\xF8-\\xFF\\u0101\\u0103\\u0105\\u0107\\u0109\\u010B\\u010D\\u010F\\u0111\\u0113\\u0115\\u0117\\u0119\\u011B\\u011D\\u011F\\u0121\\u0123\\u0125\\u0127\\u0129\\u012B\\u012D\\u012F\\u0131\\u0133\\u0135\\u0137\\u0138\\u013A\\u013C\\u013E\\u0140\\u0142\\u0144\\u0146\\u0148\\u0149\\u014B\\u014D\\u014F\\u0151\\u0153\\u0155\\u0157\\u0159\\u015B\\u015D\\u015F\\u0161\\u0163\\u0165\\u0167\\u0169\\u016B\\u016D\\u016F\\u0171\\u0173\\u0175\\u0177\\u017A\\u017C\\u017E-\\u0180\\u0183\\u0185\\u0188\\u018C\\u018D\\u0192\\u0195\\u0199-\\u019B\\u019E\\u01A1\\u01A3\\u01A5\\u01A8\\u01AA\\u01AB\\u01AD\\u01B0\\u01B4\\u01B6\\u01B9\\u01BA\\u01BD-\\u01BF\\u01C6\\u01C9\\u01CC\\u01CE\\u01D0\\u01D2\\u01D4\\u01D6\\u01D8\\u01DA\\u01DC\\u01DD\\u01DF\\u01E1\\u01E3\\u01E5\\u01E7\\u01E9\\u01EB\\u01ED\\u01EF\\u01F0\\u01F3\\u01F5\\u01F9\\u01FB\\u01FD\\u01FF\\u0201\\u0203\\u0205\\u0207\\u0209\\u020B\\u020D\\u020F\\u0211\\u0213\\u0215\\u0217\\u0219\\u021B\\u021D\\u021F\\u0221\\u0223\\u0225\\u0227\\u0229\\u022B\\u022D\\u022F\\u0231\\u0233-\\u0239\\u023C\\u023F\\u0240\\u0242\\u0247\\u0249\\u024B\\u024D\\u024F-\\u0293\\u0295-\\u02B8\\u02C0\\u02C1\\u02E0-\\u02E4\\u0345\\u0371\\u0373\\u0377\\u037A-\\u037D\\u0390\\u03AC-\\u03CE\\u03D0\\u03D1\\u03D5-\\u03D7\\u03D9\\u03DB\\u03DD\\u03DF\\u03E1\\u03E3\\u03E5\\u03E7\\u03E9\\u03EB\\u03ED\\u03EF-\\u03F3\\u03F5\\u03F8\\u03FB\\u03FC\\u0430-\\u045F\\u0461\\u0463\\u0465\\u0467\\u0469\\u046B\\u046D\\u046F\\u0471\\u0473\\u0475\\u0477\\u0479\\u047B\\u047D\\u047F\\u0481\\u048B\\u048D\\u048F\\u0491\\u0493\\u0495\\u0497\\u0499\\u049B\\u049D\\u049F\\u04A1\\u04A3\\u04A5\\u04A7\\u04A9\\u04AB\\u04AD\\u04AF\\u04B1\\u04B3\\u04B5\\u04B7\\u04B9\\u04BB\\u04BD\\u04BF\\u04C2\\u04C4\\u04C6\\u04C8\\u04CA\\u04CC\\u04CE\\u04CF\\u04D1\\u04D3\\u04D5\\u04D7\\u04D9\\u04DB\\u04DD\\u04DF\\u04E1\\u04E3\\u04E5\\u04E7\\u04E9\\u04EB\\u04ED\\u04EF\\u04F1\\u04F3\\u04F5\\u04F7\\u04F9\\u04FB\\u04FD\\u04FF\\u0501\\u0503\\u0505\\u0507\\u0509\\u050B\\u050D\\u050F\\u0511\\u0513\\u0515\\u0517\\u0519\\u051B\\u051D\\u051F\\u0521\\u0523\\u0525\\u0527\\u0529\\u052B\\u052D\\u052F\\u0561-\\u0587\\u13F8-\\u13FD\\u1C80-\\u1C88\\u1D00-\\u1DBF\\u1E01\\u1E03\\u1E05\\u1E07\\u1E09\\u1E0B\\u1E0D\\u1E0F\\u1E11\\u1E13\\u1E15\\u1E17\\u1E19\\u1E1B\\u1E1D\\u1E1F\\u1E21\\u1E23\\u1E25\\u1E27\\u1E29\\u1E2B\\u1E2D\\u1E2F\\u1E31\\u1E33\\u1E35\\u1E37\\u1E39\\u1E3B\\u1E3D\\u1E3F\\u1E41\\u1E43\\u1E45\\u1E47\\u1E49\\u1E4B\\u1E4D\\u1E4F\\u1E51\\u1E53\\u1E55\\u1E57\\u1E59\\u1E5B\\u1E5D\\u1E5F\\u1E61\\u1E63\\u1E65\\u1E67\\u1E69\\u1E6B\\u1E6D\\u1E6F\\u1E71\\u1E73\\u1E75\\u1E77\\u1E79\\u1E7B\\u1E7D\\u1E7F\\u1E81\\u1E83\\u1E85\\u1E87\\u1E89\\u1E8B\\u1E8D\\u1E8F\\u1E91\\u1E93\\u1E95-\\u1E9D\\u1E9F\\u1EA1\\u1EA3\\u1EA5\\u1EA7\\u1EA9\\u1EAB\\u1EAD\\u1EAF\\u1EB1\\u1EB3\\u1EB5\\u1EB7\\u1EB9\\u1EBB\\u1EBD\\u1EBF\\u1EC1\\u1EC3\\u1EC5\\u1EC7\\u1EC9\\u1ECB\\u1ECD\\u1ECF\\u1ED1\\u1ED3\\u1ED5\\u1ED7\\u1ED9\\u1EDB\\u1EDD\\u1EDF\\u1EE1\\u1EE3\\u1EE5\\u1EE7\\u1EE9\\u1EEB\\u1EED\\u1EEF\\u1EF1\\u1EF3\\u1EF5\\u1EF7\\u1EF9\\u1EFB\\u1EFD\\u1EFF-\\u1F07\\u1F10-\\u1F15\\u1F20-\\u1F27\\u1F30-\\u1F37\\u1F40-\\u1F45\\u1F50-\\u1F57\\u1F60-\\u1F67\\u1F70-\\u1F7D\\u1F80-\\u1F87\\u1F90-\\u1F97\\u1FA0-\\u1FA7\\u1FB0-\\u1FB4\\u1FB6\\u1FB7\\u1FBE\\u1FC2-\\u1FC4\\u1FC6\\u1FC7\\u1FD0-\\u1FD3\\u1FD6\\u1FD7\\u1FE0-\\u1FE7\\u1FF2-\\u1FF4\\u1FF6\\u1FF7\\u2071\\u207F\\u2090-\\u209C\\u210A\\u210E\\u210F\\u2113\\u212F\\u2134\\u2139\\u213C\\u213D\\u2146-\\u2149\\u214E\\u2170-\\u217F\\u2184\\u24D0-\\u24E9\\u2C30-\\u2C5E\\u2C61\\u2C65\\u2C66\\u2C68\\u2C6A\\u2C6C\\u2C71\\u2C73\\u2C74\\u2C76-\\u2C7D\\u2C81\\u2C83\\u2C85\\u2C87\\u2C89\\u2C8B\\u2C8D\\u2C8F\\u2C91\\u2C93\\u2C95\\u2C97\\u2C99\\u2C9B\\u2C9D\\u2C9F\\u2CA1\\u2CA3\\u2CA5\\u2CA7\\u2CA9\\u2CAB\\u2CAD\\u2CAF\\u2CB1\\u2CB3\\u2CB5\\u2CB7\\u2CB9\\u2CBB\\u2CBD\\u2CBF\\u2CC1\\u2CC3\\u2CC5\\u2CC7\\u2CC9\\u2CCB\\u2CCD\\u2CCF\\u2CD1\\u2CD3\\u2CD5\\u2CD7\\u2CD9\\u2CDB\\u2CDD\\u2CDF\\u2CE1\\u2CE3\\u2CE4\\u2CEC\\u2CEE\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\uA641\\uA643\\uA645\\uA647\\uA649\\uA64B\\uA64D\\uA64F\\uA651\\uA653\\uA655\\uA657\\uA659\\uA65B\\uA65D\\uA65F\\uA661\\uA663\\uA665\\uA667\\uA669\\uA66B\\uA66D\\uA681\\uA683\\uA685\\uA687\\uA689\\uA68B\\uA68D\\uA68F\\uA691\\uA693\\uA695\\uA697\\uA699\\uA69B-\\uA69D\\uA723\\uA725\\uA727\\uA729\\uA72B\\uA72D\\uA72F-\\uA731\\uA733\\uA735\\uA737\\uA739\\uA73B\\uA73D\\uA73F\\uA741\\uA743\\uA745\\uA747\\uA749\\uA74B\\uA74D\\uA74F\\uA751\\uA753\\uA755\\uA757\\uA759\\uA75B\\uA75D\\uA75F\\uA761\\uA763\\uA765\\uA767\\uA769\\uA76B\\uA76D\\uA76F-\\uA778\\uA77A\\uA77C\\uA77F\\uA781\\uA783\\uA785\\uA787\\uA78C\\uA78E\\uA791\\uA793-\\uA795\\uA797\\uA799\\uA79B\\uA79D\\uA79F\\uA7A1\\uA7A3\\uA7A5\\uA7A7\\uA7A9\\uA7B5\\uA7B7\\uA7F8-\\uA7FA\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABBF\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFF41-\\uFF5A',\n        astral: '\\uD801[\\uDC28-\\uDC4F\\uDCD8-\\uDCFB]|\\uD803[\\uDCC0-\\uDCF2]|\\uD806[\\uDCC0-\\uDCDF]|\\uD835[\\uDC1A-\\uDC33\\uDC4E-\\uDC54\\uDC56-\\uDC67\\uDC82-\\uDC9B\\uDCB6-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDCEA-\\uDD03\\uDD1E-\\uDD37\\uDD52-\\uDD6B\\uDD86-\\uDD9F\\uDDBA-\\uDDD3\\uDDEE-\\uDE07\\uDE22-\\uDE3B\\uDE56-\\uDE6F\\uDE8A-\\uDEA5\\uDEC2-\\uDEDA\\uDEDC-\\uDEE1\\uDEFC-\\uDF14\\uDF16-\\uDF1B\\uDF36-\\uDF4E\\uDF50-\\uDF55\\uDF70-\\uDF88\\uDF8A-\\uDF8F\\uDFAA-\\uDFC2\\uDFC4-\\uDFC9\\uDFCB]|\\uD83A[\\uDD22-\\uDD43]'\n    }, {\n        name: 'Noncharacter_Code_Point',\n        bmp: '\\uFDD0-\\uFDEF\\uFFFE\\uFFFF',\n        astral: '[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]'\n    }, {\n        name: 'Uppercase',\n        bmp: 'A-Z\\xC0-\\xD6\\xD8-\\xDE\\u0100\\u0102\\u0104\\u0106\\u0108\\u010A\\u010C\\u010E\\u0110\\u0112\\u0114\\u0116\\u0118\\u011A\\u011C\\u011E\\u0120\\u0122\\u0124\\u0126\\u0128\\u012A\\u012C\\u012E\\u0130\\u0132\\u0134\\u0136\\u0139\\u013B\\u013D\\u013F\\u0141\\u0143\\u0145\\u0147\\u014A\\u014C\\u014E\\u0150\\u0152\\u0154\\u0156\\u0158\\u015A\\u015C\\u015E\\u0160\\u0162\\u0164\\u0166\\u0168\\u016A\\u016C\\u016E\\u0170\\u0172\\u0174\\u0176\\u0178\\u0179\\u017B\\u017D\\u0181\\u0182\\u0184\\u0186\\u0187\\u0189-\\u018B\\u018E-\\u0191\\u0193\\u0194\\u0196-\\u0198\\u019C\\u019D\\u019F\\u01A0\\u01A2\\u01A4\\u01A6\\u01A7\\u01A9\\u01AC\\u01AE\\u01AF\\u01B1-\\u01B3\\u01B5\\u01B7\\u01B8\\u01BC\\u01C4\\u01C7\\u01CA\\u01CD\\u01CF\\u01D1\\u01D3\\u01D5\\u01D7\\u01D9\\u01DB\\u01DE\\u01E0\\u01E2\\u01E4\\u01E6\\u01E8\\u01EA\\u01EC\\u01EE\\u01F1\\u01F4\\u01F6-\\u01F8\\u01FA\\u01FC\\u01FE\\u0200\\u0202\\u0204\\u0206\\u0208\\u020A\\u020C\\u020E\\u0210\\u0212\\u0214\\u0216\\u0218\\u021A\\u021C\\u021E\\u0220\\u0222\\u0224\\u0226\\u0228\\u022A\\u022C\\u022E\\u0230\\u0232\\u023A\\u023B\\u023D\\u023E\\u0241\\u0243-\\u0246\\u0248\\u024A\\u024C\\u024E\\u0370\\u0372\\u0376\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E\\u038F\\u0391-\\u03A1\\u03A3-\\u03AB\\u03CF\\u03D2-\\u03D4\\u03D8\\u03DA\\u03DC\\u03DE\\u03E0\\u03E2\\u03E4\\u03E6\\u03E8\\u03EA\\u03EC\\u03EE\\u03F4\\u03F7\\u03F9\\u03FA\\u03FD-\\u042F\\u0460\\u0462\\u0464\\u0466\\u0468\\u046A\\u046C\\u046E\\u0470\\u0472\\u0474\\u0476\\u0478\\u047A\\u047C\\u047E\\u0480\\u048A\\u048C\\u048E\\u0490\\u0492\\u0494\\u0496\\u0498\\u049A\\u049C\\u049E\\u04A0\\u04A2\\u04A4\\u04A6\\u04A8\\u04AA\\u04AC\\u04AE\\u04B0\\u04B2\\u04B4\\u04B6\\u04B8\\u04BA\\u04BC\\u04BE\\u04C0\\u04C1\\u04C3\\u04C5\\u04C7\\u04C9\\u04CB\\u04CD\\u04D0\\u04D2\\u04D4\\u04D6\\u04D8\\u04DA\\u04DC\\u04DE\\u04E0\\u04E2\\u04E4\\u04E6\\u04E8\\u04EA\\u04EC\\u04EE\\u04F0\\u04F2\\u04F4\\u04F6\\u04F8\\u04FA\\u04FC\\u04FE\\u0500\\u0502\\u0504\\u0506\\u0508\\u050A\\u050C\\u050E\\u0510\\u0512\\u0514\\u0516\\u0518\\u051A\\u051C\\u051E\\u0520\\u0522\\u0524\\u0526\\u0528\\u052A\\u052C\\u052E\\u0531-\\u0556\\u10A0-\\u10C5\\u10C7\\u10CD\\u13A0-\\u13F5\\u1E00\\u1E02\\u1E04\\u1E06\\u1E08\\u1E0A\\u1E0C\\u1E0E\\u1E10\\u1E12\\u1E14\\u1E16\\u1E18\\u1E1A\\u1E1C\\u1E1E\\u1E20\\u1E22\\u1E24\\u1E26\\u1E28\\u1E2A\\u1E2C\\u1E2E\\u1E30\\u1E32\\u1E34\\u1E36\\u1E38\\u1E3A\\u1E3C\\u1E3E\\u1E40\\u1E42\\u1E44\\u1E46\\u1E48\\u1E4A\\u1E4C\\u1E4E\\u1E50\\u1E52\\u1E54\\u1E56\\u1E58\\u1E5A\\u1E5C\\u1E5E\\u1E60\\u1E62\\u1E64\\u1E66\\u1E68\\u1E6A\\u1E6C\\u1E6E\\u1E70\\u1E72\\u1E74\\u1E76\\u1E78\\u1E7A\\u1E7C\\u1E7E\\u1E80\\u1E82\\u1E84\\u1E86\\u1E88\\u1E8A\\u1E8C\\u1E8E\\u1E90\\u1E92\\u1E94\\u1E9E\\u1EA0\\u1EA2\\u1EA4\\u1EA6\\u1EA8\\u1EAA\\u1EAC\\u1EAE\\u1EB0\\u1EB2\\u1EB4\\u1EB6\\u1EB8\\u1EBA\\u1EBC\\u1EBE\\u1EC0\\u1EC2\\u1EC4\\u1EC6\\u1EC8\\u1ECA\\u1ECC\\u1ECE\\u1ED0\\u1ED2\\u1ED4\\u1ED6\\u1ED8\\u1EDA\\u1EDC\\u1EDE\\u1EE0\\u1EE2\\u1EE4\\u1EE6\\u1EE8\\u1EEA\\u1EEC\\u1EEE\\u1EF0\\u1EF2\\u1EF4\\u1EF6\\u1EF8\\u1EFA\\u1EFC\\u1EFE\\u1F08-\\u1F0F\\u1F18-\\u1F1D\\u1F28-\\u1F2F\\u1F38-\\u1F3F\\u1F48-\\u1F4D\\u1F59\\u1F5B\\u1F5D\\u1F5F\\u1F68-\\u1F6F\\u1FB8-\\u1FBB\\u1FC8-\\u1FCB\\u1FD8-\\u1FDB\\u1FE8-\\u1FEC\\u1FF8-\\u1FFB\\u2102\\u2107\\u210B-\\u210D\\u2110-\\u2112\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u2130-\\u2133\\u213E\\u213F\\u2145\\u2160-\\u216F\\u2183\\u24B6-\\u24CF\\u2C00-\\u2C2E\\u2C60\\u2C62-\\u2C64\\u2C67\\u2C69\\u2C6B\\u2C6D-\\u2C70\\u2C72\\u2C75\\u2C7E-\\u2C80\\u2C82\\u2C84\\u2C86\\u2C88\\u2C8A\\u2C8C\\u2C8E\\u2C90\\u2C92\\u2C94\\u2C96\\u2C98\\u2C9A\\u2C9C\\u2C9E\\u2CA0\\u2CA2\\u2CA4\\u2CA6\\u2CA8\\u2CAA\\u2CAC\\u2CAE\\u2CB0\\u2CB2\\u2CB4\\u2CB6\\u2CB8\\u2CBA\\u2CBC\\u2CBE\\u2CC0\\u2CC2\\u2CC4\\u2CC6\\u2CC8\\u2CCA\\u2CCC\\u2CCE\\u2CD0\\u2CD2\\u2CD4\\u2CD6\\u2CD8\\u2CDA\\u2CDC\\u2CDE\\u2CE0\\u2CE2\\u2CEB\\u2CED\\u2CF2\\uA640\\uA642\\uA644\\uA646\\uA648\\uA64A\\uA64C\\uA64E\\uA650\\uA652\\uA654\\uA656\\uA658\\uA65A\\uA65C\\uA65E\\uA660\\uA662\\uA664\\uA666\\uA668\\uA66A\\uA66C\\uA680\\uA682\\uA684\\uA686\\uA688\\uA68A\\uA68C\\uA68E\\uA690\\uA692\\uA694\\uA696\\uA698\\uA69A\\uA722\\uA724\\uA726\\uA728\\uA72A\\uA72C\\uA72E\\uA732\\uA734\\uA736\\uA738\\uA73A\\uA73C\\uA73E\\uA740\\uA742\\uA744\\uA746\\uA748\\uA74A\\uA74C\\uA74E\\uA750\\uA752\\uA754\\uA756\\uA758\\uA75A\\uA75C\\uA75E\\uA760\\uA762\\uA764\\uA766\\uA768\\uA76A\\uA76C\\uA76E\\uA779\\uA77B\\uA77D\\uA77E\\uA780\\uA782\\uA784\\uA786\\uA78B\\uA78D\\uA790\\uA792\\uA796\\uA798\\uA79A\\uA79C\\uA79E\\uA7A0\\uA7A2\\uA7A4\\uA7A6\\uA7A8\\uA7AA-\\uA7AE\\uA7B0-\\uA7B4\\uA7B6\\uFF21-\\uFF3A',\n        astral: '\\uD801[\\uDC00-\\uDC27\\uDCB0-\\uDCD3]|\\uD803[\\uDC80-\\uDCB2]|\\uD806[\\uDCA0-\\uDCBF]|\\uD835[\\uDC00-\\uDC19\\uDC34-\\uDC4D\\uDC68-\\uDC81\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB5\\uDCD0-\\uDCE9\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD38\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD6C-\\uDD85\\uDDA0-\\uDDB9\\uDDD4-\\uDDED\\uDE08-\\uDE21\\uDE3C-\\uDE55\\uDE70-\\uDE89\\uDEA8-\\uDEC0\\uDEE2-\\uDEFA\\uDF1C-\\uDF34\\uDF56-\\uDF6E\\uDF90-\\uDFA8\\uDFCA]|\\uD83A[\\uDD00-\\uDD21]|\\uD83C[\\uDD30-\\uDD49\\uDD50-\\uDD69\\uDD70-\\uDD89]'\n    }, {\n        name: 'White_Space',\n        bmp: '\\x09-\\x0D\\x20\\x85\\xA0\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000'\n    }];\n\n    // Add non-generated data\n    unicodeData.push({\n        name: 'Assigned',\n        // Since this is defined as the inverse of Unicode category Cn (Unassigned), the Unicode\n        // Categories addon is required to use this property\n        inverseOf: 'Cn'\n    });\n\n    XRegExp.addUnicodeData(unicodeData);\n};\n\nmodule.exports = exports['default'];\n},{}],\"GEDh\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\n/*!\n * XRegExp Unicode Scripts 4.0.0\n * <xregexp.com>\n * Steven Levithan (c) 2010-2017 MIT License\n * Unicode data by Mathias Bynens <mathiasbynens.be>\n */\n\nexports.default = function (XRegExp) {\n\n    /**\n     * Adds support for all Unicode scripts. E.g., `\\p{Latin}`. Token names are case insensitive,\n     * and any spaces, hyphens, and underscores are ignored.\n     *\n     * Uses Unicode 9.0.0.\n     *\n     * @requires XRegExp, Unicode Base\n     */\n\n    if (!XRegExp.addUnicodeData) {\n        throw new ReferenceError('Unicode Base must be loaded before Unicode Scripts');\n    }\n\n    XRegExp.addUnicodeData([{\n        name: 'Adlam',\n        astral: '\\uD83A[\\uDD00-\\uDD4A\\uDD50-\\uDD59\\uDD5E\\uDD5F]'\n    }, {\n        name: 'Ahom',\n        astral: '\\uD805[\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF3F]'\n    }, {\n        name: 'Anatolian_Hieroglyphs',\n        astral: '\\uD811[\\uDC00-\\uDE46]'\n    }, {\n        name: 'Arabic',\n        bmp: '\\u0600-\\u0604\\u0606-\\u060B\\u060D-\\u061A\\u061E\\u0620-\\u063F\\u0641-\\u064A\\u0656-\\u066F\\u0671-\\u06DC\\u06DE-\\u06FF\\u0750-\\u077F\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u08FF\\uFB50-\\uFBC1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFD\\uFE70-\\uFE74\\uFE76-\\uFEFC',\n        astral: '\\uD803[\\uDE60-\\uDE7E]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB\\uDEF0\\uDEF1]'\n    }, {\n        name: 'Armenian',\n        bmp: '\\u0531-\\u0556\\u0559-\\u055F\\u0561-\\u0587\\u058A\\u058D-\\u058F\\uFB13-\\uFB17'\n    }, {\n        name: 'Avestan',\n        astral: '\\uD802[\\uDF00-\\uDF35\\uDF39-\\uDF3F]'\n    }, {\n        name: 'Balinese',\n        bmp: '\\u1B00-\\u1B4B\\u1B50-\\u1B7C'\n    }, {\n        name: 'Bamum',\n        bmp: '\\uA6A0-\\uA6F7',\n        astral: '\\uD81A[\\uDC00-\\uDE38]'\n    }, {\n        name: 'Bassa_Vah',\n        astral: '\\uD81A[\\uDED0-\\uDEED\\uDEF0-\\uDEF5]'\n    }, {\n        name: 'Batak',\n        bmp: '\\u1BC0-\\u1BF3\\u1BFC-\\u1BFF'\n    }, {\n        name: 'Bengali',\n        bmp: '\\u0980-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09FB'\n    }, {\n        name: 'Bhaiksuki',\n        astral: '\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC45\\uDC50-\\uDC6C]'\n    }, {\n        name: 'Bopomofo',\n        bmp: '\\u02EA\\u02EB\\u3105-\\u312D\\u31A0-\\u31BA'\n    }, {\n        name: 'Brahmi',\n        astral: '\\uD804[\\uDC00-\\uDC4D\\uDC52-\\uDC6F\\uDC7F]'\n    }, {\n        name: 'Braille',\n        bmp: '\\u2800-\\u28FF'\n    }, {\n        name: 'Buginese',\n        bmp: '\\u1A00-\\u1A1B\\u1A1E\\u1A1F'\n    }, {\n        name: 'Buhid',\n        bmp: '\\u1740-\\u1753'\n    }, {\n        name: 'Canadian_Aboriginal',\n        bmp: '\\u1400-\\u167F\\u18B0-\\u18F5'\n    }, {\n        name: 'Carian',\n        astral: '\\uD800[\\uDEA0-\\uDED0]'\n    }, {\n        name: 'Caucasian_Albanian',\n        astral: '\\uD801[\\uDD30-\\uDD63\\uDD6F]'\n    }, {\n        name: 'Chakma',\n        astral: '\\uD804[\\uDD00-\\uDD34\\uDD36-\\uDD43]'\n    }, {\n        name: 'Cham',\n        bmp: '\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA5C-\\uAA5F'\n    }, {\n        name: 'Cherokee',\n        bmp: '\\u13A0-\\u13F5\\u13F8-\\u13FD\\uAB70-\\uABBF'\n    }, {\n        name: 'Common',\n        bmp: '\\0-\\x40\\\\x5B-\\x60\\\\x7B-\\xA9\\xAB-\\xB9\\xBB-\\xBF\\xD7\\xF7\\u02B9-\\u02DF\\u02E5-\\u02E9\\u02EC-\\u02FF\\u0374\\u037E\\u0385\\u0387\\u0589\\u0605\\u060C\\u061B\\u061C\\u061F\\u0640\\u06DD\\u08E2\\u0964\\u0965\\u0E3F\\u0FD5-\\u0FD8\\u10FB\\u16EB-\\u16ED\\u1735\\u1736\\u1802\\u1803\\u1805\\u1CD3\\u1CE1\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u2000-\\u200B\\u200E-\\u2064\\u2066-\\u2070\\u2074-\\u207E\\u2080-\\u208E\\u20A0-\\u20BE\\u2100-\\u2125\\u2127-\\u2129\\u212C-\\u2131\\u2133-\\u214D\\u214F-\\u215F\\u2189-\\u218B\\u2190-\\u23FE\\u2400-\\u2426\\u2440-\\u244A\\u2460-\\u27FF\\u2900-\\u2B73\\u2B76-\\u2B95\\u2B98-\\u2BB9\\u2BBD-\\u2BC8\\u2BCA-\\u2BD1\\u2BEC-\\u2BEF\\u2E00-\\u2E44\\u2FF0-\\u2FFB\\u3000-\\u3004\\u3006\\u3008-\\u3020\\u3030-\\u3037\\u303C-\\u303F\\u309B\\u309C\\u30A0\\u30FB\\u30FC\\u3190-\\u319F\\u31C0-\\u31E3\\u3220-\\u325F\\u327F-\\u32CF\\u3358-\\u33FF\\u4DC0-\\u4DFF\\uA700-\\uA721\\uA788-\\uA78A\\uA830-\\uA839\\uA92E\\uA9CF\\uAB5B\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFEFF\\uFF01-\\uFF20\\uFF3B-\\uFF40\\uFF5B-\\uFF65\\uFF70\\uFF9E\\uFF9F\\uFFE0-\\uFFE6\\uFFE8-\\uFFEE\\uFFF9-\\uFFFD',\n        astral: '\\uD800[\\uDD00-\\uDD02\\uDD07-\\uDD33\\uDD37-\\uDD3F\\uDD90-\\uDD9B\\uDDD0-\\uDDFC\\uDEE1-\\uDEFB]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDC00-\\uDCF5\\uDD00-\\uDD26\\uDD29-\\uDD66\\uDD6A-\\uDD7A\\uDD83\\uDD84\\uDD8C-\\uDDA9\\uDDAE-\\uDDE8\\uDF00-\\uDF56\\uDF60-\\uDF71]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83C[\\uDC00-\\uDC2B\\uDC30-\\uDC93\\uDCA0-\\uDCAE\\uDCB1-\\uDCBF\\uDCC1-\\uDCCF\\uDCD1-\\uDCF5\\uDD00-\\uDD0C\\uDD10-\\uDD2E\\uDD30-\\uDD6B\\uDD70-\\uDDAC\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE10-\\uDE3B\\uDE40-\\uDE48\\uDE50\\uDE51\\uDF00-\\uDFFF]|\\uD83D[\\uDC00-\\uDED2\\uDEE0-\\uDEEC\\uDEF0-\\uDEF6\\uDF00-\\uDF73\\uDF80-\\uDFD4]|\\uD83E[\\uDC00-\\uDC0B\\uDC10-\\uDC47\\uDC50-\\uDC59\\uDC60-\\uDC87\\uDC90-\\uDCAD\\uDD10-\\uDD1E\\uDD20-\\uDD27\\uDD30\\uDD33-\\uDD3E\\uDD40-\\uDD4B\\uDD50-\\uDD5E\\uDD80-\\uDD91\\uDDC0]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]'\n    }, {\n        name: 'Coptic',\n        bmp: '\\u03E2-\\u03EF\\u2C80-\\u2CF3\\u2CF9-\\u2CFF'\n    }, {\n        name: 'Cuneiform',\n        astral: '\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC70-\\uDC74\\uDC80-\\uDD43]'\n    }, {\n        name: 'Cypriot',\n        astral: '\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F]'\n    }, {\n        name: 'Cyrillic',\n        bmp: '\\u0400-\\u0484\\u0487-\\u052F\\u1C80-\\u1C88\\u1D2B\\u1D78\\u2DE0-\\u2DFF\\uA640-\\uA69F\\uFE2E\\uFE2F'\n    }, {\n        name: 'Deseret',\n        astral: '\\uD801[\\uDC00-\\uDC4F]'\n    }, {\n        name: 'Devanagari',\n        bmp: '\\u0900-\\u0950\\u0953-\\u0963\\u0966-\\u097F\\uA8E0-\\uA8FD'\n    }, {\n        name: 'Duployan',\n        astral: '\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9C-\\uDC9F]'\n    }, {\n        name: 'Egyptian_Hieroglyphs',\n        astral: '\\uD80C[\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]'\n    }, {\n        name: 'Elbasan',\n        astral: '\\uD801[\\uDD00-\\uDD27]'\n    }, {\n        name: 'Ethiopic',\n        bmp: '\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u137C\\u1380-\\u1399\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E'\n    }, {\n        name: 'Georgian',\n        bmp: '\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u10FF\\u2D00-\\u2D25\\u2D27\\u2D2D'\n    }, {\n        name: 'Glagolitic',\n        bmp: '\\u2C00-\\u2C2E\\u2C30-\\u2C5E',\n        astral: '\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]'\n    }, {\n        name: 'Gothic',\n        astral: '\\uD800[\\uDF30-\\uDF4A]'\n    }, {\n        name: 'Grantha',\n        astral: '\\uD804[\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]'\n    }, {\n        name: 'Greek',\n        bmp: '\\u0370-\\u0373\\u0375-\\u0377\\u037A-\\u037D\\u037F\\u0384\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03E1\\u03F0-\\u03FF\\u1D26-\\u1D2A\\u1D5D-\\u1D61\\u1D66-\\u1D6A\\u1DBF\\u1F00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FC4\\u1FC6-\\u1FD3\\u1FD6-\\u1FDB\\u1FDD-\\u1FEF\\u1FF2-\\u1FF4\\u1FF6-\\u1FFE\\u2126\\uAB65',\n        astral: '\\uD800[\\uDD40-\\uDD8E\\uDDA0]|\\uD834[\\uDE00-\\uDE45]'\n    }, {\n        name: 'Gujarati',\n        bmp: '\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AF1\\u0AF9'\n    }, {\n        name: 'Gurmukhi',\n        bmp: '\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75'\n    }, {\n        name: 'Han',\n        bmp: '\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u3005\\u3007\\u3021-\\u3029\\u3038-\\u303B\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uF900-\\uFA6D\\uFA70-\\uFAD9',\n        astral: '[\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]'\n    }, {\n        name: 'Hangul',\n        bmp: '\\u1100-\\u11FF\\u302E\\u302F\\u3131-\\u318E\\u3200-\\u321E\\u3260-\\u327E\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uFFA0-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'\n    }, {\n        name: 'Hanunoo',\n        bmp: '\\u1720-\\u1734'\n    }, {\n        name: 'Hatran',\n        astral: '\\uD802[\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDCFF]'\n    }, {\n        name: 'Hebrew',\n        bmp: '\\u0591-\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F4\\uFB1D-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFB4F'\n    }, {\n        name: 'Hiragana',\n        bmp: '\\u3041-\\u3096\\u309D-\\u309F',\n        astral: '\\uD82C\\uDC01|\\uD83C\\uDE00'\n    }, {\n        name: 'Imperial_Aramaic',\n        astral: '\\uD802[\\uDC40-\\uDC55\\uDC57-\\uDC5F]'\n    }, {\n        name: 'Inherited',\n        bmp: '\\u0300-\\u036F\\u0485\\u0486\\u064B-\\u0655\\u0670\\u0951\\u0952\\u1AB0-\\u1ABE\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u200C\\u200D\\u20D0-\\u20F0\\u302A-\\u302D\\u3099\\u309A\\uFE00-\\uFE0F\\uFE20-\\uFE2D',\n        astral: '\\uD800[\\uDDFD\\uDEE0]|\\uD834[\\uDD67-\\uDD69\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD]|\\uDB40[\\uDD00-\\uDDEF]'\n    }, {\n        name: 'Inscriptional_Pahlavi',\n        astral: '\\uD802[\\uDF60-\\uDF72\\uDF78-\\uDF7F]'\n    }, {\n        name: 'Inscriptional_Parthian',\n        astral: '\\uD802[\\uDF40-\\uDF55\\uDF58-\\uDF5F]'\n    }, {\n        name: 'Javanese',\n        bmp: '\\uA980-\\uA9CD\\uA9D0-\\uA9D9\\uA9DE\\uA9DF'\n    }, {\n        name: 'Kaithi',\n        astral: '\\uD804[\\uDC80-\\uDCC1]'\n    }, {\n        name: 'Kannada',\n        bmp: '\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2'\n    }, {\n        name: 'Katakana',\n        bmp: '\\u30A1-\\u30FA\\u30FD-\\u30FF\\u31F0-\\u31FF\\u32D0-\\u32FE\\u3300-\\u3357\\uFF66-\\uFF6F\\uFF71-\\uFF9D',\n        astral: '\\uD82C\\uDC00'\n    }, {\n        name: 'Kayah_Li',\n        bmp: '\\uA900-\\uA92D\\uA92F'\n    }, {\n        name: 'Kharoshthi',\n        astral: '\\uD802[\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F-\\uDE47\\uDE50-\\uDE58]'\n    }, {\n        name: 'Khmer',\n        bmp: '\\u1780-\\u17DD\\u17E0-\\u17E9\\u17F0-\\u17F9\\u19E0-\\u19FF'\n    }, {\n        name: 'Khojki',\n        astral: '\\uD804[\\uDE00-\\uDE11\\uDE13-\\uDE3E]'\n    }, {\n        name: 'Khudawadi',\n        astral: '\\uD804[\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9]'\n    }, {\n        name: 'Lao',\n        bmp: '\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF'\n    }, {\n        name: 'Latin',\n        bmp: 'A-Za-z\\xAA\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02B8\\u02E0-\\u02E4\\u1D00-\\u1D25\\u1D2C-\\u1D5C\\u1D62-\\u1D65\\u1D6B-\\u1D77\\u1D79-\\u1DBE\\u1E00-\\u1EFF\\u2071\\u207F\\u2090-\\u209C\\u212A\\u212B\\u2132\\u214E\\u2160-\\u2188\\u2C60-\\u2C7F\\uA722-\\uA787\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA7FF\\uAB30-\\uAB5A\\uAB5C-\\uAB64\\uFB00-\\uFB06\\uFF21-\\uFF3A\\uFF41-\\uFF5A'\n    }, {\n        name: 'Lepcha',\n        bmp: '\\u1C00-\\u1C37\\u1C3B-\\u1C49\\u1C4D-\\u1C4F'\n    }, {\n        name: 'Limbu',\n        bmp: '\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1940\\u1944-\\u194F'\n    }, {\n        name: 'Linear_A',\n        astral: '\\uD801[\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]'\n    }, {\n        name: 'Linear_B',\n        astral: '\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA]'\n    }, {\n        name: 'Lisu',\n        bmp: '\\uA4D0-\\uA4FF'\n    }, {\n        name: 'Lycian',\n        astral: '\\uD800[\\uDE80-\\uDE9C]'\n    }, {\n        name: 'Lydian',\n        astral: '\\uD802[\\uDD20-\\uDD39\\uDD3F]'\n    }, {\n        name: 'Mahajani',\n        astral: '\\uD804[\\uDD50-\\uDD76]'\n    }, {\n        name: 'Malayalam',\n        bmp: '\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4F\\u0D54-\\u0D63\\u0D66-\\u0D7F'\n    }, {\n        name: 'Mandaic',\n        bmp: '\\u0840-\\u085B\\u085E'\n    }, {\n        name: 'Manichaean',\n        astral: '\\uD802[\\uDEC0-\\uDEE6\\uDEEB-\\uDEF6]'\n    }, {\n        name: 'Marchen',\n        astral: '\\uD807[\\uDC70-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6]'\n    }, {\n        name: 'Meetei_Mayek',\n        bmp: '\\uAAE0-\\uAAF6\\uABC0-\\uABED\\uABF0-\\uABF9'\n    }, {\n        name: 'Mende_Kikakui',\n        astral: '\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCD6]'\n    }, {\n        name: 'Meroitic_Cursive',\n        astral: '\\uD802[\\uDDA0-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDDFF]'\n    }, {\n        name: 'Meroitic_Hieroglyphs',\n        astral: '\\uD802[\\uDD80-\\uDD9F]'\n    }, {\n        name: 'Miao',\n        astral: '\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]'\n    }, {\n        name: 'Modi',\n        astral: '\\uD805[\\uDE00-\\uDE44\\uDE50-\\uDE59]'\n    }, {\n        name: 'Mongolian',\n        bmp: '\\u1800\\u1801\\u1804\\u1806-\\u180E\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA',\n        astral: '\\uD805[\\uDE60-\\uDE6C]'\n    }, {\n        name: 'Mro',\n        astral: '\\uD81A[\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE6E\\uDE6F]'\n    }, {\n        name: 'Multani',\n        astral: '\\uD804[\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA9]'\n    }, {\n        name: 'Myanmar',\n        bmp: '\\u1000-\\u109F\\uA9E0-\\uA9FE\\uAA60-\\uAA7F'\n    }, {\n        name: 'Nabataean',\n        astral: '\\uD802[\\uDC80-\\uDC9E\\uDCA7-\\uDCAF]'\n    }, {\n        name: 'New_Tai_Lue',\n        bmp: '\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u19DE\\u19DF'\n    }, {\n        name: 'Newa',\n        astral: '\\uD805[\\uDC00-\\uDC59\\uDC5B\\uDC5D]'\n    }, {\n        name: 'Nko',\n        bmp: '\\u07C0-\\u07FA'\n    }, {\n        name: 'Ogham',\n        bmp: '\\u1680-\\u169C'\n    }, {\n        name: 'Ol_Chiki',\n        bmp: '\\u1C50-\\u1C7F'\n    }, {\n        name: 'Old_Hungarian',\n        astral: '\\uD803[\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDCFF]'\n    }, {\n        name: 'Old_Italic',\n        astral: '\\uD800[\\uDF00-\\uDF23]'\n    }, {\n        name: 'Old_North_Arabian',\n        astral: '\\uD802[\\uDE80-\\uDE9F]'\n    }, {\n        name: 'Old_Permic',\n        astral: '\\uD800[\\uDF50-\\uDF7A]'\n    }, {\n        name: 'Old_Persian',\n        astral: '\\uD800[\\uDFA0-\\uDFC3\\uDFC8-\\uDFD5]'\n    }, {\n        name: 'Old_South_Arabian',\n        astral: '\\uD802[\\uDE60-\\uDE7F]'\n    }, {\n        name: 'Old_Turkic',\n        astral: '\\uD803[\\uDC00-\\uDC48]'\n    }, {\n        name: 'Oriya',\n        bmp: '\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B77'\n    }, {\n        name: 'Osage',\n        astral: '\\uD801[\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB]'\n    }, {\n        name: 'Osmanya',\n        astral: '\\uD801[\\uDC80-\\uDC9D\\uDCA0-\\uDCA9]'\n    }, {\n        name: 'Pahawh_Hmong',\n        astral: '\\uD81A[\\uDF00-\\uDF45\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]'\n    }, {\n        name: 'Palmyrene',\n        astral: '\\uD802[\\uDC60-\\uDC7F]'\n    }, {\n        name: 'Pau_Cin_Hau',\n        astral: '\\uD806[\\uDEC0-\\uDEF8]'\n    }, {\n        name: 'Phags_Pa',\n        bmp: '\\uA840-\\uA877'\n    }, {\n        name: 'Phoenician',\n        astral: '\\uD802[\\uDD00-\\uDD1B\\uDD1F]'\n    }, {\n        name: 'Psalter_Pahlavi',\n        astral: '\\uD802[\\uDF80-\\uDF91\\uDF99-\\uDF9C\\uDFA9-\\uDFAF]'\n    }, {\n        name: 'Rejang',\n        bmp: '\\uA930-\\uA953\\uA95F'\n    }, {\n        name: 'Runic',\n        bmp: '\\u16A0-\\u16EA\\u16EE-\\u16F8'\n    }, {\n        name: 'Samaritan',\n        bmp: '\\u0800-\\u082D\\u0830-\\u083E'\n    }, {\n        name: 'Saurashtra',\n        bmp: '\\uA880-\\uA8C5\\uA8CE-\\uA8D9'\n    }, {\n        name: 'Sharada',\n        astral: '\\uD804[\\uDD80-\\uDDCD\\uDDD0-\\uDDDF]'\n    }, {\n        name: 'Shavian',\n        astral: '\\uD801[\\uDC50-\\uDC7F]'\n    }, {\n        name: 'Siddham',\n        astral: '\\uD805[\\uDD80-\\uDDB5\\uDDB8-\\uDDDD]'\n    }, {\n        name: 'SignWriting',\n        astral: '\\uD836[\\uDC00-\\uDE8B\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]'\n    }, {\n        name: 'Sinhala',\n        bmp: '\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2-\\u0DF4',\n        astral: '\\uD804[\\uDDE1-\\uDDF4]'\n    }, {\n        name: 'Sora_Sompeng',\n        astral: '\\uD804[\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9]'\n    }, {\n        name: 'Sundanese',\n        bmp: '\\u1B80-\\u1BBF\\u1CC0-\\u1CC7'\n    }, {\n        name: 'Syloti_Nagri',\n        bmp: '\\uA800-\\uA82B'\n    }, {\n        name: 'Syriac',\n        bmp: '\\u0700-\\u070D\\u070F-\\u074A\\u074D-\\u074F'\n    }, {\n        name: 'Tagalog',\n        bmp: '\\u1700-\\u170C\\u170E-\\u1714'\n    }, {\n        name: 'Tagbanwa',\n        bmp: '\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773'\n    }, {\n        name: 'Tai_Le',\n        bmp: '\\u1950-\\u196D\\u1970-\\u1974'\n    }, {\n        name: 'Tai_Tham',\n        bmp: '\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA0-\\u1AAD'\n    }, {\n        name: 'Tai_Viet',\n        bmp: '\\uAA80-\\uAAC2\\uAADB-\\uAADF'\n    }, {\n        name: 'Takri',\n        astral: '\\uD805[\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]'\n    }, {\n        name: 'Tamil',\n        bmp: '\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BFA'\n    }, {\n        name: 'Tangut',\n        astral: '\\uD81B\\uDFE0|[\\uD81C-\\uD820][\\uDC00-\\uDFFF]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]'\n    }, {\n        name: 'Telugu',\n        bmp: '\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C78-\\u0C7F'\n    }, {\n        name: 'Thaana',\n        bmp: '\\u0780-\\u07B1'\n    }, {\n        name: 'Thai',\n        bmp: '\\u0E01-\\u0E3A\\u0E40-\\u0E5B'\n    }, {\n        name: 'Tibetan',\n        bmp: '\\u0F00-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F97\\u0F99-\\u0FBC\\u0FBE-\\u0FCC\\u0FCE-\\u0FD4\\u0FD9\\u0FDA'\n    }, {\n        name: 'Tifinagh',\n        bmp: '\\u2D30-\\u2D67\\u2D6F\\u2D70\\u2D7F'\n    }, {\n        name: 'Tirhuta',\n        astral: '\\uD805[\\uDC80-\\uDCC7\\uDCD0-\\uDCD9]'\n    }, {\n        name: 'Ugaritic',\n        astral: '\\uD800[\\uDF80-\\uDF9D\\uDF9F]'\n    }, {\n        name: 'Vai',\n        bmp: '\\uA500-\\uA62B'\n    }, {\n        name: 'Warang_Citi',\n        astral: '\\uD806[\\uDCA0-\\uDCF2\\uDCFF]'\n    }, {\n        name: 'Yi',\n        bmp: '\\uA000-\\uA48C\\uA490-\\uA4C6'\n    }]);\n};\n\nmodule.exports = exports['default'];\n},{}],\"thi6\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _xregexp = require('./xregexp');\n\nvar _xregexp2 = _interopRequireDefault(_xregexp);\n\nvar _build = require('./addons/build');\n\nvar _build2 = _interopRequireDefault(_build);\n\nvar _matchrecursive = require('./addons/matchrecursive');\n\nvar _matchrecursive2 = _interopRequireDefault(_matchrecursive);\n\nvar _unicodeBase = require('./addons/unicode-base');\n\nvar _unicodeBase2 = _interopRequireDefault(_unicodeBase);\n\nvar _unicodeBlocks = require('./addons/unicode-blocks');\n\nvar _unicodeBlocks2 = _interopRequireDefault(_unicodeBlocks);\n\nvar _unicodeCategories = require('./addons/unicode-categories');\n\nvar _unicodeCategories2 = _interopRequireDefault(_unicodeCategories);\n\nvar _unicodeProperties = require('./addons/unicode-properties');\n\nvar _unicodeProperties2 = _interopRequireDefault(_unicodeProperties);\n\nvar _unicodeScripts = require('./addons/unicode-scripts');\n\nvar _unicodeScripts2 = _interopRequireDefault(_unicodeScripts);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _build2.default)(_xregexp2.default);\n(0, _matchrecursive2.default)(_xregexp2.default);\n(0, _unicodeBase2.default)(_xregexp2.default);\n(0, _unicodeBlocks2.default)(_xregexp2.default);\n(0, _unicodeCategories2.default)(_xregexp2.default);\n(0, _unicodeProperties2.default)(_xregexp2.default);\n(0, _unicodeScripts2.default)(_xregexp2.default);\n\nexports.default = _xregexp2.default;\nmodule.exports = exports['default'];\n},{\"./xregexp\":\"khpo\",\"./addons/build\":\"gomO\",\"./addons/matchrecursive\":\"Ijgx\",\"./addons/unicode-base\":\"Ax1H\",\"./addons/unicode-blocks\":\"tuuI\",\"./addons/unicode-categories\":\"v78z\",\"./addons/unicode-properties\":\"TAal\",\"./addons/unicode-scripts\":\"GEDh\"}],\"TkZ2\":[function(require,module,exports) {\n'use strict';\n\nconst xRegExp = require('xregexp');\n\nmodule.exports = (text, separator) => {\n  if (typeof text !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n\n  separator = typeof separator === 'undefined' ? '_' : separator;\n  const regex1 = xRegExp('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n  const regex2 = xRegExp('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n  return text // TODO: Use this instead of `xregexp` when targeting Node.js 10:\n  // .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n  // .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n  .replace(regex1, \"$1\".concat(separator, \"$2\")).replace(regex2, \"$1\".concat(separator, \"$2\")).toLowerCase();\n};\n},{\"xregexp\":\"thi6\"}],\"RooA\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createElement = createElement;\nexports.mount = mount;\n\nvar _decamelize = _interopRequireWildcard(require(\"decamelize\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n//handle es6 / bundling\nconst decamelize = _decamelize['default'] || _decamelize;\n\nfunction createElement(tag, attrs, ...children) {\n  if (typeof tag === 'function') {\n    const fn = tag;\n    const props = attrs;\n    props.children = children;\n    return fn(props);\n  } else {\n    const el = document.createElement(tag);\n    const map = attrs;\n\n    for (let name in map) {\n      if (name && map.hasOwnProperty(name)) {\n        let value = map[name];\n\n        if (name === 'className' && value !== void 0) {\n          el.setAttribute('class', value.toString());\n        } else if (value === false || value === null || value === undefined) {\n          continue;\n        } else if (value === true) {\n          el.setAttribute(name, name);\n        } else if (typeof value === 'function') {\n          el[name.toLowerCase()] = value;\n        } else if (typeof value === 'object') {\n          el.setAttribute(name, flatten(value));\n        } else {\n          el.setAttribute(name, value.toString());\n        }\n      }\n    }\n\n    if (children && children.length > 0) {\n      appendChildren(el, children);\n    }\n\n    return el;\n  }\n}\n\nfunction flatten(o) {\n  const arr = [];\n\n  for (let prop in o) arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n\n  return arr.join(';');\n}\n\nfunction addChild(parentElement, child) {\n  if (child === null || child === undefined || typeof child === \"boolean\") {\n    return;\n  } else if (Array.isArray(child)) {\n    appendChildren(parentElement, child);\n  } else if (isElement(child)) {\n    parentElement.appendChild(child);\n  } else {\n    parentElement.appendChild(document.createTextNode(child.toString()));\n  }\n}\n\nfunction appendChildren(parentElement, children) {\n  children.forEach(child => addChild(parentElement, child));\n}\n\nfunction isElement(el) {\n  //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n  return !!el.nodeType;\n}\n\nfunction mount(element, container) {\n  const activeChildPositions = getActiveChildPositions(container);\n  container.innerHTML = '';\n\n  if (element) {\n    addChild(container, element);\n    if (activeChildPositions) focusChildAtPosition(container, activeChildPositions);\n  }\n}\n\nfunction focusChildAtPosition(element, childPositions) {\n  while (element && childPositions.length) element = element.children.item(childPositions.shift());\n\n  if (element) element.focus();\n}\n\nfunction getActiveChildPositions(containerElement) {\n  var active = document.activeElement;\n  var childPositions = [];\n\n  while (active !== document.body && active !== containerElement) {\n    childPositions.unshift(childPosition(active));\n    active = active.parentElement;\n  }\n\n  if (active === containerElement && childPositions.length) return childPositions;\n}\n\nfunction childPosition(element) {\n  let i = 0;\n\n  while (element = element.previousElementSibling) i++;\n\n  return i;\n}\n},{\"decamelize\":\"TkZ2\"}],\"rq7W\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Table = void 0;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst KeyCodes = {\n  ENTER: 13\n};\n\nconst Table = props => {\n  return (0, _tsxCreateElement.createElement)(\"table\", {\n    className: props.className\n  }, props.children, props.rows.map((row, i) => (0, _tsxCreateElement.createElement)(\"tr\", {\n    className: props.rowClassName || '',\n    onClick: e => props.onRowClick && props.onRowClick(e, i),\n    tabIndex: props.onRowClick ? 0 : -1,\n    onKeyUp: e => {\n      if (e.keyCode === KeyCodes.ENTER && props.onRowClick) {\n        props.onRowClick(e, i);\n      }\n    }\n  }, row.cells.map((cell, i) => (0, _tsxCreateElement.createElement)(\"td\", {\n    className: cell.className || '',\n    title: cell.title || ''\n  }, cell.content)))));\n};\n\nexports.Table = Table;\n},{\"tsx-create-element\":\"RooA\"}],\"EXu7\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Table\", {\n  enumerable: true,\n  get: function () {\n    return _controls.Table;\n  }\n});\n\nvar _controls = require(\"../controls\");\n},{\"../controls\":\"rq7W\"}],\"vJi1\":[function(require,module,exports) {\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n},{}],\"QrKd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.addEl = addEl;\nexports.addDiv = addDiv;\nexports.outerSize = outerSize;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Create a new element as a child of another element.\n * @param tagName Tag name of the new tag to create.\n * @param parentElement Reference of the element to append to.\n * @returns new HTMLElement.\n */\nfunction addEl(tagName, parentElement) {\n  const el = document.createElement(tagName);\n  parentElement.appendChild(el);\n  return el;\n}\n/**\n * Create a new div HTMLElement as a child of another element.\n * @param parentElement Reference of the element to append to.\n * @param className Optional css class name to apply to the div.\n */\n\n\nfunction addDiv(parentElement, className) {\n  const div = addEl('div', parentElement);\n\n  if (className) {\n    div.className = className;\n  }\n\n  return div;\n}\n/**\n * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n * @param el HTML Element to measure.\n */\n\n\nfunction outerSize(el) {\n  const cs = getComputedStyle(el);\n  const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n  const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n  return {\n    height,\n    width\n  };\n}\n},{}],\"XnU9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar isMergeableObject = function isMergeableObject(value) {\n  return isNonNullObject(value) && !isSpecial(value);\n};\n\nfunction isNonNullObject(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isSpecial(value) {\n  var stringValue = Object.prototype.toString.call(value);\n  return stringValue === '[object RegExp]' || stringValue === '[object Date]' || isReactElement(value);\n} // see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\n\n\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n  return value.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nfunction emptyTarget(val) {\n  return Array.isArray(val) ? [] : {};\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n  return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value;\n}\n\nfunction defaultArrayMerge(target, source, options) {\n  return target.concat(source).map(function (element) {\n    return cloneUnlessOtherwiseSpecified(element, options);\n  });\n}\n\nfunction mergeObject(target, source, options) {\n  var destination = {};\n\n  if (options.isMergeableObject(target)) {\n    Object.keys(target).forEach(function (key) {\n      destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    });\n  }\n\n  Object.keys(source).forEach(function (key) {\n    if (!options.isMergeableObject(source[key]) || !target[key]) {\n      destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n    } else {\n      destination[key] = deepmerge(target[key], source[key], options);\n    }\n  });\n  return destination;\n}\n\nfunction deepmerge(target, source, options) {\n  options = options || {};\n  options.arrayMerge = options.arrayMerge || defaultArrayMerge;\n  options.isMergeableObject = options.isMergeableObject || isMergeableObject;\n  var sourceIsArray = Array.isArray(source);\n  var targetIsArray = Array.isArray(target);\n  var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n  if (!sourceAndTargetTypesMatch) {\n    return cloneUnlessOtherwiseSpecified(source, options);\n  } else if (sourceIsArray) {\n    return options.arrayMerge(target, source, options);\n  } else {\n    return mergeObject(target, source, options);\n  }\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n  if (!Array.isArray(array)) {\n    throw new Error('first argument should be an array');\n  }\n\n  return array.reduce(function (prev, next) {\n    return deepmerge(prev, next, options);\n  }, {});\n};\n\nvar deepmerge_1 = deepmerge;\nvar _default = deepmerge_1;\nexports.default = _default;\n},{}],\"VNzP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.clone = clone;\nexports.deepMerge = deepMerge;\n\nvar _deepmerge = _interopRequireWildcard(require(\"deepmerge\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst deepmerge = _deepmerge.default || _deepmerge;\n\nfunction clone(objectToClone) {\n  if (!objectToClone) return objectToClone;\n  return deepmerge.all([objectToClone]);\n}\n\nconst dontMerge = (destination, source) => source;\n\nfunction deepMerge(...objectsToMerge) {\n  const objects = objectsToMerge.filter(Boolean);\n  return deepmerge.all(objects, {\n    arrayMerge: dontMerge\n  });\n}\n},{\"deepmerge\":\"XnU9\"}],\"eook\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Color = Color;\nexports.default = color;\nexports.rgbConvert = rgbConvert;\nexports.rgb = rgb;\nexports.Rgb = Rgb;\nexports.hslConvert = hslConvert;\nexports.hsl = hsl;\nexports.brighter = exports.darker = void 0;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction Color() {}\n\nvar darker = 0.7;\nexports.darker = darker;\nvar brighter = 1 / darker;\nexports.brighter = brighter;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n    reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n    reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n    reHex = /^#([0-9a-f]{3,8})$/,\n    reRgbInteger = new RegExp(\"^rgb\\\\(\" + [reI, reI, reI] + \"\\\\)$\"),\n    reRgbPercent = new RegExp(\"^rgb\\\\(\" + [reP, reP, reP] + \"\\\\)$\"),\n    reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [reI, reI, reI, reN] + \"\\\\)$\"),\n    reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [reP, reP, reP, reN] + \"\\\\)$\"),\n    reHslPercent = new RegExp(\"^hsl\\\\(\" + [reN, reP, reP] + \"\\\\)$\"),\n    reHslaPercent = new RegExp(\"^hsla\\\\(\" + [reN, reP, reP, reN] + \"\\\\)$\");\nvar named = {\n  aliceblue: 0xf0f8ff,\n  antiquewhite: 0xfaebd7,\n  aqua: 0x00ffff,\n  aquamarine: 0x7fffd4,\n  azure: 0xf0ffff,\n  beige: 0xf5f5dc,\n  bisque: 0xffe4c4,\n  black: 0x000000,\n  blanchedalmond: 0xffebcd,\n  blue: 0x0000ff,\n  blueviolet: 0x8a2be2,\n  brown: 0xa52a2a,\n  burlywood: 0xdeb887,\n  cadetblue: 0x5f9ea0,\n  chartreuse: 0x7fff00,\n  chocolate: 0xd2691e,\n  coral: 0xff7f50,\n  cornflowerblue: 0x6495ed,\n  cornsilk: 0xfff8dc,\n  crimson: 0xdc143c,\n  cyan: 0x00ffff,\n  darkblue: 0x00008b,\n  darkcyan: 0x008b8b,\n  darkgoldenrod: 0xb8860b,\n  darkgray: 0xa9a9a9,\n  darkgreen: 0x006400,\n  darkgrey: 0xa9a9a9,\n  darkkhaki: 0xbdb76b,\n  darkmagenta: 0x8b008b,\n  darkolivegreen: 0x556b2f,\n  darkorange: 0xff8c00,\n  darkorchid: 0x9932cc,\n  darkred: 0x8b0000,\n  darksalmon: 0xe9967a,\n  darkseagreen: 0x8fbc8f,\n  darkslateblue: 0x483d8b,\n  darkslategray: 0x2f4f4f,\n  darkslategrey: 0x2f4f4f,\n  darkturquoise: 0x00ced1,\n  darkviolet: 0x9400d3,\n  deeppink: 0xff1493,\n  deepskyblue: 0x00bfff,\n  dimgray: 0x696969,\n  dimgrey: 0x696969,\n  dodgerblue: 0x1e90ff,\n  firebrick: 0xb22222,\n  floralwhite: 0xfffaf0,\n  forestgreen: 0x228b22,\n  fuchsia: 0xff00ff,\n  gainsboro: 0xdcdcdc,\n  ghostwhite: 0xf8f8ff,\n  gold: 0xffd700,\n  goldenrod: 0xdaa520,\n  gray: 0x808080,\n  green: 0x008000,\n  greenyellow: 0xadff2f,\n  grey: 0x808080,\n  honeydew: 0xf0fff0,\n  hotpink: 0xff69b4,\n  indianred: 0xcd5c5c,\n  indigo: 0x4b0082,\n  ivory: 0xfffff0,\n  khaki: 0xf0e68c,\n  lavender: 0xe6e6fa,\n  lavenderblush: 0xfff0f5,\n  lawngreen: 0x7cfc00,\n  lemonchiffon: 0xfffacd,\n  lightblue: 0xadd8e6,\n  lightcoral: 0xf08080,\n  lightcyan: 0xe0ffff,\n  lightgoldenrodyellow: 0xfafad2,\n  lightgray: 0xd3d3d3,\n  lightgreen: 0x90ee90,\n  lightgrey: 0xd3d3d3,\n  lightpink: 0xffb6c1,\n  lightsalmon: 0xffa07a,\n  lightseagreen: 0x20b2aa,\n  lightskyblue: 0x87cefa,\n  lightslategray: 0x778899,\n  lightslategrey: 0x778899,\n  lightsteelblue: 0xb0c4de,\n  lightyellow: 0xffffe0,\n  lime: 0x00ff00,\n  limegreen: 0x32cd32,\n  linen: 0xfaf0e6,\n  magenta: 0xff00ff,\n  maroon: 0x800000,\n  mediumaquamarine: 0x66cdaa,\n  mediumblue: 0x0000cd,\n  mediumorchid: 0xba55d3,\n  mediumpurple: 0x9370db,\n  mediumseagreen: 0x3cb371,\n  mediumslateblue: 0x7b68ee,\n  mediumspringgreen: 0x00fa9a,\n  mediumturquoise: 0x48d1cc,\n  mediumvioletred: 0xc71585,\n  midnightblue: 0x191970,\n  mintcream: 0xf5fffa,\n  mistyrose: 0xffe4e1,\n  moccasin: 0xffe4b5,\n  navajowhite: 0xffdead,\n  navy: 0x000080,\n  oldlace: 0xfdf5e6,\n  olive: 0x808000,\n  olivedrab: 0x6b8e23,\n  orange: 0xffa500,\n  orangered: 0xff4500,\n  orchid: 0xda70d6,\n  palegoldenrod: 0xeee8aa,\n  palegreen: 0x98fb98,\n  paleturquoise: 0xafeeee,\n  palevioletred: 0xdb7093,\n  papayawhip: 0xffefd5,\n  peachpuff: 0xffdab9,\n  peru: 0xcd853f,\n  pink: 0xffc0cb,\n  plum: 0xdda0dd,\n  powderblue: 0xb0e0e6,\n  purple: 0x800080,\n  rebeccapurple: 0x663399,\n  red: 0xff0000,\n  rosybrown: 0xbc8f8f,\n  royalblue: 0x4169e1,\n  saddlebrown: 0x8b4513,\n  salmon: 0xfa8072,\n  sandybrown: 0xf4a460,\n  seagreen: 0x2e8b57,\n  seashell: 0xfff5ee,\n  sienna: 0xa0522d,\n  silver: 0xc0c0c0,\n  skyblue: 0x87ceeb,\n  slateblue: 0x6a5acd,\n  slategray: 0x708090,\n  slategrey: 0x708090,\n  snow: 0xfffafa,\n  springgreen: 0x00ff7f,\n  steelblue: 0x4682b4,\n  tan: 0xd2b48c,\n  teal: 0x008080,\n  thistle: 0xd8bfd8,\n  tomato: 0xff6347,\n  turquoise: 0x40e0d0,\n  violet: 0xee82ee,\n  wheat: 0xf5deb3,\n  white: 0xffffff,\n  whitesmoke: 0xf5f5f5,\n  yellow: 0xffff00,\n  yellowgreen: 0x9acd32\n};\n(0, _define.default)(Color, color, {\n  copy: function (channels) {\n    return Object.assign(new this.constructor(), this, channels);\n  },\n  displayable: function () {\n    return this.rgb().displayable();\n  },\n  hex: color_formatHex,\n  // Deprecated! Use color.formatHex.\n  formatHex: color_formatHex,\n  formatHsl: color_formatHsl,\n  formatRgb: color_formatRgb,\n  toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n  return this.rgb().formatHex();\n}\n\nfunction color_formatHsl() {\n  return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n  return this.rgb().formatRgb();\n}\n\nfunction color(format) {\n  var m, l;\n  format = (format + \"\").trim().toLowerCase();\n  return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n  : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n  : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n  : l === 4 ? new Rgb(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n  : null // invalid hex\n  ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n  : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n  : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n  : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n  : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n  : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n  : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n  : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\n\nfunction rgbn(n) {\n  return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n  if (a <= 0) r = g = b = NaN;\n  return new Rgb(r, g, b, a);\n}\n\nfunction rgbConvert(o) {\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Rgb();\n  o = o.rgb();\n  return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nfunction rgb(r, g, b, opacity) {\n  return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nfunction Rgb(r, g, b, opacity) {\n  this.r = +r;\n  this.g = +g;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Rgb, rgb, (0, _define.extend)(Color, {\n  brighter: function (k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n  },\n  rgb: function () {\n    return this;\n  },\n  displayable: function () {\n    return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n  },\n  hex: rgb_formatHex,\n  // Deprecated! Use color.formatHex.\n  formatHex: rgb_formatHex,\n  formatRgb: rgb_formatRgb,\n  toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n  return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\n\nfunction rgb_formatRgb() {\n  var a = this.opacity;\n  a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n  return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\n\nfunction hex(value) {\n  value = Math.max(0, Math.min(255, Math.round(value) || 0));\n  return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n  if (a <= 0) h = s = l = NaN;else if (l <= 0 || l >= 1) h = s = NaN;else if (s <= 0) h = NaN;\n  return new Hsl(h, s, l, a);\n}\n\nfunction hslConvert(o) {\n  if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof Color)) o = color(o);\n  if (!o) return new Hsl();\n  if (o instanceof Hsl) return o;\n  o = o.rgb();\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      min = Math.min(r, g, b),\n      max = Math.max(r, g, b),\n      h = NaN,\n      s = max - min,\n      l = (max + min) / 2;\n\n  if (s) {\n    if (r === max) h = (g - b) / s + (g < b) * 6;else if (g === max) h = (b - r) / s + 2;else h = (r - g) / s + 4;\n    s /= l < 0.5 ? max + min : 2 - max - min;\n    h *= 60;\n  } else {\n    s = l > 0 && l < 1 ? 0 : h;\n  }\n\n  return new Hsl(h, s, l, o.opacity);\n}\n\nfunction hsl(h, s, l, opacity) {\n  return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Hsl, hsl, (0, _define.extend)(Color, {\n  brighter: function (k) {\n    k = k == null ? brighter : Math.pow(brighter, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? darker : Math.pow(darker, k);\n    return new Hsl(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function () {\n    var h = this.h % 360 + (this.h < 0) * 360,\n        s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n        l = this.l,\n        m2 = l + (l < 0.5 ? l : 1 - l) * s,\n        m1 = 2 * l - m2;\n    return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n  },\n  displayable: function () {\n    return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n  },\n  formatHsl: function () {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n  }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */\n\nfunction hsl2rgb(h, m1, m2) {\n  return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n},{\"./define.js\":\"fV2I\"}],\"CdgH\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.gray = gray;\nexports.default = lab;\nexports.Lab = Lab;\nexports.lch = lch;\nexports.hcl = hcl;\nexports.Hcl = Hcl;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nvar _color = require(\"./color.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nvar K = 18,\n    Xn = 0.96422,\n    Yn = 1,\n    Zn = 0.82521,\n    t0 = 4 / 29,\n    t1 = 6 / 29,\n    t2 = 3 * t1 * t1,\n    t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n  if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n  if (o instanceof Hcl) return hcl2lab(o);\n  if (!(o instanceof _color.Rgb)) o = (0, _color.rgbConvert)(o);\n  var r = rgb2lrgb(o.r),\n      g = rgb2lrgb(o.g),\n      b = rgb2lrgb(o.b),\n      y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn),\n      x,\n      z;\n  if (r === g && g === b) x = z = y;else {\n    x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n    z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n  }\n  return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nfunction gray(l, opacity) {\n  return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nfunction lab(l, a, b, opacity) {\n  return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nfunction Lab(l, a, b, opacity) {\n  this.l = +l;\n  this.a = +a;\n  this.b = +b;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Lab, lab, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n  },\n  darker: function (k) {\n    return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n  },\n  rgb: function () {\n    var y = (this.l + 16) / 116,\n        x = isNaN(this.a) ? y : y + this.a / 500,\n        z = isNaN(this.b) ? y : y - this.b / 200;\n    x = Xn * lab2xyz(x);\n    y = Yn * lab2xyz(y);\n    z = Zn * lab2xyz(z);\n    return new _color.Rgb(lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity);\n  }\n}));\n\nfunction xyz2lab(t) {\n  return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n  return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n  return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n  return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n  if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n  if (!(o instanceof Lab)) o = labConvert(o);\n  if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n\n  var h = Math.atan2(o.b, o.a) * _math.rad2deg;\n\n  return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nfunction lch(l, c, h, opacity) {\n  return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction hcl(h, c, l, opacity) {\n  return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hcl(h, c, l, opacity) {\n  this.h = +h;\n  this.c = +c;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n  if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n  var h = o.h * _math.deg2rad;\n  return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\n(0, _define.default)(Hcl, hcl, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n  },\n  darker: function (k) {\n    return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n  },\n  rgb: function () {\n    return hcl2lab(this).rgb();\n  }\n}));\n},{\"./define.js\":\"fV2I\",\"./color.js\":\"eook\",\"./math.js\":\"XzID\"}],\"cFP1\":[function(require,module,exports) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = cubehelix;\nexports.Cubehelix = Cubehelix;\n\nvar _define = _interopRequireWildcard(require(\"./define.js\"));\n\nvar _color = require(\"./color.js\");\n\nvar _math = require(\"./math.js\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar A = -0.14861,\n    B = +1.78277,\n    C = -0.29227,\n    D = -0.90649,\n    E = +1.97294,\n    ED = E * D,\n    EB = E * B,\n    BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n  if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n  if (!(o instanceof _color.Rgb)) o = (0, _color.rgbConvert)(o);\n  var r = o.r / 255,\n      g = o.g / 255,\n      b = o.b / 255,\n      l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n      bl = b - l,\n      k = (E * (g - l) - C * bl) / D,\n      s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)),\n      // NaN if l=0 or l=1\n  h = s ? Math.atan2(k, bl) * _math.rad2deg - 120 : NaN;\n  return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nfunction cubehelix(h, s, l, opacity) {\n  return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Cubehelix(h, s, l, opacity) {\n  this.h = +h;\n  this.s = +s;\n  this.l = +l;\n  this.opacity = +opacity;\n}\n\n(0, _define.default)(Cubehelix, cubehelix, (0, _define.extend)(_color.Color, {\n  brighter: function (k) {\n    k = k == null ? _color.brighter : Math.pow(_color.brighter, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  darker: function (k) {\n    k = k == null ? _color.darker : Math.pow(_color.darker, k);\n    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n  },\n  rgb: function () {\n    var h = isNaN(this.h) ? 0 : (this.h + 120) * _math.deg2rad,\n        l = +this.l,\n        a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n        cosh = Math.cos(h),\n        sinh = Math.sin(h);\n    return new _color.Rgb(255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity);\n  }\n}));\n},{\"./define.js\":\"fV2I\",\"./color.js\":\"eook\",\"./math.js\":\"XzID\"}],\"BCXH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"color\", {\n  enumerable: true,\n  get: function () {\n    return _color.default;\n  }\n});\nObject.defineProperty(exports, \"rgb\", {\n  enumerable: true,\n  get: function () {\n    return _color.rgb;\n  }\n});\nObject.defineProperty(exports, \"hsl\", {\n  enumerable: true,\n  get: function () {\n    return _color.hsl;\n  }\n});\nObject.defineProperty(exports, \"lab\", {\n  enumerable: true,\n  get: function () {\n    return _lab.default;\n  }\n});\nObject.defineProperty(exports, \"hcl\", {\n  enumerable: true,\n  get: function () {\n    return _lab.hcl;\n  }\n});\nObject.defineProperty(exports, \"lch\", {\n  enumerable: true,\n  get: function () {\n    return _lab.lch;\n  }\n});\nObject.defineProperty(exports, \"gray\", {\n  enumerable: true,\n  get: function () {\n    return _lab.gray;\n  }\n});\nObject.defineProperty(exports, \"cubehelix\", {\n  enumerable: true,\n  get: function () {\n    return _cubehelix.default;\n  }\n});\n\nvar _color = _interopRequireWildcard(require(\"./color.js\"));\n\nvar _lab = _interopRequireWildcard(require(\"./lab.js\"));\n\nvar _cubehelix = _interopRequireDefault(require(\"./cubehelix.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./color.js\":\"eook\",\"./lab.js\":\"CdgH\",\"./cubehelix.js\":\"cFP1\"}],\"e0Zu\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.colorIsEqual = colorIsEqual;\nexports.colorFromString = colorFromString;\nexports.colorToString = colorToString;\nexports.desaturate = desaturate;\nexports.isColor = isColor;\n\nvar _d3Color = require(\"d3-color\");\n\nfunction rgbToDeckglColor(c) {\n  return [c.r, c.g, c.b, c.opacity * 255];\n}\n/**\n * Compares 2 colors to see if they are equal.\n * @param a Color to compare\n * @param b Color to compare\n * @returns True if colors are equal.\n */\n\n\nfunction colorIsEqual(a, b) {\n  if (a.length !== b.length) return false;\n\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return false;\n  }\n\n  return true;\n}\n/**\n * Convert a CSS color string to a Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n */\n\n\nfunction colorFromString(cssColorSpecifier) {\n  if (cssColorSpecifier) {\n    const dc = (0, _d3Color.color)(cssColorSpecifier);\n\n    if (dc) {\n      const c = dc.rgb();\n      return rgbToDeckglColor(c);\n    }\n  }\n}\n/**\n * Convert a Deck.gl color to a CSS rgba() string.\n * @param color A Deck.gl Color array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n */\n\n\nfunction colorToString(color) {\n  const c = [...color];\n\n  if (c.length > 3) {\n    c[3] /= 255;\n  }\n\n  return `rgba(${c.join(',')})`;\n}\n\nfunction desaturate(color, value) {\n  const rgb = (0, _d3Color.rgb)(color[0], color[1], color[2], color[3] / 255);\n  const hslColor = (0, _d3Color.hsl)(rgb);\n  hslColor.s = value;\n  const c = hslColor.rgb();\n  return rgbToDeckglColor(c);\n}\n\nfunction isColor(cssColorSpecifier) {\n  return !!(0, _d3Color.color)(cssColorSpecifier);\n}\n},{\"d3-color\":\"BCXH\"}],\"zVYr\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.use = use;\nexports.base = void 0;\nlet vega = {\n  CanvasHandler: null,\n  inferType: null,\n  inferTypes: null,\n  loader: null,\n  parse: null,\n  read: null,\n  renderModule: null,\n  Renderer: null,\n  sceneVisit: null,\n  scheme: null,\n  View: null\n};\nlet deck = {\n  CompositeLayer: null,\n  COORDINATE_SYSTEM: null,\n  Deck: null,\n  Layer: null,\n  LinearInterpolator: null,\n  OrbitView: null,\n  _OrbitController: null\n};\nlet layers = {\n  IconLayer: null,\n  LineLayer: null,\n  PolygonLayer: null,\n  TextLayer: null\n};\nlet luma = {\n  CubeGeometry: null,\n  fp64: null,\n  Model: null,\n  Texture2D: null\n};\n/**\n * References to dependency libraries.\n */\n\nconst base = {\n  deck,\n  layers,\n  luma,\n  vega\n};\n/**\n * Specify the dependency libraries to use for rendering.\n * @param vega Vega library.\n * @param deck deck/core library.\n * @param layers deck/layers library.\n * @param luma luma.gl library.\n */\n\nexports.base = base;\n\nfunction use(vega, deck, layers, luma) {\n  base.deck = deck;\n  base.layers = layers;\n  base.luma = luma;\n  base.vega = vega;\n}\n},{}],\"vN6g\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.makeFontAtlas = makeFontAtlas;\nexports.DEFAULT_FONT_SETTINGS = exports.DEFAULT_FONT_WEIGHT = exports.DEFAULT_FONT_FAMILY = exports.DEFAULT_CHAR_SET = void 0;\n\nvar _tinySdf = _interopRequireDefault(require(\"@mapbox/tiny-sdf\"));\n\nvar _base = require(\"../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/font-atlas.js\n\n/* global document */\nconst GL_TEXTURE_WRAP_S = 0x2802;\nconst GL_TEXTURE_WRAP_T = 0x2803;\nconst GL_CLAMP_TO_EDGE = 0x812f;\nconst MAX_CANVAS_WIDTH = 1024;\nconst BASELINE_SCALE = 0.9;\nconst HEIGHT_SCALE = 1.2;\n\nfunction getDefaultCharacterSet() {\n  const charSet = [];\n\n  for (let i = 32; i < 128; i++) {\n    charSet.push(String.fromCharCode(i));\n  }\n\n  return charSet;\n}\n\nconst DEFAULT_CHAR_SET = getDefaultCharacterSet();\nexports.DEFAULT_CHAR_SET = DEFAULT_CHAR_SET;\nconst DEFAULT_FONT_FAMILY = 'Monaco, monospace';\nexports.DEFAULT_FONT_FAMILY = DEFAULT_FONT_FAMILY;\nconst DEFAULT_FONT_WEIGHT = 'normal';\nexports.DEFAULT_FONT_WEIGHT = DEFAULT_FONT_WEIGHT;\nconst DEFAULT_FONT_SETTINGS = {\n  fontSize: 64,\n  buffer: 2,\n  sdf: false,\n  cutoff: 0.25,\n  radius: 3\n};\nexports.DEFAULT_FONT_SETTINGS = DEFAULT_FONT_SETTINGS;\n\nfunction populateAlphaChannel(alphaChannel, imageData) {\n  // populate distance value from tinySDF to image alpha channel\t\n  for (let i = 0; i < alphaChannel.length; i++) {\n    imageData.data[4 * i + 3] = alphaChannel[i];\n  }\n}\n\nfunction setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n  ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n  ctx.fillStyle = '#000';\n  ctx.textBaseline = 'alphabetic';\n  ctx.textAlign = 'left';\n}\n\nfunction buildMapping({\n  ctx,\n  fontHeight,\n  buffer,\n  characterSet,\n  maxCanvasWidth\n}) {\n  const mapping = {};\n  let row = 0;\n  let x = 0;\n  Array.from(characterSet).forEach(char => {\n    // measure texts\n    // TODO - use Advanced text metrics when they are adopted:\n    // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics\n    const {\n      width\n    } = ctx.measureText(char);\n\n    if (x + width + buffer * 2 > maxCanvasWidth) {\n      x = 0;\n      row++;\n    }\n\n    mapping[char] = {\n      x: x + buffer,\n      y: row * (fontHeight + buffer * 2) + buffer,\n      width,\n      height: fontHeight,\n      mask: true\n    };\n    x += width + buffer * 2;\n  });\n  const canvasHeight = (row + 1) * (fontHeight + buffer * 2);\n  return {\n    mapping,\n    canvasHeight\n  };\n}\n\nfunction makeFontAtlas(gl, fontSettings) {\n  const mergedFontSettings = Object.assign({\n    fontFamily: DEFAULT_FONT_FAMILY,\n    fontWeight: DEFAULT_FONT_WEIGHT,\n    characterSet: DEFAULT_CHAR_SET\n  }, DEFAULT_FONT_SETTINGS, fontSettings);\n  const {\n    fontFamily,\n    fontWeight,\n    characterSet,\n    fontSize,\n    buffer,\n    sdf,\n    radius,\n    cutoff\n  } = mergedFontSettings;\n  const canvas = document.createElement('canvas');\n  const ctx = canvas.getContext('2d'); // build mapping\n\n  setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n  const fontHeight = fontSize * HEIGHT_SCALE;\n  const {\n    canvasHeight,\n    mapping\n  } = buildMapping({\n    ctx,\n    fontHeight,\n    buffer,\n    characterSet,\n    maxCanvasWidth: MAX_CANVAS_WIDTH\n  });\n  canvas.width = MAX_CANVAS_WIDTH;\n  canvas.height = canvasHeight;\n  setTextStyle(ctx, fontFamily, fontSize, fontWeight); // layout characters\n\n  if (sdf) {\n    const tinySDF = new _tinySdf.default(fontSize, buffer, radius, cutoff, fontFamily, fontWeight); // used to store distance values from tinySDF\t\n\n    const imageData = ctx.createImageData(tinySDF.size, tinySDF.size);\n\n    for (const char of characterSet) {\n      populateAlphaChannel(tinySDF.draw(char), imageData);\n      ctx.putImageData(imageData, mapping[char].x - buffer, mapping[char].y - buffer);\n    }\n  } else {\n    for (const char of characterSet) {\n      ctx.fillText(char, mapping[char].x, mapping[char].y + fontSize * BASELINE_SCALE);\n    }\n  }\n\n  return {\n    scale: HEIGHT_SCALE,\n    mapping,\n    texture: new _base.base.luma.Texture2D(gl, {\n      pixels: canvas,\n      // padding is added only between the characters but not for borders\n      // enforce CLAMP_TO_EDGE to avoid any artifacts.\n      parameters: {\n        [GL_TEXTURE_WRAP_S]: GL_CLAMP_TO_EDGE,\n        [GL_TEXTURE_WRAP_T]: GL_CLAMP_TO_EDGE\n      }\n    })\n  };\n}\n},{\"@mapbox/tiny-sdf\":\"TWhu\",\"../base\":\"zVYr\"}],\"P7XX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-fragment.glsl.js\nvar _default = `\\\n#define SHADER_NAME multi-icon-layer-fragment-shader\n\nprecision highp float;\n\nuniform sampler2D iconsTexture;\nuniform float buffer;\nuniform bool sdf;\n\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nconst float MIN_ALPHA = 0.05;\n\nvoid main(void) {\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\n  \n  float alpha = texColor.a;\n\n  // if enable sdf (signed distance fields)\t\n  if (sdf) {\t\n    float distance = texture2D(iconsTexture, vTextureCoords).a;\t\n    alpha = smoothstep(buffer - vGamma, buffer + vGamma, distance);\t\n  }\n\n  // Take the global opacity and the alpha from vColor into account for the alpha component\n  float a = alpha * vColor.a;\n\n  if (picking_uActive) {\n\n    // use picking color for entire rectangle\n    gl_FragColor = vec4(picking_vRGBcolor_Aselected.rgb, 1.0);\n  \n  } else {\n\n    if (a < MIN_ALPHA) {\n      discard;\n    } else {\n\n      gl_FragColor = vec4(vColor.rgb, a);\n\n      // use highlight color if this fragment belongs to the selected object.\n      bool selected = bool(picking_vRGBcolor_Aselected.a);\n      if (selected) {\n        gl_FragColor = vec4(vHighlightColor.rgb, a);\n      }\n    }\n  }\n}\n`;\nexports.default = _default;\n},{}],\"tX0b\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer-vertex.glsl.js\nvar _default = `\\\n#define SHADER_NAME multi-icon-layer-vertex-shader\n\nattribute vec2 positions;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute float instanceSizes;\nattribute float instanceAngles;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\nattribute vec4 instanceIconFrames;\nattribute float instanceColorModes;\nattribute vec2 instanceOffsets;\n\n// the following three attributes are for the multi-icon layer\nattribute vec2 instancePixelOffset;\nattribute vec4 instanceHighlightColors;\n\nuniform float sizeScale;\nuniform vec2 iconsTextureDim;\nuniform float gamma;\nuniform float opacity;\n\nvarying float vColorMode;\nvarying vec4 vColor;\nvarying vec2 vTextureCoords;\nvarying float vGamma;\nvarying vec4 vHighlightColor;\n\nvec2 rotate_by_angle(vec2 vertex, float angle) {\n  float angle_radian = angle * PI / 180.0;\n  float cos_angle = cos(angle_radian);\n  float sin_angle = sin(angle_radian);\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\n  return rotationMatrix * vertex;\n}\n\nvoid main(void) {\n  vec2 iconSize = instanceIconFrames.zw;\n  // scale icon height to match instanceSize\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : instanceSizes / iconSize.y;\n\n  // scale and rotate vertex in \"pixel\" value and convert back to fraction in clipspace\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\n\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * sizeScale * instanceScale;\n  pixelOffset += instancePixelOffset;\n  pixelOffset.y *= -1.0;\n\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, vec3(0.0));\n  gl_Position += project_pixel_to_clipspace(pixelOffset);\n\n  vTextureCoords = mix(\n    instanceIconFrames.xy,\n    instanceIconFrames.xy + iconSize,\n    (positions.xy + 1.0) / 2.0\n  ) / iconsTextureDim;\n\n  vTextureCoords.y = 1.0 - vTextureCoords.y;\n\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity) / 255.;\n  vHighlightColor = vec4(instanceHighlightColors.rgb, instanceHighlightColors.a * opacity) / 255.;\n\n  picking_setPickingColor(instancePickingColors);\n\n  vGamma = gamma / (sizeScale * iconSize.y);\n}\n`;\nexports.default = _default;\n},{}],\"YJVR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.MultiIconLayer = void 0;\n\nvar _chromaticMultiIconLayerFragment = _interopRequireDefault(require(\"./chromatic-multi-icon-layer-fragment.glsl\"));\n\nvar _chromaticMultiIconLayerVertex = _interopRequireDefault(require(\"./chromatic-multi-icon-layer-vertex.glsl\"));\n\nvar _base = require(\"../../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/multi-icon-layer/multi-icon-layer.js\n// TODO expose as layer properties\nconst DEFAULT_GAMMA = 0.2;\nconst DEFAULT_BUFFER = 192.0 / 256;\nconst defaultProps = {\n  getShiftInQueue: {\n    type: 'accessor',\n    value: x => x.shift || 0\n  },\n  getLengthOfQueue: {\n    type: 'accessor',\n    value: x => x.len || 1\n  },\n  // 1: left, 0: middle, -1: right\n  getAnchorX: {\n    type: 'accessor',\n    value: x => x.anchorX || 0\n  },\n  // 1: top, 0: center, -1: bottom\n  getAnchorY: {\n    type: 'accessor',\n    value: x => x.anchorY || 0\n  },\n  getPixelOffset: {\n    type: 'accessor',\n    value: [0, 0]\n  },\n  // object with the same pickingIndex will be picked when any one of them is being picked\n  getPickingIndex: {\n    type: 'accessor',\n    value: x => x.objectIndex\n  }\n}; //https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\n\nconst UNSIGNED_BYTE = 0x1401;\n\nfunction _MultiIconLayer(...props) {\n  class __MultiIconLayer extends _base.base.layers.IconLayer {\n    constructor(...props) {\n      super(...arguments);\n    }\n\n    getShaders() {\n      return Object.assign({}, super.getShaders(), {\n        vs: _chromaticMultiIconLayerVertex.default,\n        fs: _chromaticMultiIconLayerFragment.default\n      });\n    }\n\n    initializeState() {\n      super.initializeState();\n      const attributeManager = this.getAttributeManager();\n      attributeManager.addInstanced({\n        instancePixelOffset: {\n          size: 2,\n          transition: true,\n          accessor: 'getPixelOffset'\n        },\n        instanceHighlightColors: {\n          size: 4,\n          type: UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getHighlightColor',\n          defaultValue: [0, 255, 0, 255]\n        }\n      });\n    }\n\n    updateState(updateParams) {\n      super.updateState(updateParams);\n      const {\n        changeFlags\n      } = updateParams;\n\n      if (changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.getAnchorX || changeFlags.updateTriggersChanged.getAnchorY)) {\n        this.getAttributeManager().invalidate('instanceOffsets');\n      }\n    }\n\n    draw({\n      uniforms\n    }) {\n      const {\n        sdf\n      } = this.props;\n      super.draw({\n        uniforms: Object.assign({}, uniforms, {\n          // Refer the following doc about gamma and buffer\n          // https://blog.mapbox.com/drawing-text-with-signed-distance-fields-in-mapbox-gl-b0933af6f817\n          buffer: DEFAULT_BUFFER,\n          gamma: DEFAULT_GAMMA,\n          sdf: Boolean(sdf)\n        })\n      });\n    }\n\n    calculateInstanceOffsets(attribute) {\n      const {\n        data,\n        iconMapping,\n        getIcon,\n        getAnchorX,\n        getAnchorY,\n        getLengthOfQueue,\n        getShiftInQueue\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n\n      for (const object of data) {\n        const icon = getIcon(object);\n        const rect = iconMapping[icon] || {};\n        const len = getLengthOfQueue(object);\n        const shiftX = getShiftInQueue(object);\n        value[i++] = (getAnchorX(object) - 1) * len / 2 + rect.width / 2 + shiftX || 0;\n        value[i++] = rect.height / 2 * getAnchorY(object) || 0;\n      }\n    }\n\n    calculateInstancePickingColors(attribute) {\n      const {\n        data,\n        getPickingIndex\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n      const pickingColor = [];\n\n      for (const point of data) {\n        const index = getPickingIndex(point);\n        this.encodePickingColor(index, pickingColor);\n        value[i++] = pickingColor[0];\n        value[i++] = pickingColor[1];\n        value[i++] = pickingColor[2];\n      }\n    }\n\n  }\n\n  __MultiIconLayer.layerName = 'MultiIconLayer';\n  __MultiIconLayer.defaultProps = defaultProps;\n  const instance = new __MultiIconLayer(...arguments);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * CubeLayer - a Deck.gl layer to render cuboids.\n * This is instantiatable by calling `new MultiIconLayer()`.\n */\n\n\nconst MultiIconLayer = _MultiIconLayer;\nexports.MultiIconLayer = MultiIconLayer;\n},{\"./chromatic-multi-icon-layer-fragment.glsl\":\"P7XX\",\"./chromatic-multi-icon-layer-vertex.glsl\":\"tX0b\",\"../../base\":\"zVYr\"}],\"fD4N\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ChromaticTextLayer = void 0;\n\nvar _base = require(\"../base\");\n\nvar _fontAtlas = require(\"./font-atlas\");\n\nvar _chromaticMultiIconLayer = require(\"./chromatic-multi-icon-layer/chromatic-multi-icon-layer\");\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//adapted from https://github.com/uber/deck.gl/blob/6.4-release/modules/layers/src/text-layer/text-layer.js\nconst TEXT_ANCHOR = {\n  start: 1,\n  middle: 0,\n  end: -1\n};\nconst ALIGNMENT_BASELINE = {\n  top: 1,\n  center: 0,\n  bottom: -1\n};\nconst DEFAULT_COLOR = [0, 0, 0, 255];\nconst MISSING_CHAR_WIDTH = 32;\nconst FONT_SETTINGS_PROPS = ['fontSize', 'buffer', 'sdf', 'radius', 'cutoff'];\nconst defaultProps = {\n  fp64: false,\n  sizeScale: 1,\n  characterSet: _fontAtlas.DEFAULT_CHAR_SET,\n  fontFamily: _fontAtlas.DEFAULT_FONT_FAMILY,\n  fontWeight: _fontAtlas.DEFAULT_FONT_WEIGHT,\n  fontSettings: {},\n  getText: {\n    type: 'accessor',\n    value: x => x.text\n  },\n  getPosition: {\n    type: 'accessor',\n    value: x => x.position\n  },\n  getColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getSize: {\n    type: 'accessor',\n    value: 32\n  },\n  getAngle: {\n    type: 'accessor',\n    value: 0\n  },\n  getHighlightColor: {\n    type: 'accessor',\n    value: DEFAULT_COLOR\n  },\n  getTextAnchor: {\n    type: 'accessor',\n    value: 'middle'\n  },\n  getAlignmentBaseline: {\n    type: 'accessor',\n    value: 'center'\n  },\n  getPixelOffset: {\n    type: 'accessor',\n    value: [0, 0]\n  }\n};\n\nfunction _ChromaticTextLayer(props) {\n  class __ChromaticTextLayer extends _base.base.deck.CompositeLayer {\n    updateState({\n      props,\n      oldProps,\n      changeFlags\n    }) {\n      const fontChanged = this.fontChanged(oldProps, props);\n\n      if (fontChanged) {\n        this.updateFontAtlas();\n      }\n\n      if (changeFlags.dataChanged || fontChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText)) {\n        this.transformStringToLetters();\n      }\n    }\n\n    updateFontAtlas() {\n      const {\n        gl\n      } = this.context;\n      const {\n        fontSettings,\n        fontFamily,\n        fontWeight,\n        characterSet\n      } = this.props;\n      const mergedFontSettings = Object.assign({}, _fontAtlas.DEFAULT_FONT_SETTINGS, fontSettings, {\n        fontFamily,\n        fontWeight,\n        characterSet\n      });\n      const {\n        scale,\n        mapping,\n        texture\n      } = (0, _fontAtlas.makeFontAtlas)(gl, mergedFontSettings);\n      this.setState({\n        scale,\n        iconAtlas: texture,\n        iconMapping: mapping\n      });\n    }\n\n    fontChanged(oldProps, props) {\n      if (oldProps.fontFamily !== props.fontFamily || oldProps.characterSet !== props.characterSet || oldProps.fontWeight !== props.fontWeight) {\n        return true;\n      }\n\n      if (oldProps.fontSettings === props.fontSettings) {\n        return false;\n      }\n\n      const oldFontSettings = oldProps.fontSettings || {};\n      const fontSettings = props.fontSettings || {};\n      return FONT_SETTINGS_PROPS.some(prop => oldFontSettings[prop] !== fontSettings[prop]);\n    }\n\n    getPickingInfo({\n      info\n    }) {\n      // because `TextLayer` assign the same pickingInfoIndex for one text label,\n      // here info.index refers the index of text label in props.data\n      return Object.assign(info, {\n        // override object with original data\n        object: info.index >= 0 ? this.props.data[info.index] : null\n      });\n    }\n    /* eslint-disable no-loop-func */\n\n\n    transformStringToLetters() {\n      const {\n        data,\n        getText\n      } = this.props;\n      const {\n        iconMapping\n      } = this.state;\n      const transformedData = [];\n      let objectIndex = 0;\n\n      for (const val of data) {\n        const text = getText(val);\n\n        if (text) {\n          const letters = Array.from(text);\n          const offsets = [0];\n          let offsetLeft = 0;\n          letters.forEach((letter, i) => {\n            const datum = {\n              text: letter,\n              index: i,\n              offsets,\n              len: text.length,\n              // reference of original object and object index\n              object: val,\n              objectIndex\n            };\n            const frame = iconMapping[letter];\n\n            if (frame) {\n              offsetLeft += frame.width;\n            } else {\n              //log.warn(`Missing character: ${letter}`)();\n              offsetLeft += MISSING_CHAR_WIDTH;\n            }\n\n            offsets.push(offsetLeft);\n            transformedData.push(datum);\n          });\n        }\n\n        objectIndex++;\n      }\n\n      this.setState({\n        data: transformedData\n      });\n    }\n    /* eslint-enable no-loop-func */\n\n\n    getLetterOffset(datum) {\n      return datum.offsets[datum.index];\n    }\n\n    getTextLength(datum) {\n      return datum.offsets[datum.offsets.length - 1];\n    }\n\n    _getAccessor(accessor) {\n      if (typeof accessor === 'function') {\n        return x => accessor(x.object);\n      }\n\n      return accessor;\n    }\n\n    getAnchorXFromTextAnchor(getTextAnchor) {\n      return x => {\n        const textAnchor = typeof getTextAnchor === 'function' ? getTextAnchor(x.object) : getTextAnchor;\n\n        if (!TEXT_ANCHOR.hasOwnProperty(textAnchor)) {\n          throw new Error(`Invalid text anchor parameter: ${textAnchor}`);\n        }\n\n        return TEXT_ANCHOR[textAnchor];\n      };\n    }\n\n    getAnchorYFromAlignmentBaseline(getAlignmentBaseline) {\n      return x => {\n        const alignmentBaseline = typeof getAlignmentBaseline === 'function' ? getAlignmentBaseline(x.object) : getAlignmentBaseline;\n\n        if (!ALIGNMENT_BASELINE.hasOwnProperty(alignmentBaseline)) {\n          throw new Error(`Invalid alignment baseline parameter: ${alignmentBaseline}`);\n        }\n\n        return ALIGNMENT_BASELINE[alignmentBaseline];\n      };\n    }\n\n    renderLayers() {\n      const {\n        data,\n        scale,\n        iconAtlas,\n        iconMapping\n      } = this.state;\n      const {\n        getPosition,\n        getColor,\n        getSize,\n        getAngle,\n        getHighlightColor,\n        getTextAnchor,\n        getAlignmentBaseline,\n        getPixelOffset,\n        fp64,\n        sdf,\n        sizeScale,\n        transitions,\n        updateTriggers\n      } = this.props;\n      const SubLayerClass = this.getSubLayerClass('characters', _chromaticMultiIconLayer.MultiIconLayer);\n      return new SubLayerClass({\n        sdf,\n        iconAtlas,\n        iconMapping,\n        getPosition: d => getPosition(d.object),\n        getColor: this._getAccessor(getColor),\n        getSize: this._getAccessor(getSize),\n        getAngle: this._getAccessor(getAngle),\n        getHighlightColor: this._getAccessor(getHighlightColor),\n        getAnchorX: this.getAnchorXFromTextAnchor(getTextAnchor),\n        getAnchorY: this.getAnchorYFromAlignmentBaseline(getAlignmentBaseline),\n        getPixelOffset: this._getAccessor(getPixelOffset),\n        fp64,\n        sizeScale: sizeScale * scale,\n        transitions: transitions && {\n          getPosition: transitions.getPosition,\n          getAngle: transitions.getAngle,\n          getHighlightColor: transitions.getHighlightColor,\n          getColor: transitions.getColor,\n          getSize: transitions.getSize,\n          getPixelOffset: updateTriggers.getPixelOffset\n        }\n      }, this.getSubLayerProps({\n        id: 'characters',\n        updateTriggers: {\n          getPosition: updateTriggers.getPosition,\n          getAngle: updateTriggers.getAngle,\n          getHighlightColor: updateTriggers.getHighlightColor,\n          getColor: updateTriggers.getColor,\n          getSize: updateTriggers.getSize,\n          getPixelOffset: updateTriggers.getPixelOffset,\n          getAnchorX: updateTriggers.getTextAnchor,\n          getAnchorY: updateTriggers.getAlignmentBaseline\n        }\n      }), {\n        data,\n        getIcon: d => d.text,\n        getShiftInQueue: d => this.getLetterOffset(d),\n        getLengthOfQueue: d => this.getTextLength(d)\n      });\n    }\n\n  }\n\n  __ChromaticTextLayer.layerName = 'TextLayer';\n  __ChromaticTextLayer.defaultProps = defaultProps;\n  const instance = new __ChromaticTextLayer(props);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * TextLayer - a modification of deck.gl's TextLayer.\n * This is instantiatable by calling `new TextLayer()`.\n */\n\n\nconst ChromaticTextLayer = _ChromaticTextLayer;\nexports.ChromaticTextLayer = ChromaticTextLayer;\n},{\"../base\":\"zVYr\",\"./font-atlas\":\"vN6g\",\"./chromatic-multi-icon-layer/chromatic-multi-icon-layer\":\"YJVR\"}],\"G3uy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.concat = concat;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction concat(...args) {\n  return args.reduce((p, c) => c ? p.concat(c) : p, []);\n}\n},{}],\"N6ii\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\nexports.default = _default;\n},{}],\"X8fn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createStage = createStage;\nexports.minPixelSize = exports.min3dDepth = exports.defaultView = exports.lineZ = exports.groupStrokeWidth = exports.defaultPresenterConfig = exports.defaultPresenterStyle = exports.minWidth = exports.minHeight = void 0;\nconst minHeight = '100px';\nexports.minHeight = minHeight;\nconst minWidth = '100px';\nexports.minWidth = minWidth;\nconst lightSettings = {\n  '2d': {},\n  '3d': {\n    lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n    ambientRatio: 0.3,\n    diffuseRatio: 0.6,\n    specularRatio: 0.4,\n    lightsStrength: [0.3, 0.0, 0.8, 0.0],\n    numberOfLights: 2\n  }\n};\nconst defaultPresenterStyle = {\n  cssPrefix: 'vega-deckgl-',\n  defaultCubeColor: [128, 128, 128, 255],\n  highlightColor: [0, 0, 0, 255],\n  lightSettings\n};\nexports.defaultPresenterStyle = defaultPresenterStyle;\nconst defaultPresenterConfig = {\n  onCubeClick: (e, cube) => {},\n  onCubeHover: (e, cube) => {},\n  transitionDurations: {\n    color: 100,\n    position: 600,\n    size: 600,\n    view: 600\n  }\n};\nexports.defaultPresenterConfig = defaultPresenterConfig;\n\nfunction createStage(view) {\n  const stage = {\n    view,\n    cubeData: [],\n    axes: {\n      x: [],\n      y: []\n    },\n    gridLines: [],\n    textData: [],\n    legend: {\n      rows: {}\n    },\n    facets: []\n  };\n  return stage;\n}\n\nconst groupStrokeWidth = 1;\nexports.groupStrokeWidth = groupStrokeWidth;\nconst lineZ = -1;\nexports.lineZ = lineZ;\nconst defaultView = '2d';\nexports.defaultView = defaultView;\nconst min3dDepth = 0.05;\nexports.min3dDepth = min3dDepth;\nconst minPixelSize = 0.5;\nexports.minPixelSize = minPixelSize;\n},{}],\"xg7n\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _default = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec2 instancePositions64xyLow;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${_defaults.minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${_defaults.minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_scale(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_scale(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_scale(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64xyLow, offset, position_worldspace);\n\n  float lightWeight = 1.0;\n  \n  //allow for a small amount of error around the min3dDepth \n  if (instanceSizes.z >= ${_defaults.min3dDepth.toFixed(4)} - 0.0001) {\n    lightWeight = lighting_getLightWeight(\n      position_worldspace.xyz, // the w component is always 1.0\n      normals\n    );\n  }\n\n  vec3 lightWeightedColor = lightWeight * instanceColors.rgb;\n  vec3 mixedLight = mix(instanceColors.rgb, lightWeightedColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\nexports.default = _default;\n},{\"../defaults\":\"X8fn\"}],\"nD8G\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.CubeLayer = void 0;\n\nvar _cubeLayerFragment = _interopRequireDefault(require(\"./cube-layer-fragment.glsl\"));\n\nvar _cubeLayerVertex = _interopRequireDefault(require(\"./cube-layer-vertex.glsl\"));\n\nvar _base = require(\"../base\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/layers/src/grid-cell-layer/grid-cell-layer.js\n//https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\nconst UNSIGNED_BYTE = 0x1401;\nconst DEFAULT_COLOR = [255, 0, 255, 255];\nconst defaultProps = {\n  lightingMix: 0.5,\n  fp64: false,\n  getSize: x => x.size,\n  getPosition: x => x.position,\n  getColor: x => x.color\n};\n\nfunction _CubeLayer(props) {\n  //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n  class __CubeLayer extends _base.base.deck.Layer {\n    getShaders() {\n      const projectModule = this.use64bitProjection() ? 'project64' : 'project32';\n      return {\n        vs: _cubeLayerVertex.default,\n        fs: _cubeLayerFragment.default,\n        modules: [projectModule, 'lighting', 'picking']\n      };\n    }\n\n    initializeState() {\n      const attributeManager = this.getAttributeManager();\n      attributeManager.addInstanced({\n        instancePositions: {\n          size: 3,\n          transition: true,\n          accessor: 'getPosition'\n        },\n        instancePositions64xyLow: {\n          size: 3,\n          accessor: 'getPosition',\n          update: this.calculateInstancePositions64xyLow\n        },\n        instanceSizes: {\n          size: 3,\n          transition: true,\n          accessor: 'getSize'\n        },\n        instanceColors: {\n          size: 4,\n          type: UNSIGNED_BYTE,\n          transition: true,\n          accessor: 'getColor',\n          defaultValue: DEFAULT_COLOR\n        }\n      });\n    }\n\n    updateState({\n      props,\n      oldProps,\n      changeFlags\n    }) {\n      super.updateState({\n        props,\n        oldProps,\n        changeFlags\n      }); //TODO add parameter type to deck.gl-typings\n      // Re-generate model if geometry changed\n\n      if (props.fp64 !== oldProps.fp64) {\n        const {\n          gl\n        } = this.context;\n\n        if (this.state.model) {\n          this.state.model.delete();\n        }\n\n        this.setState({\n          model: this._getModel(gl)\n        });\n        this.getAttributeManager().invalidateAll();\n      }\n    }\n\n    _getModel(gl) {\n      return new _base.base.luma.Model(gl, Object.assign({}, this.getShaders(), {\n        id: this.props.id,\n        geometry: new _base.base.luma.CubeGeometry(),\n        isInstanced: true,\n        shaderCache: this.context.shaderCache\n      }));\n    }\n\n    draw({\n      uniforms\n    }) {\n      let {\n        lightingMix\n      } = this.props;\n\n      if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n        lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n      }\n\n      this.state.model.render(Object.assign({}, uniforms, {\n        lightingMix\n      }));\n    }\n\n    calculateInstancePositions64xyLow(attribute) {\n      const isFP64 = this.use64bitPositions();\n      attribute.constant = !isFP64;\n\n      if (!isFP64) {\n        attribute.value = new Float32Array(2);\n        return;\n      }\n\n      const {\n        data,\n        getPosition\n      } = this.props;\n      const {\n        value\n      } = attribute;\n      let i = 0;\n\n      for (const point of data) {\n        const position = getPosition(point);\n        value[i++] = _base.base.luma.fp64.fp64LowPart(position[0]);\n        value[i++] = _base.base.luma.fp64.fp64LowPart(position[1]);\n      }\n    }\n\n  }\n\n  __CubeLayer.layerName = 'CubeLayer';\n  __CubeLayer.defaultProps = defaultProps;\n  const instance = new __CubeLayer(props);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * CubeLayer - a Deck.gl layer to render cuboids.\n * This is instantiatable by calling `new CubeLayer()`.\n */\n\n\nconst CubeLayer = _CubeLayer;\nexports.CubeLayer = CubeLayer;\n},{\"./cube-layer-fragment.glsl\":\"N6ii\",\"./cube-layer-vertex.glsl\":\"xg7n\",\"../base\":\"zVYr\"}],\"SwTP\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linear = linear;\n\nfunction linear(t) {\n  return +t;\n}\n},{}],\"Wk2M\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.quadIn = quadIn;\nexports.quadOut = quadOut;\nexports.quadInOut = quadInOut;\n\nfunction quadIn(t) {\n  return t * t;\n}\n\nfunction quadOut(t) {\n  return t * (2 - t);\n}\n\nfunction quadInOut(t) {\n  return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;\n}\n},{}],\"u50N\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cubicIn = cubicIn;\nexports.cubicOut = cubicOut;\nexports.cubicInOut = cubicInOut;\n\nfunction cubicIn(t) {\n  return t * t * t;\n}\n\nfunction cubicOut(t) {\n  return --t * t * t + 1;\n}\n\nfunction cubicInOut(t) {\n  return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n},{}],\"uYO0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.polyInOut = exports.polyOut = exports.polyIn = void 0;\nvar exponent = 3;\n\nvar polyIn = function custom(e) {\n  e = +e;\n\n  function polyIn(t) {\n    return Math.pow(t, e);\n  }\n\n  polyIn.exponent = custom;\n  return polyIn;\n}(exponent);\n\nexports.polyIn = polyIn;\n\nvar polyOut = function custom(e) {\n  e = +e;\n\n  function polyOut(t) {\n    return 1 - Math.pow(1 - t, e);\n  }\n\n  polyOut.exponent = custom;\n  return polyOut;\n}(exponent);\n\nexports.polyOut = polyOut;\n\nvar polyInOut = function custom(e) {\n  e = +e;\n\n  function polyInOut(t) {\n    return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;\n  }\n\n  polyInOut.exponent = custom;\n  return polyInOut;\n}(exponent);\n\nexports.polyInOut = polyInOut;\n},{}],\"zDR9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sinIn = sinIn;\nexports.sinOut = sinOut;\nexports.sinInOut = sinInOut;\nvar pi = Math.PI,\n    halfPi = pi / 2;\n\nfunction sinIn(t) {\n  return 1 - Math.cos(t * halfPi);\n}\n\nfunction sinOut(t) {\n  return Math.sin(t * halfPi);\n}\n\nfunction sinInOut(t) {\n  return (1 - Math.cos(pi * t)) / 2;\n}\n},{}],\"hytC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.expIn = expIn;\nexports.expOut = expOut;\nexports.expInOut = expInOut;\n\nfunction expIn(t) {\n  return Math.pow(2, 10 * t - 10);\n}\n\nfunction expOut(t) {\n  return 1 - Math.pow(2, -10 * t);\n}\n\nfunction expInOut(t) {\n  return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;\n}\n},{}],\"F6Jm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.circleIn = circleIn;\nexports.circleOut = circleOut;\nexports.circleInOut = circleInOut;\n\nfunction circleIn(t) {\n  return 1 - Math.sqrt(1 - t * t);\n}\n\nfunction circleOut(t) {\n  return Math.sqrt(1 - --t * t);\n}\n\nfunction circleInOut(t) {\n  return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;\n}\n},{}],\"Y2e2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.bounceIn = bounceIn;\nexports.bounceOut = bounceOut;\nexports.bounceInOut = bounceInOut;\nvar b1 = 4 / 11,\n    b2 = 6 / 11,\n    b3 = 8 / 11,\n    b4 = 3 / 4,\n    b5 = 9 / 11,\n    b6 = 10 / 11,\n    b7 = 15 / 16,\n    b8 = 21 / 22,\n    b9 = 63 / 64,\n    b0 = 1 / b1 / b1;\n\nfunction bounceIn(t) {\n  return 1 - bounceOut(1 - t);\n}\n\nfunction bounceOut(t) {\n  return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;\n}\n\nfunction bounceInOut(t) {\n  return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;\n}\n},{}],\"Vq7n\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.backInOut = exports.backOut = exports.backIn = void 0;\nvar overshoot = 1.70158;\n\nvar backIn = function custom(s) {\n  s = +s;\n\n  function backIn(t) {\n    return t * t * ((s + 1) * t - s);\n  }\n\n  backIn.overshoot = custom;\n  return backIn;\n}(overshoot);\n\nexports.backIn = backIn;\n\nvar backOut = function custom(s) {\n  s = +s;\n\n  function backOut(t) {\n    return --t * t * ((s + 1) * t + s) + 1;\n  }\n\n  backOut.overshoot = custom;\n  return backOut;\n}(overshoot);\n\nexports.backOut = backOut;\n\nvar backInOut = function custom(s) {\n  s = +s;\n\n  function backInOut(t) {\n    return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;\n  }\n\n  backInOut.overshoot = custom;\n  return backInOut;\n}(overshoot);\n\nexports.backInOut = backInOut;\n},{}],\"Rnr9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.elasticInOut = exports.elasticOut = exports.elasticIn = void 0;\nvar tau = 2 * Math.PI,\n    amplitude = 1,\n    period = 0.3;\n\nvar elasticIn = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticIn(t) {\n    return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);\n  }\n\n  elasticIn.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticIn.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticIn;\n}(amplitude, period);\n\nexports.elasticIn = elasticIn;\n\nvar elasticOut = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticOut(t) {\n    return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);\n  }\n\n  elasticOut.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticOut.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticOut;\n}(amplitude, period);\n\nexports.elasticOut = elasticOut;\n\nvar elasticInOut = function custom(a, p) {\n  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);\n\n  function elasticInOut(t) {\n    return ((t = t * 2 - 1) < 0 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;\n  }\n\n  elasticInOut.amplitude = function (a) {\n    return custom(a, p * tau);\n  };\n\n  elasticInOut.period = function (p) {\n    return custom(a, p);\n  };\n\n  return elasticInOut;\n}(amplitude, period);\n\nexports.elasticInOut = elasticInOut;\n},{}],\"kv9T\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"easeLinear\", {\n  enumerable: true,\n  get: function () {\n    return _linear.linear;\n  }\n});\nObject.defineProperty(exports, \"easeQuad\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadInOut;\n  }\n});\nObject.defineProperty(exports, \"easeQuadIn\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadIn;\n  }\n});\nObject.defineProperty(exports, \"easeQuadOut\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadOut;\n  }\n});\nObject.defineProperty(exports, \"easeQuadInOut\", {\n  enumerable: true,\n  get: function () {\n    return _quad.quadInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubic\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubicIn\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicIn;\n  }\n});\nObject.defineProperty(exports, \"easeCubicOut\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicOut;\n  }\n});\nObject.defineProperty(exports, \"easeCubicInOut\", {\n  enumerable: true,\n  get: function () {\n    return _cubic.cubicInOut;\n  }\n});\nObject.defineProperty(exports, \"easePoly\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyInOut;\n  }\n});\nObject.defineProperty(exports, \"easePolyIn\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyIn;\n  }\n});\nObject.defineProperty(exports, \"easePolyOut\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyOut;\n  }\n});\nObject.defineProperty(exports, \"easePolyInOut\", {\n  enumerable: true,\n  get: function () {\n    return _poly.polyInOut;\n  }\n});\nObject.defineProperty(exports, \"easeSin\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinInOut;\n  }\n});\nObject.defineProperty(exports, \"easeSinIn\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinIn;\n  }\n});\nObject.defineProperty(exports, \"easeSinOut\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinOut;\n  }\n});\nObject.defineProperty(exports, \"easeSinInOut\", {\n  enumerable: true,\n  get: function () {\n    return _sin.sinInOut;\n  }\n});\nObject.defineProperty(exports, \"easeExp\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expInOut;\n  }\n});\nObject.defineProperty(exports, \"easeExpIn\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expIn;\n  }\n});\nObject.defineProperty(exports, \"easeExpOut\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expOut;\n  }\n});\nObject.defineProperty(exports, \"easeExpInOut\", {\n  enumerable: true,\n  get: function () {\n    return _exp.expInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircle\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleInOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircleIn\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleIn;\n  }\n});\nObject.defineProperty(exports, \"easeCircleOut\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleOut;\n  }\n});\nObject.defineProperty(exports, \"easeCircleInOut\", {\n  enumerable: true,\n  get: function () {\n    return _circle.circleInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounce\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounceIn\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceIn;\n  }\n});\nObject.defineProperty(exports, \"easeBounceOut\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceOut;\n  }\n});\nObject.defineProperty(exports, \"easeBounceInOut\", {\n  enumerable: true,\n  get: function () {\n    return _bounce.bounceInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBack\", {\n  enumerable: true,\n  get: function () {\n    return _back.backInOut;\n  }\n});\nObject.defineProperty(exports, \"easeBackIn\", {\n  enumerable: true,\n  get: function () {\n    return _back.backIn;\n  }\n});\nObject.defineProperty(exports, \"easeBackOut\", {\n  enumerable: true,\n  get: function () {\n    return _back.backOut;\n  }\n});\nObject.defineProperty(exports, \"easeBackInOut\", {\n  enumerable: true,\n  get: function () {\n    return _back.backInOut;\n  }\n});\nObject.defineProperty(exports, \"easeElastic\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticOut;\n  }\n});\nObject.defineProperty(exports, \"easeElasticIn\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticIn;\n  }\n});\nObject.defineProperty(exports, \"easeElasticOut\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticOut;\n  }\n});\nObject.defineProperty(exports, \"easeElasticInOut\", {\n  enumerable: true,\n  get: function () {\n    return _elastic.elasticInOut;\n  }\n});\n\nvar _linear = require(\"./linear.js\");\n\nvar _quad = require(\"./quad.js\");\n\nvar _cubic = require(\"./cubic.js\");\n\nvar _poly = require(\"./poly.js\");\n\nvar _sin = require(\"./sin.js\");\n\nvar _exp = require(\"./exp.js\");\n\nvar _circle = require(\"./circle.js\");\n\nvar _bounce = require(\"./bounce.js\");\n\nvar _back = require(\"./back.js\");\n\nvar _elastic = require(\"./elastic.js\");\n},{\"./linear.js\":\"SwTP\",\"./quad.js\":\"Wk2M\",\"./cubic.js\":\"u50N\",\"./poly.js\":\"uYO0\",\"./sin.js\":\"zDR9\",\"./exp.js\":\"hytC\",\"./circle.js\":\"F6Jm\",\"./bounce.js\":\"Y2e2\",\"./back.js\":\"Vq7n\",\"./elastic.js\":\"Rnr9\"}],\"i3Eh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLayers = getLayers;\nexports.getCubeLayer = getCubeLayer;\nexports.getCubes = getCubes;\n\nvar _base = require(\"./base\");\n\nvar _chromaticTextLayer = require(\"./chromatic-text-layer/chromatic-text-layer\");\n\nvar _array = require(\"./array\");\n\nvar _cubeLayer = require(\"./cube-layer/cube-layer\");\n\nvar _d3Ease = require(\"d3-ease\");\n\nvar _constants = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction getLayers(presenter, config, stage, lightSettings, lightingMix, interpolator, guideLines) {\n  const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n  const {\n    x,\n    y\n  } = stage.axes;\n  const lines = (0, _array.concat)(stage.gridLines, guideLines);\n  const texts = [...stage.textData];\n  [x, y].forEach(axes => {\n    axes.forEach(axis => {\n      if (axis.domain) lines.push(axis.domain);\n      if (axis.ticks) lines.push.apply(lines, axis.ticks);\n      if (axis.tickText) texts.push.apply(texts, axis.tickText);\n      if (axis.title) texts.push(axis.title);\n    });\n  });\n\n  if (stage.facets) {\n    stage.facets.forEach(f => {\n      if (f.lines) lines.push.apply(lines, f.lines);\n      if (f.facetTitle) texts.push(f.facetTitle);\n    });\n  }\n\n  const lineLayer = newLineLayer(_constants.layerNames.lines, lines);\n  const textLayer = newTextLayer(presenter, _constants.layerNames.text, texts, config, presenter.style.fontFamily);\n  return [textLayer, cubeLayer, lineLayer];\n}\n\nfunction newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings, lightingMix, interpolator) {\n  const getPosition = getTiming(config.transitionDurations.position, _d3Ease.easeExpInOut);\n  const getSize = getTiming(config.transitionDurations.size, _d3Ease.easeExpInOut);\n  const getColor = getTiming(config.transitionDurations.color);\n  const cubeLayerProps = {\n    interpolator,\n    lightingMix,\n    id: _constants.layerNames.cubes,\n    data: cubeData,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    pickable: true,\n    autoHighlight: true,\n    highlightColor,\n    onClick: (o, e) => {\n      config.onCubeClick(e && e.srcEvent, o.object);\n    },\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onCube = false;\n        config.onCubeHover(e && e.srcEvent, null);\n      } else {\n        presenter.deckgl.interactiveState.onCube = true;\n        config.onCubeHover(e && e.srcEvent, o.object);\n      }\n    },\n    lightSettings,\n    transitions: {\n      getPosition,\n      getColor,\n      getSize\n    }\n  };\n  return new _cubeLayer.CubeLayer(cubeLayerProps);\n}\n\nfunction newLineLayer(id, data) {\n  return new _base.base.layers.LineLayer({\n    id,\n    data,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    getColor: o => o.color,\n    getStrokeWidth: o => o.strokeWidth\n  });\n}\n\nfunction newTextLayer(presenter, id, data, config, fontFamily) {\n  const props = {\n    id,\n    data,\n    coordinateSystem: _base.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    autoHighlight: true,\n    pickable: true,\n    getHighlightColor: config.getTextHighlightColor || (o => o.color),\n    onClick: (o, e) => {\n      let pe = e && e.srcEvent; //handle iOS event\n\n      if (e.center) {\n        pe = {\n          clientX: e.center.x,\n          clientY: e.center.y\n        };\n      }\n\n      config.onTextClick && config.onTextClick(pe, o.object);\n    },\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onText = false;\n      } else {\n        presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n      }\n    },\n    getColor: config.getTextColor || (o => o.color),\n    getTextAnchor: o => o.textAnchor,\n    getSize: o => o.size,\n    getAngle: o => o.angle,\n    fontSettings: {\n      sdf: true,\n      fontSize: 128,\n      buffer: 3\n    }\n  };\n\n  if (fontFamily) {\n    props.fontFamily = fontFamily;\n  }\n\n  return new _chromaticTextLayer.ChromaticTextLayer(props);\n}\n\nfunction getTiming(duration, easing) {\n  let timing;\n\n  if (duration) {\n    timing = {\n      duration\n    };\n\n    if (easing) {\n      timing.easing = easing;\n    }\n  }\n\n  return timing;\n}\n\nfunction getCubeLayer(deckProps) {\n  return deckProps.layers.filter(layer => layer.id === _constants.layerNames.cubes)[0];\n}\n\nfunction getCubes(deckProps) {\n  const cubeLayer = getCubeLayer(deckProps);\n  if (!cubeLayer) return;\n  const cubeLayerProps = cubeLayer.props;\n  return cubeLayerProps.data;\n}\n},{\"./base\":\"zVYr\",\"./chromatic-text-layer/chromatic-text-layer\":\"fD4N\",\"./array\":\"G3uy\",\"./cube-layer/cube-layer\":\"nD8G\",\"d3-ease\":\"kv9T\",\"./constants\":\"Rva7\"}],\"yKkb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"addDiv\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.addDiv;\n  }\n});\nObject.defineProperty(exports, \"addEl\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.addEl;\n  }\n});\nObject.defineProperty(exports, \"outerSize\", {\n  enumerable: true,\n  get: function () {\n    return _htmlHelpers.outerSize;\n  }\n});\nObject.defineProperty(exports, \"clone\", {\n  enumerable: true,\n  get: function () {\n    return _clone.clone;\n  }\n});\nObject.defineProperty(exports, \"deepMerge\", {\n  enumerable: true,\n  get: function () {\n    return _clone.deepMerge;\n  }\n});\nObject.defineProperty(exports, \"colorFromString\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorFromString;\n  }\n});\nObject.defineProperty(exports, \"colorIsEqual\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorIsEqual;\n  }\n});\nObject.defineProperty(exports, \"colorToString\", {\n  enumerable: true,\n  get: function () {\n    return _color.colorToString;\n  }\n});\nObject.defineProperty(exports, \"desaturate\", {\n  enumerable: true,\n  get: function () {\n    return _color.desaturate;\n  }\n});\nObject.defineProperty(exports, \"isColor\", {\n  enumerable: true,\n  get: function () {\n    return _color.isColor;\n  }\n});\nObject.defineProperty(exports, \"getCubeLayer\", {\n  enumerable: true,\n  get: function () {\n    return _layers.getCubeLayer;\n  }\n});\nObject.defineProperty(exports, \"getCubes\", {\n  enumerable: true,\n  get: function () {\n    return _layers.getCubes;\n  }\n});\n\nvar _htmlHelpers = require(\"../htmlHelpers\");\n\nvar _clone = require(\"../clone\");\n\nvar _color = require(\"../color\");\n\nvar _layers = require(\"../layers\");\n},{\"../htmlHelpers\":\"QrKd\",\"../clone\":\"VNzP\",\"../color\":\"e0Zu\",\"../layers\":\"i3Eh\"}],\"Kzvh\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.box = box;\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (item) {\n    var x1, y1, x2, y2;\n    x1 = item.x || 0;\n    y1 = item.y || 0;\n    x2 = item.x2 != null ? item.x2 : x1;\n    y2 = item.y2 != null ? item.y2 : y1;\n    const lineItem = styledLine(x1 + x - options.offsetX, y1 + y - options.offsetY, x2 + x - options.offsetX, y2 + y - options.offsetY, item.stroke, item.strokeWidth);\n\n    if (item.mark.role === 'axis-tick') {\n      options.currAxis.ticks.push(lineItem);\n    } else if (item.mark.role === 'axis-domain') {\n      options.currAxis.domain = lineItem;\n    } else {\n      stage.gridLines.push(lineItem);\n    }\n  });\n};\n\nfunction styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n  const line = {\n    sourcePosition: [x1, -y1, _defaults.lineZ],\n    targetPosition: [x2, -y2, _defaults.lineZ],\n    color: (0, _color.colorFromString)(stroke),\n    strokeWidth: strokeWidth * 10 //translate width to deck.gl\n\n  };\n  return line;\n}\n\nfunction box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n  const lines = [styledLine(gx, gy, gx + width, gy, stroke, strokeWidth), styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth), styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth), styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)];\n\n  if (diagonals) {\n    lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n    lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n  }\n\n  return lines;\n}\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"zVYr\",\"../color\":\"e0Zu\",\"../defaults\":\"X8fn\"}],\"nVyH\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.PresenterElement = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * HTML elements outputted by the presenter.\n */\nvar PresenterElement;\nexports.PresenterElement = PresenterElement;\n\n(function (PresenterElement) {\n  PresenterElement[PresenterElement[\"root\"] = 0] = \"root\";\n  PresenterElement[PresenterElement[\"gl\"] = 1] = \"gl\";\n  PresenterElement[PresenterElement[\"panel\"] = 2] = \"panel\";\n  PresenterElement[PresenterElement[\"legend\"] = 3] = \"legend\";\n  PresenterElement[PresenterElement[\"vegaControls\"] = 4] = \"vegaControls\";\n})(PresenterElement || (exports.PresenterElement = PresenterElement = {}));\n},{}],\"gdNG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.initializePanel = initializePanel;\nexports.className = className;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _enums = require(\"./enums\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction initializePanel(presenter) {\n  const rootDiv = (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.root, presenter)\n  }, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.gl, presenter),\n    style: {\n      minHeight: _defaults.minHeight,\n      minWidth: _defaults.minWidth\n    }\n  }), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.panel, presenter)\n  }, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.vegaControls, presenter)\n  }), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: className(_enums.PresenterElement.legend, presenter)\n  })));\n  (0, _tsxCreateElement.mount)(rootDiv, presenter.el);\n}\n\nfunction className(type, presenter) {\n  return `${presenter.style.cssPrefix}${_enums.PresenterElement[type]}`;\n}\n},{\"tsx-create-element\":\"RooA\",\"./defaults\":\"X8fn\",\"./enums\":\"nVyH\"}],\"tpjO\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createOrbitControllerClass = createOrbitControllerClass;\n\nvar _base = require(\"../base\");\n\nfunction createOrbitControllerClass(factoryOptions) {\n  function wrapper(props) {\n    class OrbitControllerInternal extends _base.base.deck._OrbitController {\n      constructor(props) {\n        super(props);\n        this.invertPan = true;\n      }\n\n      _onDoubleTap(event) {\n        if (factoryOptions && factoryOptions.doubleClickHandler) {\n          factoryOptions.doubleClickHandler(event, this);\n        } else {\n          super._onDoubleTap(event);\n        }\n      }\n\n      _onPanRotate(event) {\n        if (!this.dragRotate) {\n          return false;\n        }\n\n        return this._onPanRotateStandard(event);\n      }\n\n    }\n\n    const instance = new OrbitControllerInternal(props);\n    return instance;\n  }\n\n  return wrapper;\n}\n},{\"../base\":\"zVYr\"}],\"FacW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createDeckGLClassesForPresenter = createDeckGLClassesForPresenter;\n\nvar _base = require(\"../base\");\n\nvar _orbitController = require(\"./orbitController\");\n\n//adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\nconst CANVAS_STYLE = {\n  position: 'absolute',\n  left: 0,\n  top: 0,\n  width: '100%',\n  height: '100%'\n}; // Create canvas elements for map and deck\n\nfunction createCanvas(props) {\n  let {\n    container = document.body\n  } = props;\n\n  if (typeof container === 'string') {\n    container = document.getElementById(container);\n  }\n\n  if (!container) {\n    throw Error('Deck: container not found');\n  } // Add DOM elements\n\n\n  const containerStyle = window.getComputedStyle(container);\n\n  if (containerStyle.position === 'static') {\n    container.style.position = 'relative';\n  }\n\n  const deckCanvas = document.createElement('canvas');\n  container.appendChild(deckCanvas);\n  Object.assign(deckCanvas.style, CANVAS_STYLE);\n  return {\n    container,\n    deckCanvas\n  };\n}\n/**\n * Creates Deck.gl classes for rendering WebGL.\n * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n */\n\n\nfunction createDeckGLClassesForPresenter(factoryOptions) {\n  const OrbitControllerClass = (0, _orbitController.createOrbitControllerClass)(factoryOptions); //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n  //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n\n  function wrapper(props) {\n    /**\n     * @params container (Element) - DOM element to add deck.gl canvas to\n     * @params controller (Object) - Controller class. Leave empty for auto detection\n     */\n    class DeckGLInternal extends _base.base.deck.Deck {\n      constructor(props = {}) {\n        if (typeof document === 'undefined') {\n          // Not browser\n          throw Error('Deck can only be used in the browser');\n        }\n\n        const {\n          deckCanvas\n        } = createCanvas(props);\n        const viewState = props.initialViewState || props.viewState || {};\n        super(Object.assign({}, props, {\n          width: '100%',\n          height: '100%',\n          canvas: deckCanvas,\n          controller: OrbitControllerClass,\n          initialViewState: viewState\n        })); // Callback for the controller\n\n        this._updateViewState = params => {\n          if (this.onViewStateChange) {\n            this.onViewStateChange(params);\n          }\n        };\n      }\n\n      setProps(props) {\n        // this._updateViewState must be bound to `this`\n        // but we don't have access to the current instance before calling super().\n        if ('onViewStateChange' in props && this._updateViewState) {\n          // This is called at least once at _onRendererInitialized\n          this.onViewStateChange = props.onViewStateChange;\n          props.onViewStateChange = this._updateViewState;\n        }\n\n        super.setProps(props);\n      }\n\n    }\n\n    const instance = new DeckGLInternal(props);\n    return instance;\n  }\n\n  return {\n    OrbitControllerClass,\n    DeckGL_Class: wrapper\n  };\n}\n},{\"../base\":\"zVYr\",\"./orbitController\":\"tpjO\"}],\"pGbS\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LegendView = void 0;\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _controls = require(\"./controls\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst LegendView = props => {\n  const rows = [];\n\n  const addRow = (row, i) => {\n    const fn = symbolMap[row.symbol.shape];\n    let jsx;\n\n    if (fn) {\n      jsx = fn(row.symbol);\n    } else {\n      jsx = (0, _tsxCreateElement.createElement)(\"span\", null, \"x\"); //console.log(`need to render ${row.symbol.shape} symbol shape`);\n    }\n\n    rows.push({\n      cells: [{\n        className: 'symbol',\n        content: jsx\n      }, {\n        className: 'label',\n        content: row.label,\n        title: row.label\n      }]\n    });\n  };\n\n  var sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n  sorted.forEach(i => addRow(props.legend.rows[i], +i));\n\n  if (sorted.length) {\n    return (0, _tsxCreateElement.createElement)(_controls.Table, {\n      rows: rows,\n      rowClassName: \"legend-row\",\n      onRowClick: (e, i) => props.onClick(e, props.legend, i)\n    }, props.legend.title !== void 0 && (0, _tsxCreateElement.createElement)(\"tr\", {\n      onClick: e => props.onClick(e, props.legend, null)\n    }, (0, _tsxCreateElement.createElement)(\"th\", {\n      colSpan: 2\n    }, props.legend.title)));\n  }\n};\n\nexports.LegendView = LegendView;\nconst symbolMap = {\n  square: function (symbol) {\n    return (0, _tsxCreateElement.createElement)(\"div\", {\n      style: {\n        height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n        width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n        backgroundColor: symbol.fill,\n        borderColor: symbol.fill\n      }\n    });\n  }\n};\n},{\"tsx-create-element\":\"RooA\",\"./controls\":\"rq7W\"}],\"hwis\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LinearInterpolator = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction wrapper(props) {\n  class LinearInterpolatorInternal extends _base.base.deck.LinearInterpolator {\n    constructor(transitionProps) {\n      super(transitionProps);\n    }\n\n    interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n      if (this.layerStartProps && this.layerEndProps) {\n        this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n      }\n\n      return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n    }\n\n  }\n\n  const instance = new LinearInterpolatorInternal(props);\n  return instance;\n}\n\nconst LinearInterpolator = wrapper;\nexports.LinearInterpolator = LinearInterpolator;\n},{\"../base\":\"zVYr\"}],\"T97x\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.patchCubeArray = patchCubeArray;\n\nfunction patchCubeArray(allocatedSize, empty, cubes) {\n  const patched = new Array(allocatedSize);\n  patched.fill(empty);\n  cubes.forEach(cube => patched[cube.ordinal] = cube);\n  return patched;\n}\n},{}],\"aZir\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst legendMap = {\n  'legend-title': function (legend, textItem) {\n    legend.title = textItem.text;\n  },\n  'legend-symbol': function (legend, symbol) {\n    const {\n      bounds,\n      fill,\n      shape\n    } = symbol; //this object is safe for serialization\n\n    const legendRowSymbol = {\n      bounds,\n      fill,\n      shape\n    };\n    const i = symbol.datum.index;\n    legend.rows[i] = legend.rows[i] || {};\n    legend.rows[i].symbol = legendRowSymbol;\n  },\n  'legend-label': function (legend, label) {\n    const i = label.datum.index;\n    legend.rows[i] = legend.rows[i] || {};\n    const row = legend.rows[i];\n    row.label = label.text;\n    row.value = label.datum.value;\n  }\n};\n\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (item) {\n    const fn = legendMap[item.mark.role];\n\n    if (fn) {\n      fn(stage.legend, item);\n    } else {//console.log(`need to render legend ${item.mark.role}`);\n    }\n  });\n};\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"zVYr\"}],\"kS6v\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nvar _defaults = require(\"../defaults\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  let i = 0;\n\n  _base.base.vega.sceneVisit(scene, function (item) {\n    //for orthographic (2d) - always use 0 or else Deck will not show them\n    const z = stage.view === '2d' ? 0 : item.z || 0;\n    const depth = (stage.view === '2d' ? 0 : item.depth || 0) + _defaults.min3dDepth; //change direction of y from SVG to GL\n\n    const ty = -1;\n    let ordinal = i;\n\n    if (item.datum.GL_ORDINAL !== void 0) {\n      options.ordinalsSpecified = true;\n      ordinal = item.datum.GL_ORDINAL;\n\n      if (ordinal > options.maxOrdinal) {\n        options.maxOrdinal = ordinal;\n      }\n    }\n\n    const cube = {\n      ordinal,\n      size: [item.width, item.height, depth],\n      position: [x + (item.x || 0) - options.offsetX, ty * (y + (item.y || 0) - options.offsetY) - item.height, z],\n      color: (0, _color.colorFromString)(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n    };\n    cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n    stage.cubeData.push(cube);\n    i++;\n  });\n};\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"zVYr\",\"../color\":\"e0Zu\",\"../defaults\":\"X8fn\"}],\"IIR0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _base = require(\"../base\");\n\nvar _color = require(\"../color\");\n\nconst markStager = (options, stage, scene, x, y, groupType) => {\n  //scale Deck.Gl text to Vega size\n  const fontScale = 6; //Deck.gl centers text on Y. TODO: is this correct on x axis?\n\n  const offsetYCenter = 16; //change direction of y from SVG to GL\n\n  const ty = -1;\n\n  _base.base.vega.sceneVisit(scene, function (item) {\n    if (!item.text) return;\n    const size = item.fontSize * fontScale;\n    const textItem = {\n      color: (0, _color.colorFromString)(item.fill),\n      text: item.text.toString(),\n      position: [x + item.x - options.offsetX, ty * (y + item.y + offsetYCenter - options.offsetY), 0],\n      size,\n      angle: convertAngle(item.angle),\n      textAnchor: convertAlignment(item.align),\n      alignmentBaseline: convertBaseline(item.baseline)\n    };\n\n    if (item.mark.role === 'axis-label') {\n      const tickText = textItem;\n      tickText.value = item.datum.value;\n      options.currAxis.tickText.push(tickText);\n    } else if (item.mark.role === 'axis-title') {\n      options.currAxis.title = textItem;\n    } else if (options.currFacetRect && !options.currFacetRect.facetTitle) {\n      options.currFacetRect.facetTitle = textItem;\n      textItem.position = [x - options.offsetX, ty * (y + offsetYCenter - options.offsetY), 0];\n    } else {\n      stage.textData.push(textItem);\n    }\n  });\n};\n\nfunction convertAngle(vegaTextAngle) {\n  if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n    return 360 - vegaTextAngle;\n  }\n\n  return 0;\n}\n\nfunction convertAlignment(textAlign) {\n  switch (textAlign) {\n    case 'center':\n      return 'middle';\n\n    case 'left':\n      return 'start';\n\n    case 'right':\n      return 'end';\n  }\n\n  return 'start';\n}\n\nfunction convertBaseline(baseline) {\n  switch (baseline) {\n    case 'middle':\n      return 'center';\n  }\n\n  return baseline || 'bottom';\n}\n\nvar _default = markStager;\nexports.default = _default;\n},{\"../base\":\"zVYr\",\"../color\":\"e0Zu\"}],\"yIR6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.GroupType = void 0;\nvar GroupType;\nexports.GroupType = GroupType;\n\n(function (GroupType) {\n  GroupType[GroupType[\"none\"] = 0] = \"none\";\n  GroupType[GroupType[\"legend\"] = 1] = \"legend\";\n  GroupType[GroupType[\"xAxis\"] = 2] = \"xAxis\";\n  GroupType[GroupType[\"yAxis\"] = 3] = \"yAxis\";\n})(GroupType || (exports.GroupType = GroupType = {}));\n},{}],\"eFGB\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sceneToStage = sceneToStage;\n\nvar _legend = _interopRequireDefault(require(\"./marks/legend\"));\n\nvar _rect = _interopRequireDefault(require(\"./marks/rect\"));\n\nvar _rule = _interopRequireWildcard(require(\"./marks/rule\"));\n\nvar _text = _interopRequireDefault(require(\"./marks/text\"));\n\nvar _base = require(\"./base\");\n\nvar _color = require(\"./color\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _interfaces = require(\"./marks/interfaces\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction convertGroupRole(group) {\n  if (group.mark.role === 'legend') return _interfaces.GroupType.legend;\n\n  if (group.mark.role === 'axis') {\n    var vegaAxisDatum = group.datum;\n\n    if (vegaAxisDatum) {\n      switch (vegaAxisDatum.orient) {\n        case 'bottom':\n        case 'top':\n          return _interfaces.GroupType.xAxis;\n\n        case 'left':\n        case 'right':\n          return _interfaces.GroupType.yAxis;\n      }\n    }\n  }\n}\n\nconst group = (options, stage, scene, x, y, groupType) => {\n  _base.base.vega.sceneVisit(scene, function (g) {\n    if (g.bounds.x1 < options.offsetX) {\n      options.offsetX = g.bounds.x1;\n    }\n\n    if (g.bounds.y1 < options.offsetY) {\n      options.offsetY = g.bounds.y1;\n    }\n\n    const gx = g.x || 0,\n          gy = g.y || 0;\n\n    if (g.context && g.context.background && !stage.backgroundColor) {\n      stage.backgroundColor = (0, _color.colorFromString)(g.context.background);\n    }\n\n    if (g.stroke) {\n      const facetRect = {\n        lines: (0, _rule.box)(gx + x - options.offsetX, gy + y - options.offsetY, g.height, g.width, g.stroke, _defaults.groupStrokeWidth)\n      };\n      stage.facets.push(facetRect);\n      options.currFacetRect = facetRect;\n    }\n\n    groupType = convertGroupRole(g) || groupType;\n    setCurrentAxis(options, stage, groupType); // draw group contents\n\n    _base.base.vega.sceneVisit(g, function (item) {\n      mainStager(options, stage, item, gx + x, gy + y, groupType);\n    });\n  });\n};\n\nfunction setCurrentAxis(options, stage, groupType) {\n  let axes;\n\n  switch (groupType) {\n    case _interfaces.GroupType.xAxis:\n      axes = stage.axes.x;\n      break;\n\n    case _interfaces.GroupType.yAxis:\n      axes = stage.axes.y;\n      break;\n\n    default:\n      return;\n  }\n\n  options.currAxis = {\n    domain: null,\n    tickText: [],\n    ticks: []\n  };\n  axes.push(options.currAxis);\n}\n\nconst markStagers = {\n  group,\n  legend: _legend.default,\n  rect: _rect.default,\n  rule: _rule.default,\n  text: _text.default\n};\n\nvar mainStager = (options, stage, scene, x, y, groupType) => {\n  if (scene.marktype !== 'group' && groupType === _interfaces.GroupType.legend) {\n    (0, _legend.default)(options, stage, scene, x, y, groupType);\n  } else {\n    var markStager = markStagers[scene.marktype];\n\n    if (markStager) {\n      markStager(options, stage, scene, x, y, groupType);\n    } else {//console.log(`need to render ${scene.marktype}`);\n    }\n  }\n};\n\nfunction sceneToStage(options, stage, scene) {\n  mainStager(options, stage, scene, 0, 0, null);\n  sortAxis(stage.axes.x, 0);\n  sortAxis(stage.axes.y, 1);\n}\n\nfunction sortAxis(axes, dim) {\n  axes.forEach(axis => {\n    if (axis.domain) orderDomain(axis.domain, dim);\n    axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n    axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n  });\n}\n\nfunction orderDomain(domain, dim) {\n  if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n    const temp = domain.targetPosition;\n    domain.targetPosition = domain.sourcePosition;\n    domain.sourcePosition = temp;\n  }\n}\n},{\"./marks/legend\":\"aZir\",\"./marks/rect\":\"kS6v\",\"./marks/rule\":\"Kzvh\",\"./marks/text\":\"IIR0\",\"./base\":\"zVYr\",\"./color\":\"e0Zu\",\"./defaults\":\"X8fn\",\"./marks/interfaces\":\"yIR6\"}],\"R9yy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.targetViewState = targetViewState;\nexports.viewStateProps = void 0;\nconst viewStateProps = ['distance', 'fov', 'lookAt', 'rotationOrbit', 'rotationX', 'zoom'];\nexports.viewStateProps = viewStateProps;\n\nfunction targetViewState(height, width, view) {\n  const distance = 10;\n  const fov = 60;\n  const lookAt = [width / 2, -height / 2, 0]; //add a 4th dimension to make transitions work\n\n  lookAt.push(1);\n\n  if (view === '2d') {\n    return {\n      distance,\n      fov,\n      lookAt,\n      rotationOrbit: 0,\n      rotationX: 0,\n      zoom: 10 / height\n    };\n  } else {\n    return {\n      distance,\n      fov,\n      lookAt,\n      rotationOrbit: -25,\n      rotationX: 60,\n      zoom: 9 / height\n    };\n  }\n}\n},{}],\"r0M0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Presenter = void 0;\n\nvar _base = require(\"./base\");\n\nvar _rule = require(\"./marks/rule\");\n\nvar _panel = require(\"./panel\");\n\nvar _color = require(\"./color\");\n\nvar _deckgl = require(\"./deck.gl-classes/deckgl\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _clone = require(\"./clone\");\n\nvar _d3Ease = require(\"d3-ease\");\n\nvar _layers = require(\"./layers\");\n\nvar _legend = require(\"./legend\");\n\nvar _linearInterpolator = require(\"./deck.gl-classes/linearInterpolator\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _patchedCubeArray = require(\"./patchedCubeArray\");\n\nvar _enums = require(\"./enums\");\n\nvar _stagers = require(\"./stagers\");\n\nvar _viewState = require(\"./viewState\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Class which presents a Stage of chart data using Deck.gl to render.\n */\nclass Presenter {\n  /**\n   * Instantiate a new Presenter.\n   * @param el Parent HTMLElement to present within.\n   * @param style Optional PresenterStyle styling options.\n   */\n  constructor(el, style) {\n    this.el = el;\n    this.style = (0, _clone.deepMerge)(_defaults.defaultPresenterStyle, style);\n    (0, _panel.initializePanel)(this);\n    this._last = {\n      view: null,\n      height: null,\n      width: null,\n      cubeCount: null,\n      stage: null\n    };\n  }\n  /**\n   * Get the previously rendered Stage object.\n   */\n\n\n  get stage() {\n    return this._last.stage;\n  }\n  /**\n   * Get the current View camera type.\n   */\n\n\n  get view() {\n    return this._last.view;\n  }\n  /**\n   * Cancels any pending animation, calling animationCanceled() on original queue.\n   */\n\n\n  animationCancel() {\n    if (this.animationTimer) {\n      clearTimeout(this.animationTimer);\n      this.animationTimer = null;\n\n      if (this.logger) {\n        this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || 'handler'}`);\n      }\n\n      if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n        this.queuedAnimationOptions.animationCanceled.call(null);\n      }\n    }\n  }\n  /**\n   * Stops the current animation and queues a new animation.\n   * @param handler Function to invoke when timeout is complete.\n   * @param timeout Length of time to wait before invoking the handler.\n   * @param options Optional QueuedAnimationOptions object.\n   */\n\n\n  animationQueue(handler, timeout, options) {\n    if (this.logger) {\n      this.logger(`queueing animation ${options && options.waitingLabel || 'waiting'}...`);\n    }\n\n    this.animationCancel();\n    this.animationTimer = setTimeout(() => {\n      if (this.logger) {\n        this.logger(`queueing animation ${options && options.handlerLabel || 'handler'}...`);\n      }\n\n      handler();\n    }, timeout);\n  }\n  /**\n   * Retrieve a sub-element of the rendered output.\n   * @param type PresenterElement type of the HTMLElement to retrieve.\n   */\n\n\n  getElement(type) {\n    const elements = this.el.getElementsByClassName((0, _panel.className)(type, this));\n\n    if (elements && elements.length) {\n      return elements[0];\n    }\n  }\n  /**\n   * Present the Vega Scene, or Stage object using Deck.gl.\n   * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n   * @param height Height of the rendering area.\n   * @param width Width of the rendering area.\n   * @param config Optional presentation configuration object.\n   */\n\n\n  present(sceneOrStage, height, width, config) {\n    this.animationCancel();\n    let scene = sceneOrStage;\n    let stage;\n    let options = {\n      offsetX: 0,\n      offsetY: 0,\n      maxOrdinal: -1,\n      ordinalsSpecified: false,\n      currAxis: null,\n      currFacetRect: null,\n      defaultCubeColor: this.style.defaultCubeColor\n    }; //determine if this is a vega scene\n\n    if (scene.marktype) {\n      stage = (0, _defaults.createStage)(scene.view);\n      (0, _stagers.sceneToStage)(options, stage, scene);\n    } else {\n      stage = sceneOrStage;\n    }\n\n    if (!this.deckgl) {\n      const classes = (0, _deckgl.createDeckGLClassesForPresenter)({\n        doubleClickHandler: () => {\n          this.homeCamera();\n        }\n      });\n      this.OrbitControllerClass = classes.OrbitControllerClass;\n      const deckProps = {\n        onLayerClick: config && config.onLayerClick,\n        views: [new _base.base.deck.OrbitView({\n          controller: this.OrbitControllerClass\n        })],\n        container: this.getElement(_enums.PresenterElement.gl),\n        getCursor: interactiveState => {\n          if (interactiveState.onText || interactiveState.onAxisSelection) {\n            return 'pointer';\n          } else if (interactiveState.onCube) {\n            return 'default';\n          } else {\n            return 'grab';\n          }\n        }\n      };\n\n      if (stage.backgroundColor) {\n        deckProps.style = {\n          'background-color': (0, _color.colorToString)(stage.backgroundColor)\n        };\n      }\n\n      this.deckgl = new classes.DeckGL_Class(deckProps);\n    }\n\n    let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n\n    if (options.ordinalsSpecified) {\n      cubeCount = Math.max(cubeCount, options.maxOrdinal + 1);\n      const empty = {\n        isEmpty: true,\n        color: [0, 0, 0, 0] // possibly a bug in Deck.gl? set color to invisible.\n\n      };\n      stage.cubeData = (0, _patchedCubeArray.patchCubeArray)(cubeCount, empty, stage.cubeData);\n    }\n\n    this.setDeckProps(stage, height, width, cubeCount, config);\n    (0, _tsxCreateElement.mount)((0, _legend.LegendView)({\n      legend: stage.legend,\n      onClick: config && config.onLegendClick\n    }), this.getElement(_enums.PresenterElement.legend));\n\n    if (config && config.onPresent) {\n      config.onPresent();\n    }\n  }\n  /**\n   * Present the same recently rendered Stage with only slight modifications such as a color change,\n   * using the previous Stage values as a basis.\n   * @param stage Partially populated Stage object containing changes.\n   * @param modifyConfig Optional presentation configuration object.\n   */\n\n\n  rePresent(stage, modifyConfig) {\n    const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n    this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n  }\n\n  isNewBounds(view, height, width, cubeCount) {\n    const lastBounds = this.lastBounds();\n\n    for (let prop in lastBounds) {\n      if (lastBounds[prop] === null) return true;\n    }\n\n    const newBounds = {\n      cubeCount,\n      height,\n      view,\n      width\n    };\n\n    for (let prop in lastBounds) {\n      if (lastBounds[prop] !== newBounds[prop]) return true;\n    }\n  }\n\n  lastBounds() {\n    const {\n      cubeCount,\n      height,\n      view,\n      width\n    } = this._last;\n    return {\n      cubeCount,\n      height,\n      view,\n      width\n    };\n  }\n\n  setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n    const config = (0, _clone.deepMerge)(_defaults.defaultPresenterConfig, modifyConfig);\n    const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n    let lightSettings = this.style.lightSettings[stage.view];\n    let lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n    let linearInterpolator; //choose the current OrbitView viewstate if possible\n\n    let viewState = this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView || //otherwise use the initial viewstate if any\n    this.deckgl.props.viewState;\n\n    if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n      viewState = (0, _viewState.targetViewState)(height, width, stage.view);\n      const oldCubeLayer = (0, _layers.getCubeLayer)(this.deckgl.props);\n\n      if (oldCubeLayer) {\n        linearInterpolator = new _linearInterpolator.LinearInterpolator(_viewState.viewStateProps);\n        linearInterpolator.layerStartProps = {\n          lightingMix: oldCubeLayer.props.lightingMix\n        };\n        linearInterpolator.layerEndProps = {\n          lightingMix\n        };\n        viewState.transitionDuration = config.transitionDurations.view;\n        viewState.transitionEasing = _d3Ease.easeExpInOut;\n        viewState.transitionInterpolator = linearInterpolator;\n      }\n\n      if (stage.view === '2d') {\n        lightSettings = this.style.lightSettings['3d'];\n      }\n    }\n\n    const guideLines = this._showGuides && (0, _rule.box)(0, 0, height, width, '#0f0', 1, true);\n    config.preLayer && config.preLayer(stage);\n    const layers = (0, _layers.getLayers)(this, config, stage, lightSettings, lightingMix, linearInterpolator, guideLines);\n    const deckProps = {\n      views: [new _base.base.deck.OrbitView({\n        controller: this.OrbitControllerClass\n      })],\n      viewState,\n      layers\n    };\n\n    if (config && config.preStage) {\n      config.preStage(stage, deckProps);\n    }\n\n    this.deckgl.setProps(deckProps);\n    delete stage.cubeData;\n    this._last = {\n      cubeCount,\n      height,\n      width,\n      stage: stage,\n      view: stage.view\n    };\n  }\n  /**\n   * Home the camera to the last initial position.\n   */\n\n\n  homeCamera() {\n    const viewState = (0, _viewState.targetViewState)(this._last.height, this._last.width, this._last.view);\n    viewState.transitionDuration = _defaults.defaultPresenterConfig.transitionDurations.view;\n    viewState.transitionEasing = _d3Ease.easeExpInOut;\n    viewState.transitionInterpolator = new _linearInterpolator.LinearInterpolator(_viewState.viewStateProps);\n    const deckProps = {\n      views: this.deckgl.props.views,\n      viewState,\n      layers: this.deckgl.props.layers\n    };\n    this.deckgl.setProps(deckProps);\n  }\n  /**\n   * Get cube data array from the cubes layer.\n   */\n\n\n  getCubeData() {\n    return (0, _layers.getCubes)(this.deckgl.props);\n  }\n  /**\n   * Show guidelines of rendering height/width and center of OrbitView.\n   */\n\n\n  showGuides() {\n    this._showGuides = true;\n    this.getElement(_enums.PresenterElement.gl).classList.add('show-center');\n    this.rePresent(Object.assign(Object.assign({}, this._last.stage), {\n      cubeData: this.getCubeData()\n    }));\n  }\n\n  finalize() {\n    this.animationCancel();\n    if (this.deckgl) this.deckgl.finalize();\n    if (this.el) this.el.innerHTML = '';\n    this._last = null;\n    this.deckgl = null;\n    this.el = null;\n    this.logger = null;\n    this.queuedAnimationOptions = null;\n  }\n\n}\n\nexports.Presenter = Presenter;\n},{\"./base\":\"zVYr\",\"./marks/rule\":\"Kzvh\",\"./panel\":\"gdNG\",\"./color\":\"e0Zu\",\"./deck.gl-classes/deckgl\":\"FacW\",\"./defaults\":\"X8fn\",\"./clone\":\"VNzP\",\"d3-ease\":\"kv9T\",\"./layers\":\"i3Eh\",\"./legend\":\"pGbS\",\"./deck.gl-classes/linearInterpolator\":\"hwis\",\"tsx-create-element\":\"RooA\",\"./patchedCubeArray\":\"T97x\",\"./enums\":\"nVyH\",\"./stagers\":\"eFGB\",\"./viewState\":\"R9yy\"}],\"t8HY\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.RendererGl = void 0;\n\nvar _base = require(\"../base\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n//pass in the SuperClass, which should be a vega.View\nfunction _RendererGl(loader) {\n  //dynamic superclass, since we don't know have vega.View in the declaration phase\n  class RendererGlInternal extends _base.base.vega.Renderer {\n    initialize(el, width, height, origin) {\n      this.height = height;\n      this.width = width; // this method will invoke resize to size the canvas appropriately\n\n      return super.initialize(el, width, height, origin);\n    }\n\n    resize(width, height, origin) {\n      super.resize(width, height, origin);\n      this.origin = origin;\n      this.height = height;\n      this.width = width; //rteturn this for vega\n\n      return this;\n    }\n\n    _render(scene, items) {\n      const scene3d = scene;\n      scene3d.view = this.getView();\n      this.presenter.present(scene3d, this.height, this.width, this.presenterConfig); //return this for vega\n\n      return this;\n    }\n\n  }\n\n  const instance = new RendererGlInternal(loader);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n * This is instantiated by ViewGl.\n */\n\n\nconst RendererGl = _RendererGl;\nexports.RendererGl = RendererGl;\n},{\"../base\":\"zVYr\"}],\"czhV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ViewGl = void 0;\n\nvar _base = require(\"../base\");\n\nvar _defaults = require(\"../defaults\");\n\nvar _presenter = require(\"../presenter\");\n\nvar _enums = require(\"../enums\");\n\nvar _rendererGl = require(\"./rendererGl\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nlet registered = false; //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n//pass in the SuperClass, which should be a vega.View\n\nfunction _ViewGl(runtime, config) {\n  //dynamic superclass, since we don't know have vega.View in the declaration phase\n  class ViewGlInternal extends _base.base.vega.View {\n    constructor(runtime, config = {}) {\n      super(runtime, config);\n      this.config = config;\n      this.presenter = config.presenter;\n      config.presenterConfig = config.presenterConfig || {};\n\n      config.presenterConfig.redraw = () => {\n        this._redraw = true; //use Vega View private member _redraw\n\n        this.run();\n      };\n    }\n\n    renderer(renderer) {\n      if (renderer === 'deck.gl' && !registered) {\n        _base.base.vega.renderModule('deck.gl', {\n          handler: _base.base.vega.CanvasHandler,\n          renderer: _rendererGl.RendererGl\n        });\n\n        registered = true;\n      }\n\n      return super.renderer(renderer);\n    }\n\n    initialize(el) {\n      if (!this.presenter) {\n        this.presenter = new _presenter.Presenter(el);\n      }\n\n      super.initialize(this.presenter.getElement(_enums.PresenterElement.vegaControls));\n      const renderer = this._renderer;\n      renderer.presenterConfig = this.config.presenterConfig;\n      renderer.presenter = this.presenter;\n\n      renderer.getView = this.config && this.config.getView || (() => this.presenter.view || _defaults.defaultView);\n\n      return this;\n    }\n\n    error(e) {\n      if (this.presenter.logger) {\n        this.presenter.logger(e);\n      }\n    }\n\n  }\n\n  const instance = new ViewGlInternal(runtime, config);\n  return instance;\n} //signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.View, with added properties for accessing a Presenter.\n * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n */\n\n\nconst ViewGl = _ViewGl;\nexports.ViewGl = ViewGl;\n},{\"../base\":\"zVYr\",\"../defaults\":\"X8fn\",\"../presenter\":\"r0M0\",\"../enums\":\"nVyH\",\"./rendererGl\":\"t8HY\"}],\"vVi8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nvar _exportNames = {\n  constants: true,\n  controls: true,\n  types: true,\n  util: true,\n  defaults: true,\n  base: true,\n  use: true,\n  Presenter: true,\n  ViewGl: true\n};\nObject.defineProperty(exports, \"base\", {\n  enumerable: true,\n  get: function () {\n    return _base.base;\n  }\n});\nObject.defineProperty(exports, \"use\", {\n  enumerable: true,\n  get: function () {\n    return _base.use;\n  }\n});\nObject.defineProperty(exports, \"Presenter\", {\n  enumerable: true,\n  get: function () {\n    return _presenter.Presenter;\n  }\n});\nObject.defineProperty(exports, \"ViewGl\", {\n  enumerable: true,\n  get: function () {\n    return _viewGl.ViewGl;\n  }\n});\nexports.defaults = exports.util = exports.types = exports.controls = exports.constants = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar controls = _interopRequireWildcard(require(\"./exports/controls\"));\n\nexports.controls = controls;\n\nvar types = _interopRequireWildcard(require(\"./exports/types\"));\n\nexports.types = types;\n\nvar util = _interopRequireWildcard(require(\"./exports/util\"));\n\nexports.util = util;\n\nvar defaults = _interopRequireWildcard(require(\"./defaults\"));\n\nexports.defaults = defaults;\n\nvar _base = require(\"./base\");\n\nvar _presenter = require(\"./presenter\");\n\nvar _viewGl = require(\"./vega-classes/viewGl\");\n\nvar _enums = require(\"./enums\");\n\nObject.keys(_enums).forEach(function (key) {\n  if (key === \"default\" || key === \"__esModule\") return;\n  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;\n  Object.defineProperty(exports, key, {\n    enumerable: true,\n    get: function () {\n      return _enums[key];\n    }\n  });\n});\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n},{\"./constants\":\"Rva7\",\"./exports/controls\":\"EXu7\",\"./exports/types\":\"vJi1\",\"./exports/util\":\"yKkb\",\"./defaults\":\"X8fn\",\"./base\":\"zVYr\",\"./presenter\":\"r0M0\",\"./vega-classes/viewGl\":\"czhV\",\"./enums\":\"nVyH\"}],\"rb48\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getColumnsFromData = getColumnsFromData;\nexports.inferAll = inferAll;\nexports.getStats = getStats;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction isQuantitative(column) {\n  return column.type === 'number' || column.type === 'integer';\n}\n/**\n * Derive column metadata from the data array.\n * @param data Array of data objects.\n */\n\n\nfunction getColumnsFromData(data, columnTypes) {\n  const sample = data[0];\n  const fields = sample ? Object.keys(sample) : [];\n  const inferences = Object.assign(Object.assign({}, VegaDeckGl.base.vega.inferTypes(data, fields)), columnTypes);\n  const columns = fields.map(name => {\n    const column = {\n      name,\n      type: inferences[name]\n    };\n    return column;\n  });\n  inferAll(columns, data);\n  return columns;\n}\n/**\n * Populate columns with type inferences and stats.\n * @param columns Array of columns.\n * @param data Array of data objects.\n */\n\n\nfunction inferAll(columns, data) {\n  columns.forEach(column => {\n    if (column) {\n      if (typeof column.quantitative !== 'boolean') {\n        column.quantitative = isQuantitative(column);\n      }\n\n      if (column.type === 'string') {\n        checkIsColorData(data, column);\n      }\n\n      if (!column.stats) {\n        column.stats = getStats(data, column);\n      }\n    }\n  });\n}\n\nfunction checkIsColorData(data, column) {\n  for (let i = 0; i < data.length; i++) {\n    if (!VegaDeckGl.util.isColor(data[i][column.name])) {\n      return;\n    }\n  }\n\n  column.isColorData = true;\n}\n\nfunction getStats(data, column) {\n  const distinctMap = {};\n  const stats = {\n    distinctValueCount: null,\n    max: null,\n    mean: null,\n    min: null\n  };\n  let sum = 0;\n\n  for (let i = 0; i < data.length; i++) {\n    let row = data[i];\n    let value = row[column.name];\n    distinctMap[value] = true;\n\n    if (stats.max === null || value > stats.max) {\n      stats.max = value;\n    }\n\n    if (stats.min === null || value < stats.min) {\n      stats.min = value;\n    }\n\n    let num = +value;\n\n    if (!isNaN(num)) {\n      sum += num;\n    }\n\n    if (column.type === 'string' && !stats.hasColorData && VegaDeckGl.util.isColor(value)) {\n      stats.hasColorData = true;\n    }\n  }\n\n  if (column.quantitative) {\n    stats.mean = data.length > 0 && sum / data.length;\n    stats.hasNegative = detectNegative(column, data);\n\n    if (column.type === 'integer') {\n      stats.isSequential = detectSequentialColumn(column, data);\n    }\n  }\n\n  stats.distinctValueCount = Object.keys(distinctMap).length;\n  return stats;\n}\n\nfunction detectNegative(column, data) {\n  for (let i = 1; i < data.length; i++) {\n    if (data[i][column.name] < 0) return true;\n  }\n\n  return false;\n}\n\nfunction detectSequentialColumn(column, data) {\n  if (data.length < 2) return false;\n  let colname = column.name;\n\n  for (let i = 1; i < data.length; i++) {\n    if (data[i][colname] !== data[i - 1][colname] + 1) return false;\n  }\n\n  return true;\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\"}],\"e0Uq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPresenterStyle = getPresenterStyle;\nexports.dualColorSchemeColors = exports.cssPrefix = exports.defaultViewerOptions = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst {\n  defaultPresenterConfig,\n  defaultPresenterStyle\n} = VegaDeckGl.defaults;\nconst {\n  desaturate\n} = VegaDeckGl.util;\nconst defaultViewerOptions = {\n  colors: {\n    activeCube: [128, 0, 128, 255],\n    defaultCube: defaultPresenterStyle.defaultCubeColor,\n    hoveredCube: defaultPresenterStyle.highlightColor,\n    selectedCube: [255, 255, 0, 255],\n    axisSelectHighlight: [128, 128, 128, 128],\n    axisLine: [0, 0, 0, 255],\n    axisText: [0, 0, 0, 255],\n    cellFillerLine: [128, 128, 128, 255],\n    unselectedColorMethod: color => {\n      const c = desaturate(color, 0.05);\n      c[3] = 171;\n      return c;\n    }\n  },\n  language: {\n    headers: {\n      chart: 'Chart',\n      details: 'Details',\n      legend: 'Legend',\n      selection: 'Select & Filter'\n    },\n    bing: 'bing',\n    newColorMap: 'remap color to filtered items',\n    oldColorMap: 'keep same colors',\n    deselect: 'deselect',\n    exclude: 'exclude',\n    isolate: 'isolate',\n    legendOther: 'other',\n    nextDetail: '>',\n    previousDetail: '<',\n    reset: 'reset',\n    colorBinCount: 'Color bin count',\n    colorReverse: 'Color reverse',\n    count: 'Count',\n    scatterPointSize: 'Point size',\n    XBinSize: 'X axis bin size',\n    YBinSize: 'Y axis bin size',\n    XGridSize: 'X grid size',\n    YGridSize: 'Y grid size',\n    InnerPaddingSize: 'Inner padding size',\n    OuterPaddingSize: 'Outer padding size',\n    treeMapMethod: 'Method',\n    facetColumns: 'Facet columns',\n    facetRows: 'Facet rows',\n    markOpacitySignal: 'Mark opacity',\n    textScaleSignal: 'Text scale',\n    xAxisTextAngleSignal: 'X axis text angle',\n    yAxisTextAngleSignal: 'Y axis text angle',\n    zScaleProportion: 'Z scale proportion to Y',\n    selectionCount: count => `${count} items selected`\n  },\n  maxLegends: 19,\n  onError: errors => {//console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n  },\n  transitionDurations: Object.assign(Object.assign({}, defaultPresenterConfig.transitionDurations), {\n    scope: 600\n  }),\n  selectionPolygonZ: -1,\n  tickSize: 10,\n  facetMargins: {\n    column: 40,\n    row: 40,\n    title: 40\n  }\n};\nexports.defaultViewerOptions = defaultViewerOptions;\n\nfunction getPresenterStyle(options) {\n  var style = {\n    cssPrefix,\n    fontFamily: options.fontFamily,\n    defaultCubeColor: options.colors.defaultCube\n  };\n\n  if (options.colors.hoveredCube) {\n    style.highlightColor = options.colors.hoveredCube;\n  }\n\n  if (options.lightSettings) {\n    style.lightSettings = options.lightSettings;\n  }\n\n  return style;\n}\n\nconst cssPrefix = 'sanddance-';\nexports.cssPrefix = cssPrefix;\nconst dualColorSchemeColors = {\n  black: '#212121',\n  gray: '#D2D2D2',\n  blue: '#0060F0',\n  green: '#00C000',\n  orange: '#FF9900',\n  red: '#E00000'\n};\nexports.dualColorSchemeColors = dualColorSchemeColors;\n},{\"@msrvida/vega-deck.gl\":\"vVi8\"}],\"Gvq0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isInternalFieldName = isInternalFieldName;\nObject.defineProperty(exports, \"getColumnsFromData\", {\n  enumerable: true,\n  get: function () {\n    return _inference.getColumnsFromData;\n  }\n});\nObject.defineProperty(exports, \"getStats\", {\n  enumerable: true,\n  get: function () {\n    return _inference.getStats;\n  }\n});\nObject.defineProperty(exports, \"inferAll\", {\n  enumerable: true,\n  get: function () {\n    return _inference.inferAll;\n  }\n});\nObject.defineProperty(exports, \"ensureSearchExpressionGroupArray\", {\n  enumerable: true,\n  get: function () {\n    return _group.ensureSearchExpressionGroupArray;\n  }\n});\nObject.defineProperty(exports, \"getPresenterStyle\", {\n  enumerable: true,\n  get: function () {\n    return _defaults.getPresenterStyle;\n  }\n});\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"./constants\");\n\nvar _inference = require(\"./specs/inference\");\n\nvar _group = require(\"./searchExpression/group\");\n\nvar _defaults = require(\"./defaults\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst {\n  GL_ORDINAL\n} = VegaDeckGl.constants;\n\nfunction isInternalFieldName(columnName, includeVegaDeckGLFields = false) {\n  if (includeVegaDeckGLFields) {\n    if (columnName === GL_ORDINAL) return true;\n  }\n\n  for (let f in _constants.FieldNames) {\n    if (columnName === _constants.FieldNames[f]) return true;\n  }\n\n  return false;\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"./constants\":\"Etci\",\"./specs/inference\":\"rb48\",\"./searchExpression/group\":\"JGSZ\",\"./defaults\":\"e0Uq\"}],\"lm9d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.registerColorSchemes = registerColorSchemes;\nexports.colorSchemes = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nvar _defaults = require(\"./defaults\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst dualPairs = [[_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.gray], [_defaults.dualColorSchemeColors.red, _defaults.dualColorSchemeColors.green], [_defaults.dualColorSchemeColors.red, _defaults.dualColorSchemeColors.blue], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.red], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.orange], [_defaults.dualColorSchemeColors.black, _defaults.dualColorSchemeColors.green]];\n/**\n * Array of color schemes.\n */\n\nconst colorSchemes = [{\n  scheme: _constants.ColorScaleNone,\n  colors: [VegaDeckGl.util.colorToString(_defaults.defaultViewerOptions.colors.defaultCube)]\n}];\nexports.colorSchemes = colorSchemes;\ncreateDualColorSchemes();\n\nfunction registerColorSchemes(vega) {\n  colorSchemes.forEach(cs => {\n    if (cs.colors.length === 1) {\n      vega.scheme(cs.scheme, x => cs.colors[0]);\n    } else {\n      vega.scheme(cs.scheme, cs.colors);\n    }\n  });\n}\n\nfunction createPair(names, colors) {\n  const scheme = `dual_${names[0]}${names[1]}`;\n  colorSchemes.push({\n    scheme,\n    colors\n  });\n}\n\nfunction createDualColorSchemes() {\n  dualPairs.forEach(colors => {\n    const names = colors.map(color => {\n      for (let key in _defaults.dualColorSchemeColors) if (color === _defaults.dualColorSchemeColors[key]) return key;\n    });\n    createPair(names, colors);\n    createPair([...names].reverse(), [...colors].reverse());\n  });\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"./specs/constants\":\"RaLA\",\"./defaults\":\"e0Uq\"}],\"BvDn\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Animator = exports.DataLayoutChange = void 0;\nvar DataLayoutChange;\nexports.DataLayoutChange = DataLayoutChange;\n\n(function (DataLayoutChange) {\n  DataLayoutChange[DataLayoutChange[\"same\"] = 0] = \"same\";\n  DataLayoutChange[DataLayoutChange[\"reset\"] = 1] = \"reset\";\n  DataLayoutChange[DataLayoutChange[\"refine\"] = 2] = \"refine\";\n})(DataLayoutChange || (exports.DataLayoutChange = DataLayoutChange = {}));\n\nclass Animator {\n  constructor(dataScope, props) {\n    this.dataScope = dataScope;\n    this.props = props;\n  }\n\n  select(search) {\n    return new Promise((resolve, reject) => {\n      this.dataScope.select(search);\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  deselect() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deselect();\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  filter(search, keepData, collapseData) {\n    this.dataScope.collapse(true, collapseData);\n    return new Promise((resolve, reject) => {\n      this.props.onAnimateDataChange(DataLayoutChange.refine, 'before refine', 'refine').then(() => {\n        this.dataScope.deselect();\n        this.dataScope.setFilteredData(keepData);\n        this.props.onDataChanged(DataLayoutChange.refine, search);\n        resolve();\n      }).catch(reject);\n    });\n  }\n\n  reset() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deselect();\n      this.dataScope.setFilteredData(null);\n      this.props.onAnimateDataChange(DataLayoutChange.reset, 'before reset', 'reset').then(() => {\n        this.dataScope.collapse(false);\n        this.props.onDataChanged(DataLayoutChange.reset);\n        resolve();\n      }).catch(reject);\n    });\n  }\n\n  activate(datum) {\n    return new Promise((resolve, reject) => {\n      this.dataScope.activate(datum);\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n  deactivate() {\n    return new Promise((resolve, reject) => {\n      this.dataScope.deactivate();\n      this.props.onDataChanged(DataLayoutChange.same);\n      resolve();\n    });\n  }\n\n}\n\nexports.Animator = Animator;\n},{}],\"VHX9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getSelectedColorMap = getSelectedColorMap;\nexports.colorMapFromCubes = colorMapFromCubes;\nexports.populateColorContext = populateColorContext;\nexports.applyColorMapToCubes = applyColorMapToCubes;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction getSelectedColorMap(currentData, showSelectedData, showActive, viewerOptions) {\n  function getSelectionColorItem(datum) {\n    let item;\n\n    if (showSelectedData) {\n      item = datum[_constants.FieldNames.Selected] ? {\n        color: viewerOptions.colors.selectedCube\n      } : {\n        unSelected: true\n      };\n    }\n\n    if (showActive && datum[_constants.FieldNames.Active]) {\n      item = {\n        color: viewerOptions.colors.activeCube\n      };\n    }\n\n    return item;\n  }\n\n  const colorMap = {};\n  currentData.forEach(datum => {\n    const selectionColor = getSelectionColorItem(datum);\n\n    if (selectionColor) {\n      const ordinal = datum[VegaDeckGl.constants.GL_ORDINAL];\n      colorMap[ordinal] = selectionColor;\n    }\n  });\n  return colorMap;\n}\n\nfunction colorMapFromCubes(cubes) {\n  const map = {};\n  cubes.forEach(cube => {\n    map[cube.ordinal] = {\n      color: cube.color\n    };\n  });\n  return map;\n}\n\nfunction populateColorContext(colorContext, presenter) {\n  if (!colorContext.colorMap) {\n    const cubes = presenter.getCubeData();\n    colorContext.colorMap = colorMapFromCubes(cubes);\n  }\n\n  colorContext.legend = VegaDeckGl.util.clone(presenter.stage.legend);\n  colorContext.legendElement = presenter.getElement(VegaDeckGl.PresenterElement.legend).children[0];\n}\n\nfunction applyColorMapToCubes(maps, cubes, unselectedColorMethod) {\n  Object.keys(maps[0]).forEach(ordinal => {\n    const cube = cubes[+ordinal];\n\n    if (cube && !cube.isEmpty) {\n      const actualColorMappedItem = maps[0][ordinal];\n\n      if (maps.length > 1) {\n        const selectedColorMappedItem = maps[1][ordinal];\n\n        if (selectedColorMappedItem) {\n          if (selectedColorMappedItem.unSelected && unselectedColorMethod) {\n            cube.color = unselectedColorMethod(actualColorMappedItem.color);\n          } else {\n            cube.color = selectedColorMappedItem.color;\n          }\n\n          return;\n        }\n      }\n\n      cube.color = actualColorMappedItem.color;\n    }\n  });\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"./specs/constants\":\"RaLA\"}],\"Ulld\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.applySignalValues = applySignalValues;\nexports.extractSignalValuesFromView = extractSignalValuesFromView;\n\nfunction applySignalValues(sv, b) {\n  if (!sv || !b || !b.signals || !b.signals.length) return;\n\n  for (let key in sv) {\n    let value = sv[key];\n    let signalB = b.signals.filter(signal => signal.name === key)[0];\n\n    if (signalB && signalB.bind) {\n      signalB.value = value;\n    }\n  }\n}\n\nfunction extractSignalValuesFromView(view, spec) {\n  if (!view || !spec || !spec.signals || !spec.signals.length) return;\n  const result = {};\n  spec.signals.forEach(signalA => {\n    //bound to a UI control\n    if (signalA.bind) {\n      try {\n        result[signalA.name] = view.signal(signalA.name);\n      } catch (e) {// continue regardless of error\n      }\n    }\n  });\n  return result;\n}\n},{}],\"VJo2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.assignOrdinals = assignOrdinals;\nexports.getSpecColumns = getSpecColumns;\nexports.getDataIndexOfCube = getDataIndexOfCube;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction assignOrdinals(columns, data, ordinalMap) {\n  const uCol = columns.uid && columns.uid.name;\n\n  if (ordinalMap) {\n    data.forEach((d, i) => {\n      const key = uCol ? d[uCol] : i;\n      d[VegaDeckGl.constants.GL_ORDINAL] = ordinalMap[key];\n    });\n  } else {\n    ordinalMap = {};\n    data.forEach((d, i) => {\n      d[VegaDeckGl.constants.GL_ORDINAL] = i;\n      const uColValue = uCol ? d[uCol] : i;\n      ordinalMap[uColValue] = i;\n    });\n  }\n\n  return ordinalMap;\n}\n\nfunction getSpecColumns(insight, columns) {\n  function getColumnByName(name) {\n    return columns.filter(c => c.name === name)[0];\n  }\n\n  return {\n    color: getColumnByName(insight.columns && insight.columns.color),\n    facet: getColumnByName(insight.columns && insight.columns.facet),\n    group: getColumnByName(insight.columns && insight.columns.group),\n    size: getColumnByName(insight.columns && insight.columns.size),\n    sort: getColumnByName(insight.columns && insight.columns.sort),\n    uid: getColumnByName(insight.columns && insight.columns.uid),\n    x: getColumnByName(insight.columns && insight.columns.x),\n    y: getColumnByName(insight.columns && insight.columns.y),\n    z: getColumnByName(insight.columns && insight.columns.z)\n  };\n}\n\nfunction getDataIndexOfCube(cube, data) {\n  const len = data.length;\n\n  for (let i = 0; i < len; i++) {\n    if (data[i][VegaDeckGl.constants.GL_ORDINAL] === cube.ordinal) {\n      return i;\n    }\n  }\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\"}],\"kjBE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.facetSignals = facetSignals;\nexports.checkForFacetErrors = checkForFacetErrors;\nexports.facetSize = facetSize;\nexports.layout = layout;\nexports.facetBinStep = facetBinStep;\nexports.facetSourceData = facetSourceData;\nexports.facetGroupData = facetGroupData;\nexports.facetTransforms = facetTransforms;\nexports.facetMarks = facetMarks;\nexports.facetTitleSeparator = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nconst FacetColumnsSequence = 'FacetColumnsSequence';\nconst FacetRowsSequence = 'FacetRowsSequence';\nconst SequenceNumber = 'SequenceNumber';\nconst CellTitle = 'CellTitle';\nconst CellFiller = 'CellFiller';\nconst facetTitleSeparator = ' - ';\nexports.facetTitleSeparator = facetTitleSeparator;\n\nfunction facetSignals(context) {\n  const {\n    insight\n  } = context;\n  const {\n    facets\n  } = insight;\n  const signals = [{\n    name: _constants.SignalNames.FacetColumns,\n    value: facets.columns\n  }, {\n    name: _constants.SignalNames.FacetRows,\n    value: facets.rows\n  }];\n  return signals;\n}\n\nfunction checkForFacetErrors(facets, errors) {\n  if (facets) {\n    const gridCapacity = facets.columns * facets.rows;\n\n    if (!gridCapacity) {\n      errors.push('Must set facets columns & rows to non-zero.');\n    }\n\n    if (gridCapacity < 2) {\n      errors.push('Not enough facets to facet.');\n    }\n\n    if (!facets.columns || facets.columns < 1) {\n      errors.push('Facet column columns must be greater than 1.');\n    }\n\n    if (!facets.rows || facets.rows < 1) {\n      errors.push('Facet column rows must be greater than 1.');\n    }\n  }\n}\n\nfunction facetSize(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const {\n    facets,\n    size\n  } = insight;\n  return {\n    height: (size.height - (facets.rows + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.column)) / facets.columns,\n    width: (size.width - (facets.columns + 1) * (specViewOptions.tickSize + specViewOptions.facetMargins.row)) / facets.rows\n  };\n}\n\nfunction layout(context) {\n  const {\n    specViewOptions\n  } = context;\n  const layout = {\n    columns: {\n      signal: _constants.SignalNames.FacetColumns\n    },\n    bounds: 'full',\n    padding: {\n      column: specViewOptions.facetMargins.column,\n      row: specViewOptions.facetMargins.row\n    }\n  };\n  return layout;\n}\n\nfunction facetBinStep(facetColumn, facetCount) {\n  const range = facetColumn.stats.max - facetColumn.stats.min;\n  return range / facetCount;\n}\n\nfunction emptyBinsDataSource(name, facetColumn, facets) {\n  const gridCapacity = facets.columns * facets.rows;\n  const step = facetBinStep(facetColumn, gridCapacity);\n  const steps = [];\n\n  for (let i = 0; i < gridCapacity; i++) {\n    steps[i] = facetColumn.stats.min + i * step + step / 2;\n  }\n\n  const values = steps.map(s => {\n    const obj = {};\n    obj[_constants.FieldNames.Collapsed] = true;\n    obj[facetColumn.name] = s;\n    return obj;\n  });\n  const data = {\n    name,\n    values\n  };\n  return data;\n}\n\nfunction facetSourceData(facetColumn, facets, name) {\n  let data;\n\n  if (facetColumn && facetColumn.quantitative) {\n    data = [{\n      name: _constants.DataNames.Pre\n    }, emptyBinsDataSource(_constants.DataNames.EmptyBin, facetColumn, facets), {\n      name,\n      source: [_constants.DataNames.Pre, _constants.DataNames.EmptyBin]\n    }];\n  } else {\n    data = [{\n      name\n    }];\n  }\n\n  return data;\n}\n\nfunction facetGroupData(source) {\n  const data = [{\n    name: _constants.DataNames.FacetCellTitles,\n    source,\n    transform: [{\n      type: 'aggregate',\n      groupby: [CellTitle]\n    }]\n  }, {\n    name: CellFiller,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      step: 1,\n      stop: {\n        signal: `${_constants.SignalNames.FacetColumns} * ${_constants.SignalNames.FacetRows} - length(data('${_constants.DataNames.FacetCellTitles}'))`\n      }\n    }]\n  }, {\n    name: FacetColumnsSequence,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      stop: {\n        signal: _constants.SignalNames.FacetColumns\n      },\n      as: SequenceNumber\n    }]\n  }, {\n    name: FacetRowsSequence,\n    transform: [{\n      type: 'sequence',\n      start: 0,\n      stop: {\n        signal: _constants.SignalNames.FacetRows\n      },\n      as: SequenceNumber\n    }]\n  }];\n  return data;\n}\n\nfunction facetTransforms(facetColumn, facets) {\n  let transforms;\n\n  if (facetColumn.quantitative) {\n    const gridCapacity = facets.columns * facets.rows;\n    const step = facetBinStep(facetColumn, gridCapacity);\n    transforms = [{\n      type: 'bin',\n      field: facetColumn.name,\n      step,\n      nice: false,\n      extent: [facetColumn.stats.min, facetColumn.stats.max],\n      as: [_constants.FieldNames.FacetBin0, _constants.FieldNames.FacetBin1]\n    }, {\n      type: 'collect',\n      sort: {\n        field: _constants.FieldNames.FacetBin0\n      }\n    }, {\n      type: 'formula',\n      expr: `format(datum.${_constants.FieldNames.FacetBin0}, '~r') + '${facetTitleSeparator}' + format(datum.${_constants.FieldNames.FacetBin1}, '~r')`,\n      as: CellTitle\n    }];\n  } else {\n    transforms = [{\n      type: 'formula',\n      expr: `datum[${JSON.stringify(facetColumn.name)}]`,\n      as: CellTitle\n    }];\n  }\n\n  return transforms;\n}\n\nfunction facetMarks(specViewOptions, sourceDataName, childMarks, childAxes, childData) {\n  //TODO: create a style\n  const cellFillerLineColor = _vegaDeck.util.colorToString(specViewOptions.colors.cellFillerLine);\n\n  const style = 'cell';\n  const mark = {\n    style,\n    type: 'group',\n    from: {\n      facet: {\n        name: _constants.DataNames.FacetGroupCell,\n        data: sourceDataName,\n        groupby: [CellTitle]\n      }\n    },\n    title: {\n      frame: 'group',\n      offset: specViewOptions.facetMargins.title,\n      text: {\n        signal: `parent['${CellTitle}']`\n      },\n      limit: {\n        signal: 'width'\n      },\n      color: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n      fontSize: {\n        signal: _constants.SignalNames.TextSize\n      }\n    },\n    encode: {\n      update: {\n        width: {\n          signal: 'width'\n        },\n        height: {\n          signal: 'height'\n        }\n      }\n    },\n    data: childData,\n    marks: childMarks.map(mark => {\n      if (mark.from && mark.from.data && mark.from.data === sourceDataName) {\n        mark.from.data = _constants.DataNames.FacetGroupCell;\n      }\n\n      return mark;\n    })\n  };\n\n  if (childAxes) {\n    mark.axes = childAxes.map(axis => {\n      const clone = _vegaDeck.util.clone(axis); //remove all labels and titles\n\n\n      clone.labels = false;\n      delete clone.title;\n      delete clone.titleAlign;\n      delete clone.titleAngle;\n      delete clone.titleFontSize;\n      return clone;\n    });\n  }\n\n  const filler = {\n    style: 'cell',\n    type: 'group',\n    from: {\n      data: CellFiller\n    },\n    title: {\n      frame: 'group',\n      offset: specViewOptions.facetMargins.title,\n      text: '',\n      fontSize: {\n        signal: _constants.SignalNames.TextSize\n      }\n    },\n    encode: {\n      update: {\n        width: {\n          signal: 'width'\n        },\n        height: {\n          signal: 'height'\n        }\n      }\n    }\n  };\n\n  if (childAxes) {\n    filler.axes = childAxes.map(axis => {\n      const clone = _vegaDeck.util.clone(axis); //remove all labels and titles\n\n\n      clone.labels = false;\n      delete clone.title;\n      delete clone.titleAlign;\n      delete clone.titleAngle;\n      delete clone.titleFontSize; //change tick & domain color\n\n      clone.tickColor = cellFillerLineColor;\n      clone.domainColor = cellFillerLineColor;\n      return clone;\n    });\n  }\n\n  const rowHeader = {\n    type: 'group',\n    role: 'row-header',\n    from: {\n      facet: {\n        name: 'row-headers',\n        data: FacetRowsSequence,\n        groupby: [SequenceNumber]\n      }\n    }\n  };\n\n  if (childAxes) {\n    rowHeader.axes = [cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'left')[0], specViewOptions.facetMargins.column)];\n  }\n\n  const columnFooter = {\n    type: 'group',\n    role: 'column-footer',\n    from: {\n      facet: {\n        name: 'column-footers',\n        data: FacetColumnsSequence,\n        groupby: [SequenceNumber]\n      }\n    }\n  };\n\n  if (childAxes) {\n    columnFooter.axes = [cloneAndOffsetAxis(childAxes.filter(axis => axis.orient === 'bottom')[0], specViewOptions.facetMargins.row)];\n  }\n\n  const marks = [mark, filler, rowHeader, columnFooter];\n  return marks;\n}\n\nfunction cloneAndOffsetAxis(axis, margin) {\n  if (axis) {\n    const clone = _vegaDeck.util.clone(axis);\n\n    clone.offset = margin;\n    return clone;\n  }\n}\n},{\"./constants\":\"RaLA\",\"@msrvida/vega-deck.gl\":\"vVi8\"}],\"V309\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.notNice = notNice;\nexports.selectNullOrEmpty = selectNullOrEmpty;\nexports.selectExact = selectExact;\nexports.selectNone = selectNone;\nexports.selectExactAxis = selectExactAxis;\nexports.selectBetween = selectBetween;\nexports.selectBetweenAxis = selectBetweenAxis;\nexports.selectBetweenFacet = selectBetweenFacet;\n\nvar _facet = require(\"./specs/facet\");\n\nfunction notNice(niceValue) {\n  //convert \"nice\" numbers to numeric value\n  return (niceValue + '').replace(/,/g, '');\n}\n\nfunction tickValue(axis, i) {\n  const tick = axis.tickText[i];\n  let value;\n\n  if (tick) {\n    value = axis.tickText[i].value;\n  }\n\n  return {\n    tick,\n    value\n  };\n}\n\nfunction selectNullOrEmpty(column) {\n  const searchExpression = {\n    name: column.name,\n    operator: 'isnullorEmpty'\n  };\n  return searchExpression;\n}\n\nfunction selectExact(column, value) {\n  if (value == null) {\n    return selectNullOrEmpty(column);\n  }\n\n  const searchExpression = {\n    name: column.name,\n    operator: '==',\n    value\n  };\n  return searchExpression;\n}\n\nfunction selectNone(column, values) {\n  const expressions = values.map((value, i) => {\n    const searchExpression = {\n      name: column.name,\n      operator: '!=',\n      value\n    };\n\n    if (i) {\n      searchExpression.clause = '&&';\n    }\n\n    return searchExpression;\n  });\n  const searchExpressionGroup = {\n    expressions\n  };\n  return searchExpressionGroup;\n}\n\nfunction selectExactAxis(axis, column, i) {\n  const result = tickValue(axis, i);\n\n  if (result.tick) {\n    return selectExact(column, result.value);\n  }\n}\n\nfunction selectBetween(column, lowValue, highValue, lowOperator = '>=', highOperator = '<') {\n  const expressions = [];\n\n  if (lowValue !== undefined) {\n    expressions.push({\n      name: column.name,\n      operator: lowOperator,\n      value: lowValue\n    });\n  }\n\n  if (highValue !== undefined) {\n    expressions.push({\n      name: column.name,\n      operator: highOperator,\n      value: highValue\n    });\n  }\n\n  if (expressions.length > 1) {\n    expressions[1].clause = '&&';\n  }\n\n  const searchExpressionGroup = {\n    expressions\n  };\n  return searchExpressionGroup;\n}\n\nfunction selectBetweenAxis(axis, column, i) {\n  const low = tickValue(axis, i);\n  const high = tickValue(axis, i + 1);\n  return selectBetween(column, low.value, high.value);\n}\n\nfunction selectBetweenFacet(column, title, isFirst, isLast) {\n  const values = title.split(_facet.facetTitleSeparator);\n  return selectBetween(column, isFirst ? undefined : values[0], isLast ? undefined : values[1]);\n}\n},{\"./specs/facet\":\"kjBE\"}],\"el4c\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.axisSelectionLayer = axisSelectionLayer;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _expression = require(\"./expression\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction axisSelectionLayer(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n  const polygons = [];\n  const xRole = specCapabilities.roles.filter(r => r.role === 'x')[0];\n\n  if (xRole && xRole.axisSelection) {\n    stage.axes.x.filter(axis => axis.tickText.length).forEach(axis => {\n      polygons.push.apply(polygons, axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n    });\n  }\n\n  const yRole = specCapabilities.roles.filter(r => r.role === 'y')[0];\n\n  if (yRole && yRole.axisSelection) {\n    stage.axes.y.filter(axis => axis.tickText.length).forEach(axis => {\n      polygons.push.apply(polygons, axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n    });\n  }\n\n  if (stage.facets) {\n    polygons.push.apply(polygons, facetSelectionPolygons(stage.facets, columns.facet));\n  } //move polygons to Z\n\n\n  polygons.forEach(datum => {\n    datum.polygon.forEach(p => {\n      p[2] = polygonZ;\n    });\n  });\n\n  const onClick = (o, e) => clickHandler(e.srcEvent, o.object.search);\n\n  const polygonLayer = new VegaDeckGl.base.layers.PolygonLayer({\n    autoHighlight: true,\n    coordinateSystem: VegaDeckGl.base.deck.COORDINATE_SYSTEM.IDENTITY,\n    data: polygons,\n    extruded: false,\n    highlightColor,\n    id: 'selections',\n    onHover: (o, e) => {\n      if (o.index === -1) {\n        presenter.deckgl.interactiveState.onAxisSelection = false;\n      } else {\n        presenter.deckgl.interactiveState.onAxisSelection = true;\n      }\n    },\n    onClick,\n    getElevation: () => 0,\n    getFillColor: () => [0, 0, 0, 0],\n    pickable: true,\n    stroked: false\n  });\n  return polygonLayer;\n}\n\nfunction axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n  const polygons = [];\n  const size = 50;\n  const getSearch = axisSelectionType === 'exact' ? (a, c, i) => ({\n    expressions: [(0, _expression.selectExactAxis)(a, c, i)]\n  }) : _expression.selectBetweenAxis;\n  const {\n    domain,\n    ticks\n  } = axis;\n\n  if (ticks.length > 0 && domain) {\n    const dim = vertical ? 1 : 0;\n    const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n    let divisions;\n\n    if (between) {\n      divisions = [];\n\n      for (let i = 1; i < ticks.length; i++) {\n        divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n      }\n    } else {\n      divisions = ticks.slice(1, -1).map(tick => tick.sourcePosition[dim]);\n    }\n\n    const add = (p2, i) => {\n      var coords = [[p1, q1], [p2, q1], [p2, q2], [p1, q2]];\n      polygons.push({\n        search: getSearch(axis, column, i),\n        polygon: vertical ? coords.map(xy => xy.reverse()) : coords\n      });\n      p1 = p2;\n    };\n\n    let p1 = domain.sourcePosition[dim];\n    const q1 = domain.sourcePosition[vertical ? 0 : 1];\n    const q2 = q1 - size;\n    divisions.forEach(add);\n    add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n  }\n\n  return polygons;\n}\n\nfunction facetSelectionPolygons(facetRects, facetColumn) {\n  const polygons = [];\n  facetRects.forEach((facetRect, i) => {\n    //take any 2 lines to get a box dimension\n    const [x, y] = minMaxPoints(facetRect.lines.slice(2));\n    const search = facetRect.facetTitle ? facetColumn.quantitative ? (0, _expression.selectBetweenFacet)(facetColumn, facetRect.facetTitle.text, i === 0, i === facetRects.length - 1) : {\n      expressions: [(0, _expression.selectExact)(facetColumn, facetRect.facetTitle.text)]\n    } : {\n      expressions: [(0, _expression.selectNullOrEmpty)(facetColumn)]\n    };\n    polygons.push({\n      search,\n      polygon: [[x.min, y.min], [x.max, y.min], [x.max, y.max], [x.min, y.max]]\n    });\n  });\n  return polygons;\n}\n\nfunction minMaxPoints(lines) {\n  const points = [];\n  lines.forEach(line => {\n    [line.sourcePosition, line.targetPosition].forEach(point => {\n      points.push(point);\n    });\n  });\n  return [0, 1].map(dim => {\n    let minMax = {\n      min: null,\n      max: null\n    };\n    points.forEach(point => {\n      if (minMax.max == null) {\n        minMax.max = point[dim];\n      } else {\n        minMax.max = Math.max(minMax.max, point[dim]);\n      }\n\n      if (minMax.min == null) {\n        minMax.min = point[dim];\n      } else {\n        minMax.min = Math.min(minMax.min, point[dim]);\n      }\n    });\n    return minMax;\n  });\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"./expression\":\"V309\"}],\"jktp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.columnToAxisType = columnToAxisType;\nexports.partialAxes = partialAxes;\nexports.AxisType = void 0;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nvar AxisType;\nexports.AxisType = AxisType;\n\n(function (AxisType) {\n  AxisType[AxisType[\"quantitative\"] = 0] = \"quantitative\";\n  AxisType[AxisType[\"categoric\"] = 1] = \"categoric\";\n  AxisType[AxisType[\"date\"] = 2] = \"date\";\n})(AxisType || (exports.AxisType = AxisType = {}));\n\nfunction columnToAxisType(c) {\n  if (c.quantitative) {\n    return AxisType.quantitative;\n  }\n\n  return AxisType.categoric;\n}\n\nfunction partialAxes(specViewOptions, bottomType, leftType) {\n  const lineColor = _vegaDeck.util.colorToString(specViewOptions.colors.axisLine);\n\n  const axisColor = {\n    domainColor: lineColor,\n    tickColor: lineColor,\n    labelColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText)\n  };\n  const bottom = Object.assign({\n    orient: 'bottom',\n    labelAlign: 'left',\n    labelAngle: {\n      signal: _constants.SignalNames.TextAngleX\n    },\n    labelFontSize: {\n      signal: _constants.SignalNames.TextSize\n    },\n    titleAngle: {\n      signal: _constants.SignalNames.TextAngleX\n    },\n    titleAlign: 'left',\n    titleFontSize: {\n      signal: _constants.SignalNames.TextTitleSize\n    },\n    titleColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n    tickSize: specViewOptions.tickSize\n  }, axisColor);\n\n  if (bottomType === AxisType.quantitative) {\n    bottom.format = '~r';\n  }\n\n  const left = Object.assign({\n    orient: 'left',\n    labelAlign: 'right',\n    labelAngle: {\n      signal: _constants.SignalNames.TextAngleY\n    },\n    labelFontSize: {\n      signal: _constants.SignalNames.TextSize\n    },\n    titleAngle: {\n      signal: _constants.SignalNames.TextAngleY\n    },\n    titleAlign: 'right',\n    titleFontSize: {\n      signal: _constants.SignalNames.TextTitleSize\n    },\n    titleColor: _vegaDeck.util.colorToString(specViewOptions.colors.axisText),\n    tickSize: specViewOptions.tickSize\n  }, axisColor);\n\n  if (leftType === AxisType.quantitative) {\n    left.format = '~r';\n  }\n\n  return {\n    left,\n    bottom\n  };\n}\n},{\"./constants\":\"RaLA\",\"@msrvida/vega-deck.gl\":\"vVi8\"}],\"sqcb\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nvar _constants = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, _axes.AxisType.quantitative, (0, _axes.columnToAxisType)(specColumns.y));\n  const axes = [Object.assign({\n    scale: _constants.ScaleNames.Y,\n    title: specColumns.y.name\n  }, pa.left), Object.assign({\n    scale: _constants.BarChartScaleNames.levelScale,\n    title: specViewOptions.language.count,\n    encode: {\n      labels: {\n        update: {\n          text: {\n            signal: `${_constants.BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n          }\n        }\n      }\n    }\n  }, pa.bottom)];\n  return axes;\n}\n},{\"../axes\":\"jktp\",\"../constants\":\"RaLA\"}],\"btG5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const stackTransform = {\n    type: 'stack',\n    groupby: [{\n      field: specColumns.y.name\n    }],\n    as: [_constants.FieldNames.BarChartStack0, _constants.FieldNames.BarChartStack1]\n  };\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"../constants\":\"RaLA\"}],\"tAA3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, groupBy) {\n  const {\n    specColumns\n  } = context;\n  const bucket_extent = 'bucket_extent';\n  const stackTransform = {\n    type: 'stack',\n    groupby: [_constants.FieldNames.BarChartBin0],\n    as: [_constants.FieldNames.BarChartStack0, _constants.FieldNames.BarChartStack1]\n  };\n\n  if (groupBy) {\n    stackTransform.groupby.push(groupBy.name);\n  }\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [{\n    type: 'extent',\n    field: specColumns.y.name,\n    signal: bucket_extent\n  }, {\n    type: 'bin',\n    field: specColumns.y.name,\n    extent: {\n      signal: bucket_extent\n    },\n    maxbins: {\n      signal: _constants.SignalNames.YBins\n    },\n    as: [_constants.FieldNames.BarChartBin0, _constants.FieldNames.BarChartBin1],\n    signal: _constants.BarChartSignalNames.quantitativeBinSignal\n  }, stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"../constants\":\"RaLA\"}],\"FvDz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.allTruthy = allTruthy;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n/**\n * Returns array with items which are truthy.\n * @param args array or arrays to concat into a single array.\n */\nfunction allTruthy(...args) {\n  return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n}\n},{}],\"z3Hg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.topLookup = topLookup;\n\nvar _constants = require(\"./constants\");\n\nfunction topLookup(column, count) {\n  const data = [{\n    name: _constants.DataNames.TopLookup,\n    source: _constants.DataNames.Main,\n    transform: [{\n      type: 'aggregate',\n      groupby: [column.name]\n    }, {\n      type: 'window',\n      ops: ['count'],\n      as: [_constants.FieldNames.TopIndex]\n    }, {\n      type: 'filter',\n      expr: `datum.${_constants.FieldNames.TopIndex} <= ${count}`\n    }]\n  }, {\n    name: _constants.DataNames.Legend,\n    source: _constants.DataNames.Main,\n    transform: [{\n      type: 'lookup',\n      from: _constants.DataNames.TopLookup,\n      key: column.name,\n      fields: [column.name],\n      values: [column.name],\n      as: [_constants.FieldNames.Top]\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.Top} == null ? '${_constants.Other}' : datum.${_constants.FieldNames.Top}`,\n      as: _constants.FieldNames.Top\n    }]\n  }];\n  return data;\n}\n},{\"./constants\":\"RaLA\"}],\"fKWJ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.bucketed = bucketed;\nexports.stacked = stacked;\n\nvar _transform = _interopRequireDefault(require(\"./transform.qualitative\"));\n\nvar _transform2 = _interopRequireDefault(require(\"./transform.quantitative\"));\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? _constants.DataNames.Pre : _constants.DataNames.Main;\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, _constants.DataNames.Main), categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [bucketed(context, namespace, categoricalColor ? _constants.DataNames.Legend : nestedDataName), stacked(namespace, namespace.bucket, specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))], specColumns.y.quantitative && [{\n    name: _constants.DataNames.QuantitativeData,\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.start`\n      },\n      stop: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.stop`\n      },\n      step: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.step`\n      }\n    }]\n  }], specColumns.facet && (0, _facet.facetGroupData)(namespace.stacked));\n  return data;\n}\n\nfunction bucketed(context, namespace, source) {\n  const {\n    specColumns: columns\n  } = context;\n  const data = {\n    name: namespace.bucket,\n    source,\n    transform: columns.y.quantitative ? (0, _transform2.default)(context, columns.facet) : (0, _transform.default)(context)\n  };\n  return data;\n}\n\nfunction stacked(namespace, source, transforms) {\n  const data = {\n    name: namespace.stacked,\n    source,\n    transform: (0, _array.allTruthy)(transforms, xy(namespace))\n  };\n  return data;\n}\n\nfunction xy(namespace) {\n  const transforms = [{\n    type: 'formula',\n    expr: `floor(datum.${_constants.FieldNames.BarChartStack0} / ${_constants.BarChartSignalNames.compartmentsPerLevelSignal})`,\n    as: namespace.__level\n  }, {\n    type: 'formula',\n    expr: `datum.${_constants.FieldNames.BarChartStack0} % ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}`,\n    as: namespace.__compartment\n  }];\n  return transforms;\n}\n},{\"./transform.qualitative\":\"btG5\",\"./transform.quantitative\":\"tAA3\",\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../facet\":\"kjBE\",\"../top\":\"z3Hg\"}],\"shdv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fill = fill;\nexports.opacity = opacity;\n\nvar _constants = require(\"./constants\");\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nfunction fill(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const colorColumn = specColumns.color;\n  return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n    field: colorColumn.name\n  } : {\n    scale: _constants.ScaleNames.Color,\n    field: colorColumn.quantitative ? colorColumn.name : _constants.FieldNames.Top\n  } : {\n    value: _vegaDeck.util.colorToString(specViewOptions.colors.defaultCube)\n  };\n}\n\nfunction opacity(context) {\n  const result = {\n    signal: _constants.SignalNames.MarkOpacity\n  };\n  return result;\n}\n},{\"./constants\":\"RaLA\",\"@msrvida/vega-deck.gl\":\"vVi8\"}],\"rIKp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.testForCollapseSelection = testForCollapseSelection;\n\nvar _constants = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction testForCollapseSelection() {\n  return `datum.${_constants.FieldNames.Collapsed}`;\n}\n},{\"./constants\":\"RaLA\"}],\"S7Ji\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: namespace.stacked\n    },\n    encode: {\n      update: {\n        y: {\n          scale: _constants.ScaleNames.Y,\n          field: specColumns.y.quantitative ? _constants.FieldNames.BarChartBin0 : specColumns.y.name,\n          offset: {\n            scale: _constants.BarChartScaleNames.compartmentScale,\n            field: namespace.__compartment\n          }\n        },\n        height: [{\n          test: `bandwidth('${_constants.BarChartScaleNames.compartmentScale}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.BarChartScaleNames.compartmentScale,\n          band: 1\n        }],\n        x: [{\n          scale: _constants.ScaleNames.X,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants.SignalNames.XDomain}[0]`\n        }, {\n          scale: _constants.ScaleNames.X,\n          field: namespace.__level,\n          band: 1,\n          offset: {\n            signal: `-bandwidth('${_constants.ScaleNames.X}')-1`\n          }\n        }],\n        width: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          test: `bandwidth('${_constants.ScaleNames.X}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.ScaleNames.X,\n          band: 1\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"../constants\":\"RaLA\",\"../fill\":\"shdv\",\"../selection\":\"rIKp\"}],\"czu9\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.bucketScale,\n    type: 'band',\n    range: 'height',\n    domain: {\n      data: namespace.bucket,\n      field: specColumns.y.name,\n      sort: true\n    }\n  }, {\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    range: [0, {\n      signal: 'height'\n    }],\n    padding: 0.01,\n    domain: {\n      data: namespace.stacked,\n      field: specColumns.y.name,\n      sort: true\n    },\n    reverse: true\n  }];\n  return scales;\n}\n},{\"../constants\":\"RaLA\"}],\"LMrw\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default() {\n  const scales = [{\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    range: [0, {\n      signal: 'height'\n    }],\n    padding: 0.01,\n    domain: {\n      data: _constants.DataNames.QuantitativeData,\n      field: 'data',\n      sort: true\n    },\n    reverse: true\n  }];\n  return scales;\n}\n},{\"../constants\":\"RaLA\"}],\"JJH5\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linearScale = linearScale;\nexports.pointScale = pointScale;\nexports.binnableColorScale = binnableColorScale;\n\nvar _constants = require(\"./constants\");\n\nfunction linearScale(name, data, field, range, reverse, zero) {\n  const scale = {\n    name,\n    type: 'linear',\n    range,\n    round: true,\n    reverse,\n    domain: {\n      data,\n      field\n    },\n    zero,\n    nice: true\n  };\n  return scale;\n}\n\nfunction pointScale(name, data, range, field, reverse) {\n  const scale = {\n    name,\n    type: 'point',\n    range,\n    domain: {\n      data,\n      field,\n      sort: true\n    },\n    padding: 0.5\n  };\n\n  if (reverse !== undefined) {\n    scale.reverse = reverse;\n  }\n\n  return scale;\n}\n\nfunction binnableColorScale(colorBin, data, field, scheme) {\n  scheme = scheme || _constants.ColorScaleNone;\n  const name = _constants.ScaleNames.Color;\n  const domain = {\n    data,\n    field\n  };\n  const range = {\n    scheme\n  };\n  const reverse = {\n    signal: _constants.SignalNames.ColorReverse\n  };\n\n  if (colorBin !== 'continuous') {\n    range.count = {\n      signal: _constants.SignalNames.ColorBinCount\n    };\n  }\n\n  switch (colorBin) {\n    case 'continuous':\n      {\n        const sequentialScale = {\n          name,\n          type: 'linear',\n          domain,\n          range,\n          reverse\n        };\n        return sequentialScale;\n      }\n\n    case 'quantile':\n      {\n        const quantileScale = {\n          name,\n          type: 'quantile',\n          domain,\n          range,\n          reverse\n        };\n        return quantileScale;\n      }\n\n    default:\n      {\n        const quantizeScale = {\n          name,\n          type: 'quantize',\n          domain,\n          range,\n          reverse\n        };\n        return quantizeScale;\n      }\n  }\n}\n},{\"./constants\":\"RaLA\"}],\"FGO4\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = _interopRequireDefault(require(\"./scales.qualitative\"));\n\nvar _scales2 = _interopRequireDefault(require(\"./scales.quantitative\"));\n\nvar _constants = require(\"../constants\");\n\nvar _scales3 = require(\"../scales\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.compartmentScale,\n    type: 'band',\n    range: [0, {\n      signal: _constants.BarChartSignalNames.compartmentHeightSignal\n    }],\n    padding: 0.1,\n    domain: {\n      signal: `sequence(0, ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n    }\n  }, {\n    name: _constants.BarChartScaleNames.levelScale,\n    range: [{\n      signal: '0'\n    }, {\n      signal: 'width'\n    }],\n    round: true,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    },\n    zero: true,\n    nice: true\n  }, {\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    range: [{\n      signal: '0'\n    }, {\n      signal: 'width'\n    }],\n    padding: 0.1,\n    round: false,\n    reverse: false,\n    align: 1,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales3.binnableColorScale)(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: namespace.bucket,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales3.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales3.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales.concat(specColumns.y.quantitative ? (0, _scales2.default)() : (0, _scales.default)(context, namespace));\n}\n},{\"./scales.qualitative\":\"czu9\",\"./scales.quantitative\":\"LMrw\",\"../constants\":\"RaLA\",\"../scales\":\"JJH5\"}],\"nj5B\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.textSignals = textSignals;\nexports.colorBinCountSignal = colorBinCountSignal;\nexports.colorReverseSignal = colorReverseSignal;\nexports.defaultZProportion = void 0;\n\nvar _constants = require(\"./constants\");\n\nconst defaultZProportion = 0.6;\nexports.defaultZProportion = defaultZProportion;\n\nfunction textSignals(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signals = [{\n    name: _constants.SignalNames.ZProportion,\n    value: defaultZProportion,\n    bind: {\n      name: specViewOptions.language.zScaleProportion,\n      debounce: 50,\n      input: 'range',\n      min: 0.2,\n      max: 2,\n      step: 0.1\n    }\n  }, {\n    name: _constants.SignalNames.ZHeight,\n    update: `height * ${_constants.SignalNames.ZProportion}`\n  }, {\n    name: _constants.SignalNames.TextScale,\n    value: 2,\n    bind: {\n      name: specViewOptions.language.textScaleSignal,\n      debounce: 50,\n      input: 'range',\n      min: 1,\n      max: 5,\n      step: 0.5\n    }\n  }, {\n    name: _constants.SignalNames.TextSize,\n    update: `${_constants.SignalNames.TextScale} * 10`\n  }, {\n    name: _constants.SignalNames.TextTitleSize,\n    update: `${_constants.SignalNames.TextScale} * 15`\n  }, {\n    name: _constants.SignalNames.TextAngleX,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.xAxisTextAngleSignal,\n      debounce: 50,\n      input: 'range',\n      min: 0,\n      max: 90,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.TextAngleY,\n    value: 0,\n    bind: {\n      name: specViewOptions.language.yAxisTextAngleSignal,\n      debounce: 50,\n      input: 'range',\n      min: -90,\n      max: 0,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.MarkOpacity,\n    value: 1,\n    bind: {\n      name: specViewOptions.language.markOpacitySignal,\n      debounce: 50,\n      input: 'range',\n      min: 0.1,\n      max: 1,\n      step: 0.05\n    }\n  }];\n  return signals;\n}\n\nfunction colorBinCountSignal(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signal = {\n    name: _constants.SignalNames.ColorBinCount,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.colorBinCount,\n      input: 'range',\n      min: 1,\n      max: specViewOptions.maxLegends + 1,\n      step: 1\n    }\n  };\n  return signal;\n}\n\nfunction colorReverseSignal(context) {\n  const {\n    specViewOptions\n  } = context;\n  const signal = {\n    name: _constants.SignalNames.ColorReverse,\n    value: false,\n    bind: {\n      name: specViewOptions.language.colorReverse,\n      input: 'checkbox'\n    }\n  };\n  return signal;\n}\n},{\"./constants\":\"RaLA\"}],\"uQoQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants.SignalNames.XDomain,\n    update: `domain('${_constants.ScaleNames.X}')`\n  }, specColumns.y.quantitative && {\n    name: _constants.SignalNames.YBins,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.BarChartSignalNames.compartmentHeightSignal,\n    update: `bandwidth('${specColumns.y.quantitative ? _constants.ScaleNames.Y : _constants.BarChartScaleNames.bucketScale}')`\n  }, {\n    name: _constants.BarChartSignalNames.aspectRatioSignal,\n    update: `${_constants.BarChartSignalNames.compartmentHeightSignal}/width`\n  }, {\n    name: _constants.BarChartSignalNames.compartmentsPerLevelSignal,\n    update: `ceil(sqrt(${_constants.BarChartSignalNames.aspectRatioSignal}*${_constants.BarChartSignalNames.levelExtentSignal}[1]))`\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], specColumns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../signals\":\"nj5B\",\"../facet\":\"kjBE\"}],\"y9mm\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getLegends = getLegends;\n\nvar _constants = require(\"./constants\");\n\nfunction legend(column) {\n  const legend = {\n    orient: 'none',\n    title: column.name,\n    fill: _constants.ScaleNames.Color,\n    encode: {\n      symbols: {\n        update: {\n          shape: {\n            value: 'square'\n          }\n        }\n      }\n    }\n  };\n\n  if (column.quantitative) {\n    legend.type = 'symbol';\n    legend.format = '~r';\n  }\n\n  return legend;\n}\n\nfunction getLegends(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n\n  if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n    return [legend(specColumns.color)];\n  }\n}\n},{\"./constants\":\"RaLA\"}],\"qLK0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.BarChartNameSpace = void 0;\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nclass BarChartNameSpace {\n  constructor(nameSpace = '') {\n    ['bucket', 'stacked', '__compartment', '__level'].forEach(name => {\n      this[name] = `${name}${nameSpace}`;\n    });\n  }\n\n}\n\nexports.BarChartNameSpace = BarChartNameSpace;\n},{}],\"l6w1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.barchartH = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nvar _namespace = require(\"../namespace\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst barchartH = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const rootNamespace = new _namespace.BarChartNameSpace();\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks;\n\n  if (specColumns.facet) {\n    const cellNamespace = new _namespace.BarChartNameSpace('Cell');\n    const cellMarks = (0, _marks.default)(context, cellNamespace);\n    const cd = specColumns.y.quantitative ? [(0, _data.stacked)(cellNamespace, _constants.DataNames.FacetGroupCell)] : [(0, _data.bucketed)(context, cellNamespace, _constants.DataNames.FacetGroupCell), (0, _data.stacked)(cellNamespace, cellNamespace.bucket)];\n    marks = (0, _facet.facetMarks)(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n    axes = [];\n  } else {\n    marks = (0, _marks.default)(context, rootNamespace);\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context, rootNamespace),\n    data: (0, _data.default)(context, rootNamespace),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.barchartH = barchartH;\n},{\"./axes\":\"sqcb\",\"./data\":\"fKWJ\",\"./marks\":\"S7Ji\",\"./scales\":\"FGO4\",\"./signals\":\"uQoQ\",\"../facet\":\"kjBE\",\"../constants\":\"RaLA\",\"../legends\":\"y9mm\",\"../namespace\":\"qLK0\"}],\"DCzR\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nvar _constants = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, (0, _axes.columnToAxisType)(specColumns.x), _axes.AxisType.quantitative);\n  const axes = [Object.assign({\n    scale: _constants.ScaleNames.X,\n    title: specColumns.x.name\n  }, pa.bottom), Object.assign({\n    scale: _constants.BarChartScaleNames.levelScale,\n    title: specViewOptions.language.count,\n    encode: {\n      labels: {\n        update: {\n          text: {\n            signal: `${_constants.BarChartSignalNames.compartmentsPerLevelSignal} * datum.value`\n          }\n        }\n      }\n    }\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"jktp\",\"../constants\":\"RaLA\"}],\"rAwV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const stackTransform = {\n    type: 'stack',\n    groupby: [{\n      field: specColumns.x.name\n    }],\n    as: [_constants.FieldNames.BarChartStack0, _constants.FieldNames.BarChartStack1]\n  };\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"../constants\":\"RaLA\"}],\"Hpq1\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, groupBy) {\n  const {\n    specColumns\n  } = context;\n  const bucket_extent = 'bucket_extent';\n  const stackTransform = {\n    type: 'stack',\n    groupby: [_constants.FieldNames.BarChartBin0],\n    as: [_constants.FieldNames.BarChartStack0, _constants.FieldNames.BarChartStack1]\n  };\n\n  if (groupBy) {\n    stackTransform.groupby.push(groupBy.name);\n  }\n\n  if (specColumns.sort) {\n    stackTransform.sort = {\n      field: specColumns.sort.name\n    };\n  }\n\n  const transforms = [{\n    type: 'extent',\n    field: specColumns.x.name,\n    signal: bucket_extent\n  }, {\n    type: 'bin',\n    field: specColumns.x.name,\n    extent: {\n      signal: bucket_extent\n    },\n    maxbins: {\n      signal: _constants.SignalNames.XBins\n    },\n    as: [_constants.FieldNames.BarChartBin0, _constants.FieldNames.BarChartBin1],\n    signal: _constants.BarChartSignalNames.quantitativeBinSignal\n  }, stackTransform, {\n    type: 'extent',\n    signal: _constants.BarChartSignalNames.levelExtentSignal,\n    field: _constants.FieldNames.BarChartStack1\n  }];\n  return transforms;\n}\n},{\"../constants\":\"RaLA\"}],\"llvg\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.bucketed = bucketed;\nexports.stacked = stacked;\n\nvar _transform = _interopRequireDefault(require(\"./transform.qualitative\"));\n\nvar _transform2 = _interopRequireDefault(require(\"./transform.quantitative\"));\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const nestedDataName = specColumns.facet && specColumns.facet.quantitative ? _constants.DataNames.Pre : _constants.DataNames.Main;\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, _constants.DataNames.Main), categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [bucketed(context, namespace, categoricalColor ? _constants.DataNames.Legend : nestedDataName), stacked(namespace, namespace.bucket, specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))], specColumns.x.quantitative && [{\n    name: _constants.DataNames.QuantitativeData,\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.start`\n      },\n      stop: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.stop`\n      },\n      step: {\n        signal: `${_constants.BarChartSignalNames.quantitativeBinSignal}.step`\n      }\n    }]\n  }], specColumns.facet && (0, _facet.facetGroupData)(namespace.stacked));\n  return data;\n}\n\nfunction bucketed(context, namespace, source) {\n  const {\n    specColumns: columns\n  } = context;\n  const data = {\n    name: namespace.bucket,\n    source,\n    transform: columns.x.quantitative ? (0, _transform2.default)(context, columns.facet) : (0, _transform.default)(context)\n  };\n  return data;\n}\n\nfunction stacked(namespace, source, transforms) {\n  const data = {\n    name: namespace.stacked,\n    source,\n    transform: (0, _array.allTruthy)(transforms, xy(namespace))\n  };\n  return data;\n}\n\nfunction xy(namespace) {\n  const transforms = [{\n    type: 'formula',\n    expr: `floor(datum.${_constants.FieldNames.BarChartStack0} / ${_constants.BarChartSignalNames.compartmentsPerLevelSignal})`,\n    as: namespace.__level\n  }, {\n    type: 'formula',\n    expr: `datum.${_constants.FieldNames.BarChartStack0} % ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}`,\n    as: namespace.__compartment\n  }];\n  return transforms;\n}\n},{\"./transform.qualitative\":\"rAwV\",\"./transform.quantitative\":\"Hpq1\",\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../facet\":\"kjBE\",\"../top\":\"z3Hg\"}],\"ue9l\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: namespace.stacked\n    },\n    encode: {\n      update: {\n        x: {\n          scale: _constants.ScaleNames.X,\n          field: specColumns.x.quantitative ? _constants.FieldNames.BarChartBin0 : specColumns.x.name,\n          offset: {\n            scale: _constants.BarChartScaleNames.compartmentScale,\n            field: namespace.__compartment\n          }\n        },\n        width: [{\n          test: `bandwidth('${_constants.BarChartScaleNames.compartmentScale}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.BarChartScaleNames.compartmentScale,\n          band: 1\n        }],\n        y: [{\n          scale: _constants.ScaleNames.Y,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants.SignalNames.YDomain}[0]`\n        }, {\n          scale: _constants.ScaleNames.Y,\n          field: namespace.__level,\n          band: 1,\n          offset: {\n            signal: `-bandwidth('${_constants.ScaleNames.Y}')-1`\n          }\n        }],\n        height: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          test: `bandwidth('${_constants.ScaleNames.Y}') < 1`,\n          value: VegaDeckGl.defaults.minPixelSize\n        }, {\n          scale: _constants.ScaleNames.Y,\n          band: 1\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"../constants\":\"RaLA\",\"../fill\":\"shdv\",\"../selection\":\"rIKp\"}],\"oLAp\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.bucketScale,\n    type: 'band',\n    range: 'width',\n    domain: {\n      data: namespace.bucket,\n      field: specColumns.x.name,\n      sort: true\n    }\n  }, {\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: 0.01,\n    domain: {\n      data: namespace.stacked,\n      field: specColumns.x.name,\n      sort: true\n    }\n  }];\n  return scales;\n}\n},{\"../constants\":\"RaLA\"}],\"Ozot\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default() {\n  const scales = [{\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: 0.01,\n    domain: {\n      data: _constants.DataNames.QuantitativeData,\n      field: 'data',\n      sort: true\n    }\n  }];\n  return scales;\n}\n},{\"../constants\":\"RaLA\"}],\"G9fa\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = _interopRequireDefault(require(\"./scales.qualitative\"));\n\nvar _scales2 = _interopRequireDefault(require(\"./scales.quantitative\"));\n\nvar _constants = require(\"../constants\");\n\nvar _scales3 = require(\"../scales\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, namespace) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.BarChartScaleNames.compartmentScale,\n    type: 'band',\n    range: [0, {\n      signal: _constants.BarChartSignalNames.compartmentWidthSignal\n    }],\n    padding: 0.1,\n    domain: {\n      signal: `sequence(0, ${_constants.BarChartSignalNames.compartmentsPerLevelSignal}+1, 1)`\n    }\n  }, {\n    name: _constants.BarChartScaleNames.levelScale,\n    range: [{\n      signal: 'height'\n    }, {\n      signal: '0'\n    }],\n    round: true,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    },\n    zero: true,\n    nice: true\n  }, {\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    range: [{\n      signal: 'height'\n    }, {\n      signal: '0'\n    }],\n    padding: 0.1,\n    round: false,\n    reverse: false,\n    align: 1,\n    domain: {\n      data: namespace.stacked,\n      field: namespace.__level,\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales3.binnableColorScale)(insight.colorBin, namespace.bucket, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: namespace.bucket,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales3.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales3.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales.concat(specColumns.x.quantitative ? (0, _scales2.default)() : (0, _scales.default)(context, namespace));\n}\n},{\"./scales.qualitative\":\"oLAp\",\"./scales.quantitative\":\"Ozot\",\"../constants\":\"RaLA\",\"../scales\":\"JJH5\"}],\"diHj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants.SignalNames.YDomain,\n    update: `domain('${_constants.ScaleNames.Y}')`\n  }, specColumns.x.quantitative && {\n    name: _constants.SignalNames.XBins,\n    value: 7,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.BarChartSignalNames.compartmentWidthSignal,\n    update: `bandwidth('${specColumns.x.quantitative ? _constants.ScaleNames.X : _constants.BarChartScaleNames.bucketScale}')`\n  }, {\n    name: _constants.BarChartSignalNames.aspectRatioSignal,\n    update: `${_constants.BarChartSignalNames.compartmentWidthSignal}/height`\n  }, {\n    name: _constants.BarChartSignalNames.compartmentsPerLevelSignal,\n    update: `ceil(sqrt(${_constants.BarChartSignalNames.aspectRatioSignal}*${_constants.BarChartSignalNames.levelExtentSignal}[1]))`\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], specColumns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../signals\":\"nj5B\",\"../facet\":\"kjBE\"}],\"Ws7t\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.barchartV = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nvar _namespace = require(\"../namespace\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst barchartV = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const rootNamespace = new _namespace.BarChartNameSpace();\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks;\n\n  if (specColumns.facet) {\n    const cellNamespace = new _namespace.BarChartNameSpace('Cell');\n    const cellMarks = (0, _marks.default)(context, cellNamespace);\n    const cd = specColumns.x.quantitative ? [(0, _data.stacked)(cellNamespace, _constants.DataNames.FacetGroupCell)] : [(0, _data.bucketed)(context, cellNamespace, _constants.DataNames.FacetGroupCell), (0, _data.stacked)(cellNamespace, cellNamespace.bucket)];\n    marks = (0, _facet.facetMarks)(specViewOptions, rootNamespace.stacked, cellMarks, axes, cd);\n    axes = [];\n  } else {\n    marks = (0, _marks.default)(context, rootNamespace);\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context, rootNamespace),\n    data: (0, _data.default)(context, rootNamespace),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.barchartV = barchartV;\n},{\"./axes\":\"DCzR\",\"./data\":\"llvg\",\"./marks\":\"ue9l\",\"./scales\":\"G9fa\",\"./signals\":\"diHj\",\"../facet\":\"kjBE\",\"../constants\":\"RaLA\",\"../legends\":\"y9mm\",\"../namespace\":\"qLK0\"}],\"T62z\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, (0, _axes.columnToAxisType)(specColumns.x), (0, _axes.columnToAxisType)(specColumns.y));\n  const axes = [Object.assign({\n    scale: 'xscale',\n    title: specColumns.x.name,\n    bandPosition: 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.bottom), Object.assign({\n    scale: 'yscale',\n    title: specColumns.y.name,\n    bandPosition: specColumns.y.quantitative ? 0 : 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"jktp\"}],\"oScV\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)(specColumns.x.quantitative && [{\n      type: 'extent',\n      field: specColumns.x.name,\n      signal: 'var_Xextent'\n    }, {\n      type: 'bin',\n      field: specColumns.x.name,\n      extent: {\n        signal: 'var_Xextent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.XBins\n      },\n      as: [_constants.FieldNames.DensityXBin0, _constants.FieldNames.DensityXBin1],\n      signal: 'binXSignal'\n    }], specColumns.y.quantitative && [{\n      type: 'extent',\n      field: specColumns.y.name,\n      signal: 'var_Yextent'\n    }, {\n      type: 'bin',\n      field: specColumns.y.name,\n      extent: {\n        signal: 'var_Yextent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.YBins\n      },\n      as: [_constants.FieldNames.DensityYBin0, _constants.FieldNames.DensityYBin1],\n      signal: 'binYSignal'\n    }])\n  }], specColumns.x.quantitative && [{\n    name: 'xaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binXSignal.start'\n      },\n      stop: {\n        signal: 'binXSignal.stop'\n      },\n      step: {\n        signal: 'binXSignal.step'\n      }\n    }]\n  }], specColumns.y.quantitative && [{\n    name: 'yaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binYSignal.start'\n      },\n      stop: {\n        signal: 'binYSignal.stop'\n      },\n      step: {\n        signal: 'binYSignal.step'\n      }\n    }]\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [{\n    name: 'aggregated',\n    source: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main,\n    transform: [{\n      type: 'joinaggregate',\n      groupby: [specColumns.x.quantitative ? _constants.FieldNames.DensityXBin0 : specColumns.x.name, specColumns.y.quantitative ? _constants.FieldNames.DensityYBin0 : specColumns.y.name],\n      ops: ['count'],\n      as: [_constants.FieldNames.DensityCount]\n    }, windowTransform(specColumns), {\n      type: 'extent',\n      field: _constants.FieldNames.DensityRow,\n      signal: 'cextent'\n    }]\n  }]);\n  return data;\n}\n\nfunction windowTransform(columns) {\n  const t = {\n    type: 'window',\n    groupby: [columns.x.quantitative ? _constants.FieldNames.DensityXBin0 : columns.x.name, columns.y.quantitative ? _constants.FieldNames.DensityYBin0 : columns.y.name],\n    ops: ['row_number'],\n    as: [_constants.FieldNames.DensityRow]\n  };\n\n  if (columns.sort) {\n    t.sort = {\n      field: [columns.sort.name],\n      order: ['descending']\n    };\n  }\n\n  return t;\n}\n},{\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../top\":\"z3Hg\"}],\"H71d\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const mark = {\n    type: 'rect',\n    from: {\n      data: 'aggregated'\n    },\n    sort: {\n      field: [specColumns.x.name, specColumns.y.name],\n      order: ['ascending', 'ascending']\n    },\n    encode: {\n      update: {\n        xc: {\n          scale: 'xscale',\n          field: specColumns.x.quantitative ? _constants.FieldNames.DensityXBin0 : specColumns.x.name,\n          offset: {\n            signal: `scale('sizescale', ((datum.${_constants.FieldNames.DensityRow}-1) % floor(sqrt(datum.${_constants.FieldNames.DensityCount}))))-scale('sizescale', sqrt(datum.${_constants.FieldNames.DensityCount})-2)/2`\n          }\n        },\n        yc: {\n          scale: 'yscale',\n          field: specColumns.y.quantitative ? _constants.FieldNames.DensityYBin0 : specColumns.y.name,\n          offset: {\n            signal: `scale('sizescale',height/width*floor(((datum.${_constants.FieldNames.DensityRow}-1) / floor(sqrt(datum.${_constants.FieldNames.DensityCount}))))) - scale('sizescale', height/width*sqrt(datum.${_constants.FieldNames.DensityCount})+2)/2`\n          }\n        },\n        width: {\n          signal: 'unitsize'\n        },\n        height: {\n          signal: 'height/width*unitsize'\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  };\n\n  if (specColumns.z) {\n    const update = mark.encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return [mark];\n}\n},{\"../constants\":\"RaLA\",\"../fill\":\"shdv\",\"../selection\":\"rIKp\"}],\"ONCq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: 'xscale',\n    type: 'point',\n    domain: specColumns.x.quantitative ? {\n      data: 'xaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.x.name,\n      sort: true\n    },\n    range: 'width',\n    padding: 0.5\n  }, {\n    name: 'yscale',\n    type: 'point',\n    domain: specColumns.y.quantitative ? {\n      data: 'yaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.y.name,\n      sort: true\n    },\n    range: 'height',\n    reverse: true,\n    padding: 0.5\n  }, {\n    name: 'sizescale',\n    type: 'linear',\n    domain: [0, {\n      signal: 'sqrt(cextent[1])'\n    }],\n    range: [0, {\n      signal: 'width/max(xsize,ysize)'\n    }]\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, true) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"JJH5\",\"../constants\":\"RaLA\"}],\"Nzhy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context), {\n    name: 'unitpad',\n    value: 0.1,\n    bind: {\n      name: _constants.SignalNames.InnerPadding,\n      input: 'range',\n      min: 0.1,\n      max: 1.0,\n      step: 0.1\n    }\n  }, {\n    name: 'xsize',\n    update: 'domain(\\'xscale\\').length'\n  }, {\n    name: 'ysize',\n    update: 'domain(\\'yscale\\').length'\n  }, {\n    name: 'cellwidth',\n    update: 'width/max(xsize,ysize)'\n  }, {\n    name: 'maxnumbers',\n    update: 'sqrt(cextent[1])'\n  }, {\n    name: 'unitsize',\n    update: 'cellwidth/((1 + unitpad)*maxnumbers)'\n  }, specColumns.x.quantitative && {\n    name: _constants.SignalNames.XBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, specColumns.y.quantitative && {\n    name: _constants.SignalNames.YBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"FvDz\",\"../signals\":\"nj5B\",\"../facet\":\"kjBE\",\"../constants\":\"RaLA\"}],\"cWr0\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.density = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst density = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks: (0, _marks.default)(context)\n  };\n\n  if (!insight.hideAxes) {\n    vegaSpec.axes = (0, _axes.default)(context);\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.density = density;\n},{\"./axes\":\"T62z\",\"./data\":\"oScV\",\"./marks\":\"H71d\",\"./scales\":\"ONCq\",\"./signals\":\"Nzhy\",\"../facet\":\"kjBE\",\"../legends\":\"y9mm\",\"../constants\":\"RaLA\"}],\"T62r\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)([specColumns.sort && {\n      type: 'collect',\n      sort: {\n        field: specColumns.sort.name\n      }\n    }, {\n      type: 'window',\n      ops: ['count'],\n      as: [_constants.FieldNames.GridIndex]\n    }])\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends));\n  return data;\n}\n},{\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../top\":\"z3Hg\"}],\"kTlq\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Total = exports.RowCount = exports.ColumnCount = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst ColumnCount = 'columncount';\nexports.ColumnCount = ColumnCount;\nconst RowCount = 'rowcount';\nexports.RowCount = RowCount;\nconst Total = 'total';\nexports.Total = Total;\n},{}],\"manj\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, data) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data\n    },\n    encode: {\n      update: {\n        x: {\n          signal: `(datum.${_constants2.FieldNames.GridIndex}-1)%${_constants.ColumnCount}`,\n          scale: _constants2.ScaleNames.X\n        },\n        width: {\n          scale: _constants2.ScaleNames.X,\n          band: true\n        },\n        y: {\n          signal: `floor((datum.${_constants2.FieldNames.GridIndex}-1)/${_constants.ColumnCount})`,\n          scale: _constants2.ScaleNames.Y\n        },\n        height: {\n          scale: _constants2.ScaleNames.Y,\n          band: true\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants2.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return marks;\n}\n},{\"./constants\":\"kTlq\",\"../constants\":\"RaLA\",\"../fill\":\"shdv\",\"../selection\":\"rIKp\"}],\"qOzW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\nvar _constants2 = require(\"./constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: _constants.ScaleNames.X,\n    type: 'band',\n    domain: {\n      signal: `sequence(0, ${_constants2.ColumnCount}, 1)`\n    },\n    range: 'width',\n    paddingInner: 0.1,\n    paddingOuter: 0\n  }, {\n    name: _constants.ScaleNames.Y,\n    type: 'band',\n    domain: {\n      signal: `sequence(0, ${_constants2.RowCount}, 1)`\n    },\n    range: 'height',\n    paddingInner: 0.1,\n    paddingOuter: 0\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"JJH5\",\"../constants\":\"RaLA\",\"./constants\":\"kTlq\"}],\"A70A\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _constants = require(\"./constants\");\n\nvar _constants2 = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), {\n    name: _constants.Total,\n    update: `data('${_constants2.DataNames.Main}').length`\n  }, {\n    name: _constants.ColumnCount,\n    update: `ceil(sqrt((width/height)*${_constants.Total}))`\n  }, {\n    name: _constants.RowCount,\n    update: `${_constants.Total}/${_constants.ColumnCount}`\n  }, (0, _signals.colorReverseSignal)(context)], insight.columns && insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"FvDz\",\"../signals\":\"nj5B\",\"./constants\":\"kTlq\",\"../constants\":\"RaLA\",\"../facet\":\"kjBE\"}],\"cFea\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.grid = void 0;\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst grid = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  const specCapabilities = {\n    roles: [{\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const dataName = categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main;\n  const size = insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    scales: (0, _scales.default)(context),\n    data: (0, _data.default)(context),\n    marks: (0, _marks.default)(context, dataName)\n  };\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  } //use autosize only when not faceting\n\n\n  vegaSpec.autosize = 'fit';\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.grid = grid;\n},{\"./data\":\"T62r\",\"./marks\":\"manj\",\"./scales\":\"qOzW\",\"./signals\":\"A70A\",\"../constants\":\"RaLA\",\"../legends\":\"y9mm\"}],\"XPoy\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nvar _constants = require(\"../constants\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, (0, _axes.columnToAxisType)(specColumns.x), (0, _axes.columnToAxisType)(specColumns.y));\n  const axes = [Object.assign({\n    scale: _constants.ScaleNames.X,\n    title: specColumns.x.name\n  }, pa.bottom), Object.assign({\n    scale: _constants.ScaleNames.Y,\n    title: specColumns.y.name\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"jktp\",\"../constants\":\"RaLA\"}],\"bHRF\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const ScatterDataName = 'SandDanceScatterPlotData';\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, ScatterDataName), [{\n    name: _constants.DataNames.Main,\n    source: ScatterDataName,\n    transform: (0, _array.allTruthy)(filterInvalidWhenNumeric(specColumns.x), filterInvalidWhenNumeric(specColumns.y), filterInvalidWhenNumeric(specColumns.z), specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets))\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), specColumns.facet && (0, _facet.facetGroupData)(_constants.DataNames.Main));\n  return data;\n}\n\nfunction filterInvalidWhenNumeric(column) {\n  if (column && column.quantitative) {\n    const transforms = [{\n      type: 'filter',\n      expr: `datum[${JSON.stringify(column.name)}] != null`\n    }];\n    return transforms;\n  }\n}\n},{\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../facet\":\"kjBE\",\"../top\":\"z3Hg\"}],\"zwx3\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main\n    },\n    encode: {\n      update: {\n        x: {\n          scale: _constants.ScaleNames.X,\n          field: specColumns.x.name,\n          offset: 1\n        },\n        width: {\n          signal: _constants.SignalNames.PointSize\n        },\n        y: [{\n          scale: _constants.ScaleNames.Y,\n          test: (0, _selection.testForCollapseSelection)(),\n          signal: `${_constants.SignalNames.YDomain}[0]`\n        }, {\n          scale: _constants.ScaleNames.Y,\n          field: specColumns.y.name,\n          offset: {\n            signal: `-${_constants.SignalNames.PointSize}`\n          }\n        }],\n        height: [{\n          test: (0, _selection.testForCollapseSelection)(),\n          value: 0\n        }, {\n          signal: _constants.SignalNames.PointSize\n        }],\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n    update.depth = {\n      signal: _constants.SignalNames.PointSize\n    };\n  }\n\n  return marks;\n}\n},{\"../constants\":\"RaLA\",\"../fill\":\"shdv\",\"../selection\":\"rIKp\"}],\"fLst\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [specColumns.x.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.X, _constants.DataNames.Main, specColumns.x.name, 'width', false, false) : (0, _scales.pointScale)(_constants.ScaleNames.X, _constants.DataNames.Main, 'width', specColumns.x.name), specColumns.y.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Y, _constants.DataNames.Main, specColumns.y.name, 'height', false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Y, _constants.DataNames.Main, 'height', specColumns.y.name, true)];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"JJH5\",\"../constants\":\"RaLA\"}],\"iUgv\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [{\n    name: _constants.SignalNames.YDomain,\n    update: `domain('${_constants.ScaleNames.Y}')`\n  }, {\n    name: _constants.SignalNames.PointSize,\n    value: 5,\n    bind: {\n      name: specViewOptions.language.scatterPointSize,\n      debounce: 50,\n      input: 'range',\n      min: 1,\n      max: 25,\n      step: 1\n    }\n  }, (0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context)], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"FvDz\",\"../signals\":\"nj5B\",\"../facet\":\"kjBE\",\"../constants\":\"RaLA\"}],\"oSTE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.scatterplot = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst scatterplot = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact'\n    }, {\n      role: 'y',\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact'\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }],\n    signals: [_constants.SignalNames.PointSize]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  let axes;\n\n  if (!insight.hideAxes) {\n    axes = (0, _axes.default)(context);\n  }\n\n  let marks = (0, _marks.default)(context);\n\n  if (specColumns.facet) {\n    marks = (0, _facet.facetMarks)(specViewOptions, marks[0].from.data, marks, axes);\n    axes = [];\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks\n  };\n\n  if (!insight.hideAxes && axes && axes.length) {\n    vegaSpec.axes = axes;\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.scatterplot = scatterplot;\n},{\"./axes\":\"XPoy\",\"./data\":\"bHRF\",\"./marks\":\"zwx3\",\"./scales\":\"fLst\",\"./signals\":\"iUgv\",\"../facet\":\"kjBE\",\"../legends\":\"y9mm\",\"../constants\":\"RaLA\"}],\"VmQX\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _axes = require(\"../axes\");\n\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const pa = (0, _axes.partialAxes)(specViewOptions, (0, _axes.columnToAxisType)(specColumns.x), (0, _axes.columnToAxisType)(specColumns.y));\n  const axes = [Object.assign({\n    scale: 'xband',\n    title: specColumns.x.name,\n    bandPosition: 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.bottom), Object.assign({\n    scale: 'yband',\n    title: specColumns.y.name,\n    bandPosition: specColumns.y.quantitative ? 0 : 0.5,\n    grid: true,\n    labelFlush: true\n  }, pa.left)];\n  return axes;\n}\n},{\"../axes\":\"jktp\"}],\"GehE\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const data = (0, _array.allTruthy)([{\n    name: _constants.DataNames.Main,\n    transform: (0, _array.allTruthy)([{\n      type: 'extent',\n      field: specColumns.x.name,\n      signal: 'long_extent'\n    }, {\n      type: 'extent',\n      field: specColumns.y.name,\n      signal: 'lat_extent'\n    }, specColumns.x.quantitative && {\n      type: 'bin',\n      field: specColumns.x.name,\n      extent: {\n        signal: 'long_extent'\n      },\n      maxbins: {\n        signal: _constants.SignalNames.XBins\n      },\n      nice: false,\n      as: [_constants.FieldNames.StacksLongBin0, _constants.FieldNames.StacksLongBin1],\n      signal: 'binXSignal'\n    }, specColumns.y.quantitative && {\n      type: 'bin',\n      field: specColumns.y.name,\n      extent: {\n        signal: 'lat_extent'\n      },\n      nice: false,\n      maxbins: {\n        signal: _constants.SignalNames.YBins\n      },\n      as: [_constants.FieldNames.StacksLatBin0, _constants.FieldNames.StacksLatBin1],\n      signal: 'binYSignal'\n    }])\n  }], specColumns.x.quantitative && [{\n    name: 'xaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binXSignal.start'\n      },\n      stop: {\n        signal: 'binXSignal.stop'\n      },\n      step: {\n        signal: 'binXSignal.step'\n      }\n    }]\n  }], specColumns.y.quantitative && [{\n    name: 'yaxisdata',\n    transform: [{\n      type: 'sequence',\n      start: {\n        signal: 'binYSignal.start'\n      },\n      stop: {\n        signal: 'binYSignal.stop'\n      },\n      step: {\n        signal: 'binYSignal.step'\n      }\n    }]\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), [{\n    name: 'stackedgroup',\n    source: categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main,\n    transform: [stackTransform(specColumns.sort, specColumns.x, specColumns.y), {\n      type: 'extent',\n      signal: 'xtent',\n      field: _constants.FieldNames.StacksStart\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.StacksEnd} % columns`,\n      as: '_columns'\n    }, {\n      type: 'formula',\n      expr: `floor(datum.${_constants.FieldNames.StacksStart} / columns)`,\n      as: 'row'\n    }, {\n      type: 'formula',\n      expr: `datum.${_constants.FieldNames.StacksStart} % ${_constants.SignalNames.XGridSize}`,\n      as: 'column'\n    }, {\n      type: 'formula',\n      expr: `floor((datum.${_constants.FieldNames.StacksStart} % columns)/ ${_constants.SignalNames.XGridSize})`,\n      as: 'depth'\n    }, {\n      type: 'extent',\n      signal: 'rowxtent',\n      field: 'row'\n    }]\n  }]);\n  return data;\n}\n\nfunction stackTransform(sortColumn, xColumn, yColumn) {\n  const st = {\n    type: 'stack',\n    groupby: [yColumn.quantitative ? _constants.FieldNames.StacksLatBin0 : yColumn.name, xColumn.quantitative ? _constants.FieldNames.StacksLongBin0 : xColumn.name],\n    as: [_constants.FieldNames.StacksStart, _constants.FieldNames.StacksEnd]\n  };\n\n  if (sortColumn) {\n    st.sort = {\n      field: sortColumn.name\n    };\n  }\n\n  return st;\n}\n},{\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../top\":\"z3Hg\"}],\"i2mG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    name: 'marks2',\n    type: 'rect',\n    from: {\n      data: 'stackedgroup'\n    },\n    encode: {\n      update: {\n        x: {\n          scale: 'xband',\n          field: specColumns.x.quantitative ? _constants.FieldNames.StacksLongBin0 : specColumns.x.name,\n          offset: {\n            scale: 'xinternalscale',\n            field: 'column'\n          }\n        },\n        y: {\n          scale: 'yband',\n          field: specColumns.y.quantitative ? _constants.FieldNames.StacksLatBin0 : specColumns.y.name,\n          offset: {\n            scale: 'yinternalscale',\n            field: 'depth'\n          }\n        },\n        z: {\n          scale: 'zband',\n          field: 'row'\n        },\n        depth: {\n          scale: 'zband',\n          band: true\n        },\n        width: {\n          signal: 'actsize'\n        },\n        height: {\n          signal: 'actsize'\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n  return marks;\n}\n},{\"../constants\":\"RaLA\",\"../fill\":\"shdv\"}],\"RDLe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [{\n    name: 'xband',\n    type: 'band',\n    domain: specColumns.x.quantitative ? {\n      data: 'xaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.x.quantitative ? _constants.FieldNames.StacksLongBin0 : specColumns.x.name,\n      sort: true\n    },\n    range: [0, {\n      signal: 'width'\n    }],\n    padding: {\n      signal: _constants.SignalNames.OuterPadding\n    },\n    round: true\n  }, {\n    name: 'yband',\n    type: 'band',\n    reverse: true,\n    domain: specColumns.y.quantitative ? {\n      data: 'yaxisdata',\n      field: 'data',\n      sort: true\n    } : {\n      data: _constants.DataNames.Main,\n      field: specColumns.y.quantitative ? _constants.FieldNames.StacksLatBin0 : specColumns.y.name,\n      sort: true\n    },\n    range: 'height',\n    padding: {\n      signal: _constants.SignalNames.OuterPadding\n    },\n    round: true\n  }, {\n    name: 'zband',\n    type: 'band',\n    reverse: false,\n    domain: {\n      data: 'stackedgroup',\n      field: 'row',\n      sort: true\n    },\n    align: 0.0,\n    range: [0, {\n      signal: 'countheight'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    round: false\n  }, {\n    name: 'xinternalscale',\n    type: 'band',\n    range: [0, {\n      signal: 'xbandw'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    domain: {\n      data: 'stackedgroup',\n      field: 'column',\n      sort: true\n    }\n  }, {\n    name: 'yinternalscale',\n    type: 'band',\n    range: [0, {\n      signal: 'ybandw'\n    }],\n    padding: {\n      signal: _constants.SignalNames.InnerPadding\n    },\n    domain: {\n      data: 'stackedgroup',\n      field: 'depth',\n      sort: true\n    }\n  }];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  return scales;\n}\n},{\"../scales\":\"JJH5\",\"../constants\":\"RaLA\"}],\"zUw2\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), (0, _signals.colorReverseSignal)(context), {\n    name: _constants.SignalNames.XGridSize,\n    value: 3,\n    bind: {\n      name: specViewOptions.language.XGridSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.YGridSize,\n    value: 3,\n    bind: {\n      name: specViewOptions.language.YGridSize,\n      input: 'range',\n      min: 1,\n      max: 20,\n      step: 1\n    }\n  }, specColumns.x.quantitative && {\n    name: _constants.SignalNames.XBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.XBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, specColumns.y.quantitative && {\n    name: _constants.SignalNames.YBins,\n    value: 30,\n    bind: {\n      name: specViewOptions.language.YBinSize,\n      input: 'range',\n      min: 1,\n      max: 60,\n      step: 1\n    }\n  }, {\n    name: _constants.SignalNames.InnerPadding,\n    value: 0.1,\n    bind: {\n      name: specViewOptions.language.InnerPaddingSize,\n      input: 'range',\n      min: 0.1,\n      max: 0.6,\n      step: 0.1\n    }\n  }, {\n    name: _constants.SignalNames.OuterPadding,\n    value: 0.2,\n    bind: {\n      name: specViewOptions.language.OuterPaddingSize,\n      input: 'range',\n      min: 0.1,\n      max: 0.6,\n      step: 0.1\n    }\n  }, {\n    name: 'columns',\n    update: `${_constants.SignalNames.XGridSize}*${_constants.SignalNames.YGridSize}`\n  }, {\n    name: 'xbandw',\n    update: 'bandwidth(\\'xband\\')'\n  }, {\n    name: 'xbandsize',\n    update: `(xbandw / (${_constants.SignalNames.XGridSize} + ${_constants.SignalNames.InnerPadding}))*(1-${_constants.SignalNames.InnerPadding})`\n  }, {\n    name: 'ybandw',\n    update: `height/((${specColumns.y.quantitative ? _constants.SignalNames.YBins : specColumns.y.stats.distinctValueCount}) * (1 + ${_constants.SignalNames.OuterPadding}))`\n  }, {\n    name: 'ybandsize',\n    update: `(ybandw / (${_constants.SignalNames.YGridSize} + ${_constants.SignalNames.InnerPadding}))*(1-${_constants.SignalNames.InnerPadding})`\n  }, {\n    name: 'actsize',\n    update: 'min(xbandsize,ybandsize)'\n  }, {\n    name: 'countheight',\n    update: `rowxtent[1]*actsize*${_constants.SignalNames.ZProportion}/${_signals.defaultZProportion}`\n  }], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"FvDz\",\"../signals\":\"nj5B\",\"../facet\":\"kjBE\",\"../constants\":\"RaLA\"}],\"uz84\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.stacks = void 0;\n\nvar _axes = _interopRequireDefault(require(\"./axes\"));\n\nvar _data = _interopRequireDefault(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _legends = require(\"../legends\");\n\nvar _constants = require(\"../constants\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst stacks = context => {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const errors = [];\n  if (!specColumns.x) errors.push('Must set a field for x axis');\n  if (!specColumns.y) errors.push('Must set a field for y axis');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'x',\n      binnable: true,\n      axisSelection: specColumns.x && specColumns.x.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.XBins]\n    }, {\n      role: 'y',\n      binnable: true,\n      axisSelection: specColumns.y && specColumns.y.quantitative ? 'range' : 'exact',\n      signals: [_constants.SignalNames.YBins]\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'sort',\n      allowNone: true\n    }]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data: (0, _data.default)(context),\n    scales: (0, _scales.default)(context),\n    marks: (0, _marks.default)(context)\n  };\n\n  if (!insight.hideAxes) {\n    vegaSpec.axes = (0, _axes.default)(context);\n  }\n\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.stacks = stacks;\n},{\"./axes\":\"VmQX\",\"./data\":\"GehE\",\"./marks\":\"i2mG\",\"./scales\":\"RDLe\",\"./signals\":\"zUw2\",\"../facet\":\"kjBE\",\"../legends\":\"y9mm\",\"../constants\":\"RaLA\"}],\"KQnd\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\nexports.treemapTransforms = treemapTransforms;\n\nvar _array = require(\"../../array\");\n\nvar _constants = require(\"../constants\");\n\nvar _facet = require(\"../facet\");\n\nvar _top = require(\"../top\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const TreeMapDataName = 'SandDanceTreeMapData';\n  const data = (0, _array.allTruthy)((0, _facet.facetSourceData)(specColumns.facet, insight.facets, TreeMapDataName), [{\n    name: _constants.DataNames.Main,\n    source: TreeMapDataName,\n    transform: (0, _array.allTruthy)(specColumns.facet && (0, _facet.facetTransforms)(specColumns.facet, insight.facets), !specColumns.facet && treemapTransforms(insight))\n  }], categoricalColor && (0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends), specColumns.facet && (0, _facet.facetGroupData)(_constants.DataNames.Main));\n  return data;\n}\n\nfunction treemapTransforms(insight) {\n  const transforms = [{\n    type: 'nest',\n    keys: [insight.columns.group || '__NONE__']\n  }, {\n    type: 'treemap',\n    field: insight.columns.size,\n    sort: {\n      field: 'value',\n      order: 'descending'\n    },\n    round: true,\n    method: {\n      signal: _constants.SignalNames.TreeMapMethod\n    },\n    padding: 1,\n    size: [{\n      signal: 'width'\n    }, {\n      signal: 'height'\n    }],\n    as: [_constants.FieldNames.TreemapStackX0, _constants.FieldNames.TreemapStackY0, _constants.FieldNames.TreemapStackX1, _constants.FieldNames.TreemapStackY1, _constants.FieldNames.TreemapStackDepth, _constants.FieldNames.TreemapStackChildren]\n  }];\n  return transforms;\n}\n},{\"../../array\":\"FvDz\",\"../constants\":\"RaLA\",\"../facet\":\"kjBE\",\"../top\":\"z3Hg\"}],\"vnKC\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _constants = require(\"../constants\");\n\nvar _fill = require(\"../fill\");\n\nvar _selection = require(\"../selection\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context, data) {\n  const {\n    specColumns\n  } = context;\n  const marks = [{\n    type: 'rect',\n    from: {\n      data\n    },\n    encode: {\n      update: {\n        x: {\n          field: _constants.FieldNames.TreemapStackX0\n        },\n        y: {\n          field: _constants.FieldNames.TreemapStackY0\n        },\n        x2: {\n          field: _constants.FieldNames.TreemapStackX1\n        },\n        y2: {\n          field: _constants.FieldNames.TreemapStackY1\n        },\n        fill: (0, _fill.fill)(context),\n        opacity: (0, _fill.opacity)(context)\n      }\n    }\n  }];\n\n  if (specColumns.z) {\n    const update = marks[0].encode.update;\n    update.z = {\n      value: 0\n    };\n    update.depth = [{\n      test: (0, _selection.testForCollapseSelection)(),\n      value: 0\n    }, {\n      scale: _constants.ScaleNames.Z,\n      field: specColumns.z.name\n    }];\n  }\n\n  return marks;\n}\n},{\"../constants\":\"RaLA\",\"../fill\":\"shdv\",\"../selection\":\"rIKp\"}],\"dhLe\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _scales = require(\"../scales\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    specColumns,\n    insight\n  } = context;\n  const scales = [];\n\n  if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n    if (specColumns.color.quantitative) {\n      scales.push((0, _scales.binnableColorScale)(insight.colorBin, _constants.DataNames.Main, specColumns.color.name, insight.scheme));\n    } else {\n      scales.push({\n        name: _constants.ScaleNames.Color,\n        type: 'ordinal',\n        domain: {\n          data: _constants.DataNames.Legend,\n          field: _constants.FieldNames.Top,\n          sort: true\n        },\n        range: {\n          scheme: insight.scheme || _constants.ColorScaleNone\n        },\n        reverse: {\n          signal: _constants.SignalNames.ColorReverse\n        }\n      });\n    }\n  }\n\n  if (specColumns.z) {\n    const zRange = [0, {\n      signal: _constants.SignalNames.ZHeight\n    }];\n    scales.push(specColumns.z.quantitative ? (0, _scales.linearScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, specColumns.z.name, zRange, false, false) : (0, _scales.pointScale)(_constants.ScaleNames.Z, _constants.DataNames.Main, zRange, specColumns.z.name));\n  }\n\n  return scales;\n}\n},{\"../scales\":\"JJH5\",\"../constants\":\"RaLA\"}],\"P3ir\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = _default;\n\nvar _array = require(\"../../array\");\n\nvar _signals = require(\"../signals\");\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction _default(context) {\n  const {\n    insight,\n    specViewOptions\n  } = context;\n  const signals = (0, _array.allTruthy)((0, _signals.textSignals)(context), [(0, _signals.colorBinCountSignal)(context), {\n    name: _constants.SignalNames.TreeMapMethod,\n    value: 'squarify',\n    bind: {\n      name: specViewOptions.language.treeMapMethod,\n      input: 'select',\n      options: ['squarify', 'binary']\n    }\n  }, (0, _signals.colorReverseSignal)(context)], insight.columns.facet && (0, _facet.facetSignals)(context));\n  return signals;\n}\n},{\"../../array\":\"FvDz\",\"../signals\":\"nj5B\",\"../facet\":\"kjBE\",\"../constants\":\"RaLA\"}],\"WxF8\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.treemap = void 0;\n\nvar _data = _interopRequireWildcard(require(\"./data\"));\n\nvar _marks = _interopRequireDefault(require(\"./marks\"));\n\nvar _scales = _interopRequireDefault(require(\"./scales\"));\n\nvar _signals = _interopRequireDefault(require(\"./signals\"));\n\nvar _facet = require(\"../facet\");\n\nvar _constants = require(\"../constants\");\n\nvar _legends = require(\"../legends\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst treemap = context => {\n  const {\n    specColumns,\n    insight,\n    specViewOptions\n  } = context;\n  const errors = [];\n  if (!specColumns.size) errors.push('Must set a field for size');\n  (0, _facet.checkForFacetErrors)(insight.facets, errors);\n  const specCapabilities = {\n    roles: [{\n      role: 'size',\n      excludeCategoric: true\n    }, {\n      role: 'group',\n      allowNone: true\n    }, {\n      role: 'z',\n      allowNone: true\n    }, {\n      role: 'color',\n      allowNone: true\n    }, {\n      role: 'facet',\n      allowNone: true\n    }],\n    signals: [_constants.SignalNames.TreeMapMethod]\n  };\n\n  if (errors.length) {\n    return {\n      errors,\n      specCapabilities,\n      vegaSpec: null\n    };\n  }\n\n  const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n  const dataName = categoricalColor ? _constants.DataNames.Legend : _constants.DataNames.Main;\n  const TreeMapName = 'SandDanceTreeMapFaceted';\n  const data = (0, _data.default)(context);\n  let marks = (0, _marks.default)(context, specColumns.facet ? TreeMapName : dataName);\n\n  if (specColumns.facet) {\n    const childData = {\n      name: TreeMapName,\n      source: _constants.DataNames.FacetGroupCell,\n      transform: (0, _data.treemapTransforms)(insight)\n    };\n    marks = (0, _facet.facetMarks)(specViewOptions, dataName, marks, null, [childData]);\n    marks[0].marks;\n  }\n\n  const size = specColumns.facet ? (0, _facet.facetSize)(context) : insight.size;\n  var vegaSpec = {\n    $schema: 'https://vega.github.io/schema/vega/v3.json',\n    height: size.height,\n    width: size.width,\n    signals: (0, _signals.default)(context),\n    data,\n    scales: (0, _scales.default)(context),\n    marks\n  };\n  const legends = (0, _legends.getLegends)(context);\n\n  if (legends) {\n    vegaSpec.legends = legends;\n  }\n\n  if (specColumns.facet) {\n    vegaSpec.layout = (0, _facet.layout)(context);\n  } else {\n    //use autosize only when not faceting\n    vegaSpec.autosize = 'fit';\n  }\n\n  return {\n    vegaSpec,\n    specCapabilities\n  };\n};\n\nexports.treemap = treemap;\n},{\"./data\":\"KQnd\",\"./marks\":\"vnKC\",\"./scales\":\"dhLe\",\"./signals\":\"P3ir\",\"../facet\":\"kjBE\",\"../constants\":\"RaLA\",\"../legends\":\"y9mm\"}],\"wNZo\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.create = create;\nexports.constants = exports.creators = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar _barchartH = require(\"./barchartH\");\n\nvar _barchartV = require(\"./barchartV\");\n\nvar _density = require(\"./density\");\n\nvar _grid = require(\"./grid\");\n\nvar _scatterPlot = require(\"./scatterPlot\");\n\nvar _stacks = require(\"./stacks\");\n\nvar _treeMap = require(\"./treeMap\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst creators = {\n  barchart: _barchartV.barchartV,\n  barchartH: _barchartH.barchartH,\n  barchartV: _barchartV.barchartV,\n  density: _density.density,\n  grid: _grid.grid,\n  scatterplot: _scatterPlot.scatterplot,\n  stacks: _stacks.stacks,\n  treemap: _treeMap.treemap\n};\nexports.creators = creators;\n\nfunction create(context) {\n  const {\n    insight\n  } = context;\n  const creator = creators[insight.chart];\n\n  if (creator) {\n    const specResult = creator(context); //TODO: find why Vega is doing this. fixup for facets\n\n    if (specResult.vegaSpec && insight.columns && insight.columns.facet && insight.facets.columns === 2 && insight.facets.rows === 1) {\n      specResult.vegaSpec.width = insight.size.width / 3;\n    }\n\n    return specResult;\n  }\n}\n},{\"./constants\":\"RaLA\",\"./barchartH\":\"l6w1\",\"./barchartV\":\"Ws7t\",\"./density\":\"cWr0\",\"./grid\":\"cFea\",\"./scatterPlot\":\"oSTE\",\"./stacks\":\"uz84\",\"./treeMap\":\"WxF8\"}],\"GBED\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.cloneVegaSpecWithData = cloneVegaSpecWithData;\n\nvar _ = require(\".\");\n\nvar _inference = require(\"./inference\");\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction cloneVegaSpecWithData(context, currData) {\n  const {\n    specColumns\n  } = context;\n  const columns = [specColumns.color, specColumns.facet, specColumns.group, specColumns.size, specColumns.sort, specColumns.x, specColumns.y, specColumns.z];\n  (0, _inference.inferAll)(columns, currData);\n  const specResult = (0, _.create)(context);\n\n  if (!specResult.errors) {\n    const data0 = specResult.vegaSpec.data[0];\n    data0.values = currData;\n  }\n\n  return specResult;\n}\n},{\".\":\"wNZo\",\"./inference\":\"rb48\"}],\"u84D\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Exec = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _group = require(\"./group\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction valueToBoolean(value) {\n  if (typeof value === 'string') {\n    switch (value.toLowerCase()) {\n      case 'true':\n        return true;\n\n      case 'false':\n        return false;\n    }\n  }\n\n  return !!value;\n}\n\nfunction valueToString(value) {\n  if (value == null) {\n    return '';\n  }\n\n  switch (typeof value) {\n    case 'string':\n      return value;\n\n    case 'boolean':\n    case 'number':\n      return value.toString();\n  }\n\n  return '';\n}\n\nfunction isStringOperation(ex) {\n  switch (ex.operator) {\n    case 'contains':\n    case '!contains':\n    case 'starts':\n    case '!starts':\n      return true;\n  }\n\n  return false;\n}\n\nfunction isnullorEmpty(value) {\n  if (value == null) return true; //double equal sign to also catch undefined\n\n  if (typeof value === 'string' && value.length === 0) return true;\n  return false;\n}\n\nclass Exec {\n  constructor(search, columns) {\n    this.columns = columns;\n    this.groups = VegaDeckGl.util.clone((0, _group.ensureSearchExpressionGroupArray)(search));\n    this.groups.forEach(group => {\n      group.expressions.forEach(ex => {\n        ex.column = this.getColumn(ex.name);\n        ex.valueBool = valueToBoolean(ex.value);\n        ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n        ex.stringOperation = isStringOperation(ex);\n      });\n    });\n  }\n\n  getColumn(name) {\n    for (let i = 0; i < this.columns.length; i++) {\n      if (this.columns[i].name == name) {\n        return this.columns[i];\n      }\n    }\n  }\n\n  runExpressionOnColumn(datum, ex) {\n    const actualDataValue = datum[ex.name];\n\n    if (ex.operator === 'isnullorEmpty') {\n      return isnullorEmpty(actualDataValue);\n    } else if (ex.operator === '!isnullorEmpty') {\n      return !isnullorEmpty(actualDataValue);\n    }\n\n    let dataValue = actualDataValue;\n    let expressionValue = ex.value;\n\n    if (ex.column) {\n      if (ex.column.type === 'string' || ex.stringOperation) {\n        dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n        expressionValue = ex.valueLow;\n      } else if (ex.column.type === 'boolean') {\n        dataValue = valueToBoolean(actualDataValue);\n        expressionValue = ex.valueBool;\n      } else if (ex.column.quantitative) {\n        dataValue = +actualDataValue;\n        expressionValue = +ex.value;\n      }\n    }\n\n    switch (ex.operator) {\n      case '!=':\n        return dataValue != expressionValue;\n\n      case '<':\n        return dataValue < expressionValue;\n\n      case '<=':\n        return dataValue <= expressionValue;\n\n      case '==':\n        return dataValue == expressionValue;\n\n      case '>':\n        return dataValue > expressionValue;\n\n      case '>=':\n        return dataValue >= expressionValue;\n\n      case 'contains':\n        return dataValue.indexOf(expressionValue) >= 0;\n\n      case '!contains':\n        return dataValue.indexOf(expressionValue) < 0;\n\n      case 'starts':\n        return dataValue.indexOf(expressionValue) == 0;\n\n      case '!starts':\n        return dataValue.indexOf(expressionValue) !== 0;\n    }\n  }\n\n  runExpression(datum, ex) {\n    if (ex.name == null) {\n      //run on all columns\n      const group = {\n        expressions: this.columns.map((column, i) => {\n          const ex2 = Object.assign(Object.assign({}, ex), {\n            column,\n            name: column.name\n          });\n\n          if (i) {\n            ex2.clause = '||';\n          }\n\n          return ex2;\n        })\n      };\n      return this.runGroup(datum, group);\n    } else {\n      return this.runExpressionOnColumn(datum, ex);\n    }\n  }\n\n  runGroup(datum, group) {\n    let accumulator = this.runExpression(datum, group.expressions[0]);\n\n    for (let i = 1; i < group.expressions.length; i++) {\n      let ex = group.expressions[i];\n\n      switch (ex.clause) {\n        case '&&':\n          accumulator = accumulator && this.runExpression(datum, ex);\n          break;\n\n        case '||':\n          accumulator = accumulator || this.runExpression(datum, ex);\n          break;\n      }\n    }\n\n    return accumulator;\n  }\n\n  run(datum) {\n    let accumulator = this.runGroup(datum, this.groups[0]);\n\n    for (let i = 1; i < this.groups.length; i++) {\n      let group = this.groups[i];\n\n      switch (group.clause) {\n        case '&&':\n          accumulator = accumulator && this.runGroup(datum, group);\n          break;\n\n        case '||':\n          accumulator = accumulator || this.runGroup(datum, group);\n          break;\n      }\n    }\n\n    return accumulator;\n  }\n\n}\n\nexports.Exec = Exec;\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"./group\":\"JGSZ\"}],\"IvTW\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DataScope = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _constants = require(\"./specs/constants\");\n\nvar _exec = require(\"./searchExpression/exec\");\n\nvar _inference = require(\"./specs/inference\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nclass DataScope {\n  constructor() {\n    this.filteredColumnsStats = {};\n  }\n\n  setData(data, columns) {\n    const differentData = this.data !== data;\n\n    if (differentData) {\n      if (this.data) {\n        //clean up things we added to old data\n        this.deselect();\n      }\n\n      this.data = data;\n      this.columns = columns;\n      this.filteredData = null;\n      this.filteredColumnsStats = {};\n    }\n\n    return differentData;\n  }\n\n  setFilteredData(filteredData) {\n    this.filteredData = filteredData;\n    this.filteredColumnsStats = {};\n  }\n\n  getColumns(columnTypes) {\n    if (!this.columns) {\n      this.columns = (0, _inference.getColumnsFromData)(this.data, columnTypes);\n    }\n\n    return this.columns;\n  }\n\n  getFilteredColumnStats(columnName) {\n    if (!this.filteredColumnsStats[columnName]) {\n      this.filteredColumnsStats[columnName] = (0, _inference.getStats)(this.filteredData, this.columns.filter(c => c.name === columnName)[0]);\n    }\n\n    return this.filteredColumnsStats[columnName];\n  }\n\n  currentData() {\n    return this.filteredData || this.data;\n  }\n\n  select(search) {\n    this.deselect();\n\n    if (search) {\n      this.selection = this.createUserSelection(search, true);\n\n      if (this.selection.included.length) {\n        this.activate(this.selection.included[0]);\n      }\n    }\n  }\n\n  createUserSelection(search, assign) {\n    const exec = new _exec.Exec(search, this.getColumns());\n    const s = {\n      search,\n      included: [],\n      excluded: []\n    };\n    this.currentData().forEach(datum => {\n      if (exec.run(datum)) {\n        if (assign) {\n          datum[_constants.FieldNames.Selected] = true;\n        }\n\n        s.included.push(datum);\n      } else {\n        s.excluded.push(datum);\n      }\n    });\n    return s;\n  }\n\n  deselect() {\n    this.deactivate();\n    this.data.forEach(datum => {\n      delete datum[_constants.FieldNames.Selected];\n    });\n    this.selection = null;\n  }\n\n  hasFilteredData() {\n    return !!this.filteredData;\n  }\n\n  hasSelectedData() {\n    return !!this.selection;\n  }\n\n  collapse(collapsed, data = this.data) {\n    data.forEach(datum => {\n      datum[_constants.FieldNames.Collapsed] = collapsed;\n    });\n    this.isCollapsed = collapsed;\n  }\n\n  activate(datum) {\n    this.deactivate();\n    datum[_constants.FieldNames.Active] = true;\n    this.active = datum;\n  }\n\n  deactivate() {\n    if (this.active) {\n      delete this.active[_constants.FieldNames.Active];\n    }\n\n    this.active = null;\n  }\n\n  ordinalIndexWithinSelection(ordinal) {\n    if (this.selection) {\n      for (let i = 0; i < this.selection.included.length; i++) {\n        let datum = this.selection.included[i];\n\n        if (datum[VegaDeckGl.constants.GL_ORDINAL] === ordinal) {\n          return {\n            datum,\n            index: i\n          };\n        }\n      }\n    }\n\n    return {\n      datum: null,\n      index: -1\n    };\n  }\n\n  finalize() {\n    this.data = null;\n    this.filteredData = null;\n    this.filteredColumnsStats = null;\n\n    if (this.selection) {\n      this.selection.excluded = null;\n      this.selection.included = null;\n      this.selection = null;\n    }\n  }\n\n}\n\nexports.DataScope = DataScope;\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"./specs/constants\":\"RaLA\",\"./searchExpression/exec\":\"u84D\",\"./specs/inference\":\"rb48\"}],\"HCXr\":[function(require,module,exports) {\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _xregexp = require('./xregexp');\n\nvar _xregexp2 = _interopRequireDefault(_xregexp);\n\nvar _build = require('./addons/build');\n\nvar _build2 = _interopRequireDefault(_build);\n\nvar _matchrecursive = require('./addons/matchrecursive');\n\nvar _matchrecursive2 = _interopRequireDefault(_matchrecursive);\n\nvar _unicodeBase = require('./addons/unicode-base');\n\nvar _unicodeBase2 = _interopRequireDefault(_unicodeBase);\n\nvar _unicodeBlocks = require('./addons/unicode-blocks');\n\nvar _unicodeBlocks2 = _interopRequireDefault(_unicodeBlocks);\n\nvar _unicodeCategories = require('./addons/unicode-categories');\n\nvar _unicodeCategories2 = _interopRequireDefault(_unicodeCategories);\n\nvar _unicodeProperties = require('./addons/unicode-properties');\n\nvar _unicodeProperties2 = _interopRequireDefault(_unicodeProperties);\n\nvar _unicodeScripts = require('./addons/unicode-scripts');\n\nvar _unicodeScripts2 = _interopRequireDefault(_unicodeScripts);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _build2.default)(_xregexp2.default);\n(0, _matchrecursive2.default)(_xregexp2.default);\n(0, _unicodeBase2.default)(_xregexp2.default);\n(0, _unicodeBlocks2.default)(_xregexp2.default);\n(0, _unicodeCategories2.default)(_xregexp2.default);\n(0, _unicodeProperties2.default)(_xregexp2.default);\n(0, _unicodeScripts2.default)(_xregexp2.default);\n\nexports.default = _xregexp2.default;\nmodule.exports = exports['default'];\n},{\"./xregexp\":\"khpo\",\"./addons/build\":\"gomO\",\"./addons/matchrecursive\":\"Ijgx\",\"./addons/unicode-base\":\"Ax1H\",\"./addons/unicode-blocks\":\"tuuI\",\"./addons/unicode-categories\":\"v78z\",\"./addons/unicode-properties\":\"TAal\",\"./addons/unicode-scripts\":\"GEDh\"}],\"PXQo\":[function(require,module,exports) {\n'use strict';\n\nconst xRegExp = require('xregexp');\n\nmodule.exports = (text, separator) => {\n  if (typeof text !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n\n  separator = typeof separator === 'undefined' ? '_' : separator;\n  const regex1 = xRegExp('([\\\\p{Ll}\\\\d])(\\\\p{Lu})', 'g');\n  const regex2 = xRegExp('(\\\\p{Lu}+)(\\\\p{Lu}[\\\\p{Ll}\\\\d]+)', 'g');\n  return text // TODO: Use this instead of `xregexp` when targeting Node.js 10:\n  // .replace(/([\\p{Lowercase_Letter}\\d])(\\p{Uppercase_Letter})/gu, `$1${separator}$2`)\n  // .replace(/(\\p{Lowercase_Letter}+)(\\p{Uppercase_Letter}[\\p{Lowercase_Letter}\\d]+)/gu, `$1${separator}$2`)\n  .replace(regex1, \"$1\".concat(separator, \"$2\")).replace(regex2, \"$1\".concat(separator, \"$2\")).toLowerCase();\n};\n},{\"xregexp\":\"HCXr\"}],\"Bg2C\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.createElement = createElement;\nexports.mount = mount;\n\nvar _decamelize = _interopRequireWildcard(require(\"decamelize\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n//handle es6 / bundling\nconst decamelize = _decamelize['default'] || _decamelize;\n\nfunction createElement(tag, attrs, ...children) {\n  if (typeof tag === 'function') {\n    const fn = tag;\n    const props = attrs;\n    props.children = children;\n    return fn(props);\n  } else {\n    const el = document.createElement(tag);\n    const map = attrs;\n\n    for (let name in map) {\n      if (name && map.hasOwnProperty(name)) {\n        let value = map[name];\n\n        if (name === 'className' && value !== void 0) {\n          el.setAttribute('class', value.toString());\n        } else if (value === false || value === null || value === undefined) {\n          continue;\n        } else if (value === true) {\n          el.setAttribute(name, name);\n        } else if (typeof value === 'function') {\n          el[name.toLowerCase()] = value;\n        } else if (typeof value === 'object') {\n          el.setAttribute(name, flatten(value));\n        } else {\n          el.setAttribute(name, value.toString());\n        }\n      }\n    }\n\n    if (children && children.length > 0) {\n      appendChildren(el, children);\n    }\n\n    return el;\n  }\n}\n\nfunction flatten(o) {\n  const arr = [];\n\n  for (let prop in o) arr.push(`${decamelize(prop, '-')}:${o[prop]}`);\n\n  return arr.join(';');\n}\n\nfunction addChild(parentElement, child) {\n  if (child === null || child === undefined || typeof child === \"boolean\") {\n    return;\n  } else if (Array.isArray(child)) {\n    appendChildren(parentElement, child);\n  } else if (isElement(child)) {\n    parentElement.appendChild(child);\n  } else {\n    parentElement.appendChild(document.createTextNode(child.toString()));\n  }\n}\n\nfunction appendChildren(parentElement, children) {\n  children.forEach(child => addChild(parentElement, child));\n}\n\nfunction isElement(el) {\n  //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n  return !!el.nodeType;\n}\n\nfunction mount(element, container) {\n  const activeChildPositions = getActiveChildPositions(container);\n  container.innerHTML = '';\n\n  if (element) {\n    addChild(container, element);\n    if (activeChildPositions) focusChildAtPosition(container, activeChildPositions);\n  }\n}\n\nfunction focusChildAtPosition(element, childPositions) {\n  while (element && childPositions.length) element = element.children.item(childPositions.shift());\n\n  if (element) element.focus();\n}\n\nfunction getActiveChildPositions(containerElement) {\n  var active = document.activeElement;\n  var childPositions = [];\n\n  while (active !== document.body && active !== containerElement) {\n    childPositions.unshift(childPosition(active));\n    active = active.parentElement;\n  }\n\n  if (active === containerElement && childPositions.length) return childPositions;\n}\n\nfunction childPosition(element) {\n  let i = 0;\n\n  while (element = element.previousElementSibling) i++;\n\n  return i;\n}\n},{\"decamelize\":\"PXQo\"}],\"zjg6\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Details = void 0;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _util = require(\"./util\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar Action;\n\n(function (Action) {\n  Action[Action[\"deselect\"] = 0] = \"deselect\";\n  Action[Action[\"isolate\"] = 1] = \"isolate\";\n  Action[Action[\"exclude\"] = 2] = \"exclude\";\n  Action[Action[\"reset\"] = 3] = \"reset\";\n  Action[Action[\"next\"] = 4] = \"next\";\n  Action[Action[\"previous\"] = 5] = \"previous\";\n})(Action || (Action = {}));\n\nclass Details {\n  constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n    this.language = language;\n    this.animator = animator;\n    this.dataScope = dataScope;\n    this.colorMapHandler = colorMapHandler;\n    this.hasColorMaps = hasColorMaps;\n    this.element = _vegaDeck.util.addDiv(parentElement, `${_defaults.cssPrefix}unitControls`);\n    this.clear();\n  }\n\n  finalize() {\n    if (this.element) this.element.innerHTML = '';\n    this.dataScope = null;\n    this.element = null;\n  }\n\n  clear() {\n    this.state = {\n      userSelection: null,\n      index: -1,\n      remapColor: false\n    };\n    this.render();\n  }\n\n  clearSelection() {\n    this.state.userSelection = null;\n    this.state.index = -1;\n    this.render();\n  }\n\n  populate(userSelection, index = 0) {\n    this.state.userSelection = userSelection;\n    this.state.index = index;\n    this.render();\n  }\n\n  selectByNameValue(columnName, value) {\n    const search = {\n      name: columnName,\n      operator: '==',\n      value\n    };\n    this.clearSelection();\n    this.animator.select(search);\n    this.populate(this.dataScope.selection);\n  }\n\n  remapChanged(remap) {\n    this.state.remapColor = remap;\n    this.colorMapHandler(remap);\n    this.render();\n  }\n\n  handleAction(action) {\n    let p;\n    const u = this.state.userSelection;\n\n    switch (action) {\n      case Action.deselect:\n        {\n          this.clearSelection();\n          p = this.animator.deselect();\n          break;\n        }\n\n      case Action.exclude:\n        {\n          this.clearSelection();\n          p = this.animator.filter(searchExpression.invert(u.search), u.excluded, u.included);\n          this.state.remapColor = false;\n          break;\n        }\n\n      case Action.isolate:\n        {\n          this.clearSelection();\n          p = this.animator.filter(u.search, u.included, u.excluded);\n          this.state.remapColor = false;\n          break;\n        }\n\n      case Action.reset:\n        {\n          this.clear();\n          p = this.animator.reset();\n          break;\n        }\n\n      default:\n        {\n          switch (action) {\n            case Action.previous:\n              {\n                this.state.index--;\n\n                if (this.state.index < 0) {\n                  this.state.index = this.state.userSelection.included.length - 1;\n                }\n\n                break;\n              }\n\n            case Action.next:\n              {\n                this.state.index++;\n\n                if (this.state.index >= this.state.userSelection.included.length) {\n                  this.state.index = 0;\n                }\n\n                break;\n              }\n          }\n\n          this.render();\n          p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n    }\n\n    p.then(() => this.render());\n  }\n\n  render() {\n    const hasRefinedData = this.dataScope.hasFilteredData();\n    const renderProps = {\n      language: this.language,\n      actionHandler: action => this.handleAction(action),\n      selectionHandler: (columnName, value) => this.selectByNameValue(columnName, value),\n      count: this.state.userSelection && this.state.userSelection.included.length,\n      hasRefinedData,\n      item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n      remapColorHandler: remap => this.remapChanged(remap),\n      hasColorMaps: this.hasColorMaps() && hasRefinedData,\n      remapColor: this.state.remapColor\n    };\n    (0, _tsxCreateElement.mount)(renderDetails(renderProps), this.element);\n  }\n\n}\n\nexports.Details = Details;\n\nconst renderDetails = props => {\n  const controlButtons = [(0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.deselect)\n  }, props.language.deselect), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.isolate)\n  }, props.language.isolate), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.item,\n    onClick: e => props.actionHandler(Action.exclude)\n  }, props.language.exclude)];\n  const colorMapping = (0, _tsxCreateElement.createElement)(\"div\", null, (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: props.remapColor,\n    onClick: e => props.remapColorHandler(true)\n  }, props.language.newColorMap), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.remapColor,\n    onClick: e => props.remapColorHandler(false)\n  }, props.language.oldColorMap));\n  const singleItem = props.count === 1;\n  const scrollButtons = [(0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: singleItem,\n    onClick: e => props.actionHandler(Action.previous)\n  }, props.language.previousDetail), (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: singleItem,\n    onClick: e => props.actionHandler(Action.next)\n  }, props.language.nextDetail), (0, _tsxCreateElement.createElement)(\"span\", null, \" \", props.language.selectionCount(props.count))];\n  const rows = [];\n\n  for (let prop in props.item) {\n    if (prop === _vegaDeck.constants.GL_ORDINAL) {\n      continue;\n    }\n\n    if ((0, _util.isInternalFieldName)(prop)) {\n      continue;\n    }\n\n    rows.push({\n      cells: [{\n        content: prop\n      }, {\n        content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler)\n      }]\n    });\n  }\n\n  return (0, _tsxCreateElement.createElement)(\"div\", null, props.hasColorMaps && colorMapping, (0, _tsxCreateElement.createElement)(\"h4\", null, props.language.headers.selection), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}selection`\n  }, controlButtons, (0, _tsxCreateElement.createElement)(\"button\", {\n    disabled: !props.hasRefinedData,\n    onClick: e => props.actionHandler(Action.reset)\n  }, \"reset\")), props.item && (0, _tsxCreateElement.createElement)(\"h4\", null, props.language.headers.details), (0, _tsxCreateElement.createElement)(\"div\", null, (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}details-scroll`\n  }, props.item && scrollButtons), (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${_defaults.cssPrefix}details`\n  }, props.item && (0, _tsxCreateElement.createElement)(_vegaDeck.controls.Table, {\n    rows: rows\n  }))));\n};\n\nfunction linkSelect(language, columnName, value, selectionHandler) {\n  return (0, _tsxCreateElement.createElement)(\"span\", null, (0, _tsxCreateElement.createElement)(\"a\", {\n    href: \"#\",\n    onClick: e => selectionHandler(columnName, value)\n  }, value), isNaN(value) ? [' ', (0, _tsxCreateElement.createElement)(\"a\", {\n    className: \"bing-search\",\n    href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n    target: \"_blank\"\n  }, language.bing)] : '');\n}\n},{\"./searchExpression\":\"tJXz\",\"@msrvida/vega-deck.gl\":\"vVi8\",\"tsx-create-element\":\"Bg2C\",\"./defaults\":\"e0Uq\",\"./util\":\"Gvq0\"}],\"oPiG\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ensureHeaders = ensureHeaders;\n\nvar _vegaDeck = require(\"@msrvida/vega-deck.gl\");\n\nfunction ensureHeaders(presenter, headers) {\n  const vegaControls = presenter.getElement(_vegaDeck.PresenterElement.vegaControls);\n  conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n  const legend = presenter.getElement(_vegaDeck.PresenterElement.legend);\n  conditionalHeader(!!legend.children.length, legend, headers.legend);\n}\n\nfunction conditionalHeader(condition, element, header) {\n  var existing = existingHeader(element, header);\n\n  if (condition && !existing) {\n    addHeader(element, header);\n  }\n\n  if (!condition && existing) {\n    existing.remove();\n  }\n}\n\nfunction addHeader(element, header) {\n  const h = document.createElement('h4');\n  h.innerHTML = header;\n  element.insertAdjacentElement('beforebegin', h);\n}\n\nfunction existingHeader(element, header) {\n  const {\n    previousElementSibling\n  } = element;\n\n  if (previousElementSibling && previousElementSibling.innerHTML === header) {\n    return previousElementSibling;\n  }\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\"}],\"F5YU\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.finalizeLegend = finalizeLegend;\n\nvar _expression = require(\"./expression\");\n\nvar _constants = require(\"./specs/constants\");\n\nfunction legendRange(colorBinType, column, legend, clickedIndex) {\n  if (column.quantitative) {\n    return selectQuantitative(colorBinType, column, legend, clickedIndex);\n  } else {\n    return selectCategorical(column, legend, clickedIndex);\n  }\n}\n\nfunction selectCategorical(column, legend, clickedIndex) {\n  const value = legend.rows[clickedIndex].value;\n\n  if (value === _constants.Other) {\n    const values = [];\n\n    for (let i in legend.rows) {\n      if (+i !== clickedIndex) {\n        values.push(legend.rows[i].value);\n      }\n    }\n\n    return (0, _expression.selectNone)(column, values);\n  } else {\n    //select equal\n    return {\n      expressions: [(0, _expression.selectExact)(column, legend.rows[clickedIndex].value)]\n    };\n  }\n}\n\nfunction selectQuantitative(colorBinType, column, legend, clickedIndex) {\n  const keys = Object.keys(legend.rows).map(key => +key).sort((a, b) => +a - +b);\n  let lowValue;\n  let lowOperator;\n  let highValue;\n  let highOperator;\n  const rowText = legend.rows[clickedIndex].label;\n\n  switch (colorBinType) {\n    case 'continuous':\n      {\n        lowValue = rowText;\n\n        if (clickedIndex < keys.length - 1) {\n          highValue = legend.rows[clickedIndex + 1].value;\n        }\n\n        break;\n      }\n\n    default:\n      {\n        if (rowText.indexOf('null') > 0) {\n          const ex = {\n            expressions: [(0, _expression.selectNullOrEmpty)(column)]\n          };\n          return ex;\n        }\n\n        const dash = rowText.indexOf('–'); //this is not the common dash character!\n\n        if (dash > 0) {\n          //bug in Vega for quantize?\n          //lowOperator = '>';\n          //highOperator = '<=';\n          lowValue = rowText.substr(0, dash);\n          highValue = rowText.substr(dash + 1);\n        } else {\n          if (rowText.indexOf('<') >= 0) {\n            highValue = rowText.substring(2);\n          } else {\n            if (rowText.indexOf('≥') >= 0) {\n              lowValue = rowText.substring(2);\n            }\n          }\n        }\n      }\n  }\n\n  if (lowValue) lowValue = (0, _expression.notNice)(lowValue);\n  if (highValue) highValue = (0, _expression.notNice)(highValue);\n  return (0, _expression.selectBetween)(column, lowValue, highValue, lowOperator, highOperator);\n}\n\nfunction finalizeLegend(colorBinType, colorColumn, legend, language) {\n  const rowTexts = [];\n\n  for (let i in legend.rows) {\n    let row = legend.rows[i];\n    row.search = legendRange(colorBinType, colorColumn, legend, +i);\n\n    if (row.value === _constants.Other) {\n      row.label = language.legendOther;\n    } else if (rowTexts.indexOf(row.value) >= 0) {\n      delete legend.rows[i];\n    } else {\n      rowTexts.push(row.value);\n    }\n  }\n}\n},{\"./expression\":\"V309\",\"./specs/constants\":\"RaLA\"}],\"gYlQ\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.recolorAxes = recolorAxes;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction cloneAxis(axes, axisColor, axisTextColor) {\n  return axes.map(axis => {\n    const newAxis = VegaDeckGl.util.deepMerge(axis);\n    newAxis.domain.color = axisColor;\n    newAxis.title.color = axisTextColor;\n    newAxis.ticks.forEach(t => {\n      t.color = axisColor;\n    });\n    newAxis.tickText.forEach(t => {\n      t.color = axisTextColor;\n    });\n    return newAxis;\n  });\n}\n\nfunction cloneTextData(textData, color) {\n  return textData.map(t => {\n    return Object.assign(Object.assign({}, t), {\n      color\n    });\n  });\n}\n\nfunction colorEquals(a, b) {\n  if (a.length !== b.length) return false;\n\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return false;\n  }\n\n  return true;\n}\n\nfunction recolorAxes(stage, oldColors, newColors) {\n  const hasNewLineColor = newColors.axisLine && !colorEquals(newColors.axisLine, oldColors.axisLine);\n  const hasNewTextColor = newColors.axisText && !colorEquals(newColors.axisText, oldColors.axisText);\n  let axes;\n  let textData;\n\n  if (hasNewLineColor || hasNewTextColor) {\n    const lineColor = newColors.axisLine || oldColors.axisLine;\n    const textColor = newColors.axisText || oldColors.axisText;\n    axes = {\n      x: cloneAxis(stage.axes.x, lineColor, textColor),\n      y: cloneAxis(stage.axes.y, lineColor, textColor)\n    };\n  }\n\n  if (hasNewTextColor) {\n    textData = cloneTextData(stage.textData, newColors.axisText);\n  }\n\n  return {\n    axes,\n    textData\n  };\n}\n},{\"@msrvida/vega-deck.gl\":\"vVi8\"}],\"RnUx\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Tooltip = void 0;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _util = require(\"./util\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst {\n  GL_ORDINAL\n} = VegaDeckGl.constants;\nconst {\n  outerSize\n} = VegaDeckGl.util;\nconst {\n  Table\n} = VegaDeckGl.controls;\n\nclass Tooltip {\n  constructor(props) {\n    const renderProps = {\n      cssPrefix: props.cssPrefix,\n      rows: getRows(props.item, props.options)\n    };\n    this.element = renderTooltip(renderProps);\n\n    if (this.element) {\n      this.element.style.position = 'absolute';\n      this.child = this.element.firstChild;\n      document.body.appendChild(this.element); //measure and move as necessary\n\n      let m = outerSize(this.child);\n\n      while (m.height > document.documentElement.clientHeight) {\n        let tr = this.child.querySelector('tr:last-child');\n\n        if (tr) {\n          tr.parentElement.removeChild(tr);\n        } else {\n          break;\n        }\n\n        m = outerSize(this.child);\n      }\n\n      if (props.position.clientX + m.width >= document.documentElement.clientWidth) {\n        this.child.style.right = '0';\n      }\n\n      let moveTop = true;\n\n      if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n        if (props.position.clientY - m.height > 0) {\n          this.child.style.bottom = '0';\n        } else {\n          moveTop = false;\n        }\n      }\n\n      if (moveTop) {\n        this.element.style.top = `${props.position.clientY}px`;\n      }\n\n      this.element.style.left = `${props.position.clientX}px`;\n    }\n  }\n\n  finalize() {\n    if (this.element) {\n      document.body.removeChild(this.element);\n    }\n\n    this.element = null;\n  }\n\n}\n\nexports.Tooltip = Tooltip;\n\nfunction getRows(item, options) {\n  const rows = [];\n\n  for (let columnName in item) {\n    if (columnName === GL_ORDINAL) {\n      continue;\n    }\n\n    if ((0, _util.isInternalFieldName)(columnName)) {\n      continue;\n    }\n\n    if (options && options.exclude) {\n      if (options.exclude(columnName)) {\n        continue;\n      }\n    }\n\n    let value = item[columnName];\n    let content;\n\n    if (options && options.displayValue) {\n      content = options.displayValue(value);\n    } else {\n      switch (value) {\n        case null:\n          content = (0, _tsxCreateElement.createElement)(\"i\", null, \"null\");\n          break;\n\n        case undefined:\n          content = (0, _tsxCreateElement.createElement)(\"i\", null, \"undefined\");\n          break;\n\n        default:\n          content = value.toString();\n      }\n    }\n\n    rows.push({\n      cells: [{\n        content: columnName + ':'\n      }, {\n        content\n      }]\n    });\n  }\n\n  return rows;\n}\n\nconst renderTooltip = props => {\n  return props.rows.length === 0 ? null : (0, _tsxCreateElement.createElement)(\"div\", {\n    className: `${props.cssPrefix}tooltip`\n  }, Table({\n    rows: props.rows\n  }));\n};\n},{\"@msrvida/vega-deck.gl\":\"vVi8\",\"tsx-create-element\":\"Bg2C\",\"./util\":\"Gvq0\"}],\"KT1a\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Viewer = void 0;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nvar _animator = require(\"./animator\");\n\nvar _colorCubes = require(\"./colorCubes\");\n\nvar _signals = require(\"./signals\");\n\nvar _ordinal = require(\"./ordinal\");\n\nvar _axisSelection = require(\"./axisSelection\");\n\nvar _clone = require(\"./specs/clone\");\n\nvar _dataScope = require(\"./dataScope\");\n\nvar _defaults = require(\"./defaults\");\n\nvar _details = require(\"./details\");\n\nvar _headers = require(\"./headers\");\n\nvar _legend = require(\"./legend\");\n\nvar _tsxCreateElement = require(\"tsx-create-element\");\n\nvar _axes = require(\"./axes\");\n\nvar _colorSchemes = require(\"./colorSchemes\");\n\nvar _tooltip = require(\"./tooltip\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nvar __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {\n  function adopt(value) {\n    return value instanceof P ? value : new P(function (resolve) {\n      resolve(value);\n    });\n  }\n\n  return new (P || (P = Promise))(function (resolve, reject) {\n    function fulfilled(value) {\n      try {\n        step(generator.next(value));\n      } catch (e) {\n        reject(e);\n      }\n    }\n\n    function rejected(value) {\n      try {\n        step(generator[\"throw\"](value));\n      } catch (e) {\n        reject(e);\n      }\n    }\n\n    function step(result) {\n      result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n    }\n\n    step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}; // Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\n\nconst {\n  defaultView\n} = VegaDeckGl.defaults;\nlet didRegisterColorSchemes = false;\n/**\n * Component to view a SandDance data visualization.\n */\n\nclass Viewer {\n  /**\n   * Instantiate a new Viewer.\n   * @param element Parent HTMLElement to present within.\n   * @param options Optional viewer options object.\n   */\n  constructor(element, options) {\n    this.element = element;\n    this.options = VegaDeckGl.util.deepMerge(_defaults.defaultViewerOptions, options);\n    this.presenter = new VegaDeckGl.Presenter(element, (0, _defaults.getPresenterStyle)(this.options));\n    this._dataScope = new _dataScope.DataScope();\n    this._animator = new _animator.Animator(this._dataScope, {\n      onDataChanged: this.onDataChanged.bind(this),\n      onAnimateDataChange: this.onAnimateDataChange.bind(this)\n    });\n    this._details = new _details.Details(this.presenter.getElement(VegaDeckGl.PresenterElement.panel), this.options.language, this._animator, this._dataScope, remap => {\n      this.currentColorContext = ~~remap;\n      this.renderSameLayout();\n    }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n    this.insight = {};\n    this._signalValues = {};\n  }\n\n  changeColorContexts(colorContexts) {\n    this.colorContexts = colorContexts;\n    this.currentColorContext = 0;\n    this.options.onColorContextChange && this.options.onColorContextChange();\n  }\n\n  applyLegendColorContext(colorContext) {\n    (0, _tsxCreateElement.mount)(colorContext.legendElement, this.presenter.getElement(VegaDeckGl.PresenterElement.legend));\n    this.presenter.stage.legend = colorContext.legend;\n  }\n\n  onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n    return new Promise((resolve, reject) => {\n      let innerPromise;\n\n      if (dataChange === _animator.DataLayoutChange.refine) {\n        const oldColorContext = this.colorContexts[this.currentColorContext];\n        innerPromise = new Promise(innerResolve => {\n          this.renderNewLayout({\n            preStage: (stage, deckProps) => {\n              (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n              this.overrideAxisLabels(stage);\n              (0, _colorCubes.applyColorMapToCubes)([oldColorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n\n              if (this.options.onStage) {\n                this.options.onStage(stage, deckProps);\n              }\n            }\n          }).then(() => {\n            //apply old legend\n            this.applyLegendColorContext(oldColorContext);\n            innerResolve();\n          });\n        });\n      } else {\n        innerPromise = this.renderNewLayout({\n          preStage: (stage, deckProps) => {\n            (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            this.overrideAxisLabels(stage);\n\n            if (this.options.onStage) {\n              this.options.onStage(stage, deckProps);\n            }\n          }\n        });\n      }\n\n      innerPromise.then(() => {\n        this.presenter.animationQueue(resolve, this.options.transitionDurations.position, {\n          waitingLabel,\n          handlerLabel,\n          animationCanceled: reject\n        });\n      });\n    });\n  }\n\n  onDataChanged(dataLayout, filter) {\n    return __awaiter(this, void 0, void 0, function* () {\n      switch (dataLayout) {\n        case _animator.DataLayoutChange.same:\n          {\n            this.renderSameLayout();\n            break;\n          }\n\n        case _animator.DataLayoutChange.refine:\n          {\n            //save cube colors\n            const oldColorContext = this.colorContexts[this.currentColorContext];\n            let colorMap;\n            yield this.renderNewLayout({\n              preStage: (stage, deckProps) => {\n                //save off the spec colors\n                colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n                (0, _colorCubes.applyColorMapToCubes)([oldColorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n                this.preStage(stage, deckProps);\n              },\n              onPresent: () => {\n                //save new legend\n                const newColorContext = {\n                  colorMap,\n                  legend: VegaDeckGl.util.clone(this.presenter.stage.legend),\n                  legendElement: this.presenter.getElement(VegaDeckGl.PresenterElement.legend).children[0]\n                }; //apply old legend\n\n                this.applyLegendColorContext(oldColorContext);\n                this.changeColorContexts([oldColorContext, newColorContext]);\n              }\n            }); //narrow the filter only if it is different\n\n            if (!searchExpression.compare(this.insight.filter, filter)) {\n              this.insight.filter = searchExpression.narrow(this.insight.filter, filter);\n            }\n\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n            }\n\n            break;\n          }\n\n        case _animator.DataLayoutChange.reset:\n          {\n            const colorContext = {\n              colorMap: null,\n              legend: null,\n              legendElement: null\n            };\n            this.changeColorContexts([colorContext]);\n            yield this.renderNewLayout({\n              onPresent: () => {\n                (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n              }\n            });\n            delete this.insight.filter;\n\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(null, null);\n            }\n\n            break;\n          }\n      }\n\n      if (this.options.onSelectionChanged) {\n        const sel = this.getSelection();\n        this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n      }\n    });\n  }\n\n  getSpecColumnsWithFilteredStats() {\n    if (!this._dataScope.hasFilteredData()) {\n      return this._specColumns;\n    }\n\n    const roles = ['color', 'facet', 'group', 'size', 'sort', 'x', 'y', 'z'];\n    const specColumns = Object.assign({}, this._specColumns);\n    roles.forEach(r => {\n      if (specColumns[r]) {\n        const column = Object.assign({}, specColumns[r]);\n        column.stats = this.getColumnStats(column);\n        specColumns[r] = column;\n      }\n    });\n    return specColumns;\n  }\n\n  renderNewLayout(c, view) {\n    return __awaiter(this, void 0, void 0, function* () {\n      const currData = this._dataScope.currentData();\n\n      const context = {\n        specColumns: this.getSpecColumnsWithFilteredStats(),\n        insight: this.insight,\n        specViewOptions: this.options\n      };\n      const specResult = (0, _clone.cloneVegaSpecWithData)(context, currData);\n\n      if (!specResult.errors) {\n        const uiValues = (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n        this._signalValues = Object.assign(Object.assign(Object.assign({}, this._signalValues), uiValues), this.insight.signalValues);\n        (0, _signals.applySignalValues)(this._signalValues, specResult.vegaSpec);\n        this.vegaSpec = specResult.vegaSpec;\n        this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n        this.specCapabilities = specResult.specCapabilities;\n        const config = this.createConfig(c);\n\n        if (view) {\n          config.getView = () => view;\n        }\n\n        if (!didRegisterColorSchemes) {\n          (0, _colorSchemes.registerColorSchemes)(VegaDeckGl.base.vega);\n          didRegisterColorSchemes = true;\n        }\n\n        try {\n          const runtime = VegaDeckGl.base.vega.parse(this.vegaSpec);\n          this.vegaViewGl = new VegaDeckGl.ViewGl(runtime, config).renderer('deck.gl').initialize(this.element);\n          yield this.vegaViewGl.runAsync(); //capture new color color contexts via signals\n\n          this.configForSignalCapture(config.presenterConfig);\n        } catch (e) {\n          specResult.errors = [e.message];\n        }\n\n        if (!specResult.errors) {\n          (0, _headers.ensureHeaders)(this.presenter, this.options.language.headers);\n        }\n      }\n\n      if (specResult.errors) {\n        if (this.options.onError) {\n          this.options.onError(specResult.errors);\n        } else if (this.presenter.logger) {\n          this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n        }\n      }\n\n      return specResult;\n    });\n  }\n  /**\n   * Render the same layout with new options.\n   * @param newViewerOptions New options object.\n   */\n\n\n  renderSameLayout(newViewerOptions) {\n    const colorContext = this.colorContexts[this.currentColorContext];\n    const clonedCubes = this.presenter.getCubeData().map(cube => {\n      return Object.assign({}, cube);\n    });\n    this.applyLegendColorContext(colorContext);\n    let {\n      axes,\n      textData\n    } = this.presenter.stage;\n    let recoloredAxes;\n\n    if (newViewerOptions) {\n      if (newViewerOptions.colors) {\n        recoloredAxes = (0, _axes.recolorAxes)(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n        axes = recoloredAxes.axes || axes;\n        textData = recoloredAxes.textData || textData;\n      }\n\n      this.options = VegaDeckGl.util.deepMerge(this.options, newViewerOptions);\n    }\n\n    let colorMaps = [colorContext.colorMap];\n    let colorMethod;\n\n    const hasSelectedData = this._dataScope.hasSelectedData();\n\n    const hasActive = !!this._dataScope.active;\n\n    if (hasSelectedData || hasActive) {\n      const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n      colorMaps.push(selectedColorMap);\n      colorMethod = this.options.colors.unselectedColorMethod;\n    }\n\n    (0, _colorCubes.applyColorMapToCubes)(colorMaps, clonedCubes, colorMethod);\n    const stage = {\n      cubeData: clonedCubes,\n      axes,\n      textData\n    };\n    this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n  }\n\n  getView(view) {\n    if (view === undefined) {\n      if (this.presenter.view === null) {\n        return defaultView;\n      } else {\n        return this.presenter.view;\n      }\n    } else {\n      return view;\n    }\n  }\n\n  transformData(values, transform) {\n    try {\n      const runtime = VegaDeckGl.base.vega.parse({\n        $schema: 'https://vega.github.io/schema/vega/v4.json',\n        data: [{\n          name: 'source',\n          values,\n          transform\n        }]\n      });\n      new VegaDeckGl.ViewGl(runtime).run();\n    } catch (e) {// continue regardless of error\n    }\n\n    return values;\n  }\n  /**\n   * Render data into a visualization.\n   * @param insight Object to create a visualization specification.\n   * @param data Array of data objects.\n   * @param view Optional View to specify camera type.\n   * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n   */\n\n\n  render(insight, data, options = {}) {\n    return __awaiter(this, void 0, void 0, function* () {\n      let result; //see if refine expression has changed\n\n      if (!searchExpression.compare(insight.filter, this.insight.filter)) {\n        const allowAsyncRenderTime = 100;\n\n        if (insight.filter) {\n          //refining\n          result = yield this._render(insight, data, options);\n          this.presenter.animationQueue(() => {\n            this.filter(insight.filter);\n          }, allowAsyncRenderTime, {\n            waitingLabel: 'layout before refine',\n            handlerLabel: 'refine after layout'\n          });\n        } else {\n          //not refining\n          this._dataScope.setFilteredData(null);\n\n          result = yield this._render(insight, data, options);\n          this.presenter.animationQueue(() => {\n            this.reset();\n          }, allowAsyncRenderTime, {\n            waitingLabel: 'layout before reset',\n            handlerLabel: 'reset after layout'\n          });\n        }\n      } else {\n        result = yield this._render(insight, data, options);\n      }\n\n      return result;\n    });\n  }\n\n  shouldViewstateTransition(newInsight, oldInsight) {\n    if (!oldInsight.columns) return false;\n    if (oldInsight.chart !== newInsight.chart) return true;\n    if (oldInsight.size.height !== newInsight.size.height) return true;\n    if (oldInsight.size.width !== newInsight.size.width) return true;\n    if (oldInsight.columns.facet !== newInsight.columns.facet) return true;\n    return false;\n  }\n\n  configForSignalCapture(presenterConfig) {\n    const colorContext = {\n      colorMap: null,\n      legend: null,\n      legendElement: null\n    }; //now be ready to capture color changing signals \n\n    presenterConfig.preStage = (stage, deckProps) => {\n      if (this._shouldSaveColorContext()) {\n        //save off the colors from Vega layout\n        colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n      }\n\n      this.preStage(stage, deckProps);\n    };\n\n    presenterConfig.onPresent = () => {\n      if (this._shouldSaveColorContext()) {\n        (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n        this.changeColorContexts([colorContext]);\n\n        this._dataScope.deselect();\n      }\n    };\n  }\n\n  _render(insight, data, options) {\n    return __awaiter(this, void 0, void 0, function* () {\n      if (this._tooltip) {\n        this._tooltip.finalize();\n\n        this._tooltip = null;\n      }\n\n      if (this._dataScope.setData(data, options.columns)) {\n        //data is different, reset the signal value cache\n        this._signalValues = {}; //apply transform to the data\n\n        this.transformData(data, insight.transform);\n      }\n\n      this._specColumns = (0, _ordinal.getSpecColumns)(insight, this._dataScope.getColumns(options.columnTypes));\n      const ordinalMap = (0, _ordinal.assignOrdinals)(this._specColumns, data, options.ordinalMap);\n      this.insight = VegaDeckGl.util.clone(insight);\n      this._lastColorOptions = VegaDeckGl.util.clone(this.options.colors);\n\n      this._shouldSaveColorContext = () => !options.initialColorContext;\n\n      const colorContext = options.initialColorContext || {\n        colorMap: null,\n        legend: null,\n        legendElement: null\n      };\n      const specResult = yield this.renderNewLayout({\n        preStage: (stage, deckProps) => {\n          if (this._shouldSaveColorContext()) {\n            //save off the colors from Vega layout\n            colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n          } else {\n            //apply passed colorContext\n            (0, _colorCubes.applyColorMapToCubes)([colorContext.colorMap], VegaDeckGl.util.getCubes(deckProps));\n          } //if items are selected, repaint\n\n\n          const hasSelectedData = !!this._dataScope.hasSelectedData();\n          const hasActive = !!this._dataScope.active;\n\n          if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n            const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n            (0, _colorCubes.applyColorMapToCubes)([colorContext.colorMap, selectedColorMap], stage.cubeData, this.options.colors.unselectedColorMethod);\n          }\n\n          this.preStage(stage, deckProps);\n        },\n        onPresent: () => {\n          if (this._shouldSaveColorContext()) {\n            (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n            this.changeColorContexts([colorContext]);\n          } else {\n            //apply passed colorContext\n            this.applyLegendColorContext(colorContext);\n          }\n        },\n        shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight)\n      }, this.getView(insight.view)); //future signal changes should save the color context\n\n      this._shouldSaveColorContext = () => !options.discardColorContextUpdates || !options.discardColorContextUpdates();\n\n      this._details.render();\n\n      const result = {\n        ordinalMap,\n        specResult\n      };\n      return result;\n    });\n  }\n\n  overrideAxisLabels(stage) {// if (this._specColumns.x && this._specColumns.x.type === 'date') {\n    //     stage.axes.x.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.x)\n    //     ));\n    // }\n    // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n    //     stage.axes.y.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.y)\n    //     ));\n    // }\n  }\n\n  preStage(stage, deckProps) {\n    const onClick = (e, search) => {\n      if (this.options.onAxisClick) {\n        this.options.onAxisClick(e, search);\n      } else {\n        this.select(search);\n      }\n    };\n\n    this.overrideAxisLabels(stage);\n    const polygonLayer = (0, _axisSelection.axisSelectionLayer)(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n    const order = 1; //after textlayer but before others\n\n    deckProps.layers.splice(order, 0, polygonLayer);\n    (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n\n    if (this.options.onStage) {\n      this.options.onStage(stage, deckProps);\n    }\n  }\n\n  onCubeClick(e, cube) {\n    const hasSelectedData = this._dataScope.hasSelectedData();\n\n    if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n      //if active is within selection, keep the selection and activate the one.\n      const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n\n      if (indexWithinSelection.index >= 0) {\n        this.activate(indexWithinSelection.datum);\n\n        this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n\n        if (this.options.onSelectionChanged) {\n          const sel = this.getSelection();\n          this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n        }\n\n        return;\n      }\n    }\n\n    if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][VegaDeckGl.constants.GL_ORDINAL] === cube.ordinal) {\n      this.deselect();\n      return;\n    }\n\n    const search = {\n      name: VegaDeckGl.constants.GL_ORDINAL,\n      operator: '==',\n      value: cube.ordinal\n    };\n    this.select(search);\n  }\n\n  onCubeHover(e, cube) {\n    if (this._tooltip) {\n      this._tooltip.finalize();\n\n      this._tooltip = null;\n    }\n\n    if (!cube) {\n      return;\n    }\n\n    const currentData = this._dataScope.currentData();\n\n    const index = (0, _ordinal.getDataIndexOfCube)(cube, currentData);\n\n    if (index >= 0) {\n      this._tooltip = new _tooltip.Tooltip({\n        options: this.options.tooltipOptions,\n        item: currentData[index],\n        position: e,\n        cssPrefix: this.presenter.style.cssPrefix\n      });\n    }\n  }\n\n  onTextHover(e, t) {\n    //return true if highlight color is different\n    if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor) return false;\n    return !VegaDeckGl.util.colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n  }\n\n  createConfig(c) {\n    const {\n      getTextColor,\n      getTextHighlightColor,\n      onTextClick\n    } = this.options;\n    const defaultPresenterConfig = {\n      getTextColor,\n      getTextHighlightColor,\n      onTextClick,\n      onCubeClick: this.onCubeClick.bind(this),\n      onCubeHover: this.onCubeHover.bind(this),\n      onTextHover: this.onTextHover.bind(this),\n      preStage: this.preStage.bind(this),\n      onPresent: this.options.onPresent,\n      onLayerClick: (info, pickedInfos, e) => {\n        if (!info) {\n          this.deselect();\n        }\n      },\n      onLegendClick: (e, legend, clickedIndex) => {\n        const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n\n        if (legendRow) {\n          if (this.options.onLegendRowClick) {\n            this.options.onLegendRowClick(e, legendRow);\n          } else {\n            this.select(legendRow.search);\n          }\n        } else if (this.options.onLegendHeaderClick) {\n          //header clicked\n          this.options.onLegendHeaderClick(e);\n        }\n      }\n    };\n\n    if (this.options.onBeforeCreateLayers) {\n      defaultPresenterConfig.preLayer = stage => this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n    }\n\n    const config = {\n      presenter: this.presenter,\n      presenterConfig: Object.assign(defaultPresenterConfig, c)\n    };\n\n    if (this.options.transitionDurations) {\n      config.presenterConfig.transitionDurations = this.options.transitionDurations;\n    }\n\n    return config;\n  }\n  /**\n   * Filter the data and animate.\n   * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n   */\n\n\n  filter(search) {\n    const u = this._dataScope.createUserSelection(search, false);\n\n    return new Promise((resolve, reject) => {\n      this._animator.filter(search, u.included, u.excluded).then(() => {\n        this._details.clear();\n\n        this._details.clearSelection();\n\n        this._details.populate(this._dataScope.selection);\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Remove any filtration and animate.\n   */\n\n\n  reset() {\n    return new Promise((resolve, reject) => {\n      this._animator.reset().then(() => {\n        this._details.clear();\n\n        this._details.clearSelection();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Select cubes by a filter expression.\n   * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n   */\n\n\n  select(search) {\n    return new Promise((resolve, reject) => {\n      this._animator.select(search).then(() => {\n        this._details.populate(this._dataScope.selection);\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Removes any selection.\n   */\n\n\n  deselect() {\n    return new Promise((resolve, reject) => {\n      this._animator.deselect().then(() => {\n        this._details.clearSelection();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Gets the current selection.\n   */\n\n\n  getSelection() {\n    if (!this._dataScope) return null;\n    const selectionState = {\n      search: this._dataScope.selection && this._dataScope.selection.search || null,\n      selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n      active: this._dataScope.active\n    };\n    return selectionState;\n  }\n  /**\n   * Set one data row to the active state.\n   */\n\n\n  activate(datum) {\n    return new Promise((resolve, reject) => {\n      this._animator.activate(datum).then(() => {\n        this._details.render();\n\n        resolve();\n      });\n    });\n  }\n  /**\n   * Deactivate item.\n   */\n\n\n  deActivate() {\n    return new Promise((resolve, reject) => {\n      if (this._dataScope && this._dataScope.active) {\n        this._animator.deactivate().then(() => {\n          this._details.render();\n\n          resolve();\n        });\n      } else {\n        resolve();\n      }\n    });\n  }\n  /**\n   * Gets the current insight with signal values.\n   */\n\n\n  getInsight() {\n    const insight = Object.assign({}, this.insight);\n    insight.signalValues = this.getSignalValues();\n    return insight;\n  }\n  /**\n   * Gets column stats from current data (filtered or all).\n   * @param column Column to get stats for.\n   */\n\n\n  getColumnStats(column) {\n    return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n  }\n  /**\n   * Gets current signal values.\n   */\n\n\n  getSignalValues() {\n    return (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n  }\n\n  finalize() {\n    if (this._dataScope) this._dataScope.finalize();\n    if (this._details) this._details.finalize();\n    if (this._tooltip) this._tooltip.finalize();\n    if (this.vegaViewGl) this.vegaViewGl.finalize();\n    if (this.presenter) this.presenter.finalize();\n    if (this.element) this.element.innerHTML = '';\n    this.colorContexts = null;\n    this.element = null;\n    this.options = null;\n    this.presenter = null;\n    this.vegaSpec = null;\n    this.vegaViewGl = null;\n    this._animator = null;\n    this._dataScope = null;\n    this._details = null;\n    this._tooltip = null;\n  }\n\n}\n/**\n * Default Viewer options.\n */\n\n\nexports.Viewer = Viewer;\nViewer.defaultViewerOptions = _defaults.defaultViewerOptions;\n},{\"./searchExpression\":\"tJXz\",\"@msrvida/vega-deck.gl\":\"vVi8\",\"./animator\":\"BvDn\",\"./colorCubes\":\"VHX9\",\"./signals\":\"Ulld\",\"./ordinal\":\"VJo2\",\"./axisSelection\":\"el4c\",\"./specs/clone\":\"GBED\",\"./dataScope\":\"IvTW\",\"./defaults\":\"e0Uq\",\"./details\":\"zjg6\",\"./headers\":\"oPiG\",\"./legend\":\"F5YU\",\"tsx-create-element\":\"Bg2C\",\"./axes\":\"gYlQ\",\"./colorSchemes\":\"lm9d\",\"./tooltip\":\"RnUx\"}],\"y5Yz\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.version = void 0;\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst version = '2.1.0';\nexports.version = version;\n},{}],\"vUvc\":[function(require,module,exports) {\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"colorSchemes\", {\n  enumerable: true,\n  get: function () {\n    return _colorSchemes.colorSchemes;\n  }\n});\nObject.defineProperty(exports, \"Viewer\", {\n  enumerable: true,\n  get: function () {\n    return _viewer.Viewer;\n  }\n});\nObject.defineProperty(exports, \"version\", {\n  enumerable: true,\n  get: function () {\n    return _version.version;\n  }\n});\nexports.VegaDeckGl = exports.util = exports.types = exports.searchExpression = exports.constants = exports.use = void 0;\n\nvar constants = _interopRequireWildcard(require(\"./constants\"));\n\nexports.constants = constants;\n\nvar searchExpression = _interopRequireWildcard(require(\"./searchExpression\"));\n\nexports.searchExpression = searchExpression;\n\nvar types = _interopRequireWildcard(require(\"./types\"));\n\nexports.types = types;\n\nvar util = _interopRequireWildcard(require(\"./util\"));\n\nexports.util = util;\n\nvar VegaDeckGl = _interopRequireWildcard(require(\"@msrvida/vega-deck.gl\"));\n\nexports.VegaDeckGl = VegaDeckGl;\n\nvar _colorSchemes = require(\"./colorSchemes\");\n\nvar _viewer = require(\"./viewer\");\n\nvar _version = require(\"./version\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nconst use = VegaDeckGl.use;\nexports.use = use;\n},{\"./constants\":\"Etci\",\"./searchExpression\":\"tJXz\",\"./types\":\"dUjJ\",\"./util\":\"Gvq0\",\"@msrvida/vega-deck.gl\":\"vVi8\",\"./colorSchemes\":\"lm9d\",\"./viewer\":\"KT1a\",\"./version\":\"y5Yz\"}],\"zKdg\":[function(require,module,exports) {\n\"use strict\";\n\nvar __importStar = this && this.__importStar || function (mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k in mod) {\n    if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n  }\n  result[\"default\"] = mod;\n  return result;\n};\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n}); // Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nvar deck = __importStar(require(\"@deck.gl/core\"));\n\nvar layers = __importStar(require(\"@deck.gl/layers\"));\n\nvar luma = __importStar(require(\"luma.gl\"));\n\nvar vega = __importStar(require(\"vega\"));\n\nvar SandDance = __importStar(require(\"@msrvida/sanddance\"));\n\nvar data = [];\nvar size = 100;\n\nfor (var x = 0; x < size; x++) {\n  for (var y = 0; y < size; y++) {\n    var id = x * y;\n    var z = Math.random() * size * (x % 10) * (y % 10);\n    var w = Math.random() * size;\n    data.push({\n      id: id,\n      x: x,\n      y: y,\n      z: z,\n      w: w\n    });\n  }\n}\n\nSandDance.use(vega, deck, layers, luma);\nvar viewer = new SandDance.Viewer(document.getElementById('vis'));\nvar insight = {\n  columns: {\n    color: 'z',\n    uid: 'id',\n    x: 'x',\n    y: 'y',\n    z: 'z'\n  },\n  scheme: 'blues',\n  size: {\n    height: 500,\n    width: 500\n  },\n  chart: 'scatterplot',\n  view: '3d'\n};\nviewer.render(insight, data);\n},{\"@deck.gl/core\":\"P3tH\",\"@deck.gl/layers\":\"cpXu\",\"luma.gl\":\"iiNl\",\"vega\":\"k1MM\",\"@msrvida/sanddance\":\"vUvc\"}]},{},[\"zKdg\"], null)"
  },
  {
    "path": "docs/tests/v2/es6/sanddance.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/sanddance.css\" />\n</head>\n\n<body>\n    <header>\n        <h1>sanddance test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/sanddance.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/chromaticTextTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-deck.gl chromaticTextTest</title>\n    <link rel=\"stylesheet\" href=\"css/vega-deck.gl.test.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>vega-deck.gl chromaticTextTest</h1>\n    </header>\n    \n    <div id=\"vis\"></div>\n\n    <script src=\"js/chromaticTextTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/css/test.css",
    "content": "body {\n    font-family: 'Segoe UI', sans-serif;\n}\n\n#vis { \n    position: absolute;\n    bottom: 0;\n    top: 5em;\n    left: 1em;\n    right: 0;\n}\n.sanddance-gl { \n    right: 290px;\n}\n.sanddance-panel {\n    width: 250px;\n}\n.vega-bind-name {\n    display: block;\n}"
  },
  {
    "path": "docs/tests/v2/umd/css/transition.css",
    "content": "html,\nbody {\n    font-family: sans-serif;\n    height: 100%;\n}\n\nbody.rows {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-areas: \"header\" \"view\" \"footer\";\n    margin: 0;\n    overflow: scroll;\n}\n\nbody.columns {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-columns: 40% 60%;\n    grid-template-areas: \"header header\" \"left right\" \"footer footer\";\n    margin: 0;\n}\n\nheader {\n    border-bottom: 1px solid silver;\n    grid-area: header;\n    padding: 0 2em;\n}\n\nfooter {\n    border-top: 1px solid silver;\n    grid-area: footer;\n    padding: 0 2em;\n}\n\n#view-type-button {\n    position: absolute;\n    right: 2em;\n    top: 2em;\n}\n\n#view-div, #view-div .vega-deckgl-gl {\n    height: 100%;\n}\n\n#split-left.double {\n    display: grid;\n    grid-template-columns: auto;\n    grid-template-rows: 50% 50%;\n}\n\n#split-left {\n    grid-area: left;\n    overflow: hidden;\n}\n\n.textform {\n    background-color: #ccc;\n    display: grid;\n    grid-template-columns: auto;\n    grid-template-rows: auto 2em;\n    padding: 10px;\n}\n\n#split-left textarea {\n    border: 0;\n    height: 100%;\n    padding: 0 0 0 5px;\n    resize: none;\n    width: 100%;\n}\n\n#split-right,\n#error {\n    grid-area: right;\n}\n\n#error {\n    font-size: larger;\n    padding: 1em;\n}\n\n#split-right .vega-bindings {\n    padding: 1em;\n}\n\n.vega-deckgl-root {\n    display: grid;\n    grid-template-rows: auto 200px;\n    height: 100%;\n}\n\n.vega-deckgl-legend {\n    font-family: sans-serif;\n    position: absolute;\n    right: 1em;\n    top: 1em;\n    z-index: 1;\n}\n"
  },
  {
    "path": "docs/tests/v2/umd/css/vega-deck.gl.test.css",
    "content": ".vega-deckgl-gl {\n    border: 1px solid #ccc;\n    height: 700px;\n}\n"
  },
  {
    "path": "docs/tests/v2/umd/cubeTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-deck.gl cubeTest</title>\n    <link rel=\"stylesheet\" href=\"css/vega-deck.gl.test.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>vega-deck.gl cubeTest</h1>\n    </header>\n\n    <button id=\"animate\">animate</button>\n    \n    <div id=\"vis\"></div>\n\n    <script src=\"js/cubeTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/js/chromaticTextTest.js",
    "content": "var chromaticTextTest;\n(function (chromaticTextTest) {\n    SandDance.use(null, deck, deck, luma);\n    var colors = {\n        red: [255, 0, 0],\n        green: [0, 255, 0],\n        blue: [0, 0, 255],\n        orange: [255, 165, 0],\n        black: [0, 0, 0]\n    };\n    chromaticTextTest.presenter = new SandDance.VegaDeckGl.Presenter(document.querySelector('#vis'));\n    var stage = {\n        view: '2d',\n        cubeData: [],\n        axes: { x: [], y: [] },\n        legend: { rows: {} },\n        gridLines: [],\n        textData: [\n            {\n                color: colors.red,\n                text: 'red',\n                position: [-100, 0, 0],\n                size: 500,\n                textAnchor: 'middle'\n            },\n            {\n                color: colors.green,\n                text: 'green',\n                position: [0, 0, 0],\n                size: 500,\n                textAnchor: 'middle'\n            },\n            {\n                color: colors.blue,\n                text: 'blue',\n                position: [100, 0, 0],\n                size: 500,\n                textAnchor: 'middle'\n            },\n            {\n                color: colors.black,\n                text: 'black',\n                position: [0, 0, -20],\n                size: 500,\n                textAnchor: 'middle'\n            }\n        ]\n    };\n    chromaticTextTest.presenter.present(stage, 0, 0, {\n        getTextHighlightColor: function (t) {\n            switch (t.text) {\n                case 'red':\n                    return colors.green;\n                case 'green':\n                    return colors.red;\n                case 'blue':\n                    return colors.orange;\n            }\n            return colors.black;\n        },\n        onTextClick: function (e, t) {\n            alert(t.text + ' clicked');\n        }\n    });\n    var orbitViewState = {\n        distance: 10,\n        fov: 60,\n        lookAt: [0, 0, 0],\n        rotationOrbit: 0,\n        rotationX: 90,\n        zoom: 0.05\n    };\n    chromaticTextTest.presenter.deckgl.setProps({ viewState: orbitViewState });\n})(chromaticTextTest || (chromaticTextTest = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/js/cubeTest.js",
    "content": "var cubeTest;\n(function (cubeTest) {\n    SandDance.use(null, deck, deck, luma);\n    var colors = {\n        red: [255, 0, 0],\n        green: [0, 255, 0],\n        blue: [0, 0, 255],\n        gray: [128, 128, 128]\n    };\n    cubeTest.presenter = new SandDance.VegaDeckGl.Presenter(document.querySelector('#vis'));\n    var stage = {\n        cubeData: [\n            {\n                color: colors.red,\n                position: [0, 0, 0],\n                size: [100, 100, 100]\n            },\n            {\n                color: colors.green,\n                position: [100, 0, 100],\n                size: [100, 100, 100]\n            },\n            {\n                color: colors.blue,\n                position: [0, 100, 100],\n                size: [100, 100, 100]\n            }\n        ],\n        legend: { rows: {} },\n        axes: {\n            x: [{\n                    domain: {\n                        sourcePosition: [0, 0, 0],\n                        targetPosition: [400, 0, 0],\n                        strokeWidth: 10\n                    },\n                    ticks: [],\n                    tickText: []\n                }],\n            y: [{\n                    domain: {\n                        sourcePosition: [0, 0, 0],\n                        targetPosition: [0, 200, 0],\n                        strokeWidth: 10\n                    },\n                    ticks: [],\n                    tickText: []\n                }]\n        },\n        textData: [],\n        view: '3d'\n    };\n    cubeTest.presenter.present(stage, 200, 400);\n    var orbitViewState = {\n        distance: 10,\n        fov: 60,\n        lookAt: [90, 15, 23, 1],\n        rotationOrbit: -45,\n        rotationX: 67,\n        zoom: 0.01\n    };\n    cubeTest.presenter.deckgl.setProps({ viewState: orbitViewState });\n    document.getElementById('animate').addEventListener('click', function (e) {\n        stage.cubeData = [\n            {\n                color: colors.blue,\n                position: [0, 300, 100],\n                size: [100, 100, 100]\n            },\n            {\n                color: colors.gray,\n                position: [100, 100, 300],\n                size: [10, 10, 10]\n            },\n            {\n                color: colors.red,\n                position: [300, 0, 0],\n                size: [100, 100, 100]\n            },\n            {\n                color: colors.green,\n                position: [100, 300, 100],\n                size: [100, 100, 100]\n            },\n        ];\n        cubeTest.presenter.present(stage, 200, 400);\n    });\n})(cubeTest || (cubeTest = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/js/qualBarChartTest.js",
    "content": "var qualBarChartTest;\n(function (qualBarChartTest) {\n    SandDance.use(vega, deck, deck, luma);\n    qualBarChartTest.viewer = new SandDance.Viewer(document.getElementById('vis'));\n    function getValue(i) {\n        if (i < 20)\n            return 0;\n        if (i < 25)\n            return 1;\n        if (i < 35)\n            return 2;\n        return 3;\n    }\n    var data = [];\n    for (var i = 0; i < 70; i++) {\n        var v = getValue(i);\n        data.push({\n            myUid: i,\n            myX: \"cat\" + v,\n            myY: i,\n            myZ: i,\n            myColor: v.toString(),\n            mySort: i\n        });\n    }\n    var glDiv = qualBarChartTest.viewer.presenter.getElement(SandDance.VegaDeckGl.PresenterElement.gl);\n    var insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ'\n        },\n        scheme: 'category20',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth\n        },\n        chart: 'barchart',\n        view: '2d'\n    };\n    qualBarChartTest.viewer.render(insight, data, { columnTypes: { myColor: 'string' } });\n})(qualBarChartTest || (qualBarChartTest = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/js/quanBarChartTest.js",
    "content": "var quanBarChartTest;\n(function (quanBarChartTest) {\n    SandDance.use(vega, deck, deck, luma);\n    quanBarChartTest.viewer = new SandDance.Viewer(document.getElementById('vis'));\n    function getValue(i) {\n        if (i < 200)\n            return 0;\n        if (i < 250)\n            return 1;\n        if (i < 350)\n            return 2;\n        return 3;\n    }\n    var data = [];\n    for (var i = 0; i < 700; i++) {\n        var v = getValue(i);\n        data.push({\n            myUid: i,\n            myX: v,\n            myY: i,\n            myZ: i,\n            myColor: v,\n            mySort: i\n        });\n    }\n    var glDiv = quanBarChartTest.viewer.presenter.getElement(SandDance.VegaDeckGl.PresenterElement.gl);\n    var insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ'\n        },\n        scheme: 'redblue',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth\n        },\n        chart: 'barchart',\n        view: '2d'\n    };\n    quanBarChartTest.viewer.render(insight, data);\n})(quanBarChartTest || (quanBarChartTest = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/js/scatterplotTest.js",
    "content": "var scatterplotTest;\n(function (scatterplotTest) {\n    SandDance.use(vega, deck, deck, luma);\n    scatterplotTest.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    var glDiv = scatterplotTest.viewer.presenter.getElement(SandDance.VegaDeckGl.PresenterElement.gl);\n    var options = {\n        columns: {\n            color: 'Education',\n            sort: 'TotalPop',\n            uid: 'Id',\n            x: 'Longitude',\n            y: 'Latitude',\n            z: 'Income'\n        },\n        scheme: 'redblue',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth\n        },\n        chart: 'scatterplot'\n    };\n    vega.loader().load('../../sample-data/demovote.tsv').then(function (text) {\n        var data = vega.read(text, { type: 'tsv' });\n        scatterplotTest.viewer.render(options, data);\n    });\n})(scatterplotTest || (scatterplotTest = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/js/test.js",
    "content": "var test;\n(function (test) {\n    var data = [\n        { myUid: 0, myColor: 0, mySort: 0, myX: 0, myY: 0, myZ: 0 },\n        { myUid: 1, myColor: 1, mySort: 1, myX: 1, myY: 1, myZ: 1 },\n        { myUid: 2, myColor: 2, mySort: 2, myX: 2, myY: 2, myZ: 2 }\n    ];\n    var options = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ'\n        },\n        size: {\n            height: 700,\n            width: 700\n        },\n        chart: 'scatterplot'\n    };\n    SandDance.use(vega, deck, deck, luma);\n    test.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    test.viewer.render(options, data);\n})(test || (test = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/js/transition.js",
    "content": "var transition;\n(function (transition) {\n    var view;\n    var lastSpec;\n    var viewType = '3d';\n    SandDance.use(vega, deck, deck, luma);\n    function toggleView() {\n        if (viewType === '3d') {\n            viewType = '2d';\n        }\n        else {\n            viewType = '3d';\n        }\n        update(lastSpec);\n    }\n    transition.toggleView = toggleView;\n    function update(spec) {\n        view = new SandDance.VegaDeckGl.ViewGl(vega.parse(spec), { presenter: view && view.presenter, getView: function () { return viewType; } })\n            .renderer('deck.gl')\n            .initialize(document.querySelector('#split-right'))\n            .run();\n        lastSpec = spec;\n    }\n    transition.update = update;\n    function getText(textId) {\n        var textarea = document.getElementById(textId);\n        var text = textarea.value;\n        var errorDiv = document.getElementById('error');\n        var splitRight = document.getElementById('split-right');\n        try {\n            var spec = JSON.parse(text);\n            splitRight.style.opacity = '1';\n            errorDiv.style.display = 'none';\n            update(spec);\n        }\n        catch (e) {\n            errorDiv.innerText = e;\n            errorDiv.style.display = '';\n            splitRight.style.opacity = '0.1';\n        }\n    }\n    transition.getText = getText;\n    fetch('./specs/scatter3D.json')\n        .then(function (response) { return response.text(); })\n        .then(function (text) {\n        var textarea = document.getElementById('text1');\n        textarea.value = text;\n        getText('text1');\n    });\n    fetch('./specs/titanic.json')\n        .then(function (response) { return response.text(); })\n        .then(function (text) { return document.getElementById('text2').value = text; });\n})(transition || (transition = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/js/treeMapTest.js",
    "content": "var treeMapTest;\n(function (treeMapTest) {\n    SandDance.use(vega, deck, deck, luma);\n    treeMapTest.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    var glDiv = treeMapTest.viewer.presenter.getElement(SandDance.VegaDeckGl.PresenterElement.gl);\n    var options = {\n        columns: {\n            color: 'Class',\n            size: 'TicketCost',\n            uid: 'Name'\n        },\n        scheme: 'category10',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth\n        },\n        chart: 'treemap'\n    };\n    vega.loader().load('../../sample-data/titanicmaster.tsv').then(function (text) {\n        var data = vega.read(text, { type: 'tsv' });\n        treeMapTest.viewer.render(options, data);\n    });\n})(treeMapTest || (treeMapTest = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/js/vega-deck.gl.test.js",
    "content": "var vegaDeckglTest;\n(function (vegaDeckglTest) {\n    SandDance.use(vega, deck, deck, luma);\n    var spec = {\n        \"$schema\": \"https://vega.github.io/schema/vega/v4.json\",\n        \"background\": \"#DEDEDE\",\n        \"width\": 500,\n        \"height\": 200,\n        \"padding\": 5,\n        \"data\": [\n            {\n                \"name\": \"table\",\n                \"values\": [\n                    { \"x\": 0, \"y\": 28, \"c\": 0 }, { \"x\": 0, \"y\": 55, \"c\": 1 },\n                    { \"x\": 1, \"y\": 43, \"c\": 0 }, { \"x\": 1, \"y\": 91, \"c\": 1 },\n                    { \"x\": 2, \"y\": 81, \"c\": 0 }, { \"x\": 2, \"y\": 53, \"c\": 1 },\n                    { \"x\": 3, \"y\": 19, \"c\": 0 }, { \"x\": 3, \"y\": 87, \"c\": 1 },\n                    { \"x\": 4, \"y\": 52, \"c\": 0 }, { \"x\": 4, \"y\": 48, \"c\": 1 },\n                    { \"x\": 5, \"y\": 24, \"c\": 0 }, { \"x\": 5, \"y\": 49, \"c\": 1 },\n                    { \"x\": 6, \"y\": 87, \"c\": 0 }, { \"x\": 6, \"y\": 66, \"c\": 1 },\n                    { \"x\": 7, \"y\": 17, \"c\": 0 }, { \"x\": 7, \"y\": 27, \"c\": 1 },\n                    { \"x\": 8, \"y\": 68, \"c\": 0 }, { \"x\": 8, \"y\": 16, \"c\": 1 },\n                    { \"x\": 9, \"y\": 49, \"c\": 0 }, { \"x\": 9, \"y\": 15, \"c\": 1 }\n                ],\n                \"transform\": [\n                    {\n                        \"type\": \"stack\",\n                        \"groupby\": [\"x\"],\n                        \"sort\": { \"field\": \"c\" },\n                        \"field\": \"y\"\n                    }\n                ]\n            }\n        ],\n        \"scales\": [\n            {\n                \"name\": \"x\",\n                \"type\": \"band\",\n                \"range\": \"width\",\n                \"domain\": { \"data\": \"table\", \"field\": \"x\" }\n            },\n            {\n                \"name\": \"y\",\n                \"type\": \"linear\",\n                \"range\": \"height\",\n                \"nice\": true, \"zero\": true,\n                \"domain\": { \"data\": \"table\", \"field\": \"y1\" }\n            },\n            {\n                \"name\": \"color\",\n                \"type\": \"ordinal\",\n                \"range\": \"category\",\n                \"domain\": { \"data\": \"table\", \"field\": \"c\" }\n            }\n        ],\n        \"axes\": [\n            { \"orient\": \"bottom\", \"scale\": \"x\", \"title\": \"X Axis\", \"tickColor\": \"red\", \"tickWidth\": 3, \"labelColor\": \"blue\", \"titleColor\": \"green\" },\n            { \"orient\": \"left\", \"scale\": \"y\", \"title\": \"Y Axis\", \"domainColor\": \"magenta\", \"domainWidth\": 2, \"tickWidth\": 7 }\n        ],\n        \"marks\": [\n            {\n                \"type\": \"rect\",\n                \"from\": { \"data\": \"table\" },\n                \"encode\": {\n                    \"enter\": {\n                        \"x\": { \"scale\": \"x\", \"field\": \"x\" },\n                        \"width\": { \"scale\": \"x\", \"band\": 1, \"offset\": -1 },\n                        \"y\": { \"scale\": \"y\", \"field\": \"y0\" },\n                        \"y2\": { \"scale\": \"y\", \"field\": \"y1\" },\n                        \"fill\": { \"scale\": \"color\", \"field\": \"c\" }\n                    },\n                    \"update\": {\n                        \"fillOpacity\": { \"value\": 1 }\n                    },\n                    \"hover\": {\n                        \"fillOpacity\": { \"value\": 0.5 }\n                    }\n                }\n            }\n        ],\n        \"legends\": [\n            {\n                \"fill\": \"color\",\n                \"title\": \"Legend\",\n                \"encode\": {\n                    \"symbols\": {\n                        \"update\": {\n                            \"shape\": { \"value\": \"square\" }\n                        }\n                    }\n                }\n            }\n        ]\n    };\n    var view = new SandDance.VegaDeckGl.ViewGl(vega.parse(spec), { getView: function () { return '2d'; } })\n        .renderer('deck.gl')\n        .initialize(document.querySelector('#vis'))\n        .run();\n})(vegaDeckglTest || (vegaDeckglTest = {}));\n"
  },
  {
    "path": "docs/tests/v2/umd/qualBarChartTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance qualBarChartTest</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v2/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.9/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance qualBarChartTest</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/qualBarChartTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/quanBarChartTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance quanBarChartTest</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v2/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.9/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance quanBarChartTest</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/quanBarChartTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/scatterplotTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance scatterplot test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v2/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.9/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance scatterplot test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/scatterplotTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/specs/scatter3D.json",
    "content": "{\n    \"$schema\": \"https://vega.github.io/schema/vega/v3.json\",\n    \"width\": 700,\n    \"height\": 700,\n    \"padding\": 5,\n    \"signals\": [\n        {\n            \"name\": \"depth\",\n            \"value\": 700\n        },\n        {\n            \"name\": \"xaxis\",\n            \"value\": \"Longitude\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"yaxis\",\n            \"value\": \"Latitude\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"zaxis\",\n            \"value\": \"Obama\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"colorBy\",\n            \"value\": \"Income\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"size\",\n            \"value\": \"MedAge\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"reverseColor\",\n            \"value\": false,\n            \"bind\": {\n                \"input\": \"checkbox\"\n            }\n        }\n    ],\n    \"projections\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"albersUsa\"\n        }\n    ],\n    \"data\": [\n        {\n            \"name\": \"source\",\n            \"format\": {\n                \"type\": \"tsv\",\n                \"parse\": \"auto\"\n            },\n            \"url\": \"../../sample-data/demovote.tsv\",\n            \"transform\": [\n                {\n                    \"type\": \"geopoint\",\n                    \"projection\": \"projection\",\n                    \"fields\": [\n                        \"Longitude\",\n                        \"Latitude\"\n                    ],\n                    \"as\": [\n                        \"ProjLongitude\",\n                        \"ProjLatitude\"\n                    ]\n                }\n            ]\n        }\n    ],\n    \"scales\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"xaxis\"\n                }\n            },\n            \"range\": \"width\"\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"yaxis\"\n                }\n            },\n            \"range\": \"height\"\n        },\n        {\n            \"name\": \"z\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"zaxis\"\n                }\n            },\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"depth\"\n                }\n            ]\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": false,\n            \"zero\": true,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"size\"\n                }\n            },\n            \"range\": [\n                5,\n                30\n            ]\n        },\n        {\n            \"name\": \"mycolorscale\",\n            \"type\": \"sequential\",\n            \"interpolate\": \"rgb\",\n            \"reverse\": {\n                \"signal\": \"reverseColor\"\n            },\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"colorBy\"\n                }\n            },\n            \"range\": [\n                \"#0000ff\",\n                \"#00ff00\",\n                \"#ff0000\"\n            ]\n        }\n    ],\n    \"axes\": [\n        {\n            \"scale\": \"x\",\n            \"grid\": true,\n            \"domain\": false,\n            \"orient\": \"bottom\",\n            \"tickCount\": 5,\n            \"title\": {\n                \"signal\": \"xaxis\"\n            }\n        },\n        {\n            \"scale\": \"y\",\n            \"grid\": true,\n            \"domain\": false,\n            \"orient\": \"left\",\n            \"titlePadding\": 5,\n            \"title\": {\n                \"signal\": \"yaxis\"\n            }\n        }\n    ],\n    \"marks\": [\n        {\n            \"name\": \"marks2\",\n            \"type\": \"rect\",\n            \"from\": {\n                \"data\": \"source\"\n            },\n            \"encode\": {\n                \"update\": {\n                    \"x\": {\n                        \"scale\": \"x\",\n                        \"field\": {\n                            \"signal\": \"xaxis\"\n                        }\n                    },\n                    \"y\": {\n                        \"scale\": \"y\",\n                        \"field\": {\n                            \"signal\": \"yaxis\"\n                        }\n                    },\n                    \"z\": {\n                        \"scale\": \"z\",\n                        \"field\": {\n                            \"signal\": \"zaxis\"\n                        }\n                    },\n                    \"depth\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"width\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"height\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"opacity\": {\n                        \"value\": 0.6\n                    },\n                    \"fill\": {\n                        \"scale\": \"mycolorscale\",\n                        \"field\": {\n                            \"signal\": \"colorBy\"\n                        }\n                    },\n                    \"stroke\": {\n                        \"scale\": \"mycolorscale\",\n                        \"field\": {\n                            \"signal\": \"colorBy\"\n                        }\n                    }\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "docs/tests/v2/umd/specs/titanic.json",
    "content": "{\n    \"$schema\": \"https://vega.github.io/schema/vega/v3.json\",\n    \"height\": 500,\n    \"padding\": 5,\n    \"signals\": [\n        {\n            \"name\": \"columns\",\n            \"value\": 17,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 10,\n                \"max\": 35,\n                \"step\": 1\n            }\n        },\n        {\n            \"name\": \"bins\",\n            \"value\": 7,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 2,\n                \"max\": 20,\n                \"step\": 1\n            }\n        },\n        {\n            \"name\": \"x_step\",\n            \"value\": 200,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 60,\n                \"max\": 200,\n                \"step\": 20\n            }\n        },\n        {\n            \"name\": \"x_padding\",\n            \"value\": 0.2\n        },\n        {\n            \"name\": \"width\",\n            \"update\": \"bandspace(domain('xscale2').length, x_padding, x_padding) * x_step\"\n        },\n        {\n            \"name\": \"height\",\n            \"update\": \"(rowxtent[1])*(bandwidth('xscale')+2*x_padding)\"\n        },\n        {\n            \"name\": \"newheight2\",\n            \"update\": \"(rowxtent[1]-1)*(bandwidth('xscale')+2*x_padding)\"\n        },\n        {\n            \"name\": \"variable\",\n            \"value\": \"Age\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"Age\",\n                    \"TicketCost\"\n                ]\n            }\n        }\n    ],\n    \"data\": [\n        {\n            \"name\": \"points\",\n            \"format\": {\n                \"type\": \"tsv\",\n                \"parse\": \"auto\"\n            },\n            \"url\": \"../../sample-data/titanicmaster.tsv\"\n        },\n        {\n            \"name\": \"nested\",\n            \"source\": \"points\",\n            \"transform\": [\n                {\n                    \"type\": \"extent\",\n                    \"field\": {\n                        \"signal\": \"variable\"\n                    },\n                    \"signal\": \"age_extent\"\n                },\n                {\n                    \"type\": \"bin\",\n                    \"field\": {\n                        \"signal\": \"variable\"\n                    },\n                    \"extent\": {\n                        \"signal\": \"age_extent\"\n                    },\n                    \"maxbins\": {\n                        \"signal\": \"bins\"\n                    },\n                    \"as\": [\n                        \"age0\",\n                        \"age1\"\n                    ]\n                },\n                {\n                    \"type\": \"stack\",\n                    \"groupby\": [\n                        \"age0\"\n                    ],\n                    \"sort\": {\n                        \"field\": {\n                            \"signal\": \"variable\"\n                        }\n                    }\n                },\n                {\n                    \"type\": \"formula\",\n                    \"expr\": \"floor(datum.y0 / columns)\",\n                    \"as\": \"row\"\n                },\n                {\n                    \"type\": \"extent\",\n                    \"signal\": \"xtent\",\n                    \"field\": \"y1\"\n                },\n                {\n                    \"type\": \"extent\",\n                    \"signal\": \"rowxtent\",\n                    \"field\": \"row\"\n                },\n                {\n                    \"type\": \"formula\",\n                    \"expr\": \"datum.y0 % columns\",\n                    \"as\": \"column\"\n                }\n            ]\n        }\n    ],\n    \"scales\": [\n        {\n            \"name\": \"xscale\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"x_step * (1-x_padding)\"\n                }\n            ],\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"column\",\n                \"sort\": true\n            }\n        },\n        {\n            \"name\": \"yscale\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"newheight2\"\n                }\n            ],\n            \"round\": true,\n            \"reverse\": true,\n            \"align\": 1,\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"row\",\n                \"sort\": true\n            },\n            \"zero\": true,\n            \"nice\": true\n        },\n        {\n            \"name\": \"yscalea\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"height\"\n                }\n            ],\n            \"round\": true,\n            \"reverse\": true,\n            \"align\": 1,\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"row\",\n                \"sort\": true\n            },\n            \"zero\": true,\n            \"nice\": true\n        },\n        {\n            \"name\": \"xscale2\",\n            \"type\": \"band\",\n            \"range\": {\n                \"step\": {\n                    \"signal\": \"x_step\"\n                }\n            },\n            \"padding\": {\n                \"signal\": \"x_padding\"\n            },\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"age0\",\n                \"sort\": true\n            }\n        },\n        {\n            \"name\": \"mycolor\",\n            \"type\": \"linear\",\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": {\n                    \"signal\": \"variable\"\n                }\n            },\n            \"range\": {\n                \"scheme\": \"redyellowgreen\"\n            }\n        }\n    ],\n    \"axes\": [\n        {\n            \"orient\": \"bottom\",\n            \"scale\": \"xscale2\",\n            \"zindex\": 1\n        },\n        {\n            \"orient\": \"left\",\n            \"scale\": \"yscalea\",\n            \"zindex\": 1,\n            \"title\": \"People\",\n            \"encode\": {\n                \"ticks\": {\n                    \"update\": {\n                        \"stroke\": {\n                            \"value\": \"steelblue\"\n                        }\n                    }\n                },\n                \"labels\": {\n                    \"interactive\": true,\n                    \"update\": {\n                        \"text\": {\n                            \"signal\": \"columns * datum.value\"\n                        }\n                    }\n                }\n            }\n        }\n    ],\n    \"marks\": [\n        {\n            \"type\": \"rect\",\n            \"from\": {\n                \"data\": \"nested\"\n            },\n            \"encode\": {\n                \"update\": {\n                    \"x\": {\n                        \"scale\": \"xscale2\",\n                        \"field\": \"age0\",\n                        \"offset\": {\n                            \"scale\": \"xscale\",\n                            \"field\": \"column\"\n                        }\n                    },\n                    \"width\": {\n                        \"scale\": \"xscale\",\n                        \"band\": true\n                    },\n                    \"y\": {\n                        \"scale\": \"yscale\",\n                        \"field\": \"row\",\n                        \"band\": true\n                    },\n                    \"z\": {\n                        \"field\": \"TicketCost\"\n                    },\n                    \"depth\": {\n                        \"value\": 10\n                    },\n                    \"id\": {\n                        \"field\": \"Id\"\n                    },\n                    \"height\": {\n                        \"scale\": \"xscale\",\n                        \"band\": true\n                    },\n                    \"fill\": {\n                        \"scale\": \"mycolor\",\n                        \"field\": {\n                            \"signal\": \"variable\"\n                        }\n                    },\n                    \"stroke\": {\n                        \"value\": \"white\"\n                    }\n                },\n                \"hover\": {\n                    \"fill\": {\n                        \"value\": \"firebrick\"\n                    }\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "docs/tests/v2/umd/test.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v2/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.9/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/test.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/transition.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>vega-deck.gl transition</title>\n    <link rel=\"stylesheet\" href=\"css/transition.css\">\n</head>\n\n<body class=\"columns\">\n    <script src=\"https://unpkg.com/vega@^5.9/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n\n    <header>\n        <h1>vega-deck.gl transition editor</h1>\n        <button id=\"view-type-button\" onclick=\"transition.toggleView()\">2D / 3D</button>\n    </header>\n    <div id=\"split-left\" class=\"double\">\n        <div class=\"textform\">\n            <textarea id=\"text1\"></textarea>\n            <button onclick=\"transition.getText('text1')\">Apply this spec</button>\n        </div>\n        <div class=\"textform\">\n            <textarea id=\"text2\"></textarea>\n            <button onclick=\"transition.getText('text2')\">Apply this spec</button>\n        </div>\n    </div>\n    <div id=\"split-right\">\n    </div>\n    <div id=\"error\"></div>\n    <footer>\n    </footer>\n\n    <script src=\"js/transition.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/treeMapTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance scatterplot test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v2/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.9/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance treemap test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/treeMapTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v2/umd/vega-deck.gl.test.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-deck.gl test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/vega-deck.gl.test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.9/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~6.4/deckgl.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v2/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>vega-deck.gl test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/vega-deck.gl.test.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/es6/app.html",
    "content": "---\n---\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/sanddance-app.css\">\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/sanddance-app-site.css\">\n    <link rel=\"shortcut icon\" href=\"../../../favicon.ico\" />\n</head>\n\n<body>\n    <!-- link to JSON files so we can get a url from the bundler -->\n    <a class=\"sanddance-app-static-content\" id=\"demovote\" data-display-name=\"Demo Vote\" data-type=\"tsv\"\n        href=\"../../../sample-data/demovote.tsv\"></a>\n    <a class=\"sanddance-app-static-content\" id=\"titanic\" data-display-name=\"Titanic\" data-type=\"tsv\"\n        href=\"../../../sample-data/titanicmaster.tsv\"></a>\n\n    <script>\n        function setTheme(darkTheme) {\n            localStorage.setItem('theme', darkTheme ? 'Dark' : 'Light');\n        }\n        var darkTheme = localStorage.getItem('theme') === 'Dark';\n        var insights = {\n            \"titanic\": {\n                \"columns\": {\n                    \"uid\": \"Name\",\n                    \"x\": \"Gender\",\n                    \"y\": \"Joined\",\n                    \"color\": \"Survived\",\n                    \"z\": \"TicketCost\",\n                    \"sort\": \"Survived\"\n                },\n                \"scheme\": \"dual_redgreen\",\n                \"chart\": \"barchart\",\n                \"view\": \"2d\"\n            },\n            \"demovote\": {\n                \"columns\": {\n                    \"uid\": \"Id\",\n                    \"x\": \"Longitude\",\n                    \"y\": \"Latitude\",\n                    \"color\": \"Obama\",\n                    \"z\": \"Education\",\n                    \"sort\": \"State\"\n                },\n                \"scheme\": \"redblue\",\n                \"chart\": \"scatterplot\",\n                \"view\": \"2d\",\n                \"colorBin\": \"quantize\"\n            }\n        };\n        var options = {\n            \"*\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleColor_BinCountSignal\": 7\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            \"titanic\": {\n                \"chartPrefs\": {\n                    \"barchart\": {\n                        \"color\": {\n                            \"Gender\": {\n                                \"scheme\": \"set2\"\n                            }\n                        }\n                    }\n                }\n            },\n            \"demovote\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"color\": {\n                            \"Winner\": {\n                                \"scheme\": \"dual_bluered\"\n                            }\n                        }\n                    },\n                    \"stacks\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleX_BinsSignal\": 30,\n                                    \"RoleY_BinsSignal\": 30\n                                }\n                            }\n                        }\n                    }\n                },\n                \"tooltipExclusions\": [\"Id\", \"Latitude\", \"Longitude\"]\n            }\n        };\n    </script>\n\n    <main id=\"app\"></main>\n\n    <footer>\n        {% include footer-links.html %}\n    </footer>\n\n    <script src=\"../../../external/js/react.development.js\" crossorigin=\"\"></script>\n    <script src=\"../../../external/js/react-dom.development.js\" crossorigin=\"\"></script>\n    <script src=\"js/sanddance-app.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/es6/css/sanddance-app-site.css",
    "content": "html,\nbody {\n    height: 100%;\n    margin: 0;\n}\n\nbody {\n    display: grid;\n    font-family: 'Segoe UI', sans-serif;\n    grid-template-rows: auto 0fr;\n}\nselect,\nbutton,\ninput {\n    font-family: 'Segoe UI', sans-serif;\n}\n\nfooter {\n    border-top: 1px solid #ccc;\n    font-size: smaller;\n    padding: 6px 1em;\n}\n"
  },
  {
    "path": "docs/tests/v3/es6/css/sanddance-app.css",
    "content": ".sanddance-app-static-content {\n  display: none;\n}\n\n.sanddance-app {\n  display: grid;\n  grid-template-rows: 100% 0;\n  height: 100%;\n}\n\n.sanddance-export .ms-Button {\n  margin-bottom: 1em;\n  margin-top: 0.5em;\n}\n\n.sanddance-datasource-picker {\n  width: 100%;\n}\n\n.sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%;\n}\n\n.sanddance-gl {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%);\n}\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em;\n}\n\n.sanddance-legend table {\n  border-collapse: collapse;\n}\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em;\n}\n\n.sanddance-legend .legend-row {\n  cursor: pointer;\n}\n\n.sanddance-legend .legend-row td {\n  padding: 2px;\n}\n\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef;\n}\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px;\n}\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n.sanddance-details {\n  font-size: smaller;\n}\n\n.sanddance-details-scroll {\n  padding-bottom: 1em;\n}\n\n.sanddance-tooltip {\n  z-index: 1;\n}\n\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute;\n}\n\n.sanddance-tooltip td {\n  max-width: 16em;\n  overflow: hidden;\n  text-align: left;\n  text-overflow: ellipsis;\n  vertical-align: top;\n  width: 75%;\n}\n\n.sanddance-tooltip td:first-child {\n  width: 25%;\n}\n\n/*# sourceMappingURL=sanddance.css.map */\n/*# sourceMappingURL=sanddance-react.css.map */\n.sanddance-scheme.disabled {\n  filter: grayscale(95%);\n}\n\n.sanddance-scheme.option {\n  display: grid;\n  grid-template-columns: 10em auto;\n  width: 100%;\n}\n\n.sanddance-scheme.title {\n  justify-content: flex-start;\n}\n\n.sanddance-scheme span {\n  align-self: center;\n}\n\n.sanddance-scheme svg, .sanddance-scheme .swatch {\n  align-self: center;\n  border: thin solid #777;\n  height: 24px;\n}\n\n.sanddance-scheme svg {\n  width: 100%;\n}\n\n.sanddance-scheme .swatch div {\n  display: inline-block;\n  width: 10px;\n  height: 24px;\n}\n\n.sanddance-explorer-topbar {\n  background-color: #fff;\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: 300px auto;\n  height: 36px;\n}\n\n.sanddance-explorer-topbar .logo {\n  color: #0078d4;\n  display: grid;\n  grid-template-columns: 50px auto;\n  padding: 6px 0;\n}\n\n.sanddance-explorer-topbar .logo svg {\n  fill: #0078d4;\n  height: 24px;\n  margin: 0 auto;\n  width: 24px;\n}\n\n.sanddance-explorer-topbar .logo a {\n  color: inherit;\n  font-size: 14px;\n  font-weight: bold;\n  line-height: 24px;\n  text-decoration: none;\n}\n\n.sanddance-explorer-commandbar {\n  position: relative;\n}\n\n.sanddance-explorer-commandbar > div {\n  left: 0;\n  position: absolute;\n  right: 0;\n}\n\n.sanddance-explorer-commandbar .ms-CommandBar {\n  height: 36px;\n}\n\n.dark-theme .sanddance-explorer-topbar {\n  background-color: #000;\n}\n\n.dark-theme .sanddance-explorer-topbar .logo {\n  color: #00b4f0;\n}\n\n.sanddance-group {\n  border-top: 1px solid #ccc;\n  padding-bottom: 1.5em;\n  position: relative;\n}\n\n.sanddance-group .group-head {\n  display: grid;\n  grid-template-columns: auto auto;\n  line-height: 16px;\n  margin: 1em 0;\n}\n\n.sanddance-group .group-head label {\n  font-size: 11px;\n  font-weight: 600;\n  letter-spacing: 3px;\n  opacity: 0.8;\n  text-transform: uppercase;\n}\n\n.sanddance-group .group-head .count {\n  color: #333;\n  font-size: 12px;\n  text-align: right;\n}\n\n.sanddance-group .group-icon {\n  position: absolute;\n  top: -1px;\n  right: 0;\n}\n\n.sanddance-group:first-child {\n  border-top: none;\n}\n\n.sanddance-group:first-child .group-head {\n  margin-top: 0;\n}\n\n.sanddance-group:last-child {\n  padding-bottom: 0;\n}\n\n.sanddance-sidebar {\n  background-color: #f9f9f9;\n  display: grid;\n  overflow: hidden;\n  position: relative;\n  transition: width 350ms cubic-bezier(0.4, 0, 0.2, 1);\n  width: 300px;\n}\n\n.sanddance-sidebar:not(.pinned) {\n  bottom: 0;\n  position: absolute;\n  top: 0;\n}\n\n.sanddance-sidebar .sidebar-content {\n  background-color: inherit;\n  display: grid;\n  grid-template-areas: \"stats stats\" \"tabs bar\";\n  grid-template-columns: 50px auto;\n  grid-template-rows: 0fr auto;\n  height: 100%;\n  overflow: hidden;\n  position: absolute;\n  z-index: 1;\n}\n\n.sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.1);\n  display: grid;\n  grid-area: tabs;\n  grid-template-rows: auto 0fr;\n  position: relative;\n}\n\n.sanddance-sidebar .vbutton {\n  align-self: center;\n  display: grid;\n  height: 60px;\n}\n\n.sanddance-sidebar .vbutton.selected {\n  background-color: #f9f9f9;\n}\n\n.sanddance-sidebar .vbutton button {\n  height: 100%;\n  width: 100%;\n}\n\n.sanddance-sidebar .vbutton button .ms-Button-icon {\n  font-size: 24px;\n}\n\n.sanddance-sidebar .sidebar-dialogs .vbutton {\n  height: 16%;\n  max-height: 60px;\n  min-height: 32px;\n}\n\n.sanddance-sidebar .scrollable-container {\n  width: 250px;\n}\n\n.sanddance-sidebar .sidetab {\n  grid-area: bar;\n  padding: 12px;\n}\n\n.sanddance-sidebar.closed {\n  width: 50px;\n}\n\n.sanddance-sidebar.calculator .calculating {\n  background: rgba(249, 249, 249, 0.5);\n  height: 100%;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.sanddance-sidebar.calculator .ms-Spinner {\n  margin-top: -16px;\n  position: relative;\n  top: 50%;\n}\n\n.dark-theme .sanddance-sidebar {\n  background-color: #272727;\n  color: #fff;\n}\n\n.dark-theme .sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n\n.dark-theme .sanddance-sidebar .vbutton.selected {\n  background-color: #272727;\n}\n\n.dark-theme .sanddance-sidebar.calculator .calculating {\n  background: rgba(39, 39, 39, 0.5);\n}\n\n.sanddance-chart-type .ms-ChoiceFieldGroup-flexContainer {\n  display: grid;\n  grid-template-columns: repeat(2, 50%);\n  grid-auto-flow: column;\n  grid-template-rows: repeat(4, auto);\n}\n\n.sanddance-datascope {\n  grid-area: stats;\n  background-color: rgba(0, 0, 0, 0.05);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n  min-height: 5em;\n}\n\n.sanddance-datascope.extended > div {\n  margin: 12px;\n  width: 276px;\n}\n\n.sanddance-datascope label {\n  display: block;\n  font-size: 10px;\n  text-transform: uppercase;\n}\n\n.sanddance-datascope.compact {\n  align-self: center;\n  cursor: pointer;\n  display: grid;\n  text-align: center;\n  width: 50px;\n}\n\n.sanddance-datascope.compact > div {\n  align-self: center;\n}\n\n.sanddance-datascope .datascope-button {\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  box-sizing: border-box;\n  height: 36px;\n  min-width: unset;\n  width: 33.333%;\n}\n\n.sanddance-datascope .datascope-button:hover {\n  background-color: #0078d4;\n  color: #fff;\n}\n\n.sanddance-datascope .datascope-button label {\n  cursor: inherit;\n}\n\n.sanddance-datascope.active .datascope-button.selected {\n  border-color: #0078d4;\n}\n\n.dark-theme .sanddance-datascope {\n  background-color: rgba(0, 0, 0, 0.3);\n  border-bottom-color: rgba(255, 255, 255, 0.1);\n}\n\n.dark-theme .sanddance-datascope .datascope-button {\n  background-color: #000;\n  border-color: rgba(255, 255, 255, 0.2);\n  color: #fff;\n}\n\n.dark-theme .sanddance-datascope .datascope-button:hover {\n  background-color: #0078d4;\n  color: #fff;\n}\n\n.sanddance-dataItem {\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n\n.sanddance-dataItem .name-value {\n  border-top: 1px solid #ddd;\n  cursor: pointer;\n  padding: 4px;\n  position: relative;\n  word-break: break-all;\n}\n\n.sanddance-dataItem .name-value:hover {\n  background-color: #0078d4;\n  color: #fff;\n}\n\n.sanddance-dataItem .name-value:first-child {\n  border-top: none;\n}\n\n.sanddance-dataItem .column-name {\n  font-weight: 500;\n}\n\n.sanddance-dataItem .column-value {\n  max-height: 20em;\n  overflow: auto;\n}\n\n.sanddance-dataItem .bing-search {\n  text-align: right;\n}\n\n.dark-theme .sanddance-dataItem {\n  background-color: #000;\n  border-color: #222;\n}\n\n.dark-theme .sanddance-dataItem .name-value {\n  border-top-color: #222;\n}\n\n.dark-theme .sanddance-dataItem a {\n  color: #00b4f0;\n}\n\n.sanddance-dataIndex .index {\n  display: grid;\n  grid-template-columns: 32px auto 32px;\n  line-height: 32px;\n  margin: 0px -8px 6px -8px;\n  text-align: center;\n}\n\n.sanddance-dataIndex .item-filtered {\n  background-color: rgba(0, 0, 0, 0.1);\n  font-size: 10px;\n  padding: 2px 4px;\n  text-transform: uppercase;\n}\n\n.sanddance-dataIndex .ms-Dropdown-container {\n  margin-bottom: 0.5em;\n}\n\n.scrollable-container {\n  display: grid;\n  min-height: 200px;\n  position: relative;\n}\n\n.scrollable {\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  right: 0;\n  overflow-y: auto;\n  top: 0;\n}\n\n.sanddance-search .sanddance-search-group {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n}\n\n.sanddance-search .sanddance-search-group {\n  background: #fff;\n  margin-top: 1em;\n  padding: 4px;\n}\n\n.sanddance-search .sanddance-search-group:first-child {\n  margin-top: 0;\n}\n\n.sanddance-search .sanddance-search-expression {\n  background-color: rgba(0, 0, 0, 0.1);\n  margin: 12px 4px;\n  padding: 4px 8px 8px 8px;\n}\n\n.sanddance-search .search-action {\n  width: 100%;\n}\n\n.sanddance-search .search-bottom-action {\n  margin-top: 1em;\n}\n\n.sanddance-search .search-field {\n  margin-top: 4px;\n}\n\n.dark-theme .sanddance-search .sanddance-search-group {\n  border-color: rgba(255, 255, 255, 0.2);\n  background: #000;\n}\n\n.dark-theme .sanddance-search .sanddance-search-expression {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-snapshots .ms-Button {\n  margin-bottom: 0.5em;\n}\n\n.sanddance-snapshots .snapshot {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  cursor: pointer;\n  margin-bottom: 0.5em;\n  padding: 5px;\n}\n\n.sanddance-snapshots .snapshot.selected {\n  border-color: rgba(0, 0, 0, 0.6);\n  border-width: 2px;\n  padding: 4px;\n}\n\n.sanddance-snapshots .snapshot:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\n.sanddance-snapshots .snapshot:first-child {\n  margin-top: 0.5em;\n}\n\n.sanddance-snapshots .title {\n  font-weight: 500;\n  word-break: break-word;\n}\n\n.sanddance-snapshots .description {\n  font-weight: 100;\n  word-break: break-word;\n}\n\n.sanddance-snapshots .thumbnail {\n  display: grid;\n  height: 160px;\n  margin-top: 0.5em;\n}\n\n.sanddance-snapshots img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n\n.sanddance-snapshots .actions {\n  display: grid;\n  grid-auto-flow: column;\n}\n\n.sanddance-snapshots .actions a, .sanddance-snapshots .actions span {\n  align-self: center;\n  text-align: center;\n}\n\n.sanddance-snapshots .actions button {\n  width: 100%;\n}\n\n.sanddance-snapshot-dialog .thumbnail {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  display: grid;\n  height: 300px;\n  margin-top: 1em;\n}\n\n.sanddance-snapshot-dialog img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n\n.dark-theme .sanddance-snapshots .snapshot {\n  background-color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n\n.dark-theme .sanddance-snapshots .snapshot.selected {\n  border-color: rgba(255, 255, 255, 0.6);\n}\n\n.dark-theme .sanddance-snapshots .snapshot:hover {\n  background-color: black;\n}\n\n.dark-theme .sanddance-snapshots .actions a {\n  color: #fff;\n}\n\n.dark-theme.sanddance-snapshot-dialog .thumbnail {\n  border-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-history ol {\n  padding-left: 20px;\n}\n\n.sanddance-history li {\n  border: 1px solid transparent;\n  cursor: pointer;\n}\n\n.sanddance-history li.selected {\n  font-weight: bold;\n}\n\n.sanddance-history-button {\n  background: none;\n  border: 0;\n  font-size: inherit;\n  font-style: inherit;\n  font-weight: inherit;\n  height: unset;\n  padding: 3px 4px;\n  text-align: left;\n  width: 100%;\n}\n\n.sanddance-history-button .ms-Button-label {\n  display: inline;\n  font-weight: inherit;\n  margin: 0;\n}\n\n.sanddance-note {\n  background-color: #fffacd;\n  border: 1px solid #333;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  color: #333;\n  margin: 1em;\n  padding: 20px;\n  position: absolute;\n  width: 15em;\n  word-break: break-word;\n}\n\n.sanddance-note .cancel {\n  position: absolute;\n  right: -1px;\n  top: -1px;\n}\n\n.sanddance-note .cancel i {\n  color: #333;\n}\n\n.sanddance-columnMap {\n  position: relative;\n}\n\n.sanddance-columnMap .ms-Dropdown-container {\n  margin-top: 10px;\n}\n\n.sanddance-columnMap .column-options {\n  bottom: 3px;\n  position: absolute;\n  right: 0;\n}\n\n.sanddance-columnMap-absolute {\n  margin-bottom: 1em;\n  margin-left: -4em;\n  margin-right: 1em;\n  margin-top: -1em;\n}\n\n.sanddance-columnMap-absolute .ms-Dropdown-container {\n  margin-top: 0;\n}\n\n.sanddance-tooltip {\n  z-index: 2;\n}\n\n.sanddance-tooltipMap {\n  margin-top: 10px;\n}\n\n.sanddance-dialog ul {\n  margin: 0;\n}\n\n.sanddance-dialog section {\n  margin-top: 1em;\n}\n\n.sanddance-dialog section:first-child {\n  margin-top: 0;\n}\n\n.sanddance-dialog .tip {\n  font-style: italic;\n}\n\n.sanddance-explorer {\n  display: grid;\n  font-family: \"Segoe UI\", sans-serif;\n  font-size: 13px;\n  grid-template-rows: 0fr auto;\n}\n\n.sanddance-explorer.dark-theme {\n  background-color: black;\n}\n\n.sanddance-explorer.dark-theme canvas {\n  background-color: black;\n}\n\n.sanddance-main {\n  display: grid;\n  position: relative;\n  transition: grid-template-columns 350ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.sanddance-main .loading {\n  grid-row-end: span 2;\n  position: relative;\n}\n\n.sanddance-main .loading .ms-Spinner {\n  position: absolute;\n  top: 50%;\n  width: 100%;\n}\n\n.sanddance-main .sanddance-view {\n  display: grid;\n  position: relative;\n  margin-left: 50px;\n}\n\n.sanddance-main .sanddance-layout-unpinned, .sanddance-main .sanddance-layout-pinned {\n  position: absolute;\n  top: 0;\n  left: 50px;\n  right: 150px;\n  bottom: 0;\n}\n\n.sanddance-main.hide-legend .sanddance-layout-unpinned, .sanddance-main.hide-legend .sanddance-layout-pinned {\n  right: 0;\n}\n\n.sanddance-main .sanddance-layout-pinned {\n  left: 300px;\n}\n\n.sanddance-main .sanddance-ReactViewer {\n  position: absolute;\n  top: 0;\n  left: -100px;\n  bottom: 0;\n  right: 0;\n}\n\n.sanddance-main.hide-legend .sanddance-ReactViewer {\n  left: 0;\n}\n\n.sanddance-main.show-center .sanddance-layout-unpinned, .sanddance-main.show-center .sanddance-layout-pinned {\n  background: linear-gradient(to right, transparent 49%, rgba(255, 0, 255, 0.2), transparent 51%);\n  background-color: rgba(0, 255, 255, 0.1);\n}\n\n.sanddance-main.pinned {\n  grid-template-columns: 300px auto;\n  grid-template-areas: \"side main\";\n}\n\n.sanddance-main.pinned .sanddance-view {\n  grid-area: main;\n  margin-left: 0;\n}\n\n.sanddance-main.pinned .loading {\n  grid-area: main;\n  grid-row-end: unset;\n}\n\n.sanddance-main.pinned .sanddance-slidePanel {\n  grid-area: side;\n}\n\n.sanddance-main.pinned.closed {\n  grid-template-columns: 0 auto;\n}\n\n.sanddance-main.pinned.closed .sanddance-view {\n  margin-left: 50px;\n}\n\n.sanddance-main span.ms-layer {\n  display: none;\n}\n\n#sanddance-vega-spec {\n  border: 1px inset;\n  max-height: 20em;\n  overflow: scroll;\n}\n\n.sanddance-panel {\n  top: 5em;\n  bottom: unset;\n  overflow-y: unset;\n  padding-right: 1em;\n  padding-top: 32px;\n}\n\n.sanddance-panel h4,\n.sanddance-panel .sanddance-vegaControls,\n.sanddance-panel .sanddance-unitControls {\n  display: none;\n}\n\n.sanddance-main.hide-legend .sanddance-panel {\n  display: none;\n}\n\n.sanddance-panel-tools {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n\n.sanddance-legend {\n  min-width: 54px;\n}\n\n.sanddance-explanation {\n  font-size: smaller;\n  font-style: italic;\n  margin-bottom: 1em;\n}\n\n.sanddance-explanation .fieldname,\n.sanddance-explanation .fieldtype {\n  font-style: italic;\n}\n\n.sanddance-signal {\n  margin-top: 1em;\n}\n\n.sanddance-legend th {\n  color: #005a9e;\n  cursor: pointer;\n}\n\n.sanddance-legend th:hover {\n  background-color: rgba(43, 136, 216, 0.3333333333);\n}\n\n.sanddance-legend .legend-row:hover {\n  background-color: #0078d4;\n  color: #fff;\n}\n\n.sanddance-dataExporter {\n  margin-top: 1em;\n}\n\n.sanddance-form-separate {\n  margin-top: 1em;\n}\n\n.dark-theme .sanddance-dialog a {\n  color: #00b4f0;\n}\n\n.dark-theme .sanddance-panel {\n  background-color: #000;\n  color: #fff;\n}\n\n.dark-theme .sanddance-legend th {\n  color: #3ac5f3;\n}\n\n.dark-theme .sanddance-legend th:hover {\n  color: #009ed3;\n}\n\n/*# sourceMappingURL=sanddance-explorer.css.map */\n.sanddance-sidebar .sanddance-datascope {\n  min-height: 7em;\n}\n\n/*# sourceMappingURL=sanddance-app.css.map */\n"
  },
  {
    "path": "docs/tests/v3/es6/css/sanddance-test-es6.css",
    "content": ".sanddance-gl {\n    border: 1px solid #ccc;\n    float: left;\n    height: 700px;\n    width: 700px;\n    margin-right: 1em;\n}\n\n.sanddance-tooltip table {\n    background: #333;\n    color: #fff;\n    font-size: smaller;\n    margin: 1em;\n    min-width: 16em;\n    padding: 6px;\n    position: absolute; \n}\n  \n.sanddance-tooltip td {\n    text-align: left;\n    vertical-align: top;\n    width: 75%; \n}\n\n.sanddance-tooltip td:first-child {\n    width: 25%; \n}\n  "
  },
  {
    "path": "docs/tests/v3/es6/js/sanddance-app.js",
    "content": "// modules are defined as an array\n// [ module function, map of requires ]\n//\n// map of requires is short require name -> numeric require\n//\n// anything defined in a previous bundle is accessed via the\n// orig method which is the require for previous bundles\n\n(function (modules, entry, mainEntry, parcelRequireName, globalName) {\n  /* eslint-disable no-undef */\n  var globalObject =\n    typeof globalThis !== 'undefined'\n      ? globalThis\n      : typeof self !== 'undefined'\n      ? self\n      : typeof window !== 'undefined'\n      ? window\n      : typeof global !== 'undefined'\n      ? global\n      : {};\n  /* eslint-enable no-undef */\n\n  // Save the require from previous bundle to this closure if any\n  var previousRequire =\n    typeof globalObject[parcelRequireName] === 'function' &&\n    globalObject[parcelRequireName];\n\n  var cache = previousRequire.cache || {};\n  // Do not use `require` to prevent Webpack from trying to bundle this call\n  var nodeRequire =\n    typeof module !== 'undefined' &&\n    typeof module.require === 'function' &&\n    module.require.bind(module);\n\n  function newRequire(name, jumped) {\n    if (!cache[name]) {\n      if (!modules[name]) {\n        // if we cannot find the module within our internal map or\n        // cache jump to the current global require ie. the last bundle\n        // that was added to the page.\n        var currentRequire =\n          typeof globalObject[parcelRequireName] === 'function' &&\n          globalObject[parcelRequireName];\n        if (!jumped && currentRequire) {\n          return currentRequire(name, true);\n        }\n\n        // If there are other bundles on this page the require from the\n        // previous one is saved to 'previousRequire'. Repeat this as\n        // many times as there are bundles until the module is found or\n        // we exhaust the require chain.\n        if (previousRequire) {\n          return previousRequire(name, true);\n        }\n\n        // Try the node require function if it exists.\n        if (nodeRequire && typeof name === 'string') {\n          return nodeRequire(name);\n        }\n\n        var err = new Error(\"Cannot find module '\" + name + \"'\");\n        err.code = 'MODULE_NOT_FOUND';\n        throw err;\n      }\n\n      localRequire.resolve = resolve;\n      localRequire.cache = {};\n\n      var module = (cache[name] = new newRequire.Module(name));\n\n      modules[name][0].call(\n        module.exports,\n        localRequire,\n        module,\n        module.exports,\n        this\n      );\n    }\n\n    return cache[name].exports;\n\n    function localRequire(x) {\n      var res = localRequire.resolve(x);\n      return res === false ? {} : newRequire(res);\n    }\n\n    function resolve(x) {\n      var id = modules[name][1][x];\n      return id != null ? id : x;\n    }\n  }\n\n  function Module(moduleName) {\n    this.id = moduleName;\n    this.bundle = newRequire;\n    this.exports = {};\n  }\n\n  newRequire.isParcelRequire = true;\n  newRequire.Module = Module;\n  newRequire.modules = modules;\n  newRequire.cache = cache;\n  newRequire.parent = previousRequire;\n  newRequire.register = function (id, exports) {\n    modules[id] = [\n      function (require, module) {\n        module.exports = exports;\n      },\n      {},\n    ];\n  };\n\n  Object.defineProperty(newRequire, 'root', {\n    get: function () {\n      return globalObject[parcelRequireName];\n    },\n  });\n\n  globalObject[parcelRequireName] = newRequire;\n\n  for (var i = 0; i < entry.length; i++) {\n    newRequire(entry[i]);\n  }\n\n  if (mainEntry) {\n    // Expose entry point to Node, AMD or browser globals\n    // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js\n    var mainExports = newRequire(mainEntry);\n\n    // CommonJS\n    if (typeof exports === 'object' && typeof module !== 'undefined') {\n      module.exports = mainExports;\n\n      // RequireJS\n    } else if (typeof define === 'function' && define.amd) {\n      define(function () {\n        return mainExports;\n      });\n\n      // <script>\n    } else if (globalName) {\n      this[globalName] = mainExports;\n    }\n  }\n})({\"fV4j0\":[function(require,module,exports) {\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _fluentUIComponents = require(\"./fluentUIComponents\");\nvar _sanddanceApp = require(\"./sanddanceApp\");\nvar _core = require(\"@deck.gl/core\");\nvar _layers = require(\"@deck.gl/layers\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _sanddanceExplorer = require(\"@msrvida/sanddance-explorer\");\nvar _react = require(\"react\");\nvar _reactDom = require(\"react-dom\");\nvar _vega = require(\"vega\");\n(0, _base.use)((0, _fluentUIComponents.fluentUI), _vega, _core, _layers, _core1);\nconst staticContent = Array.from(document.querySelectorAll(\"a.sanddance-app-static-content\"));\nconst dataSets = staticContent.filter((f)=>f.id).map((n)=>{\n    const forData = staticContent.filter((f)=>f.dataset[\"for\"] === n.id)[0];\n    return {\n        dataSourceType: \"sample\",\n        id: n.id,\n        displayName: n.dataset[\"displayName\"],\n        dataUrl: n.href,\n        type: n.dataset[\"type\"],\n        snapshotsUrl: forData ? forData.href : null\n    };\n});\nlet explorer;\nconst undef = \"undefined\";\n_reactDom.render(/*#__PURE__*/ _react.createElement((0, _sanddanceApp.SandDanceApp), {\n    setTheme: typeof setTheme !== undef && setTheme,\n    darkTheme: typeof darkTheme !== undef && darkTheme,\n    insights: typeof insights !== undef && insights,\n    initialOptions: typeof options !== undef && options,\n    themeColors: typeof themeColors !== undef && themeColors,\n    dataSources: dataSets,\n    mounted: (app)=>{\n        explorer = app.explorer;\n    }\n}), document.getElementById(\"app\"));\nconst z = \"z\".charCodeAt(0);\nconst Z = \"Z\".charCodeAt(0);\ndocument.onkeyup = (e)=>{\n    //look for CTRL Z or CTRL SHIFT Z\n    if (e.ctrlKey && (e.keyCode === z || e.keyCode === Z)) {\n        if (e.shiftKey) explorer.redo();\n        else explorer.undo();\n    }\n};\nwindow[\"SandDanceApp\"] = {\n    explorer,\n    SandDanceExplorer: _sanddanceExplorer\n};\n\n},{\"./base\":\"6wvRv\",\"./fluentUIComponents\":\"jSYVB\",\"./sanddanceApp\":\"42eQi\",\"@deck.gl/core\":\"gu68g\",\"@deck.gl/layers\":\"jT2PV\",\"@luma.gl/core\":\"WBJLR\",\"@msrvida/sanddance-explorer\":\"cnuDN\",\"react\":\"8ePka\",\"react-dom\":\"j73oT\",\"vega\":\"1ublu\"}],\"6wvRv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"base\", ()=>base);\n/**\n * Specify the dependency libraries to use for rendering.\n * @param fluentUI FluentUI React library.\n * @param vega Vega library.\n * @param deck @deck.gl/core library.\n * @param layers @deck.gl/layers library.\n * @param luma @luma.gl/core library.\n */ parcelHelpers.export(exports, \"use\", ()=>use);\nvar _sanddanceExplorer = require(\"@msrvida/sanddance-explorer\");\nvar _react = require(\"react\");\nvar _reactDom = require(\"react-dom\");\nconst base = {\n    fluentUI: null\n};\nfunction use(fluentUI, vega, deck, layers, luma) {\n    _sanddanceExplorer.use(fluentUI, _react, _reactDom, vega, deck, layers, luma);\n    base.fluentUI = fluentUI;\n}\n\n},{\"@msrvida/sanddance-explorer\":\"cnuDN\",\"react\":\"8ePka\",\"react-dom\":\"j73oT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cnuDN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"controls\", ()=>_controls);\nparcelHelpers.export(exports, \"getEmbedHTML\", ()=>(0, _dataExporter.getEmbedHTML));\nparcelHelpers.export(exports, \"SideTabId\", ()=>(0, _interfaces.SideTabId));\nparcelHelpers.export(exports, \"use\", ()=>(0, _base.use));\nparcelHelpers.export(exports, \"capabilities\", ()=>(0, _canvas.capabilities));\nparcelHelpers.export(exports, \"getColorSettingsFromThemePalette\", ()=>(0, _themes.getColorSettingsFromThemePalette));\nparcelHelpers.export(exports, \"themePalettes\", ()=>(0, _themes.themePalettes));\nparcelHelpers.export(exports, \"SandDance\", ()=>(0, _sanddanceReact.SandDance));\nparcelHelpers.export(exports, \"util\", ()=>(0, _sanddanceReact.util));\nparcelHelpers.export(exports, \"version\", ()=>(0, _version.version));\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _controls = require(\"./controls\");\nvar _dataExporter = require(\"./controls/dataExporter\");\nvar _interfaces = require(\"./interfaces\");\nvar _base = require(\"./base\");\nvar _canvas = require(\"./canvas\");\nvar _themes = require(\"./themes\");\nvar _explorer = require(\"./explorer\");\nparcelHelpers.exportAll(_explorer, exports);\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _version = require(\"./version\");\n\n},{\"./controls\":\"aIbga\",\"./controls/dataExporter\":\"avMLS\",\"./interfaces\":\"kWX6R\",\"./base\":\"b6Cy1\",\"./canvas\":\"aMCsM\",\"./themes\":\"gcU9w\",\"./explorer\":\"3bX0l\",\"@msrvida/sanddance-react\":\"4uo3s\",\"./version\":\"g9qji\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aIbga\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _dialog = require(\"./dialog\");\nparcelHelpers.exportAll(_dialog, exports);\n\n},{\"./dialog\":\"hBByT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hBByT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Dialog\", ()=>Dialog);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _language = require(\"../language\");\nfunction Dialog(props) {\n    return (0, _base.base).react.createElement((0, _base.base).fluentUI.Dialog, Object.assign({}, props, {\n        dialogContentProps: Object.assign({\n            type: (0, _base.base).fluentUI.DialogType.normal,\n            title: props.title\n        }, props.dialogContentProps)\n    }), (0, _base.base).react.createElement(\"div\", {\n        onKeyUp: (e)=>{\n            e.nativeEvent.stopImmediatePropagation();\n        }\n    }, props.children), (0, _base.base).react.createElement((0, _base.base).fluentUI.DialogFooter, null, props.buttons, (0, _base.base).react.createElement((0, _base.base).fluentUI.DefaultButton, {\n        iconProps: {\n            iconName: \"Cancel\"\n        },\n        onClick: props.onDismiss,\n        text: (0, _language.strings).buttonClose\n    })));\n}\n\n},{\"../base\":\"b6Cy1\",\"../language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b6Cy1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"base\", ()=>base);\n/**\n * Specify the dependency libraries to use for rendering.\n * @param fluentUI FluentUI React library.\n * @param react React library.\n * @param vega Vega library.\n * @param deck @deck.gl/core library.\n * @param layers @deck.gl/layers library.\n * @param luma @luma.gl/core library.\n */ parcelHelpers.export(exports, \"use\", ()=>use);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _clickableTextLayer = require(\"./clickableTextLayer\");\nvar _dataExporter = require(\"./controls/dataExporter\");\nvar _chart = require(\"./dialogs/chart\");\nvar _search = require(\"./dialogs/search\");\nvar _settings = require(\"./dialogs/settings\");\nvar _snapshotEditor = require(\"./dialogs/snapshotEditor\");\nvar _snapshots = require(\"./dialogs/snapshots\");\nvar _explorer = require(\"./explorer\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nconst base = {\n    fluentUI: null,\n    react: null,\n    reactDOM: null\n};\nfunction use(fluentUI, react, reactDOM, vega, deck, layers, luma) {\n    (0, _sanddanceReact.use)(react, reactDOM, vega, deck, layers, luma);\n    base.fluentUI = fluentUI;\n    base.react = react;\n    base.reactDOM = reactDOM;\n    //inform React that we are using a dynamic base class\n    (0, _chart.Chart).prototype = react.Component.prototype;\n    (0, _dataExporter.DataExportPicker).prototype = react.Component.prototype;\n    (0, _explorer.Explorer).prototype = react.Component.prototype;\n    (0, _clickableTextLayer.PositionedColumnMap).prototype = react.Component.prototype;\n    (0, _search.Search).prototype = react.Component.prototype;\n    (0, _snapshotEditor.SnapshotEditor).prototype = react.Component.prototype;\n    (0, _snapshots.Snapshots).prototype = react.Component.prototype;\n    (0, _settings.Settings).prototype = react.Component.prototype;\n}\n\n},{\"./clickableTextLayer\":\"j00gw\",\"./controls/dataExporter\":\"avMLS\",\"./dialogs/chart\":\"2MMic\",\"./dialogs/search\":\"iB7jA\",\"./dialogs/settings\":\"kDVwl\",\"./dialogs/snapshotEditor\":\"jdUx0\",\"./dialogs/snapshots\":\"cVyum\",\"./explorer\":\"3bX0l\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j00gw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"onBeforeCreateLayers\", ()=>onBeforeCreateLayers);\nparcelHelpers.export(exports, \"PositionedColumnMap\", ()=>PositionedColumnMap);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _columnMap = require(\"./controls/columnMap\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction onBeforeCreateLayers(stage, specCapabilities) {\n    for(let axisName in stage.axes)specCapabilities.roles.forEach((specRole)=>{\n        if (specRole.role === axisName) {\n            let axes = stage.axes[axisName];\n            axes.forEach((axis)=>{\n                if (axis.title) {\n                    const textItem = axis.title;\n                    textItem.specRole = specRole;\n                }\n            });\n        }\n    });\n}\nfunction px(n) {\n    return n + \"px\";\n}\nfunction _PositionedColumnMap(props1) {\n    class __PositionedColumnMap extends (0, _base.base).react.Component {\n        constructor(props){\n            super(props);\n            const { left , top  } = props;\n            this.state = {\n                left,\n                top\n            };\n            this.dropdownRef = (0, _base.base).react.createRef();\n        }\n        focus() {\n            if (!this.focused) {\n                this.focused = true;\n                this.dropdownRef.current.focus(true);\n            }\n        }\n        componentDidMount() {\n            const size = (0, _sanddanceReact.SandDance).VegaDeckGl.util.outerSize(this.div);\n            const over = {\n                left: Math.max(0, this.state.left + size.width - this.props.container.offsetWidth),\n                top: Math.max(0, this.state.top + size.height - this.props.container.offsetHeight)\n            };\n            if (over.left || over.top) {\n                let { left , top  } = this.state;\n                left -= over.left;\n                top -= over.top;\n                this.setState({\n                    left,\n                    top\n                });\n            } else this.focus();\n        }\n        componentDidUpdate() {\n            this.focus();\n        }\n        render() {\n            return (0, _base.base).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div) this.div = div;\n                },\n                className: \"sanddance-columnMap-absolute\",\n                style: {\n                    position: \"absolute\",\n                    left: px(this.state.left),\n                    top: px(this.state.top)\n                }\n            }, (0, _base.base).react.createElement((0, _columnMap.ColumnMap), Object.assign({}, this.props, {\n                componentRef: this.dropdownRef,\n                hideSignals: true\n            })));\n        }\n    }\n    return new __PositionedColumnMap(props1);\n}\nconst PositionedColumnMap = _PositionedColumnMap;\n\n},{\"./base\":\"b6Cy1\",\"./controls/columnMap\":\"6MgAn\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6MgAn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getColumnMapOptions\", ()=>getColumnMapOptions);\nparcelHelpers.export(exports, \"ColumnMap\", ()=>ColumnMap);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _dropdown = require(\"./dropdown\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _signal = require(\"./signal\");\nvar _language = require(\"../language\");\nconst maxFacets = 50;\nconst roleLabels = {\n    color: (0, _language.strings).labelColumnColor,\n    facet: (0, _language.strings).labelColumnFacet,\n    facetV: (0, _language.strings).labelColumnFacetV,\n    group: (0, _language.strings).labelColumnGroup,\n    size: (0, _language.strings).labelColumnSize,\n    sort: (0, _language.strings).labelColumnSort,\n    uid: null,\n    x: (0, _language.strings).labelColumnX,\n    y: (0, _language.strings).labelColumnY,\n    z: (0, _language.strings).labelColumnZ\n};\nconst aliasLabels = {\n    color: (0, _language.strings).labelAliasColor,\n    facet: (0, _language.strings).labelAliasFacet,\n    facetV: (0, _language.strings).labelAliasFacetV,\n    group: (0, _language.strings).labelAliasGroup,\n    size: (0, _language.strings).labelAliasSize,\n    sort: (0, _language.strings).labelAliasSort,\n    uid: null,\n    x: (0, _language.strings).labelAliasX,\n    y: (0, _language.strings).labelAliasY,\n    z: (0, _language.strings).labelAliasZ\n};\nfunction filterColumnList(context, columns) {\n    switch(context){\n        case \"facet\":\n        case \"facetV\":\n            return columns.filter((column)=>column.quantitative || column.stats.distinctValueCount && column.stats.distinctValueCount < maxFacets);\n        default:\n            return columns.slice();\n    }\n}\nfunction optionsForSpecColumn(sectionName, columns, role, disabledColumnName, selectedColumnName) {\n    const filtered = filterColumnList(role, columns);\n    const options = filtered.map((column)=>{\n        const option = {\n            key: `column:${column.name}`,\n            text: column.name,\n            data: column,\n            selected: selectedColumnName === column.name,\n            disabled: disabledColumnName === column.name\n        };\n        return option;\n    });\n    if (options.length) {\n        const option = {\n            key: sectionName,\n            text: sectionName,\n            itemType: (0, _base.base).fluentUI.DropdownMenuItemType.Header\n        };\n        options.unshift(option);\n    }\n    return options;\n}\nfunction optionsForReference(sectionName, specRoles) {\n    const options = specRoles.map((specRole)=>{\n        const option = {\n            key: `role:${specRole.role}`,\n            text: aliasLabels[specRole.role],\n            data: specRole.role\n        };\n        return option;\n    }).sort((a, b)=>a.text.localeCompare(b.text));\n    if (options.length) {\n        const option = {\n            key: sectionName,\n            text: sectionName,\n            itemType: (0, _base.base).fluentUI.DropdownMenuItemType.Header\n        };\n        options.unshift(option);\n    }\n    return options;\n}\nfunction selectFirst(options) {\n    for(let i = 0; i < options.length; i++){\n        if (options[i].itemType === (0, _base.base).fluentUI.DropdownMenuItemType.Header) continue;\n        options[i].selected = true;\n        return;\n    }\n}\nfunction getColumnMapOptions(props) {\n    if (!props.specRole) return null;\n    let categoricalColumns;\n    let directColorColumns;\n    let directColorGroup;\n    let referenceGroup = [];\n    if (props.specRole.role === \"color\") {\n        categoricalColumns = props.categoricalColumns.filter((c)=>!c.isColorData);\n        directColorColumns = props.categoricalColumns.filter((c)=>c.isColorData);\n        directColorGroup = optionsForSpecColumn((0, _language.strings).selectDirectColor, directColorColumns, \"color\", props.disabledColumnName, props.selectedColumnName);\n    } else categoricalColumns = props.categoricalColumns;\n    if (props.specRole.role === \"sort\") {\n        const others = props.specCapabilities.roles.filter((specRole)=>specRole.role !== props.specRole.role);\n        referenceGroup = optionsForReference((0, _language.strings).selectReference, others);\n    }\n    const quantitativeGroup = optionsForSpecColumn((0, _language.strings).selectNumeric, props.quantitativeColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const categoricGroup = props.specRole.excludeCategoric ? null : optionsForSpecColumn((0, _language.strings).selectNonNumeric, categoricalColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const options = referenceGroup.concat(quantitativeGroup).concat(categoricGroup).concat(directColorGroup).filter(Boolean);\n    return options;\n}\nfunction ColumnMap(props) {\n    const options = getColumnMapOptions(props);\n    if (props.specRole.allowNone) options.unshift({\n        key: -1,\n        text: (0, _language.strings).selectNone\n    });\n    const hasSelection = options.reduce((p, c)=>{\n        return p || c.selected;\n    }, false);\n    if (!hasSelection) selectFirst(options);\n    let signals;\n    if (props.explorer.viewer && props.explorer.viewer.vegaSpec) {\n        if (props.specRole.signals) signals = props.explorer.viewer.vegaSpec.signals.filter((s)=>props.specRole.signals.indexOf(s.name) >= 0);\n    }\n    const label = roleLabels[props.specRole.role];\n    const signalElements = !props.hideSignals && signals && signals.map((signal, i)=>(0, _base.base).react.createElement((0, _signal.Signal), {\n            key: i,\n            explorer: props.explorer,\n            signal: signal,\n            onChange: (value)=>props.onChangeSignal && props.onChangeSignal(signal.name, value),\n            collapseLabel: props.collapseLabel\n        }));\n    return (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-columnMap\"\n    }, props.prefix, !props.hideDropdown && (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n        componentRef: props.componentRef,\n        collapseLabel: props.collapseLabel,\n        disabled: props.disabled,\n        label: label,\n        options: options,\n        onChange: (e, o)=>props.changeColumnMapping(props.specRole.role, typeof o.data === \"string\" ? o.data : (0, _sanddanceReact.SandDance).VegaDeckGl.util.clone(o.data)),\n        onDismiss: props.onDismiss\n    }), signalElements, props.suffix);\n}\n\n},{\"../base\":\"b6Cy1\",\"./dropdown\":\"iEkOh\",\"@msrvida/sanddance-react\":\"4uo3s\",\"./signal\":\"hpJp2\",\"../language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iEkOh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dropdownWidth\", ()=>dropdownWidth);\nparcelHelpers.export(exports, \"Dropdown\", ()=>Dropdown);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nconst dropdownWidth = 200;\nfunction Dropdown(props) {\n    const newProps = Object.assign({}, props);\n    let selectedKey = null;\n    if (newProps.options && newProps.options.length > 1) {\n        const selectedOptions = newProps.options.filter((option)=>option.selected);\n        if (selectedOptions && selectedOptions.length > 0) selectedKey = selectedOptions[0].key;\n    }\n    if (newProps.collapseLabel) newProps.onRenderTitle = (a, b)=>{\n        return (0, _base.base).react.createElement(\"span\", null, newProps.label, \": \", a[0].text);\n    };\n    return (0, _base.base).react.createElement((0, _base.base).fluentUI.Dropdown, Object.assign({\n        dropdownWidth: dropdownWidth\n    }, newProps, {\n        label: newProps.collapseLabel ? null : newProps.label,\n        selectedKey: selectedKey\n    }));\n}\n\n},{\"../base\":\"b6Cy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jA2du\":[function(require,module,exports) {\nexports.interopDefault = function(a) {\n    return a && a.__esModule ? a : {\n        default: a\n    };\n};\nexports.defineInteropFlag = function(a) {\n    Object.defineProperty(a, \"__esModule\", {\n        value: true\n    });\n};\nexports.exportAll = function(source, dest) {\n    Object.keys(source).forEach(function(key) {\n        if (key === \"default\" || key === \"__esModule\" || dest.hasOwnProperty(key)) return;\n        Object.defineProperty(dest, key, {\n            enumerable: true,\n            get: function() {\n                return source[key];\n            }\n        });\n    });\n    return dest;\n};\nexports.export = function(dest, destName, get) {\n    Object.defineProperty(dest, destName, {\n        enumerable: true,\n        get: get\n    });\n};\n\n},{}],\"4uo3s\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SandDance\", ()=>_sanddance);\nparcelHelpers.export(exports, \"util\", ()=>_util);\nparcelHelpers.export(exports, \"SandDanceReact\", ()=>(0, _viewer.SandDanceReact));\nparcelHelpers.export(exports, \"use\", ()=>(0, _base.use));\nparcelHelpers.export(exports, \"version\", ()=>(0, _version.version));\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _sanddance = require(\"@msrvida/sanddance\");\nvar _util = require(\"./util\");\nvar _viewer = require(\"./viewer\");\nvar _base = require(\"./base\");\nvar _version = require(\"./version\");\n\n},{\"@msrvida/sanddance\":\"69nA6\",\"./util\":\"4RaV2\",\"./viewer\":\"2bHQo\",\"./base\":\"anbmZ\",\"./version\":\"f6eTA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"69nA6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"colorSchemes\", ()=>(0, _colorSchemes.colorSchemes));\nparcelHelpers.export(exports, \"constants\", ()=>_constants);\nparcelHelpers.export(exports, \"searchExpression\", ()=>_searchExpression);\nparcelHelpers.export(exports, \"specs\", ()=>_sanddanceSpecs);\nparcelHelpers.export(exports, \"types\", ()=>_types);\nparcelHelpers.export(exports, \"use\", ()=>use);\nparcelHelpers.export(exports, \"util\", ()=>_util);\nparcelHelpers.export(exports, \"VegaDeckGl\", ()=>_vegaDeckGl);\nparcelHelpers.export(exports, \"Viewer\", ()=>(0, _viewer.Viewer));\nparcelHelpers.export(exports, \"version\", ()=>(0, _version.version));\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _searchExpression = require(\"@msrvida/search-expression\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _types = require(\"./types\");\nvar _util = require(\"./util\");\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _colorSchemes = require(\"./colorSchemes\");\nvar _viewer = require(\"./viewer\");\nvar _version = require(\"./version\");\nconst use = (0, _vegaDeckGl.use);\n\n},{\"./constants\":\"8f30h\",\"@msrvida/search-expression\":\"7aaNP\",\"@msrvida/sanddance-specs\":\"gDvQs\",\"./types\":\"32pys\",\"./util\":\"jvEtL\",\"@msrvida/vega-deck.gl\":\"dKeDo\",\"./colorSchemes\":\"cHhTd\",\"./viewer\":\"2eKB4\",\"./version\":\"aXH63\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8f30h\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nparcelHelpers.export(exports, \"ColorScaleNone\", ()=>(0, _sanddanceSpecs.ColorScaleNone));\nparcelHelpers.export(exports, \"FieldNames\", ()=>(0, _sanddanceSpecs.FieldNames));\nparcelHelpers.export(exports, \"ScaleNames\", ()=>(0, _sanddanceSpecs.ScaleNames));\nparcelHelpers.export(exports, \"SignalNames\", ()=>(0, _sanddanceSpecs.SignalNames));\nparcelHelpers.export(exports, \"GL_ORDINAL\", ()=>GL_ORDINAL);\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nconst GL_ORDINAL = \"GL_ORDINAL\";\n\n},{\"@msrvida/sanddance-specs\":\"gDvQs\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gDvQs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _build = require(\"./build\");\nparcelHelpers.exportAll(_build, exports);\nvar _constants = require(\"./constants\");\nparcelHelpers.exportAll(_constants, exports);\nvar _inference = require(\"./inference\");\nparcelHelpers.exportAll(_inference, exports);\nvar _interfaces = require(\"./interfaces\");\nparcelHelpers.exportAll(_interfaces, exports);\nvar _types = require(\"./types\");\nparcelHelpers.exportAll(_types, exports);\n\n},{\"./build\":\"3EvE0\",\"./constants\":\"9PPhV\",\"./inference\":\"dq4sa\",\"./interfaces\":\"7OncB\",\"./types\":\"ayrRT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3EvE0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"build\", ()=>build);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _charts = require(\"./charts\");\nvar _inference = require(\"./inference\");\nvar _specBuilder = require(\"./specBuilder\");\nfunction build(specContext, currData) {\n    const { specColumns  } = specContext;\n    const columns = [\n        specColumns.color,\n        specColumns.facet,\n        specColumns.facetV,\n        specColumns.group,\n        specColumns.size,\n        specColumns.sort,\n        specColumns.x,\n        specColumns.y,\n        specColumns.z\n    ];\n    (0, _inference.inferAll)(columns, currData);\n    const specBuilderProps = (0, _charts.getSpecBuilderPropsForChart)(specContext);\n    const specBuilder = new (0, _specBuilder.SpecBuilder)(specBuilderProps, specContext);\n    let specResult;\n    if (specBuilder) {\n        try {\n            const errors = specBuilder.validate();\n            if (errors.length) specResult = {\n                errors,\n                specCapabilities: specBuilderProps.specCapabilities,\n                vegaSpec: null\n            };\n            else specResult = specBuilder.build();\n        } catch (e) {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [\n                    e.stack\n                ]\n            };\n        }\n        if (!specResult.errors) {\n            const data0 = specResult.vegaSpec.data[0];\n            data0.values = currData;\n        }\n    } else specResult = {\n        specCapabilities: null,\n        vegaSpec: null,\n        errors: [\n            `could not build spec for ${specContext.insight.chart}`\n        ]\n    };\n    return specResult;\n}\n\n},{\"./charts\":\"buOmZ\",\"./inference\":\"dq4sa\",\"./specBuilder\":\"h8MxI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"buOmZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSpecBuilderPropsForChart\", ()=>getSpecBuilderPropsForChart);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _barchartH = require(\"./barchartH\");\nvar _barchartHDefault = parcelHelpers.interopDefault(_barchartH);\nvar _barchartV = require(\"./barchartV\");\nvar _barchartVDefault = parcelHelpers.interopDefault(_barchartV);\nvar _density = require(\"./density\");\nvar _densityDefault = parcelHelpers.interopDefault(_density);\nvar _grid = require(\"./grid\");\nvar _gridDefault = parcelHelpers.interopDefault(_grid);\nvar _scatterplot = require(\"./scatterplot\");\nvar _scatterplotDefault = parcelHelpers.interopDefault(_scatterplot);\nvar _stacks = require(\"./stacks\");\nvar _stacksDefault = parcelHelpers.interopDefault(_stacks);\nvar _strips = require(\"./strips\");\nvar _stripsDefault = parcelHelpers.interopDefault(_strips);\nvar _treemap = require(\"./treemap\");\nvar _treemapDefault = parcelHelpers.interopDefault(_treemap);\nvar _facetLayout = require(\"../facetLayout\");\nvar _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nconst map = {\n    barchart: (0, _barchartVDefault.default),\n    barchartH: (0, _barchartHDefault.default),\n    barchartV: (0, _barchartVDefault.default),\n    density: (0, _densityDefault.default),\n    grid: (0, _gridDefault.default),\n    scatterplot: (0, _scatterplotDefault.default),\n    stacks: (0, _stacksDefault.default),\n    strips: (0, _stripsDefault.default),\n    treemap: (0, _treemapDefault.default)\n};\nfunction getSpecBuilderPropsForChart(specContext) {\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const fn = map[insight.chart];\n    if (fn) {\n        const props = fn(specContext);\n        if (insight.columns.facet) {\n            const discreteFacetColumn = {\n                column: specColumns.facet,\n                defaultBins: (0, _defaults.defaultBins),\n                maxbins: (0, _defaults.maxbins),\n                maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                maxbinsSignalName: (0, _constants.SignalNames).FacetBins\n            };\n            const discreteFacetVColumn = {\n                column: specColumns.facetV,\n                defaultBins: (0, _defaults.defaultBins),\n                maxbins: (0, _defaults.maxbins),\n                maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                maxbinsSignalName: (0, _constants.SignalNames).FacetVBins\n            };\n            const { facetLayout , layoutPair  } = (0, _facetLayout.getFacetLayout)(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n            props.layouts.unshift(layoutPair);\n            props.facetLayout = facetLayout;\n        }\n        return props;\n    }\n}\n\n},{\"./barchartH\":\"10jFE\",\"./barchartV\":\"fAuAF\",\"./density\":\"cecpp\",\"./grid\":\"464zg\",\"./scatterplot\":\"23ZBL\",\"./stacks\":\"jwqgN\",\"./strips\":\"7KbAx\",\"./treemap\":\"cToUx\",\"../facetLayout\":\"ksF6u\",\"../constants\":\"9PPhV\",\"../defaults\":\"lzTCE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"10jFE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nvar _size = require(\"../size\");\nexports.default = function(specContext) {\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const { language  } = specViewOptions;\n    const bandProps = {\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes: true\n    };\n    const x = {\n        title: null\n    };\n    const axisScales = {\n        x,\n        y: {\n            title: specColumns.y && specColumns.y.name\n        },\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: bandProps\n        }\n    ];\n    if (insight.totalStyle === \"sum-strip-percent\") {\n        x.aggregate = \"percent\";\n        x.title = language.percent;\n        const stripProps = {\n            addPercentageScale: true,\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z\n        };\n        layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n        });\n    } else {\n        const aggProps = {\n            niceScale: true,\n            dock: \"left\",\n            globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n            globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n            sumBy: specColumns.size,\n            showAxes: true\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props: aggProps\n        });\n        switch(insight.totalStyle){\n            case \"sum-treemap\":\n                {\n                    x.aggregate = \"sum\";\n                    x.title = language.sum;\n                    const treemapProps = {\n                        corner: \"top-left\",\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Treemap\",\n                        props: treemapProps\n                    });\n                    break;\n                }\n            case \"sum-strip\":\n                {\n                    x.aggregate = \"sum\";\n                    x.title = language.sum;\n                    const stripProps = {\n                        sortOrder: \"ascending\",\n                        orientation: \"horizontal\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            case \"count-strip\":\n                {\n                    x.aggregate = \"count\";\n                    x.title = language.count;\n                    const stripProps = {\n                        sortOrder: \"ascending\",\n                        orientation: \"horizontal\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            default:\n                {\n                    x.aggregate = \"count\";\n                    x.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: \"down-right\",\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal\n                    };\n                    layouts.push({\n                        layoutType: \"Square\",\n                        props: squareProps\n                    });\n                    break;\n                }\n        }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).YBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, _size.allowNoneForSize),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, _constants.SignalNames).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"9PPhV\",\"../defaults\":\"lzTCE\",\"../size\":\"2mFxj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9PPhV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FieldNames\", ()=>FieldNames);\nparcelHelpers.export(exports, \"ScaleNames\", ()=>ScaleNames);\nparcelHelpers.export(exports, \"SignalNames\", ()=>SignalNames);\nparcelHelpers.export(exports, \"Other\", ()=>Other);\nparcelHelpers.export(exports, \"ColorScaleNone\", ()=>ColorScaleNone);\nconst FieldNames = {\n    Active: \"__SandDance__Active\",\n    Collapsed: \"__SandDance__Collapsed\",\n    Contains: \"__SandDance__Contains\",\n    Count: \"__SandDance__Count\",\n    Sum: \"__SandDance__Sum\",\n    SumOfCount: \"__SandDance__CountSum\",\n    SumOfSum: \"__SandDance__SumSum\",\n    Selected: \"__SandDance__Selected\",\n    First: \"__SandDance__First\",\n    Last: \"__SandDance__Last\",\n    Top: \"__SandDance__Top\",\n    TopColor: \"__SandDance__TopColor\",\n    TopIndex: \"__SandDance__TopIndex\",\n    PowerBISelectionId: \"__SandDance__PowerBISelectionId\",\n    FacetSearch: \"__SandDance__FacetSearch\",\n    FacetTitle: \"__SandDance__FacetTitle\",\n    Ordinal: \"__SandDance__Ordinal\",\n    WrapCol: \"__SandDance__WrapCol\",\n    WrapRow: \"__SandDance__WrapRow\",\n    Value: \"__SandDance__Value\",\n    OffsetX: \"__SandDance__X\",\n    OffsetY: \"__SandDance__Y\",\n    OffsetHeight: \"__SandDance__H\",\n    OffsetWidth: \"__SandDance__W\"\n};\nconst ScaleNames = {\n    Color: \"scale_color\",\n    X: \"scale_x\",\n    Y: \"scale_y\",\n    Z: \"scale_z\"\n};\nconst SignalNames = {\n    ViewportWidth: \"ViewportWidth\",\n    ViewportHeight: \"ViewportHeight\",\n    MinCellWidth: \"MinCellWidth\",\n    MinCellHeight: \"MinCellHeight\",\n    PlotOffsetLeft: \"PlotOffsetLeft\",\n    PlotOffsetTop: \"PlotOffsetTop\",\n    PlotOffsetBottom: \"PlotOffsetBottom\",\n    PlotOffsetRight: \"PlotOffsetRight\",\n    PlotHeightIn: \"PlotHeightIn\",\n    PlotWidthIn: \"PlotWidthIn\",\n    PlotHeightOut: \"PlotHeightOut\",\n    PlotWidthOut: \"PlotWidthOut\",\n    ColorBinCount: \"RoleColor_BinCountSignal\",\n    ColorReverse: \"RoleColor_ReverseSignal\",\n    FacetBins: \"RoleFacet_BinsSignal\",\n    FacetVBins: \"RoleFacetV_BinsSignal\",\n    FacetPaddingTop: \"FacetPaddingTop\",\n    FacetPaddingBottom: \"FacetPaddingBottom\",\n    FacetPaddingLeft: \"FacetPaddingLeft\",\n    MarkOpacity: \"Mark_OpacitySignal\",\n    PointScale: \"Chart_PointScaleSignal\",\n    TextAngleX: \"Text_AngleXSignal\",\n    TextAngleY: \"Text_AngleYSignal\",\n    TextScale: \"Text_ScaleSignal\",\n    TextSize: \"Text_SizeSignal\",\n    TextTitleSize: \"Text_TitleSizeSignal\",\n    TreeMapMethod: \"Chart_TreeMapMethodSignal\",\n    XBins: \"RoleX_BinsSignal\",\n    YBins: \"RoleY_BinsSignal\",\n    ZHeight: \"RoleZ_HeightSignal\",\n    ZGrounded: \"RoleZ_Grounded\",\n    ZProportion: \"RoleZ_ProportionSignal\"\n};\nconst Other = \"__Other\";\nconst ColorScaleNone = \"none\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lzTCE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultBins\", ()=>defaultBins);\nparcelHelpers.export(exports, \"maxbins\", ()=>maxbins);\nparcelHelpers.export(exports, \"minBarBandWidth\", ()=>minBarBandWidth);\nparcelHelpers.export(exports, \"minFacetWidth\", ()=>minFacetWidth);\nparcelHelpers.export(exports, \"minFacetHeight\", ()=>minFacetHeight);\nparcelHelpers.export(exports, \"facetPaddingLeft\", ()=>facetPaddingLeft);\nparcelHelpers.export(exports, \"facetPaddingTop\", ()=>facetPaddingTop);\nparcelHelpers.export(exports, \"facetPaddingBottom\", ()=>facetPaddingBottom);\nparcelHelpers.export(exports, \"facetPaddingRight\", ()=>facetPaddingRight);\nparcelHelpers.export(exports, \"axesLabelLimit\", ()=>axesLabelLimit);\nparcelHelpers.export(exports, \"axesTitleLimit\", ()=>axesTitleLimit);\nparcelHelpers.export(exports, \"axesTitlePaddingX\", ()=>axesTitlePaddingX);\nparcelHelpers.export(exports, \"axesTitlePaddingY\", ()=>axesTitlePaddingY);\nparcelHelpers.export(exports, \"axesTitlePaddingFacetX\", ()=>axesTitlePaddingFacetX);\nparcelHelpers.export(exports, \"axesTitlePaddingFacetY\", ()=>axesTitlePaddingFacetY);\nparcelHelpers.export(exports, \"axesOffsetX\", ()=>axesOffsetX);\nparcelHelpers.export(exports, \"axesOffsetY\", ()=>axesOffsetY);\nparcelHelpers.export(exports, \"scatterSizedMin\", ()=>scatterSizedMin);\nparcelHelpers.export(exports, \"scatterSizedDiv\", ()=>scatterSizedDiv);\nconst defaultBins = 10;\nconst maxbins = 100;\nconst minBarBandWidth = 15;\nconst minFacetWidth = 140;\nconst minFacetHeight = 180;\nconst facetPaddingLeft = 40;\nconst facetPaddingTop = 40;\nconst facetPaddingBottom = 40;\nconst facetPaddingRight = 40;\nconst axesLabelLimit = 100;\nconst axesTitleLimit = 100;\nconst axesTitlePaddingX = 30;\nconst axesTitlePaddingY = 60;\nconst axesTitlePaddingFacetX = 69;\nconst axesTitlePaddingFacetY = 92;\nconst axesOffsetX = 120;\nconst axesOffsetY = 120;\nconst scatterSizedMin = 10;\nconst scatterSizedDiv = 20;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2mFxj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"allowNoneForSize\", ()=>allowNoneForSize);\nfunction allowNoneForSize(specContext) {\n    switch(specContext.insight.totalStyle){\n        case \"sum-strip\":\n        case \"sum-strip-percent\":\n        case \"sum-treemap\":\n            return false;\n        default:\n            //if totalStyle is blank, count is assumed\n            return true;\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fAuAF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nvar _size = require(\"../size\");\nexports.default = function(specContext) {\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const { language  } = specViewOptions;\n    const bandProps = {\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes: true\n    };\n    const y = {\n        title: null\n    };\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y,\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: bandProps\n        }\n    ];\n    if (insight.totalStyle === \"sum-strip-percent\") {\n        y.aggregate = \"percent\";\n        y.title = language.percent;\n        const stripProps = {\n            addPercentageScale: true,\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z\n        };\n        layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n        });\n    } else {\n        const aggProps = {\n            niceScale: true,\n            dock: \"bottom\",\n            globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n            globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n            sumBy: specColumns.size,\n            showAxes: true\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props: aggProps\n        });\n        switch(insight.totalStyle){\n            case \"sum-treemap\":\n                {\n                    y.aggregate = \"sum\";\n                    y.title = language.sum;\n                    const treemapProps = {\n                        corner: \"bottom-left\",\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Treemap\",\n                        props: treemapProps\n                    });\n                    break;\n                }\n            case \"sum-strip\":\n                {\n                    y.aggregate = \"sum\";\n                    y.title = language.sum;\n                    const stripProps = {\n                        sortOrder: \"descending\",\n                        orientation: \"vertical\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            case \"count-strip\":\n                {\n                    y.aggregate = \"count\";\n                    y.title = language.count;\n                    const stripProps = {\n                        sortOrder: \"descending\",\n                        orientation: \"vertical\",\n                        sort: specColumns.sort,\n                        z: specColumns.z\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            default:\n                {\n                    y.aggregate = \"count\";\n                    y.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: \"right-up\",\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal\n                    };\n                    layouts.push({\n                        layoutType: \"Square\",\n                        props: squareProps\n                    });\n                    break;\n                }\n        }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).XBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, _size.allowNoneForSize),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, _constants.SignalNames).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"9PPhV\",\"../defaults\":\"lzTCE\",\"../size\":\"2mFxj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cecpp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nvar _size = require(\"../size\");\nexports.default = function(specContext) {\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y: {\n            title: specColumns.y && specColumns.y.name\n        },\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const hBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes: true\n    };\n    const vBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes: true\n    };\n    const aggProps = {\n        onBuild: null,\n        aggregation: null,\n        sumBy: specColumns.size\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: vBandProps\n        },\n        {\n            layoutType: \"Band\",\n            props: hBandProps\n        },\n        {\n            layoutType: \"AggregateSquare\",\n            props: aggProps\n        }\n    ];\n    switch(insight.totalStyle){\n        case \"sum-treemap\":\n            {\n                aggProps.aggregation = \"sum\";\n                const treemapProps = {\n                    corner: \"bottom-left\",\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: \"Treemap\",\n                    props: treemapProps\n                });\n                break;\n            }\n        case \"sum-strip\":\n            {\n                aggProps.aggregation = \"sum\";\n                const stripProps = {\n                    sortOrder: \"ascending\",\n                    orientation: \"vertical\",\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: \"Strip\",\n                    props: stripProps\n                });\n                break;\n            }\n        case \"count-strip\":\n            {\n                aggProps.aggregation = \"count\";\n                const stripProps = {\n                    sortOrder: \"ascending\",\n                    orientation: \"vertical\",\n                    sort: specColumns.sort,\n                    z: specColumns.z\n                };\n                layouts.push({\n                    layoutType: \"Strip\",\n                    props: stripProps\n                });\n                break;\n            }\n        default:\n            {\n                aggProps.aggregation = \"count\";\n                const squareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: \"right-down\",\n                    z: specColumns.z,\n                    maxGroupedUnits: null,\n                    maxGroupedFillSize: null\n                };\n                aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled)=>{\n                    squareProps.maxGroupedUnits = aggMaxExtent;\n                    squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n                };\n                layouts.push({\n                    layoutType: \"Square\",\n                    props: squareProps\n                });\n                break;\n            }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).XBins\n                    ]\n                },\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).YBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, _size.allowNoneForSize),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, _constants.SignalNames).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"9PPhV\",\"../defaults\":\"lzTCE\",\"../size\":\"2mFxj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"464zg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    const { specColumns  } = specContext;\n    const squareProps = {\n        sortBy: specColumns.sort,\n        fillDirection: \"right-down\",\n        z: specColumns.z,\n        collapseYHeight: true\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    return {\n        axisScales,\n        layouts: [\n            {\n                layoutType: \"Square\",\n                props: squareProps\n            }\n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"9PPhV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"23ZBL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    const { specColumns , specViewOptions  } = specContext;\n    const scatterProps = {\n        x: specColumns.x,\n        y: specColumns.y,\n        z: specColumns.z,\n        size: specColumns.size,\n        scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n        zGrounded: specViewOptions.language.zGrounded\n    };\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y: {\n            title: specColumns.y && specColumns.y.name\n        },\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    return {\n        axisScales,\n        layouts: [\n            {\n                layoutType: \"Scatter\",\n                props: scatterProps\n            }\n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"x\",\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? \"range\" : \"exact\"\n                },\n                {\n                    role: \"y\",\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? \"range\" : \"exact\"\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    excludeCategoric: true,\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }\n            ],\n            signals: [\n                (0, _constants.SignalNames).PointScale,\n                (0, _constants.SignalNames).ZGrounded\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"9PPhV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jwqgN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defaults = require(\"../defaults\");\nvar _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    const { specColumns , specViewOptions  } = specContext;\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y: {\n            title: specColumns.y && specColumns.y.name\n        },\n        z: {\n            title: specViewOptions.language.count\n        }\n    };\n    const hBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes: true\n    };\n    const vBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes: true\n    };\n    const stackProps = {\n        sort: specColumns.sort\n    };\n    return {\n        axisScales,\n        customZScale: true,\n        layouts: [\n            {\n                layoutType: \"Band\",\n                props: vBandProps\n            },\n            {\n                layoutType: \"Band\",\n                props: hBandProps\n            },\n            {\n                layoutType: \"Stack\",\n                props: stackProps\n            }\n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: specColumns.x && specColumns.x.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).XBins\n                    ]\n                },\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: specColumns.y && specColumns.y.quantitative ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).YBins\n                    ]\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n};\n\n},{\"../defaults\":\"lzTCE\",\"../constants\":\"9PPhV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7KbAx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    const { specColumns  } = specContext;\n    const stripProps = {\n        sortOrder: \"ascending\",\n        orientation: \"vertical\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: specColumns.size ? \"sum\" : \"count\"\n        };\n        const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n        const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n        const props = {\n            dock: \"top\",\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props\n        });\n    }\n    layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n    });\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"size\",\n                    allowNone: true,\n                    excludeCategoric: true\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"9PPhV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cToUx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    const { specColumns , specViewOptions  } = specContext;\n    const treemapProps = {\n        corner: \"top-left\",\n        group: specColumns.group,\n        size: specColumns.size,\n        treeMapMethod: specViewOptions.language.treeMapMethod,\n        z: specColumns.z\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: \"sum\"\n        };\n        const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n        const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n        const props = {\n            dock: \"top\",\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props\n        });\n    }\n    layouts.push({\n        layoutType: \"Treemap\",\n        props: treemapProps\n    });\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"size\",\n                    excludeCategoric: true\n                },\n                {\n                    role: \"group\",\n                    allowNone: true\n                },\n                {\n                    role: \"z\",\n                    axisSelection: specColumns.z && specColumns.z.quantitative ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }\n            ],\n            signals: [\n                (0, _constants.SignalNames).TreeMapMethod\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"9PPhV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ksF6u\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getFacetLayout\", ()=>getFacetLayout);\nvar _defaults = require(\"./defaults\");\nfunction getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n    let layoutPair;\n    const groupby = facetColumn;\n    const plotPadding = {\n        x: 0,\n        y: 0\n    };\n    let facetPadding;\n    switch(facetStyle){\n        case \"cross\":\n            {\n                const props = {\n                    axisTextColor,\n                    colRowTitles: true,\n                    groupbyX: groupby,\n                    groupbyY: facetVColumn\n                };\n                layoutPair = {\n                    layoutType: \"Cross\",\n                    props\n                };\n                facetPadding = {\n                    bottom: (0, _defaults.facetPaddingBottom),\n                    left: (0, _defaults.facetPaddingLeft),\n                    top: 0\n                };\n                plotPadding.y = (0, _defaults.facetPaddingTop);\n                plotPadding.x = (0, _defaults.facetPaddingRight);\n                break;\n            }\n        case \"wrap\":\n        default:\n            {\n                const props = {\n                    axisTextColor,\n                    cellTitles: true,\n                    groupby\n                };\n                layoutPair = {\n                    layoutType: \"Wrap\",\n                    props\n                };\n                facetPadding = {\n                    bottom: (0, _defaults.facetPaddingBottom),\n                    left: (0, _defaults.facetPaddingLeft),\n                    top: (0, _defaults.facetPaddingTop)\n                };\n                break;\n            }\n    }\n    const facetLayout = {\n        facetPadding,\n        plotPadding\n    };\n    return {\n        layoutPair,\n        facetLayout\n    };\n}\n\n},{\"./defaults\":\"lzTCE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dq4sa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Derive column metadata from the data array.\n * @param data Array of data objects.\n */ parcelHelpers.export(exports, \"getColumnsFromData\", ()=>getColumnsFromData);\n/**\n * Get columns associated with each Insight role.\n * @param insight Insight to specify column roles.\n * @param columns Array of Columns inferred from the data.\n */ parcelHelpers.export(exports, \"getSpecColumns\", ()=>getSpecColumns);\n/**\n * Populate columns with type inferences and stats.\n * @param columns Array of columns.\n * @param data Array of data objects.\n */ parcelHelpers.export(exports, \"inferAll\", ()=>inferAll);\nparcelHelpers.export(exports, \"getStats\", ()=>getStats);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _d3Color = require(\"d3-color\");\nfunction isColor(cssColorSpecifier) {\n    return !!(0, _d3Color.color)(cssColorSpecifier);\n}\nfunction isQuantitative(column) {\n    return column.type === \"number\" || column.type === \"integer\";\n}\nfunction getColumnsFromData(inferTypesFn, data, columnTypes) {\n    const sample = data[0];\n    const fields = sample ? Object.keys(sample) : [];\n    const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n    const columns = fields.map((name)=>{\n        const column = {\n            name,\n            type: inferences[name]\n        };\n        return column;\n    });\n    inferAll(columns, data);\n    return columns;\n}\nfunction getSpecColumns(insight, columns) {\n    function getColumnByName(name) {\n        return columns.filter((c)=>c.name === name)[0];\n    }\n    return {\n        color: getColumnByName(insight.columns && insight.columns.color),\n        facet: getColumnByName(insight.columns && insight.columns.facet),\n        facetV: getColumnByName(insight.columns && insight.columns.facetV),\n        group: getColumnByName(insight.columns && insight.columns.group),\n        size: getColumnByName(insight.columns && insight.columns.size),\n        sort: getColumnByName(insight.columns && insight.columns.sort),\n        uid: getColumnByName(insight.columns && insight.columns.uid),\n        x: getColumnByName(insight.columns && insight.columns.x),\n        y: getColumnByName(insight.columns && insight.columns.y),\n        z: getColumnByName(insight.columns && insight.columns.z)\n    };\n}\nfunction inferAll(columns, data) {\n    columns.forEach((column)=>{\n        if (column) {\n            if (typeof column.quantitative !== \"boolean\") column.quantitative = isQuantitative(column);\n            if (!column.stats) column.stats = getStats(data, column);\n            if (column.type === \"string\" && typeof column.isColorData !== \"boolean\") checkIsColorData(data, column);\n        }\n    });\n}\nfunction checkIsColorData(data, column) {\n    if (!column.stats.hasColorData) {\n        column.isColorData = false;\n        return;\n    }\n    for(let i = 0; i < data.length; i++)if (!isColor(data[i][column.name])) {\n        column.isColorData = false;\n        return;\n    }\n    column.isColorData = true;\n}\nfunction getStats(data, column) {\n    const distinctMap = {};\n    const stats = {\n        distinctValueCount: null,\n        max: null,\n        mean: null,\n        min: null\n    };\n    let sum = 0;\n    for(let i = 0; i < data.length; i++){\n        let row = data[i];\n        let value = row[column.name];\n        distinctMap[value] = true;\n        if (stats.max === null || value > stats.max) stats.max = value;\n        if (stats.min === null || value < stats.min) stats.min = value;\n        let num = +value;\n        if (!isNaN(num)) sum += num;\n        if (column.type === \"string\" && !stats.hasColorData && isColor(value)) stats.hasColorData = true;\n    }\n    if (column.quantitative) {\n        stats.mean = data.length > 0 && sum / data.length;\n        stats.hasNegative = detectNegative(column, data);\n        if (column.type === \"integer\") stats.isSequential = detectSequentialColumn(column, data);\n    }\n    stats.distinctValueCount = Object.keys(distinctMap).length;\n    return stats;\n}\nfunction detectNegative(column, data) {\n    for(let i = 1; i < data.length; i++){\n        if (data[i][column.name] < 0) return true;\n    }\n    return false;\n}\nfunction detectSequentialColumn(column, data) {\n    if (data.length < 2) return false;\n    let colname = column.name;\n    for(let i = 1; i < data.length; i++){\n        if (data[i][colname] !== data[i - 1][colname] + 1) return false;\n    }\n    return true;\n}\n\n},{\"d3-color\":\"1wRwO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1wRwO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"color\", ()=>(0, _colorJsDefault.default));\nparcelHelpers.export(exports, \"rgb\", ()=>(0, _colorJs.rgb));\nparcelHelpers.export(exports, \"hsl\", ()=>(0, _colorJs.hsl));\nparcelHelpers.export(exports, \"lab\", ()=>(0, _labJsDefault.default));\nparcelHelpers.export(exports, \"hcl\", ()=>(0, _labJs.hcl));\nparcelHelpers.export(exports, \"lch\", ()=>(0, _labJs.lch));\nparcelHelpers.export(exports, \"gray\", ()=>(0, _labJs.gray));\nparcelHelpers.export(exports, \"cubehelix\", ()=>(0, _cubehelixJsDefault.default));\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nvar _labJs = require(\"./lab.js\");\nvar _labJsDefault = parcelHelpers.interopDefault(_labJs);\nvar _cubehelixJs = require(\"./cubehelix.js\");\nvar _cubehelixJsDefault = parcelHelpers.interopDefault(_cubehelixJs);\n\n},{\"./color.js\":\"h3TKV\",\"./lab.js\":false,\"./cubehelix.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h3TKV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Color\", ()=>Color);\nparcelHelpers.export(exports, \"darker\", ()=>darker);\nparcelHelpers.export(exports, \"brighter\", ()=>brighter);\nparcelHelpers.export(exports, \"rgbConvert\", ()=>rgbConvert);\nparcelHelpers.export(exports, \"rgb\", ()=>rgb);\nparcelHelpers.export(exports, \"Rgb\", ()=>Rgb);\nparcelHelpers.export(exports, \"hslConvert\", ()=>hslConvert);\nparcelHelpers.export(exports, \"hsl\", ()=>hsl);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nfunction Color() {}\nvar darker = 0.7;\nvar brighter = 1 / darker;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(\"^rgb\\\\(\" + [\n    reI,\n    reI,\n    reI\n] + \"\\\\)$\"), reRgbPercent = new RegExp(\"^rgb\\\\(\" + [\n    reP,\n    reP,\n    reP\n] + \"\\\\)$\"), reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [\n    reI,\n    reI,\n    reI,\n    reN\n] + \"\\\\)$\"), reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [\n    reP,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\"), reHslPercent = new RegExp(\"^hsl\\\\(\" + [\n    reN,\n    reP,\n    reP\n] + \"\\\\)$\"), reHslaPercent = new RegExp(\"^hsla\\\\(\" + [\n    reN,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\");\nvar named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, _defineJsDefault.default)(Color, color, {\n    copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable: function() {\n        return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    formatHex: color_formatHex,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n});\nfunction color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction color_formatHsl() {\n    return hslConvert(this).formatHsl();\n}\nfunction color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n     : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\nexports.default = color;\nfunction rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n}\nfunction rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n}\nfunction rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Rgb, rgb, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb: function() {\n        return this;\n    },\n    displayable: function() {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: rgb_formatHex,\n    formatHex: rgb_formatHex,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n}));\nfunction rgb_formatHex() {\n    return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\nfunction rgb_formatRgb() {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction hex(value) {\n    value = Math.max(0, Math.min(255, Math.round(value) || 0));\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n}\nfunction hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new Hsl(h, s, l, o.opacity);\n}\nfunction hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Hsl, hsl, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl: function() {\n        var a = this.opacity;\n        a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n},{\"./define.js\":\"ahlrZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ahlrZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"extend\", ()=>extend);\nexports.default = function(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n};\nfunction extend(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h8MxI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SpecBuilder\", ()=>SpecBuilder);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _axes = require(\"./axes\");\nvar _color = require(\"./color\");\nvar _constants = require(\"./constants\");\nvar _defaults = require(\"./defaults\");\nvar _facetTitle = require(\"./facetTitle\");\nvar _fill = require(\"./fill\");\nvar _globalScope = require(\"./globalScope\");\nvar _scope = require(\"./scope\");\nvar _signals = require(\"./signals\");\nvar _index = require(\"./layouts/index\");\nclass SpecBuilder {\n    constructor(props, specContext){\n        this.props = props;\n        this.specContext = specContext;\n        this.globalSignals = {\n            minCellWidth: {\n                name: (0, _constants.SignalNames).MinCellWidth,\n                update: `${0, _defaults.minFacetWidth}`\n            },\n            minCellHeight: {\n                name: (0, _constants.SignalNames).MinCellHeight,\n                update: `${0, _defaults.minFacetHeight}`\n            },\n            plotOffsetLeft: {\n                name: (0, _constants.SignalNames).PlotOffsetLeft,\n                update: \"0\"\n            },\n            plotOffsetTop: {\n                name: (0, _constants.SignalNames).PlotOffsetTop,\n                update: \"0\"\n            },\n            plotOffsetBottom: {\n                name: (0, _constants.SignalNames).PlotOffsetBottom,\n                update: \"0\"\n            },\n            plotOffsetRight: {\n                name: (0, _constants.SignalNames).PlotOffsetRight,\n                update: \"0\"\n            },\n            plotHeightOut: {\n                name: (0, _constants.SignalNames).PlotHeightOut,\n                update: (0, _constants.SignalNames).PlotHeightIn\n            },\n            plotWidthOut: {\n                name: (0, _constants.SignalNames).PlotWidthOut,\n                update: (0, _constants.SignalNames).PlotWidthIn\n            }\n        };\n    }\n    validate() {\n        const { specContext  } = this;\n        const { specCapabilities  } = this.props;\n        const { roles  } = specCapabilities;\n        const required = roles.filter((r)=>{\n            switch(typeof r.allowNone){\n                case \"boolean\":\n                    return !r.allowNone;\n                case \"undefined\":\n                    return true;\n                case \"function\":\n                    return !r.allowNone(specContext);\n            }\n        });\n        const numeric = roles.filter((r)=>r.excludeCategoric);\n        const errors = required.map((r)=>{\n            if (specContext.specColumns[r.role]) return null;\n            else return `Field ${r.role} is required.`;\n        }).concat(numeric.map((r)=>{\n            if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) return `Field ${r.role} must be quantitative.`;\n            else return null;\n        })).filter(Boolean);\n        return errors;\n    }\n    build() {\n        const { specContext  } = this;\n        const { facetLayout , specCapabilities  } = this.props;\n        const { insight , specColumns , specViewOptions  } = specContext;\n        const dataName = \"data_source\";\n        const { vegaSpec , groupMark  } = this.initSpec(dataName);\n        const { topColorField , colorDataName  } = (0, _color.addColor)({\n            scope: vegaSpec,\n            dataName,\n            specContext,\n            scaleName: (0, _constants.ScaleNames).Color,\n            legendDataName: \"data_legend\",\n            topLookupName: \"data_topcolorlookup\",\n            colorReverseSignalName: (0, _constants.SignalNames).ColorReverse\n        });\n        const globalScope = new (0, _globalScope.GlobalScope)({\n            dataName: colorDataName,\n            markGroup: groupMark,\n            scope: vegaSpec,\n            signals: this.globalSignals\n        });\n        if (facetLayout) {\n            (0, _scope.addSignals)(vegaSpec, {\n                name: (0, _constants.SignalNames).FacetPaddingBottom,\n                update: `${facetLayout.facetPadding.bottom}`\n            }, {\n                name: (0, _constants.SignalNames).FacetPaddingLeft,\n                update: `${facetLayout.facetPadding.left}`\n            }, {\n                name: (0, _constants.SignalNames).FacetPaddingTop,\n                update: `${facetLayout.facetPadding.top}`\n            });\n            this.globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n            this.globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n        }\n        const { firstScope , finalScope , specResult , allGlobalScales , allEncodingRules  } = this.iterateLayouts(globalScope, (i, innerScope)=>{\n            if (facetLayout && i === 0) globalScope.zSize = innerScope.offsets.h;\n        });\n        if (specResult) return specResult;\n        if (allGlobalScales.length > 0) {\n            const plotHeightOut = this.globalSignals.plotHeightOut.name;\n            const plotWidthOut = this.globalSignals.plotWidthOut.name;\n            const colTitleScale = {\n                type: \"linear\",\n                name: \"scale_facet_col_title\",\n                domain: [\n                    0,\n                    1\n                ],\n                range: [\n                    0,\n                    {\n                        signal: plotWidthOut\n                    }\n                ]\n            };\n            const rowTitleScale = {\n                type: \"linear\",\n                name: \"scale_facet_row_title\",\n                domain: [\n                    0,\n                    1\n                ],\n                range: [\n                    {\n                        signal: plotHeightOut\n                    },\n                    0\n                ]\n            };\n            let axesScopes = facetLayout ? (0, _facetTitle.addFacetAxesGroupMarks)({\n                globalScope: globalScope.scope,\n                plotScope: groupMark,\n                facetScope: firstScope,\n                colTitleScale,\n                rowTitleScale,\n                colSeqName: \"data_FacetCellColTitles\",\n                rowSeqName: \"data_FacetCellRowTitles\"\n            }) : {\n                main: [\n                    {\n                        scope: groupMark,\n                        lines: true,\n                        labels: true,\n                        title: true\n                    }\n                ]\n            };\n            (0, _axes.addGlobalAxes)({\n                globalScope,\n                allGlobalScales,\n                axisScales: this.props.axisScales,\n                plotOffsetSignals: {\n                    x: this.globalSignals.plotOffsetLeft,\n                    y: this.globalSignals.plotOffsetBottom\n                },\n                axesOffsets: {\n                    x: (0, _defaults.axesOffsetX),\n                    y: (0, _defaults.axesOffsetY)\n                },\n                axesTitlePadding: facetLayout ? {\n                    x: (0, _defaults.axesTitlePaddingFacetX),\n                    y: (0, _defaults.axesTitlePaddingFacetY)\n                } : {\n                    x: (0, _defaults.axesTitlePaddingX),\n                    y: (0, _defaults.axesTitlePaddingY)\n                },\n                labelBaseline: {\n                    x: \"top\",\n                    y: \"middle\"\n                },\n                specColumns,\n                specViewOptions,\n                axesScopes,\n                faceted: !!facetLayout,\n                view: insight.view\n            });\n        }\n        //add mark to the final scope\n        if (finalScope.mark) {\n            const { update  } = finalScope.mark.encode;\n            const outputDataName = \"output\";\n            finalScope.mark.from.data = outputDataName;\n            (0, _scope.addData)(globalScope.markGroup, {\n                name: outputDataName,\n                source: globalScope.markDataName,\n                transform: [\n                    {\n                        type: \"formula\",\n                        expr: finalScope.offsets.x,\n                        as: (0, _constants.FieldNames).OffsetX\n                    },\n                    {\n                        type: \"formula\",\n                        expr: finalScope.offsets.y,\n                        as: (0, _constants.FieldNames).OffsetY\n                    }\n                ]\n            });\n            update.x = {\n                field: (0, _constants.FieldNames).OffsetX\n            };\n            update.y = {\n                field: (0, _constants.FieldNames).OffsetY\n            };\n            allEncodingRules.forEach((map)=>{\n                for(let key in map)if (update[key]) {\n                    let arrIn = map[key];\n                    if (!Array.isArray(update[key])) {\n                        let value = update[key];\n                        let arrOut = [];\n                        update[key] = arrOut;\n                        arrIn.forEach((rule)=>arrOut.push(rule));\n                        arrOut.push(value);\n                    } else {\n                        let arrOut = update[key];\n                        arrIn.forEach((rule)=>arrOut.unshift(rule));\n                    }\n                }\n            });\n            update.fill = (0, _fill.fill)(specContext, topColorField, (0, _constants.ScaleNames).Color);\n            update.opacity = (0, _fill.opacity)(specContext);\n        }\n        return {\n            specCapabilities,\n            vegaSpec\n        };\n    }\n    initSpec(dataName) {\n        const { globalSignals  } = this;\n        const { minCellWidth , minCellHeight , plotOffsetLeft , plotOffsetBottom , plotOffsetTop , plotOffsetRight , plotHeightOut , plotWidthOut  } = globalSignals;\n        const { specContext  } = this;\n        const { insight  } = specContext;\n        const groupMark = {\n            type: \"group\",\n            //style: 'cell',\n            encode: {\n                update: {\n                    x: {\n                        signal: (0, _constants.SignalNames).PlotOffsetLeft\n                    },\n                    y: {\n                        signal: (0, _constants.SignalNames).PlotOffsetTop\n                    },\n                    height: {\n                        signal: (0, _constants.SignalNames).PlotHeightOut\n                    },\n                    width: {\n                        signal: (0, _constants.SignalNames).PlotWidthOut\n                    }\n                }\n            }\n        };\n        const inputDataname = \"input\";\n        const vegaSpec = {\n            $schema: \"https://vega.github.io/schema/vega/v5.json\",\n            //style: 'cell',\n            data: [\n                {\n                    name: inputDataname\n                },\n                {\n                    name: dataName,\n                    source: inputDataname,\n                    transform: []\n                }\n            ],\n            marks: [\n                groupMark\n            ],\n            signals: (0, _signals.textSignals)(specContext, (0, _constants.SignalNames).ViewportHeight).concat([\n                minCellWidth,\n                minCellHeight,\n                {\n                    name: (0, _constants.SignalNames).ViewportHeight,\n                    update: `max(${(0, _constants.SignalNames).MinCellHeight}, ${insight.size.height})`\n                },\n                {\n                    name: (0, _constants.SignalNames).ViewportWidth,\n                    update: `max(${(0, _constants.SignalNames).MinCellWidth}, ${insight.size.width})`\n                },\n                plotOffsetLeft,\n                plotOffsetTop,\n                plotOffsetBottom,\n                plotOffsetRight,\n                {\n                    name: (0, _constants.SignalNames).PlotHeightIn,\n                    update: `${(0, _constants.SignalNames).ViewportHeight} - ${(0, _constants.SignalNames).PlotOffsetBottom}`\n                },\n                {\n                    name: (0, _constants.SignalNames).PlotWidthIn,\n                    update: `${(0, _constants.SignalNames).ViewportWidth} - ${(0, _constants.SignalNames).PlotOffsetLeft} - ${(0, _constants.SignalNames).PlotOffsetRight}`\n                },\n                plotHeightOut,\n                plotWidthOut,\n                {\n                    name: \"height\",\n                    update: `${(0, _constants.SignalNames).PlotOffsetTop} + ${(0, _constants.SignalNames).PlotHeightOut} + ${(0, _constants.SignalNames).PlotOffsetBottom}`\n                },\n                {\n                    name: \"width\",\n                    update: `${(0, _constants.SignalNames).PlotWidthOut} + ${(0, _constants.SignalNames).PlotOffsetLeft} + ${(0, _constants.SignalNames).PlotOffsetRight}`\n                }\n            ])\n        };\n        return {\n            vegaSpec,\n            groupMark\n        };\n    }\n    iterateLayouts(globalScope, onLayoutBuild) {\n        let specResult;\n        let parentScope = {\n            sizeSignals: globalScope.sizeSignals,\n            offsets: globalScope.offsets\n        };\n        let firstScope;\n        let childScope;\n        const groupings = [];\n        let { layouts , specCapabilities  } = this.props;\n        const allGlobalScales = [];\n        const allEncodingRules = [];\n        for(let i = 0; i < layouts.length; i++){\n            if (!parentScope) continue;\n            let buildProps = {\n                globalScope,\n                parentScope,\n                axesScales: this.props.axisScales,\n                groupings,\n                id: i\n            };\n            let layout = this.createLayout(layouts[i], buildProps);\n            try {\n                childScope = layout.build();\n                childScope.id = i;\n                let groupby = layout.getGrouping();\n                if (groupby) groupings.push({\n                    id: i,\n                    groupby,\n                    fieldOps: [\n                        {\n                            field: null,\n                            op: \"count\",\n                            as: (0, _constants.FieldNames).Count\n                        }\n                    ]\n                });\n                let sumOp = layout.getAggregateSumOp();\n                if (sumOp) groupings[groupings.length - 1].fieldOps.push(sumOp);\n                onLayoutBuild(i, childScope);\n            } catch (e) {\n                specResult = {\n                    errors: [\n                        e.stack\n                    ],\n                    specCapabilities,\n                    vegaSpec: null\n                };\n                break;\n            }\n            if (childScope && childScope.globalScales) allGlobalScales.push(childScope.globalScales);\n            if (childScope.encodingRuleMap) allEncodingRules.push(childScope.encodingRuleMap);\n            if (i === 0) firstScope = childScope;\n            parentScope = childScope;\n        }\n        return {\n            firstScope,\n            finalScope: parentScope,\n            specResult,\n            allGlobalScales,\n            allEncodingRules\n        };\n    }\n    createLayout(layoutPair, buildProps) {\n        const { layoutType , props  } = layoutPair;\n        const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n        const layoutClass = (0, _index.layoutClasses)[layoutType];\n        const layout = new layoutClass(layoutBuildProps);\n        layout.id = buildProps.id;\n        return layout;\n    }\n}\n\n},{\"./axes\":\"k0gIV\",\"./color\":\"3l3dx\",\"./constants\":\"9PPhV\",\"./defaults\":\"lzTCE\",\"./facetTitle\":\"lkHaR\",\"./fill\":\"1PEiC\",\"./globalScope\":\"gPmWz\",\"./scope\":\"91ogX\",\"./signals\":\"62U7A\",\"./layouts/index\":\"e7Zx3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k0gIV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addGlobalAxes\", ()=>addGlobalAxes);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _defaults = require(\"./defaults\");\nvar _scope = require(\"./scope\");\nfunction addGlobalAxes(props1) {\n    const { axesOffsets , axisScales , axesScopes , axesTitlePadding , allGlobalScales , globalScope , labelBaseline , plotOffsetSignals , specColumns , specViewOptions  } = props1;\n    const { scope  } = globalScope;\n    allGlobalScales.forEach((globalScales)=>{\n        const { scales  } = globalScales;\n        for(let xyz in scales){\n            let _scales = scales[xyz];\n            if (_scales) {\n                (0, _scope.addScales)(scope, ..._scales);\n                let { showAxes  } = globalScales;\n                let zindex = undefined;\n                if (xyz === \"z\") {\n                    showAxes = false;\n                    if (props1.view === \"3d\" && specViewOptions.zAxisOptions && !props1.faceted) {\n                        if (specViewOptions.zAxisOptions.showZAxis) {\n                            showAxes = true;\n                            zindex = specViewOptions.zAxisOptions.zIndex;\n                        }\n                    }\n                }\n                if (showAxes && axisScales) {\n                    let axisScale = axisScales[xyz];\n                    if (axisScale) {\n                        const lineColor = specViewOptions.colors.axisLine;\n                        const horizontal = xyz === \"x\";\n                        const column = specColumns[xyz] || {\n                            quantitative: true\n                        };\n                        const title = axisScale.title;\n                        const props = {\n                            title,\n                            horizontal,\n                            column,\n                            specViewOptions,\n                            lineColor,\n                            titlePadding: axesTitlePadding[xyz],\n                            labelBaseline: labelBaseline[xyz],\n                            zindex\n                        };\n                        axesScopes[\"main\"].forEach((a)=>(0, _scope.addAxes)(a.scope, createAxis(Object.assign(Object.assign({}, props), {\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines\n                            }))));\n                        if (axesScopes[xyz]) axesScopes[xyz].forEach((a)=>(0, _scope.addAxes)(a.scope, createAxis(Object.assign(Object.assign({}, props), {\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines\n                            }))));\n                        if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                            const plotOffsetSignal = plotOffsetSignals[xyz];\n                            plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                        }\n                    }\n                }\n            }\n        }\n    });\n}\nfunction createAxis(props) {\n    const { column , horizontal , labelBaseline , lineColor , scale , showLabels , showTitle , showLines , specViewOptions , title , titlePadding , zindex  } = props;\n    const axis = Object.assign(Object.assign(Object.assign(Object.assign({\n        zindex,\n        scale: scale.name,\n        orient: horizontal ? \"bottom\" : \"left\",\n        domain: showLines,\n        ticks: showLines\n    }, showLines && {\n        domainColor: lineColor,\n        tickColor: lineColor,\n        tickSize: specViewOptions.tickSize\n    }), showTitle && {\n        title,\n        titleAlign: horizontal ? \"left\" : \"right\",\n        titleAngle: {\n            signal: horizontal ? (0, _constants.SignalNames).TextAngleX : (0, _constants.SignalNames).TextAngleY\n        },\n        titleColor: specViewOptions.colors.axisText,\n        titleFontSize: {\n            signal: (0, _constants.SignalNames).TextTitleSize\n        },\n        titleLimit: (0, _defaults.axesTitleLimit),\n        titlePadding\n    }), {\n        labels: showLabels\n    }), showLabels && {\n        labelAlign: horizontal ? \"left\" : \"right\",\n        labelBaseline,\n        labelAngle: {\n            signal: horizontal ? (0, _constants.SignalNames).TextAngleX : (0, _constants.SignalNames).TextAngleY\n        },\n        labelColor: specViewOptions.colors.axisText,\n        labelFontSize: {\n            signal: (0, _constants.SignalNames).TextSize\n        },\n        labelLimit: (0, _defaults.axesLabelLimit)\n    });\n    if (column.quantitative) axis.format = \"~r\";\n    return axis;\n}\n\n},{\"./constants\":\"9PPhV\",\"./defaults\":\"lzTCE\",\"./scope\":\"91ogX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"91ogX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addAxes\", ()=>addAxes);\nparcelHelpers.export(exports, \"addData\", ()=>addData);\nparcelHelpers.export(exports, \"addMarks\", ()=>addMarks);\nparcelHelpers.export(exports, \"addScales\", ()=>addScales);\nparcelHelpers.export(exports, \"addSignals\", ()=>addSignals);\nparcelHelpers.export(exports, \"addTransforms\", ()=>addTransforms);\nparcelHelpers.export(exports, \"getDataByName\", ()=>getDataByName);\nparcelHelpers.export(exports, \"getGroupBy\", ()=>getGroupBy);\nparcelHelpers.export(exports, \"addOffsets\", ()=>addOffsets);\nfunction addAxes(scope, ...axis) {\n    if (!scope.axes) scope.axes = [];\n    scope.axes.push(...axis);\n}\nfunction addData(scope, ...data) {\n    if (!scope.data) scope.data = [];\n    scope.data.push(...data);\n}\nfunction addMarks(scope, ...marks) {\n    if (!scope.marks) scope.marks = [];\n    scope.marks.push(...marks);\n}\nfunction addScales(scope, ...scale) {\n    if (!scope.scales) scope.scales = [];\n    scope.scales.push(...scale.filter(Boolean));\n}\nfunction addSignals(scope, ...signal) {\n    if (!scope.signals) scope.signals = [];\n    scope.signals.push(...signal);\n}\nfunction addTransforms(data, ...transforms) {\n    if (!data.transform) data.transform = [];\n    data.transform.push(...transforms);\n}\nfunction getDataByName(data, dataName) {\n    for(let i = 0; i < data.length; i++){\n        if (data[i].name === dataName) return {\n            data: data[i],\n            index: i\n        };\n    }\n}\nfunction getGroupBy(groupings) {\n    const groupby = groupings.map((g)=>g.groupby);\n    return groupby.reduce((acc, val)=>acc.concat(val), []);\n}\nfunction addOffsets(...offsets) {\n    return offsets.filter(Boolean).join(\" + \");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3l3dx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addColor\", ()=>addColor);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _scope = require(\"./scope\");\nvar _scales = require(\"./scales\");\nvar _signals = require(\"./signals\");\nvar _constants = require(\"./constants\");\nvar _legends = require(\"./legends\");\nvar _top = require(\"./top\");\nfunction addColor(props) {\n    const { colorReverseSignalName , dataName , scope , legendDataName , scaleName , specContext , topLookupName  } = props;\n    let colorDataName = dataName;\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const legends = (0, _legends.getLegends)(specContext, scaleName);\n    if (legends) scope.legends = legends;\n    const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n    if (categoricalColor) {\n        (0, _scope.addData)(scope, ...(0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, (0, _constants.FieldNames).TopColor, (0, _constants.FieldNames).TopIndex));\n        colorDataName = legendDataName;\n    }\n    if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n        if (specColumns.color.quantitative) (0, _scope.addScales)(scope, (0, _scales.binnableColorScale)(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n        else (0, _scope.addScales)(scope, {\n            name: scaleName,\n            type: \"ordinal\",\n            domain: {\n                data: colorDataName,\n                field: (0, _constants.FieldNames).TopColor,\n                sort: true\n            },\n            range: {\n                scheme: insight.scheme || (0, _constants.ColorScaleNone)\n            },\n            reverse: {\n                signal: colorReverseSignalName\n            }\n        });\n    }\n    (0, _scope.addSignals)(scope, (0, _signals.colorBinCountSignal)(specContext), (0, _signals.colorReverseSignal)(specContext));\n    return {\n        topColorField: (0, _constants.FieldNames).TopColor,\n        colorDataName\n    };\n}\n\n},{\"./scope\":\"91ogX\",\"./scales\":\"1eNTN\",\"./signals\":\"62U7A\",\"./constants\":\"9PPhV\",\"./legends\":\"7bxMX\",\"./top\":\"cunao\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1eNTN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"linearScale\", ()=>linearScale);\nparcelHelpers.export(exports, \"pointScale\", ()=>pointScale);\nparcelHelpers.export(exports, \"binnableColorScale\", ()=>binnableColorScale);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction linearScale(scaleName, data, field, range, reverse, zero) {\n    const scale = {\n        name: scaleName,\n        type: \"linear\",\n        range,\n        round: true,\n        reverse,\n        domain: {\n            data,\n            field: (0, _expr.safeFieldName)(field)\n        },\n        zero,\n        nice: true\n    };\n    return scale;\n}\nfunction pointScale(scaleName, data, range, field, reverse) {\n    const scale = {\n        name: scaleName,\n        type: \"point\",\n        range,\n        domain: {\n            data,\n            field: (0, _expr.safeFieldName)(field),\n            sort: true\n        },\n        padding: 0.5\n    };\n    if (reverse !== undefined) scale.reverse = reverse;\n    return scale;\n}\nfunction binnableColorScale(scaleName, colorBin, data, field, scheme) {\n    scheme = scheme || (0, _constants.ColorScaleNone);\n    const domain = {\n        data,\n        field: (0, _expr.safeFieldName)(field)\n    };\n    const range = {\n        scheme\n    };\n    const reverse = {\n        signal: (0, _constants.SignalNames).ColorReverse\n    };\n    if (colorBin !== \"continuous\") range.count = {\n        signal: (0, _constants.SignalNames).ColorBinCount\n    };\n    switch(colorBin){\n        case \"continuous\":\n            {\n                const sequentialScale = {\n                    name: scaleName,\n                    type: \"linear\",\n                    domain,\n                    range,\n                    reverse\n                };\n                return sequentialScale;\n            }\n        case \"quantile\":\n            {\n                const quantileScale = {\n                    name: scaleName,\n                    type: \"quantile\",\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantileScale;\n            }\n        default:\n            {\n                const quantizeScale = {\n                    name: scaleName,\n                    type: \"quantize\",\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantizeScale;\n            }\n    }\n}\n\n},{\"./constants\":\"9PPhV\",\"./expr\":\"f5d82\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f5d82\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/**\n * Make sure that the field name is accessible via Vega's Field type\n * https://vega.github.io/vega/docs/types/#Field\n * examples: \"source.x\", \"target['x']\", \"[my.field]\"\n */ parcelHelpers.export(exports, \"safeFieldName\", ()=>safeFieldName);\n/**\n * Make sure the field name is usable in a Vega expression\n */ parcelHelpers.export(exports, \"exprSafeFieldName\", ()=>exprSafeFieldName);\nfunction safeFieldName(field) {\n    return field.replace(\".\", \"\\\\.\").replace(\"[\", \"\\\\[\").replace(\"]\", \"\\\\]\");\n}\nfunction exprSafeFieldName(field) {\n    //remove whitespace, period, accessors and logical modifiers\n    return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, \"\");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"62U7A\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultZProportion\", ()=>defaultZProportion);\nparcelHelpers.export(exports, \"textSignals\", ()=>textSignals);\nparcelHelpers.export(exports, \"colorBinCountSignal\", ()=>colorBinCountSignal);\nparcelHelpers.export(exports, \"colorReverseSignal\", ()=>colorReverseSignal);\nparcelHelpers.export(exports, \"modifySignal\", ()=>modifySignal);\nvar _constants = require(\"./constants\");\nconst defaultZProportion = 0.6;\nfunction textSignals(context, heightSignal) {\n    const { specViewOptions  } = context;\n    const signals = [\n        {\n            name: (0, _constants.SignalNames).ZProportion,\n            value: defaultZProportion,\n            bind: {\n                name: specViewOptions.language.zScaleProportion,\n                debounce: 50,\n                input: \"range\",\n                min: 0.2,\n                max: 2,\n                step: 0.1\n            }\n        },\n        {\n            name: (0, _constants.SignalNames).ZHeight,\n            update: `${heightSignal} * ${(0, _constants.SignalNames).ZProportion}`\n        },\n        {\n            name: (0, _constants.SignalNames).TextScale,\n            value: 1.2,\n            bind: {\n                name: specViewOptions.language.textScaleSignal,\n                debounce: 50,\n                input: \"range\",\n                min: 0.5,\n                max: 2,\n                step: 0.1\n            }\n        },\n        {\n            name: (0, _constants.SignalNames).TextSize,\n            update: `${(0, _constants.SignalNames).TextScale} * 10`\n        },\n        {\n            name: (0, _constants.SignalNames).TextTitleSize,\n            update: `${(0, _constants.SignalNames).TextScale} * 15`\n        },\n        {\n            name: (0, _constants.SignalNames).TextAngleX,\n            value: 30,\n            bind: {\n                name: specViewOptions.language.xAxisTextAngleSignal,\n                debounce: 50,\n                input: \"range\",\n                min: 0,\n                max: 90,\n                step: 1\n            }\n        },\n        {\n            name: (0, _constants.SignalNames).TextAngleY,\n            value: 0,\n            bind: {\n                name: specViewOptions.language.yAxisTextAngleSignal,\n                debounce: 50,\n                input: \"range\",\n                min: -90,\n                max: 0,\n                step: 1\n            }\n        },\n        {\n            name: (0, _constants.SignalNames).MarkOpacity,\n            value: 1,\n            bind: {\n                name: specViewOptions.language.markOpacitySignal,\n                debounce: 50,\n                input: \"range\",\n                min: 0.1,\n                max: 1,\n                step: 0.05\n            }\n        }\n    ];\n    return signals;\n}\nfunction colorBinCountSignal(context) {\n    const { specViewOptions  } = context;\n    const signal = {\n        name: (0, _constants.SignalNames).ColorBinCount,\n        value: 7,\n        bind: {\n            name: specViewOptions.language.colorBinCount,\n            input: \"range\",\n            min: 1,\n            max: specViewOptions.maxLegends + 1,\n            step: 1\n        }\n    };\n    return signal;\n}\nfunction colorReverseSignal(context) {\n    const { specViewOptions  } = context;\n    const signal = {\n        name: (0, _constants.SignalNames).ColorReverse,\n        value: false,\n        bind: {\n            name: specViewOptions.language.colorReverse,\n            input: \"checkbox\"\n        }\n    };\n    return signal;\n}\nfunction modifySignal(s, fn, update) {\n    s.update = `${fn}((${s.update}), (${update}))`;\n}\n\n},{\"./constants\":\"9PPhV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7bxMX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getLegends\", ()=>getLegends);\nfunction legend(column, fill) {\n    const legend1 = {\n        orient: \"none\",\n        title: column.name,\n        fill,\n        encode: {\n            symbols: {\n                update: {\n                    shape: {\n                        value: \"square\"\n                    }\n                }\n            }\n        }\n    };\n    if (column.quantitative) {\n        legend1.type = \"symbol\";\n        legend1.format = \"~r\";\n    }\n    return legend1;\n}\nfunction getLegends(context, fill) {\n    const { specColumns , insight  } = context;\n    if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) return [\n        legend(specColumns.color, fill)\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cunao\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"topLookup\", ()=>topLookup);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction topLookup(column, count, source, legend, lookupName, fieldName, indexName) {\n    const data = [\n        {\n            name: lookupName,\n            source,\n            transform: [\n                {\n                    type: \"aggregate\",\n                    groupby: [\n                        (0, _expr.safeFieldName)(column.name)\n                    ]\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"count\"\n                    ],\n                    as: [\n                        indexName\n                    ]\n                },\n                {\n                    type: \"filter\",\n                    expr: `datum[${JSON.stringify(indexName)}] <= ${count}`\n                }\n            ]\n        },\n        {\n            name: legend,\n            source,\n            transform: [\n                {\n                    type: \"lookup\",\n                    from: lookupName,\n                    key: (0, _expr.safeFieldName)(column.name),\n                    fields: [\n                        column.name\n                    ].map((0, _expr.safeFieldName)),\n                    values: [\n                        column.name\n                    ].map((0, _expr.safeFieldName)),\n                    as: [\n                        fieldName\n                    ]\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum[${JSON.stringify(fieldName)}] == null ? '${(0, _constants.Other)}' : datum[${JSON.stringify(fieldName)}]`,\n                    as: fieldName\n                }\n            ]\n        }\n    ];\n    return data;\n}\n\n},{\"./constants\":\"9PPhV\",\"./expr\":\"f5d82\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lkHaR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addFacetColRowTitles\", ()=>addFacetColRowTitles);\nparcelHelpers.export(exports, \"addFacetCellTitles\", ()=>addFacetCellTitles);\nparcelHelpers.export(exports, \"addFacetAxesGroupMarks\", ()=>addFacetAxesGroupMarks);\nparcelHelpers.export(exports, \"facetRowHeaderFooter\", ()=>facetRowHeaderFooter);\nparcelHelpers.export(exports, \"facetColumnHeaderFooter\", ()=>facetColumnHeaderFooter);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _scope = require(\"./scope\");\nvar _constants = require(\"./constants\");\nfunction addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n    const titleSignal = `parent[${JSON.stringify((0, _constants.FieldNames).FacetTitle)}]`;\n    const index = `datum[${JSON.stringify((0, _constants.FieldNames).Ordinal)}] - 1`;\n    const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index);\n    const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index);\n    (0, _scope.addMarks)(globalScope, col.header, row.footer);\n    (0, _scope.addMarks)(col.header, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"center\"\n                },\n                baseline: {\n                    value: \"middle\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}]}`\n                },\n                x: {\n                    signal: `${sizeSignals.layoutWidth} / 2`\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth\n                },\n                fontSize: {\n                    signal: (0, _constants.SignalNames).TextSize\n                },\n                text: {\n                    signal: titleSignal\n                }\n            }\n        }\n    });\n    (0, _scope.addMarks)(row.footer, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"left\"\n                },\n                baseline: {\n                    value: \"middle\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}]}`\n                },\n                y: {\n                    signal: `${sizeSignals.layoutHeight} / 2`\n                },\n                limit: {\n                    signal: (0, _constants.SignalNames).PlotOffsetRight\n                },\n                fontSize: {\n                    signal: (0, _constants.SignalNames).TextSize\n                },\n                text: {\n                    signal: titleSignal\n                }\n            }\n        }\n    });\n}\nfunction addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n    (0, _scope.addMarks)(scope, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"center\"\n                },\n                baseline: {\n                    value: \"bottom\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}]}`\n                },\n                x: {\n                    signal: `(${sizeSignals.layoutWidth}) / 2`\n                },\n                text: {\n                    signal: `parent[${JSON.stringify((0, _constants.FieldNames).FacetTitle)}]`\n                },\n                fontSize: {\n                    signal: (0, _constants.SignalNames).TextSize\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth\n                },\n                y: {\n                    signal: `-${(0, _constants.SignalNames).FacetPaddingTop} / 2`\n                }\n            }\n        }\n    });\n}\nfunction addFacetAxesGroupMarks(props) {\n    const { colSeqName , colTitleScale , globalScope , facetScope , plotScope , rowSeqName , rowTitleScale  } = props;\n    const { sizeSignals  } = facetScope;\n    const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n    const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n    const index = \"datum.data\";\n    const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index);\n    const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index);\n    (0, _scope.addData)(globalScope, colSequence, rowSequence);\n    (0, _scope.addMarks)(globalScope, col.footer, row.header);\n    (0, _scope.addScales)(globalScope, colTitleScale, rowTitleScale);\n    const map = {\n        main: [\n            {\n                scope: facetScope.facetScope,\n                lines: true,\n                labels: false,\n                title: false\n            }\n        ],\n        x: [\n            {\n                scope: col.footer,\n                lines: true,\n                labels: true,\n                title: false\n            },\n            {\n                scope: plotScope,\n                scale: colTitleScale,\n                lines: false,\n                labels: false,\n                title: true\n            }\n        ],\n        y: [\n            {\n                scope: row.header,\n                lines: true,\n                labels: true,\n                title: false\n            },\n            {\n                scope: plotScope,\n                scale: rowTitleScale,\n                lines: false,\n                labels: false,\n                title: true\n            }\n        ]\n    };\n    return map;\n}\nfunction facetRowHeaderFooter(data, sizeSignals, index) {\n    const rowFn = (xSignal)=>{\n        return {\n            type: \"group\",\n            from: {\n                data\n            },\n            encode: {\n                update: {\n                    x: {\n                        signal: xSignal\n                    },\n                    y: {\n                        signal: `${(0, _constants.SignalNames).PlotOffsetTop} + ${(0, _constants.SignalNames).FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${(0, _constants.SignalNames).FacetPaddingTop} + ${(0, _constants.SignalNames).FacetPaddingBottom})`\n                    },\n                    height: {\n                        signal: sizeSignals.layoutHeight\n                    }\n                }\n            }\n        };\n    };\n    const header = rowFn((0, _constants.SignalNames).PlotOffsetLeft);\n    const footer = rowFn(`${(0, _constants.SignalNames).PlotOffsetLeft} + ${(0, _constants.SignalNames).PlotWidthOut} + ${(0, _constants.SignalNames).PlotOffsetRight} / 2`);\n    return {\n        header,\n        footer\n    };\n}\nfunction facetColumnHeaderFooter(data, sizeSignals, index) {\n    const colFn = (ySignal)=>{\n        return {\n            type: \"group\",\n            from: {\n                data\n            },\n            encode: {\n                update: {\n                    x: {\n                        signal: `(${index}) * (${sizeSignals.layoutWidth} + ${(0, _constants.SignalNames).FacetPaddingLeft}) + ${(0, _constants.SignalNames).FacetPaddingLeft} + ${(0, _constants.SignalNames).PlotOffsetLeft}`\n                    },\n                    y: {\n                        signal: ySignal\n                    },\n                    width: {\n                        signal: sizeSignals.layoutWidth\n                    }\n                }\n            }\n        };\n    };\n    //create group marks based on data sequences\n    const header = colFn(`${(0, _constants.SignalNames).PlotOffsetTop} / 2`);\n    const footer = colFn(`${(0, _constants.SignalNames).PlotOffsetTop} + ${(0, _constants.SignalNames).PlotHeightOut}`);\n    return {\n        header,\n        footer\n    };\n}\nfunction createSequence(dataName, countSignal) {\n    return {\n        name: dataName,\n        transform: [\n            {\n                type: \"sequence\",\n                start: 0,\n                stop: {\n                    signal: countSignal\n                }\n            }\n        ]\n    };\n}\n\n},{\"./scope\":\"91ogX\",\"./constants\":\"9PPhV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1PEiC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fill\", ()=>fill);\nparcelHelpers.export(exports, \"opacity\", ()=>opacity);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction fill(context, colorFieldName, scale) {\n    const { specColumns , insight , specViewOptions  } = context;\n    const colorColumn = specColumns.color;\n    return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n        field: (0, _expr.safeFieldName)(colorColumn.name)\n    } : {\n        scale,\n        field: colorColumn.quantitative ? (0, _expr.safeFieldName)(colorColumn.name) : colorFieldName\n    } : {\n        value: specViewOptions.colors.defaultCube\n    };\n}\nfunction opacity(context) {\n    const result = {\n        signal: (0, _constants.SignalNames).MarkOpacity\n    };\n    return result;\n}\n\n},{\"./constants\":\"9PPhV\",\"./expr\":\"f5d82\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gPmWz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"GlobalScope\", ()=>GlobalScope);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _scope = require(\"./scope\");\nclass GlobalScope {\n    constructor(props){\n        const { dataName , markGroup , scope , signals  } = props;\n        this.scope = scope;\n        this._markGroup = markGroup;\n        this.signals = signals;\n        this.data = (0, _scope.getDataByName)(scope.data, dataName).data;\n        this._markDataName = dataName;\n        this.offsets = {\n            x: \"0\",\n            y: \"0\",\n            h: (0, _constants.SignalNames).PlotHeightIn,\n            w: (0, _constants.SignalNames).PlotWidthIn\n        };\n        this.sizeSignals = {\n            layoutHeight: (0, _constants.SignalNames).PlotHeightIn,\n            layoutWidth: (0, _constants.SignalNames).PlotWidthIn\n        };\n        this.zSize = (0, _constants.SignalNames).PlotHeightIn;\n    }\n    get markDataName() {\n        return this._markDataName;\n    }\n    setMarkDataName(markDataName) {\n        this._markDataName = markDataName;\n    }\n    get markGroup() {\n        return this._markGroup;\n    }\n    setMarkGroup(markGroup) {\n        this._markGroup = markGroup;\n    }\n}\n\n},{\"./constants\":\"9PPhV\",\"./scope\":\"91ogX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e7Zx3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"layoutClasses\", ()=>layoutClasses);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _aggregateContainer = require(\"./aggregateContainer\");\nvar _aggregateSquare = require(\"./aggregateSquare\");\nvar _band = require(\"./band\");\nvar _cross = require(\"./cross\");\nvar _scatter = require(\"./scatter\");\nvar _square = require(\"./square\");\nvar _stack = require(\"./stack\");\nvar _strip = require(\"./strip\");\nvar _treemap = require(\"./treemap\");\nvar _wrap = require(\"./wrap\");\nconst layoutClasses = {\n    AggregateContainer: (0, _aggregateContainer.AggregateContainer),\n    AggregateSquare: (0, _aggregateSquare.AggregateSquare),\n    Band: (0, _band.Band),\n    Cross: (0, _cross.Cross),\n    Scatter: (0, _scatter.Scatter),\n    Square: (0, _square.Square),\n    Stack: (0, _stack.Stack),\n    Strip: (0, _strip.Strip),\n    Treemap: (0, _treemap.Treemap),\n    Wrap: (0, _wrap.Wrap)\n};\n\n},{\"./aggregateContainer\":\"bTVea\",\"./aggregateSquare\":\"dJs1e\",\"./band\":\"evXg8\",\"./cross\":\"4sYOu\",\"./scatter\":\"kXVJ3\",\"./square\":\"8xGbr\",\"./stack\":\"kMv58\",\"./strip\":\"djKt3\",\"./treemap\":\"nwSds\",\"./wrap\":\"3lWTe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bTVea\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AggregateContainer\", ()=>AggregateContainer);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nclass AggregateContainer extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const a = this.aggregation = this.getAggregation();\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            scale: `scale_${p}`,\n            extentData: `data_${p}_extent`,\n            offsets: `data_${p}_offsets`\n        };\n    }\n    getAggregateSumOp() {\n        if (this.aggregation === \"sum\") {\n            const fieldOp = {\n                field: (0, _expr.safeFieldName)(this.props.sumBy.name),\n                op: \"sum\",\n                as: (0, _constants.FieldNames).Sum\n            };\n            return fieldOp;\n        }\n    }\n    build() {\n        const { aggregation , names , props  } = this;\n        const { dock , globalScope , groupings , niceScale , parentScope , showAxes  } = props;\n        (0, _scope.addTransforms)(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, (0, _scope.getGroupBy)(groupings))), {\n            as: [\n                names.aggregateField\n            ]\n        }), {\n            type: \"extent\",\n            field: (0, _expr.safeFieldName)(names.aggregateField),\n            signal: names.globalAggregateExtentSignal\n        });\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: props.globalAggregateMaxExtentSignal,\n            update: `${names.globalAggregateExtentSignal}[1]`\n        });\n        const horizontal = dock === \"left\";\n        const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n        const offsets = {\n            x: parentScope.offsets.x,\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, dock === \"bottom\" ? groupScaled : \"\"),\n            h: horizontal ? parentScope.offsets.h : dock === \"top\" ? groupScaled : `${parentScope.offsets.h} - ${groupScaled}`,\n            w: horizontal ? groupScaled : parentScope.offsets.w\n        };\n        const scale = {\n            type: \"linear\",\n            name: names.scale,\n            domain: [\n                0,\n                {\n                    signal: props.globalAggregateMaxExtentSignal\n                }\n            ],\n            range: horizontal ? [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutWidth\n                }\n            ] : [\n                {\n                    signal: parentScope.sizeSignals.layoutHeight\n                },\n                0\n            ],\n            nice: niceScale,\n            zero: true,\n            reverse: dock === \"top\"\n        };\n        const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: props.globalAggregateMaxExtentScaledSignal,\n            update: dock === \"bottom\" ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}` : globalAggregateMaxExtentScaledValue\n        });\n        return {\n            offsets,\n            sizeSignals: horizontal ? {\n                layoutHeight: parentScope.sizeSignals.layoutHeight,\n                layoutWidth: null\n            } : {\n                layoutHeight: null,\n                layoutWidth: parentScope.sizeSignals.layoutWidth\n            },\n            globalScales: {\n                showAxes,\n                scales: {\n                    x: horizontal ? [\n                        scale\n                    ] : undefined,\n                    y: horizontal ? undefined : [\n                        scale\n                    ]\n                }\n            },\n            encodingRuleMap: horizontal ? {\n                x: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: parentScope.offsets.x\n                    }\n                ],\n                width: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ]\n            } : {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: dock === \"top\" ? parentScope.offsets.y : (0, _scope.addOffsets)(parentScope.offsets.y, parentScope.offsets.h)\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n    getTransforms(aggregation, groupby) {\n        const trans = {\n            type: \"joinaggregate\",\n            groupby: groupby.map((0, _expr.safeFieldName)),\n            ops: [\n                aggregation\n            ]\n        };\n        if (aggregation === \"sum\") trans.fields = [\n            this.props.sumBy.name\n        ].map((0, _expr.safeFieldName));\n        return trans;\n    }\n    getAggregation() {\n        const { props  } = this;\n        let s;\n        if (props.dock === \"left\") s = props.axesScales.x;\n        else s = props.axesScales.y;\n        switch(s.aggregate){\n            case \"sum\":\n                return \"sum\";\n            default:\n                return \"count\";\n        }\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../constants\":\"9PPhV\",\"../expr\":\"f5d82\",\"../scope\":\"91ogX\",\"../selection\":\"c6vR2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jm7Ki\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Layout\", ()=>Layout);\nclass Layout {\n    constructor(props){\n        this.props = props;\n        this.id = props.id;\n    }\n    getGrouping() {\n        return null;\n    }\n    getAggregateSumOp() {\n        return null;\n    }\n    build() {\n        throw \"Not implemented\";\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c6vR2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"testForCollapseSelection\", ()=>testForCollapseSelection);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nfunction testForCollapseSelection() {\n    return `datum.${(0, _constants.FieldNames).Collapsed}`;\n}\n\n},{\"./constants\":\"9PPhV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dJs1e\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AggregateSquare\", ()=>AggregateSquare);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nclass AggregateSquare extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const a = this.props.aggregation;\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            extentData: `data_${p}_extent`\n        };\n    }\n    build() {\n        const { names , props  } = this;\n        const { aggregation , globalScope , groupings , onBuild , parentScope  } = props;\n        const { sizeSignals  } = parentScope;\n        (0, _scope.addTransforms)(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, (0, _scope.getGroupBy)(groupings))), {\n            as: [\n                names.aggregateField\n            ]\n        }), {\n            type: \"extent\",\n            field: (0, _expr.safeFieldName)(names.aggregateField),\n            signal: names.globalAggregateExtentSignal\n        });\n        const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n        const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n        const squareMaxArea = `(${[\n            squareMaxSide,\n            squareMaxSide\n        ].join(\" * \")})`;\n        const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n        const squareArea = `(${[\n            squareMaxArea,\n            shrinkRatio\n        ].join(\" * \")})`;\n        const squareSide = `sqrt(${squareArea})`;\n        const localAggregateMaxExtentScaled = squareSide;\n        onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n        const offsets = {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n            h: squareSide,\n            w: squareSide\n        };\n        return {\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: offsets.y\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n    getTransforms(aggregation, groupby) {\n        const trans = {\n            type: \"joinaggregate\",\n            groupby: groupby.map((0, _expr.safeFieldName)),\n            ops: [\n                aggregation\n            ]\n        };\n        if (aggregation === \"sum\") trans.fields = [\n            this.props.sumBy.name\n        ].map((0, _expr.safeFieldName));\n        return trans;\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../expr\":\"f5d82\",\"../scope\":\"91ogX\",\"../selection\":\"c6vR2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"evXg8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Band\", ()=>Band);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _bin = require(\"../bin\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _signals = require(\"../signals\");\nclass Band extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `band_${this.id}`;\n        this.names = {\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            bandWidth: `${p}_bandwidth`,\n            accumulative: `${p}_accumulative`\n        };\n        this.bin = (0, _bin.binnable)(this.prefix, props.globalScope.data.name, props.groupby);\n    }\n    getGrouping() {\n        return this.bin.fields;\n    }\n    build() {\n        const { bin , names , props  } = this;\n        const { globalScope , minBandWidth , orientation , parentScope , showAxes  } = props;\n        const binField = bin.fields[0];\n        if (bin.native === false) {\n            (0, _scope.addSignals)(globalScope.scope, ...bin.signals);\n            (0, _scope.addTransforms)(globalScope.data, ...bin.transforms);\n            (0, _scope.addData)(globalScope.scope, bin.dataSequence);\n        }\n        //TODO don't add this, use existing dataset\n        (0, _scope.addData)(globalScope.scope, {\n            name: names.accumulative,\n            source: bin.fullScaleDataname,\n            transform: [\n                {\n                    type: \"aggregate\",\n                    groupby: this.getGrouping().map((0, _expr.safeFieldName)),\n                    ops: [\n                        \"count\"\n                    ]\n                }\n            ]\n        });\n        const horizontal = orientation === \"horizontal\";\n        const minCellSignal = horizontal ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n        (0, _signals.modifySignal)(minCellSignal, \"max\", `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: names.bandWidth,\n            update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`\n        });\n        const scales = this.getScales(bin, horizontal);\n        let encodingRuleMap;\n        if (!props.excludeEncodingRuleMap) encodingRuleMap = horizontal ? {\n            x: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    signal: parentScope.offsets.x\n                }\n            ],\n            width: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                }\n            ]\n        } : {\n            y: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    signal: (0, _scope.addOffsets)(parentScope.offsets.y, parentScope.offsets.h)\n                }\n            ],\n            height: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                }\n            ]\n        };\n        return {\n            offsets: this.getOffset(horizontal, binField),\n            sizeSignals: horizontal ? {\n                layoutHeight: names.bandWidth,\n                layoutWidth: parentScope.sizeSignals.layoutWidth\n            } : {\n                layoutHeight: parentScope.sizeSignals.layoutHeight,\n                layoutWidth: names.bandWidth\n            },\n            globalScales: {\n                showAxes,\n                scales: {\n                    x: horizontal ? undefined : scales,\n                    y: horizontal ? scales : undefined\n                }\n            },\n            encodingRuleMap\n        };\n    }\n    getOffset(horizontal, binField) {\n        const { names , props  } = this;\n        const { parentScope  } = props;\n        return {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, horizontal ? \"\" : `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, horizontal ? `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])` : \"\"),\n            h: horizontal ? names.bandWidth : parentScope.offsets.h,\n            w: horizontal ? parentScope.offsets.w : names.bandWidth\n        };\n    }\n    getScales(bin, horizontal) {\n        const { names  } = this;\n        const { parentScope  } = this.props;\n        const binField = (0, _expr.safeFieldName)(bin.fields[0]);\n        const scales = [];\n        let bandScale;\n        if (horizontal) bandScale = {\n            type: \"band\",\n            name: names.yScale,\n            range: [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutHeight\n                }\n            ],\n            padding: 0.1,\n            domain: {\n                data: bin.domainDataName,\n                field: binField,\n                sort: true\n            },\n            reverse: true\n        };\n        else bandScale = {\n            type: \"band\",\n            name: names.xScale,\n            range: [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutWidth\n                }\n            ],\n            padding: 0.1,\n            domain: {\n                data: bin.domainDataName,\n                field: binField,\n                sort: true\n            }\n        };\n        scales.push(bandScale);\n        return scales;\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../bin\":\"7Yncy\",\"../expr\":\"f5d82\",\"../scope\":\"91ogX\",\"../selection\":\"c6vR2\",\"../signals\":\"62U7A\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Yncy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"binnable\", ()=>binnable);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction binnable(prefix, domainDataName, discreteColumn) {\n    const { column , defaultBins , maxbins , maxbinsSignalDisplayName , maxbinsSignalName  } = discreteColumn;\n    if (column.quantitative) {\n        const field = `${prefix}_bin_${(0, _expr.exprSafeFieldName)(column.name)}`;\n        const fieldEnd = `${field}_end`;\n        const binSignal = `${field}_bins`;\n        const extentSignal = `${field}_bin_extent`;\n        domainDataName = `${field}_sequence`; //override the data name\n        const extentTransform = {\n            type: \"extent\",\n            field: (0, _expr.safeFieldName)(column.name),\n            signal: extentSignal\n        };\n        const maxbinsSignal = {\n            name: maxbinsSignalName,\n            value: defaultBins,\n            bind: {\n                name: maxbinsSignalDisplayName,\n                debounce: 50,\n                input: \"range\",\n                min: 1,\n                max: maxbins,\n                step: 1\n            }\n        };\n        const binTransform = {\n            type: \"bin\",\n            field: (0, _expr.safeFieldName)(column.name),\n            as: [\n                field,\n                fieldEnd, \n            ],\n            signal: binSignal,\n            extent: {\n                signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`\n            },\n            maxbins: {\n                signal: maxbinsSignalName\n            }\n        };\n        const dataSequence = {\n            name: domainDataName,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: {\n                        signal: `${binSignal}.start`\n                    },\n                    stop: {\n                        signal: `${binSignal}.stop`\n                    },\n                    step: {\n                        signal: `${binSignal}.step`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.data\",\n                    as: field\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data + ${binSignal}.step`,\n                    as: fieldEnd\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"row_number\"\n                    ],\n                    as: [\n                        (0, _constants.FieldNames).Ordinal\n                    ]\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data === ${binSignal}.start`,\n                    as: (0, _constants.FieldNames).First\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                    as: (0, _constants.FieldNames).Last\n                }\n            ]\n        };\n        const augmentBinnable = {\n            discreteColumn,\n            native: false,\n            transforms: [\n                extentTransform,\n                binTransform\n            ],\n            fields: [\n                field,\n                fieldEnd\n            ],\n            binSignal,\n            dataSequence,\n            domainDataName,\n            signals: [\n                maxbinsSignal\n            ],\n            fullScaleDataname: dataSequence.name\n        };\n        return augmentBinnable;\n    } else {\n        const nativeBinnable = {\n            discreteColumn,\n            native: true,\n            fields: [\n                column.name\n            ],\n            domainDataName,\n            fullScaleDataname: domainDataName\n        };\n        return nativeBinnable;\n    }\n}\n\n},{\"./constants\":\"9PPhV\",\"./expr\":\"f5d82\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4sYOu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Cross\", ()=>Cross);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _bin = require(\"../bin\");\nvar _constants = require(\"../constants\");\nvar _facetSearch = require(\"../facetSearch\");\nvar _facetTitle = require(\"../facetTitle\");\nvar _ordinal = require(\"../ordinal\");\nvar _scope = require(\"../scope\");\nvar _signals = require(\"../signals\");\nclass Cross extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `cross_${this.id}`;\n        this.binX = (0, _bin.binnable)(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n        this.binY = (0, _bin.binnable)(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n        this.names = {\n            facetDataName: `data_${p}_facet`,\n            searchUnion: `data_${p}_search`,\n            dimScale: `scale_${p}`,\n            dimCount: `${p}_count`,\n            dimCategorical: `data_${p}_cat`,\n            dimCellSize: `${p}_cell_size`,\n            dimCellSizeCalc: `${p}_cell_calc`\n        };\n    }\n    getGrouping() {\n        return this.binX.fields.concat(this.binY.fields);\n    }\n    build() {\n        const { binX , binY , names , prefix , props  } = this;\n        const { axisTextColor , colRowTitles , globalScope , parentScope  } = props;\n        const titles = {\n            x: {\n                dataName: null,\n                quantitative: null\n            },\n            y: {\n                dataName: null,\n                quantitative: null\n            }\n        };\n        const dx = {\n            dim: \"x\",\n            bin: binX,\n            sortOrder: \"ascending\",\n            size: parentScope.sizeSignals.layoutWidth,\n            layout: parentScope.sizeSignals.layoutWidth,\n            min: globalScope.signals.minCellWidth.name,\n            out: globalScope.signals.plotWidthOut,\n            offset: (0, _constants.SignalNames).FacetPaddingLeft,\n            padding: (0, _constants.SignalNames).FacetPaddingLeft,\n            dataOut: null,\n            scaleName: null,\n            position: null\n        };\n        const dy = {\n            dim: \"y\",\n            bin: binY,\n            sortOrder: \"ascending\",\n            size: parentScope.sizeSignals.layoutHeight,\n            layout: parentScope.sizeSignals.layoutHeight,\n            min: globalScope.signals.minCellHeight.name,\n            out: globalScope.signals.plotHeightOut,\n            offset: (0, _constants.SignalNames).FacetPaddingTop,\n            padding: `(${(0, _constants.SignalNames).FacetPaddingTop} + ${(0, _constants.SignalNames).FacetPaddingBottom})`,\n            dataOut: null,\n            scaleName: null,\n            position: null\n        };\n        const dimensions = [\n            dx,\n            dy\n        ];\n        dimensions.forEach((d)=>{\n            const { bin , dim , padding , sortOrder  } = d;\n            let data;\n            let dataName;\n            let countSignal;\n            let scale;\n            const titleSource = titles[dim];\n            if (bin.native === false) {\n                (0, _scope.addSignals)(globalScope.scope, ...bin.signals);\n                (0, _scope.addTransforms)(globalScope.data, ...bin.transforms);\n                (0, _scope.addData)(globalScope.scope, bin.dataSequence);\n                (0, _scope.addTransforms)(bin.dataSequence, {\n                    type: \"formula\",\n                    expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                    as: (0, _constants.FieldNames).Contains\n                });\n                data = bin.dataSequence;\n                dataName = bin.dataSequence.name;\n                countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                scale = (0, _ordinal.ordinalScale)(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                titleSource.dataName = bin.dataSequence.name;\n            } else {\n                dataName = globalScope.markDataName;\n                const ord = (0, _ordinal.createOrdinals)(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                data = ord.data;\n                (0, _scope.addData)(globalScope.scope, ord.data);\n                countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                scale = ord.scale;\n                titleSource.dataName = ord.data.name;\n            }\n            titleSource.quantitative = bin.discreteColumn.column.quantitative;\n            d.dataOut = data;\n            d.scaleName = scale.name;\n            (0, _scope.addTransforms)(data, {\n                type: \"formula\",\n                expr: (0, _facetSearch.serializeAsVegaExpression)(bin, (0, _constants.FieldNames).First, (0, _constants.FieldNames).Last),\n                as: (0, _constants.FieldNames).FacetSearch\n            }, {\n                type: \"formula\",\n                expr: (0, _facetSearch.displayBin)(bin),\n                as: (0, _constants.FieldNames).FacetTitle\n            });\n            (0, _scope.addScales)(globalScope.scope, scale);\n            const count = `${names.dimCount}_${dim}`;\n            const calc = `${names.dimCellSizeCalc}_${dim}`;\n            const size = `${names.dimCellSize}_${dim}`;\n            (0, _scope.addSignals)(globalScope.scope, {\n                name: count,\n                update: countSignal\n            });\n            (0, _scope.addSignals)(globalScope.scope, {\n                name: calc,\n                update: `${d.layout} / ${count}`\n            }, {\n                name: size,\n                update: `max(${d.min}, (${calc} - ${padding}))`\n            });\n            (0, _signals.modifySignal)(d.out, \"max\", `((${size} + ${padding}) * ${count})`);\n            d.position = this.dimensionOffset(d);\n        });\n        const groupRow = {\n            type: \"group\",\n            encode: {\n                update: {\n                    y: {\n                        signal: dy.position\n                    }\n                }\n            },\n            from: {\n                data: dy.dataOut.name\n            },\n            data: [\n                {\n                    name: names.searchUnion,\n                    source: dx.dataOut.name,\n                    transform: [\n                        {\n                            type: \"formula\",\n                            expr: `[datum[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}], merge(parent[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}], { clause: '&&'})]`,\n                            as: (0, _constants.FieldNames).FacetSearch\n                        }\n                    ]\n                }\n            ]\n        };\n        const groupCol = {\n            style: \"cell\",\n            name: prefix,\n            type: \"group\",\n            encode: {\n                update: {\n                    height: {\n                        signal: `${names.dimCellSize}_y`\n                    },\n                    width: {\n                        signal: `${names.dimCellSize}_x`\n                    },\n                    x: {\n                        signal: dx.position\n                    }\n                }\n            },\n            from: {\n                data: names.searchUnion\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, groupRow);\n        (0, _scope.addMarks)(groupRow, groupCol);\n        const offsets = {\n            x: this.dimensionOffset(dx),\n            y: this.dimensionOffset(dy),\n            h: `${names.dimCellSize}_y`,\n            w: `${names.dimCellSize}_x`\n        };\n        const sizeSignals = {\n            layoutHeight: `${names.dimCellSize}_y`,\n            layoutWidth: `${names.dimCellSize}_x`,\n            colCount: `${names.dimCount}_x`,\n            rowCount: `${names.dimCount}_y`\n        };\n        if (colRowTitles) (0, _facetTitle.addFacetColRowTitles)(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n        return {\n            facetScope: groupCol,\n            offsets,\n            sizeSignals,\n            titles\n        };\n    }\n    dimensionOffset(d) {\n        const { names  } = this;\n        return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../bin\":\"7Yncy\",\"../constants\":\"9PPhV\",\"../facetSearch\":\"iXWh2\",\"../facetTitle\":\"lkHaR\",\"../ordinal\":\"6Rqt5\",\"../scope\":\"91ogX\",\"../signals\":\"62U7A\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iXWh2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"displayBin\", ()=>displayBin);\nparcelHelpers.export(exports, \"serializeAsVegaExpression\", ()=>serializeAsVegaExpression);\nfunction displayBin(bin) {\n    const val = (index)=>`datum[${JSON.stringify(bin.fields[index])}]`;\n    return bin.discreteColumn.column.quantitative ? `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')` : val(0);\n}\nfunction obj(nameValues, clause) {\n    if (clause) nameValues = [\n        clause,\n        ...nameValues\n    ];\n    return `{${nameValues.join()}}`;\n}\nfunction serializeAsVegaExpression(bin, firstFieldName, lastFieldName, clause) {\n    if (bin.discreteColumn.column.quantitative) {\n        const low = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'>='\",\n            `value:datum[${JSON.stringify(bin.fields[0])}]`\n        ];\n        const high = [\n            \"clause:'&&'\",\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'<'\",\n            `value:datum[${JSON.stringify(bin.fields[1])}]`\n        ];\n        return obj([\n            `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`\n        ], clause);\n    } else {\n        const exact = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'=='\",\n            `value:datum[${JSON.stringify(bin.fields[0])}]`\n        ];\n        return obj([\n            `expressions:[${obj(exact)}]`\n        ], clause);\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6Rqt5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createOrdinals\", ()=>createOrdinals);\nparcelHelpers.export(exports, \"ordinalScale\", ()=>ordinalScale);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction createOrdinals(source, prefix, binFields, sortOrder) {\n    const _binFields = binFields.map((0, _expr.safeFieldName));\n    const dataName = `${prefix}_bin_order`;\n    const data = {\n        name: dataName,\n        source,\n        transform: [\n            {\n                type: \"aggregate\",\n                groupby: _binFields\n            },\n            {\n                type: \"collect\",\n                sort: {\n                    field: _binFields,\n                    order: _binFields.map((f)=>sortOrder)\n                }\n            },\n            {\n                type: \"window\",\n                ops: [\n                    \"row_number\"\n                ],\n                as: [\n                    (0, _constants.FieldNames).Ordinal\n                ]\n            }\n        ]\n    };\n    return {\n        data,\n        scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields)\n    };\n}\nfunction ordinalScale(dataName, scaleName, binFields) {\n    return {\n        type: \"ordinal\",\n        name: scaleName,\n        domain: {\n            data: dataName,\n            field: (0, _expr.safeFieldName)(binFields[0])\n        },\n        range: {\n            data: dataName,\n            field: (0, _constants.FieldNames).Ordinal\n        }\n    };\n}\n\n},{\"./constants\":\"9PPhV\",\"./expr\":\"f5d82\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kXVJ3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Scatter\", ()=>Scatter);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nvar _expr = require(\"../expr\");\nvar _scales = require(\"../scales\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nclass Scatter extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `scatter_${this.id}`;\n        this.names = {\n            aggregateData: `data_${p}_aggregate`,\n            markData: `data_${p}_mark`,\n            sizeExtent: `${p}_sizeExtent`,\n            sizeRange: `${p}_sizeRange`,\n            sizeScale: `${p}_sizeScale`,\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names , prefix , props  } = this;\n        const { globalScope , parentScope , scatterPointScaleDisplay , size , x , y , z , zGrounded  } = props;\n        const qsize = size && size.quantitative && size;\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: (0, _constants.SignalNames).PointScale,\n            value: 5,\n            bind: {\n                name: scatterPointScaleDisplay,\n                debounce: 50,\n                input: \"range\",\n                min: 1,\n                max: 10,\n                step: 1\n            }\n        }, {\n            name: (0, _constants.SignalNames).ZGrounded,\n            value: false,\n            bind: {\n                name: zGrounded,\n                input: \"checkbox\"\n            }\n        });\n        if (qsize) {\n            (0, _scope.addTransforms)(globalScope.data, {\n                type: \"extent\",\n                field: (0, _expr.safeFieldName)(qsize.name),\n                signal: names.sizeExtent\n            });\n            (0, _scope.addScales)(globalScope.scope, {\n                name: names.sizeScale,\n                type: \"linear\",\n                domain: [\n                    0,\n                    {\n                        signal: `${names.sizeExtent}[1]`\n                    }\n                ],\n                range: [\n                    0,\n                    {\n                        signal: names.sizeRange\n                    }\n                ]\n            });\n            (0, _scope.addSignals)(globalScope.scope, {\n                name: names.sizeRange,\n                update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${(0, _defaults.scatterSizedDiv)}`\n            });\n        }\n        (0, _scope.addData)(globalScope.scope, {\n            name: names.markData,\n            source: globalScope.markDataName,\n            transform: [\n                x,\n                y,\n                z\n            ].map((c)=>{\n                if (!c || !c.quantitative) return;\n                const t = {\n                    type: \"filter\",\n                    expr: `isValid(datum[${JSON.stringify(c.name)}])`\n                };\n                return t;\n            }).filter(Boolean)\n        });\n        globalScope.setMarkDataName(names.markData);\n        const globalScales = {\n            showAxes: true,\n            scales: {}\n        };\n        const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n        const sizeValueSignal = qsize ? `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${(0, _constants.SignalNames).PointScale}` : (0, _constants.SignalNames).PointScale;\n        const update = Object.assign({\n            height: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                },\n                {\n                    signal: sizeValueSignal\n                }\n            ],\n            width: {\n                signal: sizeValueSignal\n            }\n        }, z && {\n            z: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                },\n                {\n                    signal: `${(0, _constants.SignalNames).ZGrounded} ? 0 : ${zValue}`\n                }\n            ],\n            depth: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                },\n                {\n                    signal: `${(0, _constants.SignalNames).ZGrounded} ? ${zValue} : ${sizeValueSignal}`\n                }\n            ]\n        });\n        const columnSignals = [\n            {\n                column: x,\n                xyz: \"x\",\n                scaleName: names.xScale,\n                reverse: false,\n                signal: parentScope.sizeSignals.layoutWidth\n            },\n            {\n                column: y,\n                xyz: \"y\",\n                scaleName: names.yScale,\n                reverse: true,\n                signal: parentScope.sizeSignals.layoutHeight\n            },\n            {\n                column: z,\n                xyz: \"z\",\n                scaleName: names.zScale,\n                reverse: false,\n                signal: `(${globalScope.zSize}) * ${(0, _constants.SignalNames).ZProportion}`\n            }\n        ];\n        columnSignals.forEach((cs)=>{\n            const { column , reverse , scaleName , signal , xyz  } = cs;\n            if (!column) return;\n            let scale;\n            if (column.quantitative) scale = (0, _scales.linearScale)(scaleName, globalScope.data.name, column.name, [\n                0,\n                {\n                    signal\n                }\n            ], reverse, false);\n            else scale = (0, _scales.pointScale)(scaleName, globalScope.data.name, [\n                0,\n                {\n                    signal\n                }\n            ], column.name, reverse);\n            globalScales.scales[xyz] = [\n                scale\n            ];\n        });\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, mark);\n        return {\n            offsets: {\n                x: (0, _scope.addOffsets)(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                y: (0, _scope.addOffsets)(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                h: sizeValueSignal,\n                w: sizeValueSignal\n            },\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            globalScales,\n            mark,\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: (0, _scope.addOffsets)(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight)\n                    }\n                ]\n            }\n        };\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../constants\":\"9PPhV\",\"../defaults\":\"lzTCE\",\"../expr\":\"f5d82\",\"../scales\":\"1eNTN\",\"../scope\":\"91ogX\",\"../selection\":\"c6vR2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8xGbr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Square\", ()=>Square);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _zBase = require(\"../zBase\");\nclass Square extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `square_${this.id}`;\n        this.names = {\n            bandWidth: this.getBandWidth(),\n            maxGroupField: `${p}_max_group`,\n            maxGroupSignal: `${p}_max_grouping`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names , prefix , props  } = this;\n        const { fillDirection , globalScope , groupings , parentScope , collapseYHeight , sortBy , z  } = props;\n        const zScale = (0, _zBase.addZScale)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        (0, _scope.addTransforms)(globalScope.data, Object.assign({\n            type: \"stack\",\n            groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName)),\n            as: [\n                names.stack0,\n                names.stack1\n            ]\n        }, sortBy && {\n            sort: {\n                field: (0, _expr.safeFieldName)(sortBy.name),\n                order: \"ascending\"\n            }\n        }));\n        const { gap , levelSize , size , squaresPerBand  } = this.addSignals();\n        const heightSignal = {\n            signal: fillDirection === \"down-right\" ? size : levelSize\n        };\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    height: collapseYHeight ? [\n                        {\n                            test: (0, _selection.testForCollapseSelection)(),\n                            value: 0\n                        },\n                        heightSignal\n                    ] : heightSignal,\n                    width: {\n                        signal: fillDirection === \"down-right\" ? levelSize : size\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, _selection.testForCollapseSelection)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, _expr.safeFieldName)(z.name)\n                        }\n                    ]\n                })\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, mark);\n        const { tx , ty  } = this.transformXY(gap, levelSize, squaresPerBand);\n        return Object.assign(Object.assign(Object.assign({}, z && {\n            globalScales: {\n                showAxes: true,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            }\n        }), {\n            offsets: {\n                x: (0, _scope.addOffsets)(parentScope.offsets.x, tx.expr),\n                y: (0, _scope.addOffsets)(parentScope.offsets.y, ty.expr),\n                h: size,\n                w: size\n            },\n            mark,\n            sizeSignals: {\n                layoutHeight: size,\n                layoutWidth: size\n            }\n        }), collapseYHeight && {\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: parentScope.offsets.y\n                    }\n                ]\n            }\n        });\n    }\n    getBandWidth() {\n        const { offsets  } = this.props.parentScope;\n        switch(this.props.fillDirection){\n            case \"down-right\":\n                return offsets.h;\n            default:\n                return offsets.w;\n        }\n    }\n    addSignals() {\n        const { names , props  } = this;\n        const { fillDirection , globalScope , groupings , parentScope  } = props;\n        let { maxGroupedFillSize , maxGroupedUnits  } = props;\n        if (!maxGroupedUnits) {\n            if (groupings) {\n                (0, _scope.addTransforms)(globalScope.data, {\n                    type: \"joinaggregate\",\n                    groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName)),\n                    ops: [\n                        \"count\"\n                    ],\n                    as: [\n                        names.maxGroupField\n                    ]\n                }, {\n                    type: \"extent\",\n                    field: names.maxGroupField,\n                    signal: names.maxGroupSignal\n                });\n                maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n            } else maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n        }\n        if (!maxGroupedFillSize) maxGroupedFillSize = fillDirection === \"down-right\" ? parentScope.offsets.w : parentScope.offsets.h;\n        const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n        const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n        const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n        const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n        const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n        const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n        return {\n            gap,\n            levelSize,\n            size,\n            squaresPerBand\n        };\n    }\n    transformXY(gap, levelSize, squaresPerBand) {\n        const { names , prefix  } = this;\n        const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n        const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n        const { fillDirection , parentScope  } = this.props;\n        const tx = {\n            type: \"formula\",\n            expr: null,\n            as: `${prefix}_${(0, _constants.FieldNames).OffsetX}`\n        };\n        const ty = {\n            type: \"formula\",\n            expr: null,\n            as: `${prefix}_${(0, _constants.FieldNames).OffsetY}`\n        };\n        switch(fillDirection){\n            case \"down-right\":\n                tx.expr = `${level} * (${levelSize} + ${gap})`;\n                ty.expr = compartment;\n                break;\n            case \"right-up\":\n                tx.expr = compartment;\n                ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                break;\n            case \"right-down\":\n            default:\n                tx.expr = compartment;\n                ty.expr = `${level} * (${levelSize} + ${gap})`;\n                break;\n        }\n        return {\n            tx,\n            ty\n        };\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../constants\":\"9PPhV\",\"../expr\":\"f5d82\",\"../scope\":\"91ogX\",\"../selection\":\"c6vR2\",\"../zBase\":\"7rdRN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7rdRN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addZScale\", ()=>addZScale);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _scales = require(\"./scales\");\nfunction addZScale(z, zSize, dataName, zScaleName) {\n    if (z) {\n        const zRange = [\n            0,\n            {\n                signal: `(${zSize}) * ${(0, _constants.SignalNames).ZProportion}`\n            }\n        ];\n        const scale = z.quantitative ? (0, _scales.linearScale)(zScaleName, dataName, z.name, zRange, false, true) : (0, _scales.pointScale)(zScaleName, dataName, zRange, z.name, false);\n        return scale;\n    }\n}\n\n},{\"./constants\":\"9PPhV\",\"./scales\":\"1eNTN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kMv58\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Stack\", ()=>Stack);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nclass Stack extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `stack_${this.id}`;\n        this.names = {\n            cube: `${p}_cube`,\n            globalDataName: `data_${p}_count`,\n            globalExtent: `${p}_global_extent`,\n            levelDataName: `data_${p}_level`,\n            count: `${p}_count`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            sequence: `data_${p}_sequence`,\n            sides: `${p}_sides`,\n            size: `${p}_size`,\n            squared: `${p}_squared`,\n            maxCount: `${p}_maxCount`,\n            maxLevels: `${p}_maxLevels`,\n            zScale: `${p}_zScale`\n        };\n    }\n    build() {\n        const { names , props  } = this;\n        const { globalScope , groupings , parentScope , sort  } = props;\n        const { sizeSignals  } = parentScope;\n        (0, _scope.addTransforms)(globalScope.data, {\n            type: \"joinaggregate\",\n            groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName)),\n            ops: [\n                \"count\"\n            ],\n            as: [\n                names.count\n            ]\n        }, {\n            type: \"extent\",\n            field: names.count,\n            signal: names.globalExtent\n        }, Object.assign({\n            type: \"stack\",\n            groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName)),\n            as: [\n                names.stack0,\n                names.stack1\n            ]\n        }, sort && {\n            sort: {\n                field: (0, _expr.safeFieldName)(sort.name),\n                order: \"ascending\"\n            }\n        }));\n        (0, _scope.addData)(globalScope.scope, {\n            name: names.sequence,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: 1,\n                    stop: {\n                        signal: `max(sqrt(${names.globalExtent}[1]),2)`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.data * datum.data\",\n                    as: \"squared\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                    as: \"maxlevels\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                    as: \"side\"\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.side * datum.maxlevels + datum.maxlevels - 1\",\n                    as: \"sidecubeheight\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                    as: \"heightmatch\"\n                },\n                {\n                    type: \"collect\",\n                    sort: {\n                        field: \"heightmatch\",\n                        order: \"ascending\"\n                    }\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"row_number\"\n                    ]\n                },\n                {\n                    type: \"filter\",\n                    expr: \"datum.row_number === 1\"\n                }\n            ]\n        });\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: names.size,\n            update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`\n        }, {\n            name: names.squared,\n            update: `data('${names.sequence}')[0].squared`\n        }, {\n            name: names.sides,\n            update: `sqrt(${names.squared})`\n        }, {\n            name: names.cube,\n            update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`\n        }, {\n            name: names.maxLevels,\n            update: `data('${names.sequence}')[0].maxlevels`\n        }, {\n            name: names.maxCount,\n            update: `${names.maxLevels} * ${names.squared}`\n        });\n        const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n        const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n        const cubeX = `(${layerOrdinal} % ${names.sides})`;\n        const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n        const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n        const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n        const offsets = {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n            h: names.size,\n            w: names.size\n        };\n        const mark = {\n            type: \"rect\",\n            from: {\n                data: this.names.levelDataName\n            },\n            encode: {\n                update: {\n                    z: {\n                        signal: `${zLevel} * (${names.cube} + 1)`\n                    },\n                    height: {\n                        signal: names.cube\n                    },\n                    width: {\n                        signal: names.cube\n                    },\n                    depth: {\n                        signal: names.cube\n                    }\n                }\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, mark);\n        const zScale = {\n            type: \"linear\",\n            name: names.zScale,\n            domain: [\n                0,\n                {\n                    signal: names.maxCount\n                }\n            ],\n            range: [\n                0,\n                {\n                    signal: `${names.maxLevels} * (${names.cube} + 1) - 1`\n                }\n            ],\n            nice: false\n        };\n        return {\n            offsets,\n            mark,\n            sizeSignals: {\n                layoutHeight: names.size,\n                layoutWidth: names.size\n            },\n            globalScales: {\n                showAxes: true,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            },\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: parentScope.offsets.y\n                    }\n                ],\n                z: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ],\n                depth: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../expr\":\"f5d82\",\"../scope\":\"91ogX\",\"../selection\":\"c6vR2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"djKt3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Strip\", ()=>Strip);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _zBase = require(\"../zBase\");\nclass Strip extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `strip_${this.id}`;\n        this.names = {\n            firstField: `${p}${(0, _constants.FieldNames).First}`,\n            lastField: `${p}${(0, _constants.FieldNames).Last}`,\n            valueField: `${p}${(0, _constants.FieldNames).Value}`,\n            scale: `scale_${p}`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names , prefix , props  } = this;\n        const { addPercentageScale , globalScope , groupings , orientation , size , sort , sortOrder , parentScope , z  } = props;\n        const zScale = (0, _zBase.addZScale)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        const horizontal = orientation === \"horizontal\";\n        const transform = [];\n        if (sort) transform.push({\n            type: \"collect\",\n            sort: {\n                field: (0, _expr.safeFieldName)(sort.name),\n                order: sortOrder\n            }\n        });\n        let stackField;\n        if (size) {\n            stackField = size.name;\n            transform.push({\n                type: \"filter\",\n                expr: `datum[${JSON.stringify(size.name)}] > 0`\n            });\n        } else {\n            stackField = names.valueField;\n            transform.push({\n                type: \"formula\",\n                expr: \"1\",\n                as: stackField\n            });\n        }\n        const stackTransform = {\n            type: \"stack\",\n            field: (0, _expr.safeFieldName)(stackField),\n            offset: \"normalize\",\n            as: [\n                names.firstField,\n                names.lastField\n            ]\n        };\n        if (groupings.length) stackTransform.groupby = (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName));\n        transform.push(stackTransform);\n        (0, _scope.addTransforms)(globalScope.data, ...transform);\n        const span = [\n            names.lastField,\n            names.firstField\n        ].map((f)=>`datum[${JSON.stringify(f)}]`).join(\" - \");\n        const offsets = {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, horizontal ? `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})` : \"\"),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, horizontal ? \"\" : `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n            h: horizontal ? parentScope.offsets.h : `(${span}) * (${parentScope.offsets.h})`,\n            w: horizontal ? `(${span}) * (${parentScope.offsets.w})` : parentScope.offsets.w\n        };\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    height: {\n                        signal: offsets.h\n                    },\n                    width: {\n                        signal: offsets.w\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, _selection.testForCollapseSelection)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, _expr.safeFieldName)(z.name)\n                        }\n                    ]\n                })\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, mark);\n        let percentageScale;\n        if (addPercentageScale) percentageScale = [\n            {\n                type: \"linear\",\n                name: names.scale,\n                domain: [\n                    0,\n                    100\n                ],\n                range: horizontal ? [\n                    0,\n                    {\n                        signal: parentScope.sizeSignals.layoutWidth\n                    }\n                ] : [\n                    {\n                        signal: parentScope.sizeSignals.layoutHeight\n                    },\n                    0\n                ]\n            }\n        ];\n        return {\n            globalScales: {\n                showAxes: true,\n                scales: {\n                    x: horizontal ? percentageScale : undefined,\n                    y: horizontal ? undefined : percentageScale,\n                    z: zScale && [\n                        zScale\n                    ]\n                }\n            },\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            mark\n        };\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../constants\":\"9PPhV\",\"../expr\":\"f5d82\",\"../scope\":\"91ogX\",\"../selection\":\"c6vR2\",\"../zBase\":\"7rdRN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"nwSds\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Treemap\", ()=>Treemap);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _zBase = require(\"../zBase\");\nclass Treemap extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `treemap_${this.id}`;\n        this.names = {\n            dataName: `data_${p}`,\n            dataHeightWidth: `data_${p}_hw`,\n            dataExtents: `data_${p}_extents`,\n            dataFacet: `data_${p}_facet`,\n            dataFacetMark: `data_${p}_facetMark`,\n            fieldChildren: `${p}_children`,\n            fieldDepth: `${p}_depth`,\n            fieldX0: `${p}_x0`,\n            fieldX1: `${p}_x1`,\n            fieldY0: `${p}_y0`,\n            fieldY1: `${p}_y1`,\n            fieldHeight: `${p}_h`,\n            fieldWidth: `${p}_w`,\n            heightExtent: `${p}_heightExtent`,\n            widthExtent: `${p}_widthExtent`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names , props  } = this;\n        const { globalScope , parentScope , treeMapMethod , z  } = props;\n        const zScale = (0, _zBase.addZScale)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        const offsets = {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, fn(names.fieldX0)),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, fn(names.fieldY0)),\n            h: subtract(names.fieldY1, names.fieldY0),\n            w: subtract(names.fieldX1, names.fieldX0)\n        };\n        const mark = this.transformedMark(offsets);\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: (0, _constants.SignalNames).TreeMapMethod,\n            value: \"squarify\",\n            bind: {\n                name: treeMapMethod,\n                input: \"select\",\n                options: [\n                    \"squarify\",\n                    \"binary\"\n                ]\n            }\n        });\n        return Object.assign(Object.assign({}, z && {\n            globalScales: {\n                showAxes: true,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            }\n        }), {\n            mark,\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            }\n        });\n    }\n    transformedMark(offsets) {\n        const { names , props  } = this;\n        const { globalScope , groupings , parentScope  } = props;\n        if (groupings.length) {\n            //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n            (0, _scope.addData)(globalScope.scope, {\n                name: names.dataHeightWidth,\n                source: globalScope.markDataName,\n                transform: [\n                    {\n                        type: \"formula\",\n                        expr: parentScope.offsets.h,\n                        as: names.fieldHeight\n                    },\n                    {\n                        type: \"formula\",\n                        expr: parentScope.offsets.w,\n                        as: names.fieldWidth\n                    }\n                ]\n            });\n            const treemapData = {\n                name: names.dataFacetMark,\n                source: names.dataFacet\n            };\n            const facets = {\n                type: \"group\",\n                from: {\n                    facet: {\n                        name: names.dataFacet,\n                        data: names.dataHeightWidth,\n                        groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName))\n                    }\n                },\n                data: [\n                    {\n                        name: names.dataExtents,\n                        source: names.dataFacet,\n                        transform: [\n                            {\n                                type: \"extent\",\n                                field: names.fieldHeight,\n                                signal: names.heightExtent\n                            },\n                            {\n                                type: \"extent\",\n                                field: names.fieldWidth,\n                                signal: names.widthExtent\n                            }\n                        ]\n                    },\n                    treemapData\n                ]\n            };\n            globalScope.setMarkDataName(names.dataFacetMark);\n            (0, _scope.addMarks)(globalScope.markGroup, facets);\n            //assign new markgroup after adding mark to original group\n            globalScope.setMarkGroup(facets);\n            this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n            return this.addMark(offsets, facets, globalScope.markDataName);\n        } else {\n            this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n            return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n        }\n    }\n    addMark(offsets, markParent, markDataName) {\n        const { names , prefix , props  } = this;\n        const { z  } = props;\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    width: {\n                        signal: offsets.w\n                    },\n                    height: {\n                        signal: offsets.h\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, _selection.testForCollapseSelection)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, _expr.safeFieldName)(z.name)\n                        }\n                    ]\n                })\n            }\n        };\n        (0, _scope.addMarks)(markParent, mark);\n        return mark;\n    }\n    treemapTransform(treemapData, widthSignal, heightSignal) {\n        const { names , props  } = this;\n        const { group , size  } = props;\n        (0, _scope.addTransforms)(treemapData, {\n            type: \"filter\",\n            expr: `datum[${JSON.stringify(size.name)}] > 0`\n        }, {\n            type: \"nest\",\n            keys: [\n                group && group.name || \"__NONE__\"\n            ]\n        }, {\n            type: \"treemap\",\n            field: (0, _expr.safeFieldName)(size.name),\n            sort: {\n                field: \"value\",\n                order: \"descending\"\n            },\n            round: true,\n            method: {\n                signal: (0, _constants.SignalNames).TreeMapMethod\n            },\n            paddingInner: 1,\n            paddingOuter: 0,\n            size: [\n                {\n                    signal: widthSignal\n                },\n                {\n                    signal: heightSignal\n                }\n            ],\n            as: [\n                names.fieldX0,\n                names.fieldY0,\n                names.fieldX1,\n                names.fieldY1,\n                names.fieldDepth,\n                names.fieldChildren\n            ]\n        });\n    }\n}\nfunction fn(n) {\n    return `datum[${JSON.stringify(n)}]`;\n}\nfunction subtract(...fields) {\n    return fields.map((n)=>fn(n)).join(\" - \");\n}\n\n},{\"./layout\":\"jm7Ki\",\"../constants\":\"9PPhV\",\"../expr\":\"f5d82\",\"../scope\":\"91ogX\",\"../selection\":\"c6vR2\",\"../zBase\":\"7rdRN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3lWTe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Wrap\", ()=>Wrap);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _layout = require(\"./layout\");\nvar _bin = require(\"../bin\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _facetSearch = require(\"../facetSearch\");\nvar _facetTitle = require(\"../facetTitle\");\nvar _ordinal = require(\"../ordinal\");\nvar _scope = require(\"../scope\");\nvar _signals = require(\"../signals\");\nclass Wrap extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `wrap_${this.id}`;\n        this.bin = (0, _bin.binnable)(this.prefix, props.globalScope.data.name, props.groupby);\n        this.names = {\n            outputData: `data_${p}_out`,\n            rowColumnDataName: `data_${p}_row_col`,\n            cellHeight: `${p}_cellHeight`,\n            cellWidth: `${p}_cellWidth`,\n            fits: `${p}_fits`,\n            target: `${p}_target`,\n            minArea: `${p}_minArea`,\n            aspect: `${p}_aspect`,\n            minAspect: `${p}_minAspect`,\n            idealAspect: `${p}_idealAspect`,\n            dataLength: `${p}_dataLength`,\n            rxc0: `${p}_rxc0`,\n            rxc1: `${p}_rxc1`,\n            rxc2: `${p}_rxc2`,\n            rxc: `${p}_rxc`,\n            growColCount: `${p}_growColCount`,\n            growCellWidth: `${p}_growCellWidth`,\n            fitsArea: `${p}_fitsArea`,\n            colCount: `${p}_colCount`\n        };\n    }\n    getGrouping() {\n        return this.bin.fields;\n    }\n    build() {\n        const { bin , names , prefix , props  } = this;\n        const { axisTextColor , cellTitles , globalScope , parentScope  } = props;\n        let ordinalBinData;\n        if (bin.native === false) {\n            (0, _scope.addSignals)(globalScope.scope, ...bin.signals);\n            (0, _scope.addTransforms)(globalScope.data, ...bin.transforms);\n            (0, _scope.addData)(globalScope.scope, bin.dataSequence);\n            (0, _scope.addTransforms)(bin.dataSequence, {\n                type: \"formula\",\n                expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                as: (0, _constants.FieldNames).Contains\n            });\n            ordinalBinData = bin.dataSequence.name;\n        } else {\n            const ord = (0, _ordinal.createOrdinals)(globalScope.data.name, prefix, bin.fields, \"ascending\");\n            (0, _scope.addData)(globalScope.scope, ord.data);\n            ordinalBinData = ord.data.name;\n        }\n        (0, _scope.addData)(globalScope.scope, {\n            name: names.rxc0,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: 1,\n                    stop: {\n                        signal: `ceil(sqrt(${names.dataLength})) + 1`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.dataLength} / datum.data)`,\n                    as: \"complement\"\n                }\n            ]\n        }, {\n            name: names.rxc1,\n            source: names.rxc0,\n            transform: [\n                {\n                    type: \"project\",\n                    fields: [\n                        \"data\"\n                    ],\n                    as: [\n                        \"cols\"\n                    ]\n                }\n            ]\n        }, {\n            name: names.rxc2,\n            source: names.rxc0,\n            transform: [\n                {\n                    type: \"project\",\n                    fields: [\n                        \"complement\"\n                    ],\n                    as: [\n                        \"cols\"\n                    ]\n                }\n            ]\n        }, {\n            name: names.rxc,\n            source: [\n                names.rxc1,\n                names.rxc2\n            ],\n            transform: [\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.dataLength} / datum.cols)`,\n                    as: \"rows\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                    as: \"cellw\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.cols === 1 ? max(datum.cellw, ${(0, _constants.SignalNames).MinCellWidth}) : datum.cellw`,\n                    as: \"cellw\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                    as: \"cellh\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.rows === 1 ? max(datum.cellh, ${(0, _constants.SignalNames).MinCellHeight}) : datum.cellh`,\n                    as: \"cellh\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `(datum.cellw >= ${(0, _constants.SignalNames).MinCellWidth} && datum.cellh >= ${(0, _constants.SignalNames).MinCellHeight})`,\n                    as: \"meetsmin\"\n                },\n                {\n                    type: \"filter\",\n                    expr: \"datum.meetsmin\"\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.cellw / datum.cellh\",\n                    as: names.aspect\n                },\n                {\n                    type: \"formula\",\n                    expr: `abs(datum.${names.aspect} - ${names.target})`,\n                    as: names.idealAspect\n                },\n                {\n                    type: \"formula\",\n                    expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                    as: \"coverage\"\n                },\n                {\n                    type: \"collect\",\n                    sort: {\n                        field: [\n                            names.idealAspect,\n                            \"coverage\"\n                        ],\n                        order: [\n                            \"ascending\",\n                            \"descending\"\n                        ]\n                    }\n                }\n            ]\n        }, {\n            name: names.rowColumnDataName,\n            source: ordinalBinData,\n            transform: [\n                {\n                    type: \"formula\",\n                    expr: `floor((datum[${JSON.stringify((0, _constants.FieldNames).Ordinal)}] - 1) / ${names.colCount})`,\n                    as: (0, _constants.FieldNames).WrapRow\n                },\n                {\n                    type: \"formula\",\n                    expr: `(datum[${JSON.stringify((0, _constants.FieldNames).Ordinal)}] - 1) % ${names.colCount}`,\n                    as: (0, _constants.FieldNames).WrapCol\n                },\n                {\n                    type: \"formula\",\n                    expr: (0, _facetSearch.serializeAsVegaExpression)(bin, (0, _constants.FieldNames).First, (0, _constants.FieldNames).Last),\n                    as: (0, _constants.FieldNames).FacetSearch\n                },\n                {\n                    type: \"formula\",\n                    expr: (0, _facetSearch.displayBin)(bin),\n                    as: (0, _constants.FieldNames).FacetTitle\n                }\n            ]\n        });\n        const dataOut = {\n            name: names.outputData,\n            source: globalScope.data.name,\n            transform: [\n                {\n                    type: \"lookup\",\n                    from: names.rowColumnDataName,\n                    key: (0, _expr.safeFieldName)(bin.fields[0]),\n                    fields: [\n                        bin.fields[0]\n                    ].map((0, _expr.safeFieldName)),\n                    values: [\n                        (0, _constants.FieldNames).WrapRow,\n                        (0, _constants.FieldNames).WrapCol\n                    ]\n                }\n            ]\n        };\n        (0, _scope.addData)(globalScope.scope, dataOut);\n        globalScope.setMarkDataName(names.outputData);\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: names.minAspect,\n            update: `${(0, _constants.SignalNames).MinCellWidth} / ${(0, _constants.SignalNames).MinCellHeight}`\n        }, {\n            name: names.target,\n            update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`\n        }, {\n            name: names.minArea,\n            update: `${(0, _constants.SignalNames).MinCellWidth}*${(0, _constants.SignalNames).MinCellHeight}`\n        }, {\n            name: names.aspect,\n            update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`\n        }, {\n            name: names.dataLength,\n            update: `data(${JSON.stringify(ordinalBinData)}).length`\n        }, {\n            name: names.growColCount,\n            update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${(0, _constants.SignalNames).MinCellWidth}), 1)`\n        }, {\n            name: names.growCellWidth,\n            update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`\n        }, {\n            name: names.fitsArea,\n            update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`\n        }, {\n            name: names.fits,\n            update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`\n        }, {\n            name: names.colCount,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`\n        }, {\n            name: names.cellWidth,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`\n        }, {\n            name: names.cellHeight,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${(0, _constants.SignalNames).MinCellHeight}`\n        });\n        (0, _signals.modifySignal)(globalScope.signals.plotHeightOut, \"max\", `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n        (0, _signals.modifySignal)(globalScope.signals.plotWidthOut, \"max\", `(${names.cellWidth} * ${names.colCount})`);\n        const signalH = [\n            names.cellHeight,\n            (0, _constants.SignalNames).FacetPaddingTop,\n            (0, _constants.SignalNames).FacetPaddingBottom\n        ].join(\" - \");\n        const signalW = [\n            names.cellWidth,\n            (0, _constants.SignalNames).FacetPaddingLeft\n        ].join(\" - \");\n        const signalX = (0, _scope.addOffsets)(parentScope.offsets.x, `datum[${JSON.stringify((0, _constants.FieldNames).WrapCol)}] * ${names.cellWidth}`, (0, _constants.SignalNames).FacetPaddingLeft);\n        const signalY = (0, _scope.addOffsets)(parentScope.offsets.y, `datum[${JSON.stringify((0, _constants.FieldNames).WrapRow)}] * ${names.cellHeight}`, (0, _constants.SignalNames).FacetPaddingTop);\n        const update = {\n            height: {\n                signal: signalH\n            },\n            width: {\n                signal: signalW\n            },\n            x: {\n                signal: signalX\n            },\n            y: {\n                signal: signalY\n            }\n        };\n        const offsets = {\n            x: signalX,\n            y: signalY,\n            h: signalH,\n            w: signalW\n        };\n        const group = {\n            style: \"cell\",\n            name: prefix,\n            type: \"group\",\n            from: {\n                data: names.rowColumnDataName\n            },\n            encode: {\n                update\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, group);\n        const sizeSignals = {\n            layoutHeight: `(${names.cellHeight} - ${(0, _constants.SignalNames).FacetPaddingTop} - ${(0, _constants.SignalNames).FacetPaddingBottom})`,\n            layoutWidth: `(${names.cellWidth} - ${(0, _constants.SignalNames).FacetPaddingLeft})`,\n            colCount: names.colCount,\n            rowCount: `ceil(${names.dataLength} / ${names.colCount})`\n        };\n        if (cellTitles) (0, _facetTitle.addFacetCellTitles)(group, sizeSignals, axisTextColor);\n        return {\n            facetScope: group,\n            sizeSignals,\n            offsets\n        };\n    }\n}\n\n},{\"./layout\":\"jm7Ki\",\"../bin\":\"7Yncy\",\"../constants\":\"9PPhV\",\"../expr\":\"f5d82\",\"../facetSearch\":\"iXWh2\",\"../facetTitle\":\"lkHaR\",\"../ordinal\":\"6Rqt5\",\"../scope\":\"91ogX\",\"../signals\":\"62U7A\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7OncB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ayrRT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7aaNP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _compare = require(\"./compare\");\nparcelHelpers.exportAll(_compare, exports);\nvar _exec = require(\"./exec\");\nparcelHelpers.exportAll(_exec, exports);\nvar _group = require(\"./group\");\nparcelHelpers.exportAll(_group, exports);\nvar _invert = require(\"./invert\");\nparcelHelpers.exportAll(_invert, exports);\nvar _narrow = require(\"./narrow\");\nparcelHelpers.exportAll(_narrow, exports);\nvar _types = require(\"./types\");\nparcelHelpers.exportAll(_types, exports);\n\n},{\"./compare\":\"6mzML\",\"./exec\":\"5iDgr\",\"./group\":\"1mCdR\",\"./invert\":\"aV5tK\",\"./narrow\":\"1M4ah\",\"./types\":\"jR44v\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6mzML\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"compareExpression\", ()=>compareExpression);\nparcelHelpers.export(exports, \"compareGroup\", ()=>compareGroup);\nparcelHelpers.export(exports, \"compare\", ()=>compare);\nparcelHelpers.export(exports, \"startsWith\", ()=>startsWith);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _group = require(\"./group\");\nconst expressionKeys = Object.keys({\n    clause: null,\n    name: null,\n    operator: null,\n    value: null\n});\nfunction compareExpression(a, b) {\n    if (a && b) for(let k = 0; k < expressionKeys.length; k++){\n        let key = expressionKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    else return !a && !b;\n    return true;\n}\nconst groupKeys = Object.keys({\n    clause: null\n});\nfunction compareGroup(a, b) {\n    for(let k = 0; k < groupKeys.length; k++){\n        let key = groupKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    if (!a.expressions && !b.expressions) return true;\n    if (!a.expressions || !b.expressions) return false;\n    if (a.expressions.length != b.expressions.length) return false;\n    for(let i = 0; i < a.expressions.length; i++){\n        if (!compareExpression(a.expressions[i], b.expressions[i])) return false;\n    }\n    return true;\n}\nfunction compare(a, b) {\n    if (a == b) return true;\n    if (!a || !b) return false;\n    let arrs = [\n        a,\n        b\n    ].map((0, _group.ensureSearchExpressionGroupArray));\n    let [arrA, arrB] = arrs;\n    if (arrA.length != arrB.length) return false;\n    for(let i = 0; i < arrA.length; i++){\n        if (!compareGroup(arrA[i], arrB[i])) return false;\n    }\n    return true;\n}\nfunction startsWith(whole, part) {\n    if (!part) return true;\n    let arrs = [\n        whole,\n        part\n    ].map((0, _group.ensureSearchExpressionGroupArray));\n    let [wholeArray, partArray] = arrs;\n    if (partArray.length > wholeArray.length) return false;\n    for(let i = 0; i < partArray.length; i++){\n        if (!compareGroup(wholeArray[i], partArray[i])) return false;\n    }\n    return true;\n}\n\n},{\"./group\":\"1mCdR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1mCdR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isSearchExpressionGroup\", ()=>isSearchExpressionGroup);\nparcelHelpers.export(exports, \"createGroupFromExpression\", ()=>createGroupFromExpression);\nparcelHelpers.export(exports, \"ensureSearchExpressionGroupArray\", ()=>ensureSearchExpressionGroupArray);\nfunction isSearchExpressionGroup(search) {\n    if (!search) return false;\n    return !!search.expressions;\n}\nfunction createGroupFromExpression(input) {\n    const output = {\n        expressions: [\n            input\n        ]\n    };\n    return output;\n}\nfunction ensureSearchExpressionGroupArray(search) {\n    if (Array.isArray(search)) return [\n        ...search\n    ];\n    else if (isSearchExpressionGroup(search)) return [\n        search\n    ];\n    else return [\n        createGroupFromExpression(search)\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5iDgr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Exec\", ()=>Exec);\nvar _group = require(\"./group\");\nfunction valueToBoolean(value) {\n    if (typeof value === \"string\") switch(value.toLowerCase()){\n        case \"true\":\n            return true;\n        case \"false\":\n            return false;\n    }\n    return !!value;\n}\nfunction valueToString(value) {\n    if (value == null) return \"\";\n    switch(typeof value){\n        case \"string\":\n            return value;\n        case \"boolean\":\n        case \"number\":\n            return value.toString();\n    }\n    return \"\";\n}\nfunction isStringOperation(ex) {\n    switch(ex.operator){\n        case \"contains\":\n        case \"!contains\":\n        case \"starts\":\n        case \"!starts\":\n            return true;\n    }\n    return false;\n}\nfunction isnullorEmpty(value) {\n    if (value == null) return true; //double equal sign to also catch undefined\n    if (typeof value === \"string\" && value.length === 0) return true;\n    return false;\n}\nclass Exec {\n    constructor(search, columns){\n        this.columns = columns;\n        this.groups = (0, _group.ensureSearchExpressionGroupArray)(search).map((g)=>{\n            const expressions = g.expressions.filter(Boolean);\n            expressions.forEach((ex)=>{\n                ex.column = this.getColumn(ex.name);\n                ex.valueBool = valueToBoolean(ex.value);\n                ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n                ex.stringOperation = isStringOperation(ex);\n            });\n            const group = Object.assign(Object.assign({}, g), {\n                expressions\n            });\n            return group;\n        });\n    }\n    getColumn(name) {\n        for(let i = 0; i < this.columns.length; i++){\n            if (this.columns[i].name == name) return this.columns[i];\n        }\n    }\n    runExpressionOnColumn(datum, ex) {\n        const actualDataValue = datum[ex.name];\n        if (ex.operator === \"isnullorEmpty\") return isnullorEmpty(actualDataValue);\n        else if (ex.operator === \"!isnullorEmpty\") return !isnullorEmpty(actualDataValue);\n        let dataValue = actualDataValue;\n        let expressionValue = ex.value;\n        if (ex.column) {\n            if (ex.column.type === \"string\" || ex.stringOperation) {\n                dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n                expressionValue = ex.valueLow;\n            } else if (ex.column.type === \"boolean\") {\n                dataValue = valueToBoolean(actualDataValue);\n                expressionValue = ex.valueBool;\n            } else if (ex.column.quantitative) {\n                dataValue = +actualDataValue;\n                expressionValue = +ex.value;\n            }\n        }\n        switch(ex.operator){\n            case \"!=\":\n                return dataValue != expressionValue;\n            case \"<\":\n                return dataValue < expressionValue;\n            case \"<=\":\n                return dataValue <= expressionValue;\n            case \"==\":\n                return dataValue == expressionValue;\n            case \">\":\n                return dataValue > expressionValue;\n            case \">=\":\n                return dataValue >= expressionValue;\n            case \"contains\":\n                return dataValue.indexOf(expressionValue) >= 0;\n            case \"!contains\":\n                return dataValue.indexOf(expressionValue) < 0;\n            case \"starts\":\n                return dataValue.indexOf(expressionValue) == 0;\n            case \"!starts\":\n                return dataValue.indexOf(expressionValue) !== 0;\n        }\n    }\n    runExpression(datum, ex) {\n        if (ex.name == null) {\n            //run on all columns\n            const group = {\n                expressions: this.columns.map((column, i)=>{\n                    const ex2 = Object.assign(Object.assign({}, ex), {\n                        column,\n                        name: column.name\n                    });\n                    if (i) ex2.clause = \"||\";\n                    return ex2;\n                })\n            };\n            return this.runGroup(datum, group);\n        } else return this.runExpressionOnColumn(datum, ex);\n    }\n    runGroup(datum, group) {\n        let accumulator = this.runExpression(datum, group.expressions[0]);\n        for(let i = 1; i < group.expressions.length; i++){\n            let ex = group.expressions[i];\n            switch(ex.clause){\n                case \"&&\":\n                    accumulator = accumulator && this.runExpression(datum, ex);\n                    break;\n                case \"||\":\n                    accumulator = accumulator || this.runExpression(datum, ex);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n    run(datum) {\n        let accumulator = this.runGroup(datum, this.groups[0]);\n        for(let i = 1; i < this.groups.length; i++){\n            let group = this.groups[i];\n            switch(group.clause){\n                case \"&&\":\n                    accumulator = accumulator && this.runGroup(datum, group);\n                    break;\n                case \"||\":\n                    accumulator = accumulator || this.runGroup(datum, group);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n}\n\n},{\"./group\":\"1mCdR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aV5tK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"invert\", ()=>invert);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _group = require(\"./group\");\nfunction invertSearchExpressionGroup(input) {\n    //this only works if all expressions in this group have the same clause\n    const output = {\n        expressions: input.expressions.map(invertSearchExpression)\n    };\n    if (input.clause) output.clause = invertedClauses[input.clause];\n    return output;\n}\nconst invertedOperators = {\n    \"!=\": \"==\",\n    \"==\": \"!=\",\n    \"<\": \">=\",\n    \">=\": \"<\",\n    \"<=\": \">\",\n    \">\": \"<=\",\n    \"!contains\": \"contains\",\n    \"contains\": \"!contains\",\n    \"!isnullorEmpty\": \"isnullorEmpty\",\n    \"isnullorEmpty\": \"!isnullorEmpty\",\n    \"!starts\": \"starts\",\n    \"starts\": \"!starts\"\n};\nconst invertedClauses = {\n    \"&&\": \"||\",\n    \"||\": \"&&\"\n};\nfunction invertSearchExpression(input) {\n    const operator = invertedOperators[input.operator];\n    const output = Object.assign(Object.assign({}, input), {\n        operator\n    });\n    if (input.clause) output.clause = invertedClauses[input.clause];\n    return output;\n}\nfunction invert(search) {\n    if (Array.isArray(search)) return search.map(invertSearchExpressionGroup);\n    else if ((0, _group.isSearchExpressionGroup)(search)) return invertSearchExpressionGroup(search);\n    else return invertSearchExpression(search);\n}\n\n},{\"./group\":\"1mCdR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1M4ah\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"narrow\", ()=>narrow);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _group = require(\"./group\");\nfunction narrow(a, b) {\n    if (!a) return b;\n    let arrs = [\n        a,\n        b\n    ].map((0, _group.ensureSearchExpressionGroupArray));\n    let [arrA, arrB] = arrs;\n    arrB[0].clause = \"&&\";\n    return arrA.concat(arrB);\n}\n\n},{\"./group\":\"1mCdR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jR44v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"32pys\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jvEtL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getColumnsFromData\", ()=>(0, _sanddanceSpecs.getColumnsFromData));\nparcelHelpers.export(exports, \"getStats\", ()=>(0, _sanddanceSpecs.getStats));\nparcelHelpers.export(exports, \"inferAll\", ()=>(0, _sanddanceSpecs.inferAll));\nparcelHelpers.export(exports, \"getPresenterStyle\", ()=>(0, _defaults.getPresenterStyle));\nparcelHelpers.export(exports, \"isInternalFieldName\", ()=>isInternalFieldName);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _defaults = require(\"./defaults\");\nfunction isInternalFieldName(columnName, includeVegaDeckGLFields = false) {\n    if (includeVegaDeckGLFields) {\n        if (columnName === (0, _constants.GL_ORDINAL)) return true;\n    }\n    for(let f in 0, _constants.FieldNames){\n        if (columnName === (0, _constants.FieldNames)[f]) return true;\n    }\n    return false;\n}\n\n},{\"./constants\":\"8f30h\",\"@msrvida/sanddance-specs\":\"gDvQs\",\"./defaults\":\"eTIvp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eTIvp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultViewerOptions\", ()=>defaultViewerOptions);\nparcelHelpers.export(exports, \"getPresenterStyle\", ()=>getPresenterStyle);\nparcelHelpers.export(exports, \"cssPrefix\", ()=>cssPrefix);\nparcelHelpers.export(exports, \"dualColorSchemeColors\", ()=>dualColorSchemeColors);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nconst { defaultPresenterConfig , defaultPresenterStyle  } = _vegaDeckGl.defaults;\nconst { desaturate  } = _vegaDeckGl.util;\nconst defaultViewerOptions = {\n    colors: {\n        activeCube: \"purple\",\n        defaultCube: _vegaDeckGl.util.colorToString(defaultPresenterStyle.defaultCubeColor),\n        hoveredCube: _vegaDeckGl.util.colorToString(defaultPresenterStyle.highlightColor),\n        selectedCube: \"yellow\",\n        axisSelectHighlight: _vegaDeckGl.util.colorToString([\n            128,\n            128,\n            128,\n            128\n        ]),\n        axisLine: \"#000\",\n        axisText: \"#000\",\n        unselectedColorMethod: (color)=>{\n            const c = desaturate(color, 0.05);\n            c[3] = 171;\n            return c;\n        }\n    },\n    language: {\n        headers: {\n            chart: \"Chart\",\n            details: \"Details\",\n            legend: \"Legend\",\n            selection: \"Select & Filter\"\n        },\n        bing: \"bing\",\n        newColorMap: \"remap color to filtered items\",\n        oldColorMap: \"keep same colors\",\n        deselect: \"deselect\",\n        exclude: \"exclude\",\n        isolate: \"isolate\",\n        legendOther: \"other\",\n        nextDetail: \">\",\n        previousDetail: \"<\",\n        reset: \"reset\",\n        colorBinCount: \"Color bin count\",\n        colorReverse: \"Color reverse\",\n        count: \"Count\",\n        percent: \"Percent\",\n        sum: \"Sum\",\n        scatterPointScale: \"Point scale\",\n        FacetMaxBins: \"Facet max bins\",\n        FacetVMaxBins: \"Cross facet max bins\",\n        XMaxBins: \"X axis max bins\",\n        YMaxBins: \"Y axis max bins\",\n        XGridSize: \"X grid size\",\n        YGridSize: \"Y grid size\",\n        InnerPaddingSize: \"Inner padding size\",\n        OuterPaddingSize: \"Outer padding size\",\n        treeMapMethod: \"Treemap layout\",\n        facetColumns: \"Facet columns\",\n        facetRows: \"Facet rows\",\n        markOpacitySignal: \"Mark opacity\",\n        textScaleSignal: \"Text scale\",\n        xAxisTextAngleSignal: \"X axis text angle\",\n        yAxisTextAngleSignal: \"Y axis text angle\",\n        zGrounded: \"Z grounded\",\n        zScaleProportion: \"Z scale proportion to Y\",\n        selectionCount: (count)=>`${count} items selected`\n    },\n    maxLegends: 19,\n    onError: (errors)=>{\n    //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n    },\n    transitionDurations: Object.assign(Object.assign({}, defaultPresenterConfig.transitionDurations), {\n        scope: 600\n    }),\n    selectionPolygonZ: -1,\n    tickSize: 10\n};\nfunction getPresenterStyle(options) {\n    var style = {\n        cssPrefix,\n        fontFamily: options.fontFamily,\n        defaultCubeColor: _vegaDeckGl.util.colorFromString(options.colors.defaultCube)\n    };\n    if (options.colors.hoveredCube) style.highlightColor = _vegaDeckGl.util.colorFromString(options.colors.hoveredCube);\n    //if (options.lightSettings) {\n    // style.lightSettings = options.lightSettings;\n    //}\n    return style;\n}\nconst cssPrefix = \"sanddance-\";\nconst dualColorSchemeColors = {\n    black: \"#212121\",\n    gray: \"#D2D2D2\",\n    blue: \"#0060F0\",\n    green: \"#00C000\",\n    orange: \"#FF9900\",\n    red: \"#E00000\"\n};\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dKeDo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"base\", ()=>(0, _base.base));\nparcelHelpers.export(exports, \"use\", ()=>(0, _base.use));\nparcelHelpers.export(exports, \"Presenter\", ()=>(0, _presenter.Presenter));\nparcelHelpers.export(exports, \"ViewGl\", ()=>(0, _viewGl.ViewGl));\nparcelHelpers.export(exports, \"constants\", ()=>_constants);\nparcelHelpers.export(exports, \"controls\", ()=>_controls);\nparcelHelpers.export(exports, \"defaults\", ()=>_defaults);\nparcelHelpers.export(exports, \"types\", ()=>_types);\nparcelHelpers.export(exports, \"util\", ()=>_util);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _constants = require(\"./constants\");\nvar _controls = require(\"./exports/controls\");\nvar _types = require(\"./exports/types\");\nvar _util = require(\"./exports/util\");\nvar _defaults = require(\"./defaults\");\nvar _base = require(\"./base\");\nvar _presenter = require(\"./presenter\");\nvar _viewGl = require(\"./vega-classes/viewGl\");\nvar _enums = require(\"./enums\");\nparcelHelpers.exportAll(_enums, exports);\n\n},{\"./constants\":\"hTTUU\",\"./exports/controls\":\"iqSwD\",\"./exports/types\":\"cMc1G\",\"./exports/util\":\"5N1o1\",\"./defaults\":\"lNLF5\",\"./base\":\"9SeSX\",\"./presenter\":\"a0H5O\",\"./vega-classes/viewGl\":\"jBiDI\",\"./enums\":\"d2XHT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hTTUU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"layerNames\", ()=>layerNames);\nconst layerNames = {\n    cubes: \"LAYER_CUBES\",\n    lines: \"LAYER_LINES\",\n    text: \"LAYER_TEXT\",\n    paths: \"LAYER_PATHS\",\n    polygons: \"LAYER_POLYGONS\"\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iqSwD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n//alphabetize variables for documentation\nparcelHelpers.export(exports, \"Table\", ()=>(0, _controls.Table));\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/**\n * This file is for external facing export only, do not use this for internal references,\n * as it may cause circular dependencies in Rollup.\n */ var _controls = require(\"../controls\");\n\n},{\"../controls\":\"6fLB2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6fLB2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"KeyCodes\", ()=>KeyCodes);\nparcelHelpers.export(exports, \"Table\", ()=>Table);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _tsxCreateElement = require(\"tsx-create-element\");\nconst KeyCodes = {\n    ENTER: \"Enter\"\n};\nconst Table = (props)=>{\n    return (0, _tsxCreateElement.createElement)(\"table\", {\n        className: props.className\n    }, props.children, props.rows.map((row, i)=>(0, _tsxCreateElement.createElement)(\"tr\", {\n            className: props.rowClassName || \"\",\n            onClick: (e)=>props.onRowClick && props.onRowClick(e, i),\n            tabIndex: props.onRowClick ? 0 : -1,\n            onKeyUp: (e)=>{\n                if (e.key === KeyCodes.ENTER && props.onRowClick) props.onRowClick(e, i);\n            }\n        }, row.cells.map((cell, i)=>(0, _tsxCreateElement.createElement)(\"td\", {\n                className: cell.className || \"\",\n                title: cell.title || \"\"\n            }, cell.content)))));\n};\n\n},{\"tsx-create-element\":\"9k8zL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9k8zL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createElement\", ()=>createElement);\nparcelHelpers.export(exports, \"addChild\", ()=>addChild);\nparcelHelpers.export(exports, \"mount\", ()=>mount);\nparcelHelpers.export(exports, \"findElementByChildPositions\", ()=>findElementByChildPositions);\nparcelHelpers.export(exports, \"focusActiveElement\", ()=>focusActiveElement);\nparcelHelpers.export(exports, \"setActiveElement\", ()=>setActiveElement);\nparcelHelpers.export(exports, \"getActiveElementInfo\", ()=>getActiveElementInfo);\nvar _htmlTags = require(\"html-tags\");\nvar _svgTags = require(\"svg-tags\");\nconst htmlTagArray = _htmlTags.default || _htmlTags;\nconst svgTagArray = _svgTags.default || _svgTags;\n/**\n * Decamelizes a string with/without a custom separator (hyphen by default).\n * from: https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript\n *\n * @param str String in camelcase\n * @param separator Separator for the new decamelized string.\n */ function decamelize(str, separator = \"-\") {\n    return str.replace(/([a-z\\d])([A-Z])/g, \"$1\" + separator + \"$2\").replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, \"$1\" + separator + \"$2\").toLowerCase();\n}\nfunction createElement(tag, attrs, ...children) {\n    if (typeof tag === \"function\") {\n        const fn = tag;\n        const props = attrs;\n        props.children = children;\n        return fn(props);\n    } else {\n        const ns = tagNamespace(tag);\n        const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n        const map = attrs;\n        let ref;\n        for(let name in map)if (name && map.hasOwnProperty(name)) {\n            let value = map[name];\n            if (name === \"className\" && value !== void 0) setAttribute(el, ns, \"class\", value.toString());\n            else if (name === \"disabled\" && !value) ;\n            else if (value === null || value === undefined) continue;\n            else if (value === true) setAttribute(el, ns, name, name);\n            else if (typeof value === \"function\") {\n                if (name === \"ref\") ref = value;\n                else el[name.toLowerCase()] = value;\n            } else if (typeof value === \"object\") setAttribute(el, ns, name, flatten(value));\n            else setAttribute(el, ns, name, value.toString());\n        }\n        if (children && children.length > 0) appendChildren(el, children);\n        if (ref) ref(el);\n        return el;\n    }\n}\nfunction setAttribute(el, ns, name, value) {\n    if (ns) el.setAttributeNS(null, name, value);\n    else el.setAttribute(name, value);\n}\nfunction flatten(o) {\n    const arr = [];\n    for(let prop in o)arr.push(`${decamelize(prop, \"-\")}:${o[prop]}`);\n    return arr.join(\";\");\n}\nfunction addChild(parentElement, child) {\n    if (child === null || child === undefined || typeof child === \"boolean\") return;\n    else if (Array.isArray(child)) appendChildren(parentElement, child);\n    else if (isElement(child)) parentElement.appendChild(child);\n    else parentElement.appendChild(document.createTextNode(child.toString()));\n}\nfunction appendChildren(parentElement, children) {\n    children.forEach((child)=>addChild(parentElement, child));\n}\nfunction isElement(el) {\n    //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n    return !!el.nodeType;\n}\nfunction mount(element, container) {\n    container.innerHTML = \"\";\n    if (element) addChild(container, element);\n}\nfunction findElementByChildPositions(childPositions, container) {\n    let element = container || document.body;\n    let childPosition;\n    while(element && childPositions.length){\n        childPosition = childPositions.shift();\n        element = element.children.item(childPosition);\n    }\n    if (element) return element;\n}\nfunction focusActiveElement(element, activeElementInfo) {\n    element.focus();\n    element.scrollTop = activeElementInfo.scrollTop;\n    const input = element;\n    if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n}\nfunction setActiveElement(activeElementInfo, container) {\n    if (activeElementInfo) {\n        const element = findElementByChildPositions(activeElementInfo.childPositions, container);\n        if (element) focusActiveElement(element, activeElementInfo);\n    }\n}\nfunction getActiveElementInfo(container) {\n    let element = document.activeElement;\n    const { scrollTop , selectionDirection , selectionEnd , selectionStart  } = element;\n    const activeElementInfo = {\n        childPositions: [],\n        scrollTop,\n        selectionDirection,\n        selectionEnd,\n        selectionStart\n    };\n    while(element && element !== document.body && element !== container){\n        activeElementInfo.childPositions.unshift(getChildPosition(element));\n        element = element.parentElement;\n    }\n    if ((element === document.body || element === container) && activeElementInfo.childPositions.length) return activeElementInfo;\n}\nfunction getChildPosition(element) {\n    let childPosition = 0;\n    while(element = element.previousElementSibling)childPosition++;\n    return childPosition;\n}\nfunction tagNamespace(tag) {\n    //issue: this won't disambiguate certain tags which exist in both svg and html: <a>, <title> ...\n    if (tag === \"svg\" || svgTagArray.indexOf(tag) >= 0 && !(htmlTagArray.indexOf(tag) >= 0)) return \"http://www.w3.org/2000/svg\";\n}\n\n},{\"html-tags\":\"7Ap5G\",\"svg-tags\":\"ljWBP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Ap5G\":[function(require,module,exports) {\n\"use strict\";\nmodule.exports = require(\"./html-tags.json\");\n\n},{\"./html-tags.json\":\"ev2hl\"}],\"ev2hl\":[function(require,module,exports) {\nmodule.exports = JSON.parse('[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rb\",\"rp\",\"rt\",\"rtc\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]');\n\n},{}],\"ljWBP\":[function(require,module,exports) {\nmodule.exports = require(\"./svg-tags.json\");\n\n},{\"./svg-tags.json\":\"igei0\"}],\"igei0\":[function(require,module,exports) {\nmodule.exports = JSON.parse('[\"a\",\"altGlyph\",\"altGlyphDef\",\"altGlyphItem\",\"animate\",\"animateColor\",\"animateMotion\",\"animateTransform\",\"circle\",\"clipPath\",\"color-profile\",\"cursor\",\"defs\",\"desc\",\"ellipse\",\"feBlend\",\"feColorMatrix\",\"feComponentTransfer\",\"feComposite\",\"feConvolveMatrix\",\"feDiffuseLighting\",\"feDisplacementMap\",\"feDistantLight\",\"feFlood\",\"feFuncA\",\"feFuncB\",\"feFuncG\",\"feFuncR\",\"feGaussianBlur\",\"feImage\",\"feMerge\",\"feMergeNode\",\"feMorphology\",\"feOffset\",\"fePointLight\",\"feSpecularLighting\",\"feSpotLight\",\"feTile\",\"feTurbulence\",\"filter\",\"font\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignObject\",\"g\",\"glyph\",\"glyphRef\",\"hkern\",\"image\",\"line\",\"linearGradient\",\"marker\",\"mask\",\"metadata\",\"missing-glyph\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialGradient\",\"rect\",\"script\",\"set\",\"stop\",\"style\",\"svg\",\"switch\",\"symbol\",\"text\",\"textPath\",\"title\",\"tref\",\"tspan\",\"use\",\"view\",\"vkern\"]');\n\n},{}],\"cMc1G\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5N1o1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n//alphabetize for documentation\nparcelHelpers.export(exports, \"addDiv\", ()=>(0, _htmlHelpers.addDiv));\nparcelHelpers.export(exports, \"addEl\", ()=>(0, _htmlHelpers.addEl));\nparcelHelpers.export(exports, \"allTruthy\", ()=>(0, _array.allTruthy));\nparcelHelpers.export(exports, \"clone\", ()=>(0, _clone.clone));\nparcelHelpers.export(exports, \"colorFromString\", ()=>(0, _color.colorFromString));\nparcelHelpers.export(exports, \"colorIsEqual\", ()=>(0, _color.colorIsEqual));\nparcelHelpers.export(exports, \"colorToString\", ()=>(0, _color.colorToString));\nparcelHelpers.export(exports, \"concat\", ()=>(0, _array.concat));\nparcelHelpers.export(exports, \"createElement\", ()=>(0, _tsxCreateElement.createElement));\nparcelHelpers.export(exports, \"deepMerge\", ()=>(0, _clone.deepMerge));\nparcelHelpers.export(exports, \"desaturate\", ()=>(0, _color.desaturate));\nparcelHelpers.export(exports, \"getActiveElementInfo\", ()=>(0, _tsxCreateElement.getActiveElementInfo));\nparcelHelpers.export(exports, \"getCubeLayer\", ()=>(0, _layers.getCubeLayer));\nparcelHelpers.export(exports, \"getCubes\", ()=>(0, _layers.getCubes));\nparcelHelpers.export(exports, \"mount\", ()=>(0, _tsxCreateElement.mount));\nparcelHelpers.export(exports, \"outerSize\", ()=>(0, _htmlHelpers.outerSize));\nparcelHelpers.export(exports, \"push\", ()=>(0, _array.push));\nparcelHelpers.export(exports, \"setActiveElement\", ()=>(0, _tsxCreateElement.setActiveElement));\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/**\n * This file is for external facing export only, do not use this for internal references,\n * as it may cause circular dependencies in Rollup.\n */ var _array = require(\"../array\");\nvar _htmlHelpers = require(\"../htmlHelpers\");\nvar _clone = require(\"../clone\");\nvar _color = require(\"../color\");\nvar _tsxCreateElement = require(\"tsx-create-element\");\nvar _layers = require(\"../layers\");\n\n},{\"../array\":\"7PFyQ\",\"../htmlHelpers\":\"4ic3k\",\"../clone\":\"17ucx\",\"../color\":\"3W8ci\",\"tsx-create-element\":\"9k8zL\",\"../layers\":\"aCwnK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7PFyQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nparcelHelpers.export(exports, \"concat\", ()=>concat);\n/**\n * Returns array with items which are truthy.\n * @param args array or arrays to concat into a single array.\n */ parcelHelpers.export(exports, \"allTruthy\", ()=>allTruthy);\n/**\n * Add an array to an existing array in place.\n * @param arr Array to append to.\n * @param items Arrof of items to append.\n */ parcelHelpers.export(exports, \"push\", ()=>push);\nfunction concat(...args) {\n    return args.reduce((p, c)=>c ? p.concat(c) : p, []);\n}\nfunction allTruthy(...args) {\n    return args.reduce((p, c)=>c ? p.concat(c) : p, []).filter(Boolean);\n}\nfunction push(arr, items) {\n    arr.push.apply(arr, items);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4ic3k\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n/**\n * Create a new element as a child of another element.\n * @param tagName Tag name of the new tag to create.\n * @param parentElement Reference of the element to append to.\n * @returns new HTMLElement.\n */ parcelHelpers.export(exports, \"addEl\", ()=>addEl);\n/**\n * Create a new div HTMLElement as a child of another element.\n * @param parentElement Reference of the element to append to.\n * @param className Optional css class name to apply to the div.\n */ parcelHelpers.export(exports, \"addDiv\", ()=>addDiv);\n/**\n * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n * @param el HTML Element to measure.\n */ parcelHelpers.export(exports, \"outerSize\", ()=>outerSize);\nfunction addEl(tagName, parentElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n}\nfunction addDiv(parentElement, className) {\n    const div = addEl(\"div\", parentElement);\n    if (className) div.className = className;\n    return div;\n}\nfunction outerSize(el) {\n    const cs = getComputedStyle(el);\n    const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return {\n        height,\n        width\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"17ucx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"clone\", ()=>clone);\nparcelHelpers.export(exports, \"deepMerge\", ()=>deepMerge);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _deepmerge = require(\"deepmerge\");\nconst deepmerge = _deepmerge.default || _deepmerge;\nfunction clone(objectToClone) {\n    if (!objectToClone) return objectToClone;\n    return deepmerge.all([\n        objectToClone\n    ]);\n}\nconst dontMerge = (destination, source)=>source;\nfunction deepMerge(...objectsToMerge) {\n    const objects = objectsToMerge.filter(Boolean);\n    return deepmerge.all(objects, {\n        arrayMerge: dontMerge\n    });\n}\n\n},{\"deepmerge\":\"9l9Ku\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9l9Ku\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar isMergeableObject = function isMergeableObject(value) {\n    return isNonNullObject(value) && !isSpecial(value);\n};\nfunction isNonNullObject(value) {\n    return !!value && typeof value === \"object\";\n}\nfunction isSpecial(value) {\n    var stringValue = Object.prototype.toString.call(value);\n    return stringValue === \"[object RegExp]\" || stringValue === \"[object Date]\" || isReactElement(value);\n}\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === \"function\" && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for(\"react.element\") : 0xeac7;\nfunction isReactElement(value) {\n    return value.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n}\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n    return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value;\n}\nfunction defaultArrayMerge(target, source, options) {\n    return target.concat(source).map(function(element) {\n        return cloneUnlessOtherwiseSpecified(element, options);\n    });\n}\nfunction mergeObject(target, source, options) {\n    var destination = {};\n    if (options.isMergeableObject(target)) Object.keys(target).forEach(function(key) {\n        destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    });\n    Object.keys(source).forEach(function(key) {\n        if (!options.isMergeableObject(source[key]) || !target[key]) destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n        else destination[key] = deepmerge(target[key], source[key], options);\n    });\n    return destination;\n}\nfunction deepmerge(target, source, options) {\n    options = options || {};\n    options.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    options.isMergeableObject = options.isMergeableObject || isMergeableObject;\n    var sourceIsArray = Array.isArray(source);\n    var targetIsArray = Array.isArray(target);\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n    if (!sourceAndTargetTypesMatch) return cloneUnlessOtherwiseSpecified(source, options);\n    else if (sourceIsArray) return options.arrayMerge(target, source, options);\n    else return mergeObject(target, source, options);\n}\ndeepmerge.all = function deepmergeAll(array, options) {\n    if (!Array.isArray(array)) throw new Error(\"first argument should be an array\");\n    return array.reduce(function(prev, next) {\n        return deepmerge(prev, next, options);\n    }, {});\n};\nvar deepmerge_1 = deepmerge;\nexports.default = deepmerge_1;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3W8ci\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Compares 2 colors to see if they are equal.\n * @param a RGBAColor to compare\n * @param b RGBAColor to compare\n * @returns True if colors are equal.\n */ parcelHelpers.export(exports, \"colorIsEqual\", ()=>colorIsEqual);\n/**\n * Convert a CSS color string to a Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n */ parcelHelpers.export(exports, \"colorFromString\", ()=>colorFromString);\n/**\n * Convert a Deck.gl color to a CSS rgba() string.\n * @param color A Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n */ parcelHelpers.export(exports, \"colorToString\", ()=>colorToString);\nparcelHelpers.export(exports, \"desaturate\", ()=>desaturate);\nvar _d3Color = require(\"d3-color\");\nfunction rgbToDeckglColor(c) {\n    return [\n        c.r,\n        c.g,\n        c.b,\n        c.opacity * 255\n    ];\n}\nfunction colorIsEqual(a, b) {\n    if (a.length !== b.length) return false;\n    for(let i = 0; i < a.length; i++){\n        if (a[i] !== b[i]) return false;\n    }\n    return true;\n}\nfunction colorFromString(cssColorSpecifier) {\n    if (cssColorSpecifier) {\n        const dc = (0, _d3Color.color)(cssColorSpecifier);\n        if (dc) {\n            const c = dc.rgb();\n            return rgbToDeckglColor(c);\n        }\n    }\n}\nfunction colorToString(color) {\n    const c = [\n        ...color\n    ];\n    if (c.length > 3) c[3] /= 255;\n    return `rgba(${c.join(\",\")})`;\n}\nfunction desaturate(color, value) {\n    const rgb = (0, _d3Color.rgb)(color[0], color[1], color[2], color[3] / 255);\n    const hslColor = (0, _d3Color.hsl)(rgb);\n    hslColor.s = value;\n    const c = hslColor.rgb();\n    return rgbToDeckglColor(c);\n}\n\n},{\"d3-color\":\"cUEIt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cUEIt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"color\", ()=>(0, _colorJsDefault.default));\nparcelHelpers.export(exports, \"rgb\", ()=>(0, _colorJs.rgb));\nparcelHelpers.export(exports, \"hsl\", ()=>(0, _colorJs.hsl));\nparcelHelpers.export(exports, \"lab\", ()=>(0, _labJsDefault.default));\nparcelHelpers.export(exports, \"hcl\", ()=>(0, _labJs.hcl));\nparcelHelpers.export(exports, \"lch\", ()=>(0, _labJs.lch));\nparcelHelpers.export(exports, \"gray\", ()=>(0, _labJs.gray));\nparcelHelpers.export(exports, \"cubehelix\", ()=>(0, _cubehelixJsDefault.default));\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nvar _labJs = require(\"./lab.js\");\nvar _labJsDefault = parcelHelpers.interopDefault(_labJs);\nvar _cubehelixJs = require(\"./cubehelix.js\");\nvar _cubehelixJsDefault = parcelHelpers.interopDefault(_cubehelixJs);\n\n},{\"./color.js\":\"Ca7MF\",\"./lab.js\":false,\"./cubehelix.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Ca7MF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Color\", ()=>Color);\nparcelHelpers.export(exports, \"darker\", ()=>darker);\nparcelHelpers.export(exports, \"brighter\", ()=>brighter);\nparcelHelpers.export(exports, \"rgbConvert\", ()=>rgbConvert);\nparcelHelpers.export(exports, \"rgb\", ()=>rgb);\nparcelHelpers.export(exports, \"Rgb\", ()=>Rgb);\nparcelHelpers.export(exports, \"hslConvert\", ()=>hslConvert);\nparcelHelpers.export(exports, \"hsl\", ()=>hsl);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nfunction Color() {}\nvar darker = 0.7;\nvar brighter = 1 / darker;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(\"^rgb\\\\(\" + [\n    reI,\n    reI,\n    reI\n] + \"\\\\)$\"), reRgbPercent = new RegExp(\"^rgb\\\\(\" + [\n    reP,\n    reP,\n    reP\n] + \"\\\\)$\"), reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [\n    reI,\n    reI,\n    reI,\n    reN\n] + \"\\\\)$\"), reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [\n    reP,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\"), reHslPercent = new RegExp(\"^hsl\\\\(\" + [\n    reN,\n    reP,\n    reP\n] + \"\\\\)$\"), reHslaPercent = new RegExp(\"^hsla\\\\(\" + [\n    reN,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\");\nvar named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, _defineJsDefault.default)(Color, color, {\n    copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable: function() {\n        return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    formatHex: color_formatHex,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n});\nfunction color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction color_formatHsl() {\n    return hslConvert(this).formatHsl();\n}\nfunction color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n     : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\nexports.default = color;\nfunction rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n}\nfunction rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n}\nfunction rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Rgb, rgb, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb: function() {\n        return this;\n    },\n    displayable: function() {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: rgb_formatHex,\n    formatHex: rgb_formatHex,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n}));\nfunction rgb_formatHex() {\n    return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\nfunction rgb_formatRgb() {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction hex(value) {\n    value = Math.max(0, Math.min(255, Math.round(value) || 0));\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n}\nfunction hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new Hsl(h, s, l, o.opacity);\n}\nfunction hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Hsl, hsl, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl: function() {\n        var a = this.opacity;\n        a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n},{\"./define.js\":\"4FUS0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4FUS0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"extend\", ()=>extend);\nexports.default = function(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n};\nfunction extend(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aCwnK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getLayers\", ()=>getLayers);\nparcelHelpers.export(exports, \"getCubeLayer\", ()=>getCubeLayer);\nparcelHelpers.export(exports, \"getCubes\", ()=>getCubes);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _array = require(\"./array\");\nvar _base = require(\"./base\");\nvar _constants = require(\"./constants\");\nvar _cubeLayer = require(\"./cube-layer/cube-layer\");\nvar _easing = require(\"./easing\");\nfunction getLayers(presenter, config, stage, lightSettings /*LightSettings*/ , lightingMix, interpolator, guideLines) {\n    const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n    const { x , y , z  } = stage.axes;\n    const lines = (0, _array.concat)(stage.gridLines, guideLines);\n    const texts = [\n        ...stage.textData\n    ];\n    [\n        x,\n        y,\n        z\n    ].forEach((axes)=>{\n        axes.forEach((axis)=>{\n            if (axis.domain) lines.push(axis.domain);\n            if (axis.ticks) lines.push.apply(lines, axis.ticks);\n            if (axis.tickText) texts.push.apply(texts, axis.tickText);\n            if (axis.title) texts.push(axis.title);\n        });\n    });\n    let characterSet;\n    if (config.getCharacterSet) characterSet = config.getCharacterSet(stage);\n    else //Basic symbols, numbers, and uppercase / lowercase alphabet\n    characterSet = new Array(95).fill(1).map((_, i)=>String.fromCharCode(32 + i));\n    if (stage.facets) stage.facets.forEach((f)=>{\n        if (f.lines) lines.push.apply(lines, f.lines);\n    });\n    const lineLayer = newLineLayer((0, _constants.layerNames).lines, lines);\n    const textLayer = newTextLayer(presenter, (0, _constants.layerNames).text, texts, config, presenter.style.fontFamily, characterSet);\n    const pathLayer = newPathLayer((0, _constants.layerNames).paths, stage.pathData);\n    const polygonLayer = newPolygonLayer((0, _constants.layerNames).polygons, stage.polygonData);\n    return [\n        textLayer,\n        cubeLayer,\n        lineLayer,\n        pathLayer,\n        polygonLayer\n    ];\n}\nfunction newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings /*LightSettings*/ , lightingMix, interpolator) {\n    const getPosition = getTiming(config.transitionDurations.position, (0, _easing.easing));\n    const getSize = getTiming(config.transitionDurations.size, (0, _easing.easing));\n    const getColor = getTiming(config.transitionDurations.color);\n    const cubeLayerProps = {\n        interpolator,\n        lightingMix,\n        id: (0, _constants.layerNames).cubes,\n        data: cubeData,\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        pickable: true,\n        autoHighlight: true,\n        highlightColor,\n        onClick: (o, e)=>{\n            config.onCubeClick(e && e.srcEvent, o.object);\n        },\n        onHover: (o, e)=>{\n            if (o.index === -1) {\n                presenter.deckgl.interactiveState.onCube = false;\n                config.onCubeHover(e && e.srcEvent, null);\n            } else {\n                presenter.deckgl.interactiveState.onCube = true;\n                config.onCubeHover(e && e.srcEvent, o.object);\n            }\n        },\n        //lightSettings,\n        transitions: {\n            getPosition,\n            getColor,\n            getSize\n        }\n    };\n    return new (0, _cubeLayer.CubeLayer)(cubeLayerProps);\n}\nfunction newLineLayer(id, data) {\n    return new (0, _base.base).layers.LineLayer({\n        id,\n        data,\n        widthUnits: \"pixels\",\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getColor: (o)=>o.color,\n        getWidth: (o)=>o.strokeWidth\n    });\n}\nfunction newPathLayer(id, data) {\n    if (!data) return null;\n    return new (0, _base.base).layers.PathLayer({\n        id,\n        data,\n        billboard: true,\n        widthScale: 1,\n        widthMinPixels: 2,\n        widthUnits: \"pixels\",\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getPath: (o)=>o.positions,\n        getColor: (o)=>o.strokeColor,\n        getWidth: (o)=>o.strokeWidth\n    });\n}\nfunction newPolygonLayer(id, data) {\n    if (!data) return null;\n    let newlayer = new (0, _base.base).layers.PolygonLayer({\n        id,\n        data,\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getPolygon: (o)=>o.positions,\n        getFillColor: (o)=>o.fillColor,\n        getLineColor: (o)=>o.strokeColor,\n        wireframe: false,\n        filled: true,\n        stroked: true,\n        pickable: true,\n        extruded: true,\n        getElevation: (o)=>o.depth,\n        getLineWidth: (o)=>o.strokeWidth\n    });\n    return newlayer;\n}\nfunction newTextLayer(presenter, id, data, config, fontFamily, characterSet) {\n    let alphaCutoff = config.getTextHighlightAlphaCutoff && config.getTextHighlightAlphaCutoff();\n    if (alphaCutoff === undefined) alphaCutoff = 0.1;\n    const props = {\n        id,\n        data,\n        characterSet,\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        sizeUnits: \"pixels\",\n        autoHighlight: true,\n        pickable: true,\n        highlightColor: (p)=>{\n            if (config.getTextHighlightColor) return config.getTextHighlightColor(p.object);\n            else return [\n                0,\n                0,\n                0,\n                0\n            ];\n        },\n        onClick: (o, e)=>{\n            let pe = e && e.srcEvent;\n            config.onTextClick && config.onTextClick(pe, o.object);\n        },\n        onHover: (o, e)=>{\n            if (o.index === -1) presenter.deckgl.interactiveState.onText = false;\n            else presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n        },\n        getColor: config.getTextColor || ((o)=>o.color),\n        getTextAnchor: (o)=>o.textAnchor,\n        getSize: (o)=>o.size,\n        getAngle: (o)=>o.angle,\n        fontSettings: {\n            sdf: false,\n            fontSize: 128,\n            buffer: 3\n        },\n        _subLayerProps: {\n            characters: {\n                alphaCutoff\n            }\n        }\n    };\n    if (fontFamily) props.fontFamily = fontFamily;\n    return new (0, _base.base).layers.TextLayer(props);\n}\nfunction getTiming(duration, easing) {\n    let timing;\n    if (duration) {\n        timing = {\n            duration,\n            type: \"interpolation\"\n        };\n        if (easing) timing.easing = easing;\n    }\n    return timing;\n}\nfunction getCubeLayer(deckProps) {\n    return deckProps.layers.filter((layer)=>layer && layer.id === (0, _constants.layerNames).cubes)[0];\n}\nfunction getCubes(deckProps) {\n    const cubeLayer = getCubeLayer(deckProps);\n    if (!cubeLayer) return;\n    const cubeLayerProps = cubeLayer.props;\n    return cubeLayerProps.data;\n}\n\n},{\"./array\":\"7PFyQ\",\"./base\":\"9SeSX\",\"./constants\":\"hTTUU\",\"./cube-layer/cube-layer\":\"bEWwt\",\"./easing\":\"6lpNQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9SeSX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"base\", ()=>base);\n/**\n * Specify the dependency libraries to use for rendering.\n * @param vega Vega library.\n * @param deck deck/core library.\n * @param layers deck/layers library.\n * @param luma luma.gl library.\n */ parcelHelpers.export(exports, \"use\", ()=>use);\nlet vega = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null\n};\nlet deck = {\n    _CameraLight: null,\n    AmbientLight: null,\n    CompositeLayer: null,\n    COORDINATE_SYSTEM: null,\n    Deck: null,\n    DirectionalLight: null,\n    Layer: null,\n    LightingEffect: null,\n    LinearInterpolator: null,\n    OrbitView: null,\n    OrbitController: null,\n    gouraudLighting: null,\n    picking: null,\n    project32: null\n};\nlet layers = {\n    IconLayer: null,\n    LineLayer: null,\n    PathLayer: null,\n    PolygonLayer: null,\n    TextLayer: null\n};\nlet luma = {\n    CubeGeometry: null,\n    Model: null,\n    Texture2D: null\n};\nconst base = {\n    deck,\n    layers,\n    luma,\n    vega\n};\nfunction use(vega1, deck1, layers1, luma1) {\n    base.deck = deck1;\n    base.layers = layers1;\n    base.luma = luma1;\n    base.vega = vega1;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bEWwt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CubeLayer\", ()=>CubeLayer);\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/layers/src/grid-cell-layer/grid-cell-layer.js\nvar _cubeLayerFragmentGlsl = require(\"./cube-layer-fragment.glsl\");\nvar _cubeLayerFragmentGlslDefault = parcelHelpers.interopDefault(_cubeLayerFragmentGlsl);\nvar _cubeLayerVertexGlsl = require(\"./cube-layer-vertex.glsl\");\nvar _cubeLayerVertexGlslDefault = parcelHelpers.interopDefault(_cubeLayerVertexGlsl);\nvar _base = require(\"../base\");\n//https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\nconst UNSIGNED_BYTE = 0x1401;\nconst DOUBLE = 0x140a;\nconst DEFAULT_COLOR = [\n    255,\n    0,\n    255,\n    255\n];\nconst defaultProps = {\n    lightingMix: 0.5,\n    getSize: (x)=>x.size,\n    getPosition: (x)=>x.position,\n    getColor: (x)=>x.color,\n    material: {\n        ambient: 0.5,\n        diffuse: 1\n    }\n};\nfunction _CubeLayer(props1) {\n    //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n    class __CubeLayer extends (0, _base.base).deck.Layer {\n        getShaders() {\n            return {\n                vs: (0, _cubeLayerVertexGlslDefault.default),\n                fs: (0, _cubeLayerFragmentGlslDefault.default),\n                modules: [\n                    (0, _base.base).deck.project32,\n                    (0, _base.base).deck.gouraudLighting,\n                    (0, _base.base).deck.picking\n                ]\n            };\n        }\n        initializeState() {\n            const attributeManager = this.getAttributeManager();\n            attributeManager.addInstanced({\n                instancePositions: {\n                    size: 3,\n                    type: DOUBLE,\n                    transition: true,\n                    accessor: \"getPosition\"\n                },\n                instanceSizes: {\n                    size: 3,\n                    transition: true,\n                    accessor: \"getSize\"\n                },\n                instanceColors: {\n                    size: 4,\n                    type: UNSIGNED_BYTE,\n                    transition: true,\n                    accessor: \"getColor\",\n                    defaultValue: DEFAULT_COLOR\n                }\n            });\n        }\n        updateState({ props , oldProps , changeFlags  }) {\n            super.updateState({\n                props,\n                oldProps,\n                changeFlags\n            }); //TODO add parameter type to deck.gl-typings\n            // Re-generate model if geometry changed\n            //if (props.fp64 !== oldProps.fp64) {\n            const { gl  } = this.context;\n            if (this.state.model) this.state.model.delete();\n            this.setState({\n                model: this._getModel(gl)\n            });\n            this.getAttributeManager().invalidateAll();\n        //}\n        }\n        _getModel(gl) {\n            return new (0, _base.base).luma.Model(gl, Object.assign({}, this.getShaders(), {\n                id: this.props.id,\n                geometry: new (0, _base.base).luma.CubeGeometry(),\n                isInstanced: true\n            }));\n        }\n        draw({ uniforms  }) {\n            let { lightingMix  } = this.props;\n            if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n            this.state.model.setUniforms(Object.assign({}, uniforms, {\n                lightingMix\n            })).draw();\n        }\n    }\n    __CubeLayer.layerName = \"CubeLayer\";\n    __CubeLayer.defaultProps = defaultProps;\n    const instance = new __CubeLayer(props1);\n    return instance;\n}\nconst CubeLayer = _CubeLayer;\n\n},{\"./cube-layer-fragment.glsl\":\"ac8pf\",\"./cube-layer-vertex.glsl\":\"3EbCq\",\"../base\":\"9SeSX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ac8pf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nexports.default = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3EbCq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _defaults = require(\"../defaults\");\nexports.default = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec3 instancePositions64Low;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${(0, _defaults.minPixelSize).toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${(0, _defaults.minPixelSize).toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_size(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_size(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_size(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset, position_worldspace);\n  \n  vec3 lightColor = lighting_getLightColor(instanceColors.rgb, project_uCameraPosition, position_worldspace.xyz, project_normal(normals));\n  vec3 mixedLight = mix(instanceColors.rgb, lightColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n\n},{\"../defaults\":\"lNLF5\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lNLF5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"minHeight\", ()=>minHeight);\nparcelHelpers.export(exports, \"minWidth\", ()=>minWidth);\nparcelHelpers.export(exports, \"defaultPresenterStyle\", ()=>defaultPresenterStyle);\nparcelHelpers.export(exports, \"defaultPresenterConfig\", ()=>defaultPresenterConfig);\nparcelHelpers.export(exports, \"createStage\", ()=>createStage);\nparcelHelpers.export(exports, \"groupStrokeWidth\", ()=>groupStrokeWidth);\nparcelHelpers.export(exports, \"lineZ\", ()=>lineZ);\nparcelHelpers.export(exports, \"defaultView\", ()=>defaultView);\nparcelHelpers.export(exports, \"min3dDepth\", ()=>min3dDepth);\nparcelHelpers.export(exports, \"minPixelSize\", ()=>minPixelSize);\nconst minHeight = \"100px\";\nconst minWidth = \"100px\";\nconst defaultPresenterStyle = {\n    cssPrefix: \"vega-deckgl-\",\n    defaultCubeColor: [\n        128,\n        128,\n        128,\n        255\n    ],\n    highlightColor: [\n        0,\n        0,\n        0,\n        255\n    ]\n};\nconst defaultPresenterConfig = {\n    onCubeClick: (e, cube)=>{},\n    onCubeHover: (e, cube)=>{},\n    transitionDurations: {\n        color: 100,\n        position: 600,\n        size: 600,\n        view: 600\n    }\n};\nfunction createStage(view) {\n    const stage = {\n        view,\n        cubeData: [],\n        pathData: [],\n        polygonData: [],\n        axes: {\n            x: [],\n            y: [],\n            z: []\n        },\n        gridLines: [],\n        textData: [],\n        legend: {\n            rows: {}\n        },\n        facets: []\n    };\n    return stage;\n}\nconst groupStrokeWidth = 1;\nconst lineZ = -1;\nconst defaultView = \"2d\";\nconst min3dDepth = 0.05;\nconst minPixelSize = 0.5;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6lpNQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"easing\", ()=>easing);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _d3Ease = require(\"d3-ease\");\nfunction easing(t) {\n    if (t === 0 || t === 1) return t;\n    return (0, _d3Ease.easeExpInOut)(t);\n}\n\n},{\"d3-ease\":\"8bxyh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8bxyh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"easeLinear\", ()=>(0, _linearJs.linear));\nparcelHelpers.export(exports, \"easeQuad\", ()=>(0, _quadJs.quadInOut));\nparcelHelpers.export(exports, \"easeQuadIn\", ()=>(0, _quadJs.quadIn));\nparcelHelpers.export(exports, \"easeQuadOut\", ()=>(0, _quadJs.quadOut));\nparcelHelpers.export(exports, \"easeQuadInOut\", ()=>(0, _quadJs.quadInOut));\nparcelHelpers.export(exports, \"easeCubic\", ()=>(0, _cubicJs.cubicInOut));\nparcelHelpers.export(exports, \"easeCubicIn\", ()=>(0, _cubicJs.cubicIn));\nparcelHelpers.export(exports, \"easeCubicOut\", ()=>(0, _cubicJs.cubicOut));\nparcelHelpers.export(exports, \"easeCubicInOut\", ()=>(0, _cubicJs.cubicInOut));\nparcelHelpers.export(exports, \"easePoly\", ()=>(0, _polyJs.polyInOut));\nparcelHelpers.export(exports, \"easePolyIn\", ()=>(0, _polyJs.polyIn));\nparcelHelpers.export(exports, \"easePolyOut\", ()=>(0, _polyJs.polyOut));\nparcelHelpers.export(exports, \"easePolyInOut\", ()=>(0, _polyJs.polyInOut));\nparcelHelpers.export(exports, \"easeSin\", ()=>(0, _sinJs.sinInOut));\nparcelHelpers.export(exports, \"easeSinIn\", ()=>(0, _sinJs.sinIn));\nparcelHelpers.export(exports, \"easeSinOut\", ()=>(0, _sinJs.sinOut));\nparcelHelpers.export(exports, \"easeSinInOut\", ()=>(0, _sinJs.sinInOut));\nparcelHelpers.export(exports, \"easeExp\", ()=>(0, _expJs.expInOut));\nparcelHelpers.export(exports, \"easeExpIn\", ()=>(0, _expJs.expIn));\nparcelHelpers.export(exports, \"easeExpOut\", ()=>(0, _expJs.expOut));\nparcelHelpers.export(exports, \"easeExpInOut\", ()=>(0, _expJs.expInOut));\nparcelHelpers.export(exports, \"easeCircle\", ()=>(0, _circleJs.circleInOut));\nparcelHelpers.export(exports, \"easeCircleIn\", ()=>(0, _circleJs.circleIn));\nparcelHelpers.export(exports, \"easeCircleOut\", ()=>(0, _circleJs.circleOut));\nparcelHelpers.export(exports, \"easeCircleInOut\", ()=>(0, _circleJs.circleInOut));\nparcelHelpers.export(exports, \"easeBounce\", ()=>(0, _bounceJs.bounceOut));\nparcelHelpers.export(exports, \"easeBounceIn\", ()=>(0, _bounceJs.bounceIn));\nparcelHelpers.export(exports, \"easeBounceOut\", ()=>(0, _bounceJs.bounceOut));\nparcelHelpers.export(exports, \"easeBounceInOut\", ()=>(0, _bounceJs.bounceInOut));\nparcelHelpers.export(exports, \"easeBack\", ()=>(0, _backJs.backInOut));\nparcelHelpers.export(exports, \"easeBackIn\", ()=>(0, _backJs.backIn));\nparcelHelpers.export(exports, \"easeBackOut\", ()=>(0, _backJs.backOut));\nparcelHelpers.export(exports, \"easeBackInOut\", ()=>(0, _backJs.backInOut));\nparcelHelpers.export(exports, \"easeElastic\", ()=>(0, _elasticJs.elasticOut));\nparcelHelpers.export(exports, \"easeElasticIn\", ()=>(0, _elasticJs.elasticIn));\nparcelHelpers.export(exports, \"easeElasticOut\", ()=>(0, _elasticJs.elasticOut));\nparcelHelpers.export(exports, \"easeElasticInOut\", ()=>(0, _elasticJs.elasticInOut));\nvar _linearJs = require(\"./linear.js\");\nvar _quadJs = require(\"./quad.js\");\nvar _cubicJs = require(\"./cubic.js\");\nvar _polyJs = require(\"./poly.js\");\nvar _sinJs = require(\"./sin.js\");\nvar _expJs = require(\"./exp.js\");\nvar _circleJs = require(\"./circle.js\");\nvar _bounceJs = require(\"./bounce.js\");\nvar _backJs = require(\"./back.js\");\nvar _elasticJs = require(\"./elastic.js\");\n\n},{\"./linear.js\":false,\"./quad.js\":false,\"./cubic.js\":false,\"./poly.js\":false,\"./sin.js\":false,\"./exp.js\":\"rSl4v\",\"./circle.js\":false,\"./bounce.js\":false,\"./back.js\":false,\"./elastic.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"rSl4v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"expIn\", ()=>expIn);\nparcelHelpers.export(exports, \"expOut\", ()=>expOut);\nparcelHelpers.export(exports, \"expInOut\", ()=>expInOut);\nvar _mathJs = require(\"./math.js\");\nfunction expIn(t) {\n    return (0, _mathJs.tpmt)(1 - +t);\n}\nfunction expOut(t) {\n    return 1 - (0, _mathJs.tpmt)(t);\n}\nfunction expInOut(t) {\n    return ((t *= 2) <= 1 ? (0, _mathJs.tpmt)(1 - t) : 2 - (0, _mathJs.tpmt)(t - 1)) / 2;\n}\n\n},{\"./math.js\":\"hu4LT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hu4LT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// tpmt is two power minus ten times t scaled to [0,1]\nparcelHelpers.export(exports, \"tpmt\", ()=>tpmt);\nfunction tpmt(x) {\n    return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a0H5O\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Class which presents a Stage of chart data using Deck.gl to render.\n */ parcelHelpers.export(exports, \"Presenter\", ()=>Presenter);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _clone = require(\"./clone\");\nvar _color = require(\"./color\");\nvar _deckgl = require(\"./deck.gl-classes/deckgl\");\nvar _linearInterpolator = require(\"./deck.gl-classes/linearInterpolator\");\nvar _defaults = require(\"./defaults\");\nvar _easing = require(\"./easing\");\nvar _effects = require(\"./effects\");\nvar _enums = require(\"./enums\");\nvar _layers = require(\"./layers\");\nvar _legend = require(\"./legend\");\nvar _rule = require(\"./marks/rule\");\nvar _panel = require(\"./panel\");\nvar _patchedCubeArray = require(\"./patchedCubeArray\");\nvar _stagers = require(\"./stagers\");\nvar _viewState = require(\"./viewState\");\nvar _tsxCreateElement = require(\"tsx-create-element\");\nclass Presenter {\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */ constructor(el, style){\n        this.el = el;\n        this.style = (0, _clone.deepMerge)((0, _defaults.defaultPresenterStyle), style);\n        (0, _panel.initializePanel)(this);\n        this._last = {\n            view: null,\n            height: null,\n            width: null,\n            cubeCount: null,\n            stage: null\n        };\n    }\n    /**\n     * Get the previously rendered Stage object.\n     */ get stage() {\n        return this._last.stage;\n    }\n    /**\n     * Get the current View camera type.\n     */ get view() {\n        return this._last.view;\n    }\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */ animationCancel() {\n        if (this.animationTimer) {\n            clearTimeout(this.animationTimer);\n            this.animationTimer = null;\n            if (this.logger) this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || \"handler\"}`);\n            if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) this.queuedAnimationOptions.animationCanceled.call(null);\n        }\n    }\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */ animationQueue(handler, timeout, options) {\n        if (this.logger) this.logger(`queueing animation ${options && options.waitingLabel || \"waiting\"}...`);\n        this.animationCancel();\n        this.animationTimer = setTimeout(()=>{\n            if (this.logger) this.logger(`queueing animation ${options && options.handlerLabel || \"handler\"}...`);\n            handler();\n        }, timeout);\n    }\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */ getElement(type) {\n        const elements = this.el.getElementsByClassName((0, _panel.className)(type, this));\n        if (elements && elements.length) return elements[0];\n    }\n    /**\n     * Present the Vega Scene, or Stage object using Deck.gl.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area.\n     * @param config Optional presentation configuration object.\n     */ present(sceneOrStage, height, width, config) {\n        this.animationCancel();\n        let scene = sceneOrStage;\n        let stage;\n        let options = {\n            maxOrdinal: 0,\n            currAxis: null,\n            defaultCubeColor: this.style.defaultCubeColor,\n            assignCubeOrdinal: (config === null || config === void 0 ? void 0 : config.onSceneRectAssignCubeOrdinal) || (()=>options.maxOrdinal++),\n            zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n        };\n        //determine if this is a vega scene\n        if (scene.marktype) {\n            stage = (0, _defaults.createStage)(scene.view);\n            (0, _stagers.sceneToStage)(options, stage, scene);\n        } else stage = sceneOrStage;\n        if (!this.deckgl) {\n            const classes = (0, _deckgl.createDeckGLClassesForPresenter)({\n                doubleClickHandler: ()=>{\n                    this.homeCamera();\n                }\n            });\n            this.OrbitControllerClass = classes.OrbitControllerClass;\n            const initialViewState = (0, _viewState.targetViewState)(height, width, stage.view);\n            let glOptions;\n            if (config && config.preserveDrawingBuffer) glOptions = {\n                preserveDrawingBuffer: true\n            };\n            const deckProps = {\n                glOptions,\n                height: null,\n                width: null,\n                effects: (0, _effects.lightingEffects)(),\n                layers: [],\n                onClick: config && config.onLayerClick,\n                views: [\n                    new (0, _base.base).deck.OrbitView({\n                        controller: (0, _base.base).deck.OrbitController\n                    })\n                ],\n                initialViewState,\n                container: this.getElement((0, _enums.PresenterElement).gl),\n                getCursor: (interactiveState)=>{\n                    if (interactiveState.onText || interactiveState.onAxisSelection) return \"pointer\";\n                    else if (interactiveState.onCube) return \"default\";\n                    else return \"grab\";\n                }\n            };\n            if (stage.backgroundColor) deckProps.style = {\n                \"background-color\": (0, _color.colorToString)(stage.backgroundColor)\n            };\n            this.deckgl = new classes.DeckGL_Class(deckProps);\n        }\n        let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n        if (options.maxOrdinal) {\n            cubeCount = Math.max(cubeCount, options.maxOrdinal);\n            const empty = {\n                isEmpty: true,\n                color: [\n                    0,\n                    0,\n                    0,\n                    0\n                ] // possibly a bug in Deck.gl? set color to invisible.\n            };\n            stage.cubeData = (0, _patchedCubeArray.patchCubeArray)(cubeCount, empty, stage.cubeData);\n        }\n        this.setDeckProps(stage, height, width, cubeCount, config);\n        const a = (0, _tsxCreateElement.getActiveElementInfo)();\n        (0, _tsxCreateElement.mount)((0, _legend.LegendView)({\n            legend: stage.legend,\n            onClick: config && config.onLegendClick\n        }), this.getElement((0, _enums.PresenterElement).legend));\n        (0, _tsxCreateElement.setActiveElement)(a);\n        if (config && config.onPresent) config.onPresent();\n    }\n    /**\n     * Present the same recently rendered Stage with only slight modifications such as a color change,\n     * using the previous Stage values as a basis.\n     * @param stage Partially populated Stage object containing changes.\n     * @param modifyConfig Optional presentation configuration object.\n     */ rePresent(stage, modifyConfig) {\n        const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n        this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n    }\n    isNewBounds(view, height, width, cubeCount) {\n        const lastBounds = this.lastBounds();\n        for(let prop in lastBounds){\n            if (lastBounds[prop] === null) return true;\n        }\n        const newBounds = {\n            cubeCount,\n            height,\n            view,\n            width\n        };\n        for(let prop1 in lastBounds){\n            if (lastBounds[prop1] !== newBounds[prop1]) return true;\n        }\n    }\n    lastBounds() {\n        const { cubeCount , height , view , width  } = this._last;\n        return {\n            cubeCount,\n            height,\n            view,\n            width\n        };\n    }\n    setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n        const config = (0, _clone.deepMerge)((0, _defaults.defaultPresenterConfig), modifyConfig);\n        const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n        //let lightSettings = this.style.lightSettings[stage.view];\n        let lightingMix = stage.view === \"3d\" ? 1.0 : 0.0;\n        let linearInterpolator;\n        //choose the current OrbitView viewstate if possible\n        let viewState = this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView || this.deckgl.props.viewState;\n        if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n            let newViewStateTarget = true;\n            if (config && config.onTargetViewState) {\n                const result = config.onTargetViewState(height, width);\n                height = result.height;\n                width = result.width;\n                if (result.newViewStateTarget !== undefined) newViewStateTarget = result.newViewStateTarget;\n            }\n            if (!viewState || newViewStateTarget) viewState = (0, _viewState.targetViewState)(height, width, stage.view);\n            const oldCubeLayer = (0, _layers.getCubeLayer)(this.deckgl.props);\n            if (oldCubeLayer) {\n                linearInterpolator = new (0, _linearInterpolator.LinearInterpolator)((0, _viewState.viewStateProps));\n                linearInterpolator.layerStartProps = {\n                    lightingMix: oldCubeLayer.props.lightingMix\n                };\n                linearInterpolator.layerEndProps = {\n                    lightingMix\n                };\n                viewState.transitionDuration = config.transitionDurations.view;\n                viewState.transitionEasing = (0, _easing.easing);\n                viewState.transitionInterpolator = linearInterpolator;\n            }\n            stage.view;\n        }\n        const guideLines = this._showGuides && (0, _rule.box)(0, 0, height, width, \"#0f0\", 1, true);\n        config.preLayer && config.preLayer(stage);\n        const layers = (0, _layers.getLayers)(this, config, stage, /*lightSettings*/ null, lightingMix, linearInterpolator, guideLines);\n        const deckProps = {\n            effects: (0, _effects.lightingEffects)(),\n            views: [\n                new (0, _base.base).deck.OrbitView({\n                    controller: (0, _base.base).deck.OrbitController\n                })\n            ],\n            initialViewState: viewState,\n            layers\n        };\n        if (config && config.preStage) config.preStage(stage, deckProps);\n        requestAnimationFrame(()=>this.deckgl.setProps(Object.assign(Object.assign({}, deckProps), {\n                onAfterRender: ()=>{\n                    if (this._afterRenderHandler) this._afterRenderHandler();\n                }\n            })));\n        delete stage.cubeData;\n        this._last = {\n            cubeCount,\n            height,\n            width,\n            stage: stage,\n            view: stage.view\n        };\n    }\n    canvasToDataURL() {\n        return new Promise((resolve, reject)=>{\n            this._afterRenderHandler = ()=>{\n                this._afterRenderHandler = null;\n                const png = this.deckgl.canvas.toDataURL(\"image/png\");\n                resolve(png);\n            };\n        });\n    }\n    /**\n     * Home the camera to the last initial position.\n     */ homeCamera() {\n        const viewState = (0, _viewState.targetViewState)(this._last.height, this._last.width, this._last.view);\n        viewState.transitionDuration = (0, _defaults.defaultPresenterConfig).transitionDurations.view;\n        viewState.transitionEasing = (0, _easing.easing);\n        viewState.transitionInterpolator = new (0, _linearInterpolator.LinearInterpolator)((0, _viewState.viewStateProps));\n        const deckProps = {\n            effects: (0, _effects.lightingEffects)(),\n            views: this.deckgl.props.views,\n            initialViewState: viewState,\n            layers: this.deckgl.props.layers\n        };\n        this.deckgl.setProps(deckProps);\n    }\n    /**\n     * Get cube data array from the cubes layer.\n     */ getCubeData() {\n        return (0, _layers.getCubes)(this.deckgl.props);\n    }\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */ showGuides() {\n        this._showGuides = true;\n        this.getElement((0, _enums.PresenterElement).gl).classList.add(\"show-center\");\n        this.rePresent(Object.assign(Object.assign({}, this._last.stage), {\n            cubeData: this.getCubeData()\n        }));\n    }\n    finalize() {\n        this.animationCancel();\n        if (this.deckgl) this.deckgl.finalize();\n        if (this.el) this.el.innerHTML = \"\";\n        this._last = null;\n        this.deckgl = null;\n        this.el = null;\n        this.logger = null;\n        this.queuedAnimationOptions = null;\n    }\n}\n\n},{\"./base\":\"9SeSX\",\"./clone\":\"17ucx\",\"./color\":\"3W8ci\",\"./deck.gl-classes/deckgl\":\"6Ja8Z\",\"./deck.gl-classes/linearInterpolator\":\"cWzuI\",\"./defaults\":\"lNLF5\",\"./easing\":\"6lpNQ\",\"./effects\":\"c0NZD\",\"./enums\":\"d2XHT\",\"./layers\":\"aCwnK\",\"./legend\":\"ad1Ea\",\"./marks/rule\":\"lHE8q\",\"./panel\":\"lSjme\",\"./patchedCubeArray\":\"k0ge5\",\"./stagers\":\"cqSrU\",\"./viewState\":\"47n3F\",\"tsx-create-element\":\"9k8zL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6Ja8Z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Creates Deck.gl classes for rendering WebGL.\n * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n */ parcelHelpers.export(exports, \"createDeckGLClassesForPresenter\", ()=>createDeckGLClassesForPresenter);\nvar _base = require(\"../base\");\nvar _orbitController = require(\"./orbitController\");\n//adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\nconst CANVAS_STYLE = {\n    position: \"absolute\",\n    left: 0,\n    top: 0,\n    width: \"100%\",\n    height: \"100%\"\n};\n// Create canvas elements for map and deck\nfunction createCanvas(props) {\n    let { container =document.body  } = props;\n    if (typeof container === \"string\") container = document.getElementById(container);\n    if (!container) throw Error(\"Deck: container not found\");\n    // Add DOM elements\n    const containerStyle = window.getComputedStyle(container);\n    if (containerStyle.position === \"static\") container.style.position = \"relative\";\n    const deckCanvas = document.createElement(\"canvas\");\n    container.appendChild(deckCanvas);\n    Object.assign(deckCanvas.style, CANVAS_STYLE);\n    return {\n        container,\n        deckCanvas\n    };\n}\nfunction createDeckGLClassesForPresenter(factoryOptions) {\n    const OrbitControllerClass = (0, _orbitController.createOrbitControllerClass)(factoryOptions);\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n    function wrapper(props1) {\n        /**\n         * @params container (Element) - DOM element to add deck.gl canvas to\n         * @params controller (Object) - Controller class. Leave empty for auto detection\n         */ class DeckGLInternal extends (0, _base.base).deck.Deck {\n            constructor(props){\n                if (typeof document === \"undefined\") // Not browser\n                throw Error(\"Deck can only be used in the browser\");\n                const { deckCanvas  } = createCanvas(props);\n                const viewState = props.initialViewState || props.viewState || {};\n                super(Object.assign({}, props, {\n                    width: \"100%\",\n                    height: \"100%\",\n                    canvas: deckCanvas,\n                    controller: OrbitControllerClass,\n                    initialViewState: viewState\n                }));\n                // Callback for the controller\n                this._updateViewState = (params)=>{\n                    if (this.onViewStateChange) this.onViewStateChange(params);\n                };\n            }\n            setProps(props) {\n                // this._updateViewState must be bound to `this`\n                // but we don't have access to the current instance before calling super().\n                if (\"onViewStateChange\" in props && this._updateViewState) {\n                    // This is called at least once at _onRendererInitialized\n                    this.onViewStateChange = props.onViewStateChange;\n                    props.onViewStateChange = this._updateViewState;\n                }\n                super.setProps(props);\n            }\n        }\n        const instance = new DeckGLInternal(props1);\n        return instance;\n    }\n    return {\n        OrbitControllerClass,\n        DeckGL_Class: wrapper\n    };\n}\n\n},{\"../base\":\"9SeSX\",\"./orbitController\":\"18rf3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"18rf3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createOrbitControllerClass\", ()=>createOrbitControllerClass);\nvar _base = require(\"../base\");\nfunction createOrbitControllerClass(factoryOptions) {\n    function wrapper(props1) {\n        class OrbitControllerInternal extends (0, _base.base).deck.OrbitController {\n            constructor(props){\n                super(props);\n                this.invertPan = true;\n            }\n            handleEvent(event) {\n                if (event.type === \"doubletap\") {\n                    if (factoryOptions && factoryOptions.doubleClickHandler) return factoryOptions.doubleClickHandler(event, this);\n                }\n                return super.handleEvent(event);\n            }\n        }\n        const instance = new OrbitControllerInternal(props1);\n        return instance;\n    }\n    return wrapper;\n}\n\n},{\"../base\":\"9SeSX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cWzuI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LinearInterpolator\", ()=>LinearInterpolator);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nfunction wrapper(props) {\n    class LinearInterpolatorInternal extends (0, _base.base).deck.LinearInterpolator {\n        constructor(transitionProps){\n            super(transitionProps);\n        }\n        interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n            if (this.layerStartProps && this.layerEndProps) this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n            return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n        }\n    }\n    const instance = new LinearInterpolatorInternal(props);\n    return instance;\n}\nconst LinearInterpolator = wrapper;\n\n},{\"../base\":\"9SeSX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c0NZD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"lightingEffects\", ()=>lightingEffects);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nfunction lightingEffects() {\n    const ambientLight = new (0, _base.base).deck.AmbientLight({\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 0.3\n    });\n    const cameraLight = new (0, _base.base).deck._CameraLight({\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 1\n    });\n    // const directionalLight = new base.deck.DirectionalLight({\n    //     color: [255, 255, 255],\n    //     direction: [0, 0, -1],\n    //     intensity: 0.2\n    //   });\n    return [\n        new (0, _base.base).deck.LightingEffect({\n            ambientLight,\n            cameraLight\n        })\n    ];\n}\n\n},{\"./base\":\"9SeSX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d2XHT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"PresenterElement\", ()=>PresenterElement);\nvar PresenterElement;\n(function(PresenterElement1) {\n    PresenterElement1[PresenterElement1[\"root\"] = 0] = \"root\";\n    PresenterElement1[PresenterElement1[\"gl\"] = 1] = \"gl\";\n    PresenterElement1[PresenterElement1[\"panel\"] = 2] = \"panel\";\n    PresenterElement1[PresenterElement1[\"legend\"] = 3] = \"legend\";\n    PresenterElement1[PresenterElement1[\"vegaControls\"] = 4] = \"vegaControls\";\n})(PresenterElement || (PresenterElement = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ad1Ea\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LegendView\", ()=>LegendView);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _tsxCreateElement = require(\"tsx-create-element\");\nvar _controls = require(\"./controls\");\nconst LegendView = (props)=>{\n    const rows = [];\n    const addRow = (row, i)=>{\n        const fn = symbolMap[row.symbol.shape];\n        let jsx;\n        if (fn) jsx = fn(row.symbol);\n        else jsx = (0, _tsxCreateElement.createElement)(\"span\", null, \"x\");\n        rows.push({\n            cells: [\n                {\n                    className: \"symbol\",\n                    content: jsx\n                },\n                {\n                    className: \"label\",\n                    content: row.label,\n                    title: row.label\n                }\n            ]\n        });\n    };\n    var sorted = Object.keys(props.legend.rows).sort((a, b)=>+a - +b);\n    sorted.forEach((i)=>addRow(props.legend.rows[i], +i));\n    if (sorted.length) return (0, _tsxCreateElement.createElement)((0, _controls.Table), {\n        rows: rows,\n        rowClassName: \"legend-row\",\n        onRowClick: (e, i)=>props.onClick(e, props.legend, i)\n    }, props.legend.title !== undefined && (0, _tsxCreateElement.createElement)(\"tr\", {\n        tabIndex: props.onClick ? 0 : -1,\n        onClick: (e)=>props.onClick(e, props.legend, null),\n        onKeyUp: (e)=>{\n            if (e.key === (0, _controls.KeyCodes).ENTER && props.onClick) props.onClick(e, props.legend, null);\n        }\n    }, (0, _tsxCreateElement.createElement)(\"th\", {\n        colSpan: 2\n    }, props.legend.title)));\n};\nconst symbolMap = {\n    square: function(symbol) {\n        return (0, _tsxCreateElement.createElement)(\"div\", {\n            style: {\n                height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                backgroundColor: symbol.fill,\n                borderColor: symbol.fill\n            }\n        });\n    }\n};\n\n},{\"tsx-create-element\":\"9k8zL\",\"./controls\":\"6fLB2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lHE8q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"box\", ()=>box);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _color = require(\"../color\");\nvar _defaults = require(\"../defaults\");\nvar _zaxis = require(\"../zaxis\");\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, _base.base).vega.sceneVisit(scene, function(item) {\n        const x1 = item.x || 0;\n        const y1 = item.y || 0;\n        const x2 = item.x2 != null ? item.x2 : x1;\n        const y2 = item.y2 != null ? item.y2 : y1;\n        const lineItem = styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n        if (item.mark.role === \"axis-tick\") {\n            if (options.currAxis.role === \"z\") {\n                (0, _zaxis.zSwap)(lineItem.sourcePosition);\n                (0, _zaxis.zSwap)(lineItem.targetPosition);\n            }\n            options.currAxis.ticks.push(lineItem);\n        } else if (item.mark.role === \"axis-domain\") {\n            if (options.currAxis.role === \"z\") {\n                (0, _zaxis.zSwap)(lineItem.sourcePosition);\n                (0, _zaxis.zSwap)(lineItem.targetPosition);\n            }\n            options.currAxis.domain = lineItem;\n        } else stage.gridLines.push(lineItem);\n    });\n};\nfunction styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n    const line = {\n        sourcePosition: [\n            x1,\n            -y1,\n            (0, _defaults.lineZ)\n        ],\n        targetPosition: [\n            x2,\n            -y2,\n            (0, _defaults.lineZ)\n        ],\n        color: (0, _color.colorFromString)(stroke),\n        strokeWidth: strokeWidth\n    };\n    return line;\n}\nfunction box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n    const lines = [\n        styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n        styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n        styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n        styledLine(gx, gy + height, gx, gy, stroke, strokeWidth)\n    ];\n    if (diagonals) {\n        lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n        lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n    }\n    return lines;\n}\nexports.default = markStager;\n\n},{\"../base\":\"9SeSX\",\"../color\":\"3W8ci\",\"../defaults\":\"lNLF5\",\"../zaxis\":\"1Ecln\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1Ecln\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"zSwap\", ()=>zSwap);\nvar _defaults = require(\"./defaults\");\nfunction zSwap(v3) {\n    let temp = -v3[1]; //negeative y to positive z\n    if (v3[0] === (0, _defaults.lineZ)) v3[0] = 0;\n    v3[1] = v3[2];\n    v3[2] = temp;\n}\n\n},{\"./defaults\":\"lNLF5\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lSjme\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializePanel\", ()=>initializePanel);\nparcelHelpers.export(exports, \"className\", ()=>className);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _tsxCreateElement = require(\"tsx-create-element\");\nvar _defaults = require(\"./defaults\");\nvar _enums = require(\"./enums\");\nfunction initializePanel(presenter) {\n    const rootDiv = (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).root, presenter)\n    }, (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).gl, presenter),\n        style: {\n            minHeight: (0, _defaults.minHeight),\n            minWidth: (0, _defaults.minWidth)\n        }\n    }), (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).panel, presenter)\n    }, (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).vegaControls, presenter)\n    }), (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).legend, presenter)\n    })));\n    (0, _tsxCreateElement.mount)(rootDiv, presenter.el);\n}\nfunction className(type, presenter) {\n    return `${presenter.style.cssPrefix}${(0, _enums.PresenterElement)[type]}`;\n}\n\n},{\"tsx-create-element\":\"9k8zL\",\"./defaults\":\"lNLF5\",\"./enums\":\"d2XHT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k0ge5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"patchCubeArray\", ()=>patchCubeArray);\nfunction patchCubeArray(allocatedSize, empty, cubes) {\n    const patched = new Array(allocatedSize);\n    patched.fill(empty);\n    cubes.forEach((cube)=>patched[cube.ordinal] = cube);\n    return patched;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cqSrU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"sceneToStage\", ()=>sceneToStage);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _legend = require(\"./marks/legend\");\nvar _legendDefault = parcelHelpers.interopDefault(_legend);\nvar _rect = require(\"./marks/rect\");\nvar _rectDefault = parcelHelpers.interopDefault(_rect);\nvar _rule = require(\"./marks/rule\");\nvar _ruleDefault = parcelHelpers.interopDefault(_rule);\nvar _line = require(\"./marks/line\");\nvar _lineDefault = parcelHelpers.interopDefault(_line);\nvar _text = require(\"./marks/text\");\nvar _textDefault = parcelHelpers.interopDefault(_text);\nvar _area = require(\"./marks/area\");\nvar _areaDefault = parcelHelpers.interopDefault(_area);\nvar _base = require(\"./base\");\nvar _color = require(\"./color\");\nvar _defaults = require(\"./defaults\");\nvar _interfaces = require(\"./marks/interfaces\");\nfunction getOrientItem(group1) {\n    if (group1.orient) return group1;\n    return group1.datum;\n}\nfunction convertGroupRole(group2, options) {\n    if (group2.mark.role === \"legend\") return (0, _interfaces.GroupType).legend;\n    if (group2.mark.role === \"axis\") {\n        if (group2.mark.zindex === options.zAxisZindex && options.zAxisZindex !== undefined) return (0, _interfaces.GroupType).zAxis;\n        const orientItem = getOrientItem(group2);\n        if (orientItem) switch(orientItem.orient){\n            case \"bottom\":\n            case \"top\":\n                return (0, _interfaces.GroupType).xAxis;\n            case \"left\":\n            case \"right\":\n                return (0, _interfaces.GroupType).yAxis;\n        }\n    }\n}\nconst group = (options, stage, scene, x, y, groupType)=>{\n    (0, _base.base).vega.sceneVisit(scene, function(g) {\n        const gx = g.x || 0, gy = g.y || 0;\n        if (g.context && g.context.background && !stage.backgroundColor) stage.backgroundColor = (0, _color.colorFromString)(g.context.background);\n        if (g.stroke) {\n            const facetRect = {\n                datum: g.datum,\n                lines: (0, _rule.box)(gx + x, gy + y, g.height, g.width, g.stroke, (0, _defaults.groupStrokeWidth))\n            };\n            stage.facets.push(facetRect);\n        }\n        groupType = convertGroupRole(g, options) || groupType;\n        setCurrentAxis(options, stage, groupType);\n        // draw group contents\n        (0, _base.base).vega.sceneVisit(g, function(item) {\n            mainStager(options, stage, item, gx + x, gy + y, groupType);\n        });\n    });\n};\nfunction setCurrentAxis(options, stage, groupType) {\n    let axes;\n    let role;\n    switch(groupType){\n        case (0, _interfaces.GroupType).xAxis:\n            axes = stage.axes.x;\n            role = \"x\";\n            break;\n        case (0, _interfaces.GroupType).yAxis:\n            axes = stage.axes.y;\n            role = \"y\";\n            break;\n        case (0, _interfaces.GroupType).zAxis:\n            axes = stage.axes.z;\n            role = \"z\";\n            break;\n        default:\n            return;\n    }\n    options.currAxis = {\n        domain: null,\n        tickText: [],\n        ticks: [],\n        role\n    };\n    axes.push(options.currAxis);\n}\nconst markStagers = {\n    group,\n    legend: (0, _legendDefault.default),\n    rect: (0, _rectDefault.default),\n    rule: (0, _ruleDefault.default),\n    line: (0, _lineDefault.default),\n    area: (0, _areaDefault.default),\n    text: (0, _textDefault.default)\n};\nconst mainStager = (options, stage, scene, x, y, groupType)=>{\n    if (scene.marktype !== \"group\" && groupType === (0, _interfaces.GroupType).legend) (0, _legendDefault.default)(options, stage, scene, x, y, groupType);\n    else {\n        const markStager = markStagers[scene.marktype];\n        if (markStager) markStager(options, stage, scene, x, y, groupType);\n    }\n};\nfunction sceneToStage(options, stage, scene) {\n    mainStager(options, stage, scene, 0, 0, null);\n    sortAxis(stage.axes.x, 0);\n    sortAxis(stage.axes.y, 1);\n}\nfunction sortAxis(axes, dim) {\n    axes.forEach((axis)=>{\n        if (axis.domain) orderDomain(axis.domain, dim);\n        axis.ticks.sort((a, b)=>a.sourcePosition[dim] - b.sourcePosition[dim]);\n        axis.tickText.sort((a, b)=>a.position[dim] - b.position[dim]);\n    });\n}\nfunction orderDomain(domain, dim) {\n    if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n        const temp = domain.targetPosition;\n        domain.targetPosition = domain.sourcePosition;\n        domain.sourcePosition = temp;\n    }\n}\n\n},{\"./marks/legend\":\"hAC8Q\",\"./marks/rect\":\"dhCm6\",\"./marks/rule\":\"lHE8q\",\"./marks/line\":\"fwLcQ\",\"./marks/text\":\"1OVU3\",\"./marks/area\":\"dLPwd\",\"./base\":\"9SeSX\",\"./color\":\"3W8ci\",\"./defaults\":\"lNLF5\",\"./marks/interfaces\":\"cN5hG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hAC8Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nconst legendMap = {\n    \"legend-title\": function(legend, textItem) {\n        legend.title = textItem.text;\n    },\n    \"legend-symbol\": function(legend, symbol) {\n        const { bounds , fill , shape  } = symbol;\n        //this object is safe for serialization\n        const legendRowSymbol = {\n            bounds,\n            fill,\n            shape\n        };\n        const i = symbol.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        legend.rows[i].symbol = legendRowSymbol;\n    },\n    \"legend-label\": function(legend, label) {\n        const i = label.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        const row = legend.rows[i];\n        row.label = label.text;\n        row.value = label.datum.value;\n    }\n};\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, _base.base).vega.sceneVisit(scene, function(item) {\n        const fn = legendMap[item.mark.role];\n        if (fn) fn(stage.legend, item);\n    });\n};\nexports.default = markStager;\n\n},{\"../base\":\"9SeSX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dhCm6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _color = require(\"../color\");\nvar _defaults = require(\"../defaults\");\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, _base.base).vega.sceneVisit(scene, function(item) {\n        //for orthographic (2d) - always use 0 or else Deck will not show them\n        const z = stage.view === \"2d\" ? 0 : item.z || 0;\n        const depth = (stage.view === \"2d\" ? 0 : item.depth || 0) + (0, _defaults.min3dDepth);\n        //change direction of y from SVG to GL\n        const ty = -1;\n        let ordinal = options.assignCubeOrdinal(item.datum);\n        if (ordinal > options.maxOrdinal) options.maxOrdinal = ordinal;\n        if (ordinal === undefined) ;\n        else {\n            const cube = {\n                ordinal,\n                size: [\n                    item.width,\n                    item.height,\n                    depth\n                ],\n                position: [\n                    x + (item.x || 0),\n                    ty * (y + (item.y || 0)) - item.height,\n                    z\n                ],\n                color: (0, _color.colorFromString)(item.fill) || options.defaultCubeColor || [\n                    128,\n                    128,\n                    128,\n                    128\n                ]\n            };\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n            stage.cubeData.push(cube);\n        }\n    });\n};\nexports.default = markStager;\n\n},{\"../base\":\"9SeSX\",\"../color\":\"3W8ci\",\"../defaults\":\"lNLF5\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fwLcQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _color = require(\"../color\");\n//change direction of y from SVG to GL\nconst ty = -1;\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    const g = Object.assign({\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 1\n    }, scene.items[0]);\n    const path = {\n        strokeWidth: g.strokeWidth,\n        strokeColor: (0, _color.colorFromString)(g.stroke),\n        positions: scene.items.map((it)=>[\n                it.x,\n                ty * it.y,\n                it.z || 0\n            ])\n    };\n    path.strokeColor[3] *= g.strokeOpacity;\n    path.strokeColor[3] *= g.opacity;\n    stage.pathData.push(path);\n};\nexports.default = markStager;\n\n},{\"../color\":\"3W8ci\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1OVU3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _base = require(\"../base\");\nvar _color = require(\"../color\");\nvar _zaxis = require(\"../zaxis\");\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    //scale Deck.Gl text to Vega size\n    const fontScale = 1;\n    //change direction of y from SVG to GL\n    const ty = -1;\n    (0, _base.base).vega.sceneVisit(scene, function(item) {\n        if (!item.text) return;\n        const size = item.fontSize * fontScale;\n        const alignmentBaseline = convertBaseline(item.baseline);\n        const yOffset = alignmentBaseline === \"top\" ? item.fontSize / 2 : 0; //fixup to get tick text correct\n        const textItem = {\n            color: (0, _color.colorFromString)(item.fill),\n            text: item.limit === undefined ? item.text : (0, _base.base).vega.truncate(item.text, item.limit, \"right\", item.ellipsis || \"...\"),\n            position: [\n                x + (item.x || 0),\n                ty * (y + (item.y || 0) + yOffset),\n                0\n            ],\n            size,\n            angle: convertAngle(item.angle),\n            textAnchor: convertAlignment(item.align),\n            alignmentBaseline,\n            metaData: item.metaData\n        };\n        if (item.mark.role === \"axis-label\") {\n            const tickText = textItem;\n            tickText.value = item.datum.value;\n            if (options.currAxis.role === \"z\") (0, _zaxis.zSwap)(tickText.position);\n            options.currAxis.tickText.push(tickText);\n        } else if (item.mark.role === \"axis-title\") {\n            if (options.currAxis.role === \"z\") (0, _zaxis.zSwap)(textItem.position);\n            options.currAxis.title = textItem;\n        } else stage.textData.push(textItem);\n    });\n};\nfunction convertAngle(vegaTextAngle) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) return 360 - vegaTextAngle;\n    return 0;\n}\nfunction convertAlignment(textAlign) {\n    switch(textAlign){\n        case \"center\":\n            return \"middle\";\n        case \"left\":\n            return \"start\";\n        case \"right\":\n            return \"end\";\n    }\n    return \"start\";\n}\nfunction convertBaseline(baseline) {\n    switch(baseline){\n        case \"middle\":\n            return \"center\";\n    }\n    return baseline || \"bottom\";\n}\nexports.default = markStager;\n\n},{\"../base\":\"9SeSX\",\"../color\":\"3W8ci\",\"../zaxis\":\"1Ecln\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dLPwd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _color = require(\"../color\");\n//change direction of y from SVG to GL\nconst ty = -1;\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    const g = Object.assign({\n        fillOpacity: 1,\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 0,\n        depth: 0\n    }, scene.items[0]);\n    const points = scene.items.map((item)=>{\n        item = Object.assign({\n            z: 0\n        }, item);\n        item = Object.assign({\n            x2: item.x,\n            y2: item.y,\n            z2: item.z\n        }, item);\n        return [\n            item.x,\n            ty * item.y,\n            item.z,\n            item.x2,\n            ty * item.y2,\n            item.z2\n        ];\n    });\n    let positions = [];\n    let startpoint = [\n        points[0][0],\n        points[0][1],\n        points[0][2]\n    ];\n    points.forEach((p)=>{\n        positions.push([\n            p[0],\n            p[1],\n            p[2]\n        ]);\n    });\n    points.reverse().forEach((p)=>{\n        positions.push([\n            p[3],\n            p[4],\n            p[5]\n        ]);\n    });\n    positions.push(startpoint);\n    const polygon = {\n        fillColor: (0, _color.colorFromString)(g.fill) || [\n            0,\n            0,\n            0,\n            0\n        ],\n        positions,\n        strokeColor: (0, _color.colorFromString)(g.stroke) || [\n            0,\n            0,\n            0,\n            0\n        ],\n        strokeWidth: g.strokeWidth,\n        depth: g.depth\n    };\n    polygon.fillColor[3] *= g.fillOpacity;\n    polygon.fillColor[3] *= g.opacity;\n    polygon.strokeColor[3] *= g.strokeOpacity;\n    polygon.strokeColor[3] *= g.opacity;\n    stage.polygonData.push(polygon);\n};\nexports.default = markStager;\n\n},{\"../color\":\"3W8ci\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cN5hG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"GroupType\", ()=>GroupType);\nvar GroupType;\n(function(GroupType1) {\n    GroupType1[GroupType1[\"none\"] = 0] = \"none\";\n    GroupType1[GroupType1[\"legend\"] = 1] = \"legend\";\n    GroupType1[GroupType1[\"xAxis\"] = 2] = \"xAxis\";\n    GroupType1[GroupType1[\"yAxis\"] = 3] = \"yAxis\";\n    GroupType1[GroupType1[\"zAxis\"] = 4] = \"zAxis\";\n})(GroupType || (GroupType = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"47n3F\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"viewStateProps\", ()=>viewStateProps);\nparcelHelpers.export(exports, \"targetViewState\", ()=>targetViewState);\nconst viewStateProps = [\n    \"target\",\n    \"rotationOrbit\",\n    \"rotationX\",\n    \"zoom\"\n];\nfunction targetViewState(height, width, view) {\n    const target = [\n        width / 2,\n        -height / 2,\n        0\n    ];\n    if (view === \"2d\") return {\n        target,\n        rotationOrbit: 0,\n        rotationX: 90,\n        zoom: -0.2\n    };\n    else return {\n        target,\n        rotationOrbit: 25,\n        rotationX: 30,\n        zoom: -0.4\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jBiDI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ViewGl\", ()=>ViewGl);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _defaults = require(\"../defaults\");\nvar _presenter = require(\"../presenter\");\nvar _enums = require(\"../enums\");\nvar _rendererGl = require(\"./rendererGl\");\nlet registered = false;\n//dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n//pass in the SuperClass, which should be a vega.View\nfunction _ViewGl(runtime1, config1) {\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class ViewGlInternal extends (0, _base.base).vega.View {\n        constructor(runtime, config = {}){\n            super(runtime, config);\n            this.config = config;\n            this.presenter = config.presenter;\n            config.presenterConfig = config.presenterConfig || {};\n            config.presenterConfig.redraw = ()=>{\n                this._redraw = true; //use Vega View private member _redraw\n                this.run();\n            };\n        }\n        renderer(...args) {\n            if (args && args.length) {\n                const renderer = args[0];\n                if (renderer === \"deck.gl\" && !registered) {\n                    (0, _base.base).vega.renderModule(\"deck.gl\", {\n                        handler: (0, _base.base).vega.CanvasHandler,\n                        renderer: (0, _rendererGl.RendererGl)\n                    });\n                    registered = true;\n                }\n                return super.renderer(renderer);\n            } else return super.renderer();\n        }\n        initialize(el) {\n            if (!this.presenter) this.presenter = new (0, _presenter.Presenter)(el);\n            super.initialize(this.presenter.getElement((0, _enums.PresenterElement).vegaControls));\n            const renderer = this._renderer;\n            renderer.presenterConfig = this.config.presenterConfig;\n            renderer.presenter = this.presenter;\n            renderer.getView = this.config && this.config.getView || (()=>this.presenter.view || (0, _defaults.defaultView));\n            return this;\n        }\n        error(e) {\n            if (this.presenter.logger) this.presenter.logger(e);\n        }\n    }\n    const instance = new ViewGlInternal(runtime1, config1);\n    return instance;\n}\nconst ViewGl = _ViewGl;\n\n},{\"../base\":\"9SeSX\",\"../defaults\":\"lNLF5\",\"../presenter\":\"a0H5O\",\"../enums\":\"d2XHT\",\"./rendererGl\":\"5Smnn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Smnn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"RendererGl\", ()=>RendererGl);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\n//pass in the SuperClass, which should be a vega.View\nfunction _RendererGl(loader) {\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class RendererGlInternal extends (0, _base.base).vega.Renderer {\n        initialize(el, width, height, origin) {\n            this.height = height;\n            this.width = width;\n            // this method will invoke resize to size the canvas appropriately\n            return super.initialize(el, width, height, origin);\n        }\n        resize(width, height, origin) {\n            super.resize(width, height, origin);\n            this.origin = origin;\n            this.height = height;\n            this.width = width;\n            //rteturn this for vega\n            return this;\n        }\n        _render(scene, items) {\n            const scene3d = scene;\n            scene3d.view = this.getView();\n            this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n            //return this for vega\n            return this;\n        }\n    }\n    const instance = new RendererGlInternal(loader);\n    return instance;\n}\nconst RendererGl = _RendererGl;\n\n},{\"../base\":\"9SeSX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cHhTd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"colorSchemes\", ()=>colorSchemes);\nparcelHelpers.export(exports, \"registerColorSchemes\", ()=>registerColorSchemes);\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _defaults = require(\"./defaults\");\nconst dualPairs = [\n    [\n        (0, _defaults.dualColorSchemeColors).black,\n        (0, _defaults.dualColorSchemeColors).gray\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).red,\n        (0, _defaults.dualColorSchemeColors).green\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).red,\n        (0, _defaults.dualColorSchemeColors).blue\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).black,\n        (0, _defaults.dualColorSchemeColors).red\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).black,\n        (0, _defaults.dualColorSchemeColors).orange\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).black,\n        (0, _defaults.dualColorSchemeColors).green\n    ]\n];\nconst colorSchemes = [\n    {\n        scheme: (0, _sanddanceSpecs.ColorScaleNone),\n        colors: [\n            (0, _defaults.defaultViewerOptions).colors.defaultCube\n        ]\n    }\n];\ncreateDualColorSchemes();\nfunction registerColorSchemes(vega) {\n    colorSchemes.forEach((cs)=>{\n        if (cs.colors.length === 1) vega.scheme(cs.scheme, (x)=>cs.colors[0]);\n        else vega.scheme(cs.scheme, cs.colors);\n    });\n}\nfunction createPair(names, colors) {\n    const scheme = `dual_${names[0]}${names[1]}`;\n    colorSchemes.push({\n        scheme,\n        colors\n    });\n}\nfunction createDualColorSchemes() {\n    dualPairs.forEach((colors)=>{\n        const names = colors.map((color)=>{\n            for(let key in 0, _defaults.dualColorSchemeColors)if (color === (0, _defaults.dualColorSchemeColors)[key]) return key;\n        });\n        createPair(names, colors);\n        createPair([\n            ...names\n        ].reverse(), [\n            ...colors\n        ].reverse());\n    });\n}\n\n},{\"@msrvida/sanddance-specs\":\"gDvQs\",\"./defaults\":\"eTIvp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2eKB4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Component to view a SandDance data visualization.\n */ parcelHelpers.export(exports, \"Viewer\", ()=>Viewer);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _animator = require(\"./animator\");\nvar _axes = require(\"./axes\");\nvar _axisSelection = require(\"./axisSelection\");\nvar _colorCubes = require(\"./colorCubes\");\nvar _colorSchemes = require(\"./colorSchemes\");\nvar _constants = require(\"./constants\");\nvar _dataScope = require(\"./dataScope\");\nvar _defaults = require(\"./defaults\");\nvar _details = require(\"./details\");\nvar _headers = require(\"./headers\");\nvar _legend = require(\"./legend\");\nvar _ordinal = require(\"./ordinal\");\nvar _search = require(\"./search\");\nvar _signals = require(\"./signals\");\nvar _tooltip = require(\"./tooltip\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _searchExpression = require(\"@msrvida/search-expression\");\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _characterSet = require(\"./characterSet\");\nvar __awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nconst { defaultView  } = _vegaDeckGl.defaults;\nconst zAxisZindex = 1010;\nlet didRegisterColorSchemes = false;\nclass Viewer {\n    /**\n     * Instantiate a new Viewer.\n     * @param element Parent HTMLElement to present within.\n     * @param options Optional viewer options object.\n     */ constructor(element, options){\n        this.element = element;\n        this.options = _vegaDeckGl.util.deepMerge((0, _defaults.defaultViewerOptions), options);\n        this.presenter = new _vegaDeckGl.Presenter(element, (0, _defaults.getPresenterStyle)(this.options));\n        this._characterSet = new (0, _characterSet.CharacterSet)();\n        this._dataScope = new (0, _dataScope.DataScope)();\n        this._animator = new (0, _animator.Animator)(this._dataScope, {\n            onDataChanged: this.onDataChanged.bind(this),\n            onAnimateDataChange: this.onAnimateDataChange.bind(this)\n        });\n        this._details = new (0, _details.Details)(this.presenter.getElement(_vegaDeckGl.PresenterElement.panel), this.options.language, this._animator, this._dataScope, (remap)=>{\n            this.currentColorContext = ~~remap;\n            this.renderSameLayout();\n        }, ()=>this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n        this.insight = {};\n    }\n    changeColorContexts(colorContexts) {\n        this.colorContexts = colorContexts;\n        this.currentColorContext = 0;\n        this.options.onColorContextChange && this.options.onColorContextChange();\n    }\n    applyLegendColorContext(colorContext) {\n        const a = _vegaDeckGl.util.getActiveElementInfo();\n        _vegaDeckGl.util.mount(colorContext.legendElement, this.presenter.getElement(_vegaDeckGl.PresenterElement.legend));\n        _vegaDeckGl.util.setActiveElement(a);\n        this.presenter.stage.legend = colorContext.legend;\n    }\n    onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n        return new Promise((resolve, reject)=>{\n            let innerPromise;\n            if (dataChange === (0, _animator.DataLayoutChange).refine) {\n                const oldColorContext = this.colorContexts[this.currentColorContext];\n                innerPromise = new Promise((innerResolve)=>{\n                    this.renderNewLayout({}, {\n                        preStage: (stage, deckProps)=>{\n                            (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                            this.overrideAxisLabels(stage);\n                            (0, _colorCubes.applyColorMapToCubes)([\n                                oldColorContext.colorMap\n                            ], _vegaDeckGl.util.getCubes(deckProps));\n                            if (this.options.onStage) this.options.onStage(stage, deckProps);\n                        }\n                    }).then(()=>{\n                        //apply old legend\n                        this.applyLegendColorContext(oldColorContext);\n                        innerResolve();\n                    });\n                });\n            } else innerPromise = this.renderNewLayout({}, {\n                preStage: (stage, deckProps)=>{\n                    (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                    this.overrideAxisLabels(stage);\n                    if (this.options.onStage) this.options.onStage(stage, deckProps);\n                }\n            });\n            innerPromise.then(()=>{\n                this.presenter.animationQueue(resolve, this.options.transitionDurations.position, {\n                    waitingLabel,\n                    handlerLabel,\n                    animationCanceled: reject\n                });\n            });\n        });\n    }\n    onDataChanged(dataLayout, filter) {\n        return __awaiter(this, void 0, void 0, function*() {\n            switch(dataLayout){\n                case (0, _animator.DataLayoutChange).same:\n                    this.renderSameLayout();\n                    break;\n                case (0, _animator.DataLayoutChange).refine:\n                    {\n                        //save cube colors\n                        const oldColorContext = this.colorContexts[this.currentColorContext];\n                        let colorMap;\n                        yield this.renderNewLayout({}, {\n                            preStage: (stage, deckProps)=>{\n                                //save off the spec colors\n                                colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n                                (0, _colorCubes.applyColorMapToCubes)([\n                                    oldColorContext.colorMap\n                                ], _vegaDeckGl.util.getCubes(deckProps));\n                                this.preStage(stage, deckProps);\n                            },\n                            onPresent: ()=>{\n                                //save new legend\n                                const newColorContext = {\n                                    colorMap,\n                                    legend: _vegaDeckGl.util.clone(this.presenter.stage.legend),\n                                    legendElement: this.presenter.getElement(_vegaDeckGl.PresenterElement.legend).children[0]\n                                };\n                                //apply old legend\n                                this.applyLegendColorContext(oldColorContext);\n                                this.changeColorContexts([\n                                    oldColorContext,\n                                    newColorContext\n                                ]);\n                            }\n                        });\n                        //narrow the filter only if it is different\n                        if (!_searchExpression.compare(this.insight.filter, filter)) this.insight.filter = _searchExpression.narrow(this.insight.filter, filter);\n                        if (this.options.onDataFilter) this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                        break;\n                    }\n                case (0, _animator.DataLayoutChange).reset:\n                    {\n                        const colorContext = {\n                            colorMap: null,\n                            legend: null,\n                            legendElement: null\n                        };\n                        this.changeColorContexts([\n                            colorContext\n                        ]);\n                        yield this.renderNewLayout({}, {\n                            onPresent: ()=>{\n                                (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n                            }\n                        });\n                        delete this.insight.filter;\n                        if (this.options.onDataFilter) this.options.onDataFilter(null, null);\n                        break;\n                    }\n            }\n            if (this.options.onSelectionChanged) {\n                const sel = this.getSelection();\n                this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n            }\n        });\n    }\n    getSpecColumnsWithFilteredStats() {\n        if (!this._dataScope.hasFilteredData()) return this._specColumns;\n        const roles = [\n            \"color\",\n            \"facet\",\n            \"group\",\n            \"size\",\n            \"sort\",\n            \"sum\",\n            \"x\",\n            \"y\",\n            \"z\"\n        ];\n        const specColumns = Object.assign({}, this._specColumns);\n        roles.forEach((r)=>{\n            if (specColumns[r]) {\n                const column = Object.assign({}, specColumns[r]);\n                column.stats = this.getColumnStats(column);\n                specColumns[r] = column;\n            }\n        });\n        return specColumns;\n    }\n    renderNewLayout(signalValues, presenterConfig, view) {\n        return __awaiter(this, void 0, void 0, function*() {\n            const currData = this._dataScope.currentData();\n            const context = {\n                specColumns: this.getSpecColumnsWithFilteredStats(),\n                insight: this.insight,\n                specViewOptions: Object.assign(Object.assign({}, this.options), {\n                    zAxisOptions: {\n                        showZAxis: true,\n                        zIndex: zAxisZindex\n                    }\n                })\n            };\n            const specResult = (0, _sanddanceSpecs.build)(context, currData);\n            if (!specResult.errors) {\n                const uiValues = (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n                (0, _signals.applySignalValues)(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n                this.vegaSpec = specResult.vegaSpec;\n                this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n                this.specCapabilities = specResult.specCapabilities;\n                const config = this.createConfig(presenterConfig);\n                if (view) config.getView = ()=>view;\n                if (!didRegisterColorSchemes) {\n                    (0, _colorSchemes.registerColorSchemes)(_vegaDeckGl.base.vega);\n                    didRegisterColorSchemes = true;\n                }\n                try {\n                    if (this.vegaViewGl) this.vegaViewGl.finalize();\n                    const runtime = _vegaDeckGl.base.vega.parse(this.vegaSpec);\n                    this.vegaViewGl = new _vegaDeckGl.ViewGl(runtime, config).renderer(\"deck.gl\").initialize(this.element);\n                    yield this.vegaViewGl.runAsync();\n                    const handler = (n, v)=>{\n                        this._characterSet.resetCharacterSet(true);\n                    };\n                    this.vegaSpec.signals.forEach((s)=>{\n                        this.vegaViewGl.addSignalListener(s.name, handler);\n                    });\n                    //capture new color color contexts via signals\n                    this.configForSignalCapture(config.presenterConfig);\n                } catch (e) {\n                    specResult.errors = [\n                        e.message\n                    ];\n                }\n                if (!specResult.errors) (0, _headers.ensureHeaders)(this.presenter, this.options.language.headers);\n            }\n            if (specResult.errors) {\n                if (this.options.onError) this.options.onError(specResult.errors);\n                else if (this.presenter.logger) this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join(\"\\n\")}`);\n            }\n            return specResult;\n        });\n    }\n    /**\n     * Render the same layout with new options.\n     * @param newViewerOptions New options object.\n     */ renderSameLayout(newViewerOptions) {\n        const colorContext = this.colorContexts[this.currentColorContext];\n        const clonedCubes = this.presenter.getCubeData().map((cube)=>{\n            return Object.assign({}, cube);\n        });\n        this.applyLegendColorContext(colorContext);\n        let { axes , textData  } = this.presenter.stage;\n        let recoloredAxes;\n        if (newViewerOptions) {\n            if (newViewerOptions.colors) {\n                recoloredAxes = (0, _axes.recolorAxes)(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n                this._lastColorOptions = _vegaDeckGl.util.clone(newViewerOptions.colors);\n                axes = recoloredAxes.axes || axes;\n                textData = recoloredAxes.textData || textData;\n            }\n            this.options = _vegaDeckGl.util.deepMerge(this.options, newViewerOptions);\n        }\n        let colorMaps = [\n            colorContext.colorMap\n        ];\n        let colorMethod;\n        const hasSelectedData = this._dataScope.hasSelectedData();\n        const hasActive = !!this._dataScope.active;\n        if (hasSelectedData || hasActive) {\n            const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n            colorMaps.push(selectedColorMap);\n            colorMethod = this.options.colors.unselectedColorMethod;\n        }\n        (0, _colorCubes.applyColorMapToCubes)(colorMaps, clonedCubes, colorMethod);\n        const stage = {\n            cubeData: clonedCubes,\n            axes,\n            textData\n        };\n        this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n    }\n    getView(view) {\n        if (view === undefined) {\n            if (this.presenter.view === null) return defaultView;\n            else return this.presenter.view;\n        } else return view;\n    }\n    transformData(values, transform) {\n        try {\n            const runtime = _vegaDeckGl.base.vega.parse({\n                $schema: \"https://vega.github.io/schema/vega/v4.json\",\n                data: [\n                    {\n                        name: \"source\",\n                        values,\n                        transform\n                    }\n                ]\n            });\n            new _vegaDeckGl.ViewGl(runtime).run();\n        } catch (e) {\n        // continue regardless of error\n        }\n        return values;\n    }\n    /**\n     * Render data into a visualization.\n     * @param insight Object to create a visualization specification.\n     * @param data Array of data objects.\n     * @param view Optional View to specify camera type.\n     * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n     */ render(insight, data, options = {}) {\n        return __awaiter(this, void 0, void 0, function*() {\n            let result;\n            //see if refine expression has changed\n            if (!_searchExpression.compare(insight.filter, this.insight.filter)) {\n                const allowAsyncRenderTime = 100;\n                if (insight.filter) {\n                    //refining\n                    result = yield this._render(insight, data, options, true);\n                    this.presenter.animationQueue(()=>{\n                        this.filter(insight.filter, options.rebaseFilter && options.rebaseFilter());\n                    }, allowAsyncRenderTime, {\n                        waitingLabel: \"layout before refine\",\n                        handlerLabel: \"refine after layout\"\n                    });\n                } else {\n                    //not refining\n                    this._dataScope.setFilteredData(null);\n                    result = yield this._render(insight, data, options, true);\n                    this.presenter.animationQueue(()=>{\n                        this.reset();\n                    }, allowAsyncRenderTime, {\n                        waitingLabel: \"layout before reset\",\n                        handlerLabel: \"reset after layout\"\n                    });\n                }\n            } else result = yield this._render(insight, data, options, false);\n            return result;\n        });\n    }\n    shouldViewstateTransition(newInsight, oldInsight) {\n        if (!oldInsight.columns) return false;\n        if (oldInsight.chart !== newInsight.chart) return true;\n        if (oldInsight.size.height !== newInsight.size.height) return true;\n        if (oldInsight.size.width !== newInsight.size.width) return true;\n        if (oldInsight.columns.facet !== newInsight.columns.facet) return true;\n        return false;\n    }\n    configForSignalCapture(presenterConfig) {\n        const colorContext = {\n            colorMap: null,\n            legend: null,\n            legendElement: null\n        };\n        //now be ready to capture color changing signals \n        presenterConfig.preStage = (stage, deckProps)=>{\n            if (this._shouldSaveColorContext()) //save off the colors from Vega layout\n            colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n            this.preStage(stage, deckProps);\n        };\n        presenterConfig.onPresent = ()=>{\n            if (this._shouldSaveColorContext()) {\n                (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n                this.changeColorContexts([\n                    colorContext\n                ]);\n                this._dataScope.deselect();\n            }\n        };\n    }\n    _render(insight, data, options, forceNewCharacterSet) {\n        return __awaiter(this, void 0, void 0, function*() {\n            if (this._tooltip) {\n                this._tooltip.finalize();\n                this._tooltip = null;\n            }\n            if (this._dataScope.setData(data, options.columns)) //apply transform to the data\n            this.transformData(data, insight.transform);\n            this._specColumns = (0, _sanddanceSpecs.getSpecColumns)(insight, this._dataScope.getColumns(options.columnTypes));\n            const ordinalMap = (0, _ordinal.assignOrdinals)(this._specColumns, data, options.ordinalMap);\n            this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n            this.insight = _vegaDeckGl.util.clone(insight);\n            this._lastColorOptions = _vegaDeckGl.util.clone(this.options.colors);\n            this._shouldSaveColorContext = ()=>!options.initialColorContext;\n            const colorContext = options.initialColorContext || {\n                colorMap: null,\n                legend: null,\n                legendElement: null\n            };\n            const specResult = yield this.renderNewLayout(insight.signalValues, {\n                preStage: (stage, deckProps)=>{\n                    if (this._shouldSaveColorContext()) //save off the colors from Vega layout\n                    colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n                    else //apply passed colorContext\n                    (0, _colorCubes.applyColorMapToCubes)([\n                        colorContext.colorMap\n                    ], _vegaDeckGl.util.getCubes(deckProps));\n                    //if items are selected, repaint\n                    const hasSelectedData = !!this._dataScope.hasSelectedData();\n                    const hasActive = !!this._dataScope.active;\n                    if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n                        const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                        (0, _colorCubes.applyColorMapToCubes)([\n                            colorContext.colorMap,\n                            selectedColorMap\n                        ], stage.cubeData, this.options.colors.unselectedColorMethod);\n                    }\n                    this.preStage(stage, deckProps);\n                },\n                onPresent: ()=>{\n                    if (this._shouldSaveColorContext()) {\n                        (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n                        this.changeColorContexts([\n                            colorContext\n                        ]);\n                    } else //apply passed colorContext\n                    this.applyLegendColorContext(colorContext);\n                },\n                shouldViewstateTransition: ()=>this.shouldViewstateTransition(insight, this.insight)\n            }, this.getView(insight.view));\n            //future signal changes should save the color context\n            this._shouldSaveColorContext = ()=>!options.discardColorContextUpdates || !options.discardColorContextUpdates();\n            this._details.render();\n            const result = {\n                ordinalMap,\n                specResult\n            };\n            return result;\n        });\n    }\n    overrideAxisLabels(stage) {\n    // if (this._specColumns.x && this._specColumns.x.type === 'date') {\n    //     stage.axes.x.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.x)\n    //     ));\n    // }\n    // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n    //     stage.axes.y.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.y)\n    //     ));\n    // }\n    }\n    preStage(stage, deckProps) {\n        const onClick = (e, search)=>{\n            if (this.options.onAxisClick) this.options.onAxisClick(e, search);\n            else this.select(search);\n        };\n        this.overrideAxisLabels(stage);\n        const polygonLayer = (0, _axisSelection.axisSelectionLayer)(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n        const order = 1; //after textlayer but before others\n        deckProps.layers.splice(order, 0, polygonLayer);\n        (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n        if (this.options.onStage) this.options.onStage(stage, deckProps);\n    }\n    onCubeClick(e, cube) {\n        this.options.onCubeClick && this.options.onCubeClick(e, cube);\n        const hasSelectedData = this._dataScope.hasSelectedData();\n        if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n            //if active is within selection, keep the selection and activate the one.\n            const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n            if (indexWithinSelection.index >= 0) {\n                this.activate(indexWithinSelection.datum);\n                this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                if (this.options.onSelectionChanged) {\n                    const sel = this.getSelection();\n                    this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                }\n                return;\n            }\n        }\n        if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][0, _constants.GL_ORDINAL] === cube.ordinal) {\n            this.deselect();\n            return;\n        }\n        const search = {\n            name: (0, _constants.GL_ORDINAL),\n            operator: \"==\",\n            value: cube.ordinal\n        };\n        this.select(search);\n    }\n    onCubeHover(e, cube) {\n        if (this._tooltip) {\n            this._tooltip.finalize();\n            this._tooltip = null;\n        }\n        if (!cube) return;\n        const currentData = this._dataScope.currentData();\n        const index = (0, _ordinal.getDataIndexOfCube)(cube, currentData);\n        if (index >= 0) this._tooltip = new (0, _tooltip.Tooltip)({\n            options: this.options.tooltipOptions,\n            item: currentData[index],\n            position: e,\n            cssPrefix: this.presenter.style.cssPrefix\n        });\n    }\n    onTextHover(e, t) {\n        //return true if highlight color is different\n        if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor) return false;\n        return !_vegaDeckGl.util.colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n    }\n    createConfig(c) {\n        const { getTextColor , getTextHighlightColor , getTextHighlightAlphaCutoff , onTextClick  } = this.options;\n        const defaultPresenterConfig = {\n            zAxisZindex,\n            getCharacterSet: (stage)=>this._characterSet.getCharacterSet(stage),\n            getTextColor,\n            getTextHighlightColor,\n            getTextHighlightAlphaCutoff,\n            onTextClick: (e, t)=>{\n                if (t.metaData && t.metaData.search) {\n                    const search = (0, _search.getSearchGroupFromVegaValue)(t.metaData.search);\n                    if (this.options.onAxisClick) this.options.onAxisClick(e, search);\n                    else this.select(search);\n                }\n                if (onTextClick) onTextClick(e, t);\n            },\n            onCubeClick: this.onCubeClick.bind(this),\n            onCubeHover: this.onCubeHover.bind(this),\n            onTextHover: this.onTextHover.bind(this),\n            preStage: this.preStage.bind(this),\n            onPresent: this.options.onPresent,\n            onLayerClick: (info, e)=>{\n                if (!info || !info.object) this.deselect();\n            },\n            onLegendClick: (e, legend, clickedIndex)=>{\n                const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n                if (legendRow) {\n                    if (this.options.onLegendRowClick) this.options.onLegendRowClick(e, legendRow);\n                    else this.select(legendRow.search);\n                } else if (this.options.onLegendHeaderClick) //header clicked\n                this.options.onLegendHeaderClick(e);\n            },\n            onSceneRectAssignCubeOrdinal: (datum)=>{\n                //TODO see if datum is a facet selection rect\n                return datum[0, _constants.GL_ORDINAL];\n            },\n            onTargetViewState: (h, w)=>{\n                const { height , width  } = this.insight.size;\n                let newViewStateTarget;\n                if (this.options.onNewViewStateTarget) newViewStateTarget = this.options.onNewViewStateTarget();\n                return {\n                    height,\n                    width,\n                    newViewStateTarget\n                };\n            },\n            preserveDrawingBuffer: this.options.preserveDrawingBuffer\n        };\n        if (this.options.onBeforeCreateLayers) defaultPresenterConfig.preLayer = (stage)=>{\n            this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n        };\n        const config = {\n            presenter: this.presenter,\n            presenterConfig: Object.assign(defaultPresenterConfig, c)\n        };\n        if (this.options.transitionDurations) config.presenterConfig.transitionDurations = this.options.transitionDurations;\n        return config;\n    }\n    /**\n     * Filter the data and animate.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n     */ filter(search, rebase = false) {\n        const u = this._dataScope.createUserSelection(search, false, rebase);\n        return new Promise((resolve, reject)=>{\n            this._animator.filter(search, u.included, u.excluded, rebase).then(()=>{\n                this._details.clear();\n                this._details.clearSelection();\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n    /**\n     * Remove any filtration and animate.\n     */ reset() {\n        return new Promise((resolve, reject)=>{\n            this._animator.reset().then(()=>{\n                this._details.clear();\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Select cubes by a filter expression.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     */ select(search) {\n        return new Promise((resolve, reject)=>{\n            this._animator.select(search).then(()=>{\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n    /**\n     * Removes any selection.\n     */ deselect() {\n        return new Promise((resolve, reject)=>{\n            this._animator.deselect().then(()=>{\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Gets the current selection.\n     */ getSelection() {\n        if (!this._dataScope) return null;\n        const selectionState = {\n            search: this._dataScope.selection && this._dataScope.selection.search || null,\n            selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n            active: this._dataScope.active\n        };\n        return selectionState;\n    }\n    /**\n     * Set one data row to the active state.\n     */ activate(datum) {\n        return new Promise((resolve, reject)=>{\n            this._animator.activate(datum).then(()=>{\n                this._details.render();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Deactivate item.\n     */ deActivate() {\n        return new Promise((resolve, reject)=>{\n            if (this._dataScope && this._dataScope.active) this._animator.deactivate().then(()=>{\n                this._details.render();\n                resolve();\n            });\n            else resolve();\n        });\n    }\n    /**\n     * Gets the current insight with signal values.\n     */ getInsight() {\n        const insight = Object.assign({}, this.insight);\n        insight.signalValues = this.getSignalValues();\n        return insight;\n    }\n    /**\n     * Gets column stats from current data (filtered or all).\n     * @param column Column to get stats for.\n     */ getColumnStats(column) {\n        return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n    }\n    /**\n     * Gets current signal values.\n     */ getSignalValues() {\n        return (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n    }\n    finalize() {\n        if (this._dataScope) this._dataScope.finalize();\n        if (this._details) this._details.finalize();\n        if (this._tooltip) this._tooltip.finalize();\n        if (this.vegaViewGl) this.vegaViewGl.finalize();\n        if (this.presenter) this.presenter.finalize();\n        if (this.element) this.element.innerHTML = \"\";\n        this.colorContexts = null;\n        this.element = null;\n        this.options = null;\n        this.presenter = null;\n        this.vegaSpec = null;\n        this.vegaViewGl = null;\n        this._animator = null;\n        this._dataScope = null;\n        this._details = null;\n        this._tooltip = null;\n    }\n}\n/**\n * Default Viewer options.\n */ Viewer.defaultViewerOptions = (0, _defaults.defaultViewerOptions);\n\n},{\"./animator\":\"kk02d\",\"./axes\":\"45t5m\",\"./axisSelection\":\"7M9Zw\",\"./colorCubes\":\"fPITO\",\"./colorSchemes\":\"cHhTd\",\"./constants\":\"8f30h\",\"./dataScope\":\"hhaJZ\",\"./defaults\":\"eTIvp\",\"./details\":\"3aOo3\",\"./headers\":\"7c9Zj\",\"./legend\":\"3PtBg\",\"./ordinal\":\"2nX12\",\"./search\":\"aBDlu\",\"./signals\":\"8Gbiu\",\"./tooltip\":\"hJJ3c\",\"@msrvida/sanddance-specs\":\"gDvQs\",\"@msrvida/search-expression\":\"7aaNP\",\"@msrvida/vega-deck.gl\":\"dKeDo\",\"./characterSet\":\"4f4RP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kk02d\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataLayoutChange\", ()=>DataLayoutChange);\nparcelHelpers.export(exports, \"Animator\", ()=>Animator);\nvar DataLayoutChange;\n(function(DataLayoutChange1) {\n    DataLayoutChange1[DataLayoutChange1[\"same\"] = 0] = \"same\";\n    DataLayoutChange1[DataLayoutChange1[\"reset\"] = 1] = \"reset\";\n    DataLayoutChange1[DataLayoutChange1[\"refine\"] = 2] = \"refine\";\n})(DataLayoutChange || (DataLayoutChange = {}));\nclass Animator {\n    constructor(dataScope, props){\n        this.dataScope = dataScope;\n        this.props = props;\n    }\n    select(search) {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.select(search);\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n    deselect() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deselect();\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n    filter(search, keepData, collapseData, rebase) {\n        if (rebase) this.dataScope.collapse(false, keepData);\n        this.dataScope.collapse(true, collapseData);\n        return new Promise((resolve, reject)=>{\n            this.props.onAnimateDataChange(DataLayoutChange.refine, \"before refine\", \"refine\").then(()=>{\n                this.dataScope.deselect();\n                this.dataScope.setFilteredData(keepData);\n                this.props.onDataChanged(DataLayoutChange.refine, search);\n                resolve();\n            }).catch(reject);\n        });\n    }\n    reset() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deselect();\n            this.dataScope.setFilteredData(null);\n            this.props.onAnimateDataChange(DataLayoutChange.reset, \"before reset\", \"reset\").then(()=>{\n                this.dataScope.collapse(false);\n                this.props.onDataChanged(DataLayoutChange.reset);\n                resolve();\n            }).catch(reject);\n        });\n    }\n    activate(datum) {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.activate(datum);\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n    deactivate() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deactivate();\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"45t5m\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"recolorAxes\", ()=>recolorAxes);\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nfunction cloneAxis(axes, axisColor, axisTextColor) {\n    return axes.map((axis)=>{\n        const newAxis = _vegaDeckGl.util.deepMerge(axis);\n        if (newAxis.domain) newAxis.domain.color = axisColor;\n        if (newAxis.title) newAxis.title.color = axisTextColor;\n        newAxis.ticks.forEach((t)=>{\n            t.color = axisColor;\n        });\n        newAxis.tickText.forEach((t)=>{\n            t.color = axisTextColor;\n        });\n        return newAxis;\n    });\n}\nfunction cloneTextData(textData, color) {\n    return textData.map((t)=>{\n        return Object.assign(Object.assign({}, t), {\n            color\n        });\n    });\n}\nfunction recolorAxes(stage, oldColors, newColors) {\n    const hasNewLineColor = newColors.axisLine && newColors.axisLine !== oldColors.axisLine;\n    const hasNewTextColor = newColors.axisText && newColors.axisText !== oldColors.axisText;\n    let axes;\n    let textData;\n    if (hasNewLineColor || hasNewTextColor) {\n        const lineColor = _vegaDeckGl.util.colorFromString(newColors.axisLine || oldColors.axisLine);\n        const textColor = _vegaDeckGl.util.colorFromString(newColors.axisText || oldColors.axisText);\n        axes = {\n            x: cloneAxis(stage.axes.x, lineColor, textColor),\n            y: cloneAxis(stage.axes.y, lineColor, textColor),\n            z: cloneAxis(stage.axes.z, lineColor, textColor)\n        };\n    }\n    if (hasNewTextColor) textData = cloneTextData(stage.textData, _vegaDeckGl.util.colorFromString(newColors.axisText));\n    return {\n        axes,\n        textData\n    };\n}\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7M9Zw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"axisSelectionLayer\", ()=>axisSelectionLayer);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _expression = require(\"./expression\");\nvar _search = require(\"./search\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nfunction axisSelectionLayer(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n    const polygons = [];\n    const xRole = specCapabilities.roles.filter((r)=>r.role === \"x\")[0];\n    if (xRole && xRole.axisSelection) stage.axes.x.filter((axis)=>axis.tickText.length).forEach((axis)=>{\n        polygons.push.apply(polygons, axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n    });\n    const yRole = specCapabilities.roles.filter((r)=>r.role === \"y\")[0];\n    if (yRole && yRole.axisSelection) stage.axes.y.filter((axis)=>axis.tickText.length).forEach((axis)=>{\n        polygons.push.apply(polygons, axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n    });\n    if (stage.facets && columns.facet) polygons.push.apply(polygons, facetSelectionPolygons(stage.facets));\n    //move polygons to Z\n    polygons.forEach((datum)=>{\n        datum.polygon.forEach((p)=>{\n            p[2] = polygonZ;\n        });\n    });\n    const onClick = (o, e)=>clickHandler(e.srcEvent, o.object.search);\n    const polygonLayer = new _vegaDeckGl.base.layers.PolygonLayer({\n        autoHighlight: true,\n        coordinateSystem: _vegaDeckGl.base.deck.COORDINATE_SYSTEM.CARTESIAN,\n        data: polygons,\n        extruded: false,\n        highlightColor: _vegaDeckGl.util.colorFromString(highlightColor),\n        id: \"selections\",\n        onHover: (o, e)=>{\n            if (o.index === -1) presenter.deckgl.interactiveState.onAxisSelection = false;\n            else presenter.deckgl.interactiveState.onAxisSelection = true;\n        },\n        onClick,\n        getElevation: ()=>0,\n        getFillColor: ()=>[\n                0,\n                0,\n                0,\n                0\n            ],\n        pickable: true,\n        stroked: false\n    });\n    return polygonLayer;\n}\nfunction axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n    const polygons = [];\n    const size = 50;\n    const getSearch = axisSelectionType === \"exact\" ? (a, c, i)=>({\n            expressions: [\n                (0, _expression.selectExactAxis)(a, c, i)\n            ]\n        }) : (0, _expression.selectBetweenAxis);\n    const { domain , ticks  } = axis;\n    if (ticks.length > 0 && domain) {\n        const dim = vertical ? 1 : 0;\n        const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n        let divisions;\n        if (between) {\n            divisions = [];\n            for(let i = 1; i < ticks.length; i++)divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n        } else divisions = ticks.slice(1, -1).map((tick)=>tick.sourcePosition[dim]);\n        const add = (p2, i)=>{\n            const coords = [\n                [\n                    p1,\n                    q1\n                ],\n                [\n                    p2,\n                    q1\n                ],\n                [\n                    p2,\n                    q2\n                ],\n                [\n                    p1,\n                    q2\n                ]\n            ];\n            polygons.push({\n                search: getSearch(axis, column, i),\n                polygon: vertical ? coords.map((xy)=>xy.reverse()) : coords\n            });\n            p1 = p2;\n        };\n        let p1 = domain.sourcePosition[dim];\n        const q1 = domain.sourcePosition[vertical ? 0 : 1];\n        const q2 = q1 - size;\n        divisions.forEach(add);\n        add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n    }\n    return polygons;\n}\nfunction facetSelectionPolygons(facetRects) {\n    const polygons = [];\n    const linesAndSearches = facetRects.map(({ datum , lines  }, i)=>{\n        let group = (0, _search.getSearchGroupFromVegaValue)(datum[(0, _sanddanceSpecs.FieldNames).FacetSearch]);\n        return {\n            lines,\n            search: group\n        };\n    });\n    linesAndSearches.forEach(({ lines , search  }, i)=>{\n        //take any 2 lines to get a box dimension\n        const [x, y] = minMaxPoints(lines.slice(2));\n        polygons.push({\n            search,\n            polygon: [\n                [\n                    x.min,\n                    y.min\n                ],\n                [\n                    x.max,\n                    y.min\n                ],\n                [\n                    x.max,\n                    y.max\n                ],\n                [\n                    x.min,\n                    y.max\n                ]\n            ]\n        });\n    });\n    return polygons;\n}\nfunction minMaxPoints(lines) {\n    const points = [];\n    lines.forEach((line)=>{\n        [\n            line.sourcePosition,\n            line.targetPosition\n        ].forEach((point)=>{\n            points.push(point);\n        });\n    });\n    return [\n        0,\n        1\n    ].map((dim)=>{\n        let minMax = {\n            min: null,\n            max: null\n        };\n        points.forEach((point)=>{\n            if (minMax.max == null) minMax.max = point[dim];\n            else minMax.max = Math.max(minMax.max, point[dim]);\n            if (minMax.min == null) minMax.min = point[dim];\n            else minMax.min = Math.min(minMax.min, point[dim]);\n        });\n        return minMax;\n    });\n}\n\n},{\"./expression\":\"2iReT\",\"./search\":\"aBDlu\",\"@msrvida/sanddance-specs\":\"gDvQs\",\"@msrvida/vega-deck.gl\":\"dKeDo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2iReT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"notNice\", ()=>notNice);\nparcelHelpers.export(exports, \"selectNullOrEmpty\", ()=>selectNullOrEmpty);\nparcelHelpers.export(exports, \"selectExact\", ()=>selectExact);\nparcelHelpers.export(exports, \"selectNone\", ()=>selectNone);\nparcelHelpers.export(exports, \"selectExactAxis\", ()=>selectExactAxis);\nparcelHelpers.export(exports, \"selectBetween\", ()=>selectBetween);\nparcelHelpers.export(exports, \"selectBetweenAxis\", ()=>selectBetweenAxis);\nfunction notNice(niceValue) {\n    //convert \"nice\" numbers to numeric value\n    return (niceValue + \"\").replace(/[\\s,]/g, \"\");\n}\nfunction tickValue(axis, i) {\n    const tick = axis.tickText[i];\n    let value;\n    if (tick) value = axis.tickText[i].value;\n    return {\n        tick,\n        value\n    };\n}\nfunction selectNullOrEmpty(column) {\n    const searchExpression = {\n        name: column.name,\n        operator: \"isnullorEmpty\"\n    };\n    return searchExpression;\n}\nfunction selectExact(column, value) {\n    if (value == null) return selectNullOrEmpty(column);\n    const searchExpression = {\n        name: column.name,\n        operator: \"==\",\n        value\n    };\n    return searchExpression;\n}\nfunction selectNone(column, values) {\n    const expressions = values.map((value, i)=>{\n        const searchExpression = {\n            name: column.name,\n            operator: \"!=\",\n            value\n        };\n        if (i) searchExpression.clause = \"&&\";\n        return searchExpression;\n    });\n    const searchExpressionGroup = {\n        expressions\n    };\n    return searchExpressionGroup;\n}\nfunction selectExactAxis(axis, column, i) {\n    const result = tickValue(axis, i);\n    if (result.tick) return selectExact(column, result.value);\n}\nfunction selectBetween(column, lowValue, highValue, lowOperator = \">=\", highOperator = \"<\") {\n    const expressions = [];\n    if (lowValue !== undefined) expressions.push({\n        name: column.name,\n        operator: lowOperator,\n        value: lowValue\n    });\n    if (highValue !== undefined) expressions.push({\n        name: column.name,\n        operator: highOperator,\n        value: highValue\n    });\n    if (expressions.length > 1) expressions[1].clause = \"&&\";\n    const searchExpressionGroup = {\n        expressions\n    };\n    return searchExpressionGroup;\n}\nfunction selectBetweenAxis(axis, column, i) {\n    const low = tickValue(axis, i);\n    const high = tickValue(axis, i + 1);\n    return selectBetween(column, low.value, high.value);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aBDlu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSearchGroupFromVegaValue\", ()=>getSearchGroupFromVegaValue);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _array = require(\"./array\");\nfunction getSearchGroupFromVegaValue(search) {\n    let group;\n    const vegaSearch = search;\n    if (Array.isArray(vegaSearch)) {\n        //flatten into one group\n        group = {\n            expressions: []\n        };\n        vegaSearch.forEach((g)=>{\n            const clonedExpressions = _vegaDeckGl.util.clone(g.expressions).filter(Boolean);\n            clonedExpressions[0].clause = \"&&\";\n            (0, _array.push)(group.expressions, clonedExpressions);\n        });\n    } else group = vegaSearch ? {\n        expressions: vegaSearch.expressions.filter(Boolean)\n    } : null;\n    return group;\n}\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"./array\":\"8n3cf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8n3cf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"allTruthy\", ()=>allTruthy);\nparcelHelpers.export(exports, \"concat\", ()=>concat);\nparcelHelpers.export(exports, \"push\", ()=>push);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nconst { allTruthy , concat , push  } = (0, _vegaDeckGl.util);\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fPITO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSelectedColorMap\", ()=>getSelectedColorMap);\nparcelHelpers.export(exports, \"colorMapFromCubes\", ()=>colorMapFromCubes);\nparcelHelpers.export(exports, \"populateColorContext\", ()=>populateColorContext);\nparcelHelpers.export(exports, \"applyColorMapToCubes\", ()=>applyColorMapToCubes);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _constants = require(\"./constants\");\nfunction getSelectedColorMap(currentData, showSelectedData, showActive, viewerOptions) {\n    function getSelectionColorItem(datum) {\n        let item;\n        if (showSelectedData) item = datum[(0, _sanddanceSpecs.FieldNames).Selected] ? {\n            color: _vegaDeckGl.util.colorFromString(viewerOptions.colors.selectedCube)\n        } : {\n            unSelected: true\n        };\n        if (showActive && datum[(0, _sanddanceSpecs.FieldNames).Active]) item = {\n            color: _vegaDeckGl.util.colorFromString(viewerOptions.colors.activeCube)\n        };\n        return item;\n    }\n    const colorMap = {};\n    currentData.forEach((datum)=>{\n        const selectionColor = getSelectionColorItem(datum);\n        if (selectionColor) {\n            const ordinal = datum[0, _constants.GL_ORDINAL];\n            colorMap[ordinal] = selectionColor;\n        }\n    });\n    return colorMap;\n}\nfunction colorMapFromCubes(cubes) {\n    const map = {};\n    cubes.forEach((cube)=>{\n        map[cube.ordinal] = {\n            color: cube.color\n        };\n    });\n    return map;\n}\nfunction populateColorContext(colorContext, presenter) {\n    if (!colorContext.colorMap) {\n        const cubes = presenter.getCubeData();\n        colorContext.colorMap = colorMapFromCubes(cubes);\n    }\n    colorContext.legend = _vegaDeckGl.util.clone(presenter.stage.legend);\n    colorContext.legendElement = presenter.getElement(_vegaDeckGl.PresenterElement.legend).children[0];\n}\nfunction applyColorMapToCubes(maps, cubes, unselectedColorMethod) {\n    Object.keys(maps[0]).forEach((ordinal)=>{\n        const cube = cubes[+ordinal];\n        if (cube && !cube.isEmpty) {\n            const actualColorMappedItem = maps[0][ordinal];\n            if (maps.length > 1) {\n                const selectedColorMappedItem = maps[1][ordinal];\n                if (selectedColorMappedItem) {\n                    if (selectedColorMappedItem.unSelected && unselectedColorMethod) cube.color = unselectedColorMethod(actualColorMappedItem.color);\n                    else cube.color = selectedColorMappedItem.color;\n                    return;\n                }\n            }\n            cube.color = actualColorMappedItem.color;\n        }\n    });\n}\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"@msrvida/sanddance-specs\":\"gDvQs\",\"./constants\":\"8f30h\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hhaJZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataScope\", ()=>DataScope);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _searchExpression = require(\"@msrvida/search-expression\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _constants = require(\"./constants\");\nclass DataScope {\n    constructor(){\n        this.filteredColumnsStats = {};\n    }\n    setData(data, columns) {\n        const differentData = this.data !== data;\n        if (differentData) {\n            if (this.data) //clean up things we added to old data\n            this.deselect();\n            this.data = data;\n            this.columns = columns;\n            this.filteredData = null;\n            this.filteredColumnsStats = {};\n        }\n        return differentData;\n    }\n    setFilteredData(filteredData) {\n        this.filteredData = filteredData;\n        this.filteredColumnsStats = {};\n    }\n    getColumns(columnTypes) {\n        if (!this.columns) this.columns = (0, _sanddanceSpecs.getColumnsFromData)(_vegaDeckGl.base.vega.inferTypes, this.data, columnTypes);\n        return this.columns;\n    }\n    getFilteredColumnStats(columnName) {\n        if (!this.filteredColumnsStats[columnName]) this.filteredColumnsStats[columnName] = (0, _sanddanceSpecs.getStats)(this.filteredData, this.columns.filter((c)=>c.name === columnName)[0]);\n        return this.filteredColumnsStats[columnName];\n    }\n    currentData() {\n        return this.filteredData || this.data;\n    }\n    select(search) {\n        this.deselect();\n        if (search) {\n            this.selection = this.createUserSelection(search, true, false);\n            if (this.selection.included.length) this.activate(this.selection.included[0]);\n        }\n    }\n    createUserSelection(search, assign, rebase) {\n        const exec = new (0, _searchExpression.Exec)(search, this.getColumns());\n        const s = {\n            search,\n            included: [],\n            excluded: []\n        };\n        const data = rebase ? this.data : this.currentData();\n        data.forEach((datum)=>{\n            if (exec.run(datum)) {\n                if (assign) datum[(0, _sanddanceSpecs.FieldNames).Selected] = true;\n                s.included.push(datum);\n            } else s.excluded.push(datum);\n        });\n        return s;\n    }\n    deselect() {\n        this.deactivate();\n        this.data.forEach((datum)=>{\n            delete datum[(0, _sanddanceSpecs.FieldNames).Selected];\n        });\n        this.selection = null;\n    }\n    hasFilteredData() {\n        return !!this.filteredData;\n    }\n    hasSelectedData() {\n        return !!this.selection;\n    }\n    collapse(collapsed, data = this.data) {\n        data.forEach((datum)=>{\n            datum[(0, _sanddanceSpecs.FieldNames).Collapsed] = collapsed;\n        });\n        this.isCollapsed = collapsed;\n    }\n    activate(datum) {\n        this.deactivate();\n        datum[(0, _sanddanceSpecs.FieldNames).Active] = true;\n        this.active = datum;\n    }\n    deactivate() {\n        if (this.active) delete this.active[(0, _sanddanceSpecs.FieldNames).Active];\n        this.active = null;\n    }\n    ordinalIndexWithinSelection(ordinal) {\n        if (this.selection) for(let i = 0; i < this.selection.included.length; i++){\n            let datum = this.selection.included[i];\n            if (datum[0, _constants.GL_ORDINAL] === ordinal) return {\n                datum,\n                index: i\n            };\n        }\n        return {\n            datum: null,\n            index: -1\n        };\n    }\n    finalize() {\n        this.data = null;\n        this.filteredData = null;\n        this.filteredColumnsStats = null;\n        if (this.selection) {\n            this.selection.excluded = null;\n            this.selection.included = null;\n            this.selection = null;\n        }\n    }\n}\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"@msrvida/search-expression\":\"7aaNP\",\"@msrvida/sanddance-specs\":\"gDvQs\",\"./constants\":\"8f30h\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3aOo3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Details\", ()=>Details);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _defaults = require(\"./defaults\");\nvar _constants = require(\"./constants\");\nvar _searchExpression = require(\"@msrvida/search-expression\");\nvar _util = require(\"./util\");\nvar Action;\n(function(Action1) {\n    Action1[Action1[\"deselect\"] = 0] = \"deselect\";\n    Action1[Action1[\"isolate\"] = 1] = \"isolate\";\n    Action1[Action1[\"exclude\"] = 2] = \"exclude\";\n    Action1[Action1[\"reset\"] = 3] = \"reset\";\n    Action1[Action1[\"next\"] = 4] = \"next\";\n    Action1[Action1[\"previous\"] = 5] = \"previous\";\n})(Action || (Action = {}));\nclass Details {\n    constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps){\n        this.language = language;\n        this.animator = animator;\n        this.dataScope = dataScope;\n        this.colorMapHandler = colorMapHandler;\n        this.hasColorMaps = hasColorMaps;\n        this.element = (0, _vegaDeckGl.util).addDiv(parentElement, `${(0, _defaults.cssPrefix)}unitControls`);\n        this.clear();\n    }\n    finalize() {\n        if (this.element) this.element.innerHTML = \"\";\n        this.dataScope = null;\n        this.element = null;\n    }\n    clear() {\n        this.state = {\n            userSelection: null,\n            index: -1,\n            remapColor: false\n        };\n        this.render();\n    }\n    clearSelection() {\n        this.state.userSelection = null;\n        this.state.index = -1;\n        this.render();\n    }\n    populate(userSelection, index = 0) {\n        this.state.userSelection = userSelection;\n        this.state.index = index;\n        this.render();\n    }\n    selectByNameValue(columnName, value) {\n        const search = {\n            name: columnName,\n            operator: \"==\",\n            value\n        };\n        this.clearSelection();\n        this.animator.select(search);\n        this.populate(this.dataScope.selection);\n    }\n    remapChanged(remap) {\n        this.state.remapColor = remap;\n        this.colorMapHandler(remap);\n        this.render();\n    }\n    handleAction(action) {\n        let p;\n        const u = this.state.userSelection;\n        switch(action){\n            case Action.deselect:\n                this.clearSelection();\n                p = this.animator.deselect();\n                break;\n            case Action.exclude:\n                this.clearSelection();\n                p = this.animator.filter((0, _searchExpression.invert)(u.search), u.excluded, u.included, false);\n                this.state.remapColor = false;\n                break;\n            case Action.isolate:\n                this.clearSelection();\n                p = this.animator.filter(u.search, u.included, u.excluded, false);\n                this.state.remapColor = false;\n                break;\n            case Action.reset:\n                this.clear();\n                p = this.animator.reset();\n                break;\n            default:\n                switch(action){\n                    case Action.previous:\n                        this.state.index--;\n                        if (this.state.index < 0) this.state.index = this.state.userSelection.included.length - 1;\n                        break;\n                    case Action.next:\n                        this.state.index++;\n                        if (this.state.index >= this.state.userSelection.included.length) this.state.index = 0;\n                        break;\n                }\n                this.render();\n                p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n        p.then(()=>this.render());\n    }\n    render() {\n        const hasRefinedData = this.dataScope.hasFilteredData();\n        const renderProps = {\n            language: this.language,\n            actionHandler: (action)=>this.handleAction(action),\n            selectionHandler: (columnName, value)=>this.selectByNameValue(columnName, value),\n            count: this.state.userSelection && this.state.userSelection.included.length,\n            hasRefinedData,\n            item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n            remapColorHandler: (remap)=>this.remapChanged(remap),\n            hasColorMaps: this.hasColorMaps() && hasRefinedData,\n            remapColor: this.state.remapColor\n        };\n        const a = _vegaDeckGl.util.getActiveElementInfo();\n        _vegaDeckGl.util.mount(renderDetails(renderProps), this.element);\n        _vegaDeckGl.util.setActiveElement(a);\n    }\n}\nconst renderDetails = (props)=>{\n    const controlButtons = [\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler(Action.deselect)\n        }, props.language.deselect),\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler(Action.isolate)\n        }, props.language.isolate),\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler(Action.exclude)\n        }, props.language.exclude)\n    ];\n    const colorMapping = _vegaDeckGl.util.createElement(\"div\", null, _vegaDeckGl.util.createElement(\"button\", {\n        disabled: props.remapColor,\n        onClick: (e)=>props.remapColorHandler(true)\n    }, props.language.newColorMap), _vegaDeckGl.util.createElement(\"button\", {\n        disabled: !props.remapColor,\n        onClick: (e)=>props.remapColorHandler(false)\n    }, props.language.oldColorMap));\n    const singleItem = props.count === 1;\n    const scrollButtons = [\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: singleItem,\n            onClick: (e)=>props.actionHandler(Action.previous)\n        }, props.language.previousDetail),\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: singleItem,\n            onClick: (e)=>props.actionHandler(Action.next)\n        }, props.language.nextDetail),\n        _vegaDeckGl.util.createElement(\"span\", null, \" \", props.language.selectionCount(props.count))\n    ];\n    const rows = [];\n    for(let prop in props.item){\n        if (prop === (0, _constants.GL_ORDINAL)) continue;\n        if ((0, _util.isInternalFieldName)(prop)) continue;\n        rows.push({\n            cells: [\n                {\n                    content: prop\n                },\n                {\n                    content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler)\n                }\n            ]\n        });\n    }\n    return _vegaDeckGl.util.createElement(\"div\", null, props.hasColorMaps && colorMapping, _vegaDeckGl.util.createElement(\"h4\", null, props.language.headers.selection), _vegaDeckGl.util.createElement(\"div\", {\n        className: `${(0, _defaults.cssPrefix)}selection`\n    }, controlButtons, _vegaDeckGl.util.createElement(\"button\", {\n        disabled: !props.hasRefinedData,\n        onClick: (e)=>props.actionHandler(Action.reset)\n    }, \"reset\")), props.item && _vegaDeckGl.util.createElement(\"h4\", null, props.language.headers.details), _vegaDeckGl.util.createElement(\"div\", null, _vegaDeckGl.util.createElement(\"div\", {\n        className: `${(0, _defaults.cssPrefix)}details-scroll`\n    }, props.item && scrollButtons), _vegaDeckGl.util.createElement(\"div\", {\n        className: `${(0, _defaults.cssPrefix)}details`\n    }, props.item && _vegaDeckGl.util.createElement((0, _vegaDeckGl.controls).Table, {\n        rows: rows\n    }))));\n};\nfunction linkSelect(language, columnName, value, selectionHandler) {\n    return _vegaDeckGl.util.createElement(\"span\", null, _vegaDeckGl.util.createElement(\"a\", {\n        href: \"#\",\n        onClick: (e)=>selectionHandler(columnName, value)\n    }, value), isNaN(value) ? [\n        \" \",\n        _vegaDeckGl.util.createElement(\"a\", {\n            className: \"bing-search\",\n            href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n            target: \"_blank\"\n        }, language.bing)\n    ] : \"\");\n}\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"./defaults\":\"eTIvp\",\"./constants\":\"8f30h\",\"@msrvida/search-expression\":\"7aaNP\",\"./util\":\"jvEtL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7c9Zj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ensureHeaders\", ()=>ensureHeaders);\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nfunction ensureHeaders(presenter, headers) {\n    const vegaControls = presenter.getElement((0, _vegaDeckGl.PresenterElement).vegaControls);\n    conditionalHeader(!!vegaControls.querySelectorAll(\".vega-bindings > *\").length, vegaControls, headers.chart);\n    const legend = presenter.getElement((0, _vegaDeckGl.PresenterElement).legend);\n    conditionalHeader(!!legend.children.length, legend, headers.legend);\n}\nfunction conditionalHeader(condition, element, header) {\n    var existing = existingHeader(element, header);\n    if (condition && !existing) addHeader(element, header);\n    if (!condition && existing) existing.remove();\n}\nfunction addHeader(element, header) {\n    const h = document.createElement(\"h4\");\n    h.innerHTML = header;\n    element.insertAdjacentElement(\"beforebegin\", h);\n}\nfunction existingHeader(element, header) {\n    const { previousElementSibling  } = element;\n    if (previousElementSibling && previousElementSibling.innerHTML === header) return previousElementSibling;\n}\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3PtBg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"finalizeLegend\", ()=>finalizeLegend);\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _expression = require(\"./expression\");\nfunction legendRange(colorBinType, column, legend, clickedIndex) {\n    if (column.quantitative) return selectQuantitative(colorBinType, column, legend, clickedIndex);\n    else return selectCategorical(column, legend, clickedIndex);\n}\nfunction selectCategorical(column, legend, clickedIndex) {\n    const value = legend.rows[clickedIndex].value;\n    if (value === (0, _sanddanceSpecs.Other)) {\n        const values = [];\n        for(let i in legend.rows)if (+i !== clickedIndex) values.push(legend.rows[i].value);\n        return (0, _expression.selectNone)(column, values);\n    } else //select equal\n    return {\n        expressions: [\n            (0, _expression.selectExact)(column, legend.rows[clickedIndex].value)\n        ]\n    };\n}\nfunction selectQuantitative(colorBinType, column, legend, clickedIndex) {\n    const keys = Object.keys(legend.rows).map((key)=>+key).sort((a, b)=>+a - +b);\n    let lowValue;\n    let lowOperator;\n    let highValue;\n    let highOperator;\n    const rowText = legend.rows[clickedIndex].label;\n    switch(colorBinType){\n        case \"continuous\":\n            lowValue = rowText;\n            if (clickedIndex < keys.length - 1) highValue = legend.rows[clickedIndex + 1].value;\n            break;\n        default:\n            {\n                if (rowText.indexOf(\"null\") > 0) {\n                    const ex = {\n                        expressions: [\n                            (0, _expression.selectNullOrEmpty)(column)\n                        ]\n                    };\n                    return ex;\n                }\n                const dash = rowText.indexOf(\"\\u2013\"); //this is not the common dash character!\n                if (dash > 0) {\n                    //bug in Vega for quantize?\n                    //lowOperator = '>';\n                    //highOperator = '<=';\n                    lowValue = rowText.substr(0, dash);\n                    highValue = rowText.substr(dash + 1);\n                } else {\n                    if (rowText.indexOf(\"<\") >= 0) highValue = rowText.substring(2);\n                    else if (rowText.indexOf(\"\\u2265\") >= 0) lowValue = rowText.substring(2);\n                }\n            }\n    }\n    if (lowValue) lowValue = (0, _expression.notNice)(lowValue);\n    if (highValue) highValue = (0, _expression.notNice)(highValue);\n    if (lowValue === highValue) return {\n        expressions: [\n            (0, _expression.selectExact)(column, lowValue)\n        ]\n    };\n    else return (0, _expression.selectBetween)(column, lowValue, highValue, lowOperator, highOperator);\n}\nfunction finalizeLegend(colorBinType, colorColumn, legend, language) {\n    const rowTexts = [];\n    for(let i in legend.rows){\n        let row = legend.rows[i];\n        row.search = legendRange(colorBinType, colorColumn, legend, +i);\n        if (row.value === (0, _sanddanceSpecs.Other)) row.label = language.legendOther;\n        else rowTexts.push(row.value);\n    }\n}\n\n},{\"@msrvida/sanddance-specs\":\"gDvQs\",\"./expression\":\"2iReT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2nX12\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assignOrdinals\", ()=>assignOrdinals);\nparcelHelpers.export(exports, \"getDataIndexOfCube\", ()=>getDataIndexOfCube);\nvar _constants = require(\"./constants\");\nfunction assignOrdinals(columns, data, ordinalMap) {\n    const uCol = columns.uid && columns.uid.name;\n    if (ordinalMap) data.forEach((d, i)=>{\n        const key = uCol ? d[uCol] : i;\n        d[0, _constants.GL_ORDINAL] = ordinalMap[key];\n    });\n    else {\n        ordinalMap = {};\n        data.forEach((d, i)=>{\n            d[0, _constants.GL_ORDINAL] = i;\n            const uColValue = uCol ? d[uCol] : i;\n            ordinalMap[uColValue] = i;\n        });\n    }\n    return ordinalMap;\n}\nfunction getDataIndexOfCube(cube, data) {\n    const len = data.length;\n    for(let i = 0; i < len; i++){\n        if (data[i][0, _constants.GL_ORDINAL] === cube.ordinal) return i;\n    }\n}\n\n},{\"./constants\":\"8f30h\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8Gbiu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"applySignalValues\", ()=>applySignalValues);\nparcelHelpers.export(exports, \"extractSignalValuesFromView\", ()=>extractSignalValuesFromView);\nfunction applySignalValues(sv, b) {\n    if (!sv || !b || !b.signals || !b.signals.length) return;\n    for(let key in sv){\n        let value = sv[key];\n        let signalB = b.signals.filter((signal)=>signal.name === key)[0];\n        if (signalB && signalB.bind) signalB.value = value;\n    }\n}\nfunction extractSignalValuesFromView(view, spec) {\n    if (!view || !spec || !spec.signals || !spec.signals.length) return;\n    const result = {};\n    spec.signals.forEach((signalA)=>{\n        //bound to a UI control\n        if (signalA.bind) try {\n            result[signalA.name] = view.signal(signalA.name);\n        } catch (e) {\n        // continue regardless of error\n        }\n    });\n    return result;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hJJ3c\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Tooltip\", ()=>Tooltip);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _constants = require(\"./constants\");\nvar _util = require(\"./util\");\nconst { outerSize  } = _vegaDeckGl.util;\nconst { Table  } = _vegaDeckGl.controls;\nclass Tooltip {\n    constructor(props){\n        const renderProps = {\n            cssPrefix: props.cssPrefix,\n            rows: getRows(props.item, props.options)\n        };\n        this.element = renderTooltip(renderProps);\n        if (this.element) {\n            this.element.style.position = \"absolute\";\n            this.child = this.element.firstChild;\n            document.body.appendChild(this.element);\n            //measure and move as necessary\n            let m = outerSize(this.child);\n            while(m.height > document.documentElement.clientHeight){\n                let tr = this.child.querySelector(\"tr:last-child\");\n                if (tr) tr.parentElement.removeChild(tr);\n                else break;\n                m = outerSize(this.child);\n            }\n            if (props.position.clientX + m.width >= document.documentElement.clientWidth) this.child.style.right = \"0\";\n            let moveTop = true;\n            if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n                if (props.position.clientY - m.height > 0) this.child.style.bottom = \"0\";\n                else moveTop = false;\n            }\n            if (moveTop) this.element.style.top = `${props.position.clientY}px`;\n            this.element.style.left = `${props.position.clientX}px`;\n        }\n    }\n    finalize() {\n        if (this.element) document.body.removeChild(this.element);\n        this.element = null;\n    }\n}\nfunction getRows(item, options) {\n    const rows = [];\n    for(let columnName in item){\n        if (columnName === (0, _constants.GL_ORDINAL)) continue;\n        if ((0, _util.isInternalFieldName)(columnName)) continue;\n        if (options && options.exclude) {\n            if (options.exclude(columnName)) continue;\n        }\n        let value = item[columnName];\n        let content;\n        if (options && options.displayValue) content = options.displayValue(value);\n        else switch(value){\n            case null:\n                content = _vegaDeckGl.util.createElement(\"i\", null, \"null\");\n                break;\n            case undefined:\n                content = _vegaDeckGl.util.createElement(\"i\", null, \"undefined\");\n                break;\n            default:\n                content = value.toString();\n        }\n        rows.push({\n            cells: [\n                {\n                    content: columnName + \":\"\n                },\n                {\n                    content\n                }\n            ]\n        });\n    }\n    return rows;\n}\nconst renderTooltip = (props)=>{\n    return props.rows.length === 0 ? null : _vegaDeckGl.util.createElement(\"div\", {\n        className: `${props.cssPrefix}tooltip`\n    }, Table({\n        rows: props.rows\n    }));\n};\n\n},{\"@msrvida/vega-deck.gl\":\"dKeDo\",\"./constants\":\"8f30h\",\"./util\":\"jvEtL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4f4RP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CharacterSet\", ()=>CharacterSet);\nclass CharacterSet {\n    resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n        if (forceNewCharacterSet || needsNewCharacterSet(oldInsight, newInsight)) this.chars = undefined;\n    }\n    getCharacterSet(stage) {\n        if (!this.chars) {\n            const map = {};\n            const addText = (text)=>{\n                Array.from(text).forEach((char)=>{\n                    map[char] = true;\n                });\n            };\n            stage.textData.forEach((t)=>addText(t.text));\n            const { x , y , z  } = stage.axes;\n            [\n                x,\n                y,\n                z\n            ].forEach((axes)=>{\n                axes.forEach((axis)=>{\n                    if (axis.tickText) axis.tickText.forEach((t)=>addText(t.text));\n                    if (axis.title) addText(axis.title.text);\n                });\n            });\n            this.chars = Object.keys(map);\n        }\n        return this.chars;\n    }\n}\nfunction needsNewCharacterSet(oldInsight, newInsight) {\n    if (!oldInsight) return true;\n    if (!newInsight) return true;\n    if (oldInsight.chart !== newInsight.chart) return true;\n    if (oldInsight.facetStyle !== newInsight.facetStyle) return true;\n    if (oldInsight.totalStyle !== newInsight.totalStyle) return true;\n    if (oldInsight.hideAxes !== newInsight.hideAxes) return true;\n    if (oldInsight.view !== newInsight.view) return true;\n    if (differentObjectValues(oldInsight.signalValues, newInsight.signalValues)) return true;\n    if (differentObjectValues(oldInsight.size, newInsight.size)) return true;\n    const oldColumns = oldInsight.columns;\n    const newColumns = newInsight.columns;\n    if (oldColumns.facet !== newColumns.facet) return true;\n    if (oldColumns.facetV !== newColumns.facetV) return true;\n    if (oldColumns.x !== newColumns.x) return true;\n    if (oldColumns.y !== newColumns.y) return true;\n    if (oldColumns.z !== newColumns.z) return true;\n    return false;\n}\nfunction differentObjectValues(a, b) {\n    if (!a && !b) return false;\n    if (!a || !b) return true;\n    const keys = Object.keys(b);\n    for(let i = 0; i < keys.length; i++){\n        let key = keys[i];\n        let ta = typeof a;\n        let tb = typeof b;\n        if (ta !== tb) return true;\n        if (ta === \"object\") return differentObjectValues(a[key], b[key]);\n        else {\n            if (a[key] !== b[key]) return true;\n        }\n    }\n    return false;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aXH63\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"version\", ()=>version);\nconst version = \"3.2.1\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4RaV2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"classList\", ()=>classList);\nparcelHelpers.export(exports, \"deepCompare\", ()=>deepCompare);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _justCompare = require(\"just-compare\");\nconst classList = (...args)=>{\n    return args.filter(Boolean).join(\" \");\n};\nconst deepCompare = _justCompare.default || _justCompare;\n\n},{\"just-compare\":\"3zHsm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3zHsm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>collectionCompare);\nvar collectionCompare = compare;\n/*\n  primitives: value1 === value2\n  functions: value1.toString == value2.toString\n  arrays: if length, sequence and values of properties are identical\n  objects: if length, names and values of properties are identical\n  compare([[1, [2, 3]], [[1, [2, 3]]); // true\n  compare([[1, [2, 3], 4], [[1, [2, 3]]); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3}); // true\n  compare({a: 2, b: 3}, {b: 3, a: 2}); // true\n  compare({a: 2, b: 3, c: 4}, {a: 2, b: 3}); // false\n  compare({a: 2, b: 3}, {a: 2, b: 3, c: 4}); // false\n  compare([[1, [2, {a: 4}], 4], [[1, [2, {a: 4}]]); // true\n*/ function compare(value1, value2) {\n    if (value1 === value2) return true;\n    /* eslint-disable no-self-compare */ // if both values are NaNs return true\n    if (value1 !== value1 && value2 !== value2) return true;\n    if (({}).toString.call(value1) != ({}).toString.call(value2)) return false;\n    if (value1 !== Object(value1)) // non equal primitives\n    return false;\n    if (!value1) return false;\n    if (Array.isArray(value1)) return compareArrays(value1, value2);\n    if (({}).toString.call(value1) == \"[object Set]\") return compareArrays(Array.from(value1), Array.from(value2));\n    if (({}).toString.call(value1) == \"[object Object]\") return compareObjects(value1, value2);\n    else return compareNativeSubtypes(value1, value2);\n}\nfunction compareNativeSubtypes(value1, value2) {\n    // e.g. Function, RegExp, Date\n    return value1.toString() === value2.toString();\n}\nfunction compareArrays(value1, value2) {\n    var len = value1.length;\n    if (len != value2.length) return false;\n    var alike = true;\n    for(var i = 0; i < len; i++)if (!compare(value1[i], value2[i])) {\n        alike = false;\n        break;\n    }\n    return alike;\n}\nfunction compareObjects(value1, value2) {\n    var keys1 = Object.keys(value1).sort();\n    var keys2 = Object.keys(value2).sort();\n    var len = keys1.length;\n    if (len != keys2.length) return false;\n    for(var i = 0; i < len; i++){\n        var key1 = keys1[i];\n        var key2 = keys2[i];\n        if (!(key1 == key2 && compare(value1[key1], value2[key2]))) return false;\n    }\n    return true;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2bHQo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"compareProps\", ()=>compareProps);\nparcelHelpers.export(exports, \"SandDanceReact\", ()=>SandDanceReact);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _util = require(\"./util\");\nvar _sanddance = require(\"@msrvida/sanddance\");\nfunction addNullable(insight, signalValues) {\n    const withNulls = Object.assign(Object.assign({\n        view: null,\n        filter: null\n    }, insight), {\n        signalValues\n    });\n    return withNulls;\n}\nfunction compareProps(viewer, insight) {\n    const currentInsight = viewer.getInsight();\n    const a = addNullable(currentInsight, Object.assign(Object.assign({}, viewer.insight.signalValues), currentInsight.signalValues));\n    const b = addNullable(insight, Object.assign(Object.assign({}, a.signalValues), insight.signalValues));\n    const compare = (0, _util.deepCompare)(a, b);\n    return {\n        a,\n        b,\n        compare\n    };\n}\nfunction _SandDanceReact(props) {\n    class __SandDanceReact extends (0, _base.base).react.Component {\n        layout() {\n            this.lastData = this.props.data;\n            this.viewer.render(this.props.insight, this.props.data, this.props.renderOptions).then((renderResult)=>{\n                //TODO: show errors if any\n                //console.log('viewer render');\n                this.props.onView && this.props.onView(renderResult);\n            }).catch((e)=>{\n                //console.log('viewer error');\n                this.props.onError && this.props.onError(e);\n            });\n        }\n        view() {\n            if (this.props.insight && this.props.data) {\n                const c = compareProps(this.viewer, this.props.insight);\n                const sameDataRef = this.props.data === this.lastData;\n                if (!c.compare || !sameDataRef) this.layout();\n            }\n        }\n        componentDidMount() {\n            const element = (0, _base.base).reactDOM.findDOMNode(this.viewerDiv);\n            this.viewer = new (0, _sanddance.Viewer)(element, this.props.viewerOptions);\n            if (this.props.onMount) {\n                if (this.props.onMount(this.viewer.presenter.getElement((0, _sanddance.VegaDeckGl).PresenterElement.gl))) this.view();\n            } else this.view();\n        }\n        componentDidUpdate() {\n            this.viewer.options = (0, _sanddance.VegaDeckGl).util.deepMerge(this.viewer.options, this.props.viewerOptions);\n            this.view();\n        }\n        componentWillUnmount() {\n            this.viewer.finalize();\n        }\n        render() {\n            return (0, _base.base).react.createElement(\"div\", {\n                className: \"sanddance-ReactViewer\",\n                ref: (div)=>this.viewerDiv = div\n            });\n        }\n    }\n    return new __SandDanceReact(props);\n}\nconst SandDanceReact = _SandDanceReact;\n\n},{\"./base\":\"anbmZ\",\"./util\":\"4RaV2\",\"@msrvida/sanddance\":\"69nA6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"anbmZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"base\", ()=>base);\n/**\n * Specify the dependency libraries to use for rendering.\n * @param react React library.\n * @param vega Vega library.\n * @param deck @deck.gl/core library.\n * @param layers @deck.gl/layers library.\n * @param luma @luma.gl/core library.\n */ parcelHelpers.export(exports, \"use\", ()=>use);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _viewer = require(\"./viewer\");\nvar _sanddance = require(\"@msrvida/sanddance\");\nconst base = {\n    react: null,\n    reactDOM: null\n};\nfunction use(react, reactDOM, vega, deck, layers, luma) {\n    _sanddance.VegaDeckGl.use(vega, deck, layers, luma);\n    base.react = react;\n    base.reactDOM = reactDOM;\n    //inform React that we are using a dynamic base class\n    (0, _viewer.SandDanceReact).prototype = react.Component.prototype;\n}\n\n},{\"./viewer\":\"2bHQo\",\"@msrvida/sanddance\":\"69nA6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f6eTA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"version\", ()=>version);\nconst version = \"3.0.1\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hpJp2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Signal\", ()=>Signal);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nfunction Signal(props) {\n    if (!props.explorer.viewer || !props.signal) return null;\n    if (props.signal.bind) {\n        const input = props.signal.bind.input;\n        if (input) {\n            const fn = map[input];\n            if (fn) {\n                const prefix = props.prefix ? `${props.prefix} ` : \"\";\n                let initialValue;\n                try {\n                    initialValue = props.explorer.viewer.vegaViewGl.signal(props.signal.name);\n                } catch (error) {\n                // continue regardless of error\n                }\n                const control = fn(prefix, props.signal.bind, initialValue, (value)=>{\n                    props.onChange && props.onChange(value);\n                    props.explorer.signal(props.signal.name, value, props.newViewStateTarget);\n                }, props.disabled, props.collapseLabel, props.componentRef);\n                return (0, _base.base).react.createElement(\"div\", {\n                    className: \"sanddance-signal\"\n                }, control);\n            }\n        }\n    }\n    return null;\n}\nconst map = {};\nmap[\"range\"] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    return (0, _base.base).react.createElement((0, _base.base).fluentUI.Slider, {\n        componentRef: ref,\n        label: prefix + bind.name,\n        max: bind.max,\n        min: bind.min,\n        step: bind.step,\n        defaultValue: initialValue,\n        onChange: onChange,\n        disabled: disabled\n    });\n};\nmap[\"select\"] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    const options = bind.options.map((o, i)=>{\n        const option = {\n            key: o,\n            text: o\n        };\n        return option;\n    });\n    const label = prefix + bind.name;\n    return (0, _base.base).react.createElement((0, _base.base).fluentUI.Dropdown, {\n        componentRef: ref,\n        onRenderTitle: collapseLabel ? (a, b)=>(0, _base.base).react.createElement(\"span\", null, label, \": \", a[0].text) : undefined,\n        defaultSelectedKey: initialValue,\n        label: collapseLabel ? undefined : label,\n        options: options,\n        onChange: (e, o)=>onChange(o.text),\n        disabled: disabled\n    });\n};\nmap[\"checkbox\"] = (prefix, bind, initialValue, onChange, disabled, collapseLabel, ref)=>{\n    return (0, _base.base).react.createElement((0, _base.base).fluentUI.Toggle, {\n        componentRef: ref,\n        defaultChecked: initialValue,\n        label: prefix + bind.name,\n        onChange: (e, checked)=>onChange(checked),\n        disabled: disabled\n    });\n}; //TODO other signal types\n\n},{\"../base\":\"b6Cy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7qvdA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"strings\", ()=>strings);\nconst strings = {\n    appName: \"SandDance\",\n    bingsearch: \"Bing\",\n    bingsearchDescription: (term)=>`Search Bing for \"${term}\"`,\n    buttonClose: \"Close\",\n    buttonSelect: \"Search & Select\",\n    buttonColorSchemeMap: \"Map color scheme to filtered data\",\n    buttonColorSchemeRemap: \"Remap color to filtered data\",\n    buttonColorSchemeKeep: \"Keep same color scheme\",\n    buttonCopyToClipboard: \"Copy to clipboard\",\n    buttonExclude: \"Exclude\",\n    buttonExport: \"Export\",\n    buttonExportCount: (total)=>total == 1 ? \"Export 1 row...\" : `Export ${total} rows...`,\n    buttonIsolate: \"Isolate\",\n    buttonReset: \"Stop filtering\",\n    buttonDeselect: \"Clear selection\",\n    buttonToolbarFloat: \"Float toolbar\",\n    buttonToolbarDock: \"Dock toolbar\",\n    buttonToolbarHide: \"Hide toolbar\",\n    buttonToolbarShow: \"Show toolbar\",\n    buttonNextDataItem: \"Next data item\",\n    buttonPrevDataItem: \"Previous data item\",\n    buttonCreateSnapshot: \"Create snapshot\",\n    buttonNextSnapshot: \"Next snapshot\",\n    buttonPrevSnapshot: \"Previous snapshot\",\n    buttonUpdateSnapshot: \"Update snapshot\",\n    buttonAddExpression: \"Add expression\",\n    buttonAddExpressionGroup: \"Add group\",\n    buttonDeleteExpression: \"Delete\",\n    buttonDeleteExpressionGroup: \"Delete group\",\n    buttonClearSnapshots: \"Clear snapshots\",\n    buttonDeleteSnapshot: \"Delete snapshot\",\n    buttonEditSnapshot: \"Edit snapshot\",\n    buttonMoveUp: \"Move up\",\n    buttonMoveDown: \"Move down\",\n    buttonShowVegaSpec: \"Show Vega spec\",\n    buttonLaunchVegaEditor: \"Open Vega Editor\",\n    buttonCameraHome: \"Center chart in window\",\n    buttonTooltipMapping: \"Tooltip columns...\",\n    buttonUndo: \"Undo\",\n    buttonRedo: \"Redo\",\n    chartTypeBarChartH: \"Bar\",\n    chartTypeBarChartV: \"Column\",\n    chartTypeDensity: \"Density\",\n    chartTypeGrid: \"Grid\",\n    chartTypeScatterPlot: \"Scatter\",\n    chartTypeStacks: \"Stacks\",\n    chartTypeStrips: \"Strips\",\n    chartTypeTreeMap: \"Treemap\",\n    defaultFileName: \"sanddance-data\",\n    errorExportFilenameEmpty: \"Filename cannot be blank\",\n    errorExportFilenameCharacters: (characters)=>`A filename cannot contain any of the following characters: ${characters}`,\n    errorColumnMustBeNumeric: \"Numeric column required for this chart type.\",\n    labelBlank: \"blank\",\n    labelNull: \"null\",\n    labelTrue: \"true\",\n    labelFalse: \"false\",\n    labelSystemInfo: \"System info\",\n    labelChartSettings: \"Chart settings\",\n    labelDataBrowser: \"Data browser\",\n    labelDataScope: \"Scope\",\n    labelExport: \"Export Data\",\n    labelExportFormat: \"File format\",\n    labelExportCSV: \".CSV - Comma separated values\",\n    labelExportHTML: \".HTML - A SandDance html page embedding this data\",\n    labelExportJSON: \".JSON - JavaScript object notation\",\n    labelExportTSV: \".TSV - Tab separated values\",\n    labelHistory: \"History\",\n    labelTools: \"Tools\",\n    labelVegaSpec: \"Vega specification\",\n    labelColor: \"Chart color\",\n    labelError: \"Error\",\n    labelExportFileName: \"File name\",\n    labelSnapshots: \"Snapshots\",\n    labelSnapshotSettingThumbnailWidth: \"Thumbnail image width\",\n    labelSearch: \"Select by search\",\n    labelSearchClause: \"Clause\",\n    labelSearchColumn: \"Field\",\n    labelSearchOperator: \"Operator\",\n    labelSearchValue: \"Value\",\n    labelSearchValuePlaceholder: \"Value to search for\",\n    labelChart: \"Chart\",\n    labelChartCanvas: \"Chart canvas\",\n    labelColumnMapping: \"Column Mapping\",\n    labelChartTypeOptions: \"Chart options\",\n    labelColorBin: \"Color binning\",\n    labelColorOptions: \"Color options\",\n    labelColorBinExplanation: \"For numeric columns\",\n    labelColorFieldInfo: (colorColumnName, colorColumnType, categoricalNumeric, distinctValueCount)=>`Field <span className=\"fieldname\">${colorColumnName}</span> is of type <span className=\"fieldtype\">${colorColumnType}</span>${categoricalNumeric ? ` and has ${distinctValueCount} distinct values` : \"\"}.`,\n    labelColorFieldIsColorData: (colorColumnName)=>`Field <span className=\"fieldname\">${colorColumnName}</span> contains direct color data.`,\n    labelColorBinNone: \"None (continuous)\",\n    labelColorBinQuantize: \"Quantize\",\n    labelColorBinQuantile: \"Quantile\",\n    labelColorFilter: \"Note: Colors will be re-mapped to the filter when viewing this snapshot.\",\n    labelColorScheme: \"Scheme\",\n    labelTotal: \"Total by\",\n    labelTotalByCountSquare: \"Count (Grid layout)\",\n    labelTotalByCountStrip: \"Count (Strip layout)\",\n    labelTotalBySumStrip: \"Sum (Strip layout)\",\n    labelTotalBySumTreemap: \"Sum (Treemap layout)\",\n    labelTotalBySumStripPercent: \"Sum as percentage (Strip layout)\",\n    labelColumnColor: \"Color by\",\n    labelColumnFacet: \"Facet by\",\n    labelFacetLayout: \"Facet layout\",\n    labelFacetLayoutWrap: \"Wrap\",\n    // labelFacetLayoutHorizontal: 'Horizontal',\n    // labelFacetLayoutVertical: 'Vertical',\n    labelFacetLayoutCross: \"\\u229E\",\n    labelColumnFacetV: \"Cross facet by\",\n    labelColumnSort: \"Sort by\",\n    labelColumnX: \"X Axis\",\n    labelColumnY: \"Y Axis\",\n    labelColumnZ: \"Z Axis\",\n    labelColumnSize: \"Size by\",\n    labelColumnGroup: \"Group by\",\n    labelAliasColor: \"Color\",\n    labelAliasFacet: \"Facet\",\n    labelAliasFacetV: \"Vertical facet\",\n    labelAliasSort: \"Sort\",\n    labelAliasX: \"X Axis\",\n    labelAliasY: \"Y Axis\",\n    labelAliasZ: \"Z Axis\",\n    labelAliasSize: \"Size\",\n    labelAliasGroup: \"Group\",\n    labelDataItemIsFiltered: \"Item is filtered from view\",\n    labelHistoryInit: \"Initial view\",\n    labelHistoryFilterClear: \"Clear filter\",\n    labelHistoryFilterIExclude: \"Exclude filter\",\n    labelHistoryFilterIsolate: \"Isolate filter\",\n    labelHistoryChangeChartType: (chart)=>`Change chart type to ${chart}`,\n    labelHistoryMapColumn: (column)=>`Map ${column} role`,\n    labelHistoryUnMapColumn: (column)=>`Unmap ${column} role`,\n    labelHistoryReviveSnapshot: \"Revive snapshot\",\n    labelHistoryColorBin: \"Change color binning\",\n    labelHistoryDirectColor: \"Change direct color\",\n    labelShowLegend: \"Show legend\",\n    labelShowAxes: \"Show axes\",\n    labelSnapshotTitle: \"Title\",\n    labelSnapshotDescription: \"Note (optional)\",\n    labelTooltipMapping: \"Tooltip columns\",\n    labelTransitionDurations: \"Transition durations\",\n    labelTransitionCamera: \"2D / 3D view\",\n    labelTransitionColor: \"Color\",\n    labelTransitionPosition: \"Position\",\n    labelTransitionSize: \"Size\",\n    labelVegaSpecData: \"Data reference\",\n    labelVegaSpecNotes: \"Note: You may need to change the color scheme to make this visible in Vega.\",\n    labelYes: \"Yes\",\n    labelNo: \"No\",\n    labelConfirmation: \"Are you sure?\",\n    loading: \"Loading...\",\n    schemeCategorical: \"Categorical\",\n    schemeDiverging: \"Diverging\",\n    schemeDual: \"Dual\",\n    schemeSequentialMultiHue: \"Sequential Multi Hue\",\n    schemeSequentialSingleHue: \"Sequential Single Hue\",\n    selectDataSpanAll: \"All rows\",\n    selectDataSpanFilter: \"Filtered\",\n    selectDataSpanSelection: \"Selected\",\n    selectVegaSpecDataNone: \"None\",\n    selectVegaSpecDataInline: \"Inline - WARNING this may use substantial browser/clipboard memory for large data sets.\",\n    selectVegaSpecDataUrl: \"URL\",\n    record: (current, total)=>`${current} of ${total}`,\n    searchEQ: \"=\",\n    searchNEQ: \"<>\",\n    searchGT: \">\",\n    searchGTE: \">=\",\n    searchLT: \"<\",\n    searchLTE: \"<=\",\n    searchNULL: \"is null or empty\",\n    searchIN: \"contains\",\n    searchSW: \"starts with\",\n    searchWHERE: \"Where\",\n    searchAND: \"and\",\n    searchOR: \"or\",\n    selectAny: \"-- any --\",\n    selectNone: \"-- none --\",\n    selectNumeric: \"Numeric\",\n    selectNonNumeric: \"Categorical\",\n    selectDirectColor: \"Direct color\",\n    selectReference: \"Column mappings\",\n    tooltipSearch: (column, value)=>`Click to search in '${column}' for \"${value}\"`,\n    labelRequired: \"required\",\n    labelSystem: \"System\",\n    labelViewType2d: \"View in 2D\",\n    labelViewType3d: \"View in 3D\",\n    labelDataColors: \"Enabled if this data column contains any CSS color values.\",\n    labelDataNullAll: \"Loading data...\",\n    labelDataNullFiltered: \"You can filter by first making a selection, then choosing <b>Isolate</b> or <b>Exclude</b> in the top bar.\",\n    labelDataNullSelection: \"You can select by: <ul><li>clicking the chart axes</li><li>clicking in the legend</li><li>searching</li</ul>\",\n    labelZeroAll: \"Dataset contains zero rows.\",\n    labelZeroSearchResults: \"No rows matched your search.\",\n    signalGroups: [\n        {\n            prefix: \"Chart\",\n            label: \"Chart options\"\n        },\n        {\n            prefix: \"Mark\",\n            label: \"Mark options\"\n        },\n        {\n            prefix: \"RoleColor\",\n            label: \"Color options\"\n        },\n        {\n            prefix: \"RoleFacet\",\n            label: \"Facet options\"\n        },\n        {\n            prefix: \"RoleSort\",\n            label: \"Sort options\"\n        },\n        {\n            prefix: \"RoleX\",\n            label: \"X axis options\"\n        },\n        {\n            prefix: \"RoleY\",\n            label: \"Y axis options\"\n        },\n        {\n            prefix: \"RoleZ\",\n            label: \"Z axis options\"\n        },\n        {\n            prefix: \"Text\",\n            label: \"Text options\"\n        },\n        {\n            prefix: \"*\",\n            label: \"Options\"\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"avMLS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataExportPicker\", ()=>DataExportPicker);\nparcelHelpers.export(exports, \"removeExtensions\", ()=>removeExtensions);\nparcelHelpers.export(exports, \"getEmbedHTML\", ()=>getEmbedHTML);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _dataExporterHtml = require(\"./dataExporterHtml\");\nvar _dialog = require(\"./dialog\");\nvar _base = require(\"../base\");\nvar _exportDelimited = require(\"../exportDelimited\");\nvar _language = require(\"../language\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nconst exportTypes = [\n    [\n        \"json\",\n        (0, _language.strings).labelExportJSON\n    ],\n    [\n        \"csv\",\n        (0, _language.strings).labelExportCSV\n    ],\n    [\n        \"tsv\",\n        (0, _language.strings).labelExportTSV\n    ],\n    [\n        \"html\",\n        (0, _language.strings).labelExportHTML\n    ]\n];\nfunction _DataExportPicker(props1) {\n    class __DataExportPicker extends (0, _base.base).react.Component {\n        constructor(props){\n            super(props);\n            this.state = this.getInitialState(this.props);\n        }\n        getInitialState(props) {\n            const initialState = {\n                initializer: props.initializer,\n                dialogHidden: true,\n                exportType: exportTypes[0][0],\n                fileName: props.initializer.fileName,\n                fileNameError: \"\",\n                working: false\n            };\n            return initialState;\n        }\n        componentDidUpdate() {\n            if (!(0, _sanddanceReact.util).deepCompare(this.props.initializer, this.state.initializer)) this.setState(this.getInitialState(this.props));\n        }\n        // Converts to dataExport type and calls dataExportHandler to deal with data\n        createExport(exportType, displayName) {\n            const final = (data)=>{\n                this.props.dataExportHandler(data, exportType, displayName);\n                this.close();\n            };\n            const json = JSON.stringify(this.props.data, columnReplacer);\n            switch(exportType){\n                case \"json\":\n                    final(json);\n                    break;\n                case \"csv\":\n                    final((0, _exportDelimited.convertToDelimited)(JSON.parse(json), \",\"));\n                    break;\n                case \"tsv\":\n                    final((0, _exportDelimited.convertToDelimited)(JSON.parse(json), \"\t\"));\n                    break;\n                case \"html\":\n                    {\n                        const csv = (0, _exportDelimited.convertToDelimited)(JSON.parse(json), \",\");\n                        const html = (0, _dataExporterHtml.embedHtml)(`${(0, _language.strings).appName} - ${escape(displayName)}`, embedScript(csv, displayName));\n                        final(html);\n                    }\n            }\n        }\n        close() {\n            this.setState({\n                dialogHidden: true,\n                working: false\n            });\n        }\n        render() {\n            const closeDialog = ()=>this.close();\n            if (this.state.delayAction) requestAnimationFrame(()=>{\n                //allow render to complete\n                if (this.state.delayAction) {\n                    this.state.delayAction();\n                    this.setState({\n                        delayAction: null\n                    });\n                }\n            });\n            const disabled = this.state.working || this.state.dialogHidden;\n            return (0, _base.base).react.createElement(\"div\", {\n                className: \"sanddance-dataExporter\"\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.DefaultButton, {\n                className: \"search-action search-bottom-action\",\n                text: (0, _language.strings).buttonExportCount(this.props.data.length),\n                onClick: ()=>this.setState({\n                        dialogHidden: false\n                    }),\n                disabled: this.props.disabled\n            }), (0, _base.base).react.createElement((0, _dialog.Dialog), {\n                hidden: this.state.dialogHidden,\n                onDismiss: closeDialog,\n                dialogContentProps: {\n                    className: `sanddance-dialog ${this.props.theme}`,\n                    type: (0, _base.base).fluentUI.DialogType.normal,\n                    title: (0, _language.strings).labelExport\n                },\n                buttons: [\n                    (0, _base.base).react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n                        key: 0,\n                        disabled: disabled || !!this.state.fileNameError,\n                        onClick: (e)=>this.setState({\n                                delayAction: ()=>this.createExport(this.state.exportType, this.state.fileName),\n                                working: true\n                            }),\n                        text: (0, _language.strings).buttonExport,\n                        iconProps: {\n                            iconName: \"Download\"\n                        }\n                    })\n                ]\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.TextField, {\n                label: (0, _language.strings).labelExportFileName,\n                onChange: (e, displayName)=>{\n                    const displayNameError = getFileNameError(displayName);\n                    this.setState({\n                        fileName: displayName,\n                        fileNameError: displayNameError\n                    });\n                },\n                errorMessage: this.state.fileNameError,\n                value: this.state.fileName\n            }), (0, _base.base).react.createElement((0, _base.base).fluentUI.ChoiceGroup, {\n                className: \"sanddance-form-separate\",\n                disabled: disabled,\n                options: exportTypes.map(([exportType, text])=>{\n                    return {\n                        key: exportType,\n                        text,\n                        disabled: false,\n                        checked: exportType === this.state.exportType\n                    };\n                }),\n                onChange: (ev, option)=>this.setState({\n                        exportType: option.key\n                    }),\n                label: (0, _language.strings).labelExportFormat\n            })));\n        }\n    }\n    return new __DataExportPicker(props1);\n}\nconst DataExportPicker = _DataExportPicker;\nconst illegalChars = '\\\\/:*?\"<>|';\nfunction getFileNameError(displayName) {\n    if (!displayName) return (0, _language.strings).errorExportFilenameEmpty;\n    for(let i = 0; i < illegalChars.length; i++){\n        if (displayName.indexOf(illegalChars[i]) >= 0) return (0, _language.strings).errorExportFilenameCharacters(illegalChars);\n    }\n}\nfunction removeExtensions(fileName) {\n    exportTypes.forEach(([exportType])=>{\n        const re = new RegExp(`\\\\.${exportType}`, \"ig\");\n        fileName = fileName.replace(re, \"\");\n    });\n    return fileName;\n}\nfunction columnReplacer(name, value) {\n    if ((0, _sanddanceReact.SandDance).util.isInternalFieldName(name, true)) return undefined;\n    return value === null ? \"\" : value;\n}\nfunction embedScript(csv, displayName, snapshots) {\n    const dataFile = {\n        type: \"csv\",\n        displayName,\n        snapshots\n    };\n    return `<pre id='csv-data' style='display:none'>${csv}</pre>\n    <script>SandDanceEmbed.load(Object.assign({rawText: document.getElementById('csv-data').innerText}, ${JSON.stringify(dataFile)}))</script>`;\n}\nfunction getEmbedHTML(data, displayName, snapshots) {\n    const json = JSON.stringify(data, columnReplacer);\n    const csv = (0, _exportDelimited.convertToDelimited)(JSON.parse(json), \",\");\n    const html = (0, _dataExporterHtml.embedHtml)(`${(0, _language.strings).appName} - ${escape(displayName)}`, embedScript(csv, displayName, snapshots));\n    return html;\n}\n\n},{\"./dataExporterHtml\":\"69f1V\",\"./dialog\":\"hBByT\",\"../base\":\"b6Cy1\",\"../exportDelimited\":\"7GONW\",\"../language\":\"7qvdA\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"69f1V\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"embedHtml\", ()=>embedHtml);\nconst embedHtml = (title, embed)=>`<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>${title}</title>\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-embed@3/dist/css/sanddance-embed.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\"\n        href=\"https://unpkg.com/@msrvida/sanddance-explorer@3/dist/css/sanddance-explorer.css\" />\n</head>\n\n<body>\n    <script src=\"https://unpkg.com/react@16.13/umd/react.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@16.13/umd/react-dom.production.min.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/deck.gl@8.3.7/dist.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@5.17/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/@fluentui/react@7.150/dist/fluentui-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@3/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@3/dist/umd/sanddance-embed.js\"></script>\n\n    <div id=\"app\"></div>\n\n    ${embed}\n\n</body>\n\n</html>`;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7GONW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nparcelHelpers.export(exports, \"convertToDelimited\", ()=>convertToDelimited);\nfunction convertToDelimited(data, delimiter) {\n    var fields = Object.keys(data[0]);\n    var file = data.map((row)=>{\n        return fields.map((fieldName)=>{\n            const value = row[fieldName];\n            if (typeof value === \"number\") return value;\n            if (typeof value === \"string\") {\n                if (value.indexOf(delimiter) >= 0) return `\"${value.replace(/\"/g, '\"\"')}\"`;\n                else return value;\n            }\n            return \"\";\n        }).join(delimiter);\n    });\n    file.unshift(fields.join(delimiter));\n    return file.join(\"\\n\");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2MMic\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"chartLabelMap\", ()=>chartLabelMap);\nparcelHelpers.export(exports, \"chartLabel\", ()=>chartLabel);\nparcelHelpers.export(exports, \"Chart\", ()=>Chart);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _columnMap = require(\"../controls/columnMap\");\nvar _dialog = require(\"../controls/dialog\");\nvar _dropdown = require(\"../controls/dropdown\");\nvar _group = require(\"../controls/group\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _signal = require(\"../controls/signal\");\nvar _language = require(\"../language\");\nvar _toggleColumns = require(\"../controls/toggleColumns\");\nvar _columns = require(\"../columns\");\nconst singleFacetLayouts = [\n    {\n        facetStyle: \"wrap\",\n        text: (0, _language.strings).labelFacetLayoutWrap\n    }\n];\nconst chartLabelMap = [\n    {\n        key: \"grid\",\n        text: (0, _language.strings).chartTypeGrid\n    },\n    {\n        key: \"scatterplot\",\n        text: (0, _language.strings).chartTypeScatterPlot\n    },\n    {\n        key: \"density\",\n        text: (0, _language.strings).chartTypeDensity\n    },\n    {\n        key: \"barchartV\",\n        text: (0, _language.strings).chartTypeBarChartV\n    },\n    {\n        key: \"barchartH\",\n        text: (0, _language.strings).chartTypeBarChartH\n    },\n    {\n        key: \"treemap\",\n        text: (0, _language.strings).chartTypeTreeMap\n    },\n    {\n        key: \"strips\",\n        text: (0, _language.strings).chartTypeStrips\n    },\n    {\n        key: \"stacks\",\n        text: (0, _language.strings).chartTypeStacks\n    }\n];\nfunction chartLabel(key) {\n    for(let i = 0; i < chartLabelMap.length; i++){\n        if (key === chartLabelMap[i].key) return chartLabelMap[i].text;\n    }\n}\nfunction _Chart(_props) {\n    class __Chart extends (0, _base.base).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                showTooltipDialog: false\n            };\n            this.choiceRef = (0, _base.base).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                return (_a = this.choiceRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n            };\n        }\n        render() {\n            const { props  } = this;\n            const { explorer , specCapabilities  } = props;\n            const signals = explorer.viewer && explorer.viewer.vegaSpec && specCapabilities && specCapabilities.signals && explorer.viewer.vegaSpec.signals.filter((s)=>specCapabilities.signals.indexOf(s.name) >= 0);\n            return (0, _base.base).react.createElement(\"div\", null, (0, _base.base).react.createElement((0, _group.Group), {\n                label: (0, _language.strings).labelChart\n            }, (0, _base.base).react.createElement(\"div\", {\n                className: \"calculator\"\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.ChoiceGroup, {\n                componentRef: this.choiceRef,\n                className: \"sanddance-chart-type\",\n                options: chartLabelMap.map((o)=>{\n                    return Object.assign(Object.assign({}, o), {\n                        checked: props.chart === o.key,\n                        disabled: props.disabled || o.key === \"treemap\" && props.quantitativeColumns.length === 0\n                    });\n                }),\n                onChange: (e, o)=>props.onChangeChartType(o.key)\n            }))), (0, _base.base).react.createElement((0, _group.Group), {\n                label: (0, _language.strings).labelColumnMapping\n            }, (0, _base.base).react.createElement(\"div\", null, specCapabilities && specCapabilities.roles.map((specRole, i)=>{\n                const specColumnInRole = props.insightColumns[specRole.role];\n                const selectedColumnName = specColumnInRole;\n                let disabledColumnName;\n                let prefix;\n                let suffix;\n                let hideDropdown = false;\n                let { totalStyle: totalStyle1  } = props;\n                if (!totalStyle1) totalStyle1 = \"count-square\";\n                let { facetStyle  } = props;\n                if (!facetStyle) facetStyle = \"wrap\";\n                switch(specRole.role){\n                    case \"facet\":\n                        suffix = (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n                            disabled: !props.insightColumns.facet,\n                            collapseLabel: props.collapseLabels,\n                            label: (0, _language.strings).labelFacetLayout,\n                            calloutProps: {\n                                style: {\n                                    minWidth: \"18em\"\n                                }\n                            },\n                            options: [\n                                {\n                                    key: \"header1\",\n                                    text: `${(0, _language.strings).labelFacetLayout}:`,\n                                    itemType: (0, _base.base).fluentUI.DropdownMenuItemType.Header\n                                },\n                                ...singleFacetLayouts.map((f)=>{\n                                    const o = {\n                                        key: f.facetStyle,\n                                        text: f.text,\n                                        data: f,\n                                        selected: facetStyle === f.facetStyle\n                                    };\n                                    return o;\n                                }),\n                                {\n                                    key: \"divider\",\n                                    text: \"-\",\n                                    itemType: (0, _base.base).fluentUI.DropdownMenuItemType.Divider\n                                },\n                                {\n                                    key: \"header2\",\n                                    text: `${(0, _language.strings).labelColumnFacetV}:`,\n                                    itemType: (0, _base.base).fluentUI.DropdownMenuItemType.Header\n                                },\n                                ...(0, _columnMap.getColumnMapOptions)(Object.assign(Object.assign({}, props), {\n                                    specRole,\n                                    selectedColumnName: props.insightColumns.facetV\n                                })).map((o)=>{\n                                    if (o.itemType !== (0, _base.base).fluentUI.DropdownMenuItemType.Header) {\n                                        const facetData = {\n                                            facetStyle: \"cross\",\n                                            column: o.data\n                                        };\n                                        o.data = facetData;\n                                        o.text = `${(0, _language.strings).labelFacetLayoutCross} ${o.text}`;\n                                    }\n                                    return o;\n                                })\n                            ],\n                            onChange: (e, o)=>{\n                                const facetData = o.data;\n                                props.changeColumnMapping(\"facet\", \"facet\", null, {\n                                    facetStyle: facetData.facetStyle\n                                });\n                                if (facetData.facetStyle === \"cross\") props.changeColumnMapping(\"facetV\", (0, _sanddanceReact.SandDance).VegaDeckGl.util.clone(facetData.column));\n                            }\n                        });\n                        break;\n                    case \"facetV\":\n                        hideDropdown = true;\n                        break;\n                    case \"size\":\n                        {\n                            const options = [\n                                {\n                                    key: \"count-square\",\n                                    text: (0, _language.strings).labelTotalByCountSquare,\n                                    data: \"count-square\",\n                                    selected: !totalStyle1 || totalStyle1 === \"count-square\"\n                                },\n                                {\n                                    key: \"count-strip\",\n                                    text: (0, _language.strings).labelTotalByCountStrip,\n                                    data: \"count-strip\",\n                                    selected: totalStyle1 === \"count-strip\"\n                                },\n                                {\n                                    key: \"sum-strip\",\n                                    text: (0, _language.strings).labelTotalBySumStrip,\n                                    data: \"sum-strip\",\n                                    selected: totalStyle1 === \"sum-strip\"\n                                },\n                                {\n                                    key: \"sum-treemap\",\n                                    text: (0, _language.strings).labelTotalBySumTreemap,\n                                    data: \"sum-treemap\",\n                                    selected: totalStyle1 === \"sum-treemap\",\n                                    disabled: props.quantitativeColumns.length === 0\n                                }\n                            ];\n                            if (specCapabilities.percentage) options.push({\n                                key: \"sum-strip-percent\",\n                                text: (0, _language.strings).labelTotalBySumStripPercent,\n                                data: \"sum-strip-percent\",\n                                selected: totalStyle1 === \"sum-strip-percent\",\n                                disabled: props.quantitativeColumns.length === 0\n                            });\n                            prefix = !specCapabilities.countsAndSums ? null : (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n                                collapseLabel: props.collapseLabels,\n                                label: (0, _language.strings).labelTotal,\n                                calloutProps: {\n                                    style: {\n                                        minWidth: \"18em\"\n                                    }\n                                },\n                                options: options,\n                                onChange: (e, o)=>{\n                                    const totalStyle = o.data;\n                                    let defaultColumn;\n                                    if (totalStyle.indexOf(\"sum-\") === 0) {\n                                        if (totalStyle === \"sum-treemap\") defaultColumn = (0, _columns.getTreemapColumn)(props.allColumns);\n                                        defaultColumn = defaultColumn || props.quantitativeColumns[0];\n                                    }\n                                    props.changeColumnMapping(\"size\", \"size\", defaultColumn, {\n                                        totalStyle\n                                    });\n                                }\n                            });\n                            break;\n                        }\n                }\n                let disabled = props.disabled || props.view === \"2d\" && specRole.role === \"z\" || specRole.role === \"size\" && !(!specCapabilities.countsAndSums || totalStyle1.indexOf(\"sum-\") === 0) || specRole.role === \"sort\" && specCapabilities.countsAndSums && totalStyle1 === \"sum-treemap\";\n                return (0, _base.base).react.createElement((0, _columnMap.ColumnMap), Object.assign({}, props, {\n                    prefix: prefix,\n                    suffix: suffix,\n                    collapseLabel: props.collapseLabels,\n                    disabled: disabled,\n                    disabledColumnName: disabledColumnName,\n                    selectedColumnName: selectedColumnName,\n                    specRole: specRole,\n                    key: i,\n                    onChangeSignal: (name, value)=>props.onChangeSignal(specRole.role, selectedColumnName, name, value),\n                    hideDropdown: hideDropdown\n                }));\n            }), (0, _base.base).react.createElement(\"div\", {\n                className: \"sanddance-tooltipMap\"\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.DefaultButton, {\n                text: (0, _language.strings).buttonTooltipMapping,\n                onClick: ()=>this.setState({\n                        showTooltipDialog: true\n                    })\n            })))), signals && (0, _base.base).react.createElement((0, _group.Group), {\n                label: (0, _language.strings).labelChartTypeOptions\n            }, signals.map((signal, i)=>(0, _base.base).react.createElement((0, _signal.Signal), {\n                    key: i,\n                    signal: signal,\n                    explorer: explorer,\n                    disabled: props.disabled || this.disableSignal(signal),\n                    collapseLabel: props.collapseLabels,\n                    newViewStateTarget: false\n                }))), (0, _base.base).react.createElement((0, _dialog.Dialog), {\n                hidden: !this.state.showTooltipDialog,\n                onDismiss: ()=>this.setState({\n                        showTooltipDialog: false\n                    }),\n                title: (0, _language.strings).labelTooltipMapping\n            }, (0, _base.base).react.createElement((0, _toggleColumns.ToggleColumns), {\n                allColumns: props.allColumns,\n                exclusions: props.tooltipExclusions,\n                toggleExclusion: props.toggleTooltipExclusion\n            })));\n        }\n        disableSignal(signal) {\n            if (this.props.view === \"2d\" && signal.name === (0, _sanddanceReact.SandDance).constants.SignalNames.ZGrounded) return true;\n            return false;\n        }\n    }\n    return new __Chart(_props);\n}\nconst Chart = _Chart;\n\n},{\"../base\":\"b6Cy1\",\"../controls/columnMap\":\"6MgAn\",\"../controls/dialog\":\"hBByT\",\"../controls/dropdown\":\"iEkOh\",\"../controls/group\":\"e2GTU\",\"@msrvida/sanddance-react\":\"4uo3s\",\"../controls/signal\":\"hpJp2\",\"../language\":\"7qvdA\",\"../controls/toggleColumns\":\"c0hqw\",\"../columns\":\"3WUEI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e2GTU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Group\", ()=>Group);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction Group(props) {\n    return (0, _base.base).react.createElement(\"div\", {\n        className: (0, _sanddanceReact.util).classList(\"sanddance-group\", props.className)\n    }, (0, _base.base).react.createElement(\"div\", {\n        className: \"group-head\"\n    }, (0, _base.base).react.createElement(\"label\", null, props.label), props.labelCount && (0, _base.base).react.createElement(\"span\", {\n        className: \"count\"\n    }, \"(\", props.labelCount, \")\")), props.children && (0, _base.base).react.createElement(\"div\", {\n        className: \"group-body\"\n    }, props.children));\n}\n\n},{\"../base\":\"b6Cy1\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c0hqw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ToggleColumns\", ()=>ToggleColumns);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nfunction ToggleColumns(props) {\n    return (0, _base.base).react.createElement(\"div\", null, props.allColumns.map((c, i)=>(0, _base.base).react.createElement(\"div\", {\n            key: c.name\n        }, (0, _base.base).react.createElement(\"label\", null, (0, _base.base).react.createElement((0, _base.base).fluentUI.Toggle, {\n            checked: props.exclusions.indexOf(c.name) < 0,\n            inlineLabel: true,\n            label: c.name,\n            onChange: ()=>props.toggleExclusion(c.name)\n        })))));\n}\n\n},{\"../base\":\"b6Cy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3WUEI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ensureColumnsExist\", ()=>ensureColumnsExist);\nparcelHelpers.export(exports, \"ensureColumnsPopulated\", ()=>ensureColumnsPopulated);\nparcelHelpers.export(exports, \"getTreemapColumn\", ()=>getTreemapColumn);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _chartRecommender = require(\"@msrvida/chart-recommender\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _language = require(\"./language\");\nfunction ensureColumnsExist(insightColumns, actualColumns, transform) {\n    //ensure columns exist\n    for(let role in insightColumns){\n        let columnName = insightColumns[role];\n        let column = actualColumns.filter((c)=>c.name === columnName)[0];\n        let transformColumn = transform ? transform.filter((t)=>{\n            switch(t.type){\n                case \"formula\":\n                    return t.as === columnName;\n            }\n        })[0] : null;\n        if (!(column || transformColumn)) delete insightColumns[role];\n    }\n}\nfunction ensureColumnsPopulated(chart, totalStyle, insightColumns, actualColumns) {\n    //ensure columns are populated\n    const nonInternal = actualColumns.filter((c)=>!(0, _sanddanceReact.SandDance).util.isInternalFieldName(c.name));\n    const firstColumn = nonInternal[0];\n    const firstColumnName = firstColumn && firstColumn.name;\n    const firstQuantitative = nonInternal.filter((c)=>c.quantitative)[0];\n    const firstQuantitativeColumnName = firstQuantitative && firstQuantitative.name;\n    const ensureColumn = (role, quantitative, treemap)=>{\n        if (!insightColumns[role]) {\n            if (treemap) insightColumns[role] = getTreemapColumn(actualColumns).name;\n            else insightColumns[role] = quantitative ? firstQuantitativeColumnName : firstColumnName;\n        }\n    };\n    function checkRequiresSize() {\n        switch(totalStyle){\n            case \"sum-strip\":\n            case \"sum-strip-percent\":\n                ensureColumn(\"size\", true);\n                break;\n            case \"sum-treemap\":\n                ensureColumn(\"size\", true, true);\n                break;\n        }\n    }\n    switch(chart){\n        case \"barchart\":\n        case \"barchartV\":\n            ensureColumn(\"x\");\n            checkRequiresSize();\n            break;\n        case \"barchartH\":\n            ensureColumn(\"y\");\n            checkRequiresSize();\n            break;\n        case \"density\":\n            ensureColumn(\"x\");\n            ensureColumn(\"y\");\n            checkRequiresSize();\n            break;\n        case \"scatterplot\":\n        case \"stacks\":\n            ensureColumn(\"x\");\n            ensureColumn(\"y\");\n            break;\n        case \"treemap\":\n            if (!insightColumns.size) insightColumns.size = getTreemapColumn(actualColumns).name;\n            if (!insightColumns.size) //error - no numeric column\n            return [\n                (0, _language.strings).errorColumnMustBeNumeric\n            ];\n            break;\n    }\n}\nfunction getTreemapColumn(columns) {\n    let column = (0, _chartRecommender.preferredColumnForTreemapSize)(columns, true);\n    if (!column) column = (0, _chartRecommender.preferredColumnForTreemapSize)(columns, false);\n    return column;\n}\n\n},{\"@msrvida/chart-recommender\":\"8C9fP\",\"@msrvida/sanddance-react\":\"4uo3s\",\"./language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8C9fP\":[function(require,module,exports) {\n\"use strict\";\nvar __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, {\n        enumerable: true,\n        get: function() {\n            return m[k];\n        }\n    });\n} : function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n});\nvar __exportStar = this && this.__exportStar || function(m, exports) {\n    for(var p in m)if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n__exportStar(require(\"./barChart\"), exports);\n__exportStar(require(\"./geo\"), exports);\n__exportStar(require(\"./scatterPlot\"), exports);\n__exportStar(require(\"./treemap\"), exports);\n__exportStar(require(\"./recommenderSummary\"), exports);\n\n},{\"./barChart\":\"kNsay\",\"./geo\":\"i68zm\",\"./scatterPlot\":\"fLhEg\",\"./treemap\":\"jkliO\",\"./recommenderSummary\":\"4iJUn\"}],\"kNsay\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.BarChartRecommender = exports.BarChartRecommenderSummary = void 0;\nvar recommender_1 = require(\"./recommender\");\nvar maxDistinctVal = 20;\nvar minDistinctVal = 2;\nvar BarChartRecommenderSummary = /** @class */ function() {\n    function BarChartRecommenderSummary1(columns, data) {\n        var score = -1;\n        for(var i = 0; i < columns.length; i++){\n            var recommendation = new BarChartRecommender(columns[i], data).recommend();\n            if (recommendation.score > score) {\n                this.best = recommendation;\n                score = recommendation.score;\n            }\n            if (score === 1) break;\n        }\n        for(var k = 0; k < columns.length; k++){\n            var column = columns[k];\n            if (column.name === this.best.columns.x || column.stats.isSequential) continue;\n            if (column.quantitative || column.stats.distinctValueCount < recommender_1.maxCategoricalColors && column.stats.distinctValueCount > 1) {\n                this.best.columns.color = this.best.columns.sort = column.name;\n                this.best.scheme = recommender_1.defaultColorScheme(column);\n                if (column.quantitative) this.best.colorBin = \"quantile\";\n                break;\n            }\n        }\n    }\n    BarChartRecommenderSummary1.prototype.recommend = function() {\n        return this.best;\n    };\n    return BarChartRecommenderSummary1;\n}();\nexports.BarChartRecommenderSummary = BarChartRecommenderSummary;\nvar BarChartRecommender = /** @class */ function() {\n    function BarChartRecommender1(column1, data) {\n        this.score = 0;\n        this.column = column1;\n        //the total score for bar chart is 1\n        this.rules = [\n            function(column) {\n                if (column.stats.isSequential) return false;\n                else if (column.quantitative) return true;\n                else if (!column.quantitative && column.stats.distinctValueCount <= maxDistinctVal && column.stats.distinctValueCount >= minDistinctVal) return true;\n                else return false;\n            }\n        ];\n        for(var i = 0; i < this.rules.length; i++)if (this.rules[i](column1)) this.score++;\n    }\n    BarChartRecommender1.prototype.recommend = function() {\n        var rec = {\n            chart: \"barchart\",\n            columns: {\n                x: this.column.name\n            },\n            score: this.score,\n            scheme: undefined,\n            view: \"2d\"\n        };\n        return rec;\n    };\n    return BarChartRecommender1;\n}();\nexports.BarChartRecommender = BarChartRecommender;\n\n},{\"./recommender\":\"dH7Ko\"}],\"dH7Ko\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.defaultColorScheme = exports.Recommender = exports.maxCategoricalColors = void 0;\nexports.maxCategoricalColors = 20;\nvar Recommender = /** @class */ function() {\n    function Recommender1(columns, data) {}\n    return Recommender1;\n}();\nexports.Recommender = Recommender;\nfunction defaultColorScheme(c) {\n    if (c.quantitative) return \"redyellowgreen\";\n    else if (c.stats.distinctValueCount === 2) return \"dual_redgreen\";\n    else if (c.stats.distinctValueCount <= 10) return \"category10\";\n    return \"category20\";\n}\nexports.defaultColorScheme = defaultColorScheme;\n\n},{}],\"i68zm\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.isGeo = exports.isLatitude = exports.isLongitude = void 0;\n//TODO: languages other than english\nvar longitudeNames = [\n    \"lon\",\n    \"long\",\n    \"longitude\"\n];\nvar latitudeNames = [\n    \"lat\",\n    \"latitude\"\n];\nfunction isSpec(names, limits, column, data) {\n    var is = false;\n    var cname = column.name.toLowerCase();\n    for(var i = 0; i < names.length; i++)if (names[i] === cname) {\n        is = true;\n        break;\n    }\n    data;\n    return is;\n}\nfunction isLongitude(column, data) {\n    return isSpec(longitudeNames, [\n        -180,\n        180\n    ], column, data);\n}\nexports.isLongitude = isLongitude;\nfunction isLatitude(column, data) {\n    return isSpec(latitudeNames, [\n        -90,\n        90\n    ], column, data);\n}\nexports.isLatitude = isLatitude;\nfunction isGeo(column, data) {\n    return isLatitude(column, data) || isLongitude(column, data);\n}\nexports.isGeo = isGeo;\n\n},{}],\"fLhEg\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.ScatterPlotRecommenderSummary = void 0;\nvar recommender_1 = require(\"./recommender\");\nvar geo_1 = require(\"./geo\");\nvar ScatterPlotRecommenderSummary = /** @class */ function() {\n    function ScatterPlotRecommenderSummary1(columns, data) {\n        var rec = {\n            chart: \"scatterplot\",\n            score: undefined,\n            columns: {},\n            scheme: undefined,\n            view: \"2d\"\n        };\n        columns.forEach(function(column) {\n            if (!rec.columns.x) {\n                if (column.name.toLowerCase() === \"x\") return rec.columns.x = column.name;\n                else if (geo_1.isLongitude(column)) return rec.columns.x = column.name;\n            }\n            if (!rec.columns.y) {\n                if (column.name.toLowerCase() === \"y\") return rec.columns.y = column.name;\n                else if (geo_1.isLatitude(column)) return rec.columns.y = column.name;\n            }\n            if (!rec.columns.color && !column.stats.isSequential) {\n                if (column.quantitative || column.stats.distinctValueCount < recommender_1.maxCategoricalColors) {\n                    rec.columns.color = rec.columns.sort = column.name;\n                    rec.scheme = recommender_1.defaultColorScheme(column);\n                    if (column.quantitative) rec.colorBin = \"quantile\";\n                    return;\n                }\n            }\n        });\n        if (rec.columns.x && rec.columns.y) this.best = rec;\n    }\n    ScatterPlotRecommenderSummary1.prototype.recommend = function() {\n        return this.best;\n    };\n    return ScatterPlotRecommenderSummary1;\n}();\nexports.ScatterPlotRecommenderSummary = ScatterPlotRecommenderSummary;\n\n},{\"./recommender\":\"dH7Ko\",\"./geo\":\"i68zm\"}],\"jkliO\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.preferredColumnForTreemapSize = void 0;\nvar geo_1 = require(\"./geo\");\nfunction preferredColumnForTreemapSize(columns, strict) {\n    for(var i = 0; i < columns.length; i++){\n        var c = columns[i];\n        if (c.quantitative) {\n            if (strict && c.stats.hasNegative) continue;\n            if (strict && c.stats.isSequential) continue;\n            if (strict && geo_1.isGeo(c)) continue;\n            return c;\n        }\n    }\n}\nexports.preferredColumnForTreemapSize = preferredColumnForTreemapSize;\n\n},{\"./geo\":\"i68zm\"}],\"4iJUn\":[function(require,module,exports) {\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.RecommenderSummary = void 0;\nvar barChart_1 = require(\"./barChart\");\nvar scatterPlot_1 = require(\"./scatterPlot\");\nvar RecommenderSummary = /** @class */ function() {\n    function RecommenderSummary1(columns, data) {\n        var quickRec = new scatterPlot_1.ScatterPlotRecommenderSummary(columns, data).recommend();\n        if (quickRec) this.rec = quickRec;\n        else {\n            var barChartrec = new barChart_1.BarChartRecommenderSummary(columns, data).recommend();\n            if (barChartrec && barChartrec.score >= 1) this.rec = barChartrec;\n            else this.rec = {\n                chart: \"grid\",\n                columns: {},\n                score: 1\n            };\n        }\n    }\n    RecommenderSummary1.prototype.recommend = function() {\n        return this.rec;\n    };\n    return RecommenderSummary1;\n}();\nexports.RecommenderSummary = RecommenderSummary;\n\n},{\"./barChart\":\"kNsay\",\"./scatterPlot\":\"fLhEg\"}],\"iB7jA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Search\", ()=>Search);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _searchTerm = require(\"../controls/searchTerm\");\nvar _base = require(\"../base\");\nvar _button = require(\"../controls/button\");\nvar _dropdown = require(\"../controls/dropdown\");\nvar _group = require(\"../controls/group\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _language = require(\"../language\");\nconst maxClauses = 5;\nfunction getColumnWithName(columnName, columns) {\n    for(var i = 0; i < columns.length; i++){\n        if (columns[i].name === columnName) return columns[i];\n    }\n}\nfunction validateExpression(ex) {\n    if (ex.operator === \"isnullorEmpty\") {\n        ex.errorMessage = null;\n        return;\n    }\n    const s = (0, _searchTerm.getText)(ex);\n    if (s.length === 0) ex.errorMessage = (0, _language.strings).labelRequired;\n    else ex.errorMessage = null;\n}\nfunction clearExpressionValidation(ex) {\n    if (ex.operator === \"isnullorEmpty\") {\n        ex.errorMessage = null;\n        return;\n    }\n    const s = (0, _searchTerm.getText)(ex);\n    if (s.length !== 0) ex.errorMessage = null;\n}\nfunction getGroupClauses(currClause, index, disableGroupOR) {\n    let keys;\n    if (index === 0) keys = [\n        [\n            null,\n            (0, _language.strings).searchWHERE\n        ]\n    ];\n    else {\n        keys = [\n            [\n                \"&&\",\n                (0, _language.strings).searchAND\n            ]\n        ];\n        if (!disableGroupOR) keys.push([\n            \"||\",\n            (0, _language.strings).searchOR\n        ]);\n    }\n    return keys.map((key, i)=>{\n        const [clause, text] = key;\n        const selected = currClause == clause; //deliberate double equal \n        const option = {\n            key: i,\n            text,\n            data: clause,\n            selected\n        };\n        return option;\n    });\n}\nfunction _Search(_props) {\n    class __Search extends (0, _base.base).react.Component {\n        constructor(props){\n            super(props);\n            this.state = this.getInitialState(this.props);\n            this.dropdownRef = (0, _base.base).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                return (_a = this.dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n            };\n        }\n        getInitialState(props) {\n            const initialState = {\n                groups: props.initializer.search || [\n                    this.newGroup(0, null)\n                ],\n                sortedColumns: [\n                    ...props.initializer.columns\n                ].sort((a, b)=>a.name.localeCompare(b.name)),\n                initializer: props.initializer\n            };\n            initialState.groups.forEach((group)=>{\n                group.expressions.forEach((ex)=>ex.unlocked = group.expressions.length <= 2);\n            });\n            return initialState;\n        }\n        componentDidUpdate() {\n            if (!(0, _sanddanceReact.util).deepCompare(this.props.initializer, this.state.initializer)) this.setState(this.getInitialState(this.props));\n        }\n        validateAndSearch() {\n            const groups = [\n                ...this.state.groups\n            ];\n            groups.forEach((group)=>{\n                group.expressions.forEach(validateExpression);\n                const errors = group.expressions.reduce((p, c)=>p || c.errorMessage, \"\");\n                if (errors) this.setState({\n                    groups\n                });\n                else this.props.onSelect(this.state.groups);\n            });\n        }\n        newGroup(key, clause) {\n            const group = {\n                key,\n                clause,\n                expressions: [\n                    this.newExpression(0, null)\n                ]\n            };\n            return group;\n        }\n        updateGroup(partialGroup, groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = Object.assign(Object.assign({}, groups[groupIndex]), partialGroup);\n            groups[groupIndex] = group;\n            this.setState({\n                groups\n            });\n        }\n        addGroup() {\n            const groups = [\n                ...this.state.groups\n            ];\n            const maxKey = groups.reduce((max, p)=>p.key > max ? p.key : max, groups[0].key);\n            const newGroup = this.newGroup(maxKey + 1, \"&&\");\n            groups.push(newGroup);\n            this.setState({\n                groups\n            });\n        }\n        deleteGroup(groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            groups.splice(groupIndex, 1);\n            this.setState({\n                groups\n            });\n        }\n        newExpression(key, clause) {\n            const ex = {\n                key,\n                clause,\n                name: null,\n                operator: \"contains\",\n                value: \"\"\n            };\n            return ex;\n        }\n        addExpression(groupIndex) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = groups[groupIndex];\n            const maxKey = group.expressions.reduce((max, p)=>p.key > max ? p.key : max, group.expressions[0].key);\n            const newEx = this.newExpression(maxKey + 1, \"&&\");\n            group.expressions.push(newEx);\n            if (group.expressions.length === 2) newEx.unlocked = true;\n            else {\n                group.expressions.forEach((ex)=>ex.unlocked = false);\n                newEx.clause = group.expressions[1].clause;\n            }\n            this.setState({\n                groups\n            });\n        }\n        updateExpression(partialEx, groupIndex, index) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = groups[groupIndex];\n            const ex = (0, _sanddanceReact.SandDance).VegaDeckGl.util.clone(group.expressions[index]);\n            if (ex.name !== partialEx.name) {\n                //choose an appropriate operator when switching data type\n                const oldColumn = getColumnWithName(ex.name, this.state.sortedColumns);\n                const newColumn = getColumnWithName(partialEx.name, this.state.sortedColumns);\n                const oldType = oldColumn && oldColumn.type;\n                const newType = newColumn && newColumn.type;\n                if (oldType !== newType) {\n                    const newOperators = (0, _searchTerm.getValidOperators)(newColumn).map((validOperator)=>validOperator[0]);\n                    //see if old operator is compatible\n                    if (newOperators.indexOf(ex.operator) < 0) //not compatible, so choose \"equal\"\n                    partialEx.operator = \"==\";\n                }\n            }\n            Object.assign(ex, partialEx);\n            clearExpressionValidation(ex);\n            group.expressions[index] = ex;\n            this.setState({\n                groups\n            });\n        }\n        deleteExpression(groupIndex, index) {\n            const groups = [\n                ...this.state.groups\n            ];\n            const group = groups[groupIndex];\n            const expressions = [\n                ...group.expressions\n            ];\n            expressions.splice(index, 1);\n            if (expressions.length === 2) expressions[1].unlocked = true;\n            group.expressions = expressions;\n            this.setState({\n                groups\n            });\n        }\n        render() {\n            return (0, _base.base).react.createElement((0, _group.Group), {\n                className: \"sanddance-search\",\n                label: (0, _language.strings).labelSearch\n            }, (0, _base.base).react.createElement(\"div\", null, this.state.groups.map((group, groupIndex)=>(0, _base.base).react.createElement(\"div\", {\n                    className: \"sanddance-search-group\",\n                    key: group.key\n                }, (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n                    collapseLabel: this.props.collapseLabels,\n                    className: \"search-group-clause\",\n                    label: (0, _language.strings).labelSearchClause,\n                    disabled: groupIndex === 0 || this.props.disableGroupOR,\n                    dropdownWidth: 120,\n                    options: getGroupClauses(group.clause, groupIndex, this.props.disableGroupOR),\n                    onChange: (e, o)=>this.updateGroup({\n                            clause: o.data\n                        }, groupIndex)\n                }), (0, _base.base).react.createElement(\"div\", null, group.expressions.map((ex1, i1)=>(0, _base.base).react.createElement(\"div\", {\n                        className: \"sanddance-search-expression\",\n                        key: ex1.key\n                    }, (0, _base.base).react.createElement((0, _searchTerm.SearchTerm), {\n                        dropdownRef: groupIndex === 0 && i1 === 0 ? this.dropdownRef : undefined,\n                        collapseLabels: this.props.collapseLabels,\n                        onUpdateExpression: (ex, i)=>this.updateExpression(ex, groupIndex, i),\n                        autoCompleteDistinctValues: this.props.autoCompleteDistinctValues,\n                        index: i1,\n                        columns: this.state.sortedColumns,\n                        data: this.props.data,\n                        searchExpression: ex1,\n                        disableOR: this.props.disableExpressionOR,\n                        column: getColumnWithName(ex1.name, this.state.sortedColumns)\n                    }), group.expressions.length > 1 && (0, _base.base).react.createElement((0, _button.Button), {\n                        themePalette: this.props.themePalette,\n                        className: \"search-action\",\n                        iconName: \"Cancel\",\n                        onClick: ()=>this.deleteExpression(groupIndex, i1),\n                        text: (0, _language.strings).buttonDeleteExpression\n                    })))), group.expressions.length < maxClauses && (0, _base.base).react.createElement(\"div\", null, (0, _base.base).react.createElement((0, _button.Button), {\n                    themePalette: this.props.themePalette,\n                    className: \"search-action\",\n                    iconName: \"Add\",\n                    onClick: ()=>this.addExpression(groupIndex),\n                    text: (0, _language.strings).buttonAddExpression\n                })), this.state.groups.length > 1 && (0, _base.base).react.createElement((0, _button.Button), {\n                    themePalette: this.props.themePalette,\n                    className: \"search-action\",\n                    iconName: \"Cancel\",\n                    onClick: ()=>this.deleteGroup(groupIndex),\n                    text: (0, _language.strings).buttonDeleteExpressionGroup\n                }))), this.state.groups.length < maxClauses && (0, _base.base).react.createElement(\"div\", null, (0, _base.base).react.createElement((0, _button.Button), {\n                themePalette: this.props.themePalette,\n                className: \"search-action search-bottom-action\",\n                iconName: \"Add\",\n                onClick: ()=>this.addGroup(),\n                text: (0, _language.strings).buttonAddExpressionGroup\n            }))), (0, _base.base).react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n                className: \"search-action search-bottom-action\",\n                text: (0, _language.strings).buttonSelect,\n                onClick: ()=>this.validateAndSearch()\n            }));\n        }\n    }\n    return new __Search(_props);\n}\nconst Search = _Search;\n\n},{\"../controls/searchTerm\":\"2ubnH\",\"../base\":\"b6Cy1\",\"../controls/button\":\"gFWNm\",\"../controls/dropdown\":\"iEkOh\",\"../controls/group\":\"e2GTU\",\"@msrvida/sanddance-react\":\"4uo3s\",\"../language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2ubnH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"maxAutocomplete\", ()=>maxAutocomplete);\nparcelHelpers.export(exports, \"getValidOperators\", ()=>getValidOperators);\nparcelHelpers.export(exports, \"getText\", ()=>getText);\nparcelHelpers.export(exports, \"SearchTerm\", ()=>SearchTerm);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _dropdown = require(\"./dropdown\");\nvar _textfield = require(\"./textfield\");\nvar _base = require(\"../base\");\nvar _language = require(\"../language\");\nconst maxAutocomplete = 100;\nfunction getValidOperators(column) {\n    const type = column && column.type;\n    switch(type){\n        case \"boolean\":\n            return [\n                [\n                    \"==\",\n                    (0, _language.strings).searchEQ\n                ],\n                [\n                    \"!=\",\n                    (0, _language.strings).searchNEQ\n                ],\n                [\n                    \"isnullorEmpty\",\n                    (0, _language.strings).searchNULL\n                ]\n            ];\n        case \"date\":\n        case \"integer\":\n        case \"number\":\n            return [\n                [\n                    \"==\",\n                    (0, _language.strings).searchEQ\n                ],\n                [\n                    \"!=\",\n                    (0, _language.strings).searchNEQ\n                ],\n                [\n                    \">\",\n                    (0, _language.strings).searchGT\n                ],\n                [\n                    \">=\",\n                    (0, _language.strings).searchGTE\n                ],\n                [\n                    \"<\",\n                    (0, _language.strings).searchLT\n                ],\n                [\n                    \"<=\",\n                    (0, _language.strings).searchLTE\n                ],\n                [\n                    \"isnullorEmpty\",\n                    (0, _language.strings).searchNULL\n                ]\n            ];\n        case \"string\":\n        default:\n            return [\n                [\n                    \"==\",\n                    (0, _language.strings).searchEQ\n                ],\n                [\n                    \"!=\",\n                    (0, _language.strings).searchNEQ\n                ],\n                [\n                    \">\",\n                    (0, _language.strings).searchGT\n                ],\n                [\n                    \">=\",\n                    (0, _language.strings).searchGTE\n                ],\n                [\n                    \"<\",\n                    (0, _language.strings).searchLT\n                ],\n                [\n                    \"<=\",\n                    (0, _language.strings).searchLTE\n                ],\n                [\n                    \"contains\",\n                    (0, _language.strings).searchIN\n                ],\n                [\n                    \"starts\",\n                    (0, _language.strings).searchSW\n                ],\n                [\n                    \"isnullorEmpty\",\n                    (0, _language.strings).searchNULL\n                ]\n            ];\n    }\n}\nfunction getExpressionClauses(currClause, disableOR) {\n    const keys = [\n        [\n            \"&&\",\n            (0, _language.strings).searchAND\n        ]\n    ];\n    if (!disableOR) keys.push([\n        \"||\",\n        (0, _language.strings).searchOR\n    ]);\n    return keys.map((key, i)=>{\n        const [clause, text] = key;\n        const selected = currClause == clause; //deliberate double equal \n        const option = {\n            key: i,\n            text,\n            data: clause,\n            selected\n        };\n        return option;\n    });\n}\nfunction getOperators(ex, column) {\n    let anySelected = false;\n    const validOperators = getValidOperators(column);\n    const options = validOperators.map((validoperator)=>{\n        const [op, text] = validoperator;\n        const selected = ex.operator === op;\n        anySelected = anySelected || selected;\n        const option = {\n            key: op,\n            text,\n            data: op,\n            selected\n        };\n        return option;\n    });\n    if (!anySelected) options[0].selected = true;\n    return options;\n}\nfunction getDistinctValues(data, columnName) {\n    const distinctMap = {};\n    for(let i = 0; i < data.length; i++){\n        let row = data[i];\n        let value = row[columnName];\n        distinctMap[value] = true;\n    }\n    return Object.keys(distinctMap).sort();\n}\nfunction getValues(ex, column, data, autoCompleteDistinctValues) {\n    const stats = column && column.stats;\n    if (stats && stats.distinctValueCount < maxAutocomplete) {\n        if (!autoCompleteDistinctValues[column.name]) autoCompleteDistinctValues[column.name] = getDistinctValues(data, column.name);\n        return autoCompleteDistinctValues[column.name].map((v, i)=>({\n                key: i,\n                text: v\n            }));\n    }\n    return [];\n}\nfunction getText(ex) {\n    if (ex.operator === \"isnullorEmpty\") return \"\";\n    return typeof ex.value === \"string\" ? ex.value : ex.value == null ? \"\" : ex.value.toString();\n}\nfunction SearchTerm(props) {\n    const ex = props.searchExpression;\n    const possibleValues = getValues(ex, props.column, props.data, props.autoCompleteDistinctValues);\n    //TODO better date handling with calendar picker\n    return (0, _base.base).react.createElement(\"div\", null, props.index > 0 && (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, _language.strings).labelSearchClause,\n        dropdownWidth: 120,\n        disabled: !ex.unlocked || props.disableOR,\n        options: getExpressionClauses(ex.clause, props.disableOR),\n        onChange: (e, o)=>props.onUpdateExpression({\n                clause: o.data\n            }, props.index)\n    }), (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n        componentRef: props.dropdownRef,\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, _language.strings).labelSearchColumn,\n        options: [\n            {\n                key: \"\",\n                text: (0, _language.strings).selectAny,\n                data: null,\n                selected: ex.name === null\n            }\n        ].concat(props.columns.map((c, i)=>({\n                key: c.name,\n                text: c.name,\n                data: c,\n                selected: c.name === ex.name\n            }))),\n        onChange: (e, o)=>props.onUpdateExpression({\n                name: o.data && o.data.name || null\n            }, props.index)\n    }), (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n        collapseLabel: props.collapseLabels,\n        className: \"search-field\",\n        label: (0, _language.strings).labelSearchOperator,\n        dropdownWidth: 120,\n        options: getOperators(ex, props.column),\n        onChange: (e, o)=>props.onUpdateExpression({\n                operator: o.data\n            }, props.index)\n    }), possibleValues.length > 0 && (0, _base.base).react.createElement((0, _base.base).fluentUI.ComboBox, {\n        className: \"search-field\",\n        label: props.collapseLabels ? null : (0, _language.strings).labelSearchValue,\n        placeholder: (0, _language.strings).labelSearchValuePlaceholder,\n        disabled: ex.operator === \"isnullorEmpty\",\n        dropdownWidth: (0, _dropdown.dropdownWidth),\n        allowFreeform: true,\n        autoComplete: \"on\",\n        errorMessage: ex.errorMessage,\n        text: getText(ex),\n        options: getValues(ex, props.column, props.data, props.autoCompleteDistinctValues),\n        onChange: (e, o, i, value)=>{\n            if (o) value = o.text;\n            props.onUpdateExpression({\n                value\n            }, props.index);\n        }\n    }), possibleValues.length === 0 && (0, _base.base).react.createElement((0, _textfield.TextField), {\n        className: \"search-field\",\n        label: props.collapseLabels ? null : (0, _language.strings).labelSearchValue,\n        placeholder: (0, _language.strings).labelSearchValuePlaceholder,\n        disabled: ex.operator === \"isnullorEmpty\",\n        errorMessage: ex.errorMessage,\n        value: getText(ex),\n        onChange: (e, v)=>props.onUpdateExpression({\n                value: v\n            }, props.index)\n    }));\n}\n\n},{\"./dropdown\":\"iEkOh\",\"./textfield\":\"hdHCv\",\"../base\":\"b6Cy1\",\"../language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hdHCv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TextField\", ()=>TextField);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nfunction TextField(props) {\n    return (0, _base.base).react.createElement((0, _base.base).fluentUI.TextField, Object.assign({\n        onKeyUp: (e)=>{\n            e.nativeEvent.stopImmediatePropagation();\n        }\n    }, props));\n}\n\n},{\"../base\":\"b6Cy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gFWNm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Button\", ()=>Button);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nfunction Button(props) {\n    return (0, _base.base).react.createElement((0, _base.base).fluentUI.DefaultButton, Object.assign({}, props, {\n        styles: {\n            root: {\n                backgroundColor: \"transparent\",\n                height: \"30px\",\n                width: props.width,\n                padding: 0\n            },\n            rootDisabled: {\n                backgroundColor: \"transparent\"\n            },\n            icon: {\n                color: props.themePalette.themePrimary\n            },\n            label: {\n                fontWeight: \"400\",\n                textAlign: props.textAlign || \"left\"\n            }\n        },\n        iconProps: {\n            iconName: props.iconName\n        }\n    }));\n}\n\n},{\"../base\":\"b6Cy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kDVwl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Settings\", ()=>Settings);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _base = require(\"../base\");\nvar _canvas = require(\"../canvas\");\nvar _dialog = require(\"../controls/dialog\");\nvar _dropdown = require(\"../controls/dropdown\");\nvar _group = require(\"../controls/group\");\nvar _signal = require(\"../controls/signal\");\nvar _language = require(\"../language\");\nvar _version = require(\"../version\");\nvar SandDance = _sanddanceReact.SandDance;\nvar DataRefType;\n(function(DataRefType1) {\n    DataRefType1[DataRefType1[\"none\"] = 0] = \"none\";\n    DataRefType1[DataRefType1[\"inline\"] = 1] = \"inline\";\n    DataRefType1[DataRefType1[\"url\"] = 2] = \"url\";\n})(DataRefType || (DataRefType = {}));\nfunction filterSignals(signal) {\n    switch(signal.name){\n        case SandDance.constants.SignalNames.XBins:\n        case SandDance.constants.SignalNames.YBins:\n        case SandDance.constants.SignalNames.FacetBins:\n        case SandDance.constants.SignalNames.FacetVBins:\n        case SandDance.constants.SignalNames.ColorBinCount:\n        case SandDance.constants.SignalNames.ColorReverse:\n        case SandDance.constants.SignalNames.PointScale:\n        case SandDance.constants.SignalNames.TreeMapMethod:\n            return false;\n        default:\n            return !!signal.bind;\n    }\n}\nfunction cloneData(vegaSpec) {\n    const data0 = vegaSpec.data[0];\n    const valuesData = data0;\n    const values = valuesData.values;\n    delete valuesData.values;\n    const data = SandDance.VegaDeckGl.util.clone(vegaSpec.data);\n    valuesData.values = values;\n    return {\n        data,\n        values\n    };\n}\nfunction cloneScales(vegaSpec) {\n    return SandDance.VegaDeckGl.util.clone(vegaSpec.scales);\n}\nfunction serializeSpec(vegaSpec, datafile, dataRefType, transform, scheme) {\n    const scales = cloneScales(vegaSpec);\n    const colorScale = scales.filter((scale)=>scale.name === SandDance.constants.ScaleNames.Color)[0];\n    if (scheme.indexOf(\"dual_\") >= 0) colorScale.range = SandDance.colorSchemes.filter((cs)=>cs.scheme === scheme)[0].colors;\n    const clone = cloneData(vegaSpec);\n    const data0 = clone.data[0];\n    if (dataRefType === DataRefType.inline) {\n        const valuesData = data0;\n        valuesData.format = {\n            parse: \"auto\",\n            type: \"json\"\n        };\n        valuesData.values = clone.values;\n    } else if (dataRefType === DataRefType.none) {\n        const valuesData = data0;\n        valuesData.values = [];\n        if (transform) {\n            if (valuesData.transform) valuesData.transform.push.apply(valuesData.transform, transform);\n            else valuesData.transform = transform;\n        }\n    } else if (dataRefType === DataRefType.url) {\n        const urlData = data0;\n        urlData.url = datafile.dataUrl;\n        urlData.format = {\n            parse: \"auto\",\n            type: datafile.type\n        };\n        if (transform) {\n            if (urlData.transform) urlData.transform.push.apply(urlData.transform, transform);\n            else urlData.transform = transform;\n        }\n    }\n    return Object.assign(Object.assign({}, vegaSpec), {\n        data: clone.data,\n        scales\n    });\n}\nfunction defaultDataRefType(datafile) {\n    if (datafile.dataUrl) return DataRefType.url;\n    return DataRefType.none;\n}\nfunction initState(props) {\n    return {\n        showSystemDialog: false,\n        showVegaDialog: false,\n        dataRefType: defaultDataRefType(props.dataFile),\n        spec: null\n    };\n}\nfunction signalGroupKey(key) {\n    for(let i = 0; i < (0, _language.strings).signalGroups.length; i++){\n        if ((0, _language.strings).signalGroups[i].prefix === key) return key;\n    }\n    return \"*\";\n}\nfunction vegaSignalGroups(vegaSignals) {\n    const signalGroupMap = {};\n    vegaSignals.forEach((vs)=>{\n        const split = vs.name.split(\"_\");\n        const key = signalGroupKey(split[0]);\n        signalGroupMap[key] = signalGroupMap[key] || [];\n        signalGroupMap[key].push(vs);\n    });\n    return signalGroupMap;\n}\nfunction _Settings(_props) {\n    class __Settings extends (0, _base.base).react.Component {\n        constructor(props){\n            super(props);\n            this.state = initState(props);\n        }\n        render() {\n            const { props , state  } = this;\n            if (!props.explorer.viewer || !props.explorer.viewer.vegaSpec) return null;\n            const options = [\n                {\n                    key: DataRefType.none,\n                    text: (0, _language.strings).selectVegaSpecDataNone,\n                    selected: this.state.dataRefType === DataRefType.none,\n                    data: DataRefType.none\n                },\n                !props.dataFile.rawText && {\n                    key: DataRefType.url,\n                    text: (0, _language.strings).selectVegaSpecDataUrl,\n                    selected: this.state.dataRefType === DataRefType.url,\n                    data: DataRefType.url\n                },\n                {\n                    key: DataRefType.inline,\n                    text: (0, _language.strings).selectVegaSpecDataInline,\n                    selected: this.state.dataRefType === DataRefType.inline,\n                    data: DataRefType.inline\n                }\n            ].filter(Boolean);\n            const signalGroupMap = vegaSignalGroups(props.explorer.viewer.vegaSpec.signals);\n            let first = true;\n            return (0, _base.base).react.createElement(\"div\", null, (0, _language.strings).signalGroups.map((sg, gi)=>{\n                const vegaSignals = signalGroupMap[sg.prefix];\n                if (vegaSignals) {\n                    const filteredVegaSignals = vegaSignals.filter(filterSignals);\n                    if (filteredVegaSignals.length > 0) return (0, _base.base).react.createElement((0, _group.Group), {\n                        key: sg.prefix,\n                        label: sg.label\n                    }, filteredVegaSignals.map((signal, i)=>{\n                        const ref = (0, _base.base).react.createRef();\n                        if (first) {\n                            first = false;\n                            props.explorer.dialogFocusHandler.focus = ()=>{\n                                const f = ref.current;\n                                if (f.focus) f.focus();\n                            };\n                        }\n                        return (0, _base.base).react.createElement((0, _signal.Signal), {\n                            componentRef: ref,\n                            key: i,\n                            signal: signal,\n                            explorer: props.explorer,\n                            newViewStateTarget: false\n                        });\n                    }));\n                }\n            }), (0, _base.base).react.createElement((0, _group.Group), {\n                label: (0, _language.strings).labelChartCanvas\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.Toggle, {\n                label: (0, _language.strings).labelShowAxes,\n                defaultChecked: !props.hideAxes,\n                onChange: (e, checked)=>props.onToggleAxes(!checked)\n            }), (0, _base.base).react.createElement((0, _base.base).fluentUI.Toggle, {\n                label: (0, _language.strings).labelShowLegend,\n                defaultChecked: !props.hideLegend,\n                onChange: (e, checked)=>props.onToggleLegend(!checked)\n            })), (0, _base.base).react.createElement((0, _group.Group), {\n                label: (0, _language.strings).labelTools\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.DefaultButton, {\n                text: (0, _language.strings).buttonShowVegaSpec,\n                onClick: ()=>this.setState({\n                        showVegaDialog: true,\n                        spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, this.state.dataRefType, props.explorer.viewer.getInsight().transform, this.props.scheme)\n                    })\n            })), (0, _base.base).react.createElement((0, _group.Group), {\n                label: (0, _language.strings).labelSnapshots\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.Slider, {\n                label: (0, _language.strings).labelSnapshotSettingThumbnailWidth,\n                onChange: (value)=>{\n                    this.props.explorer.snapshotThumbWidth = value;\n                },\n                min: 100,\n                max: 800,\n                defaultValue: this.props.explorer.snapshotThumbWidth\n            })), (0, _base.base).react.createElement((0, _group.Group), {\n                label: (0, _language.strings).labelTransitionDurations\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.Slider, {\n                label: (0, _language.strings).labelTransitionColor,\n                onChange: (value)=>{\n                    this.props.explorer.viewerOptions.transitionDurations.color = value;\n                },\n                min: 0,\n                max: 10000,\n                defaultValue: this.props.explorer.viewerOptions.transitionDurations.color\n            }), (0, _base.base).react.createElement((0, _base.base).fluentUI.Slider, {\n                label: (0, _language.strings).labelTransitionPosition,\n                onChange: (value)=>{\n                    this.props.explorer.viewerOptions.transitionDurations.position = value;\n                },\n                min: 0,\n                max: 10000,\n                defaultValue: this.props.explorer.viewerOptions.transitionDurations.position\n            }), (0, _base.base).react.createElement((0, _base.base).fluentUI.Slider, {\n                label: (0, _language.strings).labelTransitionSize,\n                onChange: (value)=>{\n                    this.props.explorer.viewerOptions.transitionDurations.size = value;\n                },\n                min: 0,\n                max: 10000,\n                defaultValue: this.props.explorer.viewerOptions.transitionDurations.size\n            }), (0, _base.base).react.createElement((0, _base.base).fluentUI.Slider, {\n                label: (0, _language.strings).labelTransitionCamera,\n                onChange: (value)=>{\n                    this.props.explorer.viewerOptions.transitionDurations.view = value;\n                },\n                min: 0,\n                max: 10000,\n                defaultValue: this.props.explorer.viewerOptions.transitionDurations.view\n            })), props.additionalSettings && props.additionalSettings.map((g, i)=>(0, _base.base).react.createElement((0, _group.Group), {\n                    key: i,\n                    label: g.groupLabel\n                }, g.children)), (0, _base.base).react.createElement((0, _group.Group), {\n                label: (0, _language.strings).labelSystem\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.DefaultButton, {\n                text: (0, _language.strings).labelSystemInfo,\n                onClick: ()=>this.setState({\n                        showSystemDialog: true\n                    })\n            })), (0, _base.base).react.createElement((0, _dialog.Dialog), {\n                hidden: !state.showVegaDialog,\n                onDismiss: ()=>this.setState(initState(this.props)),\n                minWidth: \"80%\",\n                title: (0, _language.strings).labelVegaSpec,\n                buttons: [\n                    (0, _base.base).react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n                        key: \"copy\",\n                        iconProps: {\n                            iconName: \"Copy\"\n                        },\n                        text: (0, _language.strings).buttonCopyToClipboard,\n                        onClick: ()=>{\n                            var pre = document.getElementById(\"sanddance-vega-spec\");\n                            var range = document.createRange();\n                            range.selectNode(pre);\n                            const selection = window.getSelection();\n                            selection.removeAllRanges();\n                            selection.addRange(range);\n                            document.execCommand(\"copy\");\n                        }\n                    }),\n                    (0, _base.base).react.createElement((0, _base.base).fluentUI.DefaultButton, {\n                        key: \"edit\",\n                        iconProps: {\n                            iconName: \"OpenInNewWindow\"\n                        },\n                        text: (0, _language.strings).buttonLaunchVegaEditor,\n                        onClick: ()=>{\n                            window.open(\"https://vega.github.io/editor/\", \"_blank\");\n                        }\n                    })\n                ]\n            }, (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n                label: (0, _language.strings).labelVegaSpecData,\n                options: options,\n                onChange: (e, o)=>this.setState({\n                        dataRefType: o.data,\n                        spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, o.data, props.explorer.viewer.getInsight().transform, this.props.scheme)\n                    })\n            }), (0, _base.base).react.createElement(\"pre\", {\n                id: \"sanddance-vega-spec\"\n            }, JSON.stringify(this.state.spec, null, 2)), (0, _base.base).react.createElement(\"div\", null, (0, _language.strings).labelVegaSpecNotes)), (0, _base.base).react.createElement((0, _dialog.Dialog), {\n                hidden: !state.showSystemDialog,\n                onDismiss: ()=>this.setState(initState(this.props)),\n                title: (0, _language.strings).labelSystemInfo\n            }, (0, _base.base).react.createElement(\"ul\", null, this.props.children, (0, _base.base).react.createElement(\"li\", null, \"SandDanceExplorer version: \", (0, _version.version)), (0, _base.base).react.createElement(\"li\", null, \"SandDanceReact version: \", _sanddanceReact.version), (0, _base.base).react.createElement(\"li\", null, \"SandDance version: \", SandDance.version), (0, _base.base).react.createElement(\"li\", null, \"WebGL enabled: \", (0, _canvas.capabilities).webgl ? (0, _language.strings).labelYes : (0, _language.strings).labelNo), (0, _base.base).react.createElement(\"li\", null, \"WebGL2 enabled: \", (0, _canvas.capabilities).webgl2 ? (0, _language.strings).labelYes : (0, _language.strings).labelNo))));\n        }\n    }\n    return new __Settings(_props);\n}\nconst Settings = _Settings;\n\n},{\"@msrvida/sanddance-react\":\"4uo3s\",\"../base\":\"b6Cy1\",\"../canvas\":\"aMCsM\",\"../controls/dialog\":\"hBByT\",\"../controls/dropdown\":\"iEkOh\",\"../controls/group\":\"e2GTU\",\"../controls/signal\":\"hpJp2\",\"../language\":\"7qvdA\",\"../version\":\"g9qji\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aMCsM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getCanvas\", ()=>getCanvas);\nparcelHelpers.export(exports, \"removeTabIndex\", ()=>removeTabIndex);\nparcelHelpers.export(exports, \"capabilities\", ()=>capabilities);\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar PresenterElement = (0, _sanddanceReact.SandDance).VegaDeckGl.PresenterElement;\nfunction getCanvas(viewer) {\n    var tags = viewer.presenter.getElement(PresenterElement.gl).getElementsByTagName(\"canvas\");\n    if (tags) return tags[0];\n}\nfunction removeTabIndex(viewer) {\n    var canvas = getCanvas(viewer);\n    if (canvas) canvas.tabIndex = -1;\n}\nconst capabilities = {\n    webgl: !!document.createElement(\"canvas\").getContext(\"webgl\"),\n    webgl2: !!document.createElement(\"canvas\").getContext(\"webgl2\")\n};\n\n},{\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g9qji\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"version\", ()=>version);\nconst version = \"3.2.0\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jdUx0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SnapshotEditor\", ()=>SnapshotEditor);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _dialog = require(\"../controls/dialog\");\nvar _canvas = require(\"../canvas\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _language = require(\"../language\");\nfunction _SnapshotEditor(props1) {\n    class __SnapshotEditor extends (0, _base.base).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                showEditFormDialog: false,\n                title: \"\",\n                description: \"\",\n                image: null,\n                bgColor: null,\n                insight: null,\n                editIndex: -1\n            };\n        }\n        resize(src, thumbWidth) {\n            if (!src) return;\n            var img = new Image();\n            img.onload = ()=>{\n                var canvas = document.createElement(\"canvas\"), ctx = canvas.getContext(\"2d\");\n                const ratio = img.width / thumbWidth;\n                canvas.height = img.height / ratio;\n                canvas.width = thumbWidth;\n                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n                const image = canvas.toDataURL();\n                this.setState({\n                    image\n                });\n            };\n            img.src = src;\n        }\n        editSnapshot(snapshot, editIndex = -1) {\n            if (snapshot) this.setState(Object.assign(Object.assign({\n                showEditFormDialog: true\n            }, snapshot), {\n                editIndex\n            }));\n            else {\n                const signalValues = this.props.explorer.viewer.getSignalValues();\n                this.props.explorer.viewer.deselect().then(()=>{\n                    const canvas = (0, _canvas.getCanvas)(this.props.explorer.viewer);\n                    const bgColor = canvas && window.getComputedStyle(canvas).backgroundColor;\n                    const insight = (0, _sanddanceReact.SandDance).VegaDeckGl.util.clone(this.props.explorer.viewer.getInsight());\n                    delete insight.size;\n                    insight.signalValues = signalValues;\n                    const title = this.props.getTitle && this.props.getTitle(insight) || \"\";\n                    const description = this.props.getDescription && this.props.getDescription(insight) || \"\";\n                    this.setState({\n                        showEditFormDialog: true,\n                        bgColor,\n                        title,\n                        description,\n                        insight,\n                        image: null,\n                        editIndex\n                    });\n                    //allow deselection to render\n                    setTimeout(()=>{\n                        this.props.explorer.viewer.presenter.canvasToDataURL().then((dataUrl)=>{\n                            this.resize(dataUrl, this.props.explorer.snapshotThumbWidth);\n                        });\n                    }, 500);\n                });\n            }\n        }\n        render() {\n            return (0, _base.base).react.createElement((0, _dialog.Dialog), {\n                modalProps: {\n                    className: (0, _sanddanceReact.util).classList(\"sanddance-snapshot-dialog\", this.props.theme)\n                },\n                minWidth: `${this.props.explorer.snapshotThumbWidth + 64}px`,\n                hidden: !this.state.showEditFormDialog,\n                onDismiss: ()=>this.setState({\n                        showEditFormDialog: false\n                    }),\n                title: this.state.editIndex >= 0 ? (0, _language.strings).buttonEditSnapshot : (0, _language.strings).buttonCreateSnapshot,\n                buttons: (0, _base.base).react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n                    disabled: !this.state.image || !this.state.title,\n                    key: 0,\n                    onClick: (e)=>{\n                        const snapshot = {\n                            title: this.state.title,\n                            description: this.state.description,\n                            insight: this.state.insight,\n                            image: this.state.image,\n                            bgColor: this.state.bgColor\n                        };\n                        this.props.modifySnapShot && this.props.modifySnapShot(snapshot);\n                        this.props.onWriteSnapshot(snapshot, this.state.editIndex);\n                        this.setState({\n                            showEditFormDialog: false,\n                            title: \"\",\n                            description: \"\",\n                            image: null\n                        });\n                    },\n                    iconProps: {\n                        iconName: \"Camera\"\n                    },\n                    text: this.state.editIndex >= 0 ? (0, _language.strings).buttonUpdateSnapshot : (0, _language.strings).buttonCreateSnapshot\n                })\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.TextField, {\n                label: (0, _language.strings).labelSnapshotTitle,\n                onChange: (e, title)=>this.setState({\n                        title\n                    }),\n                value: this.state.title\n            }), (0, _base.base).react.createElement((0, _base.base).fluentUI.TextField, {\n                label: (0, _language.strings).labelSnapshotDescription,\n                onChange: (e, description)=>this.setState({\n                        description\n                    }),\n                value: this.state.description,\n                multiline: true\n            }), (0, _base.base).react.createElement(\"div\", {\n                className: \"thumbnail\"\n            }, !this.state.image && (0, _base.base).react.createElement((0, _base.base).fluentUI.Spinner, null), this.state.image && (0, _base.base).react.createElement(\"img\", {\n                src: this.state.image,\n                style: {\n                    backgroundColor: this.state.bgColor\n                }\n            })), this.props.explorer.viewer && this.props.explorer.viewer.colorContexts && this.props.explorer.viewer.colorContexts.length > 1 && (0, _base.base).react.createElement(\"div\", null, (0, _language.strings).labelColorFilter));\n        }\n    }\n    return new __SnapshotEditor(props1);\n}\nconst SnapshotEditor = _SnapshotEditor;\n\n},{\"../base\":\"b6Cy1\",\"../controls/dialog\":\"hBByT\",\"../canvas\":\"aMCsM\",\"@msrvida/sanddance-react\":\"4uo3s\",\"../language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cVyum\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Snapshots\", ()=>Snapshots);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _dialog = require(\"../controls/dialog\");\nvar _group = require(\"../controls/group\");\nvar _iconButton = require(\"../controls/iconButton\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _language = require(\"../language\");\nfunction _Snapshots(_props) {\n    class __Snapshots extends (0, _base.base).react.Component {\n        constructor(props){\n            super(props);\n            this.state = {\n                confirmation: null,\n                title: \"\",\n                description: \"\",\n                image: null,\n                bgColor: null,\n                insight: null\n            };\n        }\n        render() {\n            const items = [\n                {\n                    key: \"clear\",\n                    text: (0, _language.strings).buttonClearSnapshots,\n                    onClick: ()=>this.setState({\n                            confirmation: {\n                                buttonText: (0, _language.strings).buttonClearSnapshots,\n                                handler: ()=>this.props.onClearSnapshots()\n                            }\n                        }),\n                    disabled: this.props.snapshots.length === 0\n                }\n            ];\n            if (this.props.getTopActions) items.push.apply(items, this.props.getTopActions(this.props.snapshots));\n            const ref = (0, _base.base).react.createRef();\n            this.props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                (_a = ref.current) === null || _a === void 0 || _a.focus();\n            };\n            return (0, _base.base).react.createElement((0, _group.Group), {\n                className: \"sanddance-snapshots\",\n                label: (0, _language.strings).labelSnapshots\n            }, (0, _base.base).react.createElement(\"div\", null, (0, _base.base).react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n                componentRef: ref,\n                text: (0, _language.strings).buttonCreateSnapshot,\n                onClick: (e)=>this.props.editor.editSnapshot(),\n                split: true,\n                menuProps: {\n                    items\n                }\n            }), this.props.getChildren && this.props.getChildren(this.props.snapshots), this.state.confirmation && (0, _base.base).react.createElement((0, _dialog.Dialog), {\n                hidden: false,\n                buttons: (0, _base.base).react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n                    key: 0,\n                    onClick: (e)=>{\n                        this.setState({\n                            confirmation: null\n                        });\n                        this.state.confirmation.handler();\n                    },\n                    iconProps: {\n                        iconName: \"Delete\"\n                    },\n                    text: this.state.confirmation.buttonText\n                }),\n                onDismiss: ()=>this.setState({\n                        confirmation: null\n                    })\n            }, (0, _language.strings).labelConfirmation), (0, _base.base).react.createElement(\"div\", null, this.props.snapshots.map((snapshot, i)=>{\n                const actions = this.props.getActions && this.props.getActions(snapshot, i) || [];\n                actions.push({\n                    iconButtonProps: {\n                        themePalette: this.props.themePalette,\n                        title: (0, _language.strings).buttonEditSnapshot,\n                        onClick: (e)=>this.props.editor.editSnapshot(snapshot, i),\n                        iconName: \"Edit\"\n                    }\n                });\n                if (this.props.snapshots.length > 1) actions.push({\n                    iconButtonProps: {\n                        disabled: i === 0,\n                        themePalette: this.props.themePalette,\n                        title: (0, _language.strings).buttonMoveUp,\n                        onClick: (e)=>this.props.onMoveUp(i),\n                        iconName: \"SortUp\"\n                    }\n                }, {\n                    iconButtonProps: {\n                        disabled: i > this.props.snapshots.length - 2,\n                        themePalette: this.props.themePalette,\n                        title: (0, _language.strings).buttonMoveDown,\n                        onClick: (e)=>this.props.onMoveDown(i),\n                        iconName: \"SortDown\"\n                    }\n                });\n                actions.push({\n                    iconButtonProps: {\n                        themePalette: this.props.themePalette,\n                        title: (0, _language.strings).buttonDeleteSnapshot,\n                        onClick: ()=>this.setState({\n                                confirmation: {\n                                    buttonText: (0, _language.strings).buttonDeleteSnapshot,\n                                    handler: ()=>this.props.onRemoveSnapshot(i)\n                                }\n                            }),\n                        iconName: \"Delete\"\n                    }\n                });\n                return (0, _base.base).react.createElement(\"div\", {\n                    key: i,\n                    className: (0, _sanddanceReact.util).classList(\"snapshot\", i === this.props.selectedSnapshotIndex && \"selected\")\n                }, (0, _base.base).react.createElement(\"div\", {\n                    onClick: (e)=>this.props.onSnapshotClick(snapshot, i)\n                }, (0, _base.base).react.createElement(\"div\", {\n                    className: \"title\"\n                }, snapshot.title), (0, _base.base).react.createElement(\"div\", {\n                    className: \"thumbnail\"\n                }, (0, _base.base).react.createElement(\"img\", {\n                    title: snapshot.description,\n                    src: snapshot.image,\n                    style: {\n                        backgroundColor: snapshot.bgColor\n                    }\n                }))), (0, _base.base).react.createElement(Actions, {\n                    actions: actions,\n                    snapshot: snapshot\n                }));\n            }))));\n        }\n    }\n    return new __Snapshots(_props);\n}\nconst Snapshots = _Snapshots;\nfunction Actions(props) {\n    return (0, _base.base).react.createElement(\"div\", {\n        className: \"actions\"\n    }, props.actions.map((action, i)=>{\n        if (action.iconButtonProps) return (0, _base.base).react.createElement((0, _iconButton.IconButton), Object.assign({\n            key: i\n        }, action.iconButtonProps));\n        if (action.element) return action.element;\n    }));\n}\n\n},{\"../base\":\"b6Cy1\",\"../controls/dialog\":\"hBByT\",\"../controls/group\":\"e2GTU\",\"../controls/iconButton\":\"at9GX\",\"@msrvida/sanddance-react\":\"4uo3s\",\"../language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"at9GX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"IconButton\", ()=>IconButton);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nfunction IconButton(props) {\n    return (0, _base.base).react.createElement((0, _base.base).fluentUI.IconButton, Object.assign({}, props, {\n        styles: {\n            root: {\n                color: props.themePalette.black\n            },\n            rootHovered: {\n                background: \"transparent\",\n                color: props.themePalette.themePrimary\n            },\n            rootPressed: {\n                background: \"transparent\"\n            },\n            menuIcon: {\n                display: \"none\"\n            }\n        },\n        iconProps: {\n            iconName: props.iconName\n        },\n        menuProps: props.menuProps\n    }));\n}\n\n},{\"../base\":\"b6Cy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3bX0l\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Explorer\", ()=>Explorer);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _canvas = require(\"./canvas\");\nvar _clickableTextLayer = require(\"./clickableTextLayer\");\nvar _colorMap = require(\"./colorMap\");\nvar _colorScheme = require(\"./colorScheme\");\nvar _columns = require(\"./columns\");\nvar _dataScope = require(\"./controls/dataScope\");\nvar _dialog = require(\"./controls/dialog\");\nvar _iconButton = require(\"./controls/iconButton\");\nvar _sidebar = require(\"./controls/sidebar\");\nvar _topbar = require(\"./controls/topbar\");\nvar _dataLoader = require(\"./dataLoader\");\nvar _defaults = require(\"./defaults\");\nvar _chart = require(\"./dialogs/chart\");\nvar _color = require(\"./dialogs/color\");\nvar _dataBrowser = require(\"./dialogs/dataBrowser\");\nvar _history = require(\"./dialogs/history\");\nvar _search = require(\"./dialogs/search\");\nvar _settings = require(\"./dialogs/settings\");\nvar _snapshotEditor = require(\"./dialogs/snapshotEditor\");\nvar _snapshots = require(\"./dialogs/snapshots\");\nvar _interfaces = require(\"./interfaces\");\nvar _language = require(\"./language\");\nvar _mouseEvent = require(\"./mouseEvent\");\nvar _partialInsight = require(\"./partialInsight\");\nvar _themes = require(\"./themes\");\nvar _toggleSearch = require(\"./toggleSearch\");\nvar _chartRecommender = require(\"@msrvida/chart-recommender\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nconst dataBrowserZeroMessages = {};\ndataBrowserZeroMessages[(0, _dataScope.DataScopeId).AllData] = (0, _language.strings).labelZeroAll;\ndataBrowserZeroMessages[(0, _dataScope.DataScopeId).FilteredData] = null; //empty array is not used\ndataBrowserZeroMessages[(0, _dataScope.DataScopeId).SelectedData] = (0, _language.strings).labelZeroSearchResults;\nconst dataBrowserNullMessages = {};\ndataBrowserNullMessages[(0, _dataScope.DataScopeId).AllData] = (0, _language.strings).labelDataNullAll;\ndataBrowserNullMessages[(0, _dataScope.DataScopeId).FilteredData] = (0, _language.strings).labelDataNullFiltered;\ndataBrowserNullMessages[(0, _dataScope.DataScopeId).SelectedData] = (0, _language.strings).labelDataNullSelection;\nfunction createInputSearch(search) {\n    const groups = (0, _sanddanceReact.SandDance).searchExpression.ensureSearchExpressionGroupArray(search);\n    const dialogSearch = groups.map((group, groupIndex)=>{\n        return Object.assign(Object.assign({\n            key: groupIndex\n        }, group), {\n            expressions: group.expressions.map((ex, i)=>{\n                const ex2 = Object.assign({\n                    key: i\n                }, ex);\n                return ex2;\n            })\n        });\n    });\n    return dialogSearch;\n}\nfunction _Explorer(props1) {\n    class __Explorer extends (0, _base.base).react.Component {\n        constructor(props){\n            super(props);\n            this.dialogFocusHandler = {};\n            this.state = {\n                calculating: null,\n                errors: null,\n                autoCompleteDistinctValues: {},\n                colorBin: null,\n                dataContent: null,\n                dataFile: null,\n                search: null,\n                totalStyle: null,\n                facetStyle: \"wrap\",\n                filter: null,\n                filteredData: null,\n                specCapabilities: null,\n                size: {\n                    height: null,\n                    width: null\n                },\n                scheme: null,\n                transform: null,\n                columns: null,\n                chart: \"grid\",\n                signalValues: null,\n                hideAxes: false,\n                hideLegend: false,\n                sideTabId: (0, _interfaces.SideTabId).ChartType,\n                dataScopeId: (0, _dataScope.DataScopeId).AllData,\n                selectedItemIndex: {},\n                sidebarClosed: false,\n                sidebarPinned: true,\n                view: props.initialView || \"2d\",\n                snapshots: [],\n                selectedSnapshotIndex: -1,\n                tooltipExclusions: [],\n                positionedColumnMapProps: null,\n                note: null,\n                historyIndex: -1,\n                historyItems: []\n            };\n            this.state.selectedItemIndex[(0, _dataScope.DataScopeId).AllData] = 0;\n            this.state.selectedItemIndex[(0, _dataScope.DataScopeId).FilteredData] = 0;\n            this.state.selectedItemIndex[(0, _dataScope.DataScopeId).SelectedData] = 0;\n            this.snapshotThumbWidth = (0, _defaults.snapshotThumbWidth);\n            this.discardColorContextUpdates = true;\n            this.updateViewerOptions(Object.assign(Object.assign({}, (0, _sanddanceReact.SandDance).VegaDeckGl.util.clone((0, _sanddanceReact.SandDance).Viewer.defaultViewerOptions)), props.viewerOptions));\n        }\n        finalize() {\n            if (this.viewer) this.viewer.finalize();\n        }\n        updateViewerOptions(viewerOptions) {\n            this.viewerOptions = Object.assign(Object.assign({}, (0, _sanddanceReact.SandDance).VegaDeckGl.util.deepMerge((0, _defaults.defaultViewerOptions), this.viewerOptions, viewerOptions)), {\n                tooltipOptions: {\n                    exclude: (columnName)=>this.state.tooltipExclusions.indexOf(columnName) >= 0\n                },\n                onColorContextChange: ()=>this.manageColorToolbar(),\n                onDataFilter: (filter, filteredData)=>{\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    selectedItemIndex[(0, _dataScope.DataScopeId).FilteredData] = 0;\n                    this.changeInsight({\n                        filter\n                    }, {\n                        label: this.historicFilterChange,\n                        omit: !this.historicFilterChange\n                    });\n                    this.historicFilterChange = null;\n                    this.setState({\n                        filteredData,\n                        selectedItemIndex\n                    });\n                    if (this.state.sideTabId === (0, _interfaces.SideTabId).Data && this.state.dataScopeId === (0, _dataScope.DataScopeId).FilteredData) //make sure item is active\n                    requestAnimationFrame(()=>filteredData && this.silentActivation(filteredData[0]));\n                    viewerOptions && viewerOptions.onDataFilter && viewerOptions.onDataFilter(filter, filteredData);\n                },\n                onSelectionChanged: (newSearch, index, selectedData)=>{\n                    if (this.ignoreSelectionChange) return;\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    selectedItemIndex[(0, _dataScope.DataScopeId).SelectedData] = index || 0;\n                    let { search  } = this.state;\n                    const { sideTabId  } = this.state;\n                    if (newSearch) search = createInputSearch(newSearch);\n                    this.setState({\n                        search,\n                        selectedItemIndex,\n                        sideTabId\n                    });\n                    viewerOptions && viewerOptions.onSelectionChanged && viewerOptions.onSelectionChanged(newSearch, index, selectedData);\n                },\n                onAxisClick: (e, search)=>{\n                    this.toggleableSearch(e, search);\n                    viewerOptions && viewerOptions.onAxisClick && viewerOptions.onAxisClick(e, search);\n                },\n                onLegendHeaderClick: (e)=>{\n                    const pos = (0, _mouseEvent.getPosition)(e);\n                    const specRole = this.state.specCapabilities && this.state.specCapabilities.roles.filter((r)=>r.role === \"color\")[0];\n                    const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), {\n                        collapseLabel: true,\n                        container: this.div,\n                        selectedColumnName: this.state.columns[\"color\"],\n                        onDismiss: ()=>{\n                            this.setState({\n                                positionedColumnMapProps: null\n                            });\n                        },\n                        specRole,\n                        left: pos.left - this.div.clientLeft,\n                        top: pos.top - this.div.clientTop\n                    });\n                    this.setState({\n                        positionedColumnMapProps\n                    });\n                },\n                onLegendRowClick: (e, legendRow)=>{\n                    this.toggleableSearch(e, legendRow.search);\n                    viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onLegendRowClick(e, legendRow);\n                },\n                onError: (errors)=>{\n                    this.setState({\n                        errors\n                    });\n                    viewerOptions && viewerOptions.onError && viewerOptions.onError(errors);\n                },\n                onBeforeCreateLayers: (0, _clickableTextLayer.onBeforeCreateLayers),\n                getTextColor: (o)=>{\n                    if (o.specRole) return (0, _sanddanceReact.SandDance).VegaDeckGl.util.colorFromString(this.viewerOptions.colors.clickableText);\n                    else if (o.metaData && o.metaData.search) return (0, _sanddanceReact.SandDance).VegaDeckGl.util.colorFromString(this.viewerOptions.colors.searchText);\n                    else return o.color;\n                },\n                getTextHighlightAlphaCutoff: ()=>this.viewerOptions.colors.clickableTextHighlightAlphaCutoff,\n                getTextHighlightColor: (o)=>{\n                    if (o.specRole) return (0, _sanddanceReact.SandDance).VegaDeckGl.util.colorFromString(this.viewerOptions.colors.clickableTextHighlight);\n                    else if (o.metaData && o.metaData.search) return (0, _sanddanceReact.SandDance).VegaDeckGl.util.colorFromString(this.viewerOptions.colors.searchTextHighlight);\n                    else return [\n                        0,\n                        0,\n                        0,\n                        0\n                    ];\n                },\n                onTextClick: (e, text)=>{\n                    if (e && text) {\n                        const pos = (0, _mouseEvent.getPosition)(e);\n                        const { specRole  } = text;\n                        if (pos && specRole) {\n                            const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), {\n                                collapseLabel: true,\n                                container: this.div,\n                                selectedColumnName: this.state.columns[specRole.role],\n                                onDismiss: ()=>{\n                                    this.setState({\n                                        positionedColumnMapProps: null\n                                    });\n                                },\n                                specRole,\n                                left: pos.left - this.div.clientLeft,\n                                top: pos.top - this.div.clientTop\n                            });\n                            this.setState({\n                                positionedColumnMapProps\n                            });\n                        } else this.setState({\n                            positionedColumnMapProps: null\n                        });\n                    }\n                },\n                onNewViewStateTarget: ()=>this.newViewStateTarget\n            });\n            if (this.viewer && this.viewer.presenter) {\n                const newPresenterStyle = (0, _sanddanceReact.SandDance).util.getPresenterStyle(this.viewerOptions);\n                const mergePrenterStyle = Object.assign(Object.assign({}, this.viewer.presenter.style), newPresenterStyle);\n                this.viewer.presenter.style = mergePrenterStyle;\n                this.viewer.options = (0, _sanddanceReact.SandDance).VegaDeckGl.util.deepMerge(this.viewer.options, this.props.viewerOptions, this.viewerOptions);\n            }\n        }\n        signal(signalName, signalValue, newViewStateTarget) {\n            switch(signalName){\n                case (0, _sanddanceReact.SandDance).constants.SignalNames.ColorBinCount:\n                case (0, _sanddanceReact.SandDance).constants.SignalNames.ColorReverse:\n                case (0, _sanddanceReact.SandDance).constants.SignalNames.MarkOpacity:\n                    this.discardColorContextUpdates = false;\n                    break;\n            }\n            this.newViewStateTarget = newViewStateTarget;\n            this.viewer.vegaViewGl.signal(signalName, signalValue);\n            this.viewer.vegaViewGl.runAsync().then(()=>{\n                //deeply set the state without a state change. This prevents a redraw if re-rendered\n                if (this.state.signalValues) this.state.signalValues[signalName] = signalValue;\n                this.discardColorContextUpdates = true;\n                this.newViewStateTarget = undefined;\n                this.props.onSignalChanged && this.props.onSignalChanged(signalName, signalValue);\n            });\n        }\n        manageColorToolbar() {\n            const canRemap = this.viewer.colorContexts && this.viewer.colorContexts.length > 1;\n            (0, _colorMap.applyColorButtons)(this.viewer.presenter, !!this.state.columns.color, {\n                themePalette: (0, _themes.themePalettes)[this.props.theme || \"\"],\n                canRemap,\n                isRemap: canRemap && this.viewer.currentColorContext > 0,\n                colorMapHandler: (remap)=>{\n                    this.viewer.currentColorContext = ~~remap;\n                    this.viewer.renderSameLayout();\n                    this.manageColorToolbar();\n                }\n            });\n        }\n        getInsight() {\n            return this.viewer.getInsight();\n        }\n        setInsight(historyAction, newState = {}, partialInsight = this.viewer.getInsight(), rebaseFilter = false) {\n            const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n            selectedItemIndex[(0, _dataScope.DataScopeId).AllData] = 0;\n            selectedItemIndex[(0, _dataScope.DataScopeId).FilteredData] = 0;\n            selectedItemIndex[(0, _dataScope.DataScopeId).SelectedData] = 0;\n            const historicInsight = Object.assign({\n                chart: null,\n                scheme: null,\n                columns: null,\n                filter: null,\n                rebaseFilter\n            }, partialInsight);\n            const state = Object.assign({\n                filteredData: null,\n                selectedItemIndex,\n                search: createInputSearch(historicInsight.filter)\n            }, newState);\n            const changeInsight = ()=>{\n                this.getColorContext = null;\n                this.changeInsight(historicInsight, historyAction, state);\n            };\n            const currentFilter = this.viewer.getInsight().filter;\n            if (rebaseFilter && currentFilter && historicInsight.filter) {\n                if ((0, _sanddanceReact.SandDance).searchExpression.startsWith(historicInsight.filter, currentFilter)) changeInsight();\n                else this.viewer.reset().then(()=>new Promise((resolve, reject)=>{\n                        setTimeout(resolve, this.viewer.options.transitionDurations.scope);\n                    })).then(changeInsight);\n            } else changeInsight();\n        }\n        handleReviveSnapshot(snapshot, selectedSnapshotIndex) {\n            let handled = false;\n            if (this.props.onSnapshotClick) {\n                this.setState({\n                    selectedSnapshotIndex\n                });\n                handled = this.props.onSnapshotClick(snapshot, selectedSnapshotIndex);\n            }\n            if (!handled) this.reviveSnapshot(selectedSnapshotIndex);\n        }\n        reviveSnapshot(snapshotOrIndex) {\n            if (typeof snapshotOrIndex === \"number\") {\n                const selectedSnapshotIndex = snapshotOrIndex;\n                const snapshot = this.state.snapshots[selectedSnapshotIndex];\n                const newState = {\n                    note: snapshot.description,\n                    selectedSnapshotIndex\n                };\n                if (!this.state.sidebarClosed) {\n                    newState.sideTabId = (0, _interfaces.SideTabId).Snapshots;\n                    this.scrollSnapshotIntoView(selectedSnapshotIndex);\n                }\n                this.setInsight({\n                    label: (0, _language.strings).labelHistoryReviveSnapshot\n                }, newState, snapshot.insight, true);\n            } else {\n                const snapshot = snapshotOrIndex;\n                if (snapshot.insight) this.setInsight({\n                    label: (0, _language.strings).labelHistoryReviveSnapshot\n                }, {\n                    note: snapshot.description,\n                    selectedSnapshotIndex: -1\n                }, snapshot.insight, true); //don't navigate to sideTab\n                else this.setState({\n                    note: snapshot.description,\n                    selectedSnapshotIndex: -1\n                });\n            }\n        }\n        load(data, getPartialInsight, optionsOrPrefs) {\n            this.setState({\n                historyIndex: -1,\n                historyItems: []\n            });\n            this.changeInsight({\n                columns: null\n            }, {\n                label: null,\n                omit: true\n            }, {\n                note: null\n            });\n            return new Promise((resolve, reject)=>{\n                const loadFinal = (dataContent)=>{\n                    let partialInsight;\n                    this.prefs = optionsOrPrefs && optionsOrPrefs.chartPrefs || optionsOrPrefs || {};\n                    if (getPartialInsight) {\n                        partialInsight = getPartialInsight(dataContent.columns);\n                        (0, _partialInsight.initPrefs)(this.prefs, partialInsight);\n                    }\n                    if (!partialInsight) {\n                        //load recommendation\n                        let r = new (0, _chartRecommender.RecommenderSummary)(dataContent.columns, dataContent.data);\n                        partialInsight = r.recommend();\n                    }\n                    partialInsight = Object.assign({\n                        facetStyle: \"wrap\",\n                        filter: null,\n                        totalStyle: null,\n                        transform: null\n                    }, partialInsight);\n                    if (partialInsight.chart === \"barchart\") partialInsight.chart = \"barchartV\";\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    const sideTabId = (0, _interfaces.SideTabId).ChartType;\n                    selectedItemIndex[(0, _dataScope.DataScopeId).AllData] = 0;\n                    selectedItemIndex[(0, _dataScope.DataScopeId).FilteredData] = 0;\n                    selectedItemIndex[(0, _dataScope.DataScopeId).SelectedData] = 0;\n                    let newState = Object.assign({\n                        dataFile,\n                        dataContent,\n                        snapshots: dataContent.snapshots || this.state.snapshots,\n                        autoCompleteDistinctValues: {},\n                        filteredData: null,\n                        tooltipExclusions: optionsOrPrefs && optionsOrPrefs.tooltipExclusions || [],\n                        selectedItemIndex,\n                        sideTabId\n                    }, partialInsight);\n                    this.getColorContext = null;\n                    (0, _columns.ensureColumnsExist)(newState.columns, dataContent.columns, newState.transform);\n                    const errors = (0, _columns.ensureColumnsPopulated)(partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.chart, partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.totalStyle, newState.columns, dataContent.columns);\n                    newState.errors = errors;\n                    //change insight\n                    this.changeInsight(partialInsight, {\n                        label: (0, _language.strings).labelHistoryInit,\n                        insert: true\n                    }, newState);\n                    //make sure item is active\n                    this.activateDataBrowserItem(sideTabId, this.state.dataScopeId);\n                    resolve();\n                };\n                let dataFile;\n                if (Array.isArray(data)) return (0, _dataLoader.loadDataArray)(data, \"json\").then((result)=>{\n                    dataFile = {\n                        type: \"json\"\n                    };\n                    loadFinal(result);\n                }).catch(reject);\n                else {\n                    dataFile = data;\n                    return (0, _dataLoader.loadDataFile)(dataFile).then(loadFinal).catch(reject);\n                }\n            });\n        }\n        changeChartType(chart) {\n            const partialInsight = (0, _partialInsight.copyPrefToNewState)(this.prefs, chart, \"*\", \"*\");\n            const insight = Object.assign({\n                chart\n            }, partialInsight);\n            const columns = (0, _sanddanceReact.SandDance).VegaDeckGl.util.deepMerge({}, partialInsight.columns, this.state.columns);\n            const { signalValues  } = this.viewer.getInsight();\n            insight.signalValues = Object.assign(Object.assign({}, this.state.signalValues), signalValues);\n            insight.columns = Object.assign({}, columns);\n            insight.totalStyle = this.state.totalStyle;\n            let errors;\n            //special case mappings when switching chart type\n            if (this.state.chart === \"scatterplot\" && (chart === \"barchart\" || chart === \"barchartV\")) insight.columns = Object.assign(Object.assign({}, columns), {\n                sort: columns.y\n            });\n            else if (this.state.chart === \"scatterplot\" && chart === \"barchartH\") insight.columns = Object.assign(Object.assign({}, columns), {\n                sort: columns.x\n            });\n            else if (chart === \"treemap\") {\n                insight.view = \"2d\";\n                if (!columns.size) {\n                    //make sure size exists and is numeric\n                    let sizeColumn;\n                    //first check prefs\n                    if (partialInsight && partialInsight.columns && partialInsight.columns.size) {\n                        const prefSizeColumn = this.state.dataContent.columns.filter((c)=>c.name === partialInsight.columns.size)[0];\n                        if (prefSizeColumn && prefSizeColumn.quantitative) sizeColumn = prefSizeColumn;\n                    }\n                    if (!sizeColumn) sizeColumn = (0, _columns.getTreemapColumn)(this.state.dataContent.columns);\n                    if (!sizeColumn) //error - no numeric columns\n                    errors = [\n                        (0, _language.strings).errorColumnMustBeNumeric\n                    ];\n                    else insight.columns = Object.assign(Object.assign({}, columns), {\n                        size: sizeColumn.name\n                    });\n                }\n            } else if (chart === \"stacks\") insight.view = \"3d\";\n            (0, _columns.ensureColumnsExist)(insight.columns, this.state.dataContent.columns, this.state.transform);\n            errors = (0, _columns.ensureColumnsPopulated)(chart, insight.totalStyle, insight.columns, this.state.dataContent.columns);\n            this.calculate(()=>{\n                this.changeInsight(insight, {\n                    label: (0, _language.strings).labelHistoryChangeChartType((0, _chart.chartLabel)(chart))\n                }, errors ? {\n                    errors\n                } : null);\n            });\n        }\n        calculate(calculating) {\n            this.setState({\n                calculating\n            });\n        }\n        changeView(view) {\n            this.changeInsight({\n                view\n            }, {\n                label: view === \"2d\" ? (0, _language.strings).labelViewType2d : (0, _language.strings).labelViewType3d\n            });\n        }\n        //state members which change the insight\n        changeInsight(partialInsight, historyAction, additionalUIState) {\n            if (partialInsight.chart === \"barchart\") partialInsight.chart = \"barchartV\";\n            this.addHistory(partialInsight, historyAction, additionalUIState);\n        }\n        addHistory(historicInsight, historyAction, additionalUIState) {\n            const setCleanState = (newState)=>{\n                const cleanState = Object.assign(Object.assign({}, newState), additionalUIState);\n                if (!cleanState.note) cleanState.note = null;\n                delete cleanState.rebaseFilter;\n                if (this.viewer) {\n                    const { signalValues  } = this.viewer.getInsight();\n                    cleanState.signalValues = Object.assign(Object.assign(Object.assign({}, this.state.signalValues), signalValues), cleanState.signalValues);\n                }\n                this.setState(cleanState);\n            };\n            if (historyAction.omit) {\n                setCleanState(historicInsight);\n                return;\n            }\n            const historyItems = this.state.historyItems.slice(0, this.state.historyIndex + 1);\n            const historyIndex = historyItems.length;\n            historyItems.push({\n                label: historyAction.label,\n                historicInsight\n            });\n            if (historyAction.insert) setCleanState({\n                historyIndex,\n                historyItems\n            });\n            else setCleanState(Object.assign(Object.assign({}, historicInsight), {\n                historyIndex,\n                historyItems\n            }));\n        }\n        replay(index) {\n            let filter = null;\n            let historicInsight = {};\n            for(let i = 0; i < index + 1; i++){\n                const historyItem = this.state.historyItems[i];\n                if (historyItem) {\n                    if (historyItem.historicInsight.filter === null) filter = null;\n                    else if (historyItem.historicInsight.rebaseFilter) filter = historyItem.historicInsight.filter;\n                    else if (historyItem.historicInsight.filter) filter = (0, _sanddanceReact.SandDance).searchExpression.narrow(filter, historyItem.historicInsight.filter);\n                    historicInsight = Object.assign(Object.assign({}, historicInsight), historyItem.historicInsight);\n                }\n            }\n            return Object.assign(Object.assign({}, historicInsight), {\n                filter\n            });\n        }\n        undo() {\n            const historyIndex = this.state.historyIndex - 1;\n            if (historyIndex < 0) return;\n            const newState = this.replay(historyIndex);\n            this.rebaseFilter = true;\n            this.setState(Object.assign(Object.assign({}, newState), {\n                historyIndex\n            }));\n        }\n        redo(historyIndex = this.state.historyIndex + 1) {\n            if (historyIndex >= this.state.historyItems.length) return;\n            const newState = this.replay(historyIndex);\n            this.rebaseFilter = true;\n            this.setState(Object.assign(Object.assign({}, newState), {\n                historyIndex\n            }));\n        }\n        changespecCapabilities(specCapabilities) {\n            this.setState({\n                specCapabilities\n            });\n        }\n        changeColumnMapping(role, column, options) {\n            const columns = Object.assign({}, this.state.columns);\n            const label = column ? (0, _language.strings).labelHistoryMapColumn(role) : (0, _language.strings).labelHistoryUnMapColumn(role);\n            const final = ()=>{\n                const partialInsight = {\n                    columns,\n                    totalStyle: options ? options.totalStyle : this.state.totalStyle\n                };\n                const errors = (0, _columns.ensureColumnsPopulated)(this.state.chart, partialInsight.totalStyle, partialInsight.columns, this.state.dataContent.columns);\n                columns[role] = column && column.name;\n                this.changeInsight(partialInsight, {\n                    label\n                }, errors ? {\n                    errors\n                } : null);\n            };\n            const _changeInsight = (newInsight, columnUpdate, historyAction)=>{\n                newInsight.columns = (0, _sanddanceReact.SandDance).VegaDeckGl.util.deepMerge({}, columns, columnUpdate);\n                (0, _partialInsight.savePref)(this.prefs, this.state.chart, \"*\", \"*\", {\n                    columns: columnUpdate\n                });\n                this.changeInsight(newInsight, historyAction);\n            };\n            if (column) {\n                let columnUpdate;\n                switch(role){\n                    case \"facet\":\n                        {\n                            (0, _partialInsight.copyPrefToNewState)(this.prefs, this.state.chart, \"facet\", column.name);\n                            const historicInsight = {\n                                columns,\n                                facetStyle: options ? options.facetStyle : this.state.facetStyle\n                            };\n                            columnUpdate = {\n                                facet: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label\n                            });\n                            break;\n                        }\n                    case \"color\":\n                        {\n                            let calculating = null;\n                            let historicInsight = {\n                                scheme: options && options.scheme,\n                                columns,\n                                colorBin: this.state.colorBin\n                            };\n                            if (!historicInsight.scheme) (0, _partialInsight.copyPrefToNewState)(this.prefs, this.state.chart, \"color\", column.name);\n                            if (!historicInsight.scheme) historicInsight.scheme = (0, _colorScheme.bestColorScheme)(column, null, this.state.scheme);\n                            if (!column.stats.hasColorData) {\n                                historicInsight.directColor = false;\n                                if (this.state.directColor !== historicInsight.directColor) calculating = ()=>this._resize();\n                            }\n                            if (this.state.columns && this.state.columns.color && this.state.columns.color !== column.name) {\n                                const currColorColumn = this.state.dataContent.columns.filter((c)=>c.name === this.state.columns.color)[0];\n                                if (column.isColorData != currColorColumn.isColorData) calculating = ()=>this._resize();\n                            }\n                            this.ignoreSelectionChange = true;\n                            this.viewer.deselect().then(()=>{\n                                this.ignoreSelectionChange = false;\n                                //allow deselection to render\n                                requestAnimationFrame(()=>{\n                                    columnUpdate = {\n                                        color: column.name\n                                    };\n                                    this.getColorContext = null;\n                                    this.setState({\n                                        calculating\n                                    });\n                                    _changeInsight(historicInsight, columnUpdate, {\n                                        label\n                                    });\n                                });\n                            });\n                            break;\n                        }\n                    case \"x\":\n                        {\n                            (0, _partialInsight.copyPrefToNewState)(this.prefs, this.state.chart, \"x\", column.name);\n                            const historicInsight = {\n                                columns\n                            };\n                            columnUpdate = {\n                                x: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label\n                            });\n                            break;\n                        }\n                    case \"size\":\n                        {\n                            (0, _partialInsight.copyPrefToNewState)(this.prefs, this.state.chart, \"size\", column.name);\n                            const historicInsight = {\n                                totalStyle: options ? options.totalStyle : this.state.totalStyle\n                            };\n                            columnUpdate = {\n                                size: column.name\n                            };\n                            _changeInsight(historicInsight, columnUpdate, {\n                                label\n                            });\n                            break;\n                        }\n                    default:\n                        final();\n                        break;\n                }\n            } else switch(role){\n                case \"facet\":\n                    columns.facet = null;\n                    columns.facetV = null;\n                    this.changeInsight({\n                        columns,\n                        facetStyle: \"wrap\"\n                    }, {\n                        label\n                    });\n                    break;\n                default:\n                    final();\n                    break;\n            }\n        }\n        setSideTabId(sideTabId, dataScopeId) {\n            if (sideTabId === (0, _interfaces.SideTabId).Data && dataScopeId == null) //choose most relevant DataScopeId\n            dataScopeId = this.getBestDataScopeId();\n            if (dataScopeId == null) dataScopeId = this.state.dataScopeId;\n            const calculating = ()=>{\n                this.dialogFocusHandler.focus && this.dialogFocusHandler.focus();\n            };\n            this.setState({\n                sideTabId,\n                dataScopeId,\n                sidebarClosed: false,\n                calculating\n            });\n            this.activateDataBrowserItem(sideTabId, dataScopeId);\n        }\n        getBestDataScopeId() {\n            let dataScopeId;\n            const selectionState = this.viewer && this.viewer.getSelection();\n            if (selectionState && selectionState.selectedData && selectionState.selectedData.length) dataScopeId = (0, _dataScope.DataScopeId).SelectedData;\n            else if (this.state.filteredData) dataScopeId = (0, _dataScope.DataScopeId).FilteredData;\n            else dataScopeId = (0, _dataScope.DataScopeId).AllData;\n            return dataScopeId;\n        }\n        activateDataBrowserItem(sideTabId, dataScopeId) {\n            if (!this.viewer) return;\n            let itemToActivate;\n            if (sideTabId === (0, _interfaces.SideTabId).Data) switch(dataScopeId){\n                case (0, _dataScope.DataScopeId).AllData:\n                    itemToActivate = this.state.dataContent && this.state.dataContent.data[this.state.selectedItemIndex[(0, _dataScope.DataScopeId).AllData]];\n                    break;\n                case (0, _dataScope.DataScopeId).FilteredData:\n                    itemToActivate = this.state.filteredData && this.state.filteredData[this.state.selectedItemIndex[(0, _dataScope.DataScopeId).FilteredData]];\n                    break;\n                case (0, _dataScope.DataScopeId).SelectedData:\n                    {\n                        const selection = this.viewer.getSelection() || {};\n                        itemToActivate = selection.selectedData && selection.selectedData[this.state.selectedItemIndex[(0, _dataScope.DataScopeId).SelectedData]];\n                        break;\n                    }\n            }\n            this.silentActivation(itemToActivate);\n        }\n        silentActivation(itemToActivate) {\n            this.ignoreSelectionChange = true;\n            const done = ()=>{\n                this.ignoreSelectionChange = false;\n            };\n            if (itemToActivate) return this.viewer.activate(itemToActivate).then(done);\n            else return this.viewer.deActivate().then(done);\n        }\n        sidebar(sidebarClosed, sidebarPinned) {\n            this.setState({\n                sidebarClosed,\n                sidebarPinned\n            });\n        }\n        resize() {\n            this.setState({\n                calculating: ()=>this._resize()\n            });\n        }\n        _resize() {\n            this.changeInsight({\n                size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed)\n            }, {\n                label: \"resize\",\n                omit: true\n            });\n        }\n        viewerMounted(glDiv) {\n            this.setState({\n                size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed),\n                signalValues: this.state.signalValues //keep initialized signalValues\n            });\n        }\n        getLayoutDivSize(pinned, closed) {\n            const div = pinned && !closed ? this.layoutDivPinned : this.layoutDivUnpinned;\n            return {\n                height: div.offsetHeight,\n                width: div.offsetWidth\n            };\n        }\n        toggleableSearch(e, search) {\n            if (e.ctrlKey) {\n                this.setState({\n                    search: createInputSearch(search)\n                });\n                this.setSideTabId((0, _interfaces.SideTabId).Search);\n            } else {\n                var oldSelection = this.viewer.getSelection();\n                if (oldSelection.search) {\n                    //look for matching groups and toggle them\n                    const result = (0, _toggleSearch.toggleSearch)((0, _sanddanceReact.SandDance).searchExpression.ensureSearchExpressionGroupArray(oldSelection.search), search);\n                    if (result.found) {\n                        //removing a group\n                        if (result.groups.length === 0) this.doDeselect();\n                        else //select with new search removed\n                        this.doSelect(result.groups);\n                    } else //adding a new group\n                    if (e.altKey || e.shiftKey) {\n                        let group = true;\n                        if (e.altKey) search.clause = \"&&\";\n                        else if (e.shiftKey) {\n                            if (this.props.searchORDisabled) group = false;\n                            else search.clause = \"||\";\n                        }\n                        if (group) {\n                            result.groups.push(search);\n                            this.doSelect(result.groups);\n                        } else this.doSelect(search);\n                    } else //replace\n                    this.doSelect(search);\n                } else this.doSelect(search);\n            }\n        }\n        doFilter(search, historicFilterChange) {\n            this.historicFilterChange = historicFilterChange;\n            this.viewer.filter(search);\n        }\n        doUnfilter(historicFilterChange) {\n            this.historicFilterChange = historicFilterChange;\n            this.viewer.reset();\n        }\n        doSelect(search) {\n            this.viewer.select(search);\n        }\n        doDeselect() {\n            return this.viewer.deselect();\n        }\n        writeSnapshot(snapshot, editIndex) {\n            let { selectedSnapshotIndex  } = this.state;\n            let snapshots;\n            if (editIndex >= 0) {\n                snapshots = [\n                    ...this.state.snapshots\n                ];\n                snapshots[editIndex] = snapshot;\n                this.setState({\n                    snapshots,\n                    selectedSnapshotIndex\n                });\n            } else {\n                const note = snapshot.description;\n                snapshots = this.state.snapshots.concat(snapshot);\n                selectedSnapshotIndex = snapshots.length - 1;\n                this.scrollSnapshotIntoView(selectedSnapshotIndex);\n                this.setState({\n                    sideTabId: (0, _interfaces.SideTabId).Snapshots,\n                    snapshots,\n                    selectedSnapshotIndex,\n                    note\n                });\n            }\n            this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n        }\n        scrollSnapshotIntoView(selectedSnapshotIndex) {\n            clearTimeout(this.scrollSnapshotTimer);\n            if (this.state.sidebarClosed) return;\n            this.scrollSnapshotTimer = setTimeout(()=>{\n                const selectedSnapshotElement = this.div.querySelector(`.snapshot:nth-child(${selectedSnapshotIndex + 1})`);\n                if (selectedSnapshotElement) selectedSnapshotElement.scrollIntoView({\n                    behavior: \"smooth\",\n                    block: \"nearest\"\n                });\n            }, 500);\n        }\n        componentDidMount() {\n            if (this.props.mounted) this.props.mounted(this);\n        }\n        render() {\n            const { colorBin: colorBin1 , columns , directColor: directColor1 , facetStyle , filter , hideAxes: hideAxes1 , hideLegend: hideLegend1 , scheme: scheme1 , signalValues: signalValues1 , size , totalStyle , transform , chart: chart1 , view: view1  } = this.state;\n            const insight = {\n                colorBin: colorBin1,\n                columns,\n                directColor: directColor1,\n                facetStyle,\n                filter,\n                hideAxes: hideAxes1,\n                hideLegend: hideLegend1,\n                scheme: scheme1,\n                signalValues: signalValues1,\n                size,\n                totalStyle,\n                transform,\n                chart: chart1,\n                view: view1\n            };\n            const loaded = !!(this.state.columns && this.state.dataContent);\n            const selectionState = this.viewer && this.viewer.getSelection() || {};\n            const selectionSearch = selectionState && selectionState.search;\n            const columnMapProps = this.getColumnMapBaseProps();\n            const datas = {};\n            datas[(0, _dataScope.DataScopeId).AllData] = this.state.dataContent && this.state.dataContent.data;\n            datas[(0, _dataScope.DataScopeId).FilteredData] = this.state.filteredData;\n            datas[(0, _dataScope.DataScopeId).SelectedData] = selectionState && selectionState.selectedData;\n            if (this.state.calculating) requestAnimationFrame(()=>{\n                //allow render to complete\n                if (this.state.calculating) {\n                    this.state.calculating();\n                    this.setState({\n                        calculating: null\n                    });\n                }\n            });\n            const theme = this.props.theme || \"\";\n            const themePalette = (0, _themes.themePalettes)[theme];\n            return (0, _base.base).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div) this.div = div;\n                },\n                className: (0, _sanddanceReact.util).classList(\"sanddance-explorer\", this.props.theme)\n            }, (0, _base.base).react.createElement((0, _topbar.Topbar), {\n                collapseLabels: this.props.compactUI,\n                historyIndex: this.state.historyIndex,\n                historyItems: this.state.historyItems,\n                undo: ()=>this.undo(),\n                redo: ()=>this.redo(),\n                logoClickUrl: this.props.logoClickUrl,\n                logoClickTarget: this.props.logoClickTarget,\n                themePalette: themePalette,\n                loaded: loaded,\n                doDeselect: this.doDeselect.bind(this),\n                doFilter: this.doFilter.bind(this),\n                doUnfilter: this.doUnfilter.bind(this),\n                filter: this.state.filter,\n                selectionSearch: selectionSearch,\n                selectionState: selectionState,\n                buttons: this.props.topBarButtonProps,\n                view: this.state.view,\n                snapshots: this.state.snapshots,\n                onSnapshotPreviousClick: ()=>{\n                    let selectedSnapshotIndex;\n                    if (this.state.selectedSnapshotIndex === -1) selectedSnapshotIndex = this.state.snapshots.length - 1;\n                    else {\n                        selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n                        selectedSnapshotIndex--;\n                        if (selectedSnapshotIndex < 0) selectedSnapshotIndex = this.state.snapshots.length - 1;\n                    }\n                    this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n                },\n                onSnapshotClick: ()=>this.snapshotEditor.editSnapshot(),\n                onSnapshotNextClick: ()=>{\n                    let selectedSnapshotIndex;\n                    if (this.state.selectedSnapshotIndex === -1) selectedSnapshotIndex = 0;\n                    else {\n                        selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n                        selectedSnapshotIndex++;\n                        if (selectedSnapshotIndex > this.state.snapshots.length - 1) selectedSnapshotIndex = 0;\n                    }\n                    this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n                },\n                onViewClick: ()=>{\n                    const view = this.state.view === \"2d\" ? \"3d\" : \"2d\";\n                    this.changeInsight({\n                        view\n                    }, {\n                        label: view === \"2d\" ? (0, _language.strings).labelViewType2d : (0, _language.strings).labelViewType3d\n                    });\n                },\n                onHomeClick: ()=>this.viewer.presenter.homeCamera()\n            }), (0, _base.base).react.createElement(\"div\", {\n                className: (0, _sanddanceReact.util).classList(\"sanddance-main\", this.state.sidebarPinned && \"pinned\", this.state.sidebarClosed && \"closed\", (insight.hideLegend || insight.directColor || !colorMapping(insight, this.state.dataContent && this.state.dataContent.columns)) && \"hide-legend\")\n            }, (0, _base.base).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div && !this.layoutDivUnpinned) this.layoutDivUnpinned = div;\n                },\n                className: \"sanddance-layout-unpinned\"\n            }), (0, _base.base).react.createElement(\"div\", {\n                ref: (div)=>{\n                    if (div && !this.layoutDivPinned) this.layoutDivPinned = div;\n                },\n                className: \"sanddance-layout-pinned\"\n            }), !loaded && (0, _base.base).react.createElement(\"div\", {\n                className: \"loading\"\n            }, (0, _base.base).react.createElement((0, _base.base).fluentUI.Spinner, {\n                size: (0, _base.base).fluentUI.SpinnerSize.large,\n                label: (0, _language.strings).loading\n            })), (0, _base.base).react.createElement((0, _sidebar.Sidebar), {\n                themePalette: themePalette,\n                calculating: !!this.state.calculating,\n                closed: this.state.sidebarClosed,\n                hideSidebarControls: this.props.hideSidebarControls,\n                pinned: this.state.sidebarPinned,\n                disabled: !loaded,\n                dataScopeProps: {\n                    themePalette,\n                    compact: this.state.sidebarClosed,\n                    onCompactClick: ()=>{\n                        this.changeInsight({\n                            size: this.getLayoutDivSize(this.state.sidebarPinned, false)\n                        }, {\n                            label: null,\n                            omit: true\n                        }, {\n                            sidebarClosed: false\n                        });\n                    },\n                    dataSet: this.props.datasetElement,\n                    dataCount: loaded && {\n                        all: this.state.dataContent && this.state.dataContent.data.length,\n                        filtered: this.state.filteredData && this.state.filteredData.length,\n                        selected: selectionState && selectionState.selectedData && selectionState.selectedData.length\n                    },\n                    active: this.state.sideTabId === (0, _interfaces.SideTabId).Data,\n                    onDataScopeClick: (dataScopeId)=>this.setSideTabId((0, _interfaces.SideTabId).Data, dataScopeId),\n                    selectedDataScope: this.state.dataScopeId,\n                    disabled: !loaded\n                },\n                onSideTabClick: (sideTabId)=>{\n                    //collapse or toggle\n                    if (sideTabId === (0, _interfaces.SideTabId).Collapse || this.state.sideTabId === sideTabId) {\n                        let { dataScopeId , sidebarClosed  } = this.state;\n                        if (sidebarClosed && sideTabId === (0, _interfaces.SideTabId).Data) dataScopeId = this.getBestDataScopeId();\n                        sidebarClosed = !this.state.sidebarClosed;\n                        this.changeInsight({\n                            size: this.getLayoutDivSize(this.state.sidebarPinned, sidebarClosed)\n                        }, {\n                            label: null,\n                            omit: true\n                        }, {\n                            dataScopeId,\n                            sidebarClosed\n                        });\n                    } else if (sideTabId === (0, _interfaces.SideTabId).Pin) this.changeInsight({\n                        size: this.getLayoutDivSize(!this.state.sidebarPinned, this.state.sidebarClosed)\n                    }, {\n                        label: null,\n                        omit: true\n                    }, {\n                        sidebarPinned: !this.state.sidebarPinned\n                    });\n                    else this.setSideTabId(sideTabId);\n                },\n                selectedSideTab: this.state.sideTabId\n            }, loaded && (()=>{\n                switch(this.state.sideTabId){\n                    case (0, _interfaces.SideTabId).ChartType:\n                        return (0, _base.base).react.createElement((0, _chart.Chart), Object.assign({\n                            collapseLabels: this.props.compactUI,\n                            tooltipExclusions: this.state.tooltipExclusions,\n                            toggleTooltipExclusion: (columnName)=>{\n                                const tooltipExclusions = [\n                                    ...this.state.tooltipExclusions\n                                ];\n                                const i = tooltipExclusions.indexOf(columnName);\n                                if (i < 0) tooltipExclusions.push(columnName);\n                                else tooltipExclusions.splice(i, 1);\n                                this.setState({\n                                    tooltipExclusions\n                                });\n                                this.props.onTooltipExclusionsChanged && this.props.onTooltipExclusionsChanged(tooltipExclusions);\n                            },\n                            disabled: !loaded || this.state.sidebarClosed\n                        }, columnMapProps, {\n                            chart: this.state.chart,\n                            view: this.state.view,\n                            onChangeChartType: (chart)=>this.changeChartType(chart),\n                            insightColumns: this.state.columns,\n                            onChangeSignal: (role, column, name, value)=>(0, _partialInsight.saveSignalValuePref)(this.prefs, this.state.chart, role, column, name, value)\n                        }));\n                    case (0, _interfaces.SideTabId).Color:\n                        return (0, _base.base).react.createElement((0, _color.Color), Object.assign({\n                            compactUI: this.props.compactUI,\n                            specCapabilities: this.state.specCapabilities,\n                            disabled: !loaded || this.state.sidebarClosed\n                        }, columnMapProps, {\n                            dataContent: this.state.dataContent,\n                            scheme: this.state.scheme,\n                            colorBin: this.state.colorBin,\n                            colorBinSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s)=>s.name === (0, _sanddanceReact.SandDance).constants.SignalNames.ColorBinCount)[0],\n                            colorReverseSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s)=>s.name === (0, _sanddanceReact.SandDance).constants.SignalNames.ColorReverse)[0],\n                            colorColumn: this.state.columns.color,\n                            onColorBinChange: (colorBin)=>{\n                                this.ignoreSelectionChange = true;\n                                this.viewer.deselect().then(()=>{\n                                    this.ignoreSelectionChange = false;\n                                    //allow deselection to render\n                                    requestAnimationFrame(()=>{\n                                        this.getColorContext = null;\n                                        this.changeInsight({\n                                            colorBin\n                                        }, {\n                                            label: (0, _language.strings).labelHistoryColorBin\n                                        });\n                                        (0, _partialInsight.savePref)(this.prefs, this.state.chart, \"color\", this.state.columns.color, {\n                                            colorBin\n                                        });\n                                    });\n                                });\n                            },\n                            onColorSchemeChange: (scheme)=>{\n                                this.changeColumnMapping(\"color\", this.state.dataContent.columns.filter((c)=>c.name === this.state.columns.color)[0], {\n                                    scheme\n                                });\n                                (0, _partialInsight.savePref)(this.prefs, this.state.chart, \"color\", this.state.columns.color, {\n                                    scheme\n                                });\n                            },\n                            onColorBinCountChange: (value)=>{\n                                const signalValues = {};\n                                signalValues[(0, _sanddanceReact.SandDance).constants.SignalNames.ColorBinCount] = value;\n                                (0, _partialInsight.savePref)(this.prefs, this.state.chart, \"color\", this.state.columns.color, {\n                                    signalValues\n                                });\n                            },\n                            onColorReverseChange: (value)=>{\n                                this.getColorContext = null;\n                            },\n                            directColor: this.state.directColor,\n                            onDirectColorChange: (directColor)=>{\n                                this.changeInsight({\n                                    directColor\n                                }, {\n                                    label: (0, _language.strings).labelHistoryDirectColor\n                                }, {\n                                    calculating: ()=>this._resize()\n                                });\n                            }\n                        }));\n                    case (0, _interfaces.SideTabId).Data:\n                        {\n                            const data = datas[this.state.dataScopeId];\n                            let itemVisible = true;\n                            switch(this.state.dataScopeId){\n                                case (0, _dataScope.DataScopeId).AllData:\n                                    {\n                                        const item = this.state.selectedItemIndex[this.state.dataScopeId];\n                                        itemVisible = this.state.dataContent && !this.state.filteredData || this.state.filteredData.indexOf(data[item]) >= 0;\n                                    }\n                            }\n                            return (0, _base.base).react.createElement((0, _dataBrowser.DataBrowser), {\n                                explorer: this,\n                                theme: this.props.theme,\n                                themePalette: themePalette,\n                                disabled: !loaded || this.state.sidebarClosed,\n                                columns: this.state.dataContent && this.state.dataContent.columns,\n                                data: data,\n                                displayName: this.state.dataFile && this.state.dataFile.displayName || (0, _language.strings).defaultFileName,\n                                nullMessage: dataBrowserNullMessages[this.state.dataScopeId],\n                                zeroMessage: dataBrowserZeroMessages[this.state.dataScopeId],\n                                index: this.state.selectedItemIndex[this.state.dataScopeId],\n                                itemVisible: itemVisible,\n                                dataExportHandler: this.props.dataExportHandler,\n                                selectedDataScope: this.state.dataScopeId,\n                                onDataScopeClick: (dataScopeId)=>this.setSideTabId((0, _interfaces.SideTabId).Data, dataScopeId),\n                                onActivate: (row, index)=>{\n                                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                                    selectedItemIndex[this.state.dataScopeId] = index;\n                                    this.setState({\n                                        selectedItemIndex\n                                    });\n                                    this.silentActivation(row);\n                                },\n                                onSearch: (e, search)=>{\n                                    if (e.ctrlKey) this.setState({\n                                        sideTabId: (0, _interfaces.SideTabId).Search,\n                                        search\n                                    });\n                                    else this.doSelect(search);\n                                },\n                                bingSearchDisabled: this.props.bingSearchDisabled\n                            });\n                        }\n                    case (0, _interfaces.SideTabId).Search:\n                        return (0, _base.base).react.createElement((0, _search.Search), {\n                            explorer: this,\n                            collapseLabels: this.props.compactUI,\n                            themePalette: themePalette,\n                            disabled: !loaded || this.state.sidebarClosed,\n                            disableGroupOR: this.props.searchORDisabled,\n                            disableExpressionOR: this.props.searchORDisabled,\n                            initializer: {\n                                columns: columnMapProps.allColumns,\n                                search: this.state.search\n                            },\n                            autoCompleteDistinctValues: this.state.autoCompleteDistinctValues,\n                            onSelect: (expr)=>this.doSelect(expr),\n                            data: this.state.dataContent.data\n                        });\n                    case (0, _interfaces.SideTabId).Snapshots:\n                        return (0, _base.base).react.createElement((0, _snapshots.Snapshots), Object.assign({}, this.props.snapshotProps, {\n                            editor: this.snapshotEditor,\n                            themePalette: themePalette,\n                            explorer: this,\n                            snapshots: this.state.snapshots,\n                            selectedSnapshotIndex: this.state.selectedSnapshotIndex,\n                            onClearSnapshots: ()=>{\n                                const snapshots = [];\n                                this.setState({\n                                    snapshots,\n                                    selectedSnapshotIndex: -1\n                                });\n                                this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                            },\n                            onWriteSnapshot: (s, i)=>this.writeSnapshot(s, i),\n                            onRemoveSnapshot: (i)=>{\n                                const snapshots = [\n                                    ...this.state.snapshots\n                                ];\n                                snapshots.splice(i, 1);\n                                let { selectedSnapshotIndex  } = this.state;\n                                if (i === selectedSnapshotIndex) selectedSnapshotIndex = -1;\n                                else if (selectedSnapshotIndex > i) selectedSnapshotIndex--;\n                                this.setState({\n                                    snapshots,\n                                    selectedSnapshotIndex\n                                });\n                                this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                            },\n                            onSnapshotClick: (snapshot, selectedSnapshotIndex)=>{\n                                this.setState({\n                                    selectedSnapshotIndex\n                                });\n                                this.calculate(()=>{\n                                    this.handleReviveSnapshot(snapshot, selectedSnapshotIndex);\n                                });\n                            },\n                            onMoveUp: (i)=>{\n                                if (i > 0) {\n                                    const snapshots = [\n                                        ...this.state.snapshots\n                                    ];\n                                    const temp = snapshots[i - 1];\n                                    snapshots[i - 1] = snapshots[i];\n                                    snapshots[i] = temp;\n                                    let { selectedSnapshotIndex  } = this.state;\n                                    if (i === selectedSnapshotIndex) selectedSnapshotIndex = i - 1;\n                                    else if (i - 1 === selectedSnapshotIndex) selectedSnapshotIndex = i;\n                                    this.setState({\n                                        snapshots,\n                                        selectedSnapshotIndex\n                                    });\n                                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                }\n                            },\n                            onMoveDown: (i)=>{\n                                if (i < this.state.snapshots.length - 1) {\n                                    const snapshots = [\n                                        ...this.state.snapshots\n                                    ];\n                                    const temp = snapshots[i + 1];\n                                    snapshots[i + 1] = snapshots[i];\n                                    snapshots[i] = temp;\n                                    let { selectedSnapshotIndex  } = this.state;\n                                    if (i === selectedSnapshotIndex) selectedSnapshotIndex = i + 1;\n                                    else if (i + 1 === selectedSnapshotIndex) selectedSnapshotIndex = i;\n                                    this.setState({\n                                        snapshots,\n                                        selectedSnapshotIndex\n                                    });\n                                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                }\n                            }\n                        }));\n                    case (0, _interfaces.SideTabId).History:\n                        return (0, _base.base).react.createElement((0, _history.History), {\n                            explorer: this,\n                            theme: theme,\n                            themePalette: themePalette,\n                            historyIndex: this.state.historyIndex,\n                            historyItems: this.state.historyItems,\n                            redo: (i)=>this.redo(i)\n                        });\n                    case (0, _interfaces.SideTabId).Settings:\n                        return (0, _base.base).react.createElement((0, _settings.Settings), {\n                            explorer: this,\n                            dataFile: this.state.dataFile,\n                            scheme: this.state.scheme,\n                            hideLegend: this.state.hideLegend,\n                            onToggleLegend: (hideLegend)=>this.setState({\n                                    hideLegend,\n                                    calculating: ()=>this._resize()\n                                }),\n                            hideAxes: this.state.hideAxes,\n                            onToggleAxes: (hideAxes)=>this.setState({\n                                    calculating: ()=>this.setState({\n                                            hideAxes\n                                        })\n                                }),\n                            additionalSettings: this.props.additionalSettings\n                        }, this.props.systemInfoChildren);\n                }\n            })()), loaded && (0, _base.base).react.createElement(\"div\", {\n                className: \"sanddance-view\"\n            }, (0, _base.base).react.createElement((0, _sanddanceReact.SandDanceReact), {\n                renderOptions: {\n                    rebaseFilter: ()=>{\n                        const { rebaseFilter  } = this;\n                        if (rebaseFilter) this.rebaseFilter = false;\n                        return rebaseFilter;\n                    },\n                    initialColorContext: this.getColorContext && this.getColorContext(this.viewer.insight, insight),\n                    discardColorContextUpdates: ()=>this.discardColorContextUpdates\n                },\n                viewerOptions: this.viewerOptions,\n                ref: (reactViewer)=>{\n                    if (reactViewer) this.viewer = reactViewer.viewer;\n                },\n                onView: (renderResult)=>{\n                    this.changespecCapabilities(renderResult.specResult.errors ? renderResult.specResult.specCapabilities : this.viewer.specCapabilities);\n                    this.getColorContext = (oldInsight, newInsight)=>{\n                        if (!oldInsight && !newInsight) return null;\n                        if (!oldInsight || !newInsight) return null;\n                        if (oldInsight.scheme !== newInsight.scheme) return null;\n                        if (oldInsight.columns.color !== newInsight.columns.color) return null;\n                        if (oldInsight.directColor != newInsight.directColor) return null;\n                        return this.viewer.colorContexts && this.viewer.colorContexts[this.viewer.currentColorContext];\n                    };\n                    //don't allow tabbing to the canvas\n                    (0, _canvas.removeTabIndex)(this.viewer);\n                    this.props.onView && this.props.onView();\n                },\n                onError: (e)=>{\n                    this.props.onError && this.props.onError(e);\n                },\n                data: this.state.dataContent.data,\n                insight: insight,\n                onMount: (el)=>this.viewerMounted(el)\n            }), this.state.note && (0, _base.base).react.createElement(\"div\", {\n                className: \"sanddance-note\"\n            }, (0, _base.base).react.createElement((0, _iconButton.IconButton), {\n                className: \"cancel\",\n                themePalette: themePalette,\n                title: (0, _language.strings).buttonClose,\n                iconName: \"Cancel\",\n                onClick: ()=>this.setState({\n                        note: null\n                    })\n            }), (0, _base.base).react.createElement(\"div\", null, this.state.note))), (0, _base.base).react.createElement((0, _dialog.Dialog), {\n                title: (0, _language.strings).labelError,\n                hidden: !this.state.errors,\n                onDismiss: ()=>{\n                    this.setState({\n                        errors: null\n                    });\n                }\n            }, this.state.errors && this.state.errors.map((error, i)=>(0, _base.base).react.createElement(\"div\", {\n                    key: i\n                }, error))), (0, _base.base).react.createElement((0, _snapshotEditor.SnapshotEditor), Object.assign({\n                ref: (se)=>this.snapshotEditor = se\n            }, this.props.snapshotProps, {\n                explorer: this,\n                onWriteSnapshot: (s, i)=>this.writeSnapshot(s, i),\n                theme: this.props.theme,\n                themePalette: themePalette\n            }))), this.state.positionedColumnMapProps && (0, _base.base).react.createElement((0, _clickableTextLayer.PositionedColumnMap), Object.assign({}, this.state.positionedColumnMapProps)));\n        }\n        getColumnMapBaseProps() {\n            const allColumns = this.state.dataContent && this.state.dataContent.columns.filter((c)=>!(0, _sanddanceReact.SandDance).util.isInternalFieldName(c.name, true));\n            const quantitativeColumns = allColumns && allColumns.filter((c)=>c.quantitative);\n            const categoricalColumns = allColumns && allColumns.filter((c)=>!c.quantitative);\n            const props = {\n                changeColumnMapping: (role, columnOrRole, defaultColumn, options)=>{\n                    let column;\n                    if (typeof columnOrRole === \"string\") {\n                        //look up current insight\n                        const columnName = this.state.columns[columnOrRole];\n                        column = allColumns.filter((c)=>c.name === columnName)[0] || defaultColumn;\n                    } else column = columnOrRole;\n                    this.changeColumnMapping(role, column, options);\n                },\n                facetStyle: this.state.facetStyle,\n                totalStyle: this.state.totalStyle,\n                allColumns,\n                quantitativeColumns,\n                categoricalColumns,\n                specCapabilities: this.state.specCapabilities,\n                explorer: this\n            };\n            return props;\n        }\n    }\n    return new __Explorer(props1);\n}\nconst Explorer = _Explorer;\nfunction colorMapping(insight, columns) {\n    if (columns && insight.columns && insight.columns.color) return columns.filter((c)=>c.name === insight.columns.color)[0];\n}\n\n},{\"./base\":\"b6Cy1\",\"./canvas\":\"aMCsM\",\"./clickableTextLayer\":\"j00gw\",\"./colorMap\":\"kAJDy\",\"./colorScheme\":\"6A4C6\",\"./columns\":\"3WUEI\",\"./controls/dataScope\":\"8FBlK\",\"./controls/dialog\":\"hBByT\",\"./controls/iconButton\":\"at9GX\",\"./controls/sidebar\":\"jNKVm\",\"./controls/topbar\":\"hGzcE\",\"./dataLoader\":\"lUuMz\",\"./defaults\":\"ed5cu\",\"./dialogs/chart\":\"2MMic\",\"./dialogs/color\":\"cGiLW\",\"./dialogs/dataBrowser\":\"ix8tQ\",\"./dialogs/history\":\"copub\",\"./dialogs/search\":\"iB7jA\",\"./dialogs/settings\":\"kDVwl\",\"./dialogs/snapshotEditor\":\"jdUx0\",\"./dialogs/snapshots\":\"cVyum\",\"./interfaces\":\"kWX6R\",\"./language\":\"7qvdA\",\"./mouseEvent\":\"6LRUK\",\"./partialInsight\":\"bHInZ\",\"./themes\":\"gcU9w\",\"./toggleSearch\":\"4C7Xs\",\"@msrvida/chart-recommender\":\"8C9fP\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kAJDy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"applyColorButtons\", ()=>applyColorButtons);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _iconButton = require(\"./controls/iconButton\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _language = require(\"./language\");\nconst className = \"sanddance-panel-tools\";\nfunction ensureToolbar(panel) {\n    const existing = panel.getElementsByClassName(className);\n    if (existing.length > 0) return existing[0];\n    else {\n        const div = (0, _sanddanceReact.SandDance).VegaDeckGl.util.addDiv(panel, className);\n        panel.insertAdjacentElement(\"afterbegin\", div);\n        return div;\n    }\n}\nfunction applyColorButtons(presenter, showLegend, props) {\n    const panel = presenter.getElement((0, _sanddanceReact.SandDance).VegaDeckGl.PresenterElement.panel);\n    const div = ensureToolbar(panel);\n    (0, _base.base).reactDOM.render(ColorMap(props), div);\n    panel.style.display = showLegend ? \"\" : \"none\";\n}\nfunction ColorMap(props) {\n    const menuProps = {\n        items: [\n            {\n                key: \"new\",\n                text: (0, _language.strings).buttonColorSchemeRemap,\n                disabled: !props.canRemap || props.isRemap,\n                onClick: ()=>props.colorMapHandler(true)\n            },\n            {\n                key: \"old\",\n                text: (0, _language.strings).buttonColorSchemeKeep,\n                disabled: !props.canRemap || !props.isRemap,\n                onClick: ()=>props.colorMapHandler(false)\n            }\n        ]\n    };\n    return (0, _base.base).react.createElement(\"div\", null, (0, _base.base).react.createElement((0, _iconButton.IconButton), {\n        themePalette: props.themePalette,\n        title: (0, _language.strings).buttonColorSchemeMap,\n        onClick: null,\n        iconName: props.canRemap ? \"FiltersSolid\" : \"Filters\",\n        menuProps: menuProps\n    }));\n}\n\n},{\"./base\":\"b6Cy1\",\"./controls/iconButton\":\"at9GX\",\"@msrvida/sanddance-react\":\"4uo3s\",\"./language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6A4C6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bestColorScheme\", ()=>bestColorScheme);\nfunction bestColorScheme(newColumn, oldColumn, oldScheme) {\n    if (oldColumn && oldColumn.quantitative === newColumn.quantitative && defaultColorScheme(oldColumn) === defaultColorScheme(newColumn)) return oldScheme;\n    return defaultColorScheme(newColumn);\n}\nfunction defaultColorScheme(c) {\n    if (c.quantitative) return \"redyellowgreen\";\n    else if (c.stats.distinctValueCount === 2) return \"dual_redgreen\";\n    else if (c.stats.distinctValueCount <= 10) return \"category10\";\n    return \"category20\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8FBlK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataScopeId\", ()=>DataScopeId);\nparcelHelpers.export(exports, \"DataScope\", ()=>DataScope);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _button = require(\"./button\");\nvar _base = require(\"../base\");\nvar _language = require(\"../language\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _d3Format = require(\"d3-format\");\nvar DataScopeId;\n(function(DataScopeId1) {\n    DataScopeId1[DataScopeId1[\"AllData\"] = 0] = \"AllData\";\n    DataScopeId1[DataScopeId1[\"SelectedData\"] = 1] = \"SelectedData\";\n    DataScopeId1[DataScopeId1[\"FilteredData\"] = 2] = \"FilteredData\";\n})(DataScopeId || (DataScopeId = {}));\nconst shortFormat = (0, _d3Format.format)(\".2~s\");\nfunction short(n) {\n    return n === -1 ? \"--\" : n ? n < 1000 ? n.toString() : shortFormat(n) : \"0\";\n}\nfunction DataScope(props) {\n    const dataCount = Object.assign({\n        all: -1,\n        filtered: -1,\n        selected: -1\n    }, props.dataCount);\n    return props.compact ? (0, _base.base).react.createElement(\"div\", {\n        className: (0, _sanddanceReact.util).classList(\"sanddance-datascope\", \"compact\"),\n        onClick: props.onCompactClick\n    }, (0, _base.base).react.createElement(Compact, Object.assign({}, props, {\n        dataScopeId: DataScopeId.AllData,\n        text: (0, _language.strings).selectDataSpanAll,\n        count: dataCount.all\n    })), (0, _base.base).react.createElement(Compact, Object.assign({}, props, {\n        dataScopeId: DataScopeId.FilteredData,\n        text: (0, _language.strings).selectDataSpanFilter,\n        count: dataCount.filtered\n    })), (0, _base.base).react.createElement(Compact, Object.assign({}, props, {\n        dataScopeId: DataScopeId.SelectedData,\n        text: (0, _language.strings).selectDataSpanSelection,\n        count: dataCount.selected\n    }))) : (0, _base.base).react.createElement(\"div\", {\n        className: (0, _sanddanceReact.util).classList(\"sanddance-datascope\", \"extended\", props.active && \"active\")\n    }, (0, _base.base).react.createElement(\"div\", null, (0, _base.base).react.createElement(\"div\", null, props.dataSet), (0, _base.base).react.createElement(\"div\", {\n        className: \"datascope-buttons\"\n    }, (0, _base.base).react.createElement(DataScopeButton, Object.assign({}, props, {\n        dataScopeId: DataScopeId.AllData,\n        text: (0, _language.strings).selectDataSpanAll,\n        count: dataCount.all\n    })), (0, _base.base).react.createElement(DataScopeButton, Object.assign({}, props, {\n        dataScopeId: DataScopeId.FilteredData,\n        text: (0, _language.strings).selectDataSpanFilter,\n        count: dataCount.filtered\n    })), (0, _base.base).react.createElement(DataScopeButton, Object.assign({}, props, {\n        dataScopeId: DataScopeId.SelectedData,\n        text: (0, _language.strings).selectDataSpanSelection,\n        count: dataCount.selected\n    })))));\n}\nfunction Compact(props) {\n    return (0, _base.base).react.createElement(\"div\", {\n        title: props.text,\n        onClick: ()=>{\n            props.onDataScopeClick(props.dataScopeId);\n        }\n    }, short(props.count));\n}\nfunction DataScopeButton(props) {\n    return (0, _base.base).react.createElement((0, _button.Button), {\n        themePalette: props.themePalette,\n        className: (0, _sanddanceReact.util).classList(\"datascope-button\", props.selectedDataScope === props.dataScopeId && \"selected\"),\n        disabled: props.disabled,\n        text: props.text,\n        onClick: ()=>{\n            props.onDataScopeClick(props.dataScopeId);\n        },\n        onRenderText: ()=>{\n            return (0, _base.base).react.createElement(\"div\", {\n                title: props.count > 0 ? props.count.toString() : \"\"\n            }, (0, _base.base).react.createElement(\"label\", null, props.text), (0, _base.base).react.createElement(\"div\", null, short(props.count)));\n        },\n        onRenderIcon: ()=>null\n    });\n}\n\n},{\"./button\":\"gFWNm\",\"../base\":\"b6Cy1\",\"../language\":\"7qvdA\",\"@msrvida/sanddance-react\":\"4uo3s\",\"d3-format\":\"e6l2S\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e6l2S\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatDefaultLocale\", ()=>(0, _defaultLocaleJsDefault.default));\nparcelHelpers.export(exports, \"format\", ()=>(0, _defaultLocaleJs.format));\nparcelHelpers.export(exports, \"formatPrefix\", ()=>(0, _defaultLocaleJs.formatPrefix));\nparcelHelpers.export(exports, \"formatLocale\", ()=>(0, _localeJsDefault.default));\nparcelHelpers.export(exports, \"formatSpecifier\", ()=>(0, _formatSpecifierJsDefault.default));\nparcelHelpers.export(exports, \"FormatSpecifier\", ()=>(0, _formatSpecifierJs.FormatSpecifier));\nparcelHelpers.export(exports, \"precisionFixed\", ()=>(0, _precisionFixedJsDefault.default));\nparcelHelpers.export(exports, \"precisionPrefix\", ()=>(0, _precisionPrefixJsDefault.default));\nparcelHelpers.export(exports, \"precisionRound\", ()=>(0, _precisionRoundJsDefault.default));\nvar _defaultLocaleJs = require(\"./defaultLocale.js\");\nvar _defaultLocaleJsDefault = parcelHelpers.interopDefault(_defaultLocaleJs);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar _formatSpecifierJs = require(\"./formatSpecifier.js\");\nvar _formatSpecifierJsDefault = parcelHelpers.interopDefault(_formatSpecifierJs);\nvar _precisionFixedJs = require(\"./precisionFixed.js\");\nvar _precisionFixedJsDefault = parcelHelpers.interopDefault(_precisionFixedJs);\nvar _precisionPrefixJs = require(\"./precisionPrefix.js\");\nvar _precisionPrefixJsDefault = parcelHelpers.interopDefault(_precisionPrefixJs);\nvar _precisionRoundJs = require(\"./precisionRound.js\");\nvar _precisionRoundJsDefault = parcelHelpers.interopDefault(_precisionRoundJs);\n\n},{\"./defaultLocale.js\":\"kzzhq\",\"./locale.js\":\"6TF9z\",\"./formatSpecifier.js\":\"bJkF6\",\"./precisionFixed.js\":false,\"./precisionPrefix.js\":false,\"./precisionRound.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kzzhq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"format\", ()=>format);\nparcelHelpers.export(exports, \"formatPrefix\", ()=>formatPrefix);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar locale;\nvar format;\nvar formatPrefix;\ndefaultLocale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [\n        3\n    ],\n    currency: [\n        \"$\",\n        \"\"\n    ],\n    minus: \"-\"\n});\nfunction defaultLocale(definition) {\n    locale = (0, _localeJsDefault.default)(definition);\n    format = locale.format;\n    formatPrefix = locale.formatPrefix;\n    return locale;\n}\nexports.default = defaultLocale;\n\n},{\"./locale.js\":\"6TF9z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6TF9z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nvar _formatGroupJs = require(\"./formatGroup.js\");\nvar _formatGroupJsDefault = parcelHelpers.interopDefault(_formatGroupJs);\nvar _formatNumeralsJs = require(\"./formatNumerals.js\");\nvar _formatNumeralsJsDefault = parcelHelpers.interopDefault(_formatNumeralsJs);\nvar _formatSpecifierJs = require(\"./formatSpecifier.js\");\nvar _formatSpecifierJsDefault = parcelHelpers.interopDefault(_formatSpecifierJs);\nvar _formatTrimJs = require(\"./formatTrim.js\");\nvar _formatTrimJsDefault = parcelHelpers.interopDefault(_formatTrimJs);\nvar _formatTypesJs = require(\"./formatTypes.js\");\nvar _formatTypesJsDefault = parcelHelpers.interopDefault(_formatTypesJs);\nvar _formatPrefixAutoJs = require(\"./formatPrefixAuto.js\");\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar map = Array.prototype.map, prefixes = [\n    \"y\",\n    \"z\",\n    \"a\",\n    \"f\",\n    \"p\",\n    \"n\",\n    \"\\xb5\",\n    \"m\",\n    \"\",\n    \"k\",\n    \"M\",\n    \"G\",\n    \"T\",\n    \"P\",\n    \"E\",\n    \"Z\",\n    \"Y\"\n];\nexports.default = function(locale) {\n    var group = locale.grouping === undefined || locale.thousands === undefined ? (0, _identityJsDefault.default) : (0, _formatGroupJsDefault.default)(map.call(locale.grouping, Number), locale.thousands + \"\"), currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\", currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\", decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\", numerals = locale.numerals === undefined ? (0, _identityJsDefault.default) : (0, _formatNumeralsJsDefault.default)(map.call(locale.numerals, String)), percent = locale.percent === undefined ? \"%\" : locale.percent + \"\", minus = locale.minus === undefined ? \"-\" : locale.minus + \"\", nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n    function newFormat(specifier) {\n        specifier = (0, _formatSpecifierJsDefault.default)(specifier);\n        var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;\n        // The \"n\" type is an alias for \",g\".\n        if (type === \"n\") comma = true, type = \"g\";\n        else if (!(0, _formatTypesJsDefault.default)[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n        // If zero fill is specified, padding goes after sign and before digits.\n        if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\";\n        // Compute the prefix and suffix.\n        // For SI-prefix, the suffix is lazily computed.\n        var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\", suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n        // What format function should we use?\n        // Is this an integer type?\n        // Can this type generate exponential notation?\n        var formatType = (0, _formatTypesJsDefault.default)[type], maybeSuffix = /[defgprs%]/.test(type);\n        // Set the default precision if not specified,\n        // or clamp the specified precision to the supported range.\n        // For significant precision, it must be in [1, 21].\n        // For fixed precision, it must be in [0, 20].\n        precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n        function format(value) {\n            var valuePrefix = prefix, valueSuffix = suffix, i, n, c;\n            if (type === \"c\") {\n                valueSuffix = formatType(value) + valueSuffix;\n                value = \"\";\n            } else {\n                value = +value;\n                // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n                var valueNegative = value < 0 || 1 / value < 0;\n                // Perform the initial formatting.\n                value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n                // Trim insignificant zeros.\n                if (trim) value = (0, _formatTrimJsDefault.default)(value);\n                // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n                if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n                // Compute the prefix and suffix.\n                valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n                valueSuffix = (type === \"s\" ? prefixes[8 + (0, _formatPrefixAutoJs.prefixExponent) / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n                // Break the formatted value into the integer “value” part that can be\n                // grouped, and fractional or exponential “suffix” part that is not.\n                if (maybeSuffix) {\n                    i = -1, n = value.length;\n                    while(++i < n)if (c = value.charCodeAt(i), 48 > c || c > 57) {\n                        valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n                        value = value.slice(0, i);\n                        break;\n                    }\n                }\n            }\n            // If the fill character is not \"0\", grouping is applied before padding.\n            if (comma && !zero) value = group(value, Infinity);\n            // Compute the padding.\n            var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n            // If the fill character is \"0\", grouping is applied after padding.\n            if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n            // Reconstruct the final output based on the desired alignment.\n            switch(align){\n                case \"<\":\n                    value = valuePrefix + value + valueSuffix + padding;\n                    break;\n                case \"=\":\n                    value = valuePrefix + padding + value + valueSuffix;\n                    break;\n                case \"^\":\n                    value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n                    break;\n                default:\n                    value = padding + valuePrefix + value + valueSuffix;\n                    break;\n            }\n            return numerals(value);\n        }\n        format.toString = function() {\n            return specifier + \"\";\n        };\n        return format;\n    }\n    function formatPrefix(specifier, value1) {\n        var f = newFormat((specifier = (0, _formatSpecifierJsDefault.default)(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor((0, _exponentJsDefault.default)(value1) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];\n        return function(value) {\n            return f(k * value) + prefix;\n        };\n    }\n    return {\n        format: newFormat,\n        formatPrefix: formatPrefix\n    };\n};\n\n},{\"./exponent.js\":\"dBIUn\",\"./formatGroup.js\":\"11Q8h\",\"./formatNumerals.js\":\"gKE0F\",\"./formatSpecifier.js\":\"bJkF6\",\"./formatTrim.js\":\"iIuJZ\",\"./formatTypes.js\":\"c91mU\",\"./formatPrefixAuto.js\":\"9YjRv\",\"./identity.js\":\"l28cc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dBIUn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nexports.default = function(x) {\n    return x = (0, _formatDecimalJs.formatDecimalParts)(Math.abs(x)), x ? x[1] : NaN;\n};\n\n},{\"./formatDecimal.js\":\"3MHPJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3MHPJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nparcelHelpers.export(exports, \"formatDecimalParts\", ()=>formatDecimalParts);\nexports.default = function(x) {\n    return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString(\"en\").replace(/,/g, \"\") : x.toString(10);\n};\nfunction formatDecimalParts(x, p) {\n    if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n    var i, coefficient = x.slice(0, i);\n    // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n    // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n    return [\n        coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n        +x.slice(i + 1)\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"11Q8h\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(grouping, thousands) {\n    return function(value, width) {\n        var i = value.length, t = [], j = 0, g = grouping[0], length = 0;\n        while(i > 0 && g > 0){\n            if (length + g + 1 > width) g = Math.max(1, width - length);\n            t.push(value.substring(i -= g, i + g));\n            if ((length += g + 1) > width) break;\n            g = grouping[j = (j + 1) % grouping.length];\n        }\n        return t.reverse().join(thousands);\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gKE0F\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(numerals) {\n    return function(value) {\n        return value.replace(/[0-9]/g, function(i) {\n            return numerals[+i];\n        });\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bJkF6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FormatSpecifier\", ()=>FormatSpecifier);\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nfunction formatSpecifier(specifier) {\n    if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match;\n    return new FormatSpecifier({\n        fill: match[1],\n        align: match[2],\n        sign: match[3],\n        symbol: match[4],\n        zero: match[5],\n        width: match[6],\n        comma: match[7],\n        precision: match[8] && match[8].slice(1),\n        trim: match[9],\n        type: match[10]\n    });\n}\nexports.default = formatSpecifier;\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\nfunction FormatSpecifier(specifier) {\n    this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === undefined ? undefined : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\nFormatSpecifier.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iIuJZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexports.default = function(s) {\n    out: for(var n = s.length, i = 1, i0 = -1, i1; i < n; ++i)switch(s[i]){\n        case \".\":\n            i0 = i1 = i;\n            break;\n        case \"0\":\n            if (i0 === 0) i0 = i;\n            i1 = i;\n            break;\n        default:\n            if (!+s[i]) break out;\n            if (i0 > 0) i0 = 0;\n            break;\n    }\n    return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c91mU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nvar _formatDecimalJsDefault = parcelHelpers.interopDefault(_formatDecimalJs);\nvar _formatPrefixAutoJs = require(\"./formatPrefixAuto.js\");\nvar _formatPrefixAutoJsDefault = parcelHelpers.interopDefault(_formatPrefixAutoJs);\nvar _formatRoundedJs = require(\"./formatRounded.js\");\nvar _formatRoundedJsDefault = parcelHelpers.interopDefault(_formatRoundedJs);\nexports.default = {\n    \"%\": function(x, p) {\n        return (x * 100).toFixed(p);\n    },\n    \"b\": function(x) {\n        return Math.round(x).toString(2);\n    },\n    \"c\": function(x) {\n        return x + \"\";\n    },\n    \"d\": (0, _formatDecimalJsDefault.default),\n    \"e\": function(x, p) {\n        return x.toExponential(p);\n    },\n    \"f\": function(x, p) {\n        return x.toFixed(p);\n    },\n    \"g\": function(x, p) {\n        return x.toPrecision(p);\n    },\n    \"o\": function(x) {\n        return Math.round(x).toString(8);\n    },\n    \"p\": function(x, p) {\n        return (0, _formatRoundedJsDefault.default)(x * 100, p);\n    },\n    \"r\": (0, _formatRoundedJsDefault.default),\n    \"s\": (0, _formatPrefixAutoJsDefault.default),\n    \"X\": function(x) {\n        return Math.round(x).toString(16).toUpperCase();\n    },\n    \"x\": function(x) {\n        return Math.round(x).toString(16);\n    }\n};\n\n},{\"./formatDecimal.js\":\"3MHPJ\",\"./formatPrefixAuto.js\":\"9YjRv\",\"./formatRounded.js\":\"dipGF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9YjRv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"prefixExponent\", ()=>prefixExponent);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nvar prefixExponent;\nexports.default = function(x, p) {\n    var d = (0, _formatDecimalJs.formatDecimalParts)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, _formatDecimalJs.formatDecimalParts)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n};\n\n},{\"./formatDecimal.js\":\"3MHPJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dipGF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nexports.default = function(x, p) {\n    var d = (0, _formatDecimalJs.formatDecimalParts)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1];\n    return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n};\n\n},{\"./formatDecimal.js\":\"3MHPJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l28cc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return x;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jNKVm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Sidebar\", ()=>Sidebar);\nparcelHelpers.export(exports, \"Sidebutton\", ()=>Sidebutton);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _dataScope = require(\"./dataScope\");\nvar _iconButton = require(\"./iconButton\");\nvar _scrollable = require(\"./scrollable\");\nvar _interfaces = require(\"../interfaces\");\nvar _language = require(\"../language\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction Sidebar(props) {\n    const sidebuttons = [\n        {\n            sideTabId: (0, _interfaces.SideTabId).ChartType,\n            iconName: \"BIDashboard\",\n            title: (0, _language.strings).labelChart\n        },\n        {\n            sideTabId: (0, _interfaces.SideTabId).Color,\n            iconName: \"Color\",\n            title: (0, _language.strings).labelColor\n        },\n        {\n            sideTabId: (0, _interfaces.SideTabId).Data,\n            iconName: \"Table\",\n            title: (0, _language.strings).labelDataBrowser\n        },\n        {\n            sideTabId: (0, _interfaces.SideTabId).Search,\n            iconName: \"Search\",\n            title: (0, _language.strings).labelSearch\n        },\n        {\n            sideTabId: (0, _interfaces.SideTabId).Snapshots,\n            iconName: \"Camera\",\n            title: (0, _language.strings).labelSnapshots\n        },\n        {\n            sideTabId: (0, _interfaces.SideTabId).History,\n            iconName: \"History\",\n            title: (0, _language.strings).labelHistory\n        },\n        {\n            sideTabId: (0, _interfaces.SideTabId).Settings,\n            iconName: \"Settings\",\n            title: (0, _language.strings).labelChartSettings\n        }\n    ];\n    return (0, _base.base).react.createElement(\"div\", {\n        className: (0, _sanddanceReact.util).classList(\"sanddance-sidebar\", \"calculator\", props.pinned && \"pinned\", props.closed && \"closed\")\n    }, (0, _base.base).react.createElement(\"div\", {\n        className: \"sidebar-content\"\n    }, (0, _base.base).react.createElement((0, _dataScope.DataScope), Object.assign({}, props.dataScopeProps)), (0, _base.base).react.createElement(\"div\", {\n        className: \"vbuttons\",\n        role: \"tablist\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        className: \"sidebar-dialogs\"\n    }, sidebuttons.map((sidebutton, i)=>(0, _base.base).react.createElement(Sidebutton, Object.assign({\n            key: i\n        }, props, sidebutton, {\n            themePalette: props.themePalette\n        })))), !props.hideSidebarControls && (0, _base.base).react.createElement(\"div\", {\n        className: \"sidebar-controls\"\n    }, (0, _base.base).react.createElement(Sidebutton, Object.assign({}, props, {\n        role: \"button\",\n        sideTabId: (0, _interfaces.SideTabId).Pin,\n        iconName: props.pinned ? \"Pinned\" : \"Pin\",\n        title: props.pinned ? (0, _language.strings).buttonToolbarFloat : (0, _language.strings).buttonToolbarDock\n    })), (0, _base.base).react.createElement(Sidebutton, Object.assign({}, props, {\n        role: \"button\",\n        sideTabId: (0, _interfaces.SideTabId).Collapse,\n        iconName: props.closed ? \"DoubleChevronRight12\" : \"DoubleChevronLeft12\",\n        title: props.closed ? (0, _language.strings).buttonToolbarShow : (0, _language.strings).buttonToolbarHide\n    })))), (0, _base.base).react.createElement((0, _scrollable.Scrollable), {\n        role: \"tabpanel\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        className: \"sidetab\"\n    }, props.children)), props.calculating && (0, _base.base).react.createElement(\"div\", {\n        className: \"calculating\"\n    }, (0, _base.base).react.createElement((0, _base.base).fluentUI.Spinner, {\n        size: (0, _base.base).fluentUI.SpinnerSize.large\n    }))));\n}\nfunction Sidebutton(props) {\n    const selected = !props.closed && props.selectedSideTab === props.sideTabId;\n    return (0, _base.base).react.createElement(\"div\", {\n        className: (0, _sanddanceReact.util).classList(\"vbutton\", selected && \"selected\")\n    }, props.badgeText && (0, _base.base).react.createElement(\"div\", {\n        className: \"count\"\n    }, props.badgeText), (0, _base.base).react.createElement((0, _iconButton.IconButton), {\n        role: props.role || \"tab\",\n        \"aria-selected\": selected,\n        themePalette: props.themePalette,\n        className: \"vbutton\",\n        iconName: props.iconName,\n        title: props.title,\n        onClick: ()=>{\n            props.onSideTabClick(props.sideTabId);\n        }\n    }));\n}\n\n},{\"../base\":\"b6Cy1\",\"./dataScope\":\"8FBlK\",\"./iconButton\":\"at9GX\",\"./scrollable\":\"9FgNN\",\"../interfaces\":\"kWX6R\",\"../language\":\"7qvdA\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9FgNN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Scrollable\", ()=>Scrollable);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction Scrollable(props) {\n    return (0, _base.base).react.createElement(\"div\", {\n        className: (0, _sanddanceReact.util).classList(\"scrollable-container\", props.className),\n        role: props.role\n    }, (0, _base.base).react.createElement(\"div\", {\n        className: \"scrollable\"\n    }, props.children));\n}\n\n},{\"../base\":\"b6Cy1\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kWX6R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SideTabId\", ()=>SideTabId);\nvar SideTabId;\n(function(SideTabId1) {\n    SideTabId1[SideTabId1[\"ChartType\"] = 0] = \"ChartType\";\n    SideTabId1[SideTabId1[\"Data\"] = 1] = \"Data\";\n    SideTabId1[SideTabId1[\"Search\"] = 2] = \"Search\";\n    SideTabId1[SideTabId1[\"Color\"] = 3] = \"Color\";\n    SideTabId1[SideTabId1[\"Snapshots\"] = 4] = \"Snapshots\";\n    SideTabId1[SideTabId1[\"History\"] = 5] = \"History\";\n    SideTabId1[SideTabId1[\"Settings\"] = 6] = \"Settings\";\n    SideTabId1[SideTabId1[\"Pin\"] = 7] = \"Pin\";\n    SideTabId1[SideTabId1[\"Collapse\"] = 8] = \"Collapse\";\n})(SideTabId || (SideTabId = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hGzcE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Topbar\", ()=>Topbar);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _commandBarButtonStyles = require(\"./CommandBarButton.styles\");\nvar _logo = require(\"./logo\");\nvar _base = require(\"../base\");\nvar _language = require(\"../language\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction Topbar(props) {\n    const zeroResults = props.selectionState.selectedData && props.selectionState.selectedData.length === 0;\n    const disabled = !props.loaded;\n    const items = [\n        {\n            key: \"undo\",\n            name: (0, _language.strings).buttonUndo,\n            iconProps: {\n                iconName: \"Undo\"\n            },\n            disabled: disabled || props.historyItems.length === 0 || props.historyIndex === 0,\n            onClick: props.undo\n        },\n        {\n            key: \"redo\",\n            name: (0, _language.strings).buttonRedo,\n            iconProps: {\n                iconName: \"Redo\"\n            },\n            disabled: disabled || props.historyItems.length <= 1 || props.historyIndex >= props.historyItems.length - 1,\n            onClick: props.redo\n        },\n        {\n            key: \"deselect\",\n            name: (0, _language.strings).buttonDeselect,\n            iconProps: {\n                iconName: \"Cancel\"\n            },\n            disabled: disabled || !props.selectionSearch,\n            onClick: props.doDeselect\n        },\n        {\n            key: \"isolate\",\n            name: (0, _language.strings).buttonIsolate,\n            iconProps: {\n                iconName: \"Filter\"\n            },\n            disabled: disabled || !props.selectionSearch || zeroResults,\n            onClick: ()=>props.doFilter(props.selectionSearch, (0, _language.strings).labelHistoryFilterIsolate)\n        },\n        {\n            key: \"exclude\",\n            name: (0, _language.strings).buttonExclude,\n            iconProps: {\n                iconName: \"ClearFilter\"\n            },\n            disabled: disabled || !props.selectionSearch || zeroResults,\n            onClick: ()=>props.doFilter((0, _sanddanceReact.SandDance).searchExpression.invert(props.selectionSearch), (0, _language.strings).labelHistoryFilterIExclude)\n        },\n        {\n            key: \"reset\",\n            name: (0, _language.strings).buttonReset,\n            iconProps: {\n                iconName: \"RemoveFilter\"\n            },\n            disabled: disabled || !props.filter,\n            onClick: ()=>props.doUnfilter((0, _language.strings).labelHistoryFilterClear)\n        }\n    ];\n    if (props.buttons) items.push.apply(items, props.buttons);\n    if (props.collapseLabels) items.forEach((item)=>item.iconOnly = true);\n    const farItems = [\n        {\n            key: \"previous-snapshot\",\n            iconProps: {\n                iconName: \"Previous\"\n            },\n            title: (0, _language.strings).buttonPrevSnapshot,\n            onClick: props.onSnapshotPreviousClick,\n            disabled: props.snapshots.length < 2\n        },\n        {\n            key: \"snapshot\",\n            iconProps: {\n                iconName: \"Camera\"\n            },\n            title: (0, _language.strings).buttonCreateSnapshot,\n            onClick: props.onSnapshotClick,\n            disabled: !props.loaded\n        },\n        {\n            key: \"next-snapshot\",\n            iconProps: {\n                iconName: \"Next\"\n            },\n            title: (0, _language.strings).buttonNextSnapshot,\n            onClick: props.onSnapshotNextClick,\n            disabled: props.snapshots.length < 2\n        },\n        {\n            key: \"view\",\n            iconProps: {\n                iconName: props.view === \"2d\" ? \"CubeShape\" : \"Page\"\n            },\n            title: props.view === \"2d\" ? (0, _language.strings).labelViewType3d : (0, _language.strings).labelViewType2d,\n            onClick: props.onViewClick,\n            disabled: !props.loaded\n        },\n        {\n            key: \"home\",\n            iconProps: {\n                iconName: \"PicturePosition\"\n            },\n            title: (0, _language.strings).buttonCameraHome,\n            onClick: props.onHomeClick,\n            disabled: !props.loaded\n        }\n    ];\n    return (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-explorer-topbar\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        className: \"logo\"\n    }, (0, _base.base).react.createElement((0, _logo.Logo), null), (0, _base.base).react.createElement(\"a\", {\n        href: props.logoClickUrl || \"/\",\n        target: props.logoClickTarget || \"_blank\"\n    }, (0, _language.strings).appName)), (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-explorer-commandbar\"\n    }, (0, _base.base).react.createElement((0, _base.base).fluentUI.Customizer, {\n        scopedSettings: {\n            CommandBarButton: {\n                styles: (buttonProps)=>{\n                    buttonProps.theme.palette = props.themePalette;\n                    return (0, _commandBarButtonStyles.CommandBarButtonStyles)(buttonProps);\n                }\n            }\n        }\n    }, (0, _base.base).react.createElement((0, _base.base).fluentUI.CommandBar, {\n        items: items,\n        farItems: farItems,\n        styles: {\n            root: {\n                backgroundColor: \"transparent\",\n                height: \"unset\",\n                paddingLeft: 0,\n                paddingRight: 0\n            }\n        }\n    }))));\n}\n\n},{\"./CommandBarButton.styles\":\"b8HJB\",\"./logo\":\"2sP41\",\"../base\":\"b6Cy1\",\"../language\":\"7qvdA\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b8HJB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CommandBarButtonStyles\", ()=>CommandBarButtonStyles);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n//adapted from https://github.com/OfficeDev/office-ui-fabric-react/blob/master/packages/fluent-theme/src/fluent/styles/CommandBarButton.styles.ts\nvar _base = require(\"../base\");\nconst CommandBarButtonStyles = (props)=>{\n    const { theme  } = props;\n    if (!theme) throw new Error(\"Theme is undefined or null.\");\n    const { palette , semanticColors  } = theme;\n    const BUTTON_ICON_CLASSNAME = \".ms-Button-icon\";\n    return {\n        root: [\n            Object.assign({}, (0, _base.base).fluentUI.getFocusStyle(theme, {\n                inset: 2\n            })),\n            {\n                backgroundColor: palette.white\n            }\n        ],\n        rootHovered: {\n            backgroundColor: palette.neutralLighter,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDarkAlt\n                }\n            }\n        },\n        rootPressed: {\n            backgroundColor: palette.neutralLight,\n            color: palette.neutralDark,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootChecked: {\n            backgroundColor: palette.neutralLight,\n            color: palette.neutralDark,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootCheckedHovered: {\n            backgroundColor: palette.neutralQuaternaryAlt,\n            color: palette.neutralDark\n        },\n        rootExpanded: {\n            color: palette.neutralDark,\n            backgroundColor: palette.neutralLight,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark\n                }\n            }\n        },\n        rootExpandedHovered: {\n            background: palette.neutralQuaternaryAlt\n        },\n        rootDisabled: {\n            backgroundColor: palette.white,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: semanticColors.disabledBodySubtext\n                }\n            }\n        },\n        splitButtonMenuButton: {\n            backgroundColor: palette.white,\n            color: palette.neutralSecondary,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: palette.neutralLighter,\n                    selectors: {\n                        [BUTTON_ICON_CLASSNAME]: {\n                            color: palette.neutralPrimary\n                        }\n                    }\n                },\n                \":active\": {\n                    backgroundColor: palette.neutralLight,\n                    selectors: {\n                        [BUTTON_ICON_CLASSNAME]: {\n                            color: palette.neutralPrimary\n                        }\n                    }\n                }\n            }\n        },\n        splitButtonMenuButtonDisabled: {\n            backgroundColor: palette.white\n        },\n        icon: {\n            color: palette.themePrimary\n        }\n    };\n};\n\n},{\"../base\":\"b6Cy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2sP41\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Logo\", ()=>Logo);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nconst s = `\n ......\n.......\n...\n......\n ......\n    ...\n.......\n......\n`;\nconst d = s.split(\"\\n\").map((row, irow)=>row.length ? row.split(\"\").map((char, icol)=>char.trim() ? `M${2 * icol + 1} ${2 * (irow - 1) + 1} v1 h1 v-1 Z` : \"\").join(\" \") : \"\").join(\"\\n\");\nfunction Logo() {\n    return (0, _base.base).react.createElement(\"svg\", {\n        xmlns: \"http://www.w3.org/2000/svg\",\n        viewBox: \"0 0 16 16\"\n    }, (0, _base.base).react.createElement(\"path\", {\n        d: d\n    }));\n}\n\n},{\"../base\":\"b6Cy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lUuMz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"loadDataFile\", ()=>loadDataFile);\nparcelHelpers.export(exports, \"loadDataArray\", ()=>loadDataArray);\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nconst loadDataFile = (dataFile)=>new Promise((resolve, reject)=>{\n        const vega = (0, _sanddanceReact.SandDance).VegaDeckGl.base.vega;\n        const loader = vega.loader();\n        function handleRawText(text) {\n            let data;\n            try {\n                data = vega.read(text, {\n                    type: dataFile.type,\n                    parse: {}\n                });\n            } catch (e) {\n                reject(e);\n            }\n            if (data) loadDataArray(data, dataFile.type).then((dc)=>{\n                if (dataFile.snapshotsUrl) fetch(dataFile.snapshotsUrl).then((response)=>response.json()).then((snapshots)=>{\n                    dc.snapshots = snapshots;\n                    resolve(dc);\n                }).catch(reject);\n                else if (dataFile.snapshots) {\n                    dc.snapshots = dataFile.snapshots;\n                    resolve(dc);\n                } else resolve(dc);\n            }).catch(reject);\n        }\n        if (dataFile.dataUrl) loader.load(dataFile.dataUrl).then(handleRawText).catch(reject);\n        else if (dataFile.rawText) handleRawText(dataFile.rawText);\n        else reject(\"dataFile object must have either dataUrl or rawText property set.\");\n    });\nconst loadDataArray = (data, type)=>new Promise((resolve, reject)=>{\n        const parse = type === \"csv\" || type === \"tsv\";\n        if (parse) //convert empty strings to null so that vega.inferType will get dates\n        data.forEach((row)=>{\n            for(let column in row)if (row[column] === \"\") row[column] = null;\n        });\n        const columns = (0, _sanddanceReact.SandDance).util.getColumnsFromData((0, _sanddanceReact.SandDance).VegaDeckGl.base.vega.inferTypes, data).filter((c)=>c.name && c.name.trim()).sort((a, b)=>a.name.localeCompare(b.name));\n        if (parse) {\n            const booleanColumns = columns.filter((c)=>c.type === \"boolean\");\n            const dateColumns = columns.filter((c)=>c.type === \"date\");\n            const numericColumns = columns.filter((c)=>c.type === \"integer\" || c.type === \"number\");\n            data.forEach((obj)=>{\n                booleanColumns.forEach((c)=>{\n                    obj[c.name] = (\"\" + obj[c.name]).toLowerCase() === \"true\";\n                });\n                dateColumns.forEach((c)=>{\n                    const input = obj[c.name];\n                    if (input !== null) {\n                        const d = new Date(input);\n                        d.input = input;\n                        obj[c.name] = d;\n                    }\n                });\n                numericColumns.forEach((c)=>{\n                    const n = parseFloat(obj[c.name]);\n                    obj[c.name] = isNaN(n) ? null : n;\n                });\n            });\n        }\n        resolve({\n            data,\n            columns\n        });\n    });\n\n},{\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ed5cu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fontFamily\", ()=>fontFamily);\nparcelHelpers.export(exports, \"defaultViewerOptions\", ()=>defaultViewerOptions);\nparcelHelpers.export(exports, \"snapshotThumbWidth\", ()=>snapshotThumbWidth);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _themes = require(\"./themes\");\nconst fontFamily = \"Segoe UI, sans-serif\";\nconst defaultViewerOptions = {\n    colors: (0, _themes.getColorSettingsFromThemePalette)((0, _themes.themePalettes)[\"\"]),\n    fontFamily\n};\nconst snapshotThumbWidth = 300;\n\n},{\"./themes\":\"gcU9w\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gcU9w\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"themePalettes\", ()=>themePalettes);\nparcelHelpers.export(exports, \"getColorSettingsFromThemePalette\", ()=>getColorSettingsFromThemePalette);\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar util = (0, _sanddanceReact.SandDance).VegaDeckGl.util;\nconst themePalettes = {};\nthemePalettes[\"\"] = {\n    themePrimary: \"#0078d4\",\n    themeLighterAlt: \"#eff6fc\",\n    themeLighter: \"#deecf9\",\n    themeLight: \"#c7e0f4\",\n    themeTertiary: \"#71afe5\",\n    themeSecondary: \"#2b88d8\",\n    themeDarkAlt: \"#106ebe\",\n    themeDark: \"#005a9e\",\n    themeDarker: \"#004578\",\n    neutralLighterAlt: \"#f8f8f8\",\n    neutralLighter: \"#f4f4f4\",\n    neutralLight: \"#eaeaea\",\n    neutralQuaternaryAlt: \"#dadada\",\n    neutralQuaternary: \"#d0d0d0\",\n    neutralTertiaryAlt: \"#c8c8c8\",\n    neutralTertiary: \"#c2c2c2\",\n    neutralSecondary: \"#858585\",\n    neutralPrimaryAlt: \"#4b4b4b\",\n    neutralPrimary: \"#333333\",\n    neutralDark: \"#272727\",\n    black: \"#1d1d1d\",\n    white: \"#ffffff\"\n};\nthemePalettes[\"dark-theme\"] = {\n    themePrimary: \"#00b4f0\",\n    themeLighterAlt: \"#00070a\",\n    themeLighter: \"#001d26\",\n    themeLight: \"#003648\",\n    themeTertiary: \"#006c90\",\n    themeSecondary: \"#009ed3\",\n    themeDarkAlt: \"#18bbf1\",\n    themeDark: \"#3ac5f3\",\n    themeDarker: \"#6cd4f6\",\n    neutralLighterAlt: \"#0b0b0b\",\n    neutralLighter: \"#151515\",\n    neutralLight: \"#252525\",\n    neutralQuaternaryAlt: \"#2f2f2f\",\n    neutralQuaternary: \"#373737\",\n    neutralTertiaryAlt: \"#595959\",\n    neutralTertiary: \"#929292\",\n    neutralSecondary: \"#a7a7a7\",\n    neutralPrimaryAlt: \"#b4b4b4\",\n    neutralPrimary: \"#cccccc\",\n    neutralDark: \"#d8d8d8\",\n    black: \"#f5f5f5\",\n    white: \"#000000\"\n};\nfunction getColorSettingsFromThemePalette(themePalette) {\n    const c = util.colorFromString(themePalette.themeSecondary);\n    c[3] = 256 / 3; // one-third opacity background\n    return {\n        axisLine: themePalette.black,\n        axisText: themePalette.black,\n        hoveredCube: themePalette.black,\n        clickableText: themePalette.themeDark,\n        clickableTextHighlight: util.colorToString(c),\n        clickableTextHighlightAlphaCutoff: 0,\n        searchText: themePalette.neutralPrimary,\n        searchTextHighlight: themePalette.neutralPrimaryAlt\n    };\n}\n\n},{\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cGiLW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Color\", ()=>Color);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _columnMap = require(\"../controls/columnMap\");\nvar _palettes = require(\"../palettes\");\nvar _signal = require(\"../controls/signal\");\nvar _language = require(\"../language\");\nvar _group = require(\"../controls/group\");\nfunction Color(props) {\n    const colorColumn = props.dataContent.columns.filter((c)=>c.name === props.colorColumn)[0];\n    const disabledColorBin = !colorColumn || !colorColumn.quantitative || props.directColor;\n    const colorBin = props.colorBin || \"quantize\";\n    const dropdownRef = (0, _base.base).react.createRef();\n    props.explorer.dialogFocusHandler.focus = ()=>{\n        var _a;\n        return (_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n    };\n    return (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-color-dialog\"\n    }, (0, _base.base).react.createElement((0, _group.Group), {\n        label: (0, _language.strings).labelColor\n    }, (0, _base.base).react.createElement((0, _columnMap.ColumnMap), Object.assign({}, props, {\n        componentRef: dropdownRef,\n        collapseLabel: props.compactUI,\n        selectedColumnName: props.colorColumn,\n        specRole: props.specCapabilities && props.specCapabilities.roles.filter((r)=>r.role === \"color\")[0],\n        key: 0\n    })), colorColumn && colorColumn.isColorData && (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, _language.strings).labelColorFieldIsColorData(colorColumn.name)\n        }\n    }), colorColumn && !colorColumn.isColorData && (0, _base.base).react.createElement((0, _palettes.Palette), {\n        collapseLabel: props.compactUI,\n        scheme: props.scheme,\n        colorColumn: colorColumn,\n        changeColorScheme: (scheme)=>{\n            props.onColorSchemeChange(scheme);\n        },\n        disabled: props.disabled || props.directColor || colorColumn && colorColumn.isColorData\n    }), colorColumn && !colorColumn.isColorData && (0, _base.base).react.createElement((0, _signal.Signal), {\n        disabled: props.disabled || !colorColumn || props.directColor || colorColumn && colorColumn.isColorData,\n        signal: props.colorReverseSignal,\n        explorer: props.explorer,\n        onChange: props.onColorReverseChange,\n        collapseLabel: props.compactUI\n    })), colorColumn && !colorColumn.isColorData && (0, _base.base).react.createElement((0, _group.Group), {\n        label: (0, _language.strings).labelColorBin\n    }, (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-explanation\"\n    }, (0, _language.strings).labelColorBinExplanation), (0, _base.base).react.createElement((0, _base.base).fluentUI.ChoiceGroup, {\n        options: [\n            {\n                key: \"continuous\",\n                text: (0, _language.strings).labelColorBinNone,\n                checked: colorBin === \"continuous\",\n                disabled: disabledColorBin\n            },\n            {\n                key: \"quantize\",\n                text: (0, _language.strings).labelColorBinQuantize,\n                checked: colorBin === \"quantize\",\n                disabled: disabledColorBin\n            },\n            {\n                key: \"quantile\",\n                text: (0, _language.strings).labelColorBinQuantile,\n                checked: colorBin === \"quantile\",\n                disabled: disabledColorBin\n            }\n        ],\n        onChange: (e, o)=>{\n            props.onColorBinChange(o.key);\n        }\n    }), (0, _base.base).react.createElement((0, _signal.Signal), {\n        disabled: props.disabled || disabledColorBin || props.colorBin === \"continuous\",\n        signal: props.colorBinSignal,\n        explorer: props.explorer,\n        onChange: props.onColorBinCountChange,\n        collapseLabel: props.compactUI\n    })), colorColumn && !colorColumn.isColorData && (0, _base.base).react.createElement((0, _group.Group), {\n        label: (0, _language.strings).labelColorOptions\n    }, (0, _base.base).react.createElement((0, _base.base).fluentUI.Toggle, {\n        label: (0, _language.strings).selectDirectColor,\n        disabled: !colorColumn.stats.hasColorData,\n        checked: !!(colorColumn.stats.hasColorData && props.directColor),\n        onChange: (e, checked)=>props.onDirectColorChange(checked)\n    }), (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, _language.strings).labelDataColors\n        }\n    })));\n}\n\n},{\"../base\":\"b6Cy1\",\"../controls/columnMap\":\"6MgAn\",\"../palettes\":\"cKcp9\",\"../controls/signal\":\"hpJp2\",\"../language\":\"7qvdA\",\"../controls/group\":\"e2GTU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cKcp9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Palette\", ()=>Palette);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _categorical = require(\"./categorical\");\nvar _diverging = require(\"./diverging\");\nvar _dropdown = require(\"../controls/dropdown\");\nvar _dual = require(\"./dual\");\nvar _scheme = require(\"./scheme\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _sequentialMultiHue = require(\"./sequentialMultiHue\");\nvar _sequentialSingleHue = require(\"./sequentialSingleHue\");\nvar _language = require(\"../language\");\nconst maxDistinctColors = 20;\nfunction Palette(props) {\n    const { distinctValueCount  } = props.colorColumn.stats;\n    let isDual = distinctValueCount === 2;\n    const categoricalNumeric = distinctValueCount > 0 && distinctValueCount < maxDistinctColors;\n    let isQualitative = false;\n    let isQuantitative = false;\n    switch(props.colorColumn.type){\n        case \"boolean\":\n        case \"string\":\n            isQualitative = true;\n            break;\n        case \"number\":\n            isQuantitative = true;\n            break;\n        case \"date\":\n        case \"integer\":\n            isQuantitative = true;\n            isQualitative = categoricalNumeric;\n    }\n    const selected = props.scheme;\n    const options = [];\n    function menu(name, opts) {\n        options.push({\n            key: name,\n            text: name,\n            itemType: (0, _base.base).fluentUI.DropdownMenuItemType.Header\n        });\n        options.push.apply(options, opts);\n    }\n    isQualitative && menu((0, _language.strings).schemeCategorical, (0, _categorical.categorical)(selected));\n    isQuantitative && menu((0, _language.strings).schemeSequentialSingleHue, (0, _sequentialSingleHue.sequentialSingleHue)(selected));\n    isQuantitative && menu((0, _language.strings).schemeSequentialMultiHue, (0, _sequentialMultiHue.sequentialMultiHue)(selected));\n    isQuantitative && menu((0, _language.strings).schemeDiverging, (0, _diverging.diverging)(selected));\n    isDual && menu((0, _language.strings).schemeDual, (0, _dual.dual)(selected));\n    return (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-palette\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-explanation\",\n        dangerouslySetInnerHTML: {\n            __html: (0, _language.strings).labelColorFieldInfo(props.colorColumn.name, props.colorColumn.type, categoricalNumeric, distinctValueCount)\n        }\n    }), (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n        collapseLabel: props.collapseLabel,\n        disabled: props.disabled,\n        dropdownWidth: 400,\n        label: (0, _language.strings).labelColorScheme,\n        onRenderOption: (option)=>{\n            if (option.itemType === (0, _base.base).fluentUI.DropdownMenuItemType.Header) return (0, _base.base).react.createElement(\"span\", null, option.text);\n            else return (0, _base.base).react.createElement(\"div\", {\n                className: \"sanddance-scheme option\"\n            }, (0, _base.base).react.createElement(\"span\", {\n                className: \"name\"\n            }, option.scheme), option.children);\n        },\n        options: options,\n        onChange: (e, o)=>{\n            props.changeColorScheme(o.scheme);\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        className: (0, _sanddanceReact.util).classList(\"sanddance-scheme\", props.disabled && \"disabled\")\n    }, props.scheme && (0, _scheme.schemesJSX)[props.scheme]));\n}\n\n},{\"../base\":\"b6Cy1\",\"./categorical\":\"fv6Jc\",\"./diverging\":\"dfBEp\",\"../controls/dropdown\":\"iEkOh\",\"./dual\":\"9Blmq\",\"./scheme\":\"fmqpd\",\"@msrvida/sanddance-react\":\"4uo3s\",\"./sequentialMultiHue\":\"23nam\",\"./sequentialSingleHue\":\"dQZES\",\"../language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fv6Jc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"categorical\", ()=>categorical);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _scheme = require(\"./scheme\");\nconst p8 = `${12.5}%`;\nconst p9 = `${100 / 9}%`;\nconst p10 = `${10}%`;\nconst p12 = `${100 / 12}%`;\nconst p20 = `${5}%`;\nlet loaded = false;\nfunction load() {\n    (0, _scheme.schemesJSX)[\"accent\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#7fc97f\",\n        style: {\n            width: p8,\n            background: \"rgb(127, 201, 127)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#beaed4\",\n        style: {\n            width: p8,\n            background: \"rgb(190, 174, 212)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fdc086\",\n        style: {\n            width: p8,\n            background: \"rgb(253, 192, 134)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffff99\",\n        style: {\n            width: p8,\n            background: \"rgb(255, 255, 153)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#386cb0\",\n        style: {\n            width: p8,\n            background: \"rgb(56, 108, 176)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f0027f\",\n        style: {\n            width: p8,\n            background: \"rgb(240, 2, 127)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bf5b17\",\n        style: {\n            width: p8,\n            background: \"rgb(191, 91, 23)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#666666\",\n        style: {\n            width: p8,\n            background: \"rgb(102, 102, 102)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"category10\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#1f77b4\",\n        style: {\n            width: p10,\n            background: \"rgb(31, 119, 180)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ff7f0e\",\n        style: {\n            width: p10,\n            background: \"rgb(255, 127, 14)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#2ca02c\",\n        style: {\n            width: p10,\n            background: \"rgb(44, 160, 44)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d62728\",\n        style: {\n            width: p10,\n            background: \"rgb(214, 39, 40)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9467bd\",\n        style: {\n            width: p10,\n            background: \"rgb(148, 103, 189)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#8c564b\",\n        style: {\n            width: p10,\n            background: \"rgb(140, 86, 75)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e377c2\",\n        style: {\n            width: p10,\n            background: \"rgb(227, 119, 194)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#7f7f7f\",\n        style: {\n            width: p10,\n            background: \"rgb(127, 127, 127)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bcbd22\",\n        style: {\n            width: p10,\n            background: \"rgb(188, 189, 34)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#17becf\",\n        style: {\n            width: p10,\n            background: \"rgb(23, 190, 207)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"category20\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#1f77b4\",\n        style: {\n            width: p20,\n            background: \"rgb(31, 119, 180)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#aec7e8\",\n        style: {\n            width: p20,\n            background: \"rgb(174, 199, 232)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ff7f0e\",\n        style: {\n            width: p20,\n            background: \"rgb(255, 127, 14)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffbb78\",\n        style: {\n            width: p20,\n            background: \"rgb(255, 187, 120)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#2ca02c\",\n        style: {\n            width: p20,\n            background: \"rgb(44, 160, 44)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#98df8a\",\n        style: {\n            width: p20,\n            background: \"rgb(152, 223, 138)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d62728\",\n        style: {\n            width: p20,\n            background: \"rgb(214, 39, 40)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ff9896\",\n        style: {\n            width: p20,\n            background: \"rgb(255, 152, 150)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9467bd\",\n        style: {\n            width: p20,\n            background: \"rgb(148, 103, 189)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#c5b0d5\",\n        style: {\n            width: p20,\n            background: \"rgb(197, 176, 213)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#8c564b\",\n        style: {\n            width: p20,\n            background: \"rgb(140, 86, 75)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#c49c94\",\n        style: {\n            width: p20,\n            background: \"rgb(196, 156, 148)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e377c2\",\n        style: {\n            width: p20,\n            background: \"rgb(227, 119, 194)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f7b6d2\",\n        style: {\n            width: p20,\n            background: \"rgb(247, 182, 210)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#7f7f7f\",\n        style: {\n            width: p20,\n            background: \"rgb(127, 127, 127)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#c7c7c7\",\n        style: {\n            width: p20,\n            background: \"rgb(199, 199, 199)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bcbd22\",\n        style: {\n            width: p20,\n            background: \"rgb(188, 189, 34)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#dbdb8d\",\n        style: {\n            width: p20,\n            background: \"rgb(219, 219, 141)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#17becf\",\n        style: {\n            width: p20,\n            background: \"rgb(23, 190, 207)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9edae5\",\n        style: {\n            width: p20,\n            background: \"rgb(158, 218, 229)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"category20b\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#393b79\",\n        style: {\n            width: p20,\n            background: \"rgb(57, 59, 121)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#5254a3\",\n        style: {\n            width: p20,\n            background: \"rgb(82, 84, 163)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#6b6ecf\",\n        style: {\n            width: p20,\n            background: \"rgb(107, 110, 207)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9c9ede\",\n        style: {\n            width: p20,\n            background: \"rgb(156, 158, 222)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#637939\",\n        style: {\n            width: p20,\n            background: \"rgb(99, 121, 57)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#8ca252\",\n        style: {\n            width: p20,\n            background: \"rgb(140, 162, 82)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b5cf6b\",\n        style: {\n            width: p20,\n            background: \"rgb(181, 207, 107)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#cedb9c\",\n        style: {\n            width: p20,\n            background: \"rgb(206, 219, 156)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#8c6d31\",\n        style: {\n            width: p20,\n            background: \"rgb(140, 109, 49)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bd9e39\",\n        style: {\n            width: p20,\n            background: \"rgb(189, 158, 57)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e7ba52\",\n        style: {\n            width: p20,\n            background: \"rgb(231, 186, 82)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e7cb94\",\n        style: {\n            width: p20,\n            background: \"rgb(231, 203, 148)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#843c39\",\n        style: {\n            width: p20,\n            background: \"rgb(132, 60, 57)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ad494a\",\n        style: {\n            width: p20,\n            background: \"rgb(173, 73, 74)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d6616b\",\n        style: {\n            width: p20,\n            background: \"rgb(214, 97, 107)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e7969c\",\n        style: {\n            width: p20,\n            background: \"rgb(231, 150, 156)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#7b4173\",\n        style: {\n            width: p20,\n            background: \"rgb(123, 65, 115)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#a55194\",\n        style: {\n            width: p20,\n            background: \"rgb(165, 81, 148)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ce6dbd\",\n        style: {\n            width: p20,\n            background: \"rgb(206, 109, 189)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#de9ed6\",\n        style: {\n            width: p20,\n            background: \"rgb(222, 158, 214)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"category20c\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#3182bd\",\n        style: {\n            width: p20,\n            background: \"rgb(49, 130, 189)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#6baed6\",\n        style: {\n            width: p20,\n            background: \"rgb(107, 174, 214)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9ecae1\",\n        style: {\n            width: p20,\n            background: \"rgb(158, 202, 225)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#c6dbef\",\n        style: {\n            width: p20,\n            background: \"rgb(198, 219, 239)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e6550d\",\n        style: {\n            width: p20,\n            background: \"rgb(230, 85, 13)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fd8d3c\",\n        style: {\n            width: p20,\n            background: \"rgb(253, 141, 60)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fdae6b\",\n        style: {\n            width: p20,\n            background: \"rgb(253, 174, 107)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fdd0a2\",\n        style: {\n            width: p20,\n            background: \"rgb(253, 208, 162)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#31a354\",\n        style: {\n            width: p20,\n            background: \"rgb(49, 163, 84)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#74c476\",\n        style: {\n            width: p20,\n            background: \"rgb(116, 196, 118)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#a1d99b\",\n        style: {\n            width: p20,\n            background: \"rgb(161, 217, 155)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#c7e9c0\",\n        style: {\n            width: p20,\n            background: \"rgb(199, 233, 192)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#756bb1\",\n        style: {\n            width: p20,\n            background: \"rgb(117, 107, 177)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9e9ac8\",\n        style: {\n            width: p20,\n            background: \"rgb(158, 154, 200)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bcbddc\",\n        style: {\n            width: p20,\n            background: \"rgb(188, 189, 220)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#dadaeb\",\n        style: {\n            width: p20,\n            background: \"rgb(218, 218, 235)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#636363\",\n        style: {\n            width: p20,\n            background: \"rgb(99, 99, 99)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#969696\",\n        style: {\n            width: p20,\n            background: \"rgb(150, 150, 150)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bdbdbd\",\n        style: {\n            width: p20,\n            background: \"rgb(189, 189, 189)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d9d9d9\",\n        style: {\n            width: p20,\n            background: \"rgb(217, 217, 217)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"dark2\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#1b9e77\",\n        style: {\n            width: p8,\n            background: \"rgb(27, 158, 119)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d95f02\",\n        style: {\n            width: p8,\n            background: \"rgb(217, 95, 2)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#7570b3\",\n        style: {\n            width: p8,\n            background: \"rgb(117, 112, 179)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e7298a\",\n        style: {\n            width: p8,\n            background: \"rgb(231, 41, 138)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#66a61e\",\n        style: {\n            width: p8,\n            background: \"rgb(102, 166, 30)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e6ab02\",\n        style: {\n            width: p8,\n            background: \"rgb(230, 171, 2)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#a6761d\",\n        style: {\n            width: p8,\n            background: \"rgb(166, 118, 29)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#666666\",\n        style: {\n            width: p8,\n            background: \"rgb(102, 102, 102)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"paired\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#a6cee3\",\n        style: {\n            width: p12,\n            background: \"rgb(166, 206, 227)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#1f78b4\",\n        style: {\n            width: p12,\n            background: \"rgb(31, 120, 180)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b2df8a\",\n        style: {\n            width: p12,\n            background: \"rgb(178, 223, 138)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#33a02c\",\n        style: {\n            width: p12,\n            background: \"rgb(51, 160, 44)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fb9a99\",\n        style: {\n            width: p12,\n            background: \"rgb(251, 154, 153)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e31a1c\",\n        style: {\n            width: p12,\n            background: \"rgb(227, 26, 28)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fdbf6f\",\n        style: {\n            width: p12,\n            background: \"rgb(253, 191, 111)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ff7f00\",\n        style: {\n            width: p12,\n            background: \"rgb(255, 127, 0)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#cab2d6\",\n        style: {\n            width: p12,\n            background: \"rgb(202, 178, 214)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#6a3d9a\",\n        style: {\n            width: p12,\n            background: \"rgb(106, 61, 154)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffff99\",\n        style: {\n            width: p12,\n            background: \"rgb(255, 255, 153)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b15928\",\n        style: {\n            width: p12,\n            background: \"rgb(177, 89, 40)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"pastel1\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#fbb4ae\",\n        style: {\n            width: p9,\n            background: \"rgb(251, 180, 174)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b3cde3\",\n        style: {\n            width: p9,\n            background: \"rgb(179, 205, 227)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ccebc5\",\n        style: {\n            width: p9,\n            background: \"rgb(204, 235, 197)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#decbe4\",\n        style: {\n            width: p9,\n            background: \"rgb(222, 203, 228)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fed9a6\",\n        style: {\n            width: p9,\n            background: \"rgb(254, 217, 166)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffffcc\",\n        style: {\n            width: p9,\n            background: \"rgb(255, 255, 204)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e5d8bd\",\n        style: {\n            width: p9,\n            background: \"rgb(229, 216, 189)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fddaec\",\n        style: {\n            width: p9,\n            background: \"rgb(253, 218, 236)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f2f2f2\",\n        style: {\n            width: p9,\n            background: \"rgb(242, 242, 242)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"pastel2\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#b3e2cd\",\n        style: {\n            width: p8,\n            background: \"rgb(179, 226, 205)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fdcdac\",\n        style: {\n            width: p8,\n            background: \"rgb(253, 205, 172)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#cbd5e8\",\n        style: {\n            width: p8,\n            background: \"rgb(203, 213, 232)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f4cae4\",\n        style: {\n            width: p8,\n            background: \"rgb(244, 202, 228)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e6f5c9\",\n        style: {\n            width: p8,\n            background: \"rgb(230, 245, 201)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fff2ae\",\n        style: {\n            width: p8,\n            background: \"rgb(255, 242, 174)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f1e2cc\",\n        style: {\n            width: p8,\n            background: \"rgb(241, 226, 204)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#cccccc\",\n        style: {\n            width: p8,\n            background: \"rgb(204, 204, 204)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"set1\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#e41a1c\",\n        style: {\n            width: p9,\n            background: \"rgb(228, 26, 28)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#377eb8\",\n        style: {\n            width: p9,\n            background: \"rgb(55, 126, 184)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#4daf4a\",\n        style: {\n            width: p9,\n            background: \"rgb(77, 175, 74)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#984ea3\",\n        style: {\n            width: p9,\n            background: \"rgb(152, 78, 163)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ff7f00\",\n        style: {\n            width: p9,\n            background: \"rgb(255, 127, 0)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffff33\",\n        style: {\n            width: p9,\n            background: \"rgb(255, 255, 51)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#a65628\",\n        style: {\n            width: p9,\n            background: \"rgb(166, 86, 40)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f781bf\",\n        style: {\n            width: p9,\n            background: \"rgb(247, 129, 191)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#999999\",\n        style: {\n            width: p9,\n            background: \"rgb(153, 153, 153)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"set2\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#66c2a5\",\n        style: {\n            width: p8,\n            background: \"rgb(102, 194, 165)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fc8d62\",\n        style: {\n            width: p8,\n            background: \"rgb(252, 141, 98)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#8da0cb\",\n        style: {\n            width: p8,\n            background: \"rgb(141, 160, 203)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e78ac3\",\n        style: {\n            width: p8,\n            background: \"rgb(231, 138, 195)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#a6d854\",\n        style: {\n            width: p8,\n            background: \"rgb(166, 216, 84)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffd92f\",\n        style: {\n            width: p8,\n            background: \"rgb(255, 217, 47)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e5c494\",\n        style: {\n            width: p8,\n            background: \"rgb(229, 196, 148)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b3b3b3\",\n        style: {\n            width: p8,\n            background: \"rgb(179, 179, 179)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"set3\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#8dd3c7\",\n        style: {\n            width: p12,\n            background: \"rgb(141, 211, 199)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffffb3\",\n        style: {\n            width: p12,\n            background: \"rgb(255, 255, 179)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bebada\",\n        style: {\n            width: p12,\n            background: \"rgb(190, 186, 218)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fb8072\",\n        style: {\n            width: p12,\n            background: \"rgb(251, 128, 114)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#80b1d3\",\n        style: {\n            width: p12,\n            background: \"rgb(128, 177, 211)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fdb462\",\n        style: {\n            width: p12,\n            background: \"rgb(253, 180, 98)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b3de69\",\n        style: {\n            width: p12,\n            background: \"rgb(179, 222, 105)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fccde5\",\n        style: {\n            width: p12,\n            background: \"rgb(252, 205, 229)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d9d9d9\",\n        style: {\n            width: p12,\n            background: \"rgb(217, 217, 217)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bc80bd\",\n        style: {\n            width: p12,\n            background: \"rgb(188, 128, 189)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ccebc5\",\n        style: {\n            width: p12,\n            background: \"rgb(204, 235, 197)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffed6f\",\n        style: {\n            width: p12,\n            background: \"rgb(255, 237, 111)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"tableau10\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#4c78a8\",\n        style: {\n            width: p10,\n            background: \"rgb(76, 120, 168)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f58518\",\n        style: {\n            width: p10,\n            background: \"rgb(245, 133, 24)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e45756\",\n        style: {\n            width: p10,\n            background: \"rgb(228, 87, 86)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#72b7b2\",\n        style: {\n            width: p10,\n            background: \"rgb(114, 183, 178)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#54a24b\",\n        style: {\n            width: p10,\n            background: \"rgb(84, 162, 75)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#eeca3b\",\n        style: {\n            width: p10,\n            background: \"rgb(238, 202, 59)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b279a2\",\n        style: {\n            width: p10,\n            background: \"rgb(178, 121, 162)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ff9da6\",\n        style: {\n            width: p10,\n            background: \"rgb(255, 157, 166)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9d755d\",\n        style: {\n            width: p10,\n            background: \"rgb(157, 117, 93)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bab0ac\",\n        style: {\n            width: p10,\n            background: \"rgb(186, 176, 172)\"\n        }\n    }));\n    (0, _scheme.schemesJSX)[\"tableau20\"] = (0, _base.base).react.createElement(\"div\", {\n        className: \"swatch\"\n    }, (0, _base.base).react.createElement(\"div\", {\n        title: \"#4c78a8\",\n        style: {\n            width: p20,\n            background: \"rgb(76, 120, 168)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9ecae9\",\n        style: {\n            width: p20,\n            background: \"rgb(158, 202, 233)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f58518\",\n        style: {\n            width: p20,\n            background: \"rgb(245, 133, 24)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ffbf79\",\n        style: {\n            width: p20,\n            background: \"rgb(255, 191, 121)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#54a24b\",\n        style: {\n            width: p20,\n            background: \"rgb(84, 162, 75)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#88d27a\",\n        style: {\n            width: p20,\n            background: \"rgb(136, 210, 122)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b79a20\",\n        style: {\n            width: p20,\n            background: \"rgb(183, 154, 32)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#f2cf5b\",\n        style: {\n            width: p20,\n            background: \"rgb(242, 207, 91)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#439894\",\n        style: {\n            width: p20,\n            background: \"rgb(67, 152, 148)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#83bcb6\",\n        style: {\n            width: p20,\n            background: \"rgb(131, 188, 182)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#e45756\",\n        style: {\n            width: p20,\n            background: \"rgb(228, 87, 86)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#ff9d98\",\n        style: {\n            width: p20,\n            background: \"rgb(255, 157, 152)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#79706e\",\n        style: {\n            width: p20,\n            background: \"rgb(121, 112, 110)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#bab0ac\",\n        style: {\n            width: p20,\n            background: \"rgb(186, 176, 172)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d67195\",\n        style: {\n            width: p20,\n            background: \"rgb(214, 113, 149)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#fcbfd2\",\n        style: {\n            width: p20,\n            background: \"rgb(252, 191, 210)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#b279a2\",\n        style: {\n            width: p20,\n            background: \"rgb(178, 121, 162)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d6a5c9\",\n        style: {\n            width: p20,\n            background: \"rgb(214, 165, 201)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#9e765f\",\n        style: {\n            width: p20,\n            background: \"rgb(158, 118, 95)\"\n        }\n    }), (0, _base.base).react.createElement(\"div\", {\n        title: \"#d8b5a5\",\n        style: {\n            width: p20,\n            background: \"rgb(216, 181, 165)\"\n        }\n    }));\n    loaded = true;\n}\nfunction categorical(selected) {\n    if (!loaded) load();\n    return [\n        (0, _scheme.schemeOption)(selected, \"accent\"),\n        (0, _scheme.schemeOption)(selected, \"category10\"),\n        (0, _scheme.schemeOption)(selected, \"category20\"),\n        (0, _scheme.schemeOption)(selected, \"category20b\"),\n        (0, _scheme.schemeOption)(selected, \"category20c\"),\n        (0, _scheme.schemeOption)(selected, \"dark2\"),\n        (0, _scheme.schemeOption)(selected, \"paired\"),\n        (0, _scheme.schemeOption)(selected, \"pastel1\"),\n        (0, _scheme.schemeOption)(selected, \"pastel2\"),\n        (0, _scheme.schemeOption)(selected, \"set1\"),\n        (0, _scheme.schemeOption)(selected, \"set2\"),\n        (0, _scheme.schemeOption)(selected, \"set3\"),\n        (0, _scheme.schemeOption)(selected, \"tableau10\"),\n        (0, _scheme.schemeOption)(selected, \"tableau20\")\n    ];\n}\n\n},{\"../base\":\"b6Cy1\",\"./scheme\":\"fmqpd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fmqpd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"schemeOption\", ()=>schemeOption);\nparcelHelpers.export(exports, \"schemesJSX\", ()=>schemesJSX);\nfunction schemeOption(selected, scheme) {\n    return {\n        key: scheme,\n        text: scheme,\n        selected: selected === scheme,\n        scheme: scheme,\n        children: schemesJSX[scheme]\n    };\n}\nconst schemesJSX = {};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dfBEp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"diverging\", ()=>diverging);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _scheme = require(\"./scheme\");\nlet loaded = false;\nfunction load() {\n    (0, _scheme.schemesJSX)[\"blueorange\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-blueorange\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(5, 48, 97)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(34, 101, 163)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(75, 148, 196)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(143, 194, 221)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(205, 227, 238)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(242, 240, 235)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(253, 221, 179)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(248, 182, 100)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(221, 132, 31)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(178, 90, 9)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 59, 8)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-blueorange)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"brownbluegreen\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-brownbluegreen\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(84, 48, 5)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(139, 84, 15)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(188, 132, 53)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(222, 190, 123)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(242, 228, 192)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(238, 241, 234)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(195, 231, 226)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(127, 201, 191)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(57, 152, 143)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(10, 103, 95)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 60, 48)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-brownbluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"purplegreen\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplegreen\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(64, 0, 75)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(115, 47, 128)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(154, 109, 170)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(193, 164, 205)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(228, 210, 230)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(239, 240, 239)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(214, 238, 209)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(162, 215, 158)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(92, 173, 101)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(33, 120, 57)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"pinkyellowgreen\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-pinkyellowgreen\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(142, 1, 82)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(192, 38, 126)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(221, 114, 173)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(240, 179, 214)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(250, 221, 237)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(245, 243, 239)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(225, 242, 202)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(182, 222, 135)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(128, 187, 71)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(79, 145, 37)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(39, 100, 25)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-pinkyellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"purpleorange\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-purpleorange\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(45, 0, 75)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(85, 45, 132)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(129, 112, 172)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(176, 170, 208)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(215, 215, 233)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(243, 238, 234)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(253, 221, 179)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(248, 182, 100)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(221, 132, 31)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(178, 90, 9)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 59, 8)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purpleorange)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"redblue\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-redblue\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(172, 32, 47)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 96, 80)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(241, 163, 133)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(251, 215, 196)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(242, 239, 238)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(205, 227, 238)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(143, 194, 221)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(75, 148, 196)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(34, 101, 163)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(5, 48, 97)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"redgrey\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-redgrey\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(172, 32, 47)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 96, 80)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(241, 163, 133)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(252, 216, 197)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 244, 241)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(223, 223, 223)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(184, 184, 184)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(134, 134, 134)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(78, 78, 78)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(26, 26, 26)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redgrey)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"redyellowblue\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-redyellowblue\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(165, 0, 38)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(212, 50, 44)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(241, 110, 67)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 100)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 144)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 248, 193)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(220, 241, 236)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(171, 214, 232)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(117, 171, 208)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(74, 116, 180)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(49, 54, 149)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redyellowblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"redyellowgreen\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-redyellowgreen\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(165, 0, 38)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(212, 50, 44)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(241, 110, 67)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 99)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 141)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(249, 247, 174)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(215, 238, 142)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(164, 216, 110)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(100, 188, 97)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(34, 150, 79)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 104, 55)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redyellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"spectral\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-spectral\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(158, 1, 66)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(209, 60, 75)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(240, 112, 74)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 172, 99)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 221, 141)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 248, 176)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(224, 243, 161)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(169, 221, 162)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(105, 189, 169)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(66, 136, 181)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(94, 79, 162)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-spectral)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    loaded = true;\n}\nfunction diverging(selected) {\n    if (!loaded) load();\n    return [\n        (0, _scheme.schemeOption)(selected, \"blueorange\"),\n        (0, _scheme.schemeOption)(selected, \"brownbluegreen\"),\n        (0, _scheme.schemeOption)(selected, \"purplegreen\"),\n        (0, _scheme.schemeOption)(selected, \"pinkyellowgreen\"),\n        (0, _scheme.schemeOption)(selected, \"purpleorange\"),\n        (0, _scheme.schemeOption)(selected, \"redblue\"),\n        (0, _scheme.schemeOption)(selected, \"redgrey\"),\n        (0, _scheme.schemeOption)(selected, \"redyellowblue\"),\n        (0, _scheme.schemeOption)(selected, \"redyellowgreen\"),\n        (0, _scheme.schemeOption)(selected, \"spectral\")\n    ];\n}\n\n},{\"../base\":\"b6Cy1\",\"./scheme\":\"fmqpd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Blmq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dual\", ()=>dual);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nvar _scheme = require(\"./scheme\");\nlet loaded = false;\nfunction load() {\n    (0, _sanddanceReact.SandDance).colorSchemes.filter((cs)=>cs.colors.length === 2).map((binaryScheme, i)=>{\n        (0, _scheme.schemesJSX)[binaryScheme.scheme] = (0, _base.base).react.createElement(\"div\", {\n            className: \"swatch\"\n        }, binaryScheme.colors.map((color, j)=>(0, _base.base).react.createElement(\"div\", {\n                key: j,\n                title: color,\n                style: {\n                    width: \"50%\",\n                    backgroundColor: color\n                }\n            })));\n    });\n    loaded = true;\n}\nfunction dual(selected) {\n    if (!loaded) load();\n    return (0, _sanddanceReact.SandDance).colorSchemes.filter((cs)=>cs.colors.length === 2).map((binaryScheme, i)=>(0, _scheme.schemeOption)(selected, binaryScheme.scheme));\n}\n\n},{\"../base\":\"b6Cy1\",\"@msrvida/sanddance-react\":\"4uo3s\",\"./scheme\":\"fmqpd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"23nam\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"sequentialMultiHue\", ()=>sequentialMultiHue);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _scheme = require(\"./scheme\");\nlet loaded = false;\nfunction load() {\n    (0, _scheme.schemesJSX)[\"viridis\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-viridis\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#440154\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#482475\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#414487\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#355f8d\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#2a788e\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#21918c\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#22a884\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#44bf70\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#7ad151\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#bddf26\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fde725\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-viridis)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"inferno\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-inferno\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#000004\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#160b39\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#420a68\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#6a176e\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#932667\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#bc3754\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#dd513a\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f37819\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fca50a\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#f6d746\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fcffa4\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-inferno)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"magma\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-magma\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#000004\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#140e36\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#3b0f70\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#641a80\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#8c2981\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#b73779\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#de4968\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f7705c\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fe9f6d\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#fecf92\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#fcfdbf\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-magma)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"plasma\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-plasma\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"#0d0887\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"#41049d\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"#6a00a8\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"#8f0da4\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"#b12a90\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"#cc4778\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"#e16462\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"#f2844b\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"#fca636\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"#fcce25\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"#f0f921\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-plasma)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"bluegreen\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-bluegreen\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 253)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(232, 246, 249)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 239, 237)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(183, 228, 218)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(143, 211, 193)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(104, 194, 163)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(73, 177, 127)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 153, 89)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 127, 60)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 100, 41)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-bluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"bluepurple\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-bluepurple\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 253)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(228, 238, 245)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(204, 221, 236)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(178, 202, 225)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(156, 179, 213)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(143, 149, 198)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(140, 116, 181)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(137, 82, 165)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(133, 45, 143)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(115, 15, 113)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(77, 0, 75)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-bluepurple)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"greenblue\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-greenblue\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 240)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(229, 245, 223)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(211, 238, 206)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(189, 229, 191)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(158, 217, 187)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(123, 203, 196)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(88, 183, 205)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(57, 156, 198)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(29, 126, 183)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(11, 96, 161)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 64, 129)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greenblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"orangered\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-orangered\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 236)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 235, 207)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 220, 175)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(253, 202, 148)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(253, 176, 122)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(250, 142, 93)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(241, 108, 73)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(224, 69, 48)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(200, 29, 19)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(167, 4, 3)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 0, 0)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-orangered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"purplebluegreen\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplebluegreen\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 251)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 231, 242)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(219, 216, 234)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(190, 201, 226)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(152, 185, 217)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(105, 168, 207)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(64, 150, 192)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(25, 135, 159)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(3, 120, 119)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(1, 99, 83)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(1, 70, 54)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplebluegreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"purpleblue\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-purpleblue\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 251)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 234, 244)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(219, 218, 235)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(191, 201, 226)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(155, 185, 217)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(114, 168, 207)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(67, 148, 195)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(26, 125, 182)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(6, 103, 161)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(4, 82, 129)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(2, 56, 88)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purpleblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"purplered\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-purplered\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 244, 249)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(234, 227, 240)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(220, 201, 226)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(208, 170, 210)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(208, 138, 194)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(221, 99, 174)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(227, 56, 144)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(215, 28, 108)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(183, 11, 79)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(143, 2, 58)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(103, 0, 31)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purplered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"redpurple\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-redpurple\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 247, 243)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(253, 228, 225)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(252, 207, 204)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(251, 181, 188)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(249, 147, 176)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(243, 105, 163)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(224, 62, 152)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(192, 23, 136)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(153, 3, 124)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(112, 1, 116)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(73, 0, 106)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-redpurple)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"yellowgreenblue\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-yellowgreenblue\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 217)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(239, 249, 189)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(213, 238, 179)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(169, 221, 183)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(115, 201, 189)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(69, 180, 194)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(40, 151, 191)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(32, 115, 178)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(35, 78, 160)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(28, 49, 133)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 29, 88)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yellowgreenblue)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"yellowgreen\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-yellowgreen\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 229)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(247, 252, 196)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(228, 244, 172)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(199, 232, 155)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(162, 216, 138)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(120, 197, 120)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(78, 175, 99)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 148, 78)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 121, 63)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 96, 52)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 69, 41)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yellowgreen)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"yelloworangebrown\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-yelloworangebrown\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 229)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(255, 248, 196)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(254, 234, 161)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(254, 214, 118)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 186, 74)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 153, 44)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(238, 121, 24)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(216, 91, 10)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(183, 67, 4)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(143, 50, 4)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(102, 37, 6)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yelloworangebrown)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"yelloworangered\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-yelloworangered\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 204)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(255, 240, 169)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(254, 224, 135)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(254, 201, 101)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(254, 171, 75)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(253, 137, 60)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(250, 92, 46)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(236, 48, 35)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(211, 17, 33)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(175, 2, 37)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(128, 0, 38)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-yelloworangered)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    loaded = true;\n}\nfunction sequentialMultiHue(selected) {\n    if (!loaded) load();\n    return [\n        (0, _scheme.schemeOption)(selected, \"viridis\"),\n        (0, _scheme.schemeOption)(selected, \"inferno\"),\n        (0, _scheme.schemeOption)(selected, \"magma\"),\n        (0, _scheme.schemeOption)(selected, \"plasma\"),\n        (0, _scheme.schemeOption)(selected, \"bluegreen\"),\n        (0, _scheme.schemeOption)(selected, \"bluepurple\"),\n        (0, _scheme.schemeOption)(selected, \"greenblue\"),\n        (0, _scheme.schemeOption)(selected, \"orangered\"),\n        (0, _scheme.schemeOption)(selected, \"purplebluegreen\"),\n        (0, _scheme.schemeOption)(selected, \"purpleblue\"),\n        (0, _scheme.schemeOption)(selected, \"purplered\"),\n        (0, _scheme.schemeOption)(selected, \"redpurple\"),\n        (0, _scheme.schemeOption)(selected, \"yellowgreenblue\"),\n        (0, _scheme.schemeOption)(selected, \"yellowgreen\"),\n        (0, _scheme.schemeOption)(selected, \"yelloworangebrown\"),\n        (0, _scheme.schemeOption)(selected, \"yelloworangered\")\n    ];\n}\n\n},{\"../base\":\"b6Cy1\",\"./scheme\":\"fmqpd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dQZES\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"sequentialSingleHue\", ()=>sequentialSingleHue);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _scheme = require(\"./scheme\");\nlet loaded = false;\nfunction load() {\n    (0, _scheme.schemesJSX)[\"blues\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-blues\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 251, 255)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(227, 238, 249)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(207, 225, 242)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(181, 212, 233)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(147, 195, 223)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(109, 174, 213)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(75, 151, 201)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 126, 188)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(24, 100, 170)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(10, 74, 144)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(8, 48, 107)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-blues)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"greens\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-greens\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(247, 252, 245)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(232, 246, 227)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(211, 238, 205)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(183, 226, 177)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(151, 212, 148)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(115, 195, 120)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(77, 175, 98)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(47, 152, 79)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(21, 127, 59)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(3, 100, 41)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 68, 27)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greens)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"greys\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-greys\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 255, 255)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(242, 242, 242)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(226, 226, 226)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(206, 206, 206)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(180, 180, 180)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(151, 151, 151)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(122, 122, 122)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(95, 95, 95)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(64, 64, 64)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(30, 30, 30)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(0, 0, 0)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-greys)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"purples\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-purples\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(252, 251, 253)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(241, 239, 246)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(226, 225, 239)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(206, 206, 229)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(182, 181, 216)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(158, 155, 201)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(135, 130, 188)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(115, 99, 172)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(97, 64, 155)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(80, 31, 140)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(63, 0, 125)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-purples)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"reds\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-reds\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 245, 240)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 227, 214)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 201, 180)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(252, 170, 142)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(252, 138, 107)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(249, 105, 76)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(239, 69, 51)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(217, 39, 35)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(187, 21, 26)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(151, 11, 19)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(103, 0, 13)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-reds)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    (0, _scheme.schemesJSX)[\"oranges\"] = (0, _base.base).react.createElement(\"svg\", {\n        viewBox: \"0,0,1,1\",\n        preserveAspectRatio: \"none\"\n    }, (0, _base.base).react.createElement(\"defs\", null, (0, _base.base).react.createElement(\"linearGradient\", {\n        id: \"gradient-oranges\"\n    }, (0, _base.base).react.createElement(\"stop\", {\n        offset: \"0%\",\n        stopColor: \"rgb(255, 245, 235)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"10%\",\n        stopColor: \"rgb(254, 232, 211)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"20%\",\n        stopColor: \"rgb(253, 216, 179)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"30%\",\n        stopColor: \"rgb(253, 194, 140)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"40%\",\n        stopColor: \"rgb(253, 167, 98)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"50%\",\n        stopColor: \"rgb(251, 141, 61)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"60%\",\n        stopColor: \"rgb(242, 112, 29)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"70%\",\n        stopColor: \"rgb(226, 86, 9)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"80%\",\n        stopColor: \"rgb(196, 65, 3)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"90%\",\n        stopColor: \"rgb(159, 51, 3)\"\n    }), (0, _base.base).react.createElement(\"stop\", {\n        offset: \"100%\",\n        stopColor: \"rgb(127, 39, 4)\"\n    }))), (0, _base.base).react.createElement(\"rect\", {\n        fill: \"url(#gradient-oranges)\",\n        x: \"0\",\n        y: \"0\",\n        width: \"1\",\n        height: \"1\"\n    }));\n    loaded = true;\n}\nfunction sequentialSingleHue(selected) {\n    if (!loaded) load();\n    return [\n        (0, _scheme.schemeOption)(selected, \"blues\"),\n        (0, _scheme.schemeOption)(selected, \"greens\"),\n        (0, _scheme.schemeOption)(selected, \"greys\"),\n        (0, _scheme.schemeOption)(selected, \"purples\"),\n        (0, _scheme.schemeOption)(selected, \"reds\"),\n        (0, _scheme.schemeOption)(selected, \"oranges\")\n    ];\n}\n\n},{\"../base\":\"b6Cy1\",\"./scheme\":\"fmqpd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ix8tQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataBrowser\", ()=>DataBrowser);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _dataExporter = require(\"../controls/dataExporter\");\nvar _dataItem = require(\"../controls/dataItem\");\nvar _dataScope = require(\"../controls/dataScope\");\nvar _dropdown = require(\"../controls/dropdown\");\nvar _group = require(\"../controls/group\");\nvar _iconButton = require(\"../controls/iconButton\");\nvar _language = require(\"../language\");\nfunction DataBrowser(props) {\n    function activateRecord(newIndex) {\n        props.onActivate(props.data[newIndex], newIndex);\n    }\n    const { index  } = props;\n    const length = props.data && props.data.length || 0;\n    const dropdownRef = (0, _base.base).react.createRef();\n    props.explorer.dialogFocusHandler.focus = ()=>{\n        var _a;\n        return (_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.focus();\n    };\n    return (0, _base.base).react.createElement((0, _group.Group), {\n        label: (0, _language.strings).labelDataBrowser,\n        className: \"sanddance-dataIndex\"\n    }, (0, _base.base).react.createElement((0, _dropdown.Dropdown), {\n        componentRef: dropdownRef,\n        label: (0, _language.strings).labelDataScope,\n        collapseLabel: true,\n        options: [\n            {\n                key: (0, _dataScope.DataScopeId).AllData,\n                text: (0, _language.strings).selectDataSpanAll,\n                isSelected: props.selectedDataScope === (0, _dataScope.DataScopeId).AllData\n            },\n            {\n                key: (0, _dataScope.DataScopeId).FilteredData,\n                text: (0, _language.strings).selectDataSpanFilter,\n                isSelected: props.selectedDataScope === (0, _dataScope.DataScopeId).FilteredData\n            },\n            {\n                key: (0, _dataScope.DataScopeId).SelectedData,\n                text: (0, _language.strings).selectDataSpanSelection,\n                isSelected: props.selectedDataScope === (0, _dataScope.DataScopeId).SelectedData\n            }\n        ],\n        onChange: (e, o)=>{\n            props.onDataScopeClick(o.key);\n        }\n    }), !props.data && (0, _base.base).react.createElement(\"div\", {\n        dangerouslySetInnerHTML: {\n            __html: props.nullMessage\n        }\n    }), props.data && !props.data.length && (0, _base.base).react.createElement(\"div\", null, props.zeroMessage), !!length && (0, _base.base).react.createElement(\"div\", null, (0, _base.base).react.createElement(\"div\", {\n        className: \"index\"\n    }, (0, _base.base).react.createElement((0, _iconButton.IconButton), {\n        themePalette: props.themePalette,\n        iconName: \"ChevronLeftMed\",\n        onClick: (e)=>activateRecord(index <= 0 ? length - 1 : index - 1),\n        disabled: props.disabled || length === 1,\n        title: (0, _language.strings).buttonPrevDataItem\n    }), (0, _base.base).react.createElement(\"span\", null, (0, _language.strings).record(index + 1, length)), (0, _base.base).react.createElement((0, _iconButton.IconButton), {\n        themePalette: props.themePalette,\n        iconName: \"ChevronRightMed\",\n        onClick: (e)=>activateRecord(index >= length - 1 ? 0 : index + 1),\n        disabled: props.disabled || length === 1,\n        title: (0, _language.strings).buttonNextDataItem\n    })), !props.itemVisible && (0, _base.base).react.createElement(\"div\", {\n        className: \"item-filtered\"\n    }, (0, _language.strings).labelDataItemIsFiltered), (0, _base.base).react.createElement((0, _dataItem.DataItem), {\n        columns: props.columns,\n        item: props.data[index],\n        disabled: props.disabled,\n        onSearch: props.onSearch,\n        bingSearchDisabled: props.bingSearchDisabled\n    })), props.dataExportHandler && props.data && (0, _base.base).react.createElement((0, _dataExporter.DataExportPicker), {\n        theme: props.theme,\n        initializer: {\n            fileName: `${(0, _dataExporter.removeExtensions)(props.displayName)} (${props.data.length})`\n        },\n        data: props.data,\n        dataExportHandler: props.dataExportHandler,\n        disabled: props.disabled\n    }));\n}\n\n},{\"../base\":\"b6Cy1\",\"../controls/dataExporter\":\"avMLS\",\"../controls/dataItem\":\"3cRmh\",\"../controls/dataScope\":\"8FBlK\",\"../controls/dropdown\":\"iEkOh\",\"../controls/group\":\"e2GTU\",\"../controls/iconButton\":\"at9GX\",\"../language\":\"7qvdA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3cRmh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataItem\", ()=>DataItem);\nvar _base = require(\"../base\");\nvar _keycodes = require(\"../keycodes\");\nvar _language = require(\"../language\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction isNumber(value) {\n    if (typeof value === \"number\") return true;\n    if (!isNaN(value)) return true;\n    return false;\n}\nfunction isBoolean(value) {\n    if (typeof value === \"boolean\") return true;\n    if (typeof value === \"string\") switch(value.toLowerCase()){\n        case \"true\":\n        case \"false\":\n            return true;\n    }\n    return false;\n}\nfunction bingSearchLink(column, value) {\n    if (isNumber(value)) return null;\n    if (isBoolean(value)) return null;\n    if (column && column.stats.distinctValueCount === 2) return null;\n    return (0, _base.base).react.createElement(\"div\", {\n        className: \"bing-search\"\n    }, (0, _base.base).react.createElement(\"a\", {\n        href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n        target: \"_blank\",\n        title: (0, _language.strings).bingsearchDescription(value),\n        \"aria-label\": (0, _language.strings).bingsearchDescription(value)\n    }, (0, _language.strings).bingsearch));\n}\nfunction displayValue(value) {\n    switch(value){\n        case \"\":\n            return {\n                special: true,\n                display: (0, _language.strings).labelBlank\n            };\n        case null:\n            return {\n                special: true,\n                display: (0, _language.strings).labelNull\n            };\n        case true:\n            return {\n                special: true,\n                display: (0, _language.strings).labelTrue\n            };\n        case false:\n            return {\n                special: true,\n                display: (0, _language.strings).labelFalse\n            };\n        default:\n            if (typeof value === \"object\") {\n                if (value instanceof Date) {\n                    const d = value;\n                    return displayValue(d.input);\n                }\n                return {\n                    special: false,\n                    display: value.toLocaleString()\n                };\n            }\n            return {\n                special: false,\n                display: value\n            };\n    }\n}\nfunction displayValueElement(nvp) {\n    const d = displayValue(nvp.value);\n    if (d.special) return (0, _base.base).react.createElement(\"i\", null, d.display);\n    return d.display;\n}\nfunction DataItem(props) {\n    if (!props.item) return null;\n    const nameValuePairs = [];\n    for(let columnName in props.item){\n        if (columnName === (0, _sanddanceReact.SandDance).constants.GL_ORDINAL && !props.showSystemFields) continue;\n        if ((0, _sanddanceReact.SandDance).util.isInternalFieldName(columnName)) continue;\n        let nameValuePair = {\n            columnName,\n            value: props.item[columnName]\n        };\n        if (!props.bingSearchDisabled) nameValuePair.bingSearch = bingSearchLink(props.columns.filter((c)=>c.name === columnName)[0], props.item[columnName]);\n        nameValuePairs.push(nameValuePair);\n    }\n    return (0, _base.base).react.createElement(\"div\", {\n        className: \"sanddance-dataItem\"\n    }, nameValuePairs.map((nameValuePair, i)=>{\n        const ex = {\n            key: 0,\n            name: nameValuePair.columnName,\n            operator: \"==\",\n            value: nameValuePair.value\n        };\n        if (nameValuePair.value === null || nameValuePair.value === \"\") {\n            ex.operator = \"isnullorEmpty\";\n            delete ex.value;\n        }\n        const searchClick = (e)=>{\n            const search = {\n                key: 0,\n                expressions: [\n                    ex\n                ]\n            };\n            props.onSearch(e, [\n                search\n            ]);\n        };\n        const title = (0, _language.strings).tooltipSearch(nameValuePair.columnName, displayValue(nameValuePair.value).display);\n        return (0, _base.base).react.createElement(\"div\", {\n            key: i,\n            onClick: !props.disabled ? searchClick : null,\n            title: title,\n            onKeyUp: (e)=>{\n                if (e.keyCode === (0, _keycodes.KeyCodes).ENTER) searchClick(e);\n            },\n            tabIndex: 0,\n            className: \"name-value\"\n        }, (0, _base.base).react.createElement(\"div\", {\n            className: \"column-name\"\n        }, nameValuePair.columnName), (0, _base.base).react.createElement(\"div\", {\n            className: \"column-value\"\n        }, displayValueElement(nameValuePair)), nameValuePair.bingSearch);\n    }));\n}\n\n},{\"../base\":\"b6Cy1\",\"../keycodes\":\"29F8s\",\"../language\":\"7qvdA\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"29F8s\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"KeyCodes\", ()=>KeyCodes);\nconst KeyCodes = {\n    ENTER: 13\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"copub\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"History\", ()=>History);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"../base\");\nvar _group = require(\"../controls/group\");\nvar _keycodes = require(\"../keycodes\");\nvar _language = require(\"../language\");\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction History(props) {\n    return (0, _base.base).react.createElement((0, _group.Group), {\n        label: (0, _language.strings).labelHistory,\n        className: \"sanddance-history\"\n    }, (0, _base.base).react.createElement(\"ol\", null, props.historyItems.map((hi, i)=>{\n        let ref;\n        if (i === props.historyIndex) {\n            ref = (0, _base.base).react.createRef();\n            props.explorer.dialogFocusHandler.focus = ()=>{\n                var _a;\n                (_a = ref.current) === null || _a === void 0 || _a.focus();\n            };\n        }\n        return (0, _base.base).react.createElement(\"li\", {\n            key: i,\n            className: (0, _sanddanceReact.util).classList(i === props.historyIndex && \"selected\"),\n            onKeyUp: (e)=>{\n                if (e.keyCode === (0, _keycodes.KeyCodes).ENTER) props.redo(i);\n            }\n        }, (0, _base.base).react.createElement((0, _base.base).fluentUI.DefaultButton, {\n            className: \"sanddance-history-button\",\n            componentRef: ref,\n            text: hi.label,\n            onClick: ()=>props.redo(i)\n        }));\n    })));\n}\n\n},{\"../base\":\"b6Cy1\",\"../controls/group\":\"e2GTU\",\"../keycodes\":\"29F8s\",\"../language\":\"7qvdA\",\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6LRUK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getPosition\", ()=>getPosition);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nfunction hasClientXY(e) {\n    if (e && e.clientX !== undefined && e.clientX !== undefined) return {\n        top: e.clientY,\n        left: e.clientX\n    };\n}\nfunction getPosition(e) {\n    let xy = hasClientXY(e);\n    if (xy) return xy;\n    const te = e;\n    if (te === null || te === void 0 ? void 0 : te.touches) for(let i = 0; i < te.touches.length; i++){\n        let xy = hasClientXY(te.touches[i]);\n        if (xy) return xy;\n    }\n    const el = e.target;\n    if (el && el.getClientRects) return el.getClientRects()[0];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bHInZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initPrefs\", ()=>initPrefs);\nparcelHelpers.export(exports, \"saveSignalValuePref\", ()=>saveSignalValuePref);\nparcelHelpers.export(exports, \"copyPrefToNewState\", ()=>copyPrefToNewState);\nparcelHelpers.export(exports, \"savePref\", ()=>savePref);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction initPrefs(prefs, partialInsight) {\n    if (partialInsight) {\n        const specTypePrefs = prefs[partialInsight.chart] || {};\n        prefs[partialInsight.chart] = specTypePrefs;\n        for(let _role in partialInsight.columns){\n            let role = _role;\n            if (role === \"color\" || role === \"x\") {\n                let rolePrefs = specTypePrefs[role] || {};\n                specTypePrefs[role] = rolePrefs;\n                let column = partialInsight.columns[role];\n                let copySignalValue = (signalName)=>{\n                    if (partialInsight.signalValues && partialInsight.signalValues[signalName] && rolePrefs[column]) {\n                        const signalValues = rolePrefs[column].signalValues || {};\n                        signalValues[signalName] = partialInsight.signalValues[signalName];\n                        rolePrefs[column].signalValues = signalValues;\n                    }\n                };\n                switch(role){\n                    case \"color\":\n                        rolePrefs[column] = {\n                            scheme: partialInsight.scheme,\n                            colorBin: partialInsight.colorBin\n                        };\n                        copySignalValue((0, _sanddanceReact.SandDance).constants.SignalNames.ColorBinCount);\n                        break;\n                    case \"x\":\n                        copySignalValue((0, _sanddanceReact.SandDance).constants.SignalNames.XBins);\n                        break;\n                }\n            }\n        }\n    }\n}\nfunction saveSignalValuePref(prefs, chart, role, column, signalName, signalValue) {\n    const partialInsight = savePref(prefs, chart, role, column, {\n        signalValues: {}\n    });\n    partialInsight.signalValues[signalName] = signalValue;\n}\nfunction copyPrefToNewState(prefs, chart, role, columnName) {\n    const specTypePrefs = (0, _sanddanceReact.SandDance).VegaDeckGl.util.deepMerge({}, prefs[\"*\"], prefs[chart]);\n    const rolePrefs = (0, _sanddanceReact.SandDance).VegaDeckGl.util.deepMerge({}, specTypePrefs[\"*\"], specTypePrefs[role]);\n    const partialInsight = (0, _sanddanceReact.SandDance).VegaDeckGl.util.deepMerge({}, rolePrefs[\"*\"], rolePrefs[columnName]);\n    return partialInsight;\n}\nfunction savePref(prefs, chart, role, column, partialInsight) {\n    const SpecTypePrefs = prefs[chart] || {};\n    prefs[chart] = SpecTypePrefs;\n    const rolePrefs = SpecTypePrefs[role] || {};\n    SpecTypePrefs[role] = rolePrefs;\n    rolePrefs[column] = (0, _sanddanceReact.SandDance).VegaDeckGl.util.deepMerge({}, rolePrefs[column], partialInsight);\n    return rolePrefs[column];\n}\n\n},{\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4C7Xs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"toggleSearch\", ()=>toggleSearch);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _sanddanceReact = require(\"@msrvida/sanddance-react\");\nfunction comparableGroup(group) {\n    return Object.assign(Object.assign({}, group), {\n        clause: null\n    });\n}\nfunction compareGroup(a, b) {\n    return (0, _sanddanceReact.SandDance).searchExpression.compareGroup(comparableGroup(a), comparableGroup(b));\n}\nfunction toggleSearch(haystack, needle) {\n    const groups = [];\n    let found = false;\n    //look for item in all\n    haystack.forEach((group)=>{\n        if (compareGroup(group, needle)) //if it exists, don't add it\n        found = true;\n        else groups.push(group);\n    });\n    return {\n        groups,\n        found\n    };\n}\n\n},{\"@msrvida/sanddance-react\":\"4uo3s\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8ePka\":[function(require,module,exports) {\nmodule.exports = React;\n\n},{}],\"j73oT\":[function(require,module,exports) {\nmodule.exports = ReactDOM;\n\n},{}],\"jSYVB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fluentUI\", ()=>fluentUI);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _button = require(\"@fluentui/react/lib/Button\");\nvar _choiceGroup = require(\"@fluentui/react/lib/ChoiceGroup\");\nvar _comboBox = require(\"@fluentui/react/lib/ComboBox\");\nvar _commandBar = require(\"@fluentui/react/lib/CommandBar\");\nvar _contextualMenu = require(\"@fluentui/react/lib/ContextualMenu\");\nvar _utilities = require(\"@fluentui/react/lib/Utilities\");\nvar _dialog = require(\"@fluentui/react/lib/Dialog\");\nvar _dropdown = require(\"@fluentui/react/lib/Dropdown\");\nvar _styling = require(\"@fluentui/react/lib/Styling\");\nvar _icon = require(\"@fluentui/react/lib/Icon\");\nvar _icons = require(\"@fluentui/react/lib/Icons\");\nvar _label = require(\"@fluentui/react/lib/Label\");\nvar _modal = require(\"@fluentui/react/lib/Modal\");\nvar _slider = require(\"@fluentui/react/lib/Slider\");\nvar _spinner = require(\"@fluentui/react/lib/Spinner\");\nvar _textField = require(\"@fluentui/react/lib/TextField\");\nvar _toggle = require(\"@fluentui/react/lib/Toggle\");\n(0, _icons.initializeIcons)();\nconst fluentUI = {\n    ActionButton: (0, _button.ActionButton),\n    ChoiceGroup: (0, _choiceGroup.ChoiceGroup),\n    ComboBox: (0, _comboBox.ComboBox),\n    CommandBar: (0, _commandBar.CommandBar),\n    ContextualMenuItemType: (0, _contextualMenu.ContextualMenuItemType),\n    Customizer: (0, _utilities.Customizer),\n    DefaultButton: (0, _button.DefaultButton),\n    Dialog: (0, _dialog.Dialog),\n    DialogFooter: (0, _dialog.DialogFooter),\n    DialogType: (0, _dialog.DialogType),\n    Dropdown: (0, _dropdown.Dropdown),\n    DropdownMenuItemType: (0, _dropdown.DropdownMenuItemType),\n    Icon: (0, _icon.Icon),\n    IconButton: (0, _button.IconButton),\n    getFocusStyle: (0, _styling.getFocusStyle),\n    getTheme: (0, _styling.getTheme),\n    Label: (0, _label.Label),\n    loadTheme: (0, _styling.loadTheme),\n    Modal: (0, _modal.Modal),\n    PrimaryButton: (0, _button.PrimaryButton),\n    Slider: (0, _slider.Slider),\n    Spinner: (0, _spinner.Spinner),\n    SpinnerSize: (0, _spinner.SpinnerSize),\n    TextField: (0, _textField.TextField),\n    Toggle: (0, _toggle.Toggle)\n};\n\n},{\"@fluentui/react/lib/Button\":\"c7Gp7\",\"@fluentui/react/lib/ChoiceGroup\":\"dcM7C\",\"@fluentui/react/lib/ComboBox\":\"aEx6o\",\"@fluentui/react/lib/CommandBar\":\"cnCTi\",\"@fluentui/react/lib/ContextualMenu\":\"5W7tr\",\"@fluentui/react/lib/Utilities\":\"d0PNn\",\"@fluentui/react/lib/Dialog\":\"lhftW\",\"@fluentui/react/lib/Dropdown\":\"dEJVZ\",\"@fluentui/react/lib/Styling\":\"fmg3v\",\"@fluentui/react/lib/Icon\":\"8rJ2a\",\"@fluentui/react/lib/Icons\":\"l6hLT\",\"@fluentui/react/lib/Label\":\"f54uM\",\"@fluentui/react/lib/Modal\":\"fyJ0D\",\"@fluentui/react/lib/Slider\":\"brPQz\",\"@fluentui/react/lib/Spinner\":\"dTo6e\",\"@fluentui/react/lib/TextField\":\"6eVOz\",\"@fluentui/react/lib/Toggle\":\"hbvPy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c7Gp7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _button = require(\"office-ui-fabric-react/lib/Button\");\nparcelHelpers.exportAll(_button, exports);\n\n},{\"office-ui-fabric-react/lib/Button\":\"eMzbU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eMzbU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Button/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Button/index\":\"2lSz0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2lSz0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _baseButton = require(\"./BaseButton\");\nparcelHelpers.exportAll(_baseButton, exports);\nvar _buttonTypes = require(\"./Button.types\");\nparcelHelpers.exportAll(_buttonTypes, exports);\nvar _button = require(\"./Button\");\nparcelHelpers.exportAll(_button, exports);\nvar _actionButton = require(\"./ActionButton/ActionButton\");\nparcelHelpers.exportAll(_actionButton, exports);\nvar _commandBarButton = require(\"./CommandBarButton/CommandBarButton\");\nparcelHelpers.exportAll(_commandBarButton, exports);\nvar _commandButton = require(\"./CommandButton/CommandButton\");\nparcelHelpers.exportAll(_commandButton, exports);\nvar _compoundButton = require(\"./CompoundButton/CompoundButton\");\nparcelHelpers.exportAll(_compoundButton, exports);\nvar _defaultButton = require(\"./DefaultButton/DefaultButton\");\nparcelHelpers.exportAll(_defaultButton, exports);\nvar _messageBarButton = require(\"./MessageBarButton/MessageBarButton\");\nparcelHelpers.exportAll(_messageBarButton, exports);\nvar _primaryButton = require(\"./PrimaryButton/PrimaryButton\");\nparcelHelpers.exportAll(_primaryButton, exports);\nvar _iconButton = require(\"./IconButton/IconButton\");\nparcelHelpers.exportAll(_iconButton, exports);\nvar _splitButtonClassNames = require(\"./SplitButton/SplitButton.classNames\");\nparcelHelpers.exportAll(_splitButtonClassNames, exports);\n\n},{\"./BaseButton\":\"ggNpu\",\"./Button.types\":\"dg4FU\",\"./Button\":\"fbC88\",\"./ActionButton/ActionButton\":\"l59h4\",\"./CommandBarButton/CommandBarButton\":\"kxrca\",\"./CommandButton/CommandButton\":\"kW4vm\",\"./CompoundButton/CompoundButton\":\"j4YIe\",\"./DefaultButton/DefaultButton\":\"2lgOO\",\"./MessageBarButton/MessageBarButton\":\"68g1F\",\"./PrimaryButton/PrimaryButton\":\"82w7g\",\"./IconButton/IconButton\":\"lczvw\",\"./SplitButton/SplitButton.classNames\":\"8kuHQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ggNpu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"BaseButton\", ()=>BaseButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _icon = require(\"../../Icon\");\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nvar _contextualMenu = require(\"../../ContextualMenu\");\nvar _baseButtonClassNames = require(\"./BaseButton.classNames\");\nvar _splitButtonClassNames = require(\"./SplitButton/SplitButton.classNames\");\nvar _keytipData = require(\"../../KeytipData\");\nvar TouchIdleDelay = 500; /* ms */ \nvar COMPONENT_NAME = \"BaseButton\";\n/**\n * {@docCategory Button}\n */ var BaseButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(BaseButton1, _super);\n    function BaseButton1(props1) {\n        var _this = _super.call(this, props1) || this;\n        _this._buttonElement = _react.createRef();\n        _this._splitButtonContainer = _react.createRef();\n        _this._mergedRef = (0, _utilities.createMergedRef)();\n        _this._renderedVisibleMenu = false;\n        _this._getMemoizedMenuButtonKeytipProps = (0, _utilities.memoizeFunction)(function(keytipProps) {\n            return (0, _tslib.__assign)((0, _tslib.__assign)({}, keytipProps), {\n                hasMenu: true\n            });\n        });\n        _this._onRenderIcon = function(buttonProps, defaultRender) {\n            var iconProps = _this.props.iconProps;\n            if (iconProps && (iconProps.iconName !== undefined || iconProps.imageProps)) {\n                var className = iconProps.className, imageProps = iconProps.imageProps, rest = (0, _tslib.__rest)(iconProps, [\n                    \"className\",\n                    \"imageProps\"\n                ]);\n                // If the styles prop is specified as part of iconProps, fall back to regular Icon as FontIcon and ImageIcon\n                // do not have this prop.\n                if (iconProps.styles) return _react.createElement((0, _icon.Icon), (0, _tslib.__assign)({\n                    className: (0, _utilities.css)(_this._classNames.icon, className),\n                    imageProps: imageProps\n                }, rest));\n                if (iconProps.iconName) return _react.createElement((0, _icon.FontIcon), (0, _tslib.__assign)({\n                    className: (0, _utilities.css)(_this._classNames.icon, className)\n                }, rest));\n                if (imageProps) return _react.createElement((0, _icon.ImageIcon), (0, _tslib.__assign)({\n                    className: (0, _utilities.css)(_this._classNames.icon, className),\n                    imageProps: imageProps\n                }, rest));\n            }\n            return null;\n        };\n        _this._onRenderTextContents = function() {\n            var _a = _this.props, text = _a.text, children = _a.children, // eslint-disable-next-line deprecation/deprecation\n            _b = _a.secondaryText, // eslint-disable-next-line deprecation/deprecation\n            secondaryText = _b === void 0 ? _this.props.description : _b, _c = _a.onRenderText, onRenderText = _c === void 0 ? _this._onRenderText : _c, _d = _a.onRenderDescription, onRenderDescription = _d === void 0 ? _this._onRenderDescription : _d;\n            if (text || typeof children === \"string\" || secondaryText) return _react.createElement(\"span\", {\n                className: _this._classNames.textContainer\n            }, onRenderText(_this.props, _this._onRenderText), onRenderDescription(_this.props, _this._onRenderDescription));\n            return [\n                onRenderText(_this.props, _this._onRenderText),\n                onRenderDescription(_this.props, _this._onRenderDescription)\n            ];\n        };\n        _this._onRenderText = function() {\n            var text = _this.props.text;\n            var children = _this.props.children;\n            // For backwards compat, we should continue to take in the text content from children.\n            if (text === undefined && typeof children === \"string\") text = children;\n            if (_this._hasText()) return _react.createElement(\"span\", {\n                key: _this._labelId,\n                className: _this._classNames.label,\n                id: _this._labelId\n            }, text);\n            return null;\n        };\n        _this._onRenderChildren = function() {\n            var children = _this.props.children;\n            // If children is just a string, either it or the text will be rendered via onRenderLabel\n            // If children is another component, it will be rendered after text\n            if (typeof children === \"string\") return null;\n            return children;\n        };\n        _this._onRenderDescription = function(props) {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a = props.secondaryText, secondaryText = _a === void 0 ? _this.props.description : _a;\n            // ms-Button-description is only shown when the button type is compound.\n            // In other cases it will not be displayed.\n            return secondaryText ? _react.createElement(\"span\", {\n                key: _this._descriptionId,\n                className: _this._classNames.description,\n                id: _this._descriptionId\n            }, secondaryText) : null;\n        };\n        _this._onRenderAriaDescription = function() {\n            var ariaDescription = _this.props.ariaDescription;\n            // If ariaDescription is given, descriptionId will be assigned to ariaDescriptionSpan,\n            // otherwise it will be assigned to descriptionSpan.\n            return ariaDescription ? _react.createElement(\"span\", {\n                className: _this._classNames.screenReaderText,\n                id: _this._ariaDescriptionId\n            }, ariaDescription) : null;\n        };\n        _this._onRenderMenuIcon = function(props) {\n            var menuIconProps = _this.props.menuIconProps;\n            return _react.createElement((0, _icon.FontIcon), (0, _tslib.__assign)({\n                iconName: \"ChevronDown\"\n            }, menuIconProps, {\n                className: _this._classNames.menuIcon\n            }));\n        };\n        _this._onRenderMenu = function(menuProps) {\n            var MenuType = _this.props.menuAs ? (0, _utilities.composeComponentAs)(_this.props.menuAs, (0, _contextualMenu.ContextualMenu)) : (0, _contextualMenu.ContextualMenu);\n            return _react.createElement(MenuType, (0, _tslib.__assign)({}, menuProps));\n        };\n        _this._onDismissMenu = function(ev) {\n            var menuProps = _this.props.menuProps;\n            if (menuProps && menuProps.onDismiss) menuProps.onDismiss(ev);\n            if (!ev || !ev.defaultPrevented) _this._dismissMenu();\n        };\n        _this._dismissMenu = function() {\n            _this._menuShouldFocusOnMount = undefined;\n            _this._menuShouldFocusOnContainer = undefined;\n            _this.setState({\n                menuHidden: true\n            });\n        };\n        _this._openMenu = function(shouldFocusOnContainer, shouldFocusOnMount) {\n            if (shouldFocusOnMount === void 0) shouldFocusOnMount = true;\n            if (_this.props.menuProps) {\n                _this._menuShouldFocusOnContainer = shouldFocusOnContainer;\n                _this._menuShouldFocusOnMount = shouldFocusOnMount;\n                _this._renderedVisibleMenu = true;\n                _this.setState({\n                    menuHidden: false\n                });\n            }\n        };\n        _this._onToggleMenu = function(shouldFocusOnContainer) {\n            var shouldFocusOnMount = true;\n            if (_this.props.menuProps && _this.props.menuProps.shouldFocusOnMount === false) shouldFocusOnMount = false;\n            _this.state.menuHidden ? _this._openMenu(shouldFocusOnContainer, shouldFocusOnMount) : _this._dismissMenu();\n        };\n        _this._onSplitContainerFocusCapture = function(ev) {\n            var container = _this._splitButtonContainer.current;\n            // If the target is coming from the portal we do not need to set focus on the container.\n            if (!container || ev.target && (0, _utilities.portalContainsElement)(ev.target, container)) return;\n            // We should never be able to focus the individual buttons in a split button. Focus\n            // should always remain on the container.\n            container.focus();\n        };\n        _this._onSplitButtonPrimaryClick = function(ev) {\n            if (!_this.state.menuHidden) _this._dismissMenu();\n            if (!_this._processingTouch && _this.props.onClick) _this.props.onClick(ev);\n            else if (_this._processingTouch) _this._onMenuClick(ev);\n        };\n        _this._onKeyDown = function(ev) {\n            // explicity cancelling event so click won't fire after this\n            if (_this.props.disabled && (ev.which === (0, _utilities.KeyCodes).enter || ev.which === (0, _utilities.KeyCodes).space)) {\n                ev.preventDefault();\n                ev.stopPropagation();\n            } else if (!_this.props.disabled) {\n                if (_this.props.menuProps) _this._onMenuKeyDown(ev);\n                else if (_this.props.onKeyDown !== undefined) _this.props.onKeyDown(ev); // not cancelling event because it's not disabled\n            }\n        };\n        _this._onKeyUp = function(ev) {\n            if (!_this.props.disabled && _this.props.onKeyUp !== undefined) _this.props.onKeyUp(ev); // not cancelling event because it's not disabled\n        };\n        _this._onKeyPress = function(ev) {\n            if (!_this.props.disabled && _this.props.onKeyPress !== undefined) _this.props.onKeyPress(ev); // not cancelling event because it's not disabled\n        };\n        _this._onMouseUp = function(ev) {\n            if (!_this.props.disabled && _this.props.onMouseUp !== undefined) _this.props.onMouseUp(ev); // not cancelling event because it's not disabled\n        };\n        _this._onMouseDown = function(ev) {\n            if (!_this.props.disabled && _this.props.onMouseDown !== undefined) _this.props.onMouseDown(ev); // not cancelling event because it's not disabled\n        };\n        _this._onClick = function(ev) {\n            if (!_this.props.disabled) {\n                if (_this.props.menuProps) _this._onMenuClick(ev);\n                else if (_this.props.onClick !== undefined) _this.props.onClick(ev); // not cancelling event because it's not disabled\n            }\n        };\n        _this._onSplitButtonContainerKeyDown = function(ev) {\n            if (ev.which === (0, _utilities.KeyCodes).enter || ev.which === (0, _utilities.KeyCodes).space) {\n                if (_this._buttonElement.current) {\n                    _this._buttonElement.current.click();\n                    ev.preventDefault();\n                    ev.stopPropagation();\n                }\n            } else _this._onMenuKeyDown(ev);\n        };\n        _this._onMenuKeyDown = function(ev) {\n            if (_this.props.disabled) return;\n            if (_this.props.onKeyDown) _this.props.onKeyDown(ev);\n            var isUp = ev.which === (0, _utilities.KeyCodes).up;\n            var isDown = ev.which === (0, _utilities.KeyCodes).down;\n            if (!ev.defaultPrevented && _this._isValidMenuOpenKey(ev)) {\n                var onMenuClick = _this.props.onMenuClick;\n                if (onMenuClick) onMenuClick(ev, _this.props);\n                _this._onToggleMenu(false);\n                ev.preventDefault();\n                ev.stopPropagation();\n            }\n            if (ev.which === (0, _utilities.KeyCodes).enter || ev.which === (0, _utilities.KeyCodes).space) // We manually set the focus visibility to true if opening via Enter or Space to account for the scenario where\n            // a user clicks on the button, closes the menu and then opens it via keyboard. In this scenario our default logic\n            // for setting focus visibility is not triggered since there is no keyboard navigation present beforehand.\n            (0, _utilities.setFocusVisibility)(true, ev.target);\n            if (!(ev.altKey || ev.metaKey) && (isUp || isDown)) // Suppose a menu, with shouldFocusOnMount: false, is open, and user wants to keyboard to the menu items\n            // We need to re-render the menu with shouldFocusOnMount as true.\n            {\n                if (!_this.state.menuHidden && _this.props.menuProps) {\n                    var currentShouldFocusOnMount = _this._menuShouldFocusOnMount !== undefined ? _this._menuShouldFocusOnMount : _this.props.menuProps.shouldFocusOnMount;\n                    if (!currentShouldFocusOnMount) {\n                        ev.preventDefault();\n                        ev.stopPropagation();\n                        _this._menuShouldFocusOnMount = true;\n                        _this.forceUpdate();\n                    }\n                }\n            }\n        };\n        _this._onTouchStart = function() {\n            if (_this._isSplitButton && _this._splitButtonContainer.current && !(\"onpointerdown\" in _this._splitButtonContainer.current)) _this._handleTouchAndPointerEvent();\n        };\n        _this._onMenuClick = function(ev) {\n            var onMenuClick = _this.props.onMenuClick;\n            if (onMenuClick) onMenuClick(ev, _this.props);\n            if (!ev.defaultPrevented) {\n                // When Edge + Narrator are used together (regardless of if the button is in a form or not), pressing\n                // \"Enter\" fires this method and not _onMenuKeyDown. Checking ev.nativeEvent.detail differentiates\n                // between a real click event and a keypress event (detail should be the number of mouse clicks).\n                // ...Plot twist! For a real click event in IE 11, detail is always 0 (Edge sets it properly to 1).\n                // So we also check the pointerType property, which both Edge and IE set to \"mouse\" for real clicks\n                // and \"\" for pressing \"Enter\" with Narrator on.\n                var shouldFocusOnContainer = ev.nativeEvent.detail !== 0 || ev.nativeEvent.pointerType === \"mouse\";\n                _this._onToggleMenu(shouldFocusOnContainer);\n                ev.preventDefault();\n                ev.stopPropagation();\n            }\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._events = new (0, _utilities.EventGroup)(_this);\n        (0, _utilities.warnConditionallyRequiredProps)(COMPONENT_NAME, props1, [\n            \"menuProps\",\n            \"onClick\"\n        ], \"split\", _this.props.split);\n        (0, _utilities.warnDeprecations)(COMPONENT_NAME, props1, {\n            rootProps: undefined,\n            description: \"secondaryText\",\n            toggled: \"checked\"\n        });\n        _this._labelId = (0, _utilities.getId)();\n        _this._descriptionId = (0, _utilities.getId)();\n        _this._ariaDescriptionId = (0, _utilities.getId)();\n        _this.state = {\n            menuHidden: true\n        };\n        return _this;\n    }\n    Object.defineProperty(BaseButton1.prototype, \"_isSplitButton\", {\n        get: function() {\n            return !!this.props.menuProps && !!this.props.onClick && this.props.split === true;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    BaseButton1.prototype.render = function() {\n        var _a;\n        var _b = this.props, ariaDescription = _b.ariaDescription, ariaLabel = _b.ariaLabel, ariaHidden = _b.ariaHidden, className = _b.className, disabled = _b.disabled, allowDisabledFocus = _b.allowDisabledFocus, primaryDisabled = _b.primaryDisabled, // eslint-disable-next-line deprecation/deprecation\n        _c = _b.secondaryText, // eslint-disable-next-line deprecation/deprecation\n        secondaryText = _c === void 0 ? this.props.description : _c, href = _b.href, iconProps = _b.iconProps, menuIconProps = _b.menuIconProps, styles = _b.styles, checked = _b.checked, variantClassName = _b.variantClassName, theme = _b.theme, toggle = _b.toggle, getClassNames = _b.getClassNames, role = _b.role;\n        var menuHidden = this.state.menuHidden;\n        // Button is disabled if the whole button (in case of splitButton is disabled) or if the primary action is disabled\n        var isPrimaryButtonDisabled = disabled || primaryDisabled;\n        this._classNames = getClassNames ? getClassNames(theme, className, variantClassName, iconProps && iconProps.className, menuIconProps && menuIconProps.className, isPrimaryButtonDisabled, checked, !menuHidden, !!this.props.menuProps, this.props.split, !!allowDisabledFocus) : (0, _baseButtonClassNames.getBaseButtonClassNames)(theme, styles, className, variantClassName, iconProps && iconProps.className, menuIconProps && menuIconProps.className, isPrimaryButtonDisabled, !!this.props.menuProps, checked, !menuHidden, this.props.split);\n        var _d = this, _ariaDescriptionId = _d._ariaDescriptionId, _labelId = _d._labelId, _descriptionId = _d._descriptionId;\n        // Anchor tag cannot be disabled hence in disabled state rendering\n        // anchor button as normal button\n        var renderAsAnchor = !isPrimaryButtonDisabled && !!href;\n        var tag = renderAsAnchor ? \"a\" : \"button\";\n        var nativeProps = (0, _utilities.getNativeProps)(// eslint-disable-next-line deprecation/deprecation\n        (0, _utilities.assign)(renderAsAnchor ? {} : {\n            type: \"button\"\n        }, this.props.rootProps, this.props), renderAsAnchor ? (0, _utilities.anchorProperties) : (0, _utilities.buttonProperties), [\n            \"disabled\", \n        ]);\n        // Check for ariaLabel passed in via Button props, and fall back to aria-label passed in via native props\n        var resolvedAriaLabel = ariaLabel || nativeProps[\"aria-label\"];\n        // Check for ariaDescription, secondaryText or aria-describedby in the native props to determine source of\n        // aria-describedby. Otherwise default to undefined so property does not appear in output.\n        var ariaDescribedBy = undefined;\n        if (ariaDescription) ariaDescribedBy = _ariaDescriptionId;\n        else if (secondaryText && this.props.onRenderDescription !== (0, _utilities.nullRender)) // for buttons like CompoundButton with a valid onRenderDescription, we need to set an ariaDescribedBy\n        // for buttons that do not render anything (via nullRender), we should not set an ariaDescribedBy\n        ariaDescribedBy = _descriptionId;\n        else if (nativeProps[\"aria-describedby\"]) ariaDescribedBy = nativeProps[\"aria-describedby\"];\n        // If an explicit ariaLabel is given, use that as the label and we're done.\n        // If an explicit aria-labelledby is given, use that and we're done.\n        // If any kind of description is given (which will end up as an aria-describedby attribute),\n        // set the labelledby element. Otherwise, the button is labeled implicitly by the descendent\n        // text on the button (if it exists). Never set both aria-label and aria-labelledby.\n        var ariaLabelledBy = undefined;\n        if (!resolvedAriaLabel) {\n            if (nativeProps[\"aria-labelledby\"]) ariaLabelledBy = nativeProps[\"aria-labelledby\"];\n            else if (ariaDescribedBy) ariaLabelledBy = this._hasText() ? _labelId : undefined;\n        }\n        var dataIsFocusable = this.props[\"data-is-focusable\"] === false || disabled && !allowDisabledFocus || this._isSplitButton ? false : true;\n        var isCheckboxTypeRole = role === \"menuitemcheckbox\" || role === \"checkbox\";\n        // if isCheckboxTypeRole, always return a checked value.\n        // Otherwise only return checked value if toggle is set to true.\n        // This is because role=\"checkbox\" always needs to have an aria-checked value\n        // but our checked prop only sets aria-pressed if we mark the button as a toggle=\"true\"\n        var checkedOrPressedValue = isCheckboxTypeRole ? !!checked : toggle === true ? !!checked : undefined;\n        var buttonProps = (0, _utilities.assign)(nativeProps, (_a = {\n            className: this._classNames.root,\n            // eslint-disable-next-line deprecation/deprecation\n            ref: this._mergedRef(this.props.elementRef, this._buttonElement),\n            disabled: isPrimaryButtonDisabled && !allowDisabledFocus,\n            onKeyDown: this._onKeyDown,\n            onKeyPress: this._onKeyPress,\n            onKeyUp: this._onKeyUp,\n            onMouseDown: this._onMouseDown,\n            onMouseUp: this._onMouseUp,\n            onClick: this._onClick,\n            \"aria-label\": resolvedAriaLabel,\n            \"aria-labelledby\": ariaLabelledBy,\n            \"aria-describedby\": ariaDescribedBy,\n            \"aria-disabled\": isPrimaryButtonDisabled,\n            \"data-is-focusable\": dataIsFocusable\n        }, // aria-pressed attribute should only be present for toggle buttons\n        // aria-checked attribute should only be present for toggle buttons with checkbox type role\n        _a[isCheckboxTypeRole ? \"aria-checked\" : \"aria-pressed\"] = checkedOrPressedValue, _a));\n        if (ariaHidden) buttonProps[\"aria-hidden\"] = true;\n        if (this._isSplitButton) return this._onRenderSplitButtonContent(tag, buttonProps);\n        else if (this.props.menuProps) (0, _utilities.assign)(buttonProps, {\n            \"aria-expanded\": !menuHidden,\n            \"aria-owns\": !menuHidden ? this._labelId + \"-menu\" : null,\n            \"aria-haspopup\": true\n        });\n        return this._onRenderContent(tag, buttonProps);\n    };\n    BaseButton1.prototype.componentDidMount = function() {\n        // For split buttons, touching anywhere in the button should drop the dropdown, which should contain the\n        // primary action. This gives more hit target space for touch environments. We're setting the onpointerdown here,\n        // because React does not support Pointer events yet.\n        if (this._isSplitButton && this._splitButtonContainer.current) {\n            if (\"onpointerdown\" in this._splitButtonContainer.current) this._events.on(this._splitButtonContainer.current, \"pointerdown\", this._onPointerDown, true);\n            if (\"onpointerup\" in this._splitButtonContainer.current && this.props.onPointerUp) this._events.on(this._splitButtonContainer.current, \"pointerup\", this.props.onPointerUp, true);\n        }\n    };\n    BaseButton1.prototype.componentDidUpdate = function(prevProps, prevState) {\n        // If Button's menu was closed, run onAfterMenuDismiss.\n        if (this.props.onAfterMenuDismiss && !prevState.menuHidden && this.state.menuHidden) this.props.onAfterMenuDismiss();\n    };\n    BaseButton1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n    };\n    BaseButton1.prototype.focus = function() {\n        if (this._isSplitButton && this._splitButtonContainer.current) {\n            (0, _utilities.setFocusVisibility)(true);\n            this._splitButtonContainer.current.focus();\n        } else if (this._buttonElement.current) {\n            (0, _utilities.setFocusVisibility)(true);\n            this._buttonElement.current.focus();\n        }\n    };\n    BaseButton1.prototype.dismissMenu = function() {\n        this._dismissMenu();\n    };\n    BaseButton1.prototype.openMenu = function(shouldFocusOnContainer, shouldFocusOnMount) {\n        this._openMenu(shouldFocusOnContainer, shouldFocusOnMount);\n    };\n    BaseButton1.prototype._onRenderContent = function(tag, buttonProps) {\n        var _this = this;\n        var props = this.props;\n        var Tag = tag;\n        var menuIconProps = props.menuIconProps, menuProps = props.menuProps, _a = props.onRenderIcon, onRenderIcon = _a === void 0 ? this._onRenderIcon : _a, _b = props.onRenderAriaDescription, onRenderAriaDescription = _b === void 0 ? this._onRenderAriaDescription : _b, _c = props.onRenderChildren, onRenderChildren = _c === void 0 ? this._onRenderChildren : _c, // eslint-disable-next-line deprecation/deprecation\n        _d = props.onRenderMenu, // eslint-disable-next-line deprecation/deprecation\n        onRenderMenu = _d === void 0 ? this._onRenderMenu : _d, _e = props.onRenderMenuIcon, onRenderMenuIcon = _e === void 0 ? this._onRenderMenuIcon : _e, disabled = props.disabled;\n        var keytipProps = props.keytipProps;\n        if (keytipProps && menuProps) keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        var Button = function(keytipAttributes) {\n            return _react.createElement(Tag, (0, _tslib.__assign)({}, buttonProps, keytipAttributes), _react.createElement(\"span\", {\n                className: _this._classNames.flexContainer,\n                \"data-automationid\": \"splitbuttonprimary\"\n            }, onRenderIcon(props, _this._onRenderIcon), _this._onRenderTextContents(), onRenderAriaDescription(props, _this._onRenderAriaDescription), onRenderChildren(props, _this._onRenderChildren), !_this._isSplitButton && (menuProps || menuIconProps || _this.props.onRenderMenuIcon) && onRenderMenuIcon(_this.props, _this._onRenderMenuIcon), menuProps && !menuProps.doNotLayer && _this._shouldRenderMenu() && onRenderMenu(_this._getMenuProps(menuProps), _this._onRenderMenu)));\n        };\n        var Content = keytipProps ? // If we're making a split button, we won't put the keytip here\n        _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: !this._isSplitButton ? keytipProps : undefined,\n            ariaDescribedBy: buttonProps[\"aria-describedby\"],\n            disabled: disabled\n        }, function(keytipAttributes) {\n            return Button(keytipAttributes);\n        }) : Button();\n        if (menuProps && menuProps.doNotLayer) return _react.createElement(\"span\", {\n            style: {\n                display: \"inline-block\"\n            }\n        }, Content, this._shouldRenderMenu() && onRenderMenu(this._getMenuProps(menuProps), this._onRenderMenu));\n        return _react.createElement(_react.Fragment, null, Content, _react.createElement((0, _utilities.FocusRects), null));\n    };\n    /**\n     * Method to help determine if the menu's component tree should\n     * be rendered. It takes into account whether the menu is expanded,\n     * whether it is a persisted menu and whether it has been shown to the user.\n     */ BaseButton1.prototype._shouldRenderMenu = function() {\n        var menuHidden = this.state.menuHidden;\n        // eslint-disable-next-line deprecation/deprecation\n        var _a = this.props, persistMenu = _a.persistMenu, renderPersistedMenuHiddenOnMount = _a.renderPersistedMenuHiddenOnMount;\n        if (!menuHidden) // Always should render a menu when it is expanded\n        return true;\n        else if (persistMenu && (this._renderedVisibleMenu || renderPersistedMenuHiddenOnMount)) // _renderedVisibleMenu ensures that the first rendering of\n        // the menu happens on-screen, as edge's scrollbar calculations are off if done while hidden.\n        return true;\n        return false;\n    };\n    BaseButton1.prototype._hasText = function() {\n        // _onRenderTextContents and _onRenderText do not perform the same checks. Below is parity with what _onRenderText\n        // used to have before the refactor that introduced this function. _onRenderTextContents does not require props.\n        // text to be undefined in order for props.children to be used as a fallback.\n        // Purely a code maintainability/reuse issue, but logged as Issue #4979.\n        return this.props.text !== null && (this.props.text !== undefined || typeof this.props.children === \"string\");\n    };\n    BaseButton1.prototype._getMenuProps = function(menuProps) {\n        var persistMenu = this.props.persistMenu;\n        var menuHidden = this.state.menuHidden;\n        // the accessible menu label (accessible name) has a relationship to the button.\n        // If the menu props do not specify an explicit value for aria-label or aria-labelledBy,\n        // AND the button has text, we'll set the menu aria-labelledBy to the text element id.\n        if (!menuProps.ariaLabel && !menuProps.labelElementId && this._hasText()) menuProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, menuProps), {\n            labelElementId: this._labelId\n        });\n        return (0, _tslib.__assign)((0, _tslib.__assign)({\n            id: this._labelId + \"-menu\",\n            directionalHint: (0, _directionalHint.DirectionalHint).bottomLeftEdge\n        }, menuProps), {\n            shouldFocusOnContainer: this._menuShouldFocusOnContainer,\n            shouldFocusOnMount: this._menuShouldFocusOnMount,\n            hidden: persistMenu ? menuHidden : undefined,\n            className: (0, _utilities.css)(\"ms-BaseButton-menuhost\", menuProps.className),\n            target: this._isSplitButton ? this._splitButtonContainer.current : this._buttonElement.current,\n            onDismiss: this._onDismissMenu\n        });\n    };\n    BaseButton1.prototype._onRenderSplitButtonContent = function(tag, buttonProps) {\n        var _this = this;\n        var _a = this.props, _b = _a.styles, styles = _b === void 0 ? {} : _b, disabled = _a.disabled, allowDisabledFocus = _a.allowDisabledFocus, checked = _a.checked, getSplitButtonClassNames = _a.getSplitButtonClassNames, primaryDisabled = _a.primaryDisabled, menuProps = _a.menuProps, toggle = _a.toggle, role = _a.role, primaryActionButtonProps = _a.primaryActionButtonProps;\n        var keytipProps = this.props.keytipProps;\n        var menuHidden = this.state.menuHidden;\n        var classNames = getSplitButtonClassNames ? getSplitButtonClassNames(!!disabled, !menuHidden, !!checked, !!allowDisabledFocus) : styles && (0, _splitButtonClassNames.getSplitButtonClassNames)(styles, !!disabled, !menuHidden, !!checked, !!primaryDisabled);\n        (0, _utilities.assign)(buttonProps, {\n            onClick: undefined,\n            onPointerDown: undefined,\n            onPointerUp: undefined,\n            tabIndex: -1,\n            \"data-is-focusable\": false\n        });\n        if (keytipProps && menuProps) keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        var containerProps = (0, _utilities.getNativeProps)(buttonProps, [], [\n            \"disabled\"\n        ]);\n        // Add additional props to apply on primary action button\n        if (primaryActionButtonProps) (0, _utilities.assign)(buttonProps, primaryActionButtonProps);\n        var SplitButton = function(keytipAttributes) {\n            return _react.createElement(\"div\", (0, _tslib.__assign)({}, containerProps, {\n                \"data-ktp-target\": keytipAttributes ? keytipAttributes[\"data-ktp-target\"] : undefined,\n                role: role ? role : \"button\",\n                \"aria-disabled\": disabled,\n                \"aria-haspopup\": true,\n                \"aria-expanded\": !menuHidden,\n                \"aria-pressed\": toggle ? !!checked : undefined,\n                \"aria-describedby\": (0, _utilities.mergeAriaAttributeValues)(buttonProps[\"aria-describedby\"], keytipAttributes ? keytipAttributes[\"aria-describedby\"] : undefined),\n                className: classNames && classNames.splitButtonContainer,\n                onKeyDown: _this._onSplitButtonContainerKeyDown,\n                onTouchStart: _this._onTouchStart,\n                ref: _this._splitButtonContainer,\n                \"data-is-focusable\": true,\n                onClick: !disabled && !primaryDisabled ? _this._onSplitButtonPrimaryClick : undefined,\n                tabIndex: !disabled && !primaryDisabled || allowDisabledFocus ? 0 : undefined,\n                \"aria-roledescription\": buttonProps[\"aria-roledescription\"],\n                onFocusCapture: _this._onSplitContainerFocusCapture\n            }), _react.createElement(\"span\", {\n                style: {\n                    display: \"flex\"\n                }\n            }, _this._onRenderContent(tag, buttonProps), _this._onRenderSplitButtonMenuButton(classNames, keytipAttributes), _this._onRenderSplitButtonDivider(classNames)));\n        };\n        return keytipProps ? _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: keytipProps,\n            disabled: disabled\n        }, function(keytipAttributes) {\n            return SplitButton(keytipAttributes);\n        }) : SplitButton();\n    };\n    BaseButton1.prototype._onRenderSplitButtonDivider = function(classNames) {\n        if (classNames && classNames.divider) {\n            var onClick = function(ev) {\n                ev.stopPropagation();\n            };\n            return _react.createElement(\"span\", {\n                className: classNames.divider,\n                \"aria-hidden\": true,\n                onClick: onClick\n            });\n        }\n        return null;\n    };\n    BaseButton1.prototype._onRenderSplitButtonMenuButton = function(classNames, keytipAttributes) {\n        var _a = this.props, allowDisabledFocus = _a.allowDisabledFocus, checked = _a.checked, disabled = _a.disabled, splitButtonMenuProps = _a.splitButtonMenuProps, splitButtonAriaLabel = _a.splitButtonAriaLabel, primaryDisabled = _a.primaryDisabled;\n        var menuHidden = this.state.menuHidden;\n        var menuIconProps = this.props.menuIconProps;\n        if (menuIconProps === undefined) menuIconProps = {\n            iconName: \"ChevronDown\"\n        };\n        var splitButtonProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, splitButtonMenuProps), {\n            styles: classNames,\n            checked: checked,\n            disabled: disabled,\n            allowDisabledFocus: allowDisabledFocus,\n            onClick: this._onMenuClick,\n            menuProps: undefined,\n            iconProps: (0, _tslib.__assign)((0, _tslib.__assign)({}, menuIconProps), {\n                className: this._classNames.menuIcon\n            }),\n            ariaLabel: splitButtonAriaLabel,\n            \"aria-haspopup\": true,\n            \"aria-expanded\": !menuHidden,\n            \"data-is-focusable\": false\n        });\n        // Add data-ktp-execute-target to the split button if the keytip is defined\n        return _react.createElement(BaseButton1, (0, _tslib.__assign)({}, splitButtonProps, {\n            \"data-ktp-execute-target\": keytipAttributes ? keytipAttributes[\"data-ktp-execute-target\"] : keytipAttributes,\n            onMouseDown: this._onMouseDown,\n            tabIndex: primaryDisabled && !allowDisabledFocus ? 0 : -1\n        }));\n    };\n    BaseButton1.prototype._onPointerDown = function(ev) {\n        var onPointerDown = this.props.onPointerDown;\n        if (onPointerDown) onPointerDown(ev);\n        if (ev.pointerType === \"touch\") {\n            this._handleTouchAndPointerEvent();\n            ev.preventDefault();\n            ev.stopImmediatePropagation();\n        }\n    };\n    BaseButton1.prototype._handleTouchAndPointerEvent = function() {\n        var _this = this;\n        // If we already have an existing timeout from a previous touch and pointer event\n        // cancel that timeout so we can set a new one.\n        if (this._lastTouchTimeoutId !== undefined) {\n            this._async.clearTimeout(this._lastTouchTimeoutId);\n            this._lastTouchTimeoutId = undefined;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n            _this._processingTouch = false;\n            _this._lastTouchTimeoutId = undefined;\n            // Touch and pointer events don't focus the button naturally,\n            // so adding an imperative focus call to guarantee this behavior.\n            _this.focus();\n        }, TouchIdleDelay);\n    };\n    /**\n     * Returns if the user hits a valid keyboard key to open the menu\n     * @param ev - the keyboard event\n     * @returns True if user clicks on custom trigger key if enabled or alt + down arrow if not. False otherwise.\n     */ BaseButton1.prototype._isValidMenuOpenKey = function(ev) {\n        if (this.props.menuTriggerKeyCode) return ev.which === this.props.menuTriggerKeyCode;\n        else if (this.props.menuProps) return ev.which === (0, _utilities.KeyCodes).down && (ev.altKey || ev.metaKey);\n        // Note: When enter is pressed, we will let the event continue to propagate\n        // to trigger the onClick event on the button\n        return false;\n    };\n    BaseButton1.defaultProps = {\n        baseClassName: \"ms-Button\",\n        styles: {},\n        split: false\n    };\n    return BaseButton1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../../Icon\":\"2Ha7p\",\"../../common/DirectionalHint\":\"kARBR\",\"../../ContextualMenu\":\"7Q8DP\",\"./BaseButton.classNames\":\"kofVG\",\"./SplitButton/SplitButton.classNames\":\"8kuHQ\",\"../../KeytipData\":\"e8VIa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"01Tx1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"__extends\", ()=>__extends);\nparcelHelpers.export(exports, \"__assign\", ()=>__assign);\nparcelHelpers.export(exports, \"__rest\", ()=>__rest);\nparcelHelpers.export(exports, \"__decorate\", ()=>__decorate);\nparcelHelpers.export(exports, \"__param\", ()=>__param);\nparcelHelpers.export(exports, \"__metadata\", ()=>__metadata);\nparcelHelpers.export(exports, \"__awaiter\", ()=>__awaiter);\nparcelHelpers.export(exports, \"__generator\", ()=>__generator);\nparcelHelpers.export(exports, \"__createBinding\", ()=>__createBinding);\nparcelHelpers.export(exports, \"__exportStar\", ()=>__exportStar);\nparcelHelpers.export(exports, \"__values\", ()=>__values);\nparcelHelpers.export(exports, \"__read\", ()=>__read);\nparcelHelpers.export(exports, \"__spread\", ()=>__spread);\nparcelHelpers.export(exports, \"__spreadArrays\", ()=>__spreadArrays);\nparcelHelpers.export(exports, \"__await\", ()=>__await);\nparcelHelpers.export(exports, \"__asyncGenerator\", ()=>__asyncGenerator);\nparcelHelpers.export(exports, \"__asyncDelegator\", ()=>__asyncDelegator);\nparcelHelpers.export(exports, \"__asyncValues\", ()=>__asyncValues);\nparcelHelpers.export(exports, \"__makeTemplateObject\", ()=>__makeTemplateObject);\nparcelHelpers.export(exports, \"__importStar\", ()=>__importStar);\nparcelHelpers.export(exports, \"__importDefault\", ()=>__importDefault);\nparcelHelpers.export(exports, \"__classPrivateFieldGet\", ()=>__classPrivateFieldGet);\nparcelHelpers.export(exports, \"__classPrivateFieldSet\", ()=>__classPrivateFieldSet);\n/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */ /* global Reflect, Promise */ var extendStatics = function(d1, b1) {\n    extendStatics = Object.setPrototypeOf || ({\n        __proto__: []\n    }) instanceof Array && function(d, b) {\n        d.__proto__ = b;\n    } || function(d, b) {\n        for(var p in b)if (b.hasOwnProperty(p)) d[p] = b[p];\n    };\n    return extendStatics(d1, b1);\n};\nfunction __extends(d, b) {\n    extendStatics(d, b);\n    function __() {\n        this.constructor = d;\n    }\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\nvar __assign = function() {\n    __assign = Object.assign || function __assign(t) {\n        for(var s, i = 1, n = arguments.length; i < n; i++){\n            s = arguments[i];\n            for(var p in s)if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nfunction __rest(s, e) {\n    var t = {};\n    for(var p in s)if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\") {\n        for(var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++)if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n    }\n    return t;\n}\nfunction __decorate(decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\nfunction __param(paramIndex, decorator) {\n    return function(target, key) {\n        decorator(target, key, paramIndex);\n    };\n}\nfunction __metadata(metadataKey, metadataValue) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\nfunction __awaiter(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n}\nfunction __generator(thisArg, body) {\n    var _ = {\n        label: 0,\n        sent: function() {\n            if (t[0] & 1) throw t[1];\n            return t[1];\n        },\n        trys: [],\n        ops: []\n    }, f, y, t, g;\n    return g = {\n        next: verb(0),\n        \"throw\": verb(1),\n        \"return\": verb(2)\n    }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n    }), g;\n    function verb(n) {\n        return function(v) {\n            return step([\n                n,\n                v\n            ]);\n        };\n    }\n    function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while(_)try {\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n            if (y = 0, t) op = [\n                op[0] & 2,\n                t.value\n            ];\n            switch(op[0]){\n                case 0:\n                case 1:\n                    t = op;\n                    break;\n                case 4:\n                    _.label++;\n                    return {\n                        value: op[1],\n                        done: false\n                    };\n                case 5:\n                    _.label++;\n                    y = op[1];\n                    op = [\n                        0\n                    ];\n                    continue;\n                case 7:\n                    op = _.ops.pop();\n                    _.trys.pop();\n                    continue;\n                default:\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                        _ = 0;\n                        continue;\n                    }\n                    if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                        _.label = op[1];\n                        break;\n                    }\n                    if (op[0] === 6 && _.label < t[1]) {\n                        _.label = t[1];\n                        t = op;\n                        break;\n                    }\n                    if (t && _.label < t[2]) {\n                        _.label = t[2];\n                        _.ops.push(op);\n                        break;\n                    }\n                    if (t[2]) _.ops.pop();\n                    _.trys.pop();\n                    continue;\n            }\n            op = body.call(thisArg, _);\n        } catch (e) {\n            op = [\n                6,\n                e\n            ];\n            y = 0;\n        } finally{\n            f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return {\n            value: op[0] ? op[1] : void 0,\n            done: true\n        };\n    }\n}\nfunction __createBinding(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}\nfunction __exportStar(m, exports) {\n    for(var p in m)if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nfunction __values(o) {\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n    if (m) return m.call(o);\n    if (o && typeof o.length === \"number\") return {\n        next: function() {\n            if (o && i >= o.length) o = void 0;\n            return {\n                value: o && o[i++],\n                done: !o\n            };\n        }\n    };\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction __read(o, n) {\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n    if (!m) return o;\n    var i = m.call(o), r, ar = [], e;\n    try {\n        while((n === void 0 || n-- > 0) && !(r = i.next()).done)ar.push(r.value);\n    } catch (error) {\n        e = {\n            error: error\n        };\n    } finally{\n        try {\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\n        } finally{\n            if (e) throw e.error;\n        }\n    }\n    return ar;\n}\nfunction __spread() {\n    for(var ar = [], i = 0; i < arguments.length; i++)ar = ar.concat(__read(arguments[i]));\n    return ar;\n}\nfunction __spreadArrays() {\n    for(var s = 0, i = 0, il = arguments.length; i < il; i++)s += arguments[i].length;\n    for(var r = Array(s), k = 0, i = 0; i < il; i++)for(var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)r[k] = a[j];\n    return r;\n}\nfunction __await(v) {\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\nfunction __asyncGenerator(thisArg, _arguments, generator) {\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function() {\n        return this;\n    }, i;\n    function verb(n) {\n        if (g[n]) i[n] = function(v) {\n            return new Promise(function(a, b) {\n                q.push([\n                    n,\n                    v,\n                    a,\n                    b\n                ]) > 1 || resume(n, v);\n            });\n        };\n    }\n    function resume(n, v) {\n        try {\n            step(g[n](v));\n        } catch (e) {\n            settle(q[0][3], e);\n        }\n    }\n    function step(r) {\n        r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);\n    }\n    function fulfill(value) {\n        resume(\"next\", value);\n    }\n    function reject(value) {\n        resume(\"throw\", value);\n    }\n    function settle(f, v) {\n        if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);\n    }\n}\nfunction __asyncDelegator(o) {\n    var i, p;\n    return i = {}, verb(\"next\"), verb(\"throw\", function(e) {\n        throw e;\n    }), verb(\"return\"), i[Symbol.iterator] = function() {\n        return this;\n    }, i;\n    function verb(n, f) {\n        i[n] = o[n] ? function(v) {\n            return (p = !p) ? {\n                value: __await(o[n](v)),\n                done: n === \"return\"\n            } : f ? f(v) : v;\n        } : f;\n    }\n}\nfunction __asyncValues(o) {\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n    var m = o[Symbol.asyncIterator], i;\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function() {\n        return this;\n    }, i);\n    function verb(n) {\n        i[n] = o[n] && function(v) {\n            return new Promise(function(resolve, reject) {\n                v = o[n](v), settle(resolve, reject, v.done, v.value);\n            });\n        };\n    }\n    function settle(resolve, reject, d, v1) {\n        Promise.resolve(v1).then(function(v) {\n            resolve({\n                value: v,\n                done: d\n            });\n        }, reject);\n    }\n}\nfunction __makeTemplateObject(cooked, raw) {\n    if (Object.defineProperty) Object.defineProperty(cooked, \"raw\", {\n        value: raw\n    });\n    else cooked.raw = raw;\n    return cooked;\n}\nfunction __importStar(mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) {\n        for(var k in mod)if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\n    }\n    result.default = mod;\n    return result;\n}\nfunction __importDefault(mod) {\n    return mod && mod.__esModule ? mod : {\n        default: mod\n    };\n}\nfunction __classPrivateFieldGet(receiver, privateMap) {\n    if (!privateMap.has(receiver)) throw new TypeError(\"attempted to get private field on non-instance\");\n    return privateMap.get(receiver);\n}\nfunction __classPrivateFieldSet(receiver, privateMap, value) {\n    if (!privateMap.has(receiver)) throw new TypeError(\"attempted to set private field on non-instance\");\n    privateMap.set(receiver, value);\n    return value;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2F07a\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _version = require(\"./version\");\nvar _utilities = require(\"@uifabric/utilities\");\nparcelHelpers.exportAll(_utilities, exports);\n\n},{\"./version\":\"5jjJg\",\"@uifabric/utilities\":\"uTCgd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5jjJg\":[function(require,module,exports) {\n// Do not modify this file; it is generated as part of publish.\n// The checked in version is a placeholder only and will not be updated.\nvar _setVersion = require(\"@uifabric/set-version\");\n(0, _setVersion.setVersion)(\"office-ui-fabric-react\", \"7.186.0\");\n\n},{\"@uifabric/set-version\":\"896RR\"}],\"896RR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setVersion\", ()=>(0, _setVersion.setVersion));\nvar _setVersion = require(\"./setVersion\");\n(0, _setVersion.setVersion)(\"@uifabric/set-version\", \"6.0.0\");\n\n},{\"./setVersion\":\"gkf1H\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gkf1H\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setVersion\", ()=>setVersion);\n// A packages cache that makes sure that we don't inject the same packageName twice in the same bundle -\n// this cache is local to the module closure inside this bundle\nvar packagesCache = {};\n// Cache access to window to avoid IE11 memory leak.\nvar _win = undefined;\ntry {\n    _win = window;\n} catch (e) {\n/* no-op */ }\nfunction setVersion(packageName, packageVersion) {\n    if (typeof _win !== \"undefined\") {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var packages = _win.__packages__ = _win.__packages__ || {};\n        // We allow either the global packages or local packages caches to invalidate so testing can\n        // just clear the global to set this state\n        if (!packages[packageName] || !packagesCache[packageName]) {\n            packagesCache[packageName] = packageVersion;\n            var versions = packages[packageName] = packages[packageName] || [];\n            versions.push(packageVersion);\n        }\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"uTCgd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assign\", ()=>(0, _object.assign));\nparcelHelpers.export(exports, \"filteredAssign\", ()=>(0, _object.filteredAssign));\nparcelHelpers.export(exports, \"mapEnumByName\", ()=>(0, _object.mapEnumByName));\nparcelHelpers.export(exports, \"shallowCompare\", ()=>(0, _object.shallowCompare));\nparcelHelpers.export(exports, \"values\", ()=>(0, _object.values));\nparcelHelpers.export(exports, \"omit\", ()=>(0, _object.omit));\nparcelHelpers.export(exports, \"setFocusVisibility\", ()=>(0, _setFocusVisibility.setFocusVisibility));\nparcelHelpers.export(exports, \"IsFocusVisibleClassName\", ()=>(0, _setFocusVisibility.IsFocusVisibleClassName));\nparcelHelpers.export(exports, \"setSSR\", ()=>(0, _setSSR.setSSR));\nparcelHelpers.export(exports, \"createMergedRef\", ()=>(0, _createMergedRef.createMergedRef));\nvar _version = require(\"./version\");\nvar _async = require(\"./Async\");\nparcelHelpers.exportAll(_async, exports);\nvar _autoScroll = require(\"./AutoScroll\");\nparcelHelpers.exportAll(_autoScroll, exports);\nvar _baseComponent = require(\"./BaseComponent\");\nparcelHelpers.exportAll(_baseComponent, exports);\nvar _delayedRender = require(\"./DelayedRender\");\nparcelHelpers.exportAll(_delayedRender, exports);\nvar _eventGroup = require(\"./EventGroup\");\nparcelHelpers.exportAll(_eventGroup, exports);\nvar _fabricPerformance = require(\"./FabricPerformance\");\nparcelHelpers.exportAll(_fabricPerformance, exports);\nvar _globalSettings = require(\"./GlobalSettings\");\nparcelHelpers.exportAll(_globalSettings, exports);\nvar _keyCodes = require(\"./KeyCodes\");\nparcelHelpers.exportAll(_keyCodes, exports);\nvar _rectangle = require(\"./Rectangle\");\nparcelHelpers.exportAll(_rectangle, exports);\nvar _appendFunction = require(\"./appendFunction\");\nparcelHelpers.exportAll(_appendFunction, exports);\nvar _aria = require(\"./aria\");\nparcelHelpers.exportAll(_aria, exports);\nvar _array = require(\"./array\");\nparcelHelpers.exportAll(_array, exports);\nvar _asAsync = require(\"./asAsync\");\nparcelHelpers.exportAll(_asAsync, exports);\nvar _assertNever = require(\"./assertNever\");\nparcelHelpers.exportAll(_assertNever, exports);\nvar _classNamesFunction = require(\"./classNamesFunction\");\nparcelHelpers.exportAll(_classNamesFunction, exports);\nvar _composeComponentAs = require(\"./componentAs/composeComponentAs\");\nparcelHelpers.exportAll(_composeComponentAs, exports);\nvar _controlled = require(\"./controlled\");\nparcelHelpers.exportAll(_controlled, exports);\nvar _css = require(\"./css\");\nparcelHelpers.exportAll(_css, exports);\nvar _customizations = require(\"./customizations/Customizations\");\nparcelHelpers.exportAll(_customizations, exports);\nvar _customizer = require(\"./customizations/Customizer\");\nparcelHelpers.exportAll(_customizer, exports);\nvar _customizerContext = require(\"./customizations/CustomizerContext\");\nparcelHelpers.exportAll(_customizerContext, exports);\nvar _customizable = require(\"./customizations/customizable\");\nparcelHelpers.exportAll(_customizable, exports);\nvar _useCustomizationSettings = require(\"./customizations/useCustomizationSettings\");\nparcelHelpers.exportAll(_useCustomizationSettings, exports);\nvar _mergeCustomizations = require(\"./customizations/mergeCustomizations\");\nparcelHelpers.exportAll(_mergeCustomizations, exports);\nvar _mergeSettings = require(\"./customizations/mergeSettings\");\nparcelHelpers.exportAll(_mergeSettings, exports);\nvar _dom = require(\"./dom\");\nparcelHelpers.exportAll(_dom, exports);\nvar _extendComponent = require(\"./extendComponent\");\nparcelHelpers.exportAll(_extendComponent, exports);\nvar _focus = require(\"./focus\");\nparcelHelpers.exportAll(_focus, exports);\nvar _getId = require(\"./getId\");\nparcelHelpers.exportAll(_getId, exports);\nvar _getNativeElementProps = require(\"./getNativeElementProps\");\nparcelHelpers.exportAll(_getNativeElementProps, exports);\nvar _hoist = require(\"./hoist\");\nparcelHelpers.exportAll(_hoist, exports);\nvar _hoistStatics = require(\"./hoistStatics\");\nparcelHelpers.exportAll(_hoistStatics, exports);\nvar _initializeComponentRef = require(\"./initializeComponentRef\");\nparcelHelpers.exportAll(_initializeComponentRef, exports);\nvar _initializeFocusRects = require(\"./initializeFocusRects\");\nparcelHelpers.exportAll(_initializeFocusRects, exports);\nvar _useFocusRects = require(\"./useFocusRects\");\nparcelHelpers.exportAll(_useFocusRects, exports);\nvar _initials = require(\"./initials\");\nparcelHelpers.exportAll(_initials, exports);\nvar _keyboard = require(\"./keyboard\");\nparcelHelpers.exportAll(_keyboard, exports);\nvar _language = require(\"./language\");\nparcelHelpers.exportAll(_language, exports);\nvar _math = require(\"./math\");\nparcelHelpers.exportAll(_math, exports);\nvar _memoize = require(\"./memoize\");\nparcelHelpers.exportAll(_memoize, exports);\nvar _merge = require(\"./merge\");\nparcelHelpers.exportAll(_merge, exports);\nvar _mobileDetector = require(\"./mobileDetector\");\nparcelHelpers.exportAll(_mobileDetector, exports);\nvar _modalize = require(\"./modalize\");\nparcelHelpers.exportAll(_modalize, exports);\nvar _object = require(\"./object\");\nvar _osDetector = require(\"./osDetector\");\nparcelHelpers.exportAll(_osDetector, exports);\nvar _overflow = require(\"./overflow\");\nparcelHelpers.exportAll(_overflow, exports);\nvar _properties = require(\"./properties\");\nparcelHelpers.exportAll(_properties, exports);\nvar _composeRenderFunction = require(\"./renderFunction/composeRenderFunction\");\nparcelHelpers.exportAll(_composeRenderFunction, exports);\nvar _resources = require(\"./resources\");\nparcelHelpers.exportAll(_resources, exports);\nvar _rtl = require(\"./rtl\");\nparcelHelpers.exportAll(_rtl, exports);\nvar _safeRequestAnimationFrame = require(\"./safeRequestAnimationFrame\");\nparcelHelpers.exportAll(_safeRequestAnimationFrame, exports);\nvar _safeSetTimeout = require(\"./safeSetTimeout\");\nparcelHelpers.exportAll(_safeSetTimeout, exports);\nvar _scroll = require(\"./scroll\");\nparcelHelpers.exportAll(_scroll, exports);\nvar _index = require(\"./selection/index\");\nparcelHelpers.exportAll(_index, exports);\nvar _string = require(\"./string\");\nparcelHelpers.exportAll(_string, exports);\nvar _styled = require(\"./styled\");\nparcelHelpers.exportAll(_styled, exports);\nvar _warn = require(\"./warn\");\nparcelHelpers.exportAll(_warn, exports);\nvar _ie11Detector = require(\"./ie11Detector\");\nparcelHelpers.exportAll(_ie11Detector, exports);\nvar _getPropsWithDefaults = require(\"./getPropsWithDefaults\");\nparcelHelpers.exportAll(_getPropsWithDefaults, exports);\nvar _setFocusVisibility = require(\"./setFocusVisibility\");\nvar _setSSR = require(\"./dom/setSSR\");\nvar _createMergedRef = require(\"./createMergedRef\");\n\n},{\"./version\":\"jS0vh\",\"./Async\":\"9q7L7\",\"./AutoScroll\":\"bA3Y6\",\"./BaseComponent\":\"aa17H\",\"./DelayedRender\":\"6VQRa\",\"./EventGroup\":\"f8oQM\",\"./FabricPerformance\":\"cQJKt\",\"./GlobalSettings\":\"6PyOf\",\"./KeyCodes\":\"aP2ZH\",\"./Rectangle\":\"dgqez\",\"./appendFunction\":\"3LuLW\",\"./aria\":\"jjIft\",\"./array\":\"fx288\",\"./asAsync\":\"dZIYi\",\"./assertNever\":\"gVsq2\",\"./classNamesFunction\":\"l6Ep1\",\"./componentAs/composeComponentAs\":\"4YirV\",\"./controlled\":\"dLw1C\",\"./css\":\"kn32w\",\"./customizations/Customizations\":\"cQrva\",\"./customizations/Customizer\":\"hA4qU\",\"./customizations/CustomizerContext\":\"lvXOl\",\"./customizations/customizable\":\"8apqE\",\"./customizations/useCustomizationSettings\":\"ilkk0\",\"./customizations/mergeCustomizations\":\"eKS1v\",\"./customizations/mergeSettings\":\"axslo\",\"./dom\":\"diVbR\",\"./extendComponent\":\"4VCg2\",\"./focus\":\"ivx2u\",\"./getId\":\"XXn0P\",\"./getNativeElementProps\":\"b4b1E\",\"./hoist\":\"laxhl\",\"./hoistStatics\":\"eOXQy\",\"./initializeComponentRef\":\"jexxl\",\"./initializeFocusRects\":\"k3hSu\",\"./useFocusRects\":\"isDDh\",\"./initials\":\"86fb4\",\"./keyboard\":\"ePjml\",\"./language\":\"7xavy\",\"./math\":\"eQi7d\",\"./memoize\":\"3d7Bj\",\"./merge\":\"bM8Ud\",\"./mobileDetector\":\"bC36M\",\"./modalize\":\"a1LXp\",\"./object\":\"1JxOl\",\"./osDetector\":\"4Na99\",\"./overflow\":\"g08Bp\",\"./properties\":\"1GF3W\",\"./renderFunction/composeRenderFunction\":\"b5YiS\",\"./resources\":\"3xZRx\",\"./rtl\":\"a3Fy5\",\"./safeRequestAnimationFrame\":\"6luZy\",\"./safeSetTimeout\":\"gvcyc\",\"./scroll\":\"aHIQw\",\"./selection/index\":\"7yIRz\",\"./string\":\"aj57R\",\"./styled\":\"bbmzw\",\"./warn\":\"fzP82\",\"./ie11Detector\":\"hBdZx\",\"./getPropsWithDefaults\":\"lJikp\",\"./setFocusVisibility\":\"eggWL\",\"./dom/setSSR\":\"4vvfQ\",\"./createMergedRef\":\"bsoKL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jS0vh\":[function(require,module,exports) {\n// Do not modify this file; it is generated as part of publish.\n// The checked in version is a placeholder only and will not be updated.\nvar _setVersion = require(\"@uifabric/set-version\");\n(0, _setVersion.setVersion)(\"@uifabric/utilities\", \"7.34.0\");\n\n},{\"@uifabric/set-version\":\"896RR\"}],\"9q7L7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Async\", ()=>Async);\nvar _getWindow = require(\"./dom/getWindow\");\n/**\n * Bugs often appear in async code when stuff gets disposed, but async operations don't get canceled.\n * This Async helper class solves these issues by tying async code to the lifetime of a disposable object.\n *\n * Usage: Anything class extending from BaseModel can access this helper via this.async. Otherwise create a\n * new instance of the class and remember to call dispose() during your code's dispose handler.\n *\n * @public\n */ var Async = /** @class */ function() {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function Async1(parent, onError) {\n        this._timeoutIds = null;\n        this._immediateIds = null;\n        this._intervalIds = null;\n        this._animationFrameIds = null;\n        this._isDisposed = false;\n        this._parent = parent || null;\n        this._onErrorHandler = onError;\n        this._noop = function() {\n        /* do nothing */ };\n    }\n    /**\n     * Dispose function, clears all async operations.\n     */ Async1.prototype.dispose = function() {\n        var id;\n        this._isDisposed = true;\n        this._parent = null;\n        // Clear timeouts.\n        if (this._timeoutIds) {\n            for(id in this._timeoutIds)if (this._timeoutIds.hasOwnProperty(id)) this.clearTimeout(parseInt(id, 10));\n            this._timeoutIds = null;\n        }\n        // Clear immediates.\n        if (this._immediateIds) {\n            for(id in this._immediateIds)if (this._immediateIds.hasOwnProperty(id)) this.clearImmediate(parseInt(id, 10));\n            this._immediateIds = null;\n        }\n        // Clear intervals.\n        if (this._intervalIds) {\n            for(id in this._intervalIds)if (this._intervalIds.hasOwnProperty(id)) this.clearInterval(parseInt(id, 10));\n            this._intervalIds = null;\n        }\n        // Clear animation frames.\n        if (this._animationFrameIds) {\n            for(id in this._animationFrameIds)if (this._animationFrameIds.hasOwnProperty(id)) this.cancelAnimationFrame(parseInt(id, 10));\n            this._animationFrameIds = null;\n        }\n    };\n    /**\n     * SetTimeout override, which will auto cancel the timeout during dispose.\n     * @param callback - Callback to execute.\n     * @param duration - Duration in milliseconds.\n     * @returns The setTimeout id.\n     */ Async1.prototype.setTimeout = function(callback, duration) {\n        var _this = this;\n        var timeoutId = 0;\n        if (!this._isDisposed) {\n            if (!this._timeoutIds) this._timeoutIds = {};\n            timeoutId = setTimeout(function() {\n                // Time to execute the timeout, enqueue it as a foreground task to be executed.\n                try {\n                    // Now delete the record and call the callback.\n                    if (_this._timeoutIds) delete _this._timeoutIds[timeoutId];\n                    callback.apply(_this._parent);\n                } catch (e) {\n                    if (_this._onErrorHandler) _this._onErrorHandler(e);\n                }\n            }, duration);\n            this._timeoutIds[timeoutId] = true;\n        }\n        return timeoutId;\n    };\n    /**\n     * Clears the timeout.\n     * @param id - Id to cancel.\n     */ Async1.prototype.clearTimeout = function(id) {\n        if (this._timeoutIds && this._timeoutIds[id]) {\n            clearTimeout(id);\n            delete this._timeoutIds[id];\n        }\n    };\n    /**\n     * SetImmediate override, which will auto cancel the immediate during dispose.\n     * @param callback - Callback to execute.\n     * @param targetElement - Optional target element to use for identifying the correct window.\n     * @returns The setTimeout id.\n     */ Async1.prototype.setImmediate = function(callback, targetElement) {\n        var _this = this;\n        var immediateId = 0;\n        var win = (0, _getWindow.getWindow)(targetElement);\n        if (!this._isDisposed) {\n            if (!this._immediateIds) this._immediateIds = {};\n            var setImmediateCallback = function() {\n                // Time to execute the timeout, enqueue it as a foreground task to be executed.\n                try {\n                    // Now delete the record and call the callback.\n                    if (_this._immediateIds) delete _this._immediateIds[immediateId];\n                    callback.apply(_this._parent);\n                } catch (e) {\n                    _this._logError(e);\n                }\n            };\n            immediateId = win.setTimeout(setImmediateCallback, 0);\n            this._immediateIds[immediateId] = true;\n        }\n        return immediateId;\n    };\n    /**\n     * Clears the immediate.\n     * @param id - Id to cancel.\n     * @param targetElement - Optional target element to use for identifying the correct window.\n     */ Async1.prototype.clearImmediate = function(id, targetElement) {\n        var win = (0, _getWindow.getWindow)(targetElement);\n        if (this._immediateIds && this._immediateIds[id]) {\n            win.clearTimeout(id);\n            delete this._immediateIds[id];\n        }\n    };\n    /**\n     * SetInterval override, which will auto cancel the timeout during dispose.\n     * @param callback - Callback to execute.\n     * @param duration - Duration in milliseconds.\n     * @returns The setTimeout id.\n     */ Async1.prototype.setInterval = function(callback, duration) {\n        var _this = this;\n        var intervalId = 0;\n        if (!this._isDisposed) {\n            if (!this._intervalIds) this._intervalIds = {};\n            intervalId = setInterval(function() {\n                // Time to execute the interval callback, enqueue it as a foreground task to be executed.\n                try {\n                    callback.apply(_this._parent);\n                } catch (e) {\n                    _this._logError(e);\n                }\n            }, duration);\n            this._intervalIds[intervalId] = true;\n        }\n        return intervalId;\n    };\n    /**\n     * Clears the interval.\n     * @param id - Id to cancel.\n     */ Async1.prototype.clearInterval = function(id) {\n        if (this._intervalIds && this._intervalIds[id]) {\n            clearInterval(id);\n            delete this._intervalIds[id];\n        }\n    };\n    /**\n     * Creates a function that, when executed, will only call the func function at most once per\n     * every wait milliseconds. Provide an options object to indicate that func should be invoked\n     * on the leading and/or trailing edge of the wait timeout. Subsequent calls to the throttled\n     * function will return the result of the last func call.\n     *\n     * Note: If leading and trailing options are true func will be called on the trailing edge of\n     * the timeout only if the throttled function is invoked more than once during the wait timeout.\n     *\n     * @param func - The function to throttle.\n     * @param wait - The number of milliseconds to throttle executions to. Defaults to 0.\n     * @param options - The options object.\n     * @returns The new throttled function.\n     */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Async1.prototype.throttle = function(func, wait, options) {\n        var _this = this;\n        if (this._isDisposed) return this._noop;\n        var waitMS = wait || 0;\n        var leading = true;\n        var trailing = true;\n        var lastExecuteTime = 0;\n        var lastResult;\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var lastArgs;\n        var timeoutId = null;\n        if (options && typeof options.leading === \"boolean\") leading = options.leading;\n        if (options && typeof options.trailing === \"boolean\") trailing = options.trailing;\n        var callback = function(userCall) {\n            var now = Date.now();\n            var delta = now - lastExecuteTime;\n            var waitLength = leading ? waitMS - delta : waitMS;\n            if (delta >= waitMS && (!userCall || leading)) {\n                lastExecuteTime = now;\n                if (timeoutId) {\n                    _this.clearTimeout(timeoutId);\n                    timeoutId = null;\n                }\n                lastResult = func.apply(_this._parent, lastArgs);\n            } else if (timeoutId === null && trailing) timeoutId = _this.setTimeout(callback, waitLength);\n            return lastResult;\n        };\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var resultFunction = function() {\n            var args = [];\n            for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n            lastArgs = args;\n            return callback(true);\n        };\n        return resultFunction;\n    };\n    /**\n     * Creates a function that will delay the execution of func until after wait milliseconds have\n     * elapsed since the last time it was invoked. Provide an options object to indicate that func\n     * should be invoked on the leading and/or trailing edge of the wait timeout. Subsequent calls\n     * to the debounced function will return the result of the last func call.\n     *\n     * Note: If leading and trailing options are true func will be called on the trailing edge of\n     * the timeout only if the debounced function is invoked more than once during the wait\n     * timeout.\n     *\n     * @param func - The function to debounce.\n     * @param wait - The number of milliseconds to delay.\n     * @param options - The options object.\n     * @returns The new debounced function.\n     */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Async1.prototype.debounce = function(func, wait, options) {\n        var _this = this;\n        if (this._isDisposed) {\n            var noOpFunction = function() {\n            /** Do nothing */ };\n            noOpFunction.cancel = function() {\n                return;\n            };\n            noOpFunction.flush = function() {\n                return null;\n            };\n            noOpFunction.pending = function() {\n                return false;\n            };\n            return noOpFunction;\n        }\n        var waitMS = wait || 0;\n        var leading = false;\n        var trailing = true;\n        var maxWait = null;\n        var lastCallTime = 0;\n        var lastExecuteTime = Date.now();\n        var lastResult;\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var lastArgs;\n        var timeoutId = null;\n        if (options && typeof options.leading === \"boolean\") leading = options.leading;\n        if (options && typeof options.trailing === \"boolean\") trailing = options.trailing;\n        if (options && typeof options.maxWait === \"number\" && !isNaN(options.maxWait)) maxWait = options.maxWait;\n        var markExecuted = function(time) {\n            if (timeoutId) {\n                _this.clearTimeout(timeoutId);\n                timeoutId = null;\n            }\n            lastExecuteTime = time;\n        };\n        var invokeFunction = function(time) {\n            markExecuted(time);\n            lastResult = func.apply(_this._parent, lastArgs);\n        };\n        var callback = function(userCall) {\n            var now = Date.now();\n            var executeImmediately = false;\n            if (userCall) {\n                if (leading && now - lastCallTime >= waitMS) executeImmediately = true;\n                lastCallTime = now;\n            }\n            var delta = now - lastCallTime;\n            var waitLength = waitMS - delta;\n            var maxWaitDelta = now - lastExecuteTime;\n            var maxWaitExpired = false;\n            if (maxWait !== null) {\n                // maxWait only matters when there is a pending callback\n                if (maxWaitDelta >= maxWait && timeoutId) maxWaitExpired = true;\n                else waitLength = Math.min(waitLength, maxWait - maxWaitDelta);\n            }\n            if (delta >= waitMS || maxWaitExpired || executeImmediately) invokeFunction(now);\n            else if ((timeoutId === null || !userCall) && trailing) timeoutId = _this.setTimeout(callback, waitLength);\n            return lastResult;\n        };\n        var pending = function() {\n            return !!timeoutId;\n        };\n        var cancel = function() {\n            if (pending()) // Mark the debounced function as having executed\n            markExecuted(Date.now());\n        };\n        var flush = function() {\n            if (pending()) invokeFunction(Date.now());\n            return lastResult;\n        };\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var resultFunction = function() {\n            var args = [];\n            for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n            lastArgs = args;\n            return callback(true);\n        };\n        resultFunction.cancel = cancel;\n        resultFunction.flush = flush;\n        resultFunction.pending = pending;\n        return resultFunction;\n    };\n    Async1.prototype.requestAnimationFrame = function(callback, targetElement) {\n        var _this = this;\n        var animationFrameId = 0;\n        var win = (0, _getWindow.getWindow)(targetElement);\n        if (!this._isDisposed) {\n            if (!this._animationFrameIds) this._animationFrameIds = {};\n            var animationFrameCallback = function() {\n                try {\n                    // Now delete the record and call the callback.\n                    if (_this._animationFrameIds) delete _this._animationFrameIds[animationFrameId];\n                    callback.apply(_this._parent);\n                } catch (e) {\n                    _this._logError(e);\n                }\n            };\n            animationFrameId = win.requestAnimationFrame ? win.requestAnimationFrame(animationFrameCallback) : win.setTimeout(animationFrameCallback, 0);\n            this._animationFrameIds[animationFrameId] = true;\n        }\n        return animationFrameId;\n    };\n    Async1.prototype.cancelAnimationFrame = function(id, targetElement) {\n        var win = (0, _getWindow.getWindow)(targetElement);\n        if (this._animationFrameIds && this._animationFrameIds[id]) {\n            win.cancelAnimationFrame ? win.cancelAnimationFrame(id) : win.clearTimeout(id);\n            delete this._animationFrameIds[id];\n        }\n    };\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Async1.prototype._logError = function(e) {\n        if (this._onErrorHandler) this._onErrorHandler(e);\n    };\n    return Async1;\n}();\n\n},{\"./dom/getWindow\":\"8f64x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8f64x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Helper to get the window object. The helper will make sure to use a cached variable\n * of \"window\", to avoid overhead and memory leaks in IE11. Note that in popup scenarios the\n * window object won't match the \"global\" window object, and for these scenarios, you should\n * pass in an element hosted within the popup.\n *\n * @public\n */ parcelHelpers.export(exports, \"getWindow\", ()=>getWindow);\nvar _setSSR = require(\"./setSSR\");\nvar _window = undefined;\n// Note: Accessing \"window\" in IE11 is somewhat expensive, and calling \"typeof window\"\n// hits a memory leak, whereas aliasing it and calling \"typeof _window\" does not.\n// Caching the window value at the file scope lets us minimize the impact.\ntry {\n    _window = window;\n} catch (e) {\n/* no-op */ }\nfunction getWindow(rootElement) {\n    if ((0, _setSSR._isSSR) || typeof _window === \"undefined\") return undefined;\n    else {\n        var el = rootElement;\n        return el && el.ownerDocument && el.ownerDocument.defaultView ? el.ownerDocument.defaultView : _window;\n    }\n}\n\n},{\"./setSSR\":\"4vvfQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4vvfQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"_isSSR\", ()=>_isSSR);\n/**\n * Helper to set ssr mode to simulate no window object returned from getWindow helper.\n *\n * @public\n */ parcelHelpers.export(exports, \"setSSR\", ()=>setSSR);\nvar _isSSR = false;\nfunction setSSR(isEnabled) {\n    _isSSR = isEnabled;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bA3Y6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AutoScroll\", ()=>AutoScroll);\nvar _eventGroup = require(\"./EventGroup\");\nvar _scroll = require(\"./scroll\");\nvar _getRect = require(\"./dom/getRect\");\nvar SCROLL_ITERATION_DELAY = 16;\nvar SCROLL_GUTTER = 100;\nvar MAX_SCROLL_VELOCITY = 15;\n/**\n * AutoScroll simply hooks up mouse events given a parent element, and scrolls the container\n * up/down depending on how close the mouse is to the top/bottom of the container.\n *\n * Once you don't want autoscroll any more, just dispose the helper and it will unhook events.\n *\n * @public\n * {@docCategory AutoScroll}\n */ var AutoScroll = /** @class */ function() {\n    function AutoScroll1(element) {\n        this._events = new (0, _eventGroup.EventGroup)(this);\n        this._scrollableParent = (0, _scroll.findScrollableParent)(element);\n        this._incrementScroll = this._incrementScroll.bind(this);\n        this._scrollRect = (0, _getRect.getRect)(this._scrollableParent);\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        if (this._scrollableParent === window) this._scrollableParent = document.body;\n        if (this._scrollableParent) {\n            this._events.on(window, \"mousemove\", this._onMouseMove, true);\n            this._events.on(window, \"touchmove\", this._onTouchMove, true);\n        }\n    }\n    AutoScroll1.prototype.dispose = function() {\n        this._events.dispose();\n        this._stopScroll();\n    };\n    AutoScroll1.prototype._onMouseMove = function(ev) {\n        this._computeScrollVelocity(ev);\n    };\n    AutoScroll1.prototype._onTouchMove = function(ev) {\n        if (ev.touches.length > 0) this._computeScrollVelocity(ev);\n    };\n    AutoScroll1.prototype._computeScrollVelocity = function(ev) {\n        if (!this._scrollRect) return;\n        var clientX;\n        var clientY;\n        if (\"clientX\" in ev) {\n            clientX = ev.clientX;\n            clientY = ev.clientY;\n        } else {\n            clientX = ev.touches[0].clientX;\n            clientY = ev.touches[0].clientY;\n        }\n        var scrollRectTop = this._scrollRect.top;\n        var scrollRectLeft = this._scrollRect.left;\n        var scrollClientBottom = scrollRectTop + this._scrollRect.height - SCROLL_GUTTER;\n        var scrollClientRight = scrollRectLeft + this._scrollRect.width - SCROLL_GUTTER;\n        // variables to use for alternating scroll direction\n        var scrollRect;\n        var clientDirection;\n        var scrollClient;\n        // if either of these conditions are met we are scrolling vertically else horizontally\n        if (clientY < scrollRectTop + SCROLL_GUTTER || clientY > scrollClientBottom) {\n            clientDirection = clientY;\n            scrollRect = scrollRectTop;\n            scrollClient = scrollClientBottom;\n            this._isVerticalScroll = true;\n        } else {\n            clientDirection = clientX;\n            scrollRect = scrollRectLeft;\n            scrollClient = scrollClientRight;\n            this._isVerticalScroll = false;\n        }\n        // calculate scroll velocity and direction\n        if (clientDirection < scrollRect + SCROLL_GUTTER) this._scrollVelocity = Math.max(-MAX_SCROLL_VELOCITY, -MAX_SCROLL_VELOCITY * ((SCROLL_GUTTER - (clientDirection - scrollRect)) / SCROLL_GUTTER));\n        else if (clientDirection > scrollClient) this._scrollVelocity = Math.min(MAX_SCROLL_VELOCITY, MAX_SCROLL_VELOCITY * ((clientDirection - scrollClient) / SCROLL_GUTTER));\n        else this._scrollVelocity = 0;\n        if (this._scrollVelocity) this._startScroll();\n        else this._stopScroll();\n    };\n    AutoScroll1.prototype._startScroll = function() {\n        if (!this._timeoutId) this._incrementScroll();\n    };\n    AutoScroll1.prototype._incrementScroll = function() {\n        if (this._scrollableParent) {\n            if (this._isVerticalScroll) this._scrollableParent.scrollTop += Math.round(this._scrollVelocity);\n            else this._scrollableParent.scrollLeft += Math.round(this._scrollVelocity);\n        }\n        this._timeoutId = setTimeout(this._incrementScroll, SCROLL_ITERATION_DELAY);\n    };\n    AutoScroll1.prototype._stopScroll = function() {\n        if (this._timeoutId) {\n            clearTimeout(this._timeoutId);\n            delete this._timeoutId;\n        }\n    };\n    return AutoScroll1;\n}();\n\n},{\"./EventGroup\":\"f8oQM\",\"./scroll\":\"aHIQw\",\"./dom/getRect\":\"cYSAF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f8oQM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"EventGroup\", ()=>EventGroup);\nvar _object = require(\"./object\");\n/** An instance of EventGroup allows anything with a handle to it to trigger events on it.\n *  If the target is an HTMLElement, the event will be attached to the element and can be\n *  triggered as usual (like clicking for onClick).\n *  The event can be triggered by calling EventGroup.raise() here. If the target is an\n *  HTMLElement, the event gets raised and is handled by the browser. Otherwise, it gets\n *  handled here in EventGroup, and the handler is called in the context of the parent\n *  (which is passed in in the constructor).\n *\n * @public\n * {@docCategory EventGroup}\n */ var EventGroup = /** @class */ function() {\n    /** parent: the context in which events attached to non-HTMLElements are called */ function EventGroup1(parent) {\n        this._id = EventGroup1._uniqueId++;\n        this._parent = parent;\n        this._eventRecords = [];\n    }\n    /** For IE8, bubbleEvent is ignored here and must be dealt with by the handler.\n     *  Events raised here by default have bubbling set to false and cancelable set to true.\n     *  This applies also to built-in events being raised manually here on HTMLElements,\n     *  which may lead to unexpected behavior if it differs from the defaults.\n     *\n     */ EventGroup1.raise = function(target, eventName, eventArgs, bubbleEvent) {\n        var retVal;\n        if (EventGroup1._isElement(target)) {\n            if (typeof document !== \"undefined\" && document.createEvent) {\n                var ev = document.createEvent(\"HTMLEvents\");\n                ev.initEvent(eventName, bubbleEvent || false, true);\n                (0, _object.assign)(ev, eventArgs);\n                retVal = target.dispatchEvent(ev);\n            } else if (typeof document !== \"undefined\" && document.createEventObject) {\n                // IE8\n                var evObj = document.createEventObject(eventArgs);\n                // cannot set cancelBubble on evObj, fireEvent will overwrite it\n                target.fireEvent(\"on\" + eventName, evObj);\n            }\n        } else while(target && retVal !== false){\n            var events = target.__events__;\n            var eventRecords = events ? events[eventName] : null;\n            if (eventRecords) {\n                for(var id in eventRecords)if (eventRecords.hasOwnProperty(id)) {\n                    var eventRecordList = eventRecords[id];\n                    for(var listIndex = 0; retVal !== false && listIndex < eventRecordList.length; listIndex++){\n                        var record = eventRecordList[listIndex];\n                        if (record.objectCallback) retVal = record.objectCallback.call(record.parent, eventArgs);\n                    }\n                }\n            }\n            // If the target has a parent, bubble the event up.\n            target = bubbleEvent ? target.parent : null;\n        }\n        return retVal;\n    };\n    EventGroup1.isObserved = function(target, eventName) {\n        var events = target && target.__events__;\n        return !!events && !!events[eventName];\n    };\n    /** Check to see if the target has declared support of the given event. */ EventGroup1.isDeclared = function(target, eventName) {\n        var declaredEvents = target && target.__declaredEvents;\n        return !!declaredEvents && !!declaredEvents[eventName];\n    };\n    EventGroup1.stopPropagation = function(event) {\n        if (event.stopPropagation) event.stopPropagation();\n        else // IE8\n        event.cancelBubble = true;\n    };\n    EventGroup1._isElement = function(target) {\n        return !!target && (!!target.addEventListener || typeof HTMLElement !== \"undefined\" && target instanceof HTMLElement);\n    };\n    EventGroup1.prototype.dispose = function() {\n        if (!this._isDisposed) {\n            this._isDisposed = true;\n            this.off();\n            this._parent = null;\n        }\n    };\n    /** On the target, attach a set of events, where the events object is a name to function mapping. */ EventGroup1.prototype.onAll = function(target, events, useCapture) {\n        for(var eventName in events)if (events.hasOwnProperty(eventName)) this.on(target, eventName, events[eventName], useCapture);\n    };\n    /**\n     * On the target, attach an event whose handler will be called in the context of the parent\n     * of this instance of EventGroup.\n     */ EventGroup1.prototype.on = function(target, eventName, callback, options) {\n        var _this = this;\n        if (eventName.indexOf(\",\") > -1) {\n            var events = eventName.split(/[ ,]+/);\n            for(var i = 0; i < events.length; i++)this.on(target, events[i], callback, options);\n        } else {\n            var parent_1 = this._parent;\n            var eventRecord = {\n                target: target,\n                eventName: eventName,\n                parent: parent_1,\n                callback: callback,\n                options: options\n            };\n            // Initialize and wire up the record on the target, so that it can call the callback if the event fires.\n            var events = target.__events__ = target.__events__ || {};\n            events[eventName] = events[eventName] || {\n                count: 0\n            };\n            events[eventName][this._id] = events[eventName][this._id] || [];\n            events[eventName][this._id].push(eventRecord);\n            events[eventName].count++;\n            if (EventGroup1._isElement(target)) {\n                var processElementEvent = function() {\n                    var args = [];\n                    for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n                    if (_this._isDisposed) return;\n                    var result;\n                    try {\n                        result = callback.apply(parent_1, args);\n                        if (result === false && args[0]) {\n                            var e = args[0];\n                            if (e.preventDefault) e.preventDefault();\n                            if (e.stopPropagation) e.stopPropagation();\n                            e.cancelBubble = true;\n                        }\n                    } catch (e) {\n                    // ignore\n                    }\n                    return result;\n                };\n                eventRecord.elementCallback = processElementEvent;\n                if (target.addEventListener) target.addEventListener(eventName, processElementEvent, options);\n                else if (target.attachEvent) // IE8\n                target.attachEvent(\"on\" + eventName, processElementEvent);\n            } else {\n                var processObjectEvent = function() {\n                    var args = [];\n                    for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n                    if (_this._isDisposed) return;\n                    return callback.apply(parent_1, args);\n                };\n                eventRecord.objectCallback = processObjectEvent;\n            }\n            // Remember the record locally, so that it can be removed.\n            this._eventRecords.push(eventRecord);\n        }\n    };\n    EventGroup1.prototype.off = function(target, eventName, callback, options) {\n        for(var i = 0; i < this._eventRecords.length; i++){\n            var eventRecord = this._eventRecords[i];\n            if ((!target || target === eventRecord.target) && (!eventName || eventName === eventRecord.eventName) && (!callback || callback === eventRecord.callback) && (typeof options !== \"boolean\" || options === eventRecord.options)) {\n                var events = eventRecord.target.__events__;\n                var targetArrayLookup = events[eventRecord.eventName];\n                var targetArray = targetArrayLookup ? targetArrayLookup[this._id] : null;\n                // We may have already target's entries, so check for null.\n                if (targetArray) {\n                    if (targetArray.length === 1 || !callback) {\n                        targetArrayLookup.count -= targetArray.length;\n                        delete events[eventRecord.eventName][this._id];\n                    } else {\n                        targetArrayLookup.count--;\n                        targetArray.splice(targetArray.indexOf(eventRecord), 1);\n                    }\n                    if (!targetArrayLookup.count) delete events[eventRecord.eventName];\n                }\n                if (eventRecord.elementCallback) {\n                    if (eventRecord.target.removeEventListener) eventRecord.target.removeEventListener(eventRecord.eventName, eventRecord.elementCallback, eventRecord.options);\n                    else if (eventRecord.target.detachEvent) // IE8\n                    eventRecord.target.detachEvent(\"on\" + eventRecord.eventName, eventRecord.elementCallback);\n                }\n                this._eventRecords.splice(i--, 1);\n            }\n        }\n    };\n    /** Trigger the given event in the context of this instance of EventGroup. */ EventGroup1.prototype.raise = function(eventName, eventArgs, bubbleEvent) {\n        return EventGroup1.raise(this._parent, eventName, eventArgs, bubbleEvent);\n    };\n    /** Declare an event as being supported by this instance of EventGroup. */ EventGroup1.prototype.declare = function(event) {\n        var declaredEvents = this._parent.__declaredEvents = this._parent.__declaredEvents || {};\n        if (typeof event === \"string\") declaredEvents[event] = true;\n        else for(var i = 0; i < event.length; i++)declaredEvents[event[i]] = true;\n    };\n    EventGroup1._uniqueId = 0;\n    return EventGroup1;\n}();\n\n},{\"./object\":\"1JxOl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1JxOl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Compares a to b and b to a.\n *\n * @public\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"shallowCompare\", ()=>shallowCompare);\n/**\n * Makes a resulting merge of a bunch of objects. Pass in the target object followed by 1 or more\n * objects as arguments and they will be merged sequentially into the target. Note that this will\n * shallow merge; it will not create new cloned values for target members.\n *\n * @public\n * @param target - Target object to merge following object arguments into.\n * @param args - One or more objects that will be mixed into the target in the order they are provided.\n * @returns Resulting merged target.\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"assign\", ()=>assign);\n/**\n * Makes a resulting merge of a bunch of objects, but allows a filter function to be passed in to filter\n * the resulting merges. This allows for scenarios where you want to merge \"everything except that one thing\"\n * or \"properties that start with data-\". Note that this will shallow merge; it will not create new cloned\n * values for target members.\n *\n * @public\n * @param isAllowed - Callback to determine if the given propName is allowed in the result.\n * @param target - Target object to merge following object arguments into.\n * @param args - One or more objects that will be mixed into the target in the order they are provided.\n * @returns Resulting merged target.\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"filteredAssign\", ()=>filteredAssign);\n/**\n * Takes an enum and iterates over each value of the enum (as a string), running the callback on each,\n * returning a mapped array.\n * @param theEnum - Enum to iterate over\n * @param callback - The first parameter the name of the entry, and the second parameter is the value\n * of that entry, which is the value you'd normally use when using the enum (usually a number).\n */ parcelHelpers.export(exports, \"mapEnumByName\", ()=>mapEnumByName);\n/**\n * Get all values in an object dictionary\n *\n * @param obj - The dictionary to get values for\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"values\", ()=>values);\n/**\n * Tiny helper to do the minimal amount of work in duplicating an object but omitting some\n * props. This ends up faster than using object ...rest or reduce to filter.\n *\n * This behaves very much like filteredAssign, but does not merge many objects together,\n * uses an exclusion object map, and avoids spreads all for optimal performance.\n *\n * See perf test for background:\n * https://jsperf.com/omit-vs-rest-vs-reduce/1\n *\n * @param obj - The object to clone\n * @param exclusions - The array of keys to exclude\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"omit\", ()=>omit);\nfunction shallowCompare(a, b) {\n    for(var propName in a)if (a.hasOwnProperty(propName)) {\n        if (!b.hasOwnProperty(propName) || b[propName] !== a[propName]) return false;\n    }\n    for(var propName in b)if (b.hasOwnProperty(propName)) {\n        if (!a.hasOwnProperty(propName)) return false;\n    }\n    return true;\n}\nfunction assign(target) {\n    var args = [];\n    for(var _i = 1; _i < arguments.length; _i++)args[_i - 1] = arguments[_i];\n    return filteredAssign.apply(this, [\n        null,\n        target\n    ].concat(args));\n}\nfunction filteredAssign(isAllowed, target) {\n    var args = [];\n    for(var _i = 2; _i < arguments.length; _i++)args[_i - 2] = arguments[_i];\n    target = target || {};\n    for(var _a = 0, args_1 = args; _a < args_1.length; _a++){\n        var sourceObject = args_1[_a];\n        if (sourceObject) {\n            for(var propName in sourceObject)if (sourceObject.hasOwnProperty(propName) && (!isAllowed || isAllowed(propName))) target[propName] = sourceObject[propName];\n        }\n    }\n    return target;\n}\nfunction mapEnumByName(// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntheEnum, callback) {\n    // map<any> to satisfy compiler since it doesn't realize we strip out undefineds in the .filter() call\n    return Object.keys(theEnum).map(function(p) {\n        // map on each property name as a string\n        if (String(Number(p)) !== p) // if the property is not just a number (because enums in TypeScript will map both ways)\n        return callback(p, theEnum[p]);\n        return undefined;\n    }).filter(function(v) {\n        return !!v;\n    }); // only return elements with values\n}\nfunction values(obj) {\n    return Object.keys(obj).reduce(function(arr, key) {\n        arr.push(obj[key]);\n        return arr;\n    }, []);\n}\nfunction omit(obj, exclusions) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var result = {};\n    for(var key in obj)if (exclusions.indexOf(key) === -1 && obj.hasOwnProperty(key)) result[key] = obj[key];\n    return result;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aHIQw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DATA_IS_SCROLLABLE_ATTRIBUTE\", ()=>DATA_IS_SCROLLABLE_ATTRIBUTE);\nparcelHelpers.export(exports, \"allowScrollOnElement\", ()=>allowScrollOnElement);\nparcelHelpers.export(exports, \"allowOverscrollOnElement\", ()=>allowOverscrollOnElement);\n/**\n * Disables the body scrolling.\n *\n * @public\n */ parcelHelpers.export(exports, \"disableBodyScroll\", ()=>disableBodyScroll);\n/**\n * Enables the body scrolling.\n *\n * @public\n */ parcelHelpers.export(exports, \"enableBodyScroll\", ()=>enableBodyScroll);\n/**\n * Calculates the width of a scrollbar for the browser/os.\n *\n * @public\n */ parcelHelpers.export(exports, \"getScrollbarWidth\", ()=>getScrollbarWidth);\n/**\n * Traverses up the DOM for the element with the data-is-scrollable=true attribute, or returns\n * document.body.\n *\n * @public\n */ parcelHelpers.export(exports, \"findScrollableParent\", ()=>findScrollableParent);\nvar _getDocument = require(\"./dom/getDocument\");\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _getWindow = require(\"./dom/getWindow\");\nvar _scrollbarWidth;\nvar _bodyScrollDisabledCount = 0;\nvar DisabledScrollClassName = (0, _mergeStyles.mergeStyles)({\n    overflow: \"hidden !important\"\n});\nvar DATA_IS_SCROLLABLE_ATTRIBUTE = \"data-is-scrollable\";\nvar allowScrollOnElement = function(element, events) {\n    if (!element) return;\n    var _previousClientY = 0;\n    var _element = null;\n    // remember the clientY for future calls of _preventOverscrolling\n    var _saveClientY = function(event) {\n        if (event.targetTouches.length === 1) _previousClientY = event.targetTouches[0].clientY;\n    };\n    // prevent the body from scrolling when the user attempts\n    // to scroll past the top or bottom of the element\n    var _preventOverscrolling = function(event) {\n        // only respond to a single-finger touch\n        if (event.targetTouches.length !== 1) return;\n        // prevent the body touchmove handler from firing\n        // so that scrolling is allowed within the element\n        event.stopPropagation();\n        if (!_element) return;\n        var clientY = event.targetTouches[0].clientY - _previousClientY;\n        var scrollableParent = findScrollableParent(event.target);\n        if (scrollableParent) _element = scrollableParent;\n        // if the element is scrolled to the top,\n        // prevent the user from scrolling up\n        if (_element.scrollTop === 0 && clientY > 0) event.preventDefault();\n        // if the element is scrolled to the bottom,\n        // prevent the user from scrolling down\n        if (_element.scrollHeight - Math.ceil(_element.scrollTop) <= _element.clientHeight && clientY < 0) event.preventDefault();\n    };\n    events.on(element, \"touchstart\", _saveClientY, {\n        passive: false\n    });\n    events.on(element, \"touchmove\", _preventOverscrolling, {\n        passive: false\n    });\n    _element = element;\n};\nvar allowOverscrollOnElement = function(element, events) {\n    if (!element) return;\n    var _allowElementScroll = function(event) {\n        event.stopPropagation();\n    };\n    events.on(element, \"touchmove\", _allowElementScroll, {\n        passive: false\n    });\n};\nvar _disableIosBodyScroll = function(event) {\n    event.preventDefault();\n};\nfunction disableBodyScroll() {\n    var doc = (0, _getDocument.getDocument)();\n    if (doc && doc.body && !_bodyScrollDisabledCount) {\n        doc.body.classList.add(DisabledScrollClassName);\n        doc.body.addEventListener(\"touchmove\", _disableIosBodyScroll, {\n            passive: false,\n            capture: false\n        });\n    }\n    _bodyScrollDisabledCount++;\n}\nfunction enableBodyScroll() {\n    if (_bodyScrollDisabledCount > 0) {\n        var doc = (0, _getDocument.getDocument)();\n        if (doc && doc.body && _bodyScrollDisabledCount === 1) {\n            doc.body.classList.remove(DisabledScrollClassName);\n            doc.body.removeEventListener(\"touchmove\", _disableIosBodyScroll);\n        }\n        _bodyScrollDisabledCount--;\n    }\n}\nfunction getScrollbarWidth() {\n    if (_scrollbarWidth === undefined) {\n        var scrollDiv = document.createElement(\"div\");\n        scrollDiv.style.setProperty(\"width\", \"100px\");\n        scrollDiv.style.setProperty(\"height\", \"100px\");\n        scrollDiv.style.setProperty(\"overflow\", \"scroll\");\n        scrollDiv.style.setProperty(\"position\", \"absolute\");\n        scrollDiv.style.setProperty(\"top\", \"-9999px\");\n        document.body.appendChild(scrollDiv);\n        // Get the scrollbar width\n        _scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n        // Delete the DIV\n        document.body.removeChild(scrollDiv);\n    }\n    return _scrollbarWidth;\n}\nfunction findScrollableParent(startingElement) {\n    var el = startingElement;\n    var doc = (0, _getDocument.getDocument)(startingElement);\n    // First do a quick scan for the scrollable attribute.\n    while(el && el !== doc.body){\n        if (el.getAttribute(DATA_IS_SCROLLABLE_ATTRIBUTE) === \"true\") return el;\n        el = el.parentElement;\n    }\n    // If we haven't found it, the use the slower method: compute styles to evaluate if overflow is set.\n    el = startingElement;\n    while(el && el !== doc.body){\n        if (el.getAttribute(DATA_IS_SCROLLABLE_ATTRIBUTE) !== \"false\") {\n            var computedStyles = getComputedStyle(el);\n            var overflowY = computedStyles ? computedStyles.getPropertyValue(\"overflow-y\") : \"\";\n            if (overflowY && (overflowY === \"scroll\" || overflowY === \"auto\")) return el;\n        }\n        el = el.parentElement;\n    }\n    // Fall back to window scroll.\n    if (!el || el === doc.body) el = (0, _getWindow.getWindow)(startingElement);\n    return el;\n}\n\n},{\"./dom/getDocument\":\"bYcmK\",\"@uifabric/merge-styles\":\"7c43M\",\"./dom/getWindow\":\"8f64x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bYcmK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Helper to get the document object. Note that in popup window cases, document\n * might be the wrong document, which is why we look at ownerDocument for the\n * truth. Also note that the SSR flag is used to test ssr scenarios even if\n * document is defined (from JSDOM for example.)\n *\n * @public\n */ parcelHelpers.export(exports, \"getDocument\", ()=>getDocument);\nvar _setSSR = require(\"./setSSR\");\nfunction getDocument(rootElement) {\n    if ((0, _setSSR._isSSR) || typeof document === \"undefined\") return undefined;\n    else {\n        var el = rootElement;\n        return el && el.ownerDocument ? el.ownerDocument : document;\n    }\n}\n\n},{\"./setSSR\":\"4vvfQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7c43M\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mergeStyles\", ()=>(0, _mergeStyles.mergeStyles));\nparcelHelpers.export(exports, \"mergeCss\", ()=>(0, _mergeStyles.mergeCss));\nparcelHelpers.export(exports, \"mergeStyleSets\", ()=>(0, _mergeStyleSets.mergeStyleSets));\nparcelHelpers.export(exports, \"mergeCssSets\", ()=>(0, _mergeStyleSets.mergeCssSets));\nparcelHelpers.export(exports, \"concatStyleSets\", ()=>(0, _concatStyleSets.concatStyleSets));\nparcelHelpers.export(exports, \"concatStyleSetsWithProps\", ()=>(0, _concatStyleSetsWithProps.concatStyleSetsWithProps));\nparcelHelpers.export(exports, \"fontFace\", ()=>(0, _fontFace.fontFace));\nparcelHelpers.export(exports, \"keyframes\", ()=>(0, _keyframes.keyframes));\nparcelHelpers.export(exports, \"setRTL\", ()=>(0, _styleOptionsState.setRTL));\nvar _version = require(\"./version\");\nvar _mergeStyles = require(\"./mergeStyles\");\nvar _mergeStyleSets = require(\"./mergeStyleSets\");\nvar _concatStyleSets = require(\"./concatStyleSets\");\nvar _concatStyleSetsWithProps = require(\"./concatStyleSetsWithProps\");\nvar _fontFace = require(\"./fontFace\");\nvar _keyframes = require(\"./keyframes\");\nvar _stylesheet = require(\"./Stylesheet\");\nparcelHelpers.exportAll(_stylesheet, exports);\nvar _styleOptionsState = require(\"./StyleOptionsState\");\n\n},{\"./version\":\"cZ3jI\",\"./mergeStyles\":\"hqFMS\",\"./mergeStyleSets\":\"kOnL1\",\"./concatStyleSets\":\"4uvUY\",\"./concatStyleSetsWithProps\":\"gQyo3\",\"./fontFace\":\"7Zddc\",\"./keyframes\":\"cDl24\",\"./Stylesheet\":\"3fIre\",\"./StyleOptionsState\":\"3b7RJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cZ3jI\":[function(require,module,exports) {\n// Do not modify this file; it is generated as part of publish.\n// The checked in version is a placeholder only and will not be updated.\nvar _setVersion = require(\"@uifabric/set-version\");\n(0, _setVersion.setVersion)(\"@uifabric/merge-styles\", \"7.19.1\");\n\n},{\"@uifabric/set-version\":\"896RR\"}],\"hqFMS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Concatenation helper, which can merge class names together. Skips over falsey values.\n *\n * @public\n */ parcelHelpers.export(exports, \"mergeStyles\", ()=>mergeStyles);\n/**\n * Concatenation helper, which can merge class names together. Skips over falsey values.\n * Accepts a set of options that will be used when calculating styles.\n *\n * @public\n */ parcelHelpers.export(exports, \"mergeCss\", ()=>mergeCss);\nvar _extractStyleParts = require(\"./extractStyleParts\");\nvar _styleOptionsState = require(\"./StyleOptionsState\");\nvar _styleToClassName = require(\"./styleToClassName\");\nfunction mergeStyles() {\n    var args = [];\n    for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n    return mergeCss(args, (0, _styleOptionsState.getStyleOptions)());\n}\nfunction mergeCss(args, options) {\n    var styleArgs = args instanceof Array ? args : [\n        args\n    ];\n    var _a = (0, _extractStyleParts.extractStyleParts)(styleArgs), classes = _a.classes, objects = _a.objects;\n    if (objects.length) classes.push((0, _styleToClassName.styleToClassName)(options || {}, objects));\n    return classes.join(\" \");\n}\n\n},{\"./extractStyleParts\":\"dFWxl\",\"./StyleOptionsState\":\"3b7RJ\",\"./styleToClassName\":\"eoBZe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dFWxl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Separates the classes and style objects. Any classes that are pre-registered\n * args are auto expanded into objects.\n */ parcelHelpers.export(exports, \"extractStyleParts\", ()=>extractStyleParts);\nvar _stylesheet = require(\"./Stylesheet\");\nfunction extractStyleParts() {\n    var args = [];\n    for(var _i1 = 0; _i1 < arguments.length; _i1++)args[_i1] = arguments[_i1];\n    var classes = [];\n    var objects = [];\n    var stylesheet = (0, _stylesheet.Stylesheet).getInstance();\n    function _processArgs(argsList) {\n        for(var _i = 0, argsList_1 = argsList; _i < argsList_1.length; _i++){\n            var arg = argsList_1[_i];\n            if (arg) {\n                if (typeof arg === \"string\") {\n                    if (arg.indexOf(\" \") >= 0) _processArgs(arg.split(\" \"));\n                    else {\n                        var translatedArgs = stylesheet.argsFromClassName(arg);\n                        if (translatedArgs) _processArgs(translatedArgs);\n                        else // Avoid adding the same class twice.\n                        if (classes.indexOf(arg) === -1) classes.push(arg);\n                    }\n                } else if (Array.isArray(arg)) _processArgs(arg);\n                else if (typeof arg === \"object\") objects.push(arg);\n            }\n        }\n    }\n    _processArgs(args);\n    return {\n        classes: classes,\n        objects: objects\n    };\n}\n\n},{\"./Stylesheet\":\"3fIre\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3fIre\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"InjectionMode\", ()=>InjectionMode);\nparcelHelpers.export(exports, \"Stylesheet\", ()=>Stylesheet);\nvar _tslib = require(\"tslib\");\nvar InjectionMode = {\n    /**\n     * Avoids style injection, use getRules() to read the styles.\n     */ none: 0,\n    /**\n     * Inserts rules using the insertRule api.\n     */ insertNode: 1,\n    /**\n     * Appends rules using appendChild.\n     */ appendChild: 2\n};\nvar STYLESHEET_SETTING = \"__stylesheet__\";\n/**\n * MSIE 11 doesn't cascade styles based on DOM ordering, but rather on the order that each style node\n * is created. As such, to maintain consistent priority, IE11 should reuse a single style node.\n */ var REUSE_STYLE_NODE = typeof navigator !== \"undefined\" && /rv:11.0/.test(navigator.userAgent);\nvar _global = {};\n// Grab window.\ntry {\n    _global = window;\n} catch (_a) {\n/* leave as blank object */ }\nvar _stylesheet;\n/**\n * Represents the state of styles registered in the page. Abstracts\n * the surface for adding styles to the stylesheet, exposes helpers\n * for reading the styles registered in server rendered scenarios.\n *\n * @public\n */ var Stylesheet = /** @class */ function() {\n    function Stylesheet1(config) {\n        this._rules = [];\n        this._preservedRules = [];\n        this._rulesToInsert = [];\n        this._counter = 0;\n        this._keyToClassName = {};\n        this._onResetCallbacks = [];\n        this._classNameToArgs = {};\n        this._config = (0, _tslib.__assign)({\n            injectionMode: InjectionMode.insertNode,\n            defaultPrefix: \"css\",\n            namespace: undefined,\n            cspSettings: undefined\n        }, config);\n        this._keyToClassName = this._config.classNameCache || {};\n    }\n    /**\n     * Gets the singleton instance.\n     */ Stylesheet1.getInstance = function() {\n        var _a1;\n        _stylesheet = _global[STYLESHEET_SETTING];\n        if (!_stylesheet || _stylesheet._lastStyleElement && _stylesheet._lastStyleElement.ownerDocument !== document) {\n            var fabricConfig = ((_a1 = _global) === null || _a1 === void 0 ? void 0 : _a1.FabricConfig) || {};\n            _stylesheet = _global[STYLESHEET_SETTING] = new Stylesheet1(fabricConfig.mergeStyles);\n        }\n        return _stylesheet;\n    };\n    /**\n     * Configures the stylesheet.\n     */ Stylesheet1.prototype.setConfig = function(config) {\n        this._config = (0, _tslib.__assign)((0, _tslib.__assign)({}, this._config), config);\n    };\n    /**\n     * Configures a reset callback.\n     *\n     * @param callback - A callback which will be called when the Stylesheet is reset.\n     */ Stylesheet1.prototype.onReset = function(callback) {\n        this._onResetCallbacks.push(callback);\n    };\n    /**\n     * Generates a unique classname.\n     *\n     * @param displayName - Optional value to use as a prefix.\n     */ Stylesheet1.prototype.getClassName = function(displayName) {\n        var namespace = this._config.namespace;\n        var prefix = displayName || this._config.defaultPrefix;\n        return \"\" + (namespace ? namespace + \"-\" : \"\") + prefix + \"-\" + this._counter++;\n    };\n    /**\n     * Used internally to cache information about a class which was\n     * registered with the stylesheet.\n     */ Stylesheet1.prototype.cacheClassName = function(className, key, args, rules) {\n        this._keyToClassName[key] = className;\n        this._classNameToArgs[className] = {\n            args: args,\n            rules: rules\n        };\n    };\n    /**\n     * Gets the appropriate classname given a key which was previously\n     * registered using cacheClassName.\n     */ Stylesheet1.prototype.classNameFromKey = function(key) {\n        return this._keyToClassName[key];\n    };\n    /**\n     * Gets all classnames cache with the stylesheet.\n     */ Stylesheet1.prototype.getClassNameCache = function() {\n        return this._keyToClassName;\n    };\n    /**\n     * Gets the arguments associated with a given classname which was\n     * previously registered using cacheClassName.\n     */ Stylesheet1.prototype.argsFromClassName = function(className) {\n        var entry = this._classNameToArgs[className];\n        return entry && entry.args;\n    };\n    /**\n     * Gets the arguments associated with a given classname which was\n     * previously registered using cacheClassName.\n     */ Stylesheet1.prototype.insertedRulesFromClassName = function(className) {\n        var entry = this._classNameToArgs[className];\n        return entry && entry.rules;\n    };\n    /**\n     * Inserts a css rule into the stylesheet.\n     * @param preserve - Preserves the rule beyond a reset boundary.\n     */ Stylesheet1.prototype.insertRule = function(rule, preserve) {\n        var injectionMode = this._config.injectionMode;\n        var element = injectionMode !== InjectionMode.none ? this._getStyleElement() : undefined;\n        if (preserve) this._preservedRules.push(rule);\n        if (element) switch(this._config.injectionMode){\n            case InjectionMode.insertNode:\n                var sheet = element.sheet;\n                try {\n                    sheet.insertRule(rule, sheet.cssRules.length);\n                } catch (e) {\n                // The browser will throw exceptions on unsupported rules (such as a moz prefix in webkit.)\n                // We need to swallow the exceptions for this scenario, otherwise we'd need to filter\n                // which could be slower and bulkier.\n                }\n                break;\n            case InjectionMode.appendChild:\n                element.appendChild(document.createTextNode(rule));\n                break;\n        }\n        else this._rules.push(rule);\n        if (this._config.onInsertRule) this._config.onInsertRule(rule);\n    };\n    /**\n     * Gets all rules registered with the stylesheet; only valid when\n     * using InsertionMode.none.\n     */ Stylesheet1.prototype.getRules = function(includePreservedRules) {\n        return (includePreservedRules ? this._preservedRules.join(\"\") : \"\") + this._rules.join(\"\") + this._rulesToInsert.join(\"\");\n    };\n    /**\n     * Resets the internal state of the stylesheet. Only used in server\n     * rendered scenarios where we're using InsertionMode.none.\n     */ Stylesheet1.prototype.reset = function() {\n        this._rules = [];\n        this._rulesToInsert = [];\n        this._counter = 0;\n        this._classNameToArgs = {};\n        this._keyToClassName = {};\n        this._onResetCallbacks.forEach(function(callback) {\n            return callback();\n        });\n    };\n    // Forces the regeneration of incoming styles without totally resetting the stylesheet.\n    Stylesheet1.prototype.resetKeys = function() {\n        this._keyToClassName = {};\n    };\n    Stylesheet1.prototype._getStyleElement = function() {\n        var _this = this;\n        if (!this._styleElement && typeof document !== \"undefined\") {\n            this._styleElement = this._createStyleElement();\n            if (!REUSE_STYLE_NODE) // Reset the style element on the next frame.\n            window.requestAnimationFrame(function() {\n                _this._styleElement = undefined;\n            });\n        }\n        return this._styleElement;\n    };\n    Stylesheet1.prototype._createStyleElement = function() {\n        var head = document.head;\n        var styleElement = document.createElement(\"style\");\n        styleElement.setAttribute(\"data-merge-styles\", \"true\");\n        var cspSettings = this._config.cspSettings;\n        if (cspSettings) {\n            if (cspSettings.nonce) styleElement.setAttribute(\"nonce\", cspSettings.nonce);\n        }\n        if (this._lastStyleElement) // If the `nextElementSibling` is null, then the insertBefore will act as a regular append.\n        // https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore#Syntax\n        head.insertBefore(styleElement, this._lastStyleElement.nextElementSibling);\n        else {\n            var placeholderStyleTag = this._findPlaceholderStyleTag();\n            if (placeholderStyleTag) head.insertBefore(styleElement, placeholderStyleTag.nextElementSibling);\n            else head.insertBefore(styleElement, head.childNodes[0]);\n        }\n        this._lastStyleElement = styleElement;\n        return styleElement;\n    };\n    Stylesheet1.prototype._findPlaceholderStyleTag = function() {\n        var head = document.head;\n        if (head) return head.querySelector(\"style[data-merge-styles]\");\n        return null;\n    };\n    return Stylesheet1;\n}();\n\n},{\"tslib\":\"01Tx1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3b7RJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Sets the current RTL value.\n */ parcelHelpers.export(exports, \"setRTL\", ()=>setRTL);\n/**\n * Gets the current RTL value.\n */ parcelHelpers.export(exports, \"getRTL\", ()=>getRTL);\nparcelHelpers.export(exports, \"getStyleOptions\", ()=>getStyleOptions);\nfunction setRTL(isRTL) {\n    if (_rtl !== isRTL) _rtl = isRTL;\n}\nfunction getRTL() {\n    if (_rtl === undefined) _rtl = typeof document !== \"undefined\" && !!document.documentElement && document.documentElement.getAttribute(\"dir\") === \"rtl\";\n    return _rtl;\n}\n// This has been split into 2 lines because it was working in Fabric due to the code being transpiled to es5, so this\n// was converted to var while not working in Fluent that uses babel to transpile the code to be es6-like. Splitting the\n// logic into two lines, however, allows it to work in both scenarios.\nvar _rtl;\n_rtl = getRTL();\nfunction getStyleOptions() {\n    return {\n        rtl: getRTL()\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eoBZe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"serializeRuleEntries\", ()=>serializeRuleEntries);\nparcelHelpers.export(exports, \"styleToRegistration\", ()=>styleToRegistration);\n/**\n * Insert style to stylesheet.\n * @param registration Style registration.\n * @param specificityMultiplier Number of times classname selector is repeated in the css rule.\n * This is to increase css specificity in case it's needed. Default to 1.\n */ parcelHelpers.export(exports, \"applyRegistration\", ()=>applyRegistration);\nparcelHelpers.export(exports, \"styleToClassName\", ()=>styleToClassName);\nvar _tslib = require(\"tslib\");\nvar _stylesheet = require(\"./Stylesheet\");\nvar _kebabRules = require(\"./transforms/kebabRules\");\nvar _prefixRules = require(\"./transforms/prefixRules\");\nvar _provideUnits = require(\"./transforms/provideUnits\");\nvar _rtlifyRules = require(\"./transforms/rtlifyRules\");\nvar DISPLAY_NAME = \"displayName\";\nfunction getDisplayName(rules) {\n    var rootStyle = rules && rules[\"&\"];\n    return rootStyle ? rootStyle.displayName : undefined;\n}\nvar globalSelectorRegExp = /\\:global\\((.+?)\\)/g;\n/**\n * Finds comma separated selectors in a :global() e.g. \":global(.class1, .class2, .class3)\"\n * and wraps them each in their own global \":global(.class1), :global(.class2), :global(.class3)\"\n *\n * @param selectorWithGlobals The selector to process\n * @returns The updated selector\n */ function expandCommaSeparatedGlobals(selectorWithGlobals) {\n    // We the selector does not have a :global() we can shortcut\n    if (!globalSelectorRegExp.test(selectorWithGlobals)) return selectorWithGlobals;\n    var replacementInfo = [];\n    var findGlobal = /\\:global\\((.+?)\\)/g;\n    var match = null;\n    // Create a result list for global selectors so we can replace them.\n    while(match = findGlobal.exec(selectorWithGlobals))// Only if the found selector is a comma separated list we'll process it.\n    if (match[1].indexOf(\",\") > -1) replacementInfo.push([\n        match.index,\n        match.index + match[0].length,\n        // Wrap each of the found selectors in :global()\n        match[1].split(\",\").map(function(v) {\n            return \":global(\" + v.trim() + \")\";\n        }).join(\", \"), \n    ]);\n    // Replace the found selectors with their wrapped variants in reverse order\n    return replacementInfo.reverse().reduce(function(selector, _a) {\n        var matchIndex = _a[0], matchEndIndex = _a[1], replacement = _a[2];\n        var prefix = selector.slice(0, matchIndex);\n        var suffix = selector.slice(matchEndIndex);\n        return prefix + replacement + suffix;\n    }, selectorWithGlobals);\n}\nfunction expandSelector(newSelector, currentSelector) {\n    if (newSelector.indexOf(\":global(\") >= 0) return newSelector.replace(globalSelectorRegExp, \"$1\");\n    else if (newSelector.indexOf(\":\") === 0) return currentSelector + newSelector;\n    else if (newSelector.indexOf(\"&\") < 0) return currentSelector + \" \" + newSelector;\n    return newSelector;\n}\nfunction extractSelector(currentSelector, rules, selector, value) {\n    if (rules === void 0) rules = {\n        __order: []\n    };\n    if (selector.indexOf(\"@\") === 0) {\n        selector = selector + \"{\" + currentSelector;\n        extractRules([\n            value\n        ], rules, selector);\n    } else if (selector.indexOf(\",\") > -1) expandCommaSeparatedGlobals(selector).split(\",\").map(function(s) {\n        return s.trim();\n    }).forEach(function(separatedSelector) {\n        return extractRules([\n            value\n        ], rules, expandSelector(separatedSelector, currentSelector));\n    });\n    else extractRules([\n        value\n    ], rules, expandSelector(selector, currentSelector));\n}\nfunction extractRules(args, rules, currentSelector) {\n    if (rules === void 0) rules = {\n        __order: []\n    };\n    if (currentSelector === void 0) currentSelector = \"&\";\n    var stylesheet = (0, _stylesheet.Stylesheet).getInstance();\n    var currentRules = rules[currentSelector];\n    if (!currentRules) {\n        currentRules = {};\n        rules[currentSelector] = currentRules;\n        rules.__order.push(currentSelector);\n    }\n    for(var _i = 0, args_1 = args; _i < args_1.length; _i++){\n        var arg = args_1[_i];\n        // If the arg is a string, we need to look up the class map and merge.\n        if (typeof arg === \"string\") {\n            var expandedRules = stylesheet.argsFromClassName(arg);\n            if (expandedRules) extractRules(expandedRules, rules, currentSelector);\n        // Else if the arg is an array, we need to recurse in.\n        } else if (Array.isArray(arg)) extractRules(arg, rules, currentSelector);\n        else {\n            for(var prop in arg)if (arg.hasOwnProperty(prop)) {\n                var propValue = arg[prop];\n                if (prop === \"selectors\") {\n                    // every child is a selector.\n                    var selectors = arg.selectors;\n                    for(var newSelector in selectors)if (selectors.hasOwnProperty(newSelector)) extractSelector(currentSelector, rules, newSelector, selectors[newSelector]);\n                } else if (typeof propValue === \"object\") // prop is a selector.\n                {\n                    if (propValue !== null) extractSelector(currentSelector, rules, prop, propValue);\n                } else if (propValue !== undefined) {\n                    // Else, add the rule to the currentSelector.\n                    if (prop === \"margin\" || prop === \"padding\") expandQuads(currentRules, prop, propValue);\n                    else currentRules[prop] = propValue;\n                }\n            }\n        }\n    }\n    return rules;\n}\nfunction expandQuads(currentRules, name, value) {\n    var parts = typeof value === \"string\" ? value.split(\" \") : [\n        value\n    ];\n    currentRules[name + \"Top\"] = parts[0];\n    currentRules[name + \"Right\"] = parts[1] || parts[0];\n    currentRules[name + \"Bottom\"] = parts[2] || parts[0];\n    currentRules[name + \"Left\"] = parts[3] || parts[1] || parts[0];\n}\nfunction getKeyForRules(options, rules) {\n    var serialized = [\n        options.rtl ? \"rtl\" : \"ltr\"\n    ];\n    var hasProps = false;\n    for(var _i = 0, _a = rules.__order; _i < _a.length; _i++){\n        var selector = _a[_i];\n        serialized.push(selector);\n        var rulesForSelector = rules[selector];\n        for(var propName in rulesForSelector)if (rulesForSelector.hasOwnProperty(propName) && rulesForSelector[propName] !== undefined) {\n            hasProps = true;\n            serialized.push(propName, rulesForSelector[propName]);\n        }\n    }\n    return hasProps ? serialized.join(\"\") : undefined;\n}\nfunction repeatString(target, count) {\n    if (count <= 0) return \"\";\n    if (count === 1) return target;\n    return target + repeatString(target, count - 1);\n}\nfunction serializeRuleEntries(options, ruleEntries) {\n    if (!ruleEntries) return \"\";\n    var allEntries = [];\n    for(var entry in ruleEntries)if (ruleEntries.hasOwnProperty(entry) && entry !== DISPLAY_NAME && ruleEntries[entry] !== undefined) allEntries.push(entry, ruleEntries[entry]);\n    // Apply transforms.\n    for(var i = 0; i < allEntries.length; i += 2){\n        (0, _kebabRules.kebabRules)(allEntries, i);\n        (0, _provideUnits.provideUnits)(allEntries, i);\n        (0, _rtlifyRules.rtlifyRules)(options, allEntries, i);\n        (0, _prefixRules.prefixRules)(allEntries, i);\n    }\n    // Apply punctuation.\n    for(var i = 1; i < allEntries.length; i += 4)allEntries.splice(i, 1, \":\", allEntries[i], \";\");\n    return allEntries.join(\"\");\n}\nfunction styleToRegistration(options) {\n    var args = [];\n    for(var _i = 1; _i < arguments.length; _i++)args[_i - 1] = arguments[_i];\n    var rules = extractRules(args);\n    var key = getKeyForRules(options, rules);\n    if (key) {\n        var stylesheet = (0, _stylesheet.Stylesheet).getInstance();\n        var registration = {\n            className: stylesheet.classNameFromKey(key),\n            key: key,\n            args: args\n        };\n        if (!registration.className) {\n            registration.className = stylesheet.getClassName(getDisplayName(rules));\n            var rulesToInsert = [];\n            for(var _a = 0, _b = rules.__order; _a < _b.length; _a++){\n                var selector = _b[_a];\n                rulesToInsert.push(selector, serializeRuleEntries(options, rules[selector]));\n            }\n            registration.rulesToInsert = rulesToInsert;\n        }\n        return registration;\n    }\n    return undefined;\n}\nfunction applyRegistration(registration, specificityMultiplier) {\n    if (specificityMultiplier === void 0) specificityMultiplier = 1;\n    var stylesheet = (0, _stylesheet.Stylesheet).getInstance();\n    var className = registration.className, key = registration.key, args = registration.args, rulesToInsert = registration.rulesToInsert;\n    if (rulesToInsert) {\n        // rulesToInsert is an ordered array of selector/rule pairs.\n        for(var i = 0; i < rulesToInsert.length; i += 2){\n            var rules = rulesToInsert[i + 1];\n            if (rules) {\n                var selector = rulesToInsert[i];\n                selector = selector.replace(/&/g, repeatString(\".\" + registration.className, specificityMultiplier));\n                // Insert. Note if a media query, we must close the query with a final bracket.\n                var processedRule = selector + \"{\" + rules + \"}\" + (selector.indexOf(\"@\") === 0 ? \"}\" : \"\");\n                stylesheet.insertRule(processedRule);\n            }\n        }\n        stylesheet.cacheClassName(className, key, args, rulesToInsert);\n    }\n}\nfunction styleToClassName(options) {\n    var args = [];\n    for(var _i = 1; _i < arguments.length; _i++)args[_i - 1] = arguments[_i];\n    var registration = styleToRegistration.apply(void 0, (0, _tslib.__spreadArrays)([\n        options\n    ], args));\n    if (registration) {\n        applyRegistration(registration, options.specificityMultiplier);\n        return registration.className;\n    }\n    return \"\";\n}\n\n},{\"tslib\":\"01Tx1\",\"./Stylesheet\":\"3fIre\",\"./transforms/kebabRules\":\"l3pfM\",\"./transforms/prefixRules\":\"eIEfs\",\"./transforms/provideUnits\":\"2wAA8\",\"./transforms/rtlifyRules\":\"aLk1W\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l3pfM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"kebabRules\", ()=>kebabRules);\nvar rules = {};\nfunction kebabRules(rulePairs, index) {\n    var rule = rulePairs[index];\n    if (rule.charAt(0) !== \"-\") rulePairs[index] = rules[rule] = rules[rule] || rule.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eIEfs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"prefixRules\", ()=>prefixRules);\nvar _getVendorSettings = require(\"../getVendorSettings\");\nvar autoPrefixNames = {\n    \"user-select\": 1\n};\nfunction prefixRules(rulePairs, index) {\n    var vendorSettings = (0, _getVendorSettings.getVendorSettings)();\n    var name = rulePairs[index];\n    if (autoPrefixNames[name]) {\n        var value = rulePairs[index + 1];\n        if (autoPrefixNames[name]) {\n            if (vendorSettings.isWebkit) rulePairs.push(\"-webkit-\" + name, value);\n            if (vendorSettings.isMoz) rulePairs.push(\"-moz-\" + name, value);\n            if (vendorSettings.isMs) rulePairs.push(\"-ms-\" + name, value);\n            if (vendorSettings.isOpera) rulePairs.push(\"-o-\" + name, value);\n        }\n    }\n}\n\n},{\"../getVendorSettings\":\"5847L\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5847L\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getVendorSettings\", ()=>getVendorSettings);\n/**\n * Sets the vendor settings for prefixing and vendor specific operations.\n */ parcelHelpers.export(exports, \"setVendorSettings\", ()=>setVendorSettings);\nvar _vendorSettings;\nfunction getVendorSettings() {\n    if (!_vendorSettings) {\n        var doc = typeof document !== \"undefined\" ? document : undefined;\n        var nav = typeof navigator !== \"undefined\" ? navigator : undefined;\n        var userAgent = nav ? nav.userAgent.toLowerCase() : undefined;\n        if (!doc) _vendorSettings = {\n            isWebkit: true,\n            isMoz: true,\n            isOpera: true,\n            isMs: true\n        };\n        else _vendorSettings = {\n            isWebkit: !!(doc && \"WebkitAppearance\" in doc.documentElement.style),\n            isMoz: !!(userAgent && userAgent.indexOf(\"firefox\") > -1),\n            isOpera: !!(userAgent && userAgent.indexOf(\"opera\") > -1),\n            isMs: !!(nav && (/rv:11.0/i.test(nav.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent)))\n        };\n    }\n    return _vendorSettings;\n}\nfunction setVendorSettings(vendorSettings) {\n    _vendorSettings = vendorSettings;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2wAA8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"provideUnits\", ()=>provideUnits);\nvar NON_PIXEL_NUMBER_PROPS = [\n    \"column-count\",\n    \"font-weight\",\n    \"flex\",\n    \"flex-grow\",\n    \"flex-shrink\",\n    \"fill-opacity\",\n    \"opacity\",\n    \"order\",\n    \"z-index\",\n    \"zoom\", \n];\nfunction provideUnits(rulePairs, index) {\n    var name = rulePairs[index];\n    var value = rulePairs[index + 1];\n    if (typeof value === \"number\") {\n        var isNonPixelProp = NON_PIXEL_NUMBER_PROPS.indexOf(name) > -1;\n        var isVariableOrPrefixed = name.indexOf(\"--\") > -1;\n        var unit = isNonPixelProp || isVariableOrPrefixed ? \"\" : \"px\";\n        rulePairs[index + 1] = \"\" + value + unit;\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aLk1W\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * RTLifies the rulePair in the array at the current index. This mutates the array for performance\n * reasons.\n */ parcelHelpers.export(exports, \"rtlifyRules\", ()=>rtlifyRules);\nvar _a;\nvar LEFT = \"left\";\nvar RIGHT = \"right\";\nvar NO_FLIP = \"@noflip\";\nvar NAME_REPLACEMENTS = (_a = {}, _a[LEFT] = RIGHT, _a[RIGHT] = LEFT, _a);\nvar VALUE_REPLACEMENTS = {\n    \"w-resize\": \"e-resize\",\n    \"sw-resize\": \"se-resize\",\n    \"nw-resize\": \"ne-resize\"\n};\nfunction rtlifyRules(options, rulePairs, index) {\n    if (options.rtl) {\n        var name_1 = rulePairs[index];\n        if (!name_1) return;\n        var value = rulePairs[index + 1];\n        if (typeof value === \"string\" && value.indexOf(NO_FLIP) >= 0) rulePairs[index + 1] = value.replace(/\\s*(?:\\/\\*\\s*)?\\@noflip\\b(?:\\s*\\*\\/)?\\s*?/g, \"\");\n        else if (name_1.indexOf(LEFT) >= 0) rulePairs[index] = name_1.replace(LEFT, RIGHT);\n        else if (name_1.indexOf(RIGHT) >= 0) rulePairs[index] = name_1.replace(RIGHT, LEFT);\n        else if (String(value).indexOf(LEFT) >= 0) rulePairs[index + 1] = value.replace(LEFT, RIGHT);\n        else if (String(value).indexOf(RIGHT) >= 0) rulePairs[index + 1] = value.replace(RIGHT, LEFT);\n        else if (NAME_REPLACEMENTS[name_1]) rulePairs[index] = NAME_REPLACEMENTS[name_1];\n        else if (VALUE_REPLACEMENTS[value]) rulePairs[index + 1] = VALUE_REPLACEMENTS[value];\n        else switch(name_1){\n            case \"margin\":\n            case \"padding\":\n                rulePairs[index + 1] = flipQuad(value);\n                break;\n            case \"box-shadow\":\n                rulePairs[index + 1] = negateNum(value, 0);\n                break;\n        }\n    }\n}\n/**\n * Given a string value in a space delimited format (e.g. \"1 2 3 4\"), negates a particular value.\n */ function negateNum(value, partIndex) {\n    var parts = value.split(\" \");\n    var numberVal = parseInt(parts[partIndex], 10);\n    parts[0] = parts[0].replace(String(numberVal), String(numberVal * -1));\n    return parts.join(\" \");\n}\n/**\n * Given a string quad, flips the left and right values.\n */ function flipQuad(value) {\n    if (typeof value === \"string\") {\n        var parts = value.split(\" \");\n        if (parts.length === 4) return parts[0] + \" \" + parts[3] + \" \" + parts[2] + \" \" + parts[1];\n    }\n    return value;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kOnL1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Takes in one or more style set objects, each consisting of a set of areas,\n * each which will produce a class name. Using this is analogous to calling\n * `mergeStyles` for each property in the object, but ensures we maintain the\n * set ordering when multiple style sets are merged.\n *\n * @param styleSets - One or more style sets to be merged.\n */ parcelHelpers.export(exports, \"mergeStyleSets\", ()=>mergeStyleSets);\n/**\n * Takes in one or more style set objects, each1consisting of a set of areas,\n * each which will produce a class name. Using this is analogous to calling\n * `mergeCss` for each property in the object, but ensures the\n * set ordering when multiple style sets are merged.\n *\n * @param styleSets - One or more style sets to be merged.\n * @param options - (optional) Options to use when creating rules.\n */ parcelHelpers.export(exports, \"mergeCssSets\", ()=>mergeCssSets);\nvar _concatStyleSets = require(\"./concatStyleSets\");\nvar _extractStyleParts = require(\"./extractStyleParts\");\nvar _styleOptionsState = require(\"./StyleOptionsState\");\nvar _styleToClassName = require(\"./styleToClassName\");\nfunction mergeStyleSets() {\n    var styleSets = [];\n    for(var _i = 0; _i < arguments.length; _i++)styleSets[_i] = arguments[_i];\n    return mergeCssSets(styleSets, (0, _styleOptionsState.getStyleOptions)());\n}\nfunction mergeCssSets(styleSets, options) {\n    var _a, _b;\n    var classNameSet = {\n        subComponentStyles: {}\n    };\n    var styleSet = styleSets[0];\n    if (!styleSet && styleSets.length <= 1) return {\n        subComponentStyles: {}\n    };\n    var concatenatedStyleSet = (0, _concatStyleSets.concatStyleSets).apply(void 0, styleSets);\n    var registrations = [];\n    for(var styleSetArea in concatenatedStyleSet)if (concatenatedStyleSet.hasOwnProperty(styleSetArea)) {\n        if (styleSetArea === \"subComponentStyles\") {\n            classNameSet.subComponentStyles = concatenatedStyleSet.subComponentStyles || {};\n            continue;\n        }\n        var styles = concatenatedStyleSet[styleSetArea];\n        var _c = (0, _extractStyleParts.extractStyleParts)(styles), classes = _c.classes, objects = _c.objects;\n        if ((_a = objects) === null || _a === void 0 ? void 0 : _a.length) {\n            var registration = (0, _styleToClassName.styleToRegistration)(options || {}, {\n                displayName: styleSetArea\n            }, objects);\n            if (registration) {\n                registrations.push(registration);\n                classNameSet[styleSetArea] = classes.concat([\n                    registration.className\n                ]).join(\" \");\n            }\n        } else classNameSet[styleSetArea] = classes.join(\" \");\n    }\n    for(var _i = 0, registrations_1 = registrations; _i < registrations_1.length; _i++){\n        var registration = registrations_1[_i];\n        if (registration) (0, _styleToClassName.applyRegistration)(registration, (_b = options) === null || _b === void 0 ? void 0 : _b.specificityMultiplier);\n    }\n    return classNameSet;\n}\n\n},{\"./concatStyleSets\":\"4uvUY\",\"./extractStyleParts\":\"dFWxl\",\"./StyleOptionsState\":\"3b7RJ\",\"./styleToClassName\":\"eoBZe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4uvUY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Combine a set of styles together (but does not register css classes).\n * @param styleSets - One or more stylesets to be merged (each param can also be falsy).\n */ parcelHelpers.export(exports, \"concatStyleSets\", ()=>concatStyleSets);\nvar _tslib = require(\"tslib\");\nfunction concatStyleSets() {\n    var styleSets = [];\n    for(var _i = 0; _i < arguments.length; _i++)styleSets[_i] = arguments[_i];\n    if (styleSets && styleSets.length === 1 && styleSets[0] && !styleSets[0].subComponentStyles) return styleSets[0];\n    var mergedSet = {};\n    // We process sub component styles in two phases. First we collect them, then we combine them into 1 style function.\n    var workingSubcomponentStyles = {};\n    for(var _a = 0, styleSets_1 = styleSets; _a < styleSets_1.length; _a++){\n        var currentSet = styleSets_1[_a];\n        if (currentSet) {\n            for(var prop in currentSet)if (currentSet.hasOwnProperty(prop)) {\n                if (prop === \"subComponentStyles\" && currentSet.subComponentStyles !== undefined) {\n                    // subcomponent styles - style functions or objects\n                    var currentComponentStyles = currentSet.subComponentStyles;\n                    for(var subCompProp1 in currentComponentStyles)if (currentComponentStyles.hasOwnProperty(subCompProp1)) {\n                        if (workingSubcomponentStyles.hasOwnProperty(subCompProp1)) workingSubcomponentStyles[subCompProp1].push(currentComponentStyles[subCompProp1]);\n                        else workingSubcomponentStyles[subCompProp1] = [\n                            currentComponentStyles[subCompProp1]\n                        ];\n                    }\n                    continue;\n                }\n                // the as any casts below is a workaround for ts 2.8.\n                // todo: remove cast to any in ts 2.9.\n                var mergedValue = mergedSet[prop];\n                var currentValue = currentSet[prop];\n                if (mergedValue === undefined) mergedSet[prop] = currentValue;\n                else mergedSet[prop] = (0, _tslib.__spreadArrays)(Array.isArray(mergedValue) ? mergedValue : [\n                    mergedValue\n                ], Array.isArray(currentValue) ? currentValue : [\n                    currentValue\n                ]);\n            }\n        }\n    }\n    if (Object.keys(workingSubcomponentStyles).length > 0) {\n        mergedSet.subComponentStyles = {};\n        var mergedSubStyles = mergedSet.subComponentStyles;\n        var _loop_1 = function(subCompProp) {\n            if (workingSubcomponentStyles.hasOwnProperty(subCompProp)) {\n                var workingSet_1 = workingSubcomponentStyles[subCompProp];\n                mergedSubStyles[subCompProp] = function(styleProps) {\n                    return concatStyleSets.apply(void 0, workingSet_1.map(function(styleFunctionOrObject) {\n                        return typeof styleFunctionOrObject === \"function\" ? styleFunctionOrObject(styleProps) : styleFunctionOrObject;\n                    }));\n                };\n            }\n        };\n        // now we process the subcomponent styles if there are any\n        for(var subCompProp1 in workingSubcomponentStyles)_loop_1(subCompProp1);\n    }\n    return mergedSet;\n}\n\n},{\"tslib\":\"01Tx1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gQyo3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Concatenates style sets into one, but resolves functional sets using the given props.\n * @param styleProps - Props used to resolve functional sets.\n * @param allStyles - Style sets, which can be functions or objects.\n */ parcelHelpers.export(exports, \"concatStyleSetsWithProps\", ()=>concatStyleSetsWithProps);\nvar _concatStyleSets = require(\"./concatStyleSets\");\nfunction concatStyleSetsWithProps(styleProps) {\n    var allStyles = [];\n    for(var _i = 1; _i < arguments.length; _i++)allStyles[_i - 1] = arguments[_i];\n    var result = [];\n    for(var _a = 0, allStyles_1 = allStyles; _a < allStyles_1.length; _a++){\n        var styles = allStyles_1[_a];\n        if (styles) result.push(typeof styles === \"function\" ? styles(styleProps) : styles);\n    }\n    if (result.length === 1) return result[0];\n    else if (result.length) // cliffkoh: I cannot figure out how to avoid the cast to any here.\n    // It is something to do with the use of Omit in IStyleSet.\n    // It might not be necessary once  Omit becomes part of lib.d.ts (when we remove our own Omit and rely on\n    // the official version).\n    return (0, _concatStyleSets.concatStyleSets).apply(void 0, result);\n    return {};\n}\n\n},{\"./concatStyleSets\":\"4uvUY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Zddc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Registers a font face.\n * @public\n */ parcelHelpers.export(exports, \"fontFace\", ()=>fontFace);\nvar _styleOptionsState = require(\"./StyleOptionsState\");\nvar _stylesheet = require(\"./Stylesheet\");\nvar _styleToClassName = require(\"./styleToClassName\");\nfunction fontFace(font) {\n    (0, _stylesheet.Stylesheet).getInstance().insertRule(\"@font-face{\" + (0, _styleToClassName.serializeRuleEntries)((0, _styleOptionsState.getStyleOptions)(), font) + \"}\", true);\n}\n\n},{\"./StyleOptionsState\":\"3b7RJ\",\"./Stylesheet\":\"3fIre\",\"./styleToClassName\":\"eoBZe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cDl24\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Registers keyframe definitions.\n *\n * @public\n */ parcelHelpers.export(exports, \"keyframes\", ()=>keyframes);\nvar _styleOptionsState = require(\"./StyleOptionsState\");\nvar _stylesheet = require(\"./Stylesheet\");\nvar _styleToClassName = require(\"./styleToClassName\");\nfunction keyframes(timeline) {\n    var stylesheet = (0, _stylesheet.Stylesheet).getInstance();\n    var name = stylesheet.getClassName();\n    var rulesArray = [];\n    for(var prop in timeline)if (timeline.hasOwnProperty(prop)) rulesArray.push(prop, \"{\", (0, _styleToClassName.serializeRuleEntries)((0, _styleOptionsState.getStyleOptions)(), timeline[prop]), \"}\");\n    var rules = rulesArray.join(\"\");\n    stylesheet.insertRule(\"@keyframes \" + name + \"{\" + rules + \"}\", true);\n    stylesheet.cacheClassName(name, rules, [], [\n        \"keyframes\",\n        rules\n    ]);\n    return name;\n}\n\n},{\"./StyleOptionsState\":\"3b7RJ\",\"./Stylesheet\":\"3fIre\",\"./styleToClassName\":\"eoBZe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cYSAF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Helper to get bounding client rect. Passing in window will get the window size.\n *\n * @public\n */ parcelHelpers.export(exports, \"getRect\", ()=>getRect);\nfunction getRect(element) {\n    var rect;\n    if (element) {\n        if (element === window) rect = {\n            left: 0,\n            top: 0,\n            width: window.innerWidth,\n            height: window.innerHeight,\n            right: window.innerWidth,\n            bottom: window.innerHeight\n        };\n        else if (element.getBoundingClientRect) rect = element.getBoundingClientRect();\n    }\n    return rect;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aa17H\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"BaseComponent\", ()=>BaseComponent);\n/**\n * Simple constant function for returning null, used to render empty templates in JSX.\n *\n * @public\n */ parcelHelpers.export(exports, \"nullRender\", ()=>nullRender);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _async = require(\"./Async\");\nvar _eventGroup = require(\"./EventGroup\");\nvar _warnConditionallyRequiredProps = require(\"./warn/warnConditionallyRequiredProps\");\nvar _warnMutuallyExclusive = require(\"./warn/warnMutuallyExclusive\");\nvar _warnDeprecations = require(\"./warn/warnDeprecations\");\n/**\n * BaseComponent class, which provides basic helpers for all components.\n *\n * @public\n * {@docCategory BaseComponent}\n *\n * @deprecated Do not use. We are moving away from class component.\n */ var BaseComponent = /** @class */ function(_super) {\n    (0, _tslib.__extends)(BaseComponent1, _super);\n    /**\n     * BaseComponent constructor\n     * @param props - The props for the component.\n     * @param context - The context for the component.\n     */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function BaseComponent1(props, context) {\n        var _this = _super.call(this, props, context) || this;\n        // eslint-disable-next-line deprecation/deprecation\n        _makeAllSafe(_this, BaseComponent1.prototype, [\n            \"componentDidMount\",\n            \"shouldComponentUpdate\",\n            \"getSnapshotBeforeUpdate\",\n            \"render\",\n            \"componentDidUpdate\",\n            \"componentWillUnmount\", \n        ]);\n        return _this;\n    }\n    /**\n     * When the component receives props, make sure the componentRef is updated.\n     */ BaseComponent1.prototype.componentDidUpdate = function(prevProps, prevState) {\n        this._updateComponentRef(prevProps, this.props);\n    };\n    /**\n     * When the component has mounted, update the componentRef.\n     */ BaseComponent1.prototype.componentDidMount = function() {\n        this._setComponentRef(this.props.componentRef, this);\n    };\n    /**\n     * If we have disposables, dispose them automatically on unmount.\n     */ BaseComponent1.prototype.componentWillUnmount = function() {\n        this._setComponentRef(this.props.componentRef, null);\n        if (this.__disposables) {\n            for(var i = 0, len = this._disposables.length; i < len; i++){\n                var disposable = this.__disposables[i];\n                if (disposable.dispose) disposable.dispose();\n            }\n            this.__disposables = null;\n        }\n    };\n    Object.defineProperty(BaseComponent1.prototype, \"className\", {\n        /**\n         * Gets the object's class name.\n         */ get: function() {\n            if (!this.__className) {\n                var funcNameRegex = /function (.{1,})\\(/;\n                var results = funcNameRegex.exec(this.constructor.toString());\n                this.__className = results && results.length > 1 ? results[1] : \"\";\n            }\n            return this.__className;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(BaseComponent1.prototype, \"_disposables\", {\n        /**\n         * Allows subclasses to push things to this._disposables to be auto disposed.\n         */ get: function() {\n            if (!this.__disposables) this.__disposables = [];\n            return this.__disposables;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(BaseComponent1.prototype, \"_async\", {\n        /**\n         * Gets the async instance associated with the component, created on demand. The async instance gives\n         * subclasses a way to execute setTimeout/setInterval async calls safely, where the callbacks\n         * will be cleared/ignored automatically after unmounting. The helpers within the async object also\n         * preserve the this pointer so that you don't need to \"bind\" the callbacks.\n         */ get: function() {\n            if (!this.__async) {\n                this.__async = new (0, _async.Async)(this);\n                this._disposables.push(this.__async);\n            }\n            return this.__async;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(BaseComponent1.prototype, \"_events\", {\n        /**\n         * Gets the event group instance assocaited with the component, created on demand. The event instance\n         * provides on/off methods for listening to DOM (or regular javascript object) events. The event callbacks\n         * will be automatically disconnected after unmounting. The helpers within the events object also\n         * preserve the this reference so that you don't need to \"bind\" the callbacks.\n         */ get: function() {\n            if (!this.__events) {\n                this.__events = new (0, _eventGroup.EventGroup)(this);\n                this._disposables.push(this.__events);\n            }\n            return this.__events;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Helper to return a memoized ref resolver function.\n     * @param refName - Name of the member to assign the ref to.\n     * @returns A function instance keyed from the given refname.\n     * @deprecated Use `createRef` from React.createRef.\n     */ BaseComponent1.prototype._resolveRef = function(refName) {\n        var _this = this;\n        if (!this.__resolves) this.__resolves = {};\n        if (!this.__resolves[refName]) this.__resolves[refName] = function(ref) {\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            return _this[refName] = ref;\n        };\n        return this.__resolves[refName];\n    };\n    /**\n     * Updates the componentRef (by calling it with \"this\" when necessary.)\n     */ BaseComponent1.prototype._updateComponentRef = function(currentProps, newProps) {\n        if (newProps === void 0) newProps = {};\n        // currentProps *should* always be defined, but verify that just in case a subclass is manually\n        // calling a lifecycle method with no parameters (which has happened) or other odd usage.\n        if (currentProps && newProps && currentProps.componentRef !== newProps.componentRef) {\n            this._setComponentRef(currentProps.componentRef, null);\n            this._setComponentRef(newProps.componentRef, this);\n        }\n    };\n    /**\n     * Warns when a deprecated props are being used.\n     *\n     * @param deprecationMap - The map of deprecations, where key is the prop name and the value is\n     * either null or a replacement prop name.\n     */ BaseComponent1.prototype._warnDeprecations = function(deprecationMap) {\n        (0, _warnDeprecations.warnDeprecations)(this.className, this.props, deprecationMap);\n    };\n    /**\n     * Warns when props which are mutually exclusive with each other are both used.\n     *\n     * @param mutuallyExclusiveMap - The map of mutually exclusive props.\n     */ BaseComponent1.prototype._warnMutuallyExclusive = function(mutuallyExclusiveMap) {\n        (0, _warnMutuallyExclusive.warnMutuallyExclusive)(this.className, this.props, mutuallyExclusiveMap);\n    };\n    /**\n     * Warns when props are required if a condition is met.\n     *\n     * @param requiredProps - The name of the props that are required when the condition is met.\n     * @param conditionalPropName - The name of the prop that the condition is based on.\n     * @param condition - Whether the condition is met.\n     */ BaseComponent1.prototype._warnConditionallyRequiredProps = function(requiredProps, conditionalPropName, condition) {\n        (0, _warnConditionallyRequiredProps.warnConditionallyRequiredProps)(this.className, this.props, requiredProps, conditionalPropName, condition);\n    };\n    BaseComponent1.prototype._setComponentRef = function(ref, value) {\n        if (!this._skipComponentRefResolution && ref) {\n            if (typeof ref === \"function\") ref(value);\n            if (typeof ref === \"object\") // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            ref.current = value;\n        }\n    };\n    return BaseComponent1;\n}(_react.Component);\n/**\n * Helper to override a given method with a wrapper method that can try/catch the original, but also\n * ensures that the BaseComponent's methods are called before the subclass's. This ensures that\n * componentWillUnmount in the base is called and that things in the _disposables array are disposed.\n */ // eslint-disable-next-line deprecation/deprecation\nfunction _makeAllSafe(obj, prototype, methodNames) {\n    for(var i = 0, len = methodNames.length; i < len; i++)_makeSafe(obj, prototype, methodNames[i]);\n}\n// eslint-disable-next-line deprecation/deprecation\nfunction _makeSafe(obj, prototype, methodName) {\n    /* eslint-disable @typescript-eslint/no-explicit-any */ var classMethod = obj[methodName];\n    var prototypeMethod = prototype[methodName];\n    if (classMethod || prototypeMethod) obj[methodName] = function() {\n        var args = [];\n        for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n        /* eslint-enable @typescript-eslint/no-explicit-any */ var retVal;\n        if (prototypeMethod) retVal = prototypeMethod.apply(this, args);\n        if (classMethod !== prototypeMethod) retVal = classMethod.apply(this, args);\n        return retVal;\n    };\n}\nfunction nullRender() {\n    return null;\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./Async\":\"9q7L7\",\"./EventGroup\":\"f8oQM\",\"./warn/warnConditionallyRequiredProps\":\"8gUdJ\",\"./warn/warnMutuallyExclusive\":\"jOpCK\",\"./warn/warnDeprecations\":\"kJWvt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8gUdJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Warns when props are required if a condition is met.\n *\n * @public\n * @param componentName - The name of the component being used.\n * @param props - The props passed into the component.\n * @param requiredProps - The name of the props that are required when the condition is met.\n * @param conditionalPropName - The name of the prop that the condition is based on.\n * @param condition - Whether the condition is met.\n */ parcelHelpers.export(exports, \"warnConditionallyRequiredProps\", ()=>warnConditionallyRequiredProps);\nvar _warn = require(\"./warn\");\nfunction warnConditionallyRequiredProps(componentName, props, requiredProps, conditionalPropName, condition) {\n    var _i, requiredProps_1, requiredPropName;\n}\n\n},{\"./warn\":\"7cefk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7cefk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Sends a warning to console, if the api is present.\n *\n * @public\n * @param message - Warning message.\n */ parcelHelpers.export(exports, \"warn\", ()=>warn);\n/**\n * Configures the warning callback. Passing in undefined will reset it to use the default\n * console.warn function.\n *\n * @public\n * @param warningCallback - Callback to override the generated warnings.\n */ parcelHelpers.export(exports, \"setWarningCallback\", ()=>setWarningCallback);\n/* eslint-disable no-console */ var _warningCallback = undefined;\nfunction warn(message) {\n    if (console && console.warn) console.warn(message);\n}\nfunction setWarningCallback(warningCallback) {\n    _warningCallback = warningCallback;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jOpCK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Warns when two props which are mutually exclusive are both being used.\n *\n * @public\n * @param componentName - The name of the component being used.\n * @param props - The props passed into the component.\n * @param exclusiveMap - A map where the key is a parameter, and the value is the other parameter.\n */ parcelHelpers.export(exports, \"warnMutuallyExclusive\", ()=>warnMutuallyExclusive);\nvar _warn = require(\"./warn\");\nfunction warnMutuallyExclusive(componentName, props, exclusiveMap) {\n    var propName, propInExclusiveMapValue;\n}\n\n},{\"./warn\":\"7cefk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kJWvt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Warns when a deprecated props are being used.\n *\n * @public\n * @param componentName - The name of the component being used.\n * @param props - The props passed into the component.\n * @param deprecationMap - The map of deprecations, where key is the prop name and the value is\n * either null or a replacement prop name.\n */ parcelHelpers.export(exports, \"warnDeprecations\", ()=>warnDeprecations);\nvar _warn = require(\"./warn\");\nfunction warnDeprecations(componentName, props, deprecationMap) {\n    var propName, deprecationMessage, replacementPropName;\n}\n\n},{\"./warn\":\"7cefk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6VQRa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DelayedRender\", ()=>DelayedRender);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\n/**\n * Utility component for delaying the render of a child component after a given delay. This component\n * requires a single child component; don't pass in many components. Wrap multiple components in a DIV\n * if necessary.\n *\n * @public\n * {@docCategory DelayedRender}\n */ var DelayedRender = /** @class */ function(_super) {\n    (0, _tslib.__extends)(DelayedRender1, _super);\n    function DelayedRender1(props) {\n        var _this = _super.call(this, props) || this;\n        _this.state = {\n            isRendered: false\n        };\n        return _this;\n    }\n    DelayedRender1.prototype.componentDidMount = function() {\n        var _this = this;\n        var delay = this.props.delay;\n        this._timeoutId = window.setTimeout(function() {\n            _this.setState({\n                isRendered: true\n            });\n        }, delay);\n    };\n    DelayedRender1.prototype.componentWillUnmount = function() {\n        if (this._timeoutId) clearTimeout(this._timeoutId);\n    };\n    DelayedRender1.prototype.render = function() {\n        return this.state.isRendered ? _react.Children.only(this.props.children) : null;\n    };\n    DelayedRender1.defaultProps = {\n        delay: 0\n    };\n    return DelayedRender1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cQJKt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FabricPerformance\", ()=>FabricPerformance);\nvar now = function() {\n    return typeof performance !== \"undefined\" && !!performance.now ? performance.now() : Date.now();\n};\nvar RESET_INTERVAL = 180000; // auto reset every 3 minutes\n/**\n * Performance helper class for measuring things.\n *\n * @public\n * {@docCategory FabricPerformance}\n */ var FabricPerformance = /** @class */ function() {\n    function FabricPerformance1() {}\n    /**\n     * Measures execution time of the given syncronous function. If the same logic is executed multiple times,\n     * each individual measurement will be collected as well the overall numbers.\n     * @param name - The name of this measurement\n     * @param func - The logic to be measured for execution time\n     */ FabricPerformance1.measure = function(name, func) {\n        if (FabricPerformance1._timeoutId) FabricPerformance1.setPeriodicReset();\n        var start = now();\n        func();\n        var end = now();\n        var measurement = FabricPerformance1.summary[name] || {\n            totalDuration: 0,\n            count: 0,\n            all: []\n        };\n        var duration = end - start;\n        measurement.totalDuration += duration;\n        measurement.count++;\n        measurement.all.push({\n            duration: duration,\n            timeStamp: end\n        });\n        FabricPerformance1.summary[name] = measurement;\n    };\n    FabricPerformance1.reset = function() {\n        FabricPerformance1.summary = {};\n        clearTimeout(FabricPerformance1._timeoutId);\n        FabricPerformance1._timeoutId = NaN;\n    };\n    FabricPerformance1.setPeriodicReset = function() {\n        FabricPerformance1._timeoutId = setTimeout(function() {\n            return FabricPerformance1.reset();\n        }, RESET_INTERVAL);\n    };\n    FabricPerformance1.summary = {};\n    return FabricPerformance1;\n}();\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6PyOf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"GlobalSettings\", ()=>GlobalSettings);\nvar _getWindow = require(\"./dom/getWindow\");\n/**\n * Storing global state in local module variables has issues when more than one copy\n * if the module gets loaded on the page (due to a bundling error or simply by consuming\n * a prebundled script.)\n *\n * This file contains helpers to deal with the getting and setting local state, and allows\n * callers to get called back when it mutates.\n */ var GLOBAL_SETTINGS_PROP_NAME = \"__globalSettings__\";\nvar CALLBACK_STATE_PROP_NAME = \"__callbacks__\";\nvar _counter = 0;\n/**\n * Global settings helper, which stores settings in the global (window) namespace.\n * If window is not provided, it will store settings in module scope. Provides a\n * way to observe changes as well when their values change.\n *\n * @public\n * {@docCategory GlobalSettings}\n */ var GlobalSettings = /** @class */ function() {\n    function GlobalSettings1() {}\n    GlobalSettings1.getValue = function(key, defaultValue) {\n        var globalSettings = _getGlobalSettings();\n        if (globalSettings[key] === undefined) globalSettings[key] = typeof defaultValue === \"function\" ? defaultValue() : defaultValue;\n        return globalSettings[key];\n    };\n    GlobalSettings1.setValue = function(key, value) {\n        var globalSettings = _getGlobalSettings();\n        var callbacks = globalSettings[CALLBACK_STATE_PROP_NAME];\n        var oldValue = globalSettings[key];\n        if (value !== oldValue) {\n            globalSettings[key] = value;\n            var changeDescription = {\n                oldValue: oldValue,\n                value: value,\n                key: key\n            };\n            for(var id in callbacks)if (callbacks.hasOwnProperty(id)) callbacks[id](changeDescription);\n        }\n        return value;\n    };\n    GlobalSettings1.addChangeListener = function(cb) {\n        // Note: we use generated ids on the callbacks to create a map of the callbacks, which optimizes removal.\n        // (It's faster to delete a key than it is to look up the index of an object and splice an array.)\n        var id = cb.__id__;\n        var callbacks = _getCallbacks();\n        if (!id) id = cb.__id__ = String(_counter++);\n        callbacks[id] = cb;\n    };\n    GlobalSettings1.removeChangeListener = function(cb) {\n        var callbacks = _getCallbacks();\n        delete callbacks[cb.__id__];\n    };\n    return GlobalSettings1;\n}();\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _getGlobalSettings() {\n    var _a;\n    var win = (0, _getWindow.getWindow)();\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var globalObj = win || {};\n    if (!globalObj[GLOBAL_SETTINGS_PROP_NAME]) globalObj[GLOBAL_SETTINGS_PROP_NAME] = (_a = {}, _a[CALLBACK_STATE_PROP_NAME] = {}, _a);\n    return globalObj[GLOBAL_SETTINGS_PROP_NAME];\n}\nfunction _getCallbacks() {\n    var globalSettings = _getGlobalSettings();\n    return globalSettings[CALLBACK_STATE_PROP_NAME];\n}\n\n},{\"./dom/getWindow\":\"8f64x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aP2ZH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"KeyCodes\", ()=>KeyCodes);\nvar KeyCodes = {\n    backspace: 8,\n    tab: 9,\n    enter: 13,\n    shift: 16,\n    ctrl: 17,\n    alt: 18,\n    pauseBreak: 19,\n    capslock: 20,\n    escape: 27,\n    space: 32,\n    pageUp: 33,\n    pageDown: 34,\n    end: 35,\n    home: 36,\n    left: 37,\n    up: 38,\n    right: 39,\n    down: 40,\n    insert: 45,\n    del: 46,\n    zero: 48,\n    one: 49,\n    two: 50,\n    three: 51,\n    four: 52,\n    five: 53,\n    six: 54,\n    seven: 55,\n    eight: 56,\n    nine: 57,\n    a: 65,\n    b: 66,\n    c: 67,\n    d: 68,\n    e: 69,\n    f: 70,\n    g: 71,\n    h: 72,\n    i: 73,\n    j: 74,\n    k: 75,\n    l: 76,\n    m: 77,\n    n: 78,\n    o: 79,\n    p: 80,\n    q: 81,\n    r: 82,\n    s: 83,\n    t: 84,\n    u: 85,\n    v: 86,\n    w: 87,\n    x: 88,\n    y: 89,\n    z: 90,\n    leftWindow: 91,\n    rightWindow: 92,\n    select: 93,\n    /* eslint-disable @typescript-eslint/naming-convention */ zero_numpad: 96,\n    one_numpad: 97,\n    two_numpad: 98,\n    three_numpad: 99,\n    four_numpad: 100,\n    five_numpad: 101,\n    six_numpad: 102,\n    seven_numpad: 103,\n    eight_numpad: 104,\n    nine_numpad: 105,\n    /* eslint-enable @typescript-eslint/naming-convention */ multiply: 106,\n    add: 107,\n    subtract: 109,\n    decimalPoint: 110,\n    divide: 111,\n    f1: 112,\n    f2: 113,\n    f3: 114,\n    f4: 115,\n    f5: 116,\n    f6: 117,\n    f7: 118,\n    f8: 119,\n    f9: 120,\n    f10: 121,\n    f11: 122,\n    f12: 123,\n    numlock: 144,\n    scrollLock: 145,\n    semicolon: 186,\n    equalSign: 187,\n    comma: 188,\n    dash: 189,\n    period: 190,\n    forwardSlash: 191,\n    graveAccent: 192,\n    openBracket: 219,\n    backSlash: 220,\n    closeBracket: 221,\n    singleQuote: 222\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dgqez\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Rectangle\", ()=>Rectangle);\n/**\n * Rectangle helper class.\n *\n * @public\n * {@docCategory Rectangle}\n */ var Rectangle = /** @class */ function() {\n    function Rectangle1(left, right, top, bottom) {\n        if (left === void 0) left = 0;\n        if (right === void 0) right = 0;\n        if (top === void 0) top = 0;\n        if (bottom === void 0) bottom = 0;\n        this.top = top;\n        this.bottom = bottom;\n        this.left = left;\n        this.right = right;\n    }\n    Object.defineProperty(Rectangle1.prototype, \"width\", {\n        /**\n         * Calculated automatically by subtracting the right from left\n         */ get: function() {\n            return this.right - this.left;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Rectangle1.prototype, \"height\", {\n        /**\n         * Calculated automatically by subtracting the bottom from top.\n         */ get: function() {\n            return this.bottom - this.top;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Tests if another rect is approximately equal to this rect (within 4 decimal places.)\n     */ Rectangle1.prototype.equals = function(rect) {\n        // Fixing to 4 decimal places because it allows enough precision and will handle cases when something\n        // should be rounded, like .999999 should round to 1.\n        return parseFloat(this.top.toFixed(4)) === parseFloat(rect.top.toFixed(4)) && parseFloat(this.bottom.toFixed(4)) === parseFloat(rect.bottom.toFixed(4)) && parseFloat(this.left.toFixed(4)) === parseFloat(rect.left.toFixed(4)) && parseFloat(this.right.toFixed(4)) === parseFloat(rect.right.toFixed(4));\n    };\n    return Rectangle1;\n}();\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3LuLW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/* eslint-disable @typescript-eslint/no-explicit-any */ /**\n * Returns a single function which will call each of the given functions in the context of the\n * parent.\n */ parcelHelpers.export(exports, \"appendFunction\", ()=>appendFunction);\nfunction appendFunction(parent) {\n    var functions = [];\n    for(var _i1 = 1; _i1 < arguments.length; _i1++)functions[_i1 - 1] = arguments[_i1];\n    if (functions.length < 2) return functions[0];\n    return function() {\n        var args = [];\n        for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n        functions.forEach(function(f) {\n            return f && f.apply(parent, args);\n        });\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jjIft\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * ARIA helper to concatenate attributes, returning undefined if all attributes\n * are undefined. (Empty strings are not a valid ARIA attribute value.)\n *\n * @param ariaAttributes - ARIA attributes to merge\n */ parcelHelpers.export(exports, \"mergeAriaAttributeValues\", ()=>mergeAriaAttributeValues);\nfunction mergeAriaAttributeValues() {\n    var ariaAttributes = [];\n    for(var _i = 0; _i < arguments.length; _i++)ariaAttributes[_i] = arguments[_i];\n    var mergedAttribute = ariaAttributes.filter(function(arg) {\n        return arg;\n    }).join(\" \").trim();\n    return mergedAttribute === \"\" ? undefined : mergedAttribute;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fx288\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Helper to find the index of an item within an array, using a callback to\n * determine the match.\n *\n * @public\n * @param array - Array to search.\n * @param cb - Callback which returns true on matches.\n * @param fromIndex - Optional index to start from (defaults to 0)\n */ parcelHelpers.export(exports, \"findIndex\", ()=>findIndex);\n/**\n * Helper to find the first item within an array that satisfies the callback.\n * @param array - Array to search\n * @param cb - Callback which returns true on matches\n */ parcelHelpers.export(exports, \"find\", ()=>find);\n/**\n * Creates an array of a given size and helper method to populate.\n *\n * @public\n * @param size - Size of array.\n * @param getItem - Callback to populate given cell index.\n */ parcelHelpers.export(exports, \"createArray\", ()=>createArray);\n/**\n * Convert the given array to a matrix with columnCount number\n * of columns.\n *\n * @public\n * @param items - The array to convert\n * @param columnCount - The number of columns for the resulting matrix\n * @returns A matrix of items\n */ parcelHelpers.export(exports, \"toMatrix\", ()=>toMatrix);\n/**\n * Given an array, it returns a new array that does not contain the item at the given index.\n * @param array - The array to operate on\n * @param index - The index of the element to remove\n */ parcelHelpers.export(exports, \"removeIndex\", ()=>removeIndex);\n/**\n * Given an array, this function returns a new array where the element at a given index has been replaced.\n * @param array - The array to operate on\n * @param newElement - The element that will be placed in the new array\n * @param index - The index of the element that should be replaced\n */ parcelHelpers.export(exports, \"replaceElement\", ()=>replaceElement);\n/**\n * Given an array, this function returns a new array where an element has been inserted at the given index.\n * @param array - The array to operate on\n * @param index - The index where an element should be inserted\n * @param itemToAdd - The element to insert\n */ parcelHelpers.export(exports, \"addElementAtIndex\", ()=>addElementAtIndex);\n/**\n * Given an array where each element is of type T or T[], flatten it into an array of T\n * @param array - The array where each element can optionally also be an array\n */ parcelHelpers.export(exports, \"flatten\", ()=>flatten);\n/**\n * Returns a boolean indicating if the two given arrays are equal in length and values.\n *\n * @param array1 - First array to compare\n * @param array2 - Second array to compare\n * @returns True if the arrays are the same length and have the same values in the same positions, false otherwise.\n */ parcelHelpers.export(exports, \"arraysEqual\", ()=>arraysEqual);\nfunction findIndex(array, cb, fromIndex) {\n    if (fromIndex === void 0) fromIndex = 0;\n    var index = -1;\n    for(var i = fromIndex; array && i < array.length; i++)if (cb(array[i], i)) {\n        index = i;\n        break;\n    }\n    return index;\n}\nfunction find(array, cb) {\n    var index = findIndex(array, cb);\n    if (index < 0) return undefined;\n    return array[index];\n}\nfunction createArray(size, getItem) {\n    var array = [];\n    for(var i = 0; i < size; i++)array.push(getItem(i));\n    return array;\n}\nfunction toMatrix(items, columnCount) {\n    return items.reduce(function(rows, currentValue, index) {\n        if (index % columnCount === 0) rows.push([\n            currentValue\n        ]);\n        else rows[rows.length - 1].push(currentValue);\n        return rows;\n    }, []);\n}\nfunction removeIndex(array, index) {\n    return array.filter(function(_, i) {\n        return index !== i;\n    });\n}\nfunction replaceElement(array, newElement, index) {\n    var copy = array.slice();\n    copy[index] = newElement;\n    return copy;\n}\nfunction addElementAtIndex(array, index, itemToAdd) {\n    var copy = array.slice();\n    copy.splice(index, 0, itemToAdd);\n    return copy;\n}\nfunction flatten(array) {\n    var result = [];\n    array.forEach(function(item) {\n        return result = result.concat(item);\n    });\n    return result;\n}\nfunction arraysEqual(array1, array2) {\n    if (array1.length !== array2.length) return false;\n    for(var i = 0; i < array1.length; i++){\n        if (array1[i] !== array2[i]) return false;\n    }\n    return true;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dZIYi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Produces a component which internally loads the target component before first mount.\n * The component passes all props through to the loaded component.\n *\n * This overload accepts a module with a default export for the component.\n */ parcelHelpers.export(exports, \"asAsync\", ()=>asAsync);\n/**\n * asAsync - a HOC for async loading components.\n *\n * Usage:\n *\n * const AsyncDialog = asAsync({\n *   load: () => import('Dialog').then(result => result.default),\n * });\n *\n * React.render(domElement, <AsyncDialog asyncPlaceholder={ () => <Spinner/> } { ...dialogProps } />);\n *\n * Note the `asyncPlaceholder` prop will be respected when rendering the async component and it hasn't\n * been loaded yet.\n */ var _tslib = require(\"tslib\");\nvar _react = require(\"react\");\n/**\n * If possible, use a WeakMap to maintain a cache of loaded components.\n * This can be used to synchronously render components that have already been loaded,\n * rather than having to wait for at least one async tick.\n */ var _syncModuleCache = typeof WeakMap !== \"undefined\" ? new WeakMap() : undefined;\nfunction asAsync(options) {\n    var Async1 = /** @class */ function(_super) {\n        (0, _tslib.__extends)(Async, _super);\n        function Async() {\n            var _this = _super !== null && _super.apply(this, arguments) || this;\n            _this.state = {\n                Component: _syncModuleCache ? _syncModuleCache.get(options.load) : undefined\n            };\n            return _this;\n        }\n        Async.prototype.render = function() {\n            // Typescript issue: the rest can't be pulled without the any cast, as TypeScript fails with rest on generics.\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            var _a = this.props, forwardedRef = _a.forwardedRef, Placeholder = _a.asyncPlaceholder, rest = (0, _tslib.__rest)(_a, [\n                \"forwardedRef\",\n                \"asyncPlaceholder\"\n            ]);\n            var Component = this.state.Component;\n            return Component ? _react.createElement(Component, (0, _tslib.__assign)((0, _tslib.__assign)({}, rest), {\n                ref: forwardedRef\n            })) : Placeholder ? _react.createElement(Placeholder, null) : null;\n        };\n        Async.prototype.componentDidMount = function() {\n            var _this = this;\n            var Component = this.state.Component;\n            if (!Component) options.load().then(function(LoadedComponent) {\n                if (LoadedComponent) {\n                    // Cache component for future reference.\n                    _syncModuleCache && _syncModuleCache.set(options.load, LoadedComponent);\n                    // Set state.\n                    _this.setState({\n                        Component: LoadedComponent\n                    }, options.onLoad);\n                }\n            }).catch(options.onError);\n        };\n        return Async;\n    }(_react.Component);\n    return _react.forwardRef(function(props, ref) {\n        return _react.createElement(Async1, (0, _tslib.__assign)({}, props, {\n            forwardedRef: ref\n        }));\n    });\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gVsq2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * AssertNever is a utility function that can be used for exhaustiveness checks in switch statements.\n *\n * @public\n */ parcelHelpers.export(exports, \"assertNever\", ()=>assertNever);\nfunction assertNever(x) {\n    throw new Error(\"Unexpected object: \" + x);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l6Ep1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Creates a getClassNames function which calls getStyles given the props, and injects them\n * into mergeStyleSets.\n *\n * Note that the props you pass in on every render should be in the same order and\n * immutable (numbers, strings, and booleans). This will allow the results to be memoized. Violating\n * these will cause extra recalcs to occur.\n */ parcelHelpers.export(exports, \"classNamesFunction\", ()=>classNamesFunction);\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _rtl = require(\"./rtl\");\nvar _dom = require(\"./dom\");\nvar MAX_CACHE_COUNT = 50;\nvar DEFAULT_SPECIFICITY_MULTIPLIER = 5;\nvar _memoizedClassNames = 0;\nvar stylesheet = (0, _mergeStyles.Stylesheet).getInstance();\nif (stylesheet && stylesheet.onReset) stylesheet.onReset(function() {\n    return _memoizedClassNames++;\n});\n// Note that because of the caching nature within the classNames memoization,\n// I've disabled this rule to simply be able to work with any types.\n/* eslint-disable @typescript-eslint/no-explicit-any */ // This represents a prop we attach to each Map to indicate the cached return value\n// associated with the graph node.\nvar retVal = \"__retval__\";\nfunction classNamesFunction(options) {\n    // We build a trie where each node is a Map. The map entry key represents an argument\n    // value, and the entry value is another node (Map). Each node has a `__retval__`\n    // property which is used to hold the cached response.\n    if (options === void 0) options = {};\n    // To derive the response, we can simply ensure the arguments are added or already\n    // exist in the trie. At the last node, if there is a `__retval__` we return that. Otherwise\n    // we call the `getStyles` api to evaluate, cache on the property, and return that.\n    var map = new Map();\n    var styleCalcCount = 0;\n    var getClassNamesCount = 0;\n    var currentMemoizedClassNames = _memoizedClassNames;\n    var getClassNames = function(styleFunctionOrObject, styleProps) {\n        if (styleProps === void 0) styleProps = {};\n        var _a, _b;\n        // If useStaticStyles is true, styleFunctionOrObject returns slot to classname mappings.\n        // If there is also no style overrides, we can skip merge styles completely and\n        // simply return the result from the style funcion.\n        if (options.useStaticStyles && typeof styleFunctionOrObject === \"function\" && styleFunctionOrObject.__noStyleOverride__) return styleFunctionOrObject(styleProps);\n        getClassNamesCount++;\n        var current = map;\n        var theme = styleProps.theme;\n        var rtl = theme && theme.rtl !== undefined ? theme.rtl : (0, _rtl.getRTL)();\n        var disableCaching = options.disableCaching;\n        // On reset of our stylesheet, reset memoized cache.\n        if (currentMemoizedClassNames !== _memoizedClassNames) {\n            currentMemoizedClassNames = _memoizedClassNames;\n            map = new Map();\n            styleCalcCount = 0;\n        }\n        if (!options.disableCaching) {\n            current = _traverseMap(map, styleFunctionOrObject);\n            current = _traverseMap(current, styleProps);\n        }\n        if (disableCaching || !current[retVal]) {\n            if (styleFunctionOrObject === undefined) current[retVal] = {};\n            else current[retVal] = (0, _mergeStyles.mergeCssSets)([\n                typeof styleFunctionOrObject === \"function\" ? styleFunctionOrObject(styleProps) : styleFunctionOrObject, \n            ], {\n                rtl: !!rtl,\n                specificityMultiplier: options.useStaticStyles ? DEFAULT_SPECIFICITY_MULTIPLIER : undefined\n            });\n            if (!disableCaching) styleCalcCount++;\n        }\n        if (styleCalcCount > (options.cacheSize || MAX_CACHE_COUNT)) {\n            var win = (0, _dom.getWindow)();\n            if ((_b = (_a = win) === null || _a === void 0 ? void 0 : _a.FabricConfig) === null || _b === void 0 ? void 0 : _b.enableClassNameCacheFullWarning) {\n                // eslint-disable-next-line no-console\n                console.warn(\"Styles are being recalculated too frequently. Cache miss rate is \" + styleCalcCount + \"/\" + getClassNamesCount + \".\");\n                // eslint-disable-next-line no-console\n                console.trace();\n            }\n            map.clear();\n            styleCalcCount = 0;\n            // Mutate the options passed in, that's all we can do.\n            options.disableCaching = true;\n        }\n        // Note: the retVal is an attached property on the Map; not a key in the Map. We use this attached property to\n        // cache the return value for this branch of the graph.\n        return current[retVal];\n    };\n    return getClassNames;\n}\nfunction _traverseEdge(current, value) {\n    value = _normalizeValue(value);\n    if (!current.has(value)) current.set(value, new Map());\n    return current.get(value);\n}\nfunction _traverseMap(current, inputs) {\n    if (typeof inputs === \"function\") {\n        var cachedInputsFromStyled = inputs.__cachedInputs__;\n        if (cachedInputsFromStyled) // The styled helper will generate the styles function and will attach the cached\n        // inputs (consisting of the default styles, customzied styles, and user provided styles.)\n        // These should be used as cache keys for deriving the memoized value.\n        for(var _i = 0, _a = inputs.__cachedInputs__; _i < _a.length; _i++){\n            var input = _a[_i];\n            current = _traverseEdge(current, input);\n        }\n        else current = _traverseEdge(current, inputs);\n    } else if (typeof inputs === \"object\") {\n        for(var propName in inputs)if (inputs.hasOwnProperty(propName)) current = _traverseEdge(current, inputs[propName]);\n    }\n    return current;\n}\nfunction _normalizeValue(value) {\n    switch(value){\n        case undefined:\n            return \"__undefined__\";\n        case null:\n            return \"__null__\";\n        default:\n            return value;\n    }\n}\n\n},{\"@uifabric/merge-styles\":\"7c43M\",\"./rtl\":\"a3Fy5\",\"./dom\":\"diVbR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a3Fy5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Gets the rtl state of the page (returns true if in rtl.)\n */ parcelHelpers.export(exports, \"getRTL\", ()=>getRTL);\n/**\n * Sets the rtl state of the page (by adjusting the dir attribute of the html element.)\n */ parcelHelpers.export(exports, \"setRTL\", ()=>setRTL);\n/**\n * Returns the given key, but flips right/left arrows if necessary.\n */ parcelHelpers.export(exports, \"getRTLSafeKeyCode\", ()=>getRTLSafeKeyCode);\nvar _keyCodes = require(\"./KeyCodes\");\nvar _getDocument = require(\"./dom/getDocument\");\nvar _sessionStorage = require(\"./sessionStorage\");\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar RTL_LOCAL_STORAGE_KEY = \"isRTL\";\n// Default to undefined so that we initialize on first read.\nvar _isRTL;\nfunction getRTL(theme) {\n    if (theme === void 0) theme = {};\n    if (theme.rtl !== undefined) return theme.rtl;\n    if (_isRTL === undefined) {\n        // Fabric supports persisting the RTL setting between page refreshes via session storage\n        var savedRTL = (0, _sessionStorage.getItem)(RTL_LOCAL_STORAGE_KEY);\n        if (savedRTL !== null) {\n            _isRTL = savedRTL === \"1\";\n            setRTL(_isRTL);\n        }\n        var doc = (0, _getDocument.getDocument)();\n        if (_isRTL === undefined && doc) {\n            _isRTL = (doc.body && doc.body.getAttribute(\"dir\") || doc.documentElement.getAttribute(\"dir\")) === \"rtl\";\n            (0, _mergeStyles.setRTL)(_isRTL);\n        }\n    }\n    return !!_isRTL;\n}\nfunction setRTL(isRTL, persistSetting) {\n    if (persistSetting === void 0) persistSetting = false;\n    var doc = (0, _getDocument.getDocument)();\n    if (doc) doc.documentElement.setAttribute(\"dir\", isRTL ? \"rtl\" : \"ltr\");\n    if (persistSetting) (0, _sessionStorage.setItem)(RTL_LOCAL_STORAGE_KEY, isRTL ? \"1\" : \"0\");\n    _isRTL = isRTL;\n    (0, _mergeStyles.setRTL)(_isRTL);\n}\nfunction getRTLSafeKeyCode(key, theme) {\n    if (theme === void 0) theme = {};\n    if (getRTL(theme)) {\n        if (key === (0, _keyCodes.KeyCodes).left) key = (0, _keyCodes.KeyCodes).right;\n        else if (key === (0, _keyCodes.KeyCodes).right) key = (0, _keyCodes.KeyCodes).left;\n    }\n    return key;\n}\n\n},{\"./KeyCodes\":\"aP2ZH\",\"./dom/getDocument\":\"bYcmK\",\"./sessionStorage\":\"fPGAq\",\"@uifabric/merge-styles\":\"7c43M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fPGAq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Fetches an item from session storage without throwing an exception\n * @param key The key of the item to fetch from session storage\n */ parcelHelpers.export(exports, \"getItem\", ()=>getItem);\n/**\n * Inserts an item into session storage without throwing an exception\n * @param key The key of the item to add to session storage\n * @param data The data to put into session storage\n */ parcelHelpers.export(exports, \"setItem\", ()=>setItem);\nvar _getWindow = require(\"./dom/getWindow\");\nfunction getItem(key) {\n    var result = null;\n    try {\n        var win = (0, _getWindow.getWindow)();\n        result = win ? win.sessionStorage.getItem(key) : null;\n    } catch (e) {\n    /* Eat the exception */ }\n    return result;\n}\nfunction setItem(key, data) {\n    var _a;\n    try {\n        (_a = (0, _getWindow.getWindow)()) === null || _a === void 0 || _a.sessionStorage.setItem(key, data);\n    } catch (e) {\n    /* Eat the exception */ }\n}\n\n},{\"./dom/getWindow\":\"8f64x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"diVbR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _elementContains = require(\"./dom/elementContains\");\nparcelHelpers.exportAll(_elementContains, exports);\nvar _elementContainsAttribute = require(\"./dom/elementContainsAttribute\");\nparcelHelpers.exportAll(_elementContainsAttribute, exports);\nvar _findElementRecursive = require(\"./dom/findElementRecursive\");\nparcelHelpers.exportAll(_findElementRecursive, exports);\nvar _getChildren = require(\"./dom/getChildren\");\nparcelHelpers.exportAll(_getChildren, exports);\nvar _getDocument = require(\"./dom/getDocument\");\nparcelHelpers.exportAll(_getDocument, exports);\nvar _getParent = require(\"./dom/getParent\");\nparcelHelpers.exportAll(_getParent, exports);\nvar _getRect = require(\"./dom/getRect\");\nparcelHelpers.exportAll(_getRect, exports);\nvar _getVirtualParent = require(\"./dom/getVirtualParent\");\nparcelHelpers.exportAll(_getVirtualParent, exports);\nvar _getWindow = require(\"./dom/getWindow\");\nparcelHelpers.exportAll(_getWindow, exports);\nvar _isVirtualElement = require(\"./dom/isVirtualElement\");\nparcelHelpers.exportAll(_isVirtualElement, exports);\nvar _on = require(\"./dom/on\");\nparcelHelpers.exportAll(_on, exports);\nvar _portalContainsElement = require(\"./dom/portalContainsElement\");\nparcelHelpers.exportAll(_portalContainsElement, exports);\nvar _raiseClick = require(\"./dom/raiseClick\");\nparcelHelpers.exportAll(_raiseClick, exports);\nvar _setPortalAttribute = require(\"./dom/setPortalAttribute\");\nparcelHelpers.exportAll(_setPortalAttribute, exports);\nvar _setVirtualParent = require(\"./dom/setVirtualParent\");\nparcelHelpers.exportAll(_setVirtualParent, exports);\n\n},{\"./dom/elementContains\":\"ds9l8\",\"./dom/elementContainsAttribute\":\"8AW20\",\"./dom/findElementRecursive\":\"1gHxv\",\"./dom/getChildren\":\"eav5V\",\"./dom/getDocument\":\"bYcmK\",\"./dom/getParent\":\"59glD\",\"./dom/getRect\":\"cYSAF\",\"./dom/getVirtualParent\":\"5UAJR\",\"./dom/getWindow\":\"8f64x\",\"./dom/isVirtualElement\":\"aNAKX\",\"./dom/on\":\"eWZL6\",\"./dom/portalContainsElement\":\"hrucu\",\"./dom/raiseClick\":\"4PKZi\",\"./dom/setPortalAttribute\":\"aJtbH\",\"./dom/setVirtualParent\":\"8QpWo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ds9l8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"elementContains\", ()=>(0, _domUtilities.elementContains));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2DoJo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _elementContains = require(\"./elementContains\");\nparcelHelpers.exportAll(_elementContains, exports);\nvar _elementContainsAttribute = require(\"./elementContainsAttribute\");\nparcelHelpers.exportAll(_elementContainsAttribute, exports);\nvar _findElementRecursive = require(\"./findElementRecursive\");\nparcelHelpers.exportAll(_findElementRecursive, exports);\nvar _getChildren = require(\"./getChildren\");\nparcelHelpers.exportAll(_getChildren, exports);\nvar _getParent = require(\"./getParent\");\nparcelHelpers.exportAll(_getParent, exports);\nvar _getVirtualParent = require(\"./getVirtualParent\");\nparcelHelpers.exportAll(_getVirtualParent, exports);\nvar _isVirtualElement = require(\"./isVirtualElement\");\nparcelHelpers.exportAll(_isVirtualElement, exports);\nvar _portalContainsElement = require(\"./portalContainsElement\");\nparcelHelpers.exportAll(_portalContainsElement, exports);\nvar _setPortalAttribute = require(\"./setPortalAttribute\");\nparcelHelpers.exportAll(_setPortalAttribute, exports);\nvar _setVirtualParent = require(\"./setVirtualParent\");\nparcelHelpers.exportAll(_setVirtualParent, exports);\n\n},{\"./elementContains\":\"5hgAs\",\"./elementContainsAttribute\":\"lQXtt\",\"./findElementRecursive\":\"38a7I\",\"./getChildren\":\"6Mnks\",\"./getParent\":\"gp02N\",\"./getVirtualParent\":\"hctgE\",\"./isVirtualElement\":\"c1KhA\",\"./portalContainsElement\":\"fbRSG\",\"./setPortalAttribute\":\"2QF9q\",\"./setVirtualParent\":\"4Zyj6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5hgAs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Determines whether or not a parent element contains a given child element.\n * If `allowVirtualParents` is true, this method may return `true` if the child\n * has the parent in its virtual element hierarchy.\n *\n * @public\n */ parcelHelpers.export(exports, \"elementContains\", ()=>elementContains);\nvar _getParent = require(\"./getParent\");\nfunction elementContains(parent, child, allowVirtualParents) {\n    if (allowVirtualParents === void 0) allowVirtualParents = true;\n    var isContained = false;\n    if (parent && child) {\n        if (allowVirtualParents) {\n            if (parent === child) isContained = true;\n            else {\n                isContained = false;\n                while(child){\n                    var nextParent = (0, _getParent.getParent)(child);\n                    if (nextParent === parent) {\n                        isContained = true;\n                        break;\n                    }\n                    child = nextParent;\n                }\n            }\n        } else if (parent.contains) isContained = parent.contains(child);\n    }\n    return isContained;\n}\n\n},{\"./getParent\":\"gp02N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gp02N\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Gets the element which is the parent of a given element.\n * If `allowVirtuaParents` is `true`, this method prefers the virtual parent over\n * real DOM parent when present.\n *\n * @public\n */ parcelHelpers.export(exports, \"getParent\", ()=>getParent);\nvar _getVirtualParent = require(\"./getVirtualParent\");\nfunction getParent(child, allowVirtualParents) {\n    if (allowVirtualParents === void 0) allowVirtualParents = true;\n    return child && (allowVirtualParents && (0, _getVirtualParent.getVirtualParent)(child) || child.parentNode && child.parentNode);\n}\n\n},{\"./getVirtualParent\":\"hctgE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hctgE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Gets the virtual parent given the child element, if it exists.\n *\n * @public\n */ parcelHelpers.export(exports, \"getVirtualParent\", ()=>getVirtualParent);\nvar _isVirtualElement = require(\"./isVirtualElement\");\nfunction getVirtualParent(child) {\n    var parent;\n    if (child && (0, _isVirtualElement.isVirtualElement)(child)) parent = child._virtual.parent;\n    return parent;\n}\n\n},{\"./isVirtualElement\":\"c1KhA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c1KhA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Determines whether or not an element has the virtual hierarchy extension.\n *\n * @public\n */ parcelHelpers.export(exports, \"isVirtualElement\", ()=>isVirtualElement);\nfunction isVirtualElement(element) {\n    return element && !!element._virtual;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lQXtt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Determines if an element, or any of its ancestors, contain the given attribute\n * @param element - element to start searching at\n * @param attribute - the attribute to search for\n * @returns the value of the first instance found\n */ parcelHelpers.export(exports, \"elementContainsAttribute\", ()=>elementContainsAttribute);\nvar _findElementRecursive = require(\"./findElementRecursive\");\nfunction elementContainsAttribute(element, attribute) {\n    var elementMatch = (0, _findElementRecursive.findElementRecursive)(element, function(testElement) {\n        return testElement.hasAttribute(attribute);\n    });\n    return elementMatch && elementMatch.getAttribute(attribute);\n}\n\n},{\"./findElementRecursive\":\"38a7I\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"38a7I\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Finds the first parent element where the matchFunction returns true\n * @param element - element to start searching at\n * @param matchFunction - the function that determines if the element is a match\n * @returns the matched element or null no match was found\n */ parcelHelpers.export(exports, \"findElementRecursive\", ()=>findElementRecursive);\nvar _getParent = require(\"./getParent\");\nfunction findElementRecursive(element, matchFunction) {\n    if (!element || element === document.body) return null;\n    return matchFunction(element) ? element : findElementRecursive((0, _getParent.getParent)(element), matchFunction);\n}\n\n},{\"./getParent\":\"gp02N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6Mnks\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Gets the elements which are child elements of the given element.\n * If `allowVirtualChildren` is `true`, this method enumerates virtual child elements\n * after the original children.\n * @param parent - The element to get the children of.\n * @param allowVirtualChildren - true if the method should enumerate virtual child elements.\n */ parcelHelpers.export(exports, \"getChildren\", ()=>getChildren);\nvar _isVirtualElement = require(\"./isVirtualElement\");\nfunction getChildren(parent, allowVirtualChildren) {\n    if (allowVirtualChildren === void 0) allowVirtualChildren = true;\n    var children = [];\n    if (parent) {\n        for(var i = 0; i < parent.children.length; i++)children.push(parent.children.item(i));\n        if (allowVirtualChildren && (0, _isVirtualElement.isVirtualElement)(parent)) children.push.apply(children, parent._virtual.children);\n    }\n    return children;\n}\n\n},{\"./isVirtualElement\":\"c1KhA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fbRSG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Determine whether a target is within a portal from perspective of root or optional parent.\n * This function only works against portal components that use the setPortalAttribute function.\n * If both parent and child are within the same portal this function will return false.\n * @param target - Element to query portal containment status of.\n * @param parent - Optional parent perspective. Search for containing portal stops at parent\n * (or root if parent is undefined or invalid.)\n */ parcelHelpers.export(exports, \"portalContainsElement\", ()=>portalContainsElement);\nvar _findElementRecursive = require(\"./findElementRecursive\");\nvar _setPortalAttribute = require(\"./setPortalAttribute\");\nfunction portalContainsElement(target, parent) {\n    var elementMatch = (0, _findElementRecursive.findElementRecursive)(target, function(testElement) {\n        return parent === testElement || testElement.hasAttribute((0, _setPortalAttribute.DATA_PORTAL_ATTRIBUTE));\n    });\n    return elementMatch !== null && elementMatch.hasAttribute((0, _setPortalAttribute.DATA_PORTAL_ATTRIBUTE));\n}\n\n},{\"./findElementRecursive\":\"38a7I\",\"./setPortalAttribute\":\"2QF9q\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2QF9q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DATA_PORTAL_ATTRIBUTE\", ()=>DATA_PORTAL_ATTRIBUTE);\n/**\n * Identify element as a portal by setting an attribute.\n * @param element - Element to mark as a portal.\n */ parcelHelpers.export(exports, \"setPortalAttribute\", ()=>setPortalAttribute);\nvar DATA_PORTAL_ATTRIBUTE = \"data-portal-element\";\nfunction setPortalAttribute(element) {\n    element.setAttribute(DATA_PORTAL_ATTRIBUTE, \"true\");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4Zyj6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Sets the virtual parent of an element.\n * Pass `undefined` as the `parent` to clear the virtual parent.\n *\n * @public\n */ parcelHelpers.export(exports, \"setVirtualParent\", ()=>setVirtualParent);\nfunction setVirtualParent(child, parent) {\n    var virtualChild = child;\n    var virtualParent = parent;\n    if (!virtualChild._virtual) virtualChild._virtual = {\n        children: []\n    };\n    var oldParent = virtualChild._virtual.parent;\n    if (oldParent && oldParent !== parent) {\n        // Remove the child from its old parent.\n        var index = oldParent._virtual.children.indexOf(virtualChild);\n        if (index > -1) oldParent._virtual.children.splice(index, 1);\n    }\n    virtualChild._virtual.parent = virtualParent || undefined;\n    if (virtualParent) {\n        if (!virtualParent._virtual) virtualParent._virtual = {\n            children: []\n        };\n        virtualParent._virtual.children.push(virtualChild);\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8AW20\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"elementContainsAttribute\", ()=>(0, _domUtilities.elementContainsAttribute));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1gHxv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"findElementRecursive\", ()=>(0, _domUtilities.findElementRecursive));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eav5V\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getChildren\", ()=>(0, _domUtilities.getChildren));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"59glD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getParent\", ()=>(0, _domUtilities.getParent));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5UAJR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getVirtualParent\", ()=>(0, _domUtilities.getVirtualParent));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aNAKX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isVirtualElement\", ()=>(0, _domUtilities.isVirtualElement));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eWZL6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"on\", ()=>on);\nfunction on(element, eventName, callback, options) {\n    element.addEventListener(eventName, callback, options);\n    return function() {\n        return element.removeEventListener(eventName, callback, options);\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hrucu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"portalContainsElement\", ()=>(0, _domUtilities.portalContainsElement));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4PKZi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/** Raises a click event. */ parcelHelpers.export(exports, \"raiseClick\", ()=>raiseClick);\nfunction raiseClick(target) {\n    var event = createNewEvent(\"MouseEvents\");\n    event.initEvent(\"click\", true, true);\n    target.dispatchEvent(event);\n}\nfunction createNewEvent(eventName) {\n    var event;\n    if (typeof Event === \"function\") // Chrome, Opera, Firefox\n    event = new Event(eventName);\n    else {\n        // IE\n        event = document.createEvent(\"Event\");\n        event.initEvent(eventName, true, true);\n    }\n    return event;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aJtbH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DATA_PORTAL_ATTRIBUTE\", ()=>(0, _domUtilities.DATA_PORTAL_ATTRIBUTE));\nparcelHelpers.export(exports, \"setPortalAttribute\", ()=>(0, _domUtilities.setPortalAttribute));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8QpWo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setVirtualParent\", ()=>(0, _domUtilities.setVirtualParent));\nvar _domUtilities = require(\"@fluentui/dom-utilities\");\n\n},{\"@fluentui/dom-utilities\":\"2DoJo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4YirV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Composes two components which conform to the `IComponentAs` specification; that is, two\n * components which accept a `defaultRender` prop, which is a 'default' implementation of\n * a component which accepts the same overall props.\n *\n * @public\n */ parcelHelpers.export(exports, \"composeComponentAs\", ()=>composeComponentAs);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _memoize = require(\"../memoize\");\nfunction createComposedComponent(outer) {\n    var Outer = outer;\n    var outerMemoizer = (0, _memoize.createMemoizer)(function(inner) {\n        if (outer === inner) throw new Error(\"Attempted to compose a component with itself.\");\n        var Inner = inner;\n        var innerMemoizer = (0, _memoize.createMemoizer)(function(defaultRender) {\n            var InnerWithDefaultRender = function(innerProps) {\n                return _react.createElement(Inner, (0, _tslib.__assign)({}, innerProps, {\n                    defaultRender: defaultRender\n                }));\n            };\n            return InnerWithDefaultRender;\n        });\n        var OuterWithDefaultRender = function(outerProps) {\n            var defaultRender = outerProps.defaultRender;\n            return _react.createElement(Outer, (0, _tslib.__assign)({}, outerProps, {\n                defaultRender: defaultRender ? innerMemoizer(defaultRender) : Inner\n            }));\n        };\n        return OuterWithDefaultRender;\n    });\n    return outerMemoizer;\n}\nvar componentAsMemoizer = (0, _memoize.createMemoizer)(createComposedComponent);\nfunction composeComponentAs(outer, inner) {\n    return componentAsMemoizer(outer)(inner);\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../memoize\":\"3d7Bj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3d7Bj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n *  Test utility for providing a custom weakmap.\n *\n * @internal\n * */ parcelHelpers.export(exports, \"setMemoizeWeakMap\", ()=>setMemoizeWeakMap);\n/**\n * Reset memoizations.\n */ parcelHelpers.export(exports, \"resetMemoizations\", ()=>resetMemoizations);\n/**\n * Memoize decorator to be used on class methods. WARNING: the `this` reference\n * will be inaccessible within a memoized method, given that a cached method's `this`\n * would not be instance-specific.\n *\n * @public\n */ parcelHelpers.export(exports, \"memoize\", ()=>memoize);\n/**\n * Memoizes a function; when you pass in the same parameters multiple times, it returns a cached result.\n * Be careful when passing in objects, you need to pass in the same INSTANCE for caching to work. Otherwise\n * it will grow the cache unnecessarily. Also avoid using default values that evaluate functions; passing in\n * undefined for a value and relying on a default function will execute it the first time, but will not\n * re-evaluate subsequent times which may have been unexpected.\n *\n * By default, the cache will reset after 100 permutations, to avoid abuse cases where the function is\n * unintendedly called with unique objects. Without a reset, the cache could grow infinitely, so we safeguard\n * by resetting. To override this behavior, pass a value of 0 to the maxCacheSize parameter.\n *\n * @public\n * @param cb - The function to memoize.\n * @param maxCacheSize - Max results to cache. If the cache exceeds this value, it will reset on the next call.\n * @param ignoreNullOrUndefinedResult - Flag to decide whether to cache callback result if it is undefined/null.\n * If the flag is set to true, the callback result is recomputed every time till the callback result is\n * not undefined/null for the first time, and then the non-undefined/null version gets cached.\n * @returns A memoized version of the function.\n */ parcelHelpers.export(exports, \"memoizeFunction\", ()=>memoizeFunction);\n/**\n * Creates a memoizer for a single-value function, backed by a WeakMap.\n * With a WeakMap, the memoized values are only kept as long as the source objects,\n * ensuring that there is no memory leak.\n *\n * This function assumes that the input values passed to the wrapped function will be\n * `function` or `object` types. To memoize functions which accept other inputs, use\n * `memoizeFunction`, which memoizes against arbitrary inputs using a lookup cache.\n *\n * @public\n */ parcelHelpers.export(exports, \"createMemoizer\", ()=>createMemoizer);\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _initializedStylesheetResets = false;\nvar _resetCounter = 0;\nvar _emptyObject = {\n    empty: true\n};\nvar _dictionary = {};\nvar _weakMap = typeof WeakMap === \"undefined\" ? null : WeakMap;\nfunction setMemoizeWeakMap(weakMap) {\n    _weakMap = weakMap;\n}\nfunction resetMemoizations() {\n    _resetCounter++;\n}\nfunction memoize(target, key, descriptor) {\n    // We bind to \"null\" to prevent people from inadvertently pulling values from \"this\",\n    // rather than passing them in as input values which can be memoized.\n    var fn = memoizeFunction(descriptor.value && descriptor.value.bind(null));\n    return {\n        configurable: true,\n        get: function() {\n            return fn;\n        }\n    };\n}\nfunction memoizeFunction(cb, maxCacheSize, ignoreNullOrUndefinedResult) {\n    if (maxCacheSize === void 0) maxCacheSize = 100;\n    if (ignoreNullOrUndefinedResult === void 0) ignoreNullOrUndefinedResult = false;\n    // Avoid breaking scenarios which don't have weak map.\n    if (!_weakMap) return cb;\n    if (!_initializedStylesheetResets) {\n        var stylesheet = (0, _mergeStyles.Stylesheet).getInstance();\n        if (stylesheet && stylesheet.onReset) (0, _mergeStyles.Stylesheet).getInstance().onReset(resetMemoizations);\n        _initializedStylesheetResets = true;\n    }\n    var rootNode;\n    var cacheSize = 0;\n    var localResetCounter = _resetCounter;\n    return function memoizedFunction() {\n        var args = [];\n        for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n        var currentNode = rootNode;\n        if (rootNode === undefined || localResetCounter !== _resetCounter || maxCacheSize > 0 && cacheSize > maxCacheSize) {\n            rootNode = _createNode();\n            cacheSize = 0;\n            localResetCounter = _resetCounter;\n        }\n        currentNode = rootNode;\n        // Traverse the tree until we find the match.\n        for(var i = 0; i < args.length; i++){\n            var arg = _normalizeArg(args[i]);\n            if (!currentNode.map.has(arg)) currentNode.map.set(arg, _createNode());\n            currentNode = currentNode.map.get(arg);\n        }\n        if (!currentNode.hasOwnProperty(\"value\")) {\n            currentNode.value = cb.apply(void 0, args);\n            cacheSize++;\n        }\n        if (ignoreNullOrUndefinedResult && (currentNode.value === null || currentNode.value === undefined)) currentNode.value = cb.apply(void 0, args);\n        return currentNode.value;\n    };\n}\nfunction createMemoizer(getValue) {\n    if (!_weakMap) // Without a `WeakMap` implementation, memoization is not possible.\n    return getValue;\n    var cache = new _weakMap();\n    function memoizedGetValue(input) {\n        if (!input || typeof input !== \"function\" && typeof input !== \"object\") // A WeakMap can only be used to test against reference values, i.e. 'function' and 'object'.\n        // All other inputs cannot be memoized against in this manner.\n        return getValue(input);\n        if (cache.has(input)) return cache.get(input);\n        var value = getValue(input);\n        cache.set(input, value);\n        return value;\n    }\n    return memoizedGetValue;\n}\nfunction _normalizeArg(val) {\n    if (!val) return _emptyObject;\n    else if (typeof val === \"object\" || typeof val === \"function\") return val;\n    else if (!_dictionary[val]) _dictionary[val] = {\n        val: val\n    };\n    return _dictionary[val];\n}\nfunction _createNode() {\n    return {\n        map: _weakMap ? new _weakMap() : null\n    };\n}\n\n},{\"@uifabric/merge-styles\":\"7c43M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dLw1C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Determines whether a component is controlled.\n * @param props - Component props\n * @param valueProp - Prop containing the controlled value\n * @returns true if controlled, false if uncontrolled\n */ parcelHelpers.export(exports, \"isControlled\", ()=>isControlled);\nfunction isControlled(props, valueProp) {\n    // React's built-in <input> considers a prop to be provided if its value is non-null/undefined.\n    // Mirror that behavior here (rather than checking for just undefined).\n    return props[valueProp] !== undefined && props[valueProp] !== null;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kn32w\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Concatination helper, which can merge class names together. Skips over falsey values.\n *\n * @public\n */ parcelHelpers.export(exports, \"css\", ()=>css);\nfunction css() {\n    var args = [];\n    for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n    var classes = [];\n    for(var _a = 0, args_1 = args; _a < args_1.length; _a++){\n        var arg = args_1[_a];\n        if (arg) {\n            if (typeof arg === \"string\") classes.push(arg);\n            else if (arg.hasOwnProperty(\"toString\") && typeof arg.toString === \"function\") classes.push(arg.toString());\n            else {\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                for(var key in arg)// eslint-disable-next-line @typescript-eslint/no-explicit-any\n                if (arg[key]) classes.push(key);\n            }\n        }\n    }\n    return classes.join(\" \");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cQrva\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Customizations\", ()=>Customizations);\nvar _tslib = require(\"tslib\");\nvar _globalSettings = require(\"../GlobalSettings\");\nvar CustomizationsGlobalKey = \"customizations\";\nvar NO_CUSTOMIZATIONS = {\n    settings: {},\n    scopedSettings: {},\n    inCustomizerContext: false\n};\nvar _allSettings = (0, _globalSettings.GlobalSettings).getValue(CustomizationsGlobalKey, {\n    settings: {},\n    scopedSettings: {},\n    inCustomizerContext: false\n});\nvar _events = [];\nvar Customizations = /** @class */ function() {\n    function Customizations1() {}\n    Customizations1.reset = function() {\n        _allSettings.settings = {};\n        _allSettings.scopedSettings = {};\n    };\n    /** Apply global Customization settings.\n     * @example Customizations.applySettings(\\{ theme: \\{...\\} \\});\n     */ Customizations1.applySettings = function(settings) {\n        _allSettings.settings = (0, _tslib.__assign)((0, _tslib.__assign)({}, _allSettings.settings), settings);\n        Customizations1._raiseChange();\n    };\n    /** Apply Customizations to a particular named scope, like a component.\n     * @example Customizations.applyScopedSettings('Nav', \\{ styles: () =\\> \\{\\} \\});\n     */ Customizations1.applyScopedSettings = function(scopeName, settings) {\n        _allSettings.scopedSettings[scopeName] = (0, _tslib.__assign)((0, _tslib.__assign)({}, _allSettings.scopedSettings[scopeName]), settings);\n        Customizations1._raiseChange();\n    };\n    Customizations1.getSettings = function(properties, scopeName, localSettings) {\n        if (localSettings === void 0) localSettings = NO_CUSTOMIZATIONS;\n        var settings = {};\n        var localScopedSettings = scopeName && localSettings.scopedSettings[scopeName] || {};\n        var globalScopedSettings = scopeName && _allSettings.scopedSettings[scopeName] || {};\n        for(var _i = 0, properties_1 = properties; _i < properties_1.length; _i++){\n            var property = properties_1[_i];\n            settings[property] = localScopedSettings[property] || localSettings.settings[property] || globalScopedSettings[property] || _allSettings.settings[property];\n        }\n        return settings;\n    };\n    /** Used to run some code that sets Customizations without triggering an update until the end.\n     * Useful for applying Customizations that don't affect anything currently rendered, or for\n     * applying many customizations at once.\n     * @param suppressUpdate - Do not raise the change event at the end, preventing all updates\n     */ Customizations1.applyBatchedUpdates = function(code, suppressUpdate) {\n        Customizations1._suppressUpdates = true;\n        try {\n            code();\n        } catch (_a) {\n        /* do nothing */ }\n        Customizations1._suppressUpdates = false;\n        if (!suppressUpdate) Customizations1._raiseChange();\n    };\n    Customizations1.observe = function(onChange) {\n        _events.push(onChange);\n    };\n    Customizations1.unobserve = function(onChange) {\n        _events = _events.filter(function(cb) {\n            return cb !== onChange;\n        });\n    };\n    Customizations1._raiseChange = function() {\n        if (!Customizations1._suppressUpdates) _events.forEach(function(cb) {\n            return cb();\n        });\n    };\n    return Customizations1;\n}();\n\n},{\"tslib\":\"01Tx1\",\"../GlobalSettings\":\"6PyOf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hA4qU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Customizer\", ()=>Customizer);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _customizations = require(\"./Customizations\");\nvar _customizerContext = require(\"./CustomizerContext\");\nvar _mergeCustomizations = require(\"./mergeCustomizations\");\n/**\n * The Customizer component allows for default props to be mixed into components which\n * are decorated with the customizable() decorator, or use the styled HOC. This enables\n * injection scenarios like:\n *\n * 1. render svg icons instead of the icon font within all buttons\n * 2. inject a custom theme object into a component\n *\n * Props are provided via the settings prop which should be one of the following:\n * - A json map which contains 1 or more name/value pairs representing injectable props.\n * - A function that receives the current settings and returns the new ones that apply to the scope\n *\n * @public\n */ var Customizer = /** @class */ function(_super) {\n    (0, _tslib.__extends)(Customizer1, _super);\n    function Customizer1() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._onCustomizationChange = function() {\n            return _this.forceUpdate();\n        };\n        return _this;\n    }\n    Customizer1.prototype.componentDidMount = function() {\n        (0, _customizations.Customizations).observe(this._onCustomizationChange);\n    };\n    Customizer1.prototype.componentWillUnmount = function() {\n        (0, _customizations.Customizations).unobserve(this._onCustomizationChange);\n    };\n    Customizer1.prototype.render = function() {\n        var _this = this;\n        var contextTransform = this.props.contextTransform;\n        return _react.createElement((0, _customizerContext.CustomizerContext).Consumer, null, function(parentContext) {\n            var newContext = (0, _mergeCustomizations.mergeCustomizations)(_this.props, parentContext);\n            if (contextTransform) newContext = contextTransform(newContext);\n            return _react.createElement((0, _customizerContext.CustomizerContext).Provider, {\n                value: newContext\n            }, _this.props.children);\n        });\n    };\n    return Customizer1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./Customizations\":\"cQrva\",\"./CustomizerContext\":\"lvXOl\",\"./mergeCustomizations\":\"eKS1v\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lvXOl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CustomizerContext\", ()=>CustomizerContext);\nvar _react = require(\"react\");\nvar CustomizerContext = _react.createContext({\n    customizations: {\n        inCustomizerContext: false,\n        settings: {},\n        scopedSettings: {}\n    }\n});\n\n},{\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eKS1v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Merge props and customizations giving priority to props over context.\n * NOTE: This function will always perform multiple merge operations. Use with caution.\n * @param props - New settings to merge in.\n * @param parentContext - Context containing current settings.\n * @returns Merged customizations.\n */ parcelHelpers.export(exports, \"mergeCustomizations\", ()=>mergeCustomizations);\nvar _mergeSettings = require(\"./mergeSettings\");\nfunction mergeCustomizations(props, parentContext) {\n    var _a = (parentContext || {}).customizations, customizations = _a === void 0 ? {\n        settings: {},\n        scopedSettings: {}\n    } : _a;\n    return {\n        customizations: {\n            settings: (0, _mergeSettings.mergeSettings)(customizations.settings, props.settings),\n            scopedSettings: (0, _mergeSettings.mergeScopedSettings)(customizations.scopedSettings, props.scopedSettings),\n            inCustomizerContext: true\n        }\n    };\n}\n\n},{\"./mergeSettings\":\"axslo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"axslo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Merge new and old settings, giving priority to new settings.\n * New settings is optional in which case oldSettings is returned as-is.\n * @param oldSettings - Old settings to fall back to.\n * @param newSettings - New settings that will be merged over oldSettings.\n * @returns Merged settings.\n */ parcelHelpers.export(exports, \"mergeSettings\", ()=>mergeSettings);\nparcelHelpers.export(exports, \"mergeScopedSettings\", ()=>mergeScopedSettings);\nvar _tslib = require(\"tslib\");\nfunction mergeSettings(oldSettings, newSettings) {\n    if (oldSettings === void 0) oldSettings = {};\n    var mergeSettingsWith = _isSettingsFunction(newSettings) ? newSettings : _settingsMergeWith(newSettings);\n    return mergeSettingsWith(oldSettings);\n}\nfunction mergeScopedSettings(oldSettings, newSettings) {\n    if (oldSettings === void 0) oldSettings = {};\n    var mergeSettingsWith = _isSettingsFunction(newSettings) ? newSettings : _scopedSettingsMergeWith(newSettings);\n    return mergeSettingsWith(oldSettings);\n}\nfunction _isSettingsFunction(settings) {\n    return typeof settings === \"function\";\n}\nfunction _settingsMergeWith(newSettings) {\n    return function(settings) {\n        return newSettings ? (0, _tslib.__assign)((0, _tslib.__assign)({}, settings), newSettings) : settings;\n    };\n}\nfunction _scopedSettingsMergeWith(scopedSettingsFromProps) {\n    if (scopedSettingsFromProps === void 0) scopedSettingsFromProps = {};\n    return function(oldScopedSettings) {\n        var newScopedSettings = (0, _tslib.__assign)({}, oldScopedSettings);\n        for(var scopeName in scopedSettingsFromProps)if (scopedSettingsFromProps.hasOwnProperty(scopeName)) newScopedSettings[scopeName] = (0, _tslib.__assign)((0, _tslib.__assign)({}, oldScopedSettings[scopeName]), scopedSettingsFromProps[scopeName]);\n        return newScopedSettings;\n    };\n}\n\n},{\"tslib\":\"01Tx1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8apqE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"customizable\", ()=>customizable);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _customizations = require(\"./Customizations\");\nvar _hoistStatics = require(\"../hoistStatics\");\nvar _customizerContext = require(\"./CustomizerContext\");\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nfunction customizable(scope, fields, concatStyles) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function customizableFactory(ComposedComponent) {\n        var _a;\n        var resultClass = (_a = /** @class */ function(_super) {\n            (0, _tslib.__extends)(ComponentWithInjectedProps, _super);\n            function ComponentWithInjectedProps(props) {\n                var _this = _super.call(this, props) || this;\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                _this._styleCache = {};\n                _this._onSettingChanged = _this._onSettingChanged.bind(_this);\n                return _this;\n            }\n            ComponentWithInjectedProps.prototype.componentDidMount = function() {\n                (0, _customizations.Customizations).observe(this._onSettingChanged);\n            };\n            ComponentWithInjectedProps.prototype.componentWillUnmount = function() {\n                (0, _customizations.Customizations).unobserve(this._onSettingChanged);\n            };\n            ComponentWithInjectedProps.prototype.render = function() {\n                var _this = this;\n                return _react.createElement((0, _customizerContext.CustomizerContext).Consumer, null, function(context) {\n                    var defaultProps = (0, _customizations.Customizations).getSettings(fields, scope, context.customizations);\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    var componentProps = _this.props;\n                    // If defaultProps.styles is a function, evaluate it before calling concatStyleSets\n                    if (defaultProps.styles && typeof defaultProps.styles === \"function\") defaultProps.styles = defaultProps.styles((0, _tslib.__assign)((0, _tslib.__assign)({}, defaultProps), componentProps));\n                    // If concatStyles is true and custom styles have been defined compute those styles\n                    if (concatStyles && defaultProps.styles) {\n                        if (_this._styleCache.default !== defaultProps.styles || _this._styleCache.component !== componentProps.styles) {\n                            var mergedStyles = (0, _mergeStyles.concatStyleSets)(defaultProps.styles, componentProps.styles);\n                            _this._styleCache.default = defaultProps.styles;\n                            _this._styleCache.component = componentProps.styles;\n                            _this._styleCache.merged = mergedStyles;\n                        }\n                        return _react.createElement(ComposedComponent, (0, _tslib.__assign)({}, defaultProps, componentProps, {\n                            styles: _this._styleCache.merged\n                        }));\n                    }\n                    return _react.createElement(ComposedComponent, (0, _tslib.__assign)({}, defaultProps, componentProps));\n                });\n            };\n            ComponentWithInjectedProps.prototype._onSettingChanged = function() {\n                this.forceUpdate();\n            };\n            return ComponentWithInjectedProps;\n        }(_react.Component), _a.displayName = \"Customized\" + scope, _a);\n        return (0, _hoistStatics.hoistStatics)(ComposedComponent, resultClass);\n    };\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./Customizations\":\"cQrva\",\"../hoistStatics\":\"eOXQy\",\"./CustomizerContext\":\"lvXOl\",\"@uifabric/merge-styles\":\"7c43M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eOXQy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Allows you to hoist static functions in components.\n * Created for the purpose of fixing broken static functions in classes\n * that utilize decorators.\n *\n * @public\n * @param source - The object where the methods are hoisted from.\n * @param dest - The object to hoist the methods onto.\n * @returns The dest object with methods added\n */ parcelHelpers.export(exports, \"hoistStatics\", ()=>hoistStatics);\nfunction hoistStatics(source, dest) {\n    for(var name_1 in source)if (source.hasOwnProperty(name_1)) // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    dest[name_1] = source[name_1];\n    return dest;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ilkk0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook to get Customizations settings from Customizations singleton or CustomizerContext.\n * It will trigger component state update on settings change observed.\n */ parcelHelpers.export(exports, \"useCustomizationSettings\", ()=>useCustomizationSettings);\nvar _react = require(\"react\");\nvar _customizations = require(\"./Customizations\");\nvar _customizerContext = require(\"./CustomizerContext\");\nfunction useCustomizationSettings(properties, scopeName) {\n    var forceUpdate = useForceUpdate();\n    var customizations = _react.useContext((0, _customizerContext.CustomizerContext)).customizations;\n    var inCustomizerContext = customizations.inCustomizerContext;\n    _react.useEffect(function() {\n        if (!inCustomizerContext) (0, _customizations.Customizations).observe(forceUpdate);\n        return function() {\n            if (!inCustomizerContext) (0, _customizations.Customizations).unobserve(forceUpdate);\n        };\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- exclude forceUpdate\n    }, [\n        inCustomizerContext\n    ]);\n    return (0, _customizations.Customizations).getSettings(properties, scopeName, customizations);\n}\nfunction useForceUpdate() {\n    var _a = _react.useState(0), setValue = _a[1];\n    return function() {\n        return setValue(function(value) {\n            return ++value;\n        });\n    };\n}\n\n},{\"react\":\"8ePka\",\"./Customizations\":\"cQrva\",\"./CustomizerContext\":\"lvXOl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4VCg2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Extends a component's lifetime methods by appending new functions to the existing lifetime functions.\n */ parcelHelpers.export(exports, \"extendComponent\", ()=>extendComponent);\nvar _appendFunction = require(\"./appendFunction\");\nfunction extendComponent(parent, methods) {\n    for(var name_1 in methods)if (methods.hasOwnProperty(name_1)) // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    parent[name_1] = (0, _appendFunction.appendFunction)(parent, parent[name_1], methods[name_1]);\n}\n\n},{\"./appendFunction\":\"3LuLW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ivx2u\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Gets the first focusable element.\n *\n * @public\n */ parcelHelpers.export(exports, \"getFirstFocusable\", ()=>getFirstFocusable);\n/**\n * Gets the last focusable element.\n *\n * @public\n */ parcelHelpers.export(exports, \"getLastFocusable\", ()=>getLastFocusable);\n/**\n * Gets the first tabbable element. (The difference between focusable and tabbable is that tabbable elements are\n * focusable elements that also have tabIndex != -1.)\n * @param rootElement - The parent element to search beneath.\n * @param currentElement - The descendant of rootElement to start the search at.  This element is the first one checked,\n * and iteration continues forward.  Typical use passes rootElement.firstChild.\n * @param includeElementsInFocusZones - true if traversal should go into FocusZone descendants.\n * @param checkNode - Include currentElement in search when true. Defaults to true.\n * @public\n */ parcelHelpers.export(exports, \"getFirstTabbable\", ()=>getFirstTabbable);\n/**\n * Gets the last tabbable element. (The difference between focusable and tabbable is that tabbable elements are\n * focusable elements that also have tabIndex != -1.)\n * @param rootElement - The parent element to search beneath.\n * @param currentElement - The descendant of rootElement to start the search at.  This element is the first one checked,\n * and iteration continues in reverse.  Typical use passes rootElement.lastChild.\n * @param includeElementsInFocusZones - true if traversal should go into FocusZone descendants.\n * @param checkNode - Include currentElement in search when true. Defaults to true.\n * @public\n */ parcelHelpers.export(exports, \"getLastTabbable\", ()=>getLastTabbable);\n/**\n * Attempts to focus the first focusable element that is a child or child's child of the rootElement.\n *\n * @public\n * @param rootElement - Element to start the search for a focusable child.\n * @returns True if focus was set, false if it was not.\n */ parcelHelpers.export(exports, \"focusFirstChild\", ()=>focusFirstChild);\n/**\n * Traverse to find the previous element.\n * If tabbable is true, the element must have tabIndex != -1.\n *\n * @public\n */ parcelHelpers.export(exports, \"getPreviousElement\", ()=>getPreviousElement);\n/**\n * Traverse to find the next focusable element.\n * If tabbable is true, the element must have tabIndex != -1.\n *\n * @public\n * @param checkNode - Include currentElement in search when true.\n */ parcelHelpers.export(exports, \"getNextElement\", ()=>getNextElement);\n/**\n * Determines if an element is visible.\n *\n * @public\n */ parcelHelpers.export(exports, \"isElementVisible\", ()=>isElementVisible);\n/**\n * Determines if an element can receive focus programmatically or via a mouse click.\n * If checkTabIndex is true, additionally checks to ensure the element can be focused with the tab key,\n * meaning tabIndex != -1.\n *\n * @public\n */ parcelHelpers.export(exports, \"isElementTabbable\", ()=>isElementTabbable);\n/**\n * Determines if a given element is a focus zone.\n *\n * @public\n */ parcelHelpers.export(exports, \"isElementFocusZone\", ()=>isElementFocusZone);\n/**\n * Determines if a given element is a focus sub zone.\n *\n * @public\n */ parcelHelpers.export(exports, \"isElementFocusSubZone\", ()=>isElementFocusSubZone);\n/**\n * Determines if an element, or any of its children, contain focus.\n *\n * @public\n */ parcelHelpers.export(exports, \"doesElementContainFocus\", ()=>doesElementContainFocus);\n/**\n * Determines if an, or any of its ancestors, sepcificies that it doesn't want focus to wrap\n * @param element - element to start searching from\n * @param noWrapDataAttribute - the no wrap data attribute to match (either)\n * @returns true if focus should wrap, false otherwise\n */ parcelHelpers.export(exports, \"shouldWrapFocus\", ()=>shouldWrapFocus);\n/**\n * Sets focus to an element asynchronously. The focus will be set at the next browser repaint,\n * meaning it won't cause any extra recalculations. If more than one focusAsync is called during one frame,\n * only the latest called focusAsync element will actually be focused\n * @param element - The element to focus\n */ parcelHelpers.export(exports, \"focusAsync\", ()=>focusAsync);\n/**\n * Finds the closest focusable element via an index path from a parent. See\n * `getElementIndexPath` for getting an index path from an element to a child.\n */ parcelHelpers.export(exports, \"getFocusableByIndexPath\", ()=>getFocusableByIndexPath);\n/**\n * Finds the element index path from a parent element to a child element.\n *\n * If you had this node structure: \"A has children [B, C] and C has child D\",\n * the index path from A to D would be [1, 0], or `parent.chidren[1].children[0]`.\n */ parcelHelpers.export(exports, \"getElementIndexPath\", ()=>getElementIndexPath);\nvar _elementContainsAttribute = require(\"./dom/elementContainsAttribute\");\nvar _elementContains = require(\"./dom/elementContains\");\nvar _getParent = require(\"./dom/getParent\");\nvar _getWindow = require(\"./dom/getWindow\");\nvar _getDocument = require(\"./dom/getDocument\");\nvar IS_FOCUSABLE_ATTRIBUTE = \"data-is-focusable\";\nvar IS_VISIBLE_ATTRIBUTE = \"data-is-visible\";\nvar FOCUSZONE_ID_ATTRIBUTE = \"data-focuszone-id\";\nvar FOCUSZONE_SUB_ATTRIBUTE = \"data-is-sub-focuszone\";\nfunction getFirstFocusable(rootElement, currentElement, includeElementsInFocusZones) {\n    return getNextElement(rootElement, currentElement, true, false, false, includeElementsInFocusZones);\n}\nfunction getLastFocusable(rootElement, currentElement, includeElementsInFocusZones) {\n    return getPreviousElement(rootElement, currentElement, true, false, true, includeElementsInFocusZones);\n}\nfunction getFirstTabbable(rootElement, currentElement, includeElementsInFocusZones, checkNode) {\n    if (checkNode === void 0) checkNode = true;\n    return getNextElement(rootElement, currentElement, checkNode, false, false, includeElementsInFocusZones, false, true);\n}\nfunction getLastTabbable(rootElement, currentElement, includeElementsInFocusZones, checkNode) {\n    if (checkNode === void 0) checkNode = true;\n    return getPreviousElement(rootElement, currentElement, checkNode, false, true, includeElementsInFocusZones, false, true);\n}\nfunction focusFirstChild(rootElement) {\n    var element = getNextElement(rootElement, rootElement, true, false, false, true);\n    if (element) {\n        focusAsync(element);\n        return true;\n    }\n    return false;\n}\nfunction getPreviousElement(rootElement, currentElement, checkNode, suppressParentTraversal, traverseChildren, includeElementsInFocusZones, allowFocusRoot, tabbable) {\n    if (!currentElement || !allowFocusRoot && currentElement === rootElement) return null;\n    var isCurrentElementVisible = isElementVisible(currentElement);\n    // Check its children.\n    if (traverseChildren && isCurrentElementVisible && (includeElementsInFocusZones || !(isElementFocusZone(currentElement) || isElementFocusSubZone(currentElement)))) {\n        var childMatch = getPreviousElement(rootElement, currentElement.lastElementChild, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable);\n        if (childMatch) {\n            if (tabbable && isElementTabbable(childMatch, true) || !tabbable) return childMatch;\n            var childMatchSiblingMatch = getPreviousElement(rootElement, childMatch.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable);\n            if (childMatchSiblingMatch) return childMatchSiblingMatch;\n            var childMatchParent = childMatch.parentElement;\n            // At this point if we have not found any potential matches\n            // start looking at the rest of the subtree under the currentParent.\n            // NOTE: We do not want to recurse here because doing so could\n            // cause elements to get skipped.\n            while(childMatchParent && childMatchParent !== currentElement){\n                var childMatchParentMatch = getPreviousElement(rootElement, childMatchParent.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable);\n                if (childMatchParentMatch) return childMatchParentMatch;\n                childMatchParent = childMatchParent.parentElement;\n            }\n        }\n    }\n    // Check the current node, if it's not the first traversal.\n    if (checkNode && isCurrentElementVisible && isElementTabbable(currentElement, tabbable)) return currentElement;\n    // Check its previous sibling.\n    var siblingMatch = getPreviousElement(rootElement, currentElement.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable);\n    if (siblingMatch) return siblingMatch;\n    // Check its parent.\n    if (!suppressParentTraversal) return getPreviousElement(rootElement, currentElement.parentElement, true, false, false, includeElementsInFocusZones, allowFocusRoot, tabbable);\n    return null;\n}\nfunction getNextElement(rootElement, currentElement, checkNode, suppressParentTraversal, suppressChildTraversal, includeElementsInFocusZones, allowFocusRoot, tabbable) {\n    if (!currentElement || currentElement === rootElement && suppressChildTraversal && !allowFocusRoot) return null;\n    var isCurrentElementVisible = isElementVisible(currentElement);\n    // Check the current node, if it's not the first traversal.\n    if (checkNode && isCurrentElementVisible && isElementTabbable(currentElement, tabbable)) return currentElement;\n    // Check its children.\n    if (!suppressChildTraversal && isCurrentElementVisible && (includeElementsInFocusZones || !(isElementFocusZone(currentElement) || isElementFocusSubZone(currentElement)))) {\n        var childMatch = getNextElement(rootElement, currentElement.firstElementChild, true, true, false, includeElementsInFocusZones, allowFocusRoot, tabbable);\n        if (childMatch) return childMatch;\n    }\n    if (currentElement === rootElement) return null;\n    // Check its sibling.\n    var siblingMatch = getNextElement(rootElement, currentElement.nextElementSibling, true, true, false, includeElementsInFocusZones, allowFocusRoot, tabbable);\n    if (siblingMatch) return siblingMatch;\n    if (!suppressParentTraversal) return getNextElement(rootElement, currentElement.parentElement, false, false, true, includeElementsInFocusZones, allowFocusRoot, tabbable);\n    return null;\n}\nfunction isElementVisible(element) {\n    // If the element is not valid, return false.\n    if (!element || !element.getAttribute) return false;\n    var visibilityAttribute = element.getAttribute(IS_VISIBLE_ATTRIBUTE);\n    // If the element is explicitly marked with the visibility attribute, return that value as boolean.\n    if (visibilityAttribute !== null && visibilityAttribute !== undefined) return visibilityAttribute === \"true\";\n    // Fallback to other methods of determining actual visibility.\n    return element.offsetHeight !== 0 || element.offsetParent !== null || // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    element.isVisible === true; // used as a workaround for testing.\n}\nfunction isElementTabbable(element, checkTabIndex) {\n    // If this element is null or is disabled, it is not considered tabbable.\n    if (!element || element.disabled) return false;\n    var tabIndex = 0;\n    var tabIndexAttributeValue = null;\n    if (element && element.getAttribute) {\n        tabIndexAttributeValue = element.getAttribute(\"tabIndex\");\n        if (tabIndexAttributeValue) tabIndex = parseInt(tabIndexAttributeValue, 10);\n    }\n    var isFocusableAttribute = element.getAttribute ? element.getAttribute(IS_FOCUSABLE_ATTRIBUTE) : null;\n    var isTabIndexSet = tabIndexAttributeValue !== null && tabIndex >= 0;\n    var result = !!element && isFocusableAttribute !== \"false\" && (element.tagName === \"A\" || element.tagName === \"BUTTON\" || element.tagName === \"INPUT\" || element.tagName === \"TEXTAREA\" || element.tagName === \"SELECT\" || isFocusableAttribute === \"true\" || isTabIndexSet);\n    return checkTabIndex ? tabIndex !== -1 && result : result;\n}\nfunction isElementFocusZone(element) {\n    return !!(element && element.getAttribute && !!element.getAttribute(FOCUSZONE_ID_ATTRIBUTE));\n}\nfunction isElementFocusSubZone(element) {\n    return !!(element && element.getAttribute && element.getAttribute(FOCUSZONE_SUB_ATTRIBUTE) === \"true\");\n}\nfunction doesElementContainFocus(element) {\n    var document = (0, _getDocument.getDocument)(element);\n    var currentActiveElement = document && document.activeElement;\n    if (currentActiveElement && (0, _elementContains.elementContains)(element, currentActiveElement)) return true;\n    return false;\n}\nfunction shouldWrapFocus(element, noWrapDataAttribute) {\n    return (0, _elementContainsAttribute.elementContainsAttribute)(element, noWrapDataAttribute) === \"true\" ? false : true;\n}\nvar targetToFocusOnNextRepaint = undefined;\nfunction focusAsync(element) {\n    if (element) {\n        // An element was already queued to be focused, so replace that one with the new element\n        if (targetToFocusOnNextRepaint) {\n            targetToFocusOnNextRepaint = element;\n            return;\n        }\n        targetToFocusOnNextRepaint = element;\n        var win = (0, _getWindow.getWindow)(element);\n        if (win) // element.focus() is a no-op if the element is no longer in the DOM, meaning this is always safe\n        win.requestAnimationFrame(function() {\n            var focusableElement = targetToFocusOnNextRepaint;\n            // We are done focusing for this frame, so reset the queued focus element\n            targetToFocusOnNextRepaint = undefined;\n            if (focusableElement) {\n                if (focusableElement.getAttribute && focusableElement.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\") // Normally, a FocusZone would be responsible for setting the tabindex values on all its descendants.\n                // However, even this animation frame callback can pre-empt the rendering of a FocusZone's child elements,\n                // so it may be necessary to set the tabindex directly here.\n                {\n                    if (!focusableElement.getAttribute(\"tabindex\")) focusableElement.setAttribute(\"tabindex\", \"0\");\n                }\n                focusableElement.focus();\n            }\n        });\n    }\n}\nfunction getFocusableByIndexPath(parent, path) {\n    var element = parent;\n    for(var _i = 0, path_1 = path; _i < path_1.length; _i++){\n        var index = path_1[_i];\n        var nextChild = element.children[Math.min(index, element.children.length - 1)];\n        if (!nextChild) break;\n        element = nextChild;\n    }\n    element = isElementTabbable(element) && isElementVisible(element) ? element : getNextElement(parent, element, true) || getPreviousElement(parent, element);\n    return element;\n}\nfunction getElementIndexPath(fromElement, toElement) {\n    var path = [];\n    while(toElement && fromElement && toElement !== fromElement){\n        var parent_1 = (0, _getParent.getParent)(toElement, true);\n        if (parent_1 === null) return [];\n        path.unshift(Array.prototype.indexOf.call(parent_1.children, toElement));\n        toElement = parent_1;\n    }\n    return path;\n}\n\n},{\"./dom/elementContainsAttribute\":\"8AW20\",\"./dom/elementContains\":\"ds9l8\",\"./dom/getParent\":\"59glD\",\"./dom/getWindow\":\"8f64x\",\"./dom/getDocument\":\"bYcmK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"XXn0P\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Generates a unique id in the global scope (this spans across duplicate copies of the same library.)\n *\n * @public\n */ parcelHelpers.export(exports, \"getId\", ()=>getId);\n/**\n * Resets id counter to an (optional) number.\n *\n * @public\n */ parcelHelpers.export(exports, \"resetIds\", ()=>resetIds);\nvar _getWindow = require(\"./dom/getWindow\");\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\n// Initialize global window id.\nvar CURRENT_ID_PROPERTY = \"__currentId__\";\nvar DEFAULT_ID_STRING = \"id__\";\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nvar _global = (0, _getWindow.getWindow)() || {};\nif (_global[CURRENT_ID_PROPERTY] === undefined) _global[CURRENT_ID_PROPERTY] = 0;\nvar _initializedStylesheetResets = false;\nfunction getId(prefix) {\n    if (!_initializedStylesheetResets) {\n        // Configure ids to reset on stylesheet resets.\n        var stylesheet = (0, _mergeStyles.Stylesheet).getInstance();\n        if (stylesheet && stylesheet.onReset) stylesheet.onReset(resetIds);\n        _initializedStylesheetResets = true;\n    }\n    var index = _global[CURRENT_ID_PROPERTY]++;\n    return (prefix === undefined ? DEFAULT_ID_STRING : prefix) + index;\n}\nfunction resetIds(counter) {\n    if (counter === void 0) counter = 0;\n    _global[CURRENT_ID_PROPERTY] = counter;\n}\n\n},{\"./dom/getWindow\":\"8f64x\",\"@uifabric/merge-styles\":\"7c43M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b4b1E\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Given an element tagname and user props, filters the props to only allowed props for the given\n * element type.\n * @param tagName - Tag name (e.g. \"div\")\n * @param props - Props object\n * @param excludedPropNames - List of props to disallow\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"getNativeElementProps\", ()=>getNativeElementProps);\nvar _properties = require(\"./properties\");\nvar nativeElementMap = {\n    label: (0, _properties.labelProperties),\n    audio: (0, _properties.audioProperties),\n    video: (0, _properties.videoProperties),\n    ol: (0, _properties.olProperties),\n    li: (0, _properties.liProperties),\n    a: (0, _properties.anchorProperties),\n    button: (0, _properties.buttonProperties),\n    input: (0, _properties.inputProperties),\n    textarea: (0, _properties.textAreaProperties),\n    select: (0, _properties.selectProperties),\n    option: (0, _properties.optionProperties),\n    table: (0, _properties.tableProperties),\n    tr: (0, _properties.trProperties),\n    th: (0, _properties.thProperties),\n    td: (0, _properties.tdProperties),\n    colGroup: (0, _properties.colGroupProperties),\n    col: (0, _properties.colProperties),\n    form: (0, _properties.formProperties),\n    iframe: (0, _properties.iframeProperties),\n    img: (0, _properties.imgProperties)\n};\nfunction getNativeElementProps(tagName, props, excludedPropNames) {\n    var allowedPropNames = tagName && nativeElementMap[tagName] || (0, _properties.htmlElementProperties);\n    return (0, _properties.getNativeProps)(props, allowedPropNames, excludedPropNames);\n}\n\n},{\"./properties\":\"1GF3W\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1GF3W\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"baseElementEvents\", ()=>baseElementEvents);\nparcelHelpers.export(exports, \"baseElementProperties\", ()=>baseElementProperties);\nparcelHelpers.export(exports, \"htmlElementProperties\", ()=>htmlElementProperties);\nparcelHelpers.export(exports, \"labelProperties\", ()=>labelProperties);\nparcelHelpers.export(exports, \"audioProperties\", ()=>audioProperties);\nparcelHelpers.export(exports, \"videoProperties\", ()=>videoProperties);\nparcelHelpers.export(exports, \"olProperties\", ()=>olProperties);\nparcelHelpers.export(exports, \"liProperties\", ()=>liProperties);\nparcelHelpers.export(exports, \"anchorProperties\", ()=>anchorProperties);\nparcelHelpers.export(exports, \"buttonProperties\", ()=>buttonProperties);\nparcelHelpers.export(exports, \"inputProperties\", ()=>inputProperties);\nparcelHelpers.export(exports, \"textAreaProperties\", ()=>textAreaProperties);\nparcelHelpers.export(exports, \"selectProperties\", ()=>selectProperties);\nparcelHelpers.export(exports, \"optionProperties\", ()=>optionProperties);\nparcelHelpers.export(exports, \"tableProperties\", ()=>tableProperties);\nparcelHelpers.export(exports, \"trProperties\", ()=>trProperties);\nparcelHelpers.export(exports, \"thProperties\", ()=>thProperties);\nparcelHelpers.export(exports, \"tdProperties\", ()=>tdProperties);\nparcelHelpers.export(exports, \"colGroupProperties\", ()=>colGroupProperties);\nparcelHelpers.export(exports, \"colProperties\", ()=>colProperties);\nparcelHelpers.export(exports, \"formProperties\", ()=>formProperties);\nparcelHelpers.export(exports, \"iframeProperties\", ()=>iframeProperties);\nparcelHelpers.export(exports, \"imgProperties\", ()=>imgProperties);\nparcelHelpers.export(exports, \"imageProperties\", ()=>imageProperties);\nparcelHelpers.export(exports, \"divProperties\", ()=>divProperties);\n/**\n * Gets native supported props for an html element provided the allowance set. Use one of the property\n * sets defined (divProperties, buttonPropertes, etc) to filter out supported properties from a given\n * props set. Note that all data- and aria- prefixed attributes will be allowed.\n * NOTE: getNativeProps should always be applied first when adding props to a react component. The\n * non-native props should be applied second. This will prevent getNativeProps from overriding your custom props.\n * For example, if props passed to getNativeProps has an onClick function and getNativeProps is added to\n * the component after an onClick function is added, then the getNativeProps onClick will override it.\n *\n * @public\n * @param props - The unfiltered input props\n * @param allowedPropsNames - The array or record of allowed prop names.\n * @returns The filtered props\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"getNativeProps\", ()=>getNativeProps);\nvar toObjectMap = function() {\n    var items = [];\n    for(var _i = 0; _i < arguments.length; _i++)items[_i] = arguments[_i];\n    var result = {};\n    for(var _a = 0, items_1 = items; _a < items_1.length; _a++){\n        var item = items_1[_a];\n        var keys = Array.isArray(item) ? item : Object.keys(item);\n        for(var _b = 0, keys_1 = keys; _b < keys_1.length; _b++){\n            var key = keys_1[_b];\n            result[key] = 1;\n        }\n    }\n    return result;\n};\nvar baseElementEvents = toObjectMap([\n    \"onCopy\",\n    \"onCut\",\n    \"onPaste\",\n    \"onCompositionEnd\",\n    \"onCompositionStart\",\n    \"onCompositionUpdate\",\n    \"onFocus\",\n    \"onFocusCapture\",\n    \"onBlur\",\n    \"onBlurCapture\",\n    \"onChange\",\n    \"onInput\",\n    \"onSubmit\",\n    \"onLoad\",\n    \"onError\",\n    \"onKeyDown\",\n    \"onKeyDownCapture\",\n    \"onKeyPress\",\n    \"onKeyUp\",\n    \"onAbort\",\n    \"onCanPlay\",\n    \"onCanPlayThrough\",\n    \"onDurationChange\",\n    \"onEmptied\",\n    \"onEncrypted\",\n    \"onEnded\",\n    \"onLoadedData\",\n    \"onLoadedMetadata\",\n    \"onLoadStart\",\n    \"onPause\",\n    \"onPlay\",\n    \"onPlaying\",\n    \"onProgress\",\n    \"onRateChange\",\n    \"onSeeked\",\n    \"onSeeking\",\n    \"onStalled\",\n    \"onSuspend\",\n    \"onTimeUpdate\",\n    \"onVolumeChange\",\n    \"onWaiting\",\n    \"onClick\",\n    \"onClickCapture\",\n    \"onContextMenu\",\n    \"onDoubleClick\",\n    \"onDrag\",\n    \"onDragEnd\",\n    \"onDragEnter\",\n    \"onDragExit\",\n    \"onDragLeave\",\n    \"onDragOver\",\n    \"onDragStart\",\n    \"onDrop\",\n    \"onMouseDown\",\n    \"onMouseDownCapture\",\n    \"onMouseEnter\",\n    \"onMouseLeave\",\n    \"onMouseMove\",\n    \"onMouseOut\",\n    \"onMouseOver\",\n    \"onMouseUp\",\n    \"onMouseUpCapture\",\n    \"onSelect\",\n    \"onTouchCancel\",\n    \"onTouchEnd\",\n    \"onTouchMove\",\n    \"onTouchStart\",\n    \"onScroll\",\n    \"onWheel\",\n    \"onPointerCancel\",\n    \"onPointerDown\",\n    \"onPointerEnter\",\n    \"onPointerLeave\",\n    \"onPointerMove\",\n    \"onPointerOut\",\n    \"onPointerOver\",\n    \"onPointerUp\",\n    \"onGotPointerCapture\",\n    \"onLostPointerCapture\", \n]);\nvar baseElementProperties = toObjectMap([\n    \"accessKey\",\n    \"children\",\n    \"className\",\n    \"contentEditable\",\n    \"dir\",\n    \"draggable\",\n    \"hidden\",\n    \"htmlFor\",\n    \"id\",\n    \"lang\",\n    \"ref\",\n    \"role\",\n    \"style\",\n    \"tabIndex\",\n    \"title\",\n    \"translate\",\n    \"spellCheck\",\n    \"name\", \n]);\nvar htmlElementProperties = toObjectMap(baseElementProperties, baseElementEvents);\nvar labelProperties = toObjectMap(htmlElementProperties, [\n    \"form\", \n]);\nvar audioProperties = toObjectMap(htmlElementProperties, [\n    \"height\",\n    \"loop\",\n    \"muted\",\n    \"preload\",\n    \"src\",\n    \"width\", \n]);\nvar videoProperties = toObjectMap(audioProperties, [\n    \"poster\", \n]);\nvar olProperties = toObjectMap(htmlElementProperties, [\n    \"start\", \n]);\nvar liProperties = toObjectMap(htmlElementProperties, [\n    \"value\", \n]);\nvar anchorProperties = toObjectMap(htmlElementProperties, [\n    \"download\",\n    \"href\",\n    \"hrefLang\",\n    \"media\",\n    \"rel\",\n    \"target\",\n    \"type\", \n]);\nvar buttonProperties = toObjectMap(htmlElementProperties, [\n    \"autoFocus\",\n    \"disabled\",\n    \"form\",\n    \"formAction\",\n    \"formEncType\",\n    \"formMethod\",\n    \"formNoValidate\",\n    \"formTarget\",\n    \"type\",\n    \"value\", \n]);\nvar inputProperties = toObjectMap(buttonProperties, [\n    \"accept\",\n    \"alt\",\n    \"autoCapitalize\",\n    \"autoComplete\",\n    \"checked\",\n    \"dirname\",\n    \"form\",\n    \"height\",\n    \"inputMode\",\n    \"list\",\n    \"max\",\n    \"maxLength\",\n    \"min\",\n    \"multiple\",\n    \"pattern\",\n    \"placeholder\",\n    \"readOnly\",\n    \"required\",\n    \"src\",\n    \"step\",\n    \"size\",\n    \"type\",\n    \"value\",\n    \"width\", \n]);\nvar textAreaProperties = toObjectMap(buttonProperties, [\n    \"autoCapitalize\",\n    \"cols\",\n    \"dirname\",\n    \"form\",\n    \"maxLength\",\n    \"placeholder\",\n    \"readOnly\",\n    \"required\",\n    \"rows\",\n    \"wrap\", \n]);\nvar selectProperties = toObjectMap(buttonProperties, [\n    \"form\",\n    \"multiple\",\n    \"required\", \n]);\nvar optionProperties = toObjectMap(htmlElementProperties, [\n    \"selected\",\n    \"value\", \n]);\nvar tableProperties = toObjectMap(htmlElementProperties, [\n    \"cellPadding\",\n    \"cellSpacing\", \n]);\nvar trProperties = htmlElementProperties;\nvar thProperties = toObjectMap(htmlElementProperties, [\n    \"rowSpan\",\n    \"scope\", \n]);\nvar tdProperties = toObjectMap(htmlElementProperties, [\n    \"colSpan\",\n    \"headers\",\n    \"rowSpan\",\n    \"scope\", \n]);\nvar colGroupProperties = toObjectMap(htmlElementProperties, [\n    \"span\", \n]);\nvar colProperties = toObjectMap(htmlElementProperties, [\n    \"span\", \n]);\nvar formProperties = toObjectMap(htmlElementProperties, [\n    \"acceptCharset\",\n    \"action\",\n    \"encType\",\n    \"encType\",\n    \"method\",\n    \"noValidate\",\n    \"target\", \n]);\nvar iframeProperties = toObjectMap(htmlElementProperties, [\n    \"allow\",\n    \"allowFullScreen\",\n    \"allowPaymentRequest\",\n    \"allowTransparency\",\n    \"csp\",\n    \"height\",\n    \"importance\",\n    \"referrerPolicy\",\n    \"sandbox\",\n    \"src\",\n    \"srcDoc\",\n    \"width\", \n]);\nvar imgProperties = toObjectMap(htmlElementProperties, [\n    \"alt\",\n    \"crossOrigin\",\n    \"height\",\n    \"src\",\n    \"srcSet\",\n    \"useMap\",\n    \"width\", \n]);\nvar imageProperties = imgProperties;\nvar divProperties = htmlElementProperties;\nfunction getNativeProps(// eslint-disable-next-line @typescript-eslint/no-explicit-any\nprops, allowedPropNames, excludedPropNames) {\n    // It'd be great to properly type this while allowing 'aria-` and 'data-' attributes like TypeScript does for\n    // JSX attributes, but that ability is hardcoded into the TS compiler with no analog in TypeScript typings.\n    // Then we'd be able to enforce props extends native props (including aria- and data- attributes), and then\n    // return native props.\n    // We should be able to do this once this PR is merged: https://github.com/microsoft/TypeScript/pull/26797\n    var _a;\n    var isArray = Array.isArray(allowedPropNames);\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var result = {};\n    var keys = Object.keys(props);\n    for(var _i = 0, keys_2 = keys; _i < keys_2.length; _i++){\n        var key = keys_2[_i];\n        var isNativeProp = !isArray && allowedPropNames[key] || isArray && allowedPropNames.indexOf(key) >= 0 || key.indexOf(\"data-\") === 0 || key.indexOf(\"aria-\") === 0;\n        if (isNativeProp && (!excludedPropNames || ((_a = excludedPropNames) === null || _a === void 0 ? void 0 : _a.indexOf(key)) === -1)) // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        result[key] = props[key];\n    }\n    return result;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"laxhl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Allows you to hoist methods, except those in an exclusion set from a source object into a destination object.\n *\n * @public\n * @param destination - The instance of the object to hoist the methods onto.\n * @param source - The instance of the object where the methods are hoisted from.\n * @param exclusions - (Optional) What methods to exclude from being hoisted.\n * @returns An array of names of methods that were hoisted.\n */ parcelHelpers.export(exports, \"hoistMethods\", ()=>hoistMethods);\n/**\n * Provides a method for convenience to unhoist hoisted methods.\n *\n * @public\n * @param source - The source object upon which methods were hoisted.\n * @param methodNames - An array of method names to unhoist.\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"unhoistMethods\", ()=>unhoistMethods);\nvar REACT_LIFECYCLE_EXCLUSIONS = [\n    \"setState\",\n    \"render\",\n    \"componentWillMount\",\n    \"UNSAFE_componentWillMount\",\n    \"componentDidMount\",\n    \"componentWillReceiveProps\",\n    \"UNSAFE_componentWillReceiveProps\",\n    \"shouldComponentUpdate\",\n    \"componentWillUpdate\",\n    \"getSnapshotBeforeUpdate\",\n    \"UNSAFE_componentWillUpdate\",\n    \"componentDidUpdate\",\n    \"componentWillUnmount\", \n];\nfunction hoistMethods(// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndestination, // eslint-disable-next-line @typescript-eslint/no-explicit-any\nsource, exclusions) {\n    if (exclusions === void 0) exclusions = REACT_LIFECYCLE_EXCLUSIONS;\n    var hoisted = [];\n    var _loop_1 = function(methodName) {\n        if (typeof source[methodName] === \"function\" && destination[methodName] === undefined && (!exclusions || exclusions.indexOf(methodName) === -1)) {\n            hoisted.push(methodName);\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            destination[methodName] = function() {\n                var args = [];\n                for(var _i = 0; _i < arguments.length; _i++)args[_i] = arguments[_i];\n                source[methodName].apply(source, args);\n            };\n        }\n    };\n    for(var methodName1 in source)_loop_1(methodName1);\n    return hoisted;\n}\nfunction unhoistMethods(source, methodNames) {\n    methodNames.forEach(function(methodName) {\n        return delete source[methodName];\n    });\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jexxl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Helper to manage componentRef resolution. Internally appends logic to\n * lifetime methods to resolve componentRef to the passed in object.\n *\n * Usage: call initializeComponentRef(this) in the constructor,\n */ parcelHelpers.export(exports, \"initializeComponentRef\", ()=>initializeComponentRef);\nvar _extendComponent = require(\"./extendComponent\");\nfunction initializeComponentRef(obj) {\n    (0, _extendComponent.extendComponent)(obj, {\n        componentDidMount: _onMount,\n        componentDidUpdate: _onUpdate,\n        componentWillUnmount: _onUnmount\n    });\n}\nfunction _onMount() {\n    _setComponentRef(this.props.componentRef, this);\n}\nfunction _onUpdate(prevProps) {\n    if (prevProps.componentRef !== this.props.componentRef) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        _setComponentRef(prevProps.componentRef, null);\n        _setComponentRef(this.props.componentRef, this);\n    }\n}\nfunction _onUnmount() {\n    _setComponentRef(this.props.componentRef, null);\n}\nfunction _setComponentRef(componentRef, value) {\n    if (componentRef) {\n        if (typeof componentRef === \"object\") componentRef.current = value;\n        else if (typeof componentRef === \"function\") componentRef(value);\n    }\n}\n\n},{\"./extendComponent\":\"4VCg2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k3hSu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Initializes the logic which:\n *\n * 1. Subscribes keydown and mousedown events. (It will only do it once per window,\n *    so it's safe to call this method multiple times.)\n * 2. When the user presses directional keyboard keys, adds the 'ms-Fabric--isFocusVisible' classname\n *    to the document body, removes the 'ms-Fabric-isFocusHidden' classname.\n * 3. When the user clicks a mouse button, adds the 'ms-Fabric-isFocusHidden' classname to the\n *    document body, removes the 'ms-Fabric--isFocusVisible' classname.\n *\n * This logic allows components on the page to conditionally render focus treatments based on\n * the existence of global classnames, which simplifies logic overall.\n *\n * @param window - the window used to add the event listeners\n * @deprecated Use useFocusRects hook or FocusRects component instead.\n */ parcelHelpers.export(exports, \"initializeFocusRects\", ()=>initializeFocusRects);\nvar _getWindow = require(\"./dom/getWindow\");\nvar _keyboard = require(\"./keyboard\");\nvar _setFocusVisibility = require(\"./setFocusVisibility\");\nfunction initializeFocusRects(window) {\n    var _a;\n    var win = window || (0, _getWindow.getWindow)();\n    if (!win || ((_a = win.FabricConfig) === null || _a === void 0 ? void 0 : _a.disableFocusRects) === true) return;\n    if (!win.__hasInitializeFocusRects__) {\n        win.__hasInitializeFocusRects__ = true;\n        win.addEventListener(\"mousedown\", _onMouseDown, true);\n        win.addEventListener(\"pointerdown\", _onPointerDown, true);\n        win.addEventListener(\"keydown\", _onKeyDown, true);\n    }\n}\nfunction _onMouseDown(ev) {\n    (0, _setFocusVisibility.setFocusVisibility)(false, ev.target);\n}\nfunction _onPointerDown(ev) {\n    if (ev.pointerType !== \"mouse\") (0, _setFocusVisibility.setFocusVisibility)(false, ev.target);\n}\nfunction _onKeyDown(ev) {\n    // eslint-disable-next-line deprecation/deprecation\n    (0, _keyboard.isDirectionalKeyCode)(ev.which) && (0, _setFocusVisibility.setFocusVisibility)(true, ev.target);\n}\n\n},{\"./dom/getWindow\":\"8f64x\",\"./keyboard\":\"ePjml\",\"./setFocusVisibility\":\"eggWL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ePjml\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Returns true if the keycode is a directional keyboard key.\n */ parcelHelpers.export(exports, \"isDirectionalKeyCode\", ()=>isDirectionalKeyCode);\n/**\n * Adds a keycode to the list of keys that, when pressed, should cause the focus outlines to be visible.\n * This can be used to add global shortcut keys that directionally move from section to section within\n * an app or between focus trap zones.\n */ parcelHelpers.export(exports, \"addDirectionalKeyCode\", ()=>addDirectionalKeyCode);\nvar _keyCodes = require(\"./KeyCodes\");\nvar _a;\nvar DirectionalKeyCodes = (_a = {}, _a[(0, _keyCodes.KeyCodes).up] = 1, _a[(0, _keyCodes.KeyCodes).down] = 1, _a[(0, _keyCodes.KeyCodes).left] = 1, _a[(0, _keyCodes.KeyCodes).right] = 1, _a[(0, _keyCodes.KeyCodes).home] = 1, _a[(0, _keyCodes.KeyCodes).end] = 1, _a[(0, _keyCodes.KeyCodes).tab] = 1, _a[(0, _keyCodes.KeyCodes).pageUp] = 1, _a[(0, _keyCodes.KeyCodes).pageDown] = 1, _a);\nfunction isDirectionalKeyCode(which) {\n    return !!DirectionalKeyCodes[which];\n}\nfunction addDirectionalKeyCode(which) {\n    DirectionalKeyCodes[which] = 1;\n}\n\n},{\"./KeyCodes\":\"aP2ZH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eggWL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"IsFocusVisibleClassName\", ()=>IsFocusVisibleClassName);\nparcelHelpers.export(exports, \"IsFocusHiddenClassName\", ()=>IsFocusHiddenClassName);\n/**\n * Sets the visibility of focus styling.\n *\n * By default, focus styles (the box surrounding a focused Button, for example) only show up when navigational\n * keypresses occur (through Tab, arrows, PgUp/PgDn, Home and End), and are hidden when mouse interactions occur.\n * This API provides an imperative way to turn them on/off.\n *\n * A use case might be when you have a keypress like ctrl-f6 navigate to a particular region on the page,\n * and want focus to show up.\n *\n * @param enabled - whether to remove or add focus\n * @param target - optional target\n */ parcelHelpers.export(exports, \"setFocusVisibility\", ()=>setFocusVisibility);\nvar _getWindow = require(\"./dom/getWindow\");\nvar IsFocusVisibleClassName = \"ms-Fabric--isFocusVisible\";\nvar IsFocusHiddenClassName = \"ms-Fabric--isFocusHidden\";\nfunction setFocusVisibility(enabled, target) {\n    var win = target ? (0, _getWindow.getWindow)(target) : (0, _getWindow.getWindow)();\n    if (win) {\n        var classList = win.document.body.classList;\n        classList.add(enabled ? IsFocusVisibleClassName : IsFocusHiddenClassName);\n        classList.remove(enabled ? IsFocusHiddenClassName : IsFocusVisibleClassName);\n    }\n}\n\n},{\"./dom/getWindow\":\"8f64x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"isDDh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Initializes the logic which:\n *\n * 1. Subscribes keydown and mousedown events. (It will only do it once per window,\n *    so it's safe to call this method multiple times.)\n * 2. When the user presses directional keyboard keys, adds the 'ms-Fabric--isFocusVisible' classname\n *    to the document body, removes the 'ms-Fabric-isFocusHidden' classname.\n * 3. When the user clicks a mouse button, adds the 'ms-Fabric-isFocusHidden' classname to the\n *    document body, removes the 'ms-Fabric--isFocusVisible' classname.\n *\n * This logic allows components on the page to conditionally render focus treatments based on\n * the existence of global classnames, which simplifies logic overall.\n *\n * @param rootRef - A Ref object. Focus rectangle can be applied on itself and all its children.\n */ parcelHelpers.export(exports, \"useFocusRects\", ()=>useFocusRects);\nparcelHelpers.export(exports, \"FocusRects\", ()=>FocusRects);\nvar _react = require(\"react\");\nvar _getWindow = require(\"./dom/getWindow\");\nvar _keyboard = require(\"./keyboard\");\nvar _setFocusVisibility = require(\"./setFocusVisibility\");\n/**\n * Counter for mounted component that uses focus rectangle.\n * We want to cleanup the listners before last component that uses focus rectangle unmounts.\n */ var mountCounters = new WeakMap();\nfunction setMountCounters(key, delta) {\n    var newValue;\n    var currValue = mountCounters.get(key);\n    if (currValue) newValue = currValue + delta;\n    else newValue = 1;\n    mountCounters.set(key, newValue);\n    return newValue;\n}\nfunction useFocusRects(rootRef) {\n    _react.useEffect(function() {\n        var _a1, _b;\n        var win = (0, _getWindow.getWindow)((_a1 = rootRef) === null || _a1 === void 0 ? void 0 : _a1.current);\n        if (!win || ((_b = win.FabricConfig) === null || _b === void 0 ? void 0 : _b.disableFocusRects) === true) return undefined;\n        var count = setMountCounters(win, 1);\n        if (count <= 1) {\n            win.addEventListener(\"mousedown\", _onMouseDown, true);\n            win.addEventListener(\"pointerdown\", _onPointerDown, true);\n            win.addEventListener(\"keydown\", _onKeyDown, true);\n        }\n        return function() {\n            var _a;\n            if (!win || ((_a = win.FabricConfig) === null || _a === void 0 ? void 0 : _a.disableFocusRects) === true) return;\n            count = setMountCounters(win, -1);\n            if (count === 0) {\n                win.removeEventListener(\"mousedown\", _onMouseDown, true);\n                win.removeEventListener(\"pointerdown\", _onPointerDown, true);\n                win.removeEventListener(\"keydown\", _onKeyDown, true);\n            }\n        };\n    }, [\n        rootRef\n    ]);\n}\nvar FocusRects = function(props) {\n    useFocusRects(props.rootRef);\n    return null;\n};\nfunction _onMouseDown(ev) {\n    (0, _setFocusVisibility.setFocusVisibility)(false, ev.target);\n}\nfunction _onPointerDown(ev) {\n    if (ev.pointerType !== \"mouse\") (0, _setFocusVisibility.setFocusVisibility)(false, ev.target);\n}\nfunction _onKeyDown(ev) {\n    // eslint-disable-next-line deprecation/deprecation\n    if ((0, _keyboard.isDirectionalKeyCode)(ev.which)) (0, _setFocusVisibility.setFocusVisibility)(true, ev.target);\n}\n\n},{\"react\":\"8ePka\",\"./dom/getWindow\":\"8f64x\",\"./keyboard\":\"ePjml\",\"./setFocusVisibility\":\"eggWL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"86fb4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Get (up to 2 characters) initials based on display name of the persona.\n *\n * @public\n */ parcelHelpers.export(exports, \"getInitials\", ()=>getInitials);\n/**\n * Regular expression matching characters to ignore when calculating the initials.\n */ /**\n * Regular expression matching characters within various types of enclosures, including the enclosures themselves\n *  so for example, (xyz) [xyz] {xyz} all would be ignored\n */ var UNWANTED_ENCLOSURES_REGEX = /[\\(\\[\\{][^\\)\\]\\}]*[\\)\\]\\}]/g;\n/**\n * Regular expression matching special ASCII characters except space, plus some unicode special characters.\n * Applies after unwanted enclosures have been removed\n */ var UNWANTED_CHARS_REGEX = /[\\0-\\u001F\\!-/:-@\\[-`\\{-\\u00BF\\u0250-\\u036F\\uD800-\\uFFFF]/g;\n/**\n * Regular expression matching phone numbers. Applied after chars matching UNWANTED_CHARS_REGEX have been removed\n * and number has been trimmed for whitespaces\n */ var PHONENUMBER_REGEX = /^\\d+[\\d\\s]*(:?ext|x|)\\s*\\d+$/i;\n/** Regular expression matching one or more spaces. */ var MULTIPLE_WHITESPACES_REGEX = /\\s+/g;\n/**\n * Regular expression matching languages for which we currently don't support initials.\n * Arabic:   Arabic, Arabic Supplement, Arabic Extended-A.\n * Korean:   Hangul Jamo, Hangul Compatibility Jamo, Hangul Jamo Extended-A, Hangul Syllables, Hangul Jamo Extended-B.\n * Japanese: Hiragana, Katakana.\n * CJK:      CJK Unified Ideographs Extension A, CJK Unified Ideographs, CJK Compatibility Ideographs,\n *             CJK Unified Ideographs Extension B\n */ // eslint-disable-next-line @fluentui/max-len\nvar UNSUPPORTED_TEXT_REGEX = /[\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF\\u1100-\\u11FF\\u3130-\\u318F\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3040-\\u309F\\u30A0-\\u30FF\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uF900-\\uFAFF]|[\\uD840-\\uD869][\\uDC00-\\uDED6]/;\nfunction getInitialsLatin(displayName, isRtl) {\n    var initials = \"\";\n    var splits = displayName.split(\" \");\n    if (splits.length === 2) {\n        initials += splits[0].charAt(0).toUpperCase();\n        initials += splits[1].charAt(0).toUpperCase();\n    } else if (splits.length === 3) {\n        initials += splits[0].charAt(0).toUpperCase();\n        initials += splits[2].charAt(0).toUpperCase();\n    } else if (splits.length !== 0) initials += splits[0].charAt(0).toUpperCase();\n    if (isRtl && initials.length > 1) return initials.charAt(1) + initials.charAt(0);\n    return initials;\n}\nfunction cleanupDisplayName(displayName) {\n    displayName = displayName.replace(UNWANTED_ENCLOSURES_REGEX, \"\");\n    displayName = displayName.replace(UNWANTED_CHARS_REGEX, \"\");\n    displayName = displayName.replace(MULTIPLE_WHITESPACES_REGEX, \" \");\n    displayName = displayName.trim();\n    return displayName;\n}\nfunction getInitials(displayName, isRtl, allowPhoneInitials) {\n    if (!displayName) return \"\";\n    displayName = cleanupDisplayName(displayName);\n    // For names containing CJK characters, and phone numbers, we don't display initials\n    if (UNSUPPORTED_TEXT_REGEX.test(displayName) || !allowPhoneInitials && PHONENUMBER_REGEX.test(displayName)) return \"\";\n    return getInitialsLatin(displayName, isRtl);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7xavy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Gets the language set for the page.\n * @param persistenceType - Where to persist the value. Default is `localStorage` if available.\n * (In version 8, the default will be `sessionStorage`.)\n */ parcelHelpers.export(exports, \"getLanguage\", ()=>getLanguage);\nparcelHelpers.export(exports, \"setLanguage\", ()=>setLanguage);\nvar _getDocument = require(\"./dom/getDocument\");\nvar _localStorage = require(\"./localStorage\");\nvar _sessionStorage = require(\"./sessionStorage\");\n// Default to undefined so that we initialize on first read.\nvar _language;\nvar STORAGE_KEY = \"language\";\nfunction getLanguage(persistenceType) {\n    if (persistenceType === void 0) persistenceType = \"localStorage\";\n    if (_language === undefined) {\n        var doc = (0, _getDocument.getDocument)();\n        var savedLanguage = persistenceType === \"localStorage\" ? _localStorage.getItem(STORAGE_KEY) : persistenceType === \"sessionStorage\" ? _sessionStorage.getItem(STORAGE_KEY) : undefined;\n        if (savedLanguage) _language = savedLanguage;\n        if (_language === undefined && doc) _language = doc.documentElement.getAttribute(\"lang\");\n        if (_language === undefined) _language = \"en\";\n    }\n    return _language;\n}\nfunction setLanguage(language, persistenceParam) {\n    var doc = (0, _getDocument.getDocument)();\n    if (doc) doc.documentElement.setAttribute(\"lang\", language);\n    var persistenceType = persistenceParam === true ? \"none\" : !persistenceParam ? \"localStorage\" : persistenceParam;\n    if (persistenceType === \"localStorage\") _localStorage.setItem(STORAGE_KEY, language);\n    else if (persistenceType === \"sessionStorage\") _sessionStorage.setItem(STORAGE_KEY, language);\n    _language = language;\n}\n\n},{\"./dom/getDocument\":\"bYcmK\",\"./localStorage\":\"hTP9b\",\"./sessionStorage\":\"fPGAq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hTP9b\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Fetches an item from local storage without throwing an exception\n * @param key The key of the item to fetch from local storage\n */ parcelHelpers.export(exports, \"getItem\", ()=>getItem);\n/**\n * Inserts an item into local storage without throwing an exception\n * @param key The key of the item to add to local storage\n * @param data The data to put into local storage\n */ parcelHelpers.export(exports, \"setItem\", ()=>setItem);\nvar _getWindow = require(\"./dom/getWindow\");\nfunction getItem(key) {\n    var result = null;\n    try {\n        var win = (0, _getWindow.getWindow)();\n        result = win ? win.localStorage.getItem(key) : null;\n    } catch (e) {\n    /* Eat the exception */ }\n    return result;\n}\nfunction setItem(key, data) {\n    try {\n        var win = (0, _getWindow.getWindow)();\n        win && win.localStorage.setItem(key, data);\n    } catch (e) {\n    /* Eat the exception */ }\n}\n\n},{\"./dom/getWindow\":\"8f64x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eQi7d\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Determines the distance between two points.\n *\n * @public\n */ /* eslint-disable deprecation/deprecation */ parcelHelpers.export(exports, \"getDistanceBetweenPoints\", ()=>getDistanceBetweenPoints);\n/**\n * Produces a proportionally-scaled version of an input content size when fit to a bounding size.\n * Given a `contentSize` and a `boundsSize`, this function scales `contentSize` proportionally\n * using either `contain` or `cover` fit behaviors.\n * Use this function to pre-calculate the layout for the CSS `object-fit` and `background-fit` behaviors.\n * With `contain`, the output size must be the largest it can be while completely within the `boundsSize`.\n * With `cover`, the output size must be the smallest it can be while completely around the `boundsSize`.\n * By default, there is a `maxScale` value of 1, which prevents the `contentSize` from being scaled larger.\n *\n * @param options - the options for the bounds fit operation\n */ parcelHelpers.export(exports, \"fitContentToBounds\", ()=>fitContentToBounds);\n/**\n * Calculates a number's precision based on the number of trailing\n * zeros if the number does not have a decimal indicated by a negative\n * precision. Otherwise, it calculates the number of digits after\n * the decimal point indicated by a positive precision.\n * @param value - the value to determine the precision of\n */ parcelHelpers.export(exports, \"calculatePrecision\", ()=>calculatePrecision);\n/**\n * Rounds a number to a certain level of precision. Accepts negative precision.\n * @param value - The value that is being rounded.\n * @param precision - The number of decimal places to round the number to\n */ parcelHelpers.export(exports, \"precisionRound\", ()=>precisionRound);\nfunction getDistanceBetweenPoints(point1, point2) {\n    var left1 = point1.left || point1.x || 0;\n    var top1 = point1.top || point1.y || 0;\n    var left2 = point2.left || point2.x || 0;\n    var top2 = point2.top || point2.y || 0;\n    /* eslint-enable deprecation/deprecation */ var distance = Math.sqrt(Math.pow(left1 - left2, 2) + Math.pow(top1 - top2, 2));\n    return distance;\n}\nfunction fitContentToBounds(options) {\n    var contentSize = options.contentSize, boundsSize = options.boundsSize, _a = options.mode, mode = _a === void 0 ? \"contain\" : _a, _b = options.maxScale, maxScale = _b === void 0 ? 1 : _b;\n    var contentAspectRatio = contentSize.width / contentSize.height;\n    var boundsAspectRatio = boundsSize.width / boundsSize.height;\n    var scale;\n    if (mode === \"contain\" ? contentAspectRatio > boundsAspectRatio : contentAspectRatio < boundsAspectRatio) scale = boundsSize.width / contentSize.width;\n    else scale = boundsSize.height / contentSize.height;\n    var finalScale = Math.min(maxScale, scale);\n    return {\n        width: contentSize.width * finalScale,\n        height: contentSize.height * finalScale\n    };\n}\nfunction calculatePrecision(value) {\n    /**\n     * Group 1:\n     * [1-9]([0]+$) matches trailing zeros\n     * Group 2:\n     * \\.([0-9]*) matches all digits after a decimal point.\n     */ var groups = /[1-9]([0]+$)|\\.([0-9]*)/.exec(String(value));\n    if (!groups) return 0;\n    if (groups[1]) return -groups[1].length;\n    if (groups[2]) return groups[2].length;\n    return 0;\n}\nfunction precisionRound(value, precision, base) {\n    if (base === void 0) base = 10;\n    var exp = Math.pow(base, precision);\n    return Math.round(value * exp) / exp;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bM8Ud\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Simple deep merge function. Takes all arguments and returns a deep copy of the objects merged\n * together in the order provided. If an object creates a circular reference, it will assign the\n * original reference.\n */ parcelHelpers.export(exports, \"merge\", ()=>merge);\nfunction merge(target) {\n    var args = [];\n    for(var _i = 1; _i < arguments.length; _i++)args[_i - 1] = arguments[_i];\n    for(var _a = 0, args_1 = args; _a < args_1.length; _a++){\n        var arg = args_1[_a];\n        _merge(target || {}, arg);\n    }\n    return target;\n}\n/**\n * The _merge helper iterates through all props on source and assigns them to target.\n * When the value is an object, we will create a deep clone of the object. However if\n * there is a circular reference, the value will not be deep cloned and will persist\n * the reference.\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _merge(target, source, circularReferences) {\n    if (circularReferences === void 0) circularReferences = [];\n    circularReferences.push(source);\n    for(var name_1 in source){\n        if (source.hasOwnProperty(name_1)) {\n            if (name_1 !== \"__proto__\" && name_1 !== \"constructor\" && name_1 !== \"prototype\") {\n                var value = source[name_1];\n                if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n                    var isCircularReference = circularReferences.indexOf(value) > -1;\n                    target[name_1] = isCircularReference ? value : _merge(target[name_1] || {}, value, circularReferences);\n                } else target[name_1] = value;\n            }\n        }\n    }\n    circularReferences.pop();\n    return target;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bC36M\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isIOS\", ()=>isIOS);\nvar isIOS = function() {\n    if (!window || !window.navigator || !window.navigator.userAgent) return false;\n    return /iPad|iPhone|iPod/i.test(window.navigator.userAgent);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a1LXp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Call this on a target element to make it modal to screen readers.\n * Returns a function that undoes the changes it made.\n */ parcelHelpers.export(exports, \"modalize\", ()=>modalize);\n/**\n * The helper functions here will make the target element as modal to screen readers, by placing aria-hidden on elements\n * that are siblings to the target element and the target element's ancestors (because aria-hidden gets inherited).\n * That way, all other elements on the page are hidden to the screen reader.\n */ var _getDocument = require(\"./dom/getDocument\");\nfunction modalize(target) {\n    var _a;\n    var affectedNodes = [];\n    var targetDocument = (0, _getDocument.getDocument)(target) || document;\n    // start at target, then recurse and do the same for parent, until we reach <body>\n    while(target !== targetDocument.body){\n        // grab all siblings of current element\n        for(var _i = 0, _b = target.parentElement.children; _i < _b.length; _i++){\n            var sibling = _b[_i];\n            // but ignore elements that are already aria-hidden\n            if (sibling !== target && ((_a = sibling.getAttribute(\"aria-hidden\")) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== \"true\") affectedNodes.push(sibling);\n        }\n        if (!target.parentElement) break;\n        target = target.parentElement;\n    }\n    // take all those elements and set aria-hidden=true on them\n    affectedNodes.forEach(function(node) {\n        node.setAttribute(\"aria-hidden\", \"true\");\n    });\n    return function() {\n        unmodalize(affectedNodes);\n        affectedNodes = []; // dispose\n    };\n}\n/**\n * Undoes the changes that modalize() did.\n */ function unmodalize(affectedNodes) {\n    affectedNodes.forEach(function(node) {\n        // set instead of removing in case other components explicitly set aria-hidden and do ==\"true\" or ==\"false\"\n        node.setAttribute(\"aria-hidden\", \"false\");\n    });\n}\n\n},{\"./dom/getDocument\":\"bYcmK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4Na99\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Returns true if the user is on a Mac. Caches the result value.\n * @param reset - Reset the cached result value (mainly for testing).\n */ parcelHelpers.export(exports, \"isMac\", ()=>isMac);\nvar _getWindow = require(\"./dom/getWindow\");\nvar isMacResult;\nfunction isMac(reset) {\n    if (typeof isMacResult === \"undefined\" || reset) {\n        var win = (0, _getWindow.getWindow)();\n        var userAgent = win && win.navigator.userAgent;\n        isMacResult = !!userAgent && userAgent.indexOf(\"Macintosh\") !== -1;\n    }\n    return !!isMacResult;\n}\n\n},{\"./dom/getWindow\":\"8f64x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g08Bp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Detects whether an element's content has horizontal overflow\n *\n * @public\n * @param element - Element to check for overflow\n * @returns True if element's content overflows\n */ parcelHelpers.export(exports, \"hasHorizontalOverflow\", ()=>hasHorizontalOverflow);\n/**\n * Detects whether an element's content has vertical overflow\n *\n * @public\n * @param element - Element to check for overflow\n * @returns True if element's content overflows\n */ parcelHelpers.export(exports, \"hasVerticalOverflow\", ()=>hasVerticalOverflow);\n/**\n * Detects whether an element's content has overflow in any direction\n *\n * @public\n * @param element - Element to check for overflow\n * @returns True if element's content overflows\n */ parcelHelpers.export(exports, \"hasOverflow\", ()=>hasOverflow);\nfunction hasHorizontalOverflow(element) {\n    return element.clientWidth < element.scrollWidth;\n}\nfunction hasVerticalOverflow(element) {\n    return element.clientHeight < element.scrollHeight;\n}\nfunction hasOverflow(element) {\n    return hasHorizontalOverflow(element) || hasVerticalOverflow(element);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b5YiS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Composes two 'render functions' to produce a final render function that renders\n * the outer function, passing the inner function as 'default render'. The inner function\n * is then passed the original 'default render' prop.\n * @public\n */ parcelHelpers.export(exports, \"composeRenderFunction\", ()=>composeRenderFunction);\nvar _memoize = require(\"../memoize\");\nfunction createComposedRenderFunction(outer) {\n    var outerMemoizer = (0, _memoize.createMemoizer)(function(inner) {\n        var innerMemoizer = (0, _memoize.createMemoizer)(function(defaultRender) {\n            return function(innerProps) {\n                return inner(innerProps, defaultRender);\n            };\n        });\n        return function(outerProps, defaultRender) {\n            return outer(outerProps, defaultRender ? innerMemoizer(defaultRender) : inner);\n        };\n    });\n    return outerMemoizer;\n}\nvar memoizer = (0, _memoize.createMemoizer)(createComposedRenderFunction);\nfunction composeRenderFunction(outer, inner) {\n    return memoizer(outer)(inner);\n}\n\n},{\"../memoize\":\"3d7Bj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3xZRx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/** Sets the current base url used for fetching images. */ parcelHelpers.export(exports, \"getResourceUrl\", ()=>getResourceUrl);\n/** Gets the current base url used for fetching images. */ parcelHelpers.export(exports, \"setBaseUrl\", ()=>setBaseUrl);\nvar _baseUrl = \"\";\nfunction getResourceUrl(url) {\n    return _baseUrl + url;\n}\nfunction setBaseUrl(baseUrl) {\n    _baseUrl = baseUrl;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6luZy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"safeRequestAnimationFrame\", ()=>safeRequestAnimationFrame);\nvar _extendComponent = require(\"./extendComponent\");\nvar safeRequestAnimationFrame = function(component) {\n    var activeTimeouts;\n    return function(cb) {\n        if (!activeTimeouts) {\n            activeTimeouts = new Set();\n            (0, _extendComponent.extendComponent)(component, {\n                componentWillUnmount: function() {\n                    activeTimeouts.forEach(function(id) {\n                        return cancelAnimationFrame(id);\n                    });\n                }\n            });\n        }\n        var timeoutId = requestAnimationFrame(function() {\n            activeTimeouts.delete(timeoutId);\n            cb();\n        });\n        activeTimeouts.add(timeoutId);\n    };\n};\n\n},{\"./extendComponent\":\"4VCg2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gvcyc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"safeSetTimeout\", ()=>safeSetTimeout);\nvar _extendComponent = require(\"./extendComponent\");\nvar safeSetTimeout = function(component) {\n    var activeTimeouts;\n    return function(cb, duration) {\n        if (!activeTimeouts) {\n            activeTimeouts = new Set();\n            (0, _extendComponent.extendComponent)(component, {\n                componentWillUnmount: function() {\n                    activeTimeouts.forEach(function(id) {\n                        return clearTimeout(id);\n                    });\n                }\n            });\n        }\n        var timeoutId = setTimeout(function() {\n            activeTimeouts.delete(timeoutId);\n            cb();\n        }, duration);\n        activeTimeouts.add(timeoutId);\n    };\n};\n\n},{\"./extendComponent\":\"4VCg2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7yIRz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _selectionTypes = require(\"./Selection.types\");\nparcelHelpers.exportAll(_selectionTypes, exports);\nvar _selection = require(\"./Selection\");\nparcelHelpers.exportAll(_selection, exports);\n\n},{\"./Selection.types\":\"3AIhh\",\"./Selection\":\"krqoP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3AIhh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SELECTION_CHANGE\", ()=>SELECTION_CHANGE);\nparcelHelpers.export(exports, \"SELECTION_ITEMS_CHANGE\", ()=>SELECTION_ITEMS_CHANGE);\nparcelHelpers.export(exports, \"SelectionMode\", ()=>SelectionMode);\nparcelHelpers.export(exports, \"SelectionDirection\", ()=>SelectionDirection);\nvar SELECTION_CHANGE = \"change\";\nvar SELECTION_ITEMS_CHANGE = \"items-change\";\nvar SelectionMode;\n(function(SelectionMode1) {\n    SelectionMode1[SelectionMode1[\"none\"] = 0] = \"none\";\n    SelectionMode1[SelectionMode1[\"single\"] = 1] = \"single\";\n    SelectionMode1[SelectionMode1[\"multiple\"] = 2] = \"multiple\";\n})(SelectionMode || (SelectionMode = {}));\nvar SelectionDirection;\n(function(SelectionDirection1) {\n    SelectionDirection1[SelectionDirection1[\"horizontal\"] = 0] = \"horizontal\";\n    SelectionDirection1[SelectionDirection1[\"vertical\"] = 1] = \"vertical\";\n})(SelectionDirection || (SelectionDirection = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"krqoP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Selection\", ()=>Selection);\nvar _selectionTypes = require(\"./Selection.types\");\nvar _eventGroup = require(\"../EventGroup\");\n/**\n * {@docCategory Selection}\n */ var Selection = /** @class */ function() {\n    /**\n     * Create a new Selection. If `TItem` does not have a `key` property, you must provide an options\n     * object with a `getKey` implementation. Providing options is optional otherwise.\n     * (At most one `options` object is accepted.)\n     */ function Selection1() {\n        var options = []; // Otherwise, arguments require options with `getKey`.\n        for(var _i = 0 // Otherwise, arguments require options with `getKey`.\n        ; _i < arguments.length // Otherwise, arguments require options with `getKey`.\n        ; _i++ // Otherwise, arguments require options with `getKey`.\n        )options[_i] = arguments[_i]; // Otherwise, arguments require options with `getKey`.\n        var _a = options[0] || {}, onSelectionChanged = _a.onSelectionChanged, onItemsChanged = _a.onItemsChanged, getKey = _a.getKey, _b = _a.canSelectItem, canSelectItem = _b === void 0 ? function() {\n            return true;\n        } : _b, items = _a.items, _c = _a.selectionMode, selectionMode = _c === void 0 ? (0, _selectionTypes.SelectionMode).multiple : _c;\n        this.mode = selectionMode;\n        this._getKey = getKey || defaultGetKey;\n        this._changeEventSuppressionCount = 0;\n        this._exemptedCount = 0;\n        this._anchoredIndex = 0;\n        this._unselectableCount = 0;\n        this._onSelectionChanged = onSelectionChanged;\n        this._onItemsChanged = onItemsChanged;\n        this._canSelectItem = canSelectItem;\n        this._keyToIndexMap = {};\n        this._isModal = false;\n        this.setItems(items || [], true);\n        this.count = this.getSelectedCount();\n    }\n    Selection1.prototype.canSelectItem = function(item, index) {\n        if (typeof index === \"number\" && index < 0) return false;\n        return this._canSelectItem(item, index);\n    };\n    Selection1.prototype.getKey = function(item, index) {\n        var key = this._getKey(item, index);\n        return typeof key === \"number\" || key ? \"\" + key : \"\";\n    };\n    Selection1.prototype.setChangeEvents = function(isEnabled, suppressChange) {\n        this._changeEventSuppressionCount += isEnabled ? -1 : 1;\n        if (this._changeEventSuppressionCount === 0 && this._hasChanged) {\n            this._hasChanged = false;\n            if (!suppressChange) this._change();\n        }\n    };\n    Selection1.prototype.isModal = function() {\n        return this._isModal;\n    };\n    Selection1.prototype.setModal = function(isModal) {\n        if (this._isModal !== isModal) {\n            this.setChangeEvents(false);\n            this._isModal = isModal;\n            if (!isModal) this.setAllSelected(false);\n            this._change();\n            this.setChangeEvents(true);\n        }\n    };\n    /**\n     * Selection needs the items, call this method to set them. If the set\n     * of items is the same, this will re-evaluate selection and index maps.\n     * Otherwise, shouldClear should be set to true, so that selection is\n     * cleared.\n     */ Selection1.prototype.setItems = function(items, shouldClear) {\n        if (shouldClear === void 0) shouldClear = true;\n        var newKeyToIndexMap = {};\n        var newUnselectableIndices = {};\n        var hasSelectionChanged = false;\n        this.setChangeEvents(false);\n        // Reset the unselectable count.\n        this._unselectableCount = 0;\n        var haveItemsChanged = false;\n        // Build lookup table for quick selection evaluation.\n        for(var i = 0; i < items.length; i++){\n            var item = items[i];\n            if (item) {\n                var key = this.getKey(item, i);\n                if (key) {\n                    if (!haveItemsChanged && (!(key in this._keyToIndexMap) || this._keyToIndexMap[key] !== i)) haveItemsChanged = true;\n                    newKeyToIndexMap[key] = i;\n                }\n            }\n            newUnselectableIndices[i] = item && !this.canSelectItem(item);\n            if (newUnselectableIndices[i]) this._unselectableCount++;\n        }\n        if (shouldClear || items.length === 0) this._setAllSelected(false, true);\n        // Check the exemption list for discrepencies.\n        var newExemptedIndicies = {};\n        var newExemptedCount = 0;\n        for(var indexProperty in this._exemptedIndices)if (this._exemptedIndices.hasOwnProperty(indexProperty)) {\n            var index = Number(indexProperty);\n            var item = this._items[index];\n            var exemptKey = item ? this.getKey(item, Number(index)) : undefined;\n            var newIndex = exemptKey ? newKeyToIndexMap[exemptKey] : index;\n            if (newIndex === undefined) // The item has likely been replaced or removed.\n            hasSelectionChanged = true;\n            else {\n                // We know the new index of the item. update the existing exemption table.\n                newExemptedIndicies[newIndex] = true;\n                newExemptedCount++;\n                hasSelectionChanged = hasSelectionChanged || newIndex !== index;\n            }\n        }\n        if (this._items && this._exemptedCount === 0 && items.length !== this._items.length && this._isAllSelected) // If everything was selected but the number of items has changed, selection has changed.\n        hasSelectionChanged = true;\n        if (!haveItemsChanged) for(var _i = 0, _a = Object.keys(this._keyToIndexMap); _i < _a.length; _i++){\n            var key = _a[_i];\n            if (!(key in newKeyToIndexMap)) {\n                haveItemsChanged = true;\n                break;\n            }\n        }\n        this._exemptedIndices = newExemptedIndicies;\n        this._exemptedCount = newExemptedCount;\n        this._keyToIndexMap = newKeyToIndexMap;\n        this._unselectableIndices = newUnselectableIndices;\n        this._items = items;\n        this._selectedItems = null;\n        if (hasSelectionChanged) this._updateCount();\n        if (haveItemsChanged) {\n            (0, _eventGroup.EventGroup).raise(this, (0, _selectionTypes.SELECTION_ITEMS_CHANGE));\n            if (this._onItemsChanged) this._onItemsChanged();\n        }\n        if (hasSelectionChanged) this._change();\n        this.setChangeEvents(true);\n    };\n    Selection1.prototype.getItems = function() {\n        return this._items;\n    };\n    Selection1.prototype.getSelection = function() {\n        if (!this._selectedItems) {\n            this._selectedItems = [];\n            var items = this._items;\n            if (items) {\n                for(var i = 0; i < items.length; i++)if (this.isIndexSelected(i)) this._selectedItems.push(items[i]);\n            }\n        }\n        return this._selectedItems;\n    };\n    Selection1.prototype.getSelectedCount = function() {\n        return this._isAllSelected ? this._items.length - this._exemptedCount - this._unselectableCount : this._exemptedCount;\n    };\n    Selection1.prototype.getSelectedIndices = function() {\n        if (!this._selectedIndices) {\n            this._selectedIndices = [];\n            var items = this._items;\n            if (items) {\n                for(var i = 0; i < items.length; i++)if (this.isIndexSelected(i)) this._selectedIndices.push(i);\n            }\n        }\n        return this._selectedIndices;\n    };\n    Selection1.prototype.getItemIndex = function(key) {\n        var index = this._keyToIndexMap[key];\n        return index !== null && index !== void 0 ? index : -1;\n    };\n    Selection1.prototype.isRangeSelected = function(fromIndex, count) {\n        if (count === 0) return false;\n        var endIndex = fromIndex + count;\n        for(var i = fromIndex; i < endIndex; i++){\n            if (!this.isIndexSelected(i)) return false;\n        }\n        return true;\n    };\n    Selection1.prototype.isAllSelected = function() {\n        var selectableCount = this._items.length - this._unselectableCount;\n        // In single mode, we can only have a max of 1 item.\n        if (this.mode === (0, _selectionTypes.SelectionMode).single) selectableCount = Math.min(selectableCount, 1);\n        return this.count > 0 && this._isAllSelected && this._exemptedCount === 0 || !this._isAllSelected && this._exemptedCount === selectableCount && selectableCount > 0;\n    };\n    Selection1.prototype.isKeySelected = function(key) {\n        var index = this._keyToIndexMap[key];\n        return this.isIndexSelected(index);\n    };\n    Selection1.prototype.isIndexSelected = function(index) {\n        return !!(this.count > 0 && this._isAllSelected && !this._exemptedIndices[index] && !this._unselectableIndices[index] || !this._isAllSelected && this._exemptedIndices[index]);\n    };\n    Selection1.prototype.setAllSelected = function(isAllSelected) {\n        if (isAllSelected && this.mode !== (0, _selectionTypes.SelectionMode).multiple) return;\n        var selectableCount = this._items ? this._items.length - this._unselectableCount : 0;\n        this.setChangeEvents(false);\n        if (selectableCount > 0 && (this._exemptedCount > 0 || isAllSelected !== this._isAllSelected)) {\n            this._exemptedIndices = {};\n            if (isAllSelected !== this._isAllSelected || this._exemptedCount > 0) {\n                this._exemptedCount = 0;\n                this._isAllSelected = isAllSelected;\n                this._change();\n            }\n            this._updateCount();\n        }\n        this.setChangeEvents(true);\n    };\n    Selection1.prototype.setKeySelected = function(key, isSelected, shouldAnchor) {\n        var index = this._keyToIndexMap[key];\n        if (index >= 0) this.setIndexSelected(index, isSelected, shouldAnchor);\n    };\n    Selection1.prototype.setIndexSelected = function(index, isSelected, shouldAnchor) {\n        if (this.mode === (0, _selectionTypes.SelectionMode).none) return;\n        // Clamp the index.\n        index = Math.min(Math.max(0, index), this._items.length - 1);\n        // No-op on out of bounds selections.\n        if (index < 0 || index >= this._items.length) return;\n        this.setChangeEvents(false);\n        var isExempt = this._exemptedIndices[index];\n        var canSelect = !this._unselectableIndices[index];\n        if (canSelect) {\n            if (isSelected && this.mode === (0, _selectionTypes.SelectionMode).single) // If this is single-select, the previous selection should be removed.\n            this._setAllSelected(false, true);\n            // Determine if we need to remove the exemption.\n            if (isExempt && (isSelected && this._isAllSelected || !isSelected && !this._isAllSelected)) {\n                delete this._exemptedIndices[index];\n                this._exemptedCount--;\n            }\n            // Determine if we need to add the exemption.\n            if (!isExempt && (isSelected && !this._isAllSelected || !isSelected && this._isAllSelected)) {\n                this._exemptedIndices[index] = true;\n                this._exemptedCount++;\n            }\n            if (shouldAnchor) this._anchoredIndex = index;\n        }\n        this._updateCount();\n        this.setChangeEvents(true);\n    };\n    Selection1.prototype.selectToKey = function(key, clearSelection) {\n        this.selectToIndex(this._keyToIndexMap[key], clearSelection);\n    };\n    Selection1.prototype.selectToIndex = function(index, clearSelection) {\n        if (this.mode === (0, _selectionTypes.SelectionMode).none) return;\n        if (this.mode === (0, _selectionTypes.SelectionMode).single) {\n            this.setIndexSelected(index, true, true);\n            return;\n        }\n        var anchorIndex = this._anchoredIndex || 0;\n        var startIndex = Math.min(index, anchorIndex);\n        var endIndex = Math.max(index, anchorIndex);\n        this.setChangeEvents(false);\n        if (clearSelection) this._setAllSelected(false, true);\n        for(; startIndex <= endIndex; startIndex++)this.setIndexSelected(startIndex, true, false);\n        this.setChangeEvents(true);\n    };\n    Selection1.prototype.toggleAllSelected = function() {\n        this.setAllSelected(!this.isAllSelected());\n    };\n    Selection1.prototype.toggleKeySelected = function(key) {\n        this.setKeySelected(key, !this.isKeySelected(key), true);\n    };\n    Selection1.prototype.toggleIndexSelected = function(index) {\n        this.setIndexSelected(index, !this.isIndexSelected(index), true);\n    };\n    Selection1.prototype.toggleRangeSelected = function(fromIndex, count) {\n        if (this.mode === (0, _selectionTypes.SelectionMode).none) return;\n        var isRangeSelected = this.isRangeSelected(fromIndex, count);\n        var endIndex = fromIndex + count;\n        if (this.mode === (0, _selectionTypes.SelectionMode).single && count > 1) return;\n        this.setChangeEvents(false);\n        for(var i = fromIndex; i < endIndex; i++)this.setIndexSelected(i, !isRangeSelected, false);\n        this.setChangeEvents(true);\n    };\n    Selection1.prototype._updateCount = function(preserveModalState) {\n        if (preserveModalState === void 0) preserveModalState = false;\n        var count = this.getSelectedCount();\n        if (count !== this.count) {\n            this.count = count;\n            this._change();\n        }\n        if (!this.count && !preserveModalState) this.setModal(false);\n    };\n    Selection1.prototype._setAllSelected = function(isAllSelected, preserveModalState) {\n        if (preserveModalState === void 0) preserveModalState = false;\n        if (isAllSelected && this.mode !== (0, _selectionTypes.SelectionMode).multiple) return;\n        var selectableCount = this._items ? this._items.length - this._unselectableCount : 0;\n        this.setChangeEvents(false);\n        if (selectableCount > 0 && (this._exemptedCount > 0 || isAllSelected !== this._isAllSelected)) {\n            this._exemptedIndices = {};\n            if (isAllSelected !== this._isAllSelected || this._exemptedCount > 0) {\n                this._exemptedCount = 0;\n                this._isAllSelected = isAllSelected;\n                this._change();\n            }\n            this._updateCount(preserveModalState);\n        }\n        this.setChangeEvents(true);\n    };\n    Selection1.prototype._change = function() {\n        if (this._changeEventSuppressionCount === 0) {\n            this._selectedItems = null;\n            this._selectedIndices = undefined;\n            (0, _eventGroup.EventGroup).raise(this, (0, _selectionTypes.SELECTION_CHANGE));\n            if (this._onSelectionChanged) this._onSelectionChanged();\n        } else this._hasChanged = true;\n    };\n    return Selection1;\n}();\nfunction defaultGetKey(item, index) {\n    // 0 may be used as a key\n    var _a = (item || {}).key, key = _a === void 0 ? \"\" + index : _a;\n    return key;\n}\n\n},{\"./Selection.types\":\"3AIhh\",\"../EventGroup\":\"f8oQM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aj57R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * String format method, used for scenarios where at runtime you\n * need to evaluate a formatted string given a tokenized string. This\n * usually only is needed in localization scenarios.\n\n * @example\n * ```tsx\n * \"I love {0} every {1}\".format(\"CXP\")\n * ```\n * will result in a Debug Exception.\n *\n * @public\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"format\", ()=>format);\n// Regex that finds { and } so they can be removed on a lookup for string format\nvar FORMAT_ARGS_REGEX = /[\\{\\}]/g;\n// Regex that finds {#} so it can be replaced by the arguments in string format\nvar FORMAT_REGEX = /\\{\\d+\\}/g;\nfunction format(s) {\n    var values = [];\n    for(var _i = 1; _i < arguments.length; _i++)values[_i - 1] = arguments[_i];\n    var args = values;\n    // Callback match function\n    function replaceFunc(match) {\n        // looks up in the args\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var replacement = args[match.replace(FORMAT_ARGS_REGEX, \"\")];\n        // catches undefined in nondebug and null in debug and nondebug\n        if (replacement === null || replacement === undefined) replacement = \"\";\n        return replacement;\n    }\n    return s.replace(FORMAT_REGEX, replaceFunc);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bbmzw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"styled\", ()=>styled);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _useCustomizationSettings = require(\"./customizations/useCustomizationSettings\");\nvar DefaultFields = [\n    \"theme\",\n    \"styles\"\n];\nfunction styled(Component, baseStyles, getProps, customizable, pure) {\n    customizable = customizable || {\n        scope: \"\",\n        fields: undefined\n    };\n    var scope = customizable.scope, _a = customizable.fields, fields = _a === void 0 ? DefaultFields : _a;\n    var Wrapped = _react.forwardRef(function(props, forwardedRef) {\n        var styles = _react.useRef();\n        var settings = (0, _useCustomizationSettings.useCustomizationSettings)(fields, scope);\n        var customizedStyles = settings.styles, dir = settings.dir, rest = (0, _tslib.__rest)(settings, [\n            \"styles\",\n            \"dir\"\n        ]);\n        var additionalProps = getProps ? getProps(props) : undefined;\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        var cache = styles.current && styles.current.__cachedInputs__ || [];\n        if (!styles.current || customizedStyles !== cache[1] || props.styles !== cache[2]) {\n            // Using styled components as the Component arg will result in nested styling arrays.\n            var concatenatedStyles = function(styleProps) {\n                return (0, _mergeStyles.concatStyleSetsWithProps)(styleProps, baseStyles, customizedStyles, props.styles);\n            };\n            // The __cachedInputs__ array is attached to the function and consumed by the\n            // classNamesFunction as a list of keys to include for memoizing classnames.\n            concatenatedStyles.__cachedInputs__ = [\n                baseStyles,\n                customizedStyles,\n                props.styles, \n            ];\n            concatenatedStyles.__noStyleOverride__ = !customizedStyles && !props.styles;\n            styles.current = concatenatedStyles;\n        }\n        return _react.createElement(Component, (0, _tslib.__assign)({\n            ref: forwardedRef\n        }, rest, additionalProps, props, {\n            styles: styles.current\n        }));\n    });\n    // Function.prototype.name is an ES6 feature, so the cast to any is required until we're\n    // able to drop IE 11 support and compile with ES6 libs\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Wrapped.displayName = \"Styled\" + (Component.displayName || Component.name);\n    // This preserves backwards compatibility.\n    var pureComponent = pure ? _react.memo(Wrapped) : Wrapped;\n    // Check if the wrapper has a displayName after it has been memoized. Then assign it to the pure component.\n    if (Wrapped.displayName) pureComponent.displayName = Wrapped.displayName;\n    return pureComponent;\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@uifabric/merge-styles\":\"7c43M\",\"./customizations/useCustomizationSettings\":\"ilkk0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fzP82\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _warn = require(\"./warn/warn\");\nparcelHelpers.exportAll(_warn, exports);\nvar _warnConditionallyRequiredProps = require(\"./warn/warnConditionallyRequiredProps\");\nparcelHelpers.exportAll(_warnConditionallyRequiredProps, exports);\nvar _warnControlledUsage = require(\"./warn/warnControlledUsage\");\nparcelHelpers.exportAll(_warnControlledUsage, exports);\nvar _warnDeprecations = require(\"./warn/warnDeprecations\");\nparcelHelpers.exportAll(_warnDeprecations, exports);\nvar _warnMutuallyExclusive = require(\"./warn/warnMutuallyExclusive\");\nparcelHelpers.exportAll(_warnMutuallyExclusive, exports);\n\n},{\"./warn/warn\":\"7cefk\",\"./warn/warnConditionallyRequiredProps\":\"8gUdJ\",\"./warn/warnControlledUsage\":\"b4Oyj\",\"./warn/warnDeprecations\":\"kJWvt\",\"./warn/warnMutuallyExclusive\":\"jOpCK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b4Oyj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/** Reset controlled usage warnings for testing purposes. */ parcelHelpers.export(exports, \"resetControlledWarnings\", ()=>resetControlledWarnings);\n/**\n * Check for and warn on the following error conditions with a form component:\n * - A value prop is provided (indicated it's being used as controlled) without a change handler,\n *    and the component is not read-only\n * - Both the value and defaultValue props are provided\n * - The component is attempting to switch between controlled and uncontrolled\n *\n * The messages mimic the warnings React gives for these error conditions on input elements.\n * The warning will only be displayed once per component ID.\n */ parcelHelpers.export(exports, \"warnControlledUsage\", ()=>warnControlledUsage);\nvar _warn = require(\"./warn\");\nvar _controlled = require(\"../controlled\");\nvar warningsMap;\nfunction resetControlledWarnings() {}\nfunction warnControlledUsage(params) {\n    var componentId, componentName, defaultValueProp, props, oldProps, onChangeProp, readOnlyProp, valueProp, oldIsControlled, newIsControlled, hasOnChange, isReadOnly, defaultValue, oldType, newType, warnMap;\n}\n\n},{\"./warn\":\"7cefk\",\"../controlled\":\"dLw1C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hBdZx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isIE11\", ()=>isIE11);\nvar _getWindow = require(\"./dom/getWindow\");\nvar isIE11 = function() {\n    var _a, _b;\n    var win = (0, _getWindow.getWindow)();\n    if (!((_b = (_a = win) === null || _a === void 0 ? void 0 : _a.navigator) === null || _b === void 0 ? void 0 : _b.userAgent)) return false;\n    return win.navigator.userAgent.indexOf(\"rv:11.0\") > -1;\n};\n\n},{\"./dom/getWindow\":\"8f64x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lJikp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Function to apply default values to a component props object. This function is intended for function components,\n * to maintain parity with the `defaultProps` feature of class components. It accounts for properties that are\n * specified, but undefined.\n * @param defaultProps- An object with default values for various properties\n * @param propsWithoutDefaults- The props object passed into the component\n */ parcelHelpers.export(exports, \"getPropsWithDefaults\", ()=>getPropsWithDefaults);\nvar _tslib = require(\"tslib\");\nfunction getPropsWithDefaults(defaultProps, propsWithoutDefaults) {\n    var props = (0, _tslib.__assign)({}, propsWithoutDefaults);\n    for(var _i = 0, _a = Object.keys(defaultProps); _i < _a.length; _i++){\n        var key = _a[_i];\n        if (props[key] === undefined) props[key] = defaultProps[key];\n    }\n    return props;\n}\n\n},{\"tslib\":\"01Tx1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bsoKL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createMergedRef\", ()=>createMergedRef);\nvar _array = require(\"./array\");\n/**\n * Set up a ref resolver function given internal state managed for the ref.\n * @param local Set\n */ var createResolver = function(local) {\n    return function(newValue) {\n        for(var _i = 0, _a = local.refs; _i < _a.length; _i++){\n            var ref = _a[_i];\n            if (typeof ref === \"function\") ref(newValue);\n            else if (ref) // work around the immutability of the React.Ref type\n            ref.current = newValue;\n        }\n    };\n};\nvar createMergedRef = function(value) {\n    var local = {\n        refs: []\n    };\n    return function() {\n        var newRefs = [];\n        for(var _i = 0; _i < arguments.length; _i++)newRefs[_i] = arguments[_i];\n        if (!local.resolver || !(0, _array.arraysEqual)(local.refs, newRefs)) local.resolver = createResolver(local);\n        local.refs = newRefs;\n        return local.resolver;\n    };\n};\n\n},{\"./array\":\"fx288\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2Ha7p\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Icon/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Icon/index\":\"88f7n\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"88f7n\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _icon = require(\"./Icon\");\nparcelHelpers.exportAll(_icon, exports);\nvar _iconBase = require(\"./Icon.base\");\nparcelHelpers.exportAll(_iconBase, exports);\nvar _iconTypes = require(\"./Icon.types\");\nparcelHelpers.exportAll(_iconTypes, exports);\nvar _fontIcon = require(\"./FontIcon\");\nparcelHelpers.exportAll(_fontIcon, exports);\nvar _imageIcon = require(\"./ImageIcon\");\nparcelHelpers.exportAll(_imageIcon, exports);\n\n},{\"./Icon\":\"99FNq\",\"./Icon.base\":\"cJ525\",\"./Icon.types\":\"bSm32\",\"./FontIcon\":\"hF3SI\",\"./ImageIcon\":\"79fqz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"99FNq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Icon\", ()=>Icon);\nvar _utilities = require(\"../../Utilities\");\nvar _iconBase = require(\"./Icon.base\");\nvar _iconStyles = require(\"./Icon.styles\");\nvar Icon = (0, _utilities.styled)((0, _iconBase.IconBase), (0, _iconStyles.getStyles), undefined, {\n    scope: \"Icon\"\n}, true);\nIcon.displayName = \"Icon\";\n\n},{\"../../Utilities\":\"2F07a\",\"./Icon.base\":\"cJ525\",\"./Icon.styles\":\"VR1bq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cJ525\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"IconBase\", ()=>IconBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _iconTypes = require(\"./Icon.types\");\nvar _image = require(\"../Image/Image\");\nvar _imageTypes = require(\"../Image/Image.types\");\nvar _utilities = require(\"../../Utilities\");\nvar _fontIcon = require(\"./FontIcon\");\nvar getClassNames = (0, _utilities.classNamesFunction)({\n    // Icon is used a lot by other components.\n    // It's likely to see expected cases which pass different className to the Icon.\n    // Therefore setting a larger cache size.\n    cacheSize: 100\n});\nvar IconBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(IconBase1, _super);\n    function IconBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._onImageLoadingStateChange = function(state) {\n            if (_this.props.imageProps && _this.props.imageProps.onLoadingStateChange) _this.props.imageProps.onLoadingStateChange(state);\n            if (state === (0, _imageTypes.ImageLoadState).error) _this.setState({\n                imageLoadError: true\n            });\n        };\n        _this.state = {\n            imageLoadError: false\n        };\n        return _this;\n    }\n    IconBase1.prototype.render = function() {\n        var _a = this.props, children = _a.children, className = _a.className, styles = _a.styles, iconName = _a.iconName, imageErrorAs = _a.imageErrorAs, theme = _a.theme;\n        var isPlaceholder = typeof iconName === \"string\" && iconName.length === 0;\n        var isImage = // eslint-disable-next-line deprecation/deprecation\n        !!this.props.imageProps || this.props.iconType === (0, _iconTypes.IconType).image || this.props.iconType === (0, _iconTypes.IconType).Image;\n        var iconContent = (0, _fontIcon.getIconContent)(iconName) || {};\n        var iconClassName = iconContent.iconClassName, iconContentChildren = iconContent.children, mergeImageProps = iconContent.mergeImageProps;\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            iconClassName: iconClassName,\n            isImage: isImage,\n            isPlaceholder: isPlaceholder\n        });\n        var RootType = isImage ? \"span\" : \"i\";\n        var nativeProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.htmlElementProperties), [\n            \"aria-label\", \n        ]);\n        var imageLoadError = this.state.imageLoadError;\n        var imageProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, this.props.imageProps), {\n            onLoadingStateChange: this._onImageLoadingStateChange\n        });\n        var ImageType = imageLoadError && imageErrorAs || (0, _image.Image);\n        // eslint-disable-next-line deprecation/deprecation\n        var ariaLabel = this.props[\"aria-label\"] || this.props.ariaLabel;\n        var accessibleName = imageProps.alt || ariaLabel || this.props.title;\n        var hasName = !!(accessibleName || this.props[\"aria-labelledby\"] || imageProps[\"aria-label\"] || imageProps[\"aria-labelledby\"]);\n        var containerProps = hasName ? {\n            role: isImage || mergeImageProps ? undefined : \"img\",\n            \"aria-label\": isImage || mergeImageProps ? undefined : accessibleName\n        } : {\n            \"aria-hidden\": this.props[\"aria-labelledby\"] || imageProps[\"aria-labelledby\"] ? false : true\n        };\n        var finalIconContentChildren = iconContentChildren;\n        if (mergeImageProps && iconContentChildren && typeof iconContentChildren === \"object\" && accessibleName) finalIconContentChildren = _react.cloneElement(iconContentChildren, {\n            alt: accessibleName\n        });\n        return _react.createElement(RootType, (0, _tslib.__assign)({\n            \"data-icon-name\": iconName\n        }, containerProps, nativeProps, mergeImageProps ? {\n            title: undefined,\n            \"aria-label\": undefined\n        } : {}, {\n            className: classNames.root\n        }), isImage ? _react.createElement(ImageType, (0, _tslib.__assign)({}, imageProps)) : children || finalIconContentChildren);\n    };\n    return IconBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./Icon.types\":\"bSm32\",\"../Image/Image\":\"6yAAQ\",\"../Image/Image.types\":\"47e0t\",\"../../Utilities\":\"2F07a\",\"./FontIcon\":\"hF3SI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bSm32\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"IconType\", ()=>IconType);\nvar IconType;\n(function(IconType1) {\n    /**\n     * Render using the fabric icon font.\n     * @deprecated Icon type is inferred based on presence of `IIconProps.imageProps`\n     */ IconType1[IconType1[\"default\"] = 0] = \"default\";\n    /**\n     * Render using an image, where imageProps would be used.\n     * @deprecated Icon type is inferred based on presence of `IIconProps.imageProps`\n     */ IconType1[IconType1[\"image\"] = 1] = \"image\";\n    /**\n     * Deprecated, use `default`.\n     * @deprecated Use `default`.\n     */ IconType1[IconType1[\"Default\"] = 100000] = \"Default\";\n    /**\n     * Deprecated, use `image`.\n     * @deprecated Use `image`.\n     */ IconType1[IconType1[\"Image\"] = 100001] = \"Image\";\n})(IconType || (IconType = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6yAAQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Image\", ()=>Image);\nvar _utilities = require(\"../../Utilities\");\nvar _imageBase = require(\"./Image.base\");\nvar _imageStyles = require(\"./Image.styles\");\nvar Image = (0, _utilities.styled)((0, _imageBase.ImageBase), (0, _imageStyles.getStyles), undefined, {\n    scope: \"Image\"\n}, true);\n\n},{\"../../Utilities\":\"2F07a\",\"./Image.base\":\"gw8KK\",\"./Image.styles\":\"kGlA9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gw8KK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ImageBase\", ()=>ImageBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _imageTypes = require(\"./Image.types\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar KEY_PREFIX = \"fabricImage\";\nvar ImageBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ImageBase1, _super);\n    function ImageBase1(props) {\n        var _this = _super.call(this, props) || this;\n        // Make an initial assumption about the image layout until we can\n        // check the rendered element. The value here only takes effect when\n        // shouldStartVisible is true.\n        _this._coverStyle = (0, _imageTypes.ImageCoverStyle).portrait;\n        _this._imageElement = _react.createRef();\n        _this._frameElement = _react.createRef();\n        _this._onImageLoaded = function(ev) {\n            var _a = _this.props, src = _a.src, onLoad = _a.onLoad;\n            if (onLoad) onLoad(ev);\n            _this._computeCoverStyle(_this.props);\n            if (src) _this.setState({\n                loadState: (0, _imageTypes.ImageLoadState).loaded\n            });\n        };\n        _this._onImageError = function(ev) {\n            if (_this.props.onError) _this.props.onError(ev);\n            _this.setState({\n                loadState: (0, _imageTypes.ImageLoadState).error\n            });\n        };\n        _this.state = {\n            loadState: (0, _imageTypes.ImageLoadState).notLoaded\n        };\n        return _this;\n    }\n    ImageBase1.prototype.UNSAFE_componentWillReceiveProps = function(nextProps) {\n        if (nextProps.src !== this.props.src) this.setState({\n            loadState: (0, _imageTypes.ImageLoadState).notLoaded\n        });\n        else if (this.state.loadState === (0, _imageTypes.ImageLoadState).loaded) this._computeCoverStyle(nextProps);\n    };\n    ImageBase1.prototype.componentDidUpdate = function(prevProps, prevState) {\n        this._checkImageLoaded();\n        if (this.props.onLoadingStateChange && prevState.loadState !== this.state.loadState) this.props.onLoadingStateChange(this.state.loadState);\n    };\n    ImageBase1.prototype.render = function() {\n        var imageProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.imgProperties), [\n            \"width\",\n            \"height\", \n        ]);\n        var _a = this.props, src = _a.src, alt = _a.alt, width = _a.width, height = _a.height, shouldFadeIn = _a.shouldFadeIn, shouldStartVisible = _a.shouldStartVisible, className = _a.className, imageFit = _a.imageFit, role = _a.role, maximizeFrame = _a.maximizeFrame, styles = _a.styles, theme = _a.theme;\n        var loadState = this.state.loadState;\n        var coverStyle = this.props.coverStyle !== undefined ? this.props.coverStyle : this._coverStyle;\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            width: width,\n            height: height,\n            maximizeFrame: maximizeFrame,\n            shouldFadeIn: shouldFadeIn,\n            shouldStartVisible: shouldStartVisible,\n            isLoaded: loadState === (0, _imageTypes.ImageLoadState).loaded || loadState === (0, _imageTypes.ImageLoadState).notLoaded && this.props.shouldStartVisible,\n            isLandscape: coverStyle === (0, _imageTypes.ImageCoverStyle).landscape,\n            isCenter: imageFit === (0, _imageTypes.ImageFit).center,\n            isCenterContain: imageFit === (0, _imageTypes.ImageFit).centerContain,\n            isCenterCover: imageFit === (0, _imageTypes.ImageFit).centerCover,\n            isContain: imageFit === (0, _imageTypes.ImageFit).contain,\n            isCover: imageFit === (0, _imageTypes.ImageFit).cover,\n            isNone: imageFit === (0, _imageTypes.ImageFit).none,\n            isError: loadState === (0, _imageTypes.ImageLoadState).error,\n            isNotImageFit: imageFit === undefined\n        });\n        // If image dimensions aren't specified, the natural size of the image is used.\n        return _react.createElement(\"div\", {\n            className: classNames.root,\n            style: {\n                width: width,\n                height: height\n            },\n            ref: this._frameElement\n        }, _react.createElement(\"img\", (0, _tslib.__assign)({}, imageProps, {\n            onLoad: this._onImageLoaded,\n            onError: this._onImageError,\n            key: KEY_PREFIX + this.props.src || \"\",\n            className: classNames.image,\n            ref: this._imageElement,\n            src: src,\n            alt: alt,\n            role: role\n        })));\n    };\n    ImageBase1.prototype._checkImageLoaded = function() {\n        var src = this.props.src;\n        var loadState = this.state.loadState;\n        if (loadState === (0, _imageTypes.ImageLoadState).notLoaded) {\n            // testing if naturalWidth and naturalHeight are greater than zero is better than checking\n            // .complete, because .complete will also be set to true if the image breaks. However,\n            // for some browsers, SVG images do not have a naturalWidth or naturalHeight, so fall back\n            // to checking .complete for these images.\n            var isLoaded = this._imageElement.current ? src && this._imageElement.current.naturalWidth > 0 && this._imageElement.current.naturalHeight > 0 || this._imageElement.current.complete && ImageBase1._svgRegex.test(src) : false;\n            if (isLoaded) {\n                this._computeCoverStyle(this.props);\n                this.setState({\n                    loadState: (0, _imageTypes.ImageLoadState).loaded\n                });\n            }\n        }\n    };\n    ImageBase1.prototype._computeCoverStyle = function(props) {\n        var imageFit = props.imageFit, width = props.width, height = props.height;\n        // Do not compute cover style if it was already specified in props\n        if ((imageFit === (0, _imageTypes.ImageFit).cover || imageFit === (0, _imageTypes.ImageFit).contain || imageFit === (0, _imageTypes.ImageFit).centerContain || imageFit === (0, _imageTypes.ImageFit).centerCover) && this.props.coverStyle === undefined && this._imageElement.current && this._frameElement.current) {\n            // Determine the desired ratio using the width and height props.\n            // If those props aren't available, measure measure the frame.\n            var desiredRatio = void 0;\n            if (typeof width === \"number\" && typeof height === \"number\" && imageFit !== (0, _imageTypes.ImageFit).centerContain && imageFit !== (0, _imageTypes.ImageFit).centerCover) desiredRatio = width / height;\n            else desiredRatio = this._frameElement.current.clientWidth / this._frameElement.current.clientHeight;\n            // Examine the source image to determine its original ratio.\n            var naturalRatio = this._imageElement.current.naturalWidth / this._imageElement.current.naturalHeight;\n            // Should we crop from the top or the sides?\n            if (naturalRatio > desiredRatio) this._coverStyle = (0, _imageTypes.ImageCoverStyle).landscape;\n            else this._coverStyle = (0, _imageTypes.ImageCoverStyle).portrait;\n        }\n    };\n    ImageBase1.defaultProps = {\n        shouldFadeIn: true\n    };\n    ImageBase1._svgRegex = /\\.svg$/i;\n    return ImageBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"./Image.types\":\"47e0t\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"47e0t\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ImageFit\", ()=>ImageFit);\nparcelHelpers.export(exports, \"ImageCoverStyle\", ()=>ImageCoverStyle);\nparcelHelpers.export(exports, \"ImageLoadState\", ()=>ImageLoadState);\nvar ImageFit;\n(function(ImageFit1) {\n    /**\n     * The image is not scaled. The image is centered and cropped within the content box.\n     */ ImageFit1[ImageFit1[\"center\"] = 0] = \"center\";\n    /**\n     * The image is scaled to maintain its aspect ratio while being fully contained within the frame. The image will\n     * be centered horizontally and vertically within the frame. The space in the top and bottom or in the sides of\n     * the frame will be empty depending on the difference in aspect ratio between the image and the frame.\n     */ ImageFit1[ImageFit1[\"contain\"] = 1] = \"contain\";\n    /**\n     * The image is scaled to maintain its aspect ratio while filling the frame. Portions of the image will be cropped\n     * from the top and bottom, or the sides, depending on the difference in aspect ratio between the image and the frame.\n     */ ImageFit1[ImageFit1[\"cover\"] = 2] = \"cover\";\n    /**\n     * Neither the image nor the frame are scaled. If their sizes do not match, the image will either be cropped or the\n     * frame will have empty space.\n     */ ImageFit1[ImageFit1[\"none\"] = 3] = \"none\";\n    /**\n     * The image will be centered horizontally and vertically within the frame and maintains its aspect ratio. It will\n     * behave as ImageFit.center if the image's natural height or width is less than the Image frame's height or width,\n     * but if both natural height and width are larger than the frame it will behave as ImageFit.cover.\n     */ ImageFit1[ImageFit1[\"centerCover\"] = 4] = \"centerCover\";\n    /**\n     * The image will be centered horizontally and vertically within the frame and maintains its aspect ratio. It will\n     * behave as ImageFit.center if the image's natural height and width is less than the Image frame's height and width,\n     * but if either natural height or width are larger than the frame it will behave as ImageFit.contain.\n     */ ImageFit1[ImageFit1[\"centerContain\"] = 5] = \"centerContain\";\n})(ImageFit || (ImageFit = {}));\nvar ImageCoverStyle;\n(function(ImageCoverStyle1) {\n    /**\n     * The image will be shown at 100% height of container and the width will be scaled accordingly\n     */ ImageCoverStyle1[ImageCoverStyle1[\"landscape\"] = 0] = \"landscape\";\n    /**\n     * The image will be shown at 100% width of container and the height will be scaled accordingly\n     */ ImageCoverStyle1[ImageCoverStyle1[\"portrait\"] = 1] = \"portrait\";\n})(ImageCoverStyle || (ImageCoverStyle = {}));\nvar ImageLoadState;\n(function(ImageLoadState1) {\n    /**\n     * The image has not yet been loaded, and there is no error yet.\n     */ ImageLoadState1[ImageLoadState1[\"notLoaded\"] = 0] = \"notLoaded\";\n    /**\n     * The image has been loaded successfully.\n     */ ImageLoadState1[ImageLoadState1[\"loaded\"] = 1] = \"loaded\";\n    /**\n     * An error has been encountered while loading the image.\n     */ ImageLoadState1[ImageLoadState1[\"error\"] = 2] = \"error\";\n    /**\n     * Deprecated at v1.3.6, to replace the src in case of errors, use `onLoadingStateChange` instead\n     * and rerender the Image with a difference src.\n     * @deprecated Use `onLoadingStateChange` instead\n     * and rerender the Image with a difference src.\n     */ ImageLoadState1[ImageLoadState1[\"errorLoaded\"] = 3] = \"errorLoaded\";\n})(ImageLoadState || (ImageLoadState = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kGlA9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"../../Utilities\");\nvar GlobalClassNames = {\n    root: \"ms-Image\",\n    rootMaximizeFrame: \"ms-Image--maximizeFrame\",\n    image: \"ms-Image-image\",\n    imageCenter: \"ms-Image-image--center\",\n    imageContain: \"ms-Image-image--contain\",\n    imageCover: \"ms-Image-image--cover\",\n    imageCenterContain: \"ms-Image-image--centerContain\",\n    imageCenterCover: \"ms-Image-image--centerCover\",\n    imageNone: \"ms-Image-image--none\",\n    imageLandscape: \"ms-Image-image--landscape\",\n    imagePortrait: \"ms-Image-image--portrait\"\n};\nvar getStyles = function(props) {\n    var className = props.className, width = props.width, height = props.height, maximizeFrame = props.maximizeFrame, isLoaded = props.isLoaded, shouldFadeIn = props.shouldFadeIn, shouldStartVisible = props.shouldStartVisible, isLandscape = props.isLandscape, isCenter = props.isCenter, isContain = props.isContain, isCover = props.isCover, isCenterContain = props.isCenterContain, isCenterCover = props.isCenterCover, isNone = props.isNone, isError = props.isError, isNotImageFit = props.isNotImageFit, theme = props.theme;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    var ImageFitStyles = {\n        position: \"absolute\",\n        left: \"50% /* @noflip */\",\n        top: \"50%\",\n        transform: \"translate(-50%,-50%)\"\n    };\n    // Cut the mustard using msMaxTouchPoints to detect IE11 which does not support CSS object-fit\n    var window = (0, _utilities.getWindow)();\n    var supportsObjectFit = window !== undefined && window.navigator.msMaxTouchPoints === undefined;\n    var fallbackObjectFitStyles = isContain && isLandscape || isCover && !isLandscape ? {\n        width: \"100%\",\n        height: \"auto\"\n    } : {\n        width: \"auto\",\n        height: \"100%\"\n    };\n    return {\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            {\n                overflow: \"hidden\"\n            },\n            maximizeFrame && [\n                classNames.rootMaximizeFrame,\n                {\n                    height: \"100%\",\n                    width: \"100%\"\n                }, \n            ],\n            isLoaded && shouldFadeIn && !shouldStartVisible && (0, _styling.AnimationClassNames).fadeIn400,\n            (isCenter || isContain || isCover || isCenterContain || isCenterCover) && {\n                position: \"relative\"\n            },\n            className, \n        ],\n        image: [\n            classNames.image,\n            {\n                display: \"block\",\n                opacity: 0\n            },\n            isLoaded && [\n                \"is-loaded\",\n                {\n                    opacity: 1\n                }, \n            ],\n            isCenter && [\n                classNames.imageCenter,\n                ImageFitStyles\n            ],\n            isContain && [\n                classNames.imageContain,\n                supportsObjectFit && {\n                    width: \"100%\",\n                    height: \"100%\",\n                    objectFit: \"contain\"\n                },\n                !supportsObjectFit && fallbackObjectFitStyles,\n                ImageFitStyles, \n            ],\n            isCover && [\n                classNames.imageCover,\n                supportsObjectFit && {\n                    width: \"100%\",\n                    height: \"100%\",\n                    objectFit: \"cover\"\n                },\n                !supportsObjectFit && fallbackObjectFitStyles,\n                ImageFitStyles, \n            ],\n            isCenterContain && [\n                classNames.imageCenterContain,\n                isLandscape && {\n                    maxWidth: \"100%\"\n                },\n                !isLandscape && {\n                    maxHeight: \"100%\"\n                },\n                ImageFitStyles, \n            ],\n            isCenterCover && [\n                classNames.imageCenterCover,\n                isLandscape && {\n                    maxHeight: \"100%\"\n                },\n                !isLandscape && {\n                    maxWidth: \"100%\"\n                },\n                ImageFitStyles, \n            ],\n            isNone && [\n                classNames.imageNone,\n                {\n                    width: \"auto\",\n                    height: \"auto\"\n                }, \n            ],\n            isNotImageFit && [\n                !!width && !height && {\n                    height: \"auto\",\n                    width: \"100%\"\n                },\n                !width && !!height && {\n                    height: \"100%\",\n                    width: \"auto\"\n                },\n                !!width && !!height && {\n                    height: \"100%\",\n                    width: \"100%\"\n                }, \n            ],\n            isLandscape && classNames.imageLandscape,\n            !isLandscape && classNames.imagePortrait,\n            !isLoaded && \"is-notLoaded\",\n            shouldFadeIn && \"is-fadeIn\",\n            isError && \"is-error\", \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7JwBd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _version = require(\"./version\");\nvar _styling = require(\"@uifabric/styling\");\nparcelHelpers.exportAll(_styling, exports);\n\n},{\"./version\":\"5jjJg\",\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ka8xC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _version = require(\"./version\");\n// Ensure theme is initialized when this package is referenced.\nvar _theme = require(\"./styles/theme\");\nvar _index = require(\"./classNames/index\");\nparcelHelpers.exportAll(_index, exports);\nvar _index1 = require(\"./styles/index\");\nparcelHelpers.exportAll(_index1, exports);\nvar _index2 = require(\"./utilities/index\");\nparcelHelpers.exportAll(_index2, exports);\nvar _mergeStyles = require(\"./MergeStyles\");\nparcelHelpers.exportAll(_mergeStyles, exports);\n(0, _theme.initializeThemeInCustomizations)();\n\n},{\"./version\":\"4sFFn\",\"./styles/theme\":\"gKrD3\",\"./classNames/index\":\"hY35q\",\"./styles/index\":\"l8ssX\",\"./utilities/index\":\"lj3oj\",\"./MergeStyles\":\"7FOCK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4sFFn\":[function(require,module,exports) {\n// Do not modify this file; it is generated as part of publish.\n// The checked in version is a placeholder only and will not be updated.\nvar _setVersion = require(\"@uifabric/set-version\");\n(0, _setVersion.setVersion)(\"@uifabric/styling\", \"7.20.1\");\n\n},{\"@uifabric/set-version\":\"896RR\"}],\"gKrD3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createTheme\", ()=>(0, _createTheme.createTheme));\nparcelHelpers.export(exports, \"ThemeSettingName\", ()=>ThemeSettingName);\nparcelHelpers.export(exports, \"initializeThemeInCustomizations\", ()=>initializeThemeInCustomizations);\n/**\n * Gets the theme object\n * @param depComments - Whether to include deprecated tags as comments for deprecated slots.\n */ parcelHelpers.export(exports, \"getTheme\", ()=>getTheme);\n/**\n * Registers a callback that gets called whenever the theme changes.\n * This should only be used when the component cannot automatically get theme changes through its state.\n * This will not register duplicate callbacks.\n */ parcelHelpers.export(exports, \"registerOnThemeChangeCallback\", ()=>registerOnThemeChangeCallback);\n/**\n * See registerOnThemeChangeCallback().\n * Removes previously registered callbacks.\n */ parcelHelpers.export(exports, \"removeOnThemeChangeCallback\", ()=>removeOnThemeChangeCallback);\n/**\n * Applies the theme, while filling in missing slots.\n * @param theme - Partial theme object.\n * @param depComments - Whether to include deprecated tags as comments for deprecated slots.\n */ parcelHelpers.export(exports, \"loadTheme\", ()=>loadTheme);\nvar _tslib = require(\"tslib\");\nvar _utilities = require(\"@uifabric/utilities\");\nvar _loadThemedStyles = require(\"@microsoft/load-themed-styles\");\nvar _createTheme = require(\"@fluentui/theme/lib/createTheme\");\nvar _theme = (0, _createTheme.createTheme)({});\nvar _onThemeChangeCallbacks = [];\nvar ThemeSettingName = \"theme\";\nfunction initializeThemeInCustomizations() {\n    var _a;\n    var _b, _c, _d, _e;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var win = (0, _utilities.getWindow)();\n    if ((_c = (_b = win) === null || _b === void 0 ? void 0 : _b.FabricConfig) === null || _c === void 0 ? void 0 : _c.legacyTheme) // does everything the `else` clause does and more, such as invoke legacy theming\n    loadTheme(win.FabricConfig.legacyTheme);\n    else if (!(0, _utilities.Customizations).getSettings([\n        ThemeSettingName\n    ]).theme) {\n        if ((_e = (_d = win) === null || _d === void 0 ? void 0 : _d.FabricConfig) === null || _e === void 0 ? void 0 : _e.theme) _theme = (0, _createTheme.createTheme)(win.FabricConfig.theme);\n        // Set the default theme.\n        (0, _utilities.Customizations).applySettings((_a = {}, _a[ThemeSettingName] = _theme, _a));\n    }\n}\ninitializeThemeInCustomizations();\nfunction getTheme(depComments) {\n    if (depComments === void 0) depComments = false;\n    if (depComments === true) _theme = (0, _createTheme.createTheme)({}, depComments);\n    return _theme;\n}\nfunction registerOnThemeChangeCallback(callback) {\n    if (_onThemeChangeCallbacks.indexOf(callback) === -1) _onThemeChangeCallbacks.push(callback);\n}\nfunction removeOnThemeChangeCallback(callback) {\n    var i = _onThemeChangeCallbacks.indexOf(callback);\n    if (i === -1) return;\n    _onThemeChangeCallbacks.splice(i, 1);\n}\nfunction loadTheme(theme, depComments) {\n    var _a;\n    if (depComments === void 0) depComments = false;\n    _theme = (0, _createTheme.createTheme)(theme, depComments);\n    // Invoke the legacy method of theming the page as well.\n    (0, _loadThemedStyles.loadTheme)((0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, _theme.palette), _theme.semanticColors), _theme.effects), _loadFonts(_theme)));\n    (0, _utilities.Customizations).applySettings((_a = {}, _a[ThemeSettingName] = _theme, _a));\n    _onThemeChangeCallbacks.forEach(function(callback) {\n        try {\n            callback(_theme);\n        } catch (e) {\n        // don't let a bad callback break everything else\n        }\n    });\n    return _theme;\n}\n/**\n * Loads font variables into a JSON object.\n * @param theme - The theme object\n */ function _loadFonts(theme) {\n    var lines = {};\n    for(var _i = 0, _a = Object.keys(theme.fonts); _i < _a.length; _i++){\n        var fontName = _a[_i];\n        var font = theme.fonts[fontName];\n        for(var _b = 0, _c = Object.keys(font); _b < _c.length; _b++){\n            var propName = _c[_b];\n            var name_1 = fontName + propName.charAt(0).toUpperCase() + propName.slice(1);\n            var value = font[propName];\n            if (propName === \"fontSize\" && typeof value === \"number\") // if it's a number, convert it to px by default like our theming system does\n            value = value + \"px\";\n            lines[name_1] = value;\n        }\n    }\n    return lines;\n}\n\n},{\"tslib\":\"01Tx1\",\"@uifabric/utilities\":\"uTCgd\",\"@microsoft/load-themed-styles\":\"4fkg1\",\"@fluentui/theme/lib/createTheme\":\"ahsvz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4fkg1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load\n * event is fired.\n * @param {string | ThemableArray} styles Themable style text to register.\n * @param {boolean} loadAsync When true, always load styles in async mode, irrespective of current sync mode.\n */ parcelHelpers.export(exports, \"loadStyles\", ()=>loadStyles);\n/**\n * Allows for customizable loadStyles logic. e.g. for server side rendering application\n * @param {(processedStyles: string, rawStyles?: string | ThemableArray) => void}\n * a loadStyles callback that gets called when styles are loaded or reloaded\n */ parcelHelpers.export(exports, \"configureLoadStyles\", ()=>configureLoadStyles);\n/**\n * Configure run mode of load-themable-styles\n * @param mode load-themable-styles run mode, async or sync\n */ parcelHelpers.export(exports, \"configureRunMode\", ()=>configureRunMode);\n/**\n * external code can call flush to synchronously force processing of currently buffered styles\n */ parcelHelpers.export(exports, \"flush\", ()=>flush);\n/**\n * Registers a set theme tokens to find and replace. If styles were already registered, they will be\n * replaced.\n * @param {theme} theme JSON object of theme tokens to values.\n */ parcelHelpers.export(exports, \"loadTheme\", ()=>loadTheme);\n/**\n * Clear already registered style elements and style records in theme_State object\n * @param option - specify which group of registered styles should be cleared.\n * Default to be both themable and non-themable styles will be cleared\n */ parcelHelpers.export(exports, \"clearStyles\", ()=>clearStyles);\n/**\n * Find theme tokens and replaces them with provided theme values.\n * @param {string} styles Tokenized styles to fix.\n */ parcelHelpers.export(exports, \"detokenize\", ()=>detokenize);\n/**\n * Split tokenized CSS into an array of strings and theme specification objects\n * @param {string} styles Tokenized styles to split.\n */ parcelHelpers.export(exports, \"splitStyles\", ()=>splitStyles);\nvar global = arguments[3];\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\nvar __assign = undefined && undefined.__assign || function() {\n    __assign = Object.assign || function(t) {\n        for(var s, i = 1, n = arguments.length; i < n; i++){\n            s = arguments[i];\n            for(var p in s)if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\n// Store the theming state in __themeState__ global scope for reuse in the case of duplicate\n// load-themed-styles hosted on the page.\nvar _root = typeof window === \"undefined\" ? global : window; // eslint-disable-line @typescript-eslint/no-explicit-any\n// Nonce string to inject into script tag if one provided. This is used in CSP (Content Security Policy).\nvar _styleNonce = _root && _root.CSPSettings && _root.CSPSettings.nonce;\nvar _themeState = initializeThemeState();\n/**\n * Matches theming tokens. For example, \"[theme: themeSlotName, default: #FFF]\" (including the quotes).\n */ var _themeTokenRegex = /[\\'\\\"]\\[theme:\\s*(\\w+)\\s*(?:\\,\\s*default:\\s*([\\\\\"\\']?[\\.\\,\\(\\)\\#\\-\\s\\w]*[\\.\\,\\(\\)\\#\\-\\w][\\\"\\']?))?\\s*\\][\\'\\\"]/g;\nvar now = function() {\n    return typeof performance !== \"undefined\" && !!performance.now ? performance.now() : Date.now();\n};\nfunction measure(func) {\n    var start = now();\n    func();\n    var end = now();\n    _themeState.perf.duration += end - start;\n}\n/**\n * initialize global state object\n */ function initializeThemeState() {\n    var state = _root.__themeState__ || {\n        theme: undefined,\n        lastStyleElement: undefined,\n        registeredStyles: []\n    };\n    if (!state.runState) state = __assign(__assign({}, state), {\n        perf: {\n            count: 0,\n            duration: 0\n        },\n        runState: {\n            flushTimer: 0,\n            mode: 0 /* sync */ ,\n            buffer: []\n        }\n    });\n    if (!state.registeredThemableStyles) state = __assign(__assign({}, state), {\n        registeredThemableStyles: []\n    });\n    _root.__themeState__ = state;\n    return state;\n}\nfunction loadStyles(styles, loadAsync) {\n    if (loadAsync === void 0) loadAsync = false;\n    measure(function() {\n        var styleParts = Array.isArray(styles) ? styles : splitStyles(styles);\n        var _a = _themeState.runState, mode = _a.mode, buffer = _a.buffer, flushTimer = _a.flushTimer;\n        if (loadAsync || mode === 1 /* async */ ) {\n            buffer.push(styleParts);\n            if (!flushTimer) _themeState.runState.flushTimer = asyncLoadStyles();\n        } else applyThemableStyles(styleParts);\n    });\n}\nfunction configureLoadStyles(loadStylesFn) {\n    _themeState.loadStyles = loadStylesFn;\n}\nfunction configureRunMode(mode) {\n    _themeState.runState.mode = mode;\n}\nfunction flush() {\n    measure(function() {\n        var styleArrays = _themeState.runState.buffer.slice();\n        _themeState.runState.buffer = [];\n        var mergedStyleArray = [].concat.apply([], styleArrays);\n        if (mergedStyleArray.length > 0) applyThemableStyles(mergedStyleArray);\n    });\n}\n/**\n * register async loadStyles\n */ function asyncLoadStyles() {\n    return setTimeout(function() {\n        _themeState.runState.flushTimer = 0;\n        flush();\n    }, 0);\n}\n/**\n * Loads a set of style text. If it is registered too early, we will register it when the window.load event\n * is fired.\n * @param {string} styleText Style to register.\n * @param {IStyleRecord} styleRecord Existing style record to re-apply.\n */ function applyThemableStyles(stylesArray, styleRecord) {\n    if (_themeState.loadStyles) _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n    else registerStyles(stylesArray);\n}\nfunction loadTheme(theme) {\n    _themeState.theme = theme;\n    // reload styles.\n    reloadStyles();\n}\nfunction clearStyles(option) {\n    if (option === void 0) option = 3 /* all */ ;\n    if (option === 3 /* all */  || option === 2 /* onlyNonThemable */ ) {\n        clearStylesInternal(_themeState.registeredStyles);\n        _themeState.registeredStyles = [];\n    }\n    if (option === 3 /* all */  || option === 1 /* onlyThemable */ ) {\n        clearStylesInternal(_themeState.registeredThemableStyles);\n        _themeState.registeredThemableStyles = [];\n    }\n}\nfunction clearStylesInternal(records) {\n    records.forEach(function(styleRecord) {\n        var styleElement = styleRecord && styleRecord.styleElement;\n        if (styleElement && styleElement.parentElement) styleElement.parentElement.removeChild(styleElement);\n    });\n}\n/**\n * Reloads styles.\n */ function reloadStyles() {\n    if (_themeState.theme) {\n        var themableStyles = [];\n        for(var _i = 0, _a = _themeState.registeredThemableStyles; _i < _a.length; _i++){\n            var styleRecord = _a[_i];\n            themableStyles.push(styleRecord.themableStyle);\n        }\n        if (themableStyles.length > 0) {\n            clearStyles(1 /* onlyThemable */ );\n            applyThemableStyles([].concat.apply([], themableStyles));\n        }\n    }\n}\nfunction detokenize(styles) {\n    if (styles) styles = resolveThemableArray(splitStyles(styles)).styleString;\n    return styles;\n}\n/**\n * Resolves ThemingInstruction objects in an array and joins the result into a string.\n * @param {ThemableArray} splitStyleArray ThemableArray to resolve and join.\n */ function resolveThemableArray(splitStyleArray) {\n    var theme = _themeState.theme;\n    var themable = false;\n    // Resolve the array of theming instructions to an array of strings.\n    // Then join the array to produce the final CSS string.\n    var resolvedArray = (splitStyleArray || []).map(function(currentValue) {\n        var themeSlot = currentValue.theme;\n        if (themeSlot) {\n            themable = true;\n            // A theming annotation. Resolve it.\n            var themedValue = theme ? theme[themeSlot] : undefined;\n            var defaultValue = currentValue.defaultValue || \"inherit\";\n            // Warn to console if we hit an unthemed value even when themes are provided, but only if \"DEBUG\" is true.\n            // Allow the themedValue to be undefined to explicitly request the default value.\n            if (theme && !themedValue && console && !(themeSlot in theme) && typeof DEBUG !== \"undefined\" && DEBUG) console.warn('Theming value not provided for \"'.concat(themeSlot, '\". Falling back to \"').concat(defaultValue, '\".'));\n            return themedValue || defaultValue;\n        } else // A non-themable string. Preserve it.\n        return currentValue.rawString;\n    });\n    return {\n        styleString: resolvedArray.join(\"\"),\n        themable: themable\n    };\n}\nfunction splitStyles(styles) {\n    var result = [];\n    if (styles) {\n        var pos = 0; // Current position in styles.\n        var tokenMatch = void 0;\n        while(tokenMatch = _themeTokenRegex.exec(styles)){\n            var matchIndex = tokenMatch.index;\n            if (matchIndex > pos) result.push({\n                rawString: styles.substring(pos, matchIndex)\n            });\n            result.push({\n                theme: tokenMatch[1],\n                defaultValue: tokenMatch[2] // May be undefined\n            });\n            // index of the first character after the current match\n            pos = _themeTokenRegex.lastIndex;\n        }\n        // Push the rest of the string after the last match.\n        result.push({\n            rawString: styles.substring(pos)\n        });\n    }\n    return result;\n}\n/**\n * Registers a set of style text. If it is registered too early, we will register it when the\n * window.load event is fired.\n * @param {ThemableArray} styleArray Array of IThemingInstruction objects to register.\n * @param {IStyleRecord} styleRecord May specify a style Element to update.\n */ function registerStyles(styleArray) {\n    if (typeof document === \"undefined\") return;\n    var head = document.getElementsByTagName(\"head\")[0];\n    var styleElement = document.createElement(\"style\");\n    var _a = resolveThemableArray(styleArray), styleString = _a.styleString, themable = _a.themable;\n    styleElement.setAttribute(\"data-load-themed-styles\", \"true\");\n    if (_styleNonce) styleElement.setAttribute(\"nonce\", _styleNonce);\n    styleElement.appendChild(document.createTextNode(styleString));\n    _themeState.perf.count++;\n    head.appendChild(styleElement);\n    var ev = document.createEvent(\"HTMLEvents\");\n    ev.initEvent(\"styleinsert\", true, false);\n    ev.args = {\n        newStyle: styleElement\n    };\n    document.dispatchEvent(ev);\n    var record = {\n        styleElement: styleElement,\n        themableStyle: styleArray\n    };\n    if (themable) _themeState.registeredThemableStyles.push(record);\n    else _themeState.registeredStyles.push(record);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ahsvz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Creates a custom theme definition.\n * @param theme - Partial theme object.\n * @param depComments - Whether to include deprecated tags as comments for deprecated slots.\n */ parcelHelpers.export(exports, \"createTheme\", ()=>createTheme);\nvar _index = require(\"./colors/index\");\nvar _index1 = require(\"./effects/index\");\nvar _index2 = require(\"./fonts/index\");\nvar _mergeThemes = require(\"./mergeThemes\");\nvar _index3 = require(\"./spacing/index\");\nvar _makeSemanticColors = require(\"./utilities/makeSemanticColors\");\nfunction createTheme(theme, depComments) {\n    if (theme === void 0) theme = {};\n    if (depComments === void 0) depComments = false;\n    var isInverted = !!theme.isInverted;\n    var baseTheme = {\n        palette: (0, _index.DefaultPalette),\n        effects: (0, _index1.DefaultEffects),\n        fonts: (0, _index2.DefaultFontStyles),\n        spacing: (0, _index3.DefaultSpacing),\n        isInverted: isInverted,\n        disableGlobalClassNames: false,\n        semanticColors: (0, _makeSemanticColors.makeSemanticColors)((0, _index.DefaultPalette), (0, _index1.DefaultEffects), undefined, isInverted, depComments),\n        rtl: undefined\n    };\n    return (0, _mergeThemes.mergeThemes)(baseTheme, theme);\n}\n\n},{\"./colors/index\":\"5dX4A\",\"./effects/index\":\"68AK7\",\"./fonts/index\":\"39ZLm\",\"./mergeThemes\":\"54YSc\",\"./spacing/index\":\"kWRXo\",\"./utilities/makeSemanticColors\":\"7tedZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5dX4A\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DefaultPalette\", ()=>(0, _defaultPalette.DefaultPalette));\nvar _fluentColors = require(\"./FluentColors\");\nparcelHelpers.exportAll(_fluentColors, exports);\nvar _defaultPalette = require(\"./DefaultPalette\");\n\n},{\"./FluentColors\":\"24a9O\",\"./DefaultPalette\":\"bWsdI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"24a9O\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CommunicationColors\", ()=>CommunicationColors);\nparcelHelpers.export(exports, \"NeutralColors\", ()=>NeutralColors);\nparcelHelpers.export(exports, \"SharedColors\", ()=>SharedColors);\nvar CommunicationColors;\n(function(CommunicationColors1) {\n    CommunicationColors1.shade30 = \"#004578\";\n    CommunicationColors1.shade20 = \"#005a9e\";\n    CommunicationColors1.shade10 = \"#106ebe\";\n    CommunicationColors1.primary = \"#0078d4\";\n    CommunicationColors1.tint10 = \"#2b88d8\";\n    CommunicationColors1.tint20 = \"#c7e0f4\";\n    CommunicationColors1.tint30 = \"#deecf9\";\n    CommunicationColors1.tint40 = \"#eff6fc\";\n})(CommunicationColors || (CommunicationColors = {}));\nvar NeutralColors;\n(function(NeutralColors1) {\n    NeutralColors1.black = \"#000000\";\n    NeutralColors1.gray220 = \"#11100f\";\n    NeutralColors1.gray210 = \"#161514\";\n    NeutralColors1.gray200 = \"#1b1a19\";\n    NeutralColors1.gray190 = \"#201f1e\";\n    NeutralColors1.gray180 = \"#252423\";\n    NeutralColors1.gray170 = \"#292827\";\n    NeutralColors1.gray160 = \"#323130\";\n    NeutralColors1.gray150 = \"#3b3a39\";\n    NeutralColors1.gray140 = \"#484644\";\n    NeutralColors1.gray130 = \"#605e5c\";\n    NeutralColors1.gray120 = \"#797775\";\n    NeutralColors1.gray110 = \"#8a8886\";\n    NeutralColors1.gray100 = \"#979593\";\n    NeutralColors1.gray90 = \"#a19f9d\";\n    NeutralColors1.gray80 = \"#b3b0ad\";\n    NeutralColors1.gray70 = \"#bebbb8\";\n    NeutralColors1.gray60 = \"#c8c6c4\";\n    NeutralColors1.gray50 = \"#d2d0ce\";\n    NeutralColors1.gray40 = \"#e1dfdd\";\n    NeutralColors1.gray30 = \"#edebe9\";\n    NeutralColors1.gray20 = \"#f3f2f1\";\n    NeutralColors1.gray10 = \"#faf9f8\";\n    NeutralColors1.white = \"#ffffff\";\n})(NeutralColors || (NeutralColors = {}));\nvar SharedColors;\n(function(SharedColors1) {\n    SharedColors1.pinkRed10 = \"#750b1c\";\n    SharedColors1.red20 = \"#a4262c\";\n    SharedColors1.red10 = \"#d13438\";\n    SharedColors1.redOrange20 = \"#603d30\";\n    SharedColors1.redOrange10 = \"#da3b01\";\n    SharedColors1.orange30 = \"#8e562e\";\n    SharedColors1.orange20 = \"#ca5010\";\n    SharedColors1.orange10 = \"#ffaa44\";\n    SharedColors1.yellow10 = \"#fce100\";\n    SharedColors1.orangeYellow20 = \"#986f0b\";\n    SharedColors1.orangeYellow10 = \"#c19c00\";\n    SharedColors1.yellowGreen10 = \"#8cbd18\";\n    SharedColors1.green20 = \"#0b6a0b\";\n    SharedColors1.green10 = \"#498205\";\n    SharedColors1.greenCyan10 = \"#00ad56\";\n    SharedColors1.cyan40 = \"#005e50\";\n    SharedColors1.cyan30 = \"#005b70\";\n    SharedColors1.cyan20 = \"#038387\";\n    SharedColors1.cyan10 = \"#00b7c3\";\n    SharedColors1.cyanBlue20 = \"#004e8c\";\n    SharedColors1.cyanBlue10 = \"#0078d4\";\n    SharedColors1.blue10 = \"#4f6bed\";\n    SharedColors1.blueMagenta40 = \"#373277\";\n    SharedColors1.blueMagenta30 = \"#5c2e91\";\n    SharedColors1.blueMagenta20 = \"#8764b8\";\n    SharedColors1.blueMagenta10 = \"#8378de\";\n    SharedColors1.magenta20 = \"#881798\";\n    SharedColors1.magenta10 = \"#c239b3\";\n    SharedColors1.magentaPink20 = \"#9b0062\";\n    SharedColors1.magentaPink10 = \"#e3008c\";\n    SharedColors1.gray40 = \"#393939\";\n    SharedColors1.gray30 = \"#7a7574\";\n    SharedColors1.gray20 = \"#69797e\";\n    SharedColors1.gray10 = \"#a0aeb2\";\n})(SharedColors || (SharedColors = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bWsdI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DefaultPalette\", ()=>DefaultPalette);\nvar DefaultPalette = {\n    themeDarker: \"#004578\",\n    themeDark: \"#005a9e\",\n    themeDarkAlt: \"#106ebe\",\n    themePrimary: \"#0078d4\",\n    themeSecondary: \"#2b88d8\",\n    themeTertiary: \"#71afe5\",\n    themeLight: \"#c7e0f4\",\n    themeLighter: \"#deecf9\",\n    themeLighterAlt: \"#eff6fc\",\n    black: \"#000000\",\n    blackTranslucent40: \"rgba(0,0,0,.4)\",\n    neutralDark: \"#201f1e\",\n    neutralPrimary: \"#323130\",\n    neutralPrimaryAlt: \"#3b3a39\",\n    neutralSecondary: \"#605e5c\",\n    neutralSecondaryAlt: \"#8a8886\",\n    neutralTertiary: \"#a19f9d\",\n    neutralTertiaryAlt: \"#c8c6c4\",\n    neutralQuaternary: \"#d2d0ce\",\n    neutralQuaternaryAlt: \"#e1dfdd\",\n    neutralLight: \"#edebe9\",\n    neutralLighter: \"#f3f2f1\",\n    neutralLighterAlt: \"#faf9f8\",\n    accent: \"#0078d4\",\n    white: \"#ffffff\",\n    whiteTranslucent40: \"rgba(255,255,255,.4)\",\n    yellowDark: \"#d29200\",\n    yellow: \"#ffb900\",\n    yellowLight: \"#fff100\",\n    orange: \"#d83b01\",\n    orangeLight: \"#ea4300\",\n    orangeLighter: \"#ff8c00\",\n    redDark: \"#a4262c\",\n    red: \"#e81123\",\n    magentaDark: \"#5c005c\",\n    magenta: \"#b4009e\",\n    magentaLight: \"#e3008c\",\n    purpleDark: \"#32145a\",\n    purple: \"#5c2d91\",\n    purpleLight: \"#b4a0ff\",\n    blueDark: \"#002050\",\n    blueMid: \"#00188f\",\n    blue: \"#0078d4\",\n    blueLight: \"#00bcf2\",\n    tealDark: \"#004b50\",\n    teal: \"#008272\",\n    tealLight: \"#00b294\",\n    greenDark: \"#004b1c\",\n    green: \"#107c10\",\n    greenLight: \"#bad80a\"\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"68AK7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DefaultEffects\", ()=>(0, _defaultEffects.DefaultEffects));\nparcelHelpers.export(exports, \"Depths\", ()=>(0, _fluentDepths.Depths));\nvar _defaultEffects = require(\"./DefaultEffects\");\nvar _fluentDepths = require(\"./FluentDepths\");\n\n},{\"./DefaultEffects\":\"8t0Wc\",\"./FluentDepths\":\"7Al1W\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8t0Wc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DefaultEffects\", ()=>DefaultEffects);\nvar _fluentDepths = require(\"./FluentDepths\");\nvar DefaultEffects = {\n    elevation4: (0, _fluentDepths.Depths).depth4,\n    elevation8: (0, _fluentDepths.Depths).depth8,\n    elevation16: (0, _fluentDepths.Depths).depth16,\n    elevation64: (0, _fluentDepths.Depths).depth64,\n    roundedCorner2: \"2px\",\n    roundedCorner4: \"4px\",\n    roundedCorner6: \"6px\"\n};\n\n},{\"./FluentDepths\":\"7Al1W\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Al1W\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Depths\", ()=>Depths);\nvar Depths;\n(function(Depths1) {\n    Depths1.depth0 = \"0 0 0 0 transparent\";\n    Depths1.depth4 = \"0 1.6px 3.6px 0 rgba(0, 0, 0, 0.132), 0 0.3px 0.9px 0 rgba(0, 0, 0, 0.108)\";\n    Depths1.depth8 = \"0 3.2px 7.2px 0 rgba(0, 0, 0, 0.132), 0 0.6px 1.8px 0 rgba(0, 0, 0, 0.108)\";\n    Depths1.depth16 = \"0 6.4px 14.4px 0 rgba(0, 0, 0, 0.132), 0 1.2px 3.6px 0 rgba(0, 0, 0, 0.108)\";\n    Depths1.depth64 = \"0 25.6px 57.6px 0 rgba(0, 0, 0, 0.22), 0 4.8px 14.4px 0 rgba(0, 0, 0, 0.18)\";\n})(Depths || (Depths = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"39ZLm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createFontStyles\", ()=>(0, _createFontStyles.createFontStyles));\nparcelHelpers.export(exports, \"DefaultFontStyles\", ()=>(0, _defaultFontStyles.DefaultFontStyles));\nparcelHelpers.export(exports, \"registerDefaultFontFaces\", ()=>(0, _defaultFontStyles.registerDefaultFontFaces));\nvar _fluentFonts = require(\"./FluentFonts\");\nparcelHelpers.exportAll(_fluentFonts, exports);\nvar _createFontStyles = require(\"./createFontStyles\");\nvar _defaultFontStyles = require(\"./DefaultFontStyles\");\n\n},{\"./FluentFonts\":\"ckOmc\",\"./createFontStyles\":\"aaZ2d\",\"./DefaultFontStyles\":\"92iYH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ckOmc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LocalizedFontNames\", ()=>LocalizedFontNames);\nparcelHelpers.export(exports, \"LocalizedFontFamilies\", ()=>LocalizedFontFamilies);\nparcelHelpers.export(exports, \"FontSizes\", ()=>FontSizes);\nparcelHelpers.export(exports, \"FontWeights\", ()=>FontWeights);\nparcelHelpers.export(exports, \"IconFontSizes\", ()=>IconFontSizes);\nvar LocalizedFontNames;\n(function(LocalizedFontNames1) {\n    LocalizedFontNames1.Arabic = \"Segoe UI Web (Arabic)\";\n    LocalizedFontNames1.Cyrillic = \"Segoe UI Web (Cyrillic)\";\n    LocalizedFontNames1.EastEuropean = \"Segoe UI Web (East European)\";\n    LocalizedFontNames1.Greek = \"Segoe UI Web (Greek)\";\n    LocalizedFontNames1.Hebrew = \"Segoe UI Web (Hebrew)\";\n    LocalizedFontNames1.Thai = \"Leelawadee UI Web\";\n    LocalizedFontNames1.Vietnamese = \"Segoe UI Web (Vietnamese)\";\n    LocalizedFontNames1.WestEuropean = \"Segoe UI Web (West European)\";\n    LocalizedFontNames1.Selawik = \"Selawik Web\";\n    LocalizedFontNames1.Armenian = \"Segoe UI Web (Armenian)\";\n    LocalizedFontNames1.Georgian = \"Segoe UI Web (Georgian)\";\n})(LocalizedFontNames || (LocalizedFontNames = {}));\nvar LocalizedFontFamilies;\n(function(LocalizedFontFamilies1) {\n    LocalizedFontFamilies1.Arabic = \"'\" + LocalizedFontNames.Arabic + \"'\";\n    LocalizedFontFamilies1.ChineseSimplified = \"'Microsoft Yahei UI', Verdana, Simsun\";\n    LocalizedFontFamilies1.ChineseTraditional = \"'Microsoft Jhenghei UI', Pmingliu\";\n    LocalizedFontFamilies1.Cyrillic = \"'\" + LocalizedFontNames.Cyrillic + \"'\";\n    LocalizedFontFamilies1.EastEuropean = \"'\" + LocalizedFontNames.EastEuropean + \"'\";\n    LocalizedFontFamilies1.Greek = \"'\" + LocalizedFontNames.Greek + \"'\";\n    LocalizedFontFamilies1.Hebrew = \"'\" + LocalizedFontNames.Hebrew + \"'\";\n    LocalizedFontFamilies1.Hindi = \"'Nirmala UI'\";\n    LocalizedFontFamilies1.Japanese = \"'Yu Gothic UI', 'Meiryo UI', Meiryo, 'MS Pgothic', Osaka\";\n    LocalizedFontFamilies1.Korean = \"'Malgun Gothic', Gulim\";\n    LocalizedFontFamilies1.Selawik = \"'\" + LocalizedFontNames.Selawik + \"'\";\n    LocalizedFontFamilies1.Thai = \"'Leelawadee UI Web', 'Kmer UI'\";\n    LocalizedFontFamilies1.Vietnamese = \"'\" + LocalizedFontNames.Vietnamese + \"'\";\n    LocalizedFontFamilies1.WestEuropean = \"'\" + LocalizedFontNames.WestEuropean + \"'\";\n    LocalizedFontFamilies1.Armenian = \"'\" + LocalizedFontNames.Armenian + \"'\";\n    LocalizedFontFamilies1.Georgian = \"'\" + LocalizedFontNames.Georgian + \"'\";\n})(LocalizedFontFamilies || (LocalizedFontFamilies = {}));\nvar FontSizes;\n(function(FontSizes1) {\n    FontSizes1.size10 = \"10px\";\n    FontSizes1.size12 = \"12px\";\n    FontSizes1.size14 = \"14px\";\n    FontSizes1.size16 = \"16px\";\n    FontSizes1.size18 = \"18px\";\n    FontSizes1.size20 = \"20px\";\n    FontSizes1.size24 = \"24px\";\n    FontSizes1.size28 = \"28px\";\n    FontSizes1.size32 = \"32px\";\n    FontSizes1.size42 = \"42px\";\n    FontSizes1.size68 = \"68px\";\n    FontSizes1.mini = \"10px\";\n    FontSizes1.xSmall = \"10px\";\n    FontSizes1.small = \"12px\";\n    FontSizes1.smallPlus = \"12px\";\n    FontSizes1.medium = \"14px\";\n    FontSizes1.mediumPlus = \"16px\";\n    FontSizes1.icon = \"16px\";\n    FontSizes1.large = \"18px\";\n    FontSizes1.xLarge = \"20px\";\n    FontSizes1.xLargePlus = \"24px\";\n    FontSizes1.xxLarge = \"28px\";\n    FontSizes1.xxLargePlus = \"32px\";\n    FontSizes1.superLarge = \"42px\";\n    FontSizes1.mega = \"68px\";\n})(FontSizes || (FontSizes = {}));\nvar FontWeights;\n(function(FontWeights1) {\n    FontWeights1.light = 100;\n    FontWeights1.semilight = 300;\n    FontWeights1.regular = 400;\n    FontWeights1.semibold = 600;\n    FontWeights1.bold = 700;\n})(FontWeights || (FontWeights = {}));\nvar IconFontSizes;\n(function(IconFontSizes1) {\n    IconFontSizes1.xSmall = \"10px\";\n    IconFontSizes1.small = \"12px\";\n    IconFontSizes1.medium = \"16px\";\n    IconFontSizes1.large = \"20px\";\n})(IconFontSizes || (IconFontSizes = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aaZ2d\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createFontStyles\", ()=>createFontStyles);\nvar _fluentFonts = require(\"./FluentFonts\");\n// Fallback fonts, if specified system or web fonts are unavailable.\nvar FontFamilyFallbacks = \"'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif\";\n// By default, we favor system fonts for the default.\n// All localized fonts use a web font and never use the system font.\nvar defaultFontFamily = \"'Segoe UI', '\" + (0, _fluentFonts.LocalizedFontNames).WestEuropean + \"'\";\n// Mapping of language prefix to to font family.\nvar LanguageToFontMap = {\n    ar: (0, _fluentFonts.LocalizedFontFamilies).Arabic,\n    bg: (0, _fluentFonts.LocalizedFontFamilies).Cyrillic,\n    cs: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    el: (0, _fluentFonts.LocalizedFontFamilies).Greek,\n    et: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    he: (0, _fluentFonts.LocalizedFontFamilies).Hebrew,\n    hi: (0, _fluentFonts.LocalizedFontFamilies).Hindi,\n    hr: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    hu: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    ja: (0, _fluentFonts.LocalizedFontFamilies).Japanese,\n    kk: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    ko: (0, _fluentFonts.LocalizedFontFamilies).Korean,\n    lt: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    lv: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    pl: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    ru: (0, _fluentFonts.LocalizedFontFamilies).Cyrillic,\n    sk: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    \"sr-latn\": (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    th: (0, _fluentFonts.LocalizedFontFamilies).Thai,\n    tr: (0, _fluentFonts.LocalizedFontFamilies).EastEuropean,\n    uk: (0, _fluentFonts.LocalizedFontFamilies).Cyrillic,\n    vi: (0, _fluentFonts.LocalizedFontFamilies).Vietnamese,\n    \"zh-hans\": (0, _fluentFonts.LocalizedFontFamilies).ChineseSimplified,\n    \"zh-hant\": (0, _fluentFonts.LocalizedFontFamilies).ChineseTraditional,\n    hy: (0, _fluentFonts.LocalizedFontFamilies).Armenian,\n    ka: (0, _fluentFonts.LocalizedFontFamilies).Georgian\n};\nfunction _fontFamilyWithFallbacks(fontFamily) {\n    return fontFamily + \", \" + FontFamilyFallbacks;\n}\n/**\n * If there is a localized font for this language, return that.\n * Returns undefined if there is no localized font for that language.\n */ function _getLocalizedFontFamily(language) {\n    for(var lang in LanguageToFontMap){\n        if (LanguageToFontMap.hasOwnProperty(lang) && language && lang.indexOf(language) === 0) // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return LanguageToFontMap[lang];\n    }\n    return defaultFontFamily;\n}\nfunction _createFont(size, weight, fontFamily) {\n    return {\n        fontFamily: fontFamily,\n        MozOsxFontSmoothing: \"grayscale\",\n        WebkitFontSmoothing: \"antialiased\",\n        fontSize: size,\n        fontWeight: weight\n    };\n}\nfunction createFontStyles(localeCode) {\n    var localizedFont = _getLocalizedFontFamily(localeCode);\n    var fontFamilyWithFallback = _fontFamilyWithFallbacks(localizedFont);\n    var fontStyles = {\n        tiny: _createFont((0, _fluentFonts.FontSizes).mini, (0, _fluentFonts.FontWeights).regular, fontFamilyWithFallback),\n        xSmall: _createFont((0, _fluentFonts.FontSizes).xSmall, (0, _fluentFonts.FontWeights).regular, fontFamilyWithFallback),\n        small: _createFont((0, _fluentFonts.FontSizes).small, (0, _fluentFonts.FontWeights).regular, fontFamilyWithFallback),\n        smallPlus: _createFont((0, _fluentFonts.FontSizes).smallPlus, (0, _fluentFonts.FontWeights).regular, fontFamilyWithFallback),\n        medium: _createFont((0, _fluentFonts.FontSizes).medium, (0, _fluentFonts.FontWeights).regular, fontFamilyWithFallback),\n        mediumPlus: _createFont((0, _fluentFonts.FontSizes).mediumPlus, (0, _fluentFonts.FontWeights).regular, fontFamilyWithFallback),\n        large: _createFont((0, _fluentFonts.FontSizes).large, (0, _fluentFonts.FontWeights).regular, fontFamilyWithFallback),\n        xLarge: _createFont((0, _fluentFonts.FontSizes).xLarge, (0, _fluentFonts.FontWeights).semibold, fontFamilyWithFallback),\n        xLargePlus: _createFont((0, _fluentFonts.FontSizes).xLargePlus, (0, _fluentFonts.FontWeights).semibold, fontFamilyWithFallback),\n        xxLarge: _createFont((0, _fluentFonts.FontSizes).xxLarge, (0, _fluentFonts.FontWeights).semibold, fontFamilyWithFallback),\n        xxLargePlus: _createFont((0, _fluentFonts.FontSizes).xxLargePlus, (0, _fluentFonts.FontWeights).semibold, fontFamilyWithFallback),\n        superLarge: _createFont((0, _fluentFonts.FontSizes).superLarge, (0, _fluentFonts.FontWeights).semibold, fontFamilyWithFallback),\n        mega: _createFont((0, _fluentFonts.FontSizes).mega, (0, _fluentFonts.FontWeights).semibold, fontFamilyWithFallback)\n    };\n    return fontStyles;\n}\n\n},{\"./FluentFonts\":\"ckOmc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"92iYH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DefaultFontStyles\", ()=>DefaultFontStyles);\nparcelHelpers.export(exports, \"registerDefaultFontFaces\", ()=>registerDefaultFontFaces);\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _fluentFonts = require(\"./FluentFonts\");\nvar _createFontStyles = require(\"./createFontStyles\");\nvar _utilities = require(\"@uifabric/utilities\");\n// Default urls.\nvar DefaultBaseUrl = \"https://static2.sharepointonline.com/files/fabric/assets\";\nvar DefaultFontStyles = (0, _createFontStyles.createFontStyles)((0, _utilities.getLanguage)(\"sessionStorage\"));\nfunction _registerFontFace(fontFamily, url, fontWeight, localFontName) {\n    fontFamily = \"'\" + fontFamily + \"'\";\n    var localFontSrc = localFontName !== undefined ? \"local('\" + localFontName + \"'),\" : \"\";\n    (0, _mergeStyles.fontFace)({\n        fontFamily: fontFamily,\n        src: localFontSrc + (\"url('\" + url + \".woff2') format('woff2'),\") + (\"url('\" + url + \".woff') format('woff')\"),\n        fontWeight: fontWeight,\n        fontStyle: \"normal\",\n        fontDisplay: \"swap\"\n    });\n}\nfunction _registerFontFaceSet(baseUrl, fontFamily, cdnFolder, cdnFontName, localFontName) {\n    if (cdnFontName === void 0) cdnFontName = \"segoeui\";\n    var urlBase = baseUrl + \"/\" + cdnFolder + \"/\" + cdnFontName;\n    _registerFontFace(fontFamily, urlBase + \"-light\", (0, _fluentFonts.FontWeights).light, localFontName && localFontName + \" Light\");\n    _registerFontFace(fontFamily, urlBase + \"-semilight\", (0, _fluentFonts.FontWeights).semilight, localFontName && localFontName + \" SemiLight\");\n    _registerFontFace(fontFamily, urlBase + \"-regular\", (0, _fluentFonts.FontWeights).regular, localFontName);\n    _registerFontFace(fontFamily, urlBase + \"-semibold\", (0, _fluentFonts.FontWeights).semibold, localFontName && localFontName + \" SemiBold\");\n    _registerFontFace(fontFamily, urlBase + \"-bold\", (0, _fluentFonts.FontWeights).bold, localFontName && localFontName + \" Bold\");\n}\nfunction registerDefaultFontFaces(baseUrl) {\n    if (baseUrl) {\n        var fontUrl = baseUrl + \"/fonts\";\n        // Produce @font-face definitions for all supported web fonts.\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).Thai, \"leelawadeeui-thai\", \"leelawadeeui\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).Arabic, \"segoeui-arabic\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).Cyrillic, \"segoeui-cyrillic\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).EastEuropean, \"segoeui-easteuropean\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).Greek, \"segoeui-greek\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).Hebrew, \"segoeui-hebrew\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).Vietnamese, \"segoeui-vietnamese\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).WestEuropean, \"segoeui-westeuropean\", \"segoeui\", \"Segoe UI\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontFamilies).Selawik, \"selawik\", \"selawik\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).Armenian, \"segoeui-armenian\");\n        _registerFontFaceSet(fontUrl, (0, _fluentFonts.LocalizedFontNames).Georgian, \"segoeui-georgian\");\n        // Leelawadee UI (Thai) does not have a 'light' weight, so we override\n        // the font-face generated above to use the 'semilight' weight instead.\n        _registerFontFace(\"Leelawadee UI Web\", fontUrl + \"/leelawadeeui-thai/leelawadeeui-semilight\", (0, _fluentFonts.FontWeights).light);\n        // Leelawadee UI (Thai) does not have a 'semibold' weight, so we override\n        // the font-face generated above to use the 'bold' weight instead.\n        _registerFontFace(\"Leelawadee UI Web\", fontUrl + \"/leelawadeeui-thai/leelawadeeui-bold\", (0, _fluentFonts.FontWeights).semibold);\n    }\n}\n/**\n * Reads the fontBaseUrl from window.FabricConfig.fontBaseUrl or falls back to a default.\n */ function _getFontBaseUrl() {\n    var _a, _b, _c;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    var fabricConfig = (_a = (0, _utilities.getWindow)()) === null || _a === void 0 ? void 0 : _a.FabricConfig;\n    return _c = (_b = fabricConfig) === null || _b === void 0 ? void 0 : _b.fontBaseUrl, _c !== null && _c !== void 0 ? _c : DefaultBaseUrl;\n}\n/**\n * Register the font faces.\n */ registerDefaultFontFaces(_getFontBaseUrl());\n\n},{\"@uifabric/merge-styles\":\"7c43M\",\"./FluentFonts\":\"ckOmc\",\"./createFontStyles\":\"aaZ2d\",\"@uifabric/utilities\":\"uTCgd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"54YSc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Merge a partial/full theme into a full theme and returns a merged full theme.\n */ parcelHelpers.export(exports, \"mergeThemes\", ()=>mergeThemes);\nvar _utilities = require(\"@uifabric/utilities\");\nvar _makeSemanticColors = require(\"./utilities/makeSemanticColors\");\nfunction mergeThemes(theme, partialTheme) {\n    if (partialTheme === void 0) partialTheme = {};\n    var _a, _b, _c, _d;\n    var mergedTheme = (0, _utilities.merge)({}, theme, partialTheme, {\n        semanticColors: (0, _makeSemanticColors.getSemanticColors)(partialTheme.palette, partialTheme.effects, partialTheme.semanticColors, partialTheme.isInverted === undefined ? theme.isInverted : partialTheme.isInverted)\n    });\n    if (((_a = partialTheme.palette) === null || _a === void 0 ? void 0 : _a.themePrimary) && !((_b = partialTheme.palette) === null || _b === void 0 ? void 0 : _b.accent)) mergedTheme.palette.accent = partialTheme.palette.themePrimary;\n    if (partialTheme.defaultFontStyle) for(var _i = 0, _e = Object.keys(mergedTheme.fonts); _i < _e.length; _i++){\n        var fontStyle = _e[_i];\n        mergedTheme.fonts[fontStyle] = (0, _utilities.merge)(mergedTheme.fonts[fontStyle], partialTheme.defaultFontStyle, (_d = (_c = partialTheme) === null || _c === void 0 ? void 0 : _c.fonts) === null || _d === void 0 ? void 0 : _d[fontStyle]);\n    }\n    if (partialTheme.stylesheets) mergedTheme.stylesheets = (theme.stylesheets || []).concat(partialTheme.stylesheets);\n    return mergedTheme;\n}\n\n},{\"@uifabric/utilities\":\"uTCgd\",\"./utilities/makeSemanticColors\":\"7tedZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7tedZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/** Generates all the semantic slot colors based on the theme so far\n * We'll use these as fallbacks for semantic slots that the passed in theme did not define.\n * The caller must still mix in the customized semantic slots at the end.\n */ parcelHelpers.export(exports, \"makeSemanticColors\", ()=>makeSemanticColors);\n/**\n * Map partial platte and effects to partial semantic colors.\n */ parcelHelpers.export(exports, \"getSemanticColors\", ()=>getSemanticColors);\nvar _tslib = require(\"tslib\");\nfunction makeSemanticColors(p, e, s, isInverted, depComments) {\n    if (depComments === void 0) depComments = false;\n    var semanticColors = (0, _tslib.__assign)({\n        primaryButtonBorder: \"transparent\",\n        errorText: !isInverted ? \"#a4262c\" : \"#F1707B\",\n        messageText: !isInverted ? \"#323130\" : \"#F3F2F1\",\n        messageLink: !isInverted ? \"#005A9E\" : \"#6CB8F6\",\n        messageLinkHovered: !isInverted ? \"#004578\" : \"#82C7FF\",\n        infoIcon: !isInverted ? \"#605e5c\" : \"#C8C6C4\",\n        errorIcon: !isInverted ? \"#A80000\" : \"#F1707B\",\n        blockingIcon: !isInverted ? \"#FDE7E9\" : \"#442726\",\n        warningIcon: !isInverted ? \"#797775\" : \"#C8C6C4\",\n        severeWarningIcon: !isInverted ? \"#D83B01\" : \"#FCE100\",\n        successIcon: !isInverted ? \"#107C10\" : \"#92C353\",\n        infoBackground: !isInverted ? \"#f3f2f1\" : \"#323130\",\n        errorBackground: !isInverted ? \"#FDE7E9\" : \"#442726\",\n        blockingBackground: !isInverted ? \"#FDE7E9\" : \"#442726\",\n        warningBackground: !isInverted ? \"#FFF4CE\" : \"#433519\",\n        severeWarningBackground: !isInverted ? \"#FED9CC\" : \"#4F2A0F\",\n        successBackground: !isInverted ? \"#DFF6DD\" : \"#393D1B\",\n        // deprecated\n        warningHighlight: !isInverted ? \"#ffb900\" : \"#fff100\",\n        successText: !isInverted ? \"#107C10\" : \"#92c353\"\n    }, s);\n    var fullSemanticColors = getSemanticColors(p, e, semanticColors, isInverted);\n    return _fixDeprecatedSlots(fullSemanticColors, depComments);\n}\nfunction getSemanticColors(p, e, s, isInverted, depComments) {\n    if (depComments === void 0) depComments = false;\n    var _a, _b, _c;\n    var result = {};\n    // map palette\n    var _d = p || {}, white = _d.white, black = _d.black, themePrimary = _d.themePrimary, themeDark = _d.themeDark, themeDarker = _d.themeDarker, themeDarkAlt = _d.themeDarkAlt, themeLighter = _d.themeLighter, neutralLight = _d.neutralLight, neutralLighter = _d.neutralLighter, neutralDark = _d.neutralDark, neutralQuaternary = _d.neutralQuaternary, neutralQuaternaryAlt = _d.neutralQuaternaryAlt, neutralPrimary = _d.neutralPrimary, neutralSecondary = _d.neutralSecondary, neutralSecondaryAlt = _d.neutralSecondaryAlt, neutralTertiary = _d.neutralTertiary, neutralTertiaryAlt = _d.neutralTertiaryAlt, neutralLighterAlt = _d.neutralLighterAlt, accent = _d.accent;\n    if (white) {\n        result.bodyBackground = white;\n        result.bodyFrameBackground = white;\n        result.accentButtonText = white;\n        result.buttonBackground = white;\n        result.primaryButtonText = white;\n        result.primaryButtonTextHovered = white;\n        result.primaryButtonTextPressed = white;\n        result.inputBackground = white;\n        result.inputForegroundChecked = white;\n        result.listBackground = white;\n        result.menuBackground = white;\n        result.cardStandoutBackground = white;\n    }\n    if (black) {\n        result.bodyTextChecked = black;\n        result.buttonTextCheckedHovered = black;\n    }\n    if (themePrimary) {\n        result.link = themePrimary;\n        result.primaryButtonBackground = themePrimary;\n        result.inputBackgroundChecked = themePrimary;\n        result.inputIcon = themePrimary;\n        result.inputFocusBorderAlt = themePrimary;\n        result.menuIcon = themePrimary;\n        result.menuHeader = themePrimary;\n        result.accentButtonBackground = themePrimary;\n    }\n    if (themeDark) {\n        result.primaryButtonBackgroundPressed = themeDark;\n        result.inputBackgroundCheckedHovered = themeDark;\n        result.inputIconHovered = themeDark;\n    }\n    if (themeDarker) result.linkHovered = themeDarker;\n    if (themeDarkAlt) result.primaryButtonBackgroundHovered = themeDarkAlt;\n    if (themeLighter) result.inputPlaceholderBackgroundChecked = themeLighter;\n    if (neutralLight) {\n        result.bodyBackgroundChecked = neutralLight;\n        result.bodyFrameDivider = neutralLight;\n        result.bodyDivider = neutralLight;\n        result.variantBorder = neutralLight;\n        result.buttonBackgroundCheckedHovered = neutralLight;\n        result.buttonBackgroundPressed = neutralLight;\n        result.listItemBackgroundChecked = neutralLight;\n        result.listHeaderBackgroundPressed = neutralLight;\n        result.menuItemBackgroundPressed = neutralLight;\n        // eslint-disable-next-line deprecation/deprecation\n        result.menuItemBackgroundChecked = neutralLight;\n    }\n    if (neutralLighter) {\n        result.bodyBackgroundHovered = neutralLighter;\n        result.buttonBackgroundHovered = neutralLighter;\n        result.buttonBackgroundDisabled = neutralLighter;\n        result.buttonBorderDisabled = neutralLighter;\n        result.primaryButtonBackgroundDisabled = neutralLighter;\n        result.disabledBackground = neutralLighter;\n        result.listItemBackgroundHovered = neutralLighter;\n        result.listHeaderBackgroundHovered = neutralLighter;\n        result.menuItemBackgroundHovered = neutralLighter;\n    }\n    if (neutralQuaternary) {\n        result.primaryButtonTextDisabled = neutralQuaternary;\n        result.disabledSubtext = neutralQuaternary;\n    }\n    if (neutralQuaternaryAlt) result.listItemBackgroundCheckedHovered = neutralQuaternaryAlt;\n    if (neutralTertiary) {\n        result.disabledBodyText = neutralTertiary;\n        result.variantBorderHovered = ((_a = s) === null || _a === void 0 ? void 0 : _a.variantBorderHovered) || neutralTertiary;\n        result.buttonTextDisabled = neutralTertiary;\n        result.inputIconDisabled = neutralTertiary;\n        result.disabledText = neutralTertiary;\n    }\n    if (neutralPrimary) {\n        result.bodyText = neutralPrimary;\n        result.actionLink = neutralPrimary;\n        result.buttonText = neutralPrimary;\n        result.inputBorderHovered = neutralPrimary;\n        result.inputText = neutralPrimary;\n        result.listText = neutralPrimary;\n        result.menuItemText = neutralPrimary;\n    }\n    if (neutralLighterAlt) {\n        result.bodyStandoutBackground = neutralLighterAlt;\n        result.defaultStateBackground = neutralLighterAlt;\n    }\n    if (neutralDark) {\n        result.actionLinkHovered = neutralDark;\n        result.buttonTextHovered = neutralDark;\n        result.buttonTextChecked = neutralDark;\n        result.buttonTextPressed = neutralDark;\n        result.inputTextHovered = neutralDark;\n        result.menuItemTextHovered = neutralDark;\n    }\n    if (neutralSecondary) {\n        result.bodySubtext = neutralSecondary;\n        result.focusBorder = neutralSecondary;\n        result.inputBorder = neutralSecondary;\n        result.smallInputBorder = neutralSecondary;\n        result.inputPlaceholderText = neutralSecondary;\n    }\n    if (neutralSecondaryAlt) result.buttonBorder = neutralSecondaryAlt;\n    if (neutralTertiaryAlt) {\n        result.disabledBodySubtext = neutralTertiaryAlt;\n        result.disabledBorder = neutralTertiaryAlt;\n        result.buttonBackgroundChecked = neutralTertiaryAlt;\n        result.menuDivider = neutralTertiaryAlt;\n    }\n    if (accent) result.accentButtonBackground = accent;\n    // map effects\n    if ((_b = e) === null || _b === void 0 ? void 0 : _b.elevation4) result.cardShadow = e.elevation4;\n    if (!isInverted && ((_c = e) === null || _c === void 0 ? void 0 : _c.elevation8)) result.cardShadowHovered = e.elevation8;\n    else if (result.variantBorderHovered) result.cardShadowHovered = \"0 0 1px \" + result.variantBorderHovered;\n    result = (0, _tslib.__assign)((0, _tslib.__assign)({}, result), s);\n    return result;\n}\nfunction _fixDeprecatedSlots(s, depComments) {\n    // Add @deprecated tag as comment if enabled\n    var dep = \"\";\n    if (depComments === true) dep = \" /* @deprecated */\";\n    /* eslint-disable deprecation/deprecation */ s.listTextColor = s.listText + dep;\n    s.menuItemBackgroundChecked += dep;\n    s.warningHighlight += dep;\n    s.warningText = s.messageText + dep;\n    s.successText += dep;\n    /* eslint-enable deprecation/deprecation */ return s;\n}\n\n},{\"tslib\":\"01Tx1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kWRXo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DefaultSpacing\", ()=>(0, _defaultSpacing.DefaultSpacing));\nvar _defaultSpacing = require(\"./DefaultSpacing\");\n\n},{\"./DefaultSpacing\":\"Kv811\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Kv811\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DefaultSpacing\", ()=>DefaultSpacing);\nvar DefaultSpacing = {\n    s2: \"4px\",\n    s1: \"8px\",\n    m: \"16px\",\n    l1: \"20px\",\n    l2: \"32px\"\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hY35q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AnimationClassNames\", ()=>(0, _animationClassNames.AnimationClassNames));\nparcelHelpers.export(exports, \"FontClassNames\", ()=>(0, _fontClassNames.FontClassNames));\nparcelHelpers.export(exports, \"ColorClassNames\", ()=>(0, _colorClassNames.ColorClassNames));\nvar _animationClassNames = require(\"./AnimationClassNames\");\nvar _fontClassNames = require(\"./FontClassNames\");\nvar _colorClassNames = require(\"./ColorClassNames\");\n\n},{\"./AnimationClassNames\":\"e7Jfm\",\"./FontClassNames\":\"5LcJN\",\"./ColorClassNames\":\"fSJQC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e7Jfm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AnimationClassNames\", ()=>AnimationClassNames);\nvar _index = require(\"../utilities/index\");\nvar _index1 = require(\"../styles/index\");\nvar AnimationClassNames = (0, _index.buildClassMap)((0, _index1.AnimationStyles));\n\n},{\"../utilities/index\":\"lj3oj\",\"../styles/index\":\"l8ssX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lj3oj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"buildClassMap\", ()=>(0, _buildClassMap.buildClassMap));\nparcelHelpers.export(exports, \"getIcon\", ()=>(0, _icons.getIcon));\nparcelHelpers.export(exports, \"registerIcons\", ()=>(0, _icons.registerIcons));\nparcelHelpers.export(exports, \"registerIconAlias\", ()=>(0, _icons.registerIconAlias));\nparcelHelpers.export(exports, \"unregisterIcons\", ()=>(0, _icons.unregisterIcons));\nparcelHelpers.export(exports, \"setIconOptions\", ()=>(0, _icons.setIconOptions));\nparcelHelpers.export(exports, \"getIconClassName\", ()=>(0, _getIconClassName.getIconClassName));\nvar _buildClassMap = require(\"./buildClassMap\");\nvar _icons = require(\"./icons\");\nvar _getIconClassName = require(\"./getIconClassName\");\n\n},{\"./buildClassMap\":\"6nwnu\",\"./icons\":\"4X00Z\",\"./getIconClassName\":\"3Atdm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6nwnu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Builds a class names object from a given map.\n *\n * @param styles - Map of unprocessed styles.\n * @returns Map of property name to class name.\n */ parcelHelpers.export(exports, \"buildClassMap\", ()=>buildClassMap);\nvar _mergeStyles = require(\"../MergeStyles\");\nfunction buildClassMap(styles) {\n    var classes = {};\n    var _loop_1 = function(styleName) {\n        if (styles.hasOwnProperty(styleName)) {\n            var className_1;\n            Object.defineProperty(classes, styleName, {\n                get: function() {\n                    if (className_1 === undefined) // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    className_1 = (0, _mergeStyles.mergeStyles)(styles[styleName]).toString();\n                    return className_1;\n                },\n                enumerable: true,\n                configurable: true\n            });\n        }\n    };\n    for(var styleName1 in styles)_loop_1(styleName1);\n    return classes;\n}\n\n},{\"../MergeStyles\":\"7FOCK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7FOCK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"InjectionMode\", ()=>(0, _mergeStyles.InjectionMode));\nparcelHelpers.export(exports, \"Stylesheet\", ()=>(0, _mergeStyles.Stylesheet));\nparcelHelpers.export(exports, \"concatStyleSets\", ()=>(0, _mergeStyles.concatStyleSets));\nparcelHelpers.export(exports, \"concatStyleSetsWithProps\", ()=>(0, _mergeStyles.concatStyleSetsWithProps));\nparcelHelpers.export(exports, \"fontFace\", ()=>(0, _mergeStyles.fontFace));\nparcelHelpers.export(exports, \"keyframes\", ()=>(0, _mergeStyles.keyframes));\nparcelHelpers.export(exports, \"mergeStyleSets\", ()=>(0, _mergeStyles.mergeStyleSets));\nparcelHelpers.export(exports, \"mergeStyles\", ()=>(0, _mergeStyles.mergeStyles));\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\n\n},{\"@uifabric/merge-styles\":\"7c43M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4X00Z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Registers a given subset of icons.\n *\n * @param iconSubset - the icon subset definition.\n */ parcelHelpers.export(exports, \"registerIcons\", ()=>registerIcons);\n/**\n * Unregisters icons by name.\n *\n * @param iconNames - List of icons to unregister.\n */ parcelHelpers.export(exports, \"unregisterIcons\", ()=>unregisterIcons);\n/**\n * Remaps one icon name to another.\n */ parcelHelpers.export(exports, \"registerIconAlias\", ()=>registerIconAlias);\n/**\n * Gets an icon definition. If an icon is requested but the subset has yet to be registered,\n * it will get registered immediately.\n *\n * @public\n * @param name - Name of icon.\n */ parcelHelpers.export(exports, \"getIcon\", ()=>getIcon);\n/**\n * Sets the icon options.\n *\n * @public\n */ parcelHelpers.export(exports, \"setIconOptions\", ()=>setIconOptions);\nvar _tslib = require(\"tslib\");\nvar _utilities = require(\"@uifabric/utilities\");\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar ICON_SETTING_NAME = \"icons\";\nvar _iconSettings = (0, _utilities.GlobalSettings).getValue(ICON_SETTING_NAME, {\n    __options: {\n        disableWarnings: false,\n        warnOnMissingIcons: true\n    },\n    __remapped: {}\n});\n// Reset icon registration on stylesheet resets.\nvar stylesheet = (0, _mergeStyles.Stylesheet).getInstance();\nif (stylesheet && stylesheet.onReset) stylesheet.onReset(function() {\n    for(var name_1 in _iconSettings)if (_iconSettings.hasOwnProperty(name_1) && !!_iconSettings[name_1].subset) _iconSettings[name_1].subset.className = undefined;\n});\n/**\n * Normalizes an icon name for consistent mapping.\n * Current implementation is to convert the icon name to lower case.\n *\n * @param name - Icon name to normalize.\n * @returns {string} Normalized icon name to use for indexing and mapping.\n */ var normalizeIconName = function(name) {\n    return name.toLowerCase();\n};\nfunction registerIcons(iconSubset, options) {\n    var subset = (0, _tslib.__assign)((0, _tslib.__assign)({}, iconSubset), {\n        isRegistered: false,\n        className: undefined\n    });\n    var icons = iconSubset.icons;\n    // Grab options, optionally mix user provided ones on top.\n    options = options ? (0, _tslib.__assign)((0, _tslib.__assign)({}, _iconSettings.__options), options) : _iconSettings.__options;\n    for(var iconName in icons)if (icons.hasOwnProperty(iconName)) {\n        var code = icons[iconName];\n        var normalizedIconName = normalizeIconName(iconName);\n        if (_iconSettings[normalizedIconName]) _warnDuplicateIcon(iconName);\n        else _iconSettings[normalizedIconName] = {\n            code: code,\n            subset: subset\n        };\n    }\n}\nfunction unregisterIcons(iconNames) {\n    var options = _iconSettings.__options;\n    var _loop_1 = function(iconName) {\n        var normalizedIconName = normalizeIconName(iconName);\n        if (_iconSettings[normalizedIconName]) delete _iconSettings[normalizedIconName];\n        else // Warn that we are trying to delete an icon that doesn't exist\n        if (!options.disableWarnings) (0, _utilities.warn)('The icon \"' + iconName + '\" tried to unregister but was not registered.');\n        // Delete any aliases for this iconName\n        if (_iconSettings.__remapped[normalizedIconName]) delete _iconSettings.__remapped[normalizedIconName];\n        // Delete any items that were an alias for this iconName\n        Object.keys(_iconSettings.__remapped).forEach(function(key) {\n            if (_iconSettings.__remapped[key] === normalizedIconName) delete _iconSettings.__remapped[key];\n        });\n    };\n    for(var _i = 0, iconNames_1 = iconNames; _i < iconNames_1.length; _i++){\n        var iconName1 = iconNames_1[_i];\n        _loop_1(iconName1);\n    }\n}\nfunction registerIconAlias(iconName, mappedToName) {\n    _iconSettings.__remapped[normalizeIconName(iconName)] = normalizeIconName(mappedToName);\n}\nfunction getIcon(name) {\n    var icon = undefined;\n    var options = _iconSettings.__options;\n    name = name ? normalizeIconName(name) : \"\";\n    name = _iconSettings.__remapped[name] || name;\n    if (name) {\n        icon = _iconSettings[name];\n        if (icon) {\n            var subset = icon.subset;\n            if (subset && subset.fontFace) {\n                if (!subset.isRegistered) {\n                    (0, _mergeStyles.fontFace)(subset.fontFace);\n                    subset.isRegistered = true;\n                }\n                if (!subset.className) subset.className = (0, _mergeStyles.mergeStyles)(subset.style, {\n                    fontFamily: subset.fontFace.fontFamily,\n                    fontWeight: subset.fontFace.fontWeight || \"normal\",\n                    fontStyle: subset.fontFace.fontStyle || \"normal\"\n                });\n            }\n        } else // eslint-disable-next-line deprecation/deprecation\n        if (!options.disableWarnings && options.warnOnMissingIcons) (0, _utilities.warn)('The icon \"' + name + '\" was used but not registered. See https://github.com/microsoft/fluentui/wiki/Using-icons for more information.');\n    }\n    return icon;\n}\nfunction setIconOptions(options) {\n    _iconSettings.__options = (0, _tslib.__assign)((0, _tslib.__assign)({}, _iconSettings.__options), options);\n}\nvar _missingIcons = [];\nvar _missingIconsTimer = undefined;\nfunction _warnDuplicateIcon(iconName) {\n    var options = _iconSettings.__options;\n    var warningDelay = 2000;\n    var maxIconsInMessage = 10;\n    if (!options.disableWarnings) {\n        _missingIcons.push(iconName);\n        if (_missingIconsTimer === undefined) _missingIconsTimer = setTimeout(function() {\n            (0, _utilities.warn)(\"Some icons were re-registered. Applications should only call registerIcons for any given icon once. Redefining what an icon is may have unintended consequences. Duplicates include: \\n\" + _missingIcons.slice(0, maxIconsInMessage).join(\", \") + (_missingIcons.length > maxIconsInMessage ? \" (+ \" + (_missingIcons.length - maxIconsInMessage) + \" more)\" : \"\"));\n            _missingIconsTimer = undefined;\n            _missingIcons = [];\n        }, warningDelay);\n    }\n}\n\n},{\"tslib\":\"01Tx1\",\"@uifabric/utilities\":\"uTCgd\",\"@uifabric/merge-styles\":\"7c43M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Atdm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Gets an icon classname. You should be able to add this classname to an I tag with no\n * additional classnames, and render the icon.\n *\n * @public\n */ parcelHelpers.export(exports, \"getIconClassName\", ()=>getIconClassName);\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _icons = require(\"./icons\");\nvar defaultIconStyles = {\n    display: \"inline-block\"\n};\nfunction getIconClassName(name) {\n    var className = \"\";\n    var icon = (0, _icons.getIcon)(name);\n    if (icon) className = (0, _mergeStyles.mergeStyles)(icon.subset.className, defaultIconStyles, {\n        selectors: {\n            \"::before\": {\n                content: '\"' + icon.code + '\"'\n            }\n        }\n    });\n    return className;\n}\n\n},{\"@uifabric/merge-styles\":\"7c43M\",\"./icons\":\"4X00Z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l8ssX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AnimationStyles\", ()=>(0, _animationStyles.AnimationStyles));\nparcelHelpers.export(exports, \"AnimationVariables\", ()=>(0, _animationStyles.AnimationVariables));\nparcelHelpers.export(exports, \"DefaultPalette\", ()=>(0, _defaultPalette.DefaultPalette));\nparcelHelpers.export(exports, \"DefaultEffects\", ()=>(0, _defaultEffects.DefaultEffects));\nparcelHelpers.export(exports, \"DefaultFontStyles\", ()=>(0, _defaultFontStyles.DefaultFontStyles));\nparcelHelpers.export(exports, \"registerDefaultFontFaces\", ()=>(0, _defaultFontStyles.registerDefaultFontFaces));\nparcelHelpers.export(exports, \"FontSizes\", ()=>(0, _fonts.FontSizes));\nparcelHelpers.export(exports, \"FontWeights\", ()=>(0, _fonts.FontWeights));\nparcelHelpers.export(exports, \"IconFontSizes\", ()=>(0, _fonts.IconFontSizes));\nparcelHelpers.export(exports, \"createFontStyles\", ()=>(0, _fonts.createFontStyles));\nparcelHelpers.export(exports, \"hiddenContentStyle\", ()=>(0, _hiddenContentStyle.hiddenContentStyle));\nparcelHelpers.export(exports, \"PulsingBeaconAnimationStyles\", ()=>(0, _pulsingBeaconAnimationStyles.PulsingBeaconAnimationStyles));\nparcelHelpers.export(exports, \"getGlobalClassNames\", ()=>(0, _getGlobalClassNames.getGlobalClassNames));\nparcelHelpers.export(exports, \"ThemeSettingName\", ()=>(0, _theme.ThemeSettingName));\nparcelHelpers.export(exports, \"getTheme\", ()=>(0, _theme.getTheme));\nparcelHelpers.export(exports, \"loadTheme\", ()=>(0, _theme.loadTheme));\nparcelHelpers.export(exports, \"createTheme\", ()=>(0, _theme.createTheme));\nparcelHelpers.export(exports, \"registerOnThemeChangeCallback\", ()=>(0, _theme.registerOnThemeChangeCallback));\nparcelHelpers.export(exports, \"removeOnThemeChangeCallback\", ()=>(0, _theme.removeOnThemeChangeCallback));\nvar _animationStyles = require(\"./AnimationStyles\");\nvar _defaultPalette = require(\"./DefaultPalette\");\nvar _defaultEffects = require(\"./DefaultEffects\");\nvar _defaultFontStyles = require(\"./DefaultFontStyles\");\nvar _fonts = require(\"./fonts\");\nvar _getFocusStyle = require(\"./getFocusStyle\");\nparcelHelpers.exportAll(_getFocusStyle, exports);\nvar _hiddenContentStyle = require(\"./hiddenContentStyle\");\nvar _pulsingBeaconAnimationStyles = require(\"./PulsingBeaconAnimationStyles\");\nvar _getGlobalClassNames = require(\"./getGlobalClassNames\");\nvar _scheme = require(\"./scheme\");\nparcelHelpers.exportAll(_scheme, exports);\nvar _theme = require(\"./theme\");\nvar _commonStyles = require(\"./CommonStyles\");\nparcelHelpers.exportAll(_commonStyles, exports);\nvar _generalStyles = require(\"./GeneralStyles\");\nparcelHelpers.exportAll(_generalStyles, exports);\nvar _getFadedOverflowStyle = require(\"./getFadedOverflowStyle\");\nparcelHelpers.exportAll(_getFadedOverflowStyle, exports);\nvar _getPlaceholderStyles = require(\"./getPlaceholderStyles\");\nparcelHelpers.exportAll(_getPlaceholderStyles, exports);\nvar _zIndexes = require(\"./zIndexes\");\nparcelHelpers.exportAll(_zIndexes, exports);\n\n},{\"./AnimationStyles\":\"cZ8o1\",\"./DefaultPalette\":\"fgXko\",\"./DefaultEffects\":\"hXKxd\",\"./DefaultFontStyles\":\"grmh2\",\"./fonts\":\"25vfB\",\"./getFocusStyle\":\"cy6bH\",\"./hiddenContentStyle\":\"3vZ4x\",\"./PulsingBeaconAnimationStyles\":\"lHZs6\",\"./getGlobalClassNames\":\"5gzlT\",\"./scheme\":\"lVYbk\",\"./theme\":\"gKrD3\",\"./CommonStyles\":\"9q242\",\"./GeneralStyles\":\"7faxv\",\"./getFadedOverflowStyle\":\"7myEB\",\"./getPlaceholderStyles\":\"6xeB3\",\"./zIndexes\":\"lgWzU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cZ8o1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _animationStyles = require(\"@fluentui/theme/lib/motion/AnimationStyles\");\nparcelHelpers.exportAll(_animationStyles, exports);\n\n},{\"@fluentui/theme/lib/motion/AnimationStyles\":\"k3YUv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k3YUv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AnimationVariables\", ()=>AnimationVariables);\nparcelHelpers.export(exports, \"AnimationStyles\", ()=>AnimationStyles);\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\n/* Register the keyframes */ var EASING_FUNCTION_1 = \"cubic-bezier(.1,.9,.2,1)\";\nvar EASING_FUNCTION_2 = \"cubic-bezier(.1,.25,.75,.9)\";\nvar DURATION_1 = \"0.167s\";\nvar DURATION_2 = \"0.267s\";\nvar DURATION_3 = \"0.367s\";\nvar DURATION_4 = \"0.467s\";\nvar FADE_IN = (0, _mergeStyles.keyframes)({\n    from: {\n        opacity: 0\n    },\n    to: {\n        opacity: 1\n    }\n});\nvar FADE_OUT = (0, _mergeStyles.keyframes)({\n    from: {\n        opacity: 1\n    },\n    to: {\n        opacity: 0,\n        visibility: \"hidden\"\n    }\n});\nvar SLIDE_RIGHT_IN10 = _createSlideInX(-10);\nvar SLIDE_RIGHT_IN20 = _createSlideInX(-20);\nvar SLIDE_RIGHT_IN40 = _createSlideInX(-40);\nvar SLIDE_RIGHT_IN400 = _createSlideInX(-400);\nvar SLIDE_LEFT_IN10 = _createSlideInX(10);\nvar SLIDE_LEFT_IN20 = _createSlideInX(20);\nvar SLIDE_LEFT_IN40 = _createSlideInX(40);\nvar SLIDE_LEFT_IN400 = _createSlideInX(400);\nvar SLIDE_UP_IN10 = _createSlideInY(10);\nvar SLIDE_UP_IN20 = _createSlideInY(20);\nvar SLIDE_DOWN_IN10 = _createSlideInY(-10);\nvar SLIDE_DOWN_IN20 = _createSlideInY(-20);\nvar SLIDE_RIGHT_OUT10 = _createSlideOutX(10);\nvar SLIDE_RIGHT_OUT20 = _createSlideOutX(20);\nvar SLIDE_RIGHT_OUT40 = _createSlideOutX(40);\nvar SLIDE_RIGHT_OUT400 = _createSlideOutX(400);\nvar SLIDE_LEFT_OUT10 = _createSlideOutX(-10);\nvar SLIDE_LEFT_OUT20 = _createSlideOutX(-20);\nvar SLIDE_LEFT_OUT40 = _createSlideOutX(-40);\nvar SLIDE_LEFT_OUT400 = _createSlideOutX(-400);\nvar SLIDE_UP_OUT10 = _createSlideOutY(-10);\nvar SLIDE_UP_OUT20 = _createSlideOutY(-20);\nvar SLIDE_DOWN_OUT10 = _createSlideOutY(10);\nvar SLIDE_DOWN_OUT20 = _createSlideOutY(20);\nvar SCALE_UP100 = (0, _mergeStyles.keyframes)({\n    from: {\n        transform: \"scale3d(.98,.98,1)\"\n    },\n    to: {\n        transform: \"scale3d(1,1,1)\"\n    }\n});\nvar SCALE_DOWN98 = (0, _mergeStyles.keyframes)({\n    from: {\n        transform: \"scale3d(1,1,1)\"\n    },\n    to: {\n        transform: \"scale3d(.98,.98,1)\"\n    }\n});\nvar SCALE_DOWN100 = (0, _mergeStyles.keyframes)({\n    from: {\n        transform: \"scale3d(1.03,1.03,1)\"\n    },\n    to: {\n        transform: \"scale3d(1,1,1)\"\n    }\n});\nvar SCALE_UP103 = (0, _mergeStyles.keyframes)({\n    from: {\n        transform: \"scale3d(1,1,1)\"\n    },\n    to: {\n        transform: \"scale3d(1.03,1.03,1)\"\n    }\n});\nvar ROTATE90 = (0, _mergeStyles.keyframes)({\n    from: {\n        transform: \"rotateZ(0deg)\"\n    },\n    to: {\n        transform: \"rotateZ(90deg)\"\n    }\n});\nvar ROTATE_N90 = (0, _mergeStyles.keyframes)({\n    from: {\n        transform: \"rotateZ(0deg)\"\n    },\n    to: {\n        transform: \"rotateZ(-90deg)\"\n    }\n});\nvar AnimationVariables = {\n    easeFunction1: EASING_FUNCTION_1,\n    easeFunction2: EASING_FUNCTION_2,\n    durationValue1: DURATION_1,\n    durationValue2: DURATION_2,\n    durationValue3: DURATION_3,\n    durationValue4: DURATION_4\n};\nvar AnimationStyles = {\n    slideRightIn10: _createAnimation(FADE_IN + \",\" + SLIDE_RIGHT_IN10, DURATION_3, EASING_FUNCTION_1),\n    slideRightIn20: _createAnimation(FADE_IN + \",\" + SLIDE_RIGHT_IN20, DURATION_3, EASING_FUNCTION_1),\n    slideRightIn40: _createAnimation(FADE_IN + \",\" + SLIDE_RIGHT_IN40, DURATION_3, EASING_FUNCTION_1),\n    slideRightIn400: _createAnimation(FADE_IN + \",\" + SLIDE_RIGHT_IN400, DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn10: _createAnimation(FADE_IN + \",\" + SLIDE_LEFT_IN10, DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn20: _createAnimation(FADE_IN + \",\" + SLIDE_LEFT_IN20, DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn40: _createAnimation(FADE_IN + \",\" + SLIDE_LEFT_IN40, DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn400: _createAnimation(FADE_IN + \",\" + SLIDE_LEFT_IN400, DURATION_3, EASING_FUNCTION_1),\n    slideUpIn10: _createAnimation(FADE_IN + \",\" + SLIDE_UP_IN10, DURATION_3, EASING_FUNCTION_1),\n    slideUpIn20: _createAnimation(FADE_IN + \",\" + SLIDE_UP_IN20, DURATION_3, EASING_FUNCTION_1),\n    slideDownIn10: _createAnimation(FADE_IN + \",\" + SLIDE_DOWN_IN10, DURATION_3, EASING_FUNCTION_1),\n    slideDownIn20: _createAnimation(FADE_IN + \",\" + SLIDE_DOWN_IN20, DURATION_3, EASING_FUNCTION_1),\n    slideRightOut10: _createAnimation(FADE_OUT + \",\" + SLIDE_RIGHT_OUT10, DURATION_3, EASING_FUNCTION_1),\n    slideRightOut20: _createAnimation(FADE_OUT + \",\" + SLIDE_RIGHT_OUT20, DURATION_3, EASING_FUNCTION_1),\n    slideRightOut40: _createAnimation(FADE_OUT + \",\" + SLIDE_RIGHT_OUT40, DURATION_3, EASING_FUNCTION_1),\n    slideRightOut400: _createAnimation(FADE_OUT + \",\" + SLIDE_RIGHT_OUT400, DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut10: _createAnimation(FADE_OUT + \",\" + SLIDE_LEFT_OUT10, DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut20: _createAnimation(FADE_OUT + \",\" + SLIDE_LEFT_OUT20, DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut40: _createAnimation(FADE_OUT + \",\" + SLIDE_LEFT_OUT40, DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut400: _createAnimation(FADE_OUT + \",\" + SLIDE_LEFT_OUT400, DURATION_3, EASING_FUNCTION_1),\n    slideUpOut10: _createAnimation(FADE_OUT + \",\" + SLIDE_UP_OUT10, DURATION_3, EASING_FUNCTION_1),\n    slideUpOut20: _createAnimation(FADE_OUT + \",\" + SLIDE_UP_OUT20, DURATION_3, EASING_FUNCTION_1),\n    slideDownOut10: _createAnimation(FADE_OUT + \",\" + SLIDE_DOWN_OUT10, DURATION_3, EASING_FUNCTION_1),\n    slideDownOut20: _createAnimation(FADE_OUT + \",\" + SLIDE_DOWN_OUT20, DURATION_3, EASING_FUNCTION_1),\n    scaleUpIn100: _createAnimation(FADE_IN + \",\" + SCALE_UP100, DURATION_3, EASING_FUNCTION_1),\n    scaleDownIn100: _createAnimation(FADE_IN + \",\" + SCALE_DOWN100, DURATION_3, EASING_FUNCTION_1),\n    scaleUpOut103: _createAnimation(FADE_OUT + \",\" + SCALE_UP103, DURATION_1, EASING_FUNCTION_2),\n    scaleDownOut98: _createAnimation(FADE_OUT + \",\" + SCALE_DOWN98, DURATION_1, EASING_FUNCTION_2),\n    fadeIn100: _createAnimation(FADE_IN, DURATION_1, EASING_FUNCTION_2),\n    fadeIn200: _createAnimation(FADE_IN, DURATION_2, EASING_FUNCTION_2),\n    fadeIn400: _createAnimation(FADE_IN, DURATION_3, EASING_FUNCTION_2),\n    fadeIn500: _createAnimation(FADE_IN, DURATION_4, EASING_FUNCTION_2),\n    fadeOut100: _createAnimation(FADE_OUT, DURATION_1, EASING_FUNCTION_2),\n    fadeOut200: _createAnimation(FADE_OUT, DURATION_2, EASING_FUNCTION_2),\n    fadeOut400: _createAnimation(FADE_OUT, DURATION_3, EASING_FUNCTION_2),\n    fadeOut500: _createAnimation(FADE_OUT, DURATION_4, EASING_FUNCTION_2),\n    rotate90deg: _createAnimation(ROTATE90, \"0.1s\", EASING_FUNCTION_2),\n    rotateN90deg: _createAnimation(ROTATE_N90, \"0.1s\", EASING_FUNCTION_2)\n};\nfunction _createAnimation(animationName, animationDuration, animationTimingFunction) {\n    return {\n        animationName: animationName,\n        animationDuration: animationDuration,\n        animationTimingFunction: animationTimingFunction,\n        animationFillMode: \"both\"\n    };\n}\nfunction _createSlideInX(fromX) {\n    return (0, _mergeStyles.keyframes)({\n        from: {\n            transform: \"translate3d(\" + fromX + \"px,0,0)\",\n            pointerEvents: \"none\"\n        },\n        to: {\n            transform: \"translate3d(0,0,0)\",\n            pointerEvents: \"auto\"\n        }\n    });\n}\nfunction _createSlideInY(fromY) {\n    return (0, _mergeStyles.keyframes)({\n        from: {\n            transform: \"translate3d(0,\" + fromY + \"px,0)\",\n            pointerEvents: \"none\"\n        },\n        to: {\n            transform: \"translate3d(0,0,0)\",\n            pointerEvents: \"auto\"\n        }\n    });\n}\nfunction _createSlideOutX(toX) {\n    return (0, _mergeStyles.keyframes)({\n        from: {\n            transform: \"translate3d(0,0,0)\"\n        },\n        to: {\n            transform: \"translate3d(\" + toX + \"px,0,0)\"\n        }\n    });\n}\nfunction _createSlideOutY(toY) {\n    return (0, _mergeStyles.keyframes)({\n        from: {\n            transform: \"translate3d(0,0,0)\"\n        },\n        to: {\n            transform: \"translate3d(0,\" + toY + \"px,0)\"\n        }\n    });\n}\n\n},{\"@uifabric/merge-styles\":\"7c43M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fgXko\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defaultPalette = require(\"@fluentui/theme/lib/colors/DefaultPalette\");\nparcelHelpers.exportAll(_defaultPalette, exports);\n\n},{\"@fluentui/theme/lib/colors/DefaultPalette\":\"bWsdI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hXKxd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defaultEffects = require(\"@fluentui/theme/lib/effects/DefaultEffects\");\nparcelHelpers.exportAll(_defaultEffects, exports);\n\n},{\"@fluentui/theme/lib/effects/DefaultEffects\":\"8t0Wc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"grmh2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defaultFontStyles = require(\"@fluentui/theme/lib/fonts/DefaultFontStyles\");\nparcelHelpers.exportAll(_defaultFontStyles, exports);\n\n},{\"@fluentui/theme/lib/fonts/DefaultFontStyles\":\"92iYH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"25vfB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LocalizedFontNames\", ()=>(0, _index.LocalizedFontNames));\nparcelHelpers.export(exports, \"LocalizedFontFamilies\", ()=>(0, _index.LocalizedFontFamilies));\nparcelHelpers.export(exports, \"FontSizes\", ()=>(0, _index.FontSizes));\nparcelHelpers.export(exports, \"FontWeights\", ()=>(0, _index.FontWeights));\nparcelHelpers.export(exports, \"IconFontSizes\", ()=>(0, _index.IconFontSizes));\nparcelHelpers.export(exports, \"createFontStyles\", ()=>(0, _index.createFontStyles));\nvar _index = require(\"@fluentui/theme/lib/fonts/index\");\n\n},{\"@fluentui/theme/lib/fonts/index\":\"39ZLm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cy6bH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getFocusStyle\", ()=>getFocusStyle);\n/**\n * Generates style to clear browser specific focus styles.\n */ parcelHelpers.export(exports, \"focusClear\", ()=>focusClear);\n/**\n * Generates a style which can be used to set a border on focus.\n *\n * @param theme - The theme object to use.\n * @param inset - The number of pixels to inset the border (default 0)\n * @param width - The border width in pixels (default 1)\n * @param color - Color of the outline (default `theme.palette.neutralSecondary`)\n * @returns The style object.\n */ parcelHelpers.export(exports, \"getFocusOutlineStyle\", ()=>getFocusOutlineStyle);\nparcelHelpers.export(exports, \"getInputFocusStyle\", ()=>getInputFocusStyle);\nvar _commonStyles = require(\"./CommonStyles\");\nvar _utilities = require(\"@uifabric/utilities\");\nvar _zIndexes = require(\"./zIndexes\");\nfunction getFocusStyle(theme, insetOrOptions, position, highContrastStyle, borderColor, outlineColor, isFocusedOnly) {\n    if (typeof insetOrOptions === \"number\" || !insetOrOptions) return _getFocusStyleInternal(theme, {\n        inset: insetOrOptions,\n        position: position,\n        highContrastStyle: highContrastStyle,\n        borderColor: borderColor,\n        outlineColor: outlineColor,\n        isFocusedOnly: isFocusedOnly\n    });\n    else return _getFocusStyleInternal(theme, insetOrOptions);\n}\nfunction _getFocusStyleInternal(theme, options) {\n    var _a, _b;\n    if (options === void 0) options = {};\n    var _c = options.inset, inset = _c === void 0 ? 0 : _c, _d = options.width, width = _d === void 0 ? 1 : _d, _e = options.position, position = _e === void 0 ? \"relative\" : _e, highContrastStyle = options.highContrastStyle, _f = options.borderColor, borderColor = _f === void 0 ? theme.palette.white : _f, _g = options.outlineColor, outlineColor = _g === void 0 ? theme.palette.neutralSecondary : _g, _h = options.isFocusedOnly, isFocusedOnly = _h === void 0 ? true : _h;\n    return {\n        // Clear browser-specific focus styles and use 'transparent' as placeholder for focus style.\n        outline: \"transparent\",\n        // Requirement because pseudo-element is absolutely positioned.\n        position: position,\n        selectors: (_a = {\n            // Clear the focus border in Firefox.\n            // Reference: http://stackoverflow.com/a/199319/1436671\n            \"::-moz-focus-inner\": {\n                border: \"0\"\n            }\n        }, // When the element that uses this mixin is in a :focus state, add a pseudo-element to\n        // create a border.\n        _a[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &\" + (isFocusedOnly ? \":focus\" : \"\") + \":after\"] = {\n            content: '\"\"',\n            position: \"absolute\",\n            left: inset + 1,\n            top: inset + 1,\n            bottom: inset + 1,\n            right: inset + 1,\n            border: width + \"px solid \" + borderColor,\n            outline: width + \"px solid \" + outlineColor,\n            zIndex: (0, _zIndexes.ZIndexes).FocusStyle,\n            selectors: (_b = {}, _b[0, _commonStyles.HighContrastSelector] = highContrastStyle, _b)\n        }, _a)\n    };\n}\nfunction focusClear() {\n    return {\n        selectors: {\n            \"&::-moz-focus-inner\": {\n                // Clear the focus border in Firefox. Reference: http://stackoverflow.com/a/199319/1436671\n                border: 0\n            },\n            \"&\": {\n                // Clear browser specific focus styles and use transparent as placeholder for focus style\n                outline: \"transparent\"\n            }\n        }\n    };\n}\nfunction getFocusOutlineStyle(theme, inset, width, color) {\n    var _a;\n    if (inset === void 0) inset = 0;\n    if (width === void 0) width = 1;\n    return {\n        selectors: (_a = {}, _a[\":global(\" + (0, _utilities.IsFocusVisibleClassName) + \") &:focus\"] = {\n            outline: width + \" solid \" + (color || theme.palette.neutralSecondary),\n            outlineOffset: -inset + \"px\"\n        }, _a)\n    };\n}\nvar getInputFocusStyle = function(borderColor, borderRadius, borderType, borderPosition) {\n    var _a, _b, _c;\n    if (borderType === void 0) borderType = \"border\";\n    if (borderPosition === void 0) borderPosition = -1;\n    var isBorderBottom = borderType === \"borderBottom\";\n    return {\n        borderColor: borderColor,\n        selectors: {\n            \":after\": (_a = {\n                pointerEvents: \"none\",\n                content: \"''\",\n                position: \"absolute\",\n                left: isBorderBottom ? 0 : borderPosition,\n                top: borderPosition,\n                bottom: borderPosition,\n                right: isBorderBottom ? 0 : borderPosition\n            }, _a[borderType] = \"2px solid \" + borderColor, _a.borderRadius = borderRadius, _a.width = borderType === \"borderBottom\" ? \"100%\" : undefined, _a.selectors = (_b = {}, _b[0, _commonStyles.HighContrastSelector] = (_c = {}, _c[borderType === \"border\" ? \"borderColor\" : \"borderBottomColor\"] = \"Highlight\", _c), _b), _a)\n        }\n    };\n};\n\n},{\"./CommonStyles\":\"9q242\",\"@uifabric/utilities\":\"uTCgd\",\"./zIndexes\":\"lgWzU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9q242\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"HighContrastSelector\", ()=>HighContrastSelector);\nparcelHelpers.export(exports, \"HighContrastSelectorWhite\", ()=>HighContrastSelectorWhite);\nparcelHelpers.export(exports, \"HighContrastSelectorBlack\", ()=>HighContrastSelectorBlack);\nparcelHelpers.export(exports, \"EdgeChromiumHighContrastSelector\", ()=>EdgeChromiumHighContrastSelector);\nparcelHelpers.export(exports, \"ScreenWidthMinSmall\", ()=>ScreenWidthMinSmall);\nparcelHelpers.export(exports, \"ScreenWidthMinMedium\", ()=>ScreenWidthMinMedium);\nparcelHelpers.export(exports, \"ScreenWidthMinLarge\", ()=>ScreenWidthMinLarge);\nparcelHelpers.export(exports, \"ScreenWidthMinXLarge\", ()=>ScreenWidthMinXLarge);\nparcelHelpers.export(exports, \"ScreenWidthMinXXLarge\", ()=>ScreenWidthMinXXLarge);\nparcelHelpers.export(exports, \"ScreenWidthMinXXXLarge\", ()=>ScreenWidthMinXXXLarge);\nparcelHelpers.export(exports, \"ScreenWidthMaxSmall\", ()=>ScreenWidthMaxSmall);\nparcelHelpers.export(exports, \"ScreenWidthMaxMedium\", ()=>ScreenWidthMaxMedium);\nparcelHelpers.export(exports, \"ScreenWidthMaxLarge\", ()=>ScreenWidthMaxLarge);\nparcelHelpers.export(exports, \"ScreenWidthMaxXLarge\", ()=>ScreenWidthMaxXLarge);\nparcelHelpers.export(exports, \"ScreenWidthMaxXXLarge\", ()=>ScreenWidthMaxXXLarge);\nparcelHelpers.export(exports, \"ScreenWidthMinUhfMobile\", ()=>ScreenWidthMinUhfMobile);\nparcelHelpers.export(exports, \"getScreenSelector\", ()=>getScreenSelector);\n/**\n * The style which turns off high contrast adjustment in browsers.\n */ parcelHelpers.export(exports, \"getHighContrastNoAdjustStyle\", ()=>getHighContrastNoAdjustStyle);\n/**\n * The style which turns off high contrast adjustment in (only) Edge Chromium browser.\n * @deprecated Use `getHighContrastNoAdjustStyle`\n */ parcelHelpers.export(exports, \"getEdgeChromiumNoHighContrastAdjustSelector\", ()=>getEdgeChromiumNoHighContrastAdjustSelector);\nvar HighContrastSelector = \"@media screen and (-ms-high-contrast: active), (forced-colors: active)\";\nvar HighContrastSelectorWhite = \"@media screen and (-ms-high-contrast: black-on-white), (forced-colors: black-on-white)\";\nvar HighContrastSelectorBlack = \"@media screen and (-ms-high-contrast: white-on-black), (forced-colors: white-on-black)\";\nvar EdgeChromiumHighContrastSelector = \"@media screen and (forced-colors: active)\";\nvar ScreenWidthMinSmall = 320;\nvar ScreenWidthMinMedium = 480;\nvar ScreenWidthMinLarge = 640;\nvar ScreenWidthMinXLarge = 1024;\nvar ScreenWidthMinXXLarge = 1366;\nvar ScreenWidthMinXXXLarge = 1920;\nvar ScreenWidthMaxSmall = ScreenWidthMinMedium - 1;\nvar ScreenWidthMaxMedium = ScreenWidthMinLarge - 1;\nvar ScreenWidthMaxLarge = ScreenWidthMinXLarge - 1;\nvar ScreenWidthMaxXLarge = ScreenWidthMinXXLarge - 1;\nvar ScreenWidthMaxXXLarge = ScreenWidthMinXXXLarge - 1;\nvar ScreenWidthMinUhfMobile = 768;\nfunction getScreenSelector(min, max) {\n    var minSelector = typeof min === \"number\" ? \" and (min-width: \" + min + \"px)\" : \"\";\n    var maxSelector = typeof max === \"number\" ? \" and (max-width: \" + max + \"px)\" : \"\";\n    return \"@media only screen\" + minSelector + maxSelector;\n}\nfunction getHighContrastNoAdjustStyle() {\n    return {\n        forcedColorAdjust: \"none\",\n        MsHighContrastAdjust: \"none\"\n    };\n}\nfunction getEdgeChromiumNoHighContrastAdjustSelector() {\n    var _a;\n    return _a = {}, _a[EdgeChromiumHighContrastSelector] = {\n        forcedColorAdjust: \"none\"\n    }, _a;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lgWzU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ZIndexes\", ()=>ZIndexes);\nvar ZIndexes;\n(function(ZIndexes1) {\n    ZIndexes1.Nav = 1;\n    /**\n     * @deprecated ScrollablePane\n     */ ZIndexes1.ScrollablePane = 1;\n    ZIndexes1.FocusStyle = 1;\n    ZIndexes1.Coachmark = 1000;\n    ZIndexes1.Layer = 1000000;\n    ZIndexes1.KeytipLayer = 1000001;\n})(ZIndexes || (ZIndexes = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3vZ4x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hiddenContentStyle\", ()=>hiddenContentStyle);\nvar hiddenContentStyle = {\n    position: \"absolute\",\n    width: 1,\n    height: 1,\n    margin: -1,\n    padding: 0,\n    border: 0,\n    overflow: \"hidden\"\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lHZs6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"PulsingBeaconAnimationStyles\", ()=>PulsingBeaconAnimationStyles);\nvar _tslib = require(\"tslib\");\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar DEFAULT_DURATION = \"14s\";\nvar DEFAULT_DELAY = \"2s\";\nvar DEFAULT_ITERATION_COUNT = \"1\";\nfunction _continuousPulseStepOne(beaconColorOne, innerDimension) {\n    return {\n        borderColor: beaconColorOne,\n        borderWidth: \"0px\",\n        width: innerDimension,\n        height: innerDimension\n    };\n}\nfunction _continuousPulseStepTwo(borderWidth) {\n    return {\n        opacity: 1,\n        borderWidth: borderWidth\n    };\n}\nfunction _continuousPulseStepThree() {\n    return {\n        opacity: 1\n    };\n}\nfunction _continuousPulseStepFour(beaconColorTwo, outerDimension) {\n    return {\n        borderWidth: \"0\",\n        width: outerDimension,\n        height: outerDimension,\n        opacity: 0,\n        borderColor: beaconColorTwo\n    };\n}\nfunction _continuousPulseStepFive(beaconColorOne, innerDimension) {\n    return (0, _tslib.__assign)((0, _tslib.__assign)({}, _continuousPulseStepOne(beaconColorOne, innerDimension)), {\n        opacity: 0\n    });\n}\nfunction _continuousPulseAnimationDouble(beaconColorOne, beaconColorTwo, innerDimension, outerDimension, borderWidth) {\n    return (0, _mergeStyles.keyframes)({\n        \"0%\": _continuousPulseStepOne(beaconColorOne, innerDimension),\n        \"1.42%\": _continuousPulseStepTwo(borderWidth),\n        \"3.57%\": _continuousPulseStepThree(),\n        \"7.14%\": _continuousPulseStepFour(beaconColorTwo, outerDimension),\n        \"8%\": _continuousPulseStepFive(beaconColorOne, innerDimension),\n        \"29.99%\": _continuousPulseStepFive(beaconColorOne, innerDimension),\n        \"30%\": _continuousPulseStepOne(beaconColorOne, innerDimension),\n        \"31.42%\": _continuousPulseStepTwo(borderWidth),\n        \"33.57%\": _continuousPulseStepThree(),\n        \"37.14%\": _continuousPulseStepFour(beaconColorTwo, outerDimension),\n        \"38%\": _continuousPulseStepFive(beaconColorOne, innerDimension),\n        \"79.42%\": _continuousPulseStepFive(beaconColorOne, innerDimension),\n        \"79.43\": _continuousPulseStepOne(beaconColorOne, innerDimension),\n        \"81.85\": _continuousPulseStepTwo(borderWidth),\n        \"83.42\": _continuousPulseStepThree(),\n        \"87%\": _continuousPulseStepFour(beaconColorTwo, outerDimension),\n        \"100%\": {}\n    });\n}\nfunction _continuousPulseAnimationSingle(beaconColorOne, beaconColorTwo, innerDimension, outerDimension, borderWidth) {\n    return (0, _mergeStyles.keyframes)({\n        \"0%\": _continuousPulseStepOne(beaconColorOne, innerDimension),\n        \"14.2%\": _continuousPulseStepTwo(borderWidth),\n        \"35.7%\": _continuousPulseStepThree(),\n        \"71.4%\": _continuousPulseStepFour(beaconColorTwo, outerDimension),\n        \"100%\": {}\n    });\n}\nfunction _createDefaultAnimation(animationName, delayLength) {\n    return {\n        animationName: animationName,\n        animationIterationCount: DEFAULT_ITERATION_COUNT,\n        animationDuration: DEFAULT_DURATION,\n        animationDelay: delayLength || DEFAULT_DELAY\n    };\n}\nvar PulsingBeaconAnimationStyles = {\n    continuousPulseAnimationDouble: _continuousPulseAnimationDouble,\n    continuousPulseAnimationSingle: _continuousPulseAnimationSingle,\n    createDefaultAnimation: _createDefaultAnimation\n};\n\n},{\"tslib\":\"01Tx1\",\"@uifabric/merge-styles\":\"7c43M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5gzlT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Checks for the `disableGlobalClassNames` property on the `theme` to determine if it should return `classNames`\n * Note that calls to this function are memoized.\n *\n * @param classNames - The collection of global class names that apply when the flag is false. Make sure to pass in\n * the same instance on each call to benefit from memoization.\n * @param theme - The theme to check the flag on\n * @param disableGlobalClassNames - Optional. Explicitly opt in/out of disabling global classnames. Defaults to false.\n */ parcelHelpers.export(exports, \"getGlobalClassNames\", ()=>getGlobalClassNames);\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _utilities = require(\"@uifabric/utilities\");\n/**\n * Internal memoized function which simply takes in the class map and the\n * disable boolean. These immutable values can be memoized.\n */ var _getGlobalClassNames = (0, _utilities.memoizeFunction)(function(classNames, disableGlobalClassNames) {\n    var styleSheet = (0, _mergeStyles.Stylesheet).getInstance();\n    if (disableGlobalClassNames) // disable global classnames\n    return Object.keys(classNames).reduce(function(acc, className) {\n        acc[className] = styleSheet.getClassName(classNames[className]);\n        return acc;\n    }, {});\n    // use global classnames\n    return classNames;\n});\nfunction getGlobalClassNames(classNames, theme, disableGlobalClassNames) {\n    return _getGlobalClassNames(classNames, disableGlobalClassNames !== undefined ? disableGlobalClassNames : theme.disableGlobalClassNames);\n}\n\n},{\"@uifabric/merge-styles\":\"7c43M\",\"@uifabric/utilities\":\"uTCgd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lVYbk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * @internal\n * This function is still in experimental phase in support of Foundation experimental development.\n * Its API signature and existence are subject to change.\n *\n * Modify context to activate the specified scheme or theme. For schemes, look in context (if available) and fall back\n * to global Customizations. If both scheme and theme are specified, scheme will be looked up in theme. In this case,\n * scheme must be present in theme arg, otherwise new context will default to theme arg (there is no fallback to\n * settings to look up scheme.)\n *\n * @param context - Context in which to get schemed customizations.\n * @param scheme - Scheme to get customizations for from theme arg (if supplied) OR from context and global settings.\n * @param theme - Theme to merge into context.\n * @returns modified schemed context if scheme is valid and not already applied, unmodified context otherwise.\n */ parcelHelpers.export(exports, \"getThemedContext\", ()=>getThemedContext);\nvar _utilities = require(\"@uifabric/utilities\");\nfunction getThemedContext(context, scheme, theme) {\n    var newContext = context;\n    var newSettings;\n    // Only fall back to context and customizations when theme arg is not provided.\n    var schemeSource = theme || (0, _utilities.Customizations).getSettings([\n        \"theme\"\n    ], undefined, context.customizations).theme;\n    if (theme) newSettings = {\n        theme: theme\n    };\n    var schemeTheme = scheme && schemeSource && schemeSource.schemes && schemeSource.schemes[scheme];\n    // These first two checks are logically redundant but TS doesn't infer schemeSource.schemes is defined\n    // when schemeTheme is defined.\n    if (schemeSource && schemeTheme && schemeSource !== schemeTheme) {\n        newSettings = {\n            theme: schemeTheme\n        };\n        newSettings.theme.schemes = schemeSource.schemes;\n    }\n    if (newSettings) newContext = {\n        customizations: {\n            settings: (0, _utilities.mergeSettings)(context.customizations.settings, newSettings),\n            scopedSettings: context.customizations.scopedSettings\n        }\n    };\n    return newContext;\n}\n\n},{\"@uifabric/utilities\":\"uTCgd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7faxv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalize\", ()=>normalize);\nparcelHelpers.export(exports, \"noWrap\", ()=>noWrap);\nvar normalize = {\n    boxShadow: \"none\",\n    margin: 0,\n    padding: 0,\n    boxSizing: \"border-box\"\n};\nvar noWrap = {\n    overflow: \"hidden\",\n    textOverflow: \"ellipsis\",\n    whiteSpace: \"nowrap\"\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7myEB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * - Generates a style used to fade out an overflowing content by defining a style for an :after pseudo element.\n * - Apply it to the :after selector for all combination of states the parent of content might have (normal, hover,\n * selected, focus).\n * - Requires the target to have position set to relative and overflow set to hidden.\n *\n * @example\n * ```tsx\n * // Assuming the following DOM structure and the different background colors coming from\n * // the parent holding the content.\n * <div className={classNames.parent}>\n *   <span className={classNames.content}>Overflown Content</span>\n * </div>\n * ```\n * ```ts\n * // This is how the style set would look in Component.styles.ts\n * const { bodyBackground } = theme.semanticColors;\n * const { neutralLighter } = theme.palette;\n *\n * // The second argument of getFadedOverflowStyle function is a string representing a key of\n * // ISemanticColors or IPalette.\n *\n * const styles = {\n *   parent: [\n *     backgroundColor: bodyBackground,\n *     selectors: {\n *       '&:hover: {\n *         backgroundColor: neutralLighter\n *       },\n *       '$content:after': {\n *         ...getFadedOverflowStyle(theme, 'bodyBackground')\n *       },\n *       '&:hover $content:after': {\n *         ...getFadedOverflowStyle(theme, 'neutralLighter')\n *       }\n *     }\n *   ],\n *   content: [\n *     width: '100%',\n *     display: 'inline-block',\n *     position: 'relative',\n *     overflow: 'hidden'\n *   ]\n * }\n * ```\n * @param theme - The theme object to use.\n * @param color - The background color to fade out to. Accepts only keys of ISemanticColors or IPalette.\n * Defaults to 'bodyBackground'.\n * @param direction - The direction of the overflow. Defaults to horizontal.\n * @param width - The width of the fading overflow. Vertical direction defaults it to 100% vs 20px when horizontal.\n * @param height - The Height of the fading overflow. Vertical direction defaults it to 50% vs 100% when horizontal.\n * @returns The style object.\n */ parcelHelpers.export(exports, \"getFadedOverflowStyle\", ()=>getFadedOverflowStyle);\nvar DEFAULT_HEIGHT = \"50%\";\nvar DEFAULT_WIDTH = 20;\nfunction getFadedOverflowStyle(theme, color, direction, width, height) {\n    if (color === void 0) color = \"bodyBackground\";\n    if (direction === void 0) direction = \"horizontal\";\n    if (width === void 0) width = getDefaultValue(\"width\", direction);\n    if (height === void 0) height = getDefaultValue(\"height\", direction);\n    // Get the color value string from the theme semanticColors or palette.\n    var colorValue = theme.semanticColors[color] || theme.palette[color];\n    // Get the red, green, blue values of the colorValue.\n    var rgbColor = color2rgb(colorValue);\n    // Apply opacity 0 to serve as a start color of the gradient.\n    var rgba = \"rgba(\" + rgbColor.r + \", \" + rgbColor.g + \", \" + rgbColor.b + \", 0)\";\n    // Get the direction of the gradient. (mergeStyles takes care of RTL direction)\n    var gradientDirection = direction === \"vertical\" ? \"to bottom\" : \"to right\";\n    return {\n        content: '\"\"',\n        position: \"absolute\",\n        right: 0,\n        bottom: 0,\n        width: width,\n        height: height,\n        pointerEvents: \"none\",\n        backgroundImage: \"linear-gradient(\" + gradientDirection + \", \" + rgba + \" 0%, \" + colorValue + \" 100%)\"\n    };\n}\n// TODO consider moving this to a separate module along with some more color functions from OUFR/utilities.\n/**\n * Helper function to convert a string hex color to an RGB object.\n *\n * @param colorValue - Color to be converted from hex to rgba.\n */ function color2rgb(colorValue) {\n    if (colorValue[0] === \"#\") // If it's a hex code\n    return {\n        r: parseInt(colorValue.slice(1, 3), 16),\n        g: parseInt(colorValue.slice(3, 5), 16),\n        b: parseInt(colorValue.slice(5, 7), 16)\n    };\n    else if (colorValue.indexOf(\"rgba(\") === 0) {\n        // If it's an rgba color string\n        colorValue = colorValue.match(/rgba\\(([^)]+)\\)/)[1];\n        var parts = colorValue.split(/ *, */).map(Number);\n        return {\n            r: parts[0],\n            g: parts[1],\n            b: parts[2]\n        };\n    }\n    // The only remaining possibility is transparent.\n    return {\n        r: 255,\n        g: 255,\n        b: 255\n    };\n}\n/**\n * Helper function to get the default values for parameters of main function.\n *\n * @param style - Which style to get the default value for.\n * @param direction - What direction to take into consideration.\n */ function getDefaultValue(style, direction) {\n    if (style === \"width\") return direction === \"horizontal\" ? DEFAULT_WIDTH : \"100%\";\n    else return direction === \"vertical\" ? DEFAULT_HEIGHT : \"100%\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6xeB3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Generates placeholder style for each of the browsers supported by office-ui-fabric-react.\n * @param styles - The style to use.\n * @returns The placeholder style object for each browser depending on the placeholder directive it uses.\n */ parcelHelpers.export(exports, \"getPlaceholderStyles\", ()=>getPlaceholderStyles);\nfunction getPlaceholderStyles(styles) {\n    return {\n        selectors: {\n            \"::placeholder\": styles,\n            \":-ms-input-placeholder\": styles,\n            \"::-ms-input-placeholder\": styles\n        }\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5LcJN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FontClassNames\", ()=>FontClassNames);\nvar _buildClassMap = require(\"../utilities/buildClassMap\");\nvar _defaultFontStyles = require(\"../styles/DefaultFontStyles\");\nvar FontClassNames = (0, _buildClassMap.buildClassMap)((0, _defaultFontStyles.DefaultFontStyles));\n\n},{\"../utilities/buildClassMap\":\"6nwnu\",\"../styles/DefaultFontStyles\":\"grmh2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fSJQC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ColorClassNames\", ()=>ColorClassNames);\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _defaultPalette = require(\"../styles/DefaultPalette\");\nvar _index = require(\"../styles/index\");\nvar ColorClassNames = {};\nfor(var colorName in 0, _defaultPalette.DefaultPalette)if ((0, _defaultPalette.DefaultPalette).hasOwnProperty(colorName)) {\n    // Foreground color\n    _defineGetter(ColorClassNames, colorName, \"\", false, \"color\");\n    // Hover color\n    _defineGetter(ColorClassNames, colorName, \"Hover\", true, \"color\");\n    // Background color\n    _defineGetter(ColorClassNames, colorName, \"Background\", false, \"background\");\n    // Background hover\n    _defineGetter(ColorClassNames, colorName, \"BackgroundHover\", true, \"background\");\n    // Border color\n    _defineGetter(ColorClassNames, colorName, \"Border\", false, \"borderColor\");\n    // Border hover color\n    _defineGetter(ColorClassNames, colorName, \"BorderHover\", true, \"borderColor\");\n}\n/**\n * Defines a getter for the given class configuration.\n */ function _defineGetter(obj, colorName1, suffix, isHover, cssProperty) {\n    Object.defineProperty(obj, colorName1 + suffix, {\n        get: function() {\n            var _a;\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            var style = (_a = {}, _a[cssProperty] = (0, _index.getTheme)().palette[colorName1], _a);\n            return (0, _mergeStyles.mergeStyles)(isHover ? {\n                selectors: {\n                    \":hover\": style\n                }\n            } : style).toString();\n        },\n        enumerable: true,\n        configurable: true\n    });\n}\n\n},{\"@uifabric/merge-styles\":\"7c43M\",\"../styles/DefaultPalette\":\"fgXko\",\"../styles/index\":\"l8ssX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hF3SI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getIconContent\", ()=>getIconContent);\nparcelHelpers.export(exports, \"FontIcon\", ()=>FontIcon);\nparcelHelpers.export(exports, \"getFontIcon\", ()=>getFontIcon);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _iconStyles = require(\"./Icon.styles\");\nvar _utilities = require(\"../../Utilities\");\nvar _styling = require(\"../../Styling\");\nvar getIconContent = (0, _utilities.memoizeFunction)(function(iconName) {\n    var _a = (0, _styling.getIcon)(iconName) || {\n        subset: {},\n        code: undefined\n    }, code = _a.code, subset = _a.subset;\n    if (!code) return null;\n    return {\n        children: code,\n        iconClassName: subset.className,\n        fontFamily: subset.fontFace && subset.fontFace.fontFamily,\n        mergeImageProps: subset.mergeImageProps\n    };\n}, undefined, true);\nvar FontIcon = function(props) {\n    var iconName = props.iconName, className = props.className, _a = props.style, style = _a === void 0 ? {} : _a;\n    var iconContent = getIconContent(iconName) || {};\n    var iconClassName = iconContent.iconClassName, children = iconContent.children, fontFamily = iconContent.fontFamily, mergeImageProps = iconContent.mergeImageProps;\n    var nativeProps = (0, _utilities.getNativeProps)(props, (0, _utilities.htmlElementProperties));\n    var accessibleName = props[\"aria-label\"] || props.title;\n    var containerProps = props[\"aria-label\"] || props[\"aria-labelledby\"] || props.title ? {\n        role: mergeImageProps ? undefined : \"img\"\n    } : {\n        \"aria-hidden\": true\n    };\n    var finalChildren = children;\n    if (mergeImageProps) {\n        if (typeof children === \"object\" && typeof children.props === \"object\" && accessibleName) finalChildren = _react.cloneElement(children, {\n            alt: accessibleName\n        });\n    }\n    return _react.createElement(\"i\", (0, _tslib.__assign)({\n        \"data-icon-name\": iconName\n    }, containerProps, nativeProps, mergeImageProps ? {\n        title: undefined,\n        \"aria-label\": undefined\n    } : {}, {\n        className: (0, _utilities.css)((0, _iconStyles.MS_ICON), (0, _iconStyles.classNames).root, iconClassName, !iconName && (0, _iconStyles.classNames).placeholder, className),\n        // Apply the font family this way to ensure it doesn't get overridden by Fabric Core ms-Icon styles\n        // https://github.com/microsoft/fluentui/issues/10449\n        style: (0, _tslib.__assign)({\n            fontFamily: fontFamily\n        }, style)\n    }), finalChildren);\n};\nvar getFontIcon = (0, _utilities.memoizeFunction)(function(iconName, className, ariaLabel) {\n    return FontIcon({\n        iconName: iconName,\n        className: className,\n        \"aria-label\": ariaLabel\n    });\n});\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./Icon.styles\":\"VR1bq\",\"../../Utilities\":\"2F07a\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"VR1bq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"classNames\", ()=>classNames);\nparcelHelpers.export(exports, \"MS_ICON\", ()=>MS_ICON);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar classNames = (0, _styling.mergeStyleSets)({\n    root: {\n        display: \"inline-block\"\n    },\n    placeholder: [\n        \"ms-Icon-placeHolder\",\n        {\n            width: \"1em\"\n        }, \n    ],\n    image: [\n        \"ms-Icon-imageContainer\",\n        {\n            overflow: \"hidden\"\n        }, \n    ]\n});\nvar MS_ICON = \"ms-Icon\";\nvar getStyles = function(props) {\n    var className = props.className, iconClassName = props.iconClassName, isPlaceholder = props.isPlaceholder, isImage = props.isImage, styles = props.styles;\n    return {\n        root: [\n            isPlaceholder && classNames.placeholder,\n            classNames.root,\n            isImage && classNames.image,\n            iconClassName,\n            className,\n            styles && styles.root,\n            // eslint-disable-next-line deprecation/deprecation\n            styles && styles.imageContainer, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"79fqz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ImageIcon\", ()=>ImageIcon);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _image = require(\"../Image/Image\");\nvar _utilities = require(\"../../Utilities\");\nvar _iconStyles = require(\"./Icon.styles\");\nvar ImageIcon = function(props) {\n    var className = props.className, imageProps = props.imageProps;\n    var nativeProps = (0, _utilities.getNativeProps)(props, (0, _utilities.htmlElementProperties));\n    var containerProps = props[\"aria-label\"] ? {} : {\n        role: \"presentation\",\n        \"aria-hidden\": imageProps.alt || imageProps[\"aria-labelledby\"] ? false : true\n    };\n    return _react.createElement(\"div\", (0, _tslib.__assign)({}, containerProps, nativeProps, {\n        className: (0, _utilities.css)((0, _iconStyles.MS_ICON), (0, _iconStyles.classNames).root, (0, _iconStyles.classNames).image, className)\n    }), _react.createElement((0, _image.Image), (0, _tslib.__assign)({}, imageProps)));\n};\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../Image/Image\":\"6yAAQ\",\"../../Utilities\":\"2F07a\",\"./Icon.styles\":\"VR1bq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kARBR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DirectionalHint\", ()=>DirectionalHint);\nvar DirectionalHint = {\n    /**\n     * Appear above the target element, with the left edges of the callout and target aligning.\n     */ topLeftEdge: 0,\n    /**\n     * Appear above the target element, with the centers of the callout and target aligning.\n     */ topCenter: 1,\n    /**\n     * Appear above the target element, with the right edges of the callout and target aligning.\n     */ topRightEdge: 2,\n    /**\n     * Appear above the target element, aligning with the target element such that the callout tends toward\n     * the center of the screen.\n     */ topAutoEdge: 3,\n    /**\n     * Appear below the target element, with the left edges of the callout and target aligning.\n     */ bottomLeftEdge: 4,\n    /**\n     * Appear below the target element, with the centers of the callout and target aligning.\n     */ bottomCenter: 5,\n    /**\n     * Appear below the target element, with the right edges of the callout and target aligning.\n     */ bottomRightEdge: 6,\n    /**\n     * Appear below the target element, aligning with the target element such that the callout tends toward\n     * the center of the screen.\n     */ bottomAutoEdge: 7,\n    /**\n     * Appear to the left of the target element, with the top edges of the callout and target aligning.\n     */ leftTopEdge: 8,\n    /**\n     * Appear to the left of the target element, with the centers of the callout and target aligning.\n     */ leftCenter: 9,\n    /**\n     * Appear to the left of the target element, with the bottom edges of the callout and target aligning.\n     */ leftBottomEdge: 10,\n    /**\n     * Appear to the right of the target element, with the top edges of the callout and target aligning.\n     */ rightTopEdge: 11,\n    /**\n     * Appear to the right of the target element, with the centers of the callout and target aligning.\n     */ rightCenter: 12,\n    /**\n     * Appear to the right of the target element, with the bottom edges of the callout and target aligning.\n     */ rightBottomEdge: 13\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Q8DP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/ContextualMenu/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/ContextualMenu/index\":\"5mNf6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5mNf6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getMenuItemStyles\", ()=>(0, _contextualMenuCnstyles.getMenuItemStyles));\nvar _contextualMenu = require(\"./ContextualMenu\");\nparcelHelpers.exportAll(_contextualMenu, exports);\nvar _contextualMenuBase = require(\"./ContextualMenu.base\");\nparcelHelpers.exportAll(_contextualMenuBase, exports);\nvar _contextualMenuTypes = require(\"./ContextualMenu.types\");\nparcelHelpers.exportAll(_contextualMenuTypes, exports);\nvar _contextualMenuItem = require(\"./ContextualMenuItem\");\nparcelHelpers.exportAll(_contextualMenuItem, exports);\nvar _contextualMenuItemBase = require(\"./ContextualMenuItem.base\");\nparcelHelpers.exportAll(_contextualMenuItemBase, exports);\nvar _contextualMenuCnstyles = require(\"./ContextualMenu.cnstyles\");\n\n},{\"./ContextualMenu\":\"dEuK9\",\"./ContextualMenu.base\":\"3kdQc\",\"./ContextualMenu.types\":\"jFA13\",\"./ContextualMenuItem\":\"1A0Og\",\"./ContextualMenuItem.base\":\"6r00d\",\"./ContextualMenu.cnstyles\":\"5SyP0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dEuK9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ContextualMenu\", ()=>ContextualMenu);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _contextualMenuBase = require(\"./ContextualMenu.base\");\nvar _contextualMenuStyles = require(\"./ContextualMenu.styles\");\nfunction onRenderSubMenu(subMenuProps) {\n    return _react.createElement(LocalContextualMenu, (0, _tslib.__assign)({}, subMenuProps));\n}\n// This is to prevent cyclic import with ContextualMenu.base.tsx.\nvar LocalContextualMenu = (0, _utilities.styled)((0, _contextualMenuBase.ContextualMenuBase), (0, _contextualMenuStyles.getStyles), function(props) {\n    return {\n        onRenderSubMenu: props.onRenderSubMenu ? (0, _utilities.composeRenderFunction)(props.onRenderSubMenu, onRenderSubMenu) : onRenderSubMenu\n    };\n}, {\n    scope: \"ContextualMenu\"\n});\nvar ContextualMenu = LocalContextualMenu;\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"./ContextualMenu.base\":\"3kdQc\",\"./ContextualMenu.styles\":\"jbJON\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3kdQc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSubmenuItems\", ()=>getSubmenuItems);\n/**\n * Returns true if a list of menu items can contain a checkbox\n */ parcelHelpers.export(exports, \"canAnyMenuItemsCheck\", ()=>canAnyMenuItemsCheck);\nparcelHelpers.export(exports, \"ContextualMenuBase\", ()=>ContextualMenuBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _contextualMenuTypes = require(\"./ContextualMenu.types\");\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nvar _focusZone = require(\"../../FocusZone\");\nvar _utilities = require(\"../../Utilities\");\nvar _index = require(\"../../utilities/contextualMenu/index\");\nvar _withResponsiveMode = require(\"../../utilities/decorators/withResponsiveMode\");\nvar _callout = require(\"../../Callout\");\nvar _contextualMenuItem = require(\"./ContextualMenuItem\");\nvar _index1 = require(\"./ContextualMenuItemWrapper/index\");\nvar _styling = require(\"../../Styling\");\nvar _contextualMenuClassNames = require(\"./ContextualMenu.classNames\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar getContextualMenuItemClassNames = (0, _utilities.classNamesFunction)();\nfunction getSubmenuItems(item, options) {\n    var _a;\n    var target = (_a = options) === null || _a === void 0 ? void 0 : _a.target;\n    // eslint-disable-next-line deprecation/deprecation\n    var items = item.subMenuProps ? item.subMenuProps.items : item.items;\n    if (items) {\n        var overrideItems = [];\n        for(var _i = 0, items_1 = items; _i < items_1.length; _i++){\n            var subItem = items_1[_i];\n            if (subItem.preferMenuTargetAsEventTarget) {\n                // For sub-items which need an overridden target, intercept `onClick`\n                var onClick = subItem.onClick, contextItem = (0, _tslib.__rest)(subItem, [\n                    \"onClick\"\n                ]);\n                overrideItems.push((0, _tslib.__assign)((0, _tslib.__assign)({}, contextItem), {\n                    onClick: getOnClickWithOverrideTarget(onClick, target)\n                }));\n            } else overrideItems.push(subItem);\n        }\n        return overrideItems;\n    }\n}\nfunction canAnyMenuItemsCheck(items) {\n    return items.some(function(item) {\n        if (item.canCheck) return true;\n        // If the item is a section, check if any of the items in the section can check.\n        if (item.sectionProps && item.sectionProps.items.some(function(submenuItem) {\n            return submenuItem.canCheck === true;\n        })) return true;\n        return false;\n    });\n}\nvar NavigationIdleDelay = 250; /* ms */ \nvar COMPONENT_NAME = \"ContextualMenu\";\nvar _getMenuItemStylesFunction = (0, _utilities.memoizeFunction)(function() {\n    var styles = [];\n    for(var _i = 0; _i < arguments.length; _i++)styles[_i] = arguments[_i];\n    return function(styleProps) {\n        return (0, _styling.concatStyleSetsWithProps).apply(void 0, (0, _tslib.__spreadArrays)([\n            styleProps,\n            (0, _contextualMenuClassNames.getItemStyles)\n        ], styles));\n    };\n});\nvar ContextualMenuBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ContextualMenuBase1, _super);\n    function ContextualMenuBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._mounted = false;\n        _this.dismiss = function(ev, dismissAll) {\n            var onDismiss = _this.props.onDismiss;\n            if (onDismiss) onDismiss(ev, dismissAll);\n        };\n        _this._tryFocusPreviousActiveElement = function(options) {\n            if (_this.props.onRestoreFocus) _this.props.onRestoreFocus(options);\n            else {\n                if (options && options.containsFocus && _this._previousActiveElement) // Make sure that the focus method actually exists\n                // In some cases the object might exist but not be a real element.\n                // This is primarily for IE 11 and should be removed once IE 11 is no longer in use.\n                {\n                    if (_this._previousActiveElement.focus) _this._previousActiveElement.focus();\n                }\n            }\n        };\n        _this._onRenderMenuList = function(menuListProps, defaultRender) {\n            var indexCorrection = 0;\n            var items = menuListProps.items, totalItemCount = menuListProps.totalItemCount, hasCheckmarks = menuListProps.hasCheckmarks, hasIcons = menuListProps.hasIcons;\n            return _react.createElement(\"ul\", {\n                className: _this._classNames.list,\n                onKeyDown: _this._onKeyDown,\n                onKeyUp: _this._onKeyUp,\n                role: \"presentation\"\n            }, items.map(function(item, index) {\n                var menuItem = _this._renderMenuItem(item, index, indexCorrection, totalItemCount, hasCheckmarks, hasIcons);\n                if (item.itemType !== (0, _contextualMenuTypes.ContextualMenuItemType).Divider && item.itemType !== (0, _contextualMenuTypes.ContextualMenuItemType).Header) {\n                    var indexIncrease = item.customOnRenderListLength ? item.customOnRenderListLength : 1;\n                    indexCorrection += indexIncrease;\n                }\n                return menuItem;\n            }));\n        };\n        /**\n         * !!!IMPORTANT!!! Avoid mutating `item: IContextualMenuItem` argument. It will\n         * cause the menu items to always re-render because the component update is based on shallow comparison.\n         */ _this._renderMenuItem = function(item, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons) {\n            var _a;\n            var renderedItems = [];\n            var iconProps = item.iconProps || {\n                iconName: \"None\"\n            };\n            var getItemClassNames = item.getItemClassNames, itemProps = item.itemProps;\n            var styles = itemProps ? itemProps.styles : undefined;\n            // We only send a dividerClassName when the item to be rendered is a divider.\n            // For all other cases, the default divider style is used.\n            var dividerClassName = item.itemType === (0, _contextualMenuTypes.ContextualMenuItemType).Divider ? item.className : undefined;\n            var subMenuIconClassName = item.submenuIconProps ? item.submenuIconProps.className : \"\";\n            // eslint-disable-next-line deprecation/deprecation\n            var itemClassNames;\n            // IContextualMenuItem#getItemClassNames for backwards compatibility\n            // otherwise uses mergeStyles for class names.\n            if (getItemClassNames) itemClassNames = getItemClassNames(_this.props.theme, (0, _index.isItemDisabled)(item), _this.state.expandedMenuItemKey === item.key, !!(0, _index.getIsChecked)(item), !!item.href, iconProps.iconName !== \"None\", item.className, dividerClassName, iconProps.className, subMenuIconClassName, item.primaryDisabled);\n            else {\n                var itemStyleProps = {\n                    theme: _this.props.theme,\n                    disabled: (0, _index.isItemDisabled)(item),\n                    expanded: _this.state.expandedMenuItemKey === item.key,\n                    checked: !!(0, _index.getIsChecked)(item),\n                    isAnchorLink: !!item.href,\n                    knownIcon: iconProps.iconName !== \"None\",\n                    itemClassName: item.className,\n                    dividerClassName: dividerClassName,\n                    iconClassName: iconProps.className,\n                    subMenuClassName: subMenuIconClassName,\n                    primaryDisabled: item.primaryDisabled\n                };\n                // We need to generate default styles then override if styles are provided\n                // since the ContextualMenu currently handles item classNames.\n                itemClassNames = getContextualMenuItemClassNames(_getMenuItemStylesFunction((_a = _this._classNames.subComponentStyles) === null || _a === void 0 ? void 0 : _a.menuItem, styles), itemStyleProps);\n            }\n            // eslint-disable-next-line deprecation/deprecation\n            if (item.text === \"-\" || item.name === \"-\") item.itemType = (0, _contextualMenuTypes.ContextualMenuItemType).Divider;\n            switch(item.itemType){\n                case (0, _contextualMenuTypes.ContextualMenuItemType).Divider:\n                    renderedItems.push(_this._renderSeparator(index, itemClassNames));\n                    break;\n                case (0, _contextualMenuTypes.ContextualMenuItemType).Header:\n                    renderedItems.push(_this._renderSeparator(index, itemClassNames));\n                    var headerItem = _this._renderHeaderMenuItem(item, itemClassNames, index, hasCheckmarks, hasIcons);\n                    renderedItems.push(_this._renderListItem(headerItem, item.key || index, itemClassNames, item.title));\n                    break;\n                case (0, _contextualMenuTypes.ContextualMenuItemType).Section:\n                    renderedItems.push(_this._renderSectionItem(item, itemClassNames, index, hasCheckmarks, hasIcons));\n                    break;\n                default:\n                    var menuItem = _this._renderNormalItem(item, itemClassNames, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons);\n                    renderedItems.push(_this._renderListItem(menuItem, item.key || index, itemClassNames, item.title));\n                    break;\n            }\n            // Since multiple nodes *could* be rendered, wrap them all in a fragment with this item's key.\n            // This ensures the reconciler handles multi-item output per-node correctly and does not re-mount content.\n            return _react.createElement(_react.Fragment, {\n                key: item.key\n            }, renderedItems);\n        };\n        _this._defaultMenuItemRenderer = function(item) {\n            var index = item.index, focusableElementIndex = item.focusableElementIndex, totalItemCount = item.totalItemCount, hasCheckmarks = item.hasCheckmarks, hasIcons = item.hasIcons;\n            return _this._renderMenuItem(item, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons);\n        };\n        _this._onKeyDown = function(ev) {\n            // Take note if we are processing an alt (option) or meta (command) keydown.\n            // See comment in _shouldHandleKeyUp for reasoning.\n            _this._lastKeyDownWasAltOrMeta = _this._isAltOrMeta(ev);\n            // On Mac, pressing escape dismisses all levels of native context menus\n            var dismissAllMenus = ev.which === (0, _utilities.KeyCodes).escape && ((0, _utilities.isMac)() || (0, _utilities.isIOS)());\n            return _this._keyHandler(ev, _this._shouldHandleKeyDown, dismissAllMenus);\n        };\n        _this._shouldHandleKeyDown = function(ev) {\n            return ev.which === (0, _utilities.KeyCodes).escape || _this._shouldCloseSubMenu(ev) || ev.which === (0, _utilities.KeyCodes).up && (ev.altKey || ev.metaKey);\n        };\n        _this._onMenuFocusCapture = function(ev) {\n            if (_this.props.delayUpdateFocusOnHover) _this._shouldUpdateFocusOnMouseEvent = true;\n        };\n        _this._onKeyUp = function(ev) {\n            return _this._keyHandler(ev, _this._shouldHandleKeyUp, true);\n        };\n        /**\n         * We close the menu on key up only if ALL of the following are true:\n         * - Most recent key down was alt or meta (command)\n         * - The alt/meta key down was NOT followed by some other key (such as down/up arrow to\n         *   expand/collapse the menu)\n         * - We're not on a Mac (or iOS)\n         *\n         * This is because on Windows, pressing alt moves focus to the application menu bar or similar,\n         * closing any open context menus. There is not a similar behavior on Macs.\n         */ _this._shouldHandleKeyUp = function(ev) {\n            var keyPressIsAltOrMetaAlone = _this._lastKeyDownWasAltOrMeta && _this._isAltOrMeta(ev);\n            _this._lastKeyDownWasAltOrMeta = false;\n            return !!keyPressIsAltOrMetaAlone && !((0, _utilities.isIOS)() || (0, _utilities.isMac)());\n        };\n        /**\n         * Calls `shouldHandleKey` to determine whether the keyboard event should be handled;\n         * if so, stops event propagation and dismisses menu(s).\n         * @param ev - The keyboard event.\n         * @param shouldHandleKey - Returns whether we should handle this keyboard event.\n         * @param dismissAllMenus - If true, dismiss all menus. Otherwise, dismiss only the current menu.\n         * Only does anything if `shouldHandleKey` returns true.\n         * @returns Whether the event was handled.\n         */ _this._keyHandler = function(ev, shouldHandleKey, dismissAllMenus) {\n            var handled = false;\n            if (shouldHandleKey(ev)) {\n                _this._focusingPreviousElement = true;\n                _this.dismiss(ev, dismissAllMenus);\n                ev.preventDefault();\n                ev.stopPropagation();\n                handled = true;\n            }\n            return handled;\n        };\n        /**\n         * Checks if the submenu should be closed\n         */ _this._shouldCloseSubMenu = function(ev) {\n            var submenuCloseKey = (0, _utilities.getRTL)(_this.props.theme) ? (0, _utilities.KeyCodes).right : (0, _utilities.KeyCodes).left;\n            if (ev.which !== submenuCloseKey || !_this.props.isSubMenu) return false;\n            return _this._adjustedFocusZoneProps.direction === (0, _focusZone.FocusZoneDirection).vertical || !!_this._adjustedFocusZoneProps.checkForNoWrap && !(0, _utilities.shouldWrapFocus)(ev.target, \"data-no-horizontal-wrap\");\n        };\n        _this._onMenuKeyDown = function(ev) {\n            // Mark as handled if onKeyDown returns true (for handling collapse cases)\n            // or if we are attempting to expand a submenu\n            var handled = _this._onKeyDown(ev);\n            if (handled || !_this._host) return;\n            // If we have a modifier key being pressed, we do not want to move focus.\n            // Otherwise, handle up and down keys.\n            var hasModifier = !!(ev.altKey || ev.metaKey);\n            var isUp = ev.which === (0, _utilities.KeyCodes).up;\n            var isDown = ev.which === (0, _utilities.KeyCodes).down;\n            if (!hasModifier && (isUp || isDown)) {\n                var elementToFocus = isUp ? (0, _utilities.getLastFocusable)(_this._host, _this._host.lastChild, true) : (0, _utilities.getFirstFocusable)(_this._host, _this._host.firstChild, true);\n                if (elementToFocus) {\n                    elementToFocus.focus();\n                    ev.preventDefault();\n                    ev.stopPropagation();\n                }\n            }\n        };\n        /**\n         * Scroll handler for the callout to make sure the mouse events\n         * for updating focus are not interacting during scroll\n         */ _this._onScroll = function() {\n            if (!_this._isScrollIdle && _this._scrollIdleTimeoutId !== undefined) {\n                _this._async.clearTimeout(_this._scrollIdleTimeoutId);\n                _this._scrollIdleTimeoutId = undefined;\n            } else _this._isScrollIdle = false;\n            _this._scrollIdleTimeoutId = _this._async.setTimeout(function() {\n                _this._isScrollIdle = true;\n            }, NavigationIdleDelay);\n        };\n        _this._onItemMouseEnterBase = function(item, ev, target) {\n            if (_this._shouldIgnoreMouseEvent()) return;\n            _this._updateFocusOnMouseEvent(item, ev, target);\n        };\n        _this._onItemMouseMoveBase = function(item, ev, target) {\n            var targetElement = ev.currentTarget;\n            // Always do this check to make sure we record a mouseMove if needed (even if we are timed out)\n            if (_this._shouldUpdateFocusOnMouseEvent) _this._gotMouseMove = true;\n            else return;\n            if (!_this._isScrollIdle || _this._enterTimerId !== undefined || targetElement === _this._targetWindow.document.activeElement) return;\n            _this._updateFocusOnMouseEvent(item, ev, target);\n        };\n        _this._onMouseItemLeave = function(item, ev) {\n            if (_this._shouldIgnoreMouseEvent()) return;\n            if (_this._enterTimerId !== undefined) {\n                _this._async.clearTimeout(_this._enterTimerId);\n                _this._enterTimerId = undefined;\n            }\n            if (_this.state.expandedMenuItemKey !== undefined) return;\n            /**\n             * IE11 focus() method forces parents to scroll to top of element.\n             * Edge and IE expose a setActive() function for focusable divs that\n             * sets the page focus but does not scroll the parent element.\n             */ if (_this._host.setActive) try {\n                _this._host.setActive();\n            } catch (e) {\n            /* no-op */ }\n            else _this._host.focus();\n        };\n        _this._onItemMouseDown = function(item, ev) {\n            if (item.onMouseDown) item.onMouseDown(item, ev);\n        };\n        _this._onItemClick = function(item, ev) {\n            _this._onItemClickBase(item, ev, ev.currentTarget);\n        };\n        _this._onItemClickBase = function(item, ev, target) {\n            var menuTarget = _this.props.target;\n            var items = getSubmenuItems(item, {\n                target: menuTarget\n            });\n            // Cancel a async menu item hover timeout action from being taken and instead\n            // just trigger the click event instead.\n            _this._cancelSubMenuTimer();\n            if (!(0, _index.hasSubmenu)(item) && (!items || !items.length)) // This is an item without a menu. Click it.\n            _this._executeItemClick(item, ev);\n            else if (item.key !== _this.state.expandedMenuItemKey) {\n                // This has a collapsed sub menu. Expand it.\n                _this.setState({\n                    // When Edge + Narrator are used together (regardless of if the button is in a form or not), pressing\n                    // \"Enter\" fires this method and not _onMenuKeyDown. Checking ev.nativeEvent.detail differentiates\n                    // between a real click event and a keypress event (detail should be the number of mouse clicks).\n                    // ...Plot twist! For a real click event in IE 11, detail is always 0 (Edge sets it properly to 1).\n                    // So we also check the pointerType property, which both Edge and IE set to \"mouse\" for real clicks\n                    // and \"\" for pressing \"Enter\" with Narrator on.\n                    expandedByMouseClick: ev.nativeEvent.detail !== 0 || ev.nativeEvent.pointerType === \"mouse\"\n                });\n                _this._onItemSubMenuExpand(item, target);\n            }\n            ev.stopPropagation();\n            ev.preventDefault();\n        };\n        _this._onAnchorClick = function(item, ev) {\n            _this._executeItemClick(item, ev);\n            ev.stopPropagation();\n        };\n        _this._executeItemClick = function(item, ev) {\n            var menuTarget = _this.props.target;\n            if (item.disabled || item.isDisabled) return;\n            if (item.preferMenuTargetAsEventTarget) overrideTarget(ev, menuTarget);\n            var dismiss = false;\n            if (item.onClick) dismiss = !!item.onClick(ev, item);\n            else if (_this.props.onItemClick) dismiss = !!_this.props.onItemClick(ev, item);\n            if (dismiss || !ev.defaultPrevented) {\n                _this.dismiss(ev, true);\n                // This should be removed whenever possible.\n                // This ensures that the hidden dismissal action maintains the same behavior.\n                // If the menu is being dismissed then the previously focused element should\n                // get focused since the dismiss was triggered by a user click on an item\n                // Rather than focus being lost.\n                _this._focusingPreviousElement = true;\n            }\n        };\n        _this._onItemKeyDown = function(item, ev) {\n            var openKey = (0, _utilities.getRTL)(_this.props.theme) ? (0, _utilities.KeyCodes).left : (0, _utilities.KeyCodes).right;\n            if (!item.disabled && (ev.which === openKey || ev.which === (0, _utilities.KeyCodes).enter || ev.which === (0, _utilities.KeyCodes).down && (ev.altKey || ev.metaKey))) {\n                _this.setState({\n                    expandedByMouseClick: false\n                });\n                _this._onItemSubMenuExpand(item, ev.currentTarget);\n                ev.preventDefault();\n            }\n        };\n        // Cancel a async menu item hover timeout action from being taken and instead\n        // do new upcoming behavior\n        _this._cancelSubMenuTimer = function() {\n            if (_this._enterTimerId !== undefined) {\n                _this._async.clearTimeout(_this._enterTimerId);\n                _this._enterTimerId = undefined;\n            }\n        };\n        _this._onItemSubMenuExpand = function(item, target) {\n            if (_this.state.expandedMenuItemKey !== item.key) {\n                if (_this.state.expandedMenuItemKey) _this._onSubMenuDismiss();\n                // Focus the target to ensure when we close it, we're focusing on the correct element.\n                target.focus();\n                _this.setState({\n                    expandedMenuItemKey: item.key,\n                    submenuTarget: target\n                });\n            }\n        };\n        /**\n         * This function is called ASYNCHRONOUSLY, and so there is a chance it is called\n         * after the component is unmounted. The _mounted property is added to prevent\n         * from calling setState() after unmount. Do NOT copy this pattern in synchronous\n         * code.\n         */ _this._onSubMenuDismiss = function(ev, dismissAll) {\n            if (dismissAll) _this.dismiss(ev, dismissAll);\n            else if (_this._mounted) _this.setState({\n                dismissedMenuItemKey: _this.state.expandedMenuItemKey,\n                expandedMenuItemKey: undefined,\n                submenuTarget: undefined\n            });\n        };\n        _this._onPointerAndTouchEvent = function(ev) {\n            _this._cancelSubMenuTimer();\n        };\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._events = new (0, _utilities.EventGroup)(_this);\n        (0, _utilities.initializeComponentRef)(_this);\n        (0, _utilities.warnDeprecations)(COMPONENT_NAME, props, {\n            getMenuClassNames: \"styles\"\n        });\n        _this.state = {\n            contextualMenuItems: undefined,\n            subMenuId: (0, _utilities.getId)(\"ContextualMenu\")\n        };\n        _this._id = props.id || (0, _utilities.getId)(\"ContextualMenu\");\n        _this._focusingPreviousElement = false;\n        _this._isScrollIdle = true;\n        _this._shouldUpdateFocusOnMouseEvent = !_this.props.delayUpdateFocusOnHover;\n        _this._gotMouseMove = false;\n        return _this;\n    }\n    ContextualMenuBase1.prototype.shouldComponentUpdate = function(newProps, newState) {\n        if (!newProps.shouldUpdateWhenHidden && this.props.hidden && newProps.hidden) // Do not update when hidden.\n        return false;\n        return !(0, _utilities.shallowCompare)(this.props, newProps) || !(0, _utilities.shallowCompare)(this.state, newState);\n    };\n    ContextualMenuBase1.prototype.UNSAFE_componentWillUpdate = function(newProps) {\n        if (newProps.target !== this.props.target) {\n            var newTarget = newProps.target;\n            this._setTargetWindowAndElement(newTarget);\n        }\n        if (this._isHidden(newProps) !== this._isHidden(this.props)) {\n            if (this._isHidden(newProps)) this._onMenuClosed();\n            else {\n                this._onMenuOpened();\n                this._previousActiveElement = this._targetWindow ? this._targetWindow.document.activeElement : undefined;\n            }\n        }\n        if (newProps.delayUpdateFocusOnHover !== this.props.delayUpdateFocusOnHover) {\n            // update shouldUpdateFocusOnMouseEvent to follow what was passed in\n            this._shouldUpdateFocusOnMouseEvent = !newProps.delayUpdateFocusOnHover;\n            // If shouldUpdateFocusOnMouseEvent is false, we need to reset gotMouseMove to false\n            this._gotMouseMove = this._shouldUpdateFocusOnMouseEvent && this._gotMouseMove;\n        }\n    };\n    // Invoked once, both on the client and server, immediately before the initial rendering occurs.\n    ContextualMenuBase1.prototype.UNSAFE_componentWillMount = function() {\n        var target = this.props.target;\n        this._setTargetWindowAndElement(target);\n        if (!this.props.hidden) this._previousActiveElement = this._targetWindow ? this._targetWindow.document.activeElement : undefined;\n    };\n    // Invoked once, only on the client (not on the server), immediately after the initial rendering occurs.\n    ContextualMenuBase1.prototype.componentDidMount = function() {\n        if (!this.props.hidden) this._onMenuOpened();\n        this._mounted = true;\n    };\n    // Invoked immediately before a component is unmounted from the DOM.\n    ContextualMenuBase1.prototype.componentWillUnmount = function() {\n        if (this.props.onMenuDismissed) this.props.onMenuDismissed(this.props);\n        this._events.dispose();\n        this._async.dispose();\n        this._mounted = false;\n    };\n    ContextualMenuBase1.prototype.render = function() {\n        var _this = this;\n        var isBeakVisible = this.props.isBeakVisible;\n        var _a = this.props, items = _a.items, labelElementId = _a.labelElementId, id = _a.id, className = _a.className, beakWidth = _a.beakWidth, directionalHint = _a.directionalHint, directionalHintForRTL = _a.directionalHintForRTL, alignTargetEdge = _a.alignTargetEdge, gapSpace = _a.gapSpace, coverTarget = _a.coverTarget, ariaLabel = _a.ariaLabel, doNotLayer = _a.doNotLayer, target = _a.target, bounds = _a.bounds, useTargetWidth = _a.useTargetWidth, useTargetAsMinWidth = _a.useTargetAsMinWidth, directionalHintFixed = _a.directionalHintFixed, shouldFocusOnMount = _a.shouldFocusOnMount, shouldFocusOnContainer = _a.shouldFocusOnContainer, title = _a.title, styles = _a.styles, theme = _a.theme, calloutProps = _a.calloutProps, _b = _a.onRenderSubMenu, onRenderSubMenu = _b === void 0 ? this._onRenderSubMenu : _b, _c = _a.onRenderMenuList, onRenderMenuList = _c === void 0 ? this._onRenderMenuList : _c, focusZoneProps = _a.focusZoneProps, // eslint-disable-next-line deprecation/deprecation\n        getMenuClassNames = _a.getMenuClassNames;\n        this._classNames = getMenuClassNames ? getMenuClassNames(theme, className) : getClassNames(styles, {\n            theme: theme,\n            className: className\n        });\n        var hasIcons = itemsHaveIcons(items);\n        function itemsHaveIcons(contextualMenuItems) {\n            for(var _i = 0, contextualMenuItems_1 = contextualMenuItems; _i < contextualMenuItems_1.length; _i++){\n                var item = contextualMenuItems_1[_i];\n                if (item.iconProps) return true;\n                if (item.itemType === (0, _contextualMenuTypes.ContextualMenuItemType).Section && item.sectionProps && itemsHaveIcons(item.sectionProps.items)) return true;\n            }\n            return false;\n        }\n        this._adjustedFocusZoneProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, focusZoneProps), {\n            direction: this._getFocusZoneDirection()\n        });\n        var hasCheckmarks = canAnyMenuItemsCheck(items);\n        var submenuProps = this.state.expandedMenuItemKey && this.props.hidden !== true ? this._getSubmenuProps() : null;\n        isBeakVisible = isBeakVisible === undefined ? this.props.responsiveMode <= (0, _withResponsiveMode.ResponsiveMode).medium : isBeakVisible;\n        /**\n         * When useTargetWidth is true, get the width of the target element and apply it for the context menu container\n         */ var contextMenuStyle;\n        var targetAsHtmlElement = this._target;\n        if ((useTargetWidth || useTargetAsMinWidth) && targetAsHtmlElement && targetAsHtmlElement.offsetWidth) {\n            var targetBoundingRect = targetAsHtmlElement.getBoundingClientRect();\n            var targetWidth = targetBoundingRect.width - 2; /* Accounts for 1px border */ \n            if (useTargetWidth) contextMenuStyle = {\n                width: targetWidth\n            };\n            else if (useTargetAsMinWidth) contextMenuStyle = {\n                minWidth: targetWidth\n            };\n        }\n        // The menu should only return if items were provided, if no items were provided then it should not appear.\n        if (items && items.length > 0) {\n            var totalItemCount = 0;\n            for(var _i1 = 0, items_2 = items; _i1 < items_2.length; _i1++){\n                var item1 = items_2[_i1];\n                if (item1.itemType !== (0, _contextualMenuTypes.ContextualMenuItemType).Divider && item1.itemType !== (0, _contextualMenuTypes.ContextualMenuItemType).Header) {\n                    var itemCount = item1.customOnRenderListLength ? item1.customOnRenderListLength : 1;\n                    totalItemCount += itemCount;\n                }\n            }\n            var calloutStyles = this._classNames.subComponentStyles ? this._classNames.subComponentStyles.callout : undefined;\n            return _react.createElement((0, _callout.Callout), (0, _tslib.__assign)({\n                styles: calloutStyles,\n                onRestoreFocus: this._tryFocusPreviousActiveElement\n            }, calloutProps, {\n                target: target,\n                isBeakVisible: isBeakVisible,\n                beakWidth: beakWidth,\n                directionalHint: directionalHint,\n                directionalHintForRTL: directionalHintForRTL,\n                gapSpace: gapSpace,\n                coverTarget: coverTarget,\n                doNotLayer: doNotLayer,\n                className: (0, _utilities.css)(\"ms-ContextualMenu-Callout\", calloutProps && calloutProps.className),\n                setInitialFocus: shouldFocusOnMount,\n                onDismiss: this.props.onDismiss,\n                onScroll: this._onScroll,\n                bounds: bounds,\n                directionalHintFixed: directionalHintFixed,\n                alignTargetEdge: alignTargetEdge,\n                hidden: this.props.hidden\n            }), _react.createElement(\"div\", {\n                style: contextMenuStyle,\n                ref: function(host) {\n                    return _this._host = host;\n                },\n                id: id,\n                className: this._classNames.container,\n                tabIndex: shouldFocusOnContainer ? 0 : -1,\n                onKeyDown: this._onMenuKeyDown,\n                onKeyUp: this._onKeyUp,\n                onFocusCapture: this._onMenuFocusCapture,\n                \"aria-label\": ariaLabel,\n                \"aria-labelledby\": labelElementId,\n                role: \"menu\"\n            }, title && _react.createElement(\"div\", {\n                className: this._classNames.title\n            }, \" \", title, \" \"), items && items.length ? _react.createElement((0, _focusZone.FocusZone), (0, _tslib.__assign)({\n                className: this._classNames.root,\n                isCircularNavigation: true,\n                handleTabKey: (0, _focusZone.FocusZoneTabbableElements).all\n            }, this._adjustedFocusZoneProps), onRenderMenuList({\n                ariaLabel: ariaLabel,\n                items: items,\n                totalItemCount: totalItemCount,\n                hasCheckmarks: hasCheckmarks,\n                hasIcons: hasIcons,\n                defaultMenuItemRenderer: this._defaultMenuItemRenderer,\n                labelElementId: labelElementId\n            }, this._onRenderMenuList)) : null, submenuProps && onRenderSubMenu(submenuProps, this._onRenderSubMenu)));\n        } else return null;\n    };\n    /**\n     * Return whether the contextual menu is hidden.\n     * Undefined value for hidden is equivalent to hidden being false.\n     * @param props - Props for the component\n     */ ContextualMenuBase1.prototype._isHidden = function(props) {\n        return !!props.hidden;\n    };\n    ContextualMenuBase1.prototype._onMenuOpened = function() {\n        this._events.on(this._targetWindow, \"resize\", this.dismiss);\n        this._shouldUpdateFocusOnMouseEvent = !this.props.delayUpdateFocusOnHover;\n        this._gotMouseMove = false;\n        this.props.onMenuOpened && this.props.onMenuOpened(this.props);\n    };\n    ContextualMenuBase1.prototype._onMenuClosed = function() {\n        this._events.off(this._targetWindow, \"resize\", this.dismiss);\n        // This is kept for backwards compatability with hidden for right now.\n        // This preserves the way that this behaved in the past\n        // TODO find a better way to handle this by using the same conventions that\n        // Popup uses to determine if focus is contained when dismissal occurs\n        this._tryFocusPreviousActiveElement({\n            containsFocus: this._focusingPreviousElement,\n            documentContainsFocus: this._targetWindow.document.hasFocus(),\n            originalElement: this._previousActiveElement\n        });\n        this._focusingPreviousElement = false;\n        if (this.props.onMenuDismissed) this.props.onMenuDismissed(this.props);\n        this._shouldUpdateFocusOnMouseEvent = !this.props.delayUpdateFocusOnHover;\n        // We need to dismiss any submenu related state properties,\n        // so that when the menu is shown again, the submenu is collapsed\n        this.setState({\n            expandedByMouseClick: undefined,\n            dismissedMenuItemKey: undefined,\n            expandedMenuItemKey: undefined,\n            submenuTarget: undefined\n        });\n    };\n    /**\n     * Gets the focusZoneDirection by using the arrowDirection if specified,\n     * the direction specificed in the focusZoneProps, or defaults to FocusZoneDirection.vertical\n     */ ContextualMenuBase1.prototype._getFocusZoneDirection = function() {\n        var focusZoneProps = this.props.focusZoneProps;\n        return focusZoneProps && focusZoneProps.direction !== undefined ? focusZoneProps.direction : (0, _focusZone.FocusZoneDirection).vertical;\n    };\n    ContextualMenuBase1.prototype._onRenderSubMenu = function(subMenuProps, defaultRender) {\n        throw Error(\"ContextualMenuBase: onRenderSubMenu callback is null or undefined. Please ensure to set `onRenderSubMenu` property either manually or with `styled` helper.\");\n    };\n    ContextualMenuBase1.prototype._renderSectionItem = function(sectionItem, // eslint-disable-next-line deprecation/deprecation\n    menuClassNames, index, hasCheckmarks, hasIcons) {\n        var _this = this;\n        var sectionProps = sectionItem.sectionProps;\n        if (!sectionProps) return;\n        var headerItem;\n        var groupProps;\n        if (sectionProps.title) {\n            var headerContextualMenuItem = undefined;\n            var ariaLabellledby = \"\";\n            if (typeof sectionProps.title === \"string\") {\n                // Since title is a user-facing string, it needs to be stripped\n                // of whitespace in order to build a valid element ID\n                var id = this._id + sectionProps.title.replace(/\\s/g, \"\");\n                headerContextualMenuItem = {\n                    key: \"section-\" + sectionProps.title + \"-title\",\n                    itemType: (0, _contextualMenuTypes.ContextualMenuItemType).Header,\n                    text: sectionProps.title,\n                    id: id\n                };\n                ariaLabellledby = id;\n            } else {\n                var id = sectionProps.title.id || this._id + sectionProps.title.key.replace(/\\s/g, \"\");\n                headerContextualMenuItem = (0, _tslib.__assign)((0, _tslib.__assign)({}, sectionProps.title), {\n                    id: id\n                });\n                ariaLabellledby = id;\n            }\n            if (headerContextualMenuItem) {\n                groupProps = {\n                    role: \"group\",\n                    \"aria-labelledby\": ariaLabellledby\n                };\n                headerItem = this._renderHeaderMenuItem(headerContextualMenuItem, menuClassNames, index, hasCheckmarks, hasIcons);\n            }\n        }\n        if (sectionProps.items && sectionProps.items.length > 0) return _react.createElement(\"li\", {\n            role: \"presentation\",\n            key: sectionProps.key || sectionItem.key || \"section-\" + index\n        }, _react.createElement(\"div\", (0, _tslib.__assign)({}, groupProps), _react.createElement(\"ul\", {\n            className: this._classNames.list,\n            role: \"presentation\"\n        }, sectionProps.topDivider && this._renderSeparator(index, menuClassNames, true, true), headerItem && this._renderListItem(headerItem, sectionItem.key || index, menuClassNames, sectionItem.title), sectionProps.items.map(function(contextualMenuItem, itemsIndex) {\n            return _this._renderMenuItem(contextualMenuItem, itemsIndex, itemsIndex, sectionProps.items.length, hasCheckmarks, hasIcons);\n        }), sectionProps.bottomDivider && this._renderSeparator(index, menuClassNames, false, true))));\n    };\n    ContextualMenuBase1.prototype._renderListItem = function(content, key, classNames, title) {\n        return _react.createElement(\"li\", {\n            role: \"presentation\",\n            title: title,\n            key: key,\n            className: classNames.item\n        }, content);\n    };\n    ContextualMenuBase1.prototype._renderSeparator = function(index, classNames, top, fromSection) {\n        if (fromSection || index > 0) return _react.createElement(\"li\", {\n            role: \"separator\",\n            key: \"separator-\" + index + (top === undefined ? \"\" : top ? \"-top\" : \"-bottom\"),\n            className: classNames.divider,\n            \"aria-hidden\": \"true\"\n        });\n        return null;\n    };\n    ContextualMenuBase1.prototype._renderNormalItem = function(item, classNames, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons) {\n        if (item.onRender) return item.onRender((0, _tslib.__assign)({\n            \"aria-posinset\": focusableElementIndex + 1,\n            \"aria-setsize\": totalItemCount\n        }, item), this.dismiss);\n        if (item.href) return this._renderAnchorMenuItem(item, classNames, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons);\n        if (item.split && (0, _index.hasSubmenu)(item)) return this._renderSplitButton(item, classNames, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons);\n        return this._renderButtonItem(item, classNames, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons);\n    };\n    ContextualMenuBase1.prototype._renderHeaderMenuItem = function(item, // eslint-disable-next-line deprecation/deprecation\n    classNames, index, hasCheckmarks, hasIcons) {\n        var _a = this.props.contextualMenuItemAs, ChildrenRenderer = _a === void 0 ? (0, _contextualMenuItem.ContextualMenuItem) : _a;\n        var itemProps = item.itemProps, id = item.id;\n        var divHtmlProperties = itemProps && (0, _utilities.getNativeProps)(itemProps, (0, _utilities.divProperties));\n        return(// eslint-disable-next-line deprecation/deprecation\n        _react.createElement(\"div\", (0, _tslib.__assign)({\n            id: id,\n            className: this._classNames.header\n        }, divHtmlProperties, {\n            style: item.style\n        }), _react.createElement(ChildrenRenderer, (0, _tslib.__assign)({\n            item: item,\n            classNames: classNames,\n            index: index,\n            onCheckmarkClick: hasCheckmarks ? this._onItemClick : undefined,\n            hasIcons: hasIcons\n        }, itemProps))));\n    };\n    ContextualMenuBase1.prototype._renderAnchorMenuItem = function(item, // eslint-disable-next-line deprecation/deprecation\n    classNames, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons) {\n        var contextualMenuItemAs = this.props.contextualMenuItemAs;\n        var expandedMenuItemKey = this.state.expandedMenuItemKey;\n        return _react.createElement((0, _index1.ContextualMenuAnchor), {\n            item: item,\n            classNames: classNames,\n            index: index,\n            focusableElementIndex: focusableElementIndex,\n            totalItemCount: totalItemCount,\n            hasCheckmarks: hasCheckmarks,\n            hasIcons: hasIcons,\n            contextualMenuItemAs: contextualMenuItemAs,\n            onItemMouseEnter: this._onItemMouseEnterBase,\n            onItemMouseLeave: this._onMouseItemLeave,\n            onItemMouseMove: this._onItemMouseMoveBase,\n            onItemMouseDown: this._onItemMouseDown,\n            executeItemClick: this._executeItemClick,\n            onItemClick: this._onAnchorClick,\n            onItemKeyDown: this._onItemKeyDown,\n            expandedMenuItemKey: expandedMenuItemKey,\n            openSubMenu: this._onItemSubMenuExpand,\n            dismissSubMenu: this._onSubMenuDismiss,\n            dismissMenu: this.dismiss\n        });\n    };\n    ContextualMenuBase1.prototype._renderButtonItem = function(item, // eslint-disable-next-line deprecation/deprecation\n    classNames, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons) {\n        var contextualMenuItemAs = this.props.contextualMenuItemAs;\n        var expandedMenuItemKey = this.state.expandedMenuItemKey;\n        return _react.createElement((0, _index1.ContextualMenuButton), {\n            item: item,\n            classNames: classNames,\n            index: index,\n            focusableElementIndex: focusableElementIndex,\n            totalItemCount: totalItemCount,\n            hasCheckmarks: hasCheckmarks,\n            hasIcons: hasIcons,\n            contextualMenuItemAs: contextualMenuItemAs,\n            onItemMouseEnter: this._onItemMouseEnterBase,\n            onItemMouseLeave: this._onMouseItemLeave,\n            onItemMouseMove: this._onItemMouseMoveBase,\n            onItemMouseDown: this._onItemMouseDown,\n            executeItemClick: this._executeItemClick,\n            onItemClick: this._onItemClick,\n            onItemClickBase: this._onItemClickBase,\n            onItemKeyDown: this._onItemKeyDown,\n            expandedMenuItemKey: expandedMenuItemKey,\n            openSubMenu: this._onItemSubMenuExpand,\n            dismissSubMenu: this._onSubMenuDismiss,\n            dismissMenu: this.dismiss\n        });\n    };\n    ContextualMenuBase1.prototype._renderSplitButton = function(item, // eslint-disable-next-line deprecation/deprecation\n    classNames, index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons) {\n        var contextualMenuItemAs = this.props.contextualMenuItemAs;\n        var expandedMenuItemKey = this.state.expandedMenuItemKey;\n        return _react.createElement((0, _index1.ContextualMenuSplitButton), {\n            item: item,\n            classNames: classNames,\n            index: index,\n            focusableElementIndex: focusableElementIndex,\n            totalItemCount: totalItemCount,\n            hasCheckmarks: hasCheckmarks,\n            hasIcons: hasIcons,\n            contextualMenuItemAs: contextualMenuItemAs,\n            onItemMouseEnter: this._onItemMouseEnterBase,\n            onItemMouseLeave: this._onMouseItemLeave,\n            onItemMouseMove: this._onItemMouseMoveBase,\n            onItemMouseDown: this._onItemMouseDown,\n            executeItemClick: this._executeItemClick,\n            onItemClick: this._onItemClick,\n            onItemClickBase: this._onItemClickBase,\n            onItemKeyDown: this._onItemKeyDown,\n            openSubMenu: this._onItemSubMenuExpand,\n            dismissSubMenu: this._onSubMenuDismiss,\n            dismissMenu: this.dismiss,\n            expandedMenuItemKey: expandedMenuItemKey,\n            onTap: this._onPointerAndTouchEvent\n        });\n    };\n    /**\n     * Returns true if the key for the event is alt (Mac option) or meta (Mac command).\n     */ ContextualMenuBase1.prototype._isAltOrMeta = function(ev) {\n        return ev.which === (0, _utilities.KeyCodes).alt || ev.key === \"Meta\";\n    };\n    ContextualMenuBase1.prototype._shouldIgnoreMouseEvent = function() {\n        return !this._isScrollIdle || !this._gotMouseMove;\n    };\n    /**\n     * Handles updating focus when mouseEnter or mouseMove fire.\n     * As part of updating focus, This function will also update\n     * the expand/collapse state accordingly.\n     */ ContextualMenuBase1.prototype._updateFocusOnMouseEvent = function(item, ev, target) {\n        var _this = this;\n        var targetElement = target ? target : ev.currentTarget;\n        var _a = this.props.subMenuHoverDelay, timeoutDuration = _a === void 0 ? NavigationIdleDelay : _a;\n        if (item.key === this.state.expandedMenuItemKey) return;\n        if (this._enterTimerId !== undefined) {\n            this._async.clearTimeout(this._enterTimerId);\n            this._enterTimerId = undefined;\n        }\n        // If the menu is not expanded we can update focus without any delay\n        if (this.state.expandedMenuItemKey === undefined) targetElement.focus();\n        // Delay updating expanding/dismissing the submenu\n        // and only set focus if we have not already done so\n        if ((0, _index.hasSubmenu)(item)) {\n            ev.stopPropagation();\n            this._enterTimerId = this._async.setTimeout(function() {\n                targetElement.focus();\n                _this.setState({\n                    expandedByMouseClick: true\n                });\n                _this._onItemSubMenuExpand(item, targetElement);\n                _this._enterTimerId = undefined;\n            }, timeoutDuration);\n        } else this._enterTimerId = this._async.setTimeout(function() {\n            _this._onSubMenuDismiss(ev);\n            targetElement.focus();\n            _this._enterTimerId = undefined;\n        }, timeoutDuration);\n    };\n    ContextualMenuBase1.prototype._getSubmenuProps = function() {\n        var _a = this.state, submenuTarget = _a.submenuTarget, expandedMenuItemKey = _a.expandedMenuItemKey;\n        var item = this._findItemByKey(expandedMenuItemKey);\n        var submenuProps = null;\n        var menuTarget = this.props.target;\n        if (item) {\n            submenuProps = {\n                items: getSubmenuItems(item, {\n                    target: menuTarget\n                }),\n                target: submenuTarget,\n                onDismiss: this._onSubMenuDismiss,\n                isSubMenu: true,\n                id: this.state.subMenuId,\n                shouldFocusOnMount: true,\n                shouldFocusOnContainer: this.state.expandedByMouseClick,\n                directionalHint: (0, _utilities.getRTL)(this.props.theme) ? (0, _directionalHint.DirectionalHint).leftTopEdge : (0, _directionalHint.DirectionalHint).rightTopEdge,\n                className: this.props.className,\n                gapSpace: 0,\n                isBeakVisible: false\n            };\n            if (item.subMenuProps) (0, _utilities.assign)(submenuProps, item.subMenuProps);\n            if (item.preferMenuTargetAsEventTarget) {\n                var onItemClick = item.onItemClick;\n                submenuProps.onItemClick = getOnClickWithOverrideTarget(onItemClick, menuTarget);\n            }\n        }\n        return submenuProps;\n    };\n    ContextualMenuBase1.prototype._findItemByKey = function(key) {\n        var items = this.props.items;\n        return this._findItemByKeyFromItems(key, items);\n    };\n    /**\n     * Returns the item that mathes a given key if any.\n     * @param key - The key of the item to match\n     * @param items - The items to look for the key\n     */ ContextualMenuBase1.prototype._findItemByKeyFromItems = function(key, items) {\n        for(var _i = 0, items_3 = items; _i < items_3.length; _i++){\n            var item = items_3[_i];\n            if (item.itemType === (0, _contextualMenuTypes.ContextualMenuItemType).Section && item.sectionProps) {\n                var match = this._findItemByKeyFromItems(key, item.sectionProps.items);\n                if (match) return match;\n            } else if (item.key && item.key === key) return item;\n        }\n    };\n    ContextualMenuBase1.prototype._setTargetWindowAndElement = function(target) {\n        var currentElement = this._host;\n        if (target) {\n            if (typeof target === \"string\") {\n                var currentDoc = (0, _utilities.getDocument)(currentElement);\n                this._target = currentDoc ? currentDoc.querySelector(target) : null;\n                this._targetWindow = (0, _utilities.getWindow)(currentElement);\n            // Cast to any prevents error about stopPropagation always existing\n            } else if (target.stopPropagation) {\n                this._targetWindow = (0, _utilities.getWindow)(target.target);\n                this._target = target;\n            } else if (// eslint-disable-next-line deprecation/deprecation\n            (target.left !== undefined || target.x !== undefined) && (target.top !== undefined || target.y !== undefined)) {\n                this._targetWindow = (0, _utilities.getWindow)(currentElement);\n                this._target = target;\n            } else if (target.current !== undefined) {\n                this._target = target.current;\n                this._targetWindow = (0, _utilities.getWindow)(this._target);\n            } else {\n                var targetElement = target;\n                this._targetWindow = (0, _utilities.getWindow)(targetElement);\n                this._target = target;\n            }\n        } else this._targetWindow = (0, _utilities.getWindow)(currentElement);\n    };\n    // The default ContextualMenu properties have no items and beak, the default submenu direction is right and top.\n    ContextualMenuBase1.defaultProps = {\n        items: [],\n        shouldFocusOnMount: true,\n        gapSpace: 0,\n        directionalHint: (0, _directionalHint.DirectionalHint).bottomAutoEdge,\n        beakWidth: 16\n    };\n    ContextualMenuBase1 = (0, _tslib.__decorate)([\n        (0, _withResponsiveMode.withResponsiveMode)\n    ], ContextualMenuBase1);\n    return ContextualMenuBase1;\n}(_react.Component);\nfunction getOnClickWithOverrideTarget(onClick, target) {\n    return onClick ? function(ev, item) {\n        overrideTarget(ev, target);\n        return onClick(ev, item);\n    } : onClick;\n}\nfunction overrideTarget(ev, target) {\n    if (ev && target) {\n        ev.persist();\n        if (target instanceof Event) ev.target = target.target;\n        else if (target instanceof Element) ev.target = target;\n    }\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./ContextualMenu.types\":\"jFA13\",\"../../common/DirectionalHint\":\"kARBR\",\"../../FocusZone\":\"cRFhG\",\"../../Utilities\":\"2F07a\",\"../../utilities/contextualMenu/index\":\"kuuyp\",\"../../utilities/decorators/withResponsiveMode\":\"i57Mj\",\"../../Callout\":\"jhXLC\",\"./ContextualMenuItem\":\"1A0Og\",\"./ContextualMenuItemWrapper/index\":\"fiyw7\",\"../../Styling\":\"7JwBd\",\"./ContextualMenu.classNames\":\"eP2o9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jFA13\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DirectionalHint\", ()=>(0, _directionalHint.DirectionalHint));\nparcelHelpers.export(exports, \"ContextualMenuItemType\", ()=>ContextualMenuItemType);\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nvar ContextualMenuItemType;\n(function(ContextualMenuItemType1) {\n    ContextualMenuItemType1[ContextualMenuItemType1[\"Normal\"] = 0] = \"Normal\";\n    ContextualMenuItemType1[ContextualMenuItemType1[\"Divider\"] = 1] = \"Divider\";\n    ContextualMenuItemType1[ContextualMenuItemType1[\"Header\"] = 2] = \"Header\";\n    ContextualMenuItemType1[ContextualMenuItemType1[\"Section\"] = 3] = \"Section\";\n})(ContextualMenuItemType || (ContextualMenuItemType = {}));\n\n},{\"../../common/DirectionalHint\":\"kARBR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cRFhG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/FocusZone/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/FocusZone/index\":\"haNsM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"haNsM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _reactFocus = require(\"@fluentui/react-focus\");\nparcelHelpers.exportAll(_reactFocus, exports);\n\n},{\"@fluentui/react-focus\":\"iDRzD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iDRzD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _version = require(\"./version\");\nvar _index = require(\"./components/FocusZone/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./version\":\"8wT4S\",\"./components/FocusZone/index\":\"aHWFR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8wT4S\":[function(require,module,exports) {\n// Do not modify this file; it is generated as part of publish.\n// The checked in version is a placeholder only and will not be updated.\nvar _setVersion = require(\"@uifabric/set-version\");\n(0, _setVersion.setVersion)(\"@fluentui/react-focus\", \"7.18.3\");\n\n},{\"@uifabric/set-version\":\"896RR\"}],\"aHWFR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _focusZone = require(\"./FocusZone\");\nparcelHelpers.exportAll(_focusZone, exports);\nvar _focusZoneTypes = require(\"./FocusZone.types\");\nparcelHelpers.exportAll(_focusZoneTypes, exports);\n\n},{\"./FocusZone\":\"851VK\",\"./FocusZone.types\":\"cqjVD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"851VK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FocusZone\", ()=>FocusZone);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _mergeStyles = require(\"@uifabric/merge-styles\");\nvar _styling = require(\"@uifabric/styling\");\nvar _utilities = require(\"@uifabric/utilities\");\nvar _focusZoneTypes = require(\"./FocusZone.types\");\nvar IS_FOCUSABLE_ATTRIBUTE = \"data-is-focusable\";\nvar IS_ENTER_DISABLED_ATTRIBUTE = \"data-disable-click-on-enter\";\nvar FOCUSZONE_ID_ATTRIBUTE = \"data-focuszone-id\";\nvar TABINDEX = \"tabindex\";\nvar NO_VERTICAL_WRAP = \"data-no-vertical-wrap\";\nvar NO_HORIZONTAL_WRAP = \"data-no-horizontal-wrap\";\nvar LARGE_DISTANCE_FROM_CENTER = 999999999;\nvar LARGE_NEGATIVE_DISTANCE_FROM_CENTER = -999999999;\nvar focusZoneStyles;\nvar focusZoneClass = \"ms-FocusZone\";\n/**\n * Raises a click on a target element based on a keyboard event.\n */ function raiseClickFromKeyboardEvent(target, ev) {\n    var _a, _b, _c, _d, _e, _f;\n    var event;\n    if (typeof MouseEvent === \"function\") event = new MouseEvent(\"click\", {\n        ctrlKey: (_a = ev) === null || _a === void 0 ? void 0 : _a.ctrlKey,\n        metaKey: (_b = ev) === null || _b === void 0 ? void 0 : _b.metaKey,\n        shiftKey: (_c = ev) === null || _c === void 0 ? void 0 : _c.shiftKey,\n        altKey: (_d = ev) === null || _d === void 0 ? void 0 : _d.altKey,\n        bubbles: (_e = ev) === null || _e === void 0 ? void 0 : _e.bubbles,\n        cancelable: (_f = ev) === null || _f === void 0 ? void 0 : _f.cancelable\n    });\n    else {\n        event = document.createEvent(\"MouseEvents\");\n        event.initMouseEvent(\"click\", ev ? ev.bubbles : false, ev ? ev.cancelable : false, window, 0, 0, 0, 0, 0, ev ? ev.ctrlKey : false, ev ? ev.altKey : false, ev ? ev.shiftKey : false, ev ? ev.metaKey : false, 0, null);\n    }\n    target.dispatchEvent(event);\n}\n// Helper function that will return a class for when the root is focused\nfunction getRootClass() {\n    if (!focusZoneStyles) focusZoneStyles = (0, _mergeStyles.mergeStyles)({\n        selectors: {\n            \":focus\": {\n                outline: \"none\"\n            }\n        }\n    }, focusZoneClass);\n    return focusZoneStyles;\n}\nvar _allInstances = {};\nvar _outerZones = new Set();\nvar ALLOWED_INPUT_TYPES = [\n    \"text\",\n    \"number\",\n    \"password\",\n    \"email\",\n    \"tel\",\n    \"url\",\n    \"search\"\n];\nvar ALLOW_VIRTUAL_ELEMENTS = false;\nvar FocusZone = /** @class */ function(_super) {\n    (0, _tslib.__extends)(FocusZone1, _super);\n    function FocusZone1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._root = _react.createRef();\n        _this._mergedRef = (0, _utilities.createMergedRef)();\n        _this._onFocus = function(ev) {\n            if (_this._portalContainsElement(ev.target)) // If the event target is inside a portal do not process the event.\n            return;\n            var _a = _this.props, onActiveElementChanged = _a.onActiveElementChanged, // eslint-disable-next-line deprecation/deprecation\n            doNotAllowFocusEventToPropagate = _a.doNotAllowFocusEventToPropagate, stopFocusPropagation = _a.stopFocusPropagation, // eslint-disable-next-line deprecation/deprecation\n            onFocusNotification = _a.onFocusNotification, onFocus = _a.onFocus, shouldFocusInnerElementWhenReceivedFocus = _a.shouldFocusInnerElementWhenReceivedFocus, defaultTabbableElement = _a.defaultTabbableElement;\n            var isImmediateDescendant = _this._isImmediateDescendantOfZone(ev.target);\n            var newActiveElement;\n            if (isImmediateDescendant) newActiveElement = ev.target;\n            else {\n                var parentElement = ev.target;\n                while(parentElement && parentElement !== _this._root.current){\n                    if ((0, _utilities.isElementTabbable)(parentElement) && _this._isImmediateDescendantOfZone(parentElement)) {\n                        newActiveElement = parentElement;\n                        break;\n                    }\n                    parentElement = (0, _utilities.getParent)(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n                }\n            }\n            // If an inner focusable element should be focused when FocusZone container receives focus\n            if (shouldFocusInnerElementWhenReceivedFocus && ev.target === _this._root.current) {\n                var maybeElementToFocus = defaultTabbableElement && typeof defaultTabbableElement === \"function\" && defaultTabbableElement(_this._root.current);\n                // try to focus defaultTabbable element\n                if (maybeElementToFocus && (0, _utilities.isElementTabbable)(maybeElementToFocus)) {\n                    newActiveElement = maybeElementToFocus;\n                    maybeElementToFocus.focus();\n                } else {\n                    // force focus on first focusable element\n                    _this.focus(true);\n                    if (_this._activeElement) // set to null as new active element was handled in method above\n                    newActiveElement = null;\n                }\n            }\n            var initialElementFocused = !_this._activeElement;\n            // If the new active element is a child of this zone and received focus,\n            // update alignment an immediate descendant\n            if (newActiveElement && newActiveElement !== _this._activeElement) {\n                if (isImmediateDescendant || initialElementFocused) _this._setFocusAlignment(newActiveElement, true, true);\n                _this._activeElement = newActiveElement;\n                if (initialElementFocused) _this._updateTabIndexes();\n            }\n            if (onActiveElementChanged) onActiveElementChanged(_this._activeElement, ev);\n            if (stopFocusPropagation || doNotAllowFocusEventToPropagate) ev.stopPropagation();\n            if (onFocus) onFocus(ev);\n            else if (onFocusNotification) onFocusNotification();\n        };\n        _this._onBlur = function() {\n            _this._setParkedFocus(false);\n        };\n        _this._onMouseDown = function(ev) {\n            if (_this._portalContainsElement(ev.target)) // If the event target is inside a portal do not process the event.\n            return;\n            var disabled = _this.props.disabled;\n            if (disabled) return;\n            var target = ev.target;\n            var path = [];\n            while(target && target !== _this._root.current){\n                path.push(target);\n                target = (0, _utilities.getParent)(target, ALLOW_VIRTUAL_ELEMENTS);\n            }\n            while(path.length){\n                target = path.pop();\n                if (target && (0, _utilities.isElementTabbable)(target)) _this._setActiveElement(target, true);\n                if ((0, _utilities.isElementFocusZone)(target)) break;\n            }\n        };\n        /**\n         * Handle the keystrokes.\n         */ _this._onKeyDown = function(ev, theme) {\n            if (_this._portalContainsElement(ev.target)) // If the event target is inside a portal do not process the event.\n            return;\n            // eslint-disable-next-line deprecation/deprecation\n            var _a = _this.props, direction = _a.direction, disabled = _a.disabled, isInnerZoneKeystroke = _a.isInnerZoneKeystroke, pagingSupportDisabled = _a.pagingSupportDisabled, shouldEnterInnerZone = _a.shouldEnterInnerZone;\n            if (disabled) return;\n            if (_this.props.onKeyDown) _this.props.onKeyDown(ev);\n            // If the default has been prevented, do not process keyboard events.\n            if (ev.isDefaultPrevented()) return;\n            if (_this._getDocument().activeElement === _this._root.current && _this._isInnerZone) // If this element has focus, it is being controlled by a parent.\n            // Ignore the keystroke.\n            return;\n            if ((shouldEnterInnerZone && shouldEnterInnerZone(ev) || isInnerZoneKeystroke && isInnerZoneKeystroke(ev)) && _this._isImmediateDescendantOfZone(ev.target)) {\n                // Try to focus\n                var innerZone = _this._getFirstInnerZone();\n                if (innerZone) {\n                    if (!innerZone.focus(true)) return;\n                } else if ((0, _utilities.isElementFocusSubZone)(ev.target)) {\n                    if (!_this.focusElement((0, _utilities.getNextElement)(ev.target, ev.target.firstChild, true))) return;\n                } else return;\n            } else if (ev.altKey) return;\n            else // eslint-disable-next-line @fluentui/deprecated-keyboard-event-props\n            switch(ev.which){\n                case (0, _utilities.KeyCodes).space:\n                    if (_this._tryInvokeClickForFocusable(ev.target, ev)) break;\n                    return;\n                case (0, _utilities.KeyCodes).left:\n                    if (direction !== (0, _focusZoneTypes.FocusZoneDirection).vertical) {\n                        _this._preventDefaultWhenHandled(ev);\n                        if (_this._moveFocusLeft(theme)) break;\n                    }\n                    return;\n                case (0, _utilities.KeyCodes).right:\n                    if (direction !== (0, _focusZoneTypes.FocusZoneDirection).vertical) {\n                        _this._preventDefaultWhenHandled(ev);\n                        if (_this._moveFocusRight(theme)) break;\n                    }\n                    return;\n                case (0, _utilities.KeyCodes).up:\n                    if (direction !== (0, _focusZoneTypes.FocusZoneDirection).horizontal) {\n                        _this._preventDefaultWhenHandled(ev);\n                        if (_this._moveFocusUp()) break;\n                    }\n                    return;\n                case (0, _utilities.KeyCodes).down:\n                    if (direction !== (0, _focusZoneTypes.FocusZoneDirection).horizontal) {\n                        _this._preventDefaultWhenHandled(ev);\n                        if (_this._moveFocusDown()) break;\n                    }\n                    return;\n                case (0, _utilities.KeyCodes).pageDown:\n                    if (!pagingSupportDisabled && _this._moveFocusPaging(true)) break;\n                    return;\n                case (0, _utilities.KeyCodes).pageUp:\n                    if (!pagingSupportDisabled && _this._moveFocusPaging(false)) break;\n                    return;\n                case (0, _utilities.KeyCodes).tab:\n                    if (// eslint-disable-next-line deprecation/deprecation\n                    _this.props.allowTabKey || _this.props.handleTabKey === (0, _focusZoneTypes.FocusZoneTabbableElements).all || _this.props.handleTabKey === (0, _focusZoneTypes.FocusZoneTabbableElements).inputOnly && _this._isElementInput(ev.target)) {\n                        var focusChanged = false;\n                        _this._processingTabKey = true;\n                        if (direction === (0, _focusZoneTypes.FocusZoneDirection).vertical || !_this._shouldWrapFocus(_this._activeElement, NO_HORIZONTAL_WRAP)) focusChanged = ev.shiftKey ? _this._moveFocusUp() : _this._moveFocusDown();\n                        else {\n                            var tabWithDirection = (0, _utilities.getRTL)(theme) ? !ev.shiftKey : ev.shiftKey;\n                            focusChanged = tabWithDirection ? _this._moveFocusLeft(theme) : _this._moveFocusRight(theme);\n                        }\n                        _this._processingTabKey = false;\n                        if (focusChanged) break;\n                        else if (_this.props.shouldResetActiveElementWhenTabFromZone) _this._activeElement = null;\n                    }\n                    return;\n                case (0, _utilities.KeyCodes).home:\n                    if (_this._isContentEditableElement(ev.target) || _this._isElementInput(ev.target) && !_this._shouldInputLoseFocus(ev.target, false)) return false;\n                    var firstChild = _this._root.current && _this._root.current.firstChild;\n                    if (_this._root.current && firstChild && _this.focusElement((0, _utilities.getNextElement)(_this._root.current, firstChild, true))) break;\n                    return;\n                case (0, _utilities.KeyCodes).end:\n                    if (_this._isContentEditableElement(ev.target) || _this._isElementInput(ev.target) && !_this._shouldInputLoseFocus(ev.target, true)) return false;\n                    var lastChild = _this._root.current && _this._root.current.lastChild;\n                    if (_this._root.current && _this.focusElement((0, _utilities.getPreviousElement)(_this._root.current, lastChild, true, true, true))) break;\n                    return;\n                case (0, _utilities.KeyCodes).enter:\n                    if (_this._tryInvokeClickForFocusable(ev.target, ev)) break;\n                    return;\n                default:\n                    return;\n            }\n            ev.preventDefault();\n            ev.stopPropagation();\n        };\n        _this._getHorizontalDistanceFromCenter = function(isForward, activeRect, targetRect) {\n            // eslint-disable-next-line deprecation/deprecation\n            var leftAlignment = _this._focusAlignment.left || _this._focusAlignment.x || 0;\n            // ClientRect values can be floats that differ by very small fractions of a decimal.\n            // If the difference between top and bottom are within a pixel then we should treat\n            // them as equivalent by using Math.floor. For instance 5.2222 and 5.222221 should be equivalent,\n            // but without Math.Floor they will be handled incorrectly.\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectBottom = Math.floor(activeRect.bottom);\n            var targetRectBottom = Math.floor(targetRect.bottom);\n            var activeRectTop = Math.floor(activeRect.top);\n            var isValidCandidateOnpagingDown = isForward && targetRectTop > activeRectBottom;\n            var isValidCandidateOnpagingUp = !isForward && targetRectBottom < activeRectTop;\n            if (isValidCandidateOnpagingDown || isValidCandidateOnpagingUp) {\n                if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) return 0;\n                return Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n            }\n            if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n            return LARGE_DISTANCE_FROM_CENTER;\n        };\n        // Manage componentRef resolution.\n        (0, _utilities.initializeComponentRef)(_this);\n        _this._id = (0, _utilities.getId)(\"FocusZone\");\n        _this._focusAlignment = {\n            left: 0,\n            top: 0\n        };\n        _this._processingTabKey = false;\n        return _this;\n    }\n    /** Used for testing purposes only. */ FocusZone1.getOuterZones = function() {\n        return _outerZones.size;\n    };\n    /**\n     * Handle global tab presses so that we can patch tabindexes on the fly.\n     * HEADS UP: This must not be an arrow function in order to be referentially equal among instances\n     * for ref counting to work correctly!\n     */ FocusZone1._onKeyDownCapture = function(ev) {\n        // eslint-disable-next-line deprecation/deprecation, @fluentui/deprecated-keyboard-event-props\n        if (ev.which === (0, _utilities.KeyCodes).tab) _outerZones.forEach(function(zone) {\n            return zone._updateTabIndexes();\n        });\n    };\n    FocusZone1.prototype.componentDidMount = function() {\n        var root = this._root.current;\n        _allInstances[this._id] = this;\n        if (root) {\n            this._windowElement = (0, _utilities.getWindow)(root);\n            var parentElement = (0, _utilities.getParent)(root, ALLOW_VIRTUAL_ELEMENTS);\n            while(parentElement && parentElement !== this._getDocument().body && parentElement.nodeType === 1){\n                if ((0, _utilities.isElementFocusZone)(parentElement)) {\n                    this._isInnerZone = true;\n                    break;\n                }\n                parentElement = (0, _utilities.getParent)(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n            }\n            if (!this._isInnerZone) {\n                _outerZones.add(this);\n                if (this._windowElement && _outerZones.size === 1) this._windowElement.addEventListener(\"keydown\", FocusZone1._onKeyDownCapture, true);\n            }\n            this._root.current && this._root.current.addEventListener(\"blur\", this._onBlur, true);\n            // Assign initial tab indexes so that we can set initial focus as appropriate.\n            this._updateTabIndexes();\n            if (this.props.defaultTabbableElement && typeof this.props.defaultTabbableElement === \"string\") this._activeElement = this._getDocument().querySelector(this.props.defaultTabbableElement);\n            else if (this.props.defaultActiveElement) // eslint-disable-next-line deprecation/deprecation\n            this._activeElement = this._getDocument().querySelector(this.props.defaultActiveElement);\n            if (this.props.shouldFocusOnMount) this.focus();\n        }\n    };\n    FocusZone1.prototype.componentDidUpdate = function() {\n        var root = this._root.current;\n        var doc = this._getDocument();\n        if (doc && this._lastIndexPath && (doc.activeElement === doc.body || doc.activeElement === null || !this.props.preventFocusRestoration && doc.activeElement === root)) {\n            // The element has been removed after the render, attempt to restore focus.\n            var elementToFocus = (0, _utilities.getFocusableByIndexPath)(root, this._lastIndexPath);\n            if (elementToFocus) {\n                this._setActiveElement(elementToFocus, true);\n                elementToFocus.focus();\n                this._setParkedFocus(false);\n            } else // We had a focus path to restore, but now that path is unresolvable. Park focus\n            // on the container until we can try again.\n            this._setParkedFocus(true);\n        }\n    };\n    FocusZone1.prototype.componentWillUnmount = function() {\n        delete _allInstances[this._id];\n        if (!this._isInnerZone) {\n            _outerZones.delete(this);\n            // If this is the last outer zone, remove the keydown listener.\n            if (this._windowElement && _outerZones.size === 0) this._windowElement.removeEventListener(\"keydown\", FocusZone1._onKeyDownCapture, true);\n        }\n        if (this._root.current) this._root.current.removeEventListener(\"blur\", this._onBlur, true);\n        this._activeElement = null;\n        this._defaultFocusElement = null;\n    };\n    FocusZone1.prototype.render = function() {\n        var _this = this;\n        // eslint-disable-next-line deprecation/deprecation\n        var _a = this.props, tag = _a.as, elementType = _a.elementType, rootProps = _a.rootProps, ariaDescribedBy = _a.ariaDescribedBy, ariaLabelledBy = _a.ariaLabelledBy, className = _a.className;\n        var divProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.htmlElementProperties));\n        var Tag = tag || elementType || \"div\";\n        // Note, right before rendering/reconciling proceeds, we need to record if focus\n        // was in the zone before the update. This helper will track this and, if focus\n        // was actually in the zone, what the index path to the element is at this time.\n        // Then, later in componentDidUpdate, we can evaluate if we need to restore it in\n        // the case the element was removed.\n        this._evaluateFocusBeforeRender();\n        // Only support RTL defined in global theme, not contextual theme/RTL.\n        var theme = (0, _styling.getTheme)();\n        return _react.createElement(Tag, (0, _tslib.__assign)({\n            \"aria-labelledby\": ariaLabelledBy,\n            \"aria-describedby\": ariaDescribedBy\n        }, divProps, rootProps, {\n            // Once the getClassName correctly memoizes inputs this should\n            // be replaced so that className is passed to getRootClass and is included there so\n            // the class names will always be in the same order.\n            className: (0, _utilities.css)(getRootClass(), className),\n            // eslint-disable-next-line deprecation/deprecation\n            ref: this._mergedRef(this.props.elementRef, this._root),\n            \"data-focuszone-id\": this._id,\n            // eslint-disable-next-line react/jsx-no-bind\n            onKeyDown: function(ev) {\n                return _this._onKeyDown(ev, theme);\n            },\n            onFocus: this._onFocus,\n            onMouseDownCapture: this._onMouseDown\n        }), this.props.children);\n    };\n    /**\n     * Sets focus to the first tabbable item in the zone.\n     * @param forceIntoFirstElement - If true, focus will be forced into the first element, even\n     * if focus is already in the focus zone.\n     * @returns True if focus could be set to an active element, false if no operation was taken.\n     */ FocusZone1.prototype.focus = function(forceIntoFirstElement) {\n        if (forceIntoFirstElement === void 0) forceIntoFirstElement = false;\n        if (this._root.current) {\n            if (!forceIntoFirstElement && this._root.current.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\" && this._isInnerZone) {\n                var ownerZoneElement = this._getOwnerZone(this._root.current);\n                if (ownerZoneElement !== this._root.current) {\n                    var ownerZone = _allInstances[ownerZoneElement.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n                    return !!ownerZone && ownerZone.focusElement(this._root.current);\n                }\n                return false;\n            } else if (!forceIntoFirstElement && this._activeElement && (0, _utilities.elementContains)(this._root.current, this._activeElement) && (0, _utilities.isElementTabbable)(this._activeElement)) {\n                this._activeElement.focus();\n                return true;\n            } else {\n                var firstChild = this._root.current.firstChild;\n                return this.focusElement((0, _utilities.getNextElement)(this._root.current, firstChild, true));\n            }\n        }\n        return false;\n    };\n    /**\n     * Sets focus to the last tabbable item in the zone.\n     * @returns True if focus could be set to an active element, false if no operation was taken.\n     */ FocusZone1.prototype.focusLast = function() {\n        if (this._root.current) {\n            var lastChild = this._root.current && this._root.current.lastChild;\n            return this.focusElement((0, _utilities.getPreviousElement)(this._root.current, lastChild, true, true, true));\n        }\n        return false;\n    };\n    /**\n     * Sets focus to a specific child element within the zone. This can be used in conjunction with\n     * shouldReceiveFocus to create delayed focus scenarios (like animate the scroll position to the correct\n     * location and then focus.)\n     * @param element - The child element within the zone to focus.\n     * @param forceAlignment - If true, focus alignment will be set according to the element provided.\n     * @returns True if focus could be set to an active element, false if no operation was taken.\n     */ FocusZone1.prototype.focusElement = function(element, forceAlignment) {\n        // eslint-disable-next-line deprecation/deprecation\n        var _a = this.props, onBeforeFocus = _a.onBeforeFocus, shouldReceiveFocus = _a.shouldReceiveFocus;\n        if (shouldReceiveFocus && !shouldReceiveFocus(element) || onBeforeFocus && !onBeforeFocus(element)) return false;\n        if (element) {\n            // when we set focus to a specific child, we should recalculate the alignment depending on its position.\n            this._setActiveElement(element, forceAlignment);\n            if (this._activeElement) this._activeElement.focus();\n            return true;\n        }\n        return false;\n    };\n    /**\n     * Forces horizontal alignment in the context of vertical arrowing to use specific point as the reference,\n     * rather than a center based on the last horizontal motion.\n     * @param point - the new reference point.\n     */ FocusZone1.prototype.setFocusAlignment = function(point) {\n        this._focusAlignment = point;\n    };\n    FocusZone1.prototype._evaluateFocusBeforeRender = function() {\n        var root = this._root.current;\n        var doc = this._getDocument();\n        if (doc) {\n            var focusedElement = doc.activeElement;\n            // Only update the index path if we are not parked on the root.\n            if (focusedElement !== root) {\n                var shouldRestoreFocus = (0, _utilities.elementContains)(root, focusedElement, false);\n                this._lastIndexPath = shouldRestoreFocus ? (0, _utilities.getElementIndexPath)(root, focusedElement) : undefined;\n            }\n        }\n    };\n    /**\n     * When focus is in the zone at render time but then all focusable elements are removed,\n     * we \"park\" focus temporarily on the root. Once we update with focusable children, we restore\n     * focus to the closest path from previous. If the user tabs away from the parked container,\n     * we restore focusability to the pre-parked state.\n     */ FocusZone1.prototype._setParkedFocus = function(isParked) {\n        var root = this._root.current;\n        if (root && this._isParked !== isParked) {\n            this._isParked = isParked;\n            if (isParked) {\n                if (!this.props.allowFocusRoot) {\n                    this._parkedTabIndex = root.getAttribute(\"tabindex\");\n                    root.setAttribute(\"tabindex\", \"-1\");\n                }\n                root.focus();\n            } else if (!this.props.allowFocusRoot) {\n                if (this._parkedTabIndex) {\n                    root.setAttribute(\"tabindex\", this._parkedTabIndex);\n                    this._parkedTabIndex = undefined;\n                } else root.removeAttribute(\"tabindex\");\n            }\n        }\n    };\n    FocusZone1.prototype._setActiveElement = function(element, forceAlignment) {\n        var previousActiveElement = this._activeElement;\n        this._activeElement = element;\n        if (previousActiveElement) {\n            if ((0, _utilities.isElementFocusZone)(previousActiveElement)) this._updateTabIndexes(previousActiveElement);\n            previousActiveElement.tabIndex = -1;\n        }\n        if (this._activeElement) {\n            if (!this._focusAlignment || forceAlignment) this._setFocusAlignment(element, true, true);\n            this._activeElement.tabIndex = 0;\n        }\n    };\n    FocusZone1.prototype._preventDefaultWhenHandled = function(ev) {\n        this.props.preventDefaultWhenHandled && ev.preventDefault();\n    };\n    /**\n     * Walk up the dom try to find a focusable element.\n     */ FocusZone1.prototype._tryInvokeClickForFocusable = function(targetElement, ev) {\n        var target = targetElement;\n        if (target === this._root.current || !this.props.shouldRaiseClicks) return false;\n        do {\n            if (target.tagName === \"BUTTON\" || target.tagName === \"A\" || target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\") return false;\n            if (this._isImmediateDescendantOfZone(target) && target.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\" && target.getAttribute(IS_ENTER_DISABLED_ATTRIBUTE) !== \"true\") {\n                raiseClickFromKeyboardEvent(target, ev);\n                return true;\n            }\n            target = (0, _utilities.getParent)(target, ALLOW_VIRTUAL_ELEMENTS);\n        }while (target !== this._root.current);\n        return false;\n    };\n    /**\n     * Traverse to find first child zone.\n     */ FocusZone1.prototype._getFirstInnerZone = function(rootElement) {\n        rootElement = rootElement || this._activeElement || this._root.current;\n        if (!rootElement) return null;\n        if ((0, _utilities.isElementFocusZone)(rootElement)) return _allInstances[rootElement.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n        var child = rootElement.firstElementChild;\n        while(child){\n            if ((0, _utilities.isElementFocusZone)(child)) return _allInstances[child.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n            var match = this._getFirstInnerZone(child);\n            if (match) return match;\n            child = child.nextElementSibling;\n        }\n        return null;\n    };\n    FocusZone1.prototype._moveFocus = function(isForward, getDistanceFromCenter, ev, useDefaultWrap) {\n        if (useDefaultWrap === void 0) useDefaultWrap = true;\n        var element = this._activeElement;\n        var candidateDistance = -1;\n        var candidateElement = undefined;\n        var changedFocus = false;\n        var isBidirectional = this.props.direction === (0, _focusZoneTypes.FocusZoneDirection).bidirectional;\n        if (!element || !this._root.current) return false;\n        if (this._isElementInput(element)) {\n            if (!this._shouldInputLoseFocus(element, isForward)) return false;\n        }\n        var activeRect = isBidirectional ? element.getBoundingClientRect() : null;\n        do {\n            element = isForward ? (0, _utilities.getNextElement)(this._root.current, element) : (0, _utilities.getPreviousElement)(this._root.current, element);\n            if (isBidirectional) {\n                if (element) {\n                    var targetRect = element.getBoundingClientRect();\n                    var elementDistance = getDistanceFromCenter(activeRect, targetRect);\n                    if (elementDistance === -1 && candidateDistance === -1) {\n                        candidateElement = element;\n                        break;\n                    }\n                    if (elementDistance > -1 && (candidateDistance === -1 || elementDistance < candidateDistance)) {\n                        candidateDistance = elementDistance;\n                        candidateElement = element;\n                    }\n                    if (candidateDistance >= 0 && elementDistance < 0) break;\n                }\n            } else {\n                candidateElement = element;\n                break;\n            }\n        }while (element);\n        // Focus the closest candidate\n        if (candidateElement && candidateElement !== this._activeElement) {\n            changedFocus = true;\n            this.focusElement(candidateElement);\n        } else if (this.props.isCircularNavigation && useDefaultWrap) {\n            if (isForward) return this.focusElement((0, _utilities.getNextElement)(this._root.current, this._root.current.firstElementChild, true));\n            else return this.focusElement((0, _utilities.getPreviousElement)(this._root.current, this._root.current.lastElementChild, true, true, true));\n        }\n        return changedFocus;\n    };\n    FocusZone1.prototype._moveFocusDown = function() {\n        var _this = this;\n        var targetTop = -1;\n        // eslint-disable-next-line deprecation/deprecation\n        var leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0;\n        if (this._moveFocus(true, function(activeRect, targetRect) {\n            var distance = -1;\n            // ClientRect values can be floats that differ by very small fractions of a decimal.\n            // If the difference between top and bottom are within a pixel then we should treat\n            // them as equivalent by using Math.floor. For instance 5.2222 and 5.222221 should be equivalent,\n            // but without Math.Floor they will be handled incorrectly.\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectBottom = Math.floor(activeRect.bottom);\n            if (targetRectTop < activeRectBottom) {\n                if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n                return LARGE_DISTANCE_FROM_CENTER;\n            }\n            if (targetTop === -1 && targetRectTop >= activeRectBottom || targetRectTop === targetTop) {\n                targetTop = targetRectTop;\n                if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) distance = 0;\n                else distance = Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n            }\n            return distance;\n        })) {\n            this._setFocusAlignment(this._activeElement, false, true);\n            return true;\n        }\n        return false;\n    };\n    FocusZone1.prototype._moveFocusUp = function() {\n        var _this = this;\n        var targetTop = -1;\n        // eslint-disable-next-line deprecation/deprecation\n        var leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0;\n        if (this._moveFocus(false, function(activeRect, targetRect) {\n            var distance = -1;\n            // ClientRect values can be floats that differ by very small fractions of a decimal.\n            // If the difference between top and bottom are within a pixel then we should treat\n            // them as equivalent by using Math.floor. For instance 5.2222 and 5.222221 should be equivalent,\n            // but without Math.Floor they will be handled incorrectly.\n            var targetRectBottom = Math.floor(targetRect.bottom);\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectTop = Math.floor(activeRect.top);\n            if (targetRectBottom > activeRectTop) {\n                if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n                return LARGE_DISTANCE_FROM_CENTER;\n            }\n            if (targetTop === -1 && targetRectBottom <= activeRectTop || targetRectTop === targetTop) {\n                targetTop = targetRectTop;\n                if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) distance = 0;\n                else distance = Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n            }\n            return distance;\n        })) {\n            this._setFocusAlignment(this._activeElement, false, true);\n            return true;\n        }\n        return false;\n    };\n    FocusZone1.prototype._moveFocusLeft = function(theme) {\n        var _this = this;\n        var shouldWrap = this._shouldWrapFocus(this._activeElement, NO_HORIZONTAL_WRAP);\n        if (this._moveFocus((0, _utilities.getRTL)(theme), function(activeRect, targetRect) {\n            var distance = -1;\n            var topBottomComparison;\n            if ((0, _utilities.getRTL)(theme)) // When in RTL, this comparison should be the same as the one in _moveFocusRight for LTR.\n            // Going left at a leftmost rectangle will go down a line instead of up a line like in LTR.\n            // This is important, because we want to be comparing the top of the target rect\n            // with the bottom of the active rect.\n            topBottomComparison = parseFloat(targetRect.top.toFixed(3)) < parseFloat(activeRect.bottom.toFixed(3));\n            else topBottomComparison = parseFloat(targetRect.bottom.toFixed(3)) > parseFloat(activeRect.top.toFixed(3));\n            if (topBottomComparison && targetRect.right <= activeRect.right && _this.props.direction !== (0, _focusZoneTypes.FocusZoneDirection).vertical) distance = activeRect.right - targetRect.right;\n            else if (!shouldWrap) distance = LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n            return distance;\n        }, undefined /*ev*/ , shouldWrap)) {\n            this._setFocusAlignment(this._activeElement, true, false);\n            return true;\n        }\n        return false;\n    };\n    FocusZone1.prototype._moveFocusRight = function(theme) {\n        var _this = this;\n        var shouldWrap = this._shouldWrapFocus(this._activeElement, NO_HORIZONTAL_WRAP);\n        if (this._moveFocus(!(0, _utilities.getRTL)(theme), function(activeRect, targetRect) {\n            var distance = -1;\n            var topBottomComparison;\n            if ((0, _utilities.getRTL)(theme)) // When in RTL, this comparison should be the same as the one in _moveFocusLeft for LTR.\n            // Going right at a rightmost rectangle will go up a line instead of down a line like in LTR.\n            // This is important, because we want to be comparing the bottom of the target rect\n            // with the top of the active rect.\n            topBottomComparison = parseFloat(targetRect.bottom.toFixed(3)) > parseFloat(activeRect.top.toFixed(3));\n            else topBottomComparison = parseFloat(targetRect.top.toFixed(3)) < parseFloat(activeRect.bottom.toFixed(3));\n            if (topBottomComparison && targetRect.left >= activeRect.left && _this.props.direction !== (0, _focusZoneTypes.FocusZoneDirection).vertical) distance = targetRect.left - activeRect.left;\n            else if (!shouldWrap) distance = LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n            return distance;\n        }, undefined /*ev*/ , shouldWrap)) {\n            this._setFocusAlignment(this._activeElement, true, false);\n            return true;\n        }\n        return false;\n    };\n    FocusZone1.prototype._moveFocusPaging = function(isForward, useDefaultWrap) {\n        if (useDefaultWrap === void 0) useDefaultWrap = true;\n        var element = this._activeElement;\n        if (!element || !this._root.current) return false;\n        if (this._isElementInput(element)) {\n            if (!this._shouldInputLoseFocus(element, isForward)) return false;\n        }\n        var scrollableParent = (0, _utilities.findScrollableParent)(element);\n        if (!scrollableParent) return false;\n        var candidateDistance = -1;\n        var candidateElement = undefined;\n        var targetTop = -1;\n        var targetBottom = -1;\n        var pagesize = scrollableParent.clientHeight;\n        var activeRect = element.getBoundingClientRect();\n        do {\n            element = isForward ? (0, _utilities.getNextElement)(this._root.current, element) : (0, _utilities.getPreviousElement)(this._root.current, element);\n            if (element) {\n                var targetRect = element.getBoundingClientRect();\n                var targetRectTop = Math.floor(targetRect.top);\n                var activeRectBottom = Math.floor(activeRect.bottom);\n                var targetRectBottom = Math.floor(targetRect.bottom);\n                var activeRectTop = Math.floor(activeRect.top);\n                var elementDistance = this._getHorizontalDistanceFromCenter(isForward, activeRect, targetRect);\n                var isElementPassedPageSizeOnPagingDown = isForward && targetRectTop > activeRectBottom + pagesize;\n                var isElementPassedPageSizeOnPagingUp = !isForward && targetRectBottom < activeRectTop - pagesize;\n                if (isElementPassedPageSizeOnPagingDown || isElementPassedPageSizeOnPagingUp) break;\n                if (elementDistance > -1) {\n                    // for paging down\n                    if (isForward && targetRectTop > targetTop) {\n                        targetTop = targetRectTop;\n                        candidateDistance = elementDistance;\n                        candidateElement = element;\n                    } else if (!isForward && targetRectBottom < targetBottom) {\n                        // for paging up\n                        targetBottom = targetRectBottom;\n                        candidateDistance = elementDistance;\n                        candidateElement = element;\n                    } else if (candidateDistance === -1 || elementDistance <= candidateDistance) {\n                        candidateDistance = elementDistance;\n                        candidateElement = element;\n                    }\n                }\n            }\n        }while (element);\n        var changedFocus = false;\n        // Focus the closest candidate\n        if (candidateElement && candidateElement !== this._activeElement) {\n            changedFocus = true;\n            this.focusElement(candidateElement);\n            this._setFocusAlignment(candidateElement, false, true);\n        } else if (this.props.isCircularNavigation && useDefaultWrap) {\n            if (isForward) return this.focusElement((0, _utilities.getNextElement)(this._root.current, this._root.current.firstElementChild, true));\n            return this.focusElement((0, _utilities.getPreviousElement)(this._root.current, this._root.current.lastElementChild, true, true, true));\n        }\n        return changedFocus;\n    };\n    FocusZone1.prototype._setFocusAlignment = function(element, isHorizontal, isVertical) {\n        if (this.props.direction === (0, _focusZoneTypes.FocusZoneDirection).bidirectional && (!this._focusAlignment || isHorizontal || isVertical)) {\n            var rect = element.getBoundingClientRect();\n            var left = rect.left + rect.width / 2;\n            var top_1 = rect.top + rect.height / 2;\n            if (!this._focusAlignment) this._focusAlignment = {\n                left: left,\n                top: top_1\n            };\n            if (isHorizontal) this._focusAlignment.left = left;\n            if (isVertical) this._focusAlignment.top = top_1;\n        }\n    };\n    FocusZone1.prototype._isImmediateDescendantOfZone = function(element) {\n        return this._getOwnerZone(element) === this._root.current;\n    };\n    FocusZone1.prototype._getOwnerZone = function(element) {\n        var parentElement = (0, _utilities.getParent)(element, ALLOW_VIRTUAL_ELEMENTS);\n        while(parentElement && parentElement !== this._root.current && parentElement !== this._getDocument().body){\n            if ((0, _utilities.isElementFocusZone)(parentElement)) return parentElement;\n            parentElement = (0, _utilities.getParent)(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n        }\n        return parentElement;\n    };\n    FocusZone1.prototype._updateTabIndexes = function(element) {\n        if (!this._activeElement && this.props.defaultTabbableElement && typeof this.props.defaultTabbableElement === \"function\") this._activeElement = this.props.defaultTabbableElement(this._root.current);\n        if (!element && this._root.current) {\n            this._defaultFocusElement = null;\n            element = this._root.current;\n            if (this._activeElement && !(0, _utilities.elementContains)(element, this._activeElement)) this._activeElement = null;\n        }\n        // If active element changes state to disabled, set it to null.\n        // Otherwise, we lose keyboard accessibility to other elements in focus zone.\n        if (this._activeElement && !(0, _utilities.isElementTabbable)(this._activeElement)) this._activeElement = null;\n        var childNodes = element && element.children;\n        for(var childIndex = 0; childNodes && childIndex < childNodes.length; childIndex++){\n            var child = childNodes[childIndex];\n            if (!(0, _utilities.isElementFocusZone)(child)) {\n                // If the item is explicitly set to not be focusable then TABINDEX needs to be set to -1.\n                if (child.getAttribute && child.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"false\") child.setAttribute(TABINDEX, \"-1\");\n                if ((0, _utilities.isElementTabbable)(child)) {\n                    if (this.props.disabled) child.setAttribute(TABINDEX, \"-1\");\n                    else if (!this._isInnerZone && (!this._activeElement && !this._defaultFocusElement || this._activeElement === child)) {\n                        this._defaultFocusElement = child;\n                        if (child.getAttribute(TABINDEX) !== \"0\") child.setAttribute(TABINDEX, \"0\");\n                    } else if (child.getAttribute(TABINDEX) !== \"-1\") child.setAttribute(TABINDEX, \"-1\");\n                } else if (child.tagName === \"svg\" && child.getAttribute(\"focusable\") !== \"false\") // Disgusting IE hack. Sad face.\n                child.setAttribute(\"focusable\", \"false\");\n            } else if (child.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\") {\n                if (!this._isInnerZone && (!this._activeElement && !this._defaultFocusElement || this._activeElement === child)) {\n                    this._defaultFocusElement = child;\n                    if (child.getAttribute(TABINDEX) !== \"0\") child.setAttribute(TABINDEX, \"0\");\n                } else if (child.getAttribute(TABINDEX) !== \"-1\") child.setAttribute(TABINDEX, \"-1\");\n            }\n            this._updateTabIndexes(child);\n        }\n    };\n    FocusZone1.prototype._isContentEditableElement = function(element) {\n        return element && element.getAttribute(\"contenteditable\") === \"true\";\n    };\n    FocusZone1.prototype._isElementInput = function(element) {\n        if (element && element.tagName && (element.tagName.toLowerCase() === \"input\" || element.tagName.toLowerCase() === \"textarea\")) return true;\n        return false;\n    };\n    FocusZone1.prototype._shouldInputLoseFocus = function(element, isForward) {\n        // If a tab was used, we want to focus on the next element.\n        if (!this._processingTabKey && element && element.type && ALLOWED_INPUT_TYPES.indexOf(element.type.toLowerCase()) > -1) {\n            var selectionStart = element.selectionStart;\n            var selectionEnd = element.selectionEnd;\n            var isRangeSelected = selectionStart !== selectionEnd;\n            var inputValue = element.value;\n            var isReadonly = element.readOnly;\n            // We shouldn't lose focus in the following cases:\n            // 1. There is range selected.\n            // 2. When selection start is larger than 0 and it is backward and not readOnly.\n            // 3. when selection start is not the end of length, it is forward and not readOnly.\n            // 4. We press any of the arrow keys when our handleTabKey isn't none or undefined (only losing focus if we hit\n            // tab) and if shouldInputLoseFocusOnArrowKey is defined, if scenario prefers to not loose the focus which is\n            // determined by calling the callback shouldInputLoseFocusOnArrowKey\n            if (isRangeSelected || selectionStart > 0 && !isForward && !isReadonly || selectionStart !== inputValue.length && isForward && !isReadonly || !!this.props.handleTabKey && !(this.props.shouldInputLoseFocusOnArrowKey && this.props.shouldInputLoseFocusOnArrowKey(element))) return false;\n        }\n        return true;\n    };\n    FocusZone1.prototype._shouldWrapFocus = function(element, noWrapDataAttribute) {\n        return this.props.checkForNoWrap ? (0, _utilities.shouldWrapFocus)(element, noWrapDataAttribute) : true;\n    };\n    /**\n     * Returns true if the element is a descendant of the FocusZone through a React portal.\n     */ FocusZone1.prototype._portalContainsElement = function(element) {\n        return element && !!this._root.current && (0, _utilities.portalContainsElement)(element, this._root.current);\n    };\n    FocusZone1.prototype._getDocument = function() {\n        return (0, _utilities.getDocument)(this._root.current);\n    };\n    FocusZone1.defaultProps = {\n        isCircularNavigation: false,\n        direction: (0, _focusZoneTypes.FocusZoneDirection).bidirectional,\n        shouldRaiseClicks: true\n    };\n    return FocusZone1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@uifabric/merge-styles\":\"7c43M\",\"@uifabric/styling\":\"ka8xC\",\"@uifabric/utilities\":\"uTCgd\",\"./FocusZone.types\":\"cqjVD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cqjVD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FocusZoneTabbableElements\", ()=>FocusZoneTabbableElements);\nparcelHelpers.export(exports, \"FocusZoneDirection\", ()=>FocusZoneDirection);\nvar FocusZoneTabbableElements = {\n    /** Tabbing is not allowed */ none: 0,\n    /** All tabbing action is allowed */ all: 1,\n    /** Tabbing is allowed only on input elements */ inputOnly: 2\n};\nvar FocusZoneDirection;\n(function(FocusZoneDirection1) {\n    /** Only react to up/down arrows. */ FocusZoneDirection1[FocusZoneDirection1[\"vertical\"] = 0] = \"vertical\";\n    /** Only react to left/right arrows. */ FocusZoneDirection1[FocusZoneDirection1[\"horizontal\"] = 1] = \"horizontal\";\n    /** React to all arrows. */ FocusZoneDirection1[FocusZoneDirection1[\"bidirectional\"] = 2] = \"bidirectional\";\n    /**\n     * React to all arrows. Navigate next item in DOM on right/down arrow keys and previous - left/up arrow keys.\n     * Right and Left arrow keys are swapped in RTL mode.\n     */ FocusZoneDirection1[FocusZoneDirection1[\"domOrder\"] = 3] = \"domOrder\";\n})(FocusZoneDirection || (FocusZoneDirection = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kuuyp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _contextualMenuUtility = require(\"./contextualMenuUtility\");\nparcelHelpers.exportAll(_contextualMenuUtility, exports);\n\n},{\"./contextualMenuUtility\":\"7deuD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7deuD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Determines the effective checked state of a menu item.\n *\n * @param item {IContextualMenuItem} to get the check state of.\n * @returns {true} if the item is checked.\n * @returns {false} if the item is unchecked.\n * @returns {null} if the item is not checkable.\n */ parcelHelpers.export(exports, \"getIsChecked\", ()=>getIsChecked);\nparcelHelpers.export(exports, \"hasSubmenu\", ()=>hasSubmenu);\nparcelHelpers.export(exports, \"isItemDisabled\", ()=>isItemDisabled);\nparcelHelpers.export(exports, \"getMenuItemAriaRole\", ()=>getMenuItemAriaRole);\nfunction getIsChecked(item) {\n    if (item.canCheck) return !!(item.isChecked || item.checked);\n    if (typeof item.isChecked === \"boolean\") return item.isChecked;\n    if (typeof item.checked === \"boolean\") return item.checked;\n    // Item is not checkable.\n    return null;\n}\nfunction hasSubmenu(item) {\n    // eslint-disable-next-line deprecation/deprecation\n    return !!(item.subMenuProps || item.items);\n}\nfunction isItemDisabled(item) {\n    return !!(item.isDisabled || item.disabled);\n}\nfunction getMenuItemAriaRole(item) {\n    var isChecked = getIsChecked(item);\n    var canCheck = isChecked !== null;\n    return canCheck ? \"menuitemcheckbox\" : \"menuitem\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i57Mj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ResponsiveMode\", ()=>ResponsiveMode);\n/**\n * Allows a server rendered scenario to provide a default responsive mode.\n */ parcelHelpers.export(exports, \"setResponsiveMode\", ()=>setResponsiveMode);\n/**\n * Initializes the responsive mode to the current window size. This can be used to avoid\n * a re-render during first component mount since the window would otherwise not be measured\n * until after mounting.\n */ parcelHelpers.export(exports, \"initializeResponsiveMode\", ()=>initializeResponsiveMode);\nparcelHelpers.export(exports, \"getInitialResponsiveMode\", ()=>getInitialResponsiveMode);\nparcelHelpers.export(exports, \"withResponsiveMode\", ()=>withResponsiveMode);\nparcelHelpers.export(exports, \"getResponsiveMode\", ()=>getResponsiveMode);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _baseDecorator = require(\"./BaseDecorator\");\nvar _utilities = require(\"../../Utilities\");\nvar _windowProvider = require(\"../../WindowProvider\");\nvar ResponsiveMode;\n(function(ResponsiveMode1) {\n    ResponsiveMode1[ResponsiveMode1[\"small\"] = 0] = \"small\";\n    ResponsiveMode1[ResponsiveMode1[\"medium\"] = 1] = \"medium\";\n    ResponsiveMode1[ResponsiveMode1[\"large\"] = 2] = \"large\";\n    ResponsiveMode1[ResponsiveMode1[\"xLarge\"] = 3] = \"xLarge\";\n    ResponsiveMode1[ResponsiveMode1[\"xxLarge\"] = 4] = \"xxLarge\";\n    ResponsiveMode1[ResponsiveMode1[\"xxxLarge\"] = 5] = \"xxxLarge\";\n    ResponsiveMode1[ResponsiveMode1[\"unknown\"] = 999] = \"unknown\";\n})(ResponsiveMode || (ResponsiveMode = {}));\nvar RESPONSIVE_MAX_CONSTRAINT = [\n    479,\n    639,\n    1023,\n    1365,\n    1919,\n    99999999\n];\n/**\n * User specified mode to default to, useful for server side rendering scenarios.\n */ var _defaultMode;\n/**\n * Tracking the last mode we successfully rendered, which allows us to\n * paint initial renders with the correct size.\n */ var _lastMode;\nfunction setResponsiveMode(responsiveMode) {\n    _defaultMode = responsiveMode;\n}\nfunction initializeResponsiveMode(element) {\n    if (typeof window !== \"undefined\") {\n        var currentWindow = element && (0, _utilities.getWindow)(element) || window;\n        getResponsiveMode(currentWindow);\n    }\n}\nfunction getInitialResponsiveMode() {\n    var _a;\n    return _a = _defaultMode !== null && _defaultMode !== void 0 ? _defaultMode : _lastMode, _a !== null && _a !== void 0 ? _a : ResponsiveMode.large;\n}\nfunction withResponsiveMode(ComposedComponent) {\n    var _a;\n    var resultClass = (_a = /** @class */ function(_super) {\n        (0, _tslib.__extends)(WithResponsiveMode, _super);\n        function WithResponsiveMode(props) {\n            var _this = _super.call(this, props) || this;\n            _this._onResize = function() {\n                var responsiveMode = getResponsiveMode(_this.context.window);\n                if (responsiveMode !== _this.state.responsiveMode) _this.setState({\n                    responsiveMode: responsiveMode\n                });\n            };\n            _this._events = new (0, _utilities.EventGroup)(_this);\n            _this._updateComposedComponentRef = _this._updateComposedComponentRef.bind(_this);\n            _this.state = {\n                responsiveMode: getInitialResponsiveMode()\n            };\n            return _this;\n        }\n        WithResponsiveMode.prototype.componentDidMount = function() {\n            this._events.on(this.context.window, \"resize\", this._onResize);\n            this._onResize();\n        };\n        WithResponsiveMode.prototype.componentWillUnmount = function() {\n            this._events.dispose();\n        };\n        WithResponsiveMode.prototype.render = function() {\n            var responsiveMode = this.state.responsiveMode;\n            return responsiveMode === ResponsiveMode.unknown ? null : _react.createElement(ComposedComponent, (0, _tslib.__assign)({\n                ref: this._updateComposedComponentRef,\n                responsiveMode: responsiveMode\n            }, this.props));\n        };\n        return WithResponsiveMode;\n    }((0, _baseDecorator.BaseDecorator)), _a.contextType = (0, _windowProvider.WindowContext), _a);\n    return (0, _utilities.hoistStatics)(ComposedComponent, resultClass);\n}\nfunction getWidthOfCurrentWindow(currentWindow) {\n    try {\n        return currentWindow.document.documentElement.clientWidth;\n    } catch (e) {\n        return currentWindow.innerWidth;\n    }\n}\nfunction getResponsiveMode(currentWindow) {\n    var responsiveMode = ResponsiveMode.small;\n    if (currentWindow) {\n        try {\n            while(getWidthOfCurrentWindow(currentWindow) > RESPONSIVE_MAX_CONSTRAINT[responsiveMode])responsiveMode++;\n        } catch (e) {\n            // Return a best effort result in cases where we're in the browser but it throws on getting innerWidth.\n            responsiveMode = getInitialResponsiveMode();\n        }\n        // Tracking last mode just gives us a better default in future renders,\n        // which avoids starting with the wrong value if we've measured once.\n        _lastMode = responsiveMode;\n    } else {\n        if (_defaultMode !== undefined) responsiveMode = _defaultMode;\n        else throw new Error(\"Content was rendered in a server environment without providing a default responsive mode. Call setResponsiveMode to define what the responsive mode is.\");\n    }\n    return responsiveMode;\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./BaseDecorator\":\"5A6kT\",\"../../Utilities\":\"2F07a\",\"../../WindowProvider\":\"SBylh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5A6kT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"BaseDecorator\", ()=>BaseDecorator);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar BaseDecorator = /** @class */ function(_super) {\n    (0, _tslib.__extends)(BaseDecorator1, _super);\n    function BaseDecorator1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._updateComposedComponentRef = _this._updateComposedComponentRef.bind(_this);\n        return _this;\n    }\n    /**\n     * Updates the ref to the component composed by the decorator, which will also take care of hoisting\n     * (and unhoisting as appropriate) methods from said component.\n     *\n     * Pass this method as the argument to the 'ref' property of the composed component.\n     */ BaseDecorator1.prototype._updateComposedComponentRef = function(composedComponentInstance) {\n        this._composedComponentInstance = composedComponentInstance;\n        if (composedComponentInstance) this._hoisted = (0, _utilities.hoistMethods)(this, composedComponentInstance);\n        else if (this._hoisted) (0, _utilities.unhoistMethods)(this, this._hoisted);\n    };\n    return BaseDecorator1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"SBylh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _version = require(\"./version\");\nvar _reactWindowProvider = require(\"@fluentui/react-window-provider\");\nparcelHelpers.exportAll(_reactWindowProvider, exports);\n\n},{\"./version\":\"5jjJg\",\"@fluentui/react-window-provider\":\"5Gutx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Gutx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _windowProvider = require(\"./WindowProvider\");\nparcelHelpers.exportAll(_windowProvider, exports);\n\n},{\"./WindowProvider\":\"eR7zs\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eR7zs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"WindowContext\", ()=>WindowContext);\nparcelHelpers.export(exports, \"useWindow\", ()=>useWindow);\nparcelHelpers.export(exports, \"useDocument\", ()=>useDocument);\nparcelHelpers.export(exports, \"WindowProvider\", ()=>WindowProvider);\nvar _react = require(\"react\");\nvar WindowContext = _react.createContext({\n    window: typeof window === \"object\" ? window : undefined\n});\nvar useWindow = function() {\n    return _react.useContext(WindowContext).window;\n};\nvar useDocument = function() {\n    var _a;\n    return (_a = _react.useContext(WindowContext).window) === null || _a === void 0 ? void 0 : _a.document;\n};\nvar WindowProvider = function(props) {\n    return _react.createElement(WindowContext.Provider, {\n        value: props\n    }, props.children);\n};\n\n},{\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jhXLC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Callout/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Callout/index\":\"gJbOC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gJbOC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _callout = require(\"./Callout\");\nparcelHelpers.exportAll(_callout, exports);\nvar _calloutContent = require(\"./CalloutContent\");\nparcelHelpers.exportAll(_calloutContent, exports);\nvar _calloutContentBase = require(\"./CalloutContent.base\");\nparcelHelpers.exportAll(_calloutContentBase, exports);\nvar _focusTrapCallout = require(\"./FocusTrapCallout\");\nparcelHelpers.exportAll(_focusTrapCallout, exports);\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nparcelHelpers.exportAll(_directionalHint, exports);\n\n},{\"./Callout\":\"cpPNt\",\"./CalloutContent\":\"aOixS\",\"./CalloutContent.base\":\"2xQD9\",\"./FocusTrapCallout\":\"eNLy6\",\"../../common/DirectionalHint\":\"kARBR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cpPNt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Callout\", ()=>Callout);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _calloutContent = require(\"./CalloutContent\");\nvar _layer = require(\"../../Layer\");\nvar Callout = /** @class */ function(_super) {\n    (0, _tslib.__extends)(Callout1, _super);\n    function Callout1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    Callout1.prototype.render = function() {\n        var _a = this.props, layerProps = _a.layerProps, rest = (0, _tslib.__rest)(_a, [\n            \"layerProps\"\n        ]);\n        var content = _react.createElement((0, _calloutContent.CalloutContent), (0, _tslib.__assign)({}, rest));\n        return this.props.doNotLayer ? content : _react.createElement((0, _layer.Layer), (0, _tslib.__assign)({}, layerProps), content);\n    };\n    return Callout1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./CalloutContent\":\"aOixS\",\"../../Layer\":\"6rkPB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aOixS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CalloutContent\", ()=>CalloutContent);\nvar _utilities = require(\"../../Utilities\");\nvar _calloutContentBase = require(\"./CalloutContent.base\");\nvar _calloutContentStyles = require(\"./CalloutContent.styles\");\nvar CalloutContent = (0, _utilities.styled)((0, _calloutContentBase.CalloutContentBase), (0, _calloutContentStyles.getStyles), undefined, {\n    scope: \"CalloutContent\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./CalloutContent.base\":\"2xQD9\",\"./CalloutContent.styles\":\"csGYc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2xQD9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CalloutContentBase\", ()=>CalloutContentBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nvar _utilities = require(\"../../Utilities\");\nvar _positioning = require(\"../../utilities/positioning\");\nvar _popup = require(\"../../Popup\");\nvar _styling = require(\"../../Styling\");\nvar _a;\nvar ANIMATIONS = (_a = {}, _a[(0, _positioning.RectangleEdge).top] = (0, _styling.AnimationClassNames).slideUpIn10, _a[(0, _positioning.RectangleEdge).bottom] = (0, _styling.AnimationClassNames).slideDownIn10, _a[(0, _positioning.RectangleEdge).left] = (0, _styling.AnimationClassNames).slideLeftIn10, _a[(0, _positioning.RectangleEdge).right] = (0, _styling.AnimationClassNames).slideRightIn10, _a);\nvar getClassNames = (0, _utilities.classNamesFunction)({\n    disableCaching: true\n});\nvar BEAK_ORIGIN_POSITION = {\n    top: 0,\n    left: 0\n};\n// Microsoft Edge will overwrite inline styles if there is an animation pertaining to that style.\n// To help ensure that edge will respect the offscreen style opacity\n// filter needs to be added as an additional way to set opacity.\n// Also set pointer-events: none so that the callout will not occlude the element it is\n// going to be positioned against\nvar OFF_SCREEN_STYLE = {\n    opacity: 0,\n    filter: \"opacity(0)\",\n    pointerEvents: \"none\"\n};\n// role and role description go hand-in-hand. Both would be included by spreading getNativeProps for a basic element\n// This constant array can be used to filter these out of native props spread on callout root and apply them together on\n// calloutMain (the Popup component within the callout)\nvar ARIA_ROLE_ATTRIBUTES = [\n    \"role\",\n    \"aria-roledescription\"\n];\nvar CalloutContentBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(CalloutContentBase1, _super);\n    function CalloutContentBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._hostElement = _react.createRef();\n        _this._calloutElement = _react.createRef();\n        _this._hasListeners = false;\n        _this._disposables = [];\n        _this.dismiss = function(ev) {\n            var onDismiss = _this.props.onDismiss;\n            if (onDismiss) onDismiss(ev);\n        };\n        _this._dismissOnScroll = function(ev) {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a1 = _this.props, preventDismissOnEvent = _a1.preventDismissOnEvent, preventDismissOnScroll = _a1.preventDismissOnScroll;\n            if (_this.state.positions && (preventDismissOnEvent && !preventDismissOnEvent(ev) || !preventDismissOnEvent && !preventDismissOnScroll)) _this._dismissOnClickOrScroll(ev);\n        };\n        _this._dismissOnResize = function(ev) {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a2 = _this.props, preventDismissOnEvent = _a2.preventDismissOnEvent, preventDismissOnResize = _a2.preventDismissOnResize;\n            if (preventDismissOnEvent && !preventDismissOnEvent(ev) || !preventDismissOnEvent && !preventDismissOnResize) _this.dismiss(ev);\n        };\n        _this._dismissOnLostFocus = function(ev) {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a3 = _this.props, preventDismissOnEvent = _a3.preventDismissOnEvent, preventDismissOnLostFocus = _a3.preventDismissOnLostFocus;\n            if (preventDismissOnEvent && !preventDismissOnEvent(ev) || !preventDismissOnEvent && !preventDismissOnLostFocus) _this._dismissOnClickOrScroll(ev);\n        };\n        _this._setInitialFocus = function() {\n            if (_this.props.setInitialFocus && !_this._didSetInitialFocus && _this.state.positions && _this._calloutElement.current) {\n                _this._didSetInitialFocus = true;\n                _this._async.requestAnimationFrame(function() {\n                    return (0, _utilities.focusFirstChild)(_this._calloutElement.current);\n                }, _this._calloutElement.current);\n            }\n        };\n        _this._onComponentDidMount = function() {\n            _this._addListeners();\n            if (_this.props.onLayerMounted) _this.props.onLayerMounted();\n            _this._updateAsyncPosition();\n            _this._setHeightOffsetEveryFrame();\n        };\n        _this._dismissOnTargetWindowBlur = function(ev) {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a4 = _this.props, preventDismissOnEvent = _a4.preventDismissOnEvent, preventDismissOnLostFocus = _a4.preventDismissOnLostFocus, shouldDismissOnWindowFocus = _a4.shouldDismissOnWindowFocus;\n            // Do nothing\n            if (!shouldDismissOnWindowFocus) return;\n            if ((preventDismissOnEvent && !preventDismissOnEvent(ev) || !preventDismissOnEvent && !preventDismissOnLostFocus) && !_this._targetWindow.document.hasFocus() && ev.relatedTarget === null) _this.dismiss(ev);\n        };\n        _this._mouseDownOnPopup = function() {\n            _this._isMouseDownOnPopup = true;\n        };\n        _this._mouseUpOnPopup = function() {\n            _this._isMouseDownOnPopup = false;\n        };\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._didSetInitialFocus = false;\n        _this.state = {\n            positions: undefined,\n            slideDirectionalClassName: undefined,\n            // @TODO it looks like this is not even being used anymore.\n            calloutElementRect: undefined,\n            heightOffset: 0\n        };\n        _this._positionAttempts = 0;\n        return _this;\n    }\n    CalloutContentBase1.prototype.componentDidUpdate = function() {\n        if (!this.props.hidden) {\n            this._setInitialFocus();\n            if (!this._hasListeners) this._addListeners();\n            this._updateAsyncPosition();\n        } else if (this._hasListeners) this._removeListeners();\n    };\n    CalloutContentBase1.prototype.shouldComponentUpdate = function(newProps, newState) {\n        if (!newProps.shouldUpdateWhenHidden && this.props.hidden && newProps.hidden) // Do not update when hidden.\n        return false;\n        return !(0, _utilities.shallowCompare)(this.props, newProps) || !(0, _utilities.shallowCompare)(this.state, newState);\n    };\n    CalloutContentBase1.prototype.UNSAFE_componentWillMount = function() {\n        this._setTargetWindowAndElement(this._getTarget());\n    };\n    CalloutContentBase1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._disposables.forEach(function(dispose) {\n            return dispose();\n        });\n    };\n    CalloutContentBase1.prototype.UNSAFE_componentWillUpdate = function(newProps) {\n        // If the target element changed, find the new one. If we are tracking target with class name, always find element\n        // because we do not know if fabric has rendered a new element and disposed the old element.\n        var newTarget = this._getTarget(newProps);\n        var oldTarget = this._getTarget();\n        if ((newTarget !== oldTarget || typeof newTarget === \"string\" || newTarget instanceof String) && !this._blockResetHeight) {\n            this._maxHeight = undefined;\n            this._setTargetWindowAndElement(newTarget);\n        }\n        if (newProps.gapSpace !== this.props.gapSpace || this.props.beakWidth !== newProps.beakWidth) this._maxHeight = undefined;\n        if (newProps.finalHeight !== this.props.finalHeight) this._setHeightOffsetEveryFrame();\n        // Ensure positioning is recalculated when we are about to show a persisted menu.\n        if (this._didPositionPropsChange(newProps, this.props)) {\n            this._maxHeight = undefined;\n            // Target might have been updated while hidden.\n            this._setTargetWindowAndElement(newTarget);\n            this.setState({\n                positions: undefined\n            });\n            this._didSetInitialFocus = false;\n            this._bounds = undefined;\n        }\n        this._blockResetHeight = false;\n    };\n    CalloutContentBase1.prototype.componentDidMount = function() {\n        if (!this.props.hidden) this._onComponentDidMount();\n    };\n    CalloutContentBase1.prototype.render = function() {\n        // If there is no target window then we are likely in server side rendering and we should not render anything.\n        if (!this._targetWindow) return null;\n        var target = this.props.target;\n        var _a5 = this.props, styles = _a5.styles, style = _a5.style, ariaLabel = _a5.ariaLabel, ariaDescribedBy = _a5.ariaDescribedBy, ariaLabelledBy = _a5.ariaLabelledBy, className = _a5.className, isBeakVisible = _a5.isBeakVisible, children = _a5.children, beakWidth = _a5.beakWidth, calloutWidth = _a5.calloutWidth, calloutMaxWidth = _a5.calloutMaxWidth, calloutMinWidth = _a5.calloutMinWidth, finalHeight = _a5.finalHeight, _b = _a5.hideOverflow, hideOverflow = _b === void 0 ? !!finalHeight : _b, backgroundColor = _a5.backgroundColor, calloutMaxHeight = _a5.calloutMaxHeight, onScroll = _a5.onScroll, // eslint-disable-next-line deprecation/deprecation\n        _c = _a5.shouldRestoreFocus, // eslint-disable-next-line deprecation/deprecation\n        shouldRestoreFocus = _c === void 0 ? true : _c;\n        target = this._getTarget();\n        var positions = this.state.positions;\n        var getContentMaxHeight = this._getMaxHeight() ? this._getMaxHeight() + this.state.heightOffset : undefined;\n        var contentMaxHeight = calloutMaxHeight && getContentMaxHeight && calloutMaxHeight < getContentMaxHeight ? calloutMaxHeight : getContentMaxHeight;\n        var overflowYHidden = hideOverflow;\n        var beakVisible = isBeakVisible && !!target;\n        this._classNames = getClassNames(styles, {\n            theme: this.props.theme,\n            className: className,\n            overflowYHidden: overflowYHidden,\n            calloutWidth: calloutWidth,\n            positions: positions,\n            beakWidth: beakWidth,\n            backgroundColor: backgroundColor,\n            calloutMinWidth: calloutMinWidth,\n            calloutMaxWidth: calloutMaxWidth\n        });\n        var overflowStyle = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, style), {\n            maxHeight: contentMaxHeight\n        }), overflowYHidden && {\n            overflowY: \"hidden\"\n        });\n        var visibilityStyle = this.props.hidden ? {\n            visibility: \"hidden\"\n        } : undefined;\n        // React.CSSProperties does not understand IRawStyle, so the inline animations will need to be cast as any for now.\n        var content = _react.createElement(\"div\", {\n            ref: this._hostElement,\n            className: this._classNames.container,\n            style: visibilityStyle\n        }, _react.createElement(\"div\", (0, _tslib.__assign)({}, (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties), ARIA_ROLE_ATTRIBUTES), {\n            className: (0, _utilities.css)(this._classNames.root, positions && positions.targetEdge && ANIMATIONS[positions.targetEdge]),\n            style: positions ? positions.elementPosition : OFF_SCREEN_STYLE,\n            // Safari and Firefox on Mac OS requires this to back-stop click events so focus remains in the Callout.\n            // See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus\n            tabIndex: -1,\n            ref: this._calloutElement\n        }), beakVisible && _react.createElement(\"div\", {\n            className: this._classNames.beak,\n            style: this._getBeakPosition()\n        }), beakVisible && _react.createElement(\"div\", {\n            className: this._classNames.beakCurtain\n        }), _react.createElement((0, _popup.Popup), (0, _tslib.__assign)({}, (0, _utilities.getNativeProps)(this.props, ARIA_ROLE_ATTRIBUTES), {\n            ariaLabel: ariaLabel,\n            onRestoreFocus: this.props.onRestoreFocus,\n            ariaDescribedBy: ariaDescribedBy,\n            ariaLabelledBy: ariaLabelledBy,\n            className: this._classNames.calloutMain,\n            onDismiss: this.dismiss,\n            onScroll: onScroll,\n            shouldRestoreFocus: shouldRestoreFocus,\n            style: overflowStyle,\n            onMouseDown: this._mouseDownOnPopup,\n            onMouseUp: this._mouseUpOnPopup\n        }), children)));\n        return content;\n    };\n    CalloutContentBase1.prototype._dismissOnClickOrScroll = function(ev) {\n        var target = ev.target;\n        var isEventTargetOutsideCallout = this._hostElement.current && !(0, _utilities.elementContains)(this._hostElement.current, target);\n        // If mouse is pressed down on callout but moved outside then released, don't dismiss the callout.\n        if (isEventTargetOutsideCallout && this._isMouseDownOnPopup) {\n            this._isMouseDownOnPopup = false;\n            return;\n        }\n        if (!this._target && isEventTargetOutsideCallout || ev.target !== this._targetWindow && isEventTargetOutsideCallout && (this._target.stopPropagation || !this._target || this.props.dismissOnTargetClick || target !== this._target && !(0, _utilities.elementContains)(this._target, target))) this.dismiss(ev);\n    };\n    CalloutContentBase1.prototype._addListeners = function() {\n        var _this = this;\n        // This is added so the callout will dismiss when the window is scrolled\n        // but not when something inside the callout is scrolled. The delay seems\n        // to be required to avoid React firing an async focus event in IE from\n        // the target changing focus quickly prior to rendering the callout.\n        this._async.setTimeout(function() {\n            _this._disposables.push((0, _utilities.on)(_this._targetWindow, \"scroll\", _this._dismissOnScroll, true), (0, _utilities.on)(_this._targetWindow, \"resize\", _this._dismissOnResize, true), (0, _utilities.on)(_this._targetWindow.document.documentElement, \"focus\", _this._dismissOnLostFocus, true), (0, _utilities.on)(_this._targetWindow.document.documentElement, \"click\", _this._dismissOnLostFocus, true), (0, _utilities.on)(_this._targetWindow, \"blur\", _this._dismissOnTargetWindowBlur, true));\n            _this._hasListeners = true;\n        }, 0);\n    };\n    CalloutContentBase1.prototype._removeListeners = function() {\n        this._disposables.forEach(function(dispose) {\n            return dispose();\n        });\n        this._disposables = [];\n        this._hasListeners = false;\n    };\n    CalloutContentBase1.prototype._updateAsyncPosition = function() {\n        var _this = this;\n        this._async.requestAnimationFrame(function() {\n            return _this._updatePosition();\n        }, this._calloutElement.current);\n    };\n    CalloutContentBase1.prototype._getBeakPosition = function() {\n        var positions = this.state.positions;\n        var beakPostionStyle = (0, _tslib.__assign)({}, positions && positions.beakPosition ? positions.beakPosition.elementPosition : null);\n        if (!beakPostionStyle.top && !beakPostionStyle.bottom && !beakPostionStyle.left && !beakPostionStyle.right) {\n            beakPostionStyle.left = BEAK_ORIGIN_POSITION.left;\n            beakPostionStyle.top = BEAK_ORIGIN_POSITION.top;\n        }\n        return beakPostionStyle;\n    };\n    CalloutContentBase1.prototype._updatePosition = function() {\n        // Try to update the target, page might have changed\n        this._setTargetWindowAndElement(this._getTarget());\n        var positions = this.state.positions;\n        var hostElement = this._hostElement.current;\n        var calloutElement = this._calloutElement.current;\n        // If we expect a target element to position against, we need to wait until `this._target` is resolved. Otherwise\n        // we can try to position.\n        var expectsTarget = !!this.props.target;\n        if (hostElement && calloutElement && (!expectsTarget || this._target)) {\n            var currentProps = (0, _tslib.__assign)({}, this.props);\n            currentProps.bounds = this._getBounds();\n            currentProps.target = this._target;\n            // If there is a finalHeight given then we assume that the user knows and will handle\n            // additional positioning adjustments so we should call positionCard\n            var newPositions = this.props.finalHeight ? (0, _positioning.positionCard)(currentProps, hostElement, calloutElement, positions) : (0, _positioning.positionCallout)(currentProps, hostElement, calloutElement, positions);\n            // Set the new position only when the positions are not exists or one of the new callout positions are different.\n            // The position should not change if the position is within 2 decimal places.\n            if (!positions && newPositions || positions && newPositions && !this._arePositionsEqual(positions, newPositions) && this._positionAttempts < 5) {\n                // We should not reposition the callout more than a few times, if it is then the content is likely resizing\n                // and we should stop trying to reposition to prevent a stack overflow.\n                this._positionAttempts++;\n                this.setState({\n                    positions: newPositions\n                });\n            } else if (this._positionAttempts > 0) {\n                // Only call the onPositioned callback if the callout has been re-positioned at least once.\n                this._positionAttempts = 0;\n                if (this.props.onPositioned) this.props.onPositioned(this.state.positions);\n            }\n        }\n    };\n    CalloutContentBase1.prototype._getBounds = function() {\n        if (!this._bounds) {\n            var bounds = this.props.bounds;\n            var currentBounds = typeof bounds === \"function\" ? bounds(this.props.target, this._targetWindow) : bounds;\n            if (!currentBounds) {\n                currentBounds = (0, _positioning.getBoundsFromTargetWindow)(this._target, this._targetWindow);\n                currentBounds = {\n                    top: currentBounds.top + this.props.minPagePadding,\n                    left: currentBounds.left + this.props.minPagePadding,\n                    right: currentBounds.right - this.props.minPagePadding,\n                    bottom: currentBounds.bottom - this.props.minPagePadding,\n                    width: currentBounds.width - this.props.minPagePadding * 2,\n                    height: currentBounds.height - this.props.minPagePadding * 2\n                };\n            }\n            this._bounds = currentBounds;\n        }\n        return this._bounds;\n    };\n    // Max height should remain as synchronous as possible, which is why it is not done using set state.\n    // It needs to be synchronous since it will impact the ultimate position of the callout.\n    CalloutContentBase1.prototype._getMaxHeight = function() {\n        var _this = this;\n        if (!this._maxHeight) {\n            if (this.props.directionalHintFixed && this._target) {\n                var beakWidth = this.props.isBeakVisible ? this.props.beakWidth : 0;\n                var gapSpace = this.props.gapSpace ? this.props.gapSpace : 0;\n                // Since the callout cannot measure it's border size it must be taken into account here. Otherwise it will\n                // overlap with the target.\n                var totalGap_1 = gapSpace + beakWidth;\n                this._async.requestAnimationFrame(function() {\n                    if (_this._target) {\n                        _this._maxHeight = (0, _positioning.getMaxHeight)(_this._target, _this.props.directionalHint, totalGap_1, _this._getBounds(), _this.props.coverTarget);\n                        _this._blockResetHeight = true;\n                        _this.forceUpdate();\n                    }\n                }, this._target);\n            } else this._maxHeight = this._getBounds().height;\n        }\n        return this._maxHeight;\n    };\n    CalloutContentBase1.prototype._arePositionsEqual = function(positions, newPosition) {\n        return this._comparePositions(positions.elementPosition, newPosition.elementPosition) && this._comparePositions(positions.beakPosition.elementPosition, newPosition.beakPosition.elementPosition);\n    };\n    CalloutContentBase1.prototype._comparePositions = function(oldPositions, newPositions) {\n        for(var key in newPositions)if (newPositions.hasOwnProperty(key)) {\n            var oldPositionEdge = oldPositions[key];\n            var newPositionEdge = newPositions[key];\n            if (oldPositionEdge !== undefined && newPositionEdge !== undefined) {\n                if (oldPositionEdge.toFixed(2) !== newPositionEdge.toFixed(2)) return false;\n            } else return false;\n        }\n        return true;\n    };\n    CalloutContentBase1.prototype._setTargetWindowAndElement = function(target) {\n        var currentElement = this._calloutElement.current;\n        if (target) {\n            if (typeof target === \"string\") {\n                var currentDoc = (0, _utilities.getDocument)(currentElement);\n                this._target = currentDoc ? currentDoc.querySelector(target) : null;\n                this._targetWindow = (0, _utilities.getWindow)(currentElement);\n            // Cast to any prevents error about stopPropagation always existing\n            } else if (target.stopPropagation) {\n                this._targetWindow = (0, _utilities.getWindow)(target.target);\n                this._target = target;\n            // Same reason here\n            } else if (target.getBoundingClientRect) {\n                var targetElement = target;\n                this._targetWindow = (0, _utilities.getWindow)(targetElement);\n                this._target = targetElement;\n            } else if (target.current !== undefined) {\n                this._target = target.current;\n                this._targetWindow = (0, _utilities.getWindow)(this._target);\n            // HTMLImgElements can have x and y values. The check for it being a point must go last.\n            } else {\n                this._targetWindow = (0, _utilities.getWindow)(currentElement);\n                this._target = target;\n            }\n        } else this._targetWindow = (0, _utilities.getWindow)(currentElement);\n    };\n    CalloutContentBase1.prototype._setHeightOffsetEveryFrame = function() {\n        var _this = this;\n        if (this._calloutElement.current && this.props.finalHeight) this._setHeightOffsetTimer = this._async.requestAnimationFrame(function() {\n            var calloutMainElem = _this._calloutElement.current && _this._calloutElement.current.lastChild;\n            if (!calloutMainElem) return;\n            var cardScrollHeight = calloutMainElem.scrollHeight;\n            var cardCurrHeight = calloutMainElem.offsetHeight;\n            var scrollDiff = cardScrollHeight - cardCurrHeight;\n            _this.setState({\n                heightOffset: _this.state.heightOffset + scrollDiff\n            });\n            if (calloutMainElem.offsetHeight < _this.props.finalHeight) _this._setHeightOffsetEveryFrame();\n            else _this._async.cancelAnimationFrame(_this._setHeightOffsetTimer, _this._calloutElement.current);\n        }, this._calloutElement.current);\n    };\n    // Whether or not the current positions should be reset\n    CalloutContentBase1.prototype._didPositionPropsChange = function(newProps, oldProps) {\n        return !newProps.hidden && newProps.hidden !== oldProps.hidden || newProps.directionalHint !== oldProps.directionalHint || newProps.target !== oldProps.target;\n    };\n    CalloutContentBase1.prototype._getTarget = function(props) {\n        if (props === void 0) props = this.props;\n        var target = props.target;\n        return target;\n    };\n    CalloutContentBase1.defaultProps = {\n        preventDismissOnLostFocus: false,\n        preventDismissOnScroll: false,\n        preventDismissOnResize: false,\n        isBeakVisible: true,\n        beakWidth: 16,\n        gapSpace: 0,\n        minPagePadding: 8,\n        directionalHint: (0, _directionalHint.DirectionalHint).bottomAutoEdge\n    };\n    return CalloutContentBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../common/DirectionalHint\":\"kARBR\",\"../../Utilities\":\"2F07a\",\"../../utilities/positioning\":\"01joZ\",\"../../Popup\":\"bi7ZM\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"01joZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./positioning/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./positioning/index\":\"frJBK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"frJBK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getBoundsFromTargetWindow\", ()=>(0, _positioning.getBoundsFromTargetWindow));\nparcelHelpers.export(exports, \"getMaxHeight\", ()=>(0, _positioning.getMaxHeight));\nparcelHelpers.export(exports, \"getOppositeEdge\", ()=>(0, _positioning.getOppositeEdge));\nparcelHelpers.export(exports, \"positionCallout\", ()=>(0, _positioning.positionCallout));\nparcelHelpers.export(exports, \"positionCard\", ()=>(0, _positioning.positionCard));\nparcelHelpers.export(exports, \"positionElement\", ()=>(0, _positioning.positionElement));\nvar _positioning = require(\"./positioning\");\nvar _positioningTypes = require(\"./positioning.types\");\nparcelHelpers.exportAll(_positioningTypes, exports);\n\n},{\"./positioning\":\"d64CZ\",\"./positioning.types\":\"ifD6N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d64CZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"__positioningTestPackage\", ()=>__positioningTestPackage);\n/**\n * Used to position an element relative to the given positioning props.\n * If positioning has been completed before, previousPositions can be passed to ensure that the positioning element\n * repositions based on its previous targets rather than starting with directionalhint.\n */ parcelHelpers.export(exports, \"positionElement\", ()=>positionElement);\nparcelHelpers.export(exports, \"positionCallout\", ()=>positionCallout);\nparcelHelpers.export(exports, \"positionCard\", ()=>positionCard);\n/**\n * Gets the maximum height that a rectangle can have in order to fit below or above a target.\n * If the directional hint specifies a left or right edge (i.e. leftCenter) it will limit the height to the topBorder\n * of the target given.\n * If no bounds are provided then the window is treated as the bounds.\n */ parcelHelpers.export(exports, \"getMaxHeight\", ()=>getMaxHeight);\n/**\n * Returns the opposite edge of the given RectangleEdge.\n */ parcelHelpers.export(exports, \"getOppositeEdge\", ()=>getOppositeEdge);\nparcelHelpers.export(exports, \"getBoundsFromTargetWindow\", ()=>getBoundsFromTargetWindow);\nvar _tslib = require(\"tslib\");\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nvar _utilities = require(\"../../Utilities\");\nvar _positioningTypes = require(\"./positioning.types\");\nvar _a;\nfunction _createPositionData(targetEdge, alignmentEdge, isAuto) {\n    return {\n        targetEdge: targetEdge,\n        alignmentEdge: alignmentEdge,\n        isAuto: isAuto\n    };\n}\n// Currently the beakPercent is set to 50 for all positions meaning that it should tend to the center of the target\nvar DirectionalDictionary = (_a = {}, _a[(0, _directionalHint.DirectionalHint).topLeftEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).top, (0, _positioningTypes.RectangleEdge).left), _a[(0, _directionalHint.DirectionalHint).topCenter] = _createPositionData((0, _positioningTypes.RectangleEdge).top), _a[(0, _directionalHint.DirectionalHint).topRightEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).top, (0, _positioningTypes.RectangleEdge).right), _a[(0, _directionalHint.DirectionalHint).topAutoEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).top, undefined, true), _a[(0, _directionalHint.DirectionalHint).bottomLeftEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).bottom, (0, _positioningTypes.RectangleEdge).left), _a[(0, _directionalHint.DirectionalHint).bottomCenter] = _createPositionData((0, _positioningTypes.RectangleEdge).bottom), _a[(0, _directionalHint.DirectionalHint).bottomRightEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).bottom, (0, _positioningTypes.RectangleEdge).right), _a[(0, _directionalHint.DirectionalHint).bottomAutoEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).bottom, undefined, true), _a[(0, _directionalHint.DirectionalHint).leftTopEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).left, (0, _positioningTypes.RectangleEdge).top), _a[(0, _directionalHint.DirectionalHint).leftCenter] = _createPositionData((0, _positioningTypes.RectangleEdge).left), _a[(0, _directionalHint.DirectionalHint).leftBottomEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).left, (0, _positioningTypes.RectangleEdge).bottom), _a[(0, _directionalHint.DirectionalHint).rightTopEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).right, (0, _positioningTypes.RectangleEdge).top), _a[(0, _directionalHint.DirectionalHint).rightCenter] = _createPositionData((0, _positioningTypes.RectangleEdge).right), _a[(0, _directionalHint.DirectionalHint).rightBottomEdge] = _createPositionData((0, _positioningTypes.RectangleEdge).right, (0, _positioningTypes.RectangleEdge).bottom), _a);\nfunction _isRectangleWithinBounds(rect, boundingRect) {\n    if (rect.top < boundingRect.top) return false;\n    if (rect.bottom > boundingRect.bottom) return false;\n    if (rect.left < boundingRect.left) return false;\n    if (rect.right > boundingRect.right) return false;\n    return true;\n}\n/**\n * Gets all of the edges of a rectangle that are outside of the given bounds.\n * If there are no out of bounds edges it returns an empty array.\n */ function _getOutOfBoundsEdges(rect, boundingRect) {\n    var outOfBounds = [];\n    if (rect.top < boundingRect.top) outOfBounds.push((0, _positioningTypes.RectangleEdge).top);\n    if (rect.bottom > boundingRect.bottom) outOfBounds.push((0, _positioningTypes.RectangleEdge).bottom);\n    if (rect.left < boundingRect.left) outOfBounds.push((0, _positioningTypes.RectangleEdge).left);\n    if (rect.right > boundingRect.right) outOfBounds.push((0, _positioningTypes.RectangleEdge).right);\n    return outOfBounds;\n}\nfunction _getEdgeValue(rect, edge) {\n    return rect[(0, _positioningTypes.RectangleEdge)[edge]];\n}\nfunction _setEdgeValue(rect, edge, value) {\n    rect[(0, _positioningTypes.RectangleEdge)[edge]] = value;\n    return rect;\n}\n/**\n * Returns the middle value of an edge. Only returns 1 value rather than xy coordinates as\n * the itself already contains the other coordinate.\n * For instance, a bottom edge's current value is it's y coordinate, so the number returned is the x.\n */ function _getCenterValue(rect, edge) {\n    var edges = _getFlankingEdges(edge);\n    return (_getEdgeValue(rect, edges.positiveEdge) + _getEdgeValue(rect, edges.negativeEdge)) / 2;\n}\n/**\n * Flips the value depending on the edge.\n * If the edge is a \"positive\" edge, Top or Left, then the value should stay as it is.\n * If the edge is a \"negative\" edge, Bottom or Right, then the value should be flipped.\n * This is to account for the fact that the coordinates are effectively reveserved in certain cases for the\n * \"negative\" edges.\n *\n * For example, when testing to see if a bottom edge 1 is within the bounds of another bottom edge 2:\n * If edge 1 is greater than edge 2 then it is out of bounds. This is reversed for top edge 1 and top edge 2.\n * If top edge 1 is less than edge 2 then it is out of bounds.\n */ function _getRelativeEdgeValue(edge, value) {\n    if (edge > 0) return value;\n    else return value * -1;\n}\nfunction _getRelativeRectEdgeValue(edge, rect) {\n    return _getRelativeEdgeValue(edge, _getEdgeValue(rect, edge));\n}\nfunction _getRelativeEdgeDifference(rect, hostRect, edge) {\n    var edgeDifference = _getEdgeValue(rect, edge) - _getEdgeValue(hostRect, edge);\n    return _getRelativeEdgeValue(edge, edgeDifference);\n}\n/**\n * Moves the edge of a rectangle to the value given. It only moves the edge in a linear direction based on that edge.\n * For example, if it's a bottom edge it will only change y coordinates.\n */ function _moveEdge(rect, edge, newValue) {\n    var difference = _getEdgeValue(rect, edge) - newValue;\n    rect = _setEdgeValue(rect, edge, newValue);\n    rect = _setEdgeValue(rect, edge * -1, _getEdgeValue(rect, edge * -1) - difference);\n    return rect;\n}\n/**\n * Aligns the edge on the passed in rect to the target. If there is a gap then it will have that space between the two.\n */ function _alignEdges(rect, target, edge, gap) {\n    if (gap === void 0) gap = 0;\n    return _moveEdge(rect, edge, _getEdgeValue(target, edge) + _getRelativeEdgeValue(edge, gap));\n}\n/**\n * Aligns the targetEdge on the passed in target to the rects corresponding opposite edge.\n * For instance if targetEdge is bottom, then the rects top will be moved to match it.\n */ function _alignOppositeEdges(rect, target, targetEdge, gap) {\n    if (gap === void 0) gap = 0;\n    var oppositeEdge = targetEdge * -1;\n    var adjustedGap = _getRelativeEdgeValue(oppositeEdge, gap);\n    return _moveEdge(rect, targetEdge * -1, _getEdgeValue(target, targetEdge) + adjustedGap);\n}\n/**\n * Tests to see if the given edge is within the bounds of the given rectangle.\n */ function _isEdgeInBounds(rect, bounds, edge) {\n    var adjustedRectValue = _getRelativeRectEdgeValue(edge, rect);\n    return adjustedRectValue > _getRelativeRectEdgeValue(edge, bounds);\n}\n/**\n * Attempts to move the rectangle through various sides of the target to find a place to fit.\n * If no fit is found, the original position should be returned.\n */ function _flipToFit(rect, target, bounding, positionData, gap) {\n    if (gap === void 0) gap = 0;\n    var directions = [\n        (0, _positioningTypes.RectangleEdge).left,\n        (0, _positioningTypes.RectangleEdge).right,\n        (0, _positioningTypes.RectangleEdge).bottom,\n        (0, _positioningTypes.RectangleEdge).top, \n    ];\n    // In RTL page, RectangleEdge.right has a higher priority than RectangleEdge.left, so the order should be updated.\n    if ((0, _utilities.getRTL)()) {\n        directions[0] *= -1;\n        directions[1] *= -1;\n    }\n    var currentEstimate = rect;\n    var currentEdge = positionData.targetEdge;\n    var currentAlignment = positionData.alignmentEdge;\n    // Keep switching sides until one is found with enough space.\n    // If all sides don't fit then return the unmodified element.\n    for(var i = 0; i < 4; i++){\n        if (!_isEdgeInBounds(currentEstimate, bounding, currentEdge)) {\n            directions.splice(directions.indexOf(currentEdge), 1);\n            if (directions.length > 0) {\n                if (directions.indexOf(currentEdge * -1) > -1) currentEdge = currentEdge * -1;\n                else {\n                    currentAlignment = currentEdge;\n                    currentEdge = directions.slice(-1)[0];\n                }\n                currentEstimate = _estimatePosition(rect, target, {\n                    targetEdge: currentEdge,\n                    alignmentEdge: currentAlignment\n                }, gap);\n            }\n        } else return {\n            elementRectangle: currentEstimate,\n            targetEdge: currentEdge,\n            alignmentEdge: currentAlignment\n        };\n    }\n    return {\n        elementRectangle: rect,\n        targetEdge: positionData.targetEdge,\n        alignmentEdge: positionData.alignmentEdge\n    };\n}\n/**\n * Flips only the alignment edge of an element rectangle. This is used instead of nudging the alignment edges\n * into position, when alignTargetEdge is specified.\n */ function _flipAlignmentEdge(elementEstimate, target, gap, coverTarget) {\n    var alignmentEdge = elementEstimate.alignmentEdge, targetEdge = elementEstimate.targetEdge, elementRectangle = elementEstimate.elementRectangle;\n    var oppositeEdge = alignmentEdge * -1;\n    var newEstimate = _estimatePosition(elementRectangle, target, {\n        targetEdge: targetEdge,\n        alignmentEdge: oppositeEdge\n    }, gap, coverTarget);\n    return {\n        elementRectangle: newEstimate,\n        targetEdge: targetEdge,\n        alignmentEdge: oppositeEdge\n    };\n}\n/**\n * Adjusts a element rectangle to fit within the bounds given. If directionalHintFixed or covertarget is passed in\n * then the element will not flip sides on the target. They will, however, be nudged to fit within the bounds given.\n */ function _adjustFitWithinBounds(element, target, bounding, positionData, gap, directionalHintFixed, coverTarget) {\n    if (gap === void 0) gap = 0;\n    var alignmentEdge = positionData.alignmentEdge, alignTargetEdge = positionData.alignTargetEdge;\n    var elementEstimate = {\n        elementRectangle: element,\n        targetEdge: positionData.targetEdge,\n        alignmentEdge: alignmentEdge\n    };\n    if (!directionalHintFixed && !coverTarget) elementEstimate = _flipToFit(element, target, bounding, positionData, gap);\n    var outOfBounds = _getOutOfBoundsEdges(element, bounding);\n    if (alignTargetEdge) // The edge opposite to the alignment edge might be out of bounds.\n    // Flip alignment to see if we can get it within bounds.\n    {\n        if (elementEstimate.alignmentEdge && outOfBounds.indexOf(elementEstimate.alignmentEdge * -1) > -1) {\n            var flippedElementEstimate = _flipAlignmentEdge(elementEstimate, target, gap, coverTarget);\n            if (_isRectangleWithinBounds(flippedElementEstimate.elementRectangle, bounding)) return flippedElementEstimate;\n            else // If the flipped elements edges are still out of bounds, try nudging it.\n            elementEstimate = _alignOutOfBoundsEdges(_getOutOfBoundsEdges(flippedElementEstimate.elementRectangle, bounding), elementEstimate, bounding);\n        }\n    } else elementEstimate = _alignOutOfBoundsEdges(outOfBounds, elementEstimate, bounding);\n    return elementEstimate;\n}\n/**\n * Iterates through a list of out of bounds edges and tries to nudge and align them.\n * @param outOfBoundsEdges - Array of edges that are out of bounds\n * @param elementEstimate - The current element positioning estimate\n * @param bounding - The current bounds\n */ function _alignOutOfBoundsEdges(outOfBoundsEdges, elementEstimate, bounding) {\n    for(var _i = 0, outOfBoundsEdges_1 = outOfBoundsEdges; _i < outOfBoundsEdges_1.length; _i++){\n        var direction = outOfBoundsEdges_1[_i];\n        elementEstimate.elementRectangle = _alignEdges(elementEstimate.elementRectangle, bounding, direction);\n    }\n    return elementEstimate;\n}\n/**\n * Moves the middle point on an edge to the point given.\n * Only moves in one direction. For instance if a bottom edge is passed in, then\n * the bottom edge will be moved in the x axis to match the point.\n */ function _centerEdgeToPoint(rect, edge, point) {\n    var positiveEdge = _getFlankingEdges(edge).positiveEdge;\n    var elementMiddle = _getCenterValue(rect, edge);\n    var distanceToMiddle = elementMiddle - _getEdgeValue(rect, positiveEdge);\n    return _moveEdge(rect, positiveEdge, point - distanceToMiddle);\n}\n/**\n * Moves the element rectangle to be appropriately positioned relative to a given target.\n * Does not flip or adjust the element.\n */ function _estimatePosition(elementToPosition, target, positionData, gap, coverTarget) {\n    if (gap === void 0) gap = 0;\n    var estimatedElementPosition;\n    var alignmentEdge = positionData.alignmentEdge, targetEdge = positionData.targetEdge;\n    var elementEdge = coverTarget ? targetEdge : targetEdge * -1;\n    estimatedElementPosition = coverTarget ? _alignEdges(elementToPosition, target, targetEdge, gap) : _alignOppositeEdges(elementToPosition, target, targetEdge, gap);\n    // if no alignment edge is provided it's supposed to be centered.\n    if (!alignmentEdge) {\n        var targetMiddlePoint = _getCenterValue(target, targetEdge);\n        estimatedElementPosition = _centerEdgeToPoint(estimatedElementPosition, elementEdge, targetMiddlePoint);\n    } else estimatedElementPosition = _alignEdges(estimatedElementPosition, target, alignmentEdge);\n    return estimatedElementPosition;\n}\n/**\n * Returns the non-opposite edges of the target edge.\n * For instance if bottom is passed in then left and right will be returned.\n */ function _getFlankingEdges(edge) {\n    if (edge === (0, _positioningTypes.RectangleEdge).top || edge === (0, _positioningTypes.RectangleEdge).bottom) return {\n        positiveEdge: (0, _positioningTypes.RectangleEdge).left,\n        negativeEdge: (0, _positioningTypes.RectangleEdge).right\n    };\n    else return {\n        positiveEdge: (0, _positioningTypes.RectangleEdge).top,\n        negativeEdge: (0, _positioningTypes.RectangleEdge).bottom\n    };\n}\n/**\n * Retrieve the final value for the return edge of elementRectangle. If the elementRectangle is closer to one side\n * of the bounds versus the other, the return edge is flipped to grow inward.\n */ function _finalizeReturnEdge(elementRectangle, returnEdge, bounds) {\n    if (bounds && Math.abs(_getRelativeEdgeDifference(elementRectangle, bounds, returnEdge)) > Math.abs(_getRelativeEdgeDifference(elementRectangle, bounds, returnEdge * -1))) return returnEdge * -1;\n    return returnEdge;\n}\n/**\n * Finalizes the element positon based on the hostElement. Only returns the\n * rectangle values to position such that they are anchored to the target.\n * This helps prevent resizing from looking very strange.\n * For instance, if the target edge is top and aligned with the left side then\n * the bottom and left values are returned so as the callou shrinks it shrinks towards that corner.\n */ function _finalizeElementPosition(elementRectangle, hostElement, targetEdge, bounds, alignmentEdge, coverTarget, doNotFinalizeReturnEdge) {\n    var returnValue = {};\n    var hostRect = _getRectangleFromElement(hostElement);\n    var elementEdge = coverTarget ? targetEdge : targetEdge * -1;\n    var elementEdgeString = (0, _positioningTypes.RectangleEdge)[elementEdge];\n    var returnEdge = alignmentEdge ? alignmentEdge : _getFlankingEdges(targetEdge).positiveEdge;\n    if (!doNotFinalizeReturnEdge) returnEdge = _finalizeReturnEdge(elementRectangle, returnEdge, bounds);\n    returnValue[elementEdgeString] = _getRelativeEdgeDifference(elementRectangle, hostRect, elementEdge);\n    returnValue[(0, _positioningTypes.RectangleEdge)[returnEdge]] = _getRelativeEdgeDifference(elementRectangle, hostRect, returnEdge);\n    return returnValue;\n}\n// Since the beak is rotated 45 degrees the actual height/width is the length of the diagonal.\n// We still want to position the beak based on it's midpoint which does not change. It will\n// be at (beakwidth / 2, beakwidth / 2)\nfunction _calculateActualBeakWidthInPixels(beakWidth) {\n    return Math.sqrt(beakWidth * beakWidth * 2);\n}\n/**\n * Returns the appropriate IPositionData based on the props altered for RTL.\n * If directionalHintForRTL is passed in that is used if the page is RTL.\n * If directionalHint is specified, no directionalHintForRTL is available, and the page is RTL, the hint will be\n * flipped (e.g. bottomLeftEdge would become bottomRightEdge).\n *\n * If there is no directionalHint passed in, bottomAutoEdge is chosen automatically.\n */ function _getPositionData(directionalHint, directionalHintForRTL, previousPositions) {\n    if (directionalHint === void 0) directionalHint = (0, _directionalHint.DirectionalHint).bottomAutoEdge;\n    if (previousPositions) return {\n        alignmentEdge: previousPositions.alignmentEdge,\n        isAuto: previousPositions.isAuto,\n        targetEdge: previousPositions.targetEdge\n    };\n    var positionInformation = (0, _tslib.__assign)({}, DirectionalDictionary[directionalHint]);\n    if ((0, _utilities.getRTL)()) {\n        // If alignment edge exists and that alignment edge is -2 or 2, right or left, then flip it.\n        if (positionInformation.alignmentEdge && positionInformation.alignmentEdge % 2 === 0) positionInformation.alignmentEdge = positionInformation.alignmentEdge * -1;\n        return directionalHintForRTL !== undefined ? DirectionalDictionary[directionalHintForRTL] : positionInformation;\n    }\n    return positionInformation;\n}\n/**\n * Get's the alignment data for the given information. This only really matters if the positioning is Auto.\n * If it is auto then the alignmentEdge should be chosen based on the target edge's position relative to\n * the center of the page.\n */ function _getAlignmentData(positionData, target, boundingRect, coverTarget, alignTargetEdge) {\n    if (positionData.isAuto) positionData.alignmentEdge = getClosestEdge(positionData.targetEdge, target, boundingRect);\n    positionData.alignTargetEdge = alignTargetEdge;\n    return positionData;\n}\nfunction getClosestEdge(targetEdge, target, boundingRect) {\n    var targetCenter = _getCenterValue(target, targetEdge);\n    var boundingCenter = _getCenterValue(boundingRect, targetEdge);\n    var _a1 = _getFlankingEdges(targetEdge), positiveEdge = _a1.positiveEdge, negativeEdge = _a1.negativeEdge;\n    if (targetCenter <= boundingCenter) return positiveEdge;\n    else return negativeEdge;\n}\nfunction _positionElementWithinBounds(elementToPosition, target, bounding, positionData, gap, directionalHintFixed, coverTarget) {\n    var estimatedElementPosition = _estimatePosition(elementToPosition, target, positionData, gap, coverTarget);\n    if (_isRectangleWithinBounds(estimatedElementPosition, bounding)) return {\n        elementRectangle: estimatedElementPosition,\n        targetEdge: positionData.targetEdge,\n        alignmentEdge: positionData.alignmentEdge\n    };\n    else return _adjustFitWithinBounds(elementToPosition, target, bounding, positionData, gap, directionalHintFixed, coverTarget);\n}\nfunction _finalizeBeakPosition(elementPosition, positionedBeak, bounds) {\n    var targetEdge = elementPosition.targetEdge * -1;\n    // The \"host\" element that we will use to help position the beak.\n    var actualElement = new (0, _utilities.Rectangle)(0, elementPosition.elementRectangle.width, 0, elementPosition.elementRectangle.height);\n    var returnValue = {};\n    var returnEdge = _finalizeReturnEdge(elementPosition.elementRectangle, elementPosition.alignmentEdge ? elementPosition.alignmentEdge : _getFlankingEdges(targetEdge).positiveEdge, bounds);\n    returnValue[(0, _positioningTypes.RectangleEdge)[targetEdge]] = _getEdgeValue(positionedBeak, targetEdge);\n    returnValue[(0, _positioningTypes.RectangleEdge)[returnEdge]] = _getRelativeEdgeDifference(positionedBeak, actualElement, returnEdge);\n    return {\n        elementPosition: (0, _tslib.__assign)({}, returnValue),\n        closestEdge: getClosestEdge(elementPosition.targetEdge, positionedBeak, actualElement),\n        targetEdge: targetEdge\n    };\n}\nfunction _positionBeak(beakWidth, elementPosition) {\n    var target = elementPosition.targetRectangle;\n    /**\n     * Note about beak positioning: The actual beak width only matters for getting the gap between the callout and\n     * target, it does not impact the beak placement within the callout. For example example, if the beakWidth is 8,\n     * then the actual beakWidth is sqrroot(8^2 + 8^2) = 11.31x11.31. So the callout will need to be an extra 3 pixels\n     * away from its target. While the beak is being positioned in the callout it still acts as though it were 8x8.\n     */ var _a2 = _getFlankingEdges(elementPosition.targetEdge), positiveEdge = _a2.positiveEdge, negativeEdge = _a2.negativeEdge;\n    var beakTargetPoint = _getCenterValue(target, elementPosition.targetEdge);\n    var elementBounds = new (0, _utilities.Rectangle)(beakWidth / 2, elementPosition.elementRectangle.width - beakWidth / 2, beakWidth / 2, elementPosition.elementRectangle.height - beakWidth / 2);\n    var beakPosition = new (0, _utilities.Rectangle)(0, beakWidth, 0, beakWidth);\n    beakPosition = _moveEdge(beakPosition, elementPosition.targetEdge * -1, -beakWidth / 2);\n    beakPosition = _centerEdgeToPoint(beakPosition, elementPosition.targetEdge * -1, beakTargetPoint - _getRelativeRectEdgeValue(positiveEdge, elementPosition.elementRectangle));\n    if (!_isEdgeInBounds(beakPosition, elementBounds, positiveEdge)) beakPosition = _alignEdges(beakPosition, elementBounds, positiveEdge);\n    else if (!_isEdgeInBounds(beakPosition, elementBounds, negativeEdge)) beakPosition = _alignEdges(beakPosition, elementBounds, negativeEdge);\n    return beakPosition;\n}\nfunction _getRectangleFromElement(element) {\n    var clientRect = element.getBoundingClientRect();\n    return new (0, _utilities.Rectangle)(clientRect.left, clientRect.right, clientRect.top, clientRect.bottom);\n}\nfunction _getRectangleFromIRect(rect) {\n    return new (0, _utilities.Rectangle)(rect.left, rect.right, rect.top, rect.bottom);\n}\nfunction _getTargetRect(bounds, target) {\n    var targetRectangle;\n    if (target) {\n        // eslint-disable-next-line no-extra-boolean-cast\n        if (!!target.preventDefault) {\n            var ev = target;\n            targetRectangle = new (0, _utilities.Rectangle)(ev.clientX, ev.clientX, ev.clientY, ev.clientY);\n        // eslint-disable-next-line no-extra-boolean-cast\n        } else if (!!target.getBoundingClientRect) targetRectangle = _getRectangleFromElement(target);\n        else {\n            var rectOrPoint = target;\n            // eslint-disable-next-line deprecation/deprecation\n            var left = rectOrPoint.left || rectOrPoint.x;\n            // eslint-disable-next-line deprecation/deprecation\n            var top_1 = rectOrPoint.top || rectOrPoint.y;\n            var right = rectOrPoint.right || left;\n            var bottom = rectOrPoint.bottom || top_1;\n            targetRectangle = new (0, _utilities.Rectangle)(left, right, top_1, bottom);\n        }\n        if (!_isRectangleWithinBounds(targetRectangle, bounds)) {\n            var outOfBounds = _getOutOfBoundsEdges(targetRectangle, bounds);\n            for(var _i = 0, outOfBounds_1 = outOfBounds; _i < outOfBounds_1.length; _i++){\n                var direction = outOfBounds_1[_i];\n                targetRectangle[(0, _positioningTypes.RectangleEdge)[direction]] = bounds[(0, _positioningTypes.RectangleEdge)[direction]];\n            }\n        }\n    } else targetRectangle = new (0, _utilities.Rectangle)(0, 0, 0, 0);\n    return targetRectangle;\n}\n/**\n * If max height is less than zero it returns the bounds height instead.\n */ function _getMaxHeightFromTargetRectangle(targetRectangle, targetEdge, gapSpace, bounds, coverTarget) {\n    var maxHeight = 0;\n    var directionalHint = DirectionalDictionary[targetEdge];\n    // If cover target is set, then the max height should be calculated using the opposite of the target edge since\n    // that's the direction that the callout will expand in.\n    // For instance, if the directionalhint is bottomLeftEdge then the callout will position so it's bottom edge\n    // is aligned with the bottom of the target and expand up towards the top of the screen and the calculated max height\n    // is (bottom of target) - (top of screen) - gapSpace.\n    var target = coverTarget ? directionalHint.targetEdge * -1 : directionalHint.targetEdge;\n    if (target === (0, _positioningTypes.RectangleEdge).top) maxHeight = _getEdgeValue(targetRectangle, directionalHint.targetEdge) - bounds.top - gapSpace;\n    else if (target === (0, _positioningTypes.RectangleEdge).bottom) maxHeight = bounds.bottom - _getEdgeValue(targetRectangle, directionalHint.targetEdge) - gapSpace;\n    else maxHeight = bounds.bottom - targetRectangle.top - gapSpace;\n    return maxHeight > 0 ? maxHeight : bounds.height;\n}\nfunction _positionElementRelative(props, elementToPosition, boundingRect, previousPositions) {\n    var gap = props.gapSpace ? props.gapSpace : 0;\n    var targetRect = _getTargetRect(boundingRect, props.target);\n    var positionData = _getAlignmentData(_getPositionData(props.directionalHint, props.directionalHintForRTL, previousPositions), targetRect, boundingRect, props.coverTarget, props.alignTargetEdge);\n    var positionedElement = _positionElementWithinBounds(_getRectangleFromElement(elementToPosition), targetRect, boundingRect, positionData, gap, props.directionalHintFixed, props.coverTarget);\n    return (0, _tslib.__assign)((0, _tslib.__assign)({}, positionedElement), {\n        targetRectangle: targetRect\n    });\n}\nfunction _finalizePositionData(positionedElement, hostElement, bounds, coverTarget, doNotFinalizeReturnEdge) {\n    var finalizedElement = _finalizeElementPosition(positionedElement.elementRectangle, hostElement, positionedElement.targetEdge, bounds, positionedElement.alignmentEdge, coverTarget, doNotFinalizeReturnEdge);\n    return {\n        elementPosition: finalizedElement,\n        targetEdge: positionedElement.targetEdge,\n        alignmentEdge: positionedElement.alignmentEdge\n    };\n}\nfunction _positionElement(props, hostElement, elementToPosition, previousPositions) {\n    var boundingRect = props.bounds ? _getRectangleFromIRect(props.bounds) : new (0, _utilities.Rectangle)(0, window.innerWidth - (0, _utilities.getScrollbarWidth)(), 0, window.innerHeight);\n    var positionedElement = _positionElementRelative(props, elementToPosition, boundingRect, previousPositions);\n    return _finalizePositionData(positionedElement, hostElement, boundingRect, props.coverTarget);\n}\nfunction _positionCallout(props, hostElement, callout, previousPositions, doNotFinalizeReturnEdge) {\n    var beakWidth = props.isBeakVisible ? props.beakWidth || 0 : 0;\n    var gap = _calculateActualBeakWidthInPixels(beakWidth) / 2 + (props.gapSpace ? props.gapSpace : 0);\n    var positionProps = props;\n    positionProps.gapSpace = gap;\n    var boundingRect = props.bounds ? _getRectangleFromIRect(props.bounds) : new (0, _utilities.Rectangle)(0, window.innerWidth - (0, _utilities.getScrollbarWidth)(), 0, window.innerHeight);\n    var positionedElement = _positionElementRelative(positionProps, callout, boundingRect, previousPositions);\n    var beakPositioned = _positionBeak(beakWidth, positionedElement);\n    var finalizedBeakPosition = _finalizeBeakPosition(positionedElement, beakPositioned, boundingRect);\n    return (0, _tslib.__assign)((0, _tslib.__assign)({}, _finalizePositionData(positionedElement, hostElement, boundingRect, props.coverTarget, doNotFinalizeReturnEdge)), {\n        beakPosition: finalizedBeakPosition\n    });\n}\nfunction _positionCard(props, hostElement, callout, previousPositions) {\n    return _positionCallout(props, hostElement, callout, previousPositions, true);\n}\nvar __positioningTestPackage = {\n    _finalizePositionData: _finalizePositionData,\n    _finalizeBeakPosition: _finalizeBeakPosition,\n    _calculateActualBeakWidthInPixels: _calculateActualBeakWidthInPixels,\n    _positionElementWithinBounds: _positionElementWithinBounds,\n    _positionBeak: _positionBeak,\n    _getPositionData: _getPositionData,\n    _getMaxHeightFromTargetRectangle: _getMaxHeightFromTargetRectangle\n};\nfunction positionElement(props, hostElement, elementToPosition, previousPositions) {\n    return _positionElement(props, hostElement, elementToPosition, previousPositions);\n}\nfunction positionCallout(props, hostElement, elementToPosition, previousPositions) {\n    return _positionCallout(props, hostElement, elementToPosition, previousPositions);\n}\nfunction positionCard(props, hostElement, elementToPosition, previousPositions) {\n    return _positionCard(props, hostElement, elementToPosition, previousPositions);\n}\nfunction getMaxHeight(target, targetEdge, gapSpace, bounds, coverTarget) {\n    if (gapSpace === void 0) gapSpace = 0;\n    var mouseTarget = target;\n    var elementTarget = target;\n    var rectOrPointTarget = target;\n    var targetRect;\n    var boundingRectangle = bounds ? _getRectangleFromIRect(bounds) : new (0, _utilities.Rectangle)(0, window.innerWidth - (0, _utilities.getScrollbarWidth)(), 0, window.innerHeight);\n    // eslint-disable-next-line deprecation/deprecation\n    var left = rectOrPointTarget.left || rectOrPointTarget.x;\n    // eslint-disable-next-line deprecation/deprecation\n    var top = rectOrPointTarget.top || rectOrPointTarget.y;\n    var right = rectOrPointTarget.right || left;\n    var bottom = rectOrPointTarget.bottom || top;\n    // eslint-disable-next-line no-extra-boolean-cast -- may not actually be a MouseEvent\n    if (!!mouseTarget.stopPropagation) targetRect = new (0, _utilities.Rectangle)(mouseTarget.clientX, mouseTarget.clientX, mouseTarget.clientY, mouseTarget.clientY);\n    else if (left !== undefined && top !== undefined) targetRect = new (0, _utilities.Rectangle)(left, right, top, bottom);\n    else targetRect = _getRectangleFromElement(elementTarget);\n    return _getMaxHeightFromTargetRectangle(targetRect, targetEdge, gapSpace, boundingRectangle, coverTarget);\n}\nfunction getOppositeEdge(edge) {\n    return edge * -1;\n}\nfunction _getBoundsFromTargetWindow(target, targetWindow) {\n    var segments = undefined;\n    if (targetWindow.getWindowSegments) segments = targetWindow.getWindowSegments();\n    // Identify if we're dealing with single screen scenarios.\n    if (segments === undefined || segments.length <= 1) return {\n        top: 0,\n        left: 0,\n        right: targetWindow.innerWidth,\n        bottom: targetWindow.innerHeight,\n        width: targetWindow.innerWidth,\n        height: targetWindow.innerHeight\n    };\n    // Logic for determining dual screen scenarios.\n    var x = 0;\n    var y = 0;\n    // If the target is an Element get coordinates for its center.\n    if (target !== null && !!target.getBoundingClientRect) {\n        var clientRect = target.getBoundingClientRect();\n        x = (clientRect.left + clientRect.right) / 2;\n        y = (clientRect.top + clientRect.bottom) / 2;\n    } else if (target !== null) {\n        // eslint-disable-next-line deprecation/deprecation\n        x = target.left || target.x;\n        // eslint-disable-next-line deprecation/deprecation\n        y = target.top || target.y;\n    }\n    var bounds = {\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        width: 0,\n        height: 0\n    };\n    // Define which window segment are the coordinates in and calculate bounds based on that.\n    for(var _i = 0, segments_1 = segments; _i < segments_1.length; _i++){\n        var segment = segments_1[_i];\n        if (x && segment.left <= x && segment.right >= x && y && segment.top <= y && segment.bottom >= y) bounds = {\n            top: segment.top,\n            left: segment.left,\n            right: segment.right,\n            bottom: segment.bottom,\n            width: segment.width,\n            height: segment.height\n        };\n    }\n    return bounds;\n}\nfunction getBoundsFromTargetWindow(target, targetWindow) {\n    return _getBoundsFromTargetWindow(target, targetWindow);\n}\n\n},{\"tslib\":\"01Tx1\",\"../../common/DirectionalHint\":\"kARBR\",\"../../Utilities\":\"2F07a\",\"./positioning.types\":\"ifD6N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ifD6N\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"RectangleEdge\", ()=>RectangleEdge);\nparcelHelpers.export(exports, \"Position\", ()=>Position);\nvar RectangleEdge;\n(function(RectangleEdge1) {\n    RectangleEdge1[RectangleEdge1[\"top\"] = 1] = \"top\";\n    RectangleEdge1[RectangleEdge1[\"bottom\"] = -1] = \"bottom\";\n    RectangleEdge1[RectangleEdge1[\"left\"] = 2] = \"left\";\n    RectangleEdge1[RectangleEdge1[\"right\"] = -2] = \"right\";\n})(RectangleEdge || (RectangleEdge = {}));\nvar Position;\n(function(Position1) {\n    Position1[Position1[\"top\"] = 0] = \"top\";\n    Position1[Position1[\"bottom\"] = 1] = \"bottom\";\n    Position1[Position1[\"start\"] = 2] = \"start\";\n    Position1[Position1[\"end\"] = 3] = \"end\";\n})(Position || (Position = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bi7ZM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Popup/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Popup/index\":\"895s5\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"895s5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _popup = require(\"./Popup\");\nparcelHelpers.exportAll(_popup, exports);\n\n},{\"./Popup\":\"j4dfT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j4dfT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Popup\", ()=>Popup);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\n/**\n * This adds accessibility to Dialog and Panel controls\n */ var Popup = /** @class */ function(_super) {\n    (0, _tslib.__extends)(Popup1, _super);\n    function Popup1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._root = _react.createRef();\n        _this._disposables = [];\n        _this._onKeyDown = function(ev) {\n            switch(ev.which){\n                case (0, _utilities.KeyCodes).escape:\n                    if (_this.props.onDismiss) {\n                        _this.props.onDismiss(ev);\n                        ev.preventDefault();\n                        ev.stopPropagation();\n                    }\n                    break;\n            }\n        };\n        _this._onFocus = function() {\n            _this._containsFocus = true;\n        };\n        _this._onBlur = function(ev) {\n            /** The popup should update this._containsFocus when:\n             * relatedTarget exists AND\n             * the relatedTarget is not contained within the popup.\n             * If the relatedTarget is within the popup, that means the popup still has focus\n             * and focused moved from one element to another within the popup.\n             * If relatedTarget is undefined or null that usually means that a\n             * keyboard event occured and focus didn't change\n             */ if (_this._root.current && ev.relatedTarget && !(0, _utilities.elementContains)(_this._root.current, ev.relatedTarget)) _this._containsFocus = false;\n        };\n        _this._async = new (0, _utilities.Async)(_this);\n        _this.state = {\n            needsVerticalScrollBar: false\n        };\n        return _this;\n    }\n    Popup1.prototype.UNSAFE_componentWillMount = function() {\n        this._originalFocusedElement = (0, _utilities.getDocument)().activeElement;\n    };\n    Popup1.prototype.componentDidMount = function() {\n        if (this._root.current) {\n            this._disposables.push((0, _utilities.on)(this._root.current, \"focus\", this._onFocus, true), (0, _utilities.on)(this._root.current, \"blur\", this._onBlur, true));\n            var currentWindow = (0, _utilities.getWindow)(this._root.current);\n            if (currentWindow) this._disposables.push((0, _utilities.on)(currentWindow, \"keydown\", this._onKeyDown));\n            if ((0, _utilities.doesElementContainFocus)(this._root.current)) this._containsFocus = true;\n        }\n        this._updateScrollBarAsync();\n    };\n    Popup1.prototype.componentDidUpdate = function() {\n        this._updateScrollBarAsync();\n        this._async.dispose();\n    };\n    Popup1.prototype.componentWillUnmount = function() {\n        var _a;\n        this._disposables.forEach(function(dispose) {\n            return dispose();\n        });\n        // eslint-disable-next-line deprecation/deprecation\n        if (this.props.shouldRestoreFocus) {\n            var _b = this.props.onRestoreFocus, onRestoreFocus = _b === void 0 ? defaultFocusRestorer : _b;\n            onRestoreFocus({\n                originalElement: this._originalFocusedElement,\n                containsFocus: this._containsFocus,\n                documentContainsFocus: ((_a = (0, _utilities.getDocument)()) === null || _a === void 0 ? void 0 : _a.hasFocus()) || false\n            });\n        }\n        // De-reference DOM Node to avoid retainment via transpiled closure of _onKeyDown\n        delete this._originalFocusedElement;\n    };\n    Popup1.prototype.render = function() {\n        var _a = this.props, role = _a.role, className = _a.className, ariaLabel = _a.ariaLabel, ariaLabelledBy = _a.ariaLabelledBy, ariaDescribedBy = _a.ariaDescribedBy, style = _a.style;\n        return _react.createElement(\"div\", (0, _tslib.__assign)({\n            ref: this._root\n        }, (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties)), {\n            className: className,\n            role: role,\n            \"aria-label\": ariaLabel,\n            \"aria-labelledby\": ariaLabelledBy,\n            \"aria-describedby\": ariaDescribedBy,\n            onKeyDown: this._onKeyDown,\n            style: (0, _tslib.__assign)({\n                overflowY: this.state.needsVerticalScrollBar ? \"scroll\" : undefined,\n                outline: \"none\"\n            }, style)\n        }), this.props.children);\n    };\n    Popup1.prototype._updateScrollBarAsync = function() {\n        var _this = this;\n        this._async.requestAnimationFrame(function() {\n            _this._getScrollBar();\n        });\n    };\n    Popup1.prototype._getScrollBar = function() {\n        // If overflowY is overriden, don't waste time calculating whether the scrollbar is necessary.\n        if (this.props.style && this.props.style.overflowY) return;\n        var needsVerticalScrollBar = false;\n        if (this._root && this._root.current && this._root.current.firstElementChild) {\n            // ClientHeight returns the client height of an element rounded to an\n            // integer. On some browsers at different zoom levels this rounding\n            // can generate different results for the root container and child even\n            // though they are the same height. This causes us to show a scroll bar\n            // when not needed. Ideally we would use BoundingClientRect().height\n            // instead however seems that the API is 90% slower than using ClientHeight.\n            // Therefore instead we will calculate the difference between heights and\n            // allow for a 1px difference to still be considered ok and not show the\n            // scroll bar.\n            var rootHeight = this._root.current.clientHeight;\n            var firstChildHeight = this._root.current.firstElementChild.clientHeight;\n            if (rootHeight > 0 && firstChildHeight > rootHeight) needsVerticalScrollBar = firstChildHeight - rootHeight > 1;\n        }\n        if (this.state.needsVerticalScrollBar !== needsVerticalScrollBar) this.setState({\n            needsVerticalScrollBar: needsVerticalScrollBar\n        });\n    };\n    Popup1.defaultProps = {\n        shouldRestoreFocus: true\n    };\n    return Popup1;\n}(_react.Component);\nfunction defaultFocusRestorer(options) {\n    var originalElement = options.originalElement, containsFocus = options.containsFocus;\n    if (originalElement && containsFocus && originalElement !== window) // Make sure that the focus method actually exists\n    // In some cases the object might exist but not be a real element.\n    // This is primarily for IE 11 and should be removed once IE 11 is no longer in use.\n    {\n        if (originalElement.focus) originalElement.focus();\n    }\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"csGYc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nfunction getBeakStyle(beakWidth) {\n    return {\n        height: beakWidth,\n        width: beakWidth\n    };\n}\nvar GlobalClassNames = {\n    container: \"ms-Callout-container\",\n    root: \"ms-Callout\",\n    beak: \"ms-Callout-beak\",\n    beakCurtain: \"ms-Callout-beakCurtain\",\n    calloutMain: \"ms-Callout-main\"\n};\nvar getStyles = function(props) {\n    var _a;\n    var theme = props.theme, className = props.className, overflowYHidden = props.overflowYHidden, calloutWidth = props.calloutWidth, beakWidth = props.beakWidth, backgroundColor = props.backgroundColor, calloutMaxWidth = props.calloutMaxWidth, calloutMinWidth = props.calloutMinWidth;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    var semanticColors = theme.semanticColors, effects = theme.effects;\n    return {\n        container: [\n            classNames.container,\n            {\n                position: \"relative\"\n            }, \n        ],\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            {\n                position: \"absolute\",\n                boxSizing: \"border-box\",\n                borderRadius: effects.roundedCorner2,\n                boxShadow: effects.elevation16,\n                selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                    borderWidth: 1,\n                    borderStyle: \"solid\",\n                    borderColor: \"WindowText\"\n                }, _a)\n            },\n            (0, _styling.focusClear)(),\n            className,\n            !!calloutWidth && {\n                width: calloutWidth\n            },\n            !!calloutMaxWidth && {\n                maxWidth: calloutMaxWidth\n            },\n            !!calloutMinWidth && {\n                minWidth: calloutMinWidth\n            }, \n        ],\n        beak: [\n            classNames.beak,\n            {\n                position: \"absolute\",\n                backgroundColor: semanticColors.menuBackground,\n                boxShadow: \"inherit\",\n                border: \"inherit\",\n                boxSizing: \"border-box\",\n                transform: \"rotate(45deg)\"\n            },\n            getBeakStyle(beakWidth),\n            backgroundColor && {\n                backgroundColor: backgroundColor\n            }, \n        ],\n        beakCurtain: [\n            classNames.beakCurtain,\n            {\n                position: \"absolute\",\n                top: 0,\n                right: 0,\n                bottom: 0,\n                left: 0,\n                backgroundColor: semanticColors.menuBackground,\n                borderRadius: effects.roundedCorner2\n            }, \n        ],\n        calloutMain: [\n            classNames.calloutMain,\n            {\n                backgroundColor: semanticColors.menuBackground,\n                overflowX: \"hidden\",\n                overflowY: \"auto\",\n                position: \"relative\",\n                borderRadius: effects.roundedCorner2\n            },\n            overflowYHidden && {\n                overflowY: \"hidden\"\n            },\n            backgroundColor && {\n                backgroundColor: backgroundColor\n            }, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6rkPB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _version = require(\"./version\");\nvar _index = require(\"./components/Layer/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./version\":\"5jjJg\",\"./components/Layer/index\":\"ePAuE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ePAuE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _layer = require(\"./Layer\");\nparcelHelpers.exportAll(_layer, exports);\nvar _layerBase = require(\"./Layer.base\");\nparcelHelpers.exportAll(_layerBase, exports);\nvar _layerHost = require(\"./LayerHost\");\nparcelHelpers.exportAll(_layerHost, exports);\n\n},{\"./Layer\":\"d8g5x\",\"./Layer.base\":\"1fX0U\",\"./LayerHost\":\"aWmiT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d8g5x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Layer\", ()=>Layer);\nvar _utilities = require(\"../../Utilities\");\nvar _layerBase = require(\"./Layer.base\");\nvar _layerStyles = require(\"./Layer.styles\");\nvar Layer = (0, _utilities.styled)((0, _layerBase.LayerBase), (0, _layerStyles.getStyles), undefined, {\n    scope: \"Layer\",\n    fields: [\n        \"hostId\",\n        \"theme\",\n        \"styles\"\n    ]\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Layer.base\":\"1fX0U\",\"./Layer.styles\":\"dIboT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1fX0U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LayerBase\", ()=>LayerBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _reactDom = require(\"react-dom\");\nvar _fabric = require(\"../../Fabric\");\nvar _utilities = require(\"../../Utilities\");\nvar _layerNotification = require(\"./Layer.notification\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar LayerBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(LayerBase1, _super);\n    function LayerBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._rootRef = _react.createRef();\n        _this._createLayerElement = function() {\n            var _a1, _b;\n            var hostId = _this.props.hostId;\n            var doc = (0, _utilities.getDocument)(_this._rootRef.current);\n            var host = _this._getHost();\n            if (!host) return;\n            // If one was already existing, remove.\n            _this._removeLayerElement();\n            // eslint-disable-next-line deprecation/deprecation\n            var layerElement = (_b = (_a1 = host.ownerDocument, _a1 !== null && _a1 !== void 0 ? _a1 : doc)) === null || _b === void 0 ? void 0 : _b.createElement(\"div\");\n            if (layerElement) {\n                var classNames = _this._getClassNames();\n                layerElement.className = classNames.root;\n                (0, _utilities.setPortalAttribute)(layerElement);\n                (0, _utilities.setVirtualParent)(layerElement, _this._rootRef.current);\n                _this.props.insertFirst ? host.insertBefore(layerElement, host.firstChild) : host.appendChild(layerElement);\n                _this.setState({\n                    hostId: hostId,\n                    layerElement: layerElement\n                }, function() {\n                    // eslint-disable-next-line deprecation/deprecation\n                    var _a = _this.props, onLayerDidMount = _a.onLayerDidMount, onLayerMounted = _a.onLayerMounted;\n                    if (onLayerMounted) onLayerMounted();\n                    if (onLayerDidMount) onLayerDidMount();\n                });\n            }\n        };\n        _this.state = {};\n        return _this;\n    }\n    LayerBase1.prototype.componentDidMount = function() {\n        var hostId = this.props.hostId;\n        this._createLayerElement();\n        if (hostId) (0, _layerNotification.registerLayer)(hostId, this._createLayerElement);\n    };\n    LayerBase1.prototype.render = function() {\n        var layerElement = this.state.layerElement;\n        var classNames = this._getClassNames();\n        var eventBubblingEnabled = this.props.eventBubblingEnabled;\n        return _react.createElement(\"span\", {\n            className: \"ms-layer\",\n            ref: this._rootRef\n        }, layerElement && _reactDom.createPortal(_react.createElement((0, _fabric.Fabric), (0, _tslib.__assign)({}, !eventBubblingEnabled && _getFilteredEvents(), {\n            className: classNames.content\n        }), this.props.children), layerElement));\n    };\n    LayerBase1.prototype.componentDidUpdate = function() {\n        if (this.props.hostId !== this.state.hostId) this._createLayerElement();\n    };\n    LayerBase1.prototype.componentWillUnmount = function() {\n        var hostId = this.props.hostId;\n        this._removeLayerElement();\n        if (hostId) (0, _layerNotification.unregisterLayer)(hostId, this._createLayerElement);\n    };\n    LayerBase1.prototype._removeLayerElement = function() {\n        var onLayerWillUnmount = this.props.onLayerWillUnmount;\n        var layerElement = this.state.layerElement;\n        if (layerElement) (0, _utilities.setVirtualParent)(layerElement, null);\n        if (onLayerWillUnmount) onLayerWillUnmount();\n        if (layerElement && layerElement.parentNode) {\n            var parentNode = layerElement.parentNode;\n            if (parentNode) parentNode.removeChild(layerElement);\n        }\n    };\n    LayerBase1.prototype._getClassNames = function() {\n        var _a = this.props, className = _a.className, styles = _a.styles, theme = _a.theme;\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            isNotHost: !this.props.hostId\n        });\n        return classNames;\n    };\n    LayerBase1.prototype._getHost = function() {\n        var _a, _b, _c, _d, _e, _f;\n        var hostId = this.props.hostId;\n        var doc = (0, _utilities.getDocument)(this._rootRef.current);\n        if (hostId) {\n            var layerHost = (0, _layerNotification.getLayerHost)(hostId);\n            if (layerHost) return _a = layerHost.rootRef.current, _a !== null && _a !== void 0 ? _a : null;\n            return _c = (_b = doc) === null || _b === void 0 ? void 0 : _b.getElementById(hostId), _c !== null && _c !== void 0 ? _c : null;\n        } else {\n            var defaultHostSelector = (0, _layerNotification.getDefaultTarget)();\n            return _f = defaultHostSelector ? (_d = doc) === null || _d === void 0 ? void 0 : _d.querySelector(defaultHostSelector) : (_e = doc) === null || _e === void 0 ? void 0 : _e.body, _f !== null && _f !== void 0 ? _f : null;\n        }\n    };\n    LayerBase1.defaultProps = {\n        onLayerDidMount: function() {\n            return undefined;\n        },\n        onLayerWillUnmount: function() {\n            return undefined;\n        }\n    };\n    LayerBase1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"Layer\", [\n            \"theme\",\n            \"hostId\"\n        ])\n    ], LayerBase1);\n    return LayerBase1;\n}(_react.Component);\nvar _onFilterEvent = function(ev) {\n    // We should just be able to check ev.bubble here and only stop events that are bubbling up. However, even though\n    // mouseenter and mouseleave do NOT bubble up, they are showing up as bubbling. Therefore we stop events based on\n    // event name rather than ev.bubble.\n    if (ev.eventPhase === Event.BUBBLING_PHASE && ev.type !== \"mouseenter\" && ev.type !== \"mouseleave\" && ev.type !== \"touchstart\" && ev.type !== \"touchend\") ev.stopPropagation();\n};\nvar _filteredEventProps;\nfunction _getFilteredEvents() {\n    if (!_filteredEventProps) {\n        _filteredEventProps = {};\n        [\n            \"onClick\",\n            \"onContextMenu\",\n            \"onDoubleClick\",\n            \"onDrag\",\n            \"onDragEnd\",\n            \"onDragEnter\",\n            \"onDragExit\",\n            \"onDragLeave\",\n            \"onDragOver\",\n            \"onDragStart\",\n            \"onDrop\",\n            \"onMouseDown\",\n            \"onMouseEnter\",\n            \"onMouseLeave\",\n            \"onMouseMove\",\n            \"onMouseOver\",\n            \"onMouseOut\",\n            \"onMouseUp\",\n            \"onTouchMove\",\n            \"onTouchStart\",\n            \"onTouchCancel\",\n            \"onTouchEnd\",\n            \"onKeyDown\",\n            \"onKeyPress\",\n            \"onKeyUp\",\n            \"onFocus\",\n            \"onBlur\",\n            \"onChange\",\n            \"onInput\",\n            \"onInvalid\",\n            \"onSubmit\", \n        ].forEach(function(name) {\n            return _filteredEventProps[name] = _onFilterEvent;\n        });\n    }\n    return _filteredEventProps;\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"react-dom\":\"j73oT\",\"../../Fabric\":\"buRUV\",\"../../Utilities\":\"2F07a\",\"./Layer.notification\":\"f1T0i\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"buRUV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Fabric/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Fabric/index\":\"gouK9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gouK9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _fabric = require(\"./Fabric\");\nparcelHelpers.exportAll(_fabric, exports);\nvar _fabricBase = require(\"./Fabric.base\");\nparcelHelpers.exportAll(_fabricBase, exports);\n\n},{\"./Fabric\":\"fDnhV\",\"./Fabric.base\":\"5sQSr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fDnhV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Fabric\", ()=>Fabric);\nvar _utilities = require(\"../../Utilities\");\nvar _fabricBase = require(\"./Fabric.base\");\nvar _fabricStyles = require(\"./Fabric.styles\");\nvar Fabric = (0, _utilities.styled)((0, _fabricBase.FabricBase), (0, _fabricStyles.getStyles), undefined, {\n    scope: \"Fabric\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Fabric.base\":\"5sQSr\",\"./Fabric.styles\":\"kjiqq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5sQSr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FabricBase\", ()=>FabricBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _styling = require(\"../../Styling\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar getFabricTheme = (0, _utilities.memoizeFunction)(function(theme, isRTL) {\n    return (0, _styling.createTheme)((0, _tslib.__assign)((0, _tslib.__assign)({}, theme), {\n        rtl: isRTL\n    }));\n});\nvar getDir = function(theme, dir) {\n    var contextDir = (0, _utilities.getRTL)(theme) ? \"rtl\" : \"ltr\";\n    var pageDir = (0, _utilities.getRTL)() ? \"rtl\" : \"ltr\";\n    var componentDir = dir ? dir : contextDir;\n    return {\n        // If Fabric dir !== contextDir\n        // Or If contextDir !== pageDir\n        // Then we need to set dir of the Fabric root\n        rootDir: componentDir !== contextDir || componentDir !== pageDir ? componentDir : dir,\n        // If dir !== contextDir || pageDir\n        // then set contextual theme around content\n        needsTheme: componentDir !== contextDir\n    };\n};\nvar FabricBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(FabricBase1, _super);\n    function FabricBase1() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._rootElement = _react.createRef();\n        _this._removeClassNameFromBody = undefined;\n        return _this;\n    }\n    FabricBase1.prototype.render = function() {\n        var _a = this.props, _b = _a.as, Root = _b === void 0 ? \"div\" : _b, theme = _a.theme, dir = _a.dir;\n        var classNames = this._getClassNames();\n        var divProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties), [\n            \"dir\"\n        ]);\n        var _c = getDir(theme, dir), rootDir = _c.rootDir, needsTheme = _c.needsTheme;\n        var renderedContent = _react.createElement(Root, (0, _tslib.__assign)({\n            dir: rootDir\n        }, divProps, {\n            className: classNames.root,\n            ref: this._rootElement\n        }));\n        if (needsTheme) renderedContent = _react.createElement((0, _utilities.Customizer), {\n            settings: {\n                theme: getFabricTheme(theme, dir === \"rtl\")\n            }\n        }, renderedContent);\n        return _react.createElement(_react.Fragment, null, renderedContent, _react.createElement((0, _utilities.FocusRects), {\n            rootRef: this._rootElement\n        }));\n    };\n    FabricBase1.prototype.componentDidMount = function() {\n        this._addClassNameToBody();\n    };\n    FabricBase1.prototype.componentWillUnmount = function() {\n        if (this._removeClassNameFromBody) this._removeClassNameFromBody();\n    };\n    FabricBase1.prototype._getClassNames = function() {\n        var _a = this.props, className = _a.className, theme = _a.theme, applyTheme = _a.applyTheme, styles = _a.styles;\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            applyTheme: applyTheme,\n            className: className\n        });\n        return classNames;\n    };\n    FabricBase1.prototype._addClassNameToBody = function() {\n        if (this.props.applyThemeToBody) {\n            var classNames_1 = this._getClassNames();\n            var currentDoc_1 = (0, _utilities.getDocument)(this._rootElement.current);\n            if (currentDoc_1) {\n                currentDoc_1.body.classList.add(classNames_1.bodyThemed);\n                this._removeClassNameFromBody = function() {\n                    currentDoc_1.body.classList.remove(classNames_1.bodyThemed);\n                };\n            }\n        }\n    };\n    return FabricBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kjiqq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar inheritFont = {\n    fontFamily: \"inherit\"\n};\nvar GlobalClassNames = {\n    root: \"ms-Fabric\",\n    bodyThemed: \"ms-Fabric-bodyThemed\"\n};\nvar getStyles = function(props) {\n    var theme = props.theme, className = props.className, applyTheme = props.applyTheme;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            {\n                color: theme.palette.neutralPrimary,\n                selectors: {\n                    \"& button\": inheritFont,\n                    \"& input\": inheritFont,\n                    \"& textarea\": inheritFont\n                }\n            },\n            // apply theme to only if applyTheme is true\n            applyTheme && {\n                color: theme.semanticColors.bodyText,\n                backgroundColor: theme.semanticColors.bodyBackground\n            },\n            className, \n        ],\n        bodyThemed: [\n            {\n                backgroundColor: theme.semanticColors.bodyBackground\n            }, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f1T0i\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Register a layer for a given host id\n * @param hostId Id of the layer host\n * @param layer Layer instance\n */ parcelHelpers.export(exports, \"registerLayer\", ()=>registerLayer);\n/**\n * Unregister a layer for a given host id\n * @param hostId Id of the layer host\n * @param layer Layer instance\n */ parcelHelpers.export(exports, \"unregisterLayer\", ()=>unregisterLayer);\n/**\n * Gets the number of layers currently registered with a host id.\n * @param hostId Id of the layer host.\n * @returns The number of layers currently registered with the host.\n */ parcelHelpers.export(exports, \"getLayerCount\", ()=>getLayerCount);\n/**\n * Gets the Layer Host instance associated with a hostId, if applicable.\n * @param hostId\n * @returns A component ref for the associated layer host.\n */ parcelHelpers.export(exports, \"getLayerHost\", ()=>getLayerHost);\n/**\n * Registers a Layer Host with an associated hostId.\n * @param hostId Id of the layer host\n * @param layerHost layer host instance\n */ parcelHelpers.export(exports, \"registerLayerHost\", ()=>registerLayerHost);\n/**\n * Unregisters a Layer Host from the associated hostId.\n * @param hostId Id of the layer host\n * @param layerHost layer host instance\n */ parcelHelpers.export(exports, \"unregisterLayerHost\", ()=>unregisterLayerHost);\n/**\n * Used for notifying applicable Layers that a host is available/unavailable and to re-evaluate Layers that\n * care about the specific host.\n */ parcelHelpers.export(exports, \"notifyHostChanged\", ()=>notifyHostChanged);\n/**\n * Sets the default target selector to use when determining the host in which\n * Layered content will be injected into. If not provided, an element will be\n * created at the end of the document body.\n *\n * Passing in a falsey value will clear the default target and reset back to\n * using a created element at the end of document body.\n */ parcelHelpers.export(exports, \"setDefaultTarget\", ()=>setDefaultTarget);\n/**\n * Get the default target selector when determining a host\n */ parcelHelpers.export(exports, \"getDefaultTarget\", ()=>getDefaultTarget);\nvar _layersByHostId = {};\nvar _layerHostsById = {};\nvar _defaultHostSelector;\nfunction registerLayer(hostId, callback) {\n    if (!_layersByHostId[hostId]) _layersByHostId[hostId] = [];\n    _layersByHostId[hostId].push(callback);\n    var layerHosts = _layerHostsById[hostId];\n    if (layerHosts) for(var _i = 0, layerHosts_1 = layerHosts; _i < layerHosts_1.length; _i++){\n        var layerHost = layerHosts_1[_i];\n        layerHost.notifyLayersChanged();\n    }\n}\nfunction unregisterLayer(hostId, callback) {\n    var layers = _layersByHostId[hostId];\n    if (layers) {\n        var idx = layers.indexOf(callback);\n        if (idx >= 0) {\n            layers.splice(idx, 1);\n            if (layers.length === 0) delete _layersByHostId[hostId];\n        }\n    }\n    var layerHosts = _layerHostsById[hostId];\n    if (layerHosts) for(var _i = 0, layerHosts_2 = layerHosts; _i < layerHosts_2.length; _i++){\n        var layerHost = layerHosts_2[_i];\n        layerHost.notifyLayersChanged();\n    }\n}\nfunction getLayerCount(hostId) {\n    var layers = _layerHostsById[hostId];\n    return layers ? layers.length : 0;\n}\nfunction getLayerHost(hostId) {\n    var layerHosts = _layerHostsById[hostId];\n    return layerHosts && layerHosts[0] || undefined;\n}\nfunction registerLayerHost(hostId, layerHost) {\n    var layerHosts = _layerHostsById[hostId] || (_layerHostsById[hostId] = []);\n    // Insert this at the start of an array to avoid race conditions between mount and unmount.\n    // If a LayerHost is re-mounted, and mount of the new instance may occur before the unmount of the old one.\n    // Putting the new instance at the start of this array ensures that calls to `getLayerHost` will immediately\n    // get the new one even if the old one is around briefly.\n    layerHosts.unshift(layerHost);\n}\nfunction unregisterLayerHost(hostId, layerHost) {\n    var layerHosts = _layerHostsById[hostId];\n    if (layerHosts) {\n        var idx = layerHosts.indexOf(layerHost);\n        if (idx >= 0) layerHosts.splice(idx, 1);\n        if (layerHosts.length === 0) delete _layerHostsById[hostId];\n    }\n}\nfunction notifyHostChanged(id) {\n    if (_layersByHostId[id]) _layersByHostId[id].forEach(function(callback) {\n        return callback();\n    });\n}\nfunction setDefaultTarget(selector) {\n    _defaultHostSelector = selector;\n}\nfunction getDefaultTarget() {\n    return _defaultHostSelector;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dIboT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar GlobalClassNames = {\n    root: \"ms-Layer\",\n    rootNoHost: \"ms-Layer--fixed\",\n    content: \"ms-Layer-content\"\n};\nvar getStyles = function(props) {\n    var className = props.className, isNotHost = props.isNotHost, theme = props.theme;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            isNotHost && [\n                classNames.rootNoHost,\n                {\n                    position: \"fixed\",\n                    zIndex: (0, _styling.ZIndexes).Layer,\n                    top: 0,\n                    left: 0,\n                    bottom: 0,\n                    right: 0,\n                    visibility: \"hidden\"\n                }, \n            ],\n            className, \n        ],\n        content: [\n            classNames.content,\n            {\n                visibility: \"visible\"\n            }, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aWmiT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LayerHost\", ()=>LayerHost);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _layerNotification = require(\"./Layer.notification\");\nvar LayerHost = /** @class */ function(_super) {\n    (0, _tslib.__extends)(LayerHost1, _super);\n    function LayerHost1(props) {\n        var _this = _super.call(this, props) || this;\n        var layerHostId = (0, _utilities.getId)();\n        var _a = _this.props.id, hostId = _a === void 0 ? layerHostId : _a;\n        _this.hostId = hostId;\n        _this.rootRef = _react.createRef();\n        (0, _utilities.initializeComponentRef)(_this);\n        return _this;\n    }\n    LayerHost1.prototype.notifyLayersChanged = function() {\n    // Nothing, since the default implementation of Layer Host does not need to react to layer changes.\n    };\n    LayerHost1.prototype.shouldComponentUpdate = function() {\n        return false;\n    };\n    LayerHost1.prototype.componentDidMount = function() {\n        (0, _layerNotification.registerLayerHost)(this.hostId, this);\n        (0, _layerNotification.notifyHostChanged)(this.props.id);\n    };\n    LayerHost1.prototype.componentWillUnmount = function() {\n        (0, _layerNotification.unregisterLayerHost)(this.hostId, this);\n        (0, _layerNotification.notifyHostChanged)(this.props.id);\n    };\n    LayerHost1.prototype.render = function() {\n        return _react.createElement(\"div\", (0, _tslib.__assign)({}, this.props, {\n            className: (0, _utilities.css)(\"ms-LayerHost\", this.props.className),\n            ref: this.rootRef\n        }));\n    };\n    return LayerHost1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"./Layer.notification\":\"f1T0i\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eNLy6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FocusTrapCallout\", ()=>FocusTrapCallout);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _callout = require(\"./Callout\");\nvar _focusTrapZone = require(\"../../FocusTrapZone\");\nvar FocusTrapCallout = function(props) {\n    return _react.createElement((0, _callout.Callout), (0, _tslib.__assign)({}, props), _react.createElement((0, _focusTrapZone.FocusTrapZone), (0, _tslib.__assign)({\n        disabled: props.hidden\n    }, props.focusTrapProps), props.children));\n};\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./Callout\":\"cpPNt\",\"../../FocusTrapZone\":\"cT9kJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cT9kJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/FocusTrapZone/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/FocusTrapZone/index\":\"7TtL6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7TtL6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _focusTrapZone = require(\"./FocusTrapZone\");\nparcelHelpers.exportAll(_focusTrapZone, exports);\n\n},{\"./FocusTrapZone\":\"aD2Gs\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aD2Gs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FocusTrapZone\", ()=>FocusTrapZone);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"@uifabric/utilities\");\nvar _utilities1 = require(\"../../Utilities\");\nvar FocusTrapZone = /** @class */ function(_super) {\n    (0, _tslib.__extends)(FocusTrapZone1, _super);\n    function FocusTrapZone1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._root = _react.createRef();\n        _this._firstBumper = _react.createRef();\n        _this._lastBumper = _react.createRef();\n        _this._hasFocus = false;\n        _this._onRootFocus = function(ev) {\n            if (_this.props.onFocus) _this.props.onFocus(ev);\n            _this._hasFocus = true;\n        };\n        _this._onRootBlur = function(ev) {\n            if (_this.props.onBlur) _this.props.onBlur(ev);\n            var relatedTarget = ev.relatedTarget;\n            if (ev.relatedTarget === null) // In IE11, due to lack of support, event.relatedTarget is always\n            // null making every onBlur call to be \"outside\" of the ComboBox\n            // even when it's not. Using document.activeElement is another way\n            // for us to be able to get what the relatedTarget without relying\n            // on the event\n            relatedTarget = _this._getDocument().activeElement;\n            if (!(0, _utilities1.elementContains)(_this._root.current, relatedTarget)) _this._hasFocus = false;\n        };\n        _this._onFirstBumperFocus = function() {\n            _this._onBumperFocus(true);\n        };\n        _this._onLastBumperFocus = function() {\n            _this._onBumperFocus(false);\n        };\n        _this._onBumperFocus = function(isFirstBumper) {\n            if (_this.props.disabled) return;\n            var currentBumper = isFirstBumper === _this._hasFocus ? _this._lastBumper.current : _this._firstBumper.current;\n            if (_this._root.current) {\n                var nextFocusable = isFirstBumper === _this._hasFocus ? (0, _utilities1.getLastTabbable)(_this._root.current, currentBumper, true, false) : (0, _utilities1.getFirstTabbable)(_this._root.current, currentBumper, true, false);\n                if (nextFocusable) {\n                    if (_this._isBumper(nextFocusable)) // This can happen when FTZ contains no tabbable elements.\n                    // focus will take care of finding a focusable element in FTZ.\n                    _this.focus();\n                    else nextFocusable.focus();\n                }\n            }\n        };\n        _this._onFocusCapture = function(ev) {\n            if (_this.props.onFocusCapture) _this.props.onFocusCapture(ev);\n            if (ev.target !== ev.currentTarget && !_this._isBumper(ev.target)) // every time focus changes within the trap zone, remember the focused element so that\n            // it can be restored if focus leaves the pane and returns via keystroke (i.e. via a call to this.focus(true))\n            _this._previouslyFocusedElementInTrapZone = ev.target;\n        };\n        _this._forceFocusInTrap = function(ev) {\n            if (_this.props.disabled) return;\n            if (FocusTrapZone1._focusStack.length && _this === FocusTrapZone1._focusStack[FocusTrapZone1._focusStack.length - 1]) {\n                var focusedElement = _this._getDocument().activeElement;\n                if (!(0, _utilities1.elementContains)(_this._root.current, focusedElement)) {\n                    _this.focus();\n                    _this._hasFocus = true; // set focus here since we stop event propagation\n                    ev.preventDefault();\n                    ev.stopPropagation();\n                }\n            }\n        };\n        _this._forceClickInTrap = function(ev) {\n            if (_this.props.disabled) return;\n            if (FocusTrapZone1._focusStack.length && _this === FocusTrapZone1._focusStack[FocusTrapZone1._focusStack.length - 1]) {\n                var clickedElement = ev.target;\n                if (clickedElement && !(0, _utilities1.elementContains)(_this._root.current, clickedElement)) {\n                    _this.focus();\n                    _this._hasFocus = true; // set focus here since we stop event propagation\n                    ev.preventDefault();\n                    ev.stopPropagation();\n                }\n            }\n        };\n        (0, _utilities1.initializeComponentRef)(_this);\n        return _this;\n    }\n    FocusTrapZone1.prototype.componentDidMount = function() {\n        this._bringFocusIntoZone();\n        this._updateEventHandlers(this.props);\n        if (!this.props.disabled && this._root.current && this.props.enableAriaHiddenSiblings) this._unmodalize = (0, _utilities.modalize)(this._root.current);\n    };\n    FocusTrapZone1.prototype.UNSAFE_componentWillReceiveProps = function(nextProps) {\n        var elementToFocusOnDismiss = nextProps.elementToFocusOnDismiss;\n        if (elementToFocusOnDismiss && this._previouslyFocusedElementOutsideTrapZone !== elementToFocusOnDismiss) this._previouslyFocusedElementOutsideTrapZone = elementToFocusOnDismiss;\n        this._updateEventHandlers(nextProps);\n    };\n    FocusTrapZone1.prototype.componentDidUpdate = function(prevProps) {\n        var prevForceFocusInsideTrap = prevProps.forceFocusInsideTrap !== undefined ? prevProps.forceFocusInsideTrap : true;\n        var newForceFocusInsideTrap = this.props.forceFocusInsideTrap !== undefined ? this.props.forceFocusInsideTrap : true;\n        var prevDisabled = prevProps.disabled !== undefined ? prevProps.disabled : false;\n        var newDisabled = this.props.disabled !== undefined ? this.props.disabled : false;\n        if (!prevForceFocusInsideTrap && newForceFocusInsideTrap || prevDisabled && !newDisabled) {\n            // Transition from forceFocusInsideTrap / FTZ disabled to enabled.\n            // Emulate what happens when a FocusTrapZone gets mounted.\n            this._bringFocusIntoZone();\n            if (!this._unmodalize && this._root.current && this.props.enableAriaHiddenSiblings) this._unmodalize = (0, _utilities.modalize)(this._root.current);\n        } else if (prevForceFocusInsideTrap && !newForceFocusInsideTrap || !prevDisabled && newDisabled) {\n            // Transition from forceFocusInsideTrap / FTZ enabled to disabled.\n            // Emulate what happens when a FocusTrapZone gets unmounted.\n            this._returnFocusToInitiator();\n            if (this._unmodalize) this._unmodalize();\n        }\n    };\n    FocusTrapZone1.prototype.componentWillUnmount = function() {\n        // don't handle return focus unless forceFocusInsideTrap is true or focus is still within FocusTrapZone\n        if (!this.props.disabled || this.props.forceFocusInsideTrap || !(0, _utilities1.elementContains)(this._root.current, this._getDocument().activeElement)) this._returnFocusToInitiator();\n        // Dispose of event handlers so their closures can be garbage-collected\n        if (this._disposeClickHandler) {\n            this._disposeClickHandler();\n            this._disposeClickHandler = undefined;\n        }\n        if (this._disposeFocusHandler) {\n            this._disposeFocusHandler();\n            this._disposeFocusHandler = undefined;\n        }\n        if (this._unmodalize) this._unmodalize();\n        // Dispose of element references so the DOM Nodes can be garbage-collected\n        delete this._previouslyFocusedElementInTrapZone;\n        delete this._previouslyFocusedElementOutsideTrapZone;\n    };\n    FocusTrapZone1.prototype.render = function() {\n        var _a = this.props, className = _a.className, _b = _a.disabled, disabled = _b === void 0 ? false : _b, ariaLabelledBy = _a.ariaLabelledBy;\n        var divProps = (0, _utilities1.getNativeProps)(this.props, (0, _utilities1.divProperties));\n        var bumperProps = {\n            \"aria-hidden\": true,\n            style: {\n                pointerEvents: \"none\",\n                position: \"fixed\"\n            },\n            tabIndex: disabled ? -1 : 0,\n            \"data-is-visible\": true\n        };\n        return _react.createElement(\"div\", (0, _tslib.__assign)({}, divProps, {\n            className: className,\n            ref: this._root,\n            \"aria-labelledby\": ariaLabelledBy,\n            onFocusCapture: this._onFocusCapture,\n            onFocus: this._onRootFocus,\n            onBlur: this._onRootBlur\n        }), _react.createElement(\"div\", (0, _tslib.__assign)({}, bumperProps, {\n            ref: this._firstBumper,\n            onFocus: this._onFirstBumperFocus\n        })), this.props.children, _react.createElement(\"div\", (0, _tslib.__assign)({}, bumperProps, {\n            ref: this._lastBumper,\n            onFocus: this._onLastBumperFocus\n        })));\n    };\n    FocusTrapZone1.prototype.focus = function() {\n        // eslint-disable-next-line deprecation/deprecation\n        var _a = this.props, focusPreviouslyFocusedInnerElement = _a.focusPreviouslyFocusedInnerElement, firstFocusableSelector = _a.firstFocusableSelector, firstFocusableTarget = _a.firstFocusableTarget;\n        if (focusPreviouslyFocusedInnerElement && this._previouslyFocusedElementInTrapZone && (0, _utilities1.elementContains)(this._root.current, this._previouslyFocusedElementInTrapZone)) {\n            // focus on the last item that had focus in the zone before we left the zone\n            this._focusAsync(this._previouslyFocusedElementInTrapZone);\n            return;\n        }\n        var focusSelector = typeof firstFocusableSelector === \"string\" ? firstFocusableSelector : firstFocusableSelector && firstFocusableSelector();\n        var _firstFocusableChild = null;\n        if (this._root.current) {\n            if (typeof firstFocusableTarget === \"string\") _firstFocusableChild = this._root.current.querySelector(firstFocusableTarget);\n            else if (firstFocusableTarget) _firstFocusableChild = firstFocusableTarget(this._root.current);\n            else if (focusSelector) _firstFocusableChild = this._root.current.querySelector(\".\" + focusSelector);\n            // Fall back to first element if query selector did not match any elements.\n            if (!_firstFocusableChild) _firstFocusableChild = (0, _utilities1.getNextElement)(this._root.current, this._root.current.firstChild, false, false, false, true);\n        }\n        if (_firstFocusableChild) this._focusAsync(_firstFocusableChild);\n    };\n    FocusTrapZone1.prototype._focusAsync = function(element) {\n        if (!this._isBumper(element)) (0, _utilities1.focusAsync)(element);\n    };\n    FocusTrapZone1.prototype._bringFocusIntoZone = function() {\n        var _a = this.props, elementToFocusOnDismiss = _a.elementToFocusOnDismiss, _b = _a.disabled, disabled = _b === void 0 ? false : _b, _c = _a.disableFirstFocus, disableFirstFocus = _c === void 0 ? false : _c;\n        if (disabled) return;\n        FocusTrapZone1._focusStack.push(this);\n        this._previouslyFocusedElementOutsideTrapZone = elementToFocusOnDismiss ? elementToFocusOnDismiss : this._getDocument().activeElement;\n        if (!disableFirstFocus && !(0, _utilities1.elementContains)(this._root.current, this._previouslyFocusedElementOutsideTrapZone)) this.focus();\n    };\n    FocusTrapZone1.prototype._returnFocusToInitiator = function() {\n        var _this = this;\n        var ignoreExternalFocusing = this.props.ignoreExternalFocusing;\n        FocusTrapZone1._focusStack = FocusTrapZone1._focusStack.filter(function(value) {\n            return _this !== value;\n        });\n        var doc = this._getDocument();\n        var activeElement = doc.activeElement;\n        if (!ignoreExternalFocusing && this._previouslyFocusedElementOutsideTrapZone && typeof this._previouslyFocusedElementOutsideTrapZone.focus === \"function\" && ((0, _utilities1.elementContains)(this._root.current, activeElement) || activeElement === doc.body)) this._focusAsync(this._previouslyFocusedElementOutsideTrapZone);\n    };\n    FocusTrapZone1.prototype._updateEventHandlers = function(newProps) {\n        var _a = newProps.isClickableOutsideFocusTrap, isClickableOutsideFocusTrap = _a === void 0 ? false : _a, _b = newProps.forceFocusInsideTrap, forceFocusInsideTrap = _b === void 0 ? true : _b;\n        if (forceFocusInsideTrap && !this._disposeFocusHandler) this._disposeFocusHandler = (0, _utilities1.on)(window, \"focus\", this._forceFocusInTrap, true);\n        else if (!forceFocusInsideTrap && this._disposeFocusHandler) {\n            this._disposeFocusHandler();\n            this._disposeFocusHandler = undefined;\n        }\n        if (!isClickableOutsideFocusTrap && !this._disposeClickHandler) this._disposeClickHandler = (0, _utilities1.on)(window, \"click\", this._forceClickInTrap, true);\n        else if (isClickableOutsideFocusTrap && this._disposeClickHandler) {\n            this._disposeClickHandler();\n            this._disposeClickHandler = undefined;\n        }\n    };\n    FocusTrapZone1.prototype._isBumper = function(element) {\n        return element === this._firstBumper.current || element === this._lastBumper.current;\n    };\n    FocusTrapZone1.prototype._getDocument = function() {\n        return (0, _utilities1.getDocument)(this._root.current);\n    };\n    FocusTrapZone1._focusStack = [];\n    return FocusTrapZone1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@uifabric/utilities\":\"uTCgd\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1A0Og\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ContextualMenuItem\", ()=>ContextualMenuItem);\nvar _utilities = require(\"../../Utilities\");\nvar _contextualMenuItemBase = require(\"./ContextualMenuItem.base\");\nvar _contextualMenuClassNames = require(\"./ContextualMenu.classNames\");\nvar ContextualMenuItem = (0, _utilities.styled)((0, _contextualMenuItemBase.ContextualMenuItemBase), (0, _contextualMenuClassNames.getItemStyles), undefined, {\n    scope: \"ContextualMenuItem\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./ContextualMenuItem.base\":\"6r00d\",\"./ContextualMenu.classNames\":\"eP2o9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6r00d\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ContextualMenuItemBase\", ()=>ContextualMenuItemBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _index = require(\"../../utilities/contextualMenu/index\");\nvar _utilities = require(\"../../Utilities\");\nvar _icon = require(\"../../Icon\");\nvar renderItemIcon = function(props) {\n    var item = props.item, hasIcons = props.hasIcons, classNames = props.classNames;\n    var iconProps = item.iconProps;\n    if (!hasIcons) return null;\n    if (item.onRenderIcon) return item.onRenderIcon(props);\n    return _react.createElement((0, _icon.Icon), (0, _tslib.__assign)({}, iconProps, {\n        className: classNames.icon\n    }));\n};\nvar renderCheckMarkIcon = function(_a) {\n    var onCheckmarkClick = _a.onCheckmarkClick, item = _a.item, classNames = _a.classNames;\n    var isItemChecked = (0, _index.getIsChecked)(item);\n    if (onCheckmarkClick) {\n        // Ensures that the item is passed as the first argument to the checkmark click callback.\n        var onClick = function(e) {\n            return onCheckmarkClick(item, e);\n        };\n        return _react.createElement((0, _icon.Icon), {\n            iconName: item.canCheck !== false && isItemChecked ? \"CheckMark\" : \"\",\n            className: classNames.checkmarkIcon,\n            // eslint-disable-next-line react/jsx-no-bind\n            onClick: onClick\n        });\n    }\n    return null;\n};\nvar renderItemName = function(_a) {\n    var item = _a.item, classNames = _a.classNames;\n    /* eslint-disable deprecation/deprecation */ if (item.text || item.name) return _react.createElement(\"span\", {\n        className: classNames.label\n    }, item.text || item.name);\n    /* eslint-enable deprecation/deprecation */ return null;\n};\nvar renderSecondaryText = function(_a) {\n    var item = _a.item, classNames = _a.classNames;\n    if (item.secondaryText) return _react.createElement(\"span\", {\n        className: classNames.secondaryText\n    }, item.secondaryText);\n    return null;\n};\nvar renderSubMenuIcon = function(_a) {\n    var item = _a.item, classNames = _a.classNames, theme = _a.theme;\n    if ((0, _index.hasSubmenu)(item)) return _react.createElement((0, _icon.Icon), (0, _tslib.__assign)({\n        iconName: (0, _utilities.getRTL)(theme) ? \"ChevronLeft\" : \"ChevronRight\"\n    }, item.submenuIconProps, {\n        className: classNames.subMenuIcon\n    }));\n    return null;\n};\nvar ContextualMenuItemBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ContextualMenuItemBase1, _super);\n    function ContextualMenuItemBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this.openSubMenu = function() {\n            var _a = _this.props, item = _a.item, openSubMenu = _a.openSubMenu, getSubmenuTarget = _a.getSubmenuTarget;\n            if (getSubmenuTarget) {\n                var submenuTarget = getSubmenuTarget();\n                if ((0, _index.hasSubmenu)(item) && openSubMenu && submenuTarget) openSubMenu(item, submenuTarget);\n            }\n        };\n        _this.dismissSubMenu = function() {\n            var _a = _this.props, item = _a.item, dismissSubMenu = _a.dismissSubMenu;\n            if ((0, _index.hasSubmenu)(item) && dismissSubMenu) dismissSubMenu();\n        };\n        _this.dismissMenu = function(dismissAll) {\n            var dismissMenu = _this.props.dismissMenu;\n            if (dismissMenu) dismissMenu(undefined /* ev */ , dismissAll);\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        return _this;\n    }\n    ContextualMenuItemBase1.prototype.render = function() {\n        var _a = this.props, item = _a.item, classNames = _a.classNames;\n        var renderContent = item.onRenderContent || this._renderLayout;\n        return _react.createElement(\"div\", {\n            className: item.split ? classNames.linkContentMenu : classNames.linkContent\n        }, renderContent(this.props, {\n            renderCheckMarkIcon: renderCheckMarkIcon,\n            renderItemIcon: renderItemIcon,\n            renderItemName: renderItemName,\n            renderSecondaryText: renderSecondaryText,\n            renderSubMenuIcon: renderSubMenuIcon\n        }));\n    };\n    ContextualMenuItemBase1.prototype._renderLayout = function(props, defaultRenders) {\n        return _react.createElement(_react.Fragment, null, defaultRenders.renderCheckMarkIcon(props), defaultRenders.renderItemIcon(props), defaultRenders.renderItemName(props), defaultRenders.renderSecondaryText(props), defaultRenders.renderSubMenuIcon(props));\n    };\n    return ContextualMenuItemBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../utilities/contextualMenu/index\":\"kuuyp\",\"../../Utilities\":\"2F07a\",\"../../Icon\":\"2Ha7p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eP2o9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSplitButtonVerticalDividerClassNames\", ()=>getSplitButtonVerticalDividerClassNames);\nparcelHelpers.export(exports, \"getItemClassNames\", ()=>getItemClassNames);\nparcelHelpers.export(exports, \"getItemStyles\", ()=>getItemStyles);\nvar _verticalDividerClassNames = require(\"../Divider/VerticalDivider.classNames\");\nvar _contextualMenuCnstyles = require(\"./ContextualMenu.cnstyles\");\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"../../Utilities\");\nvar CONTEXTUAL_SPLIT_MENU_MINWIDTH = \"28px\";\nvar MediumScreenSelector = (0, _styling.getScreenSelector)(0, (0, _styling.ScreenWidthMaxMedium));\nvar getSplitButtonVerticalDividerClassNames = (0, _utilities.memoizeFunction)(/* eslint-disable deprecation/deprecation */ function(theme) {\n    var _a;\n    return (0, _styling.mergeStyleSets)((0, _verticalDividerClassNames.getDividerClassNames)(theme), {\n        /* eslint-enable deprecation/deprecation */ wrapper: {\n            position: \"absolute\",\n            right: 28,\n            selectors: (_a = {}, _a[MediumScreenSelector] = {\n                right: 32\n            }, _a)\n        },\n        divider: {\n            height: 16,\n            width: 1\n        }\n    });\n});\nvar GlobalClassNames = {\n    item: \"ms-ContextualMenu-item\",\n    divider: \"ms-ContextualMenu-divider\",\n    root: \"ms-ContextualMenu-link\",\n    isChecked: \"is-checked\",\n    isExpanded: \"is-expanded\",\n    isDisabled: \"is-disabled\",\n    linkContent: \"ms-ContextualMenu-linkContent\",\n    linkContentMenu: \"ms-ContextualMenu-linkContent\",\n    icon: \"ms-ContextualMenu-icon\",\n    iconColor: \"ms-ContextualMenu-iconColor\",\n    checkmarkIcon: \"ms-ContextualMenu-checkmarkIcon\",\n    subMenuIcon: \"ms-ContextualMenu-submenuIcon\",\n    label: \"ms-ContextualMenu-itemText\",\n    secondaryText: \"ms-ContextualMenu-secondaryText\",\n    splitMenu: \"ms-ContextualMenu-splitMenu\",\n    screenReaderText: \"ms-ContextualMenu-screenReaderText\"\n};\nvar getItemClassNames = (0, _utilities.memoizeFunction)(function(theme, disabled, expanded, checked, isAnchorLink, knownIcon, itemClassName, dividerClassName, iconClassName, subMenuClassName, primaryDisabled, className) {\n    var _a, _b, _c, _d;\n    var styles = (0, _contextualMenuCnstyles.getMenuItemStyles)(theme);\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return (0, _styling.mergeStyleSets)({\n        item: [\n            classNames.item,\n            styles.item,\n            itemClassName\n        ],\n        divider: [\n            classNames.divider,\n            styles.divider,\n            dividerClassName\n        ],\n        root: [\n            classNames.root,\n            styles.root,\n            checked && [\n                classNames.isChecked,\n                styles.rootChecked\n            ],\n            isAnchorLink && styles.anchorLink,\n            expanded && [\n                classNames.isExpanded,\n                styles.rootExpanded\n            ],\n            disabled && [\n                classNames.isDisabled,\n                styles.rootDisabled\n            ],\n            !disabled && !expanded && [\n                {\n                    selectors: (_a = {\n                        \":hover\": styles.rootHovered,\n                        \":active\": styles.rootPressed\n                    }, _a[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus, .\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus:hover\"] = styles.rootFocused, _a[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:hover\"] = {\n                        background: \"inherit;\"\n                    }, _a)\n                }, \n            ],\n            className, \n        ],\n        splitPrimary: [\n            styles.root,\n            {\n                width: \"calc(100% - \" + CONTEXTUAL_SPLIT_MENU_MINWIDTH + \")\"\n            },\n            checked && [\n                \"is-checked\",\n                styles.rootChecked\n            ],\n            (disabled || primaryDisabled) && [\n                \"is-disabled\",\n                styles.rootDisabled\n            ],\n            !(disabled || primaryDisabled) && !checked && [\n                {\n                    selectors: (_b = {\n                        \":hover\": styles.rootHovered\n                    }, // when hovering over the splitPrimary also affect the splitMenu\n                    _b[\":hover ~ .\" + classNames.splitMenu] = styles.rootHovered, _b[\":active\"] = styles.rootPressed, _b[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus, .\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus:hover\"] = styles.rootFocused, _b[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:hover\"] = {\n                        background: \"inherit;\"\n                    }, _b)\n                }, \n            ], \n        ],\n        splitMenu: [\n            classNames.splitMenu,\n            styles.root,\n            {\n                flexBasis: \"0\",\n                padding: \"0 8px\",\n                minWidth: CONTEXTUAL_SPLIT_MENU_MINWIDTH\n            },\n            expanded && [\n                \"is-expanded\",\n                styles.rootExpanded\n            ],\n            disabled && [\n                \"is-disabled\",\n                styles.rootDisabled\n            ],\n            !disabled && !expanded && [\n                {\n                    selectors: (_c = {\n                        \":hover\": styles.rootHovered,\n                        \":active\": styles.rootPressed\n                    }, _c[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus, .\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus:hover\"] = styles.rootFocused, _c[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:hover\"] = {\n                        background: \"inherit;\"\n                    }, _c)\n                }, \n            ], \n        ],\n        anchorLink: styles.anchorLink,\n        linkContent: [\n            classNames.linkContent,\n            styles.linkContent\n        ],\n        linkContentMenu: [\n            classNames.linkContentMenu,\n            styles.linkContent,\n            {\n                justifyContent: \"center\"\n            }, \n        ],\n        icon: [\n            classNames.icon,\n            knownIcon && styles.iconColor,\n            styles.icon,\n            iconClassName,\n            disabled && [\n                classNames.isDisabled,\n                styles.iconDisabled\n            ], \n        ],\n        iconColor: styles.iconColor,\n        checkmarkIcon: [\n            classNames.checkmarkIcon,\n            knownIcon && styles.checkmarkIcon,\n            styles.icon,\n            iconClassName\n        ],\n        subMenuIcon: [\n            classNames.subMenuIcon,\n            styles.subMenuIcon,\n            subMenuClassName,\n            expanded && {\n                color: theme.palette.neutralPrimary\n            },\n            disabled && [\n                styles.iconDisabled\n            ], \n        ],\n        label: [\n            classNames.label,\n            styles.label\n        ],\n        secondaryText: [\n            classNames.secondaryText,\n            styles.secondaryText\n        ],\n        splitContainer: [\n            styles.splitButtonFlexContainer,\n            !disabled && !checked && [\n                {\n                    selectors: (_d = {}, _d[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus, .\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus:hover\"] = styles.rootFocused, _d)\n                }, \n            ], \n        ],\n        screenReaderText: [\n            classNames.screenReaderText,\n            styles.screenReaderText,\n            (0, _styling.hiddenContentStyle),\n            {\n                visibility: \"hidden\"\n            }, \n        ]\n    });\n});\nvar getItemStyles = function(props) {\n    var theme = props.theme, disabled = props.disabled, expanded = props.expanded, checked = props.checked, isAnchorLink = props.isAnchorLink, knownIcon = props.knownIcon, itemClassName = props.itemClassName, dividerClassName = props.dividerClassName, iconClassName = props.iconClassName, subMenuClassName = props.subMenuClassName, primaryDisabled = props.primaryDisabled, className = props.className;\n    // eslint-disable-next-line deprecation/deprecation\n    return getItemClassNames(theme, disabled, expanded, checked, isAnchorLink, knownIcon, itemClassName, dividerClassName, iconClassName, subMenuClassName, primaryDisabled, className);\n};\n\n},{\"../Divider/VerticalDivider.classNames\":\"df8cn\",\"./ContextualMenu.cnstyles\":\"5SyP0\",\"../../Styling\":\"7JwBd\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"df8cn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getDividerClassNames\", ()=>getDividerClassNames);\nvar _utilities = require(\"../../Utilities\");\nvar _styling = require(\"../../Styling\");\nvar getDividerClassNames = (0, _utilities.memoizeFunction)(// eslint-disable-next-line deprecation/deprecation\nfunction(theme) {\n    return (0, _styling.mergeStyleSets)({\n        wrapper: {\n            display: \"inline-flex\",\n            height: \"100%\",\n            alignItems: \"center\"\n        },\n        divider: {\n            width: 1,\n            height: \"100%\",\n            backgroundColor: theme.palette.neutralTertiaryAlt\n        }\n    });\n});\n\n},{\"../../Utilities\":\"2F07a\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5SyP0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CONTEXTUAL_MENU_ITEM_HEIGHT\", ()=>CONTEXTUAL_MENU_ITEM_HEIGHT);\nparcelHelpers.export(exports, \"getMenuItemStyles\", ()=>getMenuItemStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"../../Utilities\");\nvar CONTEXTUAL_MENU_ITEM_HEIGHT = 36;\nvar MediumScreenSelector = (0, _styling.getScreenSelector)(0, (0, _styling.ScreenWidthMaxMedium));\nvar getMenuItemStyles = (0, _utilities.memoizeFunction)(function(theme) {\n    var _a, _b, _c, _d, _e;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, palette = theme.palette;\n    var ContextualMenuItemBackgroundHoverColor = semanticColors.menuItemBackgroundHovered;\n    var ContextualMenuItemTextHoverColor = semanticColors.menuItemTextHovered;\n    var ContextualMenuItemBackgroundSelectedColor = semanticColors.menuItemBackgroundPressed;\n    var ContextualMenuItemDividerColor = semanticColors.bodyDivider;\n    var menuItemStyles = {\n        item: [\n            fonts.medium,\n            {\n                color: semanticColors.bodyText,\n                position: \"relative\",\n                boxSizing: \"border-box\"\n            }, \n        ],\n        divider: {\n            display: \"block\",\n            height: \"1px\",\n            backgroundColor: ContextualMenuItemDividerColor,\n            position: \"relative\"\n        },\n        root: [\n            (0, _styling.getFocusStyle)(theme),\n            fonts.medium,\n            {\n                color: semanticColors.bodyText,\n                backgroundColor: \"transparent\",\n                border: \"none\",\n                width: \"100%\",\n                height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n                lineHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n                display: \"block\",\n                cursor: \"pointer\",\n                padding: \"0px 8px 0 4px\",\n                textAlign: \"left\"\n            }, \n        ],\n        rootDisabled: {\n            color: semanticColors.disabledBodyText,\n            cursor: \"default\",\n            pointerEvents: \"none\",\n            selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                // ensure disabled text looks different than enabled\n                color: \"GrayText\",\n                opacity: 1\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _a)\n        },\n        rootHovered: {\n            backgroundColor: ContextualMenuItemBackgroundHoverColor,\n            color: ContextualMenuItemTextHoverColor,\n            selectors: {\n                \".ms-ContextualMenu-icon\": {\n                    color: palette.themeDarkAlt\n                },\n                \".ms-ContextualMenu-submenuIcon\": {\n                    color: palette.neutralPrimary\n                }\n            }\n        },\n        rootFocused: {\n            backgroundColor: palette.white\n        },\n        rootChecked: {\n            selectors: {\n                \".ms-ContextualMenu-checkmarkIcon\": {\n                    color: palette.neutralPrimary\n                }\n            }\n        },\n        rootPressed: {\n            backgroundColor: ContextualMenuItemBackgroundSelectedColor,\n            selectors: {\n                \".ms-ContextualMenu-icon\": {\n                    color: palette.themeDark\n                },\n                \".ms-ContextualMenu-submenuIcon\": {\n                    color: palette.neutralPrimary\n                }\n            }\n        },\n        rootExpanded: {\n            backgroundColor: ContextualMenuItemBackgroundSelectedColor,\n            color: semanticColors.bodyTextChecked,\n            selectors: (_b = {\n                \".ms-ContextualMenu-submenuIcon\": (_c = {}, _c[0, _styling.HighContrastSelector] = {\n                    // icons inside of anchor tags are not properly inheriting color in high contrast\n                    color: \"inherit\"\n                }, _c)\n            }, _b[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({}, (0, _styling.getHighContrastNoAdjustStyle)()), _b)\n        },\n        linkContent: {\n            whiteSpace: \"nowrap\",\n            height: \"inherit\",\n            display: \"flex\",\n            alignItems: \"center\",\n            maxWidth: \"100%\"\n        },\n        anchorLink: {\n            padding: \"0px 8px 0 4px\",\n            textRendering: \"auto\",\n            color: \"inherit\",\n            letterSpacing: \"normal\",\n            wordSpacing: \"normal\",\n            textTransform: \"none\",\n            textIndent: \"0px\",\n            textShadow: \"none\",\n            textDecoration: \"none\",\n            boxSizing: \"border-box\"\n        },\n        label: {\n            margin: \"0 4px\",\n            verticalAlign: \"middle\",\n            display: \"inline-block\",\n            flexGrow: \"1\",\n            textOverflow: \"ellipsis\",\n            overflow: \"hidden\",\n            whiteSpace: \"nowrap\"\n        },\n        secondaryText: {\n            color: theme.palette.neutralSecondary,\n            paddingLeft: \"20px\",\n            textAlign: \"right\"\n        },\n        icon: {\n            display: \"inline-block\",\n            minHeight: \"1px\",\n            maxHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n            fontSize: (0, _styling.IconFontSizes).medium,\n            width: (0, _styling.IconFontSizes).medium,\n            margin: \"0 4px\",\n            verticalAlign: \"middle\",\n            flexShrink: \"0\",\n            selectors: (_d = {}, _d[MediumScreenSelector] = {\n                fontSize: (0, _styling.IconFontSizes).large,\n                width: (0, _styling.IconFontSizes).large\n            }, _d)\n        },\n        iconColor: {\n            color: semanticColors.menuIcon\n        },\n        iconDisabled: {\n            color: semanticColors.disabledBodyText\n        },\n        checkmarkIcon: {\n            color: semanticColors.bodySubtext\n        },\n        subMenuIcon: {\n            height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n            lineHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n            color: palette.neutralSecondary,\n            textAlign: \"center\",\n            display: \"inline-block\",\n            verticalAlign: \"middle\",\n            flexShrink: \"0\",\n            fontSize: (0, _styling.IconFontSizes).small,\n            selectors: (_e = {\n                \":hover\": {\n                    color: palette.neutralPrimary\n                },\n                \":active\": {\n                    color: palette.neutralPrimary\n                }\n            }, _e[MediumScreenSelector] = {\n                fontSize: (0, _styling.IconFontSizes).medium\n            }, _e)\n        },\n        splitButtonFlexContainer: [\n            (0, _styling.getFocusStyle)(theme),\n            {\n                display: \"flex\",\n                height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n                flexWrap: \"nowrap\",\n                justifyContent: \"center\",\n                alignItems: \"flex-start\"\n            }, \n        ]\n    };\n    return (0, _styling.concatStyleSets)(menuItemStyles);\n});\n\n},{\"tslib\":\"01Tx1\",\"../../Styling\":\"7JwBd\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fiyw7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _contextualMenuAnchor = require(\"./ContextualMenuAnchor\");\nparcelHelpers.exportAll(_contextualMenuAnchor, exports);\nvar _contextualMenuButton = require(\"./ContextualMenuButton\");\nparcelHelpers.exportAll(_contextualMenuButton, exports);\nvar _contextualMenuSplitButton = require(\"./ContextualMenuSplitButton\");\nparcelHelpers.exportAll(_contextualMenuSplitButton, exports);\nvar _contextualMenuItemWrapper = require(\"./ContextualMenuItemWrapper\");\nparcelHelpers.exportAll(_contextualMenuItemWrapper, exports);\n\n},{\"./ContextualMenuAnchor\":\"233hX\",\"./ContextualMenuButton\":\"d3C84\",\"./ContextualMenuSplitButton\":\"cOQmB\",\"./ContextualMenuItemWrapper\":\"3zwcs\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"233hX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ContextualMenuAnchor\", ()=>ContextualMenuAnchor);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../../Utilities\");\nvar _contextualMenuItemWrapper = require(\"./ContextualMenuItemWrapper\");\nvar _keytipData = require(\"../../../KeytipData\");\nvar _index = require(\"../../../utilities/contextualMenu/index\");\nvar _contextualMenuItem = require(\"../ContextualMenuItem\");\nvar ContextualMenuAnchor = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ContextualMenuAnchor1, _super);\n    function ContextualMenuAnchor1() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._anchor = _react.createRef();\n        _this._getMemoizedMenuButtonKeytipProps = (0, _utilities.memoizeFunction)(function(keytipProps) {\n            return (0, _tslib.__assign)((0, _tslib.__assign)({}, keytipProps), {\n                hasMenu: true\n            });\n        });\n        _this._getSubmenuTarget = function() {\n            return _this._anchor.current ? _this._anchor.current : undefined;\n        };\n        _this._onItemClick = function(ev) {\n            var _a = _this.props, item = _a.item, onItemClick = _a.onItemClick;\n            if (onItemClick) onItemClick(item, ev);\n        };\n        _this._renderAriaDescription = function(ariaDescription, className) {\n            // If ariaDescription is given, descriptionId will be assigned to ariaDescriptionSpan\n            return ariaDescription ? _react.createElement(\"span\", {\n                id: _this._ariaDescriptionId,\n                className: className\n            }, ariaDescription) : null;\n        };\n        return _this;\n    }\n    ContextualMenuAnchor1.prototype.render = function() {\n        var _this = this;\n        var _a = this.props, item = _a.item, classNames = _a.classNames, index = _a.index, focusableElementIndex = _a.focusableElementIndex, totalItemCount = _a.totalItemCount, hasCheckmarks = _a.hasCheckmarks, hasIcons = _a.hasIcons, _b = _a.contextualMenuItemAs, ChildrenRenderer = _b === void 0 ? (0, _contextualMenuItem.ContextualMenuItem) : _b, expandedMenuItemKey = _a.expandedMenuItemKey, onItemClick = _a.onItemClick, openSubMenu = _a.openSubMenu, dismissSubMenu = _a.dismissSubMenu, dismissMenu = _a.dismissMenu;\n        var anchorRel = item.rel;\n        if (item.target && item.target.toLowerCase() === \"_blank\") anchorRel = anchorRel ? anchorRel : \"nofollow noopener noreferrer\"; // Safe default to prevent tabjacking\n        var itemHasSubmenu = (0, _index.hasSubmenu)(item);\n        var nativeProps = (0, _utilities.getNativeProps)(item, (0, _utilities.anchorProperties));\n        var disabled = (0, _index.isItemDisabled)(item);\n        var itemProps = item.itemProps, ariaDescription = item.ariaDescription;\n        var keytipProps = item.keytipProps;\n        if (keytipProps && itemHasSubmenu) keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        // Check for ariaDescription to set the _ariaDescriptionId and render a hidden span with\n        // the description in it to be added to ariaDescribedBy\n        if (ariaDescription) this._ariaDescriptionId = (0, _utilities.getId)();\n        return _react.createElement(\"div\", null, _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: item.keytipProps,\n            ariaDescribedBy: nativeProps[\"aria-describedby\"],\n            disabled: disabled\n        }, function(keytipAttributes) {\n            return _react.createElement(\"a\", (0, _tslib.__assign)({}, nativeProps, keytipAttributes, {\n                ref: _this._anchor,\n                href: item.href,\n                target: item.target,\n                rel: anchorRel,\n                className: classNames.root,\n                role: \"menuitem\",\n                \"aria-haspopup\": itemHasSubmenu || undefined,\n                \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : undefined,\n                \"aria-posinset\": focusableElementIndex + 1,\n                \"aria-setsize\": totalItemCount,\n                \"aria-disabled\": (0, _index.isItemDisabled)(item),\n                \"aria-describedby\": (0, _utilities.mergeAriaAttributeValues)(ariaDescription ? _this._ariaDescriptionId : undefined, keytipAttributes ? keytipAttributes[\"aria-describedby\"] : undefined),\n                // eslint-disable-next-line deprecation/deprecation\n                style: item.style,\n                onClick: _this._onItemClick,\n                onMouseEnter: _this._onItemMouseEnter,\n                onMouseLeave: _this._onItemMouseLeave,\n                onMouseMove: _this._onItemMouseMove,\n                onKeyDown: itemHasSubmenu ? _this._onItemKeyDown : undefined\n            }), _react.createElement(ChildrenRenderer, (0, _tslib.__assign)({\n                componentRef: item.componentRef,\n                item: item,\n                classNames: classNames,\n                index: index,\n                onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : undefined,\n                hasIcons: hasIcons,\n                openSubMenu: openSubMenu,\n                dismissSubMenu: dismissSubMenu,\n                dismissMenu: dismissMenu,\n                getSubmenuTarget: _this._getSubmenuTarget\n            }, itemProps)), _this._renderAriaDescription(ariaDescription, classNames.screenReaderText));\n        }));\n    };\n    return ContextualMenuAnchor1;\n}((0, _contextualMenuItemWrapper.ContextualMenuItemWrapper));\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../../Utilities\":\"2F07a\",\"./ContextualMenuItemWrapper\":\"3zwcs\",\"../../../KeytipData\":\"e8VIa\",\"../../../utilities/contextualMenu/index\":\"kuuyp\",\"../ContextualMenuItem\":\"1A0Og\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3zwcs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ContextualMenuItemWrapper\", ()=>ContextualMenuItemWrapper);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../../Utilities\");\nvar ContextualMenuItemWrapper = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ContextualMenuItemWrapper1, _super);\n    function ContextualMenuItemWrapper1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._onItemMouseEnter = function(ev) {\n            var _a = _this.props, item = _a.item, onItemMouseEnter = _a.onItemMouseEnter;\n            if (onItemMouseEnter) onItemMouseEnter(item, ev, ev.currentTarget);\n        };\n        _this._onItemClick = function(ev) {\n            var _a = _this.props, item = _a.item, onItemClickBase = _a.onItemClickBase;\n            if (onItemClickBase) onItemClickBase(item, ev, ev.currentTarget);\n        };\n        _this._onItemMouseLeave = function(ev) {\n            var _a = _this.props, item = _a.item, onItemMouseLeave = _a.onItemMouseLeave;\n            if (onItemMouseLeave) onItemMouseLeave(item, ev);\n        };\n        _this._onItemKeyDown = function(ev) {\n            var _a = _this.props, item = _a.item, onItemKeyDown = _a.onItemKeyDown;\n            if (onItemKeyDown) onItemKeyDown(item, ev);\n        };\n        _this._onItemMouseMove = function(ev) {\n            var _a = _this.props, item = _a.item, onItemMouseMove = _a.onItemMouseMove;\n            if (onItemMouseMove) onItemMouseMove(item, ev, ev.currentTarget);\n        };\n        _this._getSubmenuTarget = function() {\n            return undefined;\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        return _this;\n    }\n    ContextualMenuItemWrapper1.prototype.shouldComponentUpdate = function(newProps) {\n        return !(0, _utilities.shallowCompare)(newProps, this.props);\n    };\n    return ContextualMenuItemWrapper1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e8VIa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/KeytipData/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/KeytipData/index\":\"khMNJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"khMNJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"useKeytipRef\", ()=>(0, _useKeytipRef.useKeytipRef));\nvar _keytipData = require(\"./KeytipData\");\nparcelHelpers.exportAll(_keytipData, exports);\nvar _useKeytipRef = require(\"./useKeytipRef\");\n\n},{\"./KeytipData\":\"1bTSj\",\"./useKeytipRef\":\"7ZVyF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1bTSj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"KeytipData\", ()=>KeytipData);\nvar _tslib = require(\"tslib\");\nvar _index = require(\"../../utilities/keytips/index\");\nvar _useKeytipData = require(\"./useKeytipData\");\nvar KeytipData = function(props) {\n    var _a;\n    var children = props.children, keytipDataProps = (0, _tslib.__rest)(props, [\n        \"children\"\n    ]);\n    var _b = (0, _useKeytipData.useKeytipData)(keytipDataProps), keytipId = _b.keytipId, ariaDescribedBy = _b.ariaDescribedBy;\n    return children((_a = {}, _a[0, _index.DATAKTP_TARGET] = keytipId, _a[0, _index.DATAKTP_EXECUTE_TARGET] = keytipId, _a[\"aria-describedby\"] = ariaDescribedBy, _a));\n};\n\n},{\"tslib\":\"01Tx1\",\"../../utilities/keytips/index\":\"9cwIS\",\"./useKeytipData\":\"ggrP8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9cwIS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _ikeytipTransitionKey = require(\"./IKeytipTransitionKey\");\nparcelHelpers.exportAll(_ikeytipTransitionKey, exports);\nvar _keytipConfig = require(\"./KeytipConfig\");\nparcelHelpers.exportAll(_keytipConfig, exports);\nvar _keytipConstants = require(\"./KeytipConstants\");\nparcelHelpers.exportAll(_keytipConstants, exports);\nvar _keytipManager = require(\"./KeytipManager\");\nparcelHelpers.exportAll(_keytipManager, exports);\nvar _keytipUtils = require(\"./KeytipUtils\");\nparcelHelpers.exportAll(_keytipUtils, exports);\n\n},{\"./IKeytipTransitionKey\":\"gj6tw\",\"./KeytipConfig\":\"epfVV\",\"./KeytipConstants\":\"6Zpab\",\"./KeytipManager\":\"81MTq\",\"./KeytipUtils\":\"fFBWA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gj6tw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Tests for equality between two IKeytipTransitionKeys.\n *\n * @param key1 - First IKeytipTransitionKey.\n * @param key2 - Second IKeytipTransitionKey.\n * @returns T/F if the transition keys are equal.\n */ parcelHelpers.export(exports, \"transitionKeysAreEqual\", ()=>transitionKeysAreEqual);\n/**\n * Tests if 'key' is present in 'keys'.\n *\n * @param keys - Array of IKeytipTransitionKey.\n * @param key - IKeytipTransitionKey to find in 'keys'.\n * @returns T/F if 'keys' contains 'key'.\n */ parcelHelpers.export(exports, \"transitionKeysContain\", ()=>transitionKeysContain);\nvar _utilities = require(\"../../Utilities\");\nfunction transitionKeysAreEqual(key1, key2) {\n    if (key1.key !== key2.key) return false;\n    var mod1 = key1.modifierKeys;\n    var mod2 = key2.modifierKeys;\n    if (!mod1 && mod2 || mod1 && !mod2) // Not equal if one modifier is defined and the other isn't\n    return false;\n    if (mod1 && mod2) {\n        if (mod1.length !== mod2.length) return false;\n        // Sort both arrays\n        mod1 = mod1.sort();\n        mod2 = mod2.sort();\n        for(var i = 0; i < mod1.length; i++){\n            if (mod1[i] !== mod2[i]) return false;\n        }\n    }\n    return true;\n}\nfunction transitionKeysContain(keys, key) {\n    return !!(0, _utilities.find)(keys, function(transitionKey) {\n        return transitionKeysAreEqual(transitionKey, key);\n    });\n}\n\n},{\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"epfVV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Builds a map of ID to IKeytipProps\n *\n * @param config - IKeytipConfig object\n * @returns Config map\n */ parcelHelpers.export(exports, \"buildKeytipConfigMap\", ()=>buildKeytipConfigMap);\n/**\n * Constructs a keytip from an IKeytipConfigItem and puts it in the configMap\n *\n * @param configMap - IKeytipConfigMap to store the keytip in\n * @param parentSequence - string of the parent keytip\n * @param keytip - IKeytipConfigItem data\n */ parcelHelpers.export(exports, \"constructKeytip\", ()=>constructKeytip);\nvar _tslib = require(\"tslib\");\nfunction buildKeytipConfigMap(config) {\n    var configMap = {};\n    for(var _i = 0, _a = config.keytips; _i < _a.length; _i++){\n        var keytip = _a[_i];\n        constructKeytip(configMap, [], keytip);\n    }\n    return configMap;\n}\nfunction constructKeytip(configMap, parentSequence, keytip) {\n    // Compute full key sequence\n    var sequence = keytip.sequence ? keytip.sequence : keytip.content.toLocaleLowerCase();\n    var keytipSequence = parentSequence.concat(sequence);\n    // Save props in configMap\n    var keytipProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, keytip.optionalProps), {\n        keySequences: keytipSequence,\n        content: keytip.content\n    });\n    configMap[keytip.id] = keytipProps;\n    if (keytip.children) for(var _i = 0, _a = keytip.children; _i < _a.length; _i++){\n        var child = _a[_i];\n        // Create keytips for all children\n        constructKeytip(configMap, keytipSequence, child);\n    }\n}\n\n},{\"tslib\":\"01Tx1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6Zpab\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"KTP_PREFIX\", ()=>KTP_PREFIX);\nparcelHelpers.export(exports, \"KTP_SEPARATOR\", ()=>KTP_SEPARATOR);\nparcelHelpers.export(exports, \"KTP_FULL_PREFIX\", ()=>KTP_FULL_PREFIX);\nparcelHelpers.export(exports, \"DATAKTP_TARGET\", ()=>DATAKTP_TARGET);\nparcelHelpers.export(exports, \"DATAKTP_EXECUTE_TARGET\", ()=>DATAKTP_EXECUTE_TARGET);\nparcelHelpers.export(exports, \"DATAKTP_ARIA_TARGET\", ()=>DATAKTP_ARIA_TARGET);\nparcelHelpers.export(exports, \"KTP_LAYER_ID\", ()=>KTP_LAYER_ID);\nparcelHelpers.export(exports, \"KTP_ARIA_SEPARATOR\", ()=>KTP_ARIA_SEPARATOR);\nparcelHelpers.export(exports, \"KeytipEvents\", ()=>KeytipEvents);\nvar KTP_PREFIX = \"ktp\";\nvar KTP_SEPARATOR = \"-\";\nvar KTP_FULL_PREFIX = KTP_PREFIX + KTP_SEPARATOR;\nvar DATAKTP_TARGET = \"data-ktp-target\";\nvar DATAKTP_EXECUTE_TARGET = \"data-ktp-execute-target\";\nvar DATAKTP_ARIA_TARGET = \"data-ktp-aria-target\";\nvar KTP_LAYER_ID = \"ktp-layer-id\";\nvar KTP_ARIA_SEPARATOR = \", \";\nvar KeytipEvents;\n(function(KeytipEvents1) {\n    KeytipEvents1.KEYTIP_ADDED = \"keytipAdded\";\n    KeytipEvents1.KEYTIP_REMOVED = \"keytipRemoved\";\n    KeytipEvents1.KEYTIP_UPDATED = \"keytipUpdated\";\n    KeytipEvents1.PERSISTED_KEYTIP_ADDED = \"persistedKeytipAdded\";\n    KeytipEvents1.PERSISTED_KEYTIP_REMOVED = \"persistedKeytipRemoved\";\n    KeytipEvents1.PERSISTED_KEYTIP_EXECUTE = \"persistedKeytipExecute\";\n    KeytipEvents1.ENTER_KEYTIP_MODE = \"enterKeytipMode\";\n    KeytipEvents1.EXIT_KEYTIP_MODE = \"exitKeytipMode\";\n})(KeytipEvents || (KeytipEvents = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"81MTq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"KeytipManager\", ()=>KeytipManager);\nvar _tslib = require(\"tslib\");\nvar _utilities = require(\"../../Utilities\");\nvar _keytipConstants = require(\"../../utilities/keytips/KeytipConstants\");\n/**\n * This class is responsible for handling registering, updating, and unregistering of keytips\n */ var KeytipManager = /** @class */ function() {\n    function KeytipManager1() {\n        this.keytips = {};\n        this.persistedKeytips = {};\n        this.sequenceMapping = {};\n        // This is (and should be) updated and kept in sync\n        // with the inKeytipMode in KeytipLayer.\n        this.inKeytipMode = false;\n        // Boolean that gets checked before entering keytip mode by the KeytipLayer\n        // Used for an override in special cases (e.g. Disable entering keytip mode when a modal is shown)\n        this.shouldEnterKeytipMode = true;\n        // Boolean to indicate whether to delay firing an event to update subscribers of\n        // keytip data changed.\n        this.delayUpdatingKeytipChange = false;\n    }\n    /**\n     * Static function to get singleton KeytipManager instance\n     *\n     * @returns Singleton KeytipManager instance\n     */ KeytipManager1.getInstance = function() {\n        return this._instance;\n    };\n    /**\n     * Initialization code to set set parameters to define\n     * how the KeytipManager handles keytip data.\n     *\n     * @param delayUpdatingKeytipChange - T/F if we should delay notifiying keytip subscribers\n     * of keytip changes\n     */ KeytipManager1.prototype.init = function(delayUpdatingKeytipChange) {\n        this.delayUpdatingKeytipChange = delayUpdatingKeytipChange;\n    };\n    /**\n     * Registers a keytip\n     *\n     * @param keytipProps - Keytip to register\n     * @param persisted - T/F if this keytip should be persisted, default is false\n     * @returns Unique ID for this keytip\n     */ KeytipManager1.prototype.register = function(keytipProps, persisted) {\n        if (persisted === void 0) persisted = false;\n        var props = keytipProps;\n        if (!persisted) {\n            // Add the overflowSetSequence if necessary\n            props = this.addParentOverflow(keytipProps);\n            this.sequenceMapping[props.keySequences.toString()] = props;\n        }\n        // Create a unique keytip\n        var uniqueKeytip = this._getUniqueKtp(props);\n        // Add to dictionary\n        persisted ? this.persistedKeytips[uniqueKeytip.uniqueID] = uniqueKeytip : this.keytips[uniqueKeytip.uniqueID] = uniqueKeytip;\n        // We only want to add something new if we are currently showing keytip mode\n        if (this.inKeytipMode || !this.delayUpdatingKeytipChange) {\n            var event_1 = persisted ? (0, _keytipConstants.KeytipEvents).PERSISTED_KEYTIP_ADDED : (0, _keytipConstants.KeytipEvents).KEYTIP_ADDED;\n            (0, _utilities.EventGroup).raise(this, event_1, {\n                keytip: props,\n                uniqueID: uniqueKeytip.uniqueID\n            });\n        }\n        return uniqueKeytip.uniqueID;\n    };\n    /**\n     * Update a keytip\n     *\n     * @param keytipProps - Keytip to update\n     * @param uniqueID - Unique ID of this keytip\n     */ KeytipManager1.prototype.update = function(keytipProps, uniqueID) {\n        var newKeytipProps = this.addParentOverflow(keytipProps);\n        var uniqueKeytip = this._getUniqueKtp(newKeytipProps, uniqueID);\n        var oldKeyTip = this.keytips[uniqueID];\n        if (oldKeyTip) {\n            // Update everything except 'visible'\n            uniqueKeytip.keytip.visible = oldKeyTip.keytip.visible;\n            // Update keytip in this.keytips\n            this.keytips[uniqueID] = uniqueKeytip;\n            // Update the sequence to be up to date\n            delete this.sequenceMapping[oldKeyTip.keytip.keySequences.toString()];\n            this.sequenceMapping[uniqueKeytip.keytip.keySequences.toString()] = uniqueKeytip.keytip;\n            // Raise event only if we are currently in keytip mode\n            if (this.inKeytipMode || !this.delayUpdatingKeytipChange) (0, _utilities.EventGroup).raise(this, (0, _keytipConstants.KeytipEvents).KEYTIP_UPDATED, {\n                keytip: uniqueKeytip.keytip,\n                uniqueID: uniqueKeytip.uniqueID\n            });\n        }\n    };\n    /**\n     * Unregisters a keytip\n     *\n     * @param keytipToRemove - IKeytipProps of the keytip to remove\n     * @param uniqueID - Unique ID of this keytip\n     * @param persisted - T/F if this keytip should be persisted, default is false\n     */ KeytipManager1.prototype.unregister = function(keytipToRemove, uniqueID, persisted) {\n        if (persisted === void 0) persisted = false;\n        persisted ? delete this.persistedKeytips[uniqueID] : delete this.keytips[uniqueID];\n        !persisted && delete this.sequenceMapping[keytipToRemove.keySequences.toString()];\n        var event = persisted ? (0, _keytipConstants.KeytipEvents).PERSISTED_KEYTIP_REMOVED : (0, _keytipConstants.KeytipEvents).KEYTIP_REMOVED;\n        // Update keytips only if we're in keytip mode\n        if (this.inKeytipMode || !this.delayUpdatingKeytipChange) (0, _utilities.EventGroup).raise(this, event, {\n            keytip: keytipToRemove,\n            uniqueID: uniqueID\n        });\n    };\n    /**\n     * Manual call to enter keytip mode\n     */ KeytipManager1.prototype.enterKeytipMode = function() {\n        (0, _utilities.EventGroup).raise(this, (0, _keytipConstants.KeytipEvents).ENTER_KEYTIP_MODE);\n    };\n    /**\n     * Manual call to exit keytip mode\n     */ KeytipManager1.prototype.exitKeytipMode = function() {\n        (0, _utilities.EventGroup).raise(this, (0, _keytipConstants.KeytipEvents).EXIT_KEYTIP_MODE);\n    };\n    /**\n     * Gets all IKeytipProps from this.keytips\n     *\n     * @returns All keytips stored in the manager\n     */ KeytipManager1.prototype.getKeytips = function() {\n        var _this = this;\n        return Object.keys(this.keytips).map(function(key) {\n            return _this.keytips[key].keytip;\n        });\n    };\n    /**\n     * Adds the overflowSetSequence to the keytipProps if its parent keytip also has it\n     *\n     * @param keytipProps - Keytip props to add overflowSetSequence to if necessary\n     * @returns - Modified keytip props, if needed to be modified\n     */ KeytipManager1.prototype.addParentOverflow = function(keytipProps) {\n        var fullSequence = (0, _tslib.__spreadArrays)(keytipProps.keySequences);\n        fullSequence.pop();\n        if (fullSequence.length !== 0) {\n            var parentKeytip = this.sequenceMapping[fullSequence.toString()];\n            if (parentKeytip && parentKeytip.overflowSetSequence) return (0, _tslib.__assign)((0, _tslib.__assign)({}, keytipProps), {\n                overflowSetSequence: parentKeytip.overflowSetSequence\n            });\n        }\n        return keytipProps;\n    };\n    /**\n     * Public function to bind for overflow items that have a submenu\n     */ KeytipManager1.prototype.menuExecute = function(overflowButtonSequences, keytipSequences) {\n        (0, _utilities.EventGroup).raise(this, (0, _keytipConstants.KeytipEvents).PERSISTED_KEYTIP_EXECUTE, {\n            overflowButtonSequences: overflowButtonSequences,\n            keytipSequences: keytipSequences\n        });\n    };\n    /**\n     * Creates an IUniqueKeytip object\n     *\n     * @param keytipProps - IKeytipProps\n     * @param uniqueID - Unique ID, will default to the next unique ID if not passed\n     * @returns IUniqueKeytip object\n     */ KeytipManager1.prototype._getUniqueKtp = function(keytipProps, uniqueID) {\n        if (uniqueID === void 0) uniqueID = (0, _utilities.getId)();\n        return {\n            keytip: (0, _tslib.__assign)({}, keytipProps),\n            uniqueID: uniqueID\n        };\n    };\n    KeytipManager1._instance = new KeytipManager1();\n    return KeytipManager1;\n}();\n\n},{\"tslib\":\"01Tx1\",\"../../Utilities\":\"2F07a\",\"../../utilities/keytips/KeytipConstants\":\"6Zpab\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fFBWA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Converts a whole set of KeySequences into one keytip ID, which will be the ID for the last keytip sequence specified\n * keySequences should not include the initial keytip 'start' sequence.\n *\n * @param keySequences - Full path of IKeySequences for one keytip.\n * @returns String to use for the keytip ID.\n */ parcelHelpers.export(exports, \"sequencesToID\", ()=>sequencesToID);\n/**\n * Merges an overflow sequence with a key sequence.\n *\n * @param keySequences - Full sequence for one keytip.\n * @param overflowKeySequences - Full overflow keytip sequence.\n * @returns Sequence that will be used by the keytip when in the overflow.\n */ parcelHelpers.export(exports, \"mergeOverflows\", ()=>mergeOverflows);\n/**\n * Constructs the data-ktp-target attribute selector from a full key sequence.\n *\n * @param keySequences - Full string[] for a Keytip.\n * @returns String selector to use to query for the keytip target.\n */ parcelHelpers.export(exports, \"ktpTargetFromSequences\", ()=>ktpTargetFromSequences);\n/**\n * Constructs the data-ktp-execute-target attribute selector from a keytip ID.\n *\n * @param keytipId - ID of the Keytip.\n * @returns String selector to use to query for the keytip execute target.\n */ parcelHelpers.export(exports, \"ktpTargetFromId\", ()=>ktpTargetFromId);\n/**\n * Gets the aria-describedby value to put on the component with this keytip.\n *\n * @param keySequences - KeySequences of the keytip.\n * @returns The aria-describedby value to set on the component with this keytip.\n */ parcelHelpers.export(exports, \"getAriaDescribedBy\", ()=>getAriaDescribedBy);\nvar _tslib = require(\"tslib\");\nvar _keytipConstants = require(\"./KeytipConstants\");\nvar _utilities = require(\"../../Utilities\");\nfunction sequencesToID(keySequences) {\n    return keySequences.reduce(function(prevValue, keySequence) {\n        return prevValue + (0, _keytipConstants.KTP_SEPARATOR) + keySequence.split(\"\").join((0, _keytipConstants.KTP_SEPARATOR));\n    }, (0, _keytipConstants.KTP_PREFIX));\n}\nfunction mergeOverflows(keySequences, overflowKeySequences) {\n    var overflowSequenceLen = overflowKeySequences.length;\n    var overflowSequence = (0, _tslib.__spreadArrays)(overflowKeySequences).pop();\n    var newKeySequences = (0, _tslib.__spreadArrays)(keySequences);\n    return (0, _utilities.addElementAtIndex)(newKeySequences, overflowSequenceLen - 1, overflowSequence);\n}\nfunction ktpTargetFromSequences(keySequences) {\n    return \"[\" + (0, _keytipConstants.DATAKTP_TARGET) + '=\"' + sequencesToID(keySequences) + '\"]';\n}\nfunction ktpTargetFromId(keytipId) {\n    return \"[\" + (0, _keytipConstants.DATAKTP_EXECUTE_TARGET) + '=\"' + keytipId + '\"]';\n}\nfunction getAriaDescribedBy(keySequences) {\n    var describedby = \" \" + (0, _keytipConstants.KTP_LAYER_ID);\n    if (!keySequences.length) // Return just the layer ID\n    return describedby;\n    return describedby + \" \" + sequencesToID(keySequences);\n}\n\n},{\"tslib\":\"01Tx1\",\"./KeytipConstants\":\"6Zpab\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ggrP8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook that creates attributes for components which are enabled with Keytip.\n */ parcelHelpers.export(exports, \"useKeytipData\", ()=>useKeytipData);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _reactHooks = require(\"@uifabric/react-hooks\");\nvar _utilities = require(\"../../Utilities\");\nvar _index = require(\"../../utilities/keytips/index\");\nfunction useKeytipData(options) {\n    var uniqueId = _react.useRef();\n    var keytipProps = options.keytipProps ? (0, _tslib.__assign)({\n        disabled: options.disabled\n    }, options.keytipProps) : undefined;\n    var keytipManager = (0, _reactHooks.useConst)((0, _index.KeytipManager).getInstance());\n    var prevOptions = (0, _reactHooks.usePrevious)(options);\n    // useLayoutEffect used to strictly emulate didUpdate/didMount behavior\n    _react.useLayoutEffect(function() {\n        var _a, _b;\n        if (uniqueId.current && keytipProps && (((_a = prevOptions) === null || _a === void 0 ? void 0 : _a.keytipProps) !== options.keytipProps || ((_b = prevOptions) === null || _b === void 0 ? void 0 : _b.disabled) !== options.disabled)) keytipManager.update(keytipProps, uniqueId.current);\n    });\n    _react.useLayoutEffect(function() {\n        // Register Keytip in KeytipManager\n        if (keytipProps) uniqueId.current = keytipManager.register(keytipProps);\n        return function() {\n            // Unregister Keytip in KeytipManager\n            keytipProps && keytipManager.unregister(keytipProps, uniqueId.current);\n        };\n    // this is meant to run only at mount, and updates are handled separately\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n    var nativeKeytipProps = {\n        ariaDescribedBy: undefined,\n        keytipId: undefined\n    };\n    if (keytipProps) nativeKeytipProps = getKeytipData(keytipManager, keytipProps, options.ariaDescribedBy);\n    return nativeKeytipProps;\n}\n/**\n * Gets the aria- and data- attributes to attach to the component\n * @param keytipProps - options for Keytip\n * @param describedByPrepend - ariaDescribedBy value to prepend\n */ function getKeytipData(keytipManager, keytipProps, describedByPrepend) {\n    // Add the parent overflow sequence if necessary\n    var newKeytipProps = keytipManager.addParentOverflow(keytipProps);\n    // Construct aria-describedby and data-ktp-id attributes\n    var ariaDescribedBy = (0, _utilities.mergeAriaAttributeValues)(describedByPrepend, (0, _index.getAriaDescribedBy)(newKeytipProps.keySequences));\n    var keySequences = (0, _tslib.__spreadArrays)(newKeytipProps.keySequences);\n    if (newKeytipProps.overflowSetSequence) keySequences = (0, _index.mergeOverflows)(keySequences, newKeytipProps.overflowSetSequence);\n    var keytipId = (0, _index.sequencesToID)(keySequences);\n    return {\n        ariaDescribedBy: ariaDescribedBy,\n        keytipId: keytipId\n    };\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@uifabric/react-hooks\":\"ga2ba\",\"../../Utilities\":\"2F07a\",\"../../utilities/keytips/index\":\"9cwIS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ga2ba\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _version = require(\"./version\");\nvar _useAsync = require(\"./useAsync\");\nparcelHelpers.exportAll(_useAsync, exports);\nvar _useBoolean = require(\"./useBoolean\");\nparcelHelpers.exportAll(_useBoolean, exports);\nvar _useConst = require(\"./useConst\");\nparcelHelpers.exportAll(_useConst, exports);\nvar _useConstCallback = require(\"./useConstCallback\");\nparcelHelpers.exportAll(_useConstCallback, exports);\nvar _useControllableValue = require(\"./useControllableValue\");\nparcelHelpers.exportAll(_useControllableValue, exports);\nvar _useForceUpdate = require(\"./useForceUpdate\");\nparcelHelpers.exportAll(_useForceUpdate, exports);\nvar _useId = require(\"./useId\");\nparcelHelpers.exportAll(_useId, exports);\nvar _useMergedRefs = require(\"./useMergedRefs\");\nparcelHelpers.exportAll(_useMergedRefs, exports);\nvar _useOnEvent = require(\"./useOnEvent\");\nparcelHelpers.exportAll(_useOnEvent, exports);\nvar _usePrevious = require(\"./usePrevious\");\nparcelHelpers.exportAll(_usePrevious, exports);\nvar _useRefEffect = require(\"./useRefEffect\");\nparcelHelpers.exportAll(_useRefEffect, exports);\nvar _useSetInterval = require(\"./useSetInterval\");\nparcelHelpers.exportAll(_useSetInterval, exports);\nvar _useSetTimeout = require(\"./useSetTimeout\");\nparcelHelpers.exportAll(_useSetTimeout, exports);\nvar _useTarget = require(\"./useTarget\");\nparcelHelpers.exportAll(_useTarget, exports);\nvar _useWarnings = require(\"./useWarnings\");\nparcelHelpers.exportAll(_useWarnings, exports);\n\n},{\"./version\":\"ilqra\",\"./useAsync\":\"lhc95\",\"./useBoolean\":\"iTspn\",\"./useConst\":\"jDC9C\",\"./useConstCallback\":\"gh9LV\",\"./useControllableValue\":\"fvNiU\",\"./useForceUpdate\":\"exwLQ\",\"./useId\":\"aEmQK\",\"./useMergedRefs\":\"aLTbb\",\"./useOnEvent\":\"8eytj\",\"./usePrevious\":\"dgL0N\",\"./useRefEffect\":\"gtLg2\",\"./useSetInterval\":\"jsoAX\",\"./useSetTimeout\":\"abQLL\",\"./useTarget\":\"jHCdq\",\"./useWarnings\":\"9U2u9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ilqra\":[function(require,module,exports) {\n// Do not modify this file; it is generated as part of publish.\n// The checked in version is a placeholder only and will not be updated.\nvar _setVersion = require(\"@uifabric/set-version\");\n(0, _setVersion.setVersion)(\"@uifabric/react-hooks\", \"7.14.1\");\n\n},{\"@uifabric/set-version\":\"896RR\"}],\"lhc95\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook to provide an Async instance that is automatically cleaned up on dismount.\n */ parcelHelpers.export(exports, \"useAsync\", ()=>useAsync);\nvar _utilities = require(\"@uifabric/utilities\");\nvar _react = require(\"react\");\nvar _useConst = require(\"./useConst\");\nfunction useAsync() {\n    var async = (0, _useConst.useConst)(function() {\n        return new (0, _utilities.Async)();\n    });\n    // Function that returns a function in order to dispose the async instance on unmount\n    _react.useEffect(function() {\n        return function() {\n            return async.dispose();\n        };\n    }, [\n        async\n    ]);\n    return async;\n}\n\n},{\"@uifabric/utilities\":\"uTCgd\",\"react\":\"8ePka\",\"./useConst\":\"jDC9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jDC9C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook to initialize and return a constant value. Unlike `React.useMemo`, this is guaranteed to\n * always return the same value (and if the initializer is a function, only call it once).\n * This is similar to setting a private member in a class constructor.\n *\n * If the value should ever change based on dependencies, use `React.useMemo` instead.\n *\n * @param initialValue - Initial value, or function to get the initial value. Similar to `useState`,\n * only the value/function passed in the first time this is called is respected.\n * @returns The value. The identity of this value will always be the same.\n */ parcelHelpers.export(exports, \"useConst\", ()=>useConst);\nvar _react = require(\"react\");\nfunction useConst(initialValue) {\n    // Use useRef to store the value because it's the least expensive built-in hook that works here\n    // (we could also use `const [value] = React.useState(initialValue)` but that's more expensive\n    // internally due to reducer handling which we don't need)\n    var ref = _react.useRef();\n    if (ref.current === undefined) // Box the value in an object so we can tell if it's initialized even if the initializer\n    // returns/is undefined\n    ref.current = {\n        value: typeof initialValue === \"function\" ? initialValue() : initialValue\n    };\n    return ref.current.value;\n}\n\n},{\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iTspn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook to store a value and generate callbacks for setting the value to true or false.\n * The identity of the callbacks will always stay the same.\n *\n * @param initialState - Initial value\n * @returns Array with the current value and an object containing the updater callbacks.\n */ parcelHelpers.export(exports, \"useBoolean\", ()=>useBoolean);\nvar _react = require(\"react\");\nvar _useConst = require(\"./useConst\");\nfunction useBoolean(initialState) {\n    var _a = _react.useState(initialState), value = _a[0], setValue = _a[1];\n    // Storing the value in a ref is redundant but allows the `toggle` callback to have a\n    // constant identity, which overall is probably better for consumers' perf.\n    var valueRef = _react.useRef(value);\n    var setTrue = (0, _useConst.useConst)(function() {\n        return function() {\n            setValue(true);\n            valueRef.current = true;\n        };\n    });\n    var setFalse = (0, _useConst.useConst)(function() {\n        return function() {\n            setValue(false);\n            valueRef.current = false;\n        };\n    });\n    var toggle = (0, _useConst.useConst)(function() {\n        return function() {\n            return valueRef.current ? setFalse() : setTrue();\n        };\n    });\n    return [\n        value,\n        {\n            setTrue: setTrue,\n            setFalse: setFalse,\n            toggle: toggle\n        }\n    ];\n}\n\n},{\"react\":\"8ePka\",\"./useConst\":\"jDC9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gh9LV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * @deprecated Deprecated due to potential for misuse (see package readme).\n * Use `React.useCallback` instead.\n */ // eslint-disable-next-line @typescript-eslint/no-explicit-any\nparcelHelpers.export(exports, \"useConstCallback\", ()=>useConstCallback);\nvar _react = require(\"react\");\nfunction useConstCallback(callback) {\n    var ref = _react.useRef();\n    if (!ref.current) ref.current = callback;\n    return ref.current;\n}\n\n},{\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fvNiU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"useControllableValue\", ()=>useControllableValue);\nvar _react = require(\"react\");\nvar _useConst = require(\"./useConst\");\nfunction useControllableValue(controlledValue, defaultUncontrolledValue, onChange) {\n    var _a = _react.useState(defaultUncontrolledValue), value = _a[0], setValue = _a[1];\n    var isControlled = (0, _useConst.useConst)(controlledValue !== undefined);\n    var currentValue = isControlled ? controlledValue : value;\n    // Duplicate the current value and onChange in refs so they're accessible from\n    // setValueOrCallOnChange without creating a new callback every time\n    var valueRef = _react.useRef(currentValue);\n    var onChangeRef = _react.useRef(onChange);\n    _react.useEffect(function() {\n        valueRef.current = currentValue;\n        onChangeRef.current = onChange;\n    });\n    // To match the behavior of the setter returned by React.useState, this callback's identity\n    // should never change. This means it MUST NOT directly reference variables that can change.\n    var setValueOrCallOnChange = (0, _useConst.useConst)(function() {\n        return function(update, ev) {\n            // Assuming here that TValue is not a function, because a controllable value will typically\n            // be something a user can enter as input\n            var newValue = typeof update === \"function\" ? update(valueRef.current) : update;\n            if (onChangeRef.current) onChangeRef.current(ev, newValue);\n            if (!isControlled) setValue(newValue);\n        };\n    });\n    return [\n        currentValue,\n        setValueOrCallOnChange\n    ];\n}\n\n},{\"react\":\"8ePka\",\"./useConst\":\"jDC9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"exwLQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook to force update a function component by updating a dummy state.\n */ parcelHelpers.export(exports, \"useForceUpdate\", ()=>useForceUpdate);\nvar _react = require(\"react\");\nvar _useConst = require(\"./useConst\");\nfunction useForceUpdate() {\n    var _a = _react.useState(0), setValue = _a[1];\n    var forceUpdate = (0, _useConst.useConst)(function() {\n        return function() {\n            return setValue(function(value) {\n                return ++value;\n            });\n        };\n    });\n    return forceUpdate;\n}\n\n},{\"react\":\"8ePka\",\"./useConst\":\"jDC9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aEmQK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook to generate a unique ID in the global scope (spanning across duplicate copies of the same library).\n *\n * @param prefix - Optional prefix for the ID\n * @param providedId - Optional id provided by a parent component. Defaults to the provided value if present,\n *  without conditioning the hook call\n * @returns The ID\n */ parcelHelpers.export(exports, \"useId\", ()=>useId);\nvar _react = require(\"react\");\nvar _getId = require(\"@uifabric/utilities/lib/getId\");\nfunction useId(prefix, providedId) {\n    // getId should only be called once since it updates the global constant for the next ID value.\n    // (While an extra update isn't likely to cause problems in practice, it's better to avoid it.)\n    var ref = _react.useRef(providedId);\n    if (!ref.current) ref.current = (0, _getId.getId)(prefix);\n    return ref.current;\n}\n\n},{\"react\":\"8ePka\",\"@uifabric/utilities/lib/getId\":\"XXn0P\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aLTbb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * React hook to merge multiple React refs (either MutableRefObjects or ref callbacks) into a single ref callback that\n * updates all provided refs\n * @param refs - Refs to collectively update with one ref value.\n * @returns A function with an attached \"current\" prop, so that it can be treated like a RefObject.\n */ parcelHelpers.export(exports, \"useMergedRefs\", ()=>useMergedRefs);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nfunction useMergedRefs() {\n    var refs = [];\n    for(var _i1 = 0; _i1 < arguments.length; _i1++)refs[_i1] = arguments[_i1];\n    var mergedCallback = _react.useCallback(function(value) {\n        // Update the \"current\" prop hanging on the function.\n        mergedCallback.current = value;\n        for(var _i = 0, refs_1 = refs; _i < refs_1.length; _i++){\n            var ref = refs_1[_i];\n            if (typeof ref === \"function\") ref(value);\n            else if (ref) // work around the immutability of the React.Ref type\n            ref.current = value;\n        }\n    }, (0, _tslib.__spreadArrays)(refs));\n    return mergedCallback;\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8eytj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook to attach an event handler on mount and handle cleanup.\n * @param element - Element (or ref to an element) to attach the event handler to\n * @param eventName - The event to attach a handler for\n * @param callback - The handler for the event\n * @param useCapture - Whether or not to attach the handler for the capture phase\n */ parcelHelpers.export(exports, \"useOnEvent\", ()=>useOnEvent);\nvar _utilities = require(\"@uifabric/utilities\");\nvar _react = require(\"react\");\nfunction useOnEvent(element, eventName, callback, useCapture) {\n    // Use a ref for the callback to prevent repeatedly attaching/unattaching callbacks that are unstable across renders\n    var callbackRef = _react.useRef(callback);\n    callbackRef.current = callback;\n    _react.useEffect(function() {\n        var actualElement = element && \"current\" in element ? element.current : element;\n        if (!actualElement) return;\n        var dispose = (0, _utilities.on)(actualElement, eventName, function(ev) {\n            return callbackRef.current(ev);\n        }, useCapture);\n        return dispose;\n    }, [\n        element,\n        eventName,\n        useCapture\n    ]);\n}\n\n},{\"@uifabric/utilities\":\"uTCgd\",\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dgL0N\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook keeping track of a given value from a previous execution of the component the Hook is used in.\n *\n * See [React Hooks FAQ](https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state)\n */ parcelHelpers.export(exports, \"usePrevious\", ()=>usePrevious);\nvar _react = require(\"react\");\nfunction usePrevious(value) {\n    var ref = (0, _react.useRef)();\n    (0, _react.useEffect)(function() {\n        ref.current = value;\n    });\n    return ref.current;\n}\n\n},{\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gtLg2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Creates a ref, and calls a callback whenever the ref changes to a non-null value. The callback can optionally return\n * a cleanup function that'll be called before the value changes, and when the ref is unmounted.\n *\n * This can be used to work around a limitation that useEffect cannot depend on `ref.current` (see\n * https://github.com/facebook/react/issues/14387#issuecomment-503616820).\n *\n * Usage example:\n * ```ts\n * const myRef = useRefEffect<HTMLElement>(element => {\n *  ...\n *  return () => { ... cleanup ... };\n * });\n * ```\n * ```jsx\n * <div ref={myRef} />\n * ```\n *\n * @param callback - Called whenever the ref's value changes to non-null. Can optionally return a cleanup function.\n * @param initial - (Optional) The initial value for the ref.\n *\n * @returns A function that should be called to set the ref's value. The object also has a `.current` member that can be\n * used to access the ref's value (like a normal RefObject). It can be hooked up to an element's `ref` property.\n */ parcelHelpers.export(exports, \"useRefEffect\", ()=>useRefEffect);\nvar _react = require(\"react\");\nfunction useRefEffect(callback, initial) {\n    if (initial === void 0) initial = null;\n    var data = _react.useRef({\n        ref: Object.assign(function(value) {\n            if (data.ref.current !== value) {\n                if (data.cleanup) {\n                    data.cleanup();\n                    data.cleanup = undefined;\n                }\n                data.ref.current = value;\n                if (value !== null) data.cleanup = data.callback(value);\n            }\n        }, {\n            current: initial\n        }),\n        callback: callback\n    }).current;\n    data.callback = callback;\n    return data.ref;\n}\n\n},{\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jsoAX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"useSetInterval\", ()=>useSetInterval);\nvar _react = require(\"react\");\nvar _useConst = require(\"./useConst\");\nvar useSetInterval = function() {\n    var intervalIds = (0, _useConst.useConst)({});\n    _react.useEffect(function() {\n        return function() {\n            for(var _i = 0, _a = Object.keys(intervalIds); _i < _a.length; _i++){\n                var id = _a[_i];\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                clearInterval(id);\n            }\n        };\n    }, // useConst ensures this will never change, but react-hooks/exhaustive-deps doesn't know that\n    [\n        intervalIds\n    ]);\n    return (0, _useConst.useConst)({\n        setInterval: function(func, duration) {\n            var id = setInterval(func, duration);\n            intervalIds[id] = 1;\n            return id;\n        },\n        clearInterval: function(id) {\n            delete intervalIds[id];\n            clearInterval(id);\n        }\n    });\n};\n\n},{\"react\":\"8ePka\",\"./useConst\":\"jDC9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"abQLL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"useSetTimeout\", ()=>useSetTimeout);\nvar _react = require(\"react\");\nvar _useConst = require(\"./useConst\");\nvar useSetTimeout = function() {\n    var timeoutIds = (0, _useConst.useConst)({});\n    // Cleanup function.\n    _react.useEffect(function() {\n        return function() {\n            for(var _i = 0, _a = Object.keys(timeoutIds); _i < _a.length; _i++){\n                var id = _a[_i];\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                clearTimeout(id);\n            }\n        };\n    }, // useConst ensures this will never change, but react-hooks/exhaustive-deps doesn't know that\n    [\n        timeoutIds\n    ]);\n    // Return wrapper which will auto cleanup.\n    return (0, _useConst.useConst)({\n        setTimeout: function(func, duration) {\n            var id = setTimeout(func, duration);\n            timeoutIds[id] = 1;\n            return id;\n        },\n        clearTimeout: function(id) {\n            delete timeoutIds[id];\n            clearTimeout(id);\n        }\n    });\n};\n\n},{\"react\":\"8ePka\",\"./useConst\":\"jDC9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jHCdq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook to calculate and cache the target element specified by the given target attribute,\n * as well as the target element's (or host element's) parent window\n * @param target- Target selector passed to the component as a property, describing the element that\n * the callout should target\n * @param hostElement- The callout's host element, used for determining the parent window.\n */ parcelHelpers.export(exports, \"useTarget\", ()=>useTarget);\nvar _utilities = require(\"@uifabric/utilities\");\nvar _react = require(\"react\");\nvar _reactWindowProvider = require(\"@fluentui/react-window-provider\");\nfunction useTarget(target, hostElement) {\n    var _a;\n    var previousTargetProp = _react.useRef();\n    var targetRef = _react.useRef(null);\n    /**\n     * Stores an instance of Window, used to check\n     * for server side rendering and if focus was lost.\n     */ var targetWindow = (0, _reactWindowProvider.useWindow)();\n    // If the target element changed, find the new one. If we are tracking\n    // target with class name, always find element because we do not know if\n    // fabric has rendered a new element and disposed the old element.\n    if (!target || target !== previousTargetProp.current || typeof target === \"string\") {\n        var currentElement = (_a = hostElement) === null || _a === void 0 ? void 0 : _a.current;\n        if (target) {\n            if (typeof target === \"string\") {\n                var currentDoc = (0, _utilities.getDocument)(currentElement);\n                targetRef.current = currentDoc ? currentDoc.querySelector(target) : null;\n            } else if (\"stopPropagation\" in target) targetRef.current = target;\n            else if (\"getBoundingClientRect\" in target) targetRef.current = target;\n            else if (\"current\" in target) targetRef.current = target.current;\n            else targetRef.current = target;\n        }\n        previousTargetProp.current = target;\n    }\n    return [\n        targetRef,\n        targetWindow\n    ];\n}\n\n},{\"@uifabric/utilities\":\"uTCgd\",\"react\":\"8ePka\",\"@fluentui/react-window-provider\":\"5Gutx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9U2u9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Only in development mode, display console warnings when certain conditions are met.\n * Note that all warnings except `controlledUsage` will only be shown on first render\n * (new `controlledUsage` warnings may be shown later due to prop changes).\n */ parcelHelpers.export(exports, \"useWarnings\", ()=>useWarnings);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _warn = require(\"@uifabric/utilities/lib/warn\");\nvar _usePrevious = require(\"./usePrevious\");\nvar _useConst = require(\"./useConst\");\nvar warningId = 0;\nfunction useWarnings(options) {\n    var name_1, props, _a, other, conditionallyRequired, deprecations, mutuallyExclusive, controlledUsage, hasWarnedRef, componentId, oldProps, _i, other_1, warning, _b, conditionallyRequired_1, req;\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@uifabric/utilities/lib/warn\":\"fzP82\",\"./usePrevious\":\"dgL0N\",\"./useConst\":\"jDC9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ZVyF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Hook that creates a ref which is used for passing to Keytip target element.\n * The ref will handle setting the attributes needed for Keytip to work.\n */ parcelHelpers.export(exports, \"useKeytipRef\", ()=>useKeytipRef);\nparcelHelpers.export(exports, \"setAttribute\", ()=>setAttribute);\nvar _react = require(\"react\");\nvar _index = require(\"../../utilities/keytips/index\");\nvar _useKeytipData = require(\"./useKeytipData\");\nfunction useKeytipRef(options) {\n    var _a = (0, _useKeytipData.useKeytipData)(options), keytipId = _a.keytipId, ariaDescribedBy = _a.ariaDescribedBy;\n    var contentRef = _react.useCallback(function(contentElement) {\n        if (!contentElement) return;\n        var targetElement = findFirstElement(contentElement, (0, _index.DATAKTP_TARGET)) || contentElement;\n        var executeElement = findFirstElement(contentElement, (0, _index.DATAKTP_EXECUTE_TARGET)) || targetElement;\n        var ariaElement = findFirstElement(contentElement, (0, _index.DATAKTP_ARIA_TARGET)) || executeElement;\n        setAttribute(targetElement, (0, _index.DATAKTP_TARGET), keytipId);\n        setAttribute(executeElement, (0, _index.DATAKTP_EXECUTE_TARGET), keytipId);\n        setAttribute(ariaElement, \"aria-describedby\", ariaDescribedBy, true);\n    }, [\n        keytipId,\n        ariaDescribedBy\n    ]);\n    return contentRef;\n}\nfunction setAttribute(element, attributeName, attributeValue, append) {\n    if (append === void 0) append = false;\n    if (element && attributeValue) {\n        var value = attributeValue;\n        if (append) {\n            var currentValue = element.getAttribute(attributeName);\n            if (currentValue && currentValue.indexOf(attributeValue) === -1) value = currentValue + \" \" + attributeValue;\n        }\n        element.setAttribute(attributeName, value);\n    }\n}\nfunction findFirstElement(rootElement, dataAttribute) {\n    return rootElement.querySelector(\"[\" + dataAttribute + \"]\");\n}\n\n},{\"react\":\"8ePka\",\"../../utilities/keytips/index\":\"9cwIS\",\"./useKeytipData\":\"ggrP8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d3C84\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ContextualMenuButton\", ()=>ContextualMenuButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../../Utilities\");\nvar _contextualMenuItemWrapper = require(\"./ContextualMenuItemWrapper\");\nvar _keytipData = require(\"../../../KeytipData\");\nvar _index = require(\"../../../utilities/contextualMenu/index\");\nvar _contextualMenuItem = require(\"../ContextualMenuItem\");\nvar ContextualMenuButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ContextualMenuButton1, _super);\n    function ContextualMenuButton1() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._btn = _react.createRef();\n        _this._getMemoizedMenuButtonKeytipProps = (0, _utilities.memoizeFunction)(function(keytipProps) {\n            return (0, _tslib.__assign)((0, _tslib.__assign)({}, keytipProps), {\n                hasMenu: true\n            });\n        });\n        _this._renderAriaDescription = function(ariaDescription, className) {\n            // If ariaDescription is given, descriptionId will be assigned to ariaDescriptionSpan\n            return ariaDescription ? _react.createElement(\"span\", {\n                id: _this._ariaDescriptionId,\n                className: className\n            }, ariaDescription) : null;\n        };\n        _this._getSubmenuTarget = function() {\n            return _this._btn.current ? _this._btn.current : undefined;\n        };\n        return _this;\n    }\n    ContextualMenuButton1.prototype.render = function() {\n        var _this = this;\n        var _a = this.props, item = _a.item, classNames = _a.classNames, index = _a.index, focusableElementIndex = _a.focusableElementIndex, totalItemCount = _a.totalItemCount, hasCheckmarks = _a.hasCheckmarks, hasIcons = _a.hasIcons, _b = _a.contextualMenuItemAs, ChildrenRenderer = _b === void 0 ? (0, _contextualMenuItem.ContextualMenuItem) : _b, expandedMenuItemKey = _a.expandedMenuItemKey, onItemMouseDown = _a.onItemMouseDown, onItemClick = _a.onItemClick, openSubMenu = _a.openSubMenu, dismissSubMenu = _a.dismissSubMenu, dismissMenu = _a.dismissMenu;\n        var isChecked = (0, _index.getIsChecked)(item);\n        var canCheck = isChecked !== null;\n        var defaultRole = (0, _index.getMenuItemAriaRole)(item);\n        var itemHasSubmenu = (0, _index.hasSubmenu)(item);\n        var itemProps = item.itemProps, ariaLabel = item.ariaLabel, ariaDescription = item.ariaDescription;\n        var buttonNativeProperties = (0, _utilities.getNativeProps)(item, (0, _utilities.buttonProperties));\n        // Do not add the disabled attribute to the button so that it is focusable\n        delete buttonNativeProperties.disabled;\n        var itemRole = item.role || defaultRole;\n        // Check for ariaDescription to set the _ariaDescriptionId and render a hidden span with\n        // the description in it to be added to ariaDescribedBy\n        if (ariaDescription) this._ariaDescriptionId = (0, _utilities.getId)();\n        var ariaDescribedByIds = ariaDescription ? this._ariaDescriptionId : undefined;\n        var itemButtonProperties = {\n            className: classNames.root,\n            onClick: this._onItemClick,\n            onKeyDown: itemHasSubmenu ? this._onItemKeyDown : undefined,\n            onMouseEnter: this._onItemMouseEnter,\n            onMouseLeave: this._onItemMouseLeave,\n            onMouseDown: function(ev) {\n                return onItemMouseDown ? onItemMouseDown(item, ev) : undefined;\n            },\n            onMouseMove: this._onItemMouseMove,\n            href: item.href,\n            title: item.title,\n            \"aria-label\": ariaLabel,\n            \"aria-describedby\": ariaDescribedByIds,\n            \"aria-haspopup\": itemHasSubmenu || undefined,\n            \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : undefined,\n            \"aria-posinset\": focusableElementIndex + 1,\n            \"aria-setsize\": totalItemCount,\n            \"aria-disabled\": (0, _index.isItemDisabled)(item),\n            \"aria-checked\": (itemRole === \"menuitemcheckbox\" || itemRole === \"menuitemradio\") && canCheck ? !!isChecked : undefined,\n            \"aria-selected\": itemRole === \"menuitem\" && canCheck ? !!isChecked : undefined,\n            role: itemRole,\n            // eslint-disable-next-line deprecation/deprecation\n            style: item.style\n        };\n        var keytipProps = item.keytipProps;\n        if (keytipProps && itemHasSubmenu) keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        return _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: keytipProps,\n            ariaDescribedBy: buttonNativeProperties[\"aria-describedby\"],\n            disabled: (0, _index.isItemDisabled)(item)\n        }, function(keytipAttributes) {\n            return _react.createElement(\"button\", (0, _tslib.__assign)({\n                ref: _this._btn\n            }, buttonNativeProperties, itemButtonProperties, keytipAttributes, {\n                \"aria-describedby\": (0, _utilities.mergeAriaAttributeValues)(itemButtonProperties[\"aria-describedby\"], keytipAttributes ? keytipAttributes[\"aria-describedby\"] : undefined)\n            }), _react.createElement(ChildrenRenderer, (0, _tslib.__assign)({\n                componentRef: item.componentRef,\n                item: item,\n                classNames: classNames,\n                index: index,\n                onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : undefined,\n                hasIcons: hasIcons,\n                openSubMenu: openSubMenu,\n                dismissSubMenu: dismissSubMenu,\n                dismissMenu: dismissMenu,\n                getSubmenuTarget: _this._getSubmenuTarget\n            }, itemProps)), _this._renderAriaDescription(ariaDescription, classNames.screenReaderText));\n        });\n    };\n    return ContextualMenuButton1;\n}((0, _contextualMenuItemWrapper.ContextualMenuItemWrapper));\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../../Utilities\":\"2F07a\",\"./ContextualMenuItemWrapper\":\"3zwcs\",\"../../../KeytipData\":\"e8VIa\",\"../../../utilities/contextualMenu/index\":\"kuuyp\",\"../ContextualMenuItem\":\"1A0Og\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cOQmB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ContextualMenuSplitButton\", ()=>ContextualMenuSplitButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../../Utilities\");\nvar _contextualMenuItem = require(\"../ContextualMenuItem\");\nvar _contextualMenuClassNames = require(\"../ContextualMenu.classNames\");\nvar _keytipData = require(\"../../../KeytipData\");\nvar _index = require(\"../../../utilities/contextualMenu/index\");\nvar _divider = require(\"../../../Divider\");\nvar _contextualMenuItemWrapper = require(\"./ContextualMenuItemWrapper\");\nvar TouchIdleDelay = 500; /* ms */ \nvar ContextualMenuSplitButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ContextualMenuSplitButton1, _super);\n    function ContextualMenuSplitButton1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._getMemoizedMenuButtonKeytipProps = (0, _utilities.memoizeFunction)(function(keytipProps) {\n            return (0, _tslib.__assign)((0, _tslib.__assign)({}, keytipProps), {\n                hasMenu: true\n            });\n        });\n        _this._renderAriaDescription = function(ariaDescription, className) {\n            // If ariaDescription is given, descriptionId will be assigned to ariaDescriptionSpan\n            return ariaDescription ? _react.createElement(\"span\", {\n                id: _this._ariaDescriptionId,\n                className: className\n            }, ariaDescription) : null;\n        };\n        _this._onItemKeyDown = function(ev) {\n            var _a = _this.props, item = _a.item, onItemKeyDown = _a.onItemKeyDown;\n            if (ev.which === (0, _utilities.KeyCodes).enter) {\n                _this._executeItemClick(ev);\n                ev.preventDefault();\n                ev.stopPropagation();\n            } else if (onItemKeyDown) onItemKeyDown(item, ev);\n        };\n        _this._getSubmenuTarget = function() {\n            return _this._splitButton;\n        };\n        _this._onItemMouseEnterPrimary = function(ev) {\n            var _a = _this.props, item = _a.item, onItemMouseEnter = _a.onItemMouseEnter;\n            if (onItemMouseEnter) onItemMouseEnter((0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                subMenuProps: undefined,\n                items: undefined\n            }), ev, _this._splitButton);\n        };\n        _this._onItemMouseEnterIcon = function(ev) {\n            var _a = _this.props, item = _a.item, onItemMouseEnter = _a.onItemMouseEnter;\n            if (onItemMouseEnter) onItemMouseEnter(item, ev, _this._splitButton);\n        };\n        _this._onItemMouseMovePrimary = function(ev) {\n            var _a = _this.props, item = _a.item, onItemMouseMove = _a.onItemMouseMove;\n            if (onItemMouseMove) onItemMouseMove((0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                subMenuProps: undefined,\n                items: undefined\n            }), ev, _this._splitButton);\n        };\n        _this._onItemMouseMoveIcon = function(ev) {\n            var _a = _this.props, item = _a.item, onItemMouseMove = _a.onItemMouseMove;\n            if (onItemMouseMove) onItemMouseMove(item, ev, _this._splitButton);\n        };\n        _this._onIconItemClick = function(ev) {\n            var _a = _this.props, item = _a.item, onItemClickBase = _a.onItemClickBase;\n            if (onItemClickBase) onItemClickBase(item, ev, _this._splitButton ? _this._splitButton : ev.currentTarget);\n        };\n        _this._executeItemClick = function(ev) {\n            var _a = _this.props, item = _a.item, executeItemClick = _a.executeItemClick, onItemClick = _a.onItemClick;\n            if (item.disabled || item.isDisabled) return;\n            if (_this._processingTouch && onItemClick) return onItemClick(item, ev);\n            if (executeItemClick) executeItemClick(item, ev);\n        };\n        _this._onTouchStart = function(ev) {\n            if (_this._splitButton && !(\"onpointerdown\" in _this._splitButton)) _this._handleTouchAndPointerEvent(ev);\n        };\n        _this._onPointerDown = function(ev) {\n            if (ev.pointerType === \"touch\") {\n                _this._handleTouchAndPointerEvent(ev);\n                ev.preventDefault();\n                ev.stopImmediatePropagation();\n            }\n        };\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._events = new (0, _utilities.EventGroup)(_this);\n        return _this;\n    }\n    ContextualMenuSplitButton1.prototype.componentDidMount = function() {\n        if (this._splitButton && \"onpointerdown\" in this._splitButton) this._events.on(this._splitButton, \"pointerdown\", this._onPointerDown, true);\n    };\n    ContextualMenuSplitButton1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n    };\n    ContextualMenuSplitButton1.prototype.render = function() {\n        var _this = this;\n        var _a = this.props, item = _a.item, classNames = _a.classNames, index = _a.index, focusableElementIndex = _a.focusableElementIndex, totalItemCount = _a.totalItemCount, hasCheckmarks = _a.hasCheckmarks, hasIcons = _a.hasIcons, onItemMouseLeave = _a.onItemMouseLeave, expandedMenuItemKey = _a.expandedMenuItemKey;\n        var itemHasSubmenu = (0, _index.hasSubmenu)(item);\n        var keytipProps = item.keytipProps;\n        if (keytipProps) keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        // Check for ariaDescription to set the _ariaDescriptionId and render a hidden span with\n        // the description in it to be added to ariaDescribedBy\n        var ariaDescription = item.ariaDescription;\n        if (ariaDescription) this._ariaDescriptionId = (0, _utilities.getId)();\n        return _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: keytipProps,\n            disabled: (0, _index.isItemDisabled)(item)\n        }, function(keytipAttributes) {\n            return _react.createElement(\"div\", {\n                \"data-ktp-target\": keytipAttributes[\"data-ktp-target\"],\n                ref: function(splitButton) {\n                    return _this._splitButton = splitButton;\n                },\n                role: (0, _index.getMenuItemAriaRole)(item),\n                \"aria-label\": item.ariaLabel,\n                className: classNames.splitContainer,\n                \"aria-disabled\": (0, _index.isItemDisabled)(item),\n                \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : undefined,\n                \"aria-haspopup\": true,\n                \"aria-describedby\": (0, _utilities.mergeAriaAttributeValues)(ariaDescription ? _this._ariaDescriptionId : undefined, keytipAttributes[\"aria-describedby\"]),\n                \"aria-checked\": item.isChecked || item.checked,\n                \"aria-posinset\": focusableElementIndex + 1,\n                \"aria-setsize\": totalItemCount,\n                onMouseEnter: _this._onItemMouseEnterPrimary,\n                onMouseLeave: onItemMouseLeave ? onItemMouseLeave.bind(_this, (0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                    subMenuProps: null,\n                    items: null\n                })) : undefined,\n                onMouseMove: _this._onItemMouseMovePrimary,\n                onKeyDown: _this._onItemKeyDown,\n                onClick: _this._executeItemClick,\n                onTouchStart: _this._onTouchStart,\n                tabIndex: 0,\n                \"data-is-focusable\": true,\n                \"aria-roledescription\": item[\"aria-roledescription\"]\n            }, _this._renderSplitPrimaryButton(item, classNames, index, hasCheckmarks, hasIcons), _this._renderSplitDivider(item), _this._renderSplitIconButton(item, classNames, index, keytipAttributes), _this._renderAriaDescription(ariaDescription, classNames.screenReaderText));\n        });\n    };\n    ContextualMenuSplitButton1.prototype._renderSplitPrimaryButton = function(item, // eslint-disable-next-line deprecation/deprecation\n    classNames, index, hasCheckmarks, hasIcons) {\n        var _a = this.props, _b = _a.contextualMenuItemAs, ChildrenRenderer = _b === void 0 ? (0, _contextualMenuItem.ContextualMenuItem) : _b, onItemClick = _a.onItemClick;\n        var itemProps = {\n            key: item.key,\n            disabled: (0, _index.isItemDisabled)(item) || item.primaryDisabled,\n            /* eslint-disable deprecation/deprecation */ name: item.name,\n            text: item.text || item.name,\n            secondaryText: item.secondaryText,\n            /* eslint-enable deprecation/deprecation */ className: classNames.splitPrimary,\n            canCheck: item.canCheck,\n            isChecked: item.isChecked,\n            checked: item.checked,\n            iconProps: item.iconProps,\n            onRenderIcon: item.onRenderIcon,\n            data: item.data,\n            \"data-is-focusable\": false\n        };\n        var itemComponentProps = item.itemProps;\n        return _react.createElement(\"button\", (0, _tslib.__assign)({}, (0, _utilities.getNativeProps)(itemProps, (0, _utilities.buttonProperties))), _react.createElement(ChildrenRenderer, (0, _tslib.__assign)({\n            \"data-is-focusable\": false,\n            item: itemProps,\n            classNames: classNames,\n            index: index,\n            onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : undefined,\n            hasIcons: hasIcons\n        }, itemComponentProps)));\n    };\n    ContextualMenuSplitButton1.prototype._renderSplitDivider = function(item) {\n        var getDividerClassNames = item.getSplitButtonVerticalDividerClassNames || (0, _contextualMenuClassNames.getSplitButtonVerticalDividerClassNames);\n        return _react.createElement((0, _divider.VerticalDivider), {\n            getClassNames: getDividerClassNames\n        });\n    };\n    ContextualMenuSplitButton1.prototype._renderSplitIconButton = function(item, classNames, index, keytipAttributes) {\n        var _a = this.props, _b = _a.contextualMenuItemAs, ChildrenRenderer = _b === void 0 ? (0, _contextualMenuItem.ContextualMenuItem) : _b, onItemMouseLeave = _a.onItemMouseLeave, onItemMouseDown = _a.onItemMouseDown, openSubMenu = _a.openSubMenu, dismissSubMenu = _a.dismissSubMenu, dismissMenu = _a.dismissMenu;\n        var itemProps = {\n            onClick: this._onIconItemClick,\n            disabled: (0, _index.isItemDisabled)(item),\n            className: classNames.splitMenu,\n            subMenuProps: item.subMenuProps,\n            submenuIconProps: item.submenuIconProps,\n            split: true,\n            key: item.key\n        };\n        var buttonProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, (0, _utilities.getNativeProps)(itemProps, (0, _utilities.buttonProperties))), {\n            onMouseEnter: this._onItemMouseEnterIcon,\n            onMouseLeave: onItemMouseLeave ? onItemMouseLeave.bind(this, item) : undefined,\n            onMouseDown: function(ev) {\n                return onItemMouseDown ? onItemMouseDown(item, ev) : undefined;\n            },\n            onMouseMove: this._onItemMouseMoveIcon,\n            \"data-is-focusable\": false,\n            \"data-ktp-execute-target\": keytipAttributes[\"data-ktp-execute-target\"],\n            \"aria-hidden\": true\n        });\n        var itemComponentProps = item.itemProps;\n        return _react.createElement(\"button\", (0, _tslib.__assign)({}, buttonProps), _react.createElement(ChildrenRenderer, (0, _tslib.__assign)({\n            componentRef: item.componentRef,\n            item: itemProps,\n            classNames: classNames,\n            index: index,\n            hasIcons: false,\n            openSubMenu: openSubMenu,\n            dismissSubMenu: dismissSubMenu,\n            dismissMenu: dismissMenu,\n            getSubmenuTarget: this._getSubmenuTarget\n        }, itemComponentProps)));\n    };\n    ContextualMenuSplitButton1.prototype._handleTouchAndPointerEvent = function(ev) {\n        var _this = this;\n        var onTap = this.props.onTap;\n        if (onTap) onTap(ev);\n        // If we already have an existing timeout from a previous touch/pointer event\n        // cancel that timeout so we can set a new one.\n        if (this._lastTouchTimeoutId) {\n            this._async.clearTimeout(this._lastTouchTimeoutId);\n            this._lastTouchTimeoutId = undefined;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n            _this._processingTouch = false;\n            _this._lastTouchTimeoutId = undefined;\n        }, TouchIdleDelay);\n    };\n    return ContextualMenuSplitButton1;\n}((0, _contextualMenuItemWrapper.ContextualMenuItemWrapper));\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../../Utilities\":\"2F07a\",\"../ContextualMenuItem\":\"1A0Og\",\"../ContextualMenu.classNames\":\"eP2o9\",\"../../../KeytipData\":\"e8VIa\",\"../../../utilities/contextualMenu/index\":\"kuuyp\",\"../../../Divider\":\"7ZDI6\",\"./ContextualMenuItemWrapper\":\"3zwcs\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ZDI6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Divider/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Divider/index\":\"41iVJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"41iVJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _verticalDivider = require(\"./VerticalDivider\");\nparcelHelpers.exportAll(_verticalDivider, exports);\n\n},{\"./VerticalDivider\":\"kGgmh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kGgmh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VerticalDivider\", ()=>VerticalDivider);\nvar _verticalDividerStyles = require(\"./VerticalDivider.styles\");\nvar _verticalDividerBase = require(\"./VerticalDivider.base\");\nvar _utilities = require(\"../../Utilities\");\nvar VerticalDivider = (0, _utilities.styled)((0, _verticalDividerBase.VerticalDividerBase), (0, _verticalDividerStyles.getStyles), undefined, {\n    scope: \"VerticalDivider\"\n});\n\n},{\"./VerticalDivider.styles\":\"9bnRs\",\"./VerticalDivider.base\":\"9KEi9\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9bnRs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar getStyles = function(props) {\n    // eslint-disable-next-line deprecation/deprecation\n    var theme = props.theme, getClassNames = props.getClassNames, className = props.className;\n    if (!theme) throw new Error(\"Theme is undefined or null.\");\n    if (getClassNames) {\n        var names = getClassNames(theme);\n        return {\n            wrapper: [\n                names.wrapper\n            ],\n            divider: [\n                names.divider\n            ]\n        };\n    }\n    return {\n        wrapper: [\n            {\n                display: \"inline-flex\",\n                height: \"100%\",\n                alignItems: \"center\"\n            },\n            className, \n        ],\n        divider: [\n            {\n                width: 1,\n                height: \"100%\",\n                backgroundColor: theme.palette.neutralTertiaryAlt\n            }, \n        ]\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9KEi9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VerticalDividerBase\", ()=>VerticalDividerBase);\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar VerticalDividerBase = function(props) {\n    // eslint-disable-next-line deprecation/deprecation\n    var styles = props.styles, theme = props.theme, deprecatedGetClassNames = props.getClassNames, className = props.className;\n    var classNames = getClassNames(styles, {\n        theme: theme,\n        getClassNames: deprecatedGetClassNames,\n        className: className\n    });\n    return _react.createElement(\"span\", {\n        className: classNames.wrapper\n    }, _react.createElement(\"span\", {\n        className: classNames.divider\n    }));\n};\nVerticalDividerBase.displayName = \"VerticalDividerBase\";\n\n},{\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jbJON\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar _contextualMenuCnstyles = require(\"./ContextualMenu.cnstyles\");\nvar GlobalClassNames = {\n    root: \"ms-ContextualMenu\",\n    container: \"ms-ContextualMenu-container\",\n    list: \"ms-ContextualMenu-list\",\n    header: \"ms-ContextualMenu-header\",\n    title: \"ms-ContextualMenu-title\",\n    isopen: \"is-open\"\n};\nvar getStyles = function(props) {\n    var className = props.className, theme = props.theme;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    var fonts = theme.fonts, semanticColors = theme.semanticColors, effects = theme.effects;\n    return {\n        root: [\n            theme.fonts.medium,\n            classNames.root,\n            classNames.isopen,\n            {\n                backgroundColor: semanticColors.menuBackground,\n                minWidth: \"180px\"\n            },\n            className, \n        ],\n        container: [\n            classNames.container,\n            {\n                selectors: {\n                    \":focus\": {\n                        outline: 0\n                    }\n                }\n            }, \n        ],\n        list: [\n            classNames.list,\n            classNames.isopen,\n            {\n                listStyleType: \"none\",\n                margin: \"0\",\n                padding: \"0\"\n            }, \n        ],\n        header: [\n            classNames.header,\n            fonts.small,\n            {\n                fontWeight: (0, _styling.FontWeights).semibold,\n                color: semanticColors.menuHeader,\n                background: \"none\",\n                backgroundColor: \"transparent\",\n                border: \"none\",\n                height: (0, _contextualMenuCnstyles.CONTEXTUAL_MENU_ITEM_HEIGHT),\n                lineHeight: (0, _contextualMenuCnstyles.CONTEXTUAL_MENU_ITEM_HEIGHT),\n                cursor: \"default\",\n                padding: \"0px 6px\",\n                userSelect: \"none\",\n                textAlign: \"left\"\n            }, \n        ],\n        title: [\n            classNames.title,\n            {\n                fontSize: fonts.mediumPlus.fontSize,\n                paddingRight: \"14px\",\n                paddingLeft: \"14px\",\n                paddingBottom: \"5px\",\n                paddingTop: \"5px\",\n                backgroundColor: semanticColors.menuItemBackgroundPressed\n            }, \n        ],\n        subComponentStyles: {\n            callout: {\n                root: {\n                    boxShadow: effects.elevation8\n                }\n            },\n            menuItem: {}\n        }\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"./ContextualMenu.cnstyles\":\"5SyP0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kofVG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ButtonGlobalClassNames\", ()=>ButtonGlobalClassNames);\nparcelHelpers.export(exports, \"getBaseButtonClassNames\", ()=>getBaseButtonClassNames);\nvar _utilities = require(\"../../Utilities\");\nvar _styling = require(\"../../Styling\");\nvar ButtonGlobalClassNames = {\n    msButton: \"ms-Button\",\n    msButtonHasMenu: \"ms-Button--hasMenu\",\n    msButtonIcon: \"ms-Button-icon\",\n    msButtonMenuIcon: \"ms-Button-menuIcon\",\n    msButtonLabel: \"ms-Button-label\",\n    msButtonDescription: \"ms-Button-description\",\n    msButtonScreenReaderText: \"ms-Button-screenReaderText\",\n    msButtonFlexContainer: \"ms-Button-flexContainer\",\n    msButtonTextContainer: \"ms-Button-textContainer\"\n};\nvar getBaseButtonClassNames = (0, _utilities.memoizeFunction)(function(theme, styles, className, variantClassName, iconClassName, menuIconClassName, disabled, hasMenu, checked, expanded, isSplit) {\n    var _a, _b;\n    var classNames = (0, _styling.getGlobalClassNames)(ButtonGlobalClassNames, theme || {});\n    var isExpanded = expanded && !isSplit;\n    return (0, _styling.mergeStyleSets)({\n        root: [\n            classNames.msButton,\n            styles.root,\n            variantClassName,\n            checked && [\n                \"is-checked\",\n                styles.rootChecked\n            ],\n            isExpanded && [\n                \"is-expanded\",\n                styles.rootExpanded,\n                {\n                    selectors: (_a = {}, _a[\":hover .\" + classNames.msButtonIcon] = styles.iconExpandedHovered, // menuIcon falls back to rootExpandedHovered to support original behavior\n                    _a[\":hover .\" + classNames.msButtonMenuIcon] = styles.menuIconExpandedHovered || styles.rootExpandedHovered, _a[\":hover\"] = styles.rootExpandedHovered, _a)\n                }, \n            ],\n            hasMenu && [\n                ButtonGlobalClassNames.msButtonHasMenu,\n                styles.rootHasMenu\n            ],\n            disabled && [\n                \"is-disabled\",\n                styles.rootDisabled\n            ],\n            !disabled && !isExpanded && !checked && {\n                selectors: (_b = {\n                    \":hover\": styles.rootHovered\n                }, _b[\":hover .\" + classNames.msButtonLabel] = styles.labelHovered, _b[\":hover .\" + classNames.msButtonIcon] = styles.iconHovered, _b[\":hover .\" + classNames.msButtonDescription] = styles.descriptionHovered, _b[\":hover .\" + classNames.msButtonMenuIcon] = styles.menuIconHovered, _b[\":focus\"] = styles.rootFocused, _b[\":active\"] = styles.rootPressed, _b[\":active .\" + classNames.msButtonIcon] = styles.iconPressed, _b[\":active .\" + classNames.msButtonDescription] = styles.descriptionPressed, _b[\":active .\" + classNames.msButtonMenuIcon] = styles.menuIconPressed, _b)\n            },\n            disabled && checked && [\n                styles.rootCheckedDisabled\n            ],\n            !disabled && checked && {\n                selectors: {\n                    \":hover\": styles.rootCheckedHovered,\n                    \":active\": styles.rootCheckedPressed\n                }\n            },\n            className, \n        ],\n        flexContainer: [\n            classNames.msButtonFlexContainer,\n            styles.flexContainer\n        ],\n        textContainer: [\n            classNames.msButtonTextContainer,\n            styles.textContainer\n        ],\n        icon: [\n            classNames.msButtonIcon,\n            iconClassName,\n            styles.icon,\n            isExpanded && styles.iconExpanded,\n            checked && styles.iconChecked,\n            disabled && styles.iconDisabled, \n        ],\n        label: [\n            classNames.msButtonLabel,\n            styles.label,\n            checked && styles.labelChecked,\n            disabled && styles.labelDisabled\n        ],\n        menuIcon: [\n            classNames.msButtonMenuIcon,\n            menuIconClassName,\n            styles.menuIcon,\n            checked && styles.menuIconChecked,\n            disabled && !isSplit && styles.menuIconDisabled,\n            !disabled && !isExpanded && !checked && {\n                selectors: {\n                    \":hover\": styles.menuIconHovered,\n                    \":active\": styles.menuIconPressed\n                }\n            },\n            isExpanded && [\n                \"is-expanded\",\n                styles.menuIconExpanded\n            ], \n        ],\n        description: [\n            classNames.msButtonDescription,\n            styles.description,\n            checked && styles.descriptionChecked,\n            disabled && styles.descriptionDisabled, \n        ],\n        screenReaderText: [\n            classNames.msButtonScreenReaderText,\n            styles.screenReaderText\n        ]\n    });\n});\n\n},{\"../../Utilities\":\"2F07a\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8kuHQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSplitButtonClassNames\", ()=>getSplitButtonClassNames);\nvar _utilities = require(\"../../../Utilities\");\nvar _styling = require(\"../../../Styling\");\nvar getSplitButtonClassNames = (0, _utilities.memoizeFunction)(function(styles, disabled, expanded, checked, primaryDisabled) {\n    return {\n        root: (0, _styling.mergeStyles)(styles.splitButtonMenuButton, expanded && [\n            styles.splitButtonMenuButtonExpanded\n        ], disabled && [\n            styles.splitButtonMenuButtonDisabled\n        ], checked && !disabled && [\n            styles.splitButtonMenuButtonChecked\n        ], primaryDisabled && !disabled && [\n            {\n                selectors: {\n                    \":focus\": styles.splitButtonMenuFocused\n                }\n            }, \n        ]),\n        splitButtonContainer: (0, _styling.mergeStyles)(styles.splitButtonContainer, !disabled && checked && [\n            styles.splitButtonContainerChecked,\n            {\n                selectors: {\n                    \":hover\": styles.splitButtonContainerCheckedHovered\n                }\n            }, \n        ], !disabled && !checked && [\n            {\n                selectors: {\n                    \":hover\": styles.splitButtonContainerHovered,\n                    \":focus\": styles.splitButtonContainerFocused\n                }\n            }, \n        ], disabled && styles.splitButtonContainerDisabled),\n        icon: (0, _styling.mergeStyles)(styles.splitButtonMenuIcon, disabled && styles.splitButtonMenuIconDisabled, !disabled && primaryDisabled && styles.splitButtonMenuIcon),\n        flexContainer: (0, _styling.mergeStyles)(styles.splitButtonFlexContainer),\n        divider: (0, _styling.mergeStyles)(styles.splitButtonDivider, (primaryDisabled || disabled) && styles.splitButtonDividerDisabled)\n    };\n});\n\n},{\"../../../Utilities\":\"2F07a\",\"../../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dg4FU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ElementType\", ()=>ElementType);\nparcelHelpers.export(exports, \"ButtonType\", ()=>ButtonType);\nvar ElementType;\n(function(ElementType1) {\n    /** <button> element. */ ElementType1[ElementType1[\"button\"] = 0] = \"button\";\n    /** <a> element. */ ElementType1[ElementType1[\"anchor\"] = 1] = \"anchor\";\n})(ElementType || (ElementType = {}));\nvar ButtonType;\n(function(ButtonType1) {\n    ButtonType1[ButtonType1[\"normal\"] = 0] = \"normal\";\n    ButtonType1[ButtonType1[\"primary\"] = 1] = \"primary\";\n    ButtonType1[ButtonType1[\"hero\"] = 2] = \"hero\";\n    ButtonType1[ButtonType1[\"compound\"] = 3] = \"compound\";\n    ButtonType1[ButtonType1[\"command\"] = 4] = \"command\";\n    ButtonType1[ButtonType1[\"icon\"] = 5] = \"icon\";\n    ButtonType1[ButtonType1[\"default\"] = 6] = \"default\";\n})(ButtonType || (ButtonType = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fbC88\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Button\", ()=>Button);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _buttonTypes = require(\"./Button.types\");\nvar _defaultButton = require(\"./DefaultButton/DefaultButton\");\nvar _actionButton = require(\"./ActionButton/ActionButton\");\nvar _compoundButton = require(\"./CompoundButton/CompoundButton\");\nvar _iconButton = require(\"./IconButton/IconButton\");\nvar _primaryButton = require(\"./PrimaryButton/PrimaryButton\");\n/**\n * This class is deprecated. Use the individual *Button components instead.\n * @deprecated Use the individual *Button components instead.\n * {@docCategory Button}\n */ var Button = /** @class */ function(_super) {\n    (0, _tslib.__extends)(Button1, _super);\n    function Button1(props) {\n        var _this = _super.call(this, props) || this;\n        (0, _utilities.warn)(\"The Button component has been deprecated. Use specific variants instead. (PrimaryButton, DefaultButton, IconButton, ActionButton, etc.)\");\n        return _this;\n    }\n    Button1.prototype.render = function() {\n        var props = this.props;\n        // eslint-disable-next-line deprecation/deprecation\n        switch(props.buttonType){\n            case (0, _buttonTypes.ButtonType).command:\n                return _react.createElement((0, _actionButton.ActionButton), (0, _tslib.__assign)({}, props));\n            case (0, _buttonTypes.ButtonType).compound:\n                return _react.createElement((0, _compoundButton.CompoundButton), (0, _tslib.__assign)({}, props));\n            case (0, _buttonTypes.ButtonType).icon:\n                return _react.createElement((0, _iconButton.IconButton), (0, _tslib.__assign)({}, props));\n            case (0, _buttonTypes.ButtonType).primary:\n                return _react.createElement((0, _primaryButton.PrimaryButton), (0, _tslib.__assign)({}, props));\n            default:\n                return _react.createElement((0, _defaultButton.DefaultButton), (0, _tslib.__assign)({}, props));\n        }\n    };\n    return Button1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"./Button.types\":\"dg4FU\",\"./DefaultButton/DefaultButton\":\"2lgOO\",\"./ActionButton/ActionButton\":\"l59h4\",\"./CompoundButton/CompoundButton\":\"j4YIe\",\"./IconButton/IconButton\":\"lczvw\",\"./PrimaryButton/PrimaryButton\":\"82w7g\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2lgOO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DefaultButton\", ()=>DefaultButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _baseButton = require(\"../BaseButton\");\nvar _utilities = require(\"../../../Utilities\");\nvar _defaultButtonStyles = require(\"./DefaultButton.styles\");\n/**\n * {@docCategory Button}\n */ var DefaultButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(DefaultButton1, _super);\n    function DefaultButton1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    DefaultButton1.prototype.render = function() {\n        var _a = this.props, _b = _a.primary, primary = _b === void 0 ? false : _b, styles = _a.styles, theme = _a.theme;\n        return _react.createElement((0, _baseButton.BaseButton), (0, _tslib.__assign)({}, this.props, {\n            variantClassName: primary ? \"ms-Button--primary\" : \"ms-Button--default\",\n            styles: (0, _defaultButtonStyles.getStyles)(theme, styles, primary),\n            onRenderDescription: (0, _utilities.nullRender)\n        }));\n    };\n    DefaultButton1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"DefaultButton\", [\n            \"theme\",\n            \"styles\"\n        ], true)\n    ], DefaultButton1);\n    return DefaultButton1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../BaseButton\":\"ggNpu\",\"../../../Utilities\":\"2F07a\",\"./DefaultButton.styles\":\"dblRC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dblRC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../../Styling\");\nvar _utilities = require(\"../../../Utilities\");\nvar _baseButtonStyles = require(\"../BaseButton.styles\");\nvar _splitButtonStyles = require(\"../SplitButton/SplitButton.styles\");\nvar _buttonThemes = require(\"../ButtonThemes\");\nvar DEFAULT_BUTTON_HEIGHT = \"32px\";\nvar DEFAULT_BUTTON_MIN_WIDTH = \"80px\";\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles, primary) {\n    var baseButtonStyles = (0, _baseButtonStyles.getStyles)(theme);\n    var splitButtonStyles = (0, _splitButtonStyles.getStyles)(theme);\n    var defaultButtonStyles = {\n        root: {\n            minWidth: DEFAULT_BUTTON_MIN_WIDTH,\n            height: DEFAULT_BUTTON_HEIGHT\n        },\n        label: {\n            fontWeight: (0, _styling.FontWeights).semibold\n        }\n    };\n    return (0, _styling.concatStyleSets)(baseButtonStyles, defaultButtonStyles, primary ? (0, _buttonThemes.primaryStyles)(theme) : (0, _buttonThemes.standardStyles)(theme), splitButtonStyles, customStyles);\n});\n\n},{\"../../../Styling\":\"7JwBd\",\"../../../Utilities\":\"2F07a\",\"../BaseButton.styles\":\"gSlGS\",\"../SplitButton/SplitButton.styles\":\"cLPEJ\",\"../ButtonThemes\":\"3uAuR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gSlGS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _utilities = require(\"../../Utilities\");\nvar _styling = require(\"../../Styling\");\nvar noOutline = {\n    outline: 0\n};\nvar iconStyle = function(fontSize) {\n    return {\n        fontSize: fontSize,\n        margin: \"0 4px\",\n        height: \"16px\",\n        lineHeight: \"16px\",\n        textAlign: \"center\",\n        flexShrink: 0\n    };\n};\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme) {\n    var _a, _b;\n    var semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var border = semanticColors.buttonBorder;\n    var disabledBackground = semanticColors.disabledBackground;\n    var disabledText = semanticColors.disabledText;\n    var buttonHighContrastFocus = {\n        left: -2,\n        top: -2,\n        bottom: -2,\n        right: -2,\n        outlineColor: \"ButtonText\"\n    };\n    return {\n        root: [\n            (0, _styling.getFocusStyle)(theme, {\n                inset: 1,\n                highContrastStyle: buttonHighContrastFocus,\n                borderColor: \"transparent\"\n            }),\n            theme.fonts.medium,\n            {\n                boxSizing: \"border-box\",\n                border: \"1px solid \" + border,\n                userSelect: \"none\",\n                display: \"inline-block\",\n                textDecoration: \"none\",\n                textAlign: \"center\",\n                cursor: \"pointer\",\n                padding: \"0 16px\",\n                borderRadius: effects.roundedCorner2,\n                selectors: {\n                    // IE11 workaround for preventing shift of child elements of a button when active.\n                    \":active > span\": {\n                        position: \"relative\",\n                        left: 0,\n                        top: 0\n                    }\n                }\n            }, \n        ],\n        rootDisabled: [\n            (0, _styling.getFocusStyle)(theme, {\n                inset: 1,\n                highContrastStyle: buttonHighContrastFocus,\n                borderColor: \"transparent\"\n            }),\n            {\n                backgroundColor: disabledBackground,\n                borderColor: disabledBackground,\n                color: disabledText,\n                cursor: \"default\",\n                selectors: {\n                    \":hover\": noOutline,\n                    \":focus\": noOutline\n                }\n            }, \n        ],\n        iconDisabled: {\n            color: disabledText,\n            selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                color: \"GrayText\"\n            }, _a)\n        },\n        menuIconDisabled: {\n            color: disabledText,\n            selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                color: \"GrayText\"\n            }, _b)\n        },\n        flexContainer: {\n            display: \"flex\",\n            height: \"100%\",\n            flexWrap: \"nowrap\",\n            justifyContent: \"center\",\n            alignItems: \"center\"\n        },\n        description: {\n            display: \"block\"\n        },\n        textContainer: {\n            flexGrow: 1,\n            display: \"block\"\n        },\n        icon: iconStyle(fonts.mediumPlus.fontSize),\n        menuIcon: iconStyle(fonts.small.fontSize),\n        label: {\n            margin: \"0 4px\",\n            lineHeight: \"100%\",\n            display: \"block\"\n        },\n        screenReaderText: (0, _styling.hiddenContentStyle)\n    };\n});\n\n},{\"../../Utilities\":\"2F07a\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cLPEJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../../Styling\");\nvar _utilities = require(\"../../../Utilities\");\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;\n    var effects = theme.effects, palette = theme.palette, semanticColors = theme.semanticColors;\n    var buttonHighContrastFocus = {\n        left: -2,\n        top: -2,\n        bottom: -2,\n        right: -2,\n        border: \"none\"\n    };\n    var splitButtonDividerBaseStyles = {\n        position: \"absolute\",\n        width: 1,\n        right: 31,\n        top: 8,\n        bottom: 8\n    };\n    var splitButtonStyles = {\n        splitButtonContainer: [\n            (0, _styling.getFocusStyle)(theme, {\n                highContrastStyle: buttonHighContrastFocus,\n                inset: 2\n            }),\n            {\n                display: \"inline-flex\",\n                selectors: {\n                    \".ms-Button--default\": {\n                        borderTopRightRadius: \"0\",\n                        borderBottomRightRadius: \"0\",\n                        borderRight: \"none\"\n                    },\n                    \".ms-Button--primary\": {\n                        borderTopRightRadius: \"0\",\n                        borderBottomRightRadius: \"0\",\n                        border: \"none\",\n                        selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                            color: \"WindowText\",\n                            backgroundColor: \"Window\",\n                            border: \"1px solid WindowText\",\n                            borderRightWidth: \"0\"\n                        }, (0, _styling.getHighContrastNoAdjustStyle)()), _a)\n                    },\n                    \".ms-Button--primary + .ms-Button\": {\n                        border: \"none\",\n                        selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                            border: \"1px solid WindowText\",\n                            borderLeftWidth: \"0\"\n                        }, _b)\n                    }\n                }\n            }, \n        ],\n        splitButtonContainerHovered: {\n            selectors: {\n                \".ms-Button--primary\": {\n                    selectors: (_c = {}, _c[0, _styling.HighContrastSelector] = {\n                        color: \"Window\",\n                        backgroundColor: \"Highlight\"\n                    }, _c)\n                },\n                \".ms-Button.is-disabled\": {\n                    color: semanticColors.buttonTextDisabled,\n                    selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = {\n                        color: \"GrayText\",\n                        borderColor: \"GrayText\",\n                        backgroundColor: \"Window\"\n                    }, _d)\n                }\n            }\n        },\n        splitButtonContainerChecked: {\n            selectors: {\n                \".ms-Button--primary\": {\n                    selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                        color: \"Window\",\n                        backgroundColor: \"WindowText\"\n                    }, (0, _styling.getHighContrastNoAdjustStyle)()), _e)\n                }\n            }\n        },\n        splitButtonContainerCheckedHovered: {\n            selectors: {\n                \".ms-Button--primary\": {\n                    selectors: (_f = {}, _f[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                        color: \"Window\",\n                        backgroundColor: \"WindowText\"\n                    }, (0, _styling.getHighContrastNoAdjustStyle)()), _f)\n                }\n            }\n        },\n        splitButtonContainerFocused: {\n            outline: \"none!important\"\n        },\n        splitButtonMenuButton: (_g = {\n            padding: 6,\n            height: \"auto\",\n            boxSizing: \"border-box\",\n            borderRadius: 0,\n            borderTopRightRadius: effects.roundedCorner2,\n            borderBottomRightRadius: effects.roundedCorner2,\n            border: \"1px solid \" + palette.neutralSecondaryAlt,\n            borderLeft: \"none\",\n            outline: \"transparent\",\n            userSelect: \"none\",\n            display: \"inline-block\",\n            textDecoration: \"none\",\n            textAlign: \"center\",\n            cursor: \"pointer\",\n            verticalAlign: \"top\",\n            width: 32,\n            marginLeft: -1,\n            marginTop: 0,\n            marginRight: 0,\n            marginBottom: 0\n        }, _g[0, _styling.HighContrastSelector] = {\n            \".ms-Button-menuIcon\": {\n                color: \"WindowText\"\n            }\n        }, _g),\n        splitButtonDivider: (0, _tslib.__assign)((0, _tslib.__assign)({}, splitButtonDividerBaseStyles), {\n            selectors: (_h = {}, _h[0, _styling.HighContrastSelector] = {\n                backgroundColor: \"WindowText\"\n            }, _h)\n        }),\n        splitButtonDividerDisabled: (0, _tslib.__assign)((0, _tslib.__assign)({}, splitButtonDividerBaseStyles), {\n            selectors: (_j = {}, _j[0, _styling.HighContrastSelector] = {\n                backgroundColor: \"GrayText\"\n            }, _j)\n        }),\n        splitButtonMenuButtonDisabled: {\n            pointerEvents: \"none\",\n            border: \"none\",\n            selectors: (_k = {\n                \":hover\": {\n                    cursor: \"default\"\n                },\n                \".ms-Button--primary\": {\n                    selectors: (_l = {}, _l[0, _styling.HighContrastSelector] = {\n                        color: \"GrayText\",\n                        borderColor: \"GrayText\",\n                        backgroundColor: \"Window\"\n                    }, _l)\n                },\n                \".ms-Button-menuIcon\": {\n                    selectors: (_m = {}, _m[0, _styling.HighContrastSelector] = {\n                        color: \"GrayText\"\n                    }, _m)\n                }\n            }, _k[0, _styling.HighContrastSelector] = {\n                color: \"GrayText\",\n                border: \"1px solid GrayText\",\n                backgroundColor: \"Window\"\n            }, _k)\n        },\n        splitButtonFlexContainer: {\n            display: \"flex\",\n            height: \"100%\",\n            flexWrap: \"nowrap\",\n            justifyContent: \"center\",\n            alignItems: \"center\"\n        },\n        splitButtonContainerDisabled: {\n            outline: \"none\",\n            border: \"none\",\n            selectors: (_o = {}, _o[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: \"GrayText\",\n                borderColor: \"GrayText\",\n                backgroundColor: \"Window\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _o)\n        },\n        splitButtonMenuFocused: (0, _tslib.__assign)({}, (0, _styling.getFocusStyle)(theme, {\n            highContrastStyle: buttonHighContrastFocus,\n            inset: 2\n        }))\n    };\n    return (0, _styling.concatStyleSets)(splitButtonStyles, customStyles);\n});\n\n},{\"tslib\":\"01Tx1\",\"../../../Styling\":\"7JwBd\",\"../../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3uAuR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"standardStyles\", ()=>standardStyles);\nparcelHelpers.export(exports, \"primaryStyles\", ()=>primaryStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"../../Utilities\");\nvar splitButtonDividerBaseStyles = function() {\n    return {\n        position: \"absolute\",\n        width: 1,\n        right: 31,\n        top: 8,\n        bottom: 8\n    };\n};\nfunction standardStyles(theme) {\n    var _a, _b, _c, _d, _e;\n    var s = theme.semanticColors, p = theme.palette;\n    var buttonBackground = s.buttonBackground;\n    var buttonBackgroundPressed = s.buttonBackgroundPressed;\n    var buttonBackgroundHovered = s.buttonBackgroundHovered;\n    var buttonBackgroundDisabled = s.buttonBackgroundDisabled;\n    var buttonText = s.buttonText;\n    var buttonTextHovered = s.buttonTextHovered;\n    var buttonTextDisabled = s.buttonTextDisabled;\n    var buttonTextChecked = s.buttonTextChecked;\n    var buttonTextCheckedHovered = s.buttonTextCheckedHovered;\n    return {\n        root: {\n            backgroundColor: buttonBackground,\n            color: buttonText\n        },\n        rootHovered: {\n            backgroundColor: buttonBackgroundHovered,\n            color: buttonTextHovered,\n            selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                borderColor: \"Highlight\",\n                color: \"Highlight\"\n            }, _a)\n        },\n        rootPressed: {\n            backgroundColor: buttonBackgroundPressed,\n            color: buttonTextChecked\n        },\n        rootExpanded: {\n            backgroundColor: buttonBackgroundPressed,\n            color: buttonTextChecked\n        },\n        rootChecked: {\n            backgroundColor: buttonBackgroundPressed,\n            color: buttonTextChecked\n        },\n        rootCheckedHovered: {\n            backgroundColor: buttonBackgroundPressed,\n            color: buttonTextCheckedHovered\n        },\n        rootDisabled: {\n            color: buttonTextDisabled,\n            backgroundColor: buttonBackgroundDisabled,\n            selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                color: \"GrayText\",\n                borderColor: \"GrayText\",\n                backgroundColor: \"Window\"\n            }, _b)\n        },\n        // Split button styles\n        splitButtonContainer: {\n            selectors: (_c = {}, _c[0, _styling.HighContrastSelector] = {\n                border: \"none\"\n            }, _c)\n        },\n        splitButtonMenuButton: {\n            color: p.white,\n            backgroundColor: \"transparent\",\n            selectors: {\n                \":hover\": {\n                    backgroundColor: p.neutralLight,\n                    selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = {\n                        color: \"Highlight\"\n                    }, _d)\n                }\n            }\n        },\n        splitButtonMenuButtonDisabled: {\n            backgroundColor: s.buttonBackgroundDisabled,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: s.buttonBackgroundDisabled\n                }\n            }\n        },\n        splitButtonDivider: (0, _tslib.__assign)((0, _tslib.__assign)({}, splitButtonDividerBaseStyles()), {\n            backgroundColor: p.neutralTertiaryAlt,\n            selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = {\n                backgroundColor: \"WindowText\"\n            }, _e)\n        }),\n        splitButtonDividerDisabled: {\n            backgroundColor: theme.palette.neutralTertiaryAlt\n        },\n        splitButtonMenuButtonChecked: {\n            backgroundColor: p.neutralQuaternaryAlt,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: p.neutralQuaternaryAlt\n                }\n            }\n        },\n        splitButtonMenuButtonExpanded: {\n            backgroundColor: p.neutralQuaternaryAlt,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: p.neutralQuaternaryAlt\n                }\n            }\n        },\n        splitButtonMenuIcon: {\n            color: s.buttonText\n        },\n        splitButtonMenuIconDisabled: {\n            color: s.buttonTextDisabled\n        }\n    };\n}\nfunction primaryStyles(theme) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n    var p = theme.palette, s = theme.semanticColors;\n    return {\n        root: {\n            backgroundColor: s.primaryButtonBackground,\n            border: \"1px solid \" + s.primaryButtonBackground,\n            color: s.primaryButtonText,\n            selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: \"Window\",\n                backgroundColor: \"WindowText\",\n                borderColor: \"WindowText\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _a[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus\"] = {\n                selectors: {\n                    \":after\": {\n                        border: \"none\",\n                        outlineColor: p.white\n                    }\n                }\n            }, _a)\n        },\n        rootHovered: {\n            backgroundColor: s.primaryButtonBackgroundHovered,\n            border: \"1px solid \" + s.primaryButtonBackgroundHovered,\n            color: s.primaryButtonTextHovered,\n            selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                color: \"Window\",\n                backgroundColor: \"Highlight\",\n                borderColor: \"Highlight\"\n            }, _b)\n        },\n        rootPressed: {\n            backgroundColor: s.primaryButtonBackgroundPressed,\n            border: \"1px solid \" + s.primaryButtonBackgroundPressed,\n            color: s.primaryButtonTextPressed,\n            selectors: (_c = {}, _c[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: \"Window\",\n                backgroundColor: \"WindowText\",\n                borderColor: \"WindowText\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _c)\n        },\n        rootExpanded: {\n            backgroundColor: s.primaryButtonBackgroundPressed,\n            color: s.primaryButtonTextPressed\n        },\n        rootChecked: {\n            backgroundColor: s.primaryButtonBackgroundPressed,\n            color: s.primaryButtonTextPressed\n        },\n        rootCheckedHovered: {\n            backgroundColor: s.primaryButtonBackgroundPressed,\n            color: s.primaryButtonTextPressed\n        },\n        rootDisabled: {\n            color: s.primaryButtonTextDisabled,\n            backgroundColor: s.primaryButtonBackgroundDisabled,\n            selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = {\n                color: \"GrayText\",\n                borderColor: \"GrayText\",\n                backgroundColor: \"Window\"\n            }, _d)\n        },\n        // Split button styles\n        splitButtonContainer: {\n            selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = {\n                border: \"none\"\n            }, _e)\n        },\n        splitButtonDivider: (0, _tslib.__assign)((0, _tslib.__assign)({}, splitButtonDividerBaseStyles()), {\n            backgroundColor: p.white,\n            selectors: (_f = {}, _f[0, _styling.HighContrastSelector] = {\n                backgroundColor: \"Window\"\n            }, _f)\n        }),\n        splitButtonMenuButton: {\n            backgroundColor: s.primaryButtonBackground,\n            color: s.primaryButtonText,\n            selectors: (_g = {}, _g[0, _styling.HighContrastSelector] = {\n                backgroundColor: \"WindowText\"\n            }, _g[\":hover\"] = {\n                backgroundColor: s.primaryButtonBackgroundHovered,\n                selectors: (_h = {}, _h[0, _styling.HighContrastSelector] = {\n                    color: \"Highlight\"\n                }, _h)\n            }, _g)\n        },\n        splitButtonMenuButtonDisabled: {\n            backgroundColor: s.primaryButtonBackgroundDisabled,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: s.primaryButtonBackgroundDisabled\n                }\n            }\n        },\n        splitButtonMenuButtonChecked: {\n            backgroundColor: s.primaryButtonBackgroundPressed,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: s.primaryButtonBackgroundPressed\n                }\n            }\n        },\n        splitButtonMenuButtonExpanded: {\n            backgroundColor: s.primaryButtonBackgroundPressed,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: s.primaryButtonBackgroundPressed\n                }\n            }\n        },\n        splitButtonMenuIcon: {\n            color: s.primaryButtonText\n        },\n        splitButtonMenuIconDisabled: {\n            color: p.neutralTertiary,\n            selectors: (_j = {}, _j[0, _styling.HighContrastSelector] = {\n                color: \"GrayText\"\n            }, _j)\n        }\n    };\n}\n\n},{\"tslib\":\"01Tx1\",\"../../Styling\":\"7JwBd\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l59h4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ActionButton\", ()=>ActionButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _baseButton = require(\"../BaseButton\");\nvar _utilities = require(\"../../../Utilities\");\nvar _actionButtonStyles = require(\"./ActionButton.styles\");\n/**\n * {@docCategory Button}\n */ var ActionButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ActionButton1, _super);\n    function ActionButton1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    ActionButton1.prototype.render = function() {\n        var _a = this.props, styles = _a.styles, theme = _a.theme;\n        return _react.createElement((0, _baseButton.BaseButton), (0, _tslib.__assign)({}, this.props, {\n            variantClassName: \"ms-Button--action ms-Button--command\",\n            styles: (0, _actionButtonStyles.getStyles)(theme, styles),\n            onRenderDescription: (0, _utilities.nullRender)\n        }));\n    };\n    ActionButton1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"ActionButton\", [\n            \"theme\",\n            \"styles\"\n        ], true)\n    ], ActionButton1);\n    return ActionButton1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../BaseButton\":\"ggNpu\",\"../../../Utilities\":\"2F07a\",\"./ActionButton.styles\":\"ijGcL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ijGcL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../../Styling\");\nvar _utilities = require(\"../../../Utilities\");\nvar _baseButtonStyles = require(\"../BaseButton.styles\");\nvar DEFAULT_BUTTON_HEIGHT = \"40px\";\nvar DEFAULT_PADDING = \"0 4px\";\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles) {\n    var _a;\n    var baseButtonStyles = (0, _baseButtonStyles.getStyles)(theme);\n    var actionButtonStyles = {\n        root: {\n            padding: DEFAULT_PADDING,\n            height: DEFAULT_BUTTON_HEIGHT,\n            color: theme.palette.neutralPrimary,\n            backgroundColor: \"transparent\",\n            border: \"1px solid transparent\"\n        },\n        rootHovered: {\n            color: theme.palette.themePrimary,\n            selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                borderColor: \"Highlight\",\n                color: \"Highlight\"\n            }, _a)\n        },\n        iconHovered: {\n            color: theme.palette.themePrimary\n        },\n        rootPressed: {\n            color: theme.palette.black\n        },\n        rootExpanded: {\n            color: theme.palette.themePrimary\n        },\n        iconPressed: {\n            color: theme.palette.themeDarker\n        },\n        rootDisabled: {\n            color: theme.palette.neutralTertiary,\n            backgroundColor: \"transparent\",\n            borderColor: \"transparent\"\n        },\n        rootChecked: {\n            color: theme.palette.black\n        },\n        iconChecked: {\n            color: theme.palette.themeDarker\n        },\n        flexContainer: {\n            justifyContent: \"flex-start\"\n        },\n        icon: {\n            color: theme.palette.themeDarkAlt\n        },\n        iconDisabled: {\n            color: \"inherit\"\n        },\n        menuIcon: {\n            color: theme.palette.neutralSecondary\n        },\n        textContainer: {\n            flexGrow: 0\n        }\n    };\n    return (0, _styling.concatStyleSets)(baseButtonStyles, actionButtonStyles, customStyles);\n});\n\n},{\"../../../Styling\":\"7JwBd\",\"../../../Utilities\":\"2F07a\",\"../BaseButton.styles\":\"gSlGS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j4YIe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CompoundButton\", ()=>CompoundButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _baseButton = require(\"../BaseButton\");\nvar _utilities = require(\"../../../Utilities\");\nvar _compoundButtonStyles = require(\"./CompoundButton.styles\");\n/**\n * {@docCategory Button}\n */ var CompoundButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(CompoundButton1, _super);\n    function CompoundButton1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    CompoundButton1.prototype.render = function() {\n        var _a = this.props, _b = _a.primary, primary = _b === void 0 ? false : _b, styles = _a.styles, theme = _a.theme;\n        return _react.createElement((0, _baseButton.BaseButton), (0, _tslib.__assign)({}, this.props, {\n            variantClassName: primary ? \"ms-Button--compoundPrimary\" : \"ms-Button--compound\",\n            styles: (0, _compoundButtonStyles.getStyles)(theme, styles, primary)\n        }));\n    };\n    CompoundButton1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"CompoundButton\", [\n            \"theme\",\n            \"styles\"\n        ], true)\n    ], CompoundButton1);\n    return CompoundButton1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../BaseButton\":\"ggNpu\",\"../../../Utilities\":\"2F07a\",\"./CompoundButton.styles\":\"2PY69\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2PY69\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../../Styling\");\nvar _utilities = require(\"../../../Utilities\");\nvar _baseButtonStyles = require(\"../BaseButton.styles\");\nvar _splitButtonStyles = require(\"../SplitButton/SplitButton.styles\");\nvar _buttonThemes = require(\"../ButtonThemes\");\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles, primary) {\n    var _a, _b, _c, _d, _e;\n    var fonts = theme.fonts, palette = theme.palette;\n    var baseButtonStyles = (0, _baseButtonStyles.getStyles)(theme);\n    var splitButtonStyles = (0, _splitButtonStyles.getStyles)(theme);\n    var compoundButtonStyles = {\n        root: {\n            maxWidth: \"280px\",\n            minHeight: \"72px\",\n            height: \"auto\",\n            padding: \"16px 12px\"\n        },\n        flexContainer: {\n            flexDirection: \"row\",\n            alignItems: \"flex-start\",\n            minWidth: \"100%\",\n            margin: \"\"\n        },\n        textContainer: {\n            textAlign: \"left\"\n        },\n        icon: {\n            fontSize: \"2em\",\n            lineHeight: \"1em\",\n            height: \"1em\",\n            margin: \"0px 8px 0px 0px\",\n            flexBasis: \"1em\",\n            flexShrink: \"0\"\n        },\n        label: {\n            margin: \"0 0 5px\",\n            lineHeight: \"100%\",\n            fontWeight: (0, _styling.FontWeights).semibold\n        },\n        description: [\n            fonts.small,\n            {\n                lineHeight: \"100%\"\n            }, \n        ]\n    };\n    var standardCompoundTheme = {\n        description: {\n            color: palette.neutralSecondary\n        },\n        descriptionHovered: {\n            color: palette.neutralDark\n        },\n        descriptionPressed: {\n            color: \"inherit\"\n        },\n        descriptionChecked: {\n            color: \"inherit\"\n        },\n        descriptionDisabled: {\n            color: \"inherit\"\n        }\n    };\n    var primaryCompoundTheme = {\n        description: {\n            color: palette.white,\n            selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                backgroundColor: \"WindowText\",\n                color: \"Window\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _a)\n        },\n        descriptionHovered: {\n            color: palette.white,\n            selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                backgroundColor: \"Highlight\",\n                color: \"Window\"\n            }, _b)\n        },\n        descriptionPressed: {\n            color: \"inherit\",\n            selectors: (_c = {}, _c[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: \"Window\",\n                backgroundColor: \"WindowText\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _c)\n        },\n        descriptionChecked: {\n            color: \"inherit\",\n            selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: \"Window\",\n                backgroundColor: \"WindowText\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _d)\n        },\n        descriptionDisabled: {\n            color: \"inherit\",\n            selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = {\n                color: \"inherit\"\n            }, _e)\n        }\n    };\n    return (0, _styling.concatStyleSets)(baseButtonStyles, compoundButtonStyles, primary ? (0, _buttonThemes.primaryStyles)(theme) : (0, _buttonThemes.standardStyles)(theme), primary ? primaryCompoundTheme : standardCompoundTheme, splitButtonStyles, customStyles);\n});\n\n},{\"tslib\":\"01Tx1\",\"../../../Styling\":\"7JwBd\",\"../../../Utilities\":\"2F07a\",\"../BaseButton.styles\":\"gSlGS\",\"../SplitButton/SplitButton.styles\":\"cLPEJ\",\"../ButtonThemes\":\"3uAuR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lczvw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"IconButton\", ()=>IconButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _baseButton = require(\"../BaseButton\");\nvar _utilities = require(\"../../../Utilities\");\nvar _iconButtonStyles = require(\"./IconButton.styles\");\n/**\n * {@docCategory Button}\n */ var IconButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(IconButton1, _super);\n    function IconButton1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    IconButton1.prototype.render = function() {\n        var _a = this.props, styles = _a.styles, theme = _a.theme;\n        return _react.createElement((0, _baseButton.BaseButton), (0, _tslib.__assign)({}, this.props, {\n            variantClassName: \"ms-Button--icon\",\n            styles: (0, _iconButtonStyles.getStyles)(theme, styles),\n            onRenderText: (0, _utilities.nullRender),\n            onRenderDescription: (0, _utilities.nullRender)\n        }));\n    };\n    IconButton1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"IconButton\", [\n            \"theme\",\n            \"styles\"\n        ], true)\n    ], IconButton1);\n    return IconButton1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../BaseButton\":\"ggNpu\",\"../../../Utilities\":\"2F07a\",\"./IconButton.styles\":\"bwgW4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bwgW4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../../Styling\");\nvar _utilities = require(\"../../../Utilities\");\nvar _baseButtonStyles = require(\"../BaseButton.styles\");\nvar _splitButtonStyles = require(\"../SplitButton/SplitButton.styles\");\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles) {\n    var _a;\n    var baseButtonStyles = (0, _baseButtonStyles.getStyles)(theme);\n    var splitButtonStyles = (0, _splitButtonStyles.getStyles)(theme);\n    var palette = theme.palette, semanticColors = theme.semanticColors;\n    var iconButtonStyles = {\n        root: {\n            padding: \"0 4px\",\n            width: \"32px\",\n            height: \"32px\",\n            backgroundColor: \"transparent\",\n            border: \"none\",\n            color: semanticColors.link\n        },\n        rootHovered: {\n            color: palette.themeDarkAlt,\n            backgroundColor: palette.neutralLighter,\n            selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                borderColor: \"Highlight\",\n                color: \"Highlight\"\n            }, _a)\n        },\n        rootHasMenu: {\n            width: \"auto\"\n        },\n        rootPressed: {\n            color: palette.themeDark,\n            backgroundColor: palette.neutralLight\n        },\n        rootExpanded: {\n            color: palette.themeDark,\n            backgroundColor: palette.neutralLight\n        },\n        rootChecked: {\n            color: palette.themeDark,\n            backgroundColor: palette.neutralLight\n        },\n        rootCheckedHovered: {\n            color: palette.themeDark,\n            backgroundColor: palette.neutralQuaternaryAlt\n        },\n        rootDisabled: {\n            color: palette.neutralTertiaryAlt\n        }\n    };\n    return (0, _styling.concatStyleSets)(baseButtonStyles, iconButtonStyles, splitButtonStyles, customStyles);\n});\n\n},{\"../../../Styling\":\"7JwBd\",\"../../../Utilities\":\"2F07a\",\"../BaseButton.styles\":\"gSlGS\",\"../SplitButton/SplitButton.styles\":\"cLPEJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"82w7g\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"PrimaryButton\", ()=>PrimaryButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../../Utilities\");\nvar _defaultButton = require(\"../DefaultButton/DefaultButton\");\n/**\n * {@docCategory Button}\n */ var PrimaryButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(PrimaryButton1, _super);\n    function PrimaryButton1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    PrimaryButton1.prototype.render = function() {\n        return _react.createElement((0, _defaultButton.DefaultButton), (0, _tslib.__assign)({}, this.props, {\n            primary: true,\n            onRenderDescription: (0, _utilities.nullRender)\n        }));\n    };\n    PrimaryButton1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"PrimaryButton\", [\n            \"theme\",\n            \"styles\"\n        ], true)\n    ], PrimaryButton1);\n    return PrimaryButton1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../../Utilities\":\"2F07a\",\"../DefaultButton/DefaultButton\":\"2lgOO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kxrca\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CommandBarButton\", ()=>CommandBarButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _baseButton = require(\"../BaseButton\");\nvar _utilities = require(\"../../../Utilities\");\nvar _commandBarButtonStyles = require(\"./CommandBarButton.styles\");\n/**\n * {@docCategory Button}\n */ var CommandBarButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(CommandBarButton1, _super);\n    function CommandBarButton1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    CommandBarButton1.prototype.render = function() {\n        var _a = this.props, styles = _a.styles, theme = _a.theme;\n        return _react.createElement((0, _baseButton.BaseButton), (0, _tslib.__assign)({}, this.props, {\n            variantClassName: \"ms-Button--commandBar\",\n            styles: (0, _commandBarButtonStyles.getStyles)(theme, styles),\n            onRenderDescription: (0, _utilities.nullRender)\n        }));\n    };\n    CommandBarButton1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"CommandBarButton\", [\n            \"theme\",\n            \"styles\"\n        ], true)\n    ], CommandBarButton1);\n    return CommandBarButton1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../BaseButton\":\"ggNpu\",\"../../../Utilities\":\"2F07a\",\"./CommandBarButton.styles\":\"dwyCH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dwyCH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../../Styling\");\nvar _utilities = require(\"../../../Utilities\");\nvar _baseButtonStyles = require(\"../BaseButton.styles\");\nvar _splitButtonStyles = require(\"../SplitButton/SplitButton.styles\");\nvar _baseButtonClassNames = require(\"../BaseButton.classNames\");\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles, focusInset, focusColor) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n    var baseButtonStyles = (0, _baseButtonStyles.getStyles)(theme);\n    var baseSplitButtonStyles = (0, _splitButtonStyles.getStyles)(theme);\n    var p = theme.palette, semanticColors = theme.semanticColors;\n    var commandButtonHighContrastFocus = {\n        left: 4,\n        top: 4,\n        bottom: 4,\n        right: 4,\n        border: \"none\"\n    };\n    var commandButtonStyles = {\n        root: [\n            (0, _styling.getFocusStyle)(theme, {\n                inset: 2,\n                highContrastStyle: commandButtonHighContrastFocus,\n                borderColor: \"transparent\"\n            }),\n            theme.fonts.medium,\n            {\n                minWidth: \"40px\",\n                backgroundColor: p.white,\n                color: p.neutralPrimary,\n                padding: \"0 4px\",\n                border: \"none\",\n                borderRadius: 0,\n                selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                    border: \"none\"\n                }, _a)\n            }, \n        ],\n        rootHovered: {\n            backgroundColor: p.neutralLighter,\n            color: p.neutralDark,\n            selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                color: \"Highlight\"\n            }, _b[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonIcon] = {\n                color: p.themeDarkAlt\n            }, _b[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonMenuIcon] = {\n                color: p.neutralPrimary\n            }, _b)\n        },\n        rootPressed: {\n            backgroundColor: p.neutralLight,\n            color: p.neutralDark,\n            selectors: (_c = {}, _c[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonIcon] = {\n                color: p.themeDark\n            }, _c[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonMenuIcon] = {\n                color: p.neutralPrimary\n            }, _c)\n        },\n        rootChecked: {\n            backgroundColor: p.neutralLight,\n            color: p.neutralDark,\n            selectors: (_d = {}, _d[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonIcon] = {\n                color: p.themeDark\n            }, _d[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonMenuIcon] = {\n                color: p.neutralPrimary\n            }, _d)\n        },\n        rootCheckedHovered: {\n            backgroundColor: p.neutralQuaternaryAlt,\n            selectors: (_e = {}, _e[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonIcon] = {\n                color: p.themeDark\n            }, _e[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonMenuIcon] = {\n                color: p.neutralPrimary\n            }, _e)\n        },\n        rootExpanded: {\n            backgroundColor: p.neutralLight,\n            color: p.neutralDark,\n            selectors: (_f = {}, _f[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonIcon] = {\n                color: p.themeDark\n            }, _f[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonMenuIcon] = {\n                color: p.neutralPrimary\n            }, _f)\n        },\n        rootExpandedHovered: {\n            backgroundColor: p.neutralQuaternaryAlt\n        },\n        rootDisabled: {\n            backgroundColor: p.white,\n            selectors: (_g = {}, _g[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonIcon] = {\n                color: semanticColors.disabledBodySubtext,\n                selectors: (_h = {}, _h[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                    color: \"GrayText\"\n                }, (0, _styling.getHighContrastNoAdjustStyle)()), _h)\n            }, _g[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: \"GrayText\",\n                backgroundColor: \"Window\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _g)\n        },\n        // Split button styles\n        splitButtonContainer: {\n            height: \"100%\",\n            selectors: (_j = {}, _j[0, _styling.HighContrastSelector] = {\n                border: \"none\"\n            }, _j)\n        },\n        splitButtonDividerDisabled: {\n            selectors: (_k = {}, _k[0, _styling.HighContrastSelector] = {\n                backgroundColor: \"Window\"\n            }, _k)\n        },\n        splitButtonDivider: {\n            backgroundColor: p.neutralTertiaryAlt\n        },\n        splitButtonMenuButton: {\n            backgroundColor: p.white,\n            border: \"none\",\n            borderTopRightRadius: \"0\",\n            borderBottomRightRadius: \"0\",\n            color: p.neutralSecondary,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: p.neutralLighter,\n                    color: p.neutralDark,\n                    selectors: (_l = {}, _l[0, _styling.HighContrastSelector] = {\n                        color: \"Highlight\"\n                    }, _l[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonIcon] = {\n                        color: p.neutralPrimary\n                    }, _l)\n                },\n                \":active\": {\n                    backgroundColor: p.neutralLight,\n                    selectors: (_m = {}, _m[\".\" + (0, _baseButtonClassNames.ButtonGlobalClassNames).msButtonIcon] = {\n                        color: p.neutralPrimary\n                    }, _m)\n                }\n            }\n        },\n        splitButtonMenuButtonDisabled: {\n            backgroundColor: p.white,\n            selectors: (_o = {}, _o[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: \"GrayText\",\n                border: \"none\",\n                backgroundColor: \"Window\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _o)\n        },\n        splitButtonMenuButtonChecked: {\n            backgroundColor: p.neutralLight,\n            color: p.neutralDark,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: p.neutralQuaternaryAlt\n                }\n            }\n        },\n        splitButtonMenuButtonExpanded: {\n            backgroundColor: p.neutralLight,\n            color: p.black,\n            selectors: {\n                \":hover\": {\n                    backgroundColor: p.neutralQuaternaryAlt\n                }\n            }\n        },\n        splitButtonMenuIcon: {\n            color: p.neutralPrimary\n        },\n        splitButtonMenuIconDisabled: {\n            color: p.neutralTertiary\n        },\n        label: {\n            fontWeight: \"normal\"\n        },\n        icon: {\n            color: p.themePrimary\n        },\n        menuIcon: (_p = {\n            color: p.neutralSecondary\n        }, _p[0, _styling.HighContrastSelector] = {\n            color: \"GrayText\"\n        }, _p)\n    };\n    return (0, _styling.concatStyleSets)(baseButtonStyles, baseSplitButtonStyles, commandButtonStyles, customStyles);\n});\n\n},{\"tslib\":\"01Tx1\",\"../../../Styling\":\"7JwBd\",\"../../../Utilities\":\"2F07a\",\"../BaseButton.styles\":\"gSlGS\",\"../SplitButton/SplitButton.styles\":\"cLPEJ\",\"../BaseButton.classNames\":\"kofVG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kW4vm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CommandButton\", ()=>CommandButton);\nvar _actionButton = require(\"../ActionButton/ActionButton\");\nvar CommandButton = (0, _actionButton.ActionButton);\n\n},{\"../ActionButton/ActionButton\":\"l59h4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"68g1F\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"MessageBarButton\", ()=>MessageBarButton);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _defaultButton = require(\"../DefaultButton/DefaultButton\");\nvar _utilities = require(\"../../../Utilities\");\nvar _messageBarButtonStyles = require(\"./MessageBarButton.styles\");\n/**\n * {@docCategory MessageBar}\n */ var MessageBarButton = /** @class */ function(_super) {\n    (0, _tslib.__extends)(MessageBarButton1, _super);\n    function MessageBarButton1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    MessageBarButton1.prototype.render = function() {\n        var _a = this.props, styles = _a.styles, theme = _a.theme;\n        return _react.createElement((0, _defaultButton.DefaultButton), (0, _tslib.__assign)({}, this.props, {\n            styles: (0, _messageBarButtonStyles.getStyles)(theme, styles),\n            onRenderDescription: (0, _utilities.nullRender)\n        }));\n    };\n    MessageBarButton1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"MessageBarButton\", [\n            \"theme\",\n            \"styles\"\n        ], true)\n    ], MessageBarButton1);\n    return MessageBarButton1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../DefaultButton/DefaultButton\":\"2lgOO\",\"../../../Utilities\":\"2F07a\",\"./MessageBarButton.styles\":\"hSqI1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hSqI1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../../Styling\");\nvar _utilities = require(\"../../../Utilities\");\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles) {\n    return (0, _styling.concatStyleSets)({\n        root: [\n            (0, _styling.getFocusStyle)(theme, {\n                inset: 1,\n                highContrastStyle: {\n                    outlineOffset: \"-4px\",\n                    outline: \"1px solid Window\"\n                },\n                borderColor: \"transparent\"\n            }),\n            {\n                height: 24\n            }, \n        ]\n    }, customStyles);\n});\n\n},{\"../../../Styling\":\"7JwBd\",\"../../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dcM7C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _choiceGroup = require(\"office-ui-fabric-react/lib/ChoiceGroup\");\nparcelHelpers.exportAll(_choiceGroup, exports);\n\n},{\"office-ui-fabric-react/lib/ChoiceGroup\":\"58vF1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"58vF1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/ChoiceGroup/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/ChoiceGroup/index\":\"8hAKr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8hAKr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _choiceGroup = require(\"./ChoiceGroup\");\nparcelHelpers.exportAll(_choiceGroup, exports);\nvar _choiceGroupBase = require(\"./ChoiceGroup.base\");\nparcelHelpers.exportAll(_choiceGroupBase, exports);\nvar _index = require(\"./ChoiceGroupOption/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./ChoiceGroup\":\"33jv2\",\"./ChoiceGroup.base\":\"gkOzH\",\"./ChoiceGroupOption/index\":\"hIPOa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"33jv2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ChoiceGroup\", ()=>ChoiceGroup);\nvar _utilities = require(\"../../Utilities\");\nvar _choiceGroupBase = require(\"./ChoiceGroup.base\");\nvar _choiceGroupStyles = require(\"./ChoiceGroup.styles\");\nvar ChoiceGroup = (0, _utilities.styled)((0, _choiceGroupBase.ChoiceGroupBase), (0, _choiceGroupStyles.getStyles), undefined, {\n    scope: \"ChoiceGroup\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./ChoiceGroup.base\":\"gkOzH\",\"./ChoiceGroup.styles\":\"e8NtM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gkOzH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ChoiceGroupBase\", ()=>ChoiceGroupBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _label = require(\"../../Label\");\nvar _utilities = require(\"../../Utilities\");\nvar _index = require(\"./ChoiceGroupOption/index\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\n/**\n * {@docCategory ChoiceGroup}\n */ var ChoiceGroupBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ChoiceGroupBase1, _super);\n    function ChoiceGroupBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._focusCallbacks = {};\n        _this._changeCallbacks = {};\n        _this._onBlur = function(ev, option) {\n            _this.setState({\n                keyFocused: undefined\n            });\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        var defaultSelectedKey = props.defaultSelectedKey, _a = props.options, options = _a === void 0 ? [] : _a;\n        var validDefaultSelectedKey = !_isControlled(props) && defaultSelectedKey !== undefined && options.some(function(option) {\n            return option.key === defaultSelectedKey;\n        });\n        _this.state = {\n            keyChecked: validDefaultSelectedKey ? defaultSelectedKey : _this._getKeyChecked(props)\n        };\n        _this._id = (0, _utilities.getId)(\"ChoiceGroup\");\n        _this._labelId = (0, _utilities.getId)(\"ChoiceGroupLabel\");\n        return _this;\n    }\n    Object.defineProperty(ChoiceGroupBase1.prototype, \"checkedOption\", {\n        /**\n         * Gets the current checked option.\n         */ get: function() {\n            var _this = this;\n            var _a = this.props.options, options = _a === void 0 ? [] : _a;\n            return (0, _utilities.find)(options, function(value) {\n                return value.key === _this.state.keyChecked;\n            });\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ChoiceGroupBase1.prototype.componentDidUpdate = function(prevProps, prevState) {\n        // Only update if a new props object has been passed in (don't care about state updates)\n        if (prevProps !== this.props) {\n            var newKeyChecked = this._getKeyChecked(this.props);\n            var oldKeyChecked = this._getKeyChecked(prevProps);\n            if (newKeyChecked !== oldKeyChecked) this.setState({\n                keyChecked: newKeyChecked\n            });\n        }\n    };\n    ChoiceGroupBase1.prototype.render = function() {\n        var _this = this;\n        var _a = this.props, className = _a.className, theme = _a.theme, styles = _a.styles, _b = _a.options, options = _b === void 0 ? [] : _b, label = _a.label, required = _a.required, disabled = _a.disabled, name = _a.name;\n        var _c = this.state, keyChecked = _c.keyChecked, keyFocused = _c.keyFocused;\n        var divProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties), [\n            \"onChange\",\n            \"className\",\n            \"required\", \n        ]);\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            optionsContainIconOrImage: options.some(function(option) {\n                return !!(option.iconProps || option.imageSrc);\n            })\n        });\n        var labelId = this._id + \"-label\";\n        var ariaLabelledBy = this.props.ariaLabelledBy || (label ? labelId : this.props[\"aria-labelledby\"]);\n        // TODO (Fabric 8?) - if possible, move `root` class to the actual root and eliminate\n        // `applicationRole` class (but the div structure will stay the same by necessity)\n        return(// eslint-disable-next-line deprecation/deprecation\n        _react.createElement(\"div\", (0, _tslib.__assign)({\n            className: classNames.applicationRole\n        }, divProps), _react.createElement(\"div\", (0, _tslib.__assign)({\n            className: classNames.root,\n            role: \"radiogroup\"\n        }, ariaLabelledBy && {\n            \"aria-labelledby\": ariaLabelledBy\n        }), label && _react.createElement((0, _label.Label), {\n            className: classNames.label,\n            required: required,\n            id: labelId,\n            disabled: disabled\n        }, label), _react.createElement(\"div\", {\n            className: classNames.flexContainer\n        }, options.map(function(option) {\n            var innerOptionProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, option), {\n                focused: option.key === keyFocused,\n                checked: option.key === keyChecked,\n                disabled: option.disabled || disabled,\n                id: _this._getOptionId(option),\n                labelId: _this._getOptionLabelId(option),\n                name: name || _this._id,\n                required: required\n            });\n            return _react.createElement((0, _index.ChoiceGroupOption), (0, _tslib.__assign)({\n                key: option.key,\n                onBlur: _this._onBlur,\n                onFocus: _this._onFocus(option.key),\n                onChange: _this._onChange(option.key)\n            }, innerOptionProps));\n        })))));\n    };\n    ChoiceGroupBase1.prototype.focus = function() {\n        var _a = this.props.options, options = _a === void 0 ? [] : _a;\n        var optionToFocus = this.checkedOption || options.filter(function(option) {\n            return !option.disabled;\n        })[0];\n        var elementToFocus = optionToFocus && document.getElementById(this._getOptionId(optionToFocus));\n        if (elementToFocus) {\n            elementToFocus.focus();\n            (0, _utilities.setFocusVisibility)(true, elementToFocus);\n        }\n    };\n    ChoiceGroupBase1.prototype._onFocus = function(key) {\n        var _this = this;\n        // This extra mess is necessary because React won't pass the `key` prop through to ChoiceGroupOption\n        if (!this._focusCallbacks[key]) this._focusCallbacks[key] = function(ev, option) {\n            _this.setState({\n                keyFocused: key\n            });\n        };\n        return this._focusCallbacks[key];\n    };\n    ChoiceGroupBase1.prototype._onChange = function(key) {\n        var _this = this;\n        // This extra mess is necessary because React won't pass the `key` prop through to ChoiceGroupOption\n        if (!this._changeCallbacks[key]) this._changeCallbacks[key] = function(evt, option) {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a = _this.props, onChanged = _a.onChanged, onChange = _a.onChange;\n            // Only manage state in uncontrolled scenarios.\n            if (!_isControlled(_this.props)) _this.setState({\n                keyChecked: key\n            });\n            // Get the original option without the `key` prop removed\n            var originalOption = (0, _utilities.find)(_this.props.options || [], function(value) {\n                return value.key === key;\n            });\n            // TODO: onChanged deprecated, remove else if after 07/17/2017 when onChanged has been removed.\n            if (onChange) onChange(evt, originalOption);\n            else if (onChanged) onChanged(originalOption, evt);\n        };\n        return this._changeCallbacks[key];\n    };\n    /**\n     * Returns `selectedKey` if provided, or the key of the first option with the `checked` prop set.\n     */ ChoiceGroupBase1.prototype._getKeyChecked = function(props) {\n        if (props.selectedKey !== undefined) return props.selectedKey;\n        var _a = props.options, options = _a === void 0 ? [] : _a;\n        // eslint-disable-next-line deprecation/deprecation\n        var optionsChecked = options.filter(function(option) {\n            return option.checked;\n        });\n        return optionsChecked[0] && optionsChecked[0].key;\n    };\n    ChoiceGroupBase1.prototype._getOptionId = function(option) {\n        return option.id || this._id + \"-\" + option.key;\n    };\n    ChoiceGroupBase1.prototype._getOptionLabelId = function(option) {\n        return option.labelId || this._labelId + \"-\" + option.key;\n    };\n    return ChoiceGroupBase1;\n}(_react.Component);\nfunction _isControlled(props) {\n    return (0, _utilities.isControlled)(props, \"selectedKey\");\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Label\":\"lLA6C\",\"../../Utilities\":\"2F07a\",\"./ChoiceGroupOption/index\":\"hIPOa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lLA6C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Label/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Label/index\":\"30a5c\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"30a5c\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _labelBase = require(\"./Label.base\");\nparcelHelpers.exportAll(_labelBase, exports);\nvar _label = require(\"./Label\");\nparcelHelpers.exportAll(_label, exports);\n\n},{\"./Label.base\":\"yqODZ\",\"./Label\":\"aTWsi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"yqODZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LabelBase\", ()=>LabelBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar getClassNames = (0, _utilities.classNamesFunction)({\n    // Label is used a lot by other components.\n    // It's likely to see expected cases which pass different className to the Label.\n    // Therefore setting a larger cache size.\n    cacheSize: 100\n});\nvar LabelBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(LabelBase1, _super);\n    function LabelBase1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    LabelBase1.prototype.render = function() {\n        var _a = this.props, _b = _a.as, RootType = _b === void 0 ? \"label\" : _b, children = _a.children, className = _a.className, disabled = _a.disabled, styles = _a.styles, required = _a.required, theme = _a.theme;\n        var classNames = getClassNames(styles, {\n            className: className,\n            disabled: disabled,\n            required: required,\n            theme: theme\n        });\n        return _react.createElement(RootType, (0, _tslib.__assign)({}, (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties)), {\n            className: classNames.root\n        }), children);\n    };\n    return LabelBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aTWsi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Label\", ()=>Label);\nvar _utilities = require(\"../../Utilities\");\nvar _labelBase = require(\"./Label.base\");\nvar _labelStyles = require(\"./Label.styles\");\nvar Label = (0, _utilities.styled)((0, _labelBase.LabelBase), (0, _labelStyles.getStyles), undefined, {\n    scope: \"Label\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Label.base\":\"yqODZ\",\"./Label.styles\":\"cW78y\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cW78y\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../Styling\");\nvar getStyles = function(props) {\n    var _a;\n    var theme = props.theme, className = props.className, disabled = props.disabled, required = props.required;\n    var semanticColors = theme.semanticColors;\n    // Tokens\n    var labelFontWeight = (0, _styling.FontWeights).semibold;\n    var labelColor = semanticColors.bodyText;\n    var labelDisabledColor = semanticColors.disabledBodyText;\n    var labelRequiredStarColor = semanticColors.errorText;\n    return {\n        root: [\n            \"ms-Label\",\n            theme.fonts.medium,\n            {\n                fontWeight: labelFontWeight,\n                color: labelColor,\n                boxSizing: \"border-box\",\n                boxShadow: \"none\",\n                margin: 0,\n                display: \"block\",\n                padding: \"5px 0\",\n                wordWrap: \"break-word\",\n                overflowWrap: \"break-word\"\n            },\n            disabled && {\n                color: labelDisabledColor,\n                selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                    color: \"GrayText\"\n                }, (0, _styling.getHighContrastNoAdjustStyle)()), _a)\n            },\n            required && {\n                selectors: {\n                    \"::after\": {\n                        content: \"' *'\",\n                        color: labelRequiredStarColor,\n                        paddingRight: 12\n                    }\n                }\n            },\n            className, \n        ]\n    };\n};\n\n},{\"tslib\":\"01Tx1\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hIPOa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _choiceGroupOption = require(\"./ChoiceGroupOption\");\nparcelHelpers.exportAll(_choiceGroupOption, exports);\n\n},{\"./ChoiceGroupOption\":\"eD8ij\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eD8ij\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ChoiceGroupOption\", ()=>ChoiceGroupOption);\nvar _utilities = require(\"../../../Utilities\");\nvar _choiceGroupOptionBase = require(\"./ChoiceGroupOption.base\");\nvar _choiceGroupOptionStyles = require(\"./ChoiceGroupOption.styles\");\nvar ChoiceGroupOption = (0, _utilities.styled)((0, _choiceGroupOptionBase.ChoiceGroupOptionBase), (0, _choiceGroupOptionStyles.getStyles), undefined, {\n    scope: \"ChoiceGroupOption\"\n});\n\n},{\"../../../Utilities\":\"2F07a\",\"./ChoiceGroupOption.base\":\"jYizK\",\"./ChoiceGroupOption.styles\":\"4g4Oy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jYizK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ChoiceGroupOptionBase\", ()=>ChoiceGroupOptionBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _image = require(\"../../../Image\");\nvar _icon = require(\"../../../Icon\");\nvar _utilities = require(\"../../../Utilities\");\nvar _utilities1 = require(\"@uifabric/utilities\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar LARGE_IMAGE_SIZE = 71;\n/**\n * {@docCategory ChoiceGroup}\n */ var ChoiceGroupOptionBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ChoiceGroupOptionBase1, _super);\n    function ChoiceGroupOptionBase1(props1) {\n        var _this = _super.call(this, props1) || this;\n        _this._onChange = function(evt) {\n            var onChange = _this.props.onChange;\n            if (onChange) onChange(evt, _this.props);\n        };\n        _this._onBlur = function(evt) {\n            var onBlur = _this.props.onBlur;\n            if (onBlur) onBlur(evt, _this.props);\n        };\n        _this._onFocus = function(evt) {\n            var onFocus = _this.props.onFocus;\n            if (onFocus) onFocus(evt, _this.props);\n        };\n        _this._onRenderField = function(props) {\n            var id = props.id, imageSrc = props.imageSrc, _a = props.imageAlt, imageAlt = _a === void 0 ? \"\" : _a, selectedImageSrc = props.selectedImageSrc, iconProps = props.iconProps;\n            var imageSize = props.imageSize ? props.imageSize : {\n                width: 32,\n                height: 32\n            };\n            var onRenderLabel = props.onRenderLabel ? (0, _utilities1.composeRenderFunction)(props.onRenderLabel, _this._onRenderLabel) : _this._onRenderLabel;\n            var label = onRenderLabel(props);\n            return _react.createElement(\"label\", {\n                htmlFor: id,\n                className: _this._classNames.field\n            }, imageSrc && _react.createElement(\"div\", {\n                className: _this._classNames.innerField\n            }, _react.createElement(\"div\", {\n                className: _this._classNames.imageWrapper\n            }, _react.createElement((0, _image.Image), {\n                src: imageSrc,\n                alt: imageAlt,\n                width: imageSize.width,\n                height: imageSize.height\n            })), _react.createElement(\"div\", {\n                className: _this._classNames.selectedImageWrapper\n            }, _react.createElement((0, _image.Image), {\n                src: selectedImageSrc,\n                alt: imageAlt,\n                width: imageSize.width,\n                height: imageSize.height\n            }))), iconProps && _react.createElement(\"div\", {\n                className: _this._classNames.innerField\n            }, _react.createElement(\"div\", {\n                className: _this._classNames.iconWrapper\n            }, _react.createElement((0, _icon.Icon), (0, _tslib.__assign)({}, iconProps)))), imageSrc || iconProps ? _react.createElement(\"div\", {\n                className: _this._classNames.labelWrapper\n            }, label) : label);\n        };\n        _this._onRenderLabel = function(props) {\n            return _react.createElement(\"span\", {\n                id: props.labelId,\n                className: \"ms-ChoiceFieldLabel\"\n            }, props.text);\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        return _this;\n    }\n    ChoiceGroupOptionBase1.prototype.render = function() {\n        var _a = this.props, ariaLabel = _a.ariaLabel, focused = _a.focused, required = _a.required, theme = _a.theme, iconProps = _a.iconProps, imageSrc = _a.imageSrc, imageSize = _a.imageSize, disabled = _a.disabled, // eslint-disable-next-line deprecation/deprecation\n        checked = _a.checked, id = _a.id, styles = _a.styles, name = _a.name, _b = _a.onRenderField, onRenderField = _b === void 0 ? this._onRenderField : _b, rest = (0, _tslib.__rest)(_a, [\n            \"ariaLabel\",\n            \"focused\",\n            \"required\",\n            \"theme\",\n            \"iconProps\",\n            \"imageSrc\",\n            \"imageSize\",\n            \"disabled\",\n            \"checked\",\n            \"id\",\n            \"styles\",\n            \"name\",\n            \"onRenderField\"\n        ]);\n        this._classNames = getClassNames(styles, {\n            theme: theme,\n            hasIcon: !!iconProps,\n            hasImage: !!imageSrc,\n            checked: checked,\n            disabled: disabled,\n            imageIsLarge: !!imageSrc && (imageSize.width > LARGE_IMAGE_SIZE || imageSize.height > LARGE_IMAGE_SIZE),\n            imageSize: imageSize,\n            focused: focused\n        });\n        var _c = (0, _utilities.getNativeProps)(rest, (0, _utilities.inputProperties)), className = _c.className, nativeProps = (0, _tslib.__rest)(_c, [\n            \"className\"\n        ]);\n        return _react.createElement(\"div\", {\n            className: this._classNames.root\n        }, _react.createElement(\"div\", {\n            className: this._classNames.choiceFieldWrapper\n        }, _react.createElement(\"input\", (0, _tslib.__assign)({\n            \"aria-label\": ariaLabel,\n            id: id,\n            className: (0, _utilities.css)(this._classNames.input, className),\n            type: \"radio\",\n            name: name,\n            disabled: disabled,\n            checked: checked,\n            required: required\n        }, nativeProps, {\n            onChange: this._onChange,\n            onFocus: this._onFocus,\n            onBlur: this._onBlur\n        })), onRenderField(this.props, this._onRenderField)));\n    };\n    ChoiceGroupOptionBase1.defaultProps = {\n        // This ensures default imageSize value doesn't mutate. Mutation can cause style re-calcuation.\n        imageSize: {\n            width: 32,\n            height: 32\n        }\n    };\n    return ChoiceGroupOptionBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../../Image\":\"kG7jE\",\"../../../Icon\":\"2Ha7p\",\"../../../Utilities\":\"2F07a\",\"@uifabric/utilities\":\"uTCgd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kG7jE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Image/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Image/index\":\"4F4H8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4F4H8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _image = require(\"./Image\");\nparcelHelpers.exportAll(_image, exports);\nvar _imageBase = require(\"./Image.base\");\nparcelHelpers.exportAll(_imageBase, exports);\nvar _imageTypes = require(\"./Image.types\");\nparcelHelpers.exportAll(_imageTypes, exports);\n\n},{\"./Image\":\"6yAAQ\",\"./Image.base\":\"gw8KK\",\"./Image.types\":\"47e0t\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4g4Oy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../../Styling\");\nvar _utilities = require(\"../../../Utilities\");\nvar GlobalClassNames = {\n    root: \"ms-ChoiceField\",\n    choiceFieldWrapper: \"ms-ChoiceField-wrapper\",\n    input: \"ms-ChoiceField-input\",\n    field: \"ms-ChoiceField-field\",\n    innerField: \"ms-ChoiceField-innerField\",\n    imageWrapper: \"ms-ChoiceField-imageWrapper\",\n    iconWrapper: \"ms-ChoiceField-iconWrapper\",\n    labelWrapper: \"ms-ChoiceField-labelWrapper\",\n    checked: \"is-checked\"\n};\nvar labelWrapperLineHeight = 15;\nvar labelWrapperHeight = labelWrapperLineHeight * 2 + 2; // adding 2px height to ensure text doesn't get cutoff\nvar iconSize = 32;\nvar choiceFieldSize = 20;\nvar choiceFieldTransitionDuration = \"200ms\";\nvar choiceFieldTransitionTiming = \"cubic-bezier(.4, 0, .23, 1)\";\nvar radioButtonSpacing = 3;\nvar radioButtonInnerSize = 5;\nfunction getChoiceGroupFocusStyle(focusBorderColor, hasIconOrImage) {\n    var _a, _b;\n    return [\n        \"is-inFocus\",\n        {\n            selectors: (_a = {}, _a[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &\"] = {\n                position: \"relative\",\n                outline: \"transparent\",\n                selectors: {\n                    \"::-moz-focus-inner\": {\n                        border: 0\n                    },\n                    \":after\": {\n                        content: '\"\"',\n                        top: -2,\n                        right: -2,\n                        bottom: -2,\n                        left: -2,\n                        pointerEvents: \"none\",\n                        border: \"1px solid \" + focusBorderColor,\n                        position: \"absolute\",\n                        selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                            borderColor: \"WindowText\",\n                            borderWidth: hasIconOrImage ? 1 : 2\n                        }, _b)\n                    }\n                }\n            }, _a)\n        }, \n    ];\n}\nfunction getImageWrapperStyle(isSelectedImageWrapper, className, checked) {\n    return [\n        className,\n        {\n            paddingBottom: 2,\n            transitionProperty: \"opacity\",\n            transitionDuration: choiceFieldTransitionDuration,\n            transitionTimingFunction: \"ease\",\n            selectors: {\n                \".ms-Image\": {\n                    display: \"inline-block\",\n                    borderStyle: \"none\"\n                }\n            }\n        },\n        (checked ? !isSelectedImageWrapper : isSelectedImageWrapper) && [\n            \"is-hidden\",\n            {\n                position: \"absolute\",\n                left: 0,\n                top: 0,\n                width: \"100%\",\n                height: \"100%\",\n                overflow: \"hidden\",\n                opacity: 0\n            }, \n        ], \n    ];\n}\nvar getStyles = function(props) {\n    var _a, _b, _c, _d, _e;\n    var theme = props.theme, hasIcon = props.hasIcon, hasImage = props.hasImage, checked = props.checked, disabled = props.disabled, imageIsLarge = props.imageIsLarge, focused = props.focused, imageSize = props.imageSize;\n    var palette = theme.palette, semanticColors = theme.semanticColors, fonts = theme.fonts;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    // Tokens\n    // TODO: after updating the semanticColors slots mapping this needs to be semanticColors.smallInputBorder\n    var circleBorderColor = palette.neutralPrimary;\n    var circleHoveredBorderColor = semanticColors.inputBorderHovered;\n    var circleCheckedBorderColor = semanticColors.inputBackgroundChecked;\n    // TODO: after updating the semanticColors slots mapping this needs to be semanticColors.inputBackgroundCheckedHovered\n    var circleCheckedHoveredBorderColor = palette.themeDark;\n    var circleDisabledBorderColor = semanticColors.disabledBodySubtext;\n    var circleBackgroundColor = semanticColors.bodyBackground;\n    var dotUncheckedHoveredColor = palette.neutralSecondary;\n    var dotCheckedColor = semanticColors.inputBackgroundChecked;\n    // TODO: after updating the semanticColors slots mapping this needs to be semanticColors.inputBackgroundCheckedHovered\n    var dotCheckedHoveredColor = palette.themeDark;\n    var dotDisabledColor = semanticColors.disabledBodySubtext;\n    // TODO: after updating the semanticColors slots mapping this needs to be semanticColors.bodyTextChecked\n    var labelHoverFocusColor = palette.neutralDark;\n    var focusBorderColor = semanticColors.focusBorder;\n    var iconOrImageChoiceBorderUncheckedHoveredColor = semanticColors.inputBorderHovered;\n    // TODO: after updating the semanticColors slots mapping this needs to be semanticColors.inputBackgroundCheckedHovered\n    var iconOrImageChoiceBorderCheckedColor = semanticColors.inputBackgroundChecked;\n    var iconOrImageChoiceBorderCheckedHoveredColor = palette.themeDark;\n    var iconOrImageChoiceBackgroundColor = palette.neutralLighter;\n    var fieldHoverOrFocusProperties = {\n        selectors: {\n            \".ms-ChoiceFieldLabel\": {\n                color: labelHoverFocusColor\n            },\n            \":before\": {\n                borderColor: checked ? circleCheckedHoveredBorderColor : circleHoveredBorderColor\n            },\n            \":after\": [\n                !hasIcon && !hasImage && !checked && {\n                    content: '\"\"',\n                    transitionProperty: \"background-color\",\n                    left: 5,\n                    top: 5,\n                    width: 10,\n                    height: 10,\n                    backgroundColor: dotUncheckedHoveredColor\n                },\n                checked && {\n                    borderColor: dotCheckedHoveredColor\n                }, \n            ]\n        }\n    };\n    var enabledFieldWithImageHoverOrFocusProperties = {\n        borderColor: checked ? iconOrImageChoiceBorderCheckedHoveredColor : iconOrImageChoiceBorderUncheckedHoveredColor,\n        selectors: {\n            \":before\": {\n                opacity: 1,\n                borderColor: checked ? circleCheckedHoveredBorderColor : circleHoveredBorderColor\n            }\n        }\n    };\n    var circleAreaProperties = [\n        {\n            content: '\"\"',\n            display: \"inline-block\",\n            backgroundColor: circleBackgroundColor,\n            borderWidth: 1,\n            borderStyle: \"solid\",\n            borderColor: circleBorderColor,\n            width: choiceFieldSize,\n            height: choiceFieldSize,\n            fontWeight: \"normal\",\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            boxSizing: \"border-box\",\n            transitionProperty: \"border-color\",\n            transitionDuration: choiceFieldTransitionDuration,\n            transitionTimingFunction: choiceFieldTransitionTiming,\n            borderRadius: \"50%\"\n        },\n        disabled && {\n            borderColor: circleDisabledBorderColor,\n            selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                borderColor: \"GrayText\",\n                background: \"Window\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _a)\n        },\n        checked && {\n            borderColor: disabled ? circleDisabledBorderColor : circleCheckedBorderColor,\n            selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                borderColor: \"Highlight\",\n                background: \"Window\",\n                forcedColorAdjust: \"none\"\n            }, _b)\n        },\n        (hasIcon || hasImage) && {\n            top: radioButtonSpacing,\n            right: radioButtonSpacing,\n            left: \"auto\",\n            opacity: checked ? 1 : 0\n        }, \n    ];\n    var dotAreaProperties = [\n        {\n            content: '\"\"',\n            width: 0,\n            height: 0,\n            borderRadius: \"50%\",\n            position: \"absolute\",\n            left: choiceFieldSize / 2,\n            right: 0,\n            transitionProperty: \"border-width\",\n            transitionDuration: choiceFieldTransitionDuration,\n            transitionTimingFunction: choiceFieldTransitionTiming,\n            boxSizing: \"border-box\"\n        },\n        checked && {\n            borderWidth: 5,\n            borderStyle: \"solid\",\n            borderColor: disabled ? dotDisabledColor : dotCheckedColor,\n            left: 5,\n            top: 5,\n            width: 10,\n            height: 10,\n            selectors: (_c = {}, _c[0, _styling.HighContrastSelector] = {\n                borderColor: \"Highlight\",\n                forcedColorAdjust: \"none\"\n            }, _c)\n        },\n        checked && (hasIcon || hasImage) && {\n            top: radioButtonSpacing + radioButtonInnerSize,\n            right: radioButtonSpacing + radioButtonInnerSize,\n            left: \"auto\"\n        }, \n    ];\n    return {\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            {\n                display: \"flex\",\n                alignItems: \"center\",\n                boxSizing: \"border-box\",\n                color: semanticColors.bodyText,\n                minHeight: 26,\n                border: \"none\",\n                position: \"relative\",\n                marginTop: 8,\n                selectors: {\n                    \".ms-ChoiceFieldLabel\": {\n                        display: \"inline-block\"\n                    }\n                }\n            },\n            !hasIcon && !hasImage && {\n                selectors: {\n                    \".ms-ChoiceFieldLabel\": {\n                        paddingLeft: \"26px\"\n                    }\n                }\n            },\n            hasImage && \"ms-ChoiceField--image\",\n            hasIcon && \"ms-ChoiceField--icon\",\n            (hasIcon || hasImage) && {\n                display: \"inline-flex\",\n                fontSize: 0,\n                margin: \"0 4px 4px 0\",\n                paddingLeft: 0,\n                backgroundColor: iconOrImageChoiceBackgroundColor,\n                height: \"100%\"\n            }, \n        ],\n        choiceFieldWrapper: [\n            classNames.choiceFieldWrapper,\n            focused && getChoiceGroupFocusStyle(focusBorderColor, hasIcon || hasImage), \n        ],\n        // The hidden input\n        input: [\n            classNames.input,\n            {\n                position: \"absolute\",\n                opacity: 0,\n                top: 0,\n                right: 0,\n                width: \"100%\",\n                height: \"100%\",\n                margin: 0\n            },\n            disabled && \"is-disabled\", \n        ],\n        field: [\n            classNames.field,\n            checked && classNames.checked,\n            {\n                display: \"inline-block\",\n                cursor: \"pointer\",\n                marginTop: 0,\n                position: \"relative\",\n                verticalAlign: \"top\",\n                userSelect: \"none\",\n                minHeight: 20,\n                selectors: {\n                    \":hover\": !disabled && fieldHoverOrFocusProperties,\n                    \":focus\": !disabled && fieldHoverOrFocusProperties,\n                    // The circle\n                    \":before\": circleAreaProperties,\n                    // The dot\n                    \":after\": dotAreaProperties\n                }\n            },\n            hasIcon && \"ms-ChoiceField--icon\",\n            hasImage && \"ms-ChoiceField-field--image\",\n            (hasIcon || hasImage) && {\n                boxSizing: \"content-box\",\n                cursor: \"pointer\",\n                paddingTop: 22,\n                margin: 0,\n                textAlign: \"center\",\n                transitionProperty: \"all\",\n                transitionDuration: choiceFieldTransitionDuration,\n                transitionTimingFunction: \"ease\",\n                border: \"1px solid transparent\",\n                justifyContent: \"center\",\n                alignItems: \"center\",\n                display: \"flex\",\n                flexDirection: \"column\"\n            },\n            checked && {\n                borderColor: iconOrImageChoiceBorderCheckedColor\n            },\n            (hasIcon || hasImage) && !disabled && {\n                selectors: {\n                    \":hover\": enabledFieldWithImageHoverOrFocusProperties,\n                    \":focus\": enabledFieldWithImageHoverOrFocusProperties\n                }\n            },\n            disabled && {\n                cursor: \"default\",\n                selectors: {\n                    \".ms-ChoiceFieldLabel\": {\n                        color: semanticColors.disabledBodyText,\n                        selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                            color: \"GrayText\"\n                        }, (0, _styling.getHighContrastNoAdjustStyle)()), _d)\n                    }\n                }\n            },\n            checked && disabled && {\n                borderColor: iconOrImageChoiceBackgroundColor\n            }, \n        ],\n        innerField: [\n            classNames.innerField,\n            hasImage && {\n                // using non-null assertion because we have a default in `ChoiceGroupOptionBase` class.\n                height: imageSize.height,\n                width: imageSize.width\n            },\n            (hasIcon || hasImage) && {\n                position: \"relative\",\n                display: \"inline-block\",\n                paddingLeft: 30,\n                paddingRight: 30\n            },\n            (hasIcon || hasImage) && imageIsLarge && {\n                paddingLeft: 24,\n                paddingRight: 24\n            },\n            (hasIcon || hasImage) && disabled && {\n                opacity: 0.25,\n                selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = {\n                    color: \"GrayText\",\n                    opacity: 1\n                }, _e)\n            }, \n        ],\n        imageWrapper: getImageWrapperStyle(false, classNames.imageWrapper, checked),\n        selectedImageWrapper: getImageWrapperStyle(true, classNames.imageWrapper, checked),\n        iconWrapper: [\n            classNames.iconWrapper,\n            {\n                fontSize: iconSize,\n                lineHeight: iconSize,\n                height: iconSize\n            }, \n        ],\n        labelWrapper: [\n            classNames.labelWrapper,\n            fonts.medium,\n            (hasIcon || hasImage) && {\n                display: \"block\",\n                position: \"relative\",\n                margin: \"4px 8px 2px 8px\",\n                height: labelWrapperHeight,\n                lineHeight: labelWrapperLineHeight,\n                // using non-null assertion because we have a default in `ChoiceGroupOptionBase` class.\n                maxWidth: imageSize.width * 2,\n                overflow: \"hidden\",\n                whiteSpace: \"pre-wrap\"\n            }, \n        ]\n    };\n};\n\n},{\"tslib\":\"01Tx1\",\"../../../Styling\":\"7JwBd\",\"../../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e8NtM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar GlobalClassNames = {\n    root: \"ms-ChoiceFieldGroup\",\n    flexContainer: \"ms-ChoiceFieldGroup-flexContainer\"\n};\nvar getStyles = function(props) {\n    var className = props.className, optionsContainIconOrImage = props.optionsContainIconOrImage, theme = props.theme;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        // TODO (Fabric 8?) - merge className back into `root` and apply root style to\n        // the actual root role=application element\n        applicationRole: className,\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            {\n                display: \"block\"\n            }, \n        ],\n        flexContainer: [\n            classNames.flexContainer,\n            optionsContainIconOrImage && {\n                display: \"flex\",\n                flexDirection: \"row\",\n                flexWrap: \"wrap\"\n            }, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aEx6o\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _comboBox = require(\"office-ui-fabric-react/lib/ComboBox\");\nparcelHelpers.exportAll(_comboBox, exports);\n\n},{\"office-ui-fabric-react/lib/ComboBox\":\"j1Xa6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j1Xa6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/ComboBox/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/ComboBox/index\":\"1Opnf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1Opnf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SelectableOptionMenuItemType\", ()=>(0, _selectableOptionTypes.SelectableOptionMenuItemType));\nvar _selectableOptionTypes = require(\"../../utilities/selectableOption/SelectableOption.types\");\nvar _comboBox = require(\"./ComboBox\");\nparcelHelpers.exportAll(_comboBox, exports);\nvar _virtualizedComboBox = require(\"./VirtualizedComboBox\");\nparcelHelpers.exportAll(_virtualizedComboBox, exports);\n\n},{\"../../utilities/selectableOption/SelectableOption.types\":\"4gljF\",\"./ComboBox\":\"6H0u3\",\"./VirtualizedComboBox\":\"awPLf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4gljF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SelectableOptionMenuItemType\", ()=>SelectableOptionMenuItemType);\nvar SelectableOptionMenuItemType;\n(function(SelectableOptionMenuItemType1) {\n    SelectableOptionMenuItemType1[SelectableOptionMenuItemType1[\"Normal\"] = 0] = \"Normal\";\n    SelectableOptionMenuItemType1[SelectableOptionMenuItemType1[\"Divider\"] = 1] = \"Divider\";\n    SelectableOptionMenuItemType1[SelectableOptionMenuItemType1[\"Header\"] = 2] = \"Header\";\n})(SelectableOptionMenuItemType || (SelectableOptionMenuItemType = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6H0u3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ComboBox\", ()=>ComboBox);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _index = require(\"../Autofill/index\");\nvar _utilities = require(\"../../Utilities\");\nvar _callout = require(\"../../Callout\");\nvar _checkbox = require(\"../../Checkbox\");\nvar _button = require(\"../../Button\");\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nvar _comboBoxStyles = require(\"./ComboBox.styles\");\nvar _comboBoxClassNames = require(\"./ComboBox.classNames\");\nvar _keytipData = require(\"../../KeytipData\");\nvar _label = require(\"../../Label\");\nvar _index1 = require(\"../../utilities/selectableOption/index\");\nvar SearchDirection;\n(function(SearchDirection1) {\n    SearchDirection1[SearchDirection1[\"backward\"] = -1] = \"backward\";\n    SearchDirection1[SearchDirection1[\"none\"] = 0] = \"none\";\n    SearchDirection1[SearchDirection1[\"forward\"] = 1] = \"forward\";\n})(SearchDirection || (SearchDirection = {}));\nvar HoverStatus;\n(function(HoverStatus1) {\n    /** Used when the user was hovering and has since moused out of the menu items */ HoverStatus1[HoverStatus1[\"clearAll\"] = -2] = \"clearAll\";\n    /** Default \"normal\" state, when no hover has happened or a hover is in progress */ HoverStatus1[HoverStatus1[\"default\"] = -1] = \"default\";\n})(HoverStatus || (HoverStatus = {}));\nvar ScrollIdleDelay = 250; /* ms */ \nvar TouchIdleDelay = 500; /* ms */ \n/**\n * This is used to clear any pending autocomplete text (used when autocomplete is true and\n * allowFreeform is false)\n */ var ReadOnlyPendingAutoCompleteTimeout = 1000; /* ms */ \n/**\n * Internal class that is used to wrap all ComboBox options.\n * This is used to customize when we want to rerender components,\n * so we don't rerender every option every time render is executed.\n */ var ComboBoxOptionWrapper = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ComboBoxOptionWrapper1, _super);\n    function ComboBoxOptionWrapper1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    ComboBoxOptionWrapper1.prototype.render = function() {\n        return this.props.render();\n    };\n    ComboBoxOptionWrapper1.prototype.shouldComponentUpdate = function(newProps) {\n        // The render function will always be different, so we ignore that prop\n        return !(0, _utilities.shallowCompare)((0, _tslib.__assign)((0, _tslib.__assign)({}, this.props), {\n            render: undefined\n        }), (0, _tslib.__assign)((0, _tslib.__assign)({}, newProps), {\n            render: undefined\n        }));\n    };\n    return ComboBoxOptionWrapper1;\n}(_react.Component);\nvar COMPONENT_NAME = \"ComboBox\";\nvar ComboBox = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ComboBox1, _super);\n    function ComboBox1(props1) {\n        var _this = _super.call(this, props1) || this;\n        _this._root = _react.createRef();\n        /** The input aspect of the comboBox */ _this._autofill = _react.createRef();\n        /** The wrapping div of the input and button */ _this._comboBoxWrapper = _react.createRef();\n        /** The callout element */ _this._comboBoxMenu = _react.createRef();\n        /** The menu item element that is currently selected */ _this._selectedElement = _react.createRef();\n        /**\n         * {@inheritdoc}\n         */ _this.focus = function(shouldOpenOnFocus, useFocusAsync) {\n            if (_this.props.disabled === true) return;\n            if (_this._autofill.current) {\n                if (useFocusAsync) (0, _utilities.focusAsync)(_this._autofill.current);\n                else _this._autofill.current.focus();\n                if (shouldOpenOnFocus) _this.setState({\n                    isOpen: true\n                });\n            }\n            // Programatically setting focus means that there is nothing else that needs to be done\n            // Focus is now contained\n            if (!_this._hasFocus()) _this.setState({\n                focusState: \"focused\"\n            });\n        };\n        /**\n         * Close menu callout if it is open\n         */ _this.dismissMenu = function() {\n            var isOpen = _this.state.isOpen;\n            isOpen && _this.setState({\n                isOpen: false\n            });\n        };\n        /**\n         * componentWillReceiveProps handler for the auto fill component\n         * Checks/updates the iput value to set, if needed\n         * @param defaultVisibleValue - the defaultVisibleValue that got passed\n         *  in to the auto fill's componentWillReceiveProps\n         * @returns - the updated value to set, if needed\n         */ _this._onUpdateValueInAutofillWillReceiveProps = function() {\n            var comboBox = _this._autofill.current;\n            if (!comboBox) return null;\n            if (comboBox.value === null || comboBox.value === undefined) return null;\n            var visibleValue = _this._normalizeToString(_this._currentVisibleValue);\n            if (comboBox.value !== visibleValue) // If visibleValue is empty, ensure that the empty string is used\n            return visibleValue || \"\";\n            return comboBox.value;\n        };\n        _this._renderComboBoxWrapper = function(multiselectAccessibleText, errorMessageId, keytipAttributes) {\n            if (keytipAttributes === void 0) keytipAttributes = {};\n            var _a = _this.props, label = _a.label, disabled = _a.disabled, ariaLabel = _a.ariaLabel, ariaDescribedBy = _a.ariaDescribedBy, required = _a.required, errorMessage = _a.errorMessage, buttonIconProps = _a.buttonIconProps, _b = _a.isButtonAriaHidden, isButtonAriaHidden = _b === void 0 ? true : _b, title = _a.title, placeholderProp = _a.placeholder, tabIndex = _a.tabIndex, autofill = _a.autofill, iconButtonProps = _a.iconButtonProps;\n            var _c = _this.state, isOpen = _c.isOpen, suggestedDisplayValue = _c.suggestedDisplayValue;\n            // If the combobox has focus, is multiselect, and has a display string, then use that placeholder\n            // so that the selected items don't appear to vanish. This is not ideal but it's the only reasonable way\n            // to correct the behavior where the input is cleared so the user can type. If a full refactor is done, then this\n            // should be removed and the multiselect combobox should behave like a picker.\n            var placeholder = _this._hasFocus() && _this.props.multiSelect && multiselectAccessibleText ? multiselectAccessibleText : placeholderProp;\n            return _react.createElement(\"div\", {\n                \"data-ktp-target\": keytipAttributes[\"data-ktp-target\"],\n                ref: _this._comboBoxWrapper,\n                id: _this._id + \"wrapper\",\n                className: _this._classNames.root\n            }, _react.createElement((0, _index.Autofill), (0, _tslib.__assign)({\n                \"data-ktp-execute-target\": keytipAttributes[\"data-ktp-execute-target\"],\n                \"data-is-interactable\": !disabled,\n                componentRef: _this._autofill,\n                id: _this._id + \"-input\",\n                className: _this._classNames.input,\n                type: \"text\",\n                onFocus: _this._onFocus,\n                onBlur: _this._onBlur,\n                onKeyDown: _this._onInputKeyDown,\n                onKeyUp: _this._onInputKeyUp,\n                onClick: _this._onAutofillClick,\n                onTouchStart: _this._onTouchStart,\n                onInputValueChange: _this._onInputChange,\n                \"aria-expanded\": isOpen,\n                \"aria-autocomplete\": _this._getAriaAutoCompleteValue(),\n                role: \"combobox\",\n                readOnly: disabled,\n                \"aria-labelledby\": label && _this._id + \"-label\",\n                \"aria-label\": ariaLabel && !label ? ariaLabel : undefined,\n                \"aria-describedby\": errorMessage !== undefined ? (0, _utilities.mergeAriaAttributeValues)(ariaDescribedBy, keytipAttributes[\"aria-describedby\"], errorMessageId) : (0, _utilities.mergeAriaAttributeValues)(ariaDescribedBy, keytipAttributes[\"aria-describedby\"]),\n                \"aria-activedescendant\": _this._getAriaActiveDescendantValue(),\n                \"aria-required\": required,\n                \"aria-disabled\": disabled,\n                \"aria-owns\": isOpen ? _this._id + \"-list\" : undefined,\n                spellCheck: false,\n                defaultVisibleValue: _this._currentVisibleValue,\n                suggestedDisplayValue: suggestedDisplayValue,\n                updateValueInWillReceiveProps: _this._onUpdateValueInAutofillWillReceiveProps,\n                shouldSelectFullInputValueInComponentDidUpdate: _this._onShouldSelectFullInputValueInAutofillComponentDidUpdate,\n                title: title,\n                preventValueSelection: !_this._hasFocus(),\n                placeholder: placeholder,\n                tabIndex: tabIndex\n            }, autofill)), _react.createElement((0, _button.IconButton), (0, _tslib.__assign)({\n                className: \"ms-ComboBox-CaretDown-button\",\n                styles: _this._getCaretButtonStyles(),\n                role: \"presentation\",\n                \"aria-hidden\": isButtonAriaHidden,\n                \"data-is-focusable\": false,\n                tabIndex: -1,\n                onClick: _this._onComboBoxClick,\n                onBlur: _this._onBlur,\n                iconProps: buttonIconProps,\n                disabled: disabled,\n                checked: isOpen\n            }, iconButtonProps)));\n        };\n        /**\n         * componentDidUpdate handler for the auto fill component\n         *\n         * @param defaultVisibleValue - the current defaultVisibleValue in the auto fill's componentDidUpdate\n         * @param suggestedDisplayValue - the current suggestedDisplayValue in the auto fill's componentDidUpdate\n         * @returns - should the full value of the input be selected?\n         * True if the defaultVisibleValue equals the suggestedDisplayValue, false otherwise\n         */ _this._onShouldSelectFullInputValueInAutofillComponentDidUpdate = function() {\n            return _this._currentVisibleValue === _this.state.suggestedDisplayValue;\n        };\n        /**\n         * Get the correct value to pass to the input\n         * to show to the user based off of the current props and state\n         * @returns the value to pass to the input\n         */ _this._getVisibleValue = function() {\n            var _a = _this.props, text = _a.text, allowFreeform = _a.allowFreeform, autoComplete = _a.autoComplete;\n            var _b = _this.state, selectedIndices = _b.selectedIndices, currentPendingValueValidIndex = _b.currentPendingValueValidIndex, currentOptions = _b.currentOptions, currentPendingValue = _b.currentPendingValue, suggestedDisplayValue = _b.suggestedDisplayValue, isOpen = _b.isOpen;\n            var currentPendingIndexValid = _this._indexWithinBounds(currentOptions, currentPendingValueValidIndex);\n            // If the user passed is a value prop, use that\n            // unless we are open and have a valid current pending index\n            if (!(isOpen && currentPendingIndexValid) && text && (currentPendingValue === null || currentPendingValue === undefined)) return text;\n            if (_this.props.multiSelect) {\n                // Multi-select\n                if (_this._hasFocus()) {\n                    var index = -1;\n                    if (autoComplete === \"on\" && currentPendingIndexValid) index = currentPendingValueValidIndex;\n                    return _this._getPendingString(currentPendingValue, currentOptions, index);\n                } else return _this._getMultiselectDisplayString(selectedIndices, currentOptions, suggestedDisplayValue);\n            } else {\n                // Single-select\n                var index = _this._getFirstSelectedIndex();\n                if (allowFreeform) {\n                    // If we are allowing freeform and autocomplete is also true\n                    // and we've got a pending value that matches an option, remember\n                    // the matched option's index\n                    if (autoComplete === \"on\" && currentPendingIndexValid) index = currentPendingValueValidIndex;\n                    // Since we are allowing freeform, if there is currently a pending value, use that\n                    // otherwise use the index determined above (falling back to '' if we did not get a valid index)\n                    return _this._getPendingString(currentPendingValue, currentOptions, index);\n                } else {\n                    // If we are not allowing freeform and have a\n                    // valid index that matches the pending value,\n                    // we know we will need some version of the pending value\n                    if (currentPendingIndexValid && autoComplete === \"on\") {\n                        // If autoComplete is on, return the\n                        // raw pending value, otherwise remember\n                        // the matched option's index\n                        index = currentPendingValueValidIndex;\n                        return _this._normalizeToString(currentPendingValue);\n                    } else if (!_this.state.isOpen && currentPendingValue) return _this._indexWithinBounds(currentOptions, index) ? currentPendingValue : _this._normalizeToString(suggestedDisplayValue);\n                    else return _this._indexWithinBounds(currentOptions, index) ? currentOptions[index].text : _this._normalizeToString(suggestedDisplayValue);\n                }\n            }\n        };\n        /**\n         * Handler for typing changes on the input\n         * @param updatedValue - the newly changed value\n         */ _this._onInputChange = function(updatedValue) {\n            if (_this.props.disabled) {\n                _this._handleInputWhenDisabled(null);\n                return;\n            }\n            _this.props.allowFreeform ? _this._processInputChangeWithFreeform(updatedValue) : _this._processInputChangeWithoutFreeform(updatedValue);\n        };\n        /**\n         * Focus (and select) the content of the input\n         * and set the focused state\n         */ _this._onFocus = function() {\n            if (_this._autofill.current && _this._autofill.current.inputElement) _this._autofill.current.inputElement.select();\n            if (!_this._hasFocus()) _this.setState({\n                focusState: \"focusing\"\n            });\n        };\n        /**\n         * Callback issued when the options should be resolved, if they have been updated or\n         * if they need to be passed in the first time. This only does work if an onResolveOptions\n         * callback was passed in\n         */ _this._onResolveOptions = function() {\n            if (_this.props.onResolveOptions) {\n                // get the options\n                var newOptions = _this.props.onResolveOptions((0, _tslib.__spreadArrays)(_this.state.currentOptions));\n                // Check to see if the returned value is an array, if it is update the state\n                // If the returned value is not an array then check to see if it's a promise or PromiseLike.\n                // If it is then resolve it asynchronously.\n                if (Array.isArray(newOptions)) _this.setState({\n                    currentOptions: newOptions\n                });\n                else if (newOptions && newOptions.then) {\n                    // Ensure that the promise will only use the callback if it was the most recent one\n                    // and update the state when the promise returns\n                    var promise_1 = _this._currentPromise = newOptions;\n                    promise_1.then(function(newOptionsFromPromise) {\n                        if (promise_1 === _this._currentPromise) _this.setState({\n                            currentOptions: newOptionsFromPromise\n                        });\n                    });\n                }\n            }\n        };\n        /**\n         * OnBlur handler. Set the focused state to false\n         * and submit any pending value\n         */ // eslint-disable-next-line deprecation/deprecation\n        _this._onBlur = function(event) {\n            // Do nothing if the blur is coming from something\n            // inside the comboBox root or the comboBox menu since\n            // it we are not really bluring from the whole comboBox\n            var relatedTarget = event.relatedTarget;\n            if (event.relatedTarget === null) // In IE11, due to lack of support, event.relatedTarget is always\n            // null making every onBlur call to be \"outside\" of the ComboBox\n            // even when it's not. Using document.activeElement is another way\n            // for us to be able to get what the relatedTarget without relying\n            // on the event\n            relatedTarget = document.activeElement;\n            if (relatedTarget && (_this._root.current && _this._root.current.contains(relatedTarget) || _this._comboBoxMenu.current && (_this._comboBoxMenu.current.contains(relatedTarget) || // when event coming from the callout containing the comboBox list menu (ex: when scrollBar of the\n            // Callout is clicked) checks if the relatedTarget is a parent of _comboBoxMenu\n            (0, _utilities.findElementRecursive)(_this._comboBoxMenu.current, function(element) {\n                return element === relatedTarget;\n            })))) {\n                event.preventDefault();\n                event.stopPropagation();\n                return;\n            }\n            if (_this._hasFocus()) {\n                _this.setState({\n                    focusState: \"none\"\n                });\n                if (!_this.props.multiSelect || _this.props.allowFreeform) _this._submitPendingValue(event);\n            }\n        };\n        // Render Callout container and pass in list\n        _this._onRenderContainer = function(props) {\n            var onRenderList = props.onRenderList, calloutProps = props.calloutProps, dropdownWidth = props.dropdownWidth, dropdownMaxWidth = props.dropdownMaxWidth, _a = props.onRenderUpperContent, onRenderUpperContent = _a === void 0 ? _this._onRenderUpperContent : _a, _b = props.onRenderLowerContent, onRenderLowerContent = _b === void 0 ? _this._onRenderLowerContent : _b, useComboBoxAsMenuWidth = props.useComboBoxAsMenuWidth, persistMenu = props.persistMenu, _c = props.shouldRestoreFocus, shouldRestoreFocus = _c === void 0 ? true : _c;\n            var isOpen = _this.state.isOpen;\n            var id = _this._id;\n            var comboBoxMenuWidth = useComboBoxAsMenuWidth && _this._comboBoxWrapper.current ? _this._comboBoxWrapper.current.clientWidth + 2 : undefined;\n            return _react.createElement((0, _callout.Callout), (0, _tslib.__assign)({\n                isBeakVisible: false,\n                gapSpace: 0,\n                doNotLayer: false,\n                directionalHint: (0, _directionalHint.DirectionalHint).bottomLeftEdge,\n                directionalHintFixed: false\n            }, calloutProps, {\n                onLayerMounted: _this._onLayerMounted,\n                className: (0, _utilities.css)(_this._classNames.callout, calloutProps ? calloutProps.className : undefined),\n                target: _this._comboBoxWrapper.current,\n                onDismiss: _this._onDismiss,\n                onMouseDown: _this._onCalloutMouseDown,\n                onScroll: _this._onScroll,\n                setInitialFocus: false,\n                calloutWidth: useComboBoxAsMenuWidth && _this._comboBoxWrapper.current ? comboBoxMenuWidth && comboBoxMenuWidth : dropdownWidth,\n                calloutMaxWidth: dropdownMaxWidth ? dropdownMaxWidth : comboBoxMenuWidth,\n                hidden: persistMenu ? !isOpen : undefined,\n                shouldRestoreFocus: shouldRestoreFocus\n            }), onRenderUpperContent(_this.props, _this._onRenderUpperContent), _react.createElement(\"div\", {\n                className: _this._classNames.optionsContainerWrapper,\n                ref: _this._comboBoxMenu\n            }, onRenderList((0, _tslib.__assign)((0, _tslib.__assign)({}, props), {\n                id: id\n            }), _this._onRenderList)), onRenderLowerContent(_this.props, _this._onRenderLowerContent));\n        };\n        _this._onLayerMounted = function() {\n            _this._onCalloutLayerMounted();\n            if (_this.props.calloutProps && _this.props.calloutProps.onLayerMounted) _this.props.calloutProps.onLayerMounted();\n        };\n        _this._onRenderLabel = function(onRenderLabelProps) {\n            var _a = onRenderLabelProps.props, label = _a.label, disabled = _a.disabled, required = _a.required;\n            if (label) return _react.createElement((0, _label.Label), {\n                id: _this._id + \"-label\",\n                disabled: disabled,\n                required: required,\n                className: _this._classNames.label\n            }, label, onRenderLabelProps.multiselectAccessibleText && _react.createElement(\"span\", {\n                className: _this._classNames.screenReaderText\n            }, onRenderLabelProps.multiselectAccessibleText));\n            return null;\n        };\n        // Render List of items\n        _this._onRenderList = function(props) {\n            var _a = props.onRenderItem, onRenderItem = _a === void 0 ? _this._onRenderItem : _a, label = props.label, ariaLabel = props.ariaLabel;\n            var queue = {\n                items: []\n            };\n            var renderedList = [];\n            var id = _this._id;\n            var emptyQueue = function() {\n                var newGroup = queue.id ? [\n                    _react.createElement(\"div\", {\n                        role: \"group\",\n                        key: queue.id,\n                        \"aria-labelledby\": queue.id\n                    }, queue.items), \n                ] : queue.items;\n                renderedList = (0, _tslib.__spreadArrays)(renderedList, newGroup);\n                // Flush items and id\n                queue = {\n                    items: []\n                };\n            };\n            var placeRenderedOptionIntoQueue = function(item, index) {\n                /*\n                  Case Header\n                    empty queue if it's not already empty\n                    ensure unique ID for header and set queue ID\n                    push header into queue\n                  Case Divider\n                    push divider into queue if not first item\n                    empty queue if not already empty\n                  Default\n                    push item into queue\n                */ switch(item.itemType){\n                    case (0, _index1.SelectableOptionMenuItemType).Header:\n                        queue.items.length > 0 && emptyQueue();\n                        id = id + item.key;\n                        queue.items.push(onRenderItem((0, _tslib.__assign)((0, _tslib.__assign)({\n                            id: id\n                        }, item), {\n                            index: index\n                        }), _this._onRenderItem));\n                        queue.id = id;\n                        break;\n                    case (0, _index1.SelectableOptionMenuItemType).Divider:\n                        index > 0 && queue.items.push(onRenderItem((0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                            index: index\n                        }), _this._onRenderItem));\n                        queue.items.length > 0 && emptyQueue();\n                        break;\n                    default:\n                        queue.items.push(onRenderItem((0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                            index: index\n                        }), _this._onRenderItem));\n                }\n            };\n            // Place options into the queue. Queue will be emptied anytime a Header or Divider is encountered\n            props.options.forEach(function(item, index) {\n                placeRenderedOptionIntoQueue(item, index);\n            });\n            // Push remaining items into all renderedList\n            queue.items.length > 0 && emptyQueue();\n            return _react.createElement(\"div\", {\n                id: id + \"-list\",\n                className: _this._classNames.optionsContainer,\n                \"aria-labelledby\": label && id + \"-label\",\n                \"aria-label\": ariaLabel && !label ? ariaLabel : undefined,\n                role: \"listbox\"\n            }, renderedList);\n        };\n        // Render items\n        _this._onRenderItem = function(item) {\n            switch(item.itemType){\n                case (0, _index1.SelectableOptionMenuItemType).Divider:\n                    return _this._renderSeparator(item);\n                case (0, _index1.SelectableOptionMenuItemType).Header:\n                    return _this._renderHeader(item);\n                default:\n                    return _this._renderOption(item);\n            }\n        };\n        // Default _onRenderLowerContent function returns nothing\n        _this._onRenderLowerContent = function() {\n            return null;\n        };\n        // Default _onRenderUpperContent function returns nothing\n        _this._onRenderUpperContent = function() {\n            return null;\n        };\n        _this._renderOption = function(item) {\n            var _a = _this.props.onRenderOption, onRenderOption = _a === void 0 ? _this._onRenderOptionContent : _a;\n            var id = _this._id;\n            var isSelected = _this._isOptionSelected(item.index);\n            var isChecked = _this._isOptionChecked(item.index);\n            var optionStyles = _this._getCurrentOptionStyles(item);\n            var optionClassNames = (0, _comboBoxClassNames.getComboBoxOptionClassNames)(_this._getCurrentOptionStyles(item));\n            var title = _this._getPreviewText(item);\n            var onRenderCheckboxLabel = function() {\n                return onRenderOption(item, _this._onRenderOptionContent);\n            };\n            var getOptionComponent = function() {\n                return !_this.props.multiSelect ? _react.createElement((0, _button.CommandButton), {\n                    id: id + \"-list\" + item.index,\n                    key: item.key,\n                    \"data-index\": item.index,\n                    styles: optionStyles,\n                    checked: isSelected,\n                    className: \"ms-ComboBox-option\",\n                    onClick: _this._onItemClick(item),\n                    // eslint-disable-next-line react/jsx-no-bind\n                    onMouseEnter: _this._onOptionMouseEnter.bind(_this, item.index),\n                    // eslint-disable-next-line react/jsx-no-bind\n                    onMouseMove: _this._onOptionMouseMove.bind(_this, item.index),\n                    onMouseLeave: _this._onOptionMouseLeave,\n                    role: \"option\",\n                    \"aria-selected\": isChecked ? \"true\" : \"false\",\n                    ariaLabel: item.ariaLabel,\n                    disabled: item.disabled,\n                    title: title\n                }, _react.createElement(\"span\", {\n                    className: optionClassNames.optionTextWrapper,\n                    ref: isSelected ? _this._selectedElement : undefined\n                }, onRenderOption(item, _this._onRenderOptionContent))) : _react.createElement((0, _checkbox.Checkbox), {\n                    id: id + \"-list\" + item.index,\n                    ariaLabel: item.ariaLabel,\n                    key: item.key,\n                    styles: optionStyles,\n                    className: \"ms-ComboBox-option\",\n                    onChange: _this._onItemClick(item),\n                    label: item.text,\n                    checked: isChecked,\n                    title: title,\n                    disabled: item.disabled,\n                    // eslint-disable-next-line react/jsx-no-bind\n                    onRenderLabel: onRenderCheckboxLabel,\n                    inputProps: (0, _tslib.__assign)({\n                        // aria-selected should only be applied to checked items, not hovered items\n                        \"aria-selected\": isChecked ? \"true\" : \"false\",\n                        role: \"option\"\n                    }, {\n                        \"data-index\": item.index,\n                        \"data-is-focusable\": true\n                    })\n                });\n            };\n            return _react.createElement(ComboBoxOptionWrapper, {\n                key: item.key,\n                index: item.index,\n                disabled: item.disabled,\n                isSelected: isSelected,\n                isChecked: isChecked,\n                text: item.text,\n                // eslint-disable-next-line react/jsx-no-bind\n                render: getOptionComponent,\n                data: item.data\n            });\n        };\n        /**\n         * Mouse clicks to headers, dividers and scrollbar should not make input lose focus\n         */ _this._onCalloutMouseDown = function(ev) {\n            ev.preventDefault();\n        };\n        /**\n         * Scroll handler for the callout to make sure the mouse events\n         * for updating focus are not interacting during scroll\n         */ _this._onScroll = function() {\n            if (!_this._isScrollIdle && _this._scrollIdleTimeoutId !== undefined) {\n                _this._async.clearTimeout(_this._scrollIdleTimeoutId);\n                _this._scrollIdleTimeoutId = undefined;\n            } else _this._isScrollIdle = false;\n            _this._scrollIdleTimeoutId = _this._async.setTimeout(function() {\n                _this._isScrollIdle = true;\n            }, ScrollIdleDelay);\n        };\n        _this._onRenderOptionContent = function(item) {\n            var optionClassNames = (0, _comboBoxClassNames.getComboBoxOptionClassNames)(_this._getCurrentOptionStyles(item));\n            return _react.createElement(\"span\", {\n                className: optionClassNames.optionText\n            }, item.text);\n        };\n        /**\n         * Handles dismissing (cancelling) the menu\n         */ _this._onDismiss = function() {\n            var onMenuDismiss = _this.props.onMenuDismiss;\n            if (onMenuDismiss) onMenuDismiss();\n            // In persistMode we need to simulate callout layer mount\n            // since that only happens once. We do it on dismiss since\n            // it works either way.\n            if (_this.props.persistMenu) _this._onCalloutLayerMounted();\n            // close the menu\n            _this._setOpenStateAndFocusOnClose(false, false);\n            // reset the selected index\n            // to the last value state\n            _this._resetSelectedIndex();\n        };\n        _this._onAfterClearPendingInfo = function() {\n            _this._processingClearPendingInfo = false;\n        };\n        /**\n         * Handle keydown on the input\n         * @param ev - The keyboard event that was fired\n         */ _this._onInputKeyDown = function(ev) {\n            var _a = _this.props, disabled = _a.disabled, allowFreeform = _a.allowFreeform, autoComplete = _a.autoComplete;\n            var _b = _this.state, isOpen = _b.isOpen, currentOptions = _b.currentOptions, currentPendingValueValidIndexOnHover = _b.currentPendingValueValidIndexOnHover;\n            // Take note if we are processing an alt (option) or meta (command) keydown.\n            // See comment in _onInputKeyUp for reasoning.\n            _this._lastKeyDownWasAltOrMeta = _this._isAltOrMeta(ev);\n            if (disabled) {\n                _this._handleInputWhenDisabled(ev);\n                return;\n            }\n            var index = _this._getPendingSelectedIndex(false);\n            switch(ev.which){\n                case (0, _utilities.KeyCodes).enter:\n                    if (_this._autofill.current && _this._autofill.current.inputElement) _this._autofill.current.inputElement.select();\n                    _this._submitPendingValue(ev);\n                    if (_this.props.multiSelect && isOpen) _this.setState({\n                        currentPendingValueValidIndex: index\n                    });\n                    else // On enter submit the pending value\n                    if (isOpen || (!allowFreeform || _this.state.currentPendingValue === undefined || _this.state.currentPendingValue === null || _this.state.currentPendingValue.length <= 0) && _this.state.currentPendingValueValidIndex < 0) // if we are open or\n                    // if we are not allowing freeform or\n                    // our we have no pending value\n                    // and no valid pending index\n                    // flip the open state\n                    _this.setState({\n                        isOpen: !isOpen\n                    });\n                    break;\n                case (0, _utilities.KeyCodes).tab:\n                    // On enter submit the pending value\n                    if (!_this.props.multiSelect) _this._submitPendingValue(ev);\n                    // If we are not allowing freeform\n                    // or the comboBox is open, flip the open state\n                    if (isOpen) _this._setOpenStateAndFocusOnClose(!isOpen, false);\n                    // Allow TAB to propigate\n                    return;\n                case (0, _utilities.KeyCodes).escape:\n                    // reset the selected index\n                    _this._resetSelectedIndex();\n                    // Close the menu if opened\n                    if (isOpen) _this.setState({\n                        isOpen: false\n                    });\n                    else return;\n                    break;\n                case (0, _utilities.KeyCodes).up:\n                    // if we are in clearAll state (e.g. the user as hovering\n                    // and has since mousedOut of the menu items),\n                    // go to the last index\n                    if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) index = _this.state.currentOptions.length;\n                    if (ev.altKey || ev.metaKey) {\n                        // Close the menu if it is open and break so\n                        // that the event get stopPropagation and prevent default.\n                        // Otherwise, we need to let the event continue to propagate\n                        if (isOpen) {\n                            _this._setOpenStateAndFocusOnClose(!isOpen, true);\n                            break;\n                        }\n                        return;\n                    }\n                    // Go to the previous option\n                    _this._setPendingInfoFromIndexAndDirection(index, SearchDirection.backward);\n                    break;\n                case (0, _utilities.KeyCodes).down:\n                    // Expand the comboBox on ALT + DownArrow\n                    if (ev.altKey || ev.metaKey) _this._setOpenStateAndFocusOnClose(true, true);\n                    else {\n                        // if we are in clearAll state (e.g. the user as hovering\n                        // and has since mousedOut of the menu items),\n                        // go to the first index\n                        if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) index = -1;\n                        // Got to the next option\n                        _this._setPendingInfoFromIndexAndDirection(index, SearchDirection.forward);\n                    }\n                    break;\n                case (0, _utilities.KeyCodes).home:\n                case (0, _utilities.KeyCodes).end:\n                    if (allowFreeform) return;\n                    // Set the initial values to respond to HOME\n                    // which goes to the first selectable option\n                    index = -1;\n                    var directionToSearch = SearchDirection.forward;\n                    // If end, update the values to respond to END\n                    // which goes to the last selectable option\n                    if (ev.which === (0, _utilities.KeyCodes).end) {\n                        index = currentOptions.length;\n                        directionToSearch = SearchDirection.backward;\n                    }\n                    _this._setPendingInfoFromIndexAndDirection(index, directionToSearch);\n                    break;\n                /* eslint-disable no-fallthrough */ case (0, _utilities.KeyCodes).space:\n                    // event handled in _onComboBoxKeyUp\n                    if (!allowFreeform && autoComplete === \"off\") break;\n                default:\n                    /* eslint-enable no-fallthrough */ // are we processing a function key? if so bail out\n                    if (ev.which >= 112 /* F1 */  && ev.which <= 123 /* F12 */ ) return;\n                    // If we get here and we got either and ALT key\n                    // or meta key, let the event propagate\n                    if (ev.keyCode === (0, _utilities.KeyCodes).alt || ev.key === \"Meta\" /* && isOpen */ ) return;\n                    // If we are not allowing freeform and\n                    // allowing autoComplete, handle the input here\n                    // since we have marked the input as readonly\n                    if (!allowFreeform && autoComplete === \"on\") {\n                        _this._onInputChange(ev.key);\n                        break;\n                    }\n                    // allow the key to propagate by default\n                    return;\n            }\n            ev.stopPropagation();\n            ev.preventDefault();\n        };\n        /**\n         * Handle keyup on the input\n         * @param ev - the keyboard event that was fired\n         */ _this._onInputKeyUp = function(ev) {\n            var _a = _this.props, disabled = _a.disabled, allowFreeform = _a.allowFreeform, autoComplete = _a.autoComplete;\n            var isOpen = _this.state.isOpen;\n            // We close the menu on key up only if ALL of the following are true:\n            // - Most recent key down was alt or meta (command)\n            // - The alt/meta key down was NOT followed by some other key (such as down/up arrow to\n            //   expand/collapse the menu)\n            // - We're not on a Mac (or iOS)\n            // This is because on Windows, pressing alt moves focus to the application menu bar or similar,\n            // closing any open context menus. There is not a similar behavior on Macs.\n            var keyPressIsAltOrMetaAlone = _this._lastKeyDownWasAltOrMeta && _this._isAltOrMeta(ev);\n            _this._lastKeyDownWasAltOrMeta = false;\n            var shouldHandleKey = keyPressIsAltOrMetaAlone && !((0, _utilities.isMac)() || (0, _utilities.isIOS)());\n            if (disabled) {\n                _this._handleInputWhenDisabled(ev);\n                return;\n            }\n            switch(ev.which){\n                case (0, _utilities.KeyCodes).space:\n                    // If we are not allowing freeform and are not autoComplete\n                    // make space expand/collapse the comboBox\n                    // and allow the event to propagate\n                    if (!allowFreeform && autoComplete === \"off\") _this._setOpenStateAndFocusOnClose(!isOpen, !!isOpen);\n                    return;\n                default:\n                    if (shouldHandleKey && isOpen) _this._setOpenStateAndFocusOnClose(!isOpen, true);\n                    else {\n                        if (_this.state.focusState === \"focusing\" && _this.props.openOnKeyboardFocus) _this.setState({\n                            isOpen: true\n                        });\n                        if (_this.state.focusState !== \"focused\") _this.setState({\n                            focusState: \"focused\"\n                        });\n                    }\n                    return;\n            }\n        };\n        _this._onOptionMouseLeave = function() {\n            if (_this._shouldIgnoreMouseEvent()) return;\n            // Ignore the event in persistMenu mode if the callout has\n            // closed. This is to avoid clearing the visuals on item click.\n            if (_this.props.persistMenu && !_this.state.isOpen) return;\n            _this.setState({\n                currentPendingValueValidIndexOnHover: HoverStatus.clearAll\n            });\n        };\n        /**\n         * Click handler for the button of the comboBox\n         * and the input when not allowing freeform. This\n         * toggles the expand/collapse state of the comboBox (if enbled)\n         */ _this._onComboBoxClick = function() {\n            var disabled = _this.props.disabled;\n            var isOpen = _this.state.isOpen;\n            if (!disabled) {\n                _this._setOpenStateAndFocusOnClose(!isOpen, false);\n                _this.setState({\n                    focusState: \"focused\"\n                });\n            }\n        };\n        /**\n         * Click handler for the autofill.\n         */ _this._onAutofillClick = function() {\n            var _a = _this.props, disabled = _a.disabled, allowFreeform = _a.allowFreeform;\n            if (allowFreeform && !disabled) _this.focus(_this.state.isOpen || _this._processingTouch);\n            else _this._onComboBoxClick();\n        };\n        _this._onTouchStart = function() {\n            if (_this._comboBoxWrapper.current && !(\"onpointerdown\" in _this._comboBoxWrapper)) _this._handleTouchAndPointerEvent();\n        };\n        _this._onPointerDown = function(ev) {\n            if (ev.pointerType === \"touch\") {\n                _this._handleTouchAndPointerEvent();\n                ev.preventDefault();\n                ev.stopImmediatePropagation();\n            }\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._events = new (0, _utilities.EventGroup)(_this);\n        (0, _utilities.warnMutuallyExclusive)(COMPONENT_NAME, props1, {\n            defaultSelectedKey: \"selectedKey\",\n            text: \"defaultSelectedKey\",\n            selectedKey: \"value\",\n            dropdownWidth: \"useComboBoxAsMenuWidth\",\n            ariaLabel: \"label\"\n        });\n        _this._id = props1.id || (0, _utilities.getId)(\"ComboBox\");\n        var selectedKeys = _this._buildDefaultSelectedKeys(props1.defaultSelectedKey, props1.selectedKey);\n        _this._isScrollIdle = true;\n        _this._processingTouch = false;\n        _this._gotMouseMove = false;\n        _this._processingClearPendingInfo = false;\n        var initialSelectedIndices = _this._getSelectedIndices(props1.options, selectedKeys);\n        _this.state = {\n            isOpen: false,\n            selectedIndices: initialSelectedIndices,\n            focusState: \"none\",\n            suggestedDisplayValue: undefined,\n            currentOptions: _this.props.options,\n            currentPendingValueValidIndex: -1,\n            currentPendingValue: undefined,\n            currentPendingValueValidIndexOnHover: HoverStatus.default\n        };\n        return _this;\n    }\n    Object.defineProperty(ComboBox1.prototype, \"selectedOptions\", {\n        /**\n         * All selected options\n         */ get: function() {\n            var _a = this.state, currentOptions = _a.currentOptions, selectedIndices = _a.selectedIndices;\n            return (0, _index1.getAllSelectedOptions)(currentOptions, selectedIndices);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ComboBox1.prototype.componentDidMount = function() {\n        if (this._comboBoxWrapper.current && !this.props.disabled) {\n            // hook up resolving the options if needed on focus\n            this._events.on(this._comboBoxWrapper.current, \"focus\", this._onResolveOptions, true);\n            if (\"onpointerdown\" in this._comboBoxWrapper.current) // For ComboBoxes, touching anywhere in the combo box should drop the dropdown, including the input element.\n            // This gives more hit target space for touch environments. We're setting the onpointerdown here, because React\n            // does not support Pointer events yet.\n            this._events.on(this._comboBoxWrapper.current, \"pointerdown\", this._onPointerDown, true);\n        }\n    };\n    ComboBox1.prototype.UNSAFE_componentWillReceiveProps = function(newProps) {\n        // Update the selectedIndex and currentOptions state if\n        // the selectedKey, value, or options have changed\n        if (newProps.selectedKey !== this.props.selectedKey || newProps.text !== this.props.text || newProps.options !== this.props.options) {\n            var selectedKeys = this._buildSelectedKeys(newProps.selectedKey);\n            var indices = this._getSelectedIndices(newProps.options, selectedKeys);\n            this.setState({\n                selectedIndices: indices,\n                currentOptions: newProps.options\n            });\n            if (newProps.selectedKey === null) this.setState({\n                suggestedDisplayValue: undefined\n            });\n        }\n    };\n    ComboBox1.prototype.componentDidUpdate = function(prevProps, prevState) {\n        var _this = this;\n        var _a = this.props, allowFreeform = _a.allowFreeform, text = _a.text, onMenuOpen = _a.onMenuOpen, onMenuDismissed = _a.onMenuDismissed;\n        var _b = this.state, isOpen = _b.isOpen, selectedIndices = _b.selectedIndices, currentPendingValueValidIndex = _b.currentPendingValueValidIndex;\n        // If we are newly open or are open and the pending valid index changed,\n        // make sure the currently selected/pending option is scrolled into view\n        if (isOpen && (!prevState.isOpen || prevState.currentPendingValueValidIndex !== currentPendingValueValidIndex)) // Need this timeout so that the selectedElement ref is correctly updated\n        this._async.setTimeout(function() {\n            return _this._scrollIntoView();\n        }, 0);\n        // if an action is taken that put focus in the ComboBox\n        // and If we are open or we are just closed, shouldFocusAfterClose is set,\n        // but we are not the activeElement set focus on the input\n        if (this._hasFocus() && (isOpen || prevState.isOpen && !isOpen && this._focusInputAfterClose && this._autofill.current && document.activeElement !== this._autofill.current.inputElement)) this.focus(undefined /*shouldOpenOnFocus*/ , true);\n        // If we should focusAfterClose AND\n        //   just opened/closed the menu OR\n        //   are focused AND\n        //     updated the selectedIndex with the menu closed OR\n        //     are not allowing freeform OR\n        //     the value changed\n        // we need to set selection\n        if (this._focusInputAfterClose && (prevState.isOpen && !isOpen || this._hasFocus() && (!isOpen && !this.props.multiSelect && prevState.selectedIndices && selectedIndices && prevState.selectedIndices[0] !== selectedIndices[0] || !allowFreeform || text !== prevProps.text))) this._onFocus();\n        this._notifyPendingValueChanged(prevState);\n        if (isOpen && !prevState.isOpen && onMenuOpen) onMenuOpen();\n        if (!isOpen && prevState.isOpen && onMenuDismissed) onMenuDismissed();\n    };\n    ComboBox1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n    };\n    // Primary Render\n    ComboBox1.prototype.render = function() {\n        var _this = this;\n        var id = this._id;\n        var errorMessageId = id + \"-error\";\n        var _a = this.props, className = _a.className, disabled = _a.disabled, required = _a.required, errorMessage = _a.errorMessage, _b = _a.onRenderContainer, onRenderContainer = _b === void 0 ? this._onRenderContainer : _b, _c = _a.onRenderLabel, onRenderLabel = _c === void 0 ? this._onRenderLabel : _c, _d = _a.onRenderList, onRenderList = _d === void 0 ? this._onRenderList : _d, _e = _a.onRenderItem, onRenderItem = _e === void 0 ? this._onRenderItem : _e, _f = _a.onRenderOption, onRenderOption = _f === void 0 ? this._onRenderOptionContent : _f, allowFreeform = _a.allowFreeform, customStyles = _a.styles, theme = _a.theme, keytipProps = _a.keytipProps, persistMenu = _a.persistMenu, multiSelect = _a.multiSelect;\n        var _g = this.state, isOpen = _g.isOpen, suggestedDisplayValue = _g.suggestedDisplayValue;\n        this._currentVisibleValue = this._getVisibleValue();\n        // Single select is already accessible since the whole text is selected\n        // when focus enters the input. Since multiselect appears to clear the input\n        // it needs special accessible text\n        var multiselectAccessibleText = multiSelect ? this._getMultiselectDisplayString(this.state.selectedIndices, this.state.currentOptions, suggestedDisplayValue) : undefined;\n        var divProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties), [\n            \"onChange\",\n            \"value\", \n        ]);\n        var hasErrorMessage = errorMessage && errorMessage.length > 0 ? true : false;\n        this._classNames = this.props.getClassNames ? this.props.getClassNames(theme, !!isOpen, !!disabled, !!required, !!this._hasFocus(), !!allowFreeform, !!hasErrorMessage, className) : (0, _comboBoxClassNames.getClassNames)((0, _comboBoxStyles.getStyles)(theme, customStyles), className, !!isOpen, !!disabled, !!required, !!this._hasFocus(), !!allowFreeform, !!hasErrorMessage);\n        var comboBoxWrapper = keytipProps ? _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: keytipProps,\n            disabled: disabled\n        }, function(keytipAttributes) {\n            return _this._renderComboBoxWrapper(multiselectAccessibleText, errorMessageId, keytipAttributes);\n        }) : this._renderComboBoxWrapper(multiselectAccessibleText, errorMessageId);\n        return _react.createElement(\"div\", (0, _tslib.__assign)({}, divProps, {\n            ref: this._root,\n            className: this._classNames.container\n        }), onRenderLabel({\n            props: this.props,\n            multiselectAccessibleText: multiselectAccessibleText\n        }, this._onRenderLabel), comboBoxWrapper, (persistMenu || isOpen) && onRenderContainer((0, _tslib.__assign)((0, _tslib.__assign)({}, this.props), {\n            onRenderList: onRenderList,\n            onRenderItem: onRenderItem,\n            onRenderOption: onRenderOption,\n            options: this.state.currentOptions.map(function(item, index) {\n                return (0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                    index: index\n                });\n            }),\n            onDismiss: this._onDismiss\n        }), this._onRenderContainer), hasErrorMessage && _react.createElement(\"div\", {\n            role: \"alert\",\n            id: errorMessageId,\n            className: this._classNames.errorMessage\n        }, errorMessage));\n    };\n    ComboBox1.prototype._getPendingString = function(currentPendingValue, currentOptions, index) {\n        return currentPendingValue !== null && currentPendingValue !== undefined ? currentPendingValue : this._indexWithinBounds(currentOptions, index) ? currentOptions[index].text : \"\";\n    };\n    /**\n     * Returns a string that concatenates all of the selected values\n     * for multiselect combobox.\n     */ ComboBox1.prototype._getMultiselectDisplayString = function(selectedIndices, currentOptions, suggestedDisplayValue) {\n        var displayValues = [];\n        for(var idx = 0; selectedIndices && idx < selectedIndices.length; idx++){\n            var index = selectedIndices[idx];\n            displayValues.push(this._indexWithinBounds(currentOptions, index) ? currentOptions[index].text : this._normalizeToString(suggestedDisplayValue));\n        }\n        var _a = this.props.multiSelectDelimiter, multiSelectDelimiter = _a === void 0 ? \", \" : _a;\n        return displayValues.join(multiSelectDelimiter);\n    };\n    /**\n     * Is the index within the bounds of the array?\n     * @param options - options to check if the index is valid for\n     * @param index - the index to check\n     * @returns - true if the index is valid for the given options, false otherwise\n     */ ComboBox1.prototype._indexWithinBounds = function(options, index) {\n        if (!options) return false;\n        return index >= 0 && index < options.length;\n    };\n    /**\n     * Process the new input's new value when the comboBox\n     * allows freeform entry\n     * @param updatedValue - the input's newly changed value\n     */ ComboBox1.prototype._processInputChangeWithFreeform = function(updatedValue) {\n        var _this = this;\n        var currentOptions = this.state.currentOptions;\n        var newCurrentPendingValueValidIndex = -1;\n        // if the new value is empty, see if we have an exact match\n        // and then set the pending info\n        if (updatedValue === \"\") {\n            var items = currentOptions.map(function(item, index) {\n                return (0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                    index: index\n                });\n            }).filter(function(option) {\n                return option.itemType !== (0, _index1.SelectableOptionMenuItemType).Header && option.itemType !== (0, _index1.SelectableOptionMenuItemType).Divider;\n            }).filter(function(option) {\n                return _this._getPreviewText(option) === updatedValue;\n            });\n            // if we found a match remember the index\n            if (items.length === 1) newCurrentPendingValueValidIndex = items[0].index;\n            this._setPendingInfo(updatedValue, newCurrentPendingValueValidIndex, updatedValue);\n            return;\n        }\n        // Remember the original value and then,\n        // make the value lowercase for comparison\n        var originalUpdatedValue = updatedValue;\n        updatedValue = updatedValue.toLocaleLowerCase();\n        var newSuggestedDisplayValue = \"\";\n        // If autoComplete is on, attempt to find a match from the available options\n        if (this.props.autoComplete === \"on\") {\n            // If autoComplete is on, attempt to find a match where the text of an option starts with the updated value\n            var items = currentOptions.map(function(item, index) {\n                return (0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                    index: index\n                });\n            }).filter(function(option) {\n                return option.itemType !== (0, _index1.SelectableOptionMenuItemType).Header && option.itemType !== (0, _index1.SelectableOptionMenuItemType).Divider;\n            }).filter(function(option) {\n                return _this._getPreviewText(option).toLocaleLowerCase().indexOf(updatedValue) === 0;\n            });\n            if (items.length > 0) {\n                // use ariaLabel as the value when the option is set\n                var text = this._getPreviewText(items[0]);\n                // If the user typed out the complete option text, we don't need any suggested display text anymore\n                newSuggestedDisplayValue = text.toLocaleLowerCase() !== updatedValue ? text : \"\";\n                // remember the index of the match we found\n                newCurrentPendingValueValidIndex = items[0].index;\n            }\n        } else {\n            // If autoComplete is off, attempt to find a match only when the value is exactly equal to the text of an option\n            var items = currentOptions.map(function(item, index) {\n                return (0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                    index: index\n                });\n            }).filter(function(option) {\n                return option.itemType !== (0, _index1.SelectableOptionMenuItemType).Header && option.itemType !== (0, _index1.SelectableOptionMenuItemType).Divider;\n            }).filter(function(option) {\n                return _this._getPreviewText(option).toLocaleLowerCase() === updatedValue;\n            });\n            // if we found a match remember the index\n            if (items.length === 1) newCurrentPendingValueValidIndex = items[0].index;\n        }\n        // Set the updated state\n        this._setPendingInfo(originalUpdatedValue, newCurrentPendingValueValidIndex, newSuggestedDisplayValue);\n    };\n    /**\n     * Process the new input's new value when the comboBox\n     * does not allow freeform entry\n     * @param updatedValue - the input's newly changed value\n     */ ComboBox1.prototype._processInputChangeWithoutFreeform = function(updatedValue) {\n        var _this = this;\n        var _a = this.state, currentPendingValue = _a.currentPendingValue, currentPendingValueValidIndex = _a.currentPendingValueValidIndex, currentOptions = _a.currentOptions;\n        if (this.props.autoComplete === \"on\") // If autoComplete is on while allow freeform is off,\n        // we will remember the keypresses and build up a string to attempt to match\n        // as long as characters are typed within a the timeout span of each other,\n        // otherwise we will clear the string and start building a new one on the next keypress.\n        // Also, only do this processing if we have a non-empty value\n        {\n            if (updatedValue !== \"\") {\n                // If we have a pending autocomplete clearing task,\n                // we know that the user is typing with keypresses happening\n                // within the timeout of each other so remove the clearing task\n                // and continue building the pending value with the udpated value\n                if (this._lastReadOnlyAutoCompleteChangeTimeoutId !== undefined) {\n                    this._async.clearTimeout(this._lastReadOnlyAutoCompleteChangeTimeoutId);\n                    this._lastReadOnlyAutoCompleteChangeTimeoutId = undefined;\n                    updatedValue = this._normalizeToString(currentPendingValue) + updatedValue;\n                }\n                var originalUpdatedValue = updatedValue;\n                updatedValue = updatedValue.toLocaleLowerCase();\n                // If autoComplete is on, attempt to find a match where the text of an option starts with the updated value\n                var items = currentOptions.map(function(item, i) {\n                    return (0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                        index: i\n                    });\n                }).filter(function(option) {\n                    return option.itemType !== (0, _index1.SelectableOptionMenuItemType).Header && option.itemType !== (0, _index1.SelectableOptionMenuItemType).Divider;\n                }).filter(function(option) {\n                    return option.text.toLocaleLowerCase().indexOf(updatedValue) === 0;\n                });\n                // If we found a match, udpdate the state\n                if (items.length > 0) this._setPendingInfo(originalUpdatedValue, items[0].index, this._getPreviewText(items[0]));\n                // Schedule a timeout to clear the pending value after the timeout span\n                this._lastReadOnlyAutoCompleteChangeTimeoutId = this._async.setTimeout(function() {\n                    _this._lastReadOnlyAutoCompleteChangeTimeoutId = undefined;\n                }, ReadOnlyPendingAutoCompleteTimeout);\n                return;\n            }\n        }\n        // If we get here, either autoComplete is on or we did not find a match with autoComplete on.\n        // Remember we are not allowing freeform, so at this point, if we have a pending valid value index\n        // use that; otherwise use the selectedIndex\n        var index = currentPendingValueValidIndex >= 0 ? currentPendingValueValidIndex : this._getFirstSelectedIndex();\n        // Since we are not allowing freeform, we need to\n        // set both the pending and suggested values/index\n        // to allow us to select all content in the input to\n        // give the illusion that we are readonly (e.g. freeform off)\n        this._setPendingInfoFromIndex(index);\n    };\n    ComboBox1.prototype._getFirstSelectedIndex = function() {\n        return this.state.selectedIndices && this.state.selectedIndices.length > 0 ? this.state.selectedIndices[0] : -1;\n    };\n    /**\n     * Walk along the options starting at the index, stepping by the delta (positive or negative)\n     * looking for the next valid selectable index (e.g. skipping headings and dividers)\n     * @param index - the index to get the next selectable index from\n     * @param delta - optional delta to step by when finding the next index, defaults to 0\n     * @returns - the next valid selectable index. If the new index is outside of the bounds,\n     * it will snap to the edge of the options array. If delta == 0 and the given index is not selectable\n     */ ComboBox1.prototype._getNextSelectableIndex = function(index, searchDirection) {\n        var currentOptions = this.state.currentOptions;\n        var newIndex = index + searchDirection;\n        newIndex = Math.max(0, Math.min(currentOptions.length - 1, newIndex));\n        if (!this._indexWithinBounds(currentOptions, newIndex)) return -1;\n        var option = currentOptions[newIndex];\n        if (option.itemType === (0, _index1.SelectableOptionMenuItemType).Header || option.itemType === (0, _index1.SelectableOptionMenuItemType).Divider || option.hidden === true) {\n            // Should we continue looking for an index to select?\n            if (searchDirection !== SearchDirection.none && (newIndex > 0 && searchDirection < SearchDirection.none || newIndex >= 0 && newIndex < currentOptions.length && searchDirection > SearchDirection.none)) newIndex = this._getNextSelectableIndex(newIndex, searchDirection);\n            else // If we cannot perform a useful search just return the index we were given\n            return index;\n        }\n        // We have the next valid selectable index, return it\n        return newIndex;\n    };\n    /**\n     * Set the selected index. Note, this is\n     * the \"real\" selected index, not the pending selected index\n     * @param index - the index to set (or the index to set from if a search direction is provided)\n     * @param searchDirection - the direction to search along the options from the given index\n     */ ComboBox1.prototype._setSelectedIndex = function(index, submitPendingValueEvent, searchDirection) {\n        var _this = this;\n        if (searchDirection === void 0) searchDirection = SearchDirection.none;\n        var _a = this.props, onChange = _a.onChange, onPendingValueChanged = _a.onPendingValueChanged;\n        var currentOptions = this.state.currentOptions;\n        var initialIndices = this.state.selectedIndices;\n        // Clone selectedIndices so we don't mutate state\n        var selectedIndices = initialIndices ? initialIndices.slice() : [];\n        // Find the next selectable index, if searchDirection is none\n        // we will get our starting index back\n        index = this._getNextSelectableIndex(index, searchDirection);\n        if (!this._indexWithinBounds(currentOptions, index)) return;\n        // Are we at a new index? If so, update the state, otherwise\n        // there is nothing to do\n        if (this.props.multiSelect || selectedIndices.length < 1 || selectedIndices.length === 1 && selectedIndices[0] !== index) {\n            var option_1 = (0, _tslib.__assign)({}, currentOptions[index]);\n            // if option doesn't existing, or option is disabled, we noop\n            if (!option_1 || option_1.disabled) return;\n            if (this.props.multiSelect) {\n                // Setting the initial state of option.selected in Multi-select combobox by checking the\n                // selectedIndices array and overriding the undefined issue\n                option_1.selected = option_1.selected !== undefined ? !option_1.selected : selectedIndices.indexOf(index) < 0;\n                if (option_1.selected && selectedIndices.indexOf(index) < 0) selectedIndices.push(index);\n                else if (!option_1.selected && selectedIndices.indexOf(index) >= 0) selectedIndices = selectedIndices.filter(function(value) {\n                    return value !== index;\n                });\n            } else selectedIndices[0] = index;\n            submitPendingValueEvent.persist();\n            // Only setstate if combobox is uncontrolled.\n            if (this.props.selectedKey || this.props.selectedKey === null) {\n                // If ComboBox value is changed, revert preview first\n                if (this._hasPendingValue && onPendingValueChanged) {\n                    onPendingValueChanged();\n                    this._hasPendingValue = false;\n                }\n                if (onChange) onChange(submitPendingValueEvent, option_1, index, undefined);\n            } else {\n                // Update current options\n                var changedOptions = currentOptions.slice();\n                changedOptions[index] = option_1;\n                // Call onChange after state is updated\n                this.setState({\n                    selectedIndices: selectedIndices,\n                    currentOptions: changedOptions\n                }, function() {\n                    // If ComboBox value is changed, revert preview first\n                    if (_this._hasPendingValue && onPendingValueChanged) {\n                        onPendingValueChanged();\n                        _this._hasPendingValue = false;\n                    }\n                    if (onChange) onChange(submitPendingValueEvent, option_1, index, undefined);\n                });\n            }\n        }\n        if (this.props.multiSelect && this.state.isOpen) return;\n        // clear all of the pending info\n        this._clearPendingInfo();\n    };\n    /**\n     * Submit a pending value if there is one\n     */ ComboBox1.prototype._submitPendingValue = function(submitPendingValueEvent) {\n        var _a = this.props, onChange = _a.onChange, allowFreeform = _a.allowFreeform, autoComplete = _a.autoComplete;\n        var _b = this.state, currentPendingValue = _b.currentPendingValue, currentPendingValueValidIndex = _b.currentPendingValueValidIndex, currentOptions = _b.currentOptions, currentPendingValueValidIndexOnHover = _b.currentPendingValueValidIndexOnHover;\n        var selectedIndices = this.state.selectedIndices;\n        // Do not submit any pending value if we\n        // have already initiated clearing the pending info\n        if (this._processingClearPendingInfo) return;\n        // If we allow freeform we need to handle that\n        if (allowFreeform) {\n            // if currentPendingValue is null or undefined the user did not submit anything\n            // (not even empty because we would have stored that as the pending value)\n            if (currentPendingValue === null || currentPendingValue === undefined) {\n                // if a user did not type anything they may just hovered over an item\n                if (currentPendingValueValidIndexOnHover >= 0) {\n                    this._setSelectedIndex(currentPendingValueValidIndexOnHover, submitPendingValueEvent);\n                    this._clearPendingInfo();\n                }\n                return;\n            }\n            // Check to see if the user typed an exact match\n            if (this._indexWithinBounds(currentOptions, currentPendingValueValidIndex)) {\n                var pendingOptionText = this._getPreviewText(currentOptions[currentPendingValueValidIndex]).toLocaleLowerCase();\n                // By exact match, that means: our pending value is the same as the pending option text OR\n                // the pending option starts with the pending value and we have an \"autoComplete\" selection\n                // where the total length is equal to pending option length OR\n                // the live value in the underlying input matches the pending option; update the state\n                if (currentPendingValue.toLocaleLowerCase() === pendingOptionText || autoComplete && pendingOptionText.indexOf(currentPendingValue.toLocaleLowerCase()) === 0 && this._autofill.current && this._autofill.current.isValueSelected && currentPendingValue.length + (this._autofill.current.selectionEnd - this._autofill.current.selectionStart) === pendingOptionText.length || this._autofill.current && this._autofill.current.inputElement && this._autofill.current.inputElement.value.toLocaleLowerCase() === pendingOptionText) {\n                    this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent);\n                    if (this.props.multiSelect && this.state.isOpen) return;\n                    this._clearPendingInfo();\n                    return;\n                }\n            }\n            if (onChange) {\n                if (onChange) // trigger onChange to clear value\n                onChange(submitPendingValueEvent, undefined, undefined, currentPendingValue);\n            } else {\n                // If we are not controlled, create a new selected option\n                var newOption = {\n                    key: currentPendingValue || (0, _utilities.getId)(),\n                    text: this._normalizeToString(currentPendingValue)\n                };\n                // If it's multiselect, set selected state to true\n                if (this.props.multiSelect) newOption.selected = true;\n                var newOptions = currentOptions.concat([\n                    newOption\n                ]);\n                if (selectedIndices) {\n                    if (!this.props.multiSelect) selectedIndices = [];\n                    selectedIndices.push(newOptions.length - 1);\n                }\n                this.setState({\n                    currentOptions: newOptions,\n                    selectedIndices: selectedIndices\n                });\n            }\n        } else if (currentPendingValueValidIndex >= 0) // Since we are not allowing freeform, we must have a matching\n        // to be able to update state\n        this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent);\n        else if (currentPendingValueValidIndexOnHover >= 0) // If all else failed and we were hovering over an item, select it\n        this._setSelectedIndex(currentPendingValueValidIndexOnHover, submitPendingValueEvent);\n        // Finally, clear the pending info\n        this._clearPendingInfo();\n    };\n    ComboBox1.prototype._onCalloutLayerMounted = function() {\n        // In persistMenu mode _onLayerMounted is only called once for the lifetime\n        // of the component. Any functionality required for callout \"on mount\" can\n        // go here so that we can also call it again during callout dismissal to reset\n        // object state.\n        this._gotMouseMove = false;\n    };\n    // Render separator\n    ComboBox1.prototype._renderSeparator = function(item) {\n        var index = item.index, key = item.key;\n        if (index && index > 0) return _react.createElement(\"div\", {\n            role: \"separator\",\n            key: key,\n            className: this._classNames.divider\n        });\n        return null;\n    };\n    ComboBox1.prototype._renderHeader = function(item) {\n        var _a = this.props.onRenderOption, onRenderOption = _a === void 0 ? this._onRenderOptionContent : _a;\n        return _react.createElement(\"div\", {\n            id: item.id,\n            key: item.key,\n            className: this._classNames.header\n        }, onRenderOption(item, this._onRenderOptionContent));\n    };\n    /**\n     * If we are coming from a mouseOut:\n     * there is no visible selected option.\n     *\n     * Else if We are hovering over an item:\n     * that gets the selected look.\n     *\n     * Else:\n     * Use the current valid pending index if it exists OR\n     * we do not have a valid index and we currently have a pending input value,\n     * otherwise use the selected index\n     * */ ComboBox1.prototype._isOptionSelected = function(index) {\n        var currentPendingValueValidIndexOnHover = this.state.currentPendingValueValidIndexOnHover;\n        // If the hover state is set to clearAll, don't show a selected index.\n        // Note, this happens when the user moused out of the menu items\n        if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) return false;\n        return this._getPendingSelectedIndex(true) === index ? true : false;\n    };\n    ComboBox1.prototype._isOptionChecked = function(index) {\n        if (this.props.multiSelect && index !== undefined && this.state.selectedIndices) {\n            var idxOfSelectedIndex = -1;\n            idxOfSelectedIndex = this.state.selectedIndices.indexOf(index);\n            return idxOfSelectedIndex >= 0;\n        }\n        return false;\n    };\n    /**\n     * Gets the pending selected index taking into account hover, valueValidIndex, and selectedIndex\n     * @param includeCurrentPendingValue - Should we include the currentPendingValue when\n     * finding the index\n     */ ComboBox1.prototype._getPendingSelectedIndex = function(includeCurrentPendingValue) {\n        var _a = this.state, currentPendingValueValidIndexOnHover = _a.currentPendingValueValidIndexOnHover, currentPendingValueValidIndex = _a.currentPendingValueValidIndex, currentPendingValue = _a.currentPendingValue;\n        return currentPendingValueValidIndexOnHover >= 0 ? currentPendingValueValidIndexOnHover : currentPendingValueValidIndex >= 0 || includeCurrentPendingValue && currentPendingValue !== null && currentPendingValue !== undefined ? currentPendingValueValidIndex : this.props.multiSelect ? 0 : this._getFirstSelectedIndex();\n    };\n    /**\n     * Scroll the selected element into view\n     */ ComboBox1.prototype._scrollIntoView = function() {\n        var _a = this.props, onScrollToItem = _a.onScrollToItem, scrollSelectedToTop = _a.scrollSelectedToTop;\n        var _b = this.state, currentPendingValueValidIndex = _b.currentPendingValueValidIndex, currentPendingValue = _b.currentPendingValue;\n        if (onScrollToItem) // Use the custom scroll handler\n        onScrollToItem(currentPendingValueValidIndex >= 0 || currentPendingValue !== \"\" ? currentPendingValueValidIndex : this._getFirstSelectedIndex());\n        else if (this._selectedElement.current && this._selectedElement.current.offsetParent) {\n            // We are using refs, scroll the ref into view\n            if (scrollSelectedToTop) this._selectedElement.current.offsetParent.scrollIntoView(true);\n            else {\n                var alignToTop = true;\n                if (this._comboBoxMenu.current && this._comboBoxMenu.current.offsetParent) {\n                    var scrollableParentRect = this._comboBoxMenu.current.offsetParent.getBoundingClientRect();\n                    var selectedElementRect = this._selectedElement.current.offsetParent.getBoundingClientRect();\n                    // If we are completely in view then we do not need to scroll\n                    if (scrollableParentRect.top <= selectedElementRect.top && scrollableParentRect.top + scrollableParentRect.height >= selectedElementRect.top + selectedElementRect.height) return;\n                    // If we are lower than the scrollable parent viewport then we should align to the bottom\n                    if (scrollableParentRect.top + scrollableParentRect.height <= selectedElementRect.top + selectedElementRect.height) alignToTop = false;\n                }\n                this._selectedElement.current.offsetParent.scrollIntoView(alignToTop);\n            }\n        }\n    };\n    /**\n     * Click handler for the menu items\n     * to select the item and also close the menu\n     * @param index - the index of the item that was clicked\n     */ ComboBox1.prototype._onItemClick = function(item) {\n        var _this = this;\n        var onItemClick = this.props.onItemClick;\n        var index = item.index;\n        return function(ev) {\n            // only close the callout when it's in single-select mode\n            if (!_this.props.multiSelect) {\n                // ensure that focus returns to the input, not the button\n                _this._autofill.current && _this._autofill.current.focus();\n                _this.setState({\n                    isOpen: false\n                });\n            }\n            // Continue processing the click only after\n            // performing menu close / control focus(inner working)\n            onItemClick && onItemClick(ev, item, index);\n            _this._setSelectedIndex(index, ev);\n        };\n    };\n    /**\n     * Get the indices of the options that are marked as selected\n     * @param options - the comboBox options\n     * @param selectedKeys - the known selected keys to find\n     * @returns - an array of the indices of the selected options, empty array if nothing is selected\n     */ ComboBox1.prototype._getSelectedIndices = function(options, selectedKeys) {\n        if (!options || !selectedKeys) return [];\n        var selectedIndices = {};\n        options.forEach(function(option, index) {\n            if (option.selected) selectedIndices[index] = true;\n        });\n        var _loop_1 = function(selectedKey) {\n            var index = (0, _utilities.findIndex)(options, function(option) {\n                return option.key === selectedKey;\n            });\n            if (index > -1) selectedIndices[index] = true;\n        };\n        for(var _i = 0, selectedKeys_1 = selectedKeys; _i < selectedKeys_1.length; _i++){\n            var selectedKey1 = selectedKeys_1[_i];\n            _loop_1(selectedKey1);\n        }\n        return Object.keys(selectedIndices).map(Number).sort();\n    };\n    /**\n     * Reset the selected index by clearing the\n     * input (of any pending text), clearing the pending state,\n     * and setting the suggested display value to the last\n     * selected state text\n     */ ComboBox1.prototype._resetSelectedIndex = function() {\n        var currentOptions = this.state.currentOptions;\n        this._clearPendingInfo();\n        var selectedIndex = this._getFirstSelectedIndex();\n        if (selectedIndex > 0 && selectedIndex < currentOptions.length) this.setState({\n            suggestedDisplayValue: currentOptions[selectedIndex].text\n        });\n        else if (this.props.text) // If we had a value initially, restore it\n        this.setState({\n            suggestedDisplayValue: this.props.text\n        });\n    };\n    /**\n     * Clears the pending info state\n     */ ComboBox1.prototype._clearPendingInfo = function() {\n        this._processingClearPendingInfo = true;\n        this.setState({\n            currentPendingValue: undefined,\n            currentPendingValueValidIndex: -1,\n            suggestedDisplayValue: undefined,\n            currentPendingValueValidIndexOnHover: HoverStatus.default\n        }, this._onAfterClearPendingInfo);\n    };\n    /**\n     * Set the pending info\n     * @param currentPendingValue - new pending value to set\n     * @param currentPendingValueValidIndex - new pending value index to set\n     * @param suggestedDisplayValue - new suggest display value to set\n     */ ComboBox1.prototype._setPendingInfo = function(currentPendingValue, currentPendingValueValidIndex, suggestedDisplayValue) {\n        if (currentPendingValueValidIndex === void 0) currentPendingValueValidIndex = -1;\n        if (this._processingClearPendingInfo) return;\n        this.setState({\n            currentPendingValue: this._normalizeToString(currentPendingValue),\n            currentPendingValueValidIndex: currentPendingValueValidIndex,\n            suggestedDisplayValue: suggestedDisplayValue,\n            currentPendingValueValidIndexOnHover: HoverStatus.default\n        });\n    };\n    /**\n     * Set the pending info from the given index\n     * @param index - the index to set the pending info from\n     */ ComboBox1.prototype._setPendingInfoFromIndex = function(index) {\n        var currentOptions = this.state.currentOptions;\n        if (index >= 0 && index < currentOptions.length) {\n            var option = currentOptions[index];\n            this._setPendingInfo(this._getPreviewText(option), index, this._getPreviewText(option));\n        } else this._clearPendingInfo();\n    };\n    /**\n     * Sets the pending info for the comboBox\n     * @param index - the index to search from\n     * @param searchDirection - the direction to search\n     */ ComboBox1.prototype._setPendingInfoFromIndexAndDirection = function(index, searchDirection) {\n        var currentOptions = this.state.currentOptions;\n        // update index to allow content to wrap\n        if (searchDirection === SearchDirection.forward && index >= currentOptions.length - 1) index = -1;\n        else if (searchDirection === SearchDirection.backward && index <= 0) index = currentOptions.length;\n        // get the next \"valid\" index\n        var indexUpdate = this._getNextSelectableIndex(index, searchDirection);\n        // if the two indicies are equal we didn't move and\n        // we should attempt to get  get the first/last \"valid\" index to use\n        // (Note, this takes care of the potential cases where the first/last\n        // item is not focusable), otherwise use the updated index\n        if (index === indexUpdate) {\n            if (searchDirection === SearchDirection.forward) index = this._getNextSelectableIndex(-1, searchDirection);\n            else if (searchDirection === SearchDirection.backward) index = this._getNextSelectableIndex(currentOptions.length, searchDirection);\n        } else index = indexUpdate;\n        if (this._indexWithinBounds(currentOptions, index)) this._setPendingInfoFromIndex(index);\n    };\n    ComboBox1.prototype._notifyPendingValueChanged = function(prevState) {\n        var onPendingValueChanged = this.props.onPendingValueChanged;\n        if (!onPendingValueChanged) return;\n        var _a = this.state, currentPendingValue = _a.currentPendingValue, currentOptions = _a.currentOptions, currentPendingValueValidIndex = _a.currentPendingValueValidIndex, currentPendingValueValidIndexOnHover = _a.currentPendingValueValidIndexOnHover;\n        var newPendingIndex = undefined;\n        var newPendingValue = undefined;\n        if (currentPendingValueValidIndexOnHover !== prevState.currentPendingValueValidIndexOnHover && this._indexWithinBounds(currentOptions, currentPendingValueValidIndexOnHover)) // Set new pending index if hover index was changed\n        newPendingIndex = currentPendingValueValidIndexOnHover;\n        else if (currentPendingValueValidIndex !== prevState.currentPendingValueValidIndex && this._indexWithinBounds(currentOptions, currentPendingValueValidIndex)) // Set new pending index if currentPendingValueValidIndex was changed\n        newPendingIndex = currentPendingValueValidIndex;\n        else if (currentPendingValue !== prevState.currentPendingValue) // Set pendingValue in the case it was changed and no index was changed\n        newPendingValue = currentPendingValue;\n        // Notify when there is a new pending index/value. Also, if there is a pending value, it needs to send undefined.\n        if (newPendingIndex !== undefined || newPendingValue !== undefined || this._hasPendingValue) {\n            onPendingValueChanged(newPendingIndex !== undefined ? currentOptions[newPendingIndex] : undefined, newPendingIndex, newPendingValue);\n            this._hasPendingValue = newPendingIndex !== undefined || newPendingValue !== undefined;\n        }\n    };\n    /**\n     * Sets the isOpen state and updates focusInputAfterClose\n     */ ComboBox1.prototype._setOpenStateAndFocusOnClose = function(isOpen, focusInputAfterClose) {\n        this._focusInputAfterClose = focusInputAfterClose;\n        this.setState({\n            isOpen: isOpen\n        });\n    };\n    /**\n     * Returns true if the key for the event is alt (Mac option) or meta (Mac command).\n     */ ComboBox1.prototype._isAltOrMeta = function(ev) {\n        return ev.which === (0, _utilities.KeyCodes).alt || ev.key === \"Meta\";\n    };\n    ComboBox1.prototype._onOptionMouseEnter = function(index) {\n        if (this._shouldIgnoreMouseEvent()) return;\n        this.setState({\n            currentPendingValueValidIndexOnHover: index\n        });\n    };\n    ComboBox1.prototype._onOptionMouseMove = function(index) {\n        this._gotMouseMove = true;\n        if (!this._isScrollIdle || this.state.currentPendingValueValidIndexOnHover === index) return;\n        this.setState({\n            currentPendingValueValidIndexOnHover: index\n        });\n    };\n    ComboBox1.prototype._shouldIgnoreMouseEvent = function() {\n        return !this._isScrollIdle || !this._gotMouseMove;\n    };\n    /**\n     * Handle dismissing the menu and\n     * eating the required key event when disabled\n     * @param ev - the keyboard event that was fired\n     */ ComboBox1.prototype._handleInputWhenDisabled = function(ev) {\n        // If we are disabled, close the menu (if needed)\n        // and eat all keystokes other than TAB or ESC\n        if (this.props.disabled) {\n            if (this.state.isOpen) this.setState({\n                isOpen: false\n            });\n            // When disabled stop propagation and prevent default\n            // of the event unless we have a tab, escape, or function key\n            if (ev !== null && ev.which !== (0, _utilities.KeyCodes).tab && ev.which !== (0, _utilities.KeyCodes).escape && (ev.which < 112 /* F1 */  || ev.which > 123)) {\n                ev.stopPropagation();\n                ev.preventDefault();\n            }\n        }\n    };\n    ComboBox1.prototype._handleTouchAndPointerEvent = function() {\n        var _this = this;\n        // If we already have an existing timeeout from a previous touch and pointer event\n        // cancel that timeout so we can set a nwe one.\n        if (this._lastTouchTimeoutId !== undefined) {\n            this._async.clearTimeout(this._lastTouchTimeoutId);\n            this._lastTouchTimeoutId = undefined;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n            _this._processingTouch = false;\n            _this._lastTouchTimeoutId = undefined;\n        }, TouchIdleDelay);\n    };\n    /**\n     * Get the styles for the current option.\n     * @param item - Item props for the current option\n     */ ComboBox1.prototype._getCaretButtonStyles = function() {\n        var customCaretDownButtonStyles = this.props.caretDownButtonStyles;\n        return (0, _comboBoxStyles.getCaretDownButtonStyles)(this.props.theme, customCaretDownButtonStyles);\n    };\n    /**\n     * Get the styles for the current option.\n     * @param item - Item props for the current option\n     */ ComboBox1.prototype._getCurrentOptionStyles = function(item) {\n        var customStylesForAllOptions = this.props.comboBoxOptionStyles;\n        var customStylesForCurrentOption = item.styles;\n        return (0, _comboBoxStyles.getOptionStyles)(this.props.theme, customStylesForAllOptions, customStylesForCurrentOption, this._isPendingOption(item), item.hidden);\n    };\n    /**\n     * Get the aria-activedescendant value for the comboxbox.\n     * @returns the id of the current focused combo item, otherwise the id of the currently selected element,\n     * null otherwise\n     */ ComboBox1.prototype._getAriaActiveDescendantValue = function() {\n        var descendantText = this.state.isOpen && this.state.selectedIndices && this.state.selectedIndices.length > 0 ? this._id + \"-list\" + this.state.selectedIndices[0] : undefined;\n        if (this.state.isOpen && this._hasFocus() && this.state.currentPendingValueValidIndex !== -1) descendantText = this._id + \"-list\" + this.state.currentPendingValueValidIndex;\n        return descendantText;\n    };\n    /**\n     * Get the aria autocomplete value for the Combobox\n     * @returns 'inline' if auto-complete automatically dynamic, 'both' if we have a list of possible values to pick from\n     * and can dynamically populate input, and 'none' if auto-complete is not enabled as we can't give user inputs.\n     */ ComboBox1.prototype._getAriaAutoCompleteValue = function() {\n        var autoComplete = !this.props.disabled && this.props.autoComplete === \"on\";\n        return autoComplete ? this.props.allowFreeform ? \"inline\" : \"both\" : \"none\";\n    };\n    ComboBox1.prototype._isPendingOption = function(item) {\n        return item && item.index === this.state.currentPendingValueValidIndex;\n    };\n    /**\n     * Given default selected key(s) and selected key(s), return the selected keys(s).\n     * When default selected key(s) are available, they take precedence and return them instead of selected key(s).\n     *\n     * @returns No matter what specific types the input parameters are, always return an array of\n     *  either strings or numbers instead of premitive type.  This normlization makes caller's logic easier.\n     */ ComboBox1.prototype._buildDefaultSelectedKeys = function(defaultSelectedKey, selectedKey) {\n        var selectedKeys = this._buildSelectedKeys(defaultSelectedKey);\n        if (selectedKeys.length) return selectedKeys;\n        return this._buildSelectedKeys(selectedKey);\n    };\n    ComboBox1.prototype._buildSelectedKeys = function(selectedKey) {\n        if (selectedKey === undefined) return [];\n        // need to cast here so typescript does not complain\n        return selectedKey instanceof Array ? selectedKey : [\n            selectedKey\n        ];\n    };\n    // For scenarios where the option's text prop contains embedded styles, we use the option's\n    // ariaLabel value as the text in the input and for autocomplete matching. We know to use this\n    // when the useAriaLabelAsText prop is set to true\n    ComboBox1.prototype._getPreviewText = function(item) {\n        return item.useAriaLabelAsText && item.ariaLabel ? item.ariaLabel : item.text;\n    };\n    ComboBox1.prototype._normalizeToString = function(value) {\n        return value || \"\";\n    };\n    /**\n     * Returns true if the component has some kind of focus. If it's either focusing or if it's focused\n     */ ComboBox1.prototype._hasFocus = function() {\n        return this.state.focusState !== \"none\";\n    };\n    ComboBox1.defaultProps = {\n        options: [],\n        allowFreeform: false,\n        autoComplete: \"on\",\n        buttonIconProps: {\n            iconName: \"ChevronDown\"\n        }\n    };\n    ComboBox1 = (0, _tslib.__decorate)([\n        (0, _utilities.customizable)(\"ComboBox\", [\n            \"theme\",\n            \"styles\"\n        ], true)\n    ], ComboBox1);\n    return ComboBox1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../Autofill/index\":\"bziI7\",\"../../Utilities\":\"2F07a\",\"../../Callout\":\"jhXLC\",\"../../Checkbox\":\"dT3QJ\",\"../../Button\":\"eMzbU\",\"../../common/DirectionalHint\":\"kARBR\",\"./ComboBox.styles\":\"9B0nw\",\"./ComboBox.classNames\":\"eg5E0\",\"../../KeytipData\":\"e8VIa\",\"../../Label\":\"lLA6C\",\"../../utilities/selectableOption/index\":\"h4B52\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bziI7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _autofill = require(\"./Autofill\");\nparcelHelpers.exportAll(_autofill, exports);\n\n},{\"./Autofill\":\"43aJV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"43aJV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Autofill\", ()=>Autofill);\nparcelHelpers.export(exports, \"BaseAutoFill\", ()=>BaseAutoFill);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar SELECTION_FORWARD = \"forward\";\nvar SELECTION_BACKWARD = \"backward\";\n/**\n * {@docCategory Autofill}\n */ var Autofill = /** @class */ function(_super) {\n    (0, _tslib.__extends)(Autofill1, _super);\n    function Autofill1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._inputElement = _react.createRef();\n        _this._autoFillEnabled = true;\n        _this._isComposing = false;\n        // Composition events are used when the character/text requires several keystrokes to be completed.\n        // Some examples of this are mobile text input and langauges like Japanese or Arabic.\n        // Find out more at https://developer.mozilla.org/en-US/docs/Web/Events/compositionstart\n        _this._onCompositionStart = function(ev) {\n            _this._isComposing = true;\n            _this._autoFillEnabled = false;\n        };\n        // Composition events are used when the character/text requires several keystrokes to be completed.\n        // Some examples of this are mobile text input and languages like Japanese or Arabic.\n        // Find out more at https://developer.mozilla.org/en-US/docs/Web/Events/compositionstart\n        _this._onCompositionUpdate = function() {\n            if ((0, _utilities.isIE11)()) _this._updateValue(_this._getCurrentInputValue(), true);\n        };\n        // Composition events are used when the character/text requires several keystrokes to be completed.\n        // Some examples of this are mobile text input and langauges like Japanese or Arabic.\n        // Find out more at https://developer.mozilla.org/en-US/docs/Web/Events/compositionstart\n        _this._onCompositionEnd = function(ev) {\n            var inputValue = _this._getCurrentInputValue();\n            _this._tryEnableAutofill(inputValue, _this.value, false, true);\n            _this._isComposing = false;\n            // Due to timing, this needs to be async, otherwise no text will be selected.\n            _this._async.setTimeout(function() {\n                // it's technically possible that the value of _isComposing is reset during this timeout,\n                // so explicitly trigger this with composing=true here, since it is supposed to be the\n                // update for composition end\n                _this._updateValue(_this._getCurrentInputValue(), false);\n            }, 0);\n        };\n        _this._onClick = function() {\n            if (_this._value && _this._value !== \"\" && _this._autoFillEnabled) _this._autoFillEnabled = false;\n        };\n        _this._onKeyDown = function(ev) {\n            if (_this.props.onKeyDown) _this.props.onKeyDown(ev);\n            // If the event is actively being composed, then don't alert autofill.\n            // Right now typing does not have isComposing, once that has been fixed any should be removed.\n            if (!ev.nativeEvent.isComposing) switch(ev.which){\n                case (0, _utilities.KeyCodes).backspace:\n                    _this._autoFillEnabled = false;\n                    break;\n                case (0, _utilities.KeyCodes).left:\n                case (0, _utilities.KeyCodes).right:\n                    if (_this._autoFillEnabled) {\n                        _this._value = _this.state.displayValue;\n                        _this._autoFillEnabled = false;\n                    }\n                    break;\n                default:\n                    if (!_this._autoFillEnabled) {\n                        if (_this.props.enableAutofillOnKeyPress.indexOf(ev.which) !== -1) _this._autoFillEnabled = true;\n                    }\n                    break;\n            }\n        };\n        _this._onInputChanged = function(ev) {\n            var value = _this._getCurrentInputValue(ev);\n            if (!_this._isComposing) _this._tryEnableAutofill(value, _this._value, ev.nativeEvent.isComposing);\n            // If it is not IE11 and currently composing, update the value\n            if (!((0, _utilities.isIE11)() && _this._isComposing)) {\n                var nativeEventComposing = ev.nativeEvent.isComposing;\n                var isComposing = nativeEventComposing === undefined ? _this._isComposing : nativeEventComposing;\n                _this._updateValue(value, isComposing);\n            }\n        };\n        _this._onChanged = function() {\n            // Swallow this event, we don't care about it\n            // We must provide it because React PropTypes marks it as required, but onInput serves the correct purpose\n            return;\n        };\n        /**\n         * Updates the current input value as well as getting a new display value.\n         * @param newValue - The new value from the input\n         */ _this._updateValue = function(newValue, composing) {\n            // Only proceed if the value is nonempty and is different from the old value\n            // This is to work around the fact that, in IE 11, inputs with a placeholder fire an onInput event on focus\n            if (!newValue && newValue === _this._value) return;\n            _this._value = _this.props.onInputChange ? _this.props.onInputChange(newValue, composing) : newValue;\n            _this.setState({\n                displayValue: _this._getDisplayValue(_this._value, _this.props.suggestedDisplayValue)\n            }, function() {\n                return _this._notifyInputChange(_this._value, composing);\n            });\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._value = props.defaultVisibleValue || \"\";\n        _this.state = {\n            displayValue: props.defaultVisibleValue || \"\"\n        };\n        return _this;\n    }\n    Object.defineProperty(Autofill1.prototype, \"cursorLocation\", {\n        get: function() {\n            if (this._inputElement.current) {\n                var inputElement = this._inputElement.current;\n                if (inputElement.selectionDirection !== SELECTION_FORWARD) return inputElement.selectionEnd;\n                else return inputElement.selectionStart;\n            } else return -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Autofill1.prototype, \"isValueSelected\", {\n        get: function() {\n            return Boolean(this.inputElement && this.inputElement.selectionStart !== this.inputElement.selectionEnd);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Autofill1.prototype, \"value\", {\n        get: function() {\n            return this._value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Autofill1.prototype, \"selectionStart\", {\n        get: function() {\n            return this._inputElement.current ? this._inputElement.current.selectionStart : -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Autofill1.prototype, \"selectionEnd\", {\n        get: function() {\n            return this._inputElement.current ? this._inputElement.current.selectionEnd : -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(Autofill1.prototype, \"inputElement\", {\n        get: function() {\n            return this._inputElement.current;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Autofill1.prototype.UNSAFE_componentWillReceiveProps = function(nextProps) {\n        if (this.props.updateValueInWillReceiveProps) {\n            var updatedInputValue = this.props.updateValueInWillReceiveProps();\n            // Don't update if we have a null value or the value isn't changing\n            // the value should still update if an empty string is passed in\n            if (updatedInputValue !== null && updatedInputValue !== this._value) this._value = updatedInputValue;\n        }\n        var newDisplayValue = this._getDisplayValue(this._value, nextProps.suggestedDisplayValue);\n        if (typeof newDisplayValue === \"string\") this.setState({\n            displayValue: newDisplayValue\n        });\n    };\n    Autofill1.prototype.componentDidUpdate = function() {\n        var value = this._value;\n        var _a = this.props, suggestedDisplayValue = _a.suggestedDisplayValue, shouldSelectFullInputValueInComponentDidUpdate = _a.shouldSelectFullInputValueInComponentDidUpdate, preventValueSelection = _a.preventValueSelection;\n        var differenceIndex = 0;\n        if (preventValueSelection) return;\n        if (this._autoFillEnabled && value && suggestedDisplayValue && this._doesTextStartWith(suggestedDisplayValue, value)) {\n            var shouldSelectFullRange = false;\n            if (shouldSelectFullInputValueInComponentDidUpdate) shouldSelectFullRange = shouldSelectFullInputValueInComponentDidUpdate();\n            if (shouldSelectFullRange && this._inputElement.current) this._inputElement.current.setSelectionRange(0, suggestedDisplayValue.length, SELECTION_BACKWARD);\n            else {\n                while(differenceIndex < value.length && value[differenceIndex].toLocaleLowerCase() === suggestedDisplayValue[differenceIndex].toLocaleLowerCase())differenceIndex++;\n                if (differenceIndex > 0 && this._inputElement.current) this._inputElement.current.setSelectionRange(differenceIndex, suggestedDisplayValue.length, SELECTION_BACKWARD);\n            }\n        }\n    };\n    Autofill1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n    };\n    Autofill1.prototype.render = function() {\n        var displayValue = this.state.displayValue;\n        var nativeProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.inputProperties));\n        return _react.createElement(\"input\", (0, _tslib.__assign)({\n            autoCapitalize: \"off\",\n            autoComplete: \"off\",\n            \"aria-autocomplete\": \"both\"\n        }, nativeProps, {\n            ref: this._inputElement,\n            value: displayValue,\n            onCompositionStart: this._onCompositionStart,\n            onCompositionUpdate: this._onCompositionUpdate,\n            onCompositionEnd: this._onCompositionEnd,\n            // TODO (Fabric 8?) - switch to calling only onChange. See notes in TextField._onInputChange.\n            onChange: this._onChanged,\n            onInput: this._onInputChanged,\n            onKeyDown: this._onKeyDown,\n            onClick: this.props.onClick ? this.props.onClick : this._onClick,\n            \"data-lpignore\": true\n        }));\n    };\n    Autofill1.prototype.focus = function() {\n        this._inputElement.current && this._inputElement.current.focus();\n    };\n    Autofill1.prototype.clear = function() {\n        this._autoFillEnabled = true;\n        this._updateValue(\"\", false);\n        this._inputElement.current && this._inputElement.current.setSelectionRange(0, 0);\n    };\n    Autofill1.prototype._getCurrentInputValue = function(ev) {\n        if (ev && ev.target && ev.target.value) return ev.target.value;\n        else if (this.inputElement && this.inputElement.value) return this.inputElement.value;\n        else return \"\";\n    };\n    /**\n     * Attempts to enable autofill. Whether or not autofill is enabled depends on the input value,\n     * whether or not any text is selected, and only if the new input value is longer than the old input value.\n     * Autofill should never be set to true if the value is composing. Once compositionEnd is called, then\n     * it should be completed.\n     * See https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent for more information on composition.\n     * @param newValue - new input value\n     * @param oldValue - old input value\n     * @param isComposing - if true then the text is actively being composed and it has not completed.\n     * @param isComposed - if the text is a composed text value.\n     */ Autofill1.prototype._tryEnableAutofill = function(newValue, oldValue, isComposing, isComposed) {\n        if (!isComposing && newValue && this._inputElement.current && this._inputElement.current.selectionStart === newValue.length && !this._autoFillEnabled && (newValue.length > oldValue.length || isComposed)) this._autoFillEnabled = true;\n    };\n    Autofill1.prototype._notifyInputChange = function(newValue, composing) {\n        if (this.props.onInputValueChange) this.props.onInputValueChange(newValue, composing);\n    };\n    /**\n     * Returns a string that should be used as the display value.\n     * It evaluates this based on whether or not the suggested value starts with the input value\n     * and whether or not autofill is enabled.\n     * @param inputValue - the value that the input currently has.\n     * @param suggestedDisplayValue - the possible full value\n     */ Autofill1.prototype._getDisplayValue = function(inputValue, suggestedDisplayValue) {\n        var displayValue = inputValue;\n        if (suggestedDisplayValue && inputValue && this._doesTextStartWith(suggestedDisplayValue, displayValue) && this._autoFillEnabled) displayValue = suggestedDisplayValue;\n        return displayValue;\n    };\n    Autofill1.prototype._doesTextStartWith = function(text, startWith) {\n        if (!text || !startWith) return false;\n        return text.toLocaleLowerCase().indexOf(startWith.toLocaleLowerCase()) === 0;\n    };\n    Autofill1.defaultProps = {\n        enableAutofillOnKeyPress: [\n            (0, _utilities.KeyCodes).down,\n            (0, _utilities.KeyCodes).up\n        ]\n    };\n    return Autofill1;\n}(_react.Component);\n/**\n *  @deprecated do not use.\n * {@docCategory Autofill}\n */ var BaseAutoFill = /** @class */ function(_super) {\n    (0, _tslib.__extends)(BaseAutoFill1, _super);\n    function BaseAutoFill1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    return BaseAutoFill1;\n}(Autofill);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dT3QJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Checkbox/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Checkbox/index\":\"ixAQC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ixAQC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _checkbox = require(\"./Checkbox\");\nparcelHelpers.exportAll(_checkbox, exports);\nvar _checkboxBase = require(\"./Checkbox.base\");\nparcelHelpers.exportAll(_checkboxBase, exports);\n\n},{\"./Checkbox\":\"02j3x\",\"./Checkbox.base\":\"2jefX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"02j3x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Checkbox\", ()=>Checkbox);\nvar _utilities = require(\"../../Utilities\");\nvar _checkboxBase = require(\"./Checkbox.base\");\nvar _checkboxStyles = require(\"./Checkbox.styles\");\nvar Checkbox = (0, _utilities.styled)((0, _checkboxBase.CheckboxBase), (0, _checkboxStyles.getStyles), undefined, {\n    scope: \"Checkbox\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Checkbox.base\":\"2jefX\",\"./Checkbox.styles\":\"hCixG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2jefX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CheckboxBase\", ()=>CheckboxBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _icon = require(\"../../Icon\");\nvar _keytipData = require(\"../../KeytipData\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar CheckboxBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(CheckboxBase1, _super);\n    /**\n     * Initialize a new instance of the Checkbox\n     * @param props - Props for the component\n     * @param context - Context or initial state for the base component.\n     */ function CheckboxBase1(props1, context) {\n        var _this = _super.call(this, props1, context) || this;\n        _this._checkBox = _react.createRef();\n        _this._renderContent = function(checked, indeterminate, keytipAttributes) {\n            if (keytipAttributes === void 0) keytipAttributes = {};\n            var _a = _this.props, disabled = _a.disabled, inputProps = _a.inputProps, name = _a.name, ariaLabel = _a.ariaLabel, ariaLabelledBy = _a.ariaLabelledBy, ariaDescribedBy = _a.ariaDescribedBy, _b = _a.onRenderLabel, onRenderLabel = _b === void 0 ? _this._onRenderLabel : _b, checkmarkIconProps = _a.checkmarkIconProps, ariaPositionInSet = _a.ariaPositionInSet, ariaSetSize = _a.ariaSetSize, title = _a.title, label = _a.label;\n            return _react.createElement(\"div\", {\n                className: _this._classNames.root,\n                title: title\n            }, _react.createElement((0, _utilities.FocusRects), null), _react.createElement(\"input\", (0, _tslib.__assign)({\n                type: \"checkbox\"\n            }, inputProps, {\n                \"data-ktp-execute-target\": keytipAttributes[\"data-ktp-execute-target\"],\n                checked: checked,\n                disabled: disabled,\n                className: _this._classNames.input,\n                ref: _this._checkBox,\n                name: name,\n                id: _this._id,\n                title: title,\n                onChange: _this._onChange,\n                onFocus: _this._onFocus,\n                onBlur: _this._onBlur,\n                \"aria-disabled\": disabled,\n                \"aria-label\": ariaLabel || label,\n                \"aria-labelledby\": ariaLabelledBy,\n                \"aria-describedby\": (0, _utilities.mergeAriaAttributeValues)(ariaDescribedBy, keytipAttributes[\"aria-describedby\"]),\n                \"aria-posinset\": ariaPositionInSet,\n                \"aria-setsize\": ariaSetSize,\n                \"aria-checked\": indeterminate ? \"mixed\" : checked ? \"true\" : \"false\"\n            })), _react.createElement(\"label\", {\n                className: _this._classNames.label,\n                htmlFor: _this._id\n            }, _react.createElement(\"div\", {\n                className: _this._classNames.checkbox,\n                \"data-ktp-target\": keytipAttributes[\"data-ktp-target\"]\n            }, _react.createElement((0, _icon.Icon), (0, _tslib.__assign)({\n                iconName: \"CheckMark\"\n            }, checkmarkIconProps, {\n                className: _this._classNames.checkmark\n            }))), onRenderLabel(_this.props, _this._onRenderLabel)));\n        };\n        _this._onFocus = function(ev) {\n            var inputProps = _this.props.inputProps;\n            if (inputProps && inputProps.onFocus) inputProps.onFocus(ev);\n        };\n        _this._onBlur = function(ev) {\n            var inputProps = _this.props.inputProps;\n            if (inputProps && inputProps.onBlur) inputProps.onBlur(ev);\n        };\n        _this._onChange = function(ev) {\n            var onChange = _this.props.onChange;\n            var _a = _this.state, isChecked = _a.isChecked, isIndeterminate = _a.isIndeterminate;\n            if (!isIndeterminate) {\n                if (onChange) onChange(ev, !isChecked);\n                if (_this.props.checked === undefined) _this.setState({\n                    isChecked: !isChecked\n                });\n            } else {\n                // If indeterminate, clicking the checkbox *only* removes the indeterminate state (or if\n                // controlled, lets the consumer know to change it by calling onChange). It doesn't\n                // change the checked state.\n                if (onChange) onChange(ev, isChecked);\n                if (_this.props.indeterminate === undefined) _this.setState({\n                    isIndeterminate: false\n                });\n            }\n        };\n        _this._onRenderLabel = function(props) {\n            var label = props.label, title = props.title;\n            return label ? _react.createElement(\"span\", {\n                \"aria-hidden\": \"true\",\n                className: _this._classNames.text,\n                title: title\n            }, label) : null;\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        _this._id = _this.props.id || (0, _utilities.getId)(\"checkbox-\");\n        _this.state = {\n            isChecked: !!(props1.checked !== undefined ? props1.checked : props1.defaultChecked),\n            isIndeterminate: !!(props1.indeterminate !== undefined ? props1.indeterminate : props1.defaultIndeterminate)\n        };\n        return _this;\n    }\n    CheckboxBase1.getDerivedStateFromProps = function(nextProps, prevState) {\n        var stateUpdate = {};\n        if (nextProps.indeterminate !== undefined) stateUpdate.isIndeterminate = !!nextProps.indeterminate;\n        if (nextProps.checked !== undefined) stateUpdate.isChecked = !!nextProps.checked;\n        return Object.keys(stateUpdate).length ? stateUpdate : null;\n    };\n    /**\n     * Render the Checkbox based on passed props\n     */ CheckboxBase1.prototype.render = function() {\n        var _this = this;\n        var _a = this.props, className = _a.className, disabled = _a.disabled, boxSide = _a.boxSide, theme = _a.theme, styles = _a.styles, _b = _a.onRenderLabel, onRenderLabel = _b === void 0 ? this._onRenderLabel : _b, keytipProps = _a.keytipProps;\n        var _c = this.state, isChecked = _c.isChecked, isIndeterminate = _c.isIndeterminate;\n        this._classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            disabled: disabled,\n            indeterminate: isIndeterminate,\n            checked: isChecked,\n            reversed: boxSide !== \"start\",\n            isUsingCustomLabelRender: onRenderLabel !== this._onRenderLabel\n        });\n        if (keytipProps) return _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: keytipProps,\n            disabled: disabled\n        }, function(keytipAttributes) {\n            return _this._renderContent(isChecked, isIndeterminate, keytipAttributes);\n        });\n        return this._renderContent(isChecked, isIndeterminate);\n    };\n    Object.defineProperty(CheckboxBase1.prototype, \"indeterminate\", {\n        get: function() {\n            return !!this.state.isIndeterminate;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(CheckboxBase1.prototype, \"checked\", {\n        get: function() {\n            return !!this.state.isChecked;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    CheckboxBase1.prototype.focus = function() {\n        if (this._checkBox.current) this._checkBox.current.focus();\n    };\n    CheckboxBase1.defaultProps = {\n        boxSide: \"start\"\n    };\n    return CheckboxBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../../Icon\":\"2Ha7p\",\"../../KeytipData\":\"e8VIa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hCixG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"../../Utilities\");\nvar GlobalClassNames = {\n    root: \"ms-Checkbox\",\n    label: \"ms-Checkbox-label\",\n    checkbox: \"ms-Checkbox-checkbox\",\n    checkmark: \"ms-Checkbox-checkmark\",\n    text: \"ms-Checkbox-text\"\n};\nvar MS_CHECKBOX_LABEL_SIZE = \"20px\";\nvar MS_CHECKBOX_TRANSITION_DURATION = \"200ms\";\nvar MS_CHECKBOX_TRANSITION_TIMING = \"cubic-bezier(.4, 0, .23, 1)\";\nvar getStyles = function(props) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\n    var className = props.className, theme = props.theme, reversed = props.reversed, checked = props.checked, disabled = props.disabled, isUsingCustomLabelRender = props.isUsingCustomLabelRender, indeterminate = props.indeterminate;\n    var semanticColors = theme.semanticColors, effects = theme.effects, palette = theme.palette, fonts = theme.fonts;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    var checkmarkFontColor = semanticColors.inputForegroundChecked;\n    // TODO: after updating the semanticColors slots mapping this needs to be semanticColors.inputBorder\n    var checkmarkFontColorHovered = palette.neutralSecondary;\n    // TODO: after updating the semanticColors slots mapping this needs to be semanticColors.smallInputBorder\n    var checkboxBorderColor = palette.neutralPrimary;\n    var checkboxBorderIndeterminateColor = semanticColors.inputBackgroundChecked;\n    var checkboxBorderColorChecked = semanticColors.inputBackgroundChecked;\n    var checkboxBorderColorDisabled = semanticColors.disabledBodySubtext;\n    var checkboxBorderHoveredColor = semanticColors.inputBorderHovered;\n    var checkboxBorderIndeterminateHoveredColor = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxBackgroundChecked = semanticColors.inputBackgroundChecked;\n    // TODO: after updating the semanticColors slots mapping the following 2 tokens need to be\n    // semanticColors.inputBackgroundCheckedHovered\n    var checkboxBackgroundCheckedHovered = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxBorderColorCheckedHovered = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxHoveredTextColor = semanticColors.inputTextHovered;\n    var checkboxBackgroundDisabledChecked = semanticColors.disabledBodySubtext;\n    var checkboxTextColor = semanticColors.bodyText;\n    var checkboxTextColorDisabled = semanticColors.disabledText;\n    var indeterminateDotStyles = [\n        (_a = {\n            content: '\"\"',\n            borderRadius: effects.roundedCorner2,\n            position: \"absolute\",\n            width: 10,\n            height: 10,\n            top: 4,\n            left: 4,\n            boxSizing: \"border-box\",\n            borderWidth: 5,\n            borderStyle: \"solid\",\n            borderColor: disabled ? checkboxBorderColorDisabled : checkboxBorderIndeterminateColor,\n            transitionProperty: \"border-width, border, border-color\",\n            transitionDuration: MS_CHECKBOX_TRANSITION_DURATION,\n            transitionTimingFunction: MS_CHECKBOX_TRANSITION_TIMING\n        }, _a[0, _styling.HighContrastSelector] = {\n            borderColor: \"WindowText\"\n        }, _a), \n    ];\n    return {\n        root: [\n            classNames.root,\n            {\n                position: \"relative\",\n                display: \"flex\"\n            },\n            reversed && \"reversed\",\n            checked && \"is-checked\",\n            !disabled && \"is-enabled\",\n            disabled && \"is-disabled\",\n            !disabled && [\n                !checked && (_b = {}, _b[\":hover .\" + classNames.checkbox] = (_c = {\n                    borderColor: checkboxBorderHoveredColor\n                }, _c[0, _styling.HighContrastSelector] = {\n                    borderColor: \"Highlight\"\n                }, _c), _b[\":focus .\" + classNames.checkbox] = {\n                    borderColor: checkboxBorderHoveredColor\n                }, _b[\":hover .\" + classNames.checkmark] = (_d = {\n                    color: checkmarkFontColorHovered,\n                    opacity: \"1\"\n                }, _d[0, _styling.HighContrastSelector] = {\n                    color: \"Highlight\"\n                }, _d), _b),\n                checked && !indeterminate && (_e = {}, _e[\":hover .\" + classNames.checkbox] = {\n                    background: checkboxBackgroundCheckedHovered,\n                    borderColor: checkboxBorderColorCheckedHovered\n                }, _e[\":focus .\" + classNames.checkbox] = {\n                    background: checkboxBackgroundCheckedHovered,\n                    borderColor: checkboxBorderColorCheckedHovered\n                }, _e[0, _styling.HighContrastSelector] = (_f = {}, _f[\":hover .\" + classNames.checkbox] = {\n                    background: \"Highlight\",\n                    borderColor: \"Highlight\"\n                }, _f[\":focus .\" + classNames.checkbox] = {\n                    background: \"Highlight\"\n                }, _f[\":focus:hover .\" + classNames.checkbox] = {\n                    background: \"Highlight\"\n                }, _f[\":focus:hover .\" + classNames.checkmark] = {\n                    color: \"Window\"\n                }, _f[\":hover .\" + classNames.checkmark] = {\n                    color: \"Window\"\n                }, _f), _e),\n                indeterminate && (_g = {}, _g[\":hover .\" + classNames.checkbox + \", :hover .\" + classNames.checkbox + \":after\"] = (_h = {\n                    borderColor: checkboxBorderIndeterminateHoveredColor\n                }, _h[0, _styling.HighContrastSelector] = {\n                    borderColor: \"WindowText\"\n                }, _h), _g[\":focus .\" + classNames.checkbox] = {\n                    borderColor: checkboxBorderIndeterminateHoveredColor\n                }, _g[\":hover .\" + classNames.checkmark] = {\n                    opacity: \"0\"\n                }, _g),\n                (_j = {}, _j[\":hover .\" + classNames.text + \", :focus .\" + classNames.text] = (_k = {\n                    color: checkboxHoveredTextColor\n                }, _k[0, _styling.HighContrastSelector] = {\n                    color: disabled ? \"GrayText\" : \"WindowText\"\n                }, _k), _j), \n            ],\n            className, \n        ],\n        input: (_l = {\n            position: \"absolute\",\n            background: \"none\",\n            opacity: 0\n        }, _l[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus + label::before\"] = (_m = {\n            outline: \"1px solid \" + theme.palette.neutralSecondary,\n            outlineOffset: \"2px\"\n        }, _m[0, _styling.HighContrastSelector] = {\n            outline: \"1px solid WindowText\"\n        }, _m), _l),\n        label: [\n            classNames.label,\n            theme.fonts.medium,\n            {\n                display: \"flex\",\n                alignItems: isUsingCustomLabelRender ? \"center\" : \"flex-start\",\n                cursor: disabled ? \"default\" : \"pointer\",\n                position: \"relative\",\n                userSelect: \"none\"\n            },\n            reversed && {\n                flexDirection: \"row-reverse\",\n                justifyContent: \"flex-end\"\n            },\n            {\n                \"&::before\": {\n                    position: \"absolute\",\n                    left: 0,\n                    right: 0,\n                    top: 0,\n                    bottom: 0,\n                    content: '\"\"',\n                    pointerEvents: \"none\"\n                }\n            }, \n        ],\n        checkbox: [\n            classNames.checkbox,\n            (_o = {\n                position: \"relative\",\n                display: \"flex\",\n                flexShrink: 0,\n                alignItems: \"center\",\n                justifyContent: \"center\",\n                height: MS_CHECKBOX_LABEL_SIZE,\n                width: MS_CHECKBOX_LABEL_SIZE,\n                border: \"1px solid \" + checkboxBorderColor,\n                borderRadius: effects.roundedCorner2,\n                boxSizing: \"border-box\",\n                transitionProperty: \"background, border, border-color\",\n                transitionDuration: MS_CHECKBOX_TRANSITION_DURATION,\n                transitionTimingFunction: MS_CHECKBOX_TRANSITION_TIMING,\n                /* in case the icon is bigger than the box */ overflow: \"hidden\",\n                \":after\": indeterminate ? indeterminateDotStyles : null\n            }, _o[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                borderColor: \"WindowText\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _o),\n            indeterminate && {\n                borderColor: checkboxBorderIndeterminateColor\n            },\n            !reversed ? // is used, there will be only a 4px margin from checkbox to label. The label by default would have\n            // another 4px margin for a total of 8px margin between checkbox and label. We don't combine the two\n            // (and move it into the text) to not incur a breaking change for everyone using custom render atm.\n            {\n                marginRight: 4\n            } : {\n                marginLeft: 4\n            },\n            !disabled && !indeterminate && checked && (_p = {\n                background: checkboxBackgroundChecked,\n                borderColor: checkboxBorderColorChecked\n            }, _p[0, _styling.HighContrastSelector] = {\n                background: \"Highlight\",\n                borderColor: \"Highlight\"\n            }, _p),\n            disabled && (_q = {\n                borderColor: checkboxBorderColorDisabled\n            }, _q[0, _styling.HighContrastSelector] = {\n                borderColor: \"GrayText\"\n            }, _q),\n            checked && disabled && (_r = {\n                background: checkboxBackgroundDisabledChecked,\n                borderColor: checkboxBorderColorDisabled\n            }, _r[0, _styling.HighContrastSelector] = {\n                background: \"Window\"\n            }, _r), \n        ],\n        checkmark: [\n            classNames.checkmark,\n            (_s = {\n                opacity: checked ? \"1\" : \"0\",\n                color: checkmarkFontColor\n            }, _s[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: disabled ? \"GrayText\" : \"Window\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _s), \n        ],\n        text: [\n            classNames.text,\n            (_t = {\n                color: disabled ? checkboxTextColorDisabled : checkboxTextColor,\n                fontSize: fonts.medium.fontSize,\n                lineHeight: \"20px\"\n            }, _t[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                color: disabled ? \"GrayText\" : \"WindowText\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _t),\n            !reversed ? {\n                marginLeft: 4\n            } : {\n                marginRight: 4\n            }, \n        ]\n    };\n};\n\n},{\"tslib\":\"01Tx1\",\"../../Styling\":\"7JwBd\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9B0nw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getOptionStyles\", ()=>getOptionStyles);\nparcelHelpers.export(exports, \"getCaretDownButtonStyles\", ()=>getCaretDownButtonStyles);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"../../Utilities\");\nvar _a, _b;\nvar ComboBoxHeight = 32;\nvar ComboBoxLineHeight = 30;\nvar ComboBoxCaretDownWidth = 32;\nvar ComboBoxOptionHeight = 36;\nvar getDisabledStyles = (0, _utilities.memoizeFunction)(function(theme) {\n    var _a1;\n    var semanticColors = theme.semanticColors;\n    return {\n        backgroundColor: semanticColors.disabledBackground,\n        color: semanticColors.disabledText,\n        cursor: \"default\",\n        selectors: (_a1 = {\n            \":after\": {\n                borderColor: semanticColors.disabledBackground\n            }\n        }, _a1[0, _styling.HighContrastSelector] = {\n            color: \"GrayText\",\n            selectors: {\n                \":after\": {\n                    borderColor: \"GrayText\"\n                }\n            }\n        }, _a1)\n    };\n});\nvar listOptionHighContrastStyles = {\n    selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n        backgroundColor: \"Highlight\",\n        borderColor: \"Highlight\",\n        color: \"HighlightText\"\n    }, (0, _styling.getHighContrastNoAdjustStyle)()), _a)\n};\nvar inputHighContrastStyles = {\n    selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n        color: \"WindowText\",\n        backgroundColor: \"Window\"\n    }, (0, _styling.getHighContrastNoAdjustStyle)()), _b)\n};\nvar getOptionStyles = (0, _utilities.memoizeFunction)(function(theme, customStylesForAllOptions, customOptionStylesForCurrentOption, isPending, isHidden) {\n    var _a2;\n    var palette = theme.palette, semanticColors = theme.semanticColors;\n    var option = {\n        textHoveredColor: semanticColors.menuItemTextHovered,\n        textSelectedColor: palette.neutralDark,\n        textDisabledColor: semanticColors.disabledText,\n        backgroundHoveredColor: semanticColors.menuItemBackgroundHovered,\n        backgroundPressedColor: semanticColors.menuItemBackgroundPressed\n    };\n    var optionStyles = {\n        root: [\n            theme.fonts.medium,\n            {\n                backgroundColor: isPending ? option.backgroundHoveredColor : \"transparent\",\n                boxSizing: \"border-box\",\n                cursor: \"pointer\",\n                display: isHidden ? \"none\" : \"block\",\n                width: \"100%\",\n                height: \"auto\",\n                minHeight: ComboBoxOptionHeight,\n                lineHeight: \"20px\",\n                padding: \"0 8px\",\n                position: \"relative\",\n                borderWidth: \"1px\",\n                borderStyle: \"solid\",\n                borderColor: \"transparent\",\n                borderRadius: 0,\n                wordWrap: \"break-word\",\n                overflowWrap: \"break-word\",\n                textAlign: \"left\",\n                selectors: (_a2 = {}, _a2[0, _styling.HighContrastSelector] = {\n                    border: \"none\",\n                    borderColor: \"Background\"\n                }, _a2[\"&.ms-Checkbox\"] = {\n                    display: \"flex\",\n                    alignItems: \"center\"\n                }, _a2[\"&.ms-Button--command:hover:active\"] = {\n                    backgroundColor: option.backgroundPressedColor\n                }, _a2[\".ms-Checkbox-label\"] = {\n                    width: \"100%\"\n                }, _a2)\n            }, \n        ],\n        rootHovered: {\n            backgroundColor: option.backgroundHoveredColor,\n            color: option.textHoveredColor\n        },\n        rootFocused: {\n            backgroundColor: option.backgroundHoveredColor\n        },\n        rootChecked: [\n            {\n                backgroundColor: \"transparent\",\n                color: option.textSelectedColor,\n                selectors: {\n                    \":hover\": [\n                        {\n                            backgroundColor: option.backgroundHoveredColor\n                        },\n                        listOptionHighContrastStyles, \n                    ]\n                }\n            },\n            (0, _styling.getFocusStyle)(theme, {\n                inset: -1,\n                isFocusedOnly: false\n            }),\n            listOptionHighContrastStyles, \n        ],\n        rootDisabled: {\n            color: option.textDisabledColor,\n            cursor: \"default\"\n        },\n        optionText: {\n            overflow: \"hidden\",\n            whiteSpace: \"nowrap\",\n            textOverflow: \"ellipsis\",\n            minWidth: \"0px\",\n            maxWidth: \"100%\",\n            wordWrap: \"break-word\",\n            overflowWrap: \"break-word\",\n            display: \"inline-block\"\n        },\n        optionTextWrapper: {\n            maxWidth: \"100%\",\n            display: \"flex\",\n            alignItems: \"center\"\n        }\n    };\n    return (0, _styling.concatStyleSets)(optionStyles, customStylesForAllOptions, customOptionStylesForCurrentOption);\n});\nvar getCaretDownButtonStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles) {\n    var _a3, _b1;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts;\n    var caret = {\n        buttonTextColor: semanticColors.bodySubtext,\n        buttonTextHoveredCheckedColor: semanticColors.buttonTextChecked,\n        buttonBackgroundHoveredColor: semanticColors.listItemBackgroundHovered,\n        buttonBackgroundCheckedColor: semanticColors.listItemBackgroundChecked,\n        buttonBackgroundCheckedHoveredColor: semanticColors.listItemBackgroundCheckedHovered\n    };\n    var buttonHighContrastStyles = {\n        selectors: (_a3 = {}, _a3[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n            backgroundColor: \"Highlight\",\n            borderColor: \"Highlight\",\n            color: \"HighlightText\"\n        }, (0, _styling.getHighContrastNoAdjustStyle)()), _a3)\n    };\n    var styles = {\n        root: {\n            color: caret.buttonTextColor,\n            fontSize: fonts.small.fontSize,\n            position: \"absolute\",\n            top: 0,\n            height: \"100%\",\n            lineHeight: ComboBoxLineHeight,\n            width: ComboBoxCaretDownWidth,\n            textAlign: \"center\",\n            cursor: \"default\",\n            selectors: (_b1 = {}, _b1[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                backgroundColor: \"ButtonFace\",\n                borderColor: \"ButtonText\",\n                color: \"ButtonText\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), _b1)\n        },\n        icon: {\n            fontSize: fonts.small.fontSize\n        },\n        rootHovered: [\n            {\n                backgroundColor: caret.buttonBackgroundHoveredColor,\n                color: caret.buttonTextHoveredCheckedColor,\n                cursor: \"pointer\"\n            },\n            buttonHighContrastStyles, \n        ],\n        rootPressed: [\n            {\n                backgroundColor: caret.buttonBackgroundCheckedColor,\n                color: caret.buttonTextHoveredCheckedColor\n            },\n            buttonHighContrastStyles, \n        ],\n        rootChecked: [\n            {\n                backgroundColor: caret.buttonBackgroundCheckedColor,\n                color: caret.buttonTextHoveredCheckedColor\n            },\n            buttonHighContrastStyles, \n        ],\n        rootCheckedHovered: [\n            {\n                backgroundColor: caret.buttonBackgroundCheckedHoveredColor,\n                color: caret.buttonTextHoveredCheckedColor\n            },\n            buttonHighContrastStyles, \n        ],\n        rootDisabled: [\n            getDisabledStyles(theme),\n            {\n                position: \"absolute\"\n            }, \n        ]\n    };\n    return (0, _styling.concatStyleSets)(styles, customStyles);\n});\nvar getStyles = (0, _utilities.memoizeFunction)(function(theme, customStyles, comboBoxOptionWidth) {\n    var _a4, _b2, _c, _d, _e, _f;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, effects = theme.effects;\n    var root = {\n        textColor: semanticColors.inputText,\n        borderColor: semanticColors.inputBorder,\n        borderHoveredColor: semanticColors.inputBorderHovered,\n        borderPressedColor: semanticColors.inputFocusBorderAlt,\n        borderFocusedColor: semanticColors.inputFocusBorderAlt,\n        backgroundColor: semanticColors.inputBackground,\n        erroredColor: semanticColors.errorText\n    };\n    var option = {\n        headerTextColor: semanticColors.menuHeader,\n        dividerBorderColor: semanticColors.bodyDivider\n    };\n    // placeholder style variables\n    var placeholderHighContrastStyles = {\n        selectors: (_a4 = {}, _a4[0, _styling.HighContrastSelector] = {\n            color: \"GrayText\"\n        }, _a4)\n    };\n    var placeholderStyles = [\n        {\n            color: semanticColors.inputPlaceholderText\n        },\n        placeholderHighContrastStyles, \n    ];\n    var placeholderStylesHovered = [\n        {\n            color: semanticColors.inputTextHovered\n        },\n        placeholderHighContrastStyles, \n    ];\n    var disabledPlaceholderStyles = [\n        {\n            color: semanticColors.disabledText\n        },\n        placeholderHighContrastStyles, \n    ];\n    var ComboBoxRootHighContrastFocused = (0, _tslib.__assign)((0, _tslib.__assign)({\n        color: \"HighlightText\",\n        backgroundColor: \"Window\"\n    }, (0, _styling.getHighContrastNoAdjustStyle)()), {\n        selectors: {\n            \":after\": {\n                borderColor: \"Highlight\"\n            }\n        }\n    });\n    var focusBorderStyles = (0, _styling.getInputFocusStyle)(root.borderPressedColor, effects.roundedCorner2, \"border\", 0);\n    var styles = {\n        container: {},\n        label: {},\n        labelDisabled: {},\n        root: [\n            theme.fonts.medium,\n            {\n                boxShadow: \"none\",\n                marginLeft: \"0\",\n                paddingRight: ComboBoxCaretDownWidth,\n                paddingLeft: 9,\n                color: root.textColor,\n                position: \"relative\",\n                outline: \"0\",\n                userSelect: \"none\",\n                backgroundColor: root.backgroundColor,\n                cursor: \"text\",\n                display: \"block\",\n                height: ComboBoxHeight,\n                whiteSpace: \"nowrap\",\n                textOverflow: \"ellipsis\",\n                boxSizing: \"border-box\",\n                selectors: {\n                    \".ms-Label\": {\n                        display: \"inline-block\",\n                        marginBottom: \"8px\"\n                    },\n                    \"&.is-open\": {\n                        selectors: (_b2 = {}, _b2[0, _styling.HighContrastSelector] = ComboBoxRootHighContrastFocused, _b2)\n                    },\n                    // setting border using pseudo-element here in order to\n                    // prevent chevron button to overlap ComboBox border under certain resolutions\n                    \":after\": {\n                        pointerEvents: \"none\",\n                        content: \"''\",\n                        position: \"absolute\",\n                        left: 0,\n                        top: 0,\n                        bottom: 0,\n                        right: 0,\n                        borderWidth: \"1px\",\n                        borderStyle: \"solid\",\n                        borderColor: root.borderColor,\n                        borderRadius: effects.roundedCorner2\n                    }\n                }\n            }, \n        ],\n        rootHovered: {\n            selectors: (_c = {\n                \":after\": {\n                    borderColor: root.borderHoveredColor\n                },\n                \".ms-ComboBox-Input\": [\n                    {\n                        color: semanticColors.inputTextHovered\n                    },\n                    (0, _styling.getPlaceholderStyles)(placeholderStylesHovered),\n                    inputHighContrastStyles, \n                ]\n            }, _c[0, _styling.HighContrastSelector] = (0, _tslib.__assign)((0, _tslib.__assign)({\n                color: \"HighlightText\",\n                backgroundColor: \"Window\"\n            }, (0, _styling.getHighContrastNoAdjustStyle)()), {\n                selectors: {\n                    \":after\": {\n                        borderColor: \"Highlight\"\n                    }\n                }\n            }), _c)\n        },\n        rootPressed: [\n            {\n                position: \"relative\",\n                selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = ComboBoxRootHighContrastFocused, _d)\n            }, \n        ],\n        rootFocused: [\n            {\n                selectors: (_e = {\n                    \".ms-ComboBox-Input\": [\n                        {\n                            color: semanticColors.inputTextHovered\n                        },\n                        inputHighContrastStyles, \n                    ]\n                }, _e[0, _styling.HighContrastSelector] = ComboBoxRootHighContrastFocused, _e)\n            },\n            focusBorderStyles, \n        ],\n        rootDisabled: getDisabledStyles(theme),\n        rootError: {\n            selectors: {\n                \":after\": {\n                    borderColor: root.erroredColor\n                },\n                \":hover:after\": {\n                    borderColor: semanticColors.inputBorderHovered\n                }\n            }\n        },\n        rootDisallowFreeForm: {},\n        input: [\n            (0, _styling.getPlaceholderStyles)(placeholderStyles),\n            {\n                backgroundColor: root.backgroundColor,\n                color: root.textColor,\n                boxSizing: \"border-box\",\n                width: \"100%\",\n                height: \"100%\",\n                borderStyle: \"none\",\n                outline: \"none\",\n                font: \"inherit\",\n                textOverflow: \"ellipsis\",\n                padding: \"0\",\n                selectors: {\n                    \"::-ms-clear\": {\n                        display: \"none\"\n                    }\n                }\n            },\n            inputHighContrastStyles, \n        ],\n        inputDisabled: [\n            getDisabledStyles(theme),\n            (0, _styling.getPlaceholderStyles)(disabledPlaceholderStyles)\n        ],\n        errorMessage: [\n            theme.fonts.small,\n            {\n                color: root.erroredColor,\n                marginTop: \"5px\"\n            }, \n        ],\n        callout: {\n            boxShadow: effects.elevation8\n        },\n        optionsContainerWrapper: {\n            width: comboBoxOptionWidth\n        },\n        optionsContainer: {\n            display: \"block\"\n        },\n        screenReaderText: (0, _styling.hiddenContentStyle),\n        header: [\n            fonts.medium,\n            {\n                fontWeight: (0, _styling.FontWeights).semibold,\n                color: option.headerTextColor,\n                backgroundColor: \"none\",\n                borderStyle: \"none\",\n                height: ComboBoxOptionHeight,\n                lineHeight: ComboBoxOptionHeight,\n                cursor: \"default\",\n                padding: \"0 8px\",\n                userSelect: \"none\",\n                textAlign: \"left\",\n                selectors: (_f = {}, _f[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                    color: \"GrayText\"\n                }, (0, _styling.getHighContrastNoAdjustStyle)()), _f)\n            }, \n        ],\n        divider: {\n            height: 1,\n            backgroundColor: option.dividerBorderColor\n        }\n    };\n    return (0, _styling.concatStyleSets)(styles, customStyles);\n});\n\n},{\"tslib\":\"01Tx1\",\"../../Styling\":\"7JwBd\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eg5E0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getClassNames\", ()=>getClassNames);\nparcelHelpers.export(exports, \"getComboBoxOptionClassNames\", ()=>getComboBoxOptionClassNames);\nvar _utilities = require(\"../../Utilities\");\nvar _styling = require(\"../../Styling\");\nvar getClassNames = (0, _utilities.memoizeFunction)(function(styles, className, isOpen, disabled, required, focused, allowFreeForm, hasErrorMessage) {\n    return {\n        container: (0, _styling.mergeStyles)(\"ms-ComboBox-container\", className, styles.container),\n        label: (0, _styling.mergeStyles)(styles.label, disabled && styles.labelDisabled),\n        root: (0, _styling.mergeStyles)(\"ms-ComboBox\", hasErrorMessage ? styles.rootError : isOpen && \"is-open\", required && \"is-required\", styles.root, !allowFreeForm && styles.rootDisallowFreeForm, hasErrorMessage && !focused ? styles.rootError : !disabled && focused && styles.rootFocused, !disabled && {\n            selectors: {\n                \":hover\": hasErrorMessage ? styles.rootError : !isOpen && !focused && styles.rootHovered,\n                \":active\": hasErrorMessage ? styles.rootError : styles.rootPressed,\n                \":focus\": hasErrorMessage ? styles.rootError : styles.rootFocused\n            }\n        }, disabled && [\n            \"is-disabled\",\n            styles.rootDisabled\n        ]),\n        input: (0, _styling.mergeStyles)(\"ms-ComboBox-Input\", styles.input, disabled && styles.inputDisabled),\n        errorMessage: (0, _styling.mergeStyles)(styles.errorMessage),\n        callout: (0, _styling.mergeStyles)(\"ms-ComboBox-callout\", styles.callout),\n        optionsContainerWrapper: (0, _styling.mergeStyles)(\"ms-ComboBox-optionsContainerWrapper\", styles.optionsContainerWrapper),\n        optionsContainer: (0, _styling.mergeStyles)(\"ms-ComboBox-optionsContainer\", styles.optionsContainer),\n        header: (0, _styling.mergeStyles)(\"ms-ComboBox-header\", styles.header),\n        divider: (0, _styling.mergeStyles)(\"ms-ComboBox-divider\", styles.divider),\n        screenReaderText: (0, _styling.mergeStyles)(styles.screenReaderText)\n    };\n});\nvar getComboBoxOptionClassNames = (0, _utilities.memoizeFunction)(function(styles) {\n    return {\n        optionText: (0, _styling.mergeStyles)(\"ms-ComboBox-optionText\", styles.optionText),\n        root: (0, _styling.mergeStyles)(\"ms-ComboBox-option\", styles.root, {\n            selectors: {\n                \":hover\": styles.rootHovered,\n                \":focus\": styles.rootFocused,\n                \":active\": styles.rootPressed\n            }\n        }),\n        optionTextWrapper: (0, _styling.mergeStyles)(styles.optionTextWrapper)\n    };\n});\n\n},{\"../../Utilities\":\"2F07a\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h4B52\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _selectableOption = require(\"./SelectableOption\");\nparcelHelpers.exportAll(_selectableOption, exports);\nvar _selectableOptionTypes = require(\"./SelectableOption.types\");\nparcelHelpers.exportAll(_selectableOptionTypes, exports);\n\n},{\"./SelectableOption\":\"460sD\",\"./SelectableOption.types\":\"4gljF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"460sD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getAllSelectedOptions\", ()=>getAllSelectedOptions);\nfunction getAllSelectedOptions(options, selectedIndices) {\n    var selectedOptions = [];\n    for(var _i = 0, selectedIndices_1 = selectedIndices; _i < selectedIndices_1.length; _i++){\n        var index = selectedIndices_1[_i];\n        var option = options[index];\n        if (option) selectedOptions.push(option);\n    }\n    return selectedOptions;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"awPLf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VirtualizedComboBox\", ()=>VirtualizedComboBox);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _comboBox = require(\"./ComboBox\");\nvar _list = require(\"../../List\");\nvar _utilities = require(\"../../Utilities\");\nvar VirtualizedComboBox = /** @class */ function(_super) {\n    (0, _tslib.__extends)(VirtualizedComboBox1, _super);\n    function VirtualizedComboBox1(props1) {\n        var _this = _super.call(this, props1) || this;\n        /** The combo box element */ _this._comboBox = _react.createRef();\n        /** The virtualized list element */ _this._list = _react.createRef();\n        _this._onRenderList = function(props) {\n            var id = props.id, onRenderItem = props.onRenderItem;\n            // Render virtualized list\n            return _react.createElement((0, _list.List), {\n                componentRef: _this._list,\n                role: \"listbox\",\n                id: id + \"-list\",\n                \"aria-labelledby\": id + \"-label\",\n                items: props.options,\n                // eslint-disable-next-line react/jsx-no-bind\n                onRenderCell: onRenderItem ? function(item) {\n                    return onRenderItem(item);\n                } : function() {\n                    return null;\n                }\n            });\n        };\n        _this._onScrollToItem = function(itemIndex) {\n            // We are using the List component, call scrollToIndex\n            _this._list.current && _this._list.current.scrollToIndex(itemIndex);\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        return _this;\n    }\n    Object.defineProperty(VirtualizedComboBox1.prototype, \"selectedOptions\", {\n        /**\n         * All selected options\n         */ get: function() {\n            if (this._comboBox.current) return this._comboBox.current.selectedOptions;\n            return [];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    VirtualizedComboBox1.prototype.dismissMenu = function() {\n        if (this._comboBox.current) return this._comboBox.current.dismissMenu();\n    };\n    VirtualizedComboBox1.prototype.focus = function(shouldOpenOnFocus, useFocusAsync) {\n        if (this._comboBox.current) {\n            this._comboBox.current.focus(shouldOpenOnFocus, useFocusAsync);\n            return true;\n        }\n        return false;\n    };\n    VirtualizedComboBox1.prototype.render = function() {\n        return _react.createElement((0, _comboBox.ComboBox), (0, _tslib.__assign)({}, this.props, {\n            componentRef: this._comboBox,\n            onRenderList: this._onRenderList,\n            onScrollToItem: this._onScrollToItem\n        }));\n    };\n    return VirtualizedComboBox1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./ComboBox\":\"6H0u3\",\"../../List\":\"jRxkg\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jRxkg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/List/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/List/index\":\"9hIVR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9hIVR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _list = require(\"./List\");\nparcelHelpers.exportAll(_list, exports);\nvar _listTypes = require(\"./List.types\");\nparcelHelpers.exportAll(_listTypes, exports);\n\n},{\"./List\":\"gjUzb\",\"./List.types\":\"jqbj1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gjUzb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"List\", ()=>List);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _listTypes = require(\"./List.types\");\nvar RESIZE_DELAY = 16;\nvar MIN_SCROLL_UPDATE_DELAY = 100;\nvar MAX_SCROLL_UPDATE_DELAY = 500;\nvar IDLE_DEBOUNCE_DELAY = 200;\n// The amount of time to wait before declaring that the list isn't scrolling\nvar DONE_SCROLLING_WAIT = 500;\nvar DEFAULT_ITEMS_PER_PAGE = 10;\nvar DEFAULT_PAGE_HEIGHT = 30;\nvar DEFAULT_RENDERED_WINDOWS_BEHIND = 2;\nvar DEFAULT_RENDERED_WINDOWS_AHEAD = 2;\nvar PAGE_KEY_PREFIX = \"page-\";\nvar SPACER_KEY_PREFIX = \"spacer-\";\nvar EMPTY_RECT = {\n    top: -1,\n    bottom: -1,\n    left: -1,\n    right: -1,\n    width: 0,\n    height: 0\n};\n// Naming expensive measures so that they're named in profiles.\nvar _measurePageRect = function(element) {\n    return element.getBoundingClientRect();\n};\nvar _measureSurfaceRect = _measurePageRect;\nvar _measureScrollRect = _measurePageRect;\n/**\n * The List renders virtualized pages of items. Each page's item count is determined by the getItemCountForPage callback\n * if provided by the caller, or 10 as default. Each page's height is determined by the getPageHeight callback if\n * provided by the caller, or by cached measurements if available, or by a running average, or a default fallback.\n *\n * The algorithm for rendering pages works like this:\n *\n * 1. Predict visible pages based on \"current measure data\" (page heights, surface position, visible window)\n * 2. If changes are necessary, apply changes (add/remove pages)\n * 3. For pages that are added, measure the page heights if we need to using getBoundingClientRect\n * 4. If measurements don't match predictions, update measure data and goto step 1 asynchronously\n *\n * Measuring too frequently can pull performance down significantly. To compensate, we cache measured values so that\n * we can avoid re-measuring during operations that should not alter heights, like scrolling.\n *\n * To optimize glass rendering performance, onShouldVirtualize can be set. When onShouldVirtualize return false,\n * List will run in fast mode (not virtualized) to render all items without any measurements to improve page load time.\n * And we start doing measurements and rendering in virtualized mode when items grows larger than this threshold.\n *\n * However, certain operations can make measure data stale. For example, resizing the list, or passing in new props,\n * or forcing an update change cause pages to shrink/grow. When these operations occur, we increment a measureVersion\n * number, which we associate with cached measurements and use to determine if a remeasure should occur.\n */ var List = /** @class */ function(_super) {\n    (0, _tslib.__extends)(List1, _super);\n    function List1(props1) {\n        var _this = _super.call(this, props1) || this;\n        _this._root = _react.createRef();\n        _this._surface = _react.createRef();\n        _this._pageRefs = {};\n        _this._getDerivedStateFromProps = function(nextProps, previousState) {\n            if (nextProps.items !== _this.props.items || nextProps.renderCount !== _this.props.renderCount || nextProps.startIndex !== _this.props.startIndex || nextProps.version !== _this.props.version) {\n                // We have received new items so we want to make sure that initially we only render a single window to\n                // fill the currently visible rect, and then later render additional windows.\n                _this._resetRequiredWindows();\n                _this._requiredRect = null;\n                _this._measureVersion++;\n                _this._invalidatePageCache();\n                return _this._updatePages(nextProps, previousState);\n            }\n            return previousState;\n        };\n        _this._onRenderRoot = function(props) {\n            var rootRef = props.rootRef, surfaceElement = props.surfaceElement, divProps = props.divProps;\n            return _react.createElement(\"div\", (0, _tslib.__assign)({\n                ref: rootRef\n            }, divProps), surfaceElement);\n        };\n        _this._onRenderSurface = function(props) {\n            var surfaceRef = props.surfaceRef, pageElements = props.pageElements, divProps = props.divProps;\n            return _react.createElement(\"div\", (0, _tslib.__assign)({\n                ref: surfaceRef\n            }, divProps), pageElements);\n        };\n        _this._onRenderPage = function(pageProps, defaultRender) {\n            var _a = _this.props, onRenderCell = _a.onRenderCell, role = _a.role;\n            var _b = pageProps.page, _c = _b.items, items = _c === void 0 ? [] : _c, startIndex = _b.startIndex, divProps = (0, _tslib.__rest)(pageProps, [\n                \"page\"\n            ]);\n            // only assign list item role if no role is assigned\n            var cellRole = role === undefined ? \"listitem\" : \"presentation\";\n            var cells = [];\n            for(var i = 0; i < items.length; i++){\n                var index = startIndex + i;\n                var item = items[i];\n                var itemKey = _this.props.getKey ? _this.props.getKey(item, index) : item && item.key;\n                if (itemKey === null || itemKey === undefined) itemKey = index;\n                cells.push(_react.createElement(\"div\", {\n                    role: cellRole,\n                    className: \"ms-List-cell\",\n                    key: itemKey,\n                    \"data-list-index\": index,\n                    \"data-automationid\": \"ListCell\"\n                }, onRenderCell && onRenderCell(item, index, !_this.props.ignoreScrollingState ? _this.state.isScrolling : undefined)));\n            }\n            return _react.createElement(\"div\", (0, _tslib.__assign)({}, divProps), cells);\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        _this.state = {\n            pages: [],\n            isScrolling: false,\n            getDerivedStateFromProps: _this._getDerivedStateFromProps\n        };\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._events = new (0, _utilities.EventGroup)(_this);\n        _this._estimatedPageHeight = 0;\n        _this._totalEstimates = 0;\n        _this._requiredWindowsAhead = 0;\n        _this._requiredWindowsBehind = 0;\n        // Track the measure version for everything.\n        _this._measureVersion = 0;\n        // Ensure that scrolls are lazy updated.\n        _this._onAsyncScroll = _this._async.debounce(_this._onAsyncScroll, MIN_SCROLL_UPDATE_DELAY, {\n            leading: false,\n            maxWait: MAX_SCROLL_UPDATE_DELAY\n        });\n        _this._onAsyncIdle = _this._async.debounce(_this._onAsyncIdle, IDLE_DEBOUNCE_DELAY, {\n            leading: false\n        });\n        _this._onAsyncResize = _this._async.debounce(_this._onAsyncResize, RESIZE_DELAY, {\n            leading: false\n        });\n        _this._onScrollingDone = _this._async.debounce(_this._onScrollingDone, DONE_SCROLLING_WAIT, {\n            leading: false\n        });\n        _this._cachedPageHeights = {};\n        _this._estimatedPageHeight = 0;\n        _this._focusedIndex = -1;\n        _this._pageCache = {};\n        return _this;\n    }\n    List1.getDerivedStateFromProps = function(nextProps, previousState) {\n        return previousState.getDerivedStateFromProps(nextProps, previousState);\n    };\n    Object.defineProperty(List1.prototype, \"pageRefs\", {\n        get: function() {\n            return this._pageRefs;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Scroll to the given index. By default will bring the page the specified item is on into the view. If a callback\n     * to measure the height of an individual item is specified, will only scroll to bring the specific item into view.\n     *\n     * Note: with items of variable height and no passed in `getPageHeight` method, the list might jump after scrolling\n     * when windows before/ahead are being rendered, and the estimated height is replaced using actual elements.\n     *\n     * @param index - Index of item to scroll to\n     * @param measureItem - Optional callback to measure the height of an individual item\n     * @param scrollToMode - Optional defines where in the window the item should be positioned to when scrolling\n     */ List1.prototype.scrollToIndex = function(index, measureItem, scrollToMode) {\n        if (scrollToMode === void 0) scrollToMode = (0, _listTypes.ScrollToMode).auto;\n        var startIndex = this.props.startIndex;\n        var renderCount = this._getRenderCount();\n        var endIndex = startIndex + renderCount;\n        var allowedRect = this._allowedRect;\n        var scrollTop = 0;\n        var itemsPerPage = 1;\n        for(var itemIndex = startIndex; itemIndex < endIndex; itemIndex += itemsPerPage){\n            var pageSpecification = this._getPageSpecification(itemIndex, allowedRect);\n            var pageHeight = pageSpecification.height;\n            itemsPerPage = pageSpecification.itemCount;\n            var requestedIndexIsInPage = itemIndex <= index && itemIndex + itemsPerPage > index;\n            if (requestedIndexIsInPage) {\n                // We have found the page. If the user provided a way to measure an individual item, we will try to scroll in\n                // just the given item, otherwise we'll only bring the page into view\n                if (measureItem && this._scrollElement) {\n                    var scrollRect = _measureScrollRect(this._scrollElement);\n                    var scrollWindow = {\n                        top: this._scrollElement.scrollTop,\n                        bottom: this._scrollElement.scrollTop + scrollRect.height\n                    };\n                    // Adjust for actual item position within page\n                    var itemPositionWithinPage = index - itemIndex;\n                    for(var itemIndexInPage = 0; itemIndexInPage < itemPositionWithinPage; ++itemIndexInPage)scrollTop += measureItem(itemIndex + itemIndexInPage);\n                    var scrollBottom = scrollTop + measureItem(index);\n                    // If scrollToMode is set to something other than auto, we always want to\n                    // scroll the item into a specific position on the page.\n                    switch(scrollToMode){\n                        case (0, _listTypes.ScrollToMode).top:\n                            this._scrollElement.scrollTop = scrollTop;\n                            return;\n                        case (0, _listTypes.ScrollToMode).bottom:\n                            this._scrollElement.scrollTop = scrollBottom - scrollRect.height;\n                            return;\n                        case (0, _listTypes.ScrollToMode).center:\n                            this._scrollElement.scrollTop = (scrollTop + scrollBottom - scrollRect.height) / 2;\n                            return;\n                        case (0, _listTypes.ScrollToMode).auto:\n                        default:\n                            break;\n                    }\n                    var itemIsFullyVisible = scrollTop >= scrollWindow.top && scrollBottom <= scrollWindow.bottom;\n                    if (itemIsFullyVisible) // Item is already visible, do nothing.\n                    return;\n                    var itemIsPartiallyAbove = scrollTop < scrollWindow.top;\n                    var itemIsPartiallyBelow = scrollBottom > scrollWindow.bottom;\n                    if (itemIsPartiallyAbove) ;\n                    else if (itemIsPartiallyBelow) //  Adjust scrollTop position to just bring in the element\n                    // .------.  - scrollTop\n                    // |      |\n                    // | .------.\n                    // '-|----' | - scrollWindow.bottom\n                    //   | Item |\n                    //   '------' - scrollBottom\n                    scrollTop = scrollBottom - scrollRect.height;\n                }\n                this._scrollElement.scrollTop = scrollTop;\n                return;\n            }\n            scrollTop += pageHeight;\n        }\n    };\n    List1.prototype.getStartItemIndexInView = function(measureItem) {\n        var pages = this.state.pages || [];\n        for(var _i = 0, pages_1 = pages; _i < pages_1.length; _i++){\n            var page = pages_1[_i];\n            var isPageVisible = !page.isSpacer && (this._scrollTop || 0) >= page.top && (this._scrollTop || 0) <= page.top + page.height;\n            if (isPageVisible) {\n                if (!measureItem) {\n                    var rowHeight = Math.floor(page.height / page.itemCount);\n                    return page.startIndex + Math.floor((this._scrollTop - page.top) / rowHeight);\n                } else {\n                    var totalRowHeight = 0;\n                    for(var itemIndex = page.startIndex; itemIndex < page.startIndex + page.itemCount; itemIndex++){\n                        var rowHeight = measureItem(itemIndex);\n                        if (page.top + totalRowHeight <= this._scrollTop && this._scrollTop < page.top + totalRowHeight + rowHeight) return itemIndex;\n                        else totalRowHeight += rowHeight;\n                    }\n                }\n            }\n        }\n        return 0;\n    };\n    List1.prototype.componentDidMount = function() {\n        this.setState(this._updatePages(this.props, this.state));\n        this._measureVersion++;\n        this._scrollElement = (0, _utilities.findScrollableParent)(this._root.current);\n        this._events.on(window, \"resize\", this._onAsyncResize);\n        if (this._root.current) this._events.on(this._root.current, \"focus\", this._onFocus, true);\n        if (this._scrollElement) {\n            this._events.on(this._scrollElement, \"scroll\", this._onScroll);\n            this._events.on(this._scrollElement, \"scroll\", this._onAsyncScroll);\n        }\n    };\n    List1.prototype.componentDidUpdate = function(previousProps, previousState) {\n        var finalProps = this.props;\n        var finalState = this.state;\n        if (this.state.pagesVersion !== previousState.pagesVersion) {\n            // If we weren't provided with the page height, measure the pages\n            if (!finalProps.getPageHeight) {\n                // If measured version is invalid since we've updated the DOM\n                var heightsChanged = this._updatePageMeasurements(finalState.pages);\n                // On first render, we should re-measure so that we don't get a visual glitch.\n                if (heightsChanged) {\n                    this._materializedRect = null;\n                    if (!this._hasCompletedFirstRender) {\n                        this._hasCompletedFirstRender = true;\n                        this.setState(this._updatePages(finalProps, finalState));\n                    } else this._onAsyncScroll();\n                } else // Enqueue an idle bump.\n                this._onAsyncIdle();\n            } else // Enqueue an idle bump\n            this._onAsyncIdle();\n            // Notify the caller that rendering the new pages has completed\n            if (finalProps.onPagesUpdated) finalProps.onPagesUpdated(finalState.pages);\n        }\n    };\n    List1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n        delete this._scrollElement;\n    };\n    List1.prototype.shouldComponentUpdate = function(newProps, newState) {\n        var oldPages = this.state.pages;\n        var newPages = newState.pages;\n        var shouldComponentUpdate = false;\n        // Update if the page stops scrolling\n        if (!newState.isScrolling && this.state.isScrolling) return true;\n        if (newProps.version !== this.props.version) return true;\n        if (newProps.items === this.props.items && oldPages.length === newPages.length) for(var i = 0; i < oldPages.length; i++){\n            var oldPage = oldPages[i];\n            var newPage = newPages[i];\n            if (oldPage.key !== newPage.key || oldPage.itemCount !== newPage.itemCount) {\n                shouldComponentUpdate = true;\n                break;\n            }\n        }\n        else shouldComponentUpdate = true;\n        return shouldComponentUpdate;\n    };\n    List1.prototype.forceUpdate = function() {\n        this._invalidatePageCache();\n        // Ensure that when the list is force updated we update the pages first before render.\n        this._updateRenderRects(this.props, this.state, true);\n        this.setState(this._updatePages(this.props, this.state));\n        this._measureVersion++;\n        _super.prototype.forceUpdate.call(this);\n    };\n    /**\n     * Get the current height the list and it's pages.\n     */ List1.prototype.getTotalListHeight = function() {\n        return this._surfaceRect.height;\n    };\n    List1.prototype.render = function() {\n        var _a = this.props, className = _a.className, _b = _a.role, role = _b === void 0 ? \"list\" : _b, onRenderSurface = _a.onRenderSurface, onRenderRoot = _a.onRenderRoot;\n        var _c = this.state.pages, pages = _c === void 0 ? [] : _c;\n        var pageElements = [];\n        var divProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties));\n        for(var _i = 0, pages_2 = pages; _i < pages_2.length; _i++){\n            var page = pages_2[_i];\n            pageElements.push(this._renderPage(page));\n        }\n        var finalOnRenderSurface = onRenderSurface ? (0, _utilities.composeRenderFunction)(onRenderSurface, this._onRenderSurface) : this._onRenderSurface;\n        var finalOnRenderRoot = onRenderRoot ? (0, _utilities.composeRenderFunction)(onRenderRoot, this._onRenderRoot) : this._onRenderRoot;\n        return finalOnRenderRoot({\n            rootRef: this._root,\n            pages: pages,\n            surfaceElement: finalOnRenderSurface({\n                surfaceRef: this._surface,\n                pages: pages,\n                pageElements: pageElements,\n                divProps: {\n                    role: \"presentation\",\n                    className: \"ms-List-surface\"\n                }\n            }),\n            divProps: (0, _tslib.__assign)((0, _tslib.__assign)({}, divProps), {\n                className: (0, _utilities.css)(\"ms-List\", className),\n                role: pageElements.length > 0 ? role : undefined\n            })\n        });\n    };\n    List1.prototype._shouldVirtualize = function(props) {\n        if (props === void 0) props = this.props;\n        var onShouldVirtualize = props.onShouldVirtualize;\n        return !onShouldVirtualize || onShouldVirtualize(props);\n    };\n    /**\n     * when props.items change or forceUpdate called, throw away cached pages\n     */ List1.prototype._invalidatePageCache = function() {\n        this._pageCache = {};\n    };\n    List1.prototype._renderPage = function(page) {\n        var _this = this;\n        var usePageCache = this.props.usePageCache;\n        var cachedPage;\n        // if usePageCache is set and cached page element can be found, just return cached page\n        if (usePageCache) {\n            cachedPage = this._pageCache[page.key];\n            if (cachedPage && cachedPage.pageElement) return cachedPage.pageElement;\n        }\n        var pageStyle = this._getPageStyle(page);\n        var _a = this.props.onRenderPage, onRenderPage = _a === void 0 ? this._onRenderPage : _a;\n        var pageElement = onRenderPage({\n            page: page,\n            className: \"ms-List-page\",\n            key: page.key,\n            ref: function(newRef) {\n                _this._pageRefs[page.key] = newRef;\n            },\n            style: pageStyle,\n            role: \"presentation\"\n        }, this._onRenderPage);\n        // cache the first page for now since it is re-rendered a lot times unnecessarily.\n        // todo: a more aggresive caching mechanism is to cache pages constaining the items not changed.\n        // now we re-render pages too frequently, for example, props.items increased from 30 to 60, although the\n        // first 30 items did not change, we still re-rendered all of them in this props.items change.\n        if (usePageCache && page.startIndex === 0) this._pageCache[page.key] = {\n            page: page,\n            pageElement: pageElement\n        };\n        return pageElement;\n    };\n    /** Generate the style object for the page. */ List1.prototype._getPageStyle = function(page) {\n        var getPageStyle = this.props.getPageStyle;\n        return (0, _tslib.__assign)((0, _tslib.__assign)({}, getPageStyle ? getPageStyle(page) : {}), !page.items ? {\n            height: page.height\n        } : {});\n    };\n    /** Track the last item index focused so that we ensure we keep it rendered. */ List1.prototype._onFocus = function(ev) {\n        var target = ev.target;\n        while(target !== this._surface.current){\n            var indexString = target.getAttribute(\"data-list-index\");\n            if (indexString) {\n                this._focusedIndex = Number(indexString);\n                break;\n            }\n            target = (0, _utilities.getParent)(target);\n        }\n    };\n    /**\n     * Called synchronously to reset the required render range to 0 on scrolling. After async scroll has executed,\n     * we will call onAsyncIdle which will reset it back to it's correct value.\n     */ List1.prototype._onScroll = function() {\n        if (!this.state.isScrolling && !this.props.ignoreScrollingState) this.setState({\n            isScrolling: true\n        });\n        this._resetRequiredWindows();\n        this._onScrollingDone();\n    };\n    List1.prototype._resetRequiredWindows = function() {\n        this._requiredWindowsAhead = 0;\n        this._requiredWindowsBehind = 0;\n    };\n    /**\n     * Debounced method to asynchronously update the visible region on a scroll event.\n     */ List1.prototype._onAsyncScroll = function() {\n        this._updateRenderRects(this.props, this.state);\n        // Only update pages when the visible rect falls outside of the materialized rect.\n        if (!this._materializedRect || !_isContainedWithin(this._requiredRect, this._materializedRect)) this.setState(this._updatePages(this.props, this.state));\n    };\n    /**\n     * This is an async debounced method that will try and increment the windows we render. If we can increment\n     * either, we increase the amount we render and re-evaluate.\n     */ List1.prototype._onAsyncIdle = function() {\n        var _a = this.props, renderedWindowsAhead = _a.renderedWindowsAhead, renderedWindowsBehind = _a.renderedWindowsBehind;\n        var _b = this, requiredWindowsAhead = _b._requiredWindowsAhead, requiredWindowsBehind = _b._requiredWindowsBehind;\n        var windowsAhead = Math.min(renderedWindowsAhead, requiredWindowsAhead + 1);\n        var windowsBehind = Math.min(renderedWindowsBehind, requiredWindowsBehind + 1);\n        if (windowsAhead !== requiredWindowsAhead || windowsBehind !== requiredWindowsBehind) {\n            // console.log('idling', windowsBehind, windowsAhead);\n            this._requiredWindowsAhead = windowsAhead;\n            this._requiredWindowsBehind = windowsBehind;\n            this._updateRenderRects(this.props, this.state);\n            this.setState(this._updatePages(this.props, this.state));\n        }\n        if (renderedWindowsAhead > windowsAhead || renderedWindowsBehind > windowsBehind) // Async increment on next tick.\n        this._onAsyncIdle();\n    };\n    /**\n     * Function to call when the list is done scrolling.\n     * This function is debounced.\n     */ List1.prototype._onScrollingDone = function() {\n        if (!this.props.ignoreScrollingState) this.setState({\n            isScrolling: false\n        });\n    };\n    List1.prototype._onAsyncResize = function() {\n        this.forceUpdate();\n    };\n    List1.prototype._updatePages = function(nextProps, previousState) {\n        // console.log('updating pages');\n        if (!this._requiredRect) this._updateRenderRects(nextProps, previousState);\n        var newListState = this._buildPages(nextProps, previousState);\n        var oldListPages = previousState.pages;\n        this._notifyPageChanges(oldListPages, newListState.pages, this.props);\n        return (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, previousState), newListState), {\n            pagesVersion: {}\n        });\n    };\n    /**\n     * Notify consumers that the rendered pages have changed\n     * @param oldPages - The old pages\n     * @param newPages - The new pages\n     * @param props - The props to use\n     */ List1.prototype._notifyPageChanges = function(oldPages, newPages, props) {\n        var onPageAdded = props.onPageAdded, onPageRemoved = props.onPageRemoved;\n        if (onPageAdded || onPageRemoved) {\n            var renderedIndexes = {};\n            for(var _i = 0, oldPages_1 = oldPages; _i < oldPages_1.length; _i++){\n                var page = oldPages_1[_i];\n                if (page.items) renderedIndexes[page.startIndex] = page;\n            }\n            for(var _a = 0, newPages_1 = newPages; _a < newPages_1.length; _a++){\n                var page = newPages_1[_a];\n                if (page.items) {\n                    if (!renderedIndexes[page.startIndex]) this._onPageAdded(page);\n                    else delete renderedIndexes[page.startIndex];\n                }\n            }\n            for(var index in renderedIndexes)if (renderedIndexes.hasOwnProperty(index)) this._onPageRemoved(renderedIndexes[index]);\n        }\n    };\n    List1.prototype._updatePageMeasurements = function(pages) {\n        var heightChanged = false;\n        // when not in virtualize mode, we render all the items without page measurement\n        if (!this._shouldVirtualize()) return heightChanged;\n        for(var i = 0; i < pages.length; i++){\n            var page = pages[i];\n            if (page.items) heightChanged = this._measurePage(page) || heightChanged;\n        }\n        return heightChanged;\n    };\n    /**\n     * Given a page, measure its dimensions, update cache.\n     * @returns True if the height has changed.\n     */ List1.prototype._measurePage = function(page) {\n        var hasChangedHeight = false;\n        var pageElement = this._pageRefs[page.key];\n        var cachedHeight = this._cachedPageHeights[page.startIndex];\n        // console.log('   * measure attempt', page.startIndex, cachedHeight);\n        if (pageElement && this._shouldVirtualize() && (!cachedHeight || cachedHeight.measureVersion !== this._measureVersion)) {\n            var newClientRect = {\n                width: pageElement.clientWidth,\n                height: pageElement.clientHeight\n            };\n            if (newClientRect.height || newClientRect.width) {\n                hasChangedHeight = page.height !== newClientRect.height;\n                // console.warn(' *** expensive page measure', page.startIndex, page.height, newClientRect.height);\n                page.height = newClientRect.height;\n                this._cachedPageHeights[page.startIndex] = {\n                    height: newClientRect.height,\n                    measureVersion: this._measureVersion\n                };\n                this._estimatedPageHeight = Math.round((this._estimatedPageHeight * this._totalEstimates + newClientRect.height) / (this._totalEstimates + 1));\n                this._totalEstimates++;\n            }\n        }\n        return hasChangedHeight;\n    };\n    /** Called when a page has been added to the DOM. */ List1.prototype._onPageAdded = function(page) {\n        var onPageAdded = this.props.onPageAdded;\n        // console.log('page added', page.startIndex, this.state.pages.map(page => page.key).join(', '));\n        if (onPageAdded) onPageAdded(page);\n    };\n    /** Called when a page has been removed from the DOM. */ List1.prototype._onPageRemoved = function(page) {\n        var onPageRemoved = this.props.onPageRemoved;\n        // console.log('  --- page removed', page.startIndex, this.state.pages.map(page => page.key).join(', '));\n        if (onPageRemoved) onPageRemoved(page);\n    };\n    /** Build up the pages that should be rendered. */ List1.prototype._buildPages = function(props, state) {\n        var renderCount = props.renderCount;\n        var items = props.items, startIndex = props.startIndex, getPageHeight = props.getPageHeight;\n        renderCount = this._getRenderCount(props);\n        var materializedRect = (0, _tslib.__assign)({}, EMPTY_RECT);\n        var pages = [];\n        var itemsPerPage = 1;\n        var pageTop = 0;\n        var currentSpacer = null;\n        var focusedIndex = this._focusedIndex;\n        var endIndex = startIndex + renderCount;\n        var shouldVirtualize = this._shouldVirtualize(props);\n        // First render is very important to track; when we render cells, we have no idea of estimated page height.\n        // So we should default to rendering only the first page so that we can get information.\n        // However if the user provides a measure function, let's just assume they know the right heights.\n        var isFirstRender = this._estimatedPageHeight === 0 && !getPageHeight;\n        var allowedRect = this._allowedRect;\n        var _loop_1 = function(itemIndex) {\n            var pageSpecification = this_1._getPageSpecification(itemIndex, allowedRect);\n            var pageHeight = pageSpecification.height;\n            var pageData = pageSpecification.data;\n            var key = pageSpecification.key;\n            itemsPerPage = pageSpecification.itemCount;\n            var pageBottom = pageTop + pageHeight - 1;\n            var isPageRendered = (0, _utilities.findIndex)(state.pages, function(page) {\n                return !!page.items && page.startIndex === itemIndex;\n            }) > -1;\n            var isPageInAllowedRange = !allowedRect || pageBottom >= allowedRect.top && pageTop <= allowedRect.bottom;\n            var isPageInRequiredRange = !this_1._requiredRect || pageBottom >= this_1._requiredRect.top && pageTop <= this_1._requiredRect.bottom;\n            var isPageVisible = !isFirstRender && (isPageInRequiredRange || isPageInAllowedRange && isPageRendered) || !shouldVirtualize;\n            var isPageFocused = focusedIndex >= itemIndex && focusedIndex < itemIndex + itemsPerPage;\n            var isFirstPage = itemIndex === startIndex;\n            // console.log('building page', itemIndex, 'pageTop: ' + pageTop, 'inAllowed: ' +\n            // isPageInAllowedRange, 'inRequired: ' + isPageInRequiredRange);\n            // Only render whats visible, focused, or first page,\n            // or when running in fast rendering mode (not in virtualized mode), we render all current items in pages\n            if (isPageVisible || isPageFocused || isFirstPage) {\n                if (currentSpacer) {\n                    pages.push(currentSpacer);\n                    currentSpacer = null;\n                }\n                var itemsInPage = Math.min(itemsPerPage, endIndex - itemIndex);\n                var newPage = this_1._createPage(key, items.slice(itemIndex, itemIndex + itemsInPage), itemIndex, undefined, undefined, pageData);\n                newPage.top = pageTop;\n                newPage.height = pageHeight;\n                if (this_1._visibleRect && this_1._visibleRect.bottom) newPage.isVisible = pageBottom >= this_1._visibleRect.top && pageTop <= this_1._visibleRect.bottom;\n                pages.push(newPage);\n                if (isPageInRequiredRange && this_1._allowedRect) _mergeRect(materializedRect, {\n                    top: pageTop,\n                    bottom: pageBottom,\n                    height: pageHeight,\n                    left: allowedRect.left,\n                    right: allowedRect.right,\n                    width: allowedRect.width\n                });\n            } else {\n                if (!currentSpacer) currentSpacer = this_1._createPage(SPACER_KEY_PREFIX + itemIndex, undefined, itemIndex, 0, undefined, pageData, true);\n                currentSpacer.height = (currentSpacer.height || 0) + (pageBottom - pageTop) + 1;\n                currentSpacer.itemCount += itemsPerPage;\n            }\n            pageTop += pageBottom - pageTop + 1;\n            // in virtualized mode, we render need to render first page then break and measure,\n            // otherwise, we render all items without measurement to make rendering fast\n            if (isFirstRender && shouldVirtualize) return \"break\";\n        };\n        var this_1 = this;\n        for(var itemIndex1 = startIndex; itemIndex1 < endIndex; itemIndex1 += itemsPerPage){\n            var state_1 = _loop_1(itemIndex1);\n            if (state_1 === \"break\") break;\n        }\n        if (currentSpacer) {\n            currentSpacer.key = SPACER_KEY_PREFIX + \"end\";\n            pages.push(currentSpacer);\n        }\n        this._materializedRect = materializedRect;\n        // console.log('materialized: ', materializedRect);\n        return (0, _tslib.__assign)((0, _tslib.__assign)({}, state), {\n            pages: pages,\n            measureVersion: this._measureVersion\n        });\n    };\n    List1.prototype._getPageSpecification = function(itemIndex, visibleRect) {\n        var getPageSpecification = this.props.getPageSpecification;\n        if (getPageSpecification) {\n            var pageData = getPageSpecification(itemIndex, visibleRect);\n            var _a = pageData.itemCount, itemCount = _a === void 0 ? this._getItemCountForPage(itemIndex, visibleRect) : _a;\n            var _b = pageData.height, height = _b === void 0 ? this._getPageHeight(itemIndex, visibleRect, itemCount) : _b;\n            return {\n                itemCount: itemCount,\n                height: height,\n                data: pageData.data,\n                key: pageData.key\n            };\n        } else {\n            var itemCount = this._getItemCountForPage(itemIndex, visibleRect);\n            return {\n                itemCount: itemCount,\n                height: this._getPageHeight(itemIndex, visibleRect, itemCount)\n            };\n        }\n    };\n    /**\n     * Get the pixel height of a give page. Will use the props getPageHeight first, and if not provided, fallback to\n     * cached height, or estimated page height, or default page height.\n     */ List1.prototype._getPageHeight = function(itemIndex, visibleRect, itemsPerPage) {\n        if (this.props.getPageHeight) return this.props.getPageHeight(itemIndex, visibleRect, itemsPerPage);\n        else {\n            var cachedHeight = this._cachedPageHeights[itemIndex];\n            return cachedHeight ? cachedHeight.height : this._estimatedPageHeight || DEFAULT_PAGE_HEIGHT;\n        }\n    };\n    List1.prototype._getItemCountForPage = function(itemIndex, visibileRect) {\n        var itemsPerPage = this.props.getItemCountForPage ? this.props.getItemCountForPage(itemIndex, visibileRect) : DEFAULT_ITEMS_PER_PAGE;\n        return itemsPerPage ? itemsPerPage : DEFAULT_ITEMS_PER_PAGE;\n    };\n    List1.prototype._createPage = function(pageKey, items, startIndex, count, style, data, isSpacer) {\n        if (startIndex === void 0) startIndex = -1;\n        if (count === void 0) count = items ? items.length : 0;\n        if (style === void 0) style = {};\n        pageKey = pageKey || PAGE_KEY_PREFIX + startIndex;\n        var cachedPage = this._pageCache[pageKey];\n        if (cachedPage && cachedPage.page) return cachedPage.page;\n        return {\n            key: pageKey,\n            startIndex: startIndex,\n            itemCount: count,\n            items: items,\n            style: style,\n            top: 0,\n            height: 0,\n            data: data,\n            isSpacer: isSpacer || false\n        };\n    };\n    List1.prototype._getRenderCount = function(props) {\n        var _a = props || this.props, items = _a.items, startIndex = _a.startIndex, renderCount = _a.renderCount;\n        return renderCount === undefined ? items ? items.length - startIndex : 0 : renderCount;\n    };\n    /** Calculate the visible rect within the list where top: 0 and left: 0 is the top/left of the list. */ List1.prototype._updateRenderRects = function(props, state, forceUpdate) {\n        var renderedWindowsAhead = props.renderedWindowsAhead, renderedWindowsBehind = props.renderedWindowsBehind;\n        var pages = state.pages;\n        // when not in virtualize mode, we render all items without measurement to optimize page rendering perf\n        if (!this._shouldVirtualize(props)) return;\n        var surfaceRect = this._surfaceRect || (0, _tslib.__assign)({}, EMPTY_RECT);\n        var scrollHeight = this._scrollElement && this._scrollElement.scrollHeight;\n        var scrollTop = this._scrollElement ? this._scrollElement.scrollTop : 0;\n        // WARNING: EXPENSIVE CALL! We need to know the surface top relative to the window.\n        // This needs to be called to recalculate when new pages should be loaded.\n        // We check to see how far we've scrolled and if it's further than a third of a page we run it again.\n        if (this._surface.current && (forceUpdate || !pages || !this._surfaceRect || !scrollHeight || scrollHeight !== this._scrollHeight || Math.abs(this._scrollTop - scrollTop) > this._estimatedPageHeight / 3)) {\n            surfaceRect = this._surfaceRect = _measureSurfaceRect(this._surface.current);\n            this._scrollTop = scrollTop;\n        }\n        // If the scroll height has changed, something in the container likely resized and\n        // we should redo the page heights incase their content resized.\n        if (forceUpdate || !scrollHeight || scrollHeight !== this._scrollHeight) this._measureVersion++;\n        this._scrollHeight = scrollHeight;\n        // If the surface is above the container top or below the container bottom, or if this is not the first\n        // render return empty rect.\n        // The first time the list gets rendered we need to calculate the rectangle. The width of the list is\n        // used to calculate the width of the list items.\n        var visibleTop = Math.max(0, -surfaceRect.top);\n        var win = (0, _utilities.getWindow)(this._root.current);\n        var visibleRect = {\n            top: visibleTop,\n            left: surfaceRect.left,\n            bottom: visibleTop + win.innerHeight,\n            right: surfaceRect.right,\n            width: surfaceRect.width,\n            height: win.innerHeight\n        };\n        // The required/allowed rects are adjusted versions of the visible rect.\n        this._requiredRect = _expandRect(visibleRect, this._requiredWindowsBehind, this._requiredWindowsAhead);\n        this._allowedRect = _expandRect(visibleRect, renderedWindowsBehind, renderedWindowsAhead);\n        // store the visible rect for later use.\n        this._visibleRect = visibleRect;\n    };\n    List1.defaultProps = {\n        startIndex: 0,\n        onRenderCell: function(item, index, containsFocus) {\n            return _react.createElement(_react.Fragment, null, item && item.name || \"\");\n        },\n        renderedWindowsAhead: DEFAULT_RENDERED_WINDOWS_AHEAD,\n        renderedWindowsBehind: DEFAULT_RENDERED_WINDOWS_BEHIND\n    };\n    return List1;\n}(_react.Component);\nfunction _expandRect(rect, pagesBefore, pagesAfter) {\n    var top = rect.top - pagesBefore * rect.height;\n    var height = rect.height + (pagesBefore + pagesAfter) * rect.height;\n    return {\n        top: top,\n        bottom: top + height,\n        height: height,\n        left: rect.left,\n        right: rect.right,\n        width: rect.width\n    };\n}\nfunction _isContainedWithin(innerRect, outerRect) {\n    return innerRect.top >= outerRect.top && innerRect.left >= outerRect.left && innerRect.bottom <= outerRect.bottom && innerRect.right <= outerRect.right;\n}\nfunction _mergeRect(targetRect, newRect) {\n    targetRect.top = newRect.top < targetRect.top || targetRect.top === -1 ? newRect.top : targetRect.top;\n    targetRect.left = newRect.left < targetRect.left || targetRect.left === -1 ? newRect.left : targetRect.left;\n    targetRect.bottom = newRect.bottom > targetRect.bottom || targetRect.bottom === -1 ? newRect.bottom : targetRect.bottom;\n    targetRect.right = newRect.right > targetRect.right || targetRect.right === -1 ? newRect.right : targetRect.right;\n    targetRect.width = targetRect.right - targetRect.left + 1;\n    targetRect.height = targetRect.bottom - targetRect.top + 1;\n    return targetRect;\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"./List.types\":\"jqbj1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jqbj1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ScrollToMode\", ()=>ScrollToMode);\nvar ScrollToMode = {\n    /**\n     * Does not make any consideration to where in the viewport the item should align to.\n     */ auto: 0,\n    /**\n     * Attempts to scroll the list so the top of the desired item is aligned with the top of the viewport.\n     */ top: 1,\n    /**\n     * Attempts to scroll the list so the bottom of the desired item is aligned with the bottom of the viewport.\n     */ bottom: 2,\n    /**\n     * Attempts to scroll the list so the desired item is in the exact center of the viewport.\n     */ center: 3\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cnCTi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _commandBar = require(\"office-ui-fabric-react/lib/CommandBar\");\nparcelHelpers.exportAll(_commandBar, exports);\n\n},{\"office-ui-fabric-react/lib/CommandBar\":\"lstE3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lstE3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/CommandBar/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/CommandBar/index\":\"3APvu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3APvu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _commandBar = require(\"./CommandBar\");\nparcelHelpers.exportAll(_commandBar, exports);\nvar _commandBarBase = require(\"./CommandBar.base\");\nparcelHelpers.exportAll(_commandBarBase, exports);\n\n},{\"./CommandBar\":\"8ZDdx\",\"./CommandBar.base\":\"lcQvi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8ZDdx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CommandBar\", ()=>CommandBar);\nvar _utilities = require(\"../../Utilities\");\nvar _commandBarBase = require(\"./CommandBar.base\");\nvar _commandBarStyles = require(\"./CommandBar.styles\");\nvar CommandBar = (0, _utilities.styled)((0, _commandBarBase.CommandBarBase), (0, _commandBarStyles.getStyles), undefined, {\n    scope: \"CommandBar\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./CommandBar.base\":\"lcQvi\",\"./CommandBar.styles\":\"7FygL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lcQvi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CommandBarBase\", ()=>CommandBarBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _overflowSet = require(\"../../OverflowSet\");\nvar _resizeGroup = require(\"../../ResizeGroup\");\nvar _focusZone = require(\"../../FocusZone\");\nvar _button = require(\"../../Button\");\nvar _tooltip = require(\"../../Tooltip\");\nvar _commandBarStyles = require(\"./CommandBar.styles\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar CommandBarBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(CommandBarBase1, _super);\n    function CommandBarBase1(props1) {\n        var _this = _super.call(this, props1) || this;\n        _this._overflowSet = _react.createRef();\n        _this._resizeGroup = _react.createRef();\n        _this._onRenderData = function(data) {\n            return _react.createElement((0, _focusZone.FocusZone), {\n                className: (0, _utilities.css)(_this._classNames.root),\n                direction: (0, _focusZone.FocusZoneDirection).horizontal,\n                role: \"menubar\",\n                \"aria-label\": _this.props.ariaLabel\n            }, _react.createElement((0, _overflowSet.OverflowSet), {\n                role: \"none\",\n                componentRef: _this._overflowSet,\n                className: (0, _utilities.css)(_this._classNames.primarySet),\n                doNotContainWithinFocusZone: true,\n                items: data.primaryItems,\n                overflowItems: data.overflowItems.length ? data.overflowItems : undefined,\n                onRenderItem: _this._onRenderItem,\n                onRenderOverflowButton: _this._onRenderOverflowButton\n            }), data.farItems && data.farItems.length > 0 && _react.createElement((0, _overflowSet.OverflowSet), {\n                role: \"none\",\n                className: (0, _utilities.css)(_this._classNames.secondarySet),\n                doNotContainWithinFocusZone: true,\n                items: data.farItems,\n                onRenderItem: _this._onRenderItem,\n                onRenderOverflowButton: (0, _utilities.nullRender)\n            }));\n        };\n        _this._onRenderItem = function(item) {\n            if (item.onRender) // These are the top level items, there is no relevant menu dismissing function to\n            // provide for the IContextualMenuItem onRender function. Pass in a no op function instead.\n            return item.onRender(item, function() {\n                return undefined;\n            });\n            // eslint-disable-next-line deprecation/deprecation\n            var itemText = item.text || item.name;\n            var commandButtonProps = (0, _tslib.__assign)((0, _tslib.__assign)({\n                allowDisabledFocus: true,\n                role: \"menuitem\"\n            }, item), {\n                styles: (0, _commandBarStyles.getCommandButtonStyles)(item.buttonStyles),\n                className: (0, _utilities.css)(\"ms-CommandBarItem-link\", item.className),\n                text: !item.iconOnly ? itemText : undefined,\n                menuProps: item.subMenuProps,\n                onClick: _this._onButtonClick(item)\n            });\n            if (item.iconOnly && (itemText !== undefined || item.tooltipHostProps)) return _react.createElement((0, _tooltip.TooltipHost), (0, _tslib.__assign)({\n                content: itemText\n            }, item.tooltipHostProps), _this._commandButton(item, commandButtonProps));\n            return _this._commandButton(item, commandButtonProps);\n        };\n        _this._commandButton = function(item, props) {\n            var ButtonAs = _this.props.buttonAs;\n            var CommandBarButtonAs = item.commandBarButtonAs;\n            var DefaultButtonAs = (0, _button.CommandBarButton);\n            // The prop types between these three possible implementations overlap enough that a force-cast is safe.\n            var Type = DefaultButtonAs;\n            if (CommandBarButtonAs) Type = (0, _utilities.composeComponentAs)(CommandBarButtonAs, Type);\n            if (ButtonAs) Type = (0, _utilities.composeComponentAs)(ButtonAs, Type);\n            // Always pass the default implementation to the override so it may be composed.\n            return _react.createElement(Type, (0, _tslib.__assign)({}, props));\n        };\n        _this._onRenderOverflowButton = function(overflowItems) {\n            var _a = _this.props.overflowButtonProps, overflowButtonProps = _a === void 0 ? {} : _a;\n            var combinedOverflowItems = (0, _tslib.__spreadArrays)(overflowButtonProps.menuProps ? overflowButtonProps.menuProps.items : [], overflowItems);\n            var overflowProps = (0, _tslib.__assign)((0, _tslib.__assign)({\n                role: \"menuitem\"\n            }, overflowButtonProps), {\n                styles: (0, _tslib.__assign)({\n                    menuIcon: {\n                        fontSize: \"17px\"\n                    }\n                }, overflowButtonProps.styles),\n                className: (0, _utilities.css)(\"ms-CommandBar-overflowButton\", overflowButtonProps.className),\n                menuProps: (0, _tslib.__assign)((0, _tslib.__assign)({}, overflowButtonProps.menuProps), {\n                    items: combinedOverflowItems\n                }),\n                menuIconProps: (0, _tslib.__assign)({\n                    iconName: \"More\"\n                }, overflowButtonProps.menuIconProps)\n            });\n            var OverflowButtonType = _this.props.overflowButtonAs ? (0, _utilities.composeComponentAs)(_this.props.overflowButtonAs, (0, _button.CommandBarButton)) : (0, _button.CommandBarButton);\n            return _react.createElement(OverflowButtonType, (0, _tslib.__assign)({}, overflowProps));\n        };\n        _this._onReduceData = function(data) {\n            var _a = _this.props, shiftOnReduce = _a.shiftOnReduce, onDataReduced = _a.onDataReduced;\n            var primaryItems = data.primaryItems, overflowItems = data.overflowItems, cacheKey = data.cacheKey;\n            // Use first item if shiftOnReduce, otherwise use last item\n            var movedItem = primaryItems[shiftOnReduce ? 0 : primaryItems.length - 1];\n            if (movedItem !== undefined) {\n                movedItem.renderedInOverflow = true;\n                overflowItems = (0, _tslib.__spreadArrays)([\n                    movedItem\n                ], overflowItems);\n                primaryItems = shiftOnReduce ? primaryItems.slice(1) : primaryItems.slice(0, -1);\n                var newData = (0, _tslib.__assign)((0, _tslib.__assign)({}, data), {\n                    primaryItems: primaryItems,\n                    overflowItems: overflowItems\n                });\n                cacheKey = _this._computeCacheKey({\n                    primaryItems: primaryItems,\n                    overflow: overflowItems.length > 0\n                });\n                if (onDataReduced) onDataReduced(movedItem);\n                newData.cacheKey = cacheKey;\n                return newData;\n            }\n            return undefined;\n        };\n        _this._onGrowData = function(data) {\n            var _a = _this.props, shiftOnReduce = _a.shiftOnReduce, onDataGrown = _a.onDataGrown;\n            var minimumOverflowItems = data.minimumOverflowItems;\n            var primaryItems = data.primaryItems, overflowItems = data.overflowItems, cacheKey = data.cacheKey;\n            var movedItem = overflowItems[0];\n            // Make sure that moved item exists and is not one of the original overflow items\n            if (movedItem !== undefined && overflowItems.length > minimumOverflowItems) {\n                movedItem.renderedInOverflow = false;\n                overflowItems = overflowItems.slice(1);\n                // if shiftOnReduce, movedItem goes first, otherwise, last.\n                primaryItems = shiftOnReduce ? (0, _tslib.__spreadArrays)([\n                    movedItem\n                ], primaryItems) : (0, _tslib.__spreadArrays)(primaryItems, [\n                    movedItem\n                ]);\n                var newData = (0, _tslib.__assign)((0, _tslib.__assign)({}, data), {\n                    primaryItems: primaryItems,\n                    overflowItems: overflowItems\n                });\n                cacheKey = _this._computeCacheKey({\n                    primaryItems: primaryItems,\n                    overflow: overflowItems.length > 0\n                });\n                if (onDataGrown) onDataGrown(movedItem);\n                newData.cacheKey = cacheKey;\n                return newData;\n            }\n            return undefined;\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        return _this;\n    }\n    CommandBarBase1.prototype.render = function() {\n        var _a = this.props, items = _a.items, overflowItems = _a.overflowItems, farItems = _a.farItems, styles = _a.styles, theme = _a.theme, dataDidRender = _a.dataDidRender, _b = _a.onReduceData, onReduceData = _b === void 0 ? this._onReduceData : _b, _c = _a.onGrowData, onGrowData = _c === void 0 ? this._onGrowData : _c;\n        var commandBarData = {\n            primaryItems: (0, _tslib.__spreadArrays)(items),\n            overflowItems: (0, _tslib.__spreadArrays)(overflowItems),\n            minimumOverflowItems: (0, _tslib.__spreadArrays)(overflowItems).length,\n            farItems: farItems,\n            cacheKey: this._computeCacheKey({\n                primaryItems: (0, _tslib.__spreadArrays)(items),\n                overflow: overflowItems && overflowItems.length > 0\n            })\n        };\n        this._classNames = getClassNames(styles, {\n            theme: theme\n        });\n        // ResizeGroup will render these attributes to the root <div>.\n        // TODO We may need to elevate classNames from <FocusZone> into <ResizeGroup> ?\n        var nativeProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties));\n        return _react.createElement((0, _resizeGroup.ResizeGroup), (0, _tslib.__assign)({}, nativeProps, {\n            componentRef: this._resizeGroup,\n            data: commandBarData,\n            onReduceData: onReduceData,\n            onGrowData: onGrowData,\n            onRenderData: this._onRenderData,\n            dataDidRender: dataDidRender\n        }));\n    };\n    CommandBarBase1.prototype.focus = function() {\n        var overflowSet = this._overflowSet.current;\n        overflowSet && overflowSet.focus();\n    };\n    CommandBarBase1.prototype.remeasure = function() {\n        this._resizeGroup.current && this._resizeGroup.current.remeasure();\n    };\n    CommandBarBase1.prototype._onButtonClick = function(item) {\n        return function(ev) {\n            // inactive is deprecated. remove check in 7.0\n            // eslint-disable-next-line deprecation/deprecation\n            if (item.inactive) return;\n            if (item.onClick) item.onClick(ev, item);\n        };\n    };\n    CommandBarBase1.prototype._computeCacheKey = function(data) {\n        var primaryItems = data.primaryItems, overflow = data.overflow;\n        var returnKey = function(acc, current) {\n            var _a = current.cacheKey, cacheKey = _a === void 0 ? current.key : _a;\n            return acc + cacheKey;\n        };\n        var primaryKey = primaryItems && primaryItems.reduce(returnKey, \"\");\n        var overflowKey = overflow ? \"overflow\" : \"\";\n        return [\n            primaryKey,\n            overflowKey\n        ].join(\"\");\n    };\n    CommandBarBase1.defaultProps = {\n        items: [],\n        overflowItems: []\n    };\n    return CommandBarBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../../OverflowSet\":\"j4HzW\",\"../../ResizeGroup\":\"7ngZn\",\"../../FocusZone\":\"cRFhG\",\"../../Button\":\"eMzbU\",\"../../Tooltip\":\"8ruxg\",\"./CommandBar.styles\":\"7FygL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j4HzW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/OverflowSet/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/OverflowSet/index\":\"ad7uh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ad7uh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _overflowSet = require(\"./OverflowSet\");\nparcelHelpers.exportAll(_overflowSet, exports);\nvar _overflowSetBase = require(\"./OverflowSet.base\");\nparcelHelpers.exportAll(_overflowSetBase, exports);\n\n},{\"./OverflowSet\":\"iljIg\",\"./OverflowSet.base\":\"4FQY1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iljIg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"OverflowSet\", ()=>OverflowSet);\nvar _utilities = require(\"../../Utilities\");\nvar _overflowSetBase = require(\"./OverflowSet.base\");\nvar _overflowSetStyles = require(\"./OverflowSet.styles\");\nvar OverflowSet = (0, _utilities.styled)((0, _overflowSetBase.OverflowSetBase), (0, _overflowSetStyles.getStyles), undefined, {\n    scope: \"OverflowSet\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./OverflowSet.base\":\"4FQY1\",\"./OverflowSet.styles\":\"zXuUh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4FQY1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"OverflowSetBase\", ()=>OverflowSetBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _reactFocus = require(\"@fluentui/react-focus\");\nvar _utilities = require(\"../../Utilities\");\nvar _keytipManager = require(\"../../utilities/keytips/KeytipManager\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar COMPONENT_NAME = \"OverflowSet\";\nvar OverflowSetBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(OverflowSetBase1, _super);\n    function OverflowSetBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._focusZone = _react.createRef();\n        _this._persistedKeytips = {};\n        _this._keytipManager = (0, _keytipManager.KeytipManager).getInstance();\n        _this._divContainer = _react.createRef();\n        _this._onRenderItems = function(items) {\n            return items.map(function(item, i) {\n                return _react.createElement(\"div\", {\n                    key: item.key,\n                    className: _this._classNames.item\n                }, _this.props.onRenderItem(item));\n            });\n        };\n        _this._onRenderOverflowButtonWrapper = function(items) {\n            var wrapperDivProps = {\n                className: _this._classNames.overflowButton\n            };\n            var overflowKeytipSequences = _this.props.keytipSequences;\n            var newOverflowItems = [];\n            if (overflowKeytipSequences) items.forEach(function(overflowItem) {\n                var keytip = overflowItem.keytipProps;\n                if (keytip) {\n                    // Create persisted keytip\n                    var persistedKeytip = {\n                        content: keytip.content,\n                        keySequences: keytip.keySequences,\n                        disabled: keytip.disabled || !!(overflowItem.disabled || overflowItem.isDisabled),\n                        hasDynamicChildren: keytip.hasDynamicChildren,\n                        hasMenu: keytip.hasMenu\n                    };\n                    if (keytip.hasDynamicChildren || _this._getSubMenuForItem(overflowItem)) // If the keytip has a submenu or children nodes, change onExecute to persistedKeytipExecute\n                    persistedKeytip.onExecute = _this._keytipManager.menuExecute.bind(_this._keytipManager, overflowKeytipSequences, overflowItem.keytipProps.keySequences);\n                    else // If the keytip doesn't have a submenu, just execute the original function\n                    persistedKeytip.onExecute = keytip.onExecute;\n                    // Add this persisted keytip to our internal list, use a temporary uniqueID (its content)\n                    // uniqueID will get updated on register\n                    _this._persistedKeytips[persistedKeytip.content] = persistedKeytip;\n                    // Add the overflow sequence to this item\n                    var newOverflowItem = (0, _tslib.__assign)((0, _tslib.__assign)({}, overflowItem), {\n                        keytipProps: (0, _tslib.__assign)((0, _tslib.__assign)({}, keytip), {\n                            overflowSetSequence: overflowKeytipSequences\n                        })\n                    });\n                    newOverflowItems.push(newOverflowItem);\n                } else // Nothing to change, add overflowItem to list\n                newOverflowItems.push(overflowItem);\n            });\n            else newOverflowItems = items;\n            return _react.createElement(\"div\", (0, _tslib.__assign)({}, wrapperDivProps), _this.props.onRenderOverflowButton(newOverflowItems));\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        (0, _utilities.warnMutuallyExclusive)(COMPONENT_NAME, props, {\n            doNotContainWithinFocusZone: \"focusZoneProps\"\n        });\n        return _this;\n    }\n    OverflowSetBase1.prototype.render = function() {\n        var _a = this.props, items = _a.items, overflowItems = _a.overflowItems, className = _a.className, // eslint-disable-next-line deprecation/deprecation\n        focusZoneProps = _a.focusZoneProps, styles = _a.styles, vertical = _a.vertical, // eslint-disable-next-line deprecation/deprecation\n        doNotContainWithinFocusZone = _a.doNotContainWithinFocusZone, role = _a.role, _b = _a.overflowSide, overflowSide = _b === void 0 ? \"end\" : _b;\n        this._classNames = getClassNames(styles, {\n            className: className,\n            vertical: vertical\n        });\n        var Tag;\n        var uniqueComponentProps;\n        if (doNotContainWithinFocusZone) {\n            Tag = \"div\";\n            uniqueComponentProps = (0, _tslib.__assign)((0, _tslib.__assign)({}, (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties))), {\n                ref: this._divContainer\n            });\n        } else {\n            Tag = (0, _reactFocus.FocusZone);\n            uniqueComponentProps = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties))), focusZoneProps), {\n                componentRef: this._focusZone,\n                direction: vertical ? (0, _reactFocus.FocusZoneDirection).vertical : (0, _reactFocus.FocusZoneDirection).horizontal\n            });\n        }\n        var showOverflow = overflowItems && overflowItems.length > 0;\n        return _react.createElement(Tag, (0, _tslib.__assign)({\n            role: role || \"group\",\n            \"aria-orientation\": role === \"menubar\" ? vertical === true ? \"vertical\" : \"horizontal\" : undefined\n        }, uniqueComponentProps, {\n            className: this._classNames.root\n        }), overflowSide === \"start\" && showOverflow && this._onRenderOverflowButtonWrapper(overflowItems), items && this._onRenderItems(items), overflowSide === \"end\" && showOverflow && this._onRenderOverflowButtonWrapper(overflowItems));\n    };\n    /**\n     * Sets focus to the first tabbable item in the OverflowSet.\n     * @param forceIntoFirstElement - If true, focus will be forced into the first element,\n     * even if focus is already in theOverflowSet\n     * @returns True if focus could be set to an active element, false if no operation was taken.\n     */ OverflowSetBase1.prototype.focus = function(forceIntoFirstElement) {\n        var focusSucceeded = false;\n        // eslint-disable-next-line deprecation/deprecation\n        if (this.props.doNotContainWithinFocusZone) {\n            if (this._divContainer.current) focusSucceeded = (0, _utilities.focusFirstChild)(this._divContainer.current);\n        } else if (this._focusZone.current) focusSucceeded = this._focusZone.current.focus(forceIntoFirstElement);\n        return focusSucceeded;\n    };\n    /**\n     * Sets focus to a specific child element within the OverflowSet.\n     * @param childElement - The child element within the zone to focus.\n     * @returns True if focus could be set to an active element, false if no operation was taken.\n     */ OverflowSetBase1.prototype.focusElement = function(childElement) {\n        var focusSucceeded = false;\n        if (!childElement) return false;\n        // eslint-disable-next-line deprecation/deprecation\n        if (this.props.doNotContainWithinFocusZone) {\n            if (this._divContainer.current && (0, _utilities.elementContains)(this._divContainer.current, childElement)) {\n                childElement.focus();\n                focusSucceeded = document.activeElement === childElement;\n            }\n        } else if (this._focusZone.current) focusSucceeded = this._focusZone.current.focusElement(childElement);\n        return focusSucceeded;\n    };\n    // Add keytip register/unregister handlers to lifecycle functions to correctly manage persisted keytips\n    OverflowSetBase1.prototype.componentDidMount = function() {\n        this._registerPersistedKeytips();\n    };\n    OverflowSetBase1.prototype.componentWillUnmount = function() {\n        this._unregisterPersistedKeytips();\n    };\n    OverflowSetBase1.prototype.UNSAFE_componentWillUpdate = function() {\n        this._unregisterPersistedKeytips();\n    };\n    OverflowSetBase1.prototype.componentDidUpdate = function() {\n        this._registerPersistedKeytips();\n    };\n    OverflowSetBase1.prototype._registerPersistedKeytips = function() {\n        var _this = this;\n        Object.keys(this._persistedKeytips).forEach(function(key) {\n            var keytip = _this._persistedKeytips[key];\n            var uniqueID = _this._keytipManager.register(keytip, true);\n            // Update map\n            _this._persistedKeytips[uniqueID] = keytip;\n            delete _this._persistedKeytips[key];\n        });\n    };\n    OverflowSetBase1.prototype._unregisterPersistedKeytips = function() {\n        var _this = this;\n        // Delete all persisted keytips saved\n        Object.keys(this._persistedKeytips).forEach(function(uniqueID) {\n            _this._keytipManager.unregister(_this._persistedKeytips[uniqueID], uniqueID, true);\n        });\n        this._persistedKeytips = {};\n    };\n    /**\n     * Gets the subMenu for an overflow item\n     * Checks if itemSubMenuProvider has been defined, if not defaults to subMenuProps\n     */ OverflowSetBase1.prototype._getSubMenuForItem = function(item) {\n        if (this.props.itemSubMenuProvider) return this.props.itemSubMenuProvider(item);\n        if (item.subMenuProps) return item.subMenuProps.items;\n        return undefined;\n    };\n    return OverflowSetBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"@fluentui/react-focus\":\"iDRzD\",\"../../Utilities\":\"2F07a\",\"../../utilities/keytips/KeytipManager\":\"81MTq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"zXuUh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar overflowItemStyle = {\n    flexShrink: 0,\n    display: \"inherit\"\n};\nvar getStyles = function(props) {\n    var className = props.className, vertical = props.vertical;\n    return {\n        root: [\n            \"ms-OverflowSet\",\n            {\n                position: \"relative\",\n                display: \"flex\",\n                flexWrap: \"nowrap\"\n            },\n            vertical && {\n                flexDirection: \"column\"\n            },\n            className, \n        ],\n        item: [\n            \"ms-OverflowSet-item\",\n            overflowItemStyle\n        ],\n        overflowButton: [\n            \"ms-OverflowSet-overflowButton\",\n            overflowItemStyle\n        ]\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ngZn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/ResizeGroup/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/ResizeGroup/index\":\"3ZF81\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3ZF81\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _resizeGroup = require(\"./ResizeGroup\");\nparcelHelpers.exportAll(_resizeGroup, exports);\nvar _resizeGroupBase = require(\"./ResizeGroup.base\");\nparcelHelpers.exportAll(_resizeGroupBase, exports);\nvar _resizeGroupTypes = require(\"./ResizeGroup.types\");\nparcelHelpers.exportAll(_resizeGroupTypes, exports);\n\n},{\"./ResizeGroup\":\"3N550\",\"./ResizeGroup.base\":\"h51lK\",\"./ResizeGroup.types\":\"7gZqB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3N550\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ResizeGroup\", ()=>ResizeGroup);\nvar _resizeGroupBase = require(\"./ResizeGroup.base\");\nvar ResizeGroup = (0, _resizeGroupBase.ResizeGroupBase);\n\n},{\"./ResizeGroup.base\":\"h51lK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h51lK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getMeasurementCache\", ()=>getMeasurementCache);\nparcelHelpers.export(exports, \"getNextResizeGroupStateProvider\", ()=>getNextResizeGroupStateProvider);\nparcelHelpers.export(exports, \"MeasuredContext\", ()=>MeasuredContext);\nparcelHelpers.export(exports, \"ResizeGroupBase\", ()=>ResizeGroupBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _resizeGroupTypes = require(\"./ResizeGroup.types\");\nvar _utilities1 = require(\"@uifabric/utilities\");\nvar RESIZE_DELAY = 16;\nvar getMeasurementCache = function() {\n    var measurementsCache = {};\n    return {\n        /**\n         * Checks if the provided data has a cacheKey. If it has a cacheKey and there is a\n         * corresponding entry in the measurementsCache, then it will return that value.\n         * Returns undefined otherwise.\n         */ getCachedMeasurement: function(data) {\n            if (data && data.cacheKey && measurementsCache.hasOwnProperty(data.cacheKey)) return measurementsCache[data.cacheKey];\n            return undefined;\n        },\n        /**\n         * Should be called whenever there is a new measurement associated with a given data object.\n         * If the data has a cacheKey, store that measurement in the measurementsCache.\n         */ addMeasurementToCache: function(data, measurement) {\n            if (data.cacheKey) measurementsCache[data.cacheKey] = measurement;\n        }\n    };\n};\nvar getNextResizeGroupStateProvider = function(measurementCache) {\n    if (measurementCache === void 0) measurementCache = getMeasurementCache();\n    var _measurementCache = measurementCache;\n    var _containerDimension;\n    /**\n     * Gets the width/height of the data rendered in a hidden div.\n     * @param measuredData - The data corresponding to the measurement we wish to take.\n     * @param getElementToMeasureDimension - A function that returns the measurement of the rendered data.\n     * Only called when the measurement is not in the cache.\n     */ function _getMeasuredDimension(measuredData, getElementToMeasureDimension) {\n        var cachedDimension = _measurementCache.getCachedMeasurement(measuredData);\n        if (cachedDimension !== undefined) return cachedDimension;\n        var measuredDimension = getElementToMeasureDimension();\n        _measurementCache.addMeasurementToCache(measuredData, measuredDimension);\n        return measuredDimension;\n    }\n    /**\n     * Will get the next IResizeGroupState based on the current data while trying to shrink contents\n     * to fit in the container.\n     * @param data - The initial data point to start measuring.\n     * @param onReduceData - Function that transforms the data into something that should render with less width/height.\n     * @param getElementToMeasureDimension - A function that returns the measurement of the rendered data.\n     * Only called when the measurement is not in the cache.\n     */ function _shrinkContentsUntilTheyFit(data, onReduceData, getElementToMeasureDimension) {\n        var dataToMeasure = data;\n        var measuredDimension = _getMeasuredDimension(data, getElementToMeasureDimension);\n        while(measuredDimension > _containerDimension){\n            var nextMeasuredData = onReduceData(dataToMeasure);\n            // We don't want to get stuck in an infinite render loop when there are no more\n            // scaling steps, so implementations of onReduceData should return undefined when\n            // there are no more scaling states to apply.\n            if (nextMeasuredData === undefined) return {\n                renderedData: dataToMeasure,\n                resizeDirection: undefined,\n                dataToMeasure: undefined\n            };\n            measuredDimension = _measurementCache.getCachedMeasurement(nextMeasuredData);\n            // If the measurement isn't in the cache, we need to rerender with some data in a hidden div\n            if (measuredDimension === undefined) return {\n                dataToMeasure: nextMeasuredData,\n                resizeDirection: \"shrink\"\n            };\n            dataToMeasure = nextMeasuredData;\n        }\n        return {\n            renderedData: dataToMeasure,\n            resizeDirection: undefined,\n            dataToMeasure: undefined\n        };\n    }\n    /**\n     * This function should be called when the state changes in a manner that might allow for more content to fit\n     * on the screen, such as the window width/height growing.\n     * @param data - The initial data point to start measuring.\n     * @param onGrowData - Function that transforms the data into something that may take up more space when rendering.\n     * @param getElementToMeasureDimension - A function that returns the measurement of the rendered data.\n     * Only called when the measurement is not in the cache.\n     */ function _growDataUntilItDoesNotFit(data, onGrowData, getElementToMeasureDimension, onReduceData) {\n        var dataToMeasure = data;\n        var measuredDimension = _getMeasuredDimension(data, getElementToMeasureDimension);\n        while(measuredDimension < _containerDimension){\n            var nextMeasuredData = onGrowData(dataToMeasure);\n            // We don't want to get stuck in an infinite render loop when there are no more\n            // scaling steps, so implementations of onGrowData should return undefined when\n            // there are no more scaling states to apply.\n            if (nextMeasuredData === undefined) return {\n                renderedData: dataToMeasure,\n                resizeDirection: undefined,\n                dataToMeasure: undefined\n            };\n            measuredDimension = _measurementCache.getCachedMeasurement(nextMeasuredData);\n            // If the measurement isn't in the cache, we need to rerender with some data in a hidden div\n            if (measuredDimension === undefined) return {\n                dataToMeasure: nextMeasuredData\n            };\n            dataToMeasure = nextMeasuredData;\n        }\n        // Once the loop is done, we should now shrink until the contents fit.\n        return (0, _tslib.__assign)({\n            resizeDirection: \"shrink\"\n        }, _shrinkContentsUntilTheyFit(dataToMeasure, onReduceData, getElementToMeasureDimension));\n    }\n    /**\n     * Handles an update to the container width/height.\n     * Should only be called when we knew the previous container width/height.\n     * @param newDimension - The new width/height of the container.\n     * @param fullDimensionData - The initial data passed in as a prop to resizeGroup.\n     * @param renderedData - The data that was rendered prior to the container size changing.\n     * @param onGrowData - Set to true if the Resize group has an onGrowData function.\n     */ function _updateContainerDimension(newDimension, fullDimensionData, renderedData, onGrowData) {\n        var nextState;\n        if (newDimension > _containerDimension) {\n            if (onGrowData) nextState = {\n                resizeDirection: \"grow\",\n                dataToMeasure: onGrowData(renderedData)\n            };\n            else nextState = {\n                resizeDirection: \"shrink\",\n                dataToMeasure: fullDimensionData\n            };\n        } else nextState = {\n            resizeDirection: \"shrink\",\n            dataToMeasure: renderedData\n        };\n        _containerDimension = newDimension;\n        return (0, _tslib.__assign)((0, _tslib.__assign)({}, nextState), {\n            measureContainer: false\n        });\n    }\n    function getNextState(props, currentState, getElementToMeasureDimension, newContainerDimension) {\n        // If there is no new container width/height or data to measure, there is no need for a new state update\n        if (newContainerDimension === undefined && currentState.dataToMeasure === undefined) return undefined;\n        if (newContainerDimension) {\n            // If we know the last container size and we rendered data at that width/height, we can do an optimized render\n            if (_containerDimension && currentState.renderedData && !currentState.dataToMeasure) return (0, _tslib.__assign)((0, _tslib.__assign)({}, currentState), _updateContainerDimension(newContainerDimension, props.data, currentState.renderedData, props.onGrowData));\n            // If we are just setting the container width/height for the first time, we can't do any optimizations\n            _containerDimension = newContainerDimension;\n        }\n        var nextState = (0, _tslib.__assign)((0, _tslib.__assign)({}, currentState), {\n            measureContainer: false\n        });\n        if (currentState.dataToMeasure) {\n            if (currentState.resizeDirection === \"grow\" && props.onGrowData) nextState = (0, _tslib.__assign)((0, _tslib.__assign)({}, nextState), _growDataUntilItDoesNotFit(currentState.dataToMeasure, props.onGrowData, getElementToMeasureDimension, props.onReduceData));\n            else nextState = (0, _tslib.__assign)((0, _tslib.__assign)({}, nextState), _shrinkContentsUntilTheyFit(currentState.dataToMeasure, props.onReduceData, getElementToMeasureDimension));\n        }\n        return nextState;\n    }\n    /** Function that determines if we need to render content for measurement based on the measurement cache contents. */ function shouldRenderDataForMeasurement(dataToMeasure) {\n        if (!dataToMeasure || _measurementCache.getCachedMeasurement(dataToMeasure) !== undefined) return false;\n        return true;\n    }\n    function getInitialResizeGroupState(data) {\n        return {\n            dataToMeasure: (0, _tslib.__assign)({}, data),\n            resizeDirection: \"grow\",\n            measureContainer: true\n        };\n    }\n    return {\n        getNextState: getNextState,\n        shouldRenderDataForMeasurement: shouldRenderDataForMeasurement,\n        getInitialResizeGroupState: getInitialResizeGroupState\n    };\n};\nvar MeasuredContext = _react.createContext({\n    isMeasured: false\n});\n// Styles for the hidden div used for measurement\nvar hiddenDivStyles = {\n    position: \"fixed\",\n    visibility: \"hidden\"\n};\nvar hiddenParentStyles = {\n    position: \"relative\"\n};\nvar COMPONENT_NAME = \"ResizeGroup\";\nvar ResizeGroupBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ResizeGroupBase1, _super);\n    function ResizeGroupBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._nextResizeGroupStateProvider = getNextResizeGroupStateProvider();\n        // The root div which is the container inside of which we are trying to fit content.\n        _this._root = _react.createRef();\n        // A div that can be used for the initial measurement so that we can avoid mounting a second instance\n        // of the component being measured for the initial render.\n        _this._initialHiddenDiv = _react.createRef();\n        // A hidden div that is used for mounting a new instance of the component for measurement in a hidden\n        // div without unmounting the currently visible content.\n        _this._updateHiddenDiv = _react.createRef();\n        // Tracks if any content has been rendered to the user. This enables us to do some performance optimizations\n        // for the initial render.\n        _this._hasRenderedContent = false;\n        _this.state = _this._nextResizeGroupStateProvider.getInitialResizeGroupState(_this.props.data);\n        (0, _utilities1.initializeComponentRef)(_this);\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._events = new (0, _utilities.EventGroup)(_this);\n        (0, _utilities.warnDeprecations)(COMPONENT_NAME, props, {\n            styles: \"className\"\n        });\n        return _this;\n    }\n    ResizeGroupBase1.prototype.render = function() {\n        var _a = this.props, className = _a.className, onRenderData = _a.onRenderData;\n        var _b = this.state, dataToMeasure = _b.dataToMeasure, renderedData = _b.renderedData;\n        var divProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties), [\n            \"data\"\n        ]);\n        var dataNeedsMeasuring = this._nextResizeGroupStateProvider.shouldRenderDataForMeasurement(dataToMeasure);\n        var isInitialMeasure = !this._hasRenderedContent && dataNeedsMeasuring;\n        // We only ever render the final content to the user. All measurements are done in a hidden div.\n        // For the initial render, we want this to be as fast as possible, so we need to make sure that we only mount one\n        // version of the component for measurement and the final render. For renders that update what is on screen, we\n        // want to make sure that there are no jarring effects such as the screen flashing as we apply scaling steps for\n        // measurement. In the update case, we mount a second version of the component just for measurement purposes and\n        // leave the rendered content untouched until we know the next state to show to the user.\n        return _react.createElement(\"div\", (0, _tslib.__assign)({}, divProps, {\n            className: className,\n            ref: this._root\n        }), _react.createElement(\"div\", {\n            style: hiddenParentStyles\n        }, dataNeedsMeasuring && !isInitialMeasure && _react.createElement(\"div\", {\n            style: hiddenDivStyles,\n            ref: this._updateHiddenDiv\n        }, _react.createElement(MeasuredContext.Provider, {\n            value: {\n                isMeasured: true\n            }\n        }, onRenderData(dataToMeasure))), _react.createElement(\"div\", {\n            ref: this._initialHiddenDiv,\n            style: isInitialMeasure ? hiddenDivStyles : undefined,\n            \"data-automation-id\": \"visibleContent\"\n        }, isInitialMeasure ? onRenderData(dataToMeasure) : renderedData && onRenderData(renderedData))));\n    };\n    ResizeGroupBase1.prototype.componentDidMount = function() {\n        this._afterComponentRendered(this.props.direction);\n        this._events.on(window, \"resize\", this._async.debounce(this._onResize, RESIZE_DELAY, {\n            leading: true\n        }));\n    };\n    ResizeGroupBase1.prototype.UNSAFE_componentWillReceiveProps = function(nextProps) {\n        this.setState({\n            dataToMeasure: (0, _tslib.__assign)({}, nextProps.data),\n            resizeDirection: \"grow\",\n            // Receiving new props means the parent might rerender and the root width/height might change\n            measureContainer: true\n        });\n    };\n    ResizeGroupBase1.prototype.componentDidUpdate = function(prevProps) {\n        if (this.state.renderedData) {\n            this._hasRenderedContent = true;\n            if (this.props.dataDidRender) this.props.dataDidRender(this.state.renderedData);\n        }\n        this._afterComponentRendered(this.props.direction);\n    };\n    ResizeGroupBase1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n    };\n    ResizeGroupBase1.prototype.remeasure = function() {\n        if (this._root.current) this.setState({\n            measureContainer: true\n        });\n    };\n    ResizeGroupBase1.prototype._afterComponentRendered = function(direction) {\n        var _this = this;\n        this._async.requestAnimationFrame(function() {\n            var containerDimension = undefined;\n            if (_this.state.measureContainer && _this._root.current) {\n                var boundingRect = _this._root.current.getBoundingClientRect();\n                containerDimension = direction && direction === (0, _resizeGroupTypes.ResizeGroupDirection).vertical ? boundingRect.height : boundingRect.width;\n            }\n            var nextState = _this._nextResizeGroupStateProvider.getNextState(_this.props, _this.state, function() {\n                var refToMeasure = !_this._hasRenderedContent ? _this._initialHiddenDiv : _this._updateHiddenDiv;\n                if (!refToMeasure.current) return 0;\n                return direction && direction === (0, _resizeGroupTypes.ResizeGroupDirection).vertical ? refToMeasure.current.scrollHeight : refToMeasure.current.scrollWidth;\n            }, containerDimension);\n            if (nextState) _this.setState(nextState);\n        }, this._root.current);\n    };\n    ResizeGroupBase1.prototype._onResize = function() {\n        if (this._root.current) this.setState({\n            measureContainer: true\n        });\n    };\n    return ResizeGroupBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"./ResizeGroup.types\":\"7gZqB\",\"@uifabric/utilities\":\"uTCgd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7gZqB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ResizeGroupDirection\", ()=>ResizeGroupDirection);\nvar ResizeGroupDirection;\n(function(ResizeGroupDirection1) {\n    ResizeGroupDirection1[ResizeGroupDirection1[\"horizontal\"] = 0] = \"horizontal\";\n    ResizeGroupDirection1[ResizeGroupDirection1[\"vertical\"] = 1] = \"vertical\";\n})(ResizeGroupDirection || (ResizeGroupDirection = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8ruxg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Tooltip/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Tooltip/index\":\"4wdMV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4wdMV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _tooltip = require(\"./Tooltip\");\nparcelHelpers.exportAll(_tooltip, exports);\nvar _tooltipBase = require(\"./Tooltip.base\");\nparcelHelpers.exportAll(_tooltipBase, exports);\nvar _tooltipTypes = require(\"./Tooltip.types\");\nparcelHelpers.exportAll(_tooltipTypes, exports);\nvar _tooltipHost = require(\"./TooltipHost\");\nparcelHelpers.exportAll(_tooltipHost, exports);\nvar _tooltipHostBase = require(\"./TooltipHost.base\");\nparcelHelpers.exportAll(_tooltipHostBase, exports);\nvar _tooltipHostTypes = require(\"./TooltipHost.types\");\nparcelHelpers.exportAll(_tooltipHostTypes, exports);\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nparcelHelpers.exportAll(_directionalHint, exports);\n\n},{\"./Tooltip\":\"3WZhG\",\"./Tooltip.base\":\"93gnN\",\"./Tooltip.types\":\"aBpQs\",\"./TooltipHost\":\"39Rne\",\"./TooltipHost.base\":\"gddAc\",\"./TooltipHost.types\":\"5nR1L\",\"../../common/DirectionalHint\":\"kARBR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3WZhG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Tooltip\", ()=>Tooltip);\nvar _utilities = require(\"../../Utilities\");\nvar _tooltipBase = require(\"./Tooltip.base\");\nvar _tooltipStyles = require(\"./Tooltip.styles\");\nvar Tooltip = (0, _utilities.styled)((0, _tooltipBase.TooltipBase), (0, _tooltipStyles.getStyles), undefined, {\n    scope: \"Tooltip\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Tooltip.base\":\"93gnN\",\"./Tooltip.styles\":\"jV120\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"93gnN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TooltipBase\", ()=>TooltipBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _callout = require(\"../../Callout\");\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar TooltipBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(TooltipBase1, _super);\n    function TooltipBase1() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._onRenderContent = function(props) {\n            return _react.createElement(\"p\", {\n                className: _this._classNames.subText\n            }, props.content);\n        };\n        return _this;\n    }\n    TooltipBase1.prototype.render = function() {\n        var _a = this.props, className = _a.className, calloutProps = _a.calloutProps, directionalHint = _a.directionalHint, directionalHintForRTL = _a.directionalHintForRTL, styles = _a.styles, id = _a.id, maxWidth = _a.maxWidth, _b = _a.onRenderContent, onRenderContent = _b === void 0 ? this._onRenderContent : _b, targetElement = _a.targetElement, theme = _a.theme;\n        this._classNames = getClassNames(styles, {\n            theme: theme,\n            className: className || calloutProps && calloutProps.className,\n            beakWidth: calloutProps && calloutProps.beakWidth,\n            gapSpace: calloutProps && calloutProps.gapSpace,\n            maxWidth: maxWidth\n        });\n        return _react.createElement((0, _callout.Callout), (0, _tslib.__assign)({\n            target: targetElement,\n            directionalHint: directionalHint,\n            directionalHintForRTL: directionalHintForRTL\n        }, calloutProps, (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties), [\n            \"id\"\n        ]), {\n            className: this._classNames.root\n        }), _react.createElement(\"div\", {\n            className: this._classNames.content,\n            id: id,\n            role: \"tooltip\",\n            onMouseEnter: this.props.onMouseEnter,\n            onMouseLeave: this.props.onMouseLeave\n        }, onRenderContent(this.props, this._onRenderContent)));\n    };\n    // Specify default props values\n    TooltipBase1.defaultProps = {\n        directionalHint: (0, _directionalHint.DirectionalHint).topCenter,\n        maxWidth: \"364px\",\n        calloutProps: {\n            isBeakVisible: true,\n            beakWidth: 16,\n            gapSpace: 0,\n            setInitialFocus: true,\n            doNotLayer: false\n        }\n    };\n    return TooltipBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../../Callout\":\"jhXLC\",\"../../common/DirectionalHint\":\"kARBR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jV120\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar getStyles = function(props) {\n    var className = props.className, _a = props.beakWidth, beakWidth = _a === void 0 ? 16 : _a, _b = props.gapSpace, gapSpace = _b === void 0 ? 0 : _b, maxWidth = props.maxWidth, theme = props.theme;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, effects = theme.effects;\n    // The math here is done to account for the 45 degree rotation of the beak\n    // and sub-pixel rounding that differs across browsers, which is more noticeable when\n    // the device pixel ratio is larger\n    var tooltipGapSpace = -(Math.sqrt(beakWidth * beakWidth / 2) + gapSpace) + 1 / window.devicePixelRatio;\n    return {\n        root: [\n            \"ms-Tooltip\",\n            theme.fonts.medium,\n            (0, _styling.AnimationClassNames).fadeIn200,\n            {\n                background: semanticColors.menuBackground,\n                boxShadow: effects.elevation8,\n                padding: \"8px\",\n                maxWidth: maxWidth,\n                selectors: {\n                    \":after\": {\n                        content: \"''\",\n                        position: \"absolute\",\n                        bottom: tooltipGapSpace,\n                        left: tooltipGapSpace,\n                        right: tooltipGapSpace,\n                        top: tooltipGapSpace,\n                        zIndex: 0\n                    }\n                }\n            },\n            className, \n        ],\n        content: [\n            \"ms-Tooltip-content\",\n            fonts.small,\n            {\n                position: \"relative\",\n                zIndex: 1,\n                color: semanticColors.menuItemText,\n                wordWrap: \"break-word\",\n                overflowWrap: \"break-word\",\n                overflow: \"hidden\"\n            }, \n        ],\n        subText: [\n            \"ms-Tooltip-subtext\",\n            {\n                // Using inherit here to avoid unintentional global overrides of the <p> tag.\n                fontSize: \"inherit\",\n                fontWeight: \"inherit\",\n                color: \"inherit\",\n                margin: 0\n            }, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aBpQs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TooltipDelay\", ()=>TooltipDelay);\nvar TooltipDelay;\n(function(TooltipDelay1) {\n    TooltipDelay1[TooltipDelay1[\"zero\"] = 0] = \"zero\";\n    /** 300 ms delay before showng the tooltip */ TooltipDelay1[TooltipDelay1[\"medium\"] = 1] = \"medium\";\n    /** 500 ms delay before showing the tooltip */ TooltipDelay1[TooltipDelay1[\"long\"] = 2] = \"long\";\n})(TooltipDelay || (TooltipDelay = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"39Rne\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TooltipHost\", ()=>TooltipHost);\nvar _utilities = require(\"../../Utilities\");\nvar _tooltipHostBase = require(\"./TooltipHost.base\");\nvar _tooltipHostStyles = require(\"./TooltipHost.styles\");\nvar TooltipHost = (0, _utilities.styled)((0, _tooltipHostBase.TooltipHostBase), (0, _tooltipHostStyles.getStyles), undefined, {\n    scope: \"TooltipHost\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./TooltipHost.base\":\"gddAc\",\"./TooltipHost.styles\":\"1LJ9f\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gddAc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TooltipHostBase\", ()=>TooltipHostBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"../../Utilities\");\nvar _tooltipHostTypes = require(\"./TooltipHost.types\");\nvar _tooltip = require(\"./Tooltip\");\nvar _tooltipTypes = require(\"./Tooltip.types\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar TooltipHostBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(TooltipHostBase1, _super);\n    // Constructor\n    function TooltipHostBase1(props) {\n        var _this = _super.call(this, props) || this;\n        // The wrapping div that gets the hover events\n        _this._tooltipHost = _react.createRef();\n        _this._defaultTooltipId = (0, _utilities.getId)(\"tooltip\");\n        _this.show = function() {\n            _this._toggleTooltip(true);\n        };\n        _this.dismiss = function() {\n            _this._hideTooltip();\n        };\n        _this._getTargetElement = function() {\n            if (!_this._tooltipHost.current) return undefined;\n            var overflowMode = _this.props.overflowMode;\n            // Select target element based on overflow mode. For parent mode, you want to position the tooltip relative\n            // to the parent element, otherwise it might look off.\n            if (overflowMode !== undefined) switch(overflowMode){\n                case (0, _tooltipHostTypes.TooltipOverflowMode).Parent:\n                    return _this._tooltipHost.current.parentElement;\n                case (0, _tooltipHostTypes.TooltipOverflowMode).Self:\n                    return _this._tooltipHost.current;\n            }\n            return _this._tooltipHost.current;\n        };\n        // Show Tooltip\n        _this._onTooltipMouseEnter = function(ev) {\n            var _a = _this.props, overflowMode = _a.overflowMode, delay = _a.delay;\n            if (TooltipHostBase1._currentVisibleTooltip && TooltipHostBase1._currentVisibleTooltip !== _this) TooltipHostBase1._currentVisibleTooltip.dismiss();\n            TooltipHostBase1._currentVisibleTooltip = _this;\n            if (overflowMode !== undefined) {\n                var overflowElement = _this._getTargetElement();\n                if (overflowElement && !(0, _utilities.hasOverflow)(overflowElement)) return;\n            }\n            if (ev.target && (0, _utilities.portalContainsElement)(ev.target, _this._getTargetElement())) // Do not show tooltip when target is inside a portal relative to TooltipHost.\n            return;\n            _this._clearDismissTimer();\n            _this._clearOpenTimer();\n            if (delay !== (0, _tooltipTypes.TooltipDelay).zero) {\n                var delayTime = _this._getDelayTime(delay); // non-null assertion because we set it in `defaultProps`\n                _this._openTimerId = _this._async.setTimeout(function() {\n                    _this._toggleTooltip(true);\n                }, delayTime);\n            } else _this._toggleTooltip(true);\n        };\n        // Hide Tooltip\n        _this._onTooltipMouseLeave = function(ev) {\n            var closeDelay = _this.props.closeDelay;\n            _this._clearDismissTimer();\n            _this._clearOpenTimer();\n            if (closeDelay) _this._dismissTimerId = _this._async.setTimeout(function() {\n                _this._toggleTooltip(false);\n            }, closeDelay);\n            else _this._toggleTooltip(false);\n            if (TooltipHostBase1._currentVisibleTooltip === _this) TooltipHostBase1._currentVisibleTooltip = undefined;\n        };\n        _this._onTooltipKeyDown = function(ev) {\n            if ((ev.which === (0, _utilities.KeyCodes).escape || ev.ctrlKey) && _this.state.isTooltipVisible) {\n                _this._hideTooltip();\n                ev.stopPropagation();\n            }\n        };\n        _this._clearDismissTimer = function() {\n            _this._async.clearTimeout(_this._dismissTimerId);\n        };\n        _this._clearOpenTimer = function() {\n            _this._async.clearTimeout(_this._openTimerId);\n        };\n        // Hide Tooltip\n        _this._hideTooltip = function() {\n            _this._clearOpenTimer();\n            _this._clearDismissTimer();\n            _this._toggleTooltip(false);\n        };\n        _this._toggleTooltip = function(isTooltipVisible) {\n            if (_this.state.isTooltipVisible !== isTooltipVisible) _this.setState({\n                isTooltipVisible: isTooltipVisible\n            }, function() {\n                return _this.props.onTooltipToggle && _this.props.onTooltipToggle(isTooltipVisible);\n            });\n        };\n        _this._getDelayTime = function(delay) {\n            switch(delay){\n                case (0, _tooltipTypes.TooltipDelay).medium:\n                    return 300;\n                case (0, _tooltipTypes.TooltipDelay).long:\n                    return 500;\n                default:\n                    return 0;\n            }\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        _this.state = {\n            isAriaPlaceholderRendered: false,\n            isTooltipVisible: false\n        };\n        _this._async = new (0, _utilities.Async)(_this);\n        return _this;\n    }\n    // Render\n    TooltipHostBase1.prototype.render = function() {\n        var _a = this.props, calloutProps = _a.calloutProps, children = _a.children, content = _a.content, directionalHint = _a.directionalHint, directionalHintForRTL = _a.directionalHintForRTL, className = _a.hostClassName, id = _a.id, _b = _a.setAriaDescribedBy, setAriaDescribedBy = _b === void 0 ? true : _b, tooltipProps = _a.tooltipProps, styles = _a.styles, theme = _a.theme;\n        this._classNames = getClassNames(styles, {\n            theme: theme,\n            className: className\n        });\n        var isTooltipVisible = this.state.isTooltipVisible;\n        var tooltipId = id || this._defaultTooltipId;\n        var isContentPresent = !!(content || tooltipProps && tooltipProps.onRenderContent && tooltipProps.onRenderContent());\n        var showTooltip = isTooltipVisible && isContentPresent;\n        var ariaDescribedBy = setAriaDescribedBy && isTooltipVisible && isContentPresent ? tooltipId : undefined;\n        return _react.createElement(\"div\", (0, _tslib.__assign)({\n            className: this._classNames.root,\n            ref: this._tooltipHost\n        }, {\n            onFocusCapture: this._onTooltipMouseEnter\n        }, {\n            onBlurCapture: this._hideTooltip\n        }, {\n            onMouseEnter: this._onTooltipMouseEnter,\n            onMouseLeave: this._onTooltipMouseLeave,\n            onKeyDown: this._onTooltipKeyDown,\n            \"aria-describedby\": ariaDescribedBy\n        }), children, showTooltip && _react.createElement((0, _tooltip.Tooltip), (0, _tslib.__assign)({\n            id: tooltipId + \"--tooltip\",\n            content: content,\n            targetElement: this._getTargetElement(),\n            directionalHint: directionalHint,\n            directionalHintForRTL: directionalHintForRTL,\n            calloutProps: (0, _utilities.assign)({}, calloutProps, {\n                onDismiss: this._hideTooltip,\n                onMouseEnter: this._onTooltipMouseEnter,\n                onMouseLeave: this._onTooltipMouseLeave\n            }),\n            onMouseEnter: this._onTooltipMouseEnter,\n            onMouseLeave: this._onTooltipMouseLeave\n        }, (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties), [\n            \"id\"\n        ]), tooltipProps)), _react.createElement(\"div\", {\n            hidden: true,\n            id: tooltipId,\n            style: (0, _styling.hiddenContentStyle)\n        }, content));\n    };\n    TooltipHostBase1.prototype.componentWillUnmount = function() {\n        if (TooltipHostBase1._currentVisibleTooltip && TooltipHostBase1._currentVisibleTooltip === this) TooltipHostBase1._currentVisibleTooltip = undefined;\n        this._async.dispose();\n    };\n    TooltipHostBase1.defaultProps = {\n        delay: (0, _tooltipTypes.TooltipDelay).medium\n    };\n    return TooltipHostBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Styling\":\"7JwBd\",\"../../Utilities\":\"2F07a\",\"./TooltipHost.types\":\"5nR1L\",\"./Tooltip\":\"3WZhG\",\"./Tooltip.types\":\"aBpQs\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5nR1L\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TooltipOverflowMode\", ()=>TooltipOverflowMode);\nvar TooltipOverflowMode;\n(function(TooltipOverflowMode1) {\n    /** Only show tooltip if parent DOM element is overflowing */ TooltipOverflowMode1[TooltipOverflowMode1[\"Parent\"] = 0] = \"Parent\";\n    /**\n     * Only show tooltip if tooltip host's content is overflowing.\n     * Note that this does not check the children for overflow, only the TooltipHost root.\n     */ TooltipOverflowMode1[TooltipOverflowMode1[\"Self\"] = 1] = \"Self\";\n})(TooltipOverflowMode || (TooltipOverflowMode = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1LJ9f\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar GlobalClassNames = {\n    root: \"ms-TooltipHost\",\n    ariaPlaceholder: \"ms-TooltipHost-aria-placeholder\"\n};\nvar getStyles = function(props) {\n    var className = props.className, theme = props.theme;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        root: [\n            classNames.root,\n            {\n                display: \"inline\"\n            },\n            className, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7FygL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nparcelHelpers.export(exports, \"getCommandButtonStyles\", ()=>getCommandButtonStyles);\nvar _tslib = require(\"tslib\");\nvar _utilities = require(\"../../Utilities\");\nvar COMMAND_BAR_HEIGHT = 44;\nvar getStyles = function(props) {\n    var className = props.className, theme = props.theme;\n    var semanticColors = theme.semanticColors;\n    return {\n        root: [\n            theme.fonts.medium,\n            \"ms-CommandBar\",\n            {\n                display: \"flex\",\n                backgroundColor: semanticColors.bodyBackground,\n                padding: \"0 14px 0 24px\",\n                height: COMMAND_BAR_HEIGHT\n            },\n            className, \n        ],\n        primarySet: [\n            \"ms-CommandBar-primaryCommand\",\n            {\n                flexGrow: \"1\",\n                display: \"flex\",\n                alignItems: \"stretch\"\n            }, \n        ],\n        secondarySet: [\n            \"ms-CommandBar-secondaryCommand\",\n            {\n                flexShrink: \"0\",\n                display: \"flex\",\n                alignItems: \"stretch\"\n            }, \n        ]\n    };\n};\nvar getCommandButtonStyles = (0, _utilities.memoizeFunction)(function(customStyles) {\n    var rootStyles = {\n        height: \"100%\"\n    };\n    var labelStyles = {\n        whiteSpace: \"nowrap\"\n    };\n    var _a = customStyles || {}, root = _a.root, label = _a.label, restCustomStyles = (0, _tslib.__rest)(_a, [\n        \"root\",\n        \"label\"\n    ]);\n    return (0, _tslib.__assign)((0, _tslib.__assign)({}, restCustomStyles), {\n        root: root ? [\n            rootStyles,\n            root\n        ] : rootStyles,\n        label: label ? [\n            labelStyles,\n            label\n        ] : labelStyles\n    });\n});\n\n},{\"tslib\":\"01Tx1\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5W7tr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _contextualMenu = require(\"office-ui-fabric-react/lib/ContextualMenu\");\nparcelHelpers.exportAll(_contextualMenu, exports);\n\n},{\"office-ui-fabric-react/lib/ContextualMenu\":\"7Q8DP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d0PNn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _utilities = require(\"office-ui-fabric-react/lib/Utilities\");\nparcelHelpers.exportAll(_utilities, exports);\n\n},{\"office-ui-fabric-react/lib/Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lhftW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _dialog = require(\"office-ui-fabric-react/lib/Dialog\");\nparcelHelpers.exportAll(_dialog, exports);\n\n},{\"office-ui-fabric-react/lib/Dialog\":\"kU2a3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kU2a3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>(0, _index.Dialog));\nvar _index = require(\"./components/Dialog/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Dialog/index\":\"deAGe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"deAGe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _dialog = require(\"./Dialog\");\nparcelHelpers.exportAll(_dialog, exports);\nvar _dialogBase = require(\"./Dialog.base\");\nparcelHelpers.exportAll(_dialogBase, exports);\nvar _dialogContent = require(\"./DialogContent\");\nparcelHelpers.exportAll(_dialogContent, exports);\nvar _dialogContentBase = require(\"./DialogContent.base\");\nparcelHelpers.exportAll(_dialogContentBase, exports);\nvar _dialogFooter = require(\"./DialogFooter\");\nparcelHelpers.exportAll(_dialogFooter, exports);\nvar _dialogFooterBase = require(\"./DialogFooter.base\");\nparcelHelpers.exportAll(_dialogFooterBase, exports);\nvar _dialogContentTypes = require(\"./DialogContent.types\");\nparcelHelpers.exportAll(_dialogContentTypes, exports);\n\n},{\"./Dialog\":\"5I5uV\",\"./Dialog.base\":\"hdlpR\",\"./DialogContent\":\"4xQCl\",\"./DialogContent.base\":\"8NiKT\",\"./DialogFooter\":\"7Knvz\",\"./DialogFooter.base\":\"7GT3H\",\"./DialogContent.types\":\"cNw91\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5I5uV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Dialog\", ()=>Dialog);\nvar _utilities = require(\"../../Utilities\");\nvar _dialogBase = require(\"./Dialog.base\");\nvar _dialogStyles = require(\"./Dialog.styles\");\nvar Dialog = (0, _utilities.styled)((0, _dialogBase.DialogBase), (0, _dialogStyles.getStyles), undefined, {\n    scope: \"Dialog\"\n});\nDialog.displayName = \"Dialog\";\n\n},{\"../../Utilities\":\"2F07a\",\"./Dialog.base\":\"hdlpR\",\"./Dialog.styles\":\"cp8ts\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hdlpR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DialogBase\", ()=>DialogBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _dialogContentTypes = require(\"./DialogContent.types\");\nvar _modal = require(\"../../Modal\");\nvar _withResponsiveMode = require(\"../../utilities/decorators/withResponsiveMode\");\nvar _dialogContent = require(\"./DialogContent\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar DefaultModalProps = {\n    isDarkOverlay: false,\n    isBlocking: false,\n    className: \"\",\n    containerClassName: \"\",\n    topOffsetFixed: false\n};\nvar DefaultDialogContentProps = {\n    type: (0, _dialogContentTypes.DialogType).normal,\n    className: \"\",\n    topButtonsProps: []\n};\nvar DialogBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(DialogBase1, _super);\n    function DialogBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._getSubTextId = function() {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a = _this.props, ariaDescribedById = _a.ariaDescribedById, modalProps = _a.modalProps, dialogContentProps = _a.dialogContentProps, subText = _a.subText;\n            var id = modalProps && modalProps.subtitleAriaId || ariaDescribedById;\n            if (!id) id = (dialogContentProps && dialogContentProps.subText || subText) && _this._defaultSubTextId;\n            return id;\n        };\n        _this._getTitleTextId = function() {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a = _this.props, ariaLabelledById = _a.ariaLabelledById, modalProps = _a.modalProps, dialogContentProps = _a.dialogContentProps, title = _a.title;\n            var id = modalProps && modalProps.titleAriaId || ariaLabelledById;\n            if (!id) id = (dialogContentProps && dialogContentProps.title || title) && _this._defaultTitleTextId;\n            return id;\n        };\n        _this._id = (0, _utilities.getId)(\"Dialog\");\n        _this._defaultTitleTextId = _this._id + \"-title\";\n        _this._defaultSubTextId = _this._id + \"-subText\";\n        return _this;\n    }\n    DialogBase1.prototype.render = function() {\n        var _a, _b;\n        var _c = this.props, /* eslint-disable deprecation/deprecation */ className = _c.className, containerClassName = _c.containerClassName, contentClassName = _c.contentClassName, elementToFocusOnDismiss = _c.elementToFocusOnDismiss, firstFocusableSelector = _c.firstFocusableSelector, forceFocusInsideTrap = _c.forceFocusInsideTrap, styles = _c.styles, hidden = _c.hidden, ignoreExternalFocusing = _c.ignoreExternalFocusing, isBlocking = _c.isBlocking, isClickableOutsideFocusTrap = _c.isClickableOutsideFocusTrap, isDarkOverlay = _c.isDarkOverlay, isOpen = _c.isOpen, onDismiss = _c.onDismiss, onDismissed = _c.onDismissed, onLayerDidMount = _c.onLayerDidMount, responsiveMode = _c.responsiveMode, subText = _c.subText, theme = _c.theme, title = _c.title, topButtonsProps = _c.topButtonsProps, type = _c.type, /* eslint-enable deprecation/deprecation */ minWidth = _c.minWidth, maxWidth = _c.maxWidth, modalProps = _c.modalProps;\n        var mergedLayerProps = (0, _tslib.__assign)({}, modalProps ? modalProps.layerProps : {\n            onLayerDidMount: onLayerDidMount\n        });\n        if (onLayerDidMount && !mergedLayerProps.onLayerDidMount) mergedLayerProps.onLayerDidMount = onLayerDidMount;\n        var dialogDraggableClassName;\n        var dragOptions;\n        // if we are draggable, make sure we are using the correct\n        // draggable classname and selectors\n        if (modalProps && modalProps.dragOptions && !modalProps.dragOptions.dragHandleSelector) {\n            dialogDraggableClassName = \"ms-Dialog-draggable-header\";\n            dragOptions = (0, _tslib.__assign)((0, _tslib.__assign)({}, modalProps.dragOptions), {\n                dragHandleSelector: \".\" + dialogDraggableClassName\n            });\n        } else dragOptions = modalProps && modalProps.dragOptions;\n        var mergedModalProps = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, DefaultModalProps), {\n            className: className,\n            containerClassName: containerClassName,\n            isBlocking: isBlocking,\n            isDarkOverlay: isDarkOverlay,\n            onDismissed: onDismissed\n        }), modalProps), {\n            layerProps: mergedLayerProps,\n            dragOptions: dragOptions\n        });\n        var dialogContentProps = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({\n            className: contentClassName,\n            subText: subText,\n            title: title,\n            topButtonsProps: topButtonsProps,\n            type: type\n        }, DefaultDialogContentProps), this.props.dialogContentProps), {\n            draggableHeaderClassName: dialogDraggableClassName,\n            titleProps: (0, _tslib.__assign)({\n                // eslint-disable-next-line deprecation/deprecation\n                id: ((_a = this.props.dialogContentProps) === null || _a === void 0 ? void 0 : _a.titleId) || this._defaultTitleTextId\n            }, (_b = this.props.dialogContentProps) === null || _b === void 0 ? void 0 : _b.titleProps)\n        });\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: mergedModalProps.className,\n            containerClassName: mergedModalProps.containerClassName,\n            hidden: hidden,\n            dialogDefaultMinWidth: minWidth,\n            dialogDefaultMaxWidth: maxWidth\n        });\n        return _react.createElement((0, _modal.Modal), (0, _tslib.__assign)({\n            elementToFocusOnDismiss: elementToFocusOnDismiss,\n            firstFocusableSelector: firstFocusableSelector,\n            forceFocusInsideTrap: forceFocusInsideTrap,\n            ignoreExternalFocusing: ignoreExternalFocusing,\n            isClickableOutsideFocusTrap: isClickableOutsideFocusTrap,\n            responsiveMode: responsiveMode\n        }, mergedModalProps, {\n            isOpen: isOpen !== undefined ? isOpen : !hidden,\n            className: classNames.root,\n            containerClassName: classNames.main,\n            onDismiss: onDismiss ? onDismiss : mergedModalProps.onDismiss,\n            subtitleAriaId: this._getSubTextId(),\n            titleAriaId: this._getTitleTextId()\n        }), _react.createElement((0, _dialogContent.DialogContent), (0, _tslib.__assign)({\n            subTextId: this._defaultSubTextId,\n            showCloseButton: mergedModalProps.isBlocking,\n            onDismiss: onDismiss\n        }, dialogContentProps), this.props.children));\n    };\n    DialogBase1.defaultProps = {\n        hidden: true\n    };\n    DialogBase1 = (0, _tslib.__decorate)([\n        (0, _withResponsiveMode.withResponsiveMode)\n    ], DialogBase1);\n    return DialogBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"./DialogContent.types\":\"cNw91\",\"../../Modal\":\"1J5Mf\",\"../../utilities/decorators/withResponsiveMode\":\"i57Mj\",\"./DialogContent\":\"4xQCl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cNw91\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ResponsiveMode\", ()=>(0, _withResponsiveMode.ResponsiveMode)) // Exported because the type is an optional prop and not exported otherwise.\n;\nparcelHelpers.export(exports, \"DialogType\", ()=>DialogType);\nvar _withResponsiveMode = require(\"../../utilities/decorators/withResponsiveMode\");\nvar DialogType;\n(function(DialogType1) {\n    /** Standard dialog */ DialogType1[DialogType1[\"normal\"] = 0] = \"normal\";\n    /** Dialog with large header banner */ DialogType1[DialogType1[\"largeHeader\"] = 1] = \"largeHeader\";\n    /** Dialog with an 'x' close button in the upper-right corner */ DialogType1[DialogType1[\"close\"] = 2] = \"close\";\n})(DialogType || (DialogType = {}));\n\n},{\"../../utilities/decorators/withResponsiveMode\":\"i57Mj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1J5Mf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>(0, _index.Modal));\nvar _index = require(\"./components/Modal/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Modal/index\":\"gmQQK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gmQQK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _modal = require(\"./Modal\");\nparcelHelpers.exportAll(_modal, exports);\nvar _modalBase = require(\"./Modal.base\");\nparcelHelpers.exportAll(_modalBase, exports);\n\n},{\"./Modal\":\"81oSq\",\"./Modal.base\":\"f507g\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"81oSq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Modal\", ()=>Modal);\nvar _utilities = require(\"../../Utilities\");\nvar _modalBase = require(\"./Modal.base\");\nvar _modalStyles = require(\"./Modal.styles\");\nvar Modal = (0, _utilities.styled)((0, _modalBase.ModalBase), (0, _modalStyles.getStyles), undefined, {\n    scope: \"Modal\",\n    fields: [\n        \"theme\",\n        \"styles\",\n        \"enableAriaHiddenSiblings\"\n    ]\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Modal.base\":\"f507g\",\"./Modal.styles\":\"di8jQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f507g\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ModalBase\", ()=>ModalBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _index = require(\"../FocusTrapZone/index\");\nvar _modalStyles = require(\"./Modal.styles\");\nvar _overlay = require(\"../../Overlay\");\nvar _layer = require(\"../../Layer\");\nvar _index1 = require(\"../Popup/index\");\nvar _withResponsiveMode = require(\"../../utilities/decorators/withResponsiveMode\");\nvar _index2 = require(\"../Callout/index\");\nvar _index3 = require(\"../Icon/index\");\nvar _index4 = require(\"../../utilities/DraggableZone/index\");\nvar _utilities1 = require(\"@uifabric/utilities\");\n// @TODO - need to change this to a panel whenever the breakpoint is under medium (verify the spec)\nvar DefaultLayerProps = {\n    eventBubblingEnabled: false\n};\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar COMPONENT_NAME = \"Modal\";\nvar ModalBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ModalBase1, _super);\n    function ModalBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._focusTrapZone = _react.createRef();\n        _this._focusTrapZoneMergedRef = (0, _utilities.createMergedRef)();\n        _this._registerInitialModalPosition = function() {\n            var _a;\n            var dialogMain = document.querySelector(\"[data-id=\" + _this.state.id + \"]\");\n            if (dialogMain) {\n                var modalRectangle = dialogMain.getBoundingClientRect();\n                if (((_a = _this.props.dragOptions) === null || _a === void 0 ? void 0 : _a.keepInBounds) && !_this._minClampedPosition && !_this._maxClampedPosition) {\n                    _this._minClampedPosition = {\n                        x: -modalRectangle.x,\n                        y: -modalRectangle.y\n                    };\n                    _this._maxClampedPosition = {\n                        x: modalRectangle.x,\n                        y: modalRectangle.y\n                    };\n                }\n                _this.setState({\n                    modalRectangleTop: modalRectangle.top\n                });\n            }\n        };\n        // Allow the user to scroll within the modal but not on the body\n        _this._allowScrollOnModal = function(elt) {\n            if (elt) {\n                if (_this._allowTouchBodyScroll) (0, _utilities.allowOverscrollOnElement)(elt, _this._events);\n                else (0, _utilities.allowScrollOnElement)(elt, _this._events);\n            } else _this._events.off(_this._scrollableContent);\n            _this._scrollableContent = elt;\n        };\n        _this._onModalContextMenuClose = function() {\n            _this.setState({\n                isModalMenuOpen: false\n            });\n        };\n        _this._onModalClose = function() {\n            _this._lastSetX = 0;\n            _this._lastSetY = 0;\n            _this.setState({\n                isModalMenuOpen: false,\n                isInKeyboardMoveMode: false,\n                isOpen: false,\n                x: 0,\n                y: 0\n            });\n            if (_this.props.dragOptions && _this._hasRegisteredKeyUp) _this._events.off(window, \"keyup\", _this._onKeyUp, true);\n            // Call the onDismiss callback\n            if (_this.props.onDismissed) _this.props.onDismissed();\n        };\n        _this._onDragStart = function() {\n            _this.setState({\n                isModalMenuOpen: false,\n                isInKeyboardMoveMode: false\n            });\n        };\n        _this._onDrag = function(_, ui) {\n            var _a = _this.state, x = _a.x, y = _a.y;\n            _this.setState(_this._getClampedPosition({\n                x: x + ui.delta.x,\n                y: y + ui.delta.y\n            }));\n        };\n        _this._onDragStop = function() {\n            _this.focus();\n        };\n        _this._onKeyUp = function(event) {\n            // Need to handle the CTRL + ALT + SPACE key during keyup due to FireFox bug:\n            // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n            // Otherwise it would continue to fire a click even if the event was cancelled\n            // during mouseDown.\n            if (event.altKey && event.ctrlKey && event.keyCode === (0, _utilities.KeyCodes).space) // Since this is a global handler, we should make sure the target is within the dialog\n            // before opening the dropdown\n            {\n                if ((0, _utilities.elementContains)(_this._scrollableContent, event.target)) {\n                    _this.setState({\n                        isModalMenuOpen: !_this.state.isModalMenuOpen\n                    });\n                    event.preventDefault();\n                    event.stopPropagation();\n                }\n            }\n        };\n        // We need a global onKeyDown event when we are in the move mode so that we can\n        // handle the key presses and the components inside the modal do not get the events\n        _this._onKeyDown = function(event) {\n            if (event.altKey && event.ctrlKey && event.keyCode === (0, _utilities.KeyCodes).space) {\n                // CTRL + ALT + SPACE is handled during keyUp\n                event.preventDefault();\n                event.stopPropagation();\n                return;\n            }\n            if (_this.state.isModalMenuOpen && (event.altKey || event.keyCode === (0, _utilities.KeyCodes).escape)) _this.setState({\n                isModalMenuOpen: false\n            });\n            if (_this.state.isInKeyboardMoveMode && (event.keyCode === (0, _utilities.KeyCodes).escape || event.keyCode === (0, _utilities.KeyCodes).enter)) {\n                _this.setState({\n                    isInKeyboardMoveMode: false\n                });\n                event.preventDefault();\n                event.stopPropagation();\n            }\n            if (_this.state.isInKeyboardMoveMode) {\n                var handledEvent = true;\n                var delta = _this._getMoveDelta(event);\n                switch(event.keyCode){\n                    /* eslint-disable no-fallthrough */ case (0, _utilities.KeyCodes).escape:\n                        _this.setState({\n                            x: _this._lastSetX,\n                            y: _this._lastSetY\n                        });\n                    case (0, _utilities.KeyCodes).enter:\n                        // TODO: determine if fallthrough was intentional\n                        /* eslint-enable no-fallthrough */ _this._lastSetX = 0;\n                        _this._lastSetY = 0;\n                        _this.setState({\n                            isInKeyboardMoveMode: false\n                        });\n                        break;\n                    case (0, _utilities.KeyCodes).up:\n                        _this.setState({\n                            y: _this._getClampedPositionY(_this.state.y - delta)\n                        });\n                        break;\n                    case (0, _utilities.KeyCodes).down:\n                        _this.setState({\n                            y: _this._getClampedPositionY(_this.state.y + delta)\n                        });\n                        break;\n                    case (0, _utilities.KeyCodes).left:\n                        _this.setState({\n                            x: _this._getClampedPositionX(_this.state.x - delta)\n                        });\n                        break;\n                    case (0, _utilities.KeyCodes).right:\n                        _this.setState({\n                            x: _this._getClampedPositionX(_this.state.x + delta)\n                        });\n                        break;\n                    default:\n                        handledEvent = false;\n                }\n                if (handledEvent) {\n                    event.preventDefault();\n                    event.stopPropagation();\n                }\n            }\n        };\n        _this._onEnterKeyboardMoveMode = function() {\n            _this._lastSetX = _this.state.x;\n            _this._lastSetY = _this.state.y;\n            _this.setState({\n                isInKeyboardMoveMode: true,\n                isModalMenuOpen: false\n            });\n            _this._events.on(window, \"keydown\", _this._onKeyDown, true);\n        };\n        _this._onExitKeyboardMoveMode = function(ev) {\n            var _a, _b, _c;\n            (_c = (_a = _this.props.focusTrapZoneProps) === null || _a === void 0 ? void 0 : (_b = _a).onBlur) === null || _c === void 0 || _c.call(_b, ev);\n            _this._lastSetX = 0;\n            _this._lastSetY = 0;\n            _this.setState({\n                isInKeyboardMoveMode: false\n            });\n            _this._events.off(window, \"keydown\", _this._onKeyDown, true);\n        };\n        _this._registerForKeyUp = function() {\n            if (!_this._hasRegisteredKeyUp) {\n                _this._events.on(window, \"keyup\", _this._onKeyUp, true);\n                _this._hasRegisteredKeyUp = true;\n            }\n        };\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._events = new (0, _utilities.EventGroup)(_this);\n        (0, _utilities1.initializeComponentRef)(_this);\n        (0, _utilities.warnDeprecations)(COMPONENT_NAME, props, {\n            onLayerDidMount: \"layerProps.onLayerDidMount\"\n        });\n        _this.state = {\n            id: (0, _utilities.getId)(\"Modal\"),\n            isOpen: props.isOpen,\n            isVisible: props.isOpen,\n            hasBeenOpened: props.isOpen,\n            x: 0,\n            y: 0\n        };\n        _this._lastSetX = 0;\n        _this._lastSetY = 0;\n        var _a1 = _this.props.allowTouchBodyScroll, allowTouchBodyScroll = _a1 === void 0 ? false : _a1;\n        _this._allowTouchBodyScroll = allowTouchBodyScroll;\n        return _this;\n    }\n    ModalBase1.prototype.UNSAFE_componentWillReceiveProps = function(newProps) {\n        clearTimeout(this._onModalCloseTimer);\n        // Opening the dialog\n        if (newProps.isOpen) {\n            if (!this.state.isOpen) {\n                // First Open\n                this.setState({\n                    isOpen: true\n                });\n                // Add a keyUp handler for all key up events when the dialog is open\n                if (newProps.dragOptions) this._registerForKeyUp();\n            } else // Modal has been opened\n            // Reopen during closing\n            this.setState({\n                hasBeenOpened: true,\n                isVisible: true\n            });\n        }\n        // Closing the dialog\n        if (!newProps.isOpen && this.state.isOpen) {\n            this._onModalCloseTimer = this._async.setTimeout(this._onModalClose, parseFloat((0, _modalStyles.animationDuration)) * 1000);\n            this.setState({\n                isVisible: false\n            });\n        }\n    };\n    ModalBase1.prototype.componentDidMount = function() {\n        var _this = this;\n        // Not all modals show just by updating their props. Some only render when they are mounted and pass in\n        // isOpen as true. We need to add the keyUp handler in componentDidMount if we are in that case.\n        if (this.state.isOpen && this.state.isVisible) {\n            this._registerForKeyUp();\n            requestAnimationFrame(function() {\n                return setTimeout(_this._registerInitialModalPosition, 0);\n            });\n        }\n    };\n    ModalBase1.prototype.componentDidUpdate = function(prevProps, prevState) {\n        var _this = this;\n        if (!prevProps.isOpen && !prevState.isVisible) this.setState({\n            isVisible: true\n        });\n        if (!prevProps.isOpen && this.props.isOpen) requestAnimationFrame(function() {\n            return setTimeout(_this._registerInitialModalPosition, 0);\n        });\n    };\n    ModalBase1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n    };\n    ModalBase1.prototype.render = function() {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;\n        var _r = this.props, className = _r.className, containerClassName = _r.containerClassName, scrollableContentClassName = _r.scrollableContentClassName, elementToFocusOnDismiss = _r.elementToFocusOnDismiss, firstFocusableSelector = _r.firstFocusableSelector, focusTrapZoneProps = _r.focusTrapZoneProps, forceFocusInsideTrap = _r.forceFocusInsideTrap, ignoreExternalFocusing = _r.ignoreExternalFocusing, isBlocking = _r.isBlocking, isClickableOutsideFocusTrap = _r.isClickableOutsideFocusTrap, isDarkOverlay = _r.isDarkOverlay, onDismiss = _r.onDismiss, layerProps = _r.layerProps, overlay = _r.overlay, responsiveMode = _r.responsiveMode, titleAriaId = _r.titleAriaId, styles = _r.styles, subtitleAriaId = _r.subtitleAriaId, theme = _r.theme, topOffsetFixed = _r.topOffsetFixed, // eslint-disable-next-line deprecation/deprecation\n        onLayerDidMount = _r.onLayerDidMount, isModeless = _r.isModeless, isAlert = _r.isAlert, dragOptions = _r.dragOptions, enableAriaHiddenSiblings = _r.enableAriaHiddenSiblings;\n        var _s = this.state, isOpen = _s.isOpen, isVisible = _s.isVisible, hasBeenOpened = _s.hasBeenOpened, modalRectangleTop = _s.modalRectangleTop, x = _s.x, y = _s.y, isInKeyboardMoveMode = _s.isInKeyboardMoveMode;\n        if (!isOpen) return null;\n        var layerClassName = layerProps === undefined ? \"\" : layerProps.className;\n        var isAlertRole = isAlert !== null && isAlert !== void 0 ? isAlert : isBlocking && !isModeless;\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            containerClassName: containerClassName,\n            scrollableContentClassName: scrollableContentClassName,\n            isOpen: isOpen,\n            isVisible: isVisible,\n            hasBeenOpened: hasBeenOpened,\n            modalRectangleTop: modalRectangleTop,\n            topOffsetFixed: topOffsetFixed,\n            isModeless: isModeless,\n            layerClassName: layerClassName,\n            isDefaultDragHandle: dragOptions && !dragOptions.dragHandleSelector\n        });\n        var mergedLayerProps = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, DefaultLayerProps), this.props.layerProps), {\n            onLayerDidMount: layerProps && layerProps.onLayerDidMount ? layerProps.onLayerDidMount : onLayerDidMount,\n            insertFirst: isModeless,\n            className: classNames.layer\n        });\n        var modalContent = _react.createElement((0, _index.FocusTrapZone), (0, _tslib.__assign)({}, focusTrapZoneProps, {\n            \"data-id\": this.state.id,\n            componentRef: this._focusTrapZoneMergedRef(this._focusTrapZone, (_a = focusTrapZoneProps) === null || _a === void 0 ? void 0 : _a.componentRef),\n            className: (0, _utilities.css)(classNames.main, (_b = focusTrapZoneProps) === null || _b === void 0 ? void 0 : _b.className),\n            elementToFocusOnDismiss: (_d = (_c = focusTrapZoneProps) === null || _c === void 0 ? void 0 : _c.elementToFocusOnDismiss, _d !== null && _d !== void 0 ? _d : elementToFocusOnDismiss),\n            isClickableOutsideFocusTrap: (_f = (_e = focusTrapZoneProps) === null || _e === void 0 ? void 0 : _e.isClickableOutsideFocusTrap, _f !== null && _f !== void 0 ? _f : isModeless || isClickableOutsideFocusTrap || !isBlocking),\n            ignoreExternalFocusing: (_h = (_g = focusTrapZoneProps) === null || _g === void 0 ? void 0 : _g.ignoreExternalFocusing, _h !== null && _h !== void 0 ? _h : ignoreExternalFocusing),\n            forceFocusInsideTrap: (_k = (_j = focusTrapZoneProps) === null || _j === void 0 ? void 0 : _j.forceFocusInsideTrap, _k !== null && _k !== void 0 ? _k : forceFocusInsideTrap) && !isModeless,\n            // eslint-disable-next-line deprecation/deprecation\n            firstFocusableSelector: ((_l = focusTrapZoneProps) === null || _l === void 0 ? void 0 : _l.firstFocusableSelector) || firstFocusableSelector,\n            focusPreviouslyFocusedInnerElement: (_o = (_m = focusTrapZoneProps) === null || _m === void 0 ? void 0 : _m.focusPreviouslyFocusedInnerElement, _o !== null && _o !== void 0 ? _o : true),\n            onBlur: isInKeyboardMoveMode ? this._onExitKeyboardMoveMode : undefined,\n            enableAriaHiddenSiblings: (_q = (_p = focusTrapZoneProps) === null || _p === void 0 ? void 0 : _p.enableAriaHiddenSiblings, _q !== null && _q !== void 0 ? _q : enableAriaHiddenSiblings)\n        }), dragOptions && isInKeyboardMoveMode && _react.createElement(\"div\", {\n            className: classNames.keyboardMoveIconContainer\n        }, dragOptions.keyboardMoveIconProps ? _react.createElement((0, _index3.Icon), (0, _tslib.__assign)({}, dragOptions.keyboardMoveIconProps)) : _react.createElement((0, _index3.Icon), {\n            iconName: \"move\",\n            className: classNames.keyboardMoveIcon\n        })), _react.createElement(\"div\", {\n            ref: this._allowScrollOnModal,\n            className: classNames.scrollableContent,\n            \"data-is-scrollable\": true\n        }, dragOptions && this.state.isModalMenuOpen && _react.createElement(dragOptions.menu, {\n            items: [\n                {\n                    key: \"move\",\n                    text: dragOptions.moveMenuItemText,\n                    onClick: this._onEnterKeyboardMoveMode\n                },\n                {\n                    key: \"close\",\n                    text: dragOptions.closeMenuItemText,\n                    onClick: this._onModalClose\n                }, \n            ],\n            onDismiss: this._onModalContextMenuClose,\n            alignTargetEdge: true,\n            coverTarget: true,\n            directionalHint: (0, _index2.DirectionalHint).topLeftEdge,\n            directionalHintFixed: true,\n            shouldFocusOnMount: true,\n            target: this._scrollableContent\n        }), this.props.children));\n        // @temp tuatology - Will adjust this to be a panel at certain breakpoints\n        if (responsiveMode >= (0, _withResponsiveMode.ResponsiveMode).small) return _react.createElement((0, _layer.Layer), (0, _tslib.__assign)({}, mergedLayerProps), _react.createElement((0, _index1.Popup), {\n            role: isAlertRole ? \"alertdialog\" : \"dialog\",\n            \"aria-modal\": !isModeless,\n            ariaLabelledBy: titleAriaId,\n            ariaDescribedBy: subtitleAriaId,\n            onDismiss: onDismiss,\n            shouldRestoreFocus: !ignoreExternalFocusing\n        }, _react.createElement(\"div\", {\n            className: classNames.root,\n            role: !isModeless ? \"document\" : undefined\n        }, !isModeless && _react.createElement((0, _overlay.Overlay), (0, _tslib.__assign)({\n            isDarkThemed: isDarkOverlay,\n            onClick: isBlocking ? undefined : onDismiss,\n            allowTouchBodyScroll: this._allowTouchBodyScroll\n        }, overlay)), dragOptions ? _react.createElement((0, _index4.DraggableZone), {\n            handleSelector: dragOptions.dragHandleSelector || \".\" + classNames.main.split(\" \")[0],\n            preventDragSelector: \"button\",\n            onStart: this._onDragStart,\n            onDragChange: this._onDrag,\n            onStop: this._onDragStop,\n            position: {\n                x: x,\n                y: y\n            }\n        }, modalContent) : modalContent)));\n        return null;\n    };\n    ModalBase1.prototype.focus = function() {\n        if (this._focusTrapZone.current) this._focusTrapZone.current.focus();\n    };\n    /**\n     * Clamps the position coordinates to the maximum/minimum value specified in props\n     */ ModalBase1.prototype._getClampedPosition = function(position) {\n        if (!this.props.dragOptions || !this.props.dragOptions.keepInBounds) return position;\n        return {\n            x: this._getClampedPositionX(position.x),\n            y: this._getClampedPositionY(position.y)\n        };\n    };\n    ModalBase1.prototype._getClampedPositionY = function(y) {\n        var minPosition = this._minClampedPosition;\n        var maxPosition = this._maxClampedPosition;\n        if (minPosition) y = Math.max(minPosition.y, y);\n        if (maxPosition) y = Math.min(maxPosition.y, y);\n        return y;\n    };\n    ModalBase1.prototype._getClampedPositionX = function(x) {\n        var minPosition = this._minClampedPosition;\n        var maxPosition = this._maxClampedPosition;\n        if (minPosition) x = Math.max(minPosition.x, x);\n        if (maxPosition) x = Math.min(maxPosition.x, x);\n        return x;\n    };\n    ModalBase1.prototype._getMoveDelta = function(event) {\n        var delta = 10;\n        if (event.shiftKey) {\n            if (!event.ctrlKey) delta = 50;\n        } else if (event.ctrlKey) delta = 1;\n        return delta;\n    };\n    ModalBase1.defaultProps = {\n        isOpen: false,\n        isDarkOverlay: true,\n        isBlocking: false,\n        className: \"\",\n        containerClassName: \"\"\n    };\n    ModalBase1 = (0, _tslib.__decorate)([\n        (0, _withResponsiveMode.withResponsiveMode)\n    ], ModalBase1);\n    return ModalBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../FocusTrapZone/index\":\"7TtL6\",\"./Modal.styles\":\"di8jQ\",\"../../Overlay\":\"8SS5W\",\"../../Layer\":\"6rkPB\",\"../Popup/index\":\"895s5\",\"../../utilities/decorators/withResponsiveMode\":\"i57Mj\",\"../Callout/index\":\"gJbOC\",\"../Icon/index\":\"88f7n\",\"../../utilities/DraggableZone/index\":\"l13ZS\",\"@uifabric/utilities\":\"uTCgd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"di8jQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"animationDuration\", ()=>animationDuration);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar animationDuration = (0, _styling.AnimationVariables).durationValue2;\nvar globalClassNames = {\n    root: \"ms-Modal\",\n    main: \"ms-Dialog-main\",\n    scrollableContent: \"ms-Modal-scrollableContent\",\n    isOpen: \"is-open\",\n    layer: \"ms-Modal-Layer\"\n};\nvar getStyles = function(props) {\n    var _a;\n    var className = props.className, containerClassName = props.containerClassName, scrollableContentClassName = props.scrollableContentClassName, isOpen = props.isOpen, isVisible = props.isVisible, hasBeenOpened = props.hasBeenOpened, modalRectangleTop = props.modalRectangleTop, theme = props.theme, topOffsetFixed = props.topOffsetFixed, isModeless = props.isModeless, layerClassName = props.layerClassName, isDefaultDragHandle = props.isDefaultDragHandle;\n    var palette = theme.palette, effects = theme.effects, fonts = theme.fonts;\n    var classNames = (0, _styling.getGlobalClassNames)(globalClassNames, theme);\n    return {\n        root: [\n            classNames.root,\n            fonts.medium,\n            {\n                backgroundColor: \"transparent\",\n                position: isModeless ? \"absolute\" : \"fixed\",\n                height: \"100%\",\n                width: \"100%\",\n                display: \"flex\",\n                alignItems: \"center\",\n                justifyContent: \"center\",\n                opacity: 0,\n                pointerEvents: \"none\",\n                transition: \"opacity \" + animationDuration\n            },\n            topOffsetFixed && typeof modalRectangleTop === \"number\" && hasBeenOpened && {\n                alignItems: \"flex-start\"\n            },\n            isOpen && classNames.isOpen,\n            isVisible && {\n                opacity: 1,\n                pointerEvents: \"auto\"\n            },\n            className, \n        ],\n        main: [\n            classNames.main,\n            {\n                boxShadow: effects.elevation64,\n                borderRadius: effects.roundedCorner2,\n                backgroundColor: palette.white,\n                boxSizing: \"border-box\",\n                position: \"relative\",\n                textAlign: \"left\",\n                outline: \"3px solid transparent\",\n                maxHeight: \"calc(100% - 32px)\",\n                maxWidth: \"calc(100% - 32px)\",\n                minHeight: \"176px\",\n                minWidth: \"288px\",\n                overflowY: \"auto\",\n                zIndex: isModeless ? (0, _styling.ZIndexes).Layer : undefined\n            },\n            topOffsetFixed && typeof modalRectangleTop === \"number\" && hasBeenOpened && {\n                top: modalRectangleTop\n            },\n            isDefaultDragHandle && {\n                cursor: \"move\"\n            },\n            containerClassName, \n        ],\n        scrollableContent: [\n            classNames.scrollableContent,\n            {\n                overflowY: \"auto\",\n                flexGrow: 1,\n                maxHeight: \"100vh\",\n                selectors: (_a = {}, _a[\"@supports (-webkit-overflow-scrolling: touch)\"] = {\n                    maxHeight: window.innerHeight\n                }, _a)\n            },\n            scrollableContentClassName, \n        ],\n        layer: isModeless && [\n            layerClassName,\n            classNames.layer,\n            {\n                position: \"static\",\n                width: \"unset\",\n                height: \"unset\"\n            }, \n        ],\n        keyboardMoveIconContainer: {\n            position: \"absolute\",\n            display: \"flex\",\n            justifyContent: \"center\",\n            width: \"100%\",\n            padding: \"3px 0px\"\n        },\n        keyboardMoveIcon: {\n            // eslint-disable-next-line deprecation/deprecation\n            fontSize: fonts.xLargePlus.fontSize,\n            width: \"24px\"\n        }\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8SS5W\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Overlay/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Overlay/index\":\"bB6xN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bB6xN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _overlay = require(\"./Overlay\");\nparcelHelpers.exportAll(_overlay, exports);\nvar _overlayBase = require(\"./Overlay.base\");\nparcelHelpers.exportAll(_overlayBase, exports);\n\n},{\"./Overlay\":\"1yWdz\",\"./Overlay.base\":\"9kuF0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1yWdz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Overlay\", ()=>Overlay);\nvar _utilities = require(\"../../Utilities\");\nvar _overlayBase = require(\"./Overlay.base\");\nvar _overlayStyles = require(\"./Overlay.styles\");\nvar Overlay = (0, _utilities.styled)((0, _overlayBase.OverlayBase), (0, _overlayStyles.getStyles), undefined, {\n    scope: \"Overlay\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Overlay.base\":\"9kuF0\",\"./Overlay.styles\":\"61Tdk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9kuF0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"OverlayBase\", ()=>OverlayBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar OverlayBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(OverlayBase1, _super);\n    function OverlayBase1(props) {\n        var _this = _super.call(this, props) || this;\n        (0, _utilities.initializeComponentRef)(_this);\n        var _a = _this.props.allowTouchBodyScroll, allowTouchBodyScroll = _a === void 0 ? false : _a;\n        _this._allowTouchBodyScroll = allowTouchBodyScroll;\n        return _this;\n    }\n    OverlayBase1.prototype.componentDidMount = function() {\n        !this._allowTouchBodyScroll && (0, _utilities.disableBodyScroll)();\n    };\n    OverlayBase1.prototype.componentWillUnmount = function() {\n        !this._allowTouchBodyScroll && (0, _utilities.enableBodyScroll)();\n    };\n    OverlayBase1.prototype.render = function() {\n        var _a = this.props, isDark = _a.isDarkThemed, className = _a.className, theme = _a.theme, styles = _a.styles;\n        var divProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties));\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            isDark: isDark\n        });\n        return _react.createElement(\"div\", (0, _tslib.__assign)({}, divProps, {\n            className: classNames.root\n        }));\n    };\n    return OverlayBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"61Tdk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar GlobalClassNames = {\n    root: \"ms-Overlay\",\n    rootDark: \"ms-Overlay--dark\"\n};\nvar getStyles = function(props) {\n    var _a;\n    var className = props.className, theme = props.theme, isNone = props.isNone, isDark = props.isDark;\n    var palette = theme.palette;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            {\n                backgroundColor: palette.whiteTranslucent40,\n                top: 0,\n                right: 0,\n                bottom: 0,\n                left: 0,\n                position: \"absolute\",\n                selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                    border: \"1px solid WindowText\",\n                    opacity: 0\n                }, _a)\n            },\n            isNone && {\n                visibility: \"hidden\"\n            },\n            isDark && [\n                classNames.rootDark,\n                {\n                    backgroundColor: palette.blackTranslucent40\n                }, \n            ],\n            className, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l13ZS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _draggableZone = require(\"./DraggableZone\");\nparcelHelpers.exportAll(_draggableZone, exports);\nvar _draggableZoneStyles = require(\"./DraggableZone.styles\");\nparcelHelpers.exportAll(_draggableZoneStyles, exports);\n\n},{\"./DraggableZone\":\"eWTrZ\",\"./DraggableZone.styles\":\"a8Q6d\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eWTrZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DraggableZone\", ()=>DraggableZone);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _draggableZoneStyles = require(\"./DraggableZone.styles\");\nvar _utilities = require(\"../../Utilities\");\nvar eventMapping = {\n    touch: {\n        start: \"touchstart\",\n        move: \"touchmove\",\n        stop: \"touchend\"\n    },\n    mouse: {\n        start: \"mousedown\",\n        move: \"mousemove\",\n        stop: \"mouseup\"\n    }\n};\nvar DraggableZone = /** @class */ function(_super) {\n    (0, _tslib.__extends)(DraggableZone1, _super);\n    function DraggableZone1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._currentEventType = eventMapping.mouse;\n        _this._events = [];\n        _this._onMouseDown = function(event) {\n            var onMouseDown = _react.Children.only(_this.props.children).props.onMouseDown;\n            if (onMouseDown) onMouseDown(event);\n            _this._currentEventType = eventMapping.mouse;\n            return _this._onDragStart(event);\n        };\n        _this._onMouseUp = function(event) {\n            var onMouseUp = _react.Children.only(_this.props.children).props.onMouseUp;\n            if (onMouseUp) onMouseUp(event);\n            _this._currentEventType = eventMapping.mouse;\n            return _this._onDragStop(event);\n        };\n        _this._onTouchStart = function(event) {\n            var onTouchStart = _react.Children.only(_this.props.children).props.onTouchStart;\n            if (onTouchStart) onTouchStart(event);\n            _this._currentEventType = eventMapping.touch;\n            return _this._onDragStart(event);\n        };\n        _this._onTouchEnd = function(event) {\n            var onTouchEnd = _react.Children.only(_this.props.children).props.onTouchEnd;\n            if (onTouchEnd) onTouchEnd(event);\n            _this._currentEventType = eventMapping.touch;\n            _this._onDragStop(event);\n        };\n        _this._onDragStart = function(event) {\n            // Only handle left click for dragging\n            if (typeof event.button === \"number\" && event.button !== 0) return false;\n            // If the target doesn't match the handleSelector OR\n            // if the target does match the preventDragSelector, bail out\n            if (_this.props.handleSelector && !_this._matchesSelector(event.target, _this.props.handleSelector) || _this.props.preventDragSelector && _this._matchesSelector(event.target, _this.props.preventDragSelector)) return;\n            // Remember the touch identifier if this is a touch event so we can\n            // distinguish between individual touches in multitouch scenarios\n            // by remembering which touch point we were given\n            _this._touchId = _this._getTouchId(event);\n            var position = _this._getControlPosition(event);\n            if (position === undefined) return;\n            var dragData = _this._createDragDataFromPosition(position);\n            _this.props.onStart && _this.props.onStart(event, dragData);\n            _this.setState({\n                isDragging: true,\n                lastPosition: position\n            });\n            // hook up the appropriate mouse/touch events to the body to ensure\n            // smooth dragging\n            _this._events = [\n                (0, _utilities.on)(document.body, _this._currentEventType.move, _this._onDrag, true),\n                (0, _utilities.on)(document.body, _this._currentEventType.stop, _this._onDragStop, true), \n            ];\n        };\n        _this._onDrag = function(event) {\n            // Prevent scrolling on mobile devices\n            if (event.type === \"touchmove\") event.preventDefault();\n            var position = _this._getControlPosition(event);\n            if (!position) return;\n            // create the updated drag data from the position data\n            var updatedData = _this._createUpdatedDragData(_this._createDragDataFromPosition(position));\n            var updatedPosition = updatedData.position;\n            _this.props.onDragChange && _this.props.onDragChange(event, updatedData);\n            _this.setState({\n                position: updatedPosition,\n                lastPosition: position\n            });\n        };\n        _this._onDragStop = function(event) {\n            if (!_this.state.isDragging) return;\n            var position = _this._getControlPosition(event);\n            if (!position) return;\n            var baseDragData = _this._createDragDataFromPosition(position);\n            // Set dragging to false and reset the lastPosition\n            _this.setState({\n                isDragging: false,\n                lastPosition: undefined\n            });\n            _this.props.onStop && _this.props.onStop(event, baseDragData);\n            if (_this.props.position) _this.setState({\n                position: _this.props.position\n            });\n            // Remove event handlers\n            _this._events.forEach(function(dispose) {\n                return dispose();\n            });\n        };\n        _this.state = {\n            isDragging: false,\n            position: _this.props.position || {\n                x: 0,\n                y: 0\n            },\n            lastPosition: undefined\n        };\n        return _this;\n    }\n    DraggableZone1.prototype.componentDidUpdate = function(prevProps) {\n        if (this.props.position && (!prevProps.position || this.props.position !== prevProps.position)) this.setState({\n            position: this.props.position\n        });\n    };\n    DraggableZone1.prototype.componentWillUnmount = function() {\n        this._events.forEach(function(dispose) {\n            return dispose();\n        });\n    };\n    DraggableZone1.prototype.render = function() {\n        var child = _react.Children.only(this.props.children);\n        var props = child.props;\n        var position = this.props.position;\n        var _a = this.state, statePosition = _a.position, isDragging = _a.isDragging;\n        var x = statePosition.x;\n        var y = statePosition.y;\n        if (position && !isDragging) {\n            x = position.x;\n            y = position.y;\n        }\n        return _react.cloneElement(child, {\n            style: (0, _tslib.__assign)((0, _tslib.__assign)({}, props.style), {\n                transform: \"translate(\" + x + \"px, \" + y + \"px)\"\n            }),\n            className: (0, _draggableZoneStyles.getClassNames)(props.className, this.state.isDragging).root,\n            onMouseDown: this._onMouseDown,\n            onMouseUp: this._onMouseUp,\n            onTouchStart: this._onTouchStart,\n            onTouchEnd: this._onTouchEnd\n        });\n    };\n    /**\n     * Get the control position based off the event that fired\n     * @param event - The event to get offsets from\n     */ DraggableZone1.prototype._getControlPosition = function(event) {\n        var touchObj = this._getActiveTouch(event);\n        // did we get the right touch?\n        if (this._touchId !== undefined && !touchObj) return undefined;\n        var eventToGetOffset = touchObj || event;\n        return {\n            x: eventToGetOffset.clientX,\n            y: eventToGetOffset.clientY\n        };\n    };\n    /**\n     * Get the active touch point that we have saved from the event's TouchList\n     * @param event - The event used to get the TouchList for the active touch point\n     */ DraggableZone1.prototype._getActiveTouch = function(event) {\n        return event.targetTouches && this._findTouchInTouchList(event.targetTouches) || event.changedTouches && this._findTouchInTouchList(event.changedTouches);\n    };\n    /**\n     * Get the initial touch identifier associated with the given event\n     * @param event - The event that contains the TouchList\n     */ DraggableZone1.prototype._getTouchId = function(event) {\n        var touch = event.targetTouches && event.targetTouches[0] || event.changedTouches && event.changedTouches[0];\n        if (touch) return touch.identifier;\n    };\n    /**\n     * Returns if an element (or any of the element's parents) match the given selector\n     */ DraggableZone1.prototype._matchesSelector = function(element, selector) {\n        if (!element || element === document.body) return false;\n        var matchesSelectorFn = element.matches || element.webkitMatchesSelector || element.msMatchesSelector /* for IE */ ;\n        if (!matchesSelectorFn) return false;\n        return matchesSelectorFn.call(element, selector) || this._matchesSelector(element.parentElement, selector);\n    };\n    /**\n     * Attempts to find the Touch that matches the identifier  we stored in dragStart\n     * @param touchList The TouchList to look for the stored identifier from dragStart\n     */ DraggableZone1.prototype._findTouchInTouchList = function(touchList) {\n        if (this._touchId === undefined) return;\n        for(var i = 0; i < touchList.length; i++){\n            if (touchList[i].identifier === this._touchId) return touchList[i];\n        }\n        return undefined;\n    };\n    /**\n     * Create DragData based off of the last known position and the new position passed in\n     * @param position The new position as part of the drag\n     */ DraggableZone1.prototype._createDragDataFromPosition = function(position) {\n        var lastPosition = this.state.lastPosition;\n        // If we have no lastPosition, use the given position\n        // for last position\n        if (lastPosition === undefined) return {\n            delta: {\n                x: 0,\n                y: 0\n            },\n            lastPosition: position,\n            position: position\n        };\n        return {\n            delta: {\n                x: position.x - lastPosition.x,\n                y: position.y - lastPosition.y\n            },\n            lastPosition: lastPosition,\n            position: position\n        };\n    };\n    /**\n     * Creates an updated DragData based off the current position and given baseDragData\n     * @param baseDragData The base DragData (from _createDragDataFromPosition) used to calculate the updated positions\n     */ DraggableZone1.prototype._createUpdatedDragData = function(baseDragData) {\n        var position = this.state.position;\n        return {\n            position: {\n                x: position.x + baseDragData.delta.x,\n                y: position.y + baseDragData.delta.y\n            },\n            delta: baseDragData.delta,\n            lastPosition: position\n        };\n    };\n    return DraggableZone1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./DraggableZone.styles\":\"a8Q6d\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a8Q6d\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getClassNames\", ()=>getClassNames);\nvar _utilities = require(\"../../Utilities\");\nvar _styling = require(\"../../Styling\");\nvar getClassNames = (0, _utilities.memoizeFunction)(function(className, isDragging) {\n    return {\n        root: (0, _styling.mergeStyles)(className, isDragging && {\n            touchAction: \"none\",\n            selectors: {\n                \"& *\": {\n                    userSelect: \"none\"\n                }\n            }\n        })\n    };\n});\n\n},{\"../../Utilities\":\"2F07a\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4xQCl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DialogContent\", ()=>DialogContent);\nvar _utilities = require(\"../../Utilities\");\nvar _dialogContentBase = require(\"./DialogContent.base\");\nvar _dialogContentStyles = require(\"./DialogContent.styles\");\nvar DialogContent = (0, _utilities.styled)((0, _dialogContentBase.DialogContentBase), (0, _dialogContentStyles.getStyles), undefined, {\n    scope: \"DialogContent\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./DialogContent.base\":\"8NiKT\",\"./DialogContent.styles\":\"dzCyF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8NiKT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DialogContentBase\", ()=>DialogContentBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _dialogContentTypes = require(\"./DialogContent.types\");\nvar _button = require(\"../../Button\");\nvar _dialogFooter = require(\"./DialogFooter\");\nvar _withResponsiveMode = require(\"../../utilities/decorators/withResponsiveMode\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar DialogFooterType = _react.createElement((0, _dialogFooter.DialogFooter), null).type;\nvar COMPONENT_NAME = \"DialogContent\";\nvar DialogContentBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(DialogContentBase1, _super);\n    function DialogContentBase1(props) {\n        var _this = _super.call(this, props) || this;\n        (0, _utilities.initializeComponentRef)(_this);\n        (0, _utilities.warnDeprecations)(COMPONENT_NAME, props, {\n            titleId: \"titleProps.id\"\n        });\n        return _this;\n    }\n    DialogContentBase1.prototype.render = function() {\n        var _a = this.props, showCloseButton = _a.showCloseButton, className = _a.className, closeButtonAriaLabel = _a.closeButtonAriaLabel, onDismiss = _a.onDismiss, subTextId = _a.subTextId, subText = _a.subText, _b = _a.titleProps, titleProps = _b === void 0 ? {} : _b, // eslint-disable-next-line deprecation/deprecation\n        titleId = _a.titleId, title = _a.title, type = _a.type, styles = _a.styles, theme = _a.theme, draggableHeaderClassName = _a.draggableHeaderClassName;\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            isLargeHeader: type === (0, _dialogContentTypes.DialogType).largeHeader,\n            isClose: type === (0, _dialogContentTypes.DialogType).close,\n            draggableHeaderClassName: draggableHeaderClassName\n        });\n        var groupings = this._groupChildren();\n        var subTextContent;\n        if (subText) subTextContent = _react.createElement(\"p\", {\n            className: classNames.subText,\n            id: subTextId\n        }, subText);\n        return _react.createElement(\"div\", {\n            className: classNames.content\n        }, _react.createElement(\"div\", {\n            className: classNames.header\n        }, _react.createElement(\"div\", (0, _tslib.__assign)({\n            id: titleId,\n            role: \"heading\",\n            \"aria-level\": 1\n        }, titleProps, {\n            className: (0, _utilities.css)(classNames.title, titleProps.className)\n        }), title), _react.createElement(\"div\", {\n            className: classNames.topButton\n        }, this.props.topButtonsProps.map(function(props, index) {\n            return _react.createElement((0, _button.IconButton), (0, _tslib.__assign)({\n                key: props.uniqueId || index\n            }, props));\n        }), (type === (0, _dialogContentTypes.DialogType).close || showCloseButton && type !== (0, _dialogContentTypes.DialogType).largeHeader) && _react.createElement((0, _button.IconButton), {\n            className: classNames.button,\n            iconProps: {\n                iconName: \"Cancel\"\n            },\n            ariaLabel: closeButtonAriaLabel,\n            onClick: onDismiss\n        }))), _react.createElement(\"div\", {\n            className: classNames.inner\n        }, _react.createElement(\"div\", {\n            className: classNames.innerContent\n        }, subTextContent, groupings.contents), groupings.footers));\n    };\n    // @TODO - typing the footers as an array of DialogFooter is difficult because\n    // casing \"child as DialogFooter\" causes a problem because\n    // \"Neither type 'ReactElement<any>' nor type 'DialogFooter' is assignable to the other.\"\n    DialogContentBase1.prototype._groupChildren = function() {\n        var groupings = {\n            footers: [],\n            contents: []\n        };\n        _react.Children.map(this.props.children, function(child) {\n            if (typeof child === \"object\" && child !== null && child.type === DialogFooterType) groupings.footers.push(child);\n            else groupings.contents.push(child);\n        });\n        return groupings;\n    };\n    DialogContentBase1.defaultProps = {\n        showCloseButton: false,\n        className: \"\",\n        topButtonsProps: [],\n        closeButtonAriaLabel: \"Close\"\n    };\n    DialogContentBase1 = (0, _tslib.__decorate)([\n        (0, _withResponsiveMode.withResponsiveMode)\n    ], DialogContentBase1);\n    return DialogContentBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"./DialogContent.types\":\"cNw91\",\"../../Button\":\"eMzbU\",\"./DialogFooter\":\"7Knvz\",\"../../utilities/decorators/withResponsiveMode\":\"i57Mj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Knvz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DialogFooter\", ()=>DialogFooter);\nvar _utilities = require(\"../../Utilities\");\nvar _dialogFooterBase = require(\"./DialogFooter.base\");\nvar _dialogFooterStyles = require(\"./DialogFooter.styles\");\nvar DialogFooter = (0, _utilities.styled)((0, _dialogFooterBase.DialogFooterBase), (0, _dialogFooterStyles.getStyles), undefined, {\n    scope: \"DialogFooter\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./DialogFooter.base\":\"7GT3H\",\"./DialogFooter.styles\":\"a1yni\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7GT3H\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DialogFooterBase\", ()=>DialogFooterBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar DialogFooterBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(DialogFooterBase1, _super);\n    function DialogFooterBase1(props) {\n        var _this = _super.call(this, props) || this;\n        (0, _utilities.initializeComponentRef)(_this);\n        return _this;\n    }\n    DialogFooterBase1.prototype.render = function() {\n        var _a = this.props, className = _a.className, styles = _a.styles, theme = _a.theme;\n        this._classNames = getClassNames(styles, {\n            theme: theme,\n            className: className\n        });\n        return _react.createElement(\"div\", {\n            className: this._classNames.actions\n        }, _react.createElement(\"div\", {\n            className: this._classNames.actionsRight\n        }, this._renderChildrenAsActions()));\n    };\n    DialogFooterBase1.prototype._renderChildrenAsActions = function() {\n        var _this = this;\n        return _react.Children.map(this.props.children, function(child) {\n            return child ? _react.createElement(\"span\", {\n                className: _this._classNames.action\n            }, child) : null;\n        });\n    };\n    return DialogFooterBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a1yni\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar GlobalClassNames = {\n    actions: \"ms-Dialog-actions\",\n    action: \"ms-Dialog-action\",\n    actionsRight: \"ms-Dialog-actionsRight\"\n};\nvar getStyles = function(props) {\n    var className = props.className, theme = props.theme;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        actions: [\n            classNames.actions,\n            {\n                position: \"relative\",\n                width: \"100%\",\n                minHeight: \"24px\",\n                lineHeight: \"24px\",\n                margin: \"16px 0 0\",\n                fontSize: \"0\",\n                selectors: {\n                    \".ms-Button\": {\n                        lineHeight: \"normal\"\n                    }\n                }\n            },\n            className, \n        ],\n        action: [\n            classNames.action,\n            {\n                margin: \"0 4px\"\n            }, \n        ],\n        actionsRight: [\n            classNames.actionsRight,\n            {\n                textAlign: \"right\",\n                marginRight: \"-4px\",\n                fontSize: \"0\"\n            }, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dzCyF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar GlobalClassNames = {\n    contentLgHeader: \"ms-Dialog-lgHeader\",\n    close: \"ms-Dialog--close\",\n    subText: \"ms-Dialog-subText\",\n    header: \"ms-Dialog-header\",\n    headerLg: \"ms-Dialog--lgHeader\",\n    button: \"ms-Dialog-button ms-Dialog-button--close\",\n    inner: \"ms-Dialog-inner\",\n    content: \"ms-Dialog-content\",\n    title: \"ms-Dialog-title\"\n};\nvar getStyles = function(props) {\n    var _a, _b, _c;\n    var className = props.className, theme = props.theme, isLargeHeader = props.isLargeHeader, isClose = props.isClose, hidden = props.hidden, isMultiline = props.isMultiline, draggableHeaderClassName = props.draggableHeaderClassName;\n    var palette = theme.palette, fonts = theme.fonts, effects = theme.effects, semanticColors = theme.semanticColors;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        content: [\n            isLargeHeader && [\n                classNames.contentLgHeader,\n                {\n                    borderTop: \"4px solid \" + palette.themePrimary\n                }, \n            ],\n            isClose && classNames.close,\n            {\n                flexGrow: 1,\n                overflowY: \"hidden\"\n            },\n            className, \n        ],\n        subText: [\n            classNames.subText,\n            fonts.medium,\n            {\n                margin: \"0 0 24px 0\",\n                color: semanticColors.bodySubtext,\n                lineHeight: \"1.5\",\n                wordWrap: \"break-word\",\n                fontWeight: (0, _styling.FontWeights).regular\n            }, \n        ],\n        header: [\n            classNames.header,\n            {\n                position: \"relative\",\n                width: \"100%\",\n                boxSizing: \"border-box\"\n            },\n            isClose && classNames.close,\n            draggableHeaderClassName && [\n                draggableHeaderClassName,\n                {\n                    cursor: \"move\"\n                }, \n            ], \n        ],\n        button: [\n            classNames.button,\n            hidden && {\n                selectors: {\n                    \".ms-Icon.ms-Icon--Cancel\": {\n                        color: semanticColors.buttonText,\n                        fontSize: (0, _styling.IconFontSizes).medium\n                    }\n                }\n            }, \n        ],\n        inner: [\n            classNames.inner,\n            {\n                padding: \"0 24px 24px\",\n                selectors: (_a = {}, _a[\"@media (min-width: \" + (0, _styling.ScreenWidthMinSmall) + \"px) and (max-width: \" + (0, _styling.ScreenWidthMaxSmall) + \"px)\"] = {\n                    padding: \"0 16px 16px\"\n                }, _a)\n            }, \n        ],\n        innerContent: [\n            classNames.content,\n            {\n                position: \"relative\",\n                width: \"100%\"\n            }, \n        ],\n        title: [\n            classNames.title,\n            fonts.xLarge,\n            {\n                color: semanticColors.bodyText,\n                margin: \"0\",\n                minHeight: fonts.xLarge.fontSize,\n                padding: \"16px 46px 20px 24px\",\n                lineHeight: \"normal\",\n                selectors: (_b = {}, _b[\"@media (min-width: \" + (0, _styling.ScreenWidthMinSmall) + \"px) and (max-width: \" + (0, _styling.ScreenWidthMaxSmall) + \"px)\"] = {\n                    padding: \"16px 46px 16px 16px\"\n                }, _b)\n            },\n            isLargeHeader && {\n                color: semanticColors.menuHeader\n            },\n            isMultiline && {\n                fontSize: fonts.xxLarge.fontSize\n            }, \n        ],\n        topButton: [\n            {\n                display: \"flex\",\n                flexDirection: \"row\",\n                flexWrap: \"nowrap\",\n                position: \"absolute\",\n                top: \"0\",\n                right: \"0\",\n                padding: \"15px 15px 0 0\",\n                selectors: (_c = {\n                    \"> *\": {\n                        flex: \"0 0 auto\"\n                    },\n                    \".ms-Dialog-button\": {\n                        color: semanticColors.buttonText\n                    },\n                    \".ms-Dialog-button:hover\": {\n                        color: semanticColors.buttonTextHovered,\n                        borderRadius: effects.roundedCorner2\n                    }\n                }, _c[\"@media (min-width: \" + (0, _styling.ScreenWidthMinSmall) + \"px) and (max-width: \" + (0, _styling.ScreenWidthMaxSmall) + \"px)\"] = {\n                    padding: \"15px 8px 0 0\"\n                }, _c)\n            }, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cp8ts\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _styling = require(\"../../Styling\");\nvar GlobalClassNames = {\n    root: \"ms-Dialog\"\n};\nvar getStyles = function(props) {\n    var _a;\n    var className = props.className, containerClassName = props.containerClassName, _b = props.dialogDefaultMinWidth, dialogDefaultMinWidth = _b === void 0 ? \"288px\" : _b, _c = props.dialogDefaultMaxWidth, dialogDefaultMaxWidth = _c === void 0 ? \"340px\" : _c, hidden = props.hidden, theme = props.theme;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            className\n        ],\n        main: [\n            {\n                width: dialogDefaultMinWidth,\n                outline: \"3px solid transparent\",\n                selectors: (_a = {}, _a[\"@media (min-width: \" + (0, _styling.ScreenWidthMinMedium) + \"px)\"] = {\n                    width: \"auto\",\n                    maxWidth: dialogDefaultMaxWidth,\n                    minWidth: dialogDefaultMinWidth\n                }, _a)\n            },\n            !hidden && {\n                display: \"flex\"\n            },\n            containerClassName, \n        ]\n    };\n};\n\n},{\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dEJVZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _dropdown = require(\"office-ui-fabric-react/lib/Dropdown\");\nparcelHelpers.exportAll(_dropdown, exports);\n\n},{\"office-ui-fabric-react/lib/Dropdown\":\"6XmeK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6XmeK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Dropdown/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Dropdown/index\":\"eGaJt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eGaJt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _dropdown = require(\"./Dropdown\");\nparcelHelpers.exportAll(_dropdown, exports);\nvar _dropdownBase = require(\"./Dropdown.base\");\nparcelHelpers.exportAll(_dropdownBase, exports);\nvar _dropdownTypes = require(\"./Dropdown.types\");\nparcelHelpers.exportAll(_dropdownTypes, exports);\n\n},{\"./Dropdown\":\"6wf9x\",\"./Dropdown.base\":\"gnpJg\",\"./Dropdown.types\":\"aXErL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6wf9x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Dropdown\", ()=>Dropdown);\nvar _utilities = require(\"../../Utilities\");\nvar _dropdownBase = require(\"./Dropdown.base\");\nvar _dropdownStyles = require(\"./Dropdown.styles\");\nvar Dropdown = (0, _utilities.styled)((0, _dropdownBase.DropdownBase), (0, _dropdownStyles.getStyles), undefined, {\n    scope: \"Dropdown\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Dropdown.base\":\"gnpJg\",\"./Dropdown.styles\":\"bcYI1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gnpJg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DropdownBase\", ()=>DropdownBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _callout = require(\"../../Callout\");\nvar _checkbox = require(\"../../Checkbox\");\nvar _button = require(\"../../Button\");\nvar _directionalHint = require(\"../../common/DirectionalHint\");\nvar _dropdownTypes = require(\"./Dropdown.types\");\nvar _dropdownSizePosCache = require(\"./utilities/DropdownSizePosCache\");\nvar _focusZone = require(\"../../FocusZone\");\nvar _icon = require(\"../../Icon\");\nvar _label = require(\"../../Label\");\nvar _keytipData = require(\"../../KeytipData\");\nvar _panel = require(\"../../Panel\");\nvar _withResponsiveMode = require(\"../../utilities/decorators/withResponsiveMode\");\nvar _index = require(\"../../utilities/selectableOption/index\");\nvar COMPONENT_NAME = \"Dropdown\";\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar DropdownBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(DropdownBase1, _super);\n    function DropdownBase1(props1) {\n        var _this = _super.call(this, props1) || this;\n        _this._host = _react.createRef();\n        _this._focusZone = _react.createRef();\n        _this._dropDown = _react.createRef();\n        _this._scrollIdleDelay = 250 /* ms */ ;\n        _this._sizePosCache = new (0, _dropdownSizePosCache.DropdownSizePosCache)();\n        _this._requestAnimationFrame = (0, _utilities.safeRequestAnimationFrame)(_this);\n        _this._onChange = function(event, options, index, checked, multiSelect) {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a = _this.props, onChange = _a.onChange, onChanged = _a.onChanged;\n            if (onChange || onChanged) {\n                // for single-select, option passed in will always be selected.\n                // for multi-select, flip the checked value\n                var changedOpt = multiSelect ? (0, _tslib.__assign)((0, _tslib.__assign)({}, options[index]), {\n                    selected: !checked\n                }) : options[index];\n                onChange && onChange((0, _tslib.__assign)((0, _tslib.__assign)({}, event), {\n                    target: _this._dropDown.current\n                }), changedOpt, index);\n                onChanged && onChanged(changedOpt, index);\n            }\n        };\n        /** Get either props.placeholder (new name) or props.placeHolder (old name) */ _this._getPlaceholder = function() {\n            // eslint-disable-next-line deprecation/deprecation\n            return _this.props.placeholder || _this.props.placeHolder;\n        };\n        /** Get text in dropdown input as a string */ _this._getTitle = function(items, _unused) {\n            var _a = _this.props.multiSelectDelimiter, multiSelectDelimiter = _a === void 0 ? \", \" : _a;\n            return items.map(function(i) {\n                return i.text;\n            }).join(multiSelectDelimiter);\n        };\n        /** Render text in dropdown input */ _this._onRenderTitle = function(items) {\n            return _react.createElement(_react.Fragment, null, _this._getTitle(items));\n        };\n        /** Render placeholder text in dropdown input */ _this._onRenderPlaceholder = function(props) {\n            if (!_this._getPlaceholder()) return null;\n            return _react.createElement(_react.Fragment, null, _this._getPlaceholder());\n        };\n        /** Render Callout or Panel container and pass in list */ _this._onRenderContainer = function(props) {\n            var calloutProps = props.calloutProps, panelProps = props.panelProps;\n            var _a = _this.props, responsiveMode = _a.responsiveMode, dropdownWidth = _a.dropdownWidth;\n            var isSmall = responsiveMode <= (0, _withResponsiveMode.ResponsiveMode).medium;\n            var panelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.panel : undefined;\n            var calloutWidth = undefined;\n            var calloutMinWidth = undefined;\n            if (dropdownWidth === \"auto\") calloutMinWidth = _this._dropDown.current ? _this._dropDown.current.clientWidth : 0;\n            else calloutWidth = dropdownWidth || (_this._dropDown.current ? _this._dropDown.current.clientWidth : 0);\n            return isSmall ? _react.createElement((0, _panel.Panel), (0, _tslib.__assign)({\n                isOpen: true,\n                isLightDismiss: true,\n                onDismiss: _this._onDismiss,\n                hasCloseButton: false,\n                styles: panelStyles\n            }, panelProps), _this._renderFocusableList(props)) : _react.createElement((0, _callout.Callout), (0, _tslib.__assign)({\n                isBeakVisible: false,\n                gapSpace: 0,\n                doNotLayer: false,\n                directionalHintFixed: false,\n                directionalHint: (0, _directionalHint.DirectionalHint).bottomLeftEdge,\n                calloutWidth: calloutWidth,\n                calloutMinWidth: calloutMinWidth\n            }, calloutProps, {\n                className: _this._classNames.callout,\n                target: _this._dropDown.current,\n                onDismiss: _this._onDismiss,\n                onScroll: _this._onScroll,\n                onPositioned: _this._onPositioned\n            }), _this._renderFocusableList(props));\n        };\n        /** Render Caret Down Icon */ _this._onRenderCaretDown = function(props) {\n            return _react.createElement((0, _icon.Icon), {\n                className: _this._classNames.caretDown,\n                iconName: \"ChevronDown\",\n                \"aria-hidden\": true\n            });\n        };\n        /** Render List of items */ _this._onRenderList = function(props) {\n            var _a = props.onRenderItem, onRenderItem = _a === void 0 ? _this._onRenderItem : _a;\n            var queue = {\n                items: []\n            };\n            var renderedList = [];\n            var emptyQueue = function() {\n                var newGroup = queue.id ? [\n                    _react.createElement(\"div\", {\n                        role: \"group\",\n                        key: queue.id,\n                        \"aria-labelledby\": queue.id\n                    }, queue.items), \n                ] : queue.items;\n                renderedList = (0, _tslib.__spreadArrays)(renderedList, newGroup);\n                // Flush items and id\n                queue = {\n                    items: []\n                };\n            };\n            var placeRenderedOptionIntoQueue = function(item, index) {\n                /*\n                  Case Header\n                    empty queue if it's not already empty\n                    ensure unique ID for header and set queue ID\n                    push header into queue\n                  Case Divider\n                    push divider into queue if not first item\n                    empty queue if not already empty\n                  Default\n                    push item into queue\n                */ switch(item.itemType){\n                    case (0, _index.SelectableOptionMenuItemType).Header:\n                        queue.items.length > 0 && emptyQueue();\n                        var id = _this._id + item.key;\n                        queue.items.push(onRenderItem((0, _tslib.__assign)((0, _tslib.__assign)({\n                            id: id\n                        }, item), {\n                            index: index\n                        }), _this._onRenderItem));\n                        queue.id = id;\n                        break;\n                    case (0, _index.SelectableOptionMenuItemType).Divider:\n                        index > 0 && queue.items.push(onRenderItem((0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                            index: index\n                        }), _this._onRenderItem));\n                        queue.items.length > 0 && emptyQueue();\n                        break;\n                    default:\n                        queue.items.push(onRenderItem((0, _tslib.__assign)((0, _tslib.__assign)({}, item), {\n                            index: index\n                        }), _this._onRenderItem));\n                }\n            };\n            // Place options into the queue. Queue will be emptied anytime a Header or Divider is encountered\n            props.options.forEach(function(item, index) {\n                placeRenderedOptionIntoQueue(item, index);\n            });\n            // Push remaining items into all renderedList\n            queue.items.length > 0 && emptyQueue();\n            return _react.createElement(_react.Fragment, null, renderedList);\n        };\n        _this._onRenderItem = function(item) {\n            switch(item.itemType){\n                case (0, _index.SelectableOptionMenuItemType).Divider:\n                    return _this._renderSeparator(item);\n                case (0, _index.SelectableOptionMenuItemType).Header:\n                    return _this._renderHeader(item);\n                default:\n                    return _this._renderOption(item);\n            }\n        };\n        _this._renderOption = function(item) {\n            var _a = _this.props.onRenderOption, onRenderOption = _a === void 0 ? _this._onRenderOption : _a;\n            var _b = _this.state.selectedIndices, selectedIndices = _b === void 0 ? [] : _b;\n            var isItemSelected = item.index !== undefined && selectedIndices ? selectedIndices.indexOf(item.index) > -1 : false;\n            // select the right className based on the combination of selected/disabled\n            var itemClassName = item.hidden // predicate: item hidden\n             ? _this._classNames.dropdownItemHidden : isItemSelected && item.disabled === true // predicate: both selected and disabled\n             ? _this._classNames.dropdownItemSelectedAndDisabled : isItemSelected // predicate: selected only\n             ? _this._classNames.dropdownItemSelected : item.disabled === true // predicate: disabled only\n             ? _this._classNames.dropdownItemDisabled : _this._classNames.dropdownItem;\n            var _c = item.title, title = _c === void 0 ? item.text : _c;\n            var multiSelectItemStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.multiSelectItem : undefined;\n            return !_this.props.multiSelect ? _react.createElement((0, _button.CommandButton), {\n                id: _this._listId + item.index,\n                key: item.key,\n                \"data-index\": item.index,\n                \"data-is-focusable\": !item.disabled,\n                disabled: item.disabled,\n                className: itemClassName,\n                onClick: _this._onItemClick(item),\n                // eslint-disable-next-line react/jsx-no-bind\n                onMouseEnter: _this._onItemMouseEnter.bind(_this, item),\n                // eslint-disable-next-line react/jsx-no-bind\n                onMouseLeave: _this._onMouseItemLeave.bind(_this, item),\n                // eslint-disable-next-line react/jsx-no-bind\n                onMouseMove: _this._onItemMouseMove.bind(_this, item),\n                role: \"option\",\n                \"aria-selected\": isItemSelected ? \"true\" : \"false\",\n                ariaLabel: item.ariaLabel,\n                title: title,\n                \"aria-posinset\": _this._sizePosCache.positionInSet(item.index),\n                \"aria-setsize\": _this._sizePosCache.optionSetSize\n            }, onRenderOption(item, _this._onRenderOption)) : _react.createElement((0, _checkbox.Checkbox), {\n                id: _this._listId + item.index,\n                key: item.key,\n                disabled: item.disabled,\n                onChange: _this._onItemClick(item),\n                inputProps: (0, _tslib.__assign)({\n                    \"aria-selected\": isItemSelected,\n                    onMouseEnter: _this._onItemMouseEnter.bind(_this, item),\n                    onMouseLeave: _this._onMouseItemLeave.bind(_this, item),\n                    onMouseMove: _this._onItemMouseMove.bind(_this, item),\n                    role: \"option\"\n                }, {\n                    \"data-index\": item.index,\n                    \"data-is-focusable\": !item.disabled\n                }),\n                label: item.text,\n                title: title,\n                // eslint-disable-next-line react/jsx-no-bind\n                onRenderLabel: _this._onRenderItemLabel.bind(_this, item),\n                className: itemClassName,\n                checked: isItemSelected,\n                styles: multiSelectItemStyles,\n                ariaPositionInSet: _this._sizePosCache.positionInSet(item.index),\n                ariaSetSize: _this._sizePosCache.optionSetSize\n            });\n        };\n        /** Render content of item (i.e. text/icon inside of button) */ _this._onRenderOption = function(item) {\n            return _react.createElement(\"span\", {\n                className: _this._classNames.dropdownOptionText\n            }, item.text);\n        };\n        /** Render custom label for drop down item */ _this._onRenderItemLabel = function(item) {\n            var _a = _this.props.onRenderOption, onRenderOption = _a === void 0 ? _this._onRenderOption : _a;\n            return onRenderOption(item, _this._onRenderOption);\n        };\n        _this._onPositioned = function(positions) {\n            if (_this._focusZone.current) // Focusing an element can trigger a reflow. Making this wait until there is an animation\n            // frame can improve perf significantly.\n            _this._requestAnimationFrame(function() {\n                var selectedIndices = _this.state.selectedIndices;\n                if (_this._focusZone.current) {\n                    if (selectedIndices && selectedIndices[0] && !_this.props.options[selectedIndices[0]].disabled) {\n                        var element = (0, _utilities.getDocument)().getElementById(_this._id + \"-list\" + selectedIndices[0]);\n                        if (element) _this._focusZone.current.focusElement(element);\n                    } else _this._focusZone.current.focus();\n                }\n            });\n            if (!_this.state.calloutRenderEdge || _this.state.calloutRenderEdge !== positions.targetEdge) _this.setState({\n                calloutRenderEdge: positions.targetEdge\n            });\n        };\n        _this._onItemClick = function(item) {\n            return function(event) {\n                if (!item.disabled) {\n                    _this.setSelectedIndex(event, item.index);\n                    if (!_this.props.multiSelect) // only close the callout when it's in single-select mode\n                    _this.setState({\n                        isOpen: false\n                    });\n                }\n            };\n        };\n        /**\n         * Scroll handler for the callout to make sure the mouse events\n         * for updating focus are not interacting during scroll\n         */ _this._onScroll = function() {\n            if (!_this._isScrollIdle && _this._scrollIdleTimeoutId !== undefined) {\n                clearTimeout(_this._scrollIdleTimeoutId);\n                _this._scrollIdleTimeoutId = undefined;\n            } else _this._isScrollIdle = false;\n            _this._scrollIdleTimeoutId = setTimeout(function() {\n                _this._isScrollIdle = true;\n            }, _this._scrollIdleDelay);\n        };\n        _this._onMouseItemLeave = function(item, ev) {\n            if (_this._shouldIgnoreMouseEvent()) return;\n            /**\n             * IE11 focus() method forces parents to scroll to top of element.\n             * Edge and IE expose a setActive() function for focusable divs that\n             * sets the page focus but does not scroll the parent element.\n             */ if (_this._host.current) {\n                if (_this._host.current.setActive) try {\n                    _this._host.current.setActive();\n                } catch (e) {\n                /* no-op */ }\n                else _this._host.current.focus();\n            }\n        };\n        _this._onDismiss = function() {\n            _this.setState({\n                isOpen: false\n            });\n        };\n        _this._onDropdownBlur = function(ev) {\n            // If Dropdown disabled do not proceed with this logic.\n            var disabled = _this._isDisabled();\n            if (disabled) return;\n            // hasFocus tracks whether the root element has focus so always update the state.\n            _this.setState({\n                hasFocus: false\n            });\n            if (_this.state.isOpen) // Do not onBlur when the callout is opened\n            return;\n            if (_this.props.onBlur) _this.props.onBlur(ev);\n        };\n        _this._onDropdownKeyDown = function(ev) {\n            // If Dropdown disabled do not process any keyboard events.\n            var disabled = _this._isDisabled();\n            if (disabled) return;\n            // Take note if we are processing an alt (option) or meta (command) keydown.\n            // See comment in _shouldHandleKeyUp for reasoning.\n            _this._lastKeyDownWasAltOrMeta = _this._isAltOrMeta(ev);\n            if (_this.props.onKeyDown) {\n                _this.props.onKeyDown(ev);\n                if (ev.defaultPrevented) return;\n            }\n            var newIndex;\n            var selectedIndex = _this.state.selectedIndices.length ? _this.state.selectedIndices[0] : -1;\n            var containsExpandCollapseModifier = ev.altKey || ev.metaKey;\n            var isOpen = _this.state.isOpen;\n            switch(ev.which){\n                case (0, _utilities.KeyCodes).enter:\n                    _this.setState({\n                        isOpen: !isOpen\n                    });\n                    break;\n                case (0, _utilities.KeyCodes).escape:\n                    if (!isOpen) return;\n                    _this.setState({\n                        isOpen: false\n                    });\n                    break;\n                case (0, _utilities.KeyCodes).up:\n                    if (containsExpandCollapseModifier) {\n                        if (isOpen) {\n                            _this.setState({\n                                isOpen: false\n                            });\n                            break;\n                        }\n                        return;\n                    }\n                    if (_this.props.multiSelect) _this.setState({\n                        isOpen: true\n                    });\n                    else if (!_this._isDisabled()) newIndex = _this._moveIndex(ev, -1, selectedIndex - 1, selectedIndex);\n                    break;\n                case (0, _utilities.KeyCodes).down:\n                    if (containsExpandCollapseModifier) {\n                        ev.stopPropagation();\n                        ev.preventDefault();\n                    }\n                    if (containsExpandCollapseModifier && !isOpen || _this.props.multiSelect) _this.setState({\n                        isOpen: true\n                    });\n                    else if (!_this._isDisabled()) newIndex = _this._moveIndex(ev, 1, selectedIndex + 1, selectedIndex);\n                    break;\n                case (0, _utilities.KeyCodes).home:\n                    if (!_this.props.multiSelect) newIndex = _this._moveIndex(ev, 1, 0, selectedIndex);\n                    break;\n                case (0, _utilities.KeyCodes).end:\n                    if (!_this.props.multiSelect) newIndex = _this._moveIndex(ev, -1, _this.props.options.length - 1, selectedIndex);\n                    break;\n                case (0, _utilities.KeyCodes).space:\n                    break;\n                default:\n                    return;\n            }\n            if (newIndex !== selectedIndex) {\n                ev.stopPropagation();\n                ev.preventDefault();\n            }\n        };\n        _this._onDropdownKeyUp = function(ev) {\n            // If Dropdown disabled do not process any keyboard events.\n            var disabled = _this._isDisabled();\n            if (disabled) return;\n            var shouldHandleKey = _this._shouldHandleKeyUp(ev);\n            var isOpen = _this.state.isOpen;\n            if (_this.props.onKeyUp) {\n                _this.props.onKeyUp(ev);\n                if (ev.defaultPrevented) return;\n            }\n            switch(ev.which){\n                case (0, _utilities.KeyCodes).space:\n                    _this.setState({\n                        isOpen: !isOpen\n                    });\n                    break;\n                default:\n                    if (shouldHandleKey && isOpen) _this.setState({\n                        isOpen: false\n                    });\n                    return;\n            }\n            ev.stopPropagation();\n            ev.preventDefault();\n        };\n        _this._onZoneKeyDown = function(ev) {\n            var elementToFocus;\n            // Take note if we are processing an alt (option) or meta (command) keydown.\n            // See comment in _shouldHandleKeyUp for reasoning.\n            _this._lastKeyDownWasAltOrMeta = _this._isAltOrMeta(ev);\n            var containsExpandCollapseModifier = ev.altKey || ev.metaKey;\n            switch(ev.which){\n                case (0, _utilities.KeyCodes).up:\n                    if (containsExpandCollapseModifier) _this.setState({\n                        isOpen: false\n                    });\n                    else if (_this._host.current) elementToFocus = (0, _utilities.getLastFocusable)(_this._host.current, _this._host.current.lastChild, true);\n                    break;\n                // All directional keystrokes should be canceled when the zone is rendered.\n                // This avoids the body scroll from reacting and thus dismissing the dropdown.\n                case (0, _utilities.KeyCodes).home:\n                case (0, _utilities.KeyCodes).end:\n                case (0, _utilities.KeyCodes).pageUp:\n                case (0, _utilities.KeyCodes).pageDown:\n                    break;\n                case (0, _utilities.KeyCodes).down:\n                    if (!containsExpandCollapseModifier && _this._host.current) elementToFocus = (0, _utilities.getFirstFocusable)(_this._host.current, _this._host.current.firstChild, true);\n                    break;\n                case (0, _utilities.KeyCodes).escape:\n                    _this.setState({\n                        isOpen: false\n                    });\n                    break;\n                case (0, _utilities.KeyCodes).tab:\n                    _this.setState({\n                        isOpen: false\n                    });\n                    return;\n                default:\n                    return;\n            }\n            if (elementToFocus) elementToFocus.focus();\n            ev.stopPropagation();\n            ev.preventDefault();\n        };\n        _this._onZoneKeyUp = function(ev) {\n            var shouldHandleKey = _this._shouldHandleKeyUp(ev);\n            if (shouldHandleKey && _this.state.isOpen) {\n                _this.setState({\n                    isOpen: false\n                });\n                ev.preventDefault();\n            }\n        };\n        _this._onDropdownClick = function(ev) {\n            if (_this.props.onClick) {\n                _this.props.onClick(ev);\n                if (ev.defaultPrevented) return;\n            }\n            var isOpen = _this.state.isOpen;\n            var disabled = _this._isDisabled();\n            if (!disabled && !_this._shouldOpenOnFocus()) _this.setState({\n                isOpen: !isOpen\n            });\n            _this._isFocusedByClick = false; // reset\n        };\n        _this._onDropdownMouseDown = function() {\n            _this._isFocusedByClick = true;\n        };\n        _this._onFocus = function(ev) {\n            var disabled = _this._isDisabled();\n            if (!disabled) {\n                if (_this.props.onFocus) _this.props.onFocus(ev);\n                var state = {\n                    hasFocus: true\n                };\n                if (_this._shouldOpenOnFocus()) state.isOpen = true;\n                _this.setState(state);\n            }\n        };\n        /**\n         * Because the isDisabled prop is deprecated, we have had to repeat this logic all over the place.\n         * This helper method avoids all the repetition.\n         */ _this._isDisabled = function() {\n            var disabled = _this.props.disabled;\n            // eslint-disable-next-line deprecation/deprecation\n            var isDisabled = _this.props.isDisabled;\n            // Remove this deprecation workaround at 1.0.0\n            if (disabled === undefined) disabled = isDisabled;\n            return disabled;\n        };\n        _this._onRenderLabel = function(props) {\n            var label = props.label, required = props.required, disabled = props.disabled;\n            var labelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.label : undefined;\n            return label ? _react.createElement((0, _label.Label), {\n                className: _this._classNames.label,\n                id: _this._labelId,\n                required: required,\n                styles: labelStyles,\n                disabled: disabled\n            }, label) : null;\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        var multiSelect1 = props1.multiSelect, selectedKey = props1.selectedKey, selectedKeys = props1.selectedKeys, defaultSelectedKey = props1.defaultSelectedKey, defaultSelectedKeys = props1.defaultSelectedKeys, options1 = props1.options;\n        var warnMultiSelect, prop, warnNotMultiSelect, prop1;\n        _this._id = props1.id || (0, _utilities.getId)(\"Dropdown\");\n        _this._labelId = _this._id + \"-label\";\n        _this._listId = _this._id + \"-list\";\n        _this._optionId = _this._id + \"-option\";\n        _this._isScrollIdle = true;\n        var selectedIndices1;\n        if (multiSelect1) selectedIndices1 = _this._getSelectedIndexes(options1, defaultSelectedKeys !== undefined ? defaultSelectedKeys : selectedKeys);\n        else selectedIndices1 = _this._getSelectedIndexes(options1, defaultSelectedKey !== undefined ? defaultSelectedKey : selectedKey);\n        _this._sizePosCache.updateOptions(options1);\n        _this.state = {\n            isOpen: false,\n            selectedIndices: selectedIndices1,\n            hasFocus: false,\n            calloutRenderEdge: undefined\n        };\n        return _this;\n    }\n    Object.defineProperty(DropdownBase1.prototype, \"selectedOptions\", {\n        /**\n         * All selected options\n         */ get: function() {\n            var options = this.props.options;\n            var selectedIndices = this.state.selectedIndices;\n            return (0, _index.getAllSelectedOptions)(options, selectedIndices);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    DropdownBase1.prototype.componentWillUnmount = function() {\n        clearTimeout(this._scrollIdleTimeoutId);\n    };\n    DropdownBase1.prototype.UNSAFE_componentWillReceiveProps = function(newProps) {\n        // In controlled component usage where selectedKey is provided, update the selectedIndex\n        // state if the key or options change.\n        var selectedKeyProp;\n        // this does a shallow compare (assumes options are pure), for the purposes of determining whether\n        // defaultSelectedKey/defaultSelectedKeys are respected.\n        var didOptionsChange = newProps.options !== this.props.options;\n        if (newProps.multiSelect) {\n            if (didOptionsChange && newProps.defaultSelectedKeys !== undefined) selectedKeyProp = \"defaultSelectedKeys\";\n            else selectedKeyProp = \"selectedKeys\";\n        } else if (didOptionsChange && newProps.defaultSelectedKey !== undefined) selectedKeyProp = \"defaultSelectedKey\";\n        else selectedKeyProp = \"selectedKey\";\n        if (newProps[selectedKeyProp] !== undefined && (newProps[selectedKeyProp] !== this.props[selectedKeyProp] || didOptionsChange)) this.setState({\n            selectedIndices: this._getSelectedIndexes(newProps.options, newProps[selectedKeyProp])\n        });\n    };\n    DropdownBase1.prototype.componentDidUpdate = function(prevProps, prevState) {\n        if (prevState.isOpen === true && this.state.isOpen === false) {\n            this._gotMouseMove = false;\n            if (this.props.onDismiss) this.props.onDismiss();\n        }\n    };\n    DropdownBase1.prototype.render = function() {\n        var _this = this;\n        var _a, _b;\n        var id = this._id;\n        var props = this.props;\n        var className = props.className, label = props.label, options = props.options, ariaLabel = props.ariaLabel, required = props.required, errorMessage = props.errorMessage, keytipProps = props.keytipProps, propStyles = props.styles, theme = props.theme, panelProps = props.panelProps, calloutProps = props.calloutProps, _c = props.onRenderTitle, onRenderTitle = _c === void 0 ? this._getTitle : _c, _d = props.onRenderContainer, onRenderContainer = _d === void 0 ? this._onRenderContainer : _d, _e = props.onRenderCaretDown, onRenderCaretDown = _e === void 0 ? this._onRenderCaretDown : _e, _f = props.onRenderLabel, onRenderLabel = _f === void 0 ? this._onRenderLabel : _f;\n        var _g = this.state, isOpen = _g.isOpen, selectedIndices = _g.selectedIndices, calloutRenderEdge = _g.calloutRenderEdge, hasFocus = _g.hasFocus;\n        // eslint-disable-next-line deprecation/deprecation\n        var onRenderPlaceholder = props.onRenderPlaceholder || props.onRenderPlaceHolder || this._getPlaceholder;\n        // If our cached options are out of date update our cache\n        if (options !== this._sizePosCache.cachedOptions) this._sizePosCache.updateOptions(options);\n        var selectedOptions = (0, _index.getAllSelectedOptions)(options, selectedIndices);\n        var divProps = (0, _utilities.getNativeProps)(props, (0, _utilities.divProperties));\n        var disabled = this._isDisabled();\n        var errorMessageId = id + \"-errorMessage\";\n        var ariaActiveDescendant = disabled ? undefined : isOpen && selectedIndices.length === 1 && selectedIndices[0] >= 0 ? this._listId + selectedIndices[0] : undefined;\n        this._classNames = getClassNames(propStyles, {\n            theme: theme,\n            className: className,\n            hasError: !!(errorMessage && errorMessage.length > 0),\n            hasLabel: !!label,\n            isOpen: isOpen,\n            required: required,\n            disabled: disabled,\n            isRenderingPlaceholder: !selectedOptions.length,\n            panelClassName: (_a = panelProps) === null || _a === void 0 ? void 0 : _a.className,\n            calloutClassName: (_b = calloutProps) === null || _b === void 0 ? void 0 : _b.className,\n            calloutRenderEdge: calloutRenderEdge\n        });\n        var hasErrorMessage = !!errorMessage && errorMessage.length > 0;\n        return _react.createElement(\"div\", {\n            className: this._classNames.root\n        }, onRenderLabel(this.props, this._onRenderLabel), _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: keytipProps,\n            disabled: disabled\n        }, function(keytipAttributes) {\n            return _react.createElement(\"div\", (0, _tslib.__assign)({}, keytipAttributes, {\n                \"data-is-focusable\": !disabled,\n                ref: _this._dropDown,\n                id: id,\n                tabIndex: disabled ? -1 : 0,\n                role: \"combobox\",\n                \"aria-haspopup\": \"listbox\",\n                \"aria-expanded\": isOpen ? \"true\" : \"false\",\n                \"aria-label\": ariaLabel,\n                \"aria-labelledby\": label && !ariaLabel ? (0, _utilities.mergeAriaAttributeValues)(_this._labelId, _this._optionId) : undefined,\n                \"aria-describedby\": (0, _utilities.mergeAriaAttributeValues)(keytipAttributes[\"aria-describedby\"], hasErrorMessage ? _this._id + \"-errorMessage\" : undefined),\n                \"aria-activedescendant\": ariaActiveDescendant,\n                \"aria-required\": required,\n                \"aria-disabled\": disabled,\n                \"aria-controls\": isOpen ? _this._listId : undefined\n            }, divProps, {\n                className: _this._classNames.dropdown,\n                onBlur: _this._onDropdownBlur,\n                onKeyDown: _this._onDropdownKeyDown,\n                onKeyUp: _this._onDropdownKeyUp,\n                onClick: _this._onDropdownClick,\n                onMouseDown: _this._onDropdownMouseDown,\n                onFocus: _this._onFocus\n            }), _react.createElement(\"span\", {\n                id: _this._optionId,\n                className: _this._classNames.title,\n                \"aria-live\": hasFocus ? \"polite\" : undefined,\n                \"aria-atomic\": hasFocus ? true : undefined\n            }, selectedOptions.length ? onRenderTitle(selectedOptions, _this._onRenderTitle) : onRenderPlaceholder(props, _this._onRenderPlaceholder)), _react.createElement(\"span\", {\n                className: _this._classNames.caretDownWrapper\n            }, onRenderCaretDown(props, _this._onRenderCaretDown)));\n        }), isOpen && onRenderContainer((0, _tslib.__assign)((0, _tslib.__assign)({}, props), {\n            onDismiss: this._onDismiss\n        }), this._onRenderContainer), hasErrorMessage && _react.createElement(\"div\", {\n            role: \"alert\",\n            id: errorMessageId,\n            className: this._classNames.errorMessage\n        }, errorMessage));\n    };\n    DropdownBase1.prototype.focus = function(shouldOpenOnFocus) {\n        if (this._dropDown.current) {\n            this._dropDown.current.focus();\n            if (shouldOpenOnFocus) this.setState({\n                isOpen: true\n            });\n        }\n    };\n    DropdownBase1.prototype.setSelectedIndex = function(event, index) {\n        var _this = this;\n        var _a = this.props, options = _a.options, selectedKey = _a.selectedKey, selectedKeys = _a.selectedKeys, multiSelect = _a.multiSelect, notifyOnReselect = _a.notifyOnReselect;\n        var _b = this.state.selectedIndices, selectedIndices = _b === void 0 ? [] : _b;\n        var checked = selectedIndices ? selectedIndices.indexOf(index) > -1 : false;\n        var newIndexes = [];\n        index = Math.max(0, Math.min(options.length - 1, index));\n        // If this is a controlled component then no state change should take place.\n        if (selectedKey !== undefined || selectedKeys !== undefined) {\n            this._onChange(event, options, index, checked, multiSelect);\n            return;\n        }\n        if (!multiSelect && !notifyOnReselect && index === selectedIndices[0]) return;\n        else if (multiSelect) {\n            newIndexes = selectedIndices ? this._copyArray(selectedIndices) : [];\n            if (checked) {\n                var position = newIndexes.indexOf(index);\n                if (position > -1) // unchecked the current one\n                newIndexes.splice(position, 1);\n            } else // add the new selected index into the existing one\n            newIndexes.push(index);\n        } else // Set the selected option if this is an uncontrolled component\n        newIndexes = [\n            index\n        ];\n        event.persist();\n        // Call onChange after state is updated\n        this.setState({\n            selectedIndices: newIndexes\n        }, function() {\n            _this._onChange(event, options, index, checked, multiSelect);\n        });\n    };\n    DropdownBase1.prototype._copyArray = function(array) {\n        var newArray = [];\n        for(var _i = 0, array_1 = array; _i < array_1.length; _i++){\n            var element = array_1[_i];\n            newArray.push(element);\n        }\n        return newArray;\n    };\n    /**\n     * Finds the next valid Dropdown option and sets the selected index to it.\n     * @param stepValue - Value of how many items the function should traverse.  Should be -1 or 1.\n     * @param index - Index of where the search should start\n     * @param selectedIndex - The selectedIndex Dropdown's state\n     * @returns The next valid dropdown option's index\n     */ DropdownBase1.prototype._moveIndex = function(event, stepValue, index, selectedIndex) {\n        var options = this.props.options;\n        // Return selectedIndex if nothing has changed or options is empty\n        if (selectedIndex === index || options.length === 0) return selectedIndex;\n        // If the user is pressing the up or down key we want to make\n        // sure that the dropdown cycles through the options without\n        // causing the screen to scroll. In _onDropdownKeyDown\n        // at the very end is a check to see if newIndex !== selectedIndex.\n        // If the index is less than 0 and we set it back to 0, then\n        // newIndex will equal selectedIndex and not stop the action\n        // of the key press happening and vice versa for indexes greater\n        // than or equal to the options length.\n        if (index >= options.length) index = 0;\n        else if (index < 0) index = options.length - 1;\n        var stepCounter = 0;\n        // If current index is a header or divider, or disabled, increment by step\n        while(options[index].itemType === (0, _dropdownTypes.DropdownMenuItemType).Header || options[index].itemType === (0, _dropdownTypes.DropdownMenuItemType).Divider || options[index].disabled){\n            // If stepCounter exceeds length of options, then return selectedIndex (-1)\n            if (stepCounter >= options.length) return selectedIndex;\n            // If index + stepValue is out of bounds, wrap around\n            if (index + stepValue < 0) index = options.length;\n            else if (index + stepValue >= options.length) index = -1;\n            index = index + stepValue;\n            stepCounter++;\n        }\n        this.setSelectedIndex(event, index);\n        return index;\n    };\n    /** Wrap item list in a FocusZone */ DropdownBase1.prototype._renderFocusableList = function(props) {\n        var _a = props.onRenderList, onRenderList = _a === void 0 ? this._onRenderList : _a, label = props.label, ariaLabel = props.ariaLabel, multiSelect = props.multiSelect;\n        return _react.createElement(\"div\", {\n            className: this._classNames.dropdownItemsWrapper,\n            onKeyDown: this._onZoneKeyDown,\n            onKeyUp: this._onZoneKeyUp,\n            ref: this._host,\n            tabIndex: 0\n        }, _react.createElement((0, _focusZone.FocusZone), {\n            ref: this._focusZone,\n            direction: (0, _focusZone.FocusZoneDirection).vertical,\n            id: this._listId,\n            className: this._classNames.dropdownItems,\n            role: \"listbox\",\n            \"aria-label\": ariaLabel,\n            \"aria-labelledby\": label && !ariaLabel ? this._labelId : undefined,\n            \"aria-multiselectable\": multiSelect\n        }, onRenderList(props, this._onRenderList)));\n    };\n    DropdownBase1.prototype._renderSeparator = function(item) {\n        var index = item.index, key = item.key;\n        if (index > 0) return _react.createElement(\"div\", {\n            role: \"separator\",\n            key: key,\n            className: this._classNames.dropdownDivider\n        });\n        return null;\n    };\n    DropdownBase1.prototype._renderHeader = function(item) {\n        var _a = this.props.onRenderOption, onRenderOption = _a === void 0 ? this._onRenderOption : _a;\n        var key = item.key, id = item.id;\n        return _react.createElement(\"div\", {\n            id: id,\n            key: key,\n            className: this._classNames.dropdownItemHeader\n        }, onRenderOption(item, this._onRenderOption));\n    };\n    DropdownBase1.prototype._onItemMouseEnter = function(item, ev) {\n        if (this._shouldIgnoreMouseEvent()) return;\n        var targetElement = ev.currentTarget;\n        targetElement.focus();\n    };\n    DropdownBase1.prototype._onItemMouseMove = function(item, ev) {\n        var targetElement = ev.currentTarget;\n        this._gotMouseMove = true;\n        if (!this._isScrollIdle || document.activeElement === targetElement) return;\n        targetElement.focus();\n    };\n    DropdownBase1.prototype._shouldIgnoreMouseEvent = function() {\n        return !this._isScrollIdle || !this._gotMouseMove;\n    };\n    /** Get all selected indexes for multi-select mode */ DropdownBase1.prototype._getSelectedIndexes = function(options, selectedKey) {\n        if (selectedKey === undefined) {\n            if (this.props.multiSelect) return this._getAllSelectedIndices(options);\n            var selectedIndex = this._getSelectedIndex(options, null);\n            return selectedIndex !== -1 ? [\n                selectedIndex\n            ] : [];\n        } else if (!Array.isArray(selectedKey)) {\n            var selectedIndex = this._getSelectedIndex(options, selectedKey);\n            return selectedIndex !== -1 ? [\n                selectedIndex\n            ] : [];\n        }\n        var selectedIndices = [];\n        for(var _i = 0, selectedKey_1 = selectedKey; _i < selectedKey_1.length; _i++){\n            var key = selectedKey_1[_i];\n            var selectedIndex = this._getSelectedIndex(options, key);\n            selectedIndex !== -1 && selectedIndices.push(selectedIndex);\n        }\n        return selectedIndices;\n    };\n    DropdownBase1.prototype._getAllSelectedIndices = function(options) {\n        return options.map(function(option, index) {\n            return option.selected ? index : -1;\n        }).filter(function(index) {\n            return index !== -1;\n        });\n    };\n    DropdownBase1.prototype._getSelectedIndex = function(options, selectedKey) {\n        return (0, _utilities.findIndex)(options, function(option) {\n            // eslint-disable-next-line eqeqeq\n            if (selectedKey != null) return option.key === selectedKey;\n            else // eslint-disable-next-line deprecation/deprecation\n            return !!option.selected || !!option.isSelected;\n        });\n    };\n    /**\n     * Returns true if the key for the event is alt (Mac option) or meta (Mac command).\n     */ DropdownBase1.prototype._isAltOrMeta = function(ev) {\n        return ev.which === (0, _utilities.KeyCodes).alt || ev.key === \"Meta\";\n    };\n    /**\n     * We close the menu on key up only if ALL of the following are true:\n     * - Most recent key down was alt or meta (command)\n     * - The alt/meta key down was NOT followed by some other key (such as down/up arrow to\n     *   expand/collapse the menu)\n     * - We're not on a Mac (or iOS)\n     *\n     * This is because on Windows, pressing alt moves focus to the application menu bar or similar,\n     * closing any open context menus. There is not a similar behavior on Macs.\n     */ DropdownBase1.prototype._shouldHandleKeyUp = function(ev) {\n        var keyPressIsAltOrMetaAlone = this._lastKeyDownWasAltOrMeta && this._isAltOrMeta(ev);\n        this._lastKeyDownWasAltOrMeta = false;\n        return !!keyPressIsAltOrMetaAlone && !((0, _utilities.isMac)() || (0, _utilities.isIOS)());\n    };\n    /**\n     * Returns true if dropdown should set to open on focus.\n     * Otherwise, isOpen state should be toggled on click\n     */ DropdownBase1.prototype._shouldOpenOnFocus = function() {\n        var hasFocus = this.state.hasFocus;\n        var openOnKeyboardFocus = this.props.openOnKeyboardFocus;\n        return !this._isFocusedByClick && openOnKeyboardFocus === true && !hasFocus;\n    };\n    DropdownBase1.defaultProps = {\n        options: []\n    };\n    DropdownBase1 = (0, _tslib.__decorate)([\n        (0, _withResponsiveMode.withResponsiveMode)\n    ], DropdownBase1);\n    return DropdownBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../../Callout\":\"jhXLC\",\"../../Checkbox\":\"dT3QJ\",\"../../Button\":\"eMzbU\",\"../../common/DirectionalHint\":\"kARBR\",\"./Dropdown.types\":\"aXErL\",\"./utilities/DropdownSizePosCache\":\"18Htd\",\"../../FocusZone\":\"cRFhG\",\"../../Icon\":\"2Ha7p\",\"../../Label\":\"lLA6C\",\"../../KeytipData\":\"e8VIa\",\"../../Panel\":\"fAFaz\",\"../../utilities/decorators/withResponsiveMode\":\"i57Mj\",\"../../utilities/selectableOption/index\":\"h4B52\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aXErL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DropdownMenuItemType\", ()=>(0, _selectableOptionTypes.SelectableOptionMenuItemType));\nparcelHelpers.export(exports, \"ResponsiveMode\", ()=>(0, _withResponsiveMode.ResponsiveMode)) // Exported because the type is an optional prop and not exported otherwise.\n;\nvar _withResponsiveMode = require(\"../../utilities/decorators/withResponsiveMode\");\nvar _selectableOptionTypes = require(\"../../utilities/selectableOption/SelectableOption.types\");\n\n},{\"../../utilities/decorators/withResponsiveMode\":\"i57Mj\",\"../../utilities/selectableOption/SelectableOption.types\":\"4gljF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"18Htd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DropdownSizePosCache\", ()=>DropdownSizePosCache);\nvar _tslib = require(\"tslib\");\nvar _dropdownTypes = require(\"../Dropdown.types\");\n/**\n * A utility class to cache size and position in cache.\n *\n * Dropdown options has non-selectable display types. It is therefore not cheap to determine\n * the total number of actual selectable options as well as the position an option is in the\n * list of options - O(n) cost for each lookup.\n *\n * Given that we potentially have to make this determination on every single render pass, this\n * cache should provide a little bit of relief.\n */ var DropdownSizePosCache = /** @class */ function() {\n    function DropdownSizePosCache1() {\n        this._size = 0;\n    }\n    /**\n     * Invalidates the cache and recalculate the size of selectable options.\n     */ DropdownSizePosCache1.prototype.updateOptions = function(options) {\n        var displayOnlyOptionsCache = [];\n        var size = 0;\n        for(var i = 0; i < options.length; i++){\n            if (options[i].itemType === (0, _dropdownTypes.DropdownMenuItemType).Divider || options[i].itemType === (0, _dropdownTypes.DropdownMenuItemType).Header) displayOnlyOptionsCache.push(i);\n            else if (!options[i].hidden) size++;\n        }\n        this._size = size;\n        this._displayOnlyOptionsCache = displayOnlyOptionsCache;\n        this._cachedOptions = (0, _tslib.__spreadArrays)(options);\n    };\n    Object.defineProperty(DropdownSizePosCache1.prototype, \"optionSetSize\", {\n        /**\n         * The size of all the selectable options.\n         */ get: function() {\n            return this._size;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(DropdownSizePosCache1.prototype, \"cachedOptions\", {\n        /**\n         * The chached options array.\n         */ get: function() {\n            return this._cachedOptions;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Returns the position of this option element relative to the full set of selectable option elements.\n     * Note: the first selectable element is position 1 in the set.\n     * @param index The raw index of the option element.\n     */ DropdownSizePosCache1.prototype.positionInSet = function(index) {\n        if (index === undefined) return undefined;\n        // we could possibly memoize this too but this should be good enough, most of the time (the expectation is that\n        // when you have a lot of options, the selectable options will heavily dominate over the non-selectable options.\n        var offset = 0;\n        while(index > this._displayOnlyOptionsCache[offset])offset++;\n        if (this._displayOnlyOptionsCache[offset] === index) throw new Error(\"Unexpected: Option at index \" + index + \" is not a selectable element.\");\n        return index - offset + 1;\n    };\n    return DropdownSizePosCache1;\n}();\n\n},{\"tslib\":\"01Tx1\",\"../Dropdown.types\":\"aXErL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fAFaz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Panel/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Panel/index\":\"3A4Nn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3A4Nn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _panel = require(\"./Panel\");\nparcelHelpers.exportAll(_panel, exports);\nvar _panelBase = require(\"./Panel.base\");\nparcelHelpers.exportAll(_panelBase, exports);\nvar _panelTypes = require(\"./Panel.types\");\nparcelHelpers.exportAll(_panelTypes, exports);\n\n},{\"./Panel\":\"gigAz\",\"./Panel.base\":\"hdBIJ\",\"./Panel.types\":\"8RsYQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gigAz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Panel\", ()=>Panel);\nvar _utilities = require(\"../../Utilities\");\nvar _panelBase = require(\"./Panel.base\");\nvar _panelStyles = require(\"./Panel.styles\");\nvar Panel = (0, _utilities.styled)((0, _panelBase.PanelBase), (0, _panelStyles.getStyles), undefined, {\n    scope: \"Panel\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Panel.base\":\"hdBIJ\",\"./Panel.styles\":\"hJ7HP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hdBIJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"PanelBase\", ()=>PanelBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _button = require(\"../../Button\");\nvar _layer = require(\"../../Layer\");\nvar _overlay = require(\"../../Overlay\");\nvar _popup = require(\"../../Popup\");\nvar _utilities = require(\"../../Utilities\");\nvar _index = require(\"../FocusTrapZone/index\");\nvar _panelTypes = require(\"./Panel.types\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar COMPONENT_NAME = \"Panel\";\nvar PanelVisibilityState;\n(function(PanelVisibilityState1) {\n    PanelVisibilityState1[PanelVisibilityState1[\"closed\"] = 0] = \"closed\";\n    PanelVisibilityState1[PanelVisibilityState1[\"animatingOpen\"] = 1] = \"animatingOpen\";\n    PanelVisibilityState1[PanelVisibilityState1[\"open\"] = 2] = \"open\";\n    PanelVisibilityState1[PanelVisibilityState1[\"animatingClosed\"] = 3] = \"animatingClosed\";\n})(PanelVisibilityState || (PanelVisibilityState = {}));\nvar PanelBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(PanelBase1, _super);\n    function PanelBase1(props1) {\n        var _this = _super.call(this, props1) || this;\n        _this._panel = _react.createRef();\n        _this._animationCallback = null;\n        _this._hasCustomNavigation = !!(_this.props.onRenderNavigation || _this.props.onRenderNavigationContent);\n        _this.dismiss = function(ev) {\n            if (_this.props.onDismiss && _this.isActive) _this.props.onDismiss(ev);\n            if (!ev || ev && !ev.defaultPrevented) _this.close();\n        };\n        // Allow the user to scroll within the panel but not on the body\n        _this._allowScrollOnPanel = function(elt) {\n            if (elt) {\n                if (_this._allowTouchBodyScroll) (0, _utilities.allowOverscrollOnElement)(elt, _this._events);\n                else (0, _utilities.allowScrollOnElement)(elt, _this._events);\n            } else _this._events.off(_this._scrollableContent);\n            _this._scrollableContent = elt;\n        };\n        _this._onRenderNavigation = function(props) {\n            if (!_this.props.onRenderNavigationContent && !_this.props.onRenderNavigation && !_this.props.hasCloseButton) return null;\n            var _a = _this.props.onRenderNavigationContent, onRenderNavigationContent = _a === void 0 ? _this._onRenderNavigationContent : _a;\n            return _react.createElement(\"div\", {\n                className: _this._classNames.navigation\n            }, onRenderNavigationContent(props, _this._onRenderNavigationContent));\n        };\n        _this._onRenderNavigationContent = function(props) {\n            var _a;\n            var closeButtonAriaLabel = props.closeButtonAriaLabel, hasCloseButton = props.hasCloseButton, _b = props.onRenderHeader, onRenderHeader = _b === void 0 ? _this._onRenderHeader : _b;\n            if (hasCloseButton) {\n                var iconButtonStyles = (_a = _this._classNames.subComponentStyles) === null || _a === void 0 ? void 0 : _a.closeButton();\n                return _react.createElement(_react.Fragment, null, !_this._hasCustomNavigation && onRenderHeader(_this.props, _this._onRenderHeader, _this._headerTextId), _react.createElement((0, _button.IconButton), {\n                    styles: iconButtonStyles,\n                    // eslint-disable-next-line deprecation/deprecation\n                    className: _this._classNames.closeButton,\n                    onClick: _this._onPanelClick,\n                    ariaLabel: closeButtonAriaLabel,\n                    title: closeButtonAriaLabel,\n                    \"data-is-visible\": true,\n                    iconProps: {\n                        iconName: \"Cancel\"\n                    }\n                }));\n            }\n            return null;\n        };\n        _this._onRenderHeader = function(props, defaultRender, headerTextId) {\n            var headerText = props.headerText, _a = props.headerTextProps, headerTextProps = _a === void 0 ? {} : _a;\n            if (headerText) return _react.createElement(\"div\", {\n                className: _this._classNames.header\n            }, _react.createElement(\"div\", (0, _tslib.__assign)({\n                id: headerTextId,\n                role: \"heading\",\n                \"aria-level\": 1\n            }, headerTextProps, {\n                className: (0, _utilities.css)(_this._classNames.headerText, headerTextProps.className)\n            }), headerText));\n            return null;\n        };\n        _this._onRenderBody = function(props) {\n            return _react.createElement(\"div\", {\n                className: _this._classNames.content\n            }, props.children);\n        };\n        _this._onRenderFooter = function(props) {\n            var _a = _this.props.onRenderFooterContent, onRenderFooterContent = _a === void 0 ? null : _a;\n            if (onRenderFooterContent) return _react.createElement(\"div\", {\n                className: _this._classNames.footer\n            }, _react.createElement(\"div\", {\n                className: _this._classNames.footerInner\n            }, onRenderFooterContent()));\n            return null;\n        };\n        _this._animateTo = function(newVisibilityState) {\n            if (newVisibilityState === PanelVisibilityState.open && _this.props.onOpen) _this.props.onOpen();\n            _this._animationCallback = _this._async.setTimeout(function() {\n                _this.setState({\n                    visibility: newVisibilityState\n                });\n                _this._onTransitionComplete();\n            }, 200);\n        };\n        _this._clearExistingAnimationTimer = function() {\n            if (_this._animationCallback !== null) _this._async.clearTimeout(_this._animationCallback);\n        };\n        _this._onPanelClick = function(ev) {\n            _this.dismiss(ev);\n        };\n        _this._onTransitionComplete = function() {\n            _this._updateFooterPosition();\n            if (_this.state.visibility === PanelVisibilityState.open && _this.props.onOpened) _this.props.onOpened();\n            if (_this.state.visibility === PanelVisibilityState.closed && _this.props.onDismissed) _this.props.onDismissed();\n        };\n        var _a1 = _this.props.allowTouchBodyScroll, allowTouchBodyScroll = _a1 === void 0 ? false : _a1;\n        _this._allowTouchBodyScroll = allowTouchBodyScroll;\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._events = new (0, _utilities.EventGroup)(_this);\n        (0, _utilities.initializeComponentRef)(_this);\n        (0, _utilities.warnDeprecations)(COMPONENT_NAME, props1, {\n            ignoreExternalFocusing: \"focusTrapZoneProps\",\n            forceFocusInsideTrap: \"focusTrapZoneProps\",\n            firstFocusableSelector: \"focusTrapZoneProps\"\n        });\n        _this.state = {\n            isFooterSticky: false,\n            // intentionally ignore props so animation takes place during componentDidMount\n            visibility: PanelVisibilityState.closed,\n            id: (0, _utilities.getId)(\"Panel\")\n        };\n        return _this;\n    }\n    PanelBase1.getDerivedStateFromProps = function(nextProps, prevState) {\n        if (nextProps.isOpen === undefined) return null; // no state update\n        if (nextProps.isOpen && (prevState.visibility === PanelVisibilityState.closed || prevState.visibility === PanelVisibilityState.animatingClosed)) return {\n            visibility: PanelVisibilityState.animatingOpen\n        };\n        if (!nextProps.isOpen && (prevState.visibility === PanelVisibilityState.open || prevState.visibility === PanelVisibilityState.animatingOpen)) return {\n            visibility: PanelVisibilityState.animatingClosed\n        };\n        return null;\n    };\n    PanelBase1.prototype.componentDidMount = function() {\n        this._events.on(window, \"resize\", this._updateFooterPosition);\n        if (this._shouldListenForOuterClick(this.props)) this._events.on(document.body, \"mousedown\", this._dismissOnOuterClick, true);\n        if (this.props.isOpen) this.setState({\n            visibility: PanelVisibilityState.animatingOpen\n        });\n    };\n    PanelBase1.prototype.componentDidUpdate = function(previousProps, previousState) {\n        var shouldListenOnOuterClick = this._shouldListenForOuterClick(this.props);\n        var previousShouldListenOnOuterClick = this._shouldListenForOuterClick(previousProps);\n        if (this.state.visibility !== previousState.visibility) {\n            this._clearExistingAnimationTimer();\n            if (this.state.visibility === PanelVisibilityState.animatingOpen) this._animateTo(PanelVisibilityState.open);\n            else if (this.state.visibility === PanelVisibilityState.animatingClosed) this._animateTo(PanelVisibilityState.closed);\n        }\n        if (shouldListenOnOuterClick && !previousShouldListenOnOuterClick) this._events.on(document.body, \"mousedown\", this._dismissOnOuterClick, true);\n        else if (!shouldListenOnOuterClick && previousShouldListenOnOuterClick) this._events.off(document.body, \"mousedown\", this._dismissOnOuterClick, true);\n    };\n    PanelBase1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n    };\n    PanelBase1.prototype.render = function() {\n        var _a = this.props, _b = _a.className, className = _b === void 0 ? \"\" : _b, elementToFocusOnDismiss = _a.elementToFocusOnDismiss, /* eslint-disable deprecation/deprecation */ firstFocusableSelector = _a.firstFocusableSelector, focusTrapZoneProps = _a.focusTrapZoneProps, forceFocusInsideTrap = _a.forceFocusInsideTrap, hasCloseButton = _a.hasCloseButton, headerText = _a.headerText, _c = _a.headerClassName, headerClassName = _c === void 0 ? \"\" : _c, ignoreExternalFocusing = _a.ignoreExternalFocusing, /* eslint-enable deprecation/deprecation */ isBlocking = _a.isBlocking, isFooterAtBottom = _a.isFooterAtBottom, isLightDismiss = _a.isLightDismiss, isHiddenOnDismiss = _a.isHiddenOnDismiss, layerProps = _a.layerProps, overlayProps = _a.overlayProps, popupProps = _a.popupProps, type = _a.type, styles = _a.styles, theme = _a.theme, customWidth = _a.customWidth, _d = _a.onLightDismissClick, onLightDismissClick = _d === void 0 ? this._onPanelClick : _d, _e = _a.onRenderNavigation, onRenderNavigation = _e === void 0 ? this._onRenderNavigation : _e, _f = _a.onRenderHeader, onRenderHeader = _f === void 0 ? this._onRenderHeader : _f, _g = _a.onRenderBody, onRenderBody = _g === void 0 ? this._onRenderBody : _g, _h = _a.onRenderFooter, onRenderFooter = _h === void 0 ? this._onRenderFooter : _h;\n        var _j = this.state, isFooterSticky = _j.isFooterSticky, visibility = _j.visibility, id = _j.id;\n        var isLeft = type === (0, _panelTypes.PanelType).smallFixedNear || type === (0, _panelTypes.PanelType).customNear ? true : false;\n        var isRTL = (0, _utilities.getRTL)(theme);\n        var isOnRightSide = isRTL ? isLeft : !isLeft;\n        var customWidthStyles = type === (0, _panelTypes.PanelType).custom || type === (0, _panelTypes.PanelType).customNear ? {\n            width: customWidth\n        } : {};\n        var nativeProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties));\n        var isOpen = this.isActive;\n        var isAnimating = visibility === PanelVisibilityState.animatingClosed || visibility === PanelVisibilityState.animatingOpen;\n        this._headerTextId = headerText && id + \"-headerText\";\n        if (!isOpen && !isAnimating && !isHiddenOnDismiss) return null;\n        this._classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            focusTrapZoneClassName: focusTrapZoneProps ? focusTrapZoneProps.className : undefined,\n            hasCloseButton: hasCloseButton,\n            headerClassName: headerClassName,\n            isAnimating: isAnimating,\n            isFooterSticky: isFooterSticky,\n            isFooterAtBottom: isFooterAtBottom,\n            isOnRightSide: isOnRightSide,\n            isOpen: isOpen,\n            isHiddenOnDismiss: isHiddenOnDismiss,\n            type: type,\n            hasCustomNavigation: this._hasCustomNavigation\n        });\n        var _k = this, _classNames = _k._classNames, _allowTouchBodyScroll = _k._allowTouchBodyScroll;\n        var overlay;\n        if (isBlocking && isOpen) overlay = _react.createElement((0, _overlay.Overlay), (0, _tslib.__assign)({\n            className: _classNames.overlay,\n            isDarkThemed: false,\n            onClick: isLightDismiss ? onLightDismissClick : undefined,\n            allowTouchBodyScroll: _allowTouchBodyScroll\n        }, overlayProps));\n        return _react.createElement((0, _layer.Layer), (0, _tslib.__assign)({}, layerProps), _react.createElement((0, _popup.Popup), (0, _tslib.__assign)({\n            role: \"dialog\",\n            \"aria-modal\": \"true\",\n            ariaLabelledBy: this._headerTextId ? this._headerTextId : undefined,\n            onDismiss: this.dismiss,\n            className: _classNames.hiddenPanel\n        }, popupProps), _react.createElement(\"div\", (0, _tslib.__assign)({\n            \"aria-hidden\": !isOpen && isAnimating\n        }, nativeProps, {\n            ref: this._panel,\n            className: _classNames.root\n        }), overlay, _react.createElement((0, _index.FocusTrapZone), (0, _tslib.__assign)({\n            ignoreExternalFocusing: ignoreExternalFocusing,\n            forceFocusInsideTrap: !isBlocking || isHiddenOnDismiss && !isOpen ? false : forceFocusInsideTrap,\n            firstFocusableSelector: firstFocusableSelector,\n            isClickableOutsideFocusTrap: true\n        }, focusTrapZoneProps, {\n            className: _classNames.main,\n            style: customWidthStyles,\n            elementToFocusOnDismiss: elementToFocusOnDismiss\n        }), _react.createElement(\"div\", {\n            className: _classNames.commands,\n            \"data-is-visible\": true\n        }, onRenderNavigation(this.props, this._onRenderNavigation)), _react.createElement(\"div\", {\n            className: _classNames.contentInner\n        }, (this._hasCustomNavigation || !hasCloseButton) && onRenderHeader(this.props, this._onRenderHeader, this._headerTextId), _react.createElement(\"div\", {\n            ref: this._allowScrollOnPanel,\n            className: _classNames.scrollableContent,\n            \"data-is-scrollable\": true\n        }, onRenderBody(this.props, this._onRenderBody)), onRenderFooter(this.props, this._onRenderFooter))))));\n    };\n    PanelBase1.prototype.open = function() {\n        if (this.props.isOpen !== undefined) return;\n        if (this.isActive) return;\n        this.setState({\n            visibility: PanelVisibilityState.animatingOpen\n        });\n    };\n    PanelBase1.prototype.close = function() {\n        if (this.props.isOpen !== undefined) return;\n        if (!this.isActive) return;\n        this.setState({\n            visibility: PanelVisibilityState.animatingClosed\n        });\n    };\n    Object.defineProperty(PanelBase1.prototype, \"isActive\", {\n        /** isActive is true when panel is open or opening. */ get: function() {\n            return this.state.visibility === PanelVisibilityState.open || this.state.visibility === PanelVisibilityState.animatingOpen;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    PanelBase1.prototype._shouldListenForOuterClick = function(props) {\n        return !!props.isBlocking && !!props.isOpen;\n    };\n    PanelBase1.prototype._updateFooterPosition = function() {\n        var scrollableContent = this._scrollableContent;\n        if (scrollableContent) {\n            var height = scrollableContent.clientHeight;\n            var innerHeight_1 = scrollableContent.scrollHeight;\n            this.setState({\n                isFooterSticky: height < innerHeight_1 ? true : false\n            });\n        }\n    };\n    PanelBase1.prototype._dismissOnOuterClick = function(ev) {\n        var panel = this._panel.current;\n        if (this.isActive && panel && !ev.defaultPrevented) {\n            if (!(0, _utilities.elementContains)(panel, ev.target)) {\n                if (this.props.onOuterClick) this.props.onOuterClick(ev);\n                else this.dismiss(ev);\n            }\n        }\n    };\n    PanelBase1.defaultProps = {\n        isHiddenOnDismiss: false,\n        isOpen: undefined,\n        isBlocking: true,\n        hasCloseButton: true,\n        type: (0, _panelTypes.PanelType).smallFixedFar\n    };\n    return PanelBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Button\":\"eMzbU\",\"../../Layer\":\"6rkPB\",\"../../Overlay\":\"8SS5W\",\"../../Popup\":\"bi7ZM\",\"../../Utilities\":\"2F07a\",\"../FocusTrapZone/index\":\"7TtL6\",\"./Panel.types\":\"8RsYQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8RsYQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"PanelType\", ()=>PanelType);\nvar PanelType;\n(function(PanelType1) {\n    /**\n     * Renders the Panel with a `fluid` (full screen) width.\n     * Recommended for use on small screen breakpoints.\n     * - Small (320-479): full screen width, 16px left/right padding\n     * - Medium (480-639): full screen width, 16px left/right padding\n     * - Large (640-1023): full screen width, 32px left/right padding\n     * - XLarge (1024-1365): full screen width, 32px left/right padding\n     * - XXLarge (1366-up): full screen width, 40px left/right padding\n     */ PanelType1[PanelType1[\"smallFluid\"] = 0] = \"smallFluid\";\n    /**\n     * Renders the Panel in fixed-width `small` size, anchored to the far side (right in LTR mode).\n     * - Small (320-479): adapts to `PanelType.smallFluid` at this breakpoint\n     * - Medium (480-639): 340px width, 16px left/right padding\n     * - Large (640-1023): 340px width, 32px left/right padding\n     * - XLarge (1024-1365): 340px width, 32px left/right padding\n     * - XXLarge (1366-up): 340px width, 40px left/right padding\n     */ PanelType1[PanelType1[\"smallFixedFar\"] = 1] = \"smallFixedFar\";\n    /**\n     * Renders the Panel in fixed-width `small` size, anchored to the near side (left in LTR mode).\n     * - Small (320-479): 272px width, 16px left/right padding\n     * - Medium (480-639): 272px width, 16px left/right padding\n     * - Large (640-1023): 272px width, 32px left/right padding\n     * - XLarge (1024-1365): 272px width, 32px left/right padding\n     * - XXLarge (1366-up): 272px width, 40px left/right padding\n     */ PanelType1[PanelType1[\"smallFixedNear\"] = 2] = \"smallFixedNear\";\n    /**\n     * Renders the Panel in `medium` size, anchored to the far side (right in LTR mode).\n     * - Small (320-479): adapts to `PanelType.smallFluid` at this breakpoint\n     * - Medium (480-639): adapts to `PanelType.smallFixedFar` at this breakpoint\n     * - Large (640-1023): 592px width, 32px left/right padding\n     * - XLarge (1024-1365): 644px width, 32px left/right padding\n     * - XXLarge (1366-up): 644px width, 40px left/right padding\n     */ PanelType1[PanelType1[\"medium\"] = 3] = \"medium\";\n    /**\n     * Renders the Panel in `large` size, anchored to the far side (right in LTR mode).\n     * - Small (320-479): adapts to `PanelType.smallFluid` at this breakpoint\n     * - Medium (480-639):  adapts to `PanelType.smallFixedFar` at this breakpoint\n     * - Large (640-1023): adapts to `PanelType.medium` at this breakpoint\n     * - XLarge (1024-1365): 48px fixed left margin, fluid width, 32px left/right padding\n     * - XXLarge (1366-up): 428px fixed left margin, fluid width, 40px left/right padding\n     */ PanelType1[PanelType1[\"large\"] = 4] = \"large\";\n    /**\n     * Renders the Panel in `large` size, anchored to the far side (right in LTR mode), with a fixed width at\n     * XX-Large breakpoint.\n     * - Small (320-479): adapts to `PanelType.smallFluid` at this breakpoint\n     * - Medium (480-639): adapts to `PanelType.smallFixedFar` at this breakpoint\n     * - Large (640-1023): adapts to `PanelType.medium` at this breakpoint\n     * - XLarge (1024-1365): 48px fixed left margin, fluid width, 32px left/right padding\n     * - XXLarge (1366-up): 940px width, 40px left/right padding\n     */ PanelType1[PanelType1[\"largeFixed\"] = 5] = \"largeFixed\";\n    /**\n     * Renders the Panel in `extra large` size, anchored to the far side (right in LTR mode).\n     * - Small (320-479): adapts to `PanelType.smallFluid` at this breakpoint\n     * - Medium (480-639): adapts to `PanelType.smallFixedFar` at this breakpoint\n     * - Large (640-1023): adapts to `PanelType.medium` at this breakpoint\n     * - XLarge (1024-1365): adapts to `PanelType.large` at this breakpoint\n     * - XXLarge (1366-1919): 176px fixed left margin, fluid width, 40px left/right padding\n     * - XXXLarge (1920-up): 176px fixed left margin, fluid width, 40px left/right padding\n     */ PanelType1[PanelType1[\"extraLarge\"] = 6] = \"extraLarge\";\n    /**\n     * Renders the Panel in `custom` size using `customWidth`, anchored to the far side (right in LTR mode).\n     * - Has a fixed width provided by the `customWidth` prop\n     * - When screen width reaches the `customWidth` value it will behave like a fluid width Panel\n     * taking up 100% of the viewport width\n     */ PanelType1[PanelType1[\"custom\"] = 7] = \"custom\";\n    /**\n     * Renders the Panel in `custom` size using `customWidth`, anchored to the near side (left in LTR mode).\n     * - Has a fixed width provided by the `customWidth` prop\n     * - When screen width reaches the `customWidth` value it will behave like a fluid width Panel\n     * taking up 100% of the viewport width\n     */ PanelType1[PanelType1[\"customNear\"] = 8] = \"customNear\";\n})(PanelType || (PanelType = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hJ7HP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _panelTypes = require(\"./Panel.types\");\nvar _styling = require(\"../../Styling\");\nvar _a, _b, _c, _d, _e;\nvar GlobalClassNames = {\n    root: \"ms-Panel\",\n    main: \"ms-Panel-main\",\n    commands: \"ms-Panel-commands\",\n    contentInner: \"ms-Panel-contentInner\",\n    scrollableContent: \"ms-Panel-scrollableContent\",\n    navigation: \"ms-Panel-navigation\",\n    closeButton: \"ms-Panel-closeButton ms-PanelAction-close\",\n    header: \"ms-Panel-header\",\n    headerText: \"ms-Panel-headerText\",\n    content: \"ms-Panel-content\",\n    footer: \"ms-Panel-footer\",\n    footerInner: \"ms-Panel-footerInner\",\n    isOpen: \"is-open\",\n    hasCloseButton: \"ms-Panel--hasCloseButton\",\n    smallFluid: \"ms-Panel--smFluid\",\n    smallFixedNear: \"ms-Panel--smLeft\",\n    smallFixedFar: \"ms-Panel--sm\",\n    medium: \"ms-Panel--md\",\n    large: \"ms-Panel--lg\",\n    largeFixed: \"ms-Panel--fixed\",\n    extraLarge: \"ms-Panel--xl\",\n    custom: \"ms-Panel--custom\",\n    customNear: \"ms-Panel--customLeft\"\n};\nvar panelWidth = {\n    full: \"100%\",\n    auto: \"auto\",\n    xs: 272,\n    sm: 340,\n    md1: 592,\n    md2: 644,\n    lg: 940\n};\nvar panelMargin = {\n    auto: \"auto\",\n    none: 0,\n    md: 48,\n    lg: 428,\n    xl: 176\n};\n// Following consts are used below in `getPanelBreakpoints()` function to provide\n// necessary fallbacks for different types of Panel in different breakpoints.\nvar smallPanelSelectors = (_a = {}, _a[\"@media (min-width: \" + (0, _styling.ScreenWidthMinMedium) + \"px)\"] = {\n    width: panelWidth.sm\n}, _a);\nvar mediumPanelSelectors = (_b = {}, _b[\"@media (min-width: \" + (0, _styling.ScreenWidthMinLarge) + \"px)\"] = {\n    width: panelWidth.md1\n}, _b[\"@media (min-width: \" + (0, _styling.ScreenWidthMinXLarge) + \"px)\"] = {\n    width: panelWidth.md2\n}, _b);\nvar largePanelSelectors = (_c = {}, _c[\"@media (min-width: \" + (0, _styling.ScreenWidthMinUhfMobile) + \"px)\"] = {\n    left: panelMargin.md,\n    width: panelWidth.auto\n}, _c[\"@media (min-width: \" + (0, _styling.ScreenWidthMinXXLarge) + \"px)\"] = {\n    left: panelMargin.lg\n}, _c);\nvar largeFixedPanelSelectors = (_d = {}, _d[\"@media (min-width: \" + (0, _styling.ScreenWidthMinXXLarge) + \"px)\"] = {\n    left: panelMargin.auto,\n    width: panelWidth.lg\n}, _d);\nvar extraLargePanelSelectors = (_e = {}, _e[\"@media (min-width: \" + (0, _styling.ScreenWidthMinXXLarge) + \"px)\"] = {\n    left: panelMargin.xl\n}, _e);\n// Make sure Panels have fallbacks to different breakpoints by reusing same selectors.\n// This is done in the effort to follow design redlines.\nvar getPanelBreakpoints = function(type) {\n    var selectors;\n    // Panel types `smallFluid`, `smallFixedNear`, `custom` and `customNear`\n    // are not checked in here because they render the same in all the breakpoints\n    // and have the checks done separately in the `getStyles` function below.\n    switch(type){\n        case (0, _panelTypes.PanelType).smallFixedFar:\n            selectors = (0, _tslib.__assign)({}, smallPanelSelectors);\n            break;\n        case (0, _panelTypes.PanelType).medium:\n            selectors = (0, _tslib.__assign)((0, _tslib.__assign)({}, smallPanelSelectors), mediumPanelSelectors);\n            break;\n        case (0, _panelTypes.PanelType).large:\n            selectors = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors);\n            break;\n        case (0, _panelTypes.PanelType).largeFixed:\n            selectors = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors), largeFixedPanelSelectors);\n            break;\n        case (0, _panelTypes.PanelType).extraLarge:\n            selectors = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors), extraLargePanelSelectors);\n            break;\n        default:\n            break;\n    }\n    return selectors;\n};\nvar commandBarHeight = \"44px\";\nvar sharedPaddingStyles = {\n    paddingLeft: \"24px\",\n    paddingRight: \"24px\"\n};\nvar getStyles = function(props) {\n    var _a1;\n    var className = props.className, focusTrapZoneClassName = props.focusTrapZoneClassName, hasCloseButton = props.hasCloseButton, headerClassName = props.headerClassName, isAnimating = props.isAnimating, isFooterSticky = props.isFooterSticky, isFooterAtBottom = props.isFooterAtBottom, isOnRightSide = props.isOnRightSide, isOpen = props.isOpen, isHiddenOnDismiss = props.isHiddenOnDismiss, hasCustomNavigation = props.hasCustomNavigation, theme = props.theme, _b1 = props.type, type = _b1 === void 0 ? (0, _panelTypes.PanelType).smallFixedFar : _b1;\n    var effects = theme.effects, fonts = theme.fonts, semanticColors = theme.semanticColors;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    var isCustomPanel = type === (0, _panelTypes.PanelType).custom || type === (0, _panelTypes.PanelType).customNear;\n    return {\n        root: [\n            classNames.root,\n            theme.fonts.medium,\n            isOpen && classNames.isOpen,\n            hasCloseButton && classNames.hasCloseButton,\n            {\n                pointerEvents: \"none\",\n                position: \"absolute\",\n                top: 0,\n                left: 0,\n                right: 0,\n                bottom: 0\n            },\n            isCustomPanel && isOnRightSide && classNames.custom,\n            isCustomPanel && !isOnRightSide && classNames.customNear,\n            className, \n        ],\n        overlay: [\n            {\n                pointerEvents: \"auto\",\n                cursor: \"pointer\"\n            },\n            isOpen && isAnimating && (0, _styling.AnimationClassNames).fadeIn100,\n            !isOpen && isAnimating && (0, _styling.AnimationClassNames).fadeOut100, \n        ],\n        hiddenPanel: [\n            !isOpen && !isAnimating && isHiddenOnDismiss && {\n                visibility: \"hidden\"\n            }, \n        ],\n        main: [\n            classNames.main,\n            {\n                backgroundColor: semanticColors.bodyBackground,\n                boxShadow: effects.elevation64,\n                pointerEvents: \"auto\",\n                position: \"absolute\",\n                display: \"flex\",\n                flexDirection: \"column\",\n                overflowX: \"hidden\",\n                overflowY: \"auto\",\n                WebkitOverflowScrolling: \"touch\",\n                bottom: 0,\n                top: 0,\n                // left, right, width are overridden depending on the type of the Panel and the screen breakpoint.\n                left: panelMargin.auto,\n                right: panelMargin.none,\n                width: panelWidth.full,\n                selectors: (0, _tslib.__assign)((_a1 = {}, _a1[0, _styling.HighContrastSelector] = {\n                    borderLeft: \"3px solid \" + semanticColors.variantBorder,\n                    borderRight: \"3px solid \" + semanticColors.variantBorder\n                }, _a1), getPanelBreakpoints(type))\n            },\n            type === (0, _panelTypes.PanelType).smallFluid && {\n                left: panelMargin.none\n            },\n            type === (0, _panelTypes.PanelType).smallFixedNear && {\n                left: panelMargin.none,\n                right: panelMargin.auto,\n                width: panelWidth.xs\n            },\n            type === (0, _panelTypes.PanelType).customNear && {\n                right: \"auto\",\n                left: 0\n            },\n            isCustomPanel && {\n                maxWidth: \"100vw\"\n            },\n            isOpen && isAnimating && !isOnRightSide && (0, _styling.AnimationClassNames).slideRightIn40,\n            isOpen && isAnimating && isOnRightSide && (0, _styling.AnimationClassNames).slideLeftIn40,\n            !isOpen && isAnimating && !isOnRightSide && (0, _styling.AnimationClassNames).slideLeftOut40,\n            !isOpen && isAnimating && isOnRightSide && (0, _styling.AnimationClassNames).slideRightOut40,\n            focusTrapZoneClassName, \n        ],\n        commands: [\n            classNames.commands,\n            {\n                marginTop: 18\n            },\n            hasCustomNavigation && {\n                marginTop: \"inherit\"\n            }, \n        ],\n        navigation: [\n            classNames.navigation,\n            {\n                display: \"flex\",\n                justifyContent: \"flex-end\"\n            },\n            hasCustomNavigation && {\n                height: commandBarHeight\n            }, \n        ],\n        contentInner: [\n            classNames.contentInner,\n            {\n                display: \"flex\",\n                flexDirection: \"column\",\n                flexGrow: 1,\n                overflowY: \"hidden\"\n            }, \n        ],\n        header: [\n            classNames.header,\n            sharedPaddingStyles,\n            {\n                alignSelf: \"flex-start\"\n            },\n            hasCloseButton && !hasCustomNavigation && {\n                flexGrow: 1\n            },\n            hasCustomNavigation && {\n                // Ensure that title doesn't shrink if screen is too small\n                flexShrink: 0\n            }, \n        ],\n        headerText: [\n            classNames.headerText,\n            fonts.xLarge,\n            {\n                color: semanticColors.bodyText,\n                lineHeight: \"27px\",\n                overflowWrap: \"break-word\",\n                wordWrap: \"break-word\",\n                wordBreak: \"break-word\",\n                hyphens: \"auto\"\n            },\n            headerClassName, \n        ],\n        scrollableContent: [\n            classNames.scrollableContent,\n            {\n                overflowY: \"auto\"\n            },\n            isFooterAtBottom && {\n                flexGrow: 1\n            }, \n        ],\n        content: [\n            classNames.content,\n            sharedPaddingStyles,\n            {\n                paddingBottom: 20\n            }, \n        ],\n        footer: [\n            classNames.footer,\n            {\n                // Ensure that footer doesn't shrink if screen is too small\n                flexShrink: 0,\n                borderTop: \"1px solid transparent\",\n                transition: \"opacity \" + (0, _styling.AnimationVariables).durationValue3 + \" \" + (0, _styling.AnimationVariables).easeFunction2\n            },\n            isFooterSticky && {\n                background: semanticColors.bodyBackground,\n                borderTopColor: semanticColors.variantBorder\n            }, \n        ],\n        footerInner: [\n            classNames.footerInner,\n            sharedPaddingStyles,\n            {\n                paddingBottom: 16,\n                paddingTop: 16\n            }, \n        ],\n        subComponentStyles: {\n            closeButton: {\n                root: [\n                    classNames.closeButton,\n                    {\n                        marginRight: 14,\n                        color: theme.palette.neutralSecondary,\n                        fontSize: (0, _styling.IconFontSizes).large\n                    },\n                    hasCustomNavigation && {\n                        marginRight: 0,\n                        height: \"auto\",\n                        width: \"44px\"\n                    }, \n                ],\n                rootHovered: {\n                    color: theme.palette.neutralPrimary\n                }\n            }\n        }\n    };\n};\n\n},{\"tslib\":\"01Tx1\",\"./Panel.types\":\"8RsYQ\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bcYI1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _utilities = require(\"../../Utilities\");\nvar _positioning = require(\"../../utilities/positioning\");\nvar _styling = require(\"../../Styling\");\nvar _a, _b, _c;\nvar GlobalClassNames = {\n    root: \"ms-Dropdown-container\",\n    label: \"ms-Dropdown-label\",\n    dropdown: \"ms-Dropdown\",\n    title: \"ms-Dropdown-title\",\n    caretDownWrapper: \"ms-Dropdown-caretDownWrapper\",\n    caretDown: \"ms-Dropdown-caretDown\",\n    callout: \"ms-Dropdown-callout\",\n    panel: \"ms-Dropdown-panel\",\n    dropdownItems: \"ms-Dropdown-items\",\n    dropdownItem: \"ms-Dropdown-item\",\n    dropdownDivider: \"ms-Dropdown-divider\",\n    dropdownOptionText: \"ms-Dropdown-optionText\",\n    dropdownItemHeader: \"ms-Dropdown-header\",\n    titleIsPlaceHolder: \"ms-Dropdown-titleIsPlaceHolder\",\n    titleHasError: \"ms-Dropdown-title--hasError\"\n};\nvar DROPDOWN_HEIGHT = 32;\nvar DROPDOWN_ITEM_HEIGHT = 36;\nvar highContrastAdjustMixin = (_a = {}, _a[(0, _styling.HighContrastSelector) + \", \" + (0, _styling.HighContrastSelectorWhite).replace(\"@media \", \"\")] = (0, _tslib.__assign)({}, (0, _styling.getHighContrastNoAdjustStyle)()), _a);\nvar highContrastItemAndTitleStateMixin = {\n    selectors: (0, _tslib.__assign)((_b = {}, _b[0, _styling.HighContrastSelector] = {\n        backgroundColor: \"Highlight\",\n        borderColor: \"Highlight\",\n        color: \"HighlightText\"\n    }, _b), highContrastAdjustMixin)\n};\nvar highContrastBorderState = {\n    selectors: (_c = {}, _c[0, _styling.HighContrastSelector] = {\n        borderColor: \"Highlight\"\n    }, _c)\n};\nvar MinimumScreenSelector = (0, _styling.getScreenSelector)(0, (0, _styling.ScreenWidthMinMedium));\nvar getStyles = function(props) {\n    var _a1, _b1, _c1, _d, _e, _f, _g, _h, _j, _k, _l;\n    var theme = props.theme, hasError = props.hasError, hasLabel = props.hasLabel, className = props.className, isOpen = props.isOpen, disabled = props.disabled, required = props.required, isRenderingPlaceholder = props.isRenderingPlaceholder, panelClassName = props.panelClassName, calloutClassName = props.calloutClassName, calloutRenderEdge = props.calloutRenderEdge;\n    if (!theme) throw new Error(\"theme is undefined or null in base Dropdown getStyles function.\");\n    var globalClassnames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    var palette = theme.palette, semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var rootHoverFocusActiveSelectorNeutralDarkMixin = {\n        color: semanticColors.menuItemTextHovered\n    };\n    var rootHoverFocusActiveSelectorNeutralPrimaryMixin = {\n        color: semanticColors.menuItemText\n    };\n    var borderColorError = {\n        borderColor: semanticColors.errorText\n    };\n    var dropdownItemStyle = [\n        globalClassnames.dropdownItem,\n        {\n            backgroundColor: \"transparent\",\n            boxSizing: \"border-box\",\n            cursor: \"pointer\",\n            display: \"flex\",\n            alignItems: \"center\",\n            padding: \"0 8px\",\n            width: \"100%\",\n            minHeight: DROPDOWN_ITEM_HEIGHT,\n            lineHeight: 20,\n            height: 0,\n            position: \"relative\",\n            border: \"1px solid transparent\",\n            borderRadius: 0,\n            wordWrap: \"break-word\",\n            overflowWrap: \"break-word\",\n            textAlign: \"left\",\n            \".ms-Button-flexContainer\": {\n                width: \"100%\"\n            }\n        }, \n    ];\n    var selectedItemBackgroundColor = semanticColors.menuItemBackgroundPressed;\n    var itemSelectors = function(isSelected) {\n        var _a2;\n        if (isSelected === void 0) isSelected = false;\n        return {\n            selectors: (_a2 = {\n                \"&:hover:focus\": [\n                    {\n                        color: semanticColors.menuItemTextHovered,\n                        backgroundColor: !isSelected ? semanticColors.menuItemBackgroundHovered : selectedItemBackgroundColor\n                    },\n                    highContrastItemAndTitleStateMixin, \n                ],\n                \"&:focus\": [\n                    {\n                        backgroundColor: !isSelected ? \"transparent\" : selectedItemBackgroundColor\n                    },\n                    highContrastItemAndTitleStateMixin, \n                ],\n                \"&:active\": [\n                    {\n                        color: semanticColors.menuItemTextHovered,\n                        backgroundColor: !isSelected ? semanticColors.menuBackground : semanticColors.menuItemBackgroundHovered\n                    },\n                    highContrastItemAndTitleStateMixin, \n                ]\n            }, _a2[\".\" + (0, _utilities.IsFocusVisibleClassName) + \" &:focus:after\"] = {\n                left: 0,\n                top: 0,\n                bottom: 0,\n                right: 0\n            }, _a2[0, _styling.HighContrastSelector] = {\n                border: \"none\"\n            }, _a2)\n        };\n    };\n    var dropdownItemSelected = (0, _tslib.__spreadArrays)(dropdownItemStyle, [\n        {\n            backgroundColor: selectedItemBackgroundColor,\n            color: semanticColors.menuItemTextHovered\n        },\n        itemSelectors(true),\n        highContrastItemAndTitleStateMixin, \n    ]);\n    var dropdownItemDisabled = (0, _tslib.__spreadArrays)(dropdownItemStyle, [\n        {\n            color: semanticColors.disabledText,\n            cursor: \"default\",\n            selectors: (_a1 = {}, _a1[0, _styling.HighContrastSelector] = {\n                color: \"GrayText\",\n                border: \"none\"\n            }, _a1)\n        }, \n    ]);\n    var titleOpenBorderRadius = calloutRenderEdge === (0, _positioning.RectangleEdge).bottom ? effects.roundedCorner2 + \" \" + effects.roundedCorner2 + \" 0 0\" : \"0 0 \" + effects.roundedCorner2 + \" \" + effects.roundedCorner2;\n    var calloutOpenBorderRadius = calloutRenderEdge === (0, _positioning.RectangleEdge).bottom ? \"0 0 \" + effects.roundedCorner2 + \" \" + effects.roundedCorner2 : effects.roundedCorner2 + \" \" + effects.roundedCorner2 + \" 0 0\";\n    return {\n        root: [\n            globalClassnames.root,\n            className\n        ],\n        label: globalClassnames.label,\n        dropdown: [\n            globalClassnames.dropdown,\n            (0, _styling.normalize),\n            fonts.medium,\n            {\n                color: semanticColors.menuItemText,\n                borderColor: semanticColors.focusBorder,\n                position: \"relative\",\n                outline: 0,\n                userSelect: \"none\",\n                selectors: (_b1 = {}, _b1[\"&:hover .\" + globalClassnames.title] = [\n                    !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n                    {\n                        borderColor: isOpen ? palette.neutralSecondary : palette.neutralPrimary\n                    },\n                    highContrastBorderState, \n                ], _b1[\"&:focus .\" + globalClassnames.title] = [\n                    !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n                    {\n                        selectors: (_c1 = {}, _c1[0, _styling.HighContrastSelector] = {\n                            color: \"Highlight\"\n                        }, _c1)\n                    }, \n                ], _b1[\"&:focus:after\"] = [\n                    {\n                        pointerEvents: \"none\",\n                        content: \"''\",\n                        position: \"absolute\",\n                        boxSizing: \"border-box\",\n                        top: \"0px\",\n                        left: \"0px\",\n                        width: \"100%\",\n                        height: \"100%\",\n                        // see https://github.com/microsoft/fluentui/pull/9182 for semantic color disc\n                        border: !disabled ? \"2px solid \" + palette.themePrimary : \"none\",\n                        borderRadius: \"2px\",\n                        selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = {\n                            color: \"Highlight\"\n                        }, _d)\n                    }, \n                ], _b1[\"&:active .\" + globalClassnames.title] = [\n                    !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n                    {\n                        borderColor: palette.themePrimary\n                    },\n                    highContrastBorderState, \n                ], _b1[\"&:hover .\" + globalClassnames.caretDown] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _b1[\"&:focus .\" + globalClassnames.caretDown] = [\n                    !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin,\n                    {\n                        selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = {\n                            color: \"Highlight\"\n                        }, _e)\n                    }, \n                ], _b1[\"&:active .\" + globalClassnames.caretDown] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _b1[\"&:hover .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _b1[\"&:focus .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _b1[\"&:active .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _b1[\"&:hover .\" + globalClassnames.titleHasError] = borderColorError, _b1[\"&:active .\" + globalClassnames.titleHasError] = borderColorError, _b1)\n            },\n            isOpen && \"is-open\",\n            disabled && \"is-disabled\",\n            required && \"is-required\",\n            required && !hasLabel && {\n                selectors: (_f = {\n                    \":before\": {\n                        content: \"'*'\",\n                        color: semanticColors.errorText,\n                        position: \"absolute\",\n                        top: -5,\n                        right: -10\n                    }\n                }, _f[0, _styling.HighContrastSelector] = {\n                    selectors: {\n                        \":after\": {\n                            right: -14\n                        }\n                    }\n                }, _f)\n            }, \n        ],\n        title: [\n            globalClassnames.title,\n            (0, _styling.normalize),\n            {\n                backgroundColor: semanticColors.inputBackground,\n                borderWidth: 1,\n                borderStyle: \"solid\",\n                borderColor: semanticColors.inputBorder,\n                borderRadius: isOpen ? titleOpenBorderRadius : effects.roundedCorner2,\n                cursor: \"pointer\",\n                display: \"block\",\n                height: DROPDOWN_HEIGHT,\n                lineHeight: DROPDOWN_HEIGHT - 2,\n                padding: \"0 28px 0 8px\",\n                position: \"relative\",\n                overflow: \"hidden\",\n                whiteSpace: \"nowrap\",\n                textOverflow: \"ellipsis\"\n            },\n            isRenderingPlaceholder && [\n                globalClassnames.titleIsPlaceHolder,\n                {\n                    color: semanticColors.inputPlaceholderText\n                }\n            ],\n            hasError && [\n                globalClassnames.titleHasError,\n                borderColorError\n            ],\n            disabled && {\n                backgroundColor: semanticColors.disabledBackground,\n                border: \"none\",\n                color: semanticColors.disabledText,\n                cursor: \"default\",\n                selectors: (_g = {}, _g[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                    border: \"1px solid GrayText\",\n                    color: \"GrayText\",\n                    backgroundColor: \"Window\"\n                }, (0, _styling.getHighContrastNoAdjustStyle)()), _g)\n            }, \n        ],\n        caretDownWrapper: [\n            globalClassnames.caretDownWrapper,\n            {\n                position: \"absolute\",\n                top: 1,\n                right: 8,\n                height: DROPDOWN_HEIGHT,\n                lineHeight: DROPDOWN_HEIGHT - 2\n            },\n            !disabled && {\n                cursor: \"pointer\"\n            }, \n        ],\n        caretDown: [\n            globalClassnames.caretDown,\n            {\n                color: palette.neutralSecondary,\n                fontSize: fonts.small.fontSize,\n                pointerEvents: \"none\"\n            },\n            disabled && {\n                color: semanticColors.disabledText,\n                selectors: (_h = {}, _h[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                    color: \"GrayText\"\n                }, (0, _styling.getHighContrastNoAdjustStyle)()), _h)\n            }, \n        ],\n        errorMessage: (0, _tslib.__assign)((0, _tslib.__assign)({\n            color: semanticColors.errorText\n        }, theme.fonts.small), {\n            paddingTop: 5\n        }),\n        callout: [\n            globalClassnames.callout,\n            {\n                boxShadow: effects.elevation8,\n                borderRadius: calloutOpenBorderRadius,\n                selectors: (_j = {}, _j[\".ms-Callout-main\"] = {\n                    borderRadius: calloutOpenBorderRadius\n                }, _j)\n            },\n            calloutClassName, \n        ],\n        dropdownItemsWrapper: {\n            selectors: {\n                \"&:focus\": {\n                    outline: 0\n                }\n            }\n        },\n        dropdownItems: [\n            globalClassnames.dropdownItems,\n            {\n                display: \"block\"\n            }\n        ],\n        dropdownItem: (0, _tslib.__spreadArrays)(dropdownItemStyle, [\n            itemSelectors()\n        ]),\n        dropdownItemSelected: dropdownItemSelected,\n        dropdownItemDisabled: dropdownItemDisabled,\n        dropdownItemSelectedAndDisabled: [\n            dropdownItemSelected,\n            dropdownItemDisabled,\n            {\n                backgroundColor: \"transparent\"\n            }\n        ],\n        dropdownItemHidden: (0, _tslib.__spreadArrays)(dropdownItemStyle, [\n            {\n                display: \"none\"\n            }\n        ]),\n        dropdownDivider: [\n            globalClassnames.dropdownDivider,\n            {\n                height: 1,\n                backgroundColor: semanticColors.bodyDivider\n            }\n        ],\n        dropdownOptionText: [\n            globalClassnames.dropdownOptionText,\n            {\n                overflow: \"hidden\",\n                whiteSpace: \"nowrap\",\n                textOverflow: \"ellipsis\",\n                minWidth: 0,\n                maxWidth: \"100%\",\n                wordWrap: \"break-word\",\n                overflowWrap: \"break-word\",\n                margin: \"1px\"\n            }, \n        ],\n        dropdownItemHeader: [\n            globalClassnames.dropdownItemHeader,\n            (0, _tslib.__assign)((0, _tslib.__assign)({}, fonts.medium), {\n                fontWeight: (0, _styling.FontWeights).semibold,\n                color: semanticColors.menuHeader,\n                background: \"none\",\n                backgroundColor: \"transparent\",\n                border: \"none\",\n                height: DROPDOWN_ITEM_HEIGHT,\n                lineHeight: DROPDOWN_ITEM_HEIGHT,\n                cursor: \"default\",\n                padding: \"0 8px\",\n                userSelect: \"none\",\n                textAlign: \"left\",\n                selectors: (_k = {}, _k[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                    color: \"GrayText\"\n                }, (0, _styling.getHighContrastNoAdjustStyle)()), _k)\n            }), \n        ],\n        subComponentStyles: {\n            label: {\n                root: {\n                    display: \"inline-block\"\n                }\n            },\n            multiSelectItem: {\n                root: {\n                    padding: 0\n                },\n                label: {\n                    alignSelf: \"stretch\",\n                    padding: \"0 8px\",\n                    width: \"100%\"\n                }\n            },\n            panel: {\n                root: [\n                    panelClassName\n                ],\n                main: {\n                    selectors: (_l = {}, // In case of extra small screen sizes\n                    _l[MinimumScreenSelector] = {\n                        // panelWidth xs\n                        width: 272\n                    }, _l)\n                },\n                contentInner: {\n                    padding: \"0 0 20px\"\n                }\n            }\n        }\n    };\n};\n\n},{\"tslib\":\"01Tx1\",\"../../Utilities\":\"2F07a\",\"../../utilities/positioning\":\"01joZ\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fmg3v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _styling = require(\"office-ui-fabric-react/lib/Styling\");\nparcelHelpers.exportAll(_styling, exports);\n\n},{\"office-ui-fabric-react/lib/Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8rJ2a\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _icon = require(\"office-ui-fabric-react/lib/Icon\");\nparcelHelpers.exportAll(_icon, exports);\n\n},{\"office-ui-fabric-react/lib/Icon\":\"2Ha7p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l6hLT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _icons = require(\"office-ui-fabric-react/lib/Icons\");\nparcelHelpers.exportAll(_icons, exports);\n\n},{\"office-ui-fabric-react/lib/Icons\":\"hGyHg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hGyHg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _icons = require(\"@uifabric/icons\");\nparcelHelpers.exportAll(_icons, exports);\n\n},{\"@uifabric/icons\":\"5mu9e\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5mu9e\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\nvar _fabricIcons = require(\"./fabric-icons\");\nvar _fabricIcons0 = require(\"./fabric-icons-0\");\nvar _fabricIcons1 = require(\"./fabric-icons-1\");\nvar _fabricIcons2 = require(\"./fabric-icons-2\");\nvar _fabricIcons3 = require(\"./fabric-icons-3\");\nvar _fabricIcons4 = require(\"./fabric-icons-4\");\nvar _fabricIcons5 = require(\"./fabric-icons-5\");\nvar _fabricIcons6 = require(\"./fabric-icons-6\");\nvar _fabricIcons7 = require(\"./fabric-icons-7\");\nvar _fabricIcons8 = require(\"./fabric-icons-8\");\nvar _fabricIcons9 = require(\"./fabric-icons-9\");\nvar _fabricIcons10 = require(\"./fabric-icons-10\");\nvar _fabricIcons11 = require(\"./fabric-icons-11\");\nvar _fabricIcons12 = require(\"./fabric-icons-12\");\nvar _fabricIcons13 = require(\"./fabric-icons-13\");\nvar _fabricIcons14 = require(\"./fabric-icons-14\");\nvar _fabricIcons15 = require(\"./fabric-icons-15\");\nvar _fabricIcons16 = require(\"./fabric-icons-16\");\nvar _fabricIcons17 = require(\"./fabric-icons-17\");\nvar _iconAliases = require(\"./iconAliases\");\nvar _utilities = require(\"@uifabric/utilities\");\nvar _version = require(\"./version\");\nvar DEFAULT_BASE_URL = \"https://spoppe-b.azureedge.net/files/fabric-cdn-prod_20210407.001/assets/icons/\";\nvar win = (0, _utilities.getWindow)();\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = ((_b = (_a = win) === null || _a === void 0 ? void 0 : _a.FabricConfig) === null || _b === void 0 ? void 0 : _b.iconBaseUrl) || ((_d = (_c = win) === null || _c === void 0 ? void 0 : _c.FabricConfig) === null || _d === void 0 ? void 0 : _d.fontBaseUrl) || DEFAULT_BASE_URL;\n    var _a, _b, _c, _d;\n    [\n        (0, _fabricIcons.initializeIcons),\n        (0, _fabricIcons0.initializeIcons),\n        (0, _fabricIcons1.initializeIcons),\n        (0, _fabricIcons2.initializeIcons),\n        (0, _fabricIcons3.initializeIcons),\n        (0, _fabricIcons4.initializeIcons),\n        (0, _fabricIcons5.initializeIcons),\n        (0, _fabricIcons6.initializeIcons),\n        (0, _fabricIcons7.initializeIcons),\n        (0, _fabricIcons8.initializeIcons),\n        (0, _fabricIcons9.initializeIcons),\n        (0, _fabricIcons10.initializeIcons),\n        (0, _fabricIcons11.initializeIcons),\n        (0, _fabricIcons12.initializeIcons),\n        (0, _fabricIcons13.initializeIcons),\n        (0, _fabricIcons14.initializeIcons),\n        (0, _fabricIcons15.initializeIcons),\n        (0, _fabricIcons16.initializeIcons),\n        (0, _fabricIcons17.initializeIcons), \n    ].forEach(function(initialize) {\n        return initialize(baseUrl, options);\n    });\n    (0, _iconAliases.registerIconAliases)();\n}\n\n},{\"./fabric-icons\":\"lYrVW\",\"./fabric-icons-0\":\"8uxzO\",\"./fabric-icons-1\":\"gLoIT\",\"./fabric-icons-2\":\"iJ5Bm\",\"./fabric-icons-3\":\"020v4\",\"./fabric-icons-4\":\"hkPkR\",\"./fabric-icons-5\":\"edhGK\",\"./fabric-icons-6\":\"aigEl\",\"./fabric-icons-7\":\"8Xys9\",\"./fabric-icons-8\":\"5gVRf\",\"./fabric-icons-9\":\"jMVqc\",\"./fabric-icons-10\":\"lVXau\",\"./fabric-icons-11\":\"9IjrA\",\"./fabric-icons-12\":\"gjo0s\",\"./fabric-icons-13\":\"d80Q4\",\"./fabric-icons-14\":\"boBmt\",\"./fabric-icons-15\":\"1gMob\",\"./fabric-icons-16\":\"jQGeT\",\"./fabric-icons-17\":\"jELYV\",\"./iconAliases\":\"2V6Z1\",\"@uifabric/utilities\":\"uTCgd\",\"./version\":\"gDGqZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lYrVW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-a13498cf.woff') format('woff')\"\n        },\n        icons: {\n            GlobalNavButton: \"\\uE700\",\n            ChevronDown: \"\\uE70D\",\n            ChevronUp: \"\\uE70E\",\n            Edit: \"\\uE70F\",\n            Add: \"\\uE710\",\n            Cancel: \"\\uE711\",\n            More: \"\\uE712\",\n            Settings: \"\\uE713\",\n            Mail: \"\\uE715\",\n            Filter: \"\\uE71C\",\n            Search: \"\\uE721\",\n            Share: \"\\uE72D\",\n            BlockedSite: \"\\uE72F\",\n            FavoriteStar: \"\\uE734\",\n            FavoriteStarFill: \"\\uE735\",\n            CheckMark: \"\\uE73E\",\n            Delete: \"\\uE74D\",\n            ChevronLeft: \"\\uE76B\",\n            ChevronRight: \"\\uE76C\",\n            Calendar: \"\\uE787\",\n            Megaphone: \"\\uE789\",\n            Undo: \"\\uE7A7\",\n            Flag: \"\\uE7C1\",\n            Page: \"\\uE7C3\",\n            Pinned: \"\\uE840\",\n            View: \"\\uE890\",\n            Clear: \"\\uE894\",\n            Download: \"\\uE896\",\n            Upload: \"\\uE898\",\n            Folder: \"\\uE8B7\",\n            Sort: \"\\uE8CB\",\n            AlignRight: \"\\uE8E2\",\n            AlignLeft: \"\\uE8E4\",\n            Tag: \"\\uE8EC\",\n            AddFriend: \"\\uE8FA\",\n            Info: \"\\uE946\",\n            SortLines: \"\\uE9D0\",\n            List: \"\\uEA37\",\n            CircleRing: \"\\uEA3A\",\n            Heart: \"\\uEB51\",\n            HeartFill: \"\\uEB52\",\n            Tiles: \"\\uECA5\",\n            Embed: \"\\uECCE\",\n            Glimmer: \"\\uECF4\",\n            Ascending: \"\\uEDC0\",\n            Descending: \"\\uEDC1\",\n            SortUp: \"\\uEE68\",\n            SortDown: \"\\uEE69\",\n            SyncToPC: \"\\uEE6E\",\n            LargeGrid: \"\\uEECB\",\n            SkypeCheck: \"\\uEF80\",\n            SkypeClock: \"\\uEF81\",\n            SkypeMinus: \"\\uEF82\",\n            ClearFilter: \"\\uEF8F\",\n            Flow: \"\\uEF90\",\n            StatusCircleCheckmark: \"\\uF13E\",\n            MoreVertical: \"\\uF2BC\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8uxzO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-0\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-0-467ee27f.woff') format('woff')\"\n        },\n        icons: {\n            \"PageLink\": \"\\uE302\",\n            \"CommentSolid\": \"\\uE30E\",\n            \"ChangeEntitlements\": \"\\uE310\",\n            \"Installation\": \"\\uE311\",\n            \"WebAppBuilderModule\": \"\\uE313\",\n            \"WebAppBuilderFragment\": \"\\uE314\",\n            \"WebAppBuilderSlot\": \"\\uE315\",\n            \"BullseyeTargetEdit\": \"\\uE319\",\n            \"WebAppBuilderFragmentCreate\": \"\\uE31B\",\n            \"PageData\": \"\\uE31C\",\n            \"PageHeaderEdit\": \"\\uE31D\",\n            \"ProductList\": \"\\uE31E\",\n            \"UnpublishContent\": \"\\uE31F\",\n            \"DependencyAdd\": \"\\uE344\",\n            \"DependencyRemove\": \"\\uE345\",\n            \"EntitlementPolicy\": \"\\uE346\",\n            \"EntitlementRedemption\": \"\\uE347\",\n            \"SchoolDataSyncLogo\": \"\\uE34C\",\n            \"PinSolid12\": \"\\uE352\",\n            \"PinSolidOff12\": \"\\uE353\",\n            \"AddLink\": \"\\uE35E\",\n            \"SharepointAppIcon16\": \"\\uE365\",\n            \"DataflowsLink\": \"\\uE366\",\n            \"TimePicker\": \"\\uE367\",\n            \"UserWarning\": \"\\uE368\",\n            \"ComplianceAudit\": \"\\uE369\",\n            \"InternetSharing\": \"\\uE704\",\n            \"Brightness\": \"\\uE706\",\n            \"MapPin\": \"\\uE707\",\n            \"Airplane\": \"\\uE709\",\n            \"Tablet\": \"\\uE70A\",\n            \"QuickNote\": \"\\uE70B\",\n            \"Video\": \"\\uE714\",\n            \"People\": \"\\uE716\",\n            \"Phone\": \"\\uE717\",\n            \"Pin\": \"\\uE718\",\n            \"Shop\": \"\\uE719\",\n            \"Stop\": \"\\uE71A\",\n            \"Link\": \"\\uE71B\",\n            \"AllApps\": \"\\uE71D\",\n            \"Zoom\": \"\\uE71E\",\n            \"ZoomOut\": \"\\uE71F\",\n            \"Microphone\": \"\\uE720\",\n            \"Camera\": \"\\uE722\",\n            \"Attach\": \"\\uE723\",\n            \"Send\": \"\\uE724\",\n            \"FavoriteList\": \"\\uE728\",\n            \"PageSolid\": \"\\uE729\",\n            \"Forward\": \"\\uE72A\",\n            \"Back\": \"\\uE72B\",\n            \"Refresh\": \"\\uE72C\",\n            \"Lock\": \"\\uE72E\",\n            \"ReportHacked\": \"\\uE730\",\n            \"EMI\": \"\\uE731\",\n            \"MiniLink\": \"\\uE732\",\n            \"Blocked\": \"\\uE733\",\n            \"ReadingMode\": \"\\uE736\",\n            \"Favicon\": \"\\uE737\",\n            \"Remove\": \"\\uE738\",\n            \"Checkbox\": \"\\uE739\",\n            \"CheckboxComposite\": \"\\uE73A\",\n            \"CheckboxFill\": \"\\uE73B\",\n            \"CheckboxIndeterminate\": \"\\uE73C\",\n            \"CheckboxCompositeReversed\": \"\\uE73D\",\n            \"BackToWindow\": \"\\uE73F\",\n            \"FullScreen\": \"\\uE740\",\n            \"Print\": \"\\uE749\",\n            \"Up\": \"\\uE74A\",\n            \"Down\": \"\\uE74B\",\n            \"OEM\": \"\\uE74C\",\n            \"Save\": \"\\uE74E\",\n            \"ReturnKey\": \"\\uE751\",\n            \"Cloud\": \"\\uE753\",\n            \"Flashlight\": \"\\uE754\",\n            \"CommandPrompt\": \"\\uE756\",\n            \"Sad\": \"\\uE757\",\n            \"RealEstate\": \"\\uE758\",\n            \"SIPMove\": \"\\uE759\",\n            \"EraseTool\": \"\\uE75C\",\n            \"GripperTool\": \"\\uE75E\",\n            \"Dialpad\": \"\\uE75F\",\n            \"PageLeft\": \"\\uE760\",\n            \"PageRight\": \"\\uE761\",\n            \"MultiSelect\": \"\\uE762\",\n            \"KeyboardClassic\": \"\\uE765\",\n            \"Play\": \"\\uE768\",\n            \"Pause\": \"\\uE769\",\n            \"InkingTool\": \"\\uE76D\",\n            \"Emoji2\": \"\\uE76E\",\n            \"GripperBarHorizontal\": \"\\uE76F\",\n            \"System\": \"\\uE770\",\n            \"Personalize\": \"\\uE771\",\n            \"SearchAndApps\": \"\\uE773\",\n            \"Globe\": \"\\uE774\",\n            \"EaseOfAccess\": \"\\uE776\",\n            \"ContactInfo\": \"\\uE779\",\n            \"Unpin\": \"\\uE77A\",\n            \"Contact\": \"\\uE77B\",\n            \"Memo\": \"\\uE77C\",\n            \"IncomingCall\": \"\\uE77E\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gLoIT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-1\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-1-4d521695.woff') format('woff')\"\n        },\n        icons: {\n            \"Paste\": \"\\uE77F\",\n            \"WindowsLogo\": \"\\uE782\",\n            \"Error\": \"\\uE783\",\n            \"GripperBarVertical\": \"\\uE784\",\n            \"Unlock\": \"\\uE785\",\n            \"Slideshow\": \"\\uE786\",\n            \"Trim\": \"\\uE78A\",\n            \"AutoEnhanceOn\": \"\\uE78D\",\n            \"AutoEnhanceOff\": \"\\uE78E\",\n            \"Color\": \"\\uE790\",\n            \"SaveAs\": \"\\uE792\",\n            \"Light\": \"\\uE793\",\n            \"Filters\": \"\\uE795\",\n            \"AspectRatio\": \"\\uE799\",\n            \"Contrast\": \"\\uE7A1\",\n            \"Redo\": \"\\uE7A6\",\n            \"Crop\": \"\\uE7A8\",\n            \"PhotoCollection\": \"\\uE7AA\",\n            \"Album\": \"\\uE7AB\",\n            \"Rotate\": \"\\uE7AD\",\n            \"PanoIndicator\": \"\\uE7B0\",\n            \"Translate\": \"\\uE7B2\",\n            \"RedEye\": \"\\uE7B3\",\n            \"ViewOriginal\": \"\\uE7B4\",\n            \"ThumbnailView\": \"\\uE7B6\",\n            \"Package\": \"\\uE7B8\",\n            \"Telemarketer\": \"\\uE7B9\",\n            \"Warning\": \"\\uE7BA\",\n            \"Financial\": \"\\uE7BB\",\n            \"Education\": \"\\uE7BE\",\n            \"ShoppingCart\": \"\\uE7BF\",\n            \"Train\": \"\\uE7C0\",\n            \"Move\": \"\\uE7C2\",\n            \"TouchPointer\": \"\\uE7C9\",\n            \"Merge\": \"\\uE7D5\",\n            \"TurnRight\": \"\\uE7DB\",\n            \"Ferry\": \"\\uE7E3\",\n            \"Highlight\": \"\\uE7E6\",\n            \"PowerButton\": \"\\uE7E8\",\n            \"Tab\": \"\\uE7E9\",\n            \"Admin\": \"\\uE7EF\",\n            \"TVMonitor\": \"\\uE7F4\",\n            \"Speakers\": \"\\uE7F5\",\n            \"Game\": \"\\uE7FC\",\n            \"HorizontalTabKey\": \"\\uE7FD\",\n            \"UnstackSelected\": \"\\uE7FE\",\n            \"StackIndicator\": \"\\uE7FF\",\n            \"Nav2DMapView\": \"\\uE800\",\n            \"StreetsideSplitMinimize\": \"\\uE802\",\n            \"Car\": \"\\uE804\",\n            \"Bus\": \"\\uE806\",\n            \"EatDrink\": \"\\uE807\",\n            \"SeeDo\": \"\\uE808\",\n            \"LocationCircle\": \"\\uE80E\",\n            \"Home\": \"\\uE80F\",\n            \"SwitcherStartEnd\": \"\\uE810\",\n            \"ParkingLocation\": \"\\uE811\",\n            \"IncidentTriangle\": \"\\uE814\",\n            \"Touch\": \"\\uE815\",\n            \"MapDirections\": \"\\uE816\",\n            \"CaretHollow\": \"\\uE817\",\n            \"CaretSolid\": \"\\uE818\",\n            \"History\": \"\\uE81C\",\n            \"Location\": \"\\uE81D\",\n            \"MapLayers\": \"\\uE81E\",\n            \"SearchNearby\": \"\\uE820\",\n            \"Work\": \"\\uE821\",\n            \"Recent\": \"\\uE823\",\n            \"Hotel\": \"\\uE824\",\n            \"Bank\": \"\\uE825\",\n            \"LocationDot\": \"\\uE827\",\n            \"Dictionary\": \"\\uE82D\",\n            \"ChromeBack\": \"\\uE830\",\n            \"FolderOpen\": \"\\uE838\",\n            \"PinnedFill\": \"\\uE842\",\n            \"RevToggleKey\": \"\\uE845\",\n            \"USB\": \"\\uE88E\",\n            \"Previous\": \"\\uE892\",\n            \"Next\": \"\\uE893\",\n            \"Sync\": \"\\uE895\",\n            \"Help\": \"\\uE897\",\n            \"Emoji\": \"\\uE899\",\n            \"MailForward\": \"\\uE89C\",\n            \"ClosePane\": \"\\uE89F\",\n            \"OpenPane\": \"\\uE8A0\",\n            \"PreviewLink\": \"\\uE8A1\",\n            \"ZoomIn\": \"\\uE8A3\",\n            \"Bookmarks\": \"\\uE8A4\",\n            \"Document\": \"\\uE8A5\",\n            \"ProtectedDocument\": \"\\uE8A6\",\n            \"OpenInNewWindow\": \"\\uE8A7\",\n            \"MailFill\": \"\\uE8A8\",\n            \"ViewAll\": \"\\uE8A9\",\n            \"Switch\": \"\\uE8AB\",\n            \"Rename\": \"\\uE8AC\",\n            \"Go\": \"\\uE8AD\",\n            \"Remote\": \"\\uE8AF\",\n            \"SelectAll\": \"\\uE8B3\",\n            \"Orientation\": \"\\uE8B4\",\n            \"Import\": \"\\uE8B5\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iJ5Bm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-2\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-2-63c99abf.woff') format('woff')\"\n        },\n        icons: {\n            \"Picture\": \"\\uE8B9\",\n            \"ChromeClose\": \"\\uE8BB\",\n            \"ShowResults\": \"\\uE8BC\",\n            \"Message\": \"\\uE8BD\",\n            \"CalendarDay\": \"\\uE8BF\",\n            \"CalendarWeek\": \"\\uE8C0\",\n            \"MailReplyAll\": \"\\uE8C2\",\n            \"Read\": \"\\uE8C3\",\n            \"Cut\": \"\\uE8C6\",\n            \"PaymentCard\": \"\\uE8C7\",\n            \"Copy\": \"\\uE8C8\",\n            \"Important\": \"\\uE8C9\",\n            \"MailReply\": \"\\uE8CA\",\n            \"GotoToday\": \"\\uE8D1\",\n            \"Font\": \"\\uE8D2\",\n            \"FontColor\": \"\\uE8D3\",\n            \"FolderFill\": \"\\uE8D5\",\n            \"Permissions\": \"\\uE8D7\",\n            \"DisableUpdates\": \"\\uE8D8\",\n            \"Unfavorite\": \"\\uE8D9\",\n            \"Italic\": \"\\uE8DB\",\n            \"Underline\": \"\\uE8DC\",\n            \"Bold\": \"\\uE8DD\",\n            \"MoveToFolder\": \"\\uE8DE\",\n            \"Dislike\": \"\\uE8E0\",\n            \"Like\": \"\\uE8E1\",\n            \"AlignCenter\": \"\\uE8E3\",\n            \"OpenFile\": \"\\uE8E5\",\n            \"ClearSelection\": \"\\uE8E6\",\n            \"FontDecrease\": \"\\uE8E7\",\n            \"FontIncrease\": \"\\uE8E8\",\n            \"FontSize\": \"\\uE8E9\",\n            \"CellPhone\": \"\\uE8EA\",\n            \"RepeatOne\": \"\\uE8ED\",\n            \"RepeatAll\": \"\\uE8EE\",\n            \"Calculator\": \"\\uE8EF\",\n            \"Library\": \"\\uE8F1\",\n            \"PostUpdate\": \"\\uE8F3\",\n            \"NewFolder\": \"\\uE8F4\",\n            \"CalendarReply\": \"\\uE8F5\",\n            \"UnsyncFolder\": \"\\uE8F6\",\n            \"SyncFolder\": \"\\uE8F7\",\n            \"BlockContact\": \"\\uE8F8\",\n            \"Accept\": \"\\uE8FB\",\n            \"BulletedList\": \"\\uE8FD\",\n            \"Preview\": \"\\uE8FF\",\n            \"News\": \"\\uE900\",\n            \"Chat\": \"\\uE901\",\n            \"Group\": \"\\uE902\",\n            \"World\": \"\\uE909\",\n            \"Comment\": \"\\uE90A\",\n            \"DockLeft\": \"\\uE90C\",\n            \"DockRight\": \"\\uE90D\",\n            \"Repair\": \"\\uE90F\",\n            \"Accounts\": \"\\uE910\",\n            \"Street\": \"\\uE913\",\n            \"RadioBullet\": \"\\uE915\",\n            \"Stopwatch\": \"\\uE916\",\n            \"Clock\": \"\\uE917\",\n            \"WorldClock\": \"\\uE918\",\n            \"AlarmClock\": \"\\uE919\",\n            \"Photo\": \"\\uE91B\",\n            \"ActionCenter\": \"\\uE91C\",\n            \"Hospital\": \"\\uE91D\",\n            \"Timer\": \"\\uE91E\",\n            \"FullCircleMask\": \"\\uE91F\",\n            \"LocationFill\": \"\\uE920\",\n            \"ChromeMinimize\": \"\\uE921\",\n            \"ChromeRestore\": \"\\uE923\",\n            \"Annotation\": \"\\uE924\",\n            \"Fingerprint\": \"\\uE928\",\n            \"Handwriting\": \"\\uE929\",\n            \"ChromeFullScreen\": \"\\uE92D\",\n            \"Completed\": \"\\uE930\",\n            \"Label\": \"\\uE932\",\n            \"FlickDown\": \"\\uE935\",\n            \"FlickUp\": \"\\uE936\",\n            \"FlickLeft\": \"\\uE937\",\n            \"FlickRight\": \"\\uE938\",\n            \"MiniExpand\": \"\\uE93A\",\n            \"MiniContract\": \"\\uE93B\",\n            \"Streaming\": \"\\uE93E\",\n            \"MusicInCollection\": \"\\uE940\",\n            \"OneDriveLogo\": \"\\uE941\",\n            \"CompassNW\": \"\\uE942\",\n            \"Code\": \"\\uE943\",\n            \"LightningBolt\": \"\\uE945\",\n            \"CalculatorMultiply\": \"\\uE947\",\n            \"CalculatorAddition\": \"\\uE948\",\n            \"CalculatorSubtract\": \"\\uE949\",\n            \"CalculatorPercentage\": \"\\uE94C\",\n            \"CalculatorEqualTo\": \"\\uE94E\",\n            \"PrintfaxPrinterFile\": \"\\uE956\",\n            \"StorageOptical\": \"\\uE958\",\n            \"Communications\": \"\\uE95A\",\n            \"Headset\": \"\\uE95B\",\n            \"Health\": \"\\uE95E\",\n            \"Webcam2\": \"\\uE960\",\n            \"FrontCamera\": \"\\uE96B\",\n            \"ChevronUpSmall\": \"\\uE96D\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"020v4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-3\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-3-089e217a.woff') format('woff')\"\n        },\n        icons: {\n            \"ChevronDownSmall\": \"\\uE96E\",\n            \"ChevronLeftSmall\": \"\\uE96F\",\n            \"ChevronRightSmall\": \"\\uE970\",\n            \"ChevronUpMed\": \"\\uE971\",\n            \"ChevronDownMed\": \"\\uE972\",\n            \"ChevronLeftMed\": \"\\uE973\",\n            \"ChevronRightMed\": \"\\uE974\",\n            \"Devices2\": \"\\uE975\",\n            \"PC1\": \"\\uE977\",\n            \"PresenceChickletVideo\": \"\\uE979\",\n            \"Reply\": \"\\uE97A\",\n            \"HalfAlpha\": \"\\uE97E\",\n            \"ConstructionCone\": \"\\uE98F\",\n            \"DoubleChevronLeftMed\": \"\\uE991\",\n            \"Volume0\": \"\\uE992\",\n            \"Volume1\": \"\\uE993\",\n            \"Volume2\": \"\\uE994\",\n            \"Volume3\": \"\\uE995\",\n            \"Chart\": \"\\uE999\",\n            \"Robot\": \"\\uE99A\",\n            \"Manufacturing\": \"\\uE99C\",\n            \"LockSolid\": \"\\uE9A2\",\n            \"FitPage\": \"\\uE9A6\",\n            \"FitWidth\": \"\\uE9A7\",\n            \"BidiLtr\": \"\\uE9AA\",\n            \"BidiRtl\": \"\\uE9AB\",\n            \"RightDoubleQuote\": \"\\uE9B1\",\n            \"Sunny\": \"\\uE9BD\",\n            \"CloudWeather\": \"\\uE9BE\",\n            \"Cloudy\": \"\\uE9BF\",\n            \"PartlyCloudyDay\": \"\\uE9C0\",\n            \"PartlyCloudyNight\": \"\\uE9C1\",\n            \"ClearNight\": \"\\uE9C2\",\n            \"RainShowersDay\": \"\\uE9C3\",\n            \"Rain\": \"\\uE9C4\",\n            \"Thunderstorms\": \"\\uE9C6\",\n            \"RainSnow\": \"\\uE9C7\",\n            \"Snow\": \"\\uE9C8\",\n            \"BlowingSnow\": \"\\uE9C9\",\n            \"Frigid\": \"\\uE9CA\",\n            \"Fog\": \"\\uE9CB\",\n            \"Squalls\": \"\\uE9CC\",\n            \"Duststorm\": \"\\uE9CD\",\n            \"Unknown\": \"\\uE9CE\",\n            \"Precipitation\": \"\\uE9CF\",\n            \"Ribbon\": \"\\uE9D1\",\n            \"AreaChart\": \"\\uE9D2\",\n            \"Assign\": \"\\uE9D3\",\n            \"FlowChart\": \"\\uE9D4\",\n            \"CheckList\": \"\\uE9D5\",\n            \"Diagnostic\": \"\\uE9D9\",\n            \"Generate\": \"\\uE9DA\",\n            \"LineChart\": \"\\uE9E6\",\n            \"Equalizer\": \"\\uE9E9\",\n            \"BarChartHorizontal\": \"\\uE9EB\",\n            \"BarChartVertical\": \"\\uE9EC\",\n            \"Freezing\": \"\\uE9EF\",\n            \"FunnelChart\": \"\\uE9F1\",\n            \"Processing\": \"\\uE9F5\",\n            \"Quantity\": \"\\uE9F8\",\n            \"ReportDocument\": \"\\uE9F9\",\n            \"StackColumnChart\": \"\\uE9FC\",\n            \"SnowShowerDay\": \"\\uE9FD\",\n            \"HailDay\": \"\\uEA00\",\n            \"WorkFlow\": \"\\uEA01\",\n            \"HourGlass\": \"\\uEA03\",\n            \"StoreLogoMed20\": \"\\uEA04\",\n            \"TimeSheet\": \"\\uEA05\",\n            \"TriangleSolid\": \"\\uEA08\",\n            \"UpgradeAnalysis\": \"\\uEA0B\",\n            \"VideoSolid\": \"\\uEA0C\",\n            \"RainShowersNight\": \"\\uEA0F\",\n            \"SnowShowerNight\": \"\\uEA11\",\n            \"Teamwork\": \"\\uEA12\",\n            \"HailNight\": \"\\uEA13\",\n            \"PeopleAdd\": \"\\uEA15\",\n            \"Glasses\": \"\\uEA16\",\n            \"DateTime2\": \"\\uEA17\",\n            \"Shield\": \"\\uEA18\",\n            \"Header1\": \"\\uEA19\",\n            \"PageAdd\": \"\\uEA1A\",\n            \"NumberedList\": \"\\uEA1C\",\n            \"PowerBILogo\": \"\\uEA1E\",\n            \"Info2\": \"\\uEA1F\",\n            \"MusicInCollectionFill\": \"\\uEA36\",\n            \"Asterisk\": \"\\uEA38\",\n            \"ErrorBadge\": \"\\uEA39\",\n            \"CircleFill\": \"\\uEA3B\",\n            \"Record2\": \"\\uEA3F\",\n            \"AllAppsMirrored\": \"\\uEA40\",\n            \"BookmarksMirrored\": \"\\uEA41\",\n            \"BulletedListMirrored\": \"\\uEA42\",\n            \"CaretHollowMirrored\": \"\\uEA45\",\n            \"CaretSolidMirrored\": \"\\uEA46\",\n            \"ChromeBackMirrored\": \"\\uEA47\",\n            \"ClearSelectionMirrored\": \"\\uEA48\",\n            \"ClosePaneMirrored\": \"\\uEA49\",\n            \"DockLeftMirrored\": \"\\uEA4C\",\n            \"DoubleChevronLeftMedMirrored\": \"\\uEA4D\",\n            \"GoMirrored\": \"\\uEA4F\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hkPkR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-4\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-4-a656cc0a.woff') format('woff')\"\n        },\n        icons: {\n            \"HelpMirrored\": \"\\uEA51\",\n            \"ImportMirrored\": \"\\uEA52\",\n            \"ImportAllMirrored\": \"\\uEA53\",\n            \"ListMirrored\": \"\\uEA55\",\n            \"MailForwardMirrored\": \"\\uEA56\",\n            \"MailReplyMirrored\": \"\\uEA57\",\n            \"MailReplyAllMirrored\": \"\\uEA58\",\n            \"MiniContractMirrored\": \"\\uEA59\",\n            \"MiniExpandMirrored\": \"\\uEA5A\",\n            \"OpenPaneMirrored\": \"\\uEA5B\",\n            \"ParkingLocationMirrored\": \"\\uEA5E\",\n            \"SendMirrored\": \"\\uEA63\",\n            \"ShowResultsMirrored\": \"\\uEA65\",\n            \"ThumbnailViewMirrored\": \"\\uEA67\",\n            \"Media\": \"\\uEA69\",\n            \"Devices3\": \"\\uEA6C\",\n            \"Focus\": \"\\uEA6F\",\n            \"VideoLightOff\": \"\\uEA74\",\n            \"Lightbulb\": \"\\uEA80\",\n            \"StatusTriangle\": \"\\uEA82\",\n            \"VolumeDisabled\": \"\\uEA85\",\n            \"Puzzle\": \"\\uEA86\",\n            \"EmojiNeutral\": \"\\uEA87\",\n            \"EmojiDisappointed\": \"\\uEA88\",\n            \"HomeSolid\": \"\\uEA8A\",\n            \"Ringer\": \"\\uEA8F\",\n            \"PDF\": \"\\uEA90\",\n            \"HeartBroken\": \"\\uEA92\",\n            \"StoreLogo16\": \"\\uEA96\",\n            \"MultiSelectMirrored\": \"\\uEA98\",\n            \"Broom\": \"\\uEA99\",\n            \"AddToShoppingList\": \"\\uEA9A\",\n            \"Cocktails\": \"\\uEA9D\",\n            \"Wines\": \"\\uEABF\",\n            \"Articles\": \"\\uEAC1\",\n            \"Cycling\": \"\\uEAC7\",\n            \"DietPlanNotebook\": \"\\uEAC8\",\n            \"Pill\": \"\\uEACB\",\n            \"ExerciseTracker\": \"\\uEACC\",\n            \"HandsFree\": \"\\uEAD0\",\n            \"Medical\": \"\\uEAD4\",\n            \"Running\": \"\\uEADA\",\n            \"Weights\": \"\\uEADB\",\n            \"Trackers\": \"\\uEADF\",\n            \"AddNotes\": \"\\uEAE3\",\n            \"AllCurrency\": \"\\uEAE4\",\n            \"BarChart4\": \"\\uEAE7\",\n            \"CirclePlus\": \"\\uEAEE\",\n            \"Coffee\": \"\\uEAEF\",\n            \"Cotton\": \"\\uEAF3\",\n            \"Market\": \"\\uEAFC\",\n            \"Money\": \"\\uEAFD\",\n            \"PieDouble\": \"\\uEB04\",\n            \"PieSingle\": \"\\uEB05\",\n            \"RemoveFilter\": \"\\uEB08\",\n            \"Savings\": \"\\uEB0B\",\n            \"Sell\": \"\\uEB0C\",\n            \"StockDown\": \"\\uEB0F\",\n            \"StockUp\": \"\\uEB11\",\n            \"Lamp\": \"\\uEB19\",\n            \"Source\": \"\\uEB1B\",\n            \"MSNVideos\": \"\\uEB1C\",\n            \"Cricket\": \"\\uEB1E\",\n            \"Golf\": \"\\uEB1F\",\n            \"Baseball\": \"\\uEB20\",\n            \"Soccer\": \"\\uEB21\",\n            \"MoreSports\": \"\\uEB22\",\n            \"AutoRacing\": \"\\uEB24\",\n            \"CollegeHoops\": \"\\uEB25\",\n            \"CollegeFootball\": \"\\uEB26\",\n            \"ProFootball\": \"\\uEB27\",\n            \"ProHockey\": \"\\uEB28\",\n            \"Rugby\": \"\\uEB2D\",\n            \"SubstitutionsIn\": \"\\uEB31\",\n            \"Tennis\": \"\\uEB33\",\n            \"Arrivals\": \"\\uEB34\",\n            \"Design\": \"\\uEB3C\",\n            \"Website\": \"\\uEB41\",\n            \"Drop\": \"\\uEB42\",\n            \"HistoricalWeather\": \"\\uEB43\",\n            \"SkiResorts\": \"\\uEB45\",\n            \"Snowflake\": \"\\uEB46\",\n            \"BusSolid\": \"\\uEB47\",\n            \"FerrySolid\": \"\\uEB48\",\n            \"AirplaneSolid\": \"\\uEB4C\",\n            \"TrainSolid\": \"\\uEB4D\",\n            \"Ticket\": \"\\uEB54\",\n            \"WifiWarning4\": \"\\uEB63\",\n            \"Devices4\": \"\\uEB66\",\n            \"AzureLogo\": \"\\uEB6A\",\n            \"BingLogo\": \"\\uEB6B\",\n            \"MSNLogo\": \"\\uEB6C\",\n            \"OutlookLogoInverse\": \"\\uEB6D\",\n            \"OfficeLogo\": \"\\uEB6E\",\n            \"SkypeLogo\": \"\\uEB6F\",\n            \"Door\": \"\\uEB75\",\n            \"EditMirrored\": \"\\uEB7E\",\n            \"GiftCard\": \"\\uEB8E\",\n            \"DoubleBookmark\": \"\\uEB8F\",\n            \"StatusErrorFull\": \"\\uEB90\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"edhGK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-5\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-5-f95ba260.woff') format('woff')\"\n        },\n        icons: {\n            \"Certificate\": \"\\uEB95\",\n            \"FastForward\": \"\\uEB9D\",\n            \"Rewind\": \"\\uEB9E\",\n            \"Photo2\": \"\\uEB9F\",\n            \"OpenSource\": \"\\uEBC2\",\n            \"Movers\": \"\\uEBCD\",\n            \"CloudDownload\": \"\\uEBD3\",\n            \"Family\": \"\\uEBDA\",\n            \"WindDirection\": \"\\uEBE6\",\n            \"Bug\": \"\\uEBE8\",\n            \"SiteScan\": \"\\uEBEC\",\n            \"BrowserScreenShot\": \"\\uEBED\",\n            \"F12DevTools\": \"\\uEBEE\",\n            \"CSS\": \"\\uEBEF\",\n            \"JS\": \"\\uEBF0\",\n            \"DeliveryTruck\": \"\\uEBF4\",\n            \"ReminderPerson\": \"\\uEBF7\",\n            \"ReminderGroup\": \"\\uEBF8\",\n            \"ReminderTime\": \"\\uEBF9\",\n            \"TabletMode\": \"\\uEBFC\",\n            \"Umbrella\": \"\\uEC04\",\n            \"NetworkTower\": \"\\uEC05\",\n            \"CityNext\": \"\\uEC06\",\n            \"CityNext2\": \"\\uEC07\",\n            \"Section\": \"\\uEC0C\",\n            \"OneNoteLogoInverse\": \"\\uEC0D\",\n            \"ToggleFilled\": \"\\uEC11\",\n            \"ToggleBorder\": \"\\uEC12\",\n            \"SliderThumb\": \"\\uEC13\",\n            \"ToggleThumb\": \"\\uEC14\",\n            \"Documentation\": \"\\uEC17\",\n            \"Badge\": \"\\uEC1B\",\n            \"Giftbox\": \"\\uEC1F\",\n            \"VisualStudioLogo\": \"\\uEC22\",\n            \"HomeGroup\": \"\\uEC26\",\n            \"ExcelLogoInverse\": \"\\uEC28\",\n            \"WordLogoInverse\": \"\\uEC29\",\n            \"PowerPointLogoInverse\": \"\\uEC2A\",\n            \"Cafe\": \"\\uEC32\",\n            \"SpeedHigh\": \"\\uEC4A\",\n            \"Commitments\": \"\\uEC4D\",\n            \"ThisPC\": \"\\uEC4E\",\n            \"MusicNote\": \"\\uEC4F\",\n            \"MicOff\": \"\\uEC54\",\n            \"PlaybackRate1x\": \"\\uEC57\",\n            \"EdgeLogo\": \"\\uEC60\",\n            \"CompletedSolid\": \"\\uEC61\",\n            \"AlbumRemove\": \"\\uEC62\",\n            \"MessageFill\": \"\\uEC70\",\n            \"TabletSelected\": \"\\uEC74\",\n            \"MobileSelected\": \"\\uEC75\",\n            \"LaptopSelected\": \"\\uEC76\",\n            \"TVMonitorSelected\": \"\\uEC77\",\n            \"DeveloperTools\": \"\\uEC7A\",\n            \"Shapes\": \"\\uEC7C\",\n            \"InsertTextBox\": \"\\uEC7D\",\n            \"LowerBrightness\": \"\\uEC8A\",\n            \"WebComponents\": \"\\uEC8B\",\n            \"OfflineStorage\": \"\\uEC8C\",\n            \"DOM\": \"\\uEC8D\",\n            \"CloudUpload\": \"\\uEC8E\",\n            \"ScrollUpDown\": \"\\uEC8F\",\n            \"DateTime\": \"\\uEC92\",\n            \"Event\": \"\\uECA3\",\n            \"Cake\": \"\\uECA4\",\n            \"Org\": \"\\uECA6\",\n            \"PartyLeader\": \"\\uECA7\",\n            \"DRM\": \"\\uECA8\",\n            \"CloudAdd\": \"\\uECA9\",\n            \"AppIconDefault\": \"\\uECAA\",\n            \"Photo2Add\": \"\\uECAB\",\n            \"Photo2Remove\": \"\\uECAC\",\n            \"Calories\": \"\\uECAD\",\n            \"POI\": \"\\uECAF\",\n            \"AddTo\": \"\\uECC8\",\n            \"RadioBtnOff\": \"\\uECCA\",\n            \"RadioBtnOn\": \"\\uECCB\",\n            \"ExploreContent\": \"\\uECCD\",\n            \"Product\": \"\\uECDC\",\n            \"ProgressLoopInner\": \"\\uECDE\",\n            \"ProgressLoopOuter\": \"\\uECDF\",\n            \"Blocked2\": \"\\uECE4\",\n            \"FangBody\": \"\\uECEB\",\n            \"Toolbox\": \"\\uECED\",\n            \"PageHeader\": \"\\uECEE\",\n            \"ChatInviteFriend\": \"\\uECFE\",\n            \"Brush\": \"\\uECFF\",\n            \"Shirt\": \"\\uED00\",\n            \"Crown\": \"\\uED01\",\n            \"Diamond\": \"\\uED02\",\n            \"ScaleUp\": \"\\uED09\",\n            \"QRCode\": \"\\uED14\",\n            \"Feedback\": \"\\uED15\",\n            \"SharepointLogoInverse\": \"\\uED18\",\n            \"YammerLogo\": \"\\uED19\",\n            \"Hide\": \"\\uED1A\",\n            \"Uneditable\": \"\\uED1D\",\n            \"ReturnToSession\": \"\\uED24\",\n            \"OpenFolderHorizontal\": \"\\uED25\",\n            \"CalendarMirrored\": \"\\uED28\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aigEl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-6\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-6-ef6fd590.woff') format('woff')\"\n        },\n        icons: {\n            \"SwayLogoInverse\": \"\\uED29\",\n            \"OutOfOffice\": \"\\uED34\",\n            \"Trophy\": \"\\uED3F\",\n            \"ReopenPages\": \"\\uED50\",\n            \"EmojiTabSymbols\": \"\\uED58\",\n            \"AADLogo\": \"\\uED68\",\n            \"AccessLogo\": \"\\uED69\",\n            \"AdminALogoInverse32\": \"\\uED6A\",\n            \"AdminCLogoInverse32\": \"\\uED6B\",\n            \"AdminDLogoInverse32\": \"\\uED6C\",\n            \"AdminELogoInverse32\": \"\\uED6D\",\n            \"AdminLLogoInverse32\": \"\\uED6E\",\n            \"AdminMLogoInverse32\": \"\\uED6F\",\n            \"AdminOLogoInverse32\": \"\\uED70\",\n            \"AdminPLogoInverse32\": \"\\uED71\",\n            \"AdminSLogoInverse32\": \"\\uED72\",\n            \"AdminYLogoInverse32\": \"\\uED73\",\n            \"DelveLogoInverse\": \"\\uED76\",\n            \"ExchangeLogoInverse\": \"\\uED78\",\n            \"LyncLogo\": \"\\uED79\",\n            \"OfficeVideoLogoInverse\": \"\\uED7A\",\n            \"SocialListeningLogo\": \"\\uED7C\",\n            \"VisioLogoInverse\": \"\\uED7D\",\n            \"Balloons\": \"\\uED7E\",\n            \"Cat\": \"\\uED7F\",\n            \"MailAlert\": \"\\uED80\",\n            \"MailCheck\": \"\\uED81\",\n            \"MailLowImportance\": \"\\uED82\",\n            \"MailPause\": \"\\uED83\",\n            \"MailRepeat\": \"\\uED84\",\n            \"SecurityGroup\": \"\\uED85\",\n            \"Table\": \"\\uED86\",\n            \"VoicemailForward\": \"\\uED87\",\n            \"VoicemailReply\": \"\\uED88\",\n            \"Waffle\": \"\\uED89\",\n            \"RemoveEvent\": \"\\uED8A\",\n            \"EventInfo\": \"\\uED8B\",\n            \"ForwardEvent\": \"\\uED8C\",\n            \"WipePhone\": \"\\uED8D\",\n            \"AddOnlineMeeting\": \"\\uED8E\",\n            \"JoinOnlineMeeting\": \"\\uED8F\",\n            \"RemoveLink\": \"\\uED90\",\n            \"PeopleBlock\": \"\\uED91\",\n            \"PeopleRepeat\": \"\\uED92\",\n            \"PeopleAlert\": \"\\uED93\",\n            \"PeoplePause\": \"\\uED94\",\n            \"TransferCall\": \"\\uED95\",\n            \"AddPhone\": \"\\uED96\",\n            \"UnknownCall\": \"\\uED97\",\n            \"NoteReply\": \"\\uED98\",\n            \"NoteForward\": \"\\uED99\",\n            \"NotePinned\": \"\\uED9A\",\n            \"RemoveOccurrence\": \"\\uED9B\",\n            \"Timeline\": \"\\uED9C\",\n            \"EditNote\": \"\\uED9D\",\n            \"CircleHalfFull\": \"\\uED9E\",\n            \"Room\": \"\\uED9F\",\n            \"Unsubscribe\": \"\\uEDA0\",\n            \"Subscribe\": \"\\uEDA1\",\n            \"HardDrive\": \"\\uEDA2\",\n            \"RecurringTask\": \"\\uEDB2\",\n            \"TaskManager\": \"\\uEDB7\",\n            \"TaskManagerMirrored\": \"\\uEDB8\",\n            \"Combine\": \"\\uEDBB\",\n            \"Split\": \"\\uEDBC\",\n            \"DoubleChevronUp\": \"\\uEDBD\",\n            \"DoubleChevronLeft\": \"\\uEDBE\",\n            \"DoubleChevronRight\": \"\\uEDBF\",\n            \"TextBox\": \"\\uEDC2\",\n            \"TextField\": \"\\uEDC3\",\n            \"NumberField\": \"\\uEDC4\",\n            \"Dropdown\": \"\\uEDC5\",\n            \"PenWorkspace\": \"\\uEDC6\",\n            \"BookingsLogo\": \"\\uEDC7\",\n            \"ClassNotebookLogoInverse\": \"\\uEDC8\",\n            \"DelveAnalyticsLogo\": \"\\uEDCA\",\n            \"DocsLogoInverse\": \"\\uEDCB\",\n            \"Dynamics365Logo\": \"\\uEDCC\",\n            \"DynamicSMBLogo\": \"\\uEDCD\",\n            \"OfficeAssistantLogo\": \"\\uEDCE\",\n            \"OfficeStoreLogo\": \"\\uEDCF\",\n            \"OneNoteEduLogoInverse\": \"\\uEDD0\",\n            \"PlannerLogo\": \"\\uEDD1\",\n            \"PowerApps\": \"\\uEDD2\",\n            \"Suitcase\": \"\\uEDD3\",\n            \"ProjectLogoInverse\": \"\\uEDD4\",\n            \"CaretLeft8\": \"\\uEDD5\",\n            \"CaretRight8\": \"\\uEDD6\",\n            \"CaretUp8\": \"\\uEDD7\",\n            \"CaretDown8\": \"\\uEDD8\",\n            \"CaretLeftSolid8\": \"\\uEDD9\",\n            \"CaretRightSolid8\": \"\\uEDDA\",\n            \"CaretUpSolid8\": \"\\uEDDB\",\n            \"CaretDownSolid8\": \"\\uEDDC\",\n            \"ClearFormatting\": \"\\uEDDD\",\n            \"Superscript\": \"\\uEDDE\",\n            \"Subscript\": \"\\uEDDF\",\n            \"Strikethrough\": \"\\uEDE0\",\n            \"Export\": \"\\uEDE1\",\n            \"ExportMirrored\": \"\\uEDE2\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8Xys9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-7\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-7-2b97bb99.woff') format('woff')\"\n        },\n        icons: {\n            \"SingleBookmark\": \"\\uEDFF\",\n            \"SingleBookmarkSolid\": \"\\uEE00\",\n            \"DoubleChevronDown\": \"\\uEE04\",\n            \"FollowUser\": \"\\uEE05\",\n            \"ReplyAll\": \"\\uEE0A\",\n            \"WorkforceManagement\": \"\\uEE0F\",\n            \"RecruitmentManagement\": \"\\uEE12\",\n            \"Questionnaire\": \"\\uEE19\",\n            \"ManagerSelfService\": \"\\uEE23\",\n            \"ProductionFloorManagement\": \"\\uEE29\",\n            \"ProductRelease\": \"\\uEE2E\",\n            \"ProductVariant\": \"\\uEE30\",\n            \"ReplyMirrored\": \"\\uEE35\",\n            \"ReplyAllMirrored\": \"\\uEE36\",\n            \"Medal\": \"\\uEE38\",\n            \"AddGroup\": \"\\uEE3D\",\n            \"QuestionnaireMirrored\": \"\\uEE4B\",\n            \"CloudImportExport\": \"\\uEE55\",\n            \"TemporaryUser\": \"\\uEE58\",\n            \"CaretSolid16\": \"\\uEE62\",\n            \"GroupedDescending\": \"\\uEE66\",\n            \"GroupedAscending\": \"\\uEE67\",\n            \"AwayStatus\": \"\\uEE6A\",\n            \"MyMoviesTV\": \"\\uEE6C\",\n            \"GenericScan\": \"\\uEE6F\",\n            \"AustralianRules\": \"\\uEE70\",\n            \"WifiEthernet\": \"\\uEE77\",\n            \"TrackersMirrored\": \"\\uEE92\",\n            \"DateTimeMirrored\": \"\\uEE93\",\n            \"StopSolid\": \"\\uEE95\",\n            \"DoubleChevronUp12\": \"\\uEE96\",\n            \"DoubleChevronDown12\": \"\\uEE97\",\n            \"DoubleChevronLeft12\": \"\\uEE98\",\n            \"DoubleChevronRight12\": \"\\uEE99\",\n            \"CalendarAgenda\": \"\\uEE9A\",\n            \"ConnectVirtualMachine\": \"\\uEE9D\",\n            \"AddEvent\": \"\\uEEB5\",\n            \"AssetLibrary\": \"\\uEEB6\",\n            \"DataConnectionLibrary\": \"\\uEEB7\",\n            \"DocLibrary\": \"\\uEEB8\",\n            \"FormLibrary\": \"\\uEEB9\",\n            \"FormLibraryMirrored\": \"\\uEEBA\",\n            \"ReportLibrary\": \"\\uEEBB\",\n            \"ReportLibraryMirrored\": \"\\uEEBC\",\n            \"ContactCard\": \"\\uEEBD\",\n            \"CustomList\": \"\\uEEBE\",\n            \"CustomListMirrored\": \"\\uEEBF\",\n            \"IssueTracking\": \"\\uEEC0\",\n            \"IssueTrackingMirrored\": \"\\uEEC1\",\n            \"PictureLibrary\": \"\\uEEC2\",\n            \"OfficeAddinsLogo\": \"\\uEEC7\",\n            \"OfflineOneDriveParachute\": \"\\uEEC8\",\n            \"OfflineOneDriveParachuteDisabled\": \"\\uEEC9\",\n            \"TriangleSolidUp12\": \"\\uEECC\",\n            \"TriangleSolidDown12\": \"\\uEECD\",\n            \"TriangleSolidLeft12\": \"\\uEECE\",\n            \"TriangleSolidRight12\": \"\\uEECF\",\n            \"TriangleUp12\": \"\\uEED0\",\n            \"TriangleDown12\": \"\\uEED1\",\n            \"TriangleLeft12\": \"\\uEED2\",\n            \"TriangleRight12\": \"\\uEED3\",\n            \"ArrowUpRight8\": \"\\uEED4\",\n            \"ArrowDownRight8\": \"\\uEED5\",\n            \"DocumentSet\": \"\\uEED6\",\n            \"GoToDashboard\": \"\\uEEED\",\n            \"DelveAnalytics\": \"\\uEEEE\",\n            \"ArrowUpRightMirrored8\": \"\\uEEEF\",\n            \"ArrowDownRightMirrored8\": \"\\uEEF0\",\n            \"CompanyDirectory\": \"\\uEF0D\",\n            \"OpenEnrollment\": \"\\uEF1C\",\n            \"CompanyDirectoryMirrored\": \"\\uEF2B\",\n            \"OneDriveAdd\": \"\\uEF32\",\n            \"ProfileSearch\": \"\\uEF35\",\n            \"Header2\": \"\\uEF36\",\n            \"Header3\": \"\\uEF37\",\n            \"Header4\": \"\\uEF38\",\n            \"RingerSolid\": \"\\uEF3A\",\n            \"Eyedropper\": \"\\uEF3C\",\n            \"MarketDown\": \"\\uEF42\",\n            \"CalendarWorkWeek\": \"\\uEF51\",\n            \"SidePanel\": \"\\uEF52\",\n            \"GlobeFavorite\": \"\\uEF53\",\n            \"CaretTopLeftSolid8\": \"\\uEF54\",\n            \"CaretTopRightSolid8\": \"\\uEF55\",\n            \"ViewAll2\": \"\\uEF56\",\n            \"DocumentReply\": \"\\uEF57\",\n            \"PlayerSettings\": \"\\uEF58\",\n            \"ReceiptForward\": \"\\uEF59\",\n            \"ReceiptReply\": \"\\uEF5A\",\n            \"ReceiptCheck\": \"\\uEF5B\",\n            \"Fax\": \"\\uEF5C\",\n            \"RecurringEvent\": \"\\uEF5D\",\n            \"ReplyAlt\": \"\\uEF5E\",\n            \"ReplyAllAlt\": \"\\uEF5F\",\n            \"EditStyle\": \"\\uEF60\",\n            \"EditMail\": \"\\uEF61\",\n            \"Lifesaver\": \"\\uEF62\",\n            \"LifesaverLock\": \"\\uEF63\",\n            \"InboxCheck\": \"\\uEF64\",\n            \"FolderSearch\": \"\\uEF65\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5gVRf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-8\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-8-6fdf1528.woff') format('woff')\"\n        },\n        icons: {\n            \"CollapseMenu\": \"\\uEF66\",\n            \"ExpandMenu\": \"\\uEF67\",\n            \"Boards\": \"\\uEF68\",\n            \"SunAdd\": \"\\uEF69\",\n            \"SunQuestionMark\": \"\\uEF6A\",\n            \"LandscapeOrientation\": \"\\uEF6B\",\n            \"DocumentSearch\": \"\\uEF6C\",\n            \"PublicCalendar\": \"\\uEF6D\",\n            \"PublicContactCard\": \"\\uEF6E\",\n            \"PublicEmail\": \"\\uEF6F\",\n            \"PublicFolder\": \"\\uEF70\",\n            \"WordDocument\": \"\\uEF71\",\n            \"PowerPointDocument\": \"\\uEF72\",\n            \"ExcelDocument\": \"\\uEF73\",\n            \"GroupedList\": \"\\uEF74\",\n            \"ClassroomLogo\": \"\\uEF75\",\n            \"Sections\": \"\\uEF76\",\n            \"EditPhoto\": \"\\uEF77\",\n            \"Starburst\": \"\\uEF78\",\n            \"ShareiOS\": \"\\uEF79\",\n            \"AirTickets\": \"\\uEF7A\",\n            \"PencilReply\": \"\\uEF7B\",\n            \"Tiles2\": \"\\uEF7C\",\n            \"SkypeCircleCheck\": \"\\uEF7D\",\n            \"SkypeCircleClock\": \"\\uEF7E\",\n            \"SkypeCircleMinus\": \"\\uEF7F\",\n            \"SkypeMessage\": \"\\uEF83\",\n            \"ClosedCaption\": \"\\uEF84\",\n            \"ATPLogo\": \"\\uEF85\",\n            \"OfficeFormsLogoInverse\": \"\\uEF86\",\n            \"RecycleBin\": \"\\uEF87\",\n            \"EmptyRecycleBin\": \"\\uEF88\",\n            \"Hide2\": \"\\uEF89\",\n            \"Breadcrumb\": \"\\uEF8C\",\n            \"BirthdayCake\": \"\\uEF8D\",\n            \"TimeEntry\": \"\\uEF95\",\n            \"CRMProcesses\": \"\\uEFB1\",\n            \"PageEdit\": \"\\uEFB6\",\n            \"PageArrowRight\": \"\\uEFB8\",\n            \"PageRemove\": \"\\uEFBA\",\n            \"Database\": \"\\uEFC7\",\n            \"DataManagementSettings\": \"\\uEFC8\",\n            \"CRMServices\": \"\\uEFD2\",\n            \"EditContact\": \"\\uEFD3\",\n            \"ConnectContacts\": \"\\uEFD4\",\n            \"AppIconDefaultAdd\": \"\\uEFDA\",\n            \"AppIconDefaultList\": \"\\uEFDE\",\n            \"ActivateOrders\": \"\\uEFE0\",\n            \"DeactivateOrders\": \"\\uEFE1\",\n            \"ProductCatalog\": \"\\uEFE8\",\n            \"ScatterChart\": \"\\uEFEB\",\n            \"AccountActivity\": \"\\uEFF4\",\n            \"DocumentManagement\": \"\\uEFFC\",\n            \"CRMReport\": \"\\uEFFE\",\n            \"KnowledgeArticle\": \"\\uF000\",\n            \"Relationship\": \"\\uF003\",\n            \"HomeVerify\": \"\\uF00E\",\n            \"ZipFolder\": \"\\uF012\",\n            \"SurveyQuestions\": \"\\uF01B\",\n            \"TextDocument\": \"\\uF029\",\n            \"TextDocumentShared\": \"\\uF02B\",\n            \"PageCheckedOut\": \"\\uF02C\",\n            \"PageShared\": \"\\uF02D\",\n            \"SaveAndClose\": \"\\uF038\",\n            \"Script\": \"\\uF03A\",\n            \"Archive\": \"\\uF03F\",\n            \"ActivityFeed\": \"\\uF056\",\n            \"Compare\": \"\\uF057\",\n            \"EventDate\": \"\\uF059\",\n            \"ArrowUpRight\": \"\\uF069\",\n            \"CaretRight\": \"\\uF06B\",\n            \"SetAction\": \"\\uF071\",\n            \"ChatBot\": \"\\uF08B\",\n            \"CaretSolidLeft\": \"\\uF08D\",\n            \"CaretSolidDown\": \"\\uF08E\",\n            \"CaretSolidRight\": \"\\uF08F\",\n            \"CaretSolidUp\": \"\\uF090\",\n            \"PowerAppsLogo\": \"\\uF091\",\n            \"PowerApps2Logo\": \"\\uF092\",\n            \"SearchIssue\": \"\\uF09A\",\n            \"SearchIssueMirrored\": \"\\uF09B\",\n            \"FabricAssetLibrary\": \"\\uF09C\",\n            \"FabricDataConnectionLibrary\": \"\\uF09D\",\n            \"FabricDocLibrary\": \"\\uF09E\",\n            \"FabricFormLibrary\": \"\\uF09F\",\n            \"FabricFormLibraryMirrored\": \"\\uF0A0\",\n            \"FabricReportLibrary\": \"\\uF0A1\",\n            \"FabricReportLibraryMirrored\": \"\\uF0A2\",\n            \"FabricPublicFolder\": \"\\uF0A3\",\n            \"FabricFolderSearch\": \"\\uF0A4\",\n            \"FabricMovetoFolder\": \"\\uF0A5\",\n            \"FabricUnsyncFolder\": \"\\uF0A6\",\n            \"FabricSyncFolder\": \"\\uF0A7\",\n            \"FabricOpenFolderHorizontal\": \"\\uF0A8\",\n            \"FabricFolder\": \"\\uF0A9\",\n            \"FabricFolderFill\": \"\\uF0AA\",\n            \"FabricNewFolder\": \"\\uF0AB\",\n            \"FabricPictureLibrary\": \"\\uF0AC\",\n            \"PhotoVideoMedia\": \"\\uF0B1\",\n            \"AddFavorite\": \"\\uF0C8\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jMVqc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-9\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-9-c6162b42.woff') format('woff')\"\n        },\n        icons: {\n            \"AddFavoriteFill\": \"\\uF0C9\",\n            \"BufferTimeBefore\": \"\\uF0CF\",\n            \"BufferTimeAfter\": \"\\uF0D0\",\n            \"BufferTimeBoth\": \"\\uF0D1\",\n            \"PublishContent\": \"\\uF0D4\",\n            \"ClipboardList\": \"\\uF0E3\",\n            \"ClipboardListMirrored\": \"\\uF0E4\",\n            \"CannedChat\": \"\\uF0F2\",\n            \"SkypeForBusinessLogo\": \"\\uF0FC\",\n            \"TabCenter\": \"\\uF100\",\n            \"PageCheckedin\": \"\\uF104\",\n            \"PageList\": \"\\uF106\",\n            \"ReadOutLoud\": \"\\uF112\",\n            \"CaretBottomLeftSolid8\": \"\\uF121\",\n            \"CaretBottomRightSolid8\": \"\\uF122\",\n            \"FolderHorizontal\": \"\\uF12B\",\n            \"MicrosoftStaffhubLogo\": \"\\uF130\",\n            \"GiftboxOpen\": \"\\uF133\",\n            \"StatusCircleOuter\": \"\\uF136\",\n            \"StatusCircleInner\": \"\\uF137\",\n            \"StatusCircleRing\": \"\\uF138\",\n            \"StatusTriangleOuter\": \"\\uF139\",\n            \"StatusTriangleInner\": \"\\uF13A\",\n            \"StatusTriangleExclamation\": \"\\uF13B\",\n            \"StatusCircleExclamation\": \"\\uF13C\",\n            \"StatusCircleErrorX\": \"\\uF13D\",\n            \"StatusCircleInfo\": \"\\uF13F\",\n            \"StatusCircleBlock\": \"\\uF140\",\n            \"StatusCircleBlock2\": \"\\uF141\",\n            \"StatusCircleQuestionMark\": \"\\uF142\",\n            \"StatusCircleSync\": \"\\uF143\",\n            \"Toll\": \"\\uF160\",\n            \"ExploreContentSingle\": \"\\uF164\",\n            \"CollapseContent\": \"\\uF165\",\n            \"CollapseContentSingle\": \"\\uF166\",\n            \"InfoSolid\": \"\\uF167\",\n            \"GroupList\": \"\\uF168\",\n            \"ProgressRingDots\": \"\\uF16A\",\n            \"CaloriesAdd\": \"\\uF172\",\n            \"BranchFork\": \"\\uF173\",\n            \"MuteChat\": \"\\uF17A\",\n            \"AddHome\": \"\\uF17B\",\n            \"AddWork\": \"\\uF17C\",\n            \"MobileReport\": \"\\uF18A\",\n            \"ScaleVolume\": \"\\uF18C\",\n            \"HardDriveGroup\": \"\\uF18F\",\n            \"FastMode\": \"\\uF19A\",\n            \"ToggleLeft\": \"\\uF19E\",\n            \"ToggleRight\": \"\\uF19F\",\n            \"TriangleShape\": \"\\uF1A7\",\n            \"RectangleShape\": \"\\uF1A9\",\n            \"CubeShape\": \"\\uF1AA\",\n            \"Trophy2\": \"\\uF1AE\",\n            \"BucketColor\": \"\\uF1B6\",\n            \"BucketColorFill\": \"\\uF1B7\",\n            \"Taskboard\": \"\\uF1C2\",\n            \"SingleColumn\": \"\\uF1D3\",\n            \"DoubleColumn\": \"\\uF1D4\",\n            \"TripleColumn\": \"\\uF1D5\",\n            \"ColumnLeftTwoThirds\": \"\\uF1D6\",\n            \"ColumnRightTwoThirds\": \"\\uF1D7\",\n            \"AccessLogoFill\": \"\\uF1DB\",\n            \"AnalyticsLogo\": \"\\uF1DE\",\n            \"AnalyticsQuery\": \"\\uF1DF\",\n            \"NewAnalyticsQuery\": \"\\uF1E0\",\n            \"AnalyticsReport\": \"\\uF1E1\",\n            \"WordLogo\": \"\\uF1E3\",\n            \"WordLogoFill\": \"\\uF1E4\",\n            \"ExcelLogo\": \"\\uF1E5\",\n            \"ExcelLogoFill\": \"\\uF1E6\",\n            \"OneNoteLogo\": \"\\uF1E7\",\n            \"OneNoteLogoFill\": \"\\uF1E8\",\n            \"OutlookLogo\": \"\\uF1E9\",\n            \"OutlookLogoFill\": \"\\uF1EA\",\n            \"PowerPointLogo\": \"\\uF1EB\",\n            \"PowerPointLogoFill\": \"\\uF1EC\",\n            \"PublisherLogo\": \"\\uF1ED\",\n            \"PublisherLogoFill\": \"\\uF1EE\",\n            \"ScheduleEventAction\": \"\\uF1EF\",\n            \"FlameSolid\": \"\\uF1F3\",\n            \"ServerProcesses\": \"\\uF1FE\",\n            \"Server\": \"\\uF201\",\n            \"SaveAll\": \"\\uF203\",\n            \"LinkedInLogo\": \"\\uF20A\",\n            \"Decimals\": \"\\uF218\",\n            \"SidePanelMirrored\": \"\\uF221\",\n            \"ProtectRestrict\": \"\\uF22A\",\n            \"Blog\": \"\\uF22B\",\n            \"UnknownMirrored\": \"\\uF22E\",\n            \"PublicContactCardMirrored\": \"\\uF230\",\n            \"GridViewSmall\": \"\\uF232\",\n            \"GridViewMedium\": \"\\uF233\",\n            \"GridViewLarge\": \"\\uF234\",\n            \"Step\": \"\\uF241\",\n            \"StepInsert\": \"\\uF242\",\n            \"StepShared\": \"\\uF243\",\n            \"StepSharedAdd\": \"\\uF244\",\n            \"StepSharedInsert\": \"\\uF245\",\n            \"ViewDashboard\": \"\\uF246\",\n            \"ViewList\": \"\\uF247\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lVXau\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-10\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-10-c4ded8e4.woff') format('woff')\"\n        },\n        icons: {\n            \"ViewListGroup\": \"\\uF248\",\n            \"ViewListTree\": \"\\uF249\",\n            \"TriggerAuto\": \"\\uF24A\",\n            \"TriggerUser\": \"\\uF24B\",\n            \"PivotChart\": \"\\uF24C\",\n            \"StackedBarChart\": \"\\uF24D\",\n            \"StackedLineChart\": \"\\uF24E\",\n            \"BuildQueue\": \"\\uF24F\",\n            \"BuildQueueNew\": \"\\uF250\",\n            \"UserFollowed\": \"\\uF25C\",\n            \"ContactLink\": \"\\uF25F\",\n            \"Stack\": \"\\uF26F\",\n            \"Bullseye\": \"\\uF272\",\n            \"VennDiagram\": \"\\uF273\",\n            \"FiveTileGrid\": \"\\uF274\",\n            \"FocalPoint\": \"\\uF277\",\n            \"Insert\": \"\\uF278\",\n            \"RingerRemove\": \"\\uF279\",\n            \"TeamsLogoInverse\": \"\\uF27A\",\n            \"TeamsLogo\": \"\\uF27B\",\n            \"TeamsLogoFill\": \"\\uF27C\",\n            \"SkypeForBusinessLogoFill\": \"\\uF27D\",\n            \"SharepointLogo\": \"\\uF27E\",\n            \"SharepointLogoFill\": \"\\uF27F\",\n            \"DelveLogo\": \"\\uF280\",\n            \"DelveLogoFill\": \"\\uF281\",\n            \"OfficeVideoLogo\": \"\\uF282\",\n            \"OfficeVideoLogoFill\": \"\\uF283\",\n            \"ExchangeLogo\": \"\\uF284\",\n            \"ExchangeLogoFill\": \"\\uF285\",\n            \"Signin\": \"\\uF286\",\n            \"DocumentApproval\": \"\\uF28B\",\n            \"CloneToDesktop\": \"\\uF28C\",\n            \"InstallToDrive\": \"\\uF28D\",\n            \"Blur\": \"\\uF28E\",\n            \"Build\": \"\\uF28F\",\n            \"ProcessMetaTask\": \"\\uF290\",\n            \"BranchFork2\": \"\\uF291\",\n            \"BranchLocked\": \"\\uF292\",\n            \"BranchCommit\": \"\\uF293\",\n            \"BranchCompare\": \"\\uF294\",\n            \"BranchMerge\": \"\\uF295\",\n            \"BranchPullRequest\": \"\\uF296\",\n            \"BranchSearch\": \"\\uF297\",\n            \"BranchShelveset\": \"\\uF298\",\n            \"RawSource\": \"\\uF299\",\n            \"MergeDuplicate\": \"\\uF29A\",\n            \"RowsGroup\": \"\\uF29B\",\n            \"RowsChild\": \"\\uF29C\",\n            \"Deploy\": \"\\uF29D\",\n            \"Redeploy\": \"\\uF29E\",\n            \"ServerEnviroment\": \"\\uF29F\",\n            \"VisioDiagram\": \"\\uF2A0\",\n            \"HighlightMappedShapes\": \"\\uF2A1\",\n            \"TextCallout\": \"\\uF2A2\",\n            \"IconSetsFlag\": \"\\uF2A4\",\n            \"VisioLogo\": \"\\uF2A7\",\n            \"VisioLogoFill\": \"\\uF2A8\",\n            \"VisioDocument\": \"\\uF2A9\",\n            \"TimelineProgress\": \"\\uF2AA\",\n            \"TimelineDelivery\": \"\\uF2AB\",\n            \"Backlog\": \"\\uF2AC\",\n            \"TeamFavorite\": \"\\uF2AD\",\n            \"TaskGroup\": \"\\uF2AE\",\n            \"TaskGroupMirrored\": \"\\uF2AF\",\n            \"ScopeTemplate\": \"\\uF2B0\",\n            \"AssessmentGroupTemplate\": \"\\uF2B1\",\n            \"NewTeamProject\": \"\\uF2B2\",\n            \"CommentAdd\": \"\\uF2B3\",\n            \"CommentNext\": \"\\uF2B4\",\n            \"CommentPrevious\": \"\\uF2B5\",\n            \"ShopServer\": \"\\uF2B6\",\n            \"LocaleLanguage\": \"\\uF2B7\",\n            \"QueryList\": \"\\uF2B8\",\n            \"UserSync\": \"\\uF2B9\",\n            \"UserPause\": \"\\uF2BA\",\n            \"StreamingOff\": \"\\uF2BB\",\n            \"ArrowTallUpLeft\": \"\\uF2BD\",\n            \"ArrowTallUpRight\": \"\\uF2BE\",\n            \"ArrowTallDownLeft\": \"\\uF2BF\",\n            \"ArrowTallDownRight\": \"\\uF2C0\",\n            \"FieldEmpty\": \"\\uF2C1\",\n            \"FieldFilled\": \"\\uF2C2\",\n            \"FieldChanged\": \"\\uF2C3\",\n            \"FieldNotChanged\": \"\\uF2C4\",\n            \"RingerOff\": \"\\uF2C5\",\n            \"PlayResume\": \"\\uF2C6\",\n            \"BulletedList2\": \"\\uF2C7\",\n            \"BulletedList2Mirrored\": \"\\uF2C8\",\n            \"ImageCrosshair\": \"\\uF2C9\",\n            \"GitGraph\": \"\\uF2CA\",\n            \"Repo\": \"\\uF2CB\",\n            \"RepoSolid\": \"\\uF2CC\",\n            \"FolderQuery\": \"\\uF2CD\",\n            \"FolderList\": \"\\uF2CE\",\n            \"FolderListMirrored\": \"\\uF2CF\",\n            \"LocationOutline\": \"\\uF2D0\",\n            \"POISolid\": \"\\uF2D1\",\n            \"CalculatorNotEqualTo\": \"\\uF2D2\",\n            \"BoxSubtractSolid\": \"\\uF2D3\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9IjrA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-11\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-11-2a8393d6.woff') format('woff')\"\n        },\n        icons: {\n            \"BoxAdditionSolid\": \"\\uF2D4\",\n            \"BoxMultiplySolid\": \"\\uF2D5\",\n            \"BoxPlaySolid\": \"\\uF2D6\",\n            \"BoxCheckmarkSolid\": \"\\uF2D7\",\n            \"CirclePauseSolid\": \"\\uF2D8\",\n            \"CirclePause\": \"\\uF2D9\",\n            \"MSNVideosSolid\": \"\\uF2DA\",\n            \"CircleStopSolid\": \"\\uF2DB\",\n            \"CircleStop\": \"\\uF2DC\",\n            \"NavigateBack\": \"\\uF2DD\",\n            \"NavigateBackMirrored\": \"\\uF2DE\",\n            \"NavigateForward\": \"\\uF2DF\",\n            \"NavigateForwardMirrored\": \"\\uF2E0\",\n            \"UnknownSolid\": \"\\uF2E1\",\n            \"UnknownMirroredSolid\": \"\\uF2E2\",\n            \"CircleAddition\": \"\\uF2E3\",\n            \"CircleAdditionSolid\": \"\\uF2E4\",\n            \"FilePDB\": \"\\uF2E5\",\n            \"FileTemplate\": \"\\uF2E6\",\n            \"FileSQL\": \"\\uF2E7\",\n            \"FileJAVA\": \"\\uF2E8\",\n            \"FileASPX\": \"\\uF2E9\",\n            \"FileCSS\": \"\\uF2EA\",\n            \"FileSass\": \"\\uF2EB\",\n            \"FileLess\": \"\\uF2EC\",\n            \"FileHTML\": \"\\uF2ED\",\n            \"JavaScriptLanguage\": \"\\uF2EE\",\n            \"CSharpLanguage\": \"\\uF2EF\",\n            \"CSharp\": \"\\uF2F0\",\n            \"VisualBasicLanguage\": \"\\uF2F1\",\n            \"VB\": \"\\uF2F2\",\n            \"CPlusPlusLanguage\": \"\\uF2F3\",\n            \"CPlusPlus\": \"\\uF2F4\",\n            \"FSharpLanguage\": \"\\uF2F5\",\n            \"FSharp\": \"\\uF2F6\",\n            \"TypeScriptLanguage\": \"\\uF2F7\",\n            \"PythonLanguage\": \"\\uF2F8\",\n            \"PY\": \"\\uF2F9\",\n            \"CoffeeScript\": \"\\uF2FA\",\n            \"MarkDownLanguage\": \"\\uF2FB\",\n            \"FullWidth\": \"\\uF2FE\",\n            \"FullWidthEdit\": \"\\uF2FF\",\n            \"Plug\": \"\\uF300\",\n            \"PlugSolid\": \"\\uF301\",\n            \"PlugConnected\": \"\\uF302\",\n            \"PlugDisconnected\": \"\\uF303\",\n            \"UnlockSolid\": \"\\uF304\",\n            \"Variable\": \"\\uF305\",\n            \"Parameter\": \"\\uF306\",\n            \"CommentUrgent\": \"\\uF307\",\n            \"Storyboard\": \"\\uF308\",\n            \"DiffInline\": \"\\uF309\",\n            \"DiffSideBySide\": \"\\uF30A\",\n            \"ImageDiff\": \"\\uF30B\",\n            \"ImagePixel\": \"\\uF30C\",\n            \"FileBug\": \"\\uF30D\",\n            \"FileCode\": \"\\uF30E\",\n            \"FileComment\": \"\\uF30F\",\n            \"BusinessHoursSign\": \"\\uF310\",\n            \"FileImage\": \"\\uF311\",\n            \"FileSymlink\": \"\\uF312\",\n            \"AutoFillTemplate\": \"\\uF313\",\n            \"WorkItem\": \"\\uF314\",\n            \"WorkItemBug\": \"\\uF315\",\n            \"LogRemove\": \"\\uF316\",\n            \"ColumnOptions\": \"\\uF317\",\n            \"Packages\": \"\\uF318\",\n            \"BuildIssue\": \"\\uF319\",\n            \"AssessmentGroup\": \"\\uF31A\",\n            \"VariableGroup\": \"\\uF31B\",\n            \"FullHistory\": \"\\uF31C\",\n            \"Wheelchair\": \"\\uF31F\",\n            \"SingleColumnEdit\": \"\\uF321\",\n            \"DoubleColumnEdit\": \"\\uF322\",\n            \"TripleColumnEdit\": \"\\uF323\",\n            \"ColumnLeftTwoThirdsEdit\": \"\\uF324\",\n            \"ColumnRightTwoThirdsEdit\": \"\\uF325\",\n            \"StreamLogo\": \"\\uF329\",\n            \"PassiveAuthentication\": \"\\uF32A\",\n            \"AlertSolid\": \"\\uF331\",\n            \"MegaphoneSolid\": \"\\uF332\",\n            \"TaskSolid\": \"\\uF333\",\n            \"ConfigurationSolid\": \"\\uF334\",\n            \"BugSolid\": \"\\uF335\",\n            \"CrownSolid\": \"\\uF336\",\n            \"Trophy2Solid\": \"\\uF337\",\n            \"QuickNoteSolid\": \"\\uF338\",\n            \"ConstructionConeSolid\": \"\\uF339\",\n            \"PageListSolid\": \"\\uF33A\",\n            \"PageListMirroredSolid\": \"\\uF33B\",\n            \"StarburstSolid\": \"\\uF33C\",\n            \"ReadingModeSolid\": \"\\uF33D\",\n            \"SadSolid\": \"\\uF33E\",\n            \"HealthSolid\": \"\\uF33F\",\n            \"ShieldSolid\": \"\\uF340\",\n            \"GiftBoxSolid\": \"\\uF341\",\n            \"ShoppingCartSolid\": \"\\uF342\",\n            \"MailSolid\": \"\\uF343\",\n            \"ChatSolid\": \"\\uF344\",\n            \"RibbonSolid\": \"\\uF345\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gjo0s\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-12\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-12-7e945a1e.woff') format('woff')\"\n        },\n        icons: {\n            \"FinancialSolid\": \"\\uF346\",\n            \"FinancialMirroredSolid\": \"\\uF347\",\n            \"HeadsetSolid\": \"\\uF348\",\n            \"PermissionsSolid\": \"\\uF349\",\n            \"ParkingSolid\": \"\\uF34A\",\n            \"ParkingMirroredSolid\": \"\\uF34B\",\n            \"DiamondSolid\": \"\\uF34C\",\n            \"AsteriskSolid\": \"\\uF34D\",\n            \"OfflineStorageSolid\": \"\\uF34E\",\n            \"BankSolid\": \"\\uF34F\",\n            \"DecisionSolid\": \"\\uF350\",\n            \"Parachute\": \"\\uF351\",\n            \"ParachuteSolid\": \"\\uF352\",\n            \"FiltersSolid\": \"\\uF353\",\n            \"ColorSolid\": \"\\uF354\",\n            \"ReviewSolid\": \"\\uF355\",\n            \"ReviewRequestSolid\": \"\\uF356\",\n            \"ReviewRequestMirroredSolid\": \"\\uF357\",\n            \"ReviewResponseSolid\": \"\\uF358\",\n            \"FeedbackRequestSolid\": \"\\uF359\",\n            \"FeedbackRequestMirroredSolid\": \"\\uF35A\",\n            \"FeedbackResponseSolid\": \"\\uF35B\",\n            \"WorkItemBar\": \"\\uF35C\",\n            \"WorkItemBarSolid\": \"\\uF35D\",\n            \"Separator\": \"\\uF35E\",\n            \"NavigateExternalInline\": \"\\uF35F\",\n            \"PlanView\": \"\\uF360\",\n            \"TimelineMatrixView\": \"\\uF361\",\n            \"EngineeringGroup\": \"\\uF362\",\n            \"ProjectCollection\": \"\\uF363\",\n            \"CaretBottomRightCenter8\": \"\\uF364\",\n            \"CaretBottomLeftCenter8\": \"\\uF365\",\n            \"CaretTopRightCenter8\": \"\\uF366\",\n            \"CaretTopLeftCenter8\": \"\\uF367\",\n            \"DonutChart\": \"\\uF368\",\n            \"ChevronUnfold10\": \"\\uF369\",\n            \"ChevronFold10\": \"\\uF36A\",\n            \"DoubleChevronDown8\": \"\\uF36B\",\n            \"DoubleChevronUp8\": \"\\uF36C\",\n            \"DoubleChevronLeft8\": \"\\uF36D\",\n            \"DoubleChevronRight8\": \"\\uF36E\",\n            \"ChevronDownEnd6\": \"\\uF36F\",\n            \"ChevronUpEnd6\": \"\\uF370\",\n            \"ChevronLeftEnd6\": \"\\uF371\",\n            \"ChevronRightEnd6\": \"\\uF372\",\n            \"ContextMenu\": \"\\uF37C\",\n            \"AzureAPIManagement\": \"\\uF37F\",\n            \"AzureServiceEndpoint\": \"\\uF380\",\n            \"VSTSLogo\": \"\\uF381\",\n            \"VSTSAltLogo1\": \"\\uF382\",\n            \"VSTSAltLogo2\": \"\\uF383\",\n            \"FileTypeSolution\": \"\\uF387\",\n            \"WordLogoInverse16\": \"\\uF390\",\n            \"WordLogo16\": \"\\uF391\",\n            \"WordLogoFill16\": \"\\uF392\",\n            \"PowerPointLogoInverse16\": \"\\uF393\",\n            \"PowerPointLogo16\": \"\\uF394\",\n            \"PowerPointLogoFill16\": \"\\uF395\",\n            \"ExcelLogoInverse16\": \"\\uF396\",\n            \"ExcelLogo16\": \"\\uF397\",\n            \"ExcelLogoFill16\": \"\\uF398\",\n            \"OneNoteLogoInverse16\": \"\\uF399\",\n            \"OneNoteLogo16\": \"\\uF39A\",\n            \"OneNoteLogoFill16\": \"\\uF39B\",\n            \"OutlookLogoInverse16\": \"\\uF39C\",\n            \"OutlookLogo16\": \"\\uF39D\",\n            \"OutlookLogoFill16\": \"\\uF39E\",\n            \"PublisherLogoInverse16\": \"\\uF39F\",\n            \"PublisherLogo16\": \"\\uF3A0\",\n            \"PublisherLogoFill16\": \"\\uF3A1\",\n            \"VisioLogoInverse16\": \"\\uF3A2\",\n            \"VisioLogo16\": \"\\uF3A3\",\n            \"VisioLogoFill16\": \"\\uF3A4\",\n            \"TestBeaker\": \"\\uF3A5\",\n            \"TestBeakerSolid\": \"\\uF3A6\",\n            \"TestExploreSolid\": \"\\uF3A7\",\n            \"TestAutoSolid\": \"\\uF3A8\",\n            \"TestUserSolid\": \"\\uF3A9\",\n            \"TestImpactSolid\": \"\\uF3AA\",\n            \"TestPlan\": \"\\uF3AB\",\n            \"TestStep\": \"\\uF3AC\",\n            \"TestParameter\": \"\\uF3AD\",\n            \"TestSuite\": \"\\uF3AE\",\n            \"TestCase\": \"\\uF3AF\",\n            \"Sprint\": \"\\uF3B0\",\n            \"SignOut\": \"\\uF3B1\",\n            \"TriggerApproval\": \"\\uF3B2\",\n            \"Rocket\": \"\\uF3B3\",\n            \"AzureKeyVault\": \"\\uF3B4\",\n            \"Onboarding\": \"\\uF3BA\",\n            \"Transition\": \"\\uF3BC\",\n            \"LikeSolid\": \"\\uF3BF\",\n            \"DislikeSolid\": \"\\uF3C0\",\n            \"CRMCustomerInsightsApp\": \"\\uF3C8\",\n            \"EditCreate\": \"\\uF3C9\",\n            \"PlayReverseResume\": \"\\uF3E4\",\n            \"PlayReverse\": \"\\uF3E5\",\n            \"SearchData\": \"\\uF3F1\",\n            \"UnSetColor\": \"\\uF3F9\",\n            \"DeclineCall\": \"\\uF405\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d80Q4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-13\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-13-c3989a02.woff') format('woff')\"\n        },\n        icons: {\n            \"RectangularClipping\": \"\\uF407\",\n            \"TeamsLogo16\": \"\\uF40A\",\n            \"TeamsLogoFill16\": \"\\uF40B\",\n            \"Spacer\": \"\\uF40D\",\n            \"SkypeLogo16\": \"\\uF40E\",\n            \"SkypeForBusinessLogo16\": \"\\uF40F\",\n            \"SkypeForBusinessLogoFill16\": \"\\uF410\",\n            \"FilterSolid\": \"\\uF412\",\n            \"MailUndelivered\": \"\\uF415\",\n            \"MailTentative\": \"\\uF416\",\n            \"MailTentativeMirrored\": \"\\uF417\",\n            \"MailReminder\": \"\\uF418\",\n            \"ReceiptUndelivered\": \"\\uF419\",\n            \"ReceiptTentative\": \"\\uF41A\",\n            \"ReceiptTentativeMirrored\": \"\\uF41B\",\n            \"Inbox\": \"\\uF41C\",\n            \"IRMReply\": \"\\uF41D\",\n            \"IRMReplyMirrored\": \"\\uF41E\",\n            \"IRMForward\": \"\\uF41F\",\n            \"IRMForwardMirrored\": \"\\uF420\",\n            \"VoicemailIRM\": \"\\uF421\",\n            \"EventAccepted\": \"\\uF422\",\n            \"EventTentative\": \"\\uF423\",\n            \"EventTentativeMirrored\": \"\\uF424\",\n            \"EventDeclined\": \"\\uF425\",\n            \"IDBadge\": \"\\uF427\",\n            \"BackgroundColor\": \"\\uF42B\",\n            \"OfficeFormsLogoInverse16\": \"\\uF433\",\n            \"OfficeFormsLogo\": \"\\uF434\",\n            \"OfficeFormsLogoFill\": \"\\uF435\",\n            \"OfficeFormsLogo16\": \"\\uF436\",\n            \"OfficeFormsLogoFill16\": \"\\uF437\",\n            \"OfficeFormsLogoInverse24\": \"\\uF43A\",\n            \"OfficeFormsLogo24\": \"\\uF43B\",\n            \"OfficeFormsLogoFill24\": \"\\uF43C\",\n            \"PageLock\": \"\\uF43F\",\n            \"NotExecuted\": \"\\uF440\",\n            \"NotImpactedSolid\": \"\\uF441\",\n            \"FieldReadOnly\": \"\\uF442\",\n            \"FieldRequired\": \"\\uF443\",\n            \"BacklogBoard\": \"\\uF444\",\n            \"ExternalBuild\": \"\\uF445\",\n            \"ExternalTFVC\": \"\\uF446\",\n            \"ExternalXAML\": \"\\uF447\",\n            \"IssueSolid\": \"\\uF448\",\n            \"DefectSolid\": \"\\uF449\",\n            \"LadybugSolid\": \"\\uF44A\",\n            \"NugetLogo\": \"\\uF44C\",\n            \"TFVCLogo\": \"\\uF44D\",\n            \"ProjectLogo32\": \"\\uF47E\",\n            \"ProjectLogoFill32\": \"\\uF47F\",\n            \"ProjectLogo16\": \"\\uF480\",\n            \"ProjectLogoFill16\": \"\\uF481\",\n            \"SwayLogo32\": \"\\uF482\",\n            \"SwayLogoFill32\": \"\\uF483\",\n            \"SwayLogo16\": \"\\uF484\",\n            \"SwayLogoFill16\": \"\\uF485\",\n            \"ClassNotebookLogo32\": \"\\uF486\",\n            \"ClassNotebookLogoFill32\": \"\\uF487\",\n            \"ClassNotebookLogo16\": \"\\uF488\",\n            \"ClassNotebookLogoFill16\": \"\\uF489\",\n            \"ClassNotebookLogoInverse32\": \"\\uF48A\",\n            \"ClassNotebookLogoInverse16\": \"\\uF48B\",\n            \"StaffNotebookLogo32\": \"\\uF48C\",\n            \"StaffNotebookLogoFill32\": \"\\uF48D\",\n            \"StaffNotebookLogo16\": \"\\uF48E\",\n            \"StaffNotebookLogoFill16\": \"\\uF48F\",\n            \"StaffNotebookLogoInverted32\": \"\\uF490\",\n            \"StaffNotebookLogoInverted16\": \"\\uF491\",\n            \"KaizalaLogo\": \"\\uF492\",\n            \"TaskLogo\": \"\\uF493\",\n            \"ProtectionCenterLogo32\": \"\\uF494\",\n            \"GallatinLogo\": \"\\uF496\",\n            \"Globe2\": \"\\uF49A\",\n            \"Guitar\": \"\\uF49B\",\n            \"Breakfast\": \"\\uF49C\",\n            \"Brunch\": \"\\uF49D\",\n            \"BeerMug\": \"\\uF49E\",\n            \"Vacation\": \"\\uF49F\",\n            \"Teeth\": \"\\uF4A0\",\n            \"Taxi\": \"\\uF4A1\",\n            \"Chopsticks\": \"\\uF4A2\",\n            \"SyncOccurence\": \"\\uF4A3\",\n            \"UnsyncOccurence\": \"\\uF4A4\",\n            \"GIF\": \"\\uF4A9\",\n            \"PrimaryCalendar\": \"\\uF4AE\",\n            \"SearchCalendar\": \"\\uF4AF\",\n            \"VideoOff\": \"\\uF4B0\",\n            \"MicrosoftFlowLogo\": \"\\uF4B1\",\n            \"BusinessCenterLogo\": \"\\uF4B2\",\n            \"ToDoLogoBottom\": \"\\uF4B3\",\n            \"ToDoLogoTop\": \"\\uF4B4\",\n            \"EditSolid12\": \"\\uF4B5\",\n            \"EditSolidMirrored12\": \"\\uF4B6\",\n            \"UneditableSolid12\": \"\\uF4B7\",\n            \"UneditableSolidMirrored12\": \"\\uF4B8\",\n            \"UneditableMirrored\": \"\\uF4B9\",\n            \"AdminALogo32\": \"\\uF4BA\",\n            \"AdminALogoFill32\": \"\\uF4BB\",\n            \"ToDoLogoInverse\": \"\\uF4BC\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"boBmt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-14\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-14-5cf58db8.woff') format('woff')\"\n        },\n        icons: {\n            \"Snooze\": \"\\uF4BD\",\n            \"WaffleOffice365\": \"\\uF4E0\",\n            \"ImageSearch\": \"\\uF4E8\",\n            \"NewsSearch\": \"\\uF4E9\",\n            \"VideoSearch\": \"\\uF4EA\",\n            \"R\": \"\\uF4EB\",\n            \"FontColorA\": \"\\uF4EC\",\n            \"FontColorSwatch\": \"\\uF4ED\",\n            \"LightWeight\": \"\\uF4EE\",\n            \"NormalWeight\": \"\\uF4EF\",\n            \"SemiboldWeight\": \"\\uF4F0\",\n            \"GroupObject\": \"\\uF4F1\",\n            \"UngroupObject\": \"\\uF4F2\",\n            \"AlignHorizontalLeft\": \"\\uF4F3\",\n            \"AlignHorizontalCenter\": \"\\uF4F4\",\n            \"AlignHorizontalRight\": \"\\uF4F5\",\n            \"AlignVerticalTop\": \"\\uF4F6\",\n            \"AlignVerticalCenter\": \"\\uF4F7\",\n            \"AlignVerticalBottom\": \"\\uF4F8\",\n            \"HorizontalDistributeCenter\": \"\\uF4F9\",\n            \"VerticalDistributeCenter\": \"\\uF4FA\",\n            \"Ellipse\": \"\\uF4FB\",\n            \"Line\": \"\\uF4FC\",\n            \"Octagon\": \"\\uF4FD\",\n            \"Hexagon\": \"\\uF4FE\",\n            \"Pentagon\": \"\\uF4FF\",\n            \"RightTriangle\": \"\\uF500\",\n            \"HalfCircle\": \"\\uF501\",\n            \"QuarterCircle\": \"\\uF502\",\n            \"ThreeQuarterCircle\": \"\\uF503\",\n            \"6PointStar\": \"\\uF504\",\n            \"12PointStar\": \"\\uF505\",\n            \"ArrangeBringToFront\": \"\\uF506\",\n            \"ArrangeSendToBack\": \"\\uF507\",\n            \"ArrangeSendBackward\": \"\\uF508\",\n            \"ArrangeBringForward\": \"\\uF509\",\n            \"BorderDash\": \"\\uF50A\",\n            \"BorderDot\": \"\\uF50B\",\n            \"LineStyle\": \"\\uF50C\",\n            \"LineThickness\": \"\\uF50D\",\n            \"WindowEdit\": \"\\uF50E\",\n            \"HintText\": \"\\uF50F\",\n            \"MediaAdd\": \"\\uF510\",\n            \"AnchorLock\": \"\\uF511\",\n            \"AutoHeight\": \"\\uF512\",\n            \"ChartSeries\": \"\\uF513\",\n            \"ChartXAngle\": \"\\uF514\",\n            \"ChartYAngle\": \"\\uF515\",\n            \"Combobox\": \"\\uF516\",\n            \"LineSpacing\": \"\\uF517\",\n            \"Padding\": \"\\uF518\",\n            \"PaddingTop\": \"\\uF519\",\n            \"PaddingBottom\": \"\\uF51A\",\n            \"PaddingLeft\": \"\\uF51B\",\n            \"PaddingRight\": \"\\uF51C\",\n            \"NavigationFlipper\": \"\\uF51D\",\n            \"AlignJustify\": \"\\uF51E\",\n            \"TextOverflow\": \"\\uF51F\",\n            \"VisualsFolder\": \"\\uF520\",\n            \"VisualsStore\": \"\\uF521\",\n            \"PictureCenter\": \"\\uF522\",\n            \"PictureFill\": \"\\uF523\",\n            \"PicturePosition\": \"\\uF524\",\n            \"PictureStretch\": \"\\uF525\",\n            \"PictureTile\": \"\\uF526\",\n            \"Slider\": \"\\uF527\",\n            \"SliderHandleSize\": \"\\uF528\",\n            \"DefaultRatio\": \"\\uF529\",\n            \"NumberSequence\": \"\\uF52A\",\n            \"GUID\": \"\\uF52B\",\n            \"ReportAdd\": \"\\uF52C\",\n            \"DashboardAdd\": \"\\uF52D\",\n            \"MapPinSolid\": \"\\uF52E\",\n            \"WebPublish\": \"\\uF52F\",\n            \"PieSingleSolid\": \"\\uF530\",\n            \"BlockedSolid\": \"\\uF531\",\n            \"DrillDown\": \"\\uF532\",\n            \"DrillDownSolid\": \"\\uF533\",\n            \"DrillExpand\": \"\\uF534\",\n            \"DrillShow\": \"\\uF535\",\n            \"SpecialEvent\": \"\\uF536\",\n            \"OneDriveFolder16\": \"\\uF53B\",\n            \"FunctionalManagerDashboard\": \"\\uF542\",\n            \"BIDashboard\": \"\\uF543\",\n            \"CodeEdit\": \"\\uF544\",\n            \"RenewalCurrent\": \"\\uF545\",\n            \"RenewalFuture\": \"\\uF546\",\n            \"SplitObject\": \"\\uF547\",\n            \"BulkUpload\": \"\\uF548\",\n            \"DownloadDocument\": \"\\uF549\",\n            \"GreetingCard\": \"\\uF54B\",\n            \"Flower\": \"\\uF54E\",\n            \"WaitlistConfirm\": \"\\uF550\",\n            \"WaitlistConfirmMirrored\": \"\\uF551\",\n            \"LaptopSecure\": \"\\uF552\",\n            \"DragObject\": \"\\uF553\",\n            \"EntryView\": \"\\uF554\",\n            \"EntryDecline\": \"\\uF555\",\n            \"ContactCardSettings\": \"\\uF556\",\n            \"ContactCardSettingsMirrored\": \"\\uF557\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1gMob\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-15\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-15-3807251b.woff') format('woff')\"\n        },\n        icons: {\n            \"CalendarSettings\": \"\\uF558\",\n            \"CalendarSettingsMirrored\": \"\\uF559\",\n            \"HardDriveLock\": \"\\uF55A\",\n            \"HardDriveUnlock\": \"\\uF55B\",\n            \"AccountManagement\": \"\\uF55C\",\n            \"ReportWarning\": \"\\uF569\",\n            \"TransitionPop\": \"\\uF5B2\",\n            \"TransitionPush\": \"\\uF5B3\",\n            \"TransitionEffect\": \"\\uF5B4\",\n            \"LookupEntities\": \"\\uF5B5\",\n            \"ExploreData\": \"\\uF5B6\",\n            \"AddBookmark\": \"\\uF5B7\",\n            \"SearchBookmark\": \"\\uF5B8\",\n            \"DrillThrough\": \"\\uF5B9\",\n            \"MasterDatabase\": \"\\uF5BA\",\n            \"CertifiedDatabase\": \"\\uF5BB\",\n            \"MaximumValue\": \"\\uF5BC\",\n            \"MinimumValue\": \"\\uF5BD\",\n            \"VisualStudioIDELogo32\": \"\\uF5D0\",\n            \"PasteAsText\": \"\\uF5D5\",\n            \"PasteAsCode\": \"\\uF5D6\",\n            \"BrowserTab\": \"\\uF5D7\",\n            \"BrowserTabScreenshot\": \"\\uF5D8\",\n            \"DesktopScreenshot\": \"\\uF5D9\",\n            \"FileYML\": \"\\uF5DA\",\n            \"ClipboardSolid\": \"\\uF5DC\",\n            \"FabricUserFolder\": \"\\uF5E5\",\n            \"FabricNetworkFolder\": \"\\uF5E6\",\n            \"BullseyeTarget\": \"\\uF5F0\",\n            \"AnalyticsView\": \"\\uF5F1\",\n            \"Video360Generic\": \"\\uF609\",\n            \"Untag\": \"\\uF60B\",\n            \"Leave\": \"\\uF627\",\n            \"Trending12\": \"\\uF62D\",\n            \"Blocked12\": \"\\uF62E\",\n            \"Warning12\": \"\\uF62F\",\n            \"CheckedOutByOther12\": \"\\uF630\",\n            \"CheckedOutByYou12\": \"\\uF631\",\n            \"CircleShapeSolid\": \"\\uF63C\",\n            \"SquareShapeSolid\": \"\\uF63D\",\n            \"TriangleShapeSolid\": \"\\uF63E\",\n            \"DropShapeSolid\": \"\\uF63F\",\n            \"RectangleShapeSolid\": \"\\uF640\",\n            \"ZoomToFit\": \"\\uF649\",\n            \"InsertColumnsLeft\": \"\\uF64A\",\n            \"InsertColumnsRight\": \"\\uF64B\",\n            \"InsertRowsAbove\": \"\\uF64C\",\n            \"InsertRowsBelow\": \"\\uF64D\",\n            \"DeleteColumns\": \"\\uF64E\",\n            \"DeleteRows\": \"\\uF64F\",\n            \"DeleteRowsMirrored\": \"\\uF650\",\n            \"DeleteTable\": \"\\uF651\",\n            \"AccountBrowser\": \"\\uF652\",\n            \"VersionControlPush\": \"\\uF664\",\n            \"StackedColumnChart2\": \"\\uF666\",\n            \"TripleColumnWide\": \"\\uF66E\",\n            \"QuadColumn\": \"\\uF66F\",\n            \"WhiteBoardApp16\": \"\\uF673\",\n            \"WhiteBoardApp32\": \"\\uF674\",\n            \"PinnedSolid\": \"\\uF676\",\n            \"InsertSignatureLine\": \"\\uF677\",\n            \"ArrangeByFrom\": \"\\uF678\",\n            \"Phishing\": \"\\uF679\",\n            \"CreateMailRule\": \"\\uF67A\",\n            \"PublishCourse\": \"\\uF699\",\n            \"DictionaryRemove\": \"\\uF69A\",\n            \"UserRemove\": \"\\uF69B\",\n            \"UserEvent\": \"\\uF69C\",\n            \"Encryption\": \"\\uF69D\",\n            \"PasswordField\": \"\\uF6AA\",\n            \"OpenInNewTab\": \"\\uF6AB\",\n            \"Hide3\": \"\\uF6AC\",\n            \"VerifiedBrandSolid\": \"\\uF6AD\",\n            \"MarkAsProtected\": \"\\uF6AE\",\n            \"AuthenticatorApp\": \"\\uF6B1\",\n            \"WebTemplate\": \"\\uF6B2\",\n            \"DefenderTVM\": \"\\uF6B3\",\n            \"MedalSolid\": \"\\uF6B9\",\n            \"D365TalentLearn\": \"\\uF6BB\",\n            \"D365TalentInsight\": \"\\uF6BC\",\n            \"D365TalentHRCore\": \"\\uF6BD\",\n            \"BacklogList\": \"\\uF6BF\",\n            \"ButtonControl\": \"\\uF6C0\",\n            \"TableGroup\": \"\\uF6D9\",\n            \"MountainClimbing\": \"\\uF6DB\",\n            \"TagUnknown\": \"\\uF6DF\",\n            \"TagUnknownMirror\": \"\\uF6E0\",\n            \"TagUnknown12\": \"\\uF6E1\",\n            \"TagUnknown12Mirror\": \"\\uF6E2\",\n            \"Link12\": \"\\uF6E3\",\n            \"Presentation\": \"\\uF6E4\",\n            \"Presentation12\": \"\\uF6E5\",\n            \"Lock12\": \"\\uF6E6\",\n            \"BuildDefinition\": \"\\uF6E9\",\n            \"ReleaseDefinition\": \"\\uF6EA\",\n            \"SaveTemplate\": \"\\uF6EC\",\n            \"UserGauge\": \"\\uF6ED\",\n            \"BlockedSiteSolid12\": \"\\uF70A\",\n            \"TagSolid\": \"\\uF70E\",\n            \"OfficeChat\": \"\\uF70F\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jQGeT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-16\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-16-9cf93f3b.woff') format('woff')\"\n        },\n        icons: {\n            \"OfficeChatSolid\": \"\\uF710\",\n            \"MailSchedule\": \"\\uF72E\",\n            \"WarningSolid\": \"\\uF736\",\n            \"Blocked2Solid\": \"\\uF737\",\n            \"SkypeCircleArrow\": \"\\uF747\",\n            \"SkypeArrow\": \"\\uF748\",\n            \"SyncStatus\": \"\\uF751\",\n            \"SyncStatusSolid\": \"\\uF752\",\n            \"ProjectDocument\": \"\\uF759\",\n            \"ToDoLogoOutline\": \"\\uF75B\",\n            \"VisioOnlineLogoFill32\": \"\\uF75F\",\n            \"VisioOnlineLogo32\": \"\\uF760\",\n            \"VisioOnlineLogoCloud32\": \"\\uF761\",\n            \"VisioDiagramSync\": \"\\uF762\",\n            \"Event12\": \"\\uF763\",\n            \"EventDateMissed12\": \"\\uF764\",\n            \"UserOptional\": \"\\uF767\",\n            \"ResponsesMenu\": \"\\uF768\",\n            \"DoubleDownArrow\": \"\\uF769\",\n            \"DistributeDown\": \"\\uF76A\",\n            \"BookmarkReport\": \"\\uF76B\",\n            \"FilterSettings\": \"\\uF76C\",\n            \"GripperDotsVertical\": \"\\uF772\",\n            \"MailAttached\": \"\\uF774\",\n            \"AddIn\": \"\\uF775\",\n            \"LinkedDatabase\": \"\\uF779\",\n            \"TableLink\": \"\\uF77A\",\n            \"PromotedDatabase\": \"\\uF77D\",\n            \"BarChartVerticalFilter\": \"\\uF77E\",\n            \"BarChartVerticalFilterSolid\": \"\\uF77F\",\n            \"MicOff2\": \"\\uF781\",\n            \"MicrosoftTranslatorLogo\": \"\\uF782\",\n            \"ShowTimeAs\": \"\\uF787\",\n            \"FileRequest\": \"\\uF789\",\n            \"WorkItemAlert\": \"\\uF78F\",\n            \"PowerBILogo16\": \"\\uF790\",\n            \"PowerBILogoBackplate16\": \"\\uF791\",\n            \"BulletedListText\": \"\\uF792\",\n            \"BulletedListBullet\": \"\\uF793\",\n            \"BulletedListTextMirrored\": \"\\uF794\",\n            \"BulletedListBulletMirrored\": \"\\uF795\",\n            \"NumberedListText\": \"\\uF796\",\n            \"NumberedListNumber\": \"\\uF797\",\n            \"NumberedListTextMirrored\": \"\\uF798\",\n            \"NumberedListNumberMirrored\": \"\\uF799\",\n            \"RemoveLinkChain\": \"\\uF79A\",\n            \"RemoveLinkX\": \"\\uF79B\",\n            \"FabricTextHighlight\": \"\\uF79C\",\n            \"ClearFormattingA\": \"\\uF79D\",\n            \"ClearFormattingEraser\": \"\\uF79E\",\n            \"Photo2Fill\": \"\\uF79F\",\n            \"IncreaseIndentText\": \"\\uF7A0\",\n            \"IncreaseIndentArrow\": \"\\uF7A1\",\n            \"DecreaseIndentText\": \"\\uF7A2\",\n            \"DecreaseIndentArrow\": \"\\uF7A3\",\n            \"IncreaseIndentTextMirrored\": \"\\uF7A4\",\n            \"IncreaseIndentArrowMirrored\": \"\\uF7A5\",\n            \"DecreaseIndentTextMirrored\": \"\\uF7A6\",\n            \"DecreaseIndentArrowMirrored\": \"\\uF7A7\",\n            \"CheckListText\": \"\\uF7A8\",\n            \"CheckListCheck\": \"\\uF7A9\",\n            \"CheckListTextMirrored\": \"\\uF7AA\",\n            \"CheckListCheckMirrored\": \"\\uF7AB\",\n            \"NumberSymbol\": \"\\uF7AC\",\n            \"Coupon\": \"\\uF7BC\",\n            \"VerifiedBrand\": \"\\uF7BD\",\n            \"ReleaseGate\": \"\\uF7BE\",\n            \"ReleaseGateCheck\": \"\\uF7BF\",\n            \"ReleaseGateError\": \"\\uF7C0\",\n            \"M365InvoicingLogo\": \"\\uF7C1\",\n            \"RemoveFromShoppingList\": \"\\uF7D5\",\n            \"ShieldAlert\": \"\\uF7D7\",\n            \"FabricTextHighlightComposite\": \"\\uF7DA\",\n            \"Dataflows\": \"\\uF7DD\",\n            \"GenericScanFilled\": \"\\uF7DE\",\n            \"DiagnosticDataBarTooltip\": \"\\uF7DF\",\n            \"SaveToMobile\": \"\\uF7E0\",\n            \"Orientation2\": \"\\uF7E1\",\n            \"ScreenCast\": \"\\uF7E2\",\n            \"ShowGrid\": \"\\uF7E3\",\n            \"SnapToGrid\": \"\\uF7E4\",\n            \"ContactList\": \"\\uF7E5\",\n            \"NewMail\": \"\\uF7EA\",\n            \"EyeShadow\": \"\\uF7EB\",\n            \"FabricFolderConfirm\": \"\\uF7FF\",\n            \"InformationBarriers\": \"\\uF803\",\n            \"CommentActive\": \"\\uF804\",\n            \"ColumnVerticalSectionEdit\": \"\\uF806\",\n            \"WavingHand\": \"\\uF807\",\n            \"ShakeDevice\": \"\\uF80A\",\n            \"SmartGlassRemote\": \"\\uF80B\",\n            \"Rotate90Clockwise\": \"\\uF80D\",\n            \"Rotate90CounterClockwise\": \"\\uF80E\",\n            \"CampaignTemplate\": \"\\uF811\",\n            \"ChartTemplate\": \"\\uF812\",\n            \"PageListFilter\": \"\\uF813\",\n            \"SecondaryNav\": \"\\uF814\",\n            \"ColumnVerticalSection\": \"\\uF81E\",\n            \"SkypeCircleSlash\": \"\\uF825\",\n            \"SkypeSlash\": \"\\uF826\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jELYV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializeIcons\", ()=>initializeIcons);\n// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fluentui-assets-license\nvar _styling = require(\"@uifabric/styling\");\nfunction initializeIcons(baseUrl, options) {\n    if (baseUrl === void 0) baseUrl = \"\";\n    var subset = {\n        style: {\n            MozOsxFontSmoothing: \"grayscale\",\n            WebkitFontSmoothing: \"antialiased\",\n            fontStyle: \"normal\",\n            fontWeight: \"normal\",\n            speak: \"none\"\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons-17\"',\n            src: \"url('\" + baseUrl + \"fabric-icons-17-0c4ed701.woff') format('woff')\"\n        },\n        icons: {\n            \"CustomizeToolbar\": \"\\uF828\",\n            \"DuplicateRow\": \"\\uF82A\",\n            \"RemoveFromTrash\": \"\\uF82B\",\n            \"MailOptions\": \"\\uF82C\",\n            \"Childof\": \"\\uF82D\",\n            \"Footer\": \"\\uF82E\",\n            \"Header\": \"\\uF82F\",\n            \"BarChartVerticalFill\": \"\\uF830\",\n            \"StackedColumnChart2Fill\": \"\\uF831\",\n            \"PlainText\": \"\\uF834\",\n            \"AccessibiltyChecker\": \"\\uF835\",\n            \"DatabaseSync\": \"\\uF842\",\n            \"ReservationOrders\": \"\\uF845\",\n            \"TabOneColumn\": \"\\uF849\",\n            \"TabTwoColumn\": \"\\uF84A\",\n            \"TabThreeColumn\": \"\\uF84B\",\n            \"BulletedTreeList\": \"\\uF84C\",\n            \"MicrosoftTranslatorLogoGreen\": \"\\uF852\",\n            \"MicrosoftTranslatorLogoBlue\": \"\\uF853\",\n            \"InternalInvestigation\": \"\\uF854\",\n            \"AddReaction\": \"\\uF85D\",\n            \"ContactHeart\": \"\\uF862\",\n            \"VisuallyImpaired\": \"\\uF866\",\n            \"EventToDoLogo\": \"\\uF869\",\n            \"Variable2\": \"\\uF86D\",\n            \"ModelingView\": \"\\uF871\",\n            \"DisconnectVirtualMachine\": \"\\uF873\",\n            \"ReportLock\": \"\\uF875\",\n            \"Uneditable2\": \"\\uF876\",\n            \"Uneditable2Mirrored\": \"\\uF877\",\n            \"BarChartVerticalEdit\": \"\\uF89D\",\n            \"GlobalNavButtonActive\": \"\\uF89F\",\n            \"PollResults\": \"\\uF8A0\",\n            \"Rerun\": \"\\uF8A1\",\n            \"QandA\": \"\\uF8A2\",\n            \"QandAMirror\": \"\\uF8A3\",\n            \"BookAnswers\": \"\\uF8A4\",\n            \"AlertSettings\": \"\\uF8B6\",\n            \"TrimStart\": \"\\uF8BB\",\n            \"TrimEnd\": \"\\uF8BC\",\n            \"TableComputed\": \"\\uF8F5\",\n            \"DecreaseIndentLegacy\": \"\\uE290\",\n            \"IncreaseIndentLegacy\": \"\\uE291\",\n            \"SizeLegacy\": \"\\uE2B2\"\n        }\n    };\n    (0, _styling.registerIcons)(subset, options);\n}\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2V6Z1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"registerIconAliases\", ()=>registerIconAliases);\nvar _styling = require(\"@uifabric/styling\");\nvar registerIconAliases = function() {\n    (0, _styling.registerIconAlias)(\"trash\", \"delete\");\n    (0, _styling.registerIconAlias)(\"onedrive\", \"onedrivelogo\");\n    (0, _styling.registerIconAlias)(\"alertsolid12\", \"eventdatemissed12\");\n    (0, _styling.registerIconAlias)(\"sixpointstar\", \"6pointstar\");\n    (0, _styling.registerIconAlias)(\"twelvepointstar\", \"12pointstar\");\n    (0, _styling.registerIconAlias)(\"toggleon\", \"toggleleft\");\n    (0, _styling.registerIconAlias)(\"toggleoff\", \"toggleright\");\n};\nexports.default = registerIconAliases;\n\n},{\"@uifabric/styling\":\"ka8xC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gDGqZ\":[function(require,module,exports) {\n// Do not modify this file; it is generated as part of publish.\n// The checked in version is a placeholder only and will not be updated.\nvar _setVersion = require(\"@uifabric/set-version\");\n(0, _setVersion.setVersion)(\"@uifabric/icons\", \"7.7.1\");\n\n},{\"@uifabric/set-version\":\"896RR\"}],\"f54uM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _label = require(\"office-ui-fabric-react/lib/Label\");\nparcelHelpers.exportAll(_label, exports);\n\n},{\"office-ui-fabric-react/lib/Label\":\"lLA6C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fyJ0D\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _modal = require(\"office-ui-fabric-react/lib/Modal\");\nparcelHelpers.exportAll(_modal, exports);\n\n},{\"office-ui-fabric-react/lib/Modal\":\"1J5Mf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"brPQz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _slider = require(\"office-ui-fabric-react/lib/Slider\");\nparcelHelpers.exportAll(_slider, exports);\n\n},{\"office-ui-fabric-react/lib/Slider\":\"9mkQ7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9mkQ7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Slider/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Slider/index\":\"5qajw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5qajw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _slider = require(\"./Slider\");\nparcelHelpers.exportAll(_slider, exports);\nvar _sliderBase = require(\"./Slider.base\");\nparcelHelpers.exportAll(_sliderBase, exports);\n\n},{\"./Slider\":\"726ok\",\"./Slider.base\":\"cseR5\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"726ok\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Slider\", ()=>Slider);\nvar _utilities = require(\"../../Utilities\");\nvar _sliderBase = require(\"./Slider.base\");\nvar _sliderStyles = require(\"./Slider.styles\");\nvar Slider = (0, _utilities.styled)((0, _sliderBase.SliderBase), (0, _sliderStyles.getStyles), undefined, {\n    scope: \"Slider\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Slider.base\":\"cseR5\",\"./Slider.styles\":\"bDuP2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cseR5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ONKEYDOWN_TIMEOUT_DURATION\", ()=>ONKEYDOWN_TIMEOUT_DURATION);\nparcelHelpers.export(exports, \"SliderBase\", ()=>SliderBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _label = require(\"../../Label\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar COMPONENT_NAME = \"SliderBase\";\nvar ONKEYDOWN_TIMEOUT_DURATION = 1000;\nvar SliderBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(SliderBase1, _super);\n    function SliderBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._disposables = [];\n        _this._sliderLine = _react.createRef();\n        _this._thumb = _react.createRef();\n        _this._lowerValueThumb = _react.createRef();\n        _this._onKeyDownTimer = -1;\n        _this._isAdjustingLowerValue = false;\n        _this._getAriaValueText = function(value) {\n            var ariaValueText = _this.props.ariaValueText;\n            if (value !== undefined) return ariaValueText ? ariaValueText(value) : value.toString();\n            return undefined;\n        };\n        _this._calculateCurrentSteps = function(event) {\n            if (!_this._sliderLine.current) return;\n            var _a = _this.props, max = _a.max, min = _a.min, step = _a.step;\n            var steps = (max - min) / step;\n            var sliderPositionRect = _this._sliderLine.current.getBoundingClientRect();\n            var sliderLength = !_this.props.vertical ? sliderPositionRect.width : sliderPositionRect.height;\n            var stepLength = sliderLength / steps;\n            var currentSteps;\n            var distance;\n            if (!_this.props.vertical) {\n                var left = _this._getPosition(event, _this.props.vertical);\n                distance = (0, _utilities.getRTL)(_this.props.theme) ? sliderPositionRect.right - left : left - sliderPositionRect.left;\n                currentSteps = distance / stepLength;\n            } else {\n                var bottom = _this._getPosition(event, _this.props.vertical);\n                distance = sliderPositionRect.bottom - bottom;\n                currentSteps = distance / stepLength;\n            }\n            return currentSteps;\n        };\n        _this._onMouseDownOrTouchStart = function(event) {\n            var _a = _this.props, ranged = _a.ranged, min = _a.min, step = _a.step;\n            if (ranged) {\n                var currentSteps = _this._calculateCurrentSteps(event);\n                var newRenderedValue = min + step * currentSteps;\n                if (newRenderedValue <= _this.state.lowerValue || newRenderedValue - _this.state.lowerValue <= _this.state.value - newRenderedValue) _this._isAdjustingLowerValue = true;\n                else _this._isAdjustingLowerValue = false;\n            }\n            if (event.type === \"mousedown\") _this._disposables.push((0, _utilities.on)(window, \"mousemove\", _this._onMouseMoveOrTouchMove, true), (0, _utilities.on)(window, \"mouseup\", _this._onMouseUpOrTouchEnd, true));\n            else if (event.type === \"touchstart\") _this._disposables.push((0, _utilities.on)(window, \"touchmove\", _this._onMouseMoveOrTouchMove, true), (0, _utilities.on)(window, \"touchend\", _this._onMouseUpOrTouchEnd, true));\n            _this._onMouseMoveOrTouchMove(event, true);\n        };\n        _this._onMouseMoveOrTouchMove = function(event, suppressEventCancelation) {\n            if (!_this._sliderLine.current) return;\n            var _a = _this.props, max = _a.max, min = _a.min, step = _a.step;\n            var steps = (max - min) / step;\n            var currentSteps = _this._calculateCurrentSteps(event);\n            var currentValue;\n            var renderedValue;\n            // The value shouldn't be bigger than max or be smaller than min.\n            if (currentSteps > Math.floor(steps)) renderedValue = currentValue = max;\n            else if (currentSteps < 0) renderedValue = currentValue = min;\n            else {\n                renderedValue = min + step * currentSteps;\n                currentValue = min + step * Math.round(currentSteps);\n            }\n            _this._updateValue(currentValue, renderedValue);\n            if (!suppressEventCancelation) {\n                event.preventDefault();\n                event.stopPropagation();\n            }\n        };\n        _this._onMouseUpOrTouchEnd = function(event) {\n            // Disable renderedValue override.\n            _this.setState({\n                renderedValue: undefined,\n                renderedLowerValue: undefined\n            });\n            if (_this.props.onChanged) _this.props.onChanged(event, _this.state.value);\n            _this._disposeListeners();\n        };\n        _this._disposeListeners = function() {\n            _this._disposables.forEach(function(dispose) {\n                return dispose();\n            });\n            _this._disposables = [];\n        };\n        _this._onKeyDown = function(event) {\n            var value;\n            if (_this._isAdjustingLowerValue) value = _this.props.lowerValue || _this.state.lowerValue;\n            else value = _this.props.value || _this.state.value;\n            var _a = _this.props, max = _a.max, min = _a.min, step = _a.step;\n            var diff = 0;\n            // eslint-disable-next-line deprecation/deprecation\n            switch(event.which){\n                case (0, _utilities.getRTLSafeKeyCode)((0, _utilities.KeyCodes).left, _this.props.theme):\n                case (0, _utilities.KeyCodes).down:\n                    diff = -step;\n                    _this._clearOnKeyDownTimer();\n                    _this._setOnKeyDownTimer(event);\n                    break;\n                case (0, _utilities.getRTLSafeKeyCode)((0, _utilities.KeyCodes).right, _this.props.theme):\n                case (0, _utilities.KeyCodes).up:\n                    diff = step;\n                    _this._clearOnKeyDownTimer();\n                    _this._setOnKeyDownTimer(event);\n                    break;\n                case (0, _utilities.KeyCodes).home:\n                    value = min;\n                    _this._clearOnKeyDownTimer();\n                    _this._setOnKeyDownTimer(event);\n                    break;\n                case (0, _utilities.KeyCodes).end:\n                    value = max;\n                    _this._clearOnKeyDownTimer();\n                    _this._setOnKeyDownTimer(event);\n                    break;\n                default:\n                    return;\n            }\n            var newValue = Math.min(max, Math.max(min, value + diff));\n            _this._updateValue(newValue, newValue);\n            event.preventDefault();\n            event.stopPropagation();\n            // Disable renderedValue override.\n            _this.setState({\n                renderedValue: undefined,\n                renderedLowerValue: undefined\n            });\n        };\n        _this._onThumbFocus = function(event) {\n            _this._isAdjustingLowerValue = event.target === _this._lowerValueThumb.current;\n        };\n        _this._clearOnKeyDownTimer = function() {\n            _this._async.clearTimeout(_this._onKeyDownTimer);\n        };\n        _this._setOnKeyDownTimer = function(event) {\n            _this._onKeyDownTimer = _this._async.setTimeout(function() {\n                if (_this.props.onChanged) _this.props.onChanged(event, _this.state.value);\n            }, ONKEYDOWN_TIMEOUT_DURATION);\n        };\n        _this._async = new (0, _utilities.Async)(_this);\n        (0, _utilities.initializeComponentRef)(_this);\n        (0, _utilities.warnMutuallyExclusive)(COMPONENT_NAME, _this.props, {\n            value: \"defaultValue\"\n        });\n        if (props.ranged) (0, _utilities.warnMutuallyExclusive)(COMPONENT_NAME, _this.props, {\n            lowerValue: \"defaultLowerValue\"\n        });\n        _this._id = (0, _utilities.getId)(\"Slider\");\n        var value1 = props.value !== undefined ? props.value : props.defaultValue !== undefined ? props.defaultValue : props.min;\n        var lowerValue = props.lowerValue !== undefined ? props.lowerValue : props.defaultLowerValue !== undefined ? props.defaultLowerValue : props.min;\n        _this.state = {\n            value: value1,\n            lowerValue: lowerValue,\n            renderedValue: undefined,\n            renderedLowerValue: undefined\n        };\n        return _this;\n    }\n    SliderBase1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._disposeListeners();\n    };\n    SliderBase1.prototype.render = function() {\n        var _a, _b, _c;\n        var _d = this.props, ariaLabel = _d.ariaLabel, className = _d.className, disabled = _d.disabled, label = _d.label, max = _d.max, min = _d.min, showValue = _d.showValue, buttonProps = _d.buttonProps, vertical = _d.vertical, styles = _d.styles, theme = _d.theme, originFromZero = _d.originFromZero, ranged = _d.ranged;\n        var value = this.value;\n        var renderedValue = this.renderedValue;\n        var renderedLowerValue = this.renderedLowerValue;\n        var thumbOffsetPercent = this._getPercent(renderedValue);\n        var lowerThumbOffsetPercent = this._getPercent(renderedLowerValue);\n        var originValue = originFromZero ? 0 : min;\n        var originPercent = this._getPercent(originValue);\n        var activeSectionWidth = ranged ? thumbOffsetPercent - lowerThumbOffsetPercent : Math.abs(originPercent - thumbOffsetPercent);\n        var topSectionWidth = Math.min(100 - thumbOffsetPercent, 100 - originPercent);\n        var bottomSectionWidth = ranged ? lowerThumbOffsetPercent : Math.min(thumbOffsetPercent, originPercent);\n        var lengthString = vertical ? \"height\" : \"width\";\n        var onMouseDownProp = disabled ? {} : {\n            onMouseDown: this._onMouseDownOrTouchStart\n        };\n        var onTouchStartProp = disabled ? {} : {\n            onTouchStart: this._onMouseDownOrTouchStart\n        };\n        var onKeyDownProp = disabled ? {} : {\n            onKeyDown: this._onKeyDown\n        };\n        var onFocusProp = disabled ? {} : {\n            onFocus: this._onThumbFocus\n        };\n        var classNames = getClassNames(styles, {\n            className: className,\n            ranged: ranged,\n            disabled: disabled,\n            vertical: vertical,\n            showTransitions: renderedValue === value || ranged && renderedLowerValue === this.lowerValue,\n            showValue: showValue,\n            theme: theme\n        });\n        var divButtonProps = buttonProps ? (0, _utilities.getNativeProps)(buttonProps, (0, _utilities.divProperties)) : undefined;\n        var sliderProps = {\n            \"aria-disabled\": disabled,\n            role: \"slider\",\n            tabIndex: disabled ? undefined : 0,\n            \"data-is-focusable\": !disabled\n        };\n        var sliderBoxProps = (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({\n            id: this._id,\n            className: (0, _utilities.css)(classNames.slideBox, buttonProps.className)\n        }, onMouseDownProp), onTouchStartProp), onKeyDownProp), divButtonProps), !ranged && (0, _tslib.__assign)((0, _tslib.__assign)({}, sliderProps), {\n            \"aria-valuemin\": min,\n            \"aria-valuemax\": max,\n            \"aria-valuenow\": value,\n            \"aria-valuetext\": this._getAriaValueText(value),\n            \"aria-label\": ariaLabel || label\n        }));\n        var thumbProps = ranged ? (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, sliderProps), onFocusProp), {\n            id: \"max-\" + this._id,\n            \"aria-valuemin\": this.lowerValue,\n            \"aria-valuemax\": max,\n            \"aria-valuenow\": value,\n            \"aria-valuetext\": this._getAriaValueText(value),\n            \"aria-label\": \"max \" + (ariaLabel || label)\n        }) : undefined;\n        var lowerValueThumbProps = ranged ? (0, _tslib.__assign)((0, _tslib.__assign)((0, _tslib.__assign)({}, sliderProps), onFocusProp), {\n            id: \"min-\" + this._id,\n            \"aria-valuemin\": min,\n            \"aria-valuemax\": value,\n            \"aria-valuenow\": this.lowerValue,\n            \"aria-valuetext\": this._getAriaValueText(this.lowerValue),\n            \"aria-label\": \"min \" + (ariaLabel || label)\n        }) : undefined;\n        return _react.createElement(\"div\", {\n            className: classNames.root\n        }, label && _react.createElement((0, _label.Label), (0, _tslib.__assign)({\n            className: classNames.titleLabel\n        }, ariaLabel ? {} : {\n            htmlFor: this._id\n        }, {\n            disabled: disabled\n        }), label), _react.createElement(\"div\", {\n            className: classNames.container\n        }, ranged && showValue && _react.createElement((0, _label.Label), {\n            className: classNames.valueLabel,\n            disabled: disabled\n        }, this._getValueLabel(vertical ? this.value : this.lowerValue)), _react.createElement(\"div\", (0, _tslib.__assign)({}, sliderBoxProps), _react.createElement(\"div\", {\n            ref: this._sliderLine,\n            className: classNames.line\n        }, originFromZero && _react.createElement(\"span\", {\n            className: (0, _utilities.css)(classNames.zeroTick),\n            style: this._getStyleUsingOffsetPercent(vertical, originPercent)\n        }), ranged && _react.createElement(\"span\", (0, _tslib.__assign)({\n            ref: this._lowerValueThumb,\n            className: classNames.thumb,\n            style: this._getStyleUsingOffsetPercent(vertical, lowerThumbOffsetPercent)\n        }, lowerValueThumbProps)), _react.createElement(\"span\", (0, _tslib.__assign)({\n            ref: this._thumb,\n            className: classNames.thumb,\n            style: this._getStyleUsingOffsetPercent(vertical, thumbOffsetPercent)\n        }, thumbProps)), (ranged || originFromZero) && _react.createElement(\"span\", {\n            className: (0, _utilities.css)(classNames.lineContainer, classNames.inactiveSection),\n            style: (_a = {}, _a[lengthString] = bottomSectionWidth + \"%\", _a)\n        }), _react.createElement(\"span\", {\n            className: (0, _utilities.css)(classNames.lineContainer, classNames.activeSection),\n            style: (_b = {}, _b[lengthString] = activeSectionWidth + \"%\", _b)\n        }), _react.createElement(\"span\", {\n            className: (0, _utilities.css)(classNames.lineContainer, classNames.inactiveSection),\n            style: (_c = {}, _c[lengthString] = topSectionWidth + \"%\", _c)\n        }))), showValue && _react.createElement((0, _label.Label), {\n            className: classNames.valueLabel,\n            disabled: disabled\n        }, this._getValueLabel(ranged && vertical ? this.lowerValue : this.value))), _react.createElement((0, _utilities.FocusRects), null));\n    };\n    SliderBase1.prototype.focus = function() {\n        if (this._thumb.current) this._thumb.current.focus();\n    };\n    Object.defineProperty(SliderBase1.prototype, \"range\", {\n        get: function() {\n            if (this.props.ranged) return [\n                this.lowerValue,\n                this.value\n            ];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(SliderBase1.prototype, \"value\", {\n        get: function() {\n            var _a = this.props.value, value = _a === void 0 ? this.state.value : _a;\n            if (this.props.min === undefined || this.props.max === undefined || value === undefined) return undefined;\n            else return Math.max(this.props.min, Math.min(this.props.max, value));\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(SliderBase1.prototype, \"renderedValue\", {\n        get: function() {\n            // renderedValue is expected to be defined while user is interacting with control, otherwise `undefined`.\n            // Fall back to `value`.\n            var _a = this.state.renderedValue, renderedValue = _a === void 0 ? this.value : _a;\n            return renderedValue;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(SliderBase1.prototype, \"lowerValue\", {\n        get: function() {\n            var _a = this.props, _b = _a.lowerValue, lowerValue = _b === void 0 ? this.state.lowerValue : _b, ranged = _a.ranged;\n            if (!ranged || this.props.min === undefined || this.props.max === undefined || lowerValue === undefined) return undefined;\n            else return Math.max(this.props.min, Math.min(this.props.max, lowerValue));\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(SliderBase1.prototype, \"renderedLowerValue\", {\n        get: function() {\n            // renderedLowerValue is expected to be defined while user is interacting with control, otherwise `undefined`.\n            // Fall back to `lowerValue`.\n            var _a = this.state.renderedLowerValue, renderedLowerValue = _a === void 0 ? this.lowerValue : _a;\n            return renderedLowerValue;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    SliderBase1.prototype._getPercent = function(value) {\n        var _a = this.props, min = _a.min, max = _a.max;\n        return max === min ? 0 : (value - min) / (max - min) * 100;\n    };\n    SliderBase1.prototype._getValueLabel = function(value) {\n        var valueFormat = this.props.valueFormat;\n        return valueFormat ? valueFormat(value) : value;\n    };\n    SliderBase1.prototype._getStyleUsingOffsetPercent = function(vertical, thumbOffsetPercent) {\n        var _a;\n        var direction = vertical ? \"bottom\" : (0, _utilities.getRTL)(this.props.theme) ? \"right\" : \"left\";\n        return _a = {}, _a[direction] = thumbOffsetPercent + \"%\", _a;\n    };\n    SliderBase1.prototype._getPosition = function(event, vertical) {\n        var currentPosition;\n        switch(event.type){\n            case \"mousedown\":\n            case \"mousemove\":\n                currentPosition = !vertical ? event.clientX : event.clientY;\n                break;\n            case \"touchstart\":\n            case \"touchmove\":\n                currentPosition = !vertical ? event.touches[0].clientX : event.touches[0].clientY;\n                break;\n        }\n        return currentPosition;\n    };\n    SliderBase1.prototype._setValueState = function(roundedValue, renderedValue) {\n        var _a1;\n        var _this = this;\n        var isAdjustingLowerValue = this._isAdjustingLowerValue;\n        var valueChanged = roundedValue !== (isAdjustingLowerValue ? this.state.lowerValue : this.state.value);\n        this.setState((_a1 = {}, _a1[isAdjustingLowerValue ? \"lowerValue\" : \"value\"] = roundedValue, _a1[isAdjustingLowerValue ? \"renderedLowerValue\" : \"renderedValue\"] = renderedValue, _a1), function() {\n            var _a = _this.state, lowerValue = _a.lowerValue, value = _a.value;\n            if (valueChanged && _this.props.onChange) _this.props.onChange(isAdjustingLowerValue ? lowerValue : value, _this.props.ranged ? [\n                lowerValue,\n                value\n            ] : undefined);\n        });\n    };\n    SliderBase1.prototype._updateValue = function(value, renderedValue) {\n        var _a = this.props, step = _a.step, snapToStep = _a.snapToStep, ranged = _a.ranged, originFromZero = _a.originFromZero;\n        var numDec = 0;\n        if (isFinite(step)) while(Math.round(step * Math.pow(10, numDec)) / Math.pow(10, numDec) !== step)numDec++;\n        // Make sure value has correct number of decimal places based on number of decimals in step\n        var roundedValue = parseFloat(value.toFixed(numDec));\n        if (snapToStep) renderedValue = roundedValue;\n        var shouldAdjustLowerThumb = this._isAdjustingLowerValue && (originFromZero ? roundedValue <= 0 : roundedValue <= this.renderedValue);\n        var shouldAdjustUpperThumb = !this._isAdjustingLowerValue && (originFromZero ? roundedValue >= 0 : roundedValue >= this.renderedLowerValue);\n        if (!ranged || shouldAdjustLowerThumb || shouldAdjustUpperThumb) this._setValueState(roundedValue, renderedValue);\n    };\n    SliderBase1.defaultProps = {\n        step: 1,\n        min: 0,\n        max: 10,\n        showValue: true,\n        disabled: false,\n        vertical: false,\n        buttonProps: {},\n        originFromZero: false\n    };\n    return SliderBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../../Label\":\"lLA6C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bDuP2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"@uifabric/utilities\");\nvar GlobalClassNames = {\n    root: \"ms-Slider\",\n    enabled: \"ms-Slider-enabled\",\n    disabled: \"ms-Slider-disabled\",\n    row: \"ms-Slider-row\",\n    column: \"ms-Slider-column\",\n    container: \"ms-Slider-container\",\n    slideBox: \"ms-Slider-slideBox\",\n    line: \"ms-Slider-line\",\n    thumb: \"ms-Slider-thumb\",\n    activeSection: \"ms-Slider-active\",\n    inactiveSection: \"ms-Slider-inactive\",\n    valueLabel: \"ms-Slider-value\",\n    showValue: \"ms-Slider-showValue\",\n    showTransitions: \"ms-Slider-showTransitions\",\n    zeroTick: \"ms-Slider-zeroTick\"\n};\nvar getStyles = function(props) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;\n    var className = props.className, titleLabelClassName = props.titleLabelClassName, theme = props.theme, vertical = props.vertical, disabled = props.disabled, showTransitions = props.showTransitions, showValue = props.showValue, ranged = props.ranged;\n    var semanticColors = theme.semanticColors;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    /** Tokens:\n     *   The word \"active\" in the token refers to the selected section of the slider\n     *   The word \"inactive\" in the token refers to the unselected section of the slider */ var pressedActiveSectionColor = semanticColors.inputBackgroundCheckedHovered;\n    var hoveredActiveSectionColor = semanticColors.inputBackgroundChecked;\n    var hoveredPressedinactiveSectionColor = semanticColors.inputPlaceholderBackgroundChecked;\n    var restActiveSectionColor = semanticColors.smallInputBorder;\n    var restInactiveSectionColor = semanticColors.disabledBorder;\n    var disabledActiveSectionColor = semanticColors.disabledText;\n    var disabledInactiveSectionColor = semanticColors.disabledBackground;\n    var thumbBackgroundColor = semanticColors.inputBackground;\n    var thumbBorderColor = semanticColors.smallInputBorder;\n    var thumbDisabledBorderColor = semanticColors.disabledBorder;\n    var slideBoxActiveSectionStyles = !disabled && {\n        backgroundColor: pressedActiveSectionColor,\n        selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n            backgroundColor: \"Highlight\"\n        }, _a)\n    };\n    var slideBoxInactiveSectionStyles = !disabled && {\n        backgroundColor: hoveredPressedinactiveSectionColor,\n        selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n            borderColor: \"Highlight\"\n        }, _b)\n    };\n    var slideHoverSectionStyles = !disabled && {\n        backgroundColor: hoveredActiveSectionColor,\n        selectors: (_c = {}, _c[0, _styling.HighContrastSelector] = {\n            backgroundColor: \"Highlight\"\n        }, _c)\n    };\n    var slideBoxActiveThumbStyles = !disabled && {\n        border: \"2px solid \" + pressedActiveSectionColor,\n        selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = {\n            borderColor: \"Highlight\"\n        }, _d)\n    };\n    var slideBoxActiveZeroTickStyles = !props.disabled && {\n        backgroundColor: semanticColors.inputPlaceholderBackgroundChecked,\n        selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = {\n            backgroundColor: \"Highlight\"\n        }, _e)\n    };\n    return {\n        root: (0, _tslib.__spreadArrays)([\n            classNames.root,\n            theme.fonts.medium,\n            {\n                userSelect: \"none\"\n            },\n            vertical && {\n                marginRight: 8\n            }\n        ], [\n            !disabled ? classNames.enabled : undefined\n        ], [\n            disabled ? classNames.disabled : undefined\n        ], [\n            !vertical ? classNames.row : undefined\n        ], [\n            vertical ? classNames.column : undefined\n        ], [\n            className, \n        ]),\n        titleLabel: [\n            {\n                padding: 0\n            },\n            titleLabelClassName, \n        ],\n        container: [\n            classNames.container,\n            {\n                display: \"flex\",\n                flexWrap: \"nowrap\",\n                alignItems: \"center\"\n            },\n            vertical && {\n                flexDirection: \"column\",\n                height: \"100%\",\n                textAlign: \"center\",\n                margin: \"8px 0\"\n            }, \n        ],\n        slideBox: (0, _tslib.__spreadArrays)([\n            classNames.slideBox,\n            !ranged && (0, _styling.getFocusStyle)(theme),\n            {\n                background: \"transparent\",\n                border: \"none\",\n                flexGrow: 1,\n                lineHeight: 28,\n                display: \"flex\",\n                alignItems: \"center\",\n                selectors: (_f = {}, _f[\":active .\" + classNames.activeSection] = slideBoxActiveSectionStyles, _f[\":hover .\" + classNames.activeSection] = slideHoverSectionStyles, _f[\":active .\" + classNames.inactiveSection] = slideBoxInactiveSectionStyles, _f[\":hover .\" + classNames.inactiveSection] = slideBoxInactiveSectionStyles, _f[\":active .\" + classNames.thumb] = slideBoxActiveThumbStyles, _f[\":hover .\" + classNames.thumb] = slideBoxActiveThumbStyles, _f[\":active .\" + classNames.zeroTick] = slideBoxActiveZeroTickStyles, _f[\":hover .\" + classNames.zeroTick] = slideBoxActiveZeroTickStyles, _f[0, _styling.HighContrastSelector] = {\n                    forcedColorAdjust: \"none\"\n                }, _f)\n            },\n            vertical ? {\n                height: \"100%\",\n                width: 28,\n                padding: \"8px 0\"\n            } : {\n                height: 28,\n                width: \"auto\",\n                padding: \"0 8px\"\n            }\n        ], [\n            showValue ? classNames.showValue : undefined\n        ], [\n            showTransitions ? classNames.showTransitions : undefined\n        ]),\n        thumb: [\n            classNames.thumb,\n            ranged && (0, _styling.getFocusStyle)(theme, {\n                inset: -4\n            }),\n            {\n                borderWidth: 2,\n                borderStyle: \"solid\",\n                borderColor: thumbBorderColor,\n                borderRadius: 10,\n                boxSizing: \"border-box\",\n                background: thumbBackgroundColor,\n                display: \"block\",\n                width: 16,\n                height: 16,\n                position: \"absolute\"\n            },\n            vertical ? {\n                left: -6,\n                margin: \"0 auto\",\n                transform: \"translateY(8px)\"\n            } : {\n                top: -6,\n                transform: (0, _utilities.getRTL)(theme) ? \"translateX(50%)\" : \"translateX(-50%)\"\n            },\n            showTransitions && {\n                transition: \"left \" + (0, _styling.AnimationVariables).durationValue3 + \" \" + (0, _styling.AnimationVariables).easeFunction1\n            },\n            disabled && {\n                borderColor: thumbDisabledBorderColor,\n                selectors: (_g = {}, _g[0, _styling.HighContrastSelector] = {\n                    borderColor: \"GrayText\"\n                }, _g)\n            }, \n        ],\n        line: [\n            classNames.line,\n            {\n                display: \"flex\",\n                position: \"relative\"\n            },\n            vertical ? {\n                height: \"100%\",\n                width: 4,\n                margin: \"0 auto\",\n                flexDirection: \"column-reverse\"\n            } : {\n                width: \"100%\"\n            }, \n        ],\n        lineContainer: [\n            {\n                borderRadius: 4,\n                boxSizing: \"border-box\"\n            },\n            vertical ? {\n                width: 4,\n                height: \"100%\"\n            } : {\n                height: 4,\n                width: \"100%\"\n            }, \n        ],\n        activeSection: [\n            classNames.activeSection,\n            {\n                background: restActiveSectionColor,\n                selectors: (_h = {}, _h[0, _styling.HighContrastSelector] = {\n                    backgroundColor: \"WindowText\"\n                }, _h)\n            },\n            showTransitions && {\n                transition: \"width \" + (0, _styling.AnimationVariables).durationValue3 + \" \" + (0, _styling.AnimationVariables).easeFunction1\n            },\n            disabled && {\n                background: disabledActiveSectionColor,\n                selectors: (_j = {}, _j[0, _styling.HighContrastSelector] = {\n                    backgroundColor: \"GrayText\",\n                    borderColor: \"GrayText\"\n                }, _j)\n            }, \n        ],\n        inactiveSection: [\n            classNames.inactiveSection,\n            {\n                background: restInactiveSectionColor,\n                selectors: (_k = {}, _k[0, _styling.HighContrastSelector] = {\n                    border: \"1px solid WindowText\"\n                }, _k)\n            },\n            showTransitions && {\n                transition: \"width \" + (0, _styling.AnimationVariables).durationValue3 + \" \" + (0, _styling.AnimationVariables).easeFunction1\n            },\n            disabled && {\n                background: disabledInactiveSectionColor,\n                selectors: (_l = {}, _l[0, _styling.HighContrastSelector] = {\n                    borderColor: \"GrayText\"\n                }, _l)\n            }, \n        ],\n        zeroTick: [\n            classNames.zeroTick,\n            {\n                position: \"absolute\",\n                background: semanticColors.disabledBorder,\n                selectors: (_m = {}, _m[0, _styling.HighContrastSelector] = {\n                    backgroundColor: \"WindowText\"\n                }, _m)\n            },\n            props.disabled && {\n                background: semanticColors.disabledBackground,\n                selectors: (_o = {}, _o[0, _styling.HighContrastSelector] = {\n                    backgroundColor: \"GrayText\"\n                }, _o)\n            },\n            props.vertical ? {\n                width: \"16px\",\n                height: \"1px\",\n                transform: (0, _utilities.getRTL)(theme) ? \"translateX(6px)\" : \"translateX(-6px)\"\n            } : {\n                width: \"1px\",\n                height: \"16px\",\n                transform: \"translateY(-6px)\"\n            }, \n        ],\n        valueLabel: [\n            classNames.valueLabel,\n            {\n                flexShrink: 1,\n                width: 30,\n                lineHeight: \"1\"\n            },\n            vertical ? {\n                margin: \"0 auto\",\n                whiteSpace: \"nowrap\",\n                width: 40\n            } : {\n                margin: \"0 8px\",\n                whiteSpace: \"nowrap\",\n                width: 40\n            }, \n        ]\n    };\n};\n\n},{\"tslib\":\"01Tx1\",\"../../Styling\":\"7JwBd\",\"@uifabric/utilities\":\"uTCgd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dTo6e\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _spinner = require(\"office-ui-fabric-react/lib/Spinner\");\nparcelHelpers.exportAll(_spinner, exports);\n\n},{\"office-ui-fabric-react/lib/Spinner\":\"eb2i0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eb2i0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Spinner/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Spinner/index\":\"5cQSv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5cQSv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _spinner = require(\"./Spinner\");\nparcelHelpers.exportAll(_spinner, exports);\nvar _spinnerBase = require(\"./Spinner.base\");\nparcelHelpers.exportAll(_spinnerBase, exports);\nvar _spinnerTypes = require(\"./Spinner.types\");\nparcelHelpers.exportAll(_spinnerTypes, exports);\n\n},{\"./Spinner\":\"bHUI3\",\"./Spinner.base\":\"5Keq5\",\"./Spinner.types\":\"03bVM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bHUI3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Spinner\", ()=>Spinner);\nvar _utilities = require(\"../../Utilities\");\nvar _spinnerBase = require(\"./Spinner.base\");\nvar _spinnerStyles = require(\"./Spinner.styles\");\nvar Spinner = (0, _utilities.styled)((0, _spinnerBase.SpinnerBase), (0, _spinnerStyles.getStyles), undefined, {\n    scope: \"Spinner\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Spinner.base\":\"5Keq5\",\"./Spinner.styles\":\"d68b4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Keq5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SpinnerBase\", ()=>SpinnerBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _spinnerTypes = require(\"./Spinner.types\");\nvar _utilities = require(\"../../Utilities\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar SpinnerBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(SpinnerBase1, _super);\n    function SpinnerBase1() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    SpinnerBase1.prototype.render = function() {\n        // eslint-disable-next-line deprecation/deprecation\n        var _a = this.props, type = _a.type, size = _a.size, ariaLabel = _a.ariaLabel, ariaLive = _a.ariaLive, styles = _a.styles, label = _a.label, theme = _a.theme, className = _a.className, labelPosition = _a.labelPosition;\n        var statusMessage = ariaLabel;\n        var nativeProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.divProperties), [\n            \"size\"\n        ]);\n        // SpinnerType is deprecated. If someone is still using this property, rather than putting the SpinnerType into the\n        // ISpinnerStyleProps, we'll map SpinnerType to its equivalent SpinnerSize and pass that in. Once SpinnerType\n        // finally goes away we should delete this.\n        var styleSize = size;\n        if (styleSize === undefined && type !== undefined) // eslint-disable-next-line deprecation/deprecation\n        styleSize = type === (0, _spinnerTypes.SpinnerType).large ? (0, _spinnerTypes.SpinnerSize).large : (0, _spinnerTypes.SpinnerSize).medium;\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            size: styleSize,\n            className: className,\n            labelPosition: labelPosition\n        });\n        return _react.createElement(\"div\", (0, _tslib.__assign)({}, nativeProps, {\n            className: classNames.root\n        }), _react.createElement(\"div\", {\n            className: classNames.circle\n        }), label && _react.createElement(\"div\", {\n            className: classNames.label\n        }, label), statusMessage && _react.createElement(\"div\", {\n            role: \"status\",\n            \"aria-live\": ariaLive\n        }, _react.createElement((0, _utilities.DelayedRender), null, _react.createElement(\"div\", {\n            className: classNames.screenReaderText\n        }, statusMessage))));\n    };\n    SpinnerBase1.defaultProps = {\n        size: (0, _spinnerTypes.SpinnerSize).medium,\n        ariaLive: \"polite\",\n        labelPosition: \"bottom\"\n    };\n    return SpinnerBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"./Spinner.types\":\"03bVM\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"03bVM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SpinnerSize\", ()=>SpinnerSize);\nparcelHelpers.export(exports, \"SpinnerType\", ()=>SpinnerType);\nvar SpinnerSize;\n(function(SpinnerSize1) {\n    /**\n     * 12px Spinner diameter\n     */ SpinnerSize1[SpinnerSize1[\"xSmall\"] = 0] = \"xSmall\";\n    /**\n     * 16px Spinner diameter\n     */ SpinnerSize1[SpinnerSize1[\"small\"] = 1] = \"small\";\n    /**\n     * 20px Spinner diameter\n     */ SpinnerSize1[SpinnerSize1[\"medium\"] = 2] = \"medium\";\n    /**\n     * 28px Spinner diameter\n     */ SpinnerSize1[SpinnerSize1[\"large\"] = 3] = \"large\";\n})(SpinnerSize || (SpinnerSize = {}));\nvar SpinnerType;\n(function(SpinnerType1) {\n    /**\n     * Deprecated and will be removed at \\>= 2.0.0. Use `SpinnerSize.medium` instead.\n     * @deprecated Use `SpinnerSize.medium` instead.\n     */ SpinnerType1[SpinnerType1[\"normal\"] = 0] = \"normal\";\n    /**\n     * Deprecated and will be removed at \\>= 2.0.0. Use `SpinnerSize.large` instead.\n     * @deprecated Use `SpinnerSize.large` instead.\n     */ SpinnerType1[SpinnerType1[\"large\"] = 1] = \"large\";\n})(SpinnerType || (SpinnerType = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d68b4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _spinnerTypes = require(\"./Spinner.types\");\nvar _styling = require(\"../../Styling\");\nvar _utilities = require(\"../../Utilities\");\nvar GlobalClassNames = {\n    root: \"ms-Spinner\",\n    circle: \"ms-Spinner-circle\",\n    label: \"ms-Spinner-label\"\n};\nvar spinAnimation = (0, _utilities.memoizeFunction)(function() {\n    return (0, _styling.keyframes)({\n        \"0%\": {\n            transform: \"rotate(0deg)\"\n        },\n        \"100%\": {\n            transform: \"rotate(360deg)\"\n        }\n    });\n});\nvar getStyles = function(props) {\n    var _a;\n    var theme = props.theme, size = props.size, className = props.className, labelPosition = props.labelPosition;\n    var palette = theme.palette;\n    var classNames = (0, _styling.getGlobalClassNames)(GlobalClassNames, theme);\n    return {\n        root: [\n            classNames.root,\n            {\n                display: \"flex\",\n                flexDirection: \"column\",\n                alignItems: \"center\",\n                justifyContent: \"center\"\n            },\n            labelPosition === \"top\" && {\n                flexDirection: \"column-reverse\"\n            },\n            labelPosition === \"right\" && {\n                flexDirection: \"row\"\n            },\n            labelPosition === \"left\" && {\n                flexDirection: \"row-reverse\"\n            },\n            className, \n        ],\n        circle: [\n            classNames.circle,\n            {\n                boxSizing: \"border-box\",\n                borderRadius: \"50%\",\n                border: \"1.5px solid \" + palette.themeLight,\n                borderTopColor: palette.themePrimary,\n                animationName: spinAnimation(),\n                animationDuration: \"1.3s\",\n                animationIterationCount: \"infinite\",\n                animationTimingFunction: \"cubic-bezier(.53,.21,.29,.67)\",\n                selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                    borderTopColor: \"Highlight\"\n                }, (0, _styling.getHighContrastNoAdjustStyle)()), _a)\n            },\n            size === (0, _spinnerTypes.SpinnerSize).xSmall && [\n                \"ms-Spinner--xSmall\",\n                {\n                    width: 12,\n                    height: 12\n                }, \n            ],\n            size === (0, _spinnerTypes.SpinnerSize).small && [\n                \"ms-Spinner--small\",\n                {\n                    width: 16,\n                    height: 16\n                }, \n            ],\n            size === (0, _spinnerTypes.SpinnerSize).medium && [\n                \"ms-Spinner--medium\",\n                {\n                    width: 20,\n                    height: 20\n                }, \n            ],\n            size === (0, _spinnerTypes.SpinnerSize).large && [\n                \"ms-Spinner--large\",\n                {\n                    width: 28,\n                    height: 28\n                }, \n            ], \n        ],\n        label: [\n            classNames.label,\n            theme.fonts.small,\n            {\n                color: palette.themePrimary,\n                margin: \"8px 0 0\",\n                textAlign: \"center\"\n            },\n            labelPosition === \"top\" && {\n                margin: \"0 0 8px\"\n            },\n            labelPosition === \"right\" && {\n                margin: \"0 0 0 8px\"\n            },\n            labelPosition === \"left\" && {\n                margin: \"0 8px 0 0\"\n            }, \n        ],\n        screenReaderText: (0, _styling.hiddenContentStyle)\n    };\n};\n\n},{\"tslib\":\"01Tx1\",\"./Spinner.types\":\"03bVM\",\"../../Styling\":\"7JwBd\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6eVOz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _textField = require(\"office-ui-fabric-react/lib/TextField\");\nparcelHelpers.exportAll(_textField, exports);\n\n},{\"office-ui-fabric-react/lib/TextField\":\"1YBUr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1YBUr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/TextField/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/TextField/index\":\"k6ztm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k6ztm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _textField = require(\"./TextField\");\nparcelHelpers.exportAll(_textField, exports);\nvar _textFieldBase = require(\"./TextField.base\");\nparcelHelpers.exportAll(_textFieldBase, exports);\nvar _maskedTextField = require(\"./MaskedTextField/MaskedTextField\");\nparcelHelpers.exportAll(_maskedTextField, exports);\n\n},{\"./TextField\":\"kvp8i\",\"./TextField.base\":\"j5OD1\",\"./MaskedTextField/MaskedTextField\":\"97Zwz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kvp8i\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TextField\", ()=>TextField);\nvar _utilities = require(\"../../Utilities\");\nvar _textFieldBase = require(\"./TextField.base\");\nvar _textFieldStyles = require(\"./TextField.styles\");\nvar TextField = (0, _utilities.styled)((0, _textFieldBase.TextFieldBase), (0, _textFieldStyles.getStyles), undefined, {\n    scope: \"TextField\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./TextField.base\":\"j5OD1\",\"./TextField.styles\":\"h9JkN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j5OD1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TextFieldBase\", ()=>TextFieldBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _label = require(\"../../Label\");\nvar _icon = require(\"../../Icon\");\nvar _utilities = require(\"../../Utilities\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar DEFAULT_STATE_VALUE = \"\";\nvar COMPONENT_NAME = \"TextField\";\nvar REVEAL_ICON_NAME = \"RedEye\";\nvar HIDE_ICON_NAME = \"Hide\";\nvar TextFieldBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(TextFieldBase1, _super);\n    function TextFieldBase1(props1) {\n        var _this = _super.call(this, props1) || this;\n        _this._textElement = _react.createRef();\n        _this._onFocus = function(ev) {\n            if (_this.props.onFocus) _this.props.onFocus(ev);\n            _this.setState({\n                isFocused: true\n            }, function() {\n                if (_this.props.validateOnFocusIn) _this._validate(_this.value);\n            });\n        };\n        _this._onBlur = function(ev) {\n            if (_this.props.onBlur) _this.props.onBlur(ev);\n            _this.setState({\n                isFocused: false\n            }, function() {\n                if (_this.props.validateOnFocusOut) _this._validate(_this.value);\n            });\n        };\n        _this._onRenderLabel = function(props) {\n            var label = props.label, required = props.required;\n            // IProcessedStyleSet definition requires casting for what Label expects as its styles prop\n            var labelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.label : undefined;\n            if (label) return _react.createElement((0, _label.Label), {\n                required: required,\n                htmlFor: _this._id,\n                styles: labelStyles,\n                disabled: props.disabled,\n                id: _this._labelId\n            }, props.label);\n            return null;\n        };\n        _this._onRenderDescription = function(props) {\n            if (props.description) return _react.createElement(\"span\", {\n                className: _this._classNames.description\n            }, props.description);\n            return null;\n        };\n        _this._onRevealButtonClick = function(event) {\n            _this.setState(function(prevState) {\n                return {\n                    isRevealingPassword: !prevState.isRevealingPassword\n                };\n            });\n        };\n        _this._onInputChange = function(event) {\n            // Previously, we needed to call both onInput and onChange due to some weird IE/React issues,\n            // which have *probably* been fixed now:\n            // - https://github.com/microsoft/fluentui/issues/744 (likely fixed)\n            // - https://github.com/microsoft/fluentui/issues/824 (confirmed fixed)\n            // TODO (Fabric 8?) - Switch to calling only onChange. This switch is pretty disruptive for\n            // tests (ours and maybe consumers' too), so it seemed best to do the switch in a major bump.\n            var element = event.target;\n            var value = element.value;\n            // Ignore this event if the value is undefined (in case one of the IE bugs comes back)\n            if (value === undefined || value === _this._lastChangeValue) return;\n            _this._lastChangeValue = value;\n            // This is so developers can access the event properties in asynchronous callbacks\n            // https://reactjs.org/docs/events.html#event-pooling\n            event.persist();\n            var isSameValue;\n            _this.setState(function(prevState, props) {\n                var prevValue = _getValue(props, prevState) || \"\";\n                isSameValue = value === prevValue;\n                // Avoid doing unnecessary work when the value has not changed.\n                if (isSameValue) return null;\n                // ONLY if this is an uncontrolled component, update the displayed value.\n                // (Controlled components must update the `value` prop from `onChange`.)\n                return _this._isControlled ? null : {\n                    uncontrolledValue: value\n                };\n            }, function() {\n                // If the value actually changed, call onChange (for either controlled or uncontrolled)\n                var onChange = _this.props.onChange;\n                if (!isSameValue && onChange) onChange(event, value);\n            });\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        _this._async = new (0, _utilities.Async)(_this);\n        _this._fallbackId = (0, _utilities.getId)(COMPONENT_NAME);\n        _this._descriptionId = (0, _utilities.getId)(COMPONENT_NAME + \"Description\");\n        _this._labelId = (0, _utilities.getId)(COMPONENT_NAME + \"Label\");\n        _this._warnControlledUsage();\n        var _a = props1.defaultValue, defaultValue = _a === void 0 ? DEFAULT_STATE_VALUE : _a;\n        if (typeof defaultValue === \"number\") // This isn't allowed per the props, but happens anyway.\n        defaultValue = String(defaultValue);\n        _this.state = {\n            uncontrolledValue: _this._isControlled ? undefined : defaultValue,\n            isFocused: false,\n            errorMessage: \"\"\n        };\n        _this._delayedValidate = _this._async.debounce(_this._validate, _this.props.deferredValidationTime);\n        _this._lastValidation = 0;\n        return _this;\n    }\n    Object.defineProperty(TextFieldBase1.prototype, \"value\", {\n        /**\n         * Gets the current value of the text field.\n         */ get: function() {\n            return _getValue(this.props, this.state);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    TextFieldBase1.prototype.componentDidMount = function() {\n        this._adjustInputHeight();\n        if (this.props.validateOnLoad) this._validate(this.value);\n    };\n    TextFieldBase1.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n    };\n    TextFieldBase1.prototype.getSnapshotBeforeUpdate = function(prevProps, prevState) {\n        return {\n            selection: [\n                this.selectionStart,\n                this.selectionEnd\n            ]\n        };\n    };\n    TextFieldBase1.prototype.componentDidUpdate = function(prevProps, prevState, snapshot) {\n        var props = this.props;\n        var _a = (snapshot || {}).selection, selection = _a === void 0 ? [\n            null,\n            null\n        ] : _a;\n        var start = selection[0], end = selection[1];\n        if (!!prevProps.multiline !== !!props.multiline && prevState.isFocused) {\n            // The text field has just changed between single- and multi-line, so we need to reset focus\n            // and selection/cursor.\n            this.focus();\n            if (start !== null && end !== null && start >= 0 && end >= 0) this.setSelectionRange(start, end);\n        }\n        var prevValue = _getValue(prevProps, prevState);\n        var value = this.value;\n        if (prevValue !== value) {\n            // Handle controlled/uncontrolled warnings and status\n            this._warnControlledUsage(prevProps);\n            // Clear error message if needed\n            // TODO: is there any way to do this without an extra render?\n            if (this.state.errorMessage && !props.errorMessage) this.setState({\n                errorMessage: \"\"\n            });\n            // Adjust height if needed based on new value\n            this._adjustInputHeight();\n            // Reset the record of the last value seen by a change/input event\n            this._lastChangeValue = undefined;\n            // TODO: #5875 added logic to trigger validation in componentWillReceiveProps and other places.\n            // This seems a bit odd and hard to integrate with the new approach.\n            // (Starting to think we should just put the validation logic in a separate wrapper component...?)\n            if (_shouldValidateAllChanges(props)) this._delayedValidate(value);\n        }\n    };\n    TextFieldBase1.prototype.render = function() {\n        var _a = this.props, borderless = _a.borderless, className = _a.className, disabled = _a.disabled, iconProps = _a.iconProps, inputClassName = _a.inputClassName, label = _a.label, multiline = _a.multiline, required = _a.required, underlined = _a.underlined, prefix = _a.prefix, resizable = _a.resizable, suffix = _a.suffix, theme = _a.theme, styles = _a.styles, autoAdjustHeight = _a.autoAdjustHeight, canRevealPassword = _a.canRevealPassword, type = _a.type, _b = _a.onRenderPrefix, onRenderPrefix = _b === void 0 ? this._onRenderPrefix : _b, _c = _a.onRenderSuffix, onRenderSuffix = _c === void 0 ? this._onRenderSuffix : _c, _d = _a.onRenderLabel, onRenderLabel = _d === void 0 ? this._onRenderLabel : _d, _e = _a.onRenderDescription, onRenderDescription = _e === void 0 ? this._onRenderDescription : _e;\n        var _f = this.state, isFocused = _f.isFocused, isRevealingPassword = _f.isRevealingPassword;\n        var errorMessage = this._errorMessage;\n        var hasRevealButton = !!canRevealPassword && type === \"password\" && _browserNeedsRevealButton();\n        var classNames = this._classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            disabled: disabled,\n            focused: isFocused,\n            required: required,\n            multiline: multiline,\n            hasLabel: !!label,\n            hasErrorMessage: !!errorMessage,\n            borderless: borderless,\n            resizable: resizable,\n            hasIcon: !!iconProps,\n            underlined: underlined,\n            inputClassName: inputClassName,\n            autoAdjustHeight: autoAdjustHeight,\n            hasRevealButton: hasRevealButton\n        });\n        return _react.createElement(\"div\", {\n            className: classNames.root\n        }, _react.createElement(\"div\", {\n            className: classNames.wrapper\n        }, onRenderLabel(this.props, this._onRenderLabel), _react.createElement(\"div\", {\n            className: classNames.fieldGroup\n        }, (prefix !== undefined || this.props.onRenderPrefix) && _react.createElement(\"div\", {\n            className: classNames.prefix\n        }, onRenderPrefix(this.props, this._onRenderPrefix)), multiline ? this._renderTextArea() : this._renderInput(), iconProps && _react.createElement((0, _icon.Icon), (0, _tslib.__assign)({\n            className: classNames.icon\n        }, iconProps)), hasRevealButton && // Explicitly set type=\"button\" since the default button type within a form is \"submit\"\n        _react.createElement(\"button\", {\n            className: classNames.revealButton,\n            onClick: this._onRevealButtonClick,\n            type: \"button\"\n        }, _react.createElement(\"span\", {\n            className: classNames.revealSpan\n        }, _react.createElement((0, _icon.Icon), {\n            className: classNames.revealIcon,\n            iconName: isRevealingPassword ? HIDE_ICON_NAME : REVEAL_ICON_NAME\n        }))), (suffix !== undefined || this.props.onRenderSuffix) && _react.createElement(\"div\", {\n            className: classNames.suffix\n        }, onRenderSuffix(this.props, this._onRenderSuffix)))), this._isDescriptionAvailable && _react.createElement(\"span\", {\n            id: this._descriptionId\n        }, onRenderDescription(this.props, this._onRenderDescription), errorMessage && _react.createElement(\"div\", {\n            role: \"alert\"\n        }, _react.createElement((0, _utilities.DelayedRender), null, _react.createElement(\"p\", {\n            className: classNames.errorMessage\n        }, _react.createElement(\"span\", {\n            \"data-automation-id\": \"error-message\"\n        }, errorMessage))))));\n    };\n    /**\n     * Sets focus on the text field\n     */ TextFieldBase1.prototype.focus = function() {\n        if (this._textElement.current) this._textElement.current.focus();\n    };\n    /**\n     * Blurs the text field.\n     */ TextFieldBase1.prototype.blur = function() {\n        if (this._textElement.current) this._textElement.current.blur();\n    };\n    /**\n     * Selects the text field\n     */ TextFieldBase1.prototype.select = function() {\n        if (this._textElement.current) this._textElement.current.select();\n    };\n    /**\n     * Sets the selection start of the text field to a specified value\n     */ TextFieldBase1.prototype.setSelectionStart = function(value) {\n        if (this._textElement.current) this._textElement.current.selectionStart = value;\n    };\n    /**\n     * Sets the selection end of the text field to a specified value\n     */ TextFieldBase1.prototype.setSelectionEnd = function(value) {\n        if (this._textElement.current) this._textElement.current.selectionEnd = value;\n    };\n    Object.defineProperty(TextFieldBase1.prototype, \"selectionStart\", {\n        /**\n         * Gets the selection start of the text field\n         */ get: function() {\n            return this._textElement.current ? this._textElement.current.selectionStart : -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(TextFieldBase1.prototype, \"selectionEnd\", {\n        /**\n         * Gets the selection end of the text field\n         */ get: function() {\n            return this._textElement.current ? this._textElement.current.selectionEnd : -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    /**\n     * Sets the start and end positions of a selection in a text field.\n     * @param start - Index of the start of the selection.\n     * @param end - Index of the end of the selection.\n     */ TextFieldBase1.prototype.setSelectionRange = function(start, end) {\n        if (this._textElement.current) this._textElement.current.setSelectionRange(start, end);\n    };\n    TextFieldBase1.prototype._warnControlledUsage = function(prevProps) {\n        // Show warnings if props are being used in an invalid way\n        (0, _utilities.warnControlledUsage)({\n            componentId: this._id,\n            componentName: COMPONENT_NAME,\n            props: this.props,\n            oldProps: prevProps,\n            valueProp: \"value\",\n            defaultValueProp: \"defaultValue\",\n            onChangeProp: \"onChange\",\n            readOnlyProp: \"readOnly\"\n        });\n        if (this.props.value === null && !this._hasWarnedNullValue) {\n            this._hasWarnedNullValue = true;\n            (0, _utilities.warn)(\"Warning: 'value' prop on '\" + COMPONENT_NAME + \"' should not be null. Consider using an \" + \"empty string to clear the component or undefined to indicate an uncontrolled component.\");\n        }\n    };\n    Object.defineProperty(TextFieldBase1.prototype, \"_id\", {\n        /** Returns `props.id` if available, or a fallback if not. */ get: function() {\n            return this.props.id || this._fallbackId;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(TextFieldBase1.prototype, \"_isControlled\", {\n        get: function() {\n            return (0, _utilities.isControlled)(this.props, \"value\");\n        },\n        enumerable: true,\n        configurable: true\n    });\n    TextFieldBase1.prototype._onRenderPrefix = function(props) {\n        var prefix = props.prefix;\n        return _react.createElement(\"span\", {\n            style: {\n                paddingBottom: \"1px\"\n            }\n        }, prefix);\n    };\n    TextFieldBase1.prototype._onRenderSuffix = function(props) {\n        var suffix = props.suffix;\n        return _react.createElement(\"span\", {\n            style: {\n                paddingBottom: \"1px\"\n            }\n        }, suffix);\n    };\n    Object.defineProperty(TextFieldBase1.prototype, \"_errorMessage\", {\n        /**\n         * Current error message from either `props.errorMessage` or the result of `props.onGetErrorMessage`.\n         *\n         * - If there is no validation error or we have not validated the input value, errorMessage is an empty string.\n         * - If we have done the validation and there is validation error, errorMessage is the validation error message.\n         */ get: function() {\n            var _a = this.props.errorMessage, errorMessage = _a === void 0 ? this.state.errorMessage : _a;\n            return errorMessage || \"\";\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(TextFieldBase1.prototype, \"_isDescriptionAvailable\", {\n        /**\n         * If a custom description render function is supplied then treat description as always available.\n         * Otherwise defer to the presence of description or error message text.\n         */ get: function() {\n            var props = this.props;\n            return !!(props.onRenderDescription || props.description || this._errorMessage);\n        },\n        enumerable: true,\n        configurable: true\n    });\n    TextFieldBase1.prototype._renderTextArea = function() {\n        var textAreaProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.textAreaProperties), [\n            \"defaultValue\"\n        ]);\n        var ariaLabelledBy = this.props[\"aria-labelledby\"] || (this.props.label ? this._labelId : undefined);\n        return _react.createElement(\"textarea\", (0, _tslib.__assign)({\n            id: this._id\n        }, textAreaProps, {\n            ref: this._textElement,\n            value: this.value || \"\",\n            onInput: this._onInputChange,\n            onChange: this._onInputChange,\n            className: this._classNames.field,\n            \"aria-labelledby\": ariaLabelledBy,\n            \"aria-describedby\": this._isDescriptionAvailable ? this._descriptionId : this.props[\"aria-describedby\"],\n            \"aria-invalid\": !!this._errorMessage,\n            \"aria-label\": this.props.ariaLabel,\n            readOnly: this.props.readOnly,\n            onFocus: this._onFocus,\n            onBlur: this._onBlur\n        }));\n    };\n    TextFieldBase1.prototype._renderInput = function() {\n        var inputProps = (0, _tslib.__assign)((0, _tslib.__assign)({\n            type: this.state.isRevealingPassword ? \"text\" : this.props.type || \"text\",\n            id: this._id\n        }, (0, _utilities.getNativeProps)(this.props, (0, _utilities.inputProperties), [\n            \"defaultValue\",\n            \"type\"\n        ])), {\n            \"aria-labelledby\": this.props[\"aria-labelledby\"] || (this.props.label ? this._labelId : undefined),\n            ref: this._textElement,\n            value: this.value || \"\",\n            onInput: this._onInputChange,\n            onChange: this._onInputChange,\n            className: this._classNames.field,\n            \"aria-label\": this.props.ariaLabel,\n            \"aria-describedby\": this._isDescriptionAvailable ? this._descriptionId : this.props[\"aria-describedby\"],\n            \"aria-invalid\": !!this._errorMessage,\n            onFocus: this._onFocus,\n            onBlur: this._onBlur\n        });\n        var defaultRender = function(updatedInputProps) {\n            return _react.createElement(\"input\", (0, _tslib.__assign)({}, updatedInputProps));\n        };\n        var onRenderInput = this.props.onRenderInput || defaultRender;\n        return onRenderInput(inputProps, defaultRender);\n    };\n    TextFieldBase1.prototype._validate = function(value) {\n        var _this = this;\n        // In case _validate is called again while validation promise is executing\n        if (this._latestValidateValue === value && _shouldValidateAllChanges(this.props)) return;\n        this._latestValidateValue = value;\n        var onGetErrorMessage = this.props.onGetErrorMessage;\n        var result = onGetErrorMessage && onGetErrorMessage(value || \"\");\n        if (result !== undefined) {\n            if (typeof result === \"string\" || !(\"then\" in result)) {\n                this.setState({\n                    errorMessage: result\n                });\n                this._notifyAfterValidate(value, result);\n            } else {\n                var currentValidation_1 = ++this._lastValidation;\n                result.then(function(errorMessage) {\n                    if (currentValidation_1 === _this._lastValidation) _this.setState({\n                        errorMessage: errorMessage\n                    });\n                    _this._notifyAfterValidate(value, errorMessage);\n                });\n            }\n        } else this._notifyAfterValidate(value, \"\");\n    };\n    TextFieldBase1.prototype._notifyAfterValidate = function(value, errorMessage) {\n        if (value === this.value && this.props.onNotifyValidationResult) this.props.onNotifyValidationResult(errorMessage, value);\n    };\n    TextFieldBase1.prototype._adjustInputHeight = function() {\n        if (this._textElement.current && this.props.autoAdjustHeight && this.props.multiline) {\n            var textField = this._textElement.current;\n            textField.style.height = \"\";\n            textField.style.height = textField.scrollHeight + \"px\";\n        }\n    };\n    TextFieldBase1.defaultProps = {\n        resizable: true,\n        deferredValidationTime: 200,\n        validateOnLoad: true,\n        canRevealPassword: false\n    };\n    return TextFieldBase1;\n}(_react.Component);\n/** Get the value from the given state and props (converting from number to string if needed) */ function _getValue(props, state) {\n    var _a = props.value, value = _a === void 0 ? state.uncontrolledValue : _a;\n    if (typeof value === \"number\") // not allowed per typings, but happens anyway\n    return String(value);\n    return value;\n}\n/**\n * If `validateOnFocusIn` or `validateOnFocusOut` is true, validation should run **only** on that event.\n * Otherwise, validation should run on every change.\n */ function _shouldValidateAllChanges(props) {\n    return !(props.validateOnFocusIn || props.validateOnFocusOut);\n}\n// Only calculate this once across all TextFields, since will stay the same\nvar __browserNeedsRevealButton;\nfunction _browserNeedsRevealButton() {\n    var _a;\n    if (typeof __browserNeedsRevealButton !== \"boolean\") {\n        var win = (0, _utilities.getWindow)();\n        if ((_a = win) === null || _a === void 0 ? void 0 : _a.navigator) {\n            // Edge, Chromium Edge\n            var isEdge = /Edg/.test(win.navigator.userAgent || \"\");\n            __browserNeedsRevealButton = !((0, _utilities.isIE11)() || isEdge);\n        } else __browserNeedsRevealButton = true;\n    }\n    return __browserNeedsRevealButton;\n}\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Label\":\"lLA6C\",\"../../Icon\":\"2Ha7p\",\"../../Utilities\":\"2F07a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h9JkN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../Styling\");\nvar globalClassNames = {\n    root: \"ms-TextField\",\n    description: \"ms-TextField-description\",\n    errorMessage: \"ms-TextField-errorMessage\",\n    field: \"ms-TextField-field\",\n    fieldGroup: \"ms-TextField-fieldGroup\",\n    prefix: \"ms-TextField-prefix\",\n    suffix: \"ms-TextField-suffix\",\n    wrapper: \"ms-TextField-wrapper\",\n    revealButton: \"ms-TextField-reveal\",\n    multiline: \"ms-TextField--multiline\",\n    borderless: \"ms-TextField--borderless\",\n    underlined: \"ms-TextField--underlined\",\n    unresizable: \"ms-TextField--unresizable\",\n    required: \"is-required\",\n    disabled: \"is-disabled\",\n    active: \"is-active\"\n};\nfunction getLabelStyles(props) {\n    var underlined = props.underlined, disabled = props.disabled, focused = props.focused, theme = props.theme;\n    var palette = theme.palette, fonts = theme.fonts;\n    return function() {\n        var _a;\n        return {\n            root: [\n                underlined && disabled && {\n                    color: palette.neutralTertiary\n                },\n                underlined && {\n                    fontSize: fonts.medium.fontSize,\n                    marginRight: 8,\n                    paddingLeft: 12,\n                    paddingRight: 0,\n                    lineHeight: \"22px\",\n                    height: 32\n                },\n                underlined && focused && {\n                    selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                        height: 31\n                    }, _a)\n                }, \n            ]\n        };\n    };\n}\nfunction getStyles(props) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\n    var theme = props.theme, className = props.className, disabled = props.disabled, focused = props.focused, required = props.required, multiline = props.multiline, hasLabel = props.hasLabel, borderless = props.borderless, underlined = props.underlined, hasIcon = props.hasIcon, resizable = props.resizable, hasErrorMessage = props.hasErrorMessage, inputClassName = props.inputClassName, autoAdjustHeight = props.autoAdjustHeight, hasRevealButton = props.hasRevealButton;\n    var semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var classNames = (0, _styling.getGlobalClassNames)(globalClassNames, theme);\n    var fieldPrefixSuffix = {\n        // Suffix/Prefix are not editable so the disabled slot perfectly fits.\n        background: semanticColors.disabledBackground,\n        color: !disabled ? semanticColors.inputPlaceholderText : semanticColors.disabledText,\n        display: \"flex\",\n        alignItems: \"center\",\n        padding: \"0 10px\",\n        lineHeight: 1,\n        whiteSpace: \"nowrap\",\n        flexShrink: 0,\n        selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n            background: \"Window\",\n            color: disabled ? \"GrayText\" : \"WindowText\"\n        }, _a)\n    };\n    // placeholder style constants\n    var placeholderStyles = [\n        fonts.medium,\n        {\n            color: semanticColors.inputPlaceholderText,\n            opacity: 1,\n            selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                color: \"GrayText\"\n            }, _b)\n        }, \n    ];\n    var disabledPlaceholderStyles = {\n        color: semanticColors.disabledText,\n        selectors: (_c = {}, _c[0, _styling.HighContrastSelector] = {\n            color: \"GrayText\"\n        }, _c)\n    };\n    return {\n        root: [\n            classNames.root,\n            fonts.medium,\n            required && classNames.required,\n            disabled && classNames.disabled,\n            focused && classNames.active,\n            multiline && classNames.multiline,\n            borderless && classNames.borderless,\n            underlined && classNames.underlined,\n            (0, _styling.normalize),\n            {\n                position: \"relative\"\n            },\n            className, \n        ],\n        wrapper: [\n            classNames.wrapper,\n            underlined && [\n                {\n                    display: \"flex\",\n                    borderBottom: \"1px solid \" + (!hasErrorMessage ? semanticColors.inputBorder : semanticColors.errorText),\n                    width: \"100%\"\n                },\n                disabled && {\n                    borderBottomColor: semanticColors.disabledBackground,\n                    selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                        borderColor: \"GrayText\"\n                    }, (0, _styling.getHighContrastNoAdjustStyle)()), _d)\n                },\n                !disabled && {\n                    selectors: {\n                        \":hover\": {\n                            borderBottomColor: !hasErrorMessage ? semanticColors.inputBorderHovered : semanticColors.errorText,\n                            selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                                borderBottomColor: \"Highlight\"\n                            }, (0, _styling.getHighContrastNoAdjustStyle)()), _e)\n                        }\n                    }\n                },\n                focused && [\n                    {\n                        position: \"relative\"\n                    },\n                    (0, _styling.getInputFocusStyle)(!hasErrorMessage ? semanticColors.inputFocusBorderAlt : semanticColors.errorText, 0, \"borderBottom\"), \n                ], \n            ], \n        ],\n        fieldGroup: [\n            classNames.fieldGroup,\n            (0, _styling.normalize),\n            {\n                border: \"1px solid \" + semanticColors.inputBorder,\n                borderRadius: effects.roundedCorner2,\n                background: semanticColors.inputBackground,\n                cursor: \"text\",\n                height: 32,\n                display: \"flex\",\n                flexDirection: \"row\",\n                alignItems: \"stretch\",\n                position: \"relative\"\n            },\n            multiline && {\n                minHeight: \"60px\",\n                height: \"auto\",\n                display: \"flex\"\n            },\n            !focused && !disabled && {\n                selectors: {\n                    \":hover\": {\n                        borderColor: semanticColors.inputBorderHovered,\n                        selectors: (_f = {}, _f[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                            borderColor: \"Highlight\"\n                        }, (0, _styling.getHighContrastNoAdjustStyle)()), _f)\n                    }\n                }\n            },\n            focused && !underlined && (0, _styling.getInputFocusStyle)(!hasErrorMessage ? semanticColors.inputFocusBorderAlt : semanticColors.errorText, effects.roundedCorner2),\n            disabled && {\n                borderColor: semanticColors.disabledBackground,\n                selectors: (_g = {}, _g[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                    borderColor: \"GrayText\"\n                }, (0, _styling.getHighContrastNoAdjustStyle)()), _g),\n                cursor: \"default\"\n            },\n            borderless && {\n                border: \"none\"\n            },\n            borderless && focused && {\n                border: \"none\",\n                selectors: {\n                    \":after\": {\n                        border: \"none\"\n                    }\n                }\n            },\n            underlined && {\n                flex: \"1 1 0px\",\n                border: \"none\",\n                textAlign: \"left\"\n            },\n            underlined && disabled && {\n                backgroundColor: \"transparent\"\n            },\n            hasErrorMessage && !underlined && {\n                borderColor: semanticColors.errorText,\n                selectors: {\n                    \"&:hover\": {\n                        borderColor: semanticColors.errorText\n                    }\n                }\n            },\n            !hasLabel && required && {\n                selectors: (_h = {\n                    \":before\": {\n                        content: \"'*'\",\n                        color: semanticColors.errorText,\n                        position: \"absolute\",\n                        top: -5,\n                        right: -10\n                    }\n                }, _h[0, _styling.HighContrastSelector] = {\n                    selectors: {\n                        \":before\": {\n                            color: \"WindowText\",\n                            right: -14\n                        }\n                    }\n                }, _h)\n            }, \n        ],\n        field: [\n            fonts.medium,\n            classNames.field,\n            (0, _styling.normalize),\n            {\n                borderRadius: 0,\n                border: \"none\",\n                background: \"none\",\n                backgroundColor: \"transparent\",\n                color: semanticColors.inputText,\n                padding: \"0 8px\",\n                width: \"100%\",\n                minWidth: 0,\n                textOverflow: \"ellipsis\",\n                outline: 0,\n                selectors: (_j = {\n                    \"&:active, &:focus, &:hover\": {\n                        outline: 0\n                    },\n                    \"::-ms-clear\": {\n                        display: \"none\"\n                    }\n                }, _j[0, _styling.HighContrastSelector] = {\n                    background: \"Window\",\n                    color: disabled ? \"GrayText\" : \"WindowText\"\n                }, _j)\n            },\n            (0, _styling.getPlaceholderStyles)(placeholderStyles),\n            multiline && !resizable && [\n                classNames.unresizable,\n                {\n                    resize: \"none\"\n                }, \n            ],\n            multiline && {\n                minHeight: \"inherit\",\n                lineHeight: 17,\n                flexGrow: 1,\n                paddingTop: 6,\n                paddingBottom: 6,\n                overflow: \"auto\",\n                width: \"100%\"\n            },\n            multiline && autoAdjustHeight && {\n                overflow: \"hidden\"\n            },\n            hasIcon && !hasRevealButton && {\n                paddingRight: 24\n            },\n            multiline && hasIcon && {\n                paddingRight: 40\n            },\n            disabled && [\n                {\n                    backgroundColor: semanticColors.disabledBackground,\n                    color: semanticColors.disabledText,\n                    borderColor: semanticColors.disabledBackground\n                },\n                (0, _styling.getPlaceholderStyles)(disabledPlaceholderStyles), \n            ],\n            underlined && {\n                textAlign: \"left\"\n            },\n            focused && !borderless && {\n                selectors: (_k = {}, _k[0, _styling.HighContrastSelector] = {\n                    paddingLeft: 11,\n                    paddingRight: 11\n                }, _k)\n            },\n            focused && multiline && !borderless && {\n                selectors: (_l = {}, _l[0, _styling.HighContrastSelector] = {\n                    paddingTop: 4\n                }, _l)\n            },\n            inputClassName, \n        ],\n        icon: [\n            multiline && {\n                paddingRight: 24,\n                alignItems: \"flex-end\"\n            },\n            {\n                pointerEvents: \"none\",\n                position: \"absolute\",\n                bottom: 6,\n                right: 8,\n                top: \"auto\",\n                fontSize: (0, _styling.IconFontSizes).medium,\n                lineHeight: 18\n            },\n            disabled && {\n                color: semanticColors.disabledText\n            }, \n        ],\n        description: [\n            classNames.description,\n            {\n                color: semanticColors.bodySubtext,\n                fontSize: fonts.xSmall.fontSize\n            }, \n        ],\n        errorMessage: [\n            classNames.errorMessage,\n            (0, _styling.AnimationClassNames).slideDownIn20,\n            fonts.small,\n            {\n                color: semanticColors.errorText,\n                margin: 0,\n                paddingTop: 5,\n                display: \"flex\",\n                alignItems: \"center\"\n            }, \n        ],\n        prefix: [\n            classNames.prefix,\n            fieldPrefixSuffix\n        ],\n        suffix: [\n            classNames.suffix,\n            fieldPrefixSuffix\n        ],\n        revealButton: [\n            classNames.revealButton,\n            \"ms-Button\",\n            \"ms-Button--icon\",\n            {\n                height: 30,\n                width: 32,\n                border: \"none\",\n                padding: \"0px 4px\",\n                backgroundColor: \"transparent\",\n                color: semanticColors.link,\n                selectors: {\n                    \":hover\": {\n                        outline: 0,\n                        color: semanticColors.primaryButtonBackgroundHovered,\n                        backgroundColor: semanticColors.buttonBackgroundHovered,\n                        selectors: (_m = {}, _m[0, _styling.HighContrastSelector] = {\n                            borderColor: \"Highlight\",\n                            color: \"Highlight\"\n                        }, _m)\n                    },\n                    \":focus\": {\n                        outline: 0\n                    }\n                }\n            },\n            hasIcon && {\n                marginRight: 28\n            }, \n        ],\n        revealSpan: {\n            display: \"flex\",\n            height: \"100%\",\n            alignItems: \"center\"\n        },\n        revealIcon: {\n            margin: \"0px 4px\",\n            pointerEvents: \"none\",\n            bottom: 6,\n            right: 8,\n            top: \"auto\",\n            fontSize: (0, _styling.IconFontSizes).medium,\n            lineHeight: 18\n        },\n        subComponentStyles: {\n            label: getLabelStyles(props)\n        }\n    };\n}\n\n},{\"tslib\":\"01Tx1\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"97Zwz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DEFAULT_MASK_CHAR\", ()=>DEFAULT_MASK_CHAR);\nparcelHelpers.export(exports, \"MaskedTextField\", ()=>MaskedTextField);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _textField = require(\"../TextField\");\nvar _utilities = require(\"../../../Utilities\");\nvar _inputMask = require(\"./inputMask\");\nvar DEFAULT_MASK_CHAR = \"_\";\nvar MaskedTextField = /** @class */ function(_super) {\n    (0, _tslib.__extends)(MaskedTextField1, _super);\n    function MaskedTextField1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._textField = _react.createRef();\n        _this._onFocus = function(event) {\n            if (_this.props.onFocus) _this.props.onFocus(event);\n            _this._isFocused = true;\n            // Move the cursor position to the leftmost unfilled position\n            for(var i = 0; i < _this._maskCharData.length; i++)if (!_this._maskCharData[i].value) {\n                _this.setState({\n                    maskCursorPosition: _this._maskCharData[i].displayIndex\n                });\n                break;\n            }\n        };\n        _this._onBlur = function(event) {\n            if (_this.props.onBlur) _this.props.onBlur(event);\n            _this._isFocused = false;\n            _this._moveCursorOnMouseUp = true;\n        };\n        _this._onMouseDown = function(event) {\n            if (_this.props.onMouseDown) _this.props.onMouseDown(event);\n            if (!_this._isFocused) _this._moveCursorOnMouseUp = true;\n        };\n        _this._onMouseUp = function(event) {\n            if (_this.props.onMouseUp) _this.props.onMouseUp(event);\n            // Move the cursor on mouseUp after focusing the textField\n            if (_this._moveCursorOnMouseUp) {\n                _this._moveCursorOnMouseUp = false;\n                // Move the cursor position to the rightmost unfilled position\n                for(var i = 0; i < _this._maskCharData.length; i++)if (!_this._maskCharData[i].value) {\n                    _this.setState({\n                        maskCursorPosition: _this._maskCharData[i].displayIndex\n                    });\n                    break;\n                }\n            }\n        };\n        _this._onInputChange = function(ev, value) {\n            var textField = _this._textField.current;\n            if (_this._changeSelectionData === null && textField) _this._changeSelectionData = {\n                changeType: \"default\",\n                selectionStart: textField.selectionStart !== null ? textField.selectionStart : -1,\n                selectionEnd: textField.selectionEnd !== null ? textField.selectionEnd : -1\n            };\n            if (!_this._changeSelectionData) return;\n            var displayValue = _this.state.displayValue;\n            // The initial value of cursorPos does not matter\n            var cursorPos = 0;\n            var _a = _this._changeSelectionData, changeType = _a.changeType, selectionStart = _a.selectionStart, selectionEnd = _a.selectionEnd;\n            if (changeType === \"textPasted\") {\n                var charsSelected = selectionEnd - selectionStart;\n                var charCount = value.length + charsSelected - displayValue.length;\n                var startPos = selectionStart;\n                var pastedString = value.substr(startPos, charCount);\n                // Clear any selected characters\n                if (charsSelected) _this._maskCharData = (0, _inputMask.clearRange)(_this._maskCharData, selectionStart, charsSelected);\n                cursorPos = (0, _inputMask.insertString)(_this._maskCharData, startPos, pastedString);\n            } else if (changeType === \"delete\" || changeType === \"backspace\") {\n                // isDel is true If the characters are removed LTR, otherwise RTL\n                var isDel = changeType === \"delete\";\n                var charCount = selectionEnd - selectionStart;\n                if (charCount) {\n                    // charCount is > 0 if range was deleted\n                    _this._maskCharData = (0, _inputMask.clearRange)(_this._maskCharData, selectionStart, charCount);\n                    cursorPos = (0, _inputMask.getRightFormatIndex)(_this._maskCharData, selectionStart);\n                } else // If charCount === 0, there was no selection and a single character was deleted\n                if (isDel) {\n                    _this._maskCharData = (0, _inputMask.clearNext)(_this._maskCharData, selectionStart);\n                    cursorPos = (0, _inputMask.getRightFormatIndex)(_this._maskCharData, selectionStart);\n                } else {\n                    _this._maskCharData = (0, _inputMask.clearPrev)(_this._maskCharData, selectionStart);\n                    cursorPos = (0, _inputMask.getLeftFormatIndex)(_this._maskCharData, selectionStart);\n                }\n            } else if (value.length > displayValue.length) {\n                // This case is if the user added characters\n                var charCount = value.length - displayValue.length;\n                var startPos = selectionEnd - charCount;\n                var enteredString = value.substr(startPos, charCount);\n                cursorPos = (0, _inputMask.insertString)(_this._maskCharData, startPos, enteredString);\n            } else if (value.length <= displayValue.length) {\n                /**\n                 * This case is reached only if the user has selected a block of 1 or more\n                 * characters and input a character replacing the characters they've selected.\n                 */ var charCount = 1;\n                var selectCount = displayValue.length + charCount - value.length;\n                var startPos = selectionEnd - charCount;\n                var enteredString = value.substr(startPos, charCount);\n                // Clear the selected range\n                _this._maskCharData = (0, _inputMask.clearRange)(_this._maskCharData, startPos, selectCount);\n                // Insert the printed character\n                cursorPos = (0, _inputMask.insertString)(_this._maskCharData, startPos, enteredString);\n            }\n            _this._changeSelectionData = null;\n            var newValue = (0, _inputMask.getMaskDisplay)(_this.props.mask, _this._maskCharData, _this.props.maskChar);\n            _this.setState({\n                displayValue: newValue,\n                maskCursorPosition: cursorPos\n            });\n            // Perform onChange after input has been processed. Return value is expected to be the displayed text\n            if (_this.props.onChange) _this.props.onChange(ev, newValue);\n        };\n        _this._onKeyDown = function(event) {\n            var current = _this._textField.current;\n            if (_this.props.onKeyDown) _this.props.onKeyDown(event);\n            _this._changeSelectionData = null;\n            if (current && current.value) {\n                var keyCode = event.keyCode, ctrlKey = event.ctrlKey, metaKey = event.metaKey;\n                // Ignore ctrl and meta keydown\n                if (ctrlKey || metaKey) return;\n                // On backspace or delete, store the selection and the keyCode\n                if (keyCode === (0, _utilities.KeyCodes).backspace || keyCode === (0, _utilities.KeyCodes).del) {\n                    var selectionStart = event.target.selectionStart;\n                    var selectionEnd = event.target.selectionEnd;\n                    // Check if backspace or delete press is valid.\n                    if (!(keyCode === (0, _utilities.KeyCodes).backspace && selectionEnd && selectionEnd > 0) && !(keyCode === (0, _utilities.KeyCodes).del && selectionStart !== null && selectionStart < current.value.length)) return;\n                    _this._changeSelectionData = {\n                        changeType: keyCode === (0, _utilities.KeyCodes).backspace ? \"backspace\" : \"delete\",\n                        selectionStart: selectionStart !== null ? selectionStart : -1,\n                        selectionEnd: selectionEnd !== null ? selectionEnd : -1\n                    };\n                }\n            }\n        };\n        _this._onPaste = function(event) {\n            if (_this.props.onPaste) _this.props.onPaste(event);\n            var selectionStart = event.target.selectionStart;\n            var selectionEnd = event.target.selectionEnd;\n            // Store the paste selection range\n            _this._changeSelectionData = {\n                changeType: \"textPasted\",\n                selectionStart: selectionStart !== null ? selectionStart : -1,\n                selectionEnd: selectionEnd !== null ? selectionEnd : -1\n            };\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        // Translate mask into charData\n        _this._maskCharData = (0, _inputMask.parseMask)(props.mask, props.maskFormat);\n        // If an initial value is provided, use it to populate the format chars\n        props.value !== undefined && _this.setValue(props.value);\n        _this._isFocused = false;\n        _this._moveCursorOnMouseUp = false;\n        _this.state = {\n            displayValue: (0, _inputMask.getMaskDisplay)(props.mask, _this._maskCharData, props.maskChar)\n        };\n        return _this;\n    }\n    MaskedTextField1.prototype.UNSAFE_componentWillReceiveProps = function(newProps) {\n        if (newProps.mask !== this.props.mask || newProps.value !== this.props.value) {\n            this._maskCharData = (0, _inputMask.parseMask)(newProps.mask, newProps.maskFormat);\n            newProps.value !== undefined && this.setValue(newProps.value);\n            this.setState({\n                displayValue: (0, _inputMask.getMaskDisplay)(newProps.mask, this._maskCharData, newProps.maskChar)\n            });\n        }\n    };\n    MaskedTextField1.prototype.componentDidUpdate = function() {\n        // Move the cursor to the start of the mask format on update\n        if (this._isFocused && this.state.maskCursorPosition !== undefined && this._textField.current) this._textField.current.setSelectionRange(this.state.maskCursorPosition, this.state.maskCursorPosition);\n    };\n    MaskedTextField1.prototype.render = function() {\n        return _react.createElement((0, _textField.TextField), (0, _tslib.__assign)({}, this.props, {\n            onFocus: this._onFocus,\n            onBlur: this._onBlur,\n            onMouseDown: this._onMouseDown,\n            onMouseUp: this._onMouseUp,\n            onChange: this._onInputChange,\n            onKeyDown: this._onKeyDown,\n            onPaste: this._onPaste,\n            value: this.state.displayValue || \"\",\n            componentRef: this._textField\n        }));\n    };\n    Object.defineProperty(MaskedTextField1.prototype, \"value\", {\n        /**\n         * @returns The value of all filled format characters or undefined if not all format characters are filled\n         */ get: function() {\n            var value = \"\";\n            for(var i = 0; i < this._maskCharData.length; i++){\n                if (!this._maskCharData[i].value) return undefined;\n                value += this._maskCharData[i].value;\n            }\n            return value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MaskedTextField1.prototype.setValue = function(newValue) {\n        var valueIndex = 0;\n        var charDataIndex = 0;\n        while(valueIndex < newValue.length && charDataIndex < this._maskCharData.length){\n            // Test if the next character in the new value fits the next format character\n            var testVal = newValue[valueIndex];\n            if (this._maskCharData[charDataIndex].format.test(testVal)) {\n                this._maskCharData[charDataIndex].value = testVal;\n                charDataIndex++;\n            }\n            valueIndex++;\n        }\n    };\n    MaskedTextField1.prototype.focus = function() {\n        var current = this._textField.current;\n        current && current.focus();\n    };\n    MaskedTextField1.prototype.blur = function() {\n        var current = this._textField.current;\n        current && current.blur();\n    };\n    MaskedTextField1.prototype.select = function() {\n        var current = this._textField.current;\n        current && current.select();\n    };\n    MaskedTextField1.prototype.setSelectionStart = function(value) {\n        var current = this._textField.current;\n        current && current.setSelectionStart(value);\n    };\n    MaskedTextField1.prototype.setSelectionEnd = function(value) {\n        var current = this._textField.current;\n        current && current.setSelectionEnd(value);\n    };\n    MaskedTextField1.prototype.setSelectionRange = function(start, end) {\n        var current = this._textField.current;\n        current && current.setSelectionRange(start, end);\n    };\n    Object.defineProperty(MaskedTextField1.prototype, \"selectionStart\", {\n        get: function() {\n            var current = this._textField.current;\n            return current && current.selectionStart !== null ? current.selectionStart : -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MaskedTextField1.prototype, \"selectionEnd\", {\n        get: function() {\n            var current = this._textField.current;\n            return current && current.selectionEnd ? current.selectionEnd : -1;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MaskedTextField1.defaultProps = {\n        maskChar: DEFAULT_MASK_CHAR,\n        maskFormat: (0, _inputMask.DEFAULT_MASK_FORMAT_CHARS)\n    };\n    return MaskedTextField1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../TextField\":\"kvp8i\",\"../../../Utilities\":\"2F07a\",\"./inputMask\":\"dV2j4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dV2j4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DEFAULT_MASK_FORMAT_CHARS\", ()=>DEFAULT_MASK_FORMAT_CHARS);\n/**\n * Takes in the mask string and the formatCharacters and returns an array of MaskValues\n * Example:\n * mask = 'Phone Number: (999) - 9999'\n * return = [\n *    { value: undefined, displayIndex: 16, format: /[0-9]/ },\n *    { value: undefined, displayIndex: 17, format: /[0-9]/ },\n *    { value: undefined, displayIndex: 18, format: /[0-9]/ },\n *    { value: undefined, displayIndex: 22, format: /[0-9]/ },\n * ]\n *\n * @param mask The string use to define the format of the displayed maskedValue.\n * @param formatChars An object defining how certain characters in the mask should accept input.\n */ parcelHelpers.export(exports, \"parseMask\", ()=>parseMask);\n/**\n * Takes in the mask string, an array of MaskValues, and the maskCharacter\n * returns the mask string formatted with the input values and maskCharacter.\n * If the maskChar is undefined, the maskDisplay is truncated to the last filled format character.\n * Example:\n * mask = 'Phone Number: (999) 999 - 9999'\n * maskCharData = '12345'\n * maskChar = '_'\n * return = 'Phone Number: (123) 45_ - ___'\n *\n * Example:\n * mask = 'Phone Number: (999) 999 - 9999'\n * value = '12345'\n * maskChar = undefined\n * return = 'Phone Number: (123) 45'\n *\n * @param mask The string use to define the format of the displayed maskedValue.\n * @param maskCharData The input values to insert into the mask string for displaying.\n * @param maskChar? A character to display in place of unfilled mask format characters.\n */ parcelHelpers.export(exports, \"getMaskDisplay\", ()=>getMaskDisplay);\n/**\n * Get the next format index right of or at a specified index.\n * If no index exists, returns the rightmost index.\n * @param maskCharData\n * @param index\n */ parcelHelpers.export(exports, \"getRightFormatIndex\", ()=>getRightFormatIndex);\n/**\n * Get the next format index left of a specified index.\n * If no index exists, returns the leftmost index.\n * @param maskCharData\n * @param index\n */ parcelHelpers.export(exports, \"getLeftFormatIndex\", ()=>getLeftFormatIndex);\n/**\n * Deletes all values in maskCharData with a displayIndex that falls inside the specified range.\n * maskCharData is modified inline and also returned.\n * @param maskCharData\n * @param selectionStart\n * @param selectionCount\n */ parcelHelpers.export(exports, \"clearRange\", ()=>clearRange);\n/**\n * Deletes the input character at or after a specified index and returns the new array of charData\n * maskCharData is modified inline and also returned.\n * @param maskCharData\n * @param selectionStart\n */ parcelHelpers.export(exports, \"clearNext\", ()=>clearNext);\n/**\n * Deletes the input character before a specified index and returns the new array of charData\n * maskCharData is modified inline and also returned.\n * @param maskCharData\n * @param selectionStart\n */ parcelHelpers.export(exports, \"clearPrev\", ()=>clearPrev);\n/**\n * Deletes all values in maskCharData with a displayIndex that falls inside the specified range.\n * Modifies the maskCharData inplace with the passed string and returns the display index of the\n * next format character after the inserted string.\n * @param maskCharData\n * @param selectionStart\n * @param selectionCount\n * @return The displayIndex of the next format character\n */ parcelHelpers.export(exports, \"insertString\", ()=>insertString);\nvar DEFAULT_MASK_FORMAT_CHARS = {\n    \"9\": /[0-9]/,\n    a: /[a-zA-Z]/,\n    \"*\": /[a-zA-Z0-9]/\n};\nfunction parseMask(mask, formatChars) {\n    if (formatChars === void 0) formatChars = DEFAULT_MASK_FORMAT_CHARS;\n    if (!mask) return [];\n    var maskCharData = [];\n    // Count the escape characters in the mask string.\n    var escapedChars = 0;\n    for(var i = 0; i + escapedChars < mask.length; i++){\n        var maskChar = mask.charAt(i + escapedChars);\n        if (maskChar === \"\\\\\") escapedChars++;\n        else {\n            // Check if the maskChar is a format character.\n            var maskFormat = formatChars[maskChar];\n            if (maskFormat) maskCharData.push({\n                /**\n                     * Do not add escapedChars to the displayIndex.\n                     * The index refers to a position in the mask's displayValue.\n                     * Since the backslashes don't appear in the displayValue,\n                     * we do not add them to the charData displayIndex.\n                     */ displayIndex: i,\n                format: maskFormat\n            });\n        }\n    }\n    return maskCharData;\n}\nfunction getMaskDisplay(mask, maskCharData, maskChar) {\n    var maskDisplay = mask;\n    if (!maskDisplay) return \"\";\n    // Remove all backslashes\n    maskDisplay = maskDisplay.replace(/\\\\/g, \"\");\n    // lastDisplayIndex is is used to truncate the string if necessary.\n    var lastDisplayIndex = 0;\n    if (maskCharData.length > 0) lastDisplayIndex = maskCharData[0].displayIndex - 1;\n    /**\n     * For each input value, replace the character in the maskDisplay with the value.\n     * If there is no value set for the format character, use the maskChar.\n     */ for(var _i = 0, maskCharData_1 = maskCharData; _i < maskCharData_1.length; _i++){\n        var charData = maskCharData_1[_i];\n        var nextChar = \" \";\n        if (charData.value) {\n            nextChar = charData.value;\n            if (charData.displayIndex > lastDisplayIndex) lastDisplayIndex = charData.displayIndex;\n        } else if (maskChar) nextChar = maskChar;\n        // Insert the character into the maskdisplay at its corresponding index\n        maskDisplay = maskDisplay.slice(0, charData.displayIndex) + nextChar + maskDisplay.slice(charData.displayIndex + 1);\n    }\n    // Cut off all mask characters after the last filled format value\n    if (!maskChar) maskDisplay = maskDisplay.slice(0, lastDisplayIndex + 1);\n    return maskDisplay;\n}\nfunction getRightFormatIndex(maskCharData, index) {\n    for(var i = 0; i < maskCharData.length; i++){\n        if (maskCharData[i].displayIndex >= index) return maskCharData[i].displayIndex;\n    }\n    return maskCharData[maskCharData.length - 1].displayIndex;\n}\nfunction getLeftFormatIndex(maskCharData, index) {\n    for(var i = maskCharData.length - 1; i >= 0; i--){\n        if (maskCharData[i].displayIndex < index) return maskCharData[i].displayIndex;\n    }\n    return maskCharData[0].displayIndex;\n}\nfunction clearRange(maskCharData, selectionStart, selectionCount) {\n    for(var i = 0; i < maskCharData.length; i++)if (maskCharData[i].displayIndex >= selectionStart) {\n        if (maskCharData[i].displayIndex >= selectionStart + selectionCount) break;\n        maskCharData[i].value = undefined;\n    }\n    return maskCharData;\n}\nfunction clearNext(maskCharData, selectionStart) {\n    for(var i = 0; i < maskCharData.length; i++)if (maskCharData[i].displayIndex >= selectionStart) {\n        maskCharData[i].value = undefined;\n        break;\n    }\n    return maskCharData;\n}\nfunction clearPrev(maskCharData, selectionStart) {\n    for(var i = maskCharData.length - 1; i >= 0; i--)if (maskCharData[i].displayIndex < selectionStart) {\n        maskCharData[i].value = undefined;\n        break;\n    }\n    return maskCharData;\n}\nfunction insertString(maskCharData, selectionStart, newString) {\n    var stringIndex = 0;\n    var nextIndex = 0;\n    var isStringInserted = false;\n    // Iterate through _maskCharData finding values with a displayIndex after the specified range start\n    for(var i = 0; i < maskCharData.length && stringIndex < newString.length; i++)if (maskCharData[i].displayIndex >= selectionStart) {\n        isStringInserted = true;\n        nextIndex = maskCharData[i].displayIndex;\n        // Find the next character in the newString that matches the format\n        while(stringIndex < newString.length){\n            // If the character matches the format regexp, set the maskCharData to the new character\n            if (maskCharData[i].format.test(newString.charAt(stringIndex))) {\n                maskCharData[i].value = newString.charAt(stringIndex++);\n                // Set the nextIndex to the display index of the next mask format character.\n                if (i + 1 < maskCharData.length) nextIndex = maskCharData[i + 1].displayIndex;\n                else nextIndex++;\n                break;\n            }\n            stringIndex++;\n        }\n    }\n    return isStringInserted ? nextIndex : selectionStart;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hbvPy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _toggle = require(\"office-ui-fabric-react/lib/Toggle\");\nparcelHelpers.exportAll(_toggle, exports);\n\n},{\"office-ui-fabric-react/lib/Toggle\":\"e3ZHV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e3ZHV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _index = require(\"./components/Toggle/index\");\nparcelHelpers.exportAll(_index, exports);\n\n},{\"./components/Toggle/index\":\"hZMiq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hZMiq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _toggle = require(\"./Toggle\");\nparcelHelpers.exportAll(_toggle, exports);\nvar _toggleBase = require(\"./Toggle.base\");\nparcelHelpers.exportAll(_toggleBase, exports);\n\n},{\"./Toggle\":\"bVQ1U\",\"./Toggle.base\":\"ag5H6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bVQ1U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Toggle\", ()=>Toggle);\nvar _utilities = require(\"../../Utilities\");\nvar _toggleBase = require(\"./Toggle.base\");\nvar _toggleStyles = require(\"./Toggle.styles\");\nvar Toggle = (0, _utilities.styled)((0, _toggleBase.ToggleBase), (0, _toggleStyles.getStyles), undefined, {\n    scope: \"Toggle\"\n});\n\n},{\"../../Utilities\":\"2F07a\",\"./Toggle.base\":\"ag5H6\",\"./Toggle.styles\":\"4JamX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ag5H6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ToggleBase\", ()=>ToggleBase);\nvar _tslib = require(\"tslib\");\nvar _react = require(\"react\");\nvar _utilities = require(\"../../Utilities\");\nvar _label = require(\"../../Label\");\nvar _keytipData = require(\"../../KeytipData\");\nvar getClassNames = (0, _utilities.classNamesFunction)();\nvar COMPONENT_NAME = \"Toggle\";\nvar ToggleBase = /** @class */ function(_super) {\n    (0, _tslib.__extends)(ToggleBase1, _super);\n    function ToggleBase1(props) {\n        var _this = _super.call(this, props) || this;\n        _this._toggleButton = _react.createRef();\n        _this._onClick = function(ev) {\n            // eslint-disable-next-line deprecation/deprecation\n            var _a = _this.props, disabled = _a.disabled, checkedProp = _a.checked, onChange = _a.onChange, onChanged = _a.onChanged, onClick = _a.onClick;\n            var checked = _this.state.checked;\n            if (!disabled) {\n                // Only update the state if the user hasn't provided it.\n                if (checkedProp === undefined) _this.setState({\n                    checked: !checked\n                });\n                if (onChange) onChange(ev, !checked);\n                if (onChanged) onChanged(!checked);\n                if (onClick) onClick(ev);\n            }\n        };\n        (0, _utilities.initializeComponentRef)(_this);\n        (0, _utilities.warnMutuallyExclusive)(COMPONENT_NAME, props, {\n            checked: \"defaultChecked\"\n        });\n        (0, _utilities.warnDeprecations)(COMPONENT_NAME, props, {\n            onAriaLabel: \"ariaLabel\",\n            offAriaLabel: undefined,\n            onChanged: \"onChange\"\n        });\n        _this.state = {\n            checked: !!(props.checked || props.defaultChecked)\n        };\n        _this._id = (0, _utilities.getId)(\"Toggle\");\n        return _this;\n    }\n    ToggleBase1.getDerivedStateFromProps = function(nextProps, prevState) {\n        if (nextProps.checked === undefined) return null;\n        return {\n            checked: !!nextProps.checked\n        };\n    };\n    Object.defineProperty(ToggleBase1.prototype, \"checked\", {\n        /**\n         * Gets the current checked state of the toggle.\n         */ get: function() {\n            return this.state.checked;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ToggleBase1.prototype.render = function() {\n        var _this = this;\n        var _a = this.props, _b = _a.as, RootType = _b === void 0 ? \"div\" : _b, className = _a.className, theme = _a.theme, disabled = _a.disabled, keytipProps = _a.keytipProps, id = _a.id, label = _a.label, ariaLabel = _a.ariaLabel, /* eslint-disable deprecation/deprecation */ onAriaLabel = _a.onAriaLabel, offAriaLabel = _a.offAriaLabel, /* eslint-enable deprecation/deprecation */ offText = _a.offText, onText = _a.onText, styles = _a.styles, inlineLabel = _a.inlineLabel;\n        var checked = this.state.checked;\n        var stateText = checked ? onText : offText;\n        var badAriaLabel = checked ? onAriaLabel : offAriaLabel;\n        var toggleNativeProps = (0, _utilities.getNativeProps)(this.props, (0, _utilities.inputProperties), [\n            \"defaultChecked\"\n        ]);\n        var classNames = getClassNames(styles, {\n            theme: theme,\n            className: className,\n            disabled: disabled,\n            checked: checked,\n            inlineLabel: inlineLabel,\n            onOffMissing: !onText && !offText\n        });\n        var toggleId = id || this._id;\n        var labelId = toggleId + \"-label\";\n        var stateTextId = toggleId + \"-stateText\";\n        // The following properties take priority for what Narrator should read:\n        // 1. ariaLabel\n        // 2. onAriaLabel (if checked) or offAriaLabel (if not checked)\n        // 3. label AND stateText, if existent\n        var labelledById = undefined;\n        if (!ariaLabel && !badAriaLabel) {\n            if (label) labelledById = labelId;\n            if (stateText) labelledById = labelledById ? labelledById + \" \" + stateTextId : stateTextId;\n        }\n        var ariaRole = this.props.role ? this.props.role : \"switch\";\n        var renderPill = function(keytipAttributes) {\n            if (keytipAttributes === void 0) keytipAttributes = {};\n            return _react.createElement(\"button\", (0, _tslib.__assign)({}, toggleNativeProps, keytipAttributes, {\n                className: classNames.pill,\n                disabled: disabled,\n                id: toggleId,\n                type: \"button\",\n                role: ariaRole,\n                ref: _this._toggleButton,\n                \"aria-disabled\": disabled,\n                \"aria-checked\": checked,\n                \"aria-label\": ariaLabel ? ariaLabel : badAriaLabel,\n                \"data-is-focusable\": true,\n                onChange: _this._noop,\n                onClick: _this._onClick,\n                \"aria-labelledby\": labelledById\n            }), _react.createElement(\"span\", {\n                className: classNames.thumb\n            }));\n        };\n        var pillContent = keytipProps ? _react.createElement((0, _keytipData.KeytipData), {\n            keytipProps: keytipProps,\n            ariaDescribedBy: toggleNativeProps[\"aria-describedby\"],\n            disabled: disabled\n        }, function(keytipAttributes) {\n            return renderPill(keytipAttributes);\n        }) : renderPill();\n        return _react.createElement(RootType, {\n            className: classNames.root,\n            hidden: toggleNativeProps.hidden\n        }, label && _react.createElement((0, _label.Label), {\n            htmlFor: toggleId,\n            className: classNames.label,\n            id: labelId\n        }, label), _react.createElement(\"div\", {\n            className: classNames.container\n        }, pillContent, stateText && // This second \"htmlFor\" property is needed to allow the\n        // toggle's stateText to also trigger a state change when clicked.\n        _react.createElement((0, _label.Label), {\n            htmlFor: toggleId,\n            className: classNames.text,\n            id: stateTextId\n        }, stateText)), _react.createElement((0, _utilities.FocusRects), null));\n    };\n    ToggleBase1.prototype.focus = function() {\n        if (this._toggleButton.current) this._toggleButton.current.focus();\n    };\n    ToggleBase1.prototype._noop = function() {\n    /* no-op */ };\n    return ToggleBase1;\n}(_react.Component);\n\n},{\"tslib\":\"01Tx1\",\"react\":\"8ePka\",\"../../Utilities\":\"2F07a\",\"../../Label\":\"lLA6C\",\"../../KeytipData\":\"e8VIa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4JamX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getStyles\", ()=>getStyles);\nvar _tslib = require(\"tslib\");\nvar _styling = require(\"../../Styling\");\nvar DEFAULT_PILL_WIDTH = 40;\nvar DEFAULT_PILL_HEIGHT = 20;\nvar DEFAULT_THUMB_SIZE = 12;\nvar getStyles = function(props) {\n    var _a, _b, _c, _d, _e, _f, _g;\n    var theme = props.theme, className = props.className, disabled = props.disabled, checked = props.checked, inlineLabel = props.inlineLabel, onOffMissing = props.onOffMissing;\n    var semanticColors = theme.semanticColors, palette = theme.palette;\n    // Tokens\n    var pillUncheckedBackground = semanticColors.bodyBackground;\n    var pillCheckedBackground = semanticColors.inputBackgroundChecked;\n    var pillCheckedHoveredBackground = semanticColors.inputBackgroundCheckedHovered;\n    var thumbUncheckedHoveredBackground = palette.neutralDark;\n    var pillCheckedDisabledBackground = semanticColors.disabledBodySubtext;\n    var thumbBackground = semanticColors.smallInputBorder;\n    var thumbCheckedBackground = semanticColors.inputForegroundChecked;\n    var thumbDisabledBackground = semanticColors.disabledBodySubtext;\n    var thumbCheckedDisabledBackground = semanticColors.disabledBackground;\n    var pillBorderColor = semanticColors.smallInputBorder;\n    var pillBorderHoveredColor = semanticColors.inputBorderHovered;\n    var pillBorderDisabledColor = semanticColors.disabledBodySubtext;\n    var textDisabledColor = semanticColors.disabledText;\n    return {\n        root: [\n            \"ms-Toggle\",\n            checked && \"is-checked\",\n            !disabled && \"is-enabled\",\n            disabled && \"is-disabled\",\n            theme.fonts.medium,\n            {\n                marginBottom: \"8px\"\n            },\n            inlineLabel && {\n                display: \"flex\",\n                alignItems: \"center\"\n            },\n            className, \n        ],\n        label: [\n            \"ms-Toggle-label\",\n            {\n                display: \"inline-block\"\n            },\n            disabled && {\n                color: textDisabledColor,\n                selectors: (_a = {}, _a[0, _styling.HighContrastSelector] = {\n                    color: \"GrayText\"\n                }, _a)\n            },\n            inlineLabel && !onOffMissing && {\n                marginRight: 16\n            },\n            onOffMissing && inlineLabel && {\n                order: 1,\n                marginLeft: 16\n            },\n            inlineLabel && {\n                wordBreak: \"break-all\"\n            }, \n        ],\n        container: [\n            \"ms-Toggle-innerContainer\",\n            {\n                display: \"flex\",\n                position: \"relative\"\n            }, \n        ],\n        pill: [\n            \"ms-Toggle-background\",\n            (0, _styling.getFocusStyle)(theme, {\n                inset: -3\n            }),\n            {\n                fontSize: \"20px\",\n                boxSizing: \"border-box\",\n                width: DEFAULT_PILL_WIDTH,\n                height: DEFAULT_PILL_HEIGHT,\n                borderRadius: DEFAULT_PILL_HEIGHT / 2,\n                transition: \"all 0.1s ease\",\n                border: \"1px solid \" + pillBorderColor,\n                background: pillUncheckedBackground,\n                cursor: \"pointer\",\n                display: \"flex\",\n                alignItems: \"center\",\n                padding: \"0 3px\"\n            },\n            !disabled && [\n                !checked && {\n                    selectors: {\n                        \":hover\": [\n                            {\n                                borderColor: pillBorderHoveredColor\n                            }, \n                        ],\n                        \":hover .ms-Toggle-thumb\": [\n                            {\n                                backgroundColor: thumbUncheckedHoveredBackground,\n                                selectors: (_b = {}, _b[0, _styling.HighContrastSelector] = {\n                                    borderColor: \"Highlight\"\n                                }, _b)\n                            }, \n                        ]\n                    }\n                },\n                checked && [\n                    {\n                        background: pillCheckedBackground,\n                        borderColor: \"transparent\",\n                        justifyContent: \"flex-end\"\n                    },\n                    {\n                        selectors: (_c = {\n                            \":hover\": [\n                                {\n                                    backgroundColor: pillCheckedHoveredBackground,\n                                    borderColor: \"transparent\",\n                                    selectors: (_d = {}, _d[0, _styling.HighContrastSelector] = {\n                                        backgroundColor: \"Highlight\"\n                                    }, _d)\n                                }, \n                            ]\n                        }, _c[0, _styling.HighContrastSelector] = (0, _tslib.__assign)({\n                            backgroundColor: \"Highlight\"\n                        }, (0, _styling.getHighContrastNoAdjustStyle)()), _c)\n                    }, \n                ], \n            ],\n            disabled && [\n                {\n                    cursor: \"default\"\n                },\n                !checked && [\n                    {\n                        borderColor: pillBorderDisabledColor\n                    }, \n                ],\n                checked && [\n                    {\n                        backgroundColor: pillCheckedDisabledBackground,\n                        borderColor: \"transparent\",\n                        justifyContent: \"flex-end\"\n                    }, \n                ], \n            ],\n            !disabled && {\n                selectors: {\n                    \"&:hover\": {\n                        selectors: (_e = {}, _e[0, _styling.HighContrastSelector] = {\n                            borderColor: \"Highlight\"\n                        }, _e)\n                    }\n                }\n            }, \n        ],\n        thumb: [\n            \"ms-Toggle-thumb\",\n            {\n                display: \"block\",\n                width: DEFAULT_THUMB_SIZE,\n                height: DEFAULT_THUMB_SIZE,\n                borderRadius: \"50%\",\n                transition: \"all 0.1s ease\",\n                backgroundColor: thumbBackground,\n                /* Border is added to handle high contrast mode for Firefox */ borderColor: \"transparent\",\n                borderWidth: DEFAULT_THUMB_SIZE / 2,\n                borderStyle: \"solid\",\n                boxSizing: \"border-box\"\n            },\n            !disabled && checked && [\n                {\n                    backgroundColor: thumbCheckedBackground,\n                    selectors: (_f = {}, _f[0, _styling.HighContrastSelector] = {\n                        backgroundColor: \"Window\",\n                        borderColor: \"Window\"\n                    }, _f)\n                }, \n            ],\n            disabled && [\n                !checked && [\n                    {\n                        backgroundColor: thumbDisabledBackground\n                    }, \n                ],\n                checked && [\n                    {\n                        backgroundColor: thumbCheckedDisabledBackground\n                    }, \n                ], \n            ], \n        ],\n        text: [\n            \"ms-Toggle-stateText\",\n            {\n                selectors: {\n                    // Workaround: make rules more specific than Label rules.\n                    \"&&\": {\n                        padding: \"0\",\n                        margin: \"0 8px\",\n                        userSelect: \"none\",\n                        fontWeight: (0, _styling.FontWeights).regular\n                    }\n                }\n            },\n            disabled && {\n                selectors: {\n                    \"&&\": {\n                        color: textDisabledColor,\n                        selectors: (_g = {}, _g[0, _styling.HighContrastSelector] = {\n                            color: \"GrayText\"\n                        }, _g)\n                    }\n                }\n            }, \n        ]\n    };\n};\n\n},{\"tslib\":\"01Tx1\",\"../../Styling\":\"7JwBd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"42eQi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SandDanceApp\", ()=>SandDanceApp);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _dataSourcePicker = require(\"./dataSourcePicker\");\nvar _download = require(\"./download\");\nvar _language = require(\"./language\");\nvar _snapshots = require(\"./snapshots\");\nvar _sanddanceExplorer = require(\"@msrvida/sanddance-explorer\");\nvar _react = require(\"react\");\nfunction getViewerOptions(darkTheme, themeColors) {\n    const colors = themeColors && themeColors[darkTheme ? \"dark\" : \"light\"];\n    const viewerOptions = {\n        colors: Object.assign(Object.assign({}, (0, _sanddanceExplorer.getColorSettingsFromThemePalette)((0, _sanddanceExplorer.themePalettes)[darkTheme ? \"dark-theme\" : \"\"])), colors)\n    };\n    return viewerOptions;\n}\nfunction getSnapshotFromHash() {\n    const hash = document.location.hash && document.location.hash.substring(1);\n    if (hash) try {\n        return JSON.parse(decodeURIComponent(hash));\n    } catch (e) {\n    // continue regardless of error\n    }\n}\nlet snapshotOnLoad = getSnapshotFromHash();\nif (snapshotOnLoad && snapshotOnLoad.dataSource && snapshotOnLoad.dataSource.dataSourceType === \"local\") snapshotOnLoad = null;\nclass SandDanceApp extends _react.Component {\n    constructor(props){\n        super(props);\n        this.state = {\n            compactUI: !!localStorage.getItem(\"compactUI\"),\n            dialogMode: null,\n            dataSource: snapshotOnLoad && snapshotOnLoad.dataSource || props.dataSources[0],\n            darkTheme: props.darkTheme\n        };\n        this.viewerOptions = getViewerOptions(this.state.darkTheme, props.themeColors);\n        this.handlers = {\n            hashchange: (e)=>{\n                const snapshot = getSnapshotFromHash();\n                if (snapshot) this.explorer && this.explorer.calculate(()=>this.hydrateSnapshot(snapshot));\n            },\n            resize: (e)=>{\n                this.explorer && this.explorer.resize();\n            }\n        };\n        this.wireEventHandlers(true);\n        this.changeColorScheme(this.state.darkTheme);\n    }\n    wireEventHandlers(add) {\n        for(let key in this.handlers)if (add) window.addEventListener(key, this.handlers[key]);\n        else window.removeEventListener(key, this.handlers[key]);\n    }\n    isSameDataSource(a, b) {\n        if (a.dataSourceType === b.dataSourceType && a.type === b.type && a.id === b.id) {\n            if (a.dataSourceType === \"url\") return a.dataUrl === b.dataUrl;\n            return true;\n        }\n        return false;\n    }\n    hydrateSnapshot(snapshot, selectedSnapshotIndex = -1) {\n        if (snapshot.dataSource) {\n            if (this.isSameDataSource(snapshot.dataSource, this.state.dataSource)) {\n                if (selectedSnapshotIndex === -1) this.explorer.reviveSnapshot(snapshot);\n                else this.explorer.reviveSnapshot(selectedSnapshotIndex);\n                if (snapshot.dataSource.snapshotsUrl && snapshot.dataSource.snapshotsUrl !== this.state.dataSource.snapshotsUrl) //load new snapshots url\n                fetch(snapshot.dataSource.snapshotsUrl).then((response)=>response.json()).then((snapshots)=>{\n                    if ((0, _snapshots.validSnapshots)(snapshots)) {\n                        this.explorer.setState({\n                            snapshots\n                        });\n                        const dataSource = Object.assign({}, this.state.dataSource);\n                        dataSource.snapshotsUrl = snapshot.dataSource.snapshotsUrl;\n                        this.setState({\n                            dataSource\n                        });\n                    }\n                });\n            } else if (snapshot.dataSource.dataSourceType === \"local\") {\n                this.dataSourcePicker.setState({\n                    dialogMode: \"local\"\n                });\n                this.postLoad = (ds)=>{\n                    if (this.isSameDataSource(snapshot.dataSource, ds)) this.hydrateSnapshot(snapshot, selectedSnapshotIndex);\n                };\n            } else this.load(snapshot.dataSource, snapshot.insight).then(()=>{\n                this.explorer.setState({\n                    sideTabId: (0, _sanddanceExplorer.SideTabId).Snapshots,\n                    note: snapshot.description\n                });\n                this.explorer.scrollSnapshotIntoView(selectedSnapshotIndex);\n            }).catch((e)=>{\n                this.loadError(snapshot.dataSource);\n            });\n            return true;\n        }\n    }\n    load(dataSource, partialInsight) {\n        //clone so that we do not modify original object\n        dataSource = (0, _sanddanceExplorer.SandDance).VegaDeckGl.util.clone(dataSource);\n        this.setState({\n            dataSource\n        });\n        document.title = `SandDance - ${dataSource.displayName}`;\n        return this.explorer.load(dataSource, (columns)=>{\n            return partialInsight || this.props.insights && this.props.insights[dataSource.id];\n        }, this.props.initialOptions && (0, _sanddanceExplorer.SandDance).VegaDeckGl.util.deepMerge({}, this.props.initialOptions[\"*\"], this.props.initialOptions[dataSource.id]));\n    }\n    dataSourceError(dataSource) {\n        switch(dataSource.dataSourceType){\n            case \"local\":\n                return (0, _language.strings).errorDataSourceFromLocal(dataSource);\n            case \"sample\":\n            case \"url\":\n                return (0, _language.strings).errorDataSourceFromUrl(dataSource);\n        }\n    }\n    loadError(dataSource) {\n        let error = this.dataSourceError(dataSource);\n        this.explorer.setState({\n            errors: [\n                error\n            ]\n        });\n        this.setState({\n            dataSource: {\n                dataSourceType: null,\n                id: null,\n                type: null\n            }\n        });\n    }\n    updateExplorerViewerOptions(viewerOptions) {\n        this.viewerOptions = viewerOptions;\n        this.explorer && this.explorer.updateViewerOptions(this.viewerOptions);\n    }\n    getThemePalette(darkTheme) {\n        const theme = darkTheme ? \"dark-theme\" : \"\";\n        return (0, _sanddanceExplorer.themePalettes)[theme];\n    }\n    changeColorScheme(darkTheme) {\n        this.updateExplorerViewerOptions(getViewerOptions(darkTheme, this.props.themeColors));\n        (0, _sanddanceExplorer.SandDance).VegaDeckGl.base.vega.scheme((0, _sanddanceExplorer.SandDance).constants.ColorScaleNone, (x)=>this.explorer.viewer.options.colors.defaultCube);\n        this.explorer && this.explorer.viewer && this.explorer.viewer.renderSameLayout(this.viewerOptions);\n        (0, _base.base).fluentUI.loadTheme({\n            palette: this.getThemePalette(darkTheme)\n        });\n    }\n    render() {\n        const theme = this.state.darkTheme ? \"dark-theme\" : \"\";\n        const dataSourceProps = {\n            dataSource: this.state.dataSource,\n            dataSources: this.props.dataSources,\n            changeDataSource: (dataSource)=>{\n                document.location.hash = \"\";\n                return this.load(dataSource).then(()=>{\n                    if (this.postLoad) {\n                        this.postLoad(dataSource);\n                        this.postLoad = null;\n                    }\n                }).catch(()=>this.loadError(dataSource));\n            }\n        };\n        return /*#__PURE__*/ _react.createElement(\"section\", {\n            className: \"sanddance-app\"\n        }, /*#__PURE__*/ _react.createElement((0, _sanddanceExplorer.Explorer), {\n            logoClickTarget: \"_self\",\n            logoClickUrl: \"/SandDance/\",\n            theme: theme,\n            snapshotProps: {\n                modifySnapShot: (snapshot)=>{\n                    snapshot.dataSource = this.state.dataSource;\n                },\n                getTopActions: (snapshots)=>{\n                    const items = [\n                        {\n                            key: \"import\",\n                            text: (0, _language.strings).menuSnapshotsImport,\n                            subMenuProps: {\n                                items: [\n                                    {\n                                        key: \"import-local\",\n                                        text: (0, _language.strings).menuLocal,\n                                        onClick: ()=>this.setState({\n                                                dialogMode: \"import-local\"\n                                            })\n                                    },\n                                    {\n                                        key: \"import-remote\",\n                                        text: (0, _language.strings).menuUrl,\n                                        onClick: ()=>this.setState({\n                                                dialogMode: \"import-remote\"\n                                            })\n                                    }\n                                ]\n                            }\n                        },\n                        {\n                            key: \"export\",\n                            text: (0, _language.strings).menuSnapshotsExportAsJSON,\n                            disabled: snapshots.length === 0,\n                            onClick: ()=>(0, _snapshots.downloadSnapshotsJSON)(snapshots, `${this.state.dataSource.displayName}.snapshots`)\n                        },\n                        {\n                            key: \"export-as\",\n                            text: (0, _language.strings).menuSnapshotsExportAs,\n                            disabled: snapshots.length === 0,\n                            onClick: ()=>this.setState({\n                                    dialogMode: \"export\"\n                                })\n                        }\n                    ];\n                    return items;\n                },\n                getChildren: (snapshots1)=>/*#__PURE__*/ _react.createElement(\"div\", null, this.state.dialogMode === \"import-local\" && /*#__PURE__*/ _react.createElement((0, _snapshots.SnapshotImportLocal), {\n                        theme: theme,\n                        dataSource: this.state.dataSource,\n                        onImportSnapshot: (snapshots)=>this.explorer.setState({\n                                snapshots\n                            }),\n                        onDismiss: ()=>this.setState({\n                                dialogMode: null\n                            })\n                    }), this.state.dialogMode === \"import-remote\" && /*#__PURE__*/ _react.createElement((0, _snapshots.SnapshotImportRemote), {\n                        theme: theme,\n                        dataSource: this.state.dataSource,\n                        onImportSnapshot: (snapshots)=>this.explorer.setState({\n                                snapshots\n                            }),\n                        onSnapshotsUrl: (snapshotsUrl)=>{\n                            const dataSource = Object.assign({}, this.state.dataSource);\n                            dataSource.snapshotsUrl = snapshotsUrl;\n                            this.setState({\n                                dataSource\n                            });\n                        },\n                        onDismiss: ()=>this.setState({\n                                dialogMode: null\n                            })\n                    }), this.state.dialogMode === \"export\" && /*#__PURE__*/ _react.createElement((0, _snapshots.SnapshotExport), {\n                        explorer: this.explorer,\n                        dataSource: this.state.dataSource,\n                        snapshots: snapshots1,\n                        onDismiss: ()=>this.setState({\n                                dialogMode: null\n                            }),\n                        theme: theme\n                    })),\n                getActions: (snapshot, i)=>{\n                    const url = \"#\" + (0, _snapshots.serializeSnapshot)(snapshot);\n                    let element;\n                    if (snapshot.dataSource && snapshot.dataSource.dataSourceType === \"local\") element = /*#__PURE__*/ _react.createElement(\"span\", {\n                        key: `link${i}`\n                    }, (0, _language.strings).labelLocal);\n                    else element = /*#__PURE__*/ _react.createElement(\"a\", {\n                        key: `link${i}`,\n                        href: url,\n                        title: (0, _language.strings).labelLinkDescription,\n                        \"aria-label\": (0, _language.strings).labelLinkDescription\n                    }, (0, _language.strings).labelShare);\n                    return [\n                        {\n                            element\n                        }\n                    ];\n                },\n                getTitle: (insight)=>`${this.state.dataSource.displayName} ${insight.chart}`,\n                getDescription: (insight)=>\"\" //TODO create description from filter etc.\n            },\n            onSnapshotClick: (snapshot, selectedSnapshotIndex)=>this.hydrateSnapshot(snapshot, selectedSnapshotIndex),\n            initialView: \"2d\",\n            mounted: (e)=>{\n                this.explorer = e;\n                this.load(this.state.dataSource, snapshotOnLoad && snapshotOnLoad.insight).catch((e)=>{\n                    this.loadError(this.state.dataSource);\n                });\n                this.props.mounted(this);\n            },\n            dataExportHandler: (data, datatype, displayName)=>{\n                try {\n                    (0, _download.downloadData)(data, `${displayName}.${datatype}`);\n                } catch (e) {\n                    this.explorer.setState({\n                        errors: [\n                            (0, _language.strings).errorDownloadFailure\n                        ]\n                    });\n                }\n            },\n            datasetElement: /*#__PURE__*/ _react.createElement((0, _dataSourcePicker.DataSourceButton), Object.assign({\n                getPicker: ()=>this.dataSourcePicker\n            }, dataSourceProps)),\n            topBarButtonProps: [\n                {\n                    key: \"theme\",\n                    text: this.state.darkTheme ? (0, _language.strings).buttonThemeLight : (0, _language.strings).buttonThemeDark,\n                    iconProps: {\n                        iconName: this.state.darkTheme ? \"Sunny\" : \"ClearNight\"\n                    },\n                    onClick: ()=>{\n                        const darkTheme = !this.state.darkTheme;\n                        this.props.setTheme && this.props.setTheme(darkTheme);\n                        this.setState({\n                            darkTheme\n                        });\n                        this.changeColorScheme(darkTheme);\n                    }\n                }\n            ],\n            viewerOptions: this.viewerOptions,\n            compactUI: this.state.compactUI,\n            additionalSettings: [\n                {\n                    groupLabel: (0, _language.strings).labelPreferences,\n                    children: /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.Toggle, {\n                        label: (0, _language.strings).labelCompactUI,\n                        title: (0, _language.strings).labelCompactUIDescription,\n                        checked: this.state.compactUI,\n                        onChange: (e, checked)=>{\n                            if (checked) localStorage.setItem(\"compactUI\", \"true\");\n                            else localStorage.removeItem(\"compactUI\");\n                            this.setState({\n                                compactUI: checked\n                            });\n                        }\n                    })\n                }\n            ]\n        }), /*#__PURE__*/ _react.createElement((0, _dataSourcePicker.DataSourcePicker), Object.assign({\n            ref: (dsp)=>{\n                if (dsp && !this.dataSourcePicker) this.dataSourcePicker = dsp;\n            },\n            theme: theme\n        }, dataSourceProps)));\n    }\n}\n\n},{\"./base\":\"6wvRv\",\"./dataSourcePicker\":\"ctryz\",\"./download\":\"fCo8g\",\"./language\":\"PbiF5\",\"./snapshots\":\"82K1P\",\"@msrvida/sanddance-explorer\":\"cnuDN\",\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ctryz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataSourceButton\", ()=>DataSourceButton);\nparcelHelpers.export(exports, \"DataSourcePicker\", ()=>DataSourcePicker);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _language = require(\"./language\");\nvar _url = require(\"./url\");\nvar _sanddanceExplorer = require(\"@msrvida/sanddance-explorer\");\nvar _react = require(\"react\");\nfunction DataSourceButton(props) {\n    const picker = props.getPicker();\n    if (!picker) return null;\n    const menuProps = {\n        items: [\n            {\n                key: \"sample-section\",\n                itemType: (0, _base.base).fluentUI.ContextualMenuItemType.Section,\n                sectionProps: {\n                    title: (0, _language.strings).sampleDataPrefix,\n                    items: props.dataSources.map((ds, i)=>{\n                        const item = {\n                            key: ds.id,\n                            text: ds.displayName,\n                            onClick: (e)=>{\n                                picker.changeDataSource(ds);\n                            }\n                        };\n                        return item;\n                    })\n                }\n            },\n            {\n                key: \"user-section\",\n                itemType: (0, _base.base).fluentUI.ContextualMenuItemType.Section,\n                sectionProps: {\n                    topDivider: true,\n                    title: (0, _language.strings).menuUserData,\n                    items: [\n                        {\n                            key: \"local\",\n                            text: (0, _language.strings).menuLocal,\n                            onClick: (e)=>picker.setState({\n                                    dialogMode: \"local\"\n                                })\n                        },\n                        {\n                            key: \"url\",\n                            text: (0, _language.strings).menuUrl,\n                            onClick: (e)=>picker.setState({\n                                    dialogMode: \"url\"\n                                })\n                        }\n                    ]\n                }\n            }\n        ]\n    };\n    return /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n        className: \"sanddance-datasource-picker\",\n        text: dataSourcePrefix(props.dataSource.dataSourceType, props.dataSource.displayName),\n        menuProps: menuProps\n    });\n}\nclass DataSourcePicker extends _react.Component {\n    constructor(props){\n        super(props);\n        this.state = {\n            url: \"\",\n            urlType: DataSourcePicker.urlTypes[0],\n            working: false\n        };\n    }\n    changeDataSource(dataSource) {\n        this.setState({\n            working: true\n        });\n        return new Promise((resolve, reject)=>{\n            const uploadFormatError = \"\";\n            const urlError = \"\";\n            this.setState({\n                uploadFormatError,\n                urlError\n            });\n            this.props.changeDataSource(dataSource).then(()=>{\n                this.setState({\n                    working: false,\n                    uploadFormatError: \"\",\n                    urlError: \"\",\n                    dialogMode: null\n                });\n                resolve();\n            }).catch((reason)=>{\n                this.setState({\n                    working: false\n                });\n                reject(reason);\n            });\n        });\n    }\n    upload(e) {\n        if (e.target.files) {\n            const file = e.target.files[0];\n            const split = file.name.split(\".\");\n            const type = split[split.length - 1];\n            if (DataSourcePicker.urlTypes.indexOf(type) >= 0) {\n                const reader = new FileReader();\n                reader.onload = ()=>{\n                    const id = file.name;\n                    const displayName = file.name;\n                    const rawText = reader.result;\n                    const ds = {\n                        dataSourceType: \"local\",\n                        displayName,\n                        id,\n                        rawText,\n                        type\n                    };\n                    this.changeDataSource(ds);\n                };\n                reader.readAsText(file);\n            } else {\n                const uploadFormatError = (0, _language.strings).errorInvalidFileFormat;\n                this.setState({\n                    uploadFormatError\n                });\n            }\n        }\n    }\n    loadUrl() {\n        if (!this.state.url) return this.setState({\n            urlError: (0, _language.strings).errorNoUrl\n        });\n        if (this.state.url.toLocaleLowerCase().substr(0, 4) !== \"http\") return this.setState({\n            urlError: (0, _language.strings).errorUrlHttp\n        });\n        //TODO: check url\n        const { url  } = this.state;\n        const ds = {\n            dataSourceType: \"url\",\n            displayName: url,\n            id: url,\n            dataUrl: url,\n            type: this.state.urlType\n        };\n        this.changeDataSource(ds).catch((e)=>{\n            this.setState({\n                urlError: e.message\n            });\n        });\n    }\n    getUrlShortcut(dataUrl, type) {\n        const dss = {\n            dataSource: {\n                dataSourceType: \"url\",\n                dataUrl,\n                displayName: dataUrl.substring(dataUrl.lastIndexOf(\"/\") + 1, dataUrl.lastIndexOf(\".\")),\n                id: \"\",\n                type\n            }\n        };\n        return \"#\" + JSON.stringify(dss);\n    }\n    render() {\n        const closeDialog = ()=>{\n            this.setState({\n                dialogMode: null\n            });\n        };\n        let shortcut;\n        if (this.state.url && !(0, _url.invalidUrlError)(this.state.url) && !this.state.urlError) shortcut = this.getUrlShortcut(this.state.url, this.state.urlType);\n        return [\n            /*#__PURE__*/ _react.createElement((0, _sanddanceExplorer.controls).Dialog, {\n                key: \"local\",\n                hidden: !(this.state.dialogMode === \"local\"),\n                onDismiss: closeDialog,\n                dialogContentProps: {\n                    className: `sanddance-dialog ${this.props.theme}`,\n                    type: (0, _base.base).fluentUI.DialogType.normal,\n                    title: (0, _language.strings).dialogTitleLocal,\n                    subText: (0, _language.strings).dialogSubtextLocal\n                }\n            }, /*#__PURE__*/ _react.createElement(\"input\", {\n                type: \"file\",\n                onChange: (e)=>this.upload(e),\n                disabled: this.state.working\n            }), this.state.uploadFormatError && /*#__PURE__*/ _react.createElement(\"div\", {\n                className: \"error\"\n            }, this.state.uploadFormatError)),\n            /*#__PURE__*/ _react.createElement((0, _sanddanceExplorer.controls).Dialog, {\n                key: \"url\",\n                hidden: !(this.state.dialogMode === \"url\"),\n                onDismiss: closeDialog,\n                dialogContentProps: {\n                    className: `sanddance-dialog ${this.props.theme}`,\n                    type: (0, _base.base).fluentUI.DialogType.normal,\n                    title: (0, _language.strings).dialogTitleUrl\n                },\n                buttons: [\n                    /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n                        key: 0,\n                        onClick: (e)=>this.loadUrl(),\n                        iconProps: {\n                            iconName: \"CloudDownload\"\n                        },\n                        text: (0, _language.strings).dialogLoadButton,\n                        disabled: this.state.working\n                    })\n                ]\n            }, /*#__PURE__*/ _react.createElement(\"section\", null, /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.TextField, {\n                label: (0, _language.strings).labelUrl,\n                placeholder: (0, _language.strings).urlInputPlaceholder,\n                onKeyUp: (e)=>e.keyCode === 13 && this.loadUrl(),\n                onChange: (e, url)=>this.setState({\n                        url,\n                        urlError: \"\"\n                    }),\n                value: this.state.url,\n                disabled: this.state.working\n            }), this.state.urlError && /*#__PURE__*/ _react.createElement(\"div\", {\n                className: \"error\"\n            }, this.state.urlError)), /*#__PURE__*/ _react.createElement(\"section\", null, /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.ChoiceGroup, {\n                options: DataSourcePicker.urlTypes.map((urlType, i)=>{\n                    return {\n                        key: `${i}`,\n                        text: urlType,\n                        disabled: this.state.working,\n                        checked: i === 0\n                    };\n                }),\n                onChange: (ev, option)=>this.setState({\n                        urlType: option.text,\n                        urlError: \"\"\n                    }),\n                label: (0, _language.strings).labelDataFormat\n            })), /*#__PURE__*/ _react.createElement(\"section\", {\n                className: \"tip\",\n                style: {\n                    visibility: !(0, _url.invalidUrlError)(this.state.url) && !this.state.urlError ? \"visible\" : \"hidden\"\n                }\n            }, (0, _language.strings).labelDataUrlShortcut, \" \", /*#__PURE__*/ _react.createElement(\"a\", {\n                href: shortcut,\n                title: (0, _language.strings).labelLinkDescription,\n                \"aria-label\": (0, _language.strings).labelLinkDescription\n            }, (0, _language.strings).labelLink)))\n        ];\n    }\n}\nDataSourcePicker.urlTypes = [\n    \"json\",\n    \"csv\",\n    \"tsv\",\n    \"topojson\"\n];\nfunction dataSourcePrefix(dt, displayName) {\n    switch(dt){\n        case \"sample\":\n            return `${(0, _language.strings).sampleDataPrefix}: ${displayName}`;\n        case \"local\":\n            return (0, _language.strings).localFilePrefix;\n        case \"url\":\n            return (0, _language.strings).urlPrefix;\n    }\n    return (0, _language.strings).buttonLoadData;\n}\n\n},{\"./base\":\"6wvRv\",\"./language\":\"PbiF5\",\"./url\":\"7ClBS\",\"@msrvida/sanddance-explorer\":\"cnuDN\",\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"PbiF5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"strings\", ()=>strings);\nconst strings = {\n    buttonLoadData: \"Load data\",\n    buttonThemeDark: \"Dark\",\n    buttonThemeLight: \"Light\",\n    buttonExport: \"Export\",\n    menuUserData: \"Use your own data\",\n    menuLocal: \"On this computer ...\",\n    menuUrl: \"Enter a URL ...\",\n    menuSnapshotsExportAsJSON: \"Export as .snapshots JSON file\",\n    menuSnapshotsExportAs: \"Export as ...\",\n    menuSnapshotsImport: \"Import a .snapshots JSON file\",\n    dialogTitleLocal: \"Use a file from your computer\",\n    dialogSubtextLocal: \"Your file will not be uploaded, it is only used by the browser on this computer.  The currently supported data formats are json (the default), csv (comma-separated values), tsv (tab-separated values), and topojson.\",\n    dialogTitleUrl: \"Use a data file via URL\",\n    dialogTitleSnapshotsExport: \"Export as\",\n    dialogTitleSnapshotsLocal: \"Use a snapshots file from your computer\",\n    dialogSubtextSnapshotsLocal: \"Use a file that was previously exported snapshots file. Your file will not be uploaded, it is only used by the browser on this computer.\",\n    dialogTitleSnapshotsUrl: \"Use a snapshots file via URL\",\n    dialogLoadButton: \"Load\",\n    labelLocal: \"[local]\",\n    labelColorFilter: \"Note: Colors will be re-mapped to the filter when viewing this saved chart.\",\n    labelPreferences: \"Preferences\",\n    labelCompactUI: \"Compact UI\",\n    labelCompactUIDescription: \"Compact UI hides collapses labels on dropdown menus.\",\n    labelSnapshotsExportHTMLTitle: \"HTML\",\n    labelSnapshotsExportHTMLDescription: \"A self contained HTML page with current data and snapshots pre-loaded.\",\n    labelSnapshotsExportMarkdownTitle: \"Markdown\",\n    labelSnapshotsExportMarkdownDescription: \"Markdown is a language used by many blogging platforms. Exports a Markdown file with thumbnails of these snapshots which link back to the SandDance website.\",\n    labelSnapshotsShortcut: \"Tip: Your .snapshots JSON file can also be pre-loaded with this\",\n    labelShare: \"share\",\n    labelLink: \"link\",\n    labelLinkDescription: \"A URL to revive this snapshot.\",\n    labelUrl: \"Url\",\n    labelDataFormat: \"Data format\",\n    labelDataUrlShortcut: \"Tip: Your data file can also be pre-loaded with this\",\n    urlInputPlaceholder: \"paste URL\",\n    sampleDataPrefix: \"Sample data\",\n    localFilePrefix: \"Local file\",\n    urlPrefix: \"Url\",\n    errorInvalidFileFormat: \"Invalid file format\",\n    errorNoUrl: \"Please enter a url\",\n    errorUrlHttp: 'Url must begin with \"http\"',\n    errorDownloadFailure: \"Data could not be prepared for download.\",\n    errorDataSourceFromLocal: (ds)=>`Could not load ${ds.type} from local file.`,\n    errorDataSourceFromUrl: (ds)=>`Could not load ${ds.type} from ${ds.dataUrl}`\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ClBS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"invalidUrlError\", ()=>invalidUrlError);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _language = require(\"./language\");\nfunction invalidUrlError(url) {\n    if (!url) return (0, _language.strings).errorNoUrl;\n    if (url.toLocaleLowerCase().substr(0, 4) !== \"http\") return (0, _language.strings).errorUrlHttp;\n}\n\n},{\"./language\":\"PbiF5\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fCo8g\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nparcelHelpers.export(exports, \"downloadData\", ()=>downloadData);\nfunction downloadData(data, fileName) {\n    // Adapted from https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server\n    var a = document.createElement(\"a\");\n    a.setAttribute(\"download\", fileName);\n    document.body.appendChild(a);\n    const blob = dataURIToBlob(data);\n    a.href = URL.createObjectURL(blob);\n    // we must revoke the object URL, \n    // since we can't know when the download occured, we have to attach it on the click handler..\n    a.onclick = ()=>{\n        // ..and to wait a frame\n        requestAnimationFrame(()=>URL.revokeObjectURL(a.href));\n        document.body.removeChild(a);\n    };\n    a.click();\n}\n//from https://stackoverflow.com/a/37151835/620501\nfunction dataURIToBlob(binStr) {\n    var len = binStr.length, arr = new Uint8Array(len);\n    for(var i = 0; i < len; i++)arr[i] = binStr.charCodeAt(i);\n    return new Blob([\n        arr\n    ]);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"82K1P\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cleanSnapshots\", ()=>cleanSnapshots);\nparcelHelpers.export(exports, \"downloadSnapshotsJSON\", ()=>downloadSnapshotsJSON);\nparcelHelpers.export(exports, \"serializeSnapshot\", ()=>serializeSnapshot);\nparcelHelpers.export(exports, \"validSnapshots\", ()=>validSnapshots);\nparcelHelpers.export(exports, \"SnapshotImportLocal\", ()=>SnapshotImportLocal);\nparcelHelpers.export(exports, \"SnapshotImportRemote\", ()=>SnapshotImportRemote);\nparcelHelpers.export(exports, \"SnapshotExport\", ()=>SnapshotExport);\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _base = require(\"./base\");\nvar _download = require(\"./download\");\nvar _language = require(\"./language\");\nvar _url = require(\"./url\");\nvar _sanddanceExplorer = require(\"@msrvida/sanddance-explorer\");\nvar _react = require(\"react\");\nvar util = (0, _sanddanceExplorer.SandDance).VegaDeckGl.util;\nfunction markdownImageLink(alt, imageUrl, link) {\n    return `[![${alt}](${imageUrl})](${link})`;\n}\nfunction cleanSnapshots(snapshots) {\n    //remove data sources from snapshots\n    const clean = util.clone(snapshots);\n    clean.forEach((snapshot)=>{\n        if (snapshot.dataSource) delete snapshot.dataSource.snapshotsUrl;\n    });\n    return clean;\n}\nfunction downloadSnapshotsJSON(snapshots, filename) {\n    //clean prior to exporting\n    const clean = cleanSnapshots(snapshots);\n    (0, _download.downloadData)(JSON.stringify(clean, null, 2), filename);\n}\nfunction serializeSnapshot(snapshotWithImage) {\n    const snapshot = util.clone(snapshotWithImage);\n    //remove the image data from the snapshot\n    delete snapshot.bgColor;\n    delete snapshot.image;\n    if (snapshot.dataSource) delete snapshot.dataSource.rawText;\n    return JSON.stringify(snapshot);\n}\nfunction isSnapshot(snapshot) {\n    return snapshot.insight && snapshot.title;\n}\nfunction validSnapshots(snapshots) {\n    if (Array.isArray(snapshots)) {\n        for(let i = 0; i < snapshots.length; i++){\n            if (!isSnapshot(snapshots[i])) return false;\n        }\n        return true;\n    }\n    return false;\n}\nclass SnapshotImportLocal extends _react.Component {\n    constructor(props){\n        super(props);\n        this.state = {\n            working: false\n        };\n    }\n    readFile(e) {\n        if (e.target.files) {\n            this.setState({\n                working: true\n            });\n            const file = e.target.files[0];\n            const reader = new FileReader();\n            reader.onload = ()=>{\n                const rawText = reader.result;\n                let snapshots;\n                try {\n                    snapshots = JSON.parse(rawText);\n                } catch (e) {\n                    this.setState({\n                        fileFormatError: (0, _language.strings).errorInvalidFileFormat,\n                        working: false\n                    });\n                }\n                //validate these are snapshots\n                if (validSnapshots(snapshots)) {\n                    this.props.onImportSnapshot(snapshots);\n                    this.setState({\n                        working: false\n                    });\n                    this.props.onDismiss();\n                } else this.setState({\n                    fileFormatError: (0, _language.strings).errorInvalidFileFormat,\n                    working: false\n                });\n            };\n            reader.readAsText(file);\n        }\n    }\n    render() {\n        return /*#__PURE__*/ _react.createElement(\"div\", null, /*#__PURE__*/ _react.createElement((0, _sanddanceExplorer.controls).Dialog, {\n            hidden: false,\n            onDismiss: this.props.onDismiss,\n            dialogContentProps: {\n                className: `sanddance-dialog ${this.props.theme}`,\n                type: (0, _base.base).fluentUI.DialogType.normal,\n                title: (0, _language.strings).dialogTitleSnapshotsLocal,\n                subText: (0, _language.strings).dialogSubtextSnapshotsLocal\n            }\n        }, /*#__PURE__*/ _react.createElement(\"section\", null, /*#__PURE__*/ _react.createElement(\"input\", {\n            type: \"file\",\n            onChange: (e)=>this.readFile(e),\n            disabled: this.state.working\n        }), this.state.fileFormatError && /*#__PURE__*/ _react.createElement(\"div\", {\n            className: \"error\"\n        }, this.state.fileFormatError))));\n    }\n}\nclass SnapshotImportRemote extends _react.Component {\n    constructor(props){\n        super(props);\n        this.state = {\n            working: false\n        };\n    }\n    getUrlShortcut() {\n        const dataSource = util.clone(this.props.dataSource);\n        delete dataSource.snapshots;\n        dataSource.snapshotsUrl = this.state.url;\n        const dss = {\n            dataSource\n        };\n        return \"#\" + JSON.stringify(dss);\n    }\n    loadUrl() {\n        const urlError = (0, _url.invalidUrlError)(this.state.url);\n        if (urlError) return this.setState({\n            urlError\n        });\n        const { url  } = this.state;\n        fetch(url).then((response)=>{\n            if (response.status === 200) return response.json();\n            else this.setState({\n                urlError: response.statusText\n            });\n        }).then((snapshots)=>{\n            if (validSnapshots(snapshots)) {\n                this.props.onImportSnapshot(snapshots);\n                this.props.onSnapshotsUrl(url);\n                this.setState({\n                    working: false\n                });\n                this.props.onDismiss();\n            } else this.setState({\n                fileFormatError: (0, _language.strings).errorInvalidFileFormat,\n                working: false\n            });\n        }).catch((e)=>{\n            this.setState({\n                urlError: e\n            });\n        });\n    }\n    render() {\n        let shortcut;\n        if (this.props.dataSource.dataSourceType !== \"local\" && this.state.url && !(0, _url.invalidUrlError)(this.state.url) && !this.state.urlError) shortcut = this.getUrlShortcut();\n        return /*#__PURE__*/ _react.createElement(\"div\", null, /*#__PURE__*/ _react.createElement((0, _sanddanceExplorer.controls).Dialog, {\n            hidden: false,\n            onDismiss: this.props.onDismiss,\n            dialogContentProps: {\n                className: `sanddance-dialog ${this.props.theme}`,\n                type: (0, _base.base).fluentUI.DialogType.normal,\n                title: (0, _language.strings).dialogTitleSnapshotsUrl\n            },\n            buttons: [\n                /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n                    disabled: !this.state.url || !!this.state.urlError,\n                    key: 0,\n                    onClick: (e)=>this.loadUrl(),\n                    iconProps: {\n                        iconName: \"CloudDownload\"\n                    },\n                    text: (0, _language.strings).dialogLoadButton\n                })\n            ]\n        }, /*#__PURE__*/ _react.createElement(\"section\", null, /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.TextField, {\n            label: (0, _language.strings).labelUrl,\n            placeholder: (0, _language.strings).urlInputPlaceholder,\n            onKeyUp: (e)=>e.keyCode === 13 && this.loadUrl(),\n            onChange: (e, url)=>this.setState({\n                    url,\n                    urlError: \"\"\n                }),\n            value: this.state.url,\n            disabled: this.state.working\n        }), this.state.urlError && /*#__PURE__*/ _react.createElement(\"div\", {\n            className: \"error\"\n        }, this.state.urlError)), this.props.dataSource.dataSourceType !== \"local\" && /*#__PURE__*/ _react.createElement(\"section\", {\n            className: \"tip\",\n            style: {\n                visibility: !(0, _url.invalidUrlError)(this.state.url) && !this.state.urlError ? \"visible\" : \"hidden\"\n            }\n        }, (0, _language.strings).labelSnapshotsShortcut, \" \", /*#__PURE__*/ _react.createElement(\"a\", {\n            href: shortcut,\n            title: (0, _language.strings).labelLinkDescription,\n            \"aria-label\": (0, _language.strings).labelLinkDescription\n        }, (0, _language.strings).labelShare))));\n    }\n}\nfunction SnapshotExport(props) {\n    return /*#__PURE__*/ _react.createElement((0, _sanddanceExplorer.controls).Dialog, {\n        hidden: false,\n        onDismiss: props.onDismiss,\n        dialogContentProps: {\n            className: `sanddance-dialog ${props.theme} sanddance-export`,\n            type: (0, _base.base).fluentUI.DialogType.normal,\n            title: (0, _language.strings).dialogTitleSnapshotsExport\n        }\n    }, /*#__PURE__*/ _react.createElement(\"ul\", null, /*#__PURE__*/ _react.createElement(\"li\", null, /*#__PURE__*/ _react.createElement(\"strong\", null, (0, _language.strings).labelSnapshotsExportHTMLTitle), /*#__PURE__*/ _react.createElement(\"div\", null, (0, _language.strings).labelSnapshotsExportHTMLDescription), /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n        iconProps: {\n            iconName: \"Download\"\n        },\n        text: `${(0, _language.strings).buttonExport} ${(0, _language.strings).labelSnapshotsExportHTMLTitle}`,\n        onClick: (e)=>{\n            const clean = cleanSnapshots(props.snapshots);\n            const html = (0, _sanddanceExplorer.getEmbedHTML)(props.explorer.state.dataContent.data, props.dataSource.displayName, clean);\n            (0, _download.downloadData)(html, `${props.dataSource.displayName}.html`);\n        }\n    })), /*#__PURE__*/ _react.createElement(\"li\", null, /*#__PURE__*/ _react.createElement(\"strong\", null, (0, _language.strings).labelSnapshotsExportMarkdownTitle), /*#__PURE__*/ _react.createElement(\"div\", null, (0, _language.strings).labelSnapshotsExportMarkdownDescription), /*#__PURE__*/ _react.createElement((0, _base.base).fluentUI.PrimaryButton, {\n        iconProps: {\n            iconName: \"Download\"\n        },\n        text: `${(0, _language.strings).buttonExport} ${(0, _language.strings).labelSnapshotsExportMarkdownTitle}`,\n        onClick: (e)=>{\n            const sections = props.snapshots.map((snapshot)=>{\n                const section = [\n                    `## ${snapshot.title}`\n                ];\n                section.push(snapshot.description);\n                section.push(\"\\n\");\n                const url = `${location.origin}/#${encodeURIComponent(serializeSnapshot(snapshot))}`;\n                section.push(markdownImageLink(snapshot.title, snapshot.image, url));\n                return section.join(\"\\n\");\n            });\n            sections.unshift(`# ${props.dataSource.displayName}`);\n            (0, _download.downloadData)(sections.join(\"\\n\\n\"), `${props.dataSource.displayName}.snapshots.md`);\n        }\n    }))));\n}\n\n},{\"./base\":\"6wvRv\",\"./download\":\"fCo8g\",\"./language\":\"PbiF5\",\"./url\":\"7ClBS\",\"@msrvida/sanddance-explorer\":\"cnuDN\",\"react\":\"8ePka\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gu68g\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"COORDINATE_SYSTEM\", ()=>(0, _constants.COORDINATE_SYSTEM));\nparcelHelpers.export(exports, \"LightingEffect\", ()=>(0, _lightingEffectDefault.default));\nparcelHelpers.export(exports, \"AmbientLight\", ()=>(0, _ambientLight.AmbientLight));\nparcelHelpers.export(exports, \"DirectionalLight\", ()=>(0, _directionalLight.DirectionalLight));\nparcelHelpers.export(exports, \"PointLight\", ()=>(0, _pointLight.PointLight));\nparcelHelpers.export(exports, \"_CameraLight\", ()=>(0, _cameraLightDefault.default));\nparcelHelpers.export(exports, \"_SunLight\", ()=>(0, _sunLightDefault.default));\nparcelHelpers.export(exports, \"PostProcessEffect\", ()=>(0, _postProcessEffectDefault.default));\nparcelHelpers.export(exports, \"_LayersPass\", ()=>(0, _layersPassDefault.default));\nparcelHelpers.export(exports, \"Deck\", ()=>(0, _deckDefault.default));\nparcelHelpers.export(exports, \"LayerManager\", ()=>(0, _layerManagerDefault.default));\nparcelHelpers.export(exports, \"AttributeManager\", ()=>(0, _attributeManagerDefault.default));\nparcelHelpers.export(exports, \"Layer\", ()=>(0, _layerDefault.default));\nparcelHelpers.export(exports, \"CompositeLayer\", ()=>(0, _compositeLayerDefault.default));\nparcelHelpers.export(exports, \"DeckRenderer\", ()=>(0, _deckRendererDefault.default));\nparcelHelpers.export(exports, \"Viewport\", ()=>(0, _viewportDefault.default));\nparcelHelpers.export(exports, \"WebMercatorViewport\", ()=>(0, _webMercatorViewportDefault.default));\nparcelHelpers.export(exports, \"_GlobeViewport\", ()=>(0, _globeViewportDefault.default));\nparcelHelpers.export(exports, \"picking\", ()=>(0, _shaderlib.picking));\nparcelHelpers.export(exports, \"project\", ()=>(0, _shaderlib.project));\nparcelHelpers.export(exports, \"project32\", ()=>(0, _shaderlib.project32));\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>(0, _shaderlib.gouraudLighting));\nparcelHelpers.export(exports, \"phongLighting\", ()=>(0, _shaderlib.phongLighting));\nparcelHelpers.export(exports, \"shadow\", ()=>(0, _shaderlib.shadow));\nparcelHelpers.export(exports, \"View\", ()=>(0, _viewDefault.default));\nparcelHelpers.export(exports, \"MapView\", ()=>(0, _mapViewDefault.default));\nparcelHelpers.export(exports, \"FirstPersonView\", ()=>(0, _firstPersonViewDefault.default));\nparcelHelpers.export(exports, \"OrbitView\", ()=>(0, _orbitViewDefault.default));\nparcelHelpers.export(exports, \"OrthographicView\", ()=>(0, _orthographicViewDefault.default));\nparcelHelpers.export(exports, \"_GlobeView\", ()=>(0, _globeViewDefault.default));\nparcelHelpers.export(exports, \"Controller\", ()=>(0, _controllerDefault.default));\nparcelHelpers.export(exports, \"MapController\", ()=>(0, _mapControllerDefault.default));\nparcelHelpers.export(exports, \"_GlobeController\", ()=>(0, _globeControllerDefault.default));\nparcelHelpers.export(exports, \"FirstPersonController\", ()=>(0, _firstPersonControllerDefault.default));\nparcelHelpers.export(exports, \"OrbitController\", ()=>(0, _orbitControllerDefault.default));\nparcelHelpers.export(exports, \"OrthographicController\", ()=>(0, _orthographicControllerDefault.default));\nparcelHelpers.export(exports, \"Effect\", ()=>(0, _effectDefault.default));\nparcelHelpers.export(exports, \"LayerExtension\", ()=>(0, _layerExtensionDefault.default));\nparcelHelpers.export(exports, \"TRANSITION_EVENTS\", ()=>(0, _transitionManager.TRANSITION_EVENTS));\nparcelHelpers.export(exports, \"TransitionInterpolator\", ()=>(0, _transitionInterpolatorDefault.default));\nparcelHelpers.export(exports, \"LinearInterpolator\", ()=>(0, _linearInterpolatorDefault.default));\nparcelHelpers.export(exports, \"FlyToInterpolator\", ()=>(0, _viewportFlyToInterpolatorDefault.default));\nparcelHelpers.export(exports, \"log\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"createIterable\", ()=>(0, _iterableUtils.createIterable));\nparcelHelpers.export(exports, \"fp64LowPart\", ()=>(0, _mathUtils.fp64LowPart));\nparcelHelpers.export(exports, \"Tesselator\", ()=>(0, _tesselatorDefault.default));\nparcelHelpers.export(exports, \"_fillArray\", ()=>(0, _flatten.fillArray));\nparcelHelpers.export(exports, \"_flatten\", ()=>(0, _flatten.flatten));\nparcelHelpers.export(exports, \"_count\", ()=>(0, _count.count));\nparcelHelpers.export(exports, \"_memoize\", ()=>(0, _memoizeDefault.default));\nparcelHelpers.export(exports, \"_mergeShaders\", ()=>(0, _shader.mergeShaders));\nparcelHelpers.export(exports, \"_compareProps\", ()=>(0, _props.compareProps));\nvar _init = require(\"./lib/init\");\nvar _shaderlib = require(\"./shaderlib\");\nvar _constants = require(\"./lib/constants\");\nvar _lightingEffect = require(\"./effects/lighting/lighting-effect\");\nvar _lightingEffectDefault = parcelHelpers.interopDefault(_lightingEffect);\nvar _ambientLight = require(\"./effects/lighting/ambient-light\");\nvar _directionalLight = require(\"./effects/lighting/directional-light\");\nvar _pointLight = require(\"./effects/lighting/point-light\");\nvar _cameraLight = require(\"./effects/lighting/camera-light\");\nvar _cameraLightDefault = parcelHelpers.interopDefault(_cameraLight);\nvar _sunLight = require(\"./effects/lighting/sun-light\");\nvar _sunLightDefault = parcelHelpers.interopDefault(_sunLight);\nvar _postProcessEffect = require(\"./effects/post-process-effect\");\nvar _postProcessEffectDefault = parcelHelpers.interopDefault(_postProcessEffect);\nvar _layersPass = require(\"./passes/layers-pass\");\nvar _layersPassDefault = parcelHelpers.interopDefault(_layersPass);\nvar _deck = require(\"./lib/deck\");\nvar _deckDefault = parcelHelpers.interopDefault(_deck);\nvar _layerManager = require(\"./lib/layer-manager\");\nvar _layerManagerDefault = parcelHelpers.interopDefault(_layerManager);\nvar _attributeManager = require(\"./lib/attribute/attribute-manager\");\nvar _attributeManagerDefault = parcelHelpers.interopDefault(_attributeManager);\nvar _layer = require(\"./lib/layer\");\nvar _layerDefault = parcelHelpers.interopDefault(_layer);\nvar _compositeLayer = require(\"./lib/composite-layer\");\nvar _compositeLayerDefault = parcelHelpers.interopDefault(_compositeLayer);\nvar _deckRenderer = require(\"./lib/deck-renderer\");\nvar _deckRendererDefault = parcelHelpers.interopDefault(_deckRenderer);\nvar _viewport = require(\"./viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _webMercatorViewport = require(\"./viewports/web-mercator-viewport\");\nvar _webMercatorViewportDefault = parcelHelpers.interopDefault(_webMercatorViewport);\nvar _globeViewport = require(\"./viewports/globe-viewport\");\nvar _globeViewportDefault = parcelHelpers.interopDefault(_globeViewport);\nvar _view = require(\"./views/view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _mapView = require(\"./views/map-view\");\nvar _mapViewDefault = parcelHelpers.interopDefault(_mapView);\nvar _firstPersonView = require(\"./views/first-person-view\");\nvar _firstPersonViewDefault = parcelHelpers.interopDefault(_firstPersonView);\nvar _orbitView = require(\"./views/orbit-view\");\nvar _orbitViewDefault = parcelHelpers.interopDefault(_orbitView);\nvar _orthographicView = require(\"./views/orthographic-view\");\nvar _orthographicViewDefault = parcelHelpers.interopDefault(_orthographicView);\nvar _globeView = require(\"./views/globe-view\");\nvar _globeViewDefault = parcelHelpers.interopDefault(_globeView);\nvar _controller = require(\"./controllers/controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _mapController = require(\"./controllers/map-controller\");\nvar _mapControllerDefault = parcelHelpers.interopDefault(_mapController);\nvar _globeController = require(\"./controllers/globe-controller\");\nvar _globeControllerDefault = parcelHelpers.interopDefault(_globeController);\nvar _firstPersonController = require(\"./controllers/first-person-controller\");\nvar _firstPersonControllerDefault = parcelHelpers.interopDefault(_firstPersonController);\nvar _orbitController = require(\"./controllers/orbit-controller\");\nvar _orbitControllerDefault = parcelHelpers.interopDefault(_orbitController);\nvar _orthographicController = require(\"./controllers/orthographic-controller\");\nvar _orthographicControllerDefault = parcelHelpers.interopDefault(_orthographicController);\nvar _effect = require(\"./lib/effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _layerExtension = require(\"./lib/layer-extension\");\nvar _layerExtensionDefault = parcelHelpers.interopDefault(_layerExtension);\nvar _transitionManager = require(\"./controllers/transition-manager\");\nvar _transitionInterpolator = require(\"./transitions/transition-interpolator\");\nvar _transitionInterpolatorDefault = parcelHelpers.interopDefault(_transitionInterpolator);\nvar _linearInterpolator = require(\"./transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _viewportFlyToInterpolator = require(\"./transitions/viewport-fly-to-interpolator\");\nvar _viewportFlyToInterpolatorDefault = parcelHelpers.interopDefault(_viewportFlyToInterpolator);\nvar _log = require(\"./utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _iterableUtils = require(\"./utils/iterable-utils\");\nvar _mathUtils = require(\"./utils/math-utils\");\nvar _tesselator = require(\"./utils/tesselator\");\nvar _tesselatorDefault = parcelHelpers.interopDefault(_tesselator);\nvar _flatten = require(\"./utils/flatten\");\nvar _count = require(\"./utils/count\");\nvar _memoize = require(\"./utils/memoize\");\nvar _memoizeDefault = parcelHelpers.interopDefault(_memoize);\nvar _shader = require(\"./utils/shader\");\nvar _props = require(\"./lifecycle/props\");\n\n},{\"./lib/init\":\"g83Ee\",\"./shaderlib\":\"lFELS\",\"./lib/constants\":\"inuJE\",\"./effects/lighting/lighting-effect\":\"faL8t\",\"./effects/lighting/ambient-light\":\"bb0b8\",\"./effects/lighting/directional-light\":\"9vhZm\",\"./effects/lighting/point-light\":\"j2Let\",\"./effects/lighting/camera-light\":\"8GAPb\",\"./effects/lighting/sun-light\":\"acIce\",\"./effects/post-process-effect\":\"kOmrb\",\"./passes/layers-pass\":\"g95vg\",\"./lib/deck\":\"6DD17\",\"./lib/layer-manager\":\"bzJiR\",\"./lib/attribute/attribute-manager\":\"kXI0a\",\"./lib/layer\":\"krhD2\",\"./lib/composite-layer\":\"Eygl7\",\"./lib/deck-renderer\":\"1XD0R\",\"./viewports/viewport\":\"iilpM\",\"./viewports/web-mercator-viewport\":\"liiGr\",\"./viewports/globe-viewport\":\"5rgbh\",\"./views/view\":\"1tMXO\",\"./views/map-view\":\"54Z87\",\"./views/first-person-view\":\"iAsKF\",\"./views/orbit-view\":\"5jCQ2\",\"./views/orthographic-view\":\"1GaYo\",\"./views/globe-view\":\"eSFl0\",\"./controllers/controller\":\"cZLc0\",\"./controllers/map-controller\":\"fZPqN\",\"./controllers/globe-controller\":\"04Ljo\",\"./controllers/first-person-controller\":\"aUEGL\",\"./controllers/orbit-controller\":\"kyKz6\",\"./controllers/orthographic-controller\":\"3LAMU\",\"./lib/effect\":\"6aqmc\",\"./lib/layer-extension\":\"5zSDR\",\"./controllers/transition-manager\":\"BsfRu\",\"./transitions/transition-interpolator\":\"fvWgT\",\"./transitions/linear-interpolator\":\"k5Lgz\",\"./transitions/viewport-fly-to-interpolator\":\"g192R\",\"./utils/log\":\"1biSe\",\"./utils/iterable-utils\":\"kj5eS\",\"./utils/math-utils\":\"jzrEb\",\"./utils/tesselator\":\"aLgkL\",\"./utils/flatten\":\"i8Kfk\",\"./utils/count\":\"6uGyN\",\"./utils/memoize\":\"d1jje\",\"./utils/shader\":\"figJs\",\"./lifecycle/props\":\"7ZIma\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g83Ee\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _core = require(\"@loaders.gl/core\");\nvar _images = require(\"@loaders.gl/images\");\nvar _env = require(\"probe.gl/env\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _debug = require(\"../debug\");\nvar _jsonLoader = require(\"../utils/json-loader\");\nvar _jsonLoaderDefault = parcelHelpers.interopDefault(_jsonLoader);\nvar version = \"8.3.7\";\nvar existingVersion = (0, _env.global).deck && (0, _env.global).deck.VERSION;\nif (existingVersion && existingVersion !== version) throw new Error(\"deck.gl - multiple versions detected: \".concat(existingVersion, \" vs \").concat(version));\nif (!existingVersion) {\n    (0, _env.global).deck = Object.assign((0, _env.global).deck || {}, {\n        VERSION: version,\n        version: version,\n        log: (0, _logDefault.default),\n        _registerLoggers: (0, _debug.register)\n    });\n    (0, _core.registerLoaders)([\n        (0, _jsonLoaderDefault.default),\n        [\n            (0, _images.ImageLoader),\n            {\n                imagebitmap: {\n                    premultiplyAlpha: \"none\"\n                }\n            }\n        ]\n    ]);\n}\nexports.default = (0, _env.global).deck;\n\n},{\"@loaders.gl/core\":\"kiTkb\",\"@loaders.gl/images\":\"9Br8C\",\"probe.gl/env\":\"btEBf\",\"../utils/log\":\"1biSe\",\"../debug\":\"hpEQF\",\"../utils/json-loader\":\"6onqq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kiTkb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fetchFile\", ()=>(0, _fetchFile.fetchFile));\nparcelHelpers.export(exports, \"readFileSync\", ()=>(0, _readFile.readFileSync));\nparcelHelpers.export(exports, \"writeFile\", ()=>(0, _writeFile.writeFile));\nparcelHelpers.export(exports, \"writeFileSync\", ()=>(0, _writeFile.writeFileSync));\nparcelHelpers.export(exports, \"setLoaderOptions\", ()=>(0, _setLoaderOptions.setLoaderOptions));\nparcelHelpers.export(exports, \"registerLoaders\", ()=>(0, _registerLoaders.registerLoaders));\nparcelHelpers.export(exports, \"parse\", ()=>(0, _parse.parse));\nparcelHelpers.export(exports, \"parseSync\", ()=>(0, _parseSync.parseSync));\nparcelHelpers.export(exports, \"parseInBatches\", ()=>(0, _parseInBatches.parseInBatches));\nparcelHelpers.export(exports, \"selectLoader\", ()=>(0, _selectLoader.selectLoader));\nparcelHelpers.export(exports, \"selectLoaderSync\", ()=>(0, _selectLoader.selectLoaderSync));\nparcelHelpers.export(exports, \"load\", ()=>(0, _load.load));\nparcelHelpers.export(exports, \"loadInBatches\", ()=>(0, _loadInBatches.loadInBatches));\nparcelHelpers.export(exports, \"encode\", ()=>(0, _encode.encode));\nparcelHelpers.export(exports, \"encodeSync\", ()=>(0, _encode.encodeSync));\nparcelHelpers.export(exports, \"encodeInBatches\", ()=>(0, _encode.encodeInBatches));\nparcelHelpers.export(exports, \"encodeText\", ()=>(0, _encode.encodeText));\nparcelHelpers.export(exports, \"encodeURLtoURL\", ()=>(0, _encode.encodeURLtoURL));\nparcelHelpers.export(exports, \"save\", ()=>(0, _save.save));\nparcelHelpers.export(exports, \"saveSync\", ()=>(0, _save.saveSync));\nparcelHelpers.export(exports, \"makeIterator\", ()=>(0, _makeIterator.makeIterator));\nparcelHelpers.export(exports, \"NullLoader\", ()=>(0, _nullLoader.NullLoader));\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>(0, _loaderUtils.setPathPrefix));\nparcelHelpers.export(exports, \"getPathPrefix\", ()=>(0, _loaderUtils.getPathPrefix));\nparcelHelpers.export(exports, \"resolvePath\", ()=>(0, _loaderUtils.resolvePath));\nparcelHelpers.export(exports, \"RequestScheduler\", ()=>(0, _loaderUtils.RequestScheduler));\nparcelHelpers.export(exports, \"_fetchProgress\", ()=>(0, _fetchProgressDefault.default));\nparcelHelpers.export(exports, \"_BrowserFileSystem\", ()=>(0, _browserFilesystemDefault.default));\nparcelHelpers.export(exports, \"_unregisterLoaders\", ()=>(0, _registerLoaders._unregisterLoaders));\nparcelHelpers.export(exports, \"isBrowser\", ()=>(0, _loaderUtils.isBrowser));\nparcelHelpers.export(exports, \"isWorker\", ()=>(0, _loaderUtils.isWorker));\nparcelHelpers.export(exports, \"self\", ()=>(0, _loaderUtils.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _loaderUtils.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _loaderUtils.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _loaderUtils.document));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _loaderUtils.assert));\nparcelHelpers.export(exports, \"forEach\", ()=>(0, _loaderUtils.forEach));\nparcelHelpers.export(exports, \"concatenateChunksAsync\", ()=>(0, _loaderUtils.concatenateChunksAsync));\nparcelHelpers.export(exports, \"makeTextDecoderIterator\", ()=>(0, _loaderUtils.makeTextDecoderIterator));\nparcelHelpers.export(exports, \"makeTextEncoderIterator\", ()=>(0, _loaderUtils.makeTextEncoderIterator));\nparcelHelpers.export(exports, \"makeLineIterator\", ()=>(0, _loaderUtils.makeLineIterator));\nparcelHelpers.export(exports, \"makeNumberedLineIterator\", ()=>(0, _loaderUtils.makeNumberedLineIterator));\nparcelHelpers.export(exports, \"isPromise\", ()=>(0, _isType.isPromise));\nparcelHelpers.export(exports, \"isIterable\", ()=>(0, _isType.isIterable));\nparcelHelpers.export(exports, \"isAsyncIterable\", ()=>(0, _isType.isAsyncIterable));\nparcelHelpers.export(exports, \"isIterator\", ()=>(0, _isType.isIterator));\nparcelHelpers.export(exports, \"isResponse\", ()=>(0, _isType.isResponse));\nparcelHelpers.export(exports, \"isReadableStream\", ()=>(0, _isType.isReadableStream));\nparcelHelpers.export(exports, \"isWritableStream\", ()=>(0, _isType.isWritableStream));\nvar _init = require(\"./lib/init\");\nvar _fetchFile = require(\"./lib/fetch/fetch-file\");\nvar _readFile = require(\"./lib/fetch/read-file\");\nvar _writeFile = require(\"./lib/fetch/write-file\");\nvar _setLoaderOptions = require(\"./lib/api/set-loader-options\");\nvar _registerLoaders = require(\"./lib/api/register-loaders\");\nvar _parse = require(\"./lib/api/parse\");\nvar _parseSync = require(\"./lib/api/parse-sync\");\nvar _parseInBatches = require(\"./lib/api/parse-in-batches\");\nvar _selectLoader = require(\"./lib/api/select-loader\");\nvar _load = require(\"./lib/api/load\");\nvar _loadInBatches = require(\"./lib/api/load-in-batches\");\nvar _encode = require(\"./lib/api/encode\");\nvar _save = require(\"./lib/api/save\");\nvar _makeIterator = require(\"./iterator-utils/make-iterator/make-iterator\");\nvar _nullLoader = require(\"./null-loader\");\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _fetchProgress = require(\"./lib/progress/fetch-progress\");\nvar _fetchProgressDefault = parcelHelpers.interopDefault(_fetchProgress);\nvar _browserFilesystem = require(\"./lib/filesystems/browser-filesystem\");\nvar _browserFilesystemDefault = parcelHelpers.interopDefault(_browserFilesystem);\nvar _isType = require(\"./javascript-utils/is-type\");\n\n},{\"./lib/init\":\"CxEW9\",\"./lib/fetch/fetch-file\":\"6ULVt\",\"./lib/fetch/read-file\":false,\"./lib/fetch/write-file\":false,\"./lib/api/set-loader-options\":false,\"./lib/api/register-loaders\":\"gGNiE\",\"./lib/api/parse\":\"7C096\",\"./lib/api/parse-sync\":false,\"./lib/api/parse-in-batches\":false,\"./lib/api/select-loader\":\"g4jKF\",\"./lib/api/load\":\"g4COe\",\"./lib/api/load-in-batches\":false,\"./lib/api/encode\":false,\"./lib/api/save\":false,\"./iterator-utils/make-iterator/make-iterator\":\"3v8qm\",\"./null-loader\":false,\"@loaders.gl/loader-utils\":\"7zeF1\",\"./lib/progress/fetch-progress\":false,\"./lib/filesystems/browser-filesystem\":false,\"./javascript-utils/is-type\":\"ceaCP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"CxEW9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar version = \"2.3.13\";\n(0, _loaderUtils.global).loaders = Object.assign((0, _loaderUtils.global).loaders || {}, {\n    VERSION: version\n});\nexports.default = (0, _loaderUtils.global).loaders;\n\n},{\"@loaders.gl/loader-utils\":\"7zeF1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7zeF1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nparcelHelpers.export(exports, \"isBrowser\", ()=>(0, _globals.isBrowser));\nparcelHelpers.export(exports, \"isWorker\", ()=>(0, _globals.isWorker));\nparcelHelpers.export(exports, \"nodeVersion\", ()=>(0, _globals.nodeVersion));\nparcelHelpers.export(exports, \"self\", ()=>(0, _globals.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _globals.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _globals.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _globals.document));\nparcelHelpers.export(exports, \"createWorker\", ()=>(0, _createWorkerDefault.default));\nparcelHelpers.export(exports, \"validateLoaderVersion\", ()=>(0, _validateLoaderVersion.validateLoaderVersion));\nparcelHelpers.export(exports, \"makeTransformIterator\", ()=>(0, _makeTransformIterator.makeTransformIterator));\nparcelHelpers.export(exports, \"getTransferList\", ()=>(0, _getTransferList.getTransferList));\nparcelHelpers.export(exports, \"_WorkerFarm\", ()=>(0, _workerFarmDefault.default));\nparcelHelpers.export(exports, \"_WorkerPool\", ()=>(0, _workerPoolDefault.default));\nparcelHelpers.export(exports, \"_WorkerThread\", ()=>(0, _workerThreadDefault.default));\nparcelHelpers.export(exports, \"getLibraryUrl\", ()=>(0, _libraryUtils.getLibraryUrl));\nparcelHelpers.export(exports, \"loadLibrary\", ()=>(0, _libraryUtils.loadLibrary));\nparcelHelpers.export(exports, \"parseJSON\", ()=>(0, _parseJson.parseJSON));\nparcelHelpers.export(exports, \"isBuffer\", ()=>(0, _bufferUtils.isBuffer));\nparcelHelpers.export(exports, \"toBuffer\", ()=>(0, _bufferUtils.toBuffer));\nparcelHelpers.export(exports, \"bufferToArrayBuffer\", ()=>(0, _bufferUtils.bufferToArrayBuffer));\nparcelHelpers.export(exports, \"toArrayBuffer\", ()=>(0, _arrayBufferUtils.toArrayBuffer));\nparcelHelpers.export(exports, \"sliceArrayBuffer\", ()=>(0, _arrayBufferUtils.sliceArrayBuffer));\nparcelHelpers.export(exports, \"concatenateArrayBuffers\", ()=>(0, _arrayBufferUtils.concatenateArrayBuffers));\nparcelHelpers.export(exports, \"compareArrayBuffers\", ()=>(0, _arrayBufferUtils.compareArrayBuffers));\nparcelHelpers.export(exports, \"padTo4Bytes\", ()=>(0, _memoryCopyUtils.padTo4Bytes));\nparcelHelpers.export(exports, \"copyToArray\", ()=>(0, _memoryCopyUtils.copyToArray));\nparcelHelpers.export(exports, \"copyArrayBuffer\", ()=>(0, _memoryCopyUtils.copyArrayBuffer));\nparcelHelpers.export(exports, \"copyPaddedArrayBufferToDataView\", ()=>(0, _binaryCopyUtils.copyPaddedArrayBufferToDataView));\nparcelHelpers.export(exports, \"copyPaddedStringToDataView\", ()=>(0, _binaryCopyUtils.copyPaddedStringToDataView));\nparcelHelpers.export(exports, \"padStringToByteAlignment\", ()=>(0, _encodeUtils.padStringToByteAlignment));\nparcelHelpers.export(exports, \"copyStringToDataView\", ()=>(0, _encodeUtils.copyStringToDataView));\nparcelHelpers.export(exports, \"copyBinaryToDataView\", ()=>(0, _encodeUtils.copyBinaryToDataView));\nparcelHelpers.export(exports, \"getFirstCharacters\", ()=>(0, _getFirstCharacters.getFirstCharacters));\nparcelHelpers.export(exports, \"getMagicString\", ()=>(0, _getFirstCharacters.getMagicString));\nparcelHelpers.export(exports, \"path\", ()=>_path);\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>(0, _fileAliases.setPathPrefix));\nparcelHelpers.export(exports, \"getPathPrefix\", ()=>(0, _fileAliases.getPathPrefix));\nparcelHelpers.export(exports, \"resolvePath\", ()=>(0, _fileAliases.resolvePath));\nparcelHelpers.export(exports, \"_addAliases\", ()=>(0, _fileAliasesJs.addAliases));\nparcelHelpers.export(exports, \"makeTextEncoderIterator\", ()=>(0, _textIterators.makeTextEncoderIterator));\nparcelHelpers.export(exports, \"makeTextDecoderIterator\", ()=>(0, _textIterators.makeTextDecoderIterator));\nparcelHelpers.export(exports, \"makeLineIterator\", ()=>(0, _textIterators.makeLineIterator));\nparcelHelpers.export(exports, \"makeNumberedLineIterator\", ()=>(0, _textIterators.makeNumberedLineIterator));\nparcelHelpers.export(exports, \"forEach\", ()=>(0, _asyncIteration.forEach));\nparcelHelpers.export(exports, \"concatenateChunksAsync\", ()=>(0, _asyncIteration.concatenateChunksAsync));\nparcelHelpers.export(exports, \"RequestScheduler\", ()=>(0, _requestSchedulerDefault.default));\nparcelHelpers.export(exports, \"ChildProcessProxy\", ()=>(0, _childProcessProxyDefault.default));\nparcelHelpers.export(exports, \"_getMeshSize\", ()=>(0, _meshUtils.getMeshSize));\nparcelHelpers.export(exports, \"getMeshBoundingBox\", ()=>(0, _meshUtils.getMeshBoundingBox));\nparcelHelpers.export(exports, \"getZeroOffsetArrayBuffer\", ()=>(0, _memoryCopyUtils.getZeroOffsetArrayBuffer));\nvar _path = require(\"./lib/path-utils/path\");\nvar _assert = require(\"./lib/env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _globals = require(\"./lib/env-utils/globals\");\nvar _createWorker = require(\"./lib/worker-loader-utils/create-worker\");\nvar _createWorkerDefault = parcelHelpers.interopDefault(_createWorker);\nvar _validateLoaderVersion = require(\"./lib/worker-loader-utils/validate-loader-version\");\nvar _makeTransformIterator = require(\"./lib/iterator-utils/make-transform-iterator\");\nvar _getTransferList = require(\"./lib/worker-utils/get-transfer-list\");\nvar _workerFarm = require(\"./lib/worker-utils/worker-farm\");\nvar _workerFarmDefault = parcelHelpers.interopDefault(_workerFarm);\nvar _workerPool = require(\"./lib/worker-utils/worker-pool\");\nvar _workerPoolDefault = parcelHelpers.interopDefault(_workerPool);\nvar _workerThread = require(\"./lib/worker-utils/worker-thread\");\nvar _workerThreadDefault = parcelHelpers.interopDefault(_workerThread);\nvar _libraryUtils = require(\"./lib/library-utils/library-utils\");\nvar _parseJson = require(\"./lib/parser-utils/parse-json\");\nvar _bufferUtils = require(\"./lib/binary-utils/buffer-utils\");\nvar _arrayBufferUtils = require(\"./lib/binary-utils/array-buffer-utils\");\nvar _memoryCopyUtils = require(\"./lib/binary-utils/memory-copy-utils\");\nvar _binaryCopyUtils = require(\"./lib/binary-utils/binary-copy-utils\");\nvar _encodeUtils = require(\"./lib/binary-utils/encode-utils\");\nvar _getFirstCharacters = require(\"./lib/binary-utils/get-first-characters\");\nvar _fileAliases = require(\"./lib/path-utils/file-aliases\");\nvar _fileAliasesJs = require(\"./lib/path-utils/file-aliases.js\");\nvar _textIterators = require(\"./lib/iterator-utils/text-iterators\");\nvar _asyncIteration = require(\"./lib/iterator-utils/async-iteration\");\nvar _requestScheduler = require(\"./lib/request-utils/request-scheduler\");\nvar _requestSchedulerDefault = parcelHelpers.interopDefault(_requestScheduler);\nvar _childProcessProxy = require(\"./lib/process-utils/child-process-proxy\");\nvar _childProcessProxyDefault = parcelHelpers.interopDefault(_childProcessProxy);\nvar _meshUtils = require(\"./categories/mesh/mesh-utils\");\n\n},{\"./lib/path-utils/path\":\"cilNs\",\"./lib/env-utils/assert\":\"9Ogn4\",\"./lib/env-utils/globals\":\"1AAW0\",\"./lib/worker-loader-utils/create-worker\":false,\"./lib/worker-loader-utils/validate-loader-version\":\"4Niop\",\"./lib/iterator-utils/make-transform-iterator\":false,\"./lib/worker-utils/get-transfer-list\":\"5HZnY\",\"./lib/worker-utils/worker-farm\":\"fsNV0\",\"./lib/worker-utils/worker-pool\":\"74rnr\",\"./lib/worker-utils/worker-thread\":\"ibJjq\",\"./lib/library-utils/library-utils\":false,\"./lib/parser-utils/parse-json\":false,\"./lib/binary-utils/buffer-utils\":false,\"./lib/binary-utils/array-buffer-utils\":\"1gb9X\",\"./lib/binary-utils/memory-copy-utils\":false,\"./lib/binary-utils/binary-copy-utils\":false,\"./lib/binary-utils/encode-utils\":false,\"./lib/binary-utils/get-first-characters\":false,\"./lib/path-utils/file-aliases\":\"2RSJD\",\"./lib/path-utils/file-aliases.js\":\"2RSJD\",\"./lib/iterator-utils/text-iterators\":\"6tYX7\",\"./lib/iterator-utils/async-iteration\":\"fJwci\",\"./lib/request-utils/request-scheduler\":\"7ZQYk\",\"./lib/process-utils/child-process-proxy\":false,\"./categories/mesh/mesh-utils\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cilNs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dirname\", ()=>dirname);\nfunction dirname(url) {\n    var slashIndex = url && url.lastIndexOf(\"/\");\n    return slashIndex >= 0 ? url.substr(0, slashIndex) : \"\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Ogn4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"loader assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1AAW0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"self\", ()=>self_);\nparcelHelpers.export(exports, \"window\", ()=>window_);\nparcelHelpers.export(exports, \"global\", ()=>global_);\nparcelHelpers.export(exports, \"document\", ()=>document_);\nparcelHelpers.export(exports, \"isBrowser\", ()=>isBrowser);\nparcelHelpers.export(exports, \"isWorker\", ()=>isWorker);\nparcelHelpers.export(exports, \"nodeVersion\", ()=>nodeVersion);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar process = require(\"process\");\nvar global = arguments[3];\nvar globals = {\n    self: typeof self !== \"undefined\" && self,\n    window: typeof window !== \"undefined\" && window,\n    global: typeof global !== \"undefined\" && global,\n    document: typeof document !== \"undefined\" && document\n};\nvar self_ = globals.self || globals.window || globals.global;\nvar window_ = globals.window || globals.self || globals.global;\nvar global_ = globals.global || globals.self || globals.window;\nvar document_ = globals.document || {};\nvar isBrowser = (typeof process === \"undefined\" ? \"undefined\" : (0, _typeofDefault.default)(process)) !== \"object\" || String(process) !== \"[object process]\" || true;\nvar isWorker = typeof importScripts === \"function\";\nvar matches = typeof process !== \"undefined\" && process.version && process.version.match(/v([0-9]*)/);\nvar nodeVersion = matches && parseFloat(matches[1]) || 0;\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"process\":\"1RiLM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5go3u\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _typeof(obj1) {\n    \"@babel/helpers - typeof\";\n    return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, _typeof(obj1);\n}\nexports.default = _typeof;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hecPM\":[function(require,module,exports) {\n// shim for using process in browser\nvar process = module.exports = {};\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\nvar cachedSetTimeout;\nvar cachedClearTimeout;\nfunction defaultSetTimout() {\n    throw new Error(\"setTimeout has not been defined\");\n}\nfunction defaultClearTimeout() {\n    throw new Error(\"clearTimeout has not been defined\");\n}\n(function() {\n    try {\n        if (typeof setTimeout === \"function\") cachedSetTimeout = setTimeout;\n        else cachedSetTimeout = defaultSetTimout;\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === \"function\") cachedClearTimeout = clearTimeout;\n        else cachedClearTimeout = defaultClearTimeout;\n    } catch (e1) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n})();\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) //normal enviroments in sane situations\n    return setTimeout(fun, 0);\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch (e) {\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch (e) {\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) //normal enviroments in sane situations\n    return clearTimeout(marker);\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e) {\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e) {\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) return;\n    draining = false;\n    if (currentQueue.length) queue = currentQueue.concat(queue);\n    else queueIndex = -1;\n    if (queue.length) drainQueue();\n}\nfunction drainQueue() {\n    if (draining) return;\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n    var len = queue.length;\n    while(len){\n        currentQueue = queue;\n        queue = [];\n        while(++queueIndex < len)if (currentQueue) currentQueue[queueIndex].run();\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\nprocess.nextTick = function(fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) for(var i = 1; i < arguments.length; i++)args[i - 1] = arguments[i];\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) runTimeout(drainQueue);\n};\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function() {\n    this.fun.apply(null, this.array);\n};\nprocess.title = \"browser\";\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = \"\"; // empty string to avoid regexp issues\nprocess.versions = {};\nfunction noop() {}\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\nprocess.listeners = function(name) {\n    return [];\n};\nprocess.binding = function(name) {\n    throw new Error(\"process.binding is not supported\");\n};\nprocess.cwd = function() {\n    return \"/\";\n};\nprocess.chdir = function(dir) {\n    throw new Error(\"process.chdir is not supported\");\n};\nprocess.umask = function() {\n    return 0;\n};\n\n},{}],\"1RiLM\":[function(require,module,exports) {\n// shim for using process in browser\nvar process = module.exports = {};\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\nvar cachedSetTimeout;\nvar cachedClearTimeout;\nfunction defaultSetTimout() {\n    throw new Error(\"setTimeout has not been defined\");\n}\nfunction defaultClearTimeout() {\n    throw new Error(\"clearTimeout has not been defined\");\n}\n(function() {\n    try {\n        if (typeof setTimeout === \"function\") cachedSetTimeout = setTimeout;\n        else cachedSetTimeout = defaultSetTimout;\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === \"function\") cachedClearTimeout = clearTimeout;\n        else cachedClearTimeout = defaultClearTimeout;\n    } catch (e1) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n})();\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) //normal enviroments in sane situations\n    return setTimeout(fun, 0);\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch (e) {\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch (e) {\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) //normal enviroments in sane situations\n    return clearTimeout(marker);\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e) {\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e) {\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) return;\n    draining = false;\n    if (currentQueue.length) queue = currentQueue.concat(queue);\n    else queueIndex = -1;\n    if (queue.length) drainQueue();\n}\nfunction drainQueue() {\n    if (draining) return;\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n    var len = queue.length;\n    while(len){\n        currentQueue = queue;\n        queue = [];\n        while(++queueIndex < len)if (currentQueue) currentQueue[queueIndex].run();\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\nprocess.nextTick = function(fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) for(var i = 1; i < arguments.length; i++)args[i - 1] = arguments[i];\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) runTimeout(drainQueue);\n};\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function() {\n    this.fun.apply(null, this.array);\n};\nprocess.title = \"browser\";\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = \"\"; // empty string to avoid regexp issues\nprocess.versions = {};\nfunction noop() {}\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\nprocess.listeners = function(name) {\n    return [];\n};\nprocess.binding = function(name) {\n    throw new Error(\"process.binding is not supported\");\n};\nprocess.cwd = function() {\n    return \"/\";\n};\nprocess.chdir = function(dir) {\n    throw new Error(\"process.chdir is not supported\");\n};\nprocess.umask = function() {\n    return 0;\n};\n\n},{}],\"4Niop\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"validateLoaderVersion\", ()=>validateLoaderVersion);\nvar _assert = require(\"../env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar VERSION = \"2.3.13\";\nfunction validateLoaderVersion(loader) {\n    var coreVersion = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : VERSION;\n    (0, _assertDefault.default)(loader, \"no loader provided\");\n    var loaderVersion = loader.version;\n    if (!coreVersion || !loaderVersion) return;\n    coreVersion = parseVersion(coreVersion);\n    loaderVersion = parseVersion(loaderVersion);\n}\nfunction parseVersion(version) {\n    var parts = version.split(\".\").map(Number);\n    return {\n        major: parts[0],\n        minor: parts[1]\n    };\n}\n\n},{\"../env-utils/assert\":\"9Ogn4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5HZnY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getTransferList\", ()=>getTransferList);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nfunction getTransferList(object) {\n    var recursive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var transfers = arguments.length > 2 ? arguments[2] : undefined;\n    var transfersSet = transfers || new Set();\n    if (!object) ;\n    else if (isTransferable(object)) transfersSet.add(object);\n    else if (isTransferable(object.buffer)) transfersSet.add(object.buffer);\n    else if (ArrayBuffer.isView(object)) ;\n    else if (recursive && (0, _typeofDefault.default)(object) === \"object\") for(var key in object)getTransferList(object[key], recursive, transfersSet);\n    return transfers === undefined ? Array.from(transfersSet) : [];\n}\nfunction isTransferable(object) {\n    if (!object) return false;\n    if (object instanceof ArrayBuffer) return true;\n    if (typeof MessagePort !== \"undefined\" && object instanceof MessagePort) return true;\n    if (typeof ImageBitmap !== \"undefined\" && object instanceof ImageBitmap) return true;\n    if (typeof OffscreenCanvas !== \"undefined\" && object instanceof OffscreenCanvas) return true;\n    return false;\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fsNV0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>WorkerFarm);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _workerPool = require(\"./worker-pool\");\nvar _workerPoolDefault = parcelHelpers.interopDefault(_workerPool);\nvar DEFAULT_MAX_CONCURRENCY = 5;\nvar WorkerFarm = function() {\n    (0, _createClassDefault.default)(WorkerFarm1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported() {\n                return typeof Worker !== \"undefined\";\n            }\n        }\n    ]);\n    function WorkerFarm1(_ref) {\n        var _ref$maxConcurrency = _ref.maxConcurrency, maxConcurrency = _ref$maxConcurrency === void 0 ? DEFAULT_MAX_CONCURRENCY : _ref$maxConcurrency, _ref$onMessage = _ref.onMessage, onMessage = _ref$onMessage === void 0 ? null : _ref$onMessage, _ref$onDebug = _ref.onDebug, onDebug = _ref$onDebug === void 0 ? function() {} : _ref$onDebug, _ref$reuseWorkers = _ref.reuseWorkers, reuseWorkers = _ref$reuseWorkers === void 0 ? true : _ref$reuseWorkers;\n        (0, _classCallCheckDefault.default)(this, WorkerFarm1);\n        this.maxConcurrency = maxConcurrency;\n        this.onMessage = onMessage;\n        this.onDebug = onDebug;\n        this.workerPools = new Map();\n        this.reuseWorkers = reuseWorkers;\n    }\n    (0, _createClassDefault.default)(WorkerFarm1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"maxConcurrency\" in props) this.maxConcurrency = props.maxConcurrency;\n                if (\"onDebug\" in props) this.onDebug = props.onDebug;\n                if (\"reuseWorkers\" in props) this.reuseWorkers = props.reuseWorkers;\n            }\n        },\n        {\n            key: \"destroy\",\n            value: function destroy() {\n                this.workerPools.forEach(function(workerPool) {\n                    return workerPool.destroy();\n                });\n            }\n        },\n        {\n            key: \"process\",\n            value: function() {\n                var _process = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(workerSource, workerName, data) {\n                    var workerPool;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                workerPool = this._getWorkerPool(workerSource, workerName);\n                                return _context.abrupt(\"return\", workerPool.process(data));\n                            case 2:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this);\n                }));\n                function process(_x, _x2, _x3) {\n                    return _process.apply(this, arguments);\n                }\n                return process;\n            }()\n        },\n        {\n            key: \"_getWorkerPool\",\n            value: function _getWorkerPool(workerSource, workerName) {\n                var workerPool = this.workerPools.get(workerName);\n                if (!workerPool) {\n                    workerPool = new (0, _workerPoolDefault.default)({\n                        source: workerSource,\n                        name: workerName,\n                        onMessage: onWorkerMessage.bind(null, this.onMessage),\n                        maxConcurrency: this.maxConcurrency,\n                        onDebug: this.onDebug,\n                        reuseWorkers: this.reuseWorkers\n                    });\n                    this.workerPools.set(workerName, workerPool);\n                }\n                return workerPool;\n            }\n        }\n    ]);\n    return WorkerFarm1;\n}();\nfunction onWorkerMessage(onMessage, _ref2) {\n    var worker = _ref2.worker, data = _ref2.data, resolve = _ref2.resolve, reject = _ref2.reject;\n    if (onMessage) {\n        onMessage({\n            worker: worker,\n            data: data,\n            resolve: resolve,\n            reject: reject\n        });\n        return;\n    }\n    switch(data.type){\n        case \"done\":\n            resolve(data.result);\n            break;\n        case \"error\":\n            reject(data.message);\n            break;\n        default:\n    }\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./worker-pool\":\"74rnr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hCi6z\":[function(require,module,exports) {\n// TODO(Babel 8): Remove this file.\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n    regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n    if (typeof globalThis === \"object\") globalThis.regeneratorRuntime = runtime;\n    else Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n\n},{\"../helpers/regeneratorRuntime\":\"18se5\"}],\"18se5\":[function(require,module,exports) {\nvar _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n    \"use strict\";\n    /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n        return exports;\n    }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n    var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n    function define(obj, key, value) {\n        return Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }), obj[key];\n    }\n    try {\n        define({}, \"\");\n    } catch (err1) {\n        define = function define(obj, key, value) {\n            return obj[key] = value;\n        };\n    }\n    function wrap(innerFn1, outerFn, self1, tryLocsList) {\n        var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context1 = new Context(tryLocsList || []);\n        return generator._invoke = function(innerFn, self, context) {\n            var state = \"suspendedStart\";\n            return function(method, arg) {\n                if (\"executing\" === state) throw new Error(\"Generator is already running\");\n                if (\"completed\" === state) {\n                    if (\"throw\" === method) throw arg;\n                    return doneResult();\n                }\n                for(context.method = method, context.arg = arg;;){\n                    var delegate = context.delegate;\n                    if (delegate) {\n                        var delegateResult = maybeInvokeDelegate(delegate, context);\n                        if (delegateResult) {\n                            if (delegateResult === ContinueSentinel) continue;\n                            return delegateResult;\n                        }\n                    }\n                    if (\"next\" === context.method) context.sent = context._sent = context.arg;\n                    else if (\"throw\" === context.method) {\n                        if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n                        context.dispatchException(context.arg);\n                    } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n                    state = \"executing\";\n                    var record = tryCatch(innerFn, self, context);\n                    if (\"normal\" === record.type) {\n                        if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n                        return {\n                            value: record.arg,\n                            done: context.done\n                        };\n                    }\n                    \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n                }\n            };\n        }(innerFn1, self1, context1), generator;\n    }\n    function tryCatch(fn, obj, arg) {\n        try {\n            return {\n                type: \"normal\",\n                arg: fn.call(obj, arg)\n            };\n        } catch (err) {\n            return {\n                type: \"throw\",\n                arg: err\n            };\n        }\n    }\n    exports.wrap = wrap;\n    var ContinueSentinel = {};\n    function Generator() {}\n    function GeneratorFunction() {}\n    function GeneratorFunctionPrototype() {}\n    var IteratorPrototype = {};\n    define(IteratorPrototype, iteratorSymbol, function() {\n        return this;\n    });\n    var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n    NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n    var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n    function defineIteratorMethods(prototype) {\n        [\n            \"next\",\n            \"throw\",\n            \"return\"\n        ].forEach(function(method) {\n            define(prototype, method, function(arg) {\n                return this._invoke(method, arg);\n            });\n        });\n    }\n    function AsyncIterator(generator, PromiseImpl) {\n        function invoke(method, arg, resolve, reject) {\n            var record = tryCatch(generator[method], generator, arg);\n            if (\"throw\" !== record.type) {\n                var result = record.arg, value1 = result.value;\n                return value1 && \"object\" == _typeof(value1) && hasOwn.call(value1, \"__await\") ? PromiseImpl.resolve(value1.__await).then(function(value) {\n                    invoke(\"next\", value, resolve, reject);\n                }, function(err) {\n                    invoke(\"throw\", err, resolve, reject);\n                }) : PromiseImpl.resolve(value1).then(function(unwrapped) {\n                    result.value = unwrapped, resolve(result);\n                }, function(error) {\n                    return invoke(\"throw\", error, resolve, reject);\n                });\n            }\n            reject(record.arg);\n        }\n        var previousPromise;\n        this._invoke = function(method, arg) {\n            function callInvokeWithMethodAndArg() {\n                return new PromiseImpl(function(resolve, reject) {\n                    invoke(method, arg, resolve, reject);\n                });\n            }\n            return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n        };\n    }\n    function maybeInvokeDelegate(delegate, context) {\n        var method = delegate.iterator[context.method];\n        if (undefined === method) {\n            if (context.delegate = null, \"throw\" === context.method) {\n                if (delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method)) return ContinueSentinel;\n                context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a 'throw' method\");\n            }\n            return ContinueSentinel;\n        }\n        var record = tryCatch(method, delegate.iterator, context.arg);\n        if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n        var info = record.arg;\n        return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n    }\n    function pushTryEntry(locs) {\n        var entry = {\n            tryLoc: locs[0]\n        };\n        1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n    }\n    function resetTryEntry(entry) {\n        var record = entry.completion || {};\n        record.type = \"normal\", delete record.arg, entry.completion = record;\n    }\n    function Context(tryLocsList) {\n        this.tryEntries = [\n            {\n                tryLoc: \"root\"\n            }\n        ], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n    }\n    function values(iterable) {\n        if (iterable) {\n            var iteratorMethod = iterable[iteratorSymbol];\n            if (iteratorMethod) return iteratorMethod.call(iterable);\n            if (\"function\" == typeof iterable.next) return iterable;\n            if (!isNaN(iterable.length)) {\n                var i = -1, next1 = function next() {\n                    for(; ++i < iterable.length;){\n                        if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n                    }\n                    return next.value = undefined, next.done = !0, next;\n                };\n                return next1.next = next1;\n            }\n        }\n        return {\n            next: doneResult\n        };\n    }\n    function doneResult() {\n        return {\n            value: undefined,\n            done: !0\n        };\n    }\n    return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, \"constructor\", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function(genFun) {\n        var ctor = \"function\" == typeof genFun && genFun.constructor;\n        return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n    }, exports.mark = function(genFun) {\n        return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n    }, exports.awrap = function(arg) {\n        return {\n            __await: arg\n        };\n    }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {\n        return this;\n    }), exports.AsyncIterator = AsyncIterator, exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n        void 0 === PromiseImpl && (PromiseImpl = Promise);\n        var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n        return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {\n            return result.done ? result.value : iter.next();\n        });\n    }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function() {\n        return this;\n    }), define(Gp, \"toString\", function() {\n        return \"[object Generator]\";\n    }), exports.keys = function(object) {\n        var keys = [];\n        for(var key1 in object)keys.push(key1);\n        return keys.reverse(), function next() {\n            for(; keys.length;){\n                var key = keys.pop();\n                if (key in object) return next.value = key, next.done = !1, next;\n            }\n            return next.done = !0, next;\n        };\n    }, exports.values = values, Context.prototype = {\n        constructor: Context,\n        reset: function reset(skipTempReset) {\n            if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for(var name in this)\"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n        },\n        stop: function stop() {\n            this.done = !0;\n            var rootRecord = this.tryEntries[0].completion;\n            if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n            return this.rval;\n        },\n        dispatchException: function dispatchException(exception) {\n            if (this.done) throw exception;\n            var context = this;\n            function handle(loc, caught) {\n                return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n            }\n            for(var i = this.tryEntries.length - 1; i >= 0; --i){\n                var entry = this.tryEntries[i], record = entry.completion;\n                if (\"root\" === entry.tryLoc) return handle(\"end\");\n                if (entry.tryLoc <= this.prev) {\n                    var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\");\n                    if (hasCatch && hasFinally) {\n                        if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n                        if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n                    } else if (hasCatch) {\n                        if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n                    } else {\n                        if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n                        if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n                    }\n                }\n            }\n        },\n        abrupt: function abrupt(type, arg) {\n            for(var i = this.tryEntries.length - 1; i >= 0; --i){\n                var entry = this.tryEntries[i];\n                if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n                    var finallyEntry = entry;\n                    break;\n                }\n            }\n            finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n            var record = finallyEntry ? finallyEntry.completion : {};\n            return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n        },\n        complete: function complete(record, afterLoc) {\n            if (\"throw\" === record.type) throw record.arg;\n            return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n        },\n        finish: function finish(finallyLoc) {\n            for(var i = this.tryEntries.length - 1; i >= 0; --i){\n                var entry = this.tryEntries[i];\n                if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n            }\n        },\n        \"catch\": function _catch(tryLoc) {\n            for(var i = this.tryEntries.length - 1; i >= 0; --i){\n                var entry = this.tryEntries[i];\n                if (entry.tryLoc === tryLoc) {\n                    var record = entry.completion;\n                    if (\"throw\" === record.type) {\n                        var thrown = record.arg;\n                        resetTryEntry(entry);\n                    }\n                    return thrown;\n                }\n            }\n            throw new Error(\"illegal catch attempt\");\n        },\n        delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n            return this.delegate = {\n                iterator: values(iterable),\n                resultName: resultName,\n                nextLoc: nextLoc\n            }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n        }\n    }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n\n},{\"./typeof.js\":\"770qN\"}],\"770qN\":[function(require,module,exports) {\nfunction _typeof(obj1) {\n    \"@babel/helpers - typeof\";\n    return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(obj1);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n\n},{}],\"1U3uv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n    try {\n        var info = gen[key](arg);\n        var value = info.value;\n    } catch (error) {\n        reject(error);\n        return;\n    }\n    if (info.done) resolve(value);\n    else Promise.resolve(value).then(_next, _throw);\n}\nfunction _asyncToGenerator(fn) {\n    return function() {\n        var self = this, args = arguments;\n        return new Promise(function(resolve, reject) {\n            var gen = fn.apply(self, args);\n            function _next(value) {\n                asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n            }\n            function _throw(err) {\n                asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n            }\n            _next(undefined);\n        });\n    };\n}\nexports.default = _asyncToGenerator;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3owyr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexports.default = _classCallCheck;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1VLPU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _defineProperties(target, props) {\n    for(var i = 0; i < props.length; i++){\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n    }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    Object.defineProperty(Constructor, \"prototype\", {\n        writable: false\n    });\n    return Constructor;\n}\nexports.default = _createClass;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"74rnr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>WorkerPool);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _workerThread = require(\"./worker-thread\");\nvar _workerThreadDefault = parcelHelpers.interopDefault(_workerThread);\nvar WorkerPool = function() {\n    function WorkerPool1(_ref) {\n        var source = _ref.source, _ref$name = _ref.name, name = _ref$name === void 0 ? \"unnamed\" : _ref$name, _ref$maxConcurrency = _ref.maxConcurrency, maxConcurrency = _ref$maxConcurrency === void 0 ? 1 : _ref$maxConcurrency, onMessage = _ref.onMessage, _ref$onDebug = _ref.onDebug, onDebug = _ref$onDebug === void 0 ? function() {} : _ref$onDebug, _ref$reuseWorkers = _ref.reuseWorkers, reuseWorkers = _ref$reuseWorkers === void 0 ? true : _ref$reuseWorkers;\n        (0, _classCallCheckDefault.default)(this, WorkerPool1);\n        this.source = source;\n        this.name = name;\n        this.maxConcurrency = maxConcurrency;\n        this.onMessage = onMessage;\n        this.onDebug = onDebug;\n        this.jobQueue = [];\n        this.idleQueue = [];\n        this.count = 0;\n        this.isDestroyed = false;\n        this.reuseWorkers = reuseWorkers;\n    }\n    (0, _createClassDefault.default)(WorkerPool1, [\n        {\n            key: \"destroy\",\n            value: function destroy() {\n                this.idleQueue.forEach(function(worker) {\n                    return worker.destroy();\n                });\n                this.isDestroyed = true;\n            }\n        },\n        {\n            key: \"process\",\n            value: function process(data, jobName) {\n                var _this = this;\n                return new Promise(function(resolve, reject) {\n                    _this.jobQueue.push({\n                        data: data,\n                        jobName: jobName,\n                        resolve: resolve,\n                        reject: reject\n                    });\n                    _this._startQueuedJob();\n                });\n            }\n        },\n        {\n            key: \"_startQueuedJob\",\n            value: function() {\n                var _startQueuedJob2 = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee() {\n                    var worker, job;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                if (this.jobQueue.length) {\n                                    _context.next = 2;\n                                    break;\n                                }\n                                return _context.abrupt(\"return\");\n                            case 2:\n                                worker = this._getAvailableWorker();\n                                if (worker) {\n                                    _context.next = 5;\n                                    break;\n                                }\n                                return _context.abrupt(\"return\");\n                            case 5:\n                                job = this.jobQueue.shift();\n                                this.onDebug({\n                                    message: \"processing\",\n                                    worker: worker.name,\n                                    job: job.jobName,\n                                    backlog: this.jobQueue.length\n                                });\n                                _context.prev = 7;\n                                _context.t0 = job;\n                                _context.next = 11;\n                                return worker.process(job.data);\n                            case 11:\n                                _context.t1 = _context.sent;\n                                _context.t0.resolve.call(_context.t0, _context.t1);\n                                _context.next = 18;\n                                break;\n                            case 15:\n                                _context.prev = 15;\n                                _context.t2 = _context[\"catch\"](7);\n                                job.reject(_context.t2);\n                            case 18:\n                                _context.prev = 18;\n                                this._onWorkerDone(worker);\n                                return _context.finish(18);\n                            case 21:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this, [\n                        [\n                            7,\n                            15,\n                            18,\n                            21\n                        ]\n                    ]);\n                }));\n                function _startQueuedJob() {\n                    return _startQueuedJob2.apply(this, arguments);\n                }\n                return _startQueuedJob;\n            }()\n        },\n        {\n            key: \"_onWorkerDone\",\n            value: function _onWorkerDone(worker) {\n                if (this.isDestroyed) {\n                    worker.destroy();\n                    return;\n                }\n                if (this.reuseWorkers) this.idleQueue.push(worker);\n                else {\n                    worker.destroy();\n                    this.count--;\n                }\n                this._startQueuedJob();\n            }\n        },\n        {\n            key: \"_getAvailableWorker\",\n            value: function _getAvailableWorker() {\n                if (this.idleQueue.length > 0) return this.idleQueue.shift();\n                if (this.count < this.maxConcurrency) {\n                    this.count++;\n                    var name = \"\".concat(this.name.toLowerCase(), \" (#\").concat(this.count, \" of \").concat(this.maxConcurrency, \")\");\n                    return new (0, _workerThreadDefault.default)({\n                        source: this.source,\n                        onMessage: this.onMessage,\n                        name: name\n                    });\n                }\n                return null;\n            }\n        }\n    ]);\n    return WorkerPool1;\n}();\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./worker-thread\":\"ibJjq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ibJjq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>WorkerThread);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _getWorkerUrl = require(\"./get-worker-url\");\nvar _getTransferList = require(\"./get-transfer-list\");\nvar count = 0;\nfunction defaultOnMessage(_ref) {\n    var data = _ref.data, resolve = _ref.resolve;\n    resolve(data);\n}\nvar WorkerThread = function() {\n    function WorkerThread1(_ref2) {\n        var source = _ref2.source, _ref2$name = _ref2.name, name = _ref2$name === void 0 ? \"web-worker-\".concat(count++) : _ref2$name, onMessage = _ref2.onMessage;\n        (0, _classCallCheckDefault.default)(this, WorkerThread1);\n        var url = (0, _getWorkerUrl.getWorkerURL)(source, name);\n        this.worker = new Worker(url, {\n            name: name\n        });\n        this.name = name;\n        this.onMessage = onMessage || defaultOnMessage;\n    }\n    (0, _createClassDefault.default)(WorkerThread1, [\n        {\n            key: \"process\",\n            value: function() {\n                var _process = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(data) {\n                    var _this = this;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                return _context.abrupt(\"return\", new Promise(function(resolve, reject) {\n                                    _this.worker.onmessage = function(event) {\n                                        _this.onMessage({\n                                            worker: _this.worker,\n                                            data: event.data,\n                                            resolve: resolve,\n                                            reject: reject\n                                        });\n                                    };\n                                    _this.worker.onerror = function(error) {\n                                        var message = \"\".concat(_this.name, \": WorkerThread.process() failed\");\n                                        if (error.message) message += \" \".concat(error.message, \" \").concat(error.filename, \":\").concat(error.lineno, \":\").concat(error.colno);\n                                        var betterError = new Error(message);\n                                        console.error(error);\n                                        reject(betterError);\n                                    };\n                                    var transferList = (0, _getTransferList.getTransferList)(data);\n                                    _this.worker.postMessage(data, transferList);\n                                }));\n                            case 1:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee);\n                }));\n                function process(_x) {\n                    return _process.apply(this, arguments);\n                }\n                return process;\n            }()\n        },\n        {\n            key: \"destroy\",\n            value: function destroy() {\n                this.worker.terminate();\n                this.worker = null;\n            }\n        }\n    ]);\n    return WorkerThread1;\n}();\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./get-worker-url\":\"j8V8j\",\"./get-transfer-list\":\"5HZnY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j8V8j\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getWorkerURL\", ()=>getWorkerURL);\nvar _assert = require(\"../env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar workerURLCache = new Map();\nfunction getWorkerURL(workerSource) {\n    var workerName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"Worker\";\n    (0, _assertDefault.default)(typeof workerSource === \"string\", \"worker source\");\n    if (workerSource.startsWith(\"url(\") && workerSource.endsWith(\")\")) {\n        var workerUrl = workerSource.match(/^url\\((.*)\\)$/)[1];\n        if (workerUrl && !workerUrl.startsWith(\"http\")) return workerUrl;\n        workerSource = buildScript(workerUrl);\n    }\n    var workerURL = workerURLCache.get(workerSource);\n    if (!workerURL) {\n        var blob = new Blob([\n            workerSource\n        ], {\n            type: \"application/javascript\"\n        });\n        workerURL = URL.createObjectURL(blob);\n        workerURLCache.set(workerSource, workerURL);\n    }\n    return workerURL;\n}\nfunction buildScript(workerUrl) {\n    return \"try {\\n  importScripts('\".concat(workerUrl, \"');\\n} catch (error) {\\n  console.error(error);\\n}\");\n}\n\n},{\"../env-utils/assert\":\"9Ogn4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1gb9X\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"toArrayBuffer\", ()=>toArrayBuffer);\nparcelHelpers.export(exports, \"compareArrayBuffers\", ()=>compareArrayBuffers);\nparcelHelpers.export(exports, \"concatenateArrayBuffers\", ()=>concatenateArrayBuffers);\nparcelHelpers.export(exports, \"sliceArrayBuffer\", ()=>sliceArrayBuffer);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _assert = require(\"../env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _bufferUtilsNode = require(\"../node/buffer-utils.node\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction toArrayBuffer(data) {\n    if (_bufferUtilsNode.toArrayBuffer) data = _bufferUtilsNode.toArrayBuffer(data);\n    if (data instanceof ArrayBuffer) return data;\n    if (ArrayBuffer.isView(data)) return data.buffer;\n    if (typeof data === \"string\") {\n        var text = data;\n        var uint8Array = new TextEncoder().encode(text);\n        return uint8Array.buffer;\n    }\n    if (data && (0, _typeofDefault.default)(data) === \"object\" && data._toArrayBuffer) return data._toArrayBuffer();\n    return (0, _assertDefault.default)(false);\n}\nfunction compareArrayBuffers(arrayBuffer1, arrayBuffer2, byteLength) {\n    byteLength = byteLength || arrayBuffer1.byteLength;\n    if (arrayBuffer1.byteLength < byteLength || arrayBuffer2.byteLength < byteLength) return false;\n    var array1 = new Uint8Array(arrayBuffer1);\n    var array2 = new Uint8Array(arrayBuffer2);\n    for(var i = 0; i < array1.length; ++i){\n        if (array1[i] !== array2[i]) return false;\n    }\n    return true;\n}\nfunction concatenateArrayBuffers() {\n    for(var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++)sources[_key] = arguments[_key];\n    var sourceArrays = sources.map(function(source2) {\n        return source2 instanceof ArrayBuffer ? new Uint8Array(source2) : source2;\n    });\n    var byteLength = sourceArrays.reduce(function(length, typedArray) {\n        return length + typedArray.byteLength;\n    }, 0);\n    var result = new Uint8Array(byteLength);\n    var offset = 0;\n    var _iterator = _createForOfIteratorHelper(sourceArrays), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var sourceArray = _step.value;\n            result.set(sourceArray, offset);\n            offset += sourceArray.byteLength;\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    return result.buffer;\n}\nfunction sliceArrayBuffer(arrayBuffer, byteOffset, byteLength) {\n    var subArray = byteLength !== undefined ? new Uint8Array(arrayBuffer).subarray(byteOffset, byteOffset + byteLength) : new Uint8Array(arrayBuffer).subarray(byteOffset);\n    var arrayCopy = new Uint8Array(subArray);\n    return arrayCopy.buffer;\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"../env-utils/assert\":\"9Ogn4\",\"../node/buffer-utils.node\":\"3ye0p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3ye0p\":[function(require,module,exports) {\n\"use strict\";\n\n},{}],\"2RSJD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>setPathPrefix);\nparcelHelpers.export(exports, \"getPathPrefix\", ()=>getPathPrefix);\nparcelHelpers.export(exports, \"addAliases\", ()=>addAliases);\nparcelHelpers.export(exports, \"resolvePath\", ()=>resolvePath);\nvar pathPrefix = \"\";\nvar fileAliases = {};\nfunction setPathPrefix(prefix) {\n    pathPrefix = prefix;\n}\nfunction getPathPrefix() {\n    return pathPrefix;\n}\nfunction addAliases(aliases) {\n    Object.assign(fileAliases, aliases);\n}\nfunction resolvePath(filename) {\n    for(var alias in fileAliases)if (filename.startsWith(alias)) {\n        var replacement = fileAliases[alias];\n        filename = filename.replace(alias, replacement);\n    }\n    if (!filename.startsWith(\"http://\") && !filename.startsWith(\"https://\")) filename = \"\".concat(pathPrefix).concat(filename);\n    return filename;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6tYX7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeTextDecoderIterator\", ()=>makeTextDecoderIterator);\nparcelHelpers.export(exports, \"makeTextEncoderIterator\", ()=>makeTextEncoderIterator);\nparcelHelpers.export(exports, \"makeLineIterator\", ()=>makeLineIterator);\nparcelHelpers.export(exports, \"makeNumberedLineIterator\", ()=>makeNumberedLineIterator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _awaitAsyncGenerator = require(\"@babel/runtime/helpers/esm/awaitAsyncGenerator\");\nvar _awaitAsyncGeneratorDefault = parcelHelpers.interopDefault(_awaitAsyncGenerator);\nvar _wrapAsyncGenerator = require(\"@babel/runtime/helpers/esm/wrapAsyncGenerator\");\nvar _wrapAsyncGeneratorDefault = parcelHelpers.interopDefault(_wrapAsyncGenerator);\nvar _asyncIterator = require(\"@babel/runtime/helpers/esm/asyncIterator\");\nvar _asyncIteratorDefault = parcelHelpers.interopDefault(_asyncIterator);\nfunction makeTextDecoderIterator(_x, _x2) {\n    return _makeTextDecoderIterator.apply(this, arguments);\n}\nfunction _makeTextDecoderIterator() {\n    _makeTextDecoderIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(arrayBufferIterator, options) {\n        var textDecoder, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, arrayBuffer;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    textDecoder = new TextDecoder(options);\n                    _iteratorNormalCompletion = true;\n                    _didIteratorError = false;\n                    _context.prev = 3;\n                    _iterator = (0, _asyncIteratorDefault.default)(arrayBufferIterator);\n                case 5:\n                    _context.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator.next());\n                case 7:\n                    _step = _context.sent;\n                    _iteratorNormalCompletion = _step.done;\n                    _context.next = 11;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step.value);\n                case 11:\n                    _value = _context.sent;\n                    if (_iteratorNormalCompletion) {\n                        _context.next = 19;\n                        break;\n                    }\n                    arrayBuffer = _value;\n                    _context.next = 16;\n                    return typeof arrayBuffer === \"string\" ? arrayBuffer : textDecoder.decode(arrayBuffer, {\n                        stream: true\n                    });\n                case 16:\n                    _iteratorNormalCompletion = true;\n                    _context.next = 5;\n                    break;\n                case 19:\n                    _context.next = 25;\n                    break;\n                case 21:\n                    _context.prev = 21;\n                    _context.t0 = _context[\"catch\"](3);\n                    _didIteratorError = true;\n                    _iteratorError = _context.t0;\n                case 25:\n                    _context.prev = 25;\n                    _context.prev = 26;\n                    if (!(!_iteratorNormalCompletion && _iterator[\"return\"] != null)) {\n                        _context.next = 30;\n                        break;\n                    }\n                    _context.next = 30;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator[\"return\"]());\n                case 30:\n                    _context.prev = 30;\n                    if (!_didIteratorError) {\n                        _context.next = 33;\n                        break;\n                    }\n                    throw _iteratorError;\n                case 33:\n                    return _context.finish(30);\n                case 34:\n                    return _context.finish(25);\n                case 35:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                3,\n                21,\n                25,\n                35\n            ],\n            [\n                26,\n                ,\n                30,\n                34\n            ]\n        ]);\n    }));\n    return _makeTextDecoderIterator.apply(this, arguments);\n}\nfunction makeTextEncoderIterator(_x3, _x4) {\n    return _makeTextEncoderIterator.apply(this, arguments);\n}\nfunction _makeTextEncoderIterator() {\n    _makeTextEncoderIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(textIterator, options) {\n        var textEncoder, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, _value2, text;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    textEncoder = new TextEncoder();\n                    _iteratorNormalCompletion2 = true;\n                    _didIteratorError2 = false;\n                    _context2.prev = 3;\n                    _iterator2 = (0, _asyncIteratorDefault.default)(textIterator);\n                case 5:\n                    _context2.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator2.next());\n                case 7:\n                    _step2 = _context2.sent;\n                    _iteratorNormalCompletion2 = _step2.done;\n                    _context2.next = 11;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step2.value);\n                case 11:\n                    _value2 = _context2.sent;\n                    if (_iteratorNormalCompletion2) {\n                        _context2.next = 19;\n                        break;\n                    }\n                    text = _value2;\n                    _context2.next = 16;\n                    return typeof text === \"string\" ? textEncoder.encode(text) : text;\n                case 16:\n                    _iteratorNormalCompletion2 = true;\n                    _context2.next = 5;\n                    break;\n                case 19:\n                    _context2.next = 25;\n                    break;\n                case 21:\n                    _context2.prev = 21;\n                    _context2.t0 = _context2[\"catch\"](3);\n                    _didIteratorError2 = true;\n                    _iteratorError2 = _context2.t0;\n                case 25:\n                    _context2.prev = 25;\n                    _context2.prev = 26;\n                    if (!(!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null)) {\n                        _context2.next = 30;\n                        break;\n                    }\n                    _context2.next = 30;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator2[\"return\"]());\n                case 30:\n                    _context2.prev = 30;\n                    if (!_didIteratorError2) {\n                        _context2.next = 33;\n                        break;\n                    }\n                    throw _iteratorError2;\n                case 33:\n                    return _context2.finish(30);\n                case 34:\n                    return _context2.finish(25);\n                case 35:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2, null, [\n            [\n                3,\n                21,\n                25,\n                35\n            ],\n            [\n                26,\n                ,\n                30,\n                34\n            ]\n        ]);\n    }));\n    return _makeTextEncoderIterator.apply(this, arguments);\n}\nfunction makeLineIterator(_x5) {\n    return _makeLineIterator.apply(this, arguments);\n}\nfunction _makeLineIterator() {\n    _makeLineIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee3(textIterator) {\n        var previous, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, _value3, textChunk, eolIndex, line;\n        return (0, _regeneratorDefault.default).wrap(function _callee3$(_context3) {\n            while(true)switch(_context3.prev = _context3.next){\n                case 0:\n                    previous = \"\";\n                    _iteratorNormalCompletion3 = true;\n                    _didIteratorError3 = false;\n                    _context3.prev = 3;\n                    _iterator3 = (0, _asyncIteratorDefault.default)(textIterator);\n                case 5:\n                    _context3.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator3.next());\n                case 7:\n                    _step3 = _context3.sent;\n                    _iteratorNormalCompletion3 = _step3.done;\n                    _context3.next = 11;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step3.value);\n                case 11:\n                    _value3 = _context3.sent;\n                    if (_iteratorNormalCompletion3) {\n                        _context3.next = 26;\n                        break;\n                    }\n                    textChunk = _value3;\n                    previous += textChunk;\n                    eolIndex = void 0;\n                case 16:\n                    if (!((eolIndex = previous.indexOf(\"\\n\")) >= 0)) {\n                        _context3.next = 23;\n                        break;\n                    }\n                    line = previous.slice(0, eolIndex + 1);\n                    previous = previous.slice(eolIndex + 1);\n                    _context3.next = 21;\n                    return line;\n                case 21:\n                    _context3.next = 16;\n                    break;\n                case 23:\n                    _iteratorNormalCompletion3 = true;\n                    _context3.next = 5;\n                    break;\n                case 26:\n                    _context3.next = 32;\n                    break;\n                case 28:\n                    _context3.prev = 28;\n                    _context3.t0 = _context3[\"catch\"](3);\n                    _didIteratorError3 = true;\n                    _iteratorError3 = _context3.t0;\n                case 32:\n                    _context3.prev = 32;\n                    _context3.prev = 33;\n                    if (!(!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null)) {\n                        _context3.next = 37;\n                        break;\n                    }\n                    _context3.next = 37;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator3[\"return\"]());\n                case 37:\n                    _context3.prev = 37;\n                    if (!_didIteratorError3) {\n                        _context3.next = 40;\n                        break;\n                    }\n                    throw _iteratorError3;\n                case 40:\n                    return _context3.finish(37);\n                case 41:\n                    return _context3.finish(32);\n                case 42:\n                    if (!(previous.length > 0)) {\n                        _context3.next = 45;\n                        break;\n                    }\n                    _context3.next = 45;\n                    return previous;\n                case 45:\n                case \"end\":\n                    return _context3.stop();\n            }\n        }, _callee3, null, [\n            [\n                3,\n                28,\n                32,\n                42\n            ],\n            [\n                33,\n                ,\n                37,\n                41\n            ]\n        ]);\n    }));\n    return _makeLineIterator.apply(this, arguments);\n}\nfunction makeNumberedLineIterator(_x6) {\n    return _makeNumberedLineIterator.apply(this, arguments);\n}\nfunction _makeNumberedLineIterator() {\n    _makeNumberedLineIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee4(lineIterator) {\n        var counter, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, _value4, line;\n        return (0, _regeneratorDefault.default).wrap(function _callee4$(_context4) {\n            while(true)switch(_context4.prev = _context4.next){\n                case 0:\n                    counter = 1;\n                    _iteratorNormalCompletion4 = true;\n                    _didIteratorError4 = false;\n                    _context4.prev = 3;\n                    _iterator4 = (0, _asyncIteratorDefault.default)(lineIterator);\n                case 5:\n                    _context4.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator4.next());\n                case 7:\n                    _step4 = _context4.sent;\n                    _iteratorNormalCompletion4 = _step4.done;\n                    _context4.next = 11;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step4.value);\n                case 11:\n                    _value4 = _context4.sent;\n                    if (_iteratorNormalCompletion4) {\n                        _context4.next = 20;\n                        break;\n                    }\n                    line = _value4;\n                    _context4.next = 16;\n                    return {\n                        counter: counter,\n                        line: line\n                    };\n                case 16:\n                    counter++;\n                case 17:\n                    _iteratorNormalCompletion4 = true;\n                    _context4.next = 5;\n                    break;\n                case 20:\n                    _context4.next = 26;\n                    break;\n                case 22:\n                    _context4.prev = 22;\n                    _context4.t0 = _context4[\"catch\"](3);\n                    _didIteratorError4 = true;\n                    _iteratorError4 = _context4.t0;\n                case 26:\n                    _context4.prev = 26;\n                    _context4.prev = 27;\n                    if (!(!_iteratorNormalCompletion4 && _iterator4[\"return\"] != null)) {\n                        _context4.next = 31;\n                        break;\n                    }\n                    _context4.next = 31;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator4[\"return\"]());\n                case 31:\n                    _context4.prev = 31;\n                    if (!_didIteratorError4) {\n                        _context4.next = 34;\n                        break;\n                    }\n                    throw _iteratorError4;\n                case 34:\n                    return _context4.finish(31);\n                case 35:\n                    return _context4.finish(26);\n                case 36:\n                case \"end\":\n                    return _context4.stop();\n            }\n        }, _callee4, null, [\n            [\n                3,\n                22,\n                26,\n                36\n            ],\n            [\n                27,\n                ,\n                31,\n                35\n            ]\n        ]);\n    }));\n    return _makeNumberedLineIterator.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/awaitAsyncGenerator\":\"9cx1k\",\"@babel/runtime/helpers/esm/wrapAsyncGenerator\":\"5b0X7\",\"@babel/runtime/helpers/esm/asyncIterator\":\"g5YXH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9cx1k\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _awaitValueJs = require(\"./AwaitValue.js\");\nvar _awaitValueJsDefault = parcelHelpers.interopDefault(_awaitValueJs);\nfunction _awaitAsyncGenerator(value) {\n    return new (0, _awaitValueJsDefault.default)(value);\n}\nexports.default = _awaitAsyncGenerator;\n\n},{\"./AwaitValue.js\":\"hnymc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hnymc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _AwaitValue(value) {\n    this.wrapped = value;\n}\nexports.default = _AwaitValue;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5b0X7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _asyncGeneratorJs = require(\"./AsyncGenerator.js\");\nvar _asyncGeneratorJsDefault = parcelHelpers.interopDefault(_asyncGeneratorJs);\nfunction _wrapAsyncGenerator(fn) {\n    return function() {\n        return new (0, _asyncGeneratorJsDefault.default)(fn.apply(this, arguments));\n    };\n}\nexports.default = _wrapAsyncGenerator;\n\n},{\"./AsyncGenerator.js\":\"fqyI8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fqyI8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _awaitValueJs = require(\"./AwaitValue.js\");\nvar _awaitValueJsDefault = parcelHelpers.interopDefault(_awaitValueJs);\nfunction AsyncGenerator(gen) {\n    var front, back;\n    function send(key, arg) {\n        return new Promise(function(resolve, reject) {\n            var request = {\n                key: key,\n                arg: arg,\n                resolve: resolve,\n                reject: reject,\n                next: null\n            };\n            if (back) back = back.next = request;\n            else {\n                front = back = request;\n                resume(key, arg);\n            }\n        });\n    }\n    function resume(key, arg1) {\n        try {\n            var result = gen[key](arg1);\n            var value = result.value;\n            var wrappedAwait = value instanceof (0, _awaitValueJsDefault.default);\n            Promise.resolve(wrappedAwait ? value.wrapped : value).then(function(arg) {\n                if (wrappedAwait) {\n                    resume(key === \"return\" ? \"return\" : \"next\", arg);\n                    return;\n                }\n                settle(result.done ? \"return\" : \"normal\", arg);\n            }, function(err) {\n                resume(\"throw\", err);\n            });\n        } catch (err) {\n            settle(\"throw\", err);\n        }\n    }\n    function settle(type, value) {\n        switch(type){\n            case \"return\":\n                front.resolve({\n                    value: value,\n                    done: true\n                });\n                break;\n            case \"throw\":\n                front.reject(value);\n                break;\n            default:\n                front.resolve({\n                    value: value,\n                    done: false\n                });\n                break;\n        }\n        front = front.next;\n        if (front) resume(front.key, front.arg);\n        else back = null;\n    }\n    this._invoke = send;\n    if (typeof gen[\"return\"] !== \"function\") this[\"return\"] = undefined;\n}\nexports.default = AsyncGenerator;\nAsyncGenerator.prototype[typeof Symbol === \"function\" && Symbol.asyncIterator || \"@@asyncIterator\"] = function() {\n    return this;\n};\nAsyncGenerator.prototype.next = function(arg) {\n    return this._invoke(\"next\", arg);\n};\nAsyncGenerator.prototype[\"throw\"] = function(arg) {\n    return this._invoke(\"throw\", arg);\n};\nAsyncGenerator.prototype[\"return\"] = function(arg) {\n    return this._invoke(\"return\", arg);\n};\n\n},{\"./AwaitValue.js\":\"hnymc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g5YXH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _asyncIterator(iterable) {\n    var method, async, sync, retry = 2;\n    for(\"undefined\" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;){\n        if (async && null != (method = iterable[async])) return method.call(iterable);\n        if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable));\n        async = \"@@asyncIterator\", sync = \"@@iterator\";\n    }\n    throw new TypeError(\"Object is not async iterable\");\n}\nexports.default = _asyncIterator;\nfunction AsyncFromSyncIterator(s1) {\n    function AsyncFromSyncIteratorContinuation(r) {\n        if (Object(r) !== r) return Promise.reject(new TypeError(r + \" is not an object.\"));\n        var done = r.done;\n        return Promise.resolve(r.value).then(function(value) {\n            return {\n                value: value,\n                done: done\n            };\n        });\n    }\n    return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) {\n        this.s = s, this.n = s.next;\n    }, AsyncFromSyncIterator.prototype = {\n        s: null,\n        n: null,\n        next: function next() {\n            return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));\n        },\n        \"return\": function _return(value) {\n            var ret = this.s[\"return\"];\n            return void 0 === ret ? Promise.resolve({\n                value: value,\n                done: !0\n            }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments));\n        },\n        \"throw\": function _throw(value) {\n            var thr = this.s[\"return\"];\n            return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments));\n        }\n    }, new AsyncFromSyncIterator(s1);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fJwci\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"forEach\", ()=>forEach);\nparcelHelpers.export(exports, \"concatenateChunksAsync\", ()=>concatenateChunksAsync);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _asyncIterator = require(\"@babel/runtime/helpers/esm/asyncIterator\");\nvar _asyncIteratorDefault = parcelHelpers.interopDefault(_asyncIterator);\nvar _arrayBufferUtils = require(\"../binary-utils/array-buffer-utils\");\nvar _assert = require(\"../env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction forEach(_x, _x2) {\n    return _forEach.apply(this, arguments);\n}\nfunction _forEach() {\n    _forEach = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(iterator, visitor) {\n        var _yield$iterator$next, done, value, cancel;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    _context.next = 3;\n                    return iterator.next();\n                case 3:\n                    _yield$iterator$next = _context.sent;\n                    done = _yield$iterator$next.done;\n                    value = _yield$iterator$next.value;\n                    if (!done) {\n                        _context.next = 9;\n                        break;\n                    }\n                    iterator[\"return\"]();\n                    return _context.abrupt(\"return\");\n                case 9:\n                    cancel = visitor(value);\n                    if (!cancel) {\n                        _context.next = 12;\n                        break;\n                    }\n                    return _context.abrupt(\"return\");\n                case 12:\n                    _context.next = 0;\n                    break;\n                case 14:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _forEach.apply(this, arguments);\n}\nfunction concatenateChunksAsync(_x3) {\n    return _concatenateChunksAsync.apply(this, arguments);\n}\nfunction _concatenateChunksAsync() {\n    _concatenateChunksAsync = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(asyncIterator) {\n        var arrayBuffers, strings, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, chunk;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    arrayBuffers = [];\n                    strings = [];\n                    _iteratorNormalCompletion = true;\n                    _didIteratorError = false;\n                    _context2.prev = 4;\n                    _iterator = (0, _asyncIteratorDefault.default)(asyncIterator);\n                case 6:\n                    _context2.next = 8;\n                    return _iterator.next();\n                case 8:\n                    _step = _context2.sent;\n                    _iteratorNormalCompletion = _step.done;\n                    _context2.next = 12;\n                    return _step.value;\n                case 12:\n                    _value = _context2.sent;\n                    if (_iteratorNormalCompletion) {\n                        _context2.next = 19;\n                        break;\n                    }\n                    chunk = _value;\n                    if (typeof chunk === \"string\") strings.push(chunk);\n                    else arrayBuffers.push(chunk);\n                case 16:\n                    _iteratorNormalCompletion = true;\n                    _context2.next = 6;\n                    break;\n                case 19:\n                    _context2.next = 25;\n                    break;\n                case 21:\n                    _context2.prev = 21;\n                    _context2.t0 = _context2[\"catch\"](4);\n                    _didIteratorError = true;\n                    _iteratorError = _context2.t0;\n                case 25:\n                    _context2.prev = 25;\n                    _context2.prev = 26;\n                    if (!(!_iteratorNormalCompletion && _iterator[\"return\"] != null)) {\n                        _context2.next = 30;\n                        break;\n                    }\n                    _context2.next = 30;\n                    return _iterator[\"return\"]();\n                case 30:\n                    _context2.prev = 30;\n                    if (!_didIteratorError) {\n                        _context2.next = 33;\n                        break;\n                    }\n                    throw _iteratorError;\n                case 33:\n                    return _context2.finish(30);\n                case 34:\n                    return _context2.finish(25);\n                case 35:\n                    if (!(strings.length > 0)) {\n                        _context2.next = 38;\n                        break;\n                    }\n                    (0, _assertDefault.default)(arrayBuffers.length === 0);\n                    return _context2.abrupt(\"return\", strings.join(\"\"));\n                case 38:\n                    return _context2.abrupt(\"return\", (0, _arrayBufferUtils.concatenateArrayBuffers).apply(void 0, arrayBuffers));\n                case 39:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2, null, [\n            [\n                4,\n                21,\n                25,\n                35\n            ],\n            [\n                26,\n                ,\n                30,\n                34\n            ]\n        ]);\n    }));\n    return _concatenateChunksAsync.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/helpers/esm/asyncIterator\":\"g5YXH\",\"../binary-utils/array-buffer-utils\":\"1gb9X\",\"../env-utils/assert\":\"9Ogn4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ZQYk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>RequestScheduler);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _stats = require(\"@probe.gl/stats\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar STAT_QUEUED_REQUESTS = \"Queued Requests\";\nvar STAT_ACTIVE_REQUESTS = \"Active Requests\";\nvar STAT_CANCELLED_REQUESTS = \"Cancelled Requests\";\nvar STAT_QUEUED_REQUESTS_EVER = \"Queued Requests Ever\";\nvar STAT_ACTIVE_REQUESTS_EVER = \"Active Requests Ever\";\nvar DEFAULT_PROPS = {\n    id: \"request-scheduler\",\n    throttleRequests: true,\n    maxRequests: 6\n};\nvar RequestScheduler = function() {\n    function RequestScheduler1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, RequestScheduler1);\n        this.props = _objectSpread(_objectSpread({}, DEFAULT_PROPS), props);\n        this.requestQueue = [];\n        this.activeRequestCount = 0;\n        this.requestMap = new Map();\n        this.stats = new (0, _stats.Stats)({\n            id: props.id\n        });\n        this.stats.get(STAT_QUEUED_REQUESTS);\n        this.stats.get(STAT_ACTIVE_REQUESTS);\n        this.stats.get(STAT_CANCELLED_REQUESTS);\n        this.stats.get(STAT_QUEUED_REQUESTS_EVER);\n        this.stats.get(STAT_ACTIVE_REQUESTS_EVER);\n        this._deferredUpdate = null;\n    }\n    (0, _createClassDefault.default)(RequestScheduler1, [\n        {\n            key: \"scheduleRequest\",\n            value: function scheduleRequest(handle) {\n                var getPriority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function() {\n                    return 0;\n                };\n                if (!this.props.throttleRequests) return Promise.resolve({\n                    done: function done() {}\n                });\n                if (this.requestMap.has(handle)) return this.requestMap.get(handle);\n                var request = {\n                    handle: handle,\n                    getPriority: getPriority\n                };\n                var promise = new Promise(function(resolve) {\n                    request.resolve = resolve;\n                    return request;\n                });\n                this.requestQueue.push(request);\n                this.requestMap.set(handle, promise);\n                this._issueNewRequests();\n                return promise;\n            }\n        },\n        {\n            key: \"_issueRequest\",\n            value: function _issueRequest(request) {\n                var _this = this;\n                var handle = request.handle, resolve = request.resolve;\n                var isDone = false;\n                var done = function done() {\n                    if (!isDone) {\n                        isDone = true;\n                        _this.requestMap[\"delete\"](handle);\n                        _this.activeRequestCount--;\n                        _this._issueNewRequests();\n                    }\n                };\n                this.activeRequestCount++;\n                return resolve ? resolve({\n                    done: done\n                }) : Promise.resolve({\n                    done: done\n                });\n            }\n        },\n        {\n            key: \"_issueNewRequests\",\n            value: function _issueNewRequests() {\n                var _this2 = this;\n                if (!this._deferredUpdate) this._deferredUpdate = setTimeout(function() {\n                    return _this2._issueNewRequestsAsync();\n                }, 0);\n            }\n        },\n        {\n            key: \"_issueNewRequestsAsync\",\n            value: function _issueNewRequestsAsync() {\n                this._deferredUpdate = null;\n                var freeSlots = Math.max(this.props.maxRequests - this.activeRequestCount, 0);\n                if (freeSlots === 0) return;\n                this._updateAllRequests();\n                for(var i = 0; i < freeSlots; ++i)if (this.requestQueue.length > 0) {\n                    var request = this.requestQueue.shift();\n                    this._issueRequest(request);\n                }\n            }\n        },\n        {\n            key: \"_updateAllRequests\",\n            value: function _updateAllRequests() {\n                var requestQueue = this.requestQueue;\n                for(var i = 0; i < requestQueue.length; ++i){\n                    var request = requestQueue[i];\n                    if (!this._updateRequest(request)) {\n                        requestQueue.splice(i, 1);\n                        this.requestMap[\"delete\"](request.handle);\n                        i--;\n                    }\n                }\n                requestQueue.sort(function(a, b) {\n                    return a.priority - b.priority;\n                });\n            }\n        },\n        {\n            key: \"_updateRequest\",\n            value: function _updateRequest(request) {\n                request.priority = request.getPriority(request.handle);\n                if (request.priority < 0) {\n                    request.resolve(null);\n                    return false;\n                }\n                return true;\n            }\n        }\n    ]);\n    return RequestScheduler1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@probe.gl/stats\":\"9tfFj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Xk1p\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _defineProperty(obj, key, value) {\n    if (key in obj) Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n    });\n    else obj[key] = value;\n    return obj;\n}\nexports.default = _defineProperty;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9tfFj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Stats\", ()=>(0, _statsDefault.default));\nparcelHelpers.export(exports, \"Stat\", ()=>(0, _statDefault.default));\nparcelHelpers.export(exports, \"_getHiResTimestamp\", ()=>(0, _hiResTimestampDefault.default));\nvar _stats = require(\"./lib/stats\");\nvar _statsDefault = parcelHelpers.interopDefault(_stats);\nvar _stat = require(\"./lib/stat\");\nvar _statDefault = parcelHelpers.interopDefault(_stat);\nvar _hiResTimestamp = require(\"./utils/hi-res-timestamp\");\nvar _hiResTimestampDefault = parcelHelpers.interopDefault(_hiResTimestamp);\n\n},{\"./lib/stats\":\"hwr1n\",\"./lib/stat\":\"58ySI\",\"./utils/hi-res-timestamp\":\"9j9ez\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hwr1n\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _stat = require(\"./stat\");\nvar _statDefault = parcelHelpers.interopDefault(_stat);\nclass Stats {\n    constructor(options){\n        (0, _definePropertyDefault.default)(this, \"id\", void 0);\n        (0, _definePropertyDefault.default)(this, \"stats\", {});\n        this.id = options.id;\n        this.stats = {};\n        this._initializeStats(options.stats);\n        Object.seal(this);\n    }\n    get(name) {\n        let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"count\";\n        return this._getOrCreate({\n            name,\n            type\n        });\n    }\n    get size() {\n        return Object.keys(this.stats).length;\n    }\n    reset() {\n        for(const key in this.stats)this.stats[key].reset();\n        return this;\n    }\n    forEach(fn) {\n        for(const key in this.stats)fn(this.stats[key]);\n    }\n    getTable() {\n        const table = {};\n        this.forEach((stat)=>{\n            table[stat.name] = {\n                time: stat.time || 0,\n                count: stat.count || 0,\n                average: stat.getAverageTime() || 0,\n                hz: stat.getHz() || 0\n            };\n        });\n        return table;\n    }\n    _initializeStats() {\n        let stats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n        stats.forEach((stat)=>this._getOrCreate(stat));\n    }\n    _getOrCreate(stat) {\n        if (!stat || !stat.name) return null;\n        const { name , type  } = stat;\n        if (!this.stats[name]) {\n            if (stat instanceof (0, _statDefault.default)) this.stats[name] = stat;\n            else this.stats[name] = new (0, _statDefault.default)(name, type);\n        }\n        return this.stats[name];\n    }\n}\nexports.default = Stats;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"./stat\":\"58ySI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"58ySI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _hiResTimestamp = require(\"../utils/hi-res-timestamp\");\nvar _hiResTimestampDefault = parcelHelpers.interopDefault(_hiResTimestamp);\nclass Stat {\n    constructor(name, type){\n        (0, _definePropertyDefault.default)(this, \"name\", void 0);\n        (0, _definePropertyDefault.default)(this, \"type\", void 0);\n        (0, _definePropertyDefault.default)(this, \"sampleSize\", 1);\n        (0, _definePropertyDefault.default)(this, \"time\", void 0);\n        (0, _definePropertyDefault.default)(this, \"count\", void 0);\n        (0, _definePropertyDefault.default)(this, \"samples\", void 0);\n        (0, _definePropertyDefault.default)(this, \"lastTiming\", void 0);\n        (0, _definePropertyDefault.default)(this, \"lastSampleTime\", void 0);\n        (0, _definePropertyDefault.default)(this, \"lastSampleCount\", void 0);\n        (0, _definePropertyDefault.default)(this, \"_count\", 0);\n        (0, _definePropertyDefault.default)(this, \"_time\", 0);\n        (0, _definePropertyDefault.default)(this, \"_samples\", 0);\n        (0, _definePropertyDefault.default)(this, \"_startTime\", 0);\n        (0, _definePropertyDefault.default)(this, \"_timerPending\", false);\n        this.name = name;\n        this.type = type;\n        this.reset();\n    }\n    setSampleSize(samples) {\n        this.sampleSize = samples;\n        return this;\n    }\n    incrementCount() {\n        this.addCount(1);\n        return this;\n    }\n    decrementCount() {\n        this.subtractCount(1);\n        return this;\n    }\n    addCount(value) {\n        this._count += value;\n        this._samples++;\n        this._checkSampling();\n        return this;\n    }\n    subtractCount(value) {\n        this._count -= value;\n        this._samples++;\n        this._checkSampling();\n        return this;\n    }\n    addTime(time) {\n        this._time += time;\n        this.lastTiming = time;\n        this._samples++;\n        this._checkSampling();\n        return this;\n    }\n    timeStart() {\n        this._startTime = (0, _hiResTimestampDefault.default)();\n        this._timerPending = true;\n        return this;\n    }\n    timeEnd() {\n        if (!this._timerPending) return this;\n        this.addTime((0, _hiResTimestampDefault.default)() - this._startTime);\n        this._timerPending = false;\n        this._checkSampling();\n        return this;\n    }\n    getSampleAverageCount() {\n        return this.sampleSize > 0 ? this.lastSampleCount / this.sampleSize : 0;\n    }\n    getSampleAverageTime() {\n        return this.sampleSize > 0 ? this.lastSampleTime / this.sampleSize : 0;\n    }\n    getSampleHz() {\n        return this.lastSampleTime > 0 ? this.sampleSize / (this.lastSampleTime / 1000) : 0;\n    }\n    getAverageCount() {\n        return this.samples > 0 ? this.count / this.samples : 0;\n    }\n    getAverageTime() {\n        return this.samples > 0 ? this.time / this.samples : 0;\n    }\n    getHz() {\n        return this.time > 0 ? this.samples / (this.time / 1000) : 0;\n    }\n    reset() {\n        this.time = 0;\n        this.count = 0;\n        this.samples = 0;\n        this.lastTiming = 0;\n        this.lastSampleTime = 0;\n        this.lastSampleCount = 0;\n        this._count = 0;\n        this._time = 0;\n        this._samples = 0;\n        this._startTime = 0;\n        this._timerPending = false;\n        return this;\n    }\n    _checkSampling() {\n        if (this._samples === this.sampleSize) {\n            this.lastSampleTime = this._time;\n            this.lastSampleCount = this._count;\n            this.count += this._count;\n            this.time += this._time;\n            this.samples += this._samples;\n            this._time = 0;\n            this._count = 0;\n            this._samples = 0;\n        }\n    }\n}\nexports.default = Stat;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../utils/hi-res-timestamp\":\"9j9ez\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9j9ez\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar process = require(\"process\");\nfunction getHiResTimestamp() {\n    let timestamp;\n    if (typeof window !== \"undefined\" && window.performance) timestamp = window.performance.now();\n    else if (typeof process !== \"undefined\" && process.hrtime) {\n        const timeParts = process.hrtime();\n        timestamp = timeParts[0] * 1000 + timeParts[1] / 1e6;\n    } else timestamp = Date.now();\n    return timestamp;\n}\nexports.default = getHiResTimestamp;\n\n},{\"process\":\"1RiLM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6ULVt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fetchFile\", ()=>fetchFile);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _responseUtils = require(\"../utils/response-utils\");\nvar _fetchErrorMessage = require(\"./fetch-error-message\");\nfunction fetchFile(_x) {\n    return _fetchFile.apply(this, arguments);\n}\nfunction _fetchFile() {\n    _fetchFile = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(url) {\n        var options, response, _args = arguments;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n                    if (!(typeof url !== \"string\")) {\n                        _context.next = 5;\n                        break;\n                    }\n                    _context.next = 4;\n                    return (0, _responseUtils.makeResponse)(url);\n                case 4:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 5:\n                    url = (0, _loaderUtils.resolvePath)(url);\n                    _context.next = 8;\n                    return fetch(url, options);\n                case 8:\n                    response = _context.sent;\n                    if (!(!response.ok && options[\"throws\"])) {\n                        _context.next = 15;\n                        break;\n                    }\n                    _context.t0 = Error;\n                    _context.next = 13;\n                    return (0, _fetchErrorMessage.getErrorMessageFromResponse)(response);\n                case 13:\n                    _context.t1 = _context.sent;\n                    throw new _context.t0(_context.t1);\n                case 15:\n                    return _context.abrupt(\"return\", response);\n                case 16:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _fetchFile.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"../utils/response-utils\":\"jLy9Q\",\"./fetch-error-message\":\"7WeYG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jLy9Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeResponse\", ()=>makeResponse);\nparcelHelpers.export(exports, \"checkResponse\", ()=>checkResponse);\nparcelHelpers.export(exports, \"checkResponseSync\", ()=>checkResponseSync);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _resourceUtils = require(\"./resource-utils\");\nfunction makeResponse(_x) {\n    return _makeResponse.apply(this, arguments);\n}\nfunction _makeResponse() {\n    _makeResponse = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(resource) {\n        var headers, contentLength, _getResourceUrlAndTyp, url, type, initialDataUrl, response;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    if (!(0, _isType.isResponse)(resource)) {\n                        _context.next = 2;\n                        break;\n                    }\n                    return _context.abrupt(\"return\", resource);\n                case 2:\n                    headers = {};\n                    contentLength = (0, _resourceUtils.getResourceContentLength)(resource);\n                    if (contentLength >= 0) headers[\"content-length\"] = String(contentLength);\n                    _getResourceUrlAndTyp = (0, _resourceUtils.getResourceUrlAndType)(resource), url = _getResourceUrlAndTyp.url, type = _getResourceUrlAndTyp.type;\n                    if (type) headers[\"content-type\"] = type;\n                    _context.next = 9;\n                    return getInitialDataUrl(resource);\n                case 9:\n                    initialDataUrl = _context.sent;\n                    if (initialDataUrl) headers[\"x-first-bytes\"] = initialDataUrl;\n                    if (typeof resource === \"string\") resource = new TextEncoder().encode(resource);\n                    response = new Response(resource, {\n                        headers: headers\n                    });\n                    Object.defineProperty(response, \"url\", {\n                        value: url\n                    });\n                    return _context.abrupt(\"return\", response);\n                case 15:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _makeResponse.apply(this, arguments);\n}\nfunction checkResponse(_x2) {\n    return _checkResponse.apply(this, arguments);\n}\nfunction _checkResponse() {\n    _checkResponse = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(response) {\n        var message;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    if (response.ok) {\n                        _context2.next = 5;\n                        break;\n                    }\n                    _context2.next = 3;\n                    return getResponseError(response);\n                case 3:\n                    message = _context2.sent;\n                    throw new Error(message);\n                case 5:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2);\n    }));\n    return _checkResponse.apply(this, arguments);\n}\nfunction checkResponseSync(response) {\n    if (!response.ok) {\n        var message = \"\".concat(response.status, \" \").concat(response.statusText);\n        message = message.length > 60 ? \"\".concat(message.slice(60), \"...\") : message;\n        throw new Error(message);\n    }\n}\nfunction getResponseError(_x3) {\n    return _getResponseError.apply(this, arguments);\n}\nfunction _getResponseError() {\n    _getResponseError = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee3(response) {\n        var message, contentType, text;\n        return (0, _regeneratorDefault.default).wrap(function _callee3$(_context3) {\n            while(true)switch(_context3.prev = _context3.next){\n                case 0:\n                    message = \"Failed to fetch resource \".concat(response.url, \" (\").concat(response.status, \"): \");\n                    _context3.prev = 1;\n                    contentType = response.headers.get(\"Content-Type\");\n                    text = response.statusText;\n                    if (!contentType.includes(\"application/json\")) {\n                        _context3.next = 11;\n                        break;\n                    }\n                    _context3.t0 = text;\n                    _context3.t1 = \" \";\n                    _context3.next = 9;\n                    return response.text();\n                case 9:\n                    _context3.t2 = _context3.sent;\n                    text = _context3.t0 += _context3.t1.concat.call(_context3.t1, _context3.t2);\n                case 11:\n                    message += text;\n                    message = message.length > 60 ? \"\".concat(message.slice(60), \"...\") : message;\n                    _context3.next = 17;\n                    break;\n                case 15:\n                    _context3.prev = 15;\n                    _context3.t3 = _context3[\"catch\"](1);\n                case 17:\n                    return _context3.abrupt(\"return\", message);\n                case 18:\n                case \"end\":\n                    return _context3.stop();\n            }\n        }, _callee3, null, [\n            [\n                1,\n                15\n            ]\n        ]);\n    }));\n    return _getResponseError.apply(this, arguments);\n}\nfunction getInitialDataUrl(_x4) {\n    return _getInitialDataUrl.apply(this, arguments);\n}\nfunction _getInitialDataUrl() {\n    _getInitialDataUrl = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee4(resource) {\n        var INITIAL_DATA_LENGTH, blobSlice, slice, base64;\n        return (0, _regeneratorDefault.default).wrap(function _callee4$(_context4) {\n            while(true)switch(_context4.prev = _context4.next){\n                case 0:\n                    INITIAL_DATA_LENGTH = 5;\n                    if (!(typeof resource === \"string\")) {\n                        _context4.next = 3;\n                        break;\n                    }\n                    return _context4.abrupt(\"return\", \"data:,\".concat(resource.slice(0, INITIAL_DATA_LENGTH)));\n                case 3:\n                    if (!(resource instanceof Blob)) {\n                        _context4.next = 8;\n                        break;\n                    }\n                    blobSlice = resource.slice(0, 5);\n                    _context4.next = 7;\n                    return new Promise(function(resolve) {\n                        var reader = new FileReader();\n                        reader.onload = function(event) {\n                            return resolve(event.target && event.target.result);\n                        };\n                        reader.readAsDataURL(blobSlice);\n                    });\n                case 7:\n                    return _context4.abrupt(\"return\", _context4.sent);\n                case 8:\n                    if (!(resource instanceof ArrayBuffer)) {\n                        _context4.next = 12;\n                        break;\n                    }\n                    slice = resource.slice(0, INITIAL_DATA_LENGTH);\n                    base64 = arrayBufferToBase64(slice);\n                    return _context4.abrupt(\"return\", \"data:base64,\".concat(base64));\n                case 12:\n                    return _context4.abrupt(\"return\", null);\n                case 13:\n                case \"end\":\n                    return _context4.stop();\n            }\n        }, _callee4);\n    }));\n    return _getInitialDataUrl.apply(this, arguments);\n}\nfunction arrayBufferToBase64(buffer) {\n    var binary = \"\";\n    var bytes = new Uint8Array(buffer);\n    for(var i = 0; i < bytes.byteLength; i++)binary += String.fromCharCode(bytes[i]);\n    return btoa(binary);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"../../javascript-utils/is-type\":\"ceaCP\",\"./resource-utils\":\"kOsIE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ceaCP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isObject\", ()=>isObject);\nparcelHelpers.export(exports, \"isPureObject\", ()=>isPureObject);\nparcelHelpers.export(exports, \"isPromise\", ()=>isPromise);\nparcelHelpers.export(exports, \"isIterable\", ()=>isIterable);\nparcelHelpers.export(exports, \"isAsyncIterable\", ()=>isAsyncIterable);\nparcelHelpers.export(exports, \"isIterator\", ()=>isIterator);\nparcelHelpers.export(exports, \"isResponse\", ()=>isResponse);\nparcelHelpers.export(exports, \"isFile\", ()=>isFile);\nparcelHelpers.export(exports, \"isBlob\", ()=>isBlob);\nparcelHelpers.export(exports, \"isWritableDOMStream\", ()=>isWritableDOMStream);\nparcelHelpers.export(exports, \"isReadableDOMStream\", ()=>isReadableDOMStream);\nparcelHelpers.export(exports, \"isBuffer\", ()=>isBuffer);\nparcelHelpers.export(exports, \"isWritableNodeStream\", ()=>isWritableNodeStream);\nparcelHelpers.export(exports, \"isReadableNodeStream\", ()=>isReadableNodeStream);\nparcelHelpers.export(exports, \"isReadableStream\", ()=>isReadableStream);\nparcelHelpers.export(exports, \"isWritableStream\", ()=>isWritableStream);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar isBoolean = function isBoolean(x) {\n    return typeof x === \"boolean\";\n};\nvar isFunction = function isFunction(x) {\n    return typeof x === \"function\";\n};\nvar isObject = function isObject(x) {\n    return x !== null && (0, _typeofDefault.default)(x) === \"object\";\n};\nvar isPureObject = function isPureObject(x) {\n    return isObject(x) && x.constructor === ({}).constructor;\n};\nvar isPromise = function isPromise(x) {\n    return isObject(x) && isFunction(x.then);\n};\nvar isIterable = function isIterable(x) {\n    return x && typeof x[Symbol.iterator] === \"function\";\n};\nvar isAsyncIterable = function isAsyncIterable(x) {\n    return x && typeof x[Symbol.asyncIterator] === \"function\";\n};\nvar isIterator = function isIterator(x) {\n    return x && isFunction(x.next);\n};\nvar isResponse = function isResponse(x) {\n    return typeof Response !== \"undefined\" && x instanceof Response || x && x.arrayBuffer && x.text && x.json;\n};\nvar isFile = function isFile(x) {\n    return typeof File !== \"undefined\" && x instanceof File;\n};\nvar isBlob = function isBlob(x) {\n    return typeof Blob !== \"undefined\" && x instanceof Blob;\n};\nvar isWritableDOMStream = function isWritableDOMStream(x) {\n    return isObject(x) && isFunction(x.abort) && isFunction(x.getWriter);\n};\nvar isReadableDOMStream = function isReadableDOMStream(x) {\n    return typeof ReadableStream !== \"undefined\" && x instanceof ReadableStream || isObject(x) && isFunction(x.tee) && isFunction(x.cancel) && isFunction(x.getReader);\n};\nvar isBuffer = function isBuffer(x) {\n    return x && (0, _typeofDefault.default)(x) === \"object\" && x.isBuffer;\n};\nvar isWritableNodeStream = function isWritableNodeStream(x) {\n    return isObject(x) && isFunction(x.end) && isFunction(x.write) && isBoolean(x.writable);\n};\nvar isReadableNodeStream = function isReadableNodeStream(x) {\n    return isObject(x) && isFunction(x.read) && isFunction(x.pipe) && isBoolean(x.readable);\n};\nvar isReadableStream = function isReadableStream(x) {\n    return isReadableDOMStream(x) || isReadableNodeStream(x);\n};\nvar isWritableStream = function isWritableStream(x) {\n    return isWritableDOMStream(x) || isWritableNodeStream(x);\n};\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kOsIE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getResourceUrlAndType\", ()=>getResourceUrlAndType);\nparcelHelpers.export(exports, \"getResourceContentLength\", ()=>getResourceContentLength);\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _mimeTypeUtils = require(\"./mime-type-utils\");\nvar QUERY_STRING_PATTERN = /\\?.*/;\nfunction getResourceUrlAndType(resource) {\n    if ((0, _isType.isResponse)(resource)) {\n        var contentType = (0, _mimeTypeUtils.parseMIMEType)(resource.headers.get(\"content-type\"));\n        var urlType = (0, _mimeTypeUtils.parseMIMETypeFromURL)(resource.url);\n        return {\n            url: stripQueryString(resource.url || \"\"),\n            type: contentType || urlType || null\n        };\n    }\n    if ((0, _isType.isBlob)(resource)) return {\n        url: stripQueryString(resource.name || \"\"),\n        type: resource.type || \"\"\n    };\n    if (typeof resource === \"string\") return {\n        url: stripQueryString(resource),\n        type: (0, _mimeTypeUtils.parseMIMETypeFromURL)(resource)\n    };\n    return {\n        url: \"\",\n        type: \"\"\n    };\n}\nfunction getResourceContentLength(resource) {\n    if ((0, _isType.isResponse)(resource)) return resource.headers[\"content-length\"] || -1;\n    if ((0, _isType.isBlob)(resource)) return resource.size;\n    if (typeof resource === \"string\") return resource.length;\n    if (resource instanceof ArrayBuffer) return resource.byteLength;\n    if (ArrayBuffer.isView(resource)) return resource.byteLength;\n    return -1;\n}\nfunction stripQueryString(url) {\n    return url.replace(QUERY_STRING_PATTERN, \"\");\n}\n\n},{\"../../javascript-utils/is-type\":\"ceaCP\",\"./mime-type-utils\":\"b0Cjj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b0Cjj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parseMIMEType\", ()=>parseMIMEType);\nparcelHelpers.export(exports, \"parseMIMETypeFromURL\", ()=>parseMIMETypeFromURL);\nvar DATA_URL_PATTERN = /^data:([-\\w.]+\\/[-\\w.+]+)(;|,)/;\nvar MIME_TYPE_PATTERN = /^([-\\w.]+\\/[-\\w.+]+)/;\nfunction parseMIMEType(mimeString) {\n    if (typeof mimeString !== \"string\") return \"\";\n    var matches = mimeString.match(MIME_TYPE_PATTERN);\n    if (matches) return matches[1];\n    return mimeString;\n}\nfunction parseMIMETypeFromURL(dataUrl) {\n    if (typeof dataUrl !== \"string\") return \"\";\n    var matches = dataUrl.match(DATA_URL_PATTERN);\n    if (matches) return matches[1];\n    return \"\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7WeYG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getErrorMessageFromResponseSync\", ()=>getErrorMessageFromResponseSync);\nparcelHelpers.export(exports, \"getErrorMessageFromResponse\", ()=>getErrorMessageFromResponse);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nfunction getErrorMessageFromResponseSync(response) {\n    return \"Failed to fetch resource \".concat(response.url, \"(\").concat(response.status, \"): \").concat(response.statusText, \" \");\n}\nfunction getErrorMessageFromResponse(_x) {\n    return _getErrorMessageFromResponse.apply(this, arguments);\n}\nfunction _getErrorMessageFromResponse() {\n    _getErrorMessageFromResponse = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(response) {\n        var message, contentType;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    message = \"Failed to fetch resource \".concat(response.url, \" (\").concat(response.status, \"): \");\n                    _context.prev = 1;\n                    contentType = response.headers.get(\"Content-Type\");\n                    if (!contentType.includes(\"application/json\")) {\n                        _context.next = 10;\n                        break;\n                    }\n                    _context.t0 = message;\n                    _context.next = 7;\n                    return response.text();\n                case 7:\n                    message = _context.t0 += _context.sent;\n                    _context.next = 11;\n                    break;\n                case 10:\n                    message += response.statusText;\n                case 11:\n                    _context.next = 16;\n                    break;\n                case 13:\n                    _context.prev = 13;\n                    _context.t1 = _context[\"catch\"](1);\n                    return _context.abrupt(\"return\", message);\n                case 16:\n                    return _context.abrupt(\"return\", message);\n                case 17:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                1,\n                13\n            ]\n        ]);\n    }));\n    return _getErrorMessageFromResponse.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gGNiE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"registerLoaders\", ()=>registerLoaders);\nparcelHelpers.export(exports, \"getRegisteredLoaders\", ()=>getRegisteredLoaders);\nparcelHelpers.export(exports, \"_unregisterLoaders\", ()=>_unregisterLoaders);\nvar _normalizeLoader = require(\"../loader-utils/normalize-loader\");\nvar _optionUtils = require(\"../loader-utils/option-utils\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar getGlobalLoaderRegistry = function getGlobalLoaderRegistry() {\n    var state = (0, _optionUtils.getGlobalLoaderState)();\n    state.loaderRegistry = state.loaderRegistry || [];\n    return state.loaderRegistry;\n};\nfunction registerLoaders(loaders) {\n    var loaderRegistry = getGlobalLoaderRegistry();\n    loaders = Array.isArray(loaders) ? loaders : [\n        loaders\n    ];\n    var _iterator = _createForOfIteratorHelper(loaders), _step;\n    try {\n        var _loop = function _loop() {\n            var loader = _step.value;\n            var normalizedLoader = (0, _normalizeLoader.normalizeLoader)(loader);\n            if (!loaderRegistry.find(function(registeredLoader) {\n                return normalizedLoader === registeredLoader;\n            })) loaderRegistry.unshift(normalizedLoader);\n        };\n        for(_iterator.s(); !(_step = _iterator.n()).done;)_loop();\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n}\nfunction getRegisteredLoaders() {\n    return getGlobalLoaderRegistry();\n}\nfunction _unregisterLoaders() {\n    var state = (0, _optionUtils.getGlobalLoaderState)();\n    state.loaderRegistry = [];\n}\n\n},{\"../loader-utils/normalize-loader\":\"g60Fi\",\"../loader-utils/option-utils\":\"lu6r8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g60Fi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isLoaderObject\", ()=>isLoaderObject);\nparcelHelpers.export(exports, \"normalizeLoader\", ()=>normalizeLoader);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction isLoaderObject(loader) {\n    if (!loader) return false;\n    if (Array.isArray(loader)) loader = loader[0];\n    var hasParser = loader.parseTextSync || loader.parseSync || loader.parse || loader.parseStream || loader.parseInBatches;\n    var loaderOptions = loader.options && loader.options[loader.id];\n    hasParser = hasParser || loaderOptions && loaderOptions.workerUrl;\n    return hasParser;\n}\nfunction normalizeLoader(loader) {\n    (0, _loaderUtils.assert)(loader, \"null loader\");\n    (0, _loaderUtils.assert)(isLoaderObject(loader), \"invalid loader\");\n    var options;\n    if (Array.isArray(loader)) {\n        options = loader[1];\n        loader = loader[0];\n        loader = _objectSpread(_objectSpread({}, loader), {}, {\n            options: _objectSpread(_objectSpread({}, loader.options), options)\n        });\n    }\n    if (loader.extension) {\n        loader.extensions = loader.extensions || loader.extension;\n        delete loader.extension;\n    }\n    if (!Array.isArray(loader.extensions)) loader.extensions = [\n        loader.extensions\n    ];\n    (0, _loaderUtils.assert)(loader.extensions && loader.extensions.length > 0 && loader.extensions[0]);\n    if (loader.parseTextSync || loader.parseText) loader.text = true;\n    if (!loader.text) loader.binary = true;\n    return loader;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lu6r8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getGlobalLoaderState\", ()=>getGlobalLoaderState);\nparcelHelpers.export(exports, \"setGlobalOptions\", ()=>setGlobalOptions);\nparcelHelpers.export(exports, \"normalizeOptions\", ()=>normalizeOptions);\nparcelHelpers.export(exports, \"getFetchFunction\", ()=>getFetchFunction);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _fetchFile = require(\"../fetch/fetch-file\");\nvar _loggers = require(\"./loggers\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar DEFAULT_LOADER_OPTIONS = {\n    baseUri: \"\",\n    fetch: null,\n    CDN: \"https://unpkg.com/@loaders.gl\",\n    worker: true,\n    log: new (0, _loggers.ConsoleLog)(),\n    metadata: false,\n    transforms: [],\n    reuseWorkers: true\n};\nvar DEPRECATED_LOADER_OPTIONS = {\n    dataType: \"(no longer used)\",\n    method: \"fetch.method\",\n    headers: \"fetch.headers\",\n    body: \"fetch.body\",\n    mode: \"fetch.mode\",\n    credentials: \"fetch.credentials\",\n    cache: \"fetch.cache\",\n    redirect: \"fetch.redirect\",\n    referrer: \"fetch.referrer\",\n    referrerPolicy: \"fetch.referrerPolicy\",\n    integrity: \"fetch.integrity\",\n    keepalive: \"fetch.keepalive\",\n    signal: \"fetch.signal\"\n};\nvar getGlobalLoaderState = function getGlobalLoaderState() {\n    (0, _loaderUtils.global).loaders = (0, _loaderUtils.global).loaders || {};\n    var loaders = (0, _loaderUtils.global).loaders;\n    loaders._state = loaders._state || {};\n    return loaders._state;\n};\nvar getGlobalLoaderOptions = function getGlobalLoaderOptions() {\n    var state = getGlobalLoaderState();\n    state.globalOptions = state.globalOptions || _objectSpread({}, DEFAULT_LOADER_OPTIONS);\n    return state.globalOptions;\n};\nfunction setGlobalOptions(options) {\n    var state = getGlobalLoaderState();\n    var globalOptions = getGlobalLoaderOptions();\n    state.globalOptions = normalizeOptionsInternal(globalOptions, options);\n}\nfunction normalizeOptions(options, loader, loaders, url) {\n    loaders = loaders || [];\n    loaders = Array.isArray(loaders) ? loaders : [\n        loaders\n    ];\n    validateOptions(options, loaders);\n    return normalizeOptionsInternal(loader, options, url);\n}\nfunction getFetchFunction(options, context) {\n    var globalOptions = getGlobalLoaderOptions();\n    var fetch = options.fetch || globalOptions.fetch;\n    if (typeof fetch === \"function\") return fetch;\n    if ((0, _isType.isObject)(fetch)) return function(url) {\n        return (0, _fetchFile.fetchFile)(url, fetch);\n    };\n    if (context && context.fetch) return context.fetch;\n    return function(url) {\n        return (0, _fetchFile.fetchFile)(url, options);\n    };\n}\nfunction validateOptions(options, loaders) {\n    var log = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : console;\n    validateOptionsObject(options, null, log, DEFAULT_LOADER_OPTIONS, DEPRECATED_LOADER_OPTIONS, loaders);\n    var _iterator = _createForOfIteratorHelper(loaders), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var loader = _step.value;\n            var idOptions = options && options[loader.id] || {};\n            var loaderOptions = loader.options && loader.options[loader.id] || {};\n            var deprecatedOptions = loader.defaultOptions && loader.defaultOptions[loader.id] || {};\n            validateOptionsObject(idOptions, loader.id, log, loaderOptions, deprecatedOptions, loaders);\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n}\nfunction validateOptionsObject(options, id, log, defaultOptions, deprecatedOptions, loaders) {\n    var loaderName = id || \"Top level\";\n    var prefix = id ? \"\".concat(id, \".\") : \"\";\n    for(var key in options){\n        var isSubOptions = !id && (0, _isType.isObject)(options[key]);\n        if (!(key in defaultOptions)) {\n            if (key in deprecatedOptions) log.warn(\"\".concat(loaderName, \" loader option '\").concat(prefix).concat(key, \"' deprecated, use '\").concat(deprecatedOptions[key], \"'\"));\n            else if (!isSubOptions) {\n                var suggestion = findSimilarOption(key, loaders);\n                log.warn(\"\".concat(loaderName, \" loader option '\").concat(prefix).concat(key, \"' not recognized. \").concat(suggestion));\n            }\n        }\n    }\n}\nfunction findSimilarOption(optionKey, loaders) {\n    var lowerCaseOptionKey = optionKey.toLowerCase();\n    var bestSuggestion = \"\";\n    var _iterator2 = _createForOfIteratorHelper(loaders), _step2;\n    try {\n        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n            var loader = _step2.value;\n            for(var key in loader.options){\n                if (optionKey === key) return \"Did you mean '\".concat(loader.id, \".\").concat(key, \"'?\");\n                var lowerCaseKey = key.toLowerCase();\n                var isPartialMatch = lowerCaseOptionKey.startsWith(lowerCaseKey) || lowerCaseKey.startsWith(lowerCaseOptionKey);\n                if (isPartialMatch) bestSuggestion = bestSuggestion || \"Did you mean '\".concat(loader.id, \".\").concat(key, \"'?\");\n            }\n        }\n    } catch (err) {\n        _iterator2.e(err);\n    } finally{\n        _iterator2.f();\n    }\n    return bestSuggestion;\n}\nfunction normalizeOptionsInternal(loader, options, url) {\n    var loaderDefaultOptions = loader.options || {};\n    var mergedOptions = _objectSpread({}, loaderDefaultOptions);\n    if (mergedOptions.log === null) mergedOptions.log = new (0, _loggers.NullLog)();\n    mergeNestedFields(mergedOptions, getGlobalLoaderOptions());\n    mergeNestedFields(mergedOptions, options);\n    addUrlOptions(mergedOptions, url);\n    return mergedOptions;\n}\nfunction mergeNestedFields(mergedOptions, options) {\n    for(var key in options)if (key in options) {\n        var value = options[key];\n        if ((0, _isType.isPureObject)(value) && (0, _isType.isPureObject)(mergedOptions[key])) mergedOptions[key] = _objectSpread(_objectSpread({}, mergedOptions[key]), options[key]);\n        else mergedOptions[key] = options[key];\n    }\n}\nfunction addUrlOptions(options, url) {\n    if (url && !options.baseUri) options.baseUri = url;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"../../javascript-utils/is-type\":\"ceaCP\",\"../fetch/fetch-file\":\"6ULVt\",\"./loggers\":\"la8Jm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"la8Jm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"NullLog\", ()=>NullLog);\nparcelHelpers.export(exports, \"ConsoleLog\", ()=>ConsoleLog);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar NullLog = function() {\n    function NullLog1() {\n        (0, _classCallCheckDefault.default)(this, NullLog1);\n    }\n    (0, _createClassDefault.default)(NullLog1, [\n        {\n            key: \"log\",\n            value: function log() {\n                return function(_) {};\n            }\n        },\n        {\n            key: \"info\",\n            value: function info() {\n                return function(_) {};\n            }\n        },\n        {\n            key: \"warn\",\n            value: function warn() {\n                return function(_) {};\n            }\n        },\n        {\n            key: \"error\",\n            value: function error() {\n                return function(_) {};\n            }\n        }\n    ]);\n    return NullLog1;\n}();\nvar ConsoleLog = function() {\n    function ConsoleLog1() {\n        (0, _classCallCheckDefault.default)(this, ConsoleLog1);\n        this.console = console;\n    }\n    (0, _createClassDefault.default)(ConsoleLog1, [\n        {\n            key: \"log\",\n            value: function log() {\n                var _this$console$log;\n                for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++)args[_key] = arguments[_key];\n                return (_this$console$log = this.console.log).bind.apply(_this$console$log, [\n                    this.console\n                ].concat(args));\n            }\n        },\n        {\n            key: \"info\",\n            value: function info() {\n                var _this$console$info;\n                for(var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++)args[_key2] = arguments[_key2];\n                return (_this$console$info = this.console.info).bind.apply(_this$console$info, [\n                    this.console\n                ].concat(args));\n            }\n        },\n        {\n            key: \"warn\",\n            value: function warn() {\n                var _this$console$warn;\n                for(var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++)args[_key3] = arguments[_key3];\n                return (_this$console$warn = this.console.warn).bind.apply(_this$console$warn, [\n                    this.console\n                ].concat(args));\n            }\n        },\n        {\n            key: \"error\",\n            value: function error() {\n                var _this$console$error;\n                for(var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++)args[_key4] = arguments[_key4];\n                return (_this$console$error = this.console.error).bind.apply(_this$console$error, [\n                    this.console\n                ].concat(args));\n            }\n        }\n    ]);\n    return ConsoleLog1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7C096\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parse\", ()=>parse);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _normalizeLoader = require(\"../loader-utils/normalize-loader\");\nvar _optionUtils = require(\"../loader-utils/option-utils\");\nvar _getData = require(\"../loader-utils/get-data\");\nvar _contextUtils = require(\"../loader-utils/context-utils\");\nvar _parseWithWorker = require(\"../loader-utils/parse-with-worker\");\nvar _parseWithWorkerDefault = parcelHelpers.interopDefault(_parseWithWorker);\nvar _resourceUtils = require(\"../utils/resource-utils\");\nvar _selectLoader = require(\"./select-loader\");\nfunction parse(_x, _x2, _x3, _x4) {\n    return _parse.apply(this, arguments);\n}\nfunction _parse() {\n    _parse = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(data, loaders, options, context) {\n        var _getResourceUrlAndTyp, url, candidateLoaders, loader;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    (0, _loaderUtils.assert)(!context || typeof context !== \"string\", \"parse no longer accepts final url\");\n                    if (loaders && !Array.isArray(loaders) && !(0, _normalizeLoader.isLoaderObject)(loaders)) {\n                        context = options;\n                        options = loaders;\n                        loaders = null;\n                    }\n                    _context.next = 4;\n                    return data;\n                case 4:\n                    data = _context.sent;\n                    options = options || {};\n                    _getResourceUrlAndTyp = (0, _resourceUtils.getResourceUrlAndType)(data), url = _getResourceUrlAndTyp.url;\n                    candidateLoaders = (0, _contextUtils.getLoaders)(loaders, context);\n                    _context.next = 10;\n                    return (0, _selectLoader.selectLoader)(data, candidateLoaders, options);\n                case 10:\n                    loader = _context.sent;\n                    if (loader) {\n                        _context.next = 13;\n                        break;\n                    }\n                    return _context.abrupt(\"return\", null);\n                case 13:\n                    options = (0, _optionUtils.normalizeOptions)(options, loader, candidateLoaders, url);\n                    context = (0, _contextUtils.getLoaderContext)({\n                        url: url,\n                        parse: parse,\n                        loaders: candidateLoaders\n                    }, options, context);\n                    _context.next = 17;\n                    return parseWithLoader(loader, data, options, context);\n                case 17:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 18:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _parse.apply(this, arguments);\n}\nfunction parseWithLoader(_x5, _x6, _x7, _x8) {\n    return _parseWithLoader.apply(this, arguments);\n}\nfunction _parseWithLoader() {\n    _parseWithLoader = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(loader, data, options, context) {\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    (0, _loaderUtils.validateLoaderVersion)(loader);\n                    _context2.next = 3;\n                    return (0, _getData.getArrayBufferOrStringFromData)(data, loader);\n                case 3:\n                    data = _context2.sent;\n                    if (!(loader.parseTextSync && typeof data === \"string\")) {\n                        _context2.next = 7;\n                        break;\n                    }\n                    options.dataType = \"text\";\n                    return _context2.abrupt(\"return\", loader.parseTextSync(data, options, context, loader));\n                case 7:\n                    if (!(0, _parseWithWorker.canParseWithWorker)(loader, data, options, context)) {\n                        _context2.next = 11;\n                        break;\n                    }\n                    _context2.next = 10;\n                    return (0, _parseWithWorkerDefault.default)(loader, data, options, context);\n                case 10:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 11:\n                    if (!(loader.parseText && typeof data === \"string\")) {\n                        _context2.next = 15;\n                        break;\n                    }\n                    _context2.next = 14;\n                    return loader.parseText(data, options, context, loader);\n                case 14:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 15:\n                    if (!loader.parse) {\n                        _context2.next = 19;\n                        break;\n                    }\n                    _context2.next = 18;\n                    return loader.parse(data, options, context, loader);\n                case 18:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 19:\n                    (0, _loaderUtils.assert)(!loader.parseSync);\n                    return _context2.abrupt(\"return\", (0, _loaderUtils.assert)(false));\n                case 21:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2);\n    }));\n    return _parseWithLoader.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"../loader-utils/normalize-loader\":\"g60Fi\",\"../loader-utils/option-utils\":\"lu6r8\",\"../loader-utils/get-data\":\"d1z4x\",\"../loader-utils/context-utils\":\"aeYm4\",\"../loader-utils/parse-with-worker\":\"bK6pP\",\"../utils/resource-utils\":\"kOsIE\",\"./select-loader\":\"g4jKF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d1z4x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getArrayBufferOrStringFromDataSync\", ()=>getArrayBufferOrStringFromDataSync);\nparcelHelpers.export(exports, \"getArrayBufferOrStringFromData\", ()=>getArrayBufferOrStringFromData);\nparcelHelpers.export(exports, \"getAsyncIteratorFromData\", ()=>getAsyncIteratorFromData);\nparcelHelpers.export(exports, \"getReadableStream\", ()=>getReadableStream);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _makeIterator = require(\"../../iterator-utils/make-iterator/make-iterator\");\nvar _responseUtils = require(\"../utils/response-utils\");\nvar ERR_DATA = \"Cannot convert supplied data type\";\nfunction getArrayBufferOrStringFromDataSync(data, loader) {\n    if (loader.text && typeof data === \"string\") return data;\n    if (data instanceof ArrayBuffer) {\n        var arrayBuffer = data;\n        if (loader.text && !loader.binary) {\n            var textDecoder = new TextDecoder(\"utf8\");\n            return textDecoder.decode(arrayBuffer);\n        }\n        return arrayBuffer;\n    }\n    if (ArrayBuffer.isView(data) || (0, _isType.isBuffer)(data)) {\n        if (loader.text && !loader.binary) {\n            var _textDecoder = new TextDecoder(\"utf8\");\n            return _textDecoder.decode(data);\n        }\n        var _arrayBuffer = data.buffer;\n        var byteLength = data.byteLength || data.length;\n        if (data.byteOffset !== 0 || byteLength !== _arrayBuffer.byteLength) _arrayBuffer = _arrayBuffer.slice(data.byteOffset, data.byteOffset + byteLength);\n        return _arrayBuffer;\n    }\n    throw new Error(ERR_DATA);\n}\nfunction getArrayBufferOrStringFromData(_x, _x2) {\n    return _getArrayBufferOrStringFromData.apply(this, arguments);\n}\nfunction _getArrayBufferOrStringFromData() {\n    _getArrayBufferOrStringFromData = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(data, loader) {\n        var isArrayBuffer, response;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context3) {\n            while(true)switch(_context3.prev = _context3.next){\n                case 0:\n                    isArrayBuffer = data instanceof ArrayBuffer || ArrayBuffer.isView(data);\n                    if (!(typeof data === \"string\" || isArrayBuffer)) {\n                        _context3.next = 3;\n                        break;\n                    }\n                    return _context3.abrupt(\"return\", getArrayBufferOrStringFromDataSync(data, loader));\n                case 3:\n                    if (!(0, _isType.isBlob)(data)) {\n                        _context3.next = 7;\n                        break;\n                    }\n                    _context3.next = 6;\n                    return (0, _responseUtils.makeResponse)(data);\n                case 6:\n                    data = _context3.sent;\n                case 7:\n                    if (!(0, _isType.isResponse)(data)) {\n                        _context3.next = 21;\n                        break;\n                    }\n                    response = data;\n                    _context3.next = 11;\n                    return (0, _responseUtils.checkResponse)(response);\n                case 11:\n                    if (!loader.binary) {\n                        _context3.next = 17;\n                        break;\n                    }\n                    _context3.next = 14;\n                    return response.arrayBuffer();\n                case 14:\n                    _context3.t0 = _context3.sent;\n                    _context3.next = 20;\n                    break;\n                case 17:\n                    _context3.next = 19;\n                    return response.text();\n                case 19:\n                    _context3.t0 = _context3.sent;\n                case 20:\n                    return _context3.abrupt(\"return\", _context3.t0);\n                case 21:\n                    if ((0, _isType.isReadableStream)(data)) data = (0, _makeIterator.makeIterator)(data);\n                    if (!((0, _isType.isIterable)(data) || (0, _isType.isAsyncIterable)(data))) {\n                        _context3.next = 24;\n                        break;\n                    }\n                    return _context3.abrupt(\"return\", (0, _loaderUtils.concatenateChunksAsync)(data));\n                case 24:\n                    throw new Error(ERR_DATA);\n                case 25:\n                case \"end\":\n                    return _context3.stop();\n            }\n        }, _callee);\n    }));\n    return _getArrayBufferOrStringFromData.apply(this, arguments);\n}\nfunction getAsyncIteratorFromData(_x3) {\n    return _getAsyncIteratorFromData.apply(this, arguments);\n}\nfunction _getAsyncIteratorFromData() {\n    _getAsyncIteratorFromData = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(data) {\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context4) {\n            while(true)switch(_context4.prev = _context4.next){\n                case 0:\n                    if (!(0, _isType.isIterator)(data)) {\n                        _context4.next = 2;\n                        break;\n                    }\n                    return _context4.abrupt(\"return\", data);\n                case 2:\n                    if (!(0, _isType.isResponse)(data)) {\n                        _context4.next = 6;\n                        break;\n                    }\n                    _context4.next = 5;\n                    return (0, _responseUtils.checkResponse)(data);\n                case 5:\n                    return _context4.abrupt(\"return\", (0, _makeIterator.makeIterator)(data.body));\n                case 6:\n                    if (!((0, _isType.isBlob)(data) || (0, _isType.isReadableStream)(data))) {\n                        _context4.next = 8;\n                        break;\n                    }\n                    return _context4.abrupt(\"return\", (0, _makeIterator.makeIterator)(data));\n                case 8:\n                    if (!(0, _isType.isAsyncIterable)(data)) {\n                        _context4.next = 10;\n                        break;\n                    }\n                    return _context4.abrupt(\"return\", data[Symbol.asyncIterator]());\n                case 10:\n                    return _context4.abrupt(\"return\", getIteratorFromData(data));\n                case 11:\n                case \"end\":\n                    return _context4.stop();\n            }\n        }, _callee2);\n    }));\n    return _getAsyncIteratorFromData.apply(this, arguments);\n}\nfunction getIteratorFromData(data) {\n    if (ArrayBuffer.isView(data)) return (0, _regeneratorDefault.default).mark(function oneChunk() {\n        return (0, _regeneratorDefault.default).wrap(function oneChunk$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    _context.next = 2;\n                    return data.buffer;\n                case 2:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, oneChunk);\n    })();\n    if (data instanceof ArrayBuffer) return (0, _regeneratorDefault.default).mark(function oneChunk() {\n        return (0, _regeneratorDefault.default).wrap(function oneChunk$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    _context2.next = 2;\n                    return data;\n                case 2:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, oneChunk);\n    })();\n    if ((0, _isType.isIterator)(data)) return data;\n    if ((0, _isType.isIterable)(data)) return data[Symbol.iterator]();\n    throw new Error(ERR_DATA);\n}\nfunction getReadableStream(_x4) {\n    return _getReadableStream.apply(this, arguments);\n}\nfunction _getReadableStream() {\n    _getReadableStream = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee3(data) {\n        var response;\n        return (0, _regeneratorDefault.default).wrap(function _callee3$(_context5) {\n            while(true)switch(_context5.prev = _context5.next){\n                case 0:\n                    if (!(0, _isType.isReadableStream)(data)) {\n                        _context5.next = 2;\n                        break;\n                    }\n                    return _context5.abrupt(\"return\", data);\n                case 2:\n                    if (!(0, _isType.isResponse)(data)) {\n                        _context5.next = 4;\n                        break;\n                    }\n                    return _context5.abrupt(\"return\", data.body);\n                case 4:\n                    _context5.next = 6;\n                    return (0, _responseUtils.makeResponse)(data);\n                case 6:\n                    response = _context5.sent;\n                    return _context5.abrupt(\"return\", response.body);\n                case 8:\n                case \"end\":\n                    return _context5.stop();\n            }\n        }, _callee3);\n    }));\n    return _getReadableStream.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"../../javascript-utils/is-type\":\"ceaCP\",\"../../iterator-utils/make-iterator/make-iterator\":\"3v8qm\",\"../utils/response-utils\":\"jLy9Q\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3v8qm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeIterator\", ()=>makeIterator);\nvar _stringIterator = require(\"./string-iterator\");\nvar _arrayBufferIterator = require(\"./array-buffer-iterator\");\nvar _blobIterator = require(\"./blob-iterator\");\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _streamIterator = require(\"./stream-iterator\");\nvar _isType = require(\"../../javascript-utils/is-type\");\nfunction makeIterator(data) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    if (typeof data === \"string\") return (0, _stringIterator.makeStringIterator)(data, options);\n    if (data instanceof ArrayBuffer) return (0, _arrayBufferIterator.makeArrayBufferIterator)(data, options);\n    if ((0, _isType.isBlob)(data)) return (0, _blobIterator.makeBlobIterator)(data, options);\n    if ((0, _isType.isReadableStream)(data)) return (0, _streamIterator.makeStreamIterator)(data);\n    if ((0, _isType.isResponse)(data)) return (0, _streamIterator.makeStreamIterator)(data.body);\n    return (0, _loaderUtils.assert)(false);\n}\n\n},{\"./string-iterator\":\"2uAYo\",\"./array-buffer-iterator\":\"7RyGk\",\"./blob-iterator\":\"37H4I\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"./stream-iterator\":\"8jWoi\",\"../../javascript-utils/is-type\":\"ceaCP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2uAYo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeStringIterator\", ()=>makeStringIterator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _marked = (0, _regeneratorDefault.default).mark(makeStringIterator);\nfunction makeStringIterator(string) {\n    var options, _options$chunkSize, chunkSize, offset, textEncoder, chunkLength, chunk, _args = arguments;\n    return (0, _regeneratorDefault.default).wrap(function makeStringIterator$(_context) {\n        while(true)switch(_context.prev = _context.next){\n            case 0:\n                options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n                _options$chunkSize = options.chunkSize, chunkSize = _options$chunkSize === void 0 ? 262144 : _options$chunkSize;\n                offset = 0;\n                textEncoder = new TextEncoder();\n            case 4:\n                if (!(offset < string.length)) {\n                    _context.next = 12;\n                    break;\n                }\n                chunkLength = Math.min(string.length - offset, chunkSize);\n                chunk = string.slice(offset, offset + chunkLength);\n                offset += chunkLength;\n                _context.next = 10;\n                return textEncoder.encode(chunk);\n            case 10:\n                _context.next = 4;\n                break;\n            case 12:\n            case \"end\":\n                return _context.stop();\n        }\n    }, _marked);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7RyGk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeArrayBufferIterator\", ()=>makeArrayBufferIterator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _marked = (0, _regeneratorDefault.default).mark(makeArrayBufferIterator);\nfunction makeArrayBufferIterator(arrayBuffer) {\n    var options, _options$chunkSize, chunkSize, byteOffset, chunkByteLength, chunk, sourceArray, chunkArray, _args = arguments;\n    return (0, _regeneratorDefault.default).wrap(function makeArrayBufferIterator$(_context) {\n        while(true)switch(_context.prev = _context.next){\n            case 0:\n                options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n                _options$chunkSize = options.chunkSize, chunkSize = _options$chunkSize === void 0 ? 262144 : _options$chunkSize;\n                byteOffset = 0;\n            case 3:\n                if (!(byteOffset < arrayBuffer.byteLength)) {\n                    _context.next = 14;\n                    break;\n                }\n                chunkByteLength = Math.min(arrayBuffer.byteLength - byteOffset, chunkSize);\n                chunk = new ArrayBuffer(chunkByteLength);\n                sourceArray = new Uint8Array(arrayBuffer, byteOffset, chunkByteLength);\n                chunkArray = new Uint8Array(chunk);\n                chunkArray.set(sourceArray);\n                byteOffset += chunkByteLength;\n                _context.next = 12;\n                return chunk;\n            case 12:\n                _context.next = 3;\n                break;\n            case 14:\n            case \"end\":\n                return _context.stop();\n        }\n    }, _marked);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"37H4I\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeBlobIterator\", ()=>makeBlobIterator);\nparcelHelpers.export(exports, \"readFileSlice\", ()=>readFileSlice);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _awaitAsyncGenerator = require(\"@babel/runtime/helpers/esm/awaitAsyncGenerator\");\nvar _awaitAsyncGeneratorDefault = parcelHelpers.interopDefault(_awaitAsyncGenerator);\nvar _wrapAsyncGenerator = require(\"@babel/runtime/helpers/esm/wrapAsyncGenerator\");\nvar _wrapAsyncGeneratorDefault = parcelHelpers.interopDefault(_wrapAsyncGenerator);\nvar DEFAULT_CHUNK_SIZE = 1048576;\nfunction makeBlobIterator(_x) {\n    return _makeBlobIterator.apply(this, arguments);\n}\nfunction _makeBlobIterator() {\n    _makeBlobIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(file) {\n        var options, chunkSize, offset, end, chunk, _args = arguments;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n                    chunkSize = options.chunkSize || DEFAULT_CHUNK_SIZE;\n                    offset = 0;\n                case 3:\n                    if (!(offset < file.size)) {\n                        _context.next = 13;\n                        break;\n                    }\n                    end = offset + chunkSize;\n                    _context.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(readFileSlice(file, offset, end));\n                case 7:\n                    chunk = _context.sent;\n                    offset = end;\n                    _context.next = 11;\n                    return chunk;\n                case 11:\n                    _context.next = 3;\n                    break;\n                case 13:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _makeBlobIterator.apply(this, arguments);\n}\nfunction readFileSlice(_x2, _x3, _x4) {\n    return _readFileSlice.apply(this, arguments);\n}\nfunction _readFileSlice() {\n    _readFileSlice = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(file, offset, end) {\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    _context2.next = 2;\n                    return new Promise(function(resolve, reject) {\n                        var slice = file.slice(offset, end);\n                        var fileReader = new FileReader();\n                        fileReader.onload = function(event) {\n                            return resolve(event.target && event.target.result);\n                        };\n                        fileReader.onerror = function(error) {\n                            return reject(error);\n                        };\n                        fileReader.readAsArrayBuffer(slice);\n                    });\n                case 2:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 3:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2);\n    }));\n    return _readFileSlice.apply(this, arguments);\n}\n\n},{\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/awaitAsyncGenerator\":\"9cx1k\",\"@babel/runtime/helpers/esm/wrapAsyncGenerator\":\"5b0X7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8jWoi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeStreamIterator\", ()=>makeStreamIterator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _awaitAsyncGenerator = require(\"@babel/runtime/helpers/esm/awaitAsyncGenerator\");\nvar _awaitAsyncGeneratorDefault = parcelHelpers.interopDefault(_awaitAsyncGenerator);\nvar _wrapAsyncGenerator = require(\"@babel/runtime/helpers/esm/wrapAsyncGenerator\");\nvar _wrapAsyncGeneratorDefault = parcelHelpers.interopDefault(_wrapAsyncGenerator);\nvar _asyncIterator = require(\"@babel/runtime/helpers/esm/asyncIterator\");\nvar _asyncIteratorDefault = parcelHelpers.interopDefault(_asyncIterator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nfunction makeStreamIterator(stream) {\n    if ((0, _loaderUtils.isBrowser) || (0, _loaderUtils.nodeVersion) >= 10) {\n        if (typeof stream[Symbol.asyncIterator] === \"function\") return makeToArrayBufferIterator(stream);\n        if (typeof stream.getIterator === \"function\") return stream.getIterator();\n    }\n    return (0, _loaderUtils.isBrowser) ? makeBrowserStreamIterator(stream) : makeNodeStreamIterator(stream);\n}\nfunction makeToArrayBufferIterator(_x) {\n    return _makeToArrayBufferIterator.apply(this, arguments);\n}\nfunction _makeToArrayBufferIterator() {\n    _makeToArrayBufferIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(asyncIterator) {\n        var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, chunk;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    _iteratorNormalCompletion = true;\n                    _didIteratorError = false;\n                    _context.prev = 2;\n                    _iterator = (0, _asyncIteratorDefault.default)(asyncIterator);\n                case 4:\n                    _context.next = 6;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator.next());\n                case 6:\n                    _step = _context.sent;\n                    _iteratorNormalCompletion = _step.done;\n                    _context.next = 10;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step.value);\n                case 10:\n                    _value = _context.sent;\n                    if (_iteratorNormalCompletion) {\n                        _context.next = 18;\n                        break;\n                    }\n                    chunk = _value;\n                    _context.next = 15;\n                    return (0, _loaderUtils.toArrayBuffer)(chunk);\n                case 15:\n                    _iteratorNormalCompletion = true;\n                    _context.next = 4;\n                    break;\n                case 18:\n                    _context.next = 24;\n                    break;\n                case 20:\n                    _context.prev = 20;\n                    _context.t0 = _context[\"catch\"](2);\n                    _didIteratorError = true;\n                    _iteratorError = _context.t0;\n                case 24:\n                    _context.prev = 24;\n                    _context.prev = 25;\n                    if (!(!_iteratorNormalCompletion && _iterator[\"return\"] != null)) {\n                        _context.next = 29;\n                        break;\n                    }\n                    _context.next = 29;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator[\"return\"]());\n                case 29:\n                    _context.prev = 29;\n                    if (!_didIteratorError) {\n                        _context.next = 32;\n                        break;\n                    }\n                    throw _iteratorError;\n                case 32:\n                    return _context.finish(29);\n                case 33:\n                    return _context.finish(24);\n                case 34:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                2,\n                20,\n                24,\n                34\n            ],\n            [\n                25,\n                ,\n                29,\n                33\n            ]\n        ]);\n    }));\n    return _makeToArrayBufferIterator.apply(this, arguments);\n}\nfunction makeBrowserStreamIterator(_x2) {\n    return _makeBrowserStreamIterator.apply(this, arguments);\n}\nfunction _makeBrowserStreamIterator() {\n    _makeBrowserStreamIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(stream) {\n        var reader, _yield$_awaitAsyncGen, done, value;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    reader = stream.getReader();\n                    _context2.prev = 1;\n                case 2:\n                    _context2.next = 5;\n                    return (0, _awaitAsyncGeneratorDefault.default)(reader.read());\n                case 5:\n                    _yield$_awaitAsyncGen = _context2.sent;\n                    done = _yield$_awaitAsyncGen.done;\n                    value = _yield$_awaitAsyncGen.value;\n                    if (!done) {\n                        _context2.next = 10;\n                        break;\n                    }\n                    return _context2.abrupt(\"return\");\n                case 10:\n                    _context2.next = 12;\n                    return (0, _loaderUtils.toArrayBuffer)(value);\n                case 12:\n                    _context2.next = 2;\n                    break;\n                case 14:\n                    _context2.next = 19;\n                    break;\n                case 16:\n                    _context2.prev = 16;\n                    _context2.t0 = _context2[\"catch\"](1);\n                    reader.releaseLock();\n                case 19:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2, null, [\n            [\n                1,\n                16\n            ]\n        ]);\n    }));\n    return _makeBrowserStreamIterator.apply(this, arguments);\n}\nfunction makeNodeStreamIterator(_x3) {\n    return _makeNodeStreamIterator.apply(this, arguments);\n}\nfunction _makeNodeStreamIterator() {\n    _makeNodeStreamIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee3(stream) {\n        var data;\n        return (0, _regeneratorDefault.default).wrap(function _callee3$(_context3) {\n            while(true)switch(_context3.prev = _context3.next){\n                case 0:\n                    _context3.next = 2;\n                    return (0, _awaitAsyncGeneratorDefault.default)(stream);\n                case 2:\n                    stream = _context3.sent;\n                case 3:\n                    data = stream.read();\n                    if (!(data !== null)) {\n                        _context3.next = 9;\n                        break;\n                    }\n                    _context3.next = 8;\n                    return (0, _loaderUtils.toArrayBuffer)(data);\n                case 8:\n                    return _context3.abrupt(\"continue\", 3);\n                case 9:\n                    if (!stream._readableState.ended) {\n                        _context3.next = 11;\n                        break;\n                    }\n                    return _context3.abrupt(\"return\");\n                case 11:\n                    _context3.next = 13;\n                    return (0, _awaitAsyncGeneratorDefault.default)(onceReadable(stream));\n                case 13:\n                    _context3.next = 3;\n                    break;\n                case 15:\n                case \"end\":\n                    return _context3.stop();\n            }\n        }, _callee3);\n    }));\n    return _makeNodeStreamIterator.apply(this, arguments);\n}\nfunction onceReadable(_x4) {\n    return _onceReadable.apply(this, arguments);\n}\nfunction _onceReadable() {\n    _onceReadable = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee4(stream) {\n        return (0, _regeneratorDefault.default).wrap(function _callee4$(_context4) {\n            while(true)switch(_context4.prev = _context4.next){\n                case 0:\n                    return _context4.abrupt(\"return\", new Promise(function(resolve) {\n                        stream.once(\"readable\", resolve);\n                    }));\n                case 1:\n                case \"end\":\n                    return _context4.stop();\n            }\n        }, _callee4);\n    }));\n    return _onceReadable.apply(this, arguments);\n}\n\n},{\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/awaitAsyncGenerator\":\"9cx1k\",\"@babel/runtime/helpers/esm/wrapAsyncGenerator\":\"5b0X7\",\"@babel/runtime/helpers/esm/asyncIterator\":\"g5YXH\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aeYm4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getLoaderContext\", ()=>getLoaderContext);\nparcelHelpers.export(exports, \"getLoaders\", ()=>getLoaders);\nvar _toConsumableArray = require(\"@babel/runtime/helpers/esm/toConsumableArray\");\nvar _toConsumableArrayDefault = parcelHelpers.interopDefault(_toConsumableArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _optionUtils = require(\"./option-utils\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction getLoaderContext(context, options) {\n    var previousContext = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n    if (previousContext) return previousContext;\n    context = _objectSpread({\n        fetch: (0, _optionUtils.getFetchFunction)(options || {}, context)\n    }, context);\n    if (!Array.isArray(context.loaders)) context.loaders = null;\n    return context;\n}\nfunction getLoaders(loaders, context) {\n    if (!context && loaders && !Array.isArray(loaders)) return loaders;\n    var candidateLoaders;\n    if (loaders) candidateLoaders = Array.isArray(loaders) ? loaders : [\n        loaders\n    ];\n    if (context && context.loaders) {\n        var contextLoaders = Array.isArray(context.loaders) ? context.loaders : [\n            context.loaders\n        ];\n        candidateLoaders = candidateLoaders ? [].concat((0, _toConsumableArrayDefault.default)(candidateLoaders), (0, _toConsumableArrayDefault.default)(contextLoaders)) : contextLoaders;\n    }\n    return candidateLoaders && candidateLoaders.length ? candidateLoaders : null;\n}\n\n},{\"@babel/runtime/helpers/esm/toConsumableArray\":\"kNndj\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"./option-utils\":\"lu6r8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kNndj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayWithoutHolesJs = require(\"./arrayWithoutHoles.js\");\nvar _arrayWithoutHolesJsDefault = parcelHelpers.interopDefault(_arrayWithoutHolesJs);\nvar _iterableToArrayJs = require(\"./iterableToArray.js\");\nvar _iterableToArrayJsDefault = parcelHelpers.interopDefault(_iterableToArrayJs);\nvar _unsupportedIterableToArrayJs = require(\"./unsupportedIterableToArray.js\");\nvar _unsupportedIterableToArrayJsDefault = parcelHelpers.interopDefault(_unsupportedIterableToArrayJs);\nvar _nonIterableSpreadJs = require(\"./nonIterableSpread.js\");\nvar _nonIterableSpreadJsDefault = parcelHelpers.interopDefault(_nonIterableSpreadJs);\nfunction _toConsumableArray(arr) {\n    return (0, _arrayWithoutHolesJsDefault.default)(arr) || (0, _iterableToArrayJsDefault.default)(arr) || (0, _unsupportedIterableToArrayJsDefault.default)(arr) || (0, _nonIterableSpreadJsDefault.default)();\n}\nexports.default = _toConsumableArray;\n\n},{\"./arrayWithoutHoles.js\":\"jf3bK\",\"./iterableToArray.js\":\"iqObz\",\"./unsupportedIterableToArray.js\":\"gw7Ev\",\"./nonIterableSpread.js\":\"fugAH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jf3bK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayLikeToArrayJs = require(\"./arrayLikeToArray.js\");\nvar _arrayLikeToArrayJsDefault = parcelHelpers.interopDefault(_arrayLikeToArrayJs);\nfunction _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return (0, _arrayLikeToArrayJsDefault.default)(arr);\n}\nexports.default = _arrayWithoutHoles;\n\n},{\"./arrayLikeToArray.js\":\"7Gbur\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Gbur\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nexports.default = _arrayLikeToArray;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iqObz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nexports.default = _iterableToArray;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gw7Ev\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayLikeToArrayJs = require(\"./arrayLikeToArray.js\");\nvar _arrayLikeToArrayJsDefault = parcelHelpers.interopDefault(_arrayLikeToArrayJs);\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return (0, _arrayLikeToArrayJsDefault.default)(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0, _arrayLikeToArrayJsDefault.default)(o, minLen);\n}\nexports.default = _unsupportedIterableToArray;\n\n},{\"./arrayLikeToArray.js\":\"7Gbur\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fugAH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexports.default = _nonIterableSpread;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bK6pP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"canParseWithWorker\", ()=>canParseWithWorker);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _parse = require(\"../api/parse\");\nvar VERSION = \"2.3.13\";\nfunction canParseWithWorker(loader, data, options, context) {\n    if (!(0, _loaderUtils._WorkerFarm).isSupported()) return false;\n    var loaderOptions = options && options[loader.id];\n    if (options.worker === \"local\" && loaderOptions && loaderOptions.localWorkerUrl || options.worker && loaderOptions && loaderOptions.workerUrl) return loader.useWorker ? loader.useWorker(options) : true;\n    return false;\n}\nfunction parseWithWorker(loader, data, options, context) {\n    var _ref = options || {}, worker = _ref.worker;\n    var loaderOptions = options && options[loader.id] || {};\n    var workerUrl = worker === \"local\" ? loaderOptions.localWorkerUrl : loaderOptions.workerUrl;\n    var workerSource = \"url(\".concat(workerUrl, \")\");\n    var workerName = loader.name;\n    var workerFarm = getWorkerFarm(options);\n    options = JSON.parse(JSON.stringify(options));\n    var warning = loader.version !== VERSION ? \"(core version \".concat(VERSION, \")\") : \"\";\n    return workerFarm.process(workerSource, \"\".concat(workerName, \"-worker@\").concat(loader.version).concat(warning), {\n        arraybuffer: (0, _loaderUtils.toArrayBuffer)(data),\n        options: options,\n        source: \"loaders.gl@\".concat(VERSION),\n        type: \"parse\"\n    });\n}\nexports.default = parseWithWorker;\nvar _workerFarm = null;\nfunction getWorkerFarm() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var props = {};\n    if (options.maxConcurrency) props.maxConcurrency = options.maxConcurrency;\n    if (options.onDebug) props.onDebug = options.onDebug;\n    if (\"reuseWorkers\" in options) props.reuseWorkers = options.reuseWorkers;\n    if (!_workerFarm) _workerFarm = new (0, _loaderUtils._WorkerFarm)({\n        onMessage: onWorkerMessage\n    });\n    _workerFarm.setProps(props);\n    return _workerFarm;\n}\nfunction onWorkerMessage(_x) {\n    return _onWorkerMessage.apply(this, arguments);\n}\nfunction _onWorkerMessage() {\n    _onWorkerMessage = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(_ref2) {\n        var worker, data, resolve, reject, result;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    worker = _ref2.worker, data = _ref2.data, resolve = _ref2.resolve, reject = _ref2.reject;\n                    _context.t0 = data.type;\n                    _context.next = _context.t0 === \"done\" ? 4 : _context.t0 === \"parse\" ? 6 : _context.t0 === \"error\" ? 17 : 19;\n                    break;\n                case 4:\n                    resolve(data.result);\n                    return _context.abrupt(\"break\", 19);\n                case 6:\n                    _context.prev = 6;\n                    _context.next = 9;\n                    return (0, _parse.parse)(data.arraybuffer, data.options, data.url);\n                case 9:\n                    result = _context.sent;\n                    worker.postMessage({\n                        type: \"parse-done\",\n                        id: data.id,\n                        result: result\n                    }, (0, _loaderUtils.getTransferList)(result));\n                    _context.next = 16;\n                    break;\n                case 13:\n                    _context.prev = 13;\n                    _context.t1 = _context[\"catch\"](6);\n                    worker.postMessage({\n                        type: \"parse-error\",\n                        id: data.id,\n                        message: _context.t1.message\n                    });\n                case 16:\n                    return _context.abrupt(\"break\", 19);\n                case 17:\n                    reject(data.message);\n                    return _context.abrupt(\"break\", 19);\n                case 19:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                6,\n                13\n            ]\n        ]);\n    }));\n    return _onWorkerMessage.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"../api/parse\":\"7C096\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g4jKF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"selectLoader\", ()=>selectLoader);\nparcelHelpers.export(exports, \"selectLoaderSync\", ()=>selectLoaderSync);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _toConsumableArray = require(\"@babel/runtime/helpers/esm/toConsumableArray\");\nvar _toConsumableArrayDefault = parcelHelpers.interopDefault(_toConsumableArray);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _normalizeLoader = require(\"../loader-utils/normalize-loader\");\nvar _resourceUtils = require(\"../utils/resource-utils\");\nvar _registerLoaders = require(\"./register-loaders\");\nvar _blobIterator = require(\"../../iterator-utils/make-iterator/blob-iterator\");\nvar _isType = require(\"../../javascript-utils/is-type\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar EXT_PATTERN = /\\.([^.]+)$/;\nfunction selectLoader(_x) {\n    return _selectLoader.apply(this, arguments);\n}\nfunction _selectLoader() {\n    _selectLoader = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(data) {\n        var loaders, options, context, loader, _args = arguments;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    loaders = _args.length > 1 && _args[1] !== undefined ? _args[1] : [];\n                    options = _args.length > 2 && _args[2] !== undefined ? _args[2] : {};\n                    context = _args.length > 3 && _args[3] !== undefined ? _args[3] : {};\n                    loader = selectLoaderSync(data, loaders, _objectSpread(_objectSpread({}, options), {}, {\n                        nothrow: true\n                    }), context);\n                    if (!loader) {\n                        _context.next = 6;\n                        break;\n                    }\n                    return _context.abrupt(\"return\", loader);\n                case 6:\n                    if (!(0, _isType.isBlob)(data)) {\n                        _context.next = 11;\n                        break;\n                    }\n                    _context.next = 9;\n                    return (0, _blobIterator.readFileSlice)(data, 0, 10);\n                case 9:\n                    data = _context.sent;\n                    loader = selectLoaderSync(data, loaders, options, context);\n                case 11:\n                    if (!(!loader && !options.nothrow)) {\n                        _context.next = 13;\n                        break;\n                    }\n                    throw new Error(getNoValidLoaderMessage(data));\n                case 13:\n                    return _context.abrupt(\"return\", loader);\n                case 14:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _selectLoader.apply(this, arguments);\n}\nfunction selectLoaderSync(data) {\n    var loaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var context = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    if (loaders && !Array.isArray(loaders)) return (0, _normalizeLoader.normalizeLoader)(loaders);\n    loaders = [].concat((0, _toConsumableArrayDefault.default)(loaders || []), (0, _toConsumableArrayDefault.default)((0, _registerLoaders.getRegisteredLoaders)()));\n    normalizeLoaders(loaders);\n    var _getResourceUrlAndTyp = (0, _resourceUtils.getResourceUrlAndType)(data), url = _getResourceUrlAndTyp.url, type = _getResourceUrlAndTyp.type;\n    var loader = findLoaderByUrl(loaders, url || context.url);\n    loader = loader || findLoaderByContentType(loaders, type);\n    loader = loader || findLoaderByExamingInitialData(loaders, data);\n    if (!loader && !options.nothrow) throw new Error(getNoValidLoaderMessage(data));\n    return loader;\n}\nfunction getNoValidLoaderMessage(data) {\n    var _getResourceUrlAndTyp2 = (0, _resourceUtils.getResourceUrlAndType)(data), url = _getResourceUrlAndTyp2.url, type = _getResourceUrlAndTyp2.type;\n    var message = \"No valid loader found\";\n    if (data) message += ' data: \"'.concat(getFirstCharacters(data), '\", contentType: \"').concat(type, '\"');\n    if (url) message += \" url: \".concat(url);\n    return message;\n}\nfunction normalizeLoaders(loaders) {\n    var _iterator = _createForOfIteratorHelper(loaders), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var loader = _step.value;\n            (0, _normalizeLoader.normalizeLoader)(loader);\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n}\nfunction findLoaderByUrl(loaders, url) {\n    var match = url && url.match(EXT_PATTERN);\n    var extension = match && match[1];\n    return extension && findLoaderByExtension(loaders, extension);\n}\nfunction findLoaderByExtension(loaders, extension) {\n    extension = extension.toLowerCase();\n    var _iterator2 = _createForOfIteratorHelper(loaders), _step2;\n    try {\n        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n            var loader = _step2.value;\n            var _iterator3 = _createForOfIteratorHelper(loader.extensions), _step3;\n            try {\n                for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                    var loaderExtension = _step3.value;\n                    if (loaderExtension.toLowerCase() === extension) return loader;\n                }\n            } catch (err) {\n                _iterator3.e(err);\n            } finally{\n                _iterator3.f();\n            }\n        }\n    } catch (err) {\n        _iterator2.e(err);\n    } finally{\n        _iterator2.f();\n    }\n    return null;\n}\nfunction findLoaderByContentType(loaders, mimeType) {\n    var _iterator4 = _createForOfIteratorHelper(loaders), _step4;\n    try {\n        for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n            var loader = _step4.value;\n            if (loader.mimeTypes && loader.mimeTypes.includes(mimeType)) return loader;\n            if (mimeType === \"application/x.\".concat(loader.id)) return loader;\n        }\n    } catch (err) {\n        _iterator4.e(err);\n    } finally{\n        _iterator4.f();\n    }\n    return null;\n}\nfunction findLoaderByExamingInitialData(loaders, data) {\n    if (!data) return null;\n    var _iterator5 = _createForOfIteratorHelper(loaders), _step5;\n    try {\n        for(_iterator5.s(); !(_step5 = _iterator5.n()).done;){\n            var loader = _step5.value;\n            if (typeof data === \"string\") {\n                if (testDataAgainstText(data, loader)) return loader;\n            } else if (ArrayBuffer.isView(data)) {\n                if (testDataAgainstBinary(data.buffer, data.byteOffset, loader)) return loader;\n            } else if (data instanceof ArrayBuffer) {\n                var byteOffset = 0;\n                if (testDataAgainstBinary(data, byteOffset, loader)) return loader;\n            }\n        }\n    } catch (err) {\n        _iterator5.e(err);\n    } finally{\n        _iterator5.f();\n    }\n    return null;\n}\nfunction testDataAgainstText(data, loader) {\n    return loader.testText && loader.testText(data);\n}\nfunction testDataAgainstBinary(data, byteOffset, loader) {\n    var tests = Array.isArray(loader.tests) ? loader.tests : [\n        loader.tests\n    ];\n    return tests.some(function(test) {\n        return testBinary(data, byteOffset, loader, test);\n    });\n}\nfunction testBinary(data, byteOffset, loader, test) {\n    if (test instanceof ArrayBuffer) return (0, _loaderUtils.compareArrayBuffers)(test, data, test.byteLength);\n    switch((0, _typeofDefault.default)(test)){\n        case \"function\":\n            return test(data, loader);\n        case \"string\":\n            var magic = getMagicString(data, byteOffset, test.length);\n            return test === magic;\n        default:\n            return false;\n    }\n}\nfunction getFirstCharacters(data) {\n    var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n    if (typeof data === \"string\") return data.slice(0, length);\n    else if (ArrayBuffer.isView(data)) return getMagicString(data.buffer, data.byteOffset, length);\n    else if (data instanceof ArrayBuffer) {\n        var byteOffset = 0;\n        return getMagicString(data, byteOffset, length);\n    }\n    return \"\";\n}\nfunction getMagicString(arrayBuffer, byteOffset, length) {\n    if (arrayBuffer.byteLength < byteOffset + length) return \"\";\n    var dataView = new DataView(arrayBuffer);\n    var magic = \"\";\n    for(var i = 0; i < length; i++)magic += String.fromCharCode(dataView.getUint8(byteOffset + i));\n    return magic;\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@babel/runtime/helpers/esm/toConsumableArray\":\"kNndj\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@loaders.gl/loader-utils\":\"7zeF1\",\"../loader-utils/normalize-loader\":\"g60Fi\",\"../utils/resource-utils\":\"kOsIE\",\"./register-loaders\":\"gGNiE\",\"../../iterator-utils/make-iterator/blob-iterator\":\"37H4I\",\"../../javascript-utils/is-type\":\"ceaCP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g4COe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"load\", ()=>load);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _normalizeLoader = require(\"../loader-utils/normalize-loader\");\nvar _optionUtils = require(\"../loader-utils/option-utils\");\nvar _parse = require(\"./parse\");\nfunction load(_x, _x2, _x3) {\n    return _load.apply(this, arguments);\n}\nfunction _load() {\n    _load = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(url, loaders, options) {\n        var fetch, data;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    if (!Array.isArray(loaders) && !(0, _normalizeLoader.isLoaderObject)(loaders)) {\n                        options = loaders;\n                        loaders = null;\n                    }\n                    fetch = (0, _optionUtils.getFetchFunction)(options || {});\n                    data = url;\n                    if (!(typeof url === \"string\")) {\n                        _context.next = 9;\n                        break;\n                    }\n                    _context.next = 6;\n                    return fetch(url);\n                case 6:\n                    data = _context.sent;\n                    _context.next = 10;\n                    break;\n                case 9:\n                    url = null;\n                case 10:\n                    if (!(0, _isType.isBlob)(url)) {\n                        _context.next = 15;\n                        break;\n                    }\n                    _context.next = 13;\n                    return fetch(url);\n                case 13:\n                    data = _context.sent;\n                    url = null;\n                case 15:\n                    _context.next = 17;\n                    return (0, _parse.parse)(data, loaders, options);\n                case 17:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 18:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _load.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"../../javascript-utils/is-type\":\"ceaCP\",\"../loader-utils/normalize-loader\":\"g60Fi\",\"../loader-utils/option-utils\":\"lu6r8\",\"./parse\":\"7C096\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Br8C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ImageLoader\", ()=>(0, _imageLoaderDefault.default));\nparcelHelpers.export(exports, \"ImageWriter\", ()=>(0, _imageWriterDefault.default));\nparcelHelpers.export(exports, \"getBinaryImageMetadata\", ()=>(0, _binaryImageApi.getBinaryImageMetadata));\nparcelHelpers.export(exports, \"isImageTypeSupported\", ()=>(0, _imageType.isImageTypeSupported));\nparcelHelpers.export(exports, \"getDefaultImageType\", ()=>(0, _imageType.getDefaultImageType));\nparcelHelpers.export(exports, \"isImage\", ()=>(0, _parsedImageApi.isImage));\nparcelHelpers.export(exports, \"getImageType\", ()=>(0, _parsedImageApi.getImageType));\nparcelHelpers.export(exports, \"getImageSize\", ()=>(0, _parsedImageApi.getImageSize));\nparcelHelpers.export(exports, \"getImageData\", ()=>(0, _parsedImageApi.getImageData));\nparcelHelpers.export(exports, \"loadImage\", ()=>(0, _loadImage.loadImage));\nparcelHelpers.export(exports, \"loadImageArray\", ()=>(0, _loadImageArray.loadImageArray));\nparcelHelpers.export(exports, \"loadImageCube\", ()=>(0, _loadImageCube.loadImageCube));\nparcelHelpers.export(exports, \"HTMLImageLoader\", ()=>(0, _imageLoaderDefault.default));\nparcelHelpers.export(exports, \"getSupportedImageType\", ()=>getSupportedImageType);\nparcelHelpers.export(exports, \"isBinaryImage\", ()=>(0, _binaryImageApiDeprecated.isBinaryImage));\nparcelHelpers.export(exports, \"getBinaryImageMIMEType\", ()=>(0, _binaryImageApiDeprecated.getBinaryImageMIMEType));\nparcelHelpers.export(exports, \"getBinaryImageSize\", ()=>(0, _binaryImageApiDeprecated.getBinaryImageSize));\nvar _imageType = require(\"./lib/category-api/image-type\");\nvar _imageLoader = require(\"./image-loader\");\nvar _imageLoaderDefault = parcelHelpers.interopDefault(_imageLoader);\nvar _imageWriter = require(\"./image-writer\");\nvar _imageWriterDefault = parcelHelpers.interopDefault(_imageWriter);\nvar _binaryImageApi = require(\"./lib/category-api/binary-image-api\");\nvar _parsedImageApi = require(\"./lib/category-api/parsed-image-api\");\nvar _loadImage = require(\"./lib/texture-api/load-image\");\nvar _loadImageArray = require(\"./lib/texture-api/load-image-array\");\nvar _loadImageCube = require(\"./lib/texture-api/load-image-cube\");\nvar _binaryImageApiDeprecated = require(\"./lib/deprecated/binary-image-api-deprecated\");\nfunction getSupportedImageType() {\n    var imageType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    return (0, _imageType.getDefaultImageType)();\n}\n\n},{\"./lib/category-api/image-type\":\"ay3xT\",\"./image-loader\":\"a5ODS\",\"./image-writer\":false,\"./lib/category-api/binary-image-api\":\"bHybO\",\"./lib/category-api/parsed-image-api\":\"jFfwr\",\"./lib/texture-api/load-image\":false,\"./lib/texture-api/load-image-array\":false,\"./lib/texture-api/load-image-cube\":false,\"./lib/deprecated/binary-image-api-deprecated\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ay3xT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isImageTypeSupported\", ()=>isImageTypeSupported);\nparcelHelpers.export(exports, \"getDefaultImageType\", ()=>getDefaultImageType);\nvar _globals = require(\"../utils/globals\");\nvar _parseImageNode = (0, _globals.global)._parseImageNode;\nvar IMAGE_SUPPORTED = typeof Image !== \"undefined\";\nvar IMAGE_BITMAP_SUPPORTED = typeof ImageBitmap !== \"undefined\";\nvar NODE_IMAGE_SUPPORTED = Boolean(_parseImageNode);\nvar DATA_SUPPORTED = (0, _globals.isBrowser) ? true : NODE_IMAGE_SUPPORTED;\nfunction isImageTypeSupported(type) {\n    switch(type){\n        case \"auto\":\n            return IMAGE_BITMAP_SUPPORTED || IMAGE_SUPPORTED || DATA_SUPPORTED;\n        case \"imagebitmap\":\n            return IMAGE_BITMAP_SUPPORTED;\n        case \"image\":\n            return IMAGE_SUPPORTED;\n        case \"data\":\n            return DATA_SUPPORTED;\n        case \"html\":\n            return IMAGE_SUPPORTED;\n        case \"ndarray\":\n            return DATA_SUPPORTED;\n        default:\n            throw new Error(\"@loaders.gl/images: image \".concat(type, \" not supported in this environment\"));\n    }\n}\nfunction getDefaultImageType() {\n    if (IMAGE_BITMAP_SUPPORTED) return \"imagebitmap\";\n    if (IMAGE_SUPPORTED) return \"image\";\n    if (DATA_SUPPORTED) return \"data\";\n    throw new Error(\"Install '@loaders.gl/polyfills' to parse images under Node.js\");\n}\n\n},{\"../utils/globals\":\"jsRDa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jsRDa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"self\", ()=>self_);\nparcelHelpers.export(exports, \"window\", ()=>window_);\nparcelHelpers.export(exports, \"global\", ()=>global_);\nparcelHelpers.export(exports, \"document\", ()=>document_);\nparcelHelpers.export(exports, \"isBrowser\", ()=>isBrowser);\nparcelHelpers.export(exports, \"isWorker\", ()=>isWorker);\nparcelHelpers.export(exports, \"nodeVersion\", ()=>nodeVersion);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar process = require(\"process\");\nvar global = arguments[3];\nvar globals = {\n    self: typeof self !== \"undefined\" && self,\n    window: typeof window !== \"undefined\" && window,\n    global: typeof global !== \"undefined\" && global,\n    document: typeof document !== \"undefined\" && document\n};\nvar self_ = globals.self || globals.window || globals.global;\nvar window_ = globals.window || globals.self || globals.global;\nvar global_ = globals.global || globals.self || globals.window;\nvar document_ = globals.document || {};\nvar isBrowser = (typeof process === \"undefined\" ? \"undefined\" : (0, _typeofDefault.default)(process)) !== \"object\" || String(process) !== \"[object process]\" || true;\nvar isWorker = typeof importScripts === \"function\";\nvar matches = typeof process !== \"undefined\" && process.version && process.version.match(/v([0-9]*)/);\nvar nodeVersion = matches && parseFloat(matches[1]) || 0;\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"process\":\"1RiLM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a5ODS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _parseImage = require(\"./lib/parsers/parse-image\");\nvar _parseImageDefault = parcelHelpers.interopDefault(_parseImage);\nvar _binaryImageApi = require(\"./lib/category-api/binary-image-api\");\nvar VERSION = \"2.3.13\";\nvar EXTENSIONS = [\n    \"png\",\n    \"jpg\",\n    \"jpeg\",\n    \"gif\",\n    \"webp\",\n    \"bmp\",\n    \"ico\",\n    \"svg\"\n];\nvar MIME_TYPES = [\n    \"image/png\",\n    \"image/jpeg\",\n    \"image/gif\",\n    \"image/webp\",\n    \"image/bmp\",\n    \"image/vnd.microsoft.icon\",\n    \"image/svg+xml\"\n];\nvar ImageLoader = {\n    id: \"image\",\n    name: \"Images\",\n    version: VERSION,\n    mimeTypes: MIME_TYPES,\n    extensions: EXTENSIONS,\n    parse: (0, _parseImageDefault.default),\n    tests: [\n        function(arrayBuffer) {\n            return Boolean((0, _binaryImageApi.getBinaryImageMetadata)(new DataView(arrayBuffer)));\n        }\n    ],\n    options: {\n        image: {\n            type: \"auto\",\n            decode: true\n        }\n    }\n};\nexports.default = ImageLoader;\n\n},{\"./lib/parsers/parse-image\":\"56M9k\",\"./lib/category-api/binary-image-api\":\"bHybO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"56M9k\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _imageType = require(\"../category-api/image-type\");\nvar _parsedImageApi = require(\"../category-api/parsed-image-api\");\nvar _parseToImage = require(\"./parse-to-image\");\nvar _parseToImageDefault = parcelHelpers.interopDefault(_parseToImage);\nvar _parseToImageBitmap = require(\"./parse-to-image-bitmap\");\nvar _parseToImageBitmapDefault = parcelHelpers.interopDefault(_parseToImageBitmap);\nvar _parseToNodeImage = require(\"./parse-to-node-image\");\nvar _parseToNodeImageDefault = parcelHelpers.interopDefault(_parseToNodeImage);\nfunction parseImage(_x, _x2, _x3) {\n    return _parseImage.apply(this, arguments);\n}\nexports.default = parseImage;\nfunction _parseImage() {\n    _parseImage = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(arrayBuffer, options, context) {\n        var imageOptions, imageType, _ref, url, loadType, image;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    options = options || {};\n                    imageOptions = options.image || {};\n                    imageType = imageOptions.type || \"auto\";\n                    _ref = context || {}, url = _ref.url;\n                    loadType = getLoadableImageType(imageType);\n                    _context.t0 = loadType;\n                    _context.next = _context.t0 === \"imagebitmap\" ? 8 : _context.t0 === \"image\" ? 12 : _context.t0 === \"data\" ? 16 : 20;\n                    break;\n                case 8:\n                    _context.next = 10;\n                    return (0, _parseToImageBitmapDefault.default)(arrayBuffer, options, url);\n                case 10:\n                    image = _context.sent;\n                    return _context.abrupt(\"break\", 21);\n                case 12:\n                    _context.next = 14;\n                    return (0, _parseToImageDefault.default)(arrayBuffer, options, url);\n                case 14:\n                    image = _context.sent;\n                    return _context.abrupt(\"break\", 21);\n                case 16:\n                    _context.next = 18;\n                    return (0, _parseToNodeImageDefault.default)(arrayBuffer, options);\n                case 18:\n                    image = _context.sent;\n                    return _context.abrupt(\"break\", 21);\n                case 20:\n                    (0, _assertDefault.default)(false);\n                case 21:\n                    if (imageType === \"data\") image = (0, _parsedImageApi.getImageData)(image);\n                    return _context.abrupt(\"return\", image);\n                case 23:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _parseImage.apply(this, arguments);\n}\nfunction getLoadableImageType(type) {\n    switch(type){\n        case \"auto\":\n        case \"data\":\n            return (0, _imageType.getDefaultImageType)();\n        default:\n            (0, _imageType.isImageTypeSupported)(type);\n            return type;\n    }\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"../utils/assert\":\"1pknb\",\"../category-api/image-type\":\"ay3xT\",\"../category-api/parsed-image-api\":\"jFfwr\",\"./parse-to-image\":\"5mfTC\",\"./parse-to-image-bitmap\":\"6xIqW\",\"./parse-to-node-image\":\"XYhfV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1pknb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message);\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jFfwr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isImage\", ()=>isImage);\nparcelHelpers.export(exports, \"deleteImage\", ()=>deleteImage);\nparcelHelpers.export(exports, \"getImageType\", ()=>getImageType);\nparcelHelpers.export(exports, \"getImageData\", ()=>getImageData);\nparcelHelpers.export(exports, \"getImageSize\", ()=>getImageData);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction isImage(image) {\n    return Boolean(getImageTypeOrNull(image));\n}\nfunction deleteImage(image) {\n    switch(getImageType(image)){\n        case \"imagebitmap\":\n            image.close();\n            break;\n        default:\n    }\n}\nfunction getImageType(image) {\n    var format = getImageTypeOrNull(image);\n    if (!format) throw new Error(\"Not an image\");\n    return format;\n}\nfunction getImageData(image) {\n    switch(getImageType(image)){\n        case \"data\":\n            return image;\n        case \"image\":\n        case \"imagebitmap\":\n            var canvas = document.createElement(\"canvas\");\n            var context = canvas.getContext(\"2d\");\n            if (context) {\n                canvas.width = image.width;\n                canvas.height = image.height;\n                context.drawImage(image, 0, 0);\n                return context.getImageData(0, 0, image.width, image.height);\n            }\n        default:\n            return (0, _assertDefault.default)(false);\n    }\n}\nfunction getImageTypeOrNull(image) {\n    if (typeof ImageBitmap !== \"undefined\" && image instanceof ImageBitmap) return \"imagebitmap\";\n    if (typeof Image !== \"undefined\" && image instanceof Image) return \"image\";\n    if (image && (0, _typeofDefault.default)(image) === \"object\" && image.data && image.width && image.height) return \"data\";\n    return null;\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"../utils/assert\":\"1pknb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5mfTC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"loadToImage\", ()=>loadToImage);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _svgUtils = require(\"./svg-utils\");\nfunction parseToImage(_x, _x2, _x3) {\n    return _parseToImage.apply(this, arguments);\n}\nexports.default = parseToImage;\nfunction _parseToImage() {\n    _parseToImage = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(arrayBuffer, options, url) {\n        var blobOrDataUrl, URL, objectUrl;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    blobOrDataUrl = (0, _svgUtils.getBlobOrSVGDataUrl)(arrayBuffer, url);\n                    URL = self.URL || self.webkitURL;\n                    objectUrl = typeof blobOrDataUrl !== \"string\" && URL.createObjectURL(blobOrDataUrl);\n                    _context.prev = 3;\n                    _context.next = 6;\n                    return loadToImage(objectUrl || blobOrDataUrl, options);\n                case 6:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 7:\n                    _context.prev = 7;\n                    if (objectUrl) URL.revokeObjectURL(objectUrl);\n                    return _context.finish(7);\n                case 10:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                3,\n                ,\n                7,\n                10\n            ]\n        ]);\n    }));\n    return _parseToImage.apply(this, arguments);\n}\nfunction loadToImage(_x4, _x5) {\n    return _loadToImage.apply(this, arguments);\n}\nfunction _loadToImage() {\n    _loadToImage = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(url, options) {\n        var image;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    image = new Image();\n                    image.src = url;\n                    if (!(options.image && options.image.decode && image.decode)) {\n                        _context2.next = 6;\n                        break;\n                    }\n                    _context2.next = 5;\n                    return image.decode();\n                case 5:\n                    return _context2.abrupt(\"return\", image);\n                case 6:\n                    _context2.next = 8;\n                    return new Promise(function(resolve, reject) {\n                        try {\n                            image.onload = function() {\n                                return resolve(image);\n                            };\n                            image.onerror = function(err) {\n                                return reject(new Error(\"Could not load image \".concat(url, \": \").concat(err)));\n                            };\n                        } catch (error) {\n                            reject(error);\n                        }\n                    });\n                case 8:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 9:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2);\n    }));\n    return _loadToImage.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"./svg-utils\":\"ayAfj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ayAfj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isSVG\", ()=>isSVG);\nparcelHelpers.export(exports, \"getBlobOrSVGDataUrl\", ()=>getBlobOrSVGDataUrl);\nparcelHelpers.export(exports, \"getBlob\", ()=>getBlob);\nvar SVG_DATA_URL_PATTERN = /^data:image\\/svg\\+xml/;\nvar SVG_URL_PATTERN = /\\.svg((\\?|#).*)?$/;\nfunction isSVG(url) {\n    return url && (SVG_DATA_URL_PATTERN.test(url) || SVG_URL_PATTERN.test(url));\n}\nfunction getBlobOrSVGDataUrl(arrayBuffer, url) {\n    if (isSVG(url)) {\n        var textDecoder = new TextDecoder();\n        var xmlText = textDecoder.decode(arrayBuffer);\n        var src = \"data:image/svg+xml;base64,\".concat(btoa(xmlText));\n        return src;\n    }\n    return getBlob(arrayBuffer, url);\n}\nfunction getBlob(arrayBuffer, url) {\n    if (isSVG(url)) throw new Error(\"SVG cannot be parsed directly to imagebitmap\");\n    return new Blob([\n        new Uint8Array(arrayBuffer)\n    ]);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6xIqW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _svgUtils = require(\"./svg-utils\");\nvar _parseToImage = require(\"./parse-to-image\");\nvar _parseToImageDefault = parcelHelpers.interopDefault(_parseToImage);\nvar EMPTY_OBJECT = {};\nvar imagebitmapOptionsSupported = true;\nfunction parseToImageBitmap(_x, _x2, _x3) {\n    return _parseToImageBitmap.apply(this, arguments);\n}\nexports.default = parseToImageBitmap;\nfunction _parseToImageBitmap() {\n    _parseToImageBitmap = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(arrayBuffer, options, url) {\n        var blob, image, imagebitmapOptions;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    if (!(0, _svgUtils.isSVG)(url)) {\n                        _context.next = 7;\n                        break;\n                    }\n                    _context.next = 3;\n                    return (0, _parseToImageDefault.default)(arrayBuffer, options, url);\n                case 3:\n                    image = _context.sent;\n                    blob = image;\n                    _context.next = 8;\n                    break;\n                case 7:\n                    blob = (0, _svgUtils.getBlob)(arrayBuffer, url);\n                case 8:\n                    imagebitmapOptions = options && options.imagebitmap;\n                    _context.next = 11;\n                    return safeCreateImageBitmap(blob, imagebitmapOptions);\n                case 11:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 12:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _parseToImageBitmap.apply(this, arguments);\n}\nfunction safeCreateImageBitmap(_x4) {\n    return _safeCreateImageBitmap.apply(this, arguments);\n}\nfunction _safeCreateImageBitmap() {\n    _safeCreateImageBitmap = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(blob) {\n        var imagebitmapOptions, _args2 = arguments;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    imagebitmapOptions = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : null;\n                    if (isEmptyObject(imagebitmapOptions) || !imagebitmapOptionsSupported) imagebitmapOptions = null;\n                    if (!imagebitmapOptions) {\n                        _context2.next = 13;\n                        break;\n                    }\n                    _context2.prev = 3;\n                    _context2.next = 6;\n                    return createImageBitmap(blob, imagebitmapOptions);\n                case 6:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 9:\n                    _context2.prev = 9;\n                    _context2.t0 = _context2[\"catch\"](3);\n                    console.warn(_context2.t0);\n                    imagebitmapOptionsSupported = false;\n                case 13:\n                    _context2.next = 15;\n                    return createImageBitmap(blob);\n                case 15:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 16:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2, null, [\n            [\n                3,\n                9\n            ]\n        ]);\n    }));\n    return _safeCreateImageBitmap.apply(this, arguments);\n}\nfunction isEmptyObject(object) {\n    for(var key in object || EMPTY_OBJECT)return false;\n    return true;\n}\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"./svg-utils\":\"ayAfj\",\"./parse-to-image\":\"5mfTC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"XYhfV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _globals = require(\"../utils/globals\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _binaryImageApi = require(\"../category-api/binary-image-api\");\nfunction parseToNodeImage(arrayBuffer, options) {\n    var _ref = (0, _binaryImageApi.getBinaryImageMetadata)(arrayBuffer) || {}, mimeType = _ref.mimeType;\n    var _parseImageNode = (0, _globals.global)._parseImageNode;\n    (0, _assertDefault.default)(_parseImageNode);\n    return _parseImageNode(arrayBuffer, mimeType, options);\n}\nexports.default = parseToNodeImage;\n\n},{\"../utils/globals\":\"jsRDa\",\"../utils/assert\":\"1pknb\",\"../category-api/binary-image-api\":\"bHybO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bHybO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getBinaryImageMetadata\", ()=>getBinaryImageMetadata);\nparcelHelpers.export(exports, \"getBmpMetadata\", ()=>getBmpMetadata);\nvar BIG_ENDIAN = false;\nvar LITTLE_ENDIAN = true;\nfunction getBinaryImageMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    return getPngMetadata(dataView) || getJpegMetadata(dataView) || getGifMetadata(dataView) || getBmpMetadata(dataView);\n}\nfunction getPngMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    var isPng = dataView.byteLength >= 24 && dataView.getUint32(0, BIG_ENDIAN) === 0x89504e47;\n    if (!isPng) return null;\n    return {\n        mimeType: \"image/png\",\n        width: dataView.getUint32(16, BIG_ENDIAN),\n        height: dataView.getUint32(20, BIG_ENDIAN)\n    };\n}\nfunction getGifMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    var isGif = dataView.byteLength >= 10 && dataView.getUint32(0, BIG_ENDIAN) === 0x47494638;\n    if (!isGif) return null;\n    return {\n        mimeType: \"image/gif\",\n        width: dataView.getUint16(6, LITTLE_ENDIAN),\n        height: dataView.getUint16(8, LITTLE_ENDIAN)\n    };\n}\nfunction getBmpMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    var isBmp = dataView.byteLength >= 14 && dataView.getUint16(0, BIG_ENDIAN) === 0x424d && dataView.getUint32(2, LITTLE_ENDIAN) === dataView.byteLength;\n    if (!isBmp) return null;\n    return {\n        mimeType: \"image/bmp\",\n        width: dataView.getUint32(18, LITTLE_ENDIAN),\n        height: dataView.getUint32(22, LITTLE_ENDIAN)\n    };\n}\nfunction getJpegMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    var isJpeg = dataView.byteLength >= 3 && dataView.getUint16(0, BIG_ENDIAN) === 0xffd8 && dataView.getUint8(2) === 0xff;\n    if (!isJpeg) return null;\n    var _getJpegMarkers = getJpegMarkers(), tableMarkers = _getJpegMarkers.tableMarkers, sofMarkers = _getJpegMarkers.sofMarkers;\n    var i = 2;\n    while(i + 9 < dataView.byteLength){\n        var marker = dataView.getUint16(i, BIG_ENDIAN);\n        if (sofMarkers.has(marker)) return {\n            mimeType: \"image/jpeg\",\n            height: dataView.getUint16(i + 5, BIG_ENDIAN),\n            width: dataView.getUint16(i + 7, BIG_ENDIAN)\n        };\n        if (!tableMarkers.has(marker)) return null;\n        i += 2;\n        i += dataView.getUint16(i, BIG_ENDIAN);\n    }\n    return null;\n}\nfunction getJpegMarkers() {\n    var tableMarkers = new Set([\n        0xffdb,\n        0xffc4,\n        0xffcc,\n        0xffdd,\n        0xfffe\n    ]);\n    for(var i = 0xffe0; i < 0xfff0; ++i)tableMarkers.add(i);\n    var sofMarkers = new Set([\n        0xffc0,\n        0xffc1,\n        0xffc2,\n        0xffc3,\n        0xffc5,\n        0xffc6,\n        0xffc7,\n        0xffc9,\n        0xffca,\n        0xffcb,\n        0xffcd,\n        0xffce,\n        0xffcf,\n        0xffde\n    ]);\n    return {\n        tableMarkers: tableMarkers,\n        sofMarkers: sofMarkers\n    };\n}\nfunction toDataView(data) {\n    if (data instanceof DataView) return data;\n    if (ArrayBuffer.isView(data)) return new DataView(data.buffer);\n    if (data instanceof ArrayBuffer) return new DataView(data);\n    throw new Error(\"toDataView\");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"btEBf\":[function(require,module,exports) {\n// This file enables: import 'probe.gl/bench'.\n// Note: Must be published using package.json \"files\" field\nmodule.exports = require(\"@probe.gl/env\");\n\n},{\"@probe.gl/env\":\"bX8pm\"}],\"bX8pm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VERSION\", ()=>(0, _globals.VERSION));\nparcelHelpers.export(exports, \"self\", ()=>(0, _globals1.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _globals1.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _globals1.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _globals1.document));\nparcelHelpers.export(exports, \"process\", ()=>(0, _globals1.process));\nparcelHelpers.export(exports, \"console\", ()=>(0, _globals1.console));\nparcelHelpers.export(exports, \"isBrowser\", ()=>(0, _isBrowserDefault.default));\nparcelHelpers.export(exports, \"isBrowserMainThread\", ()=>(0, _isBrowser.isBrowserMainThread));\nparcelHelpers.export(exports, \"getBrowser\", ()=>(0, _getBrowserDefault.default));\nparcelHelpers.export(exports, \"isMobile\", ()=>(0, _getBrowser.isMobile));\nparcelHelpers.export(exports, \"isElectron\", ()=>(0, _isElectronDefault.default));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nvar _globals = require(\"./utils/globals\");\nvar _globals1 = require(\"./lib/globals\");\nvar _isBrowser = require(\"./lib/is-browser\");\nvar _isBrowserDefault = parcelHelpers.interopDefault(_isBrowser);\nvar _getBrowser = require(\"./lib/get-browser\");\nvar _getBrowserDefault = parcelHelpers.interopDefault(_getBrowser);\nvar _isElectron = require(\"./lib/is-electron\");\nvar _isElectronDefault = parcelHelpers.interopDefault(_isElectron);\nvar _assert = require(\"./utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\n\n},{\"./utils/globals\":\"8z5kQ\",\"./lib/globals\":\"89G3N\",\"./lib/is-browser\":\"2r68A\",\"./lib/get-browser\":\"kJAuq\",\"./lib/is-electron\":\"lyuUC\",\"./utils/assert\":\"lyiXl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8z5kQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"self\", ()=>(0, _globals.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _globals.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _globals.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _globals.document));\nparcelHelpers.export(exports, \"process\", ()=>(0, _globals.process));\nparcelHelpers.export(exports, \"console\", ()=>(0, _globals.console));\nparcelHelpers.export(exports, \"VERSION\", ()=>VERSION);\nparcelHelpers.export(exports, \"isBrowser\", ()=>isBrowser);\nvar _isBrowser = require(\"../lib/is-browser\");\nvar _isBrowserDefault = parcelHelpers.interopDefault(_isBrowser);\nvar _globals = require(\"../lib/globals\");\nconst VERSION = typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"untranspiled source\";\nconst isBrowser = (0, _isBrowserDefault.default)();\n\n},{\"../lib/is-browser\":\"2r68A\",\"../lib/globals\":\"89G3N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2r68A\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isBrowserMainThread\", ()=>isBrowserMainThread);\nvar _isElectron = require(\"./is-electron\");\nvar _isElectronDefault = parcelHelpers.interopDefault(_isElectron);\nvar process = require(\"process\");\nfunction isBrowser() {\n    const isNode = typeof process === \"object\" && String(process) === \"[object process]\" && false;\n    return !isNode || (0, _isElectronDefault.default)();\n}\nexports.default = isBrowser;\nfunction isBrowserMainThread() {\n    return isBrowser() && typeof document !== \"undefined\";\n}\n\n},{\"./is-electron\":\"lyuUC\",\"process\":\"1RiLM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lyuUC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar process = require(\"process\");\nfunction isElectron(mockUserAgent) {\n    if (typeof window !== \"undefined\" && typeof window.process === \"object\" && window.process.type === \"renderer\") return true;\n    if (typeof process !== \"undefined\" && typeof process.versions === \"object\" && Boolean(process.versions.electron)) return true;\n    const realUserAgent = typeof navigator === \"object\" && typeof navigator.userAgent === \"string\" && navigator.userAgent;\n    const userAgent = mockUserAgent || realUserAgent;\n    if (userAgent && userAgent.indexOf(\"Electron\") >= 0) return true;\n    return false;\n}\nexports.default = isElectron;\n\n},{\"process\":\"1RiLM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"89G3N\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"self\", ()=>self_);\nparcelHelpers.export(exports, \"window\", ()=>window_);\nparcelHelpers.export(exports, \"global\", ()=>global_);\nparcelHelpers.export(exports, \"document\", ()=>document_);\nparcelHelpers.export(exports, \"process\", ()=>process_);\nparcelHelpers.export(exports, \"console\", ()=>console_);\nvar global = arguments[3];\nvar process = require(\"process\");\nconst globals = {\n    self: typeof self !== \"undefined\" && self,\n    window: typeof window !== \"undefined\" && window,\n    global: typeof global !== \"undefined\" && global,\n    document: typeof document !== \"undefined\" && document,\n    process: typeof process === \"object\" && process\n};\nconst global_ = globalThis;\nconst self_ = globals.self || globals.window || globals.global;\nconst window_ = globals.window || globals.self || globals.global;\nconst document_ = globals.document || {};\nconst process_ = globals.process || {};\nconst console_ = console;\n\n},{\"process\":\"1RiLM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kJAuq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isMobile\", ()=>isMobile);\nvar _isBrowser = require(\"./is-browser\");\nvar _isBrowserDefault = parcelHelpers.interopDefault(_isBrowser);\nvar _isElectron = require(\"./is-electron\");\nvar _isElectronDefault = parcelHelpers.interopDefault(_isElectron);\nconst window = globalThis;\nfunction isMobile() {\n    return typeof window.orientation !== \"undefined\";\n}\nfunction getBrowser(mockUserAgent) {\n    if (!mockUserAgent && !(0, _isBrowserDefault.default)()) return \"Node\";\n    if ((0, _isElectronDefault.default)(mockUserAgent)) return \"Electron\";\n    const navigator_ = typeof navigator !== \"undefined\" ? navigator : {};\n    const userAgent = mockUserAgent || navigator_.userAgent || \"\";\n    if (userAgent.indexOf(\"Edge\") > -1) return \"Edge\";\n    const isMSIE = userAgent.indexOf(\"MSIE \") !== -1;\n    const isTrident = userAgent.indexOf(\"Trident/\") !== -1;\n    if (isMSIE || isTrident) return \"IE\";\n    if (window.chrome) return \"Chrome\";\n    if (window.safari) return \"Safari\";\n    if (window.mozInnerScreenX) return \"Firefox\";\n    return \"Unknown\";\n}\nexports.default = getBrowser;\n\n},{\"./is-browser\":\"2r68A\",\"./is-electron\":\"lyuUC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lyiXl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"Assertion failed\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1biSe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _probeGl = require(\"probe.gl\");\nexports.default = new (0, _probeGl.Log)({\n    id: \"deck\"\n});\n\n},{\"probe.gl\":\"2Bw0B\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2Bw0B\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VERSION\", ()=>(0, _env.VERSION));\nparcelHelpers.export(exports, \"self\", ()=>(0, _env.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _env.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _env.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _env.document));\nparcelHelpers.export(exports, \"process\", ()=>(0, _env.process));\nparcelHelpers.export(exports, \"console\", ()=>(0, _env.console));\nparcelHelpers.export(exports, \"isBrowser\", ()=>(0, _env.isBrowser));\nparcelHelpers.export(exports, \"isBrowserMainThread\", ()=>(0, _env.isBrowserMainThread));\nparcelHelpers.export(exports, \"getBrowser\", ()=>(0, _env.getBrowser));\nparcelHelpers.export(exports, \"isMobile\", ()=>(0, _env.isMobile));\nparcelHelpers.export(exports, \"isElectron\", ()=>(0, _env.isElectron));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _env.assert));\nparcelHelpers.export(exports, \"Log\", ()=>(0, _log.Log));\nparcelHelpers.export(exports, \"COLOR\", ()=>(0, _log.COLOR));\nparcelHelpers.export(exports, \"default\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"addColor\", ()=>(0, _log.addColor));\nparcelHelpers.export(exports, \"leftPad\", ()=>(0, _log.leftPad));\nparcelHelpers.export(exports, \"rightPad\", ()=>(0, _log.rightPad));\nparcelHelpers.export(exports, \"autobind\", ()=>(0, _log.autobind));\nparcelHelpers.export(exports, \"LocalStorage\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"getHiResTimestamp\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"Stats\", ()=>(0, _stats.Stats));\nparcelHelpers.export(exports, \"Stat\", ()=>(0, _stats.Stat));\nvar _env = require(\"@probe.gl/env\");\nvar _log = require(\"@probe.gl/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _stats = require(\"@probe.gl/stats\");\n\n},{\"@probe.gl/env\":\"bX8pm\",\"@probe.gl/log\":\"1vcmB\",\"@probe.gl/stats\":\"9tfFj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1vcmB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Log\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"COLOR\", ()=>(0, _color.COLOR));\nparcelHelpers.export(exports, \"addColor\", ()=>(0, _color.addColor));\nparcelHelpers.export(exports, \"leftPad\", ()=>(0, _formatters.leftPad));\nparcelHelpers.export(exports, \"rightPad\", ()=>(0, _formatters.rightPad));\nparcelHelpers.export(exports, \"autobind\", ()=>(0, _autobind.autobind));\nparcelHelpers.export(exports, \"LocalStorage\", ()=>(0, _localStorageDefault.default));\nparcelHelpers.export(exports, \"getHiResTimestamp\", ()=>(0, _hiResTimestamp.getHiResTimestamp));\nvar _log = require(\"./log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _init = require(\"./init\");\nvar _color = require(\"./utils/color\");\nvar _formatters = require(\"./utils/formatters\");\nvar _autobind = require(\"./utils/autobind\");\nvar _localStorage = require(\"./utils/local-storage\");\nvar _localStorageDefault = parcelHelpers.interopDefault(_localStorage);\nvar _hiResTimestamp = require(\"./utils/hi-res-timestamp\");\nexports.default = new (0, _logDefault.default)({\n    id: \"@probe.gl/log\"\n});\n\n},{\"./log\":\"5IB6D\",\"./init\":\"6lq8O\",\"./utils/color\":\"3xLbR\",\"./utils/formatters\":\"206z7\",\"./utils/autobind\":\"7rU2s\",\"./utils/local-storage\":\"ejFy3\",\"./utils/hi-res-timestamp\":\"hsN39\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5IB6D\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalizeArguments\", ()=>normalizeArguments);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _env = require(\"@probe.gl/env\");\nvar _localStorage = require(\"./utils/local-storage\");\nvar _localStorageDefault = parcelHelpers.interopDefault(_localStorage);\nvar _formatters = require(\"./utils/formatters\");\nvar _color = require(\"./utils/color\");\nvar _autobind = require(\"./utils/autobind\");\nvar _assert = require(\"./utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _hiResTimestamp = require(\"./utils/hi-res-timestamp\");\nconst originalConsole = {\n    debug: (0, _env.isBrowser) ? console.debug || console.log : console.log,\n    log: console.log,\n    info: console.info,\n    warn: console.warn,\n    error: console.error\n};\nconst DEFAULT_SETTINGS = {\n    enabled: true,\n    level: 0\n};\nfunction noop() {}\nconst cache = {};\nconst ONCE = {\n    once: true\n};\nclass Log {\n    constructor(){\n        let { id  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n            id: \"\"\n        };\n        (0, _definePropertyDefault.default)(this, \"id\", void 0);\n        (0, _definePropertyDefault.default)(this, \"VERSION\", (0, _env.VERSION));\n        (0, _definePropertyDefault.default)(this, \"_startTs\", (0, _hiResTimestamp.getHiResTimestamp)());\n        (0, _definePropertyDefault.default)(this, \"_deltaTs\", (0, _hiResTimestamp.getHiResTimestamp)());\n        (0, _definePropertyDefault.default)(this, \"_storage\", void 0);\n        (0, _definePropertyDefault.default)(this, \"userData\", {});\n        (0, _definePropertyDefault.default)(this, \"LOG_THROTTLE_TIMEOUT\", 0);\n        this.id = id;\n        this._storage = new (0, _localStorageDefault.default)(\"__probe-\".concat(this.id, \"__\"), DEFAULT_SETTINGS);\n        this.userData = {};\n        this.timeStamp(\"\".concat(this.id, \" started\"));\n        (0, _autobind.autobind)(this);\n        Object.seal(this);\n    }\n    set level(newLevel) {\n        this.setLevel(newLevel);\n    }\n    get level() {\n        return this.getLevel();\n    }\n    isEnabled() {\n        return this._storage.config.enabled;\n    }\n    getLevel() {\n        return this._storage.config.level;\n    }\n    getTotal() {\n        return Number(((0, _hiResTimestamp.getHiResTimestamp)() - this._startTs).toPrecision(10));\n    }\n    getDelta() {\n        return Number(((0, _hiResTimestamp.getHiResTimestamp)() - this._deltaTs).toPrecision(10));\n    }\n    set priority(newPriority) {\n        this.level = newPriority;\n    }\n    get priority() {\n        return this.level;\n    }\n    getPriority() {\n        return this.level;\n    }\n    enable() {\n        let enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n        this._storage.updateConfiguration({\n            enabled\n        });\n        return this;\n    }\n    setLevel(level) {\n        this._storage.updateConfiguration({\n            level\n        });\n        return this;\n    }\n    get(setting) {\n        return this._storage.config[setting];\n    }\n    set(setting, value) {\n        this._storage.updateConfiguration({\n            [setting]: value\n        });\n    }\n    settings() {\n        if (console.table) console.table(this._storage.config);\n        else console.log(this._storage.config);\n    }\n    assert(condition, message) {\n        (0, _assertDefault.default)(condition, message);\n    }\n    warn(message) {\n        return this._getLogFunction(0, message, originalConsole.warn, arguments, ONCE);\n    }\n    error(message) {\n        return this._getLogFunction(0, message, originalConsole.error, arguments);\n    }\n    deprecated(oldUsage, newUsage) {\n        return this.warn(\"`\".concat(oldUsage, \"` is deprecated and will be removed in a later version. Use `\").concat(newUsage, \"` instead\"));\n    }\n    removed(oldUsage, newUsage) {\n        return this.error(\"`\".concat(oldUsage, \"` has been removed. Use `\").concat(newUsage, \"` instead\"));\n    }\n    probe(logLevel, message) {\n        return this._getLogFunction(logLevel, message, originalConsole.log, arguments, {\n            time: true,\n            once: true\n        });\n    }\n    log(logLevel, message) {\n        return this._getLogFunction(logLevel, message, originalConsole.debug, arguments);\n    }\n    info(logLevel, message) {\n        return this._getLogFunction(logLevel, message, console.info, arguments);\n    }\n    once(logLevel, message) {\n        for(var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++)args[_key - 2] = arguments[_key];\n        return this._getLogFunction(logLevel, message, originalConsole.debug || originalConsole.info, arguments, ONCE);\n    }\n    table(logLevel, table, columns) {\n        if (table) return this._getLogFunction(logLevel, table, console.table || noop, columns && [\n            columns\n        ], {\n            tag: getTableHeader(table)\n        });\n        return noop;\n    }\n    image(_ref) {\n        let { logLevel , priority , image , message =\"\" , scale =1  } = _ref;\n        if (!this._shouldLog(logLevel || priority)) return noop;\n        return (0, _env.isBrowser) ? logImageInBrowser({\n            image,\n            message,\n            scale\n        }) : logImageInNode({\n            image,\n            message,\n            scale\n        });\n    }\n    time(logLevel, message) {\n        return this._getLogFunction(logLevel, message, console.time ? console.time : console.info);\n    }\n    timeEnd(logLevel, message) {\n        return this._getLogFunction(logLevel, message, console.timeEnd ? console.timeEnd : console.info);\n    }\n    timeStamp(logLevel, message) {\n        return this._getLogFunction(logLevel, message, console.timeStamp || noop);\n    }\n    group(logLevel, message) {\n        let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n            collapsed: false\n        };\n        const options = normalizeArguments({\n            logLevel,\n            message,\n            opts\n        });\n        const { collapsed  } = opts;\n        options.method = (collapsed ? console.groupCollapsed : console.group) || console.info;\n        return this._getLogFunction(options);\n    }\n    groupCollapsed(logLevel, message) {\n        let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n        return this.group(logLevel, message, Object.assign({}, opts, {\n            collapsed: true\n        }));\n    }\n    groupEnd(logLevel) {\n        return this._getLogFunction(logLevel, \"\", console.groupEnd || noop);\n    }\n    withGroup(logLevel, message, func) {\n        this.group(logLevel, message)();\n        try {\n            func();\n        } finally{\n            this.groupEnd(logLevel)();\n        }\n    }\n    trace() {\n        if (console.trace) console.trace();\n    }\n    _shouldLog(logLevel) {\n        return this.isEnabled() && this.getLevel() >= normalizeLogLevel(logLevel);\n    }\n    _getLogFunction(logLevel, message, method, args, opts) {\n        if (this._shouldLog(logLevel)) {\n            opts = normalizeArguments({\n                logLevel,\n                message,\n                args,\n                opts\n            });\n            method = method || opts.method;\n            (0, _assertDefault.default)(method);\n            opts.total = this.getTotal();\n            opts.delta = this.getDelta();\n            this._deltaTs = (0, _hiResTimestamp.getHiResTimestamp)();\n            const tag = opts.tag || opts.message;\n            if (opts.once) {\n                if (!cache[tag]) cache[tag] = (0, _hiResTimestamp.getHiResTimestamp)();\n                else return noop;\n            }\n            message = decorateMessage(this.id, opts.message, opts);\n            return method.bind(console, message, ...opts.args);\n        }\n        return noop;\n    }\n}\nexports.default = Log;\n(0, _definePropertyDefault.default)(Log, \"VERSION\", (0, _env.VERSION));\nfunction normalizeLogLevel(logLevel) {\n    if (!logLevel) return 0;\n    let resolvedLevel;\n    switch(typeof logLevel){\n        case \"number\":\n            resolvedLevel = logLevel;\n            break;\n        case \"object\":\n            resolvedLevel = logLevel.logLevel || logLevel.priority || 0;\n            break;\n        default:\n            return 0;\n    }\n    (0, _assertDefault.default)(Number.isFinite(resolvedLevel) && resolvedLevel >= 0);\n    return resolvedLevel;\n}\nfunction normalizeArguments(opts) {\n    const { logLevel , message  } = opts;\n    opts.logLevel = normalizeLogLevel(logLevel);\n    const args = opts.args ? Array.from(opts.args) : [];\n    while(args.length && args.shift() !== message);\n    switch(typeof logLevel){\n        case \"string\":\n        case \"function\":\n            if (message !== undefined) args.unshift(message);\n            opts.message = logLevel;\n            break;\n        case \"object\":\n            Object.assign(opts, logLevel);\n            break;\n        default:\n    }\n    if (typeof opts.message === \"function\") opts.message = opts.message();\n    const messageType = typeof opts.message;\n    (0, _assertDefault.default)(messageType === \"string\" || messageType === \"object\");\n    return Object.assign(opts, {\n        args\n    }, opts.opts);\n}\nfunction decorateMessage(id, message, opts) {\n    if (typeof message === \"string\") {\n        const time = opts.time ? (0, _formatters.leftPad)((0, _formatters.formatTime)(opts.total)) : \"\";\n        message = opts.time ? \"\".concat(id, \": \").concat(time, \"  \").concat(message) : \"\".concat(id, \": \").concat(message);\n        message = (0, _color.addColor)(message, opts.color, opts.background);\n    }\n    return message;\n}\nfunction logImageInNode(_ref2) {\n    let { image , message =\"\" , scale =1  } = _ref2;\n    let asciify = null;\n    try {\n        asciify = module.require(\"asciify-image\");\n    } catch (error) {}\n    if (asciify) return ()=>asciify(image, {\n            fit: \"box\",\n            width: \"\".concat(Math.round(80 * scale), \"%\")\n        }).then((data)=>console.log(data));\n    return noop;\n}\nfunction logImageInBrowser(_ref3) {\n    let { image , message =\"\" , scale =1  } = _ref3;\n    if (typeof image === \"string\") {\n        const img = new Image();\n        img.onload = ()=>{\n            const args = (0, _formatters.formatImage)(img, message, scale);\n            console.log(...args);\n        };\n        img.src = image;\n        return noop;\n    }\n    const element = image.nodeName || \"\";\n    if (element.toLowerCase() === \"img\") {\n        console.log(...(0, _formatters.formatImage)(image, message, scale));\n        return noop;\n    }\n    if (element.toLowerCase() === \"canvas\") {\n        const img = new Image();\n        img.onload = ()=>console.log(...(0, _formatters.formatImage)(img, message, scale));\n        img.src = image.toDataURL();\n        return noop;\n    }\n    return noop;\n}\nfunction getTableHeader(table) {\n    for(const key in table){\n        for(const title in table[key])return title || \"untitled\";\n    }\n    return \"empty\";\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@probe.gl/env\":\"bX8pm\",\"./utils/local-storage\":\"ejFy3\",\"./utils/formatters\":\"206z7\",\"./utils/color\":\"3xLbR\",\"./utils/autobind\":\"7rU2s\",\"./utils/assert\":\"fkZnM\",\"./utils/hi-res-timestamp\":\"hsN39\",\"asciify-image\":\"3ye0p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ejFy3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nfunction getStorage(type) {\n    try {\n        const storage = window[type];\n        const x = \"__storage_test__\";\n        storage.setItem(x, x);\n        storage.removeItem(x);\n        return storage;\n    } catch (e) {\n        return null;\n    }\n}\nclass LocalStorage {\n    constructor(id){\n        let defaultSettings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"sessionStorage\";\n        (0, _definePropertyDefault.default)(this, \"storage\", void 0);\n        (0, _definePropertyDefault.default)(this, \"id\", void 0);\n        (0, _definePropertyDefault.default)(this, \"config\", {});\n        this.storage = getStorage(type);\n        this.id = id;\n        this.config = {};\n        Object.assign(this.config, defaultSettings);\n        this._loadConfiguration();\n    }\n    getConfiguration() {\n        return this.config;\n    }\n    setConfiguration(configuration) {\n        this.config = {};\n        return this.updateConfiguration(configuration);\n    }\n    updateConfiguration(configuration) {\n        Object.assign(this.config, configuration);\n        if (this.storage) {\n            const serialized = JSON.stringify(this.config);\n            this.storage.setItem(this.id, serialized);\n        }\n        return this;\n    }\n    _loadConfiguration() {\n        let configuration = {};\n        if (this.storage) {\n            const serializedConfiguration = this.storage.getItem(this.id);\n            configuration = serializedConfiguration ? JSON.parse(serializedConfiguration) : {};\n        }\n        Object.assign(this.config, configuration);\n        return this;\n    }\n}\nexports.default = LocalStorage;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"206z7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatTime\", ()=>formatTime);\nparcelHelpers.export(exports, \"leftPad\", ()=>leftPad);\nparcelHelpers.export(exports, \"rightPad\", ()=>rightPad);\nparcelHelpers.export(exports, \"formatValue\", ()=>formatValue);\nparcelHelpers.export(exports, \"formatImage\", ()=>formatImage);\nfunction formatTime(ms) {\n    let formatted;\n    if (ms < 10) formatted = \"\".concat(ms.toFixed(2), \"ms\");\n    else if (ms < 100) formatted = \"\".concat(ms.toFixed(1), \"ms\");\n    else if (ms < 1000) formatted = \"\".concat(ms.toFixed(0), \"ms\");\n    else formatted = \"\".concat((ms / 1000).toFixed(2), \"s\");\n    return formatted;\n}\nfunction leftPad(string) {\n    let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8;\n    const padLength = Math.max(length - string.length, 0);\n    return \"\".concat(\" \".repeat(padLength)).concat(string);\n}\nfunction rightPad(string) {\n    let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8;\n    const padLength = Math.max(length - string.length, 0);\n    return \"\".concat(string).concat(\" \".repeat(padLength));\n}\nfunction formatValue(v) {\n    let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    const EPSILON = 1e-16;\n    const { isInteger =false  } = opts;\n    if (Array.isArray(v) || ArrayBuffer.isView(v)) return formatArrayValue(v, opts);\n    if (!Number.isFinite(v)) return String(v);\n    if (Math.abs(v) < EPSILON) return isInteger ? \"0\" : \"0.\";\n    if (isInteger) return v.toFixed(0);\n    if (Math.abs(v) > 100 && Math.abs(v) < 10000) return v.toFixed(0);\n    const string = v.toPrecision(2);\n    const decimal = string.indexOf(\".0\");\n    return decimal === string.length - 2 ? string.slice(0, -1) : string;\n}\nfunction formatArrayValue(v, opts) {\n    const { maxElts =16 , size =1  } = opts;\n    let string = \"[\";\n    for(let i = 0; i < v.length && i < maxElts; ++i){\n        if (i > 0) string += \",\".concat(i % size === 0 ? \" \" : \"\");\n        string += formatValue(v[i], opts);\n    }\n    const terminator = v.length > maxElts ? \"...\" : \"]\";\n    return \"\".concat(string).concat(terminator);\n}\nfunction formatImage(image, message, scale) {\n    let maxWidth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 600;\n    const imageUrl = image.src.replace(/\\(/g, \"%28\").replace(/\\)/g, \"%29\");\n    if (image.width > maxWidth) scale = Math.min(scale, maxWidth / image.width);\n    const width = image.width * scale;\n    const height = image.height * scale;\n    const style = [\n        \"font-size:1px;\",\n        \"padding:\".concat(Math.floor(height / 2), \"px \").concat(Math.floor(width / 2), \"px;\"),\n        \"line-height:\".concat(height, \"px;\"),\n        \"background:url(\".concat(imageUrl, \");\"),\n        \"background-size:\".concat(width, \"px \").concat(height, \"px;\"),\n        \"color:transparent;\"\n    ].join(\"\");\n    return [\n        \"\".concat(message, \" %c+\"),\n        style\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3xLbR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"COLOR\", ()=>COLOR);\nparcelHelpers.export(exports, \"addColor\", ()=>addColor);\nvar _env = require(\"@probe.gl/env\");\nlet COLOR;\n(function(COLOR1) {\n    COLOR1[COLOR1[\"BLACK\"] = 30] = \"BLACK\";\n    COLOR1[COLOR1[\"RED\"] = 31] = \"RED\";\n    COLOR1[COLOR1[\"GREEN\"] = 32] = \"GREEN\";\n    COLOR1[COLOR1[\"YELLOW\"] = 33] = \"YELLOW\";\n    COLOR1[COLOR1[\"BLUE\"] = 34] = \"BLUE\";\n    COLOR1[COLOR1[\"MAGENTA\"] = 35] = \"MAGENTA\";\n    COLOR1[COLOR1[\"CYAN\"] = 36] = \"CYAN\";\n    COLOR1[COLOR1[\"WHITE\"] = 37] = \"WHITE\";\n    COLOR1[COLOR1[\"BRIGHT_BLACK\"] = 90] = \"BRIGHT_BLACK\";\n    COLOR1[COLOR1[\"BRIGHT_RED\"] = 91] = \"BRIGHT_RED\";\n    COLOR1[COLOR1[\"BRIGHT_GREEN\"] = 92] = \"BRIGHT_GREEN\";\n    COLOR1[COLOR1[\"BRIGHT_YELLOW\"] = 93] = \"BRIGHT_YELLOW\";\n    COLOR1[COLOR1[\"BRIGHT_BLUE\"] = 94] = \"BRIGHT_BLUE\";\n    COLOR1[COLOR1[\"BRIGHT_MAGENTA\"] = 95] = \"BRIGHT_MAGENTA\";\n    COLOR1[COLOR1[\"BRIGHT_CYAN\"] = 96] = \"BRIGHT_CYAN\";\n    COLOR1[COLOR1[\"BRIGHT_WHITE\"] = 97] = \"BRIGHT_WHITE\";\n})(COLOR || (COLOR = {}));\nfunction getColor(color) {\n    return typeof color === \"string\" ? COLOR[color.toUpperCase()] || COLOR.WHITE : color;\n}\nfunction addColor(string, color, background) {\n    if (!(0, _env.isBrowser) && typeof string === \"string\") {\n        if (color) {\n            color = getColor(color);\n            string = \"\\x1b[\".concat(color, \"m\").concat(string, \"\\x1b[39m\");\n        }\n        if (background) {\n            color = getColor(background);\n            string = \"\\x1b[\".concat(background + 10, \"m\").concat(string, \"\\x1b[49m\");\n        }\n    }\n    return string;\n}\n\n},{\"@probe.gl/env\":\"bX8pm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7rU2s\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"autobind\", ()=>autobind);\nfunction autobind(obj) {\n    let predefined = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [\n        \"constructor\"\n    ];\n    const proto = Object.getPrototypeOf(obj);\n    const propNames = Object.getOwnPropertyNames(proto);\n    for (const key of propNames){\n        if (typeof obj[key] === \"function\") {\n            if (!predefined.find((name)=>key === name)) obj[key] = obj[key].bind(obj);\n        }\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fkZnM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"Assertion failed\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hsN39\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getHiResTimestamp\", ()=>getHiResTimestamp);\nvar _env = require(\"@probe.gl/env\");\nfunction getHiResTimestamp() {\n    let timestamp;\n    if ((0, _env.isBrowser) && \"performance\" in (0, _env.window)) {\n        var _window$performance, _window$performance$n;\n        timestamp = (0, _env.window) === null || (0, _env.window) === void 0 ? void 0 : (_window$performance = (0, _env.window).performance) === null || _window$performance === void 0 ? void 0 : (_window$performance$n = _window$performance.now) === null || _window$performance$n === void 0 ? void 0 : _window$performance$n.call(_window$performance);\n    } else if (\"hrtime\" in (0, _env.process)) {\n        var _process$hrtime;\n        const timeParts = (0, _env.process) === null || (0, _env.process) === void 0 ? void 0 : (_process$hrtime = (0, _env.process).hrtime) === null || _process$hrtime === void 0 ? void 0 : _process$hrtime.call((0, _env.process));\n        timestamp = timeParts[0] * 1000 + timeParts[1] / 1e6;\n    } else timestamp = Date.now();\n    return timestamp;\n}\n\n},{\"@probe.gl/env\":\"bX8pm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6lq8O\":[function(require,module,exports) {\nglobalThis.probe = {};\n\n},{}],\"hpEQF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"register\", ()=>register);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _loggers = require(\"./loggers\");\nvar loggers = {};\nfunction register(handlers) {\n    loggers = handlers;\n}\nfunction debug(eventType) {\n    if ((0, _logDefault.default).level > 0 && loggers[eventType]) {\n        var _loggers$eventType;\n        (_loggers$eventType = loggers[eventType]).call.apply(_loggers$eventType, arguments);\n    }\n}\nexports.default = debug;\n\n},{\"../utils/log\":\"1biSe\",\"./loggers\":\"4xRLH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4xRLH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getLoggers\", ()=>getLoggers);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar logState = {\n    attributeUpdateMessages: []\n};\nvar LOG_LEVEL_MAJOR_UPDATE = 1;\nvar LOG_LEVEL_MINOR_UPDATE = 2;\nvar LOG_LEVEL_UPDATE_DETAIL = 3;\nvar LOG_LEVEL_INFO = 4;\nvar LOG_LEVEL_DRAW = 2;\nvar getLoggers = function getLoggers(log) {\n    return {\n        \"layer.changeFlag\": function layerChangeFlag(layer, key, flags) {\n            log.log(LOG_LEVEL_UPDATE_DETAIL, \"\".concat(layer.id, \" \").concat(key, \": \"), flags[key])();\n        },\n        \"layer.initialize\": function layerInitialize(layer) {\n            log.log(LOG_LEVEL_MAJOR_UPDATE, \"Initializing \".concat(layer))();\n        },\n        \"layer.update\": function layerUpdate(layer, needsUpdate) {\n            if (needsUpdate) {\n                var flags = layer.getChangeFlags();\n                log.log(LOG_LEVEL_MINOR_UPDATE, \"Updating \".concat(layer, \" because: \").concat(Object.keys(flags).filter(function(key) {\n                    return flags[key];\n                }).join(\", \")))();\n            } else log.log(LOG_LEVEL_INFO, \"\".concat(layer, \" does not need update\"))();\n        },\n        \"layer.matched\": function layerMatched(layer, changed) {\n            if (changed) log.log(LOG_LEVEL_INFO, \"Matched \".concat(layer, \", state transfered\"))();\n        },\n        \"layer.finalize\": function layerFinalize(layer) {\n            log.log(LOG_LEVEL_MAJOR_UPDATE, \"Finalizing \".concat(layer))();\n        },\n        \"compositeLayer.renderLayers\": function compositeLayerRenderLayers(layer, updated, subLayers) {\n            if (updated) log.log(LOG_LEVEL_MINOR_UPDATE, \"Composite layer rendered new subLayers \".concat(layer), subLayers)();\n            else log.log(LOG_LEVEL_INFO, \"Composite layer reused subLayers \".concat(layer), subLayers)();\n        },\n        \"layerManager.setLayers\": function layerManagerSetLayers(layerManager, updated, layers) {\n            if (updated) log.log(LOG_LEVEL_MINOR_UPDATE, \"Updating \".concat(layers.length, \" deck layers\"))();\n        },\n        \"layerManager.activateViewport\": function layerManagerActivateViewport(layerManager, viewport) {\n            log.log(LOG_LEVEL_UPDATE_DETAIL, \"Viewport changed\", viewport)();\n        },\n        \"attributeManager.invalidate\": function attributeManagerInvalidate(attributeManager, trigger, attributeNames) {\n            log.log(LOG_LEVEL_MAJOR_UPDATE, attributeNames ? \"invalidated attributes \".concat(attributeNames, \" (\").concat(trigger, \") for \").concat(attributeManager.id) : \"invalidated all attributes for \".concat(attributeManager.id))();\n        },\n        \"attributeManager.updateStart\": function attributeManagerUpdateStart(attributeManager) {\n            logState.attributeUpdateMessages.length = 0;\n            logState.attributeManagerUpdateStart = Date.now();\n        },\n        \"attributeManager.updateEnd\": function attributeManagerUpdateEnd(attributeManager, numInstances) {\n            var timeMs = Math.round(Date.now() - logState.attributeManagerUpdateStart);\n            log.groupCollapsed(LOG_LEVEL_MINOR_UPDATE, \"Updated attributes for \".concat(numInstances, \" instances in \").concat(attributeManager.id, \" in \").concat(timeMs, \"ms\"))();\n            var _iterator = _createForOfIteratorHelper(logState.attributeUpdateMessages), _step;\n            try {\n                for(_iterator.s(); !(_step = _iterator.n()).done;){\n                    var updateMessage = _step.value;\n                    log.log(LOG_LEVEL_UPDATE_DETAIL, updateMessage)();\n                }\n            } catch (err) {\n                _iterator.e(err);\n            } finally{\n                _iterator.f();\n            }\n            log.groupEnd(LOG_LEVEL_MINOR_UPDATE)();\n        },\n        \"attribute.updateStart\": function attributeUpdateStart(attribute) {\n            logState.attributeUpdateStart = Date.now();\n        },\n        \"attribute.allocate\": function attributeAllocate(attribute, numInstances) {\n            var message = \"\".concat(attribute.id, \" allocated \").concat(numInstances);\n            logState.attributeUpdateMessages.push(message);\n        },\n        \"attribute.updateEnd\": function attributeUpdateEnd(attribute, numInstances) {\n            var timeMs = Math.round(Date.now() - logState.attributeUpdateStart);\n            var message = \"\".concat(attribute.id, \" updated \").concat(numInstances, \" in \").concat(timeMs, \"ms\");\n            logState.attributeUpdateMessages.push(message);\n        },\n        \"deckRenderer.renderLayers\": function deckRendererRenderLayers(deckRenderer, renderStats, opts) {\n            var pass = opts.pass, redrawReason = opts.redrawReason, stats = opts.stats;\n            var _iterator2 = _createForOfIteratorHelper(renderStats), _step2;\n            try {\n                for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                    var status = _step2.value;\n                    var totalCount = status.totalCount, visibleCount = status.visibleCount, compositeCount = status.compositeCount, pickableCount = status.pickableCount;\n                    var primitiveCount = totalCount - compositeCount;\n                    var hiddenCount = primitiveCount - visibleCount;\n                    log.log(LOG_LEVEL_DRAW, \"RENDER #\".concat(deckRenderer.renderCount, \"   \").concat(visibleCount, \" (of \").concat(totalCount, \" layers) to \").concat(pass, \" because \").concat(redrawReason, \"   (\").concat(hiddenCount, \" hidden, \").concat(compositeCount, \" composite \").concat(pickableCount, \" pickable)\"))();\n                    if (stats) stats.get(\"Redraw Layers\").add(visibleCount);\n                }\n            } catch (err) {\n                _iterator2.e(err);\n            } finally{\n                _iterator2.f();\n            }\n        }\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6onqq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction isJSON(text) {\n    var firstChar = text[0];\n    var lastChar = text[text.length - 1];\n    return firstChar === \"{\" && lastChar === \"}\" || firstChar === \"[\" && lastChar === \"]\";\n}\nexports.default = {\n    name: \"JSON\",\n    extensions: [\n        \"json\",\n        \"geojson\"\n    ],\n    mimeTypes: [\n        \"application/json\",\n        \"application/geo+json\"\n    ],\n    testText: isJSON,\n    parseTextSync: JSON.parse\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lFELS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createProgramManager\", ()=>createProgramManager);\nparcelHelpers.export(exports, \"picking\", ()=>(0, _pickingDefault.default));\nparcelHelpers.export(exports, \"project\", ()=>(0, _projectDefault.default));\nparcelHelpers.export(exports, \"project32\", ()=>(0, _project32Default.default));\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>(0, _core.gouraudLighting));\nparcelHelpers.export(exports, \"phongLighting\", ()=>(0, _core.phongLighting));\nparcelHelpers.export(exports, \"shadow\", ()=>(0, _shadowDefault.default));\nvar _core = require(\"@luma.gl/core\");\nvar _geometry = require(\"./misc/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _project = require(\"./project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar _project32 = require(\"./project32/project32\");\nvar _project32Default = parcelHelpers.interopDefault(_project32);\nvar _shadow = require(\"./shadow/shadow\");\nvar _shadowDefault = parcelHelpers.interopDefault(_shadow);\nvar _picking = require(\"./picking/picking\");\nvar _pickingDefault = parcelHelpers.interopDefault(_picking);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar DEFAULT_MODULES = [\n    (0, _geometryDefault.default),\n    (0, _projectDefault.default)\n];\nvar SHADER_HOOKS = [\n    \"vs:DECKGL_FILTER_SIZE(inout vec3 size, VertexGeometry geometry)\",\n    \"vs:DECKGL_FILTER_GL_POSITION(inout vec4 position, VertexGeometry geometry)\",\n    \"vs:DECKGL_FILTER_COLOR(inout vec4 color, VertexGeometry geometry)\",\n    \"fs:DECKGL_FILTER_COLOR(inout vec4 color, FragmentGeometry geometry)\"\n];\nfunction createProgramManager(gl) {\n    var programManager = (0, _core.ProgramManager).getDefaultProgramManager(gl);\n    var _iterator = _createForOfIteratorHelper(DEFAULT_MODULES), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var shaderModule = _step.value;\n            programManager.addDefaultModule(shaderModule);\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    var _iterator2 = _createForOfIteratorHelper(SHADER_HOOKS), _step2;\n    try {\n        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n            var shaderHook = _step2.value;\n            programManager.addShaderHook(shaderHook);\n        }\n    } catch (err1) {\n        _iterator2.e(err1);\n    } finally{\n        _iterator2.f();\n    }\n    return programManager;\n}\n\n},{\"@luma.gl/core\":\"WBJLR\",\"./misc/geometry\":\"i0Nrz\",\"./project/project\":\"6PaDe\",\"./project32/project32\":\"cIIhb\",\"./shadow/shadow\":\"5tBqN\",\"./picking/picking\":\"69ybw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"WBJLR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createGLContext\", ()=>(0, _gltools.createGLContext));\nparcelHelpers.export(exports, \"instrumentGLContext\", ()=>(0, _gltools.instrumentGLContext));\nparcelHelpers.export(exports, \"isWebGL\", ()=>(0, _gltools.isWebGL));\nparcelHelpers.export(exports, \"isWebGL2\", ()=>(0, _gltools.isWebGL2));\nparcelHelpers.export(exports, \"getParameters\", ()=>(0, _gltools.getParameters));\nparcelHelpers.export(exports, \"setParameters\", ()=>(0, _gltools.setParameters));\nparcelHelpers.export(exports, \"withParameters\", ()=>(0, _gltools.withParameters));\nparcelHelpers.export(exports, \"resetParameters\", ()=>(0, _gltools.resetParameters));\nparcelHelpers.export(exports, \"cssToDeviceRatio\", ()=>(0, _gltools.cssToDeviceRatio));\nparcelHelpers.export(exports, \"cssToDevicePixels\", ()=>(0, _gltools.cssToDevicePixels));\nparcelHelpers.export(exports, \"lumaStats\", ()=>(0, _webgl.lumaStats));\nparcelHelpers.export(exports, \"FEATURES\", ()=>(0, _webgl.FEATURES));\nparcelHelpers.export(exports, \"hasFeature\", ()=>(0, _webgl.hasFeature));\nparcelHelpers.export(exports, \"hasFeatures\", ()=>(0, _webgl.hasFeatures));\nparcelHelpers.export(exports, \"Buffer\", ()=>(0, _webgl.Buffer));\nparcelHelpers.export(exports, \"Program\", ()=>(0, _webgl.Program));\nparcelHelpers.export(exports, \"Framebuffer\", ()=>(0, _webgl.Framebuffer));\nparcelHelpers.export(exports, \"Renderbuffer\", ()=>(0, _webgl.Renderbuffer));\nparcelHelpers.export(exports, \"Texture2D\", ()=>(0, _webgl.Texture2D));\nparcelHelpers.export(exports, \"TextureCube\", ()=>(0, _webgl.TextureCube));\nparcelHelpers.export(exports, \"clear\", ()=>(0, _webgl.clear));\nparcelHelpers.export(exports, \"readPixelsToArray\", ()=>(0, _webgl.readPixelsToArray));\nparcelHelpers.export(exports, \"readPixelsToBuffer\", ()=>(0, _webgl.readPixelsToBuffer));\nparcelHelpers.export(exports, \"cloneTextureFrom\", ()=>(0, _webgl.cloneTextureFrom));\nparcelHelpers.export(exports, \"copyToTexture\", ()=>(0, _webgl.copyToTexture));\nparcelHelpers.export(exports, \"Texture3D\", ()=>(0, _webgl.Texture3D));\nparcelHelpers.export(exports, \"TransformFeedback\", ()=>(0, _webgl.TransformFeedback));\nparcelHelpers.export(exports, \"AnimationLoop\", ()=>(0, _engine.AnimationLoop));\nparcelHelpers.export(exports, \"Model\", ()=>(0, _engine.Model));\nparcelHelpers.export(exports, \"Transform\", ()=>(0, _engine.Transform));\nparcelHelpers.export(exports, \"ProgramManager\", ()=>(0, _engine.ProgramManager));\nparcelHelpers.export(exports, \"Timeline\", ()=>(0, _engine.Timeline));\nparcelHelpers.export(exports, \"Geometry\", ()=>(0, _engine.Geometry));\nparcelHelpers.export(exports, \"ClipSpace\", ()=>(0, _engine.ClipSpace));\nparcelHelpers.export(exports, \"ConeGeometry\", ()=>(0, _engine.ConeGeometry));\nparcelHelpers.export(exports, \"CubeGeometry\", ()=>(0, _engine.CubeGeometry));\nparcelHelpers.export(exports, \"CylinderGeometry\", ()=>(0, _engine.CylinderGeometry));\nparcelHelpers.export(exports, \"IcoSphereGeometry\", ()=>(0, _engine.IcoSphereGeometry));\nparcelHelpers.export(exports, \"PlaneGeometry\", ()=>(0, _engine.PlaneGeometry));\nparcelHelpers.export(exports, \"SphereGeometry\", ()=>(0, _engine.SphereGeometry));\nparcelHelpers.export(exports, \"TruncatedConeGeometry\", ()=>(0, _engine.TruncatedConeGeometry));\nparcelHelpers.export(exports, \"normalizeShaderModule\", ()=>(0, _shadertools.normalizeShaderModule));\nparcelHelpers.export(exports, \"fp32\", ()=>(0, _shadertools.fp32));\nparcelHelpers.export(exports, \"fp64\", ()=>(0, _shadertools.fp64));\nparcelHelpers.export(exports, \"project\", ()=>(0, _shadertools.project));\nparcelHelpers.export(exports, \"dirlight\", ()=>(0, _shadertools.dirlight));\nparcelHelpers.export(exports, \"picking\", ()=>(0, _shadertools.picking));\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>(0, _shadertools.gouraudLighting));\nparcelHelpers.export(exports, \"phongLighting\", ()=>(0, _shadertools.phongLighting));\nparcelHelpers.export(exports, \"pbr\", ()=>(0, _shadertools.pbr));\nparcelHelpers.export(exports, \"log\", ()=>(0, _webgl.log));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _webgl.assert));\nparcelHelpers.export(exports, \"uid\", ()=>(0, _webgl.uid));\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _engine = require(\"@luma.gl/engine\");\nvar _shadertools = require(\"@luma.gl/shadertools\");\n\n},{\"@luma.gl/gltools\":\"7HW6a\",\"@luma.gl/webgl\":\"caucX\",\"@luma.gl/engine\":\"l9MS5\",\"@luma.gl/shadertools\":\"8wgxL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7HW6a\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"polyfillContext\", ()=>(0, _polyfillContextDefault.default));\nparcelHelpers.export(exports, \"getParameters\", ()=>(0, _unifiedParameterApi.getParameters));\nparcelHelpers.export(exports, \"setParameters\", ()=>(0, _unifiedParameterApi.setParameters));\nparcelHelpers.export(exports, \"resetParameters\", ()=>(0, _unifiedParameterApi.resetParameters));\nparcelHelpers.export(exports, \"withParameters\", ()=>(0, _unifiedParameterApi.withParameters));\nparcelHelpers.export(exports, \"trackContextState\", ()=>(0, _trackContextStateDefault.default));\nparcelHelpers.export(exports, \"pushContextState\", ()=>(0, _trackContextState.pushContextState));\nparcelHelpers.export(exports, \"popContextState\", ()=>(0, _trackContextState.popContextState));\nparcelHelpers.export(exports, \"createGLContext\", ()=>(0, _context.createGLContext));\nparcelHelpers.export(exports, \"resizeGLContext\", ()=>(0, _context.resizeGLContext));\nparcelHelpers.export(exports, \"instrumentGLContext\", ()=>(0, _context.instrumentGLContext));\nparcelHelpers.export(exports, \"getContextDebugInfo\", ()=>(0, _context.getContextDebugInfo));\nparcelHelpers.export(exports, \"log\", ()=>(0, _utils.log));\nparcelHelpers.export(exports, \"cssToDeviceRatio\", ()=>(0, _utils.cssToDeviceRatio));\nparcelHelpers.export(exports, \"cssToDevicePixels\", ()=>(0, _utils.cssToDevicePixels));\nparcelHelpers.export(exports, \"isWebGL\", ()=>(0, _utils.isWebGL));\nparcelHelpers.export(exports, \"isWebGL2\", ()=>(0, _utils.isWebGL2));\nvar _polyfillContext = require(\"./polyfill/polyfill-context\");\nvar _polyfillContextDefault = parcelHelpers.interopDefault(_polyfillContext);\nvar _unifiedParameterApi = require(\"./state-tracker/unified-parameter-api\");\nvar _trackContextState = require(\"./state-tracker/track-context-state\");\nvar _trackContextStateDefault = parcelHelpers.interopDefault(_trackContextState);\nvar _context = require(\"./context/context\");\nvar _utils = require(\"./utils\");\n\n},{\"./polyfill/polyfill-context\":\"bDd24\",\"./state-tracker/unified-parameter-api\":\"bTlVf\",\"./state-tracker/track-context-state\":\"2SBg9\",\"./context/context\":\"iX9Z3\",\"./utils\":\"fCLDZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bDd24\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _polyfillVertexArrayObject = require(\"./polyfill-vertex-array-object\");\nvar _utils = require(\"../utils\");\nvar _polyfillTable = require(\"./polyfill-table\");\nvar global = arguments[3];\nfunction polyfillContext(gl) {\n    gl.luma = gl.luma || {};\n    if (!gl.luma.polyfilled) {\n        (0, _polyfillVertexArrayObject.polyfillVertexArrayObject)(gl);\n        initializeExtensions(gl);\n        installPolyfills(gl, (0, _polyfillTable.WEBGL2_CONTEXT_POLYFILLS));\n        installOverrides(gl, {\n            target: gl.luma,\n            target2: gl\n        });\n        gl.luma.polyfilled = true;\n    }\n    return gl;\n}\nexports.default = polyfillContext;\nvar global_ = typeof global !== \"undefined\" ? global : window;\nglobal_.polyfillContext = polyfillContext;\nfunction initializeExtensions(gl) {\n    gl.luma.extensions = {};\n    var EXTENSIONS = gl.getSupportedExtensions() || [];\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = EXTENSIONS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var extension = _step.value;\n            gl.luma[extension] = gl.getExtension(extension);\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n}\nfunction installOverrides(gl, _ref) {\n    var target = _ref.target, target2 = _ref.target2;\n    Object.keys((0, _polyfillTable.WEBGL2_CONTEXT_OVERRIDES)).forEach(function(key) {\n        if (typeof (0, _polyfillTable.WEBGL2_CONTEXT_OVERRIDES)[key] === \"function\") {\n            var originalFunc = gl[key] ? gl[key].bind(gl) : function() {};\n            var polyfill = (0, _polyfillTable.WEBGL2_CONTEXT_OVERRIDES)[key].bind(null, gl, originalFunc);\n            target[key] = polyfill;\n            target2[key] = polyfill;\n        }\n    });\n}\nfunction installPolyfills(gl, polyfills) {\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n    try {\n        for(var _iterator2 = Object.getOwnPropertyNames(polyfills)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n            var extension = _step2.value;\n            if (extension !== \"overrides\") polyfillExtension(gl, {\n                extension: extension,\n                target: gl.luma,\n                target2: gl\n            });\n        }\n    } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n        } finally{\n            if (_didIteratorError2) throw _iteratorError2;\n        }\n    }\n}\nfunction polyfillExtension(gl, _ref2) {\n    var extension = _ref2.extension, target = _ref2.target, target2 = _ref2.target2;\n    var defaults = (0, _polyfillTable.WEBGL2_CONTEXT_POLYFILLS)[extension];\n    (0, _utils.assert)(defaults);\n    var _defaults$meta = defaults.meta, meta = _defaults$meta === void 0 ? {} : _defaults$meta;\n    var _meta$suffix = meta.suffix, suffix = _meta$suffix === void 0 ? \"\" : _meta$suffix;\n    var ext = gl.getExtension(extension);\n    var _loop = function _loop() {\n        var key = _Object$keys[_i];\n        var extKey = \"\".concat(key).concat(suffix);\n        var polyfill = null;\n        if (key === \"meta\") ;\n        else if (typeof gl[key] === \"function\") ;\n        else if (ext && typeof ext[extKey] === \"function\") polyfill = function polyfill() {\n            return ext[extKey].apply(ext, arguments);\n        };\n        else if (typeof defaults[key] === \"function\") polyfill = defaults[key].bind(target);\n        if (polyfill) {\n            target[key] = polyfill;\n            target2[key] = polyfill;\n        }\n    };\n    for(var _i = 0, _Object$keys = Object.keys(defaults); _i < _Object$keys.length; _i++)_loop();\n}\n\n},{\"./polyfill-vertex-array-object\":\"3dFTr\",\"../utils\":\"fCLDZ\",\"./polyfill-table\":\"3c1sW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3dFTr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"polyfillVertexArrayObject\", ()=>polyfillVertexArrayObject);\nvar _env = require(\"probe.gl/env\");\nvar glErrorShadow = {};\nfunction error(msg) {\n    if ((0, _env.global).console && (0, _env.global).console.error) (0, _env.global).console.error(msg);\n}\nfunction log(msg) {\n    if ((0, _env.global).console && (0, _env.global).console.log) (0, _env.global).console.log(msg);\n}\nfunction synthesizeGLError(err, opt_msg) {\n    glErrorShadow[err] = true;\n    if (opt_msg !== undefined) error(opt_msg);\n}\nfunction wrapGLError(gl) {\n    var f = gl.getError;\n    gl.getError = function getError() {\n        var err;\n        do {\n            err = f.apply(gl);\n            if (err !== 0) glErrorShadow[err] = true;\n        }while (err !== 0);\n        for(err in glErrorShadow)if (glErrorShadow[err]) {\n            delete glErrorShadow[err];\n            return parseInt(err, 10);\n        }\n        return 0;\n    };\n}\nvar WebGLVertexArrayObjectOES = function WebGLVertexArrayObjectOES1(ext) {\n    var gl = ext.gl;\n    this.ext = ext;\n    this.isAlive = true;\n    this.hasBeenBound = false;\n    this.elementArrayBuffer = null;\n    this.attribs = new Array(ext.maxVertexAttribs);\n    for(var n = 0; n < this.attribs.length; n++){\n        var attrib = new WebGLVertexArrayObjectOES1.VertexAttrib(gl);\n        this.attribs[n] = attrib;\n    }\n    this.maxAttrib = 0;\n};\nWebGLVertexArrayObjectOES.VertexAttrib = function VertexAttrib(gl) {\n    this.enabled = false;\n    this.buffer = null;\n    this.size = 4;\n    this.type = 5126;\n    this.normalized = false;\n    this.stride = 16;\n    this.offset = 0;\n    this.cached = \"\";\n    this.recache();\n};\nWebGLVertexArrayObjectOES.VertexAttrib.prototype.recache = function recache() {\n    this.cached = [\n        this.size,\n        this.type,\n        this.normalized,\n        this.stride,\n        this.offset\n    ].join(\":\");\n};\nvar OESVertexArrayObject = function OESVertexArrayObject(gl) {\n    var self = this;\n    this.gl = gl;\n    wrapGLError(gl);\n    var original = this.original = {\n        getParameter: gl.getParameter,\n        enableVertexAttribArray: gl.enableVertexAttribArray,\n        disableVertexAttribArray: gl.disableVertexAttribArray,\n        bindBuffer: gl.bindBuffer,\n        getVertexAttrib: gl.getVertexAttrib,\n        vertexAttribPointer: gl.vertexAttribPointer\n    };\n    gl.getParameter = function getParameter(pname) {\n        if (pname === self.VERTEX_ARRAY_BINDING_OES) {\n            if (self.currentVertexArrayObject === self.defaultVertexArrayObject) return null;\n            return self.currentVertexArrayObject;\n        }\n        return original.getParameter.apply(this, arguments);\n    };\n    gl.enableVertexAttribArray = function enableVertexAttribArray(index) {\n        var vao = self.currentVertexArrayObject;\n        vao.maxAttrib = Math.max(vao.maxAttrib, index);\n        var attrib = vao.attribs[index];\n        attrib.enabled = true;\n        return original.enableVertexAttribArray.apply(this, arguments);\n    };\n    gl.disableVertexAttribArray = function disableVertexAttribArray(index) {\n        var vao = self.currentVertexArrayObject;\n        vao.maxAttrib = Math.max(vao.maxAttrib, index);\n        var attrib = vao.attribs[index];\n        attrib.enabled = false;\n        return original.disableVertexAttribArray.apply(this, arguments);\n    };\n    gl.bindBuffer = function bindBuffer(target, buffer) {\n        switch(target){\n            case 34962:\n                self.currentArrayBuffer = buffer;\n                break;\n            case 34963:\n                self.currentVertexArrayObject.elementArrayBuffer = buffer;\n                break;\n            default:\n        }\n        return original.bindBuffer.apply(this, arguments);\n    };\n    gl.getVertexAttrib = function getVertexAttrib(index, pname) {\n        var vao = self.currentVertexArrayObject;\n        var attrib = vao.attribs[index];\n        switch(pname){\n            case 34975:\n                return attrib.buffer;\n            case 34338:\n                return attrib.enabled;\n            case 34339:\n                return attrib.size;\n            case 34340:\n                return attrib.stride;\n            case 34341:\n                return attrib.type;\n            case 34922:\n                return attrib.normalized;\n            default:\n                return original.getVertexAttrib.apply(this, arguments);\n        }\n    };\n    gl.vertexAttribPointer = function vertexAttribPointer(indx, size, type, normalized, stride, offset) {\n        var vao = self.currentVertexArrayObject;\n        vao.maxAttrib = Math.max(vao.maxAttrib, indx);\n        var attrib = vao.attribs[indx];\n        attrib.buffer = self.currentArrayBuffer;\n        attrib.size = size;\n        attrib.type = type;\n        attrib.normalized = normalized;\n        attrib.stride = stride;\n        attrib.offset = offset;\n        attrib.recache();\n        return original.vertexAttribPointer.apply(this, arguments);\n    };\n    if (gl.instrumentExtension) gl.instrumentExtension(this, \"OES_vertex_array_object\");\n    if (gl.canvas) gl.canvas.addEventListener(\"webglcontextrestored\", function() {\n        log(\"OESVertexArrayObject emulation library context restored\");\n        self.reset_();\n    }, true);\n    this.reset_();\n};\nOESVertexArrayObject.prototype.VERTEX_ARRAY_BINDING_OES = 0x85b5;\nOESVertexArrayObject.prototype.reset_ = function reset_() {\n    var contextWasLost = this.vertexArrayObjects !== undefined;\n    if (contextWasLost) for(var ii = 0; ii < this.vertexArrayObjects.length; ++ii)this.vertexArrayObjects.isAlive = false;\n    var gl = this.gl;\n    this.maxVertexAttribs = gl.getParameter(34921);\n    this.defaultVertexArrayObject = new WebGLVertexArrayObjectOES(this);\n    this.currentVertexArrayObject = null;\n    this.currentArrayBuffer = null;\n    this.vertexArrayObjects = [\n        this.defaultVertexArrayObject\n    ];\n    this.bindVertexArrayOES(null);\n};\nOESVertexArrayObject.prototype.createVertexArrayOES = function createVertexArrayOES() {\n    var arrayObject = new WebGLVertexArrayObjectOES(this);\n    this.vertexArrayObjects.push(arrayObject);\n    return arrayObject;\n};\nOESVertexArrayObject.prototype.deleteVertexArrayOES = function deleteVertexArrayOES(arrayObject) {\n    arrayObject.isAlive = false;\n    this.vertexArrayObjects.splice(this.vertexArrayObjects.indexOf(arrayObject), 1);\n    if (this.currentVertexArrayObject === arrayObject) this.bindVertexArrayOES(null);\n};\nOESVertexArrayObject.prototype.isVertexArrayOES = function isVertexArrayOES(arrayObject) {\n    if (arrayObject && arrayObject instanceof WebGLVertexArrayObjectOES) {\n        if (arrayObject.hasBeenBound && arrayObject.ext === this) return true;\n    }\n    return false;\n};\nOESVertexArrayObject.prototype.bindVertexArrayOES = function bindVertexArrayOES(arrayObject) {\n    var gl = this.gl;\n    if (arrayObject && !arrayObject.isAlive) {\n        synthesizeGLError(1282, \"bindVertexArrayOES: attempt to bind deleted arrayObject\");\n        return;\n    }\n    var original = this.original;\n    var oldVAO = this.currentVertexArrayObject;\n    this.currentVertexArrayObject = arrayObject || this.defaultVertexArrayObject;\n    this.currentVertexArrayObject.hasBeenBound = true;\n    var newVAO = this.currentVertexArrayObject;\n    if (oldVAO === newVAO) return;\n    if (!oldVAO || newVAO.elementArrayBuffer !== oldVAO.elementArrayBuffer) original.bindBuffer.call(gl, 34963, newVAO.elementArrayBuffer);\n    var currentBinding = this.currentArrayBuffer;\n    var maxAttrib = Math.max(oldVAO ? oldVAO.maxAttrib : 0, newVAO.maxAttrib);\n    for(var n = 0; n <= maxAttrib; n++){\n        var attrib = newVAO.attribs[n];\n        var oldAttrib = oldVAO ? oldVAO.attribs[n] : null;\n        if (!oldVAO || attrib.enabled !== oldAttrib.enabled) {\n            if (attrib.enabled) original.enableVertexAttribArray.call(gl, n);\n            else original.disableVertexAttribArray.call(gl, n);\n        }\n        if (attrib.enabled) {\n            var bufferChanged = false;\n            if (!oldVAO || attrib.buffer !== oldAttrib.buffer) {\n                if (currentBinding !== attrib.buffer) {\n                    original.bindBuffer.call(gl, 34962, attrib.buffer);\n                    currentBinding = attrib.buffer;\n                }\n                bufferChanged = true;\n            }\n            if (bufferChanged || attrib.cached !== oldAttrib.cached) original.vertexAttribPointer.call(gl, n, attrib.size, attrib.type, attrib.normalized, attrib.stride, attrib.offset);\n        }\n    }\n    if (this.currentArrayBuffer !== currentBinding) original.bindBuffer.call(gl, 34962, this.currentArrayBuffer);\n};\nfunction polyfillVertexArrayObject(gl) {\n    if (typeof gl.createVertexArray === \"function\") return;\n    var original_getSupportedExtensions = gl.getSupportedExtensions;\n    gl.getSupportedExtensions = function getSupportedExtensions() {\n        var list = original_getSupportedExtensions.call(this) || [];\n        if (list.indexOf(\"OES_vertex_array_object\") < 0) list.push(\"OES_vertex_array_object\");\n        return list;\n    };\n    var original_getExtension = gl.getExtension;\n    gl.getExtension = function getExtension(name) {\n        var ext = original_getExtension.call(this, name);\n        if (ext) return ext;\n        if (name !== \"OES_vertex_array_object\") return null;\n        if (!gl.__OESVertexArrayObject) this.__OESVertexArrayObject = new OESVertexArrayObject(this);\n        return this.__OESVertexArrayObject;\n    };\n}\n\n},{\"probe.gl/env\":\"btEBf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fCLDZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>(0, _utils.assert));\nparcelHelpers.export(exports, \"deepArrayEqual\", ()=>(0, _utils.deepArrayEqual));\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>(0, _utils.isObjectEmpty));\nparcelHelpers.export(exports, \"cssToDevicePixels\", ()=>(0, _devicePixels.cssToDevicePixels));\nparcelHelpers.export(exports, \"cssToDeviceRatio\", ()=>(0, _devicePixels.cssToDeviceRatio));\nparcelHelpers.export(exports, \"getDevicePixelRatio\", ()=>(0, _devicePixels.getDevicePixelRatio));\nparcelHelpers.export(exports, \"isWebGL\", ()=>(0, _webglChecks.isWebGL));\nparcelHelpers.export(exports, \"isWebGL2\", ()=>(0, _webglChecks.isWebGL2));\nparcelHelpers.export(exports, \"log\", ()=>log);\nvar _probeGl = require(\"probe.gl\");\nvar _utils = require(\"./utils\");\nvar _devicePixels = require(\"./device-pixels\");\nvar _webglChecks = require(\"./webgl-checks\");\nvar log = new (0, _probeGl.Log)({\n    id: \"luma.gl\"\n});\n\n},{\"probe.gl\":\"2Bw0B\",\"./utils\":\"azhv5\",\"./device-pixels\":\"83wjI\",\"./webgl-checks\":\"g6G3D\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"azhv5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>assert);\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>isObjectEmpty);\nparcelHelpers.export(exports, \"deepArrayEqual\", ()=>deepArrayEqual);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"luma.gl: assertion failed.\");\n}\nfunction isObjectEmpty(object) {\n    for(var key in object)return false;\n    return true;\n}\nfunction deepArrayEqual(x, y) {\n    if (x === y) return true;\n    var isArrayX = Array.isArray(x) || ArrayBuffer.isView(x);\n    var isArrayY = Array.isArray(y) || ArrayBuffer.isView(y);\n    if (isArrayX && isArrayY && x.length === y.length) {\n        for(var i = 0; i < x.length; ++i){\n            if (x[i] !== y[i]) return false;\n        }\n        return true;\n    }\n    return false;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"83wjI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cssToDeviceRatio\", ()=>cssToDeviceRatio);\nparcelHelpers.export(exports, \"cssToDevicePixels\", ()=>cssToDevicePixels);\nparcelHelpers.export(exports, \"getDevicePixelRatio\", ()=>getDevicePixelRatio);\nfunction cssToDeviceRatio(gl) {\n    if (gl.canvas && gl.luma) {\n        var clientWidth = gl.luma.canvasSizeInfo.clientWidth;\n        return clientWidth ? gl.drawingBufferWidth / clientWidth : 1;\n    }\n    return 1;\n}\nfunction cssToDevicePixels(gl, cssPixel) {\n    var yInvert = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n    var ratio = cssToDeviceRatio(gl);\n    var width = gl.drawingBufferWidth;\n    var height = gl.drawingBufferHeight;\n    return scalePixels(cssPixel, ratio, width, height, yInvert);\n}\nfunction getDevicePixelRatio(useDevicePixels) {\n    var windowRatio = typeof window === \"undefined\" ? 1 : window.devicePixelRatio || 1;\n    if (Number.isFinite(useDevicePixels)) return useDevicePixels <= 0 ? 1 : useDevicePixels;\n    return useDevicePixels ? windowRatio : 1;\n}\nfunction scalePixels(pixel, ratio, width, height, yInvert) {\n    var x = scaleX(pixel[0], ratio, width);\n    var y = scaleY(pixel[1], ratio, height, yInvert);\n    var t = scaleX(pixel[0] + 1, ratio, width);\n    var xHigh = t === width - 1 ? t : t - 1;\n    t = scaleY(pixel[1] + 1, ratio, height, yInvert);\n    var yHigh;\n    if (yInvert) {\n        t = t === 0 ? t : t + 1;\n        yHigh = y;\n        y = t;\n    } else yHigh = t === height - 1 ? t : t - 1;\n    return {\n        x: x,\n        y: y,\n        width: Math.max(xHigh - x + 1, 1),\n        height: Math.max(yHigh - y + 1, 1)\n    };\n}\nfunction scaleX(x, ratio, width) {\n    var r = Math.min(Math.round(x * ratio), width - 1);\n    return r;\n}\nfunction scaleY(y, ratio, height, yInvert) {\n    return yInvert ? Math.max(0, height - 1 - Math.round(y * ratio)) : Math.min(Math.round(y * ratio), height - 1);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g6G3D\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ERR_CONTEXT\", ()=>ERR_CONTEXT);\nparcelHelpers.export(exports, \"ERR_WEBGL\", ()=>ERR_WEBGL);\nparcelHelpers.export(exports, \"ERR_WEBGL2\", ()=>ERR_WEBGL2);\nparcelHelpers.export(exports, \"isWebGL\", ()=>isWebGL);\nparcelHelpers.export(exports, \"isWebGL2\", ()=>isWebGL2);\nparcelHelpers.export(exports, \"assertWebGLContext\", ()=>assertWebGLContext);\nparcelHelpers.export(exports, \"assertWebGL2Context\", ()=>assertWebGL2Context);\nvar _utils = require(\"./utils\");\nvar ERR_CONTEXT = \"Invalid WebGLRenderingContext\";\nvar ERR_WEBGL = ERR_CONTEXT;\nvar ERR_WEBGL2 = \"Requires WebGL2\";\nfunction isWebGL(gl) {\n    return Boolean(gl && Number.isFinite(gl._version));\n}\nfunction isWebGL2(gl) {\n    return Boolean(gl && gl._version === 2);\n}\nfunction assertWebGLContext(gl) {\n    (0, _utils.assert)(isWebGL(gl), ERR_CONTEXT);\n}\nfunction assertWebGL2Context(gl) {\n    (0, _utils.assert)(isWebGL2(gl), ERR_WEBGL2);\n}\n\n},{\"./utils\":\"azhv5\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3c1sW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"WEBGL2_CONTEXT_POLYFILLS\", ()=>WEBGL2_CONTEXT_POLYFILLS);\nparcelHelpers.export(exports, \"WEBGL2_CONTEXT_OVERRIDES\", ()=>WEBGL2_CONTEXT_OVERRIDES);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nvar _getParameterPolyfill = require(\"./get-parameter-polyfill\");\nvar _WEBGL2_CONTEXT_POLYF;\nvar OES_vertex_array_object = \"OES_vertex_array_object\";\nvar ANGLE_instanced_arrays = \"ANGLE_instanced_arrays\";\nvar WEBGL_draw_buffers = \"WEBGL_draw_buffers\";\nvar EXT_disjoint_timer_query = \"EXT_disjoint_timer_query\";\nvar EXT_texture_filter_anisotropic = \"EXT_texture_filter_anisotropic\";\nvar ERR_VAO_NOT_SUPPORTED = \"VertexArray requires WebGL2 or OES_vertex_array_object extension\";\nfunction getExtensionData(gl, extension) {\n    return {\n        webgl2: (0, _utils.isWebGL2)(gl),\n        ext: gl.getExtension(extension)\n    };\n}\nvar WEBGL2_CONTEXT_POLYFILLS = (_WEBGL2_CONTEXT_POLYF = {}, (0, _definePropertyDefault.default)(_WEBGL2_CONTEXT_POLYF, OES_vertex_array_object, {\n    meta: {\n        suffix: \"OES\"\n    },\n    createVertexArray: function createVertexArray() {\n        (0, _utils.assert)(false, ERR_VAO_NOT_SUPPORTED);\n    },\n    deleteVertexArray: function deleteVertexArray() {},\n    bindVertexArray: function bindVertexArray() {},\n    isVertexArray: function isVertexArray() {\n        return false;\n    }\n}), (0, _definePropertyDefault.default)(_WEBGL2_CONTEXT_POLYF, ANGLE_instanced_arrays, {\n    meta: {\n        suffix: \"ANGLE\"\n    },\n    vertexAttribDivisor: function vertexAttribDivisor(location, divisor) {\n        (0, _utils.assert)(divisor === 0, \"WebGL instanced rendering not supported\");\n    },\n    drawElementsInstanced: function drawElementsInstanced() {},\n    drawArraysInstanced: function drawArraysInstanced() {}\n}), (0, _definePropertyDefault.default)(_WEBGL2_CONTEXT_POLYF, WEBGL_draw_buffers, {\n    meta: {\n        suffix: \"WEBGL\"\n    },\n    drawBuffers: function drawBuffers() {\n        (0, _utils.assert)(false);\n    }\n}), (0, _definePropertyDefault.default)(_WEBGL2_CONTEXT_POLYF, EXT_disjoint_timer_query, {\n    meta: {\n        suffix: \"EXT\"\n    },\n    createQuery: function createQuery() {\n        (0, _utils.assert)(false);\n    },\n    deleteQuery: function deleteQuery() {\n        (0, _utils.assert)(false);\n    },\n    beginQuery: function beginQuery() {\n        (0, _utils.assert)(false);\n    },\n    endQuery: function endQuery() {},\n    getQuery: function getQuery(handle, pname) {\n        return this.getQueryObject(handle, pname);\n    },\n    getQueryParameter: function getQueryParameter(handle, pname) {\n        return this.getQueryObject(handle, pname);\n    },\n    getQueryObject: function getQueryObject() {}\n}), _WEBGL2_CONTEXT_POLYF);\nvar WEBGL2_CONTEXT_OVERRIDES = {\n    readBuffer: function readBuffer(gl, originalFunc, attachment) {\n        if ((0, _utils.isWebGL2)(gl)) originalFunc(attachment);\n    },\n    getVertexAttrib: function getVertexAttrib(gl, originalFunc, location, pname) {\n        var _getExtensionData = getExtensionData(gl, ANGLE_instanced_arrays), webgl2 = _getExtensionData.webgl2, ext = _getExtensionData.ext;\n        var result;\n        switch(pname){\n            case 35069:\n                result = !webgl2 ? false : undefined;\n                break;\n            case 35070:\n                result = !webgl2 && !ext ? 0 : undefined;\n                break;\n            default:\n        }\n        return result !== undefined ? result : originalFunc(location, pname);\n    },\n    getProgramParameter: function getProgramParameter(gl, originalFunc, program, pname) {\n        if (!(0, _utils.isWebGL2)(gl)) switch(pname){\n            case 35967:\n                return 35981;\n            case 35971:\n                return 0;\n            case 35382:\n                return 0;\n            default:\n        }\n        return originalFunc(program, pname);\n    },\n    getInternalformatParameter: function getInternalformatParameter(gl, originalFunc, target, format, pname) {\n        if (!(0, _utils.isWebGL2)(gl)) switch(pname){\n            case 32937:\n                return new Int32Array([\n                    0\n                ]);\n            default:\n        }\n        return gl.getInternalformatParameter(target, format, pname);\n    },\n    getTexParameter: function getTexParameter(gl, originalFunc, target, pname) {\n        switch(pname){\n            case 34046:\n                var extensions = gl.luma.extensions;\n                var ext = extensions[EXT_texture_filter_anisotropic];\n                pname = ext && ext.TEXTURE_MAX_ANISOTROPY_EXT || 34046;\n                break;\n            default:\n        }\n        return originalFunc(target, pname);\n    },\n    getParameter: (0, _getParameterPolyfill.getParameterPolyfill),\n    hint: function hint(gl, originalFunc, pname, value) {\n        return originalFunc(pname, value);\n    }\n};\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../utils\":\"fCLDZ\",\"./get-parameter-polyfill\":\"knaZv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"knaZv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getParameterPolyfill\", ()=>getParameterPolyfill);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nvar _WEBGL_PARAMETERS;\nvar OES_element_index = \"OES_element_index\";\nvar WEBGL_draw_buffers = \"WEBGL_draw_buffers\";\nvar EXT_disjoint_timer_query = \"EXT_disjoint_timer_query\";\nvar EXT_disjoint_timer_query_webgl2 = \"EXT_disjoint_timer_query_webgl2\";\nvar EXT_texture_filter_anisotropic = \"EXT_texture_filter_anisotropic\";\nvar WEBGL_debug_renderer_info = \"WEBGL_debug_renderer_info\";\nvar GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8b8b;\nvar GL_DONT_CARE = 0x1100;\nvar GL_GPU_DISJOINT_EXT = 0x8fbb;\nvar GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84ff;\nvar GL_UNMASKED_VENDOR_WEBGL = 0x9245;\nvar GL_UNMASKED_RENDERER_WEBGL = 0x9246;\nvar getWebGL2ValueOrZero = function getWebGL2ValueOrZero(gl) {\n    return !(0, _utils.isWebGL2)(gl) ? 0 : undefined;\n};\nvar WEBGL_PARAMETERS = (_WEBGL_PARAMETERS = {}, (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 3074, function(gl) {\n    return !(0, _utils.isWebGL2)(gl) ? 36064 : undefined;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_FRAGMENT_SHADER_DERIVATIVE_HINT, function(gl) {\n    return !(0, _utils.isWebGL2)(gl) ? GL_DONT_CARE : undefined;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35977, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 32937, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_GPU_DISJOINT_EXT, function(gl, getParameter) {\n    var ext = (0, _utils.isWebGL2)(gl) ? gl.getExtension(EXT_disjoint_timer_query_webgl2) : gl.getExtension(EXT_disjoint_timer_query);\n    return ext && ext.GPU_DISJOINT_EXT ? getParameter(ext.GPU_DISJOINT_EXT) : 0;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_UNMASKED_VENDOR_WEBGL, function(gl, getParameter) {\n    var ext = gl.getExtension(WEBGL_debug_renderer_info);\n    return getParameter(ext && ext.UNMASKED_VENDOR_WEBGL || 7936);\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_UNMASKED_RENDERER_WEBGL, function(gl, getParameter) {\n    var ext = gl.getExtension(WEBGL_debug_renderer_info);\n    return getParameter(ext && ext.UNMASKED_RENDERER_WEBGL || 7937);\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, function(gl, getParameter) {\n    var ext = gl.luma.extensions[EXT_texture_filter_anisotropic];\n    return ext ? getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1.0;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 32883, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35071, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 37447, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 36063, function(gl, getParameter) {\n    if (!(0, _utils.isWebGL2)(gl)) {\n        var ext = gl.getExtension(WEBGL_draw_buffers);\n        return ext ? getParameter(ext.MAX_COLOR_ATTACHMENTS_WEBGL) : 0;\n    }\n    return undefined;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35379, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35374, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35377, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 34852, function(gl) {\n    if (!(0, _utils.isWebGL2)(gl)) {\n        var ext = gl.getExtension(WEBGL_draw_buffers);\n        return ext ? ext.MAX_DRAW_BUFFERS_WEBGL : 0;\n    }\n    return undefined;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 36203, function(gl) {\n    return gl.getExtension(OES_element_index) ? 2147483647 : 65535;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 33001, function(gl) {\n    return gl.getExtension(OES_element_index) ? 16777216 : 65535;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 33000, function(gl) {\n    return 16777216;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 37157, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35373, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35657, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 36183, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 37137, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 34045, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35978, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35979, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35968, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35376, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35375, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35659, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 37154, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35371, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35658, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35076, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35077, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35380, getWebGL2ValueOrZero), _WEBGL_PARAMETERS);\nfunction getParameterPolyfill(gl, originalGetParameter, pname) {\n    var limit = WEBGL_PARAMETERS[pname];\n    var value = typeof limit === \"function\" ? limit(gl, originalGetParameter, pname) : limit;\n    var result = value !== undefined ? value : originalGetParameter(pname);\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../utils\":\"fCLDZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bTlVf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setParameters\", ()=>setParameters);\nparcelHelpers.export(exports, \"getParameters\", ()=>getParameters);\nparcelHelpers.export(exports, \"resetParameters\", ()=>resetParameters);\nparcelHelpers.export(exports, \"withParameters\", ()=>withParameters);\nvar _webglParameterTables = require(\"./webgl-parameter-tables\");\nvar _trackContextState = require(\"./track-context-state\");\nvar _utils = require(\"../utils\");\nfunction setParameters(gl, values) {\n    (0, _utils.assert)((0, _utils.isWebGL)(gl), \"setParameters requires a WebGL context\");\n    if ((0, _utils.isObjectEmpty)(values)) return;\n    var compositeSetters = {};\n    for(var key in values){\n        var glConstant = Number(key);\n        var setter = (0, _webglParameterTables.GL_PARAMETER_SETTERS)[key];\n        if (setter) {\n            if (typeof setter === \"string\") compositeSetters[setter] = true;\n            else setter(gl, values[key], glConstant);\n        }\n    }\n    var cache = gl.state && gl.state.cache;\n    if (cache) for(var _key in compositeSetters){\n        var compositeSetter = (0, _webglParameterTables.GL_COMPOSITE_PARAMETER_SETTERS)[_key];\n        compositeSetter(gl, values, cache);\n    }\n}\nfunction getParameters(gl, parameters) {\n    parameters = parameters || (0, _webglParameterTables.GL_PARAMETER_DEFAULTS);\n    if (typeof parameters === \"number\") {\n        var key = parameters;\n        var getter = (0, _webglParameterTables.GL_PARAMETER_GETTERS)[key];\n        return getter ? getter(gl, key) : gl.getParameter(key);\n    }\n    var parameterKeys = Array.isArray(parameters) ? parameters : Object.keys(parameters);\n    var state = {};\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = parameterKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var _key2 = _step.value;\n            var _getter = (0, _webglParameterTables.GL_PARAMETER_GETTERS)[_key2];\n            state[_key2] = _getter ? _getter(gl, Number(_key2)) : gl.getParameter(Number(_key2));\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    return state;\n}\nfunction resetParameters(gl) {\n    setParameters(gl, (0, _webglParameterTables.GL_PARAMETER_DEFAULTS));\n}\nfunction withParameters(gl, parameters, func) {\n    if ((0, _utils.isObjectEmpty)(parameters)) return func(gl);\n    var _parameters$nocatch = parameters.nocatch, nocatch = _parameters$nocatch === void 0 ? true : _parameters$nocatch;\n    (0, _trackContextState.pushContextState)(gl);\n    setParameters(gl, parameters);\n    var value;\n    if (nocatch) {\n        value = func(gl);\n        (0, _trackContextState.popContextState)(gl);\n    } else try {\n        value = func(gl);\n    } finally{\n        (0, _trackContextState.popContextState)(gl);\n    }\n    return value;\n}\n\n},{\"./webgl-parameter-tables\":\"j7AGW\",\"./track-context-state\":\"2SBg9\",\"../utils\":\"fCLDZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j7AGW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"GL_PARAMETER_DEFAULTS\", ()=>GL_PARAMETER_DEFAULTS);\nparcelHelpers.export(exports, \"GL_PARAMETER_SETTERS\", ()=>GL_PARAMETER_SETTERS);\nparcelHelpers.export(exports, \"GL_COMPOSITE_PARAMETER_SETTERS\", ()=>GL_COMPOSITE_PARAMETER_SETTERS);\nparcelHelpers.export(exports, \"GL_HOOKED_SETTERS\", ()=>GL_HOOKED_SETTERS);\nparcelHelpers.export(exports, \"GL_PARAMETER_GETTERS\", ()=>GL_PARAMETER_GETTERS);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _toConsumableArray = require(\"@babel/runtime/helpers/esm/toConsumableArray\");\nvar _toConsumableArrayDefault = parcelHelpers.interopDefault(_toConsumableArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nvar _GL_PARAMETER_DEFAULT, _GL_PARAMETER_SETTERS, _GL_PARAMETER_GETTERS;\nvar GL_PARAMETER_DEFAULTS = (_GL_PARAMETER_DEFAULT = {}, (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3042, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32773, new Float32Array([\n    0,\n    0,\n    0,\n    0\n])), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32777, 32774), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34877, 32774), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32969, 1), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32968, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32971, 1), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32970, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3106, new Float32Array([\n    0,\n    0,\n    0,\n    0\n])), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3107, [\n    true,\n    true,\n    true,\n    true\n]), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2884, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2885, 1029), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2929, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2931, 1), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2932, 513), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2928, new Float32Array([\n    0,\n    1\n])), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2930, true), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3024, true), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36006, null), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2886, 2305), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 33170, 4352), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2849, 1), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32823, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32824, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 10752, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32938, 1.0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32939, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3089, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3088, new Int32Array([\n    0,\n    0,\n    1024,\n    1024\n])), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2960, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2961, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2968, 0xffffffff), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36005, 0xffffffff), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2962, 519), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2967, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2963, 0xffffffff), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34816, 519), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36003, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36004, 0xffffffff), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2964, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2965, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2966, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34817, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34818, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34819, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2978, [\n    0,\n    0,\n    1024,\n    1024\n]), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3333, 4), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3317, 4), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 37440, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 37441, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 37443, 37444), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 35723, 4352), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36010, null), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 35977, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3330, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3332, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3331, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3314, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32878, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3316, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3315, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32877, 0), _GL_PARAMETER_DEFAULT);\nvar enable = function enable(gl, value, key) {\n    return value ? gl.enable(key) : gl.disable(key);\n};\nvar hint = function hint(gl, value, key) {\n    return gl.hint(key, value);\n};\nvar pixelStorei = function pixelStorei(gl, value, key) {\n    return gl.pixelStorei(key, value);\n};\nvar drawFramebuffer = function drawFramebuffer(gl, value) {\n    var target = (0, _utils.isWebGL2)(gl) ? 36009 : 36160;\n    return gl.bindFramebuffer(target, value);\n};\nvar readFramebuffer = function readFramebuffer(gl, value) {\n    return gl.bindFramebuffer(36008, value);\n};\nfunction isArray(array) {\n    return Array.isArray(array) || ArrayBuffer.isView(array);\n}\nvar GL_PARAMETER_SETTERS = (_GL_PARAMETER_SETTERS = {}, (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3042, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32773, function(gl, value) {\n    return gl.blendColor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32777, \"blendEquation\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34877, \"blendEquation\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32969, \"blendFunc\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32968, \"blendFunc\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32971, \"blendFunc\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32970, \"blendFunc\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3106, function(gl, value) {\n    return gl.clearColor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3107, function(gl, value) {\n    return gl.colorMask.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2884, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2885, function(gl, value) {\n    return gl.cullFace(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2929, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2931, function(gl, value) {\n    return gl.clearDepth(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2932, function(gl, value) {\n    return gl.depthFunc(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2928, function(gl, value) {\n    return gl.depthRange.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2930, function(gl, value) {\n    return gl.depthMask(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3024, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 35723, hint), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36006, drawFramebuffer), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2886, function(gl, value) {\n    return gl.frontFace(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 33170, hint), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2849, function(gl, value) {\n    return gl.lineWidth(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32823, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32824, \"polygonOffset\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 10752, \"polygonOffset\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 35977, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32938, \"sampleCoverage\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32939, \"sampleCoverage\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3089, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3088, function(gl, value) {\n    return gl.scissor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2960, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2961, function(gl, value) {\n    return gl.clearStencil(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2968, function(gl, value) {\n    return gl.stencilMaskSeparate(1028, value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36005, function(gl, value) {\n    return gl.stencilMaskSeparate(1029, value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2962, \"stencilFuncFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2967, \"stencilFuncFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2963, \"stencilFuncFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34816, \"stencilFuncBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36003, \"stencilFuncBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36004, \"stencilFuncBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2964, \"stencilOpFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2965, \"stencilOpFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2966, \"stencilOpFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34817, \"stencilOpBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34818, \"stencilOpBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34819, \"stencilOpBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2978, function(gl, value) {\n    return gl.viewport.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3333, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3317, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 37440, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 37441, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 37443, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3330, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3332, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3331, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36010, readFramebuffer), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3314, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32878, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3316, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3315, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32877, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"framebuffer\", function framebuffer(gl, _framebuffer) {\n    var handle = _framebuffer && \"handle\" in _framebuffer ? _framebuffer.handle : _framebuffer;\n    return gl.bindFramebuffer(36160, handle);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"blend\", function blend(gl, value) {\n    return value ? gl.enable(3042) : gl.disable(3042);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"blendColor\", function blendColor(gl, value) {\n    return gl.blendColor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"blendEquation\", function blendEquation(gl, args) {\n    args = isArray(args) ? args : [\n        args,\n        args\n    ];\n    gl.blendEquationSeparate.apply(gl, (0, _toConsumableArrayDefault.default)(args));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"blendFunc\", function blendFunc(gl, args) {\n    args = isArray(args) && args.length === 2 ? [].concat((0, _toConsumableArrayDefault.default)(args), (0, _toConsumableArrayDefault.default)(args)) : args;\n    gl.blendFuncSeparate.apply(gl, (0, _toConsumableArrayDefault.default)(args));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"clearColor\", function clearColor(gl, value) {\n    return gl.clearColor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"clearDepth\", function clearDepth(gl, value) {\n    return gl.clearDepth(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"clearStencil\", function clearStencil(gl, value) {\n    return gl.clearStencil(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"colorMask\", function colorMask(gl, value) {\n    return gl.colorMask.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"cull\", function cull(gl, value) {\n    return value ? gl.enable(2884) : gl.disable(2884);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"cullFace\", function cullFace(gl, value) {\n    return gl.cullFace(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"depthTest\", function depthTest(gl, value) {\n    return value ? gl.enable(2929) : gl.disable(2929);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"depthFunc\", function depthFunc(gl, value) {\n    return gl.depthFunc(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"depthMask\", function depthMask(gl, value) {\n    return gl.depthMask(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"depthRange\", function depthRange(gl, value) {\n    return gl.depthRange.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"dither\", function dither(gl, value) {\n    return value ? gl.enable(3024) : gl.disable(3024);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"derivativeHint\", function derivativeHint(gl, value) {\n    gl.hint(35723, value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"frontFace\", function frontFace(gl, value) {\n    return gl.frontFace(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"mipmapHint\", function mipmapHint(gl, value) {\n    return gl.hint(33170, value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"lineWidth\", function lineWidth(gl, value) {\n    return gl.lineWidth(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"polygonOffsetFill\", function polygonOffsetFill(gl, value) {\n    return value ? gl.enable(32823) : gl.disable(32823);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"polygonOffset\", function polygonOffset(gl, value) {\n    return gl.polygonOffset.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"sampleCoverage\", function sampleCoverage(gl, value) {\n    return gl.sampleCoverage.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"scissorTest\", function scissorTest(gl, value) {\n    return value ? gl.enable(3089) : gl.disable(3089);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"scissor\", function scissor(gl, value) {\n    return gl.scissor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"stencilTest\", function stencilTest(gl, value) {\n    return value ? gl.enable(2960) : gl.disable(2960);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"stencilMask\", function stencilMask(gl, value) {\n    value = isArray(value) ? value : [\n        value,\n        value\n    ];\n    var _value = value, _value2 = (0, _slicedToArrayDefault.default)(_value, 2), mask = _value2[0], backMask = _value2[1];\n    gl.stencilMaskSeparate(1028, mask);\n    gl.stencilMaskSeparate(1029, backMask);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"stencilFunc\", function stencilFunc(gl, args) {\n    args = isArray(args) && args.length === 3 ? [].concat((0, _toConsumableArrayDefault.default)(args), (0, _toConsumableArrayDefault.default)(args)) : args;\n    var _args = args, _args2 = (0, _slicedToArrayDefault.default)(_args, 6), func = _args2[0], ref = _args2[1], mask = _args2[2], backFunc = _args2[3], backRef = _args2[4], backMask = _args2[5];\n    gl.stencilFuncSeparate(1028, func, ref, mask);\n    gl.stencilFuncSeparate(1029, backFunc, backRef, backMask);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"stencilOp\", function stencilOp(gl, args) {\n    args = isArray(args) && args.length === 3 ? [].concat((0, _toConsumableArrayDefault.default)(args), (0, _toConsumableArrayDefault.default)(args)) : args;\n    var _args3 = args, _args4 = (0, _slicedToArrayDefault.default)(_args3, 6), sfail = _args4[0], dpfail = _args4[1], dppass = _args4[2], backSfail = _args4[3], backDpfail = _args4[4], backDppass = _args4[5];\n    gl.stencilOpSeparate(1028, sfail, dpfail, dppass);\n    gl.stencilOpSeparate(1029, backSfail, backDpfail, backDppass);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"viewport\", function viewport(gl, value) {\n    return gl.viewport.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), _GL_PARAMETER_SETTERS);\nfunction getValue(glEnum, values, cache) {\n    return values[glEnum] !== undefined ? values[glEnum] : cache[glEnum];\n}\nvar GL_COMPOSITE_PARAMETER_SETTERS = {\n    blendEquation: function blendEquation(gl, values, cache) {\n        return gl.blendEquationSeparate(getValue(32777, values, cache), getValue(34877, values, cache));\n    },\n    blendFunc: function blendFunc(gl, values, cache) {\n        return gl.blendFuncSeparate(getValue(32969, values, cache), getValue(32968, values, cache), getValue(32971, values, cache), getValue(32970, values, cache));\n    },\n    polygonOffset: function polygonOffset(gl, values, cache) {\n        return gl.polygonOffset(getValue(32824, values, cache), getValue(10752, values, cache));\n    },\n    sampleCoverage: function sampleCoverage(gl, values, cache) {\n        return gl.sampleCoverage(getValue(32938, values, cache), getValue(32939, values, cache));\n    },\n    stencilFuncFront: function stencilFuncFront(gl, values, cache) {\n        return gl.stencilFuncSeparate(1028, getValue(2962, values, cache), getValue(2967, values, cache), getValue(2963, values, cache));\n    },\n    stencilFuncBack: function stencilFuncBack(gl, values, cache) {\n        return gl.stencilFuncSeparate(1029, getValue(34816, values, cache), getValue(36003, values, cache), getValue(36004, values, cache));\n    },\n    stencilOpFront: function stencilOpFront(gl, values, cache) {\n        return gl.stencilOpSeparate(1028, getValue(2964, values, cache), getValue(2965, values, cache), getValue(2966, values, cache));\n    },\n    stencilOpBack: function stencilOpBack(gl, values, cache) {\n        return gl.stencilOpSeparate(1029, getValue(34817, values, cache), getValue(34818, values, cache), getValue(34819, values, cache));\n    }\n};\nvar GL_HOOKED_SETTERS = {\n    enable: function enable(update, capability) {\n        return update((0, _definePropertyDefault.default)({}, capability, true));\n    },\n    disable: function disable(update, capability) {\n        return update((0, _definePropertyDefault.default)({}, capability, false));\n    },\n    pixelStorei: function pixelStorei(update, pname, value) {\n        return update((0, _definePropertyDefault.default)({}, pname, value));\n    },\n    hint: function hint(update, pname, _hint) {\n        return update((0, _definePropertyDefault.default)({}, pname, _hint));\n    },\n    bindFramebuffer: function bindFramebuffer(update, target, framebuffer) {\n        var _update5;\n        switch(target){\n            case 36160:\n                return update((_update5 = {}, (0, _definePropertyDefault.default)(_update5, 36006, framebuffer), (0, _definePropertyDefault.default)(_update5, 36010, framebuffer), _update5));\n            case 36009:\n                return update((0, _definePropertyDefault.default)({}, 36006, framebuffer));\n            case 36008:\n                return update((0, _definePropertyDefault.default)({}, 36010, framebuffer));\n            default:\n                return null;\n        }\n    },\n    blendColor: function blendColor(update, r, g, b, a) {\n        return update((0, _definePropertyDefault.default)({}, 32773, new Float32Array([\n            r,\n            g,\n            b,\n            a\n        ])));\n    },\n    blendEquation: function blendEquation(update, mode) {\n        var _update9;\n        return update((_update9 = {}, (0, _definePropertyDefault.default)(_update9, 32777, mode), (0, _definePropertyDefault.default)(_update9, 34877, mode), _update9));\n    },\n    blendEquationSeparate: function blendEquationSeparate(update, modeRGB, modeAlpha) {\n        var _update10;\n        return update((_update10 = {}, (0, _definePropertyDefault.default)(_update10, 32777, modeRGB), (0, _definePropertyDefault.default)(_update10, 34877, modeAlpha), _update10));\n    },\n    blendFunc: function blendFunc(update, src, dst) {\n        var _update11;\n        return update((_update11 = {}, (0, _definePropertyDefault.default)(_update11, 32969, src), (0, _definePropertyDefault.default)(_update11, 32968, dst), (0, _definePropertyDefault.default)(_update11, 32971, src), (0, _definePropertyDefault.default)(_update11, 32970, dst), _update11));\n    },\n    blendFuncSeparate: function blendFuncSeparate(update, srcRGB, dstRGB, srcAlpha, dstAlpha) {\n        var _update12;\n        return update((_update12 = {}, (0, _definePropertyDefault.default)(_update12, 32969, srcRGB), (0, _definePropertyDefault.default)(_update12, 32968, dstRGB), (0, _definePropertyDefault.default)(_update12, 32971, srcAlpha), (0, _definePropertyDefault.default)(_update12, 32970, dstAlpha), _update12));\n    },\n    clearColor: function clearColor(update, r, g, b, a) {\n        return update((0, _definePropertyDefault.default)({}, 3106, new Float32Array([\n            r,\n            g,\n            b,\n            a\n        ])));\n    },\n    clearDepth: function clearDepth(update, depth) {\n        return update((0, _definePropertyDefault.default)({}, 2931, depth));\n    },\n    clearStencil: function clearStencil(update, s) {\n        return update((0, _definePropertyDefault.default)({}, 2961, s));\n    },\n    colorMask: function colorMask(update, r, g, b, a) {\n        return update((0, _definePropertyDefault.default)({}, 3107, [\n            r,\n            g,\n            b,\n            a\n        ]));\n    },\n    cullFace: function cullFace(update, mode) {\n        return update((0, _definePropertyDefault.default)({}, 2885, mode));\n    },\n    depthFunc: function depthFunc(update, func) {\n        return update((0, _definePropertyDefault.default)({}, 2932, func));\n    },\n    depthRange: function depthRange(update, zNear, zFar) {\n        return update((0, _definePropertyDefault.default)({}, 2928, new Float32Array([\n            zNear,\n            zFar\n        ])));\n    },\n    depthMask: function depthMask(update, mask) {\n        return update((0, _definePropertyDefault.default)({}, 2930, mask));\n    },\n    frontFace: function frontFace(update, face) {\n        return update((0, _definePropertyDefault.default)({}, 2886, face));\n    },\n    lineWidth: function lineWidth(update, width) {\n        return update((0, _definePropertyDefault.default)({}, 2849, width));\n    },\n    polygonOffset: function polygonOffset(update, factor, units) {\n        var _update23;\n        return update((_update23 = {}, (0, _definePropertyDefault.default)(_update23, 32824, factor), (0, _definePropertyDefault.default)(_update23, 10752, units), _update23));\n    },\n    sampleCoverage: function sampleCoverage(update, value, invert) {\n        var _update24;\n        return update((_update24 = {}, (0, _definePropertyDefault.default)(_update24, 32938, value), (0, _definePropertyDefault.default)(_update24, 32939, invert), _update24));\n    },\n    scissor: function scissor(update, x, y, width, height) {\n        return update((0, _definePropertyDefault.default)({}, 3088, new Int32Array([\n            x,\n            y,\n            width,\n            height\n        ])));\n    },\n    stencilMask: function stencilMask(update, mask) {\n        var _update26;\n        return update((_update26 = {}, (0, _definePropertyDefault.default)(_update26, 2968, mask), (0, _definePropertyDefault.default)(_update26, 36005, mask), _update26));\n    },\n    stencilMaskSeparate: function stencilMaskSeparate(update, face, mask) {\n        return update((0, _definePropertyDefault.default)({}, face === 1028 ? 2968 : 36005, mask));\n    },\n    stencilFunc: function stencilFunc(update, func, ref, mask) {\n        var _update28;\n        return update((_update28 = {}, (0, _definePropertyDefault.default)(_update28, 2962, func), (0, _definePropertyDefault.default)(_update28, 2967, ref), (0, _definePropertyDefault.default)(_update28, 2963, mask), (0, _definePropertyDefault.default)(_update28, 34816, func), (0, _definePropertyDefault.default)(_update28, 36003, ref), (0, _definePropertyDefault.default)(_update28, 36004, mask), _update28));\n    },\n    stencilFuncSeparate: function stencilFuncSeparate(update, face, func, ref, mask) {\n        var _update29;\n        return update((_update29 = {}, (0, _definePropertyDefault.default)(_update29, face === 1028 ? 2962 : 34816, func), (0, _definePropertyDefault.default)(_update29, face === 1028 ? 2967 : 36003, ref), (0, _definePropertyDefault.default)(_update29, face === 1028 ? 2963 : 36004, mask), _update29));\n    },\n    stencilOp: function stencilOp(update, fail, zfail, zpass) {\n        var _update30;\n        return update((_update30 = {}, (0, _definePropertyDefault.default)(_update30, 2964, fail), (0, _definePropertyDefault.default)(_update30, 2965, zfail), (0, _definePropertyDefault.default)(_update30, 2966, zpass), (0, _definePropertyDefault.default)(_update30, 34817, fail), (0, _definePropertyDefault.default)(_update30, 34818, zfail), (0, _definePropertyDefault.default)(_update30, 34819, zpass), _update30));\n    },\n    stencilOpSeparate: function stencilOpSeparate(update, face, fail, zfail, zpass) {\n        var _update31;\n        return update((_update31 = {}, (0, _definePropertyDefault.default)(_update31, face === 1028 ? 2964 : 34817, fail), (0, _definePropertyDefault.default)(_update31, face === 1028 ? 2965 : 34818, zfail), (0, _definePropertyDefault.default)(_update31, face === 1028 ? 2966 : 34819, zpass), _update31));\n    },\n    viewport: function viewport(update, x, y, width, height) {\n        return update((0, _definePropertyDefault.default)({}, 2978, [\n            x,\n            y,\n            width,\n            height\n        ]));\n    }\n};\nvar isEnabled = function isEnabled(gl, key) {\n    return gl.isEnabled(key);\n};\nvar GL_PARAMETER_GETTERS = (_GL_PARAMETER_GETTERS = {}, (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 3042, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 2884, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 2929, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 3024, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 32823, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 32926, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 32928, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 3089, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 2960, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 35977, isEnabled), _GL_PARAMETER_GETTERS);\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/toConsumableArray\":\"kNndj\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../utils\":\"fCLDZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cLnqM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayWithHolesJs = require(\"./arrayWithHoles.js\");\nvar _arrayWithHolesJsDefault = parcelHelpers.interopDefault(_arrayWithHolesJs);\nvar _iterableToArrayLimitJs = require(\"./iterableToArrayLimit.js\");\nvar _iterableToArrayLimitJsDefault = parcelHelpers.interopDefault(_iterableToArrayLimitJs);\nvar _unsupportedIterableToArrayJs = require(\"./unsupportedIterableToArray.js\");\nvar _unsupportedIterableToArrayJsDefault = parcelHelpers.interopDefault(_unsupportedIterableToArrayJs);\nvar _nonIterableRestJs = require(\"./nonIterableRest.js\");\nvar _nonIterableRestJsDefault = parcelHelpers.interopDefault(_nonIterableRestJs);\nfunction _slicedToArray(arr, i) {\n    return (0, _arrayWithHolesJsDefault.default)(arr) || (0, _iterableToArrayLimitJsDefault.default)(arr, i) || (0, _unsupportedIterableToArrayJsDefault.default)(arr, i) || (0, _nonIterableRestJsDefault.default)();\n}\nexports.default = _slicedToArray;\n\n},{\"./arrayWithHoles.js\":\"ecMi6\",\"./iterableToArrayLimit.js\":\"gzkOe\",\"./unsupportedIterableToArray.js\":\"gw7Ev\",\"./nonIterableRest.js\":\"7UuRL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ecMi6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _arrayWithHoles(arr) {\n    if (Array.isArray(arr)) return arr;\n}\nexports.default = _arrayWithHoles;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gzkOe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _iterableToArrayLimit(arr, i) {\n    var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n    if (_i == null) return;\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _s, _e;\n    try {\n        for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n            _arr.push(_s.value);\n            if (i && _arr.length === i) break;\n        }\n    } catch (err) {\n        _d = true;\n        _e = err;\n    } finally{\n        try {\n            if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n        } finally{\n            if (_d) throw _e;\n        }\n    }\n    return _arr;\n}\nexports.default = _iterableToArrayLimit;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7UuRL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _nonIterableRest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexports.default = _nonIterableRest;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2SBg9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"pushContextState\", ()=>pushContextState);\nparcelHelpers.export(exports, \"popContextState\", ()=>popContextState);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _webglParameterTables = require(\"./webgl-parameter-tables\");\nvar _unifiedParameterApi = require(\"./unified-parameter-api\");\nvar _utils = require(\"../utils\");\nvar global = arguments[3];\nfunction installGetterOverride(gl, functionName) {\n    var originalGetterFunc = gl[functionName].bind(gl);\n    gl[functionName] = function get() {\n        var pname = arguments.length <= 0 ? undefined : arguments[0];\n        if (!(pname in gl.state.cache)) gl.state.cache[pname] = originalGetterFunc.apply(void 0, arguments);\n        return gl.state.enable ? gl.state.cache[pname] : originalGetterFunc.apply(void 0, arguments);\n    };\n    Object.defineProperty(gl[functionName], \"name\", {\n        value: \"\".concat(functionName, \"-from-cache\"),\n        configurable: false\n    });\n}\nfunction installSetterSpy(gl, functionName, setter) {\n    var originalSetterFunc = gl[functionName].bind(gl);\n    gl[functionName] = function set() {\n        for(var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++)params[_key] = arguments[_key];\n        var _setter = setter.apply(void 0, [\n            gl.state._updateCache\n        ].concat(params)), valueChanged = _setter.valueChanged, oldValue = _setter.oldValue;\n        if (valueChanged) originalSetterFunc.apply(void 0, params);\n        return oldValue;\n    };\n    Object.defineProperty(gl[functionName], \"name\", {\n        value: \"\".concat(functionName, \"-to-cache\"),\n        configurable: false\n    });\n}\nfunction installProgramSpy(gl) {\n    var originalUseProgram = gl.useProgram.bind(gl);\n    gl.useProgram = function useProgramLuma(handle) {\n        if (gl.state.program !== handle) {\n            originalUseProgram(handle);\n            gl.state.program = handle;\n        }\n    };\n}\nvar GLState = function() {\n    function GLState1(gl) {\n        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$copyState = _ref.copyState, copyState = _ref$copyState === void 0 ? false : _ref$copyState, _ref$log = _ref.log, log = _ref$log === void 0 ? function() {} : _ref$log;\n        (0, _classCallCheckDefault.default)(this, GLState1);\n        this.gl = gl;\n        this.program = null;\n        this.stateStack = [];\n        this.enable = true;\n        this.cache = copyState ? (0, _unifiedParameterApi.getParameters)(gl) : Object.assign({}, (0, _webglParameterTables.GL_PARAMETER_DEFAULTS));\n        this.log = log;\n        this._updateCache = this._updateCache.bind(this);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(GLState1, [\n        {\n            key: \"push\",\n            value: function push() {\n                var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this.stateStack.push({});\n            }\n        },\n        {\n            key: \"pop\",\n            value: function pop() {\n                (0, _utils.assert)(this.stateStack.length > 0);\n                var oldValues = this.stateStack[this.stateStack.length - 1];\n                (0, _unifiedParameterApi.setParameters)(this.gl, oldValues, this.cache);\n                this.stateStack.pop();\n            }\n        },\n        {\n            key: \"_updateCache\",\n            value: function _updateCache(values) {\n                var valueChanged = false;\n                var oldValue;\n                var oldValues = this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1];\n                for(var key in values){\n                    (0, _utils.assert)(key !== undefined);\n                    var value = values[key];\n                    var cached = this.cache[key];\n                    if (!(0, _utils.deepArrayEqual)(value, cached)) {\n                        valueChanged = true;\n                        oldValue = cached;\n                        if (oldValues && !(key in oldValues)) oldValues[key] = cached;\n                        this.cache[key] = value;\n                    }\n                }\n                return {\n                    valueChanged: valueChanged,\n                    oldValue: oldValue\n                };\n            }\n        }\n    ]);\n    return GLState1;\n}();\nfunction trackContextState(gl) {\n    var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$enable = _ref2.enable, enable = _ref2$enable === void 0 ? true : _ref2$enable, copyState = _ref2.copyState;\n    (0, _utils.assert)(copyState !== undefined);\n    if (!gl.state) {\n        var global_ = typeof global !== \"undefined\" ? global : window;\n        if (global_.polyfillContext) global_.polyfillContext(gl);\n        gl.state = new GLState(gl, {\n            copyState: copyState,\n            enable: enable\n        });\n        installProgramSpy(gl);\n        for(var key in 0, _webglParameterTables.GL_HOOKED_SETTERS){\n            var setter = (0, _webglParameterTables.GL_HOOKED_SETTERS)[key];\n            installSetterSpy(gl, key, setter);\n        }\n        installGetterOverride(gl, \"getParameter\");\n        installGetterOverride(gl, \"isEnabled\");\n    }\n    gl.state.enable = enable;\n    return gl;\n}\nexports.default = trackContextState;\nfunction pushContextState(gl) {\n    if (!gl.state) trackContextState(gl, {\n        copyState: false\n    });\n    gl.state.push();\n}\nfunction popContextState(gl) {\n    (0, _utils.assert)(gl.state);\n    gl.state.pop();\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./webgl-parameter-tables\":\"j7AGW\",\"./unified-parameter-api\":\"bTlVf\",\"../utils\":\"fCLDZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iX9Z3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ERR_CONTEXT\", ()=>ERR_CONTEXT);\nparcelHelpers.export(exports, \"ERR_WEBGL\", ()=>ERR_WEBGL);\nparcelHelpers.export(exports, \"ERR_WEBGL2\", ()=>ERR_WEBGL2);\nparcelHelpers.export(exports, \"createGLContext\", ()=>createGLContext);\nparcelHelpers.export(exports, \"instrumentGLContext\", ()=>instrumentGLContext);\nparcelHelpers.export(exports, \"getContextDebugInfo\", ()=>getContextDebugInfo);\nparcelHelpers.export(exports, \"resizeGLContext\", ()=>resizeGLContext);\nvar _env = require(\"probe.gl/env\");\nvar _trackContextState = require(\"../state-tracker/track-context-state\");\nvar _trackContextStateDefault = parcelHelpers.interopDefault(_trackContextState);\nvar _utils = require(\"../utils\");\nvar ERR_CONTEXT = \"Invalid WebGLRenderingContext\";\nvar ERR_WEBGL = ERR_CONTEXT;\nvar ERR_WEBGL2 = \"Requires WebGL2\";\nvar isBrowser = (0, _env.isBrowser)();\nvar isPage = isBrowser && typeof document !== \"undefined\";\nvar CONTEXT_DEFAULTS = {\n    webgl2: true,\n    webgl1: true,\n    throwOnError: true,\n    manageState: true,\n    canvas: null,\n    debug: false,\n    width: 800,\n    height: 600\n};\nfunction createGLContext() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _utils.assert)(isBrowser, \"createGLContext on available in the browser.\\nCreate your own headless context or use 'createHeadlessContext' from @luma.gl/test-utils\");\n    options = Object.assign({}, CONTEXT_DEFAULTS, options);\n    var _options = options, width = _options.width, height = _options.height;\n    function onError(message) {\n        if (options.throwOnError) throw new Error(message);\n        console.error(message);\n        return null;\n    }\n    options.onError = onError;\n    var gl;\n    var _options2 = options, canvas = _options2.canvas;\n    var targetCanvas = getCanvas({\n        canvas: canvas,\n        width: width,\n        height: height,\n        onError: onError\n    });\n    gl = createBrowserContext(targetCanvas, options);\n    if (!gl) return null;\n    gl = instrumentGLContext(gl, options);\n    logInfo(gl);\n    return gl;\n}\nfunction instrumentGLContext(gl) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    if (!gl || gl._instrumented) return gl;\n    gl._version = gl._version || getVersion(gl);\n    gl.luma = gl.luma || {};\n    gl.luma.canvasSizeInfo = gl.luma.canvasSizeInfo || {};\n    options = Object.assign({}, CONTEXT_DEFAULTS, options);\n    var _options3 = options, manageState = _options3.manageState, debug = _options3.debug;\n    if (manageState) (0, _trackContextStateDefault.default)(gl, {\n        copyState: false,\n        log: function log() {\n            for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++)args[_key] = arguments[_key];\n            return (0, _utils.log).log.apply((0, _utils.log), [\n                1\n            ].concat(args))();\n        }\n    });\n    if (isBrowser && debug) {\n        if (!(0, _env.global).makeDebugContext) (0, _utils.log).warn('WebGL debug mode not activated. import \"@luma.gl/debug\" to enable.')();\n        else {\n            gl = (0, _env.global).makeDebugContext(gl, options);\n            (0, _utils.log).level = Math.max((0, _utils.log).level, 1);\n        }\n    }\n    gl._instrumented = true;\n    return gl;\n}\nfunction getContextDebugInfo(gl) {\n    var vendorMasked = gl.getParameter(7936);\n    var rendererMasked = gl.getParameter(7937);\n    var ext = gl.getExtension(\"WEBGL_debug_renderer_info\");\n    var vendorUnmasked = ext && gl.getParameter(ext.UNMASKED_VENDOR_WEBGL || 7936);\n    var rendererUnmasked = ext && gl.getParameter(ext.UNMASKED_RENDERER_WEBGL || 7937);\n    return {\n        vendor: vendorUnmasked || vendorMasked,\n        renderer: rendererUnmasked || rendererMasked,\n        vendorMasked: vendorMasked,\n        rendererMasked: rendererMasked,\n        version: gl.getParameter(7938),\n        shadingLanguageVersion: gl.getParameter(35724)\n    };\n}\nfunction resizeGLContext(gl) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    if (gl.canvas) {\n        var devicePixelRatio = (0, _utils.getDevicePixelRatio)(options.useDevicePixels);\n        setDevicePixelRatio(gl, devicePixelRatio, options);\n        return;\n    }\n    var ext = gl.getExtension(\"STACKGL_resize_drawingbuffer\");\n    if (ext && \"width\" in options && \"height\" in options) ext.resize(options.width, options.height);\n}\nfunction createBrowserContext(canvas, options) {\n    var onError = options.onError;\n    var onCreateError = function onCreateError(error) {\n        return onError(\"WebGL context: \".concat(error.statusMessage || \"error\"));\n    };\n    canvas.addEventListener(\"webglcontextcreationerror\", onCreateError, false);\n    var _options$webgl = options.webgl1, webgl1 = _options$webgl === void 0 ? true : _options$webgl, _options$webgl2 = options.webgl2, webgl2 = _options$webgl2 === void 0 ? true : _options$webgl2;\n    var gl = null;\n    if (webgl2) {\n        gl = gl || canvas.getContext(\"webgl2\", options);\n        gl = gl || canvas.getContext(\"experimental-webgl2\", options);\n    }\n    if (webgl1) {\n        gl = gl || canvas.getContext(\"webgl\", options);\n        gl = gl || canvas.getContext(\"experimental-webgl\", options);\n    }\n    canvas.removeEventListener(\"webglcontextcreationerror\", onCreateError, false);\n    if (!gl) return onError(\"Failed to create \".concat(webgl2 && !webgl1 ? \"WebGL2\" : \"WebGL\", \" context\"));\n    return gl;\n}\nfunction getCanvas(_ref) {\n    var canvas = _ref.canvas, _ref$width = _ref.width, width = _ref$width === void 0 ? 800 : _ref$width, _ref$height = _ref.height, height = _ref$height === void 0 ? 600 : _ref$height, onError = _ref.onError;\n    var targetCanvas;\n    if (typeof canvas === \"string\") {\n        var isPageLoaded = isPage && document.readyState === \"complete\";\n        if (!isPageLoaded) onError(\"createGLContext called on canvas '\".concat(canvas, \"' before page was loaded\"));\n        targetCanvas = document.getElementById(canvas);\n    } else if (canvas) targetCanvas = canvas;\n    else {\n        targetCanvas = document.createElement(\"canvas\");\n        targetCanvas.id = \"lumagl-canvas\";\n        targetCanvas.style.width = Number.isFinite(width) ? \"\".concat(width, \"px\") : \"100%\";\n        targetCanvas.style.height = Number.isFinite(height) ? \"\".concat(height, \"px\") : \"100%\";\n        document.body.insertBefore(targetCanvas, document.body.firstChild);\n    }\n    return targetCanvas;\n}\nfunction logInfo(gl) {\n    var webGL = (0, _utils.isWebGL2)(gl) ? \"WebGL2\" : \"WebGL1\";\n    var info = getContextDebugInfo(gl);\n    var driver = info ? \"(\".concat(info.vendor, \",\").concat(info.renderer, \")\") : \"\";\n    var debug = gl.debug ? \" debug\" : \"\";\n    (0, _utils.log).info(1, \"\".concat(webGL).concat(debug, \" context \").concat(driver))();\n}\nfunction getVersion(gl) {\n    if (typeof WebGL2RenderingContext !== \"undefined\" && gl instanceof WebGL2RenderingContext) return 2;\n    return 1;\n}\nfunction setDevicePixelRatio(gl, devicePixelRatio, options) {\n    var clientWidth = \"width\" in options ? options.width : gl.canvas.clientWidth;\n    var clientHeight = \"height\" in options ? options.height : gl.canvas.clientHeight;\n    if (!clientWidth || !clientHeight) {\n        (0, _utils.log).log(1, \"Canvas clientWidth/clientHeight is 0\")();\n        devicePixelRatio = 1;\n        clientWidth = gl.canvas.width || 1;\n        clientHeight = gl.canvas.height || 1;\n    }\n    gl.luma = gl.luma || {};\n    gl.luma.canvasSizeInfo = gl.luma.canvasSizeInfo || {};\n    var cachedSize = gl.luma.canvasSizeInfo;\n    if (cachedSize.clientWidth !== clientWidth || cachedSize.clientHeight !== clientHeight || cachedSize.devicePixelRatio !== devicePixelRatio) {\n        var clampedPixelRatio = devicePixelRatio;\n        var canvasWidth = Math.floor(clientWidth * clampedPixelRatio);\n        var canvasHeight = Math.floor(clientHeight * clampedPixelRatio);\n        gl.canvas.width = canvasWidth;\n        gl.canvas.height = canvasHeight;\n        if (gl.drawingBufferWidth !== canvasWidth || gl.drawingBufferHeight !== canvasHeight) {\n            (0, _utils.log).warn(\"Device pixel ratio clamped\")();\n            clampedPixelRatio = Math.min(gl.drawingBufferWidth / clientWidth, gl.drawingBufferHeight / clientHeight);\n            gl.canvas.width = Math.floor(clientWidth * clampedPixelRatio);\n            gl.canvas.height = Math.floor(clientHeight * clampedPixelRatio);\n        }\n        Object.assign(gl.luma.canvasSizeInfo, {\n            clientWidth: clientWidth,\n            clientHeight: clientHeight,\n            devicePixelRatio: devicePixelRatio\n        });\n    }\n}\n\n},{\"probe.gl/env\":\"btEBf\",\"../state-tracker/track-context-state\":\"2SBg9\",\"../utils\":\"fCLDZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"caucX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"lumaStats\", ()=>(0, _init.lumaStats));\nparcelHelpers.export(exports, \"requestAnimationFrame\", ()=>(0, _requestAnimationFrame.requestAnimationFrame));\nparcelHelpers.export(exports, \"cancelAnimationFrame\", ()=>(0, _requestAnimationFrame.cancelAnimationFrame));\nparcelHelpers.export(exports, \"cloneTextureFrom\", ()=>(0, _textureUtils.cloneTextureFrom));\nparcelHelpers.export(exports, \"getKeyValue\", ()=>(0, _constantsToKeys.getKeyValue));\nparcelHelpers.export(exports, \"getKey\", ()=>(0, _constantsToKeys.getKey));\nparcelHelpers.export(exports, \"getContextInfo\", ()=>(0, _limits.getContextInfo));\nparcelHelpers.export(exports, \"getGLContextInfo\", ()=>(0, _limits.getGLContextInfo));\nparcelHelpers.export(exports, \"getContextLimits\", ()=>(0, _limits.getContextLimits));\nparcelHelpers.export(exports, \"FEATURES\", ()=>(0, _webglFeaturesTable.FEATURES));\nparcelHelpers.export(exports, \"hasFeature\", ()=>(0, _features.hasFeature));\nparcelHelpers.export(exports, \"hasFeatures\", ()=>(0, _features.hasFeatures));\nparcelHelpers.export(exports, \"getFeatures\", ()=>(0, _features.getFeatures));\nparcelHelpers.export(exports, \"canCompileGLGSExtension\", ()=>(0, _checkGlslExtensionDefault.default));\nparcelHelpers.export(exports, \"Accessor\", ()=>(0, _accessorDefault.default));\nparcelHelpers.export(exports, \"Buffer\", ()=>(0, _bufferDefault.default));\nparcelHelpers.export(exports, \"Shader\", ()=>(0, _shader.Shader));\nparcelHelpers.export(exports, \"VertexShader\", ()=>(0, _shader.VertexShader));\nparcelHelpers.export(exports, \"FragmentShader\", ()=>(0, _shader.FragmentShader));\nparcelHelpers.export(exports, \"Program\", ()=>(0, _programDefault.default));\nparcelHelpers.export(exports, \"Framebuffer\", ()=>(0, _framebufferDefault.default));\nparcelHelpers.export(exports, \"Renderbuffer\", ()=>(0, _renderbufferDefault.default));\nparcelHelpers.export(exports, \"Texture2D\", ()=>(0, _texture2DDefault.default));\nparcelHelpers.export(exports, \"TextureCube\", ()=>(0, _textureCubeDefault.default));\nparcelHelpers.export(exports, \"clear\", ()=>(0, _clear.clear));\nparcelHelpers.export(exports, \"clearBuffer\", ()=>(0, _clear.clearBuffer));\nparcelHelpers.export(exports, \"readPixelsToArray\", ()=>(0, _copyAndBlit.readPixelsToArray));\nparcelHelpers.export(exports, \"readPixelsToBuffer\", ()=>(0, _copyAndBlit.readPixelsToBuffer));\nparcelHelpers.export(exports, \"copyToDataUrl\", ()=>(0, _copyAndBlit.copyToDataUrl));\nparcelHelpers.export(exports, \"copyToImage\", ()=>(0, _copyAndBlit.copyToImage));\nparcelHelpers.export(exports, \"copyToTexture\", ()=>(0, _copyAndBlit.copyToTexture));\nparcelHelpers.export(exports, \"blit\", ()=>(0, _copyAndBlit.blit));\nparcelHelpers.export(exports, \"Query\", ()=>(0, _queryDefault.default));\nparcelHelpers.export(exports, \"Texture3D\", ()=>(0, _texture3DDefault.default));\nparcelHelpers.export(exports, \"TransformFeedback\", ()=>(0, _transformFeedbackDefault.default));\nparcelHelpers.export(exports, \"VertexArrayObject\", ()=>(0, _vertexArrayObjectDefault.default));\nparcelHelpers.export(exports, \"VertexArray\", ()=>(0, _vertexArrayDefault.default));\nparcelHelpers.export(exports, \"UniformBufferLayout\", ()=>(0, _uniformBufferLayoutDefault.default));\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>(0, _loadFile.setPathPrefix));\nparcelHelpers.export(exports, \"loadFile\", ()=>(0, _loadFile.loadFile));\nparcelHelpers.export(exports, \"loadImage\", ()=>(0, _loadFile.loadImage));\nparcelHelpers.export(exports, \"getShaderName\", ()=>(0, _getShaderNameDefault.default));\nparcelHelpers.export(exports, \"getShaderVersion\", ()=>(0, _getShaderVersionDefault.default));\nparcelHelpers.export(exports, \"log\", ()=>(0, _gltools.log));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nparcelHelpers.export(exports, \"uid\", ()=>(0, _utils.uid));\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>(0, _utils.isObjectEmpty));\nparcelHelpers.export(exports, \"parseUniformName\", ()=>(0, _uniforms.parseUniformName));\nparcelHelpers.export(exports, \"getUniformSetter\", ()=>(0, _uniforms.getUniformSetter));\nparcelHelpers.export(exports, \"getDebugTableForUniforms\", ()=>(0, _debugUniforms.getDebugTableForUniforms));\nparcelHelpers.export(exports, \"getDebugTableForVertexArray\", ()=>(0, _debugVertexArray.getDebugTableForVertexArray));\nparcelHelpers.export(exports, \"getDebugTableForProgramConfiguration\", ()=>(0, _debugProgramConfiguration.getDebugTableForProgramConfiguration));\nvar _init = require(\"./init\");\nvar _requestAnimationFrame = require(\"./webgl-utils/request-animation-frame\");\nvar _textureUtils = require(\"./webgl-utils/texture-utils\");\nvar _constantsToKeys = require(\"./webgl-utils/constants-to-keys\");\nvar _limits = require(\"./features/limits\");\nvar _webglFeaturesTable = require(\"./features/webgl-features-table\");\nvar _features = require(\"./features/features\");\nvar _checkGlslExtension = require(\"./features/check-glsl-extension\");\nvar _checkGlslExtensionDefault = parcelHelpers.interopDefault(_checkGlslExtension);\nvar _accessor = require(\"./classes/accessor\");\nvar _accessorDefault = parcelHelpers.interopDefault(_accessor);\nvar _buffer = require(\"./classes/buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _shader = require(\"./classes/shader\");\nvar _program = require(\"./classes/program\");\nvar _programDefault = parcelHelpers.interopDefault(_program);\nvar _framebuffer = require(\"./classes/framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _renderbuffer = require(\"./classes/renderbuffer\");\nvar _renderbufferDefault = parcelHelpers.interopDefault(_renderbuffer);\nvar _texture2D = require(\"./classes/texture-2d\");\nvar _texture2DDefault = parcelHelpers.interopDefault(_texture2D);\nvar _textureCube = require(\"./classes/texture-cube\");\nvar _textureCubeDefault = parcelHelpers.interopDefault(_textureCube);\nvar _clear = require(\"./classes/clear\");\nvar _copyAndBlit = require(\"./classes/copy-and-blit\");\nvar _query = require(\"./classes/query\");\nvar _queryDefault = parcelHelpers.interopDefault(_query);\nvar _texture3D = require(\"./classes/texture-3d\");\nvar _texture3DDefault = parcelHelpers.interopDefault(_texture3D);\nvar _transformFeedback = require(\"./classes/transform-feedback\");\nvar _transformFeedbackDefault = parcelHelpers.interopDefault(_transformFeedback);\nvar _vertexArrayObject = require(\"./classes/vertex-array-object\");\nvar _vertexArrayObjectDefault = parcelHelpers.interopDefault(_vertexArrayObject);\nvar _vertexArray = require(\"./classes/vertex-array\");\nvar _vertexArrayDefault = parcelHelpers.interopDefault(_vertexArray);\nvar _uniformBufferLayout = require(\"./classes/uniform-buffer-layout\");\nvar _uniformBufferLayoutDefault = parcelHelpers.interopDefault(_uniformBufferLayout);\nvar _loadFile = require(\"./utils/load-file\");\nvar _getShaderName = require(\"./glsl-utils/get-shader-name\");\nvar _getShaderNameDefault = parcelHelpers.interopDefault(_getShaderName);\nvar _getShaderVersion = require(\"./glsl-utils/get-shader-version\");\nvar _getShaderVersionDefault = parcelHelpers.interopDefault(_getShaderVersion);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _assert = require(\"./utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _utils = require(\"./utils/utils\");\nvar _uniforms = require(\"./classes/uniforms\");\nvar _debugUniforms = require(\"./debug/debug-uniforms\");\nvar _debugVertexArray = require(\"./debug/debug-vertex-array\");\nvar _debugProgramConfiguration = require(\"./debug/debug-program-configuration\");\n\n},{\"./init\":\"eJRTR\",\"./webgl-utils/request-animation-frame\":\"1QpvO\",\"./webgl-utils/texture-utils\":\"hWpBe\",\"./webgl-utils/constants-to-keys\":\"hRhNn\",\"./features/limits\":false,\"./features/webgl-features-table\":\"fx1cc\",\"./features/features\":\"9CI2f\",\"./features/check-glsl-extension\":false,\"./classes/accessor\":\"4UrSe\",\"./classes/buffer\":\"b1PWl\",\"./classes/shader\":\"bcNND\",\"./classes/program\":\"cptWf\",\"./classes/framebuffer\":\"3wciM\",\"./classes/renderbuffer\":\"4Dr1U\",\"./classes/texture-2d\":\"cRt4v\",\"./classes/texture-cube\":\"jRimD\",\"./classes/clear\":\"7N7gJ\",\"./classes/copy-and-blit\":\"bqHl8\",\"./classes/query\":\"iG1rO\",\"./classes/texture-3d\":\"67D1a\",\"./classes/transform-feedback\":\"aZVan\",\"./classes/vertex-array-object\":\"adlIK\",\"./classes/vertex-array\":\"hktpI\",\"./classes/uniform-buffer-layout\":false,\"./utils/load-file\":\"new3Q\",\"./glsl-utils/get-shader-name\":\"zh62S\",\"./glsl-utils/get-shader-version\":\"44BGy\",\"@luma.gl/gltools\":\"7HW6a\",\"./utils/assert\":\"9I2pU\",\"./utils/utils\":\"b8F9e\",\"./classes/uniforms\":\"4jCpe\",\"./debug/debug-uniforms\":\"i7eCT\",\"./debug/debug-vertex-array\":\"dOPl2\",\"./debug/debug-program-configuration\":\"9Qlg6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eJRTR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"lumaStats\", ()=>lumaStats);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _probeGl = require(\"probe.gl\");\nvar _env = require(\"probe.gl/env\");\nvar VERSION = \"8.3.1\";\nvar STARTUP_MESSAGE = \"set luma.log.level=1 (or higher) to trace rendering\";\nvar StatsManager = function() {\n    function StatsManager1() {\n        (0, _classCallCheckDefault.default)(this, StatsManager1);\n        this.stats = new Map();\n    }\n    (0, _createClassDefault.default)(StatsManager1, [\n        {\n            key: \"get\",\n            value: function get(name) {\n                if (!this.stats.has(name)) this.stats.set(name, new (0, _probeGl.Stats)({\n                    id: name\n                }));\n                return this.stats.get(name);\n            }\n        }\n    ]);\n    return StatsManager1;\n}();\nvar lumaStats = new StatsManager();\nif ((0, _env.global).luma && (0, _env.global).luma.VERSION !== VERSION) throw new Error(\"luma.gl - multiple VERSIONs detected: \".concat((0, _env.global).luma.VERSION, \" vs \").concat(VERSION));\nif (!(0, _env.global).luma) {\n    if ((0, _env.isBrowser)()) (0, _gltools.log).log(1, \"luma.gl \".concat(VERSION, \" - \").concat(STARTUP_MESSAGE))();\n    (0, _env.global).luma = (0, _env.global).luma || {\n        VERSION: VERSION,\n        version: VERSION,\n        log: (0, _gltools.log),\n        stats: lumaStats,\n        globals: {\n            modules: {},\n            nodeIO: {}\n        }\n    };\n}\nexports.default = (0, _env.global).luma;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/gltools\":\"7HW6a\",\"probe.gl\":\"2Bw0B\",\"probe.gl/env\":\"btEBf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1QpvO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"requestAnimationFrame\", ()=>requestAnimationFrame);\nparcelHelpers.export(exports, \"cancelAnimationFrame\", ()=>cancelAnimationFrame);\nfunction requestAnimationFrame(callback) {\n    return typeof window !== \"undefined\" && window.requestAnimationFrame ? window.requestAnimationFrame(callback) : setTimeout(callback, 1000 / 60);\n}\nfunction cancelAnimationFrame(timerId) {\n    return typeof window !== \"undefined\" && window.cancelAnimationFrame ? window.cancelAnimationFrame(timerId) : clearTimeout(timerId);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hWpBe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cloneTextureFrom\", ()=>cloneTextureFrom);\nparcelHelpers.export(exports, \"toFramebuffer\", ()=>toFramebuffer);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _texture2D = require(\"../classes/texture-2d\");\nvar _texture2DDefault = parcelHelpers.interopDefault(_texture2D);\nvar _textureCube = require(\"../classes/texture-cube\");\nvar _textureCubeDefault = parcelHelpers.interopDefault(_textureCube);\nvar _texture3D = require(\"../classes/texture-3d\");\nvar _texture3DDefault = parcelHelpers.interopDefault(_texture3D);\nvar _framebuffer = require(\"../classes/framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _utils = require(\"../utils\");\nfunction cloneTextureFrom(refTexture, overrides) {\n    (0, _utils.assert)(refTexture instanceof (0, _texture2DDefault.default) || refTexture instanceof (0, _textureCubeDefault.default) || refTexture instanceof (0, _texture3DDefault.default));\n    var TextureType = refTexture.constructor;\n    var gl = refTexture.gl, width = refTexture.width, height = refTexture.height, format = refTexture.format, type = refTexture.type, dataFormat = refTexture.dataFormat, border = refTexture.border, mipmaps = refTexture.mipmaps;\n    var textureOptions = Object.assign({\n        width: width,\n        height: height,\n        format: format,\n        type: type,\n        dataFormat: dataFormat,\n        border: border,\n        mipmaps: mipmaps\n    }, overrides);\n    return new TextureType(gl, textureOptions);\n}\nfunction toFramebuffer(texture, opts) {\n    var gl = texture.gl, width = texture.width, height = texture.height, id = texture.id;\n    var framebuffer = new (0, _framebufferDefault.default)(gl, Object.assign({}, opts, {\n        id: \"framebuffer-for-\".concat(id),\n        width: width,\n        height: height,\n        attachments: (0, _definePropertyDefault.default)({}, 36064, texture)\n    }));\n    return framebuffer;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../classes/texture-2d\":\"cRt4v\",\"../classes/texture-cube\":\"jRimD\",\"../classes/texture-3d\":\"67D1a\",\"../classes/framebuffer\":\"3wciM\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cRt4v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Texture2D);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _loadFile = require(\"../utils/load-file\");\nvar Texture2D = function(_Texture) {\n    (0, _inheritsDefault.default)(Texture2D1, _Texture);\n    (0, _createClassDefault.default)(Texture2D1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl, opts) {\n                return (0, _textureDefault.default).isSupported(gl, opts);\n            }\n        }\n    ]);\n    function Texture2D1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Texture2D1);\n        (0, _webglUtils.assertWebGLContext)(gl);\n        if (props instanceof Promise || typeof props === \"string\") props = {\n            data: props\n        };\n        if (typeof props.data === \"string\") props = Object.assign({}, props, {\n            data: (0, _loadFile.loadImage)(props.data)\n        });\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Texture2D1).call(this, gl, Object.assign({}, props, {\n            target: 3553\n        })));\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    return Texture2D1;\n}((0, _textureDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./texture\":\"fa6ef\",\"../webgl-utils\":\"hZtIX\",\"../utils/load-file\":\"new3Q\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6e4fp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _typeofJs = require(\"./typeof.js\");\nvar _typeofJsDefault = parcelHelpers.interopDefault(_typeofJs);\nvar _assertThisInitializedJs = require(\"./assertThisInitialized.js\");\nvar _assertThisInitializedJsDefault = parcelHelpers.interopDefault(_assertThisInitializedJs);\nfunction _possibleConstructorReturn(self, call) {\n    if (call && ((0, _typeofJsDefault.default)(call) === \"object\" || typeof call === \"function\")) return call;\n    else if (call !== void 0) throw new TypeError(\"Derived constructors may only return object or undefined\");\n    return (0, _assertThisInitializedJsDefault.default)(self);\n}\nexports.default = _possibleConstructorReturn;\n\n},{\"./typeof.js\":\"5go3u\",\"./assertThisInitialized.js\":\"4pJ2A\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4pJ2A\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _assertThisInitialized(self) {\n    if (self === void 0) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n    return self;\n}\nexports.default = _assertThisInitialized;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jf1Jo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _getPrototypeOf(o1) {\n    _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n        return o.__proto__ || Object.getPrototypeOf(o);\n    };\n    return _getPrototypeOf(o1);\n}\nexports.default = _getPrototypeOf;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jtMi4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _setPrototypeOfJs = require(\"./setPrototypeOf.js\");\nvar _setPrototypeOfJsDefault = parcelHelpers.interopDefault(_setPrototypeOfJs);\nfunction _inherits(subClass, superClass) {\n    if (typeof superClass !== \"function\" && superClass !== null) throw new TypeError(\"Super expression must either be null or a function\");\n    subClass.prototype = Object.create(superClass && superClass.prototype, {\n        constructor: {\n            value: subClass,\n            writable: true,\n            configurable: true\n        }\n    });\n    Object.defineProperty(subClass, \"prototype\", {\n        writable: false\n    });\n    if (superClass) (0, _setPrototypeOfJsDefault.default)(subClass, superClass);\n}\nexports.default = _inherits;\n\n},{\"./setPrototypeOf.js\":\"1Wga1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1Wga1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _setPrototypeOf(o1, p1) {\n    _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n        o.__proto__ = p;\n        return o;\n    };\n    return _setPrototypeOf(o1, p1);\n}\nexports.default = _setPrototypeOf;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fa6ef\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Texture);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _textureFormats = require(\"./texture-formats\");\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _env = require(\"probe.gl/env\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar NPOT_MIN_FILTERS = [\n    9729,\n    9728\n];\nvar WebGLBuffer = (0, _env.global).WebGLBuffer || function WebGLBuffer() {};\nvar Texture = function(_Resource) {\n    (0, _inheritsDefault.default)(Texture1, _Resource);\n    (0, _createClassDefault.default)(Texture1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, format = _ref.format, linearFiltering = _ref.linearFiltering;\n                var supported = true;\n                if (format) {\n                    supported = supported && (0, _textureFormats.isFormatSupported)(gl, format);\n                    supported = supported && (!linearFiltering || (0, _textureFormats.isLinearFilteringSupported)(gl, format));\n                }\n                return supported;\n            }\n        }\n    ]);\n    function Texture1(gl, props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, Texture1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _utils.uid)(\"texture\") : _props$id, handle = props.handle, target = props.target;\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Texture1).call(this, gl, {\n            id: id,\n            handle: handle\n        }));\n        _this.target = target;\n        _this.textureUnit = undefined;\n        _this.loaded = false;\n        _this.width = undefined;\n        _this.height = undefined;\n        _this.depth = undefined;\n        _this.format = undefined;\n        _this.type = undefined;\n        _this.dataFormat = undefined;\n        _this.border = undefined;\n        _this.textureUnit = undefined;\n        _this.mipmaps = undefined;\n        return _this;\n    }\n    (0, _createClassDefault.default)(Texture1, [\n        {\n            key: \"toString\",\n            value: function toString() {\n                return \"Texture(\".concat(this.id, \",\").concat(this.width, \"x\").concat(this.height, \")\");\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var _this2 = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var data = props.data;\n                if (data instanceof Promise) {\n                    data.then(function(resolvedImageData) {\n                        return _this2.initialize(Object.assign({}, props, {\n                            pixels: resolvedImageData,\n                            data: resolvedImageData\n                        }));\n                    });\n                    return this;\n                }\n                var _props$pixels = props.pixels, pixels = _props$pixels === void 0 ? null : _props$pixels, _props$format = props.format, format = _props$format === void 0 ? 6408 : _props$format, _props$border = props.border, border = _props$border === void 0 ? 0 : _props$border, _props$recreate = props.recreate, recreate = _props$recreate === void 0 ? false : _props$recreate, _props$parameters = props.parameters, parameters = _props$parameters === void 0 ? {} : _props$parameters, _props$pixelStore = props.pixelStore, pixelStore = _props$pixelStore === void 0 ? {} : _props$pixelStore, _props$textureUnit = props.textureUnit, textureUnit = _props$textureUnit === void 0 ? undefined : _props$textureUnit;\n                var _props$mipmaps = props.mipmaps, mipmaps = _props$mipmaps === void 0 ? true : _props$mipmaps;\n                if (!data) data = pixels;\n                var width = props.width, height = props.height, dataFormat = props.dataFormat, type = props.type;\n                var _props$depth = props.depth, depth = _props$depth === void 0 ? 0 : _props$depth;\n                var _this$_deduceParamete = this._deduceParameters({\n                    format: format,\n                    type: type,\n                    dataFormat: dataFormat,\n                    compressed: false,\n                    data: data,\n                    width: width,\n                    height: height\n                });\n                width = _this$_deduceParamete.width;\n                height = _this$_deduceParamete.height;\n                dataFormat = _this$_deduceParamete.dataFormat;\n                type = _this$_deduceParamete.type;\n                this.width = width;\n                this.height = height;\n                this.depth = depth;\n                this.format = format;\n                this.type = type;\n                this.dataFormat = dataFormat;\n                this.border = border;\n                this.textureUnit = textureUnit;\n                if (Number.isFinite(this.textureUnit)) {\n                    this.gl.activeTexture(33984 + this.textureUnit);\n                    this.gl.bindTexture(this.target, this.handle);\n                }\n                if (mipmaps && this._isNPOT()) {\n                    (0, _gltools.log).warn(\"texture: \".concat(this, \" is Non-Power-Of-Two, disabling mipmaping\"))();\n                    mipmaps = false;\n                    this._updateForNPOT(parameters);\n                }\n                this.mipmaps = mipmaps;\n                this.setImageData({\n                    data: data,\n                    width: width,\n                    height: height,\n                    depth: depth,\n                    format: format,\n                    type: type,\n                    dataFormat: dataFormat,\n                    border: border,\n                    mipmaps: mipmaps,\n                    parameters: pixelStore\n                });\n                if (mipmaps) this.generateMipmap();\n                this.setParameters(parameters);\n                if (recreate) this.data = data;\n                return this;\n            }\n        },\n        {\n            key: \"resize\",\n            value: function resize(_ref2) {\n                var height = _ref2.height, width = _ref2.width, _ref2$mipmaps = _ref2.mipmaps, mipmaps = _ref2$mipmaps === void 0 ? false : _ref2$mipmaps;\n                if (width !== this.width || height !== this.height) return this.initialize({\n                    width: width,\n                    height: height,\n                    format: this.format,\n                    type: this.type,\n                    dataFormat: this.dataFormat,\n                    border: this.border,\n                    mipmaps: mipmaps\n                });\n                return this;\n            }\n        },\n        {\n            key: \"generateMipmap\",\n            value: function generateMipmap() {\n                var _this3 = this;\n                var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (this._isNPOT()) {\n                    (0, _gltools.log).warn(\"texture: \".concat(this, \" is Non-Power-Of-Two, disabling mipmaping\"))();\n                    return this;\n                }\n                this.mipmaps = true;\n                this.gl.bindTexture(this.target, this.handle);\n                (0, _gltools.withParameters)(this.gl, params, function() {\n                    _this3.gl.generateMipmap(_this3.target);\n                });\n                this.gl.bindTexture(this.target, null);\n                return this;\n            }\n        },\n        {\n            key: \"setImageData\",\n            value: function setImageData(options) {\n                this._trackDeallocatedMemory(\"Texture\");\n                var _options$target = options.target, target = _options$target === void 0 ? this.target : _options$target, _options$pixels = options.pixels, pixels = _options$pixels === void 0 ? null : _options$pixels, _options$level = options.level, level = _options$level === void 0 ? 0 : _options$level, _options$format = options.format, format = _options$format === void 0 ? this.format : _options$format, _options$border = options.border, border = _options$border === void 0 ? this.border : _options$border, _options$offset = options.offset, offset = _options$offset === void 0 ? 0 : _options$offset, _options$parameters = options.parameters, parameters = _options$parameters === void 0 ? {} : _options$parameters;\n                var _options$data = options.data, data = _options$data === void 0 ? null : _options$data, _options$type = options.type, type = _options$type === void 0 ? this.type : _options$type, _options$width = options.width, width = _options$width === void 0 ? this.width : _options$width, _options$height = options.height, height = _options$height === void 0 ? this.height : _options$height, _options$dataFormat = options.dataFormat, dataFormat = _options$dataFormat === void 0 ? this.dataFormat : _options$dataFormat, _options$compressed = options.compressed, compressed = _options$compressed === void 0 ? false : _options$compressed;\n                if (!data) data = pixels;\n                var _this$_deduceParamete2 = this._deduceParameters({\n                    format: format,\n                    type: type,\n                    dataFormat: dataFormat,\n                    compressed: compressed,\n                    data: data,\n                    width: width,\n                    height: height\n                });\n                type = _this$_deduceParamete2.type;\n                dataFormat = _this$_deduceParamete2.dataFormat;\n                compressed = _this$_deduceParamete2.compressed;\n                width = _this$_deduceParamete2.width;\n                height = _this$_deduceParamete2.height;\n                var gl = this.gl;\n                gl.bindTexture(this.target, this.handle);\n                var dataType = null;\n                var _this$_getDataType = this._getDataType({\n                    data: data,\n                    compressed: compressed\n                });\n                data = _this$_getDataType.data;\n                dataType = _this$_getDataType.dataType;\n                (0, _gltools.withParameters)(this.gl, parameters, function() {\n                    switch(dataType){\n                        case \"null\":\n                            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data);\n                            break;\n                        case \"typed-array\":\n                            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data, offset);\n                            break;\n                        case \"buffer\":\n                            (0, _webglUtils.assertWebGL2Context)(gl);\n                            gl.bindBuffer(35052, data.handle || data);\n                            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, offset);\n                            gl.bindBuffer(35052, null);\n                            break;\n                        case \"browser-object\":\n                            if ((0, _gltools.isWebGL2)(gl)) gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data);\n                            else gl.texImage2D(target, level, format, dataFormat, type, data);\n                            break;\n                        case \"compressed\":\n                            gl.compressedTexImage2D(target, level, format, width, height, border, data);\n                            break;\n                        default:\n                            (0, _utils.assert)(false, \"Unknown image data type\");\n                    }\n                });\n                if (data && data.byteLength) this._trackAllocatedMemory(data.byteLength, \"Texture\");\n                else {\n                    var channels = (0, _textureFormats.DATA_FORMAT_CHANNELS)[this.dataFormat] || 4;\n                    var channelSize = (0, _textureFormats.TYPE_SIZES)[this.type] || 1;\n                    this._trackAllocatedMemory(this.width * this.height * channels * channelSize, \"Texture\");\n                }\n                this.loaded = true;\n                return this;\n            }\n        },\n        {\n            key: \"setSubImageData\",\n            value: function setSubImageData(_ref3) {\n                var _this4 = this;\n                var _ref3$target = _ref3.target, target = _ref3$target === void 0 ? this.target : _ref3$target, _ref3$pixels = _ref3.pixels, pixels = _ref3$pixels === void 0 ? null : _ref3$pixels, _ref3$data = _ref3.data, data = _ref3$data === void 0 ? null : _ref3$data, _ref3$x = _ref3.x, x = _ref3$x === void 0 ? 0 : _ref3$x, _ref3$y = _ref3.y, y = _ref3$y === void 0 ? 0 : _ref3$y, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? this.width : _ref3$width, _ref3$height = _ref3.height, height = _ref3$height === void 0 ? this.height : _ref3$height, _ref3$level = _ref3.level, level = _ref3$level === void 0 ? 0 : _ref3$level, _ref3$format = _ref3.format, format = _ref3$format === void 0 ? this.format : _ref3$format, _ref3$type = _ref3.type, type = _ref3$type === void 0 ? this.type : _ref3$type, _ref3$dataFormat = _ref3.dataFormat, dataFormat = _ref3$dataFormat === void 0 ? this.dataFormat : _ref3$dataFormat, _ref3$compressed = _ref3.compressed, compressed = _ref3$compressed === void 0 ? false : _ref3$compressed, _ref3$offset = _ref3.offset, offset = _ref3$offset === void 0 ? 0 : _ref3$offset, _ref3$border = _ref3.border, border = _ref3$border === void 0 ? this.border : _ref3$border, _ref3$parameters = _ref3.parameters, parameters = _ref3$parameters === void 0 ? {} : _ref3$parameters;\n                var _this$_deduceParamete3 = this._deduceParameters({\n                    format: format,\n                    type: type,\n                    dataFormat: dataFormat,\n                    compressed: compressed,\n                    data: data,\n                    width: width,\n                    height: height\n                });\n                type = _this$_deduceParamete3.type;\n                dataFormat = _this$_deduceParamete3.dataFormat;\n                compressed = _this$_deduceParamete3.compressed;\n                width = _this$_deduceParamete3.width;\n                height = _this$_deduceParamete3.height;\n                (0, _utils.assert)(this.depth === 0, \"texSubImage not supported for 3D textures\");\n                if (!data) data = pixels;\n                if (data && data.data) {\n                    var ndarray = data;\n                    data = ndarray.data;\n                    width = ndarray.shape[0];\n                    height = ndarray.shape[1];\n                }\n                if (data instanceof (0, _bufferDefault.default)) data = data.handle;\n                this.gl.bindTexture(this.target, this.handle);\n                (0, _gltools.withParameters)(this.gl, parameters, function() {\n                    if (compressed) _this4.gl.compressedTexSubImage2D(target, level, x, y, width, height, format, data);\n                    else if (data === null) _this4.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, null);\n                    else if (ArrayBuffer.isView(data)) _this4.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data, offset);\n                    else if (data instanceof WebGLBuffer) {\n                        (0, _webglUtils.assertWebGL2Context)(_this4.gl);\n                        _this4.gl.bindBuffer(35052, data);\n                        _this4.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, offset);\n                        _this4.gl.bindBuffer(35052, null);\n                    } else if ((0, _gltools.isWebGL2)(_this4.gl)) _this4.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data);\n                    else _this4.gl.texSubImage2D(target, level, x, y, dataFormat, type, data);\n                });\n                this.gl.bindTexture(this.target, null);\n            }\n        },\n        {\n            key: \"copyFramebuffer\",\n            value: function copyFramebuffer() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Texture.copyFramebuffer({...}) is no logner supported, use copyToTexture(source, target, opts})\")();\n                return null;\n            }\n        },\n        {\n            key: \"getActiveUnit\",\n            value: function getActiveUnit() {\n                return this.gl.getParameter(34016) - 33984;\n            }\n        },\n        {\n            key: \"bind\",\n            value: function bind() {\n                var textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;\n                var gl = this.gl;\n                if (textureUnit !== undefined) {\n                    this.textureUnit = textureUnit;\n                    gl.activeTexture(33984 + textureUnit);\n                }\n                gl.bindTexture(this.target, this.handle);\n                return textureUnit;\n            }\n        },\n        {\n            key: \"unbind\",\n            value: function unbind() {\n                var textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;\n                var gl = this.gl;\n                if (textureUnit !== undefined) {\n                    this.textureUnit = textureUnit;\n                    gl.activeTexture(33984 + textureUnit);\n                }\n                gl.bindTexture(this.target, null);\n                return textureUnit;\n            }\n        },\n        {\n            key: \"_getDataType\",\n            value: function _getDataType(_ref4) {\n                var data = _ref4.data, _ref4$compressed = _ref4.compressed, compressed = _ref4$compressed === void 0 ? false : _ref4$compressed;\n                if (compressed) return {\n                    data: data,\n                    dataType: \"compressed\"\n                };\n                if (data === null) return {\n                    data: data,\n                    dataType: \"null\"\n                };\n                if (ArrayBuffer.isView(data)) return {\n                    data: data,\n                    dataType: \"typed-array\"\n                };\n                if (data instanceof (0, _bufferDefault.default)) return {\n                    data: data.handle,\n                    dataType: \"buffer\"\n                };\n                if (data instanceof WebGLBuffer) return {\n                    data: data,\n                    dataType: \"buffer\"\n                };\n                return {\n                    data: data,\n                    dataType: \"browser-object\"\n                };\n            }\n        },\n        {\n            key: \"_deduceParameters\",\n            value: function _deduceParameters(opts) {\n                var format = opts.format, data = opts.data;\n                var width = opts.width, height = opts.height, dataFormat = opts.dataFormat, type = opts.type, compressed = opts.compressed;\n                var textureFormat = (0, _textureFormats.TEXTURE_FORMATS)[format];\n                dataFormat = dataFormat || textureFormat && textureFormat.dataFormat;\n                type = type || textureFormat && textureFormat.types[0];\n                compressed = compressed || textureFormat && textureFormat.compressed;\n                var _this$_deduceImageSiz = this._deduceImageSize(data, width, height);\n                width = _this$_deduceImageSiz.width;\n                height = _this$_deduceImageSiz.height;\n                return {\n                    dataFormat: dataFormat,\n                    type: type,\n                    compressed: compressed,\n                    width: width,\n                    height: height,\n                    format: format,\n                    data: data\n                };\n            }\n        },\n        {\n            key: \"_deduceImageSize\",\n            value: function _deduceImageSize(data, width, height) {\n                var size;\n                if (typeof ImageData !== \"undefined\" && data instanceof ImageData) size = {\n                    width: data.width,\n                    height: data.height\n                };\n                else if (typeof HTMLImageElement !== \"undefined\" && data instanceof HTMLImageElement) size = {\n                    width: data.naturalWidth,\n                    height: data.naturalHeight\n                };\n                else if (typeof HTMLCanvasElement !== \"undefined\" && data instanceof HTMLCanvasElement) size = {\n                    width: data.width,\n                    height: data.height\n                };\n                else if (typeof ImageBitmap !== \"undefined\" && data instanceof ImageBitmap) size = {\n                    width: data.width,\n                    height: data.height\n                };\n                else if (typeof HTMLVideoElement !== \"undefined\" && data instanceof HTMLVideoElement) size = {\n                    width: data.videoWidth,\n                    height: data.videoHeight\n                };\n                else if (!data) size = {\n                    width: width >= 0 ? width : 1,\n                    height: height >= 0 ? height : 1\n                };\n                else size = {\n                    width: width,\n                    height: height\n                };\n                (0, _utils.assert)(size, \"Could not deduced texture size\");\n                (0, _utils.assert)(width === undefined || size.width === width, \"Deduced texture width does not match supplied width\");\n                (0, _utils.assert)(height === undefined || size.height === height, \"Deduced texture height does not match supplied height\");\n                return size;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createTexture();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteTexture(this.handle);\n                this._trackDeallocatedMemory(\"Texture\");\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname) {\n                switch(pname){\n                    case 4096:\n                        return this.width;\n                    case 4097:\n                        return this.height;\n                    default:\n                        this.gl.bindTexture(this.target, this.handle);\n                        var value = this.gl.getTexParameter(this.target, pname);\n                        this.gl.bindTexture(this.target, null);\n                        return value;\n                }\n            }\n        },\n        {\n            key: \"_setParameter\",\n            value: function _setParameter(pname, param) {\n                this.gl.bindTexture(this.target, this.handle);\n                param = this._getNPOTParam(pname, param);\n                switch(pname){\n                    case 33082:\n                    case 33083:\n                        this.gl.texParameterf(this.handle, pname, param);\n                        break;\n                    case 4096:\n                    case 4097:\n                        (0, _utils.assert)(false);\n                        break;\n                    default:\n                        this.gl.texParameteri(this.target, pname, param);\n                        break;\n                }\n                this.gl.bindTexture(this.target, null);\n                return this;\n            }\n        },\n        {\n            key: \"_isNPOT\",\n            value: function _isNPOT() {\n                if ((0, _gltools.isWebGL2)(this.gl)) return false;\n                if (!this.width || !this.height) return false;\n                return !(0, _utils.isPowerOfTwo)(this.width) || !(0, _utils.isPowerOfTwo)(this.height);\n            }\n        },\n        {\n            key: \"_updateForNPOT\",\n            value: function _updateForNPOT(parameters) {\n                if (parameters[this.gl.TEXTURE_MIN_FILTER] === undefined) parameters[this.gl.TEXTURE_MIN_FILTER] = this.gl.LINEAR;\n                if (parameters[this.gl.TEXTURE_WRAP_S] === undefined) parameters[this.gl.TEXTURE_WRAP_S] = this.gl.CLAMP_TO_EDGE;\n                if (parameters[this.gl.TEXTURE_WRAP_T] === undefined) parameters[this.gl.TEXTURE_WRAP_T] = this.gl.CLAMP_TO_EDGE;\n            }\n        },\n        {\n            key: \"_getNPOTParam\",\n            value: function _getNPOTParam(pname, param) {\n                if (this._isNPOT()) switch(pname){\n                    case 10241:\n                        if (NPOT_MIN_FILTERS.indexOf(param) === -1) param = 9729;\n                        break;\n                    case 10242:\n                    case 10243:\n                        if (param !== 33071) param = 33071;\n                        break;\n                    default:\n                        break;\n                }\n                return param;\n            }\n        }\n    ]);\n    return Texture1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./resource\":\"j3b8Q\",\"./buffer\":\"b1PWl\",\"./texture-formats\":\"5Z7l8\",\"@luma.gl/gltools\":\"7HW6a\",\"probe.gl/env\":\"btEBf\",\"../webgl-utils\":\"hZtIX\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j3b8Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Resource);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _init = require(\"../init\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar ERR_RESOURCE_METHOD_UNDEFINED = \"Resource subclass must define virtual methods\";\nvar Resource = function() {\n    function Resource1(gl) {\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Resource1);\n        (0, _webglUtils.assertWebGLContext)(gl);\n        var id = opts.id, _opts$userData = opts.userData, userData = _opts$userData === void 0 ? {} : _opts$userData;\n        this.gl = gl;\n        this.id = id || (0, _utils.uid)(this.constructor.name);\n        this.userData = userData;\n        this._bound = false;\n        this._handle = opts.handle;\n        if (this._handle === undefined) this._handle = this._createHandle();\n        this.byteLength = 0;\n        this._addStats();\n    }\n    (0, _createClassDefault.default)(Resource1, [\n        {\n            key: \"toString\",\n            value: function toString() {\n                return \"\".concat(this.constructor.name, \"(\").concat(this.id, \")\");\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$deleteChildren = _ref.deleteChildren, deleteChildren = _ref$deleteChildren === void 0 ? false : _ref$deleteChildren;\n                var children = this._handle && this._deleteHandle(this._handle);\n                if (this._handle) this._removeStats();\n                this._handle = null;\n                if (children && deleteChildren) children.filter(Boolean).forEach(function(child) {\n                    child[\"delete\"]();\n                });\n                return this;\n            }\n        },\n        {\n            key: \"bind\",\n            value: function bind() {\n                var funcOrHandle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.handle;\n                if (typeof funcOrHandle !== \"function\") {\n                    this._bindHandle(funcOrHandle);\n                    return this;\n                }\n                var value;\n                if (!this._bound) {\n                    this._bindHandle(this.handle);\n                    this._bound = true;\n                    value = funcOrHandle();\n                    this._bound = false;\n                    this._bindHandle(null);\n                } else value = funcOrHandle();\n                return value;\n            }\n        },\n        {\n            key: \"unbind\",\n            value: function unbind() {\n                this.bind(null);\n            }\n        },\n        {\n            key: \"getParameter\",\n            value: function getParameter(pname) {\n                var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                pname = (0, _webglUtils.getKeyValue)(this.gl, pname);\n                (0, _utils.assert)(pname);\n                var parameters = this.constructor.PARAMETERS || {};\n                var parameter = parameters[pname];\n                if (parameter) {\n                    var isWebgl2 = (0, _gltools.isWebGL2)(this.gl);\n                    var parameterAvailable = (!(\"webgl2\" in parameter) || isWebgl2) && (!(\"extension\" in parameter) || this.gl.getExtension(parameter.extension));\n                    if (!parameterAvailable) {\n                        var webgl1Default = parameter.webgl1;\n                        var webgl2Default = \"webgl2\" in parameter ? parameter.webgl2 : parameter.webgl1;\n                        var defaultValue = isWebgl2 ? webgl2Default : webgl1Default;\n                        return defaultValue;\n                    }\n                }\n                return this._getParameter(pname, opts);\n            }\n        },\n        {\n            key: \"getParameters\",\n            value: function getParameters() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _ref2 = {}, parameters = _ref2.parameters, keys = _ref2.keys;\n                var PARAMETERS = this.constructor.PARAMETERS || {};\n                var isWebgl2 = (0, _gltools.isWebGL2)(this.gl);\n                var values = {};\n                var parameterKeys = parameters || Object.keys(PARAMETERS);\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = parameterKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var pname = _step.value;\n                        var parameter = PARAMETERS[pname];\n                        var parameterAvailable = parameter && (!(\"webgl2\" in parameter) || isWebgl2) && (!(\"extension\" in parameter) || this.gl.getExtension(parameter.extension));\n                        if (parameterAvailable) {\n                            var key = keys ? (0, _webglUtils.getKey)(this.gl, pname) : pname;\n                            values[key] = this.getParameter(pname, opts);\n                            if (keys && parameter.type === \"GLenum\") values[key] = (0, _webglUtils.getKey)(this.gl, values[key]);\n                        }\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                return values;\n            }\n        },\n        {\n            key: \"setParameter\",\n            value: function setParameter(pname, value) {\n                pname = (0, _webglUtils.getKeyValue)(this.gl, pname);\n                (0, _utils.assert)(pname);\n                var parameters = this.constructor.PARAMETERS || {};\n                var parameter = parameters[pname];\n                if (parameter) {\n                    var isWebgl2 = (0, _gltools.isWebGL2)(this.gl);\n                    var parameterAvailable = (!(\"webgl2\" in parameter) || isWebgl2) && (!(\"extension\" in parameter) || this.gl.getExtension(parameter.extension));\n                    if (!parameterAvailable) throw new Error(\"Parameter not available on this platform\");\n                    if (parameter.type === \"GLenum\") value = (0, _webglUtils.getKeyValue)(value);\n                }\n                this._setParameter(pname, value);\n                return this;\n            }\n        },\n        {\n            key: \"setParameters\",\n            value: function setParameters(parameters) {\n                for(var pname in parameters)this.setParameter(pname, parameters[pname]);\n                return this;\n            }\n        },\n        {\n            key: \"stubRemovedMethods\",\n            value: function stubRemovedMethods(className, version, methodNames) {\n                return (0, _utils.stubRemovedMethods)(this, className, version, methodNames);\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize(opts) {}\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle() {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_getOptsFromHandle\",\n            value: function _getOptsFromHandle() {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname, opts) {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_setParameter\",\n            value: function _setParameter(pname, value) {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_context\",\n            value: function _context() {\n                this.gl.luma = this.gl.luma || {};\n                return this.gl.luma;\n            }\n        },\n        {\n            key: \"_addStats\",\n            value: function _addStats() {\n                var name = this.constructor.name;\n                var stats = (0, _init.lumaStats).get(\"Resource Counts\");\n                stats.get(\"Resources Created\").incrementCount();\n                stats.get(\"\".concat(name, \"s Created\")).incrementCount();\n                stats.get(\"\".concat(name, \"s Active\")).incrementCount();\n            }\n        },\n        {\n            key: \"_removeStats\",\n            value: function _removeStats() {\n                var name = this.constructor.name;\n                var stats = (0, _init.lumaStats).get(\"Resource Counts\");\n                stats.get(\"\".concat(name, \"s Active\")).decrementCount();\n            }\n        },\n        {\n            key: \"_trackAllocatedMemory\",\n            value: function _trackAllocatedMemory(bytes) {\n                var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.name;\n                var stats = (0, _init.lumaStats).get(\"Memory Usage\");\n                stats.get(\"GPU Memory\").addCount(bytes);\n                stats.get(\"\".concat(name, \" Memory\")).addCount(bytes);\n                this.byteLength = bytes;\n            }\n        },\n        {\n            key: \"_trackDeallocatedMemory\",\n            value: function _trackDeallocatedMemory() {\n                var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.constructor.name;\n                var stats = (0, _init.lumaStats).get(\"Memory Usage\");\n                stats.get(\"GPU Memory\").subtractCount(this.byteLength);\n                stats.get(\"\".concat(name, \" Memory\")).subtractCount(this.byteLength);\n                this.byteLength = 0;\n            }\n        },\n        {\n            key: \"handle\",\n            get: function get() {\n                return this._handle;\n            }\n        }\n    ]);\n    return Resource1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/gltools\":\"7HW6a\",\"../init\":\"eJRTR\",\"../webgl-utils\":\"hZtIX\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hZtIX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assertWebGLContext\", ()=>(0, _webglChecks.assertWebGLContext));\nparcelHelpers.export(exports, \"assertWebGL2Context\", ()=>(0, _webglChecks.assertWebGL2Context));\nparcelHelpers.export(exports, \"requestAnimationFrame\", ()=>(0, _requestAnimationFrame.requestAnimationFrame));\nparcelHelpers.export(exports, \"cancelAnimationFrame\", ()=>(0, _requestAnimationFrame.cancelAnimationFrame));\nparcelHelpers.export(exports, \"getGLTypeFromTypedArray\", ()=>(0, _typedArrayUtils.getGLTypeFromTypedArray));\nparcelHelpers.export(exports, \"getTypedArrayFromGLType\", ()=>(0, _typedArrayUtils.getTypedArrayFromGLType));\nparcelHelpers.export(exports, \"flipRows\", ()=>(0, _typedArrayUtils.flipRows));\nparcelHelpers.export(exports, \"scalePixels\", ()=>(0, _typedArrayUtils.scalePixels));\nparcelHelpers.export(exports, \"getKeyValue\", ()=>(0, _constantsToKeys.getKeyValue));\nparcelHelpers.export(exports, \"getKey\", ()=>(0, _constantsToKeys.getKey));\nparcelHelpers.export(exports, \"getKeyType\", ()=>(0, _constantsToKeys.getKeyType));\nparcelHelpers.export(exports, \"cloneTextureFrom\", ()=>(0, _textureUtils.cloneTextureFrom));\nvar _webglChecks = require(\"./webgl-checks\");\nvar _requestAnimationFrame = require(\"./request-animation-frame\");\nvar _typedArrayUtils = require(\"./typed-array-utils\");\nvar _constantsToKeys = require(\"./constants-to-keys\");\nvar _textureUtils = require(\"./texture-utils\");\n\n},{\"./webgl-checks\":\"5WuUm\",\"./request-animation-frame\":\"1QpvO\",\"./typed-array-utils\":\"4mpgk\",\"./constants-to-keys\":\"hRhNn\",\"./texture-utils\":\"hWpBe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5WuUm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ERR_CONTEXT\", ()=>ERR_CONTEXT);\nparcelHelpers.export(exports, \"ERR_WEBGL\", ()=>ERR_WEBGL);\nparcelHelpers.export(exports, \"ERR_WEBGL2\", ()=>ERR_WEBGL2);\nparcelHelpers.export(exports, \"assertWebGLContext\", ()=>assertWebGLContext);\nparcelHelpers.export(exports, \"assertWebGL2Context\", ()=>assertWebGL2Context);\nvar _utils = require(\"../utils\");\nvar _gltools = require(\"@luma.gl/gltools\");\nvar ERR_CONTEXT = \"Invalid WebGLRenderingContext\";\nvar ERR_WEBGL = ERR_CONTEXT;\nvar ERR_WEBGL2 = \"Requires WebGL2\";\nfunction assertWebGLContext(gl) {\n    (0, _utils.assert)((0, _gltools.isWebGL)(gl), ERR_CONTEXT);\n}\nfunction assertWebGL2Context(gl) {\n    (0, _utils.assert)((0, _gltools.isWebGL2)(gl), ERR_WEBGL2);\n}\n\n},{\"../utils\":\"eK1k6\",\"@luma.gl/gltools\":\"7HW6a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eK1k6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nparcelHelpers.export(exports, \"isOldIE\", ()=>(0, _isOldIeDefault.default));\nparcelHelpers.export(exports, \"uid\", ()=>(0, _utils.uid));\nparcelHelpers.export(exports, \"isPowerOfTwo\", ()=>(0, _utils.isPowerOfTwo));\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>(0, _utils.isObjectEmpty));\nparcelHelpers.export(exports, \"formatValue\", ()=>(0, _formatValue.formatValue));\nparcelHelpers.export(exports, \"stubRemovedMethods\", ()=>(0, _stubMethods.stubRemovedMethods));\nparcelHelpers.export(exports, \"checkProps\", ()=>(0, _checkProps.checkProps));\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _isOldIe = require(\"./is-old-ie\");\nvar _isOldIeDefault = parcelHelpers.interopDefault(_isOldIe);\nvar _utils = require(\"./utils\");\nvar _formatValue = require(\"./format-value\");\nvar _stubMethods = require(\"./stub-methods\");\nvar _checkProps = require(\"./check-props\");\n\n},{\"./assert\":\"9I2pU\",\"./is-old-ie\":false,\"./utils\":\"b8F9e\",\"./format-value\":\"fYgRv\",\"./stub-methods\":\"54fyP\",\"./check-props\":\"bnrUb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9I2pU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"luma.gl: assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b8F9e\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"uid\", ()=>uid);\nparcelHelpers.export(exports, \"isPowerOfTwo\", ()=>isPowerOfTwo);\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>isObjectEmpty);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar uidCounters = {};\nfunction uid() {\n    var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"id\";\n    uidCounters[id] = uidCounters[id] || 1;\n    var count = uidCounters[id]++;\n    return \"\".concat(id, \"-\").concat(count);\n}\nfunction isPowerOfTwo(n) {\n    (0, _assertDefault.default)(typeof n === \"number\", \"Input must be a number\");\n    return n && (n & n - 1) === 0;\n}\nfunction isObjectEmpty(obj) {\n    var isEmpty = true;\n    for(var key in obj){\n        isEmpty = false;\n        break;\n    }\n    return isEmpty;\n}\n\n},{\"./assert\":\"9I2pU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fYgRv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatValue\", ()=>formatValue);\nfunction formatArrayValue(v, opts) {\n    var _opts$maxElts = opts.maxElts, maxElts = _opts$maxElts === void 0 ? 16 : _opts$maxElts, _opts$size = opts.size, size = _opts$size === void 0 ? 1 : _opts$size;\n    var string = \"[\";\n    for(var i = 0; i < v.length && i < maxElts; ++i){\n        if (i > 0) string += \",\".concat(i % size === 0 ? \" \" : \"\");\n        string += formatValue(v[i], opts);\n    }\n    var terminator = v.length > maxElts ? \"...\" : \"]\";\n    return \"\".concat(string).concat(terminator);\n}\nfunction formatValue(v) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var EPSILON = 1e-16;\n    var _opts$isInteger = opts.isInteger, isInteger = _opts$isInteger === void 0 ? false : _opts$isInteger;\n    if (Array.isArray(v) || ArrayBuffer.isView(v)) return formatArrayValue(v, opts);\n    if (!Number.isFinite(v)) return String(v);\n    if (Math.abs(v) < EPSILON) return isInteger ? \"0\" : \"0.\";\n    if (isInteger) return v.toFixed(0);\n    if (Math.abs(v) > 100 && Math.abs(v) < 10000) return v.toFixed(0);\n    var string = v.toPrecision(2);\n    var decimal = string.indexOf(\".0\");\n    return decimal === string.length - 2 ? string.slice(0, -1) : string;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"54fyP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"stubRemovedMethods\", ()=>stubRemovedMethods);\nvar _gltools = require(\"@luma.gl/gltools\");\nfunction stubRemovedMethods(instance, className, version, methodNames) {\n    var upgradeMessage = \"See luma.gl \".concat(version, \" Upgrade Guide at https://luma.gl/docs/upgrade-guide\");\n    var prototype = Object.getPrototypeOf(instance);\n    methodNames.forEach(function(methodName) {\n        if (prototype.methodName) return;\n        prototype[methodName] = function() {\n            (0, _gltools.log).removed(\"Calling removed method \".concat(className, \".\").concat(methodName, \": \"), upgradeMessage)();\n            throw new Error(methodName);\n        };\n    });\n}\n\n},{\"@luma.gl/gltools\":\"7HW6a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bnrUb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"checkProps\", ()=>checkProps);\nvar _gltools = require(\"@luma.gl/gltools\");\nfunction checkProps(className, props, propChecks) {\n    var _propChecks$removedPr = propChecks.removedProps, removedProps = _propChecks$removedPr === void 0 ? {} : _propChecks$removedPr, _propChecks$deprecate = propChecks.deprecatedProps, deprecatedProps = _propChecks$deprecate === void 0 ? {} : _propChecks$deprecate, _propChecks$replacedP = propChecks.replacedProps, replacedProps = _propChecks$replacedP === void 0 ? {} : _propChecks$replacedP;\n    for(var propName in removedProps)if (propName in props) {\n        var replacementProp = removedProps[propName];\n        var replacement = replacementProp ? \"\".concat(className, \".\").concat(removedProps[propName]) : \"N/A\";\n        (0, _gltools.log).removed(\"\".concat(className, \".\").concat(propName), replacement)();\n    }\n    for(var _propName in deprecatedProps)if (_propName in props) {\n        var _replacementProp = deprecatedProps[_propName];\n        (0, _gltools.log).deprecated(\"\".concat(className, \".\").concat(_propName), \"\".concat(className, \".\").concat(_replacementProp))();\n    }\n    var newProps = null;\n    for(var _propName2 in replacedProps)if (_propName2 in props) {\n        var _replacementProp2 = replacedProps[_propName2];\n        (0, _gltools.log).deprecated(\"\".concat(className, \".\").concat(_propName2), \"\".concat(className, \".\").concat(_replacementProp2))();\n        newProps = newProps || Object.assign({}, props);\n        newProps[_replacementProp2] = props[_propName2];\n        delete newProps[_propName2];\n    }\n    return newProps || props;\n}\n\n},{\"@luma.gl/gltools\":\"7HW6a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4mpgk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getGLTypeFromTypedArray\", ()=>getGLTypeFromTypedArray);\nparcelHelpers.export(exports, \"getTypedArrayFromGLType\", ()=>getTypedArrayFromGLType);\nparcelHelpers.export(exports, \"flipRows\", ()=>flipRows);\nparcelHelpers.export(exports, \"scalePixels\", ()=>scalePixels);\nvar ERR_TYPE_DEDUCTION = \"Failed to deduce GL constant from typed array\";\nfunction getGLTypeFromTypedArray(arrayOrType) {\n    var type = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;\n    switch(type){\n        case Float32Array:\n            return 5126;\n        case Uint16Array:\n            return 5123;\n        case Uint32Array:\n            return 5125;\n        case Uint8Array:\n            return 5121;\n        case Uint8ClampedArray:\n            return 5121;\n        case Int8Array:\n            return 5120;\n        case Int16Array:\n            return 5122;\n        case Int32Array:\n            return 5124;\n        default:\n            throw new Error(ERR_TYPE_DEDUCTION);\n    }\n}\nfunction getTypedArrayFromGLType(glType) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$clamped = _ref.clamped, clamped = _ref$clamped === void 0 ? true : _ref$clamped;\n    switch(glType){\n        case 5126:\n            return Float32Array;\n        case 5123:\n        case 33635:\n        case 32819:\n        case 32820:\n            return Uint16Array;\n        case 5125:\n            return Uint32Array;\n        case 5121:\n            return clamped ? Uint8ClampedArray : Uint8Array;\n        case 5120:\n            return Int8Array;\n        case 5122:\n            return Int16Array;\n        case 5124:\n            return Int32Array;\n        default:\n            throw new Error(\"Failed to deduce typed array type from GL constant\");\n    }\n}\nfunction flipRows(_ref2) {\n    var data = _ref2.data, width = _ref2.width, height = _ref2.height, _ref2$bytesPerPixel = _ref2.bytesPerPixel, bytesPerPixel = _ref2$bytesPerPixel === void 0 ? 4 : _ref2$bytesPerPixel, temp = _ref2.temp;\n    var bytesPerRow = width * bytesPerPixel;\n    temp = temp || new Uint8Array(bytesPerRow);\n    for(var y = 0; y < height / 2; ++y){\n        var topOffset = y * bytesPerRow;\n        var bottomOffset = (height - y - 1) * bytesPerRow;\n        temp.set(data.subarray(topOffset, topOffset + bytesPerRow));\n        data.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow);\n        data.set(temp, bottomOffset);\n    }\n}\nfunction scalePixels(_ref3) {\n    var data = _ref3.data, width = _ref3.width, height = _ref3.height;\n    var newWidth = Math.round(width / 2);\n    var newHeight = Math.round(height / 2);\n    var newData = new Uint8Array(newWidth * newHeight * 4);\n    for(var y = 0; y < newHeight; y++){\n        for(var x = 0; x < newWidth; x++)for(var c = 0; c < 4; c++)newData[(y * newWidth + x) * 4 + c] = data[(y * 2 * width + x * 2) * 4 + c];\n    }\n    return {\n        data: newData,\n        width: newWidth,\n        height: newHeight\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hRhNn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getKeyValue\", ()=>getKeyValue);\nparcelHelpers.export(exports, \"getKey\", ()=>getKey);\nparcelHelpers.export(exports, \"getKeyType\", ()=>getKeyType);\nvar _utils = require(\"../utils\");\nfunction getKeyValue(gl, name) {\n    if (typeof name !== \"string\") return name;\n    var number = Number(name);\n    if (!isNaN(number)) return number;\n    name = name.replace(/^.*\\./, \"\");\n    var value = gl[name];\n    (0, _utils.assert)(value !== undefined, \"Accessing undefined constant GL.\".concat(name));\n    return value;\n}\nfunction getKey(gl, value) {\n    value = Number(value);\n    for(var key in gl){\n        if (gl[key] === value) return \"GL.\".concat(key);\n    }\n    return String(value);\n}\nfunction getKeyType(gl, value) {\n    (0, _utils.assert)(value !== undefined, \"undefined key\");\n    value = Number(value);\n    for(var key in gl){\n        if (gl[key] === value) return \"GL.\".concat(key);\n    }\n    return String(value);\n}\n\n},{\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b1PWl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Buffer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _accessor = require(\"./accessor\");\nvar _accessorDefault = parcelHelpers.interopDefault(_accessor);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _utils = require(\"../utils\");\nvar DEBUG_DATA_LENGTH = 10;\nvar DEPRECATED_PROPS = {\n    offset: \"accessor.offset\",\n    stride: \"accessor.stride\",\n    type: \"accessor.type\",\n    size: \"accessor.size\",\n    divisor: \"accessor.divisor\",\n    normalized: \"accessor.normalized\",\n    integer: \"accessor.integer\",\n    instanced: \"accessor.divisor\",\n    isInstanced: \"accessor.divisor\"\n};\nvar PROP_CHECKS_INITIALIZE = {\n    removedProps: {},\n    replacedProps: {\n        bytes: \"byteLength\"\n    },\n    deprecatedProps: DEPRECATED_PROPS\n};\nvar PROP_CHECKS_SET_PROPS = {\n    removedProps: DEPRECATED_PROPS\n};\nvar Buffer = function(_Resource) {\n    (0, _inheritsDefault.default)(Buffer1, _Resource);\n    function Buffer1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Buffer1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Buffer1).call(this, gl, props));\n        _this.stubRemovedMethods(\"Buffer\", \"v6.0\", [\n            \"layout\",\n            \"setLayout\",\n            \"getIndexedParameter\"\n        ]);\n        _this.target = props.target || (_this.gl.webgl2 ? 36662 : 34962);\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Buffer1, [\n        {\n            key: \"getElementCount\",\n            value: function getElementCount() {\n                var accessor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.accessor;\n                return Math.round(this.byteLength / (0, _accessorDefault.default).getBytesPerElement(accessor));\n            }\n        },\n        {\n            key: \"getVertexCount\",\n            value: function getVertexCount() {\n                var accessor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.accessor;\n                return Math.round(this.byteLength / (0, _accessorDefault.default).getBytesPerVertex(accessor));\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (ArrayBuffer.isView(props)) props = {\n                    data: props\n                };\n                if (Number.isFinite(props)) props = {\n                    byteLength: props\n                };\n                props = (0, _utils.checkProps)(\"Buffer\", props, PROP_CHECKS_INITIALIZE);\n                this.usage = props.usage || 35044;\n                this.debugData = null;\n                this.setAccessor(Object.assign({}, props, props.accessor));\n                if (props.data) this._setData(props.data, props.offset, props.byteLength);\n                else this._setByteLength(props.byteLength || 0);\n                return this;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                props = (0, _utils.checkProps)(\"Buffer\", props, PROP_CHECKS_SET_PROPS);\n                if (\"accessor\" in props) this.setAccessor(props.accessor);\n                return this;\n            }\n        },\n        {\n            key: \"setAccessor\",\n            value: function setAccessor(accessor) {\n                accessor = Object.assign({}, accessor);\n                delete accessor.buffer;\n                this.accessor = new (0, _accessorDefault.default)(accessor);\n                return this;\n            }\n        },\n        {\n            key: \"reallocate\",\n            value: function reallocate(byteLength) {\n                if (byteLength > this.byteLength) {\n                    this._setByteLength(byteLength);\n                    return true;\n                }\n                this.bytesUsed = byteLength;\n                return false;\n            }\n        },\n        {\n            key: \"setData\",\n            value: function setData(props) {\n                return this.initialize(props);\n            }\n        },\n        {\n            key: \"subData\",\n            value: function subData(props) {\n                if (ArrayBuffer.isView(props)) props = {\n                    data: props\n                };\n                var _props = props, data = _props.data, _props$offset = _props.offset, offset = _props$offset === void 0 ? 0 : _props$offset, _props$srcOffset = _props.srcOffset, srcOffset = _props$srcOffset === void 0 ? 0 : _props$srcOffset;\n                var byteLength = props.byteLength || props.length;\n                (0, _utils.assert)(data);\n                var target = this.gl.webgl2 ? 36663 : this.target;\n                this.gl.bindBuffer(target, this.handle);\n                if (srcOffset !== 0 || byteLength !== undefined) {\n                    (0, _webglUtils.assertWebGL2Context)(this.gl);\n                    this.gl.bufferSubData(this.target, offset, data, srcOffset, byteLength);\n                } else this.gl.bufferSubData(target, offset, data);\n                this.gl.bindBuffer(target, null);\n                this.debugData = null;\n                this._inferType(data);\n                return this;\n            }\n        },\n        {\n            key: \"copyData\",\n            value: function copyData(_ref) {\n                var sourceBuffer = _ref.sourceBuffer, _ref$readOffset = _ref.readOffset, readOffset = _ref$readOffset === void 0 ? 0 : _ref$readOffset, _ref$writeOffset = _ref.writeOffset, writeOffset = _ref$writeOffset === void 0 ? 0 : _ref$writeOffset, size = _ref.size;\n                var gl = this.gl;\n                (0, _webglUtils.assertWebGL2Context)(gl);\n                gl.bindBuffer(36662, sourceBuffer.handle);\n                gl.bindBuffer(36663, this.handle);\n                gl.copyBufferSubData(36662, 36663, readOffset, writeOffset, size);\n                gl.bindBuffer(36662, null);\n                gl.bindBuffer(36663, null);\n                this.debugData = null;\n                return this;\n            }\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$dstData = _ref2.dstData, dstData = _ref2$dstData === void 0 ? null : _ref2$dstData, _ref2$srcByteOffset = _ref2.srcByteOffset, srcByteOffset = _ref2$srcByteOffset === void 0 ? 0 : _ref2$srcByteOffset, _ref2$dstOffset = _ref2.dstOffset, dstOffset = _ref2$dstOffset === void 0 ? 0 : _ref2$dstOffset, _ref2$length = _ref2.length, length = _ref2$length === void 0 ? 0 : _ref2$length;\n                (0, _webglUtils.assertWebGL2Context)(this.gl);\n                var ArrayType = (0, _webglUtils.getTypedArrayFromGLType)(this.accessor.type || 5126, {\n                    clamped: false\n                });\n                var sourceAvailableElementCount = this._getAvailableElementCount(srcByteOffset);\n                var dstElementOffset = dstOffset;\n                var dstAvailableElementCount;\n                var dstElementCount;\n                if (dstData) {\n                    dstElementCount = dstData.length;\n                    dstAvailableElementCount = dstElementCount - dstElementOffset;\n                } else {\n                    dstAvailableElementCount = Math.min(sourceAvailableElementCount, length || sourceAvailableElementCount);\n                    dstElementCount = dstElementOffset + dstAvailableElementCount;\n                }\n                var copyElementCount = Math.min(sourceAvailableElementCount, dstAvailableElementCount);\n                length = length || copyElementCount;\n                (0, _utils.assert)(length <= copyElementCount);\n                dstData = dstData || new ArrayType(dstElementCount);\n                this.gl.bindBuffer(36662, this.handle);\n                this.gl.getBufferSubData(36662, srcByteOffset, dstData, dstOffset, length);\n                this.gl.bindBuffer(36662, null);\n                return dstData;\n            }\n        },\n        {\n            key: \"bind\",\n            value: function bind() {\n                var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref3$target = _ref3.target, target = _ref3$target === void 0 ? this.target : _ref3$target, _ref3$index = _ref3.index, index = _ref3$index === void 0 ? this.accessor && this.accessor.index : _ref3$index, _ref3$offset = _ref3.offset, offset = _ref3$offset === void 0 ? 0 : _ref3$offset, size = _ref3.size;\n                if (target === 35345 || target === 35982) {\n                    if (size !== undefined) this.gl.bindBufferRange(target, index, this.handle, offset, size);\n                    else {\n                        (0, _utils.assert)(offset === 0);\n                        this.gl.bindBufferBase(target, index, this.handle);\n                    }\n                } else this.gl.bindBuffer(target, this.handle);\n                return this;\n            }\n        },\n        {\n            key: \"unbind\",\n            value: function unbind() {\n                var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref4$target = _ref4.target, target = _ref4$target === void 0 ? this.target : _ref4$target, _ref4$index = _ref4.index, index = _ref4$index === void 0 ? this.accessor && this.accessor.index : _ref4$index;\n                var isIndexedBuffer = target === 35345 || target === 35982;\n                if (isIndexedBuffer) this.gl.bindBufferBase(target, index, null);\n                else this.gl.bindBuffer(target, null);\n                return this;\n            }\n        },\n        {\n            key: \"getDebugData\",\n            value: function getDebugData() {\n                if (!this.debugData) {\n                    this.debugData = this.getData({\n                        length: Math.min(DEBUG_DATA_LENGTH, this.byteLength)\n                    });\n                    return {\n                        data: this.debugData,\n                        changed: true\n                    };\n                }\n                return {\n                    data: this.debugData,\n                    changed: false\n                };\n            }\n        },\n        {\n            key: \"invalidateDebugData\",\n            value: function invalidateDebugData() {\n                this.debugData = null;\n            }\n        },\n        {\n            key: \"_setData\",\n            value: function _setData(data) {\n                var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n                var byteLength = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : data.byteLength + offset;\n                (0, _utils.assert)(ArrayBuffer.isView(data));\n                this._trackDeallocatedMemory();\n                var target = this._getTarget();\n                this.gl.bindBuffer(target, this.handle);\n                this.gl.bufferData(target, byteLength, this.usage);\n                this.gl.bufferSubData(target, offset, data);\n                this.gl.bindBuffer(target, null);\n                this.debugData = data.slice(0, DEBUG_DATA_LENGTH);\n                this.bytesUsed = byteLength;\n                this._trackAllocatedMemory(byteLength);\n                var type = (0, _webglUtils.getGLTypeFromTypedArray)(data);\n                (0, _utils.assert)(type);\n                this.setAccessor(new (0, _accessorDefault.default)(this.accessor, {\n                    type: type\n                }));\n                return this;\n            }\n        },\n        {\n            key: \"_setByteLength\",\n            value: function _setByteLength(byteLength) {\n                var usage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.usage;\n                (0, _utils.assert)(byteLength >= 0);\n                this._trackDeallocatedMemory();\n                var data = byteLength;\n                if (byteLength === 0) data = new Float32Array(0);\n                var target = this._getTarget();\n                this.gl.bindBuffer(target, this.handle);\n                this.gl.bufferData(target, data, usage);\n                this.gl.bindBuffer(target, null);\n                this.usage = usage;\n                this.debugData = null;\n                this.bytesUsed = byteLength;\n                this._trackAllocatedMemory(byteLength);\n                return this;\n            }\n        },\n        {\n            key: \"_getTarget\",\n            value: function _getTarget() {\n                return this.gl.webgl2 ? 36663 : this.target;\n            }\n        },\n        {\n            key: \"_getAvailableElementCount\",\n            value: function _getAvailableElementCount(srcByteOffset) {\n                var ArrayType = (0, _webglUtils.getTypedArrayFromGLType)(this.accessor.type || 5126, {\n                    clamped: false\n                });\n                var sourceElementOffset = srcByteOffset / ArrayType.BYTES_PER_ELEMENT;\n                return this.getElementCount() - sourceElementOffset;\n            }\n        },\n        {\n            key: \"_inferType\",\n            value: function _inferType(data) {\n                if (!this.accessor.type) this.setAccessor(new (0, _accessorDefault.default)(this.accessor, {\n                    type: (0, _webglUtils.getGLTypeFromTypedArray)(data)\n                }));\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createBuffer();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteBuffer(this.handle);\n                this._trackDeallocatedMemory();\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname) {\n                this.gl.bindBuffer(this.target, this.handle);\n                var value = this.gl.getBufferParameter(this.target, pname);\n                this.gl.bindBuffer(this.target, null);\n                return value;\n            }\n        },\n        {\n            key: \"setByteLength\",\n            value: function setByteLength(byteLength) {\n                (0, _gltools.log).deprecated(\"setByteLength\", \"reallocate\")();\n                return this.reallocate(byteLength);\n            }\n        },\n        {\n            key: \"updateAccessor\",\n            value: function updateAccessor(opts) {\n                (0, _gltools.log).deprecated(\"updateAccessor(...)\", \"setAccessor(new Accessor(buffer.accessor, ...)\")();\n                this.accessor = new (0, _accessorDefault.default)(this.accessor, opts);\n                return this;\n            }\n        },\n        {\n            key: \"type\",\n            get: function get() {\n                (0, _gltools.log).deprecated(\"Buffer.type\", \"Buffer.accessor.type\")();\n                return this.accessor.type;\n            }\n        },\n        {\n            key: \"bytes\",\n            get: function get() {\n                (0, _gltools.log).deprecated(\"Buffer.bytes\", \"Buffer.byteLength\")();\n                return this.byteLength;\n            }\n        }\n    ]);\n    return Buffer1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./resource\":\"j3b8Q\",\"./accessor\":\"4UrSe\",\"../webgl-utils\":\"hZtIX\",\"@luma.gl/gltools\":\"7HW6a\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4UrSe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Accessor);\nparcelHelpers.export(exports, \"DEFAULT_ACCESSOR_VALUES\", ()=>DEFAULT_ACCESSOR_VALUES);\nvar _construct = require(\"@babel/runtime/helpers/esm/construct\");\nvar _constructDefault = parcelHelpers.interopDefault(_construct);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar DEFAULT_ACCESSOR_VALUES = {\n    offset: 0,\n    stride: 0,\n    type: 5126,\n    size: 1,\n    divisor: 0,\n    normalized: false,\n    integer: false\n};\nvar PROP_CHECKS = {\n    deprecatedProps: {\n        instanced: \"divisor\",\n        isInstanced: \"divisor\"\n    }\n};\nvar Accessor = function() {\n    (0, _createClassDefault.default)(Accessor1, null, [\n        {\n            key: \"getBytesPerElement\",\n            value: function getBytesPerElement(accessor) {\n                var ArrayType = (0, _webglUtils.getTypedArrayFromGLType)(accessor.type || 5126);\n                return ArrayType.BYTES_PER_ELEMENT;\n            }\n        },\n        {\n            key: \"getBytesPerVertex\",\n            value: function getBytesPerVertex(accessor) {\n                (0, _utils.assert)(accessor.size);\n                var ArrayType = (0, _webglUtils.getTypedArrayFromGLType)(accessor.type || 5126);\n                return ArrayType.BYTES_PER_ELEMENT * accessor.size;\n            }\n        },\n        {\n            key: \"resolve\",\n            value: function resolve() {\n                for(var _len = arguments.length, accessors = new Array(_len), _key = 0; _key < _len; _key++)accessors[_key] = arguments[_key];\n                return (0, _constructDefault.default)(Accessor1, [\n                    DEFAULT_ACCESSOR_VALUES\n                ].concat(accessors));\n            }\n        }\n    ]);\n    function Accessor1() {\n        var _this = this;\n        (0, _classCallCheckDefault.default)(this, Accessor1);\n        for(var _len2 = arguments.length, accessors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++)accessors[_key2] = arguments[_key2];\n        accessors.forEach(function(accessor) {\n            return _this._assign(accessor);\n        });\n        Object.freeze(this);\n    }\n    (0, _createClassDefault.default)(Accessor1, [\n        {\n            key: \"toString\",\n            value: function toString() {\n                return JSON.stringify(this);\n            }\n        },\n        {\n            key: \"_assign\",\n            value: function _assign() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                props = (0, _utils.checkProps)(\"Accessor\", props, PROP_CHECKS);\n                if (props.type !== undefined) {\n                    this.type = props.type;\n                    if (props.type === 5124 || props.type === 5125) this.integer = true;\n                }\n                if (props.size !== undefined) this.size = props.size;\n                if (props.offset !== undefined) this.offset = props.offset;\n                if (props.stride !== undefined) this.stride = props.stride;\n                if (props.normalized !== undefined) this.normalized = props.normalized;\n                if (props.integer !== undefined) this.integer = props.integer;\n                if (props.divisor !== undefined) this.divisor = props.divisor;\n                if (props.buffer !== undefined) this.buffer = props.buffer;\n                if (props.index !== undefined) {\n                    if (typeof index === \"boolean\") this.index = props.index ? 1 : 0;\n                    else this.index = props.index;\n                }\n                if (props.instanced !== undefined) this.divisor = props.instanced ? 1 : 0;\n                if (props.isInstanced !== undefined) this.divisor = props.isInstanced ? 1 : 0;\n                return this;\n            }\n        },\n        {\n            key: \"BYTES_PER_ELEMENT\",\n            get: function get() {\n                return Accessor1.getBytesPerElement(this);\n            }\n        },\n        {\n            key: \"BYTES_PER_VERTEX\",\n            get: function get() {\n                return Accessor1.getBytesPerVertex(this);\n            }\n        }\n    ]);\n    return Accessor1;\n}();\n\n},{\"@babel/runtime/helpers/esm/construct\":\"8z12u\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../webgl-utils\":\"hZtIX\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8z12u\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _setPrototypeOfJs = require(\"./setPrototypeOf.js\");\nvar _setPrototypeOfJsDefault = parcelHelpers.interopDefault(_setPrototypeOfJs);\nvar _isNativeReflectConstructJs = require(\"./isNativeReflectConstruct.js\");\nvar _isNativeReflectConstructJsDefault = parcelHelpers.interopDefault(_isNativeReflectConstructJs);\nfunction _construct(Parent1, args1, Class1) {\n    if ((0, _isNativeReflectConstructJsDefault.default)()) _construct = Reflect.construct.bind();\n    else _construct = function _construct(Parent, args, Class) {\n        var a = [\n            null\n        ];\n        a.push.apply(a, args);\n        var Constructor = Function.bind.apply(Parent, a);\n        var instance = new Constructor();\n        if (Class) (0, _setPrototypeOfJsDefault.default)(instance, Class.prototype);\n        return instance;\n    };\n    return _construct.apply(null, arguments);\n}\nexports.default = _construct;\n\n},{\"./setPrototypeOf.js\":\"1Wga1\",\"./isNativeReflectConstruct.js\":\"lc3MM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lc3MM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nexports.default = _isNativeReflectConstruct;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Z7l8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TEXTURE_FORMATS\", ()=>TEXTURE_FORMATS);\nparcelHelpers.export(exports, \"DATA_FORMAT_CHANNELS\", ()=>DATA_FORMAT_CHANNELS);\nparcelHelpers.export(exports, \"TYPE_SIZES\", ()=>TYPE_SIZES);\nparcelHelpers.export(exports, \"isFormatSupported\", ()=>isFormatSupported);\nparcelHelpers.export(exports, \"isLinearFilteringSupported\", ()=>isLinearFilteringSupported);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _TEXTURE_FORMATS, _DATA_FORMAT_CHANNELS, _TYPE_SIZES;\nvar TEXTURE_FORMATS = (_TEXTURE_FORMATS = {}, (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6407, {\n    dataFormat: 6407,\n    types: [\n        5121,\n        33635\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6408, {\n    dataFormat: 6408,\n    types: [\n        5121,\n        32819,\n        32820\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6406, {\n    dataFormat: 6406,\n    types: [\n        5121\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6409, {\n    dataFormat: 6409,\n    types: [\n        5121\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6410, {\n    dataFormat: 6410,\n    types: [\n        5121\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 33326, {\n    dataFormat: 6403,\n    types: [\n        5126\n    ],\n    gl2: true\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 33328, {\n    dataFormat: 33319,\n    types: [\n        5126\n    ],\n    gl2: true\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 34837, {\n    dataFormat: 6407,\n    types: [\n        5126\n    ],\n    gl2: true\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 34836, {\n    dataFormat: 6408,\n    types: [\n        5126\n    ],\n    gl2: true\n}), _TEXTURE_FORMATS);\nvar DATA_FORMAT_CHANNELS = (_DATA_FORMAT_CHANNELS = {}, (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6403, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 36244, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 33319, 2), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 33320, 2), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6407, 3), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 36248, 3), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6408, 4), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 36249, 4), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6402, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 34041, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6406, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6409, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6410, 2), _DATA_FORMAT_CHANNELS);\nvar TYPE_SIZES = (_TYPE_SIZES = {}, (0, _definePropertyDefault.default)(_TYPE_SIZES, 5126, 4), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5125, 4), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5124, 4), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5123, 2), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5122, 2), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5131, 2), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5120, 1), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5121, 1), _TYPE_SIZES);\nfunction isFormatSupported(gl, format) {\n    var info = TEXTURE_FORMATS[format];\n    if (!info) return false;\n    if (info.gl1 === undefined && info.gl2 === undefined) return true;\n    var value = (0, _gltools.isWebGL2)(gl) ? info.gl2 || info.gl1 : info.gl1;\n    return typeof value === \"string\" ? gl.getExtension(value) : value;\n}\nfunction isLinearFilteringSupported(gl, format) {\n    var info = TEXTURE_FORMATS[format];\n    switch(info && info.types[0]){\n        case 5126:\n            return gl.getExtension(\"OES_texture_float_linear\");\n        case 5131:\n            return gl.getExtension(\"OES_texture_half_float_linear\");\n        default:\n            return true;\n    }\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@luma.gl/gltools\":\"7HW6a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"new3Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>setPathPrefix);\nparcelHelpers.export(exports, \"loadFile\", ()=>loadFile);\nparcelHelpers.export(exports, \"loadImage\", ()=>loadImage);\nvar _utils = require(\"../utils\");\nvar pathPrefix = \"\";\nfunction setPathPrefix(prefix) {\n    pathPrefix = prefix;\n}\nfunction loadFile(url) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _utils.assert)(typeof url === \"string\");\n    url = pathPrefix + url;\n    var dataType = options.dataType || \"text\";\n    return fetch(url, options).then(function(res) {\n        return res[dataType]();\n    });\n}\nfunction loadImage(url, opts) {\n    (0, _utils.assert)(typeof url === \"string\");\n    url = pathPrefix + url;\n    return new Promise(function(resolve, reject) {\n        try {\n            var image = new Image();\n            image.onload = function() {\n                return resolve(image);\n            };\n            image.onerror = function() {\n                return reject(new Error(\"Could not load image \".concat(url, \".\")));\n            };\n            image.crossOrigin = opts && opts.crossOrigin || \"anonymous\";\n            image.src = url;\n        } catch (error) {\n            reject(error);\n        }\n    });\n}\n\n},{\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jRimD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TextureCube);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _webglUtils = require(\"../webgl-utils\");\nvar FACES = [\n    34069,\n    34070,\n    34071,\n    34072,\n    34073,\n    34074\n];\nvar TextureCube = function(_Texture) {\n    (0, _inheritsDefault.default)(TextureCube1, _Texture);\n    function TextureCube1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, TextureCube1);\n        (0, _webglUtils.assertWebGLContext)(gl);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(TextureCube1).call(this, gl, Object.assign({}, props, {\n            target: 34067\n        })));\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(TextureCube1, [\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var _this2 = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _props$mipmaps = props.mipmaps, mipmaps = _props$mipmaps === void 0 ? true : _props$mipmaps, _props$parameters = props.parameters, parameters = _props$parameters === void 0 ? {} : _props$parameters;\n                this.opts = props;\n                this.setCubeMapImageData(props).then(function() {\n                    _this2.loaded = true;\n                    if (mipmaps) _this2.generateMipmap(props);\n                    _this2.setParameters(parameters);\n                });\n            }\n        },\n        {\n            key: \"subImage\",\n            value: function subImage(_ref) {\n                var face = _ref.face, data = _ref.data, _ref$x = _ref.x, x = _ref$x === void 0 ? 0 : _ref$x, _ref$y = _ref.y, y = _ref$y === void 0 ? 0 : _ref$y, _ref$mipmapLevel = _ref.mipmapLevel, mipmapLevel = _ref$mipmapLevel === void 0 ? 0 : _ref$mipmapLevel;\n                return this._subImage({\n                    target: face,\n                    data: data,\n                    x: x,\n                    y: y,\n                    mipmapLevel: mipmapLevel\n                });\n            }\n        },\n        {\n            key: \"setCubeMapImageData\",\n            value: function() {\n                var _setCubeMapImageData = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(_ref2) {\n                    var _this3 = this;\n                    var width, height, pixels, data, _ref2$border, border, _ref2$format, format, _ref2$type, type, gl, imageDataMap, resolvedFaces;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                width = _ref2.width, height = _ref2.height, pixels = _ref2.pixels, data = _ref2.data, _ref2$border = _ref2.border, border = _ref2$border === void 0 ? 0 : _ref2$border, _ref2$format = _ref2.format, format = _ref2$format === void 0 ? 6408 : _ref2$format, _ref2$type = _ref2.type, type = _ref2$type === void 0 ? 5121 : _ref2$type;\n                                gl = this.gl;\n                                imageDataMap = pixels || data;\n                                _context.next = 5;\n                                return Promise.all(FACES.map(function(face) {\n                                    var facePixels = imageDataMap[face];\n                                    return Promise.all(Array.isArray(facePixels) ? facePixels : [\n                                        facePixels\n                                    ]);\n                                }));\n                            case 5:\n                                resolvedFaces = _context.sent;\n                                this.bind();\n                                FACES.forEach(function(face, index) {\n                                    if (resolvedFaces[index].length > 1 && _this3.opts.mipmaps !== false) (0, _gltools.log).warn(\"\".concat(_this3.id, \" has mipmap and multiple LODs.\"))();\n                                    resolvedFaces[index].forEach(function(image, lodLevel) {\n                                        if (width && height) gl.texImage2D(face, lodLevel, format, width, height, border, format, type, image);\n                                        else gl.texImage2D(face, lodLevel, format, format, type, image);\n                                    });\n                                });\n                                this.unbind();\n                            case 9:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this);\n                }));\n                function setCubeMapImageData(_x) {\n                    return _setCubeMapImageData.apply(this, arguments);\n                }\n                return setCubeMapImageData;\n            }()\n        },\n        {\n            key: \"setImageDataForFace\",\n            value: function setImageDataForFace(options) {\n                var _this4 = this;\n                var face = options.face, width = options.width, height = options.height, pixels = options.pixels, data = options.data, _options$border = options.border, border = _options$border === void 0 ? 0 : _options$border, _options$format = options.format, format = _options$format === void 0 ? 6408 : _options$format, _options$type = options.type, type = _options$type === void 0 ? 5121 : _options$type;\n                var gl = this.gl;\n                var imageData = pixels || data;\n                this.bind();\n                if (imageData instanceof Promise) imageData.then(function(resolvedImageData) {\n                    return _this4.setImageDataForFace(Object.assign({}, options, {\n                        face: face,\n                        data: resolvedImageData,\n                        pixels: resolvedImageData\n                    }));\n                });\n                else if (this.width || this.height) gl.texImage2D(face, 0, format, width, height, border, format, type, imageData);\n                else gl.texImage2D(face, 0, format, format, type, imageData);\n                return this;\n            }\n        }\n    ]);\n    return TextureCube1;\n}((0, _textureDefault.default));\nTextureCube.FACES = FACES;\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@luma.gl/gltools\":\"7HW6a\",\"./texture\":\"fa6ef\",\"../webgl-utils\":\"hZtIX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"67D1a\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Texture3D);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _textureFormats = require(\"./texture-formats\");\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar Texture3D = function(_Texture) {\n    (0, _inheritsDefault.default)(Texture3D1, _Texture);\n    (0, _createClassDefault.default)(Texture3D1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                return (0, _gltools.isWebGL2)(gl);\n            }\n        }\n    ]);\n    function Texture3D1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Texture3D1);\n        (0, _webglUtils.assertWebGL2Context)(gl);\n        props = Object.assign({\n            depth: 1\n        }, props, {\n            target: 32879,\n            unpackFlipY: false\n        });\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Texture3D1).call(this, gl, props));\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Texture3D1, [\n        {\n            key: \"setImageData\",\n            value: function setImageData(_ref) {\n                var _this2 = this;\n                var _ref$level = _ref.level, level = _ref$level === void 0 ? 0 : _ref$level, _ref$dataFormat = _ref.dataFormat, dataFormat = _ref$dataFormat === void 0 ? 6408 : _ref$dataFormat, width = _ref.width, height = _ref.height, _ref$depth = _ref.depth, depth = _ref$depth === void 0 ? 1 : _ref$depth, _ref$border = _ref.border, border = _ref$border === void 0 ? 0 : _ref$border, format = _ref.format, _ref$type = _ref.type, type = _ref$type === void 0 ? 5121 : _ref$type, _ref$offset = _ref.offset, offset = _ref$offset === void 0 ? 0 : _ref$offset, data = _ref.data, _ref$parameters = _ref.parameters, parameters = _ref$parameters === void 0 ? {} : _ref$parameters;\n                this._trackDeallocatedMemory(\"Texture\");\n                this.gl.bindTexture(this.target, this.handle);\n                (0, _gltools.withParameters)(this.gl, parameters, function() {\n                    if (ArrayBuffer.isView(data)) _this2.gl.texImage3D(_this2.target, level, dataFormat, width, height, depth, border, format, type, data);\n                    if (data instanceof (0, _bufferDefault.default)) {\n                        _this2.gl.bindBuffer(35052, data.handle);\n                        _this2.gl.texImage3D(_this2.target, level, dataFormat, width, height, depth, border, format, type, offset);\n                    }\n                });\n                if (data && data.byteLength) this._trackAllocatedMemory(data.byteLength, \"Texture\");\n                else {\n                    var channels = (0, _textureFormats.DATA_FORMAT_CHANNELS)[this.dataFormat] || 4;\n                    var channelSize = (0, _textureFormats.TYPE_SIZES)[this.type] || 1;\n                    this._trackAllocatedMemory(this.width * this.height * this.depth * channels * channelSize, \"Texture\");\n                }\n                this.loaded = true;\n                return this;\n            }\n        }\n    ]);\n    return Texture3D1;\n}((0, _textureDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@luma.gl/gltools\":\"7HW6a\",\"../webgl-utils\":\"hZtIX\",\"./texture\":\"fa6ef\",\"./texture-formats\":\"5Z7l8\",\"./buffer\":\"b1PWl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3wciM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Framebuffer);\nparcelHelpers.export(exports, \"FRAMEBUFFER_ATTACHMENT_PARAMETERS\", ()=>FRAMEBUFFER_ATTACHMENT_PARAMETERS);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _texture2D = require(\"./texture-2d\");\nvar _texture2DDefault = parcelHelpers.interopDefault(_texture2D);\nvar _renderbuffer = require(\"./renderbuffer\");\nvar _renderbufferDefault = parcelHelpers.interopDefault(_renderbuffer);\nvar _clear = require(\"./clear\");\nvar _copyAndBlitJs = require(\"./copy-and-blit.js\");\nvar _features = require(\"../features\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar ERR_MULTIPLE_RENDERTARGETS = \"Multiple render targets not supported\";\nvar Framebuffer = function(_Resource) {\n    (0, _inheritsDefault.default)(Framebuffer1, _Resource);\n    (0, _createClassDefault.default)(Framebuffer1, [\n        {\n            key: \"MAX_COLOR_ATTACHMENTS\",\n            get: function get() {\n                return this.gl.getParameter(this.gl.MAX_COLOR_ATTACHMENTS);\n            }\n        },\n        {\n            key: \"MAX_DRAW_BUFFERS\",\n            get: function get() {\n                return this.gl.getParameter(this.gl.MAX_DRAW_BUFFERS);\n            }\n        }\n    ], [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, colorBufferFloat = _ref.colorBufferFloat, colorBufferHalfFloat = _ref.colorBufferHalfFloat;\n                var supported = true;\n                if (colorBufferFloat) supported = Boolean(gl.getExtension(\"EXT_color_buffer_float\") || gl.getExtension(\"WEBGL_color_buffer_float\") || gl.getExtension(\"OES_texture_float\"));\n                if (colorBufferHalfFloat) supported = supported && Boolean(gl.getExtension(\"EXT_color_buffer_float\") || gl.getExtension(\"EXT_color_buffer_half_float\"));\n                return supported;\n            }\n        },\n        {\n            key: \"getDefaultFramebuffer\",\n            value: function getDefaultFramebuffer(gl) {\n                gl.luma = gl.luma || {};\n                gl.luma.defaultFramebuffer = gl.luma.defaultFramebuffer || new Framebuffer1(gl, {\n                    id: \"default-framebuffer\",\n                    handle: null,\n                    attachments: {}\n                });\n                return gl.luma.defaultFramebuffer;\n            }\n        }\n    ]);\n    function Framebuffer1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Framebuffer1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Framebuffer1).call(this, gl, opts));\n        _this.width = null;\n        _this.height = null;\n        _this.attachments = {};\n        _this.readBuffer = 36064;\n        _this.drawBuffers = [\n            36064\n        ];\n        _this.ownResources = [];\n        _this.initialize(opts);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Framebuffer1, [\n        {\n            key: \"initialize\",\n            value: function initialize(_ref2) {\n                var _ref2$width = _ref2.width, width = _ref2$width === void 0 ? 1 : _ref2$width, _ref2$height = _ref2.height, height = _ref2$height === void 0 ? 1 : _ref2$height, _ref2$attachments = _ref2.attachments, attachments = _ref2$attachments === void 0 ? null : _ref2$attachments, _ref2$color = _ref2.color, color = _ref2$color === void 0 ? true : _ref2$color, _ref2$depth = _ref2.depth, depth = _ref2$depth === void 0 ? true : _ref2$depth, _ref2$stencil = _ref2.stencil, stencil = _ref2$stencil === void 0 ? false : _ref2$stencil, _ref2$check = _ref2.check, check = _ref2$check === void 0 ? true : _ref2$check, readBuffer = _ref2.readBuffer, drawBuffers = _ref2.drawBuffers;\n                (0, _utils.assert)(width >= 0 && height >= 0, \"Width and height need to be integers\");\n                this.width = width;\n                this.height = height;\n                if (attachments) for(var attachment in attachments){\n                    var target = attachments[attachment];\n                    var object = Array.isArray(target) ? target[0] : target;\n                    object.resize({\n                        width: width,\n                        height: height\n                    });\n                }\n                else attachments = this._createDefaultAttachments(color, depth, stencil, width, height);\n                this.update({\n                    clearAttachments: true,\n                    attachments: attachments,\n                    readBuffer: readBuffer,\n                    drawBuffers: drawBuffers\n                });\n                if (attachments && check) this.checkStatus();\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = this.ownResources[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var resource = _step.value;\n                        resource[\"delete\"]();\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Framebuffer1.prototype), \"delete\", this).call(this);\n            }\n        },\n        {\n            key: \"update\",\n            value: function update(_ref3) {\n                var _ref3$attachments = _ref3.attachments, attachments = _ref3$attachments === void 0 ? {} : _ref3$attachments, readBuffer = _ref3.readBuffer, drawBuffers = _ref3.drawBuffers, _ref3$clearAttachment = _ref3.clearAttachments, clearAttachments = _ref3$clearAttachment === void 0 ? false : _ref3$clearAttachment, _ref3$resizeAttachmen = _ref3.resizeAttachments, resizeAttachments = _ref3$resizeAttachmen === void 0 ? true : _ref3$resizeAttachmen;\n                this.attach(attachments, {\n                    clearAttachments: clearAttachments,\n                    resizeAttachments: resizeAttachments\n                });\n                var gl = this.gl;\n                var prevHandle = gl.bindFramebuffer(36160, this.handle);\n                if (readBuffer) this._setReadBuffer(readBuffer);\n                if (drawBuffers) this._setDrawBuffers(drawBuffers);\n                gl.bindFramebuffer(36160, prevHandle || null);\n                return this;\n            }\n        },\n        {\n            key: \"resize\",\n            value: function resize() {\n                var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, width = _ref4.width, height = _ref4.height;\n                if (this.handle === null) {\n                    (0, _utils.assert)(width === undefined && height === undefined);\n                    this.width = this.gl.drawingBufferWidth;\n                    this.height = this.gl.drawingBufferHeight;\n                    return this;\n                }\n                if (width === undefined) width = this.gl.drawingBufferWidth;\n                if (height === undefined) height = this.gl.drawingBufferHeight;\n                if (width !== this.width && height !== this.height) (0, _gltools.log).log(2, \"Resizing framebuffer \".concat(this.id, \" to \").concat(width, \"x\").concat(height))();\n                for(var attachmentPoint in this.attachments)this.attachments[attachmentPoint].resize({\n                    width: width,\n                    height: height\n                });\n                this.width = width;\n                this.height = height;\n                return this;\n            }\n        },\n        {\n            key: \"attach\",\n            value: function attach(attachments) {\n                var _this2 = this;\n                var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref5$clearAttachment = _ref5.clearAttachments, clearAttachments = _ref5$clearAttachment === void 0 ? false : _ref5$clearAttachment, _ref5$resizeAttachmen = _ref5.resizeAttachments, resizeAttachments = _ref5$resizeAttachmen === void 0 ? true : _ref5$resizeAttachmen;\n                var newAttachments = {};\n                if (clearAttachments) Object.keys(this.attachments).forEach(function(key) {\n                    newAttachments[key] = null;\n                });\n                Object.assign(newAttachments, attachments);\n                var prevHandle = this.gl.bindFramebuffer(36160, this.handle);\n                for(var key1 in newAttachments){\n                    (0, _utils.assert)(key1 !== undefined, \"Misspelled framebuffer binding point?\");\n                    var attachment = Number(key1);\n                    var descriptor = newAttachments[attachment];\n                    var object = descriptor;\n                    if (!object) this._unattach(attachment);\n                    else if (object instanceof (0, _renderbufferDefault.default)) this._attachRenderbuffer({\n                        attachment: attachment,\n                        renderbuffer: object\n                    });\n                    else if (Array.isArray(descriptor)) {\n                        var _descriptor = (0, _slicedToArrayDefault.default)(descriptor, 3), texture = _descriptor[0], _descriptor$ = _descriptor[1], layer = _descriptor$ === void 0 ? 0 : _descriptor$, _descriptor$2 = _descriptor[2], level = _descriptor$2 === void 0 ? 0 : _descriptor$2;\n                        object = texture;\n                        this._attachTexture({\n                            attachment: attachment,\n                            texture: texture,\n                            layer: layer,\n                            level: level\n                        });\n                    } else this._attachTexture({\n                        attachment: attachment,\n                        texture: object,\n                        layer: 0,\n                        level: 0\n                    });\n                    if (resizeAttachments && object) object.resize({\n                        width: this.width,\n                        height: this.height\n                    });\n                }\n                this.gl.bindFramebuffer(36160, prevHandle || null);\n                Object.assign(this.attachments, attachments);\n                Object.keys(this.attachments).filter(function(key) {\n                    return !_this2.attachments[key];\n                }).forEach(function(key) {\n                    delete _this2.attachments[key];\n                });\n            }\n        },\n        {\n            key: \"checkStatus\",\n            value: function checkStatus() {\n                var gl = this.gl;\n                var status = this.getStatus();\n                if (status !== 36053) throw new Error(_getFrameBufferStatus(status));\n                return this;\n            }\n        },\n        {\n            key: \"getStatus\",\n            value: function getStatus() {\n                var gl = this.gl;\n                var prevHandle = gl.bindFramebuffer(36160, this.handle);\n                var status = gl.checkFramebufferStatus(36160);\n                gl.bindFramebuffer(36160, prevHandle || null);\n                return status;\n            }\n        },\n        {\n            key: \"clear\",\n            value: function clear() {\n                var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, color = _ref6.color, depth = _ref6.depth, stencil = _ref6.stencil, _ref6$drawBuffers = _ref6.drawBuffers, drawBuffers = _ref6$drawBuffers === void 0 ? [] : _ref6$drawBuffers;\n                var prevHandle = this.gl.bindFramebuffer(36160, this.handle);\n                if (color || depth || stencil) (0, _clear.clear)(this.gl, {\n                    color: color,\n                    depth: depth,\n                    stencil: stencil\n                });\n                drawBuffers.forEach(function(value, drawBuffer) {\n                    (0, _clear.clearBuffer)({\n                        drawBuffer: drawBuffer,\n                        value: value\n                    });\n                });\n                this.gl.bindFramebuffer(36160, prevHandle || null);\n                return this;\n            }\n        },\n        {\n            key: \"readPixels\",\n            value: function readPixels() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.readPixels() is no logner supported, use readPixelsToArray(framebuffer)\")();\n                return null;\n            }\n        },\n        {\n            key: \"readPixelsToBuffer\",\n            value: function readPixelsToBuffer() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.readPixelsToBuffer()is no logner supported, use readPixelsToBuffer(framebuffer)\")();\n                return null;\n            }\n        },\n        {\n            key: \"copyToDataUrl\",\n            value: function copyToDataUrl() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.copyToDataUrl() is no logner supported, use copyToDataUrl(framebuffer)\")();\n                return null;\n            }\n        },\n        {\n            key: \"copyToImage\",\n            value: function copyToImage() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.copyToImage() is no logner supported, use copyToImage(framebuffer)\")();\n                return null;\n            }\n        },\n        {\n            key: \"copyToTexture\",\n            value: function copyToTexture() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.copyToTexture({...}) is no logner supported, use copyToTexture(source, target, opts})\")();\n                return null;\n            }\n        },\n        {\n            key: \"blit\",\n            value: function blit() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.blit({...}) is no logner supported, use blit(source, target, opts)\")();\n                return null;\n            }\n        },\n        {\n            key: \"invalidate\",\n            value: function invalidate(_ref7) {\n                var _ref7$attachments = _ref7.attachments, attachments = _ref7$attachments === void 0 ? [] : _ref7$attachments, _ref7$x = _ref7.x, x = _ref7$x === void 0 ? 0 : _ref7$x, _ref7$y = _ref7.y, y = _ref7$y === void 0 ? 0 : _ref7$y, width = _ref7.width, height = _ref7.height;\n                var gl = this.gl;\n                (0, _webglUtils.assertWebGL2Context)(gl);\n                var prevHandle = gl.bindFramebuffer(36008, this.handle);\n                var invalidateAll = x === 0 && y === 0 && width === undefined && height === undefined;\n                if (invalidateAll) gl.invalidateFramebuffer(36008, attachments);\n                else gl.invalidateFramebuffer(36008, attachments, x, y, width, height);\n                gl.bindFramebuffer(36008, prevHandle);\n                return this;\n            }\n        },\n        {\n            key: \"getAttachmentParameter\",\n            value: function getAttachmentParameter(attachment, pname, keys) {\n                var value = this._getAttachmentParameterFallback(pname);\n                if (value === null) {\n                    this.gl.bindFramebuffer(36160, this.handle);\n                    value = this.gl.getFramebufferAttachmentParameter(36160, attachment, pname);\n                    this.gl.bindFramebuffer(36160, null);\n                }\n                if (keys && value > 1000) value = (0, _webglUtils.getKey)(this.gl, value);\n                return value;\n            }\n        },\n        {\n            key: \"getAttachmentParameters\",\n            value: function getAttachmentParameters() {\n                var attachment = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 36064;\n                var keys = arguments.length > 1 ? arguments[1] : undefined;\n                var parameters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.constructor.ATTACHMENT_PARAMETERS || [];\n                var values = {};\n                var _iteratorNormalCompletion2 = true;\n                var _didIteratorError2 = false;\n                var _iteratorError2 = undefined;\n                try {\n                    for(var _iterator2 = parameters[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                        var pname = _step2.value;\n                        var key = keys ? (0, _webglUtils.getKey)(this.gl, pname) : pname;\n                        values[key] = this.getAttachmentParameter(attachment, pname, keys);\n                    }\n                } catch (err) {\n                    _didIteratorError2 = true;\n                    _iteratorError2 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n                    } finally{\n                        if (_didIteratorError2) throw _iteratorError2;\n                    }\n                }\n                return values;\n            }\n        },\n        {\n            key: \"getParameters\",\n            value: function getParameters() {\n                var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n                var attachments = Object.keys(this.attachments);\n                var parameters = {};\n                for(var _i = 0, _attachments = attachments; _i < _attachments.length; _i++){\n                    var attachmentName = _attachments[_i];\n                    var attachment = Number(attachmentName);\n                    var key = keys ? (0, _webglUtils.getKey)(this.gl, attachment) : attachment;\n                    parameters[key] = this.getAttachmentParameters(attachment, keys);\n                }\n                return parameters;\n            }\n        },\n        {\n            key: \"show\",\n            value: function show() {\n                if (typeof window !== \"undefined\") window.open((0, _copyAndBlitJs.copyToDataUrl)(this), \"luma-debug-texture\");\n                return this;\n            }\n        },\n        {\n            key: \"log\",\n            value: function log() {\n                var logLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n                var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n                if (logLevel > (0, _gltools.log).level || typeof window === \"undefined\") return this;\n                message = message || \"Framebuffer \".concat(this.id);\n                var image = (0, _copyAndBlitJs.copyToDataUrl)(this, {\n                    maxHeight: 100\n                });\n                (0, _gltools.log).image({\n                    logLevel: logLevel,\n                    message: message,\n                    image: image\n                }, message)();\n                return this;\n            }\n        },\n        {\n            key: \"bind\",\n            value: function bind() {\n                var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref8$target = _ref8.target, target = _ref8$target === void 0 ? 36160 : _ref8$target;\n                this.gl.bindFramebuffer(target, this.handle);\n                return this;\n            }\n        },\n        {\n            key: \"unbind\",\n            value: function unbind() {\n                var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref9$target = _ref9.target, target = _ref9$target === void 0 ? 36160 : _ref9$target;\n                this.gl.bindFramebuffer(target, null);\n                return this;\n            }\n        },\n        {\n            key: \"_createDefaultAttachments\",\n            value: function _createDefaultAttachments(color, depth, stencil, width, height) {\n                var defaultAttachments = null;\n                if (color) {\n                    var _parameters;\n                    defaultAttachments = defaultAttachments || {};\n                    defaultAttachments[36064] = new (0, _texture2DDefault.default)(this.gl, {\n                        id: \"\".concat(this.id, \"-color0\"),\n                        pixels: null,\n                        format: 6408,\n                        type: 5121,\n                        width: width,\n                        height: height,\n                        mipmaps: false,\n                        parameters: (_parameters = {}, (0, _definePropertyDefault.default)(_parameters, 10241, 9729), (0, _definePropertyDefault.default)(_parameters, 10240, 9729), (0, _definePropertyDefault.default)(_parameters, 10242, 33071), (0, _definePropertyDefault.default)(_parameters, 10243, 33071), _parameters)\n                    });\n                    this.ownResources.push(defaultAttachments[36064]);\n                }\n                if (depth && stencil) {\n                    defaultAttachments = defaultAttachments || {};\n                    defaultAttachments[33306] = new (0, _renderbufferDefault.default)(this.gl, {\n                        id: \"\".concat(this.id, \"-depth-stencil\"),\n                        format: 35056,\n                        width: width,\n                        height: 111\n                    });\n                    this.ownResources.push(defaultAttachments[33306]);\n                } else if (depth) {\n                    defaultAttachments = defaultAttachments || {};\n                    defaultAttachments[36096] = new (0, _renderbufferDefault.default)(this.gl, {\n                        id: \"\".concat(this.id, \"-depth\"),\n                        format: 33189,\n                        width: width,\n                        height: height\n                    });\n                    this.ownResources.push(defaultAttachments[36096]);\n                } else if (stencil) (0, _utils.assert)(false);\n                return defaultAttachments;\n            }\n        },\n        {\n            key: \"_unattach\",\n            value: function _unattach(attachment) {\n                var oldAttachment = this.attachments[attachment];\n                if (!oldAttachment) return;\n                if (oldAttachment instanceof (0, _renderbufferDefault.default)) this.gl.framebufferRenderbuffer(36160, attachment, 36161, null);\n                else this.gl.framebufferTexture2D(36160, attachment, 3553, null, 0);\n                delete this.attachments[attachment];\n            }\n        },\n        {\n            key: \"_attachRenderbuffer\",\n            value: function _attachRenderbuffer(_ref10) {\n                var _ref10$attachment = _ref10.attachment, attachment = _ref10$attachment === void 0 ? 36064 : _ref10$attachment, renderbuffer = _ref10.renderbuffer;\n                var gl = this.gl;\n                gl.framebufferRenderbuffer(36160, attachment, 36161, renderbuffer.handle);\n                this.attachments[attachment] = renderbuffer;\n            }\n        },\n        {\n            key: \"_attachTexture\",\n            value: function _attachTexture(_ref11) {\n                var _ref11$attachment = _ref11.attachment, attachment = _ref11$attachment === void 0 ? 36064 : _ref11$attachment, texture = _ref11.texture, layer = _ref11.layer, level = _ref11.level;\n                var gl = this.gl;\n                gl.bindTexture(texture.target, texture.handle);\n                switch(texture.target){\n                    case 35866:\n                    case 32879:\n                        gl.framebufferTextureLayer(36160, attachment, texture.target, level, layer);\n                        break;\n                    case 34067:\n                        var face = mapIndexToCubeMapFace(layer);\n                        gl.framebufferTexture2D(36160, attachment, face, texture.handle, level);\n                        break;\n                    case 3553:\n                        gl.framebufferTexture2D(36160, attachment, 3553, texture.handle, level);\n                        break;\n                    default:\n                        (0, _utils.assert)(false, \"Illegal texture type\");\n                }\n                gl.bindTexture(texture.target, null);\n                this.attachments[attachment] = texture;\n            }\n        },\n        {\n            key: \"_setReadBuffer\",\n            value: function _setReadBuffer(readBuffer) {\n                var gl = this.gl;\n                if ((0, _gltools.isWebGL2)(gl)) gl.readBuffer(readBuffer);\n                else (0, _utils.assert)(readBuffer === 36064 || readBuffer === 1029, ERR_MULTIPLE_RENDERTARGETS);\n                this.readBuffer = readBuffer;\n            }\n        },\n        {\n            key: \"_setDrawBuffers\",\n            value: function _setDrawBuffers(drawBuffers) {\n                var gl = this.gl;\n                if ((0, _gltools.isWebGL2)(gl)) gl.drawBuffers(drawBuffers);\n                else {\n                    var ext = gl.getExtension(\"WEBGL.draw_buffers\");\n                    if (ext) ext.drawBuffersWEBGL(drawBuffers);\n                    else (0, _utils.assert)(drawBuffers.length === 1 && (drawBuffers[0] === 36064 || drawBuffers[0] === 1029), ERR_MULTIPLE_RENDERTARGETS);\n                }\n                this.drawBuffers = drawBuffers;\n            }\n        },\n        {\n            key: \"_getAttachmentParameterFallback\",\n            value: function _getAttachmentParameterFallback(pname) {\n                var caps = (0, _features.getFeatures)(this.gl);\n                switch(pname){\n                    case 36052:\n                        return !caps.WEBGL2 ? 0 : null;\n                    case 33298:\n                    case 33299:\n                    case 33300:\n                    case 33301:\n                    case 33302:\n                    case 33303:\n                        return !caps.WEBGL2 ? 8 : null;\n                    case 33297:\n                        return !caps.WEBGL2 ? 5125 : null;\n                    case 33296:\n                        return !caps.WEBGL2 && !caps.EXT_sRGB ? 9729 : null;\n                    default:\n                        return null;\n                }\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createFramebuffer();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteFramebuffer(this.handle);\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle(handle) {\n                return this.gl.bindFramebuffer(36160, handle);\n            }\n        },\n        {\n            key: \"color\",\n            get: function get() {\n                return this.attachments[36064] || null;\n            }\n        },\n        {\n            key: \"texture\",\n            get: function get() {\n                return this.attachments[36064] || null;\n            }\n        },\n        {\n            key: \"depth\",\n            get: function get() {\n                return this.attachments[36096] || this.attachments[33306] || null;\n            }\n        },\n        {\n            key: \"stencil\",\n            get: function get() {\n                return this.attachments[36128] || this.attachments[33306] || null;\n            }\n        }\n    ]);\n    return Framebuffer1;\n}((0, _resourceDefault.default));\nfunction mapIndexToCubeMapFace(layer) {\n    return layer < 34069 ? layer + 34069 : layer;\n}\nfunction _getFrameBufferStatus(status) {\n    var STATUS = Framebuffer.STATUS || {};\n    return STATUS[status] || \"Framebuffer error \".concat(status);\n}\nvar FRAMEBUFFER_ATTACHMENT_PARAMETERS = [\n    36049,\n    36048,\n    33296,\n    33298,\n    33299,\n    33300,\n    33301,\n    33302,\n    33303\n];\nFramebuffer.ATTACHMENT_PARAMETERS = FRAMEBUFFER_ATTACHMENT_PARAMETERS;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@luma.gl/gltools\":\"7HW6a\",\"./resource\":\"j3b8Q\",\"./texture-2d\":\"cRt4v\",\"./renderbuffer\":\"4Dr1U\",\"./clear\":\"7N7gJ\",\"./copy-and-blit.js\":\"bqHl8\",\"../features\":\"hzYKx\",\"../webgl-utils\":\"hZtIX\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3vThf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _superPropBaseJs = require(\"./superPropBase.js\");\nvar _superPropBaseJsDefault = parcelHelpers.interopDefault(_superPropBaseJs);\nfunction _get() {\n    if (typeof Reflect !== \"undefined\" && Reflect.get) _get = Reflect.get.bind();\n    else _get = function _get(target, property, receiver) {\n        var base = (0, _superPropBaseJsDefault.default)(target, property);\n        if (!base) return;\n        var desc = Object.getOwnPropertyDescriptor(base, property);\n        if (desc.get) return desc.get.call(arguments.length < 3 ? target : receiver);\n        return desc.value;\n    };\n    return _get.apply(this, arguments);\n}\nexports.default = _get;\n\n},{\"./superPropBase.js\":\"fHgXT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fHgXT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _getPrototypeOfJs = require(\"./getPrototypeOf.js\");\nvar _getPrototypeOfJsDefault = parcelHelpers.interopDefault(_getPrototypeOfJs);\nfunction _superPropBase(object, property) {\n    while(!Object.prototype.hasOwnProperty.call(object, property)){\n        object = (0, _getPrototypeOfJsDefault.default)(object);\n        if (object === null) break;\n    }\n    return object;\n}\nexports.default = _superPropBase;\n\n},{\"./getPrototypeOf.js\":\"jf1Jo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4Dr1U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Renderbuffer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _renderbufferFormats = require(\"./renderbuffer-formats\");\nvar _renderbufferFormatsDefault = parcelHelpers.interopDefault(_renderbufferFormats);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _utils = require(\"../utils\");\nfunction isFormatSupported(gl, format, formats) {\n    var info = formats[format];\n    if (!info) return false;\n    var value = (0, _gltools.isWebGL2)(gl) ? info.gl2 || info.gl1 : info.gl1;\n    if (typeof value === \"string\") return gl.getExtension(value);\n    return value;\n}\nvar Renderbuffer = function(_Resource) {\n    (0, _inheritsDefault.default)(Renderbuffer1, _Resource);\n    (0, _createClassDefault.default)(Renderbuffer1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n                    format: null\n                }, format = _ref.format;\n                return !format || isFormatSupported(gl, format, (0, _renderbufferFormatsDefault.default));\n            }\n        },\n        {\n            key: \"getSamplesForFormat\",\n            value: function getSamplesForFormat(gl, _ref2) {\n                var format = _ref2.format;\n                return gl.getInternalformatParameter(36161, format, 32937);\n            }\n        }\n    ]);\n    function Renderbuffer1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Renderbuffer1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Renderbuffer1).call(this, gl, opts));\n        _this.initialize(opts);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Renderbuffer1, [\n        {\n            key: \"initialize\",\n            value: function initialize(_ref3) {\n                var format = _ref3.format, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? 1 : _ref3$width, _ref3$height = _ref3.height, height = _ref3$height === void 0 ? 1 : _ref3$height, _ref3$samples = _ref3.samples, samples = _ref3$samples === void 0 ? 0 : _ref3$samples;\n                (0, _utils.assert)(format, \"Needs format\");\n                this._trackDeallocatedMemory();\n                this.gl.bindRenderbuffer(36161, this.handle);\n                if (samples !== 0 && (0, _gltools.isWebGL2)(this.gl)) this.gl.renderbufferStorageMultisample(36161, samples, format, width, height);\n                else this.gl.renderbufferStorage(36161, format, width, height);\n                this.format = format;\n                this.width = width;\n                this.height = height;\n                this.samples = samples;\n                this._trackAllocatedMemory(this.width * this.height * (this.samples || 1) * (0, _renderbufferFormatsDefault.default)[this.format].bpp);\n                return this;\n            }\n        },\n        {\n            key: \"resize\",\n            value: function resize(_ref4) {\n                var width = _ref4.width, height = _ref4.height;\n                if (width !== this.width || height !== this.height) return this.initialize({\n                    width: width,\n                    height: height,\n                    format: this.format,\n                    samples: this.samples\n                });\n                return this;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createRenderbuffer();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteRenderbuffer(this.handle);\n                this._trackDeallocatedMemory();\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle(handle) {\n                this.gl.bindRenderbuffer(36161, handle);\n            }\n        },\n        {\n            key: \"_syncHandle\",\n            value: function _syncHandle(handle) {\n                this.format = this.getParameter(36164);\n                this.width = this.getParameter(36162);\n                this.height = this.getParameter(36163);\n                this.samples = this.getParameter(36011);\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname) {\n                this.gl.bindRenderbuffer(36161, this.handle);\n                var value = this.gl.getRenderbufferParameter(36161, pname);\n                return value;\n            }\n        }\n    ]);\n    return Renderbuffer1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./resource\":\"j3b8Q\",\"./renderbuffer-formats\":\"b7GEZ\",\"@luma.gl/gltools\":\"7HW6a\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b7GEZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _$33190$36012$;\nvar EXT_FLOAT_WEBGL2 = \"EXT_color_buffer_float\";\nexports.default = (_$33190$36012$ = {}, (0, _definePropertyDefault.default)(_$33190$36012$, 33189, {\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33190, {\n    gl2: true,\n    bpp: 3\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36012, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36168, {\n    bpp: 1\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 34041, {\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 35056, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36013, {\n    gl2: true,\n    bpp: 5\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32854, {\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36194, {\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32855, {\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33321, {\n    gl2: true,\n    bpp: 1\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33330, {\n    gl2: true,\n    bpp: 1\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33329, {\n    gl2: true,\n    bpp: 1\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33332, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33331, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33334, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33333, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33323, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33336, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33335, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33338, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33337, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33340, {\n    gl2: true,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33339, {\n    gl2: true,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32849, {\n    gl2: true,\n    bpp: 3\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32856, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32857, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36220, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36238, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36975, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36214, {\n    gl2: true,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36232, {\n    gl2: true,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36226, {\n    gl2: true,\n    bpp: 16\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36208, {\n    gl2: true,\n    bpp: 16\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33325, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33327, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 34842, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33326, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33328, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 34836, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 16\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 35898, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 4\n}), _$33190$36012$);\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7N7gJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"clear\", ()=>clear);\nparcelHelpers.export(exports, \"clearBuffer\", ()=>clearBuffer);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar GL_DEPTH_BUFFER_BIT = 0x00000100;\nvar GL_STENCIL_BUFFER_BIT = 0x00000400;\nvar GL_COLOR_BUFFER_BIT = 0x00004000;\nvar GL_COLOR = 0x1800;\nvar GL_DEPTH = 0x1801;\nvar GL_STENCIL = 0x1802;\nvar GL_DEPTH_STENCIL = 0x84f9;\nvar ERR_ARGUMENTS = \"clear: bad arguments\";\nfunction clear(gl) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$framebuffer = _ref.framebuffer, framebuffer = _ref$framebuffer === void 0 ? null : _ref$framebuffer, _ref$color = _ref.color, color = _ref$color === void 0 ? null : _ref$color, _ref$depth = _ref.depth, depth = _ref$depth === void 0 ? null : _ref$depth, _ref$stencil = _ref.stencil, stencil = _ref$stencil === void 0 ? null : _ref$stencil;\n    var parameters = {};\n    if (framebuffer) parameters.framebuffer = framebuffer;\n    var clearFlags = 0;\n    if (color) {\n        clearFlags |= GL_COLOR_BUFFER_BIT;\n        if (color !== true) parameters.clearColor = color;\n    }\n    if (depth) {\n        clearFlags |= GL_DEPTH_BUFFER_BIT;\n        if (depth !== true) parameters.clearDepth = depth;\n    }\n    if (stencil) {\n        clearFlags |= GL_STENCIL_BUFFER_BIT;\n        if (depth !== true) parameters.clearStencil = depth;\n    }\n    (0, _utils.assert)(clearFlags !== 0, ERR_ARGUMENTS);\n    (0, _gltools.withParameters)(gl, parameters, function() {\n        gl.clear(clearFlags);\n    });\n}\nfunction clearBuffer(gl) {\n    var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$framebuffer = _ref2.framebuffer, framebuffer = _ref2$framebuffer === void 0 ? null : _ref2$framebuffer, _ref2$buffer = _ref2.buffer, buffer = _ref2$buffer === void 0 ? GL_COLOR : _ref2$buffer, _ref2$drawBuffer = _ref2.drawBuffer, drawBuffer = _ref2$drawBuffer === void 0 ? 0 : _ref2$drawBuffer, _ref2$value = _ref2.value, value = _ref2$value === void 0 ? [\n        0,\n        0,\n        0,\n        0\n    ] : _ref2$value;\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    (0, _gltools.withParameters)(gl, {\n        framebuffer: framebuffer\n    }, function() {\n        switch(buffer){\n            case GL_COLOR:\n                switch(value.constructor){\n                    case Int32Array:\n                        gl.clearBufferiv(buffer, drawBuffer, value);\n                        break;\n                    case Uint32Array:\n                        gl.clearBufferuiv(buffer, drawBuffer, value);\n                        break;\n                    case Float32Array:\n                    default:\n                        gl.clearBufferfv(buffer, drawBuffer, value);\n                }\n                break;\n            case GL_DEPTH:\n                gl.clearBufferfv(GL_DEPTH, 0, [\n                    value\n                ]);\n                break;\n            case GL_STENCIL:\n                gl.clearBufferiv(GL_STENCIL, 0, [\n                    value\n                ]);\n                break;\n            case GL_DEPTH_STENCIL:\n                var _value = (0, _slicedToArrayDefault.default)(value, 2), depth = _value[0], stencil = _value[1];\n                gl.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);\n                break;\n            default:\n                (0, _utils.assert)(false, ERR_ARGUMENTS);\n        }\n    });\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@luma.gl/gltools\":\"7HW6a\",\"../webgl-utils\":\"hZtIX\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bqHl8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"readPixelsToArray\", ()=>readPixelsToArray);\nparcelHelpers.export(exports, \"readPixelsToBuffer\", ()=>readPixelsToBuffer);\nparcelHelpers.export(exports, \"copyToDataUrl\", ()=>copyToDataUrl);\nparcelHelpers.export(exports, \"copyToImage\", ()=>copyToImage);\nparcelHelpers.export(exports, \"copyToTexture\", ()=>copyToTexture);\nparcelHelpers.export(exports, \"blit\", ()=>blit);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _framebuffer = require(\"./framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _typedArrayUtils = require(\"../webgl-utils/typed-array-utils\");\nvar _formatUtils = require(\"../webgl-utils/format-utils\");\nvar _textureUtils = require(\"../webgl-utils/texture-utils\");\nvar _utils = require(\"../utils\");\nfunction readPixelsToArray(source) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$sourceX = _ref.sourceX, sourceX = _ref$sourceX === void 0 ? 0 : _ref$sourceX, _ref$sourceY = _ref.sourceY, sourceY = _ref$sourceY === void 0 ? 0 : _ref$sourceY, _ref$sourceFormat = _ref.sourceFormat, sourceFormat = _ref$sourceFormat === void 0 ? 6408 : _ref$sourceFormat, _ref$sourceAttachment = _ref.sourceAttachment, sourceAttachment = _ref$sourceAttachment === void 0 ? 36064 : _ref$sourceAttachment, _ref$target = _ref.target, target = _ref$target === void 0 ? null : _ref$target, sourceWidth = _ref.sourceWidth, sourceHeight = _ref.sourceHeight, sourceType = _ref.sourceType;\n    var _getFramebuffer = getFramebuffer(source), framebuffer = _getFramebuffer.framebuffer, deleteFramebuffer = _getFramebuffer.deleteFramebuffer;\n    (0, _utils.assert)(framebuffer);\n    var gl = framebuffer.gl, handle = framebuffer.handle, attachments = framebuffer.attachments;\n    sourceWidth = sourceWidth || framebuffer.width;\n    sourceHeight = sourceHeight || framebuffer.height;\n    if (sourceAttachment === 36064 && handle === null) sourceAttachment = 1028;\n    (0, _utils.assert)(attachments[sourceAttachment]);\n    sourceType = sourceType || attachments[sourceAttachment].type;\n    target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight);\n    sourceType = sourceType || (0, _typedArrayUtils.getGLTypeFromTypedArray)(target);\n    var prevHandle = gl.bindFramebuffer(36160, handle);\n    gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, target);\n    gl.bindFramebuffer(36160, prevHandle || null);\n    if (deleteFramebuffer) framebuffer[\"delete\"]();\n    return target;\n}\nfunction readPixelsToBuffer(source, _ref2) {\n    var _ref2$sourceX = _ref2.sourceX, sourceX = _ref2$sourceX === void 0 ? 0 : _ref2$sourceX, _ref2$sourceY = _ref2.sourceY, sourceY = _ref2$sourceY === void 0 ? 0 : _ref2$sourceY, _ref2$sourceFormat = _ref2.sourceFormat, sourceFormat = _ref2$sourceFormat === void 0 ? 6408 : _ref2$sourceFormat, _ref2$target = _ref2.target, target = _ref2$target === void 0 ? null : _ref2$target, _ref2$targetByteOffse = _ref2.targetByteOffset, targetByteOffset = _ref2$targetByteOffse === void 0 ? 0 : _ref2$targetByteOffse, sourceWidth = _ref2.sourceWidth, sourceHeight = _ref2.sourceHeight, sourceType = _ref2.sourceType;\n    var _getFramebuffer2 = getFramebuffer(source), framebuffer = _getFramebuffer2.framebuffer, deleteFramebuffer = _getFramebuffer2.deleteFramebuffer;\n    (0, _utils.assert)(framebuffer);\n    var gl = framebuffer.gl;\n    sourceWidth = sourceWidth || framebuffer.width;\n    sourceHeight = sourceHeight || framebuffer.height;\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    sourceType = sourceType || (target ? target.type : 5121);\n    if (!target) {\n        var components = (0, _formatUtils.glFormatToComponents)(sourceFormat);\n        var byteCount = (0, _formatUtils.glTypeToBytes)(sourceType);\n        var byteLength = targetByteOffset + sourceWidth * sourceHeight * components * byteCount;\n        target = new (0, _bufferDefault.default)(gl, {\n            byteLength: byteLength,\n            accessor: {\n                type: sourceType,\n                size: components\n            }\n        });\n    }\n    target.bind({\n        target: 35051\n    });\n    (0, _gltools.withParameters)(gl, {\n        framebuffer: framebuffer\n    }, function() {\n        gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, targetByteOffset);\n    });\n    target.unbind({\n        target: 35051\n    });\n    if (deleteFramebuffer) framebuffer[\"delete\"]();\n    return target;\n}\nfunction copyToDataUrl(source) {\n    var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref3$sourceAttachmen = _ref3.sourceAttachment, sourceAttachment = _ref3$sourceAttachmen === void 0 ? 36064 : _ref3$sourceAttachmen, _ref3$targetMaxHeight = _ref3.targetMaxHeight, targetMaxHeight = _ref3$targetMaxHeight === void 0 ? Number.MAX_SAFE_INTEGER : _ref3$targetMaxHeight;\n    var data = readPixelsToArray(source, {\n        sourceAttachment: sourceAttachment\n    });\n    var width = source.width, height = source.height;\n    while(height > targetMaxHeight){\n        var _scalePixels = (0, _webglUtils.scalePixels)({\n            data: data,\n            width: width,\n            height: height\n        });\n        data = _scalePixels.data;\n        width = _scalePixels.width;\n        height = _scalePixels.height;\n    }\n    (0, _webglUtils.flipRows)({\n        data: data,\n        width: width,\n        height: height\n    });\n    var canvas = document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    var context = canvas.getContext(\"2d\");\n    var imageData = context.createImageData(width, height);\n    imageData.data.set(data);\n    context.putImageData(imageData, 0, 0);\n    return canvas.toDataURL();\n}\nfunction copyToImage(source) {\n    var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref4$sourceAttachmen = _ref4.sourceAttachment, sourceAttachment = _ref4$sourceAttachmen === void 0 ? 36064 : _ref4$sourceAttachmen, _ref4$targetImage = _ref4.targetImage, targetImage = _ref4$targetImage === void 0 ? null : _ref4$targetImage;\n    var dataUrl = copyToDataUrl(source, {\n        sourceAttachment: sourceAttachment\n    });\n    targetImage = targetImage || new Image();\n    targetImage.src = dataUrl;\n    return targetImage;\n}\nfunction copyToTexture(source, target) {\n    var _ref5 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref5$sourceX = _ref5.sourceX, sourceX = _ref5$sourceX === void 0 ? 0 : _ref5$sourceX, _ref5$sourceY = _ref5.sourceY, sourceY = _ref5$sourceY === void 0 ? 0 : _ref5$sourceY, targetX = _ref5.targetX, targetY = _ref5.targetY, targetZ = _ref5.targetZ, _ref5$targetMipmaplev = _ref5.targetMipmaplevel, targetMipmaplevel = _ref5$targetMipmaplev === void 0 ? 0 : _ref5$targetMipmaplev, _ref5$targetInternalF = _ref5.targetInternalFormat, targetInternalFormat = _ref5$targetInternalF === void 0 ? 6408 : _ref5$targetInternalF, width = _ref5.width, height = _ref5.height;\n    var _getFramebuffer3 = getFramebuffer(source), framebuffer = _getFramebuffer3.framebuffer, deleteFramebuffer = _getFramebuffer3.deleteFramebuffer;\n    (0, _utils.assert)(framebuffer);\n    var gl = framebuffer.gl, handle = framebuffer.handle;\n    var isSubCopy = typeof targetX !== \"undefined\" || typeof targetY !== \"undefined\" || typeof targetZ !== \"undefined\";\n    targetX = targetX || 0;\n    targetY = targetY || 0;\n    targetZ = targetZ || 0;\n    var prevHandle = gl.bindFramebuffer(36160, handle);\n    (0, _utils.assert)(target);\n    var texture = null;\n    if (target instanceof (0, _textureDefault.default)) {\n        texture = target;\n        width = Number.isFinite(width) ? width : texture.width;\n        height = Number.isFinite(height) ? height : texture.height;\n        texture.bind(0);\n        target = texture.target;\n    }\n    if (!isSubCopy) gl.copyTexImage2D(target, targetMipmaplevel, targetInternalFormat, sourceX, sourceY, width, height, 0);\n    else switch(target){\n        case 3553:\n        case 34067:\n            gl.copyTexSubImage2D(target, targetMipmaplevel, targetX, targetY, sourceX, sourceY, width, height);\n            break;\n        case 35866:\n        case 32879:\n            gl.copyTexSubImage3D(target, targetMipmaplevel, targetX, targetY, targetZ, sourceX, sourceY, width, height);\n            break;\n        default:\n    }\n    if (texture) texture.unbind();\n    gl.bindFramebuffer(36160, prevHandle || null);\n    if (deleteFramebuffer) framebuffer[\"delete\"]();\n    return texture;\n}\nfunction blit(source, target) {\n    var _ref6 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref6$sourceAttachmen = _ref6.sourceAttachment, sourceAttachment = _ref6$sourceAttachmen === void 0 ? 36064 : _ref6$sourceAttachmen, _ref6$sourceX = _ref6.sourceX0, sourceX0 = _ref6$sourceX === void 0 ? 0 : _ref6$sourceX, _ref6$sourceY = _ref6.sourceY0, sourceY0 = _ref6$sourceY === void 0 ? 0 : _ref6$sourceY, sourceX1 = _ref6.sourceX1, sourceY1 = _ref6.sourceY1, _ref6$targetX = _ref6.targetX0, targetX0 = _ref6$targetX === void 0 ? 0 : _ref6$targetX, _ref6$targetY = _ref6.targetY0, targetY0 = _ref6$targetY === void 0 ? 0 : _ref6$targetY, targetX1 = _ref6.targetX1, targetY1 = _ref6.targetY1, _ref6$color = _ref6.color, color = _ref6$color === void 0 ? true : _ref6$color, _ref6$depth = _ref6.depth, depth = _ref6$depth === void 0 ? false : _ref6$depth, _ref6$stencil = _ref6.stencil, stencil = _ref6$stencil === void 0 ? false : _ref6$stencil, _ref6$mask = _ref6.mask, mask = _ref6$mask === void 0 ? 0 : _ref6$mask, _ref6$filter = _ref6.filter, filter = _ref6$filter === void 0 ? 9728 : _ref6$filter;\n    var _getFramebuffer4 = getFramebuffer(source), srcFramebuffer = _getFramebuffer4.framebuffer, deleteSrcFramebuffer = _getFramebuffer4.deleteFramebuffer;\n    var _getFramebuffer5 = getFramebuffer(target), dstFramebuffer = _getFramebuffer5.framebuffer, deleteDstFramebuffer = _getFramebuffer5.deleteFramebuffer;\n    (0, _utils.assert)(srcFramebuffer);\n    (0, _utils.assert)(dstFramebuffer);\n    var gl = dstFramebuffer.gl, handle = dstFramebuffer.handle, width = dstFramebuffer.width, height = dstFramebuffer.height, readBuffer = dstFramebuffer.readBuffer;\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    if (!srcFramebuffer.handle && sourceAttachment === 36064) sourceAttachment = 1028;\n    if (color) mask |= 16384;\n    if (depth) mask |= 256;\n    if (stencil) mask |= 1024;\n    if (deleteSrcFramebuffer || deleteDstFramebuffer) {\n        if (mask & 1280) {\n            mask = 16384;\n            (0, _gltools.log).warn(\"Blitting from or into a Texture object, forcing mask to GL.COLOR_BUFFER_BIT\")();\n        }\n    }\n    (0, _utils.assert)(mask);\n    sourceX1 = sourceX1 === undefined ? srcFramebuffer.width : sourceX1;\n    sourceY1 = sourceY1 === undefined ? srcFramebuffer.height : sourceY1;\n    targetX1 = targetX1 === undefined ? width : targetX1;\n    targetY1 = targetY1 === undefined ? height : targetY1;\n    var prevDrawHandle = gl.bindFramebuffer(36009, handle);\n    var prevReadHandle = gl.bindFramebuffer(36008, srcFramebuffer.handle);\n    gl.readBuffer(sourceAttachment);\n    gl.blitFramebuffer(sourceX0, sourceY0, sourceX1, sourceY1, targetX0, targetY0, targetX1, targetY1, mask, filter);\n    gl.readBuffer(readBuffer);\n    gl.bindFramebuffer(36008, prevReadHandle || null);\n    gl.bindFramebuffer(36009, prevDrawHandle || null);\n    if (deleteSrcFramebuffer) srcFramebuffer[\"delete\"]();\n    if (deleteDstFramebuffer) dstFramebuffer[\"delete\"]();\n    return dstFramebuffer;\n}\nfunction getFramebuffer(source) {\n    if (!(source instanceof (0, _framebufferDefault.default))) return {\n        framebuffer: (0, _textureUtils.toFramebuffer)(source),\n        deleteFramebuffer: true\n    };\n    return {\n        framebuffer: source,\n        deleteFramebuffer: false\n    };\n}\nfunction getPixelArray(pixelArray, type, format, width, height) {\n    if (pixelArray) return pixelArray;\n    type = type || 5121;\n    var ArrayType = (0, _typedArrayUtils.getTypedArrayFromGLType)(type, {\n        clamped: false\n    });\n    var components = (0, _formatUtils.glFormatToComponents)(format);\n    return new ArrayType(width * height * components);\n}\n\n},{\"./buffer\":\"b1PWl\",\"./framebuffer\":\"3wciM\",\"./texture\":\"fa6ef\",\"@luma.gl/gltools\":\"7HW6a\",\"../webgl-utils\":\"hZtIX\",\"../webgl-utils/typed-array-utils\":\"4mpgk\",\"../webgl-utils/format-utils\":\"19VoX\",\"../webgl-utils/texture-utils\":\"hWpBe\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"19VoX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"glFormatToComponents\", ()=>glFormatToComponents);\nparcelHelpers.export(exports, \"glTypeToBytes\", ()=>glTypeToBytes);\nvar _utils = require(\"../utils\");\nfunction glFormatToComponents(format) {\n    switch(format){\n        case 6406:\n        case 33326:\n        case 6403:\n            return 1;\n        case 33328:\n        case 33319:\n            return 2;\n        case 6407:\n        case 34837:\n            return 3;\n        case 6408:\n        case 34836:\n            return 4;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\nfunction glTypeToBytes(type) {\n    switch(type){\n        case 5121:\n            return 1;\n        case 33635:\n        case 32819:\n        case 32820:\n            return 2;\n        case 5126:\n            return 4;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\n\n},{\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hzYKx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getContextInfo\", ()=>(0, _limits.getContextInfo));\nparcelHelpers.export(exports, \"getGLContextInfo\", ()=>(0, _limits.getGLContextInfo));\nparcelHelpers.export(exports, \"getContextLimits\", ()=>(0, _limits.getContextLimits));\nparcelHelpers.export(exports, \"FEATURES\", ()=>(0, _webglFeaturesTable.FEATURES));\nparcelHelpers.export(exports, \"hasFeature\", ()=>(0, _features.hasFeature));\nparcelHelpers.export(exports, \"hasFeatures\", ()=>(0, _features.hasFeatures));\nparcelHelpers.export(exports, \"getFeatures\", ()=>(0, _features.getFeatures));\nparcelHelpers.export(exports, \"canCompileGLGSExtension\", ()=>(0, _checkGlslExtensionDefault.default));\nvar _limits = require(\"./limits\");\nvar _webglFeaturesTable = require(\"./webgl-features-table\");\nvar _features = require(\"./features\");\nvar _checkGlslExtension = require(\"./check-glsl-extension\");\nvar _checkGlslExtensionDefault = parcelHelpers.interopDefault(_checkGlslExtension);\n\n},{\"./limits\":false,\"./webgl-features-table\":\"fx1cc\",\"./features\":\"9CI2f\",\"./check-glsl-extension\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fx1cc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FEATURES\", ()=>FEATURES);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _framebuffer = require(\"../classes/framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _texture2D = require(\"../classes/texture-2d\");\nvar _texture2DDefault = parcelHelpers.interopDefault(_texture2D);\nvar _FEATURES$WEBGL2$FEAT;\nvar FEATURES = {\n    WEBGL2: \"WEBGL2\",\n    VERTEX_ARRAY_OBJECT: \"VERTEX_ARRAY_OBJECT\",\n    TIMER_QUERY: \"TIMER_QUERY\",\n    INSTANCED_RENDERING: \"INSTANCED_RENDERING\",\n    MULTIPLE_RENDER_TARGETS: \"MULTIPLE_RENDER_TARGETS\",\n    ELEMENT_INDEX_UINT32: \"ELEMENT_INDEX_UINT32\",\n    BLEND_EQUATION_MINMAX: \"BLEND_EQUATION_MINMAX\",\n    FLOAT_BLEND: \"FLOAT_BLEND\",\n    COLOR_ENCODING_SRGB: \"COLOR_ENCODING_SRGB\",\n    TEXTURE_DEPTH: \"TEXTURE_DEPTH\",\n    TEXTURE_FLOAT: \"TEXTURE_FLOAT\",\n    TEXTURE_HALF_FLOAT: \"TEXTURE_HALF_FLOAT\",\n    TEXTURE_FILTER_LINEAR_FLOAT: \"TEXTURE_FILTER_LINEAR_FLOAT\",\n    TEXTURE_FILTER_LINEAR_HALF_FLOAT: \"TEXTURE_FILTER_LINEAR_HALF_FLOAT\",\n    TEXTURE_FILTER_ANISOTROPIC: \"TEXTURE_FILTER_ANISOTROPIC\",\n    COLOR_ATTACHMENT_RGBA32F: \"COLOR_ATTACHMENT_RGBA32F\",\n    COLOR_ATTACHMENT_FLOAT: \"COLOR_ATTACHMENT_FLOAT\",\n    COLOR_ATTACHMENT_HALF_FLOAT: \"COLOR_ATTACHMENT_HALF_FLOAT\",\n    GLSL_FRAG_DATA: \"GLSL_FRAG_DATA\",\n    GLSL_FRAG_DEPTH: \"GLSL_FRAG_DEPTH\",\n    GLSL_DERIVATIVES: \"GLSL_DERIVATIVES\",\n    GLSL_TEXTURE_LOD: \"GLSL_TEXTURE_LOD\"\n};\nfunction checkFloat32ColorAttachment(gl) {\n    var testTexture = new (0, _texture2DDefault.default)(gl, {\n        format: 6408,\n        type: 5126,\n        dataFormat: 6408\n    });\n    var testFb = new (0, _framebufferDefault.default)(gl, {\n        id: \"test-framebuffer\",\n        check: false,\n        attachments: (0, _definePropertyDefault.default)({}, 36064, testTexture)\n    });\n    var status = testFb.getStatus();\n    testTexture[\"delete\"]();\n    testFb[\"delete\"]();\n    return status === 36053;\n}\nexports.default = (_FEATURES$WEBGL2$FEAT = {}, (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.WEBGL2, [\n    false,\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.VERTEX_ARRAY_OBJECT, [\n    \"OES_vertex_array_object\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TIMER_QUERY, [\n    \"EXT_disjoint_timer_query\",\n    \"EXT_disjoint_timer_query_webgl2\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.INSTANCED_RENDERING, [\n    \"ANGLE_instanced_arrays\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.MULTIPLE_RENDER_TARGETS, [\n    \"WEBGL_draw_buffers\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.ELEMENT_INDEX_UINT32, [\n    \"OES_element_index_uint\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.BLEND_EQUATION_MINMAX, [\n    \"EXT_blend_minmax\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.FLOAT_BLEND, [\n    \"EXT_float_blend\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.COLOR_ENCODING_SRGB, [\n    \"EXT_sRGB\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_DEPTH, [\n    \"WEBGL_depth_texture\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_FLOAT, [\n    \"OES_texture_float\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_HALF_FLOAT, [\n    \"OES_texture_half_float\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_FILTER_LINEAR_FLOAT, [\n    \"OES_texture_float_linear\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_FILTER_LINEAR_HALF_FLOAT, [\n    \"OES_texture_half_float_linear\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_FILTER_ANISOTROPIC, [\n    \"EXT_texture_filter_anisotropic\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.COLOR_ATTACHMENT_RGBA32F, [\n    checkFloat32ColorAttachment,\n    \"EXT_color_buffer_float\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.COLOR_ATTACHMENT_FLOAT, [\n    false,\n    \"EXT_color_buffer_float\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.COLOR_ATTACHMENT_HALF_FLOAT, [\n    \"EXT_color_buffer_half_float\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.GLSL_FRAG_DATA, [\n    \"WEBGL_draw_buffers\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.GLSL_FRAG_DEPTH, [\n    \"EXT_frag_depth\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.GLSL_DERIVATIVES, [\n    \"OES_standard_derivatives\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.GLSL_TEXTURE_LOD, [\n    \"EXT_shader_texture_lod\",\n    true\n]), _FEATURES$WEBGL2$FEAT);\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../classes/framebuffer\":\"3wciM\",\"../classes/texture-2d\":\"cRt4v\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9CI2f\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hasFeature\", ()=>hasFeature);\nparcelHelpers.export(exports, \"hasFeatures\", ()=>hasFeatures);\nparcelHelpers.export(exports, \"getFeatures\", ()=>getFeatures);\nvar _webglFeaturesTable = require(\"./webgl-features-table\");\nvar _webglFeaturesTableDefault = parcelHelpers.interopDefault(_webglFeaturesTable);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _utils = require(\"../utils\");\nvar LOG_UNSUPPORTED_FEATURE = 2;\nfunction hasFeature(gl, feature) {\n    return hasFeatures(gl, feature);\n}\nfunction hasFeatures(gl, features) {\n    features = Array.isArray(features) ? features : [\n        features\n    ];\n    return features.every(function(feature) {\n        return isFeatureSupported(gl, feature);\n    });\n}\nfunction getFeatures(gl) {\n    gl.luma = gl.luma || {};\n    gl.luma.caps = gl.luma.caps || {};\n    for(var cap in 0, _webglFeaturesTableDefault.default)if (gl.luma.caps[cap] === undefined) gl.luma.caps[cap] = isFeatureSupported(gl, cap);\n    return gl.luma.caps;\n}\nfunction isFeatureSupported(gl, cap) {\n    gl.luma = gl.luma || {};\n    gl.luma.caps = gl.luma.caps || {};\n    if (gl.luma.caps[cap] === undefined) gl.luma.caps[cap] = queryFeature(gl, cap);\n    if (!gl.luma.caps[cap]) (0, _gltools.log).log(LOG_UNSUPPORTED_FEATURE, \"Feature: \".concat(cap, \" not supported\"))();\n    return gl.luma.caps[cap];\n}\nfunction queryFeature(gl, cap) {\n    var feature = (0, _webglFeaturesTableDefault.default)[cap];\n    (0, _utils.assert)(feature, cap);\n    var isSupported;\n    var featureDefinition = (0, _gltools.isWebGL2)(gl) ? feature[1] || feature[0] : feature[0];\n    if (typeof featureDefinition === \"function\") isSupported = featureDefinition(gl);\n    else if (Array.isArray(featureDefinition)) {\n        isSupported = true;\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n        try {\n            for(var _iterator = featureDefinition[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                var extension = _step.value;\n                isSupported = isSupported && Boolean(gl.getExtension(extension));\n            }\n        } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n        } finally{\n            try {\n                if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n            } finally{\n                if (_didIteratorError) throw _iteratorError;\n            }\n        }\n    } else if (typeof featureDefinition === \"string\") isSupported = Boolean(gl.getExtension(featureDefinition));\n    else if (typeof featureDefinition === \"boolean\") isSupported = featureDefinition;\n    else (0, _utils.assert)(false);\n    return isSupported;\n}\n\n},{\"./webgl-features-table\":\"fx1cc\",\"@luma.gl/gltools\":\"7HW6a\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bcNND\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Shader\", ()=>Shader);\nparcelHelpers.export(exports, \"VertexShader\", ()=>VertexShader);\nparcelHelpers.export(exports, \"FragmentShader\", ()=>FragmentShader);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _glslUtils = require(\"../glsl-utils\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar ERR_SOURCE = \"Shader: GLSL source code must be a JavaScript string\";\nvar Shader = function(_Resource) {\n    (0, _inheritsDefault.default)(Shader1, _Resource);\n    (0, _createClassDefault.default)(Shader1, null, [\n        {\n            key: \"getTypeName\",\n            value: function getTypeName(shaderType) {\n                switch(shaderType){\n                    case 35633:\n                        return \"vertex-shader\";\n                    case 35632:\n                        return \"fragment-shader\";\n                    default:\n                        (0, _utils.assert)(false);\n                        return \"unknown\";\n                }\n            }\n        }\n    ]);\n    function Shader1(gl, props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, Shader1);\n        (0, _webglUtils.assertWebGLContext)(gl);\n        (0, _utils.assert)(typeof props.source === \"string\", ERR_SOURCE);\n        var id = (0, _glslUtils.getShaderName)(props.source, null) || props.id || (0, _utils.uid)(\"unnamed \".concat(Shader1.getTypeName(props.shaderType)));\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Shader1).call(this, gl, {\n            id: id\n        }));\n        _this.shaderType = props.shaderType;\n        _this.source = props.source;\n        _this.initialize(props);\n        return _this;\n    }\n    (0, _createClassDefault.default)(Shader1, [\n        {\n            key: \"initialize\",\n            value: function initialize(_ref) {\n                var source = _ref.source;\n                var shaderName = (0, _glslUtils.getShaderName)(source, null);\n                if (shaderName) this.id = (0, _utils.uid)(shaderName);\n                this._compile(source);\n            }\n        },\n        {\n            key: \"getParameter\",\n            value: function getParameter(pname) {\n                return this.gl.getShaderParameter(this.handle, pname);\n            }\n        },\n        {\n            key: \"toString\",\n            value: function toString() {\n                return \"\".concat(Shader1.getTypeName(this.shaderType), \":\").concat(this.id);\n            }\n        },\n        {\n            key: \"getName\",\n            value: function getName() {\n                return (0, _glslUtils.getShaderName)(this.source) || \"unnamed-shader\";\n            }\n        },\n        {\n            key: \"getSource\",\n            value: function getSource() {\n                return this.gl.getShaderSource(this.handle);\n            }\n        },\n        {\n            key: \"getTranslatedSource\",\n            value: function getTranslatedSource() {\n                var extension = this.gl.getExtension(\"WEBGL.debug_shaders\");\n                return extension ? extension.getTranslatedShaderSource(this.handle) : \"No translated source available. WEBGL.debug_shaders not implemented\";\n            }\n        },\n        {\n            key: \"_compile\",\n            value: function _compile() {\n                var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.source;\n                if (!source.startsWith(\"#version \")) source = \"#version 100\\n\".concat(source);\n                this.source = source;\n                this.gl.shaderSource(this.handle, this.source);\n                this.gl.compileShader(this.handle);\n                var compileStatus = this.getParameter(35713);\n                if (!compileStatus) {\n                    var infoLog = this.gl.getShaderInfoLog(this.handle);\n                    var _parseGLSLCompilerErr = (0, _glslUtils.parseGLSLCompilerError)(infoLog, this.source, this.shaderType, this.id), shaderName = _parseGLSLCompilerErr.shaderName, errors = _parseGLSLCompilerErr.errors, warnings = _parseGLSLCompilerErr.warnings;\n                    (0, _gltools.log).error(\"GLSL compilation errors in \".concat(shaderName, \"\\n\").concat(errors))();\n                    (0, _gltools.log).warn(\"GLSL compilation warnings in \".concat(shaderName, \"\\n\").concat(warnings))();\n                    throw new Error(\"GLSL compilation errors in \".concat(shaderName));\n                }\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteShader(this.handle);\n            }\n        },\n        {\n            key: \"_getOptsFromHandle\",\n            value: function _getOptsFromHandle() {\n                return {\n                    type: this.getParameter(35663),\n                    source: this.getSource()\n                };\n            }\n        }\n    ]);\n    return Shader1;\n}((0, _resourceDefault.default));\nvar VertexShader = function(_Shader) {\n    (0, _inheritsDefault.default)(VertexShader1, _Shader);\n    function VertexShader1(gl, props) {\n        (0, _classCallCheckDefault.default)(this, VertexShader1);\n        if (typeof props === \"string\") props = {\n            source: props\n        };\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(VertexShader1).call(this, gl, Object.assign({}, props, {\n            shaderType: 35633\n        })));\n    }\n    (0, _createClassDefault.default)(VertexShader1, [\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createShader(35633);\n            }\n        }\n    ]);\n    return VertexShader1;\n}(Shader);\nvar FragmentShader = function(_Shader2) {\n    (0, _inheritsDefault.default)(FragmentShader1, _Shader2);\n    function FragmentShader1(gl, props) {\n        (0, _classCallCheckDefault.default)(this, FragmentShader1);\n        if (typeof props === \"string\") props = {\n            source: props\n        };\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(FragmentShader1).call(this, gl, Object.assign({}, props, {\n            shaderType: 35632\n        })));\n    }\n    (0, _createClassDefault.default)(FragmentShader1, [\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createShader(35632);\n            }\n        }\n    ]);\n    return FragmentShader1;\n}(Shader);\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@luma.gl/gltools\":\"7HW6a\",\"../glsl-utils\":\"1Y9N9\",\"../webgl-utils\":\"hZtIX\",\"../utils\":\"eK1k6\",\"./resource\":\"j3b8Q\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1Y9N9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatGLSLCompilerError\", ()=>(0, _formatGlslErrorDefault.default));\nparcelHelpers.export(exports, \"parseGLSLCompilerError\", ()=>(0, _formatGlslError.parseGLSLCompilerError));\nparcelHelpers.export(exports, \"getShaderName\", ()=>(0, _getShaderNameDefault.default));\nparcelHelpers.export(exports, \"getShaderVersion\", ()=>(0, _getShaderVersionDefault.default));\nparcelHelpers.export(exports, \"getShaderTypeName\", ()=>(0, _getShaderTypeNameDefault.default));\nvar _formatGlslError = require(\"./format-glsl-error\");\nvar _formatGlslErrorDefault = parcelHelpers.interopDefault(_formatGlslError);\nvar _getShaderName = require(\"./get-shader-name\");\nvar _getShaderNameDefault = parcelHelpers.interopDefault(_getShaderName);\nvar _getShaderVersion = require(\"./get-shader-version\");\nvar _getShaderVersionDefault = parcelHelpers.interopDefault(_getShaderVersion);\nvar _getShaderTypeName = require(\"./get-shader-type-name\");\nvar _getShaderTypeNameDefault = parcelHelpers.interopDefault(_getShaderTypeName);\n\n},{\"./format-glsl-error\":\"l9qY0\",\"./get-shader-name\":\"zh62S\",\"./get-shader-version\":\"44BGy\",\"./get-shader-type-name\":\"72Rm1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l9qY0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parseGLSLCompilerError\", ()=>parseGLSLCompilerError);\nvar _getShaderName = require(\"./get-shader-name\");\nvar _getShaderNameDefault = parcelHelpers.interopDefault(_getShaderName);\nvar _getShaderTypeName = require(\"./get-shader-type-name\");\nvar _getShaderTypeNameDefault = parcelHelpers.interopDefault(_getShaderTypeName);\nfunction formatGLSLCompilerError(errLog, src, shaderType) {\n    var _parseGLSLCompilerErr = parseGLSLCompilerError(errLog, src, shaderType), shaderName = _parseGLSLCompilerErr.shaderName, errors = _parseGLSLCompilerErr.errors, warnings = _parseGLSLCompilerErr.warnings;\n    return \"GLSL compilation error in \".concat(shaderName, \"\\n\\n\").concat(errors, \"\\n\").concat(warnings);\n}\nexports.default = formatGLSLCompilerError;\nfunction parseGLSLCompilerError(errLog, src, shaderType, shaderName) {\n    var errorStrings = errLog.split(/\\r?\\n/);\n    var errors = {};\n    var warnings = {};\n    var name = shaderName || (0, _getShaderNameDefault.default)(src) || \"(unnamed)\";\n    var shaderDescription = \"\".concat((0, _getShaderTypeNameDefault.default)(shaderType), \" shader \").concat(name);\n    for(var i = 0; i < errorStrings.length; i++){\n        var errorString = errorStrings[i];\n        if (errorString.length <= 1) continue;\n        var segments = errorString.split(\":\");\n        var type = segments[0];\n        var line = parseInt(segments[2], 10);\n        if (isNaN(line)) throw new Error(\"GLSL compilation error in \".concat(shaderDescription, \": \").concat(errLog));\n        if (type !== \"WARNING\") errors[line] = errorString;\n        else warnings[line] = errorString;\n    }\n    var lines = addLineNumbers(src);\n    return {\n        shaderName: shaderDescription,\n        errors: formatErrors(errors, lines),\n        warnings: formatErrors(warnings, lines)\n    };\n}\nfunction formatErrors(errors, lines) {\n    var message = \"\";\n    for(var i = 0; i < lines.length; i++){\n        var line = lines[i];\n        if (!errors[i + 3] && !errors[i + 2] && !errors[i + 1]) continue;\n        message += \"\".concat(line, \"\\n\");\n        if (errors[i + 1]) {\n            var error = errors[i + 1];\n            var segments = error.split(\":\", 3);\n            var type = segments[0];\n            var column = parseInt(segments[1], 10) || 0;\n            var err = error.substring(segments.join(\":\").length + 1).trim();\n            message += padLeft(\"^^^ \".concat(type, \": \").concat(err, \"\\n\\n\"), column);\n        }\n    }\n    return message;\n}\nfunction addLineNumbers(string) {\n    var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n    var delim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \": \";\n    var lines = string.split(/\\r?\\n/);\n    var maxDigits = String(lines.length + start - 1).length;\n    return lines.map(function(line, i) {\n        var lineNumber = i + start;\n        var digits = String(lineNumber).length;\n        var prefix = padLeft(lineNumber, maxDigits - digits);\n        return prefix + delim + line;\n    });\n}\nfunction padLeft(string, digits) {\n    var result = \"\";\n    for(var i = 0; i < digits; ++i)result += \" \";\n    return \"\".concat(result).concat(string);\n}\n\n},{\"./get-shader-name\":\"zh62S\",\"./get-shader-type-name\":\"72Rm1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"zh62S\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction getShaderName(shader) {\n    var defaultName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"unnamed\";\n    var SHADER_NAME_REGEXP = /#define[\\s*]SHADER_NAME[\\s*]([A-Za-z0-9_-]+)[\\s*]/;\n    var match = shader.match(SHADER_NAME_REGEXP);\n    return match ? match[1] : defaultName;\n}\nexports.default = getShaderName;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"72Rm1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar GL_FRAGMENT_SHADER = 0x8b30;\nvar GL_VERTEX_SHADER = 0x8b31;\nfunction getShaderTypeName(type) {\n    switch(type){\n        case GL_FRAGMENT_SHADER:\n            return \"fragment\";\n        case GL_VERTEX_SHADER:\n            return \"vertex\";\n        default:\n            return \"unknown type\";\n    }\n}\nexports.default = getShaderTypeName;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"44BGy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction getShaderVersion(source) {\n    var version = 100;\n    var words = source.match(/[^\\s]+/g);\n    if (words.length >= 2 && words[0] === \"#version\") {\n        var v = parseInt(words[1], 10);\n        if (Number.isFinite(v)) version = v;\n    }\n    return version;\n}\nexports.default = getShaderVersion;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cptWf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Program);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _framebuffer = require(\"./framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _uniforms = require(\"./uniforms\");\nvar _shader = require(\"./shader\");\nvar _programConfiguration = require(\"./program-configuration\");\nvar _programConfigurationDefault = parcelHelpers.interopDefault(_programConfiguration);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\nvar _utils = require(\"../utils\");\nvar LOG_PROGRAM_PERF_PRIORITY = 4;\nvar GL_SEPARATE_ATTRIBS = 0x8c8d;\nvar V6_DEPRECATED_METHODS = [\n    \"setVertexArray\",\n    \"setAttributes\",\n    \"setBuffers\",\n    \"unsetBuffers\",\n    \"use\",\n    \"getUniformCount\",\n    \"getUniformInfo\",\n    \"getUniformLocation\",\n    \"getUniformValue\",\n    \"getVarying\",\n    \"getFragDataLocation\",\n    \"getAttachedShaders\",\n    \"getAttributeCount\",\n    \"getAttributeLocation\",\n    \"getAttributeInfo\"\n];\nvar Program = function(_Resource) {\n    (0, _inheritsDefault.default)(Program1, _Resource);\n    function Program1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Program1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Program1).call(this, gl, props));\n        _this.stubRemovedMethods(\"Program\", \"v6.0\", V6_DEPRECATED_METHODS);\n        _this._isCached = false;\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        _this._setId(props.id);\n        return _this;\n    }\n    (0, _createClassDefault.default)(Program1, [\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var hash = props.hash, vs = props.vs, fs = props.fs, varyings = props.varyings, _props$bufferMode = props.bufferMode, bufferMode = _props$bufferMode === void 0 ? GL_SEPARATE_ATTRIBS : _props$bufferMode;\n                this.hash = hash || \"\";\n                this.vs = typeof vs === \"string\" ? new (0, _shader.VertexShader)(this.gl, {\n                    id: \"\".concat(props.id, \"-vs\"),\n                    source: vs\n                }) : vs;\n                this.fs = typeof fs === \"string\" ? new (0, _shader.FragmentShader)(this.gl, {\n                    id: \"\".concat(props.id, \"-fs\"),\n                    source: fs\n                }) : fs;\n                (0, _utils.assert)(this.vs instanceof (0, _shader.VertexShader));\n                (0, _utils.assert)(this.fs instanceof (0, _shader.FragmentShader));\n                this.uniforms = {};\n                this._textureUniforms = {};\n                this._texturesRenderable = true;\n                if (varyings && varyings.length > 0) {\n                    (0, _webglUtils.assertWebGL2Context)(this.gl);\n                    this.varyings = varyings;\n                    this.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n                }\n                this._compileAndLink();\n                this._readUniformLocationsFromLinkedProgram();\n                this.configuration = new (0, _programConfigurationDefault.default)(this);\n                return this.setProps(props);\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (this._isCached) return this;\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Program1.prototype), \"delete\", this).call(this, options);\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"uniforms\" in props) this.setUniforms(props.uniforms);\n                return this;\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref) {\n                var _this2 = this;\n                var logPriority = _ref.logPriority, _ref$drawMode = _ref.drawMode, drawMode = _ref$drawMode === void 0 ? 4 : _ref$drawMode, vertexCount = _ref.vertexCount, _ref$offset = _ref.offset, offset = _ref$offset === void 0 ? 0 : _ref$offset, start = _ref.start, end = _ref.end, _ref$isIndexed = _ref.isIndexed, isIndexed = _ref$isIndexed === void 0 ? false : _ref$isIndexed, _ref$indexType = _ref.indexType, indexType = _ref$indexType === void 0 ? 5123 : _ref$indexType, _ref$instanceCount = _ref.instanceCount, instanceCount = _ref$instanceCount === void 0 ? 0 : _ref$instanceCount, _ref$isInstanced = _ref.isInstanced, isInstanced = _ref$isInstanced === void 0 ? instanceCount > 0 : _ref$isInstanced, _ref$vertexArray = _ref.vertexArray, vertexArray = _ref$vertexArray === void 0 ? null : _ref$vertexArray, transformFeedback = _ref.transformFeedback, framebuffer = _ref.framebuffer, _ref$parameters = _ref.parameters, parameters = _ref$parameters === void 0 ? {} : _ref$parameters, uniforms = _ref.uniforms, samplers = _ref.samplers;\n                if (uniforms || samplers) {\n                    (0, _gltools.log).deprecated(\"Program.draw({uniforms})\", \"Program.setUniforms(uniforms)\")();\n                    this.setUniforms(uniforms || {});\n                }\n                if ((0, _gltools.log).priority >= logPriority) {\n                    var fb = framebuffer ? framebuffer.id : \"default\";\n                    var message = \"mode=\".concat((0, _webglUtils.getKey)(this.gl, drawMode), \" verts=\").concat(vertexCount, \" \") + \"instances=\".concat(instanceCount, \" indexType=\").concat((0, _webglUtils.getKey)(this.gl, indexType), \" \") + \"isInstanced=\".concat(isInstanced, \" isIndexed=\").concat(isIndexed, \" \") + \"Framebuffer=\".concat(fb);\n                    (0, _gltools.log).log(logPriority, message)();\n                }\n                (0, _utils.assert)(vertexArray);\n                this.gl.useProgram(this.handle);\n                if (!this._areTexturesRenderable() || vertexCount === 0 || isInstanced && instanceCount === 0) return false;\n                vertexArray.bindForDraw(vertexCount, instanceCount, function() {\n                    if (framebuffer !== undefined) parameters = Object.assign({}, parameters, {\n                        framebuffer: framebuffer\n                    });\n                    if (transformFeedback) {\n                        var primitiveMode = (0, _attributeUtils.getPrimitiveDrawMode)(drawMode);\n                        transformFeedback.begin(primitiveMode);\n                    }\n                    _this2._bindTextures();\n                    (0, _gltools.withParameters)(_this2.gl, parameters, function() {\n                        if (isIndexed && isInstanced) _this2.gl.drawElementsInstanced(drawMode, vertexCount, indexType, offset, instanceCount);\n                        else if (isIndexed && (0, _gltools.isWebGL2)(_this2.gl) && !isNaN(start) && !isNaN(end)) _this2.gl.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n                        else if (isIndexed) _this2.gl.drawElements(drawMode, vertexCount, indexType, offset);\n                        else if (isInstanced) _this2.gl.drawArraysInstanced(drawMode, offset, vertexCount, instanceCount);\n                        else _this2.gl.drawArrays(drawMode, offset, vertexCount);\n                    });\n                    if (transformFeedback) transformFeedback.end();\n                });\n                return true;\n            }\n        },\n        {\n            key: \"setUniforms\",\n            value: function setUniforms() {\n                var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if ((0, _gltools.log).priority >= 2) (0, _uniforms.checkUniformValues)(uniforms, this.id, this._uniformSetters);\n                this.gl.useProgram(this.handle);\n                for(var uniformName in uniforms){\n                    var uniform = uniforms[uniformName];\n                    var uniformSetter = this._uniformSetters[uniformName];\n                    if (uniformSetter) {\n                        var value = uniform;\n                        var textureUpdate = false;\n                        if (value instanceof (0, _framebufferDefault.default)) value = value.texture;\n                        if (value instanceof (0, _textureDefault.default)) {\n                            textureUpdate = this.uniforms[uniformName] !== uniform;\n                            if (textureUpdate) {\n                                if (uniformSetter.textureIndex === undefined) uniformSetter.textureIndex = this._textureIndexCounter++;\n                                var texture = value;\n                                var textureIndex = uniformSetter.textureIndex;\n                                texture.bind(textureIndex);\n                                value = textureIndex;\n                                if (!texture.loaded) this._texturesRenderable = false;\n                                this._textureUniforms[uniformName] = texture;\n                            } else value = uniformSetter.textureIndex;\n                        } else if (this._textureUniforms[uniformName]) delete this._textureUniforms[uniformName];\n                        if (uniformSetter(value) || textureUpdate) (0, _uniforms.copyUniform)(this.uniforms, uniformName, uniform);\n                    }\n                }\n                return this;\n            }\n        },\n        {\n            key: \"_areTexturesRenderable\",\n            value: function _areTexturesRenderable() {\n                if (this._texturesRenderable) return true;\n                this._texturesRenderable = true;\n                for(var uniformName in this._textureUniforms){\n                    var texture = this._textureUniforms[uniformName];\n                    this._texturesRenderable = this._texturesRenderable && texture.loaded;\n                }\n                return this._texturesRenderable;\n            }\n        },\n        {\n            key: \"_bindTextures\",\n            value: function _bindTextures() {\n                for(var uniformName in this._textureUniforms){\n                    var textureIndex = this._uniformSetters[uniformName].textureIndex;\n                    this._textureUniforms[uniformName].bind(textureIndex);\n                }\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createProgram();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteProgram(this.handle);\n            }\n        },\n        {\n            key: \"_getOptionsFromHandle\",\n            value: function _getOptionsFromHandle(handle) {\n                var shaderHandles = this.gl.getAttachedShaders(handle);\n                var opts = {};\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = shaderHandles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var shaderHandle = _step.value;\n                        var type = this.gl.getShaderParameter(this.handle, 35663);\n                        switch(type){\n                            case 35633:\n                                opts.vs = new (0, _shader.VertexShader)({\n                                    handle: shaderHandle\n                                });\n                                break;\n                            case 35632:\n                                opts.fs = new (0, _shader.FragmentShader)({\n                                    handle: shaderHandle\n                                });\n                                break;\n                            default:\n                        }\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                return opts;\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname) {\n                return this.gl.getProgramParameter(this.handle, pname);\n            }\n        },\n        {\n            key: \"_setId\",\n            value: function _setId(id) {\n                if (!id) {\n                    var programName = this._getName();\n                    this.id = (0, _utils.uid)(programName);\n                }\n            }\n        },\n        {\n            key: \"_getName\",\n            value: function _getName() {\n                var programName = this.vs.getName() || this.fs.getName();\n                programName = programName.replace(/shader/i, \"\");\n                programName = programName ? \"\".concat(programName, \"-program\") : \"program\";\n                return programName;\n            }\n        },\n        {\n            key: \"_compileAndLink\",\n            value: function _compileAndLink() {\n                var gl = this.gl;\n                gl.attachShader(this.handle, this.vs.handle);\n                gl.attachShader(this.handle, this.fs.handle);\n                (0, _gltools.log).time(LOG_PROGRAM_PERF_PRIORITY, \"linkProgram for \".concat(this._getName()))();\n                gl.linkProgram(this.handle);\n                (0, _gltools.log).timeEnd(LOG_PROGRAM_PERF_PRIORITY, \"linkProgram for \".concat(this._getName()))();\n                if (gl.debug || (0, _gltools.log).level > 0) {\n                    var linked = gl.getProgramParameter(this.handle, 35714);\n                    if (!linked) throw new Error(\"Error linking: \".concat(gl.getProgramInfoLog(this.handle)));\n                    gl.validateProgram(this.handle);\n                    var validated = gl.getProgramParameter(this.handle, 35715);\n                    if (!validated) throw new Error(\"Error validating: \".concat(gl.getProgramInfoLog(this.handle)));\n                }\n            }\n        },\n        {\n            key: \"_readUniformLocationsFromLinkedProgram\",\n            value: function _readUniformLocationsFromLinkedProgram() {\n                var gl = this.gl;\n                this._uniformSetters = {};\n                this._uniformCount = this._getParameter(35718);\n                for(var i = 0; i < this._uniformCount; i++){\n                    var info = this.gl.getActiveUniform(this.handle, i);\n                    var _parseUniformName = (0, _uniforms.parseUniformName)(info.name), name = _parseUniformName.name, isArray = _parseUniformName.isArray;\n                    var location = gl.getUniformLocation(this.handle, name);\n                    this._uniformSetters[name] = (0, _uniforms.getUniformSetter)(gl, location, info, isArray);\n                    if (info.size > 1) for(var l = 0; l < info.size; l++){\n                        location = gl.getUniformLocation(this.handle, \"\".concat(name, \"[\").concat(l, \"]\"));\n                        this._uniformSetters[\"\".concat(name, \"[\").concat(l, \"]\")] = (0, _uniforms.getUniformSetter)(gl, location, info, isArray);\n                    }\n                }\n                this._textureIndexCounter = 0;\n            }\n        },\n        {\n            key: \"getActiveUniforms\",\n            value: function getActiveUniforms(uniformIndices, pname) {\n                return this.gl.getActiveUniforms(this.handle, uniformIndices, pname);\n            }\n        },\n        {\n            key: \"getUniformBlockIndex\",\n            value: function getUniformBlockIndex(blockName) {\n                return this.gl.getUniformBlockIndex(this.handle, blockName);\n            }\n        },\n        {\n            key: \"getActiveUniformBlockParameter\",\n            value: function getActiveUniformBlockParameter(blockIndex, pname) {\n                return this.gl.getActiveUniformBlockParameter(this.handle, blockIndex, pname);\n            }\n        },\n        {\n            key: \"uniformBlockBinding\",\n            value: function uniformBlockBinding(blockIndex, blockBinding) {\n                this.gl.uniformBlockBinding(this.handle, blockIndex, blockBinding);\n            }\n        }\n    ]);\n    return Program1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./resource\":\"j3b8Q\",\"./texture\":\"fa6ef\",\"./framebuffer\":\"3wciM\",\"./uniforms\":\"4jCpe\",\"./shader\":\"bcNND\",\"./program-configuration\":\"9u2ie\",\"@luma.gl/gltools\":\"7HW6a\",\"../webgl-utils\":\"hZtIX\",\"../webgl-utils/attribute-utils\":\"fjaGt\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4jCpe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parseUniformName\", ()=>parseUniformName);\nparcelHelpers.export(exports, \"getUniformSetter\", ()=>getUniformSetter);\nparcelHelpers.export(exports, \"checkUniformValues\", ()=>checkUniformValues);\nparcelHelpers.export(exports, \"copyUniform\", ()=>copyUniform);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _framebuffer = require(\"./framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _renderbuffer = require(\"./renderbuffer\");\nvar _renderbufferDefault = parcelHelpers.interopDefault(_renderbuffer);\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _utils = require(\"../utils\");\nvar _UNIFORM_SETTERS;\nvar UNIFORM_SETTERS = (_UNIFORM_SETTERS = {}, (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 5126, getArraySetter.bind(null, \"uniform1fv\", toFloatArray, 1, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35664, getArraySetter.bind(null, \"uniform2fv\", toFloatArray, 2, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35665, getArraySetter.bind(null, \"uniform3fv\", toFloatArray, 3, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35666, getArraySetter.bind(null, \"uniform4fv\", toFloatArray, 4, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 5124, getArraySetter.bind(null, \"uniform1iv\", toIntArray, 1, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35667, getArraySetter.bind(null, \"uniform2iv\", toIntArray, 2, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35668, getArraySetter.bind(null, \"uniform3iv\", toIntArray, 3, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35669, getArraySetter.bind(null, \"uniform4iv\", toIntArray, 4, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35670, getArraySetter.bind(null, \"uniform1iv\", toIntArray, 1, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35671, getArraySetter.bind(null, \"uniform2iv\", toIntArray, 2, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35672, getArraySetter.bind(null, \"uniform3iv\", toIntArray, 3, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35673, getArraySetter.bind(null, \"uniform4iv\", toIntArray, 4, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35674, getArraySetter.bind(null, \"uniformMatrix2fv\", toFloatArray, 4, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35675, getArraySetter.bind(null, \"uniformMatrix3fv\", toFloatArray, 9, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35676, getArraySetter.bind(null, \"uniformMatrix4fv\", toFloatArray, 16, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35678, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35680, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 5125, getArraySetter.bind(null, \"uniform1uiv\", toUIntArray, 1, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36294, getArraySetter.bind(null, \"uniform2uiv\", toUIntArray, 2, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36295, getArraySetter.bind(null, \"uniform3uiv\", toUIntArray, 3, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36296, getArraySetter.bind(null, \"uniform4uiv\", toUIntArray, 4, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35685, getArraySetter.bind(null, \"uniformMatrix2x3fv\", toFloatArray, 6, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35686, getArraySetter.bind(null, \"uniformMatrix2x4fv\", toFloatArray, 8, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35687, getArraySetter.bind(null, \"uniformMatrix3x2fv\", toFloatArray, 6, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35688, getArraySetter.bind(null, \"uniformMatrix3x4fv\", toFloatArray, 12, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35689, getArraySetter.bind(null, \"uniformMatrix4x2fv\", toFloatArray, 8, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35690, getArraySetter.bind(null, \"uniformMatrix4x3fv\", toFloatArray, 12, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35679, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35682, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36289, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36292, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36293, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36298, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36299, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36300, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36303, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36306, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36307, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36308, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36311, getSamplerSetter), _UNIFORM_SETTERS);\nvar FLOAT_ARRAY = {};\nvar INT_ARRAY = {};\nvar UINT_ARRAY = {};\nvar array1 = [\n    0\n];\nfunction toTypedArray(value, uniformLength, Type, cache) {\n    if (uniformLength === 1 && typeof value === \"boolean\") value = value ? 1 : 0;\n    if (Number.isFinite(value)) {\n        array1[0] = value;\n        value = array1;\n    }\n    var length = value.length;\n    if (length % uniformLength) (0, _gltools.log).warn(\"Uniform size should be multiples of \".concat(uniformLength), value)();\n    if (value instanceof Type) return value;\n    var result = cache[length];\n    if (!result) {\n        result = new Type(length);\n        cache[length] = result;\n    }\n    for(var i = 0; i < length; i++)result[i] = value[i];\n    return result;\n}\nfunction toFloatArray(value, uniformLength) {\n    return toTypedArray(value, uniformLength, Float32Array, FLOAT_ARRAY);\n}\nfunction toIntArray(value, uniformLength) {\n    return toTypedArray(value, uniformLength, Int32Array, INT_ARRAY);\n}\nfunction toUIntArray(value, uniformLength) {\n    return toTypedArray(value, uniformLength, Uint32Array, UINT_ARRAY);\n}\nfunction parseUniformName(name) {\n    if (name[name.length - 1] !== \"]\") return {\n        name: name,\n        length: 1,\n        isArray: false\n    };\n    var UNIFORM_NAME_REGEXP = /([^[]*)(\\[[0-9]+\\])?/;\n    var matches = name.match(UNIFORM_NAME_REGEXP);\n    if (!matches || matches.length < 2) throw new Error(\"Failed to parse GLSL uniform name \".concat(name));\n    return {\n        name: matches[1],\n        length: matches[2] || 1,\n        isArray: Boolean(matches[2])\n    };\n}\nfunction getUniformSetter(gl, location, info) {\n    var setter = UNIFORM_SETTERS[info.type];\n    if (!setter) throw new Error(\"Unknown GLSL uniform type \".concat(info.type));\n    return setter().bind(null, gl, location);\n}\nfunction checkUniformValues(uniforms, source, uniformMap) {\n    for(var uniformName in uniforms){\n        var value = uniforms[uniformName];\n        var shouldCheck = !uniformMap || Boolean(uniformMap[uniformName]);\n        if (shouldCheck && !checkUniformValue(value)) {\n            source = source ? \"\".concat(source, \" \") : \"\";\n            console.error(\"\".concat(source, \" Bad uniform \").concat(uniformName), value);\n            throw new Error(\"\".concat(source, \" Bad uniform \").concat(uniformName));\n        }\n    }\n    return true;\n}\nfunction checkUniformValue(value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) return checkUniformArray(value);\n    if (isFinite(value)) return true;\n    else if (value === true || value === false) return true;\n    else if (value instanceof (0, _textureDefault.default)) return true;\n    else if (value instanceof (0, _renderbufferDefault.default)) return true;\n    else if (value instanceof (0, _framebufferDefault.default)) return Boolean(value.texture);\n    return false;\n}\nfunction checkUniformArray(value) {\n    if (value.length === 0) return false;\n    var checkLength = Math.min(value.length, 16);\n    for(var i = 0; i < checkLength; ++i){\n        if (!Number.isFinite(value[i])) return false;\n    }\n    return true;\n}\nfunction copyUniform(uniforms, key, value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n        if (uniforms[key]) {\n            var dest = uniforms[key];\n            for(var i = 0, len = value.length; i < len; ++i)dest[i] = value[i];\n        } else uniforms[key] = value.slice();\n    } else uniforms[key] = value;\n}\nfunction getSamplerSetter() {\n    var cache = null;\n    return function(gl, location, value) {\n        var update = cache !== value;\n        if (update) {\n            gl.uniform1i(location, value);\n            cache = value;\n        }\n        return update;\n    };\n}\nfunction getArraySetter(functionName, toArray, size, uniformSetter) {\n    var cache = null;\n    var cacheLength = null;\n    return function(gl, location, value) {\n        var arrayValue = toArray(value, size);\n        var length = arrayValue.length;\n        var update = false;\n        if (cache === null) {\n            cache = new Float32Array(length);\n            cacheLength = length;\n            update = true;\n        } else {\n            (0, _utils.assert)(cacheLength === length, \"Uniform length cannot change.\");\n            for(var i = 0; i < length; ++i)if (arrayValue[i] !== cache[i]) {\n                update = true;\n                break;\n            }\n        }\n        if (update) {\n            uniformSetter(gl, functionName, location, arrayValue);\n            cache.set(arrayValue);\n        }\n        return update;\n    };\n}\nfunction setVectorUniform(gl, functionName, location, value) {\n    gl[functionName](location, value);\n}\nfunction setMatrixUniform(gl, functionName, location, value) {\n    gl[functionName](location, false, value);\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@luma.gl/gltools\":\"7HW6a\",\"./framebuffer\":\"3wciM\",\"./renderbuffer\":\"4Dr1U\",\"./texture\":\"fa6ef\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9u2ie\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ProgramConfiguration);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _accessor = require(\"./accessor\");\nvar _accessorDefault = parcelHelpers.interopDefault(_accessor);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\nvar ProgramConfiguration = function() {\n    function ProgramConfiguration1(program) {\n        (0, _classCallCheckDefault.default)(this, ProgramConfiguration1);\n        this.id = program.id;\n        this.attributeInfos = [];\n        this.attributeInfosByName = {};\n        this.attributeInfosByLocation = [];\n        this.varyingInfos = [];\n        this.varyingInfosByName = {};\n        Object.seal(this);\n        this._readAttributesFromProgram(program);\n        this._readVaryingsFromProgram(program);\n    }\n    (0, _createClassDefault.default)(ProgramConfiguration1, [\n        {\n            key: \"getAttributeInfo\",\n            value: function getAttributeInfo(locationOrName) {\n                var location = Number(locationOrName);\n                if (Number.isFinite(location)) return this.attributeInfosByLocation[location];\n                return this.attributeInfosByName[locationOrName] || null;\n            }\n        },\n        {\n            key: \"getAttributeLocation\",\n            value: function getAttributeLocation(locationOrName) {\n                var attributeInfo = this.getAttributeInfo(locationOrName);\n                return attributeInfo ? attributeInfo.location : -1;\n            }\n        },\n        {\n            key: \"getAttributeAccessor\",\n            value: function getAttributeAccessor(locationOrName) {\n                var attributeInfo = this.getAttributeInfo(locationOrName);\n                return attributeInfo ? attributeInfo.accessor : null;\n            }\n        },\n        {\n            key: \"getVaryingInfo\",\n            value: function getVaryingInfo(locationOrName) {\n                var location = Number(locationOrName);\n                if (Number.isFinite(location)) return this.varyingInfos[location];\n                return this.varyingInfosByName[locationOrName] || null;\n            }\n        },\n        {\n            key: \"getVaryingIndex\",\n            value: function getVaryingIndex(locationOrName) {\n                var varying = this.getVaryingInfo();\n                return varying ? varying.location : -1;\n            }\n        },\n        {\n            key: \"getVaryingAccessor\",\n            value: function getVaryingAccessor(locationOrName) {\n                var varying = this.getVaryingInfo();\n                return varying ? varying.accessor : null;\n            }\n        },\n        {\n            key: \"_readAttributesFromProgram\",\n            value: function _readAttributesFromProgram(program) {\n                var gl = program.gl;\n                var count = gl.getProgramParameter(program.handle, 35721);\n                for(var index = 0; index < count; index++){\n                    var _gl$getActiveAttrib = gl.getActiveAttrib(program.handle, index), name = _gl$getActiveAttrib.name, type = _gl$getActiveAttrib.type, size = _gl$getActiveAttrib.size;\n                    var location = gl.getAttribLocation(program.handle, name);\n                    if (location >= 0) this._addAttribute(location, name, type, size);\n                }\n                this.attributeInfos.sort(function(a, b) {\n                    return a.location - b.location;\n                });\n            }\n        },\n        {\n            key: \"_readVaryingsFromProgram\",\n            value: function _readVaryingsFromProgram(program) {\n                var gl = program.gl;\n                if (!(0, _gltools.isWebGL2)(gl)) return;\n                var count = gl.getProgramParameter(program.handle, 35971);\n                for(var location = 0; location < count; location++){\n                    var _gl$getTransformFeedb = gl.getTransformFeedbackVarying(program.handle, location), name = _gl$getTransformFeedb.name, type = _gl$getTransformFeedb.type, size = _gl$getTransformFeedb.size;\n                    this._addVarying(location, name, type, size);\n                }\n                this.varyingInfos.sort(function(a, b) {\n                    return a.location - b.location;\n                });\n            }\n        },\n        {\n            key: \"_addAttribute\",\n            value: function _addAttribute(location, name, compositeType, size) {\n                var _decomposeCompositeGL = (0, _attributeUtils.decomposeCompositeGLType)(compositeType), type = _decomposeCompositeGL.type, components = _decomposeCompositeGL.components;\n                var accessor = {\n                    type: type,\n                    size: size * components\n                };\n                this._inferProperties(location, name, accessor);\n                var attributeInfo = {\n                    location: location,\n                    name: name,\n                    accessor: new (0, _accessorDefault.default)(accessor)\n                };\n                this.attributeInfos.push(attributeInfo);\n                this.attributeInfosByLocation[location] = attributeInfo;\n                this.attributeInfosByName[attributeInfo.name] = attributeInfo;\n            }\n        },\n        {\n            key: \"_inferProperties\",\n            value: function _inferProperties(location, name, accessor) {\n                if (/instance/i.test(name)) accessor.divisor = 1;\n            }\n        },\n        {\n            key: \"_addVarying\",\n            value: function _addVarying(location, name, compositeType, size) {\n                var _decomposeCompositeGL2 = (0, _attributeUtils.decomposeCompositeGLType)(compositeType), type = _decomposeCompositeGL2.type, components = _decomposeCompositeGL2.components;\n                var accessor = new (0, _accessorDefault.default)({\n                    type: type,\n                    size: size * components\n                });\n                var varying = {\n                    location: location,\n                    name: name,\n                    accessor: accessor\n                };\n                this.varyingInfos.push(varying);\n                this.varyingInfosByName[varying.name] = varying;\n            }\n        }\n    ]);\n    return ProgramConfiguration1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./accessor\":\"4UrSe\",\"@luma.gl/gltools\":\"7HW6a\",\"../webgl-utils/attribute-utils\":\"fjaGt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fjaGt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getPrimitiveDrawMode\", ()=>getPrimitiveDrawMode);\nparcelHelpers.export(exports, \"getPrimitiveCount\", ()=>getPrimitiveCount);\nparcelHelpers.export(exports, \"getVertexCount\", ()=>getVertexCount);\nparcelHelpers.export(exports, \"decomposeCompositeGLType\", ()=>decomposeCompositeGLType);\nparcelHelpers.export(exports, \"getCompositeGLType\", ()=>getCompositeGLType);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nvar _COMPOSITE_GL_TYPES;\nvar GL_BYTE = 0x1400;\nvar GL_UNSIGNED_BYTE = 0x1401;\nvar GL_SHORT = 0x1402;\nvar GL_UNSIGNED_SHORT = 0x1403;\nvar GL_POINTS = 0x0;\nvar GL_LINES = 0x1;\nvar GL_LINE_LOOP = 0x2;\nvar GL_LINE_STRIP = 0x3;\nvar GL_TRIANGLES = 0x4;\nvar GL_TRIANGLE_STRIP = 0x5;\nvar GL_TRIANGLE_FAN = 0x6;\nvar GL_FLOAT = 0x1406;\nvar GL_FLOAT_VEC2 = 0x8b50;\nvar GL_FLOAT_VEC3 = 0x8b51;\nvar GL_FLOAT_VEC4 = 0x8b52;\nvar GL_INT = 0x1404;\nvar GL_INT_VEC2 = 0x8b53;\nvar GL_INT_VEC3 = 0x8b54;\nvar GL_INT_VEC4 = 0x8b55;\nvar GL_UNSIGNED_INT = 0x1405;\nvar GL_UNSIGNED_INT_VEC2 = 0x8dc6;\nvar GL_UNSIGNED_INT_VEC3 = 0x8dc7;\nvar GL_UNSIGNED_INT_VEC4 = 0x8dc8;\nvar GL_BOOL = 0x8b56;\nvar GL_BOOL_VEC2 = 0x8b57;\nvar GL_BOOL_VEC3 = 0x8b58;\nvar GL_BOOL_VEC4 = 0x8b59;\nvar GL_FLOAT_MAT2 = 0x8b5a;\nvar GL_FLOAT_MAT3 = 0x8b5b;\nvar GL_FLOAT_MAT4 = 0x8b5c;\nvar GL_FLOAT_MAT2x3 = 0x8b65;\nvar GL_FLOAT_MAT2x4 = 0x8b66;\nvar GL_FLOAT_MAT3x2 = 0x8b67;\nvar GL_FLOAT_MAT3x4 = 0x8b68;\nvar GL_FLOAT_MAT4x2 = 0x8b69;\nvar GL_FLOAT_MAT4x3 = 0x8b6a;\nvar COMPOSITE_GL_TYPES = (_COMPOSITE_GL_TYPES = {}, (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT, [\n    GL_FLOAT,\n    1,\n    \"float\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC2, [\n    GL_FLOAT,\n    2,\n    \"vec2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC3, [\n    GL_FLOAT,\n    3,\n    \"vec3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC4, [\n    GL_FLOAT,\n    4,\n    \"vec4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_INT, [\n    GL_INT,\n    1,\n    \"int\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC2, [\n    GL_INT,\n    2,\n    \"ivec2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC3, [\n    GL_INT,\n    3,\n    \"ivec3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC4, [\n    GL_INT,\n    4,\n    \"ivec4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT, [\n    GL_UNSIGNED_INT,\n    1,\n    \"uint\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC2, [\n    GL_UNSIGNED_INT,\n    2,\n    \"uvec2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC3, [\n    GL_UNSIGNED_INT,\n    3,\n    \"uvec3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC4, [\n    GL_UNSIGNED_INT,\n    4,\n    \"uvec4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_BOOL, [\n    GL_FLOAT,\n    1,\n    \"bool\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC2, [\n    GL_FLOAT,\n    2,\n    \"bvec2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC3, [\n    GL_FLOAT,\n    3,\n    \"bvec3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC4, [\n    GL_FLOAT,\n    4,\n    \"bvec4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2, [\n    GL_FLOAT,\n    8,\n    \"mat2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2x3, [\n    GL_FLOAT,\n    8,\n    \"mat2x3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2x4, [\n    GL_FLOAT,\n    8,\n    \"mat2x4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3, [\n    GL_FLOAT,\n    12,\n    \"mat3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3x2, [\n    GL_FLOAT,\n    12,\n    \"mat3x2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3x4, [\n    GL_FLOAT,\n    12,\n    \"mat3x4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4, [\n    GL_FLOAT,\n    16,\n    \"mat4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4x2, [\n    GL_FLOAT,\n    16,\n    \"mat4x2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4x3, [\n    GL_FLOAT,\n    16,\n    \"mat4x3\"\n]), _COMPOSITE_GL_TYPES);\nfunction getPrimitiveDrawMode(drawMode) {\n    switch(drawMode){\n        case GL_POINTS:\n            return GL_POINTS;\n        case GL_LINES:\n            return GL_LINES;\n        case GL_LINE_STRIP:\n            return GL_LINES;\n        case GL_LINE_LOOP:\n            return GL_LINES;\n        case GL_TRIANGLES:\n            return GL_TRIANGLES;\n        case GL_TRIANGLE_STRIP:\n            return GL_TRIANGLES;\n        case GL_TRIANGLE_FAN:\n            return GL_TRIANGLES;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\nfunction getPrimitiveCount(_ref) {\n    var drawMode = _ref.drawMode, vertexCount = _ref.vertexCount;\n    switch(drawMode){\n        case GL_POINTS:\n        case GL_LINE_LOOP:\n            return vertexCount;\n        case GL_LINES:\n            return vertexCount / 2;\n        case GL_LINE_STRIP:\n            return vertexCount - 1;\n        case GL_TRIANGLES:\n            return vertexCount / 3;\n        case GL_TRIANGLE_STRIP:\n        case GL_TRIANGLE_FAN:\n            return vertexCount - 2;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\nfunction getVertexCount(_ref2) {\n    var drawMode = _ref2.drawMode, vertexCount = _ref2.vertexCount;\n    var primitiveCount = getPrimitiveCount({\n        drawMode: drawMode,\n        vertexCount: vertexCount\n    });\n    switch(getPrimitiveDrawMode(drawMode)){\n        case GL_POINTS:\n            return primitiveCount;\n        case GL_LINES:\n            return primitiveCount * 2;\n        case GL_TRIANGLES:\n            return primitiveCount * 3;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\nfunction decomposeCompositeGLType(compositeGLType) {\n    var typeAndSize = COMPOSITE_GL_TYPES[compositeGLType];\n    if (!typeAndSize) return null;\n    var _typeAndSize = (0, _slicedToArrayDefault.default)(typeAndSize, 2), type = _typeAndSize[0], components = _typeAndSize[1];\n    return {\n        type: type,\n        components: components\n    };\n}\nfunction getCompositeGLType(type, components) {\n    switch(type){\n        case GL_BYTE:\n        case GL_UNSIGNED_BYTE:\n        case GL_SHORT:\n        case GL_UNSIGNED_SHORT:\n            type = GL_FLOAT;\n            break;\n        default:\n    }\n    for(var glType in COMPOSITE_GL_TYPES){\n        var _COMPOSITE_GL_TYPES$g = (0, _slicedToArrayDefault.default)(COMPOSITE_GL_TYPES[glType], 3), compType = _COMPOSITE_GL_TYPES$g[0], compComponents = _COMPOSITE_GL_TYPES$g[1], name = _COMPOSITE_GL_TYPES$g[2];\n        if (compType === type && compComponents === components) return {\n            glType: glType,\n            name: name\n        };\n    }\n    return null;\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iG1rO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Query);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _features = require(\"../features\");\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _utils = require(\"../utils\");\nvar GL_QUERY_RESULT = 0x8866;\nvar GL_QUERY_RESULT_AVAILABLE = 0x8867;\nvar GL_TIME_ELAPSED_EXT = 0x88bf;\nvar GL_GPU_DISJOINT_EXT = 0x8fbb;\nvar GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8c88;\nvar GL_ANY_SAMPLES_PASSED = 0x8c2f;\nvar GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8d6a;\nvar Query = function(_Resource) {\n    (0, _inheritsDefault.default)(Query1, _Resource);\n    (0, _createClassDefault.default)(Query1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n                var webgl2 = (0, _gltools.isWebGL2)(gl);\n                var hasTimerQuery = (0, _features.hasFeatures)(gl, (0, _features.FEATURES).TIMER_QUERY);\n                var supported = webgl2 || hasTimerQuery;\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = opts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var key = _step.value;\n                        switch(key){\n                            case \"queries\":\n                                supported = supported && webgl2;\n                                break;\n                            case \"timers\":\n                                supported = supported && hasTimerQuery;\n                                break;\n                            default:\n                                (0, _utils.assert)(false);\n                        }\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                return supported;\n            }\n        }\n    ]);\n    function Query1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Query1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Query1).call(this, gl, opts));\n        _this.target = null;\n        _this._queryPending = false;\n        _this._pollingPromise = null;\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Query1, [\n        {\n            key: \"beginTimeElapsedQuery\",\n            value: function beginTimeElapsedQuery() {\n                return this.begin(GL_TIME_ELAPSED_EXT);\n            }\n        },\n        {\n            key: \"beginOcclusionQuery\",\n            value: function beginOcclusionQuery() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$conservative = _ref.conservative, conservative = _ref$conservative === void 0 ? false : _ref$conservative;\n                return this.begin(conservative ? GL_ANY_SAMPLES_PASSED_CONSERVATIVE : GL_ANY_SAMPLES_PASSED);\n            }\n        },\n        {\n            key: \"beginTransformFeedbackQuery\",\n            value: function beginTransformFeedbackQuery() {\n                return this.begin(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);\n            }\n        },\n        {\n            key: \"begin\",\n            value: function begin(target) {\n                if (this._queryPending) return this;\n                this.target = target;\n                this.gl.beginQuery(this.target, this.handle);\n                return this;\n            }\n        },\n        {\n            key: \"end\",\n            value: function end() {\n                if (this._queryPending) return this;\n                if (this.target) {\n                    this.gl.endQuery(this.target);\n                    this.target = null;\n                    this._queryPending = true;\n                }\n                return this;\n            }\n        },\n        {\n            key: \"isResultAvailable\",\n            value: function isResultAvailable() {\n                if (!this._queryPending) return false;\n                var resultAvailable = this.gl.getQueryParameter(this.handle, GL_QUERY_RESULT_AVAILABLE);\n                if (resultAvailable) this._queryPending = false;\n                return resultAvailable;\n            }\n        },\n        {\n            key: \"isTimerDisjoint\",\n            value: function isTimerDisjoint() {\n                return this.gl.getParameter(GL_GPU_DISJOINT_EXT);\n            }\n        },\n        {\n            key: \"getResult\",\n            value: function getResult() {\n                return this.gl.getQueryParameter(this.handle, GL_QUERY_RESULT);\n            }\n        },\n        {\n            key: \"getTimerMilliseconds\",\n            value: function getTimerMilliseconds() {\n                return this.getResult() / 1e6;\n            }\n        },\n        {\n            key: \"createPoll\",\n            value: function createPoll() {\n                var _this2 = this;\n                var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.POSITIVE_INFINITY;\n                if (this._pollingPromise) return this._pollingPromise;\n                var counter = 0;\n                this._pollingPromise = new Promise(function(resolve, reject) {\n                    var poll1 = function poll() {\n                        if (_this2.isResultAvailable()) {\n                            resolve(_this2.getResult());\n                            _this2._pollingPromise = null;\n                        } else if ((counter++) > limit) {\n                            reject(\"Timed out\");\n                            _this2._pollingPromise = null;\n                        } else requestAnimationFrame(poll);\n                    };\n                    requestAnimationFrame(poll1);\n                });\n                return this._pollingPromise;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return Query1.isSupported(this.gl) ? this.gl.createQuery() : null;\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteQuery(this.handle);\n            }\n        }\n    ]);\n    return Query1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./resource\":\"j3b8Q\",\"../features\":\"hzYKx\",\"@luma.gl/gltools\":\"7HW6a\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aZVan\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TransformFeedback);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar TransformFeedback = function(_Resource) {\n    (0, _inheritsDefault.default)(TransformFeedback1, _Resource);\n    (0, _createClassDefault.default)(TransformFeedback1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                return (0, _gltools.isWebGL2)(gl);\n            }\n        }\n    ]);\n    function TransformFeedback1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, TransformFeedback1);\n        (0, _webglUtils.assertWebGL2Context)(gl);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(TransformFeedback1).call(this, gl, props));\n        _this.initialize(props);\n        _this.stubRemovedMethods(\"TransformFeedback\", \"v6.0\", [\n            \"pause\",\n            \"resume\"\n        ]);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(TransformFeedback1, [\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var _this2 = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this.buffers = {};\n                this.unused = {};\n                this.configuration = null;\n                this.bindOnUse = true;\n                if (!(0, _utils.isObjectEmpty)(this.buffers)) this.bind(function() {\n                    return _this2._unbindBuffers();\n                });\n                this.setProps(props);\n                return this;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"program\" in props) this.configuration = props.program && props.program.configuration;\n                if (\"configuration\" in props) this.configuration = props.configuration;\n                if (\"bindOnUse\" in props) props = props.bindOnUse;\n                if (\"buffers\" in props) this.setBuffers(props.buffers);\n            }\n        },\n        {\n            key: \"setBuffers\",\n            value: function setBuffers() {\n                var _this3 = this;\n                var buffers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this.bind(function() {\n                    for(var bufferName in buffers)_this3.setBuffer(bufferName, buffers[bufferName]);\n                });\n                return this;\n            }\n        },\n        {\n            key: \"setBuffer\",\n            value: function setBuffer(locationOrName, bufferOrParams) {\n                var _this4 = this;\n                var location = this._getVaryingIndex(locationOrName);\n                var _this$_getBufferParam = this._getBufferParams(bufferOrParams), buffer = _this$_getBufferParam.buffer, byteSize = _this$_getBufferParam.byteSize, byteOffset = _this$_getBufferParam.byteOffset;\n                if (location < 0) {\n                    this.unused[locationOrName] = buffer;\n                    (0, _gltools.log).warn(function() {\n                        return \"\".concat(_this4.id, \" unused varying buffer \").concat(locationOrName);\n                    })();\n                    return this;\n                }\n                this.buffers[location] = bufferOrParams;\n                if (!this.bindOnUse) this._bindBuffer(location, buffer, byteOffset, byteSize);\n                return this;\n            }\n        },\n        {\n            key: \"begin\",\n            value: function begin() {\n                var primitiveMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n                this.gl.bindTransformFeedback(36386, this.handle);\n                this._bindBuffers();\n                this.gl.beginTransformFeedback(primitiveMode);\n                return this;\n            }\n        },\n        {\n            key: \"end\",\n            value: function end() {\n                this.gl.endTransformFeedback();\n                this._unbindBuffers();\n                this.gl.bindTransformFeedback(36386, null);\n                return this;\n            }\n        },\n        {\n            key: \"_getBufferParams\",\n            value: function _getBufferParams(bufferOrParams) {\n                var byteOffset;\n                var byteSize;\n                var buffer;\n                if (bufferOrParams instanceof (0, _bufferDefault.default) === false) {\n                    buffer = bufferOrParams.buffer;\n                    byteSize = bufferOrParams.byteSize;\n                    byteOffset = bufferOrParams.byteOffset;\n                } else buffer = bufferOrParams;\n                if (byteOffset !== undefined || byteSize !== undefined) {\n                    byteOffset = byteOffset || 0;\n                    byteSize = byteSize || buffer.byteLength - byteOffset;\n                }\n                return {\n                    buffer: buffer,\n                    byteOffset: byteOffset,\n                    byteSize: byteSize\n                };\n            }\n        },\n        {\n            key: \"_getVaryingInfo\",\n            value: function _getVaryingInfo(locationOrName) {\n                return this.configuration && this.configuration.getVaryingInfo(locationOrName);\n            }\n        },\n        {\n            key: \"_getVaryingIndex\",\n            value: function _getVaryingIndex(locationOrName) {\n                if (this.configuration) return this.configuration.getVaryingInfo(locationOrName).location;\n                var location = Number(locationOrName);\n                return Number.isFinite(location) ? location : -1;\n            }\n        },\n        {\n            key: \"_bindBuffers\",\n            value: function _bindBuffers() {\n                if (this.bindOnUse) for(var bufferIndex in this.buffers){\n                    var _this$_getBufferParam2 = this._getBufferParams(this.buffers[bufferIndex]), buffer = _this$_getBufferParam2.buffer, byteSize = _this$_getBufferParam2.byteSize, byteOffset = _this$_getBufferParam2.byteOffset;\n                    this._bindBuffer(bufferIndex, buffer, byteOffset, byteSize);\n                }\n            }\n        },\n        {\n            key: \"_unbindBuffers\",\n            value: function _unbindBuffers() {\n                if (this.bindOnUse) for(var bufferIndex in this.buffers)this._bindBuffer(bufferIndex, null);\n            }\n        },\n        {\n            key: \"_bindBuffer\",\n            value: function _bindBuffer(index, buffer) {\n                var byteOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n                var byteSize = arguments.length > 3 ? arguments[3] : undefined;\n                var handle = buffer && buffer.handle;\n                if (!handle || byteSize === undefined) this.gl.bindBufferBase(35982, index, handle);\n                else this.gl.bindBufferRange(35982, index, handle, byteOffset, byteSize);\n                return this;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createTransformFeedback();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteTransformFeedback(this.handle);\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle(handle) {\n                this.gl.bindTransformFeedback(36386, this.handle);\n            }\n        }\n    ]);\n    return TransformFeedback1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@luma.gl/gltools\":\"7HW6a\",\"./resource\":\"j3b8Q\",\"./buffer\":\"b1PWl\",\"../webgl-utils\":\"hZtIX\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"adlIK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>VertexArrayObject);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _arrayUtilsFlat = require(\"../utils/array-utils-flat\");\nvar _utils = require(\"../utils\");\nvar _probeGl = require(\"probe.gl\");\nvar ERR_ELEMENTS = \"elements must be GL.ELEMENT_ARRAY_BUFFER\";\nvar VertexArrayObject = function(_Resource) {\n    (0, _inheritsDefault.default)(VertexArrayObject1, _Resource);\n    (0, _createClassDefault.default)(VertexArrayObject1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                if (options.constantAttributeZero) return (0, _gltools.isWebGL2)(gl) || (0, _probeGl.getBrowser)() === \"Chrome\";\n                return true;\n            }\n        },\n        {\n            key: \"getDefaultArray\",\n            value: function getDefaultArray(gl) {\n                gl.luma = gl.luma || {};\n                if (!gl.luma.defaultVertexArray) gl.luma.defaultVertexArray = new VertexArrayObject1(gl, {\n                    handle: null,\n                    isDefaultArray: true\n                });\n                return gl.luma.defaultVertexArray;\n            }\n        },\n        {\n            key: \"getMaxAttributes\",\n            value: function getMaxAttributes(gl) {\n                VertexArrayObject1.MAX_ATTRIBUTES = VertexArrayObject1.MAX_ATTRIBUTES || gl.getParameter(34921);\n                return VertexArrayObject1.MAX_ATTRIBUTES;\n            }\n        },\n        {\n            key: \"setConstant\",\n            value: function setConstant(gl, location, array) {\n                switch(array.constructor){\n                    case Float32Array:\n                        VertexArrayObject1._setConstantFloatArray(gl, location, array);\n                        break;\n                    case Int32Array:\n                        VertexArrayObject1._setConstantIntArray(gl, location, array);\n                        break;\n                    case Uint32Array:\n                        VertexArrayObject1._setConstantUintArray(gl, location, array);\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n            }\n        }\n    ]);\n    function VertexArrayObject1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, VertexArrayObject1);\n        var id = opts.id || opts.program && opts.program.id;\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(VertexArrayObject1).call(this, gl, Object.assign({}, opts, {\n            id: id\n        })));\n        _this.buffer = null;\n        _this.bufferValue = null;\n        _this.isDefaultArray = opts.isDefaultArray || false;\n        _this.initialize(opts);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(VertexArrayObject1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(VertexArrayObject1.prototype), \"delete\", this).call(this);\n                if (this.buffer) this.buffer[\"delete\"]();\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                return this.setProps(props);\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                return this;\n            }\n        },\n        {\n            key: \"setElementBuffer\",\n            value: function setElementBuffer() {\n                var _this2 = this;\n                var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                (0, _utils.assert)(!elementBuffer || elementBuffer.target === 34963, ERR_ELEMENTS);\n                this.bind(function() {\n                    _this2.gl.bindBuffer(34963, elementBuffer ? elementBuffer.handle : null);\n                });\n                return this;\n            }\n        },\n        {\n            key: \"setBuffer\",\n            value: function setBuffer(location, buffer, accessor) {\n                if (buffer.target === 34963) return this.setElementBuffer(buffer, accessor);\n                var size = accessor.size, type = accessor.type, stride = accessor.stride, offset = accessor.offset, normalized = accessor.normalized, integer = accessor.integer, divisor = accessor.divisor;\n                var gl = this.gl;\n                location = Number(location);\n                this.bind(function() {\n                    gl.bindBuffer(34962, buffer.handle);\n                    if (integer) {\n                        (0, _utils.assert)((0, _gltools.isWebGL2)(gl));\n                        gl.vertexAttribIPointer(location, size, type, stride, offset);\n                    } else gl.vertexAttribPointer(location, size, type, normalized, stride, offset);\n                    gl.enableVertexAttribArray(location);\n                    gl.vertexAttribDivisor(location, divisor || 0);\n                });\n                return this;\n            }\n        },\n        {\n            key: \"enable\",\n            value: function enable(location) {\n                var _this3 = this;\n                var _enable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n                var disablingAttributeZero = !_enable && location === 0 && !VertexArrayObject1.isSupported(this.gl, {\n                    constantAttributeZero: true\n                });\n                if (!disablingAttributeZero) {\n                    location = Number(location);\n                    this.bind(function() {\n                        return _enable ? _this3.gl.enableVertexAttribArray(location) : _this3.gl.disableVertexAttribArray(location);\n                    });\n                }\n                return this;\n            }\n        },\n        {\n            key: \"getConstantBuffer\",\n            value: function getConstantBuffer(elementCount, value, accessor) {\n                var constantValue = this._normalizeConstantArrayValue(value, accessor);\n                var byteLength = constantValue.byteLength * elementCount;\n                var length = constantValue.length * elementCount;\n                var updateNeeded = !this.buffer;\n                this.buffer = this.buffer || new (0, _bufferDefault.default)(this.gl, byteLength);\n                updateNeeded = updateNeeded || this.buffer.reallocate(byteLength);\n                updateNeeded = updateNeeded || !this._compareConstantArrayValues(constantValue, this.bufferValue);\n                if (updateNeeded) {\n                    var typedArray = (0, _arrayUtilsFlat.getScratchArray)(value.constructor, length);\n                    (0, _arrayUtilsFlat.fillArray)({\n                        target: typedArray,\n                        source: constantValue,\n                        start: 0,\n                        count: length\n                    });\n                    this.buffer.subData(typedArray);\n                    this.bufferValue = value;\n                }\n                return this.buffer;\n            }\n        },\n        {\n            key: \"_normalizeConstantArrayValue\",\n            value: function _normalizeConstantArrayValue(arrayValue, accessor) {\n                if (Array.isArray(arrayValue)) return new Float32Array(arrayValue);\n                return arrayValue;\n            }\n        },\n        {\n            key: \"_compareConstantArrayValues\",\n            value: function _compareConstantArrayValues(v1, v2) {\n                if (!v1 || !v2 || v1.length !== v2.length || v1.constructor !== v2.constructor) return false;\n                for(var i = 0; i < v1.length; ++i){\n                    if (v1[i] !== v2[i]) return false;\n                }\n                return true;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createVertexArray();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle(handle) {\n                this.gl.deleteVertexArray(handle);\n                return [\n                    this.elements\n                ];\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle(handle) {\n                this.gl.bindVertexArray(handle);\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname, _ref) {\n                var _this4 = this;\n                var location = _ref.location;\n                (0, _utils.assert)(Number.isFinite(location));\n                return this.bind(function() {\n                    switch(pname){\n                        case 34373:\n                            return _this4.gl.getVertexAttribOffset(location, pname);\n                        default:\n                            return _this4.gl.getVertexAttrib(location, pname);\n                    }\n                });\n            }\n        },\n        {\n            key: \"MAX_ATTRIBUTES\",\n            get: function get() {\n                return VertexArrayObject1.getMaxAttributes(this.gl);\n            }\n        }\n    ], [\n        {\n            key: \"_setConstantFloatArray\",\n            value: function _setConstantFloatArray(gl, location, array) {\n                switch(array.length){\n                    case 1:\n                        gl.vertexAttrib1fv(location, array);\n                        break;\n                    case 2:\n                        gl.vertexAttrib2fv(location, array);\n                        break;\n                    case 3:\n                        gl.vertexAttrib3fv(location, array);\n                        break;\n                    case 4:\n                        gl.vertexAttrib4fv(location, array);\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n            }\n        },\n        {\n            key: \"_setConstantIntArray\",\n            value: function _setConstantIntArray(gl, location, array) {\n                (0, _utils.assert)((0, _gltools.isWebGL2)(gl));\n                switch(array.length){\n                    case 1:\n                        gl.vertexAttribI1iv(location, array);\n                        break;\n                    case 2:\n                        gl.vertexAttribI2iv(location, array);\n                        break;\n                    case 3:\n                        gl.vertexAttribI3iv(location, array);\n                        break;\n                    case 4:\n                        gl.vertexAttribI4iv(location, array);\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n            }\n        },\n        {\n            key: \"_setConstantUintArray\",\n            value: function _setConstantUintArray(gl, location, array) {\n                (0, _utils.assert)((0, _gltools.isWebGL2)(gl));\n                switch(array.length){\n                    case 1:\n                        gl.vertexAttribI1uiv(location, array);\n                        break;\n                    case 2:\n                        gl.vertexAttribI2uiv(location, array);\n                        break;\n                    case 3:\n                        gl.vertexAttribI3uiv(location, array);\n                        break;\n                    case 4:\n                        gl.vertexAttribI4uiv(location, array);\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n            }\n        }\n    ]);\n    return VertexArrayObject1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./resource\":\"j3b8Q\",\"./buffer\":\"b1PWl\",\"@luma.gl/gltools\":\"7HW6a\",\"../utils/array-utils-flat\":\"6TNFQ\",\"../utils\":\"eK1k6\",\"probe.gl\":\"2Bw0B\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6TNFQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getScratchArrayBuffer\", ()=>getScratchArrayBuffer);\nparcelHelpers.export(exports, \"getScratchArray\", ()=>getScratchArray);\nparcelHelpers.export(exports, \"fillArray\", ()=>fillArray);\nvar arrayBuffer = null;\nfunction getScratchArrayBuffer(byteLength) {\n    if (!arrayBuffer || arrayBuffer.byteLength < byteLength) arrayBuffer = new ArrayBuffer(byteLength);\n    return arrayBuffer;\n}\nfunction getScratchArray(Type, length) {\n    var scratchArrayBuffer = getScratchArrayBuffer(Type.BYTES_PER_ELEMENT * length);\n    return new Type(scratchArrayBuffer, 0, length);\n}\nfunction fillArray(_ref) {\n    var target = _ref.target, source = _ref.source, _ref$start = _ref.start, start = _ref$start === void 0 ? 0 : _ref$start, _ref$count = _ref.count, count = _ref$count === void 0 ? 1 : _ref$count;\n    var length = source.length;\n    var total = count * length;\n    var copied = 0;\n    for(var i = start; copied < length; copied++)target[i++] = source[copied];\n    while(copied < total)if (copied < total - copied) {\n        target.copyWithin(start + copied, start, start + copied);\n        copied *= 2;\n    } else {\n        target.copyWithin(start + copied, start, start + total - copied);\n        copied = total;\n    }\n    return target;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hktpI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>VertexArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _accessor = require(\"./accessor\");\nvar _accessorDefault = parcelHelpers.interopDefault(_accessor);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _vertexArrayObject = require(\"./vertex-array-object\");\nvar _vertexArrayObjectDefault = parcelHelpers.interopDefault(_vertexArrayObject);\nvar _utils = require(\"../utils\");\nvar ERR_ATTRIBUTE_TYPE = \"VertexArray: attributes must be Buffers or constants (i.e. typed array)\";\nvar MULTI_LOCATION_ATTRIBUTE_REGEXP = /^(.+)__LOCATION_([0-9]+)$/;\nvar DEPRECATIONS_V6 = [\n    \"setBuffers\",\n    \"setGeneric\",\n    \"clearBindings\",\n    \"setLocations\",\n    \"setGenericValues\",\n    \"setDivisor\",\n    \"enable\",\n    \"disable\"\n];\nvar VertexArray = function() {\n    function VertexArray1(gl) {\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, VertexArray1);\n        var id = opts.id || opts.program && opts.program.id;\n        this.id = id;\n        this.gl = gl;\n        this.configuration = null;\n        this.elements = null;\n        this.elementsAccessor = null;\n        this.values = null;\n        this.accessors = null;\n        this.unused = null;\n        this.drawParams = null;\n        this.buffer = null;\n        this.attributes = {};\n        this.vertexArrayObject = new (0, _vertexArrayObjectDefault.default)(gl);\n        (0, _utils.stubRemovedMethods)(this, \"VertexArray\", \"v6.0\", DEPRECATIONS_V6);\n        this.initialize(opts);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(VertexArray1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                if (this.buffer) this.buffer[\"delete\"]();\n                this.vertexArrayObject[\"delete\"]();\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this.reset();\n                this.configuration = null;\n                this.bindOnUse = false;\n                return this.setProps(props);\n            }\n        },\n        {\n            key: \"reset\",\n            value: function reset() {\n                this.elements = null;\n                this.elementsAccessor = null;\n                var MAX_ATTRIBUTES = this.vertexArrayObject.MAX_ATTRIBUTES;\n                this.values = new Array(MAX_ATTRIBUTES).fill(null);\n                this.accessors = new Array(MAX_ATTRIBUTES).fill(null);\n                this.unused = {};\n                this.drawParams = null;\n                return this;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"program\" in props) this.configuration = props.program && props.program.configuration;\n                if (\"configuration\" in props) this.configuration = props.configuration;\n                if (\"attributes\" in props) this.setAttributes(props.attributes);\n                if (\"elements\" in props) this.setElementBuffer(props.elements);\n                if (\"bindOnUse\" in props) props = props.bindOnUse;\n                return this;\n            }\n        },\n        {\n            key: \"clearDrawParams\",\n            value: function clearDrawParams() {\n                this.drawParams = null;\n            }\n        },\n        {\n            key: \"getDrawParams\",\n            value: function getDrawParams() {\n                this.drawParams = this.drawParams || this._updateDrawParams();\n                return this.drawParams;\n            }\n        },\n        {\n            key: \"setAttributes\",\n            value: function setAttributes(attributes) {\n                var _this = this;\n                Object.assign(this.attributes, attributes);\n                this.vertexArrayObject.bind(function() {\n                    for(var locationOrName in attributes){\n                        var value = attributes[locationOrName];\n                        _this._setAttribute(locationOrName, value);\n                    }\n                    _this.gl.bindBuffer(34962, null);\n                });\n                return this;\n            }\n        },\n        {\n            key: \"setElementBuffer\",\n            value: function setElementBuffer() {\n                var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                var accessor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                this.elements = elementBuffer;\n                this.elementsAccessor = accessor;\n                this.clearDrawParams();\n                this.vertexArrayObject.setElementBuffer(elementBuffer, accessor);\n                return this;\n            }\n        },\n        {\n            key: \"setBuffer\",\n            value: function setBuffer(locationOrName, buffer) {\n                var appAccessor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n                if (buffer.target === 34963) return this.setElementBuffer(buffer, appAccessor);\n                var _this$_resolveLocatio = this._resolveLocationAndAccessor(locationOrName, buffer, buffer.accessor, appAccessor), location = _this$_resolveLocatio.location, accessor = _this$_resolveLocatio.accessor;\n                if (location >= 0) {\n                    this.values[location] = buffer;\n                    this.accessors[location] = accessor;\n                    this.clearDrawParams();\n                    this.vertexArrayObject.setBuffer(location, buffer, accessor);\n                }\n                return this;\n            }\n        },\n        {\n            key: \"setConstant\",\n            value: function setConstant(locationOrName, arrayValue) {\n                var appAccessor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n                var _this$_resolveLocatio2 = this._resolveLocationAndAccessor(locationOrName, arrayValue, Object.assign({\n                    size: arrayValue.length\n                }, appAccessor)), location = _this$_resolveLocatio2.location, accessor = _this$_resolveLocatio2.accessor;\n                if (location >= 0) {\n                    arrayValue = this.vertexArrayObject._normalizeConstantArrayValue(arrayValue, accessor);\n                    this.values[location] = arrayValue;\n                    this.accessors[location] = accessor;\n                    this.clearDrawParams();\n                    this.vertexArrayObject.enable(location, false);\n                }\n                return this;\n            }\n        },\n        {\n            key: \"unbindBuffers\",\n            value: function unbindBuffers() {\n                var _this2 = this;\n                this.vertexArrayObject.bind(function() {\n                    if (_this2.elements) _this2.vertexArrayObject.setElementBuffer(null);\n                    _this2.buffer = _this2.buffer || new (0, _bufferDefault.default)(_this2.gl, {\n                        accessor: {\n                            size: 4\n                        }\n                    });\n                    for(var location = 0; location < _this2.vertexArrayObject.MAX_ATTRIBUTES; location++)if (_this2.values[location] instanceof (0, _bufferDefault.default)) {\n                        _this2.gl.disableVertexAttribArray(location);\n                        _this2.gl.bindBuffer(34962, _this2.buffer.handle);\n                        _this2.gl.vertexAttribPointer(location, 1, 5126, false, 0, 0);\n                    }\n                });\n                return this;\n            }\n        },\n        {\n            key: \"bindBuffers\",\n            value: function bindBuffers() {\n                var _this3 = this;\n                this.vertexArrayObject.bind(function() {\n                    if (_this3.elements) _this3.setElementBuffer(_this3.elements);\n                    for(var location = 0; location < _this3.vertexArrayObject.MAX_ATTRIBUTES; location++){\n                        var buffer = _this3.values[location];\n                        if (buffer instanceof (0, _bufferDefault.default)) _this3.setBuffer(location, buffer);\n                    }\n                });\n                return this;\n            }\n        },\n        {\n            key: \"bindForDraw\",\n            value: function bindForDraw(vertexCount, instanceCount, func) {\n                var _this4 = this;\n                var value;\n                this.vertexArrayObject.bind(function() {\n                    _this4._setConstantAttributes(vertexCount, instanceCount);\n                    value = func();\n                });\n                return value;\n            }\n        },\n        {\n            key: \"_resolveLocationAndAccessor\",\n            value: function _resolveLocationAndAccessor(locationOrName, value, valueAccessor, appAccessor) {\n                var _this5 = this;\n                var _this$_getAttributeIn = this._getAttributeIndex(locationOrName), location = _this$_getAttributeIn.location, name = _this$_getAttributeIn.name;\n                if (!Number.isFinite(location) || location < 0) {\n                    this.unused[locationOrName] = value;\n                    (0, _gltools.log).once(3, function() {\n                        return \"unused value \".concat(locationOrName, \" in \").concat(_this5.id);\n                    })();\n                    return this;\n                }\n                var accessInfo = this._getAttributeInfo(name || location);\n                if (!accessInfo) return {\n                    location: -1,\n                    accessor: null\n                };\n                var currentAccessor = this.accessors[location] || {};\n                var accessor = (0, _accessorDefault.default).resolve(accessInfo.accessor, currentAccessor, valueAccessor, appAccessor);\n                var size = accessor.size, type = accessor.type;\n                (0, _utils.assert)(Number.isFinite(size) && Number.isFinite(type));\n                return {\n                    location: location,\n                    accessor: accessor\n                };\n            }\n        },\n        {\n            key: \"_getAttributeInfo\",\n            value: function _getAttributeInfo(attributeName) {\n                return this.configuration && this.configuration.getAttributeInfo(attributeName);\n            }\n        },\n        {\n            key: \"_getAttributeIndex\",\n            value: function _getAttributeIndex(locationOrName) {\n                var location = Number(locationOrName);\n                if (Number.isFinite(location)) return {\n                    location: location\n                };\n                var multiLocation = MULTI_LOCATION_ATTRIBUTE_REGEXP.exec(locationOrName);\n                var name = multiLocation ? multiLocation[1] : locationOrName;\n                var locationOffset = multiLocation ? Number(multiLocation[2]) : 0;\n                if (this.configuration) return {\n                    location: this.configuration.getAttributeLocation(name) + locationOffset,\n                    name: name\n                };\n                return {\n                    location: -1\n                };\n            }\n        },\n        {\n            key: \"_setAttribute\",\n            value: function _setAttribute(locationOrName, value) {\n                if (value instanceof (0, _bufferDefault.default)) this.setBuffer(locationOrName, value);\n                else if (Array.isArray(value) && value.length && value[0] instanceof (0, _bufferDefault.default)) {\n                    var buffer = value[0];\n                    var accessor = value[1];\n                    this.setBuffer(locationOrName, buffer, accessor);\n                } else if (ArrayBuffer.isView(value) || Array.isArray(value)) {\n                    var constant = value;\n                    this.setConstant(locationOrName, constant);\n                } else if (value.buffer instanceof (0, _bufferDefault.default)) {\n                    var _accessor1 = value;\n                    this.setBuffer(locationOrName, _accessor1.buffer, _accessor1);\n                } else throw new Error(ERR_ATTRIBUTE_TYPE);\n            }\n        },\n        {\n            key: \"_setConstantAttributes\",\n            value: function _setConstantAttributes(vertexCount, instanceCount) {\n                var elementCount = Math.max(vertexCount | 0, instanceCount | 0);\n                var constant = this.values[0];\n                if (ArrayBuffer.isView(constant)) this._setConstantAttributeZero(constant, elementCount);\n                for(var location = 1; location < this.vertexArrayObject.MAX_ATTRIBUTES; location++){\n                    constant = this.values[location];\n                    if (ArrayBuffer.isView(constant)) this._setConstantAttribute(location, constant);\n                }\n            }\n        },\n        {\n            key: \"_setConstantAttributeZero\",\n            value: function _setConstantAttributeZero(constant, elementCount) {\n                if ((0, _vertexArrayObjectDefault.default).isSupported(this.gl, {\n                    constantAttributeZero: true\n                })) {\n                    this._setConstantAttribute(0, constant);\n                    return;\n                }\n                var buffer = this.vertexArrayObject.getConstantBuffer(elementCount, constant);\n                this.vertexArrayObject.setBuffer(0, buffer, this.accessors[0]);\n            }\n        },\n        {\n            key: \"_setConstantAttribute\",\n            value: function _setConstantAttribute(location, constant) {\n                (0, _vertexArrayObjectDefault.default).setConstant(this.gl, location, constant);\n            }\n        },\n        {\n            key: \"_updateDrawParams\",\n            value: function _updateDrawParams() {\n                var drawParams = {\n                    isIndexed: false,\n                    isInstanced: false,\n                    indexCount: Infinity,\n                    vertexCount: Infinity,\n                    instanceCount: Infinity\n                };\n                for(var location = 0; location < this.vertexArrayObject.MAX_ATTRIBUTES; location++)this._updateDrawParamsForLocation(drawParams, location);\n                if (this.elements) {\n                    drawParams.elementCount = this.elements.getElementCount(this.elements.accessor);\n                    drawParams.isIndexed = true;\n                    drawParams.indexType = this.elementsAccessor.type || this.elements.accessor.type;\n                    drawParams.indexOffset = this.elementsAccessor.offset || 0;\n                }\n                if (drawParams.indexCount === Infinity) drawParams.indexCount = 0;\n                if (drawParams.vertexCount === Infinity) drawParams.vertexCount = 0;\n                if (drawParams.instanceCount === Infinity) drawParams.instanceCount = 0;\n                return drawParams;\n            }\n        },\n        {\n            key: \"_updateDrawParamsForLocation\",\n            value: function _updateDrawParamsForLocation(drawParams, location) {\n                var value = this.values[location];\n                var accessor = this.accessors[location];\n                if (!value) return;\n                var divisor = accessor.divisor;\n                var isInstanced = divisor > 0;\n                drawParams.isInstanced = drawParams.isInstanced || isInstanced;\n                if (value instanceof (0, _bufferDefault.default)) {\n                    var buffer = value;\n                    if (isInstanced) {\n                        var instanceCount = buffer.getVertexCount(accessor);\n                        drawParams.instanceCount = Math.min(drawParams.instanceCount, instanceCount);\n                    } else {\n                        var vertexCount = buffer.getVertexCount(accessor);\n                        drawParams.vertexCount = Math.min(drawParams.vertexCount, vertexCount);\n                    }\n                }\n            }\n        },\n        {\n            key: \"setElements\",\n            value: function setElements() {\n                var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                var accessor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                (0, _gltools.log).deprecated(\"setElements\", \"setElementBuffer\")();\n                return this.setElementBuffer(elementBuffer, accessor);\n            }\n        }\n    ]);\n    return VertexArray1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/gltools\":\"7HW6a\",\"./accessor\":\"4UrSe\",\"./buffer\":\"b1PWl\",\"./vertex-array-object\":\"adlIK\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i7eCT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getDebugTableForUniforms\", ()=>getDebugTableForUniforms);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nfunction getDebugTableForUniforms() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$header = _ref.header, header = _ref$header === void 0 ? \"Uniforms\" : _ref$header, program = _ref.program, uniforms = _ref.uniforms, _ref$undefinedOnly = _ref.undefinedOnly, undefinedOnly = _ref$undefinedOnly === void 0 ? false : _ref$undefinedOnly;\n    (0, _utils.assert)(program);\n    var SHADER_MODULE_UNIFORM_REGEXP = \".*_.*\";\n    var PROJECT_MODULE_UNIFORM_REGEXP = \".*Matrix\";\n    var uniformLocations = program._uniformSetters;\n    var table = {};\n    var uniformNames = Object.keys(uniformLocations).sort();\n    var count = 0;\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = uniformNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var _uniformName = _step.value;\n            if (!_uniformName.match(SHADER_MODULE_UNIFORM_REGEXP) && !_uniformName.match(PROJECT_MODULE_UNIFORM_REGEXP)) {\n                if (addUniformToTable({\n                    table: table,\n                    header: header,\n                    uniforms: uniforms,\n                    uniformName: _uniformName,\n                    undefinedOnly: undefinedOnly\n                })) count++;\n            }\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n    try {\n        for(var _iterator2 = uniformNames[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n            var _uniformName2 = _step2.value;\n            if (_uniformName2.match(PROJECT_MODULE_UNIFORM_REGEXP)) {\n                if (addUniformToTable({\n                    table: table,\n                    header: header,\n                    uniforms: uniforms,\n                    uniformName: _uniformName2,\n                    undefinedOnly: undefinedOnly\n                })) count++;\n            }\n        }\n    } catch (err1) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err1;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n        } finally{\n            if (_didIteratorError2) throw _iteratorError2;\n        }\n    }\n    var _iteratorNormalCompletion3 = true;\n    var _didIteratorError3 = false;\n    var _iteratorError3 = undefined;\n    try {\n        for(var _iterator3 = uniformNames[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){\n            var _uniformName3 = _step3.value;\n            if (!table[_uniformName3]) {\n                if (addUniformToTable({\n                    table: table,\n                    header: header,\n                    uniforms: uniforms,\n                    uniformName: _uniformName3,\n                    undefinedOnly: undefinedOnly\n                })) count++;\n            }\n        }\n    } catch (err2) {\n        _didIteratorError3 = true;\n        _iteratorError3 = err2;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) _iterator3[\"return\"]();\n        } finally{\n            if (_didIteratorError3) throw _iteratorError3;\n        }\n    }\n    var unusedCount = 0;\n    var unusedTable = {};\n    if (!undefinedOnly) for(var uniformName in uniforms){\n        var uniform = uniforms[uniformName];\n        if (!table[uniformName]) {\n            unusedCount++;\n            unusedTable[uniformName] = (0, _definePropertyDefault.default)({\n                Type: \"NOT USED: \".concat(uniform)\n            }, header, (0, _utils.formatValue)(uniform));\n        }\n    }\n    return {\n        table: table,\n        count: count,\n        unusedTable: unusedTable,\n        unusedCount: unusedCount\n    };\n}\nfunction addUniformToTable(_ref2) {\n    var table = _ref2.table, header = _ref2.header, uniforms = _ref2.uniforms, uniformName = _ref2.uniformName, undefinedOnly = _ref2.undefinedOnly;\n    var value = uniforms[uniformName];\n    var isDefined = isUniformDefined(value);\n    if (!undefinedOnly || !isDefined) {\n        var _table$uniformName;\n        table[uniformName] = (_table$uniformName = {}, (0, _definePropertyDefault.default)(_table$uniformName, header, isDefined ? (0, _utils.formatValue)(value) : \"N/A\"), (0, _definePropertyDefault.default)(_table$uniformName, \"Uniform Type\", isDefined ? value : \"NOT PROVIDED\"), _table$uniformName);\n        return true;\n    }\n    return false;\n}\nfunction isUniformDefined(value) {\n    return value !== undefined && value !== null;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dOPl2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getDebugTableForVertexArray\", ()=>getDebugTableForVertexArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _buffer = require(\"../classes/buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\nvar _utils = require(\"../utils\");\nfunction getDebugTableForVertexArray() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, vertexArray = _ref.vertexArray, _ref$header = _ref.header, header = _ref$header === void 0 ? \"Attributes\" : _ref$header;\n    if (!vertexArray.configuration) return {};\n    var table = {};\n    if (vertexArray.elements) table.ELEMENT_ARRAY_BUFFER = getDebugTableRow(vertexArray, vertexArray.elements, null, header);\n    var attributes = vertexArray.values;\n    for(var attributeLocation in attributes){\n        var info = vertexArray._getAttributeInfo(attributeLocation);\n        if (info) {\n            var rowHeader = \"\".concat(attributeLocation, \": \").concat(info.name);\n            var accessor = vertexArray.accessors[info.location];\n            if (accessor) rowHeader = \"\".concat(attributeLocation, \": \").concat(getGLSLDeclaration(info.name, accessor));\n            table[rowHeader] = getDebugTableRow(vertexArray, attributes[attributeLocation], accessor, header);\n        }\n    }\n    return table;\n}\nfunction getDebugTableRow(vertexArray, attribute, accessor, header) {\n    var _ref4;\n    var gl = vertexArray.gl;\n    if (!attribute) {\n        var _ref2;\n        return _ref2 = {}, (0, _definePropertyDefault.default)(_ref2, header, \"null\"), (0, _definePropertyDefault.default)(_ref2, \"Format \", \"N/A\"), _ref2;\n    }\n    var type = \"NOT PROVIDED\";\n    var size = \"N/A\";\n    var verts = \"N/A\";\n    var bytes = \"N/A\";\n    var isInteger;\n    var marker;\n    var value;\n    if (accessor) {\n        type = accessor.type;\n        size = accessor.size;\n        type = String(type).replace(\"Array\", \"\");\n        isInteger = type.indexOf(\"nt\") !== -1;\n    }\n    if (attribute instanceof (0, _bufferDefault.default)) {\n        var _ref3;\n        var buffer = attribute;\n        var _buffer$getDebugData = buffer.getDebugData(), data = _buffer$getDebugData.data, modified = _buffer$getDebugData.modified;\n        marker = modified ? \"*\" : \"\";\n        value = data;\n        bytes = buffer.byteLength;\n        verts = bytes / data.BYTES_PER_ELEMENT / size;\n        var format;\n        if (accessor) {\n            var instanced = accessor.divisor > 0;\n            format = \"\".concat(instanced ? \"I \" : \"P \", \" \").concat(verts, \" (x\").concat(size, \"=\").concat(bytes, \" bytes \").concat((0, _webglUtils.getKey)(gl, type), \")\");\n        } else {\n            isInteger = true;\n            format = \"\".concat(bytes, \" bytes\");\n        }\n        return _ref3 = {}, (0, _definePropertyDefault.default)(_ref3, header, \"\".concat(marker).concat((0, _utils.formatValue)(value, {\n            size: size,\n            isInteger: isInteger\n        }))), (0, _definePropertyDefault.default)(_ref3, \"Format \", format), _ref3;\n    }\n    value = attribute;\n    size = attribute.length;\n    type = String(attribute.constructor.name).replace(\"Array\", \"\");\n    isInteger = type.indexOf(\"nt\") !== -1;\n    return _ref4 = {}, (0, _definePropertyDefault.default)(_ref4, header, \"\".concat((0, _utils.formatValue)(value, {\n        size: size,\n        isInteger: isInteger\n    }), \" (constant)\")), (0, _definePropertyDefault.default)(_ref4, \"Format \", \"\".concat(size, \"x\").concat(type, \" (constant)\")), _ref4;\n}\nfunction getGLSLDeclaration(name, accessor) {\n    var type = accessor.type, size = accessor.size;\n    var typeAndName = (0, _attributeUtils.getCompositeGLType)(type, size);\n    return typeAndName ? \"\".concat(name, \" (\").concat(typeAndName.name, \")\") : name;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../classes/buffer\":\"b1PWl\",\"../webgl-utils\":\"hZtIX\",\"../webgl-utils/attribute-utils\":\"fjaGt\",\"../utils\":\"eK1k6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Qlg6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getDebugTableForProgramConfiguration\", ()=>getDebugTableForProgramConfiguration);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\nfunction getDebugTableForProgramConfiguration(config) {\n    var table = {};\n    var header = \"Accessors for \".concat(config.id);\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = config.attributeInfos[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var attributeInfo = _step.value;\n            if (attributeInfo) {\n                var glslDeclaration = getGLSLDeclaration(attributeInfo);\n                table[\"in \".concat(glslDeclaration)] = (0, _definePropertyDefault.default)({}, header, JSON.stringify(attributeInfo.accessor));\n            }\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n    try {\n        for(var _iterator2 = config.varyingInfos[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n            var varyingInfo = _step2.value;\n            if (varyingInfo) {\n                var _glslDeclaration = getGLSLDeclaration(varyingInfo);\n                table[\"out \".concat(_glslDeclaration)] = (0, _definePropertyDefault.default)({}, header, JSON.stringify(varyingInfo.accessor));\n            }\n        }\n    } catch (err1) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err1;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n        } finally{\n            if (_didIteratorError2) throw _iteratorError2;\n        }\n    }\n    return table;\n}\nfunction getGLSLDeclaration(attributeInfo) {\n    var _attributeInfo$access = attributeInfo.accessor, type = _attributeInfo$access.type, size = _attributeInfo$access.size;\n    var typeAndName = (0, _attributeUtils.getCompositeGLType)(type, size);\n    if (typeAndName) return \"\".concat(typeAndName.name, \" \").concat(attributeInfo.name);\n    return attributeInfo.name;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../webgl-utils/attribute-utils\":\"fjaGt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l9MS5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AnimationLoop\", ()=>(0, _animationLoopDefault.default));\nparcelHelpers.export(exports, \"Model\", ()=>(0, _modelDefault.default));\nparcelHelpers.export(exports, \"ProgramManager\", ()=>(0, _programManagerDefault.default));\nparcelHelpers.export(exports, \"Transform\", ()=>(0, _transformDefault.default));\nparcelHelpers.export(exports, \"Geometry\", ()=>(0, _geometryDefault.default));\nparcelHelpers.export(exports, \"ConeGeometry\", ()=>(0, _coneGeometryDefault.default));\nparcelHelpers.export(exports, \"CubeGeometry\", ()=>(0, _cubeGeometryDefault.default));\nparcelHelpers.export(exports, \"CylinderGeometry\", ()=>(0, _cylinderGeometryDefault.default));\nparcelHelpers.export(exports, \"IcoSphereGeometry\", ()=>(0, _icoSphereGeometryDefault.default));\nparcelHelpers.export(exports, \"PlaneGeometry\", ()=>(0, _planeGeometryDefault.default));\nparcelHelpers.export(exports, \"SphereGeometry\", ()=>(0, _sphereGeometryDefault.default));\nparcelHelpers.export(exports, \"TruncatedConeGeometry\", ()=>(0, _truncatedConeGeometryDefault.default));\nparcelHelpers.export(exports, \"Timeline\", ()=>(0, _timeline.Timeline));\nparcelHelpers.export(exports, \"KeyFrames\", ()=>(0, _keyFrames.KeyFrames));\nparcelHelpers.export(exports, \"ClipSpace\", ()=>(0, _clipSpaceDefault.default));\nvar _animationLoop = require(\"./lib/animation-loop\");\nvar _animationLoopDefault = parcelHelpers.interopDefault(_animationLoop);\nvar _model = require(\"./lib/model\");\nvar _modelDefault = parcelHelpers.interopDefault(_model);\nvar _programManager = require(\"./lib/program-manager\");\nvar _programManagerDefault = parcelHelpers.interopDefault(_programManager);\nvar _transform = require(\"./transform/transform\");\nvar _transformDefault = parcelHelpers.interopDefault(_transform);\nvar _geometry = require(\"./geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _coneGeometry = require(\"./geometries/cone-geometry\");\nvar _coneGeometryDefault = parcelHelpers.interopDefault(_coneGeometry);\nvar _cubeGeometry = require(\"./geometries/cube-geometry\");\nvar _cubeGeometryDefault = parcelHelpers.interopDefault(_cubeGeometry);\nvar _cylinderGeometry = require(\"./geometries/cylinder-geometry\");\nvar _cylinderGeometryDefault = parcelHelpers.interopDefault(_cylinderGeometry);\nvar _icoSphereGeometry = require(\"./geometries/ico-sphere-geometry\");\nvar _icoSphereGeometryDefault = parcelHelpers.interopDefault(_icoSphereGeometry);\nvar _planeGeometry = require(\"./geometries/plane-geometry\");\nvar _planeGeometryDefault = parcelHelpers.interopDefault(_planeGeometry);\nvar _sphereGeometry = require(\"./geometries/sphere-geometry\");\nvar _sphereGeometryDefault = parcelHelpers.interopDefault(_sphereGeometry);\nvar _truncatedConeGeometry = require(\"./geometries/truncated-cone-geometry\");\nvar _truncatedConeGeometryDefault = parcelHelpers.interopDefault(_truncatedConeGeometry);\nvar _timeline = require(\"./animation/timeline\");\nvar _keyFrames = require(\"./animation/key-frames\");\nvar _clipSpace = require(\"./utils/clip-space\");\nvar _clipSpaceDefault = parcelHelpers.interopDefault(_clipSpace);\n\n},{\"./lib/animation-loop\":\"5xYIY\",\"./lib/model\":\"9CDGf\",\"./lib/program-manager\":\"3v9hT\",\"./transform/transform\":\"ibB0s\",\"./geometry/geometry\":\"2TGkH\",\"./geometries/cone-geometry\":\"ezvSy\",\"./geometries/cube-geometry\":\"11mAr\",\"./geometries/cylinder-geometry\":\"1M87b\",\"./geometries/ico-sphere-geometry\":\"luhoO\",\"./geometries/plane-geometry\":\"j6u9H\",\"./geometries/sphere-geometry\":\"aRad7\",\"./geometries/truncated-cone-geometry\":\"9dywj\",\"./animation/timeline\":\"3QTLo\",\"./animation/key-frames\":false,\"./utils/clip-space\":\"lo8Qa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5xYIY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>AnimationLoop);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _env = require(\"probe.gl/env\");\nvar isPage = (0, _env.isBrowser)() && typeof document !== \"undefined\";\nvar statIdCounter = 0;\nvar AnimationLoop = function() {\n    function AnimationLoop1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, AnimationLoop1);\n        var _props$onCreateContex = props.onCreateContext, onCreateContext = _props$onCreateContex === void 0 ? function(opts) {\n            return (0, _gltools.createGLContext)(opts);\n        } : _props$onCreateContex, _props$onAddHTML = props.onAddHTML, onAddHTML = _props$onAddHTML === void 0 ? null : _props$onAddHTML, _props$onInitialize = props.onInitialize, onInitialize = _props$onInitialize === void 0 ? function() {} : _props$onInitialize, _props$onRender = props.onRender, onRender = _props$onRender === void 0 ? function() {} : _props$onRender, _props$onFinalize = props.onFinalize, onFinalize = _props$onFinalize === void 0 ? function() {} : _props$onFinalize, onError = props.onError, _props$gl = props.gl, gl = _props$gl === void 0 ? null : _props$gl, _props$glOptions = props.glOptions, glOptions = _props$glOptions === void 0 ? {} : _props$glOptions, _props$debug = props.debug, debug = _props$debug === void 0 ? false : _props$debug, _props$createFramebuf = props.createFramebuffer, createFramebuffer = _props$createFramebuf === void 0 ? false : _props$createFramebuf, _props$autoResizeView = props.autoResizeViewport, autoResizeViewport = _props$autoResizeView === void 0 ? true : _props$autoResizeView, _props$autoResizeDraw = props.autoResizeDrawingBuffer, autoResizeDrawingBuffer = _props$autoResizeDraw === void 0 ? true : _props$autoResizeDraw, _props$stats = props.stats, stats = _props$stats === void 0 ? (0, _webgl.lumaStats).get(\"animation-loop-\".concat(statIdCounter++)) : _props$stats;\n        var _props$useDevicePixel = props.useDevicePixels, useDevicePixels = _props$useDevicePixel === void 0 ? true : _props$useDevicePixel;\n        if (\"useDevicePixelRatio\" in props) {\n            (0, _webgl.log).deprecated(\"useDevicePixelRatio\", \"useDevicePixels\")();\n            useDevicePixels = props.useDevicePixelRatio;\n        }\n        this.props = {\n            onCreateContext: onCreateContext,\n            onAddHTML: onAddHTML,\n            onInitialize: onInitialize,\n            onRender: onRender,\n            onFinalize: onFinalize,\n            onError: onError,\n            gl: gl,\n            glOptions: glOptions,\n            debug: debug,\n            createFramebuffer: createFramebuffer\n        };\n        this.gl = gl;\n        this.needsRedraw = null;\n        this.timeline = null;\n        this.stats = stats;\n        this.cpuTime = this.stats.get(\"CPU Time\");\n        this.gpuTime = this.stats.get(\"GPU Time\");\n        this.frameRate = this.stats.get(\"Frame Rate\");\n        this._initialized = false;\n        this._running = false;\n        this._animationFrameId = null;\n        this._nextFramePromise = null;\n        this._resolveNextFrame = null;\n        this._cpuStartTime = 0;\n        this.setProps({\n            autoResizeViewport: autoResizeViewport,\n            autoResizeDrawingBuffer: autoResizeDrawingBuffer,\n            useDevicePixels: useDevicePixels\n        });\n        this.start = this.start.bind(this);\n        this.stop = this.stop.bind(this);\n        this._pageLoadPromise = null;\n        this._onMousemove = this._onMousemove.bind(this);\n        this._onMouseleave = this._onMouseleave.bind(this);\n    }\n    (0, _createClassDefault.default)(AnimationLoop1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                this.stop();\n                this._setDisplay(null);\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw(reason) {\n                (0, _webgl.assert)(typeof reason === \"string\");\n                this.needsRedraw = this.needsRedraw || reason;\n                return this;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"autoResizeViewport\" in props) this.autoResizeViewport = props.autoResizeViewport;\n                if (\"autoResizeDrawingBuffer\" in props) this.autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;\n                if (\"useDevicePixels\" in props) this.useDevicePixels = props.useDevicePixels;\n                return this;\n            }\n        },\n        {\n            key: \"start\",\n            value: function start() {\n                var _this = this;\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (this._running) return this;\n                this._running = true;\n                var startPromise = this._getPageLoadPromise().then(function() {\n                    if (!_this._running || _this._initialized) return null;\n                    _this._createWebGLContext(opts);\n                    _this._createFramebuffer();\n                    _this._startEventHandling();\n                    _this._initializeCallbackData();\n                    _this._updateCallbackData();\n                    _this._resizeCanvasDrawingBuffer();\n                    _this._resizeViewport();\n                    _this._gpuTimeQuery = (0, _webgl.Query).isSupported(_this.gl, [\n                        \"timers\"\n                    ]) ? new (0, _webgl.Query)(_this.gl) : null;\n                    _this._initialized = true;\n                    return _this.onInitialize(_this.animationProps);\n                }).then(function(appContext) {\n                    if (_this._running) {\n                        _this._addCallbackData(appContext || {});\n                        if (appContext !== false) _this._startLoop();\n                    }\n                });\n                if (this.props.onError) startPromise[\"catch\"](this.props.onError);\n                return this;\n            }\n        },\n        {\n            key: \"redraw\",\n            value: function redraw() {\n                this._beginTimers();\n                this._setupFrame();\n                this._updateCallbackData();\n                this._renderFrame(this.animationProps);\n                this._clearNeedsRedraw();\n                if (this.offScreen && this.gl.commit) this.gl.commit();\n                if (this._resolveNextFrame) {\n                    this._resolveNextFrame(this);\n                    this._nextFramePromise = null;\n                    this._resolveNextFrame = null;\n                }\n                this._endTimers();\n                return this;\n            }\n        },\n        {\n            key: \"stop\",\n            value: function stop() {\n                if (this._running) {\n                    this._finalizeCallbackData();\n                    (0, _webgl.cancelAnimationFrame)(this._animationFrameId);\n                    this._nextFramePromise = null;\n                    this._resolveNextFrame = null;\n                    this._animationFrameId = null;\n                    this._running = false;\n                }\n                return this;\n            }\n        },\n        {\n            key: \"attachTimeline\",\n            value: function attachTimeline(timeline) {\n                this.timeline = timeline;\n                return this.timeline;\n            }\n        },\n        {\n            key: \"detachTimeline\",\n            value: function detachTimeline() {\n                this.timeline = null;\n            }\n        },\n        {\n            key: \"waitForRender\",\n            value: function waitForRender() {\n                var _this2 = this;\n                this.setNeedsRedraw(\"waitForRender\");\n                if (!this._nextFramePromise) this._nextFramePromise = new Promise(function(resolve) {\n                    _this2._resolveNextFrame = resolve;\n                });\n                return this._nextFramePromise;\n            }\n        },\n        {\n            key: \"toDataURL\",\n            value: function() {\n                var _toDataURL = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee() {\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                this.setNeedsRedraw(\"toDataURL\");\n                                _context.next = 3;\n                                return this.waitForRender();\n                            case 3:\n                                return _context.abrupt(\"return\", this.gl.canvas.toDataURL());\n                            case 4:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this);\n                }));\n                function toDataURL() {\n                    return _toDataURL.apply(this, arguments);\n                }\n                return toDataURL;\n            }()\n        },\n        {\n            key: \"onCreateContext\",\n            value: function onCreateContext() {\n                var _this$props;\n                return (_this$props = this.props).onCreateContext.apply(_this$props, arguments);\n            }\n        },\n        {\n            key: \"onInitialize\",\n            value: function onInitialize() {\n                var _this$props2;\n                return (_this$props2 = this.props).onInitialize.apply(_this$props2, arguments);\n            }\n        },\n        {\n            key: \"onRender\",\n            value: function onRender() {\n                var _this$props3;\n                return (_this$props3 = this.props).onRender.apply(_this$props3, arguments);\n            }\n        },\n        {\n            key: \"onFinalize\",\n            value: function onFinalize() {\n                var _this$props4;\n                return (_this$props4 = this.props).onFinalize.apply(_this$props4, arguments);\n            }\n        },\n        {\n            key: \"getHTMLControlValue\",\n            value: function getHTMLControlValue(id) {\n                var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n                var element = document.getElementById(id);\n                return element ? Number(element.value) : defaultValue;\n            }\n        },\n        {\n            key: \"setViewParameters\",\n            value: function setViewParameters() {\n                (0, _webgl.log).removed(\"AnimationLoop.setViewParameters\", \"AnimationLoop.setProps\")();\n                return this;\n            }\n        },\n        {\n            key: \"_startLoop\",\n            value: function _startLoop() {\n                var _this3 = this;\n                var renderFrame1 = function renderFrame() {\n                    if (!_this3._running) return;\n                    _this3.redraw();\n                    _this3._animationFrameId = _this3._requestAnimationFrame(renderFrame);\n                };\n                (0, _webgl.cancelAnimationFrame)(this._animationFrameId);\n                this._animationFrameId = this._requestAnimationFrame(renderFrame1);\n            }\n        },\n        {\n            key: \"_getPageLoadPromise\",\n            value: function _getPageLoadPromise() {\n                if (!this._pageLoadPromise) this._pageLoadPromise = isPage ? new Promise(function(resolve, reject) {\n                    if (isPage && document.readyState === \"complete\") {\n                        resolve(document);\n                        return;\n                    }\n                    window.addEventListener(\"load\", function() {\n                        resolve(document);\n                    });\n                }) : Promise.resolve({});\n                return this._pageLoadPromise;\n            }\n        },\n        {\n            key: \"_setDisplay\",\n            value: function _setDisplay(display) {\n                if (this.display) {\n                    this.display[\"delete\"]();\n                    this.display.animationLoop = null;\n                }\n                if (display) display.animationLoop = this;\n                this.display = display;\n            }\n        },\n        {\n            key: \"_requestAnimationFrame\",\n            value: function _requestAnimationFrame(renderFrameCallback) {\n                if (this.display && this.display.requestAnimationFrame(renderFrameCallback)) return;\n                (0, _webgl.requestAnimationFrame)(renderFrameCallback);\n            }\n        },\n        {\n            key: \"_renderFrame\",\n            value: function _renderFrame() {\n                if (this.display) {\n                    var _this$display;\n                    (_this$display = this.display)._renderFrame.apply(_this$display, arguments);\n                    return;\n                }\n                this.onRender.apply(this, arguments);\n            }\n        },\n        {\n            key: \"_clearNeedsRedraw\",\n            value: function _clearNeedsRedraw() {\n                this.needsRedraw = null;\n            }\n        },\n        {\n            key: \"_setupFrame\",\n            value: function _setupFrame() {\n                if (this._onSetupFrame) this._onSetupFrame(this.animationProps);\n                else {\n                    this._resizeCanvasDrawingBuffer();\n                    this._resizeViewport();\n                    this._resizeFramebuffer();\n                }\n            }\n        },\n        {\n            key: \"_initializeCallbackData\",\n            value: function _initializeCallbackData() {\n                this.animationProps = {\n                    gl: this.gl,\n                    stop: this.stop,\n                    canvas: this.gl.canvas,\n                    framebuffer: this.framebuffer,\n                    useDevicePixels: this.useDevicePixels,\n                    needsRedraw: null,\n                    startTime: Date.now(),\n                    engineTime: 0,\n                    tick: 0,\n                    tock: 0,\n                    time: 0,\n                    _timeline: this.timeline,\n                    _loop: this,\n                    _animationLoop: this,\n                    _mousePosition: null\n                };\n            }\n        },\n        {\n            key: \"_updateCallbackData\",\n            value: function _updateCallbackData() {\n                var _this$_getSizeAndAspe = this._getSizeAndAspect(), width = _this$_getSizeAndAspe.width, height = _this$_getSizeAndAspe.height, aspect = _this$_getSizeAndAspe.aspect;\n                if (width !== this.animationProps.width || height !== this.animationProps.height) this.setNeedsRedraw(\"drawing buffer resized\");\n                if (aspect !== this.animationProps.aspect) this.setNeedsRedraw(\"drawing buffer aspect changed\");\n                this.animationProps.width = width;\n                this.animationProps.height = height;\n                this.animationProps.aspect = aspect;\n                this.animationProps.needsRedraw = this.needsRedraw;\n                this.animationProps.engineTime = Date.now() - this.animationProps.startTime;\n                if (this.timeline) this.timeline.update(this.animationProps.engineTime);\n                this.animationProps.tick = Math.floor(this.animationProps.time / 1000 * 60);\n                this.animationProps.tock++;\n                this.animationProps.time = this.timeline ? this.timeline.getTime() : this.animationProps.engineTime;\n                this.animationProps._offScreen = this.offScreen;\n            }\n        },\n        {\n            key: \"_finalizeCallbackData\",\n            value: function _finalizeCallbackData() {\n                this.onFinalize(this.animationProps);\n            }\n        },\n        {\n            key: \"_addCallbackData\",\n            value: function _addCallbackData(appContext) {\n                if ((0, _typeofDefault.default)(appContext) === \"object\" && appContext !== null) this.animationProps = Object.assign({}, this.animationProps, appContext);\n            }\n        },\n        {\n            key: \"_createWebGLContext\",\n            value: function _createWebGLContext(opts) {\n                this.offScreen = opts.canvas && typeof OffscreenCanvas !== \"undefined\" && opts.canvas instanceof OffscreenCanvas;\n                opts = Object.assign({}, opts, this.props.glOptions);\n                this.gl = this.props.gl ? (0, _gltools.instrumentGLContext)(this.props.gl, opts) : this.onCreateContext(opts);\n                if (!(0, _gltools.isWebGL)(this.gl)) throw new Error(\"AnimationLoop.onCreateContext - illegal context returned\");\n                (0, _gltools.resetParameters)(this.gl);\n                this._createInfoDiv();\n            }\n        },\n        {\n            key: \"_createInfoDiv\",\n            value: function _createInfoDiv() {\n                if (this.gl.canvas && this.props.onAddHTML) {\n                    var wrapperDiv = document.createElement(\"div\");\n                    document.body.appendChild(wrapperDiv);\n                    wrapperDiv.style.position = \"relative\";\n                    var div = document.createElement(\"div\");\n                    div.style.position = \"absolute\";\n                    div.style.left = \"10px\";\n                    div.style.bottom = \"10px\";\n                    div.style.width = \"300px\";\n                    div.style.background = \"white\";\n                    wrapperDiv.appendChild(this.gl.canvas);\n                    wrapperDiv.appendChild(div);\n                    var html = this.props.onAddHTML(div);\n                    if (html) div.innerHTML = html;\n                }\n            }\n        },\n        {\n            key: \"_getSizeAndAspect\",\n            value: function _getSizeAndAspect() {\n                var width = this.gl.drawingBufferWidth;\n                var height = this.gl.drawingBufferHeight;\n                var aspect = 1;\n                var canvas = this.gl.canvas;\n                if (canvas && canvas.clientHeight) aspect = canvas.clientWidth / canvas.clientHeight;\n                else if (width > 0 && height > 0) aspect = width / height;\n                return {\n                    width: width,\n                    height: height,\n                    aspect: aspect\n                };\n            }\n        },\n        {\n            key: \"_resizeViewport\",\n            value: function _resizeViewport() {\n                if (this.autoResizeViewport) this.gl.viewport(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight);\n            }\n        },\n        {\n            key: \"_resizeCanvasDrawingBuffer\",\n            value: function _resizeCanvasDrawingBuffer() {\n                if (this.autoResizeDrawingBuffer) (0, _gltools.resizeGLContext)(this.gl, {\n                    useDevicePixels: this.useDevicePixels\n                });\n            }\n        },\n        {\n            key: \"_createFramebuffer\",\n            value: function _createFramebuffer() {\n                if (this.props.createFramebuffer) this.framebuffer = new (0, _webgl.Framebuffer)(this.gl);\n            }\n        },\n        {\n            key: \"_resizeFramebuffer\",\n            value: function _resizeFramebuffer() {\n                if (this.framebuffer) this.framebuffer.resize({\n                    width: this.gl.drawingBufferWidth,\n                    height: this.gl.drawingBufferHeight\n                });\n            }\n        },\n        {\n            key: \"_beginTimers\",\n            value: function _beginTimers() {\n                this.frameRate.timeEnd();\n                this.frameRate.timeStart();\n                if (this._gpuTimeQuery && this._gpuTimeQuery.isResultAvailable() && !this._gpuTimeQuery.isTimerDisjoint()) this.stats.get(\"GPU Time\").addTime(this._gpuTimeQuery.getTimerMilliseconds());\n                if (this._gpuTimeQuery) this._gpuTimeQuery.beginTimeElapsedQuery();\n                this.cpuTime.timeStart();\n            }\n        },\n        {\n            key: \"_endTimers\",\n            value: function _endTimers() {\n                this.cpuTime.timeEnd();\n                if (this._gpuTimeQuery) this._gpuTimeQuery.end();\n            }\n        },\n        {\n            key: \"_startEventHandling\",\n            value: function _startEventHandling() {\n                var canvas = this.gl.canvas;\n                if (canvas) {\n                    canvas.addEventListener(\"mousemove\", this._onMousemove);\n                    canvas.addEventListener(\"mouseleave\", this._onMouseleave);\n                }\n            }\n        },\n        {\n            key: \"_onMousemove\",\n            value: function _onMousemove(e) {\n                this.animationProps._mousePosition = [\n                    e.offsetX,\n                    e.offsetY\n                ];\n            }\n        },\n        {\n            key: \"_onMouseleave\",\n            value: function _onMouseleave(e) {\n                this.animationProps._mousePosition = null;\n            }\n        }\n    ]);\n    return AnimationLoop1;\n}();\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/gltools\":\"7HW6a\",\"@luma.gl/webgl\":\"caucX\",\"probe.gl/env\":\"btEBf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9CDGf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Model);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _programManager = require(\"./program-manager\");\nvar _programManagerDefault = parcelHelpers.interopDefault(_programManager);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _modelUtils = require(\"./model-utils\");\nvar LOG_DRAW_PRIORITY = 2;\nvar LOG_DRAW_TIMEOUT = 10000;\nvar ERR_MODEL_PARAMS = \"Model needs drawMode and vertexCount\";\nvar NOOP = function NOOP() {};\nvar DRAW_PARAMS = {};\nvar Model = function() {\n    function Model1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Model1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"model\") : _props$id;\n        (0, _webgl.assert)((0, _gltools.isWebGL)(gl));\n        this.id = id;\n        this.gl = gl;\n        this.id = props.id || (0, _webgl.uid)(\"Model\");\n        this.lastLogTime = 0;\n        this.initialize(props);\n    }\n    (0, _createClassDefault.default)(Model1, [\n        {\n            key: \"initialize\",\n            value: function initialize(props) {\n                this.props = {};\n                this.programManager = props.programManager || (0, _programManagerDefault.default).getDefaultProgramManager(this.gl);\n                this._programManagerState = -1;\n                this._managedProgram = false;\n                var _props$program = props.program, program = _props$program === void 0 ? null : _props$program, vs = props.vs, fs = props.fs, modules = props.modules, defines = props.defines, inject = props.inject, varyings = props.varyings, bufferMode = props.bufferMode, transpileToGLSL100 = props.transpileToGLSL100;\n                this.programProps = {\n                    program: program,\n                    vs: vs,\n                    fs: fs,\n                    modules: modules,\n                    defines: defines,\n                    inject: inject,\n                    varyings: varyings,\n                    bufferMode: bufferMode,\n                    transpileToGLSL100: transpileToGLSL100\n                };\n                this.program = null;\n                this.vertexArray = null;\n                this._programDirty = true;\n                this.userData = {};\n                this.needsRedraw = true;\n                this._attributes = {};\n                this.attributes = {};\n                this.uniforms = {};\n                this.pickable = true;\n                this._checkProgram();\n                this.setUniforms(Object.assign({}, this.getModuleUniforms(props.moduleSettings)));\n                this.drawMode = props.drawMode !== undefined ? props.drawMode : 4;\n                this.vertexCount = props.vertexCount || 0;\n                this.geometryBuffers = {};\n                this.isInstanced = props.isInstanced || props.instanced || props.instanceCount > 0;\n                this._setModelProps(props);\n                this.geometry = {};\n                (0, _webgl.assert)(this.drawMode !== undefined && Number.isFinite(this.vertexCount), ERR_MODEL_PARAMS);\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                this._setModelProps(props);\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                for(var key in this._attributes)if (this._attributes[key] !== this.attributes[key]) this._attributes[key][\"delete\"]();\n                if (this._managedProgram) {\n                    this.programManager.release(this.program);\n                    this._managedProgram = false;\n                }\n                this.vertexArray[\"delete\"]();\n                this._deleteGeometryBuffers();\n            }\n        },\n        {\n            key: \"getDrawMode\",\n            value: function getDrawMode() {\n                return this.drawMode;\n            }\n        },\n        {\n            key: \"getVertexCount\",\n            value: function getVertexCount() {\n                return this.vertexCount;\n            }\n        },\n        {\n            key: \"getInstanceCount\",\n            value: function getInstanceCount() {\n                return this.instanceCount;\n            }\n        },\n        {\n            key: \"getAttributes\",\n            value: function getAttributes() {\n                return this.attributes;\n            }\n        },\n        {\n            key: \"getProgram\",\n            value: function getProgram() {\n                return this.program;\n            }\n        },\n        {\n            key: \"setProgram\",\n            value: function setProgram(props) {\n                var program = props.program, vs = props.vs, fs = props.fs, modules = props.modules, defines = props.defines, inject = props.inject, varyings = props.varyings, bufferMode = props.bufferMode, transpileToGLSL100 = props.transpileToGLSL100;\n                this.programProps = {\n                    program: program,\n                    vs: vs,\n                    fs: fs,\n                    modules: modules,\n                    defines: defines,\n                    inject: inject,\n                    varyings: varyings,\n                    bufferMode: bufferMode,\n                    transpileToGLSL100: transpileToGLSL100\n                };\n                this._programDirty = true;\n            }\n        },\n        {\n            key: \"getUniforms\",\n            value: function getUniforms() {\n                return this.uniforms;\n            }\n        },\n        {\n            key: \"setDrawMode\",\n            value: function setDrawMode(drawMode) {\n                this.drawMode = drawMode;\n                return this;\n            }\n        },\n        {\n            key: \"setVertexCount\",\n            value: function setVertexCount(vertexCount) {\n                (0, _webgl.assert)(Number.isFinite(vertexCount));\n                this.vertexCount = vertexCount;\n                return this;\n            }\n        },\n        {\n            key: \"setInstanceCount\",\n            value: function setInstanceCount(instanceCount) {\n                (0, _webgl.assert)(Number.isFinite(instanceCount));\n                this.instanceCount = instanceCount;\n                return this;\n            }\n        },\n        {\n            key: \"setGeometry\",\n            value: function setGeometry(geometry) {\n                this.drawMode = geometry.drawMode;\n                this.vertexCount = geometry.getVertexCount();\n                this._deleteGeometryBuffers();\n                this.geometryBuffers = (0, _modelUtils.getBuffersFromGeometry)(this.gl, geometry);\n                this.vertexArray.setAttributes(this.geometryBuffers);\n                return this;\n            }\n        },\n        {\n            key: \"setAttributes\",\n            value: function setAttributes() {\n                var attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if ((0, _webgl.isObjectEmpty)(attributes)) return this;\n                var normalizedAttributes = {};\n                for(var name in attributes){\n                    var attribute = attributes[name];\n                    normalizedAttributes[name] = attribute.getValue ? attribute.getValue() : attribute;\n                }\n                this.vertexArray.setAttributes(normalizedAttributes);\n                return this;\n            }\n        },\n        {\n            key: \"setUniforms\",\n            value: function setUniforms() {\n                var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                Object.assign(this.uniforms, uniforms);\n                return this;\n            }\n        },\n        {\n            key: \"getModuleUniforms\",\n            value: function getModuleUniforms(opts) {\n                this._checkProgram();\n                var getUniforms = this.programManager.getUniforms(this.program);\n                if (getUniforms) return getUniforms(opts);\n                return {};\n            }\n        },\n        {\n            key: \"updateModuleSettings\",\n            value: function updateModuleSettings(opts) {\n                var uniforms = this.getModuleUniforms(opts || {});\n                return this.setUniforms(uniforms);\n            }\n        },\n        {\n            key: \"clear\",\n            value: function clear(opts) {\n                (0, _webgl.clear)(this.program.gl, opts);\n                return this;\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this._checkProgram();\n                var _opts$moduleSettings = opts.moduleSettings, moduleSettings = _opts$moduleSettings === void 0 ? null : _opts$moduleSettings, framebuffer = opts.framebuffer, _opts$uniforms = opts.uniforms, uniforms = _opts$uniforms === void 0 ? {} : _opts$uniforms, _opts$attributes = opts.attributes, attributes = _opts$attributes === void 0 ? {} : _opts$attributes, _opts$transformFeedba = opts.transformFeedback, transformFeedback = _opts$transformFeedba === void 0 ? this.transformFeedback : _opts$transformFeedba, _opts$parameters = opts.parameters, parameters = _opts$parameters === void 0 ? {} : _opts$parameters, _opts$vertexArray = opts.vertexArray, vertexArray = _opts$vertexArray === void 0 ? this.vertexArray : _opts$vertexArray;\n                this.setAttributes(attributes);\n                this.updateModuleSettings(moduleSettings);\n                this.setUniforms(uniforms);\n                var logPriority;\n                if ((0, _webgl.log).priority >= LOG_DRAW_PRIORITY) logPriority = this._logDrawCallStart(LOG_DRAW_PRIORITY);\n                var drawParams = this.vertexArray.getDrawParams();\n                var _this$props = this.props, _this$props$isIndexed = _this$props.isIndexed, isIndexed = _this$props$isIndexed === void 0 ? drawParams.isIndexed : _this$props$isIndexed, _this$props$indexType = _this$props.indexType, indexType = _this$props$indexType === void 0 ? drawParams.indexType : _this$props$indexType, _this$props$indexOffs = _this$props.indexOffset, indexOffset = _this$props$indexOffs === void 0 ? drawParams.indexOffset : _this$props$indexOffs, _this$props$vertexArr = _this$props.vertexArrayInstanced, vertexArrayInstanced = _this$props$vertexArr === void 0 ? drawParams.isInstanced : _this$props$vertexArr;\n                if (vertexArrayInstanced && !this.isInstanced) (0, _webgl.log).warn(\"Found instanced attributes on non-instanced model\", this.id)();\n                var isInstanced = this.isInstanced, instanceCount = this.instanceCount;\n                var _this$props2 = this.props, _this$props2$onBefore = _this$props2.onBeforeRender, onBeforeRender = _this$props2$onBefore === void 0 ? NOOP : _this$props2$onBefore, _this$props2$onAfterR = _this$props2.onAfterRender, onAfterRender = _this$props2$onAfterR === void 0 ? NOOP : _this$props2$onAfterR;\n                onBeforeRender();\n                this.program.setUniforms(this.uniforms);\n                var didDraw = this.program.draw(Object.assign(DRAW_PARAMS, opts, {\n                    logPriority: logPriority,\n                    uniforms: null,\n                    framebuffer: framebuffer,\n                    parameters: parameters,\n                    drawMode: this.getDrawMode(),\n                    vertexCount: this.getVertexCount(),\n                    vertexArray: vertexArray,\n                    transformFeedback: transformFeedback,\n                    isIndexed: isIndexed,\n                    indexType: indexType,\n                    isInstanced: isInstanced,\n                    instanceCount: instanceCount,\n                    offset: isIndexed ? indexOffset : 0\n                }));\n                onAfterRender();\n                if ((0, _webgl.log).priority >= LOG_DRAW_PRIORITY) this._logDrawCallEnd(logPriority, vertexArray, framebuffer);\n                return didDraw;\n            }\n        },\n        {\n            key: \"transform\",\n            value: function transform() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _opts$discard = opts.discard, discard = _opts$discard === void 0 ? true : _opts$discard, feedbackBuffers = opts.feedbackBuffers, _opts$unbindModels = opts.unbindModels, unbindModels = _opts$unbindModels === void 0 ? [] : _opts$unbindModels;\n                var parameters = opts.parameters;\n                if (feedbackBuffers) this._setFeedbackBuffers(feedbackBuffers);\n                if (discard) parameters = Object.assign({}, parameters, (0, _definePropertyDefault.default)({}, 35977, discard));\n                unbindModels.forEach(function(model) {\n                    return model.vertexArray.unbindBuffers();\n                });\n                try {\n                    this.draw(Object.assign({}, opts, {\n                        parameters: parameters\n                    }));\n                } finally{\n                    unbindModels.forEach(function(model) {\n                        return model.vertexArray.bindBuffers();\n                    });\n                }\n                return this;\n            }\n        },\n        {\n            key: \"render\",\n            value: function render() {\n                var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _webgl.log).warn(\"Model.render() is deprecated. Use Model.setUniforms() and Model.draw()\")();\n                return this.setUniforms(uniforms).draw();\n            }\n        },\n        {\n            key: \"_setModelProps\",\n            value: function _setModelProps(props) {\n                Object.assign(this.props, props);\n                if (\"uniforms\" in props) this.setUniforms(props.uniforms);\n                if (\"pickable\" in props) this.pickable = props.pickable;\n                if (\"instanceCount\" in props) this.instanceCount = props.instanceCount;\n                if (\"geometry\" in props) this.setGeometry(props.geometry);\n                if (\"attributes\" in props) this.setAttributes(props.attributes);\n                if (\"_feedbackBuffers\" in props) this._setFeedbackBuffers(props._feedbackBuffers);\n            }\n        },\n        {\n            key: \"_checkProgram\",\n            value: function _checkProgram() {\n                var shaderCache = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                var needsUpdate = this._programDirty || this.programManager.stateHash !== this._programManagerState;\n                if (!needsUpdate) return;\n                var program = this.programProps.program;\n                if (program) this._managedProgram = false;\n                else {\n                    var _this$programProps = this.programProps, vs = _this$programProps.vs, fs = _this$programProps.fs, modules = _this$programProps.modules, inject = _this$programProps.inject, defines = _this$programProps.defines, varyings = _this$programProps.varyings, bufferMode = _this$programProps.bufferMode, transpileToGLSL100 = _this$programProps.transpileToGLSL100;\n                    program = this.programManager.get({\n                        vs: vs,\n                        fs: fs,\n                        modules: modules,\n                        inject: inject,\n                        defines: defines,\n                        varyings: varyings,\n                        bufferMode: bufferMode,\n                        transpileToGLSL100: transpileToGLSL100\n                    });\n                    if (this.program && this._managedProgram) this.programManager.release(this.program);\n                    this._programManagerState = this.programManager.stateHash;\n                    this._managedProgram = true;\n                }\n                (0, _webgl.assert)(program instanceof (0, _webgl.Program), \"Model needs a program\");\n                this._programDirty = false;\n                if (program === this.program) return;\n                this.program = program;\n                if (this.vertexArray) this.vertexArray.setProps({\n                    program: this.program,\n                    attributes: this.vertexArray.attributes\n                });\n                else this.vertexArray = new (0, _webgl.VertexArray)(this.gl, {\n                    program: this.program\n                });\n                this.setUniforms(Object.assign({}, this.getModuleUniforms()));\n            }\n        },\n        {\n            key: \"_deleteGeometryBuffers\",\n            value: function _deleteGeometryBuffers() {\n                for(var name in this.geometryBuffers){\n                    var buffer = this.geometryBuffers[name][0] || this.geometryBuffers[name];\n                    if (buffer instanceof (0, _webgl.Buffer)) buffer[\"delete\"]();\n                }\n            }\n        },\n        {\n            key: \"_setAnimationProps\",\n            value: function _setAnimationProps(animationProps) {\n                if (this.animated) {\n                    (0, _webgl.assert)(animationProps, \"Model.draw(): animated uniforms but no animationProps\");\n                    var animatedUniforms = this._evaluateAnimateUniforms(animationProps);\n                    Object.assign(this.uniforms, animatedUniforms);\n                }\n            }\n        },\n        {\n            key: \"_setFeedbackBuffers\",\n            value: function _setFeedbackBuffers() {\n                var feedbackBuffers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if ((0, _webgl.isObjectEmpty)(feedbackBuffers)) return this;\n                var gl = this.program.gl;\n                this.transformFeedback = this.transformFeedback || new (0, _webgl.TransformFeedback)(gl, {\n                    program: this.program\n                });\n                this.transformFeedback.setBuffers(feedbackBuffers);\n                return this;\n            }\n        },\n        {\n            key: \"_logDrawCallStart\",\n            value: function _logDrawCallStart(logLevel) {\n                var logDrawTimeout = logLevel > 3 ? 0 : LOG_DRAW_TIMEOUT;\n                if (Date.now() - this.lastLogTime < logDrawTimeout) return undefined;\n                this.lastLogTime = Date.now();\n                (0, _webgl.log).group(LOG_DRAW_PRIORITY, \">>> DRAWING MODEL \".concat(this.id), {\n                    collapsed: (0, _webgl.log).level <= 2\n                })();\n                return logLevel;\n            }\n        },\n        {\n            key: \"_logDrawCallEnd\",\n            value: function _logDrawCallEnd(logLevel, vertexArray, uniforms, framebuffer) {\n                if (logLevel === undefined) return;\n                var attributeTable = (0, _webgl.getDebugTableForVertexArray)({\n                    vertexArray: vertexArray,\n                    header: \"\".concat(this.id, \" attributes\"),\n                    attributes: this._attributes\n                });\n                var _getDebugTableForUnif = (0, _webgl.getDebugTableForUniforms)({\n                    header: \"\".concat(this.id, \" uniforms\"),\n                    program: this.program,\n                    uniforms: Object.assign({}, this.program.uniforms, uniforms)\n                }), uniformTable = _getDebugTableForUnif.table, unusedTable = _getDebugTableForUnif.unusedTable, unusedCount = _getDebugTableForUnif.unusedCount;\n                var _getDebugTableForUnif2 = (0, _webgl.getDebugTableForUniforms)({\n                    header: \"\".concat(this.id, \" uniforms\"),\n                    program: this.program,\n                    uniforms: Object.assign({}, this.program.uniforms, uniforms),\n                    undefinedOnly: true\n                }), missingTable = _getDebugTableForUnif2.table, missingCount = _getDebugTableForUnif2.count;\n                if (missingCount > 0) (0, _webgl.log).log(\"MISSING UNIFORMS\", Object.keys(missingTable))();\n                if (unusedCount > 0) (0, _webgl.log).log(\"UNUSED UNIFORMS\", Object.keys(unusedTable))();\n                var configTable = (0, _webgl.getDebugTableForProgramConfiguration)(this.vertexArray.configuration);\n                (0, _webgl.log).table(logLevel, attributeTable)();\n                (0, _webgl.log).table(logLevel, uniformTable)();\n                (0, _webgl.log).table(logLevel + 1, configTable)();\n                if (framebuffer) framebuffer.log({\n                    logLevel: LOG_DRAW_PRIORITY,\n                    message: \"Rendered to \".concat(framebuffer.id)\n                });\n                (0, _webgl.log).groupEnd(LOG_DRAW_PRIORITY, \">>> DRAWING MODEL \".concat(this.id))();\n            }\n        }\n    ]);\n    return Model1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/gltools\":\"7HW6a\",\"./program-manager\":\"3v9hT\",\"@luma.gl/webgl\":\"caucX\",\"./model-utils\":\"9Rgou\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3v9hT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ProgramManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _shadertools = require(\"@luma.gl/shadertools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar ProgramManager = function() {\n    (0, _createClassDefault.default)(ProgramManager1, null, [\n        {\n            key: \"getDefaultProgramManager\",\n            value: function getDefaultProgramManager(gl) {\n                gl.luma = gl.luma || {};\n                gl.luma.defaultProgramManager = gl.luma.defaultProgramManager || new ProgramManager1(gl);\n                return gl.luma.defaultProgramManager;\n            }\n        }\n    ]);\n    function ProgramManager1(gl) {\n        (0, _classCallCheckDefault.default)(this, ProgramManager1);\n        this.gl = gl;\n        this._programCache = {};\n        this._getUniforms = {};\n        this._registeredModules = {};\n        this._hookFunctions = [];\n        this._defaultModules = [];\n        this._hashes = {};\n        this._hashCounter = 0;\n        this.stateHash = 0;\n        this._useCounts = {};\n    }\n    (0, _createClassDefault.default)(ProgramManager1, [\n        {\n            key: \"addDefaultModule\",\n            value: function addDefaultModule(module) {\n                if (!this._defaultModules.find(function(m) {\n                    return m.name === module.name;\n                })) this._defaultModules.push(module);\n                this.stateHash++;\n            }\n        },\n        {\n            key: \"removeDefaultModule\",\n            value: function removeDefaultModule(module) {\n                var moduleName = typeof module === \"string\" ? module : module.name;\n                this._defaultModules = this._defaultModules.filter(function(m) {\n                    return m.name !== moduleName;\n                });\n                this.stateHash++;\n            }\n        },\n        {\n            key: \"addShaderHook\",\n            value: function addShaderHook(hook, opts) {\n                if (opts) hook = Object.assign(opts, {\n                    hook: hook\n                });\n                this._hookFunctions.push(hook);\n                this.stateHash++;\n            }\n        },\n        {\n            key: \"get\",\n            value: function get() {\n                var _this = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _props$vs = props.vs, vs = _props$vs === void 0 ? \"\" : _props$vs, _props$fs = props.fs, fs = _props$fs === void 0 ? \"\" : _props$fs, _props$defines = props.defines, defines = _props$defines === void 0 ? {} : _props$defines, _props$inject = props.inject, inject = _props$inject === void 0 ? {} : _props$inject, _props$varyings = props.varyings, varyings = _props$varyings === void 0 ? [] : _props$varyings, _props$bufferMode = props.bufferMode, bufferMode = _props$bufferMode === void 0 ? 0x8c8d : _props$bufferMode, _props$transpileToGLS = props.transpileToGLSL100, transpileToGLSL100 = _props$transpileToGLS === void 0 ? false : _props$transpileToGLS;\n                var modules = this._getModuleList(props.modules);\n                var vsHash = this._getHash(vs);\n                var fsHash = this._getHash(fs);\n                var moduleHashes = modules.map(function(m) {\n                    return _this._getHash(m.name);\n                }).sort();\n                var varyingHashes = varyings.map(function(v) {\n                    return _this._getHash(v);\n                });\n                var defineKeys = Object.keys(defines).sort();\n                var injectKeys = Object.keys(inject).sort();\n                var defineHashes = [];\n                var injectHashes = [];\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = defineKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var key = _step.value;\n                        defineHashes.push(this._getHash(key));\n                        defineHashes.push(this._getHash(defines[key]));\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                var _iteratorNormalCompletion2 = true;\n                var _didIteratorError2 = false;\n                var _iteratorError2 = undefined;\n                try {\n                    for(var _iterator2 = injectKeys[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                        var _key = _step2.value;\n                        injectHashes.push(this._getHash(_key));\n                        injectHashes.push(this._getHash(inject[_key]));\n                    }\n                } catch (err1) {\n                    _didIteratorError2 = true;\n                    _iteratorError2 = err1;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n                    } finally{\n                        if (_didIteratorError2) throw _iteratorError2;\n                    }\n                }\n                var hash = \"\".concat(vsHash, \"/\").concat(fsHash, \"D\").concat(defineHashes.join(\"/\"), \"M\").concat(moduleHashes.join(\"/\"), \"I\").concat(injectHashes.join(\"/\"), \"V\").concat(varyingHashes.join(\"/\"), \"H\").concat(this.stateHash, \"B\").concat(bufferMode).concat(transpileToGLSL100 ? \"T\" : \"\");\n                if (!this._programCache[hash]) {\n                    var assembled = (0, _shadertools.assembleShaders)(this.gl, {\n                        vs: vs,\n                        fs: fs,\n                        modules: modules,\n                        inject: inject,\n                        defines: defines,\n                        hookFunctions: this._hookFunctions,\n                        transpileToGLSL100: transpileToGLSL100\n                    });\n                    this._programCache[hash] = new (0, _webgl.Program)(this.gl, {\n                        hash: hash,\n                        vs: assembled.vs,\n                        fs: assembled.fs,\n                        varyings: varyings,\n                        bufferMode: bufferMode\n                    });\n                    this._getUniforms[hash] = assembled.getUniforms || function(x) {};\n                    this._useCounts[hash] = 0;\n                }\n                this._useCounts[hash]++;\n                return this._programCache[hash];\n            }\n        },\n        {\n            key: \"getUniforms\",\n            value: function getUniforms(program) {\n                return this._getUniforms[program.hash] || null;\n            }\n        },\n        {\n            key: \"release\",\n            value: function release(program) {\n                var hash = program.hash;\n                this._useCounts[hash]--;\n                if (this._useCounts[hash] === 0) {\n                    this._programCache[hash][\"delete\"]();\n                    delete this._programCache[hash];\n                    delete this._getUniforms[hash];\n                    delete this._useCounts[hash];\n                }\n            }\n        },\n        {\n            key: \"_getHash\",\n            value: function _getHash(key) {\n                if (this._hashes[key] === undefined) this._hashes[key] = this._hashCounter++;\n                return this._hashes[key];\n            }\n        },\n        {\n            key: \"_getModuleList\",\n            value: function _getModuleList() {\n                var appModules = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n                var modules = new Array(this._defaultModules.length + appModules.length);\n                var seen = {};\n                var count = 0;\n                for(var i = 0, len = this._defaultModules.length; i < len; ++i){\n                    var module = this._defaultModules[i];\n                    var name = module.name;\n                    modules[count++] = module;\n                    seen[name] = true;\n                }\n                for(var _i = 0, _len = appModules.length; _i < _len; ++_i){\n                    var _module = appModules[_i];\n                    var _name = _module.name;\n                    if (!seen[_name]) {\n                        modules[count++] = _module;\n                        seen[_name] = true;\n                    }\n                }\n                modules.length = count;\n                return modules;\n            }\n        }\n    ]);\n    return ProgramManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/shadertools\":\"8wgxL\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8wgxL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assembleShaders\", ()=>(0, _assembleShaders.assembleShaders));\nparcelHelpers.export(exports, \"combineInjects\", ()=>(0, _injectShader.combineInjects));\nparcelHelpers.export(exports, \"normalizeShaderModule\", ()=>(0, _shaderModule.normalizeShaderModule));\nparcelHelpers.export(exports, \"getQualifierDetails\", ()=>(0, _shaderUtils.getQualifierDetails));\nparcelHelpers.export(exports, \"getPassthroughFS\", ()=>(0, _shaderUtils.getPassthroughFS));\nparcelHelpers.export(exports, \"typeToChannelSuffix\", ()=>(0, _shaderUtils.typeToChannelSuffix));\nparcelHelpers.export(exports, \"typeToChannelCount\", ()=>(0, _shaderUtils.typeToChannelCount));\nparcelHelpers.export(exports, \"convertToVec4\", ()=>(0, _shaderUtils.convertToVec4));\nvar _assembleShaders = require(\"./lib/assemble-shaders\");\nvar _injectShader = require(\"./lib/inject-shader\");\nvar _shaderModule = require(\"./lib/shader-module\");\nvar _shaderUtils = require(\"./utils/shader-utils\");\nvar _modules = require(\"./modules\");\nparcelHelpers.exportAll(_modules, exports);\n\n},{\"./lib/assemble-shaders\":\"gaI9r\",\"./lib/inject-shader\":\"flvCl\",\"./lib/shader-module\":\"aVkhP\",\"./utils/shader-utils\":\"3XwJF\",\"./modules\":\"kr7fA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gaI9r\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assembleShaders\", ()=>assembleShaders);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _constants = require(\"./constants\");\nvar _resolveModules = require(\"./resolve-modules\");\nvar _platformDefines = require(\"./platform-defines\");\nvar _injectShader = require(\"./inject-shader\");\nvar _injectShaderDefault = parcelHelpers.interopDefault(_injectShader);\nvar _transpileShader = require(\"./transpile-shader\");\nvar _transpileShaderDefault = parcelHelpers.interopDefault(_transpileShader);\nvar _utils = require(\"../utils\");\nvar _SHADER_TYPE;\nvar INJECT_SHADER_DECLARATIONS = \"\\n\\n\".concat((0, _injectShader.DECLARATION_INJECT_MARKER), \"\\n\\n\");\nvar SHADER_TYPE = (_SHADER_TYPE = {}, (0, _definePropertyDefault.default)(_SHADER_TYPE, (0, _constants.VERTEX_SHADER), \"vertex\"), (0, _definePropertyDefault.default)(_SHADER_TYPE, (0, _constants.FRAGMENT_SHADER), \"fragment\"), _SHADER_TYPE);\nvar FRAGMENT_SHADER_PROLOGUE = \"precision highp float;\\n\\n\";\nfunction assembleShaders(gl, opts) {\n    var vs = opts.vs, fs = opts.fs;\n    var modules = (0, _resolveModules.resolveModules)(opts.modules || []);\n    return {\n        gl: gl,\n        vs: assembleShader(gl, Object.assign({}, opts, {\n            source: vs,\n            type: (0, _constants.VERTEX_SHADER),\n            modules: modules\n        })),\n        fs: assembleShader(gl, Object.assign({}, opts, {\n            source: fs,\n            type: (0, _constants.FRAGMENT_SHADER),\n            modules: modules\n        })),\n        getUniforms: assembleGetUniforms(modules)\n    };\n}\nfunction assembleShader(gl, _ref) {\n    var id = _ref.id, source = _ref.source, type = _ref.type, modules = _ref.modules, _ref$defines = _ref.defines, defines = _ref$defines === void 0 ? {} : _ref$defines, _ref$hookFunctions = _ref.hookFunctions, hookFunctions = _ref$hookFunctions === void 0 ? [] : _ref$hookFunctions, _ref$inject = _ref.inject, inject = _ref$inject === void 0 ? {} : _ref$inject, _ref$transpileToGLSL = _ref.transpileToGLSL100, transpileToGLSL100 = _ref$transpileToGLSL === void 0 ? false : _ref$transpileToGLSL, _ref$prologue = _ref.prologue, prologue = _ref$prologue === void 0 ? true : _ref$prologue, log = _ref.log;\n    (0, _utils.assert)(typeof source === \"string\", \"shader source must be a string\");\n    var isVertex = type === (0, _constants.VERTEX_SHADER);\n    var sourceLines = source.split(\"\\n\");\n    var glslVersion = 100;\n    var versionLine = \"\";\n    var coreSource = source;\n    if (sourceLines[0].indexOf(\"#version \") === 0) {\n        glslVersion = 300;\n        versionLine = sourceLines[0];\n        coreSource = sourceLines.slice(1).join(\"\\n\");\n    } else versionLine = \"#version \".concat(glslVersion);\n    var allDefines = {};\n    modules.forEach(function(module) {\n        Object.assign(allDefines, module.getDefines());\n    });\n    Object.assign(allDefines, defines);\n    var assembledSource = prologue ? \"\".concat(versionLine, \"\\n\").concat(getShaderName({\n        id: id,\n        source: source,\n        type: type\n    }), \"\\n\").concat(getShaderType({\n        type: type\n    }), \"\\n\").concat((0, _platformDefines.getPlatformShaderDefines)(gl), \"\\n\").concat((0, _platformDefines.getVersionDefines)(gl, glslVersion, !isVertex), \"\\n\").concat(getApplicationDefines(allDefines), \"\\n\").concat(isVertex ? \"\" : FRAGMENT_SHADER_PROLOGUE, \"\\n\") : \"\".concat(versionLine, \"\\n\");\n    hookFunctions = normalizeHookFunctions(hookFunctions);\n    var hookInjections = {};\n    var declInjections = {};\n    var mainInjections = {};\n    for(var key in inject){\n        var injection = typeof inject[key] === \"string\" ? {\n            injection: inject[key],\n            order: 0\n        } : inject[key];\n        var match = key.match(/^(v|f)s:(#)?([\\w-]+)$/);\n        if (match) {\n            var hash = match[2];\n            var name = match[3];\n            if (hash) {\n                if (name === \"decl\") declInjections[key] = [\n                    injection\n                ];\n                else mainInjections[key] = [\n                    injection\n                ];\n            } else hookInjections[key] = [\n                injection\n            ];\n        } else mainInjections[key] = [\n            injection\n        ];\n    }\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = modules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var module1 = _step.value;\n            if (log) module1.checkDeprecations(coreSource, log);\n            var moduleSource = module1.getModuleSource(type, glslVersion);\n            assembledSource += moduleSource;\n            var injections = module1.injections[type];\n            for(var _key in injections){\n                var _match = _key.match(/^(v|f)s:#([\\w-]+)$/);\n                if (_match) {\n                    var _name = _match[2];\n                    var injectionType = _name === \"decl\" ? declInjections : mainInjections;\n                    injectionType[_key] = injectionType[_key] || [];\n                    injectionType[_key].push(injections[_key]);\n                } else {\n                    hookInjections[_key] = hookInjections[_key] || [];\n                    hookInjections[_key].push(injections[_key]);\n                }\n            }\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    assembledSource += INJECT_SHADER_DECLARATIONS;\n    assembledSource = (0, _injectShaderDefault.default)(assembledSource, type, declInjections);\n    assembledSource += getHookFunctions(hookFunctions[type], hookInjections);\n    assembledSource += coreSource;\n    assembledSource = (0, _injectShaderDefault.default)(assembledSource, type, mainInjections);\n    assembledSource = (0, _transpileShaderDefault.default)(assembledSource, transpileToGLSL100 ? 100 : glslVersion, isVertex);\n    return assembledSource;\n}\nfunction assembleGetUniforms(modules) {\n    return function getUniforms(opts) {\n        var uniforms = {};\n        var _iteratorNormalCompletion2 = true;\n        var _didIteratorError2 = false;\n        var _iteratorError2 = undefined;\n        try {\n            for(var _iterator2 = modules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                var module = _step2.value;\n                var moduleUniforms = module.getUniforms(opts, uniforms);\n                Object.assign(uniforms, moduleUniforms);\n            }\n        } catch (err) {\n            _didIteratorError2 = true;\n            _iteratorError2 = err;\n        } finally{\n            try {\n                if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n            } finally{\n                if (_didIteratorError2) throw _iteratorError2;\n            }\n        }\n        return uniforms;\n    };\n}\nfunction getShaderType(_ref2) {\n    var type = _ref2.type;\n    return \"\\n#define SHADER_TYPE_\".concat(SHADER_TYPE[type].toUpperCase(), \"\\n\");\n}\nfunction getShaderName(_ref3) {\n    var id = _ref3.id, source = _ref3.source, type = _ref3.type;\n    var injectShaderName = id && typeof id === \"string\" && source.indexOf(\"SHADER_NAME\") === -1;\n    return injectShaderName ? \"\\n#define SHADER_NAME \".concat(id, \"_\").concat(SHADER_TYPE[type], \"\\n\\n\") : \"\";\n}\nfunction getApplicationDefines() {\n    var defines = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var count = 0;\n    var sourceText = \"\";\n    for(var define in defines){\n        if (count === 0) sourceText += \"\\n// APPLICATION DEFINES\\n\";\n        count++;\n        var value = defines[define];\n        if (value || Number.isFinite(value)) sourceText += \"#define \".concat(define.toUpperCase(), \" \").concat(defines[define], \"\\n\");\n    }\n    if (count === 0) sourceText += \"\\n\";\n    return sourceText;\n}\nfunction getHookFunctions(hookFunctions, hookInjections) {\n    var result = \"\";\n    for(var hookName in hookFunctions){\n        var hookFunction = hookFunctions[hookName];\n        result += \"void \".concat(hookFunction.signature, \" {\\n\");\n        if (hookFunction.header) result += \"  \".concat(hookFunction.header);\n        if (hookInjections[hookName]) {\n            var injections = hookInjections[hookName];\n            injections.sort(function(a, b) {\n                return a.order - b.order;\n            });\n            var _iteratorNormalCompletion3 = true;\n            var _didIteratorError3 = false;\n            var _iteratorError3 = undefined;\n            try {\n                for(var _iterator3 = injections[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){\n                    var injection = _step3.value;\n                    result += \"  \".concat(injection.injection, \"\\n\");\n                }\n            } catch (err) {\n                _didIteratorError3 = true;\n                _iteratorError3 = err;\n            } finally{\n                try {\n                    if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) _iterator3[\"return\"]();\n                } finally{\n                    if (_didIteratorError3) throw _iteratorError3;\n                }\n            }\n        }\n        if (hookFunction.footer) result += \"  \".concat(hookFunction.footer);\n        result += \"}\\n\";\n    }\n    return result;\n}\nfunction normalizeHookFunctions(hookFunctions) {\n    var result = {\n        vs: {},\n        fs: {}\n    };\n    hookFunctions.forEach(function(hook) {\n        var opts;\n        if (typeof hook !== \"string\") {\n            opts = hook;\n            hook = opts.hook;\n        } else opts = {};\n        hook = hook.trim();\n        var _hook$split = hook.split(\":\"), _hook$split2 = (0, _slicedToArrayDefault.default)(_hook$split, 2), stage = _hook$split2[0], signature = _hook$split2[1];\n        var name = hook.replace(/\\(.+/, \"\");\n        result[stage][name] = Object.assign(opts, {\n            signature: signature\n        });\n    });\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"./constants\":\"6S5Zn\",\"./resolve-modules\":\"9go4t\",\"./platform-defines\":\"gww34\",\"./inject-shader\":\"flvCl\",\"./transpile-shader\":\"5VETd\",\"../utils\":\"lnuIG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6S5Zn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VERTEX_SHADER\", ()=>VERTEX_SHADER);\nparcelHelpers.export(exports, \"FRAGMENT_SHADER\", ()=>FRAGMENT_SHADER);\nvar VERTEX_SHADER = \"vs\";\nvar FRAGMENT_SHADER = \"fs\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9go4t\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"resolveModules\", ()=>resolveModules);\nparcelHelpers.export(exports, \"TEST_EXPORTS\", ()=>TEST_EXPORTS);\nvar _shaderModule = require(\"./shader-module\");\nvar _shaderModuleDefault = parcelHelpers.interopDefault(_shaderModule);\nvar _utils = require(\"../utils\");\nfunction resolveModules(modules) {\n    return getShaderDependencies(instantiateModules(modules));\n}\nfunction getShaderDependencies(modules) {\n    var moduleMap = {};\n    var moduleDepth = {};\n    getDependencyGraph({\n        modules: modules,\n        level: 0,\n        moduleMap: moduleMap,\n        moduleDepth: moduleDepth\n    });\n    return Object.keys(moduleDepth).sort(function(a, b) {\n        return moduleDepth[b] - moduleDepth[a];\n    }).map(function(name) {\n        return moduleMap[name];\n    });\n}\nfunction getDependencyGraph(_ref) {\n    var modules = _ref.modules, level = _ref.level, moduleMap = _ref.moduleMap, moduleDepth = _ref.moduleDepth;\n    if (level >= 5) throw new Error(\"Possible loop in shader dependency graph\");\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = modules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var module = _step.value;\n            moduleMap[module.name] = module;\n            if (moduleDepth[module.name] === undefined || moduleDepth[module.name] < level) moduleDepth[module.name] = level;\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n    try {\n        for(var _iterator2 = modules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n            var _module = _step2.value;\n            if (_module.dependencies) getDependencyGraph({\n                modules: _module.dependencies,\n                level: level + 1,\n                moduleMap: moduleMap,\n                moduleDepth: moduleDepth\n            });\n        }\n    } catch (err1) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err1;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n        } finally{\n            if (_didIteratorError2) throw _iteratorError2;\n        }\n    }\n}\nfunction instantiateModules(modules, seen) {\n    return modules.map(function(module) {\n        if (module instanceof (0, _shaderModuleDefault.default)) return module;\n        (0, _utils.assert)(typeof module !== \"string\", \"Shader module use by name is deprecated. Import shader module '\".concat(module, \"' and use it directly.\"));\n        (0, _utils.assert)(module.name, \"shader module has no name\");\n        module = new (0, _shaderModuleDefault.default)(module);\n        module.dependencies = instantiateModules(module.dependencies);\n        return module;\n    });\n}\nvar TEST_EXPORTS = {\n    getShaderDependencies: getShaderDependencies,\n    getDependencyGraph: getDependencyGraph\n};\n\n},{\"./shader-module\":\"aVkhP\",\"../utils\":\"lnuIG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aVkhP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ShaderModule);\nparcelHelpers.export(exports, \"normalizeShaderModule\", ()=>normalizeShaderModule);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _utils = require(\"../utils\");\nvar _propTypes = require(\"./filters/prop-types\");\nvar VERTEX_SHADER = \"vs\";\nvar FRAGMENT_SHADER = \"fs\";\nvar ShaderModule = function() {\n    function ShaderModule1(_ref) {\n        var name = _ref.name, vs = _ref.vs, fs = _ref.fs, _ref$dependencies = _ref.dependencies, dependencies = _ref$dependencies === void 0 ? [] : _ref$dependencies, uniforms = _ref.uniforms, getUniforms = _ref.getUniforms, _ref$deprecations = _ref.deprecations, deprecations = _ref$deprecations === void 0 ? [] : _ref$deprecations, _ref$defines = _ref.defines, defines = _ref$defines === void 0 ? {} : _ref$defines, _ref$inject = _ref.inject, inject = _ref$inject === void 0 ? {} : _ref$inject, vertexShader = _ref.vertexShader, fragmentShader = _ref.fragmentShader;\n        (0, _classCallCheckDefault.default)(this, ShaderModule1);\n        (0, _utils.assert)(typeof name === \"string\");\n        this.name = name;\n        this.vs = vs || vertexShader;\n        this.fs = fs || fragmentShader;\n        this.getModuleUniforms = getUniforms;\n        this.dependencies = dependencies;\n        this.deprecations = this._parseDeprecationDefinitions(deprecations);\n        this.defines = defines;\n        this.injections = normalizeInjections(inject);\n        if (uniforms) this.uniforms = (0, _propTypes.parsePropTypes)(uniforms);\n    }\n    (0, _createClassDefault.default)(ShaderModule1, [\n        {\n            key: \"getModuleSource\",\n            value: function getModuleSource(type) {\n                var moduleSource;\n                switch(type){\n                    case VERTEX_SHADER:\n                        moduleSource = this.vs || \"\";\n                        break;\n                    case FRAGMENT_SHADER:\n                        moduleSource = this.fs || \"\";\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n                return \"#define MODULE_\".concat(this.name.toUpperCase().replace(/[^0-9a-z]/gi, \"_\"), \"\\n\").concat(moduleSource, \"// END MODULE_\").concat(this.name, \"\\n\\n\");\n            }\n        },\n        {\n            key: \"getUniforms\",\n            value: function getUniforms(opts, uniforms) {\n                if (this.getModuleUniforms) return this.getModuleUniforms(opts, uniforms);\n                if (this.uniforms) return this._defaultGetUniforms(opts);\n                return {};\n            }\n        },\n        {\n            key: \"getDefines\",\n            value: function getDefines() {\n                return this.defines;\n            }\n        },\n        {\n            key: \"checkDeprecations\",\n            value: function checkDeprecations(shaderSource, log) {\n                this.deprecations.forEach(function(def) {\n                    if (def.regex.test(shaderSource)) {\n                        if (def.deprecated) log.deprecated(def.old, def[\"new\"])();\n                        else log.removed(def.old, def[\"new\"])();\n                    }\n                });\n            }\n        },\n        {\n            key: \"_parseDeprecationDefinitions\",\n            value: function _parseDeprecationDefinitions(deprecations) {\n                deprecations.forEach(function(def) {\n                    switch(def.type){\n                        case \"function\":\n                            def.regex = new RegExp(\"\\\\b\".concat(def.old, \"\\\\(\"));\n                            break;\n                        default:\n                            def.regex = new RegExp(\"\".concat(def.type, \" \").concat(def.old, \";\"));\n                    }\n                });\n                return deprecations;\n            }\n        },\n        {\n            key: \"_defaultGetUniforms\",\n            value: function _defaultGetUniforms() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var uniforms = {};\n                var propTypes = this.uniforms;\n                for(var key in propTypes){\n                    var propDef = propTypes[key];\n                    if (key in opts && !propDef[\"private\"]) {\n                        if (propDef.validate) (0, _utils.assert)(propDef.validate(opts[key], propDef), \"\".concat(this.name, \": invalid \").concat(key));\n                        uniforms[key] = opts[key];\n                    } else uniforms[key] = propDef.value;\n                }\n                return uniforms;\n            }\n        }\n    ]);\n    return ShaderModule1;\n}();\nfunction normalizeShaderModule(module) {\n    if (!module.normalized) {\n        module.normalized = true;\n        if (module.uniforms && !module.getUniforms) {\n            var shaderModule = new ShaderModule(module);\n            module.getUniforms = shaderModule.getUniforms.bind(shaderModule);\n        }\n    }\n    return module;\n}\nfunction normalizeInjections(injections) {\n    var result = {\n        vs: {},\n        fs: {}\n    };\n    for(var hook in injections){\n        var injection = injections[hook];\n        var stage = hook.slice(0, 2);\n        if (typeof injection === \"string\") injection = {\n            injection: injection\n        };\n        result[stage][hook] = injection;\n    }\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../utils\":\"lnuIG\",\"./filters/prop-types\":\"922QG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lnuIG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\n\n},{\"./assert\":\"ksQ1i\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ksQ1i\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"shadertools: assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"922QG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parsePropTypes\", ()=>parsePropTypes);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar TYPE_DEFINITIONS = {\n    number: {\n        validate: function validate(value, propType) {\n            return Number.isFinite(value) && (!(\"max\" in propType) || value <= propType.max) && (!(\"min\" in propType) || value >= propType.min);\n        }\n    },\n    array: {\n        validate: function validate(value, propType) {\n            return Array.isArray(value) || ArrayBuffer.isView(value);\n        }\n    }\n};\nfunction parsePropTypes(propDefs) {\n    var propTypes = {};\n    for(var propName in propDefs){\n        var propDef = propDefs[propName];\n        var propType = parsePropType(propDef);\n        propTypes[propName] = propType;\n    }\n    return propTypes;\n}\nfunction parsePropType(propDef) {\n    var type = getTypeOf(propDef);\n    if (type === \"object\") {\n        if (!propDef) return {\n            type: \"object\",\n            value: null\n        };\n        if (\"type\" in propDef) return Object.assign({}, propDef, TYPE_DEFINITIONS[propDef.type]);\n        if (!(\"value\" in propDef)) return {\n            type: \"object\",\n            value: propDef\n        };\n        type = getTypeOf(propDef.value);\n        return Object.assign({\n            type: type\n        }, propDef, TYPE_DEFINITIONS[type]);\n    }\n    return Object.assign({\n        type: type,\n        value: propDef\n    }, TYPE_DEFINITIONS[type]);\n}\nfunction getTypeOf(value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) return \"array\";\n    return (0, _typeofDefault.default)(value);\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gww34\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getPlatformShaderDefines\", ()=>getPlatformShaderDefines);\nparcelHelpers.export(exports, \"getVersionDefines\", ()=>getVersionDefines);\nvar _webglInfo = require(\"../utils/webgl-info\");\nfunction getPlatformShaderDefines(gl) {\n    var debugInfo = (0, _webglInfo.getContextInfo)(gl);\n    switch(debugInfo.gpuVendor.toLowerCase()){\n        case \"nvidia\":\n            return \"#define NVIDIA_GPU\\n// Nvidia optimizes away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n\";\n        case \"intel\":\n            return \"#define INTEL_GPU\\n// Intel optimizes away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n// Intel's built-in 'tan' function doesn't have acceptable precision\\n#define LUMA_FP32_TAN_PRECISION_WORKAROUND 1\\n// Intel GPU doesn't have full 32 bits precision in same cases, causes overflow\\n#define LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND 1\\n\";\n        case \"amd\":\n            return \"#define AMD_GPU\\n\";\n        default:\n            return \"#define DEFAULT_GPU\\n// Prevent driver from optimizing away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n// Intel's built-in 'tan' function doesn't have acceptable precision\\n#define LUMA_FP32_TAN_PRECISION_WORKAROUND 1\\n// Intel GPU doesn't have full 32 bits precision in same cases, causes overflow\\n#define LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND 1\\n\";\n    }\n}\nfunction getVersionDefines(gl, glslVersion, isFragment) {\n    var versionDefines = \"#if (__VERSION__ > 120)\\n\\n# define FRAG_DEPTH\\n# define DERIVATIVES\\n# define DRAW_BUFFERS\\n# define TEXTURE_LOD\\n\\n#endif // __VERSION\\n\";\n    if ((0, _webglInfo.hasFeatures)(gl, (0, _webglInfo.FEATURES).GLSL_FRAG_DEPTH)) versionDefines += \"// FRAG_DEPTH => gl_FragDepth is available\\n#ifdef GL_EXT_frag_depth\\n#extension GL_EXT_frag_depth : enable\\n# define FRAG_DEPTH\\n# define gl_FragDepth gl_FragDepthEXT\\n#endif\\n\";\n    if ((0, _webglInfo.hasFeatures)(gl, (0, _webglInfo.FEATURES).GLSL_DERIVATIVES) && (0, _webglInfo.canCompileGLGSExtension)(gl, (0, _webglInfo.FEATURES).GLSL_DERIVATIVES)) versionDefines += \"// DERIVATIVES => dxdF, dxdY and fwidth are available\\n#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n# define DERIVATIVES\\n#endif\\n\";\n    if ((0, _webglInfo.hasFeatures)(gl, (0, _webglInfo.FEATURES).GLSL_FRAG_DATA) && (0, _webglInfo.canCompileGLGSExtension)(gl, (0, _webglInfo.FEATURES).GLSL_FRAG_DATA, {\n        behavior: \"require\"\n    })) versionDefines += \"// DRAW_BUFFERS => gl_FragData[] is available\\n#ifdef GL_EXT_draw_buffers\\n#extension GL_EXT_draw_buffers : require\\n#define DRAW_BUFFERS\\n#endif\\n\";\n    if ((0, _webglInfo.hasFeatures)(gl, (0, _webglInfo.FEATURES).GLSL_TEXTURE_LOD)) versionDefines += \"// TEXTURE_LOD => texture2DLod etc are available\\n#ifdef GL_EXT_shader_texture_lod\\n#extension GL_EXT_shader_texture_lod : enable\\n# define TEXTURE_LOD\\n#define texture2DLod texture2DLodEXT\\n#define texture2DProjLod texture2DProjLodEXT\\n#define texture2DProjLod texture2DProjLodEXT\\n#define textureCubeLod textureCubeLodEXT\\n#define texture2DGrad texture2DGradEXT\\n#define texture2DProjGrad texture2DProjGradEXT\\n#define texture2DProjGrad texture2DProjGradEXT\\n#define textureCubeGrad textureCubeGradEXT\\n#endif\\n\";\n    return versionDefines;\n}\n\n},{\"../utils/webgl-info\":\"jeJJ4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jeJJ4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FEATURES\", ()=>FEATURES);\nparcelHelpers.export(exports, \"getContextInfo\", ()=>getContextInfo);\nparcelHelpers.export(exports, \"canCompileGLGSExtension\", ()=>canCompileGLGSExtension);\nparcelHelpers.export(exports, \"hasFeatures\", ()=>hasFeatures);\nvar _isOldIe = require(\"./is-old-ie\");\nvar _isOldIeDefault = parcelHelpers.interopDefault(_isOldIe);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar GL_VENDOR = 0x1f00;\nvar GL_RENDERER = 0x1f01;\nvar GL_VERSION = 0x1f02;\nvar GL_SHADING_LANGUAGE_VERSION = 0x8b8c;\nvar WEBGL_FEATURES = {\n    GLSL_FRAG_DATA: [\n        \"WEBGL_draw_buffers\",\n        true\n    ],\n    GLSL_FRAG_DEPTH: [\n        \"EXT_frag_depth\",\n        true\n    ],\n    GLSL_DERIVATIVES: [\n        \"OES_standard_derivatives\",\n        true\n    ],\n    GLSL_TEXTURE_LOD: [\n        \"EXT_shader_texture_lod\",\n        true\n    ]\n};\nvar FEATURES = {};\nObject.keys(WEBGL_FEATURES).forEach(function(key) {\n    FEATURES[key] = key;\n});\nfunction isWebGL2(gl) {\n    return Boolean(gl && gl._version === 2);\n}\nfunction getContextInfo(gl) {\n    var info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n    var vendor = gl.getParameter(info && info.UNMASKED_VENDOR_WEBGL || GL_VENDOR);\n    var renderer = gl.getParameter(info && info.UNMASKED_RENDERER_WEBGL || GL_RENDERER);\n    var gpuVendor = identifyGPUVendor(vendor, renderer);\n    var gpuInfo = {\n        gpuVendor: gpuVendor,\n        vendor: vendor,\n        renderer: renderer,\n        version: gl.getParameter(GL_VERSION),\n        shadingLanguageVersion: gl.getParameter(GL_SHADING_LANGUAGE_VERSION)\n    };\n    return gpuInfo;\n}\nfunction identifyGPUVendor(vendor, renderer) {\n    if (vendor.match(/NVIDIA/i) || renderer.match(/NVIDIA/i)) return \"NVIDIA\";\n    if (vendor.match(/INTEL/i) || renderer.match(/INTEL/i)) return \"INTEL\";\n    if (vendor.match(/AMD/i) || renderer.match(/AMD/i) || vendor.match(/ATI/i) || renderer.match(/ATI/i)) return \"AMD\";\n    return \"UNKNOWN GPU\";\n}\nvar compiledGlslExtensions = {};\nfunction canCompileGLGSExtension(gl, cap) {\n    var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var feature = WEBGL_FEATURES[cap];\n    (0, _assertDefault.default)(feature, cap);\n    if (!(0, _isOldIeDefault.default)(opts)) return true;\n    if (cap in compiledGlslExtensions) return compiledGlslExtensions[cap];\n    var extensionName = feature[0];\n    var behavior = opts.behavior || \"enable\";\n    var source = \"#extension GL_\".concat(extensionName, \" : \").concat(behavior, \"\\nvoid main(void) {}\");\n    var shader = gl.createShader(35633);\n    gl.shaderSource(shader, source);\n    gl.compileShader(shader);\n    var canCompile = gl.getShaderParameter(shader, 35713);\n    gl.deleteShader(shader);\n    compiledGlslExtensions[cap] = canCompile;\n    return canCompile;\n}\nfunction getFeature(gl, cap) {\n    var feature = WEBGL_FEATURES[cap];\n    (0, _assertDefault.default)(feature, cap);\n    var extensionName = isWebGL2(gl) ? feature[1] || feature[0] : feature[0];\n    var value = typeof extensionName === \"string\" ? Boolean(gl.getExtension(extensionName)) : extensionName;\n    (0, _assertDefault.default)(value === false || value === true);\n    return value;\n}\nfunction hasFeatures(gl, features) {\n    features = Array.isArray(features) ? features : [\n        features\n    ];\n    return features.every(function(feature) {\n        return getFeature(gl, feature);\n    });\n}\n\n},{\"./is-old-ie\":\"lU7F9\",\"./assert\":\"ksQ1i\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lU7F9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction isOldIE() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var navigator = typeof window !== \"undefined\" ? window.navigator || {} : {};\n    var userAgent = opts.userAgent || navigator.userAgent || \"\";\n    var isMSIE = userAgent.indexOf(\"MSIE \") !== -1;\n    var isTrident = userAgent.indexOf(\"Trident/\") !== -1;\n    return isMSIE || isTrident;\n}\nexports.default = isOldIE;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"flvCl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DECLARATION_INJECT_MARKER\", ()=>DECLARATION_INJECT_MARKER);\nparcelHelpers.export(exports, \"combineInjects\", ()=>combineInjects);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _moduleInjectors = require(\"../modules/module-injectors\");\nvar _constants = require(\"./constants\");\nvar _utils = require(\"../utils\");\nvar _MODULE_INJECTORS;\nvar MODULE_INJECTORS = (_MODULE_INJECTORS = {}, (0, _definePropertyDefault.default)(_MODULE_INJECTORS, (0, _constants.VERTEX_SHADER), (0, _moduleInjectors.MODULE_INJECTORS_VS)), (0, _definePropertyDefault.default)(_MODULE_INJECTORS, (0, _constants.FRAGMENT_SHADER), (0, _moduleInjectors.MODULE_INJECTORS_FS)), _MODULE_INJECTORS);\nvar DECLARATION_INJECT_MARKER = \"__LUMA_INJECT_DECLARATIONS__\";\nvar REGEX_START_OF_MAIN = /void\\s+main\\s*\\([^)]*\\)\\s*\\{\\n?/;\nvar REGEX_END_OF_MAIN = /}\\n?[^{}]*$/;\nvar fragments = [];\nfunction injectShader(source, type, inject, injectStandardStubs) {\n    var isVertex = type === (0, _constants.VERTEX_SHADER);\n    var _loop = function _loop(key) {\n        var fragmentData = inject[key];\n        fragmentData.sort(function(a, b) {\n            return a.order - b.order;\n        });\n        fragments.length = fragmentData.length;\n        for(var i = 0, len = fragmentData.length; i < len; ++i)fragments[i] = fragmentData[i].injection;\n        var fragmentString = \"\".concat(fragments.join(\"\\n\"), \"\\n\");\n        switch(key){\n            case \"vs:#decl\":\n                if (isVertex) source = source.replace(DECLARATION_INJECT_MARKER, fragmentString);\n                break;\n            case \"vs:#main-start\":\n                if (isVertex) source = source.replace(REGEX_START_OF_MAIN, function(match) {\n                    return match + fragmentString;\n                });\n                break;\n            case \"vs:#main-end\":\n                if (isVertex) source = source.replace(REGEX_END_OF_MAIN, function(match) {\n                    return fragmentString + match;\n                });\n                break;\n            case \"fs:#decl\":\n                if (!isVertex) source = source.replace(DECLARATION_INJECT_MARKER, fragmentString);\n                break;\n            case \"fs:#main-start\":\n                if (!isVertex) source = source.replace(REGEX_START_OF_MAIN, function(match) {\n                    return match + fragmentString;\n                });\n                break;\n            case \"fs:#main-end\":\n                if (!isVertex) source = source.replace(REGEX_END_OF_MAIN, function(match) {\n                    return fragmentString + match;\n                });\n                break;\n            default:\n                source = source.replace(key, function(match) {\n                    return match + fragmentString;\n                });\n        }\n    };\n    for(var key1 in inject)_loop(key1);\n    source = source.replace(DECLARATION_INJECT_MARKER, \"\");\n    if (injectStandardStubs) source = source.replace(/\\}\\s*$/, function(match) {\n        return match + MODULE_INJECTORS[type];\n    });\n    return source;\n}\nexports.default = injectShader;\nfunction combineInjects(injects) {\n    var result = {};\n    (0, _utils.assert)(Array.isArray(injects) && injects.length > 1);\n    injects.forEach(function(inject) {\n        for(var key in inject)result[key] = result[key] ? \"\".concat(result[key], \"\\n\").concat(inject[key]) : inject[key];\n    });\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"../modules/module-injectors\":\"adlEw\",\"./constants\":\"6S5Zn\",\"../utils\":\"lnuIG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"adlEw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"MODULE_INJECTORS_VS\", ()=>MODULE_INJECTORS_VS);\nparcelHelpers.export(exports, \"MODULE_INJECTORS_FS\", ()=>MODULE_INJECTORS_FS);\nvar MODULE_INJECTORS_VS = \"#ifdef MODULE_LOGDEPTH\\n  logdepth_adjustPosition(gl_Position);\\n#endif\\n\";\nvar MODULE_INJECTORS_FS = \"#ifdef MODULE_MATERIAL\\n  gl_FragColor = material_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_LIGHTING\\n  gl_FragColor = lighting_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_FOG\\n  gl_FragColor = fog_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_PICKING\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_LOGDEPTH\\n  logdepth_setFragDepth();\\n#endif\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5VETd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction transpileShader(source, targetGLSLVersion, isVertex) {\n    switch(targetGLSLVersion){\n        case 300:\n            return isVertex ? convertVertexShaderTo300(source) : convertFragmentShaderTo300(source);\n        case 100:\n            return isVertex ? convertVertexShaderTo100(source) : convertFragmentShaderTo100(source);\n        default:\n            throw new Error(\"unknown GLSL version \".concat(targetGLSLVersion));\n    }\n}\nexports.default = transpileShader;\nvar FS_OUTPUT_REGEX = /^[ \\t]*out[ \\t]+vec4[ \\t]+(\\w+)[ \\t]*;\\s+/m;\nfunction convertVertexShaderTo300(source) {\n    return source.replace(/^(#version[ \\t]+(100|300[ \\t]+es))?[ \\t]*\\n/, \"#version 300 es\\n\").replace(/^[ \\t]*attribute[ \\t]+(.+;)/gm, \"in $1\").replace(/^[ \\t]*varying[ \\t]+(.+;)/gm, \"out $1\").replace(/\\btexture2D\\(/g, \"texture(\").replace(/\\btextureCube\\(+/g, \"texture(\").replace(/\\btexture2DLodEXT\\(/g, \"textureLod(\").replace(/\\btextureCubeLodEXT\\(/g, \"textureLod(\");\n}\nfunction convertFragmentShaderTo300(source) {\n    return source.replace(/^(#version[ \\t]+(100|300[ \\t]+es))?[ \\t]*\\n/, \"#version 300 es\\n\").replace(/^[ \\t]*varying[ \\t]+(.+;)/gm, \"in $1\").replace(/\\btexture2D\\(/g, \"texture(\").replace(/\\btextureCube\\(/g, \"texture(\").replace(/\\btexture2DLodEXT\\(/g, \"textureLod(\").replace(/\\btextureCubeLodEXT\\(/g, \"textureLod(\");\n}\nfunction convertVertexShaderTo100(source) {\n    return source.replace(/^#version[ \\t]+300[ \\t]+es/, \"#version 100\").replace(/^[ \\t]*in[ \\t]+(.+;)/gm, \"attribute $1\").replace(/^[ \\t]*out[ \\t]+(.+;)/gm, \"varying $1\").replace(/\\btexture\\(/g, \"texture2D(\").replace(/\\btextureLod\\(/g, \"texture2DLodEXT(\");\n}\nfunction convertFragmentShaderTo100(source) {\n    source = source.replace(/^#version[ \\t]+300[ \\t]+es/, \"#version 100\").replace(/^[ \\t]*in[ \\t]+/gm, \"varying \").replace(/\\btexture\\(/g, \"texture2D(\").replace(/\\btextureLod\\(/g, \"texture2DLodEXT(\");\n    var outputMatch = source.match(FS_OUTPUT_REGEX);\n    if (outputMatch) {\n        var outputName = outputMatch[1];\n        source = source.replace(FS_OUTPUT_REGEX, \"\").replace(new RegExp(\"\\\\b\".concat(outputName, \"\\\\b\"), \"g\"), \"gl_FragColor\");\n    }\n    return source;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3XwJF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getQualifierDetails\", ()=>getQualifierDetails);\nparcelHelpers.export(exports, \"getPassthroughFS\", ()=>getPassthroughFS);\nparcelHelpers.export(exports, \"typeToChannelSuffix\", ()=>typeToChannelSuffix);\nparcelHelpers.export(exports, \"typeToChannelCount\", ()=>typeToChannelCount);\nparcelHelpers.export(exports, \"convertToVec4\", ()=>convertToVec4);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _utils = require(\"../utils\");\nvar FS100 = \"void main() {gl_FragColor = vec4(0);}\";\nvar FS_GLES = \"out vec4 transform_output;\\nvoid main() {\\n  transform_output = vec4(0);\\n}\";\nvar FS300 = \"#version 300 es\\n\".concat(FS_GLES);\nfunction getQualifierDetails(line, qualifiers) {\n    qualifiers = Array.isArray(qualifiers) ? qualifiers : [\n        qualifiers\n    ];\n    var words = line.replace(/^\\s+/, \"\").split(/\\s+/);\n    var _words = (0, _slicedToArrayDefault.default)(words, 3), qualifier = _words[0], type = _words[1], definition = _words[2];\n    if (!qualifiers.includes(qualifier) || !type || !definition) return null;\n    var name = definition.split(\";\")[0];\n    return {\n        qualifier: qualifier,\n        type: type,\n        name: name\n    };\n}\nfunction getPassthroughFS() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$version = _ref.version, version = _ref$version === void 0 ? 100 : _ref$version, input = _ref.input, inputType = _ref.inputType, output = _ref.output;\n    if (!input) {\n        if (version === 300) return FS300;\n        else if (version > 300) return \"#version \".concat(version, \"\\n\").concat(FS_GLES);\n        return FS100;\n    }\n    var outputValue = convertToVec4(input, inputType);\n    if (version >= 300) return \"#version \".concat(version, \" \").concat(version === 300 ? \"es\" : \"\", \"\\nin \").concat(inputType, \" \").concat(input, \";\\nout vec4 \").concat(output, \";\\nvoid main() {\\n  \").concat(output, \" = \").concat(outputValue, \";\\n}\");\n    return \"varying \".concat(inputType, \" \").concat(input, \";\\nvoid main() {\\n  gl_FragColor = \").concat(outputValue, \";\\n}\");\n}\nfunction typeToChannelSuffix(type) {\n    switch(type){\n        case \"float\":\n            return \"x\";\n        case \"vec2\":\n            return \"xy\";\n        case \"vec3\":\n            return \"xyz\";\n        case \"vec4\":\n            return \"xyzw\";\n        default:\n            (0, _utils.assert)(false);\n            return null;\n    }\n}\nfunction typeToChannelCount(type) {\n    switch(type){\n        case \"float\":\n            return 1;\n        case \"vec2\":\n            return 2;\n        case \"vec3\":\n            return 3;\n        case \"vec4\":\n            return 4;\n        default:\n            (0, _utils.assert)(false);\n            return null;\n    }\n}\nfunction convertToVec4(variable, type) {\n    switch(type){\n        case \"float\":\n            return \"vec4(\".concat(variable, \", 0.0, 0.0, 1.0)\");\n        case \"vec2\":\n            return \"vec4(\".concat(variable, \", 0.0, 1.0)\");\n        case \"vec3\":\n            return \"vec4(\".concat(variable, \", 1.0)\");\n        case \"vec4\":\n            return variable;\n        default:\n            (0, _utils.assert)(false);\n            return null;\n    }\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"../utils\":\"lnuIG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kr7fA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fp32\", ()=>(0, _fp32Default.default));\nparcelHelpers.export(exports, \"fp64\", ()=>(0, _fp64Default.default));\nparcelHelpers.export(exports, \"fp64arithmetic\", ()=>(0, _fp64.fp64arithmetic));\nparcelHelpers.export(exports, \"project\", ()=>(0, _projectDefault.default));\nparcelHelpers.export(exports, \"lights\", ()=>(0, _lightsDefault.default));\nparcelHelpers.export(exports, \"dirlight\", ()=>(0, _dirlightDefault.default));\nparcelHelpers.export(exports, \"picking\", ()=>(0, _pickingDefault.default));\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>(0, _phongLighting.gouraudLighting));\nparcelHelpers.export(exports, \"phongLighting\", ()=>(0, _phongLighting.phongLighting));\nparcelHelpers.export(exports, \"pbr\", ()=>(0, _pbrDefault.default));\nparcelHelpers.export(exports, \"brightnessContrast\", ()=>(0, _brightnesscontrastDefault.default));\nparcelHelpers.export(exports, \"denoise\", ()=>(0, _denoiseDefault.default));\nparcelHelpers.export(exports, \"hueSaturation\", ()=>(0, _huesaturationDefault.default));\nparcelHelpers.export(exports, \"noise\", ()=>(0, _noiseDefault.default));\nparcelHelpers.export(exports, \"sepia\", ()=>(0, _sepiaDefault.default));\nparcelHelpers.export(exports, \"vibrance\", ()=>(0, _vibranceDefault.default));\nparcelHelpers.export(exports, \"vignette\", ()=>(0, _vignetteDefault.default));\nparcelHelpers.export(exports, \"tiltShift\", ()=>(0, _tiltshiftDefault.default));\nparcelHelpers.export(exports, \"triangleBlur\", ()=>(0, _triangleblurDefault.default));\nparcelHelpers.export(exports, \"zoomBlur\", ()=>(0, _zoomblurDefault.default));\nparcelHelpers.export(exports, \"colorHalftone\", ()=>(0, _colorhalftoneDefault.default));\nparcelHelpers.export(exports, \"dotScreen\", ()=>(0, _dotscreenDefault.default));\nparcelHelpers.export(exports, \"edgeWork\", ()=>(0, _edgeworkDefault.default));\nparcelHelpers.export(exports, \"hexagonalPixelate\", ()=>(0, _hexagonalpixelateDefault.default));\nparcelHelpers.export(exports, \"ink\", ()=>(0, _inkDefault.default));\nparcelHelpers.export(exports, \"bulgePinch\", ()=>(0, _bulgepinchDefault.default));\nparcelHelpers.export(exports, \"swirl\", ()=>(0, _swirlDefault.default));\nparcelHelpers.export(exports, \"fxaa\", ()=>(0, _fxaaDefault.default));\nparcelHelpers.export(exports, \"_transform\", ()=>(0, _transformDefault.default));\nvar _fp32 = require(\"./fp32/fp32\");\nvar _fp32Default = parcelHelpers.interopDefault(_fp32);\nvar _fp64 = require(\"./fp64/fp64\");\nvar _fp64Default = parcelHelpers.interopDefault(_fp64);\nvar _project = require(\"./project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar _lights = require(\"./lights/lights\");\nvar _lightsDefault = parcelHelpers.interopDefault(_lights);\nvar _dirlight = require(\"./dirlight/dirlight\");\nvar _dirlightDefault = parcelHelpers.interopDefault(_dirlight);\nvar _picking = require(\"./picking/picking\");\nvar _pickingDefault = parcelHelpers.interopDefault(_picking);\nvar _phongLighting = require(\"./phong-lighting/phong-lighting\");\nvar _pbr = require(\"./pbr/pbr\");\nvar _pbrDefault = parcelHelpers.interopDefault(_pbr);\nvar _brightnesscontrast = require(\"./adjust-filters/brightnesscontrast\");\nvar _brightnesscontrastDefault = parcelHelpers.interopDefault(_brightnesscontrast);\nvar _denoise = require(\"./adjust-filters/denoise\");\nvar _denoiseDefault = parcelHelpers.interopDefault(_denoise);\nvar _huesaturation = require(\"./adjust-filters/huesaturation\");\nvar _huesaturationDefault = parcelHelpers.interopDefault(_huesaturation);\nvar _noise = require(\"./adjust-filters/noise\");\nvar _noiseDefault = parcelHelpers.interopDefault(_noise);\nvar _sepia = require(\"./adjust-filters/sepia\");\nvar _sepiaDefault = parcelHelpers.interopDefault(_sepia);\nvar _vibrance = require(\"./adjust-filters/vibrance\");\nvar _vibranceDefault = parcelHelpers.interopDefault(_vibrance);\nvar _vignette = require(\"./adjust-filters/vignette\");\nvar _vignetteDefault = parcelHelpers.interopDefault(_vignette);\nvar _tiltshift = require(\"./blur-filters/tiltshift\");\nvar _tiltshiftDefault = parcelHelpers.interopDefault(_tiltshift);\nvar _triangleblur = require(\"./blur-filters/triangleblur\");\nvar _triangleblurDefault = parcelHelpers.interopDefault(_triangleblur);\nvar _zoomblur = require(\"./blur-filters/zoomblur\");\nvar _zoomblurDefault = parcelHelpers.interopDefault(_zoomblur);\nvar _colorhalftone = require(\"./fun-filters/colorhalftone\");\nvar _colorhalftoneDefault = parcelHelpers.interopDefault(_colorhalftone);\nvar _dotscreen = require(\"./fun-filters/dotscreen\");\nvar _dotscreenDefault = parcelHelpers.interopDefault(_dotscreen);\nvar _edgework = require(\"./fun-filters/edgework\");\nvar _edgeworkDefault = parcelHelpers.interopDefault(_edgework);\nvar _hexagonalpixelate = require(\"./fun-filters/hexagonalpixelate\");\nvar _hexagonalpixelateDefault = parcelHelpers.interopDefault(_hexagonalpixelate);\nvar _ink = require(\"./fun-filters/ink\");\nvar _inkDefault = parcelHelpers.interopDefault(_ink);\nvar _bulgepinch = require(\"./warp-filters/bulgepinch\");\nvar _bulgepinchDefault = parcelHelpers.interopDefault(_bulgepinch);\nvar _swirl = require(\"./warp-filters/swirl\");\nvar _swirlDefault = parcelHelpers.interopDefault(_swirl);\nvar _fxaa = require(\"./fxaa/fxaa\");\nvar _fxaaDefault = parcelHelpers.interopDefault(_fxaa);\nvar _transform = require(\"./transform/transform\");\nvar _transformDefault = parcelHelpers.interopDefault(_transform);\n\n},{\"./fp32/fp32\":\"AR7jG\",\"./fp64/fp64\":\"6ycIN\",\"./project/project\":\"atHzB\",\"./lights/lights\":\"1zTTJ\",\"./dirlight/dirlight\":\"5u9oO\",\"./picking/picking\":\"pqxCq\",\"./phong-lighting/phong-lighting\":\"b6nnT\",\"./pbr/pbr\":\"bEcs5\",\"./adjust-filters/brightnesscontrast\":\"7ZBE6\",\"./adjust-filters/denoise\":\"8CtPv\",\"./adjust-filters/huesaturation\":\"d8SIc\",\"./adjust-filters/noise\":\"8IUBT\",\"./adjust-filters/sepia\":\"kQcZf\",\"./adjust-filters/vibrance\":\"6fy1A\",\"./adjust-filters/vignette\":\"hgIoO\",\"./blur-filters/tiltshift\":\"48x69\",\"./blur-filters/triangleblur\":\"g4Jp6\",\"./blur-filters/zoomblur\":\"6RoTc\",\"./fun-filters/colorhalftone\":\"3mJEq\",\"./fun-filters/dotscreen\":\"dHKPk\",\"./fun-filters/edgework\":\"cQtwF\",\"./fun-filters/hexagonalpixelate\":\"iwIDJ\",\"./fun-filters/ink\":\"2Ygpd\",\"./warp-filters/bulgepinch\":\"kzKcd\",\"./warp-filters/swirl\":\"RVvTf\",\"./fxaa/fxaa\":\"cUoGY\",\"./transform/transform\":\"8xeP4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"AR7jG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fp32shader = \"#ifdef LUMA_FP32_TAN_PRECISION_WORKAROUND\\nconst float TWO_PI = 6.2831854820251465;\\nconst float PI_2 = 1.5707963705062866;\\nconst float PI_16 = 0.1963495463132858;\\n\\nconst float SIN_TABLE_0 = 0.19509032368659973;\\nconst float SIN_TABLE_1 = 0.3826834261417389;\\nconst float SIN_TABLE_2 = 0.5555702447891235;\\nconst float SIN_TABLE_3 = 0.7071067690849304;\\n\\nconst float COS_TABLE_0 = 0.9807852506637573;\\nconst float COS_TABLE_1 = 0.9238795042037964;\\nconst float COS_TABLE_2 = 0.8314695954322815;\\nconst float COS_TABLE_3 = 0.7071067690849304;\\n\\nconst float INVERSE_FACTORIAL_3 = 1.666666716337204e-01;\\nconst float INVERSE_FACTORIAL_5 = 8.333333767950535e-03;\\nconst float INVERSE_FACTORIAL_7 = 1.9841270113829523e-04;\\nconst float INVERSE_FACTORIAL_9 = 2.75573188446287533e-06;\\n\\nfloat sin_taylor_fp32(float a) {\\n  float r, s, t, x;\\n\\n  if (a == 0.0) {\\n    return 0.0;\\n  }\\n\\n  x = -a * a;\\n  s = a;\\n  r = a;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_3;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_5;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_7;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_9;\\n  s = s + t;\\n\\n  return s;\\n}\\n\\nvoid sincos_taylor_fp32(float a, out float sin_t, out float cos_t) {\\n  if (a == 0.0) {\\n    sin_t = 0.0;\\n    cos_t = 1.0;\\n  }\\n  sin_t = sin_taylor_fp32(a);\\n  cos_t = sqrt(1.0 - sin_t * sin_t);\\n}\\n\\nfloat tan_taylor_fp32(float a) {\\n    float sin_a;\\n    float cos_a;\\n\\n    if (a == 0.0) {\\n        return 0.0;\\n    }\\n    float z = floor(a / TWO_PI);\\n    float r = a - TWO_PI * z;\\n\\n    float t;\\n    float q = floor(r / PI_2 + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return 0.0 / 0.0;\\n    }\\n\\n    t = r - PI_2 * q;\\n\\n    q = floor(t / PI_16 + 0.5);\\n    int k = int(q);\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return 0.0 / 0.0;\\n    } else {\\n        t = t - PI_16 * q;\\n    }\\n\\n    float u = 0.0;\\n    float v = 0.0;\\n\\n    float sin_t, cos_t;\\n    float s, c;\\n    sincos_taylor_fp32(t, sin_t, cos_t);\\n\\n    if (k == 0) {\\n        s = sin_t;\\n        c = cos_t;\\n    } else {\\n        if (abs(float(abs_k) - 1.0) < 0.5) {\\n            u = COS_TABLE_0;\\n            v = SIN_TABLE_0;\\n        } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n            u = COS_TABLE_1;\\n            v = SIN_TABLE_1;\\n        } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n            u = COS_TABLE_2;\\n            v = SIN_TABLE_2;\\n        } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n            u = COS_TABLE_3;\\n            v = SIN_TABLE_3;\\n        }\\n        if (k > 0) {\\n            s = u * sin_t + v * cos_t;\\n            c = u * cos_t - v * sin_t;\\n        } else {\\n            s = u * sin_t - v * cos_t;\\n            c = u * cos_t + v * sin_t;\\n        }\\n    }\\n\\n    if (j == 0) {\\n        sin_a = s;\\n        cos_a = c;\\n    } else if (j == 1) {\\n        sin_a = c;\\n        cos_a = -s;\\n    } else if (j == -1) {\\n        sin_a = -c;\\n        cos_a = s;\\n    } else {\\n        sin_a = -s;\\n        cos_a = -c;\\n    }\\n    return sin_a / cos_a;\\n}\\n#endif\\n\\nfloat tan_fp32(float a) {\\n#ifdef LUMA_FP32_TAN_PRECISION_WORKAROUND\\n  return tan_taylor_fp32(a);\\n#else\\n  return tan(a);\\n#endif\\n}\\n\";\nexports.default = {\n    name: \"fp32\",\n    vs: fp32shader,\n    fs: null\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6ycIN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fp64ify\", ()=>(0, _fp64Utils.fp64ify));\nparcelHelpers.export(exports, \"fp64LowPart\", ()=>(0, _fp64Utils.fp64LowPart));\nparcelHelpers.export(exports, \"fp64ifyMatrix4\", ()=>(0, _fp64Utils.fp64ifyMatrix4));\nparcelHelpers.export(exports, \"fp64arithmetic\", ()=>fp64arithmetic);\nvar _fp64Utils = require(\"./fp64-utils\");\nvar _fp64ArithmeticGlsl = require(\"./fp64-arithmetic.glsl\");\nvar _fp64ArithmeticGlslDefault = parcelHelpers.interopDefault(_fp64ArithmeticGlsl);\nvar _fp64FunctionsGlsl = require(\"./fp64-functions.glsl\");\nvar _fp64FunctionsGlslDefault = parcelHelpers.interopDefault(_fp64FunctionsGlsl);\nvar CONST_UNIFORMS = {\n    ONE: 1.0\n};\nfunction getUniforms() {\n    return CONST_UNIFORMS;\n}\nvar fp64arithmetic = {\n    name: \"fp64-arithmetic\",\n    vs: (0, _fp64ArithmeticGlslDefault.default),\n    fs: null,\n    getUniforms: getUniforms,\n    fp64ify: (0, _fp64Utils.fp64ify),\n    fp64LowPart: (0, _fp64Utils.fp64LowPart)\n};\nexports.default = {\n    name: \"fp64\",\n    vs: (0, _fp64FunctionsGlslDefault.default),\n    fs: null,\n    dependencies: [\n        fp64arithmetic\n    ],\n    fp64ify: (0, _fp64Utils.fp64ify),\n    fp64LowPart: (0, _fp64Utils.fp64LowPart),\n    fp64ifyMatrix4: (0, _fp64Utils.fp64ifyMatrix4)\n};\n\n},{\"./fp64-utils\":\"1mB49\",\"./fp64-arithmetic.glsl\":\"cGB3b\",\"./fp64-functions.glsl\":\"dajVL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1mB49\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fp64ify\", ()=>fp64ify);\nparcelHelpers.export(exports, \"fp64LowPart\", ()=>fp64LowPart);\nparcelHelpers.export(exports, \"fp64ifyMatrix4\", ()=>fp64ifyMatrix4);\nfunction fp64ify(a) {\n    var out = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n    var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n    var hiPart = Math.fround(a);\n    var loPart = a - hiPart;\n    out[startIndex] = hiPart;\n    out[startIndex + 1] = loPart;\n    return out;\n}\nfunction fp64LowPart(a) {\n    return a - Math.fround(a);\n}\nfunction fp64ifyMatrix4(matrix) {\n    var matrixFP64 = new Float32Array(32);\n    for(var i = 0; i < 4; ++i)for(var j = 0; j < 4; ++j){\n        var index = i * 4 + j;\n        fp64ify(matrix[j * 4 + i], matrixFP64, index * 2);\n    }\n    return matrixFP64;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cGB3b\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"uniform float ONE;\\nvec2 split(float a) {\\n  const float SPLIT = 4097.0;\\n  float t = a * SPLIT;\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float a_hi = t * ONE - (t - a);\\n  float a_lo = a * ONE - a_hi;\\n#else\\n  float a_hi = t - (t - a);\\n  float a_lo = a - a_hi;\\n#endif\\n  return vec2(a_hi, a_lo);\\n}\\nvec2 split2(vec2 a) {\\n  vec2 b = split(a.x);\\n  b.y += a.y;\\n  return b;\\n}\\nvec2 quickTwoSum(float a, float b) {\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float sum = (a + b) * ONE;\\n  float err = b - (sum - a) * ONE;\\n#else\\n  float sum = a + b;\\n  float err = b - (sum - a);\\n#endif\\n  return vec2(sum, err);\\n}\\nvec2 twoSum(float a, float b) {\\n  float s = (a + b);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float v = (s * ONE - a) * ONE;\\n  float err = (a - (s - v) * ONE) * ONE * ONE * ONE + (b - v);\\n#else\\n  float v = s - a;\\n  float err = (a - (s - v)) + (b - v);\\n#endif\\n  return vec2(s, err);\\n}\\n\\nvec2 twoSub(float a, float b) {\\n  float s = (a - b);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float v = (s * ONE - a) * ONE;\\n  float err = (a - (s - v) * ONE) * ONE * ONE * ONE - (b + v);\\n#else\\n  float v = s - a;\\n  float err = (a - (s - v)) - (b + v);\\n#endif\\n  return vec2(s, err);\\n}\\n\\nvec2 twoSqr(float a) {\\n  float prod = a * a;\\n  vec2 a_fp64 = split(a);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float err = ((a_fp64.x * a_fp64.x - prod) * ONE + 2.0 * a_fp64.x *\\n    a_fp64.y * ONE * ONE) + a_fp64.y * a_fp64.y * ONE * ONE * ONE;\\n#else\\n  float err = ((a_fp64.x * a_fp64.x - prod) + 2.0 * a_fp64.x * a_fp64.y) + a_fp64.y * a_fp64.y;\\n#endif\\n  return vec2(prod, err);\\n}\\n\\nvec2 twoProd(float a, float b) {\\n  float prod = a * b;\\n  vec2 a_fp64 = split(a);\\n  vec2 b_fp64 = split(b);\\n  float err = ((a_fp64.x * b_fp64.x - prod) + a_fp64.x * b_fp64.y +\\n    a_fp64.y * b_fp64.x) + a_fp64.y * b_fp64.y;\\n  return vec2(prod, err);\\n}\\n\\nvec2 sum_fp64(vec2 a, vec2 b) {\\n  vec2 s, t;\\n  s = twoSum(a.x, b.x);\\n  t = twoSum(a.y, b.y);\\n  s.y += t.x;\\n  s = quickTwoSum(s.x, s.y);\\n  s.y += t.y;\\n  s = quickTwoSum(s.x, s.y);\\n  return s;\\n}\\n\\nvec2 sub_fp64(vec2 a, vec2 b) {\\n  vec2 s, t;\\n  s = twoSub(a.x, b.x);\\n  t = twoSub(a.y, b.y);\\n  s.y += t.x;\\n  s = quickTwoSum(s.x, s.y);\\n  s.y += t.y;\\n  s = quickTwoSum(s.x, s.y);\\n  return s;\\n}\\n\\nvec2 mul_fp64(vec2 a, vec2 b) {\\n  vec2 prod = twoProd(a.x, b.x);\\n  prod.y += a.x * b.y;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  prod = split2(prod);\\n#endif\\n  prod = quickTwoSum(prod.x, prod.y);\\n  prod.y += a.y * b.x;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  prod = split2(prod);\\n#endif\\n  prod = quickTwoSum(prod.x, prod.y);\\n  return prod;\\n}\\n\\nvec2 div_fp64(vec2 a, vec2 b) {\\n  float xn = 1.0 / b.x;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  vec2 yn = mul_fp64(a, vec2(xn, 0));\\n#else\\n  vec2 yn = a * xn;\\n#endif\\n  float diff = (sub_fp64(a, mul_fp64(b, yn))).x;\\n  vec2 prod = twoProd(xn, diff);\\n  return sum_fp64(yn, prod);\\n}\\n\\nvec2 sqrt_fp64(vec2 a) {\\n  if (a.x == 0.0 && a.y == 0.0) return vec2(0.0, 0.0);\\n  if (a.x < 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);\\n\\n  float x = 1.0 / sqrt(a.x);\\n  float yn = a.x * x;\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  vec2 yn_sqr = twoSqr(yn) * ONE;\\n#else\\n  vec2 yn_sqr = twoSqr(yn);\\n#endif\\n  float diff = sub_fp64(a, yn_sqr).x;\\n  vec2 prod = twoProd(x * 0.5, diff);\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  return sum_fp64(split(yn), prod);\\n#else\\n  return sum_fp64(vec2(yn, 0.0), prod);\\n#endif\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dajVL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);\\nconst vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);\\nconst vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);\\nconst vec2 TWO_PI_FP64 = vec2(6.2831854820251465, -1.7484556025237907e-7);\\nconst vec2 PI_2_FP64 = vec2(1.5707963705062866, -4.371139006309477e-8);\\nconst vec2 PI_4_FP64 = vec2(0.7853981852531433, -2.1855695031547384e-8);\\nconst vec2 PI_16_FP64 = vec2(0.19634954631328583, -5.463923757886846e-9);\\nconst vec2 PI_16_2_FP64 = vec2(0.39269909262657166, -1.0927847515773692e-8);\\nconst vec2 PI_16_3_FP64 = vec2(0.5890486240386963, -1.4906100798128818e-9);\\nconst vec2 PI_180_FP64 = vec2(0.01745329238474369, 1.3519960498364902e-10);\\n\\nconst vec2 SIN_TABLE_0_FP64 = vec2(0.19509032368659973, -1.6704714833615242e-9);\\nconst vec2 SIN_TABLE_1_FP64 = vec2(0.3826834261417389, 6.22335089017767e-9);\\nconst vec2 SIN_TABLE_2_FP64 = vec2(0.5555702447891235, -1.1769521357507529e-8);\\nconst vec2 SIN_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617041793133e-8);\\n\\nconst vec2 COS_TABLE_0_FP64 = vec2(0.9807852506637573, 2.9739473106360492e-8);\\nconst vec2 COS_TABLE_1_FP64 = vec2(0.9238795042037964, 2.8307490351764386e-8);\\nconst vec2 COS_TABLE_2_FP64 = vec2(0.8314695954322815, 1.6870263741530778e-8);\\nconst vec2 COS_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617152815436e-8);\\n\\nconst vec2 INVERSE_FACTORIAL_3_FP64 = vec2(1.666666716337204e-01, -4.967053879312289e-09);\\nconst vec2 INVERSE_FACTORIAL_4_FP64 = vec2(4.16666679084301e-02, -1.2417634698280722e-09);\\nconst vec2 INVERSE_FACTORIAL_5_FP64 = vec2(8.333333767950535e-03, -4.34617203337595e-10);\\nconst vec2 INVERSE_FACTORIAL_6_FP64 = vec2(1.3888889225199819e-03, -3.3631094437103215e-11);\\nconst vec2 INVERSE_FACTORIAL_7_FP64 = vec2(1.9841270113829523e-04,  -2.725596874933456e-12);\\nconst vec2 INVERSE_FACTORIAL_8_FP64 = vec2(2.4801587642286904e-05, -3.406996025904184e-13);\\nconst vec2 INVERSE_FACTORIAL_9_FP64 = vec2(2.75573188446287533e-06, 3.7935713937038186e-14);\\nconst vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15);\\n\\nfloat nint(float d) {\\n    if (d == floor(d)) return d;\\n    return floor(d + 0.5);\\n}\\n\\nvec2 nint_fp64(vec2 a) {\\n    float hi = nint(a.x);\\n    float lo;\\n    vec2 tmp;\\n    if (hi == a.x) {\\n        lo = nint(a.y);\\n        tmp = quickTwoSum(hi, lo);\\n    } else {\\n        lo = 0.0;\\n        if (abs(hi - a.x) == 0.5 && a.y < 0.0) {\\n            hi -= 1.0;\\n        }\\n        tmp = vec2(hi, lo);\\n    }\\n    return tmp;\\n}\\n\\nvec2 exp_fp64(vec2 a) {\\n\\n  const int k_power = 4;\\n  const float k = 16.0;\\n\\n  const float inv_k = 1.0 / k;\\n\\n  if (a.x <= -88.0) return vec2(0.0, 0.0);\\n  if (a.x >= 88.0) return vec2(1.0 / 0.0, 1.0 / 0.0);\\n  if (a.x == 0.0 && a.y == 0.0) return vec2(1.0, 0.0);\\n  if (a.x == 1.0 && a.y == 0.0) return E_FP64;\\n\\n  float m = floor(a.x / LOG2_FP64.x + 0.5);\\n  vec2 r = sub_fp64(a, mul_fp64(LOG2_FP64, vec2(m, 0.0))) * inv_k;\\n  vec2 s, t, p;\\n\\n  p = mul_fp64(r, r);\\n  s = sum_fp64(r, p * 0.5);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_3_FP64);\\n\\n  s = sum_fp64(s, t);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_4_FP64);\\n\\n  s = sum_fp64(s, t);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);\\n\\n\\n\\n\\n\\n\\n  s = sum_fp64(s, t);\\n  for (int i = 0; i < k_power; i++) {\\n    s = sum_fp64(s * 2.0, mul_fp64(s, s));\\n  }\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n  s = sum_fp64(s, vec2(ONE, 0.0));\\n#else\\n  s = sum_fp64(s, vec2(1.0, 0.0));\\n#endif\\n\\n  return s * pow(2.0, m);\\n}\\n\\nvec2 log_fp64(vec2 a)\\n{\\n  if (a.x == 1.0 && a.y == 0.0) return vec2(0.0, 0.0);\\n  if (a.x <= 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);\\n  vec2 x = vec2(log(a.x), 0.0);\\n  vec2 s;\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n  s = vec2(ONE, 0.0);\\n#else\\n  s = vec2(1.0, 0.0);\\n#endif\\n\\n  x = sub_fp64(sum_fp64(x, mul_fp64(a, exp_fp64(-x))), s);\\n  return x;\\n}\\n\\nvec2 sin_taylor_fp64(vec2 a) {\\n  vec2 r, s, t, x;\\n\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    return vec2(0.0, 0.0);\\n  }\\n\\n  x = -mul_fp64(a, a);\\n  s = a;\\n  r = a;\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_3_FP64);\\n  s = sum_fp64(s, t);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);\\n  s = sum_fp64(s, t);\\n\\n\\n\\n\\n\\n\\n  return s;\\n}\\n\\nvec2 cos_taylor_fp64(vec2 a) {\\n  vec2 r, s, t, x;\\n\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    return vec2(1.0, 0.0);\\n  }\\n\\n  x = -mul_fp64(a, a);\\n  r = x;\\n  s = sum_fp64(vec2(1.0, 0.0), r * 0.5);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_4_FP64);\\n  s = sum_fp64(s, t);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);\\n  s = sum_fp64(s, t);\\n\\n\\n\\n\\n\\n\\n  return s;\\n}\\n\\nvoid sincos_taylor_fp64(vec2 a, out vec2 sin_t, out vec2 cos_t) {\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    sin_t = vec2(0.0, 0.0);\\n    cos_t = vec2(1.0, 0.0);\\n  }\\n\\n  sin_t = sin_taylor_fp64(a);\\n  cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));\\n}\\n\\nvec2 sin_fp64(vec2 a) {\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(0.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n\\n    if (k == 0) {\\n        if (j == 0) {\\n            return sin_taylor_fp64(t);\\n        } else if (j == 1) {\\n            return cos_taylor_fp64(t);\\n        } else if (j == -1) {\\n            return -cos_taylor_fp64(t);\\n        } else {\\n            return -sin_taylor_fp64(t);\\n        }\\n    }\\n\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n    if (abs(float(abs_k) - 1.0) < 0.5) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#else\\n    if (abs_k == 1) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs_k == 2) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs_k == 3) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs_k == 4) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#endif\\n\\n    vec2 sin_t, cos_t;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n\\n\\n    vec2 result = vec2(0.0, 0.0);\\n    if (j == 0) {\\n        if (k > 0) {\\n            result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        }\\n    } else if (j == 1) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    } else if (j == -1) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        } else {\\n            result = -sum_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        }\\n    } else {\\n        if (k > 0) {\\n            result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));\\n        }\\n    }\\n\\n    return result;\\n}\\n\\nvec2 cos_fp64(vec2 a) {\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(1.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n\\n    if (k == 0) {\\n        if (j == 0) {\\n            return cos_taylor_fp64(t);\\n        } else if (j == 1) {\\n            return -sin_taylor_fp64(t);\\n        } else if (j == -1) {\\n            return sin_taylor_fp64(t);\\n        } else {\\n            return -cos_taylor_fp64(t);\\n        }\\n    }\\n\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n    if (abs(float(abs_k) - 1.0) < 0.5) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#else\\n    if (abs_k == 1) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs_k == 2) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs_k == 3) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs_k == 4) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#endif\\n\\n    vec2 sin_t, cos_t;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n    vec2 result = vec2(0.0, 0.0);\\n    if (j == 0) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    } else if (j == 1) {\\n        if (k > 0) {\\n            result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));\\n        }\\n    } else if (j == -1) {\\n        if (k > 0) {\\n            result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        }\\n    } else {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        } else {\\n            result = -sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    }\\n\\n    return result;\\n}\\n\\nvec2 tan_fp64(vec2 a) {\\n    vec2 sin_a;\\n    vec2 cos_a;\\n\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(0.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n    vec2 sin_t, cos_t;\\n    vec2 s, c;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n    if (k == 0) {\\n        s = sin_t;\\n        c = cos_t;\\n    } else {\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n        if (abs(float(abs_k) - 1.0) < 0.5) {\\n            u = COS_TABLE_0_FP64;\\n            v = SIN_TABLE_0_FP64;\\n        } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n            u = COS_TABLE_1_FP64;\\n            v = SIN_TABLE_1_FP64;\\n        } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n            u = COS_TABLE_2_FP64;\\n            v = SIN_TABLE_2_FP64;\\n        } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n            u = COS_TABLE_3_FP64;\\n            v = SIN_TABLE_3_FP64;\\n        }\\n#else\\n        if (abs_k == 1) {\\n            u = COS_TABLE_0_FP64;\\n            v = SIN_TABLE_0_FP64;\\n        } else if (abs_k == 2) {\\n            u = COS_TABLE_1_FP64;\\n            v = SIN_TABLE_1_FP64;\\n        } else if (abs_k == 3) {\\n            u = COS_TABLE_2_FP64;\\n            v = SIN_TABLE_2_FP64;\\n        } else if (abs_k == 4) {\\n            u = COS_TABLE_3_FP64;\\n            v = SIN_TABLE_3_FP64;\\n        }\\n#endif\\n        if (k > 0) {\\n            s = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n            c = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            s = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n            c = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    }\\n\\n    if (j == 0) {\\n        sin_a = s;\\n        cos_a = c;\\n    } else if (j == 1) {\\n        sin_a = c;\\n        cos_a = -s;\\n    } else if (j == -1) {\\n        sin_a = -c;\\n        cos_a = s;\\n    } else {\\n        sin_a = -s;\\n        cos_a = -c;\\n    }\\n    return div_fp64(sin_a, cos_a);\\n}\\n\\nvec2 radians_fp64(vec2 degree) {\\n  return mul_fp64(degree, PI_180_FP64);\\n}\\n\\nvec2 mix_fp64(vec2 a, vec2 b, float x) {\\n  vec2 range = sub_fp64(b, a);\\n  return sum_fp64(a, mul_fp64(range, vec2(x, 0.0)));\\n}\\n\\nvoid vec2_sum_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = sum_fp64(a[0], b[0]);\\n    out_val[1] = sum_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_sub_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = sub_fp64(a[0], b[0]);\\n    out_val[1] = sub_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_mul_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = mul_fp64(a[0], b[0]);\\n    out_val[1] = mul_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_div_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = div_fp64(a[0], b[0]);\\n    out_val[1] = div_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_mix_fp64(vec2 x[2], vec2 y[2], float a, out vec2 out_val[2]) {\\n  vec2 range[2];\\n  vec2_sub_fp64(y, x, range);\\n  vec2 portion[2];\\n  portion[0] = range[0] * a;\\n  portion[1] = range[1] * a;\\n  vec2_sum_fp64(x, portion, out_val);\\n}\\n\\nvec2 vec2_length_fp64(vec2 x[2]) {\\n  return sqrt_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])));\\n}\\n\\nvoid vec2_normalize_fp64(vec2 x[2], out vec2 out_val[2]) {\\n  vec2 length = vec2_length_fp64(x);\\n  vec2 length_vec2[2];\\n  length_vec2[0] = length;\\n  length_vec2[1] = length;\\n\\n  vec2_div_fp64(x, length_vec2, out_val);\\n}\\n\\nvec2 vec2_distance_fp64(vec2 x[2], vec2 y[2]) {\\n  vec2 diff[2];\\n  vec2_sub_fp64(x, y, diff);\\n  return vec2_length_fp64(diff);\\n}\\n\\nvec2 vec2_dot_fp64(vec2 a[2], vec2 b[2]) {\\n  vec2 v[2];\\n\\n  v[0] = mul_fp64(a[0], b[0]);\\n  v[1] = mul_fp64(a[1], b[1]);\\n\\n  return sum_fp64(v[0], v[1]);\\n}\\nvoid vec3_sub_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {\\n  for (int i = 0; i < 3; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvoid vec3_sum_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {\\n  for (int i = 0; i < 3; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvec2 vec3_length_fp64(vec2 x[3]) {\\n  return sqrt_fp64(sum_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])),\\n    mul_fp64(x[2], x[2])));\\n}\\n\\nvec2 vec3_distance_fp64(vec2 x[3], vec2 y[3]) {\\n  vec2 diff[3];\\n  vec3_sub_fp64(x, y, diff);\\n  return vec3_length_fp64(diff);\\n}\\nvoid vec4_fp64(vec4 a, out vec2 out_val[4]) {\\n  out_val[0].x = a[0];\\n  out_val[0].y = 0.0;\\n\\n  out_val[1].x = a[1];\\n  out_val[1].y = 0.0;\\n\\n  out_val[2].x = a[2];\\n  out_val[2].y = 0.0;\\n\\n  out_val[3].x = a[3];\\n  out_val[3].y = 0.0;\\n}\\n\\nvoid vec4_scalar_mul_fp64(vec2 a[4], vec2 b, out vec2 out_val[4]) {\\n  out_val[0] = mul_fp64(a[0], b);\\n  out_val[1] = mul_fp64(a[1], b);\\n  out_val[2] = mul_fp64(a[2], b);\\n  out_val[3] = mul_fp64(a[3], b);\\n}\\n\\nvoid vec4_sum_fp64(vec2 a[4], vec2 b[4], out vec2 out_val[4]) {\\n  for (int i = 0; i < 4; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvoid vec4_dot_fp64(vec2 a[4], vec2 b[4], out vec2 out_val) {\\n  vec2 v[4];\\n\\n  v[0] = mul_fp64(a[0], b[0]);\\n  v[1] = mul_fp64(a[1], b[1]);\\n  v[2] = mul_fp64(a[2], b[2]);\\n  v[3] = mul_fp64(a[3], b[3]);\\n\\n  out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));\\n}\\n\\nvoid mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {\\n  vec2 tmp[4];\\n\\n  for (int i = 0; i < 4; i++)\\n  {\\n    for (int j = 0; j < 4; j++)\\n    {\\n      tmp[j] = b[j + i * 4];\\n    }\\n    vec4_dot_fp64(a, tmp, out_val[i]);\\n  }\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"atHzB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathGl = require(\"math.gl\");\nvar IDENTITY_MATRIX = [\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1\n];\nvar DEFAULT_MODULE_OPTIONS = {\n    modelMatrix: IDENTITY_MATRIX,\n    viewMatrix: IDENTITY_MATRIX,\n    projectionMatrix: IDENTITY_MATRIX,\n    cameraPositionWorld: [\n        0,\n        0,\n        0\n    ]\n};\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n    var prevUniforms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var uniforms = {};\n    if (opts.modelMatrix !== undefined) uniforms.modelMatrix = opts.modelMatrix;\n    if (opts.viewMatrix !== undefined) uniforms.viewMatrix = opts.viewMatrix;\n    if (opts.projectionMatrix !== undefined) uniforms.projectionMatrix = opts.projectionMatrix;\n    if (opts.cameraPositionWorld !== undefined) uniforms.cameraPositionWorld = opts.cameraPositionWorld;\n    if (opts.projectionMatrix !== undefined || opts.viewMatrix !== undefined) uniforms.viewProjectionMatrix = new (0, _mathGl.Matrix4)(opts.projectionMatrix).multiplyRight(opts.viewMatrix);\n    return uniforms;\n}\nvar common = \"varying vec4 project_vPositionWorld;\\nvarying vec3 project_vNormalWorld;\\n\\nvec4 project_getPosition_World() {\\n  return project_vPositionWorld;\\n}\\n\\nvec3 project_getNormal_World() {\\n  return project_vNormalWorld;\\n}\\n\";\nvar vs = \"\".concat(common, \"\\nuniform mat4 modelMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewProjectionMatrix;\\nuniform vec3 cameraPositionWorld;\\n\\nstruct World {\\n  vec3 position;\\n  vec3 normal;\\n};\\n\\nWorld world;\\n\\nvoid project_setPosition(vec4 position) {\\n  project_vPositionWorld = position;\\n}\\n\\nvoid project_setNormal(vec3 normal) {\\n  project_vNormalWorld = normal;\\n}\\n\\nvoid project_setPositionAndNormal_World(vec3 position, vec3 normal) {\\n  world.position = position;\\n  world.normal = normal;\\n}\\n\\nvoid project_setPositionAndNormal_Model(vec3 position, vec3 normal) {\\n  world.position = (modelMatrix * vec4(position, 1.)).xyz;\\n  world.normal = mat3(modelMatrix) * normal;\\n}\\n\\nvec4 project_model_to_clipspace(vec4 position) {\\n  return viewProjectionMatrix * modelMatrix * position;\\n}\\n\\nvec4 project_model_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * modelMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_world_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_view_to_clipspace(vec3 position) {\\n  return projectionMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * vec4(position, 1.);\\n}\\n\");\nvar fs = \"\\n\".concat(common);\nexports.default = {\n    name: \"project\",\n    getUniforms: getUniforms,\n    vs: vs,\n    fs: fs\n};\n\n},{\"math.gl\":\"huJnq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"huJnq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _core = require(\"@math.gl/core\");\nparcelHelpers.exportAll(_core, exports);\n\n},{\"@math.gl/core\":\"2J9Y1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2J9Y1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Vector2\", ()=>(0, _vector2Default.default));\nparcelHelpers.export(exports, \"Vector3\", ()=>(0, _vector3Default.default));\nparcelHelpers.export(exports, \"Vector4\", ()=>(0, _vector4Default.default));\nparcelHelpers.export(exports, \"Matrix3\", ()=>(0, _matrix3Default.default));\nparcelHelpers.export(exports, \"Matrix4\", ()=>(0, _matrix4Default.default));\nparcelHelpers.export(exports, \"Quaternion\", ()=>(0, _quaternionDefault.default));\nparcelHelpers.export(exports, \"SphericalCoordinates\", ()=>(0, _sphericalCoordinatesDefault.default));\nparcelHelpers.export(exports, \"Pose\", ()=>(0, _poseDefault.default));\nparcelHelpers.export(exports, \"Euler\", ()=>(0, _eulerDefault.default));\nparcelHelpers.export(exports, \"_MathUtils\", ()=>(0, _mathUtilsDefault.default));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nparcelHelpers.export(exports, \"config\", ()=>(0, _common.config));\nparcelHelpers.export(exports, \"configure\", ()=>(0, _common.configure));\nparcelHelpers.export(exports, \"formatValue\", ()=>(0, _common.formatValue));\nparcelHelpers.export(exports, \"isArray\", ()=>(0, _common.isArray));\nparcelHelpers.export(exports, \"clone\", ()=>(0, _common.clone));\nparcelHelpers.export(exports, \"equals\", ()=>(0, _common.equals));\nparcelHelpers.export(exports, \"exactEquals\", ()=>(0, _common.exactEquals));\nparcelHelpers.export(exports, \"toRadians\", ()=>(0, _common.toRadians));\nparcelHelpers.export(exports, \"toDegrees\", ()=>(0, _common.toDegrees));\nparcelHelpers.export(exports, \"radians\", ()=>(0, _common.radians));\nparcelHelpers.export(exports, \"degrees\", ()=>(0, _common.degrees));\nparcelHelpers.export(exports, \"sin\", ()=>(0, _common.sin));\nparcelHelpers.export(exports, \"cos\", ()=>(0, _common.cos));\nparcelHelpers.export(exports, \"tan\", ()=>(0, _common.tan));\nparcelHelpers.export(exports, \"asin\", ()=>(0, _common.asin));\nparcelHelpers.export(exports, \"acos\", ()=>(0, _common.acos));\nparcelHelpers.export(exports, \"atan\", ()=>(0, _common.atan));\nparcelHelpers.export(exports, \"clamp\", ()=>(0, _common.clamp));\nparcelHelpers.export(exports, \"lerp\", ()=>(0, _common.lerp));\nparcelHelpers.export(exports, \"withEpsilon\", ()=>(0, _common.withEpsilon));\nparcelHelpers.export(exports, \"_SphericalCoordinates\", ()=>(0, _sphericalCoordinatesDefault.default));\nparcelHelpers.export(exports, \"_Pose\", ()=>(0, _poseDefault.default));\nparcelHelpers.export(exports, \"_Euler\", ()=>(0, _eulerDefault.default));\nvar _vector2 = require(\"./classes/vector2\");\nvar _vector2Default = parcelHelpers.interopDefault(_vector2);\nvar _vector3 = require(\"./classes/vector3\");\nvar _vector3Default = parcelHelpers.interopDefault(_vector3);\nvar _vector4 = require(\"./classes/vector4\");\nvar _vector4Default = parcelHelpers.interopDefault(_vector4);\nvar _matrix3 = require(\"./classes/matrix3\");\nvar _matrix3Default = parcelHelpers.interopDefault(_matrix3);\nvar _matrix4 = require(\"./classes/matrix4\");\nvar _matrix4Default = parcelHelpers.interopDefault(_matrix4);\nvar _quaternion = require(\"./classes/quaternion\");\nvar _quaternionDefault = parcelHelpers.interopDefault(_quaternion);\nvar _sphericalCoordinates = require(\"./classes/spherical-coordinates\");\nvar _sphericalCoordinatesDefault = parcelHelpers.interopDefault(_sphericalCoordinates);\nvar _pose = require(\"./classes/pose\");\nvar _poseDefault = parcelHelpers.interopDefault(_pose);\nvar _euler = require(\"./classes/euler\");\nvar _eulerDefault = parcelHelpers.interopDefault(_euler);\nvar _mathUtils = require(\"./lib/math-utils\");\nvar _mathUtilsDefault = parcelHelpers.interopDefault(_mathUtils);\nvar _assert = require(\"./lib/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _common = require(\"./lib/common\");\n\n},{\"./classes/vector2\":\"9jYr3\",\"./classes/vector3\":\"2rssO\",\"./classes/vector4\":\"aGglC\",\"./classes/matrix3\":\"gC4YG\",\"./classes/matrix4\":\"lSk58\",\"./classes/quaternion\":\"aqPwo\",\"./classes/spherical-coordinates\":\"8neBt\",\"./classes/pose\":\"36V36\",\"./classes/euler\":\"52LUF\",\"./lib/math-utils\":\"5W7In\",\"./lib/assert\":\"7JJdF\",\"./lib/common\":\"4ZtWf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9jYr3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _vector = require(\"./base/vector\");\nvar _vectorDefault = parcelHelpers.interopDefault(_vector);\nvar _common = require(\"../lib/common\");\nvar _validators = require(\"../lib/validators\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nclass Vector2 extends (0, _vectorDefault.default) {\n    constructor(x = 0, y = 0){\n        super(2);\n        if ((0, _common.isArray)(x) && arguments.length === 1) this.copy(x);\n        else {\n            if ((0, _common.config).debug) {\n                (0, _validators.checkNumber)(x);\n                (0, _validators.checkNumber)(y);\n            }\n            this[0] = x;\n            this[1] = y;\n        }\n    }\n    set(x, y) {\n        this[0] = x;\n        this[1] = y;\n        return this.check();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        return this.check();\n    }\n    fromObject(object) {\n        if ((0, _common.config).debug) {\n            (0, _validators.checkNumber)(object.x);\n            (0, _validators.checkNumber)(object.y);\n        }\n        this[0] = object.x;\n        this[1] = object.y;\n        return this.check();\n    }\n    toObject(object) {\n        object.x = this[0];\n        object.y = this[1];\n        return object;\n    }\n    get ELEMENTS() {\n        return 2;\n    }\n    horizontalAngle() {\n        return Math.atan2(this.y, this.x);\n    }\n    verticalAngle() {\n        return Math.atan2(this.x, this.y);\n    }\n    transform(matrix4) {\n        return this.transformAsPoint(matrix4);\n    }\n    transformAsPoint(matrix4) {\n        _vec2.transformMat4(this, this, matrix4);\n        return this.check();\n    }\n    transformAsVector(matrix4) {\n        (0, _glMatrixExtras.vec2_transformMat4AsVector)(this, this, matrix4);\n        return this.check();\n    }\n    transformByMatrix3(matrix3) {\n        _vec2.transformMat3(this, this, matrix3);\n        return this.check();\n    }\n    transformByMatrix2x3(matrix2x3) {\n        _vec2.transformMat2d(this, this, matrix2x3);\n        return this.check();\n    }\n    transformByMatrix2(matrix2) {\n        _vec2.transformMat2(this, this, matrix2);\n        return this.check();\n    }\n}\nexports.default = Vector2;\n\n},{\"./base/vector\":\"c7W6l\",\"../lib/common\":\"4ZtWf\",\"../lib/validators\":\"d22Rk\",\"gl-matrix/vec2\":\"29QfU\",\"../lib/gl-matrix-extras\":\"cONlx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c7W6l\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathArray = require(\"./math-array\");\nvar _mathArrayDefault = parcelHelpers.interopDefault(_mathArray);\nvar _validators = require(\"../../lib/validators\");\nvar _assert = require(\"../../lib/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nclass Vector extends (0, _mathArrayDefault.default) {\n    get x() {\n        return this[0];\n    }\n    set x(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get y() {\n        return this[1];\n    }\n    set y(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    len() {\n        return Math.sqrt(this.lengthSquared());\n    }\n    magnitude() {\n        return this.len();\n    }\n    lengthSquared() {\n        let length = 0;\n        for(let i = 0; i < this.ELEMENTS; ++i)length += this[i] * this[i];\n        return length;\n    }\n    magnitudeSquared() {\n        return this.lengthSquared();\n    }\n    distance(mathArray) {\n        return Math.sqrt(this.distanceSquared(mathArray));\n    }\n    distanceSquared(mathArray) {\n        let length = 0;\n        for(let i = 0; i < this.ELEMENTS; ++i){\n            const dist = this[i] - mathArray[i];\n            length += dist * dist;\n        }\n        return (0, _validators.checkNumber)(length);\n    }\n    dot(mathArray) {\n        let product = 0;\n        for(let i = 0; i < this.ELEMENTS; ++i)product += this[i] * mathArray[i];\n        return (0, _validators.checkNumber)(product);\n    }\n    normalize() {\n        const length = this.magnitude();\n        if (length !== 0) for(let i = 0; i < this.ELEMENTS; ++i)this[i] /= length;\n        return this.check();\n    }\n    multiply(...vectors) {\n        for (const vector of vectors)for(let i = 0; i < this.ELEMENTS; ++i)this[i] *= vector[i];\n        return this.check();\n    }\n    divide(...vectors) {\n        for (const vector of vectors)for(let i = 0; i < this.ELEMENTS; ++i)this[i] /= vector[i];\n        return this.check();\n    }\n    lengthSq() {\n        return this.lengthSquared();\n    }\n    distanceTo(vector) {\n        return this.distance(vector);\n    }\n    distanceToSquared(vector) {\n        return this.distanceSquared(vector);\n    }\n    getComponent(i) {\n        (0, _assertDefault.default)(i >= 0 && i < this.ELEMENTS, \"index is out of range\");\n        return (0, _validators.checkNumber)(this[i]);\n    }\n    setComponent(i, value) {\n        (0, _assertDefault.default)(i >= 0 && i < this.ELEMENTS, \"index is out of range\");\n        this[i] = value;\n        return this.check();\n    }\n    addVectors(a, b) {\n        return this.copy(a).add(b);\n    }\n    subVectors(a, b) {\n        return this.copy(a).subtract(b);\n    }\n    multiplyVectors(a, b) {\n        return this.copy(a).multiply(b);\n    }\n    addScaledVector(a, b) {\n        return this.add(new this.constructor(a).multiplyScalar(b));\n    }\n}\nexports.default = Vector;\n\n},{\"./math-array\":\"egSnj\",\"../../lib/validators\":\"d22Rk\",\"../../lib/assert\":\"7JJdF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"egSnj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _common = require(\"../../lib/common\");\nfunction _extendableBuiltin(cls) {\n    function ExtendableBuiltin() {\n        var instance = Reflect.construct(cls, Array.from(arguments));\n        Object.setPrototypeOf(instance, Object.getPrototypeOf(this));\n        return instance;\n    }\n    ExtendableBuiltin.prototype = Object.create(cls.prototype, {\n        constructor: {\n            value: cls,\n            enumerable: false,\n            writable: true,\n            configurable: true\n        }\n    });\n    if (Object.setPrototypeOf) Object.setPrototypeOf(ExtendableBuiltin, cls);\n    else ExtendableBuiltin.__proto__ = cls;\n    return ExtendableBuiltin;\n}\nclass MathArray extends _extendableBuiltin(Array) {\n    clone() {\n        return new this.constructor().copy(this);\n    }\n    fromArray(array, offset = 0) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = array[i + offset];\n        return this.check();\n    }\n    toArray(targetArray = [], offset = 0) {\n        for(let i = 0; i < this.ELEMENTS; ++i)targetArray[offset + i] = this[i];\n        return targetArray;\n    }\n    from(arrayOrObject) {\n        return Array.isArray(arrayOrObject) ? this.copy(arrayOrObject) : this.fromObject(arrayOrObject);\n    }\n    to(arrayOrObject) {\n        if (arrayOrObject === this) return this;\n        return (0, _common.isArray)(arrayOrObject) ? this.toArray(arrayOrObject) : this.toObject(arrayOrObject);\n    }\n    toTarget(target) {\n        return target ? this.to(target) : this;\n    }\n    toFloat32Array() {\n        return new Float32Array(this);\n    }\n    toString() {\n        return this.formatString((0, _common.config));\n    }\n    formatString(opts) {\n        let string = \"\";\n        for(let i = 0; i < this.ELEMENTS; ++i)string += (i > 0 ? \", \" : \"\") + (0, _common.formatValue)(this[i], opts);\n        return \"\".concat(opts.printTypes ? this.constructor.name : \"\", \"[\").concat(string, \"]\");\n    }\n    equals(array) {\n        if (!array || this.length !== array.length) return false;\n        for(let i = 0; i < this.ELEMENTS; ++i){\n            if (!(0, _common.equals)(this[i], array[i])) return false;\n        }\n        return true;\n    }\n    exactEquals(array) {\n        if (!array || this.length !== array.length) return false;\n        for(let i = 0; i < this.ELEMENTS; ++i){\n            if (this[i] !== array[i]) return false;\n        }\n        return true;\n    }\n    negate() {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = -this[i];\n        return this.check();\n    }\n    lerp(a, b, t) {\n        if (t === undefined) return this.lerp(this, a, b);\n        for(let i = 0; i < this.ELEMENTS; ++i){\n            const ai = a[i];\n            this[i] = ai + t * (b[i] - ai);\n        }\n        return this.check();\n    }\n    min(vector) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = Math.min(vector[i], this[i]);\n        return this.check();\n    }\n    max(vector) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = Math.max(vector[i], this[i]);\n        return this.check();\n    }\n    clamp(minVector, maxVector) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = Math.min(Math.max(this[i], minVector[i]), maxVector[i]);\n        return this.check();\n    }\n    add(...vectors) {\n        for (const vector of vectors)for(let i = 0; i < this.ELEMENTS; ++i)this[i] += vector[i];\n        return this.check();\n    }\n    subtract(...vectors) {\n        for (const vector of vectors)for(let i = 0; i < this.ELEMENTS; ++i)this[i] -= vector[i];\n        return this.check();\n    }\n    scale(scale) {\n        if (typeof scale === \"number\") for(let i = 0; i < this.ELEMENTS; ++i)this[i] *= scale;\n        else for(let i1 = 0; i1 < this.ELEMENTS && i1 < scale.length; ++i1)this[i1] *= scale[i1];\n        return this.check();\n    }\n    multiplyByScalar(scalar) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] *= scalar;\n        return this.check();\n    }\n    check() {\n        if ((0, _common.config).debug && !this.validate()) throw new Error(\"math.gl: \".concat(this.constructor.name, \" some fields set to invalid numbers'\"));\n        return this;\n    }\n    validate() {\n        let valid = this.length === this.ELEMENTS;\n        for(let i = 0; i < this.ELEMENTS; ++i)valid = valid && Number.isFinite(this[i]);\n        return valid;\n    }\n    sub(a) {\n        return this.subtract(a);\n    }\n    setScalar(a) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = a;\n        return this.check();\n    }\n    addScalar(a) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] += a;\n        return this.check();\n    }\n    subScalar(a) {\n        return this.addScalar(-a);\n    }\n    multiplyScalar(scalar) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] *= scalar;\n        return this.check();\n    }\n    divideScalar(a) {\n        return this.multiplyByScalar(1 / a);\n    }\n    clampScalar(min, max) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = Math.min(Math.max(this[i], min), max);\n        return this.check();\n    }\n    get elements() {\n        return this;\n    }\n}\nexports.default = MathArray;\n\n},{\"../../lib/common\":\"4ZtWf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4ZtWf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"config\", ()=>config);\nparcelHelpers.export(exports, \"configure\", ()=>configure);\nparcelHelpers.export(exports, \"formatValue\", ()=>formatValue);\nparcelHelpers.export(exports, \"isArray\", ()=>isArray);\nparcelHelpers.export(exports, \"clone\", ()=>clone);\nparcelHelpers.export(exports, \"toRadians\", ()=>toRadians);\nparcelHelpers.export(exports, \"toDegrees\", ()=>toDegrees);\nparcelHelpers.export(exports, \"radians\", ()=>radians);\nparcelHelpers.export(exports, \"degrees\", ()=>degrees);\nparcelHelpers.export(exports, \"sin\", ()=>sin);\nparcelHelpers.export(exports, \"cos\", ()=>cos);\nparcelHelpers.export(exports, \"tan\", ()=>tan);\nparcelHelpers.export(exports, \"asin\", ()=>asin);\nparcelHelpers.export(exports, \"acos\", ()=>acos);\nparcelHelpers.export(exports, \"atan\", ()=>atan);\nparcelHelpers.export(exports, \"clamp\", ()=>clamp);\nparcelHelpers.export(exports, \"lerp\", ()=>lerp);\nparcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\nparcelHelpers.export(exports, \"withEpsilon\", ()=>withEpsilon);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nconst RADIANS_TO_DEGREES = 1 / Math.PI * 180;\nconst DEGREES_TO_RADIANS = 1 / 180 * Math.PI;\nconst config = {\n    EPSILON: 1e-12,\n    debug: false,\n    precision: 4,\n    printTypes: false,\n    printDegrees: false,\n    printRowMajor: true\n};\nfunction configure(options) {\n    for(const key in options){\n        (0, _assertDefault.default)(key in config);\n        config[key] = options[key];\n    }\n    return config;\n}\nfunction formatValue(value, { precision =config.precision  } = {}) {\n    value = round(value);\n    return \"\".concat(parseFloat(value.toPrecision(precision)));\n}\nfunction isArray(value) {\n    return Array.isArray(value) || ArrayBuffer.isView(value) && !(value instanceof DataView);\n}\nfunction clone(array) {\n    return \"clone\" in array ? array.clone() : array.slice();\n}\nfunction toRadians(degrees1) {\n    return radians(degrees1);\n}\nfunction toDegrees(radians1) {\n    return degrees(radians1);\n}\nfunction radians(degrees2, result) {\n    return map(degrees2, (degrees3)=>degrees3 * DEGREES_TO_RADIANS, result);\n}\nfunction degrees(radians2, result) {\n    return map(radians2, (radians3)=>radians3 * RADIANS_TO_DEGREES, result);\n}\nfunction sin(radians4, result) {\n    return map(radians4, (angle)=>Math.sin(angle), result);\n}\nfunction cos(radians5, result) {\n    return map(radians5, (angle)=>Math.cos(angle), result);\n}\nfunction tan(radians6, result) {\n    return map(radians6, (angle)=>Math.tan(angle), result);\n}\nfunction asin(radians7, result) {\n    return map(radians7, (angle)=>Math.asin(angle), result);\n}\nfunction acos(radians8, result) {\n    return map(radians8, (angle)=>Math.acos(angle), result);\n}\nfunction atan(radians9, result) {\n    return map(radians9, (angle)=>Math.atan(angle), result);\n}\nfunction clamp(value1, min, max) {\n    return map(value1, (value)=>Math.max(min, Math.min(max, value)));\n}\nfunction lerp(a, b, t) {\n    if (isArray(a)) return a.map((ai, i)=>lerp(ai, b[i], t));\n    return t * b + (1 - t) * a;\n}\nfunction equals(a, b, epsilon) {\n    const oldEpsilon = config.EPSILON;\n    if (epsilon) config.EPSILON = epsilon;\n    try {\n        if (a === b) return true;\n        if (isArray(a) && isArray(b)) {\n            if (a.length !== b.length) return false;\n            for(let i = 0; i < a.length; ++i){\n                if (!equals(a[i], b[i])) return false;\n            }\n            return true;\n        }\n        if (a && a.equals) return a.equals(b);\n        if (b && b.equals) return b.equals(a);\n        if (typeof a === \"number\" && typeof b === \"number\") return Math.abs(a - b) <= config.EPSILON * Math.max(1, Math.abs(a), Math.abs(b));\n        return false;\n    } finally{\n        config.EPSILON = oldEpsilon;\n    }\n}\nfunction exactEquals(a, b) {\n    if (a === b) return true;\n    if (a && typeof a === \"object\" && b && typeof b === \"object\") {\n        if (a.constructor !== b.constructor) return false;\n        if (a.exactEquals) return a.exactEquals(b);\n    }\n    if (isArray(a) && isArray(b)) {\n        if (a.length !== b.length) return false;\n        for(let i = 0; i < a.length; ++i){\n            if (!exactEquals(a[i], b[i])) return false;\n        }\n        return true;\n    }\n    return false;\n}\nfunction withEpsilon(epsilon, func) {\n    const oldPrecision = config.EPSILON;\n    config.EPSILON = epsilon;\n    let value;\n    try {\n        value = func();\n    } finally{\n        config.EPSILON = oldPrecision;\n    }\n    return value;\n}\nfunction round(value) {\n    return Math.round(value / config.EPSILON) * config.EPSILON;\n}\nfunction duplicateArray(array) {\n    return array.clone ? array.clone() : new Array(array.length);\n}\nfunction map(value, func, result) {\n    if (isArray(value)) {\n        const array = value;\n        result = result || duplicateArray(array);\n        for(let i = 0; i < result.length && i < array.length; ++i)result[i] = func(value[i], i, result);\n        return result;\n    }\n    return func(value);\n}\n\n},{\"./assert\":\"7JJdF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7JJdF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(\"math.gl assertion \".concat(message));\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d22Rk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"validateVector\", ()=>validateVector);\nparcelHelpers.export(exports, \"checkNumber\", ()=>checkNumber);\nparcelHelpers.export(exports, \"checkVector\", ()=>checkVector);\nparcelHelpers.export(exports, \"deprecated\", ()=>deprecated);\nvar _common = require(\"./common\");\nfunction validateVector(v, length) {\n    if (v.length !== length) return false;\n    for(let i = 0; i < v.length; ++i){\n        if (!Number.isFinite(v[i])) return false;\n    }\n    return true;\n}\nfunction checkNumber(value) {\n    if (!Number.isFinite(value)) throw new Error(\"Invalid number \".concat(value));\n    return value;\n}\nfunction checkVector(v, length, callerName = \"\") {\n    if ((0, _common.config).debug && !validateVector(v, length)) throw new Error(\"math.gl: \".concat(callerName, \" some fields set to invalid numbers'\"));\n    return v;\n}\nconst map = {};\nfunction deprecated(method, version) {\n    if (!map[method]) {\n        map[method] = true;\n        console.warn(\"\".concat(method, \" has been removed in version \").concat(version, \", see upgrade guide for more information\"));\n    }\n}\n\n},{\"./common\":\"4ZtWf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"29QfU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 2 Dimensional Vector\n * @module vec2\n */ /**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"divide\", ()=>divide);\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"ceil\", ()=>ceil);\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"floor\", ()=>floor);\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"min\", ()=>min);\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"max\", ()=>max);\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"round\", ()=>round);\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"scaleAndAdd\", ()=>scaleAndAdd);\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */ parcelHelpers.export(exports, \"distance\", ()=>distance);\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */ parcelHelpers.export(exports, \"squaredDistance\", ()=>squaredDistance);\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */ parcelHelpers.export(exports, \"length\", ()=>length);\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */ parcelHelpers.export(exports, \"squaredLength\", ()=>squaredLength);\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"negate\", ()=>negate);\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"inverse\", ()=>inverse);\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"normalize\", ()=>normalize);\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */ parcelHelpers.export(exports, \"dot\", ()=>dot);\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"cross\", ()=>cross);\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"lerp\", ()=>lerp);\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"random\", ()=>random);\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"transformMat2\", ()=>transformMat2);\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"transformMat2d\", ()=>transformMat2d);\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"transformMat3\", ()=>transformMat3);\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"transformMat4\", ()=>transformMat4);\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"rotate\", ()=>rotate);\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */ parcelHelpers.export(exports, \"angle\", ()=>angle);\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"zero\", ()=>zero);\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"len\", ()=>len);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"div\", ()=>div);\nparcelHelpers.export(exports, \"dist\", ()=>dist);\nparcelHelpers.export(exports, \"sqrDist\", ()=>sqrDist);\nparcelHelpers.export(exports, \"sqrLen\", ()=>sqrLen);\nparcelHelpers.export(exports, \"forEach\", ()=>forEach);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(2);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n    }\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(2);\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n}\nfunction fromValues(x, y) {\n    var out = new _commonJs.ARRAY_TYPE(2);\n    out[0] = x;\n    out[1] = y;\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n}\nfunction set(out, x, y) {\n    out[0] = x;\n    out[1] = y;\n    return out;\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    return out;\n}\nfunction multiply(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    return out;\n}\nfunction divide(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    return out;\n}\nfunction ceil(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    return out;\n}\nfunction floor(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    return out;\n}\nfunction min(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    return out;\n}\nfunction max(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    return out;\n}\nfunction round(out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    return out;\n}\nfunction scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    return out;\n}\nfunction scaleAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    return out;\n}\nfunction distance(a, b) {\n    var x = b[0] - a[0], y = b[1] - a[1];\n    return Math.hypot(x, y);\n}\nfunction squaredDistance(a, b) {\n    var x = b[0] - a[0], y = b[1] - a[1];\n    return x * x + y * y;\n}\nfunction length(a) {\n    var x = a[0], y = a[1];\n    return Math.hypot(x, y);\n}\nfunction squaredLength(a) {\n    var x = a[0], y = a[1];\n    return x * x + y * y;\n}\nfunction negate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    return out;\n}\nfunction inverse(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    return out;\n}\nfunction normalize(out, a) {\n    var x = a[0], y = a[1];\n    var len1 = x * x + y * y;\n    if (len1 > 0) //TODO: evaluate use of glm_invsqrt here?\n    len1 = 1 / Math.sqrt(len1);\n    out[0] = a[0] * len1;\n    out[1] = a[1] * len1;\n    return out;\n}\nfunction dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n}\nfunction cross(out, a, b) {\n    var z = a[0] * b[1] - a[1] * b[0];\n    out[0] = out[1] = 0;\n    out[2] = z;\n    return out;\n}\nfunction lerp(out, a, b, t) {\n    var ax = a[0], ay = a[1];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    return out;\n}\nfunction random(out, scale2) {\n    scale2 = scale2 || 1.0;\n    var r = _commonJs.RANDOM() * 2.0 * Math.PI;\n    out[0] = Math.cos(r) * scale2;\n    out[1] = Math.sin(r) * scale2;\n    return out;\n}\nfunction transformMat2(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    return out;\n}\nfunction transformMat2d(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[2] * y + m[4];\n    out[1] = m[1] * x + m[3] * y + m[5];\n    return out;\n}\nfunction transformMat3(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[3] * y + m[6];\n    out[1] = m[1] * x + m[4] * y + m[7];\n    return out;\n}\nfunction transformMat4(out, a, m) {\n    var x = a[0];\n    var y = a[1];\n    out[0] = m[0] * x + m[4] * y + m[12];\n    out[1] = m[1] * x + m[5] * y + m[13];\n    return out;\n}\nfunction rotate(out, a, b, rad) {\n    //Translate point to the origin\n    var p0 = a[0] - b[0], p1 = a[1] - b[1], sinC = Math.sin(rad), cosC = Math.cos(rad); //perform rotation and translate to correct position\n    out[0] = p0 * cosC - p1 * sinC + b[0];\n    out[1] = p0 * sinC + p1 * cosC + b[1];\n    return out;\n}\nfunction angle(a, b) {\n    var x1 = a[0], y1 = a[1], x2 = b[0], y2 = b[1], // mag is the product of the magnitudes of a and b\n    mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2), // mag &&.. short circuits if mag == 0\n    cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n    return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\nfunction zero(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    return out;\n}\nfunction str(a) {\n    return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1];\n    var b0 = b[0], b1 = b[1];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\nvar len = length;\nvar sub = subtract;\nvar mul = multiply;\nvar div = divide;\nvar dist = distance;\nvar sqrDist = squaredDistance;\nvar sqrLen = squaredLength;\nvar forEach = function() {\n    var vec = create();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 2;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n        }\n        return a;\n    };\n}();\n\n},{\"./common.js\":\"hhmSF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hhmSF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"EPSILON\", ()=>EPSILON);\nparcelHelpers.export(exports, \"ARRAY_TYPE\", ()=>ARRAY_TYPE);\nparcelHelpers.export(exports, \"RANDOM\", ()=>RANDOM);\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */ parcelHelpers.export(exports, \"setMatrixArrayType\", ()=>setMatrixArrayType);\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */ parcelHelpers.export(exports, \"toRadian\", ()=>toRadian);\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nvar EPSILON = 0.000001;\nvar ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nvar RANDOM = Math.random;\nfunction setMatrixArrayType(type) {\n    ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\nfunction toRadian(a) {\n    return a * degree;\n}\nfunction equals(a, b) {\n    return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function() {\n    var y = 0, i = arguments.length;\n    while(i--)y += arguments[i] * arguments[i];\n    return Math.sqrt(y);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cONlx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"vec2_transformMat4AsVector\", ()=>vec2_transformMat4AsVector);\nparcelHelpers.export(exports, \"vec3_transformMat4AsVector\", ()=>vec3_transformMat4AsVector);\nparcelHelpers.export(exports, \"vec3_transformMat2\", ()=>vec3_transformMat2);\nparcelHelpers.export(exports, \"vec4_transformMat2\", ()=>vec4_transformMat2);\nparcelHelpers.export(exports, \"vec4_transformMat3\", ()=>vec4_transformMat3);\nfunction vec2_transformMat4AsVector(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    const w = m[3] * x + m[7] * y || 1.0;\n    out[0] = (m[0] * x + m[4] * y) / w;\n    out[1] = (m[1] * x + m[5] * y) / w;\n    return out;\n}\nfunction vec3_transformMat4AsVector(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    const z = a[2];\n    const w = m[3] * x + m[7] * y + m[11] * z || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z) / w;\n    return out;\n}\nfunction vec3_transformMat2(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    out[2] = a[2];\n    return out;\n}\nfunction vec4_transformMat2(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction vec4_transformMat3(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    const z = a[2];\n    out[0] = m[0] * x + m[3] * y + m[6] * z;\n    out[1] = m[1] * x + m[4] * y + m[7] * z;\n    out[2] = m[2] * x + m[5] * y + m[8] * z;\n    out[3] = a[3];\n    return out;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2rssO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _vector = require(\"./base/vector\");\nvar _vectorDefault = parcelHelpers.interopDefault(_vector);\nvar _common = require(\"../lib/common\");\nvar _validators = require(\"../lib/validators\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nconst ORIGIN = [\n    0,\n    0,\n    0\n];\nlet ZERO;\nclass Vector3 extends (0, _vectorDefault.default) {\n    static get ZERO() {\n        if (!ZERO) {\n            ZERO = new Vector3(0, 0, 0);\n            Object.freeze(ZERO);\n        }\n        return ZERO;\n    }\n    constructor(x = 0, y = 0, z = 0){\n        super(-0, -0, -0);\n        if (arguments.length === 1 && (0, _common.isArray)(x)) this.copy(x);\n        else {\n            if ((0, _common.config).debug) {\n                (0, _validators.checkNumber)(x);\n                (0, _validators.checkNumber)(y);\n                (0, _validators.checkNumber)(z);\n            }\n            this[0] = x;\n            this[1] = y;\n            this[2] = z;\n        }\n    }\n    set(x, y, z) {\n        this[0] = x;\n        this[1] = y;\n        this[2] = z;\n        return this.check();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        return this.check();\n    }\n    fromObject(object) {\n        if ((0, _common.config).debug) {\n            (0, _validators.checkNumber)(object.x);\n            (0, _validators.checkNumber)(object.y);\n            (0, _validators.checkNumber)(object.z);\n        }\n        this[0] = object.x;\n        this[1] = object.y;\n        this[2] = object.z;\n        return this.check();\n    }\n    toObject(object) {\n        object.x = this[0];\n        object.y = this[1];\n        object.z = this[2];\n        return object;\n    }\n    get ELEMENTS() {\n        return 3;\n    }\n    get z() {\n        return this[2];\n    }\n    set z(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    angle(vector) {\n        return _vec3.angle(this, vector);\n    }\n    cross(vector) {\n        _vec3.cross(this, this, vector);\n        return this.check();\n    }\n    rotateX({ radians , origin =ORIGIN  }) {\n        _vec3.rotateX(this, this, origin, radians);\n        return this.check();\n    }\n    rotateY({ radians , origin =ORIGIN  }) {\n        _vec3.rotateY(this, this, origin, radians);\n        return this.check();\n    }\n    rotateZ({ radians , origin =ORIGIN  }) {\n        _vec3.rotateZ(this, this, origin, radians);\n        return this.check();\n    }\n    transform(matrix4) {\n        return this.transformAsPoint(matrix4);\n    }\n    transformAsPoint(matrix4) {\n        _vec3.transformMat4(this, this, matrix4);\n        return this.check();\n    }\n    transformAsVector(matrix4) {\n        (0, _glMatrixExtras.vec3_transformMat4AsVector)(this, this, matrix4);\n        return this.check();\n    }\n    transformByMatrix3(matrix3) {\n        _vec3.transformMat3(this, this, matrix3);\n        return this.check();\n    }\n    transformByMatrix2(matrix2) {\n        (0, _glMatrixExtras.vec3_transformMat2)(this, this, matrix2);\n        return this.check();\n    }\n    transformByQuaternion(quaternion) {\n        _vec3.transformQuat(this, this, quaternion);\n        return this.check();\n    }\n}\nexports.default = Vector3;\n\n},{\"./base/vector\":\"c7W6l\",\"../lib/common\":\"4ZtWf\",\"../lib/validators\":\"d22Rk\",\"gl-matrix/vec3\":\"4RBb8\",\"../lib/gl-matrix-extras\":\"cONlx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4RBb8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 3 Dimensional Vector\n * @module vec3\n */ /**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */ parcelHelpers.export(exports, \"length\", ()=>length);\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"divide\", ()=>divide);\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"ceil\", ()=>ceil);\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"floor\", ()=>floor);\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"min\", ()=>min);\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"max\", ()=>max);\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"round\", ()=>round);\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"scaleAndAdd\", ()=>scaleAndAdd);\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */ parcelHelpers.export(exports, \"distance\", ()=>distance);\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */ parcelHelpers.export(exports, \"squaredDistance\", ()=>squaredDistance);\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */ parcelHelpers.export(exports, \"squaredLength\", ()=>squaredLength);\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"negate\", ()=>negate);\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"inverse\", ()=>inverse);\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"normalize\", ()=>normalize);\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */ parcelHelpers.export(exports, \"dot\", ()=>dot);\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"cross\", ()=>cross);\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"lerp\", ()=>lerp);\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"hermite\", ()=>hermite);\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"bezier\", ()=>bezier);\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"random\", ()=>random);\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"transformMat4\", ()=>transformMat4);\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"transformMat3\", ()=>transformMat3);\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"transformQuat\", ()=>transformQuat);\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"rotateX\", ()=>rotateX);\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"rotateY\", ()=>rotateY);\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"rotateZ\", ()=>rotateZ);\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */ parcelHelpers.export(exports, \"angle\", ()=>angle);\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"zero\", ()=>zero);\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"div\", ()=>div);\nparcelHelpers.export(exports, \"dist\", ()=>dist);\nparcelHelpers.export(exports, \"sqrDist\", ()=>sqrDist);\nparcelHelpers.export(exports, \"len\", ()=>len);\nparcelHelpers.export(exports, \"sqrLen\", ()=>sqrLen);\nparcelHelpers.export(exports, \"forEach\", ()=>forEach);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(3);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n    }\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(3);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n}\nfunction length(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    return Math.hypot(x, y, z);\n}\nfunction fromValues(x, y, z) {\n    var out = new _commonJs.ARRAY_TYPE(3);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n}\nfunction set(out, x, y, z) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    return out;\n}\nfunction multiply(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    return out;\n}\nfunction divide(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    return out;\n}\nfunction ceil(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    return out;\n}\nfunction floor(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    return out;\n}\nfunction min(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    return out;\n}\nfunction max(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    return out;\n}\nfunction round(out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    return out;\n}\nfunction scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    return out;\n}\nfunction scaleAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    out[2] = a[2] + b[2] * scale1;\n    return out;\n}\nfunction distance(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    return Math.hypot(x, y, z);\n}\nfunction squaredDistance(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    return x * x + y * y + z * z;\n}\nfunction squaredLength(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    return x * x + y * y + z * z;\n}\nfunction negate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    return out;\n}\nfunction inverse(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    out[2] = 1.0 / a[2];\n    return out;\n}\nfunction normalize(out, a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var len1 = x * x + y * y + z * z;\n    if (len1 > 0) //TODO: evaluate use of glm_invsqrt here?\n    len1 = 1 / Math.sqrt(len1);\n    out[0] = a[0] * len1;\n    out[1] = a[1] * len1;\n    out[2] = a[2] * len1;\n    return out;\n}\nfunction dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\nfunction cross(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2];\n    var bx = b[0], by = b[1], bz = b[2];\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n}\nfunction lerp(out, a, b, t) {\n    var ax = a[0];\n    var ay = a[1];\n    var az = a[2];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    return out;\n}\nfunction hermite(out, a, b, c, d, t) {\n    var factorTimes2 = t * t;\n    var factor1 = factorTimes2 * (2 * t - 3) + 1;\n    var factor2 = factorTimes2 * (t - 2) + t;\n    var factor3 = factorTimes2 * (t - 1);\n    var factor4 = factorTimes2 * (3 - 2 * t);\n    out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n    out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n    out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n    return out;\n}\nfunction bezier(out, a, b, c, d, t) {\n    var inverseFactor = 1 - t;\n    var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n    var factorTimes2 = t * t;\n    var factor1 = inverseFactorTimesTwo * inverseFactor;\n    var factor2 = 3 * t * inverseFactorTimesTwo;\n    var factor3 = 3 * factorTimes2 * inverseFactor;\n    var factor4 = factorTimes2 * t;\n    out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n    out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n    out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n    return out;\n}\nfunction random(out, scale2) {\n    scale2 = scale2 || 1.0;\n    var r = _commonJs.RANDOM() * 2.0 * Math.PI;\n    var z = _commonJs.RANDOM() * 2.0 - 1.0;\n    var zScale = Math.sqrt(1.0 - z * z) * scale2;\n    out[0] = Math.cos(r) * zScale;\n    out[1] = Math.sin(r) * zScale;\n    out[2] = z * scale2;\n    return out;\n}\nfunction transformMat4(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n    return out;\n}\nfunction transformMat3(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x * m[0] + y * m[3] + z * m[6];\n    out[1] = x * m[1] + y * m[4] + z * m[7];\n    out[2] = x * m[2] + y * m[5] + z * m[8];\n    return out;\n}\nfunction transformQuat(out, a, q) {\n    // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3];\n    var x = a[0], y = a[1], z = a[2]; // var qvec = [qx, qy, qz];\n    // var uv = vec3.cross([], qvec, a);\n    var uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n    var uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n    var w2 = qw * 2;\n    uvx *= w2;\n    uvy *= w2;\n    uvz *= w2; // vec3.scale(uuv, uuv, 2);\n    uuvx *= 2;\n    uuvy *= 2;\n    uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n    out[0] = x + uvx + uuvx;\n    out[1] = y + uvy + uuvy;\n    out[2] = z + uvz + uuvz;\n    return out;\n}\nfunction rotateX(out, a, b, rad) {\n    var p = [], r = []; //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2]; //perform rotation\n    r[0] = p[0];\n    r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n    r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction rotateY(out, a, b, rad) {\n    var p = [], r = []; //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2]; //perform rotation\n    r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n    r[1] = p[1];\n    r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction rotateZ(out, a, b, rad) {\n    var p = [], r = []; //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2]; //perform rotation\n    r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n    r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n    r[2] = p[2]; //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction angle(a, b) {\n    var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2], mag1 = Math.sqrt(ax * ax + ay * ay + az * az), mag2 = Math.sqrt(bx * bx + by * by + bz * bz), mag = mag1 * mag2, cosine = mag && dot(a, b) / mag;\n    return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\nfunction zero(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    return out;\n}\nfunction str(a) {\n    return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2];\n    var b0 = b[0], b1 = b[1], b2 = b[2];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\nvar sub = subtract;\nvar mul = multiply;\nvar div = divide;\nvar dist = distance;\nvar sqrDist = squaredDistance;\nvar len = length;\nvar sqrLen = squaredLength;\nvar forEach = function() {\n    var vec = create();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 3;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            vec[2] = a[i + 2];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n            a[i + 2] = vec[2];\n        }\n        return a;\n    };\n}();\n\n},{\"./common.js\":\"hhmSF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aGglC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _vector = require(\"./base/vector\");\nvar _vectorDefault = parcelHelpers.interopDefault(_vector);\nvar _common = require(\"../lib/common\");\nvar _validators = require(\"../lib/validators\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nlet ZERO;\nclass Vector4 extends (0, _vectorDefault.default) {\n    static get ZERO() {\n        if (!ZERO) {\n            ZERO = new Vector4(0, 0, 0, 0);\n            Object.freeze(ZERO);\n        }\n        return ZERO;\n    }\n    constructor(x = 0, y = 0, z = 0, w = 0){\n        super(-0, -0, -0, -0);\n        if ((0, _common.isArray)(x) && arguments.length === 1) this.copy(x);\n        else {\n            if ((0, _common.config).debug) {\n                (0, _validators.checkNumber)(x);\n                (0, _validators.checkNumber)(y);\n                (0, _validators.checkNumber)(z);\n                (0, _validators.checkNumber)(w);\n            }\n            this[0] = x;\n            this[1] = y;\n            this[2] = z;\n            this[3] = w;\n        }\n    }\n    set(x, y, z, w) {\n        this[0] = x;\n        this[1] = y;\n        this[2] = z;\n        this[3] = w;\n        return this.check();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = array[3];\n        return this.check();\n    }\n    fromObject(object) {\n        if ((0, _common.config).debug) {\n            (0, _validators.checkNumber)(object.x);\n            (0, _validators.checkNumber)(object.y);\n            (0, _validators.checkNumber)(object.z);\n            (0, _validators.checkNumber)(object.w);\n        }\n        this[0] = object.x;\n        this[1] = object.y;\n        this[2] = object.z;\n        this[3] = object.w;\n        return this;\n    }\n    toObject(object) {\n        object.x = this[0];\n        object.y = this[1];\n        object.z = this[2];\n        object.w = this[3];\n        return object;\n    }\n    get ELEMENTS() {\n        return 4;\n    }\n    get z() {\n        return this[2];\n    }\n    set z(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get w() {\n        return this[3];\n    }\n    set w(value) {\n        this[3] = (0, _validators.checkNumber)(value);\n    }\n    transform(matrix4) {\n        _vec3.transformMat4(this, this, matrix4);\n        return this.check();\n    }\n    transformByMatrix3(matrix3) {\n        (0, _glMatrixExtras.vec4_transformMat3)(this, this, matrix3);\n        return this.check();\n    }\n    transformByMatrix2(matrix2) {\n        (0, _glMatrixExtras.vec4_transformMat2)(this, this, matrix2);\n        return this.check();\n    }\n    transformByQuaternion(quaternion) {\n        _vec3.transformQuat(this, this, quaternion);\n        return this.check();\n    }\n    applyMatrix4(m) {\n        m.transform(this, this);\n        return this;\n    }\n}\nexports.default = Vector4;\n\n},{\"./base/vector\":\"c7W6l\",\"../lib/common\":\"4ZtWf\",\"../lib/validators\":\"d22Rk\",\"gl-matrix/vec3\":\"4RBb8\",\"../lib/gl-matrix-extras\":\"cONlx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gC4YG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _matrix = require(\"./base/matrix\");\nvar _matrixDefault = parcelHelpers.interopDefault(_matrix);\nvar _validators = require(\"../lib/validators\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nvar _mat3 = require(\"gl-matrix/mat3\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar INDICES;\n(function(INDICES1) {\n    INDICES1[INDICES1[\"COL0ROW0\"] = 0] = \"COL0ROW0\";\n    INDICES1[INDICES1[\"COL0ROW1\"] = 1] = \"COL0ROW1\";\n    INDICES1[INDICES1[\"COL0ROW2\"] = 2] = \"COL0ROW2\";\n    INDICES1[INDICES1[\"COL1ROW0\"] = 3] = \"COL1ROW0\";\n    INDICES1[INDICES1[\"COL1ROW1\"] = 4] = \"COL1ROW1\";\n    INDICES1[INDICES1[\"COL1ROW2\"] = 5] = \"COL1ROW2\";\n    INDICES1[INDICES1[\"COL2ROW0\"] = 6] = \"COL2ROW0\";\n    INDICES1[INDICES1[\"COL2ROW1\"] = 7] = \"COL2ROW1\";\n    INDICES1[INDICES1[\"COL2ROW2\"] = 8] = \"COL2ROW2\";\n})(INDICES || (INDICES = {}));\nconst IDENTITY_MATRIX = Object.freeze([\n    1,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    1\n]);\nclass Matrix3 extends (0, _matrixDefault.default) {\n    static get IDENTITY() {\n        return getIdentityMatrix();\n    }\n    static get ZERO() {\n        return getZeroMatrix();\n    }\n    get ELEMENTS() {\n        return 9;\n    }\n    get RANK() {\n        return 3;\n    }\n    get INDICES() {\n        return INDICES;\n    }\n    constructor(array, ...args){\n        super(-0, -0, -0, -0, -0, -0, -0, -0, -0);\n        if (arguments.length === 1 && Array.isArray(array)) this.copy(array);\n        else if (args.length > 0) this.copy([\n            array,\n            ...args\n        ]);\n        else this.identity();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = array[3];\n        this[4] = array[4];\n        this[5] = array[5];\n        this[6] = array[6];\n        this[7] = array[7];\n        this[8] = array[8];\n        return this.check();\n    }\n    identity() {\n        return this.copy(IDENTITY_MATRIX);\n    }\n    fromObject(object) {\n        return this.check();\n    }\n    fromQuaternion(q) {\n        _mat3.fromQuat(this, q);\n        return this.check();\n    }\n    set(m00, m10, m20, m01, m11, m21, m02, m12, m22) {\n        this[0] = m00;\n        this[1] = m10;\n        this[2] = m20;\n        this[3] = m01;\n        this[4] = m11;\n        this[5] = m21;\n        this[6] = m02;\n        this[7] = m12;\n        this[8] = m22;\n        return this.check();\n    }\n    setRowMajor(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n        this[0] = m00;\n        this[1] = m10;\n        this[2] = m20;\n        this[3] = m01;\n        this[4] = m11;\n        this[5] = m21;\n        this[6] = m02;\n        this[7] = m12;\n        this[8] = m22;\n        return this.check();\n    }\n    determinant() {\n        return _mat3.determinant(this);\n    }\n    transpose() {\n        _mat3.transpose(this, this);\n        return this.check();\n    }\n    invert() {\n        _mat3.invert(this, this);\n        return this.check();\n    }\n    multiplyLeft(a) {\n        _mat3.multiply(this, a, this);\n        return this.check();\n    }\n    multiplyRight(a) {\n        _mat3.multiply(this, this, a);\n        return this.check();\n    }\n    rotate(radians) {\n        _mat3.rotate(this, this, radians);\n        return this.check();\n    }\n    scale(factor) {\n        if (Array.isArray(factor)) _mat3.scale(this, this, factor);\n        else _mat3.scale(this, this, [\n            factor,\n            factor\n        ]);\n        return this.check();\n    }\n    translate(vec) {\n        _mat3.translate(this, this, vec);\n        return this.check();\n    }\n    transform(vector, result) {\n        let out;\n        switch(vector.length){\n            case 2:\n                out = _vec2.transformMat3(result || [\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            case 3:\n                out = _vec3.transformMat3(result || [\n                    -0,\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            case 4:\n                out = (0, _glMatrixExtras.vec4_transformMat3)(result || [\n                    -0,\n                    -0,\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            default:\n                throw new Error(\"Illegal vector\");\n        }\n        (0, _validators.checkVector)(out, vector.length);\n        return out;\n    }\n    transformVector(vector, result) {\n        return this.transform(vector, result);\n    }\n    transformVector2(vector, result) {\n        return this.transform(vector, result);\n    }\n    transformVector3(vector, result) {\n        return this.transform(vector, result);\n    }\n}\nexports.default = Matrix3;\nlet ZERO_MATRIX3;\nlet IDENTITY_MATRIX3;\nfunction getZeroMatrix() {\n    if (!ZERO_MATRIX3) {\n        ZERO_MATRIX3 = new Matrix3([\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0\n        ]);\n        Object.freeze(ZERO_MATRIX3);\n    }\n    return ZERO_MATRIX3;\n}\nfunction getIdentityMatrix() {\n    if (!IDENTITY_MATRIX3) {\n        IDENTITY_MATRIX3 = new Matrix3();\n        Object.freeze(IDENTITY_MATRIX3);\n    }\n    return IDENTITY_MATRIX3;\n}\n\n},{\"./base/matrix\":\"9lGqT\",\"../lib/validators\":\"d22Rk\",\"../lib/gl-matrix-extras\":\"cONlx\",\"gl-matrix/mat3\":\"hz4Zv\",\"gl-matrix/vec2\":\"29QfU\",\"gl-matrix/vec3\":\"4RBb8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9lGqT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathArray = require(\"./math-array\");\nvar _mathArrayDefault = parcelHelpers.interopDefault(_mathArray);\nvar _validators = require(\"../../lib/validators\");\nvar _common = require(\"../../lib/common\");\nclass Matrix extends (0, _mathArrayDefault.default) {\n    toString() {\n        let string = \"[\";\n        if ((0, _common.config).printRowMajor) {\n            string += \"row-major:\";\n            for(let row = 0; row < this.RANK; ++row)for(let col = 0; col < this.RANK; ++col)string += \" \".concat(this[col * this.RANK + row]);\n        } else {\n            string += \"column-major:\";\n            for(let i = 0; i < this.ELEMENTS; ++i)string += \" \".concat(this[i]);\n        }\n        string += \"]\";\n        return string;\n    }\n    getElementIndex(row, col) {\n        return col * this.RANK + row;\n    }\n    getElement(row, col) {\n        return this[col * this.RANK + row];\n    }\n    setElement(row, col, value) {\n        this[col * this.RANK + row] = (0, _validators.checkNumber)(value);\n        return this;\n    }\n    getColumn(columnIndex, result = new Array(this.RANK).fill(-0)) {\n        const firstIndex = columnIndex * this.RANK;\n        for(let i = 0; i < this.RANK; ++i)result[i] = this[firstIndex + i];\n        return result;\n    }\n    setColumn(columnIndex, columnVector) {\n        const firstIndex = columnIndex * this.RANK;\n        for(let i = 0; i < this.RANK; ++i)this[firstIndex + i] = columnVector[i];\n        return this;\n    }\n}\nexports.default = Matrix;\n\n},{\"./math-array\":\"egSnj\",\"../../lib/validators\":\"d22Rk\",\"../../lib/common\":\"4ZtWf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hz4Zv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 3x3 Matrix\n * @module mat3\n */ /**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromMat4\", ()=>fromMat4);\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"identity\", ()=>identity);\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"transpose\", ()=>transpose);\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"invert\", ()=>invert);\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"adjoint\", ()=>adjoint);\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */ parcelHelpers.export(exports, \"determinant\", ()=>determinant);\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"translate\", ()=>translate);\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"rotate\", ()=>rotate);\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromTranslation\", ()=>fromTranslation);\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromRotation\", ()=>fromRotation);\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromScaling\", ()=>fromScaling);\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/ parcelHelpers.export(exports, \"fromMat2d\", ()=>fromMat2d);\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromQuat\", ()=>fromQuat);\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"normalFromMat4\", ()=>normalFromMat4);\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"projection\", ()=>projection);\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */ parcelHelpers.export(exports, \"frob\", ()=>frob);\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"multiplyScalar\", ()=>multiplyScalar);\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"multiplyScalarAndAdd\", ()=>multiplyScalarAndAdd);\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(9);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[5] = 0;\n        out[6] = 0;\n        out[7] = 0;\n    }\n    out[0] = 1;\n    out[4] = 1;\n    out[8] = 1;\n    return out;\n}\nfunction fromMat4(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[4];\n    out[4] = a[5];\n    out[5] = a[6];\n    out[6] = a[8];\n    out[7] = a[9];\n    out[8] = a[10];\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(9);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new _commonJs.ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n}\nfunction set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n}\nfunction identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction transpose(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a12 = a[5];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a01;\n        out[5] = a[7];\n        out[6] = a02;\n        out[7] = a12;\n    } else {\n        out[0] = a[0];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a[1];\n        out[4] = a[4];\n        out[5] = a[7];\n        out[6] = a[2];\n        out[7] = a[5];\n        out[8] = a[8];\n    }\n    return out;\n}\nfunction invert(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    var b01 = a22 * a11 - a12 * a21;\n    var b11 = -a22 * a10 + a12 * a20;\n    var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n    var det = a00 * b01 + a01 * b11 + a02 * b21;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = b01 * det;\n    out[1] = (-a22 * a01 + a02 * a21) * det;\n    out[2] = (a12 * a01 - a02 * a11) * det;\n    out[3] = b11 * det;\n    out[4] = (a22 * a00 - a02 * a20) * det;\n    out[5] = (-a12 * a00 + a02 * a10) * det;\n    out[6] = b21 * det;\n    out[7] = (-a21 * a00 + a01 * a20) * det;\n    out[8] = (a11 * a00 - a01 * a10) * det;\n    return out;\n}\nfunction adjoint(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    out[0] = a11 * a22 - a12 * a21;\n    out[1] = a02 * a21 - a01 * a22;\n    out[2] = a01 * a12 - a02 * a11;\n    out[3] = a12 * a20 - a10 * a22;\n    out[4] = a00 * a22 - a02 * a20;\n    out[5] = a02 * a10 - a00 * a12;\n    out[6] = a10 * a21 - a11 * a20;\n    out[7] = a01 * a20 - a00 * a21;\n    out[8] = a00 * a11 - a01 * a10;\n    return out;\n}\nfunction determinant(a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\nfunction multiply(out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    var b00 = b[0], b01 = b[1], b02 = b[2];\n    var b10 = b[3], b11 = b[4], b12 = b[5];\n    var b20 = b[6], b21 = b[7], b22 = b[8];\n    out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n    out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n    out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n    out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n    out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n    out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n    out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n    out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n    out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n    return out;\n}\nfunction translate(out, a, v) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], x = v[0], y = v[1];\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n    out[3] = a10;\n    out[4] = a11;\n    out[5] = a12;\n    out[6] = x * a00 + y * a10 + a20;\n    out[7] = x * a01 + y * a11 + a21;\n    out[8] = x * a02 + y * a12 + a22;\n    return out;\n}\nfunction rotate(out, a, rad) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c * a00 + s * a10;\n    out[1] = c * a01 + s * a11;\n    out[2] = c * a02 + s * a12;\n    out[3] = c * a10 - s * a00;\n    out[4] = c * a11 - s * a01;\n    out[5] = c * a12 - s * a02;\n    out[6] = a20;\n    out[7] = a21;\n    out[8] = a22;\n    return out;\n}\nfunction scale(out, a, v) {\n    var x = v[0], y = v[1];\n    out[0] = x * a[0];\n    out[1] = x * a[1];\n    out[2] = x * a[2];\n    out[3] = y * a[3];\n    out[4] = y * a[4];\n    out[5] = y * a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction fromTranslation(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = v[0];\n    out[7] = v[1];\n    out[8] = 1;\n    return out;\n}\nfunction fromRotation(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n    out[3] = -s;\n    out[4] = c;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction fromScaling(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = v[1];\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction fromMat2d(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = 0;\n    out[3] = a[2];\n    out[4] = a[3];\n    out[5] = 0;\n    out[6] = a[4];\n    out[7] = a[5];\n    out[8] = 1;\n    return out;\n}\nfunction fromQuat(out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var yx = y * x2;\n    var yy = y * y2;\n    var zx = z * x2;\n    var zy = z * y2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n    return out;\n}\nfunction normalFromMat4(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    return out;\n}\nfunction projection(out, width, height) {\n    out[0] = 2 / width;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = -2 / height;\n    out[5] = 0;\n    out[6] = -1;\n    out[7] = 1;\n    out[8] = 1;\n    return out;\n}\nfunction str(a) {\n    return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\nfunction frob(a) {\n    return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    return out;\n}\nfunction multiplyScalar(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    return out;\n}\nfunction multiplyScalarAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    out[2] = a[2] + b[2] * scale1;\n    out[3] = a[3] + b[3] * scale1;\n    out[4] = a[4] + b[4] * scale1;\n    out[5] = a[5] + b[5] * scale1;\n    out[6] = a[6] + b[6] * scale1;\n    out[7] = a[7] + b[7] * scale1;\n    out[8] = a[8] + b[8] * scale1;\n    return out;\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\nvar mul = multiply;\nvar sub = subtract;\n\n},{\"./common.js\":\"hhmSF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lSk58\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _matrix = require(\"./base/matrix\");\nvar _matrixDefault = parcelHelpers.interopDefault(_matrix);\nvar _validators = require(\"../lib/validators\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _vec4 = require(\"gl-matrix/vec4\");\nvar INDICES;\n(function(INDICES1) {\n    INDICES1[INDICES1[\"COL0ROW0\"] = 0] = \"COL0ROW0\";\n    INDICES1[INDICES1[\"COL0ROW1\"] = 1] = \"COL0ROW1\";\n    INDICES1[INDICES1[\"COL0ROW2\"] = 2] = \"COL0ROW2\";\n    INDICES1[INDICES1[\"COL0ROW3\"] = 3] = \"COL0ROW3\";\n    INDICES1[INDICES1[\"COL1ROW0\"] = 4] = \"COL1ROW0\";\n    INDICES1[INDICES1[\"COL1ROW1\"] = 5] = \"COL1ROW1\";\n    INDICES1[INDICES1[\"COL1ROW2\"] = 6] = \"COL1ROW2\";\n    INDICES1[INDICES1[\"COL1ROW3\"] = 7] = \"COL1ROW3\";\n    INDICES1[INDICES1[\"COL2ROW0\"] = 8] = \"COL2ROW0\";\n    INDICES1[INDICES1[\"COL2ROW1\"] = 9] = \"COL2ROW1\";\n    INDICES1[INDICES1[\"COL2ROW2\"] = 10] = \"COL2ROW2\";\n    INDICES1[INDICES1[\"COL2ROW3\"] = 11] = \"COL2ROW3\";\n    INDICES1[INDICES1[\"COL3ROW0\"] = 12] = \"COL3ROW0\";\n    INDICES1[INDICES1[\"COL3ROW1\"] = 13] = \"COL3ROW1\";\n    INDICES1[INDICES1[\"COL3ROW2\"] = 14] = \"COL3ROW2\";\n    INDICES1[INDICES1[\"COL3ROW3\"] = 15] = \"COL3ROW3\";\n})(INDICES || (INDICES = {}));\nconst DEFAULT_FOVY = 45 * Math.PI / 180;\nconst DEFAULT_ASPECT = 1;\nconst DEFAULT_NEAR = 0.1;\nconst DEFAULT_FAR = 500;\nconst IDENTITY_MATRIX = Object.freeze([\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1\n]);\nclass Matrix4 extends (0, _matrixDefault.default) {\n    static get IDENTITY() {\n        return getIdentityMatrix();\n    }\n    static get ZERO() {\n        return getZeroMatrix();\n    }\n    get ELEMENTS() {\n        return 16;\n    }\n    get RANK() {\n        return 4;\n    }\n    get INDICES() {\n        return INDICES;\n    }\n    constructor(array){\n        super(-0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0);\n        if (arguments.length === 1 && Array.isArray(array)) this.copy(array);\n        else this.identity();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = array[3];\n        this[4] = array[4];\n        this[5] = array[5];\n        this[6] = array[6];\n        this[7] = array[7];\n        this[8] = array[8];\n        this[9] = array[9];\n        this[10] = array[10];\n        this[11] = array[11];\n        this[12] = array[12];\n        this[13] = array[13];\n        this[14] = array[14];\n        this[15] = array[15];\n        return this.check();\n    }\n    set(m00, m10, m20, m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33) {\n        this[0] = m00;\n        this[1] = m10;\n        this[2] = m20;\n        this[3] = m30;\n        this[4] = m01;\n        this[5] = m11;\n        this[6] = m21;\n        this[7] = m31;\n        this[8] = m02;\n        this[9] = m12;\n        this[10] = m22;\n        this[11] = m32;\n        this[12] = m03;\n        this[13] = m13;\n        this[14] = m23;\n        this[15] = m33;\n        return this.check();\n    }\n    setRowMajor(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n        this[0] = m00;\n        this[1] = m10;\n        this[2] = m20;\n        this[3] = m30;\n        this[4] = m01;\n        this[5] = m11;\n        this[6] = m21;\n        this[7] = m31;\n        this[8] = m02;\n        this[9] = m12;\n        this[10] = m22;\n        this[11] = m32;\n        this[12] = m03;\n        this[13] = m13;\n        this[14] = m23;\n        this[15] = m33;\n        return this.check();\n    }\n    toRowMajor(result) {\n        result[0] = this[0];\n        result[1] = this[4];\n        result[2] = this[8];\n        result[3] = this[12];\n        result[4] = this[1];\n        result[5] = this[5];\n        result[6] = this[9];\n        result[7] = this[13];\n        result[8] = this[2];\n        result[9] = this[6];\n        result[10] = this[10];\n        result[11] = this[14];\n        result[12] = this[3];\n        result[13] = this[7];\n        result[14] = this[11];\n        result[15] = this[15];\n        return result;\n    }\n    identity() {\n        return this.copy(IDENTITY_MATRIX);\n    }\n    fromObject(object) {\n        return this.check();\n    }\n    fromQuaternion(quaternion) {\n        _mat4.fromQuat(this, quaternion);\n        return this.check();\n    }\n    frustum(view) {\n        const { left , right , bottom , top , near =DEFAULT_NEAR , far =DEFAULT_FAR  } = view;\n        if (far === Infinity) computeInfinitePerspectiveOffCenter(this, left, right, bottom, top, near);\n        else _mat4.frustum(this, left, right, bottom, top, near, far);\n        return this.check();\n    }\n    lookAt(view) {\n        const { eye , center =[\n            0,\n            0,\n            0\n        ] , up =[\n            0,\n            1,\n            0\n        ]  } = view;\n        _mat4.lookAt(this, eye, center, up);\n        return this.check();\n    }\n    ortho(view) {\n        const { left , right , bottom , top , near =DEFAULT_NEAR , far =DEFAULT_FAR  } = view;\n        _mat4.ortho(this, left, right, bottom, top, near, far);\n        return this.check();\n    }\n    orthographic(view) {\n        const { fovy =DEFAULT_FOVY , aspect =DEFAULT_ASPECT , focalDistance =1 , near =DEFAULT_NEAR , far =DEFAULT_FAR  } = view;\n        checkRadians(fovy);\n        const halfY = fovy / 2;\n        const top = focalDistance * Math.tan(halfY);\n        const right = top * aspect;\n        return this.ortho({\n            left: -right,\n            right,\n            bottom: -top,\n            top,\n            near,\n            far\n        });\n    }\n    perspective(view) {\n        const { fovy =45 * Math.PI / 180 , aspect =1 , near =0.1 , far =500  } = view;\n        checkRadians(fovy);\n        _mat4.perspective(this, fovy, aspect, near, far);\n        return this.check();\n    }\n    determinant() {\n        return _mat4.determinant(this);\n    }\n    getScale(result = [\n        -0,\n        -0,\n        -0\n    ]) {\n        result[0] = Math.sqrt(this[0] * this[0] + this[1] * this[1] + this[2] * this[2]);\n        result[1] = Math.sqrt(this[4] * this[4] + this[5] * this[5] + this[6] * this[6]);\n        result[2] = Math.sqrt(this[8] * this[8] + this[9] * this[9] + this[10] * this[10]);\n        return result;\n    }\n    getTranslation(result = [\n        -0,\n        -0,\n        -0\n    ]) {\n        result[0] = this[12];\n        result[1] = this[13];\n        result[2] = this[14];\n        return result;\n    }\n    getRotation(result, scaleResult) {\n        result = result || [\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0\n        ];\n        scaleResult = scaleResult || [\n            -0,\n            -0,\n            -0\n        ];\n        const scale = this.getScale(scaleResult);\n        const inverseScale0 = 1 / scale[0];\n        const inverseScale1 = 1 / scale[1];\n        const inverseScale2 = 1 / scale[2];\n        result[0] = this[0] * inverseScale0;\n        result[1] = this[1] * inverseScale1;\n        result[2] = this[2] * inverseScale2;\n        result[3] = 0;\n        result[4] = this[4] * inverseScale0;\n        result[5] = this[5] * inverseScale1;\n        result[6] = this[6] * inverseScale2;\n        result[7] = 0;\n        result[8] = this[8] * inverseScale0;\n        result[9] = this[9] * inverseScale1;\n        result[10] = this[10] * inverseScale2;\n        result[11] = 0;\n        result[12] = 0;\n        result[13] = 0;\n        result[14] = 0;\n        result[15] = 1;\n        return result;\n    }\n    getRotationMatrix3(result, scaleResult) {\n        result = result || [\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0\n        ];\n        scaleResult = scaleResult || [\n            -0,\n            -0,\n            -0\n        ];\n        const scale = this.getScale(scaleResult);\n        const inverseScale0 = 1 / scale[0];\n        const inverseScale1 = 1 / scale[1];\n        const inverseScale2 = 1 / scale[2];\n        result[0] = this[0] * inverseScale0;\n        result[1] = this[1] * inverseScale1;\n        result[2] = this[2] * inverseScale2;\n        result[3] = this[4] * inverseScale0;\n        result[4] = this[5] * inverseScale1;\n        result[5] = this[6] * inverseScale2;\n        result[6] = this[8] * inverseScale0;\n        result[7] = this[9] * inverseScale1;\n        result[8] = this[10] * inverseScale2;\n        return result;\n    }\n    transpose() {\n        _mat4.transpose(this, this);\n        return this.check();\n    }\n    invert() {\n        _mat4.invert(this, this);\n        return this.check();\n    }\n    multiplyLeft(a) {\n        _mat4.multiply(this, a, this);\n        return this.check();\n    }\n    multiplyRight(a) {\n        _mat4.multiply(this, this, a);\n        return this.check();\n    }\n    rotateX(radians) {\n        _mat4.rotateX(this, this, radians);\n        return this.check();\n    }\n    rotateY(radians) {\n        _mat4.rotateY(this, this, radians);\n        return this.check();\n    }\n    rotateZ(radians) {\n        _mat4.rotateZ(this, this, radians);\n        return this.check();\n    }\n    rotateXYZ(angleXYZ) {\n        return this.rotateX(angleXYZ[0]).rotateY(angleXYZ[1]).rotateZ(angleXYZ[2]);\n    }\n    rotateAxis(radians, axis) {\n        _mat4.rotate(this, this, radians, axis);\n        return this.check();\n    }\n    scale(factor) {\n        _mat4.scale(this, this, Array.isArray(factor) ? factor : [\n            factor,\n            factor,\n            factor\n        ]);\n        return this.check();\n    }\n    translate(vector) {\n        _mat4.translate(this, this, vector);\n        return this.check();\n    }\n    transform(vector, result) {\n        if (vector.length === 4) {\n            result = _vec4.transformMat4(result || [\n                -0,\n                -0,\n                -0,\n                -0\n            ], vector, this);\n            (0, _validators.checkVector)(result, 4);\n            return result;\n        }\n        return this.transformAsPoint(vector, result);\n    }\n    transformAsPoint(vector, result) {\n        const { length  } = vector;\n        let out;\n        switch(length){\n            case 2:\n                out = _vec2.transformMat4(result || [\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            case 3:\n                out = _vec3.transformMat4(result || [\n                    -0,\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            default:\n                throw new Error(\"Illegal vector\");\n        }\n        (0, _validators.checkVector)(out, vector.length);\n        return out;\n    }\n    transformAsVector(vector, result) {\n        let out;\n        switch(vector.length){\n            case 2:\n                out = (0, _glMatrixExtras.vec2_transformMat4AsVector)(result || [\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            case 3:\n                out = (0, _glMatrixExtras.vec3_transformMat4AsVector)(result || [\n                    -0,\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            default:\n                throw new Error(\"Illegal vector\");\n        }\n        (0, _validators.checkVector)(out, vector.length);\n        return out;\n    }\n    transformPoint(vector, result) {\n        return this.transformAsPoint(vector, result);\n    }\n    transformVector(vector, result) {\n        return this.transformAsPoint(vector, result);\n    }\n    transformDirection(vector, result) {\n        return this.transformAsVector(vector, result);\n    }\n    makeRotationX(radians) {\n        return this.identity().rotateX(radians);\n    }\n    makeTranslation(x, y, z) {\n        return this.identity().translate([\n            x,\n            y,\n            z\n        ]);\n    }\n}\nexports.default = Matrix4;\nlet ZERO;\nlet IDENTITY;\nfunction getZeroMatrix() {\n    if (!ZERO) {\n        ZERO = new Matrix4([\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0\n        ]);\n        Object.freeze(ZERO);\n    }\n    return ZERO;\n}\nfunction getIdentityMatrix() {\n    if (!IDENTITY) {\n        IDENTITY = new Matrix4();\n        Object.freeze(IDENTITY);\n    }\n    return IDENTITY;\n}\nfunction checkRadians(possiblyDegrees) {\n    if (possiblyDegrees > Math.PI * 2) throw Error(\"expected radians\");\n}\nfunction computeInfinitePerspectiveOffCenter(result, left, right, bottom, top, near) {\n    const column0Row0 = 2 * near / (right - left);\n    const column1Row1 = 2 * near / (top - bottom);\n    const column2Row0 = (right + left) / (right - left);\n    const column2Row1 = (top + bottom) / (top - bottom);\n    const column2Row2 = -1;\n    const column2Row3 = -1;\n    const column3Row2 = -2 * near;\n    result[0] = column0Row0;\n    result[1] = 0;\n    result[2] = 0;\n    result[3] = 0;\n    result[4] = 0;\n    result[5] = column1Row1;\n    result[6] = 0;\n    result[7] = 0;\n    result[8] = column2Row0;\n    result[9] = column2Row1;\n    result[10] = column2Row2;\n    result[11] = column2Row3;\n    result[12] = 0;\n    result[13] = 0;\n    result[14] = column3Row2;\n    result[15] = 0;\n    return result;\n}\n\n},{\"./base/matrix\":\"9lGqT\",\"../lib/validators\":\"d22Rk\",\"../lib/gl-matrix-extras\":\"cONlx\",\"gl-matrix/mat4\":\"aI9zp\",\"gl-matrix/vec2\":\"29QfU\",\"gl-matrix/vec3\":\"4RBb8\",\"gl-matrix/vec4\":\"9M1lU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aI9zp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */ /**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"identity\", ()=>identity);\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"transpose\", ()=>transpose);\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"invert\", ()=>invert);\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"adjoint\", ()=>adjoint);\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */ parcelHelpers.export(exports, \"determinant\", ()=>determinant);\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"translate\", ()=>translate);\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"rotate\", ()=>rotate);\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"rotateX\", ()=>rotateX);\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"rotateY\", ()=>rotateY);\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"rotateZ\", ()=>rotateZ);\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromTranslation\", ()=>fromTranslation);\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromScaling\", ()=>fromScaling);\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromRotation\", ()=>fromRotation);\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromXRotation\", ()=>fromXRotation);\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromYRotation\", ()=>fromYRotation);\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromZRotation\", ()=>fromZRotation);\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromRotationTranslation\", ()=>fromRotationTranslation);\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */ parcelHelpers.export(exports, \"fromQuat2\", ()=>fromQuat2);\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */ parcelHelpers.export(exports, \"getTranslation\", ()=>getTranslation);\n/**\n * Returns the scaling factor component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslationScale\n *  with a normalized Quaternion paramter, the returned vector will be\n *  the same as the scaling vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive scaling factor component\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */ parcelHelpers.export(exports, \"getScaling\", ()=>getScaling);\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */ parcelHelpers.export(exports, \"getRotation\", ()=>getRotation);\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromRotationTranslationScale\", ()=>fromRotationTranslationScale);\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     mat4.translate(dest, origin);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *     mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromRotationTranslationScaleOrigin\", ()=>fromRotationTranslationScaleOrigin);\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromQuat\", ()=>fromQuat);\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"frustum\", ()=>frustum);\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"perspectiveNO\", ()=>perspectiveNO);\nparcelHelpers.export(exports, \"perspective\", ()=>perspective);\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"perspectiveZO\", ()=>perspectiveZO);\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"perspectiveFromFieldOfView\", ()=>perspectiveFromFieldOfView);\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"orthoNO\", ()=>orthoNO);\nparcelHelpers.export(exports, \"ortho\", ()=>ortho);\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"orthoZO\", ()=>orthoZO);\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"lookAt\", ()=>lookAt);\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"targetTo\", ()=>targetTo);\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */ parcelHelpers.export(exports, \"frob\", ()=>frob);\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"multiplyScalar\", ()=>multiplyScalar);\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"multiplyScalarAndAdd\", ()=>multiplyScalarAndAdd);\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(16);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[4] = 0;\n        out[6] = 0;\n        out[7] = 0;\n        out[8] = 0;\n        out[9] = 0;\n        out[11] = 0;\n        out[12] = 0;\n        out[13] = 0;\n        out[14] = 0;\n    }\n    out[0] = 1;\n    out[5] = 1;\n    out[10] = 1;\n    out[15] = 1;\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(16);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new _commonJs.ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n}\nfunction set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n}\nfunction identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction transpose(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a03 = a[3];\n        var a12 = a[6], a13 = a[7];\n        var a23 = a[11];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a01;\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a02;\n        out[9] = a12;\n        out[11] = a[14];\n        out[12] = a03;\n        out[13] = a13;\n        out[14] = a23;\n    } else {\n        out[0] = a[0];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a[1];\n        out[5] = a[5];\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a[2];\n        out[9] = a[6];\n        out[10] = a[10];\n        out[11] = a[14];\n        out[12] = a[3];\n        out[13] = a[7];\n        out[14] = a[11];\n        out[15] = a[15];\n    }\n    return out;\n}\nfunction invert(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n    return out;\n}\nfunction adjoint(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n    out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n    out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n    out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n    out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n    out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n    out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n    out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n    out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n    out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n    out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n    out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n    out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n    out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n    out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n    out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n    return out;\n}\nfunction determinant(a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n    return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\nfunction multiply(out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; // Cache only the current line of the second matrix\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[4];\n    b1 = b[5];\n    b2 = b[6];\n    b3 = b[7];\n    out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[8];\n    b1 = b[9];\n    b2 = b[10];\n    b3 = b[11];\n    out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[12];\n    b1 = b[13];\n    b2 = b[14];\n    b3 = b[15];\n    out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    return out;\n}\nfunction translate(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n        a00 = a[0];\n        a01 = a[1];\n        a02 = a[2];\n        a03 = a[3];\n        a10 = a[4];\n        a11 = a[5];\n        a12 = a[6];\n        a13 = a[7];\n        a20 = a[8];\n        a21 = a[9];\n        a22 = a[10];\n        a23 = a[11];\n        out[0] = a00;\n        out[1] = a01;\n        out[2] = a02;\n        out[3] = a03;\n        out[4] = a10;\n        out[5] = a11;\n        out[6] = a12;\n        out[7] = a13;\n        out[8] = a20;\n        out[9] = a21;\n        out[10] = a22;\n        out[11] = a23;\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n    return out;\n}\nfunction scale(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n    out[0] = a[0] * x;\n    out[1] = a[1] * x;\n    out[2] = a[2] * x;\n    out[3] = a[3] * x;\n    out[4] = a[4] * y;\n    out[5] = a[5] * y;\n    out[6] = a[6] * y;\n    out[7] = a[7] * y;\n    out[8] = a[8] * z;\n    out[9] = a[9] * z;\n    out[10] = a[10] * z;\n    out[11] = a[11] * z;\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction rotate(out, a, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2];\n    var len = Math.hypot(x, y, z);\n    var s, c, t;\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    var b00, b01, b02;\n    var b10, b11, b12;\n    var b20, b21, b22;\n    if (len < _commonJs.EPSILON) return null;\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n    a00 = a[0];\n    a01 = a[1];\n    a02 = a[2];\n    a03 = a[3];\n    a10 = a[4];\n    a11 = a[5];\n    a12 = a[6];\n    a13 = a[7];\n    a20 = a[8];\n    a21 = a[9];\n    a22 = a[10];\n    a23 = a[11]; // Construct the elements of the rotation matrix\n    b00 = x * x * t + c;\n    b01 = y * x * t + z * s;\n    b02 = z * x * t - y * s;\n    b10 = x * y * t - z * s;\n    b11 = y * y * t + c;\n    b12 = z * y * t + x * s;\n    b20 = x * z * t + y * s;\n    b21 = y * z * t - x * s;\n    b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n    out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n    out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n    out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n    out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n    out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n    out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n    out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n    out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n    out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n    out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n    out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n    out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged last row\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    return out;\n}\nfunction rotateX(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a10 = a[4];\n    var a11 = a[5];\n    var a12 = a[6];\n    var a13 = a[7];\n    var a20 = a[8];\n    var a21 = a[9];\n    var a22 = a[10];\n    var a23 = a[11];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged rows\n        out[0] = a[0];\n        out[1] = a[1];\n        out[2] = a[2];\n        out[3] = a[3];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    } // Perform axis-specific matrix multiplication\n    out[4] = a10 * c + a20 * s;\n    out[5] = a11 * c + a21 * s;\n    out[6] = a12 * c + a22 * s;\n    out[7] = a13 * c + a23 * s;\n    out[8] = a20 * c - a10 * s;\n    out[9] = a21 * c - a11 * s;\n    out[10] = a22 * c - a12 * s;\n    out[11] = a23 * c - a13 * s;\n    return out;\n}\nfunction rotateY(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a00 = a[0];\n    var a01 = a[1];\n    var a02 = a[2];\n    var a03 = a[3];\n    var a20 = a[8];\n    var a21 = a[9];\n    var a22 = a[10];\n    var a23 = a[11];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged rows\n        out[4] = a[4];\n        out[5] = a[5];\n        out[6] = a[6];\n        out[7] = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    } // Perform axis-specific matrix multiplication\n    out[0] = a00 * c - a20 * s;\n    out[1] = a01 * c - a21 * s;\n    out[2] = a02 * c - a22 * s;\n    out[3] = a03 * c - a23 * s;\n    out[8] = a00 * s + a20 * c;\n    out[9] = a01 * s + a21 * c;\n    out[10] = a02 * s + a22 * c;\n    out[11] = a03 * s + a23 * c;\n    return out;\n}\nfunction rotateZ(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a00 = a[0];\n    var a01 = a[1];\n    var a02 = a[2];\n    var a03 = a[3];\n    var a10 = a[4];\n    var a11 = a[5];\n    var a12 = a[6];\n    var a13 = a[7];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged last row\n        out[8] = a[8];\n        out[9] = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    } // Perform axis-specific matrix multiplication\n    out[0] = a00 * c + a10 * s;\n    out[1] = a01 * c + a11 * s;\n    out[2] = a02 * c + a12 * s;\n    out[3] = a03 * c + a13 * s;\n    out[4] = a10 * c - a00 * s;\n    out[5] = a11 * c - a01 * s;\n    out[6] = a12 * c - a02 * s;\n    out[7] = a13 * c - a03 * s;\n    return out;\n}\nfunction fromTranslation(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction fromScaling(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromRotation(out, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2];\n    var len = Math.hypot(x, y, z);\n    var s, c, t;\n    if (len < _commonJs.EPSILON) return null;\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c; // Perform rotation-specific matrix multiplication\n    out[0] = x * x * t + c;\n    out[1] = y * x * t + z * s;\n    out[2] = z * x * t - y * s;\n    out[3] = 0;\n    out[4] = x * y * t - z * s;\n    out[5] = y * y * t + c;\n    out[6] = z * y * t + x * s;\n    out[7] = 0;\n    out[8] = x * z * t + y * s;\n    out[9] = y * z * t - x * s;\n    out[10] = z * z * t + c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromXRotation(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = c;\n    out[6] = s;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = -s;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromYRotation(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n    out[0] = c;\n    out[1] = 0;\n    out[2] = -s;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = s;\n    out[9] = 0;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromZRotation(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = -s;\n    out[5] = c;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromRotationTranslation(out, q, v) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - (yy + zz);\n    out[1] = xy + wz;\n    out[2] = xz - wy;\n    out[3] = 0;\n    out[4] = xy - wz;\n    out[5] = 1 - (xx + zz);\n    out[6] = yz + wx;\n    out[7] = 0;\n    out[8] = xz + wy;\n    out[9] = yz - wx;\n    out[10] = 1 - (xx + yy);\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction fromQuat2(out, a) {\n    var translation = new _commonJs.ARRAY_TYPE(3);\n    var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7];\n    var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n    if (magnitude > 0) {\n        translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n        translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n        translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n    } else {\n        translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n        translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n        translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n    }\n    fromRotationTranslation(out, a, translation);\n    return out;\n}\nfunction getTranslation(out, mat) {\n    out[0] = mat[12];\n    out[1] = mat[13];\n    out[2] = mat[14];\n    return out;\n}\nfunction getScaling(out, mat) {\n    var m11 = mat[0];\n    var m12 = mat[1];\n    var m13 = mat[2];\n    var m21 = mat[4];\n    var m22 = mat[5];\n    var m23 = mat[6];\n    var m31 = mat[8];\n    var m32 = mat[9];\n    var m33 = mat[10];\n    out[0] = Math.hypot(m11, m12, m13);\n    out[1] = Math.hypot(m21, m22, m23);\n    out[2] = Math.hypot(m31, m32, m33);\n    return out;\n}\nfunction getRotation(out, mat) {\n    var scaling = new _commonJs.ARRAY_TYPE(3);\n    getScaling(scaling, mat);\n    var is1 = 1 / scaling[0];\n    var is2 = 1 / scaling[1];\n    var is3 = 1 / scaling[2];\n    var sm11 = mat[0] * is1;\n    var sm12 = mat[1] * is2;\n    var sm13 = mat[2] * is3;\n    var sm21 = mat[4] * is1;\n    var sm22 = mat[5] * is2;\n    var sm23 = mat[6] * is3;\n    var sm31 = mat[8] * is1;\n    var sm32 = mat[9] * is2;\n    var sm33 = mat[10] * is3;\n    var trace = sm11 + sm22 + sm33;\n    var S = 0;\n    if (trace > 0) {\n        S = Math.sqrt(trace + 1.0) * 2;\n        out[3] = 0.25 * S;\n        out[0] = (sm23 - sm32) / S;\n        out[1] = (sm31 - sm13) / S;\n        out[2] = (sm12 - sm21) / S;\n    } else if (sm11 > sm22 && sm11 > sm33) {\n        S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n        out[3] = (sm23 - sm32) / S;\n        out[0] = 0.25 * S;\n        out[1] = (sm12 + sm21) / S;\n        out[2] = (sm31 + sm13) / S;\n    } else if (sm22 > sm33) {\n        S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n        out[3] = (sm31 - sm13) / S;\n        out[0] = (sm12 + sm21) / S;\n        out[1] = 0.25 * S;\n        out[2] = (sm23 + sm32) / S;\n    } else {\n        S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n        out[3] = (sm12 - sm21) / S;\n        out[0] = (sm31 + sm13) / S;\n        out[1] = (sm23 + sm32) / S;\n        out[2] = 0.25 * S;\n    }\n    return out;\n}\nfunction fromRotationTranslationScale(out, q, v, s) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz = s[2];\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz;\n    out[9] = (yz - wx) * sz;\n    out[10] = (1 - (xx + yy)) * sz;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz = s[2];\n    var ox = o[0];\n    var oy = o[1];\n    var oz = o[2];\n    var out0 = (1 - (yy + zz)) * sx;\n    var out1 = (xy + wz) * sx;\n    var out2 = (xz - wy) * sx;\n    var out4 = (xy - wz) * sy;\n    var out5 = (1 - (xx + zz)) * sy;\n    var out6 = (yz + wx) * sy;\n    var out8 = (xz + wy) * sz;\n    var out9 = (yz - wx) * sz;\n    var out10 = (1 - (xx + yy)) * sz;\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = 0;\n    out[4] = out4;\n    out[5] = out5;\n    out[6] = out6;\n    out[7] = 0;\n    out[8] = out8;\n    out[9] = out9;\n    out[10] = out10;\n    out[11] = 0;\n    out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n    out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n    out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n    out[15] = 1;\n    return out;\n}\nfunction fromQuat(out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var yx = y * x2;\n    var yy = y * y2;\n    var zx = z * x2;\n    var zy = z * y2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction frustum(out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left);\n    var tb = 1 / (top - bottom);\n    var nf = 1 / (near - far);\n    out[0] = near * 2 * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = near * 2 * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = far * near * 2 * nf;\n    out[15] = 0;\n    return out;\n}\nfunction perspectiveNO(out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2), nf;\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n        nf = 1 / (near - far);\n        out[10] = (far + near) * nf;\n        out[14] = 2 * far * near * nf;\n    } else {\n        out[10] = -1;\n        out[14] = -2 * near;\n    }\n    return out;\n}\nvar perspective = perspectiveNO;\nfunction perspectiveZO(out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2), nf;\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n        nf = 1 / (near - far);\n        out[10] = far * nf;\n        out[14] = far * near * nf;\n    } else {\n        out[10] = -1;\n        out[14] = -near;\n    }\n    return out;\n}\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n    var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n    var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n    var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n    var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n    var xScale = 2.0 / (leftTan + rightTan);\n    var yScale = 2.0 / (upTan + downTan);\n    out[0] = xScale;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    out[4] = 0.0;\n    out[5] = yScale;\n    out[6] = 0.0;\n    out[7] = 0.0;\n    out[8] = -((leftTan - rightTan) * xScale * 0.5);\n    out[9] = (upTan - downTan) * yScale * 0.5;\n    out[10] = far / (near - far);\n    out[11] = -1;\n    out[12] = 0.0;\n    out[13] = 0.0;\n    out[14] = far * near / (near - far);\n    out[15] = 0.0;\n    return out;\n}\nfunction orthoNO(out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right);\n    var bt = 1 / (bottom - top);\n    var nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 2 * nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = (far + near) * nf;\n    out[15] = 1;\n    return out;\n}\nvar ortho = orthoNO;\nfunction orthoZO(out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right);\n    var bt = 1 / (bottom - top);\n    var nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = near * nf;\n    out[15] = 1;\n    return out;\n}\nfunction lookAt(out, eye, center, up) {\n    var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n    var eyex = eye[0];\n    var eyey = eye[1];\n    var eyez = eye[2];\n    var upx = up[0];\n    var upy = up[1];\n    var upz = up[2];\n    var centerx = center[0];\n    var centery = center[1];\n    var centerz = center[2];\n    if (Math.abs(eyex - centerx) < _commonJs.EPSILON && Math.abs(eyey - centery) < _commonJs.EPSILON && Math.abs(eyez - centerz) < _commonJs.EPSILON) return identity(out);\n    z0 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n    len = 1 / Math.hypot(z0, z1, z2);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n    x0 = upy * z2 - upz * z1;\n    x1 = upz * z0 - upx * z2;\n    x2 = upx * z1 - upy * z0;\n    len = Math.hypot(x0, x1, x2);\n    if (!len) {\n        x0 = 0;\n        x1 = 0;\n        x2 = 0;\n    } else {\n        len = 1 / len;\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n    y0 = z1 * x2 - z2 * x1;\n    y1 = z2 * x0 - z0 * x2;\n    y2 = z0 * x1 - z1 * x0;\n    len = Math.hypot(y0, y1, y2);\n    if (!len) {\n        y0 = 0;\n        y1 = 0;\n        y2 = 0;\n    } else {\n        len = 1 / len;\n        y0 *= len;\n        y1 *= len;\n        y2 *= len;\n    }\n    out[0] = x0;\n    out[1] = y0;\n    out[2] = z0;\n    out[3] = 0;\n    out[4] = x1;\n    out[5] = y1;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n    out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n    out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n    return out;\n}\nfunction targetTo(out, eye, target, up) {\n    var eyex = eye[0], eyey = eye[1], eyez = eye[2], upx = up[0], upy = up[1], upz = up[2];\n    var z0 = eyex - target[0], z1 = eyey - target[1], z2 = eyez - target[2];\n    var len = z0 * z0 + z1 * z1 + z2 * z2;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        z0 *= len;\n        z1 *= len;\n        z2 *= len;\n    }\n    var x0 = upy * z2 - upz * z1, x1 = upz * z0 - upx * z2, x2 = upx * z1 - upy * z0;\n    len = x0 * x0 + x1 * x1 + x2 * x2;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n    out[0] = x0;\n    out[1] = x1;\n    out[2] = x2;\n    out[3] = 0;\n    out[4] = z1 * x2 - z2 * x1;\n    out[5] = z2 * x0 - z0 * x2;\n    out[6] = z0 * x1 - z1 * x0;\n    out[7] = 0;\n    out[8] = z0;\n    out[9] = z1;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = eyex;\n    out[13] = eyey;\n    out[14] = eyez;\n    out[15] = 1;\n    return out;\n}\nfunction str(a) {\n    return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\nfunction frob(a) {\n    return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    out[9] = a[9] + b[9];\n    out[10] = a[10] + b[10];\n    out[11] = a[11] + b[11];\n    out[12] = a[12] + b[12];\n    out[13] = a[13] + b[13];\n    out[14] = a[14] + b[14];\n    out[15] = a[15] + b[15];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    out[9] = a[9] - b[9];\n    out[10] = a[10] - b[10];\n    out[11] = a[11] - b[11];\n    out[12] = a[12] - b[12];\n    out[13] = a[13] - b[13];\n    out[14] = a[14] - b[14];\n    out[15] = a[15] - b[15];\n    return out;\n}\nfunction multiplyScalar(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    out[9] = a[9] * b;\n    out[10] = a[10] * b;\n    out[11] = a[11] * b;\n    out[12] = a[12] * b;\n    out[13] = a[13] * b;\n    out[14] = a[14] * b;\n    out[15] = a[15] * b;\n    return out;\n}\nfunction multiplyScalarAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    out[2] = a[2] + b[2] * scale1;\n    out[3] = a[3] + b[3] * scale1;\n    out[4] = a[4] + b[4] * scale1;\n    out[5] = a[5] + b[5] * scale1;\n    out[6] = a[6] + b[6] * scale1;\n    out[7] = a[7] + b[7] * scale1;\n    out[8] = a[8] + b[8] * scale1;\n    out[9] = a[9] + b[9] * scale1;\n    out[10] = a[10] + b[10] * scale1;\n    out[11] = a[11] + b[11] * scale1;\n    out[12] = a[12] + b[12] * scale1;\n    out[13] = a[13] + b[13] * scale1;\n    out[14] = a[14] + b[14] * scale1;\n    out[15] = a[15] + b[15] * scale1;\n    return out;\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7];\n    var a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11];\n    var a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    var b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7];\n    var b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11];\n    var b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\nvar mul = multiply;\nvar sub = subtract;\n\n},{\"./common.js\":\"hhmSF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9M1lU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 4 Dimensional Vector\n * @module vec4\n */ /**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"divide\", ()=>divide);\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"ceil\", ()=>ceil);\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"floor\", ()=>floor);\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"min\", ()=>min);\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"max\", ()=>max);\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"round\", ()=>round);\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"scaleAndAdd\", ()=>scaleAndAdd);\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */ parcelHelpers.export(exports, \"distance\", ()=>distance);\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */ parcelHelpers.export(exports, \"squaredDistance\", ()=>squaredDistance);\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */ parcelHelpers.export(exports, \"length\", ()=>length);\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */ parcelHelpers.export(exports, \"squaredLength\", ()=>squaredLength);\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"negate\", ()=>negate);\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"inverse\", ()=>inverse);\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"normalize\", ()=>normalize);\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */ parcelHelpers.export(exports, \"dot\", ()=>dot);\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */ parcelHelpers.export(exports, \"cross\", ()=>cross);\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"lerp\", ()=>lerp);\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"random\", ()=>random);\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"transformMat4\", ()=>transformMat4);\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"transformQuat\", ()=>transformQuat);\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"zero\", ()=>zero);\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"div\", ()=>div);\nparcelHelpers.export(exports, \"dist\", ()=>dist);\nparcelHelpers.export(exports, \"sqrDist\", ()=>sqrDist);\nparcelHelpers.export(exports, \"len\", ()=>len);\nparcelHelpers.export(exports, \"sqrLen\", ()=>sqrLen);\nparcelHelpers.export(exports, \"forEach\", ()=>forEach);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(4);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n    }\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction fromValues(x, y, z, w) {\n    var out = new _commonJs.ARRAY_TYPE(4);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction set(out, x, y, z, w) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n}\nfunction multiply(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    out[3] = a[3] * b[3];\n    return out;\n}\nfunction divide(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    out[3] = a[3] / b[3];\n    return out;\n}\nfunction ceil(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    out[3] = Math.ceil(a[3]);\n    return out;\n}\nfunction floor(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    out[3] = Math.floor(a[3]);\n    return out;\n}\nfunction min(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    out[3] = Math.min(a[3], b[3]);\n    return out;\n}\nfunction max(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    out[3] = Math.max(a[3], b[3]);\n    return out;\n}\nfunction round(out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    out[3] = Math.round(a[3]);\n    return out;\n}\nfunction scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n}\nfunction scaleAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    out[2] = a[2] + b[2] * scale1;\n    out[3] = a[3] + b[3] * scale1;\n    return out;\n}\nfunction distance(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    var w = b[3] - a[3];\n    return Math.hypot(x, y, z, w);\n}\nfunction squaredDistance(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    var w = b[3] - a[3];\n    return x * x + y * y + z * z + w * w;\n}\nfunction length(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    return Math.hypot(x, y, z, w);\n}\nfunction squaredLength(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    return x * x + y * y + z * z + w * w;\n}\nfunction negate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = -a[3];\n    return out;\n}\nfunction inverse(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    out[2] = 1.0 / a[2];\n    out[3] = 1.0 / a[3];\n    return out;\n}\nfunction normalize(out, a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    var len1 = x * x + y * y + z * z + w * w;\n    if (len1 > 0) len1 = 1 / Math.sqrt(len1);\n    out[0] = x * len1;\n    out[1] = y * len1;\n    out[2] = z * len1;\n    out[3] = w * len1;\n    return out;\n}\nfunction dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\nfunction cross(out, u, v, w) {\n    var A = v[0] * w[1] - v[1] * w[0], B = v[0] * w[2] - v[2] * w[0], C = v[0] * w[3] - v[3] * w[0], D = v[1] * w[2] - v[2] * w[1], E = v[1] * w[3] - v[3] * w[1], F = v[2] * w[3] - v[3] * w[2];\n    var G = u[0];\n    var H = u[1];\n    var I = u[2];\n    var J = u[3];\n    out[0] = H * F - I * E + J * D;\n    out[1] = -(G * F) + I * C - J * B;\n    out[2] = G * E - H * C + J * A;\n    out[3] = -(G * D) + H * B - I * A;\n    return out;\n}\nfunction lerp(out, a, b, t) {\n    var ax = a[0];\n    var ay = a[1];\n    var az = a[2];\n    var aw = a[3];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    out[3] = aw + t * (b[3] - aw);\n    return out;\n}\nfunction random(out, scale2) {\n    scale2 = scale2 || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n    // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n    // http://projecteuclid.org/euclid.aoms/1177692644;\n    var v1, v2, v3, v4;\n    var s1, s2;\n    do {\n        v1 = _commonJs.RANDOM() * 2 - 1;\n        v2 = _commonJs.RANDOM() * 2 - 1;\n        s1 = v1 * v1 + v2 * v2;\n    }while (s1 >= 1);\n    do {\n        v3 = _commonJs.RANDOM() * 2 - 1;\n        v4 = _commonJs.RANDOM() * 2 - 1;\n        s2 = v3 * v3 + v4 * v4;\n    }while (s2 >= 1);\n    var d = Math.sqrt((1 - s1) / s2);\n    out[0] = scale2 * v1;\n    out[1] = scale2 * v2;\n    out[2] = scale2 * v3 * d;\n    out[3] = scale2 * v4 * d;\n    return out;\n}\nfunction transformMat4(out, a, m) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n    out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n    out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n    out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n    return out;\n}\nfunction transformQuat(out, a, q) {\n    var x = a[0], y = a[1], z = a[2];\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; // calculate quat * vec\n    var ix = qw * x + qy * z - qz * y;\n    var iy = qw * y + qz * x - qx * z;\n    var iz = qw * z + qx * y - qy * x;\n    var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    out[3] = a[3];\n    return out;\n}\nfunction zero(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    return out;\n}\nfunction str(a) {\n    return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\nvar sub = subtract;\nvar mul = multiply;\nvar div = divide;\nvar dist = distance;\nvar sqrDist = squaredDistance;\nvar len = length;\nvar sqrLen = squaredLength;\nvar forEach = function() {\n    var vec = create();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 4;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            vec[2] = a[i + 2];\n            vec[3] = a[i + 3];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n            a[i + 2] = vec[2];\n            a[i + 3] = vec[3];\n        }\n        return a;\n    };\n}();\n\n},{\"./common.js\":\"hhmSF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aqPwo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathArray = require(\"./base/math-array\");\nvar _mathArrayDefault = parcelHelpers.interopDefault(_mathArray);\nvar _validators = require(\"../lib/validators\");\nvar _vector4 = require(\"./vector4\");\nvar _vector4Default = parcelHelpers.interopDefault(_vector4);\nvar _quat = require(\"gl-matrix/quat\");\nvar _vec4 = require(\"gl-matrix/vec4\");\nconst IDENTITY_QUATERNION = [\n    0,\n    0,\n    0,\n    1\n];\nclass Quaternion extends (0, _mathArrayDefault.default) {\n    constructor(x = 0, y = 0, z = 0, w = 1){\n        super(-0, -0, -0, -0);\n        if (Array.isArray(x) && arguments.length === 1) this.copy(x);\n        else this.set(x, y, z, w);\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = array[3];\n        return this.check();\n    }\n    set(x, y, z, w) {\n        this[0] = x;\n        this[1] = y;\n        this[2] = z;\n        this[3] = w;\n        return this.check();\n    }\n    fromObject(object) {\n        this[0] = object.x;\n        this[1] = object.y;\n        this[2] = object.z;\n        this[3] = object.w;\n        return this.check();\n    }\n    fromMatrix3(m) {\n        _quat.fromMat3(this, m);\n        return this.check();\n    }\n    fromAxisRotation(axis, rad) {\n        _quat.setAxisAngle(this, axis, rad);\n        return this.check();\n    }\n    identity() {\n        _quat.identity(this);\n        return this.check();\n    }\n    setAxisAngle(axis, rad) {\n        return this.fromAxisRotation(axis, rad);\n    }\n    get ELEMENTS() {\n        return 4;\n    }\n    get x() {\n        return this[0];\n    }\n    set x(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get y() {\n        return this[1];\n    }\n    set y(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get z() {\n        return this[2];\n    }\n    set z(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get w() {\n        return this[3];\n    }\n    set w(value) {\n        this[3] = (0, _validators.checkNumber)(value);\n    }\n    len() {\n        return _quat.length(this);\n    }\n    lengthSquared() {\n        return _quat.squaredLength(this);\n    }\n    dot(a) {\n        return _quat.dot(this, a);\n    }\n    rotationTo(vectorA, vectorB) {\n        _quat.rotationTo(this, vectorA, vectorB);\n        return this.check();\n    }\n    add(a) {\n        _quat.add(this, this, a);\n        return this.check();\n    }\n    calculateW() {\n        _quat.calculateW(this, this);\n        return this.check();\n    }\n    conjugate() {\n        _quat.conjugate(this, this);\n        return this.check();\n    }\n    invert() {\n        _quat.invert(this, this);\n        return this.check();\n    }\n    lerp(a, b, t) {\n        if (t === undefined) return this.lerp(this, a, b);\n        _quat.lerp(this, a, b, t);\n        return this.check();\n    }\n    multiplyRight(a) {\n        _quat.multiply(this, this, a);\n        return this.check();\n    }\n    multiplyLeft(a) {\n        _quat.multiply(this, a, this);\n        return this.check();\n    }\n    normalize() {\n        const length = this.len();\n        const l = length > 0 ? 1 / length : 0;\n        this[0] = this[0] * l;\n        this[1] = this[1] * l;\n        this[2] = this[2] * l;\n        this[3] = this[3] * l;\n        if (length === 0) this[3] = 1;\n        return this.check();\n    }\n    rotateX(rad) {\n        _quat.rotateX(this, this, rad);\n        return this.check();\n    }\n    rotateY(rad) {\n        _quat.rotateY(this, this, rad);\n        return this.check();\n    }\n    rotateZ(rad) {\n        _quat.rotateZ(this, this, rad);\n        return this.check();\n    }\n    scale(b) {\n        _quat.scale(this, this, b);\n        return this.check();\n    }\n    slerp(arg0, arg1, arg2) {\n        let start;\n        let target;\n        let ratio;\n        switch(arguments.length){\n            case 1:\n                ({ start =IDENTITY_QUATERNION , target , ratio  } = arg0);\n                break;\n            case 2:\n                start = this;\n                target = arg0;\n                ratio = arg1;\n                break;\n            default:\n                start = arg0;\n                target = arg1;\n                ratio = arg2;\n        }\n        _quat.slerp(this, start, target, ratio);\n        return this.check();\n    }\n    transformVector4(vector, result = new (0, _vector4Default.default)()) {\n        _vec4.transformQuat(result, vector, this);\n        return (0, _validators.checkVector)(result, 4);\n    }\n    lengthSq() {\n        return this.lengthSquared();\n    }\n    setFromAxisAngle(axis, rad) {\n        return this.setAxisAngle(axis, rad);\n    }\n    premultiply(a) {\n        return this.multiplyLeft(a);\n    }\n    multiply(a) {\n        return this.multiplyRight(a);\n    }\n}\nexports.default = Quaternion;\n\n},{\"./base/math-array\":\"egSnj\",\"../lib/validators\":\"d22Rk\",\"./vector4\":\"aGglC\",\"gl-matrix/quat\":\"fP1XZ\",\"gl-matrix/vec4\":\"9M1lU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fP1XZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Quaternion\n * @module quat\n */ /**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"identity\", ()=>identity);\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/ parcelHelpers.export(exports, \"setAxisAngle\", ()=>setAxisAngle);\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @param  {ReadonlyQuat} q     Quaternion to be decomposed\n * @return {Number}     Angle, in radians, of the rotation\n */ parcelHelpers.export(exports, \"getAxisAngle\", ()=>getAxisAngle);\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param  {ReadonlyQuat} a     Origin unit quaternion\n * @param  {ReadonlyQuat} b     Destination unit quaternion\n * @return {Number}     Angle, in radians, between the two quaternions\n */ parcelHelpers.export(exports, \"getAngle\", ()=>getAngle);\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"rotateX\", ()=>rotateX);\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"rotateY\", ()=>rotateY);\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"rotateZ\", ()=>rotateZ);\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"calculateW\", ()=>calculateW);\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"exp\", ()=>exp);\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"ln\", ()=>ln);\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"pow\", ()=>pow);\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"slerp\", ()=>slerp);\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"random\", ()=>random);\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"invert\", ()=>invert);\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"conjugate\", ()=>conjugate);\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */ parcelHelpers.export(exports, \"fromMat3\", ()=>fromMat3);\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */ parcelHelpers.export(exports, \"fromEuler\", ()=>fromEuler);\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */ parcelHelpers.export(exports, \"str\", ()=>str);\nparcelHelpers.export(exports, \"clone\", ()=>clone);\nparcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"set\", ()=>set);\nparcelHelpers.export(exports, \"add\", ()=>add);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"scale\", ()=>scale);\nparcelHelpers.export(exports, \"dot\", ()=>dot);\nparcelHelpers.export(exports, \"lerp\", ()=>lerp);\nparcelHelpers.export(exports, \"length\", ()=>length);\nparcelHelpers.export(exports, \"len\", ()=>len);\nparcelHelpers.export(exports, \"squaredLength\", ()=>squaredLength);\nparcelHelpers.export(exports, \"sqrLen\", ()=>sqrLen);\nparcelHelpers.export(exports, \"normalize\", ()=>normalize);\nparcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\nparcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"rotationTo\", ()=>rotationTo);\nparcelHelpers.export(exports, \"sqlerp\", ()=>sqlerp);\nparcelHelpers.export(exports, \"setAxes\", ()=>setAxes);\nvar _commonJs = require(\"./common.js\");\nvar _mat3Js = require(\"./mat3.js\");\nvar _vec3Js = require(\"./vec3.js\");\nvar _vec4Js = require(\"./vec4.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(4);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n    }\n    out[3] = 1;\n    return out;\n}\nfunction identity(out) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n}\nfunction setAxisAngle(out, axis, rad) {\n    rad = rad * 0.5;\n    var s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n}\nfunction getAxisAngle(out_axis, q) {\n    var rad = Math.acos(q[3]) * 2.0;\n    var s = Math.sin(rad / 2.0);\n    if (s > _commonJs.EPSILON) {\n        out_axis[0] = q[0] / s;\n        out_axis[1] = q[1] / s;\n        out_axis[2] = q[2] / s;\n    } else {\n        // If s is zero, return any axis (no rotation - axis does not matter)\n        out_axis[0] = 1;\n        out_axis[1] = 0;\n        out_axis[2] = 0;\n    }\n    return rad;\n}\nfunction getAngle(a, b) {\n    var dotproduct = dot(a, b);\n    return Math.acos(2 * dotproduct * dotproduct - 1);\n}\nfunction multiply(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = b[0], by = b[1], bz = b[2], bw = b[3];\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n}\nfunction rotateX(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n}\nfunction rotateY(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var by = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n}\nfunction rotateZ(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bz = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + ay * bz;\n    out[1] = ay * bw - ax * bz;\n    out[2] = az * bw + aw * bz;\n    out[3] = aw * bw - az * bz;\n    return out;\n}\nfunction calculateW(out, a) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n    return out;\n}\nfunction exp(out, a) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    var r = Math.sqrt(x * x + y * y + z * z);\n    var et = Math.exp(w);\n    var s = r > 0 ? et * Math.sin(r) / r : 0;\n    out[0] = x * s;\n    out[1] = y * s;\n    out[2] = z * s;\n    out[3] = et * Math.cos(r);\n    return out;\n}\nfunction ln(out, a) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    var r = Math.sqrt(x * x + y * y + z * z);\n    var t = r > 0 ? Math.atan2(r, w) / r : 0;\n    out[0] = x * t;\n    out[1] = y * t;\n    out[2] = z * t;\n    out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n    return out;\n}\nfunction pow(out, a, b) {\n    ln(out, a);\n    scale(out, out, b);\n    exp(out, out);\n    return out;\n}\nfunction slerp(out, a, b, t) {\n    // benchmarks:\n    //    http://jsperf.com/quaternion-slerp-implementations\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = b[0], by = b[1], bz = b[2], bw = b[3];\n    var omega, cosom, sinom, scale0, scale1; // calc cosine\n    cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n    if (cosom < 0.0) {\n        cosom = -cosom;\n        bx = -bx;\n        by = -by;\n        bz = -bz;\n        bw = -bw;\n    } // calculate coefficients\n    if (1.0 - cosom > _commonJs.EPSILON) {\n        // standard case (slerp)\n        omega = Math.acos(cosom);\n        sinom = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n    } else {\n        // \"from\" and \"to\" quaternions are very close\n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n    } // calculate final values\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    return out;\n}\nfunction random(out) {\n    // Implementation of http://planning.cs.uiuc.edu/node198.html\n    // TODO: Calling random 3 times is probably not the fastest solution\n    var u1 = _commonJs.RANDOM();\n    var u2 = _commonJs.RANDOM();\n    var u3 = _commonJs.RANDOM();\n    var sqrt1MinusU1 = Math.sqrt(1 - u1);\n    var sqrtU1 = Math.sqrt(u1);\n    out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n    out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n    out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n    out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n    return out;\n}\nfunction invert(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var dot1 = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n    var invDot = dot1 ? 1.0 / dot1 : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n    out[0] = -a0 * invDot;\n    out[1] = -a1 * invDot;\n    out[2] = -a2 * invDot;\n    out[3] = a3 * invDot;\n    return out;\n}\nfunction conjugate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction fromMat3(out, m) {\n    // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n    // article \"Quaternion Calculus and Fast Animation\".\n    var fTrace = m[0] + m[4] + m[8];\n    var fRoot;\n    if (fTrace > 0.0) {\n        // |w| > 1/2, may as well choose w > 1/2\n        fRoot = Math.sqrt(fTrace + 1.0); // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot; // 1/(4w)\n        out[0] = (m[5] - m[7]) * fRoot;\n        out[1] = (m[6] - m[2]) * fRoot;\n        out[2] = (m[1] - m[3]) * fRoot;\n    } else {\n        // |w| <= 1/2\n        var i = 0;\n        if (m[4] > m[0]) i = 1;\n        if (m[8] > m[i * 3 + i]) i = 2;\n        var j = (i + 1) % 3;\n        var k = (i + 2) % 3;\n        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n    }\n    return out;\n}\nfunction fromEuler(out, x, y, z) {\n    var halfToRad = 0.5 * Math.PI / 180.0;\n    x *= halfToRad;\n    y *= halfToRad;\n    z *= halfToRad;\n    var sx = Math.sin(x);\n    var cx = Math.cos(x);\n    var sy = Math.sin(y);\n    var cy = Math.cos(y);\n    var sz = Math.sin(z);\n    var cz = Math.cos(z);\n    out[0] = sx * cy * cz - cx * sy * sz;\n    out[1] = cx * sy * cz + sx * cy * sz;\n    out[2] = cx * cy * sz - sx * sy * cz;\n    out[3] = cx * cy * cz + sx * sy * sz;\n    return out;\n}\nfunction str(a) {\n    return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\nvar clone = _vec4Js.clone;\nvar fromValues = _vec4Js.fromValues;\nvar copy = _vec4Js.copy;\nvar set = _vec4Js.set;\nvar add = _vec4Js.add;\nvar mul = multiply;\nvar scale = _vec4Js.scale;\nvar dot = _vec4Js.dot;\nvar lerp = _vec4Js.lerp;\nvar length = _vec4Js.length;\nvar len = length;\nvar squaredLength = _vec4Js.squaredLength;\nvar sqrLen = squaredLength;\nvar normalize = _vec4Js.normalize;\nvar exactEquals = _vec4Js.exactEquals;\nvar equals = _vec4Js.equals;\nvar rotationTo = function() {\n    var tmpvec3 = _vec3Js.create();\n    var xUnitVec3 = _vec3Js.fromValues(1, 0, 0);\n    var yUnitVec3 = _vec3Js.fromValues(0, 1, 0);\n    return function(out, a, b) {\n        var dot2 = _vec3Js.dot(a, b);\n        if (dot2 < -0.999999) {\n            _vec3Js.cross(tmpvec3, xUnitVec3, a);\n            if (_vec3Js.len(tmpvec3) < 0.000001) _vec3Js.cross(tmpvec3, yUnitVec3, a);\n            _vec3Js.normalize(tmpvec3, tmpvec3);\n            setAxisAngle(out, tmpvec3, Math.PI);\n            return out;\n        } else if (dot2 > 0.999999) {\n            out[0] = 0;\n            out[1] = 0;\n            out[2] = 0;\n            out[3] = 1;\n            return out;\n        } else {\n            _vec3Js.cross(tmpvec3, a, b);\n            out[0] = tmpvec3[0];\n            out[1] = tmpvec3[1];\n            out[2] = tmpvec3[2];\n            out[3] = 1 + dot2;\n            return normalize(out, out);\n        }\n    };\n}();\nvar sqlerp = function() {\n    var temp1 = create();\n    var temp2 = create();\n    return function(out, a, b, c, d, t) {\n        slerp(temp1, a, d, t);\n        slerp(temp2, b, c, t);\n        slerp(out, temp1, temp2, 2 * t * (1 - t));\n        return out;\n    };\n}();\nvar setAxes = function() {\n    var matr = _mat3Js.create();\n    return function(out, view, right, up) {\n        matr[0] = right[0];\n        matr[3] = right[1];\n        matr[6] = right[2];\n        matr[1] = up[0];\n        matr[4] = up[1];\n        matr[7] = up[2];\n        matr[2] = -view[0];\n        matr[5] = -view[1];\n        matr[8] = -view[2];\n        return normalize(out, fromMat3(out, matr));\n    };\n}();\n\n},{\"./common.js\":\"hhmSF\",\"./mat3.js\":\"hz4Zv\",\"./vec3.js\":\"4RBb8\",\"./vec4.js\":\"9M1lU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8neBt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _vector3 = require(\"./vector3\");\nvar _vector3Default = parcelHelpers.interopDefault(_vector3);\nvar _common = require(\"../lib/common\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nconst EPSILON = 0.000001;\nconst EARTH_RADIUS_METERS = 6371000;\nclass SphericalCoordinates {\n    constructor({ phi =0 , theta =0 , radius =1 , bearing , pitch , altitude , radiusScale =EARTH_RADIUS_METERS  } = {}){\n        (0, _definePropertyDefault.default)(this, \"phi\", void 0);\n        (0, _definePropertyDefault.default)(this, \"theta\", void 0);\n        (0, _definePropertyDefault.default)(this, \"radius\", void 0);\n        (0, _definePropertyDefault.default)(this, \"radiusScale\", void 0);\n        this.phi = phi;\n        this.theta = theta;\n        this.radius = radius || altitude || 1;\n        this.radiusScale = radiusScale || 1;\n        if (bearing !== undefined) this.bearing = bearing;\n        if (pitch !== undefined) this.pitch = pitch;\n        this.check();\n    }\n    toString() {\n        return this.formatString((0, _common.config));\n    }\n    formatString({ printTypes =false  }) {\n        const f = (0, _common.formatValue);\n        return \"\".concat(printTypes ? \"Spherical\" : \"\", \"[rho:\").concat(f(this.radius), \",theta:\").concat(f(this.theta), \",phi:\").concat(f(this.phi), \"]\");\n    }\n    equals(other) {\n        return (0, _common.equals)(this.radius, other.radius) && (0, _common.equals)(this.theta, other.theta) && (0, _common.equals)(this.phi, other.phi);\n    }\n    exactEquals(other) {\n        return this.radius === other.radius && this.theta === other.theta && this.phi === other.phi;\n    }\n    get bearing() {\n        return 180 - (0, _common.degrees)(this.phi);\n    }\n    set bearing(v) {\n        this.phi = Math.PI - (0, _common.radians)(v);\n    }\n    get pitch() {\n        return (0, _common.degrees)(this.theta);\n    }\n    set pitch(v) {\n        this.theta = (0, _common.radians)(v);\n    }\n    get longitude() {\n        return (0, _common.degrees)(this.phi);\n    }\n    get latitude() {\n        return (0, _common.degrees)(this.theta);\n    }\n    get lng() {\n        return (0, _common.degrees)(this.phi);\n    }\n    get lat() {\n        return (0, _common.degrees)(this.theta);\n    }\n    get z() {\n        return (this.radius - 1) * this.radiusScale;\n    }\n    set(radius, phi, theta) {\n        this.radius = radius;\n        this.phi = phi;\n        this.theta = theta;\n        return this.check();\n    }\n    clone() {\n        return new SphericalCoordinates().copy(this);\n    }\n    copy(other) {\n        this.radius = other.radius;\n        this.phi = other.phi;\n        this.theta = other.theta;\n        return this.check();\n    }\n    fromLngLatZ([lng, lat, z]) {\n        this.radius = 1 + z / this.radiusScale;\n        this.phi = (0, _common.radians)(lat);\n        this.theta = (0, _common.radians)(lng);\n        return this.check();\n    }\n    fromVector3(v) {\n        this.radius = _vec3.length(v);\n        if (this.radius > 0) {\n            this.theta = Math.atan2(v[0], v[1]);\n            this.phi = Math.acos((0, _common.clamp)(v[2] / this.radius, -1, 1));\n        }\n        return this.check();\n    }\n    toVector3() {\n        return new (0, _vector3Default.default)(0, 0, this.radius).rotateX({\n            radians: this.theta\n        }).rotateZ({\n            radians: this.phi\n        });\n    }\n    makeSafe() {\n        this.phi = Math.max(EPSILON, Math.min(Math.PI - EPSILON, this.phi));\n        return this;\n    }\n    check() {\n        if (!Number.isFinite(this.phi) || !Number.isFinite(this.theta) || !(this.radius > 0)) throw new Error(\"SphericalCoordinates: some fields set to invalid numbers\");\n        return this;\n    }\n}\nexports.default = SphericalCoordinates;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"./vector3\":\"2rssO\",\"../lib/common\":\"4ZtWf\",\"gl-matrix/vec3\":\"4RBb8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"36V36\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _matrix4 = require(\"./matrix4\");\nvar _matrix4Default = parcelHelpers.interopDefault(_matrix4);\nvar _vector3 = require(\"./vector3\");\nvar _vector3Default = parcelHelpers.interopDefault(_vector3);\nvar _euler = require(\"./euler\");\nvar _eulerDefault = parcelHelpers.interopDefault(_euler);\nclass Pose {\n    constructor({ x =0 , y =0 , z =0 , roll =0 , pitch =0 , yaw =0 , position , orientation  } = {}){\n        (0, _definePropertyDefault.default)(this, \"position\", void 0);\n        (0, _definePropertyDefault.default)(this, \"orientation\", void 0);\n        if (Array.isArray(position) && position.length === 3) this.position = new (0, _vector3Default.default)(position);\n        else this.position = new (0, _vector3Default.default)(x, y, z);\n        if (Array.isArray(orientation) && orientation.length === 4) this.orientation = new (0, _eulerDefault.default)(orientation, orientation[3]);\n        else this.orientation = new (0, _eulerDefault.default)(roll, pitch, yaw, (0, _eulerDefault.default).RollPitchYaw);\n    }\n    get x() {\n        return this.position.x;\n    }\n    set x(value) {\n        this.position.x = value;\n    }\n    get y() {\n        return this.position.y;\n    }\n    set y(value) {\n        this.position.y = value;\n    }\n    get z() {\n        return this.position.z;\n    }\n    set z(value) {\n        this.position.z = value;\n    }\n    get roll() {\n        return this.orientation.roll;\n    }\n    set roll(value) {\n        this.orientation.roll = value;\n    }\n    get pitch() {\n        return this.orientation.pitch;\n    }\n    set pitch(value) {\n        this.orientation.pitch = value;\n    }\n    get yaw() {\n        return this.orientation.yaw;\n    }\n    set yaw(value) {\n        this.orientation.yaw = value;\n    }\n    getPosition() {\n        return this.position;\n    }\n    getOrientation() {\n        return this.orientation;\n    }\n    equals(pose) {\n        if (!pose) return false;\n        return this.position.equals(pose.position) && this.orientation.equals(pose.orientation);\n    }\n    exactEquals(pose) {\n        if (!pose) return false;\n        return this.position.exactEquals(pose.position) && this.orientation.exactEquals(pose.orientation);\n    }\n    getTransformationMatrix() {\n        const sr = Math.sin(this.roll);\n        const sp = Math.sin(this.pitch);\n        const sw = Math.sin(this.yaw);\n        const cr = Math.cos(this.roll);\n        const cp = Math.cos(this.pitch);\n        const cw = Math.cos(this.yaw);\n        return new (0, _matrix4Default.default)().setRowMajor(cw * cp, -sw * cr + cw * sp * sr, sw * sr + cw * sp * cr, this.x, sw * cp, cw * cr + sw * sp * sr, -cw * sr + sw * sp * cr, this.y, -sp, cp * sr, cp * cr, this.z, 0, 0, 0, 1);\n    }\n    getTransformationMatrixFromPose(pose) {\n        return new (0, _matrix4Default.default)().multiplyRight(this.getTransformationMatrix()).multiplyRight(pose.getTransformationMatrix().invert());\n    }\n    getTransformationMatrixToPose(pose) {\n        return new (0, _matrix4Default.default)().multiplyRight(pose.getTransformationMatrix()).multiplyRight(this.getTransformationMatrix().invert());\n    }\n}\nexports.default = Pose;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"./matrix4\":\"lSk58\",\"./vector3\":\"2rssO\",\"./euler\":\"52LUF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"52LUF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathArray = require(\"./base/math-array\");\nvar _mathArrayDefault = parcelHelpers.interopDefault(_mathArray);\nvar _quaternion = require(\"./quaternion\");\nvar _quaternionDefault = parcelHelpers.interopDefault(_quaternion);\nvar _common = require(\"../lib/common\");\nvar _validators = require(\"../lib/validators\");\nconst ERR_UNKNOWN_ORDER = \"Unknown Euler angle order\";\nconst ALMOST_ONE = 0.99999;\nvar RotationOrder;\n(function(RotationOrder1) {\n    RotationOrder1[RotationOrder1[\"ZYX\"] = 0] = \"ZYX\";\n    RotationOrder1[RotationOrder1[\"YXZ\"] = 1] = \"YXZ\";\n    RotationOrder1[RotationOrder1[\"XZY\"] = 2] = \"XZY\";\n    RotationOrder1[RotationOrder1[\"ZXY\"] = 3] = \"ZXY\";\n    RotationOrder1[RotationOrder1[\"YZX\"] = 4] = \"YZX\";\n    RotationOrder1[RotationOrder1[\"XYZ\"] = 5] = \"XYZ\";\n})(RotationOrder || (RotationOrder = {}));\nclass Euler extends (0, _mathArrayDefault.default) {\n    static get ZYX() {\n        return RotationOrder.ZYX;\n    }\n    static get YXZ() {\n        return RotationOrder.YXZ;\n    }\n    static get XZY() {\n        return RotationOrder.XZY;\n    }\n    static get ZXY() {\n        return RotationOrder.ZXY;\n    }\n    static get YZX() {\n        return RotationOrder.YZX;\n    }\n    static get XYZ() {\n        return RotationOrder.XYZ;\n    }\n    static get RollPitchYaw() {\n        return RotationOrder.ZYX;\n    }\n    static get DefaultOrder() {\n        return RotationOrder.ZYX;\n    }\n    static get RotationOrders() {\n        return RotationOrder;\n    }\n    static rotationOrder(order) {\n        return RotationOrder[order];\n    }\n    get ELEMENTS() {\n        return 4;\n    }\n    constructor(x = 0, y = 0, z = 0, order = Euler.DefaultOrder){\n        super(-0, -0, -0, -0);\n        if (arguments.length > 0 && Array.isArray(arguments[0])) this.fromVector3(...arguments);\n        else this.set(x, y, z, order);\n    }\n    fromQuaternion(quaternion) {\n        const [x, y, z, w] = quaternion;\n        const ysqr = y * y;\n        const t0 = -2 * (ysqr + z * z) + 1;\n        const t1 = 2 * (x * y + w * z);\n        let t2 = -2 * (x * z - w * y);\n        const t3 = 2 * (y * z + w * x);\n        const t4 = -2 * (x * x + ysqr) + 1;\n        t2 = t2 > 1 ? 1 : t2;\n        t2 = t2 < -1 ? -1 : t2;\n        const roll = Math.atan2(t3, t4);\n        const pitch = Math.asin(t2);\n        const yaw = Math.atan2(t1, t0);\n        return this.set(roll, pitch, yaw, Euler.RollPitchYaw);\n    }\n    fromObject(object) {\n        throw new Error(\"not implemented\");\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = Number.isFinite(array[3]) || this.order;\n        return this.check();\n    }\n    set(x = 0, y = 0, z = 0, order) {\n        this[0] = x;\n        this[1] = y;\n        this[2] = z;\n        this[3] = Number.isFinite(order) ? order : this[3];\n        return this.check();\n    }\n    validate() {\n        return validateOrder(this[3]) && Number.isFinite(this[0]) && Number.isFinite(this[1]) && Number.isFinite(this[2]);\n    }\n    toArray(array = [], offset = 0) {\n        array[offset] = this[0];\n        array[offset + 1] = this[1];\n        array[offset + 2] = this[2];\n        return array;\n    }\n    toArray4(array = [], offset = 0) {\n        array[offset] = this[0];\n        array[offset + 1] = this[1];\n        array[offset + 2] = this[2];\n        array[offset + 3] = this[3];\n        return array;\n    }\n    toVector3(result = [\n        -0,\n        -0,\n        -0\n    ]) {\n        result[0] = this[0];\n        result[1] = this[1];\n        result[2] = this[2];\n        return result;\n    }\n    get x() {\n        return this[0];\n    }\n    set x(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get y() {\n        return this[1];\n    }\n    set y(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get z() {\n        return this[2];\n    }\n    set z(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get alpha() {\n        return this[0];\n    }\n    set alpha(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get beta() {\n        return this[1];\n    }\n    set beta(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get gamma() {\n        return this[2];\n    }\n    set gamma(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get phi() {\n        return this[0];\n    }\n    set phi(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get theta() {\n        return this[1];\n    }\n    set theta(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get psi() {\n        return this[2];\n    }\n    set psi(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get roll() {\n        return this[0];\n    }\n    set roll(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get pitch() {\n        return this[1];\n    }\n    set pitch(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get yaw() {\n        return this[2];\n    }\n    set yaw(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get order() {\n        return this[3];\n    }\n    set order(value) {\n        this[3] = checkOrder(value);\n    }\n    fromVector3(v, order) {\n        return this.set(v[0], v[1], v[2], Number.isFinite(order) ? order : this[3]);\n    }\n    fromArray(array, offset = 0) {\n        this[0] = array[0 + offset];\n        this[1] = array[1 + offset];\n        this[2] = array[2 + offset];\n        if (array[3] !== undefined) this[3] = array[3];\n        return this.check();\n    }\n    fromRollPitchYaw(roll, pitch, yaw) {\n        return this.set(roll, pitch, yaw, RotationOrder.ZYX);\n    }\n    fromRotationMatrix(m, order = Euler.DefaultOrder) {\n        this._fromRotationMatrix(m, order);\n        return this.check();\n    }\n    getRotationMatrix(m) {\n        return this._getRotationMatrix(m);\n    }\n    getQuaternion() {\n        const q = new (0, _quaternionDefault.default)();\n        switch(this[4]){\n            case RotationOrder.XYZ:\n                return q.rotateX(this[0]).rotateY(this[1]).rotateZ(this[2]);\n            case RotationOrder.YXZ:\n                return q.rotateY(this[0]).rotateX(this[1]).rotateZ(this[2]);\n            case RotationOrder.ZXY:\n                return q.rotateZ(this[0]).rotateX(this[1]).rotateY(this[2]);\n            case RotationOrder.ZYX:\n                return q.rotateZ(this[0]).rotateY(this[1]).rotateX(this[2]);\n            case RotationOrder.YZX:\n                return q.rotateY(this[0]).rotateZ(this[1]).rotateX(this[2]);\n            case RotationOrder.XZY:\n                return q.rotateX(this[0]).rotateZ(this[1]).rotateY(this[2]);\n            default:\n                throw new Error(ERR_UNKNOWN_ORDER);\n        }\n    }\n    _fromRotationMatrix(m, order = Euler.DefaultOrder) {\n        const m11 = m[0], m12 = m[4], m13 = m[8];\n        const m21 = m[1], m22 = m[5], m23 = m[9];\n        const m31 = m[2], m32 = m[6], m33 = m[10];\n        order = order || this[3];\n        switch(order){\n            case Euler.XYZ:\n                this[1] = Math.asin((0, _common.clamp)(m13, -1, 1));\n                if (Math.abs(m13) < ALMOST_ONE) {\n                    this[0] = Math.atan2(-m23, m33);\n                    this[2] = Math.atan2(-m12, m11);\n                } else {\n                    this[0] = Math.atan2(m32, m22);\n                    this[2] = 0;\n                }\n                break;\n            case Euler.YXZ:\n                this[0] = Math.asin(-(0, _common.clamp)(m23, -1, 1));\n                if (Math.abs(m23) < ALMOST_ONE) {\n                    this[1] = Math.atan2(m13, m33);\n                    this[2] = Math.atan2(m21, m22);\n                } else {\n                    this[1] = Math.atan2(-m31, m11);\n                    this[2] = 0;\n                }\n                break;\n            case Euler.ZXY:\n                this[0] = Math.asin((0, _common.clamp)(m32, -1, 1));\n                if (Math.abs(m32) < ALMOST_ONE) {\n                    this[1] = Math.atan2(-m31, m33);\n                    this[2] = Math.atan2(-m12, m22);\n                } else {\n                    this[1] = 0;\n                    this[2] = Math.atan2(m21, m11);\n                }\n                break;\n            case Euler.ZYX:\n                this[1] = Math.asin(-(0, _common.clamp)(m31, -1, 1));\n                if (Math.abs(m31) < ALMOST_ONE) {\n                    this[0] = Math.atan2(m32, m33);\n                    this[2] = Math.atan2(m21, m11);\n                } else {\n                    this[0] = 0;\n                    this[2] = Math.atan2(-m12, m22);\n                }\n                break;\n            case Euler.YZX:\n                this[2] = Math.asin((0, _common.clamp)(m21, -1, 1));\n                if (Math.abs(m21) < ALMOST_ONE) {\n                    this[0] = Math.atan2(-m23, m22);\n                    this[1] = Math.atan2(-m31, m11);\n                } else {\n                    this[0] = 0;\n                    this[1] = Math.atan2(m13, m33);\n                }\n                break;\n            case Euler.XZY:\n                this[2] = Math.asin(-(0, _common.clamp)(m12, -1, 1));\n                if (Math.abs(m12) < ALMOST_ONE) {\n                    this[0] = Math.atan2(m32, m22);\n                    this[1] = Math.atan2(m13, m11);\n                } else {\n                    this[0] = Math.atan2(-m23, m33);\n                    this[1] = 0;\n                }\n                break;\n            default:\n                throw new Error(ERR_UNKNOWN_ORDER);\n        }\n        this[3] = order;\n        return this;\n    }\n    _getRotationMatrix(result) {\n        const te = result || [\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0\n        ];\n        const x = this.x, y = this.y, z = this.z;\n        const a = Math.cos(x);\n        const c = Math.cos(y);\n        const e = Math.cos(z);\n        const b = Math.sin(x);\n        const d = Math.sin(y);\n        const f = Math.sin(z);\n        switch(this[3]){\n            case Euler.XYZ:\n                {\n                    const ae = a * e, af = a * f, be = b * e, bf = b * f;\n                    te[0] = c * e;\n                    te[4] = -c * f;\n                    te[8] = d;\n                    te[1] = af + be * d;\n                    te[5] = ae - bf * d;\n                    te[9] = -b * c;\n                    te[2] = bf - ae * d;\n                    te[6] = be + af * d;\n                    te[10] = a * c;\n                    break;\n                }\n            case Euler.YXZ:\n                {\n                    const ce = c * e, cf = c * f, de = d * e, df = d * f;\n                    te[0] = ce + df * b;\n                    te[4] = de * b - cf;\n                    te[8] = a * d;\n                    te[1] = a * f;\n                    te[5] = a * e;\n                    te[9] = -b;\n                    te[2] = cf * b - de;\n                    te[6] = df + ce * b;\n                    te[10] = a * c;\n                    break;\n                }\n            case Euler.ZXY:\n                {\n                    const ce = c * e, cf = c * f, de = d * e, df = d * f;\n                    te[0] = ce - df * b;\n                    te[4] = -a * f;\n                    te[8] = de + cf * b;\n                    te[1] = cf + de * b;\n                    te[5] = a * e;\n                    te[9] = df - ce * b;\n                    te[2] = -a * d;\n                    te[6] = b;\n                    te[10] = a * c;\n                    break;\n                }\n            case Euler.ZYX:\n                {\n                    const ae = a * e, af = a * f, be = b * e, bf = b * f;\n                    te[0] = c * e;\n                    te[4] = be * d - af;\n                    te[8] = ae * d + bf;\n                    te[1] = c * f;\n                    te[5] = bf * d + ae;\n                    te[9] = af * d - be;\n                    te[2] = -d;\n                    te[6] = b * c;\n                    te[10] = a * c;\n                    break;\n                }\n            case Euler.YZX:\n                {\n                    const ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n                    te[0] = c * e;\n                    te[4] = bd - ac * f;\n                    te[8] = bc * f + ad;\n                    te[1] = f;\n                    te[5] = a * e;\n                    te[9] = -b * e;\n                    te[2] = -d * e;\n                    te[6] = ad * f + bc;\n                    te[10] = ac - bd * f;\n                    break;\n                }\n            case Euler.XZY:\n                {\n                    const ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n                    te[0] = c * e;\n                    te[4] = -f;\n                    te[8] = d * e;\n                    te[1] = ac * f + bd;\n                    te[5] = a * e;\n                    te[9] = ad * f - bc;\n                    te[2] = bc * f - ad;\n                    te[6] = b * e;\n                    te[10] = bd * f + ac;\n                    break;\n                }\n            default:\n                throw new Error(ERR_UNKNOWN_ORDER);\n        }\n        te[3] = 0;\n        te[7] = 0;\n        te[11] = 0;\n        te[12] = 0;\n        te[13] = 0;\n        te[14] = 0;\n        te[15] = 1;\n        return te;\n    }\n    toQuaternion() {\n        const cy = Math.cos(this.yaw * 0.5);\n        const sy = Math.sin(this.yaw * 0.5);\n        const cr = Math.cos(this.roll * 0.5);\n        const sr = Math.sin(this.roll * 0.5);\n        const cp = Math.cos(this.pitch * 0.5);\n        const sp = Math.sin(this.pitch * 0.5);\n        const w = cy * cr * cp + sy * sr * sp;\n        const x = cy * sr * cp - sy * cr * sp;\n        const y = cy * cr * sp + sy * sr * cp;\n        const z = sy * cr * cp - cy * sr * sp;\n        return new (0, _quaternionDefault.default)(x, y, z, w);\n    }\n}\nexports.default = Euler;\nfunction validateOrder(value) {\n    return value >= 0 && value < 6;\n}\nfunction checkOrder(value) {\n    if (value < 0 && value >= 6) throw new Error(ERR_UNKNOWN_ORDER);\n    return value;\n}\n\n},{\"./base/math-array\":\"egSnj\",\"./quaternion\":\"aqPwo\",\"../lib/common\":\"4ZtWf\",\"../lib/validators\":\"d22Rk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5W7In\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = {\n    EPSILON1: 1e-1,\n    EPSILON2: 1e-2,\n    EPSILON3: 1e-3,\n    EPSILON4: 1e-4,\n    EPSILON5: 1e-5,\n    EPSILON6: 1e-6,\n    EPSILON7: 1e-7,\n    EPSILON8: 1e-8,\n    EPSILON9: 1e-9,\n    EPSILON10: 1e-10,\n    EPSILON11: 1e-11,\n    EPSILON12: 1e-12,\n    EPSILON13: 1e-13,\n    EPSILON14: 1e-14,\n    EPSILON15: 1e-15,\n    EPSILON16: 1e-16,\n    EPSILON17: 1e-17,\n    EPSILON18: 1e-18,\n    EPSILON19: 1e-19,\n    EPSILON20: 1e-20,\n    PI_OVER_TWO: Math.PI / 2,\n    PI_OVER_FOUR: Math.PI / 4,\n    PI_OVER_SIX: Math.PI / 6,\n    TWO_PI: Math.PI * 2\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1zTTJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _lightsGlsl = require(\"./lights.glsl\");\nvar _lightsGlslDefault = parcelHelpers.interopDefault(_lightsGlsl);\nexports.default = {\n    name: \"lights\",\n    vs: (0, _lightsGlslDefault.default),\n    fs: (0, _lightsGlslDefault.default),\n    getUniforms: getUniforms,\n    defines: {\n        MAX_LIGHTS: 3\n    }\n};\nvar INITIAL_MODULE_OPTIONS = {};\nfunction convertColor() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$color = _ref.color, color = _ref$color === void 0 ? [\n        0,\n        0,\n        0\n    ] : _ref$color, _ref$intensity = _ref.intensity, intensity = _ref$intensity === void 0 ? 1.0 : _ref$intensity;\n    return color.map(function(component) {\n        return component * intensity / 255.0;\n    });\n}\nfunction getLightSourceUniforms(_ref2) {\n    var ambientLight = _ref2.ambientLight, _ref2$pointLights = _ref2.pointLights, pointLights = _ref2$pointLights === void 0 ? [] : _ref2$pointLights, _ref2$directionalLigh = _ref2.directionalLights, directionalLights = _ref2$directionalLigh === void 0 ? [] : _ref2$directionalLigh;\n    var lightSourceUniforms = {};\n    if (ambientLight) lightSourceUniforms[\"lighting_uAmbientLight.color\"] = convertColor(ambientLight);\n    else lightSourceUniforms[\"lighting_uAmbientLight.color\"] = [\n        0,\n        0,\n        0\n    ];\n    pointLights.forEach(function(pointLight, index) {\n        lightSourceUniforms[\"lighting_uPointLight[\".concat(index, \"].color\")] = convertColor(pointLight);\n        lightSourceUniforms[\"lighting_uPointLight[\".concat(index, \"].position\")] = pointLight.position;\n        lightSourceUniforms[\"lighting_uPointLight[\".concat(index, \"].attenuation\")] = pointLight.attenuation || [\n            1,\n            0,\n            0\n        ];\n    });\n    lightSourceUniforms.lighting_uPointLightCount = pointLights.length;\n    directionalLights.forEach(function(directionalLight, index) {\n        lightSourceUniforms[\"lighting_uDirectionalLight[\".concat(index, \"].color\")] = convertColor(directionalLight);\n        lightSourceUniforms[\"lighting_uDirectionalLight[\".concat(index, \"].direction\")] = directionalLight.direction;\n    });\n    lightSourceUniforms.lighting_uDirectionalLightCount = directionalLights.length;\n    return lightSourceUniforms;\n}\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_MODULE_OPTIONS;\n    if (\"lightSources\" in opts) {\n        var _ref3 = opts.lightSources || {}, ambientLight = _ref3.ambientLight, pointLights = _ref3.pointLights, directionalLights = _ref3.directionalLights;\n        var hasLights = ambientLight || pointLights && pointLights.length > 0 || directionalLights && directionalLights.length > 0;\n        if (!hasLights) return {\n            lighting_uEnabled: false\n        };\n        return Object.assign({}, getLightSourceUniforms({\n            ambientLight: ambientLight,\n            pointLights: pointLights,\n            directionalLights: directionalLights\n        }), {\n            lighting_uEnabled: true\n        });\n    }\n    if (\"lights\" in opts) {\n        var lightSources = {\n            pointLights: [],\n            directionalLights: []\n        };\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n        try {\n            for(var _iterator = (opts.lights || [])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                var light = _step.value;\n                switch(light.type){\n                    case \"ambient\":\n                        lightSources.ambientLight = light;\n                        break;\n                    case \"directional\":\n                        lightSources.directionalLights.push(light);\n                        break;\n                    case \"point\":\n                        lightSources.pointLights.push(light);\n                        break;\n                    default:\n                }\n            }\n        } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n        } finally{\n            try {\n                if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n            } finally{\n                if (_didIteratorError) throw _iteratorError;\n            }\n        }\n        return getUniforms({\n            lightSources: lightSources\n        });\n    }\n    return {};\n}\n\n},{\"./lights.glsl\":\"2zV4e\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2zV4e\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#if (defined(SHADER_TYPE_FRAGMENT) && defined(LIGHTING_FRAGMENT)) || (defined(SHADER_TYPE_VERTEX) && defined(LIGHTING_VERTEX))\\n\\nstruct AmbientLight {\\n vec3 color;\\n};\\n\\nstruct PointLight {\\n vec3 color;\\n vec3 position;\\n vec3 attenuation;\\n};\\n\\nstruct DirectionalLight {\\n  vec3 color;\\n  vec3 direction;\\n};\\n\\nuniform AmbientLight lighting_uAmbientLight;\\nuniform PointLight lighting_uPointLight[MAX_LIGHTS];\\nuniform DirectionalLight lighting_uDirectionalLight[MAX_LIGHTS];\\nuniform int lighting_uPointLightCount;\\nuniform int lighting_uDirectionalLightCount;\\n\\nuniform bool lighting_uEnabled;\\n\\nfloat getPointLightAttenuation(PointLight pointLight, float distance) {\\n  return pointLight.attenuation.x\\n       + pointLight.attenuation.y * distance\\n       + pointLight.attenuation.z * distance * distance;\\n}\\n\\n#endif\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5u9oO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _project = require(\"../project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar DEFAULT_LIGHT_DIRECTION = new Float32Array([\n    1,\n    1,\n    2\n]);\nvar DEFAULT_MODULE_OPTIONS = {\n    lightDirection: DEFAULT_LIGHT_DIRECTION\n};\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n    var uniforms = {};\n    if (opts.lightDirection) uniforms.dirlight_uLightDirection = opts.lightDirection;\n    return uniforms;\n}\nvar vs = null;\nvar fs = \"uniform vec3 dirlight_uLightDirection;\\nvec4 dirlight_filterColor(vec4 color) {\\n  vec3 normal = project_getNormal_World();\\n  float d = abs(dot(normalize(normal), normalize(dirlight_uLightDirection)));\\n  return vec4(color.rgb * d, color.a);\\n}\\n\";\nexports.default = {\n    name: \"dirlight\",\n    vs: vs,\n    fs: fs,\n    getUniforms: getUniforms,\n    dependencies: [\n        (0, _projectDefault.default)\n    ]\n};\n\n},{\"../project/project\":\"atHzB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"pqxCq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar DEFAULT_HIGHLIGHT_COLOR = new Uint8Array([\n    0,\n    255,\n    255,\n    255\n]);\nvar DEFAULT_MODULE_OPTIONS = {\n    pickingSelectedColor: null,\n    pickingHighlightColor: DEFAULT_HIGHLIGHT_COLOR,\n    pickingActive: false,\n    pickingAttribute: false\n};\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n    var uniforms = {};\n    if (opts.pickingSelectedColor !== undefined) {\n        if (!opts.pickingSelectedColor) uniforms.picking_uSelectedColorValid = 0;\n        else {\n            var selectedColor = opts.pickingSelectedColor.slice(0, 3);\n            uniforms.picking_uSelectedColorValid = 1;\n            uniforms.picking_uSelectedColor = selectedColor;\n        }\n    }\n    if (opts.pickingHighlightColor) {\n        var color = Array.from(opts.pickingHighlightColor, function(x) {\n            return x / 255;\n        });\n        if (!Number.isFinite(color[3])) color[3] = 1;\n        uniforms.picking_uHighlightColor = color;\n    }\n    if (opts.pickingActive !== undefined) {\n        uniforms.picking_uActive = Boolean(opts.pickingActive);\n        uniforms.picking_uAttribute = Boolean(opts.pickingAttribute);\n    }\n    return uniforms;\n}\nvar vs = \"uniform bool picking_uActive;\\nuniform bool picking_uAttribute;\\nuniform vec3 picking_uSelectedColor;\\nuniform bool picking_uSelectedColorValid;\\n\\nout vec4 picking_vRGBcolor_Avalid;\\n\\nconst float COLOR_SCALE = 1. / 255.;\\n\\nbool picking_isColorValid(vec3 color) {\\n  return dot(color, vec3(1.0)) > 0.001;\\n}\\n\\nbool isVertexPicked(vec3 vertexColor) {\\n  return\\n    picking_uSelectedColorValid &&\\n    !picking_isColorValid(abs(vertexColor - picking_uSelectedColor));\\n}\\n\\nvoid picking_setPickingColor(vec3 pickingColor) {\\n  if (picking_uActive) {\\n    picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));\\n\\n    if (!picking_uAttribute) {\\n      picking_vRGBcolor_Avalid.rgb = pickingColor * COLOR_SCALE;\\n    }\\n  } else {\\n    picking_vRGBcolor_Avalid.a = float(isVertexPicked(pickingColor));\\n  }\\n}\\n\\nvoid picking_setPickingAttribute(float value) {\\n  if (picking_uAttribute) {\\n    picking_vRGBcolor_Avalid.r = value;\\n  }\\n}\\nvoid picking_setPickingAttribute(vec2 value) {\\n  if (picking_uAttribute) {\\n    picking_vRGBcolor_Avalid.rg = value;\\n  }\\n}\\nvoid picking_setPickingAttribute(vec3 value) {\\n  if (picking_uAttribute) {\\n    picking_vRGBcolor_Avalid.rgb = value;\\n  }\\n}\\n\";\nvar fs = \"uniform bool picking_uActive;\\nuniform vec3 picking_uSelectedColor;\\nuniform vec4 picking_uHighlightColor;\\n\\nin vec4 picking_vRGBcolor_Avalid;\\nvec4 picking_filterHighlightColor(vec4 color) {\\n  if (picking_uActive) {\\n    return color;\\n  }\\n  bool selected = bool(picking_vRGBcolor_Avalid.a);\\n\\n  if (selected) {\\n    float highLightAlpha = picking_uHighlightColor.a;\\n    float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\\n    float highLightRatio = highLightAlpha / blendedAlpha;\\n\\n    vec3 blendedRGB = mix(color.rgb, picking_uHighlightColor.rgb, highLightRatio);\\n    return vec4(blendedRGB, blendedAlpha);\\n  } else {\\n    return color;\\n  }\\n}\\nvec4 picking_filterPickingColor(vec4 color) {\\n  if (picking_uActive) {\\n    if (picking_vRGBcolor_Avalid.a == 0.0) {\\n      discard;\\n    }\\n    return picking_vRGBcolor_Avalid;\\n  }\\n  return color;\\n}\\nvec4 picking_filterColor(vec4 color) {\\n  vec4 highightColor = picking_filterHighlightColor(color);\\n  return picking_filterPickingColor(highightColor);\\n}\\n\\n\";\nexports.default = {\n    name: \"picking\",\n    vs: vs,\n    fs: fs,\n    getUniforms: getUniforms\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b6nnT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>gouraudLighting);\nparcelHelpers.export(exports, \"phongLighting\", ()=>phongLighting);\nvar _lights = require(\"../lights/lights\");\nvar _lightsDefault = parcelHelpers.interopDefault(_lights);\nvar _phongLightingGlsl = require(\"./phong-lighting.glsl\");\nvar _phongLightingGlslDefault = parcelHelpers.interopDefault(_phongLightingGlsl);\nvar gouraudLighting = {\n    name: \"gouraud-lighting\",\n    dependencies: [\n        (0, _lightsDefault.default)\n    ],\n    vs: (0, _phongLightingGlslDefault.default),\n    defines: {\n        LIGHTING_VERTEX: 1\n    },\n    getUniforms: getUniforms\n};\nvar phongLighting = {\n    name: \"phong-lighting\",\n    dependencies: [\n        (0, _lightsDefault.default)\n    ],\n    fs: (0, _phongLightingGlslDefault.default),\n    defines: {\n        LIGHTING_FRAGMENT: 1\n    },\n    getUniforms: getUniforms\n};\nvar INITIAL_MODULE_OPTIONS = {};\nfunction getMaterialUniforms(material) {\n    var _material$ambient = material.ambient, ambient = _material$ambient === void 0 ? 0.35 : _material$ambient, _material$diffuse = material.diffuse, diffuse = _material$diffuse === void 0 ? 0.6 : _material$diffuse, _material$shininess = material.shininess, shininess = _material$shininess === void 0 ? 32 : _material$shininess, _material$specularCol = material.specularColor, specularColor = _material$specularCol === void 0 ? [\n        30,\n        30,\n        30\n    ] : _material$specularCol;\n    return {\n        lighting_uAmbient: ambient,\n        lighting_uDiffuse: diffuse,\n        lighting_uShininess: shininess,\n        lighting_uSpecularColor: specularColor.map(function(x) {\n            return x / 255;\n        })\n    };\n}\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_MODULE_OPTIONS;\n    if (!(\"material\" in opts)) return {};\n    var material = opts.material;\n    if (!material) return {\n        lighting_uEnabled: false\n    };\n    return getMaterialUniforms(material);\n}\n\n},{\"../lights/lights\":\"1zTTJ\",\"./phong-lighting.glsl\":\"eetdh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eetdh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\nuniform float lighting_uAmbient;\\nuniform float lighting_uDiffuse;\\nuniform float lighting_uShininess;\\nuniform vec3  lighting_uSpecularColor;\\n\\nvec3 lighting_getLightColor(vec3 surfaceColor, vec3 light_direction, vec3 view_direction, vec3 normal_worldspace, vec3 color) {\\n    vec3 halfway_direction = normalize(light_direction + view_direction);\\n    float lambertian = dot(light_direction, normal_worldspace);\\n    float specular = 0.0;\\n    if (lambertian > 0.0) {\\n      float specular_angle = max(dot(normal_worldspace, halfway_direction), 0.0);\\n      specular = pow(specular_angle, lighting_uShininess);\\n    }\\n    lambertian = max(lambertian, 0.0);\\n    return (lambertian * lighting_uDiffuse * surfaceColor + specular * lighting_uSpecularColor) * color;\\n}\\n\\nvec3 lighting_getLightColor(vec3 surfaceColor, vec3 cameraPosition, vec3 position_worldspace, vec3 normal_worldspace) {\\n  vec3 lightColor = surfaceColor;\\n\\n  if (lighting_uEnabled) {\\n    vec3 view_direction = normalize(cameraPosition - position_worldspace);\\n    lightColor = lighting_uAmbient * surfaceColor * lighting_uAmbientLight.color;\\n\\n    for (int i = 0; i < MAX_LIGHTS; i++) {\\n      if (i >= lighting_uPointLightCount) {\\n        break;\\n      }\\n      PointLight pointLight = lighting_uPointLight[i];\\n      vec3 light_position_worldspace = pointLight.position;\\n      vec3 light_direction = normalize(light_position_worldspace - position_worldspace);\\n      lightColor += lighting_getLightColor(surfaceColor, light_direction, view_direction, normal_worldspace, pointLight.color);\\n    }\\n\\n    for (int i = 0; i < MAX_LIGHTS; i++) {\\n      if (i >= lighting_uDirectionalLightCount) {\\n        break;\\n      }\\n      DirectionalLight directionalLight = lighting_uDirectionalLight[i];\\n      lightColor += lighting_getLightColor(surfaceColor, -directionalLight.direction, view_direction, normal_worldspace, directionalLight.color);\\n    }\\n  }\\n  return lightColor;\\n}\\n\\nvec3 lighting_getSpecularLightColor(vec3 cameraPosition, vec3 position_worldspace, vec3 normal_worldspace) {\\n  vec3 lightColor = vec3(0, 0, 0);\\n  vec3 surfaceColor = vec3(0, 0, 0);\\n\\n  if (lighting_uEnabled) {\\n    vec3 view_direction = normalize(cameraPosition - position_worldspace);\\n\\n    for (int i = 0; i < MAX_LIGHTS; i++) {\\n      if (i >= lighting_uPointLightCount) {\\n        break;\\n      }\\n      PointLight pointLight = lighting_uPointLight[i];\\n      vec3 light_position_worldspace = pointLight.position;\\n      vec3 light_direction = normalize(light_position_worldspace - position_worldspace);\\n      lightColor += lighting_getLightColor(surfaceColor, light_direction, view_direction, normal_worldspace, pointLight.color);\\n    }\\n\\n    for (int i = 0; i < MAX_LIGHTS; i++) {\\n      if (i >= lighting_uDirectionalLightCount) {\\n        break;\\n      }\\n      DirectionalLight directionalLight = lighting_uDirectionalLight[i];\\n      lightColor += lighting_getLightColor(surfaceColor, -directionalLight.direction, view_direction, normal_worldspace, directionalLight.color);\\n    }\\n  }\\n  return lightColor;\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bEcs5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _lights = require(\"../lights/lights\");\nvar _lightsDefault = parcelHelpers.interopDefault(_lights);\nvar _pbrVertexGlsl = require(\"./pbr-vertex.glsl\");\nvar _pbrVertexGlslDefault = parcelHelpers.interopDefault(_pbrVertexGlsl);\nvar _pbrFragmentGlsl = require(\"./pbr-fragment.glsl\");\nvar _pbrFragmentGlslDefault = parcelHelpers.interopDefault(_pbrFragmentGlsl);\nexports.default = {\n    name: \"pbr\",\n    vs: (0, _pbrVertexGlslDefault.default),\n    fs: (0, _pbrFragmentGlslDefault.default),\n    defines: {\n        LIGHTING_FRAGMENT: 1\n    },\n    dependencies: [\n        (0, _lightsDefault.default)\n    ]\n};\n\n},{\"../lights/lights\":\"1zTTJ\",\"./pbr-vertex.glsl\":\"2gzLs\",\"./pbr-fragment.glsl\":\"7QcR6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2gzLs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"uniform mat4 u_MVPMatrix;\\nuniform mat4 u_ModelMatrix;\\nuniform mat4 u_NormalMatrix;\\n\\nvarying vec3 pbr_vPosition;\\nvarying vec2 pbr_vUV;\\n\\n#ifdef HAS_NORMALS\\n# ifdef HAS_TANGENTS\\nvarying mat3 pbr_vTBN;\\n# else\\nvarying vec3 pbr_vNormal;\\n# endif\\n#endif\\n\\nvoid pbr_setPositionNormalTangentUV(vec4 position, vec4 normal, vec4 tangent, vec2 uv)\\n{\\n  vec4 pos = u_ModelMatrix * position;\\n  pbr_vPosition = vec3(pos.xyz) / pos.w;\\n\\n#ifdef HAS_NORMALS\\n#ifdef HAS_TANGENTS\\n  vec3 normalW = normalize(vec3(u_NormalMatrix * vec4(normal.xyz, 0.0)));\\n  vec3 tangentW = normalize(vec3(u_ModelMatrix * vec4(tangent.xyz, 0.0)));\\n  vec3 bitangentW = cross(normalW, tangentW) * tangent.w;\\n  pbr_vTBN = mat3(tangentW, bitangentW, normalW);\\n#else\\n  pbr_vNormal = normalize(vec3(u_ModelMatrix * vec4(normal.xyz, 0.0)));\\n#endif\\n#endif\\n\\n#ifdef HAS_UV\\n  pbr_vUV = uv;\\n#else\\n  pbr_vUV = vec2(0.,0.);\\n#endif\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7QcR6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#if (__VERSION__ < 300)\\n#extension GL_EXT_shader_texture_lod: enable\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\n\\n\\n#if (__VERSION__ < 300)\\n  #define SMART_FOR(INIT, WEBGL1COND, WEBGL2COND, INCR) for (INIT; WEBGL1COND; INCR)\\n#else\\n  #define SMART_FOR(INIT, WEBGL1COND, WEBGL2COND, INCR) for (INIT; WEBGL2COND; INCR)\\n#endif\\n\\nprecision highp float;\\n\\nuniform bool pbr_uUnlit;\\n\\n#ifdef USE_IBL\\nuniform samplerCube u_DiffuseEnvSampler;\\nuniform samplerCube u_SpecularEnvSampler;\\nuniform sampler2D u_brdfLUT;\\nuniform vec2 u_ScaleIBLAmbient;\\n#endif\\n\\n#ifdef HAS_BASECOLORMAP\\nuniform sampler2D u_BaseColorSampler;\\n#endif\\n#ifdef HAS_NORMALMAP\\nuniform sampler2D u_NormalSampler;\\nuniform float u_NormalScale;\\n#endif\\n#ifdef HAS_EMISSIVEMAP\\nuniform sampler2D u_EmissiveSampler;\\nuniform vec3 u_EmissiveFactor;\\n#endif\\n#ifdef HAS_METALROUGHNESSMAP\\nuniform sampler2D u_MetallicRoughnessSampler;\\n#endif\\n#ifdef HAS_OCCLUSIONMAP\\nuniform sampler2D u_OcclusionSampler;\\nuniform float u_OcclusionStrength;\\n#endif\\n\\n#ifdef ALPHA_CUTOFF\\nuniform float u_AlphaCutoff;\\n#endif\\n\\nuniform vec2 u_MetallicRoughnessValues;\\nuniform vec4 u_BaseColorFactor;\\n\\nuniform vec3 u_Camera;\\n#ifdef PBR_DEBUG\\nuniform vec4 u_ScaleDiffBaseMR;\\nuniform vec4 u_ScaleFGDSpec;\\n#endif\\n\\nvarying vec3 pbr_vPosition;\\n\\nvarying vec2 pbr_vUV;\\n\\n#ifdef HAS_NORMALS\\n#ifdef HAS_TANGENTS\\nvarying mat3 pbr_vTBN;\\n#else\\nvarying vec3 pbr_vNormal;\\n#endif\\n#endif\\n\\n\\nstruct PBRInfo\\n{\\n  float NdotL;\\n  float NdotV;\\n  float NdotH;\\n  float LdotH;\\n  float VdotH;\\n  float perceptualRoughness;\\n  float metalness;\\n  vec3 reflectance0;\\n  vec3 reflectance90;\\n  float alphaRoughness;\\n  vec3 diffuseColor;\\n  vec3 specularColor;\\n  vec3 n;\\n  vec3 v;\\n};\\n\\nconst float M_PI = 3.141592653589793;\\nconst float c_MinRoughness = 0.04;\\n\\nvec4 SRGBtoLINEAR(vec4 srgbIn)\\n{\\n#ifdef MANUAL_SRGB\\n#ifdef SRGB_FAST_APPROXIMATION\\n  vec3 linOut = pow(srgbIn.xyz,vec3(2.2));\\n#else\\n  vec3 bLess = step(vec3(0.04045),srgbIn.xyz);\\n  vec3 linOut = mix( srgbIn.xyz/vec3(12.92), pow((srgbIn.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), bLess );\\n#endif\\n  return vec4(linOut,srgbIn.w);;\\n#else\\n  return srgbIn;\\n#endif\\n}\\n\\nvec3 getNormal()\\n{\\n#ifndef HAS_TANGENTS\\n  vec3 pos_dx = dFdx(pbr_vPosition);\\n  vec3 pos_dy = dFdy(pbr_vPosition);\\n  vec3 tex_dx = dFdx(vec3(pbr_vUV, 0.0));\\n  vec3 tex_dy = dFdy(vec3(pbr_vUV, 0.0));\\n  vec3 t = (tex_dy.t * pos_dx - tex_dx.t * pos_dy) / (tex_dx.s * tex_dy.t - tex_dy.s * tex_dx.t);\\n\\n#ifdef HAS_NORMALS\\n  vec3 ng = normalize(pbr_vNormal);\\n#else\\n  vec3 ng = cross(pos_dx, pos_dy);\\n#endif\\n\\n  t = normalize(t - ng * dot(ng, t));\\n  vec3 b = normalize(cross(ng, t));\\n  mat3 tbn = mat3(t, b, ng);\\n#else\\n  mat3 tbn = pbr_vTBN;\\n#endif\\n\\n#ifdef HAS_NORMALMAP\\n  vec3 n = texture2D(u_NormalSampler, pbr_vUV).rgb;\\n  n = normalize(tbn * ((2.0 * n - 1.0) * vec3(u_NormalScale, u_NormalScale, 1.0)));\\n#else\\n  vec3 n = normalize(tbn[2].xyz);\\n#endif\\n\\n  return n;\\n}\\n\\n\\n#ifdef USE_IBL\\nvec3 getIBLContribution(PBRInfo pbrInputs, vec3 n, vec3 reflection)\\n{\\n  float mipCount = 9.0;\\n  float lod = (pbrInputs.perceptualRoughness * mipCount);\\n  vec3 brdf = SRGBtoLINEAR(texture2D(u_brdfLUT,\\n    vec2(pbrInputs.NdotV, 1.0 - pbrInputs.perceptualRoughness))).rgb;\\n  vec3 diffuseLight = SRGBtoLINEAR(textureCube(u_DiffuseEnvSampler, n)).rgb;\\n\\n#ifdef USE_TEX_LOD\\n  vec3 specularLight = SRGBtoLINEAR(textureCubeLodEXT(u_SpecularEnvSampler, reflection, lod)).rgb;\\n#else\\n  vec3 specularLight = SRGBtoLINEAR(textureCube(u_SpecularEnvSampler, reflection)).rgb;\\n#endif\\n\\n  vec3 diffuse = diffuseLight * pbrInputs.diffuseColor;\\n  vec3 specular = specularLight * (pbrInputs.specularColor * brdf.x + brdf.y);\\n  diffuse *= u_ScaleIBLAmbient.x;\\n  specular *= u_ScaleIBLAmbient.y;\\n\\n  return diffuse + specular;\\n}\\n#endif\\n\\n\\nvec3 diffuse(PBRInfo pbrInputs)\\n{\\n  return pbrInputs.diffuseColor / M_PI;\\n}\\n\\nvec3 specularReflection(PBRInfo pbrInputs)\\n{\\n  return pbrInputs.reflectance0 +\\n    (pbrInputs.reflectance90 - pbrInputs.reflectance0) *\\n    pow(clamp(1.0 - pbrInputs.VdotH, 0.0, 1.0), 5.0);\\n}\\n\\n\\n\\nfloat geometricOcclusion(PBRInfo pbrInputs)\\n{\\n  float NdotL = pbrInputs.NdotL;\\n  float NdotV = pbrInputs.NdotV;\\n  float r = pbrInputs.alphaRoughness;\\n\\n  float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL)));\\n  float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV)));\\n  return attenuationL * attenuationV;\\n}\\n\\n\\n\\n\\n\\nfloat microfacetDistribution(PBRInfo pbrInputs)\\n{\\n  float roughnessSq = pbrInputs.alphaRoughness * pbrInputs.alphaRoughness;\\n  float f = (pbrInputs.NdotH * roughnessSq - pbrInputs.NdotH) * pbrInputs.NdotH + 1.0;\\n  return roughnessSq / (M_PI * f * f);\\n}\\n\\nvoid PBRInfo_setAmbientLight(inout PBRInfo pbrInputs) {\\n  pbrInputs.NdotL = 1.0;\\n  pbrInputs.NdotH = 0.0;\\n  pbrInputs.LdotH = 0.0;\\n  pbrInputs.VdotH = 1.0;\\n}\\n\\nvoid PBRInfo_setDirectionalLight(inout PBRInfo pbrInputs, vec3 lightDirection) {\\n  vec3 n = pbrInputs.n;\\n  vec3 v = pbrInputs.v;\\n  vec3 l = normalize(lightDirection);\\n  vec3 h = normalize(l+v);\\n\\n  pbrInputs.NdotL = clamp(dot(n, l), 0.001, 1.0);\\n  pbrInputs.NdotH = clamp(dot(n, h), 0.0, 1.0);\\n  pbrInputs.LdotH = clamp(dot(l, h), 0.0, 1.0);\\n  pbrInputs.VdotH = clamp(dot(v, h), 0.0, 1.0);\\n}\\n\\nvoid PBRInfo_setPointLight(inout PBRInfo pbrInputs, PointLight pointLight) {\\n  vec3 light_direction = normalize(pointLight.position - pbr_vPosition);\\n  PBRInfo_setDirectionalLight(pbrInputs, light_direction);\\n}\\n\\nvec3 calculateFinalColor(PBRInfo pbrInputs, vec3 lightColor) {\\n  vec3 F = specularReflection(pbrInputs);\\n  float G = geometricOcclusion(pbrInputs);\\n  float D = microfacetDistribution(pbrInputs);\\n  vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs);\\n  vec3 specContrib = F * G * D / (4.0 * pbrInputs.NdotL * pbrInputs.NdotV);\\n  return pbrInputs.NdotL * lightColor * (diffuseContrib + specContrib);\\n}\\n\\nvec4 pbr_filterColor(vec4 colorUnused)\\n{\\n#ifdef HAS_BASECOLORMAP\\n  vec4 baseColor = SRGBtoLINEAR(texture2D(u_BaseColorSampler, pbr_vUV)) * u_BaseColorFactor;\\n#else\\n  vec4 baseColor = u_BaseColorFactor;\\n#endif\\n\\n#ifdef ALPHA_CUTOFF\\n  if (baseColor.a < u_AlphaCutoff) {\\n    discard;\\n  }\\n#endif\\n\\n  vec3 color = vec3(0, 0, 0);\\n\\n  if(pbr_uUnlit){\\n    color.rgb = baseColor.rgb;\\n  }\\n  else{\\n\\n\\n    float perceptualRoughness = u_MetallicRoughnessValues.y;\\n    float metallic = u_MetallicRoughnessValues.x;\\n#ifdef HAS_METALROUGHNESSMAP\\n\\n    vec4 mrSample = texture2D(u_MetallicRoughnessSampler, pbr_vUV);\\n    perceptualRoughness = mrSample.g * perceptualRoughness;\\n    metallic = mrSample.b * metallic;\\n#endif\\n    perceptualRoughness = clamp(perceptualRoughness, c_MinRoughness, 1.0);\\n    metallic = clamp(metallic, 0.0, 1.0);\\n\\n    float alphaRoughness = perceptualRoughness * perceptualRoughness;\\n\\n    vec3 f0 = vec3(0.04);\\n    vec3 diffuseColor = baseColor.rgb * (vec3(1.0) - f0);\\n    diffuseColor *= 1.0 - metallic;\\n    vec3 specularColor = mix(f0, baseColor.rgb, metallic);\\n    float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);\\n\\n\\n\\n    float reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0);\\n    vec3 specularEnvironmentR0 = specularColor.rgb;\\n    vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0) * reflectance90;\\n\\n    vec3 n = getNormal();\\n    vec3 v = normalize(u_Camera - pbr_vPosition);\\n\\n    float NdotV = clamp(abs(dot(n, v)), 0.001, 1.0);\\n    vec3 reflection = -normalize(reflect(v, n));\\n\\n    PBRInfo pbrInputs = PBRInfo(\\n      0.0,\\n      NdotV,\\n      0.0,\\n      0.0,\\n      0.0,\\n      perceptualRoughness,\\n      metallic,\\n      specularEnvironmentR0,\\n      specularEnvironmentR90,\\n      alphaRoughness,\\n      diffuseColor,\\n      specularColor,\\n      n,\\n      v\\n    );\\n\\n#ifdef USE_LIGHTS\\n    PBRInfo_setAmbientLight(pbrInputs);\\n    color += calculateFinalColor(pbrInputs, lighting_uAmbientLight.color);\\n    SMART_FOR(int i = 0, i < MAX_LIGHTS, i < lighting_uDirectionalLightCount, i++) {\\n      if (i < lighting_uDirectionalLightCount) {\\n        PBRInfo_setDirectionalLight(pbrInputs, lighting_uDirectionalLight[i].direction);\\n        color += calculateFinalColor(pbrInputs, lighting_uDirectionalLight[i].color);\\n      }\\n    }\\n    SMART_FOR(int i = 0, i < MAX_LIGHTS, i < lighting_uPointLightCount, i++) {\\n      if (i < lighting_uPointLightCount) {\\n        PBRInfo_setPointLight(pbrInputs, lighting_uPointLight[i]);\\n        float attenuation = getPointLightAttenuation(lighting_uPointLight[i], distance(lighting_uPointLight[i].position, pbr_vPosition));\\n        color += calculateFinalColor(pbrInputs, lighting_uPointLight[i].color / attenuation);\\n      }\\n    }\\n#endif\\n#ifdef USE_IBL\\n    color += getIBLContribution(pbrInputs, n, reflection);\\n#endif\\n#ifdef HAS_OCCLUSIONMAP\\n    float ao = texture2D(u_OcclusionSampler, pbr_vUV).r;\\n    color = mix(color, color * ao, u_OcclusionStrength);\\n#endif\\n\\n#ifdef HAS_EMISSIVEMAP\\n    vec3 emissive = SRGBtoLINEAR(texture2D(u_EmissiveSampler, pbr_vUV)).rgb * u_EmissiveFactor;\\n    color += emissive;\\n#endif\\n\\n#ifdef PBR_DEBUG\\n\\n\\n\\n\\n\\n    color = mix(color, baseColor.rgb, u_ScaleDiffBaseMR.y);\\n    color = mix(color, vec3(metallic), u_ScaleDiffBaseMR.z);\\n    color = mix(color, vec3(perceptualRoughness), u_ScaleDiffBaseMR.w);\\n#endif\\n\\n  }\\n\\n  return vec4(pow(color,vec3(1.0/2.2)), baseColor.a);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ZBE6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float brightness;\\nuniform float contrast;\\n\\nvec4 brightnessContrast_filterColor(vec4 color) {\\n  color.rgb += brightness;\\n  if (contrast > 0.0) {\\n    color.rgb = (color.rgb - 0.5) / (1.0 - contrast) + 0.5;\\n  } else {\\n    color.rgb = (color.rgb - 0.5) * (1.0 + contrast) + 0.5;\\n  }\\n  return color;\\n}\\n\\nvec4 brightnessContrast_filterColor(vec4 color, vec2 texSize, vec2 texCoords) {\\n  return brightnessContrast_filterColor(color);\\n}\\n\";\nvar uniforms = {\n    brightness: {\n        value: 0,\n        min: -1,\n        max: 1\n    },\n    contrast: {\n        value: 0,\n        min: -1,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"brightnessContrast\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8CtPv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float strength;\\n\\nvec4 denoise_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  float adjustedExponent = 3. + 200. * pow(1. - strength, 4.);\\n\\n  vec4 center = texture2D(texture, texCoord);\\n  vec4 color = vec4(0.0);\\n  float total = 0.0;\\n  for (float x = -4.0; x <= 4.0; x += 1.0) {\\n    for (float y = -4.0; y <= 4.0; y += 1.0) {\\n      vec4 sample = texture2D(texture, texCoord + vec2(x, y) / texSize);\\n      float weight = 1.0 - abs(dot(sample.rgb - center.rgb, vec3(0.25)));\\n      weight = pow(weight, adjustedExponent);\\n      color += sample * weight;\\n      total += weight;\\n    }\\n  }\\n\\n  return color / total;\\n}\\n\";\nvar uniforms = {\n    strength: {\n        value: 0.5,\n        min: 0,\n        max: 0.1,\n        adjust: function adjust(strength) {\n            return 0.53 + 200 * Math.pow(1 - strength, 4);\n        }\n    }\n};\nexports.default = {\n    name: \"denoise\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            sampler: true\n        },\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d8SIc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float hue;\\nuniform float saturation;\\n\\nvec4 hueSaturation_filterColor(vec4 color) {\\n  float angle = hue * 3.14159265;\\n  float s = sin(angle), c = cos(angle);\\n  vec3 weights = (vec3(2.0 * c, -sqrt(3.0) * s - c, sqrt(3.0) * s - c) + 1.0) / 3.0;\\n  float len = length(color.rgb);\\n  color.rgb = vec3(\\n    dot(color.rgb, weights.xyz),\\n    dot(color.rgb, weights.zxy),\\n    dot(color.rgb, weights.yzx)\\n  );\\n  float average = (color.r + color.g + color.b) / 3.0;\\n  if (saturation > 0.0) {\\n    color.rgb += (average - color.rgb) * (1.0 - 1.0 / (1.001 - saturation));\\n  } else {\\n    color.rgb += (average - color.rgb) * (-saturation);\\n  }\\n\\n  return color;\\n}\\n\\nvec4 hueSaturation_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return hueSaturation_filterColor(color);\\n}\\n\";\nvar uniforms = {\n    hue: {\n        value: 0,\n        min: -1,\n        max: 1\n    },\n    saturation: {\n        value: 0,\n        min: -1,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"hueSaturation\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8IUBT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float amount;\\n\\nfloat rand(vec2 co) {\\n  return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\\n}\\n\\nvec4 noise_filterColor(vec4 color, vec2 texCoord) {\\n  float diff = (rand(texCoord) - 0.5) * amount;\\n  color.r += diff;\\n  color.g += diff;\\n  color.b += diff;\\n  return color;\\n}\\n\\nvec4 noise_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return noise_filterColor(color, texCoord);\\n}\\n\";\nvar uniforms = {\n    amount: {\n        value: 0.5,\n        min: 0,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"noise\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kQcZf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float amount;\\n\\nvec4 sepia_filterColor(vec4 color) {\\n  float r = color.r;\\n  float g = color.g;\\n  float b = color.b;\\n\\n  color.r =\\n    min(1.0, (r * (1.0 - (0.607 * amount))) + (g * (0.769 * amount)) + (b * (0.189 * amount)));\\n  color.g = min(1.0, (r * 0.349 * amount) + (g * (1.0 - (0.314 * amount))) + (b * 0.168 * amount));\\n  color.b = min(1.0, (r * 0.272 * amount) + (g * 0.534 * amount) + (b * (1.0 - (0.869 * amount))));\\n\\n  return color;\\n}\\n\\nvec4 sepia_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return sepia_filterColor(color);\\n}\\n\";\nvar uniforms = {\n    amount: {\n        value: 0.5,\n        min: 0,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"sepia\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6fy1A\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float amount;\\n\\nvec4 vibrance_filterColor(vec4 color) {\\n  float average = (color.r + color.g + color.b) / 3.0;\\n  float mx = max(color.r, max(color.g, color.b));\\n  float amt = (mx - average) * (-amount * 3.0);\\n  color.rgb = mix(color.rgb, vec3(mx), amt);\\n  return color;\\n}\\n\\nvec4 vibrance_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return vibrance_filterColor(color);\\n}\\n\";\nvar uniforms = {\n    amount: {\n        value: 0,\n        min: -1,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"vibrance\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hgIoO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float radius;\\nuniform float amount;\\n\\nvec4 vignette_filterColor(vec4 color, vec2 texCoord) {\\n  float dist = distance(texCoord, vec2(0.5, 0.5));\\n  float ratio = smoothstep(0.8, radius * 0.799, dist * (amount + radius));\\n  return color.rgba * ratio + (1.0 - ratio)*vec4(0.0, 0.0, 0.0, 1.0);\\n}\\n\\nvec4 vignette_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return vignette_filterColor(color, texCoord);\\n}\\n\";\nvar uniforms = {\n    radius: {\n        value: 0.5,\n        min: 0,\n        max: 1\n    },\n    amount: {\n        value: 0.5,\n        min: 0,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"vignette\",\n    fs: fs,\n    uniforms: uniforms,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"48x69\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _random = require(\"../utils/random\");\nvar _randomDefault = parcelHelpers.interopDefault(_random);\nvar fs = \"uniform float blurRadius;\\nuniform float gradientRadius;\\nuniform vec2 start;\\nuniform vec2 end;\\nuniform bool invert;\\n\\nvec2 tiltShift_getDelta(vec2 texSize) {\\n  vec2 vector = normalize((end - start) * texSize);\\n  return invert ? vec2(-vector.y, vector.x) : vector;\\n}\\n\\nvec4 tiltShift_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec4 color = vec4(0.0);\\n  float total = 0.0;\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  vec2 normal = normalize(vec2((start.y - end.y) * texSize.y, (end.x - start.x) * texSize.x));\\n  float radius = smoothstep(0.0, 1.0,\\n    abs(dot(texCoord * texSize - start * texSize, normal)) / gradientRadius) * blurRadius;\\n\\n  for (float t = -30.0; t <= 30.0; t++) {\\n    float percent = (t + offset - 0.5) / 30.0;\\n    float weight = 1.0 - abs(percent);\\n    vec4 sample = texture2D(texture, texCoord + tiltShift_getDelta(texSize) / texSize * percent * radius);\\n    sample.rgb *= sample.a;\\n\\n    color += sample * weight;\\n    total += weight;\\n  }\\n\\n  color = color / total;\\n  color.rgb /= color.a + 0.00001;\\n\\n  return color;\\n}\\n\";\nvar uniforms = {\n    blurRadius: {\n        value: 15,\n        min: 0,\n        max: 50\n    },\n    gradientRadius: {\n        value: 200,\n        min: 0,\n        max: 400\n    },\n    start: [\n        0,\n        0\n    ],\n    end: [\n        1,\n        1\n    ],\n    invert: {\n        value: false,\n        \"private\": true\n    }\n};\nexports.default = {\n    name: \"tiltShift\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _randomDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true,\n            uniforms: {\n                invert: false\n            }\n        },\n        {\n            sampler: true,\n            uniforms: {\n                invert: true\n            }\n        }\n    ]\n};\n\n},{\"../utils/random\":\"3v15w\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3v15w\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"float random(vec3 scale, float seed) {\\n  return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\\n}\\n\";\nexports.default = {\n    name: \"random\",\n    fs: fs\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g4Jp6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _random = require(\"../utils/random\");\nvar _randomDefault = parcelHelpers.interopDefault(_random);\nvar fs = \"uniform float radius;\\nuniform vec2 delta;\\n\\nvec4 triangleBlur_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 adjustedDelta = delta * radius / texSize;\\n\\n  vec4 color = vec4(0.0);\\n  float total = 0.0;\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  for (float t = -30.0; t <= 30.0; t++) {\\n    float percent = (t + offset - 0.5) / 30.0;\\n    float weight = 1.0 - abs(percent);\\n    vec4 sample = texture2D(texture, texCoord + adjustedDelta * percent);\\n    sample.rgb *= sample.a;\\n\\n    color += sample * weight;\\n    total += weight;\\n  }\\n\\n  color = color / total;\\n  color.rgb /= color.a + 0.00001;\\n\\n  return color;\\n}\\n\";\nvar uniforms = {\n    radius: {\n        value: 20,\n        min: 0,\n        softMax: 100\n    },\n    delta: {\n        value: [\n            1,\n            0\n        ],\n        \"private\": true\n    }\n};\nexports.default = {\n    name: \"triangleBlur\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _randomDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true,\n            uniforms: {\n                delta: [\n                    1,\n                    0\n                ]\n            }\n        },\n        {\n            sampler: true,\n            uniforms: {\n                delta: [\n                    0,\n                    1\n                ]\n            }\n        }\n    ]\n};\n\n},{\"../utils/random\":\"3v15w\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6RoTc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _random = require(\"../utils/random\");\nvar _randomDefault = parcelHelpers.interopDefault(_random);\nvar fs = \"\\nuniform vec2 center;\\nuniform float strength;\\n\\nvec4 zoomBlur_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec4 color = vec4(0.0);\\n  float total = 0.0;\\n  vec2 toCenter = center * texSize - texCoord * texSize;\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  for (float t = 0.0; t <= 40.0; t++) {\\n    float percent = (t + offset) / 40.0;\\n    float weight = 4.0 * (percent - percent * percent);\\n    vec4 sample = texture2D(texture, texCoord + toCenter * percent * strength / texSize);\\n    sample.rgb *= sample.a;\\n\\n    color += sample * weight;\\n    total += weight;\\n  }\\n\\n  color = color / total;\\n  color.rgb /= color.a + 0.00001;\\n\\n  return color;\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    strength: {\n        value: 0.3,\n        min: 0,\n        softMax: 1\n    }\n};\nexports.default = {\n    name: \"zoomBlur\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _randomDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"../utils/random\":\"3v15w\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3mJEq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform vec2 center;\\nuniform float angle;\\nuniform float size;\\n\\nfloat scale = 3.1514 / size;\\n\\nfloat pattern(float angle, vec2 texSize, vec2 texCoord) {\\n  float s = sin(angle), c = cos(angle);\\n  vec2 tex = texCoord * texSize - center * texSize;\\n  vec2 point = vec2(\\n\tc * tex.x - s * tex.y,\\n\ts * tex.x + c * tex.y\\n  ) * scale;\\n  return (sin(point.x) * sin(point.y)) * 4.0;\\n}\\n\\nvec4 colorHalftone_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  vec3 cmy = 1.0 - color.rgb;\\n  float k = min(cmy.x, min(cmy.y, cmy.z));\\n  cmy = (cmy - k) / (1.0 - k);\\n  cmy = clamp(\\n\tcmy * 10.0 - 3.0 + vec3(\\n    pattern(angle + 0.26179, texSize, texCoord),\\n\t  pattern(angle + 1.30899, texSize, texCoord),\\n    pattern(angle, texSize, texCoord)\\n  ),\\n\t0.0,\\n\t1.0\\n  );\\n  k = clamp(k * 10.0 - 5.0 + pattern(angle + 0.78539, texSize, texCoord), 0.0, 1.0);\\n  return vec4(1.0 - cmy - k, color.a);\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    angle: {\n        value: 1.1,\n        softMin: 0,\n        softMax: Math.PI / 2\n    },\n    size: {\n        value: 4,\n        min: 1,\n        softMin: 3,\n        softMax: 20\n    }\n};\nexports.default = {\n    name: \"colorHalftone\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dHKPk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform vec2 center;\\nuniform float angle;\\nuniform float size;\\n\\nfloat pattern(vec2 texSize, vec2 texCoord) {\\n  float scale = 3.1415 / size;\\n\\n  float s = sin(angle), c = cos(angle);\\n  vec2 tex = texCoord * texSize - center * texSize;\\n  vec2 point = vec2(\\n    c * tex.x - s * tex.y,\\n    s * tex.x + c * tex.y\\n  ) * scale;\\n  return (sin(point.x) * sin(point.y)) * 4.0;\\n}\\n\\nvec4 dotScreen_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  float average = (color.r + color.g + color.b) / 3.0;\\n  return vec4(vec3(average * 10.0 - 5.0 + pattern(texSize, texCoord)), color.a);\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    angle: {\n        value: 1.1,\n        softMin: 0,\n        softMax: Math.PI / 2\n    },\n    size: {\n        value: 3,\n        min: 1,\n        softMin: 3,\n        softMax: 20\n    }\n};\nexports.default = {\n    name: \"dotScreen\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cQtwF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _random = require(\"../utils/random\");\nvar _randomDefault = parcelHelpers.interopDefault(_random);\nvar fs = \"uniform float radius;\\nuniform vec2 delta;\\n\\nvec4 edgeWork_sampleColor1(sampler2D source, vec2 texSize, vec2 texCoord) {\\n  vec2 relativeDelta = radius * delta / texSize;\\n\\n  vec2 color = vec2(0.0);\\n  vec2 total = vec2(0.0);\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  for (float t = -30.0; t <= 30.0; t++) {\\n    float percent = (t + offset - 0.5) / 30.0;\\n    float weight = 1.0 - abs(percent);\\n    vec3 sampleColor = texture2D(source, texCoord + relativeDelta * percent).rgb;\\n    float average = (sampleColor.r + sampleColor.g + sampleColor.b) / 3.0;\\n    color.x += average * weight;\\n    total.x += weight;\\n    if (abs(t) < 15.0) {\\n      weight = weight * 2.0 - 1.0;\\n      color.y += average * weight;\\n      total.y += weight;\\n    }\\n  }\\n  return vec4(color / total, 0.0, 1.0);\\n}\\n\\nvec4 edgeWork_sampleColor2(sampler2D source, vec2 texSize, vec2 texCoord) {\\n  vec2 relativeDelta = radius * delta / texSize;\\n\\n  vec2 color = vec2(0.0);\\n  vec2 total = vec2(0.0);\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  for (float t = -30.0; t <= 30.0; t++) {\\n    float percent = (t + offset - 0.5) / 30.0;\\n    float weight = 1.0 - abs(percent);\\n    vec2 sampleColor = texture2D(source, texCoord + relativeDelta * percent).xy;\\n    color.x += sampleColor.x * weight;\\n    total.x += weight;\\n    if (abs(t) < 15.0) {\\n      weight = weight * 2.0 - 1.0;\\n      color.y += sampleColor.y * weight;\\n      total.y += weight;\\n    }\\n  }\\n  float c = clamp(10000.0 * (color.y / total.y - color.x / total.x) + 0.5, 0.0, 1.0);\\n  return vec4(c, c, c, 1.0);\\n}\\n\";\nvar uniforms = {\n    radius: {\n        value: 2,\n        min: 1,\n        softMax: 50\n    },\n    delta: {\n        value: [\n            1,\n            0\n        ],\n        \"private\": true\n    }\n};\nexports.default = {\n    name: \"edgeWork\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _randomDefault.default)\n    ],\n    passes: [\n        {\n            sampler: \"edgeWork_sampleColor1\",\n            uniforms: {\n                delta: [\n                    1,\n                    0\n                ]\n            }\n        },\n        {\n            sampler: \"edgeWork_sampleColor2\",\n            uniforms: {\n                delta: [\n                    0,\n                    1\n                ]\n            }\n        }\n    ]\n};\n\n},{\"../utils/random\":\"3v15w\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iwIDJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform vec2 center;\\nuniform float scale;\\n\\nvec4 hexagonalPixelate_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 tex = (texCoord * texSize - center * texSize) / scale;\\n  tex.y /= 0.866025404;\\n  tex.x -= tex.y * 0.5;\\n\\n  vec2 a;\\n  if (tex.x + tex.y - floor(tex.x) - floor(tex.y) < 1.0) {\\n    a = vec2(floor(tex.x), floor(tex.y));\\n  }\\n  else a = vec2(ceil(tex.x), ceil(tex.y));\\n  vec2 b = vec2(ceil(tex.x), floor(tex.y));\\n  vec2 c = vec2(floor(tex.x), ceil(tex.y));\\n\\n  vec3 TEX = vec3(tex.x, tex.y, 1.0 - tex.x - tex.y);\\n  vec3 A = vec3(a.x, a.y, 1.0 - a.x - a.y);\\n  vec3 B = vec3(b.x, b.y, 1.0 - b.x - b.y);\\n  vec3 C = vec3(c.x, c.y, 1.0 - c.x - c.y);\\n\\n  float alen = length(TEX - A);\\n  float blen = length(TEX - B);\\n  float clen = length(TEX - C);\\n\\n  vec2 choice;\\n  if (alen < blen) {\\n    if (alen < clen) choice = a;\\n    else choice = c;\\n  } else {\\n    if (blen < clen) choice = b;\\n    else choice = c;\\n  }\\n\\n  choice.x += choice.y * 0.5;\\n  choice.y *= 0.866025404;\\n  choice *= scale / texSize;\\n\\n  return texture2D(texture, choice + center);\\n}\\n\";\nvar uniforms = {\n    center: {\n        value: [\n            0.5,\n            0.5\n        ],\n        hint: \"screenspace\"\n    },\n    scale: {\n        value: 10,\n        min: 1,\n        softMin: 5,\n        softMax: 50\n    }\n};\nexports.default = {\n    name: \"hexagonalPixelate\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2Ygpd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float strength;\\n\\nvec4 ink_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 dx = vec2(1.0 / texSize.x, 0.0);\\n  vec2 dy = vec2(0.0, 1.0 / texSize.y);\\n  vec4 color = texture2D(texture, texCoord);\\n  float bigTotal = 0.0;\\n  float smallTotal = 0.0;\\n  vec3 bigAverage = vec3(0.0);\\n  vec3 smallAverage = vec3(0.0);\\n  for (float x = -2.0; x <= 2.0; x += 1.0) {\\n    for (float y = -2.0; y <= 2.0; y += 1.0) {\\n      vec3 sample = texture2D(texture, texCoord + dx * x + dy * y).rgb;\\n      bigAverage += sample;\\n      bigTotal += 1.0;\\n      if (abs(x) + abs(y) < 2.0) {\\n        smallAverage += sample;\\n        smallTotal += 1.0;\\n      }\\n    }\\n  }\\n  vec3 edge = max(vec3(0.0), bigAverage / bigTotal - smallAverage / smallTotal);\\n  float power = strength * strength * strength * strength * strength;\\n  return vec4(color.rgb - dot(edge, edge) * power * 100000.0, color.a);\\n}\\n\";\nvar uniforms = {\n    strength: {\n        value: 0.25,\n        min: 0,\n        softMax: 1\n    }\n};\nexports.default = {\n    name: \"ink\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kzKcd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _warp = require(\"./warp\");\nvar _warpDefault = parcelHelpers.interopDefault(_warp);\nvar fs = \"uniform float radius;\\nuniform float strength;\\nuniform vec2 center;\\n\\nvec2 bulgePinch_warp(vec2 coord, vec2 texCenter) {\\n  coord -= texCenter;\\n  float distance = length(coord);\\n  if (distance < radius) {\\n    float percent = distance / radius;\\n    if (strength > 0.0) {\\n      coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75);\\n    } else {\\n      coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent);\\n    }\\n  }\\n  coord += texCenter;\\n  return coord;\\n}\\n\\nvec4 bulgePinch_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 coord = texCoord * texSize;\\n  coord = bulgePinch_warp(coord, center * texSize);\\n\\n  return warp_sampleColor(texture, texSize, coord);\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    radius: {\n        value: 200,\n        min: 1,\n        softMax: 600\n    },\n    strength: {\n        value: 0.5,\n        min: -1,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"bulgePinch\",\n    fs: fs,\n    uniforms: uniforms,\n    dependencies: [\n        (0, _warpDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"./warp\":\"5KR89\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5KR89\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"vec4 warp_sampleColor(sampler2D texture, vec2 texSize, vec2 coord) {\\n  vec4 color = texture2D(texture, coord / texSize);\\n  vec2 clampedCoord = clamp(coord, vec2(0.0), texSize);\\n  if (coord != clampedCoord) {\\n    color.a *= max(0.0, 1.0 - length(coord - clampedCoord));\\n  }\\n\\n  return color;\\n}\\n\";\nexports.default = {\n    name: \"warp\",\n    fs: fs\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"RVvTf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _warp = require(\"./warp\");\nvar _warpDefault = parcelHelpers.interopDefault(_warp);\nvar fs = \"uniform float radius;\\nuniform float angle;\\nuniform vec2 center;\\n\\nvec2 swirl_warp(vec2 coord, vec2 texCenter) {\\n  coord -= texCenter;\\n  float distance = length(coord);\\n  if (distance < radius) {\\n    float percent = (radius - distance) / radius;\\n    float theta = percent * percent * angle;\\n    float s = sin(theta);\\n    float c = cos(theta);\\n    coord = vec2(\\n      coord.x * c - coord.y * s,\\n      coord.x * s + coord.y * c\\n    );\\n  }\\n  coord += texCenter;\\n  return coord;\\n}\\n\\nvec4 swirl_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 coord = texCoord * texSize;\\n  coord = swirl_warp(coord, center * texSize);\\n\\n  return warp_sampleColor(texture, texSize, coord);\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    radius: {\n        value: 200,\n        min: 1,\n        softMax: 600\n    },\n    angle: {\n        value: 3,\n        softMin: -25,\n        softMax: 25\n    }\n};\nexports.default = {\n    name: \"swirl\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _warpDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"./warp\":\"5KR89\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cUoGY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * ORIGINAL LICENCE\n * @license\n * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *  * Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *  * Neither the name of NVIDIA CORPORATION nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */ var fs = \"\\n#define FXAA_QUALITY_PRESET 29\\n\\n#if (FXAA_QUALITY_PRESET == 10)\\n    #define FXAA_QUALITY_PS 3\\n    #define FXAA_QUALITY_P0 1.5\\n    #define FXAA_QUALITY_P1 3.0\\n    #define FXAA_QUALITY_P2 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 11)\\n    #define FXAA_QUALITY_PS 4\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 3.0\\n    #define FXAA_QUALITY_P3 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 12)\\n    #define FXAA_QUALITY_PS 5\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 4.0\\n    #define FXAA_QUALITY_P4 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 13)\\n    #define FXAA_QUALITY_PS 6\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 4.0\\n    #define FXAA_QUALITY_P5 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 14)\\n    #define FXAA_QUALITY_PS 7\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 4.0\\n    #define FXAA_QUALITY_P6 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 15)\\n    #define FXAA_QUALITY_PS 8\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 4.0\\n    #define FXAA_QUALITY_P7 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 20)\\n    #define FXAA_QUALITY_PS 3\\n    #define FXAA_QUALITY_P0 1.5\\n    #define FXAA_QUALITY_P1 2.0\\n    #define FXAA_QUALITY_P2 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 21)\\n    #define FXAA_QUALITY_PS 4\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 22)\\n    #define FXAA_QUALITY_PS 5\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 23)\\n    #define FXAA_QUALITY_PS 6\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 24)\\n    #define FXAA_QUALITY_PS 7\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 3.0\\n    #define FXAA_QUALITY_P6 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 25)\\n    #define FXAA_QUALITY_PS 8\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 4.0\\n    #define FXAA_QUALITY_P7 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 26)\\n    #define FXAA_QUALITY_PS 9\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 4.0\\n    #define FXAA_QUALITY_P8 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 27)\\n    #define FXAA_QUALITY_PS 10\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 2.0\\n    #define FXAA_QUALITY_P8 4.0\\n    #define FXAA_QUALITY_P9 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 28)\\n    #define FXAA_QUALITY_PS 11\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 2.0\\n    #define FXAA_QUALITY_P8 2.0\\n    #define FXAA_QUALITY_P9 4.0\\n    #define FXAA_QUALITY_P10 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 29)\\n    #define FXAA_QUALITY_PS 12\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 2.0\\n    #define FXAA_QUALITY_P8 2.0\\n    #define FXAA_QUALITY_P9 2.0\\n    #define FXAA_QUALITY_P10 4.0\\n    #define FXAA_QUALITY_P11 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 39)\\n    #define FXAA_QUALITY_PS 12\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.0\\n    #define FXAA_QUALITY_P2 1.0\\n    #define FXAA_QUALITY_P3 1.0\\n    #define FXAA_QUALITY_P4 1.0\\n    #define FXAA_QUALITY_P5 1.5\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 2.0\\n    #define FXAA_QUALITY_P8 2.0\\n    #define FXAA_QUALITY_P9 2.0\\n    #define FXAA_QUALITY_P10 4.0\\n    #define FXAA_QUALITY_P11 8.0\\n#endif\\n\\n#define FxaaBool bool\\n#define FxaaFloat float\\n#define FxaaFloat2 vec2\\n#define FxaaFloat3 vec3\\n#define FxaaFloat4 vec4\\n#define FxaaHalf float\\n#define FxaaHalf2 vec2\\n#define FxaaHalf3 vec3\\n#define FxaaHalf4 vec4\\n#define FxaaInt2 vec2\\n#define FxaaTex sampler2D\\n\\n#define FxaaSat(x) clamp(x, 0.0, 1.0)\\n#define FxaaTexTop(t, p) texture2D(t, p)\\n#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r))\\n\\nFxaaFloat FxaaLuma_(FxaaFloat4 rgba) { return dot(rgba.rgb, vec3(0.2126, 0.7152, 0.0722)); }\\n\\nFxaaFloat4 FxaaPixelShader_(\\n\\n\\n    FxaaFloat2 pos,\\n\\n\\n\\n\\n    FxaaTex tex,\\n\\n\\n\\n\\n    FxaaFloat2 fxaaQualityRcpFrame,\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n    FxaaFloat fxaaQualitySubpix,\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n    FxaaFloat fxaaQualityEdgeThreshold,\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n    FxaaFloat fxaaQualityEdgeThresholdMin\\n) {\\n    FxaaFloat2 posM;\\n    posM.x = pos.x;\\n    posM.y = pos.y;\\n    FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\\n    #define lumaM rgbyM.y\\n    FxaaFloat lumaS = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaE = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaN = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaW = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));\\n    FxaaFloat maxSM = max(lumaS, lumaM);\\n    FxaaFloat minSM = min(lumaS, lumaM);\\n    FxaaFloat maxESM = max(lumaE, maxSM);\\n    FxaaFloat minESM = min(lumaE, minSM);\\n    FxaaFloat maxWN = max(lumaN, lumaW);\\n    FxaaFloat minWN = min(lumaN, lumaW);\\n    FxaaFloat rangeMax = max(maxWN, maxESM);\\n    FxaaFloat rangeMin = min(minWN, minESM);\\n    FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;\\n    FxaaFloat range = rangeMax - rangeMin;\\n    FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);\\n    FxaaBool earlyExit = range < rangeMaxClamped;\\n    if(earlyExit)\\n        return rgbyM;\\n    FxaaFloat lumaNW = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaSE = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaNE = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaSW = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaNS = lumaN + lumaS;\\n    FxaaFloat lumaWE = lumaW + lumaE;\\n    FxaaFloat subpixRcpRange = 1.0/range;\\n    FxaaFloat subpixNSWE = lumaNS + lumaWE;\\n    FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;\\n    FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;\\n    FxaaFloat lumaNESE = lumaNE + lumaSE;\\n    FxaaFloat lumaNWNE = lumaNW + lumaNE;\\n    FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;\\n    FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;\\n    FxaaFloat lumaNWSW = lumaNW + lumaSW;\\n    FxaaFloat lumaSWSE = lumaSW + lumaSE;\\n    FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);\\n    FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);\\n    FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;\\n    FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;\\n    FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;\\n    FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;\\n    FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;\\n    FxaaFloat lengthSign = fxaaQualityRcpFrame.x;\\n    FxaaBool horzSpan = edgeHorz >= edgeVert;\\n    FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;\\n    if(!horzSpan) lumaN = lumaW;\\n    if(!horzSpan) lumaS = lumaE;\\n    if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;\\n    FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;\\n    FxaaFloat gradientN = lumaN - lumaM;\\n    FxaaFloat gradientS = lumaS - lumaM;\\n    FxaaFloat lumaNN = lumaN + lumaM;\\n    FxaaFloat lumaSS = lumaS + lumaM;\\n    FxaaBool pairN = abs(gradientN) >= abs(gradientS);\\n    FxaaFloat gradient = max(abs(gradientN), abs(gradientS));\\n    if(pairN) lengthSign = -lengthSign;\\n    FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);\\n    FxaaFloat2 posB;\\n    posB.x = posM.x;\\n    posB.y = posM.y;\\n    FxaaFloat2 offNP;\\n    offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\\n    offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\\n    if(!horzSpan) posB.x += lengthSign * 0.5;\\n    if( horzSpan) posB.y += lengthSign * 0.5;\\n    FxaaFloat2 posN;\\n    posN.x = posB.x - offNP.x * FXAA_QUALITY_P0;\\n    posN.y = posB.y - offNP.y * FXAA_QUALITY_P0;\\n    FxaaFloat2 posP;\\n    posP.x = posB.x + offNP.x * FXAA_QUALITY_P0;\\n    posP.y = posB.y + offNP.y * FXAA_QUALITY_P0;\\n    FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;\\n    FxaaFloat lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN));\\n    FxaaFloat subpixE = subpixC * subpixC;\\n    FxaaFloat lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP));\\n    if(!pairN) lumaNN = lumaSS;\\n    FxaaFloat gradientScaled = gradient * 1.0/4.0;\\n    FxaaFloat lumaMM = lumaM - lumaNN * 0.5;\\n    FxaaFloat subpixF = subpixD * subpixE;\\n    FxaaBool lumaMLTZero = lumaMM < 0.0;\\n    lumaEndN -= lumaNN * 0.5;\\n    lumaEndP -= lumaNN * 0.5;\\n    FxaaBool doneN = abs(lumaEndN) >= gradientScaled;\\n    FxaaBool doneP = abs(lumaEndP) >= gradientScaled;\\n    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1;\\n    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1;\\n    FxaaBool doneNP = (!doneN) || (!doneP);\\n    if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1;\\n    if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1;\\n    if(doneNP) {\\n        if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n        if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n        doneN = abs(lumaEndN) >= gradientScaled;\\n        doneP = abs(lumaEndP) >= gradientScaled;\\n        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2;\\n        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2;\\n        doneNP = (!doneN) || (!doneP);\\n        if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2;\\n        if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2;\\n        #if (FXAA_QUALITY_PS > 3)\\n        if(doneNP) {\\n            if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n            if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n            doneN = abs(lumaEndN) >= gradientScaled;\\n            doneP = abs(lumaEndP) >= gradientScaled;\\n            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3;\\n            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3;\\n            doneNP = (!doneN) || (!doneP);\\n            if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3;\\n            if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3;\\n            #if (FXAA_QUALITY_PS > 4)\\n            if(doneNP) {\\n                if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                doneN = abs(lumaEndN) >= gradientScaled;\\n                doneP = abs(lumaEndP) >= gradientScaled;\\n                if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4;\\n                if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4;\\n                doneNP = (!doneN) || (!doneP);\\n                if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4;\\n                if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4;\\n                #if (FXAA_QUALITY_PS > 5)\\n                if(doneNP) {\\n                    if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                    if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                    if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                    if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                    doneN = abs(lumaEndN) >= gradientScaled;\\n                    doneP = abs(lumaEndP) >= gradientScaled;\\n                    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5;\\n                    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5;\\n                    doneNP = (!doneN) || (!doneP);\\n                    if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5;\\n                    if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5;\\n                    #if (FXAA_QUALITY_PS > 6)\\n                    if(doneNP) {\\n                        if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                        if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                        doneN = abs(lumaEndN) >= gradientScaled;\\n                        doneP = abs(lumaEndP) >= gradientScaled;\\n                        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6;\\n                        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6;\\n                        doneNP = (!doneN) || (!doneP);\\n                        if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6;\\n                        if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6;\\n                        #if (FXAA_QUALITY_PS > 7)\\n                        if(doneNP) {\\n                            if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                            if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                            doneN = abs(lumaEndN) >= gradientScaled;\\n                            doneP = abs(lumaEndP) >= gradientScaled;\\n                            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7;\\n                            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7;\\n                            doneNP = (!doneN) || (!doneP);\\n                            if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7;\\n                            if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7;\\n    #if (FXAA_QUALITY_PS > 8)\\n    if(doneNP) {\\n        if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n        if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n        doneN = abs(lumaEndN) >= gradientScaled;\\n        doneP = abs(lumaEndP) >= gradientScaled;\\n        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8;\\n        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8;\\n        doneNP = (!doneN) || (!doneP);\\n        if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8;\\n        if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8;\\n        #if (FXAA_QUALITY_PS > 9)\\n        if(doneNP) {\\n            if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n            if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n            doneN = abs(lumaEndN) >= gradientScaled;\\n            doneP = abs(lumaEndP) >= gradientScaled;\\n            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9;\\n            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9;\\n            doneNP = (!doneN) || (!doneP);\\n            if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9;\\n            if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9;\\n            #if (FXAA_QUALITY_PS > 10)\\n            if(doneNP) {\\n                if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                doneN = abs(lumaEndN) >= gradientScaled;\\n                doneP = abs(lumaEndP) >= gradientScaled;\\n                if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10;\\n                if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10;\\n                doneNP = (!doneN) || (!doneP);\\n                if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10;\\n                if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10;\\n                #if (FXAA_QUALITY_PS > 11)\\n                if(doneNP) {\\n                    if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                    if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                    if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                    if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                    doneN = abs(lumaEndN) >= gradientScaled;\\n                    doneP = abs(lumaEndP) >= gradientScaled;\\n                    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11;\\n                    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11;\\n                    doneNP = (!doneN) || (!doneP);\\n                    if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11;\\n                    if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11;\\n                    #if (FXAA_QUALITY_PS > 12)\\n                    if(doneNP) {\\n                        if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                        if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                        doneN = abs(lumaEndN) >= gradientScaled;\\n                        doneP = abs(lumaEndP) >= gradientScaled;\\n                        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12;\\n                        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12;\\n                        doneNP = (!doneN) || (!doneP);\\n                        if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12;\\n                        if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12;\\n                    }\\n                    #endif\\n                }\\n                #endif\\n            }\\n            #endif\\n        }\\n        #endif\\n    }\\n    #endif\\n                        }\\n                        #endif\\n                    }\\n                    #endif\\n                }\\n                #endif\\n            }\\n            #endif\\n        }\\n        #endif\\n    }\\n    FxaaFloat dstN = posM.x - posN.x;\\n    FxaaFloat dstP = posP.x - posM.x;\\n    if(!horzSpan) dstN = posM.y - posN.y;\\n    if(!horzSpan) dstP = posP.y - posM.y;\\n    FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;\\n    FxaaFloat spanLength = (dstP + dstN);\\n    FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;\\n    FxaaFloat spanLengthRcp = 1.0/spanLength;\\n    FxaaBool directionN = dstN < dstP;\\n    FxaaFloat dst = min(dstN, dstP);\\n    FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;\\n    FxaaFloat subpixG = subpixF * subpixF;\\n    FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;\\n    FxaaFloat subpixH = subpixG * fxaaQualitySubpix;\\n    FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;\\n    FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);\\n    if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;\\n    if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;\\n    return FxaaTexTop(tex, posM);\\n}\\n\\nvec4 fxaa_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n    const float fxaa_QualitySubpix = 0.5;\\n    const float fxaa_QualityEdgeThreshold = 0.125;\\n    const float fxaa_QualityEdgeThresholdMin = 0.0833;\\n\\n    return FxaaPixelShader_(\\n        texCoord,\\n        texture,\\n        vec2(1.0) / texSize,\\n        fxaa_QualitySubpix,\\n        fxaa_QualityEdgeThreshold,\\n        fxaa_QualityEdgeThresholdMin\\n    );\\n}\\n\";\nexports.default = {\n    name: \"fxaa\",\n    uniforms: {},\n    fs: fs,\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8xeP4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar vs = \"attribute float transform_elementID;\\nvec2 transform_getPixelSizeHalf(vec2 size) {\\n  return vec2(1.) / (2. * size);\\n}\\n\\nvec2 transform_getPixelIndices(vec2 texSize, vec2 pixelSizeHalf) {\\n  float yIndex = floor((transform_elementID / texSize[0]) + pixelSizeHalf[1]);\\n  float xIndex = transform_elementID - (yIndex * texSize[0]);\\n  return vec2(xIndex, yIndex);\\n}\\nvec2 transform_getTexCoord(vec2 size) {\\n  vec2 pixelSizeHalf = transform_getPixelSizeHalf(size);\\n  vec2 indices = transform_getPixelIndices(size, pixelSizeHalf);\\n  vec2 coord = indices / size + pixelSizeHalf;\\n  return coord;\\n}\\nvec2 transform_getPos(vec2 size) {\\n  vec2 texCoord = transform_getTexCoord(size);\\n  vec2 pos = (texCoord * (2.0, 2.0)) - (1., 1.);\\n  return pos;\\n}\\nvec4 transform_getInput(sampler2D texSampler, vec2 size) {\\n  vec2 texCoord = transform_getTexCoord(size);\\n  vec4 textureColor = texture2D(texSampler, texCoord);\\n  return textureColor;\\n}\\n\";\nexports.default = {\n    name: \"transform\",\n    vs: vs,\n    fs: null\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Rgou\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getBuffersFromGeometry\", ()=>getBuffersFromGeometry);\nparcelHelpers.export(exports, \"inferAttributeAccessor\", ()=>inferAttributeAccessor);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar GLTF_TO_LUMA_ATTRIBUTE_MAP = {\n    POSITION: \"positions\",\n    NORMAL: \"normals\",\n    COLOR_0: \"colors\",\n    TEXCOORD_0: \"texCoords\",\n    TEXCOORD_1: \"texCoords1\",\n    TEXCOORD_2: \"texCoords2\"\n};\nfunction getBuffersFromGeometry(gl, geometry, options) {\n    var buffers = {};\n    var indices = geometry.indices;\n    for(var name in geometry.attributes){\n        var attribute = geometry.attributes[name];\n        var remappedName = mapAttributeName(name, options);\n        if (name === \"indices\") indices = attribute;\n        else if (attribute.constant) buffers[remappedName] = attribute.value;\n        else {\n            var typedArray = attribute.value;\n            var accessor = (0, _objectSpreadDefault.default)({}, attribute);\n            delete accessor.value;\n            buffers[remappedName] = [\n                new (0, _webgl.Buffer)(gl, typedArray),\n                accessor\n            ];\n            inferAttributeAccessor(name, accessor);\n        }\n    }\n    if (indices) {\n        var data = indices.value || indices;\n        (0, _webgl.assert)(data instanceof Uint16Array || data instanceof Uint32Array, 'attribute array for \"indices\" must be of integer type');\n        var _accessor = {\n            size: 1,\n            isIndexed: indices.isIndexed === undefined ? true : indices.isIndexed\n        };\n        buffers.indices = [\n            new (0, _webgl.Buffer)(gl, {\n                data: data,\n                target: 34963\n            }),\n            _accessor\n        ];\n    }\n    return buffers;\n}\nfunction mapAttributeName(name, options) {\n    var _ref = options || {}, _ref$attributeMap = _ref.attributeMap, attributeMap = _ref$attributeMap === void 0 ? GLTF_TO_LUMA_ATTRIBUTE_MAP : _ref$attributeMap;\n    return attributeMap && attributeMap[name] || name;\n}\nfunction inferAttributeAccessor(attributeName, attribute) {\n    var category;\n    switch(attributeName){\n        case \"texCoords\":\n        case \"texCoord1\":\n        case \"texCoord2\":\n        case \"texCoord3\":\n            category = \"uvs\";\n            break;\n        case \"vertices\":\n        case \"positions\":\n        case \"normals\":\n        case \"pickingColors\":\n            category = \"vectors\";\n            break;\n        default:\n    }\n    switch(category){\n        case \"vectors\":\n            attribute.size = attribute.size || 3;\n            break;\n        case \"uvs\":\n            attribute.size = attribute.size || 2;\n            break;\n        default:\n    }\n    (0, _webgl.assert)(Number.isFinite(attribute.size), \"attribute \".concat(attributeName, \" needs size\"));\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lC8i9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _definePropertyJs = require(\"./defineProperty.js\");\nvar _definePropertyJsDefault = parcelHelpers.interopDefault(_definePropertyJs);\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? Object(arguments[i]) : {};\n        var ownKeys = Object.keys(source);\n        if (typeof Object.getOwnPropertySymbols === \"function\") ownKeys.push.apply(ownKeys, Object.getOwnPropertySymbols(source).filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n        ownKeys.forEach(function(key) {\n            (0, _definePropertyJsDefault.default)(target, key, source[key]);\n        });\n    }\n    return target;\n}\nexports.default = _objectSpread;\n\n},{\"./defineProperty.js\":\"5Xk1p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ibB0s\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Transform);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _shadertools = require(\"@luma.gl/shadertools\");\nvar _bufferTransform = require(\"./buffer-transform\");\nvar _bufferTransformDefault = parcelHelpers.interopDefault(_bufferTransform);\nvar _textureTransform = require(\"./texture-transform\");\nvar _textureTransformDefault = parcelHelpers.interopDefault(_textureTransform);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _model = require(\"../lib/model\");\nvar _modelDefault = parcelHelpers.interopDefault(_model);\nvar Transform = function() {\n    (0, _createClassDefault.default)(Transform1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                return (0, _gltools.isWebGL2)(gl);\n            }\n        }\n    ]);\n    function Transform1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Transform1);\n        this.gl = gl;\n        this.model = null;\n        this.elementCount = 0;\n        this.bufferTransform = null;\n        this.textureTransform = null;\n        this.elementIDBuffer = null;\n        this._initialize(props);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(Transform1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                var model = this.model, bufferTransform = this.bufferTransform, textureTransform = this.textureTransform;\n                if (model) model[\"delete\"]();\n                if (bufferTransform) bufferTransform[\"delete\"]();\n                if (textureTransform) textureTransform[\"delete\"]();\n            }\n        },\n        {\n            key: \"run\",\n            value: function run() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _opts$clearRenderTarg = opts.clearRenderTarget, clearRenderTarget = _opts$clearRenderTarg === void 0 ? true : _opts$clearRenderTarg;\n                var updatedOpts = this._updateDrawOptions(opts);\n                if (clearRenderTarget && updatedOpts.framebuffer) updatedOpts.framebuffer.clear({\n                    color: true\n                });\n                this.model.transform(updatedOpts);\n            }\n        },\n        {\n            key: \"swap\",\n            value: function swap() {\n                var swapped = false;\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = resourceTransforms[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var resourceTransform = _step.value;\n                        swapped = swapped || resourceTransform.swap();\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                (0, _webgl.assert)(swapped, \"Nothing to swap\");\n            }\n        },\n        {\n            key: \"getBuffer\",\n            value: function getBuffer() {\n                var varyingName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                return this.bufferTransform && this.bufferTransform.getBuffer(varyingName);\n            }\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion2 = true;\n                var _didIteratorError2 = false;\n                var _iteratorError2 = undefined;\n                try {\n                    for(var _iterator2 = resourceTransforms[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                        var resourceTransform = _step2.value;\n                        var data = resourceTransform.getData(opts);\n                        if (data) return data;\n                    }\n                } catch (err) {\n                    _didIteratorError2 = true;\n                    _iteratorError2 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n                    } finally{\n                        if (_didIteratorError2) throw _iteratorError2;\n                    }\n                }\n                return null;\n            }\n        },\n        {\n            key: \"getFramebuffer\",\n            value: function getFramebuffer() {\n                return this.textureTransform && this.textureTransform.getFramebuffer();\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (\"elementCount\" in opts) this.model.setVertexCount(opts.elementCount);\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion3 = true;\n                var _didIteratorError3 = false;\n                var _iteratorError3 = undefined;\n                try {\n                    for(var _iterator3 = resourceTransforms[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){\n                        var resourceTransform = _step3.value;\n                        resourceTransform.update(opts);\n                    }\n                } catch (err) {\n                    _didIteratorError3 = true;\n                    _iteratorError3 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) _iterator3[\"return\"]();\n                    } finally{\n                        if (_didIteratorError3) throw _iteratorError3;\n                    }\n                }\n            }\n        },\n        {\n            key: \"_initialize\",\n            value: function _initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var gl = this.gl;\n                this._buildResourceTransforms(gl, props);\n                props = this._updateModelProps(props);\n                this.model = new (0, _modelDefault.default)(gl, Object.assign({}, props, {\n                    fs: props.fs || (0, _shadertools.getPassthroughFS)({\n                        version: (0, _webgl.getShaderVersion)(props.vs)\n                    }),\n                    id: props.id || \"transform-model\",\n                    drawMode: props.drawMode || 0,\n                    vertexCount: props.elementCount\n                }));\n                this.bufferTransform && this.bufferTransform.setupResources({\n                    model: this.model\n                });\n            }\n        },\n        {\n            key: \"_updateModelProps\",\n            value: function _updateModelProps(props) {\n                var updatedProps = Object.assign({}, props);\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion4 = true;\n                var _didIteratorError4 = false;\n                var _iteratorError4 = undefined;\n                try {\n                    for(var _iterator4 = resourceTransforms[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true){\n                        var resourceTransform = _step4.value;\n                        updatedProps = resourceTransform.updateModelProps(updatedProps);\n                    }\n                } catch (err) {\n                    _didIteratorError4 = true;\n                    _iteratorError4 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion4 && _iterator4[\"return\"] != null) _iterator4[\"return\"]();\n                    } finally{\n                        if (_didIteratorError4) throw _iteratorError4;\n                    }\n                }\n                return updatedProps;\n            }\n        },\n        {\n            key: \"_buildResourceTransforms\",\n            value: function _buildResourceTransforms(gl, props) {\n                if (canCreateBufferTransform(props)) this.bufferTransform = new (0, _bufferTransformDefault.default)(gl, props);\n                if (canCreateTextureTransform(props)) this.textureTransform = new (0, _textureTransformDefault.default)(gl, props);\n                (0, _webgl.assert)(this.bufferTransform || this.textureTransform, \"must provide source/feedback buffers or source/target textures\");\n            }\n        },\n        {\n            key: \"_updateDrawOptions\",\n            value: function _updateDrawOptions(opts) {\n                var updatedOpts = Object.assign({}, opts);\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion5 = true;\n                var _didIteratorError5 = false;\n                var _iteratorError5 = undefined;\n                try {\n                    for(var _iterator5 = resourceTransforms[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true){\n                        var resourceTransform = _step5.value;\n                        updatedOpts = Object.assign(updatedOpts, resourceTransform.getDrawOptions(updatedOpts));\n                    }\n                } catch (err) {\n                    _didIteratorError5 = true;\n                    _iteratorError5 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion5 && _iterator5[\"return\"] != null) _iterator5[\"return\"]();\n                    } finally{\n                        if (_didIteratorError5) throw _iteratorError5;\n                    }\n                }\n                return updatedOpts;\n            }\n        }\n    ]);\n    return Transform1;\n}();\nfunction canCreateBufferTransform(props) {\n    if (!(0, _webgl.isObjectEmpty)(props.feedbackBuffers) || !(0, _webgl.isObjectEmpty)(props.feedbackMap) || props.varyings && props.varyings.length > 0) return true;\n    return false;\n}\nfunction canCreateTextureTransform(props) {\n    if (!(0, _webgl.isObjectEmpty)(props._sourceTextures) || props._targetTexture || props._targetTextureVarying) return true;\n    return false;\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/shadertools\":\"8wgxL\",\"./buffer-transform\":\"kJP2U\",\"./texture-transform\":\"btki2\",\"@luma.gl/gltools\":\"7HW6a\",\"@luma.gl/webgl\":\"caucX\",\"../lib/model\":\"9CDGf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kJP2U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>BufferTransform);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar BufferTransform = function() {\n    function BufferTransform1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, BufferTransform1);\n        this.gl = gl;\n        this.currentIndex = 0;\n        this.feedbackMap = {};\n        this.varyings = null;\n        this.bindings = [];\n        this.resources = {};\n        this._initialize(props);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(BufferTransform1, [\n        {\n            key: \"setupResources\",\n            value: function setupResources(opts) {\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = this.bindings[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var binding = _step.value;\n                        this._setupTransformFeedback(binding, opts);\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n            }\n        },\n        {\n            key: \"updateModelProps\",\n            value: function updateModelProps() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var varyings = this.varyings;\n                if (varyings.length > 0) props = Object.assign({}, props, {\n                    varyings: varyings\n                });\n                return props;\n            }\n        },\n        {\n            key: \"getDrawOptions\",\n            value: function getDrawOptions() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var binding = this.bindings[this.currentIndex];\n                var sourceBuffers = binding.sourceBuffers, transformFeedback = binding.transformFeedback;\n                var attributes = Object.assign({}, sourceBuffers, opts.attributes);\n                return {\n                    attributes: attributes,\n                    transformFeedback: transformFeedback\n                };\n            }\n        },\n        {\n            key: \"swap\",\n            value: function swap() {\n                if (this.feedbackMap) {\n                    this.currentIndex = this._getNextIndex();\n                    return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this._setupBuffers(opts);\n            }\n        },\n        {\n            key: \"getBuffer\",\n            value: function getBuffer(varyingName) {\n                var feedbackBuffers = this.bindings[this.currentIndex].feedbackBuffers;\n                var bufferOrParams = varyingName ? feedbackBuffers[varyingName] : null;\n                if (!bufferOrParams) return null;\n                return bufferOrParams instanceof (0, _webgl.Buffer) ? bufferOrParams : bufferOrParams.buffer;\n            }\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, varyingName = _ref.varyingName;\n                var buffer = this.getBuffer(varyingName);\n                if (buffer) return buffer.getData();\n                return null;\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                for(var name in this.resources)this.resources[name][\"delete\"]();\n            }\n        },\n        {\n            key: \"_initialize\",\n            value: function _initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this._setupBuffers(props);\n                this.varyings = props.varyings || Object.keys(this.bindings[this.currentIndex].feedbackBuffers);\n                if (this.varyings.length > 0) (0, _webgl.assert)((0, _gltools.isWebGL2)(this.gl));\n            }\n        },\n        {\n            key: \"_getFeedbackBuffers\",\n            value: function _getFeedbackBuffers(props) {\n                var _props$sourceBuffers = props.sourceBuffers, sourceBuffers = _props$sourceBuffers === void 0 ? {} : _props$sourceBuffers;\n                var feedbackBuffers = {};\n                if (this.bindings[this.currentIndex]) Object.assign(feedbackBuffers, this.bindings[this.currentIndex].feedbackBuffers);\n                if (this.feedbackMap) for(var sourceName in this.feedbackMap){\n                    var feedbackName = this.feedbackMap[sourceName];\n                    if (sourceName in sourceBuffers) feedbackBuffers[feedbackName] = sourceName;\n                }\n                Object.assign(feedbackBuffers, props.feedbackBuffers);\n                for(var bufferName in feedbackBuffers){\n                    var bufferOrRef = feedbackBuffers[bufferName];\n                    if (typeof bufferOrRef === \"string\") {\n                        var sourceBuffer = sourceBuffers[bufferOrRef];\n                        var byteLength = sourceBuffer.byteLength, usage = sourceBuffer.usage, accessor = sourceBuffer.accessor;\n                        feedbackBuffers[bufferName] = this._createNewBuffer(bufferName, {\n                            byteLength: byteLength,\n                            usage: usage,\n                            accessor: accessor\n                        });\n                    }\n                }\n                return feedbackBuffers;\n            }\n        },\n        {\n            key: \"_setupBuffers\",\n            value: function _setupBuffers() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _props$sourceBuffers2 = props.sourceBuffers, sourceBuffers = _props$sourceBuffers2 === void 0 ? null : _props$sourceBuffers2;\n                Object.assign(this.feedbackMap, props.feedbackMap);\n                var feedbackBuffers = this._getFeedbackBuffers(props);\n                this._updateBindings({\n                    sourceBuffers: sourceBuffers,\n                    feedbackBuffers: feedbackBuffers\n                });\n            }\n        },\n        {\n            key: \"_setupTransformFeedback\",\n            value: function _setupTransformFeedback(binding, _ref2) {\n                var model = _ref2.model;\n                var program = model.program;\n                binding.transformFeedback = new (0, _webgl.TransformFeedback)(this.gl, {\n                    program: program,\n                    buffers: binding.feedbackBuffers\n                });\n            }\n        },\n        {\n            key: \"_updateBindings\",\n            value: function _updateBindings(opts) {\n                this.bindings[this.currentIndex] = this._updateBinding(this.bindings[this.currentIndex], opts);\n                if (this.feedbackMap) {\n                    var _this$_swapBuffers = this._swapBuffers(this.bindings[this.currentIndex]), sourceBuffers = _this$_swapBuffers.sourceBuffers, feedbackBuffers = _this$_swapBuffers.feedbackBuffers;\n                    var nextIndex = this._getNextIndex();\n                    this.bindings[nextIndex] = this._updateBinding(this.bindings[nextIndex], {\n                        sourceBuffers: sourceBuffers,\n                        feedbackBuffers: feedbackBuffers\n                    });\n                }\n            }\n        },\n        {\n            key: \"_updateBinding\",\n            value: function _updateBinding(binding, opts) {\n                if (!binding) return {\n                    sourceBuffers: Object.assign({}, opts.sourceBuffers),\n                    feedbackBuffers: Object.assign({}, opts.feedbackBuffers)\n                };\n                Object.assign(binding.sourceBuffers, opts.sourceBuffers);\n                Object.assign(binding.feedbackBuffers, opts.feedbackBuffers);\n                if (binding.transformFeedback) binding.transformFeedback.setBuffers(binding.feedbackBuffers);\n                return binding;\n            }\n        },\n        {\n            key: \"_swapBuffers\",\n            value: function _swapBuffers(opts) {\n                if (!this.feedbackMap) return null;\n                var sourceBuffers = Object.assign({}, opts.sourceBuffers);\n                var feedbackBuffers = Object.assign({}, opts.feedbackBuffers);\n                for(var srcName in this.feedbackMap){\n                    var dstName = this.feedbackMap[srcName];\n                    sourceBuffers[srcName] = opts.feedbackBuffers[dstName];\n                    feedbackBuffers[dstName] = opts.sourceBuffers[srcName];\n                    (0, _webgl.assert)(feedbackBuffers[dstName] instanceof (0, _webgl.Buffer));\n                }\n                return {\n                    sourceBuffers: sourceBuffers,\n                    feedbackBuffers: feedbackBuffers\n                };\n            }\n        },\n        {\n            key: \"_createNewBuffer\",\n            value: function _createNewBuffer(name, opts) {\n                var buffer = new (0, _webgl.Buffer)(this.gl, opts);\n                if (this.resources[name]) this.resources[name][\"delete\"]();\n                this.resources[name] = buffer;\n                return buffer;\n            }\n        },\n        {\n            key: \"_getNextIndex\",\n            value: function _getNextIndex() {\n                return (this.currentIndex + 1) % 2;\n            }\n        }\n    ]);\n    return BufferTransform1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/gltools\":\"7HW6a\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"btki2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TextureTransform);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _shadertools = require(\"@luma.gl/shadertools\");\nvar _transformShaderUtils = require(\"./transform-shader-utils\");\nvar _SRC_TEX_PARAMETER_OV;\nvar SRC_TEX_PARAMETER_OVERRIDES = (_SRC_TEX_PARAMETER_OV = {}, (0, _definePropertyDefault.default)(_SRC_TEX_PARAMETER_OV, 10241, 9728), (0, _definePropertyDefault.default)(_SRC_TEX_PARAMETER_OV, 10240, 9728), (0, _definePropertyDefault.default)(_SRC_TEX_PARAMETER_OV, 10242, 33071), (0, _definePropertyDefault.default)(_SRC_TEX_PARAMETER_OV, 10243, 33071), _SRC_TEX_PARAMETER_OV);\nvar FS_OUTPUT_VARIABLE = \"transform_output\";\nvar TextureTransform = function() {\n    function TextureTransform1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, TextureTransform1);\n        this.gl = gl;\n        this.currentIndex = 0;\n        this._swapTexture = null;\n        this.targetTextureVarying = null;\n        this.targetTextureType = null;\n        this.samplerTextureMap = null;\n        this.bindings = [];\n        this.resources = {};\n        this._initialize(props);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(TextureTransform1, [\n        {\n            key: \"updateModelProps\",\n            value: function updateModelProps() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var updatedModelProps = this._processVertexShader(props);\n                return Object.assign({}, props, updatedModelProps);\n            }\n        },\n        {\n            key: \"getDrawOptions\",\n            value: function getDrawOptions() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _this$bindings$this$c = this.bindings[this.currentIndex], sourceBuffers = _this$bindings$this$c.sourceBuffers, sourceTextures = _this$bindings$this$c.sourceTextures, framebuffer = _this$bindings$this$c.framebuffer, targetTexture = _this$bindings$this$c.targetTexture;\n                var attributes = Object.assign({}, sourceBuffers, opts.attributes);\n                var uniforms = Object.assign({}, opts.uniforms);\n                var parameters = Object.assign({}, opts.parameters);\n                var discard = opts.discard;\n                if (this.hasSourceTextures || this.hasTargetTexture) {\n                    attributes.transform_elementID = this.elementIDBuffer;\n                    for(var sampler in this.samplerTextureMap){\n                        var textureName = this.samplerTextureMap[sampler];\n                        uniforms[sampler] = sourceTextures[textureName];\n                    }\n                    this._setSourceTextureParameters();\n                    var sizeUniforms = (0, _transformShaderUtils.getSizeUniforms)({\n                        sourceTextureMap: sourceTextures,\n                        targetTextureVarying: this.targetTextureVarying,\n                        targetTexture: targetTexture\n                    });\n                    Object.assign(uniforms, sizeUniforms);\n                }\n                if (this.hasTargetTexture) {\n                    discard = false;\n                    parameters.viewport = [\n                        0,\n                        0,\n                        framebuffer.width,\n                        framebuffer.height\n                    ];\n                }\n                return {\n                    attributes: attributes,\n                    framebuffer: framebuffer,\n                    uniforms: uniforms,\n                    discard: discard,\n                    parameters: parameters\n                };\n            }\n        },\n        {\n            key: \"swap\",\n            value: function swap() {\n                if (this._swapTexture) {\n                    this.currentIndex = this._getNextIndex();\n                    return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this._setupTextures(opts);\n            }\n        },\n        {\n            key: \"getTargetTexture\",\n            value: function getTargetTexture() {\n                var targetTexture = this.bindings[this.currentIndex].targetTexture;\n                return targetTexture;\n            }\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$packed = _ref.packed, packed = _ref$packed === void 0 ? false : _ref$packed;\n                var framebuffer = this.bindings[this.currentIndex].framebuffer;\n                var pixels = (0, _webgl.readPixelsToArray)(framebuffer);\n                if (!packed) return pixels;\n                var ArrayType = pixels.constructor;\n                var channelCount = (0, _shadertools.typeToChannelCount)(this.targetTextureType);\n                var packedPixels = new ArrayType(pixels.length * channelCount / 4);\n                var packCount = 0;\n                for(var i = 0; i < pixels.length; i += 4)for(var j = 0; j < channelCount; j++)packedPixels[packCount++] = pixels[i + j];\n                return packedPixels;\n            }\n        },\n        {\n            key: \"getFramebuffer\",\n            value: function getFramebuffer() {\n                var currentResources = this.bindings[this.currentIndex];\n                return currentResources.framebuffer;\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                if (this.ownTexture) this.ownTexture[\"delete\"]();\n                if (this.elementIDBuffer) this.elementIDBuffer[\"delete\"]();\n            }\n        },\n        {\n            key: \"_initialize\",\n            value: function _initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _targetTextureVarying = props._targetTextureVarying, _swapTexture = props._swapTexture;\n                this._swapTexture = _swapTexture;\n                this.targetTextureVarying = _targetTextureVarying;\n                this.hasTargetTexture = _targetTextureVarying;\n                this._setupTextures(props);\n            }\n        },\n        {\n            key: \"_createTargetTexture\",\n            value: function _createTargetTexture(props) {\n                var sourceTextures = props.sourceTextures, textureOrReference = props.textureOrReference;\n                if (textureOrReference instanceof (0, _webgl.Texture2D)) return textureOrReference;\n                var refTexture = sourceTextures[textureOrReference];\n                if (!refTexture) return null;\n                this._targetRefTexName = textureOrReference;\n                return this._createNewTexture(refTexture);\n            }\n        },\n        {\n            key: \"_setupTextures\",\n            value: function _setupTextures() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var sourceBuffers = props.sourceBuffers, _props$_sourceTexture = props._sourceTextures, _sourceTextures = _props$_sourceTexture === void 0 ? {} : _props$_sourceTexture, _targetTexture = props._targetTexture;\n                var targetTexture = this._createTargetTexture({\n                    sourceTextures: _sourceTextures,\n                    textureOrReference: _targetTexture\n                });\n                this.hasSourceTextures = this.hasSourceTextures || _sourceTextures && Object.keys(_sourceTextures).length > 0;\n                this._updateBindings({\n                    sourceBuffers: sourceBuffers,\n                    sourceTextures: _sourceTextures,\n                    targetTexture: targetTexture\n                });\n                if (\"elementCount\" in props) this._updateElementIDBuffer(props.elementCount);\n            }\n        },\n        {\n            key: \"_updateElementIDBuffer\",\n            value: function _updateElementIDBuffer(elementCount) {\n                if (typeof elementCount !== \"number\" || this.elementCount >= elementCount) return;\n                var elementIds = new Float32Array(elementCount);\n                elementIds.forEach(function(_, index, array) {\n                    array[index] = index;\n                });\n                if (!this.elementIDBuffer) this.elementIDBuffer = new (0, _webgl.Buffer)(this.gl, {\n                    data: elementIds,\n                    accessor: {\n                        size: 1\n                    }\n                });\n                else this.elementIDBuffer.setData({\n                    data: elementIds\n                });\n                this.elementCount = elementCount;\n            }\n        },\n        {\n            key: \"_updateBindings\",\n            value: function _updateBindings(opts) {\n                this.bindings[this.currentIndex] = this._updateBinding(this.bindings[this.currentIndex], opts);\n                if (this._swapTexture) {\n                    var _this$_swapTextures = this._swapTextures(this.bindings[this.currentIndex]), sourceTextures = _this$_swapTextures.sourceTextures, targetTexture = _this$_swapTextures.targetTexture;\n                    var nextIndex = this._getNextIndex();\n                    this.bindings[nextIndex] = this._updateBinding(this.bindings[nextIndex], {\n                        sourceTextures: sourceTextures,\n                        targetTexture: targetTexture\n                    });\n                }\n            }\n        },\n        {\n            key: \"_updateBinding\",\n            value: function _updateBinding(binding, opts) {\n                var sourceBuffers = opts.sourceBuffers, sourceTextures = opts.sourceTextures, targetTexture = opts.targetTexture;\n                if (!binding) binding = {\n                    sourceBuffers: {},\n                    sourceTextures: {},\n                    targetTexture: null\n                };\n                Object.assign(binding.sourceTextures, sourceTextures);\n                Object.assign(binding.sourceBuffers, sourceBuffers);\n                if (targetTexture) {\n                    binding.targetTexture = targetTexture;\n                    var width = targetTexture.width, height = targetTexture.height;\n                    var _binding = binding, framebuffer = _binding.framebuffer;\n                    if (framebuffer) {\n                        framebuffer.update({\n                            attachments: (0, _definePropertyDefault.default)({}, 36064, targetTexture),\n                            resizeAttachments: false\n                        });\n                        framebuffer.resize({\n                            width: width,\n                            height: height\n                        });\n                    } else binding.framebuffer = new (0, _webgl.Framebuffer)(this.gl, {\n                        id: \"\".concat(this.id || \"transform\", \"-framebuffer\"),\n                        width: width,\n                        height: height,\n                        attachments: (0, _definePropertyDefault.default)({}, 36064, targetTexture)\n                    });\n                }\n                return binding;\n            }\n        },\n        {\n            key: \"_setSourceTextureParameters\",\n            value: function _setSourceTextureParameters() {\n                var index = this.currentIndex;\n                var sourceTextures = this.bindings[index].sourceTextures;\n                for(var name in sourceTextures)sourceTextures[name].setParameters(SRC_TEX_PARAMETER_OVERRIDES);\n            }\n        },\n        {\n            key: \"_swapTextures\",\n            value: function _swapTextures(opts) {\n                if (!this._swapTexture) return null;\n                var sourceTextures = Object.assign({}, opts.sourceTextures);\n                sourceTextures[this._swapTexture] = opts.targetTexture;\n                var targetTexture = opts.sourceTextures[this._swapTexture];\n                return {\n                    sourceTextures: sourceTextures,\n                    targetTexture: targetTexture\n                };\n            }\n        },\n        {\n            key: \"_createNewTexture\",\n            value: function _createNewTexture(refTexture) {\n                var _parameters;\n                var texture = (0, _webgl.cloneTextureFrom)(refTexture, {\n                    parameters: (_parameters = {}, (0, _definePropertyDefault.default)(_parameters, 10241, 9728), (0, _definePropertyDefault.default)(_parameters, 10240, 9728), (0, _definePropertyDefault.default)(_parameters, 10242, 33071), (0, _definePropertyDefault.default)(_parameters, 10243, 33071), _parameters),\n                    pixelStore: (0, _definePropertyDefault.default)({}, 37440, false)\n                });\n                if (this.ownTexture) this.ownTexture[\"delete\"]();\n                this.ownTexture = texture;\n                return texture;\n            }\n        },\n        {\n            key: \"_getNextIndex\",\n            value: function _getNextIndex() {\n                return (this.currentIndex + 1) % 2;\n            }\n        },\n        {\n            key: \"_processVertexShader\",\n            value: function _processVertexShader() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _this$bindings$this$c2 = this.bindings[this.currentIndex], sourceTextures = _this$bindings$this$c2.sourceTextures, targetTexture = _this$bindings$this$c2.targetTexture;\n                var _updateForTextures = (0, _transformShaderUtils.updateForTextures)({\n                    vs: props.vs,\n                    sourceTextureMap: sourceTextures,\n                    targetTextureVarying: this.targetTextureVarying,\n                    targetTexture: targetTexture\n                }), vs = _updateForTextures.vs, uniforms = _updateForTextures.uniforms, targetTextureType = _updateForTextures.targetTextureType, inject = _updateForTextures.inject, samplerTextureMap = _updateForTextures.samplerTextureMap;\n                var combinedInject = (0, _shadertools.combineInjects)([\n                    props.inject || {},\n                    inject\n                ]);\n                this.targetTextureType = targetTextureType;\n                this.samplerTextureMap = samplerTextureMap;\n                var fs = props._fs || (0, _shadertools.getPassthroughFS)({\n                    version: (0, _webgl.getShaderVersion)(vs),\n                    input: this.targetTextureVarying,\n                    inputType: targetTextureType,\n                    output: FS_OUTPUT_VARIABLE\n                });\n                var modules = this.hasSourceTextures || this.targetTextureVarying ? [\n                    (0, _shadertools._transform)\n                ].concat(props.modules || []) : props.modules;\n                return {\n                    vs: vs,\n                    fs: fs,\n                    modules: modules,\n                    uniforms: uniforms,\n                    inject: combinedInject\n                };\n            }\n        }\n    ]);\n    return TextureTransform1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@luma.gl/webgl\":\"caucX\",\"@luma.gl/shadertools\":\"8wgxL\",\"./transform-shader-utils\":\"j0xhO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j0xhO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"updateForTextures\", ()=>updateForTextures);\nparcelHelpers.export(exports, \"getSizeUniforms\", ()=>getSizeUniforms);\nparcelHelpers.export(exports, \"getVaryingType\", ()=>getVaryingType);\nparcelHelpers.export(exports, \"processAttributeDefinition\", ()=>processAttributeDefinition);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _shadertools = require(\"@luma.gl/shadertools\");\nvar SAMPLER_UNIFORM_PREFIX = \"transform_uSampler_\";\nvar SIZE_UNIFORM_PREFIX = \"transform_uSize_\";\nvar VS_POS_VARIABLE = \"transform_position\";\nfunction updateForTextures(_ref) {\n    var vs = _ref.vs, sourceTextureMap = _ref.sourceTextureMap, targetTextureVarying = _ref.targetTextureVarying, targetTexture = _ref.targetTexture;\n    var texAttributeNames = Object.keys(sourceTextureMap);\n    var sourceCount = texAttributeNames.length;\n    var targetTextureType = null;\n    var samplerTextureMap = {};\n    var updatedVs = vs;\n    var finalInject = {};\n    if (sourceCount > 0 || targetTextureVarying) {\n        var vsLines = updatedVs.split(\"\\n\");\n        var updateVsLines = vsLines.slice();\n        vsLines.forEach(function(line, index, lines) {\n            if (sourceCount > 0) {\n                var updated = processAttributeDefinition(line, sourceTextureMap);\n                if (updated) {\n                    var updatedLine = updated.updatedLine, inject = updated.inject;\n                    updateVsLines[index] = updatedLine;\n                    finalInject = (0, _shadertools.combineInjects)([\n                        finalInject,\n                        inject\n                    ]);\n                    Object.assign(samplerTextureMap, updated.samplerTextureMap);\n                    sourceCount--;\n                }\n            }\n            if (targetTextureVarying && !targetTextureType) targetTextureType = getVaryingType(line, targetTextureVarying);\n        });\n        if (targetTextureVarying) {\n            (0, _webgl.assert)(targetTexture);\n            var sizeName = \"\".concat(SIZE_UNIFORM_PREFIX).concat(targetTextureVarying);\n            var uniformDeclaration = \"uniform vec2 \".concat(sizeName, \";\\n\");\n            var posInstructions = \"     vec2 \".concat(VS_POS_VARIABLE, \" = transform_getPos(\").concat(sizeName, \");\\n     gl_Position = vec4(\").concat(VS_POS_VARIABLE, \", 0, 1.);\\n\");\n            var inject1 = {\n                \"vs:#decl\": uniformDeclaration,\n                \"vs:#main-start\": posInstructions\n            };\n            finalInject = (0, _shadertools.combineInjects)([\n                finalInject,\n                inject1\n            ]);\n        }\n        updatedVs = updateVsLines.join(\"\\n\");\n    }\n    return {\n        vs: updatedVs,\n        targetTextureType: targetTextureType,\n        inject: finalInject,\n        samplerTextureMap: samplerTextureMap\n    };\n}\nfunction getSizeUniforms(_ref2) {\n    var sourceTextureMap = _ref2.sourceTextureMap, targetTextureVarying = _ref2.targetTextureVarying, targetTexture = _ref2.targetTexture;\n    var uniforms = {};\n    var width;\n    var height;\n    if (targetTextureVarying) {\n        width = targetTexture.width;\n        height = targetTexture.height;\n        uniforms[\"\".concat(SIZE_UNIFORM_PREFIX).concat(targetTextureVarying)] = [\n            width,\n            height\n        ];\n    }\n    for(var textureName in sourceTextureMap){\n        var _sourceTextureMap$tex = sourceTextureMap[textureName];\n        width = _sourceTextureMap$tex.width;\n        height = _sourceTextureMap$tex.height;\n        uniforms[\"\".concat(SIZE_UNIFORM_PREFIX).concat(textureName)] = [\n            width,\n            height\n        ];\n    }\n    return uniforms;\n}\nfunction getAttributeDefinition(line) {\n    return (0, _shadertools.getQualifierDetails)(line, [\n        \"attribute\",\n        \"in\"\n    ]);\n}\nfunction getSamplerDeclerations(textureName) {\n    var samplerName = \"\".concat(SAMPLER_UNIFORM_PREFIX).concat(textureName);\n    var sizeName = \"\".concat(SIZE_UNIFORM_PREFIX).concat(textureName);\n    var uniformDeclerations = \"  uniform sampler2D \".concat(samplerName, \";\\n  uniform vec2 \").concat(sizeName, \";\");\n    return {\n        samplerName: samplerName,\n        sizeName: sizeName,\n        uniformDeclerations: uniformDeclerations\n    };\n}\nfunction getVaryingType(line, varying) {\n    var qualaiferDetails = (0, _shadertools.getQualifierDetails)(line, [\n        \"varying\",\n        \"out\"\n    ]);\n    if (!qualaiferDetails) return null;\n    return qualaiferDetails.name === varying ? qualaiferDetails.type : null;\n}\nfunction processAttributeDefinition(line, textureMap) {\n    var samplerTextureMap = {};\n    var attributeData = getAttributeDefinition(line);\n    if (!attributeData) return null;\n    var type = attributeData.type, name = attributeData.name;\n    if (name && textureMap[name]) {\n        var updatedLine = \"// \".concat(line, \" => Replaced by Transform with a sampler\");\n        var _getSamplerDecleratio = getSamplerDeclerations(name), samplerName = _getSamplerDecleratio.samplerName, sizeName = _getSamplerDecleratio.sizeName, uniformDeclerations = _getSamplerDecleratio.uniformDeclerations;\n        var channels = (0, _shadertools.typeToChannelSuffix)(type);\n        var sampleInstruction = \"  \".concat(type, \" \").concat(name, \" = transform_getInput(\").concat(samplerName, \", \").concat(sizeName, \").\").concat(channels, \";\\n\");\n        samplerTextureMap[samplerName] = name;\n        var inject = {\n            \"vs:#decl\": uniformDeclerations,\n            \"vs:#main-start\": sampleInstruction\n        };\n        return {\n            updatedLine: updatedLine,\n            inject: inject,\n            samplerTextureMap: samplerTextureMap\n        };\n    }\n    return null;\n}\n\n},{\"@luma.gl/webgl\":\"caucX\",\"@luma.gl/shadertools\":\"8wgxL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2TGkH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DRAW_MODE\", ()=>DRAW_MODE);\nparcelHelpers.export(exports, \"default\", ()=>Geometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar DRAW_MODE = {\n    POINTS: 0x0000,\n    LINES: 0x0001,\n    LINE_LOOP: 0x0002,\n    LINE_STRIP: 0x0003,\n    TRIANGLES: 0x0004,\n    TRIANGLE_STRIP: 0x0005,\n    TRIANGLE_FAN: 0x0006\n};\nvar Geometry = function() {\n    (0, _createClassDefault.default)(Geometry1, null, [\n        {\n            key: \"DRAW_MODE\",\n            get: function get() {\n                return DRAW_MODE;\n            }\n        }\n    ]);\n    function Geometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, Geometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"geometry\") : _props$id, _props$drawMode = props.drawMode, drawMode = _props$drawMode === void 0 ? DRAW_MODE.TRIANGLES : _props$drawMode, _props$attributes = props.attributes, attributes = _props$attributes === void 0 ? {} : _props$attributes, _props$indices = props.indices, indices = _props$indices === void 0 ? null : _props$indices, _props$vertexCount = props.vertexCount, vertexCount = _props$vertexCount === void 0 ? null : _props$vertexCount;\n        this.id = id;\n        this.drawMode = drawMode | 0;\n        this.attributes = {};\n        this.userData = {};\n        this._setAttributes(attributes, indices);\n        this.vertexCount = vertexCount || this._calculateVertexCount(this.attributes, this.indices);\n    }\n    (0, _createClassDefault.default)(Geometry1, [\n        {\n            key: \"getVertexCount\",\n            value: function getVertexCount() {\n                return this.vertexCount;\n            }\n        },\n        {\n            key: \"getAttributes\",\n            value: function getAttributes() {\n                return this.indices ? (0, _objectSpreadDefault.default)({\n                    indices: this.indices\n                }, this.attributes) : this.attributes;\n            }\n        },\n        {\n            key: \"_print\",\n            value: function _print(attributeName) {\n                return \"Geometry \".concat(this.id, \" attribute \").concat(attributeName);\n            }\n        },\n        {\n            key: \"_setAttributes\",\n            value: function _setAttributes(attributes, indices) {\n                if (indices) this.indices = ArrayBuffer.isView(indices) ? {\n                    value: indices,\n                    size: 1\n                } : indices;\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    attribute = ArrayBuffer.isView(attribute) ? {\n                        value: attribute\n                    } : attribute;\n                    (0, _webgl.assert)(ArrayBuffer.isView(attribute.value), \"\".concat(this._print(attributeName), \": must be typed array or object with value as typed array\"));\n                    if ((attributeName === \"POSITION\" || attributeName === \"positions\") && !attribute.size) attribute.size = 3;\n                    if (attributeName === \"indices\") {\n                        (0, _webgl.assert)(!this.indices);\n                        this.indices = attribute;\n                    } else this.attributes[attributeName] = attribute;\n                }\n                if (this.indices && this.indices.isIndexed !== undefined) {\n                    this.indices = Object.assign({}, this.indices);\n                    delete this.indices.isIndexed;\n                }\n                return this;\n            }\n        },\n        {\n            key: \"_calculateVertexCount\",\n            value: function _calculateVertexCount(attributes, indices) {\n                if (indices) return indices.value.length;\n                var vertexCount = Infinity;\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    var value = attribute.value, size = attribute.size, constant = attribute.constant;\n                    if (!constant && value && size >= 1) vertexCount = Math.min(vertexCount, value.length / size);\n                }\n                (0, _webgl.assert)(Number.isFinite(vertexCount));\n                return vertexCount;\n            }\n        },\n        {\n            key: \"mode\",\n            get: function get() {\n                return this.drawMode;\n            }\n        }\n    ]);\n    return Geometry1;\n}();\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ezvSy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ConeGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _truncatedConeGeometry = require(\"./truncated-cone-geometry\");\nvar _truncatedConeGeometryDefault = parcelHelpers.interopDefault(_truncatedConeGeometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar ConeGeometry = function(_TruncatedConeGeometr) {\n    (0, _inheritsDefault.default)(ConeGeometry1, _TruncatedConeGeometr);\n    function ConeGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, ConeGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"cone-geometry\") : _props$id, _props$radius = props.radius, radius = _props$radius === void 0 ? 1 : _props$radius, _props$cap = props.cap, cap = _props$cap === void 0 ? true : _props$cap;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(ConeGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            topRadius: 0,\n            topCap: Boolean(cap),\n            bottomCap: Boolean(cap),\n            bottomRadius: radius\n        })));\n    }\n    return ConeGeometry1;\n}((0, _truncatedConeGeometryDefault.default));\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./truncated-cone-geometry\":\"9dywj\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9dywj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TruncatedConeGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar INDEX_OFFSETS = {\n    x: [\n        2,\n        0,\n        1\n    ],\n    y: [\n        0,\n        1,\n        2\n    ],\n    z: [\n        1,\n        2,\n        0\n    ]\n};\nvar TruncatedConeGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(TruncatedConeGeometry1, _Geometry);\n    function TruncatedConeGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, TruncatedConeGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"truncated-code-geometry\") : _props$id;\n        var _tesselateTruncatedCo = tesselateTruncatedCone(props), indices = _tesselateTruncatedCo.indices, attributes = _tesselateTruncatedCo.attributes;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(TruncatedConeGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: indices,\n            attributes: (0, _objectSpreadDefault.default)({}, attributes, props.attributes)\n        })));\n    }\n    return TruncatedConeGeometry1;\n}((0, _geometryDefault.default));\nfunction tesselateTruncatedCone(props) {\n    var _props$bottomRadius = props.bottomRadius, bottomRadius = _props$bottomRadius === void 0 ? 0 : _props$bottomRadius, _props$topRadius = props.topRadius, topRadius = _props$topRadius === void 0 ? 0 : _props$topRadius, _props$height = props.height, height = _props$height === void 0 ? 1 : _props$height, _props$nradial = props.nradial, nradial = _props$nradial === void 0 ? 10 : _props$nradial, _props$nvertical = props.nvertical, nvertical = _props$nvertical === void 0 ? 10 : _props$nvertical, _props$verticalAxis = props.verticalAxis, verticalAxis = _props$verticalAxis === void 0 ? \"y\" : _props$verticalAxis, _props$topCap = props.topCap, topCap = _props$topCap === void 0 ? false : _props$topCap, _props$bottomCap = props.bottomCap, bottomCap = _props$bottomCap === void 0 ? false : _props$bottomCap;\n    var extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);\n    var numVertices = (nradial + 1) * (nvertical + 1 + extra);\n    var slant = Math.atan2(bottomRadius - topRadius, height);\n    var msin = Math.sin;\n    var mcos = Math.cos;\n    var mpi = Math.PI;\n    var cosSlant = mcos(slant);\n    var sinSlant = msin(slant);\n    var start = topCap ? -2 : 0;\n    var end = nvertical + (bottomCap ? 2 : 0);\n    var vertsAroundEdge = nradial + 1;\n    var indices = new Uint16Array(nradial * (nvertical + extra) * 6);\n    var indexOffset = INDEX_OFFSETS[verticalAxis];\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var texCoords = new Float32Array(numVertices * 2);\n    var i3 = 0;\n    var i2 = 0;\n    for(var i = start; i <= end; i++){\n        var v = i / nvertical;\n        var y = height * v;\n        var ringRadius = void 0;\n        if (i < 0) {\n            y = 0;\n            v = 1;\n            ringRadius = bottomRadius;\n        } else if (i > nvertical) {\n            y = height;\n            v = 1;\n            ringRadius = topRadius;\n        } else ringRadius = bottomRadius + (topRadius - bottomRadius) * (i / nvertical);\n        if (i === -2 || i === nvertical + 2) {\n            ringRadius = 0;\n            v = 0;\n        }\n        y -= height / 2;\n        for(var j = 0; j < vertsAroundEdge; j++){\n            var sin = msin(j * mpi * 2 / nradial);\n            var cos = mcos(j * mpi * 2 / nradial);\n            positions[i3 + indexOffset[0]] = sin * ringRadius;\n            positions[i3 + indexOffset[1]] = y;\n            positions[i3 + indexOffset[2]] = cos * ringRadius;\n            normals[i3 + indexOffset[0]] = i < 0 || i > nvertical ? 0 : sin * cosSlant;\n            normals[i3 + indexOffset[1]] = i < 0 ? -1 : i > nvertical ? 1 : sinSlant;\n            normals[i3 + indexOffset[2]] = i < 0 || i > nvertical ? 0 : cos * cosSlant;\n            texCoords[i2 + 0] = j / nradial;\n            texCoords[i2 + 1] = v;\n            i2 += 2;\n            i3 += 3;\n        }\n    }\n    for(var _i = 0; _i < nvertical + extra; _i++)for(var _j = 0; _j < nradial; _j++){\n        var index = (_i * nradial + _j) * 6;\n        indices[index + 0] = vertsAroundEdge * (_i + 0) + 0 + _j;\n        indices[index + 1] = vertsAroundEdge * (_i + 0) + 1 + _j;\n        indices[index + 2] = vertsAroundEdge * (_i + 1) + 1 + _j;\n        indices[index + 3] = vertsAroundEdge * (_i + 0) + 0 + _j;\n        indices[index + 4] = vertsAroundEdge * (_i + 1) + 1 + _j;\n        indices[index + 5] = vertsAroundEdge * (_i + 1) + 0 + _j;\n    }\n    return {\n        indices: indices,\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: positions\n            },\n            NORMAL: {\n                size: 3,\n                value: normals\n            },\n            TEXCOORD_0: {\n                size: 2,\n                value: texCoords\n            }\n        }\n    };\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"../geometry/geometry\":\"2TGkH\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"11mAr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CubeGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar CUBE_INDICES = new Uint16Array([\n    0,\n    1,\n    2,\n    0,\n    2,\n    3,\n    4,\n    5,\n    6,\n    4,\n    6,\n    7,\n    8,\n    9,\n    10,\n    8,\n    10,\n    11,\n    12,\n    13,\n    14,\n    12,\n    14,\n    15,\n    16,\n    17,\n    18,\n    16,\n    18,\n    19,\n    20,\n    21,\n    22,\n    20,\n    22,\n    23\n]);\nvar CUBE_POSITIONS = new Float32Array([\n    -1,\n    -1,\n    1,\n    1,\n    -1,\n    1,\n    1,\n    1,\n    1,\n    -1,\n    1,\n    1,\n    -1,\n    -1,\n    -1,\n    -1,\n    1,\n    -1,\n    1,\n    1,\n    -1,\n    1,\n    -1,\n    -1,\n    -1,\n    1,\n    -1,\n    -1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    -1,\n    -1,\n    -1,\n    -1,\n    1,\n    -1,\n    -1,\n    1,\n    -1,\n    1,\n    -1,\n    -1,\n    1,\n    1,\n    -1,\n    -1,\n    1,\n    1,\n    -1,\n    1,\n    1,\n    1,\n    1,\n    -1,\n    1,\n    -1,\n    -1,\n    -1,\n    -1,\n    -1,\n    1,\n    -1,\n    1,\n    1,\n    -1,\n    1,\n    -1\n]);\nvar CUBE_NORMALS = new Float32Array([\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0\n]);\nvar CUBE_TEX_COORDS = new Float32Array([\n    0,\n    0,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    1,\n    1,\n    1,\n    1,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1\n]);\nvar ATTRIBUTES = {\n    POSITION: {\n        size: 3,\n        value: new Float32Array(CUBE_POSITIONS)\n    },\n    NORMAL: {\n        size: 3,\n        value: new Float32Array(CUBE_NORMALS)\n    },\n    TEXCOORD_0: {\n        size: 2,\n        value: new Float32Array(CUBE_TEX_COORDS)\n    }\n};\nvar CubeGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(CubeGeometry1, _Geometry);\n    function CubeGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, CubeGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"cube-geometry\") : _props$id;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(CubeGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: {\n                size: 1,\n                value: new Uint16Array(CUBE_INDICES)\n            },\n            attributes: (0, _objectSpreadDefault.default)({}, ATTRIBUTES, props.attributes)\n        })));\n    }\n    return CubeGeometry1;\n}((0, _geometryDefault.default));\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"../geometry/geometry\":\"2TGkH\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1M87b\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CylinderGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _truncatedConeGeometry = require(\"./truncated-cone-geometry\");\nvar _truncatedConeGeometryDefault = parcelHelpers.interopDefault(_truncatedConeGeometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar CylinderGeometry = function(_TruncatedConeGeometr) {\n    (0, _inheritsDefault.default)(CylinderGeometry1, _TruncatedConeGeometr);\n    function CylinderGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, CylinderGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"cylinder-geometry\") : _props$id, _props$radius = props.radius, radius = _props$radius === void 0 ? 1 : _props$radius;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(CylinderGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            bottomRadius: radius,\n            topRadius: radius\n        })));\n    }\n    return CylinderGeometry1;\n}((0, _truncatedConeGeometryDefault.default));\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"./truncated-cone-geometry\":\"9dywj\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"luhoO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>IcoSphereGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _mathGl = require(\"math.gl\");\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar ICO_POSITIONS = [\n    -1,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    1,\n    0,\n    -1,\n    0,\n    1,\n    0,\n    0\n];\nvar ICO_INDICES = [\n    3,\n    4,\n    5,\n    3,\n    5,\n    1,\n    3,\n    1,\n    0,\n    3,\n    0,\n    4,\n    4,\n    0,\n    2,\n    4,\n    2,\n    5,\n    2,\n    0,\n    1,\n    5,\n    2,\n    1\n];\nvar IcoSphereGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(IcoSphereGeometry1, _Geometry);\n    function IcoSphereGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, IcoSphereGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"ico-sphere-geometry\") : _props$id;\n        var _tesselateIcosaHedron = tesselateIcosaHedron(props), indices = _tesselateIcosaHedron.indices, attributes = _tesselateIcosaHedron.attributes;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(IcoSphereGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: indices,\n            attributes: (0, _objectSpreadDefault.default)({}, attributes, props.attributes)\n        })));\n    }\n    return IcoSphereGeometry1;\n}((0, _geometryDefault.default));\nfunction tesselateIcosaHedron(props) {\n    var _props$iterations = props.iterations, iterations = _props$iterations === void 0 ? 0 : _props$iterations;\n    var PI = Math.PI;\n    var PI2 = PI * 2;\n    var positions = [].concat(ICO_POSITIONS);\n    var indices = [].concat(ICO_INDICES);\n    positions.push();\n    indices.push();\n    var getMiddlePoint = function() {\n        var pointMemo = {};\n        return function(i1, i2) {\n            i1 *= 3;\n            i2 *= 3;\n            var mini = i1 < i2 ? i1 : i2;\n            var maxi = i1 > i2 ? i1 : i2;\n            var key = \"\".concat(mini, \"|\").concat(maxi);\n            if (key in pointMemo) return pointMemo[key];\n            var x1 = positions[i1];\n            var y1 = positions[i1 + 1];\n            var z1 = positions[i1 + 2];\n            var x2 = positions[i2];\n            var y2 = positions[i2 + 1];\n            var z2 = positions[i2 + 2];\n            var xm = (x1 + x2) / 2;\n            var ym = (y1 + y2) / 2;\n            var zm = (z1 + z2) / 2;\n            var len = Math.sqrt(xm * xm + ym * ym + zm * zm);\n            xm /= len;\n            ym /= len;\n            zm /= len;\n            positions.push(xm, ym, zm);\n            return pointMemo[key] = positions.length / 3 - 1;\n        };\n    }();\n    for(var i = 0; i < iterations; i++){\n        var indices2 = [];\n        for(var j = 0; j < indices.length; j += 3){\n            var a = getMiddlePoint(indices[j + 0], indices[j + 1]);\n            var b = getMiddlePoint(indices[j + 1], indices[j + 2]);\n            var c = getMiddlePoint(indices[j + 2], indices[j + 0]);\n            indices2.push(c, indices[j + 0], a, a, indices[j + 1], b, b, indices[j + 2], c, a, b, c);\n        }\n        indices = indices2;\n    }\n    var normals = new Array(positions.length);\n    var texCoords = new Array(positions.length / 3 * 2);\n    var l = indices.length;\n    for(var _i = l - 3; _i >= 0; _i -= 3){\n        var i11 = indices[_i + 0];\n        var i21 = indices[_i + 1];\n        var i3 = indices[_i + 2];\n        var in1 = i11 * 3;\n        var in2 = i21 * 3;\n        var in3 = i3 * 3;\n        var iu1 = i11 * 2;\n        var iu2 = i21 * 2;\n        var iu3 = i3 * 2;\n        var x11 = positions[in1 + 0];\n        var y11 = positions[in1 + 1];\n        var z11 = positions[in1 + 2];\n        var theta1 = Math.acos(z11 / Math.sqrt(x11 * x11 + y11 * y11 + z11 * z11));\n        var phi1 = Math.atan2(y11, x11) + PI;\n        var v1 = theta1 / PI;\n        var u1 = 1 - phi1 / PI2;\n        var x21 = positions[in2 + 0];\n        var y21 = positions[in2 + 1];\n        var z21 = positions[in2 + 2];\n        var theta2 = Math.acos(z21 / Math.sqrt(x21 * x21 + y21 * y21 + z21 * z21));\n        var phi2 = Math.atan2(y21, x21) + PI;\n        var v2 = theta2 / PI;\n        var u2 = 1 - phi2 / PI2;\n        var x3 = positions[in3 + 0];\n        var y3 = positions[in3 + 1];\n        var z3 = positions[in3 + 2];\n        var theta3 = Math.acos(z3 / Math.sqrt(x3 * x3 + y3 * y3 + z3 * z3));\n        var phi3 = Math.atan2(y3, x3) + PI;\n        var v3 = theta3 / PI;\n        var u3 = 1 - phi3 / PI2;\n        var vec1 = [\n            x3 - x21,\n            y3 - y21,\n            z3 - z21\n        ];\n        var vec2 = [\n            x11 - x21,\n            y11 - y21,\n            z11 - z21\n        ];\n        var normal = new (0, _mathGl.Vector3)(vec1).cross(vec2).normalize();\n        var newIndex = void 0;\n        if ((u1 === 0 || u2 === 0 || u3 === 0) && (u1 === 0 || u1 > 0.5) && (u2 === 0 || u2 > 0.5) && (u3 === 0 || u3 > 0.5)) {\n            positions.push(positions[in1 + 0], positions[in1 + 1], positions[in1 + 2]);\n            newIndex = positions.length / 3 - 1;\n            indices.push(newIndex);\n            texCoords[newIndex * 2 + 0] = 1;\n            texCoords[newIndex * 2 + 1] = v1;\n            normals[newIndex * 3 + 0] = normal.x;\n            normals[newIndex * 3 + 1] = normal.y;\n            normals[newIndex * 3 + 2] = normal.z;\n            positions.push(positions[in2 + 0], positions[in2 + 1], positions[in2 + 2]);\n            newIndex = positions.length / 3 - 1;\n            indices.push(newIndex);\n            texCoords[newIndex * 2 + 0] = 1;\n            texCoords[newIndex * 2 + 1] = v2;\n            normals[newIndex * 3 + 0] = normal.x;\n            normals[newIndex * 3 + 1] = normal.y;\n            normals[newIndex * 3 + 2] = normal.z;\n            positions.push(positions[in3 + 0], positions[in3 + 1], positions[in3 + 2]);\n            newIndex = positions.length / 3 - 1;\n            indices.push(newIndex);\n            texCoords[newIndex * 2 + 0] = 1;\n            texCoords[newIndex * 2 + 1] = v3;\n            normals[newIndex * 3 + 0] = normal.x;\n            normals[newIndex * 3 + 1] = normal.y;\n            normals[newIndex * 3 + 2] = normal.z;\n        }\n        normals[in1 + 0] = normals[in2 + 0] = normals[in3 + 0] = normal.x;\n        normals[in1 + 1] = normals[in2 + 1] = normals[in3 + 1] = normal.y;\n        normals[in1 + 2] = normals[in2 + 2] = normals[in3 + 2] = normal.z;\n        texCoords[iu1 + 0] = u1;\n        texCoords[iu1 + 1] = v1;\n        texCoords[iu2 + 0] = u2;\n        texCoords[iu2 + 1] = v2;\n        texCoords[iu3 + 0] = u3;\n        texCoords[iu3 + 1] = v3;\n    }\n    return {\n        indices: {\n            size: 1,\n            value: new Uint16Array(indices)\n        },\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: new Float32Array(positions)\n            },\n            NORMAL: {\n                size: 3,\n                value: new Float32Array(normals)\n            },\n            TEXCOORD_0: {\n                size: 2,\n                value: new Float32Array(texCoords)\n            }\n        }\n    };\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"math.gl\":\"huJnq\",\"../geometry/geometry\":\"2TGkH\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j6u9H\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PlaneGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _geometryUtils = require(\"../geometry/geometry-utils\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar PlaneGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(PlaneGeometry1, _Geometry);\n    function PlaneGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, PlaneGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"plane-geometry\") : _props$id;\n        var _tesselatePlane = tesselatePlane(props), indices = _tesselatePlane.indices, attributes = _tesselatePlane.attributes;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(PlaneGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: indices,\n            attributes: (0, _objectSpreadDefault.default)({}, attributes, props.attributes)\n        })));\n    }\n    return PlaneGeometry1;\n}((0, _geometryDefault.default));\nfunction tesselatePlane(props) {\n    var _props$type = props.type, type = _props$type === void 0 ? \"x,y\" : _props$type, _props$offset = props.offset, offset = _props$offset === void 0 ? 0 : _props$offset, _props$flipCull = props.flipCull, flipCull = _props$flipCull === void 0 ? false : _props$flipCull, _props$unpack = props.unpack, unpack = _props$unpack === void 0 ? false : _props$unpack;\n    var coords = type.split(\",\");\n    var c1len = props[\"\".concat(coords[0], \"len\")] || 1;\n    var c2len = props[\"\".concat(coords[1], \"len\")] || 1;\n    var subdivisions1 = props[\"n\".concat(coords[0])] || 1;\n    var subdivisions2 = props[\"n\".concat(coords[1])] || 1;\n    var numVertices = (subdivisions1 + 1) * (subdivisions2 + 1);\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var texCoords = new Float32Array(numVertices * 2);\n    if (flipCull) c1len = -c1len;\n    var i2 = 0;\n    var i3 = 0;\n    for(var z = 0; z <= subdivisions2; z++)for(var x = 0; x <= subdivisions1; x++){\n        var u = x / subdivisions1;\n        var v = z / subdivisions2;\n        texCoords[i2 + 0] = flipCull ? 1 - u : u;\n        texCoords[i2 + 1] = v;\n        switch(type){\n            case \"x,y\":\n                positions[i3 + 0] = c1len * u - c1len * 0.5;\n                positions[i3 + 1] = c2len * v - c2len * 0.5;\n                positions[i3 + 2] = offset;\n                normals[i3 + 0] = 0;\n                normals[i3 + 1] = 0;\n                normals[i3 + 2] = flipCull ? 1 : -1;\n                break;\n            case \"x,z\":\n                positions[i3 + 0] = c1len * u - c1len * 0.5;\n                positions[i3 + 1] = offset;\n                positions[i3 + 2] = c2len * v - c2len * 0.5;\n                normals[i3 + 0] = 0;\n                normals[i3 + 1] = flipCull ? 1 : -1;\n                normals[i3 + 2] = 0;\n                break;\n            case \"y,z\":\n                positions[i3 + 0] = offset;\n                positions[i3 + 1] = c1len * u - c1len * 0.5;\n                positions[i3 + 2] = c2len * v - c2len * 0.5;\n                normals[i3 + 0] = flipCull ? 1 : -1;\n                normals[i3 + 1] = 0;\n                normals[i3 + 2] = 0;\n                break;\n            default:\n                throw new Error(\"PlaneGeometry: unknown type\");\n        }\n        i2 += 2;\n        i3 += 3;\n    }\n    var numVertsAcross = subdivisions1 + 1;\n    var indices = new Uint16Array(subdivisions1 * subdivisions2 * 6);\n    for(var _z = 0; _z < subdivisions2; _z++)for(var _x = 0; _x < subdivisions1; _x++){\n        var index = (_z * subdivisions1 + _x) * 6;\n        indices[index + 0] = (_z + 0) * numVertsAcross + _x;\n        indices[index + 1] = (_z + 1) * numVertsAcross + _x;\n        indices[index + 2] = (_z + 0) * numVertsAcross + _x + 1;\n        indices[index + 3] = (_z + 1) * numVertsAcross + _x;\n        indices[index + 4] = (_z + 1) * numVertsAcross + _x + 1;\n        indices[index + 5] = (_z + 0) * numVertsAcross + _x + 1;\n    }\n    var geometry = {\n        indices: {\n            size: 1,\n            value: indices\n        },\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: positions\n            },\n            NORMAL: {\n                size: 3,\n                value: normals\n            },\n            TEXCOORD_0: {\n                size: 2,\n                value: texCoords\n            }\n        }\n    };\n    return unpack ? (0, _geometryUtils.unpackIndexedGeometry)(geometry) : geometry;\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"../geometry/geometry\":\"2TGkH\",\"../geometry/geometry-utils\":\"jRs5B\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jRs5B\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"unpackIndexedGeometry\", ()=>unpackIndexedGeometry);\nfunction unpackIndexedGeometry(geometry) {\n    var indices = geometry.indices, attributes = geometry.attributes;\n    if (!indices) return geometry;\n    var vertexCount = indices.value.length;\n    var unpackedAttributes = {};\n    for(var attributeName in attributes){\n        var attribute = attributes[attributeName];\n        var constant = attribute.constant, value = attribute.value, size = attribute.size;\n        if (constant || !size) continue;\n        var unpackedValue = new value.constructor(vertexCount * size);\n        for(var x = 0; x < vertexCount; ++x){\n            var index = indices.value[x];\n            for(var i = 0; i < size; i++)unpackedValue[x * size + i] = value[index * size + i];\n        }\n        unpackedAttributes[attributeName] = {\n            size: size,\n            value: unpackedValue\n        };\n    }\n    return {\n        attributes: Object.assign({}, attributes, unpackedAttributes)\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aRad7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>SphereGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar SphereGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(SphereGeometry1, _Geometry);\n    function SphereGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, SphereGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"sphere-geometry\") : _props$id;\n        var _tesselateSphere = tesselateSphere(props), indices = _tesselateSphere.indices, attributes = _tesselateSphere.attributes;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(SphereGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: indices,\n            attributes: (0, _objectSpreadDefault.default)({}, attributes, props.attributes)\n        })));\n    }\n    return SphereGeometry1;\n}((0, _geometryDefault.default));\nfunction tesselateSphere(props) {\n    var _props$nlat = props.nlat, nlat = _props$nlat === void 0 ? 10 : _props$nlat, _props$nlong = props.nlong, nlong = _props$nlong === void 0 ? 10 : _props$nlong;\n    var _props$radius = props.radius, radius = _props$radius === void 0 ? 1 : _props$radius;\n    var startLat = 0;\n    var endLat = Math.PI;\n    var latRange = endLat - startLat;\n    var startLong = 0;\n    var endLong = 2 * Math.PI;\n    var longRange = endLong - startLong;\n    var numVertices = (nlat + 1) * (nlong + 1);\n    if (typeof radius === \"number\") {\n        var value = radius;\n        radius = function radius(n1, n2, n3, u, v) {\n            return value;\n        };\n    }\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var texCoords = new Float32Array(numVertices * 2);\n    var IndexType = numVertices > 0xffff ? Uint32Array : Uint16Array;\n    var indices = new IndexType(nlat * nlong * 6);\n    for(var y = 0; y <= nlat; y++)for(var x = 0; x <= nlong; x++){\n        var u = x / nlong;\n        var v = y / nlat;\n        var index = x + y * (nlong + 1);\n        var i2 = index * 2;\n        var i3 = index * 3;\n        var theta = longRange * u;\n        var phi = latRange * v;\n        var sinTheta = Math.sin(theta);\n        var cosTheta = Math.cos(theta);\n        var sinPhi = Math.sin(phi);\n        var cosPhi = Math.cos(phi);\n        var ux = cosTheta * sinPhi;\n        var uy = cosPhi;\n        var uz = sinTheta * sinPhi;\n        var r = radius(ux, uy, uz, u, v);\n        positions[i3 + 0] = r * ux;\n        positions[i3 + 1] = r * uy;\n        positions[i3 + 2] = r * uz;\n        normals[i3 + 0] = ux;\n        normals[i3 + 1] = uy;\n        normals[i3 + 2] = uz;\n        texCoords[i2 + 0] = u;\n        texCoords[i2 + 1] = 1 - v;\n    }\n    var numVertsAround = nlong + 1;\n    for(var _x = 0; _x < nlong; _x++)for(var _y = 0; _y < nlat; _y++){\n        var _index = (_x * nlat + _y) * 6;\n        indices[_index + 0] = _y * numVertsAround + _x;\n        indices[_index + 1] = _y * numVertsAround + _x + 1;\n        indices[_index + 2] = (_y + 1) * numVertsAround + _x;\n        indices[_index + 3] = (_y + 1) * numVertsAround + _x;\n        indices[_index + 4] = _y * numVertsAround + _x + 1;\n        indices[_index + 5] = (_y + 1) * numVertsAround + _x + 1;\n    }\n    return {\n        indices: {\n            size: 1,\n            value: indices\n        },\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: positions\n            },\n            NORMAL: {\n                size: 3,\n                value: normals\n            },\n            TEXCOORD_0: {\n                size: 2,\n                value: texCoords\n            }\n        }\n    };\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"lC8i9\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"../geometry/geometry\":\"2TGkH\",\"@luma.gl/webgl\":\"caucX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3QTLo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Timeline\", ()=>Timeline);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar channelHandles = 1;\nvar animationHandles = 1;\nvar Timeline = function() {\n    function Timeline1() {\n        (0, _classCallCheckDefault.default)(this, Timeline1);\n        this.time = 0;\n        this.channels = new Map();\n        this.animations = new Map();\n        this.playing = false;\n        this.lastEngineTime = -1;\n    }\n    (0, _createClassDefault.default)(Timeline1, [\n        {\n            key: \"addChannel\",\n            value: function addChannel(props) {\n                var _props$delay = props.delay, delay = _props$delay === void 0 ? 0 : _props$delay, _props$duration = props.duration, duration = _props$duration === void 0 ? Number.POSITIVE_INFINITY : _props$duration, _props$rate = props.rate, rate = _props$rate === void 0 ? 1 : _props$rate, _props$repeat = props.repeat, repeat = _props$repeat === void 0 ? 1 : _props$repeat;\n                var handle = channelHandles++;\n                var channel = {\n                    time: 0,\n                    delay: delay,\n                    duration: duration,\n                    rate: rate,\n                    repeat: repeat\n                };\n                this._setChannelTime(channel, this.time);\n                this.channels.set(handle, channel);\n                return handle;\n            }\n        },\n        {\n            key: \"removeChannel\",\n            value: function removeChannel(handle) {\n                this.channels[\"delete\"](handle);\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = this.animations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var _step$value = (0, _slicedToArrayDefault.default)(_step.value, 2), animationHandle = _step$value[0], animation = _step$value[1];\n                        if (animation.channel === handle) this.detachAnimation(animationHandle);\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n            }\n        },\n        {\n            key: \"isFinished\",\n            value: function isFinished(handle) {\n                var channel = this.channels.get(handle);\n                if (channel === undefined) return false;\n                return this.time >= channel.delay + channel.duration * channel.repeat;\n            }\n        },\n        {\n            key: \"getTime\",\n            value: function getTime(handle) {\n                if (handle === undefined) return this.time;\n                var channel = this.channels.get(handle);\n                if (channel === undefined) return -1;\n                return channel.time;\n            }\n        },\n        {\n            key: \"setTime\",\n            value: function setTime(time) {\n                this.time = Math.max(0, time);\n                var channels = this.channels.values();\n                var _iteratorNormalCompletion2 = true;\n                var _didIteratorError2 = false;\n                var _iteratorError2 = undefined;\n                try {\n                    for(var _iterator2 = channels[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                        var channel = _step2.value;\n                        this._setChannelTime(channel, this.time);\n                    }\n                } catch (err) {\n                    _didIteratorError2 = true;\n                    _iteratorError2 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n                    } finally{\n                        if (_didIteratorError2) throw _iteratorError2;\n                    }\n                }\n                var animations = this.animations.values();\n                var _iteratorNormalCompletion3 = true;\n                var _didIteratorError3 = false;\n                var _iteratorError3 = undefined;\n                try {\n                    for(var _iterator3 = animations[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){\n                        var animationData = _step3.value;\n                        var animation = animationData.animation, _channel = animationData.channel;\n                        animation.setTime(this.getTime(_channel));\n                    }\n                } catch (err1) {\n                    _didIteratorError3 = true;\n                    _iteratorError3 = err1;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) _iterator3[\"return\"]();\n                    } finally{\n                        if (_didIteratorError3) throw _iteratorError3;\n                    }\n                }\n            }\n        },\n        {\n            key: \"play\",\n            value: function play() {\n                this.playing = true;\n            }\n        },\n        {\n            key: \"pause\",\n            value: function pause() {\n                this.playing = false;\n                this.lastEngineTime = -1;\n            }\n        },\n        {\n            key: \"reset\",\n            value: function reset() {\n                this.setTime(0);\n            }\n        },\n        {\n            key: \"attachAnimation\",\n            value: function attachAnimation(animation, channelHandle) {\n                var animationHandle = animationHandles++;\n                this.animations.set(animationHandle, {\n                    animation: animation,\n                    channel: channelHandle\n                });\n                animation.setTime(this.getTime(channelHandle));\n                return animationHandle;\n            }\n        },\n        {\n            key: \"detachAnimation\",\n            value: function detachAnimation(handle) {\n                this.animations[\"delete\"](handle);\n            }\n        },\n        {\n            key: \"update\",\n            value: function update(engineTime) {\n                if (this.playing) {\n                    if (this.lastEngineTime === -1) this.lastEngineTime = engineTime;\n                    this.setTime(this.time + (engineTime - this.lastEngineTime));\n                    this.lastEngineTime = engineTime;\n                }\n            }\n        },\n        {\n            key: \"_setChannelTime\",\n            value: function _setChannelTime(channel, time) {\n                var offsetTime = time - channel.delay;\n                var totalDuration = channel.duration * channel.repeat;\n                if (offsetTime >= totalDuration) channel.time = channel.duration * channel.rate;\n                else {\n                    channel.time = Math.max(0, offsetTime) % channel.duration;\n                    channel.time *= channel.rate;\n                }\n            }\n        }\n    ]);\n    return Timeline1;\n}();\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lo8Qa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ClipSpace);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _model = require(\"../lib/model\");\nvar _modelDefault = parcelHelpers.interopDefault(_model);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar CLIPSPACE_VERTEX_SHADER = \"attribute vec2 aClipSpacePosition;\\nattribute vec2 aTexCoord;\\nattribute vec2 aCoordinate;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  gl_Position = vec4(aClipSpacePosition, 0., 1.);\\n  position = aClipSpacePosition;\\n  coordinate = aCoordinate;\\n  uv = aTexCoord;\\n}\\n\";\nvar POSITIONS = [\n    -1,\n    -1,\n    1,\n    -1,\n    -1,\n    1,\n    1,\n    1\n];\nvar ClipSpace = function(_Model) {\n    (0, _inheritsDefault.default)(ClipSpace1, _Model);\n    function ClipSpace1(gl, opts) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, ClipSpace1);\n        var TEX_COORDS = POSITIONS.map(function(coord) {\n            return coord === -1 ? 0 : coord;\n        });\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(ClipSpace1).call(this, gl, Object.assign({}, opts, {\n            vs: CLIPSPACE_VERTEX_SHADER,\n            geometry: new (0, _geometryDefault.default)({\n                drawMode: 5,\n                vertexCount: 4,\n                attributes: {\n                    aClipSpacePosition: {\n                        size: 2,\n                        value: new Float32Array(POSITIONS)\n                    },\n                    aTexCoord: {\n                        size: 2,\n                        value: new Float32Array(TEX_COORDS)\n                    },\n                    aCoordinate: {\n                        size: 2,\n                        value: new Float32Array(TEX_COORDS)\n                    }\n                }\n            })\n        })));\n        _this.setVertexCount(4);\n        return _this;\n    }\n    return ClipSpace1;\n}((0, _modelDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"../lib/model\":\"9CDGf\",\"../geometry/geometry\":\"2TGkH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i0Nrz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar vs = \"\\nstruct VertexGeometry {\\n  vec4 position;\\n  vec3 worldPosition;\\n  vec3 worldPositionAlt;\\n  vec3 normal;\\n  vec2 uv;\\n  vec3 pickingColor;\\n} geometry;\\n\";\nvar fs = \"\\n#define SMOOTH_EDGE_RADIUS 0.5\\n\\nstruct FragmentGeometry {\\n  vec2 uv;\\n} geometry;\\n\\nfloat smoothedge(float edge, float x) {\\n  return smoothstep(edge - SMOOTH_EDGE_RADIUS, edge + SMOOTH_EDGE_RADIUS, x);\\n}\\n\";\nexports.default = {\n    name: \"geometry\",\n    vs: vs,\n    fs: fs\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6PaDe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _core = require(\"@luma.gl/core\");\nvar _projectGlsl = require(\"./project.glsl\");\nvar _projectGlslDefault = parcelHelpers.interopDefault(_projectGlsl);\nvar _viewportUniforms = require(\"./viewport-uniforms\");\nvar INITIAL_MODULE_OPTIONS = {};\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_MODULE_OPTIONS;\n    if (opts.viewport) return (0, _viewportUniforms.getUniformsFromViewport)(opts);\n    return {};\n}\nexports.default = {\n    name: \"project\",\n    dependencies: [\n        (0, _core.fp32)\n    ],\n    vs: (0, _projectGlslDefault.default),\n    getUniforms: getUniforms\n};\n\n},{\"@luma.gl/core\":\"WBJLR\",\"./project.glsl\":\"4sMRX\",\"./viewport-uniforms\":\"kLfPQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4sMRX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constants = require(\"../../lib/constants\");\nvar COORDINATE_SYSTEM_GLSL_CONSTANTS = Object.keys((0, _constants.COORDINATE_SYSTEM)).map(function(key) {\n    return \"const int COORDINATE_SYSTEM_\".concat(key, \" = \").concat((0, _constants.COORDINATE_SYSTEM)[key], \";\");\n}).join(\"\");\nvar PROJECTION_MODE_GLSL_CONSTANTS = Object.keys((0, _constants.PROJECTION_MODE)).map(function(key) {\n    return \"const int PROJECTION_MODE_\".concat(key, \" = \").concat((0, _constants.PROJECTION_MODE)[key], \";\");\n}).join(\"\");\nexports.default = \"\".concat(COORDINATE_SYSTEM_GLSL_CONSTANTS, \"\\n\").concat(PROJECTION_MODE_GLSL_CONSTANTS, \"\\n\\nuniform int project_uCoordinateSystem;\\nuniform int project_uProjectionMode;\\nuniform float project_uScale;\\nuniform bool project_uWrapLongitude;\\nuniform float project_uAntimeridian;\\nuniform vec3 project_uCommonUnitsPerMeter;\\nuniform vec3 project_uCommonUnitsPerWorldUnit;\\nuniform vec3 project_uCommonUnitsPerWorldUnit2;\\nuniform vec4 project_uCenter;\\nuniform mat4 project_uModelMatrix;\\nuniform mat4 project_uViewProjectionMatrix;\\nuniform vec2 project_uViewportSize;\\nuniform float project_uDevicePixelRatio;\\nuniform float project_uFocalDistance;\\nuniform vec3 project_uCameraPosition;\\nuniform vec3 project_uCoordinateOrigin;\\n\\nconst float TILE_SIZE = 512.0;\\nconst float PI = 3.1415926536;\\nconst float WORLD_SCALE = TILE_SIZE / (PI * 2.0);\\nconst vec3 ZERO_64_LOW = vec3(0.0);\\nconst float EARTH_RADIUS = 6370972.0;\\nconst float GLOBE_RADIUS = 256.0;\\nfloat project_size(float meters) {\\n  return meters * project_uCommonUnitsPerMeter.z;\\n}\\n\\nvec2 project_size(vec2 meters) {\\n  return meters * project_uCommonUnitsPerMeter.xy;\\n}\\n\\nvec3 project_size(vec3 meters) {\\n  return meters * project_uCommonUnitsPerMeter;\\n}\\n\\nvec4 project_size(vec4 meters) {\\n  return vec4(meters.xyz * project_uCommonUnitsPerMeter, meters.w);\\n}\\nvec3 project_normal(vec3 vector) {\\n  vec4 normal_modelspace = project_uModelMatrix * vec4(vector, 0.0);\\n  return normalize(normal_modelspace.xyz * project_uCommonUnitsPerMeter);\\n}\\n\\nvec4 project_offset_(vec4 offset) {\\n  float dy = offset.y;\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT) {\\n    dy = clamp(dy, -1., 1.);\\n  }\\n  vec3 commonUnitsPerWorldUnit = project_uCommonUnitsPerWorldUnit + project_uCommonUnitsPerWorldUnit2 * dy;\\n  return vec4(offset.xyz * commonUnitsPerWorldUnit, offset.w);\\n}\\nvec2 project_mercator_(vec2 lnglat) {\\n  float x = lnglat.x;\\n  if (project_uWrapLongitude) {\\n    x = mod(x - project_uAntimeridian, 360.0) + project_uAntimeridian;\\n  }\\n  float y = clamp(lnglat.y, -89.9, 89.9);\\n  return vec2(\\n    radians(x) + PI,\\n    PI + log(tan_fp32(PI * 0.25 + radians(y) * 0.5))\\n  );\\n}\\n\\nvec3 project_globe_(vec3 lnglatz) {\\n  float lambda = radians(lnglatz.x);\\n  float phi = radians(lnglatz.y);\\n  float cosPhi = cos(phi);\\n  float D = (lnglatz.z / EARTH_RADIUS + 1.0) * GLOBE_RADIUS;\\n\\n  return vec3(\\n    sin(lambda) * cosPhi,\\n    -cos(lambda) * cosPhi,\\n    sin(phi)\\n  ) * D;\\n}\\nvec4 project_position(vec4 position, vec3 position64Low) {\\n  vec4 position_world = project_uModelMatrix * position;\\n  if (project_uProjectionMode == PROJECTION_MODE_WEB_MERCATOR) {\\n    if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT) {\\n      return vec4(\\n        project_mercator_(position_world.xy) * WORLD_SCALE,\\n        project_size(position_world.z),\\n        position_world.w\\n      );\\n    }\\n    if (project_uCoordinateSystem == COORDINATE_SYSTEM_CARTESIAN) {\\n      position_world.xyz += project_uCoordinateOrigin;\\n    }\\n  }\\n  if (project_uProjectionMode == PROJECTION_MODE_GLOBE) {\\n    if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT) {\\n      return vec4(\\n        project_globe_(position_world.xyz),\\n        position_world.w\\n      );\\n    }\\n  }\\n  if (project_uProjectionMode == PROJECTION_MODE_IDENTITY ||\\n    (project_uProjectionMode == PROJECTION_MODE_WEB_MERCATOR_AUTO_OFFSET &&\\n    (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT ||\\n     project_uCoordinateSystem == COORDINATE_SYSTEM_CARTESIAN))) {\\n    position_world.xyz -= project_uCoordinateOrigin;\\n  }\\n  return project_offset_(position_world + project_uModelMatrix * vec4(position64Low, 0.0));\\n}\\n\\nvec4 project_position(vec4 position) {\\n  return project_position(position, ZERO_64_LOW);\\n}\\n\\nvec3 project_position(vec3 position, vec3 position64Low) {\\n  vec4 projected_position = project_position(vec4(position, 1.0), position64Low);\\n  return projected_position.xyz;\\n}\\n\\nvec3 project_position(vec3 position) {\\n  vec4 projected_position = project_position(vec4(position, 1.0), ZERO_64_LOW);\\n  return projected_position.xyz;\\n}\\n\\nvec2 project_position(vec2 position) {\\n  vec4 projected_position = project_position(vec4(position, 0.0, 1.0), ZERO_64_LOW);\\n  return projected_position.xy;\\n}\\n\\nvec4 project_common_position_to_clipspace(vec4 position, mat4 viewProjectionMatrix, vec4 center) {\\n  return viewProjectionMatrix * position + center;\\n}\\nvec4 project_common_position_to_clipspace(vec4 position) {\\n  return project_common_position_to_clipspace(position, project_uViewProjectionMatrix, project_uCenter);\\n}\\nvec2 project_pixel_size_to_clipspace(vec2 pixels) {\\n  vec2 offset = pixels / project_uViewportSize * project_uDevicePixelRatio * 2.0;\\n  return offset * project_uFocalDistance;\\n}\\n\\nfloat project_size_to_pixel(float meters) {\\n  return project_size(meters) * project_uScale;\\n}\\nfloat project_pixel_size(float pixels) {\\n  return pixels / project_uScale;\\n}\\nvec2 project_pixel_size(vec2 pixels) {\\n  return pixels / project_uScale;\\n}\\nmat3 project_get_orientation_matrix(vec3 up) {\\n  vec3 uz = normalize(up);\\n  vec3 ux = abs(uz.z) == 1.0 ? vec3(1.0, 0.0, 0.0) : normalize(vec3(uz.y, -uz.x, 0));\\n  vec3 uy = cross(uz, ux);\\n  return mat3(ux, uy, uz);\\n}\\n\\nbool project_needs_rotation(vec3 commonPosition, out mat3 transform) {\\n  if (project_uProjectionMode == PROJECTION_MODE_GLOBE) {\\n    transform = project_get_orientation_matrix(commonPosition);\\n    return true;\\n  }\\n  return false;\\n}\\n\");\n\n},{\"../../lib/constants\":\"inuJE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"inuJE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"COORDINATE_SYSTEM\", ()=>COORDINATE_SYSTEM);\nparcelHelpers.export(exports, \"PROJECTION_MODE\", ()=>PROJECTION_MODE);\nparcelHelpers.export(exports, \"EVENTS\", ()=>EVENTS);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar COORDINATE_SYSTEM = {\n    DEFAULT: -1,\n    LNGLAT: 1,\n    METER_OFFSETS: 2,\n    LNGLAT_OFFSETS: 3,\n    CARTESIAN: 0\n};\nObject.defineProperty(COORDINATE_SYSTEM, \"IDENTITY\", {\n    get: function get() {\n        return (0, _logDefault.default).deprecated(\"COORDINATE_SYSTEM.IDENTITY\", \"COORDINATE_SYSTEM.CARTESIAN\")() || 0;\n    }\n});\nvar PROJECTION_MODE = {\n    WEB_MERCATOR: 1,\n    GLOBE: 2,\n    WEB_MERCATOR_AUTO_OFFSET: 4,\n    IDENTITY: 0\n};\nvar EVENTS = {\n    click: {\n        handler: \"onClick\"\n    },\n    panstart: {\n        handler: \"onDragStart\"\n    },\n    panmove: {\n        handler: \"onDrag\"\n    },\n    panend: {\n        handler: \"onDragEnd\"\n    }\n};\n\n},{\"../utils/log\":\"1biSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kLfPQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getOffsetOrigin\", ()=>getOffsetOrigin);\nparcelHelpers.export(exports, \"getUniformsFromViewport\", ()=>getUniformsFromViewport);\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _vec4 = require(\"gl-matrix/vec4\");\nvar _constants = require(\"../../lib/constants\");\nvar _memoize = require(\"../../utils/memoize\");\nvar _memoizeDefault = parcelHelpers.interopDefault(_memoize);\nvar _assert = require(\"../../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar ZERO_VECTOR = [\n    0,\n    0,\n    0,\n    0\n];\nvar VECTOR_TO_POINT_MATRIX = [\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    0\n];\nvar IDENTITY_MATRIX = [\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1\n];\nvar DEFAULT_PIXELS_PER_UNIT2 = [\n    0,\n    0,\n    0\n];\nvar DEFAULT_COORDINATE_ORIGIN = [\n    0,\n    0,\n    0\n];\nvar getMemoizedViewportUniforms = (0, _memoizeDefault.default)(calculateViewportUniforms);\nfunction getOffsetOrigin(viewport, coordinateSystem) {\n    var coordinateOrigin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_COORDINATE_ORIGIN;\n    var shaderCoordinateOrigin = coordinateOrigin;\n    var geospatialOrigin;\n    var offsetMode = true;\n    if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT_OFFSETS || coordinateSystem === (0, _constants.COORDINATE_SYSTEM).METER_OFFSETS) geospatialOrigin = coordinateOrigin;\n    else geospatialOrigin = viewport.isGeospatial ? [\n        Math.fround(viewport.longitude),\n        Math.fround(viewport.latitude),\n        0\n    ] : null;\n    switch(viewport.projectionMode){\n        case (0, _constants.PROJECTION_MODE).WEB_MERCATOR:\n            if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT || coordinateSystem === (0, _constants.COORDINATE_SYSTEM).CARTESIAN) offsetMode = false;\n            break;\n        case (0, _constants.PROJECTION_MODE).WEB_MERCATOR_AUTO_OFFSET:\n            if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT) shaderCoordinateOrigin = geospatialOrigin;\n            else if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).CARTESIAN) {\n                shaderCoordinateOrigin = [\n                    Math.fround(viewport.center[0]),\n                    Math.fround(viewport.center[1]),\n                    0\n                ];\n                geospatialOrigin = viewport.unprojectPosition(shaderCoordinateOrigin);\n                shaderCoordinateOrigin[0] -= coordinateOrigin[0];\n                shaderCoordinateOrigin[1] -= coordinateOrigin[1];\n                shaderCoordinateOrigin[2] -= coordinateOrigin[2];\n            }\n            break;\n        case (0, _constants.PROJECTION_MODE).IDENTITY:\n            shaderCoordinateOrigin = viewport.position.map(Math.fround);\n            break;\n        case (0, _constants.PROJECTION_MODE).GLOBE:\n            offsetMode = false;\n            geospatialOrigin = null;\n            break;\n        default:\n            offsetMode = false;\n    }\n    shaderCoordinateOrigin[2] = shaderCoordinateOrigin[2] || 0;\n    return {\n        geospatialOrigin: geospatialOrigin,\n        shaderCoordinateOrigin: shaderCoordinateOrigin,\n        offsetMode: offsetMode\n    };\n}\nfunction calculateMatrixAndOffset(viewport, coordinateSystem, coordinateOrigin) {\n    var viewMatrixUncentered = viewport.viewMatrixUncentered, projectionMatrix = viewport.projectionMatrix;\n    var viewMatrix = viewport.viewMatrix, viewProjectionMatrix = viewport.viewProjectionMatrix;\n    var projectionCenter = ZERO_VECTOR;\n    var cameraPosCommon = viewport.cameraPosition;\n    var _getOffsetOrigin = getOffsetOrigin(viewport, coordinateSystem, coordinateOrigin), geospatialOrigin = _getOffsetOrigin.geospatialOrigin, shaderCoordinateOrigin = _getOffsetOrigin.shaderCoordinateOrigin, offsetMode = _getOffsetOrigin.offsetMode;\n    if (offsetMode) {\n        var positionCommonSpace = viewport.projectPosition(geospatialOrigin || shaderCoordinateOrigin);\n        cameraPosCommon = [\n            cameraPosCommon[0] - positionCommonSpace[0],\n            cameraPosCommon[1] - positionCommonSpace[1],\n            cameraPosCommon[2] - positionCommonSpace[2]\n        ];\n        positionCommonSpace[3] = 1;\n        projectionCenter = _vec4.transformMat4([], positionCommonSpace, viewProjectionMatrix);\n        viewMatrix = viewMatrixUncentered || viewMatrix;\n        viewProjectionMatrix = _mat4.multiply([], projectionMatrix, viewMatrix);\n        viewProjectionMatrix = _mat4.multiply([], viewProjectionMatrix, VECTOR_TO_POINT_MATRIX);\n    }\n    return {\n        viewMatrix: viewMatrix,\n        viewProjectionMatrix: viewProjectionMatrix,\n        projectionCenter: projectionCenter,\n        cameraPosCommon: cameraPosCommon,\n        shaderCoordinateOrigin: shaderCoordinateOrigin,\n        geospatialOrigin: geospatialOrigin\n    };\n}\nfunction getUniformsFromViewport() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, viewport = _ref.viewport, _ref$devicePixelRatio = _ref.devicePixelRatio, devicePixelRatio = _ref$devicePixelRatio === void 0 ? 1 : _ref$devicePixelRatio, _ref$modelMatrix = _ref.modelMatrix, modelMatrix = _ref$modelMatrix === void 0 ? null : _ref$modelMatrix, _ref$coordinateSystem = _ref.coordinateSystem, coordinateSystem = _ref$coordinateSystem === void 0 ? (0, _constants.COORDINATE_SYSTEM).DEFAULT : _ref$coordinateSystem, coordinateOrigin = _ref.coordinateOrigin, _ref$autoWrapLongitud = _ref.autoWrapLongitude, autoWrapLongitude = _ref$autoWrapLongitud === void 0 ? false : _ref$autoWrapLongitud, projectionMode = _ref.projectionMode, positionOrigin = _ref.positionOrigin;\n    (0, _assertDefault.default)(viewport);\n    if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).DEFAULT) coordinateSystem = viewport.isGeospatial ? (0, _constants.COORDINATE_SYSTEM).LNGLAT : (0, _constants.COORDINATE_SYSTEM).CARTESIAN;\n    var uniforms = getMemoizedViewportUniforms({\n        viewport: viewport,\n        devicePixelRatio: devicePixelRatio,\n        coordinateSystem: coordinateSystem,\n        coordinateOrigin: coordinateOrigin\n    });\n    uniforms.project_uWrapLongitude = autoWrapLongitude;\n    uniforms.project_uModelMatrix = modelMatrix || IDENTITY_MATRIX;\n    return uniforms;\n}\nfunction calculateViewportUniforms(_ref2) {\n    var viewport = _ref2.viewport, devicePixelRatio = _ref2.devicePixelRatio, coordinateSystem = _ref2.coordinateSystem, coordinateOrigin = _ref2.coordinateOrigin;\n    var _calculateMatrixAndOf = calculateMatrixAndOffset(viewport, coordinateSystem, coordinateOrigin), projectionCenter = _calculateMatrixAndOf.projectionCenter, viewProjectionMatrix = _calculateMatrixAndOf.viewProjectionMatrix, cameraPosCommon = _calculateMatrixAndOf.cameraPosCommon, shaderCoordinateOrigin = _calculateMatrixAndOf.shaderCoordinateOrigin, geospatialOrigin = _calculateMatrixAndOf.geospatialOrigin;\n    var distanceScales = viewport.getDistanceScales();\n    var viewportSize = [\n        viewport.width * devicePixelRatio,\n        viewport.height * devicePixelRatio\n    ];\n    var uniforms = {\n        project_uCoordinateSystem: coordinateSystem,\n        project_uProjectionMode: viewport.projectionMode,\n        project_uCoordinateOrigin: shaderCoordinateOrigin,\n        project_uCenter: projectionCenter,\n        project_uAntimeridian: (viewport.longitude || 0) - 180,\n        project_uViewportSize: viewportSize,\n        project_uDevicePixelRatio: devicePixelRatio,\n        project_uFocalDistance: viewport.focalDistance || 1,\n        project_uCommonUnitsPerMeter: distanceScales.unitsPerMeter,\n        project_uCommonUnitsPerWorldUnit: distanceScales.unitsPerMeter,\n        project_uCommonUnitsPerWorldUnit2: DEFAULT_PIXELS_PER_UNIT2,\n        project_uScale: viewport.scale,\n        project_uViewProjectionMatrix: viewProjectionMatrix,\n        project_uCameraPosition: cameraPosCommon\n    };\n    if (geospatialOrigin) {\n        var distanceScalesAtOrigin = viewport.getDistanceScales(geospatialOrigin);\n        switch(coordinateSystem){\n            case (0, _constants.COORDINATE_SYSTEM).METER_OFFSETS:\n                uniforms.project_uCommonUnitsPerWorldUnit = distanceScalesAtOrigin.unitsPerMeter;\n                uniforms.project_uCommonUnitsPerWorldUnit2 = distanceScalesAtOrigin.unitsPerMeter2;\n                break;\n            case (0, _constants.COORDINATE_SYSTEM).LNGLAT:\n            case (0, _constants.COORDINATE_SYSTEM).LNGLAT_OFFSETS:\n                uniforms.project_uCommonUnitsPerWorldUnit = distanceScalesAtOrigin.unitsPerDegree;\n                uniforms.project_uCommonUnitsPerWorldUnit2 = distanceScalesAtOrigin.unitsPerDegree2;\n                break;\n            case (0, _constants.COORDINATE_SYSTEM).CARTESIAN:\n                uniforms.project_uCommonUnitsPerWorldUnit = [\n                    1,\n                    1,\n                    distanceScalesAtOrigin.unitsPerMeter[2]\n                ];\n                uniforms.project_uCommonUnitsPerWorldUnit2 = [\n                    0,\n                    0,\n                    distanceScalesAtOrigin.unitsPerMeter2[2]\n                ];\n                break;\n            default:\n                break;\n        }\n    }\n    return uniforms;\n}\n\n},{\"gl-matrix/mat4\":\"aI9zp\",\"gl-matrix/vec4\":\"9M1lU\",\"../../lib/constants\":\"inuJE\",\"../../utils/memoize\":\"d1jje\",\"../../utils/assert\":\"1unZV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d1jje\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction isEqual(a, b) {\n    if (a === b) return true;\n    if (Array.isArray(a)) {\n        var len = a.length;\n        if (!b || b.length !== len) return false;\n        for(var i = 0; i < len; i++){\n            if (a[i] !== b[i]) return false;\n        }\n        return true;\n    }\n    return false;\n}\nfunction memoize(compute) {\n    var cachedArgs = {};\n    var cachedResult;\n    return function(args) {\n        for(var key in args)if (!isEqual(args[key], cachedArgs[key])) {\n            cachedResult = compute(args);\n            cachedArgs = args;\n            break;\n        }\n        return cachedResult;\n    };\n}\nexports.default = memoize;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1unZV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"deck.gl: assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cIIhb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _project = require(\"../project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar vs = \"\\nvec4 project_position_to_clipspace(\\n  vec3 position, vec3 position64Low, vec3 offset, out vec4 commonPosition\\n) {\\n  vec3 projectedPosition = project_position(position, position64Low);\\n  if (project_uProjectionMode == PROJECTION_MODE_GLOBE) {\\n    // offset is specified as ENU\\n    // when in globe projection, rotate offset so that the ground alighs with the surface of the globe\\n    mat3 rotation = project_get_orientation_matrix(projectedPosition);\\n    offset = rotation * offset;\\n  }\\n  commonPosition = vec4(projectedPosition + offset, 1.0);\\n  return project_common_position_to_clipspace(commonPosition);\\n}\\n\\nvec4 project_position_to_clipspace(\\n  vec3 position, vec3 position64Low, vec3 offset\\n) {\\n  vec4 commonPosition;\\n  return project_position_to_clipspace(position, position64Low, offset, commonPosition);\\n}\\n\";\nexports.default = {\n    name: \"project32\",\n    dependencies: [\n        (0, _projectDefault.default)\n    ],\n    vs: vs\n};\n\n},{\"../project/project\":\"6PaDe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5tBqN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _toConsumableArray = require(\"@babel/runtime/helpers/esm/toConsumableArray\");\nvar _toConsumableArrayDefault = parcelHelpers.interopDefault(_toConsumableArray);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _constants = require(\"../../lib/constants\");\nvar _project = require(\"../project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar _mathGl = require(\"math.gl\");\nvar _memoize = require(\"../../utils/memoize\");\nvar _memoizeDefault = parcelHelpers.interopDefault(_memoize);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar vs = \"\\nconst int max_lights = 2;\\nuniform mat4 shadow_uViewProjectionMatrices[max_lights];\\nuniform vec4 shadow_uProjectCenters[max_lights];\\nuniform bool shadow_uDrawShadowMap;\\nuniform bool shadow_uUseShadowMap;\\nuniform int shadow_uLightId;\\nuniform float shadow_uLightCount;\\n\\nvarying vec3 shadow_vPosition[max_lights];\\n\\nvec4 shadow_setVertexPosition(vec4 position_commonspace) {\\n  if (shadow_uDrawShadowMap) {\\n    return project_common_position_to_clipspace(position_commonspace, shadow_uViewProjectionMatrices[shadow_uLightId], shadow_uProjectCenters[shadow_uLightId]);\\n  }\\n  if (shadow_uUseShadowMap) {\\n    for (int i = 0; i < max_lights; i++) {\\n      if(i < int(shadow_uLightCount)) {\\n        vec4 shadowMap_position = project_common_position_to_clipspace(position_commonspace, shadow_uViewProjectionMatrices[i], shadow_uProjectCenters[i]);\\n        shadow_vPosition[i] = (shadowMap_position.xyz / shadowMap_position.w + 1.0) / 2.0;\\n      }\\n    }\\n  }\\n  return gl_Position;\\n}\\n\";\nvar fs = \"\\nconst int max_lights = 2;\\nuniform bool shadow_uDrawShadowMap;\\nuniform bool shadow_uUseShadowMap;\\nuniform sampler2D shadow_uShadowMap0;\\nuniform sampler2D shadow_uShadowMap1;\\nuniform vec4 shadow_uColor;\\nuniform float shadow_uLightCount;\\n\\nvarying vec3 shadow_vPosition[max_lights];\\n\\nconst vec4 bitPackShift = vec4(1.0, 255.0, 65025.0, 16581375.0);\\nconst vec4 bitUnpackShift = 1.0 / bitPackShift;\\nconst vec4 bitMask = vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0,  0.0);\\n\\nfloat shadow_getShadowWeight(vec3 position, sampler2D shadowMap) {\\n  vec4 rgbaDepth = texture2D(shadowMap, position.xy);\\n\\n  float z = dot(rgbaDepth, bitUnpackShift);\\n  return smoothstep(0.001, 0.01, position.z - z);\\n}\\n\\nvec4 shadow_filterShadowColor(vec4 color) {\\n  if (shadow_uDrawShadowMap) {\\n    vec4 rgbaDepth = fract(gl_FragCoord.z * bitPackShift);\\n    rgbaDepth -= rgbaDepth.gbaa * bitMask;\\n    return rgbaDepth;\\n  }\\n  if (shadow_uUseShadowMap) {\\n    float shadowAlpha = 0.0;\\n    shadowAlpha += shadow_getShadowWeight(shadow_vPosition[0], shadow_uShadowMap0);\\n    if(shadow_uLightCount > 1.0) {\\n      shadowAlpha += shadow_getShadowWeight(shadow_vPosition[1], shadow_uShadowMap1);\\n    }\\n    shadowAlpha *= shadow_uColor.a / shadow_uLightCount;\\n    float blendedAlpha = shadowAlpha + color.a * (1.0 - shadowAlpha);\\n\\n    return vec4(\\n      mix(color.rgb, shadow_uColor.rgb, shadowAlpha / blendedAlpha),\\n      blendedAlpha\\n    );\\n  }\\n  return color;\\n}\\n\";\nvar getMemoizedViewportCenterPosition = (0, _memoizeDefault.default)(getViewportCenterPosition);\nvar getMemoizedViewProjectionMatrices = (0, _memoizeDefault.default)(getViewProjectionMatrices);\nvar DEFAULT_SHADOW_COLOR = [\n    0,\n    0,\n    0,\n    1.0\n];\nvar VECTOR_TO_POINT_MATRIX = [\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    0\n];\nfunction screenToCommonSpace(xyz, pixelUnprojectionMatrix) {\n    var _xyz = (0, _slicedToArrayDefault.default)(xyz, 3), x = _xyz[0], y = _xyz[1], z = _xyz[2];\n    var coord = (0, _webMercator.pixelsToWorld)([\n        x,\n        y,\n        z\n    ], pixelUnprojectionMatrix);\n    if (Number.isFinite(z)) return coord;\n    return [\n        coord[0],\n        coord[1],\n        0\n    ];\n}\nfunction getViewportCenterPosition(_ref) {\n    var viewport = _ref.viewport, center = _ref.center;\n    return new (0, _mathGl.Matrix4)(viewport.viewProjectionMatrix).invert().transform(center);\n}\nfunction getViewProjectionMatrices(_ref2) {\n    var viewport = _ref2.viewport, shadowMatrices = _ref2.shadowMatrices;\n    var projectionMatrices = [];\n    var pixelUnprojectionMatrix = viewport.pixelUnprojectionMatrix;\n    var farZ = viewport.isGeospatial ? undefined : 1;\n    var corners = [\n        [\n            0,\n            0,\n            farZ\n        ],\n        [\n            viewport.width,\n            0,\n            farZ\n        ],\n        [\n            0,\n            viewport.height,\n            farZ\n        ],\n        [\n            viewport.width,\n            viewport.height,\n            farZ\n        ],\n        [\n            0,\n            0,\n            -1\n        ],\n        [\n            viewport.width,\n            0,\n            -1\n        ],\n        [\n            0,\n            viewport.height,\n            -1\n        ],\n        [\n            viewport.width,\n            viewport.height,\n            -1\n        ]\n    ].map(function(pixel) {\n        return screenToCommonSpace(pixel, pixelUnprojectionMatrix);\n    });\n    var _iterator = _createForOfIteratorHelper(shadowMatrices), _step;\n    try {\n        var _loop = function _loop() {\n            var shadowMatrix = _step.value;\n            var viewMatrix = shadowMatrix.clone().translate(new (0, _mathGl.Vector3)(viewport.center).negate());\n            var positions = corners.map(function(corner) {\n                return viewMatrix.transform(corner);\n            });\n            var projectionMatrix = new (0, _mathGl.Matrix4)().ortho({\n                left: Math.min.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return position[0];\n                }))),\n                right: Math.max.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return position[0];\n                }))),\n                bottom: Math.min.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return position[1];\n                }))),\n                top: Math.max.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return position[1];\n                }))),\n                near: Math.min.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return -position[2];\n                }))),\n                far: Math.max.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return -position[2];\n                })))\n            });\n            projectionMatrices.push(projectionMatrix.multiplyRight(shadowMatrix));\n        };\n        for(_iterator.s(); !(_step = _iterator.n()).done;)_loop();\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    return projectionMatrices;\n}\nfunction createShadowUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var uniforms = {\n        shadow_uDrawShadowMap: Boolean(opts.drawToShadowMap),\n        shadow_uUseShadowMap: opts.shadowMaps ? opts.shadowMaps.length > 0 : false,\n        shadow_uColor: opts.shadowColor || DEFAULT_SHADOW_COLOR,\n        shadow_uLightId: opts.shadowLightId || 0,\n        shadow_uLightCount: opts.shadowMatrices.length\n    };\n    var center = getMemoizedViewportCenterPosition({\n        viewport: opts.viewport,\n        center: context.project_uCenter\n    });\n    var projectCenters = [];\n    var viewProjectionMatrices = getMemoizedViewProjectionMatrices({\n        shadowMatrices: opts.shadowMatrices,\n        viewport: opts.viewport\n    }).slice();\n    for(var i = 0; i < opts.shadowMatrices.length; i++){\n        var viewProjectionMatrix = viewProjectionMatrices[i];\n        var viewProjectionMatrixCentered = viewProjectionMatrix.clone().translate(new (0, _mathGl.Vector3)(opts.viewport.center).negate());\n        if (context.project_uCoordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT && context.project_uProjectionMode === (0, _constants.PROJECTION_MODE).WEB_MERCATOR) {\n            viewProjectionMatrices[i] = viewProjectionMatrixCentered;\n            projectCenters[i] = center;\n        } else {\n            viewProjectionMatrices[i] = viewProjectionMatrix.clone().multiplyRight(VECTOR_TO_POINT_MATRIX);\n            projectCenters[i] = viewProjectionMatrixCentered.transform(center);\n        }\n    }\n    for(var _i = 0; _i < viewProjectionMatrices.length; _i++){\n        uniforms[\"shadow_uViewProjectionMatrices[\".concat(_i, \"]\")] = viewProjectionMatrices[_i];\n        uniforms[\"shadow_uProjectCenters[\".concat(_i, \"]\")] = projectCenters[_i];\n        if (opts.shadowMaps && opts.shadowMaps.length > 0) uniforms[\"shadow_uShadowMap\".concat(_i)] = opts.shadowMaps[_i];\n        else uniforms[\"shadow_uShadowMap\".concat(_i)] = opts.dummyShadowMap;\n    }\n    return uniforms;\n}\nexports.default = {\n    name: \"shadow\",\n    dependencies: [\n        (0, _projectDefault.default)\n    ],\n    vs: vs,\n    fs: fs,\n    inject: {\n        \"vs:DECKGL_FILTER_GL_POSITION\": \"\\n    position = shadow_setVertexPosition(geometry.position);\\n    \",\n        \"fs:DECKGL_FILTER_COLOR\": \"\\n    color = shadow_filterShadowColor(color);\\n    \"\n    },\n    getUniforms: function getUniforms() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        if (opts.drawToShadowMap || opts.shadowMaps && opts.shadowMaps.length > 0) {\n            var shadowUniforms = {};\n            var _opts$shadowEnabled = opts.shadowEnabled, shadowEnabled = _opts$shadowEnabled === void 0 ? true : _opts$shadowEnabled;\n            if (shadowEnabled && opts.shadowMatrices && opts.shadowMatrices.length > 0) Object.assign(shadowUniforms, createShadowUniforms(opts, context));\n            else Object.assign(shadowUniforms, {\n                shadow_uDrawShadowMap: false,\n                shadow_uUseShadowMap: false\n            });\n            return shadowUniforms;\n        }\n        return {};\n    }\n};\n\n},{\"@babel/runtime/helpers/esm/toConsumableArray\":\"kNndj\",\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"../../lib/constants\":\"inuJE\",\"../project/project\":\"6PaDe\",\"math.gl\":\"huJnq\",\"../../utils/memoize\":\"d1jje\",\"@math.gl/web-mercator\":\"agpg6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"agpg6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>(0, _webMercatorViewportDefault.default));\nparcelHelpers.export(exports, \"WebMercatorViewport\", ()=>(0, _webMercatorViewportDefault.default));\nparcelHelpers.export(exports, \"getBounds\", ()=>(0, _getBoundsDefault.default));\nparcelHelpers.export(exports, \"fitBounds\", ()=>(0, _fitBoundsDefault.default));\nparcelHelpers.export(exports, \"normalizeViewportProps\", ()=>(0, _normalizeViewportPropsDefault.default));\nparcelHelpers.export(exports, \"flyToViewport\", ()=>(0, _flyToViewportDefault.default));\nparcelHelpers.export(exports, \"getFlyToDuration\", ()=>(0, _flyToViewport.getFlyToDuration));\nparcelHelpers.export(exports, \"MAX_LATITUDE\", ()=>(0, _webMercatorUtils.MAX_LATITUDE));\nparcelHelpers.export(exports, \"lngLatToWorld\", ()=>(0, _webMercatorUtils.lngLatToWorld));\nparcelHelpers.export(exports, \"worldToLngLat\", ()=>(0, _webMercatorUtils.worldToLngLat));\nparcelHelpers.export(exports, \"worldToPixels\", ()=>(0, _webMercatorUtils.worldToPixels));\nparcelHelpers.export(exports, \"pixelsToWorld\", ()=>(0, _webMercatorUtils.pixelsToWorld));\nparcelHelpers.export(exports, \"zoomToScale\", ()=>(0, _webMercatorUtils.zoomToScale));\nparcelHelpers.export(exports, \"scaleToZoom\", ()=>(0, _webMercatorUtils.scaleToZoom));\nparcelHelpers.export(exports, \"altitudeToFovy\", ()=>(0, _webMercatorUtils.altitudeToFovy));\nparcelHelpers.export(exports, \"fovyToAltitude\", ()=>(0, _webMercatorUtils.fovyToAltitude));\nparcelHelpers.export(exports, \"getMeterZoom\", ()=>(0, _webMercatorUtils.getMeterZoom));\nparcelHelpers.export(exports, \"getDistanceScales\", ()=>(0, _webMercatorUtils.getDistanceScales));\nparcelHelpers.export(exports, \"addMetersToLngLat\", ()=>(0, _webMercatorUtils.addMetersToLngLat));\nparcelHelpers.export(exports, \"getViewMatrix\", ()=>(0, _webMercatorUtils.getViewMatrix));\nparcelHelpers.export(exports, \"getProjectionMatrix\", ()=>(0, _webMercatorUtils.getProjectionMatrix));\nparcelHelpers.export(exports, \"getProjectionParameters\", ()=>(0, _webMercatorUtils.getProjectionParameters));\nvar _webMercatorViewport = require(\"./web-mercator-viewport\");\nvar _webMercatorViewportDefault = parcelHelpers.interopDefault(_webMercatorViewport);\nvar _getBounds = require(\"./get-bounds\");\nvar _getBoundsDefault = parcelHelpers.interopDefault(_getBounds);\nvar _fitBounds = require(\"./fit-bounds\");\nvar _fitBoundsDefault = parcelHelpers.interopDefault(_fitBounds);\nvar _normalizeViewportProps = require(\"./normalize-viewport-props\");\nvar _normalizeViewportPropsDefault = parcelHelpers.interopDefault(_normalizeViewportProps);\nvar _flyToViewport = require(\"./fly-to-viewport\");\nvar _flyToViewportDefault = parcelHelpers.interopDefault(_flyToViewport);\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\n\n},{\"./web-mercator-viewport\":\"9ppxO\",\"./get-bounds\":\"RNdlJ\",\"./fit-bounds\":\"3Nac8\",\"./normalize-viewport-props\":\"dmkzj\",\"./fly-to-viewport\":\"8ePVP\",\"./web-mercator-utils\":\"dXGoy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9ppxO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _mathUtils = require(\"./math-utils\");\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nvar _fitBounds = require(\"./fit-bounds\");\nvar _fitBoundsDefault = parcelHelpers.interopDefault(_fitBounds);\nvar _getBounds = require(\"./get-bounds\");\nvar _getBoundsDefault = parcelHelpers.interopDefault(_getBounds);\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nclass WebMercatorViewport {\n    constructor(props = {\n        width: 1,\n        height: 1\n    }){\n        (0, _definePropertyDefault.default)(this, \"latitude\", void 0);\n        (0, _definePropertyDefault.default)(this, \"longitude\", void 0);\n        (0, _definePropertyDefault.default)(this, \"zoom\", void 0);\n        (0, _definePropertyDefault.default)(this, \"pitch\", void 0);\n        (0, _definePropertyDefault.default)(this, \"bearing\", void 0);\n        (0, _definePropertyDefault.default)(this, \"altitude\", void 0);\n        (0, _definePropertyDefault.default)(this, \"fovy\", void 0);\n        (0, _definePropertyDefault.default)(this, \"meterOffset\", void 0);\n        (0, _definePropertyDefault.default)(this, \"center\", void 0);\n        (0, _definePropertyDefault.default)(this, \"width\", void 0);\n        (0, _definePropertyDefault.default)(this, \"height\", void 0);\n        (0, _definePropertyDefault.default)(this, \"scale\", void 0);\n        (0, _definePropertyDefault.default)(this, \"distanceScales\", void 0);\n        (0, _definePropertyDefault.default)(this, \"viewMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"projectionMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"viewProjectionMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"pixelProjectionMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"pixelUnprojectionMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"equals\", (viewport)=>{\n            if (!(viewport instanceof WebMercatorViewport)) return false;\n            return viewport.width === this.width && viewport.height === this.height && _mat4.equals(viewport.projectionMatrix, this.projectionMatrix) && _mat4.equals(viewport.viewMatrix, this.viewMatrix);\n        });\n        (0, _definePropertyDefault.default)(this, \"project\", (lngLatZ, options = {})=>{\n            const { topLeft =true  } = options;\n            const worldPosition = this.projectPosition(lngLatZ);\n            const coord = (0, _webMercatorUtils.worldToPixels)(worldPosition, this.pixelProjectionMatrix);\n            const [x, y] = coord;\n            const y2 = topLeft ? y : this.height - y;\n            return lngLatZ.length === 2 ? [\n                x,\n                y2\n            ] : [\n                x,\n                y2,\n                coord[2]\n            ];\n        });\n        (0, _definePropertyDefault.default)(this, \"unproject\", (xyz, options = {})=>{\n            const { topLeft =true , targetZ  } = options;\n            const [x, y, z] = xyz;\n            const y2 = topLeft ? y : this.height - y;\n            const targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n            const coord = (0, _webMercatorUtils.pixelsToWorld)([\n                x,\n                y2,\n                z\n            ], this.pixelUnprojectionMatrix, targetZWorld);\n            const [X, Y, Z] = this.unprojectPosition(coord);\n            if (Number.isFinite(z)) return [\n                X,\n                Y,\n                Z\n            ];\n            return Number.isFinite(targetZ) ? [\n                X,\n                Y,\n                targetZ\n            ] : [\n                X,\n                Y\n            ];\n        });\n        (0, _definePropertyDefault.default)(this, \"projectPosition\", (xyz)=>{\n            const [X, Y] = (0, _webMercatorUtils.lngLatToWorld)(xyz);\n            const Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n            return [\n                X,\n                Y,\n                Z\n            ];\n        });\n        (0, _definePropertyDefault.default)(this, \"unprojectPosition\", (xyz)=>{\n            const [X, Y] = (0, _webMercatorUtils.worldToLngLat)(xyz);\n            const Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n            return [\n                X,\n                Y,\n                Z\n            ];\n        });\n        let { width , height , altitude =null , fovy =null  } = props;\n        const { latitude =0 , longitude =0 , zoom =0 , pitch =0 , bearing =0 , position =null , nearZMultiplier =0.02 , farZMultiplier =1.01  } = props;\n        width = width || 1;\n        height = height || 1;\n        if (fovy === null && altitude === null) {\n            altitude = (0, _webMercatorUtils.DEFAULT_ALTITUDE);\n            fovy = (0, _webMercatorUtils.altitudeToFovy)(altitude);\n        } else if (fovy === null) fovy = (0, _webMercatorUtils.altitudeToFovy)(altitude);\n        else if (altitude === null) altitude = (0, _webMercatorUtils.fovyToAltitude)(fovy);\n        const scale = (0, _webMercatorUtils.zoomToScale)(zoom);\n        altitude = Math.max(0.75, altitude);\n        const distanceScales = (0, _webMercatorUtils.getDistanceScales)({\n            longitude,\n            latitude\n        });\n        const center = (0, _webMercatorUtils.lngLatToWorld)([\n            longitude,\n            latitude\n        ]);\n        center.push(0);\n        if (position) _vec3.add(center, center, _vec3.mul([], position, distanceScales.unitsPerMeter));\n        this.projectionMatrix = (0, _webMercatorUtils.getProjectionMatrix)({\n            width,\n            height,\n            pitch,\n            fovy,\n            nearZMultiplier,\n            farZMultiplier\n        });\n        this.viewMatrix = (0, _webMercatorUtils.getViewMatrix)({\n            height,\n            scale,\n            center,\n            pitch,\n            bearing,\n            altitude\n        });\n        this.width = width;\n        this.height = height;\n        this.scale = scale;\n        this.latitude = latitude;\n        this.longitude = longitude;\n        this.zoom = zoom;\n        this.pitch = pitch;\n        this.bearing = bearing;\n        this.altitude = altitude;\n        this.fovy = fovy;\n        this.center = center;\n        this.meterOffset = position || [\n            0,\n            0,\n            0\n        ];\n        this.distanceScales = distanceScales;\n        this._initMatrices();\n        Object.freeze(this);\n    }\n    _initMatrices() {\n        const { width , height , projectionMatrix , viewMatrix  } = this;\n        const vpm = (0, _mathUtils.createMat4)();\n        _mat4.multiply(vpm, vpm, projectionMatrix);\n        _mat4.multiply(vpm, vpm, viewMatrix);\n        this.viewProjectionMatrix = vpm;\n        const m = (0, _mathUtils.createMat4)();\n        _mat4.scale(m, m, [\n            width / 2,\n            -height / 2,\n            1\n        ]);\n        _mat4.translate(m, m, [\n            1,\n            -1,\n            0\n        ]);\n        _mat4.multiply(m, m, vpm);\n        const mInverse = _mat4.invert((0, _mathUtils.createMat4)(), m);\n        if (!mInverse) throw new Error(\"Pixel project matrix not invertible\");\n        this.pixelProjectionMatrix = m;\n        this.pixelUnprojectionMatrix = mInverse;\n    }\n    projectFlat(lngLat) {\n        return (0, _webMercatorUtils.lngLatToWorld)(lngLat);\n    }\n    unprojectFlat(xy) {\n        return (0, _webMercatorUtils.worldToLngLat)(xy);\n    }\n    getMapCenterByLngLatPosition({ lngLat , pos  }) {\n        const fromLocation = (0, _webMercatorUtils.pixelsToWorld)(pos, this.pixelUnprojectionMatrix);\n        const toLocation = (0, _webMercatorUtils.lngLatToWorld)(lngLat);\n        const translate = _vec2.add([], toLocation, _vec2.negate([], fromLocation));\n        const newCenter = _vec2.add([], this.center, translate);\n        return (0, _webMercatorUtils.worldToLngLat)(newCenter);\n    }\n    fitBounds(bounds, options = {}) {\n        const { width , height  } = this;\n        const { longitude , latitude , zoom  } = (0, _fitBoundsDefault.default)(Object.assign({\n            width,\n            height,\n            bounds\n        }, options));\n        return new WebMercatorViewport({\n            width,\n            height,\n            longitude,\n            latitude,\n            zoom\n        });\n    }\n    getBounds(options) {\n        const corners = this.getBoundingRegion(options);\n        const west = Math.min(...corners.map((p)=>p[0]));\n        const east = Math.max(...corners.map((p)=>p[0]));\n        const south = Math.min(...corners.map((p)=>p[1]));\n        const north = Math.max(...corners.map((p)=>p[1]));\n        return [\n            [\n                west,\n                south\n            ],\n            [\n                east,\n                north\n            ]\n        ];\n    }\n    getBoundingRegion(options = {}) {\n        return (0, _getBoundsDefault.default)(this, options.z || 0);\n    }\n    getLocationAtPoint({ lngLat , pos  }) {\n        return this.getMapCenterByLngLatPosition({\n            lngLat,\n            pos\n        });\n    }\n}\nexports.default = WebMercatorViewport;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"./math-utils\":\"g3X8f\",\"./web-mercator-utils\":\"dXGoy\",\"./fit-bounds\":\"3Nac8\",\"./get-bounds\":\"RNdlJ\",\"gl-matrix/mat4\":\"aI9zp\",\"gl-matrix/vec2\":\"29QfU\",\"gl-matrix/vec3\":\"4RBb8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g3X8f\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createMat4\", ()=>createMat4);\nparcelHelpers.export(exports, \"transformVector\", ()=>transformVector);\nparcelHelpers.export(exports, \"mod\", ()=>mod);\nparcelHelpers.export(exports, \"lerp\", ()=>lerp);\nparcelHelpers.export(exports, \"clamp\", ()=>clamp);\nparcelHelpers.export(exports, \"log2\", ()=>log2);\nvar _vec4 = require(\"gl-matrix/vec4\");\nfunction createMat4() {\n    return [\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1\n    ];\n}\nfunction transformVector(matrix, vector) {\n    const result = (0, _vec4.transformMat4)([], vector, matrix);\n    (0, _vec4.scale)(result, result, 1 / result[3]);\n    return result;\n}\nfunction mod(value, divisor) {\n    const modulus = value % divisor;\n    return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction lerp(start, end, step) {\n    return step * end + (1 - step) * start;\n}\nfunction clamp(x, min, max) {\n    return x < min ? min : x > max ? max : x;\n}\nfunction ieLog2(x) {\n    return Math.log(x) * Math.LOG2E;\n}\nconst log2 = Math.log2 || ieLog2;\n\n},{\"gl-matrix/vec4\":\"9M1lU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dXGoy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"MAX_LATITUDE\", ()=>MAX_LATITUDE);\nparcelHelpers.export(exports, \"DEFAULT_ALTITUDE\", ()=>DEFAULT_ALTITUDE);\nparcelHelpers.export(exports, \"zoomToScale\", ()=>zoomToScale);\nparcelHelpers.export(exports, \"scaleToZoom\", ()=>scaleToZoom);\nparcelHelpers.export(exports, \"lngLatToWorld\", ()=>lngLatToWorld);\nparcelHelpers.export(exports, \"worldToLngLat\", ()=>worldToLngLat);\nparcelHelpers.export(exports, \"getMeterZoom\", ()=>getMeterZoom);\nparcelHelpers.export(exports, \"getDistanceScales\", ()=>getDistanceScales);\nparcelHelpers.export(exports, \"addMetersToLngLat\", ()=>addMetersToLngLat);\nparcelHelpers.export(exports, \"getViewMatrix\", ()=>getViewMatrix);\nparcelHelpers.export(exports, \"getProjectionParameters\", ()=>getProjectionParameters);\nparcelHelpers.export(exports, \"getProjectionMatrix\", ()=>getProjectionMatrix);\nparcelHelpers.export(exports, \"altitudeToFovy\", ()=>altitudeToFovy);\nparcelHelpers.export(exports, \"fovyToAltitude\", ()=>fovyToAltitude);\nparcelHelpers.export(exports, \"worldToPixels\", ()=>worldToPixels);\nparcelHelpers.export(exports, \"pixelsToWorld\", ()=>pixelsToWorld);\nvar _mathUtils = require(\"./math-utils\");\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nconst PI = Math.PI;\nconst PI_4 = PI / 4;\nconst DEGREES_TO_RADIANS = PI / 180;\nconst RADIANS_TO_DEGREES = 180 / PI;\nconst TILE_SIZE = 512;\nconst EARTH_CIRCUMFERENCE = 40.03e6;\nconst MAX_LATITUDE = 85.051129;\nconst DEFAULT_ALTITUDE = 1.5;\nfunction zoomToScale(zoom) {\n    return Math.pow(2, zoom);\n}\nfunction scaleToZoom(scale) {\n    return (0, _mathUtils.log2)(scale);\n}\nfunction lngLatToWorld(lngLat) {\n    const [lng, lat] = lngLat;\n    (0, _assertDefault.default)(Number.isFinite(lng));\n    (0, _assertDefault.default)(Number.isFinite(lat) && lat >= -90 && lat <= 90, \"invalid latitude\");\n    const lambda2 = lng * DEGREES_TO_RADIANS;\n    const phi2 = lat * DEGREES_TO_RADIANS;\n    const x = TILE_SIZE * (lambda2 + PI) / (2 * PI);\n    const y = TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5))) / (2 * PI);\n    return [\n        x,\n        y\n    ];\n}\nfunction worldToLngLat(xy) {\n    const [x, y] = xy;\n    const lambda2 = x / TILE_SIZE * (2 * PI) - PI;\n    const phi2 = 2 * (Math.atan(Math.exp(y / TILE_SIZE * (2 * PI) - PI)) - PI_4);\n    return [\n        lambda2 * RADIANS_TO_DEGREES,\n        phi2 * RADIANS_TO_DEGREES\n    ];\n}\nfunction getMeterZoom(options) {\n    const { latitude  } = options;\n    (0, _assertDefault.default)(Number.isFinite(latitude));\n    const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n    return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\nfunction getDistanceScales(options) {\n    const { latitude , longitude , highPrecision =false  } = options;\n    (0, _assertDefault.default)(Number.isFinite(latitude) && Number.isFinite(longitude));\n    const worldSize = TILE_SIZE;\n    const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n    const unitsPerDegreeX = worldSize / 360;\n    const unitsPerDegreeY = unitsPerDegreeX / latCosine;\n    const altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n    const result = {\n        unitsPerMeter: [\n            altUnitsPerMeter,\n            altUnitsPerMeter,\n            altUnitsPerMeter\n        ],\n        metersPerUnit: [\n            1 / altUnitsPerMeter,\n            1 / altUnitsPerMeter,\n            1 / altUnitsPerMeter\n        ],\n        unitsPerDegree: [\n            unitsPerDegreeX,\n            unitsPerDegreeY,\n            altUnitsPerMeter\n        ],\n        degreesPerUnit: [\n            1 / unitsPerDegreeX,\n            1 / unitsPerDegreeY,\n            1 / altUnitsPerMeter\n        ]\n    };\n    if (highPrecision) {\n        const latCosine2 = DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS) / latCosine;\n        const unitsPerDegreeY2 = unitsPerDegreeX * latCosine2 / 2;\n        const altUnitsPerDegree2 = worldSize / EARTH_CIRCUMFERENCE * latCosine2;\n        const altUnitsPerMeter2 = altUnitsPerDegree2 / unitsPerDegreeY * altUnitsPerMeter;\n        result.unitsPerDegree2 = [\n            0,\n            unitsPerDegreeY2,\n            altUnitsPerDegree2\n        ];\n        result.unitsPerMeter2 = [\n            altUnitsPerMeter2,\n            0,\n            altUnitsPerMeter2\n        ];\n    }\n    return result;\n}\nfunction addMetersToLngLat(lngLatZ, xyz) {\n    const [longitude, latitude, z0] = lngLatZ;\n    const [x, y, z] = xyz;\n    const { unitsPerMeter , unitsPerMeter2  } = getDistanceScales({\n        longitude,\n        latitude,\n        highPrecision: true\n    });\n    const worldspace = lngLatToWorld(lngLatZ);\n    worldspace[0] += x * (unitsPerMeter[0] + unitsPerMeter2[0] * y);\n    worldspace[1] += y * (unitsPerMeter[1] + unitsPerMeter2[1] * y);\n    const newLngLat = worldToLngLat(worldspace);\n    const newZ = (z0 || 0) + (z || 0);\n    return Number.isFinite(z0) || Number.isFinite(z) ? [\n        newLngLat[0],\n        newLngLat[1],\n        newZ\n    ] : newLngLat;\n}\nfunction getViewMatrix(options) {\n    const { height , pitch , bearing , altitude , scale , center  } = options;\n    const vm = (0, _mathUtils.createMat4)();\n    _mat4.translate(vm, vm, [\n        0,\n        0,\n        -altitude\n    ]);\n    _mat4.rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n    _mat4.rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n    const relativeScale = scale / height;\n    _mat4.scale(vm, vm, [\n        relativeScale,\n        relativeScale,\n        relativeScale\n    ]);\n    if (center) _mat4.translate(vm, vm, _vec3.negate([], center));\n    return vm;\n}\nfunction getProjectionParameters(options) {\n    const { width , height , altitude , pitch =0 , nearZMultiplier =1 , farZMultiplier =1  } = options;\n    let { fovy =altitudeToFovy(DEFAULT_ALTITUDE)  } = options;\n    if (altitude !== undefined) fovy = altitudeToFovy(altitude);\n    const halfFov = 0.5 * fovy * DEGREES_TO_RADIANS;\n    const focalDistance = fovyToAltitude(fovy);\n    const pitchRadians = pitch * DEGREES_TO_RADIANS;\n    const topHalfSurfaceDistance = Math.sin(halfFov) * focalDistance / Math.sin(Math.min(Math.max(Math.PI / 2 - pitchRadians - halfFov, 0.01), Math.PI - 0.01));\n    const farZ = Math.sin(pitchRadians) * topHalfSurfaceDistance + focalDistance;\n    return {\n        fov: 2 * halfFov,\n        aspect: width / height,\n        focalDistance,\n        near: nearZMultiplier,\n        far: farZ * farZMultiplier\n    };\n}\nfunction getProjectionMatrix(options) {\n    const { fov , aspect , near , far  } = getProjectionParameters(options);\n    const projectionMatrix = _mat4.perspective([], fov, aspect, near, far);\n    return projectionMatrix;\n}\nfunction altitudeToFovy(altitude) {\n    return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\nfunction fovyToAltitude(fovy) {\n    return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\nfunction worldToPixels(xyz, pixelProjectionMatrix) {\n    const [x, y, z = 0] = xyz;\n    (0, _assertDefault.default)(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n    return (0, _mathUtils.transformVector)(pixelProjectionMatrix, [\n        x,\n        y,\n        z,\n        1\n    ]);\n}\nfunction pixelsToWorld(xyz, pixelUnprojectionMatrix, targetZ = 0) {\n    const [x, y, z] = xyz;\n    (0, _assertDefault.default)(Number.isFinite(x) && Number.isFinite(y), \"invalid pixel coordinate\");\n    if (Number.isFinite(z)) {\n        const coord = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n            x,\n            y,\n            z,\n            1\n        ]);\n        return coord;\n    }\n    const coord0 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n        x,\n        y,\n        0,\n        1\n    ]);\n    const coord1 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n        x,\n        y,\n        1,\n        1\n    ]);\n    const z0 = coord0[2];\n    const z1 = coord1[2];\n    const t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n    return _vec2.lerp([], coord0, coord1, t);\n}\n\n},{\"./math-utils\":\"g3X8f\",\"gl-matrix/mat4\":\"aI9zp\",\"gl-matrix/vec2\":\"29QfU\",\"gl-matrix/vec3\":\"4RBb8\",\"./assert\":\"8aOHi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8aOHi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"@math.gl/web-mercator: assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Nac8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _mathUtils = require(\"./math-utils\");\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nfunction fitBounds(options) {\n    const { width , height , bounds , minExtent =0 , maxZoom =24 , offset =[\n        0,\n        0\n    ]  } = options;\n    const [[west, south], [east, north]] = bounds;\n    const padding = getPaddingObject(options.padding);\n    const nw = (0, _webMercatorUtils.lngLatToWorld)([\n        west,\n        (0, _mathUtils.clamp)(north, -(0, _webMercatorUtils.MAX_LATITUDE), (0, _webMercatorUtils.MAX_LATITUDE))\n    ]);\n    const se = (0, _webMercatorUtils.lngLatToWorld)([\n        east,\n        (0, _mathUtils.clamp)(south, -(0, _webMercatorUtils.MAX_LATITUDE), (0, _webMercatorUtils.MAX_LATITUDE))\n    ]);\n    const size = [\n        Math.max(Math.abs(se[0] - nw[0]), minExtent),\n        Math.max(Math.abs(se[1] - nw[1]), minExtent)\n    ];\n    const targetSize = [\n        width - padding.left - padding.right - Math.abs(offset[0]) * 2,\n        height - padding.top - padding.bottom - Math.abs(offset[1]) * 2\n    ];\n    (0, _assertDefault.default)(targetSize[0] > 0 && targetSize[1] > 0);\n    const scaleX = targetSize[0] / size[0];\n    const scaleY = targetSize[1] / size[1];\n    const offsetX = (padding.right - padding.left) / 2 / scaleX;\n    const offsetY = (padding.bottom - padding.top) / 2 / scaleY;\n    const center = [\n        (se[0] + nw[0]) / 2 + offsetX,\n        (se[1] + nw[1]) / 2 + offsetY\n    ];\n    const centerLngLat = (0, _webMercatorUtils.worldToLngLat)(center);\n    const zoom = Math.min(maxZoom, (0, _mathUtils.log2)(Math.abs(Math.min(scaleX, scaleY))));\n    (0, _assertDefault.default)(Number.isFinite(zoom));\n    return {\n        longitude: centerLngLat[0],\n        latitude: centerLngLat[1],\n        zoom\n    };\n}\nexports.default = fitBounds;\nfunction getPaddingObject(padding = 0) {\n    if (typeof padding === \"number\") return {\n        top: padding,\n        bottom: padding,\n        left: padding,\n        right: padding\n    };\n    (0, _assertDefault.default)(Number.isFinite(padding.top) && Number.isFinite(padding.bottom) && Number.isFinite(padding.left) && Number.isFinite(padding.right));\n    return padding;\n}\n\n},{\"./assert\":\"8aOHi\",\"./math-utils\":\"g3X8f\",\"./web-mercator-utils\":\"dXGoy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"RNdlJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _mathUtils = require(\"./math-utils\");\nconst DEGREES_TO_RADIANS = Math.PI / 180;\nfunction getBounds(viewport, z = 0) {\n    const { width , height , unproject  } = viewport;\n    const unprojectOps = {\n        targetZ: z\n    };\n    const bottomLeft = unproject([\n        0,\n        height\n    ], unprojectOps);\n    const bottomRight = unproject([\n        width,\n        height\n    ], unprojectOps);\n    let topLeft;\n    let topRight;\n    const halfFov = viewport.fovy ? 0.5 * viewport.fovy * DEGREES_TO_RADIANS : Math.atan(0.5 / viewport.altitude);\n    const angleToGround = (90 - viewport.pitch) * DEGREES_TO_RADIANS;\n    if (halfFov > angleToGround - 0.01) {\n        topLeft = unprojectOnFarPlane(viewport, 0, z);\n        topRight = unprojectOnFarPlane(viewport, width, z);\n    } else {\n        topLeft = unproject([\n            0,\n            0\n        ], unprojectOps);\n        topRight = unproject([\n            width,\n            0\n        ], unprojectOps);\n    }\n    return [\n        bottomLeft,\n        bottomRight,\n        topRight,\n        topLeft\n    ];\n}\nexports.default = getBounds;\nfunction unprojectOnFarPlane(viewport, x, targetZ) {\n    const { pixelUnprojectionMatrix  } = viewport;\n    const coord0 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n        x,\n        0,\n        1,\n        1\n    ]);\n    const coord1 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n        x,\n        viewport.height,\n        1,\n        1\n    ]);\n    const z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n    const t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n    const coord = _vec2.lerp([], coord0, coord1, t);\n    const result = (0, _webMercatorUtils.worldToLngLat)(coord);\n    result.push(targetZ);\n    return result;\n}\n\n},{\"./web-mercator-utils\":\"dXGoy\",\"gl-matrix/vec2\":\"29QfU\",\"./math-utils\":\"g3X8f\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dmkzj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nvar _mathUtils = require(\"./math-utils\");\nconst TILE_SIZE = 512;\nfunction normalizeViewportProps(props) {\n    const { width , height , pitch =0  } = props;\n    let { longitude , latitude , zoom , bearing =0  } = props;\n    if (longitude < -180 || longitude > 180) longitude = (0, _mathUtils.mod)(longitude + 180, 360) - 180;\n    if (bearing < -180 || bearing > 180) bearing = (0, _mathUtils.mod)(bearing + 180, 360) - 180;\n    const minZoom = (0, _mathUtils.log2)(height / TILE_SIZE);\n    if (zoom <= minZoom) {\n        zoom = minZoom;\n        latitude = 0;\n    } else {\n        const halfHeightPixels = height / 2 / Math.pow(2, zoom);\n        const minLatitude = (0, _webMercatorUtils.worldToLngLat)([\n            0,\n            halfHeightPixels\n        ])[1];\n        if (latitude < minLatitude) latitude = minLatitude;\n        else {\n            const maxLatitude = (0, _webMercatorUtils.worldToLngLat)([\n                0,\n                TILE_SIZE - halfHeightPixels\n            ])[1];\n            if (latitude > maxLatitude) latitude = maxLatitude;\n        }\n    }\n    return {\n        width,\n        height,\n        longitude,\n        latitude,\n        zoom,\n        pitch,\n        bearing\n    };\n}\nexports.default = normalizeViewportProps;\n\n},{\"./web-mercator-utils\":\"dXGoy\",\"./math-utils\":\"g3X8f\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8ePVP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getFlyToDuration\", ()=>getFlyToDuration);\nvar _mathUtils = require(\"./math-utils\");\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nconst EPSILON = 0.01;\nconst VIEWPORT_TRANSITION_PROPS = [\n    \"longitude\",\n    \"latitude\",\n    \"zoom\"\n];\nconst DEFAULT_OPTS = {\n    curve: 1.414,\n    speed: 1.2\n};\nfunction flyToViewport(startProps, endProps, t, options) {\n    const { startZoom , startCenterXY , uDelta , w0 , u1 , S , rho , rho2 , r0  } = getFlyToTransitionParams(startProps, endProps, options);\n    if (u1 < EPSILON) {\n        const viewport = {};\n        for (const key of VIEWPORT_TRANSITION_PROPS){\n            const startValue = startProps[key];\n            const endValue = endProps[key];\n            viewport[key] = (0, _mathUtils.lerp)(startValue, endValue, t);\n        }\n        return viewport;\n    }\n    const s = t * S;\n    const w = Math.cosh(r0) / Math.cosh(r0 + rho * s);\n    const u = w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2) / u1;\n    const scaleIncrement = 1 / w;\n    const newZoom = startZoom + (0, _webMercatorUtils.scaleToZoom)(scaleIncrement);\n    const newCenterWorld = _vec2.scale([], uDelta, u);\n    _vec2.add(newCenterWorld, newCenterWorld, startCenterXY);\n    const newCenter = (0, _webMercatorUtils.worldToLngLat)(newCenterWorld);\n    return {\n        longitude: newCenter[0],\n        latitude: newCenter[1],\n        zoom: newZoom\n    };\n}\nexports.default = flyToViewport;\nfunction getFlyToDuration(startProps, endProps, options) {\n    const opts = {\n        ...DEFAULT_OPTS,\n        ...options\n    };\n    const { screenSpeed , speed , maxDuration  } = opts;\n    const { S , rho  } = getFlyToTransitionParams(startProps, endProps, opts);\n    const length = 1000 * S;\n    let duration;\n    if (Number.isFinite(screenSpeed)) duration = length / (screenSpeed / rho);\n    else duration = length / speed;\n    return Number.isFinite(maxDuration) && duration > maxDuration ? 0 : duration;\n}\nfunction getFlyToTransitionParams(startProps, endProps, opts) {\n    opts = Object.assign({}, DEFAULT_OPTS, opts);\n    const rho = opts.curve;\n    const startZoom = startProps.zoom;\n    const startCenter = [\n        startProps.longitude,\n        startProps.latitude\n    ];\n    const startScale = (0, _webMercatorUtils.zoomToScale)(startZoom);\n    const endZoom = endProps.zoom;\n    const endCenter = [\n        endProps.longitude,\n        endProps.latitude\n    ];\n    const scale = (0, _webMercatorUtils.zoomToScale)(endZoom - startZoom);\n    const startCenterXY = (0, _webMercatorUtils.lngLatToWorld)(startCenter);\n    const endCenterXY = (0, _webMercatorUtils.lngLatToWorld)(endCenter);\n    const uDelta = _vec2.sub([], endCenterXY, startCenterXY);\n    const w0 = Math.max(startProps.width, startProps.height);\n    const w1 = w0 / scale;\n    const u1 = _vec2.length(uDelta) * startScale;\n    const _u1 = Math.max(u1, EPSILON);\n    const rho2 = rho * rho;\n    const b0 = (w1 * w1 - w0 * w0 + rho2 * rho2 * _u1 * _u1) / (2 * w0 * rho2 * _u1);\n    const b1 = (w1 * w1 - w0 * w0 - rho2 * rho2 * _u1 * _u1) / (2 * w1 * rho2 * _u1);\n    const r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);\n    const r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n    const S = (r1 - r0) / rho;\n    return {\n        startZoom,\n        startCenterXY,\n        uDelta,\n        w0,\n        u1,\n        S,\n        rho,\n        rho2,\n        r0,\n        r1\n    };\n}\n\n},{\"./math-utils\":\"g3X8f\",\"./web-mercator-utils\":\"dXGoy\",\"gl-matrix/vec2\":\"29QfU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"69ybw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _core = require(\"@luma.gl/core\");\nexports.default = Object.assign({\n    inject: {\n        \"vs:DECKGL_FILTER_COLOR\": \"\\n    picking_setPickingColor(geometry.pickingColor);\\n    // for picking depth values\\n    picking_setPickingAttribute(geometry.position.z);\\n    \",\n        \"fs:DECKGL_FILTER_COLOR\": {\n            order: 99,\n            injection: \"\\n    // use highlight color if this fragment belongs to the selected object.\\n    color = picking_filterHighlightColor(color);\\n\\n    // use picking color if rendering to picking FBO.\\n    color = picking_filterPickingColor(color);\\n      \"\n        }\n    }\n}, (0, _core.picking));\n\n},{\"@luma.gl/core\":\"WBJLR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"faL8t\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LightingEffect);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@luma.gl/core\");\nvar _ambientLight = require(\"./ambient-light\");\nvar _directionalLight = require(\"./directional-light\");\nvar _effect = require(\"../../lib/effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _mathGl = require(\"math.gl\");\nvar _shadowPass = require(\"../../passes/shadow-pass\");\nvar _shadowPassDefault = parcelHelpers.interopDefault(_shadowPass);\nvar _shadow = require(\"../../shaderlib/shadow/shadow\");\nvar _shadowDefault = parcelHelpers.interopDefault(_shadow);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_AMBIENT_LIGHT_PROPS = {\n    color: [\n        255,\n        255,\n        255\n    ],\n    intensity: 1.0\n};\nvar DEFAULT_DIRECTIONAL_LIGHT_PROPS = [\n    {\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 1.0,\n        direction: [\n            -1,\n            3,\n            -1\n        ]\n    },\n    {\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 0.9,\n        direction: [\n            1,\n            -8,\n            -2.5\n        ]\n    }\n];\nvar DEFAULT_SHADOW_COLOR = [\n    0,\n    0,\n    0,\n    200 / 255\n];\nvar LightingEffect = function(_Effect) {\n    (0, _inheritsDefault.default)(LightingEffect1, _Effect);\n    var _super = _createSuper(LightingEffect1);\n    function LightingEffect1(props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, LightingEffect1);\n        _this = _super.call(this, props);\n        _this.ambientLight = null;\n        _this.directionalLights = [];\n        _this.pointLights = [];\n        _this.shadowColor = DEFAULT_SHADOW_COLOR;\n        _this.shadowPasses = [];\n        _this.shadowMaps = [];\n        _this.dummyShadowMap = null;\n        _this.shadow = false;\n        _this.programManager = null;\n        for(var key in props){\n            var lightSource = props[key];\n            switch(lightSource.type){\n                case \"ambient\":\n                    _this.ambientLight = lightSource;\n                    break;\n                case \"directional\":\n                    _this.directionalLights.push(lightSource);\n                    break;\n                case \"point\":\n                    _this.pointLights.push(lightSource);\n                    break;\n                default:\n            }\n        }\n        _this._applyDefaultLights();\n        _this.shadow = _this.directionalLights.some(function(light) {\n            return light.shadow;\n        });\n        return _this;\n    }\n    (0, _createClassDefault.default)(LightingEffect1, [\n        {\n            key: \"preRender\",\n            value: function preRender(gl, _ref) {\n                var layers = _ref.layers, layerFilter = _ref.layerFilter, viewports = _ref.viewports, onViewportActive = _ref.onViewportActive, views = _ref.views;\n                if (!this.shadow) return;\n                this.shadowMatrices = this._createLightMatrix();\n                if (this.shadowPasses.length === 0) this._createShadowPasses(gl);\n                if (!this.programManager) {\n                    this.programManager = (0, _core.ProgramManager).getDefaultProgramManager(gl);\n                    if (0, _shadowDefault.default) this.programManager.addDefaultModule((0, _shadowDefault.default));\n                }\n                if (!this.dummyShadowMap) this.dummyShadowMap = new (0, _core.Texture2D)(gl, {\n                    width: 1,\n                    height: 1\n                });\n                for(var i = 0; i < this.shadowPasses.length; i++){\n                    var shadowPass = this.shadowPasses[i];\n                    shadowPass.render({\n                        layers: layers,\n                        layerFilter: layerFilter,\n                        viewports: viewports,\n                        onViewportActive: onViewportActive,\n                        views: views,\n                        moduleParameters: {\n                            shadowLightId: i,\n                            dummyShadowMap: this.dummyShadowMap,\n                            shadowMatrices: this.shadowMatrices\n                        }\n                    });\n                }\n            }\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters(layer) {\n                var parameters = this.shadow ? {\n                    shadowMaps: this.shadowMaps,\n                    dummyShadowMap: this.dummyShadowMap,\n                    shadowColor: this.shadowColor,\n                    shadowMatrices: this.shadowMatrices\n                } : {};\n                parameters.lightSources = {\n                    ambientLight: this.ambientLight,\n                    directionalLights: this.directionalLights.map(function(directionalLight) {\n                        return directionalLight.getProjectedLight({\n                            layer: layer\n                        });\n                    }),\n                    pointLights: this.pointLights.map(function(pointLight) {\n                        return pointLight.getProjectedLight({\n                            layer: layer\n                        });\n                    })\n                };\n                return parameters;\n            }\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {\n                var _iterator = _createForOfIteratorHelper(this.shadowPasses), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var shadowPass = _step.value;\n                        shadowPass[\"delete\"]();\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                this.shadowPasses.length = 0;\n                this.shadowMaps.length = 0;\n                if (this.dummyShadowMap) {\n                    this.dummyShadowMap[\"delete\"]();\n                    this.dummyShadowMap = null;\n                }\n                if (this.shadow && this.programManager) {\n                    this.programManager.removeDefaultModule((0, _shadowDefault.default));\n                    this.programManager = null;\n                }\n            }\n        },\n        {\n            key: \"_createLightMatrix\",\n            value: function _createLightMatrix() {\n                var lightMatrices = [];\n                var _iterator2 = _createForOfIteratorHelper(this.directionalLights), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var light = _step2.value;\n                        var viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n                            eye: new (0, _mathGl.Vector3)(light.direction).negate()\n                        });\n                        lightMatrices.push(viewMatrix);\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n                return lightMatrices;\n            }\n        },\n        {\n            key: \"_createShadowPasses\",\n            value: function _createShadowPasses(gl) {\n                for(var i = 0; i < this.directionalLights.length; i++){\n                    var shadowPass = new (0, _shadowPassDefault.default)(gl);\n                    this.shadowPasses[i] = shadowPass;\n                    this.shadowMaps[i] = shadowPass.shadowMap;\n                }\n            }\n        },\n        {\n            key: \"_applyDefaultLights\",\n            value: function _applyDefaultLights() {\n                var ambientLight = this.ambientLight, pointLights = this.pointLights, directionalLights = this.directionalLights;\n                if (!ambientLight && pointLights.length === 0 && directionalLights.length === 0) {\n                    this.ambientLight = new (0, _ambientLight.AmbientLight)(DEFAULT_AMBIENT_LIGHT_PROPS);\n                    this.directionalLights.push(new (0, _directionalLight.DirectionalLight)(DEFAULT_DIRECTIONAL_LIGHT_PROPS[0]), new (0, _directionalLight.DirectionalLight)(DEFAULT_DIRECTIONAL_LIGHT_PROPS[1]));\n                }\n            }\n        }\n    ]);\n    return LightingEffect1;\n}((0, _effectDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@luma.gl/core\":\"WBJLR\",\"./ambient-light\":\"bb0b8\",\"./directional-light\":\"9vhZm\",\"../../lib/effect\":\"6aqmc\",\"math.gl\":\"huJnq\",\"../../passes/shadow-pass\":\"jHdJt\",\"../../shaderlib/shadow/shadow\":\"5tBqN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bb0b8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AmbientLight\", ()=>AmbientLight);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar DEFAULT_LIGHT_COLOR = [\n    255,\n    255,\n    255\n];\nvar DEFAULT_LIGHT_INTENSITY = 1.0;\nvar idCount = 0;\nvar AmbientLight = function AmbientLight1() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheckDefault.default)(this, AmbientLight1);\n    var _props$color = props.color, color = _props$color === void 0 ? DEFAULT_LIGHT_COLOR : _props$color;\n    var _props$intensity = props.intensity, intensity = _props$intensity === void 0 ? DEFAULT_LIGHT_INTENSITY : _props$intensity;\n    this.id = props.id || \"ambient-\".concat(idCount++);\n    this.color = color;\n    this.intensity = intensity;\n    this.type = \"ambient\";\n};\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9vhZm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DirectionalLight\", ()=>DirectionalLight);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _mathGl = require(\"math.gl\");\nvar DEFAULT_LIGHT_COLOR = [\n    255,\n    255,\n    255\n];\nvar DEFAULT_LIGHT_INTENSITY = 1.0;\nvar DEFAULT_LIGHT_DIRECTION = [\n    0.0,\n    0.0,\n    -1\n];\nvar idCount = 0;\nvar DirectionalLight = function() {\n    function DirectionalLight1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, DirectionalLight1);\n        var _props$color = props.color, color = _props$color === void 0 ? DEFAULT_LIGHT_COLOR : _props$color;\n        var _props$intensity = props.intensity, intensity = _props$intensity === void 0 ? DEFAULT_LIGHT_INTENSITY : _props$intensity;\n        var _props$direction = props.direction, direction = _props$direction === void 0 ? DEFAULT_LIGHT_DIRECTION : _props$direction;\n        var _props$_shadow = props._shadow, _shadow = _props$_shadow === void 0 ? false : _props$_shadow;\n        this.id = props.id || \"directional-\".concat(idCount++);\n        this.color = color;\n        this.intensity = intensity;\n        this.type = \"directional\";\n        this.direction = new (0, _mathGl.Vector3)(direction).normalize().toArray();\n        this.shadow = _shadow;\n    }\n    (0, _createClassDefault.default)(DirectionalLight1, [\n        {\n            key: \"getProjectedLight\",\n            value: function getProjectedLight() {\n                return this;\n            }\n        }\n    ]);\n    return DirectionalLight1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"math.gl\":\"huJnq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6aqmc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Effect);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar Effect = function() {\n    function Effect1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, Effect1);\n        var _props$id = props.id, id = _props$id === void 0 ? \"effect\" : _props$id;\n        this.id = id;\n        this.props = {};\n        Object.assign(this.props, props);\n    }\n    (0, _createClassDefault.default)(Effect1, [\n        {\n            key: \"preRender\",\n            value: function preRender() {}\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters() {}\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {}\n        }\n    ]);\n    return Effect1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jHdJt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ShadowPass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _layersPass = require(\"./layers-pass\");\nvar _layersPassDefault = parcelHelpers.interopDefault(_layersPass);\nvar _core = require(\"@luma.gl/core\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar ShadowPass = function(_LayersPass) {\n    (0, _inheritsDefault.default)(ShadowPass1, _LayersPass);\n    var _super = _createSuper(ShadowPass1);\n    function ShadowPass1(gl, props) {\n        var _parameters, _attachments;\n        var _this;\n        (0, _classCallCheckDefault.default)(this, ShadowPass1);\n        _this = _super.call(this, gl, props);\n        _this.shadowMap = new (0, _core.Texture2D)(gl, {\n            width: 1,\n            height: 1,\n            parameters: (_parameters = {}, (0, _definePropertyDefault.default)(_parameters, 10241, 9729), (0, _definePropertyDefault.default)(_parameters, 10240, 9729), (0, _definePropertyDefault.default)(_parameters, 10242, 33071), (0, _definePropertyDefault.default)(_parameters, 10243, 33071), _parameters)\n        });\n        _this.depthBuffer = new (0, _core.Renderbuffer)(gl, {\n            format: 33189,\n            width: 1,\n            height: 1\n        });\n        _this.fbo = new (0, _core.Framebuffer)(gl, {\n            id: \"shadowmap\",\n            width: 1,\n            height: 1,\n            attachments: (_attachments = {}, (0, _definePropertyDefault.default)(_attachments, 36064, _this.shadowMap), (0, _definePropertyDefault.default)(_attachments, 36096, _this.depthBuffer), _attachments)\n        });\n        return _this;\n    }\n    (0, _createClassDefault.default)(ShadowPass1, [\n        {\n            key: \"render\",\n            value: function render(params) {\n                var _this2 = this;\n                var target = this.fbo;\n                (0, _core.withParameters)(this.gl, {\n                    depthRange: [\n                        0,\n                        1\n                    ],\n                    depthTest: true,\n                    blend: false,\n                    clearColor: [\n                        1,\n                        1,\n                        1,\n                        1\n                    ]\n                }, function() {\n                    var viewport = params.viewports[0];\n                    var pixelRatio = (0, _core.cssToDeviceRatio)(_this2.gl);\n                    var width = viewport.width * pixelRatio;\n                    var height = viewport.height * pixelRatio;\n                    if (width !== target.width || height !== target.height) target.resize({\n                        width: width,\n                        height: height\n                    });\n                    (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ShadowPass1.prototype), \"render\", _this2).call(_this2, _objectSpread(_objectSpread({}, params), {}, {\n                        target: target,\n                        pass: \"shadow\"\n                    }));\n                });\n            }\n        },\n        {\n            key: \"shouldDrawLayer\",\n            value: function shouldDrawLayer(layer) {\n                return layer.props.shadowEnabled !== false;\n            }\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters() {\n                return {\n                    drawToShadowMap: true\n                };\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                if (this.fbo) {\n                    this.fbo[\"delete\"]();\n                    this.fbo = null;\n                }\n                if (this.shadowMap) {\n                    this.shadowMap[\"delete\"]();\n                    this.shadowMap = null;\n                }\n                if (this.depthBuffer) {\n                    this.depthBuffer[\"delete\"]();\n                    this.depthBuffer = null;\n                }\n            }\n        }\n    ]);\n    return ShadowPass1;\n}((0, _layersPassDefault.default));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./layers-pass\":\"g95vg\",\"@luma.gl/core\":\"WBJLR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g95vg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LayersPass);\nparcelHelpers.export(exports, \"layerIndexResolver\", ()=>layerIndexResolver);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _pass = require(\"./pass\");\nvar _passDefault = parcelHelpers.interopDefault(_pass);\nvar _core = require(\"@luma.gl/core\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LayersPass = function(_Pass) {\n    (0, _inheritsDefault.default)(LayersPass1, _Pass);\n    var _super = _createSuper(LayersPass1);\n    function LayersPass1() {\n        (0, _classCallCheckDefault.default)(this, LayersPass1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(LayersPass1, [\n        {\n            key: \"render\",\n            value: function render(props) {\n                var gl = this.gl;\n                (0, _core.setParameters)(gl, {\n                    framebuffer: props.target\n                });\n                return this._drawLayers(props);\n            }\n        },\n        {\n            key: \"_drawLayers\",\n            value: function _drawLayers(props) {\n                var viewports = props.viewports, views = props.views, onViewportActive = props.onViewportActive, _props$clearCanvas = props.clearCanvas, clearCanvas = _props$clearCanvas === void 0 ? true : _props$clearCanvas;\n                var gl = this.gl;\n                if (clearCanvas) clearGLCanvas(gl);\n                var renderStats = [];\n                var _iterator = _createForOfIteratorHelper(viewports), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var viewportOrDescriptor = _step.value;\n                        var viewport = viewportOrDescriptor.viewport || viewportOrDescriptor;\n                        var view = views && views[viewport.id];\n                        onViewportActive(viewport);\n                        var drawLayerParams = this._getDrawLayerParams(viewport, props);\n                        props.view = view;\n                        var subViewports = viewport.subViewports || [\n                            viewport\n                        ];\n                        var _iterator2 = _createForOfIteratorHelper(subViewports), _step2;\n                        try {\n                            for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                                var subViewport = _step2.value;\n                                props.viewport = subViewport;\n                                var stats = this._drawLayersInViewport(gl, props, drawLayerParams);\n                                renderStats.push(stats);\n                            }\n                        } catch (err) {\n                            _iterator2.e(err);\n                        } finally{\n                            _iterator2.f();\n                        }\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return renderStats;\n            }\n        },\n        {\n            key: \"_getDrawLayerParams\",\n            value: function _getDrawLayerParams(viewport, _ref) {\n                var layers = _ref.layers, _ref$pass = _ref.pass, pass = _ref$pass === void 0 ? \"unknown\" : _ref$pass, layerFilter = _ref.layerFilter, effects = _ref.effects, moduleParameters = _ref.moduleParameters;\n                var drawLayerParams = [];\n                var indexResolver = layerIndexResolver();\n                for(var layerIndex = 0; layerIndex < layers.length; layerIndex++){\n                    var layer = layers[layerIndex];\n                    var shouldDrawLayer = this._shouldDrawLayer(layer, viewport, pass, layerFilter);\n                    var layerRenderIndex = indexResolver(layer, shouldDrawLayer);\n                    var layerParam = {\n                        shouldDrawLayer: shouldDrawLayer,\n                        layerRenderIndex: layerRenderIndex\n                    };\n                    if (shouldDrawLayer) {\n                        layerParam.moduleParameters = this._getModuleParameters(layer, effects, pass, moduleParameters);\n                        layerParam.layerParameters = this.getLayerParameters(layer, layerIndex);\n                    }\n                    drawLayerParams[layerIndex] = layerParam;\n                }\n                return drawLayerParams;\n            }\n        },\n        {\n            key: \"_drawLayersInViewport\",\n            value: function _drawLayersInViewport(gl, _ref2, drawLayerParams) {\n                var layers = _ref2.layers, onError = _ref2.onError, viewport = _ref2.viewport, view = _ref2.view;\n                var glViewport = getGLViewport(gl, {\n                    viewport: viewport\n                });\n                if (view && view.props.clear) {\n                    var clearOpts = view.props.clear === true ? {\n                        color: true,\n                        depth: true\n                    } : view.props.clear;\n                    (0, _core.withParameters)(gl, {\n                        scissorTest: true,\n                        scissor: glViewport\n                    }, function() {\n                        return (0, _core.clear)(gl, clearOpts);\n                    });\n                }\n                var renderStatus = {\n                    totalCount: layers.length,\n                    visibleCount: 0,\n                    compositeCount: 0,\n                    pickableCount: 0\n                };\n                (0, _core.setParameters)(gl, {\n                    viewport: glViewport\n                });\n                for(var layerIndex = 0; layerIndex < layers.length; layerIndex++){\n                    var layer = layers[layerIndex];\n                    var _drawLayerParams$laye = drawLayerParams[layerIndex], shouldDrawLayer = _drawLayerParams$laye.shouldDrawLayer, layerRenderIndex = _drawLayerParams$laye.layerRenderIndex, moduleParameters = _drawLayerParams$laye.moduleParameters, layerParameters = _drawLayerParams$laye.layerParameters;\n                    if (shouldDrawLayer && layer.props.pickable) renderStatus.pickableCount++;\n                    if (layer.isComposite) renderStatus.compositeCount++;\n                    else if (shouldDrawLayer) {\n                        renderStatus.visibleCount++;\n                        moduleParameters.viewport = viewport;\n                        try {\n                            layer.drawLayer({\n                                moduleParameters: moduleParameters,\n                                uniforms: {\n                                    layerIndex: layerRenderIndex\n                                },\n                                parameters: layerParameters\n                            });\n                        } catch (err) {\n                            if (onError) onError(err, layer);\n                            else (0, _logDefault.default).error(\"error during drawing of \".concat(layer), err)();\n                        }\n                    }\n                }\n                return renderStatus;\n            }\n        },\n        {\n            key: \"shouldDrawLayer\",\n            value: function shouldDrawLayer(layer) {\n                return true;\n            }\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters(layer, effects) {\n                return null;\n            }\n        },\n        {\n            key: \"getLayerParameters\",\n            value: function getLayerParameters(layer, layerIndex) {\n                return layer.props.parameters;\n            }\n        },\n        {\n            key: \"_shouldDrawLayer\",\n            value: function _shouldDrawLayer(layer, viewport, pass, layerFilter) {\n                var shouldDrawLayer = this.shouldDrawLayer(layer) && layer.props.visible;\n                if (shouldDrawLayer && layerFilter) shouldDrawLayer = layerFilter({\n                    layer: layer,\n                    viewport: viewport,\n                    isPicking: pass.startsWith(\"picking\"),\n                    renderPass: pass\n                });\n                if (shouldDrawLayer) layer.activateViewport(viewport);\n                return shouldDrawLayer;\n            }\n        },\n        {\n            key: \"_getModuleParameters\",\n            value: function _getModuleParameters(layer, effects, pass, overrides) {\n                var moduleParameters = Object.assign(Object.create(layer.props), {\n                    autoWrapLongitude: layer.wrapLongitude,\n                    viewport: layer.context.viewport,\n                    mousePosition: layer.context.mousePosition,\n                    pickingActive: 0,\n                    devicePixelRatio: (0, _core.cssToDeviceRatio)(this.gl)\n                });\n                if (effects) {\n                    var _iterator3 = _createForOfIteratorHelper(effects), _step3;\n                    try {\n                        for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                            var effect = _step3.value;\n                            Object.assign(moduleParameters, effect.getModuleParameters(layer));\n                        }\n                    } catch (err) {\n                        _iterator3.e(err);\n                    } finally{\n                        _iterator3.f();\n                    }\n                }\n                return Object.assign(moduleParameters, this.getModuleParameters(layer, effects), overrides);\n            }\n        }\n    ]);\n    return LayersPass1;\n}((0, _passDefault.default));\nfunction layerIndexResolver() {\n    var startIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n    var layerIndices = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var resolvers = {};\n    var resolveLayerIndex1 = function resolveLayerIndex(layer, isDrawn) {\n        var indexOverride = layer.props._offset;\n        var layerId = layer.id;\n        var parentId = layer.parent && layer.parent.id;\n        var index;\n        if (parentId && !(parentId in layerIndices)) resolveLayerIndex(layer.parent, false);\n        if (parentId in resolvers) {\n            var resolver = resolvers[parentId] = resolvers[parentId] || layerIndexResolver(layerIndices[parentId], layerIndices);\n            index = resolver(layer, isDrawn);\n            resolvers[layerId] = resolver;\n        } else if (Number.isFinite(indexOverride)) {\n            index = indexOverride + (layerIndices[parentId] || 0);\n            resolvers[layerId] = null;\n        } else index = startIndex;\n        if (isDrawn && index >= startIndex) startIndex = index + 1;\n        layerIndices[layerId] = index;\n        return index;\n    };\n    return resolveLayerIndex1;\n}\nfunction getGLViewport(gl, _ref3) {\n    var viewport = _ref3.viewport;\n    var height = gl.canvas ? gl.canvas.clientHeight || gl.canvas.height : 100;\n    var dimensions = viewport;\n    var pixelRatio = (0, _core.cssToDeviceRatio)(gl);\n    return [\n        dimensions.x * pixelRatio,\n        (height - dimensions.y - dimensions.height) * pixelRatio,\n        dimensions.width * pixelRatio,\n        dimensions.height * pixelRatio\n    ];\n}\nfunction clearGLCanvas(gl) {\n    var width = gl.drawingBufferWidth;\n    var height = gl.drawingBufferHeight;\n    (0, _core.setParameters)(gl, {\n        viewport: [\n            0,\n            0,\n            width,\n            height\n        ]\n    });\n    gl.clear(16640);\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./pass\":\"2TNzZ\",\"@luma.gl/core\":\"WBJLR\",\"../utils/log\":\"1biSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2TNzZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Pass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar Pass = function() {\n    function Pass1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Pass1);\n        var _props$id = props.id, id = _props$id === void 0 ? \"pass\" : _props$id;\n        this.id = id;\n        this.gl = gl;\n        this.props = {};\n        Object.assign(this.props, props);\n    }\n    (0, _createClassDefault.default)(Pass1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                Object.assign(this.props, props);\n            }\n        },\n        {\n            key: \"render\",\n            value: function render() {}\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {}\n        }\n    ]);\n    return Pass1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j2Let\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"PointLight\", ()=>PointLight);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _projectFunctions = require(\"../../shaderlib/project/project-functions\");\nvar _lib = require(\"../../lib\");\nvar DEFAULT_LIGHT_COLOR = [\n    255,\n    255,\n    255\n];\nvar DEFAULT_LIGHT_INTENSITY = 1.0;\nvar DEFAULT_ATTENUATION = [\n    0,\n    0,\n    1\n];\nvar DEFAULT_LIGHT_POSITION = [\n    0.0,\n    0.0,\n    1.0\n];\nvar idCount = 0;\nvar PointLight = function() {\n    function PointLight1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, PointLight1);\n        var _props$color = props.color, color = _props$color === void 0 ? DEFAULT_LIGHT_COLOR : _props$color;\n        var _props$intensity = props.intensity, intensity = _props$intensity === void 0 ? DEFAULT_LIGHT_INTENSITY : _props$intensity;\n        var _props$position = props.position, position = _props$position === void 0 ? DEFAULT_LIGHT_POSITION : _props$position;\n        this.id = props.id || \"point-\".concat(idCount++);\n        this.color = color;\n        this.intensity = intensity;\n        this.type = \"point\";\n        this.position = position;\n        this.attenuation = getAttenuation(props);\n        this.projectedLight = Object.assign({}, this);\n    }\n    (0, _createClassDefault.default)(PointLight1, [\n        {\n            key: \"getProjectedLight\",\n            value: function getProjectedLight(_ref) {\n                var layer = _ref.layer;\n                var projectedLight = this.projectedLight;\n                var viewport = layer.context.viewport;\n                var _layer$props = layer.props, coordinateSystem = _layer$props.coordinateSystem, coordinateOrigin = _layer$props.coordinateOrigin;\n                var position = (0, _projectFunctions.projectPosition)(this.position, {\n                    viewport: viewport,\n                    coordinateSystem: coordinateSystem,\n                    coordinateOrigin: coordinateOrigin,\n                    fromCoordinateSystem: viewport.isGeospatial ? (0, _lib.COORDINATE_SYSTEM).LNGLAT : (0, _lib.COORDINATE_SYSTEM).CARTESIAN,\n                    fromCoordinateOrigin: [\n                        0,\n                        0,\n                        0\n                    ]\n                });\n                projectedLight.color = this.color;\n                projectedLight.intensity = this.intensity;\n                projectedLight.position = position;\n                return projectedLight;\n            }\n        }\n    ]);\n    return PointLight1;\n}();\nfunction getAttenuation(props) {\n    if (\"attenuation\" in props) return props.attenuation;\n    if (\"intensity\" in props) return [\n        0,\n        0,\n        props.intensity\n    ];\n    return DEFAULT_ATTENUATION;\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../../shaderlib/project/project-functions\":\"l4E6R\",\"../../lib\":\"3Lr0q\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l4E6R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getWorldPosition\", ()=>getWorldPosition);\nparcelHelpers.export(exports, \"projectPosition\", ()=>projectPosition);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _constants = require(\"../../lib/constants\");\nvar _viewportUniforms = require(\"./viewport-uniforms\");\nvar _webMercatorViewport = require(\"../../viewports/web-mercator-viewport\");\nvar _webMercatorViewportDefault = parcelHelpers.interopDefault(_webMercatorViewport);\nvar _vec4 = require(\"gl-matrix/vec4\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _webMercator = require(\"@math.gl/web-mercator\");\nfunction lngLatZToWorldPosition(lngLatZ, viewport) {\n    var offsetMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n    var p = viewport.projectPosition(lngLatZ);\n    if (offsetMode && viewport instanceof (0, _webMercatorViewportDefault.default)) {\n        var _lngLatZ = (0, _slicedToArrayDefault.default)(lngLatZ, 3), longitude = _lngLatZ[0], latitude = _lngLatZ[1], _lngLatZ$ = _lngLatZ[2], z = _lngLatZ$ === void 0 ? 0 : _lngLatZ$;\n        var distanceScales = viewport.getDistanceScales([\n            longitude,\n            latitude\n        ]);\n        p[2] = z * distanceScales.unitsPerMeter[2];\n    }\n    return p;\n}\nfunction normalizeParameters(opts) {\n    var normalizedParams = Object.assign({}, opts);\n    var coordinateSystem = opts.coordinateSystem;\n    var viewport = opts.viewport, coordinateOrigin = opts.coordinateOrigin, fromCoordinateSystem = opts.fromCoordinateSystem, fromCoordinateOrigin = opts.fromCoordinateOrigin;\n    if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).DEFAULT) coordinateSystem = viewport.isGeospatial ? (0, _constants.COORDINATE_SYSTEM).LNGLAT : (0, _constants.COORDINATE_SYSTEM).CARTESIAN;\n    if (fromCoordinateSystem === undefined) normalizedParams.fromCoordinateSystem = coordinateSystem;\n    if (fromCoordinateOrigin === undefined) normalizedParams.fromCoordinateOrigin = coordinateOrigin;\n    normalizedParams.coordinateSystem = coordinateSystem;\n    return normalizedParams;\n}\nfunction getWorldPosition(position, _ref) {\n    var viewport = _ref.viewport, modelMatrix = _ref.modelMatrix, coordinateSystem = _ref.coordinateSystem, coordinateOrigin = _ref.coordinateOrigin, offsetMode = _ref.offsetMode;\n    var _position = (0, _slicedToArrayDefault.default)(position, 3), x = _position[0], y = _position[1], _position$ = _position[2], z = _position$ === void 0 ? 0 : _position$;\n    if (modelMatrix) {\n        var _vec4$transformMat = _vec4.transformMat4([], [\n            x,\n            y,\n            z,\n            1.0\n        ], modelMatrix);\n        var _vec4$transformMat2 = (0, _slicedToArrayDefault.default)(_vec4$transformMat, 3);\n        x = _vec4$transformMat2[0];\n        y = _vec4$transformMat2[1];\n        z = _vec4$transformMat2[2];\n    }\n    switch(coordinateSystem){\n        case (0, _constants.COORDINATE_SYSTEM).LNGLAT:\n            return lngLatZToWorldPosition([\n                x,\n                y,\n                z\n            ], viewport, offsetMode);\n        case (0, _constants.COORDINATE_SYSTEM).LNGLAT_OFFSETS:\n            return lngLatZToWorldPosition([\n                x + coordinateOrigin[0],\n                y + coordinateOrigin[1],\n                z + (coordinateOrigin[2] || 0)\n            ], viewport, offsetMode);\n        case (0, _constants.COORDINATE_SYSTEM).METER_OFFSETS:\n            return lngLatZToWorldPosition((0, _webMercator.addMetersToLngLat)(coordinateOrigin, [\n                x,\n                y,\n                z\n            ]), viewport, offsetMode);\n        case (0, _constants.COORDINATE_SYSTEM).CARTESIAN:\n        default:\n            return viewport.isGeospatial ? [\n                x + coordinateOrigin[0],\n                y + coordinateOrigin[1],\n                z + coordinateOrigin[2]\n            ] : viewport.projectPosition([\n                x,\n                y,\n                z\n            ]);\n    }\n}\nfunction projectPosition(position, params) {\n    var _normalizeParameters = normalizeParameters(params), viewport = _normalizeParameters.viewport, coordinateSystem = _normalizeParameters.coordinateSystem, coordinateOrigin = _normalizeParameters.coordinateOrigin, modelMatrix = _normalizeParameters.modelMatrix, fromCoordinateSystem = _normalizeParameters.fromCoordinateSystem, fromCoordinateOrigin = _normalizeParameters.fromCoordinateOrigin;\n    var _getOffsetOrigin = (0, _viewportUniforms.getOffsetOrigin)(viewport, coordinateSystem, coordinateOrigin), geospatialOrigin = _getOffsetOrigin.geospatialOrigin, shaderCoordinateOrigin = _getOffsetOrigin.shaderCoordinateOrigin, offsetMode = _getOffsetOrigin.offsetMode;\n    var worldPosition = getWorldPosition(position, {\n        viewport: viewport,\n        modelMatrix: modelMatrix,\n        coordinateSystem: fromCoordinateSystem,\n        coordinateOrigin: fromCoordinateOrigin,\n        offsetMode: offsetMode\n    });\n    if (offsetMode) {\n        var positionCommonSpace = viewport.projectPosition(geospatialOrigin || shaderCoordinateOrigin);\n        _vec3.sub(worldPosition, worldPosition, positionCommonSpace);\n    }\n    return worldPosition;\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"../../lib/constants\":\"inuJE\",\"./viewport-uniforms\":\"kLfPQ\",\"../../viewports/web-mercator-viewport\":\"liiGr\",\"gl-matrix/vec4\":\"9M1lU\",\"gl-matrix/vec3\":\"4RBb8\",\"@math.gl/web-mercator\":\"agpg6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"liiGr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>WebMercatorViewport);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _viewport = require(\"./viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _mathGl = require(\"math.gl\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar WebMercatorViewport = function(_Viewport) {\n    (0, _inheritsDefault.default)(WebMercatorViewport1, _Viewport);\n    var _super = _createSuper(WebMercatorViewport1);\n    function WebMercatorViewport1() {\n        var _this;\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, WebMercatorViewport1);\n        var _opts$latitude = opts.latitude, latitude = _opts$latitude === void 0 ? 0 : _opts$latitude, _opts$longitude = opts.longitude, longitude = _opts$longitude === void 0 ? 0 : _opts$longitude, _opts$zoom = opts.zoom, zoom = _opts$zoom === void 0 ? 11 : _opts$zoom, _opts$pitch = opts.pitch, pitch = _opts$pitch === void 0 ? 0 : _opts$pitch, _opts$bearing = opts.bearing, bearing = _opts$bearing === void 0 ? 0 : _opts$bearing, _opts$nearZMultiplier = opts.nearZMultiplier, nearZMultiplier = _opts$nearZMultiplier === void 0 ? 0.1 : _opts$nearZMultiplier, _opts$farZMultiplier = opts.farZMultiplier, farZMultiplier = _opts$farZMultiplier === void 0 ? 1.01 : _opts$farZMultiplier, _opts$orthographic = opts.orthographic, orthographic = _opts$orthographic === void 0 ? false : _opts$orthographic, _opts$repeat = opts.repeat, repeat = _opts$repeat === void 0 ? false : _opts$repeat, _opts$worldOffset = opts.worldOffset, worldOffset = _opts$worldOffset === void 0 ? 0 : _opts$worldOffset;\n        var width = opts.width, height = opts.height, _opts$altitude = opts.altitude, altitude = _opts$altitude === void 0 ? 1.5 : _opts$altitude;\n        var scale = Math.pow(2, zoom);\n        width = width || 1;\n        height = height || 1;\n        altitude = Math.max(0.75, altitude);\n        var _getProjectionParamet = (0, _webMercator.getProjectionParameters)({\n            width: width,\n            height: height,\n            pitch: pitch,\n            altitude: altitude,\n            nearZMultiplier: nearZMultiplier,\n            farZMultiplier: farZMultiplier\n        }), fov = _getProjectionParamet.fov, aspect = _getProjectionParamet.aspect, focalDistance = _getProjectionParamet.focalDistance, near = _getProjectionParamet.near, far = _getProjectionParamet.far;\n        var viewMatrixUncentered = (0, _webMercator.getViewMatrix)({\n            height: height,\n            pitch: pitch,\n            bearing: bearing,\n            scale: scale,\n            altitude: altitude\n        });\n        if (worldOffset) {\n            var viewOffset = new (0, _mathGl.Matrix4)().translate([\n                512 * worldOffset,\n                0,\n                0\n            ]);\n            viewMatrixUncentered = viewOffset.multiplyLeft(viewMatrixUncentered);\n        }\n        var viewportOpts = Object.assign({}, opts, {\n            width: width,\n            height: height,\n            viewMatrix: viewMatrixUncentered,\n            longitude: longitude,\n            latitude: latitude,\n            zoom: zoom,\n            orthographic: orthographic,\n            fovyRadians: fov,\n            aspect: aspect,\n            focalDistance: orthographic ? focalDistance : 1,\n            near: near,\n            far: far\n        });\n        _this = _super.call(this, viewportOpts);\n        _this.latitude = latitude;\n        _this.longitude = longitude;\n        _this.zoom = zoom;\n        _this.pitch = pitch;\n        _this.bearing = bearing;\n        _this.altitude = altitude;\n        _this.orthographic = orthographic;\n        _this._subViewports = repeat ? [] : null;\n        Object.freeze((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(WebMercatorViewport1, [\n        {\n            key: \"addMetersToLngLat\",\n            value: function addMetersToLngLat(lngLatZ, xyz) {\n                return (0, _webMercator.addMetersToLngLat)(lngLatZ, xyz);\n            }\n        },\n        {\n            key: \"getMapCenterByLngLatPosition\",\n            value: function getMapCenterByLngLatPosition(_ref) {\n                var lngLat = _ref.lngLat, pos = _ref.pos;\n                var fromLocation = (0, _webMercator.pixelsToWorld)(pos, this.pixelUnprojectionMatrix);\n                var toLocation = this.projectFlat(lngLat);\n                var translate = _vec2.add([], toLocation, _vec2.negate([], fromLocation));\n                var newCenter = _vec2.add([], this.center, translate);\n                return this.unprojectFlat(newCenter);\n            }\n        },\n        {\n            key: \"getBounds\",\n            value: function getBounds() {\n                var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var corners = (0, _webMercator.getBounds)(this, options.z || 0);\n                return [\n                    Math.min(corners[0][0], corners[1][0], corners[2][0], corners[3][0]),\n                    Math.min(corners[0][1], corners[1][1], corners[2][1], corners[3][1]),\n                    Math.max(corners[0][0], corners[1][0], corners[2][0], corners[3][0]),\n                    Math.max(corners[0][1], corners[1][1], corners[2][1], corners[3][1])\n                ];\n            }\n        },\n        {\n            key: \"fitBounds\",\n            value: function fitBounds(bounds) {\n                var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                var width = this.width, height = this.height;\n                var _fitBounds2 = (0, _webMercator.fitBounds)(Object.assign({\n                    width: width,\n                    height: height,\n                    bounds: bounds\n                }, options)), longitude = _fitBounds2.longitude, latitude = _fitBounds2.latitude, zoom = _fitBounds2.zoom;\n                return new WebMercatorViewport1({\n                    width: width,\n                    height: height,\n                    longitude: longitude,\n                    latitude: latitude,\n                    zoom: zoom\n                });\n            }\n        },\n        {\n            key: \"subViewports\",\n            get: function get() {\n                if (this._subViewports && !this._subViewports.length) {\n                    var bounds = this.getBounds();\n                    var minOffset = Math.floor((bounds[0] + 180) / 360);\n                    var maxOffset = Math.ceil((bounds[2] - 180) / 360);\n                    for(var x = minOffset; x <= maxOffset; x++){\n                        var offsetViewport = x ? new WebMercatorViewport1(_objectSpread(_objectSpread({}, this), {}, {\n                            worldOffset: x\n                        })) : this;\n                        this._subViewports.push(offsetViewport);\n                    }\n                }\n                return this._subViewports;\n            }\n        }\n    ]);\n    return WebMercatorViewport1;\n}((0, _viewportDefault.default));\nWebMercatorViewport.displayName = \"WebMercatorViewport\";\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"4pJ2A\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./viewport\":\"iilpM\",\"@math.gl/web-mercator\":\"agpg6\",\"gl-matrix/vec2\":\"29QfU\",\"math.gl\":\"huJnq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iilpM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Viewport);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _mathUtils = require(\"../utils/math-utils\");\nvar _mathGl = require(\"math.gl\");\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _constants = require(\"../lib/constants\");\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nvar IDENTITY = (0, _mathUtils.createMat4)();\nvar ZERO_VECTOR = [\n    0,\n    0,\n    0\n];\nvar DEFAULT_ZOOM = 0;\nvar DEFAULT_DISTANCE_SCALES = {\n    unitsPerMeter: [\n        1,\n        1,\n        1\n    ],\n    metersPerUnit: [\n        1,\n        1,\n        1\n    ]\n};\nvar Viewport = function() {\n    function Viewport1() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, Viewport1);\n        var _opts$id = opts.id, id = _opts$id === void 0 ? null : _opts$id, _opts$x = opts.x, x = _opts$x === void 0 ? 0 : _opts$x, _opts$y = opts.y, y = _opts$y === void 0 ? 0 : _opts$y, _opts$width = opts.width, width = _opts$width === void 0 ? 1 : _opts$width, _opts$height = opts.height, height = _opts$height === void 0 ? 1 : _opts$height;\n        this.id = id || this.constructor.displayName || \"viewport\";\n        this.x = x;\n        this.y = y;\n        this.width = width || 1;\n        this.height = height || 1;\n        this._frustumPlanes = {};\n        this._initViewMatrix(opts);\n        this._initProjectionMatrix(opts);\n        this._initPixelMatrices();\n        this.equals = this.equals.bind(this);\n        this.project = this.project.bind(this);\n        this.unproject = this.unproject.bind(this);\n        this.projectPosition = this.projectPosition.bind(this);\n        this.unprojectPosition = this.unprojectPosition.bind(this);\n        this.projectFlat = this.projectFlat.bind(this);\n        this.unprojectFlat = this.unprojectFlat.bind(this);\n    }\n    (0, _createClassDefault.default)(Viewport1, [\n        {\n            key: \"equals\",\n            value: function equals(viewport) {\n                if (!(viewport instanceof Viewport1)) return false;\n                if (this === viewport) return true;\n                return viewport.width === this.width && viewport.height === this.height && viewport.scale === this.scale && (0, _mathGl.equals)(viewport.projectionMatrix, this.projectionMatrix) && (0, _mathGl.equals)(viewport.viewMatrix, this.viewMatrix);\n            }\n        },\n        {\n            key: \"project\",\n            value: function project(xyz) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$topLeft = _ref.topLeft, topLeft = _ref$topLeft === void 0 ? true : _ref$topLeft;\n                var worldPosition = this.projectPosition(xyz);\n                var coord = (0, _webMercator.worldToPixels)(worldPosition, this.pixelProjectionMatrix);\n                var _coord = (0, _slicedToArrayDefault.default)(coord, 2), x = _coord[0], y = _coord[1];\n                var y2 = topLeft ? y : this.height - y;\n                return xyz.length === 2 ? [\n                    x,\n                    y2\n                ] : [\n                    x,\n                    y2,\n                    coord[2]\n                ];\n            }\n        },\n        {\n            key: \"unproject\",\n            value: function unproject(xyz) {\n                var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$topLeft = _ref2.topLeft, topLeft = _ref2$topLeft === void 0 ? true : _ref2$topLeft, targetZ = _ref2.targetZ;\n                var _xyz = (0, _slicedToArrayDefault.default)(xyz, 3), x = _xyz[0], y = _xyz[1], z = _xyz[2];\n                var y2 = topLeft ? y : this.height - y;\n                var targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n                var coord = (0, _webMercator.pixelsToWorld)([\n                    x,\n                    y2,\n                    z\n                ], this.pixelUnprojectionMatrix, targetZWorld);\n                var _this$unprojectPositi = this.unprojectPosition(coord), _this$unprojectPositi2 = (0, _slicedToArrayDefault.default)(_this$unprojectPositi, 3), X = _this$unprojectPositi2[0], Y = _this$unprojectPositi2[1], Z = _this$unprojectPositi2[2];\n                if (Number.isFinite(z)) return [\n                    X,\n                    Y,\n                    Z\n                ];\n                return Number.isFinite(targetZ) ? [\n                    X,\n                    Y,\n                    targetZ\n                ] : [\n                    X,\n                    Y\n                ];\n            }\n        },\n        {\n            key: \"projectPosition\",\n            value: function projectPosition(xyz) {\n                var _this$projectFlat = this.projectFlat(xyz), _this$projectFlat2 = (0, _slicedToArrayDefault.default)(_this$projectFlat, 2), X = _this$projectFlat2[0], Y = _this$projectFlat2[1];\n                var Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n                return [\n                    X,\n                    Y,\n                    Z\n                ];\n            }\n        },\n        {\n            key: \"unprojectPosition\",\n            value: function unprojectPosition(xyz) {\n                var _this$unprojectFlat = this.unprojectFlat(xyz), _this$unprojectFlat2 = (0, _slicedToArrayDefault.default)(_this$unprojectFlat, 2), X = _this$unprojectFlat2[0], Y = _this$unprojectFlat2[1];\n                var Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n                return [\n                    X,\n                    Y,\n                    Z\n                ];\n            }\n        },\n        {\n            key: \"projectFlat\",\n            value: function projectFlat(xyz) {\n                if (this.isGeospatial) return (0, _webMercator.lngLatToWorld)(xyz);\n                return xyz;\n            }\n        },\n        {\n            key: \"unprojectFlat\",\n            value: function unprojectFlat(xyz) {\n                if (this.isGeospatial) return (0, _webMercator.worldToLngLat)(xyz);\n                return xyz;\n            }\n        },\n        {\n            key: \"getBounds\",\n            value: function getBounds() {\n                var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var unprojectOption = {\n                    targetZ: options.z || 0\n                };\n                var topLeft = this.unproject([\n                    0,\n                    0\n                ], unprojectOption);\n                var topRight = this.unproject([\n                    this.width,\n                    0\n                ], unprojectOption);\n                var bottomLeft = this.unproject([\n                    0,\n                    this.height\n                ], unprojectOption);\n                var bottomRight = this.unproject([\n                    this.width,\n                    this.height\n                ], unprojectOption);\n                return [\n                    Math.min(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),\n                    Math.min(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]),\n                    Math.max(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),\n                    Math.max(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1])\n                ];\n            }\n        },\n        {\n            key: \"getDistanceScales\",\n            value: function getDistanceScales() {\n                var coordinateOrigin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                if (coordinateOrigin) return (0, _webMercator.getDistanceScales)({\n                    longitude: coordinateOrigin[0],\n                    latitude: coordinateOrigin[1],\n                    highPrecision: true\n                });\n                return this.distanceScales;\n            }\n        },\n        {\n            key: \"containsPixel\",\n            value: function containsPixel(_ref3) {\n                var x = _ref3.x, y = _ref3.y, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? 1 : _ref3$width, _ref3$height = _ref3.height, height = _ref3$height === void 0 ? 1 : _ref3$height;\n                return x < this.x + this.width && this.x < x + width && y < this.y + this.height && this.y < y + height;\n            }\n        },\n        {\n            key: \"getFrustumPlanes\",\n            value: function getFrustumPlanes() {\n                if (this._frustumPlanes.near) return this._frustumPlanes;\n                var _this$projectionProps = this.projectionProps, near = _this$projectionProps.near, far = _this$projectionProps.far, fovyRadians = _this$projectionProps.fovyRadians, aspect = _this$projectionProps.aspect;\n                Object.assign(this._frustumPlanes, (0, _mathUtils.getFrustumPlanes)({\n                    aspect: aspect,\n                    near: near,\n                    far: far,\n                    fovyRadians: fovyRadians,\n                    position: this.cameraPosition,\n                    direction: this.cameraDirection,\n                    up: this.cameraUp,\n                    right: this.cameraRight\n                }));\n                return this._frustumPlanes;\n            }\n        },\n        {\n            key: \"getCameraPosition\",\n            value: function getCameraPosition() {\n                return this.cameraPosition;\n            }\n        },\n        {\n            key: \"getCameraDirection\",\n            value: function getCameraDirection() {\n                return this.cameraDirection;\n            }\n        },\n        {\n            key: \"getCameraUp\",\n            value: function getCameraUp() {\n                return this.cameraUp;\n            }\n        },\n        {\n            key: \"_createProjectionMatrix\",\n            value: function _createProjectionMatrix(_ref4) {\n                var orthographic = _ref4.orthographic, fovyRadians = _ref4.fovyRadians, aspect = _ref4.aspect, focalDistance = _ref4.focalDistance, near = _ref4.near, far = _ref4.far;\n                return orthographic ? new (0, _mathGl.Matrix4)().orthographic({\n                    fovy: fovyRadians,\n                    aspect: aspect,\n                    focalDistance: focalDistance,\n                    near: near,\n                    far: far\n                }) : new (0, _mathGl.Matrix4)().perspective({\n                    fovy: fovyRadians,\n                    aspect: aspect,\n                    near: near,\n                    far: far\n                });\n            }\n        },\n        {\n            key: \"_initViewMatrix\",\n            value: function _initViewMatrix(opts) {\n                var _opts$viewMatrix = opts.viewMatrix, viewMatrix = _opts$viewMatrix === void 0 ? IDENTITY : _opts$viewMatrix, _opts$longitude = opts.longitude, longitude = _opts$longitude === void 0 ? null : _opts$longitude, _opts$latitude = opts.latitude, latitude = _opts$latitude === void 0 ? null : _opts$latitude, _opts$zoom = opts.zoom, zoom = _opts$zoom === void 0 ? null : _opts$zoom, _opts$position = opts.position, position = _opts$position === void 0 ? null : _opts$position, _opts$modelMatrix = opts.modelMatrix, modelMatrix = _opts$modelMatrix === void 0 ? null : _opts$modelMatrix, _opts$focalDistance = opts.focalDistance, focalDistance = _opts$focalDistance === void 0 ? 1 : _opts$focalDistance, _opts$distanceScales = opts.distanceScales, distanceScales = _opts$distanceScales === void 0 ? null : _opts$distanceScales;\n                this.isGeospatial = Number.isFinite(latitude) && Number.isFinite(longitude);\n                this.zoom = zoom;\n                if (!Number.isFinite(this.zoom)) this.zoom = this.isGeospatial ? (0, _webMercator.getMeterZoom)({\n                    latitude: latitude\n                }) + Math.log2(focalDistance) : DEFAULT_ZOOM;\n                var scale = Math.pow(2, this.zoom);\n                this.scale = scale;\n                this.distanceScales = this.isGeospatial ? (0, _webMercator.getDistanceScales)({\n                    latitude: latitude,\n                    longitude: longitude\n                }) : distanceScales || DEFAULT_DISTANCE_SCALES;\n                this.focalDistance = focalDistance;\n                this.distanceScales.metersPerUnit = new (0, _mathGl.Vector3)(this.distanceScales.metersPerUnit);\n                this.distanceScales.unitsPerMeter = new (0, _mathGl.Vector3)(this.distanceScales.unitsPerMeter);\n                this.position = ZERO_VECTOR;\n                this.meterOffset = ZERO_VECTOR;\n                if (position) {\n                    this.position = position;\n                    this.modelMatrix = modelMatrix;\n                    this.meterOffset = modelMatrix ? modelMatrix.transformVector(position) : position;\n                }\n                if (this.isGeospatial) {\n                    this.longitude = longitude;\n                    this.latitude = latitude;\n                    this.center = this._getCenterInWorld({\n                        longitude: longitude,\n                        latitude: latitude\n                    });\n                } else this.center = position ? this.projectPosition(position) : [\n                    0,\n                    0,\n                    0\n                ];\n                this.viewMatrixUncentered = viewMatrix;\n                this.viewMatrix = new (0, _mathGl.Matrix4)().multiplyRight(this.viewMatrixUncentered).translate(new (0, _mathGl.Vector3)(this.center || ZERO_VECTOR).negate());\n            }\n        },\n        {\n            key: \"_getCenterInWorld\",\n            value: function _getCenterInWorld(_ref5) {\n                var longitude = _ref5.longitude, latitude = _ref5.latitude;\n                var meterOffset = this.meterOffset, distanceScales = this.distanceScales;\n                var center = new (0, _mathGl.Vector3)(this.projectPosition([\n                    longitude,\n                    latitude,\n                    0\n                ]));\n                if (meterOffset) {\n                    var commonPosition = new (0, _mathGl.Vector3)(meterOffset).scale(distanceScales.unitsPerMeter);\n                    center.add(commonPosition);\n                }\n                return center;\n            }\n        },\n        {\n            key: \"_initProjectionMatrix\",\n            value: function _initProjectionMatrix(opts) {\n                var _opts$projectionMatri = opts.projectionMatrix, projectionMatrix = _opts$projectionMatri === void 0 ? null : _opts$projectionMatri, _opts$orthographic = opts.orthographic, orthographic = _opts$orthographic === void 0 ? false : _opts$orthographic, fovyRadians = opts.fovyRadians, _opts$fovy = opts.fovy, fovy = _opts$fovy === void 0 ? 75 : _opts$fovy, _opts$near = opts.near, near = _opts$near === void 0 ? 0.1 : _opts$near, _opts$far = opts.far, far = _opts$far === void 0 ? 1000 : _opts$far, _opts$focalDistance2 = opts.focalDistance, focalDistance = _opts$focalDistance2 === void 0 ? 1 : _opts$focalDistance2;\n                this.projectionProps = {\n                    orthographic: orthographic,\n                    fovyRadians: fovyRadians || fovy * DEGREES_TO_RADIANS,\n                    aspect: this.width / this.height,\n                    focalDistance: focalDistance,\n                    near: near,\n                    far: far\n                };\n                this.projectionMatrix = projectionMatrix || this._createProjectionMatrix(this.projectionProps);\n            }\n        },\n        {\n            key: \"_initPixelMatrices\",\n            value: function _initPixelMatrices() {\n                var vpm = (0, _mathUtils.createMat4)();\n                _mat4.multiply(vpm, vpm, this.projectionMatrix);\n                _mat4.multiply(vpm, vpm, this.viewMatrix);\n                this.viewProjectionMatrix = vpm;\n                this.viewMatrixInverse = _mat4.invert([], this.viewMatrix) || this.viewMatrix;\n                var _extractCameraVectors = (0, _mathUtils.extractCameraVectors)({\n                    viewMatrix: this.viewMatrix,\n                    viewMatrixInverse: this.viewMatrixInverse\n                }), eye = _extractCameraVectors.eye, direction = _extractCameraVectors.direction, up = _extractCameraVectors.up, right = _extractCameraVectors.right;\n                this.cameraPosition = eye;\n                this.cameraDirection = direction;\n                this.cameraUp = up;\n                this.cameraRight = right;\n                var viewportMatrix = (0, _mathUtils.createMat4)();\n                var pixelProjectionMatrix = (0, _mathUtils.createMat4)();\n                _mat4.scale(viewportMatrix, viewportMatrix, [\n                    this.width / 2,\n                    -this.height / 2,\n                    1\n                ]);\n                _mat4.translate(viewportMatrix, viewportMatrix, [\n                    1,\n                    -1,\n                    0\n                ]);\n                _mat4.multiply(pixelProjectionMatrix, viewportMatrix, this.viewProjectionMatrix);\n                this.pixelProjectionMatrix = pixelProjectionMatrix;\n                this.viewportMatrix = viewportMatrix;\n                this.pixelUnprojectionMatrix = _mat4.invert((0, _mathUtils.createMat4)(), this.pixelProjectionMatrix);\n                if (!this.pixelUnprojectionMatrix) (0, _logDefault.default).warn(\"Pixel project matrix not invertible\")();\n            }\n        },\n        {\n            key: \"metersPerPixel\",\n            get: function get() {\n                return this.distanceScales.metersPerUnit[2] / this.scale;\n            }\n        },\n        {\n            key: \"projectionMode\",\n            get: function get() {\n                if (this.isGeospatial) return this.zoom < 12 ? (0, _constants.PROJECTION_MODE).WEB_MERCATOR : (0, _constants.PROJECTION_MODE).WEB_MERCATOR_AUTO_OFFSET;\n                return (0, _constants.PROJECTION_MODE).IDENTITY;\n            }\n        }\n    ]);\n    return Viewport1;\n}();\nViewport.displayName = \"Viewport\";\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../utils/log\":\"1biSe\",\"../utils/math-utils\":\"jzrEb\",\"math.gl\":\"huJnq\",\"gl-matrix/mat4\":\"aI9zp\",\"@math.gl/web-mercator\":\"agpg6\",\"../lib/constants\":\"inuJE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jzrEb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createMat4\", ()=>createMat4);\nparcelHelpers.export(exports, \"mod\", ()=>mod);\nparcelHelpers.export(exports, \"extractCameraVectors\", ()=>extractCameraVectors);\nparcelHelpers.export(exports, \"getFrustumPlanes\", ()=>getFrustumPlanes);\nparcelHelpers.export(exports, \"fp64LowPart\", ()=>fp64LowPart);\nparcelHelpers.export(exports, \"toDoublePrecisionArray\", ()=>toDoublePrecisionArray);\nvar _typedArrayManager = require(\"./typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _mathGl = require(\"math.gl\");\nfunction createMat4() {\n    return [\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1\n    ];\n}\nfunction mod(value, divisor) {\n    var modulus = value % divisor;\n    return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction extractCameraVectors(_ref) {\n    var viewMatrix = _ref.viewMatrix, viewMatrixInverse = _ref.viewMatrixInverse;\n    return {\n        eye: [\n            viewMatrixInverse[12],\n            viewMatrixInverse[13],\n            viewMatrixInverse[14]\n        ],\n        direction: [\n            -viewMatrix[2],\n            -viewMatrix[6],\n            -viewMatrix[10]\n        ],\n        up: [\n            viewMatrix[1],\n            viewMatrix[5],\n            viewMatrix[9]\n        ],\n        right: [\n            viewMatrix[0],\n            viewMatrix[4],\n            viewMatrix[8]\n        ]\n    };\n}\nvar cameraPosition = new (0, _mathGl.Vector3)();\nvar cameraDirection = new (0, _mathGl.Vector3)();\nvar cameraUp = new (0, _mathGl.Vector3)();\nvar cameraRight = new (0, _mathGl.Vector3)();\nvar nearCenter = new (0, _mathGl.Vector3)();\nvar farCenter = new (0, _mathGl.Vector3)();\nvar a = new (0, _mathGl.Vector3)();\nfunction getFrustumPlanes(_ref2) {\n    var aspect = _ref2.aspect, near = _ref2.near, far = _ref2.far, fovyRadians = _ref2.fovyRadians, position = _ref2.position, direction = _ref2.direction, up = _ref2.up, right = _ref2.right;\n    cameraDirection.copy(direction);\n    var nearFarScale = 1 / cameraDirection.len();\n    cameraDirection.normalize();\n    cameraPosition.copy(position);\n    cameraUp.copy(up);\n    var widthScale = 1 / cameraUp.len();\n    cameraUp.normalize();\n    cameraRight.copy(right).normalize();\n    var nearHeight = 2 * Math.tan(fovyRadians / 2) * near * widthScale;\n    var nearWidth = nearHeight * aspect;\n    nearCenter.copy(cameraDirection).scale(near * nearFarScale).add(cameraPosition);\n    farCenter.copy(cameraDirection).scale(far * nearFarScale).add(cameraPosition);\n    var normal = cameraDirection.clone().negate();\n    var distance = normal.dot(nearCenter);\n    var planes = {\n        near: {\n            distance: distance,\n            normal: normal\n        },\n        far: {\n            distance: cameraDirection.dot(farCenter),\n            normal: cameraDirection.clone()\n        }\n    };\n    a.copy(cameraRight).scale(nearWidth * 0.5).add(nearCenter).subtract(cameraPosition).normalize();\n    normal = new (0, _mathGl.Vector3)(a).cross(cameraUp);\n    distance = cameraPosition.dot(normal);\n    planes.right = {\n        normal: normal,\n        distance: distance\n    };\n    a.copy(cameraRight).scale(-nearWidth * 0.5).add(nearCenter).subtract(cameraPosition).normalize();\n    normal = new (0, _mathGl.Vector3)(cameraUp).cross(a);\n    distance = cameraPosition.dot(normal);\n    planes.left = {\n        normal: normal,\n        distance: distance\n    };\n    a.copy(cameraUp).scale(nearHeight * 0.5).add(nearCenter).subtract(cameraPosition).normalize();\n    normal = new (0, _mathGl.Vector3)(cameraRight).cross(a);\n    distance = cameraPosition.dot(normal);\n    planes.top = {\n        normal: normal,\n        distance: distance\n    };\n    a.copy(cameraUp).scale(-nearHeight * 0.5).add(nearCenter).subtract(cameraPosition).normalize();\n    normal = new (0, _mathGl.Vector3)(a).cross(cameraRight);\n    distance = cameraPosition.dot(normal);\n    planes.bottom = {\n        normal: normal,\n        distance: distance\n    };\n    return planes;\n}\nfunction fp64LowPart(x) {\n    return x - Math.fround(x);\n}\nvar scratchArray;\nfunction toDoublePrecisionArray(typedArray, _ref3) {\n    var _ref3$size = _ref3.size, size = _ref3$size === void 0 ? 1 : _ref3$size, _ref3$startIndex = _ref3.startIndex, startIndex = _ref3$startIndex === void 0 ? 0 : _ref3$startIndex, endIndex = _ref3.endIndex;\n    if (!Number.isFinite(endIndex)) endIndex = typedArray.length;\n    var count = (endIndex - startIndex) / size;\n    scratchArray = (0, _typedArrayManagerDefault.default).allocate(scratchArray, count, {\n        type: Float32Array,\n        size: size * 2\n    });\n    var sourceIndex = startIndex;\n    var targetIndex = 0;\n    while(sourceIndex < endIndex){\n        for(var j = 0; j < size; j++){\n            var value = typedArray[sourceIndex++];\n            scratchArray[targetIndex + j] = value;\n            scratchArray[targetIndex + j + size] = fp64LowPart(value);\n        }\n        targetIndex += size * 2;\n    }\n    return scratchArray.subarray(0, count * size * 2);\n}\n\n},{\"./typed-array-manager\":\"4DbDw\",\"math.gl\":\"huJnq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4DbDw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TypedArrayManager\", ()=>TypedArrayManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar TypedArrayManager = function() {\n    function TypedArrayManager1(props) {\n        (0, _classCallCheckDefault.default)(this, TypedArrayManager1);\n        this._pool = [];\n        this.props = {\n            overAlloc: 2,\n            poolSize: 100\n        };\n        this.setProps(props);\n    }\n    (0, _createClassDefault.default)(TypedArrayManager1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                Object.assign(this.props, props);\n            }\n        },\n        {\n            key: \"allocate\",\n            value: function allocate(typedArray, count, _ref) {\n                var _ref$size = _ref.size, size = _ref$size === void 0 ? 1 : _ref$size, type = _ref.type, _ref$padding = _ref.padding, padding = _ref$padding === void 0 ? 0 : _ref$padding, _ref$copy = _ref.copy, copy = _ref$copy === void 0 ? false : _ref$copy, _ref$initialize = _ref.initialize, initialize = _ref$initialize === void 0 ? false : _ref$initialize, maxCount = _ref.maxCount;\n                var Type = type || typedArray && typedArray.constructor || Float32Array;\n                var newSize = count * size + padding;\n                if (ArrayBuffer.isView(typedArray)) {\n                    if (newSize <= typedArray.length) return typedArray;\n                    if (newSize * typedArray.BYTES_PER_ELEMENT <= typedArray.buffer.byteLength) return new Type(typedArray.buffer, 0, newSize);\n                }\n                var maxSize;\n                if (maxCount) maxSize = maxCount * size + padding;\n                var newArray = this._allocate(Type, newSize, initialize, maxSize);\n                if (typedArray && copy) newArray.set(typedArray);\n                else if (!initialize) newArray.fill(0, 0, 4);\n                this._release(typedArray);\n                return newArray;\n            }\n        },\n        {\n            key: \"release\",\n            value: function release(typedArray) {\n                this._release(typedArray);\n            }\n        },\n        {\n            key: \"_allocate\",\n            value: function _allocate(Type, size, initialize, maxSize) {\n                var sizeToAllocate = Math.max(Math.ceil(size * this.props.overAlloc), 1);\n                if (sizeToAllocate > maxSize) sizeToAllocate = maxSize;\n                var pool = this._pool;\n                var byteLength = Type.BYTES_PER_ELEMENT * sizeToAllocate;\n                var i = pool.findIndex(function(b) {\n                    return b.byteLength >= byteLength;\n                });\n                if (i >= 0) {\n                    var array = new Type(pool.splice(i, 1)[0], 0, sizeToAllocate);\n                    if (initialize) array.fill(0);\n                    return array;\n                }\n                return new Type(sizeToAllocate);\n            }\n        },\n        {\n            key: \"_release\",\n            value: function _release(typedArray) {\n                if (!ArrayBuffer.isView(typedArray)) return;\n                var pool = this._pool;\n                var buffer = typedArray.buffer;\n                var byteLength = buffer.byteLength;\n                var i = pool.findIndex(function(b) {\n                    return b.byteLength >= byteLength;\n                });\n                if (i < 0) pool.push(buffer);\n                else if (i > 0 || pool.length < this.props.poolSize) pool.splice(i, 0, buffer);\n                if (pool.length > this.props.poolSize) pool.shift();\n            }\n        }\n    ]);\n    return TypedArrayManager1;\n}();\nexports.default = new TypedArrayManager();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Lr0q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"COORDINATE_SYSTEM\", ()=>(0, _constants.COORDINATE_SYSTEM));\nparcelHelpers.export(exports, \"Deck\", ()=>(0, _deckDefault.default));\nparcelHelpers.export(exports, \"DeckRenderer\", ()=>(0, _deckRendererDefault.default));\nparcelHelpers.export(exports, \"Effect\", ()=>(0, _effectDefault.default));\nparcelHelpers.export(exports, \"Layer\", ()=>(0, _layerDefault.default));\nparcelHelpers.export(exports, \"CompositeLayer\", ()=>(0, _compositeLayerDefault.default));\nparcelHelpers.export(exports, \"LayerExtension\", ()=>(0, _layerExtensionDefault.default));\nparcelHelpers.export(exports, \"AttributeManager\", ()=>(0, _attributeManagerDefault.default));\nparcelHelpers.export(exports, \"LayerManager\", ()=>(0, _layerManagerDefault.default));\nvar _constants = require(\"./constants\");\nvar _deck = require(\"./deck\");\nvar _deckDefault = parcelHelpers.interopDefault(_deck);\nvar _deckRenderer = require(\"./deck-renderer\");\nvar _deckRendererDefault = parcelHelpers.interopDefault(_deckRenderer);\nvar _effect = require(\"./effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _layer = require(\"./layer\");\nvar _layerDefault = parcelHelpers.interopDefault(_layer);\nvar _compositeLayer = require(\"./composite-layer\");\nvar _compositeLayerDefault = parcelHelpers.interopDefault(_compositeLayer);\nvar _layerExtension = require(\"./layer-extension\");\nvar _layerExtensionDefault = parcelHelpers.interopDefault(_layerExtension);\nvar _attributeManager = require(\"./attribute/attribute-manager\");\nvar _attributeManagerDefault = parcelHelpers.interopDefault(_attributeManager);\nvar _layerManager = require(\"./layer-manager\");\nvar _layerManagerDefault = parcelHelpers.interopDefault(_layerManager);\n\n},{\"./constants\":\"inuJE\",\"./deck\":\"6DD17\",\"./deck-renderer\":\"1XD0R\",\"./effect\":\"6aqmc\",\"./layer\":\"krhD2\",\"./composite-layer\":\"Eygl7\",\"./layer-extension\":\"5zSDR\",\"./attribute/attribute-manager\":\"kXI0a\",\"./layer-manager\":\"bzJiR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6DD17\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Deck);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _layerManager = require(\"./layer-manager\");\nvar _layerManagerDefault = parcelHelpers.interopDefault(_layerManager);\nvar _viewManager = require(\"./view-manager\");\nvar _viewManagerDefault = parcelHelpers.interopDefault(_viewManager);\nvar _mapView = require(\"../views/map-view\");\nvar _mapViewDefault = parcelHelpers.interopDefault(_mapView);\nvar _effectManager = require(\"./effect-manager\");\nvar _effectManagerDefault = parcelHelpers.interopDefault(_effectManager);\nvar _effect = require(\"./effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _deckRenderer = require(\"./deck-renderer\");\nvar _deckRendererDefault = parcelHelpers.interopDefault(_deckRenderer);\nvar _deckPicker = require(\"./deck-picker\");\nvar _deckPickerDefault = parcelHelpers.interopDefault(_deckPicker);\nvar _tooltip = require(\"./tooltip\");\nvar _tooltipDefault = parcelHelpers.interopDefault(_tooltip);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar _typedArrayManager = require(\"../utils/typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _init = require(\"./init\");\nvar _initDefault = parcelHelpers.interopDefault(_init);\nvar _env = require(\"probe.gl/env\");\nvar _core = require(\"@luma.gl/core\");\nvar _probeGl = require(\"probe.gl\");\nvar _mjolnirJs = require(\"mjolnir.js\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _constants = require(\"./constants\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction noop() {}\nvar getCursor = function getCursor(_ref) {\n    var isDragging = _ref.isDragging;\n    return isDragging ? \"grabbing\" : \"grab\";\n};\nfunction getPropTypes(PropTypes) {\n    return {\n        id: PropTypes.string,\n        width: PropTypes.oneOfType([\n            PropTypes.number,\n            PropTypes.string\n        ]),\n        height: PropTypes.oneOfType([\n            PropTypes.number,\n            PropTypes.string\n        ]),\n        layers: PropTypes.oneOfType([\n            PropTypes.object,\n            PropTypes.array\n        ]),\n        layerFilter: PropTypes.func,\n        views: PropTypes.oneOfType([\n            PropTypes.object,\n            PropTypes.array\n        ]),\n        viewState: PropTypes.object,\n        effects: PropTypes.arrayOf(PropTypes.instanceOf((0, _effectDefault.default))),\n        controller: PropTypes.oneOfType([\n            PropTypes.func,\n            PropTypes.bool,\n            PropTypes.object\n        ]),\n        gl: PropTypes.object,\n        glOptions: PropTypes.object,\n        parameters: PropTypes.object,\n        pickingRadius: PropTypes.number,\n        useDevicePixels: PropTypes.oneOfType([\n            PropTypes.bool,\n            PropTypes.number\n        ]),\n        touchAction: PropTypes.string,\n        onWebGLInitialized: PropTypes.func,\n        onResize: PropTypes.func,\n        onViewStateChange: PropTypes.func,\n        onBeforeRender: PropTypes.func,\n        onAfterRender: PropTypes.func,\n        onLoad: PropTypes.func,\n        onError: PropTypes.func,\n        debug: PropTypes.bool,\n        drawPickingColors: PropTypes.bool,\n        _framebuffer: PropTypes.object,\n        _animate: PropTypes.bool,\n        _pickable: PropTypes.bool,\n        _typedArrayManagerProps: PropTypes.object\n    };\n}\nvar defaultProps = {\n    id: \"deckgl-overlay\",\n    width: \"100%\",\n    height: \"100%\",\n    pickingRadius: 0,\n    layerFilter: null,\n    glOptions: {},\n    gl: null,\n    layers: [],\n    effects: [],\n    views: null,\n    controller: null,\n    useDevicePixels: true,\n    touchAction: \"none\",\n    _framebuffer: null,\n    _animate: false,\n    _pickable: true,\n    _typedArrayManagerProps: {},\n    onWebGLInitialized: noop,\n    onResize: noop,\n    onViewStateChange: noop,\n    onBeforeRender: noop,\n    onAfterRender: noop,\n    onLoad: noop,\n    onError: null,\n    _onMetrics: null,\n    getCursor: getCursor,\n    debug: false,\n    drawPickingColors: false\n};\nvar Deck = function() {\n    function Deck1(props) {\n        (0, _classCallCheckDefault.default)(this, Deck1);\n        props = Object.assign({}, defaultProps, props);\n        this.props = {};\n        this.width = 0;\n        this.height = 0;\n        this.viewManager = null;\n        this.layerManager = null;\n        this.effectManager = null;\n        this.deckRenderer = null;\n        this.deckPicker = null;\n        this._needsRedraw = true;\n        this._pickRequest = {};\n        this._lastPointerDownInfo = null;\n        this.viewState = null;\n        this.interactiveState = {\n            isDragging: false\n        };\n        this._onEvent = this._onEvent.bind(this);\n        this._onPointerDown = this._onPointerDown.bind(this);\n        this._onPointerMove = this._onPointerMove.bind(this);\n        this._pickAndCallback = this._pickAndCallback.bind(this);\n        this._onRendererInitialized = this._onRendererInitialized.bind(this);\n        this._onRenderFrame = this._onRenderFrame.bind(this);\n        this._onViewStateChange = this._onViewStateChange.bind(this);\n        this._onInteractiveStateChange = this._onInteractiveStateChange.bind(this);\n        if (props.viewState && props.initialViewState) (0, _logDefault.default).warn(\"View state tracking is disabled. Use either `initialViewState` for auto update or `viewState` for manual update.\")();\n        if ((0, _env.getBrowser)() === \"IE\") (0, _logDefault.default).warn(\"IE 11 support will be deprecated in v8.0\")();\n        if (!props.gl) {\n            if (typeof document !== \"undefined\") this.canvas = this._createCanvas(props);\n        }\n        this.animationLoop = this._createAnimationLoop(props);\n        this.stats = new (0, _probeGl.Stats)({\n            id: \"deck.gl\"\n        });\n        this.metrics = {\n            fps: 0,\n            setPropsTime: 0,\n            updateAttributesTime: 0,\n            framesRedrawn: 0,\n            pickTime: 0,\n            pickCount: 0,\n            gpuTime: 0,\n            gpuTimePerFrame: 0,\n            cpuTime: 0,\n            cpuTimePerFrame: 0,\n            bufferMemory: 0,\n            textureMemory: 0,\n            renderbufferMemory: 0,\n            gpuMemory: 0\n        };\n        this._metricsCounter = 0;\n        this.setProps(props);\n        if (props._typedArrayManagerProps) (0, _typedArrayManagerDefault.default).setProps(props._typedArrayManagerProps);\n        this.animationLoop.start();\n    }\n    (0, _createClassDefault.default)(Deck1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this.animationLoop.stop();\n                this.animationLoop = null;\n                this._lastPointerDownInfo = null;\n                if (this.layerManager) {\n                    this.layerManager.finalize();\n                    this.layerManager = null;\n                    this.viewManager.finalize();\n                    this.viewManager = null;\n                    this.effectManager.finalize();\n                    this.effectManager = null;\n                    this.deckRenderer.finalize();\n                    this.deckRenderer = null;\n                    this.deckPicker.finalize();\n                    this.deckPicker = null;\n                    this.eventManager.destroy();\n                    this.eventManager = null;\n                    this.tooltip.remove();\n                    this.tooltip = null;\n                }\n                if (!this.props.canvas && !this.props.gl && this.canvas) {\n                    this.canvas.parentElement.removeChild(this.canvas);\n                    this.canvas = null;\n                }\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                this.stats.get(\"setProps Time\").timeStart();\n                if (\"onLayerHover\" in props) (0, _logDefault.default).removed(\"onLayerHover\", \"onHover\")();\n                if (\"onLayerClick\" in props) (0, _logDefault.default).removed(\"onLayerClick\", \"onClick\")();\n                if (props.initialViewState && !(0, _deepEqual.deepEqual)(this.props.initialViewState, props.initialViewState)) this.viewState = props.initialViewState;\n                Object.assign(this.props, props);\n                this._setCanvasSize(this.props);\n                var resolvedProps = Object.create(this.props);\n                Object.assign(resolvedProps, {\n                    views: this._getViews(),\n                    width: this.width,\n                    height: this.height,\n                    viewState: this._getViewState()\n                });\n                this.animationLoop.setProps(resolvedProps);\n                if (this.layerManager) {\n                    this.viewManager.setProps(resolvedProps);\n                    this.layerManager.activateViewport(this.getViewports()[0]);\n                    this.layerManager.setProps(resolvedProps);\n                    this.effectManager.setProps(resolvedProps);\n                    this.deckRenderer.setProps(resolvedProps);\n                    this.deckPicker.setProps(resolvedProps);\n                }\n                this.stats.get(\"setProps Time\").timeEnd();\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                if (this.props._animate) return \"Deck._animate\";\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                var viewManagerNeedsRedraw = this.viewManager.needsRedraw(opts);\n                var layerManagerNeedsRedraw = this.layerManager.needsRedraw(opts);\n                var effectManagerNeedsRedraw = this.effectManager.needsRedraw(opts);\n                var deckRendererNeedsRedraw = this.deckRenderer.needsRedraw(opts);\n                redraw = redraw || viewManagerNeedsRedraw || layerManagerNeedsRedraw || effectManagerNeedsRedraw || deckRendererNeedsRedraw;\n                return redraw;\n            }\n        },\n        {\n            key: \"redraw\",\n            value: function redraw(force) {\n                if (!this.layerManager) return;\n                var redrawReason = force || this.needsRedraw({\n                    clearRedrawFlags: true\n                });\n                if (!redrawReason) return;\n                this.stats.get(\"Redraw Count\").incrementCount();\n                if (this.props._customRender) this.props._customRender(redrawReason);\n                else this._drawLayers(redrawReason);\n            }\n        },\n        {\n            key: \"getViews\",\n            value: function getViews() {\n                return this.viewManager.views;\n            }\n        },\n        {\n            key: \"getViewports\",\n            value: function getViewports(rect) {\n                return this.viewManager.getViewports(rect);\n            }\n        },\n        {\n            key: \"pickObject\",\n            value: function pickObject(opts) {\n                var infos = this._pick(\"pickObject\", \"pickObject Time\", opts).result;\n                return infos.length ? infos[0] : null;\n            }\n        },\n        {\n            key: \"pickMultipleObjects\",\n            value: function pickMultipleObjects(opts) {\n                opts.depth = opts.depth || 10;\n                return this._pick(\"pickObject\", \"pickMultipleObjects Time\", opts).result;\n            }\n        },\n        {\n            key: \"pickObjects\",\n            value: function pickObjects(opts) {\n                return this._pick(\"pickObjects\", \"pickObjects Time\", opts);\n            }\n        },\n        {\n            key: \"_addResources\",\n            value: function _addResources(resources) {\n                var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n                for(var id in resources)this.layerManager.resourceManager.add({\n                    resourceId: id,\n                    data: resources[id],\n                    forceUpdate: forceUpdate\n                });\n            }\n        },\n        {\n            key: \"_removeResources\",\n            value: function _removeResources(resourceIds) {\n                var _iterator = _createForOfIteratorHelper(resourceIds), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var id = _step.value;\n                        this.layerManager.resourceManager.remove(id);\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n            }\n        },\n        {\n            key: \"_pick\",\n            value: function _pick(method, statKey, opts) {\n                var stats = this.stats;\n                stats.get(\"Pick Count\").incrementCount();\n                stats.get(statKey).timeStart();\n                var infos = this.deckPicker[method](Object.assign({\n                    layers: this.layerManager.getLayers(opts),\n                    views: this.viewManager.getViews(),\n                    viewports: this.getViewports(opts),\n                    onViewportActive: this.layerManager.activateViewport\n                }, opts));\n                stats.get(statKey).timeEnd();\n                return infos;\n            }\n        },\n        {\n            key: \"_createCanvas\",\n            value: function _createCanvas(props) {\n                var canvas = props.canvas;\n                if (typeof canvas === \"string\") {\n                    canvas = document.getElementById(canvas);\n                    (0, _assertDefault.default)(canvas);\n                }\n                if (!canvas) {\n                    canvas = document.createElement(\"canvas\");\n                    var parent = props.parent || document.body;\n                    parent.appendChild(canvas);\n                }\n                var id = props.id, style = props.style;\n                canvas.id = id;\n                Object.assign(canvas.style, style);\n                return canvas;\n            }\n        },\n        {\n            key: \"_setCanvasSize\",\n            value: function _setCanvasSize(props) {\n                if (!this.canvas) return;\n                var width = props.width, height = props.height;\n                if (width || width === 0) {\n                    width = Number.isFinite(width) ? \"\".concat(width, \"px\") : width;\n                    this.canvas.style.width = width;\n                }\n                if (height || height === 0) {\n                    height = Number.isFinite(height) ? \"\".concat(height, \"px\") : height;\n                    this.canvas.style.position = \"absolute\";\n                    this.canvas.style.height = height;\n                }\n            }\n        },\n        {\n            key: \"_updateCanvasSize\",\n            value: function _updateCanvasSize() {\n                if (this._checkForCanvasSizeChange()) {\n                    var width = this.width, height = this.height;\n                    this.viewManager.setProps({\n                        width: width,\n                        height: height\n                    });\n                    this.props.onResize({\n                        width: this.width,\n                        height: this.height\n                    });\n                }\n            }\n        },\n        {\n            key: \"_checkForCanvasSizeChange\",\n            value: function _checkForCanvasSizeChange() {\n                var canvas = this.canvas;\n                if (!canvas) return false;\n                var newWidth = canvas.clientWidth || canvas.width;\n                var newHeight = canvas.clientHeight || canvas.height;\n                if (newWidth !== this.width || newHeight !== this.height) {\n                    this.width = newWidth;\n                    this.height = newHeight;\n                    return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"_createAnimationLoop\",\n            value: function _createAnimationLoop(props) {\n                var _this = this;\n                var width = props.width, height = props.height, gl = props.gl, glOptions = props.glOptions, debug = props.debug, useDevicePixels = props.useDevicePixels, autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;\n                return new (0, _core.AnimationLoop)({\n                    width: width,\n                    height: height,\n                    useDevicePixels: useDevicePixels,\n                    autoResizeDrawingBuffer: autoResizeDrawingBuffer,\n                    autoResizeViewport: false,\n                    gl: gl,\n                    onCreateContext: function onCreateContext(opts) {\n                        return (0, _core.createGLContext)(Object.assign({}, glOptions, opts, {\n                            canvas: _this.canvas,\n                            debug: debug\n                        }));\n                    },\n                    onInitialize: this._onRendererInitialized,\n                    onRender: this._onRenderFrame,\n                    onBeforeRender: props.onBeforeRender,\n                    onAfterRender: props.onAfterRender\n                });\n            }\n        },\n        {\n            key: \"_getViewState\",\n            value: function _getViewState() {\n                return this.props.viewState || this.viewState;\n            }\n        },\n        {\n            key: \"_getViews\",\n            value: function _getViews() {\n                var views = this.props.views || [\n                    new (0, _mapViewDefault.default)({\n                        id: \"default-view\"\n                    })\n                ];\n                views = Array.isArray(views) ? views : [\n                    views\n                ];\n                if (views.length && this.props.controller) views[0].props.controller = this.props.controller;\n                return views;\n            }\n        },\n        {\n            key: \"_onPointerMove\",\n            value: function _onPointerMove(event) {\n                var _pickRequest = this._pickRequest;\n                if (event.type === \"pointerleave\") {\n                    _pickRequest.x = -1;\n                    _pickRequest.y = -1;\n                    _pickRequest.radius = 0;\n                } else if (event.leftButton || event.rightButton) return;\n                else {\n                    var pos = event.offsetCenter;\n                    if (!pos) return;\n                    _pickRequest.x = pos.x;\n                    _pickRequest.y = pos.y;\n                    _pickRequest.radius = this.props.pickingRadius;\n                }\n                if (this.layerManager) this.layerManager.context.mousePosition = {\n                    x: _pickRequest.x,\n                    y: _pickRequest.y\n                };\n                _pickRequest.event = event;\n                _pickRequest.mode = \"hover\";\n            }\n        },\n        {\n            key: \"_pickAndCallback\",\n            value: function _pickAndCallback() {\n                var _pickRequest = this._pickRequest;\n                if (_pickRequest.event) {\n                    var _this$_pick = this._pick(\"pickObject\", \"pickObject Time\", _pickRequest), result = _this$_pick.result, emptyInfo = _this$_pick.emptyInfo;\n                    var pickedInfo = emptyInfo;\n                    var handled = false;\n                    var _iterator2 = _createForOfIteratorHelper(result), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var info = _step2.value;\n                            pickedInfo = info;\n                            handled = info.layer.onHover(info, _pickRequest.event);\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                    if (!handled && this.props.onHover) this.props.onHover(pickedInfo, _pickRequest.event);\n                    if (this.props.getTooltip) {\n                        var displayInfo = this.props.getTooltip(pickedInfo);\n                        this.tooltip.setTooltip(displayInfo, pickedInfo.x, pickedInfo.y);\n                    }\n                    _pickRequest.event = null;\n                }\n            }\n        },\n        {\n            key: \"_updateCursor\",\n            value: function _updateCursor() {\n                var container = this.props.parent || this.canvas;\n                if (container) container.style.cursor = this.props.getCursor(this.interactiveState);\n            }\n        },\n        {\n            key: \"_setGLContext\",\n            value: function _setGLContext(gl) {\n                if (this.layerManager) return;\n                if (!this.canvas) {\n                    this.canvas = gl.canvas;\n                    (0, _core.instrumentGLContext)(gl, {\n                        enable: true,\n                        copyState: true\n                    });\n                }\n                this.tooltip = new (0, _tooltipDefault.default)(this.canvas);\n                (0, _core.setParameters)(gl, {\n                    blend: true,\n                    blendFunc: [\n                        770,\n                        771,\n                        1,\n                        771\n                    ],\n                    polygonOffsetFill: true,\n                    depthTest: true,\n                    depthFunc: 515\n                });\n                this.props.onWebGLInitialized(gl);\n                var timeline = new (0, _core.Timeline)();\n                timeline.play();\n                this.animationLoop.attachTimeline(timeline);\n                this.eventManager = new (0, _mjolnirJs.EventManager)(this.props.parent || gl.canvas, {\n                    touchAction: this.props.touchAction,\n                    events: {\n                        pointerdown: this._onPointerDown,\n                        pointermove: this._onPointerMove,\n                        pointerleave: this._onPointerMove\n                    }\n                });\n                for(var eventType in 0, _constants.EVENTS)this.eventManager.on(eventType, this._onEvent);\n                this.viewManager = new (0, _viewManagerDefault.default)({\n                    timeline: timeline,\n                    eventManager: this.eventManager,\n                    onViewStateChange: this._onViewStateChange,\n                    onInteractiveStateChange: this._onInteractiveStateChange,\n                    views: this._getViews(),\n                    viewState: this._getViewState(),\n                    width: this.width,\n                    height: this.height\n                });\n                var viewport = this.viewManager.getViewports()[0];\n                this.layerManager = new (0, _layerManagerDefault.default)(gl, {\n                    deck: this,\n                    stats: this.stats,\n                    viewport: viewport,\n                    timeline: timeline\n                });\n                this.effectManager = new (0, _effectManagerDefault.default)();\n                this.deckRenderer = new (0, _deckRendererDefault.default)(gl);\n                this.deckPicker = new (0, _deckPickerDefault.default)(gl);\n                this.setProps(this.props);\n                this._updateCanvasSize();\n                this.props.onLoad();\n            }\n        },\n        {\n            key: \"_drawLayers\",\n            value: function _drawLayers(redrawReason, renderOptions) {\n                var gl = this.layerManager.context.gl;\n                (0, _core.setParameters)(gl, this.props.parameters);\n                this.props.onBeforeRender({\n                    gl: gl\n                });\n                this.deckRenderer.renderLayers(Object.assign({\n                    target: this.props._framebuffer,\n                    layers: this.layerManager.getLayers(),\n                    viewports: this.viewManager.getViewports(),\n                    onViewportActive: this.layerManager.activateViewport,\n                    views: this.viewManager.getViews(),\n                    pass: \"screen\",\n                    redrawReason: redrawReason,\n                    effects: this.effectManager.getEffects()\n                }, renderOptions));\n                this.props.onAfterRender({\n                    gl: gl\n                });\n            }\n        },\n        {\n            key: \"_onRendererInitialized\",\n            value: function _onRendererInitialized(_ref2) {\n                var gl = _ref2.gl;\n                this._setGLContext(gl);\n            }\n        },\n        {\n            key: \"_onRenderFrame\",\n            value: function _onRenderFrame(animationProps) {\n                this._getFrameStats();\n                if ((this._metricsCounter++) % 60 === 0) {\n                    this._getMetrics();\n                    this.stats.reset();\n                    (0, _logDefault.default).table(4, this.metrics)();\n                    if (this.props._onMetrics) this.props._onMetrics(this.metrics);\n                }\n                this._updateCanvasSize();\n                this._updateCursor();\n                this.layerManager.updateLayers();\n                this._pickAndCallback();\n                this.redraw(false);\n                if (this.viewManager) this.viewManager.updateViewStates();\n            }\n        },\n        {\n            key: \"_onViewStateChange\",\n            value: function _onViewStateChange(params) {\n                var viewState = this.props.onViewStateChange(params) || params.viewState;\n                if (this.viewState) {\n                    this.viewState = _objectSpread(_objectSpread({}, this.viewState), {}, (0, _definePropertyDefault.default)({}, params.viewId, viewState));\n                    if (!this.props.viewState) this.viewManager.setProps({\n                        viewState: this.viewState\n                    });\n                }\n            }\n        },\n        {\n            key: \"_onInteractiveStateChange\",\n            value: function _onInteractiveStateChange(_ref3) {\n                var _ref3$isDragging = _ref3.isDragging, isDragging = _ref3$isDragging === void 0 ? false : _ref3$isDragging;\n                if (isDragging !== this.interactiveState.isDragging) this.interactiveState.isDragging = isDragging;\n            }\n        },\n        {\n            key: \"_onEvent\",\n            value: function _onEvent(event) {\n                var eventOptions = (0, _constants.EVENTS)[event.type];\n                var pos = event.offsetCenter;\n                if (!eventOptions || !pos) return;\n                var layers = this.layerManager.getLayers();\n                var info = this.deckPicker.getLastPickedObject({\n                    x: pos.x,\n                    y: pos.y,\n                    layers: layers,\n                    viewports: this.getViewports(pos)\n                }, this._lastPointerDownInfo);\n                var layer = info.layer;\n                var layerHandler = layer && (layer[eventOptions.handler] || layer.props[eventOptions.handler]);\n                var rootHandler = this.props[eventOptions.handler];\n                var handled = false;\n                if (layerHandler) handled = layerHandler.call(layer, info, event);\n                if (!handled && rootHandler) rootHandler(info, event);\n            }\n        },\n        {\n            key: \"_onPointerDown\",\n            value: function _onPointerDown(event) {\n                var pos = event.offsetCenter;\n                this._lastPointerDownInfo = this.pickObject({\n                    x: pos.x,\n                    y: pos.y,\n                    radius: this.props.pickingRadius\n                });\n            }\n        },\n        {\n            key: \"_getFrameStats\",\n            value: function _getFrameStats() {\n                var stats = this.stats;\n                stats.get(\"frameRate\").timeEnd();\n                stats.get(\"frameRate\").timeStart();\n                var animationLoopStats = this.animationLoop.stats;\n                stats.get(\"GPU Time\").addTime(animationLoopStats.get(\"GPU Time\").lastTiming);\n                stats.get(\"CPU Time\").addTime(animationLoopStats.get(\"CPU Time\").lastTiming);\n            }\n        },\n        {\n            key: \"_getMetrics\",\n            value: function _getMetrics() {\n                var metrics = this.metrics, stats = this.stats;\n                metrics.fps = stats.get(\"frameRate\").getHz();\n                metrics.setPropsTime = stats.get(\"setProps Time\").time;\n                metrics.updateAttributesTime = stats.get(\"Update Attributes\").time;\n                metrics.framesRedrawn = stats.get(\"Redraw Count\").count;\n                metrics.pickTime = stats.get(\"pickObject Time\").time + stats.get(\"pickMultipleObjects Time\").time + stats.get(\"pickObjects Time\").time;\n                metrics.pickCount = stats.get(\"Pick Count\").count;\n                metrics.gpuTime = stats.get(\"GPU Time\").time;\n                metrics.cpuTime = stats.get(\"CPU Time\").time;\n                metrics.gpuTimePerFrame = stats.get(\"GPU Time\").getAverageTime();\n                metrics.cpuTimePerFrame = stats.get(\"CPU Time\").getAverageTime();\n                var memoryStats = (0, _core.lumaStats).get(\"Memory Usage\");\n                metrics.bufferMemory = memoryStats.get(\"Buffer Memory\").count;\n                metrics.textureMemory = memoryStats.get(\"Texture Memory\").count;\n                metrics.renderbufferMemory = memoryStats.get(\"Renderbuffer Memory\").count;\n                metrics.gpuMemory = memoryStats.get(\"GPU Memory\").count;\n            }\n        }\n    ]);\n    return Deck1;\n}();\nDeck.getPropTypes = getPropTypes;\nDeck.defaultProps = defaultProps;\nDeck.VERSION = (0, _initDefault.default).VERSION;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./layer-manager\":\"bzJiR\",\"./view-manager\":\"hnSRX\",\"../views/map-view\":\"54Z87\",\"./effect-manager\":\"4SWWi\",\"./effect\":\"6aqmc\",\"./deck-renderer\":\"1XD0R\",\"./deck-picker\":\"gyWAw\",\"./tooltip\":\"aqeby\",\"../utils/log\":\"1biSe\",\"../utils/deep-equal\":\"ftdIu\",\"../utils/typed-array-manager\":\"4DbDw\",\"./init\":\"g83Ee\",\"probe.gl/env\":\"btEBf\",\"@luma.gl/core\":\"WBJLR\",\"probe.gl\":\"2Bw0B\",\"mjolnir.js\":\"eKT6m\",\"../utils/assert\":\"1unZV\",\"./constants\":\"inuJE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bzJiR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LayerManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _layer = require(\"./layer\");\nvar _layerDefault = parcelHelpers.interopDefault(_layer);\nvar _constants = require(\"../lifecycle/constants\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _debug = require(\"../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _flatten = require(\"../utils/flatten\");\nvar _probeGl = require(\"probe.gl\");\nvar _resourceManager = require(\"./resource/resource-manager\");\nvar _resourceManagerDefault = parcelHelpers.interopDefault(_resourceManager);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _shaderlib = require(\"../shaderlib\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar TRACE_SET_LAYERS = \"layerManager.setLayers\";\nvar TRACE_ACTIVATE_VIEWPORT = \"layerManager.activateViewport\";\nvar INITIAL_CONTEXT = Object.seal({\n    layerManager: null,\n    resourceManager: null,\n    deck: null,\n    gl: null,\n    stats: null,\n    shaderCache: null,\n    pickingFBO: null,\n    mousePosition: null,\n    userData: {}\n});\nvar layerName = function layerName(layer) {\n    return layer instanceof (0, _layerDefault.default) ? \"\".concat(layer) : !layer ? \"null\" : \"invalid\";\n};\nvar LayerManager = function() {\n    function LayerManager1(gl) {\n        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, deck = _ref.deck, stats = _ref.stats, viewport = _ref.viewport, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, LayerManager1);\n        this.lastRenderedLayers = [];\n        this.layers = [];\n        this.resourceManager = new (0, _resourceManagerDefault.default)({\n            gl: gl,\n            protocol: \"deck://\"\n        });\n        this.context = Object.assign({}, INITIAL_CONTEXT, {\n            layerManager: this,\n            gl: gl,\n            deck: deck,\n            programManager: gl && (0, _shaderlib.createProgramManager)(gl),\n            stats: stats || new (0, _probeGl.Stats)({\n                id: \"deck.gl\"\n            }),\n            viewport: viewport || new (0, _viewportDefault.default)({\n                id: \"DEFAULT-INITIAL-VIEWPORT\"\n            }),\n            timeline: timeline || new (0, _core.Timeline)(),\n            resourceManager: this.resourceManager\n        });\n        this._needsRedraw = \"Initial render\";\n        this._needsUpdate = false;\n        this._debug = false;\n        this._onError = null;\n        this.activateViewport = this.activateViewport.bind(this);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(LayerManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this.resourceManager.finalize();\n                var _iterator = _createForOfIteratorHelper(this.layers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var layer = _step.value;\n                        this._finalizeLayer(layer);\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                var _iterator2 = _createForOfIteratorHelper(this.layers), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var layer = _step2.value;\n                        var layerNeedsRedraw = layer.getNeedsRedraw(opts);\n                        redraw = redraw || layerNeedsRedraw;\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n                return redraw;\n            }\n        },\n        {\n            key: \"needsUpdate\",\n            value: function needsUpdate() {\n                return this._needsUpdate;\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw(reason) {\n                this._needsRedraw = this._needsRedraw || reason;\n            }\n        },\n        {\n            key: \"setNeedsUpdate\",\n            value: function setNeedsUpdate(reason) {\n                this._needsUpdate = this._needsUpdate || reason;\n            }\n        },\n        {\n            key: \"getLayers\",\n            value: function getLayers() {\n                var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$layerIds = _ref2.layerIds, layerIds = _ref2$layerIds === void 0 ? null : _ref2$layerIds;\n                return layerIds ? this.layers.filter(function(layer) {\n                    return layerIds.find(function(layerId) {\n                        return layer.id.indexOf(layerId) === 0;\n                    });\n                }) : this.layers;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"debug\" in props) this._debug = props.debug;\n                if (\"userData\" in props) this.context.userData = props.userData;\n                if (\"layers\" in props) this.setLayers(props.layers);\n                if (\"onError\" in props) this._onError = props.onError;\n            }\n        },\n        {\n            key: \"setLayers\",\n            value: function setLayers(newLayers) {\n                var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n                var shouldUpdate = forceUpdate || newLayers !== this.lastRenderedLayers;\n                (0, _debugDefault.default)(TRACE_SET_LAYERS, this, shouldUpdate, newLayers);\n                if (!shouldUpdate) return this;\n                this.lastRenderedLayers = newLayers;\n                newLayers = (0, _flatten.flatten)(newLayers, Boolean);\n                var _iterator3 = _createForOfIteratorHelper(newLayers), _step3;\n                try {\n                    for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                        var layer = _step3.value;\n                        layer.context = this.context;\n                    }\n                } catch (err) {\n                    _iterator3.e(err);\n                } finally{\n                    _iterator3.f();\n                }\n                this._updateLayers(this.layers, newLayers);\n                return this;\n            }\n        },\n        {\n            key: \"updateLayers\",\n            value: function updateLayers() {\n                var reason = this.needsUpdate();\n                if (reason) {\n                    this.setNeedsRedraw(\"updating layers: \".concat(reason));\n                    var forceUpdate = true;\n                    this.setLayers(this.lastRenderedLayers, forceUpdate);\n                }\n            }\n        },\n        {\n            key: \"activateViewport\",\n            value: function activateViewport(viewport) {\n                (0, _debugDefault.default)(TRACE_ACTIVATE_VIEWPORT, this, viewport);\n                if (viewport) this.context.viewport = viewport;\n                return this;\n            }\n        },\n        {\n            key: \"_handleError\",\n            value: function _handleError(stage, error, layer) {\n                if (this._onError) this._onError(error, layer);\n                else (0, _logDefault.default).error(\"error during \".concat(stage, \" of \").concat(layerName(layer)), error)();\n            }\n        },\n        {\n            key: \"_updateLayers\",\n            value: function _updateLayers(oldLayers, newLayers) {\n                var oldLayerMap = {};\n                var _iterator4 = _createForOfIteratorHelper(oldLayers), _step4;\n                try {\n                    for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n                        var oldLayer = _step4.value;\n                        if (oldLayerMap[oldLayer.id]) (0, _logDefault.default).warn(\"Multiple old layers with same id \".concat(layerName(oldLayer)))();\n                        else oldLayerMap[oldLayer.id] = oldLayer;\n                    }\n                } catch (err) {\n                    _iterator4.e(err);\n                } finally{\n                    _iterator4.f();\n                }\n                var generatedLayers = [];\n                this._updateSublayersRecursively(newLayers, oldLayerMap, generatedLayers);\n                this._finalizeOldLayers(oldLayerMap);\n                var needsUpdate = false;\n                for(var _i = 0, _generatedLayers = generatedLayers; _i < _generatedLayers.length; _i++){\n                    var layer = _generatedLayers[_i];\n                    if (layer.hasUniformTransition()) {\n                        needsUpdate = true;\n                        break;\n                    }\n                }\n                this._needsUpdate = needsUpdate;\n                this.layers = generatedLayers;\n            }\n        },\n        {\n            key: \"_updateSublayersRecursively\",\n            value: function _updateSublayersRecursively(newLayers, oldLayerMap, generatedLayers) {\n                var _iterator5 = _createForOfIteratorHelper(newLayers), _step5;\n                try {\n                    for(_iterator5.s(); !(_step5 = _iterator5.n()).done;){\n                        var newLayer = _step5.value;\n                        newLayer.context = this.context;\n                        var oldLayer = oldLayerMap[newLayer.id];\n                        if (oldLayer === null) (0, _logDefault.default).warn(\"Multiple new layers with same id \".concat(layerName(newLayer)))();\n                        oldLayerMap[newLayer.id] = null;\n                        var sublayers = null;\n                        try {\n                            if (this._debug && oldLayer !== newLayer) newLayer.validateProps();\n                            if (!oldLayer) this._initializeLayer(newLayer);\n                            else {\n                                this._transferLayerState(oldLayer, newLayer);\n                                this._updateLayer(newLayer);\n                            }\n                            generatedLayers.push(newLayer);\n                            sublayers = newLayer.isComposite && newLayer.getSubLayers();\n                        } catch (err) {\n                            this._handleError(\"matching\", err, newLayer);\n                        }\n                        if (sublayers) this._updateSublayersRecursively(sublayers, oldLayerMap, generatedLayers);\n                    }\n                } catch (err) {\n                    _iterator5.e(err);\n                } finally{\n                    _iterator5.f();\n                }\n            }\n        },\n        {\n            key: \"_finalizeOldLayers\",\n            value: function _finalizeOldLayers(oldLayerMap) {\n                for(var layerId in oldLayerMap){\n                    var layer = oldLayerMap[layerId];\n                    if (layer) this._finalizeLayer(layer);\n                }\n            }\n        },\n        {\n            key: \"_initializeLayer\",\n            value: function _initializeLayer(layer) {\n                try {\n                    layer._initialize();\n                    layer.lifecycle = (0, _constants.LIFECYCLE).INITIALIZED;\n                } catch (err) {\n                    this._handleError(\"initialization\", err, layer);\n                }\n            }\n        },\n        {\n            key: \"_transferLayerState\",\n            value: function _transferLayerState(oldLayer, newLayer) {\n                newLayer._transferState(oldLayer);\n                newLayer.lifecycle = (0, _constants.LIFECYCLE).MATCHED;\n                if (newLayer !== oldLayer) oldLayer.lifecycle = (0, _constants.LIFECYCLE).AWAITING_GC;\n            }\n        },\n        {\n            key: \"_updateLayer\",\n            value: function _updateLayer(layer) {\n                try {\n                    layer._update();\n                } catch (err) {\n                    this._handleError(\"update\", err, layer);\n                }\n            }\n        },\n        {\n            key: \"_finalizeLayer\",\n            value: function _finalizeLayer(layer) {\n                this._needsRedraw = this._needsRedraw || \"finalized \".concat(layerName(layer));\n                layer.lifecycle = (0, _constants.LIFECYCLE).AWAITING_FINALIZATION;\n                try {\n                    layer._finalize();\n                    layer.lifecycle = (0, _constants.LIFECYCLE).FINALIZED;\n                } catch (err) {\n                    this._handleError(\"finalization\", err, layer);\n                }\n            }\n        }\n    ]);\n    return LayerManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/core\":\"WBJLR\",\"./layer\":\"krhD2\",\"../lifecycle/constants\":\"cM1ws\",\"../utils/log\":\"1biSe\",\"../debug\":\"hpEQF\",\"../utils/flatten\":\"i8Kfk\",\"probe.gl\":\"2Bw0B\",\"./resource/resource-manager\":\"6RrOW\",\"../viewports/viewport\":\"iilpM\",\"../shaderlib\":\"lFELS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"krhD2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Layer);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _constants = require(\"./constants\");\nvar _attributeManager = require(\"./attribute/attribute-manager\");\nvar _attributeManagerDefault = parcelHelpers.interopDefault(_attributeManager);\nvar _uniformTransitionManager = require(\"./uniform-transition-manager\");\nvar _uniformTransitionManagerDefault = parcelHelpers.interopDefault(_uniformTransitionManager);\nvar _props = require(\"../lifecycle/props\");\nvar _count = require(\"../utils/count\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _debug = require(\"../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _core = require(\"@luma.gl/core\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _memoize = require(\"../utils/memoize\");\nvar _memoizeDefault = parcelHelpers.interopDefault(_memoize);\nvar _shader = require(\"../utils/shader\");\nvar _projectFunctions = require(\"../shaderlib/project/project-functions\");\nvar _typedArrayManager = require(\"../utils/typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _component = require(\"../lifecycle/component\");\nvar _componentDefault = parcelHelpers.interopDefault(_component);\nvar _layerState = require(\"./layer-state\");\nvar _layerStateDefault = parcelHelpers.interopDefault(_layerState);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _core1 = require(\"@loaders.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar TRACE_CHANGE_FLAG = \"layer.changeFlag\";\nvar TRACE_INITIALIZE = \"layer.initialize\";\nvar TRACE_UPDATE = \"layer.update\";\nvar TRACE_FINALIZE = \"layer.finalize\";\nvar TRACE_MATCHED = \"layer.matched\";\nvar MAX_PICKING_COLOR_CACHE_SIZE = Math.pow(2, 24) - 1;\nvar EMPTY_ARRAY = Object.freeze([]);\nvar areViewportsEqual = (0, _memoizeDefault.default)(function(_ref) {\n    var oldViewport = _ref.oldViewport, viewport = _ref.viewport;\n    return oldViewport.equals(viewport);\n});\nvar pickingColorCache = new Uint8ClampedArray(0);\nvar defaultProps = {\n    data: {\n        type: \"data\",\n        value: EMPTY_ARRAY,\n        async: true\n    },\n    dataComparator: null,\n    _dataDiff: {\n        type: \"function\",\n        value: function value(data) {\n            return data && data.__diff;\n        },\n        compare: false,\n        optional: true\n    },\n    dataTransform: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onDataLoad: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    fetch: {\n        type: \"function\",\n        value: function value(url, _ref2) {\n            var propName = _ref2.propName, layer = _ref2.layer;\n            var resourceManager = layer.context.resourceManager;\n            var loadOptions = layer.getLoadOptions();\n            var inResourceManager = resourceManager.contains(url);\n            if (!inResourceManager && !loadOptions) {\n                resourceManager.add({\n                    resourceId: url,\n                    data: url,\n                    persistent: false\n                });\n                inResourceManager = true;\n            }\n            if (inResourceManager) return resourceManager.subscribe({\n                resourceId: url,\n                onChange: function onChange(data) {\n                    return layer.internalState.reloadAsyncProp(propName, data);\n                },\n                consumerId: layer.id,\n                requestId: propName\n            });\n            return (0, _core1.load)(url, loadOptions);\n        },\n        compare: false\n    },\n    updateTriggers: {},\n    visible: true,\n    pickable: false,\n    opacity: {\n        type: \"number\",\n        min: 0,\n        max: 1,\n        value: 1\n    },\n    onHover: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onClick: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onDragStart: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onDrag: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onDragEnd: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    coordinateSystem: (0, _constants.COORDINATE_SYSTEM).DEFAULT,\n    coordinateOrigin: {\n        type: \"array\",\n        value: [\n            0,\n            0,\n            0\n        ],\n        compare: true\n    },\n    modelMatrix: {\n        type: \"array\",\n        value: null,\n        compare: true,\n        optional: true\n    },\n    wrapLongitude: false,\n    positionFormat: \"XYZ\",\n    colorFormat: \"RGBA\",\n    parameters: {},\n    uniforms: {},\n    extensions: [],\n    getPolygonOffset: {\n        type: \"function\",\n        value: function value(_ref3) {\n            var layerIndex = _ref3.layerIndex;\n            return [\n                0,\n                -layerIndex * 100\n            ];\n        },\n        compare: false\n    },\n    highlightedObjectIndex: -1,\n    autoHighlight: false,\n    highlightColor: {\n        type: \"accessor\",\n        value: [\n            0,\n            0,\n            128,\n            128\n        ]\n    }\n};\nvar Layer = function(_Component) {\n    (0, _inheritsDefault.default)(Layer1, _Component);\n    var _super = _createSuper(Layer1);\n    function Layer1() {\n        (0, _classCallCheckDefault.default)(this, Layer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(Layer1, [\n        {\n            key: \"toString\",\n            value: function toString() {\n                var className = this.constructor.layerName || this.constructor.name;\n                return \"\".concat(className, \"({id: '\").concat(this.props.id, \"'})\");\n            }\n        },\n        {\n            key: \"setState\",\n            value: function setState(updateObject) {\n                this.setChangeFlags({\n                    stateChanged: true\n                });\n                Object.assign(this.state, updateObject);\n                this.setNeedsRedraw();\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw() {\n                var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n                if (this.internalState) this.internalState.needsRedraw = redraw;\n            }\n        },\n        {\n            key: \"setNeedsUpdate\",\n            value: function setNeedsUpdate() {\n                this.context.layerManager.setNeedsUpdate(String(this));\n                this.internalState.needsUpdate = true;\n            }\n        },\n        {\n            key: \"getNeedsRedraw\",\n            value: function getNeedsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                return this._getNeedsRedraw(opts);\n            }\n        },\n        {\n            key: \"needsUpdate\",\n            value: function needsUpdate() {\n                return this.internalState.needsUpdate || this.hasUniformTransition() || this.shouldUpdateState(this._getUpdateParams());\n            }\n        },\n        {\n            key: \"hasUniformTransition\",\n            value: function hasUniformTransition() {\n                return this.internalState.uniformTransitions.active;\n            }\n        },\n        {\n            key: \"isPickable\",\n            value: function isPickable() {\n                return this.props.pickable && this.props.visible;\n            }\n        },\n        {\n            key: \"getModels\",\n            value: function getModels() {\n                return this.state && (this.state.models || (this.state.model ? [\n                    this.state.model\n                ] : []));\n            }\n        },\n        {\n            key: \"getAttributeManager\",\n            value: function getAttributeManager() {\n                return this.internalState && this.internalState.attributeManager;\n            }\n        },\n        {\n            key: \"getCurrentLayer\",\n            value: function getCurrentLayer() {\n                return this.internalState && this.internalState.layer;\n            }\n        },\n        {\n            key: \"getLoadOptions\",\n            value: function getLoadOptions() {\n                return this.props.loadOptions;\n            }\n        },\n        {\n            key: \"project\",\n            value: function project(xyz) {\n                var viewport = this.context.viewport;\n                var worldPosition = (0, _projectFunctions.getWorldPosition)(xyz, {\n                    viewport: viewport,\n                    modelMatrix: this.props.modelMatrix,\n                    coordinateOrigin: this.props.coordinateOrigin,\n                    coordinateSystem: this.props.coordinateSystem\n                });\n                var _worldToPixels = (0, _webMercator.worldToPixels)(worldPosition, viewport.pixelProjectionMatrix), _worldToPixels2 = (0, _slicedToArrayDefault.default)(_worldToPixels, 3), x = _worldToPixels2[0], y = _worldToPixels2[1], z = _worldToPixels2[2];\n                return xyz.length === 2 ? [\n                    x,\n                    y\n                ] : [\n                    x,\n                    y,\n                    z\n                ];\n            }\n        },\n        {\n            key: \"unproject\",\n            value: function unproject(xy) {\n                var viewport = this.context.viewport;\n                return viewport.unproject(xy);\n            }\n        },\n        {\n            key: \"projectPosition\",\n            value: function projectPosition(xyz) {\n                return (0, _projectFunctions.projectPosition)(xyz, {\n                    viewport: this.context.viewport,\n                    modelMatrix: this.props.modelMatrix,\n                    coordinateOrigin: this.props.coordinateOrigin,\n                    coordinateSystem: this.props.coordinateSystem\n                });\n            }\n        },\n        {\n            key: \"use64bitPositions\",\n            value: function use64bitPositions() {\n                var coordinateSystem = this.props.coordinateSystem;\n                return coordinateSystem === (0, _constants.COORDINATE_SYSTEM).DEFAULT || coordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT || coordinateSystem === (0, _constants.COORDINATE_SYSTEM).CARTESIAN;\n            }\n        },\n        {\n            key: \"onHover\",\n            value: function onHover(info, pickingEvent) {\n                if (this.props.onHover) return this.props.onHover(info, pickingEvent);\n                return false;\n            }\n        },\n        {\n            key: \"onClick\",\n            value: function onClick(info, pickingEvent) {\n                if (this.props.onClick) return this.props.onClick(info, pickingEvent);\n                return false;\n            }\n        },\n        {\n            key: \"nullPickingColor\",\n            value: function nullPickingColor() {\n                return [\n                    0,\n                    0,\n                    0\n                ];\n            }\n        },\n        {\n            key: \"encodePickingColor\",\n            value: function encodePickingColor(i) {\n                var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n                target[0] = i + 1 & 255;\n                target[1] = i + 1 >> 8 & 255;\n                target[2] = i + 1 >> 8 >> 8 & 255;\n                return target;\n            }\n        },\n        {\n            key: \"decodePickingColor\",\n            value: function decodePickingColor(color) {\n                (0, _assertDefault.default)(color instanceof Uint8Array);\n                var _color = (0, _slicedToArrayDefault.default)(color, 3), i1 = _color[0], i2 = _color[1], i3 = _color[2];\n                var index = i1 + i2 * 256 + i3 * 65536 - 1;\n                return index;\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                throw new Error(\"Layer \".concat(this, \" has not defined initializeState\"));\n            }\n        },\n        {\n            key: \"getShaders\",\n            value: function getShaders(shaders) {\n                var _iterator = _createForOfIteratorHelper(this.props.extensions), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var extension = _step.value;\n                        shaders = (0, _shader.mergeShaders)(shaders, extension.getShaders.call(this, extension));\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return shaders;\n            }\n        },\n        {\n            key: \"shouldUpdateState\",\n            value: function shouldUpdateState(_ref4) {\n                var oldProps = _ref4.oldProps, props = _ref4.props, context = _ref4.context, changeFlags = _ref4.changeFlags;\n                return changeFlags.propsOrDataChanged;\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref5) {\n                var oldProps = _ref5.oldProps, props = _ref5.props, context = _ref5.context, changeFlags = _ref5.changeFlags;\n                var attributeManager = this.getAttributeManager();\n                if (changeFlags.dataChanged && attributeManager) {\n                    var dataChanged = changeFlags.dataChanged;\n                    if (Array.isArray(dataChanged)) {\n                        var _iterator2 = _createForOfIteratorHelper(dataChanged), _step2;\n                        try {\n                            for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                                var dataRange = _step2.value;\n                                attributeManager.invalidateAll(dataRange);\n                            }\n                        } catch (err) {\n                            _iterator2.e(err);\n                        } finally{\n                            _iterator2.f();\n                        }\n                    } else attributeManager.invalidateAll();\n                }\n                var neededPickingBuffer = oldProps.highlightedObjectIndex >= 0 || oldProps.pickable;\n                var needPickingBuffer = props.highlightedObjectIndex >= 0 || props.pickable;\n                if (neededPickingBuffer !== needPickingBuffer && attributeManager) {\n                    var _attributeManager$att = attributeManager.attributes, pickingColors = _attributeManager$att.pickingColors, instancePickingColors = _attributeManager$att.instancePickingColors;\n                    var pickingColorsAttribute = pickingColors || instancePickingColors;\n                    if (pickingColorsAttribute) {\n                        if (needPickingBuffer && pickingColorsAttribute.constant) {\n                            pickingColorsAttribute.constant = false;\n                            attributeManager.invalidate(pickingColorsAttribute.id);\n                        }\n                        if (!pickingColorsAttribute.value && !needPickingBuffer) {\n                            pickingColorsAttribute.constant = true;\n                            pickingColorsAttribute.value = [\n                                0,\n                                0,\n                                0\n                            ];\n                        }\n                    }\n                }\n            }\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState() {\n                var _iterator3 = _createForOfIteratorHelper(this.getModels()), _step3;\n                try {\n                    for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                        var model = _step3.value;\n                        model[\"delete\"]();\n                    }\n                } catch (err) {\n                    _iterator3.e(err);\n                } finally{\n                    _iterator3.f();\n                }\n                var attributeManager = this.getAttributeManager();\n                if (attributeManager) attributeManager.finalize();\n                this.context.resourceManager.unsubscribe({\n                    consumerId: this.id\n                });\n                this.internalState.uniformTransitions.clear();\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(opts) {\n                var _iterator4 = _createForOfIteratorHelper(this.getModels()), _step4;\n                try {\n                    for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n                        var model = _step4.value;\n                        model.draw(opts);\n                    }\n                } catch (err) {\n                    _iterator4.e(err);\n                } finally{\n                    _iterator4.f();\n                }\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(_ref6) {\n                var info = _ref6.info, mode = _ref6.mode;\n                var index = info.index;\n                if (index >= 0) {\n                    if (Array.isArray(this.props.data)) info.object = this.props.data[index];\n                }\n                return info;\n            }\n        },\n        {\n            key: \"activateViewport\",\n            value: function activateViewport(viewport) {\n                var oldViewport = this.internalState.viewport;\n                this.internalState.viewport = viewport;\n                if (!oldViewport || !areViewportsEqual({\n                    oldViewport: oldViewport,\n                    viewport: viewport\n                })) {\n                    this.setChangeFlags({\n                        viewportChanged: true\n                    });\n                    this._update();\n                }\n            }\n        },\n        {\n            key: \"invalidateAttribute\",\n            value: function invalidateAttribute() {\n                var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"all\";\n                var diffReason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n                var attributeManager = this.getAttributeManager();\n                if (!attributeManager) return;\n                if (name === \"all\") attributeManager.invalidateAll();\n                else attributeManager.invalidate(name);\n            }\n        },\n        {\n            key: \"updateAttributes\",\n            value: function updateAttributes(changedAttributes) {\n                var _iterator5 = _createForOfIteratorHelper(this.getModels()), _step5;\n                try {\n                    for(_iterator5.s(); !(_step5 = _iterator5.n()).done;){\n                        var model = _step5.value;\n                        this._setModelAttributes(model, changedAttributes);\n                    }\n                } catch (err) {\n                    _iterator5.e(err);\n                } finally{\n                    _iterator5.f();\n                }\n            }\n        },\n        {\n            key: \"_updateAttributes\",\n            value: function _updateAttributes(props) {\n                var attributeManager = this.getAttributeManager();\n                if (!attributeManager) return;\n                var numInstances = this.getNumInstances(props);\n                var startIndices = this.getStartIndices(props);\n                attributeManager.update({\n                    data: props.data,\n                    numInstances: numInstances,\n                    startIndices: startIndices,\n                    props: props,\n                    transitions: props.transitions,\n                    buffers: props.data.attributes,\n                    context: this,\n                    ignoreUnknownAttributes: true\n                });\n                var changedAttributes = attributeManager.getChangedAttributes({\n                    clearChangedFlags: true\n                });\n                this.updateAttributes(changedAttributes);\n            }\n        },\n        {\n            key: \"_updateAttributeTransition\",\n            value: function _updateAttributeTransition() {\n                var attributeManager = this.getAttributeManager();\n                if (attributeManager) attributeManager.updateTransition();\n            }\n        },\n        {\n            key: \"_updateUniformTransition\",\n            value: function _updateUniformTransition() {\n                var uniformTransitions = this.internalState.uniformTransitions;\n                if (uniformTransitions.active) {\n                    var propsInTransition = uniformTransitions.update();\n                    var props = Object.create(this.props);\n                    for(var key in propsInTransition)Object.defineProperty(props, key, {\n                        value: propsInTransition[key]\n                    });\n                    return props;\n                }\n                return this.props;\n            }\n        },\n        {\n            key: \"calculateInstancePickingColors\",\n            value: function calculateInstancePickingColors(attribute, _ref7) {\n                var numInstances = _ref7.numInstances;\n                if (attribute.constant) return;\n                var cacheSize = pickingColorCache.length / 3;\n                if (cacheSize < numInstances) {\n                    if (numInstances > MAX_PICKING_COLOR_CACHE_SIZE) (0, _logDefault.default).warn(\"Layer has too many data objects. Picking might not be able to distinguish all objects.\")();\n                    pickingColorCache = (0, _typedArrayManagerDefault.default).allocate(pickingColorCache, numInstances, {\n                        size: 3,\n                        copy: true,\n                        maxCount: Math.max(numInstances, MAX_PICKING_COLOR_CACHE_SIZE)\n                    });\n                    var newCacheSize = pickingColorCache.length / 3;\n                    var pickingColor = [];\n                    for(var i = cacheSize; i < newCacheSize; i++){\n                        this.encodePickingColor(i, pickingColor);\n                        pickingColorCache[i * 3 + 0] = pickingColor[0];\n                        pickingColorCache[i * 3 + 1] = pickingColor[1];\n                        pickingColorCache[i * 3 + 2] = pickingColor[2];\n                    }\n                }\n                attribute.value = pickingColorCache.subarray(0, numInstances * 3);\n            }\n        },\n        {\n            key: \"_setModelAttributes\",\n            value: function _setModelAttributes(model, changedAttributes) {\n                var attributeManager = this.getAttributeManager();\n                var excludeAttributes = model.userData.excludeAttributes || {};\n                var shaderAttributes = attributeManager.getShaderAttributes(changedAttributes, excludeAttributes);\n                model.setAttributes(shaderAttributes);\n            }\n        },\n        {\n            key: \"clearPickingColor\",\n            value: function clearPickingColor(color) {\n                var _this$getAttributeMan = this.getAttributeManager().attributes, pickingColors = _this$getAttributeMan.pickingColors, instancePickingColors = _this$getAttributeMan.instancePickingColors;\n                var colors = pickingColors || instancePickingColors;\n                var i = this.decodePickingColor(color);\n                var start = colors.getVertexOffset(i);\n                var end = colors.getVertexOffset(i + 1);\n                colors.buffer.subData({\n                    data: new Uint8Array(end - start),\n                    offset: start\n                });\n            }\n        },\n        {\n            key: \"restorePickingColors\",\n            value: function restorePickingColors() {\n                var _this$getAttributeMan2 = this.getAttributeManager().attributes, pickingColors = _this$getAttributeMan2.pickingColors, instancePickingColors = _this$getAttributeMan2.instancePickingColors;\n                var colors = pickingColors || instancePickingColors;\n                colors.updateSubBuffer({\n                    startOffset: 0\n                });\n            }\n        },\n        {\n            key: \"getNumInstances\",\n            value: function getNumInstances(props) {\n                props = props || this.props;\n                if (props.numInstances !== undefined) return props.numInstances;\n                if (this.state && this.state.numInstances !== undefined) return this.state.numInstances;\n                return (0, _count.count)(props.data);\n            }\n        },\n        {\n            key: \"getStartIndices\",\n            value: function getStartIndices(props) {\n                props = props || this.props;\n                if (props.startIndices !== undefined) return props.startIndices;\n                if (this.state && this.state.startIndices) return this.state.startIndices;\n                return null;\n            }\n        },\n        {\n            key: \"_initialize\",\n            value: function _initialize() {\n                (0, _debugDefault.default)(TRACE_INITIALIZE, this);\n                this._initState();\n                this.initializeState(this.context);\n                var _iterator6 = _createForOfIteratorHelper(this.props.extensions), _step6;\n                try {\n                    for(_iterator6.s(); !(_step6 = _iterator6.n()).done;){\n                        var extension = _step6.value;\n                        extension.initializeState.call(this, this.context, extension);\n                    }\n                } catch (err) {\n                    _iterator6.e(err);\n                } finally{\n                    _iterator6.f();\n                }\n                this.setChangeFlags({\n                    dataChanged: true,\n                    propsChanged: true,\n                    viewportChanged: true,\n                    extensionsChanged: true\n                });\n                this._updateState();\n            }\n        },\n        {\n            key: \"_update\",\n            value: function _update() {\n                var stateNeedsUpdate = this.needsUpdate();\n                (0, _debugDefault.default)(TRACE_UPDATE, this, stateNeedsUpdate);\n                if (stateNeedsUpdate) this._updateState();\n            }\n        },\n        {\n            key: \"_updateState\",\n            value: function _updateState() {\n                var currentProps = this.props;\n                var currentViewport = this.context.viewport;\n                var propsInTransition = this._updateUniformTransition();\n                this.internalState.propsInTransition = propsInTransition;\n                this.context.viewport = this.internalState.viewport || currentViewport;\n                this.props = propsInTransition;\n                var updateParams = this._getUpdateParams();\n                var oldModels = this.getModels();\n                if (this.context.gl) this.updateState(updateParams);\n                else try {\n                    this.updateState(updateParams);\n                } catch (error) {}\n                var _iterator7 = _createForOfIteratorHelper(this.props.extensions), _step7;\n                try {\n                    for(_iterator7.s(); !(_step7 = _iterator7.n()).done;){\n                        var extension = _step7.value;\n                        extension.updateState.call(this, updateParams, extension);\n                    }\n                } catch (err) {\n                    _iterator7.e(err);\n                } finally{\n                    _iterator7.f();\n                }\n                var modelChanged = this.getModels()[0] !== oldModels[0];\n                this._updateModules(updateParams, modelChanged);\n                if (this.isComposite) this._renderLayers(updateParams);\n                else {\n                    this.setNeedsRedraw();\n                    this._updateAttributes(this.props);\n                    if (this.state.model) this.state.model.setInstanceCount(this.getNumInstances());\n                }\n                this.context.viewport = currentViewport;\n                this.props = currentProps;\n                this.clearChangeFlags();\n                this.internalState.needsUpdate = false;\n                this.internalState.resetOldProps();\n            }\n        },\n        {\n            key: \"_finalize\",\n            value: function _finalize() {\n                (0, _debugDefault.default)(TRACE_FINALIZE, this);\n                (0, _assertDefault.default)(this.internalState && this.state);\n                this.finalizeState(this.context);\n                var _iterator8 = _createForOfIteratorHelper(this.props.extensions), _step8;\n                try {\n                    for(_iterator8.s(); !(_step8 = _iterator8.n()).done;){\n                        var extension = _step8.value;\n                        extension.finalizeState.call(this, extension);\n                    }\n                } catch (err) {\n                    _iterator8.e(err);\n                } finally{\n                    _iterator8.f();\n                }\n            }\n        },\n        {\n            key: \"drawLayer\",\n            value: function drawLayer(_ref8) {\n                var _this = this;\n                var _ref8$moduleParameter = _ref8.moduleParameters, moduleParameters = _ref8$moduleParameter === void 0 ? null : _ref8$moduleParameter, _ref8$uniforms = _ref8.uniforms, uniforms = _ref8$uniforms === void 0 ? {} : _ref8$uniforms, _ref8$parameters = _ref8.parameters, parameters = _ref8$parameters === void 0 ? {} : _ref8$parameters;\n                this._updateAttributeTransition();\n                var currentProps = this.props;\n                this.props = this.internalState.propsInTransition || currentProps;\n                var opacity = this.props.opacity;\n                uniforms.opacity = Math.pow(opacity, 1 / 2.2);\n                if (moduleParameters) this.setModuleParameters(moduleParameters);\n                var getPolygonOffset = this.props.getPolygonOffset;\n                var offsets = getPolygonOffset && getPolygonOffset(uniforms) || [\n                    0,\n                    0\n                ];\n                (0, _core.setParameters)(this.context.gl, {\n                    polygonOffset: offsets\n                });\n                (0, _core.withParameters)(this.context.gl, parameters, function() {\n                    var opts = {\n                        moduleParameters: moduleParameters,\n                        uniforms: uniforms,\n                        parameters: parameters,\n                        context: _this.context\n                    };\n                    var _iterator9 = _createForOfIteratorHelper(_this.props.extensions), _step9;\n                    try {\n                        for(_iterator9.s(); !(_step9 = _iterator9.n()).done;){\n                            var extension = _step9.value;\n                            extension.draw.call(_this, opts, extension);\n                        }\n                    } catch (err) {\n                        _iterator9.e(err);\n                    } finally{\n                        _iterator9.f();\n                    }\n                    _this.draw(opts);\n                });\n                this.props = currentProps;\n            }\n        },\n        {\n            key: \"getChangeFlags\",\n            value: function getChangeFlags() {\n                return this.internalState.changeFlags;\n            }\n        },\n        {\n            key: \"setChangeFlags\",\n            value: function setChangeFlags(flags) {\n                var changeFlags = this.internalState.changeFlags;\n                for(var key in flags)if (flags[key]) {\n                    var flagChanged = false;\n                    switch(key){\n                        case \"dataChanged\":\n                            if (Array.isArray(changeFlags[key])) {\n                                changeFlags[key] = Array.isArray(flags[key]) ? changeFlags[key].concat(flags[key]) : flags[key];\n                                flagChanged = true;\n                            }\n                        default:\n                            if (!changeFlags[key]) {\n                                changeFlags[key] = flags[key];\n                                flagChanged = true;\n                            }\n                    }\n                    if (flagChanged) (0, _debugDefault.default)(TRACE_CHANGE_FLAG, this, key, flags);\n                }\n                var propsOrDataChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged || changeFlags.propsChanged || changeFlags.extensionsChanged;\n                changeFlags.propsOrDataChanged = propsOrDataChanged;\n                changeFlags.somethingChanged = propsOrDataChanged || flags.viewportChanged || flags.stateChanged;\n            }\n        },\n        {\n            key: \"clearChangeFlags\",\n            value: function clearChangeFlags() {\n                this.internalState.changeFlags = {\n                    dataChanged: false,\n                    propsChanged: false,\n                    updateTriggersChanged: false,\n                    viewportChanged: false,\n                    stateChanged: false,\n                    extensionsChanged: false,\n                    propsOrDataChanged: false,\n                    somethingChanged: false\n                };\n            }\n        },\n        {\n            key: \"diffProps\",\n            value: function diffProps(newProps, oldProps) {\n                var changeFlags = (0, _props.diffProps)(newProps, oldProps);\n                if (changeFlags.updateTriggersChanged) {\n                    for(var key in changeFlags.updateTriggersChanged)if (changeFlags.updateTriggersChanged[key]) this.invalidateAttribute(key);\n                }\n                if (changeFlags.transitionsChanged) for(var _key in changeFlags.transitionsChanged)this.internalState.uniformTransitions.add(_key, oldProps[_key], newProps[_key], newProps.transitions[_key]);\n                return this.setChangeFlags(changeFlags);\n            }\n        },\n        {\n            key: \"validateProps\",\n            value: function validateProps() {\n                (0, _props.validateProps)(this.props);\n            }\n        },\n        {\n            key: \"setModuleParameters\",\n            value: function setModuleParameters(moduleParameters) {\n                var _iterator10 = _createForOfIteratorHelper(this.getModels()), _step10;\n                try {\n                    for(_iterator10.s(); !(_step10 = _iterator10.n()).done;){\n                        var model = _step10.value;\n                        model.updateModuleSettings(moduleParameters);\n                    }\n                } catch (err) {\n                    _iterator10.e(err);\n                } finally{\n                    _iterator10.f();\n                }\n            }\n        },\n        {\n            key: \"_updateModules\",\n            value: function _updateModules(_ref9, forceUpdate) {\n                var props = _ref9.props, oldProps = _ref9.oldProps;\n                var autoHighlight = props.autoHighlight, highlightedObjectIndex = props.highlightedObjectIndex, highlightColor = props.highlightColor;\n                if (forceUpdate || oldProps.autoHighlight !== autoHighlight || oldProps.highlightedObjectIndex !== highlightedObjectIndex || oldProps.highlightColor !== highlightColor) {\n                    var parameters = {};\n                    if (!autoHighlight) parameters.pickingSelectedColor = null;\n                    if (Array.isArray(highlightColor)) parameters.pickingHighlightColor = highlightColor;\n                    if (Number.isInteger(highlightedObjectIndex)) parameters.pickingSelectedColor = highlightedObjectIndex >= 0 ? this.encodePickingColor(highlightedObjectIndex) : null;\n                    this.setModuleParameters(parameters);\n                }\n            }\n        },\n        {\n            key: \"_getUpdateParams\",\n            value: function _getUpdateParams() {\n                return {\n                    props: this.props,\n                    oldProps: this.internalState.getOldProps(),\n                    context: this.context,\n                    changeFlags: this.internalState.changeFlags\n                };\n            }\n        },\n        {\n            key: \"_getNeedsRedraw\",\n            value: function _getNeedsRedraw(opts) {\n                if (!this.internalState) return false;\n                var redraw = false;\n                redraw = redraw || this.internalState.needsRedraw && this.id;\n                this.internalState.needsRedraw = this.internalState.needsRedraw && !opts.clearRedrawFlags;\n                var attributeManager = this.getAttributeManager();\n                var attributeManagerNeedsRedraw = attributeManager && attributeManager.getNeedsRedraw(opts);\n                redraw = redraw || attributeManagerNeedsRedraw;\n                return redraw;\n            }\n        },\n        {\n            key: \"_getAttributeManager\",\n            value: function _getAttributeManager() {\n                return new (0, _attributeManagerDefault.default)(this.context.gl, {\n                    id: this.props.id,\n                    stats: this.context.stats,\n                    timeline: this.context.timeline\n                });\n            }\n        },\n        {\n            key: \"_initState\",\n            value: function _initState() {\n                (0, _assertDefault.default)(!this.internalState && !this.state);\n                (0, _assertDefault.default)(isFinite(this.props.coordinateSystem), \"\".concat(this.id, \": invalid coordinateSystem\"));\n                var attributeManager = this._getAttributeManager();\n                if (attributeManager) attributeManager.addInstanced({\n                    instancePickingColors: {\n                        type: 5121,\n                        size: 3,\n                        noAlloc: true,\n                        update: this.calculateInstancePickingColors\n                    }\n                });\n                this.internalState = new (0, _layerStateDefault.default)({\n                    attributeManager: attributeManager,\n                    layer: this\n                });\n                this.clearChangeFlags();\n                this.state = {};\n                Object.defineProperty(this.state, \"attributeManager\", {\n                    get: function get() {\n                        (0, _logDefault.default).deprecated(\"layer.state.attributeManager\", \"layer.getAttributeManager()\");\n                        return attributeManager;\n                    }\n                });\n                this.internalState.layer = this;\n                this.internalState.uniformTransitions = new (0, _uniformTransitionManagerDefault.default)(this.context.timeline);\n                this.internalState.onAsyncPropUpdated = this._onAsyncPropUpdated.bind(this);\n                this.internalState.setAsyncProps(this.props);\n            }\n        },\n        {\n            key: \"_transferState\",\n            value: function _transferState(oldLayer) {\n                (0, _debugDefault.default)(TRACE_MATCHED, this, this === oldLayer);\n                var state = oldLayer.state, internalState = oldLayer.internalState;\n                (0, _assertDefault.default)(state && internalState);\n                if (this === oldLayer) return;\n                this.internalState = internalState;\n                this.internalState.layer = this;\n                this.state = state;\n                this.internalState.setAsyncProps(this.props);\n                this.diffProps(this.props, this.internalState.getOldProps());\n            }\n        },\n        {\n            key: \"_onAsyncPropUpdated\",\n            value: function _onAsyncPropUpdated() {\n                this.diffProps(this.props, this.internalState.getOldProps());\n                this.setNeedsUpdate();\n            }\n        },\n        {\n            key: \"isLoaded\",\n            get: function get() {\n                return this.internalState && !this.internalState.isAsyncPropLoading();\n            }\n        },\n        {\n            key: \"wrapLongitude\",\n            get: function get() {\n                return this.props.wrapLongitude;\n            }\n        }\n    ]);\n    return Layer1;\n}((0, _componentDefault.default));\nLayer.layerName = \"Layer\";\nLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./constants\":\"inuJE\",\"./attribute/attribute-manager\":\"kXI0a\",\"./uniform-transition-manager\":\"3If9T\",\"../lifecycle/props\":\"7ZIma\",\"../utils/count\":\"6uGyN\",\"../utils/log\":\"1biSe\",\"../debug\":\"hpEQF\",\"@luma.gl/core\":\"WBJLR\",\"../utils/assert\":\"1unZV\",\"../utils/memoize\":\"d1jje\",\"../utils/shader\":\"figJs\",\"../shaderlib/project/project-functions\":\"l4E6R\",\"../utils/typed-array-manager\":\"4DbDw\",\"../lifecycle/component\":\"bSDti\",\"./layer-state\":\"gPQ8O\",\"@math.gl/web-mercator\":\"agpg6\",\"@loaders.gl/core\":\"kiTkb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kXI0a\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>AttributeManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _attribute = require(\"./attribute\");\nvar _attributeDefault = parcelHelpers.interopDefault(_attribute);\nvar _log = require(\"../../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _debug = require(\"../../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _attributeTransitionManager = require(\"./attribute-transition-manager\");\nvar _attributeTransitionManagerDefault = parcelHelpers.interopDefault(_attributeTransitionManager);\nvar TRACE_INVALIDATE = \"attributeManager.invalidate\";\nvar TRACE_UPDATE_START = \"attributeManager.updateStart\";\nvar TRACE_UPDATE_END = \"attributeManager.updateEnd\";\nvar TRACE_ATTRIBUTE_UPDATE_START = \"attribute.updateStart\";\nvar TRACE_ATTRIBUTE_ALLOCATE = \"attribute.allocate\";\nvar TRACE_ATTRIBUTE_UPDATE_END = \"attribute.updateEnd\";\nvar AttributeManager = function() {\n    function AttributeManager1(gl) {\n        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$id = _ref.id, id = _ref$id === void 0 ? \"attribute-manager\" : _ref$id, stats = _ref.stats, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, AttributeManager1);\n        this.id = id;\n        this.gl = gl;\n        this.attributes = {};\n        this.updateTriggers = {};\n        this.accessors = {};\n        this.needsRedraw = true;\n        this.userData = {};\n        this.stats = stats;\n        this.attributeTransitionManager = new (0, _attributeTransitionManagerDefault.default)(gl, {\n            id: \"\".concat(id, \"-transitions\"),\n            timeline: timeline\n        });\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(AttributeManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var attributeName in this.attributes)this.attributes[attributeName][\"delete\"]();\n                this.attributeTransitionManager.finalize();\n            }\n        },\n        {\n            key: \"getNeedsRedraw\",\n            value: function getNeedsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this.needsRedraw;\n                this.needsRedraw = this.needsRedraw && !opts.clearRedrawFlags;\n                return redraw && this.id;\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw() {\n                var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n                this.needsRedraw = true;\n                return this;\n            }\n        },\n        {\n            key: \"add\",\n            value: function add(attributes, updaters) {\n                this._add(attributes, updaters);\n            }\n        },\n        {\n            key: \"addInstanced\",\n            value: function addInstanced(attributes, updaters) {\n                this._add(attributes, updaters, {\n                    instanced: 1\n                });\n            }\n        },\n        {\n            key: \"remove\",\n            value: function remove(attributeNameArray) {\n                for(var i = 0; i < attributeNameArray.length; i++){\n                    var name = attributeNameArray[i];\n                    if (this.attributes[name] !== undefined) {\n                        this.attributes[name][\"delete\"]();\n                        delete this.attributes[name];\n                    }\n                }\n            }\n        },\n        {\n            key: \"invalidate\",\n            value: function invalidate(triggerName, dataRange) {\n                var invalidatedAttributes = this._invalidateTrigger(triggerName, dataRange);\n                (0, _debugDefault.default)(TRACE_INVALIDATE, this, triggerName, invalidatedAttributes);\n            }\n        },\n        {\n            key: \"invalidateAll\",\n            value: function invalidateAll(dataRange) {\n                for(var attributeName in this.attributes)this.attributes[attributeName].setNeedsUpdate(attributeName, dataRange);\n                (0, _debugDefault.default)(TRACE_INVALIDATE, this, \"all\");\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, data = _ref2.data, numInstances = _ref2.numInstances, _ref2$startIndices = _ref2.startIndices, startIndices = _ref2$startIndices === void 0 ? null : _ref2$startIndices, transitions = _ref2.transitions, _ref2$props = _ref2.props, props = _ref2$props === void 0 ? {} : _ref2$props, _ref2$buffers = _ref2.buffers, buffers = _ref2$buffers === void 0 ? {} : _ref2$buffers, _ref2$context = _ref2.context, context = _ref2$context === void 0 ? {} : _ref2$context;\n                var updated = false;\n                (0, _debugDefault.default)(TRACE_UPDATE_START, this);\n                if (this.stats) this.stats.get(\"Update Attributes\").timeStart();\n                for(var attributeName in this.attributes){\n                    var attribute = this.attributes[attributeName];\n                    var accessorName = attribute.settings.accessor;\n                    attribute.startIndices = startIndices;\n                    if (props[attributeName]) (0, _logDefault.default).removed(\"props.\".concat(attributeName), \"data.attributes.\".concat(attributeName))();\n                    if (attribute.setExternalBuffer(buffers[attributeName])) ;\n                    else if (attribute.setBinaryValue(buffers[accessorName], data.startIndices)) ;\n                    else if (!buffers[accessorName] && attribute.setConstantValue(props[accessorName])) ;\n                    else if (attribute.needsUpdate()) {\n                        updated = true;\n                        this._updateAttribute({\n                            attribute: attribute,\n                            numInstances: numInstances,\n                            data: data,\n                            props: props,\n                            context: context\n                        });\n                    }\n                    this.needsRedraw |= attribute.needsRedraw();\n                }\n                if (updated) (0, _debugDefault.default)(TRACE_UPDATE_END, this, numInstances);\n                if (this.stats) this.stats.get(\"Update Attributes\").timeEnd();\n                this.attributeTransitionManager.update({\n                    attributes: this.attributes,\n                    numInstances: numInstances,\n                    transitions: transitions\n                });\n            }\n        },\n        {\n            key: \"updateTransition\",\n            value: function updateTransition() {\n                var attributeTransitionManager = this.attributeTransitionManager;\n                var transitionUpdated = attributeTransitionManager.run();\n                this.needsRedraw = this.needsRedraw || transitionUpdated;\n                return transitionUpdated;\n            }\n        },\n        {\n            key: \"getAttributes\",\n            value: function getAttributes() {\n                return this.attributes;\n            }\n        },\n        {\n            key: \"getChangedAttributes\",\n            value: function getChangedAttributes() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearChangedFlags: false\n                };\n                var attributes = this.attributes, attributeTransitionManager = this.attributeTransitionManager;\n                var changedAttributes = Object.assign({}, attributeTransitionManager.getAttributes());\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    if (attribute.needsRedraw(opts) && !attributeTransitionManager.hasAttribute(attributeName)) changedAttributes[attributeName] = attribute;\n                }\n                return changedAttributes;\n            }\n        },\n        {\n            key: \"getShaderAttributes\",\n            value: function getShaderAttributes(attributes) {\n                var excludeAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                if (!attributes) attributes = this.getAttributes();\n                var shaderAttributes = {};\n                for(var attributeName in attributes)if (!excludeAttributes[attributeName]) Object.assign(shaderAttributes, attributes[attributeName].getShaderAttributes());\n                return shaderAttributes;\n            }\n        },\n        {\n            key: \"getAccessors\",\n            value: function getAccessors() {\n                return this.updateTriggers;\n            }\n        },\n        {\n            key: \"_add\",\n            value: function _add(attributes, updaters) {\n                var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n                if (updaters) (0, _logDefault.default).warn(\"AttributeManager.add({updaters}) - updater map no longer supported\")();\n                var newAttributes = {};\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    var newAttribute = this._createAttribute(attributeName, attribute, extraProps);\n                    newAttributes[attributeName] = newAttribute;\n                }\n                Object.assign(this.attributes, newAttributes);\n                this._mapUpdateTriggersToAttributes();\n            }\n        },\n        {\n            key: \"_createAttribute\",\n            value: function _createAttribute(name, attribute, extraProps) {\n                var props = {\n                    id: name,\n                    constant: attribute.constant || false,\n                    isIndexed: attribute.isIndexed || attribute.elements,\n                    size: attribute.elements && 1 || attribute.size,\n                    value: attribute.value || null,\n                    divisor: attribute.instanced || extraProps.instanced ? 1 : attribute.divisor\n                };\n                return new (0, _attributeDefault.default)(this.gl, Object.assign({}, attribute, props));\n            }\n        },\n        {\n            key: \"_mapUpdateTriggersToAttributes\",\n            value: function _mapUpdateTriggersToAttributes() {\n                var _this = this;\n                var triggers = {};\n                var _loop = function _loop(attributeName) {\n                    var attribute = _this.attributes[attributeName];\n                    attribute.getUpdateTriggers().forEach(function(triggerName) {\n                        if (!triggers[triggerName]) triggers[triggerName] = [];\n                        triggers[triggerName].push(attributeName);\n                    });\n                };\n                for(var attributeName1 in this.attributes)_loop(attributeName1);\n                this.updateTriggers = triggers;\n            }\n        },\n        {\n            key: \"_invalidateTrigger\",\n            value: function _invalidateTrigger(triggerName, dataRange) {\n                var attributes = this.attributes, updateTriggers = this.updateTriggers;\n                var invalidatedAttributes = updateTriggers[triggerName];\n                if (invalidatedAttributes) invalidatedAttributes.forEach(function(name) {\n                    var attribute = attributes[name];\n                    if (attribute) attribute.setNeedsUpdate(attribute.id, dataRange);\n                });\n                return invalidatedAttributes;\n            }\n        },\n        {\n            key: \"_updateAttribute\",\n            value: function _updateAttribute(opts) {\n                var attribute = opts.attribute, numInstances = opts.numInstances;\n                (0, _debugDefault.default)(TRACE_ATTRIBUTE_UPDATE_START, attribute);\n                if (attribute.allocate(numInstances)) (0, _debugDefault.default)(TRACE_ATTRIBUTE_ALLOCATE, attribute, numInstances);\n                var updated = attribute.updateBuffer(opts);\n                if (updated) {\n                    this.needsRedraw = true;\n                    (0, _debugDefault.default)(TRACE_ATTRIBUTE_UPDATE_END, attribute, numInstances);\n                }\n            }\n        }\n    ]);\n    return AttributeManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./attribute\":\"1hvhV\",\"../../utils/log\":\"1biSe\",\"../../debug\":\"hpEQF\",\"./attribute-transition-manager\":\"gLLlZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1hvhV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Attribute);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _dataColumn = require(\"./data-column\");\nvar _dataColumnDefault = parcelHelpers.interopDefault(_dataColumn);\nvar _assert = require(\"../../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _iterableUtils = require(\"../../utils/iterable-utils\");\nvar _flatten = require(\"../../utils/flatten\");\nvar _range = require(\"../../utils/range\");\nvar _attributeTransitionUtils = require(\"./attribute-transition-utils\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar Attribute = function(_DataColumn) {\n    (0, _inheritsDefault.default)(Attribute1, _DataColumn);\n    var _super = _createSuper(Attribute1);\n    function Attribute1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Attribute1);\n        _this = _super.call(this, gl, opts);\n        var _opts$transition = opts.transition, transition = _opts$transition === void 0 ? false : _opts$transition, _opts$noAlloc = opts.noAlloc, noAlloc = _opts$noAlloc === void 0 ? false : _opts$noAlloc, _opts$update = opts.update, update = _opts$update === void 0 ? null : _opts$update, _opts$accessor = opts.accessor, accessor = _opts$accessor === void 0 ? null : _opts$accessor, _opts$transform = opts.transform, transform = _opts$transform === void 0 ? null : _opts$transform, _opts$startIndices = opts.startIndices, startIndices = _opts$startIndices === void 0 ? null : _opts$startIndices;\n        Object.assign(_this.settings, {\n            transition: transition,\n            noAlloc: noAlloc,\n            update: update || accessor && _this._autoUpdater,\n            accessor: accessor,\n            transform: transform\n        });\n        Object.assign(_this.state, {\n            lastExternalBuffer: null,\n            binaryValue: null,\n            binaryAccessor: null,\n            needsUpdate: true,\n            needsRedraw: false,\n            updateRanges: _range.FULL,\n            startIndices: startIndices\n        });\n        Object.seal(_this.settings);\n        Object.seal(_this.state);\n        _this._validateAttributeUpdaters();\n        return _this;\n    }\n    (0, _createClassDefault.default)(Attribute1, [\n        {\n            key: \"needsUpdate\",\n            value: function needsUpdate() {\n                return this.state.needsUpdate;\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$clearChangedFlag = _ref.clearChangedFlags, clearChangedFlags = _ref$clearChangedFlag === void 0 ? false : _ref$clearChangedFlag;\n                var needsRedraw = this.state.needsRedraw;\n                this.state.needsRedraw = needsRedraw && !clearChangedFlags;\n                return needsRedraw;\n            }\n        },\n        {\n            key: \"getUpdateTriggers\",\n            value: function getUpdateTriggers() {\n                var accessor = this.settings.accessor;\n                return [\n                    this.id\n                ].concat(typeof accessor !== \"function\" && accessor || []);\n            }\n        },\n        {\n            key: \"supportsTransition\",\n            value: function supportsTransition() {\n                return Boolean(this.settings.transition);\n            }\n        },\n        {\n            key: \"getTransitionSetting\",\n            value: function getTransitionSetting(opts) {\n                var accessor = this.settings.accessor;\n                var layerSettings = this.settings.transition;\n                if (!this.supportsTransition()) return null;\n                var userSettings = Array.isArray(accessor) ? opts[accessor.find(function(a) {\n                    return opts[a];\n                })] : opts[accessor];\n                return (0, _attributeTransitionUtils.normalizeTransitionSettings)(userSettings, layerSettings);\n            }\n        },\n        {\n            key: \"setNeedsUpdate\",\n            value: function setNeedsUpdate() {\n                var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.id;\n                var dataRange = arguments.length > 1 ? arguments[1] : undefined;\n                this.state.needsUpdate = this.state.needsUpdate || reason;\n                this.setNeedsRedraw(reason);\n                if (dataRange) {\n                    var _dataRange$startRow = dataRange.startRow, startRow = _dataRange$startRow === void 0 ? 0 : _dataRange$startRow, _dataRange$endRow = dataRange.endRow, endRow = _dataRange$endRow === void 0 ? Infinity : _dataRange$endRow;\n                    this.state.updateRanges = _range.add(this.state.updateRanges, [\n                        startRow,\n                        endRow\n                    ]);\n                } else this.state.updateRanges = _range.FULL;\n            }\n        },\n        {\n            key: \"clearNeedsUpdate\",\n            value: function clearNeedsUpdate() {\n                this.state.needsUpdate = false;\n                this.state.updateRanges = _range.EMPTY;\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw() {\n                var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.id;\n                this.state.needsRedraw = this.state.needsRedraw || reason;\n            }\n        },\n        {\n            key: \"update\",\n            value: function update(opts) {\n                this.setData(opts);\n            }\n        },\n        {\n            key: \"allocate\",\n            value: function allocate(numInstances) {\n                var state = this.state, settings = this.settings;\n                if (settings.noAlloc) return false;\n                if (settings.update) {\n                    (0, _assertDefault.default)(Number.isFinite(numInstances));\n                    (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Attribute1.prototype), \"allocate\", this).call(this, {\n                        numInstances: numInstances,\n                        copy: state.updateRanges !== _range.FULL\n                    });\n                    return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"updateBuffer\",\n            value: function updateBuffer(_ref2) {\n                var numInstances = _ref2.numInstances, data = _ref2.data, props = _ref2.props, context = _ref2.context;\n                if (!this.needsUpdate()) return false;\n                var updateRanges = this.state.updateRanges, _this$settings = this.settings, update = _this$settings.update, noAlloc = _this$settings.noAlloc;\n                var updated = true;\n                if (update) {\n                    var _iterator = _createForOfIteratorHelper(updateRanges), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var _step$value = (0, _slicedToArrayDefault.default)(_step.value, 2), _startRow = _step$value[0], _endRow = _step$value[1];\n                            update.call(context, this, {\n                                data: data,\n                                startRow: _startRow,\n                                endRow: _endRow,\n                                props: props,\n                                numInstances: numInstances\n                            });\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    if (!this.value) ;\n                    else if (this.constant || this.buffer.byteLength < this.value.byteLength + this.byteOffset) this.setData({\n                        value: this.value,\n                        constant: this.constant\n                    });\n                    else {\n                        var _iterator2 = _createForOfIteratorHelper(updateRanges), _step2;\n                        try {\n                            for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                                var _step2$value = (0, _slicedToArrayDefault.default)(_step2.value, 2), startRow = _step2$value[0], endRow = _step2$value[1];\n                                var startOffset = Number.isFinite(startRow) ? this.getVertexOffset(startRow) : 0;\n                                var endOffset = Number.isFinite(endRow) ? this.getVertexOffset(endRow) : noAlloc || !Number.isFinite(numInstances) ? this.value.length : numInstances * this.size;\n                                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Attribute1.prototype), \"updateSubBuffer\", this).call(this, {\n                                    startOffset: startOffset,\n                                    endOffset: endOffset\n                                });\n                            }\n                        } catch (err) {\n                            _iterator2.e(err);\n                        } finally{\n                            _iterator2.f();\n                        }\n                    }\n                    this._checkAttributeArray();\n                } else updated = false;\n                this.clearNeedsUpdate();\n                this.setNeedsRedraw();\n                return updated;\n            }\n        },\n        {\n            key: \"setConstantValue\",\n            value: function setConstantValue(value) {\n                if (value === undefined || typeof value === \"function\") return false;\n                var hasChanged = this.setData({\n                    constant: true,\n                    value: value\n                });\n                if (hasChanged) this.setNeedsRedraw();\n                this.clearNeedsUpdate();\n                return true;\n            }\n        },\n        {\n            key: \"setExternalBuffer\",\n            value: function setExternalBuffer(buffer) {\n                var state = this.state;\n                if (!buffer) {\n                    state.lastExternalBuffer = null;\n                    return false;\n                }\n                this.clearNeedsUpdate();\n                if (state.lastExternalBuffer === buffer) return true;\n                state.lastExternalBuffer = buffer;\n                this.setNeedsRedraw();\n                this.setData(buffer);\n                return true;\n            }\n        },\n        {\n            key: \"setBinaryValue\",\n            value: function setBinaryValue(buffer) {\n                var startIndices = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n                var state = this.state, settings = this.settings;\n                if (!buffer) {\n                    state.binaryValue = null;\n                    state.binaryAccessor = null;\n                    return false;\n                }\n                if (settings.noAlloc) return false;\n                if (state.binaryValue === buffer) {\n                    this.clearNeedsUpdate();\n                    return true;\n                }\n                state.binaryValue = buffer;\n                this.setNeedsRedraw();\n                if (ArrayBuffer.isView(buffer)) buffer = {\n                    value: buffer\n                };\n                var needsUpdate = settings.transform || startIndices !== this.startIndices;\n                if (needsUpdate) {\n                    (0, _assertDefault.default)(ArrayBuffer.isView(buffer.value), \"invalid \".concat(settings.accessor));\n                    var needsNormalize = buffer.size && buffer.size !== this.size;\n                    state.binaryAccessor = (0, _iterableUtils.getAccessorFromBuffer)(buffer.value, {\n                        size: buffer.size || this.size,\n                        stride: buffer.stride,\n                        offset: buffer.offset,\n                        startIndices: startIndices,\n                        nested: needsNormalize\n                    });\n                    return false;\n                }\n                this.clearNeedsUpdate();\n                this.setData(buffer);\n                return true;\n            }\n        },\n        {\n            key: \"getVertexOffset\",\n            value: function getVertexOffset(row) {\n                var startIndices = this.startIndices;\n                var vertexIndex = startIndices ? startIndices[row] : row;\n                return vertexIndex * this.size;\n            }\n        },\n        {\n            key: \"getShaderAttributes\",\n            value: function getShaderAttributes() {\n                var shaderAttributeDefs = this.settings.shaderAttributes || (0, _definePropertyDefault.default)({}, this.id, null);\n                var shaderAttributes = {};\n                for(var shaderAttributeName in shaderAttributeDefs)Object.assign(shaderAttributes, (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Attribute1.prototype), \"getShaderAttributes\", this).call(this, shaderAttributeName, shaderAttributeDefs[shaderAttributeName]));\n                return shaderAttributes;\n            }\n        },\n        {\n            key: \"_autoUpdater\",\n            value: function _autoUpdater(attribute, _ref4) {\n                var data = _ref4.data, startRow = _ref4.startRow, endRow = _ref4.endRow, props = _ref4.props, numInstances = _ref4.numInstances;\n                if (attribute.constant) return;\n                var settings = attribute.settings, state = attribute.state, value = attribute.value, size = attribute.size, startIndices = attribute.startIndices;\n                var accessor = settings.accessor, transform = settings.transform;\n                var accessorFunc = state.binaryAccessor || (typeof accessor === \"function\" ? accessor : props[accessor]);\n                (0, _assertDefault.default)(typeof accessorFunc === \"function\", 'accessor \"'.concat(accessor, '\" is not a function'));\n                var i = attribute.getVertexOffset(startRow);\n                var _createIterable = (0, _iterableUtils.createIterable)(data, startRow, endRow), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n                var _iterator3 = _createForOfIteratorHelper(iterable), _step3;\n                try {\n                    for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                        var object = _step3.value;\n                        objectInfo.index++;\n                        var objectValue = accessorFunc(object, objectInfo);\n                        if (transform) objectValue = transform.call(this, objectValue);\n                        if (startIndices) {\n                            var numVertices = (objectInfo.index < startIndices.length - 1 ? startIndices[objectInfo.index + 1] : numInstances) - startIndices[objectInfo.index];\n                            if (objectValue && Array.isArray(objectValue[0])) {\n                                var startIndex = i;\n                                var _iterator4 = _createForOfIteratorHelper(objectValue), _step4;\n                                try {\n                                    for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n                                        var item = _step4.value;\n                                        attribute._normalizeValue(item, value, startIndex);\n                                        startIndex += size;\n                                    }\n                                } catch (err) {\n                                    _iterator4.e(err);\n                                } finally{\n                                    _iterator4.f();\n                                }\n                            } else if (objectValue && objectValue.length > size) value.set(objectValue, i);\n                            else {\n                                attribute._normalizeValue(objectValue, objectInfo.target, 0);\n                                (0, _flatten.fillArray)({\n                                    target: value,\n                                    source: objectInfo.target,\n                                    start: i,\n                                    count: numVertices\n                                });\n                            }\n                            i += numVertices * size;\n                        } else {\n                            attribute._normalizeValue(objectValue, value, i);\n                            i += size;\n                        }\n                    }\n                } catch (err) {\n                    _iterator3.e(err);\n                } finally{\n                    _iterator3.f();\n                }\n            }\n        },\n        {\n            key: \"_validateAttributeUpdaters\",\n            value: function _validateAttributeUpdaters() {\n                var settings = this.settings;\n                var hasUpdater = settings.noAlloc || typeof settings.update === \"function\";\n                if (!hasUpdater) throw new Error(\"Attribute \".concat(this.id, \" missing update or accessor\"));\n            }\n        },\n        {\n            key: \"_checkAttributeArray\",\n            value: function _checkAttributeArray() {\n                var value = this.value;\n                var limit = Math.min(4, this.size);\n                if (value && value.length >= limit) {\n                    var valid = true;\n                    switch(limit){\n                        case 4:\n                            valid = valid && Number.isFinite(value[3]);\n                        case 3:\n                            valid = valid && Number.isFinite(value[2]);\n                        case 2:\n                            valid = valid && Number.isFinite(value[1]);\n                        case 1:\n                            valid = valid && Number.isFinite(value[0]);\n                            break;\n                        default:\n                            valid = false;\n                    }\n                    if (!valid) throw new Error(\"Illegal attribute generated for \".concat(this.id));\n                }\n            }\n        },\n        {\n            key: \"startIndices\",\n            get: function get() {\n                return this.state.startIndices;\n            },\n            set: function set(layout) {\n                this.state.startIndices = layout;\n            }\n        }\n    ]);\n    return Attribute1;\n}((0, _dataColumnDefault.default));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./data-column\":\"fM7GL\",\"../../utils/assert\":\"1unZV\",\"../../utils/iterable-utils\":\"kj5eS\",\"../../utils/flatten\":\"i8Kfk\",\"../../utils/range\":\"aFIyq\",\"./attribute-transition-utils\":\"2cbK8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fM7GL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>DataColumn);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _core = require(\"@luma.gl/core\");\nvar _shaderAttribute = require(\"./shader-attribute\");\nvar _shaderAttributeDefault = parcelHelpers.interopDefault(_shaderAttribute);\nvar _glUtils = require(\"./gl-utils\");\nvar _typedArrayManager = require(\"../../utils/typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _mathUtils = require(\"../../utils/math-utils\");\nvar _log = require(\"../../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction getStride(accessor) {\n    return accessor.stride || accessor.size * accessor.bytesPerElement;\n}\nfunction resolveShaderAttribute(baseAccessor, shaderAttributeOptions) {\n    if (shaderAttributeOptions.offset) (0, _logDefault.default).removed(\"shaderAttribute.offset\", \"vertexOffset, elementOffset\")();\n    var stride = getStride(baseAccessor);\n    var vertexOffset = \"vertexOffset\" in shaderAttributeOptions ? shaderAttributeOptions.vertexOffset : baseAccessor.vertexOffset || 0;\n    var elementOffset = shaderAttributeOptions.elementOffset || 0;\n    var offset = vertexOffset * stride + elementOffset * baseAccessor.bytesPerElement + (baseAccessor.offset || 0);\n    return _objectSpread(_objectSpread({}, shaderAttributeOptions), {}, {\n        offset: offset,\n        stride: stride\n    });\n}\nfunction resolveDoublePrecisionShaderAttributes(baseAccessor, shaderAttributeOptions) {\n    var resolvedOptions = resolveShaderAttribute(baseAccessor, shaderAttributeOptions);\n    return {\n        high: resolvedOptions,\n        low: _objectSpread(_objectSpread({}, resolvedOptions), {}, {\n            offset: resolvedOptions.offset + baseAccessor.size * 4\n        })\n    };\n}\nvar DataColumn = function() {\n    function DataColumn1(gl, opts) {\n        (0, _classCallCheckDefault.default)(this, DataColumn1);\n        this.gl = gl;\n        this.id = opts.id;\n        this.size = opts.size;\n        var logicalType = opts.logicalType || opts.type;\n        var doublePrecision = logicalType === 5130;\n        var defaultValue = opts.defaultValue;\n        defaultValue = Number.isFinite(defaultValue) ? [\n            defaultValue\n        ] : defaultValue || new Array(this.size).fill(0);\n        opts.defaultValue = defaultValue;\n        var bufferType = logicalType;\n        if (doublePrecision) bufferType = 5126;\n        else if (!bufferType && opts.isIndexed) bufferType = gl && (0, _core.hasFeature)(gl, (0, _core.FEATURES).ELEMENT_INDEX_UINT32) ? 5125 : 5123;\n        else if (!bufferType) bufferType = 5126;\n        opts.logicalType = logicalType;\n        opts.type = bufferType;\n        var defaultType = (0, _glUtils.glArrayFromType)(logicalType || bufferType || 5126);\n        this.shaderAttributes = {};\n        this.doublePrecision = doublePrecision;\n        if (doublePrecision && opts.fp64 === false) defaultType = Float32Array;\n        opts.bytesPerElement = defaultType.BYTES_PER_ELEMENT;\n        this.defaultType = defaultType;\n        this.value = null;\n        this.settings = opts;\n        this.state = {\n            externalBuffer: null,\n            bufferAccessor: opts,\n            allocatedValue: null,\n            constant: false\n        };\n        this._buffer = null;\n        this.setData(opts);\n    }\n    (0, _createClassDefault.default)(DataColumn1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                if (this._buffer) {\n                    this._buffer[\"delete\"]();\n                    this._buffer = null;\n                }\n                (0, _typedArrayManagerDefault.default).release(this.state.allocatedValue);\n            }\n        },\n        {\n            key: \"getShaderAttributes\",\n            value: function getShaderAttributes(id, options) {\n                if (this.doublePrecision) {\n                    var shaderAttributes = {};\n                    var isBuffer64Bit = this.value instanceof Float64Array;\n                    var doubleShaderAttributeDefs = resolveDoublePrecisionShaderAttributes(this.getAccessor(), options || {});\n                    shaderAttributes[id] = new (0, _shaderAttributeDefault.default)(this, doubleShaderAttributeDefs.high);\n                    shaderAttributes[\"\".concat(id, \"64Low\")] = isBuffer64Bit ? new (0, _shaderAttributeDefault.default)(this, doubleShaderAttributeDefs.low) : new Float32Array(this.size);\n                    return shaderAttributes;\n                }\n                if (options) {\n                    var shaderAttributeDef = resolveShaderAttribute(this.getAccessor(), options);\n                    return (0, _definePropertyDefault.default)({}, id, new (0, _shaderAttributeDefault.default)(this, shaderAttributeDef));\n                }\n                return (0, _definePropertyDefault.default)({}, id, this);\n            }\n        },\n        {\n            key: \"getBuffer\",\n            value: function getBuffer() {\n                if (this.state.constant) return null;\n                return this.state.externalBuffer || this._buffer;\n            }\n        },\n        {\n            key: \"getValue\",\n            value: function getValue() {\n                if (this.state.constant) return this.value;\n                return [\n                    this.getBuffer(),\n                    this.getAccessor()\n                ];\n            }\n        },\n        {\n            key: \"getAccessor\",\n            value: function getAccessor() {\n                return this.state.bufferAccessor;\n            }\n        },\n        {\n            key: \"setData\",\n            value: function setData(opts) {\n                var state = this.state;\n                if (ArrayBuffer.isView(opts)) opts = {\n                    value: opts\n                };\n                else if (opts instanceof (0, _core.Buffer)) opts = {\n                    buffer: opts\n                };\n                var accessor = _objectSpread(_objectSpread({}, this.settings), opts);\n                state.bufferAccessor = accessor;\n                if (opts.constant) {\n                    var value = opts.value;\n                    value = this._normalizeValue(value, [], 0);\n                    if (this.settings.normalized) value = this._normalizeConstant(value);\n                    var hasChanged = !state.constant || !this._areValuesEqual(value, this.value);\n                    if (!hasChanged) return false;\n                    state.externalBuffer = null;\n                    state.constant = true;\n                    this.value = value;\n                } else if (opts.buffer) {\n                    var buffer = opts.buffer;\n                    state.externalBuffer = buffer;\n                    state.constant = false;\n                    this.value = opts.value;\n                    var isBuffer64Bit = opts.value instanceof Float64Array;\n                    accessor.type = opts.type || buffer.accessor.type;\n                    accessor.bytesPerElement = buffer.accessor.BYTES_PER_ELEMENT * (isBuffer64Bit ? 2 : 1);\n                    accessor.stride = getStride(accessor);\n                } else if (opts.value) {\n                    this._checkExternalBuffer(opts);\n                    var _value = opts.value;\n                    state.externalBuffer = null;\n                    state.constant = false;\n                    this.value = _value;\n                    accessor.bytesPerElement = _value.BYTES_PER_ELEMENT;\n                    accessor.stride = getStride(accessor);\n                    var _buffer = this.buffer, byteOffset = this.byteOffset;\n                    if (this.doublePrecision && _value instanceof Float64Array) _value = (0, _mathUtils.toDoublePrecisionArray)(_value, accessor);\n                    var requiredBufferSize = _value.byteLength + byteOffset + accessor.stride * 2;\n                    if (_buffer.byteLength < requiredBufferSize) _buffer.reallocate(requiredBufferSize);\n                    _buffer.setAccessor(null);\n                    _buffer.subData({\n                        data: _value,\n                        offset: byteOffset\n                    });\n                    accessor.type = opts.type || _buffer.accessor.type;\n                }\n                return true;\n            }\n        },\n        {\n            key: \"updateSubBuffer\",\n            value: function updateSubBuffer() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var value = this.value;\n                var _opts$startOffset = opts.startOffset, startOffset = _opts$startOffset === void 0 ? 0 : _opts$startOffset, endOffset = opts.endOffset;\n                this.buffer.subData({\n                    data: this.doublePrecision && value instanceof Float64Array ? (0, _mathUtils.toDoublePrecisionArray)(value, {\n                        size: this.size,\n                        startIndex: startOffset,\n                        endIndex: endOffset\n                    }) : value.subarray(startOffset, endOffset),\n                    offset: startOffset * value.BYTES_PER_ELEMENT + this.byteOffset\n                });\n            }\n        },\n        {\n            key: \"allocate\",\n            value: function allocate(_ref3) {\n                var numInstances = _ref3.numInstances, _ref3$copy = _ref3.copy, copy = _ref3$copy === void 0 ? false : _ref3$copy;\n                var state = this.state;\n                var oldValue = state.allocatedValue;\n                var value = (0, _typedArrayManagerDefault.default).allocate(oldValue, numInstances + 1, {\n                    size: this.size,\n                    type: this.defaultType,\n                    copy: copy\n                });\n                this.value = value;\n                var buffer = this.buffer, byteOffset = this.byteOffset;\n                if (buffer.byteLength < value.byteLength + byteOffset) {\n                    buffer.reallocate(value.byteLength + byteOffset);\n                    if (copy && oldValue) buffer.subData({\n                        data: oldValue instanceof Float64Array ? (0, _mathUtils.toDoublePrecisionArray)(oldValue, this) : oldValue,\n                        offset: byteOffset\n                    });\n                }\n                state.allocatedValue = value;\n                state.constant = false;\n                state.externalBuffer = null;\n                state.bufferAccessor = this.settings;\n                return true;\n            }\n        },\n        {\n            key: \"_checkExternalBuffer\",\n            value: function _checkExternalBuffer(opts) {\n                var value = opts.value;\n                if (!opts.constant && value) {\n                    var ArrayType = this.defaultType;\n                    var illegalArrayType = false;\n                    if (this.doublePrecision) illegalArrayType = value.BYTES_PER_ELEMENT < 4;\n                    if (illegalArrayType) throw new Error(\"Attribute \".concat(this.id, \" does not support \").concat(value.constructor.name));\n                    if (!(value instanceof ArrayType) && this.settings.normalized && !(\"normalized\" in opts)) (0, _logDefault.default).warn(\"Attribute \".concat(this.id, \" is normalized\"))();\n                }\n            }\n        },\n        {\n            key: \"_normalizeConstant\",\n            value: function _normalizeConstant(value) {\n                switch(this.settings.type){\n                    case 5120:\n                        return new Float32Array(value).map(function(x) {\n                            return (x + 128) / 255 * 2 - 1;\n                        });\n                    case 5122:\n                        return new Float32Array(value).map(function(x) {\n                            return (x + 32768) / 65535 * 2 - 1;\n                        });\n                    case 5121:\n                        return new Float32Array(value).map(function(x) {\n                            return x / 255;\n                        });\n                    case 5123:\n                        return new Float32Array(value).map(function(x) {\n                            return x / 65535;\n                        });\n                    default:\n                        return value;\n                }\n            }\n        },\n        {\n            key: \"_normalizeValue\",\n            value: function _normalizeValue(value, out, start) {\n                var _this$settings = this.settings, defaultValue = _this$settings.defaultValue, size = _this$settings.size;\n                if (Number.isFinite(value)) {\n                    out[start] = value;\n                    return out;\n                }\n                if (!value) {\n                    out[start] = defaultValue[0];\n                    return out;\n                }\n                switch(size){\n                    case 4:\n                        out[start + 3] = Number.isFinite(value[3]) ? value[3] : defaultValue[3];\n                    case 3:\n                        out[start + 2] = Number.isFinite(value[2]) ? value[2] : defaultValue[2];\n                    case 2:\n                        out[start + 1] = Number.isFinite(value[1]) ? value[1] : defaultValue[1];\n                    case 1:\n                        out[start + 0] = Number.isFinite(value[0]) ? value[0] : defaultValue[0];\n                        break;\n                    default:\n                        var i = size;\n                        while(--i >= 0)out[start + i] = Number.isFinite(value[i]) ? value[i] : defaultValue[i];\n                }\n                return out;\n            }\n        },\n        {\n            key: \"_areValuesEqual\",\n            value: function _areValuesEqual(value1, value2) {\n                if (!value1 || !value2) return false;\n                var size = this.size;\n                for(var i = 0; i < size; i++){\n                    if (value1[i] !== value2[i]) return false;\n                }\n                return true;\n            }\n        },\n        {\n            key: \"buffer\",\n            get: function get() {\n                if (!this._buffer) {\n                    var _this$settings2 = this.settings, isIndexed = _this$settings2.isIndexed, type = _this$settings2.type;\n                    this._buffer = new (0, _core.Buffer)(this.gl, {\n                        id: this.id,\n                        target: isIndexed ? 34963 : 34962,\n                        accessor: {\n                            type: type\n                        }\n                    });\n                }\n                return this._buffer;\n            }\n        },\n        {\n            key: \"byteOffset\",\n            get: function get() {\n                var accessor = this.getAccessor();\n                if (accessor.vertexOffset) return accessor.vertexOffset * getStride(accessor);\n                return 0;\n            }\n        }\n    ]);\n    return DataColumn1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@luma.gl/core\":\"WBJLR\",\"./shader-attribute\":\"6hGEM\",\"./gl-utils\":\"foPy9\",\"../../utils/typed-array-manager\":\"4DbDw\",\"../../utils/math-utils\":\"jzrEb\",\"../../utils/log\":\"1biSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6hGEM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ShaderAttribute);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar ShaderAttribute = function() {\n    function ShaderAttribute1(dataColumn, opts) {\n        (0, _classCallCheckDefault.default)(this, ShaderAttribute1);\n        this.opts = opts;\n        this.source = dataColumn;\n    }\n    (0, _createClassDefault.default)(ShaderAttribute1, [\n        {\n            key: \"getValue\",\n            value: function getValue() {\n                var buffer = this.source.getBuffer();\n                var accessor = this.getAccessor();\n                if (buffer) return [\n                    buffer,\n                    accessor\n                ];\n                var value = this.source.value;\n                var size = accessor.size;\n                var constantValue = value;\n                if (value && value.length !== size) {\n                    constantValue = new Float32Array(size);\n                    var index = accessor.elementOffset || 0;\n                    for(var i = 0; i < size; ++i)constantValue[i] = value[index + i];\n                }\n                return constantValue;\n            }\n        },\n        {\n            key: \"getAccessor\",\n            value: function getAccessor() {\n                return _objectSpread(_objectSpread({}, this.source.getAccessor()), this.opts);\n            }\n        },\n        {\n            key: \"value\",\n            get: function get() {\n                return this.source.value;\n            }\n        }\n    ]);\n    return ShaderAttribute1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"foPy9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"glArrayFromType\", ()=>glArrayFromType);\nfunction glArrayFromType(glType) {\n    switch(glType){\n        case 5126:\n            return Float32Array;\n        case 5130:\n            return Float64Array;\n        case 5123:\n        case 33635:\n        case 32819:\n        case 32820:\n            return Uint16Array;\n        case 5125:\n            return Uint32Array;\n        case 5121:\n            return Uint8ClampedArray;\n        case 5120:\n            return Int8Array;\n        case 5122:\n            return Int16Array;\n        case 5124:\n            return Int32Array;\n        default:\n            throw new Error(\"Unknown GL type\");\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kj5eS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createIterable\", ()=>createIterable);\nparcelHelpers.export(exports, \"isAsyncIterable\", ()=>isAsyncIterable);\nparcelHelpers.export(exports, \"getAccessorFromBuffer\", ()=>getAccessorFromBuffer);\nvar EMPTY_ARRAY = [];\nvar placeholderArray = [];\nfunction createIterable(data) {\n    var startRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    var endRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;\n    var iterable = EMPTY_ARRAY;\n    var objectInfo = {\n        index: -1,\n        data: data,\n        target: []\n    };\n    if (!data) iterable = EMPTY_ARRAY;\n    else if (typeof data[Symbol.iterator] === \"function\") iterable = data;\n    else if (data.length > 0) {\n        placeholderArray.length = data.length;\n        iterable = placeholderArray;\n    }\n    if (startRow > 0 || Number.isFinite(endRow)) {\n        iterable = (Array.isArray(iterable) ? iterable : Array.from(iterable)).slice(startRow, endRow);\n        objectInfo.index = startRow - 1;\n    }\n    return {\n        iterable: iterable,\n        objectInfo: objectInfo\n    };\n}\nfunction isAsyncIterable(data) {\n    return data && data[Symbol.asyncIterator];\n}\nfunction getAccessorFromBuffer(typedArray, _ref) {\n    var size = _ref.size, stride = _ref.stride, offset = _ref.offset, startIndices = _ref.startIndices, nested = _ref.nested;\n    var bytesPerElement = typedArray.BYTES_PER_ELEMENT;\n    var elementStride = stride ? stride / bytesPerElement : size;\n    var elementOffset = offset ? offset / bytesPerElement : 0;\n    var vertexCount = Math.floor((typedArray.length - elementOffset) / elementStride);\n    return function(_, _ref2) {\n        var index = _ref2.index, target = _ref2.target;\n        if (!startIndices) {\n            var sourceIndex = index * elementStride + elementOffset;\n            for(var j = 0; j < size; j++)target[j] = typedArray[sourceIndex + j];\n            return target;\n        }\n        var startIndex = startIndices[index];\n        var endIndex = startIndices[index + 1] || vertexCount;\n        var result;\n        if (nested) {\n            result = new Array(endIndex - startIndex);\n            for(var i = startIndex; i < endIndex; i++){\n                var _sourceIndex = i * elementStride + elementOffset;\n                target = new Array(size);\n                for(var _j = 0; _j < size; _j++)target[_j] = typedArray[_sourceIndex + _j];\n                result[i - startIndex] = target;\n            }\n        } else if (elementStride === size) result = typedArray.subarray(startIndex * size + elementOffset, endIndex * size + elementOffset);\n        else {\n            result = new typedArray.constructor((endIndex - startIndex) * size);\n            var targetIndex = 0;\n            for(var _i = startIndex; _i < endIndex; _i++){\n                var _sourceIndex2 = _i * elementStride + elementOffset;\n                for(var _j2 = 0; _j2 < size; _j2++)result[targetIndex++] = typedArray[_sourceIndex2 + _j2];\n            }\n        }\n        return result;\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i8Kfk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"flatten\", ()=>flatten);\nparcelHelpers.export(exports, \"fillArray\", ()=>fillArray);\nfunction flatten(array) {\n    var filter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function() {\n        return true;\n    };\n    if (!Array.isArray(array)) return filter(array) ? [\n        array\n    ] : [];\n    return flattenArray(array, filter, []);\n}\nfunction flattenArray(array, filter, result) {\n    var index = -1;\n    while(++index < array.length){\n        var value = array[index];\n        if (Array.isArray(value)) flattenArray(value, filter, result);\n        else if (filter(value)) result.push(value);\n    }\n    return result;\n}\nfunction fillArray(_ref) {\n    var target = _ref.target, source = _ref.source, _ref$start = _ref.start, start = _ref$start === void 0 ? 0 : _ref$start, _ref$count = _ref.count, count = _ref$count === void 0 ? 1 : _ref$count;\n    var length = source.length;\n    var total = count * length;\n    var copied = 0;\n    for(var i = start; copied < length; copied++)target[i++] = source[copied];\n    while(copied < total)if (copied < total - copied) {\n        target.copyWithin(start + copied, start, start + copied);\n        copied *= 2;\n    } else {\n        target.copyWithin(start + copied, start, start + total - copied);\n        copied = total;\n    }\n    return target;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aFIyq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"EMPTY\", ()=>EMPTY);\nparcelHelpers.export(exports, \"FULL\", ()=>FULL);\nparcelHelpers.export(exports, \"add\", ()=>add);\nvar EMPTY = [];\nvar FULL = [\n    [\n        0,\n        Infinity\n    ]\n];\nfunction add(rangeList, range) {\n    if (rangeList === FULL) return rangeList;\n    if (range[0] < 0) range[0] = 0;\n    if (range[0] >= range[1]) return rangeList;\n    var newRangeList = [];\n    var len = rangeList.length;\n    var insertPosition = 0;\n    for(var i = 0; i < len; i++){\n        var range0 = rangeList[i];\n        if (range0[1] < range[0]) {\n            newRangeList.push(range0);\n            insertPosition = i + 1;\n        } else if (range0[0] > range[1]) newRangeList.push(range0);\n        else range = [\n            Math.min(range0[0], range[0]),\n            Math.max(range0[1], range[1])\n        ];\n    }\n    newRangeList.splice(insertPosition, 0, range);\n    return newRangeList;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2cbK8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalizeTransitionSettings\", ()=>normalizeTransitionSettings);\nparcelHelpers.export(exports, \"getSourceBufferAttribute\", ()=>getSourceBufferAttribute);\nparcelHelpers.export(exports, \"getAttributeTypeFromSize\", ()=>getAttributeTypeFromSize);\nparcelHelpers.export(exports, \"cycleBuffers\", ()=>cycleBuffers);\nparcelHelpers.export(exports, \"getAttributeBufferLength\", ()=>getAttributeBufferLength);\nparcelHelpers.export(exports, \"padBuffer\", ()=>padBuffer);\nvar _arrayUtils = require(\"../../utils/array-utils\");\nvar DEFAULT_TRANSITION_SETTINGS = {\n    interpolation: {\n        duration: 0,\n        easing: function easing(t) {\n            return t;\n        }\n    },\n    spring: {\n        stiffness: 0.05,\n        damping: 0.5\n    }\n};\nfunction normalizeTransitionSettings(userSettings, layerSettings) {\n    if (!userSettings) return null;\n    if (Number.isFinite(userSettings)) userSettings = {\n        duration: userSettings\n    };\n    userSettings.type = userSettings.type || \"interpolation\";\n    return Object.assign({}, DEFAULT_TRANSITION_SETTINGS[userSettings.type], layerSettings, userSettings);\n}\nfunction getSourceBufferAttribute(gl, attribute) {\n    var buffer = attribute.getBuffer();\n    if (buffer) return [\n        attribute.getBuffer(),\n        {\n            divisor: 0,\n            size: attribute.size,\n            normalized: attribute.settings.normalized\n        }\n    ];\n    return attribute.value;\n}\nfunction getAttributeTypeFromSize(size) {\n    switch(size){\n        case 1:\n            return \"float\";\n        case 2:\n            return \"vec2\";\n        case 3:\n            return \"vec3\";\n        case 4:\n            return \"vec4\";\n        default:\n            throw new Error('No defined attribute type for size \"'.concat(size, '\"'));\n    }\n}\nfunction cycleBuffers(buffers) {\n    buffers.push(buffers.shift());\n}\nfunction getAttributeBufferLength(attribute, numInstances) {\n    var doublePrecision = attribute.doublePrecision, settings = attribute.settings, value = attribute.value, size = attribute.size;\n    var multiplier = doublePrecision ? 2 : 1;\n    return (settings.noAlloc ? value.length : numInstances * size) * multiplier;\n}\nfunction padBuffer(_ref) {\n    var buffer = _ref.buffer, numInstances = _ref.numInstances, attribute = _ref.attribute, fromLength = _ref.fromLength, fromStartIndices = _ref.fromStartIndices, _ref$getData = _ref.getData, getData = _ref$getData === void 0 ? function(x) {\n        return x;\n    } : _ref$getData;\n    var precisionMultiplier = attribute.doublePrecision ? 2 : 1;\n    var size = attribute.size * precisionMultiplier;\n    var byteOffset = attribute.byteOffset;\n    var toStartIndices = attribute.startIndices;\n    var hasStartIndices = fromStartIndices && toStartIndices;\n    var toLength = getAttributeBufferLength(attribute, numInstances);\n    var isConstant = attribute.state.constant;\n    if (!hasStartIndices && fromLength >= toLength) return;\n    var toData = isConstant ? attribute.value : attribute.getBuffer().getData({\n        srcByteOffset: byteOffset\n    });\n    if (attribute.settings.normalized && !isConstant) {\n        var getter = getData;\n        getData = function getData(value, chunk) {\n            return attribute._normalizeConstant(getter(value, chunk));\n        };\n    }\n    var getMissingData = isConstant ? function(i, chunk) {\n        return getData(toData, chunk);\n    } : function(i, chunk) {\n        return getData(toData.subarray(i, i + size), chunk);\n    };\n    var source = buffer.getData({\n        length: fromLength\n    });\n    var data = new Float32Array(toLength);\n    (0, _arrayUtils.padArray)({\n        source: source,\n        target: data,\n        sourceStartIndices: fromStartIndices,\n        targetStartIndices: toStartIndices,\n        size: size,\n        getData: getMissingData\n    });\n    if (buffer.byteLength < data.byteLength + byteOffset) buffer.reallocate(data.byteLength + byteOffset);\n    buffer.subData({\n        data: data,\n        offset: byteOffset\n    });\n}\n\n},{\"../../utils/array-utils\":\"k2sup\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k2sup\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"padArray\", ()=>padArray);\nfunction padArrayChunk(_ref) {\n    var source = _ref.source, target = _ref.target, _ref$start = _ref.start, start = _ref$start === void 0 ? 0 : _ref$start, end = _ref.end, getData = _ref.getData;\n    end = end || target.length;\n    var sourceLength = source.length;\n    var targetLength = end - start;\n    if (sourceLength > targetLength) {\n        target.set(source.subarray(0, targetLength), start);\n        return;\n    }\n    target.set(source, start);\n    if (!getData) return;\n    var i = sourceLength;\n    while(i < targetLength){\n        var datum = getData(i, source);\n        for(var j = 0; j < datum.length; j++){\n            target[start + i] = datum[j];\n            i++;\n        }\n    }\n}\nfunction padArray(_ref2) {\n    var source = _ref2.source, target = _ref2.target, size = _ref2.size, getData = _ref2.getData, sourceStartIndices = _ref2.sourceStartIndices, targetStartIndices = _ref2.targetStartIndices;\n    if (!Array.isArray(targetStartIndices)) {\n        padArrayChunk({\n            source: source,\n            target: target,\n            getData: getData\n        });\n        return target;\n    }\n    var sourceIndex = 0;\n    var targetIndex = 0;\n    var getChunkData = getData && function(i, chunk) {\n        return getData(i + targetIndex, chunk);\n    };\n    var n = Math.min(sourceStartIndices.length, targetStartIndices.length);\n    for(var i1 = 1; i1 < n; i1++){\n        var nextSourceIndex = sourceStartIndices[i1] * size;\n        var nextTargetIndex = targetStartIndices[i1] * size;\n        padArrayChunk({\n            source: source.subarray(sourceIndex, nextSourceIndex),\n            target: target,\n            start: targetIndex,\n            end: nextTargetIndex,\n            getData: getChunkData\n        });\n        sourceIndex = nextSourceIndex;\n        targetIndex = nextTargetIndex;\n    }\n    if (targetIndex < target.length) padArrayChunk({\n        source: [],\n        target: target,\n        start: targetIndex,\n        getData: getChunkData\n    });\n    return target;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gLLlZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>AttributeTransitionManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _gpuInterpolationTransition = require(\"../../transitions/gpu-interpolation-transition\");\nvar _gpuInterpolationTransitionDefault = parcelHelpers.interopDefault(_gpuInterpolationTransition);\nvar _gpuSpringTransition = require(\"../../transitions/gpu-spring-transition\");\nvar _gpuSpringTransitionDefault = parcelHelpers.interopDefault(_gpuSpringTransition);\nvar _log = require(\"../../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar TRANSITION_TYPES = {\n    interpolation: (0, _gpuInterpolationTransitionDefault.default),\n    spring: (0, _gpuSpringTransitionDefault.default)\n};\nvar AttributeTransitionManager = function() {\n    function AttributeTransitionManager1(gl, _ref) {\n        var id = _ref.id, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, AttributeTransitionManager1);\n        this.id = id;\n        this.gl = gl;\n        this.timeline = timeline;\n        this.transitions = {};\n        this.needsRedraw = false;\n        this.numInstances = 1;\n        if ((0, _core.Transform).isSupported(gl)) this.isSupported = true;\n        else if (gl) (0, _logDefault.default).warn(\"WebGL2 not supported by this browser. Transition animation is disabled.\")();\n    }\n    (0, _createClassDefault.default)(AttributeTransitionManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var attributeName in this.transitions)this._removeTransition(attributeName);\n            }\n        },\n        {\n            key: \"update\",\n            value: function update(_ref2) {\n                var attributes = _ref2.attributes, _ref2$transitions = _ref2.transitions, transitions = _ref2$transitions === void 0 ? {} : _ref2$transitions, numInstances = _ref2.numInstances;\n                this.numInstances = numInstances || 1;\n                if (!this.isSupported) return;\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    var settings = attribute.getTransitionSetting(transitions);\n                    if (!settings) continue;\n                    this._updateAttribute(attributeName, attribute, settings);\n                }\n                for(var _attributeName in this.transitions){\n                    var _attribute = attributes[_attributeName];\n                    if (!_attribute || !_attribute.getTransitionSetting(transitions)) this._removeTransition(_attributeName);\n                }\n            }\n        },\n        {\n            key: \"hasAttribute\",\n            value: function hasAttribute(attributeName) {\n                var transition = this.transitions[attributeName];\n                return transition && transition.inProgress;\n            }\n        },\n        {\n            key: \"getAttributes\",\n            value: function getAttributes() {\n                var animatedAttributes = {};\n                for(var attributeName in this.transitions){\n                    var transition = this.transitions[attributeName];\n                    if (transition.inProgress) animatedAttributes[attributeName] = transition.attributeInTransition;\n                }\n                return animatedAttributes;\n            }\n        },\n        {\n            key: \"run\",\n            value: function run() {\n                if (!this.isSupported || this.numInstances === 0) return false;\n                for(var attributeName in this.transitions){\n                    var updated = this.transitions[attributeName].update();\n                    if (updated) this.needsRedraw = true;\n                }\n                var needsRedraw = this.needsRedraw;\n                this.needsRedraw = false;\n                return needsRedraw;\n            }\n        },\n        {\n            key: \"_removeTransition\",\n            value: function _removeTransition(attributeName) {\n                this.transitions[attributeName].cancel();\n                delete this.transitions[attributeName];\n            }\n        },\n        {\n            key: \"_updateAttribute\",\n            value: function _updateAttribute(attributeName, attribute, settings) {\n                var transition = this.transitions[attributeName];\n                var isNew = !transition || transition.type !== settings.type;\n                if (isNew) {\n                    if (transition) this._removeTransition(attributeName);\n                    var TransitionType = TRANSITION_TYPES[settings.type];\n                    if (TransitionType) this.transitions[attributeName] = new TransitionType({\n                        attribute: attribute,\n                        timeline: this.timeline,\n                        gl: this.gl\n                    });\n                    else {\n                        (0, _logDefault.default).error(\"unsupported transition type '\".concat(settings.type, \"'\"))();\n                        isNew = false;\n                    }\n                }\n                if (isNew || attribute.needsRedraw()) {\n                    this.needsRedraw = true;\n                    this.transitions[attributeName].start(settings, this.numInstances);\n                }\n            }\n        }\n    ]);\n    return AttributeTransitionManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/core\":\"WBJLR\",\"../../transitions/gpu-interpolation-transition\":\"1TEpt\",\"../../transitions/gpu-spring-transition\":\"6FgT3\",\"../../utils/log\":\"1biSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1TEpt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GPUInterpolationTransition);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _attribute = require(\"../lib/attribute/attribute\");\nvar _attributeDefault = parcelHelpers.interopDefault(_attribute);\nvar _attributeTransitionUtils = require(\"../lib/attribute/attribute-transition-utils\");\nvar _transition = require(\"./transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar GPUInterpolationTransition = function() {\n    function GPUInterpolationTransition1(_ref) {\n        var gl = _ref.gl, attribute = _ref.attribute, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, GPUInterpolationTransition1);\n        this.gl = gl;\n        this.type = \"interpolation\";\n        this.transition = new (0, _transitionDefault.default)(timeline);\n        this.attribute = attribute;\n        this.attributeInTransition = new (0, _attributeDefault.default)(gl, attribute.settings);\n        this.currentStartIndices = attribute.startIndices;\n        this.currentLength = 0;\n        this.transform = getTransform(gl, attribute);\n        var bufferOpts = {\n            byteLength: 0,\n            usage: 35050\n        };\n        this.buffers = [\n            new (0, _core.Buffer)(gl, bufferOpts),\n            new (0, _core.Buffer)(gl, bufferOpts)\n        ];\n    }\n    (0, _createClassDefault.default)(GPUInterpolationTransition1, [\n        {\n            key: \"start\",\n            value: function start(transitionSettings, numInstances) {\n                if (transitionSettings.duration <= 0) {\n                    this.transition.cancel();\n                    return;\n                }\n                var gl = this.gl, buffers = this.buffers, attribute = this.attribute;\n                (0, _attributeTransitionUtils.cycleBuffers)(buffers);\n                var padBufferOpts = {\n                    numInstances: numInstances,\n                    attribute: attribute,\n                    fromLength: this.currentLength,\n                    fromStartIndices: this.currentStartIndices,\n                    getData: transitionSettings.enter\n                };\n                var _iterator = _createForOfIteratorHelper(buffers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var buffer = _step.value;\n                        (0, _attributeTransitionUtils.padBuffer)(_objectSpread({\n                            buffer: buffer\n                        }, padBufferOpts));\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                this.currentStartIndices = attribute.startIndices;\n                this.currentLength = (0, _attributeTransitionUtils.getAttributeBufferLength)(attribute, numInstances);\n                this.attributeInTransition.update({\n                    buffer: buffers[1],\n                    value: attribute.value\n                });\n                this.transition.start(transitionSettings);\n                this.transform.update({\n                    elementCount: Math.floor(this.currentLength / attribute.size),\n                    sourceBuffers: {\n                        aFrom: buffers[0],\n                        aTo: (0, _attributeTransitionUtils.getSourceBufferAttribute)(gl, attribute)\n                    },\n                    feedbackBuffers: {\n                        vCurrent: buffers[1]\n                    }\n                });\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var updated = this.transition.update();\n                if (updated) {\n                    var _this$transition = this.transition, time = _this$transition.time, _this$transition$sett = _this$transition.settings, duration = _this$transition$sett.duration, easing = _this$transition$sett.easing;\n                    var t = easing(time / duration);\n                    this.transform.run({\n                        uniforms: {\n                            time: t\n                        }\n                    });\n                }\n                return updated;\n            }\n        },\n        {\n            key: \"cancel\",\n            value: function cancel() {\n                this.transition.cancel();\n                this.transform[\"delete\"]();\n                while(this.buffers.length)this.buffers.pop()[\"delete\"]();\n            }\n        },\n        {\n            key: \"inProgress\",\n            get: function get() {\n                return this.transition.inProgress;\n            }\n        }\n    ]);\n    return GPUInterpolationTransition1;\n}();\nvar vs = \"\\n#define SHADER_NAME interpolation-transition-vertex-shader\\n\\nuniform float time;\\nattribute ATTRIBUTE_TYPE aFrom;\\nattribute ATTRIBUTE_TYPE aTo;\\nvarying ATTRIBUTE_TYPE vCurrent;\\n\\nvoid main(void) {\\n  vCurrent = mix(aFrom, aTo, time);\\n  gl_Position = vec4(0.0);\\n}\\n\";\nfunction getTransform(gl, attribute) {\n    var attributeType = (0, _attributeTransitionUtils.getAttributeTypeFromSize)(attribute.size);\n    return new (0, _core.Transform)(gl, {\n        vs: vs,\n        defines: {\n            ATTRIBUTE_TYPE: attributeType\n        },\n        varyings: [\n            \"vCurrent\"\n        ]\n    });\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/core\":\"WBJLR\",\"../lib/attribute/attribute\":\"1hvhV\",\"../lib/attribute/attribute-transition-utils\":\"2cbK8\",\"./transition\":\"3Fdtq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Fdtq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Transition);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nfunction noop() {}\nvar DEFAULT_SETTINGS = {\n    onStart: noop,\n    onUpdate: noop,\n    onInterrupt: noop,\n    onEnd: noop\n};\nvar Transition = function() {\n    function Transition1(timeline) {\n        (0, _classCallCheckDefault.default)(this, Transition1);\n        this._inProgress = false;\n        this._handle = null;\n        this.timeline = timeline;\n        this.settings = {};\n    }\n    (0, _createClassDefault.default)(Transition1, [\n        {\n            key: \"start\",\n            value: function start(props) {\n                this.cancel();\n                this.settings = Object.assign({}, DEFAULT_SETTINGS, props);\n                this._inProgress = true;\n                this.settings.onStart(this);\n            }\n        },\n        {\n            key: \"end\",\n            value: function end() {\n                if (this._inProgress) {\n                    this.timeline.removeChannel(this._handle);\n                    this._handle = null;\n                    this._inProgress = false;\n                    this.settings.onEnd(this);\n                }\n            }\n        },\n        {\n            key: \"cancel\",\n            value: function cancel() {\n                if (this._inProgress) {\n                    this.settings.onInterrupt(this);\n                    this.timeline.removeChannel(this._handle);\n                    this._handle = null;\n                    this._inProgress = false;\n                }\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                if (!this._inProgress) return false;\n                if (this._handle === null) {\n                    var timeline = this.timeline, settings = this.settings;\n                    this._handle = timeline.addChannel({\n                        delay: timeline.getTime(),\n                        duration: settings.duration\n                    });\n                }\n                this.time = this.timeline.getTime(this._handle);\n                this._onUpdate();\n                this.settings.onUpdate(this);\n                if (this.timeline.isFinished(this._handle)) this.end();\n                return true;\n            }\n        },\n        {\n            key: \"_onUpdate\",\n            value: function _onUpdate() {}\n        },\n        {\n            key: \"inProgress\",\n            get: function get() {\n                return this._inProgress;\n            }\n        }\n    ]);\n    return Transition1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6FgT3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GPUSpringTransition);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _attributeTransitionUtils = require(\"../lib/attribute/attribute-transition-utils\");\nvar _attribute = require(\"../lib/attribute/attribute\");\nvar _attributeDefault = parcelHelpers.interopDefault(_attribute);\nvar _transition = require(\"./transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar GPUSpringTransition = function() {\n    function GPUSpringTransition1(_ref) {\n        var gl = _ref.gl, attribute = _ref.attribute, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, GPUSpringTransition1);\n        this.gl = gl;\n        this.type = \"spring\";\n        this.transition = new (0, _transitionDefault.default)(timeline);\n        this.attribute = attribute;\n        this.attributeInTransition = new (0, _attributeDefault.default)(gl, Object.assign({}, attribute.settings, {\n            normalized: false\n        }));\n        this.currentStartIndices = attribute.startIndices;\n        this.currentLength = 0;\n        this.texture = getTexture(gl);\n        this.framebuffer = getFramebuffer(gl, this.texture);\n        this.transform = getTransform(gl, attribute, this.framebuffer);\n        var bufferOpts = {\n            byteLength: 0,\n            usage: 35050\n        };\n        this.buffers = [\n            new (0, _core.Buffer)(gl, bufferOpts),\n            new (0, _core.Buffer)(gl, bufferOpts),\n            new (0, _core.Buffer)(gl, bufferOpts)\n        ];\n    }\n    (0, _createClassDefault.default)(GPUSpringTransition1, [\n        {\n            key: \"start\",\n            value: function start(transitionSettings, numInstances) {\n                var gl = this.gl, buffers = this.buffers, attribute = this.attribute;\n                var padBufferOpts = {\n                    numInstances: numInstances,\n                    attribute: attribute,\n                    fromLength: this.currentLength,\n                    fromStartIndices: this.currentStartIndices,\n                    getData: transitionSettings.enter\n                };\n                var _iterator = _createForOfIteratorHelper(buffers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var buffer = _step.value;\n                        (0, _attributeTransitionUtils.padBuffer)(_objectSpread({\n                            buffer: buffer\n                        }, padBufferOpts));\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                this.currentStartIndices = attribute.startIndices;\n                this.currentLength = (0, _attributeTransitionUtils.getAttributeBufferLength)(attribute, numInstances);\n                this.attributeInTransition.update({\n                    buffer: buffers[1],\n                    value: attribute.value\n                });\n                this.transition.start(transitionSettings);\n                this.transform.update({\n                    elementCount: Math.floor(this.currentLength / attribute.size),\n                    sourceBuffers: {\n                        aTo: (0, _attributeTransitionUtils.getSourceBufferAttribute)(gl, attribute)\n                    }\n                });\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var buffers = this.buffers, transform = this.transform, framebuffer = this.framebuffer, transition = this.transition;\n                var updated = transition.update();\n                if (!updated) return false;\n                transform.update({\n                    sourceBuffers: {\n                        aPrev: buffers[0],\n                        aCur: buffers[1]\n                    },\n                    feedbackBuffers: {\n                        vNext: buffers[2]\n                    }\n                });\n                transform.run({\n                    framebuffer: framebuffer,\n                    discard: false,\n                    clearRenderTarget: true,\n                    uniforms: {\n                        stiffness: transition.settings.stiffness,\n                        damping: transition.settings.damping\n                    },\n                    parameters: {\n                        depthTest: false,\n                        blend: true,\n                        viewport: [\n                            0,\n                            0,\n                            1,\n                            1\n                        ],\n                        blendFunc: [\n                            1,\n                            1\n                        ],\n                        blendEquation: [\n                            32776,\n                            32776\n                        ]\n                    }\n                });\n                (0, _attributeTransitionUtils.cycleBuffers)(buffers);\n                this.attributeInTransition.update({\n                    buffer: buffers[1],\n                    value: this.attribute.value\n                });\n                var isTransitioning = (0, _core.readPixelsToArray)(framebuffer)[0] > 0;\n                if (!isTransitioning) transition.end();\n                return true;\n            }\n        },\n        {\n            key: \"cancel\",\n            value: function cancel() {\n                this.transition.cancel();\n                this.transform[\"delete\"]();\n                while(this.buffers.length)this.buffers.pop()[\"delete\"]();\n                this.texture[\"delete\"]();\n                this.texture = null;\n                this.framebuffer[\"delete\"]();\n                this.framebuffer = null;\n            }\n        },\n        {\n            key: \"inProgress\",\n            get: function get() {\n                return this.transition.inProgress;\n            }\n        }\n    ]);\n    return GPUSpringTransition1;\n}();\nfunction getTransform(gl, attribute, framebuffer) {\n    var attributeType = (0, _attributeTransitionUtils.getAttributeTypeFromSize)(attribute.size);\n    return new (0, _core.Transform)(gl, {\n        framebuffer: framebuffer,\n        vs: \"\\n#define SHADER_NAME spring-transition-vertex-shader\\n\\n#define EPSILON 0.00001\\n\\nuniform float stiffness;\\nuniform float damping;\\nattribute ATTRIBUTE_TYPE aPrev;\\nattribute ATTRIBUTE_TYPE aCur;\\nattribute ATTRIBUTE_TYPE aTo;\\nvarying ATTRIBUTE_TYPE vNext;\\nvarying float vIsTransitioningFlag;\\n\\nATTRIBUTE_TYPE getNextValue(ATTRIBUTE_TYPE cur, ATTRIBUTE_TYPE prev, ATTRIBUTE_TYPE dest) {\\n  ATTRIBUTE_TYPE velocity = cur - prev;\\n  ATTRIBUTE_TYPE delta = dest - cur;\\n  ATTRIBUTE_TYPE spring = delta * stiffness;\\n  ATTRIBUTE_TYPE damper = velocity * -1.0 * damping;\\n  return spring + damper + velocity + cur;\\n}\\n\\nvoid main(void) {\\n  bool isTransitioning = length(aCur - aPrev) > EPSILON || length(aTo - aCur) > EPSILON;\\n  vIsTransitioningFlag = isTransitioning ? 1.0 : 0.0;\\n\\n  vNext = getNextValue(aCur, aPrev, aTo);\\n  gl_Position = vec4(0, 0, 0, 1);\\n  gl_PointSize = 100.0;\\n}\\n\",\n        fs: \"\\n#define SHADER_NAME spring-transition-is-transitioning-fragment-shader\\n\\nvarying float vIsTransitioningFlag;\\n\\nvoid main(void) {\\n  if (vIsTransitioningFlag == 0.0) {\\n    discard;\\n  }\\n  gl_FragColor = vec4(1.0);\\n}\",\n        defines: {\n            ATTRIBUTE_TYPE: attributeType\n        },\n        varyings: [\n            \"vNext\"\n        ]\n    });\n}\nfunction getTexture(gl) {\n    return new (0, _core.Texture2D)(gl, {\n        data: new Uint8Array(4),\n        format: 6408,\n        type: 5121,\n        border: 0,\n        mipmaps: false,\n        dataFormat: 6408,\n        width: 1,\n        height: 1\n    });\n}\nfunction getFramebuffer(gl, texture) {\n    return new (0, _core.Framebuffer)(gl, {\n        id: \"spring-transition-is-transitioning-framebuffer\",\n        width: 1,\n        height: 1,\n        attachments: (0, _definePropertyDefault.default)({}, 36064, texture)\n    });\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/core\":\"WBJLR\",\"../lib/attribute/attribute-transition-utils\":\"2cbK8\",\"../lib/attribute/attribute\":\"1hvhV\",\"./transition\":\"3Fdtq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3If9T\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>UniformTransitionManager);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _attributeTransitionUtils = require(\"./attribute/attribute-transition-utils\");\nvar _cpuInterpolationTransition = require(\"../transitions/cpu-interpolation-transition\");\nvar _cpuInterpolationTransitionDefault = parcelHelpers.interopDefault(_cpuInterpolationTransition);\nvar _cpuSpringTransition = require(\"../transitions/cpu-spring-transition\");\nvar _cpuSpringTransitionDefault = parcelHelpers.interopDefault(_cpuSpringTransition);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar TRANSITION_TYPES = {\n    interpolation: (0, _cpuInterpolationTransitionDefault.default),\n    spring: (0, _cpuSpringTransitionDefault.default)\n};\nvar UniformTransitionManager = function() {\n    function UniformTransitionManager1(timeline) {\n        (0, _classCallCheckDefault.default)(this, UniformTransitionManager1);\n        this.transitions = new Map();\n        this.timeline = timeline;\n    }\n    (0, _createClassDefault.default)(UniformTransitionManager1, [\n        {\n            key: \"add\",\n            value: function add(key, fromValue, toValue, settings) {\n                var transitions = this.transitions;\n                if (transitions.has(key)) {\n                    var _transition = transitions.get(key);\n                    var _transition$value = _transition.value, value = _transition$value === void 0 ? _transition.settings.fromValue : _transition$value;\n                    fromValue = value;\n                    this.remove(key);\n                }\n                settings = (0, _attributeTransitionUtils.normalizeTransitionSettings)(settings);\n                if (!settings) return;\n                var TransitionType = TRANSITION_TYPES[settings.type];\n                if (!TransitionType) {\n                    (0, _logDefault.default).error(\"unsupported transition type '\".concat(settings.type, \"'\"))();\n                    return;\n                }\n                var transition = new TransitionType(this.timeline);\n                transition.start(_objectSpread(_objectSpread({}, settings), {}, {\n                    fromValue: fromValue,\n                    toValue: toValue\n                }));\n                transitions.set(key, transition);\n            }\n        },\n        {\n            key: \"remove\",\n            value: function remove(key) {\n                var transitions = this.transitions;\n                if (transitions.has(key)) {\n                    transitions.get(key).cancel();\n                    transitions[\"delete\"](key);\n                }\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var propsInTransition = {};\n                var _iterator = _createForOfIteratorHelper(this.transitions), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var _step$value = (0, _slicedToArrayDefault.default)(_step.value, 2), key = _step$value[0], transition = _step$value[1];\n                        transition.update();\n                        propsInTransition[key] = transition.value;\n                        if (!transition.inProgress) this.remove(key);\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return propsInTransition;\n            }\n        },\n        {\n            key: \"clear\",\n            value: function clear() {\n                var _iterator2 = _createForOfIteratorHelper(this.transitions.keys()), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var key = _step2.value;\n                        this.remove(key);\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n            }\n        },\n        {\n            key: \"active\",\n            get: function get() {\n                return this.transitions.size > 0;\n            }\n        }\n    ]);\n    return UniformTransitionManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./attribute/attribute-transition-utils\":\"2cbK8\",\"../transitions/cpu-interpolation-transition\":\"8P9ki\",\"../transitions/cpu-spring-transition\":\"7ORhs\",\"../utils/log\":\"1biSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8P9ki\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CPUInterpolationTransition);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _transition = require(\"./transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar CPUInterpolationTransition = function(_Transition) {\n    (0, _inheritsDefault.default)(CPUInterpolationTransition1, _Transition);\n    var _super = _createSuper(CPUInterpolationTransition1);\n    function CPUInterpolationTransition1() {\n        (0, _classCallCheckDefault.default)(this, CPUInterpolationTransition1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(CPUInterpolationTransition1, [\n        {\n            key: \"_onUpdate\",\n            value: function _onUpdate() {\n                var time = this.time, _this$settings = this.settings, fromValue = _this$settings.fromValue, toValue = _this$settings.toValue, duration = _this$settings.duration, easing = _this$settings.easing;\n                var t = easing(time / duration);\n                this._value = (0, _mathGl.lerp)(fromValue, toValue, t);\n            }\n        },\n        {\n            key: \"value\",\n            get: function get() {\n                return this._value;\n            }\n        }\n    ]);\n    return CPUInterpolationTransition1;\n}((0, _transitionDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"math.gl\":\"huJnq\",\"./transition\":\"3Fdtq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ORhs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CPUSpringTransition);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _transition = require(\"./transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar EPSILON = 1e-5;\nfunction updateSpringElement(prev, cur, dest, damping, stiffness) {\n    var velocity = cur - prev;\n    var delta = dest - cur;\n    var spring = delta * stiffness;\n    var damper = -velocity * damping;\n    return spring + damper + velocity + cur;\n}\nfunction updateSpring(prev, cur, dest, damping, stiffness) {\n    if (Array.isArray(dest)) {\n        var next = [];\n        for(var i = 0; i < dest.length; i++)next[i] = updateSpringElement(prev[i], cur[i], dest[i], damping, stiffness);\n        return next;\n    }\n    return updateSpringElement(prev, cur, dest, damping, stiffness);\n}\nfunction distance(value1, value2) {\n    if (Array.isArray(value1)) {\n        var distanceSquare = 0;\n        for(var i = 0; i < value1.length; i++){\n            var d = value1[i] - value2[i];\n            distanceSquare += d * d;\n        }\n        return Math.sqrt(distanceSquare);\n    }\n    return Math.abs(value1 - value2);\n}\nvar CPUSpringTransition = function(_Transition) {\n    (0, _inheritsDefault.default)(CPUSpringTransition1, _Transition);\n    var _super = _createSuper(CPUSpringTransition1);\n    function CPUSpringTransition1() {\n        (0, _classCallCheckDefault.default)(this, CPUSpringTransition1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(CPUSpringTransition1, [\n        {\n            key: \"_onUpdate\",\n            value: function _onUpdate() {\n                var _this$settings = this.settings, fromValue = _this$settings.fromValue, toValue = _this$settings.toValue, damping = _this$settings.damping, stiffness = _this$settings.stiffness;\n                var _this$_prevValue = this._prevValue, _prevValue = _this$_prevValue === void 0 ? fromValue : _this$_prevValue, _this$_currValue = this._currValue, _currValue = _this$_currValue === void 0 ? fromValue : _this$_currValue;\n                var nextValue = updateSpring(_prevValue, _currValue, toValue, damping, stiffness);\n                var delta = distance(nextValue, toValue);\n                var velocity = distance(nextValue, _currValue);\n                if (delta < EPSILON && velocity < EPSILON) {\n                    nextValue = toValue;\n                    this.end();\n                }\n                this._prevValue = _currValue;\n                this._currValue = nextValue;\n            }\n        },\n        {\n            key: \"value\",\n            get: function get() {\n                return this._currValue;\n            }\n        }\n    ]);\n    return CPUSpringTransition1;\n}((0, _transitionDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./transition\":\"3Fdtq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ZIma\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"validateProps\", ()=>validateProps);\nparcelHelpers.export(exports, \"diffProps\", ()=>diffProps);\nparcelHelpers.export(exports, \"compareProps\", ()=>compareProps);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _constants = require(\"./constants\");\nvar COMPONENT = (0, _constants.PROP_SYMBOLS).COMPONENT;\nfunction validateProps(props) {\n    var propTypes = getPropTypes(props);\n    for(var propName in propTypes){\n        var propType = propTypes[propName];\n        var validate = propType.validate;\n        if (validate && !validate(props[propName], propType)) throw new Error(\"Invalid prop \".concat(propName, \": \").concat(props[propName]));\n    }\n}\nfunction diffProps(props, oldProps) {\n    var propsChangedReason = compareProps({\n        newProps: props,\n        oldProps: oldProps,\n        propTypes: getPropTypes(props),\n        ignoreProps: {\n            data: null,\n            updateTriggers: null,\n            extensions: null,\n            transitions: null\n        }\n    });\n    var dataChangedReason = diffDataProps(props, oldProps);\n    var updateTriggersChangedReason = false;\n    if (!dataChangedReason) updateTriggersChangedReason = diffUpdateTriggers(props, oldProps);\n    return {\n        dataChanged: dataChangedReason,\n        propsChanged: propsChangedReason,\n        updateTriggersChanged: updateTriggersChangedReason,\n        extensionsChanged: diffExtensions(props, oldProps),\n        transitionsChanged: diffTransitions(props, oldProps)\n    };\n}\nfunction diffTransitions(props, oldProps) {\n    if (!props.transitions) return null;\n    var result = {};\n    var propTypes = getPropTypes(props);\n    for(var key in props.transitions){\n        var propType = propTypes[key];\n        var type = propType && propType.type;\n        var isTransitionable = type === \"number\" || type === \"color\" || type === \"array\";\n        if (isTransitionable && comparePropValues(props[key], oldProps[key], propType)) result[key] = true;\n    }\n    return result;\n}\nfunction compareProps() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, newProps = _ref.newProps, oldProps = _ref.oldProps, _ref$ignoreProps = _ref.ignoreProps, ignoreProps = _ref$ignoreProps === void 0 ? {} : _ref$ignoreProps, _ref$propTypes = _ref.propTypes, propTypes = _ref$propTypes === void 0 ? {} : _ref$propTypes, _ref$triggerName = _ref.triggerName, triggerName = _ref$triggerName === void 0 ? \"props\" : _ref$triggerName;\n    if (oldProps === newProps) return null;\n    if ((0, _typeofDefault.default)(newProps) !== \"object\" || newProps === null) return \"\".concat(triggerName, \" changed shallowly\");\n    if ((0, _typeofDefault.default)(oldProps) !== \"object\" || oldProps === null) return \"\".concat(triggerName, \" changed shallowly\");\n    for(var _i = 0, _Object$keys = Object.keys(newProps); _i < _Object$keys.length; _i++){\n        var key = _Object$keys[_i];\n        if (!(key in ignoreProps)) {\n            if (!(key in oldProps)) return \"\".concat(triggerName, \".\").concat(key, \" added\");\n            var changed = comparePropValues(newProps[key], oldProps[key], propTypes[key]);\n            if (changed) return \"\".concat(triggerName, \".\").concat(key, \" \").concat(changed);\n        }\n    }\n    for(var _i2 = 0, _Object$keys2 = Object.keys(oldProps); _i2 < _Object$keys2.length; _i2++){\n        var _key = _Object$keys2[_i2];\n        if (!(_key in ignoreProps)) {\n            if (!(_key in newProps)) return \"\".concat(triggerName, \".\").concat(_key, \" dropped\");\n            if (!Object.hasOwnProperty.call(newProps, _key)) {\n                var _changed = comparePropValues(newProps[_key], oldProps[_key], propTypes[_key]);\n                if (_changed) return \"\".concat(triggerName, \".\").concat(_key, \" \").concat(_changed);\n            }\n        }\n    }\n    return null;\n}\nfunction comparePropValues(newProp, oldProp, propType) {\n    var equal = propType && propType.equal;\n    if (equal && !equal(newProp, oldProp, propType)) return \"changed deeply\";\n    if (!equal) {\n        equal = newProp && oldProp && newProp.equals;\n        if (equal && !equal.call(newProp, oldProp)) return \"changed deeply\";\n    }\n    if (!equal && oldProp !== newProp) return \"changed shallowly\";\n    return null;\n}\nfunction diffDataProps(props, oldProps) {\n    if (oldProps === null) return \"oldProps is null, initial diff\";\n    var dataChanged = null;\n    var dataComparator = props.dataComparator, _dataDiff = props._dataDiff;\n    if (dataComparator) {\n        if (!dataComparator(props.data, oldProps.data)) dataChanged = \"Data comparator detected a change\";\n    } else if (props.data !== oldProps.data) dataChanged = \"A new data container was supplied\";\n    if (dataChanged && _dataDiff) dataChanged = _dataDiff(props.data, oldProps.data) || dataChanged;\n    return dataChanged;\n}\nfunction diffUpdateTriggers(props, oldProps) {\n    if (oldProps === null) return \"oldProps is null, initial diff\";\n    if (\"all\" in props.updateTriggers) {\n        var diffReason = diffUpdateTrigger(props, oldProps, \"all\");\n        if (diffReason) return {\n            all: true\n        };\n    }\n    var triggerChanged = {};\n    var reason = false;\n    for(var triggerName in props.updateTriggers)if (triggerName !== \"all\") {\n        var _diffReason = diffUpdateTrigger(props, oldProps, triggerName);\n        if (_diffReason) {\n            triggerChanged[triggerName] = true;\n            reason = triggerChanged;\n        }\n    }\n    return reason;\n}\nfunction diffExtensions(props, oldProps) {\n    if (oldProps === null) return \"oldProps is null, initial diff\";\n    var oldExtensions = oldProps.extensions;\n    var extensions = props.extensions;\n    if (extensions === oldExtensions) return false;\n    if (extensions.length !== oldExtensions.length) return true;\n    for(var i = 0; i < extensions.length; i++){\n        if (!extensions[i].equals(oldExtensions[i])) return true;\n    }\n    return false;\n}\nfunction diffUpdateTrigger(props, oldProps, triggerName) {\n    var newTriggers = props.updateTriggers[triggerName];\n    newTriggers = newTriggers === undefined || newTriggers === null ? {} : newTriggers;\n    var oldTriggers = oldProps.updateTriggers[triggerName];\n    oldTriggers = oldTriggers === undefined || oldTriggers === null ? {} : oldTriggers;\n    var diffReason = compareProps({\n        oldProps: oldTriggers,\n        newProps: newTriggers,\n        triggerName: triggerName\n    });\n    return diffReason;\n}\nfunction getPropTypes(props) {\n    var layer = props[COMPONENT];\n    var LayerType = layer && layer.constructor;\n    return LayerType ? LayerType._propTypes : {};\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"./constants\":\"cM1ws\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cM1ws\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LIFECYCLE\", ()=>LIFECYCLE);\nparcelHelpers.export(exports, \"PROP_SYMBOLS\", ()=>PROP_SYMBOLS);\nvar LIFECYCLE = {\n    NO_STATE: \"Awaiting state\",\n    MATCHED: \"Matched. State transferred from previous layer\",\n    INITIALIZED: \"Initialized\",\n    AWAITING_GC: \"Discarded. Awaiting garbage collection\",\n    AWAITING_FINALIZATION: \"No longer matched. Awaiting garbage collection\",\n    FINALIZED: \"Finalized! Awaiting garbage collection\"\n};\nvar PROP_SYMBOLS = {\n    COMPONENT: Symbol[\"for\"](\"component\"),\n    ASYNC_DEFAULTS: Symbol[\"for\"](\"asyncPropDefaults\"),\n    ASYNC_ORIGINAL: Symbol[\"for\"](\"asyncPropOriginal\"),\n    ASYNC_RESOLVED: Symbol[\"for\"](\"asyncPropResolved\")\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6uGyN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"count\", ()=>count);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar ERR_NOT_OBJECT = \"count(): argument not an object\";\nvar ERR_NOT_CONTAINER = \"count(): argument not a container\";\nfunction count(container) {\n    if (!isObject(container)) throw new Error(ERR_NOT_OBJECT);\n    if (typeof container.count === \"function\") return container.count();\n    if (Number.isFinite(container.size)) return container.size;\n    if (Number.isFinite(container.length)) return container.length;\n    if (isPlainObject(container)) return Object.keys(container).length;\n    throw new Error(ERR_NOT_CONTAINER);\n}\nfunction isPlainObject(value) {\n    return value !== null && (0, _typeofDefault.default)(value) === \"object\" && value.constructor === Object;\n}\nfunction isObject(value) {\n    return value !== null && (0, _typeofDefault.default)(value) === \"object\";\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"figJs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mergeShaders\", ()=>mergeShaders);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction mergeShaders(target, source) {\n    if (!source) return target;\n    var result = Object.assign({}, target, source);\n    if (\"defines\" in source) result.defines = Object.assign({}, target.defines, source.defines);\n    if (\"modules\" in source) {\n        result.modules = (target.modules || []).concat(source.modules);\n        if (source.modules.some(function(module) {\n            return module.name === \"project64\";\n        })) {\n            var index = result.modules.findIndex(function(module) {\n                return module.name === \"project32\";\n            });\n            if (index >= 0) result.modules.splice(index, 1);\n        }\n    }\n    if (\"inject\" in source) {\n        if (!target.inject) result.inject = source.inject;\n        else {\n            var mergedInjection = _objectSpread({}, target.inject);\n            for(var key in source.inject)mergedInjection[key] = (mergedInjection[key] || \"\") + source.inject[key];\n            result.inject = mergedInjection;\n        }\n    }\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bSDti\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Component);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _constants = require(\"../lifecycle/constants\");\nvar _createProps = require(\"./create-props\");\nvar _constants1 = require(\"./constants\");\nvar _componentState = require(\"./component-state\");\nvar _componentStateDefault = parcelHelpers.interopDefault(_componentState);\nvar ASYNC_ORIGINAL = (0, _constants1.PROP_SYMBOLS).ASYNC_ORIGINAL, ASYNC_RESOLVED = (0, _constants1.PROP_SYMBOLS).ASYNC_RESOLVED, ASYNC_DEFAULTS = (0, _constants1.PROP_SYMBOLS).ASYNC_DEFAULTS;\nvar defaultProps = {};\nvar counter = 0;\nvar Component = function() {\n    function Component1() {\n        (0, _classCallCheckDefault.default)(this, Component1);\n        this.props = (0, _createProps.createProps).apply(this, arguments);\n        this.id = this.props.id;\n        this.count = counter++;\n        this.lifecycle = (0, _constants.LIFECYCLE).NO_STATE;\n        this.parent = null;\n        this.context = null;\n        this.state = null;\n        this.internalState = null;\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(Component1, [\n        {\n            key: \"clone\",\n            value: function clone(newProps) {\n                var props = this.props;\n                var asyncProps = {};\n                for(var key in props[ASYNC_DEFAULTS]){\n                    if (key in props[ASYNC_RESOLVED]) asyncProps[key] = props[ASYNC_RESOLVED][key];\n                    else if (key in props[ASYNC_ORIGINAL]) asyncProps[key] = props[ASYNC_ORIGINAL][key];\n                }\n                return new this.constructor(Object.assign({}, props, asyncProps, newProps));\n            }\n        },\n        {\n            key: \"_initState\",\n            value: function _initState() {\n                this.internalState = new (0, _componentStateDefault.default)({});\n            }\n        },\n        {\n            key: \"stats\",\n            get: function get() {\n                return this.internalState.stats;\n            }\n        }\n    ]);\n    return Component1;\n}();\nComponent.componentName = \"Component\";\nComponent.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../lifecycle/constants\":\"cM1ws\",\"./create-props\":\"7AAqG\",\"./constants\":\"cM1ws\",\"./component-state\":\"kPTLy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7AAqG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createProps\", ()=>createProps);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _iterableUtils = require(\"../utils/iterable-utils\");\nvar _propTypes = require(\"./prop-types\");\nvar _constants = require(\"./constants\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar COMPONENT = (0, _constants.PROP_SYMBOLS).COMPONENT, ASYNC_ORIGINAL = (0, _constants.PROP_SYMBOLS).ASYNC_ORIGINAL, ASYNC_RESOLVED = (0, _constants.PROP_SYMBOLS).ASYNC_RESOLVED, ASYNC_DEFAULTS = (0, _constants.PROP_SYMBOLS).ASYNC_DEFAULTS;\nfunction createProps() {\n    var component = this;\n    var propsPrototype = getPropsPrototype(component.constructor);\n    var propsInstance = Object.create(propsPrototype);\n    propsInstance[COMPONENT] = component;\n    propsInstance[ASYNC_ORIGINAL] = {};\n    propsInstance[ASYNC_RESOLVED] = {};\n    for(var i = 0; i < arguments.length; ++i){\n        var props = arguments[i];\n        for(var key in props)propsInstance[key] = props[key];\n    }\n    Object.freeze(propsInstance);\n    return propsInstance;\n}\nfunction getPropsPrototype(componentClass) {\n    var defaultProps = getOwnProperty(componentClass, \"_mergedDefaultProps\");\n    if (!defaultProps) {\n        createPropsPrototypeAndTypes(componentClass);\n        return componentClass._mergedDefaultProps;\n    }\n    return defaultProps;\n}\nfunction createPropsPrototypeAndTypes(componentClass) {\n    var parent = componentClass.prototype;\n    if (!parent) return;\n    var parentClass = Object.getPrototypeOf(componentClass);\n    var parentDefaultProps = getPropsPrototype(parentClass);\n    var componentDefaultProps = getOwnProperty(componentClass, \"defaultProps\") || {};\n    var componentPropDefs = (0, _propTypes.parsePropTypes)(componentDefaultProps);\n    var defaultProps = createPropsPrototype(componentPropDefs.defaultProps, parentDefaultProps, componentClass);\n    var propTypes = Object.assign({}, parentClass._propTypes, componentPropDefs.propTypes);\n    addAsyncPropsToPropPrototype(defaultProps, propTypes);\n    var deprecatedProps = Object.assign({}, parentClass._deprecatedProps, componentPropDefs.deprecatedProps);\n    addDeprecatedPropsToPropPrototype(defaultProps, deprecatedProps);\n    componentClass._mergedDefaultProps = defaultProps;\n    componentClass._propTypes = propTypes;\n    componentClass._deprecatedProps = deprecatedProps;\n}\nfunction createPropsPrototype(props, parentProps, componentClass) {\n    var defaultProps = Object.create(null);\n    Object.assign(defaultProps, parentProps, props);\n    var id = getComponentName(componentClass);\n    delete props.id;\n    Object.defineProperties(defaultProps, {\n        id: {\n            writable: true,\n            value: id\n        }\n    });\n    return defaultProps;\n}\nfunction addDeprecatedPropsToPropPrototype(defaultProps, deprecatedProps) {\n    var _loop = function _loop(propName) {\n        Object.defineProperty(defaultProps, propName, {\n            enumerable: false,\n            set: function set(newValue) {\n                var nameStr = \"\".concat(this.id, \": \").concat(propName);\n                var _iterator = _createForOfIteratorHelper(deprecatedProps[propName]), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var newPropName = _step.value;\n                        if (!hasOwnProperty(this, newPropName)) this[newPropName] = newValue;\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                (0, _logDefault.default).deprecated(nameStr, deprecatedProps[propName].join(\"/\"))();\n            }\n        });\n    };\n    for(var propName1 in deprecatedProps)_loop(propName1);\n}\nfunction addAsyncPropsToPropPrototype(defaultProps, propTypes) {\n    var defaultValues = {};\n    var descriptors = {};\n    for(var propName in propTypes){\n        var propType = propTypes[propName];\n        var name = propType.name, value = propType.value;\n        if (propType.async) {\n            defaultValues[name] = value;\n            descriptors[name] = getDescriptorForAsyncProp(name, value);\n        }\n    }\n    defaultProps[ASYNC_DEFAULTS] = defaultValues;\n    defaultProps[ASYNC_ORIGINAL] = {};\n    Object.defineProperties(defaultProps, descriptors);\n}\nfunction getDescriptorForAsyncProp(name) {\n    return {\n        enumerable: true,\n        set: function set(newValue) {\n            if (typeof newValue === \"string\" || newValue instanceof Promise || (0, _iterableUtils.isAsyncIterable)(newValue)) this[ASYNC_ORIGINAL][name] = newValue;\n            else this[ASYNC_RESOLVED][name] = newValue;\n        },\n        get: function get() {\n            if (this[ASYNC_RESOLVED]) {\n                if (name in this[ASYNC_RESOLVED]) {\n                    var value = this[ASYNC_RESOLVED][name];\n                    return value || this[ASYNC_DEFAULTS][name];\n                }\n                if (name in this[ASYNC_ORIGINAL]) {\n                    var state = this[COMPONENT] && this[COMPONENT].internalState;\n                    if (state && state.hasAsyncProp(name)) return state.getAsyncProp(name) || this[ASYNC_DEFAULTS][name];\n                }\n            }\n            return this[ASYNC_DEFAULTS][name];\n        }\n    };\n}\nfunction hasOwnProperty(object, prop) {\n    return Object.prototype.hasOwnProperty.call(object, prop);\n}\nfunction getOwnProperty(object, prop) {\n    return hasOwnProperty(object, prop) && object[prop];\n}\nfunction getComponentName(componentClass) {\n    var componentName = getOwnProperty(componentClass, \"layerName\") || getOwnProperty(componentClass, \"componentName\");\n    if (!componentName) (0, _logDefault.default).once(0, \"\".concat(componentClass.name, \".componentName not specified\"))();\n    return componentName || componentClass.name;\n}\n\n},{\"../utils/log\":\"1biSe\",\"../utils/iterable-utils\":\"kj5eS\",\"./prop-types\":\"cKWjO\",\"./constants\":\"cM1ws\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cKWjO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parsePropTypes\", ()=>parsePropTypes);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar TYPE_DEFINITIONS = {\n    \"boolean\": {\n        validate: function validate(value, propType) {\n            return true;\n        },\n        equal: function equal(value1, value2, propType) {\n            return Boolean(value1) === Boolean(value2);\n        }\n    },\n    number: {\n        validate: function validate(value, propType) {\n            return Number.isFinite(value) && (!(\"max\" in propType) || value <= propType.max) && (!(\"min\" in propType) || value >= propType.min);\n        }\n    },\n    color: {\n        validate: function validate(value, propType) {\n            return propType.optional && !value || isArray(value) && (value.length === 3 || value.length === 4);\n        },\n        equal: function equal(value1, value2, propType) {\n            return arrayEqual(value1, value2);\n        }\n    },\n    accessor: {\n        validate: function validate(value, propType) {\n            var valueType = getTypeOf(value);\n            return valueType === \"function\" || valueType === getTypeOf(propType.value);\n        },\n        equal: function equal(value1, value2, propType) {\n            if (typeof value2 === \"function\") return true;\n            return arrayEqual(value1, value2);\n        }\n    },\n    array: {\n        validate: function validate(value, propType) {\n            return propType.optional && !value || isArray(value);\n        },\n        equal: function equal(value1, value2, propType) {\n            return propType.compare ? arrayEqual(value1, value2) : value1 === value2;\n        }\n    },\n    \"function\": {\n        validate: function validate(value, propType) {\n            return propType.optional && !value || typeof value === \"function\";\n        },\n        equal: function equal(value1, value2, propType) {\n            return !propType.compare || value1 === value2;\n        }\n    }\n};\nfunction arrayEqual(array1, array2) {\n    if (array1 === array2) return true;\n    if (!isArray(array1) || !isArray(array2)) return false;\n    var len = array1.length;\n    if (len !== array2.length) return false;\n    for(var i = 0; i < len; i++){\n        if (array1[i] !== array2[i]) return false;\n    }\n    return true;\n}\nfunction parsePropTypes(propDefs) {\n    var propTypes = {};\n    var defaultProps = {};\n    var deprecatedProps = {};\n    for(var _i = 0, _Object$entries = Object.entries(propDefs); _i < _Object$entries.length; _i++){\n        var _Object$entries$_i = (0, _slicedToArrayDefault.default)(_Object$entries[_i], 2), propName = _Object$entries$_i[0], propDef = _Object$entries$_i[1];\n        if (propDef && propDef.deprecatedFor) deprecatedProps[propName] = Array.isArray(propDef.deprecatedFor) ? propDef.deprecatedFor : [\n            propDef.deprecatedFor\n        ];\n        else {\n            var propType = parsePropType(propName, propDef);\n            propTypes[propName] = propType;\n            defaultProps[propName] = propType.value;\n        }\n    }\n    return {\n        propTypes: propTypes,\n        defaultProps: defaultProps,\n        deprecatedProps: deprecatedProps\n    };\n}\nfunction parsePropType(name, propDef) {\n    switch(getTypeOf(propDef)){\n        case \"object\":\n            return normalizePropDefinition(name, propDef);\n        case \"array\":\n            return normalizePropDefinition(name, {\n                type: \"array\",\n                value: propDef,\n                compare: false\n            });\n        case \"boolean\":\n            return normalizePropDefinition(name, {\n                type: \"boolean\",\n                value: propDef\n            });\n        case \"number\":\n            return normalizePropDefinition(name, {\n                type: \"number\",\n                value: propDef\n            });\n        case \"function\":\n            return normalizePropDefinition(name, {\n                type: \"function\",\n                value: propDef,\n                compare: true\n            });\n        default:\n            return {\n                name: name,\n                type: \"unknown\",\n                value: propDef\n            };\n    }\n}\nfunction normalizePropDefinition(name, propDef) {\n    if (!(\"type\" in propDef)) {\n        if (!(\"value\" in propDef)) return {\n            name: name,\n            type: \"object\",\n            value: propDef\n        };\n        return Object.assign({\n            name: name,\n            type: getTypeOf(propDef.value)\n        }, propDef);\n    }\n    return Object.assign({\n        name: name\n    }, TYPE_DEFINITIONS[propDef.type], propDef);\n}\nfunction isArray(value) {\n    return Array.isArray(value) || ArrayBuffer.isView(value);\n}\nfunction getTypeOf(value) {\n    if (isArray(value)) return \"array\";\n    if (value === null) return \"null\";\n    return (0, _typeofDefault.default)(value);\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kPTLy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ComponentState);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _asyncIterator = require(\"@babel/runtime/helpers/esm/asyncIterator\");\nvar _asyncIteratorDefault = parcelHelpers.interopDefault(_asyncIterator);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _iterableUtils = require(\"../utils/iterable-utils\");\nvar _constants = require(\"./constants\");\nvar ASYNC_ORIGINAL = (0, _constants.PROP_SYMBOLS).ASYNC_ORIGINAL, ASYNC_RESOLVED = (0, _constants.PROP_SYMBOLS).ASYNC_RESOLVED, ASYNC_DEFAULTS = (0, _constants.PROP_SYMBOLS).ASYNC_DEFAULTS;\nvar EMPTY_PROPS = Object.freeze({});\nvar ComponentState = function() {\n    function ComponentState1() {\n        var component = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n        (0, _classCallCheckDefault.default)(this, ComponentState1);\n        this.component = component;\n        this.asyncProps = {};\n        this.onAsyncPropUpdated = function() {};\n        this.oldProps = EMPTY_PROPS;\n        this.oldAsyncProps = null;\n    }\n    (0, _createClassDefault.default)(ComponentState1, [\n        {\n            key: \"getOldProps\",\n            value: function getOldProps() {\n                return this.oldAsyncProps || this.oldProps;\n            }\n        },\n        {\n            key: \"resetOldProps\",\n            value: function resetOldProps() {\n                this.oldAsyncProps = null;\n                this.oldProps = this.component.props;\n            }\n        },\n        {\n            key: \"freezeAsyncOldProps\",\n            value: function freezeAsyncOldProps() {\n                if (!this.oldAsyncProps) {\n                    this.oldProps = this.oldProps || this.component.props;\n                    this.oldAsyncProps = Object.create(this.oldProps);\n                    for(var propName in this.asyncProps)Object.defineProperty(this.oldAsyncProps, propName, {\n                        enumerable: true,\n                        value: this.oldProps[propName]\n                    });\n                }\n            }\n        },\n        {\n            key: \"hasAsyncProp\",\n            value: function hasAsyncProp(propName) {\n                return propName in this.asyncProps;\n            }\n        },\n        {\n            key: \"getAsyncProp\",\n            value: function getAsyncProp(propName) {\n                var asyncProp = this.asyncProps[propName];\n                return asyncProp && asyncProp.resolvedValue;\n            }\n        },\n        {\n            key: \"isAsyncPropLoading\",\n            value: function isAsyncPropLoading(propName) {\n                if (propName) {\n                    var asyncProp = this.asyncProps[propName];\n                    return Boolean(asyncProp && asyncProp.pendingLoadCount > 0 && asyncProp.pendingLoadCount !== asyncProp.resolvedLoadCount);\n                }\n                for(var key in this.asyncProps){\n                    if (this.isAsyncPropLoading(key)) return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"reloadAsyncProp\",\n            value: function reloadAsyncProp(propName, value) {\n                this._watchPromise(propName, Promise.resolve(value));\n            }\n        },\n        {\n            key: \"setAsyncProps\",\n            value: function setAsyncProps(props) {\n                var resolvedValues = props[ASYNC_RESOLVED] || {};\n                var originalValues = props[ASYNC_ORIGINAL] || props;\n                var defaultValues = props[ASYNC_DEFAULTS] || {};\n                for(var propName in resolvedValues){\n                    var value = resolvedValues[propName];\n                    this._createAsyncPropData(propName, value, defaultValues[propName]);\n                    this._updateAsyncProp(propName, value);\n                }\n                for(var _propName in originalValues){\n                    var _value2 = originalValues[_propName];\n                    this._createAsyncPropData(_propName, _value2, defaultValues[_propName]);\n                    this._updateAsyncProp(_propName, _value2);\n                }\n            }\n        },\n        {\n            key: \"_updateAsyncProp\",\n            value: function _updateAsyncProp(propName, value) {\n                if (!this._didAsyncInputValueChange(propName, value)) return;\n                if (typeof value === \"string\") {\n                    var fetch = this.layer && this.layer.props.fetch;\n                    var url = value;\n                    if (fetch) value = fetch(url, {\n                        propName: propName,\n                        layer: this.layer\n                    });\n                }\n                if (value instanceof Promise) {\n                    this._watchPromise(propName, value);\n                    return;\n                }\n                if ((0, _iterableUtils.isAsyncIterable)(value)) {\n                    this._resolveAsyncIterable(propName, value);\n                    return;\n                }\n                this._setPropValue(propName, value);\n            }\n        },\n        {\n            key: \"_didAsyncInputValueChange\",\n            value: function _didAsyncInputValueChange(propName, value) {\n                var asyncProp = this.asyncProps[propName];\n                if (value === asyncProp.lastValue) return false;\n                asyncProp.lastValue = value;\n                return true;\n            }\n        },\n        {\n            key: \"_setPropValue\",\n            value: function _setPropValue(propName, value) {\n                var asyncProp = this.asyncProps[propName];\n                asyncProp.value = value;\n                asyncProp.resolvedValue = value;\n                asyncProp.pendingLoadCount++;\n                asyncProp.resolvedLoadCount = asyncProp.pendingLoadCount;\n            }\n        },\n        {\n            key: \"_setAsyncPropValue\",\n            value: function _setAsyncPropValue(propName, value, loadCount) {\n                var asyncProp = this.asyncProps[propName];\n                if (asyncProp && loadCount >= asyncProp.resolvedLoadCount && value !== undefined) {\n                    this.freezeAsyncOldProps();\n                    asyncProp.resolvedValue = value;\n                    asyncProp.resolvedLoadCount = loadCount;\n                    this.onAsyncPropUpdated(propName, value);\n                }\n            }\n        },\n        {\n            key: \"_watchPromise\",\n            value: function _watchPromise(propName, promise) {\n                var _this = this;\n                var asyncProp = this.asyncProps[propName];\n                asyncProp.pendingLoadCount++;\n                var loadCount = asyncProp.pendingLoadCount;\n                promise.then(function(data) {\n                    data = _this._postProcessValue(propName, data);\n                    _this._setAsyncPropValue(propName, data, loadCount);\n                    var onDataLoad = _this.layer && _this.layer.props.onDataLoad;\n                    if (propName === \"data\" && onDataLoad) onDataLoad(data, {\n                        propName: propName,\n                        layer: _this.layer\n                    });\n                })[\"catch\"](function(error) {\n                    return (0, _logDefault.default).error(error)();\n                });\n            }\n        },\n        {\n            key: \"_resolveAsyncIterable\",\n            value: function() {\n                var _resolveAsyncIterable2 = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(propName, iterable) {\n                    var asyncProp, loadCount, data, count, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, chunk, onDataLoad;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                if (propName !== \"data\") this._setPropValue(propName, iterable);\n                                asyncProp = this.asyncProps[propName];\n                                asyncProp.pendingLoadCount++;\n                                loadCount = asyncProp.pendingLoadCount;\n                                data = [];\n                                count = 0;\n                                _iteratorNormalCompletion = true;\n                                _didIteratorError = false;\n                                _context.prev = 8;\n                                _iterator = (0, _asyncIteratorDefault.default)(iterable);\n                            case 10:\n                                _context.next = 12;\n                                return _iterator.next();\n                            case 12:\n                                _step = _context.sent;\n                                _iteratorNormalCompletion = _step.done;\n                                _context.next = 16;\n                                return _step.value;\n                            case 16:\n                                _value = _context.sent;\n                                if (_iteratorNormalCompletion) {\n                                    _context.next = 26;\n                                    break;\n                                }\n                                chunk = _value;\n                                data = this._postProcessValue(propName, chunk, data);\n                                Object.defineProperty(data, \"__diff\", {\n                                    enumerable: false,\n                                    value: [\n                                        {\n                                            startRow: count,\n                                            endRow: data.length\n                                        }\n                                    ]\n                                });\n                                count = data.length;\n                                this._setAsyncPropValue(propName, data, loadCount);\n                            case 23:\n                                _iteratorNormalCompletion = true;\n                                _context.next = 10;\n                                break;\n                            case 26:\n                                _context.next = 32;\n                                break;\n                            case 28:\n                                _context.prev = 28;\n                                _context.t0 = _context[\"catch\"](8);\n                                _didIteratorError = true;\n                                _iteratorError = _context.t0;\n                            case 32:\n                                _context.prev = 32;\n                                _context.prev = 33;\n                                if (!(!_iteratorNormalCompletion && _iterator[\"return\"] != null)) {\n                                    _context.next = 37;\n                                    break;\n                                }\n                                _context.next = 37;\n                                return _iterator[\"return\"]();\n                            case 37:\n                                _context.prev = 37;\n                                if (!_didIteratorError) {\n                                    _context.next = 40;\n                                    break;\n                                }\n                                throw _iteratorError;\n                            case 40:\n                                return _context.finish(37);\n                            case 41:\n                                return _context.finish(32);\n                            case 42:\n                                onDataLoad = this.layer && this.layer.props.onDataLoad;\n                                if (onDataLoad) onDataLoad(data, {\n                                    propName: propName,\n                                    layer: this.layer\n                                });\n                            case 44:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this, [\n                        [\n                            8,\n                            28,\n                            32,\n                            42\n                        ],\n                        [\n                            33,\n                            ,\n                            37,\n                            41\n                        ]\n                    ]);\n                }));\n                function _resolveAsyncIterable(_x, _x2) {\n                    return _resolveAsyncIterable2.apply(this, arguments);\n                }\n                return _resolveAsyncIterable;\n            }()\n        },\n        {\n            key: \"_postProcessValue\",\n            value: function _postProcessValue(propName, value, previousValue) {\n                var _ref = this.component ? this.component.props : {}, dataTransform = _ref.dataTransform;\n                if (propName !== \"data\") return value;\n                if (dataTransform) return dataTransform(value, previousValue);\n                return previousValue ? previousValue.concat(value) : value;\n            }\n        },\n        {\n            key: \"_createAsyncPropData\",\n            value: function _createAsyncPropData(propName, value, defaultValue) {\n                var asyncProp = this.asyncProps[propName];\n                if (!asyncProp) this.asyncProps[propName] = {\n                    lastValue: null,\n                    resolvedValue: defaultValue,\n                    pendingLoadCount: 0,\n                    resolvedLoadCount: 0\n                };\n            }\n        }\n    ]);\n    return ComponentState1;\n}();\n\n},{\"@babel/runtime/regenerator\":\"hCi6z\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"1U3uv\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/asyncIterator\":\"g5YXH\",\"../utils/log\":\"1biSe\",\"../utils/iterable-utils\":\"kj5eS\",\"./constants\":\"cM1ws\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gPQ8O\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LayerState);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _componentState = require(\"../lifecycle/component-state\");\nvar _componentStateDefault = parcelHelpers.interopDefault(_componentState);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LayerState = function(_ComponentState) {\n    (0, _inheritsDefault.default)(LayerState1, _ComponentState);\n    var _super = _createSuper(LayerState1);\n    function LayerState1(_ref) {\n        var _this;\n        var attributeManager = _ref.attributeManager, layer = _ref.layer;\n        (0, _classCallCheckDefault.default)(this, LayerState1);\n        _this = _super.call(this, layer);\n        _this.attributeManager = attributeManager;\n        _this.model = null;\n        _this.needsRedraw = true;\n        _this.subLayers = null;\n        return _this;\n    }\n    (0, _createClassDefault.default)(LayerState1, [\n        {\n            key: \"layer\",\n            get: function get() {\n                return this.component;\n            },\n            set: function set(layer) {\n                this.component = layer;\n            }\n        }\n    ]);\n    return LayerState1;\n}((0, _componentStateDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"../lifecycle/component-state\":\"kPTLy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6RrOW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ResourceManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar ResourceManager = function() {\n    function ResourceManager1(_ref) {\n        var gl = _ref.gl, protocol = _ref.protocol;\n        (0, _classCallCheckDefault.default)(this, ResourceManager1);\n        this.protocol = protocol || \"resource://\";\n        this._context = {\n            gl: gl,\n            resourceManager: this\n        };\n        this._resources = {};\n        this._consumers = {};\n        this._pruneRequest = null;\n    }\n    (0, _createClassDefault.default)(ResourceManager1, [\n        {\n            key: \"contains\",\n            value: function contains(resourceId) {\n                if (resourceId.startsWith(this.protocol)) return true;\n                return resourceId in this._resources;\n            }\n        },\n        {\n            key: \"add\",\n            value: function add(_ref2) {\n                var resourceId = _ref2.resourceId, data = _ref2.data, _ref2$forceUpdate = _ref2.forceUpdate, forceUpdate = _ref2$forceUpdate === void 0 ? false : _ref2$forceUpdate, _ref2$persistent = _ref2.persistent, persistent = _ref2$persistent === void 0 ? true : _ref2$persistent;\n                var res = this._resources[resourceId];\n                if (res) res.setData(data, forceUpdate);\n                else {\n                    res = new (0, _resourceDefault.default)(resourceId, data, this._context);\n                    this._resources[resourceId] = res;\n                }\n                res.persistent = persistent;\n            }\n        },\n        {\n            key: \"remove\",\n            value: function remove(resourceId) {\n                var res = this._resources[resourceId];\n                if (res) {\n                    res[\"delete\"]();\n                    delete this._resources[resourceId];\n                }\n            }\n        },\n        {\n            key: \"unsubscribe\",\n            value: function unsubscribe(_ref3) {\n                var consumerId = _ref3.consumerId;\n                var consumer = this._consumers[consumerId];\n                if (consumer) {\n                    for(var requestId in consumer){\n                        var request = consumer[requestId];\n                        if (request.resource) request.resource.unsubscribe(request);\n                    }\n                    delete this._consumers[consumerId];\n                    this.prune();\n                }\n            }\n        },\n        {\n            key: \"subscribe\",\n            value: function subscribe(_ref4) {\n                var resourceId = _ref4.resourceId, onChange = _ref4.onChange, consumerId = _ref4.consumerId, _ref4$requestId = _ref4.requestId, requestId = _ref4$requestId === void 0 ? \"default\" : _ref4$requestId;\n                var resources = this._resources, protocol = this.protocol;\n                if (resourceId.startsWith(protocol)) {\n                    resourceId = resourceId.replace(protocol, \"\");\n                    if (!resources[resourceId]) this.add({\n                        resourceId: resourceId,\n                        data: null,\n                        persistent: false\n                    });\n                }\n                var res = resources[resourceId];\n                this._track(consumerId, requestId, res, onChange);\n                if (res) return res.getData();\n                return undefined;\n            }\n        },\n        {\n            key: \"prune\",\n            value: function prune() {\n                var _this = this;\n                if (!this._pruneRequest) this._pruneRequest = setTimeout(function() {\n                    return _this._prune();\n                }, 0);\n            }\n        },\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var key in this._resources)this._resources[key][\"delete\"]();\n            }\n        },\n        {\n            key: \"_track\",\n            value: function _track(consumerId, requestId, resource, onChange) {\n                var consumers = this._consumers;\n                var consumer = consumers[consumerId] = consumers[consumerId] || {};\n                var request = consumer[requestId] || {};\n                if (request.resource) {\n                    request.resource.unsubscribe(request);\n                    request.resource = null;\n                    this.prune();\n                }\n                if (resource) {\n                    consumer[requestId] = request;\n                    request.onChange = onChange;\n                    request.resource = resource;\n                    resource.subscribe(request);\n                }\n            }\n        },\n        {\n            key: \"_prune\",\n            value: function _prune() {\n                this._pruneRequest = null;\n                for(var _i = 0, _Object$keys = Object.keys(this._resources); _i < _Object$keys.length; _i++){\n                    var key = _Object$keys[_i];\n                    var res = this._resources[key];\n                    if (!res.persistent && !res.inUse()) {\n                        res[\"delete\"]();\n                        delete this._resources[key];\n                    }\n                }\n            }\n        }\n    ]);\n    return ResourceManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./resource\":\"bx4Wk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bx4Wk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Resource);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@loaders.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar Resource = function() {\n    function Resource1(id, data, context) {\n        (0, _classCallCheckDefault.default)(this, Resource1);\n        this.id = id;\n        this.context = context;\n        this._loadCount = 0;\n        this._subscribers = new Set();\n        this.setData(data);\n    }\n    (0, _createClassDefault.default)(Resource1, [\n        {\n            key: \"subscribe\",\n            value: function subscribe(consumer) {\n                this._subscribers.add(consumer);\n            }\n        },\n        {\n            key: \"unsubscribe\",\n            value: function unsubscribe(consumer) {\n                this._subscribers[\"delete\"](consumer);\n            }\n        },\n        {\n            key: \"inUse\",\n            value: function inUse() {\n                return this._subscribers.size > 0;\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {}\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var _this = this;\n                return this.isLoaded ? this._error ? Promise.reject(this._error) : this._content : this._loader.then(function() {\n                    return _this.getData();\n                });\n            }\n        },\n        {\n            key: \"setData\",\n            value: function setData(data, forceUpdate) {\n                var _this2 = this;\n                if (data === this._data && !forceUpdate) return;\n                this._data = data;\n                var loadCount = ++this._loadCount;\n                var loader = data;\n                if (typeof data === \"string\") loader = (0, _core.load)(data);\n                if (loader instanceof Promise) {\n                    this.isLoaded = false;\n                    this._loader = loader.then(function(result) {\n                        if (_this2._loadCount === loadCount) {\n                            _this2.isLoaded = true;\n                            _this2._error = null;\n                            _this2._content = result;\n                        }\n                    })[\"catch\"](function(error) {\n                        if (_this2._loadCount === loadCount) {\n                            _this2.isLoaded = true;\n                            _this2._error = error || true;\n                        }\n                    });\n                } else {\n                    this.isLoaded = true;\n                    this._error = null;\n                    this._content = data;\n                }\n                var _iterator = _createForOfIteratorHelper(this._subscribers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var subscriber = _step.value;\n                        subscriber.onChange(this.getData());\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n            }\n        }\n    ]);\n    return Resource1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@loaders.gl/core\":\"kiTkb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hnSRX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ViewManager);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _flatten = require(\"../utils/flatten\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar ViewManager = function() {\n    function ViewManager1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, ViewManager1);\n        this.views = [];\n        this.width = 100;\n        this.height = 100;\n        this.viewState = {};\n        this.controllers = {};\n        this.timeline = props.timeline;\n        this._viewports = [];\n        this._viewportMap = {};\n        this._isUpdating = false;\n        this._needsRedraw = \"Initial render\";\n        this._needsUpdate = true;\n        this._eventManager = props.eventManager;\n        this._eventCallbacks = {\n            onViewStateChange: props.onViewStateChange,\n            onInteractiveStateChange: props.onInteractiveStateChange\n        };\n        Object.seal(this);\n        this.setProps(props);\n    }\n    (0, _createClassDefault.default)(ViewManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var key in this.controllers)if (this.controllers[key]) this.controllers[key].finalize();\n                this.controllers = {};\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                return redraw;\n            }\n        },\n        {\n            key: \"setNeedsUpdate\",\n            value: function setNeedsUpdate(reason) {\n                this._needsUpdate = this._needsUpdate || reason;\n                this._needsRedraw = this._needsRedraw || reason;\n            }\n        },\n        {\n            key: \"updateViewStates\",\n            value: function updateViewStates() {\n                for(var viewId in this.controllers){\n                    var controller = this.controllers[viewId];\n                    if (controller) controller.updateTransition();\n                }\n            }\n        },\n        {\n            key: \"getViewports\",\n            value: function getViewports(rect) {\n                if (rect) return this._viewports.filter(function(viewport) {\n                    return viewport.containsPixel(rect);\n                });\n                return this._viewports;\n            }\n        },\n        {\n            key: \"getViews\",\n            value: function getViews() {\n                var viewMap = {};\n                this.views.forEach(function(view) {\n                    viewMap[view.id] = view;\n                });\n                return viewMap;\n            }\n        },\n        {\n            key: \"getView\",\n            value: function getView(viewOrViewId) {\n                return typeof viewOrViewId === \"string\" ? this.views.find(function(view) {\n                    return view.id === viewOrViewId;\n                }) : viewOrViewId;\n            }\n        },\n        {\n            key: \"getViewState\",\n            value: function getViewState(viewId) {\n                var view = this.getView(viewId);\n                var viewState = view && this.viewState[view.getViewStateId()] || this.viewState;\n                return view ? view.filterViewState(viewState) : viewState;\n            }\n        },\n        {\n            key: \"getViewport\",\n            value: function getViewport(viewId) {\n                return this._viewportMap[viewId];\n            }\n        },\n        {\n            key: \"unproject\",\n            value: function unproject(xyz, opts) {\n                var viewports = this.getViewports();\n                var pixel = {\n                    x: xyz[0],\n                    y: xyz[1]\n                };\n                for(var i = viewports.length - 1; i >= 0; --i){\n                    var viewport = viewports[i];\n                    if (viewport.containsPixel(pixel)) {\n                        var p = xyz.slice();\n                        p[0] -= viewport.x;\n                        p[1] -= viewport.y;\n                        return viewport.unproject(p, opts);\n                    }\n                }\n                return null;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"views\" in props) this._setViews(props.views);\n                if (\"viewState\" in props) this._setViewState(props.viewState);\n                if (\"width\" in props || \"height\" in props) this._setSize(props.width, props.height);\n                if (!this._isUpdating) this._update();\n            }\n        },\n        {\n            key: \"_update\",\n            value: function _update() {\n                this._isUpdating = true;\n                if (this._needsUpdate) {\n                    this._needsUpdate = false;\n                    this._rebuildViewports();\n                }\n                if (this._needsUpdate) {\n                    this._needsUpdate = false;\n                    this._rebuildViewports();\n                }\n                this._isUpdating = false;\n            }\n        },\n        {\n            key: \"_setSize\",\n            value: function _setSize(width, height) {\n                (0, _assertDefault.default)(Number.isFinite(width) && Number.isFinite(height));\n                if (width !== this.width || height !== this.height) {\n                    this.width = width;\n                    this.height = height;\n                    this.setNeedsUpdate(\"Size changed\");\n                }\n            }\n        },\n        {\n            key: \"_setViews\",\n            value: function _setViews(views) {\n                views = (0, _flatten.flatten)(views, Boolean);\n                var viewsChanged = this._diffViews(views, this.views);\n                if (viewsChanged) this.setNeedsUpdate(\"views changed\");\n                this.views = views;\n            }\n        },\n        {\n            key: \"_setViewState\",\n            value: function _setViewState(viewState) {\n                if (viewState) {\n                    var viewStateChanged = !(0, _deepEqual.deepEqual)(viewState, this.viewState);\n                    if (viewStateChanged) this.setNeedsUpdate(\"viewState changed\");\n                    this.viewState = viewState;\n                } else (0, _logDefault.default).warn(\"missing `viewState` or `initialViewState`\")();\n            }\n        },\n        {\n            key: \"_onViewStateChange\",\n            value: function _onViewStateChange(viewId, event) {\n                event.viewId = viewId;\n                this._eventCallbacks.onViewStateChange(event);\n            }\n        },\n        {\n            key: \"_createController\",\n            value: function _createController(view, props) {\n                var Controller = props.type;\n                var controller = new Controller(_objectSpread({\n                    timeline: this.timeline,\n                    eventManager: this._eventManager,\n                    onViewStateChange: this._onViewStateChange.bind(this, props.id),\n                    onStateChange: this._eventCallbacks.onInteractiveStateChange,\n                    makeViewport: view._getViewport.bind(view)\n                }, props));\n                return controller;\n            }\n        },\n        {\n            key: \"_updateController\",\n            value: function _updateController(view, viewState, viewport, controller) {\n                var controllerProps = view.controller;\n                if (controllerProps) {\n                    controllerProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, viewState), view.props), controllerProps), {}, {\n                        id: view.id,\n                        x: viewport.x,\n                        y: viewport.y,\n                        width: viewport.width,\n                        height: viewport.height\n                    });\n                    if (controller) controller.setProps(controllerProps);\n                    else controller = this._createController(view, controllerProps);\n                    return controller;\n                }\n                return null;\n            }\n        },\n        {\n            key: \"_rebuildViewports\",\n            value: function _rebuildViewports() {\n                var width = this.width, height = this.height, views = this.views;\n                var oldControllers = this.controllers;\n                this._viewports = [];\n                this.controllers = {};\n                for(var i = views.length; i--;){\n                    var view = views[i];\n                    var viewState = this.getViewState(view);\n                    var viewport = view.makeViewport({\n                        width: width,\n                        height: height,\n                        viewState: viewState\n                    });\n                    this.controllers[view.id] = this._updateController(view, viewState, viewport, oldControllers[view.id]);\n                    this._viewports.unshift(viewport);\n                }\n                for(var id in oldControllers)if (oldControllers[id] && !this.controllers[id]) oldControllers[id].finalize();\n                this._buildViewportMap();\n            }\n        },\n        {\n            key: \"_buildViewportMap\",\n            value: function _buildViewportMap() {\n                var _this = this;\n                this._viewportMap = {};\n                this._viewports.forEach(function(viewport) {\n                    if (viewport.id) _this._viewportMap[viewport.id] = _this._viewportMap[viewport.id] || viewport;\n                });\n            }\n        },\n        {\n            key: \"_diffViews\",\n            value: function _diffViews(newViews, oldViews) {\n                if (newViews.length !== oldViews.length) return true;\n                return newViews.some(function(_, i) {\n                    return !newViews[i].equals(oldViews[i]);\n                });\n            }\n        }\n    ]);\n    return ViewManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../utils/assert\":\"1unZV\",\"../utils/deep-equal\":\"ftdIu\",\"../utils/log\":\"1biSe\",\"../utils/flatten\":\"i8Kfk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ftdIu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"deepEqual\", ()=>deepEqual);\nfunction deepEqual(a, b) {\n    if (a === b) return true;\n    if (!a || !b) return false;\n    for(var key in a){\n        var aValue = a[key];\n        var bValue = b[key];\n        var equals = aValue === bValue || Array.isArray(aValue) && Array.isArray(bValue) && deepEqual(aValue, bValue);\n        if (!equals) return false;\n    }\n    return true;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"54Z87\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>MapView);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _webMercatorViewport = require(\"../viewports/web-mercator-viewport\");\nvar _webMercatorViewportDefault = parcelHelpers.interopDefault(_webMercatorViewport);\nvar _mapController = require(\"../controllers/map-controller\");\nvar _mapControllerDefault = parcelHelpers.interopDefault(_mapController);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar MapView = function(_View) {\n    (0, _inheritsDefault.default)(MapView1, _View);\n    var _super = _createSuper(MapView1);\n    function MapView1(props) {\n        (0, _classCallCheckDefault.default)(this, MapView1);\n        return _super.call(this, Object.assign({}, props, {\n            type: (0, _webMercatorViewportDefault.default)\n        }));\n    }\n    (0, _createClassDefault.default)(MapView1, [\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _mapControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return MapView1;\n}((0, _viewDefault.default));\nMapView.displayName = \"MapView\";\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./view\":\"1tMXO\",\"../viewports/web-mercator-viewport\":\"liiGr\",\"../controllers/map-controller\":\"fZPqN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1tMXO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>View);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _positions = require(\"../utils/positions\");\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar View = function() {\n    function View1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, View1);\n        var _props$id = props.id, id = _props$id === void 0 ? null : _props$id, _props$x = props.x, x = _props$x === void 0 ? 0 : _props$x, _props$y = props.y, y = _props$y === void 0 ? 0 : _props$y, _props$width = props.width, width = _props$width === void 0 ? \"100%\" : _props$width, _props$height = props.height, height = _props$height === void 0 ? \"100%\" : _props$height, _props$projectionMatr = props.projectionMatrix, projectionMatrix = _props$projectionMatr === void 0 ? null : _props$projectionMatr, _props$fovy = props.fovy, fovy = _props$fovy === void 0 ? 50 : _props$fovy, _props$near = props.near, near = _props$near === void 0 ? 0.1 : _props$near, _props$far = props.far, far = _props$far === void 0 ? 1000 : _props$far, _props$modelMatrix = props.modelMatrix, modelMatrix = _props$modelMatrix === void 0 ? null : _props$modelMatrix, _props$viewportInstan = props.viewportInstance, viewportInstance = _props$viewportInstan === void 0 ? null : _props$viewportInstan, _props$type = props.type, type = _props$type === void 0 ? (0, _viewportDefault.default) : _props$type;\n        (0, _assertDefault.default)(!viewportInstance || viewportInstance instanceof (0, _viewportDefault.default));\n        this.viewportInstance = viewportInstance;\n        this.id = id || this.constructor.displayName || \"view\";\n        this.type = type;\n        this.props = Object.assign({}, props, {\n            id: this.id,\n            projectionMatrix: projectionMatrix,\n            fovy: fovy,\n            near: near,\n            far: far,\n            modelMatrix: modelMatrix\n        });\n        this._parseDimensions({\n            x: x,\n            y: y,\n            width: width,\n            height: height\n        });\n        this.equals = this.equals.bind(this);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(View1, [\n        {\n            key: \"equals\",\n            value: function equals(view) {\n                if (this === view) return true;\n                if (this.viewportInstance) return view.viewportInstance && this.viewportInstance.equals(view.viewportInstance);\n                var viewChanged = (0, _deepEqual.deepEqual)(this.props, view.props);\n                return viewChanged;\n            }\n        },\n        {\n            key: \"makeViewport\",\n            value: function makeViewport(_ref) {\n                var width = _ref.width, height = _ref.height, viewState = _ref.viewState;\n                if (this.viewportInstance) return this.viewportInstance;\n                viewState = this.filterViewState(viewState);\n                var viewportDimensions = this.getDimensions({\n                    width: width,\n                    height: height\n                });\n                var props = _objectSpread(_objectSpread(_objectSpread({}, viewState), this.props), viewportDimensions);\n                return this._getViewport(props);\n            }\n        },\n        {\n            key: \"getViewStateId\",\n            value: function getViewStateId() {\n                switch((0, _typeofDefault.default)(this.props.viewState)){\n                    case \"string\":\n                        return this.props.viewState;\n                    case \"object\":\n                        return this.props.viewState && this.props.viewState.id;\n                    default:\n                        return this.id;\n                }\n            }\n        },\n        {\n            key: \"filterViewState\",\n            value: function filterViewState(viewState) {\n                if (this.props.viewState && (0, _typeofDefault.default)(this.props.viewState) === \"object\") {\n                    if (!this.props.viewState.id) return this.props.viewState;\n                    var newViewState = Object.assign({}, viewState);\n                    for(var key in this.props.viewState)if (key !== \"id\") newViewState[key] = this.props.viewState[key];\n                    return newViewState;\n                }\n                return viewState;\n            }\n        },\n        {\n            key: \"getDimensions\",\n            value: function getDimensions(_ref2) {\n                var width = _ref2.width, height = _ref2.height;\n                return {\n                    x: (0, _positions.getPosition)(this._x, width),\n                    y: (0, _positions.getPosition)(this._y, height),\n                    width: (0, _positions.getPosition)(this._width, width),\n                    height: (0, _positions.getPosition)(this._height, height)\n                };\n            }\n        },\n        {\n            key: \"_getControllerProps\",\n            value: function _getControllerProps(defaultOpts) {\n                var opts = this.props.controller;\n                if (!opts) return null;\n                if (opts === true) return defaultOpts;\n                if (typeof opts === \"function\") opts = {\n                    type: opts\n                };\n                return Object.assign({}, defaultOpts, opts);\n            }\n        },\n        {\n            key: \"_getViewport\",\n            value: function _getViewport(props) {\n                var ViewportType = this.type;\n                return new ViewportType(props);\n            }\n        },\n        {\n            key: \"_parseDimensions\",\n            value: function _parseDimensions(_ref3) {\n                var x = _ref3.x, y = _ref3.y, width = _ref3.width, height = _ref3.height;\n                this._x = (0, _positions.parsePosition)(x);\n                this._y = (0, _positions.parsePosition)(y);\n                this._width = (0, _positions.parsePosition)(width);\n                this._height = (0, _positions.parsePosition)(height);\n            }\n        }\n    ]);\n    return View1;\n}();\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../viewports/viewport\":\"iilpM\",\"../utils/positions\":\"aUUrs\",\"../utils/deep-equal\":\"ftdIu\",\"../utils/assert\":\"1unZV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aUUrs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parsePosition\", ()=>parsePosition);\nparcelHelpers.export(exports, \"getPosition\", ()=>getPosition);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar PERCENT_OR_PIXELS_REGEX = /([0-9]+\\.?[0-9]*)(%|px)/;\nfunction parsePosition(value) {\n    switch((0, _typeofDefault.default)(value)){\n        case \"number\":\n            return {\n                position: value,\n                relative: false\n            };\n        case \"string\":\n            var match = value.match(PERCENT_OR_PIXELS_REGEX);\n            if (match && match.length >= 3) {\n                var relative = match[2] === \"%\";\n                var position = parseFloat(match[1]);\n                return {\n                    position: relative ? position / 100 : position,\n                    relative: relative\n                };\n            }\n        default:\n            throw new Error(\"Could not parse position string \".concat(value));\n    }\n}\nfunction getPosition(position, extent) {\n    return position.relative ? Math.round(position.position * extent) : position.position;\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"5go3u\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fZPqN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"MAPBOX_LIMITS\", ()=>MAPBOX_LIMITS);\nparcelHelpers.export(exports, \"MapState\", ()=>MapState);\nparcelHelpers.export(exports, \"default\", ()=>MapController);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _viewState = require(\"./view-state\");\nvar _viewStateDefault = parcelHelpers.interopDefault(_viewState);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transitionManager = require(\"./transition-manager\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar PITCH_MOUSE_THRESHOLD = 5;\nvar PITCH_ACCEL = 1.2;\nvar LINEAR_TRANSITION_PROPS = {\n    transitionDuration: 300,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)(),\n    transitionInterruption: (0, _transitionManager.TRANSITION_EVENTS).BREAK\n};\nvar NO_TRANSITION_PROPS = {\n    transitionDuration: 0\n};\nvar MAPBOX_LIMITS = {\n    minZoom: 0,\n    maxZoom: 20,\n    minPitch: 0,\n    maxPitch: 60\n};\nvar DEFAULT_STATE = {\n    pitch: 0,\n    bearing: 0,\n    altitude: 1.5\n};\nvar MapState = function(_ViewState) {\n    (0, _inheritsDefault.default)(MapState1, _ViewState);\n    var _super = _createSuper(MapState1);\n    function MapState1() {\n        var _this;\n        var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, makeViewport = _ref.makeViewport, width = _ref.width, height = _ref.height, latitude = _ref.latitude, longitude = _ref.longitude, zoom = _ref.zoom, _ref$bearing = _ref.bearing, bearing = _ref$bearing === void 0 ? DEFAULT_STATE.bearing : _ref$bearing, _ref$pitch = _ref.pitch, pitch = _ref$pitch === void 0 ? DEFAULT_STATE.pitch : _ref$pitch, _ref$altitude = _ref.altitude, altitude = _ref$altitude === void 0 ? DEFAULT_STATE.altitude : _ref$altitude, _ref$maxZoom = _ref.maxZoom, maxZoom = _ref$maxZoom === void 0 ? MAPBOX_LIMITS.maxZoom : _ref$maxZoom, _ref$minZoom = _ref.minZoom, minZoom = _ref$minZoom === void 0 ? MAPBOX_LIMITS.minZoom : _ref$minZoom, _ref$maxPitch = _ref.maxPitch, maxPitch = _ref$maxPitch === void 0 ? MAPBOX_LIMITS.maxPitch : _ref$maxPitch, _ref$minPitch = _ref.minPitch, minPitch = _ref$minPitch === void 0 ? MAPBOX_LIMITS.minPitch : _ref$minPitch, startPanLngLat = _ref.startPanLngLat, startZoomLngLat = _ref.startZoomLngLat, startBearing = _ref.startBearing, startPitch = _ref.startPitch, startZoom = _ref.startZoom;\n        (0, _classCallCheckDefault.default)(this, MapState1);\n        (0, _assertDefault.default)(Number.isFinite(longitude), \"`longitude` must be supplied\");\n        (0, _assertDefault.default)(Number.isFinite(latitude), \"`latitude` must be supplied\");\n        (0, _assertDefault.default)(Number.isFinite(zoom), \"`zoom` must be supplied\");\n        _this = _super.call(this, {\n            width: width,\n            height: height,\n            latitude: latitude,\n            longitude: longitude,\n            zoom: zoom,\n            bearing: bearing,\n            pitch: pitch,\n            altitude: altitude,\n            maxZoom: maxZoom,\n            minZoom: minZoom,\n            maxPitch: maxPitch,\n            minPitch: minPitch\n        });\n        _this._interactiveState = {\n            startPanLngLat: startPanLngLat,\n            startZoomLngLat: startZoomLngLat,\n            startBearing: startBearing,\n            startPitch: startPitch,\n            startZoom: startZoom\n        };\n        _this.makeViewport = makeViewport;\n        return _this;\n    }\n    (0, _createClassDefault.default)(MapState1, [\n        {\n            key: \"getViewportProps\",\n            value: function getViewportProps() {\n                return this._viewportProps;\n            }\n        },\n        {\n            key: \"getInteractiveState\",\n            value: function getInteractiveState() {\n                return this._interactiveState;\n            }\n        },\n        {\n            key: \"panStart\",\n            value: function panStart(_ref2) {\n                var pos = _ref2.pos;\n                return this._getUpdatedState({\n                    startPanLngLat: this._unproject(pos)\n                });\n            }\n        },\n        {\n            key: \"pan\",\n            value: function pan(_ref3) {\n                var pos = _ref3.pos, startPos = _ref3.startPos;\n                var startPanLngLat = this._interactiveState.startPanLngLat || this._unproject(startPos);\n                if (!startPanLngLat) return this;\n                var _this$_calculateNewLn = this._calculateNewLngLat({\n                    startPanLngLat: startPanLngLat,\n                    pos: pos\n                }), _this$_calculateNewLn2 = (0, _slicedToArrayDefault.default)(_this$_calculateNewLn, 2), longitude = _this$_calculateNewLn2[0], latitude = _this$_calculateNewLn2[1];\n                return this._getUpdatedState({\n                    longitude: longitude,\n                    latitude: latitude\n                });\n            }\n        },\n        {\n            key: \"panEnd\",\n            value: function panEnd() {\n                return this._getUpdatedState({\n                    startPanLngLat: null\n                });\n            }\n        },\n        {\n            key: \"rotateStart\",\n            value: function rotateStart(_ref4) {\n                var pos = _ref4.pos;\n                return this._getUpdatedState({\n                    startBearing: this._viewportProps.bearing,\n                    startPitch: this._viewportProps.pitch\n                });\n            }\n        },\n        {\n            key: \"rotate\",\n            value: function rotate(_ref5) {\n                var _ref5$deltaScaleX = _ref5.deltaScaleX, deltaScaleX = _ref5$deltaScaleX === void 0 ? 0 : _ref5$deltaScaleX, _ref5$deltaScaleY = _ref5.deltaScaleY, deltaScaleY = _ref5$deltaScaleY === void 0 ? 0 : _ref5$deltaScaleY;\n                var _this$_interactiveSta = this._interactiveState, startBearing = _this$_interactiveSta.startBearing, startPitch = _this$_interactiveSta.startPitch;\n                if (!Number.isFinite(startBearing) || !Number.isFinite(startPitch)) return this;\n                var _this$_calculateNewPi = this._calculateNewPitchAndBearing({\n                    deltaScaleX: deltaScaleX,\n                    deltaScaleY: deltaScaleY,\n                    startBearing: startBearing,\n                    startPitch: startPitch\n                }), pitch = _this$_calculateNewPi.pitch, bearing = _this$_calculateNewPi.bearing;\n                return this._getUpdatedState({\n                    bearing: bearing,\n                    pitch: pitch\n                });\n            }\n        },\n        {\n            key: \"rotateEnd\",\n            value: function rotateEnd() {\n                return this._getUpdatedState({\n                    startBearing: null,\n                    startPitch: null\n                });\n            }\n        },\n        {\n            key: \"zoomStart\",\n            value: function zoomStart(_ref6) {\n                var pos = _ref6.pos;\n                return this._getUpdatedState({\n                    startZoomLngLat: this._unproject(pos),\n                    startZoom: this._viewportProps.zoom\n                });\n            }\n        },\n        {\n            key: \"zoom\",\n            value: function zoom(_ref7) {\n                var pos = _ref7.pos, startPos = _ref7.startPos, scale = _ref7.scale;\n                var _this$_interactiveSta2 = this._interactiveState, startZoom = _this$_interactiveSta2.startZoom, startZoomLngLat = _this$_interactiveSta2.startZoomLngLat;\n                if (!Number.isFinite(startZoom)) {\n                    startZoom = this._viewportProps.zoom;\n                    startZoomLngLat = this._unproject(startPos) || this._unproject(pos);\n                }\n                var zoom = this._calculateNewZoom({\n                    scale: scale,\n                    startZoom: startZoom\n                });\n                var zoomedViewport = this.makeViewport(_objectSpread(_objectSpread({}, this._viewportProps), {}, {\n                    zoom: zoom\n                }));\n                var _zoomedViewport$getMa = zoomedViewport.getMapCenterByLngLatPosition({\n                    lngLat: startZoomLngLat,\n                    pos: pos\n                }), _zoomedViewport$getMa2 = (0, _slicedToArrayDefault.default)(_zoomedViewport$getMa, 2), longitude = _zoomedViewport$getMa2[0], latitude = _zoomedViewport$getMa2[1];\n                return this._getUpdatedState({\n                    zoom: zoom,\n                    longitude: longitude,\n                    latitude: latitude\n                });\n            }\n        },\n        {\n            key: \"zoomEnd\",\n            value: function zoomEnd() {\n                return this._getUpdatedState({\n                    startZoomLngLat: null,\n                    startZoom: null\n                });\n            }\n        },\n        {\n            key: \"zoomIn\",\n            value: function zoomIn() {\n                return this._zoomFromCenter(2);\n            }\n        },\n        {\n            key: \"zoomOut\",\n            value: function zoomOut() {\n                return this._zoomFromCenter(0.5);\n            }\n        },\n        {\n            key: \"moveLeft\",\n            value: function moveLeft() {\n                return this._panFromCenter([\n                    100,\n                    0\n                ]);\n            }\n        },\n        {\n            key: \"moveRight\",\n            value: function moveRight() {\n                return this._panFromCenter([\n                    -100,\n                    0\n                ]);\n            }\n        },\n        {\n            key: \"moveUp\",\n            value: function moveUp() {\n                return this._panFromCenter([\n                    0,\n                    100\n                ]);\n            }\n        },\n        {\n            key: \"moveDown\",\n            value: function moveDown() {\n                return this._panFromCenter([\n                    0,\n                    -100\n                ]);\n            }\n        },\n        {\n            key: \"rotateLeft\",\n            value: function rotateLeft() {\n                return this._getUpdatedState({\n                    bearing: this._viewportProps.bearing - 15\n                });\n            }\n        },\n        {\n            key: \"rotateRight\",\n            value: function rotateRight() {\n                return this._getUpdatedState({\n                    bearing: this._viewportProps.bearing + 15\n                });\n            }\n        },\n        {\n            key: \"rotateUp\",\n            value: function rotateUp() {\n                return this._getUpdatedState({\n                    pitch: this._viewportProps.pitch + 10\n                });\n            }\n        },\n        {\n            key: \"rotateDown\",\n            value: function rotateDown() {\n                return this._getUpdatedState({\n                    pitch: this._viewportProps.pitch - 10\n                });\n            }\n        },\n        {\n            key: \"shortestPathFrom\",\n            value: function shortestPathFrom(viewState) {\n                var fromProps = viewState.getViewportProps();\n                var props = Object.assign({}, this._viewportProps);\n                var bearing = props.bearing, longitude = props.longitude;\n                if (Math.abs(bearing - fromProps.bearing) > 180) props.bearing = bearing < 0 ? bearing + 360 : bearing - 360;\n                if (Math.abs(longitude - fromProps.longitude) > 180) props.longitude = longitude < 0 ? longitude + 360 : longitude - 360;\n                return props;\n            }\n        },\n        {\n            key: \"_zoomFromCenter\",\n            value: function _zoomFromCenter(scale) {\n                var _this$_viewportProps = this._viewportProps, width = _this$_viewportProps.width, height = _this$_viewportProps.height;\n                return this.zoom({\n                    pos: [\n                        width / 2,\n                        height / 2\n                    ],\n                    scale: scale\n                });\n            }\n        },\n        {\n            key: \"_panFromCenter\",\n            value: function _panFromCenter(offset) {\n                var _this$_viewportProps2 = this._viewportProps, width = _this$_viewportProps2.width, height = _this$_viewportProps2.height;\n                return this.pan({\n                    startPos: [\n                        width / 2,\n                        height / 2\n                    ],\n                    pos: [\n                        width / 2 + offset[0],\n                        height / 2 + offset[1]\n                    ]\n                });\n            }\n        },\n        {\n            key: \"_getUpdatedState\",\n            value: function _getUpdatedState(newProps) {\n                return new this.constructor(_objectSpread(_objectSpread(_objectSpread({\n                    makeViewport: this.makeViewport\n                }, this._viewportProps), this._interactiveState), newProps));\n            }\n        },\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                var maxZoom = props.maxZoom, minZoom = props.minZoom, zoom = props.zoom;\n                props.zoom = (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n                var maxPitch = props.maxPitch, minPitch = props.minPitch, pitch = props.pitch;\n                props.pitch = (0, _mathGl.clamp)(pitch, minPitch, maxPitch);\n                Object.assign(props, (0, _webMercator.normalizeViewportProps)(props));\n                return props;\n            }\n        },\n        {\n            key: \"_unproject\",\n            value: function _unproject(pos) {\n                var viewport = this.makeViewport(this._viewportProps);\n                return pos && viewport.unproject(pos);\n            }\n        },\n        {\n            key: \"_calculateNewLngLat\",\n            value: function _calculateNewLngLat(_ref8) {\n                var startPanLngLat = _ref8.startPanLngLat, pos = _ref8.pos;\n                var viewport = this.makeViewport(this._viewportProps);\n                return viewport.getMapCenterByLngLatPosition({\n                    lngLat: startPanLngLat,\n                    pos: pos\n                });\n            }\n        },\n        {\n            key: \"_calculateNewZoom\",\n            value: function _calculateNewZoom(_ref9) {\n                var scale = _ref9.scale, startZoom = _ref9.startZoom;\n                var _this$_viewportProps3 = this._viewportProps, maxZoom = _this$_viewportProps3.maxZoom, minZoom = _this$_viewportProps3.minZoom;\n                var zoom = startZoom + Math.log2(scale);\n                return (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n            }\n        },\n        {\n            key: \"_calculateNewPitchAndBearing\",\n            value: function _calculateNewPitchAndBearing(_ref10) {\n                var deltaScaleX = _ref10.deltaScaleX, deltaScaleY = _ref10.deltaScaleY, startBearing = _ref10.startBearing, startPitch = _ref10.startPitch;\n                deltaScaleY = (0, _mathGl.clamp)(deltaScaleY, -1, 1);\n                var _this$_viewportProps4 = this._viewportProps, minPitch = _this$_viewportProps4.minPitch, maxPitch = _this$_viewportProps4.maxPitch;\n                var bearing = startBearing + 180 * deltaScaleX;\n                var pitch = startPitch;\n                if (deltaScaleY > 0) pitch = startPitch + deltaScaleY * (maxPitch - startPitch);\n                else if (deltaScaleY < 0) pitch = startPitch - deltaScaleY * (minPitch - startPitch);\n                return {\n                    pitch: pitch,\n                    bearing: bearing\n                };\n            }\n        }\n    ]);\n    return MapState1;\n}((0, _viewStateDefault.default));\nvar MapController = function(_Controller) {\n    (0, _inheritsDefault.default)(MapController1, _Controller);\n    var _super2 = _createSuper(MapController1);\n    function MapController1(props) {\n        var _this2;\n        (0, _classCallCheckDefault.default)(this, MapController1);\n        _this2 = _super2.call(this, MapState, props);\n        _this2.invertPan = true;\n        return _this2;\n    }\n    (0, _createClassDefault.default)(MapController1, [\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return LINEAR_TRANSITION_PROPS;\n            }\n        },\n        {\n            key: \"_onPanRotate\",\n            value: function _onPanRotate(event) {\n                if (!this.dragRotate) return false;\n                var deltaX = event.deltaX, deltaY = event.deltaY;\n                var _this$getCenter = this.getCenter(event), _this$getCenter2 = (0, _slicedToArrayDefault.default)(_this$getCenter, 2), centerY = _this$getCenter2[1];\n                var startY = centerY - deltaY;\n                var _this$controllerState = this.controllerState.getViewportProps(), width = _this$controllerState.width, height = _this$controllerState.height;\n                var deltaScaleX = deltaX / width;\n                var deltaScaleY = 0;\n                if (deltaY > 0) {\n                    if (Math.abs(height - startY) > PITCH_MOUSE_THRESHOLD) deltaScaleY = deltaY / (startY - height) * PITCH_ACCEL;\n                } else if (deltaY < 0) {\n                    if (startY > PITCH_MOUSE_THRESHOLD) deltaScaleY = 1 - centerY / startY;\n                }\n                deltaScaleY = Math.min(1, Math.max(-1, deltaScaleY));\n                var newControllerState = this.controllerState.rotate({\n                    deltaScaleX: deltaScaleX,\n                    deltaScaleY: deltaScaleY\n                });\n                return this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true,\n                    isRotating: true\n                });\n            }\n        }\n    ]);\n    return MapController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"math.gl\":\"huJnq\",\"./controller\":\"cZLc0\",\"./view-state\":\"9BTJF\",\"@math.gl/web-mercator\":\"agpg6\",\"../utils/assert\":\"1unZV\",\"../transitions/linear-interpolator\":\"k5Lgz\",\"./transition-manager\":\"BsfRu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cZLc0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Controller);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _transitionManager = require(\"./transition-manager\");\nvar _transitionManagerDefault = parcelHelpers.interopDefault(_transitionManager);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar NO_TRANSITION_PROPS = {\n    transitionDuration: 0\n};\nvar ZOOM_ACCEL = 0.01;\nvar EVENT_TYPES = {\n    WHEEL: [\n        \"wheel\"\n    ],\n    PAN: [\n        \"panstart\",\n        \"panmove\",\n        \"panend\"\n    ],\n    PINCH: [\n        \"pinchstart\",\n        \"pinchmove\",\n        \"pinchend\"\n    ],\n    DOUBLE_TAP: [\n        \"doubletap\"\n    ],\n    KEYBOARD: [\n        \"keydown\"\n    ]\n};\nvar Controller = function() {\n    function Controller1(ControllerState) {\n        var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Controller1);\n        (0, _assertDefault.default)(ControllerState);\n        this.ControllerState = ControllerState;\n        this.controllerState = null;\n        this.controllerStateProps = null;\n        this.eventManager = null;\n        this.transitionManager = new (0, _transitionManagerDefault.default)(ControllerState, options);\n        this._events = null;\n        this._state = {\n            isDragging: false\n        };\n        this._customEvents = [];\n        this.onViewStateChange = null;\n        this.onStateChange = null;\n        this.invertPan = false;\n        this.handleEvent = this.handleEvent.bind(this);\n        this.setProps(options);\n    }\n    (0, _createClassDefault.default)(Controller1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var eventName in this._events)if (this._events[eventName]) this.eventManager.off(eventName, this.handleEvent);\n                this.transitionManager.finalize();\n            }\n        },\n        {\n            key: \"handleEvent\",\n            value: function handleEvent(event) {\n                var ControllerState = this.ControllerState;\n                this.controllerState = new ControllerState(_objectSpread(_objectSpread({\n                    makeViewport: this.makeViewport\n                }, this.controllerStateProps), this._state));\n                switch(event.type){\n                    case \"panstart\":\n                        return this._onPanStart(event);\n                    case \"panmove\":\n                        return this._onPan(event);\n                    case \"panend\":\n                        return this._onPanEnd(event);\n                    case \"pinchstart\":\n                        return this._onPinchStart(event);\n                    case \"pinchmove\":\n                        return this._onPinch(event);\n                    case \"pinchend\":\n                        return this._onPinchEnd(event);\n                    case \"doubletap\":\n                        return this._onDoubleTap(event);\n                    case \"wheel\":\n                        return this._onWheel(event);\n                    case \"keydown\":\n                        return this._onKeyDown(event);\n                    default:\n                        return false;\n                }\n            }\n        },\n        {\n            key: \"getCenter\",\n            value: function getCenter(event) {\n                var _this$controllerState = this.controllerStateProps, x = _this$controllerState.x, y = _this$controllerState.y;\n                var offsetCenter = event.offsetCenter;\n                return [\n                    offsetCenter.x - x,\n                    offsetCenter.y - y\n                ];\n            }\n        },\n        {\n            key: \"isPointInBounds\",\n            value: function isPointInBounds(pos, event) {\n                var _this$controllerState2 = this.controllerStateProps, width = _this$controllerState2.width, height = _this$controllerState2.height;\n                if (event && event.handled) return false;\n                var inside = pos[0] >= 0 && pos[0] <= width && pos[1] >= 0 && pos[1] <= height;\n                if (inside && event) event.stopPropagation();\n                return inside;\n            }\n        },\n        {\n            key: \"isFunctionKeyPressed\",\n            value: function isFunctionKeyPressed(event) {\n                var srcEvent = event.srcEvent;\n                return Boolean(srcEvent.metaKey || srcEvent.altKey || srcEvent.ctrlKey || srcEvent.shiftKey);\n            }\n        },\n        {\n            key: \"isDragging\",\n            value: function isDragging() {\n                return this._state.isDragging;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"onViewStateChange\" in props) this.onViewStateChange = props.onViewStateChange;\n                if (\"onStateChange\" in props) this.onStateChange = props.onStateChange;\n                if (\"makeViewport\" in props) this.makeViewport = props.makeViewport;\n                this.controllerStateProps = props;\n                if (\"eventManager\" in props && this.eventManager !== props.eventManager) {\n                    this.eventManager = props.eventManager;\n                    this._events = {};\n                    this.toggleEvents(this._customEvents, true);\n                }\n                this.transitionManager.processViewStateChange(this.controllerStateProps);\n                var _props$scrollZoom = props.scrollZoom, scrollZoom = _props$scrollZoom === void 0 ? true : _props$scrollZoom, _props$dragPan = props.dragPan, dragPan = _props$dragPan === void 0 ? true : _props$dragPan, _props$dragRotate = props.dragRotate, dragRotate = _props$dragRotate === void 0 ? true : _props$dragRotate, _props$doubleClickZoo = props.doubleClickZoom, doubleClickZoom = _props$doubleClickZoo === void 0 ? true : _props$doubleClickZoo, _props$touchZoom = props.touchZoom, touchZoom = _props$touchZoom === void 0 ? true : _props$touchZoom, _props$touchRotate = props.touchRotate, touchRotate = _props$touchRotate === void 0 ? false : _props$touchRotate, _props$keyboard = props.keyboard, keyboard = _props$keyboard === void 0 ? true : _props$keyboard;\n                var isInteractive = Boolean(this.onViewStateChange);\n                this.toggleEvents(EVENT_TYPES.WHEEL, isInteractive && scrollZoom);\n                this.toggleEvents(EVENT_TYPES.PAN, isInteractive && (dragPan || dragRotate));\n                this.toggleEvents(EVENT_TYPES.PINCH, isInteractive && (touchZoom || touchRotate));\n                this.toggleEvents(EVENT_TYPES.DOUBLE_TAP, isInteractive && doubleClickZoom);\n                this.toggleEvents(EVENT_TYPES.KEYBOARD, isInteractive && keyboard);\n                this.scrollZoom = scrollZoom;\n                this.dragPan = dragPan;\n                this.dragRotate = dragRotate;\n                this.doubleClickZoom = doubleClickZoom;\n                this.touchZoom = touchZoom;\n                this.touchRotate = touchRotate;\n                this.keyboard = keyboard;\n            }\n        },\n        {\n            key: \"updateTransition\",\n            value: function updateTransition() {\n                this.transitionManager.updateTransition();\n            }\n        },\n        {\n            key: \"toggleEvents\",\n            value: function toggleEvents(eventNames, enabled) {\n                var _this = this;\n                if (this.eventManager) eventNames.forEach(function(eventName) {\n                    if (_this._events[eventName] !== enabled) {\n                        _this._events[eventName] = enabled;\n                        if (enabled) _this.eventManager.on(eventName, _this.handleEvent);\n                        else _this.eventManager.off(eventName, _this.handleEvent);\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateViewport\",\n            value: function updateViewport(newControllerState) {\n                var extraProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                var interactionState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n                var viewState = Object.assign({}, newControllerState.getViewportProps(), extraProps);\n                var changed = this.controllerState !== newControllerState;\n                if (changed) {\n                    var oldViewState = this.controllerState ? this.controllerState.getViewportProps() : null;\n                    if (this.onViewStateChange) this.onViewStateChange({\n                        viewState: viewState,\n                        interactionState: interactionState,\n                        oldViewState: oldViewState\n                    });\n                }\n                Object.assign(this._state, newControllerState.getInteractiveState(), interactionState);\n                if (this.onStateChange) this.onStateChange(this._state);\n            }\n        },\n        {\n            key: \"_onPanStart\",\n            value: function _onPanStart(event) {\n                var pos = this.getCenter(event);\n                if (!this.isPointInBounds(pos, event)) return false;\n                var newControllerState = this.controllerState.panStart({\n                    pos: pos\n                }).rotateStart({\n                    pos: pos\n                });\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPan\",\n            value: function _onPan(event) {\n                if (!this.isDragging()) return false;\n                var alternateMode = this.isFunctionKeyPressed(event) || event.rightButton;\n                alternateMode = this.invertPan ? !alternateMode : alternateMode;\n                return alternateMode ? this._onPanMove(event) : this._onPanRotate(event);\n            }\n        },\n        {\n            key: \"_onPanEnd\",\n            value: function _onPanEnd(event) {\n                var newControllerState = this.controllerState.panEnd().rotateEnd();\n                this.updateViewport(newControllerState, null, {\n                    isDragging: false,\n                    isPanning: false,\n                    isRotating: false\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPanMove\",\n            value: function _onPanMove(event) {\n                if (!this.dragPan) return false;\n                var pos = this.getCenter(event);\n                var newControllerState = this.controllerState.pan({\n                    pos: pos\n                });\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true,\n                    isPanning: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPanRotate\",\n            value: function _onPanRotate(event) {\n                if (!this.dragRotate) return false;\n                var deltaX = event.deltaX, deltaY = event.deltaY;\n                var _this$controllerState3 = this.controllerState.getViewportProps(), width = _this$controllerState3.width, height = _this$controllerState3.height;\n                var deltaScaleX = deltaX / width;\n                var deltaScaleY = deltaY / height;\n                var newControllerState = this.controllerState.rotate({\n                    deltaScaleX: deltaScaleX,\n                    deltaScaleY: deltaScaleY\n                });\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true,\n                    isRotating: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onWheel\",\n            value: function _onWheel(event) {\n                if (!this.scrollZoom) return false;\n                event.preventDefault();\n                var pos = this.getCenter(event);\n                if (!this.isPointInBounds(pos, event)) return false;\n                var delta = event.delta;\n                var scale = 2 / (1 + Math.exp(-Math.abs(delta * ZOOM_ACCEL)));\n                if (delta < 0 && scale !== 0) scale = 1 / scale;\n                var newControllerState = this.controllerState.zoom({\n                    pos: pos,\n                    scale: scale\n                });\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isZooming: true,\n                    isPanning: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPinchStart\",\n            value: function _onPinchStart(event) {\n                var pos = this.getCenter(event);\n                if (!this.isPointInBounds(pos, event)) return false;\n                var newControllerState = this.controllerState.zoomStart({\n                    pos: pos\n                }).rotateStart({\n                    pos: pos\n                });\n                this._state.startPinchRotation = event.rotation;\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPinch\",\n            value: function _onPinch(event) {\n                if (!this.touchZoom && !this.touchRotate) return false;\n                if (!this.isDragging()) return false;\n                var newControllerState = this.controllerState;\n                if (this.touchZoom) {\n                    var scale = event.scale;\n                    var pos = this.getCenter(event);\n                    newControllerState = newControllerState.zoom({\n                        pos: pos,\n                        scale: scale\n                    });\n                }\n                if (this.touchRotate) {\n                    var rotation = event.rotation;\n                    var startPinchRotation = this._state.startPinchRotation;\n                    newControllerState = newControllerState.rotate({\n                        deltaScaleX: -(rotation - startPinchRotation) / 180\n                    });\n                }\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true,\n                    isPanning: this.touchZoom,\n                    isZooming: this.touchZoom,\n                    isRotating: this.touchRotate\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPinchEnd\",\n            value: function _onPinchEnd(event) {\n                var newControllerState = this.controllerState.zoomEnd().rotateEnd();\n                this._state.startPinchRotation = 0;\n                this.updateViewport(newControllerState, null, {\n                    isDragging: false,\n                    isPanning: false,\n                    isZooming: false,\n                    isRotating: false\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onDoubleTap\",\n            value: function _onDoubleTap(event) {\n                if (!this.doubleClickZoom) return false;\n                var pos = this.getCenter(event);\n                if (!this.isPointInBounds(pos, event)) return false;\n                var isZoomOut = this.isFunctionKeyPressed(event);\n                var newControllerState = this.controllerState.zoom({\n                    pos: pos,\n                    scale: isZoomOut ? 0.5 : 2\n                });\n                this.updateViewport(newControllerState, this._getTransitionProps(), {\n                    isZooming: true,\n                    isPanning: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onKeyDown\",\n            value: function _onKeyDown(event) {\n                if (!this.keyboard) return false;\n                var funcKey = this.isFunctionKeyPressed(event);\n                var controllerState = this.controllerState;\n                var newControllerState;\n                var interactionState = {};\n                switch(event.srcEvent.code){\n                    case \"Minus\":\n                        newControllerState = funcKey ? controllerState.zoomOut().zoomOut() : controllerState.zoomOut();\n                        interactionState.isZooming = true;\n                        break;\n                    case \"Equal\":\n                        newControllerState = funcKey ? controllerState.zoomIn().zoomIn() : controllerState.zoomIn();\n                        interactionState.isZooming = true;\n                        break;\n                    case \"ArrowLeft\":\n                        if (funcKey) {\n                            newControllerState = controllerState.rotateLeft();\n                            interactionState.isRotating = true;\n                        } else {\n                            newControllerState = controllerState.moveLeft();\n                            interactionState.isPanning = true;\n                        }\n                        break;\n                    case \"ArrowRight\":\n                        if (funcKey) {\n                            newControllerState = controllerState.rotateRight();\n                            interactionState.isRotating = true;\n                        } else {\n                            newControllerState = controllerState.moveRight();\n                            interactionState.isPanning = true;\n                        }\n                        break;\n                    case \"ArrowUp\":\n                        if (funcKey) {\n                            newControllerState = controllerState.rotateUp();\n                            interactionState.isRotating = true;\n                        } else {\n                            newControllerState = controllerState.moveUp();\n                            interactionState.isPanning = true;\n                        }\n                        break;\n                    case \"ArrowDown\":\n                        if (funcKey) {\n                            newControllerState = controllerState.rotateDown();\n                            interactionState.isRotating = true;\n                        } else {\n                            newControllerState = controllerState.moveDown();\n                            interactionState.isPanning = true;\n                        }\n                        break;\n                    default:\n                        return false;\n                }\n                this.updateViewport(newControllerState, this._getTransitionProps(), interactionState);\n                return true;\n            }\n        },\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return NO_TRANSITION_PROPS;\n            }\n        },\n        {\n            key: \"events\",\n            set: function set(customEvents) {\n                this.toggleEvents(this._customEvents, false);\n                this.toggleEvents(customEvents, true);\n                this._customEvents = customEvents;\n                this.setProps(this.controllerStateProps);\n            }\n        }\n    ]);\n    return Controller1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./transition-manager\":\"BsfRu\",\"../utils/assert\":\"1unZV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"BsfRu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TRANSITION_EVENTS\", ()=>TRANSITION_EVENTS);\nparcelHelpers.export(exports, \"default\", ()=>TransitionManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transition = require(\"../transitions/transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nvar noop = function noop() {};\nvar TRANSITION_EVENTS = {\n    BREAK: 1,\n    SNAP_TO_END: 2,\n    IGNORE: 3\n};\nvar DEFAULT_PROPS = {\n    transitionDuration: 0,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)(),\n    transitionInterruption: TRANSITION_EVENTS.BREAK,\n    onTransitionStart: noop,\n    onTransitionInterrupt: noop,\n    onTransitionEnd: noop\n};\nvar TransitionManager = function() {\n    function TransitionManager1(ControllerState) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, TransitionManager1);\n        this.ControllerState = ControllerState;\n        this.props = Object.assign({}, DEFAULT_PROPS, props);\n        this.propsInTransition = null;\n        this.transition = new (0, _transitionDefault.default)(props.timeline);\n        this.onViewStateChange = props.onViewStateChange;\n        this._onTransitionUpdate = this._onTransitionUpdate.bind(this);\n    }\n    (0, _createClassDefault.default)(TransitionManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this.transition.cancel();\n            }\n        },\n        {\n            key: \"getViewportInTransition\",\n            value: function getViewportInTransition() {\n                return this.propsInTransition;\n            }\n        },\n        {\n            key: \"processViewStateChange\",\n            value: function processViewStateChange(nextProps) {\n                var transitionTriggered = false;\n                var currentProps = this.props;\n                nextProps = Object.assign({}, DEFAULT_PROPS, nextProps);\n                this.props = nextProps;\n                if (this._shouldIgnoreViewportChange(currentProps, nextProps)) return transitionTriggered;\n                if (this._isTransitionEnabled(nextProps)) {\n                    var _this$transition$sett = this.transition.settings, interruption = _this$transition$sett.interruption, endProps = _this$transition$sett.endProps;\n                    var startProps = Object.assign({}, currentProps, interruption === TRANSITION_EVENTS.SNAP_TO_END ? endProps : this.propsInTransition || currentProps);\n                    this._triggerTransition(startProps, nextProps);\n                    transitionTriggered = true;\n                } else this.transition.cancel();\n                return transitionTriggered;\n            }\n        },\n        {\n            key: \"updateTransition\",\n            value: function updateTransition() {\n                this.transition.update();\n            }\n        },\n        {\n            key: \"_isTransitionEnabled\",\n            value: function _isTransitionEnabled(props) {\n                var transitionDuration = props.transitionDuration, transitionInterpolator = props.transitionInterpolator;\n                return (transitionDuration > 0 || transitionDuration === \"auto\") && Boolean(transitionInterpolator);\n            }\n        },\n        {\n            key: \"_isUpdateDueToCurrentTransition\",\n            value: function _isUpdateDueToCurrentTransition(props) {\n                if (this.transition.inProgress) return this.transition.settings.interpolator.arePropsEqual(props, this.propsInTransition);\n                return false;\n            }\n        },\n        {\n            key: \"_shouldIgnoreViewportChange\",\n            value: function _shouldIgnoreViewportChange(currentProps, nextProps) {\n                if (this.transition.inProgress) return this.transition.settings.interruption === TRANSITION_EVENTS.IGNORE || this._isUpdateDueToCurrentTransition(nextProps);\n                else if (this._isTransitionEnabled(nextProps)) return nextProps.transitionInterpolator.arePropsEqual(currentProps, nextProps);\n                return true;\n            }\n        },\n        {\n            key: \"_triggerTransition\",\n            value: function _triggerTransition(startProps, endProps) {\n                var startViewstate = new this.ControllerState(startProps);\n                var endViewStateProps = new this.ControllerState(endProps).shortestPathFrom(startViewstate);\n                var transitionInterpolator = endProps.transitionInterpolator;\n                var duration = transitionInterpolator.getDuration ? transitionInterpolator.getDuration(startProps, endProps) : endProps.transitionDuration;\n                if (duration === 0) return;\n                var initialProps = endProps.transitionInterpolator.initializeProps(startProps, endViewStateProps);\n                this.propsInTransition = {};\n                this.duration = duration;\n                this.transition.start({\n                    duration: duration,\n                    easing: endProps.transitionEasing,\n                    interpolator: endProps.transitionInterpolator,\n                    interruption: endProps.transitionInterruption,\n                    startProps: initialProps.start,\n                    endProps: initialProps.end,\n                    onStart: endProps.onTransitionStart,\n                    onUpdate: this._onTransitionUpdate,\n                    onInterrupt: this._onTransitionEnd(endProps.onTransitionInterrupt),\n                    onEnd: this._onTransitionEnd(endProps.onTransitionEnd)\n                });\n                this.updateTransition();\n            }\n        },\n        {\n            key: \"_onTransitionEnd\",\n            value: function _onTransitionEnd(callback) {\n                var _this = this;\n                return function(transition) {\n                    _this.propsInTransition = null;\n                    callback(transition);\n                };\n            }\n        },\n        {\n            key: \"_onTransitionUpdate\",\n            value: function _onTransitionUpdate(transition) {\n                var time = transition.time, _transition$settings = transition.settings, interpolator = _transition$settings.interpolator, startProps = _transition$settings.startProps, endProps = _transition$settings.endProps, duration = _transition$settings.duration, easing = _transition$settings.easing;\n                var t = easing(time / duration);\n                var viewport = interpolator.interpolateProps(startProps, endProps, t);\n                this.propsInTransition = new this.ControllerState(Object.assign({}, this.props, viewport)).getViewportProps();\n                if (this.onViewStateChange) this.onViewStateChange({\n                    viewState: this.propsInTransition,\n                    interactionState: {\n                        inTransition: true\n                    },\n                    oldViewState: this.props\n                });\n            }\n        }\n    ]);\n    return TransitionManager1;\n}();\nTransitionManager.defaultProps = DEFAULT_PROPS;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../transitions/linear-interpolator\":\"k5Lgz\",\"../transitions/transition\":\"3Fdtq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k5Lgz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LinearInterpolator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _transitionInterpolator = require(\"./transition-interpolator\");\nvar _transitionInterpolatorDefault = parcelHelpers.interopDefault(_transitionInterpolator);\nvar _mathGl = require(\"math.gl\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_PROPS = [\n    \"longitude\",\n    \"latitude\",\n    \"zoom\",\n    \"bearing\",\n    \"pitch\"\n];\nvar DEFAULT_REQUIRED_PROPS = [\n    \"longitude\",\n    \"latitude\",\n    \"zoom\"\n];\nvar LinearInterpolator = function(_TransitionInterpolat) {\n    (0, _inheritsDefault.default)(LinearInterpolator1, _TransitionInterpolat);\n    var _super = _createSuper(LinearInterpolator1);\n    function LinearInterpolator1(transitionProps) {\n        (0, _classCallCheckDefault.default)(this, LinearInterpolator1);\n        return _super.call(this, transitionProps || {\n            compare: DEFAULT_PROPS,\n            extract: DEFAULT_PROPS,\n            required: DEFAULT_REQUIRED_PROPS\n        });\n    }\n    (0, _createClassDefault.default)(LinearInterpolator1, [\n        {\n            key: \"interpolateProps\",\n            value: function interpolateProps(startProps, endProps, t) {\n                var viewport = {};\n                for(var key in endProps)viewport[key] = (0, _mathGl.lerp)(startProps[key] || 0, endProps[key] || 0, t);\n                return viewport;\n            }\n        }\n    ]);\n    return LinearInterpolator1;\n}((0, _transitionInterpolatorDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./transition-interpolator\":\"fvWgT\",\"math.gl\":\"huJnq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fvWgT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TransitionInterpolator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _mathGl = require(\"math.gl\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar TransitionInterpolator = function() {\n    function TransitionInterpolator1() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, TransitionInterpolator1);\n        if (Array.isArray(opts)) opts = {\n            compare: opts,\n            extract: opts,\n            required: opts\n        };\n        var _opts = opts, compare = _opts.compare, extract = _opts.extract, required = _opts.required;\n        this._propsToCompare = compare;\n        this._propsToExtract = extract;\n        this._requiredProps = required;\n    }\n    (0, _createClassDefault.default)(TransitionInterpolator1, [\n        {\n            key: \"arePropsEqual\",\n            value: function arePropsEqual(currentProps, nextProps) {\n                var _iterator = _createForOfIteratorHelper(this._propsToCompare || Object.keys(nextProps)), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var key = _step.value;\n                        if (!(key in currentProps) || !(key in nextProps) || !(0, _mathGl.equals)(currentProps[key], nextProps[key])) return false;\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return true;\n            }\n        },\n        {\n            key: \"initializeProps\",\n            value: function initializeProps(startProps, endProps) {\n                var result;\n                if (this._propsToExtract) {\n                    var startViewStateProps = {};\n                    var endViewStateProps = {};\n                    var _iterator2 = _createForOfIteratorHelper(this._propsToExtract), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var key = _step2.value;\n                            startViewStateProps[key] = startProps[key];\n                            endViewStateProps[key] = endProps[key];\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                    result = {\n                        start: startViewStateProps,\n                        end: endViewStateProps\n                    };\n                } else result = {\n                    start: startProps,\n                    end: endProps\n                };\n                this._checkRequiredProps(result.start);\n                this._checkRequiredProps(result.end);\n                return result;\n            }\n        },\n        {\n            key: \"interpolateProps\",\n            value: function interpolateProps(startProps, endProps, t) {\n                return endProps;\n            }\n        },\n        {\n            key: \"getDuration\",\n            value: function getDuration(startProps, endProps) {\n                return endProps.transitionDuration;\n            }\n        },\n        {\n            key: \"_checkRequiredProps\",\n            value: function _checkRequiredProps(props) {\n                if (!this._requiredProps) return;\n                this._requiredProps.forEach(function(propName) {\n                    var value = props[propName];\n                    (0, _assertDefault.default)(Number.isFinite(value) || Array.isArray(value), \"\".concat(propName, \" is required for transition\"));\n                });\n            }\n        }\n    ]);\n    return TransitionInterpolator1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"math.gl\":\"huJnq\",\"../utils/assert\":\"1unZV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9BTJF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ViewState);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar ViewState = function() {\n    function ViewState1(opts) {\n        (0, _classCallCheckDefault.default)(this, ViewState1);\n        (0, _assertDefault.default)(Number.isFinite(opts.width), \"`width` must be supplied\");\n        (0, _assertDefault.default)(Number.isFinite(opts.height), \"`height` must be supplied\");\n        this._viewportProps = this._applyConstraints(opts);\n    }\n    (0, _createClassDefault.default)(ViewState1, [\n        {\n            key: \"getViewportProps\",\n            value: function getViewportProps() {\n                return this._viewportProps;\n            }\n        },\n        {\n            key: \"shortestPathFrom\",\n            value: function shortestPathFrom(viewState) {\n                return this._viewportProps;\n            }\n        },\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                return props;\n            }\n        }\n    ]);\n    return ViewState1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../utils/assert\":\"1unZV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4SWWi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>EffectManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar _lightingEffect = require(\"../effects/lighting/lighting-effect\");\nvar _lightingEffectDefault = parcelHelpers.interopDefault(_lightingEffect);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar DEFAULT_LIGHTING_EFFECT = new (0, _lightingEffectDefault.default)();\nvar EffectManager = function() {\n    function EffectManager1() {\n        (0, _classCallCheckDefault.default)(this, EffectManager1);\n        this.effects = [];\n        this._internalEffects = [];\n        this._needsRedraw = \"Initial render\";\n        this.setEffects();\n    }\n    (0, _createClassDefault.default)(EffectManager1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"effects\" in props) {\n                    if (props.effects.length !== this.effects.length || !(0, _deepEqual.deepEqual)(props.effects, this.effects)) {\n                        this.setEffects(props.effects);\n                        this._needsRedraw = \"effects changed\";\n                    }\n                }\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                return redraw;\n            }\n        },\n        {\n            key: \"getEffects\",\n            value: function getEffects() {\n                return this._internalEffects;\n            }\n        },\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this.cleanup();\n            }\n        },\n        {\n            key: \"setEffects\",\n            value: function setEffects() {\n                var effects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n                this.cleanup();\n                this.effects = effects;\n                this._createInternalEffects();\n            }\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {\n                var _iterator = _createForOfIteratorHelper(this.effects), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var effect = _step.value;\n                        effect.cleanup();\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                var _iterator2 = _createForOfIteratorHelper(this._internalEffects), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var _effect = _step2.value;\n                        _effect.cleanup();\n                    }\n                } catch (err1) {\n                    _iterator2.e(err1);\n                } finally{\n                    _iterator2.f();\n                }\n                this.effects.length = 0;\n                this._internalEffects.length = 0;\n            }\n        },\n        {\n            key: \"_createInternalEffects\",\n            value: function _createInternalEffects() {\n                this._internalEffects = this.effects.slice();\n                if (!this.effects.some(function(effect) {\n                    return effect instanceof (0, _lightingEffectDefault.default);\n                })) this._internalEffects.push(DEFAULT_LIGHTING_EFFECT);\n            }\n        }\n    ]);\n    return EffectManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../utils/deep-equal\":\"ftdIu\",\"../effects/lighting/lighting-effect\":\"faL8t\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1XD0R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>DeckRenderer);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _debug = require(\"../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _drawLayersPass = require(\"../passes/draw-layers-pass\");\nvar _drawLayersPassDefault = parcelHelpers.interopDefault(_drawLayersPass);\nvar _pickLayersPass = require(\"../passes/pick-layers-pass\");\nvar _pickLayersPassDefault = parcelHelpers.interopDefault(_pickLayersPass);\nvar _core = require(\"@luma.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar TRACE_RENDER_LAYERS = \"deckRenderer.renderLayers\";\nvar DeckRenderer = function() {\n    function DeckRenderer1(gl) {\n        (0, _classCallCheckDefault.default)(this, DeckRenderer1);\n        this.gl = gl;\n        this.layerFilter = null;\n        this.drawPickingColors = false;\n        this.drawLayersPass = new (0, _drawLayersPassDefault.default)(gl);\n        this.pickLayersPass = new (0, _pickLayersPassDefault.default)(gl);\n        this.renderCount = 0;\n        this._needsRedraw = \"Initial render\";\n        this.renderBuffers = [];\n        this.lastPostProcessEffect = null;\n        this._onError = null;\n    }\n    (0, _createClassDefault.default)(DeckRenderer1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"layerFilter\" in props && this.layerFilter !== props.layerFilter) {\n                    this.layerFilter = props.layerFilter;\n                    this._needsRedraw = \"layerFilter changed\";\n                }\n                if (\"drawPickingColors\" in props && this.drawPickingColors !== props.drawPickingColors) {\n                    this.drawPickingColors = props.drawPickingColors;\n                    this._needsRedraw = \"drawPickingColors changed\";\n                }\n                if (\"onError\" in props) this._onError = props.onError;\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers(opts) {\n                var layerPass = this.drawPickingColors ? this.pickLayersPass : this.drawLayersPass;\n                opts.layerFilter = this.layerFilter;\n                opts.onError = this._onError;\n                opts.effects = opts.effects || [];\n                opts.target = opts.target || (0, _core.Framebuffer).getDefaultFramebuffer(this.gl);\n                this._preRender(opts.effects, opts);\n                var outputBuffer = this.lastPostProcessEffect ? this.renderBuffers[0] : opts.target;\n                var renderStats = layerPass.render(_objectSpread(_objectSpread({}, opts), {}, {\n                    target: outputBuffer\n                }));\n                this._postRender(opts.effects, opts);\n                this.renderCount++;\n                (0, _debugDefault.default)(TRACE_RENDER_LAYERS, this, renderStats, opts);\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                return redraw;\n            }\n        },\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                var renderBuffers = this.renderBuffers;\n                var _iterator = _createForOfIteratorHelper(renderBuffers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var buffer = _step.value;\n                        buffer[\"delete\"]();\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                renderBuffers.length = 0;\n            }\n        },\n        {\n            key: \"_preRender\",\n            value: function _preRender(effects, opts) {\n                var lastPostProcessEffect = null;\n                var _iterator2 = _createForOfIteratorHelper(effects), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var effect = _step2.value;\n                        effect.preRender(this.gl, opts);\n                        if (effect.postRender) lastPostProcessEffect = effect;\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n                if (lastPostProcessEffect) this._resizeRenderBuffers();\n                this.lastPostProcessEffect = lastPostProcessEffect;\n            }\n        },\n        {\n            key: \"_resizeRenderBuffers\",\n            value: function _resizeRenderBuffers() {\n                var renderBuffers = this.renderBuffers;\n                if (renderBuffers.length === 0) renderBuffers.push(new (0, _core.Framebuffer)(this.gl), new (0, _core.Framebuffer)(this.gl));\n                var _iterator3 = _createForOfIteratorHelper(renderBuffers), _step3;\n                try {\n                    for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                        var buffer = _step3.value;\n                        buffer.resize();\n                    }\n                } catch (err) {\n                    _iterator3.e(err);\n                } finally{\n                    _iterator3.f();\n                }\n            }\n        },\n        {\n            key: \"_postRender\",\n            value: function _postRender(effects, opts) {\n                var renderBuffers = this.renderBuffers;\n                var params = {\n                    inputBuffer: renderBuffers[0],\n                    swapBuffer: renderBuffers[1],\n                    target: null\n                };\n                var _iterator4 = _createForOfIteratorHelper(effects), _step4;\n                try {\n                    for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n                        var effect = _step4.value;\n                        if (effect.postRender) {\n                            if (effect === this.lastPostProcessEffect) {\n                                params.target = opts.target;\n                                effect.postRender(this.gl, params);\n                                break;\n                            }\n                            var buffer = effect.postRender(this.gl, params);\n                            params.inputBuffer = buffer;\n                            params.swapBuffer = buffer === renderBuffers[0] ? renderBuffers[1] : renderBuffers[0];\n                        }\n                    }\n                } catch (err) {\n                    _iterator4.e(err);\n                } finally{\n                    _iterator4.f();\n                }\n            }\n        }\n    ]);\n    return DeckRenderer1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../debug\":\"hpEQF\",\"../passes/draw-layers-pass\":\"9Pl41\",\"../passes/pick-layers-pass\":\"3GTbn\",\"@luma.gl/core\":\"WBJLR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Pl41\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>DrawLayersPass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _layersPass = require(\"./layers-pass\");\nvar _layersPassDefault = parcelHelpers.interopDefault(_layersPass);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DrawLayersPass = function(_LayersPass) {\n    (0, _inheritsDefault.default)(DrawLayersPass1, _LayersPass);\n    var _super = _createSuper(DrawLayersPass1);\n    function DrawLayersPass1() {\n        (0, _classCallCheckDefault.default)(this, DrawLayersPass1);\n        return _super.apply(this, arguments);\n    }\n    return DrawLayersPass1;\n}((0, _layersPassDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./layers-pass\":\"g95vg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3GTbn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PickLayersPass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _layersPass = require(\"./layers-pass\");\nvar _layersPassDefault = parcelHelpers.interopDefault(_layersPass);\nvar _core = require(\"@luma.gl/core\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar PICKING_PARAMETERS = {\n    blendFunc: [\n        1,\n        0,\n        32771,\n        0\n    ],\n    blendEquation: 32774\n};\nvar PickLayersPass = function(_LayersPass) {\n    (0, _inheritsDefault.default)(PickLayersPass1, _LayersPass);\n    var _super = _createSuper(PickLayersPass1);\n    function PickLayersPass1() {\n        (0, _classCallCheckDefault.default)(this, PickLayersPass1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(PickLayersPass1, [\n        {\n            key: \"render\",\n            value: function render(props) {\n                if (props.pickingFBO) this._drawPickingBuffer(props);\n                else (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PickLayersPass1.prototype), \"render\", this).call(this, props);\n            }\n        },\n        {\n            key: \"_drawPickingBuffer\",\n            value: function _drawPickingBuffer(_ref) {\n                var _this = this;\n                var layers = _ref.layers, layerFilter = _ref.layerFilter, views = _ref.views, viewports = _ref.viewports, onViewportActive = _ref.onViewportActive, pickingFBO = _ref.pickingFBO, _ref$deviceRect = _ref.deviceRect, x = _ref$deviceRect.x, y = _ref$deviceRect.y, width = _ref$deviceRect.width, height = _ref$deviceRect.height, _ref$pass = _ref.pass, pass = _ref$pass === void 0 ? \"picking\" : _ref$pass, redrawReason = _ref.redrawReason, pickZ = _ref.pickZ;\n                var gl = this.gl;\n                this.pickZ = pickZ;\n                return (0, _core.withParameters)(gl, _objectSpread(_objectSpread({\n                    scissorTest: true,\n                    scissor: [\n                        x,\n                        y,\n                        width,\n                        height\n                    ],\n                    clearColor: [\n                        0,\n                        0,\n                        0,\n                        0\n                    ],\n                    depthMask: true,\n                    depthTest: true,\n                    depthRange: [\n                        0,\n                        1\n                    ],\n                    colorMask: [\n                        true,\n                        true,\n                        true,\n                        true\n                    ]\n                }, PICKING_PARAMETERS), {}, {\n                    blend: !pickZ\n                }), function() {\n                    (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PickLayersPass1.prototype), \"render\", _this).call(_this, {\n                        target: pickingFBO,\n                        layers: layers,\n                        layerFilter: layerFilter,\n                        views: views,\n                        viewports: viewports,\n                        onViewportActive: onViewportActive,\n                        pass: pass,\n                        redrawReason: redrawReason\n                    });\n                });\n            }\n        },\n        {\n            key: \"shouldDrawLayer\",\n            value: function shouldDrawLayer(layer) {\n                return layer.props.pickable;\n            }\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters() {\n                return {\n                    pickingActive: 1,\n                    pickingAttribute: this.pickZ,\n                    lightSources: {}\n                };\n            }\n        },\n        {\n            key: \"getLayerParameters\",\n            value: function getLayerParameters(layer, layerIndex) {\n                var pickParameters = this.pickZ ? {\n                    blend: false\n                } : _objectSpread(_objectSpread({}, PICKING_PARAMETERS), {}, {\n                    blend: true,\n                    blendColor: [\n                        0,\n                        0,\n                        0,\n                        (layerIndex + 1) / 255\n                    ]\n                });\n                return Object.assign({}, layer.props.parameters, pickParameters);\n            }\n        }\n    ]);\n    return PickLayersPass1;\n}((0, _layersPassDefault.default));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./layers-pass\":\"g95vg\",\"@luma.gl/core\":\"WBJLR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gyWAw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>DeckPicker);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _pickLayersPass = require(\"../passes/pick-layers-pass\");\nvar _pickLayersPassDefault = parcelHelpers.interopDefault(_pickLayersPass);\nvar _queryObject = require(\"./picking/query-object\");\nvar _pickInfo = require(\"./picking/pick-info\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar DeckPicker = function() {\n    function DeckPicker1(gl) {\n        (0, _classCallCheckDefault.default)(this, DeckPicker1);\n        this.gl = gl;\n        this.pickingFBO = null;\n        this.pickLayersPass = new (0, _pickLayersPassDefault.default)(gl);\n        this.layerFilter = null;\n        this.lastPickedInfo = {\n            index: -1,\n            layerId: null,\n            info: null\n        };\n        this._onError = null;\n    }\n    (0, _createClassDefault.default)(DeckPicker1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"layerFilter\" in props) this.layerFilter = props.layerFilter;\n                if (\"onError\" in props) this._onError = props.onError;\n                if (\"_pickable\" in props) this._pickable = props._pickable;\n            }\n        },\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                if (this.pickingFBO) this.pickingFBO[\"delete\"]();\n                if (this.depthFBO) {\n                    this.depthFBO.color[\"delete\"]();\n                    this.depthFBO[\"delete\"]();\n                }\n            }\n        },\n        {\n            key: \"pickObject\",\n            value: function pickObject(opts) {\n                return this._pickClosestObject(opts);\n            }\n        },\n        {\n            key: \"pickObjects\",\n            value: function pickObjects(opts) {\n                return this._pickVisibleObjects(opts);\n            }\n        },\n        {\n            key: \"getLastPickedObject\",\n            value: function getLastPickedObject(_ref) {\n                var x = _ref.x, y = _ref.y, layers = _ref.layers, viewports = _ref.viewports;\n                var lastPickedInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.lastPickedInfo.info;\n                var lastPickedLayerId = lastPickedInfo && lastPickedInfo.layer && lastPickedInfo.layer.id;\n                var layer = lastPickedLayerId ? layers.find(function(l) {\n                    return l.id === lastPickedLayerId;\n                }) : null;\n                var coordinate = viewports[0] && viewports[0].unproject([\n                    x,\n                    y\n                ]);\n                var info = {\n                    x: x,\n                    y: y,\n                    coordinate: coordinate,\n                    lngLat: coordinate,\n                    layer: layer\n                };\n                if (layer) return Object.assign({}, lastPickedInfo, info);\n                return Object.assign(info, {\n                    color: null,\n                    object: null,\n                    index: -1\n                });\n            }\n        },\n        {\n            key: \"_resizeBuffer\",\n            value: function _resizeBuffer() {\n                var gl = this.gl;\n                if (!this.pickingFBO) {\n                    this.pickingFBO = new (0, _core.Framebuffer)(gl);\n                    if ((0, _core.Framebuffer).isSupported(gl, {\n                        colorBufferFloat: true\n                    })) {\n                        this.depthFBO = new (0, _core.Framebuffer)(gl);\n                        this.depthFBO.attach((0, _definePropertyDefault.default)({}, 36064, new (0, _core.Texture2D)(gl, {\n                            format: (0, _core.isWebGL2)(gl) ? 34836 : 6408,\n                            type: 5126\n                        })));\n                    }\n                }\n                this.pickingFBO.resize({\n                    width: gl.canvas.width,\n                    height: gl.canvas.height\n                });\n                if (this.depthFBO) this.depthFBO.resize({\n                    width: gl.canvas.width,\n                    height: gl.canvas.height\n                });\n                return this.pickingFBO;\n            }\n        },\n        {\n            key: \"_getPickable\",\n            value: function _getPickable(layers) {\n                if (this._pickable === false) return null;\n                var pickableLayers = layers.filter(function(layer) {\n                    return layer.isPickable() && !layer.isComposite;\n                });\n                if (pickableLayers.length > 255) {\n                    (0, _logDefault.default).warn(\"Too many pickable layers, only picking the first 255\")();\n                    return pickableLayers.slice(0, 255);\n                }\n                return pickableLayers.length ? pickableLayers : null;\n            }\n        },\n        {\n            key: \"_pickClosestObject\",\n            value: function _pickClosestObject(_ref2) {\n                var layers = _ref2.layers, views = _ref2.views, viewports = _ref2.viewports, x = _ref2.x, y = _ref2.y, _ref2$radius = _ref2.radius, radius = _ref2$radius === void 0 ? 0 : _ref2$radius, _ref2$depth = _ref2.depth, depth = _ref2$depth === void 0 ? 1 : _ref2$depth, _ref2$mode = _ref2.mode, mode = _ref2$mode === void 0 ? \"query\" : _ref2$mode, unproject3D = _ref2.unproject3D, onViewportActive = _ref2.onViewportActive;\n                layers = this._getPickable(layers);\n                if (!layers) return {\n                    result: [],\n                    emptyInfo: (0, _pickInfo.getEmptyPickingInfo)({\n                        viewports: viewports,\n                        x: x,\n                        y: y\n                    })\n                };\n                this._resizeBuffer();\n                var pixelRatio = (0, _core.cssToDeviceRatio)(this.gl);\n                var devicePixelRange = (0, _core.cssToDevicePixels)(this.gl, [\n                    x,\n                    y\n                ], true);\n                var devicePixel = [\n                    devicePixelRange.x + Math.floor(devicePixelRange.width / 2),\n                    devicePixelRange.y + Math.floor(devicePixelRange.height / 2)\n                ];\n                var deviceRadius = Math.round(radius * pixelRatio);\n                var _this$pickingFBO = this.pickingFBO, width = _this$pickingFBO.width, height = _this$pickingFBO.height;\n                var deviceRect = this._getPickingRect({\n                    deviceX: devicePixel[0],\n                    deviceY: devicePixel[1],\n                    deviceRadius: deviceRadius,\n                    deviceWidth: width,\n                    deviceHeight: height\n                });\n                var infos;\n                var result = [];\n                var affectedLayers = {};\n                for(var i = 0; i < depth; i++){\n                    var pickedColors = deviceRect && this._drawAndSample({\n                        layers: layers,\n                        views: views,\n                        viewports: viewports,\n                        onViewportActive: onViewportActive,\n                        deviceRect: deviceRect,\n                        pass: \"picking:\".concat(mode),\n                        redrawReason: mode\n                    });\n                    var pickInfo = (0, _queryObject.getClosestObject)({\n                        pickedColors: pickedColors,\n                        layers: layers,\n                        deviceX: devicePixel[0],\n                        deviceY: devicePixel[1],\n                        deviceRadius: deviceRadius,\n                        deviceRect: deviceRect\n                    });\n                    var z = void 0;\n                    if (pickInfo.pickedLayer && unproject3D && this.depthFBO) {\n                        var zValues = this._drawAndSample({\n                            layers: [\n                                pickInfo.pickedLayer\n                            ],\n                            views: views,\n                            viewports: viewports,\n                            onViewportActive: onViewportActive,\n                            deviceRect: {\n                                x: pickInfo.pickedX,\n                                y: pickInfo.pickedY,\n                                width: 1,\n                                height: 1\n                            },\n                            pass: \"picking:\".concat(mode),\n                            redrawReason: \"pick-z\",\n                            pickZ: true\n                        });\n                        z = zValues[0] * viewports[0].distanceScales.metersPerUnit[2] + viewports[0].position[2];\n                    }\n                    if (pickInfo.pickedColor && i + 1 < depth) {\n                        var layerId = pickInfo.pickedColor[3] - 1;\n                        affectedLayers[layerId] = true;\n                        layers[layerId].clearPickingColor(pickInfo.pickedColor);\n                    }\n                    infos = (0, _pickInfo.processPickInfo)({\n                        pickInfo: pickInfo,\n                        lastPickedInfo: this.lastPickedInfo,\n                        mode: mode,\n                        layers: layers,\n                        viewports: viewports,\n                        x: x,\n                        y: y,\n                        z: z,\n                        pixelRatio: pixelRatio\n                    });\n                    var _iterator = _createForOfIteratorHelper(infos.values()), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var info = _step.value;\n                            if (info.layer) result.push(info);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    if (!pickInfo.pickedColor) break;\n                }\n                for(var _layerId in affectedLayers)layers[_layerId].restorePickingColors();\n                return {\n                    result: result,\n                    emptyInfo: infos && infos.get(null)\n                };\n            }\n        },\n        {\n            key: \"_pickVisibleObjects\",\n            value: function _pickVisibleObjects(_ref3) {\n                var layers = _ref3.layers, views = _ref3.views, viewports = _ref3.viewports, x = _ref3.x, y = _ref3.y, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? 1 : _ref3$width, _ref3$height = _ref3.height, height = _ref3$height === void 0 ? 1 : _ref3$height, _ref3$mode = _ref3.mode, mode = _ref3$mode === void 0 ? \"query\" : _ref3$mode, onViewportActive = _ref3.onViewportActive;\n                layers = this._getPickable(layers);\n                if (!layers) return [];\n                this._resizeBuffer();\n                var pixelRatio = (0, _core.cssToDeviceRatio)(this.gl);\n                var leftTop = (0, _core.cssToDevicePixels)(this.gl, [\n                    x,\n                    y\n                ], true);\n                var deviceLeft = leftTop.x;\n                var deviceTop = leftTop.y + leftTop.height;\n                var rightBottom = (0, _core.cssToDevicePixels)(this.gl, [\n                    x + width,\n                    y + height\n                ], true);\n                var deviceRight = rightBottom.x + rightBottom.width;\n                var deviceBottom = rightBottom.y;\n                var deviceRect = {\n                    x: deviceLeft,\n                    y: deviceBottom,\n                    width: deviceRight - deviceLeft,\n                    height: deviceTop - deviceBottom\n                };\n                var pickedColors = this._drawAndSample({\n                    layers: layers,\n                    views: views,\n                    viewports: viewports,\n                    onViewportActive: onViewportActive,\n                    deviceRect: deviceRect,\n                    pass: \"picking:\".concat(mode),\n                    redrawReason: mode\n                });\n                var pickInfos = (0, _queryObject.getUniqueObjects)({\n                    pickedColors: pickedColors,\n                    layers: layers\n                });\n                var uniqueInfos = new Map();\n                pickInfos.forEach(function(pickInfo) {\n                    var info = {\n                        color: pickInfo.pickedColor,\n                        layer: null,\n                        index: pickInfo.pickedObjectIndex,\n                        picked: true,\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height,\n                        pixelRatio: pixelRatio\n                    };\n                    info = (0, _pickInfo.getLayerPickingInfo)({\n                        layer: pickInfo.pickedLayer,\n                        info: info,\n                        mode: mode\n                    });\n                    if (!uniqueInfos.has(info.object)) uniqueInfos.set(info.object, info);\n                });\n                return Array.from(uniqueInfos.values());\n            }\n        },\n        {\n            key: \"_drawAndSample\",\n            value: function _drawAndSample(_ref4) {\n                var layers = _ref4.layers, views = _ref4.views, viewports = _ref4.viewports, onViewportActive = _ref4.onViewportActive, deviceRect = _ref4.deviceRect, pass = _ref4.pass, redrawReason = _ref4.redrawReason, pickZ = _ref4.pickZ;\n                (0, _assertDefault.default)(deviceRect.width > 0 && deviceRect.height > 0);\n                if (layers.length < 1) return null;\n                var pickingFBO = pickZ ? this.depthFBO : this.pickingFBO;\n                this.pickLayersPass.render({\n                    layers: layers,\n                    layerFilter: this.layerFilter,\n                    onError: this._onError,\n                    views: views,\n                    viewports: viewports,\n                    onViewportActive: onViewportActive,\n                    pickingFBO: pickingFBO,\n                    deviceRect: deviceRect,\n                    pass: pass,\n                    redrawReason: redrawReason,\n                    pickZ: pickZ\n                });\n                var x = deviceRect.x, y = deviceRect.y, width = deviceRect.width, height = deviceRect.height;\n                var pickedColors = new (pickZ ? Float32Array : Uint8Array)(width * height * 4);\n                (0, _core.readPixelsToArray)(pickingFBO, {\n                    sourceX: x,\n                    sourceY: y,\n                    sourceWidth: width,\n                    sourceHeight: height,\n                    target: pickedColors\n                });\n                return pickedColors;\n            }\n        },\n        {\n            key: \"_getPickingRect\",\n            value: function _getPickingRect(_ref5) {\n                var deviceX = _ref5.deviceX, deviceY = _ref5.deviceY, deviceRadius = _ref5.deviceRadius, deviceWidth = _ref5.deviceWidth, deviceHeight = _ref5.deviceHeight;\n                var x = Math.max(0, deviceX - deviceRadius);\n                var y = Math.max(0, deviceY - deviceRadius);\n                var width = Math.min(deviceWidth, deviceX + deviceRadius + 1) - x;\n                var height = Math.min(deviceHeight, deviceY + deviceRadius + 1) - y;\n                if (width <= 0 || height <= 0) return null;\n                return {\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height\n                };\n            }\n        }\n    ]);\n    return DeckPicker1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/core\":\"WBJLR\",\"../utils/assert\":\"1unZV\",\"../utils/log\":\"1biSe\",\"../passes/pick-layers-pass\":\"3GTbn\",\"./picking/query-object\":\"eOt6T\",\"./picking/pick-info\":\"lUcJO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eOt6T\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getClosestObject\", ()=>getClosestObject);\nparcelHelpers.export(exports, \"getUniqueObjects\", ()=>getUniqueObjects);\nvar _log = require(\"../../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar NO_PICKED_OBJECT = {\n    pickedColor: null,\n    pickedLayer: null,\n    pickedObjectIndex: -1\n};\nfunction getClosestObject(_ref) {\n    var pickedColors = _ref.pickedColors, layers = _ref.layers, deviceX = _ref.deviceX, deviceY = _ref.deviceY, deviceRadius = _ref.deviceRadius, deviceRect = _ref.deviceRect;\n    if (pickedColors) {\n        var x = deviceRect.x, y = deviceRect.y, width = deviceRect.width, height = deviceRect.height;\n        var minSquareDistanceToCenter = deviceRadius * deviceRadius;\n        var closestPixelIndex = -1;\n        var i = 0;\n        for(var row = 0; row < height; row++){\n            var dy = row + y - deviceY;\n            var dy2 = dy * dy;\n            if (dy2 > minSquareDistanceToCenter) i += 4 * width;\n            else for(var col = 0; col < width; col++){\n                var pickedLayerIndex = pickedColors[i + 3] - 1;\n                if (pickedLayerIndex >= 0) {\n                    var dx = col + x - deviceX;\n                    var d2 = dx * dx + dy2;\n                    if (d2 <= minSquareDistanceToCenter) {\n                        minSquareDistanceToCenter = d2;\n                        closestPixelIndex = i;\n                    }\n                }\n                i += 4;\n            }\n        }\n        if (closestPixelIndex >= 0) {\n            var _pickedLayerIndex = pickedColors[closestPixelIndex + 3] - 1;\n            var pickedColor = pickedColors.slice(closestPixelIndex, closestPixelIndex + 4);\n            var pickedLayer = layers[_pickedLayerIndex];\n            if (pickedLayer) {\n                var pickedObjectIndex = pickedLayer.decodePickingColor(pickedColor);\n                var _dy = Math.floor(closestPixelIndex / 4 / width);\n                var _dx = closestPixelIndex / 4 - _dy * width;\n                return {\n                    pickedColor: pickedColor,\n                    pickedLayer: pickedLayer,\n                    pickedObjectIndex: pickedObjectIndex,\n                    pickedX: x + _dx,\n                    pickedY: y + _dy\n                };\n            }\n            (0, _logDefault.default).error(\"Picked non-existent layer. Is picking buffer corrupt?\")();\n        }\n    }\n    return NO_PICKED_OBJECT;\n}\nfunction getUniqueObjects(_ref2) {\n    var pickedColors = _ref2.pickedColors, layers = _ref2.layers;\n    var uniqueColors = new Map();\n    if (pickedColors) for(var i = 0; i < pickedColors.length; i += 4){\n        var pickedLayerIndex = pickedColors[i + 3] - 1;\n        if (pickedLayerIndex >= 0) {\n            var pickedColor = pickedColors.slice(i, i + 4);\n            var colorKey = pickedColor.join(\",\");\n            if (!uniqueColors.has(colorKey)) {\n                var pickedLayer = layers[pickedLayerIndex];\n                if (pickedLayer) uniqueColors.set(colorKey, {\n                    pickedColor: pickedColor,\n                    pickedLayer: pickedLayer,\n                    pickedObjectIndex: pickedLayer.decodePickingColor(pickedColor)\n                });\n                else (0, _logDefault.default).error(\"Picked non-existent layer. Is picking buffer corrupt?\")();\n            }\n        }\n    }\n    return Array.from(uniqueColors.values());\n}\n\n},{\"../../utils/log\":\"1biSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lUcJO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getEmptyPickingInfo\", ()=>getEmptyPickingInfo);\nparcelHelpers.export(exports, \"processPickInfo\", ()=>processPickInfo);\nparcelHelpers.export(exports, \"getLayerPickingInfo\", ()=>getLayerPickingInfo);\nfunction getEmptyPickingInfo(_ref) {\n    var pickInfo = _ref.pickInfo, viewports = _ref.viewports, pixelRatio = _ref.pixelRatio, x = _ref.x, y = _ref.y, z = _ref.z;\n    var viewport = getViewportFromCoordinates({\n        viewports: viewports\n    });\n    var coordinate = viewport && viewport.unproject([\n        x - viewport.x,\n        y - viewport.y\n    ], {\n        targetZ: z\n    });\n    return {\n        color: null,\n        layer: null,\n        index: -1,\n        picked: false,\n        x: x,\n        y: y,\n        pixel: [\n            x,\n            y\n        ],\n        coordinate: coordinate,\n        lngLat: coordinate,\n        devicePixel: pickInfo && [\n            pickInfo.pickedX,\n            pickInfo.pickedY\n        ],\n        pixelRatio: pixelRatio\n    };\n}\nfunction processPickInfo(opts) {\n    var pickInfo = opts.pickInfo, lastPickedInfo = opts.lastPickedInfo, mode = opts.mode, layers = opts.layers;\n    var pickedColor = pickInfo.pickedColor, pickedLayer = pickInfo.pickedLayer, pickedObjectIndex = pickInfo.pickedObjectIndex;\n    var affectedLayers = pickedLayer ? [\n        pickedLayer\n    ] : [];\n    if (mode === \"hover\") {\n        var lastPickedObjectIndex = lastPickedInfo.index;\n        var lastPickedLayerId = lastPickedInfo.layerId;\n        var pickedLayerId = pickedLayer && pickedLayer.props.id;\n        if (pickedLayerId !== lastPickedLayerId || pickedObjectIndex !== lastPickedObjectIndex) {\n            if (pickedLayerId !== lastPickedLayerId) {\n                var lastPickedLayer = layers.find(function(layer) {\n                    return layer.props.id === lastPickedLayerId;\n                });\n                if (lastPickedLayer) affectedLayers.unshift(lastPickedLayer);\n            }\n            lastPickedInfo.layerId = pickedLayerId;\n            lastPickedInfo.index = pickedObjectIndex;\n            lastPickedInfo.info = null;\n        }\n    }\n    var baseInfo = getEmptyPickingInfo(opts);\n    var infos = new Map();\n    infos.set(null, baseInfo);\n    affectedLayers.forEach(function(layer) {\n        var info = Object.assign({}, baseInfo);\n        if (layer === pickedLayer) {\n            info.color = pickedColor;\n            info.index = pickedObjectIndex;\n            info.picked = true;\n        }\n        info = getLayerPickingInfo({\n            layer: layer,\n            info: info,\n            mode: mode\n        });\n        if (layer === pickedLayer && mode === \"hover\") lastPickedInfo.info = info;\n        if (info) infos.set(info.layer.id, info);\n        if (mode === \"hover\" && layer.props.autoHighlight) {\n            var pickingModuleParameters = {\n                pickingSelectedColor: pickedLayer === layer ? pickedColor : null\n            };\n            var highlightColor = layer.props.highlightColor;\n            if (pickedLayer === layer && typeof highlightColor === \"function\") pickingModuleParameters.pickingHighlightColor = highlightColor(info);\n            layer.setModuleParameters(pickingModuleParameters);\n            layer.setNeedsRedraw();\n        }\n    });\n    return infos;\n}\nfunction getLayerPickingInfo(_ref2) {\n    var layer = _ref2.layer, info = _ref2.info, mode = _ref2.mode;\n    while(layer && info){\n        var sourceLayer = info.layer || layer;\n        info.layer = layer;\n        info = layer.getPickingInfo({\n            info: info,\n            mode: mode,\n            sourceLayer: sourceLayer\n        });\n        layer = layer.parent;\n    }\n    return info;\n}\nfunction getViewportFromCoordinates(_ref3) {\n    var viewports = _ref3.viewports;\n    var viewport = viewports[0];\n    return viewport;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aqeby\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Tooltip);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar defaultStyle = {\n    zIndex: 1,\n    position: \"absolute\",\n    pointerEvents: \"none\",\n    color: \"#a0a7b4\",\n    backgroundColor: \"#29323c\",\n    padding: \"10px\",\n    top: 0,\n    left: 0,\n    display: \"none\"\n};\nvar Tooltip = function() {\n    function Tooltip1(canvas) {\n        (0, _classCallCheckDefault.default)(this, Tooltip1);\n        var canvasParent = canvas.parentElement;\n        if (canvasParent) {\n            this.el = document.createElement(\"div\");\n            this.el.className = \"deck-tooltip\";\n            Object.assign(this.el.style, defaultStyle);\n            canvasParent.appendChild(this.el);\n        }\n    }\n    (0, _createClassDefault.default)(Tooltip1, [\n        {\n            key: \"setTooltip\",\n            value: function setTooltip(displayInfo, x, y) {\n                var el = this.el;\n                if (typeof displayInfo === \"string\") el.innerText = displayInfo;\n                else if (!displayInfo) {\n                    el.style.display = \"none\";\n                    return;\n                } else {\n                    if (\"text\" in displayInfo) el.innerText = displayInfo.text;\n                    if (\"html\" in displayInfo) el.innerHTML = displayInfo.html;\n                    if (\"className\" in displayInfo) el.className = displayInfo.className;\n                    Object.assign(el.style, displayInfo.style);\n                }\n                el.style.display = \"block\";\n                el.style.transform = \"translate(\".concat(x, \"px, \").concat(y, \"px)\");\n            }\n        },\n        {\n            key: \"remove\",\n            value: function remove() {\n                if (this.el) this.el.remove();\n            }\n        }\n    ]);\n    return Tooltip1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eKT6m\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"EventManager\", ()=>(0, _eventManagerDefault.default));\nvar _eventManager = require(\"./event-manager\");\nvar _eventManagerDefault = parcelHelpers.interopDefault(_eventManager);\n\n},{\"./event-manager\":\"bRib3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bRib3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _hammer = require(\"./utils/hammer\");\nvar _wheelInput = require(\"./inputs/wheel-input\");\nvar _wheelInputDefault = parcelHelpers.interopDefault(_wheelInput);\nvar _moveInput = require(\"./inputs/move-input\");\nvar _moveInputDefault = parcelHelpers.interopDefault(_moveInput);\nvar _keyInput = require(\"./inputs/key-input\");\nvar _keyInputDefault = parcelHelpers.interopDefault(_keyInput);\nvar _contextmenuInput = require(\"./inputs/contextmenu-input\");\nvar _contextmenuInputDefault = parcelHelpers.interopDefault(_contextmenuInput);\nvar _eventRegistrar = require(\"./utils/event-registrar\");\nvar _eventRegistrarDefault = parcelHelpers.interopDefault(_eventRegistrar);\nvar _constants = require(\"./constants\");\nconst DEFAULT_OPTIONS = {\n    // event handlers\n    events: null,\n    // custom recognizers\n    recognizers: null,\n    recognizerOptions: {},\n    Manager: // Manager class\n    (0, _hammer.Manager),\n    // allow browser default touch action\n    // https://github.com/uber/react-map-gl/issues/506\n    touchAction: \"none\",\n    tabIndex: 0\n};\nclass EventManager {\n    constructor(element = null, options){\n        /**\n         * Handle basic events using the 'hammer.input' Hammer.js API:\n         * Before running Recognizers, Hammer emits a 'hammer.input' event\n         * with the basic event info. This function emits all basic events\n         * aliased to the \"class\" of event received.\n         * See constants.BASIC_EVENT_CLASSES basic event class definitions.\n         */ this._onBasicInput = (event)=>{\n            const { srcEvent  } = event;\n            const alias = (0, _constants.BASIC_EVENT_ALIASES)[srcEvent.type];\n            if (alias) // fire all events aliased to srcEvent.type\n            this.manager.emit(alias, event);\n        };\n        /**\n         * Handle events not supported by Hammer.js,\n         * and pipe back out through same (Hammer) channel used by other events.\n         */ this._onOtherEvent = (event)=>{\n            // console.log('onotherevent', event.type, event)\n            this.manager.emit(event.type, event);\n        };\n        this.options = {\n            ...DEFAULT_OPTIONS,\n            ...options\n        };\n        this.events = new Map();\n        this.setElement(element);\n        // Register all passed events.\n        const { events  } = this.options;\n        if (events) this.on(events);\n    }\n    getElement() {\n        return this.element;\n    }\n    setElement(element) {\n        if (this.element) // unregister all events\n        this.destroy();\n        this.element = element;\n        if (!element) return;\n        const { options  } = this;\n        const ManagerClass = options.Manager;\n        this.manager = new ManagerClass(element, {\n            touchAction: options.touchAction,\n            recognizers: options.recognizers || (0, _constants.RECOGNIZERS)\n        }).on(\"hammer.input\", this._onBasicInput);\n        if (!options.recognizers) // Set default recognize withs\n        // http://hammerjs.github.io/recognize-with/\n        Object.keys((0, _constants.RECOGNIZER_COMPATIBLE_MAP)).forEach((name)=>{\n            const recognizer = this.manager.get(name);\n            if (recognizer) (0, _constants.RECOGNIZER_COMPATIBLE_MAP)[name].forEach((otherName)=>{\n                recognizer.recognizeWith(otherName);\n            });\n        });\n        // Set recognizer options\n        for(const recognizerName in options.recognizerOptions){\n            const recognizer = this.manager.get(recognizerName);\n            if (recognizer) {\n                const recognizerOption = options.recognizerOptions[recognizerName];\n                // `enable` is managed by the event registrations\n                delete recognizerOption.enable;\n                recognizer.set(recognizerOption);\n            }\n        }\n        // Handle events not handled by Hammer.js:\n        // - mouse wheel\n        // - pointer/touch/mouse move\n        this.wheelInput = new (0, _wheelInputDefault.default)(element, this._onOtherEvent, {\n            enable: false\n        });\n        this.moveInput = new (0, _moveInputDefault.default)(element, this._onOtherEvent, {\n            enable: false\n        });\n        this.keyInput = new (0, _keyInputDefault.default)(element, this._onOtherEvent, {\n            enable: false,\n            tabIndex: options.tabIndex\n        });\n        this.contextmenuInput = new (0, _contextmenuInputDefault.default)(element, this._onOtherEvent, {\n            enable: false\n        });\n        // Register all existing events\n        for (const [eventAlias, eventRegistrar] of this.events)if (!eventRegistrar.isEmpty()) {\n            // Enable recognizer for this event.\n            this._toggleRecognizer(eventRegistrar.recognizerName, true);\n            this.manager.on(eventAlias, eventRegistrar.handleEvent);\n        }\n    }\n    // Tear down internal event management implementations.\n    destroy() {\n        if (this.element) {\n            // wheelInput etc. are created in setElement() and therefore\n            // cannot exist if there is no element\n            this.wheelInput.destroy();\n            this.moveInput.destroy();\n            this.keyInput.destroy();\n            this.contextmenuInput.destroy();\n            this.manager.destroy();\n            this.wheelInput = null;\n            this.moveInput = null;\n            this.keyInput = null;\n            this.contextmenuInput = null;\n            this.manager = null;\n            this.element = null;\n        }\n    }\n    /** Register an event handler function to be called on `event` */ on(event, handler, opts) {\n        this._addEventHandler(event, handler, opts, false);\n    }\n    once(event, handler, opts) {\n        this._addEventHandler(event, handler, opts, true);\n    }\n    watch(event, handler, opts) {\n        this._addEventHandler(event, handler, opts, false, true);\n    }\n    off(event, handler) {\n        this._removeEventHandler(event, handler);\n    }\n    /*\n     * Enable/disable recognizer for the given event\n     */ _toggleRecognizer(name, enabled) {\n        const { manager  } = this;\n        if (!manager) return;\n        const recognizer = manager.get(name);\n        // @ts-ignore\n        if (recognizer && recognizer.options.enable !== enabled) {\n            recognizer.set({\n                enable: enabled\n            });\n            const fallbackRecognizers = (0, _constants.RECOGNIZER_FALLBACK_MAP)[name];\n            if (fallbackRecognizers && !this.options.recognizers) // Set default require failures\n            // http://hammerjs.github.io/require-failure/\n            fallbackRecognizers.forEach((otherName)=>{\n                const otherRecognizer = manager.get(otherName);\n                if (enabled) {\n                    // Wait for this recognizer to fail\n                    otherRecognizer.requireFailure(name);\n                    /**\n                         * This seems to be a bug in hammerjs:\n                         * requireFailure() adds both ways\n                         * dropRequireFailure() only drops one way\n                         * https://github.com/hammerjs/hammer.js/blob/master/src/recognizerjs/\n                           recognizer-constructor.js#L136\n                         */ recognizer.dropRequireFailure(otherName);\n                } else // Do not wait for this recognizer to fail\n                otherRecognizer.dropRequireFailure(name);\n            });\n        }\n        this.wheelInput.enableEventType(name, enabled);\n        this.moveInput.enableEventType(name, enabled);\n        this.keyInput.enableEventType(name, enabled);\n        this.contextmenuInput.enableEventType(name, enabled);\n    }\n    /**\n     * Process the event registration for a single event + handler.\n     */ _addEventHandler(event, handler, opts, once, passive) {\n        if (typeof event !== \"string\") {\n            // @ts-ignore\n            opts = handler;\n            // If `event` is a map, call `on()` for each entry.\n            for(const eventName in event)this._addEventHandler(eventName, event[eventName], opts, once, passive);\n            return;\n        }\n        const { manager , events  } = this;\n        // Alias to a recognized gesture as necessary.\n        const eventAlias = (0, _constants.GESTURE_EVENT_ALIASES)[event] || event;\n        let eventRegistrar = events.get(eventAlias);\n        if (!eventRegistrar) {\n            eventRegistrar = new (0, _eventRegistrarDefault.default)(this);\n            events.set(eventAlias, eventRegistrar);\n            // Enable recognizer for this event.\n            eventRegistrar.recognizerName = (0, _constants.EVENT_RECOGNIZER_MAP)[eventAlias] || eventAlias;\n            // Listen to the event\n            if (manager) manager.on(eventAlias, eventRegistrar.handleEvent);\n        }\n        eventRegistrar.add(event, handler, opts, once, passive);\n        if (!eventRegistrar.isEmpty()) this._toggleRecognizer(eventRegistrar.recognizerName, true);\n    }\n    /**\n     * Process the event deregistration for a single event + handler.\n     */ _removeEventHandler(event, handler) {\n        if (typeof event !== \"string\") {\n            // If `event` is a map, call `off()` for each entry.\n            for(const eventName in event)this._removeEventHandler(eventName, event[eventName]);\n            return;\n        }\n        const { events  } = this;\n        // Alias to a recognized gesture as necessary.\n        const eventAlias = (0, _constants.GESTURE_EVENT_ALIASES)[event] || event;\n        const eventRegistrar = events.get(eventAlias);\n        if (!eventRegistrar) return;\n        eventRegistrar.remove(event, handler);\n        if (eventRegistrar.isEmpty()) {\n            const { recognizerName  } = eventRegistrar;\n            // Disable recognizer if no more handlers are attached to its events\n            let isRecognizerUsed = false;\n            for (const eh of events.values())if (eh.recognizerName === recognizerName && !eh.isEmpty()) {\n                isRecognizerUsed = true;\n                break;\n            }\n            if (!isRecognizerUsed) this._toggleRecognizer(recognizerName, false);\n        }\n    }\n}\nexports.default = EventManager;\n\n},{\"./utils/hammer\":\"ehFxm\",\"./inputs/wheel-input\":\"5CpSK\",\"./inputs/move-input\":\"kMux8\",\"./inputs/key-input\":\"l9uTF\",\"./inputs/contextmenu-input\":\"fha15\",\"./utils/event-registrar\":\"gzQTI\",\"./constants\":\"8DNcD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ehFxm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Manager\", ()=>Manager);\nvar _hammerjs = require(\"hammerjs\");\nvar _hammerjsDefault = parcelHelpers.interopDefault(_hammerjs);\nvar _hammerOverrides = require(\"./hammer-overrides\");\n(0, _hammerOverrides.enhancePointerEventInput)((0, _hammerjsDefault.default).PointerEventInput);\n(0, _hammerOverrides.enhanceMouseInput)((0, _hammerjsDefault.default).MouseInput);\nconst Manager = (0, _hammerjsDefault.default).Manager;\nexports.default = (0, _hammerjsDefault.default);\n\n},{\"hammerjs\":\"6QCah\",\"./hammer-overrides\":\"cbPq1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6QCah\":[function(require,module,exports) {\n/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */ (function(window, document, exportName, undefined) {\n    \"use strict\";\n    var VENDOR_PREFIXES = [\n        \"\",\n        \"webkit\",\n        \"Moz\",\n        \"MS\",\n        \"ms\",\n        \"o\"\n    ];\n    var TEST_ELEMENT = document.createElement(\"div\");\n    var TYPE_FUNCTION = \"function\";\n    var round = Math.round;\n    var abs = Math.abs;\n    var now = Date.now;\n    /**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */ function setTimeoutContext(fn, timeout, context) {\n        return setTimeout(bindFn(fn, context), timeout);\n    }\n    /**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */ function invokeArrayArg(arg, fn, context) {\n        if (Array.isArray(arg)) {\n            each(arg, context[fn], context);\n            return true;\n        }\n        return false;\n    }\n    /**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */ function each(obj, iterator, context) {\n        var i;\n        if (!obj) return;\n        if (obj.forEach) obj.forEach(iterator, context);\n        else if (obj.length !== undefined) {\n            i = 0;\n            while(i < obj.length){\n                iterator.call(context, obj[i], i, obj);\n                i++;\n            }\n        } else for(i in obj)obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n    }\n    /**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */ function deprecate(method, name, message) {\n        var deprecationMessage = \"DEPRECATED METHOD: \" + name + \"\\n\" + message + \" AT \\n\";\n        return function() {\n            var e = new Error(\"get-stack-trace\");\n            var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, \"\").replace(/^\\s+at\\s+/gm, \"\").replace(/^Object.<anonymous>\\s*\\(/gm, \"{anonymous}()@\") : \"Unknown Stack Trace\";\n            var log = window.console && (window.console.warn || window.console.log);\n            if (log) log.call(window.console, deprecationMessage, stack);\n            return method.apply(this, arguments);\n        };\n    }\n    /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */ var assign;\n    if (typeof Object.assign !== \"function\") assign = function assign(target) {\n        if (target === undefined || target === null) throw new TypeError(\"Cannot convert undefined or null to object\");\n        var output = Object(target);\n        for(var index = 1; index < arguments.length; index++){\n            var source = arguments[index];\n            if (source !== undefined && source !== null) {\n                for(var nextKey in source)if (source.hasOwnProperty(nextKey)) output[nextKey] = source[nextKey];\n            }\n        }\n        return output;\n    };\n    else assign = Object.assign;\n    /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */ var extend = deprecate(function extend(dest, src, merge) {\n        var keys = Object.keys(src);\n        var i = 0;\n        while(i < keys.length){\n            if (!merge || merge && dest[keys[i]] === undefined) dest[keys[i]] = src[keys[i]];\n            i++;\n        }\n        return dest;\n    }, \"extend\", \"Use `assign`.\");\n    /**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */ var merge1 = deprecate(function merge(dest, src) {\n        return extend(dest, src, true);\n    }, \"merge\", \"Use `assign`.\");\n    /**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */ function inherit(child, base, properties) {\n        var baseP = base.prototype, childP;\n        childP = child.prototype = Object.create(baseP);\n        childP.constructor = child;\n        childP._super = baseP;\n        if (properties) assign(childP, properties);\n    }\n    /**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */ function bindFn(fn, context) {\n        return function boundFn() {\n            return fn.apply(context, arguments);\n        };\n    }\n    /**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */ function boolOrFn(val, args) {\n        if (typeof val == TYPE_FUNCTION) return val.apply(args ? args[0] || undefined : undefined, args);\n        return val;\n    }\n    /**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */ function ifUndefined(val1, val2) {\n        return val1 === undefined ? val2 : val1;\n    }\n    /**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */ function addEventListeners(target, types, handler) {\n        each(splitStr(types), function(type) {\n            target.addEventListener(type, handler, false);\n        });\n    }\n    /**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */ function removeEventListeners(target, types, handler) {\n        each(splitStr(types), function(type) {\n            target.removeEventListener(type, handler, false);\n        });\n    }\n    /**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */ function hasParent(node, parent) {\n        while(node){\n            if (node == parent) return true;\n            node = node.parentNode;\n        }\n        return false;\n    }\n    /**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */ function inStr(str, find) {\n        return str.indexOf(find) > -1;\n    }\n    /**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */ function splitStr(str) {\n        return str.trim().split(/\\s+/g);\n    }\n    /**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */ function inArray(src, find, findByKey) {\n        if (src.indexOf && !findByKey) return src.indexOf(find);\n        else {\n            var i = 0;\n            while(i < src.length){\n                if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) return i;\n                i++;\n            }\n            return -1;\n        }\n    }\n    /**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */ function toArray(obj) {\n        return Array.prototype.slice.call(obj, 0);\n    }\n    /**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */ function uniqueArray(src, key, sort) {\n        var results = [];\n        var values = [];\n        var i = 0;\n        while(i < src.length){\n            var val = key ? src[i][key] : src[i];\n            if (inArray(values, val) < 0) results.push(src[i]);\n            values[i] = val;\n            i++;\n        }\n        if (sort) {\n            if (!key) results = results.sort();\n            else results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n        return results;\n    }\n    /**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */ function prefixed(obj, property) {\n        var prefix, prop;\n        var camelProp = property[0].toUpperCase() + property.slice(1);\n        var i = 0;\n        while(i < VENDOR_PREFIXES.length){\n            prefix = VENDOR_PREFIXES[i];\n            prop = prefix ? prefix + camelProp : property;\n            if (prop in obj) return prop;\n            i++;\n        }\n        return undefined;\n    }\n    /**\n * get a unique id\n * @returns {number} uniqueId\n */ var _uniqueId = 1;\n    function uniqueId() {\n        return _uniqueId++;\n    }\n    /**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */ function getWindowForElement(element) {\n        var doc = element.ownerDocument || element;\n        return doc.defaultView || doc.parentWindow || window;\n    }\n    var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n    var SUPPORT_TOUCH = \"ontouchstart\" in window;\n    var SUPPORT_POINTER_EVENTS = prefixed(window, \"PointerEvent\") !== undefined;\n    var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n    var INPUT_TYPE_TOUCH = \"touch\";\n    var INPUT_TYPE_PEN = \"pen\";\n    var INPUT_TYPE_MOUSE = \"mouse\";\n    var INPUT_TYPE_KINECT = \"kinect\";\n    var COMPUTE_INTERVAL = 25;\n    var INPUT_START = 1;\n    var INPUT_MOVE = 2;\n    var INPUT_END = 4;\n    var INPUT_CANCEL = 8;\n    var DIRECTION_NONE = 1;\n    var DIRECTION_LEFT = 2;\n    var DIRECTION_RIGHT = 4;\n    var DIRECTION_UP = 8;\n    var DIRECTION_DOWN = 16;\n    var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n    var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n    var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n    var PROPS_XY = [\n        \"x\",\n        \"y\"\n    ];\n    var PROPS_CLIENT_XY = [\n        \"clientX\",\n        \"clientY\"\n    ];\n    /**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */ function Input(manager, callback) {\n        var self = this;\n        this.manager = manager;\n        this.callback = callback;\n        this.element = manager.element;\n        this.target = manager.options.inputTarget;\n        // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n        // so when disabled the input events are completely bypassed.\n        this.domHandler = function(ev) {\n            if (boolOrFn(manager.options.enable, [\n                manager\n            ])) self.handler(ev);\n        };\n        this.init();\n    }\n    Input.prototype = {\n        /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */ handler: function() {},\n        /**\n     * bind the events\n     */ init: function() {\n            this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n            this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n            this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n        },\n        /**\n     * unbind the events\n     */ destroy: function() {\n            this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n            this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n            this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n        }\n    };\n    /**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */ function createInputInstance(manager) {\n        var Type;\n        var inputClass = manager.options.inputClass;\n        if (inputClass) Type = inputClass;\n        else if (SUPPORT_POINTER_EVENTS) Type = PointerEventInput;\n        else if (SUPPORT_ONLY_TOUCH) Type = TouchInput;\n        else if (!SUPPORT_TOUCH) Type = MouseInput;\n        else Type = TouchMouseInput;\n        return new Type(manager, inputHandler);\n    }\n    /**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */ function inputHandler(manager, eventType, input) {\n        var pointersLen = input.pointers.length;\n        var changedPointersLen = input.changedPointers.length;\n        var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;\n        var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;\n        input.isFirst = !!isFirst;\n        input.isFinal = !!isFinal;\n        if (isFirst) manager.session = {};\n        // source event is the normalized value of the domEvents\n        // like 'touchstart, mouseup, pointerdown'\n        input.eventType = eventType;\n        // compute scale, rotation etc\n        computeInputData(manager, input);\n        // emit secret event\n        manager.emit(\"hammer.input\", input);\n        manager.recognize(input);\n        manager.session.prevInput = input;\n    }\n    /**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */ function computeInputData(manager, input) {\n        var session = manager.session;\n        var pointers = input.pointers;\n        var pointersLength = pointers.length;\n        // store the first input to calculate the distance and direction\n        if (!session.firstInput) session.firstInput = simpleCloneInputData(input);\n        // to compute scale and rotation we need to store the multiple touches\n        if (pointersLength > 1 && !session.firstMultiple) session.firstMultiple = simpleCloneInputData(input);\n        else if (pointersLength === 1) session.firstMultiple = false;\n        var firstInput = session.firstInput;\n        var firstMultiple = session.firstMultiple;\n        var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n        var center = input.center = getCenter(pointers);\n        input.timeStamp = now();\n        input.deltaTime = input.timeStamp - firstInput.timeStamp;\n        input.angle = getAngle(offsetCenter, center);\n        input.distance = getDistance(offsetCenter, center);\n        computeDeltaXY(session, input);\n        input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n        var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n        input.overallVelocityX = overallVelocity.x;\n        input.overallVelocityY = overallVelocity.y;\n        input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;\n        input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n        input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n        input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;\n        computeIntervalInputData(session, input);\n        // find the correct target\n        var target = manager.element;\n        if (hasParent(input.srcEvent.target, target)) target = input.srcEvent.target;\n        input.target = target;\n    }\n    function computeDeltaXY(session, input) {\n        var center = input.center;\n        var offset = session.offsetDelta || {};\n        var prevDelta = session.prevDelta || {};\n        var prevInput = session.prevInput || {};\n        if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n            prevDelta = session.prevDelta = {\n                x: prevInput.deltaX || 0,\n                y: prevInput.deltaY || 0\n            };\n            offset = session.offsetDelta = {\n                x: center.x,\n                y: center.y\n            };\n        }\n        input.deltaX = prevDelta.x + (center.x - offset.x);\n        input.deltaY = prevDelta.y + (center.y - offset.y);\n    }\n    /**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */ function computeIntervalInputData(session, input) {\n        var last = session.lastInterval || input, deltaTime = input.timeStamp - last.timeStamp, velocity, velocityX, velocityY, direction;\n        if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n            var deltaX = input.deltaX - last.deltaX;\n            var deltaY = input.deltaY - last.deltaY;\n            var v = getVelocity(deltaTime, deltaX, deltaY);\n            velocityX = v.x;\n            velocityY = v.y;\n            velocity = abs(v.x) > abs(v.y) ? v.x : v.y;\n            direction = getDirection(deltaX, deltaY);\n            session.lastInterval = input;\n        } else {\n            // use latest velocity info if it doesn't overtake a minimum period\n            velocity = last.velocity;\n            velocityX = last.velocityX;\n            velocityY = last.velocityY;\n            direction = last.direction;\n        }\n        input.velocity = velocity;\n        input.velocityX = velocityX;\n        input.velocityY = velocityY;\n        input.direction = direction;\n    }\n    /**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */ function simpleCloneInputData(input) {\n        // make a simple copy of the pointers because we will get a reference if we don't\n        // we only need clientXY for the calculations\n        var pointers = [];\n        var i = 0;\n        while(i < input.pointers.length){\n            pointers[i] = {\n                clientX: round(input.pointers[i].clientX),\n                clientY: round(input.pointers[i].clientY)\n            };\n            i++;\n        }\n        return {\n            timeStamp: now(),\n            pointers: pointers,\n            center: getCenter(pointers),\n            deltaX: input.deltaX,\n            deltaY: input.deltaY\n        };\n    }\n    /**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */ function getCenter(pointers) {\n        var pointersLength = pointers.length;\n        // no need to loop when only one touch\n        if (pointersLength === 1) return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n        var x = 0, y = 0, i = 0;\n        while(i < pointersLength){\n            x += pointers[i].clientX;\n            y += pointers[i].clientY;\n            i++;\n        }\n        return {\n            x: round(x / pointersLength),\n            y: round(y / pointersLength)\n        };\n    }\n    /**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */ function getVelocity(deltaTime, x, y) {\n        return {\n            x: x / deltaTime || 0,\n            y: y / deltaTime || 0\n        };\n    }\n    /**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */ function getDirection(x, y) {\n        if (x === y) return DIRECTION_NONE;\n        if (abs(x) >= abs(y)) return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n        return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n    }\n    /**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */ function getDistance(p1, p2, props) {\n        if (!props) props = PROPS_XY;\n        var x = p2[props[0]] - p1[props[0]], y = p2[props[1]] - p1[props[1]];\n        return Math.sqrt(x * x + y * y);\n    }\n    /**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */ function getAngle(p1, p2, props) {\n        if (!props) props = PROPS_XY;\n        var x = p2[props[0]] - p1[props[0]], y = p2[props[1]] - p1[props[1]];\n        return Math.atan2(y, x) * 180 / Math.PI;\n    }\n    /**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */ function getRotation(start, end) {\n        return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n    }\n    /**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */ function getScale(start, end) {\n        return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n    }\n    var MOUSE_INPUT_MAP = {\n        mousedown: INPUT_START,\n        mousemove: INPUT_MOVE,\n        mouseup: INPUT_END\n    };\n    var MOUSE_ELEMENT_EVENTS = \"mousedown\";\n    var MOUSE_WINDOW_EVENTS = \"mousemove mouseup\";\n    /**\n * Mouse events input\n * @constructor\n * @extends Input\n */ function MouseInput() {\n        this.evEl = MOUSE_ELEMENT_EVENTS;\n        this.evWin = MOUSE_WINDOW_EVENTS;\n        this.pressed = false; // mousedown state\n        Input.apply(this, arguments);\n    }\n    inherit(MouseInput, Input, {\n        /**\n     * handle mouse events\n     * @param {Object} ev\n     */ handler: function MEhandler(ev) {\n            var eventType = MOUSE_INPUT_MAP[ev.type];\n            // on start we want to have the left mouse button down\n            if (eventType & INPUT_START && ev.button === 0) this.pressed = true;\n            if (eventType & INPUT_MOVE && ev.which !== 1) eventType = INPUT_END;\n            // mouse must be down\n            if (!this.pressed) return;\n            if (eventType & INPUT_END) this.pressed = false;\n            this.callback(this.manager, eventType, {\n                pointers: [\n                    ev\n                ],\n                changedPointers: [\n                    ev\n                ],\n                pointerType: INPUT_TYPE_MOUSE,\n                srcEvent: ev\n            });\n        }\n    });\n    var POINTER_INPUT_MAP = {\n        pointerdown: INPUT_START,\n        pointermove: INPUT_MOVE,\n        pointerup: INPUT_END,\n        pointercancel: INPUT_CANCEL,\n        pointerout: INPUT_CANCEL\n    };\n    // in IE10 the pointer types is defined as an enum\n    var IE10_POINTER_TYPE_ENUM = {\n        2: INPUT_TYPE_TOUCH,\n        3: INPUT_TYPE_PEN,\n        4: INPUT_TYPE_MOUSE,\n        5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n    };\n    var POINTER_ELEMENT_EVENTS = \"pointerdown\";\n    var POINTER_WINDOW_EVENTS = \"pointermove pointerup pointercancel\";\n    // IE10 has prefixed support, and case-sensitive\n    if (window.MSPointerEvent && !window.PointerEvent) {\n        POINTER_ELEMENT_EVENTS = \"MSPointerDown\";\n        POINTER_WINDOW_EVENTS = \"MSPointerMove MSPointerUp MSPointerCancel\";\n    }\n    /**\n * Pointer events input\n * @constructor\n * @extends Input\n */ function PointerEventInput() {\n        this.evEl = POINTER_ELEMENT_EVENTS;\n        this.evWin = POINTER_WINDOW_EVENTS;\n        Input.apply(this, arguments);\n        this.store = this.manager.session.pointerEvents = [];\n    }\n    inherit(PointerEventInput, Input, {\n        /**\n     * handle mouse events\n     * @param {Object} ev\n     */ handler: function PEhandler(ev) {\n            var store = this.store;\n            var removePointer = false;\n            var eventTypeNormalized = ev.type.toLowerCase().replace(\"ms\", \"\");\n            var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n            var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n            var isTouch = pointerType == INPUT_TYPE_TOUCH;\n            // get index of the event in the store\n            var storeIndex = inArray(store, ev.pointerId, \"pointerId\");\n            // start and mouse must be down\n            if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n                if (storeIndex < 0) {\n                    store.push(ev);\n                    storeIndex = store.length - 1;\n                }\n            } else if (eventType & (INPUT_END | INPUT_CANCEL)) removePointer = true;\n            // it not found, so the pointer hasn't been down (so it's probably a hover)\n            if (storeIndex < 0) return;\n            // update the event in the store\n            store[storeIndex] = ev;\n            this.callback(this.manager, eventType, {\n                pointers: store,\n                changedPointers: [\n                    ev\n                ],\n                pointerType: pointerType,\n                srcEvent: ev\n            });\n            if (removePointer) // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    });\n    var SINGLE_TOUCH_INPUT_MAP = {\n        touchstart: INPUT_START,\n        touchmove: INPUT_MOVE,\n        touchend: INPUT_END,\n        touchcancel: INPUT_CANCEL\n    };\n    var SINGLE_TOUCH_TARGET_EVENTS = \"touchstart\";\n    var SINGLE_TOUCH_WINDOW_EVENTS = \"touchstart touchmove touchend touchcancel\";\n    /**\n * Touch events input\n * @constructor\n * @extends Input\n */ function SingleTouchInput() {\n        this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n        this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n        this.started = false;\n        Input.apply(this, arguments);\n    }\n    inherit(SingleTouchInput, Input, {\n        handler: function TEhandler(ev) {\n            var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n            // should we handle the touch events?\n            if (type === INPUT_START) this.started = true;\n            if (!this.started) return;\n            var touches = normalizeSingleTouches.call(this, ev, type);\n            // when done, reset the started state\n            if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) this.started = false;\n            this.callback(this.manager, type, {\n                pointers: touches[0],\n                changedPointers: touches[1],\n                pointerType: INPUT_TYPE_TOUCH,\n                srcEvent: ev\n            });\n        }\n    });\n    /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */ function normalizeSingleTouches(ev, type) {\n        var all = toArray(ev.touches);\n        var changed = toArray(ev.changedTouches);\n        if (type & (INPUT_END | INPUT_CANCEL)) all = uniqueArray(all.concat(changed), \"identifier\", true);\n        return [\n            all,\n            changed\n        ];\n    }\n    var TOUCH_INPUT_MAP = {\n        touchstart: INPUT_START,\n        touchmove: INPUT_MOVE,\n        touchend: INPUT_END,\n        touchcancel: INPUT_CANCEL\n    };\n    var TOUCH_TARGET_EVENTS = \"touchstart touchmove touchend touchcancel\";\n    /**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */ function TouchInput() {\n        this.evTarget = TOUCH_TARGET_EVENTS;\n        this.targetIds = {};\n        Input.apply(this, arguments);\n    }\n    inherit(TouchInput, Input, {\n        handler: function MTEhandler(ev) {\n            var type = TOUCH_INPUT_MAP[ev.type];\n            var touches = getTouches.call(this, ev, type);\n            if (!touches) return;\n            this.callback(this.manager, type, {\n                pointers: touches[0],\n                changedPointers: touches[1],\n                pointerType: INPUT_TYPE_TOUCH,\n                srcEvent: ev\n            });\n        }\n    });\n    /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */ function getTouches(ev, type) {\n        var allTouches = toArray(ev.touches);\n        var targetIds = this.targetIds;\n        // when there is only one touch, the process can be simplified\n        if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n            targetIds[allTouches[0].identifier] = true;\n            return [\n                allTouches,\n                allTouches\n            ];\n        }\n        var i, targetTouches, changedTouches = toArray(ev.changedTouches), changedTargetTouches = [], target = this.target;\n        // get target touches from touches\n        targetTouches = allTouches.filter(function(touch) {\n            return hasParent(touch.target, target);\n        });\n        // collect touches\n        if (type === INPUT_START) {\n            i = 0;\n            while(i < targetTouches.length){\n                targetIds[targetTouches[i].identifier] = true;\n                i++;\n            }\n        }\n        // filter changed touches to only contain touches that exist in the collected target ids\n        i = 0;\n        while(i < changedTouches.length){\n            if (targetIds[changedTouches[i].identifier]) changedTargetTouches.push(changedTouches[i]);\n            // cleanup removed touches\n            if (type & (INPUT_END | INPUT_CANCEL)) delete targetIds[changedTouches[i].identifier];\n            i++;\n        }\n        if (!changedTargetTouches.length) return;\n        return [\n            // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n            uniqueArray(targetTouches.concat(changedTargetTouches), \"identifier\", true),\n            changedTargetTouches\n        ];\n    }\n    /**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */ var DEDUP_TIMEOUT = 2500;\n    var DEDUP_DISTANCE = 25;\n    function TouchMouseInput() {\n        Input.apply(this, arguments);\n        var handler = bindFn(this.handler, this);\n        this.touch = new TouchInput(this.manager, handler);\n        this.mouse = new MouseInput(this.manager, handler);\n        this.primaryTouch = null;\n        this.lastTouches = [];\n    }\n    inherit(TouchMouseInput, Input, {\n        /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */ handler: function TMEhandler(manager, inputEvent, inputData) {\n            var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH, isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;\n            if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) return;\n            // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n            if (isTouch) recordTouches.call(this, inputEvent, inputData);\n            else if (isMouse && isSyntheticEvent.call(this, inputData)) return;\n            this.callback(manager, inputEvent, inputData);\n        },\n        /**\n     * remove the event listeners\n     */ destroy: function destroy() {\n            this.touch.destroy();\n            this.mouse.destroy();\n        }\n    });\n    function recordTouches(eventType, eventData) {\n        if (eventType & INPUT_START) {\n            this.primaryTouch = eventData.changedPointers[0].identifier;\n            setLastTouch.call(this, eventData);\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) setLastTouch.call(this, eventData);\n    }\n    function setLastTouch(eventData) {\n        var touch = eventData.changedPointers[0];\n        if (touch.identifier === this.primaryTouch) {\n            var lastTouch = {\n                x: touch.clientX,\n                y: touch.clientY\n            };\n            this.lastTouches.push(lastTouch);\n            var lts = this.lastTouches;\n            var removeLastTouch = function() {\n                var i = lts.indexOf(lastTouch);\n                if (i > -1) lts.splice(i, 1);\n            };\n            setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n        }\n    }\n    function isSyntheticEvent(eventData) {\n        var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n        for(var i = 0; i < this.lastTouches.length; i++){\n            var t = this.lastTouches[i];\n            var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n            if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) return true;\n        }\n        return false;\n    }\n    var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, \"touchAction\");\n    var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n    // magical touchAction value\n    var TOUCH_ACTION_COMPUTE = \"compute\";\n    var TOUCH_ACTION_AUTO = \"auto\";\n    var TOUCH_ACTION_MANIPULATION = \"manipulation\"; // not implemented\n    var TOUCH_ACTION_NONE = \"none\";\n    var TOUCH_ACTION_PAN_X = \"pan-x\";\n    var TOUCH_ACTION_PAN_Y = \"pan-y\";\n    var TOUCH_ACTION_MAP = getTouchActionProps();\n    /**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */ function TouchAction(manager, value) {\n        this.manager = manager;\n        this.set(value);\n    }\n    TouchAction.prototype = {\n        /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */ set: function(value) {\n            // find out the touch-action by the event handlers\n            if (value == TOUCH_ACTION_COMPUTE) value = this.compute();\n            if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n            this.actions = value.toLowerCase().trim();\n        },\n        /**\n     * just re-set the touchAction value\n     */ update: function() {\n            this.set(this.manager.options.touchAction);\n        },\n        /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */ compute: function() {\n            var actions = [];\n            each(this.manager.recognizers, function(recognizer) {\n                if (boolOrFn(recognizer.options.enable, [\n                    recognizer\n                ])) actions = actions.concat(recognizer.getTouchAction());\n            });\n            return cleanTouchActions(actions.join(\" \"));\n        },\n        /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */ preventDefaults: function(input) {\n            var srcEvent = input.srcEvent;\n            var direction = input.offsetDirection;\n            // if the touch action did prevented once this session\n            if (this.manager.session.prevented) {\n                srcEvent.preventDefault();\n                return;\n            }\n            var actions = this.actions;\n            var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n            var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n            var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n            if (hasNone) {\n                //do not prevent defaults if this is a tap gesture\n                var isTapPointer = input.pointers.length === 1;\n                var isTapMovement = input.distance < 2;\n                var isTapTouchTime = input.deltaTime < 250;\n                if (isTapPointer && isTapMovement && isTapTouchTime) return;\n            }\n            if (hasPanX && hasPanY) // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n            return;\n            if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) return this.preventSrc(srcEvent);\n        },\n        /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */ preventSrc: function(srcEvent) {\n            this.manager.session.prevented = true;\n            srcEvent.preventDefault();\n        }\n    };\n    /**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */ function cleanTouchActions(actions) {\n        // none\n        if (inStr(actions, TOUCH_ACTION_NONE)) return TOUCH_ACTION_NONE;\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n        // if both pan-x and pan-y are set (different recognizers\n        // for different directions, e.g. horizontal pan but vertical swipe?)\n        // we need none (as otherwise with pan-x pan-y combined none of these\n        // recognizers will work, since the browser would handle all panning\n        if (hasPanX && hasPanY) return TOUCH_ACTION_NONE;\n        // pan-x OR pan-y\n        if (hasPanX || hasPanY) return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n        // manipulation\n        if (inStr(actions, TOUCH_ACTION_MANIPULATION)) return TOUCH_ACTION_MANIPULATION;\n        return TOUCH_ACTION_AUTO;\n    }\n    function getTouchActionProps() {\n        if (!NATIVE_TOUCH_ACTION) return false;\n        var touchMap = {};\n        var cssSupports = window.CSS && window.CSS.supports;\n        [\n            \"auto\",\n            \"manipulation\",\n            \"pan-y\",\n            \"pan-x\",\n            \"pan-x pan-y\",\n            \"none\"\n        ].forEach(function(val) {\n            // If css.supports is not supported but there is native touch-action assume it supports\n            // all values. This is the case for IE 10 and 11.\n            touchMap[val] = cssSupports ? window.CSS.supports(\"touch-action\", val) : true;\n        });\n        return touchMap;\n    }\n    /**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */ var STATE_POSSIBLE = 1;\n    var STATE_BEGAN = 2;\n    var STATE_CHANGED = 4;\n    var STATE_ENDED = 8;\n    var STATE_RECOGNIZED = STATE_ENDED;\n    var STATE_CANCELLED = 16;\n    var STATE_FAILED = 32;\n    /**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */ function Recognizer(options) {\n        this.options = assign({}, this.defaults, options || {});\n        this.id = uniqueId();\n        this.manager = null;\n        // default is enable true\n        this.options.enable = ifUndefined(this.options.enable, true);\n        this.state = STATE_POSSIBLE;\n        this.simultaneous = {};\n        this.requireFail = [];\n    }\n    Recognizer.prototype = {\n        /**\n     * @virtual\n     * @type {Object}\n     */ defaults: {},\n        /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */ set: function(options) {\n            assign(this.options, options);\n            // also update the touchAction, in case something changed about the directions/enabled state\n            this.manager && this.manager.touchAction.update();\n            return this;\n        },\n        /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */ recognizeWith: function(otherRecognizer) {\n            if (invokeArrayArg(otherRecognizer, \"recognizeWith\", this)) return this;\n            var simultaneous = this.simultaneous;\n            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n            if (!simultaneous[otherRecognizer.id]) {\n                simultaneous[otherRecognizer.id] = otherRecognizer;\n                otherRecognizer.recognizeWith(this);\n            }\n            return this;\n        },\n        /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */ dropRecognizeWith: function(otherRecognizer) {\n            if (invokeArrayArg(otherRecognizer, \"dropRecognizeWith\", this)) return this;\n            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n            delete this.simultaneous[otherRecognizer.id];\n            return this;\n        },\n        /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */ requireFailure: function(otherRecognizer) {\n            if (invokeArrayArg(otherRecognizer, \"requireFailure\", this)) return this;\n            var requireFail = this.requireFail;\n            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n            if (inArray(requireFail, otherRecognizer) === -1) {\n                requireFail.push(otherRecognizer);\n                otherRecognizer.requireFailure(this);\n            }\n            return this;\n        },\n        /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */ dropRequireFailure: function(otherRecognizer) {\n            if (invokeArrayArg(otherRecognizer, \"dropRequireFailure\", this)) return this;\n            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n            var index = inArray(this.requireFail, otherRecognizer);\n            if (index > -1) this.requireFail.splice(index, 1);\n            return this;\n        },\n        /**\n     * has require failures boolean\n     * @returns {boolean}\n     */ hasRequireFailures: function() {\n            return this.requireFail.length > 0;\n        },\n        /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */ canRecognizeWith: function(otherRecognizer) {\n            return !!this.simultaneous[otherRecognizer.id];\n        },\n        /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */ emit: function(input) {\n            var self = this;\n            var state = this.state;\n            function emit(event) {\n                self.manager.emit(event, input);\n            }\n            // 'panstart' and 'panmove'\n            if (state < STATE_ENDED) emit(self.options.event + stateStr(state));\n            emit(self.options.event); // simple 'eventName' events\n            if (input.additionalEvent) emit(input.additionalEvent);\n            // panend and pancancel\n            if (state >= STATE_ENDED) emit(self.options.event + stateStr(state));\n        },\n        /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */ tryEmit: function(input) {\n            if (this.canEmit()) return this.emit(input);\n            // it's failing anyway\n            this.state = STATE_FAILED;\n        },\n        /**\n     * can we emit?\n     * @returns {boolean}\n     */ canEmit: function() {\n            var i = 0;\n            while(i < this.requireFail.length){\n                if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) return false;\n                i++;\n            }\n            return true;\n        },\n        /**\n     * update the recognizer\n     * @param {Object} inputData\n     */ recognize: function(inputData) {\n            // make a new copy of the inputData\n            // so we can change the inputData without messing up the other recognizers\n            var inputDataClone = assign({}, inputData);\n            // is is enabled and allow recognizing?\n            if (!boolOrFn(this.options.enable, [\n                this,\n                inputDataClone\n            ])) {\n                this.reset();\n                this.state = STATE_FAILED;\n                return;\n            }\n            // reset when we've reached the end\n            if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) this.state = STATE_POSSIBLE;\n            this.state = this.process(inputDataClone);\n            // the recognizer has recognized a gesture\n            // so trigger an event\n            if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) this.tryEmit(inputDataClone);\n        },\n        /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */ process: function(inputData) {},\n        /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */ getTouchAction: function() {},\n        /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */ reset: function() {}\n    };\n    /**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */ function stateStr(state) {\n        if (state & STATE_CANCELLED) return \"cancel\";\n        else if (state & STATE_ENDED) return \"end\";\n        else if (state & STATE_CHANGED) return \"move\";\n        else if (state & STATE_BEGAN) return \"start\";\n        return \"\";\n    }\n    /**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */ function directionStr(direction) {\n        if (direction == DIRECTION_DOWN) return \"down\";\n        else if (direction == DIRECTION_UP) return \"up\";\n        else if (direction == DIRECTION_LEFT) return \"left\";\n        else if (direction == DIRECTION_RIGHT) return \"right\";\n        return \"\";\n    }\n    /**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */ function getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n        var manager = recognizer.manager;\n        if (manager) return manager.get(otherRecognizer);\n        return otherRecognizer;\n    }\n    /**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */ function AttrRecognizer() {\n        Recognizer.apply(this, arguments);\n    }\n    inherit(AttrRecognizer, Recognizer, {\n        /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */ defaults: {\n            /**\n         * @type {Number}\n         * @default 1\n         */ pointers: 1\n        },\n        /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */ attrTest: function(input) {\n            var optionPointers = this.options.pointers;\n            return optionPointers === 0 || input.pointers.length === optionPointers;\n        },\n        /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */ process: function(input) {\n            var state = this.state;\n            var eventType = input.eventType;\n            var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n            var isValid = this.attrTest(input);\n            // on cancel input and we've recognized before, return STATE_CANCELLED\n            if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) return state | STATE_CANCELLED;\n            else if (isRecognized || isValid) {\n                if (eventType & INPUT_END) return state | STATE_ENDED;\n                else if (!(state & STATE_BEGAN)) return STATE_BEGAN;\n                return state | STATE_CHANGED;\n            }\n            return STATE_FAILED;\n        }\n    });\n    /**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */ function PanRecognizer() {\n        AttrRecognizer.apply(this, arguments);\n        this.pX = null;\n        this.pY = null;\n    }\n    inherit(PanRecognizer, AttrRecognizer, {\n        /**\n     * @namespace\n     * @memberof PanRecognizer\n     */ defaults: {\n            event: \"pan\",\n            threshold: 10,\n            pointers: 1,\n            direction: DIRECTION_ALL\n        },\n        getTouchAction: function() {\n            var direction = this.options.direction;\n            var actions = [];\n            if (direction & DIRECTION_HORIZONTAL) actions.push(TOUCH_ACTION_PAN_Y);\n            if (direction & DIRECTION_VERTICAL) actions.push(TOUCH_ACTION_PAN_X);\n            return actions;\n        },\n        directionTest: function(input) {\n            var options = this.options;\n            var hasMoved = true;\n            var distance = input.distance;\n            var direction = input.direction;\n            var x = input.deltaX;\n            var y = input.deltaY;\n            // lock to axis?\n            if (!(direction & options.direction)) {\n                if (options.direction & DIRECTION_HORIZONTAL) {\n                    direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                    hasMoved = x != this.pX;\n                    distance = Math.abs(input.deltaX);\n                } else {\n                    direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n                    hasMoved = y != this.pY;\n                    distance = Math.abs(input.deltaY);\n                }\n            }\n            input.direction = direction;\n            return hasMoved && distance > options.threshold && direction & options.direction;\n        },\n        attrTest: function(input) {\n            return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));\n        },\n        emit: function(input) {\n            this.pX = input.deltaX;\n            this.pY = input.deltaY;\n            var direction = directionStr(input.direction);\n            if (direction) input.additionalEvent = this.options.event + direction;\n            this._super.emit.call(this, input);\n        }\n    });\n    /**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */ function PinchRecognizer() {\n        AttrRecognizer.apply(this, arguments);\n    }\n    inherit(PinchRecognizer, AttrRecognizer, {\n        /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */ defaults: {\n            event: \"pinch\",\n            threshold: 0,\n            pointers: 2\n        },\n        getTouchAction: function() {\n            return [\n                TOUCH_ACTION_NONE\n            ];\n        },\n        attrTest: function(input) {\n            return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n        },\n        emit: function(input) {\n            if (input.scale !== 1) {\n                var inOut = input.scale < 1 ? \"in\" : \"out\";\n                input.additionalEvent = this.options.event + inOut;\n            }\n            this._super.emit.call(this, input);\n        }\n    });\n    /**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */ function PressRecognizer() {\n        Recognizer.apply(this, arguments);\n        this._timer = null;\n        this._input = null;\n    }\n    inherit(PressRecognizer, Recognizer, {\n        /**\n     * @namespace\n     * @memberof PressRecognizer\n     */ defaults: {\n            event: \"press\",\n            pointers: 1,\n            time: 251,\n            threshold: 9 // a minimal movement is ok, but keep it low\n        },\n        getTouchAction: function() {\n            return [\n                TOUCH_ACTION_AUTO\n            ];\n        },\n        process: function(input) {\n            var options = this.options;\n            var validPointers = input.pointers.length === options.pointers;\n            var validMovement = input.distance < options.threshold;\n            var validTime = input.deltaTime > options.time;\n            this._input = input;\n            // we only allow little movement\n            // and we've reached an end event, so a tap is possible\n            if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) this.reset();\n            else if (input.eventType & INPUT_START) {\n                this.reset();\n                this._timer = setTimeoutContext(function() {\n                    this.state = STATE_RECOGNIZED;\n                    this.tryEmit();\n                }, options.time, this);\n            } else if (input.eventType & INPUT_END) return STATE_RECOGNIZED;\n            return STATE_FAILED;\n        },\n        reset: function() {\n            clearTimeout(this._timer);\n        },\n        emit: function(input) {\n            if (this.state !== STATE_RECOGNIZED) return;\n            if (input && input.eventType & INPUT_END) this.manager.emit(this.options.event + \"up\", input);\n            else {\n                this._input.timeStamp = now();\n                this.manager.emit(this.options.event, this._input);\n            }\n        }\n    });\n    /**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */ function RotateRecognizer() {\n        AttrRecognizer.apply(this, arguments);\n    }\n    inherit(RotateRecognizer, AttrRecognizer, {\n        /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */ defaults: {\n            event: \"rotate\",\n            threshold: 0,\n            pointers: 2\n        },\n        getTouchAction: function() {\n            return [\n                TOUCH_ACTION_NONE\n            ];\n        },\n        attrTest: function(input) {\n            return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n        }\n    });\n    /**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */ function SwipeRecognizer() {\n        AttrRecognizer.apply(this, arguments);\n    }\n    inherit(SwipeRecognizer, AttrRecognizer, {\n        /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */ defaults: {\n            event: \"swipe\",\n            threshold: 10,\n            velocity: 0.3,\n            direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n            pointers: 1\n        },\n        getTouchAction: function() {\n            return PanRecognizer.prototype.getTouchAction.call(this);\n        },\n        attrTest: function(input) {\n            var direction = this.options.direction;\n            var velocity;\n            if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) velocity = input.overallVelocity;\n            else if (direction & DIRECTION_HORIZONTAL) velocity = input.overallVelocityX;\n            else if (direction & DIRECTION_VERTICAL) velocity = input.overallVelocityY;\n            return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n        },\n        emit: function(input) {\n            var direction = directionStr(input.offsetDirection);\n            if (direction) this.manager.emit(this.options.event + direction, input);\n            this.manager.emit(this.options.event, input);\n        }\n    });\n    /**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */ function TapRecognizer() {\n        Recognizer.apply(this, arguments);\n        // previous time and center,\n        // used for tap counting\n        this.pTime = false;\n        this.pCenter = false;\n        this._timer = null;\n        this._input = null;\n        this.count = 0;\n    }\n    inherit(TapRecognizer, Recognizer, {\n        /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */ defaults: {\n            event: \"tap\",\n            pointers: 1,\n            taps: 1,\n            interval: 300,\n            time: 250,\n            threshold: 9,\n            posThreshold: 10 // a multi-tap can be a bit off the initial position\n        },\n        getTouchAction: function() {\n            return [\n                TOUCH_ACTION_MANIPULATION\n            ];\n        },\n        process: function(input) {\n            var options = this.options;\n            var validPointers = input.pointers.length === options.pointers;\n            var validMovement = input.distance < options.threshold;\n            var validTouchTime = input.deltaTime < options.time;\n            this.reset();\n            if (input.eventType & INPUT_START && this.count === 0) return this.failTimeout();\n            // we only allow little movement\n            // and we've reached an end event, so a tap is possible\n            if (validMovement && validTouchTime && validPointers) {\n                if (input.eventType != INPUT_END) return this.failTimeout();\n                var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;\n                var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n                this.pTime = input.timeStamp;\n                this.pCenter = input.center;\n                if (!validMultiTap || !validInterval) this.count = 1;\n                else this.count += 1;\n                this._input = input;\n                // if tap count matches we have recognized it,\n                // else it has began recognizing...\n                var tapCount = this.count % options.taps;\n                if (tapCount === 0) {\n                    // no failing requirements, immediately trigger the tap event\n                    // or wait as long as the multitap interval to trigger\n                    if (!this.hasRequireFailures()) return STATE_RECOGNIZED;\n                    else {\n                        this._timer = setTimeoutContext(function() {\n                            this.state = STATE_RECOGNIZED;\n                            this.tryEmit();\n                        }, options.interval, this);\n                        return STATE_BEGAN;\n                    }\n                }\n            }\n            return STATE_FAILED;\n        },\n        failTimeout: function() {\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_FAILED;\n            }, this.options.interval, this);\n            return STATE_FAILED;\n        },\n        reset: function() {\n            clearTimeout(this._timer);\n        },\n        emit: function() {\n            if (this.state == STATE_RECOGNIZED) {\n                this._input.tapCount = this.count;\n                this.manager.emit(this.options.event, this._input);\n            }\n        }\n    });\n    /**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */ function Hammer(element, options) {\n        options = options || {};\n        options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n        return new Manager(element, options);\n    }\n    /**\n * @const {string}\n */ Hammer.VERSION = \"2.0.7\";\n    /**\n * default settings\n * @namespace\n */ Hammer.defaults = {\n        /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */ domEvents: false,\n        /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */ touchAction: TOUCH_ACTION_COMPUTE,\n        /**\n     * @type {Boolean}\n     * @default true\n     */ enable: true,\n        /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */ inputTarget: null,\n        /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */ inputClass: null,\n        /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */ preset: [\n            // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n            [\n                RotateRecognizer,\n                {\n                    enable: false\n                }\n            ],\n            [\n                PinchRecognizer,\n                {\n                    enable: false\n                },\n                [\n                    \"rotate\"\n                ]\n            ],\n            [\n                SwipeRecognizer,\n                {\n                    direction: DIRECTION_HORIZONTAL\n                }\n            ],\n            [\n                PanRecognizer,\n                {\n                    direction: DIRECTION_HORIZONTAL\n                },\n                [\n                    \"swipe\"\n                ]\n            ],\n            [\n                TapRecognizer\n            ],\n            [\n                TapRecognizer,\n                {\n                    event: \"doubletap\",\n                    taps: 2\n                },\n                [\n                    \"tap\"\n                ]\n            ],\n            [\n                PressRecognizer\n            ]\n        ],\n        /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */ cssProps: {\n            /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */ userSelect: \"none\",\n            /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */ touchSelect: \"none\",\n            /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */ touchCallout: \"none\",\n            /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */ contentZooming: \"none\",\n            /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */ userDrag: \"none\",\n            /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */ tapHighlightColor: \"rgba(0,0,0,0)\"\n        }\n    };\n    var STOP = 1;\n    var FORCED_STOP = 2;\n    /**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */ function Manager(element, options) {\n        this.options = assign({}, Hammer.defaults, options || {});\n        this.options.inputTarget = this.options.inputTarget || element;\n        this.handlers = {};\n        this.session = {};\n        this.recognizers = [];\n        this.oldCssProps = {};\n        this.element = element;\n        this.input = createInputInstance(this);\n        this.touchAction = new TouchAction(this, this.options.touchAction);\n        toggleCssProps(this, true);\n        each(this.options.recognizers, function(item) {\n            var recognizer = this.add(new item[0](item[1]));\n            item[2] && recognizer.recognizeWith(item[2]);\n            item[3] && recognizer.requireFailure(item[3]);\n        }, this);\n    }\n    Manager.prototype = {\n        /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */ set: function(options) {\n            assign(this.options, options);\n            // Options that need a little more setup\n            if (options.touchAction) this.touchAction.update();\n            if (options.inputTarget) {\n                // Clean up existing event listeners and reinitialize\n                this.input.destroy();\n                this.input.target = options.inputTarget;\n                this.input.init();\n            }\n            return this;\n        },\n        /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */ stop: function(force) {\n            this.session.stopped = force ? FORCED_STOP : STOP;\n        },\n        /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */ recognize: function(inputData) {\n            var session = this.session;\n            if (session.stopped) return;\n            // run the touch-action polyfill\n            this.touchAction.preventDefaults(inputData);\n            var recognizer;\n            var recognizers = this.recognizers;\n            // this holds the recognizer that is being recognized.\n            // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n            // if no recognizer is detecting a thing, it is set to `null`\n            var curRecognizer = session.curRecognizer;\n            // reset when the last recognizer is recognized\n            // or when we're in a new session\n            if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) curRecognizer = session.curRecognizer = null;\n            var i = 0;\n            while(i < recognizers.length){\n                recognizer = recognizers[i];\n                // find out if we are allowed try to recognize the input for this one.\n                // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n                // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n                //      that is being recognized.\n                // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n                //      this can be setup with the `recognizeWith()` method on the recognizer.\n                if (session.stopped !== FORCED_STOP && (!curRecognizer || recognizer == curRecognizer || recognizer.canRecognizeWith(curRecognizer))) recognizer.recognize(inputData);\n                else recognizer.reset();\n                // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n                // current active recognizer. but only if we don't already have an active recognizer\n                if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) curRecognizer = session.curRecognizer = recognizer;\n                i++;\n            }\n        },\n        /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */ get: function(recognizer) {\n            if (recognizer instanceof Recognizer) return recognizer;\n            var recognizers = this.recognizers;\n            for(var i = 0; i < recognizers.length; i++){\n                if (recognizers[i].options.event == recognizer) return recognizers[i];\n            }\n            return null;\n        },\n        /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */ add: function(recognizer) {\n            if (invokeArrayArg(recognizer, \"add\", this)) return this;\n            // remove existing\n            var existing = this.get(recognizer.options.event);\n            if (existing) this.remove(existing);\n            this.recognizers.push(recognizer);\n            recognizer.manager = this;\n            this.touchAction.update();\n            return recognizer;\n        },\n        /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */ remove: function(recognizer) {\n            if (invokeArrayArg(recognizer, \"remove\", this)) return this;\n            recognizer = this.get(recognizer);\n            // let's make sure this recognizer exists\n            if (recognizer) {\n                var recognizers = this.recognizers;\n                var index = inArray(recognizers, recognizer);\n                if (index !== -1) {\n                    recognizers.splice(index, 1);\n                    this.touchAction.update();\n                }\n            }\n            return this;\n        },\n        /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */ on: function(events, handler) {\n            if (events === undefined) return;\n            if (handler === undefined) return;\n            var handlers = this.handlers;\n            each(splitStr(events), function(event) {\n                handlers[event] = handlers[event] || [];\n                handlers[event].push(handler);\n            });\n            return this;\n        },\n        /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */ off: function(events, handler) {\n            if (events === undefined) return;\n            var handlers = this.handlers;\n            each(splitStr(events), function(event) {\n                if (!handler) delete handlers[event];\n                else handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n            });\n            return this;\n        },\n        /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */ emit: function(event, data) {\n            // we also want to trigger dom events\n            if (this.options.domEvents) triggerDomEvent(event, data);\n            // no handlers, so skip it all\n            var handlers = this.handlers[event] && this.handlers[event].slice();\n            if (!handlers || !handlers.length) return;\n            data.type = event;\n            data.preventDefault = function() {\n                data.srcEvent.preventDefault();\n            };\n            var i = 0;\n            while(i < handlers.length){\n                handlers[i](data);\n                i++;\n            }\n        },\n        /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */ destroy: function() {\n            this.element && toggleCssProps(this, false);\n            this.handlers = {};\n            this.session = {};\n            this.input.destroy();\n            this.element = null;\n        }\n    };\n    /**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */ function toggleCssProps(manager, add) {\n        var element = manager.element;\n        if (!element.style) return;\n        var prop;\n        each(manager.options.cssProps, function(value, name) {\n            prop = prefixed(element.style, name);\n            if (add) {\n                manager.oldCssProps[prop] = element.style[prop];\n                element.style[prop] = value;\n            } else element.style[prop] = manager.oldCssProps[prop] || \"\";\n        });\n        if (!add) manager.oldCssProps = {};\n    }\n    /**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */ function triggerDomEvent(event, data) {\n        var gestureEvent = document.createEvent(\"Event\");\n        gestureEvent.initEvent(event, true, true);\n        gestureEvent.gesture = data;\n        data.target.dispatchEvent(gestureEvent);\n    }\n    assign(Hammer, {\n        INPUT_START: INPUT_START,\n        INPUT_MOVE: INPUT_MOVE,\n        INPUT_END: INPUT_END,\n        INPUT_CANCEL: INPUT_CANCEL,\n        STATE_POSSIBLE: STATE_POSSIBLE,\n        STATE_BEGAN: STATE_BEGAN,\n        STATE_CHANGED: STATE_CHANGED,\n        STATE_ENDED: STATE_ENDED,\n        STATE_RECOGNIZED: STATE_RECOGNIZED,\n        STATE_CANCELLED: STATE_CANCELLED,\n        STATE_FAILED: STATE_FAILED,\n        DIRECTION_NONE: DIRECTION_NONE,\n        DIRECTION_LEFT: DIRECTION_LEFT,\n        DIRECTION_RIGHT: DIRECTION_RIGHT,\n        DIRECTION_UP: DIRECTION_UP,\n        DIRECTION_DOWN: DIRECTION_DOWN,\n        DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n        DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n        DIRECTION_ALL: DIRECTION_ALL,\n        Manager: Manager,\n        Input: Input,\n        TouchAction: TouchAction,\n        TouchInput: TouchInput,\n        MouseInput: MouseInput,\n        PointerEventInput: PointerEventInput,\n        TouchMouseInput: TouchMouseInput,\n        SingleTouchInput: SingleTouchInput,\n        Recognizer: Recognizer,\n        AttrRecognizer: AttrRecognizer,\n        Tap: TapRecognizer,\n        Pan: PanRecognizer,\n        Swipe: SwipeRecognizer,\n        Pinch: PinchRecognizer,\n        Rotate: RotateRecognizer,\n        Press: PressRecognizer,\n        on: addEventListeners,\n        off: removeEventListeners,\n        each: each,\n        merge: merge1,\n        extend: extend,\n        assign: assign,\n        inherit: inherit,\n        bindFn: bindFn,\n        prefixed: prefixed\n    });\n    // this prevents errors when Hammer is loaded in the presence of an AMD\n    //  style loader but by script tag, not by the loader.\n    var freeGlobal = typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}; // jshint ignore:line\n    freeGlobal.Hammer = Hammer;\n    if (typeof define === \"function\" && define.amd) define(function() {\n        return Hammer;\n    });\n    else if (module.exports) module.exports = Hammer;\n    else window[exportName] = Hammer;\n})(window, document, \"Hammer\");\n\n},{}],\"cbPq1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/* eslint-disable no-invalid-this */ parcelHelpers.export(exports, \"enhancePointerEventInput\", ()=>enhancePointerEventInput);\n// overrides MouseInput.handler to accept right mouse button\nparcelHelpers.export(exports, \"enhanceMouseInput\", ()=>enhanceMouseInput);\n/**\n * This file contains overrides the default\n * hammer.js functions to add our own utility\n */ /* eslint-disable */ /* Hammer.js constants */ const INPUT_START = 1;\nconst INPUT_MOVE = 2;\nconst INPUT_END = 4;\nconst MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n/**\n * Helper function that returns true if any element in an array meets given criteria.\n * Because older browsers do not support `Array.prototype.some`\n * @params array {Array}\n * @params predict {Function}\n */ function some(array, predict) {\n    for(let i = 0; i < array.length; i++){\n        if (predict(array[i])) return true;\n    }\n    return false;\n}\nfunction enhancePointerEventInput(PointerEventInput) {\n    const oldHandler = PointerEventInput.prototype.handler;\n    // overrides PointerEventInput.handler to accept right mouse button\n    PointerEventInput.prototype.handler = function handler(ev) {\n        const store = this.store;\n        // Allow non-left mouse buttons through\n        if (ev.button > 0 && ev.type === \"pointerdown\") {\n            if (!some(store, (e)=>e.pointerId === ev.pointerId)) store.push(ev);\n        }\n        oldHandler.call(this, ev);\n    };\n}\nfunction enhanceMouseInput(MouseInput) {\n    MouseInput.prototype.handler = function handler(ev) {\n        let eventType = MOUSE_INPUT_MAP[ev.type];\n        // on start we want to have the mouse button down\n        if (eventType & INPUT_START && ev.button >= 0) this.pressed = true;\n        if (eventType & INPUT_MOVE && ev.which === 0) eventType = INPUT_END;\n        // mouse must be down\n        if (!this.pressed) return;\n        if (eventType & INPUT_END) this.pressed = false;\n        this.callback(this.manager, eventType, {\n            pointers: [\n                ev\n            ],\n            changedPointers: [\n                ev\n            ],\n            pointerType: \"mouse\",\n            srcEvent: ev\n        });\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5CpSK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _input = require(\"./input\");\nvar _inputDefault = parcelHelpers.interopDefault(_input);\nvar _constants = require(\"../constants\");\nvar _globals = require(\"../utils/globals\");\nconst firefox = (0, _globals.userAgent).indexOf(\"firefox\") !== -1;\nconst { WHEEL_EVENTS  } = (0, _constants.INPUT_EVENT_TYPES);\nconst EVENT_TYPE = \"wheel\";\n// Constants for normalizing input delta\nconst WHEEL_DELTA_MAGIC_SCALER = 4.000244140625;\nconst WHEEL_DELTA_PER_LINE = 40;\n// Slow down zoom if shift key is held for more precise zooming\nconst SHIFT_MULTIPLIER = 0.25;\nclass WheelInput extends (0, _inputDefault.default) {\n    constructor(element, callback, options){\n        super(element, callback, options);\n        /* eslint-disable complexity, max-statements */ this.handleEvent = (event)=>{\n            if (!this.options.enable) return;\n            let value = event.deltaY;\n            if ((0, _globals.window).WheelEvent) {\n                // Firefox doubles the values on retina screens...\n                if (firefox && event.deltaMode === (0, _globals.window).WheelEvent.DOM_DELTA_PIXEL) value /= (0, _globals.window).devicePixelRatio;\n                if (event.deltaMode === (0, _globals.window).WheelEvent.DOM_DELTA_LINE) value *= WHEEL_DELTA_PER_LINE;\n            }\n            if (value !== 0 && value % WHEEL_DELTA_MAGIC_SCALER === 0) // This one is definitely a mouse wheel event.\n            // Normalize this value to match trackpad.\n            value = Math.floor(value / WHEEL_DELTA_MAGIC_SCALER);\n            if (event.shiftKey && value) value = value * SHIFT_MULTIPLIER;\n            this.callback({\n                type: EVENT_TYPE,\n                center: {\n                    x: event.clientX,\n                    y: event.clientY\n                },\n                delta: -value,\n                srcEvent: event,\n                pointerType: \"mouse\",\n                target: event.target\n            });\n        };\n        this.events = (this.options.events || []).concat(WHEEL_EVENTS);\n        this.events.forEach((event)=>element.addEventListener(event, this.handleEvent, (0, _globals.passiveSupported) ? {\n                passive: false\n            } : false));\n    }\n    destroy() {\n        this.events.forEach((event)=>this.element.removeEventListener(event, this.handleEvent));\n    }\n    /**\n     * Enable this input (begin processing events)\n     * if the specified event type is among those handled by this input.\n     */ enableEventType(eventType, enabled) {\n        if (eventType === EVENT_TYPE) this.options.enable = enabled;\n    }\n}\nexports.default = WheelInput;\n\n},{\"./input\":\"9znkz\",\"../constants\":\"8DNcD\",\"../utils/globals\":\"1GYVv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9znkz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nclass Input {\n    constructor(element, callback, options){\n        this.element = element;\n        this.callback = callback;\n        this.options = {\n            enable: true,\n            ...options\n        };\n    }\n}\nexports.default = Input;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8DNcD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"RECOGNIZERS\", ()=>RECOGNIZERS);\nparcelHelpers.export(exports, \"RECOGNIZER_COMPATIBLE_MAP\", ()=>RECOGNIZER_COMPATIBLE_MAP);\nparcelHelpers.export(exports, \"RECOGNIZER_FALLBACK_MAP\", ()=>RECOGNIZER_FALLBACK_MAP);\nparcelHelpers.export(exports, \"BASIC_EVENT_ALIASES\", ()=>BASIC_EVENT_ALIASES);\nparcelHelpers.export(exports, \"INPUT_EVENT_TYPES\", ()=>INPUT_EVENT_TYPES);\nparcelHelpers.export(exports, \"EVENT_RECOGNIZER_MAP\", ()=>EVENT_RECOGNIZER_MAP);\nparcelHelpers.export(exports, \"GESTURE_EVENT_ALIASES\", ()=>GESTURE_EVENT_ALIASES);\nvar _hammer = require(\"./utils/hammer\");\nvar _hammerDefault = parcelHelpers.interopDefault(_hammer);\nconst RECOGNIZERS = (0, _hammerDefault.default) ? [\n    [\n        (0, _hammerDefault.default).Pan,\n        {\n            event: \"tripan\",\n            pointers: 3,\n            threshold: 0,\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Rotate,\n        {\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Pinch,\n        {\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Swipe,\n        {\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Pan,\n        {\n            threshold: 0,\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Press,\n        {\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Tap,\n        {\n            event: \"doubletap\",\n            taps: 2,\n            enable: false\n        }\n    ],\n    // TODO - rename to 'tap' and 'singletap' in the next major release\n    [\n        (0, _hammerDefault.default).Tap,\n        {\n            event: \"anytap\",\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Tap,\n        {\n            enable: false\n        }\n    ]\n] : null;\nconst RECOGNIZER_COMPATIBLE_MAP = {\n    tripan: [\n        \"rotate\",\n        \"pinch\",\n        \"pan\"\n    ],\n    rotate: [\n        \"pinch\"\n    ],\n    pinch: [\n        \"pan\"\n    ],\n    pan: [\n        \"press\",\n        \"doubletap\",\n        \"anytap\",\n        \"tap\"\n    ],\n    doubletap: [\n        \"anytap\"\n    ],\n    anytap: [\n        \"tap\"\n    ]\n};\nconst RECOGNIZER_FALLBACK_MAP = {\n    doubletap: [\n        \"tap\"\n    ]\n};\nconst BASIC_EVENT_ALIASES = {\n    pointerdown: \"pointerdown\",\n    pointermove: \"pointermove\",\n    pointerup: \"pointerup\",\n    touchstart: \"pointerdown\",\n    touchmove: \"pointermove\",\n    touchend: \"pointerup\",\n    mousedown: \"pointerdown\",\n    mousemove: \"pointermove\",\n    mouseup: \"pointerup\"\n};\nconst INPUT_EVENT_TYPES = {\n    KEY_EVENTS: [\n        \"keydown\",\n        \"keyup\"\n    ],\n    MOUSE_EVENTS: [\n        \"mousedown\",\n        \"mousemove\",\n        \"mouseup\",\n        \"mouseover\",\n        \"mouseout\",\n        \"mouseleave\"\n    ],\n    WHEEL_EVENTS: [\n        // Chrome, Safari\n        \"wheel\",\n        // IE\n        \"mousewheel\"\n    ]\n};\nconst EVENT_RECOGNIZER_MAP = {\n    tap: \"tap\",\n    anytap: \"anytap\",\n    doubletap: \"doubletap\",\n    press: \"press\",\n    pinch: \"pinch\",\n    pinchin: \"pinch\",\n    pinchout: \"pinch\",\n    pinchstart: \"pinch\",\n    pinchmove: \"pinch\",\n    pinchend: \"pinch\",\n    pinchcancel: \"pinch\",\n    rotate: \"rotate\",\n    rotatestart: \"rotate\",\n    rotatemove: \"rotate\",\n    rotateend: \"rotate\",\n    rotatecancel: \"rotate\",\n    tripan: \"tripan\",\n    tripanstart: \"tripan\",\n    tripanmove: \"tripan\",\n    tripanup: \"tripan\",\n    tripandown: \"tripan\",\n    tripanleft: \"tripan\",\n    tripanright: \"tripan\",\n    tripanend: \"tripan\",\n    tripancancel: \"tripan\",\n    pan: \"pan\",\n    panstart: \"pan\",\n    panmove: \"pan\",\n    panup: \"pan\",\n    pandown: \"pan\",\n    panleft: \"pan\",\n    panright: \"pan\",\n    panend: \"pan\",\n    pancancel: \"pan\",\n    swipe: \"swipe\",\n    swipeleft: \"swipe\",\n    swiperight: \"swipe\",\n    swipeup: \"swipe\",\n    swipedown: \"swipe\"\n};\nconst GESTURE_EVENT_ALIASES = {\n    click: \"tap\",\n    anyclick: \"anytap\",\n    dblclick: \"doubletap\",\n    mousedown: \"pointerdown\",\n    mousemove: \"pointermove\",\n    mouseup: \"pointerup\",\n    mouseover: \"pointerover\",\n    mouseout: \"pointerout\",\n    mouseleave: \"pointerleave\"\n};\n\n},{\"./utils/hammer\":\"ehFxm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1GYVv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"userAgent\", ()=>userAgent);\nparcelHelpers.export(exports, \"window\", ()=>window_);\nparcelHelpers.export(exports, \"global\", ()=>global_);\nparcelHelpers.export(exports, \"document\", ()=>document_);\nparcelHelpers.export(exports, \"passiveSupported\", ()=>passiveSupported);\nvar global = arguments[3];\nconst userAgent = typeof navigator !== \"undefined\" && navigator.userAgent ? navigator.userAgent.toLowerCase() : \"\";\nconst window_ = typeof window !== \"undefined\" ? window : global;\nconst global_ = typeof global !== \"undefined\" ? global : window;\nconst document_ = typeof document !== \"undefined\" ? document : {};\n/*\n * Detect whether passive option is supported by the current browser.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n   #Safely_detecting_option_support\n */ let passiveSupported = false;\n/* eslint-disable accessor-pairs, no-empty */ try {\n    const options = {\n        // This function will be called when the browser\n        // attempts to access the passive property.\n        get passive () {\n            passiveSupported = true;\n            return true;\n        }\n    };\n    window_.addEventListener(\"test\", null, options);\n    window_.removeEventListener(\"test\", null);\n} catch (err) {\n    passiveSupported = false;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kMux8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _input = require(\"./input\");\nvar _inputDefault = parcelHelpers.interopDefault(_input);\nvar _constants = require(\"../constants\");\nconst { MOUSE_EVENTS  } = (0, _constants.INPUT_EVENT_TYPES);\nconst MOVE_EVENT_TYPE = \"pointermove\";\nconst OVER_EVENT_TYPE = \"pointerover\";\nconst OUT_EVENT_TYPE = \"pointerout\";\nconst ENTER_EVENT_TYPE = \"pointerenter\";\nconst LEAVE_EVENT_TYPE = \"pointerleave\";\nclass MoveInput extends (0, _inputDefault.default) {\n    constructor(element, callback, options){\n        super(element, callback, options);\n        this.handleEvent = (event)=>{\n            this.handleOverEvent(event);\n            this.handleOutEvent(event);\n            this.handleEnterEvent(event);\n            this.handleLeaveEvent(event);\n            this.handleMoveEvent(event);\n        };\n        this.pressed = false;\n        const { enable  } = this.options;\n        this.enableMoveEvent = enable;\n        this.enableLeaveEvent = enable;\n        this.enableEnterEvent = enable;\n        this.enableOutEvent = enable;\n        this.enableOverEvent = enable;\n        this.events = (this.options.events || []).concat(MOUSE_EVENTS);\n        this.events.forEach((event)=>element.addEventListener(event, this.handleEvent));\n    }\n    destroy() {\n        this.events.forEach((event)=>this.element.removeEventListener(event, this.handleEvent));\n    }\n    /**\n     * Enable this input (begin processing events)\n     * if the specified event type is among those handled by this input.\n     */ enableEventType(eventType, enabled) {\n        if (eventType === MOVE_EVENT_TYPE) this.enableMoveEvent = enabled;\n        if (eventType === OVER_EVENT_TYPE) this.enableOverEvent = enabled;\n        if (eventType === OUT_EVENT_TYPE) this.enableOutEvent = enabled;\n        if (eventType === ENTER_EVENT_TYPE) this.enableEnterEvent = enabled;\n        if (eventType === LEAVE_EVENT_TYPE) this.enableLeaveEvent = enabled;\n    }\n    handleOverEvent(event) {\n        if (this.enableOverEvent) {\n            if (event.type === \"mouseover\") this._emit(OVER_EVENT_TYPE, event);\n        }\n    }\n    handleOutEvent(event) {\n        if (this.enableOutEvent) {\n            if (event.type === \"mouseout\") this._emit(OUT_EVENT_TYPE, event);\n        }\n    }\n    handleEnterEvent(event) {\n        if (this.enableEnterEvent) {\n            if (event.type === \"mouseenter\") this._emit(ENTER_EVENT_TYPE, event);\n        }\n    }\n    handleLeaveEvent(event) {\n        if (this.enableLeaveEvent) {\n            if (event.type === \"mouseleave\") this._emit(LEAVE_EVENT_TYPE, event);\n        }\n    }\n    handleMoveEvent(event) {\n        if (this.enableMoveEvent) switch(event.type){\n            case \"mousedown\":\n                if (event.button >= 0) // Button is down\n                this.pressed = true;\n                break;\n            case \"mousemove\":\n                // Move events use `which` to track the button being pressed\n                if (event.which === 0) // Button is not down\n                this.pressed = false;\n                if (!this.pressed) // Drag events are emitted by hammer already\n                // we just need to emit the move event on hover\n                this._emit(MOVE_EVENT_TYPE, event);\n                break;\n            case \"mouseup\":\n                this.pressed = false;\n                break;\n            default:\n        }\n    }\n    _emit(type, event) {\n        this.callback({\n            type,\n            center: {\n                x: event.clientX,\n                y: event.clientY\n            },\n            srcEvent: event,\n            pointerType: \"mouse\",\n            target: event.target\n        });\n    }\n}\nexports.default = MoveInput;\n\n},{\"./input\":\"9znkz\",\"../constants\":\"8DNcD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l9uTF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _input = require(\"./input\");\nvar _inputDefault = parcelHelpers.interopDefault(_input);\nvar _constants = require(\"../constants\");\nconst { KEY_EVENTS  } = (0, _constants.INPUT_EVENT_TYPES);\nconst DOWN_EVENT_TYPE = \"keydown\";\nconst UP_EVENT_TYPE = \"keyup\";\nclass KeyInput extends (0, _inputDefault.default) {\n    constructor(element, callback, options){\n        super(element, callback, options);\n        this.handleEvent = (event)=>{\n            // Ignore if focused on text input\n            const targetElement = event.target || event.srcElement;\n            if (targetElement.tagName === \"INPUT\" && targetElement.type === \"text\" || targetElement.tagName === \"TEXTAREA\") return;\n            if (this.enableDownEvent && event.type === \"keydown\") this.callback({\n                type: DOWN_EVENT_TYPE,\n                srcEvent: event,\n                key: event.key,\n                target: event.target\n            });\n            if (this.enableUpEvent && event.type === \"keyup\") this.callback({\n                type: UP_EVENT_TYPE,\n                srcEvent: event,\n                key: event.key,\n                target: event.target\n            });\n        };\n        this.enableDownEvent = this.options.enable;\n        this.enableUpEvent = this.options.enable;\n        this.events = (this.options.events || []).concat(KEY_EVENTS);\n        element.tabIndex = this.options.tabIndex || 0;\n        element.style.outline = \"none\";\n        this.events.forEach((event)=>element.addEventListener(event, this.handleEvent));\n    }\n    destroy() {\n        this.events.forEach((event)=>this.element.removeEventListener(event, this.handleEvent));\n    }\n    /**\n     * Enable this input (begin processing events)\n     * if the specified event type is among those handled by this input.\n     */ enableEventType(eventType, enabled) {\n        if (eventType === DOWN_EVENT_TYPE) this.enableDownEvent = enabled;\n        if (eventType === UP_EVENT_TYPE) this.enableUpEvent = enabled;\n    }\n}\nexports.default = KeyInput;\n\n},{\"./input\":\"9znkz\",\"../constants\":\"8DNcD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fha15\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _input = require(\"./input\");\nvar _inputDefault = parcelHelpers.interopDefault(_input);\nconst EVENT_TYPE = \"contextmenu\";\nclass ContextmenuInput extends (0, _inputDefault.default) {\n    constructor(element, callback, options){\n        super(element, callback, options);\n        this.handleEvent = (event)=>{\n            if (!this.options.enable) return;\n            this.callback({\n                type: EVENT_TYPE,\n                center: {\n                    x: event.clientX,\n                    y: event.clientY\n                },\n                srcEvent: event,\n                pointerType: \"mouse\",\n                target: event.target\n            });\n        };\n        element.addEventListener(\"contextmenu\", this.handleEvent);\n    }\n    destroy() {\n        this.element.removeEventListener(\"contextmenu\", this.handleEvent);\n    }\n    /**\n     * Enable this input (begin processing events)\n     * if the specified event type is among those handled by this input.\n     */ enableEventType(eventType, enabled) {\n        if (eventType === EVENT_TYPE) this.options.enable = enabled;\n    }\n}\nexports.default = ContextmenuInput;\n\n},{\"./input\":\"9znkz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gzQTI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _eventUtils = require(\"./event-utils\");\nconst DEFAULT_OPTIONS = {\n    srcElement: \"root\",\n    priority: 0\n};\nclass EventRegistrar {\n    constructor(eventManager){\n        /**\n         * Handles hammerjs event\n         */ this.handleEvent = (event)=>{\n            if (this.isEmpty()) return;\n            const mjolnirEvent = this._normalizeEvent(event);\n            let target = event.srcEvent.target;\n            while(target && target !== mjolnirEvent.rootElement){\n                this._emit(mjolnirEvent, target);\n                if (mjolnirEvent.handled) return;\n                target = target.parentNode;\n            }\n            this._emit(mjolnirEvent, \"root\");\n        };\n        this.eventManager = eventManager;\n        this.handlers = [];\n        // Element -> handler map\n        this.handlersByElement = new Map();\n        this._active = false;\n    }\n    // Returns true if there are no non-passive handlers\n    isEmpty() {\n        return !this._active;\n    }\n    add(type, handler, options, once = false, passive = false) {\n        const { handlers , handlersByElement  } = this;\n        let opts = DEFAULT_OPTIONS;\n        if (typeof options === \"string\" || options && options.addEventListener) // is DOM element, backward compatibility\n        // @ts-ignore\n        opts = {\n            ...DEFAULT_OPTIONS,\n            srcElement: options\n        };\n        else if (options) opts = {\n            ...DEFAULT_OPTIONS,\n            ...options\n        };\n        let entries = handlersByElement.get(opts.srcElement);\n        if (!entries) {\n            entries = [];\n            handlersByElement.set(opts.srcElement, entries);\n        }\n        const entry = {\n            type,\n            handler,\n            srcElement: opts.srcElement,\n            priority: opts.priority\n        };\n        if (once) entry.once = true;\n        if (passive) entry.passive = true;\n        handlers.push(entry);\n        this._active = this._active || !entry.passive;\n        // Sort handlers by descending priority\n        // Handlers with the same priority are excuted in the order of registration\n        let insertPosition = entries.length - 1;\n        while(insertPosition >= 0){\n            if (entries[insertPosition].priority >= entry.priority) break;\n            insertPosition--;\n        }\n        entries.splice(insertPosition + 1, 0, entry);\n    }\n    remove(type, handler) {\n        const { handlers , handlersByElement  } = this;\n        for(let i = handlers.length - 1; i >= 0; i--){\n            const entry = handlers[i];\n            if (entry.type === type && entry.handler === handler) {\n                handlers.splice(i, 1);\n                const entries = handlersByElement.get(entry.srcElement);\n                entries.splice(entries.indexOf(entry), 1);\n                if (entries.length === 0) handlersByElement.delete(entry.srcElement);\n            }\n        }\n        this._active = handlers.some((entry)=>!entry.passive);\n    }\n    /**\n     * Invoke handlers on a particular element\n     */ _emit(event, srcElement) {\n        const entries = this.handlersByElement.get(srcElement);\n        if (entries) {\n            let immediatePropagationStopped = false;\n            // Prevents the current event from bubbling up\n            const stopPropagation = ()=>{\n                event.handled = true;\n            };\n            // Prevent any remaining listeners from being called\n            const stopImmediatePropagation = ()=>{\n                event.handled = true;\n                immediatePropagationStopped = true;\n            };\n            const entriesToRemove = [];\n            for(let i = 0; i < entries.length; i++){\n                const { type , handler , once  } = entries[i];\n                handler({\n                    ...event,\n                    // @ts-ignore\n                    type,\n                    stopPropagation,\n                    stopImmediatePropagation\n                });\n                if (once) entriesToRemove.push(entries[i]);\n                if (immediatePropagationStopped) break;\n            }\n            for(let i1 = 0; i1 < entriesToRemove.length; i1++){\n                const { type , handler  } = entriesToRemove[i1];\n                this.remove(type, handler);\n            }\n        }\n    }\n    /**\n     * Normalizes hammerjs and custom events to have predictable fields.\n     */ _normalizeEvent(event) {\n        const rootElement = this.eventManager.getElement();\n        return {\n            ...event,\n            ...(0, _eventUtils.whichButtons)(event),\n            ...(0, _eventUtils.getOffsetPosition)(event, rootElement),\n            preventDefault: ()=>{\n                event.srcEvent.preventDefault();\n            },\n            stopImmediatePropagation: null,\n            stopPropagation: null,\n            handled: false,\n            rootElement\n        };\n    }\n}\nexports.default = EventRegistrar;\n\n},{\"./event-utils\":\"4N9Et\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4N9Et\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Extract the involved mouse button\n */ parcelHelpers.export(exports, \"whichButtons\", ()=>whichButtons);\n/**\n * Calculate event position relative to the root element\n */ parcelHelpers.export(exports, \"getOffsetPosition\", ()=>getOffsetPosition);\n/* Constants */ const DOWN_EVENT = 1;\nconst MOVE_EVENT = 2;\nconst UP_EVENT = 4;\nconst MOUSE_EVENTS = {\n    pointerdown: DOWN_EVENT,\n    pointermove: MOVE_EVENT,\n    pointerup: UP_EVENT,\n    mousedown: DOWN_EVENT,\n    mousemove: MOVE_EVENT,\n    mouseup: UP_EVENT\n};\n// MouseEvent.which https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which\nconst MOUSE_EVENT_WHICH_LEFT = 1;\nconst MOUSE_EVENT_WHICH_MIDDLE = 2;\nconst MOUSE_EVENT_WHICH_RIGHT = 3;\n// MouseEvent.button https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\nconst MOUSE_EVENT_BUTTON_LEFT = 0;\nconst MOUSE_EVENT_BUTTON_MIDDLE = 1;\nconst MOUSE_EVENT_BUTTON_RIGHT = 2;\n// MouseEvent.buttons https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\nconst MOUSE_EVENT_BUTTONS_LEFT_MASK = 1;\nconst MOUSE_EVENT_BUTTONS_RIGHT_MASK = 2;\nconst MOUSE_EVENT_BUTTONS_MIDDLE_MASK = 4;\nfunction whichButtons(event) {\n    const eventType = MOUSE_EVENTS[event.srcEvent.type];\n    if (!eventType) // Not a mouse evet\n    return null;\n    const { buttons , button , which  } = event.srcEvent;\n    let leftButton = false;\n    let middleButton = false;\n    let rightButton = false;\n    if (// button is up, need to find out which one was pressed before\n    eventType === UP_EVENT || eventType === MOVE_EVENT && !Number.isFinite(buttons)) {\n        leftButton = which === MOUSE_EVENT_WHICH_LEFT;\n        middleButton = which === MOUSE_EVENT_WHICH_MIDDLE;\n        rightButton = which === MOUSE_EVENT_WHICH_RIGHT;\n    } else if (eventType === MOVE_EVENT) {\n        leftButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_LEFT_MASK);\n        middleButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_MIDDLE_MASK);\n        rightButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_RIGHT_MASK);\n    } else if (eventType === DOWN_EVENT) {\n        leftButton = button === MOUSE_EVENT_BUTTON_LEFT;\n        middleButton = button === MOUSE_EVENT_BUTTON_MIDDLE;\n        rightButton = button === MOUSE_EVENT_BUTTON_RIGHT;\n    }\n    return {\n        leftButton,\n        middleButton,\n        rightButton\n    };\n}\nfunction getOffsetPosition(event, rootElement) {\n    const center = event.center;\n    // `center` is a hammer.js event property\n    if (!center) // Not a gestural event\n    return null;\n    const rect = rootElement.getBoundingClientRect();\n    // Fix scale for map affected by a CSS transform.\n    // See https://stackoverflow.com/a/26893663/3528533\n    const scaleX = rect.width / rootElement.offsetWidth || 1;\n    const scaleY = rect.height / rootElement.offsetHeight || 1;\n    // Calculate center relative to the root element\n    const offsetCenter = {\n        x: (center.x - rect.left - rootElement.clientLeft) / scaleX,\n        y: (center.y - rect.top - rootElement.clientTop) / scaleY\n    };\n    return {\n        center,\n        offsetCenter\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Eygl7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CompositeLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _layer = require(\"./layer\");\nvar _layerDefault = parcelHelpers.interopDefault(_layer);\nvar _debug = require(\"../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _flatten = require(\"../utils/flatten\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar TRACE_RENDER_LAYERS = \"compositeLayer.renderLayers\";\nvar CompositeLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(CompositeLayer1, _Layer);\n    var _super = _createSuper(CompositeLayer1);\n    function CompositeLayer1() {\n        (0, _classCallCheckDefault.default)(this, CompositeLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(CompositeLayer1, [\n        {\n            key: \"getSubLayers\",\n            value: function getSubLayers() {\n                return this.internalState && this.internalState.subLayers || [];\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {}\n        },\n        {\n            key: \"setState\",\n            value: function setState(updateObject) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(CompositeLayer1.prototype), \"setState\", this).call(this, updateObject);\n                this.setNeedsUpdate();\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(_ref) {\n                var info = _ref.info;\n                var object = info.object;\n                var isDataWrapped = object && object.__source && object.__source.parent && object.__source.parent.id === this.id;\n                if (!isDataWrapped) return info;\n                return Object.assign(info, {\n                    object: object.__source.object,\n                    index: object.__source.index\n                });\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers() {\n                return null;\n            }\n        },\n        {\n            key: \"shouldRenderSubLayer\",\n            value: function shouldRenderSubLayer(id, data) {\n                var overridingProps = this.props._subLayerProps;\n                return data && data.length || overridingProps && overridingProps[id];\n            }\n        },\n        {\n            key: \"getSubLayerClass\",\n            value: function getSubLayerClass(id, DefaultLayerClass) {\n                var overridingProps = this.props._subLayerProps;\n                return overridingProps && overridingProps[id] && overridingProps[id].type || DefaultLayerClass;\n            }\n        },\n        {\n            key: \"getSubLayerRow\",\n            value: function getSubLayerRow(row, sourceObject, sourceObjectIndex) {\n                row.__source = {\n                    parent: this,\n                    object: sourceObject,\n                    index: sourceObjectIndex\n                };\n                return row;\n            }\n        },\n        {\n            key: \"getSubLayerAccessor\",\n            value: function getSubLayerAccessor(accessor) {\n                if (typeof accessor === \"function\") {\n                    var objectInfo = {\n                        data: this.props.data,\n                        target: []\n                    };\n                    return function(x, i) {\n                        if (x.__source) {\n                            objectInfo.index = x.__source.index;\n                            return accessor(x.__source.object, objectInfo);\n                        }\n                        return accessor(x, i);\n                    };\n                }\n                return accessor;\n            }\n        },\n        {\n            key: \"getSubLayerProps\",\n            value: function getSubLayerProps() {\n                var sublayerProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _this$props = this.props, opacity = _this$props.opacity, pickable = _this$props.pickable, visible = _this$props.visible, parameters = _this$props.parameters, getPolygonOffset = _this$props.getPolygonOffset, highlightedObjectIndex = _this$props.highlightedObjectIndex, autoHighlight = _this$props.autoHighlight, highlightColor = _this$props.highlightColor, coordinateSystem = _this$props.coordinateSystem, coordinateOrigin = _this$props.coordinateOrigin, wrapLongitude = _this$props.wrapLongitude, positionFormat = _this$props.positionFormat, modelMatrix = _this$props.modelMatrix, extensions = _this$props.extensions, overridingProps = _this$props._subLayerProps;\n                var newProps = {\n                    opacity: opacity,\n                    pickable: pickable,\n                    visible: visible,\n                    parameters: parameters,\n                    getPolygonOffset: getPolygonOffset,\n                    highlightedObjectIndex: highlightedObjectIndex,\n                    autoHighlight: autoHighlight,\n                    highlightColor: highlightColor,\n                    coordinateSystem: coordinateSystem,\n                    coordinateOrigin: coordinateOrigin,\n                    wrapLongitude: wrapLongitude,\n                    positionFormat: positionFormat,\n                    modelMatrix: modelMatrix,\n                    extensions: extensions\n                };\n                var overridingSublayerProps = overridingProps && overridingProps[sublayerProps.id];\n                var overridingSublayerTriggers = overridingSublayerProps && overridingSublayerProps.updateTriggers;\n                var sublayerId = sublayerProps.id || \"sublayer\";\n                if (overridingSublayerProps) {\n                    var propTypes = this.constructor._propTypes;\n                    for(var key in overridingSublayerProps){\n                        var propType = propTypes[key];\n                        if (propType && propType.type === \"accessor\") overridingSublayerProps[key] = this.getSubLayerAccessor(overridingSublayerProps[key]);\n                    }\n                }\n                Object.assign(newProps, sublayerProps, overridingSublayerProps, {\n                    id: \"\".concat(this.props.id, \"-\").concat(sublayerId),\n                    updateTriggers: Object.assign({\n                        all: this.props.updateTriggers.all\n                    }, sublayerProps.updateTriggers, overridingSublayerTriggers)\n                });\n                var _iterator = _createForOfIteratorHelper(extensions), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var extension = _step.value;\n                        var passThroughProps = extension.getSubLayerProps.call(this, extension);\n                        if (passThroughProps) Object.assign(newProps, passThroughProps, {\n                            updateTriggers: Object.assign(newProps.updateTriggers, passThroughProps.updateTriggers)\n                        });\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return newProps;\n            }\n        },\n        {\n            key: \"_getAttributeManager\",\n            value: function _getAttributeManager() {\n                return null;\n            }\n        },\n        {\n            key: \"_renderLayers\",\n            value: function _renderLayers() {\n                var subLayers = this.internalState.subLayers;\n                var shouldUpdate = !subLayers || this.needsUpdate();\n                if (shouldUpdate) {\n                    subLayers = this.renderLayers();\n                    subLayers = (0, _flatten.flatten)(subLayers, Boolean);\n                    this.internalState.subLayers = subLayers;\n                }\n                (0, _debugDefault.default)(TRACE_RENDER_LAYERS, this, shouldUpdate, subLayers);\n                var _iterator2 = _createForOfIteratorHelper(subLayers), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var layer = _step2.value;\n                        layer.parent = this;\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n            }\n        },\n        {\n            key: \"isComposite\",\n            get: function get() {\n                return true;\n            }\n        },\n        {\n            key: \"isLoaded\",\n            get: function get() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(CompositeLayer1.prototype), \"isLoaded\", this) && this.getSubLayers().every(function(layer) {\n                    return layer.isLoaded;\n                });\n            }\n        }\n    ]);\n    return CompositeLayer1;\n}((0, _layerDefault.default));\nCompositeLayer.layerName = \"CompositeLayer\";\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./layer\":\"krhD2\",\"../debug\":\"hpEQF\",\"../utils/flatten\":\"i8Kfk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5zSDR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LayerExtension);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar LayerExtension = function() {\n    function LayerExtension1() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, LayerExtension1);\n        this.opts = opts;\n    }\n    (0, _createClassDefault.default)(LayerExtension1, [\n        {\n            key: \"equals\",\n            value: function equals(extension) {\n                if (this === extension) return true;\n                return this.constructor === extension.constructor && (0, _deepEqual.deepEqual)(this.opts, extension.opts);\n            }\n        },\n        {\n            key: \"getShaders\",\n            value: function getShaders(extension) {\n                return null;\n            }\n        },\n        {\n            key: \"getSubLayerProps\",\n            value: function getSubLayerProps(extension) {\n                var _extension$constructo = extension.constructor.defaultProps, defaultProps = _extension$constructo === void 0 ? {} : _extension$constructo;\n                var newProps = {\n                    updateTriggers: {}\n                };\n                for(var key in defaultProps)if (key in this.props) {\n                    var propDef = defaultProps[key];\n                    var propValue = this.props[key];\n                    newProps[key] = propValue;\n                    if (propDef && propDef.type === \"accessor\") {\n                        newProps.updateTriggers[key] = this.props.updateTriggers[key];\n                        if (typeof propValue === \"function\") newProps[key] = this.getSubLayerAccessor(propValue, true);\n                    }\n                }\n                return newProps;\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState(context, extension) {}\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(params, extension) {}\n        },\n        {\n            key: \"draw\",\n            value: function draw(params, extension) {}\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState(extension) {}\n        }\n    ]);\n    return LayerExtension1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"../utils/deep-equal\":\"ftdIu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8GAPb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CameraLight);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _pointLight = require(\"./point-light\");\nvar _viewportUniforms = require(\"../../shaderlib/project/viewport-uniforms\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar CameraLight = function(_PointLight) {\n    (0, _inheritsDefault.default)(CameraLight1, _PointLight);\n    var _super = _createSuper(CameraLight1);\n    function CameraLight1() {\n        (0, _classCallCheckDefault.default)(this, CameraLight1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(CameraLight1, [\n        {\n            key: \"getProjectedLight\",\n            value: function getProjectedLight(_ref) {\n                var layer = _ref.layer;\n                var projectedLight = this.projectedLight;\n                var viewport = layer.context.viewport;\n                var _layer$props = layer.props, coordinateSystem = _layer$props.coordinateSystem, coordinateOrigin = _layer$props.coordinateOrigin, modelMatrix = _layer$props.modelMatrix;\n                var _getUniformsFromViewp = (0, _viewportUniforms.getUniformsFromViewport)({\n                    viewport: viewport,\n                    modelMatrix: modelMatrix,\n                    coordinateSystem: coordinateSystem,\n                    coordinateOrigin: coordinateOrigin\n                }), project_uCameraPosition = _getUniformsFromViewp.project_uCameraPosition;\n                projectedLight.color = this.color;\n                projectedLight.intensity = this.intensity;\n                projectedLight.position = project_uCameraPosition;\n                return projectedLight;\n            }\n        }\n    ]);\n    return CameraLight1;\n}((0, _pointLight.PointLight));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./point-light\":\"j2Let\",\"../../shaderlib/project/viewport-uniforms\":\"kLfPQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"acIce\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>SunLight);\nvar _objectWithoutProperties = require(\"@babel/runtime/helpers/esm/objectWithoutProperties\");\nvar _objectWithoutPropertiesDefault = parcelHelpers.interopDefault(_objectWithoutProperties);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _directionalLight = require(\"./directional-light\");\nvar _suncalc = require(\"./suncalc\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar SunLight = function(_DirectionalLight) {\n    (0, _inheritsDefault.default)(SunLight1, _DirectionalLight);\n    var _super = _createSuper(SunLight1);\n    function SunLight1(_ref) {\n        var _this;\n        var timestamp = _ref.timestamp, others = (0, _objectWithoutPropertiesDefault.default)(_ref, [\n            \"timestamp\"\n        ]);\n        (0, _classCallCheckDefault.default)(this, SunLight1);\n        _this = _super.call(this, others);\n        _this.timestamp = timestamp;\n        return _this;\n    }\n    (0, _createClassDefault.default)(SunLight1, [\n        {\n            key: \"getProjectedLight\",\n            value: function getProjectedLight(_ref2) {\n                var layer = _ref2.layer;\n                var _layer$context$viewpo = layer.context.viewport, latitude = _layer$context$viewpo.latitude, longitude = _layer$context$viewpo.longitude;\n                this.direction = (0, _suncalc.getSunlightDirection)(this.timestamp, latitude, longitude);\n                return this;\n            }\n        }\n    ]);\n    return SunLight1;\n}((0, _directionalLight.DirectionalLight));\n\n},{\"@babel/runtime/helpers/esm/objectWithoutProperties\":\"5P3Wc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./directional-light\":\"9vhZm\",\"./suncalc\":\"7JWrg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5P3Wc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _objectWithoutPropertiesLooseJs = require(\"./objectWithoutPropertiesLoose.js\");\nvar _objectWithoutPropertiesLooseJsDefault = parcelHelpers.interopDefault(_objectWithoutPropertiesLooseJs);\nfunction _objectWithoutProperties(source, excluded) {\n    if (source == null) return {};\n    var target = (0, _objectWithoutPropertiesLooseJsDefault.default)(source, excluded);\n    var key, i;\n    if (Object.getOwnPropertySymbols) {\n        var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n        for(i = 0; i < sourceSymbolKeys.length; i++){\n            key = sourceSymbolKeys[i];\n            if (excluded.indexOf(key) >= 0) continue;\n            if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n            target[key] = source[key];\n        }\n    }\n    return target;\n}\nexports.default = _objectWithoutProperties;\n\n},{\"./objectWithoutPropertiesLoose.js\":\"fbCls\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fbCls\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n    if (source == null) return {};\n    var target = {};\n    var sourceKeys = Object.keys(source);\n    var key, i;\n    for(i = 0; i < sourceKeys.length; i++){\n        key = sourceKeys[i];\n        if (excluded.indexOf(key) >= 0) continue;\n        target[key] = source[key];\n    }\n    return target;\n}\nexports.default = _objectWithoutPropertiesLoose;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7JWrg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSolarPosition\", ()=>getSolarPosition);\nparcelHelpers.export(exports, \"getSunlightDirection\", ()=>getSunlightDirection);\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nvar DAY_IN_MS = 86400000;\nvar JD1970 = 2440588;\nvar JD2000 = 2451545;\nvar e = DEGREES_TO_RADIANS * 23.4397;\nvar M0 = 357.5291;\nvar M1 = 0.98560028;\nvar THETA0 = 280.147;\nvar THETA1 = 360.9856235;\nfunction getSolarPosition(timestamp, latitude, longitude) {\n    var longitudeWestInRadians = DEGREES_TO_RADIANS * -longitude;\n    var phi = DEGREES_TO_RADIANS * latitude;\n    var d = toDays(timestamp);\n    var c = getSunCoords(d);\n    var H = getSiderealTime(d, longitudeWestInRadians) - c.rightAscension;\n    return {\n        azimuth: getAzimuth(H, phi, c.declination),\n        altitude: getAltitude(H, phi, c.declination)\n    };\n}\nfunction getSunlightDirection(timestamp, latitude, longitude) {\n    var _getSolarPosition = getSolarPosition(timestamp, latitude, longitude), azimuth = _getSolarPosition.azimuth, altitude = _getSolarPosition.altitude;\n    var azimuthN = azimuth + Math.PI;\n    return [\n        -Math.sin(azimuthN),\n        -Math.cos(azimuthN),\n        -Math.sin(altitude)\n    ];\n}\nfunction toJulianDay(timestamp) {\n    return timestamp / DAY_IN_MS - 0.5 + JD1970;\n}\nfunction toDays(timestamp) {\n    return toJulianDay(timestamp) - JD2000;\n}\nfunction getRightAscension(eclipticLongitude, b) {\n    var lambda = eclipticLongitude;\n    return Math.atan2(Math.sin(lambda) * Math.cos(e) - Math.tan(b) * Math.sin(e), Math.cos(lambda));\n}\nfunction getDeclination(eclipticLongitude, b) {\n    var lambda = eclipticLongitude;\n    return Math.asin(Math.sin(b) * Math.cos(e) + Math.cos(b) * Math.sin(e) * Math.sin(lambda));\n}\nfunction getAzimuth(hourAngle, latitudeInRadians, declination) {\n    var H = hourAngle;\n    var phi = latitudeInRadians;\n    var delta = declination;\n    return Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(phi) - Math.tan(delta) * Math.cos(phi));\n}\nfunction getAltitude(hourAngle, latitudeInRadians, declination) {\n    var H = hourAngle;\n    var phi = latitudeInRadians;\n    var delta = declination;\n    return Math.asin(Math.sin(phi) * Math.sin(delta) + Math.cos(phi) * Math.cos(delta) * Math.cos(H));\n}\nfunction getSiderealTime(dates, longitudeWestInRadians) {\n    return DEGREES_TO_RADIANS * (THETA0 + THETA1 * dates) - longitudeWestInRadians;\n}\nfunction getSolarMeanAnomaly(days) {\n    return DEGREES_TO_RADIANS * (M0 + M1 * days);\n}\nfunction getEclipticLongitude(meanAnomaly) {\n    var M = meanAnomaly;\n    var C = DEGREES_TO_RADIANS * (1.9148 * Math.sin(M) + 0.02 * Math.sin(2 * M) + 0.0003 * Math.sin(3 * M));\n    var P = DEGREES_TO_RADIANS * 102.9372;\n    return M + C + P + Math.PI;\n}\nfunction getSunCoords(dates) {\n    var M = getSolarMeanAnomaly(dates);\n    var L = getEclipticLongitude(M);\n    return {\n        declination: getDeclination(L, 0),\n        rightAscension: getRightAscension(L, 0)\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kOmrb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PostProcessEffect);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _effect = require(\"../lib/effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _screenPass = require(\"../passes/screen-pass\");\nvar _screenPassDefault = parcelHelpers.interopDefault(_screenPass);\nvar _core = require(\"@luma.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar PostProcessEffect = function(_Effect) {\n    (0, _inheritsDefault.default)(PostProcessEffect1, _Effect);\n    var _super = _createSuper(PostProcessEffect1);\n    function PostProcessEffect1(module) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, PostProcessEffect1);\n        _this = _super.call(this, props);\n        _this.id = \"\".concat(module.name, \"-pass\");\n        (0, _core.normalizeShaderModule)(module);\n        _this.module = module;\n        return _this;\n    }\n    (0, _createClassDefault.default)(PostProcessEffect1, [\n        {\n            key: \"postRender\",\n            value: function postRender(gl, params) {\n                if (!this.passes) this.passes = createPasses(gl, this.module, this.id, this.props);\n                var target = params.target;\n                var inputBuffer = params.inputBuffer;\n                var outputBuffer = params.swapBuffer;\n                for(var index = 0; index < this.passes.length; index++){\n                    if (target && index === this.passes.length - 1) outputBuffer = target;\n                    this.passes[index].render({\n                        inputBuffer: inputBuffer,\n                        outputBuffer: outputBuffer\n                    });\n                    var switchBuffer = outputBuffer;\n                    outputBuffer = inputBuffer;\n                    inputBuffer = switchBuffer;\n                }\n                return inputBuffer;\n            }\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {\n                if (this.passes) {\n                    var _iterator = _createForOfIteratorHelper(this.passes), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var pass = _step.value;\n                            pass[\"delete\"]();\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    this.passes = null;\n                }\n            }\n        }\n    ]);\n    return PostProcessEffect1;\n}((0, _effectDefault.default));\nfunction createPasses(gl, module, id, moduleSettings) {\n    if (module.filter || module.sampler) {\n        var fs = getFragmentShaderForRenderPass(module);\n        var pass = new (0, _screenPassDefault.default)(gl, {\n            id: id,\n            module: module,\n            fs: fs,\n            moduleSettings: moduleSettings\n        });\n        return [\n            pass\n        ];\n    }\n    var passes = module.passes || [];\n    return passes.map(function(pass, index) {\n        var fs = getFragmentShaderForRenderPass(module, pass);\n        var idn = \"\".concat(id, \"-\").concat(index);\n        return new (0, _screenPassDefault.default)(gl, {\n            id: idn,\n            module: module,\n            fs: fs,\n            moduleSettings: moduleSettings\n        });\n    });\n}\nvar FILTER_FS_TEMPLATE = function FILTER_FS_TEMPLATE(func) {\n    return \"uniform sampler2D texture;\\nuniform vec2 texSize;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main() {\\n  vec2 texCoord = coordinate;\\n\\n  gl_FragColor = texture2D(texture, texCoord);\\n  gl_FragColor = \".concat(func, \"(gl_FragColor, texSize, texCoord);\\n}\\n\");\n};\nvar SAMPLER_FS_TEMPLATE = function SAMPLER_FS_TEMPLATE(func) {\n    return \"uniform sampler2D texture;\\nuniform vec2 texSize;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main() {\\n  vec2 texCoord = coordinate;\\n\\n  gl_FragColor = \".concat(func, \"(texture, texSize, texCoord);\\n}\\n\");\n};\nfunction getFragmentShaderForRenderPass(module) {\n    var pass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : module;\n    if (pass.filter) {\n        var func = typeof pass.filter === \"string\" ? pass.filter : \"\".concat(module.name, \"_filterColor\");\n        return FILTER_FS_TEMPLATE(func);\n    }\n    if (pass.sampler) {\n        var _func = typeof pass.sampler === \"string\" ? pass.sampler : \"\".concat(module.name, \"_sampleColor\");\n        return SAMPLER_FS_TEMPLATE(_func);\n    }\n    return null;\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"../lib/effect\":\"6aqmc\",\"../passes/screen-pass\":\"5eNOu\",\"@luma.gl/core\":\"WBJLR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5eNOu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ScreenPass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@luma.gl/core\");\nvar _pass = require(\"./pass\");\nvar _passDefault = parcelHelpers.interopDefault(_pass);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar ScreenPass = function(_Pass) {\n    (0, _inheritsDefault.default)(ScreenPass1, _Pass);\n    var _super = _createSuper(ScreenPass1);\n    function ScreenPass1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, ScreenPass1);\n        _this = _super.call(this, gl, props);\n        var module = props.module, fs = props.fs, id = props.id;\n        _this.model = new (0, _core.ClipSpace)(gl, {\n            id: id,\n            fs: fs,\n            modules: [\n                module\n            ]\n        });\n        return _this;\n    }\n    (0, _createClassDefault.default)(ScreenPass1, [\n        {\n            key: \"render\",\n            value: function render(params) {\n                var _this2 = this;\n                var gl = this.gl;\n                (0, _core.withParameters)(gl, {\n                    framebuffer: params.outputBuffer,\n                    clearColor: [\n                        0,\n                        0,\n                        0,\n                        0\n                    ]\n                }, function() {\n                    return _this2._renderPass(gl, params);\n                });\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                this.model[\"delete\"]();\n                this.model = null;\n            }\n        },\n        {\n            key: \"_renderPass\",\n            value: function _renderPass(gl, _ref) {\n                var inputBuffer = _ref.inputBuffer, outputBuffer = _ref.outputBuffer;\n                (0, _core.clear)(gl, {\n                    color: true\n                });\n                this.model.draw({\n                    moduleSettings: this.props.moduleSettings,\n                    uniforms: {\n                        texture: inputBuffer,\n                        texSize: [\n                            inputBuffer.width,\n                            inputBuffer.height\n                        ]\n                    },\n                    parameters: {\n                        depthWrite: false,\n                        depthTest: false\n                    }\n                });\n            }\n        }\n    ]);\n    return ScreenPass1;\n}((0, _passDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@luma.gl/core\":\"WBJLR\",\"./pass\":\"2TNzZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5rgbh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GlobeViewport);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _viewport = require(\"./viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _constants = require(\"../lib/constants\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _vec4 = require(\"gl-matrix/vec4\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nvar RADIANS_TO_DEGREES = 180 / Math.PI;\nvar EARTH_RADIUS = 6370972;\nvar GLOBE_RADIUS = 256;\nfunction getDistanceScales() {\n    var unitsPerMeter = GLOBE_RADIUS / EARTH_RADIUS;\n    var unitsPerDegree = Math.PI / 180 * GLOBE_RADIUS;\n    return {\n        unitsPerMeter: [\n            unitsPerMeter,\n            unitsPerMeter,\n            unitsPerMeter\n        ],\n        unitsPerMeter2: [\n            0,\n            0,\n            0\n        ],\n        metersPerUnit: [\n            1 / unitsPerMeter,\n            1 / unitsPerMeter,\n            1 / unitsPerMeter\n        ],\n        unitsPerDegree: [\n            unitsPerDegree,\n            unitsPerDegree,\n            unitsPerMeter\n        ],\n        unitsPerDegree2: [\n            0,\n            0,\n            0\n        ],\n        degreesPerUnit: [\n            1 / unitsPerDegree,\n            1 / unitsPerDegree,\n            1 / unitsPerMeter\n        ]\n    };\n}\nvar GlobeViewport = function(_Viewport) {\n    (0, _inheritsDefault.default)(GlobeViewport1, _Viewport);\n    var _super = _createSuper(GlobeViewport1);\n    function GlobeViewport1() {\n        var _this;\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, GlobeViewport1);\n        var _opts$latitude = opts.latitude, latitude = _opts$latitude === void 0 ? 0 : _opts$latitude, _opts$longitude = opts.longitude, longitude = _opts$longitude === void 0 ? 0 : _opts$longitude, _opts$zoom = opts.zoom, zoom = _opts$zoom === void 0 ? 11 : _opts$zoom, _opts$nearZMultiplier = opts.nearZMultiplier, nearZMultiplier = _opts$nearZMultiplier === void 0 ? 0.1 : _opts$nearZMultiplier, _opts$farZMultiplier = opts.farZMultiplier, farZMultiplier = _opts$farZMultiplier === void 0 ? 2 : _opts$farZMultiplier, _opts$resolution = opts.resolution, resolution = _opts$resolution === void 0 ? 10 : _opts$resolution;\n        var width = opts.width, height = opts.height, _opts$altitude = opts.altitude, altitude = _opts$altitude === void 0 ? 1.5 : _opts$altitude;\n        width = width || 1;\n        height = height || 1;\n        altitude = Math.max(0.75, altitude);\n        var viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n            eye: [\n                0,\n                -altitude,\n                0\n            ],\n            up: [\n                0,\n                0,\n                1\n            ]\n        });\n        var scale = Math.pow(2, zoom);\n        viewMatrix.rotateX(latitude * DEGREES_TO_RADIANS);\n        viewMatrix.rotateZ(-longitude * DEGREES_TO_RADIANS);\n        viewMatrix.scale(scale / height);\n        var halfFov = Math.atan(0.5 / altitude);\n        var relativeScale = GLOBE_RADIUS * 2 * scale / height;\n        var viewportOpts = Object.assign({}, opts, {\n            width: width,\n            height: height,\n            viewMatrix: viewMatrix,\n            longitude: longitude,\n            latitude: latitude,\n            zoom: zoom,\n            fovyRadians: halfFov * 2,\n            aspect: width / height,\n            focalDistance: altitude,\n            near: nearZMultiplier,\n            far: Math.min(2, 1 / relativeScale + 1) * altitude * farZMultiplier\n        });\n        _this = _super.call(this, viewportOpts);\n        _this.resolution = resolution;\n        _this.distanceScales = getDistanceScales();\n        return _this;\n    }\n    (0, _createClassDefault.default)(GlobeViewport1, [\n        {\n            key: \"getDistanceScales\",\n            value: function getDistanceScales() {\n                return this.distanceScales;\n            }\n        },\n        {\n            key: \"getBounds\",\n            value: function getBounds() {\n                var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var unprojectOption = {\n                    targetZ: options.z || 0\n                };\n                var left = this.unproject([\n                    0,\n                    this.height / 2\n                ], unprojectOption);\n                var top = this.unproject([\n                    this.width / 2,\n                    0\n                ], unprojectOption);\n                var right = this.unproject([\n                    this.width,\n                    this.height / 2\n                ], unprojectOption);\n                var bottom = this.unproject([\n                    this.width / 2,\n                    this.height\n                ], unprojectOption);\n                if (right[0] < this.longitude) right[0] += 360;\n                if (left[0] > this.longitude) left[0] -= 360;\n                return [\n                    Math.min(left[0], right[0], top[0], bottom[0]),\n                    Math.min(left[1], right[1], top[1], bottom[1]),\n                    Math.max(left[0], right[0], top[0], bottom[0]),\n                    Math.max(left[1], right[1], top[1], bottom[1])\n                ];\n            }\n        },\n        {\n            key: \"unproject\",\n            value: function unproject(xyz) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$topLeft = _ref.topLeft, topLeft = _ref$topLeft === void 0 ? true : _ref$topLeft, targetZ = _ref.targetZ;\n                var _xyz = (0, _slicedToArrayDefault.default)(xyz, 3), x = _xyz[0], y = _xyz[1], z = _xyz[2];\n                var y2 = topLeft ? y : this.height - y;\n                var pixelUnprojectionMatrix = this.pixelUnprojectionMatrix;\n                var coord;\n                if (Number.isFinite(z)) coord = transformVector(pixelUnprojectionMatrix, [\n                    x,\n                    y2,\n                    z,\n                    1\n                ]);\n                else {\n                    var coord0 = transformVector(pixelUnprojectionMatrix, [\n                        x,\n                        y2,\n                        -1,\n                        1\n                    ]);\n                    var coord1 = transformVector(pixelUnprojectionMatrix, [\n                        x,\n                        y2,\n                        1,\n                        1\n                    ]);\n                    var lt = ((targetZ || 0) / EARTH_RADIUS + 1) * GLOBE_RADIUS;\n                    var lSqr = _vec3.sqrLen(_vec3.sub([], coord0, coord1));\n                    var l0Sqr = _vec3.sqrLen(coord0);\n                    var l1Sqr = _vec3.sqrLen(coord1);\n                    var sSqr = (4 * l0Sqr * l1Sqr - Math.pow(lSqr - l0Sqr - l1Sqr, 2)) / 16;\n                    var dSqr = 4 * sSqr / lSqr;\n                    var r0 = Math.sqrt(l0Sqr - dSqr);\n                    var dr = Math.sqrt(Math.max(0, lt * lt - dSqr));\n                    var t = (r0 - dr) / Math.sqrt(lSqr);\n                    coord = _vec3.lerp([], coord0, coord1, t);\n                }\n                var _this$unprojectPositi = this.unprojectPosition(coord), _this$unprojectPositi2 = (0, _slicedToArrayDefault.default)(_this$unprojectPositi, 3), X = _this$unprojectPositi2[0], Y = _this$unprojectPositi2[1], Z = _this$unprojectPositi2[2];\n                if (Number.isFinite(z)) return [\n                    X,\n                    Y,\n                    Z\n                ];\n                return Number.isFinite(targetZ) ? [\n                    X,\n                    Y,\n                    targetZ\n                ] : [\n                    X,\n                    Y\n                ];\n            }\n        },\n        {\n            key: \"projectPosition\",\n            value: function projectPosition(xyz) {\n                var _xyz2 = (0, _slicedToArrayDefault.default)(xyz, 3), lng = _xyz2[0], lat = _xyz2[1], _xyz2$ = _xyz2[2], Z = _xyz2$ === void 0 ? 0 : _xyz2$;\n                var lambda = lng * DEGREES_TO_RADIANS;\n                var phi = lat * DEGREES_TO_RADIANS;\n                var cosPhi = Math.cos(phi);\n                var D = (Z / EARTH_RADIUS + 1) * GLOBE_RADIUS;\n                return [\n                    Math.sin(lambda) * cosPhi * D,\n                    -Math.cos(lambda) * cosPhi * D,\n                    Math.sin(phi) * D\n                ];\n            }\n        },\n        {\n            key: \"unprojectPosition\",\n            value: function unprojectPosition(xyz) {\n                var _xyz3 = (0, _slicedToArrayDefault.default)(xyz, 3), x = _xyz3[0], y = _xyz3[1], z = _xyz3[2];\n                var D = _vec3.len(xyz);\n                var phi = Math.asin(z / D);\n                var lambda = Math.atan2(x, -y);\n                var lng = lambda * RADIANS_TO_DEGREES;\n                var lat = phi * RADIANS_TO_DEGREES;\n                var Z = (D / GLOBE_RADIUS - 1) * EARTH_RADIUS;\n                return [\n                    lng,\n                    lat,\n                    Z\n                ];\n            }\n        },\n        {\n            key: \"projectFlat\",\n            value: function projectFlat(xyz) {\n                return xyz;\n            }\n        },\n        {\n            key: \"unprojectFlat\",\n            value: function unprojectFlat(xyz) {\n                return xyz;\n            }\n        },\n        {\n            key: \"getMapCenterByLngLatPosition\",\n            value: function getMapCenterByLngLatPosition(_ref2) {\n                var lngLat = _ref2.lngLat, pos = _ref2.pos;\n                var fromPosition = this.unproject(pos);\n                return [\n                    lngLat[0] - fromPosition[0] + this.longitude,\n                    lngLat[1] - fromPosition[1] + this.latitude\n                ];\n            }\n        },\n        {\n            key: \"projectionMode\",\n            get: function get() {\n                return (0, _constants.PROJECTION_MODE).GLOBE;\n            }\n        }\n    ]);\n    return GlobeViewport1;\n}((0, _viewportDefault.default));\nfunction transformVector(matrix, vector) {\n    var result = _vec4.transformMat4([], vector, matrix);\n    _vec4.scale(result, result, 1 / result[3]);\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"math.gl\":\"huJnq\",\"./viewport\":\"iilpM\",\"../lib/constants\":\"inuJE\",\"gl-matrix/vec3\":\"4RBb8\",\"gl-matrix/vec4\":\"9M1lU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iAsKF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>FirstPersonView);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _mathGl = require(\"math.gl\");\nvar _firstPersonController = require(\"../controllers/first-person-controller\");\nvar _firstPersonControllerDefault = parcelHelpers.interopDefault(_firstPersonController);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nfunction getDirectionFromBearingAndPitch(_ref) {\n    var bearing = _ref.bearing, pitch = _ref.pitch;\n    var spherical = new (0, _mathGl._SphericalCoordinates)({\n        bearing: bearing,\n        pitch: pitch\n    });\n    var direction = spherical.toVector3().normalize();\n    return direction;\n}\nvar FirstPersonView = function(_View) {\n    (0, _inheritsDefault.default)(FirstPersonView1, _View);\n    var _super = _createSuper(FirstPersonView1);\n    function FirstPersonView1() {\n        (0, _classCallCheckDefault.default)(this, FirstPersonView1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(FirstPersonView1, [\n        {\n            key: \"_getViewport\",\n            value: function _getViewport(props) {\n                var _props$modelMatrix = props.modelMatrix, modelMatrix = _props$modelMatrix === void 0 ? null : _props$modelMatrix, _props$bearing = props.bearing, bearing = _props$bearing === void 0 ? 0 : _props$bearing, _props$pitch = props.pitch, pitch = _props$pitch === void 0 ? 0 : _props$pitch, _props$up = props.up, up = _props$up === void 0 ? [\n                    0,\n                    0,\n                    1\n                ] : _props$up;\n                var dir = getDirectionFromBearingAndPitch({\n                    bearing: bearing,\n                    pitch: 90 + pitch\n                });\n                var center = modelMatrix ? modelMatrix.transformDirection(dir) : dir;\n                var zoom = (0, _webMercator.getMeterZoom)(props);\n                var scale = Math.pow(2, zoom);\n                var viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n                    eye: [\n                        0,\n                        0,\n                        0\n                    ],\n                    center: center,\n                    up: up\n                }).scale(scale);\n                return new (0, _viewportDefault.default)(Object.assign({}, props, {\n                    zoom: zoom,\n                    viewMatrix: viewMatrix\n                }));\n            }\n        },\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _firstPersonControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return FirstPersonView1;\n}((0, _viewDefault.default));\nFirstPersonView.displayName = \"FirstPersonView\";\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./view\":\"1tMXO\",\"../viewports/viewport\":\"iilpM\",\"@math.gl/web-mercator\":\"agpg6\",\"math.gl\":\"huJnq\",\"../controllers/first-person-controller\":\"aUEGL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aUEGL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>FirstPersonController);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _viewState = require(\"./view-state\");\nvar _viewStateDefault = parcelHelpers.interopDefault(_viewState);\nvar _mathUtils = require(\"../utils/math-utils\");\nvar _mathGl = require(\"math.gl\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar MOVEMENT_SPEED = 20;\nvar DEFAULT_STATE = {\n    position: [\n        0,\n        0,\n        0\n    ],\n    pitch: 0,\n    bearing: 0,\n    maxPitch: 90,\n    minPitch: -90\n};\nvar FirstPersonState = function(_ViewState) {\n    (0, _inheritsDefault.default)(FirstPersonState1, _ViewState);\n    var _super = _createSuper(FirstPersonState1);\n    function FirstPersonState1(_ref) {\n        var _this;\n        var width = _ref.width, height = _ref.height, _ref$position = _ref.position, position = _ref$position === void 0 ? DEFAULT_STATE.position : _ref$position, _ref$bearing = _ref.bearing, bearing = _ref$bearing === void 0 ? DEFAULT_STATE.bearing : _ref$bearing, _ref$pitch = _ref.pitch, pitch = _ref$pitch === void 0 ? DEFAULT_STATE.pitch : _ref$pitch, longitude = _ref.longitude, latitude = _ref.latitude, _ref$maxPitch = _ref.maxPitch, maxPitch = _ref$maxPitch === void 0 ? DEFAULT_STATE.maxPitch : _ref$maxPitch, _ref$minPitch = _ref.minPitch, minPitch = _ref$minPitch === void 0 ? DEFAULT_STATE.minPitch : _ref$minPitch, startBearing = _ref.startBearing, startPitch = _ref.startPitch, startZoomPosition = _ref.startZoomPosition, startZoom = _ref.startZoom;\n        (0, _classCallCheckDefault.default)(this, FirstPersonState1);\n        _this = _super.call(this, {\n            width: width,\n            height: height,\n            position: position,\n            bearing: bearing,\n            pitch: pitch,\n            longitude: longitude,\n            latitude: latitude,\n            maxPitch: maxPitch,\n            minPitch: minPitch\n        });\n        _this._interactiveState = {\n            startBearing: startBearing,\n            startPitch: startPitch,\n            startZoomPosition: startZoomPosition,\n            startZoom: startZoom\n        };\n        return _this;\n    }\n    (0, _createClassDefault.default)(FirstPersonState1, [\n        {\n            key: \"getInteractiveState\",\n            value: function getInteractiveState() {\n                return this._interactiveState;\n            }\n        },\n        {\n            key: \"getDirection\",\n            value: function getDirection() {\n                var use2D = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n                var spherical = new (0, _mathGl._SphericalCoordinates)({\n                    bearing: this._viewportProps.bearing,\n                    pitch: use2D ? 90 : 90 + this._viewportProps.pitch\n                });\n                var direction = spherical.toVector3().normalize();\n                return direction;\n            }\n        },\n        {\n            key: \"panStart\",\n            value: function panStart() {\n                return this;\n            }\n        },\n        {\n            key: \"pan\",\n            value: function pan() {\n                return this;\n            }\n        },\n        {\n            key: \"panEnd\",\n            value: function panEnd() {\n                return this;\n            }\n        },\n        {\n            key: \"rotateStart\",\n            value: function rotateStart(_ref2) {\n                var pos = _ref2.pos;\n                return this._getUpdatedState({\n                    startBearing: this._viewportProps.bearing,\n                    startPitch: this._viewportProps.pitch\n                });\n            }\n        },\n        {\n            key: \"rotate\",\n            value: function rotate(_ref3) {\n                var deltaScaleX = _ref3.deltaScaleX, deltaScaleY = _ref3.deltaScaleY;\n                var _this$_interactiveSta = this._interactiveState, startBearing = _this$_interactiveSta.startBearing, startPitch = _this$_interactiveSta.startPitch;\n                if (!Number.isFinite(startBearing) || !Number.isFinite(startPitch)) return this;\n                return this._getUpdatedState({\n                    bearing: startBearing - deltaScaleX * 180,\n                    pitch: startPitch - deltaScaleY * 90\n                });\n            }\n        },\n        {\n            key: \"rotateEnd\",\n            value: function rotateEnd() {\n                return this._getUpdatedState({\n                    startBearing: null,\n                    startPitch: null\n                });\n            }\n        },\n        {\n            key: \"zoomStart\",\n            value: function zoomStart() {\n                return this._getUpdatedState({\n                    startZoomPosition: this._viewportProps.position,\n                    startZoom: this._viewportProps.zoom\n                });\n            }\n        },\n        {\n            key: \"zoom\",\n            value: function zoom(_ref4) {\n                var scale = _ref4.scale;\n                var startZoomPosition = this._interactiveState.startZoomPosition;\n                if (!startZoomPosition) startZoomPosition = this._viewportProps.position;\n                var direction = this.getDirection();\n                return this._move(direction, Math.log2(scale), startZoomPosition);\n            }\n        },\n        {\n            key: \"zoomEnd\",\n            value: function zoomEnd() {\n                return this._getUpdatedState({\n                    startZoomPosition: null,\n                    startZoom: null\n                });\n            }\n        },\n        {\n            key: \"moveLeft\",\n            value: function moveLeft() {\n                var direction = this.getDirection(true);\n                return this._move(direction.rotateZ({\n                    radians: Math.PI / 2\n                }));\n            }\n        },\n        {\n            key: \"moveRight\",\n            value: function moveRight() {\n                var direction = this.getDirection(true);\n                return this._move(direction.rotateZ({\n                    radians: -Math.PI / 2\n                }));\n            }\n        },\n        {\n            key: \"moveUp\",\n            value: function moveUp() {\n                var direction = this.getDirection(true);\n                return this._move(direction);\n            }\n        },\n        {\n            key: \"moveDown\",\n            value: function moveDown() {\n                var direction = this.getDirection(true);\n                return this._move(direction.negate());\n            }\n        },\n        {\n            key: \"rotateLeft\",\n            value: function rotateLeft() {\n                return this._getUpdatedState({\n                    bearing: this._viewportProps.bearing - 15\n                });\n            }\n        },\n        {\n            key: \"rotateRight\",\n            value: function rotateRight() {\n                return this._getUpdatedState({\n                    bearing: this._viewportProps.bearing + 15\n                });\n            }\n        },\n        {\n            key: \"rotateUp\",\n            value: function rotateUp() {\n                return this._getUpdatedState({\n                    pitch: this._viewportProps.pitch + 10\n                });\n            }\n        },\n        {\n            key: \"rotateDown\",\n            value: function rotateDown() {\n                return this._getUpdatedState({\n                    pitch: this._viewportProps.pitch - 10\n                });\n            }\n        },\n        {\n            key: \"zoomIn\",\n            value: function zoomIn() {\n                return this.zoom({\n                    scale: 2\n                });\n            }\n        },\n        {\n            key: \"zoomOut\",\n            value: function zoomOut() {\n                return this.zoom({\n                    scale: 0.5\n                });\n            }\n        },\n        {\n            key: \"shortestPathFrom\",\n            value: function shortestPathFrom(viewState) {\n                var fromProps = viewState.getViewportProps();\n                var props = Object.assign({}, this._viewportProps);\n                var bearing = props.bearing, longitude = props.longitude;\n                if (Math.abs(bearing - fromProps.bearing) > 180) props.bearing = bearing < 0 ? bearing + 360 : bearing - 360;\n                if (Math.abs(longitude - fromProps.longitude) > 180) props.longitude = longitude < 0 ? longitude + 360 : longitude - 360;\n                return props;\n            }\n        },\n        {\n            key: \"_move\",\n            value: function _move(direction) {\n                var speed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n                var fromPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._viewportProps.position;\n                var delta = direction.scale(speed * MOVEMENT_SPEED);\n                return this._getUpdatedState({\n                    position: new (0, _mathGl.Vector3)(fromPosition).add(delta)\n                });\n            }\n        },\n        {\n            key: \"_getUpdatedState\",\n            value: function _getUpdatedState(newProps) {\n                return new FirstPersonState1(Object.assign({}, this._viewportProps, this._interactiveState, newProps));\n            }\n        },\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                var pitch = props.pitch, maxPitch = props.maxPitch, minPitch = props.minPitch, longitude = props.longitude, bearing = props.bearing;\n                props.pitch = (0, _mathGl.clamp)(pitch, minPitch, maxPitch);\n                if (longitude < -180 || longitude > 180) props.longitude = (0, _mathUtils.mod)(longitude + 180, 360) - 180;\n                if (bearing < -180 || bearing > 180) props.bearing = (0, _mathUtils.mod)(bearing + 180, 360) - 180;\n                return props;\n            }\n        }\n    ]);\n    return FirstPersonState1;\n}((0, _viewStateDefault.default));\nvar FirstPersonController = function(_Controller) {\n    (0, _inheritsDefault.default)(FirstPersonController1, _Controller);\n    var _super2 = _createSuper(FirstPersonController1);\n    function FirstPersonController1(props) {\n        (0, _classCallCheckDefault.default)(this, FirstPersonController1);\n        return _super2.call(this, FirstPersonState, props);\n    }\n    return FirstPersonController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./controller\":\"cZLc0\",\"./view-state\":\"9BTJF\",\"../utils/math-utils\":\"jzrEb\",\"math.gl\":\"huJnq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5jCQ2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>OrbitView);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _mathGl = require(\"math.gl\");\nvar _orbitController = require(\"../controllers/orbit-controller\");\nvar _orbitControllerDefault = parcelHelpers.interopDefault(_orbitController);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nfunction getViewMatrix(_ref) {\n    var height = _ref.height, fovy = _ref.fovy, orbitAxis = _ref.orbitAxis, rotationX = _ref.rotationX, rotationOrbit = _ref.rotationOrbit, zoom = _ref.zoom;\n    var distance = 0.5 / Math.tan(fovy * DEGREES_TO_RADIANS / 2);\n    var up = orbitAxis === \"Z\" ? [\n        0,\n        0,\n        1\n    ] : [\n        0,\n        1,\n        0\n    ];\n    var eye = orbitAxis === \"Z\" ? [\n        0,\n        -distance,\n        0\n    ] : [\n        0,\n        0,\n        distance\n    ];\n    var viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n        eye: eye,\n        up: up\n    });\n    viewMatrix.rotateX(rotationX * DEGREES_TO_RADIANS);\n    if (orbitAxis === \"Z\") viewMatrix.rotateZ(rotationOrbit * DEGREES_TO_RADIANS);\n    else viewMatrix.rotateY(rotationOrbit * DEGREES_TO_RADIANS);\n    var projectionScale = Math.pow(2, zoom) / (height || 1);\n    viewMatrix.scale(projectionScale);\n    return viewMatrix;\n}\nvar OrbitViewport = function(_Viewport) {\n    (0, _inheritsDefault.default)(OrbitViewport1, _Viewport);\n    var _super = _createSuper(OrbitViewport1);\n    function OrbitViewport1(props) {\n        (0, _classCallCheckDefault.default)(this, OrbitViewport1);\n        var id = props.id, x = props.x, y = props.y, width = props.width, height = props.height, _props$fovy = props.fovy, fovy = _props$fovy === void 0 ? 50 : _props$fovy, near = props.near, far = props.far, _props$orbitAxis = props.orbitAxis, orbitAxis = _props$orbitAxis === void 0 ? \"Z\" : _props$orbitAxis, _props$target = props.target, target = _props$target === void 0 ? [\n            0,\n            0,\n            0\n        ] : _props$target, _props$rotationX = props.rotationX, rotationX = _props$rotationX === void 0 ? 0 : _props$rotationX, _props$rotationOrbit = props.rotationOrbit, rotationOrbit = _props$rotationOrbit === void 0 ? 0 : _props$rotationOrbit, _props$zoom = props.zoom, zoom = _props$zoom === void 0 ? 0 : _props$zoom;\n        return _super.call(this, {\n            id: id,\n            viewMatrix: getViewMatrix({\n                height: height,\n                fovy: fovy,\n                orbitAxis: orbitAxis,\n                rotationX: rotationX,\n                rotationOrbit: rotationOrbit,\n                zoom: zoom\n            }),\n            fovy: fovy,\n            near: near,\n            far: far,\n            x: x,\n            y: y,\n            position: target,\n            width: width,\n            height: height,\n            zoom: zoom\n        });\n    }\n    return OrbitViewport1;\n}((0, _viewportDefault.default));\nvar OrbitView = function(_View) {\n    (0, _inheritsDefault.default)(OrbitView1, _View);\n    var _super2 = _createSuper(OrbitView1);\n    function OrbitView1(props) {\n        (0, _classCallCheckDefault.default)(this, OrbitView1);\n        return _super2.call(this, Object.assign({}, props, {\n            type: OrbitViewport\n        }));\n    }\n    (0, _createClassDefault.default)(OrbitView1, [\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _orbitControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return OrbitView1;\n}((0, _viewDefault.default));\nOrbitView.displayName = \"OrbitView\";\n\n},{\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./view\":\"1tMXO\",\"../viewports/viewport\":\"iilpM\",\"math.gl\":\"huJnq\",\"../controllers/orbit-controller\":\"kyKz6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kyKz6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"OrbitState\", ()=>OrbitState);\nparcelHelpers.export(exports, \"default\", ()=>OrbitController);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _viewState = require(\"./view-state\");\nvar _viewStateDefault = parcelHelpers.interopDefault(_viewState);\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transitionManager = require(\"./transition-manager\");\nvar _mathUtils = require(\"../utils/math-utils\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar MOVEMENT_SPEED = 50;\nvar DEFAULT_STATE = {\n    orbitAxis: \"Z\",\n    rotationX: 0,\n    rotationOrbit: 0,\n    zoom: 0,\n    target: [\n        0,\n        0,\n        0\n    ],\n    minRotationX: -90,\n    maxRotationX: 90,\n    minZoom: -Infinity,\n    maxZoom: Infinity\n};\nvar LINEAR_TRANSITION_PROPS = {\n    transitionDuration: 300,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)([\n        \"target\",\n        \"zoom\",\n        \"rotationX\",\n        \"rotationOrbit\"\n    ]),\n    transitionInterruption: (0, _transitionManager.TRANSITION_EVENTS).BREAK\n};\nvar zoom2Scale = function zoom2Scale(zoom) {\n    return Math.pow(2, zoom);\n};\nvar OrbitState = function(_ViewState) {\n    (0, _inheritsDefault.default)(OrbitState1, _ViewState);\n    var _super = _createSuper(OrbitState1);\n    function OrbitState1(_ref) {\n        var _this;\n        var makeViewport = _ref.makeViewport, width = _ref.width, height = _ref.height, _ref$orbitAxis = _ref.orbitAxis, orbitAxis = _ref$orbitAxis === void 0 ? DEFAULT_STATE.orbitAxis : _ref$orbitAxis, _ref$rotationX = _ref.rotationX, rotationX = _ref$rotationX === void 0 ? DEFAULT_STATE.rotationX : _ref$rotationX, _ref$rotationOrbit = _ref.rotationOrbit, rotationOrbit = _ref$rotationOrbit === void 0 ? DEFAULT_STATE.rotationOrbit : _ref$rotationOrbit, _ref$target = _ref.target, target = _ref$target === void 0 ? DEFAULT_STATE.target : _ref$target, _ref$zoom = _ref.zoom, zoom = _ref$zoom === void 0 ? DEFAULT_STATE.zoom : _ref$zoom, _ref$minRotationX = _ref.minRotationX, minRotationX = _ref$minRotationX === void 0 ? DEFAULT_STATE.minRotationX : _ref$minRotationX, _ref$maxRotationX = _ref.maxRotationX, maxRotationX = _ref$maxRotationX === void 0 ? DEFAULT_STATE.maxRotationX : _ref$maxRotationX, _ref$minZoom = _ref.minZoom, minZoom = _ref$minZoom === void 0 ? DEFAULT_STATE.minZoom : _ref$minZoom, _ref$maxZoom = _ref.maxZoom, maxZoom = _ref$maxZoom === void 0 ? DEFAULT_STATE.maxZoom : _ref$maxZoom, startPanPosition = _ref.startPanPosition, startTarget = _ref.startTarget, startRotationX = _ref.startRotationX, startRotationOrbit = _ref.startRotationOrbit, startZoomPosition = _ref.startZoomPosition, startZoom = _ref.startZoom;\n        (0, _classCallCheckDefault.default)(this, OrbitState1);\n        _this = _super.call(this, {\n            width: width,\n            height: height,\n            orbitAxis: orbitAxis,\n            rotationX: rotationX,\n            rotationOrbit: rotationOrbit,\n            target: target,\n            zoom: zoom,\n            minRotationX: minRotationX,\n            maxRotationX: maxRotationX,\n            minZoom: minZoom,\n            maxZoom: maxZoom\n        });\n        _this._interactiveState = {\n            startPanPosition: startPanPosition,\n            startTarget: startTarget,\n            startRotationX: startRotationX,\n            startRotationOrbit: startRotationOrbit,\n            startZoomPosition: startZoomPosition,\n            startZoom: startZoom\n        };\n        _this.makeViewport = makeViewport;\n        return _this;\n    }\n    (0, _createClassDefault.default)(OrbitState1, [\n        {\n            key: \"getViewportProps\",\n            value: function getViewportProps() {\n                return this._viewportProps;\n            }\n        },\n        {\n            key: \"getInteractiveState\",\n            value: function getInteractiveState() {\n                return this._interactiveState;\n            }\n        },\n        {\n            key: \"panStart\",\n            value: function panStart(_ref2) {\n                var pos = _ref2.pos;\n                var target = this._viewportProps.target;\n                return this._getUpdatedState({\n                    startPanPosition: pos,\n                    startTarget: target\n                });\n            }\n        },\n        {\n            key: \"pan\",\n            value: function pan(_ref3) {\n                var pos = _ref3.pos, startPos = _ref3.startPos;\n                var _this$_interactiveSta = this._interactiveState, startPanPosition = _this$_interactiveSta.startPanPosition, startTarget = _this$_interactiveSta.startTarget;\n                var delta = new (0, _mathGl.Vector2)(pos).subtract(startPanPosition);\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        startTarget: startTarget,\n                        pixelOffset: delta\n                    })\n                });\n            }\n        },\n        {\n            key: \"panEnd\",\n            value: function panEnd() {\n                return this._getUpdatedState({\n                    startPanPosition: null,\n                    startTarget: null\n                });\n            }\n        },\n        {\n            key: \"rotateStart\",\n            value: function rotateStart(_ref4) {\n                var pos = _ref4.pos;\n                return this._getUpdatedState({\n                    startRotationX: this._viewportProps.rotationX,\n                    startRotationOrbit: this._viewportProps.rotationOrbit\n                });\n            }\n        },\n        {\n            key: \"rotate\",\n            value: function rotate(_ref5) {\n                var deltaScaleX = _ref5.deltaScaleX, deltaScaleY = _ref5.deltaScaleY;\n                var _this$_interactiveSta2 = this._interactiveState, startRotationX = _this$_interactiveSta2.startRotationX, startRotationOrbit = _this$_interactiveSta2.startRotationOrbit;\n                if (!Number.isFinite(startRotationX) || !Number.isFinite(startRotationOrbit)) return this;\n                if (startRotationX < -90 || startRotationX > 90) deltaScaleX *= -1;\n                return this._getUpdatedState({\n                    rotationX: startRotationX + deltaScaleY * 180,\n                    rotationOrbit: startRotationOrbit + deltaScaleX * 180,\n                    isRotating: true\n                });\n            }\n        },\n        {\n            key: \"rotateEnd\",\n            value: function rotateEnd() {\n                return this._getUpdatedState({\n                    startRotationX: null,\n                    startRotationOrbit: null\n                });\n            }\n        },\n        {\n            key: \"shortestPathFrom\",\n            value: function shortestPathFrom(viewState) {\n                var fromProps = viewState.getViewportProps();\n                var props = Object.assign({}, this._viewportProps);\n                var rotationOrbit = props.rotationOrbit;\n                if (Math.abs(rotationOrbit - fromProps.rotationOrbit) > 180) props.rotationOrbit = rotationOrbit < 0 ? rotationOrbit + 360 : rotationOrbit - 360;\n                return props;\n            }\n        },\n        {\n            key: \"zoomStart\",\n            value: function zoomStart(_ref6) {\n                var pos = _ref6.pos;\n                return this._getUpdatedState({\n                    startZoomPosition: pos,\n                    startTarget: this._viewportProps.target,\n                    startZoom: this._viewportProps.zoom\n                });\n            }\n        },\n        {\n            key: \"zoom\",\n            value: function zoom(_ref7) {\n                var pos = _ref7.pos, startPos = _ref7.startPos, scale = _ref7.scale;\n                var _this$_viewportProps = this._viewportProps, zoom = _this$_viewportProps.zoom, width = _this$_viewportProps.width, height = _this$_viewportProps.height, target = _this$_viewportProps.target;\n                var _this$_interactiveSta3 = this._interactiveState, startZoom = _this$_interactiveSta3.startZoom, startZoomPosition = _this$_interactiveSta3.startZoomPosition, startTarget = _this$_interactiveSta3.startTarget;\n                if (!Number.isFinite(startZoom)) {\n                    startZoom = zoom;\n                    startTarget = target;\n                    startZoomPosition = startPos || pos;\n                }\n                var newZoom = this._calculateNewZoom({\n                    scale: scale,\n                    startZoom: startZoom\n                });\n                var startScale = zoom2Scale(startZoom);\n                var newScale = zoom2Scale(newZoom);\n                var dX = (width / 2 - startZoomPosition[0]) * (newScale / startScale - 1);\n                var dY = (height / 2 - startZoomPosition[1]) * (newScale / startScale - 1);\n                return this._getUpdatedState({\n                    zoom: newZoom,\n                    target: this._calculateNewTarget({\n                        startTarget: startTarget,\n                        zoom: newZoom,\n                        pixelOffset: [\n                            dX,\n                            dY\n                        ]\n                    })\n                });\n            }\n        },\n        {\n            key: \"zoomEnd\",\n            value: function zoomEnd() {\n                return this._getUpdatedState({\n                    startZoomPosition: null,\n                    startTarget: null,\n                    startZoom: null\n                });\n            }\n        },\n        {\n            key: \"zoomIn\",\n            value: function zoomIn() {\n                return this._getUpdatedState({\n                    zoom: this._calculateNewZoom({\n                        scale: 2\n                    })\n                });\n            }\n        },\n        {\n            key: \"zoomOut\",\n            value: function zoomOut() {\n                return this._getUpdatedState({\n                    zoom: this._calculateNewZoom({\n                        scale: 0.5\n                    })\n                });\n            }\n        },\n        {\n            key: \"moveLeft\",\n            value: function moveLeft() {\n                var pixelOffset = [\n                    -MOVEMENT_SPEED,\n                    0\n                ];\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        pixelOffset: pixelOffset\n                    })\n                });\n            }\n        },\n        {\n            key: \"moveRight\",\n            value: function moveRight() {\n                var pixelOffset = [\n                    MOVEMENT_SPEED,\n                    0\n                ];\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        pixelOffset: pixelOffset\n                    })\n                });\n            }\n        },\n        {\n            key: \"moveUp\",\n            value: function moveUp() {\n                var pixelOffset = [\n                    0,\n                    -MOVEMENT_SPEED\n                ];\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        pixelOffset: pixelOffset\n                    })\n                });\n            }\n        },\n        {\n            key: \"moveDown\",\n            value: function moveDown() {\n                var pixelOffset = [\n                    0,\n                    MOVEMENT_SPEED\n                ];\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        pixelOffset: pixelOffset\n                    })\n                });\n            }\n        },\n        {\n            key: \"rotateLeft\",\n            value: function rotateLeft() {\n                return this._getUpdatedState({\n                    rotationOrbit: this._viewportProps.rotationOrbit - 15\n                });\n            }\n        },\n        {\n            key: \"rotateRight\",\n            value: function rotateRight() {\n                return this._getUpdatedState({\n                    rotationOrbit: this._viewportProps.rotationOrbit + 15\n                });\n            }\n        },\n        {\n            key: \"rotateUp\",\n            value: function rotateUp() {\n                return this._getUpdatedState({\n                    rotationX: this._viewportProps.rotationX - 10\n                });\n            }\n        },\n        {\n            key: \"rotateDown\",\n            value: function rotateDown() {\n                return this._getUpdatedState({\n                    rotationX: this._viewportProps.rotationX + 10\n                });\n            }\n        },\n        {\n            key: \"_calculateNewZoom\",\n            value: function _calculateNewZoom(_ref8) {\n                var scale = _ref8.scale, startZoom = _ref8.startZoom;\n                var _this$_viewportProps2 = this._viewportProps, maxZoom = _this$_viewportProps2.maxZoom, minZoom = _this$_viewportProps2.minZoom;\n                if (!Number.isFinite(startZoom)) startZoom = this._viewportProps.zoom;\n                var zoom = startZoom + Math.log2(scale);\n                return (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n            }\n        },\n        {\n            key: \"_calculateNewTarget\",\n            value: function _calculateNewTarget(_ref9) {\n                var startTarget = _ref9.startTarget, zoom = _ref9.zoom, pixelOffset = _ref9.pixelOffset;\n                var viewportProps = Object.assign({}, this._viewportProps);\n                if (Number.isFinite(zoom)) viewportProps.zoom = zoom;\n                if (startTarget) viewportProps.target = startTarget;\n                var viewport = this.makeViewport(viewportProps);\n                var center = viewport.project(viewportProps.target);\n                return viewport.unproject([\n                    center[0] - pixelOffset[0],\n                    center[1] - pixelOffset[1],\n                    center[2]\n                ]);\n            }\n        },\n        {\n            key: \"_getUpdatedState\",\n            value: function _getUpdatedState(newProps) {\n                return new OrbitState1(Object.assign({}, this._viewportProps, this._interactiveState, newProps));\n            }\n        },\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                var maxZoom = props.maxZoom, minZoom = props.minZoom, zoom = props.zoom, maxRotationX = props.maxRotationX, minRotationX = props.minRotationX, rotationOrbit = props.rotationOrbit;\n                props.zoom = (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n                props.rotationX = (0, _mathGl.clamp)(props.rotationX, minRotationX, maxRotationX);\n                if (rotationOrbit < -180 || rotationOrbit > 180) props.rotationOrbit = (0, _mathUtils.mod)(rotationOrbit + 180, 360) - 180;\n                return props;\n            }\n        }\n    ]);\n    return OrbitState1;\n}((0, _viewStateDefault.default));\nvar OrbitController = function(_Controller) {\n    (0, _inheritsDefault.default)(OrbitController1, _Controller);\n    var _super2 = _createSuper(OrbitController1);\n    function OrbitController1(props) {\n        (0, _classCallCheckDefault.default)(this, OrbitController1);\n        return _super2.call(this, OrbitState, props);\n    }\n    (0, _createClassDefault.default)(OrbitController1, [\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return LINEAR_TRANSITION_PROPS;\n            }\n        }\n    ]);\n    return OrbitController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"math.gl\":\"huJnq\",\"./controller\":\"cZLc0\",\"./view-state\":\"9BTJF\",\"../transitions/linear-interpolator\":\"k5Lgz\",\"./transition-manager\":\"BsfRu\",\"../utils/math-utils\":\"jzrEb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1GaYo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>OrthographicView);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _mathGl = require(\"math.gl\");\nvar _orthographicController = require(\"../controllers/orthographic-controller\");\nvar _orthographicControllerDefault = parcelHelpers.interopDefault(_orthographicController);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n    eye: [\n        0,\n        0,\n        1\n    ]\n});\nfunction getProjectionMatrix(_ref) {\n    var width = _ref.width, height = _ref.height, near = _ref.near, far = _ref.far;\n    width = width || 1;\n    height = height || 1;\n    return new (0, _mathGl.Matrix4)().ortho({\n        left: -width / 2,\n        right: width / 2,\n        bottom: height / 2,\n        top: -height / 2,\n        near: near,\n        far: far\n    });\n}\nvar OrthographicViewport = function(_Viewport) {\n    (0, _inheritsDefault.default)(OrthographicViewport1, _Viewport);\n    var _super = _createSuper(OrthographicViewport1);\n    function OrthographicViewport1(_ref2) {\n        var _this;\n        var id = _ref2.id, x = _ref2.x, y = _ref2.y, width = _ref2.width, height = _ref2.height, _ref2$near = _ref2.near, near = _ref2$near === void 0 ? 0.1 : _ref2$near, _ref2$far = _ref2.far, far = _ref2$far === void 0 ? 1000 : _ref2$far, _ref2$zoom = _ref2.zoom, zoom = _ref2$zoom === void 0 ? 0 : _ref2$zoom, _ref2$target = _ref2.target, target = _ref2$target === void 0 ? [\n            0,\n            0,\n            0\n        ] : _ref2$target;\n        (0, _classCallCheckDefault.default)(this, OrthographicViewport1);\n        var scale = Math.pow(2, zoom);\n        return (0, _possibleConstructorReturnDefault.default)(_this, new (0, _viewportDefault.default)({\n            id: id,\n            x: x,\n            y: y,\n            width: width,\n            height: height,\n            position: target,\n            viewMatrix: viewMatrix.clone().scale(scale),\n            projectionMatrix: getProjectionMatrix({\n                width: width,\n                height: height,\n                near: near,\n                far: far\n            }),\n            zoom: zoom\n        }));\n    }\n    return OrthographicViewport1;\n}((0, _viewportDefault.default));\nvar OrthographicView = function(_View) {\n    (0, _inheritsDefault.default)(OrthographicView1, _View);\n    var _super2 = _createSuper(OrthographicView1);\n    function OrthographicView1(props) {\n        (0, _classCallCheckDefault.default)(this, OrthographicView1);\n        return _super2.call(this, Object.assign({}, props, {\n            type: OrthographicViewport\n        }));\n    }\n    (0, _createClassDefault.default)(OrthographicView1, [\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _orthographicControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return OrthographicView1;\n}((0, _viewDefault.default));\nOrthographicView.displayName = \"OrthographicView\";\n\n},{\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./view\":\"1tMXO\",\"../viewports/viewport\":\"iilpM\",\"math.gl\":\"huJnq\",\"../controllers/orthographic-controller\":\"3LAMU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3LAMU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>OrthographicController);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _orbitController = require(\"./orbit-controller\");\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transitionManager = require(\"./transition-manager\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LINEAR_TRANSITION_PROPS = {\n    transitionDuration: 300,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)([\n        \"target\",\n        \"zoom\"\n    ]),\n    transitionInterruption: (0, _transitionManager.TRANSITION_EVENTS).BREAK\n};\nvar OrthographicController = function(_Controller) {\n    (0, _inheritsDefault.default)(OrthographicController1, _Controller);\n    var _super = _createSuper(OrthographicController1);\n    function OrthographicController1(props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, OrthographicController1);\n        _this = _super.call(this, (0, _orbitController.OrbitState), props);\n        _this.invertPan = true;\n        return _this;\n    }\n    (0, _createClassDefault.default)(OrthographicController1, [\n        {\n            key: \"_onPanRotate\",\n            value: function _onPanRotate(event) {\n                return false;\n            }\n        },\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return LINEAR_TRANSITION_PROPS;\n            }\n        }\n    ]);\n    return OrthographicController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./controller\":\"cZLc0\",\"./orbit-controller\":\"kyKz6\",\"../transitions/linear-interpolator\":\"k5Lgz\",\"./transition-manager\":\"BsfRu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eSFl0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GlobeView);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _globeViewport = require(\"../viewports/globe-viewport\");\nvar _globeViewportDefault = parcelHelpers.interopDefault(_globeViewport);\nvar _globeController = require(\"../controllers/globe-controller\");\nvar _globeControllerDefault = parcelHelpers.interopDefault(_globeController);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar GlobeView = function(_View) {\n    (0, _inheritsDefault.default)(GlobeView1, _View);\n    var _super = _createSuper(GlobeView1);\n    function GlobeView1(props) {\n        (0, _classCallCheckDefault.default)(this, GlobeView1);\n        return _super.call(this, _objectSpread(_objectSpread({}, props), {}, {\n            type: (0, _globeViewportDefault.default)\n        }));\n    }\n    (0, _createClassDefault.default)(GlobeView1, [\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _globeControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return GlobeView1;\n}((0, _viewDefault.default));\nGlobeView.displayName = \"GlobeView\";\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./view\":\"1tMXO\",\"../viewports/globe-viewport\":\"5rgbh\",\"../controllers/globe-controller\":\"04Ljo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"04Ljo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GlobeController);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _mapController = require(\"./map-controller\");\nvar _mathUtils = require(\"../utils/math-utils\");\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transitionManager = require(\"./transition-manager\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LINEAR_TRANSITION_PROPS = {\n    transitionDuration: 300,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)([\n        \"longitude\",\n        \"latitude\",\n        \"zoom\"\n    ]),\n    transitionInterruption: (0, _transitionManager.TRANSITION_EVENTS).BREAK\n};\nvar GlobeState = function(_MapState) {\n    (0, _inheritsDefault.default)(GlobeState1, _MapState);\n    var _super = _createSuper(GlobeState1);\n    function GlobeState1() {\n        (0, _classCallCheckDefault.default)(this, GlobeState1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(GlobeState1, [\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                var maxZoom = props.maxZoom, minZoom = props.minZoom, zoom = props.zoom;\n                props.zoom = (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n                var longitude = props.longitude, latitude = props.latitude;\n                if (longitude < -180 || longitude > 180) props.longitude = (0, _mathUtils.mod)(longitude + 180, 360) - 180;\n                props.latitude = (0, _mathGl.clamp)(latitude, -89, 89);\n                return props;\n            }\n        }\n    ]);\n    return GlobeState1;\n}((0, _mapController.MapState));\nvar GlobeController = function(_Controller) {\n    (0, _inheritsDefault.default)(GlobeController1, _Controller);\n    var _super2 = _createSuper(GlobeController1);\n    function GlobeController1(props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, GlobeController1);\n        _this = _super2.call(this, GlobeState, props);\n        _this.invertPan = true;\n        return _this;\n    }\n    (0, _createClassDefault.default)(GlobeController1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(GlobeController1.prototype), \"setProps\", this).call(this, props);\n                this.dragRotate = false;\n                this.touchRotate = false;\n            }\n        },\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return LINEAR_TRANSITION_PROPS;\n            }\n        }\n    ]);\n    return GlobeController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"math.gl\":\"huJnq\",\"./controller\":\"cZLc0\",\"./map-controller\":\"fZPqN\",\"../utils/math-utils\":\"jzrEb\",\"../transitions/linear-interpolator\":\"k5Lgz\",\"./transition-manager\":\"BsfRu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g192R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>FlyToInterpolator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _transitionInterpolator = require(\"./transition-interpolator\");\nvar _transitionInterpolatorDefault = parcelHelpers.interopDefault(_transitionInterpolator);\nvar _mathGl = require(\"math.gl\");\nvar _webMercator = require(\"@math.gl/web-mercator\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LINEARLY_INTERPOLATED_PROPS = [\n    \"bearing\",\n    \"pitch\"\n];\nvar DEFAULT_OPTS = {\n    speed: 1.2,\n    curve: 1.414\n};\nvar FlyToInterpolator = function(_TransitionInterpolat) {\n    (0, _inheritsDefault.default)(FlyToInterpolator1, _TransitionInterpolat);\n    var _super = _createSuper(FlyToInterpolator1);\n    function FlyToInterpolator1() {\n        var _this;\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, FlyToInterpolator1);\n        _this = _super.call(this, {\n            compare: [\n                \"longitude\",\n                \"latitude\",\n                \"zoom\",\n                \"bearing\",\n                \"pitch\"\n            ],\n            extract: [\n                \"width\",\n                \"height\",\n                \"longitude\",\n                \"latitude\",\n                \"zoom\",\n                \"bearing\",\n                \"pitch\"\n            ],\n            required: [\n                \"width\",\n                \"height\",\n                \"latitude\",\n                \"longitude\",\n                \"zoom\"\n            ]\n        });\n        _this.props = Object.assign({}, DEFAULT_OPTS, props);\n        return _this;\n    }\n    (0, _createClassDefault.default)(FlyToInterpolator1, [\n        {\n            key: \"interpolateProps\",\n            value: function interpolateProps(startProps, endProps, t) {\n                var viewport = (0, _webMercator.flyToViewport)(startProps, endProps, t, this.props);\n                var _iterator = _createForOfIteratorHelper(LINEARLY_INTERPOLATED_PROPS), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var key = _step.value;\n                        viewport[key] = (0, _mathGl.lerp)(startProps[key] || 0, endProps[key] || 0, t);\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return viewport;\n            }\n        },\n        {\n            key: \"getDuration\",\n            value: function getDuration(startProps, endProps) {\n                var transitionDuration = endProps.transitionDuration;\n                if (transitionDuration === \"auto\") transitionDuration = (0, _webMercator.getFlyToDuration)(startProps, endProps, this.props);\n                return transitionDuration;\n            }\n        }\n    ]);\n    return FlyToInterpolator1;\n}((0, _transitionInterpolatorDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./transition-interpolator\":\"fvWgT\",\"math.gl\":\"huJnq\",\"@math.gl/web-mercator\":\"agpg6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aLgkL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Tesselator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _iterableUtils = require(\"./iterable-utils\");\nvar _typedArrayManager = require(\"./typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _core = require(\"@luma.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar Tesselator = function() {\n    function Tesselator1() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, Tesselator1);\n        var _opts$attributes = opts.attributes, attributes = _opts$attributes === void 0 ? {} : _opts$attributes;\n        this.typedArrayManager = (0, _typedArrayManagerDefault.default);\n        this.indexStarts = null;\n        this.vertexStarts = null;\n        this.vertexCount = 0;\n        this.instanceCount = 0;\n        this.attributes = {};\n        this._attributeDefs = attributes;\n        this.opts = opts;\n        this.updateGeometry(opts);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(Tesselator1, [\n        {\n            key: \"updateGeometry\",\n            value: function updateGeometry(opts) {\n                Object.assign(this.opts, opts);\n                var _this$opts = this.opts, data = _this$opts.data, _this$opts$buffers = _this$opts.buffers, buffers = _this$opts$buffers === void 0 ? {} : _this$opts$buffers, getGeometry = _this$opts.getGeometry, geometryBuffer = _this$opts.geometryBuffer, positionFormat = _this$opts.positionFormat, dataChanged = _this$opts.dataChanged, _this$opts$normalize = _this$opts.normalize, normalize = _this$opts$normalize === void 0 ? true : _this$opts$normalize;\n                this.data = data;\n                this.getGeometry = getGeometry;\n                this.positionSize = geometryBuffer && geometryBuffer.size || (positionFormat === \"XY\" ? 2 : 3);\n                this.buffers = buffers;\n                this.normalize = normalize;\n                if (geometryBuffer) {\n                    (0, _assertDefault.default)(data.startIndices, \"binary data missing startIndices\");\n                    this.getGeometry = this.getGeometryFromBuffer(geometryBuffer);\n                    if (!normalize) buffers.positions = geometryBuffer;\n                }\n                this.geometryBuffer = buffers.positions;\n                if (Array.isArray(dataChanged)) {\n                    var _iterator = _createForOfIteratorHelper(dataChanged), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var dataRange = _step.value;\n                            this._rebuildGeometry(dataRange);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                } else this._rebuildGeometry();\n            }\n        },\n        {\n            key: \"updatePartialGeometry\",\n            value: function updatePartialGeometry(_ref) {\n                var startRow = _ref.startRow, endRow = _ref.endRow;\n                this._rebuildGeometry({\n                    startRow: startRow,\n                    endRow: endRow\n                });\n            }\n        },\n        {\n            key: \"normalizeGeometry\",\n            value: function normalizeGeometry(geometry) {\n                return geometry;\n            }\n        },\n        {\n            key: \"updateGeometryAttributes\",\n            value: function updateGeometryAttributes(geometry, startIndex, size) {\n                throw new Error(\"Not implemented\");\n            }\n        },\n        {\n            key: \"getGeometrySize\",\n            value: function getGeometrySize(geometry) {\n                throw new Error(\"Not implemented\");\n            }\n        },\n        {\n            key: \"getGeometryFromBuffer\",\n            value: function getGeometryFromBuffer(geometryBuffer) {\n                var value = geometryBuffer.value || geometryBuffer;\n                (0, _assertDefault.default)(ArrayBuffer.isView(value), \"cannot read geometries\");\n                return (0, _iterableUtils.getAccessorFromBuffer)(value, {\n                    size: this.positionSize,\n                    offset: geometryBuffer.offset,\n                    stride: geometryBuffer.stride,\n                    startIndices: this.data.startIndices\n                });\n            }\n        },\n        {\n            key: \"_allocate\",\n            value: function _allocate(instanceCount, copy) {\n                var attributes = this.attributes, buffers = this.buffers, _attributeDefs = this._attributeDefs, typedArrayManager = this.typedArrayManager;\n                for(var name in _attributeDefs)if (name in buffers) {\n                    typedArrayManager.release(attributes[name]);\n                    attributes[name] = null;\n                } else {\n                    var def = _attributeDefs[name];\n                    def.copy = copy;\n                    attributes[name] = typedArrayManager.allocate(attributes[name], instanceCount, def);\n                }\n            }\n        },\n        {\n            key: \"_forEachGeometry\",\n            value: function _forEachGeometry(visitor, startRow, endRow) {\n                var data = this.data, getGeometry = this.getGeometry;\n                var _createIterable = (0, _iterableUtils.createIterable)(data, startRow, endRow), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n                var _iterator2 = _createForOfIteratorHelper(iterable), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var object = _step2.value;\n                        objectInfo.index++;\n                        var geometry = getGeometry(object, objectInfo);\n                        visitor(geometry, objectInfo.index);\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n            }\n        },\n        {\n            key: \"_rebuildGeometry\",\n            value: function _rebuildGeometry(dataRange) {\n                var _this = this;\n                if (!this.data || !this.getGeometry) return;\n                var indexStarts = this.indexStarts, vertexStarts = this.vertexStarts, instanceCount = this.instanceCount;\n                var data = this.data, geometryBuffer = this.geometryBuffer;\n                var _ref2 = dataRange || {}, _ref2$startRow = _ref2.startRow, startRow = _ref2$startRow === void 0 ? 0 : _ref2$startRow, _ref2$endRow = _ref2.endRow, endRow = _ref2$endRow === void 0 ? Infinity : _ref2$endRow;\n                var normalizedData = {};\n                if (!dataRange) {\n                    indexStarts = [\n                        0\n                    ];\n                    vertexStarts = [\n                        0\n                    ];\n                }\n                if (this.normalize || !geometryBuffer) {\n                    this._forEachGeometry(function(geometry, dataIndex) {\n                        geometry = _this.normalizeGeometry(geometry);\n                        normalizedData[dataIndex] = geometry;\n                        vertexStarts[dataIndex + 1] = vertexStarts[dataIndex] + _this.getGeometrySize(geometry);\n                    }, startRow, endRow);\n                    instanceCount = vertexStarts[vertexStarts.length - 1];\n                } else if (geometryBuffer.buffer instanceof (0, _core.Buffer)) {\n                    var byteStride = geometryBuffer.stride || this.positionSize * 4;\n                    vertexStarts = data.startIndices;\n                    instanceCount = vertexStarts[data.length] || geometryBuffer.buffer.byteLength / byteStride;\n                } else {\n                    var bufferValue = geometryBuffer.value || geometryBuffer;\n                    var elementStride = geometryBuffer.stride / bufferValue.BYTES_PER_ELEMENT || this.positionSize;\n                    vertexStarts = data.startIndices;\n                    instanceCount = vertexStarts[data.length] || bufferValue.length / elementStride;\n                }\n                this._allocate(instanceCount, Boolean(dataRange));\n                this.indexStarts = indexStarts;\n                this.vertexStarts = vertexStarts;\n                this.instanceCount = instanceCount;\n                var context = {};\n                this._forEachGeometry(function(geometry, dataIndex) {\n                    geometry = normalizedData[dataIndex] || geometry;\n                    context.vertexStart = vertexStarts[dataIndex];\n                    context.indexStart = indexStarts[dataIndex];\n                    var vertexEnd = dataIndex < vertexStarts.length - 1 ? vertexStarts[dataIndex + 1] : instanceCount;\n                    context.geometrySize = vertexEnd - vertexStarts[dataIndex];\n                    context.geometryIndex = dataIndex;\n                    _this.updateGeometryAttributes(geometry, context);\n                }, startRow, endRow);\n                this.vertexCount = indexStarts[indexStarts.length - 1];\n            }\n        }\n    ]);\n    return Tesselator1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"./iterable-utils\":\"kj5eS\",\"./typed-array-manager\":\"4DbDw\",\"./assert\":\"1unZV\",\"@luma.gl/core\":\"WBJLR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jT2PV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ArcLayer\", ()=>(0, _arcLayerDefault.default));\nparcelHelpers.export(exports, \"BitmapLayer\", ()=>(0, _bitmapLayerDefault.default));\nparcelHelpers.export(exports, \"IconLayer\", ()=>(0, _iconLayerDefault.default));\nparcelHelpers.export(exports, \"LineLayer\", ()=>(0, _lineLayerDefault.default));\nparcelHelpers.export(exports, \"PointCloudLayer\", ()=>(0, _pointCloudLayerDefault.default));\nparcelHelpers.export(exports, \"ScatterplotLayer\", ()=>(0, _scatterplotLayerDefault.default));\nparcelHelpers.export(exports, \"ColumnLayer\", ()=>(0, _columnLayerDefault.default));\nparcelHelpers.export(exports, \"GridCellLayer\", ()=>(0, _gridCellLayerDefault.default));\nparcelHelpers.export(exports, \"PathLayer\", ()=>(0, _pathLayerDefault.default));\nparcelHelpers.export(exports, \"PolygonLayer\", ()=>(0, _polygonLayerDefault.default));\nparcelHelpers.export(exports, \"GeoJsonLayer\", ()=>(0, _geojsonLayerDefault.default));\nparcelHelpers.export(exports, \"TextLayer\", ()=>(0, _textLayerDefault.default));\nparcelHelpers.export(exports, \"SolidPolygonLayer\", ()=>(0, _solidPolygonLayerDefault.default));\nparcelHelpers.export(exports, \"_MultiIconLayer\", ()=>(0, _multiIconLayerDefault.default));\nvar _arcLayer = require(\"./arc-layer/arc-layer\");\nvar _arcLayerDefault = parcelHelpers.interopDefault(_arcLayer);\nvar _bitmapLayer = require(\"./bitmap-layer/bitmap-layer\");\nvar _bitmapLayerDefault = parcelHelpers.interopDefault(_bitmapLayer);\nvar _iconLayer = require(\"./icon-layer/icon-layer\");\nvar _iconLayerDefault = parcelHelpers.interopDefault(_iconLayer);\nvar _lineLayer = require(\"./line-layer/line-layer\");\nvar _lineLayerDefault = parcelHelpers.interopDefault(_lineLayer);\nvar _pointCloudLayer = require(\"./point-cloud-layer/point-cloud-layer\");\nvar _pointCloudLayerDefault = parcelHelpers.interopDefault(_pointCloudLayer);\nvar _scatterplotLayer = require(\"./scatterplot-layer/scatterplot-layer\");\nvar _scatterplotLayerDefault = parcelHelpers.interopDefault(_scatterplotLayer);\nvar _columnLayer = require(\"./column-layer/column-layer\");\nvar _columnLayerDefault = parcelHelpers.interopDefault(_columnLayer);\nvar _gridCellLayer = require(\"./column-layer/grid-cell-layer\");\nvar _gridCellLayerDefault = parcelHelpers.interopDefault(_gridCellLayer);\nvar _pathLayer = require(\"./path-layer/path-layer\");\nvar _pathLayerDefault = parcelHelpers.interopDefault(_pathLayer);\nvar _polygonLayer = require(\"./polygon-layer/polygon-layer\");\nvar _polygonLayerDefault = parcelHelpers.interopDefault(_polygonLayer);\nvar _geojsonLayer = require(\"./geojson-layer/geojson-layer\");\nvar _geojsonLayerDefault = parcelHelpers.interopDefault(_geojsonLayer);\nvar _textLayer = require(\"./text-layer/text-layer\");\nvar _textLayerDefault = parcelHelpers.interopDefault(_textLayer);\nvar _solidPolygonLayer = require(\"./solid-polygon-layer/solid-polygon-layer\");\nvar _solidPolygonLayerDefault = parcelHelpers.interopDefault(_solidPolygonLayer);\nvar _multiIconLayer = require(\"./text-layer/multi-icon-layer/multi-icon-layer\");\nvar _multiIconLayerDefault = parcelHelpers.interopDefault(_multiIconLayer);\n\n},{\"./arc-layer/arc-layer\":\"jsjZ0\",\"./bitmap-layer/bitmap-layer\":\"8YZXo\",\"./icon-layer/icon-layer\":\"kGab5\",\"./line-layer/line-layer\":\"8HAxs\",\"./point-cloud-layer/point-cloud-layer\":\"7YH60\",\"./scatterplot-layer/scatterplot-layer\":\"dbN34\",\"./column-layer/column-layer\":\"jCoF8\",\"./column-layer/grid-cell-layer\":\"1h7Kk\",\"./path-layer/path-layer\":\"fUUc7\",\"./polygon-layer/polygon-layer\":\"gO9MA\",\"./geojson-layer/geojson-layer\":\"apOUz\",\"./text-layer/text-layer\":\"k0z96\",\"./solid-polygon-layer/solid-polygon-layer\":\"51B0l\",\"./text-layer/multi-icon-layer/multi-icon-layer\":\"j9vBi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jsjZ0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ArcLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _arcLayerVertexGlsl = require(\"./arc-layer-vertex.glsl\");\nvar _arcLayerVertexGlslDefault = parcelHelpers.interopDefault(_arcLayerVertexGlsl);\nvar _arcLayerFragmentGlsl = require(\"./arc-layer-fragment.glsl\");\nvar _arcLayerFragmentGlslDefault = parcelHelpers.interopDefault(_arcLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    getSourcePosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.sourcePosition;\n        }\n    },\n    getTargetPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.targetPosition;\n        }\n    },\n    getSourceColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getTargetColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    getHeight: {\n        type: \"accessor\",\n        value: 1\n    },\n    getTilt: {\n        type: \"accessor\",\n        value: 0\n    },\n    greatCircle: false,\n    widthUnits: \"pixels\",\n    widthScale: {\n        type: \"number\",\n        value: 1,\n        min: 0\n    },\n    widthMinPixels: {\n        type: \"number\",\n        value: 0,\n        min: 0\n    },\n    widthMaxPixels: {\n        type: \"number\",\n        value: Number.MAX_SAFE_INTEGER,\n        min: 0\n    }\n};\nvar ArcLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(ArcLayer1, _Layer);\n    var _super = _createSuper(ArcLayer1);\n    function ArcLayer1() {\n        (0, _classCallCheckDefault.default)(this, ArcLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(ArcLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ArcLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _arcLayerVertexGlslDefault.default),\n                    fs: (0, _arcLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instanceSourcePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getSourcePosition\"\n                    },\n                    instanceTargetPositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getTargetPosition\"\n                    },\n                    instanceSourceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getSourceColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceTargetColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getTargetColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceWidths: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getWidth\",\n                        defaultValue: 1\n                    },\n                    instanceHeights: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getHeight\",\n                        defaultValue: 1\n                    },\n                    instanceTilts: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getTilt\",\n                        defaultValue: 0\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ArcLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, widthUnits = _this$props.widthUnits, widthScale = _this$props.widthScale, widthMinPixels = _this$props.widthMinPixels, widthMaxPixels = _this$props.widthMaxPixels, greatCircle = _this$props.greatCircle;\n                var widthMultiplier = widthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(uniforms).setUniforms({\n                    greatCircle: greatCircle,\n                    widthScale: widthScale * widthMultiplier,\n                    widthMinPixels: widthMinPixels,\n                    widthMaxPixels: widthMaxPixels\n                }).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [];\n                var NUM_SEGMENTS = 50;\n                for(var i = 0; i < NUM_SEGMENTS; i++)positions = positions.concat([\n                    i,\n                    1,\n                    0,\n                    i,\n                    -1,\n                    0\n                ]);\n                var model = new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 5,\n                        attributes: {\n                            positions: new Float32Array(positions)\n                        }\n                    }),\n                    isInstanced: true\n                }));\n                model.setUniforms({\n                    numSegments: NUM_SEGMENTS\n                });\n                return model;\n            }\n        }\n    ]);\n    return ArcLayer1;\n}((0, _core.Layer));\nArcLayer.layerName = \"ArcLayer\";\nArcLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./arc-layer-vertex.glsl\":\"aQEbF\",\"./arc-layer-fragment.glsl\":\"62EBw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aQEbF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME arc-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec4 instanceSourceColors;\\nattribute vec4 instanceTargetColors;\\nattribute vec3 instanceSourcePositions;\\nattribute vec3 instanceSourcePositions64Low;\\nattribute vec3 instanceTargetPositions;\\nattribute vec3 instanceTargetPositions64Low;\\nattribute vec3 instancePickingColors;\\nattribute float instanceWidths;\\nattribute float instanceHeights;\\nattribute float instanceTilts;\\n\\nuniform bool greatCircle;\\nuniform float numSegments;\\nuniform float opacity;\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\n\\nvarying vec4 vColor;\\nvarying vec2 uv;\\nvarying float isValid;\\n\\nfloat paraboloid(float distance, float sourceZ, float targetZ, float ratio) {\\n\\n  float deltaZ = targetZ - sourceZ;\\n  float dh = distance * instanceHeights;\\n  float unitZ = dh == 0.0 ? 0.0 : deltaZ / dh;\\n  float p2 = unitZ * unitZ + 1.0;\\n  float dir = step(deltaZ, 0.0);\\n  float z0 = mix(sourceZ, targetZ, dir);\\n  float r = mix(ratio, 1.0 - ratio, dir);\\n  return sqrt(r * (p2 - r)) * dh + z0;\\n}\\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction, float width) {\\n  vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\\n  dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\\n\\n  return dir_screenspace * offset_direction * width / 2.0;\\n}\\n\\nfloat getSegmentRatio(float index) {\\n  return smoothstep(0.0, 1.0, index / (numSegments - 1.0));\\n}\\n\\nvec3 interpolateFlat(vec3 source, vec3 target, float segmentRatio) {\\n  float distance = length(source.xy - target.xy);\\n  float z = paraboloid(distance, source.z, target.z, segmentRatio);\\n\\n  float tiltAngle = radians(instanceTilts);\\n  vec2 tiltDirection = normalize(target.xy - source.xy);\\n  vec2 tilt = vec2(-tiltDirection.y, tiltDirection.x) * z * sin(tiltAngle);\\n\\n  return vec3(\\n    mix(source.xy, target.xy, segmentRatio) + tilt,\\n    z * cos(tiltAngle)\\n  );\\n}\\nfloat getAngularDist (vec2 source, vec2 target) {\\n  vec2 sourceRadians = radians(source);\\n  vec2 targetRadians = radians(target);\\n  vec2 sin_half_delta = sin((sourceRadians - targetRadians) / 2.0);\\n  vec2 shd_sq = sin_half_delta * sin_half_delta;\\n\\n  float a = shd_sq.y + cos(sourceRadians.y) * cos(targetRadians.y) * shd_sq.x;\\n  return 2.0 * asin(sqrt(a));\\n}\\n\\nvec3 interpolateGreatCircle(vec3 source, vec3 target, vec3 source3D, vec3 target3D, float angularDist, float t) {\\n  vec2 lngLat;\\n  if(abs(angularDist - PI) < 0.001) {\\n    lngLat = (1.0 - t) * source.xy + t * target.xy;\\n  } else {\\n    float a = sin((1.0 - t) * angularDist);\\n    float b = sin(t * angularDist);\\n    vec3 p = source3D.yxz * a + target3D.yxz * b;\\n    lngLat = degrees(vec2(atan(p.y, -p.x), atan(p.z, length(p.xy))));\\n  }\\n\\n  float z = paraboloid(angularDist * EARTH_RADIUS, source.z, target.z, t);\\n\\n  return vec3(lngLat, z);\\n}\\n\\nvoid main(void) {\\n  geometry.worldPosition = instanceSourcePositions;\\n  geometry.worldPositionAlt = instanceTargetPositions;\\n\\n  float segmentIndex = positions.x;\\n  float segmentRatio = getSegmentRatio(segmentIndex);\\n  float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0));\\n  isValid = 1.0;\\n\\n  uv = vec2(segmentRatio, positions.y);\\n  geometry.uv = uv;\\n  geometry.pickingColor = instancePickingColors;\\n\\n  vec4 curr;\\n  vec4 next;\\n  vec3 source;\\n  vec3 target;\\n\\n  if ((greatCircle || project_uProjectionMode == PROJECTION_MODE_GLOBE) && project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT) {\\n    source = project_globe_(vec3(instanceSourcePositions.xy, 0.0));\\n    target = project_globe_(vec3(instanceTargetPositions.xy, 0.0));\\n    float angularDist = getAngularDist(instanceSourcePositions.xy, instanceTargetPositions.xy);\\n  \\n    float prevSegmentRatio = getSegmentRatio(max(0.0, segmentIndex - 1.0));\\n    float nextSegmentRatio = getSegmentRatio(min(numSegments, segmentIndex + 1.0));\\n\\n    vec3 prevPos = interpolateGreatCircle(instanceSourcePositions, instanceTargetPositions, source, target, angularDist, prevSegmentRatio);\\n    vec3 currPos = interpolateGreatCircle(instanceSourcePositions, instanceTargetPositions, source, target, angularDist, segmentRatio);\\n    vec3 nextPos = interpolateGreatCircle(instanceSourcePositions, instanceTargetPositions, source, target, angularDist, nextSegmentRatio);\\n\\n    if (abs(currPos.x - prevPos.x) > 180.0) {\\n      indexDir = -1.0;\\n      isValid = 0.0;\\n    } else if (abs(currPos.x - nextPos.x) > 180.0) {\\n      indexDir = 1.0;\\n      isValid = 0.0;\\n    }\\n    nextPos = indexDir < 0.0 ? prevPos : nextPos;\\n    nextSegmentRatio = indexDir < 0.0 ? prevSegmentRatio : nextSegmentRatio;\\n\\n    if (isValid == 0.0) {\\n      nextPos.x += nextPos.x > 0.0 ? -360.0 : 360.0;\\n      float t = ((currPos.x > 0.0 ? 180.0 : -180.0) - currPos.x) / (nextPos.x - currPos.x);\\n      currPos = mix(currPos, nextPos, t);\\n      segmentRatio = mix(segmentRatio, nextSegmentRatio, t);\\n    }\\n\\n    vec3 currPos64Low = mix(instanceSourcePositions64Low, instanceTargetPositions64Low, segmentRatio);\\n    vec3 nextPos64Low = mix(instanceSourcePositions64Low, instanceTargetPositions64Low, nextSegmentRatio);\\n  \\n    curr = project_position_to_clipspace(currPos, currPos64Low, vec3(0.0), geometry.position);\\n    next = project_position_to_clipspace(nextPos, nextPos64Low, vec3(0.0));\\n  \\n  } else {\\n    source = project_position(instanceSourcePositions, instanceSourcePositions64Low);\\n    target = project_position(instanceTargetPositions, instanceTargetPositions64Low);\\n\\n    float nextSegmentRatio = getSegmentRatio(segmentIndex + indexDir);\\n    vec3 currPos = interpolateFlat(source, target, segmentRatio);\\n    vec3 nextPos = interpolateFlat(source, target, nextSegmentRatio);\\n    curr = project_common_position_to_clipspace(vec4(currPos, 1.0));\\n    next = project_common_position_to_clipspace(vec4(nextPos, 1.0));\\n    geometry.position = vec4(currPos, 1.0);\\n  }\\n  float widthPixels = clamp(\\n    project_size_to_pixel(instanceWidths * widthScale),\\n    widthMinPixels, widthMaxPixels\\n  );\\n  vec3 offset = vec3(\\n    getExtrusionOffset((next.xy - curr.xy) * indexDir, positions.y, widthPixels),\\n    0.0);\\n  DECKGL_FILTER_SIZE(offset, geometry);\\n  gl_Position = curr + vec4(project_pixel_size_to_clipspace(offset.xy), 0.0, 0.0);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n\\n  vec4 color = mix(instanceSourceColors, instanceTargetColors, segmentRatio);\\n  vColor = vec4(color.rgb, color.a * opacity);\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"62EBw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME arc-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying vec2 uv;\\nvarying float isValid;\\n\\nvoid main(void) {\\n  if (isValid == 0.0) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vColor;\\n  geometry.uv = uv;\\n\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8YZXo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>BitmapLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _createMesh = require(\"./create-mesh\");\nvar _createMeshDefault = parcelHelpers.interopDefault(_createMesh);\nvar _bitmapLayerVertex = require(\"./bitmap-layer-vertex\");\nvar _bitmapLayerVertexDefault = parcelHelpers.interopDefault(_bitmapLayerVertex);\nvar _bitmapLayerFragment = require(\"./bitmap-layer-fragment\");\nvar _bitmapLayerFragmentDefault = parcelHelpers.interopDefault(_bitmapLayerFragment);\nvar _DEFAULT_TEXTURE_PARA;\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_TEXTURE_PARAMETERS = (_DEFAULT_TEXTURE_PARA = {}, (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10241, 9987), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10240, 9729), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10242, 33071), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10243, 33071), _DEFAULT_TEXTURE_PARA);\nvar defaultProps = {\n    image: {\n        type: \"object\",\n        value: null,\n        async: true\n    },\n    bounds: {\n        type: \"array\",\n        value: [\n            1,\n            0,\n            0,\n            1\n        ],\n        compare: true\n    },\n    desaturate: {\n        type: \"number\",\n        min: 0,\n        max: 1,\n        value: 0\n    },\n    transparentColor: {\n        type: \"color\",\n        value: [\n            0,\n            0,\n            0,\n            0\n        ]\n    },\n    tintColor: {\n        type: \"color\",\n        value: [\n            255,\n            255,\n            255\n        ]\n    }\n};\nvar BitmapLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(BitmapLayer1, _Layer);\n    var _super = _createSuper(BitmapLayer1);\n    function BitmapLayer1() {\n        (0, _classCallCheckDefault.default)(this, BitmapLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(BitmapLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(BitmapLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _bitmapLayerVertexDefault.default),\n                    fs: (0, _bitmapLayerFragmentDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                var attributeManager = this.getAttributeManager();\n                attributeManager.remove([\n                    \"instancePickingColors\"\n                ]);\n                var noAlloc = true;\n                attributeManager.add({\n                    indices: {\n                        size: 1,\n                        isIndexed: true,\n                        update: function update(attribute) {\n                            return attribute.value = _this.state.mesh.indices;\n                        },\n                        noAlloc: noAlloc\n                    },\n                    positions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        update: function update(attribute) {\n                            return attribute.value = _this.state.mesh.positions;\n                        },\n                        noAlloc: noAlloc\n                    },\n                    texCoords: {\n                        size: 2,\n                        update: function update(attribute) {\n                            return attribute.value = _this.state.mesh.texCoords;\n                        },\n                        noAlloc: noAlloc\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n                if (props.image !== oldProps.image) this.loadTexture(props.image);\n                var attributeManager = this.getAttributeManager();\n                if (props.bounds !== oldProps.bounds) {\n                    var oldMesh = this.state.mesh;\n                    var mesh = this._createMesh();\n                    this.state.model.setVertexCount(mesh.vertexCount);\n                    for(var key in mesh)if (oldMesh && oldMesh[key] !== mesh[key]) attributeManager.invalidate(key);\n                    this.setState({\n                        mesh: mesh\n                    });\n                }\n            }\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState() {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(BitmapLayer1.prototype), \"finalizeState\", this).call(this);\n                if (this.state.bitmapTexture) this.state.bitmapTexture[\"delete\"]();\n            }\n        },\n        {\n            key: \"_createMesh\",\n            value: function _createMesh() {\n                var bounds = this.props.bounds;\n                var normalizedBounds = bounds;\n                if (Number.isFinite(bounds[0])) normalizedBounds = [\n                    [\n                        bounds[0],\n                        bounds[1]\n                    ],\n                    [\n                        bounds[0],\n                        bounds[3]\n                    ],\n                    [\n                        bounds[2],\n                        bounds[3]\n                    ],\n                    [\n                        bounds[2],\n                        bounds[1]\n                    ]\n                ];\n                return (0, _createMeshDefault.default)(normalizedBounds, this.context.viewport.resolution);\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                if (!gl) return null;\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 4,\n                        vertexCount: 6\n                    }),\n                    isInstanced: false\n                }));\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(opts) {\n                var uniforms = opts.uniforms;\n                var _this$state = this.state, bitmapTexture = _this$state.bitmapTexture, model = _this$state.model;\n                var _this$props = this.props, image = _this$props.image, desaturate = _this$props.desaturate, transparentColor = _this$props.transparentColor, tintColor = _this$props.tintColor;\n                if (bitmapTexture && image instanceof HTMLVideoElement && image.readyState > HTMLVideoElement.HAVE_METADATA) {\n                    var sizeChanged = bitmapTexture.width !== image.videoWidth || bitmapTexture.height !== image.videoHeight;\n                    if (sizeChanged) {\n                        bitmapTexture.resize({\n                            width: image.videoWidth,\n                            height: image.videoHeight,\n                            mipmaps: true\n                        });\n                        bitmapTexture.setSubImageData({\n                            data: image,\n                            parameters: DEFAULT_TEXTURE_PARAMETERS\n                        });\n                    } else bitmapTexture.setSubImageData({\n                        data: image\n                    });\n                    bitmapTexture.generateMipmap();\n                }\n                if (bitmapTexture && model) model.setUniforms(Object.assign({}, uniforms, {\n                    bitmapTexture: bitmapTexture,\n                    desaturate: desaturate,\n                    transparentColor: transparentColor.map(function(x) {\n                        return x / 255;\n                    }),\n                    tintColor: tintColor.slice(0, 3).map(function(x) {\n                        return x / 255;\n                    })\n                })).draw();\n            }\n        },\n        {\n            key: \"loadTexture\",\n            value: function loadTexture(image) {\n                var gl = this.context.gl;\n                if (this.state.bitmapTexture) this.state.bitmapTexture[\"delete\"]();\n                if (image instanceof (0, _core1.Texture2D)) this.setState({\n                    bitmapTexture: image\n                });\n                else if (image instanceof HTMLVideoElement) this.setState({\n                    bitmapTexture: new (0, _core1.Texture2D)(gl, {\n                        width: 1,\n                        height: 1,\n                        parameters: DEFAULT_TEXTURE_PARAMETERS,\n                        mipmaps: false\n                    })\n                });\n                else if (image) this.setState({\n                    bitmapTexture: new (0, _core1.Texture2D)(gl, {\n                        data: image,\n                        parameters: DEFAULT_TEXTURE_PARAMETERS\n                    })\n                });\n            }\n        }\n    ]);\n    return BitmapLayer1;\n}((0, _core.Layer));\nBitmapLayer.layerName = \"BitmapLayer\";\nBitmapLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./create-mesh\":\"kZKhP\",\"./bitmap-layer-vertex\":\"9SZfK\",\"./bitmap-layer-fragment\":\"gZ7as\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kZKhP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathGl = require(\"math.gl\");\nvar DEFAULT_INDICES = new Uint16Array([\n    0,\n    2,\n    1,\n    0,\n    3,\n    2\n]);\nvar DEFAULT_TEX_COORDS = new Float32Array([\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    1,\n    1\n]);\nfunction createMesh(bounds, resolution) {\n    if (!resolution) return createQuad(bounds);\n    var maxXSpan = Math.max(Math.abs(bounds[0][0] - bounds[3][0]), Math.abs(bounds[1][0] - bounds[2][0]));\n    var maxYSpan = Math.max(Math.abs(bounds[1][1] - bounds[0][1]), Math.abs(bounds[2][1] - bounds[3][1]));\n    var uCount = Math.ceil(maxXSpan / resolution) + 1;\n    var vCount = Math.ceil(maxYSpan / resolution) + 1;\n    var vertexCount = (uCount - 1) * (vCount - 1) * 6;\n    var indices = new Uint32Array(vertexCount);\n    var texCoords = new Float32Array(uCount * vCount * 2);\n    var positions = new Float64Array(uCount * vCount * 3);\n    var vertex = 0;\n    var index = 0;\n    for(var u = 0; u < uCount; u++){\n        var ut = u / (uCount - 1);\n        for(var v = 0; v < vCount; v++){\n            var vt = v / (vCount - 1);\n            var p = interpolateQuad(bounds, ut, vt);\n            positions[vertex * 3 + 0] = p[0];\n            positions[vertex * 3 + 1] = p[1];\n            positions[vertex * 3 + 2] = p[2] || 0;\n            texCoords[vertex * 2 + 0] = ut;\n            texCoords[vertex * 2 + 1] = 1 - vt;\n            if (u > 0 && v > 0) {\n                indices[index++] = vertex - vCount;\n                indices[index++] = vertex - vCount - 1;\n                indices[index++] = vertex - 1;\n                indices[index++] = vertex - vCount;\n                indices[index++] = vertex - 1;\n                indices[index++] = vertex;\n            }\n            vertex++;\n        }\n    }\n    return {\n        vertexCount: vertexCount,\n        positions: positions,\n        indices: indices,\n        texCoords: texCoords\n    };\n}\nexports.default = createMesh;\nfunction createQuad(bounds) {\n    var positions = new Float64Array(12);\n    for(var i = 0; i < bounds.length; i++){\n        positions[i * 3 + 0] = bounds[i][0];\n        positions[i * 3 + 1] = bounds[i][1];\n        positions[i * 3 + 2] = bounds[i][2] || 0;\n    }\n    return {\n        vertexCount: 6,\n        positions: positions,\n        indices: DEFAULT_INDICES,\n        texCoords: DEFAULT_TEX_COORDS\n    };\n}\nfunction interpolateQuad(quad, ut, vt) {\n    return (0, _mathGl.lerp)((0, _mathGl.lerp)(quad[0], quad[1], vt), (0, _mathGl.lerp)(quad[3], quad[2], vt), ut);\n}\n\n},{\"math.gl\":\"huJnq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9SZfK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\n#define SHADER_NAME bitmap-layer-vertex-shader\\n\\nattribute vec2 texCoords;\\nattribute vec3 positions;\\nattribute vec3 positions64Low;\\n\\nvarying vec2 vTexCoord;\\n\\nconst vec3 pickingColor = vec3(1.0, 0.0, 0.0);\\n\\nvoid main(void) {\\n  geometry.worldPosition = positions;\\n  geometry.uv = texCoords;\\n  geometry.pickingColor = pickingColor;\\n\\n  gl_Position = project_position_to_clipspace(positions, positions64Low, vec3(0.0), geometry.position);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n\\n  vTexCoord = texCoords;\\n\\n  vec4 color = vec4(0.0);\\n  DECKGL_FILTER_COLOR(color, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gZ7as\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\n#define SHADER_NAME bitmap-layer-fragment-shader\\n\\n#ifdef GL_ES\\nprecision highp float;\\n#endif\\n\\nuniform sampler2D bitmapTexture;\\n\\nvarying vec2 vTexCoord;\\n\\nuniform float desaturate;\\nuniform vec4 transparentColor;\\nuniform vec3 tintColor;\\nuniform float opacity;\\n\\n// apply desaturation\\nvec3 color_desaturate(vec3 color) {\\n  float luminance = (color.r + color.g + color.b) * 0.333333333;\\n  return mix(color, vec3(luminance), desaturate);\\n}\\n\\n// apply tint\\nvec3 color_tint(vec3 color) {\\n  return color * tintColor;\\n}\\n\\n// blend with background color\\nvec4 apply_opacity(vec3 color, float alpha) {\\n  return mix(transparentColor, vec4(color, 1.0), alpha);\\n}\\n\\nvoid main(void) {\\n  vec4 bitmapColor = texture2D(bitmapTexture, vTexCoord);\\n\\n  gl_FragColor = apply_opacity(color_tint(color_desaturate(bitmapColor.rgb)), bitmapColor.a * opacity);\\n\\n  geometry.uv = vTexCoord;\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kGab5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>IconLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _iconLayerVertexGlsl = require(\"./icon-layer-vertex.glsl\");\nvar _iconLayerVertexGlslDefault = parcelHelpers.interopDefault(_iconLayerVertexGlsl);\nvar _iconLayerFragmentGlsl = require(\"./icon-layer-fragment.glsl\");\nvar _iconLayerFragmentGlslDefault = parcelHelpers.interopDefault(_iconLayerFragmentGlsl);\nvar _iconManager = require(\"./icon-manager\");\nvar _iconManagerDefault = parcelHelpers.interopDefault(_iconManager);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    iconAtlas: {\n        type: \"object\",\n        value: null,\n        async: true\n    },\n    iconMapping: {\n        type: \"object\",\n        value: {},\n        async: true\n    },\n    sizeScale: {\n        type: \"number\",\n        value: 1,\n        min: 0\n    },\n    billboard: true,\n    sizeUnits: \"pixels\",\n    sizeMinPixels: {\n        type: \"number\",\n        min: 0,\n        value: 0\n    },\n    sizeMaxPixels: {\n        type: \"number\",\n        min: 0,\n        value: Number.MAX_SAFE_INTEGER\n    },\n    alphaCutoff: {\n        type: \"number\",\n        value: 0.05,\n        min: 0,\n        max: 1\n    },\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getIcon: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.icon;\n        }\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getSize: {\n        type: \"accessor\",\n        value: 1\n    },\n    getAngle: {\n        type: \"accessor\",\n        value: 0\n    },\n    getPixelOffset: {\n        type: \"accessor\",\n        value: [\n            0,\n            0\n        ]\n    }\n};\nvar IconLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(IconLayer1, _Layer);\n    var _super = _createSuper(IconLayer1);\n    function IconLayer1() {\n        (0, _classCallCheckDefault.default)(this, IconLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(IconLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(IconLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _iconLayerVertexGlslDefault.default),\n                    fs: (0, _iconLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                this.state = {\n                    iconManager: new (0, _iconManagerDefault.default)(this.context.gl, {\n                        onUpdate: function onUpdate() {\n                            return _this._onUpdate();\n                        }\n                    })\n                };\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getPosition\"\n                    },\n                    instanceSizes: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getSize\",\n                        defaultValue: 1\n                    },\n                    instanceOffsets: {\n                        size: 2,\n                        accessor: \"getIcon\",\n                        transform: this.getInstanceOffset\n                    },\n                    instanceIconFrames: {\n                        size: 4,\n                        accessor: \"getIcon\",\n                        transform: this.getInstanceIconFrame\n                    },\n                    instanceColorModes: {\n                        size: 1,\n                        type: 5121,\n                        accessor: \"getIcon\",\n                        transform: this.getInstanceColorMode\n                    },\n                    instanceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceAngles: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getAngle\"\n                    },\n                    instancePixelOffset: {\n                        size: 2,\n                        transition: true,\n                        accessor: \"getPixelOffset\"\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var oldProps = _ref.oldProps, props = _ref.props, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(IconLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                var attributeManager = this.getAttributeManager();\n                var iconAtlas = props.iconAtlas, iconMapping = props.iconMapping, data = props.data, getIcon = props.getIcon;\n                var iconManager = this.state.iconManager;\n                iconManager.setProps({\n                    loadOptions: props.loadOptions\n                });\n                var iconMappingChanged = false;\n                var prePacked = iconAtlas || this.internalState.isAsyncPropLoading(\"iconAtlas\");\n                if (prePacked) {\n                    if (oldProps.iconAtlas !== props.iconAtlas) iconManager.setProps({\n                        iconAtlas: iconAtlas,\n                        autoPacking: false\n                    });\n                    if (oldProps.iconMapping !== props.iconMapping) {\n                        iconManager.setProps({\n                            iconMapping: iconMapping\n                        });\n                        iconMappingChanged = true;\n                    }\n                } else iconManager.setProps({\n                    autoPacking: true\n                });\n                if (changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getIcon)) iconManager.setProps({\n                    data: data,\n                    getIcon: getIcon\n                });\n                if (iconMappingChanged) {\n                    attributeManager.invalidate(\"instanceOffsets\");\n                    attributeManager.invalidate(\"instanceIconFrames\");\n                    attributeManager.invalidate(\"instanceColorModes\");\n                }\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    attributeManager.invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState() {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(IconLayer1.prototype), \"finalizeState\", this).call(this);\n                this.state.iconManager.finalize();\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var _this$props = this.props, sizeScale = _this$props.sizeScale, sizeMinPixels = _this$props.sizeMinPixels, sizeMaxPixels = _this$props.sizeMaxPixels, sizeUnits = _this$props.sizeUnits, billboard = _this$props.billboard, alphaCutoff = _this$props.alphaCutoff;\n                var iconManager = this.state.iconManager;\n                var viewport = this.context.viewport;\n                var iconsTexture = iconManager.getTexture();\n                if (iconsTexture && iconsTexture.loaded) this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    iconsTexture: iconsTexture,\n                    iconsTextureDim: [\n                        iconsTexture.width,\n                        iconsTexture.height\n                    ],\n                    sizeScale: sizeScale * (sizeUnits === \"pixels\" ? viewport.metersPerPixel : 1),\n                    sizeMinPixels: sizeMinPixels,\n                    sizeMaxPixels: sizeMaxPixels,\n                    billboard: billboard,\n                    alphaCutoff: alphaCutoff\n                })).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [\n                    -1,\n                    -1,\n                    -1,\n                    1,\n                    1,\n                    1,\n                    1,\n                    -1\n                ];\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 6,\n                        attributes: {\n                            positions: {\n                                size: 2,\n                                value: new Float32Array(positions)\n                            }\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        },\n        {\n            key: \"_onUpdate\",\n            value: function _onUpdate() {\n                this.setNeedsRedraw();\n            }\n        },\n        {\n            key: \"getInstanceOffset\",\n            value: function getInstanceOffset(icon) {\n                var rect = this.state.iconManager.getIconMapping(icon);\n                return [\n                    rect.width / 2 - rect.anchorX || 0,\n                    rect.height / 2 - rect.anchorY || 0\n                ];\n            }\n        },\n        {\n            key: \"getInstanceColorMode\",\n            value: function getInstanceColorMode(icon) {\n                var mapping = this.state.iconManager.getIconMapping(icon);\n                return mapping.mask ? 1 : 0;\n            }\n        },\n        {\n            key: \"getInstanceIconFrame\",\n            value: function getInstanceIconFrame(icon) {\n                var rect = this.state.iconManager.getIconMapping(icon);\n                return [\n                    rect.x || 0,\n                    rect.y || 0,\n                    rect.width || 0,\n                    rect.height || 0\n                ];\n            }\n        },\n        {\n            key: \"isLoaded\",\n            get: function get() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(IconLayer1.prototype), \"isLoaded\", this) && this.state.iconManager.isLoaded;\n            }\n        }\n    ]);\n    return IconLayer1;\n}((0, _core.Layer));\nIconLayer.layerName = \"IconLayer\";\nIconLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./icon-layer-vertex.glsl\":\"ivazg\",\"./icon-layer-fragment.glsl\":\"6gsjr\",\"./icon-manager\":\"hO9hC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ivazg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME icon-layer-vertex-shader\\n\\nattribute vec2 positions;\\n\\nattribute vec3 instancePositions;\\nattribute vec3 instancePositions64Low;\\nattribute float instanceSizes;\\nattribute float instanceAngles;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute vec4 instanceIconFrames;\\nattribute float instanceColorModes;\\nattribute vec2 instanceOffsets;\\nattribute vec2 instancePixelOffset;\\n\\nuniform float sizeScale;\\nuniform vec2 iconsTextureDim;\\nuniform float sizeMinPixels;\\nuniform float sizeMaxPixels;\\nuniform bool billboard;\\n\\nvarying float vColorMode;\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\nvarying vec2 uv;\\n\\nvec2 rotate_by_angle(vec2 vertex, float angle) {\\n  float angle_radian = angle * PI / 180.0;\\n  float cos_angle = cos(angle_radian);\\n  float sin_angle = sin(angle_radian);\\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\\n  return rotationMatrix * vertex;\\n}\\n\\nvoid main(void) {\\n  geometry.worldPosition = instancePositions;\\n  geometry.uv = positions;\\n  geometry.pickingColor = instancePickingColors;\\n  uv = positions;\\n\\n  vec2 iconSize = instanceIconFrames.zw;\\n  float sizePixels = clamp(\\n    project_size_to_pixel(instanceSizes * sizeScale), \\n    sizeMinPixels, sizeMaxPixels\\n  );\\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : sizePixels / iconSize.y;\\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * instanceScale;\\n  pixelOffset += instancePixelOffset;\\n  pixelOffset.y *= -1.0;\\n\\n  if (billboard)  {\\n    gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, vec3(0.0), geometry.position);\\n    vec3 offset = vec3(pixelOffset, 0.0);\\n    DECKGL_FILTER_SIZE(offset, geometry);\\n    gl_Position.xy += project_pixel_size_to_clipspace(offset.xy);\\n\\n  } else {\\n    vec3 offset_common = vec3(project_pixel_size(pixelOffset), 0.0);\\n    DECKGL_FILTER_SIZE(offset_common, geometry);\\n    gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset_common, geometry.position); \\n  }\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n\\n  vTextureCoords = mix(\\n    instanceIconFrames.xy,\\n    instanceIconFrames.xy + iconSize,\\n    (positions.xy + 1.0) / 2.0\\n  ) / iconsTextureDim;\\n\\n  vColor = instanceColors;\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n\\n  vColorMode = instanceColorModes;\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6gsjr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME icon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform float opacity;\\nuniform sampler2D iconsTexture;\\nuniform float alphaCutoff;\\n\\nvarying float vColorMode;\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  geometry.uv = uv;\\n\\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\\n  vec3 color = mix(texColor.rgb, vColor.rgb, vColorMode);\\n  float a = texColor.a * opacity * vColor.a;\\n\\n  if (a < alphaCutoff) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vec4(color, a);\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hO9hC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"buildMapping\", ()=>buildMapping);\nparcelHelpers.export(exports, \"getDiffIcons\", ()=>getDiffIcons);\nparcelHelpers.export(exports, \"default\", ()=>IconManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _core = require(\"@luma.gl/core\");\nvar _images = require(\"@loaders.gl/images\");\nvar _core1 = require(\"@loaders.gl/core\");\nvar _core2 = require(\"@deck.gl/core\");\nvar _DEFAULT_TEXTURE_PARA;\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar DEFAULT_CANVAS_WIDTH = 1024;\nvar DEFAULT_BUFFER = 4;\nvar noop = function noop() {};\nvar DEFAULT_TEXTURE_PARAMETERS = (_DEFAULT_TEXTURE_PARA = {}, (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10241, 9987), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10240, 9729), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10242, 33071), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10243, 33071), _DEFAULT_TEXTURE_PARA);\nfunction nextPowOfTwo(number) {\n    return Math.pow(2, Math.ceil(Math.log2(number)));\n}\nfunction resizeImage(ctx, imageData, width, height) {\n    if (width === imageData.width && height === imageData.height) return imageData;\n    ctx.canvas.height = height;\n    ctx.canvas.width = width;\n    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n    ctx.drawImage(imageData, 0, 0, imageData.width, imageData.height, 0, 0, width, height);\n    return ctx.canvas;\n}\nfunction getIconId(icon) {\n    return icon && (icon.id || icon.url);\n}\nfunction resizeTexture(gl, texture, width, height) {\n    var oldWidth = texture.width;\n    var oldHeight = texture.height;\n    var newTexture = (0, _core.cloneTextureFrom)(texture, {\n        width: width,\n        height: height\n    });\n    (0, _core.copyToTexture)(texture, newTexture, {\n        targetY: 0,\n        width: oldWidth,\n        height: oldHeight\n    });\n    texture[\"delete\"]();\n    return newTexture;\n}\nfunction buildRowMapping(mapping, columns, yOffset) {\n    for(var i = 0; i < columns.length; i++){\n        var _columns$i = columns[i], icon = _columns$i.icon, xOffset = _columns$i.xOffset;\n        var id = getIconId(icon);\n        mapping[id] = Object.assign({}, icon, {\n            x: xOffset,\n            y: yOffset\n        });\n    }\n}\nfunction buildMapping(_ref) {\n    var icons = _ref.icons, buffer = _ref.buffer, _ref$mapping = _ref.mapping, mapping = _ref$mapping === void 0 ? {} : _ref$mapping, _ref$xOffset = _ref.xOffset, xOffset = _ref$xOffset === void 0 ? 0 : _ref$xOffset, _ref$yOffset = _ref.yOffset, yOffset = _ref$yOffset === void 0 ? 0 : _ref$yOffset, _ref$rowHeight = _ref.rowHeight, rowHeight = _ref$rowHeight === void 0 ? 0 : _ref$rowHeight, canvasWidth = _ref.canvasWidth;\n    var columns = [];\n    for(var i = 0; i < icons.length; i++){\n        var icon = icons[i];\n        var id = getIconId(icon);\n        if (!mapping[id]) {\n            var height = icon.height, width = icon.width;\n            if (xOffset + width + buffer > canvasWidth) {\n                buildRowMapping(mapping, columns, yOffset);\n                xOffset = 0;\n                yOffset = rowHeight + yOffset + buffer;\n                rowHeight = 0;\n                columns = [];\n            }\n            columns.push({\n                icon: icon,\n                xOffset: xOffset\n            });\n            xOffset = xOffset + width + buffer;\n            rowHeight = Math.max(rowHeight, height);\n        }\n    }\n    if (columns.length > 0) buildRowMapping(mapping, columns, yOffset);\n    return {\n        mapping: mapping,\n        rowHeight: rowHeight,\n        xOffset: xOffset,\n        yOffset: yOffset,\n        canvasWidth: canvasWidth,\n        canvasHeight: nextPowOfTwo(rowHeight + yOffset + buffer)\n    };\n}\nfunction getDiffIcons(data, getIcon, cachedIcons) {\n    if (!data || !getIcon) return null;\n    cachedIcons = cachedIcons || {};\n    var icons = {};\n    var _createIterable = (0, _core2.createIterable)(data), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n    var _iterator = _createForOfIteratorHelper(iterable), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var object = _step.value;\n            objectInfo.index++;\n            var icon = getIcon(object, objectInfo);\n            var id = getIconId(icon);\n            if (!icon) throw new Error(\"Icon is missing.\");\n            if (!icon.url) throw new Error(\"Icon url is missing.\");\n            if (!icons[id] && (!cachedIcons[id] || icon.url !== cachedIcons[id].url)) icons[id] = icon;\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    return icons;\n}\nvar IconManager = function() {\n    function IconManager1(gl, _ref2) {\n        var _ref2$onUpdate = _ref2.onUpdate, onUpdate = _ref2$onUpdate === void 0 ? noop : _ref2$onUpdate;\n        (0, _classCallCheckDefault.default)(this, IconManager1);\n        this.gl = gl;\n        this.onUpdate = onUpdate;\n        this._loadOptions = null;\n        this._getIcon = null;\n        this._texture = null;\n        this._externalTexture = null;\n        this._mapping = {};\n        this._pendingCount = 0;\n        this._autoPacking = false;\n        this._xOffset = 0;\n        this._yOffset = 0;\n        this._rowHeight = 0;\n        this._buffer = DEFAULT_BUFFER;\n        this._canvasWidth = DEFAULT_CANVAS_WIDTH;\n        this._canvasHeight = 0;\n        this._canvas = null;\n    }\n    (0, _createClassDefault.default)(IconManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                if (this._texture) this._texture[\"delete\"]();\n            }\n        },\n        {\n            key: \"getTexture\",\n            value: function getTexture() {\n                return this._texture || this._externalTexture;\n            }\n        },\n        {\n            key: \"getIconMapping\",\n            value: function getIconMapping(icon) {\n                var id = this._autoPacking ? getIconId(icon) : icon;\n                return this._mapping[id] || {};\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(_ref3) {\n                var loadOptions = _ref3.loadOptions, autoPacking = _ref3.autoPacking, iconAtlas = _ref3.iconAtlas, iconMapping = _ref3.iconMapping, data = _ref3.data, getIcon = _ref3.getIcon;\n                if (loadOptions) this._loadOptions = loadOptions;\n                if (autoPacking !== undefined) this._autoPacking = autoPacking;\n                if (getIcon) this._getIcon = getIcon;\n                if (iconMapping) this._mapping = iconMapping;\n                if (iconAtlas) this._updateIconAtlas(iconAtlas);\n                if (this._autoPacking && (data || getIcon) && typeof document !== \"undefined\") {\n                    this._canvas = this._canvas || document.createElement(\"canvas\");\n                    this._updateAutoPacking(data);\n                }\n            }\n        },\n        {\n            key: \"_updateIconAtlas\",\n            value: function _updateIconAtlas(iconAtlas) {\n                if (this._texture) {\n                    this._texture[\"delete\"]();\n                    this._texture = null;\n                }\n                if (iconAtlas instanceof (0, _core.Texture2D)) {\n                    iconAtlas.setParameters(DEFAULT_TEXTURE_PARAMETERS);\n                    this._externalTexture = iconAtlas;\n                    this.onUpdate();\n                } else if (iconAtlas) {\n                    this._texture = new (0, _core.Texture2D)(this.gl, {\n                        data: iconAtlas,\n                        parameters: DEFAULT_TEXTURE_PARAMETERS\n                    });\n                    this.onUpdate();\n                }\n            }\n        },\n        {\n            key: \"_updateAutoPacking\",\n            value: function _updateAutoPacking(data) {\n                var icons = Object.values(getDiffIcons(data, this._getIcon, this._mapping) || {});\n                if (icons.length > 0) {\n                    var _buildMapping = buildMapping({\n                        icons: icons,\n                        buffer: this._buffer,\n                        canvasWidth: this._canvasWidth,\n                        mapping: this._mapping,\n                        rowHeight: this._rowHeight,\n                        xOffset: this._xOffset,\n                        yOffset: this._yOffset\n                    }), mapping = _buildMapping.mapping, xOffset = _buildMapping.xOffset, yOffset = _buildMapping.yOffset, rowHeight = _buildMapping.rowHeight, canvasHeight = _buildMapping.canvasHeight;\n                    this._rowHeight = rowHeight;\n                    this._mapping = mapping;\n                    this._xOffset = xOffset;\n                    this._yOffset = yOffset;\n                    this._canvasHeight = canvasHeight;\n                    if (!this._texture) this._texture = new (0, _core.Texture2D)(this.gl, {\n                        width: this._canvasWidth,\n                        height: this._canvasHeight,\n                        parameters: DEFAULT_TEXTURE_PARAMETERS\n                    });\n                    if (this._texture.height !== this._canvasHeight) this._texture = resizeTexture(this.gl, this._texture, this._canvasWidth, this._canvasHeight);\n                    this.onUpdate();\n                    this._loadIcons(icons);\n                }\n            }\n        },\n        {\n            key: \"_loadIcons\",\n            value: function _loadIcons(icons) {\n                var _this = this;\n                var ctx = this._canvas.getContext(\"2d\");\n                var _iterator2 = _createForOfIteratorHelper(icons), _step2;\n                try {\n                    var _loop = function _loop() {\n                        var icon = _step2.value;\n                        _this._pendingCount++;\n                        (0, _core1.load)(icon.url, (0, _images.ImageLoader), _this._loadOptions).then(function(imageData) {\n                            var id = getIconId(icon);\n                            var _this$_mapping$id = _this._mapping[id], x = _this$_mapping$id.x, y = _this$_mapping$id.y, width = _this$_mapping$id.width, height = _this$_mapping$id.height;\n                            var data = resizeImage(ctx, imageData, width, height);\n                            _this._texture.setSubImageData({\n                                data: data,\n                                x: x,\n                                y: y,\n                                width: width,\n                                height: height\n                            });\n                            _this._texture.generateMipmap();\n                            _this.onUpdate();\n                        })[\"catch\"](function(error) {\n                            (0, _core2.log).error(error)();\n                        })[\"finally\"](function() {\n                            _this._pendingCount--;\n                        });\n                    };\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;)_loop();\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n            }\n        },\n        {\n            key: \"isLoaded\",\n            get: function get() {\n                return this._pendingCount === 0;\n            }\n        }\n    ]);\n    return IconManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@luma.gl/core\":\"WBJLR\",\"@loaders.gl/images\":\"9Br8C\",\"@loaders.gl/core\":\"kiTkb\",\"@deck.gl/core\":\"gu68g\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8HAxs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LineLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _lineLayerVertexGlsl = require(\"./line-layer-vertex.glsl\");\nvar _lineLayerVertexGlslDefault = parcelHelpers.interopDefault(_lineLayerVertexGlsl);\nvar _lineLayerFragmentGlsl = require(\"./line-layer-fragment.glsl\");\nvar _lineLayerFragmentGlslDefault = parcelHelpers.interopDefault(_lineLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    getSourcePosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.sourcePosition;\n        }\n    },\n    getTargetPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.targetPosition;\n        }\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    widthUnits: \"pixels\",\n    widthScale: {\n        type: \"number\",\n        value: 1,\n        min: 0\n    },\n    widthMinPixels: {\n        type: \"number\",\n        value: 0,\n        min: 0\n    },\n    widthMaxPixels: {\n        type: \"number\",\n        value: Number.MAX_SAFE_INTEGER,\n        min: 0\n    }\n};\nvar LineLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(LineLayer1, _Layer);\n    var _super = _createSuper(LineLayer1);\n    function LineLayer1() {\n        (0, _classCallCheckDefault.default)(this, LineLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(LineLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(LineLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _lineLayerVertexGlslDefault.default),\n                    fs: (0, _lineLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instanceSourcePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getSourcePosition\"\n                    },\n                    instanceTargetPositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getTargetPosition\"\n                    },\n                    instanceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getColor\",\n                        defaultValue: [\n                            0,\n                            0,\n                            0,\n                            255\n                        ]\n                    },\n                    instanceWidths: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getWidth\",\n                        defaultValue: 1\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(LineLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, widthUnits = _this$props.widthUnits, widthScale = _this$props.widthScale, widthMinPixels = _this$props.widthMinPixels, widthMaxPixels = _this$props.widthMaxPixels;\n                var widthMultiplier = widthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    widthScale: widthScale * widthMultiplier,\n                    widthMinPixels: widthMinPixels,\n                    widthMaxPixels: widthMaxPixels\n                })).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [\n                    0,\n                    -1,\n                    0,\n                    0,\n                    1,\n                    0,\n                    1,\n                    -1,\n                    0,\n                    1,\n                    1,\n                    0\n                ];\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 5,\n                        attributes: {\n                            positions: new Float32Array(positions)\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        }\n    ]);\n    return LineLayer1;\n}((0, _core.Layer));\nLineLayer.layerName = \"LineLayer\";\nLineLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./line-layer-vertex.glsl\":\"h0rVj\",\"./line-layer-fragment.glsl\":\"bbhjW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h0rVj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME line-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 instanceSourcePositions;\\nattribute vec3 instanceTargetPositions;\\nattribute vec3 instanceSourcePositions64Low;\\nattribute vec3 instanceTargetPositions64Low;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute float instanceWidths;\\n\\nuniform float opacity;\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\n\\nvarying vec4 vColor;\\nvarying vec2 uv;\\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction, float width) {\\n  vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\\n  dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\\n\\n  return dir_screenspace * offset_direction * width / 2.0;\\n}\\n\\nvoid main(void) {\\n  geometry.worldPosition = instanceSourcePositions;\\n  geometry.worldPositionAlt = instanceTargetPositions;\\n  vec4 source_commonspace;\\n  vec4 target_commonspace;\\n  vec4 source = project_position_to_clipspace(instanceSourcePositions, instanceSourcePositions64Low, vec3(0.), source_commonspace);\\n  vec4 target = project_position_to_clipspace(instanceTargetPositions, instanceTargetPositions64Low, vec3(0.), target_commonspace);\\n  float widthPixels = clamp(\\n    project_size_to_pixel(instanceWidths * widthScale),\\n    widthMinPixels, widthMaxPixels\\n  );\\n  float segmentIndex = positions.x;\\n  vec4 p = mix(source, target, segmentIndex);\\n  geometry.position = mix(source_commonspace, target_commonspace, segmentIndex);\\n  uv = positions.xy;\\n  geometry.uv = uv;\\n  geometry.pickingColor = instancePickingColors;\\n  vec3 offset = vec3(\\n    getExtrusionOffset(target.xy - source.xy, positions.y, widthPixels),\\n    0.0);\\n  DECKGL_FILTER_SIZE(offset, geometry);\\n  gl_Position = p + vec4(project_pixel_size_to_clipspace(offset.xy), 0.0, 0.0);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity);\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bbhjW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME line-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  geometry.uv = uv;\\n\\n  gl_FragColor = vColor;\\n\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7YH60\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PointCloudLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _pointCloudLayerVertexGlsl = require(\"./point-cloud-layer-vertex.glsl\");\nvar _pointCloudLayerVertexGlslDefault = parcelHelpers.interopDefault(_pointCloudLayerVertexGlsl);\nvar _pointCloudLayerFragmentGlsl = require(\"./point-cloud-layer-fragment.glsl\");\nvar _pointCloudLayerFragmentGlslDefault = parcelHelpers.interopDefault(_pointCloudLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar DEFAULT_NORMAL = [\n    0,\n    0,\n    1\n];\nvar defaultProps = {\n    sizeUnits: \"pixels\",\n    pointSize: {\n        type: \"number\",\n        min: 0,\n        value: 10\n    },\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getNormal: {\n        type: \"accessor\",\n        value: DEFAULT_NORMAL\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    material: true,\n    radiusPixels: {\n        deprecatedFor: \"pointSize\"\n    }\n};\nfunction normalizeData(data) {\n    var header = data.header, attributes = data.attributes;\n    if (!header || !attributes) return;\n    data.length = header.vertexCount;\n    if (attributes.POSITION) attributes.instancePositions = attributes.POSITION;\n    if (attributes.NORMAL) attributes.instanceNormals = attributes.NORMAL;\n    if (attributes.COLOR_0) attributes.instanceColors = attributes.COLOR_0;\n}\nvar PointCloudLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(PointCloudLayer1, _Layer);\n    var _super = _createSuper(PointCloudLayer1);\n    function PointCloudLayer1() {\n        (0, _classCallCheckDefault.default)(this, PointCloudLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(PointCloudLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders(id) {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PointCloudLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _pointCloudLayerVertexGlslDefault.default),\n                    fs: (0, _pointCloudLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.gouraudLighting),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.getAttributeManager().addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getPosition\"\n                    },\n                    instanceNormals: {\n                        size: 3,\n                        transition: true,\n                        accessor: \"getNormal\",\n                        defaultValue: DEFAULT_NORMAL\n                    },\n                    instanceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getColor\",\n                        defaultValue: DEFAULT_COLOR\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PointCloudLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n                if (changeFlags.dataChanged) normalizeData(props.data);\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, pointSize = _this$props.pointSize, sizeUnits = _this$props.sizeUnits;\n                var sizeMultiplier = sizeUnits === \"meters\" ? 1 / viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    radiusPixels: pointSize * sizeMultiplier\n                })).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [];\n                for(var i = 0; i < 3; i++){\n                    var angle = i / 3 * Math.PI * 2;\n                    positions.push(Math.cos(angle) * 2, Math.sin(angle) * 2, 0);\n                }\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 4,\n                        attributes: {\n                            positions: new Float32Array(positions)\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        }\n    ]);\n    return PointCloudLayer1;\n}((0, _core.Layer));\nPointCloudLayer.layerName = \"PointCloudLayer\";\nPointCloudLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./point-cloud-layer-vertex.glsl\":\"rC8qi\",\"./point-cloud-layer-fragment.glsl\":\"hvM9W\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"rC8qi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME point-cloud-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 instanceNormals;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePositions;\\nattribute vec3 instancePositions64Low;\\nattribute vec3 instancePickingColors;\\n\\nuniform float opacity;\\nuniform float radiusPixels;\\n\\nvarying vec4 vColor;\\nvarying vec2 unitPosition;\\n\\nvoid main(void) {\\n  geometry.worldPosition = instancePositions;\\n  geometry.normal = project_normal(instanceNormals);\\n  unitPosition = positions.xy;\\n  geometry.uv = unitPosition;\\n  geometry.pickingColor = instancePickingColors;\\n  vec3 offset = vec3(positions.xy * radiusPixels, 0.0);\\n  DECKGL_FILTER_SIZE(offset, geometry);\\n\\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, vec3(0.), geometry.position);\\n  gl_Position.xy += project_pixel_size_to_clipspace(offset.xy);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  vec3 lightColor = lighting_getLightColor(instanceColors.rgb, project_uCameraPosition, geometry.position.xyz, geometry.normal);\\n  vColor = vec4(lightColor, instanceColors.a * opacity);\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hvM9W\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME point-cloud-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying vec2 unitPosition;\\n\\nvoid main(void) {\\n  geometry.uv = unitPosition;\\n\\n  float distToCenter = length(unitPosition);\\n\\n  if (distToCenter > 1.0) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vColor;\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dbN34\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ScatterplotLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _scatterplotLayerVertexGlsl = require(\"./scatterplot-layer-vertex.glsl\");\nvar _scatterplotLayerVertexGlslDefault = parcelHelpers.interopDefault(_scatterplotLayerVertexGlsl);\nvar _scatterplotLayerFragmentGlsl = require(\"./scatterplot-layer-fragment.glsl\");\nvar _scatterplotLayerFragmentGlslDefault = parcelHelpers.interopDefault(_scatterplotLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    radiusUnits: \"meters\",\n    radiusScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    radiusMinPixels: {\n        type: \"number\",\n        min: 0,\n        value: 0\n    },\n    radiusMaxPixels: {\n        type: \"number\",\n        min: 0,\n        value: Number.MAX_SAFE_INTEGER\n    },\n    lineWidthUnits: \"meters\",\n    lineWidthScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    lineWidthMinPixels: {\n        type: \"number\",\n        min: 0,\n        value: 0\n    },\n    lineWidthMaxPixels: {\n        type: \"number\",\n        min: 0,\n        value: Number.MAX_SAFE_INTEGER\n    },\n    stroked: false,\n    filled: true,\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getRadius: {\n        type: \"accessor\",\n        value: 1\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    strokeWidth: {\n        deprecatedFor: \"getLineWidth\"\n    },\n    outline: {\n        deprecatedFor: \"stroked\"\n    },\n    getColor: {\n        deprecatedFor: [\n            \"getFillColor\",\n            \"getLineColor\"\n        ]\n    }\n};\nvar ScatterplotLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(ScatterplotLayer1, _Layer);\n    var _super = _createSuper(ScatterplotLayer1);\n    function ScatterplotLayer1() {\n        (0, _classCallCheckDefault.default)(this, ScatterplotLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(ScatterplotLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders(id) {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ScatterplotLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _scatterplotLayerVertexGlslDefault.default),\n                    fs: (0, _scatterplotLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.getAttributeManager().addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getPosition\"\n                    },\n                    instanceRadius: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getRadius\",\n                        defaultValue: 1\n                    },\n                    instanceFillColors: {\n                        size: this.props.colorFormat.length,\n                        transition: true,\n                        normalized: true,\n                        type: 5121,\n                        accessor: \"getFillColor\",\n                        defaultValue: [\n                            0,\n                            0,\n                            0,\n                            255\n                        ]\n                    },\n                    instanceLineColors: {\n                        size: this.props.colorFormat.length,\n                        transition: true,\n                        normalized: true,\n                        type: 5121,\n                        accessor: \"getLineColor\",\n                        defaultValue: [\n                            0,\n                            0,\n                            0,\n                            255\n                        ]\n                    },\n                    instanceLineWidths: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getLineWidth\",\n                        defaultValue: 1\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ScatterplotLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, radiusUnits = _this$props.radiusUnits, radiusScale = _this$props.radiusScale, radiusMinPixels = _this$props.radiusMinPixels, radiusMaxPixels = _this$props.radiusMaxPixels, stroked = _this$props.stroked, filled = _this$props.filled, lineWidthUnits = _this$props.lineWidthUnits, lineWidthScale = _this$props.lineWidthScale, lineWidthMinPixels = _this$props.lineWidthMinPixels, lineWidthMaxPixels = _this$props.lineWidthMaxPixels;\n                var pointRadiusMultiplier = radiusUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                var lineWidthMultiplier = lineWidthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(uniforms).setUniforms({\n                    stroked: stroked ? 1 : 0,\n                    filled: filled,\n                    radiusScale: radiusScale * pointRadiusMultiplier,\n                    radiusMinPixels: radiusMinPixels,\n                    radiusMaxPixels: radiusMaxPixels,\n                    lineWidthScale: lineWidthScale * lineWidthMultiplier,\n                    lineWidthMinPixels: lineWidthMinPixels,\n                    lineWidthMaxPixels: lineWidthMaxPixels\n                }).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [\n                    -1,\n                    -1,\n                    0,\n                    1,\n                    -1,\n                    0,\n                    1,\n                    1,\n                    0,\n                    -1,\n                    1,\n                    0\n                ];\n                return new (0, _core1.Model)(gl, Object.assign(this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 6,\n                        vertexCount: 4,\n                        attributes: {\n                            positions: {\n                                size: 3,\n                                value: new Float32Array(positions)\n                            }\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        }\n    ]);\n    return ScatterplotLayer1;\n}((0, _core.Layer));\nScatterplotLayer.layerName = \"ScatterplotLayer\";\nScatterplotLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./scatterplot-layer-vertex.glsl\":\"7ZCbb\",\"./scatterplot-layer-fragment.glsl\":\"7ABrI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ZCbb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME scatterplot-layer-vertex-shader\\n\\nattribute vec3 positions;\\n\\nattribute vec3 instancePositions;\\nattribute vec3 instancePositions64Low;\\nattribute float instanceRadius;\\nattribute float instanceLineWidths;\\nattribute vec4 instanceFillColors;\\nattribute vec4 instanceLineColors;\\nattribute vec3 instancePickingColors;\\n\\nuniform float opacity;\\nuniform float radiusScale;\\nuniform float radiusMinPixels;\\nuniform float radiusMaxPixels;\\nuniform float lineWidthScale;\\nuniform float lineWidthMinPixels;\\nuniform float lineWidthMaxPixels;\\nuniform float stroked;\\nuniform bool filled;\\n\\nvarying vec4 vFillColor;\\nvarying vec4 vLineColor;\\nvarying vec2 unitPosition;\\nvarying float innerUnitRadius;\\nvarying float outerRadiusPixels;\\n\\nvoid main(void) {\\n  geometry.worldPosition = instancePositions;\\n  outerRadiusPixels = clamp(\\n    project_size_to_pixel(radiusScale * instanceRadius),\\n    radiusMinPixels, radiusMaxPixels\\n  );\\n  float lineWidthPixels = clamp(\\n    project_size_to_pixel(lineWidthScale * instanceLineWidths),\\n    lineWidthMinPixels, lineWidthMaxPixels\\n  );\\n  outerRadiusPixels += stroked * lineWidthPixels / 2.0;\\n  unitPosition = positions.xy;\\n  geometry.uv = unitPosition;\\n  geometry.pickingColor = instancePickingColors;\\n\\n  innerUnitRadius = 1.0 - stroked * lineWidthPixels / outerRadiusPixels;\\n  \\n  vec3 offset = positions * project_pixel_size(outerRadiusPixels);\\n  DECKGL_FILTER_SIZE(offset, geometry);\\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset, geometry.position);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  vFillColor = vec4(instanceFillColors.rgb, instanceFillColors.a * opacity);\\n  DECKGL_FILTER_COLOR(vFillColor, geometry);\\n  vLineColor = vec4(instanceLineColors.rgb, instanceLineColors.a * opacity);\\n  DECKGL_FILTER_COLOR(vLineColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ABrI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME scatterplot-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform bool filled;\\nuniform float stroked;\\n\\nvarying vec4 vFillColor;\\nvarying vec4 vLineColor;\\nvarying vec2 unitPosition;\\nvarying float innerUnitRadius;\\nvarying float outerRadiusPixels;\\n\\nvoid main(void) {\\n  geometry.uv = unitPosition;\\n\\n  float distToCenter = length(unitPosition) * outerRadiusPixels;\\n  float inCircle = smoothedge(distToCenter, outerRadiusPixels);\\n\\n  if (inCircle == 0.0) {\\n    discard;\\n  }\\n\\n  if (stroked > 0.5) {\\n    float isLine = smoothedge(innerUnitRadius * outerRadiusPixels, distToCenter);\\n    if (filled) {\\n      gl_FragColor = mix(vFillColor, vLineColor, isLine);\\n    } else {\\n      if (isLine == 0.0) {\\n        discard;\\n      }\\n      gl_FragColor = vec4(vLineColor.rgb, vLineColor.a * isLine);\\n    }\\n  } else if (filled) {\\n    gl_FragColor = vFillColor;\\n  } else {\\n    discard;\\n  }\\n\\n  gl_FragColor.a *= inCircle;\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jCoF8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ColumnLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _columnGeometry = require(\"./column-geometry\");\nvar _columnGeometryDefault = parcelHelpers.interopDefault(_columnGeometry);\nvar _columnLayerVertexGlsl = require(\"./column-layer-vertex.glsl\");\nvar _columnLayerVertexGlslDefault = parcelHelpers.interopDefault(_columnLayerVertexGlsl);\nvar _columnLayerFragmentGlsl = require(\"./column-layer-fragment.glsl\");\nvar _columnLayerFragmentGlslDefault = parcelHelpers.interopDefault(_columnLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    diskResolution: {\n        type: \"number\",\n        min: 4,\n        value: 20\n    },\n    vertices: null,\n    radius: {\n        type: \"number\",\n        min: 0,\n        value: 1000\n    },\n    angle: {\n        type: \"number\",\n        value: 0\n    },\n    offset: {\n        type: \"array\",\n        value: [\n            0,\n            0\n        ]\n    },\n    coverage: {\n        type: \"number\",\n        min: 0,\n        max: 1,\n        value: 1\n    },\n    elevationScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    lineWidthUnits: \"meters\",\n    lineWidthScale: 1,\n    lineWidthMinPixels: 0,\n    lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n    extruded: true,\n    wireframe: false,\n    filled: true,\n    stroked: false,\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    getElevation: {\n        type: \"accessor\",\n        value: 1000\n    },\n    material: true,\n    getColor: {\n        deprecatedFor: [\n            \"getFillColor\",\n            \"getLineColor\"\n        ]\n    }\n};\nvar ColumnLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(ColumnLayer1, _Layer);\n    var _super = _createSuper(ColumnLayer1);\n    function ColumnLayer1() {\n        (0, _classCallCheckDefault.default)(this, ColumnLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(ColumnLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ColumnLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _columnLayerVertexGlslDefault.default),\n                    fs: (0, _columnLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.gouraudLighting),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getPosition\"\n                    },\n                    instanceElevations: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getElevation\"\n                    },\n                    instanceFillColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getFillColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceLineColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getLineColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceStrokeWidths: {\n                        size: 1,\n                        accessor: \"getLineWidth\",\n                        transition: true\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ColumnLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                var regenerateModels = changeFlags.extensionsChanged;\n                if (regenerateModels) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n                if (regenerateModels || props.diskResolution !== oldProps.diskResolution || props.vertices !== oldProps.vertices) this._updateGeometry(props);\n            }\n        },\n        {\n            key: \"getGeometry\",\n            value: function getGeometry(diskResolution, vertices) {\n                var geometry = new (0, _columnGeometryDefault.default)({\n                    radius: 1,\n                    height: 2,\n                    vertices: vertices,\n                    nradial: diskResolution\n                });\n                var meanVertexDistance = 0;\n                if (vertices) for(var i = 0; i < diskResolution; i++){\n                    var p = vertices[i];\n                    var d = Math.sqrt(p[0] * p[0] + p[1] * p[1]);\n                    meanVertexDistance += d / diskResolution;\n                }\n                else meanVertexDistance = 1;\n                this.setState({\n                    edgeDistance: Math.cos(Math.PI / diskResolution) * meanVertexDistance\n                });\n                return geometry;\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    isInstanced: true\n                }));\n            }\n        },\n        {\n            key: \"_updateGeometry\",\n            value: function _updateGeometry(_ref2) {\n                var diskResolution = _ref2.diskResolution, vertices = _ref2.vertices;\n                var geometry = this.getGeometry(diskResolution, vertices);\n                this.setState({\n                    fillVertexCount: geometry.attributes.POSITION.value.length / 3,\n                    wireframeVertexCount: geometry.indices.value.length\n                });\n                this.state.model.setProps({\n                    geometry: geometry\n                });\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref3) {\n                var uniforms = _ref3.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, lineWidthUnits = _this$props.lineWidthUnits, lineWidthScale = _this$props.lineWidthScale, lineWidthMinPixels = _this$props.lineWidthMinPixels, lineWidthMaxPixels = _this$props.lineWidthMaxPixels, elevationScale = _this$props.elevationScale, extruded = _this$props.extruded, filled = _this$props.filled, stroked = _this$props.stroked, wireframe = _this$props.wireframe, offset = _this$props.offset, coverage = _this$props.coverage, radius = _this$props.radius, angle = _this$props.angle;\n                var _this$state = this.state, model = _this$state.model, fillVertexCount = _this$state.fillVertexCount, wireframeVertexCount = _this$state.wireframeVertexCount, edgeDistance = _this$state.edgeDistance;\n                var widthMultiplier = lineWidthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                model.setUniforms(Object.assign({}, uniforms, {\n                    radius: radius,\n                    angle: angle / 180 * Math.PI,\n                    offset: offset,\n                    extruded: extruded,\n                    coverage: coverage,\n                    elevationScale: elevationScale,\n                    edgeDistance: edgeDistance,\n                    widthScale: lineWidthScale * widthMultiplier,\n                    widthMinPixels: lineWidthMinPixels,\n                    widthMaxPixels: lineWidthMaxPixels\n                }));\n                if (extruded && wireframe) {\n                    model.setProps({\n                        isIndexed: true\n                    });\n                    model.setVertexCount(wireframeVertexCount).setDrawMode(1).setUniforms({\n                        isStroke: true\n                    }).draw();\n                }\n                if (filled) {\n                    model.setProps({\n                        isIndexed: false\n                    });\n                    model.setVertexCount(fillVertexCount).setDrawMode(5).setUniforms({\n                        isStroke: false\n                    }).draw();\n                }\n                if (!extruded && stroked) {\n                    model.setProps({\n                        isIndexed: false\n                    });\n                    model.setVertexCount(fillVertexCount * 2 / 3).setDrawMode(5).setUniforms({\n                        isStroke: true\n                    }).draw();\n                }\n            }\n        }\n    ]);\n    return ColumnLayer1;\n}((0, _core.Layer));\nColumnLayer.layerName = \"ColumnLayer\";\nColumnLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./column-geometry\":\"2ypFB\",\"./column-layer-vertex.glsl\":\"hmBrP\",\"./column-layer-fragment.glsl\":\"y191J\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2ypFB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ColumnGeometry);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar ColumnGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(ColumnGeometry1, _Geometry);\n    var _super = _createSuper(ColumnGeometry1);\n    function ColumnGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, ColumnGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _core1.uid)(\"column-geometry\") : _props$id;\n        var _tesselateColumn = tesselateColumn(props), indices = _tesselateColumn.indices, attributes = _tesselateColumn.attributes;\n        return _super.call(this, _objectSpread(_objectSpread({}, props), {}, {\n            id: id,\n            indices: indices,\n            attributes: attributes\n        }));\n    }\n    return ColumnGeometry1;\n}((0, _core1.Geometry));\nfunction tesselateColumn(props) {\n    var radius = props.radius, _props$height = props.height, height = _props$height === void 0 ? 1 : _props$height, _props$nradial = props.nradial, nradial = _props$nradial === void 0 ? 10 : _props$nradial, vertices = props.vertices;\n    (0, _core.log).assert(!vertices || vertices.length >= nradial);\n    var vertsAroundEdge = nradial + 1;\n    var numVertices = vertsAroundEdge * 3;\n    var stepAngle = Math.PI * 2 / nradial;\n    var indices = new Uint16Array(nradial * 6);\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var i = 0;\n    for(var j = 0; j < vertsAroundEdge; j++){\n        var a = j * stepAngle;\n        var vertex = vertices && vertices[j % nradial];\n        var nextVertex = vertices && vertices[(j + 1) % nradial];\n        var sin = Math.sin(a);\n        var cos = Math.cos(a);\n        for(var k = 0; k < 2; k++){\n            positions[i + 0] = vertex ? vertex[0] : cos * radius;\n            positions[i + 1] = vertex ? vertex[1] : sin * radius;\n            positions[i + 2] = (0.5 - k) * height;\n            normals[i + 0] = vertex ? nextVertex[0] - vertex[0] : cos;\n            normals[i + 1] = vertex ? nextVertex[1] - vertex[1] : sin;\n            i += 3;\n        }\n    }\n    for(var _j = 0; _j < vertsAroundEdge; _j++){\n        var v = Math.floor(_j / 2) * Math.sign(_j % 2 - 0.5);\n        var _a = v * stepAngle;\n        var _vertex = vertices && vertices[(v + nradial) % nradial];\n        var _sin = Math.sin(_a);\n        var _cos = Math.cos(_a);\n        positions[i + 0] = _vertex ? _vertex[0] : _cos * radius;\n        positions[i + 1] = _vertex ? _vertex[1] : _sin * radius;\n        positions[i + 2] = height / 2;\n        normals[i + 2] = 1;\n        i += 3;\n    }\n    var index = 0;\n    for(var _j2 = 0; _j2 < nradial; _j2++){\n        indices[index++] = _j2 * 2 + 0;\n        indices[index++] = _j2 * 2 + 2;\n        indices[index++] = _j2 * 2 + 0;\n        indices[index++] = _j2 * 2 + 1;\n        indices[index++] = _j2 * 2 + 1;\n        indices[index++] = _j2 * 2 + 3;\n    }\n    return {\n        indices: indices,\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: positions\n            },\n            NORMAL: {\n                size: 3,\n                value: normals\n            }\n        }\n    };\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hmBrP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\n#define SHADER_NAME column-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 normals;\\n\\nattribute vec3 instancePositions;\\nattribute float instanceElevations;\\nattribute vec3 instancePositions64Low;\\nattribute vec4 instanceFillColors;\\nattribute vec4 instanceLineColors;\\nattribute float instanceStrokeWidths;\\n\\nattribute vec3 instancePickingColors;\\nuniform float opacity;\\nuniform float radius;\\nuniform float angle;\\nuniform vec2 offset;\\nuniform bool extruded;\\nuniform bool isStroke;\\nuniform float coverage;\\nuniform float elevationScale;\\nuniform float edgeDistance;\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n  geometry.worldPosition = instancePositions;\\n\\n  vec4 color = isStroke ? instanceLineColors : instanceFillColors;\\n  mat2 rotationMatrix = mat2(cos(angle), sin(angle), -sin(angle), cos(angle));\\n  float elevation = 0.0;\\n  float strokeOffsetRatio = 1.0;\\n\\n  if (extruded) {\\n    elevation = instanceElevations * (positions.z + 1.0) / 2.0 * elevationScale;\\n  } else if (isStroke) {\\n    float widthPixels = clamp(project_size_to_pixel(instanceStrokeWidths * widthScale),\\n      widthMinPixels, widthMaxPixels) / 2.0;\\n    strokeOffsetRatio += sign(positions.z) * project_pixel_size(widthPixels) / project_size(edgeDistance * coverage * radius);\\n  }\\n  float shouldRender = float(color.a > 0.0 && instanceElevations >= 0.0);\\n  float dotRadius = radius * coverage * shouldRender;\\n\\n  geometry.normal = project_normal(vec3(rotationMatrix * normals.xy, normals.z));\\n  geometry.pickingColor = instancePickingColors;\\n  vec3 centroidPosition = vec3(instancePositions.xy, instancePositions.z + elevation);\\n  vec3 centroidPosition64Low = instancePositions64Low;\\n  vec3 pos = vec3(project_size(rotationMatrix * positions.xy * strokeOffsetRatio + offset) * dotRadius, 0.);\\n  DECKGL_FILTER_SIZE(pos, geometry);\\n\\n  gl_Position = project_position_to_clipspace(centroidPosition, centroidPosition64Low, pos, geometry.position);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  if (extruded && !isStroke) {\\n    vec3 lightColor = lighting_getLightColor(color.rgb, project_uCameraPosition, geometry.position.xyz, geometry.normal);\\n    vColor = vec4(lightColor, color.a * opacity);\\n  } else {\\n    vColor = vec4(color.rgb, color.a * opacity);\\n  }\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"y191J\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME column-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n  gl_FragColor = vColor;\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1h7Kk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GridCellLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@luma.gl/core\");\nvar _columnLayer = require(\"./column-layer\");\nvar _columnLayerDefault = parcelHelpers.interopDefault(_columnLayer);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar defaultProps = {\n    cellSize: {\n        type: \"number\",\n        min: 0,\n        value: 1000\n    },\n    offset: {\n        type: \"array\",\n        min: 0,\n        value: [\n            1,\n            1\n        ]\n    }\n};\nvar GridCellLayer = function(_ColumnLayer) {\n    (0, _inheritsDefault.default)(GridCellLayer1, _ColumnLayer);\n    var _super = _createSuper(GridCellLayer1);\n    function GridCellLayer1() {\n        (0, _classCallCheckDefault.default)(this, GridCellLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(GridCellLayer1, [\n        {\n            key: \"getGeometry\",\n            value: function getGeometry(diskResolution) {\n                return new (0, _core.CubeGeometry)();\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref) {\n                var uniforms = _ref.uniforms;\n                var _this$props = this.props, elevationScale = _this$props.elevationScale, extruded = _this$props.extruded, offset = _this$props.offset, coverage = _this$props.coverage, cellSize = _this$props.cellSize, angle = _this$props.angle;\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    radius: cellSize / 2,\n                    angle: angle,\n                    offset: offset,\n                    extruded: extruded,\n                    coverage: coverage,\n                    elevationScale: elevationScale,\n                    edgeDistance: 1,\n                    isWireframe: false\n                })).draw();\n            }\n        }\n    ]);\n    return GridCellLayer1;\n}((0, _columnLayerDefault.default));\nGridCellLayer.layerName = \"GridCellLayer\";\nGridCellLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@luma.gl/core\":\"WBJLR\",\"./column-layer\":\"jCoF8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fUUc7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PathLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _pathTesselator = require(\"./path-tesselator\");\nvar _pathTesselatorDefault = parcelHelpers.interopDefault(_pathTesselator);\nvar _pathLayerVertexGlsl = require(\"./path-layer-vertex.glsl\");\nvar _pathLayerVertexGlslDefault = parcelHelpers.interopDefault(_pathLayerVertexGlsl);\nvar _pathLayerFragmentGlsl = require(\"./path-layer-fragment.glsl\");\nvar _pathLayerFragmentGlslDefault = parcelHelpers.interopDefault(_pathLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    widthUnits: \"meters\",\n    widthScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    widthMinPixels: {\n        type: \"number\",\n        min: 0,\n        value: 0\n    },\n    widthMaxPixels: {\n        type: \"number\",\n        min: 0,\n        value: Number.MAX_SAFE_INTEGER\n    },\n    rounded: false,\n    miterLimit: {\n        type: \"number\",\n        min: 0,\n        value: 4\n    },\n    billboard: false,\n    _pathType: null,\n    getPath: {\n        type: \"accessor\",\n        value: function value(object) {\n            return object.path;\n        }\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getWidth: {\n        type: \"accessor\",\n        value: 1\n    }\n};\nvar ATTRIBUTE_TRANSITION = {\n    enter: function enter(value, chunk) {\n        return chunk.length ? chunk.subarray(chunk.length - value.length) : value;\n    }\n};\nvar PathLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(PathLayer1, _Layer);\n    var _super = _createSuper(PathLayer1);\n    function PathLayer1() {\n        (0, _classCallCheckDefault.default)(this, PathLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(PathLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PathLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _pathLayerVertexGlslDefault.default),\n                    fs: (0, _pathLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                var noAlloc = true;\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    positions: {\n                        size: 3,\n                        vertexOffset: 1,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getPath\",\n                        update: this.calculatePositions,\n                        noAlloc: noAlloc,\n                        shaderAttributes: {\n                            instanceLeftPositions: {\n                                vertexOffset: 0\n                            },\n                            instanceStartPositions: {\n                                vertexOffset: 1\n                            },\n                            instanceEndPositions: {\n                                vertexOffset: 2\n                            },\n                            instanceRightPositions: {\n                                vertexOffset: 3\n                            }\n                        }\n                    },\n                    instanceTypes: {\n                        size: 1,\n                        type: 5121,\n                        update: this.calculateSegmentTypes,\n                        noAlloc: noAlloc\n                    },\n                    instanceStrokeWidths: {\n                        size: 1,\n                        accessor: \"getWidth\",\n                        transition: ATTRIBUTE_TRANSITION,\n                        defaultValue: 1\n                    },\n                    instanceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        accessor: \"getColor\",\n                        transition: ATTRIBUTE_TRANSITION,\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instancePickingColors: {\n                        size: 3,\n                        type: 5121,\n                        accessor: function accessor(object, _ref) {\n                            var index = _ref.index, value = _ref.target;\n                            return _this.encodePickingColor(object && object.__source ? object.__source.index : index, value);\n                        }\n                    }\n                });\n                this.setState({\n                    pathTesselator: new (0, _pathTesselatorDefault.default)({\n                        fp64: this.use64bitPositions()\n                    })\n                });\n                if (this.props.getDashArray && !this.props.extensions.length) (0, _core.log).removed(\"getDashArray\", \"PathStyleExtension\")();\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref2) {\n                var oldProps = _ref2.oldProps, props = _ref2.props, changeFlags = _ref2.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PathLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                var attributeManager = this.getAttributeManager();\n                var geometryChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPath);\n                if (geometryChanged) {\n                    var pathTesselator = this.state.pathTesselator;\n                    var buffers = props.data.attributes || {};\n                    pathTesselator.updateGeometry({\n                        data: props.data,\n                        geometryBuffer: buffers.getPath,\n                        buffers: buffers,\n                        normalize: !props._pathType,\n                        loop: props._pathType === \"loop\",\n                        getGeometry: props.getPath,\n                        positionFormat: props.positionFormat,\n                        wrapLongitude: props.wrapLongitude,\n                        resolution: this.context.viewport.resolution,\n                        dataChanged: changeFlags.dataChanged\n                    });\n                    this.setState({\n                        numInstances: pathTesselator.instanceCount,\n                        startIndices: pathTesselator.vertexStarts\n                    });\n                    if (!changeFlags.dataChanged) attributeManager.invalidateAll();\n                }\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    attributeManager.invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(params) {\n                var info = (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PathLayer1.prototype), \"getPickingInfo\", this).call(this, params);\n                var index = info.index;\n                var data = this.props.data;\n                if (data[0] && data[0].__source) info.object = data.find(function(d) {\n                    return d.__source.index === index;\n                });\n                return info;\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref3) {\n                var uniforms = _ref3.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, rounded = _this$props.rounded, billboard = _this$props.billboard, miterLimit = _this$props.miterLimit, widthUnits = _this$props.widthUnits, widthScale = _this$props.widthScale, widthMinPixels = _this$props.widthMinPixels, widthMaxPixels = _this$props.widthMaxPixels;\n                var widthMultiplier = widthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    jointType: Number(rounded),\n                    billboard: billboard,\n                    widthScale: widthScale * widthMultiplier,\n                    miterLimit: miterLimit,\n                    widthMinPixels: widthMinPixels,\n                    widthMaxPixels: widthMaxPixels\n                })).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var SEGMENT_INDICES = [\n                    0,\n                    1,\n                    2,\n                    1,\n                    4,\n                    2,\n                    1,\n                    3,\n                    4,\n                    3,\n                    5,\n                    4\n                ];\n                var SEGMENT_POSITIONS = [\n                    0,\n                    0,\n                    0,\n                    -1,\n                    0,\n                    1,\n                    1,\n                    -1,\n                    1,\n                    1,\n                    1,\n                    0\n                ];\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 4,\n                        attributes: {\n                            indices: new Uint16Array(SEGMENT_INDICES),\n                            positions: {\n                                value: new Float32Array(SEGMENT_POSITIONS),\n                                size: 2\n                            }\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        },\n        {\n            key: \"calculatePositions\",\n            value: function calculatePositions(attribute) {\n                var pathTesselator = this.state.pathTesselator;\n                attribute.startIndices = pathTesselator.vertexStarts;\n                attribute.value = pathTesselator.get(\"positions\");\n            }\n        },\n        {\n            key: \"calculateSegmentTypes\",\n            value: function calculateSegmentTypes(attribute) {\n                var pathTesselator = this.state.pathTesselator;\n                attribute.startIndices = pathTesselator.vertexStarts;\n                attribute.value = pathTesselator.get(\"segmentTypes\");\n            }\n        },\n        {\n            key: \"wrapLongitude\",\n            get: function get() {\n                return false;\n            }\n        }\n    ]);\n    return PathLayer1;\n}((0, _core.Layer));\nPathLayer.layerName = \"PathLayer\";\nPathLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./path-tesselator\":\"kOHRP\",\"./path-layer-vertex.glsl\":\"1WN0h\",\"./path-layer-fragment.glsl\":\"lMUcF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kOHRP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PathTesselator);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _path = require(\"./path\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar START_CAP = 1;\nvar END_CAP = 2;\nvar INVALID = 4;\nvar PathTesselator = function(_Tesselator) {\n    (0, _inheritsDefault.default)(PathTesselator1, _Tesselator);\n    var _super = _createSuper(PathTesselator1);\n    function PathTesselator1(opts) {\n        (0, _classCallCheckDefault.default)(this, PathTesselator1);\n        return _super.call(this, _objectSpread(_objectSpread({}, opts), {}, {\n            attributes: {\n                positions: {\n                    size: 3,\n                    padding: 18,\n                    initialize: true,\n                    type: opts.fp64 ? Float64Array : Float32Array\n                },\n                segmentTypes: {\n                    size: 1,\n                    type: Uint8ClampedArray\n                }\n            }\n        }));\n    }\n    (0, _createClassDefault.default)(PathTesselator1, [\n        {\n            key: \"getGeometryFromBuffer\",\n            value: function getGeometryFromBuffer(buffer) {\n                if (this.normalize) return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PathTesselator1.prototype), \"getGeometryFromBuffer\", this).call(this, buffer);\n                return function() {\n                    return null;\n                };\n            }\n        },\n        {\n            key: \"normalizeGeometry\",\n            value: function normalizeGeometry(path) {\n                if (this.normalize) return (0, _path.normalizePath)(path, this.positionSize, this.opts.resolution, this.opts.wrapLongitude);\n                return path;\n            }\n        },\n        {\n            key: \"get\",\n            value: function get(attributeName) {\n                return this.attributes[attributeName];\n            }\n        },\n        {\n            key: \"getGeometrySize\",\n            value: function getGeometrySize(path) {\n                if (Array.isArray(path[0])) {\n                    var size = 0;\n                    var _iterator = _createForOfIteratorHelper(path), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var subPath = _step.value;\n                            size += this.getGeometrySize(subPath);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    return size;\n                }\n                var numPoints = this.getPathLength(path);\n                if (numPoints < 2) return 0;\n                if (this.isClosed(path)) return numPoints < 3 ? 0 : numPoints + 2;\n                return numPoints;\n            }\n        },\n        {\n            key: \"updateGeometryAttributes\",\n            value: function updateGeometryAttributes(path, context) {\n                if (context.geometrySize === 0) return;\n                if (path && Array.isArray(path[0])) {\n                    var _iterator2 = _createForOfIteratorHelper(path), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var subPath = _step2.value;\n                            var geometrySize = this.getGeometrySize(subPath);\n                            context.geometrySize = geometrySize;\n                            this.updateGeometryAttributes(subPath, context);\n                            context.vertexStart += geometrySize;\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                } else {\n                    this._updateSegmentTypes(path, context);\n                    this._updatePositions(path, context);\n                }\n            }\n        },\n        {\n            key: \"_updateSegmentTypes\",\n            value: function _updateSegmentTypes(path, context) {\n                var segmentTypes = this.attributes.segmentTypes;\n                var isPathClosed = this.isClosed(path);\n                var vertexStart = context.vertexStart, geometrySize = context.geometrySize;\n                segmentTypes.fill(0, vertexStart, vertexStart + geometrySize);\n                if (isPathClosed) {\n                    segmentTypes[vertexStart] = INVALID;\n                    segmentTypes[vertexStart + geometrySize - 2] = INVALID;\n                } else {\n                    segmentTypes[vertexStart] += START_CAP;\n                    segmentTypes[vertexStart + geometrySize - 2] += END_CAP;\n                }\n                segmentTypes[vertexStart + geometrySize - 1] = INVALID;\n            }\n        },\n        {\n            key: \"_updatePositions\",\n            value: function _updatePositions(path, context) {\n                var positions = this.attributes.positions;\n                if (!positions) return;\n                var vertexStart = context.vertexStart, geometrySize = context.geometrySize;\n                var p = new Array(3);\n                for(var i = vertexStart, ptIndex = 0; ptIndex < geometrySize; i++, ptIndex++){\n                    this.getPointOnPath(path, ptIndex, p);\n                    positions[i * 3] = p[0];\n                    positions[i * 3 + 1] = p[1];\n                    positions[i * 3 + 2] = p[2];\n                }\n            }\n        },\n        {\n            key: \"getPathLength\",\n            value: function getPathLength(path) {\n                return path.length / this.positionSize;\n            }\n        },\n        {\n            key: \"getPointOnPath\",\n            value: function getPointOnPath(path, index) {\n                var target = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n                var positionSize = this.positionSize;\n                if (index * positionSize >= path.length) index += 1 - path.length / positionSize;\n                var i = index * positionSize;\n                target[0] = path[i];\n                target[1] = path[i + 1];\n                target[2] = positionSize === 3 && path[i + 2] || 0;\n                return target;\n            }\n        },\n        {\n            key: \"isClosed\",\n            value: function isClosed(path) {\n                if (!this.normalize) return this.opts.loop;\n                var positionSize = this.positionSize;\n                var lastPointIndex = path.length - positionSize;\n                return path[0] === path[lastPointIndex] && path[1] === path[lastPointIndex + 1] && (positionSize === 2 || path[2] === path[lastPointIndex + 2]);\n            }\n        }\n    ]);\n    return PathTesselator1;\n}((0, _core.Tesselator));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"./path\":\"gni4U\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gni4U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalizePath\", ()=>normalizePath);\nvar _polygon = require(\"@math.gl/polygon\");\nfunction normalizePath(path, size, gridResolution, wrapLongitude) {\n    var flatPath = path;\n    if (Array.isArray(path[0])) {\n        var length = path.length * size;\n        flatPath = new Array(length);\n        for(var i = 0; i < path.length; i++)for(var j = 0; j < size; j++)flatPath[i * size + j] = path[i][j] || 0;\n    }\n    if (gridResolution) return (0, _polygon.cutPolylineByGrid)(flatPath, {\n        size: size,\n        gridResolution: gridResolution\n    });\n    if (wrapLongitude) return (0, _polygon.cutPolylineByMercatorBounds)(flatPath, {\n        size: size\n    });\n    return flatPath;\n}\n\n},{\"@math.gl/polygon\":\"e5A4M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e5A4M\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Polygon\", ()=>(0, _polygonDefault.default));\nparcelHelpers.export(exports, \"getPolygonSignedArea\", ()=>(0, _polygonUtils.getPolygonSignedArea));\nparcelHelpers.export(exports, \"getPolygonWindingDirection\", ()=>(0, _polygonUtils.getPolygonWindingDirection));\nparcelHelpers.export(exports, \"forEachSegmentInPolygon\", ()=>(0, _polygonUtils.forEachSegmentInPolygon));\nparcelHelpers.export(exports, \"modifyPolygonWindingDirection\", ()=>(0, _polygonUtils.modifyPolygonWindingDirection));\nparcelHelpers.export(exports, \"WINDING\", ()=>(0, _polygonUtils.WINDING));\nparcelHelpers.export(exports, \"earcut\", ()=>(0, _earcut.earcut));\nparcelHelpers.export(exports, \"clipPolygon\", ()=>(0, _lineclip.clipPolygon));\nparcelHelpers.export(exports, \"clipPolyline\", ()=>(0, _lineclip.clipPolyline));\nparcelHelpers.export(exports, \"cutPolygonByGrid\", ()=>(0, _cutByGrid.cutPolygonByGrid));\nparcelHelpers.export(exports, \"cutPolylineByGrid\", ()=>(0, _cutByGrid.cutPolylineByGrid));\nparcelHelpers.export(exports, \"cutPolylineByMercatorBounds\", ()=>(0, _cutByMercatorBounds.cutPolylineByMercatorBounds));\nparcelHelpers.export(exports, \"cutPolygonByMercatorBounds\", ()=>(0, _cutByMercatorBounds.cutPolygonByMercatorBounds));\nparcelHelpers.export(exports, \"_Polygon\", ()=>(0, _polygonDefault.default));\nvar _polygon = require(\"./polygon\");\nvar _polygonDefault = parcelHelpers.interopDefault(_polygon);\nvar _polygonUtils = require(\"./polygon-utils\");\nvar _earcut = require(\"./earcut\");\nvar _lineclip = require(\"./lineclip\");\nvar _cutByGrid = require(\"./cut-by-grid\");\nvar _cutByMercatorBounds = require(\"./cut-by-mercator-bounds\");\n\n},{\"./polygon\":\"insqQ\",\"./polygon-utils\":\"4zyzk\",\"./earcut\":\"7nvzF\",\"./lineclip\":\"1I8px\",\"./cut-by-grid\":\"geAhV\",\"./cut-by-mercator-bounds\":\"aks6V\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"insqQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _core = require(\"@math.gl/core\");\nvar _polygonUtils = require(\"./polygon-utils\");\nclass Polygon {\n    constructor(points, options = {}){\n        (0, _definePropertyDefault.default)(this, \"points\", void 0);\n        (0, _definePropertyDefault.default)(this, \"isFlatArray\", void 0);\n        (0, _definePropertyDefault.default)(this, \"options\", void 0);\n        this.points = points;\n        this.isFlatArray = !(0, _core.isArray)(points[0]);\n        this.options = {\n            start: options.start || 0,\n            end: options.end || points.length,\n            size: options.size || 2,\n            isClosed: options.isClosed\n        };\n        Object.freeze(this);\n    }\n    getSignedArea() {\n        if (this.isFlatArray) return (0, _polygonUtils.getPolygonSignedArea)(this.points, this.options);\n        return (0, _polygonUtils.getPolygonSignedAreaPoints)(this.points, this.options);\n    }\n    getArea() {\n        return Math.abs(this.getSignedArea());\n    }\n    getWindingDirection() {\n        return Math.sign(this.getSignedArea());\n    }\n    forEachSegment(visitor) {\n        if (this.isFlatArray) (0, _polygonUtils.forEachSegmentInPolygon)(this.points, (x1, y1, x2, y2, i1, i2)=>{\n            visitor([\n                x1,\n                y1\n            ], [\n                x2,\n                y2\n            ], i1, i2);\n        }, this.options);\n        else (0, _polygonUtils.forEachSegmentInPolygonPoints)(this.points, visitor, this.options);\n    }\n    modifyWindingDirection(direction) {\n        if (this.isFlatArray) return (0, _polygonUtils.modifyPolygonWindingDirection)(this.points, direction, this.options);\n        return (0, _polygonUtils.modifyPolygonWindingDirectionPoints)(this.points, direction, this.options);\n    }\n}\nexports.default = Polygon;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@math.gl/core\":\"2J9Y1\",\"./polygon-utils\":\"4zyzk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4zyzk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"WINDING\", ()=>WINDING);\nparcelHelpers.export(exports, \"modifyPolygonWindingDirection\", ()=>modifyPolygonWindingDirection);\nparcelHelpers.export(exports, \"getPolygonWindingDirection\", ()=>getPolygonWindingDirection);\nparcelHelpers.export(exports, \"getPolygonSignedArea\", ()=>getPolygonSignedArea);\nparcelHelpers.export(exports, \"forEachSegmentInPolygon\", ()=>forEachSegmentInPolygon);\nparcelHelpers.export(exports, \"modifyPolygonWindingDirectionPoints\", ()=>modifyPolygonWindingDirectionPoints);\nparcelHelpers.export(exports, \"getPolygonWindingDirectionPoints\", ()=>getPolygonWindingDirectionPoints);\nparcelHelpers.export(exports, \"getPolygonSignedAreaPoints\", ()=>getPolygonSignedAreaPoints);\nparcelHelpers.export(exports, \"forEachSegmentInPolygonPoints\", ()=>forEachSegmentInPolygonPoints);\nvar _core = require(\"@math.gl/core\");\nlet WINDING;\n(function(WINDING1) {\n    WINDING1[WINDING1[\"CLOCKWISE\"] = 1] = \"CLOCKWISE\";\n    WINDING1[WINDING1[\"COUNTER_CLOCKWISE\"] = -1] = \"COUNTER_CLOCKWISE\";\n})(WINDING || (WINDING = {}));\nfunction modifyPolygonWindingDirection(points, direction, options = {}) {\n    const windingDirection = getPolygonWindingDirection(points, options);\n    if (windingDirection !== direction) {\n        reversePolygon(points, options);\n        return true;\n    }\n    return false;\n}\nfunction getPolygonWindingDirection(points, options = {}) {\n    return Math.sign(getPolygonSignedArea(points, options));\n}\nfunction getPolygonSignedArea(points, options = {}) {\n    const { start =0 , end =points.length  } = options;\n    const dim = options.size || 2;\n    let area = 0;\n    for(let i = start, j = end - dim; i < end; i += dim){\n        area += (points[i] - points[j]) * (points[i + 1] + points[j + 1]);\n        j = i;\n    }\n    return area / 2;\n}\nfunction forEachSegmentInPolygon(points, visitor, options = {}) {\n    const { start =0 , end =points.length , size =2 , isClosed  } = options;\n    const numPoints = (end - start) / size;\n    for(let i = 0; i < numPoints - 1; ++i)visitor(points[start + i * size], points[start + i * size + 1], points[start + (i + 1) * size], points[start + (i + 1) * size + 1], i, i + 1);\n    const endPointIndex = start + (numPoints - 1) * size;\n    const isClosedEx = isClosed || (0, _core.equals)(points[start], points[endPointIndex]) && (0, _core.equals)(points[start + 1], points[endPointIndex + 1]);\n    if (!isClosedEx) visitor(points[endPointIndex], points[endPointIndex + 1], points[start], points[start + 1], numPoints - 1, 0);\n}\nfunction reversePolygon(points, options) {\n    const { start =0 , end =points.length , size =2  } = options;\n    const numPoints = (end - start) / size;\n    const numSwaps = Math.floor(numPoints / 2);\n    for(let i = 0; i < numSwaps; ++i){\n        const b1 = start + i * size;\n        const b2 = start + (numPoints - 1 - i) * size;\n        for(let j = 0; j < size; ++j){\n            const tmp = points[b1 + j];\n            points[b1 + j] = points[b2 + j];\n            points[b2 + j] = tmp;\n        }\n    }\n}\nfunction modifyPolygonWindingDirectionPoints(points, direction, options = {}) {\n    const currentDirection = getPolygonWindingDirectionPoints(points, options);\n    if (currentDirection !== direction) {\n        points.reverse();\n        return true;\n    }\n    return false;\n}\nfunction getPolygonWindingDirectionPoints(points, options = {}) {\n    return Math.sign(getPolygonSignedAreaPoints(points, options));\n}\nfunction getPolygonSignedAreaPoints(points, options = {}) {\n    const { start =0 , end =points.length  } = options;\n    let area = 0;\n    for(let i = start, j = end - 1; i < end; ++i){\n        area += (points[i][0] - points[j][0]) * (points[i][1] + points[j][1]);\n        j = i;\n    }\n    return area / 2;\n}\nfunction forEachSegmentInPolygonPoints(points, visitor, options = {}) {\n    const { start =0 , end =points.length , isClosed  } = options;\n    for(let i = start; i < end - 1; ++i)visitor(points[i], points[i + 1], i, i + 1);\n    const isClosedEx = isClosed || (0, _core.equals)(points[end - 1], points[0]);\n    if (!isClosedEx) visitor(points[end - 1], points[0], end - 1, 0);\n}\n\n},{\"@math.gl/core\":\"2J9Y1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7nvzF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"earcut\", ()=>earcut);\nvar _polygonUtils = require(\"./polygon-utils\");\nfunction earcut(positions, holeIndices, dim = 2, areas) {\n    const hasHoles = holeIndices && holeIndices.length;\n    const outerLen = hasHoles ? holeIndices[0] * dim : positions.length;\n    let outerNode = linkedList(positions, 0, outerLen, dim, true, areas && areas[0]);\n    const triangles = [];\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n    let invSize;\n    let maxX;\n    let maxY;\n    let minX;\n    let minY;\n    let x;\n    let y;\n    if (hasHoles) outerNode = eliminateHoles(positions, holeIndices, outerNode, dim, areas);\n    if (positions.length > 80 * dim) {\n        minX = maxX = positions[0];\n        minY = maxY = positions[1];\n        for(let i = dim; i < outerLen; i += dim){\n            x = positions[i];\n            y = positions[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 1 / invSize : 0;\n    }\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n    return triangles;\n}\nfunction linkedList(data, start, end, dim, clockwise, area1) {\n    let i;\n    let last;\n    if (area1 === undefined) area1 = (0, _polygonUtils.getPolygonSignedArea)(data, {\n        start,\n        end,\n        size: dim\n    });\n    if (clockwise === area1 < 0) for(i = start; i < end; i += dim)last = insertNode(i, data[i], data[i + 1], last);\n    else for(i = end - dim; i >= start; i -= dim)last = insertNode(i, data[i], data[i + 1], last);\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n    return last;\n}\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n    let p = start;\n    let again;\n    do {\n        again = false;\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n        } else p = p.next;\n    }while (again || p !== end);\n    return end;\n}\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n    let stop = ear;\n    let prev;\n    let next;\n    while(ear.prev !== ear.next){\n        prev = ear.prev;\n        next = ear.next;\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n            removeNode(ear);\n            ear = next.next;\n            stop = next.next;\n            continue;\n        }\n        ear = next;\n        if (ear === stop) {\n            if (!pass) earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n            else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n            } else if (pass === 2) splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            break;\n        }\n    }\n}\nfunction isEar(ear) {\n    const a = ear.prev;\n    const b = ear;\n    const c = ear.next;\n    if (area(a, b, c) >= 0) return false;\n    let p = ear.next.next;\n    while(p !== ear.prev){\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n    return true;\n}\nfunction isEarHashed(ear, minX, minY, invSize) {\n    const a = ear.prev;\n    const b = ear;\n    const c = ear.next;\n    if (area(a, b, c) >= 0) return false;\n    const minTX = a.x < b.x ? a.x < c.x ? a.x : c.x : b.x < c.x ? b.x : c.x;\n    const minTY = a.y < b.y ? a.y < c.y ? a.y : c.y : b.y < c.y ? b.y : c.y;\n    const maxTX = a.x > b.x ? a.x > c.x ? a.x : c.x : b.x > c.x ? b.x : c.x;\n    const maxTY = a.y > b.y ? a.y > c.y ? a.y : c.y : b.y > c.y ? b.y : c.y;\n    const minZ = zOrder(minTX, minTY, minX, minY, invSize);\n    const maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n    let p = ear.prevZ;\n    let n = ear.nextZ;\n    while(p && p.z >= minZ && n && n.z <= maxZ){\n        if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n        if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n    while(p && p.z >= minZ){\n        if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n    while(n && n.z <= maxZ){\n        if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n    return true;\n}\nfunction cureLocalIntersections(start, triangles, dim) {\n    let p = start;\n    do {\n        const a = p.prev;\n        const b = p.next.next;\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n            removeNode(p);\n            removeNode(p.next);\n            p = start = b;\n        }\n        p = p.next;\n    }while (p !== start);\n    return filterPoints(p);\n}\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    let a = start;\n    do {\n        let b = a.next.next;\n        while(b !== a.prev){\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                let c = splitPolygon(a, b);\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n                earcutLinked(a, triangles, dim, minX, minY, invSize);\n                earcutLinked(c, triangles, dim, minX, minY, invSize);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    }while (a !== start);\n}\nfunction eliminateHoles(data, holeIndices, outerNode, dim, areas) {\n    const queue = [];\n    let i;\n    let len;\n    let start;\n    let end;\n    let list;\n    for(i = 0, len = holeIndices.length; i < len; i++){\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false, areas && areas[i + 1]);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n    queue.sort(compareX);\n    for(i = 0; i < queue.length; i++){\n        eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n    return outerNode;\n}\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\nfunction eliminateHole(hole, outerNode) {\n    outerNode = findHoleBridge(hole, outerNode);\n    if (outerNode) {\n        const b = splitPolygon(outerNode, hole);\n        filterPoints(outerNode, outerNode.next);\n        filterPoints(b, b.next);\n    }\n}\nfunction findHoleBridge(hole, outerNode) {\n    let p = outerNode;\n    const hx = hole.x;\n    const hy = hole.y;\n    let qx = -Infinity;\n    let m;\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    }while (p !== outerNode);\n    if (!m) return null;\n    if (hx === qx) return m;\n    const stop = m;\n    const mx = m.x;\n    const my = m.y;\n    let tanMin = Infinity;\n    let tan;\n    p = m;\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n            tan = Math.abs(hy - p.y) / (hx - p.x);\n            if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n        p = p.next;\n    }while (p !== stop);\n    return m;\n}\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\nfunction indexCurve(start, minX, minY, invSize) {\n    let p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    }while (p !== start);\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n    sortLinked(p);\n}\nfunction sortLinked(list) {\n    let e;\n    let i;\n    let inSize = 1;\n    let numMerges;\n    let p;\n    let pSize;\n    let q;\n    let qSize;\n    let tail;\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n        while(p){\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for(i = 0; i < inSize; i++){\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n            while(pSize > 0 || qSize > 0 && q){\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n                if (tail) tail.nextZ = e;\n                else list = e;\n                e.prevZ = tail;\n                tail = e;\n            }\n            p = q;\n        }\n        tail.nextZ = null;\n        inSize *= 2;\n    }while (numMerges > 1);\n    return list;\n}\nfunction zOrder(x, y, minX, minY, invSize) {\n    x = 32767 * (x - minX) * invSize;\n    y = 32767 * (y - minY) * invSize;\n    x = (x | x << 8) & 0x00ff00ff;\n    x = (x | x << 4) & 0x0f0f0f0f;\n    x = (x | x << 2) & 0x33333333;\n    x = (x | x << 1) & 0x55555555;\n    y = (y | y << 8) & 0x00ff00ff;\n    y = (y | y << 4) & 0x0f0f0f0f;\n    y = (y | y << 2) & 0x33333333;\n    y = (y | y << 1) & 0x55555555;\n    return x | y << 1;\n}\nfunction getLeftmost(start) {\n    let p = start;\n    let leftmost = start;\n    do {\n        if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;\n        p = p.next;\n    }while (p !== start);\n    return leftmost;\n}\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && (area(a.prev, a, b.prev) || area(a, b.prev, b)) || equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0);\n}\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\nfunction intersects(p1, q1, p2, q2) {\n    const o1 = sign(area(p1, q1, p2));\n    const o2 = sign(area(p1, q1, q2));\n    const o3 = sign(area(p2, q2, p1));\n    const o4 = sign(area(p2, q2, q1));\n    if (o1 !== o2 && o3 !== o4) return true;\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true;\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true;\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true;\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true;\n    return false;\n}\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\nfunction intersectsPolygon(a, b) {\n    let p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    }while (p !== a);\n    return false;\n}\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\nfunction middleInside(a, b) {\n    let p = a;\n    let inside = false;\n    const px = (a.x + b.x) / 2;\n    const py = (a.y + b.y) / 2;\n    do {\n        if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside;\n        p = p.next;\n    }while (p !== a);\n    return inside;\n}\nfunction splitPolygon(a, b) {\n    const a2 = new Node(a.i, a.x, a.y);\n    const b2 = new Node(b.i, b.x, b.y);\n    const an = a.next;\n    const bp = b.prev;\n    a.next = b;\n    b.prev = a;\n    a2.next = an;\n    an.prev = a2;\n    b2.next = a2;\n    a2.prev = b2;\n    bp.next = b2;\n    b2.prev = bp;\n    return b2;\n}\nfunction insertNode(i, x, y, last) {\n    const p = new Node(i, x, y);\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\nfunction Node(i, x, y) {\n    this.i = i;\n    this.x = x;\n    this.y = y;\n    this.prev = null;\n    this.next = null;\n    this.z = null;\n    this.prevZ = null;\n    this.nextZ = null;\n    this.steiner = false;\n}\n\n},{\"./polygon-utils\":\"4zyzk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1I8px\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"clipPolyline\", ()=>clipPolyline);\nparcelHelpers.export(exports, \"clipPolygon\", ()=>clipPolygon);\nparcelHelpers.export(exports, \"intersect\", ()=>intersect);\nparcelHelpers.export(exports, \"bitCode\", ()=>bitCode);\nvar _utils = require(\"./utils\");\nfunction clipPolyline(positions, bbox, options) {\n    const { size =2 , startIndex =0 , endIndex =positions.length  } = options || {};\n    const numPoints = (endIndex - startIndex) / size;\n    const result = [];\n    let part = [];\n    let a;\n    let b;\n    let codeA = -1;\n    let codeB;\n    let lastCode;\n    for(let i = 1; i < numPoints; i++){\n        a = (0, _utils.getPointAtIndex)(positions, i - 1, size, startIndex, a);\n        b = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, b);\n        if (codeA < 0) codeA = bitCode(a, bbox);\n        codeB = lastCode = bitCode(b, bbox);\n        while(true){\n            if (!(codeA | codeB)) {\n                (0, _utils.push)(part, a);\n                if (codeB !== lastCode) {\n                    (0, _utils.push)(part, b);\n                    if (i < numPoints - 1) {\n                        result.push(part);\n                        part = [];\n                    }\n                } else if (i === numPoints - 1) (0, _utils.push)(part, b);\n                break;\n            } else if (codeA & codeB) break;\n            else if (codeA) {\n                intersect(a, b, codeA, bbox, a);\n                codeA = bitCode(a, bbox);\n            } else {\n                intersect(a, b, codeB, bbox, b);\n                codeB = bitCode(b, bbox);\n            }\n        }\n        codeA = lastCode;\n    }\n    if (part.length) result.push(part);\n    return result;\n}\nfunction clipPolygon(positions, bbox, options) {\n    const { size =2 , endIndex =positions.length  } = options || {};\n    let { startIndex =0  } = options || {};\n    let numPoints = (endIndex - startIndex) / size;\n    let result;\n    let p;\n    let prev;\n    let inside;\n    let prevInside;\n    for(let edge = 1; edge <= 8; edge *= 2){\n        result = [];\n        prev = (0, _utils.getPointAtIndex)(positions, numPoints - 1, size, startIndex, prev);\n        prevInside = !(bitCode(prev, bbox) & edge);\n        for(let i = 0; i < numPoints; i++){\n            p = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, p);\n            inside = !(bitCode(p, bbox) & edge);\n            if (inside !== prevInside) (0, _utils.push)(result, intersect(prev, p, edge, bbox));\n            if (inside) (0, _utils.push)(result, p);\n            (0, _utils.copy)(prev, p);\n            prevInside = inside;\n        }\n        positions = result;\n        startIndex = 0;\n        numPoints = result.length / size;\n        if (!numPoints) break;\n    }\n    return result;\n}\nfunction intersect(a, b, edge, bbox, out = []) {\n    let t;\n    let snap;\n    if (edge & 8) {\n        t = (bbox[3] - a[1]) / (b[1] - a[1]);\n        snap = 3;\n    } else if (edge & 4) {\n        t = (bbox[1] - a[1]) / (b[1] - a[1]);\n        snap = 1;\n    } else if (edge & 2) {\n        t = (bbox[2] - a[0]) / (b[0] - a[0]);\n        snap = 2;\n    } else if (edge & 1) {\n        t = (bbox[0] - a[0]) / (b[0] - a[0]);\n        snap = 0;\n    } else return null;\n    for(let i = 0; i < a.length; i++)out[i] = (snap & 1) === i ? bbox[snap] : t * (b[i] - a[i]) + a[i];\n    return out;\n}\nfunction bitCode(p, bbox) {\n    let code = 0;\n    if (p[0] < bbox[0]) code |= 1;\n    else if (p[0] > bbox[2]) code |= 2;\n    if (p[1] < bbox[1]) code |= 4;\n    else if (p[1] > bbox[3]) code |= 8;\n    return code;\n}\n\n},{\"./utils\":\"7b2Ry\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7b2Ry\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"push\", ()=>push);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"getPointAtIndex\", ()=>getPointAtIndex);\nfunction push(target, source) {\n    const size = source.length;\n    const startIndex = target.length;\n    if (startIndex > 0) {\n        let isDuplicate = true;\n        for(let i = 0; i < size; i++)if (target[startIndex - size + i] !== source[i]) {\n            isDuplicate = false;\n            break;\n        }\n        if (isDuplicate) return false;\n    }\n    for(let i = 0; i < size; i++)target[startIndex + i] = source[i];\n    return true;\n}\nfunction copy(target, source) {\n    const size = source.length;\n    for(let i = 0; i < size; i++)target[i] = source[i];\n}\nfunction getPointAtIndex(positions, index, size, offset, out = []) {\n    const startI = offset + index * size;\n    for(let i = 0; i < size; i++)out[i] = positions[startI + i];\n    return out;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"geAhV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cutPolylineByGrid\", ()=>cutPolylineByGrid);\nparcelHelpers.export(exports, \"cutPolygonByGrid\", ()=>cutPolygonByGrid);\nvar _lineclip = require(\"./lineclip\");\nvar _utils = require(\"./utils\");\nfunction cutPolylineByGrid(positions, options) {\n    const { size =2 , broken =false , gridResolution =10 , gridOffset =[\n        0,\n        0\n    ] , startIndex =0 , endIndex =positions.length  } = options || {};\n    const numPoints = (endIndex - startIndex) / size;\n    let part = [];\n    const result = [\n        part\n    ];\n    const a = (0, _utils.getPointAtIndex)(positions, 0, size, startIndex);\n    let b;\n    let codeB;\n    const cell = getGridCell(a, gridResolution, gridOffset, []);\n    const scratchPoint = [];\n    (0, _utils.push)(part, a);\n    for(let i = 1; i < numPoints; i++){\n        b = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, b);\n        codeB = (0, _lineclip.bitCode)(b, cell);\n        while(codeB){\n            (0, _lineclip.intersect)(a, b, codeB, cell, scratchPoint);\n            const codeAlt = (0, _lineclip.bitCode)(scratchPoint, cell);\n            if (codeAlt) {\n                (0, _lineclip.intersect)(a, scratchPoint, codeAlt, cell, scratchPoint);\n                codeB = codeAlt;\n            }\n            (0, _utils.push)(part, scratchPoint);\n            (0, _utils.copy)(a, scratchPoint);\n            moveToNeighborCell(cell, gridResolution, codeB);\n            if (broken && part.length > size) {\n                part = [];\n                result.push(part);\n                (0, _utils.push)(part, a);\n            }\n            codeB = (0, _lineclip.bitCode)(b, cell);\n        }\n        (0, _utils.push)(part, b);\n        (0, _utils.copy)(a, b);\n    }\n    return broken ? result : result[0];\n}\nconst TYPE_INSIDE = 0;\nconst TYPE_BORDER = 1;\nfunction concatInPlace(arr1, arr2) {\n    for(let i = 0; i < arr2.length; i++)arr1.push(arr2[i]);\n    return arr1;\n}\nfunction cutPolygonByGrid(positions, holeIndices = null, options) {\n    if (!positions.length) return [];\n    const { size =2 , gridResolution =10 , gridOffset =[\n        0,\n        0\n    ] , edgeTypes =false  } = options || {};\n    const result = [];\n    const queue = [\n        {\n            pos: positions,\n            types: edgeTypes ? new Array(positions.length / size).fill(TYPE_BORDER) : null,\n            holes: holeIndices || []\n        }\n    ];\n    const bbox = [\n        [],\n        []\n    ];\n    let cell = [];\n    while(queue.length){\n        const { pos , types , holes  } = queue.shift();\n        getBoundingBox(pos, size, holes[0] || pos.length, bbox);\n        cell = getGridCell(bbox[0], gridResolution, gridOffset, cell);\n        const code = (0, _lineclip.bitCode)(bbox[1], cell);\n        if (code) {\n            let parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code);\n            const polygonLow = {\n                pos: parts[0].pos,\n                types: parts[0].types,\n                holes: []\n            };\n            const polygonHigh = {\n                pos: parts[1].pos,\n                types: parts[1].types,\n                holes: []\n            };\n            queue.push(polygonLow, polygonHigh);\n            for(let i = 0; i < holes.length; i++){\n                parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code);\n                if (parts[0]) {\n                    polygonLow.holes.push(polygonLow.pos.length);\n                    polygonLow.pos = concatInPlace(polygonLow.pos, parts[0].pos);\n                    if (edgeTypes) polygonLow.types = concatInPlace(polygonLow.types, parts[0].types);\n                }\n                if (parts[1]) {\n                    polygonHigh.holes.push(polygonHigh.pos.length);\n                    polygonHigh.pos = concatInPlace(polygonHigh.pos, parts[1].pos);\n                    if (edgeTypes) polygonHigh.types = concatInPlace(polygonHigh.types, parts[1].types);\n                }\n            }\n        } else {\n            const polygon = {\n                positions: pos\n            };\n            if (edgeTypes) polygon.edgeTypes = types;\n            if (holes.length) polygon.holeIndices = holes;\n            result.push(polygon);\n        }\n    }\n    return result;\n}\nfunction bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, edge) {\n    const numPoints = (endIndex - startIndex) / size;\n    const resultLow = [];\n    const resultHigh = [];\n    const typesLow = [];\n    const typesHigh = [];\n    const scratchPoint = [];\n    let p;\n    let side;\n    let type;\n    const prev = (0, _utils.getPointAtIndex)(positions, numPoints - 1, size, startIndex);\n    let prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]);\n    let prevType = edgeTypes && edgeTypes[numPoints - 1];\n    let lowPointCount = 0;\n    let highPointCount = 0;\n    for(let i = 0; i < numPoints; i++){\n        p = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, p);\n        side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]);\n        type = edgeTypes && edgeTypes[startIndex / size + i];\n        if (side && prevSide && prevSide !== side) {\n            (0, _lineclip.intersect)(prev, p, edge, bbox, scratchPoint);\n            (0, _utils.push)(resultLow, scratchPoint) && typesLow.push(prevType);\n            (0, _utils.push)(resultHigh, scratchPoint) && typesHigh.push(prevType);\n        }\n        if (side <= 0) {\n            (0, _utils.push)(resultLow, p) && typesLow.push(type);\n            lowPointCount -= side;\n        } else if (typesLow.length) typesLow[typesLow.length - 1] = TYPE_INSIDE;\n        if (side >= 0) {\n            (0, _utils.push)(resultHigh, p) && typesHigh.push(type);\n            highPointCount += side;\n        } else if (typesHigh.length) typesHigh[typesHigh.length - 1] = TYPE_INSIDE;\n        (0, _utils.copy)(prev, p);\n        prevSide = side;\n        prevType = type;\n    }\n    return [\n        lowPointCount ? {\n            pos: resultLow,\n            types: edgeTypes && typesLow\n        } : null,\n        highPointCount ? {\n            pos: resultHigh,\n            types: edgeTypes && typesHigh\n        } : null\n    ];\n}\nfunction getGridCell(p, gridResolution, gridOffset, out) {\n    const left = Math.floor((p[0] - gridOffset[0]) / gridResolution) * gridResolution + gridOffset[0];\n    const bottom = Math.floor((p[1] - gridOffset[1]) / gridResolution) * gridResolution + gridOffset[1];\n    out[0] = left;\n    out[1] = bottom;\n    out[2] = left + gridResolution;\n    out[3] = bottom + gridResolution;\n    return out;\n}\nfunction moveToNeighborCell(cell, gridResolution, edge) {\n    if (edge & 8) {\n        cell[1] += gridResolution;\n        cell[3] += gridResolution;\n    } else if (edge & 4) {\n        cell[1] -= gridResolution;\n        cell[3] -= gridResolution;\n    } else if (edge & 2) {\n        cell[0] += gridResolution;\n        cell[2] += gridResolution;\n    } else if (edge & 1) {\n        cell[0] -= gridResolution;\n        cell[2] -= gridResolution;\n    }\n}\nfunction getBoundingBox(positions, size, endIndex, out) {\n    let minX = Infinity;\n    let maxX = -Infinity;\n    let minY = Infinity;\n    let maxY = -Infinity;\n    for(let i = 0; i < endIndex; i += size){\n        const x = positions[i];\n        const y = positions[i + 1];\n        minX = x < minX ? x : minX;\n        maxX = x > maxX ? x : maxX;\n        minY = y < minY ? y : minY;\n        maxY = y > maxY ? y : maxY;\n    }\n    out[0][0] = minX;\n    out[0][1] = minY;\n    out[1][0] = maxX;\n    out[1][1] = maxY;\n    return out;\n}\n\n},{\"./lineclip\":\"1I8px\",\"./utils\":\"7b2Ry\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aks6V\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cutPolylineByMercatorBounds\", ()=>cutPolylineByMercatorBounds);\nparcelHelpers.export(exports, \"cutPolygonByMercatorBounds\", ()=>cutPolygonByMercatorBounds);\nvar _cutByGrid = require(\"./cut-by-grid\");\nvar _utils = require(\"./utils\");\nconst DEFAULT_MAX_LATITUDE = 85.051129;\nfunction cutPolylineByMercatorBounds(positions, options) {\n    const { size =2 , startIndex =0 , endIndex =positions.length , normalize =true  } = options || {};\n    const newPositions = positions.slice(startIndex, endIndex);\n    wrapLongitudesForShortestPath(newPositions, size, 0, endIndex - startIndex);\n    const parts = (0, _cutByGrid.cutPolylineByGrid)(newPositions, {\n        size,\n        broken: true,\n        gridResolution: 360,\n        gridOffset: [\n            -180,\n            -180\n        ]\n    });\n    if (normalize) for (const part of parts)shiftLongitudesIntoRange(part, size);\n    return parts;\n}\nfunction cutPolygonByMercatorBounds(positions, holeIndices = null, options) {\n    const { size =2 , normalize =true , edgeTypes =false  } = options || {};\n    holeIndices = holeIndices || [];\n    const newPositions = [];\n    const newHoleIndices = [];\n    let srcStartIndex = 0;\n    let targetIndex = 0;\n    for(let ringIndex = 0; ringIndex <= holeIndices.length; ringIndex++){\n        const srcEndIndex = holeIndices[ringIndex] || positions.length;\n        const targetStartIndex = targetIndex;\n        const splitIndex = findSplitIndex(positions, size, srcStartIndex, srcEndIndex);\n        for(let i = splitIndex; i < srcEndIndex; i++)newPositions[targetIndex++] = positions[i];\n        for(let i1 = srcStartIndex; i1 < splitIndex; i1++)newPositions[targetIndex++] = positions[i1];\n        wrapLongitudesForShortestPath(newPositions, size, targetStartIndex, targetIndex);\n        insertPoleVertices(newPositions, size, targetStartIndex, targetIndex, options === null || options === void 0 ? void 0 : options.maxLatitude);\n        srcStartIndex = srcEndIndex;\n        newHoleIndices[ringIndex] = targetIndex;\n    }\n    newHoleIndices.pop();\n    const parts = (0, _cutByGrid.cutPolygonByGrid)(newPositions, newHoleIndices, {\n        size,\n        gridResolution: 360,\n        gridOffset: [\n            -180,\n            -180\n        ],\n        edgeTypes\n    });\n    if (normalize) for (const part of parts)shiftLongitudesIntoRange(part.positions, size);\n    return parts;\n}\nfunction findSplitIndex(positions, size, startIndex, endIndex) {\n    let maxLat = -1;\n    let pointIndex = -1;\n    for(let i = startIndex + 1; i < endIndex; i += size){\n        const lat = Math.abs(positions[i]);\n        if (lat > maxLat) {\n            maxLat = lat;\n            pointIndex = i - 1;\n        }\n    }\n    return pointIndex;\n}\nfunction insertPoleVertices(positions, size, startIndex, endIndex, maxLatitude = DEFAULT_MAX_LATITUDE) {\n    const firstLng = positions[startIndex];\n    const lastLng = positions[endIndex - size];\n    if (Math.abs(firstLng - lastLng) > 180) {\n        const p = (0, _utils.getPointAtIndex)(positions, 0, size, startIndex);\n        p[0] += Math.round((lastLng - firstLng) / 360) * 360;\n        (0, _utils.push)(positions, p);\n        p[1] = Math.sign(p[1]) * maxLatitude;\n        (0, _utils.push)(positions, p);\n        p[0] = firstLng;\n        (0, _utils.push)(positions, p);\n    }\n}\nfunction wrapLongitudesForShortestPath(positions, size, startIndex, endIndex) {\n    let prevLng = positions[0];\n    let lng;\n    for(let i = startIndex; i < endIndex; i += size){\n        lng = positions[i];\n        const delta = lng - prevLng;\n        if (delta > 180 || delta < -180) lng -= Math.round(delta / 360) * 360;\n        positions[i] = prevLng = lng;\n    }\n}\nfunction shiftLongitudesIntoRange(positions, size) {\n    let refLng;\n    const pointCount = positions.length / size;\n    for(let i = 0; i < pointCount; i++){\n        refLng = positions[i * size];\n        if ((refLng + 180) % 360 !== 0) break;\n    }\n    const delta = -Math.round(refLng / 360) * 360;\n    if (delta === 0) return;\n    for(let i2 = 0; i2 < pointCount; i2++)positions[i2 * size] += delta;\n}\n\n},{\"./cut-by-grid\":\"geAhV\",\"./utils\":\"7b2Ry\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1WN0h\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME path-layer-vertex-shader\\n\\nattribute vec2 positions;\\n\\nattribute float instanceTypes;\\nattribute vec3 instanceStartPositions;\\nattribute vec3 instanceEndPositions;\\nattribute vec3 instanceLeftPositions;\\nattribute vec3 instanceRightPositions;\\nattribute vec3 instanceLeftPositions64Low;\\nattribute vec3 instanceStartPositions64Low;\\nattribute vec3 instanceEndPositions64Low;\\nattribute vec3 instanceRightPositions64Low;\\nattribute float instanceStrokeWidths;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\n\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\nuniform float jointType;\\nuniform float miterLimit;\\nuniform bool billboard;\\n\\nuniform float opacity;\\n\\nvarying vec4 vColor;\\nvarying vec2 vCornerOffset;\\nvarying float vMiterLength;\\nvarying vec2 vPathPosition;\\nvarying float vPathLength;\\n\\nconst float EPSILON = 0.001;\\nconst vec3 ZERO_OFFSET = vec3(0.0);\\n\\nfloat flipIfTrue(bool flag) {\\n  return -(float(flag) * 2. - 1.);\\n}\\nvec3 lineJoin(\\n  vec3 prevPoint, vec3 currPoint, vec3 nextPoint,\\n  vec2 width\\n) {\\n  bool isEnd = positions.x > 0.0;\\n  float sideOfPath = positions.y;\\n  float isJoint = float(sideOfPath == 0.0);\\n\\n  vec3 deltaA3 = (currPoint - prevPoint);\\n  vec3 deltaB3 = (nextPoint - currPoint);\\n\\n  mat3 rotationMatrix;\\n  bool needsRotation = !billboard && project_needs_rotation(currPoint, rotationMatrix);\\n  if (needsRotation) {\\n    deltaA3 = deltaA3 * rotationMatrix;\\n    deltaB3 = deltaB3 * rotationMatrix;\\n  }\\n  vec2 deltaA = deltaA3.xy / width;\\n  vec2 deltaB = deltaB3.xy / width;\\n\\n  float lenA = length(deltaA);\\n  float lenB = length(deltaB);\\n\\n  vec2 dirA = lenA > 0. ? normalize(deltaA) : vec2(0.0, 0.0);\\n  vec2 dirB = lenB > 0. ? normalize(deltaB) : vec2(0.0, 0.0);\\n\\n  vec2 perpA = vec2(-dirA.y, dirA.x);\\n  vec2 perpB = vec2(-dirB.y, dirB.x);\\n  vec2 tangent = dirA + dirB;\\n  tangent = length(tangent) > 0. ? normalize(tangent) : perpA;\\n  vec2 miterVec = vec2(-tangent.y, tangent.x);\\n  vec2 dir = isEnd ? dirA : dirB;\\n  vec2 perp = isEnd ? perpA : perpB;\\n  float L = isEnd ? lenA : lenB;\\n  float sinHalfA = abs(dot(miterVec, perp));\\n  float cosHalfA = abs(dot(dirA, miterVec));\\n  float turnDirection = flipIfTrue(dirA.x * dirB.y >= dirA.y * dirB.x);\\n  float cornerPosition = sideOfPath * turnDirection;\\n\\n  float miterSize = 1.0 / max(sinHalfA, EPSILON);\\n  miterSize = mix(\\n    min(miterSize, max(lenA, lenB) / max(cosHalfA, EPSILON)),\\n    miterSize,\\n    step(0.0, cornerPosition)\\n  );\\n\\n  vec2 offsetVec = mix(miterVec * miterSize, perp, step(0.5, cornerPosition))\\n    * (sideOfPath + isJoint * turnDirection);\\n  bool isStartCap = lenA == 0.0 || (!isEnd && (instanceTypes == 1.0 || instanceTypes == 3.0));\\n  bool isEndCap = lenB == 0.0 || (isEnd && (instanceTypes == 2.0 || instanceTypes == 3.0));\\n  bool isCap = isStartCap || isEndCap;\\n  if (isCap) {\\n    offsetVec = mix(perp * sideOfPath, dir * jointType * 4.0 * flipIfTrue(isStartCap), isJoint);\\n  }\\n  vPathLength = L;\\n  vCornerOffset = offsetVec;\\n  vMiterLength = dot(vCornerOffset, miterVec * turnDirection);\\n  vMiterLength = isCap ? isJoint : vMiterLength;\\n\\n  vec2 offsetFromStartOfPath = vCornerOffset + deltaA * float(isEnd);\\n  vPathPosition = vec2(\\n    dot(offsetFromStartOfPath, perp),\\n    dot(offsetFromStartOfPath, dir)\\n  );\\n  geometry.uv = vPathPosition;\\n\\n  float isValid = step(instanceTypes, 3.5);\\n  vec3 offset = vec3(offsetVec * width * isValid, 0.0);\\n\\n  if (needsRotation) {\\n    offset = rotationMatrix * offset;\\n  }\\n  return currPoint + offset;\\n}\\nvoid clipLine(inout vec4 position, vec4 refPosition) {\\n  if (position.w < EPSILON) {\\n    float r = (EPSILON - refPosition.w) / (position.w - refPosition.w);\\n    position = refPosition + (position - refPosition) * r;\\n  }\\n}\\n\\nvoid main() {\\n  geometry.worldPosition = instanceStartPositions;\\n  geometry.worldPositionAlt = instanceEndPositions;\\n  geometry.pickingColor = instancePickingColors;\\n\\n  vec2 widthPixels = vec2(clamp(project_size_to_pixel(instanceStrokeWidths * widthScale),\\n    widthMinPixels, widthMaxPixels) / 2.0);\\n  vec3 width;\\n\\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity);\\n\\n  float isEnd = positions.x;\\n\\n  vec3 prevPosition = mix(instanceLeftPositions, instanceStartPositions, isEnd);\\n  vec3 prevPosition64Low = mix(instanceLeftPositions64Low, instanceStartPositions64Low, isEnd);\\n\\n  vec3 currPosition = mix(instanceStartPositions, instanceEndPositions, isEnd);\\n  vec3 currPosition64Low = mix(instanceStartPositions64Low, instanceEndPositions64Low, isEnd);\\n\\n  vec3 nextPosition = mix(instanceEndPositions, instanceRightPositions, isEnd);\\n  vec3 nextPosition64Low = mix(instanceEndPositions64Low, instanceRightPositions64Low, isEnd);\\n\\n  if (billboard) {\\n    vec4 prevPositionScreen = project_position_to_clipspace(prevPosition, prevPosition64Low, ZERO_OFFSET);\\n    vec4 currPositionScreen = project_position_to_clipspace(currPosition, currPosition64Low, ZERO_OFFSET, geometry.position);\\n    vec4 nextPositionScreen = project_position_to_clipspace(nextPosition, nextPosition64Low, ZERO_OFFSET);\\n\\n    clipLine(prevPositionScreen, currPositionScreen);\\n    clipLine(nextPositionScreen, currPositionScreen);\\n    clipLine(currPositionScreen, mix(nextPositionScreen, prevPositionScreen, isEnd));\\n\\n    width = vec3(widthPixels, 0.0);\\n    DECKGL_FILTER_SIZE(width, geometry);\\n\\n    vec3 pos = lineJoin(\\n      prevPositionScreen.xyz / prevPositionScreen.w,\\n      currPositionScreen.xyz / currPositionScreen.w,\\n      nextPositionScreen.xyz / nextPositionScreen.w,\\n      project_pixel_size_to_clipspace(width.xy)\\n    );\\n\\n    gl_Position = vec4(pos * currPositionScreen.w, currPositionScreen.w);\\n  } else {\\n    prevPosition = project_position(prevPosition, prevPosition64Low);\\n    currPosition = project_position(currPosition, currPosition64Low);\\n    nextPosition = project_position(nextPosition, nextPosition64Low);\\n\\n    width = vec3(project_pixel_size(widthPixels), 0.0);\\n    DECKGL_FILTER_SIZE(width, geometry);\\n\\n    vec4 pos = vec4(\\n      lineJoin(prevPosition, currPosition, nextPosition, width.xy),\\n      1.0);\\n    geometry.position = pos;\\n    gl_Position = project_common_position_to_clipspace(pos);\\n  }\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lMUcF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME path-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform float jointType;\\nuniform float miterLimit;\\n\\nvarying vec4 vColor;\\nvarying vec2 vCornerOffset;\\nvarying float vMiterLength;\\nvarying vec2 vPathPosition;\\nvarying float vPathLength;\\n\\nvoid main(void) {\\n  geometry.uv = vPathPosition;\\n\\n  if (vPathPosition.y < 0.0 || vPathPosition.y > vPathLength) {\\n    if (jointType > 0.0 && length(vCornerOffset) > 1.0) {\\n      discard;\\n    }\\n    if (jointType == 0.0 && vMiterLength > miterLimit + 1.0) {\\n      discard;\\n    }\\n  }\\n  gl_FragColor = vColor;\\n\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gO9MA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PolygonLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _solidPolygonLayer = require(\"../solid-polygon-layer/solid-polygon-layer\");\nvar _solidPolygonLayerDefault = parcelHelpers.interopDefault(_solidPolygonLayer);\nvar _pathLayer = require(\"../path-layer/path-layer\");\nvar _pathLayerDefault = parcelHelpers.interopDefault(_pathLayer);\nvar _polygon = require(\"../solid-polygon-layer/polygon\");\nvar _utils = require(\"../utils\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar defaultLineColor = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultFillColor = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    stroked: true,\n    filled: true,\n    extruded: false,\n    elevationScale: 1,\n    wireframe: false,\n    _normalize: true,\n    lineWidthUnits: \"meters\",\n    lineWidthScale: 1,\n    lineWidthMinPixels: 0,\n    lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n    lineJointRounded: false,\n    lineMiterLimit: 4,\n    getPolygon: {\n        type: \"accessor\",\n        value: function value(f) {\n            return f.polygon;\n        }\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: defaultFillColor\n    },\n    getLineColor: {\n        type: \"accessor\",\n        value: defaultLineColor\n    },\n    getLineWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    getElevation: {\n        type: \"accessor\",\n        value: 1000\n    },\n    material: true\n};\nvar PolygonLayer = function(_CompositeLayer) {\n    (0, _inheritsDefault.default)(PolygonLayer1, _CompositeLayer);\n    var _super = _createSuper(PolygonLayer1);\n    function PolygonLayer1() {\n        (0, _classCallCheckDefault.default)(this, PolygonLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(PolygonLayer1, [\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.state = {\n                    paths: []\n                };\n                if (this.props.getLineDashArray) (0, _core.log).removed(\"getLineDashArray\", \"PathStyleExtension\")();\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var _this = this;\n                var oldProps = _ref.oldProps, props = _ref.props, changeFlags = _ref.changeFlags;\n                var geometryChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPolygon);\n                if (geometryChanged && Array.isArray(changeFlags.dataChanged)) {\n                    var paths = this.state.paths.slice();\n                    var pathsDiff = changeFlags.dataChanged.map(function(dataRange) {\n                        return (0, _utils.replaceInRange)({\n                            data: paths,\n                            getIndex: function getIndex(p) {\n                                return p.__source.index;\n                            },\n                            dataRange: dataRange,\n                            replace: _this._getPaths(dataRange)\n                        });\n                    });\n                    this.setState({\n                        paths: paths,\n                        pathsDiff: pathsDiff\n                    });\n                } else if (geometryChanged) this.setState({\n                    paths: this._getPaths(),\n                    pathsDiff: null\n                });\n            }\n        },\n        {\n            key: \"_getPaths\",\n            value: function _getPaths() {\n                var dataRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _this$props = this.props, data = _this$props.data, getPolygon = _this$props.getPolygon, positionFormat = _this$props.positionFormat, _normalize = _this$props._normalize;\n                var paths = [];\n                var positionSize = positionFormat === \"XY\" ? 2 : 3;\n                var startRow = dataRange.startRow, endRow = dataRange.endRow;\n                var _createIterable = (0, _core.createIterable)(data, startRow, endRow), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n                var _iterator = _createForOfIteratorHelper(iterable), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var object = _step.value;\n                        objectInfo.index++;\n                        var polygon = getPolygon(object, objectInfo);\n                        if (_normalize) polygon = _polygon.normalize(polygon, positionSize);\n                        var _polygon1 = polygon, holeIndices = _polygon1.holeIndices;\n                        var positions = polygon.positions || polygon;\n                        if (holeIndices) for(var i = 0; i <= holeIndices.length; i++){\n                            var path = positions.slice(holeIndices[i - 1] || 0, holeIndices[i] || positions.length);\n                            paths.push(this.getSubLayerRow({\n                                path: path\n                            }, object, objectInfo.index));\n                        }\n                        else paths.push(this.getSubLayerRow({\n                            path: positions\n                        }, object, objectInfo.index));\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return paths;\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers() {\n                var _this$props2 = this.props, data = _this$props2.data, _dataDiff = _this$props2._dataDiff, stroked = _this$props2.stroked, filled = _this$props2.filled, extruded = _this$props2.extruded, wireframe = _this$props2.wireframe, _normalize = _this$props2._normalize, elevationScale = _this$props2.elevationScale, transitions = _this$props2.transitions, positionFormat = _this$props2.positionFormat;\n                var _this$props3 = this.props, lineWidthUnits = _this$props3.lineWidthUnits, lineWidthScale = _this$props3.lineWidthScale, lineWidthMinPixels = _this$props3.lineWidthMinPixels, lineWidthMaxPixels = _this$props3.lineWidthMaxPixels, lineJointRounded = _this$props3.lineJointRounded, lineMiterLimit = _this$props3.lineMiterLimit, lineDashJustified = _this$props3.lineDashJustified;\n                var _this$props4 = this.props, getFillColor = _this$props4.getFillColor, getLineColor = _this$props4.getLineColor, getLineWidth = _this$props4.getLineWidth, getLineDashArray = _this$props4.getLineDashArray, getElevation = _this$props4.getElevation, getPolygon = _this$props4.getPolygon, updateTriggers = _this$props4.updateTriggers, material = _this$props4.material;\n                var _this$state = this.state, paths = _this$state.paths, pathsDiff = _this$state.pathsDiff;\n                var FillLayer = this.getSubLayerClass(\"fill\", (0, _solidPolygonLayerDefault.default));\n                var StrokeLayer = this.getSubLayerClass(\"stroke\", (0, _pathLayerDefault.default));\n                var polygonLayer = this.shouldRenderSubLayer(\"fill\", paths) && new FillLayer({\n                    _dataDiff: _dataDiff,\n                    extruded: extruded,\n                    elevationScale: elevationScale,\n                    filled: filled,\n                    wireframe: wireframe,\n                    _normalize: _normalize,\n                    getElevation: getElevation,\n                    getFillColor: getFillColor,\n                    getLineColor: extruded && wireframe ? getLineColor : defaultLineColor,\n                    material: material,\n                    transitions: transitions\n                }, this.getSubLayerProps({\n                    id: \"fill\",\n                    updateTriggers: {\n                        getPolygon: updateTriggers.getPolygon,\n                        getElevation: updateTriggers.getElevation,\n                        getFillColor: updateTriggers.getFillColor,\n                        lineColors: extruded && wireframe,\n                        getLineColor: updateTriggers.getLineColor\n                    }\n                }), {\n                    data: data,\n                    positionFormat: positionFormat,\n                    getPolygon: getPolygon\n                });\n                var polygonLineLayer = !extruded && stroked && this.shouldRenderSubLayer(\"stroke\", paths) && new StrokeLayer({\n                    _dataDiff: pathsDiff && function() {\n                        return pathsDiff;\n                    },\n                    widthUnits: lineWidthUnits,\n                    widthScale: lineWidthScale,\n                    widthMinPixels: lineWidthMinPixels,\n                    widthMaxPixels: lineWidthMaxPixels,\n                    rounded: lineJointRounded,\n                    miterLimit: lineMiterLimit,\n                    dashJustified: lineDashJustified,\n                    _pathType: \"loop\",\n                    transitions: transitions && {\n                        getWidth: transitions.getLineWidth,\n                        getColor: transitions.getLineColor,\n                        getPath: transitions.getPolygon\n                    },\n                    getColor: this.getSubLayerAccessor(getLineColor),\n                    getWidth: this.getSubLayerAccessor(getLineWidth),\n                    getDashArray: this.getSubLayerAccessor(getLineDashArray)\n                }, this.getSubLayerProps({\n                    id: \"stroke\",\n                    updateTriggers: {\n                        getWidth: updateTriggers.getLineWidth,\n                        getColor: updateTriggers.getLineColor,\n                        getDashArray: updateTriggers.getLineDashArray\n                    }\n                }), {\n                    data: paths,\n                    positionFormat: positionFormat,\n                    getPath: function getPath(x) {\n                        return x.path;\n                    }\n                });\n                return [\n                    !extruded && polygonLayer,\n                    polygonLineLayer,\n                    extruded && polygonLayer\n                ];\n            }\n        }\n    ]);\n    return PolygonLayer1;\n}((0, _core.CompositeLayer));\nPolygonLayer.layerName = \"PolygonLayer\";\nPolygonLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"../solid-polygon-layer/solid-polygon-layer\":\"51B0l\",\"../path-layer/path-layer\":\"fUUc7\",\"../solid-polygon-layer/polygon\":\"5n0bD\",\"../utils\":\"avoFf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"51B0l\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>SolidPolygonLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _polygonTesselator = require(\"./polygon-tesselator\");\nvar _polygonTesselatorDefault = parcelHelpers.interopDefault(_polygonTesselator);\nvar _solidPolygonLayerVertexTopGlsl = require(\"./solid-polygon-layer-vertex-top.glsl\");\nvar _solidPolygonLayerVertexTopGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerVertexTopGlsl);\nvar _solidPolygonLayerVertexSideGlsl = require(\"./solid-polygon-layer-vertex-side.glsl\");\nvar _solidPolygonLayerVertexSideGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerVertexSideGlsl);\nvar _solidPolygonLayerFragmentGlsl = require(\"./solid-polygon-layer-fragment.glsl\");\nvar _solidPolygonLayerFragmentGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    filled: true,\n    extruded: false,\n    wireframe: false,\n    _normalize: true,\n    elevationScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    getPolygon: {\n        type: \"accessor\",\n        value: function value(f) {\n            return f.polygon;\n        }\n    },\n    getElevation: {\n        type: \"accessor\",\n        value: 1000\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    material: true\n};\nvar ATTRIBUTE_TRANSITION = {\n    enter: function enter(value, chunk) {\n        return chunk.length ? chunk.subarray(chunk.length - value.length) : value;\n    }\n};\nvar SolidPolygonLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(SolidPolygonLayer1, _Layer);\n    var _super = _createSuper(SolidPolygonLayer1);\n    function SolidPolygonLayer1() {\n        (0, _classCallCheckDefault.default)(this, SolidPolygonLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(SolidPolygonLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders(vs) {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(SolidPolygonLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: vs,\n                    fs: (0, _solidPolygonLayerFragmentGlslDefault.default),\n                    defines: {},\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.gouraudLighting),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                var _this$context = this.context, gl = _this$context.gl, viewport = _this$context.viewport;\n                var coordinateSystem = this.props.coordinateSystem;\n                if (viewport.isGeospatial && coordinateSystem === (0, _core.COORDINATE_SYSTEM).DEFAULT) coordinateSystem = (0, _core.COORDINATE_SYSTEM).LNGLAT;\n                this.setState({\n                    numInstances: 0,\n                    polygonTesselator: new (0, _polygonTesselatorDefault.default)({\n                        preproject: coordinateSystem === (0, _core.COORDINATE_SYSTEM).LNGLAT && viewport.projectFlat,\n                        fp64: this.use64bitPositions(),\n                        IndexType: !gl || (0, _core1.hasFeatures)(gl, (0, _core1.FEATURES).ELEMENT_INDEX_UINT32) ? Uint32Array : Uint16Array\n                    })\n                });\n                var attributeManager = this.getAttributeManager();\n                var noAlloc = true;\n                attributeManager.remove([\n                    \"instancePickingColors\"\n                ]);\n                attributeManager.add({\n                    indices: {\n                        size: 1,\n                        isIndexed: true,\n                        update: this.calculateIndices,\n                        noAlloc: noAlloc\n                    },\n                    positions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getPolygon\",\n                        update: this.calculatePositions,\n                        noAlloc: noAlloc,\n                        shaderAttributes: {\n                            positions: {\n                                vertexOffset: 0,\n                                divisor: 0\n                            },\n                            instancePositions: {\n                                vertexOffset: 0,\n                                divisor: 1\n                            },\n                            nextPositions: {\n                                vertexOffset: 1,\n                                divisor: 1\n                            }\n                        }\n                    },\n                    vertexValid: {\n                        size: 1,\n                        divisor: 1,\n                        type: 5121,\n                        update: this.calculateVertexValid,\n                        noAlloc: noAlloc\n                    },\n                    elevations: {\n                        size: 1,\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getElevation\",\n                        shaderAttributes: {\n                            elevations: {\n                                divisor: 0\n                            },\n                            instanceElevations: {\n                                divisor: 1\n                            }\n                        }\n                    },\n                    fillColors: {\n                        alias: \"colors\",\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getFillColor\",\n                        defaultValue: DEFAULT_COLOR,\n                        shaderAttributes: {\n                            fillColors: {\n                                divisor: 0\n                            },\n                            instanceFillColors: {\n                                divisor: 1\n                            }\n                        }\n                    },\n                    lineColors: {\n                        alias: \"colors\",\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getLineColor\",\n                        defaultValue: DEFAULT_COLOR,\n                        shaderAttributes: {\n                            lineColors: {\n                                divisor: 0\n                            },\n                            instanceLineColors: {\n                                divisor: 1\n                            }\n                        }\n                    },\n                    pickingColors: {\n                        size: 3,\n                        type: 5121,\n                        accessor: function accessor(object, _ref) {\n                            var index = _ref.index, value = _ref.target;\n                            return _this.encodePickingColor(object && object.__source ? object.__source.index : index, value);\n                        },\n                        shaderAttributes: {\n                            pickingColors: {\n                                divisor: 0\n                            },\n                            instancePickingColors: {\n                                divisor: 1\n                            }\n                        }\n                    }\n                });\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(params) {\n                var info = (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(SolidPolygonLayer1.prototype), \"getPickingInfo\", this).call(this, params);\n                var index = info.index;\n                var data = this.props.data;\n                if (data[0] && data[0].__source) info.object = data.find(function(d) {\n                    return d.__source.index === index;\n                });\n                return info;\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var _this$props = this.props, extruded = _this$props.extruded, filled = _this$props.filled, wireframe = _this$props.wireframe, elevationScale = _this$props.elevationScale;\n                var _this$state = this.state, topModel = _this$state.topModel, sideModel = _this$state.sideModel, polygonTesselator = _this$state.polygonTesselator;\n                var renderUniforms = Object.assign({}, uniforms, {\n                    extruded: Boolean(extruded),\n                    elevationScale: elevationScale\n                });\n                if (sideModel) {\n                    sideModel.setInstanceCount(polygonTesselator.instanceCount - 1);\n                    sideModel.setUniforms(renderUniforms);\n                    if (wireframe) {\n                        sideModel.setDrawMode(3);\n                        sideModel.setUniforms({\n                            isWireframe: true\n                        }).draw();\n                    }\n                    if (filled) {\n                        sideModel.setDrawMode(6);\n                        sideModel.setUniforms({\n                            isWireframe: false\n                        }).draw();\n                    }\n                }\n                if (topModel) {\n                    topModel.setVertexCount(polygonTesselator.vertexCount);\n                    topModel.setUniforms(renderUniforms).draw();\n                }\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(updateParams) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(SolidPolygonLayer1.prototype), \"updateState\", this).call(this, updateParams);\n                this.updateGeometry(updateParams);\n                var props = updateParams.props, oldProps = updateParams.oldProps, changeFlags = updateParams.changeFlags;\n                var attributeManager = this.getAttributeManager();\n                var regenerateModels = changeFlags.extensionsChanged || props.filled !== oldProps.filled || props.extruded !== oldProps.extruded;\n                if (regenerateModels) {\n                    if (this.state.models) this.state.models.forEach(function(model) {\n                        return model[\"delete\"]();\n                    });\n                    this.setState(this._getModels(this.context.gl));\n                    attributeManager.invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"updateGeometry\",\n            value: function updateGeometry(_ref3) {\n                var props = _ref3.props, oldProps = _ref3.oldProps, changeFlags = _ref3.changeFlags;\n                var geometryConfigChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPolygon);\n                if (geometryConfigChanged) {\n                    var polygonTesselator = this.state.polygonTesselator;\n                    var buffers = props.data.attributes || {};\n                    polygonTesselator.updateGeometry({\n                        data: props.data,\n                        normalize: props._normalize,\n                        geometryBuffer: buffers.getPolygon,\n                        buffers: buffers,\n                        getGeometry: props.getPolygon,\n                        positionFormat: props.positionFormat,\n                        wrapLongitude: props.wrapLongitude,\n                        resolution: this.context.viewport.resolution,\n                        fp64: this.use64bitPositions(),\n                        dataChanged: changeFlags.dataChanged\n                    });\n                    this.setState({\n                        numInstances: polygonTesselator.instanceCount,\n                        startIndices: polygonTesselator.vertexStarts\n                    });\n                    if (!changeFlags.dataChanged) this.getAttributeManager().invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"_getModels\",\n            value: function _getModels(gl) {\n                var _this$props2 = this.props, id = _this$props2.id, filled = _this$props2.filled, extruded = _this$props2.extruded;\n                var topModel;\n                var sideModel;\n                if (filled) {\n                    var shaders = this.getShaders((0, _solidPolygonLayerVertexTopGlslDefault.default));\n                    shaders.defines.NON_INSTANCED_MODEL = 1;\n                    topModel = new (0, _core1.Model)(gl, Object.assign({}, shaders, {\n                        id: \"\".concat(id, \"-top\"),\n                        drawMode: 4,\n                        attributes: {\n                            vertexPositions: new Float32Array([\n                                0,\n                                1\n                            ])\n                        },\n                        uniforms: {\n                            isWireframe: false,\n                            isSideVertex: false\n                        },\n                        vertexCount: 0,\n                        isIndexed: true\n                    }));\n                }\n                if (extruded) {\n                    sideModel = new (0, _core1.Model)(gl, Object.assign({}, this.getShaders((0, _solidPolygonLayerVertexSideGlslDefault.default)), {\n                        id: \"\".concat(id, \"-side\"),\n                        geometry: new (0, _core1.Geometry)({\n                            drawMode: 1,\n                            vertexCount: 4,\n                            attributes: {\n                                vertexPositions: {\n                                    size: 2,\n                                    value: new Float32Array([\n                                        1,\n                                        0,\n                                        0,\n                                        0,\n                                        0,\n                                        1,\n                                        1,\n                                        1\n                                    ])\n                                }\n                            }\n                        }),\n                        instanceCount: 0,\n                        isInstanced: 1\n                    }));\n                    sideModel.userData.excludeAttributes = {\n                        indices: true\n                    };\n                }\n                return {\n                    models: [\n                        sideModel,\n                        topModel\n                    ].filter(Boolean),\n                    topModel: topModel,\n                    sideModel: sideModel\n                };\n            }\n        },\n        {\n            key: \"calculateIndices\",\n            value: function calculateIndices(attribute) {\n                var polygonTesselator = this.state.polygonTesselator;\n                attribute.startIndices = polygonTesselator.indexStarts;\n                attribute.value = polygonTesselator.get(\"indices\");\n            }\n        },\n        {\n            key: \"calculatePositions\",\n            value: function calculatePositions(attribute) {\n                var polygonTesselator = this.state.polygonTesselator;\n                attribute.startIndices = polygonTesselator.vertexStarts;\n                attribute.value = polygonTesselator.get(\"positions\");\n            }\n        },\n        {\n            key: \"calculateVertexValid\",\n            value: function calculateVertexValid(attribute) {\n                attribute.value = this.state.polygonTesselator.get(\"vertexValid\");\n            }\n        },\n        {\n            key: \"wrapLongitude\",\n            get: function get() {\n                return false;\n            }\n        }\n    ]);\n    return SolidPolygonLayer1;\n}((0, _core.Layer));\nSolidPolygonLayer.layerName = \"SolidPolygonLayer\";\nSolidPolygonLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"@luma.gl/core\":\"WBJLR\",\"./polygon-tesselator\":\"9gYBw\",\"./solid-polygon-layer-vertex-top.glsl\":\"fNVVH\",\"./solid-polygon-layer-vertex-side.glsl\":\"cMUy7\",\"./solid-polygon-layer-fragment.glsl\":\"jazMA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9gYBw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PolygonTesselator);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _polygon = require(\"./polygon\");\nvar _core = require(\"@deck.gl/core\");\nvar _polygon1 = require(\"@math.gl/polygon\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar PolygonTesselator = function(_Tesselator) {\n    (0, _inheritsDefault.default)(PolygonTesselator1, _Tesselator);\n    var _super = _createSuper(PolygonTesselator1);\n    function PolygonTesselator1(opts) {\n        (0, _classCallCheckDefault.default)(this, PolygonTesselator1);\n        var fp64 = opts.fp64, _opts$IndexType = opts.IndexType, IndexType = _opts$IndexType === void 0 ? Uint32Array : _opts$IndexType;\n        return _super.call(this, _objectSpread(_objectSpread({}, opts), {}, {\n            attributes: {\n                positions: {\n                    size: 3,\n                    type: fp64 ? Float64Array : Float32Array\n                },\n                vertexValid: {\n                    type: Uint8ClampedArray,\n                    size: 1\n                },\n                indices: {\n                    type: IndexType,\n                    size: 1\n                }\n            }\n        }));\n    }\n    (0, _createClassDefault.default)(PolygonTesselator1, [\n        {\n            key: \"get\",\n            value: function get(attributeName) {\n                var attributes = this.attributes;\n                if (attributeName === \"indices\") return attributes.indices && attributes.indices.subarray(0, this.vertexCount);\n                return attributes[attributeName];\n            }\n        },\n        {\n            key: \"updateGeometry\",\n            value: function updateGeometry(opts) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PolygonTesselator1.prototype), \"updateGeometry\", this).call(this, opts);\n                var externalIndices = this.buffers.indices;\n                if (externalIndices) this.vertexCount = (externalIndices.value || externalIndices).length;\n            }\n        },\n        {\n            key: \"normalizeGeometry\",\n            value: function normalizeGeometry(polygon) {\n                if (this.normalize) {\n                    polygon = _polygon.normalize(polygon, this.positionSize);\n                    if (this.opts.resolution) return (0, _polygon1.cutPolygonByGrid)(polygon.positions || polygon, polygon.holeIndices, {\n                        size: this.positionSize,\n                        gridResolution: this.opts.resolution,\n                        edgeTypes: true\n                    });\n                    if (this.opts.wrapLongitude) return (0, _polygon1.cutPolygonByMercatorBounds)(polygon.positions || polygon, polygon.holeIndices, {\n                        size: this.positionSize,\n                        maxLatitude: 86,\n                        edgeTypes: true\n                    });\n                }\n                return polygon;\n            }\n        },\n        {\n            key: \"getGeometrySize\",\n            value: function getGeometrySize(polygon) {\n                if (Array.isArray(polygon) && !Number.isFinite(polygon[0])) {\n                    var size = 0;\n                    var _iterator = _createForOfIteratorHelper(polygon), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var subPolygon = _step.value;\n                            size += this.getGeometrySize(subPolygon);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    return size;\n                }\n                return (polygon.positions || polygon).length / this.positionSize;\n            }\n        },\n        {\n            key: \"getGeometryFromBuffer\",\n            value: function getGeometryFromBuffer(buffer) {\n                if (this.normalize || !this.buffers.indices) return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PolygonTesselator1.prototype), \"getGeometryFromBuffer\", this).call(this, buffer);\n                return function() {\n                    return null;\n                };\n            }\n        },\n        {\n            key: \"updateGeometryAttributes\",\n            value: function updateGeometryAttributes(polygon, context) {\n                if (Array.isArray(polygon) && !Number.isFinite(polygon[0])) {\n                    var _iterator2 = _createForOfIteratorHelper(polygon), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var subPolygon = _step2.value;\n                            var geometrySize = this.getGeometrySize(subPolygon);\n                            context.geometrySize = geometrySize;\n                            this.updateGeometryAttributes(subPolygon, context);\n                            context.vertexStart += geometrySize;\n                            context.indexStart = this.indexStarts[context.geometryIndex + 1];\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                } else {\n                    this._updateIndices(polygon, context);\n                    this._updatePositions(polygon, context);\n                    this._updateVertexValid(polygon, context);\n                }\n            }\n        },\n        {\n            key: \"_updateIndices\",\n            value: function _updateIndices(polygon, _ref) {\n                var geometryIndex = _ref.geometryIndex, offset = _ref.vertexStart, indexStart = _ref.indexStart;\n                var attributes = this.attributes, indexStarts = this.indexStarts, typedArrayManager = this.typedArrayManager;\n                var target = attributes.indices;\n                if (!target) return;\n                var i = indexStart;\n                var indices = _polygon.getSurfaceIndices(polygon, this.positionSize, this.opts.preproject);\n                target = typedArrayManager.allocate(target, indexStart + indices.length, {\n                    copy: true\n                });\n                for(var j = 0; j < indices.length; j++)target[i++] = indices[j] + offset;\n                indexStarts[geometryIndex + 1] = indexStart + indices.length;\n                attributes.indices = target;\n            }\n        },\n        {\n            key: \"_updatePositions\",\n            value: function _updatePositions(polygon, _ref2) {\n                var vertexStart = _ref2.vertexStart, geometrySize = _ref2.geometrySize;\n                var positions = this.attributes.positions, positionSize = this.positionSize;\n                if (!positions) return;\n                var polygonPositions = polygon.positions || polygon;\n                for(var i = vertexStart, j = 0; j < geometrySize; i++, j++){\n                    var x = polygonPositions[j * positionSize];\n                    var y = polygonPositions[j * positionSize + 1];\n                    var z = positionSize > 2 ? polygonPositions[j * positionSize + 2] : 0;\n                    positions[i * 3] = x;\n                    positions[i * 3 + 1] = y;\n                    positions[i * 3 + 2] = z;\n                }\n            }\n        },\n        {\n            key: \"_updateVertexValid\",\n            value: function _updateVertexValid(polygon, _ref3) {\n                var vertexStart = _ref3.vertexStart, geometrySize = _ref3.geometrySize;\n                var vertexValid = this.attributes.vertexValid, positionSize = this.positionSize;\n                var holeIndices = polygon && polygon.holeIndices;\n                if (polygon && polygon.edgeTypes) vertexValid.set(polygon.edgeTypes, vertexStart);\n                else vertexValid.fill(1, vertexStart, vertexStart + geometrySize);\n                if (holeIndices) for(var j = 0; j < holeIndices.length; j++)vertexValid[vertexStart + holeIndices[j] / positionSize - 1] = 0;\n                vertexValid[vertexStart + geometrySize - 1] = 0;\n            }\n        }\n    ]);\n    return PolygonTesselator1;\n}((0, _core.Tesselator));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"./polygon\":\"5n0bD\",\"@deck.gl/core\":\"gu68g\",\"@math.gl/polygon\":\"e5A4M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5n0bD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalize\", ()=>normalize);\nparcelHelpers.export(exports, \"getSurfaceIndices\", ()=>getSurfaceIndices);\nvar _earcut = require(\"earcut\");\nvar _earcutDefault = parcelHelpers.interopDefault(_earcut);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction validate(polygon) {\n    polygon = polygon && polygon.positions || polygon;\n    if (!Array.isArray(polygon) && !ArrayBuffer.isView(polygon)) throw new Error(\"invalid polygon\");\n}\nfunction isSimple(polygon) {\n    return polygon.length >= 1 && polygon[0].length >= 2 && Number.isFinite(polygon[0][0]);\n}\nfunction isNestedRingClosed(simplePolygon) {\n    var p0 = simplePolygon[0];\n    var p1 = simplePolygon[simplePolygon.length - 1];\n    return p0[0] === p1[0] && p0[1] === p1[1] && p0[2] === p1[2];\n}\nfunction isFlatRingClosed(positions, size, startIndex, endIndex) {\n    for(var i = 0; i < size; i++){\n        if (positions[startIndex + i] !== positions[endIndex - size + i]) return false;\n    }\n    return true;\n}\nfunction copyNestedRing(target, targetStartIndex, simplePolygon, size) {\n    var targetIndex = targetStartIndex;\n    var len = simplePolygon.length;\n    for(var i = 0; i < len; i++)for(var j = 0; j < size; j++)target[targetIndex++] = simplePolygon[i][j] || 0;\n    if (!isNestedRingClosed(simplePolygon)) for(var _j = 0; _j < size; _j++)target[targetIndex++] = simplePolygon[0][_j] || 0;\n    return targetIndex;\n}\nfunction copyFlatRing(target, targetStartIndex, positions, size) {\n    var srcStartIndex = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n    var srcEndIndex = arguments.length > 5 ? arguments[5] : undefined;\n    srcEndIndex = srcEndIndex || positions.length;\n    var srcLength = srcEndIndex - srcStartIndex;\n    if (srcLength <= 0) return targetStartIndex;\n    var targetIndex = targetStartIndex;\n    for(var i = 0; i < srcLength; i++)target[targetIndex++] = positions[srcStartIndex + i];\n    if (!isFlatRingClosed(positions, size, srcStartIndex, srcEndIndex)) for(var _i = 0; _i < size; _i++)target[targetIndex++] = positions[srcStartIndex + _i];\n    return targetIndex;\n}\nfunction normalize(polygon, positionSize) {\n    validate(polygon);\n    var positions = [];\n    var holeIndices = [];\n    if (polygon.positions) {\n        var _polygon = polygon, srcPositions = _polygon.positions, srcHoleIndices = _polygon.holeIndices;\n        if (srcHoleIndices) {\n            var targetIndex = 0;\n            for(var i = 0; i <= srcHoleIndices.length; i++){\n                targetIndex = copyFlatRing(positions, targetIndex, srcPositions, positionSize, srcHoleIndices[i - 1], srcHoleIndices[i]);\n                holeIndices.push(targetIndex);\n            }\n            holeIndices.pop();\n            return {\n                positions: positions,\n                holeIndices: holeIndices\n            };\n        }\n        polygon = srcPositions;\n    }\n    if (Number.isFinite(polygon[0])) {\n        copyFlatRing(positions, 0, polygon, positionSize);\n        return positions;\n    }\n    if (!isSimple(polygon)) {\n        var _targetIndex = 0;\n        var _iterator = _createForOfIteratorHelper(polygon), _step;\n        try {\n            for(_iterator.s(); !(_step = _iterator.n()).done;){\n                var simplePolygon = _step.value;\n                _targetIndex = copyNestedRing(positions, _targetIndex, simplePolygon, positionSize);\n                holeIndices.push(_targetIndex);\n            }\n        } catch (err) {\n            _iterator.e(err);\n        } finally{\n            _iterator.f();\n        }\n        holeIndices.pop();\n        return {\n            positions: positions,\n            holeIndices: holeIndices\n        };\n    }\n    copyNestedRing(positions, 0, polygon, positionSize);\n    return positions;\n}\nfunction getSurfaceIndices(normalizedPolygon, positionSize, preproject) {\n    var holeIndices = null;\n    if (normalizedPolygon.holeIndices) holeIndices = normalizedPolygon.holeIndices.map(function(positionIndex) {\n        return positionIndex / positionSize;\n    });\n    var positions = normalizedPolygon.positions || normalizedPolygon;\n    if (preproject) {\n        var n = positions.length;\n        positions = positions.slice();\n        var p = [];\n        for(var i = 0; i < n; i += positionSize){\n            p[0] = positions[i];\n            p[1] = positions[i + 1];\n            var xy = preproject(p);\n            positions[i] = xy[0];\n            positions[i + 1] = xy[1];\n        }\n    }\n    return (0, _earcutDefault.default)(positions, holeIndices, positionSize);\n}\n\n},{\"earcut\":\"etb9E\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"etb9E\":[function(require,module,exports) {\n\"use strict\";\nmodule.exports = earcut;\nmodule.exports.default = earcut;\nfunction earcut(data, holeIndices, dim) {\n    dim = dim || 2;\n    var hasHoles = holeIndices && holeIndices.length, outerLen = hasHoles ? holeIndices[0] * dim : data.length, outerNode = linkedList(data, 0, outerLen, dim, true), triangles = [];\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n    var minX, minY, maxX, maxY, x, y, invSize;\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n        for(var i = dim; i < outerLen; i += dim){\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 1 / invSize : 0;\n    }\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n    return triangles;\n}\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n    if (clockwise === signedArea(data, start, end, dim) > 0) for(i = start; i < end; i += dim)last = insertNode(i, data[i], data[i + 1], last);\n    else for(i = end - dim; i >= start; i -= dim)last = insertNode(i, data[i], data[i + 1], last);\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n    return last;\n}\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n    var p = start, again;\n    do {\n        again = false;\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n        } else p = p.next;\n    }while (again || p !== end);\n    return end;\n}\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n    var stop = ear, prev, next;\n    // iterate through ears, slicing them one by one\n    while(ear.prev !== ear.next){\n        prev = ear.prev;\n        next = ear.next;\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n            removeNode(ear);\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n            continue;\n        }\n        ear = next;\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n            else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            break;\n        }\n    }\n}\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    var a = ear.prev, b = ear, c = ear.next;\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n    // now make sure we don't have other points inside the potential ear\n    var p = ear.next.next;\n    while(p !== ear.prev){\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n    return true;\n}\nfunction isEarHashed(ear, minX, minY, invSize) {\n    var a = ear.prev, b = ear, c = ear.next;\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n    // triangle bbox; min & max are calculated like this for speed\n    var minTX = a.x < b.x ? a.x < c.x ? a.x : c.x : b.x < c.x ? b.x : c.x, minTY = a.y < b.y ? a.y < c.y ? a.y : c.y : b.y < c.y ? b.y : c.y, maxTX = a.x > b.x ? a.x > c.x ? a.x : c.x : b.x > c.x ? b.x : c.x, maxTY = a.y > b.y ? a.y > c.y ? a.y : c.y : b.y > c.y ? b.y : c.y;\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(minTX, minTY, minX, minY, invSize), maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n    var p = ear.prevZ, n = ear.nextZ;\n    // look for points inside the triangle in both directions\n    while(p && p.z >= minZ && n && n.z <= maxZ){\n        if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n        if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n    // look for remaining points in decreasing z-order\n    while(p && p.z >= minZ){\n        if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n    // look for remaining points in increasing z-order\n    while(n && n.z <= maxZ){\n        if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n    return true;\n}\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev, b = p.next.next;\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n            p = start = b;\n        }\n        p = p.next;\n    }while (p !== start);\n    return filterPoints(p);\n}\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while(b !== a.prev){\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize);\n                earcutLinked(c, triangles, dim, minX, minY, invSize);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    }while (a !== start);\n}\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [], i, len, start, end, list;\n    for(i = 0, len = holeIndices.length; i < len; i++){\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n    queue.sort(compareX);\n    // process holes from left to right\n    for(i = 0; i < queue.length; i++){\n        outerNode = eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n    return outerNode;\n}\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    var bridge = findHoleBridge(hole, outerNode);\n    if (!bridge) return outerNode;\n    var bridgeReverse = splitPolygon(bridge, hole);\n    // filter collinear points around the cuts\n    var filteredBridge = filterPoints(bridge, bridge.next);\n    filterPoints(bridgeReverse, bridgeReverse.next);\n    // Check if input node was removed by the filtering\n    return outerNode === bridge ? filteredBridge : outerNode;\n}\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode, hx = hole.x, hy = hole.y, qx = -Infinity, m;\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    }while (p !== outerNode);\n    if (!m) return null;\n    if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n    var stop = m, mx = m.x, my = m.y, tanMin = Infinity, tan;\n    p = m;\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n            if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n        p = p.next;\n    }while (p !== stop);\n    return m;\n}\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    var p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    }while (p !== start);\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n    sortLinked(p);\n}\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1;\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n        while(p){\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for(i = 0; i < inSize; i++){\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n            while(pSize > 0 || qSize > 0 && q){\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n                if (tail) tail.nextZ = e;\n                else list = e;\n                e.prevZ = tail;\n                tail = e;\n            }\n            p = q;\n        }\n        tail.nextZ = null;\n        inSize *= 2;\n    }while (numMerges > 1);\n    return list;\n}\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = 32767 * (x - minX) * invSize;\n    y = 32767 * (y - minY) * invSize;\n    x = (x | x << 8) & 0x00FF00FF;\n    x = (x | x << 4) & 0x0F0F0F0F;\n    x = (x | x << 2) & 0x33333333;\n    x = (x | x << 1) & 0x55555555;\n    y = (y | y << 8) & 0x00FF00FF;\n    y = (y | y << 4) & 0x0F0F0F0F;\n    y = (y | y << 2) & 0x33333333;\n    y = (y | y << 1) & 0x55555555;\n    return x | y << 1;\n}\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start, leftmost = start;\n    do {\n        if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;\n        p = p.next;\n    }while (p !== start);\n    return leftmost;\n}\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && (area(a.prev, a, b.prev) || area(a, b.prev, b)) || equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    var o1 = sign(area(p1, q1, p2));\n    var o2 = sign(area(p1, q1, q2));\n    var o3 = sign(area(p2, q2, p1));\n    var o4 = sign(area(p2, q2, q1));\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n    return false;\n}\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    }while (p !== a);\n    return false;\n}\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a, inside = false, px = (a.x + b.x) / 2, py = (a.y + b.y) / 2;\n    do {\n        if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside;\n        p = p.next;\n    }while (p !== a);\n    return inside;\n}\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev;\n    a.next = b;\n    b.prev = a;\n    a2.next = an;\n    an.prev = a2;\n    b2.next = a2;\n    a2.prev = b2;\n    bp.next = b2;\n    b2.prev = bp;\n    return b2;\n}\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\nfunction Node(i, x, y) {\n    // vertex index in coordinates array\n    this.i = i;\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n    // previous and next vertex nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n    // z-order curve value\n    this.z = null;\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function(data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) for(var i = 0, len = holeIndices.length; i < len; i++){\n        var start = holeIndices[i] * dim;\n        var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        polygonArea -= Math.abs(signedArea(data, start, end, dim));\n    }\n    var trianglesArea = 0;\n    for(i = 0; i < triangles.length; i += 3){\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs((data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n    return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for(var i = start, j = end - dim; i < end; i += dim){\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function(data) {\n    var dim = data[0][0].length, result = {\n        vertices: [],\n        holes: [],\n        dimensions: dim\n    }, holeIndex = 0;\n    for(var i = 0; i < data.length; i++){\n        for(var j = 0; j < data[i].length; j++)for(var d = 0; d < dim; d++)result.vertices.push(data[i][j][d]);\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n\n},{}],\"fNVVH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _solidPolygonLayerVertexMainGlsl = require(\"./solid-polygon-layer-vertex-main.glsl\");\nvar _solidPolygonLayerVertexMainGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerVertexMainGlsl);\nexports.default = \"#define SHADER_NAME solid-polygon-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 positions64Low;\\nattribute float elevations;\\nattribute vec4 fillColors;\\nattribute vec4 lineColors;\\nattribute vec3 pickingColors;\\n\\n\".concat((0, _solidPolygonLayerVertexMainGlslDefault.default), \"\\n\\nvoid main(void) {\\n  PolygonProps props;\\n\\n  props.positions = positions;\\n  props.positions64Low = positions64Low;\\n  props.elevations = elevations;\\n  props.fillColors = fillColors;\\n  props.lineColors = lineColors;\\n  props.pickingColors = pickingColors;\\n\\n  calculatePosition(props);\\n}\\n\");\n\n},{\"./solid-polygon-layer-vertex-main.glsl\":\"iJ4Do\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iJ4Do\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\nattribute vec2 vertexPositions;\\nattribute float vertexValid;\\n\\nuniform bool extruded;\\nuniform bool isWireframe;\\nuniform float elevationScale;\\nuniform float opacity;\\n\\nvarying vec4 vColor;\\nvarying float isValid;\\n\\nstruct PolygonProps {\\n  vec4 fillColors;\\n  vec4 lineColors;\\n  vec3 positions;\\n  vec3 nextPositions;\\n  vec3 pickingColors;\\n  vec3 positions64Low;\\n  vec3 nextPositions64Low;\\n  float elevations;\\n};\\n\\nvec3 project_offset_normal(vec3 vector) {\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT ||\\n    project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSETS) {\\n    return normalize(vector * project_uCommonUnitsPerWorldUnit);\\n  }\\n  return project_normal(vector);\\n}\\n\\nvoid calculatePosition(PolygonProps props) {\\n  vec3 pos;\\n  vec3 pos64Low;\\n  vec3 normal;\\n  vec4 colors = isWireframe ? props.lineColors : props.fillColors;\\n\\n  geometry.worldPosition = props.positions;\\n  geometry.worldPositionAlt = props.nextPositions;\\n  geometry.pickingColor = props.pickingColors;\\n\\n#ifdef IS_SIDE_VERTEX\\n  pos = mix(props.positions, props.nextPositions, vertexPositions.x);\\n  pos64Low = mix(props.positions64Low, props.nextPositions64Low, vertexPositions.x);\\n  isValid = vertexValid;\\n#else\\n  pos = props.positions;\\n  pos64Low = props.positions64Low;\\n  isValid = 1.0;\\n#endif\\n\\n  if (extruded) {\\n    pos.z += props.elevations * vertexPositions.y * elevationScale;\\n\\n#ifdef IS_SIDE_VERTEX\\n    normal = vec3(\\n      props.positions.y - props.nextPositions.y + (props.positions64Low.y - props.nextPositions64Low.y),\\n      props.nextPositions.x - props.positions.x + (props.nextPositions64Low.x - props.positions64Low.x),\\n      0.0);\\n    normal = project_offset_normal(normal);\\n#else\\n    normal = vec3(0.0, 0.0, 1.0);\\n#endif\\n    geometry.normal = normal;\\n  }\\n\\n  gl_Position = project_position_to_clipspace(pos, pos64Low, vec3(0.), geometry.position);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n\\n  if (extruded) {\\n    vec3 lightColor = lighting_getLightColor(colors.rgb, project_uCameraPosition, geometry.position.xyz, normal);\\n    vColor = vec4(lightColor, colors.a * opacity);\\n  } else {\\n    vColor = vec4(colors.rgb, colors.a * opacity);\\n  }\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cMUy7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _solidPolygonLayerVertexMainGlsl = require(\"./solid-polygon-layer-vertex-main.glsl\");\nvar _solidPolygonLayerVertexMainGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerVertexMainGlsl);\nexports.default = \"#define SHADER_NAME solid-polygon-layer-vertex-shader-side\\n#define IS_SIDE_VERTEX\\n\\n\\nattribute vec3 instancePositions;\\nattribute vec3 nextPositions;\\nattribute vec3 instancePositions64Low;\\nattribute vec3 nextPositions64Low;\\nattribute float instanceElevations;\\nattribute vec4 instanceFillColors;\\nattribute vec4 instanceLineColors;\\nattribute vec3 instancePickingColors;\\n\\n\".concat((0, _solidPolygonLayerVertexMainGlslDefault.default), \"\\n\\nvoid main(void) {\\n  PolygonProps props;\\n\\n  props.positions = instancePositions;\\n  props.positions64Low = instancePositions64Low;\\n  props.elevations = instanceElevations;\\n  props.fillColors = instanceFillColors;\\n  props.lineColors = instanceLineColors;\\n  props.pickingColors = instancePickingColors;\\n  props.nextPositions = nextPositions;\\n  props.nextPositions64Low = nextPositions64Low;\\n\\n  calculatePosition(props);\\n}\\n\");\n\n},{\"./solid-polygon-layer-vertex-main.glsl\":\"iJ4Do\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jazMA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME solid-polygon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying float isValid;\\n\\nvoid main(void) {\\n  if (isValid < 0.5) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vColor;\\n\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"avoFf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"replaceInRange\", ()=>replaceInRange);\nfunction replaceInRange(_ref) {\n    var data = _ref.data, getIndex = _ref.getIndex, dataRange = _ref.dataRange, replace = _ref.replace;\n    var _dataRange$startRow = dataRange.startRow, startRow = _dataRange$startRow === void 0 ? 0 : _dataRange$startRow, _dataRange$endRow = dataRange.endRow, endRow = _dataRange$endRow === void 0 ? Infinity : _dataRange$endRow;\n    var count = data.length;\n    var replaceStart = count;\n    var replaceEnd = count;\n    for(var i = 0; i < count; i++){\n        var row = getIndex(data[i]);\n        if (replaceStart > i && row >= startRow) replaceStart = i;\n        if (row >= endRow) {\n            replaceEnd = i;\n            break;\n        }\n    }\n    var index = replaceStart;\n    var dataLengthChanged = replaceEnd - replaceStart !== replace.length;\n    var endChunk = dataLengthChanged && data.slice(replaceEnd);\n    for(var _i = 0; _i < replace.length; _i++)data[index++] = replace[_i];\n    if (dataLengthChanged) {\n        for(var _i2 = 0; _i2 < endChunk.length; _i2++)data[index++] = endChunk[_i2];\n        data.length = index;\n    }\n    return {\n        startRow: replaceStart,\n        endRow: replaceStart + replace.length\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"apOUz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GeoJsonLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _scatterplotLayer = require(\"../scatterplot-layer/scatterplot-layer\");\nvar _scatterplotLayerDefault = parcelHelpers.interopDefault(_scatterplotLayer);\nvar _pathLayer = require(\"../path-layer/path-layer\");\nvar _pathLayerDefault = parcelHelpers.interopDefault(_pathLayer);\nvar _solidPolygonLayer = require(\"../solid-polygon-layer/solid-polygon-layer\");\nvar _solidPolygonLayerDefault = parcelHelpers.interopDefault(_solidPolygonLayer);\nvar _utils = require(\"../utils\");\nvar _geojson = require(\"./geojson\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar defaultLineColor = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultFillColor = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    stroked: true,\n    filled: true,\n    extruded: false,\n    wireframe: false,\n    lineWidthUnits: \"meters\",\n    lineWidthScale: 1,\n    lineWidthMinPixels: 0,\n    lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n    lineJointRounded: false,\n    lineMiterLimit: 4,\n    elevationScale: 1,\n    pointRadiusUnits: \"meters\",\n    pointRadiusScale: 1,\n    pointRadiusMinPixels: 0,\n    pointRadiusMaxPixels: Number.MAX_SAFE_INTEGER,\n    getLineColor: {\n        type: \"accessor\",\n        value: defaultLineColor\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: defaultFillColor\n    },\n    getRadius: {\n        type: \"accessor\",\n        value: 1\n    },\n    getLineWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    getElevation: {\n        type: \"accessor\",\n        value: 1000\n    },\n    material: true\n};\nfunction getCoordinates(f) {\n    return f.geometry.coordinates;\n}\nvar GeoJsonLayer = function(_CompositeLayer) {\n    (0, _inheritsDefault.default)(GeoJsonLayer1, _CompositeLayer);\n    var _super = _createSuper(GeoJsonLayer1);\n    function GeoJsonLayer1() {\n        (0, _classCallCheckDefault.default)(this, GeoJsonLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(GeoJsonLayer1, [\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.state = {\n                    features: {}\n                };\n                if (this.props.getLineDashArray) (0, _core.log).removed(\"getLineDashArray\", \"PathStyleExtension\")();\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, changeFlags = _ref.changeFlags;\n                if (!changeFlags.dataChanged) return;\n                var features = (0, _geojson.getGeojsonFeatures)(props.data);\n                var wrapFeature = this.getSubLayerRow.bind(this);\n                if (Array.isArray(changeFlags.dataChanged)) {\n                    var oldFeatures = this.state.features;\n                    var newFeatures = {};\n                    var featuresDiff = {};\n                    for(var key in oldFeatures){\n                        newFeatures[key] = oldFeatures[key].slice();\n                        featuresDiff[key] = [];\n                    }\n                    var _iterator = _createForOfIteratorHelper(changeFlags.dataChanged), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var dataRange = _step.value;\n                            var partialFeatures = (0, _geojson.separateGeojsonFeatures)(features, wrapFeature, dataRange);\n                            for(var _key in oldFeatures)featuresDiff[_key].push((0, _utils.replaceInRange)({\n                                data: newFeatures[_key],\n                                getIndex: function getIndex(f) {\n                                    return f.__source.index;\n                                },\n                                dataRange: dataRange,\n                                replace: partialFeatures[_key]\n                            }));\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    this.setState({\n                        features: newFeatures,\n                        featuresDiff: featuresDiff\n                    });\n                } else this.setState({\n                    features: (0, _geojson.separateGeojsonFeatures)(features, wrapFeature),\n                    featuresDiff: {}\n                });\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers() {\n                var _this$state = this.state, features = _this$state.features, featuresDiff = _this$state.featuresDiff;\n                var pointFeatures = features.pointFeatures, lineFeatures = features.lineFeatures, polygonFeatures = features.polygonFeatures, polygonOutlineFeatures = features.polygonOutlineFeatures;\n                var _this$props = this.props, stroked = _this$props.stroked, filled = _this$props.filled, extruded = _this$props.extruded, wireframe = _this$props.wireframe, material = _this$props.material, transitions = _this$props.transitions;\n                var _this$props2 = this.props, lineWidthUnits = _this$props2.lineWidthUnits, lineWidthScale = _this$props2.lineWidthScale, lineWidthMinPixels = _this$props2.lineWidthMinPixels, lineWidthMaxPixels = _this$props2.lineWidthMaxPixels, lineJointRounded = _this$props2.lineJointRounded, lineMiterLimit = _this$props2.lineMiterLimit, pointRadiusUnits = _this$props2.pointRadiusUnits, pointRadiusScale = _this$props2.pointRadiusScale, pointRadiusMinPixels = _this$props2.pointRadiusMinPixels, pointRadiusMaxPixels = _this$props2.pointRadiusMaxPixels, elevationScale = _this$props2.elevationScale, lineDashJustified = _this$props2.lineDashJustified;\n                var _this$props3 = this.props, getLineColor = _this$props3.getLineColor, getFillColor = _this$props3.getFillColor, getRadius = _this$props3.getRadius, getLineWidth = _this$props3.getLineWidth, getLineDashArray = _this$props3.getLineDashArray, getElevation = _this$props3.getElevation, updateTriggers = _this$props3.updateTriggers;\n                var PolygonFillLayer = this.getSubLayerClass(\"polygons-fill\", (0, _solidPolygonLayerDefault.default));\n                var PolygonStrokeLayer = this.getSubLayerClass(\"polygons-stroke\", (0, _pathLayerDefault.default));\n                var LineStringsLayer = this.getSubLayerClass(\"line-strings\", (0, _pathLayerDefault.default));\n                var PointsLayer = this.getSubLayerClass(\"points\", (0, _scatterplotLayerDefault.default));\n                var polygonFillLayer = this.shouldRenderSubLayer(\"polygons-fill\", polygonFeatures) && new PolygonFillLayer({\n                    _dataDiff: featuresDiff.polygonFeatures && function() {\n                        return featuresDiff.polygonFeatures;\n                    },\n                    extruded: extruded,\n                    elevationScale: elevationScale,\n                    filled: filled,\n                    wireframe: wireframe,\n                    material: material,\n                    getElevation: this.getSubLayerAccessor(getElevation),\n                    getFillColor: this.getSubLayerAccessor(getFillColor),\n                    getLineColor: this.getSubLayerAccessor(extruded && wireframe ? getLineColor : defaultLineColor),\n                    transitions: transitions && {\n                        getPolygon: transitions.geometry,\n                        getElevation: transitions.getElevation,\n                        getFillColor: transitions.getFillColor,\n                        getLineColor: transitions.getLineColor\n                    }\n                }, this.getSubLayerProps({\n                    id: \"polygons-fill\",\n                    updateTriggers: {\n                        getElevation: updateTriggers.getElevation,\n                        getFillColor: updateTriggers.getFillColor,\n                        lineColors: extruded && wireframe,\n                        getLineColor: updateTriggers.getLineColor\n                    }\n                }), {\n                    data: polygonFeatures,\n                    getPolygon: getCoordinates\n                });\n                var polygonLineLayer = !extruded && stroked && this.shouldRenderSubLayer(\"polygons-stroke\", polygonOutlineFeatures) && new PolygonStrokeLayer({\n                    _dataDiff: featuresDiff.polygonOutlineFeatures && function() {\n                        return featuresDiff.polygonOutlineFeatures;\n                    },\n                    widthUnits: lineWidthUnits,\n                    widthScale: lineWidthScale,\n                    widthMinPixels: lineWidthMinPixels,\n                    widthMaxPixels: lineWidthMaxPixels,\n                    rounded: lineJointRounded,\n                    miterLimit: lineMiterLimit,\n                    dashJustified: lineDashJustified,\n                    getColor: this.getSubLayerAccessor(getLineColor),\n                    getWidth: this.getSubLayerAccessor(getLineWidth),\n                    getDashArray: this.getSubLayerAccessor(getLineDashArray),\n                    transitions: transitions && {\n                        getPath: transitions.geometry,\n                        getColor: transitions.getLineColor,\n                        getWidth: transitions.getLineWidth\n                    }\n                }, this.getSubLayerProps({\n                    id: \"polygons-stroke\",\n                    updateTriggers: {\n                        getColor: updateTriggers.getLineColor,\n                        getWidth: updateTriggers.getLineWidth,\n                        getDashArray: updateTriggers.getLineDashArray\n                    }\n                }), {\n                    data: polygonOutlineFeatures,\n                    getPath: getCoordinates\n                });\n                var pathLayer = this.shouldRenderSubLayer(\"linestrings\", lineFeatures) && new LineStringsLayer({\n                    _dataDiff: featuresDiff.lineFeatures && function() {\n                        return featuresDiff.lineFeatures;\n                    },\n                    widthUnits: lineWidthUnits,\n                    widthScale: lineWidthScale,\n                    widthMinPixels: lineWidthMinPixels,\n                    widthMaxPixels: lineWidthMaxPixels,\n                    rounded: lineJointRounded,\n                    miterLimit: lineMiterLimit,\n                    dashJustified: lineDashJustified,\n                    getColor: this.getSubLayerAccessor(getLineColor),\n                    getWidth: this.getSubLayerAccessor(getLineWidth),\n                    getDashArray: this.getSubLayerAccessor(getLineDashArray),\n                    transitions: transitions && {\n                        getPath: transitions.geometry,\n                        getColor: transitions.getLineColor,\n                        getWidth: transitions.getLineWidth\n                    }\n                }, this.getSubLayerProps({\n                    id: \"line-strings\",\n                    updateTriggers: {\n                        getColor: updateTriggers.getLineColor,\n                        getWidth: updateTriggers.getLineWidth,\n                        getDashArray: updateTriggers.getLineDashArray\n                    }\n                }), {\n                    data: lineFeatures,\n                    getPath: getCoordinates\n                });\n                var pointLayer = this.shouldRenderSubLayer(\"points\", pointFeatures) && new PointsLayer({\n                    _dataDiff: featuresDiff.pointFeatures && function() {\n                        return featuresDiff.pointFeatures;\n                    },\n                    stroked: stroked,\n                    filled: filled,\n                    radiusUnits: pointRadiusUnits,\n                    radiusScale: pointRadiusScale,\n                    radiusMinPixels: pointRadiusMinPixels,\n                    radiusMaxPixels: pointRadiusMaxPixels,\n                    lineWidthUnits: lineWidthUnits,\n                    lineWidthScale: lineWidthScale,\n                    lineWidthMinPixels: lineWidthMinPixels,\n                    lineWidthMaxPixels: lineWidthMaxPixels,\n                    getFillColor: this.getSubLayerAccessor(getFillColor),\n                    getLineColor: this.getSubLayerAccessor(getLineColor),\n                    getRadius: this.getSubLayerAccessor(getRadius),\n                    getLineWidth: this.getSubLayerAccessor(getLineWidth),\n                    transitions: transitions && {\n                        getPosition: transitions.geometry,\n                        getFillColor: transitions.getFillColor,\n                        getLineColor: transitions.getLineColor,\n                        getRadius: transitions.getRadius,\n                        getLineWidth: transitions.getLineWidth\n                    }\n                }, this.getSubLayerProps({\n                    id: \"points\",\n                    updateTriggers: {\n                        getFillColor: updateTriggers.getFillColor,\n                        getLineColor: updateTriggers.getLineColor,\n                        getRadius: updateTriggers.getRadius,\n                        getLineWidth: updateTriggers.getLineWidth\n                    }\n                }), {\n                    data: pointFeatures,\n                    getPosition: getCoordinates,\n                    highlightedObjectIndex: this._getHighlightedIndex(pointFeatures)\n                });\n                return [\n                    !extruded && polygonFillLayer,\n                    polygonLineLayer,\n                    pathLayer,\n                    pointLayer,\n                    extruded && polygonFillLayer\n                ];\n            }\n        },\n        {\n            key: \"_getHighlightedIndex\",\n            value: function _getHighlightedIndex(data) {\n                var highlightedObjectIndex = this.props.highlightedObjectIndex;\n                return Number.isFinite(highlightedObjectIndex) ? data.findIndex(function(d) {\n                    return d.__source.index === highlightedObjectIndex;\n                }) : null;\n            }\n        }\n    ]);\n    return GeoJsonLayer1;\n}((0, _core.CompositeLayer));\nGeoJsonLayer.layerName = \"GeoJsonLayer\";\nGeoJsonLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"../scatterplot-layer/scatterplot-layer\":\"dbN34\",\"../path-layer/path-layer\":\"fUUc7\",\"../solid-polygon-layer/solid-polygon-layer\":\"51B0l\",\"../utils\":\"avoFf\",\"./geojson\":\"9rmmN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9rmmN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getGeojsonFeatures\", ()=>getGeojsonFeatures);\nparcelHelpers.export(exports, \"separateGeojsonFeatures\", ()=>separateGeojsonFeatures);\nparcelHelpers.export(exports, \"validateGeometry\", ()=>validateGeometry);\nvar _core = require(\"@deck.gl/core\");\nfunction getGeojsonFeatures(geojson) {\n    if (Array.isArray(geojson)) return geojson;\n    (0, _core.log).assert(geojson.type, \"GeoJSON does not have type\");\n    switch(geojson.type){\n        case \"Feature\":\n            return [\n                geojson\n            ];\n        case \"FeatureCollection\":\n            (0, _core.log).assert(Array.isArray(geojson.features), \"GeoJSON does not have features array\");\n            return geojson.features;\n        default:\n            return [\n                {\n                    geometry: geojson\n                }\n            ];\n    }\n}\nfunction separateGeojsonFeatures(features, wrapFeature) {\n    var dataRange = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var separated = {\n        pointFeatures: [],\n        lineFeatures: [],\n        polygonFeatures: [],\n        polygonOutlineFeatures: []\n    };\n    var _dataRange$startRow = dataRange.startRow, startRow = _dataRange$startRow === void 0 ? 0 : _dataRange$startRow, _dataRange$endRow = dataRange.endRow, endRow = _dataRange$endRow === void 0 ? features.length : _dataRange$endRow;\n    for(var featureIndex = startRow; featureIndex < endRow; featureIndex++){\n        var feature = features[featureIndex];\n        (0, _core.log).assert(feature && feature.geometry, \"GeoJSON does not have geometry\");\n        var geometry = feature.geometry;\n        if (geometry.type === \"GeometryCollection\") {\n            (0, _core.log).assert(Array.isArray(geometry.geometries), \"GeoJSON does not have geometries array\");\n            var geometries = geometry.geometries;\n            for(var i = 0; i < geometries.length; i++){\n                var subGeometry = geometries[i];\n                separateGeometry(subGeometry, separated, wrapFeature, feature, featureIndex);\n            }\n        } else separateGeometry(geometry, separated, wrapFeature, feature, featureIndex);\n    }\n    return separated;\n}\nfunction separateGeometry(geometry, separated, wrapFeature, sourceFeature, sourceFeatureIndex) {\n    var type = geometry.type, coordinates = geometry.coordinates;\n    var pointFeatures = separated.pointFeatures, lineFeatures = separated.lineFeatures, polygonFeatures = separated.polygonFeatures, polygonOutlineFeatures = separated.polygonOutlineFeatures;\n    if (!validateGeometry(type, coordinates)) {\n        (0, _core.log).warn(\"\".concat(type, \" coordinates are malformed\"))();\n        return;\n    }\n    switch(type){\n        case \"Point\":\n            pointFeatures.push(wrapFeature({\n                geometry: geometry\n            }, sourceFeature, sourceFeatureIndex));\n            break;\n        case \"MultiPoint\":\n            coordinates.forEach(function(point) {\n                pointFeatures.push(wrapFeature({\n                    geometry: {\n                        type: \"Point\",\n                        coordinates: point\n                    }\n                }, sourceFeature, sourceFeatureIndex));\n            });\n            break;\n        case \"LineString\":\n            lineFeatures.push(wrapFeature({\n                geometry: geometry\n            }, sourceFeature, sourceFeatureIndex));\n            break;\n        case \"MultiLineString\":\n            coordinates.forEach(function(path) {\n                lineFeatures.push(wrapFeature({\n                    geometry: {\n                        type: \"LineString\",\n                        coordinates: path\n                    }\n                }, sourceFeature, sourceFeatureIndex));\n            });\n            break;\n        case \"Polygon\":\n            polygonFeatures.push(wrapFeature({\n                geometry: geometry\n            }, sourceFeature, sourceFeatureIndex));\n            coordinates.forEach(function(path) {\n                polygonOutlineFeatures.push(wrapFeature({\n                    geometry: {\n                        type: \"LineString\",\n                        coordinates: path\n                    }\n                }, sourceFeature, sourceFeatureIndex));\n            });\n            break;\n        case \"MultiPolygon\":\n            coordinates.forEach(function(polygon) {\n                polygonFeatures.push(wrapFeature({\n                    geometry: {\n                        type: \"Polygon\",\n                        coordinates: polygon\n                    }\n                }, sourceFeature, sourceFeatureIndex));\n                polygon.forEach(function(path) {\n                    polygonOutlineFeatures.push(wrapFeature({\n                        geometry: {\n                            type: \"LineString\",\n                            coordinates: path\n                        }\n                    }, sourceFeature, sourceFeatureIndex));\n                });\n            });\n            break;\n        default:\n    }\n}\nvar COORDINATE_NEST_LEVEL = {\n    Point: 1,\n    MultiPoint: 2,\n    LineString: 2,\n    MultiLineString: 3,\n    Polygon: 3,\n    MultiPolygon: 4\n};\nfunction validateGeometry(type, coordinates) {\n    var nestLevel = COORDINATE_NEST_LEVEL[type];\n    (0, _core.log).assert(nestLevel, \"Unknown GeoJSON type \".concat(type));\n    while(coordinates && --nestLevel > 0)coordinates = coordinates[0];\n    return coordinates && Number.isFinite(coordinates[0]);\n}\n\n},{\"@deck.gl/core\":\"gu68g\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k0z96\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TextLayer);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _multiIconLayer = require(\"./multi-icon-layer/multi-icon-layer\");\nvar _multiIconLayerDefault = parcelHelpers.interopDefault(_multiIconLayer);\nvar _fontAtlasManager = require(\"./font-atlas-manager\");\nvar _fontAtlasManagerDefault = parcelHelpers.interopDefault(_fontAtlasManager);\nvar _utils = require(\"./utils\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_FONT_SETTINGS = {\n    fontSize: (0, _fontAtlasManager.DEFAULT_FONT_SIZE),\n    buffer: (0, _fontAtlasManager.DEFAULT_BUFFER),\n    sdf: false,\n    radius: (0, _fontAtlasManager.DEFAULT_RADIUS),\n    cutoff: (0, _fontAtlasManager.DEFAULT_CUTOFF)\n};\nvar TEXT_ANCHOR = {\n    start: 1,\n    middle: 0,\n    end: -1\n};\nvar ALIGNMENT_BASELINE = {\n    top: 1,\n    center: 0,\n    bottom: -1\n};\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar DEFAULT_LINE_HEIGHT = 1.0;\nvar FONT_SETTINGS_PROPS = [\n    \"fontSize\",\n    \"buffer\",\n    \"sdf\",\n    \"radius\",\n    \"cutoff\"\n];\nvar defaultProps = {\n    billboard: true,\n    sizeScale: 1,\n    sizeUnits: \"pixels\",\n    sizeMinPixels: 0,\n    sizeMaxPixels: Number.MAX_SAFE_INTEGER,\n    backgroundColor: {\n        type: \"color\",\n        value: null,\n        optional: true\n    },\n    characterSet: (0, _fontAtlasManager.DEFAULT_CHAR_SET),\n    fontFamily: (0, _fontAtlasManager.DEFAULT_FONT_FAMILY),\n    fontWeight: (0, _fontAtlasManager.DEFAULT_FONT_WEIGHT),\n    lineHeight: DEFAULT_LINE_HEIGHT,\n    fontSettings: {},\n    wordBreak: \"word-break\",\n    maxWidth: {\n        type: \"number\",\n        value: -1\n    },\n    getText: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.text;\n        }\n    },\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getSize: {\n        type: \"accessor\",\n        value: 32\n    },\n    getAngle: {\n        type: \"accessor\",\n        value: 0\n    },\n    getTextAnchor: {\n        type: \"accessor\",\n        value: \"middle\"\n    },\n    getAlignmentBaseline: {\n        type: \"accessor\",\n        value: \"center\"\n    },\n    getPixelOffset: {\n        type: \"accessor\",\n        value: [\n            0,\n            0\n        ]\n    }\n};\nvar TextLayer = function(_CompositeLayer) {\n    (0, _inheritsDefault.default)(TextLayer1, _CompositeLayer);\n    var _super = _createSuper(TextLayer1);\n    function TextLayer1() {\n        (0, _classCallCheckDefault.default)(this, TextLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(TextLayer1, [\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.state = {\n                    styleVersion: 0,\n                    fontAtlasManager: new (0, _fontAtlasManagerDefault.default)(this.context.gl)\n                };\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                var fontChanged = this._fontChanged(oldProps, props);\n                if (fontChanged) this._updateFontAtlas(oldProps, props);\n                var styleChanged = fontChanged || props.lineHeight !== oldProps.lineHeight || props.wordBreak !== oldProps.wordBreak || props.maxWidth !== oldProps.maxWidth;\n                var textChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText);\n                if (textChanged) this._updateText();\n                if (styleChanged) this.setState({\n                    styleVersion: this.state.styleVersion + 1\n                });\n            }\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState() {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(TextLayer1.prototype), \"finalizeState\", this).call(this);\n                this.state.fontAtlasManager.finalize();\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(_ref2) {\n                var info = _ref2.info;\n                return Object.assign(info, {\n                    object: info.index >= 0 ? this.props.data[info.index] : null\n                });\n            }\n        },\n        {\n            key: \"_updateFontAtlas\",\n            value: function _updateFontAtlas(oldProps, props) {\n                var characterSet = props.characterSet, fontSettings = props.fontSettings, fontFamily = props.fontFamily, fontWeight = props.fontWeight;\n                var fontAtlasManager = this.state.fontAtlasManager;\n                fontAtlasManager.setProps(Object.assign({}, DEFAULT_FONT_SETTINGS, fontSettings, {\n                    characterSet: characterSet,\n                    fontFamily: fontFamily,\n                    fontWeight: fontWeight\n                }));\n                this.setNeedsRedraw(true);\n            }\n        },\n        {\n            key: \"_fontChanged\",\n            value: function _fontChanged(oldProps, props) {\n                if (oldProps.fontFamily !== props.fontFamily || oldProps.characterSet !== props.characterSet || oldProps.fontWeight !== props.fontWeight) return true;\n                if (oldProps.fontSettings === props.fontSettings) return false;\n                var oldFontSettings = oldProps.fontSettings || {};\n                var fontSettings = props.fontSettings || {};\n                return FONT_SETTINGS_PROPS.some(function(prop) {\n                    return oldFontSettings[prop] !== fontSettings[prop];\n                });\n            }\n        },\n        {\n            key: \"_updateText\",\n            value: function _updateText() {\n                var data = this.props.data;\n                var textBuffer = data.attributes && data.attributes.getText;\n                var getText = this.props.getText;\n                var startIndices = data.startIndices;\n                var numInstances;\n                if (textBuffer && startIndices) {\n                    var _getTextFromBuffer = (0, _utils.getTextFromBuffer)(_objectSpread(_objectSpread({}, ArrayBuffer.isView(textBuffer) ? {\n                        value: textBuffer\n                    } : textBuffer), {}, {\n                        length: data.length,\n                        startIndices: startIndices\n                    })), texts = _getTextFromBuffer.texts, characterCount = _getTextFromBuffer.characterCount;\n                    numInstances = characterCount;\n                    getText = function getText(_, _ref3) {\n                        var index = _ref3.index;\n                        return texts[index];\n                    };\n                } else {\n                    var _createIterable = (0, _core.createIterable)(data), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n                    startIndices = [\n                        0\n                    ];\n                    numInstances = 0;\n                    var _iterator = _createForOfIteratorHelper(iterable), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var object = _step.value;\n                            objectInfo.index++;\n                            var text = getText(object, objectInfo) || \"\";\n                            numInstances += text.length;\n                            startIndices.push(numInstances);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                }\n                this.setState({\n                    getText: getText,\n                    startIndices: startIndices,\n                    numInstances: numInstances\n                });\n            }\n        },\n        {\n            key: \"getIconOffsets\",\n            value: function getIconOffsets(object, objectInfo) {\n                var iconMapping = this.state.fontAtlasManager.mapping;\n                var getText = this.state.getText;\n                var _this$props = this.props, wordBreak = _this$props.wordBreak, maxWidth = _this$props.maxWidth, lineHeight = _this$props.lineHeight, getTextAnchor = _this$props.getTextAnchor, getAlignmentBaseline = _this$props.getAlignmentBaseline;\n                var paragraph = getText(object, objectInfo) || \"\";\n                var _transformParagraph = (0, _utils.transformParagraph)(paragraph, lineHeight, wordBreak, maxWidth, iconMapping), characters = _transformParagraph.characters, _transformParagraph$s = (0, _slicedToArrayDefault.default)(_transformParagraph.size, 2), width = _transformParagraph$s[0], height = _transformParagraph$s[1];\n                var anchorX = TEXT_ANCHOR[typeof getTextAnchor === \"function\" ? getTextAnchor(object, objectInfo) : getTextAnchor];\n                var anchorY = ALIGNMENT_BASELINE[typeof getAlignmentBaseline === \"function\" ? getAlignmentBaseline(object, objectInfo) : getAlignmentBaseline];\n                var offsets = new Array(paragraph.length * 2);\n                var index = 0;\n                var _iterator2 = _createForOfIteratorHelper(characters), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var _step2$value = _step2.value, rowWidth = _step2$value.rowWidth, x = _step2$value.x, y = _step2$value.y;\n                        var rowOffset = (1 - anchorX) * (width - rowWidth) / 2;\n                        offsets[index++] = (anchorX - 1) * width / 2 + rowOffset + x;\n                        offsets[index++] = (anchorY - 1) * height / 2 + y;\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n                return offsets;\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers() {\n                var _this$state = this.state, startIndices = _this$state.startIndices, numInstances = _this$state.numInstances, getText = _this$state.getText, _this$state$fontAtlas = _this$state.fontAtlasManager, scale = _this$state$fontAtlas.scale, texture = _this$state$fontAtlas.texture, mapping = _this$state$fontAtlas.mapping, styleVersion = _this$state.styleVersion;\n                var _this$props2 = this.props, data = _this$props2.data, _dataDiff = _this$props2._dataDiff, backgroundColor = _this$props2.backgroundColor, getPosition = _this$props2.getPosition, getColor = _this$props2.getColor, getSize = _this$props2.getSize, getAngle = _this$props2.getAngle, getPixelOffset = _this$props2.getPixelOffset, billboard = _this$props2.billboard, fontSettings = _this$props2.fontSettings, sizeScale = _this$props2.sizeScale, sizeUnits = _this$props2.sizeUnits, sizeMinPixels = _this$props2.sizeMinPixels, sizeMaxPixels = _this$props2.sizeMaxPixels, transitions = _this$props2.transitions, updateTriggers = _this$props2.updateTriggers;\n                var getIconOffsets = this.getIconOffsets.bind(this);\n                var SubLayerClass = this.getSubLayerClass(\"characters\", (0, _multiIconLayerDefault.default));\n                return new SubLayerClass({\n                    sdf: fontSettings.sdf,\n                    iconAtlas: texture,\n                    iconMapping: mapping,\n                    backgroundColor: backgroundColor,\n                    getPosition: getPosition,\n                    getColor: getColor,\n                    getSize: getSize,\n                    getAngle: getAngle,\n                    getPixelOffset: getPixelOffset,\n                    billboard: billboard,\n                    sizeScale: sizeScale * scale,\n                    sizeUnits: sizeUnits,\n                    sizeMinPixels: sizeMinPixels * scale,\n                    sizeMaxPixels: sizeMaxPixels * scale,\n                    transitions: transitions && {\n                        getPosition: transitions.getPosition,\n                        getAngle: transitions.getAngle,\n                        getColor: transitions.getColor,\n                        getSize: transitions.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset\n                    }\n                }, this.getSubLayerProps({\n                    id: \"characters\",\n                    updateTriggers: {\n                        getIcon: updateTriggers.getText,\n                        getPosition: updateTriggers.getPosition,\n                        getAngle: updateTriggers.getAngle,\n                        getColor: updateTriggers.getColor,\n                        getSize: updateTriggers.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset,\n                        getIconOffsets: {\n                            getText: updateTriggers.getText,\n                            getTextAnchor: updateTriggers.getTextAnchor,\n                            getAlignmentBaseline: updateTriggers.getAlignmentBaseline,\n                            styleVersion: styleVersion\n                        }\n                    }\n                }), {\n                    data: data,\n                    _dataDiff: _dataDiff,\n                    startIndices: startIndices,\n                    numInstances: numInstances,\n                    getIconOffsets: getIconOffsets,\n                    getIcon: getText\n                });\n            }\n        }\n    ]);\n    return TextLayer1;\n}((0, _core.CompositeLayer));\nTextLayer.layerName = \"TextLayer\";\nTextLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"cLnqM\",\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"@deck.gl/core\":\"gu68g\",\"./multi-icon-layer/multi-icon-layer\":\"j9vBi\",\"./font-atlas-manager\":\"bGc5p\",\"./utils\":\"b9foQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j9vBi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>MultiIconLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _iconLayer = require(\"../../icon-layer/icon-layer\");\nvar _iconLayerDefault = parcelHelpers.interopDefault(_iconLayer);\nvar _multiIconLayerFragmentGlsl = require(\"./multi-icon-layer-fragment.glsl\");\nvar _multiIconLayerFragmentGlslDefault = parcelHelpers.interopDefault(_multiIconLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_GAMMA = 0.2;\nvar DEFAULT_BUFFER = 0.75;\nvar EMPTY_ARRAY = [];\nvar defaultProps = {\n    backgroundColor: {\n        type: \"color\",\n        value: null,\n        optional: true\n    },\n    getIconOffsets: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.offsets;\n        }\n    },\n    alphaCutoff: 0\n};\nvar MultiIconLayer = function(_IconLayer) {\n    (0, _inheritsDefault.default)(MultiIconLayer1, _IconLayer);\n    var _super = _createSuper(MultiIconLayer1);\n    function MultiIconLayer1() {\n        (0, _classCallCheckDefault.default)(this, MultiIconLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(MultiIconLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return Object.assign({}, (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"getShaders\", this).call(this), {\n                    inject: {\n                        \"vs:#decl\": \"\\n  uniform float gamma;\\n  varying float vGamma;\\n\",\n                        \"vs:#main-end\": \"\\n  vGamma = gamma / (sizeScale * iconSize.y);\\n\"\n                    },\n                    fs: (0, _multiIconLayerFragmentGlslDefault.default)\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"initializeState\", this).call(this);\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instanceOffsets: {\n                        size: 2,\n                        accessor: \"getIconOffsets\"\n                    },\n                    instancePickingColors: {\n                        type: 5121,\n                        size: 3,\n                        accessor: function accessor(object, _ref) {\n                            var index = _ref.index, value = _ref.target;\n                            return _this.encodePickingColor(index, value);\n                        }\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(updateParams) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"updateState\", this).call(this, updateParams);\n                var oldProps = updateParams.oldProps, props = updateParams.props;\n                if (props.backgroundColor !== oldProps.backgroundColor) {\n                    var backgroundColor = Array.isArray(props.backgroundColor) ? props.backgroundColor.map(function(c) {\n                        return c / 255.0;\n                    }).slice(0, 3) : null;\n                    this.setState({\n                        backgroundColor: backgroundColor\n                    });\n                }\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var sdf = this.props.sdf;\n                var backgroundColor = this.state.backgroundColor;\n                var shouldDrawBackground = Array.isArray(backgroundColor);\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"draw\", this).call(this, {\n                    uniforms: Object.assign({}, uniforms, {\n                        buffer: DEFAULT_BUFFER,\n                        gamma: DEFAULT_GAMMA,\n                        sdf: Boolean(sdf),\n                        backgroundColor: backgroundColor || [\n                            0,\n                            0,\n                            0\n                        ],\n                        shouldDrawBackground: shouldDrawBackground\n                    })\n                });\n            }\n        },\n        {\n            key: \"getInstanceOffset\",\n            value: function getInstanceOffset(icons) {\n                var _this2 = this;\n                return icons ? Array.from(icons).map(function(icon) {\n                    return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"getInstanceOffset\", _this2).call(_this2, icon);\n                }) : EMPTY_ARRAY;\n            }\n        },\n        {\n            key: \"getInstanceColorMode\",\n            value: function getInstanceColorMode(icons) {\n                return 1;\n            }\n        },\n        {\n            key: \"getInstanceIconFrame\",\n            value: function getInstanceIconFrame(icons) {\n                var _this3 = this;\n                return icons ? Array.from(icons).map(function(icon) {\n                    return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"getInstanceIconFrame\", _this3).call(_this3, icon);\n                }) : EMPTY_ARRAY;\n            }\n        }\n    ]);\n    return MultiIconLayer1;\n}((0, _iconLayerDefault.default));\nMultiIconLayer.layerName = \"MultiIconLayer\";\nMultiIconLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@babel/runtime/helpers/esm/get\":\"3vThf\",\"@babel/runtime/helpers/esm/inherits\":\"jtMi4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6e4fp\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"jf1Jo\",\"../../icon-layer/icon-layer\":\"kGab5\",\"./multi-icon-layer-fragment.glsl\":\"f6Dy1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f6Dy1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME multi-icon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform float opacity;\\nuniform sampler2D iconsTexture;\\nuniform float buffer;\\nuniform bool sdf;\\nuniform float alphaCutoff;\\nuniform bool shouldDrawBackground;\\nuniform vec3 backgroundColor;\\n\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\nvarying float vGamma;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  geometry.uv = uv;\\n\\n  if (!picking_uActive) {\\n    float alpha = texture2D(iconsTexture, vTextureCoords).a;\\n    if (sdf) {\\n      alpha = smoothstep(buffer - vGamma, buffer + vGamma, alpha);\\n    }\\n    float a = alpha * vColor.a;\\n    \\n    if (a < alphaCutoff) {\\n      if (shouldDrawBackground) {\\n        gl_FragColor = vec4(backgroundColor, vColor.a);\\n      } else {\\n        discard;\\n      }\\n    } else {\\n      if (shouldDrawBackground) {\\n        gl_FragColor = vec4(mix(backgroundColor, vColor.rgb, alpha), vColor.a * opacity);\\n      } else {\\n        gl_FragColor = vec4(vColor.rgb, a * opacity);\\n      }\\n      DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n    }\\n  } else {\\n    DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n  }\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bGc5p\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DEFAULT_CHAR_SET\", ()=>DEFAULT_CHAR_SET);\nparcelHelpers.export(exports, \"DEFAULT_FONT_FAMILY\", ()=>DEFAULT_FONT_FAMILY);\nparcelHelpers.export(exports, \"DEFAULT_FONT_WEIGHT\", ()=>DEFAULT_FONT_WEIGHT);\nparcelHelpers.export(exports, \"DEFAULT_FONT_SIZE\", ()=>DEFAULT_FONT_SIZE);\nparcelHelpers.export(exports, \"DEFAULT_BUFFER\", ()=>DEFAULT_BUFFER);\nparcelHelpers.export(exports, \"DEFAULT_CUTOFF\", ()=>DEFAULT_CUTOFF);\nparcelHelpers.export(exports, \"DEFAULT_RADIUS\", ()=>DEFAULT_RADIUS);\nparcelHelpers.export(exports, \"default\", ()=>FontAtlasManager);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _tinySdf = require(\"@mapbox/tiny-sdf\");\nvar _tinySdfDefault = parcelHelpers.interopDefault(_tinySdf);\nvar _utils = require(\"./utils\");\nvar _lruCache = require(\"./lru-cache\");\nvar _lruCacheDefault = parcelHelpers.interopDefault(_lruCache);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction getDefaultCharacterSet() {\n    var charSet = [];\n    for(var i = 32; i < 128; i++)charSet.push(String.fromCharCode(i));\n    return charSet;\n}\nvar DEFAULT_CHAR_SET = getDefaultCharacterSet();\nvar DEFAULT_FONT_FAMILY = \"Monaco, monospace\";\nvar DEFAULT_FONT_WEIGHT = \"normal\";\nvar DEFAULT_FONT_SIZE = 64;\nvar DEFAULT_BUFFER = 2;\nvar DEFAULT_CUTOFF = 0.25;\nvar DEFAULT_RADIUS = 3;\nvar GL_TEXTURE_WRAP_S = 0x2802;\nvar GL_TEXTURE_WRAP_T = 0x2803;\nvar GL_CLAMP_TO_EDGE = 0x812f;\nvar MAX_CANVAS_WIDTH = 1024;\nvar BASELINE_SCALE = 0.9;\nvar HEIGHT_SCALE = 1.2;\nvar CACHE_LIMIT = 3;\nvar cache = new (0, _lruCacheDefault.default)(CACHE_LIMIT);\nvar VALID_PROPS = [\n    \"fontFamily\",\n    \"fontWeight\",\n    \"characterSet\",\n    \"fontSize\",\n    \"sdf\",\n    \"buffer\",\n    \"cutoff\",\n    \"radius\"\n];\nfunction getNewChars(key, characterSet) {\n    var cachedFontAtlas = cache.get(key);\n    if (!cachedFontAtlas) return characterSet;\n    var newChars = [];\n    var cachedMapping = cachedFontAtlas.mapping;\n    var cachedCharSet = Object.keys(cachedMapping);\n    cachedCharSet = new Set(cachedCharSet);\n    var charSet = characterSet;\n    if (charSet instanceof Array) charSet = new Set(charSet);\n    charSet.forEach(function(_char) {\n        if (!cachedCharSet.has(_char)) newChars.push(_char);\n    });\n    return newChars;\n}\nfunction populateAlphaChannel(alphaChannel, imageData) {\n    for(var i = 0; i < alphaChannel.length; i++)imageData.data[4 * i + 3] = alphaChannel[i];\n}\nfunction setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n    ctx.font = \"\".concat(fontWeight, \" \").concat(fontSize, \"px \").concat(fontFamily);\n    ctx.fillStyle = \"#000\";\n    ctx.textBaseline = \"baseline\";\n    ctx.textAlign = \"left\";\n}\nvar FontAtlasManager = function() {\n    function FontAtlasManager1(gl) {\n        (0, _classCallCheckDefault.default)(this, FontAtlasManager1);\n        this.gl = gl;\n        this.props = {\n            fontFamily: DEFAULT_FONT_FAMILY,\n            fontWeight: DEFAULT_FONT_WEIGHT,\n            characterSet: DEFAULT_CHAR_SET,\n            fontSize: DEFAULT_FONT_SIZE,\n            buffer: DEFAULT_BUFFER,\n            sdf: false,\n            cutoff: DEFAULT_CUTOFF,\n            radius: DEFAULT_RADIUS\n        };\n        this._key = null;\n        this._texture = new (0, _core.Texture2D)(this.gl);\n    }\n    (0, _createClassDefault.default)(FontAtlasManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this._texture[\"delete\"]();\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps() {\n                var _this = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                VALID_PROPS.forEach(function(prop) {\n                    if (prop in props) _this.props[prop] = props[prop];\n                });\n                var oldKey = this._key;\n                this._key = this._getKey();\n                var charSet = getNewChars(this._key, this.props.characterSet);\n                var cachedFontAtlas = cache.get(this._key);\n                if (cachedFontAtlas && charSet.length === 0) {\n                    if (this._key !== oldKey) this._updateTexture(cachedFontAtlas);\n                    return;\n                }\n                var fontAtlas = this._generateFontAtlas(this._key, charSet, cachedFontAtlas);\n                this._updateTexture(fontAtlas);\n                cache.set(this._key, fontAtlas);\n            }\n        },\n        {\n            key: \"_updateTexture\",\n            value: function _updateTexture(_ref) {\n                var _parameters;\n                var canvas = _ref.data, width = _ref.width, height = _ref.height;\n                if (this._texture.width !== width || this._texture.height !== height) this._texture.resize({\n                    width: width,\n                    height: height\n                });\n                this._texture.setImageData({\n                    data: canvas,\n                    width: width,\n                    height: height,\n                    parameters: (_parameters = {}, (0, _definePropertyDefault.default)(_parameters, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE), (0, _definePropertyDefault.default)(_parameters, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE), _parameters)\n                });\n                this._texture.generateMipmap();\n            }\n        },\n        {\n            key: \"_generateFontAtlas\",\n            value: function _generateFontAtlas(key, characterSet, cachedFontAtlas) {\n                var _this$props = this.props, fontFamily = _this$props.fontFamily, fontWeight = _this$props.fontWeight, fontSize = _this$props.fontSize, buffer = _this$props.buffer, sdf = _this$props.sdf, radius = _this$props.radius, cutoff = _this$props.cutoff;\n                var canvas = cachedFontAtlas && cachedFontAtlas.data;\n                if (!canvas) {\n                    canvas = document.createElement(\"canvas\");\n                    canvas.width = MAX_CANVAS_WIDTH;\n                }\n                var ctx = canvas.getContext(\"2d\");\n                setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n                var _buildMapping = (0, _utils.buildMapping)(Object.assign({\n                    getFontWidth: function getFontWidth(_char2) {\n                        return ctx.measureText(_char2).width;\n                    },\n                    fontHeight: fontSize * HEIGHT_SCALE,\n                    buffer: buffer,\n                    characterSet: characterSet,\n                    maxCanvasWidth: MAX_CANVAS_WIDTH\n                }, cachedFontAtlas && {\n                    mapping: cachedFontAtlas.mapping,\n                    xOffset: cachedFontAtlas.xOffset,\n                    yOffset: cachedFontAtlas.yOffset\n                })), mapping = _buildMapping.mapping, canvasHeight = _buildMapping.canvasHeight, xOffset = _buildMapping.xOffset, yOffset = _buildMapping.yOffset;\n                if (canvas.height !== canvasHeight) {\n                    var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n                    canvas.height = canvasHeight;\n                    ctx.putImageData(imageData, 0, 0);\n                }\n                setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n                if (sdf) {\n                    var tinySDF = new (0, _tinySdfDefault.default)(fontSize, buffer, radius, cutoff, fontFamily, fontWeight);\n                    var _imageData = ctx.getImageData(0, 0, tinySDF.size, tinySDF.size);\n                    var _iterator = _createForOfIteratorHelper(characterSet), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var _char3 = _step.value;\n                            populateAlphaChannel(tinySDF.draw(_char3), _imageData);\n                            ctx.putImageData(_imageData, mapping[_char3].x - buffer, mapping[_char3].y - buffer);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                } else {\n                    var _iterator2 = _createForOfIteratorHelper(characterSet), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var _char4 = _step2.value;\n                            ctx.fillText(_char4, mapping[_char4].x, mapping[_char4].y + fontSize * BASELINE_SCALE);\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                }\n                return {\n                    xOffset: xOffset,\n                    yOffset: yOffset,\n                    mapping: mapping,\n                    data: canvas,\n                    width: canvas.width,\n                    height: canvas.height\n                };\n            }\n        },\n        {\n            key: \"_getKey\",\n            value: function _getKey() {\n                var _this$props2 = this.props, gl = _this$props2.gl, fontFamily = _this$props2.fontFamily, fontWeight = _this$props2.fontWeight, fontSize = _this$props2.fontSize, buffer = _this$props2.buffer, sdf = _this$props2.sdf, radius = _this$props2.radius, cutoff = _this$props2.cutoff;\n                if (sdf) return \"\".concat(gl, \" \").concat(fontFamily, \" \").concat(fontWeight, \" \").concat(fontSize, \" \").concat(buffer, \" \").concat(radius, \" \").concat(cutoff);\n                return \"\".concat(gl, \" \").concat(fontFamily, \" \").concat(fontWeight, \" \").concat(fontSize, \" \").concat(buffer);\n            }\n        },\n        {\n            key: \"texture\",\n            get: function get() {\n                return this._texture;\n            }\n        },\n        {\n            key: \"mapping\",\n            get: function get() {\n                var data = cache.get(this._key);\n                return data && data.mapping;\n            }\n        },\n        {\n            key: \"scale\",\n            get: function get() {\n                return HEIGHT_SCALE;\n            }\n        }\n    ]);\n    return FontAtlasManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"5Xk1p\",\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@luma.gl/core\":\"WBJLR\",\"@mapbox/tiny-sdf\":\"aWW4l\",\"./utils\":\"b9foQ\",\"./lru-cache\":\"b1X7F\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aWW4l\":[function(require,module,exports) {\n\"use strict\";\nmodule.exports = TinySDF;\nmodule.exports.default = TinySDF;\nvar INF = 1e20;\nfunction TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) {\n    this.fontSize = fontSize || 24;\n    this.buffer = buffer === undefined ? 3 : buffer;\n    this.cutoff = cutoff || 0.25;\n    this.fontFamily = fontFamily || \"sans-serif\";\n    this.fontWeight = fontWeight || \"normal\";\n    this.radius = radius || 8;\n    // For backwards compatibility, we honor the implicit contract that the\n    // size of the returned bitmap will be fontSize + buffer * 2\n    var size = this.size = this.fontSize + this.buffer * 2;\n    // Glyphs may be slightly larger than their fontSize. The canvas already\n    // has buffer space, but create extra buffer space in the output grid for the\n    // \"halo\" to extend into (if metric extraction is enabled)\n    var gridSize = size + this.buffer * 2;\n    this.canvas = document.createElement(\"canvas\");\n    this.canvas.width = this.canvas.height = size;\n    this.ctx = this.canvas.getContext(\"2d\");\n    this.ctx.font = this.fontWeight + \" \" + this.fontSize + \"px \" + this.fontFamily;\n    this.ctx.textAlign = \"left\"; // Necessary so that RTL text doesn't have different alignment\n    this.ctx.fillStyle = \"black\";\n    // temporary arrays for the distance transform\n    this.gridOuter = new Float64Array(gridSize * gridSize);\n    this.gridInner = new Float64Array(gridSize * gridSize);\n    this.f = new Float64Array(gridSize);\n    this.z = new Float64Array(gridSize + 1);\n    this.v = new Uint16Array(gridSize);\n    this.useMetrics = this.ctx.measureText(\"A\").actualBoundingBoxLeft !== undefined;\n    // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852\n    this.middle = Math.round(size / 2 * (navigator.userAgent.indexOf(\"Gecko/\") >= 0 ? 1.2 : 1));\n}\nfunction prepareGrids(imgData, width, height, glyphWidth, glyphHeight, gridOuter, gridInner) {\n    // Initialize grids outside the glyph range to alpha 0\n    gridOuter.fill(INF, 0, width * height);\n    gridInner.fill(0, 0, width * height);\n    var offset = (width - glyphWidth) / 2; // This is zero if we're not extracting metrics\n    for(var y = 0; y < glyphHeight; y++)for(var x = 0; x < glyphWidth; x++){\n        var j = (y + offset) * width + x + offset;\n        var a = imgData.data[4 * (y * glyphWidth + x) + 3] / 255; // alpha value\n        if (a === 1) {\n            gridOuter[j] = 0;\n            gridInner[j] = INF;\n        } else if (a === 0) {\n            gridOuter[j] = INF;\n            gridInner[j] = 0;\n        } else {\n            var b = Math.max(0, 0.5 - a);\n            var c = Math.max(0, a - 0.5);\n            gridOuter[j] = b * b;\n            gridInner[j] = c * c;\n        }\n    }\n}\nfunction extractAlpha(alphaChannel, width, height, gridOuter, gridInner, radius, cutoff) {\n    for(var i = 0; i < width * height; i++){\n        var d = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]);\n        alphaChannel[i] = Math.round(255 - 255 * (d / radius + cutoff));\n    }\n}\nTinySDF.prototype._draw = function(char, getMetrics) {\n    var textMetrics = this.ctx.measureText(char);\n    // Older browsers only expose the glyph width\n    // This is enough for basic layout with all glyphs using the same fixed size\n    var advance = textMetrics.width;\n    var doubleBuffer = 2 * this.buffer;\n    var width, glyphWidth, height, glyphHeight, top;\n    var imgTop, imgLeft, baselinePosition;\n    // If the browser supports bounding box metrics, we can generate a smaller\n    // SDF. This is a significant performance win.\n    if (getMetrics && this.useMetrics) {\n        // The integer/pixel part of the top alignment is encoded in metrics.top\n        // The remainder is implicitly encoded in the rasterization\n        top = Math.floor(textMetrics.actualBoundingBoxAscent);\n        baselinePosition = this.buffer + Math.ceil(textMetrics.actualBoundingBoxAscent);\n        imgTop = this.buffer;\n        imgLeft = this.buffer;\n        // If the glyph overflows the canvas size, it will be clipped at the\n        // bottom/right\n        glyphWidth = Math.min(this.size, Math.ceil(textMetrics.actualBoundingBoxRight - textMetrics.actualBoundingBoxLeft));\n        glyphHeight = Math.min(this.size - imgTop, Math.ceil(textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent));\n        width = glyphWidth + doubleBuffer;\n        height = glyphHeight + doubleBuffer;\n        this.ctx.textBaseline = \"alphabetic\";\n    } else {\n        width = glyphWidth = this.size;\n        height = glyphHeight = this.size;\n        // 19 points is an approximation of the \"cap height\" ascent from alphabetic\n        // baseline (even though actual drawing is from middle baseline, we can\n        // use the approximation because every glyph fills the em box)\n        top = 19 * this.fontSize / 24;\n        imgTop = imgLeft = 0;\n        baselinePosition = this.middle;\n        this.ctx.textBaseline = \"middle\";\n    }\n    var imgData;\n    if (glyphWidth && glyphHeight) {\n        this.ctx.clearRect(imgLeft, imgTop, glyphWidth, glyphHeight);\n        this.ctx.fillText(char, this.buffer, baselinePosition);\n        imgData = this.ctx.getImageData(imgLeft, imgTop, glyphWidth, glyphHeight);\n    }\n    var alphaChannel = new Uint8ClampedArray(width * height);\n    prepareGrids(imgData, width, height, glyphWidth, glyphHeight, this.gridOuter, this.gridInner);\n    edt(this.gridOuter, width, height, this.f, this.v, this.z);\n    edt(this.gridInner, width, height, this.f, this.v, this.z);\n    extractAlpha(alphaChannel, width, height, this.gridOuter, this.gridInner, this.radius, this.cutoff);\n    return {\n        data: alphaChannel,\n        metrics: {\n            width: glyphWidth,\n            height: glyphHeight,\n            sdfWidth: width,\n            sdfHeight: height,\n            top: top,\n            left: 0,\n            advance: advance\n        }\n    };\n};\nTinySDF.prototype.draw = function(char) {\n    return this._draw(char, false).data;\n};\nTinySDF.prototype.drawWithMetrics = function(char) {\n    return this._draw(char, true);\n};\n// 2D Euclidean squared distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\nfunction edt(data, width, height, f, v, z) {\n    for(var x = 0; x < width; x++)edt1d(data, x, width, height, f, v, z);\n    for(var y = 0; y < height; y++)edt1d(data, y * width, 1, width, f, v, z);\n}\n// 1D squared distance transform\nfunction edt1d(grid, offset, stride, length, f, v, z) {\n    var q, k, s, r;\n    v[0] = 0;\n    z[0] = -INF;\n    z[1] = INF;\n    for(q = 0; q < length; q++)f[q] = grid[offset + q * stride];\n    for(q = 1, k = 0, s = 0; q < length; q++){\n        do {\n            r = v[k];\n            s = (f[q] - f[r] + q * q - r * r) / (q - r) / 2;\n        }while (s <= z[k] && --k > -1);\n        k++;\n        v[k] = q;\n        z[k] = s;\n        z[k + 1] = INF;\n    }\n    for(q = 0, k = 0; q < length; q++){\n        while(z[k + 1] < q)k++;\n        r = v[k];\n        grid[offset + q * stride] = f[r] + (q - r) * (q - r);\n    }\n}\n\n},{}],\"b9foQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"nextPowOfTwo\", ()=>nextPowOfTwo);\nparcelHelpers.export(exports, \"buildMapping\", ()=>buildMapping);\nparcelHelpers.export(exports, \"autoWrapping\", ()=>autoWrapping);\nparcelHelpers.export(exports, \"transformParagraph\", ()=>transformParagraph);\nparcelHelpers.export(exports, \"getTextFromBuffer\", ()=>getTextFromBuffer);\nvar _core = require(\"@deck.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar MISSING_CHAR_WIDTH = 32;\nfunction nextPowOfTwo(number) {\n    return Math.pow(2, Math.ceil(Math.log2(number)));\n}\nfunction buildMapping(_ref) {\n    var characterSet = _ref.characterSet, getFontWidth = _ref.getFontWidth, fontHeight = _ref.fontHeight, buffer = _ref.buffer, maxCanvasWidth = _ref.maxCanvasWidth, _ref$mapping = _ref.mapping, mapping = _ref$mapping === void 0 ? {} : _ref$mapping, _ref$xOffset = _ref.xOffset, xOffset = _ref$xOffset === void 0 ? 0 : _ref$xOffset, _ref$yOffset = _ref.yOffset, yOffset = _ref$yOffset === void 0 ? 0 : _ref$yOffset;\n    var row = 0;\n    var x = xOffset;\n    var i = 0;\n    var _iterator = _createForOfIteratorHelper(characterSet), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var _char = _step.value;\n            if (!mapping[_char]) {\n                var width = getFontWidth(_char, i++);\n                if (x + width + buffer * 2 > maxCanvasWidth) {\n                    x = 0;\n                    row++;\n                }\n                mapping[_char] = {\n                    x: x + buffer,\n                    y: yOffset + row * (fontHeight + buffer * 2) + buffer,\n                    width: width,\n                    height: fontHeight\n                };\n                x += width + buffer * 2;\n            }\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    var rowHeight = fontHeight + buffer * 2;\n    return {\n        mapping: mapping,\n        xOffset: x,\n        yOffset: yOffset + row * rowHeight,\n        canvasHeight: nextPowOfTwo(yOffset + (row + 1) * rowHeight)\n    };\n}\nfunction getTextWidth(text, mapping) {\n    var width = 0;\n    for(var i = 0; i < text.length; i++){\n        var character = text[i];\n        var frameWidth = null;\n        var frame = mapping && mapping[character];\n        if (frame) frameWidth = frame.width;\n        width += frameWidth;\n    }\n    return width;\n}\nfunction breakAll(text, maxWidth, iconMapping) {\n    var rows = [];\n    var rowStartCharIndex = 0;\n    var rowOffsetLeft = 0;\n    for(var i = 0; i < text.length; i++){\n        var textWidth = getTextWidth(text[i], iconMapping);\n        if (rowOffsetLeft + textWidth > maxWidth) {\n            if (rowStartCharIndex < i) rows.push(text.substring(rowStartCharIndex, i));\n            rowStartCharIndex = i;\n            rowOffsetLeft = 0;\n        }\n        rowOffsetLeft += textWidth;\n    }\n    if (rowStartCharIndex < text.length) rows.push(text.substring(rowStartCharIndex));\n    return {\n        rows: rows,\n        lastRowStartCharIndex: rowStartCharIndex,\n        lastRowOffsetLeft: rowOffsetLeft\n    };\n}\nfunction breakWord(text, maxWidth, iconMapping) {\n    var rows = [];\n    var rowStartCharIndex = 0;\n    var groupStartCharIndex = 0;\n    var rowOffsetLeft = 0;\n    var group = null;\n    for(var i = 0; i < text.length; i++){\n        if (text[i] === \" \") {\n            group = text[i];\n            groupStartCharIndex = i + 1;\n        } else if (i + 1 < text.length && text[i + 1] === \" \" || i + 1 === text.length) {\n            group = text.substring(groupStartCharIndex, i + 1);\n            groupStartCharIndex = i + 1;\n        } else group = null;\n        if (group) {\n            var groupWidth = getTextWidth(group, iconMapping);\n            if (rowOffsetLeft + groupWidth > maxWidth) {\n                var lastGroupStartIndex = groupStartCharIndex - group.length;\n                if (rowStartCharIndex < lastGroupStartIndex) {\n                    rows.push(text.substring(rowStartCharIndex, lastGroupStartIndex));\n                    rowStartCharIndex = lastGroupStartIndex;\n                    rowOffsetLeft = 0;\n                }\n                if (groupWidth > maxWidth) {\n                    var subGroups = breakAll(group, maxWidth, iconMapping);\n                    if (subGroups.rows.length > 1) rows = rows.concat(subGroups.rows.slice(0, subGroups.rows.length - 1));\n                    rowStartCharIndex = rowStartCharIndex + subGroups.lastRowStartCharIndex;\n                    groupWidth = subGroups.lastRowOffsetLeft;\n                }\n            }\n            rowOffsetLeft += groupWidth;\n        }\n    }\n    if (rowStartCharIndex < text.length) rows.push(text.substring(rowStartCharIndex));\n    return {\n        rows: rows,\n        lastRowStartCharIndex: rowStartCharIndex,\n        lastRowOffsetLeft: rowOffsetLeft\n    };\n}\nfunction autoWrapping(text, wordBreak, maxWidth, iconMapping) {\n    if (wordBreak === \"break-all\") return breakAll(text, maxWidth, iconMapping);\n    return breakWord(text, maxWidth, iconMapping);\n}\nfunction transformRow(row, iconMapping) {\n    var x = 0;\n    var rowHeight = 0;\n    var leftOffsets = new Array(row.length);\n    for(var i = 0; i < row.length; i++){\n        var character = row[i];\n        var frame = iconMapping[character];\n        if (frame) {\n            if (!rowHeight) rowHeight = frame.height;\n            leftOffsets[i] = x + frame.width / 2;\n            x += frame.width;\n        } else {\n            (0, _core.log).warn(\"Missing character: \".concat(character))();\n            leftOffsets[i] = x;\n            x += MISSING_CHAR_WIDTH;\n        }\n    }\n    return {\n        leftOffsets: leftOffsets,\n        rowWidth: x,\n        rowHeight: rowHeight\n    };\n}\nfunction transformParagraph(paragraph, lineHeight, wordBreak, maxWidth, iconMapping) {\n    var result = new Array(paragraph.length);\n    var autoWrappingEnabled = (wordBreak === \"break-word\" || wordBreak === \"break-all\") && isFinite(maxWidth) && maxWidth > 0;\n    var size = [\n        0,\n        0\n    ];\n    var rowOffsetTop = 0;\n    var lineStartIndex = 0;\n    for(var i = 0; i <= paragraph.length; i++){\n        var _char2 = paragraph[i];\n        var line = void 0;\n        if (_char2 === \"\\n\" || _char2 === undefined) line = paragraph.slice(lineStartIndex, i);\n        if (line) {\n            var rows = autoWrappingEnabled ? autoWrapping(line, wordBreak, maxWidth, iconMapping).rows : [\n                line\n            ];\n            var _iterator2 = _createForOfIteratorHelper(rows), _step2;\n            try {\n                for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                    var row = _step2.value;\n                    var _transformRow = transformRow(row, iconMapping, lineHeight), rowWidth = _transformRow.rowWidth, rowHeight = _transformRow.rowHeight, leftOffsets = _transformRow.leftOffsets;\n                    var _iterator3 = _createForOfIteratorHelper(leftOffsets), _step3;\n                    try {\n                        for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                            var x = _step3.value;\n                            result[lineStartIndex++] = {\n                                x: x,\n                                y: rowOffsetTop + rowHeight / 2,\n                                rowWidth: rowWidth\n                            };\n                        }\n                    } catch (err) {\n                        _iterator3.e(err);\n                    } finally{\n                        _iterator3.f();\n                    }\n                    rowOffsetTop = rowOffsetTop + rowHeight * lineHeight;\n                    size[0] = autoWrappingEnabled ? maxWidth : Math.max(size[0], rowWidth);\n                }\n            } catch (err) {\n                _iterator2.e(err);\n            } finally{\n                _iterator2.f();\n            }\n        }\n        if (_char2 === \"\\n\") result[lineStartIndex++] = {\n            x: 0,\n            y: 0,\n            rowWidth: 0\n        };\n    }\n    size[1] = rowOffsetTop;\n    return {\n        characters: result,\n        size: size\n    };\n}\nfunction getTextFromBuffer(_ref2) {\n    var value = _ref2.value, length = _ref2.length, stride = _ref2.stride, offset = _ref2.offset, startIndices = _ref2.startIndices;\n    var bytesPerElement = value.BYTES_PER_ELEMENT;\n    var elementStride = stride ? stride / bytesPerElement : 1;\n    var elementOffset = offset ? offset / bytesPerElement : 0;\n    var characterCount = startIndices[length] || Math.floor((value.length - elementOffset - bytesPerElement) / elementStride) + 1;\n    var texts = new Array(length);\n    var codes = value;\n    if (elementStride > 1 || elementOffset > 0) {\n        codes = new value.constructor(characterCount);\n        for(var i = 0; i < characterCount; i++)codes[i] = value[i * elementStride + elementOffset];\n    }\n    for(var index = 0; index < length; index++){\n        var startIndex = startIndices[index];\n        var endIndex = startIndices[index + 1] || characterCount;\n        texts[index] = String.fromCodePoint.apply(null, codes.subarray(startIndex, endIndex));\n    }\n    return {\n        texts: texts,\n        characterCount: characterCount\n    };\n}\n\n},{\"@deck.gl/core\":\"gu68g\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b1X7F\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LRUCache);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar LRUCache = function() {\n    function LRUCache1() {\n        var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5;\n        (0, _classCallCheckDefault.default)(this, LRUCache1);\n        this.limit = limit;\n        this.clear();\n    }\n    (0, _createClassDefault.default)(LRUCache1, [\n        {\n            key: \"clear\",\n            value: function clear() {\n                this._cache = {};\n                this._order = [];\n            }\n        },\n        {\n            key: \"get\",\n            value: function get(key) {\n                var value = this._cache[key];\n                if (value) {\n                    this._deleteOrder(key);\n                    this._appendOrder(key);\n                }\n                return value;\n            }\n        },\n        {\n            key: \"set\",\n            value: function set(key, value) {\n                if (!this._cache[key]) {\n                    if (Object.keys(this._cache).length === this.limit) this[\"delete\"](this._order[0]);\n                    this._cache[key] = value;\n                    this._appendOrder(key);\n                } else {\n                    this[\"delete\"](key);\n                    this._cache[key] = value;\n                    this._appendOrder(key);\n                }\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete(key) {\n                var value = this._cache[key];\n                if (value) {\n                    this._deleteCache(key);\n                    this._deleteOrder(key);\n                }\n            }\n        },\n        {\n            key: \"_deleteCache\",\n            value: function _deleteCache(key) {\n                delete this._cache[key];\n            }\n        },\n        {\n            key: \"_deleteOrder\",\n            value: function _deleteOrder(key) {\n                var index = this._order.findIndex(function(o) {\n                    return o === key;\n                });\n                if (index >= 0) this._order.splice(index, 1);\n            }\n        },\n        {\n            key: \"_appendOrder\",\n            value: function _appendOrder(key) {\n                this._order.push(key);\n            }\n        }\n    ]);\n    return LRUCache1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"3owyr\",\"@babel/runtime/helpers/esm/createClass\":\"1VLPU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1ublu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Dataflow\", ()=>(0, _vegaDataflow.Dataflow));\nparcelHelpers.export(exports, \"EventStream\", ()=>(0, _vegaDataflow.EventStream));\nparcelHelpers.export(exports, \"MultiPulse\", ()=>(0, _vegaDataflow.MultiPulse));\nparcelHelpers.export(exports, \"Operator\", ()=>(0, _vegaDataflow.Operator));\nparcelHelpers.export(exports, \"Parameters\", ()=>(0, _vegaDataflow.Parameters));\nparcelHelpers.export(exports, \"Pulse\", ()=>(0, _vegaDataflow.Pulse));\nparcelHelpers.export(exports, \"Transform\", ()=>(0, _vegaDataflow.Transform));\nparcelHelpers.export(exports, \"changeset\", ()=>(0, _vegaDataflow.changeset));\nparcelHelpers.export(exports, \"definition\", ()=>(0, _vegaDataflow.definition));\nparcelHelpers.export(exports, \"ingest\", ()=>(0, _vegaDataflow.ingest));\nparcelHelpers.export(exports, \"isTuple\", ()=>(0, _vegaDataflow.isTuple));\nparcelHelpers.export(exports, \"transform\", ()=>(0, _vegaDataflow.transform));\nparcelHelpers.export(exports, \"transforms\", ()=>(0, _vegaDataflow.transforms));\nparcelHelpers.export(exports, \"tupleid\", ()=>(0, _vegaDataflow.tupleid));\nparcelHelpers.export(exports, \"interpolate\", ()=>(0, _vegaScale.interpolate));\nparcelHelpers.export(exports, \"interpolateColors\", ()=>(0, _vegaScale.interpolateColors));\nparcelHelpers.export(exports, \"interpolateRange\", ()=>(0, _vegaScale.interpolateRange));\nparcelHelpers.export(exports, \"quantizeInterpolator\", ()=>(0, _vegaScale.quantizeInterpolator));\nparcelHelpers.export(exports, \"scale\", ()=>(0, _vegaScale.scale));\nparcelHelpers.export(exports, \"scheme\", ()=>(0, _vegaScale.scheme));\nparcelHelpers.export(exports, \"projection\", ()=>(0, _vegaProjection.projection));\nparcelHelpers.export(exports, \"View\", ()=>(0, _vegaView.View));\nparcelHelpers.export(exports, \"defaultLocale\", ()=>(0, _vegaFormat.defaultLocale));\nparcelHelpers.export(exports, \"formatLocale\", ()=>(0, _vegaFormat.numberFormatDefaultLocale));\nparcelHelpers.export(exports, \"locale\", ()=>(0, _vegaFormat.locale));\nparcelHelpers.export(exports, \"resetDefaultLocale\", ()=>(0, _vegaFormat.resetDefaultLocale));\nparcelHelpers.export(exports, \"timeFormatLocale\", ()=>(0, _vegaFormat.timeFormatDefaultLocale));\nparcelHelpers.export(exports, \"expressionFunction\", ()=>(0, _vegaFunctions.expressionFunction));\nparcelHelpers.export(exports, \"parse\", ()=>(0, _vegaParser.parse));\nparcelHelpers.export(exports, \"runtimeContext\", ()=>(0, _vegaRuntime.context));\nparcelHelpers.export(exports, \"codegenExpression\", ()=>(0, _vegaExpression.codegen));\nparcelHelpers.export(exports, \"parseExpression\", ()=>(0, _vegaExpression.parse));\nparcelHelpers.export(exports, \"parseSelector\", ()=>(0, _vegaEventSelector.selector));\nparcelHelpers.export(exports, \"version\", ()=>version);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaTransforms = require(\"vega-transforms\");\nvar _vegaViewTransforms = require(\"vega-view-transforms\");\nvar _vegaEncode = require(\"vega-encode\");\nvar _vegaGeo = require(\"vega-geo\");\nvar _vegaForce = require(\"vega-force\");\nvar _vegaHierarchy = require(\"vega-hierarchy\");\nvar _vegaLabel = require(\"vega-label\");\nvar _vegaRegression = require(\"vega-regression\");\nvar _vegaVoronoi = require(\"vega-voronoi\");\nvar _vegaWordcloud = require(\"vega-wordcloud\");\nvar _vegaCrossfilter = require(\"vega-crossfilter\");\nparcelHelpers.exportAll(_vegaUtil, exports);\nvar _vegaStatistics = require(\"vega-statistics\");\nparcelHelpers.exportAll(_vegaStatistics, exports);\nvar _vegaTime = require(\"vega-time\");\nparcelHelpers.exportAll(_vegaTime, exports);\nvar _vegaLoader = require(\"vega-loader\");\nparcelHelpers.exportAll(_vegaLoader, exports);\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nparcelHelpers.exportAll(_vegaScenegraph, exports);\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaProjection = require(\"vega-projection\");\nvar _vegaView = require(\"vega-view\");\nvar _vegaFormat = require(\"vega-format\");\nvar _vegaFunctions = require(\"vega-functions\");\nvar _vegaParser = require(\"vega-parser\");\nvar _vegaRuntime = require(\"vega-runtime\");\nvar _vegaExpression = require(\"vega-expression\");\nvar _vegaEventSelector = require(\"vega-event-selector\");\nvar name = \"vega\";\nvar version$1 = \"5.20.2\";\nvar description = \"The Vega visualization grammar.\";\nvar keywords = [\n    \"vega\",\n    \"visualization\",\n    \"interaction\",\n    \"dataflow\",\n    \"library\",\n    \"data\",\n    \"d3\"\n];\nvar license = \"BSD-3-Clause\";\nvar author = \"UW Interactive Data Lab (http://idl.cs.washington.edu)\";\nvar main = \"build/vega-node.js\";\nvar module = \"build/vega.module.js\";\nvar unpkg = \"build/vega.min.js\";\nvar jsdelivr = \"build/vega.min.js\";\nvar types = \"index.d.ts\";\nvar repository = \"vega/vega\";\nvar scripts = {\n    bundle: \"rollup -c --config-bundle\",\n    prebuild: \"rimraf build && rimraf build-es5\",\n    build: \"rollup -c --config-core --config-bundle --config-ie\",\n    postbuild: \"node schema-copy\",\n    pretest: \"yarn build --config-test\",\n    test: \"TZ=America/Los_Angeles tape 'test/**/*-test.js'\",\n    prepublishOnly: \"yarn test && yarn build\",\n    postpublish: \"./schema-deploy.sh\"\n};\nvar dependencies = {\n    \"vega-crossfilter\": \"~4.0.5\",\n    \"vega-dataflow\": \"~5.7.4\",\n    \"vega-encode\": \"~4.8.3\",\n    \"vega-event-selector\": \"~2.0.6\",\n    \"vega-expression\": \"~4.0.1\",\n    \"vega-force\": \"~4.0.7\",\n    \"vega-format\": \"~1.0.4\",\n    \"vega-functions\": \"~5.12.0\",\n    \"vega-geo\": \"~4.3.8\",\n    \"vega-hierarchy\": \"~4.0.9\",\n    \"vega-label\": \"~1.0.0\",\n    \"vega-loader\": \"~4.4.0\",\n    \"vega-parser\": \"~6.1.3\",\n    \"vega-projection\": \"~1.4.5\",\n    \"vega-regression\": \"~1.0.9\",\n    \"vega-runtime\": \"~6.1.3\",\n    \"vega-scale\": \"~7.1.1\",\n    \"vega-scenegraph\": \"~4.9.4\",\n    \"vega-statistics\": \"~1.7.9\",\n    \"vega-time\": \"~2.0.4\",\n    \"vega-transforms\": \"~4.9.4\",\n    \"vega-typings\": \"~0.21.0\",\n    \"vega-util\": \"~1.16.1\",\n    \"vega-view\": \"~5.10.1\",\n    \"vega-view-transforms\": \"~4.5.8\",\n    \"vega-voronoi\": \"~4.1.5\",\n    \"vega-wordcloud\": \"~4.1.3\"\n};\nvar devDependencies = {\n    \"vega-schema\": \"*\"\n};\nvar gitHead = \"e251dbc61ab6645689d9f349e7dd9d15ddb85bce\";\nvar pkg = {\n    name: name,\n    version: version$1,\n    description: description,\n    keywords: keywords,\n    license: license,\n    author: author,\n    main: main,\n    module: module,\n    unpkg: unpkg,\n    jsdelivr: jsdelivr,\n    types: types,\n    repository: repository,\n    scripts: scripts,\n    dependencies: dependencies,\n    devDependencies: devDependencies,\n    gitHead: gitHead\n};\n// -- Transforms -----\n(0, _vegaUtil.extend)((0, _vegaDataflow.transforms), _vegaTransforms, _vegaViewTransforms, _vegaEncode, _vegaGeo, _vegaForce, _vegaLabel, _vegaHierarchy, _vegaRegression, _vegaVoronoi, _vegaWordcloud, _vegaCrossfilter); // -- Exports -----\nconst version = pkg.version;\n\n},{\"vega-util\":\"dPFAY\",\"vega-dataflow\":\"4kvYg\",\"vega-transforms\":\"b5NmQ\",\"vega-view-transforms\":\"5GAYs\",\"vega-encode\":\"045Ip\",\"vega-geo\":\"35zWv\",\"vega-force\":\"gbywE\",\"vega-hierarchy\":\"5vTN6\",\"vega-label\":\"1Rqgb\",\"vega-regression\":\"kvZot\",\"vega-voronoi\":\"6qrVt\",\"vega-wordcloud\":\"77b1A\",\"vega-crossfilter\":\"e4OAM\",\"vega-statistics\":\"hZmG3\",\"vega-time\":\"hDlOp\",\"vega-loader\":\"fAGtK\",\"vega-scenegraph\":\"gIB0Z\",\"vega-scale\":\"evQIv\",\"vega-projection\":\"6FRxi\",\"vega-view\":\"trjDL\",\"vega-format\":\"bXIHh\",\"vega-functions\":\"92bWe\",\"vega-parser\":\"irqWQ\",\"vega-runtime\":\"37uhx\",\"vega-expression\":\"kqWZH\",\"vega-event-selector\":\"kbnnw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dPFAY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Debug\", ()=>Debug);\nparcelHelpers.export(exports, \"Error\", ()=>Error$1);\nparcelHelpers.export(exports, \"Info\", ()=>Info);\nparcelHelpers.export(exports, \"None\", ()=>None);\nparcelHelpers.export(exports, \"Warn\", ()=>Warn);\nparcelHelpers.export(exports, \"accessor\", ()=>accessor);\nparcelHelpers.export(exports, \"accessorFields\", ()=>accessorFields);\nparcelHelpers.export(exports, \"accessorName\", ()=>accessorName);\nparcelHelpers.export(exports, \"array\", ()=>array);\nparcelHelpers.export(exports, \"ascending\", ()=>ascending);\nparcelHelpers.export(exports, \"clampRange\", ()=>clampRange);\nparcelHelpers.export(exports, \"compare\", ()=>compare);\nparcelHelpers.export(exports, \"constant\", ()=>constant);\nparcelHelpers.export(exports, \"debounce\", ()=>debounce);\nparcelHelpers.export(exports, \"error\", ()=>error);\nparcelHelpers.export(exports, \"extend\", ()=>extend);\nparcelHelpers.export(exports, \"extent\", ()=>extent);\nparcelHelpers.export(exports, \"extentIndex\", ()=>extentIndex);\nparcelHelpers.export(exports, \"falsy\", ()=>falsy);\nparcelHelpers.export(exports, \"fastmap\", ()=>fastmap);\nparcelHelpers.export(exports, \"field\", ()=>field);\nparcelHelpers.export(exports, \"flush\", ()=>flush);\nparcelHelpers.export(exports, \"hasOwnProperty\", ()=>has);\nparcelHelpers.export(exports, \"id\", ()=>id);\nparcelHelpers.export(exports, \"identity\", ()=>identity);\nparcelHelpers.export(exports, \"inherits\", ()=>inherits);\nparcelHelpers.export(exports, \"inrange\", ()=>inrange);\nparcelHelpers.export(exports, \"isArray\", ()=>isArray);\nparcelHelpers.export(exports, \"isBoolean\", ()=>isBoolean);\nparcelHelpers.export(exports, \"isDate\", ()=>isDate);\nparcelHelpers.export(exports, \"isFunction\", ()=>isFunction);\nparcelHelpers.export(exports, \"isIterable\", ()=>isIterable);\nparcelHelpers.export(exports, \"isNumber\", ()=>isNumber);\nparcelHelpers.export(exports, \"isObject\", ()=>isObject);\nparcelHelpers.export(exports, \"isRegExp\", ()=>isRegExp);\nparcelHelpers.export(exports, \"isString\", ()=>isString);\nparcelHelpers.export(exports, \"key\", ()=>key);\nparcelHelpers.export(exports, \"lerp\", ()=>lerp);\nparcelHelpers.export(exports, \"logger\", ()=>logger);\nparcelHelpers.export(exports, \"lruCache\", ()=>lruCache);\nparcelHelpers.export(exports, \"merge\", ()=>merge);\nparcelHelpers.export(exports, \"mergeConfig\", ()=>mergeConfig);\nparcelHelpers.export(exports, \"one\", ()=>one);\nparcelHelpers.export(exports, \"pad\", ()=>pad);\nparcelHelpers.export(exports, \"panLinear\", ()=>panLinear);\nparcelHelpers.export(exports, \"panLog\", ()=>panLog);\nparcelHelpers.export(exports, \"panPow\", ()=>panPow);\nparcelHelpers.export(exports, \"panSymlog\", ()=>panSymlog);\nparcelHelpers.export(exports, \"peek\", ()=>peek);\nparcelHelpers.export(exports, \"quarter\", ()=>quarter);\nparcelHelpers.export(exports, \"repeat\", ()=>repeat);\nparcelHelpers.export(exports, \"span\", ()=>span);\nparcelHelpers.export(exports, \"splitAccessPath\", ()=>splitAccessPath);\nparcelHelpers.export(exports, \"stringValue\", ()=>$);\nparcelHelpers.export(exports, \"toBoolean\", ()=>toBoolean);\nparcelHelpers.export(exports, \"toDate\", ()=>toDate);\nparcelHelpers.export(exports, \"toNumber\", ()=>toNumber);\nparcelHelpers.export(exports, \"toSet\", ()=>toSet);\nparcelHelpers.export(exports, \"toString\", ()=>toString);\nparcelHelpers.export(exports, \"truncate\", ()=>truncate);\nparcelHelpers.export(exports, \"truthy\", ()=>truthy);\nparcelHelpers.export(exports, \"utcquarter\", ()=>utcquarter);\nparcelHelpers.export(exports, \"visitArray\", ()=>visitArray);\nparcelHelpers.export(exports, \"writeConfig\", ()=>writeConfig);\nparcelHelpers.export(exports, \"zero\", ()=>zero);\nparcelHelpers.export(exports, \"zoomLinear\", ()=>zoomLinear);\nparcelHelpers.export(exports, \"zoomLog\", ()=>zoomLog);\nparcelHelpers.export(exports, \"zoomPow\", ()=>zoomPow);\nparcelHelpers.export(exports, \"zoomSymlog\", ()=>zoomSymlog);\nfunction accessor(fn, fields, name) {\n    fn.fields = fields || [];\n    fn.fname = name;\n    return fn;\n}\nfunction accessorName(fn) {\n    return fn == null ? null : fn.fname;\n}\nfunction accessorFields(fn) {\n    return fn == null ? null : fn.fields;\n}\nfunction getter(path) {\n    return path.length === 1 ? get1(path[0]) : getN(path);\n}\nconst get1 = (field1)=>function(obj) {\n        return obj[field1];\n    };\nconst getN = (path)=>{\n    const len = path.length;\n    return function(obj) {\n        for(let i = 0; i < len; ++i)obj = obj[path[i]];\n        return obj;\n    };\n};\nfunction error(message) {\n    throw Error(message);\n}\nfunction splitAccessPath(p) {\n    const path = [], n = p.length;\n    let q = null, b = 0, s = \"\", i, j, c;\n    p = p + \"\";\n    function push() {\n        path.push(s + p.substring(i, j));\n        s = \"\";\n        i = j + 1;\n    }\n    for(i = j = 0; j < n; ++j){\n        c = p[j];\n        if (c === \"\\\\\") {\n            s += p.substring(i, j);\n            s += p.substring(++j, ++j);\n            i = j;\n        } else if (c === q) {\n            push();\n            q = null;\n            b = -1;\n        } else if (q) continue;\n        else if (i === b && c === '\"') {\n            i = j + 1;\n            q = c;\n        } else if (i === b && c === \"'\") {\n            i = j + 1;\n            q = c;\n        } else if (c === \".\" && !b) {\n            if (j > i) push();\n            else i = j + 1;\n        } else if (c === \"[\") {\n            if (j > i) push();\n            b = i = j + 1;\n        } else if (c === \"]\") {\n            if (!b) error(\"Access path missing open bracket: \" + p);\n            if (b > 0) push();\n            b = 0;\n            i = j + 1;\n        }\n    }\n    if (b) error(\"Access path missing closing bracket: \" + p);\n    if (q) error(\"Access path missing closing quote: \" + p);\n    if (j > i) {\n        j++;\n        push();\n    }\n    return path;\n}\nfunction field(field2, name, opt) {\n    const path = splitAccessPath(field2);\n    field2 = path.length === 1 ? path[0] : field2;\n    return accessor((opt && opt.get || getter)(path), [\n        field2\n    ], name || field2);\n}\nconst id = field(\"id\");\nconst identity = accessor((_)=>_, [], \"identity\");\nconst zero = accessor(()=>0, [], \"zero\");\nconst one = accessor(()=>1, [], \"one\");\nconst truthy = accessor(()=>true, [], \"true\");\nconst falsy = accessor(()=>false, [], \"false\");\nfunction log$1(method, level, input) {\n    const args = [\n        level\n    ].concat([].slice.call(input));\n    console[method].apply(console, args); // eslint-disable-line no-console\n}\nconst None = 0;\nconst Error$1 = 1;\nconst Warn = 2;\nconst Info = 3;\nconst Debug = 4;\nfunction logger(_1, method) {\n    let level = _1 || None;\n    return {\n        level (_) {\n            if (arguments.length) {\n                level = +_;\n                return this;\n            } else return level;\n        },\n        error () {\n            if (level >= Error$1) log$1(method || \"error\", \"ERROR\", arguments);\n            return this;\n        },\n        warn () {\n            if (level >= Warn) log$1(method || \"warn\", \"WARN\", arguments);\n            return this;\n        },\n        info () {\n            if (level >= Info) log$1(method || \"log\", \"INFO\", arguments);\n            return this;\n        },\n        debug () {\n            if (level >= Debug) log$1(method || \"log\", \"DEBUG\", arguments);\n            return this;\n        }\n    };\n}\nvar isArray = Array.isArray;\nfunction isObject(_) {\n    return _ === Object(_);\n}\nconst isLegalKey = (key1)=>key1 !== \"__proto__\";\nfunction mergeConfig(...configs) {\n    return configs.reduce((out, source)=>{\n        for(const key2 in source)if (key2 === \"signals\") // for signals, we merge the signals arrays\n        // source signals take precedence over\n        // existing signals with the same name\n        out.signals = mergeNamed(out.signals, source.signals);\n        else {\n            // otherwise, merge objects subject to recursion constraints\n            // for legend block, recurse for the layout entry only\n            // for style block, recurse for all properties\n            // otherwise, no recursion: objects overwrite, no merging\n            const r = key2 === \"legend\" ? {\n                layout: 1\n            } : key2 === \"style\" ? true : null;\n            writeConfig(out, key2, source[key2], r);\n        }\n        return out;\n    }, {});\n}\nfunction writeConfig(output, key3, value, recurse) {\n    if (!isLegalKey(key3)) return;\n    let k, o;\n    if (isObject(value) && !isArray(value)) {\n        o = isObject(output[key3]) ? output[key3] : output[key3] = {};\n        for(k in value){\n            if (recurse && (recurse === true || recurse[k])) writeConfig(o, k, value[k]);\n            else if (isLegalKey(k)) o[k] = value[k];\n        }\n    } else output[key3] = value;\n}\nfunction mergeNamed(a, b) {\n    if (a == null) return b;\n    const map = {}, out = [];\n    function add(_) {\n        if (!map[_.name]) {\n            map[_.name] = 1;\n            out.push(_);\n        }\n    }\n    b.forEach(add);\n    a.forEach(add);\n    return out;\n}\nfunction peek(array1) {\n    return array1[array1.length - 1];\n}\nfunction toNumber(_) {\n    return _ == null || _ === \"\" ? null : +_;\n}\nconst exp = (sign)=>(x)=>sign * Math.exp(x);\nconst log = (sign)=>(x)=>Math.log(sign * x);\nconst symlog = (c)=>(x)=>Math.sign(x) * Math.log1p(Math.abs(x / c));\nconst symexp = (c)=>(x)=>Math.sign(x) * Math.expm1(Math.abs(x)) * c;\nconst pow = (exponent)=>(x)=>x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\nfunction pan(domain, delta, lift, ground) {\n    const d0 = lift(domain[0]), d1 = lift(peek(domain)), dd = (d1 - d0) * delta;\n    return [\n        ground(d0 - dd),\n        ground(d1 - dd)\n    ];\n}\nfunction panLinear(domain, delta) {\n    return pan(domain, delta, toNumber, identity);\n}\nfunction panLog(domain, delta) {\n    var sign = Math.sign(domain[0]);\n    return pan(domain, delta, log(sign), exp(sign));\n}\nfunction panPow(domain, delta, exponent) {\n    return pan(domain, delta, pow(exponent), pow(1 / exponent));\n}\nfunction panSymlog(domain, delta, constant1) {\n    return pan(domain, delta, symlog(constant1), symexp(constant1));\n}\nfunction zoom(domain, anchor, scale, lift, ground) {\n    const d0 = lift(domain[0]), d1 = lift(peek(domain)), da = anchor != null ? lift(anchor) : (d0 + d1) / 2;\n    return [\n        ground(da + (d0 - da) * scale),\n        ground(da + (d1 - da) * scale)\n    ];\n}\nfunction zoomLinear(domain, anchor, scale) {\n    return zoom(domain, anchor, scale, toNumber, identity);\n}\nfunction zoomLog(domain, anchor, scale) {\n    const sign = Math.sign(domain[0]);\n    return zoom(domain, anchor, scale, log(sign), exp(sign));\n}\nfunction zoomPow(domain, anchor, scale, exponent) {\n    return zoom(domain, anchor, scale, pow(exponent), pow(1 / exponent));\n}\nfunction zoomSymlog(domain, anchor, scale, constant2) {\n    return zoom(domain, anchor, scale, symlog(constant2), symexp(constant2));\n}\nfunction quarter(date) {\n    return 1 + ~~(new Date(date).getMonth() / 3);\n}\nfunction utcquarter(date) {\n    return 1 + ~~(new Date(date).getUTCMonth() / 3);\n}\nfunction array(_) {\n    return _ != null ? isArray(_) ? _ : [\n        _\n    ] : [];\n}\n/**\n * Span-preserving range clamp. If the span of the input range is less\n * than (max - min) and an endpoint exceeds either the min or max value,\n * the range is translated such that the span is preserved and one\n * endpoint touches the boundary of the min/max range.\n * If the span exceeds (max - min), the range [min, max] is returned.\n */ function clampRange(range, min, max) {\n    let lo = range[0], hi = range[1], span1;\n    if (hi < lo) {\n        span1 = hi;\n        hi = lo;\n        lo = span1;\n    }\n    span1 = hi - lo;\n    return span1 >= max - min ? [\n        min,\n        max\n    ] : [\n        lo = Math.min(Math.max(lo, min), max - span1),\n        lo + span1\n    ];\n}\nfunction isFunction(_) {\n    return typeof _ === \"function\";\n}\nconst DESCENDING = \"descending\";\nfunction compare(fields, orders, opt) {\n    opt = opt || {};\n    orders = array(orders) || [];\n    const ord = [], get = [], fmap = {}, gen = opt.comparator || comparator;\n    array(fields).forEach((f, i)=>{\n        if (f == null) return;\n        ord.push(orders[i] === DESCENDING ? -1 : 1);\n        get.push(f = isFunction(f) ? f : field(f, null, opt));\n        (accessorFields(f) || []).forEach((_)=>fmap[_] = 1);\n    });\n    return get.length === 0 ? null : accessor(gen(get, ord), Object.keys(fmap));\n}\nconst ascending = (u, v)=>(u < v || u == null) && v != null ? -1 : (u > v || v == null) && u != null ? 1 : (v = v instanceof Date ? +v : v, u = u instanceof Date ? +u : u) !== u && v === v ? -1 : v !== v && u === u ? 1 : 0;\nconst comparator = (fields, orders)=>fields.length === 1 ? compare1(fields[0], orders[0]) : compareN(fields, orders, fields.length);\nconst compare1 = (field3, order)=>function(a, b) {\n        return ascending(field3(a), field3(b)) * order;\n    };\nconst compareN = (fields, orders, n)=>{\n    orders.push(0); // pad zero for convenient lookup\n    return function(a, b) {\n        let f, c = 0, i = -1;\n        while(c === 0 && ++i < n){\n            f = fields[i];\n            c = ascending(f(a), f(b));\n        }\n        return c * orders[i];\n    };\n};\nfunction constant(_) {\n    return isFunction(_) ? _ : ()=>_;\n}\nfunction debounce(delay, handler) {\n    let tid;\n    return (e)=>{\n        if (tid) clearTimeout(tid);\n        tid = setTimeout(()=>(handler(e), tid = null), delay);\n    };\n}\nfunction extend(_) {\n    for(let x, k, i = 1, len = arguments.length; i < len; ++i){\n        x = arguments[i];\n        for(k in x)_[k] = x[k];\n    }\n    return _;\n}\n/**\n * Return an array with minimum and maximum values, in the\n * form [min, max]. Ignores null, undefined, and NaN values.\n */ function extent(array2, f) {\n    let i = 0, n, v, min, max;\n    if (array2 && (n = array2.length)) {\n        if (f == null) {\n            // find first valid value\n            for(v = array2[i]; i < n && (v == null || v !== v); v = array2[++i]);\n            min = max = v; // visit all other values\n            for(; i < n; ++i){\n                v = array2[i]; // skip null/undefined; NaN will fail all comparisons\n                if (v != null) {\n                    if (v < min) min = v;\n                    if (v > max) max = v;\n                }\n            }\n        } else {\n            // find first valid value\n            for(v = f(array2[i]); i < n && (v == null || v !== v); v = f(array2[++i]));\n            min = max = v; // visit all other values\n            for(; i < n; ++i){\n                v = f(array2[i]); // skip null/undefined; NaN will fail all comparisons\n                if (v != null) {\n                    if (v < min) min = v;\n                    if (v > max) max = v;\n                }\n            }\n        }\n    }\n    return [\n        min,\n        max\n    ];\n}\nfunction extentIndex(array3, f) {\n    const n = array3.length;\n    let i = -1, a, b, c, u, v;\n    if (f == null) {\n        while(++i < n){\n            b = array3[i];\n            if (b != null && b >= b) {\n                a = c = b;\n                break;\n            }\n        }\n        if (i === n) return [\n            -1,\n            -1\n        ];\n        u = v = i;\n        while(++i < n){\n            b = array3[i];\n            if (b != null) {\n                if (a > b) {\n                    a = b;\n                    u = i;\n                }\n                if (c < b) {\n                    c = b;\n                    v = i;\n                }\n            }\n        }\n    } else {\n        while(++i < n){\n            b = f(array3[i], i, array3);\n            if (b != null && b >= b) {\n                a = c = b;\n                break;\n            }\n        }\n        if (i === n) return [\n            -1,\n            -1\n        ];\n        u = v = i;\n        while(++i < n){\n            b = f(array3[i], i, array3);\n            if (b != null) {\n                if (a > b) {\n                    a = b;\n                    u = i;\n                }\n                if (c < b) {\n                    c = b;\n                    v = i;\n                }\n            }\n        }\n    }\n    return [\n        u,\n        v\n    ];\n}\nconst hop = Object.prototype.hasOwnProperty;\nfunction has(object, property) {\n    return hop.call(object, property);\n}\nconst NULL = {};\nfunction fastmap(input) {\n    let obj = {}, test;\n    function has$1(key4) {\n        return has(obj, key4) && obj[key4] !== NULL;\n    }\n    const map = {\n        size: 0,\n        empty: 0,\n        object: obj,\n        has: has$1,\n        get (key5) {\n            return has$1(key5) ? obj[key5] : undefined;\n        },\n        set (key6, value) {\n            if (!has$1(key6)) {\n                ++map.size;\n                if (obj[key6] === NULL) --map.empty;\n            }\n            obj[key6] = value;\n            return this;\n        },\n        delete (key7) {\n            if (has$1(key7)) {\n                --map.size;\n                ++map.empty;\n                obj[key7] = NULL;\n            }\n            return this;\n        },\n        clear () {\n            map.size = map.empty = 0;\n            map.object = obj = {};\n        },\n        test (_) {\n            if (arguments.length) {\n                test = _;\n                return map;\n            } else return test;\n        },\n        clean () {\n            const next = {};\n            let size = 0;\n            for(const key8 in obj){\n                const value = obj[key8];\n                if (value !== NULL && (!test || !test(value))) {\n                    next[key8] = value;\n                    ++size;\n                }\n            }\n            map.size = size;\n            map.empty = 0;\n            map.object = obj = next;\n        }\n    };\n    if (input) Object.keys(input).forEach((key9)=>{\n        map.set(key9, input[key9]);\n    });\n    return map;\n}\nfunction flush(range, value, threshold, left, right, center) {\n    if (!threshold && threshold !== 0) return center;\n    const t = +threshold;\n    let a = range[0], b = peek(range), l; // swap endpoints if range is reversed\n    if (b < a) {\n        l = a;\n        a = b;\n        b = l;\n    } // compare value to endpoints\n    l = Math.abs(value - a);\n    const r = Math.abs(b - value); // adjust if value is within threshold distance of endpoint\n    return l < r && l <= t ? left : r <= t ? right : center;\n}\nfunction inherits(child, parent, members) {\n    const proto = child.prototype = Object.create(parent.prototype);\n    Object.defineProperty(proto, \"constructor\", {\n        value: child,\n        writable: true,\n        enumerable: true,\n        configurable: true\n    });\n    return extend(proto, members);\n}\n/**\n * Predicate that returns true if the value lies within the span\n * of the given range. The left and right flags control the use\n * of inclusive (true) or exclusive (false) comparisons.\n */ function inrange(value, range, left, right) {\n    let r0 = range[0], r1 = range[range.length - 1], t;\n    if (r0 > r1) {\n        t = r0;\n        r0 = r1;\n        r1 = t;\n    }\n    left = left === undefined || left;\n    right = right === undefined || right;\n    return (left ? r0 <= value : r0 < value) && (right ? value <= r1 : value < r1);\n}\nfunction isBoolean(_) {\n    return typeof _ === \"boolean\";\n}\nfunction isDate(_) {\n    return Object.prototype.toString.call(_) === \"[object Date]\";\n}\nfunction isIterable(_) {\n    return _ && isFunction(_[Symbol.iterator]);\n}\nfunction isNumber(_) {\n    return typeof _ === \"number\";\n}\nfunction isRegExp(_) {\n    return Object.prototype.toString.call(_) === \"[object RegExp]\";\n}\nfunction isString(_) {\n    return typeof _ === \"string\";\n}\nfunction key(fields, flat, opt) {\n    if (fields) fields = flat ? array(fields).map((f)=>f.replace(/\\\\(.)/g, \"$1\")) : array(fields);\n    const len = fields && fields.length, gen = opt && opt.get || getter, map = (f)=>gen(flat ? [\n            f\n        ] : splitAccessPath(f));\n    let fn;\n    if (!len) fn = function() {\n        return \"\";\n    };\n    else if (len === 1) {\n        const get = map(fields[0]);\n        fn = function(_) {\n            return \"\" + get(_);\n        };\n    } else {\n        const get = fields.map(map);\n        fn = function(_) {\n            let s = \"\" + get[0](_), i = 0;\n            while(++i < len)s += \"|\" + get[i](_);\n            return s;\n        };\n    }\n    return accessor(fn, fields, \"key\");\n}\nfunction lerp(array4, frac) {\n    const lo = array4[0], hi = peek(array4), f = +frac;\n    return !f ? lo : f === 1 ? hi : lo + f * (hi - lo);\n}\nconst DEFAULT_MAX_SIZE = 10000; // adapted from https://github.com/dominictarr/hashlru/ (MIT License)\nfunction lruCache(maxsize) {\n    maxsize = +maxsize || DEFAULT_MAX_SIZE;\n    let curr, prev, size;\n    const clear = ()=>{\n        curr = {};\n        prev = {};\n        size = 0;\n    };\n    const update = (key10, value)=>{\n        if (++size > maxsize) {\n            prev = curr;\n            curr = {};\n            size = 1;\n        }\n        return curr[key10] = value;\n    };\n    clear();\n    return {\n        clear,\n        has: (key11)=>has(curr, key11) || has(prev, key11),\n        get: (key12)=>has(curr, key12) ? curr[key12] : has(prev, key12) ? update(key12, prev[key12]) : undefined,\n        set: (key13, value)=>has(curr, key13) ? curr[key13] = value : update(key13, value)\n    };\n}\nfunction merge(compare2, array0, array1, output) {\n    const n0 = array0.length, n1 = array1.length;\n    if (!n1) return array0;\n    if (!n0) return array1;\n    const merged = output || new array0.constructor(n0 + n1);\n    let i0 = 0, i1 = 0, i = 0;\n    for(; i0 < n0 && i1 < n1; ++i)merged[i] = compare2(array0[i0], array1[i1]) > 0 ? array1[i1++] : array0[i0++];\n    for(; i0 < n0; ++i0, ++i)merged[i] = array0[i0];\n    for(; i1 < n1; ++i1, ++i)merged[i] = array1[i1];\n    return merged;\n}\nfunction repeat(str, reps) {\n    let s = \"\";\n    while(--reps >= 0)s += str;\n    return s;\n}\nfunction pad(str, length, padchar, align) {\n    const c = padchar || \" \", s = str + \"\", n = length - s.length;\n    return n <= 0 ? s : align === \"left\" ? repeat(c, n) + s : align === \"center\" ? repeat(c, ~~(n / 2)) + s + repeat(c, Math.ceil(n / 2)) : s + repeat(c, n);\n}\n/**\n * Return the numerical span of an array: the difference between\n * the last and first values.\n */ function span(array5) {\n    return array5 && peek(array5) - array5[0] || 0;\n}\nfunction $(x) {\n    return isArray(x) ? \"[\" + x.map($) + \"]\" : isObject(x) || isString(x) ? // See http://timelessrepo.com/json-isnt-a-javascript-subset\n    JSON.stringify(x).replace(\"\\u2028\", \"\\\\u2028\").replace(\"\\u2029\", \"\\\\u2029\") : x;\n}\nfunction toBoolean(_) {\n    return _ == null || _ === \"\" ? null : !_ || _ === \"false\" || _ === \"0\" ? false : !!_;\n}\nconst defaultParser = (_)=>isNumber(_) ? _ : isDate(_) ? _ : Date.parse(_);\nfunction toDate(_, parser) {\n    parser = parser || defaultParser;\n    return _ == null || _ === \"\" ? null : parser(_);\n}\nfunction toString(_) {\n    return _ == null || _ === \"\" ? null : _ + \"\";\n}\nfunction toSet(_) {\n    const s = {}, n = _.length;\n    for(let i = 0; i < n; ++i)s[_[i]] = true;\n    return s;\n}\nfunction truncate(str, length, align, ellipsis) {\n    const e = ellipsis != null ? ellipsis : \"\\u2026\", s = str + \"\", n = s.length, l = Math.max(0, length - e.length);\n    return n <= length ? s : align === \"left\" ? e + s.slice(n - l) : align === \"center\" ? s.slice(0, Math.ceil(l / 2)) + e + s.slice(n - ~~(l / 2)) : s.slice(0, l) + e;\n}\nfunction visitArray(array6, filter, visitor) {\n    if (array6) {\n        if (filter) {\n            const n = array6.length;\n            for(let i = 0; i < n; ++i){\n                const t = filter(array6[i]);\n                if (t) visitor(t, i, array6);\n            }\n        } else array6.forEach(visitor);\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4kvYg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Dataflow\", ()=>Dataflow);\nparcelHelpers.export(exports, \"EventStream\", ()=>EventStream);\nparcelHelpers.export(exports, \"MultiPulse\", ()=>MultiPulse);\nparcelHelpers.export(exports, \"Operator\", ()=>Operator);\nparcelHelpers.export(exports, \"Parameters\", ()=>Parameters);\nparcelHelpers.export(exports, \"Pulse\", ()=>Pulse);\nparcelHelpers.export(exports, \"Transform\", ()=>Transform);\nparcelHelpers.export(exports, \"UniqueList\", ()=>UniqueList);\nparcelHelpers.export(exports, \"asyncCallback\", ()=>asyncCallback);\nparcelHelpers.export(exports, \"changeset\", ()=>changeset);\nparcelHelpers.export(exports, \"definition\", ()=>definition);\nparcelHelpers.export(exports, \"derive\", ()=>derive);\nparcelHelpers.export(exports, \"ingest\", ()=>ingest$1);\nparcelHelpers.export(exports, \"isChangeSet\", ()=>isChangeSet);\nparcelHelpers.export(exports, \"isTuple\", ()=>isTuple);\nparcelHelpers.export(exports, \"rederive\", ()=>rederive);\nparcelHelpers.export(exports, \"replace\", ()=>replace);\nparcelHelpers.export(exports, \"stableCompare\", ()=>stableCompare);\nparcelHelpers.export(exports, \"transform\", ()=>transform);\nparcelHelpers.export(exports, \"transforms\", ()=>transforms);\nparcelHelpers.export(exports, \"tupleid\", ()=>tupleid);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaLoader = require(\"vega-loader\");\nvar _vegaFormat = require(\"vega-format\");\nfunction UniqueList(idFunc) {\n    const $ = idFunc || (0, _vegaUtil.identity), list = [], ids = {};\n    list.add = (_)=>{\n        const id = $(_);\n        if (!ids[id]) {\n            ids[id] = 1;\n            list.push(_);\n        }\n        return list;\n    };\n    list.remove = (_)=>{\n        const id = $(_);\n        if (ids[id]) {\n            ids[id] = 0;\n            const idx = list.indexOf(_);\n            if (idx >= 0) list.splice(idx, 1);\n        }\n        return list;\n    };\n    return list;\n}\n/**\n * Invoke and await a potentially async callback function. If\n * an error occurs, trap it and route to Dataflow.error.\n * @param {Dataflow} df - The dataflow instance\n * @param {function} callback - A callback function to invoke\n *   and then await. The dataflow will be passed as the single\n *   argument to the function.\n */ async function asyncCallback(df, callback) {\n    try {\n        await callback(df);\n    } catch (err) {\n        df.error(err);\n    }\n}\nconst TUPLE_ID_KEY = Symbol(\"vega_id\");\nlet TUPLE_ID = 1;\n/**\n * Checks if an input value is a registered tuple.\n * @param {*} t - The value to check.\n * @return {boolean} True if the input is a tuple, false otherwise.\n */ function isTuple(t) {\n    return !!(t && tupleid(t));\n}\n/**\n * Returns the id of a tuple.\n * @param {object} t - The input tuple.\n * @return {*} the tuple id.\n */ function tupleid(t) {\n    return t[TUPLE_ID_KEY];\n}\n/**\n * Sets the id of a tuple.\n * @param {object} t - The input tuple.\n * @param {*} id - The id value to set.\n * @return {object} the input tuple.\n */ function setid(t, id) {\n    t[TUPLE_ID_KEY] = id;\n    return t;\n}\n/**\n * Ingest an object or value as a data tuple.\n * If the input value is an object, an id field will be added to it. For\n * efficiency, the input object is modified directly. A copy is not made.\n * If the input value is a literal, it will be wrapped in a new object\n * instance, with the value accessible as the 'data' property.\n * @param datum - The value to ingest.\n * @return {object} The ingested data tuple.\n */ function ingest$1(datum) {\n    const t = datum === Object(datum) ? datum : {\n        data: datum\n    };\n    return tupleid(t) ? t : setid(t, TUPLE_ID++);\n}\n/**\n * Given a source tuple, return a derived copy.\n * @param {object} t - The source tuple.\n * @return {object} The derived tuple.\n */ function derive(t) {\n    return rederive(t, ingest$1({}));\n}\n/**\n * Rederive a derived tuple by copying values from the source tuple.\n * @param {object} t - The source tuple.\n * @param {object} d - The derived tuple.\n * @return {object} The derived tuple.\n */ function rederive(t, d) {\n    for(const k in t)d[k] = t[k];\n    return d;\n}\n/**\n * Replace an existing tuple with a new tuple.\n * @param {object} t - The existing data tuple.\n * @param {object} d - The new tuple that replaces the old.\n * @return {object} The new tuple.\n */ function replace(t, d) {\n    return setid(d, tupleid(t));\n}\n/**\n * Generate an augmented comparator function that provides stable\n * sorting by tuple id when the given comparator produces ties.\n * @param {function} cmp - The comparator to augment.\n * @param {function} [f] - Optional tuple accessor function.\n * @return {function} An augmented comparator function.\n */ function stableCompare(cmp, f) {\n    return !cmp ? null : f ? (a, b)=>cmp(a, b) || tupleid(f(a)) - tupleid(f(b)) : (a, b)=>cmp(a, b) || tupleid(a) - tupleid(b);\n}\nfunction isChangeSet(v) {\n    return v && v.constructor === changeset;\n}\nfunction changeset() {\n    const add1 = [], // insert tuples\n    rem = [], // remove tuples\n    mod = [], // modify tuples\n    remp = [], // remove by predicate\n    modp = []; // modify by predicate\n    let clean = null, reflow = false;\n    return {\n        constructor: changeset,\n        insert (t) {\n            const d = (0, _vegaUtil.array)(t), n = d.length;\n            for(let i = 0; i < n; ++i)add1.push(d[i]);\n            return this;\n        },\n        remove (t) {\n            const a = (0, _vegaUtil.isFunction)(t) ? remp : rem, d = (0, _vegaUtil.array)(t), n = d.length;\n            for(let i = 0; i < n; ++i)a.push(d[i]);\n            return this;\n        },\n        modify (t, field, value) {\n            const m = {\n                field: field,\n                value: (0, _vegaUtil.constant)(value)\n            };\n            if ((0, _vegaUtil.isFunction)(t)) {\n                m.filter = t;\n                modp.push(m);\n            } else {\n                m.tuple = t;\n                mod.push(m);\n            }\n            return this;\n        },\n        encode (t, set) {\n            if ((0, _vegaUtil.isFunction)(t)) modp.push({\n                filter: t,\n                field: set\n            });\n            else mod.push({\n                tuple: t,\n                field: set\n            });\n            return this;\n        },\n        clean (value) {\n            clean = value;\n            return this;\n        },\n        reflow () {\n            reflow = true;\n            return this;\n        },\n        pulse (pulse1, tuples) {\n            const cur = {}, out = {};\n            let i, n, m, f1, t1, id; // build lookup table of current tuples\n            for(i = 0, n = tuples.length; i < n; ++i)cur[tupleid(tuples[i])] = 1;\n             // process individual tuples to remove\n            for(i = 0, n = rem.length; i < n; ++i){\n                t1 = rem[i];\n                cur[tupleid(t1)] = -1;\n            } // process predicate-based removals\n            for(i = 0, n = remp.length; i < n; ++i){\n                f1 = remp[i];\n                tuples.forEach((t)=>{\n                    if (f1(t)) cur[tupleid(t)] = -1;\n                });\n            } // process all add tuples\n            for(i = 0, n = add1.length; i < n; ++i){\n                t1 = add1[i];\n                id = tupleid(t1);\n                if (cur[id]) // tuple already resides in dataset\n                // if flagged for both add and remove, cancel\n                cur[id] = 1;\n                else // tuple does not reside in dataset, add\n                pulse1.add.push(ingest$1(add1[i]));\n            } // populate pulse rem list\n            for(i = 0, n = tuples.length; i < n; ++i){\n                t1 = tuples[i];\n                if (cur[tupleid(t1)] < 0) pulse1.rem.push(t1);\n            } // modify helper method\n            function modify(t, f, v) {\n                if (v) t[f] = v(t);\n                else pulse1.encode = f;\n                if (!reflow) out[tupleid(t)] = t;\n            } // process individual tuples to modify\n            for(i = 0, n = mod.length; i < n; ++i){\n                m = mod[i];\n                t1 = m.tuple;\n                f1 = m.field;\n                id = cur[tupleid(t1)];\n                if (id > 0) {\n                    modify(t1, f1, m.value);\n                    pulse1.modifies(f1);\n                }\n            } // process predicate-based modifications\n            for(i = 0, n = modp.length; i < n; ++i){\n                m = modp[i];\n                f1 = m.filter;\n                tuples.forEach((t)=>{\n                    if (f1(t) && cur[tupleid(t)] > 0) modify(t, m.field, m.value);\n                });\n                pulse1.modifies(m.field);\n            } // upon reflow request, populate mod with all non-removed tuples\n            // otherwise, populate mod with modified tuples only\n            if (reflow) pulse1.mod = rem.length || remp.length ? tuples.filter((t)=>cur[tupleid(t)] > 0) : tuples.slice();\n            else for(id in out)pulse1.mod.push(out[id]);\n             // set pulse garbage collection request\n            if (clean || clean == null && (rem.length || remp.length)) pulse1.clean(true);\n            return pulse1;\n        }\n    };\n}\nconst CACHE = \"_:mod:_\";\n/**\n * Hash that tracks modifications to assigned values.\n * Callers *must* use the set method to update values.\n */ function Parameters() {\n    Object.defineProperty(this, CACHE, {\n        writable: true,\n        value: {}\n    });\n}\nParameters.prototype = {\n    /**\n   * Set a parameter value. If the parameter value changes, the parameter\n   * will be recorded as modified.\n   * @param {string} name - The parameter name.\n   * @param {number} index - The index into an array-value parameter. Ignored if\n   *   the argument is undefined, null or less than zero.\n   * @param {*} value - The parameter value to set.\n   * @param {boolean} [force=false] - If true, records the parameter as modified\n   *   even if the value is unchanged.\n   * @return {Parameters} - This parameter object.\n   */ set (name, index, value, force) {\n        const o = this, v = o[name], mod = o[CACHE];\n        if (index != null && index >= 0) {\n            if (v[index] !== value || force) {\n                v[index] = value;\n                mod[index + \":\" + name] = -1;\n                mod[name] = -1;\n            }\n        } else if (v !== value || force) {\n            o[name] = value;\n            mod[name] = (0, _vegaUtil.isArray)(value) ? 1 + value.length : -1;\n        }\n        return o;\n    },\n    /**\n   * Tests if one or more parameters has been modified. If invoked with no\n   * arguments, returns true if any parameter value has changed. If the first\n   * argument is array, returns trues if any parameter name in the array has\n   * changed. Otherwise, tests if the given name and optional array index has\n   * changed.\n   * @param {string} name - The parameter name to test.\n   * @param {number} [index=undefined] - The parameter array index to test.\n   * @return {boolean} - Returns true if a queried parameter was modified.\n   */ modified (name, index) {\n        const mod = this[CACHE];\n        if (!arguments.length) {\n            for(const k in mod){\n                if (mod[k]) return true;\n            }\n            return false;\n        } else if ((0, _vegaUtil.isArray)(name)) {\n            for(let k = 0; k < name.length; ++k){\n                if (mod[name[k]]) return true;\n            }\n            return false;\n        }\n        return index != null && index >= 0 ? index + 1 < mod[name] || !!mod[index + \":\" + name] : !!mod[name];\n    },\n    /**\n   * Clears the modification records. After calling this method,\n   * all parameters are considered unmodified.\n   */ clear () {\n        this[CACHE] = {};\n        return this;\n    }\n};\nlet OP_ID = 0;\nconst PULSE = \"pulse\", NO_PARAMS = new Parameters(); // Boolean Flags\nconst SKIP$1 = 1, MODIFIED = 2;\n/**\n * An Operator is a processing node in a dataflow graph.\n * Each operator stores a value and an optional value update function.\n * Operators can accept a hash of named parameters. Parameter values can\n * either be direct (JavaScript literals, arrays, objects) or indirect\n * (other operators whose values will be pulled dynamically). Operators\n * included as parameters will have this operator added as a dependency.\n * @constructor\n * @param {*} [init] - The initial value for this operator.\n * @param {function(object, Pulse)} [update] - An update function. Upon\n *   evaluation of this operator, the update function will be invoked and the\n *   return value will be used as the new value of this operator.\n * @param {object} [params] - The parameters for this operator.\n * @param {boolean} [react=true] - Flag indicating if this operator should\n *   listen for changes to upstream operators included as parameters.\n * @see parameters\n */ function Operator(init, update1, params, react) {\n    this.id = ++OP_ID;\n    this.value = init;\n    this.stamp = -1;\n    this.rank = -1;\n    this.qrank = -1;\n    this.flags = 0;\n    if (update1) this._update = update1;\n    if (params) this.parameters(params, react);\n}\nfunction flag(bit) {\n    return function(state) {\n        const f = this.flags;\n        if (arguments.length === 0) return !!(f & bit);\n        this.flags = state ? f | bit : f & ~bit;\n        return this;\n    };\n}\nOperator.prototype = {\n    /**\n   * Returns a list of target operators dependent on this operator.\n   * If this list does not exist, it is created and then returned.\n   * @return {UniqueList}\n   */ targets () {\n        return this._targets || (this._targets = UniqueList((0, _vegaUtil.id)));\n    },\n    /**\n   * Sets the value of this operator.\n   * @param {*} value - the value to set.\n   * @return {Number} Returns 1 if the operator value has changed\n   *   according to strict equality, returns 0 otherwise.\n   */ set (value) {\n        if (this.value !== value) {\n            this.value = value;\n            return 1;\n        } else return 0;\n    },\n    /**\n   * Indicates that operator evaluation should be skipped on the next pulse.\n   * This operator will still propagate incoming pulses, but its update function\n   * will not be invoked. The skip flag is reset after every pulse, so calling\n   * this method will affect processing of the next pulse only.\n   */ skip: flag(SKIP$1),\n    /**\n   * Indicates that this operator's value has been modified on its most recent\n   * pulse. Normally modification is checked via strict equality; however, in\n   * some cases it is more efficient to update the internal state of an object.\n   * In those cases, the modified flag can be used to trigger propagation. Once\n   * set, the modification flag persists across pulses until unset. The flag can\n   * be used with the last timestamp to test if a modification is recent.\n   */ modified: flag(MODIFIED),\n    /**\n   * Sets the parameters for this operator. The parameter values are analyzed for\n   * operator instances. If found, this operator will be added as a dependency\n   * of the parameterizing operator. Operator values are dynamically marshalled\n   * from each operator parameter prior to evaluation. If a parameter value is\n   * an array, the array will also be searched for Operator instances. However,\n   * the search does not recurse into sub-arrays or object properties.\n   * @param {object} params - A hash of operator parameters.\n   * @param {boolean} [react=true] - A flag indicating if this operator should\n   *   automatically update (react) when parameter values change. In other words,\n   *   this flag determines if the operator registers itself as a listener on\n   *   any upstream operators included in the parameters.\n   * @param {boolean} [initonly=false] - A flag indicating if this operator\n   *   should calculate an update only upon its initiatal evaluation, then\n   *   deregister dependencies and suppress all future update invocations.\n   * @return {Operator[]} - An array of upstream dependencies.\n   */ parameters (params, react, initonly) {\n        react = react !== false;\n        const argval = this._argval = this._argval || new Parameters(), argops = this._argops = this._argops || [], deps = [];\n        let name1, value1, n, i;\n        const add2 = (name, index, value)=>{\n            if (value instanceof Operator) {\n                if (value !== this) {\n                    if (react) value.targets().add(this);\n                    deps.push(value);\n                }\n                argops.push({\n                    op: value,\n                    name: name,\n                    index: index\n                });\n            } else argval.set(name, index, value);\n        };\n        for(name1 in params){\n            value1 = params[name1];\n            if (name1 === PULSE) {\n                (0, _vegaUtil.array)(value1).forEach((op)=>{\n                    if (!(op instanceof Operator)) (0, _vegaUtil.error)(\"Pulse parameters must be operator instances.\");\n                    else if (op !== this) {\n                        op.targets().add(this);\n                        deps.push(op);\n                    }\n                });\n                this.source = value1;\n            } else if ((0, _vegaUtil.isArray)(value1)) {\n                argval.set(name1, -1, Array(n = value1.length));\n                for(i = 0; i < n; ++i)add2(name1, i, value1[i]);\n            } else add2(name1, -1, value1);\n        }\n        this.marshall().clear(); // initialize values\n        if (initonly) argops.initonly = true;\n        return deps;\n    },\n    /**\n   * Internal method for marshalling parameter values.\n   * Visits each operator dependency to pull the latest value.\n   * @return {Parameters} A Parameters object to pass to the update function.\n   */ marshall (stamp) {\n        const argval = this._argval || NO_PARAMS, argops = this._argops;\n        let item, i, op, mod;\n        if (argops) {\n            const n = argops.length;\n            for(i = 0; i < n; ++i){\n                item = argops[i];\n                op = item.op;\n                mod = op.modified() && op.stamp === stamp;\n                argval.set(item.name, item.index, op.value, mod);\n            }\n            if (argops.initonly) {\n                for(i = 0; i < n; ++i){\n                    item = argops[i];\n                    item.op.targets().remove(this);\n                }\n                this._argops = null;\n                this._update = null;\n            }\n        }\n        return argval;\n    },\n    /**\n   * Detach this operator from the dataflow.\n   * Unregisters listeners on upstream dependencies.\n   */ detach () {\n        const argops = this._argops;\n        let i, n, item, op;\n        if (argops) for(i = 0, n = argops.length; i < n; ++i){\n            item = argops[i];\n            op = item.op;\n            if (op._targets) op._targets.remove(this);\n        }\n         // remove references to the source and pulse object,\n        // if present, to prevent memory leaks of old data.\n        this.pulse = null;\n        this.source = null;\n    },\n    /**\n   * Delegate method to perform operator processing.\n   * Subclasses can override this method to perform custom processing.\n   * By default, it marshalls parameters and calls the update function\n   * if that function is defined. If the update function does not\n   * change the operator value then StopPropagation is returned.\n   * If no update function is defined, this method does nothing.\n   * @param {Pulse} pulse - the current dataflow pulse.\n   * @return The output pulse or StopPropagation. A falsy return value\n   *   (including undefined) will let the input pulse pass through.\n   */ evaluate (pulse2) {\n        const update2 = this._update;\n        if (update2) {\n            const params = this.marshall(pulse2.stamp), v = update2.call(this, params, pulse2);\n            params.clear();\n            if (v !== this.value) this.value = v;\n            else if (!this.modified()) return pulse2.StopPropagation;\n        }\n    },\n    /**\n   * Run this operator for the current pulse. If this operator has already\n   * been run at (or after) the pulse timestamp, returns StopPropagation.\n   * Internally, this method calls {@link evaluate} to perform processing.\n   * If {@link evaluate} returns a falsy value, the input pulse is returned.\n   * This method should NOT be overridden, instead overrride {@link evaluate}.\n   * @param {Pulse} pulse - the current dataflow pulse.\n   * @return the output pulse for this operator (or StopPropagation)\n   */ run (pulse3) {\n        if (pulse3.stamp < this.stamp) return pulse3.StopPropagation;\n        let rv;\n        if (this.skip()) {\n            this.skip(false);\n            rv = 0;\n        } else rv = this.evaluate(pulse3);\n        return this.pulse = rv || pulse3;\n    }\n};\n/**\n * Add an operator to the dataflow graph. This function accepts a\n * variety of input argument types. The basic signature supports an\n * initial value, update function and parameters. If the first parameter\n * is an Operator instance, it will be added directly. If it is a\n * constructor for an Operator subclass, a new instance will be instantiated.\n * Otherwise, if the first parameter is a function instance, it will be used\n * as the update function and a null initial value is assumed.\n * @param {*} init - One of: the operator to add, the initial value of\n *   the operator, an operator class to instantiate, or an update function.\n * @param {function} [update] - The operator update function.\n * @param {object} [params] - The operator parameters.\n * @param {boolean} [react=true] - Flag indicating if this operator should\n *   listen for changes to upstream operators included as parameters.\n * @return {Operator} - The added operator.\n */ function add(init, update3, params, react) {\n    let shift = 1, op;\n    if (init instanceof Operator) op = init;\n    else if (init && init.prototype instanceof Operator) op = new init();\n    else if ((0, _vegaUtil.isFunction)(init)) op = new Operator(null, init);\n    else {\n        shift = 0;\n        op = new Operator(init, update3);\n    }\n    this.rank(op);\n    if (shift) {\n        react = params;\n        params = update3;\n    }\n    if (params) this.connect(op, op.parameters(params, react));\n    this.touch(op);\n    return op;\n}\n/**\n * Connect a target operator as a dependent of source operators.\n * If necessary, this method will rerank the target operator and its\n * dependents to ensure propagation proceeds in a topologically sorted order.\n * @param {Operator} target - The target operator.\n * @param {Array<Operator>} - The source operators that should propagate\n *   to the target operator.\n */ function connect(target, sources) {\n    const targetRank = target.rank, n = sources.length;\n    for(let i = 0; i < n; ++i)if (targetRank < sources[i].rank) {\n        this.rerank(target);\n        return;\n    }\n}\nlet STREAM_ID = 0;\n/**\n * Models an event stream.\n * @constructor\n * @param {function(Object, number): boolean} [filter] - Filter predicate.\n *   Events pass through when truthy, events are suppressed when falsy.\n * @param {function(Object): *} [apply] - Applied to input events to produce\n *   new event values.\n * @param {function(Object)} [receive] - Event callback function to invoke\n *   upon receipt of a new event. Use to override standard event processing.\n */ function EventStream(filter1, apply, receive) {\n    this.id = ++STREAM_ID;\n    this.value = null;\n    if (receive) this.receive = receive;\n    if (filter1) this._filter = filter1;\n    if (apply) this._apply = apply;\n}\n/**\n * Creates a new event stream instance with the provided\n * (optional) filter, apply and receive functions.\n * @param {function(Object, number): boolean} [filter] - Filter predicate.\n *   Events pass through when truthy, events are suppressed when falsy.\n * @param {function(Object): *} [apply] - Applied to input events to produce\n *   new event values.\n * @see EventStream\n */ function stream(filter2, apply, receive) {\n    return new EventStream(filter2, apply, receive);\n}\nEventStream.prototype = {\n    _filter: (0, _vegaUtil.truthy),\n    _apply: (0, _vegaUtil.identity),\n    targets () {\n        return this._targets || (this._targets = UniqueList((0, _vegaUtil.id)));\n    },\n    consume (_) {\n        if (!arguments.length) return !!this._consume;\n        this._consume = !!_;\n        return this;\n    },\n    receive (evt) {\n        if (this._filter(evt)) {\n            const val = this.value = this._apply(evt), trg = this._targets, n = trg ? trg.length : 0;\n            for(let i = 0; i < n; ++i)trg[i].receive(val);\n            if (this._consume) {\n                evt.preventDefault();\n                evt.stopPropagation();\n            }\n        }\n    },\n    filter (filter3) {\n        const s = stream(filter3);\n        this.targets().add(s);\n        return s;\n    },\n    apply (apply) {\n        const s = stream(null, apply);\n        this.targets().add(s);\n        return s;\n    },\n    merge () {\n        const s = stream();\n        this.targets().add(s);\n        for(let i = 0, n = arguments.length; i < n; ++i)arguments[i].targets().add(s);\n        return s;\n    },\n    throttle (pause) {\n        let t = -1;\n        return this.filter(()=>{\n            const now = Date.now();\n            if (now - t > pause) {\n                t = now;\n                return 1;\n            } else return 0;\n        });\n    },\n    debounce (delay) {\n        const s = stream();\n        this.targets().add(stream(null, null, (0, _vegaUtil.debounce)(delay, (e)=>{\n            const df = e.dataflow;\n            s.receive(e);\n            if (df && df.run) df.run();\n        })));\n        return s;\n    },\n    between (a, b) {\n        let active = false;\n        a.targets().add(stream(null, null, ()=>active = true));\n        b.targets().add(stream(null, null, ()=>active = false));\n        return this.filter(()=>active);\n    },\n    detach () {\n        // ensures compatibility with operators (#2753)\n        // remove references to other streams and filter functions that may\n        // be bound to subcontexts that need to be garbage collected.\n        this._filter = (0, _vegaUtil.truthy);\n        this._targets = null;\n    }\n};\n/**\n * Create a new event stream from an event source.\n * @param {object} source - The event source to monitor. The input must\n *  support the addEventListener method.\n * @param {string} type - The event type.\n * @param {function(object): boolean} [filter] - Event filter function.\n * @param {function(object): *} [apply] - Event application function.\n *   If provided, this function will be invoked and the result will be\n *   used as the downstream event value.\n * @return {EventStream}\n */ function events(source, type, filter4, apply) {\n    const df = this, s = stream(filter4, apply), send = function(e) {\n        e.dataflow = df;\n        try {\n            s.receive(e);\n        } catch (error) {\n            df.error(error);\n        } finally{\n            df.run();\n        }\n    };\n    let sources;\n    if (typeof source === \"string\" && typeof document !== \"undefined\") sources = document.querySelectorAll(source);\n    else sources = (0, _vegaUtil.array)(source);\n    const n = sources.length;\n    for(let i = 0; i < n; ++i)sources[i].addEventListener(type, send);\n    return s;\n}\nfunction parse(data, format) {\n    const locale = this.locale();\n    return (0, _vegaLoader.read)(data, format, locale.timeParse, locale.utcParse);\n}\n/**\n * Ingests new data into the dataflow. First parses the data using the\n * vega-loader read method, then pulses a changeset to the target operator.\n * @param {Operator} target - The Operator to target with ingested data,\n *   typically a Collect transform instance.\n * @param {*} data - The input data, prior to parsing. For JSON this may\n *   be a string or an object. For CSV, TSV, etc should be a string.\n * @param {object} format - The data format description for parsing\n *   loaded data. This object is passed to the vega-loader read method.\n * @returns {Dataflow}\n */ function ingest(target, data, format) {\n    data = this.parse(data, format);\n    return this.pulse(target, this.changeset().insert(data));\n}\n/**\n * Request data from an external source, parse it, and return a Promise.\n * @param {string} url - The URL from which to load the data. This string\n *   is passed to the vega-loader load method.\n * @param {object} [format] - The data format description for parsing\n *   loaded data. This object is passed to the vega-loader read method.\n * @return {Promise} A Promise that resolves upon completion of the request.\n *   The resolved object contains the following properties:\n *   - data: an array of parsed data (or null upon error)\n *   - status: a code for success (0), load fail (-1), or parse fail (-2)\n */ async function request(url, format) {\n    const df = this;\n    let status = 0, data;\n    try {\n        data = await df.loader().load(url, {\n            context: \"dataflow\",\n            response: (0, _vegaLoader.responseType)(format && format.type)\n        });\n        try {\n            data = df.parse(data, format);\n        } catch (err) {\n            status = -2;\n            df.warn(\"Data ingestion failed\", url, err);\n        }\n    } catch (err) {\n        status = -1;\n        df.warn(\"Loading failed\", url, err);\n    }\n    return {\n        data,\n        status\n    };\n}\nasync function preload(target, url, format) {\n    const df = this, pending = df._pending || loadPending(df);\n    pending.requests += 1;\n    const res = await df.request(url, format);\n    df.pulse(target, df.changeset().remove((0, _vegaUtil.truthy)).insert(res.data || []));\n    pending.done();\n    return res;\n}\nfunction loadPending(df) {\n    let accept;\n    const pending = new Promise((a)=>accept = a);\n    pending.requests = 0;\n    pending.done = ()=>{\n        if (--pending.requests === 0) {\n            df._pending = null;\n            accept(df);\n        }\n    };\n    return df._pending = pending;\n}\nconst SKIP = {\n    skip: true\n};\n/**\n * Perform operator updates in response to events. Applies an\n * update function to compute a new operator value. If the update function\n * returns a {@link ChangeSet}, the operator will be pulsed with those tuple\n * changes. Otherwise, the operator value will be updated to the return value.\n * @param {EventStream|Operator} source - The event source to react to.\n *   This argument can be either an EventStream or an Operator.\n * @param {Operator|function(object):Operator} target - The operator to update.\n *   This argument can either be an Operator instance or (if the source\n *   argument is an EventStream), a function that accepts an event object as\n *   input and returns an Operator to target.\n * @param {function(Parameters,Event): *} [update] - Optional update function\n *   to compute the new operator value, or a literal value to set. Update\n *   functions expect to receive a parameter object and event as arguments.\n *   This function can either return a new operator value or (if the source\n *   argument is an EventStream) a {@link ChangeSet} instance to pulse\n *   the target operator with tuple changes.\n * @param {object} [params] - The update function parameters.\n * @param {object} [options] - Additional options hash. If not overridden,\n *   updated operators will be skipped by default.\n * @param {boolean} [options.skip] - If true, the operator will\n *  be skipped: it will not be evaluated, but its dependents will be.\n * @param {boolean} [options.force] - If true, the operator will\n *   be re-evaluated even if its value has not changed.\n * @return {Dataflow}\n */ function on(source, target, update4, params, options) {\n    const fn = source instanceof Operator ? onOperator : onStream;\n    fn(this, source, target, update4, params, options);\n    return this;\n}\nfunction onStream(df, stream1, target, update5, params, options) {\n    const opt = (0, _vegaUtil.extend)({}, options, SKIP);\n    let func, op;\n    if (!(0, _vegaUtil.isFunction)(target)) target = (0, _vegaUtil.constant)(target);\n    if (update5 === undefined) func = (e)=>df.touch(target(e));\n    else if ((0, _vegaUtil.isFunction)(update5)) {\n        op = new Operator(null, update5, params, false);\n        func = (e)=>{\n            op.evaluate(e);\n            const t = target(e), v = op.value;\n            isChangeSet(v) ? df.pulse(t, v, options) : df.update(t, v, opt);\n        };\n    } else func = (e)=>df.update(target(e), update5, opt);\n    stream1.apply(func);\n}\nfunction onOperator(df, source, target, update6, params, options) {\n    if (update6 === undefined) source.targets().add(target);\n    else {\n        const opt = options || {}, op = new Operator(null, updater(target, update6), params, false);\n        op.modified(opt.force);\n        op.rank = source.rank; // immediately follow source\n        source.targets().add(op); // add dependency\n        if (target) {\n            op.skip(true); // skip first invocation\n            op.value = target.value; // initialize value\n            op.targets().add(target); // chain dependencies\n            df.connect(target, [\n                op\n            ]); // rerank as needed, #1672\n        }\n    }\n}\nfunction updater(target, update7) {\n    update7 = (0, _vegaUtil.isFunction)(update7) ? update7 : (0, _vegaUtil.constant)(update7);\n    return target ? function(_, pulse4) {\n        const value = update7(_, pulse4);\n        if (!target.skip()) target.skip(value !== this.value).value = value;\n        return value;\n    } : update7;\n}\n/**\n * Assigns a rank to an operator. Ranks are assigned in increasing order\n * by incrementing an internal rank counter.\n * @param {Operator} op - The operator to assign a rank.\n */ function rank(op) {\n    op.rank = ++this._rank;\n}\n/**\n * Re-ranks an operator and all downstream target dependencies. This\n * is necessary when upstream dependencies of higher rank are added to\n * a target operator.\n * @param {Operator} op - The operator to re-rank.\n */ function rerank(op) {\n    const queue = [\n        op\n    ];\n    let cur, list, i;\n    while(queue.length){\n        this.rank(cur = queue.pop());\n        if (list = cur._targets) for(i = list.length; --i >= 0;){\n            queue.push(cur = list[i]);\n            if (cur === op) (0, _vegaUtil.error)(\"Cycle detected in dataflow graph.\");\n        }\n    }\n}\n/**\n * Sentinel value indicating pulse propagation should stop.\n */ const StopPropagation = {}; // Pulse visit type flags\nconst ADD = 1, REM = 2, MOD = 4, ADD_REM = ADD | REM, ADD_MOD = ADD | MOD, ALL = ADD | REM | MOD, REFLOW = 8, SOURCE = 16, NO_SOURCE = 32, NO_FIELDS = 64;\n/**\n * A Pulse enables inter-operator communication during a run of the\n * dataflow graph. In addition to the current timestamp, a pulse may also\n * contain a change-set of added, removed or modified data tuples, as well as\n * a pointer to a full backing data source. Tuple change sets may not\n * be fully materialized; for example, to prevent needless array creation\n * a change set may include larger arrays and corresponding filter functions.\n * The pulse provides a {@link visit} method to enable proper and efficient\n * iteration over requested data tuples.\n *\n * In addition, each pulse can track modification flags for data tuple fields.\n * Responsible transform operators should call the {@link modifies} method to\n * indicate changes to data fields. The {@link modified} method enables\n * querying of this modification state.\n *\n * @constructor\n * @param {Dataflow} dataflow - The backing dataflow instance.\n * @param {number} stamp - The current propagation timestamp.\n * @param {string} [encode] - An optional encoding set name, which is then\n *   accessible as Pulse.encode. Operators can respond to (or ignore) this\n *   setting as appropriate. This parameter can be used in conjunction with\n *   the Encode transform in the vega-encode module.\n */ function Pulse(dataflow, stamp, encode) {\n    this.dataflow = dataflow;\n    this.stamp = stamp == null ? -1 : stamp;\n    this.add = [];\n    this.rem = [];\n    this.mod = [];\n    this.fields = null;\n    this.encode = encode || null;\n}\nfunction materialize(data, filter5) {\n    const out = [];\n    (0, _vegaUtil.visitArray)(data, filter5, (_)=>out.push(_));\n    return out;\n}\nfunction filter(pulse5, flags) {\n    const map = {};\n    pulse5.visit(flags, (t)=>{\n        map[tupleid(t)] = 1;\n    });\n    return (t)=>map[tupleid(t)] ? null : t;\n}\nfunction addFilter(a, b) {\n    return a ? (t, i)=>a(t, i) && b(t, i) : b;\n}\nPulse.prototype = {\n    /**\n   * Sentinel value indicating pulse propagation should stop.\n   */ StopPropagation,\n    /**\n   * Boolean flag indicating ADD (added) tuples.\n   */ ADD,\n    /**\n   * Boolean flag indicating REM (removed) tuples.\n   */ REM,\n    /**\n   * Boolean flag indicating MOD (modified) tuples.\n   */ MOD,\n    /**\n   * Boolean flag indicating ADD (added) and REM (removed) tuples.\n   */ ADD_REM,\n    /**\n   * Boolean flag indicating ADD (added) and MOD (modified) tuples.\n   */ ADD_MOD,\n    /**\n   * Boolean flag indicating ADD, REM and MOD tuples.\n   */ ALL,\n    /**\n   * Boolean flag indicating all tuples in a data source\n   * except for the ADD, REM and MOD tuples.\n   */ REFLOW,\n    /**\n   * Boolean flag indicating a 'pass-through' to a\n   * backing data source, ignoring ADD, REM and MOD tuples.\n   */ SOURCE,\n    /**\n   * Boolean flag indicating that source data should be\n   * suppressed when creating a forked pulse.\n   */ NO_SOURCE,\n    /**\n   * Boolean flag indicating that field modifications should be\n   * suppressed when creating a forked pulse.\n   */ NO_FIELDS,\n    /**\n   * Creates a new pulse based on the values of this pulse.\n   * The dataflow, time stamp and field modification values are copied over.\n   * By default, new empty ADD, REM and MOD arrays are created.\n   * @param {number} flags - Integer of boolean flags indicating which (if any)\n   *   tuple arrays should be copied to the new pulse. The supported flag values\n   *   are ADD, REM and MOD. Array references are copied directly: new array\n   *   instances are not created.\n   * @return {Pulse} - The forked pulse instance.\n   * @see init\n   */ fork (flags) {\n        return new Pulse(this.dataflow).init(this, flags);\n    },\n    /**\n   * Creates a copy of this pulse with new materialized array\n   * instances for the ADD, REM, MOD, and SOURCE arrays.\n   * The dataflow, time stamp and field modification values are copied over.\n   * @return {Pulse} - The cloned pulse instance.\n   * @see init\n   */ clone () {\n        const p = this.fork(ALL);\n        p.add = p.add.slice();\n        p.rem = p.rem.slice();\n        p.mod = p.mod.slice();\n        if (p.source) p.source = p.source.slice();\n        return p.materialize(ALL | SOURCE);\n    },\n    /**\n   * Returns a pulse that adds all tuples from a backing source. This is\n   * useful for cases where operators are added to a dataflow after an\n   * upstream data pipeline has already been processed, ensuring that\n   * new operators can observe all tuples within a stream.\n   * @return {Pulse} - A pulse instance with all source tuples included\n   *   in the add array. If the current pulse already has all source\n   *   tuples in its add array, it is returned directly. If the current\n   *   pulse does not have a backing source, it is returned directly.\n   */ addAll () {\n        let p = this;\n        const reuse = !p.source || p.add === p.rem // special case for indexed set (e.g., crossfilter)\n         || !p.rem.length && p.source.length === p.add.length;\n        if (reuse) return p;\n        else {\n            p = new Pulse(this.dataflow).init(this);\n            p.add = p.source;\n            p.rem = []; // new operators can ignore rem #2769\n            return p;\n        }\n    },\n    /**\n   * Initialize this pulse based on the values of another pulse. This method\n   * is used internally by {@link fork} to initialize a new forked tuple.\n   * The dataflow, time stamp and field modification values are copied over.\n   * By default, new empty ADD, REM and MOD arrays are created.\n   * @param {Pulse} src - The source pulse to copy from.\n   * @param {number} flags - Integer of boolean flags indicating which (if any)\n   *   tuple arrays should be copied to the new pulse. The supported flag values\n   *   are ADD, REM and MOD. Array references are copied directly: new array\n   *   instances are not created. By default, source data arrays are copied\n   *   to the new pulse. Use the NO_SOURCE flag to enforce a null source.\n   * @return {Pulse} - Returns this Pulse instance.\n   */ init (src, flags) {\n        const p = this;\n        p.stamp = src.stamp;\n        p.encode = src.encode;\n        if (src.fields && !(flags & NO_FIELDS)) p.fields = src.fields;\n        if (flags & ADD) {\n            p.addF = src.addF;\n            p.add = src.add;\n        } else {\n            p.addF = null;\n            p.add = [];\n        }\n        if (flags & REM) {\n            p.remF = src.remF;\n            p.rem = src.rem;\n        } else {\n            p.remF = null;\n            p.rem = [];\n        }\n        if (flags & MOD) {\n            p.modF = src.modF;\n            p.mod = src.mod;\n        } else {\n            p.modF = null;\n            p.mod = [];\n        }\n        if (flags & NO_SOURCE) {\n            p.srcF = null;\n            p.source = null;\n        } else {\n            p.srcF = src.srcF;\n            p.source = src.source;\n            if (src.cleans) p.cleans = src.cleans;\n        }\n        return p;\n    },\n    /**\n   * Schedules a function to run after pulse propagation completes.\n   * @param {function} func - The function to run.\n   */ runAfter (func) {\n        this.dataflow.runAfter(func);\n    },\n    /**\n   * Indicates if tuples have been added, removed or modified.\n   * @param {number} [flags] - The tuple types (ADD, REM or MOD) to query.\n   *   Defaults to ALL, returning true if any tuple type has changed.\n   * @return {boolean} - Returns true if one or more queried tuple types have\n   *   changed, false otherwise.\n   */ changed (flags) {\n        const f = flags || ALL;\n        return f & ADD && this.add.length || f & REM && this.rem.length || f & MOD && this.mod.length;\n    },\n    /**\n   * Forces a \"reflow\" of tuple values, such that all tuples in the backing\n   * source are added to the MOD set, unless already present in the ADD set.\n   * @param {boolean} [fork=false] - If true, returns a forked copy of this\n   *   pulse, and invokes reflow on that derived pulse.\n   * @return {Pulse} - The reflowed pulse instance.\n   */ reflow (fork) {\n        if (fork) return this.fork(ALL).reflow();\n        const len = this.add.length, src = this.source && this.source.length;\n        if (src && src !== len) {\n            this.mod = this.source;\n            if (len) this.filter(MOD, filter(this, ADD));\n        }\n        return this;\n    },\n    /**\n   * Get/set metadata to pulse requesting garbage collection\n   * to reclaim currently unused resources.\n   */ clean (value) {\n        if (arguments.length) {\n            this.cleans = !!value;\n            return this;\n        } else return this.cleans;\n    },\n    /**\n   * Marks one or more data field names as modified to assist dependency\n   * tracking and incremental processing by transform operators.\n   * @param {string|Array<string>} _ - The field(s) to mark as modified.\n   * @return {Pulse} - This pulse instance.\n   */ modifies (_) {\n        const hash = this.fields || (this.fields = {});\n        if ((0, _vegaUtil.isArray)(_)) _.forEach((f)=>hash[f] = true);\n        else hash[_] = true;\n        return this;\n    },\n    /**\n   * Checks if one or more data fields have been modified during this pulse\n   * propagation timestamp.\n   * @param {string|Array<string>} _ - The field(s) to check for modified.\n   * @param {boolean} nomod - If true, will check the modified flag even if\n   *   no mod tuples exist. If false (default), mod tuples must be present.\n   * @return {boolean} - Returns true if any of the provided fields has been\n   *   marked as modified, false otherwise.\n   */ modified (_, nomod) {\n        const fields = this.fields;\n        return !((nomod || this.mod.length) && fields) ? false : !arguments.length ? !!fields : (0, _vegaUtil.isArray)(_) ? _.some((f)=>fields[f]) : fields[_];\n    },\n    /**\n   * Adds a filter function to one more tuple sets. Filters are applied to\n   * backing tuple arrays, to determine the actual set of tuples considered\n   * added, removed or modified. They can be used to delay materialization of\n   * a tuple set in order to avoid expensive array copies. In addition, the\n   * filter functions can serve as value transformers: unlike standard predicate\n   * function (which return boolean values), Pulse filters should return the\n   * actual tuple value to process. If a tuple set is already filtered, the\n   * new filter function will be appended into a conjuntive ('and') query.\n   * @param {number} flags - Flags indicating the tuple set(s) to filter.\n   * @param {function(*):object} filter - Filter function that will be applied\n   *   to the tuple set array, and should return a data tuple if the value\n   *   should be included in the tuple set, and falsy (or null) otherwise.\n   * @return {Pulse} - Returns this pulse instance.\n   */ filter (flags, filter6) {\n        const p = this;\n        if (flags & ADD) p.addF = addFilter(p.addF, filter6);\n        if (flags & REM) p.remF = addFilter(p.remF, filter6);\n        if (flags & MOD) p.modF = addFilter(p.modF, filter6);\n        if (flags & SOURCE) p.srcF = addFilter(p.srcF, filter6);\n        return p;\n    },\n    /**\n   * Materialize one or more tuple sets in this pulse. If the tuple set(s) have\n   * a registered filter function, it will be applied and the tuple set(s) will\n   * be replaced with materialized tuple arrays.\n   * @param {number} flags - Flags indicating the tuple set(s) to materialize.\n   * @return {Pulse} - Returns this pulse instance.\n   */ materialize (flags) {\n        flags = flags || ALL;\n        const p = this;\n        if (flags & ADD && p.addF) {\n            p.add = materialize(p.add, p.addF);\n            p.addF = null;\n        }\n        if (flags & REM && p.remF) {\n            p.rem = materialize(p.rem, p.remF);\n            p.remF = null;\n        }\n        if (flags & MOD && p.modF) {\n            p.mod = materialize(p.mod, p.modF);\n            p.modF = null;\n        }\n        if (flags & SOURCE && p.srcF) {\n            p.source = p.source.filter(p.srcF);\n            p.srcF = null;\n        }\n        return p;\n    },\n    /**\n   * Visit one or more tuple sets in this pulse.\n   * @param {number} flags - Flags indicating the tuple set(s) to visit.\n   *   Legal values are ADD, REM, MOD and SOURCE (if a backing data source\n   *   has been set).\n   * @param {function(object):*} - Visitor function invoked per-tuple.\n   * @return {Pulse} - Returns this pulse instance.\n   */ visit (flags, visitor) {\n        const p = this, v = visitor;\n        if (flags & SOURCE) {\n            (0, _vegaUtil.visitArray)(p.source, p.srcF, v);\n            return p;\n        }\n        if (flags & ADD) (0, _vegaUtil.visitArray)(p.add, p.addF, v);\n        if (flags & REM) (0, _vegaUtil.visitArray)(p.rem, p.remF, v);\n        if (flags & MOD) (0, _vegaUtil.visitArray)(p.mod, p.modF, v);\n        const src = p.source;\n        if (flags & REFLOW && src) {\n            const sum = p.add.length + p.mod.length;\n            if (sum === src.length) ;\n            else if (sum) (0, _vegaUtil.visitArray)(src, filter(p, ADD_MOD), v);\n            else // if no add/rem/mod tuples, visit source\n            (0, _vegaUtil.visitArray)(src, p.srcF, v);\n        }\n        return p;\n    }\n};\n/**\n * Represents a set of multiple pulses. Used as input for operators\n * that accept multiple pulses at a time. Contained pulses are\n * accessible via the public \"pulses\" array property. This pulse doe\n * not carry added, removed or modified tuples directly. However,\n * the visit method can be used to traverse all such tuples contained\n * in sub-pulses with a timestamp matching this parent multi-pulse.\n * @constructor\n * @param {Dataflow} dataflow - The backing dataflow instance.\n * @param {number} stamp - The timestamp.\n * @param {Array<Pulse>} pulses - The sub-pulses for this multi-pulse.\n */ function MultiPulse(dataflow, stamp, pulses, encode) {\n    const p = this, n = pulses.length;\n    let c = 0;\n    this.dataflow = dataflow;\n    this.stamp = stamp;\n    this.fields = null;\n    this.encode = encode || null;\n    this.pulses = pulses;\n    for(let i = 0; i < n; ++i){\n        const pulse6 = pulses[i];\n        if (pulse6.stamp !== stamp) continue;\n        if (pulse6.fields) {\n            const hash = p.fields || (p.fields = {});\n            for(const f in pulse6.fields)hash[f] = 1;\n        }\n        if (pulse6.changed(p.ADD)) c |= p.ADD;\n        if (pulse6.changed(p.REM)) c |= p.REM;\n        if (pulse6.changed(p.MOD)) c |= p.MOD;\n    }\n    this.changes = c;\n}\n(0, _vegaUtil.inherits)(MultiPulse, Pulse, {\n    /**\n   * Creates a new pulse based on the values of this pulse.\n   * The dataflow, time stamp and field modification values are copied over.\n   * @return {Pulse}\n   */ fork (flags) {\n        const p = new Pulse(this.dataflow).init(this, flags & this.NO_FIELDS);\n        if (flags !== undefined) {\n            if (flags & p.ADD) this.visit(p.ADD, (t)=>p.add.push(t));\n            if (flags & p.REM) this.visit(p.REM, (t)=>p.rem.push(t));\n            if (flags & p.MOD) this.visit(p.MOD, (t)=>p.mod.push(t));\n        }\n        return p;\n    },\n    changed (flags) {\n        return this.changes & flags;\n    },\n    modified (_) {\n        const p = this, fields = p.fields;\n        return !(fields && p.changes & p.MOD) ? 0 : (0, _vegaUtil.isArray)(_) ? _.some((f)=>fields[f]) : fields[_];\n    },\n    filter () {\n        (0, _vegaUtil.error)(\"MultiPulse does not support filtering.\");\n    },\n    materialize () {\n        (0, _vegaUtil.error)(\"MultiPulse does not support materialization.\");\n    },\n    visit (flags, visitor) {\n        const p = this, pulses = p.pulses, n = pulses.length;\n        let i = 0;\n        if (flags & p.SOURCE) for(; i < n; ++i)pulses[i].visit(flags, visitor);\n        else {\n            for(; i < n; ++i)if (pulses[i].stamp === p.stamp) pulses[i].visit(flags, visitor);\n        }\n        return p;\n    }\n});\n/* eslint-disable require-atomic-updates */ /**\n * Evaluates the dataflow and returns a Promise that resolves when pulse\n * propagation completes. This method will increment the current timestamp\n * and process all updated, pulsed and touched operators. When invoked for\n * the first time, all registered operators will be processed. This method\n * should not be invoked by third-party clients, use {@link runAsync} or\n * {@link run} instead.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode package.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Promise} - A promise that resolves to this dataflow after\n *   evaluation completes.\n */ async function evaluate(encode, prerun, postrun) {\n    const df = this, async = []; // if the pulse value is set, this is a re-entrant call\n    if (df._pulse) return reentrant(df); // wait for pending datasets to load\n    if (df._pending) await df._pending; // invoke prerun function, if provided\n    if (prerun) await asyncCallback(df, prerun); // exit early if there are no updates\n    if (!df._touched.length) {\n        df.debug(\"Dataflow invoked, but nothing to do.\");\n        return df;\n    } // increment timestamp clock\n    const stamp = ++df._clock; // set the current pulse\n    df._pulse = new Pulse(df, stamp, encode); // initialize priority queue, reset touched operators\n    df._touched.forEach((op)=>df._enqueue(op, true));\n    df._touched = UniqueList((0, _vegaUtil.id));\n    let count = 0, op1, next, error;\n    try {\n        while(df._heap.size() > 0){\n            // dequeue operator with highest priority\n            op1 = df._heap.pop(); // re-queue if rank changed\n            if (op1.rank !== op1.qrank) {\n                df._enqueue(op1, true);\n                continue;\n            } // otherwise, evaluate the operator\n            next = op1.run(df._getPulse(op1, encode));\n            if (next.then) // await if operator returns a promise directly\n            next = await next;\n            else if (next.async) {\n                // queue parallel asynchronous execution\n                async.push(next.async);\n                next = StopPropagation;\n            } // propagate evaluation, enqueue dependent operators\n            if (next !== StopPropagation) {\n                if (op1._targets) op1._targets.forEach((op)=>df._enqueue(op));\n            } // increment visit counter\n            ++count;\n        }\n    } catch (err1) {\n        df._heap.clear();\n        error = err1;\n    } // reset pulse map\n    df._input = {};\n    df._pulse = null;\n    df.debug(`Pulse ${stamp}: ${count} operators`);\n    if (error) {\n        df._postrun = [];\n        df.error(error);\n    } // invoke callbacks queued via runAfter\n    if (df._postrun.length) {\n        const pr = df._postrun.sort((a, b)=>b.priority - a.priority);\n        df._postrun = [];\n        for(let i = 0; i < pr.length; ++i)await asyncCallback(df, pr[i].callback);\n    } // invoke postrun function, if provided\n    if (postrun) await asyncCallback(df, postrun); // handle non-blocking asynchronous callbacks\n    if (async.length) Promise.all(async).then((cb)=>df.runAsync(null, ()=>{\n            cb.forEach((f)=>{\n                try {\n                    f(df);\n                } catch (err) {\n                    df.error(err);\n                }\n            });\n        }));\n    return df;\n}\n/**\n * Queues dataflow evaluation to run once any other queued evaluations have\n * completed and returns a Promise that resolves when the queued pulse\n * propagation completes. If provided, a callback function will be invoked\n * immediately before evaluation commences. This method will ensure a\n * separate evaluation is invoked for each time it is called.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode package.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Promise} - A promise that resolves to this dataflow after\n *   evaluation completes.\n */ async function runAsync(encode, prerun, postrun) {\n    // await previously queued functions\n    while(this._running)await this._running; // run dataflow, manage running promise\n    const clear = ()=>this._running = null;\n    (this._running = this.evaluate(encode, prerun, postrun)).then(clear, clear);\n    return this._running;\n}\n/**\n * Requests dataflow evaluation and the immediately returns this dataflow\n * instance. If there are pending data loading or other asynchronous\n * operations, the dataflow will evaluate asynchronously after this method\n * has been invoked. To track when dataflow evaluation completes, use the\n * {@link runAsync} method instead. This method will raise an error if\n * invoked while the dataflow is already in the midst of evaluation.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode module.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Dataflow} - This dataflow instance.\n */ function run(encode, prerun, postrun) {\n    return this._pulse ? reentrant(this) : (this.evaluate(encode, prerun, postrun), this);\n}\n/**\n * Schedules a callback function to be invoked after the current pulse\n * propagation completes. If no propagation is currently occurring,\n * the function is invoked immediately. Callbacks scheduled via runAfter\n * are invoked immediately upon completion of the current cycle, before\n * any request queued via runAsync. This method is primarily intended for\n * internal use. Third-party callers using runAfter to schedule a callback\n * that invokes {@link run} or {@link runAsync} should not use this method,\n * but instead use {@link runAsync} with prerun or postrun arguments.\n * @param {function(Dataflow)} callback - The callback function to run.\n *   The callback will be invoked with this Dataflow instance as its\n *   sole argument.\n * @param {boolean} enqueue - A boolean flag indicating that the\n *   callback should be queued up to run after the next propagation\n *   cycle, suppressing immediate invocation when propagation is not\n *   currently occurring.\n * @param {number} [priority] - A priority value used to sort registered\n *   callbacks to determine execution order. This argument is intended\n *   for internal Vega use only.\n */ function runAfter(callback, enqueue1, priority) {\n    if (this._pulse || enqueue1) // pulse propagation is currently running, queue to run after\n    this._postrun.push({\n        priority: priority || 0,\n        callback: callback\n    });\n    else // pulse propagation already complete, invoke immediately\n    try {\n        callback(this);\n    } catch (err) {\n        this.error(err);\n    }\n}\n/**\n * Raise an error for re-entrant dataflow evaluation.\n */ function reentrant(df) {\n    df.error(\"Dataflow already running. Use runAsync() to chain invocations.\");\n    return df;\n}\n/**\n * Enqueue an operator into the priority queue for evaluation. The operator\n * will be enqueued if it has no registered pulse for the current cycle, or if\n * the force argument is true. Upon enqueue, this method also sets the\n * operator's qrank to the current rank value.\n * @param {Operator} op - The operator to enqueue.\n * @param {boolean} [force] - A flag indicating if the operator should be\n *   forceably added to the queue, even if it has already been previously\n *   enqueued during the current pulse propagation. This is useful when the\n *   dataflow graph is dynamically modified and the operator rank changes.\n */ function enqueue(op, force) {\n    const q = op.stamp < this._clock;\n    if (q) op.stamp = this._clock;\n    if (q || force) {\n        op.qrank = op.rank;\n        this._heap.push(op);\n    }\n}\n/**\n * Provide a correct pulse for evaluating an operator. If the operator has an\n * explicit source operator, we will try to pull the pulse(s) from it.\n * If there is an array of source operators, we build a multi-pulse.\n * Otherwise, we return a current pulse with correct source data.\n * If the pulse is the pulse map has an explicit target set, we use that.\n * Else if the pulse on the upstream source operator is current, we use that.\n * Else we use the pulse from the pulse map, but copy the source tuple array.\n * @param {Operator} op - The operator for which to get an input pulse.\n * @param {string} [encode] - An (optional) encoding set name with which to\n *   annotate the returned pulse. See {@link run} for more information.\n */ function getPulse(op, encode) {\n    const s = op.source, stamp = this._clock;\n    return s && (0, _vegaUtil.isArray)(s) ? new MultiPulse(this, stamp, s.map((_)=>_.pulse), encode) : this._input[op.id] || singlePulse(this._pulse, s && s.pulse);\n}\nfunction singlePulse(p, s) {\n    if (s && s.stamp === p.stamp) return s;\n    p = p.fork();\n    if (s && s !== StopPropagation) p.source = s.source;\n    return p;\n}\nconst NO_OPT = {\n    skip: false,\n    force: false\n};\n/**\n * Touches an operator, scheduling it to be evaluated. If invoked outside of\n * a pulse propagation, the operator will be evaluated the next time this\n * dataflow is run. If invoked in the midst of pulse propagation, the operator\n * will be queued for evaluation if and only if the operator has not yet been\n * evaluated on the current propagation timestamp.\n * @param {Operator} op - The operator to touch.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */ function touch(op, options) {\n    const opt = options || NO_OPT;\n    if (this._pulse) // if in midst of propagation, add to priority queue\n    this._enqueue(op);\n    else // otherwise, queue for next propagation\n    this._touched.add(op);\n    if (opt.skip) op.skip(true);\n    return this;\n}\n/**\n * Updates the value of the given operator.\n * @param {Operator} op - The operator to update.\n * @param {*} value - The value to set.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.force] - If true, the operator will\n *   be re-evaluated even if its value has not changed.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */ function update(op, value, options) {\n    const opt = options || NO_OPT;\n    if (op.set(value) || opt.force) this.touch(op, opt);\n    return this;\n}\n/**\n * Pulses an operator with a changeset of tuples. If invoked outside of\n * a pulse propagation, the pulse will be applied the next time this\n * dataflow is run. If invoked in the midst of pulse propagation, the pulse\n * will be added to the set of active pulses and will be applied if and\n * only if the target operator has not yet been evaluated on the current\n * propagation timestamp.\n * @param {Operator} op - The operator to pulse.\n * @param {ChangeSet} value - The tuple changeset to apply.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */ function pulse(op, changeset1, options) {\n    this.touch(op, options || NO_OPT);\n    const p = new Pulse(this, this._clock + (this._pulse ? 0 : 1)), t = op.pulse && op.pulse.source || [];\n    p.target = op;\n    this._input[op.id] = changeset1.pulse(p, t);\n    return this;\n}\nfunction Heap(cmp) {\n    let nodes = [];\n    return {\n        clear: ()=>nodes = [],\n        size: ()=>nodes.length,\n        peek: ()=>nodes[0],\n        push: (x)=>{\n            nodes.push(x);\n            return siftdown(nodes, 0, nodes.length - 1, cmp);\n        },\n        pop: ()=>{\n            const last = nodes.pop();\n            let item;\n            if (nodes.length) {\n                item = nodes[0];\n                nodes[0] = last;\n                siftup(nodes, 0, cmp);\n            } else item = last;\n            return item;\n        }\n    };\n}\nfunction siftdown(array, start, idx, cmp) {\n    let parent, pidx;\n    const item = array[idx];\n    while(idx > start){\n        pidx = idx - 1 >> 1;\n        parent = array[pidx];\n        if (cmp(item, parent) < 0) {\n            array[idx] = parent;\n            idx = pidx;\n            continue;\n        }\n        break;\n    }\n    return array[idx] = item;\n}\nfunction siftup(array, idx, cmp) {\n    const start = idx, end = array.length, item = array[idx];\n    let cidx = (idx << 1) + 1, ridx;\n    while(cidx < end){\n        ridx = cidx + 1;\n        if (ridx < end && cmp(array[cidx], array[ridx]) >= 0) cidx = ridx;\n        array[idx] = array[cidx];\n        idx = cidx;\n        cidx = (idx << 1) + 1;\n    }\n    array[idx] = item;\n    return siftdown(array, start, idx, cmp);\n}\n/**\n * A dataflow graph for reactive processing of data streams.\n * @constructor\n */ function Dataflow() {\n    this.logger((0, _vegaUtil.logger)());\n    this.logLevel((0, _vegaUtil.Error));\n    this._clock = 0;\n    this._rank = 0;\n    this._locale = (0, _vegaFormat.defaultLocale)();\n    try {\n        this._loader = (0, _vegaLoader.loader)();\n    } catch (e) {}\n    this._touched = UniqueList((0, _vegaUtil.id));\n    this._input = {};\n    this._pulse = null;\n    this._heap = Heap((a, b)=>a.qrank - b.qrank);\n    this._postrun = [];\n}\nfunction logMethod(method) {\n    return function() {\n        return this._log[method].apply(this, arguments);\n    };\n}\nDataflow.prototype = {\n    /**\n   * The current timestamp of this dataflow. This value reflects the\n   * timestamp of the previous dataflow run. The dataflow is initialized\n   * with a stamp value of 0. The initial run of the dataflow will have\n   * a timestap of 1, and so on. This value will match the\n   * {@link Pulse.stamp} property.\n   * @return {number} - The current timestamp value.\n   */ stamp () {\n        return this._clock;\n    },\n    /**\n   * Gets or sets the loader instance to use for data file loading. A\n   * loader object must provide a \"load\" method for loading files and a\n   * \"sanitize\" method for checking URL/filename validity. Both methods\n   * should accept a URI and options hash as arguments, and return a Promise\n   * that resolves to the loaded file contents (load) or a hash containing\n   * sanitized URI data with the sanitized url assigned to the \"href\" property\n   * (sanitize).\n   * @param {object} _ - The loader instance to use.\n   * @return {object|Dataflow} - If no arguments are provided, returns\n   *   the current loader instance. Otherwise returns this Dataflow instance.\n   */ loader (_) {\n        if (arguments.length) {\n            this._loader = _;\n            return this;\n        } else return this._loader;\n    },\n    /**\n   * Gets or sets the locale instance to use for formatting and parsing\n   * string values. The locale object should be provided by the\n   * vega-format library, and include methods such as format, timeFormat,\n   * utcFormat, timeParse, and utcParse.\n   * @param {object} _ - The locale instance to use.\n   * @return {object|Dataflow} - If no arguments are provided, returns\n   *   the current locale instance. Otherwise returns this Dataflow instance.\n   */ locale (_) {\n        if (arguments.length) {\n            this._locale = _;\n            return this;\n        } else return this._locale;\n    },\n    /**\n   * Get or set the logger instance used to log messages. If no arguments are\n   * provided, returns the current logger instance. Otherwise, sets the logger\n   * and return this Dataflow instance. Provided loggers must support the full\n   * API of logger objects generated by the vega-util logger method. Note that\n   * by default the log level of the new logger will be used; use the logLevel\n   * method to adjust the log level as needed.\n   */ logger (logger) {\n        if (arguments.length) {\n            this._log = logger;\n            return this;\n        } else return this._log;\n    },\n    /**\n   * Logs an error message. By default, logged messages are written to console\n   * output. The message will only be logged if the current log level is high\n   * enough to permit error messages.\n   */ error: logMethod(\"error\"),\n    /**\n   * Logs a warning message. By default, logged messages are written to console\n   * output. The message will only be logged if the current log level is high\n   * enough to permit warning messages.\n   */ warn: logMethod(\"warn\"),\n    /**\n   * Logs a information message. By default, logged messages are written to\n   * console output. The message will only be logged if the current log level is\n   * high enough to permit information messages.\n   */ info: logMethod(\"info\"),\n    /**\n   * Logs a debug message. By default, logged messages are written to console\n   * output. The message will only be logged if the current log level is high\n   * enough to permit debug messages.\n   */ debug: logMethod(\"debug\"),\n    /**\n   * Get or set the current log level. If an argument is provided, it\n   * will be used as the new log level.\n   * @param {number} [level] - Should be one of None, Warn, Info\n   * @return {number} - The current log level.\n   */ logLevel: logMethod(\"level\"),\n    /**\n   * Empty entry threshold for garbage cleaning. Map data structures will\n   * perform cleaning once the number of empty entries exceeds this value.\n   */ cleanThreshold: 1e4,\n    // OPERATOR REGISTRATION\n    add,\n    connect,\n    rank,\n    rerank,\n    // OPERATOR UPDATES\n    pulse,\n    touch,\n    update,\n    changeset,\n    // DATA LOADING\n    ingest,\n    parse,\n    preload,\n    request,\n    // EVENT HANDLING\n    events,\n    on,\n    // PULSE PROPAGATION\n    evaluate,\n    run,\n    runAsync,\n    runAfter,\n    _enqueue: enqueue,\n    _getPulse: getPulse\n};\n/**\n * Abstract class for operators that process data tuples.\n * Subclasses must provide a {@link transform} method for operator processing.\n * @constructor\n * @param {*} [init] - The initial value for this operator.\n * @param {object} [params] - The parameters for this operator.\n * @param {Operator} [source] - The operator from which to receive pulses.\n */ function Transform(init, params) {\n    Operator.call(this, init, null, params);\n}\n(0, _vegaUtil.inherits)(Transform, Operator, {\n    /**\n   * Overrides {@link Operator.evaluate} for transform operators.\n   * Internally, this method calls {@link evaluate} to perform processing.\n   * If {@link evaluate} returns a falsy value, the input pulse is returned.\n   * This method should NOT be overridden, instead overrride {@link evaluate}.\n   * @param {Pulse} pulse - the current dataflow pulse.\n   * @return the output pulse for this operator (or StopPropagation)\n   */ run (pulse7) {\n        if (pulse7.stamp < this.stamp) return pulse7.StopPropagation;\n        let rv;\n        if (this.skip()) this.skip(false);\n        else rv = this.evaluate(pulse7);\n        rv = rv || pulse7;\n        if (rv.then) rv = rv.then((_)=>this.pulse = _);\n        else if (rv !== pulse7.StopPropagation) this.pulse = rv;\n        return rv;\n    },\n    /**\n   * Overrides {@link Operator.evaluate} for transform operators.\n   * Marshalls parameter values and then invokes {@link transform}.\n   * @param {Pulse} pulse - the current dataflow pulse.\n   * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n       value (including undefined) will let the input pulse pass through.\n  */ evaluate (pulse8) {\n        const params = this.marshall(pulse8.stamp), out = this.transform(params, pulse8);\n        params.clear();\n        return out;\n    },\n    /**\n   * Process incoming pulses.\n   * Subclasses should override this method to implement transforms.\n   * @param {Parameters} _ - The operator parameter values.\n   * @param {Pulse} pulse - The current dataflow pulse.\n   * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n   *   value (including undefined) will let the input pulse pass through.\n   */ transform () {}\n});\nconst transforms = {};\nfunction definition(type) {\n    const t = transform(type);\n    return t && t.Definition || null;\n}\nfunction transform(type) {\n    type = type && type.toLowerCase();\n    return (0, _vegaUtil.hasOwnProperty)(transforms, type) ? transforms[type] : null;\n}\n\n},{\"vega-util\":\"dPFAY\",\"vega-loader\":\"fAGtK\",\"vega-format\":\"bXIHh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fAGtK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"format\", ()=>format);\nparcelHelpers.export(exports, \"formats\", ()=>formats);\nparcelHelpers.export(exports, \"inferType\", ()=>inferType);\nparcelHelpers.export(exports, \"inferTypes\", ()=>inferTypes);\nparcelHelpers.export(exports, \"loader\", ()=>loader);\nparcelHelpers.export(exports, \"read\", ()=>read);\nparcelHelpers.export(exports, \"responseType\", ()=>responseType);\nparcelHelpers.export(exports, \"typeParsers\", ()=>typeParsers);\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Dsv = require(\"d3-dsv\");\nvar _topojsonClient = require(\"topojson-client\");\nvar _vegaFormat = require(\"vega-format\");\nvar Buffer = require(\"buffer\").Buffer;\n//   https://...    file://...    //...\nconst protocol_re = /^(data:|([A-Za-z]+:)?\\/\\/)/; // Matches allowed URIs. From https://github.com/cure53/DOMPurify/blob/master/src/regexp.js with added file://\nconst allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i; // eslint-disable-line no-useless-escape\nconst whitespace_re = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205f\\u3000]/g; // eslint-disable-line no-control-regex\n// Special treatment in node.js for the file: protocol\nconst fileProtocol = \"file://\";\n/**\n * Factory for a loader constructor that provides methods for requesting\n * files from either the network or disk, and for sanitizing request URIs.\n * @param {function} fetch - The Fetch API for HTTP network requests.\n *   If null or undefined, HTTP loading will be disabled.\n * @param {object} fs - The file system interface for file loading.\n *   If null or undefined, local file loading will be disabled.\n * @return {function} A loader constructor with the following signature:\n *   param {object} [options] - Optional default loading options to use.\n *   return {object} - A new loader instance.\n */ function loaderFactory(fetch, fs) {\n    return (options)=>({\n            options: options || {},\n            sanitize: sanitize,\n            load: load,\n            fileAccess: !!fs,\n            file: fileLoader(fs),\n            http: httpLoader(fetch)\n        });\n}\n/**\n * Load an external resource, typically either from the web or from the local\n * filesystem. This function uses {@link sanitize} to first sanitize the uri,\n * then calls either {@link http} (for web requests) or {@link file} (for\n * filesystem loading).\n * @param {string} uri - The resource indicator (e.g., URL or filename).\n * @param {object} [options] - Optional loading options. These options will\n *   override any existing default options.\n * @return {Promise} - A promise that resolves to the loaded content.\n */ async function load(uri, options) {\n    const opt = await this.sanitize(uri, options), url = opt.href;\n    return opt.localFile ? this.file(url) : this.http(url, options);\n}\n/**\n * URI sanitizer function.\n * @param {string} uri - The uri (url or filename) to check.\n * @param {object} options - An options hash.\n * @return {Promise} - A promise that resolves to an object containing\n *  sanitized uri data, or rejects it the input uri is deemed invalid.\n *  The properties of the resolved object are assumed to be\n *  valid attributes for an HTML 'a' tag. The sanitized uri *must* be\n *  provided by the 'href' property of the returned object.\n */ async function sanitize(uri, options) {\n    options = (0, _vegaUtil.extend)({}, this.options, options);\n    const fileAccess = this.fileAccess, result = {\n        href: null\n    };\n    let isFile, loadFile, base;\n    const isAllowed = allowed_re.test(uri.replace(whitespace_re, \"\"));\n    if (uri == null || typeof uri !== \"string\" || !isAllowed) (0, _vegaUtil.error)(\"Sanitize failure, invalid URI: \" + (0, _vegaUtil.stringValue)(uri));\n    const hasProtocol = protocol_re.test(uri); // if relative url (no protocol/host), prepend baseURL\n    if ((base = options.baseURL) && !hasProtocol) {\n        // Ensure that there is a slash between the baseURL (e.g. hostname) and url\n        if (!uri.startsWith(\"/\") && !base.endsWith(\"/\")) uri = \"/\" + uri;\n        uri = base + uri;\n    } // should we load from file system?\n    loadFile = (isFile = uri.startsWith(fileProtocol)) || options.mode === \"file\" || options.mode !== \"http\" && !hasProtocol && fileAccess;\n    if (isFile) // strip file protocol\n    uri = uri.slice(fileProtocol.length);\n    else if (uri.startsWith(\"//\")) {\n        if (options.defaultProtocol === \"file\") {\n            // if is file, strip protocol and set loadFile flag\n            uri = uri.slice(2);\n            loadFile = true;\n        } else // if relative protocol (starts with '//'), prepend default protocol\n        uri = (options.defaultProtocol || \"http\") + \":\" + uri;\n    } // set non-enumerable mode flag to indicate local file load\n    Object.defineProperty(result, \"localFile\", {\n        value: !!loadFile\n    }); // set uri\n    result.href = uri; // set default result target, if specified\n    if (options.target) result.target = options.target + \"\";\n     // set default result rel, if specified (#1542)\n    if (options.rel) result.rel = options.rel + \"\";\n     // provide control over cross-origin image handling (#2238)\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image\n    if (options.context === \"image\" && options.crossOrigin) result.crossOrigin = options.crossOrigin + \"\";\n     // return\n    return result;\n}\n/**\n * File system loader factory.\n * @param {object} fs - The file system interface.\n * @return {function} - A file loader with the following signature:\n *   param {string} filename - The file system path to load.\n *   param {string} filename - The file system path to load.\n *   return {Promise} A promise that resolves to the file contents.\n */ function fileLoader(fs) {\n    return fs ? (filename)=>new Promise((accept, reject)=>{\n            fs.readFile(filename, (error, data)=>{\n                if (error) reject(error);\n                else accept(data);\n            });\n        }) : fileReject;\n}\n/**\n * Default file system loader that simply rejects.\n */ async function fileReject() {\n    (0, _vegaUtil.error)(\"No file system access.\");\n}\n/**\n * HTTP request handler factory.\n * @param {function} fetch - The Fetch API method.\n * @return {function} - An http loader with the following signature:\n *   param {string} url - The url to request.\n *   param {object} options - An options hash.\n *   return {Promise} - A promise that resolves to the file contents.\n */ function httpLoader(fetch) {\n    return fetch ? async function(url, options) {\n        const opt = (0, _vegaUtil.extend)({}, this.options.http, options), type = options && options.response, response = await fetch(url, opt);\n        return !response.ok ? (0, _vegaUtil.error)(response.status + \"\" + response.statusText) : (0, _vegaUtil.isFunction)(response[type]) ? response[type]() : response.text();\n    } : httpReject;\n}\n/**\n * Default http request handler that simply rejects.\n */ async function httpReject() {\n    (0, _vegaUtil.error)(\"No HTTP fetch method available.\");\n}\nconst isValid = (_)=>_ != null && _ === _;\nconst isBoolean = (_)=>_ === \"true\" || _ === \"false\" || _ === true || _ === false;\nconst isDate = (_)=>!Number.isNaN(Date.parse(_));\nconst isNumber = (_)=>!Number.isNaN(+_) && !(_ instanceof Date);\nconst isInteger = (_)=>isNumber(_) && Number.isInteger(+_);\nconst typeParsers = {\n    boolean: (0, _vegaUtil.toBoolean),\n    integer: (0, _vegaUtil.toNumber),\n    number: (0, _vegaUtil.toNumber),\n    date: (0, _vegaUtil.toDate),\n    string: (0, _vegaUtil.toString),\n    unknown: (0, _vegaUtil.identity)\n};\nconst typeTests = [\n    isBoolean,\n    isInteger,\n    isNumber,\n    isDate\n];\nconst typeList = [\n    \"boolean\",\n    \"integer\",\n    \"number\",\n    \"date\"\n];\nfunction inferType(values, field) {\n    if (!values || !values.length) return \"unknown\";\n    const n = values.length, m = typeTests.length, a = typeTests.map((_, i)=>i + 1);\n    for(let i1 = 0, t = 0, j, value; i1 < n; ++i1){\n        value = field ? values[i1][field] : values[i1];\n        for(j = 0; j < m; ++j)if (a[j] && isValid(value) && !typeTests[j](value)) {\n            a[j] = 0;\n            ++t;\n            if (t === typeTests.length) return \"string\";\n        }\n    }\n    return typeList[a.reduce((u, v)=>u === 0 ? v : u, 0) - 1];\n}\nfunction inferTypes(data, fields) {\n    return fields.reduce((types, field)=>{\n        types[field] = inferType(data, field);\n        return types;\n    }, {});\n}\nfunction delimitedFormat(delimiter) {\n    const parse1 = function(data, format1) {\n        const delim = {\n            delimiter: delimiter\n        };\n        return dsv(data, format1 ? (0, _vegaUtil.extend)(format1, delim) : delim);\n    };\n    parse1.responseType = \"text\";\n    return parse1;\n}\nfunction dsv(data, format2) {\n    if (format2.header) data = format2.header.map((0, _vegaUtil.stringValue)).join(format2.delimiter) + \"\\n\" + data;\n    return (0, _d3Dsv.dsvFormat)(format2.delimiter).parse(data + \"\");\n}\ndsv.responseType = \"text\";\nfunction isBuffer(_) {\n    return typeof Buffer === \"function\" && (0, _vegaUtil.isFunction)(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;\n}\nfunction json(data, format3) {\n    const prop = format3 && format3.property ? (0, _vegaUtil.field)(format3.property) : (0, _vegaUtil.identity);\n    return (0, _vegaUtil.isObject)(data) && !isBuffer(data) ? parseJSON(prop(data), format3) : prop(JSON.parse(data));\n}\njson.responseType = \"json\";\nfunction parseJSON(data, format4) {\n    if (!(0, _vegaUtil.isArray)(data) && (0, _vegaUtil.isIterable)(data)) data = [\n        ...data\n    ];\n    return format4 && format4.copy ? JSON.parse(JSON.stringify(data)) : data;\n}\nconst filters = {\n    interior: (a, b)=>a !== b,\n    exterior: (a, b)=>a === b\n};\nfunction topojson(data, format5) {\n    let method, object, property, filter;\n    data = json(data, format5);\n    if (format5 && format5.feature) {\n        method = (0, _topojsonClient.feature);\n        property = format5.feature;\n    } else if (format5 && format5.mesh) {\n        method = (0, _topojsonClient.mesh);\n        property = format5.mesh;\n        filter = filters[format5.filter];\n    } else (0, _vegaUtil.error)(\"Missing TopoJSON feature or mesh parameter.\");\n    object = (object = data.objects[property]) ? method(data, object, filter) : (0, _vegaUtil.error)(\"Invalid TopoJSON object: \" + property);\n    return object && object.features || [\n        object\n    ];\n}\ntopojson.responseType = \"json\";\nconst format = {\n    dsv: dsv,\n    csv: delimitedFormat(\",\"),\n    tsv: delimitedFormat(\"\t\"),\n    json: json,\n    topojson: topojson\n};\nfunction formats(name, reader) {\n    if (arguments.length > 1) {\n        format[name] = reader;\n        return this;\n    } else return (0, _vegaUtil.hasOwnProperty)(format, name) ? format[name] : null;\n}\nfunction responseType(type) {\n    const f = formats(type);\n    return f && f.responseType || \"text\";\n}\nfunction read(data, schema, timeParser, utcParser) {\n    schema = schema || {};\n    const reader = formats(schema.type || \"json\");\n    if (!reader) (0, _vegaUtil.error)(\"Unknown data format type: \" + schema.type);\n    data = reader(data, schema);\n    if (schema.parse) parse(data, schema.parse, timeParser, utcParser);\n    if ((0, _vegaUtil.hasOwnProperty)(data, \"columns\")) delete data.columns;\n    return data;\n}\nfunction parse(data, types, timeParser, utcParser) {\n    if (!data.length) return; // early exit for empty data\n    const locale = (0, _vegaFormat.timeFormatDefaultLocale)();\n    timeParser = timeParser || locale.timeParse;\n    utcParser = utcParser || locale.utcParse;\n    let fields = data.columns || Object.keys(data[0]), datum, field1, i, j, n, m;\n    if (types === \"auto\") types = inferTypes(data, fields);\n    fields = Object.keys(types);\n    const parsers = fields.map((field)=>{\n        const type = types[field];\n        let parts, pattern;\n        if (type && (type.startsWith(\"date:\") || type.startsWith(\"utc:\"))) {\n            parts = type.split(/:(.+)?/, 2); // split on first :\n            pattern = parts[1];\n            if (pattern[0] === \"'\" && pattern[pattern.length - 1] === \"'\" || pattern[0] === '\"' && pattern[pattern.length - 1] === '\"') pattern = pattern.slice(1, -1);\n            const parse2 = parts[0] === \"utc\" ? utcParser : timeParser;\n            return parse2(pattern);\n        }\n        if (!typeParsers[type]) throw Error(\"Illegal format pattern: \" + field + \":\" + type);\n        return typeParsers[type];\n    });\n    for(i = 0, n = data.length, m = fields.length; i < n; ++i){\n        datum = data[i];\n        for(j = 0; j < m; ++j){\n            field1 = fields[j];\n            datum[field1] = parsers[j](datum[field1]);\n        }\n    }\n}\nconst loader = loaderFactory(typeof fetch !== \"undefined\" && fetch, null // no file system access\n);\n\n},{\"vega-util\":\"dPFAY\",\"d3-dsv\":\"8kopW\",\"topojson-client\":\"uktLT\",\"vega-format\":\"bXIHh\",\"buffer\":\"992De\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8kopW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dsvFormat\", ()=>(0, _dsvJsDefault.default));\nparcelHelpers.export(exports, \"csvParse\", ()=>(0, _csvJs.csvParse));\nparcelHelpers.export(exports, \"csvParseRows\", ()=>(0, _csvJs.csvParseRows));\nparcelHelpers.export(exports, \"csvFormat\", ()=>(0, _csvJs.csvFormat));\nparcelHelpers.export(exports, \"csvFormatBody\", ()=>(0, _csvJs.csvFormatBody));\nparcelHelpers.export(exports, \"csvFormatRows\", ()=>(0, _csvJs.csvFormatRows));\nparcelHelpers.export(exports, \"csvFormatRow\", ()=>(0, _csvJs.csvFormatRow));\nparcelHelpers.export(exports, \"csvFormatValue\", ()=>(0, _csvJs.csvFormatValue));\nparcelHelpers.export(exports, \"tsvParse\", ()=>(0, _tsvJs.tsvParse));\nparcelHelpers.export(exports, \"tsvParseRows\", ()=>(0, _tsvJs.tsvParseRows));\nparcelHelpers.export(exports, \"tsvFormat\", ()=>(0, _tsvJs.tsvFormat));\nparcelHelpers.export(exports, \"tsvFormatBody\", ()=>(0, _tsvJs.tsvFormatBody));\nparcelHelpers.export(exports, \"tsvFormatRows\", ()=>(0, _tsvJs.tsvFormatRows));\nparcelHelpers.export(exports, \"tsvFormatRow\", ()=>(0, _tsvJs.tsvFormatRow));\nparcelHelpers.export(exports, \"tsvFormatValue\", ()=>(0, _tsvJs.tsvFormatValue));\nparcelHelpers.export(exports, \"autoType\", ()=>(0, _autoTypeJsDefault.default));\nvar _dsvJs = require(\"./dsv.js\");\nvar _dsvJsDefault = parcelHelpers.interopDefault(_dsvJs);\nvar _csvJs = require(\"./csv.js\");\nvar _tsvJs = require(\"./tsv.js\");\nvar _autoTypeJs = require(\"./autoType.js\");\nvar _autoTypeJsDefault = parcelHelpers.interopDefault(_autoTypeJs);\n\n},{\"./dsv.js\":\"6K8ww\",\"./csv.js\":false,\"./tsv.js\":false,\"./autoType.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6K8ww\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar EOL = {}, EOF = {}, QUOTE = 34, NEWLINE = 10, RETURN = 13;\nfunction objectConverter(columns) {\n    return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n        return JSON.stringify(name) + \": d[\" + i + '] || \"\"';\n    }).join(\",\") + \"}\");\n}\nfunction customConverter(columns, f) {\n    var object = objectConverter(columns);\n    return function(row, i) {\n        return f(object(row), i, columns);\n    };\n}\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n    var columnSet = Object.create(null), columns = [];\n    rows.forEach(function(row) {\n        for(var column in row)if (!(column in columnSet)) columns.push(columnSet[column] = column);\n    });\n    return columns;\n}\nfunction pad(value, width) {\n    var s = value + \"\", length = s.length;\n    return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\nfunction formatYear(year) {\n    return year < 0 ? \"-\" + pad(-year, 6) : year > 9999 ? \"+\" + pad(year, 6) : pad(year, 4);\n}\nfunction formatDate(date) {\n    var hours = date.getUTCHours(), minutes = date.getUTCMinutes(), seconds = date.getUTCSeconds(), milliseconds = date.getUTCMilliseconds();\n    return isNaN(date) ? \"Invalid Date\" : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2) + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\" : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\" : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\" : \"\");\n}\nexports.default = function(delimiter) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n\\r]\"), DELIMITER = delimiter.charCodeAt(0);\n    function parse(text, f) {\n        var convert, columns, rows = parseRows(text, function(row, i) {\n            if (convert) return convert(row, i - 1);\n            columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n        });\n        rows.columns = columns || [];\n        return rows;\n    }\n    function parseRows(text, f) {\n        var rows = [], N = text.length, I = 0, n = 0, t, eof = N <= 0, eol = false; // current token followed by EOL?\n        // Strip the trailing newline.\n        if (text.charCodeAt(N - 1) === NEWLINE) --N;\n        if (text.charCodeAt(N - 1) === RETURN) --N;\n        function token() {\n            if (eof) return EOF;\n            if (eol) return eol = false, EOL;\n            // Unescape quotes.\n            var i, j = I, c;\n            if (text.charCodeAt(j) === QUOTE) {\n                while((I++) < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n                if ((i = I) >= N) eof = true;\n                else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n                else if (c === RETURN) {\n                    eol = true;\n                    if (text.charCodeAt(I) === NEWLINE) ++I;\n                }\n                return text.slice(j + 1, i - 1).replace(/\"\"/g, '\"');\n            }\n            // Find next delimiter or newline.\n            while(I < N){\n                if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n                else if (c === RETURN) {\n                    eol = true;\n                    if (text.charCodeAt(I) === NEWLINE) ++I;\n                } else if (c !== DELIMITER) continue;\n                return text.slice(j, i);\n            }\n            // Return last token before EOF.\n            return eof = true, text.slice(j, N);\n        }\n        while((t = token()) !== EOF){\n            var row = [];\n            while(t !== EOL && t !== EOF)row.push(t), t = token();\n            if (f && (row = f(row, n++)) == null) continue;\n            rows.push(row);\n        }\n        return rows;\n    }\n    function preformatBody(rows, columns) {\n        return rows.map(function(row) {\n            return columns.map(function(column) {\n                return formatValue(row[column]);\n            }).join(delimiter);\n        });\n    }\n    function format(rows, columns) {\n        if (columns == null) columns = inferColumns(rows);\n        return [\n            columns.map(formatValue).join(delimiter)\n        ].concat(preformatBody(rows, columns)).join(\"\\n\");\n    }\n    function formatBody(rows, columns) {\n        if (columns == null) columns = inferColumns(rows);\n        return preformatBody(rows, columns).join(\"\\n\");\n    }\n    function formatRows(rows) {\n        return rows.map(formatRow).join(\"\\n\");\n    }\n    function formatRow(row) {\n        return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(value) {\n        return value == null ? \"\" : value instanceof Date ? formatDate(value) : reFormat.test(value += \"\") ? '\"' + value.replace(/\"/g, '\"\"') + '\"' : value;\n    }\n    return {\n        parse: parse,\n        parseRows: parseRows,\n        format: format,\n        formatBody: formatBody,\n        formatRows: formatRows,\n        formatRow: formatRow,\n        formatValue: formatValue\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"uktLT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bbox\", ()=>(0, _bboxJsDefault.default));\nparcelHelpers.export(exports, \"feature\", ()=>(0, _featureJsDefault.default));\nparcelHelpers.export(exports, \"mesh\", ()=>(0, _meshJsDefault.default));\nparcelHelpers.export(exports, \"meshArcs\", ()=>(0, _meshJs.meshArcs));\nparcelHelpers.export(exports, \"merge\", ()=>(0, _mergeJsDefault.default));\nparcelHelpers.export(exports, \"mergeArcs\", ()=>(0, _mergeJs.mergeArcs));\nparcelHelpers.export(exports, \"neighbors\", ()=>(0, _neighborsJsDefault.default));\nparcelHelpers.export(exports, \"quantize\", ()=>(0, _quantizeJsDefault.default));\nparcelHelpers.export(exports, \"transform\", ()=>(0, _transformJsDefault.default));\nparcelHelpers.export(exports, \"untransform\", ()=>(0, _untransformJsDefault.default));\nvar _bboxJs = require(\"./bbox.js\");\nvar _bboxJsDefault = parcelHelpers.interopDefault(_bboxJs);\nvar _featureJs = require(\"./feature.js\");\nvar _featureJsDefault = parcelHelpers.interopDefault(_featureJs);\nvar _meshJs = require(\"./mesh.js\");\nvar _meshJsDefault = parcelHelpers.interopDefault(_meshJs);\nvar _mergeJs = require(\"./merge.js\");\nvar _mergeJsDefault = parcelHelpers.interopDefault(_mergeJs);\nvar _neighborsJs = require(\"./neighbors.js\");\nvar _neighborsJsDefault = parcelHelpers.interopDefault(_neighborsJs);\nvar _quantizeJs = require(\"./quantize.js\");\nvar _quantizeJsDefault = parcelHelpers.interopDefault(_quantizeJs);\nvar _transformJs = require(\"./transform.js\");\nvar _transformJsDefault = parcelHelpers.interopDefault(_transformJs);\nvar _untransformJs = require(\"./untransform.js\");\nvar _untransformJsDefault = parcelHelpers.interopDefault(_untransformJs);\n\n},{\"./bbox.js\":\"4xKr2\",\"./feature.js\":\"92SRL\",\"./mesh.js\":\"4byrD\",\"./merge.js\":\"kd2Sj\",\"./neighbors.js\":\"eE8SV\",\"./quantize.js\":\"lJcUp\",\"./transform.js\":\"lj8l3\",\"./untransform.js\":\"W0snH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4xKr2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _transformJs = require(\"./transform.js\");\nvar _transformJsDefault = parcelHelpers.interopDefault(_transformJs);\nexports.default = function(topology) {\n    var t = (0, _transformJsDefault.default)(topology.transform), key, x0 = Infinity, y0 = x0, x1 = -x0, y1 = -x0;\n    function bboxPoint(p) {\n        p = t(p);\n        if (p[0] < x0) x0 = p[0];\n        if (p[0] > x1) x1 = p[0];\n        if (p[1] < y0) y0 = p[1];\n        if (p[1] > y1) y1 = p[1];\n    }\n    function bboxGeometry(o) {\n        switch(o.type){\n            case \"GeometryCollection\":\n                o.geometries.forEach(bboxGeometry);\n                break;\n            case \"Point\":\n                bboxPoint(o.coordinates);\n                break;\n            case \"MultiPoint\":\n                o.coordinates.forEach(bboxPoint);\n                break;\n        }\n    }\n    topology.arcs.forEach(function(arc) {\n        var i = -1, n = arc.length, p;\n        while(++i < n){\n            p = t(arc[i], i);\n            if (p[0] < x0) x0 = p[0];\n            if (p[0] > x1) x1 = p[0];\n            if (p[1] < y0) y0 = p[1];\n            if (p[1] > y1) y1 = p[1];\n        }\n    });\n    for(key in topology.objects)bboxGeometry(topology.objects[key]);\n    return [\n        x0,\n        y0,\n        x1,\n        y1\n    ];\n};\n\n},{\"./transform.js\":\"lj8l3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lj8l3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nexports.default = function(transform) {\n    if (transform == null) return 0, _identityJsDefault.default;\n    var x0, y0, kx = transform.scale[0], ky = transform.scale[1], dx = transform.translate[0], dy = transform.translate[1];\n    return function(input, i) {\n        if (!i) x0 = y0 = 0;\n        var j = 2, n = input.length, output = new Array(n);\n        output[0] = (x0 += input[0]) * kx + dx;\n        output[1] = (y0 += input[1]) * ky + dy;\n        while(j < n)output[j] = input[j], ++j;\n        return output;\n    };\n};\n\n},{\"./identity.js\":\"3vQTx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3vQTx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return x;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"92SRL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"object\", ()=>object);\nvar _reverseJs = require(\"./reverse.js\");\nvar _reverseJsDefault = parcelHelpers.interopDefault(_reverseJs);\nvar _transformJs = require(\"./transform.js\");\nvar _transformJsDefault = parcelHelpers.interopDefault(_transformJs);\nexports.default = function(topology, o1) {\n    if (typeof o1 === \"string\") o1 = topology.objects[o1];\n    return o1.type === \"GeometryCollection\" ? {\n        type: \"FeatureCollection\",\n        features: o1.geometries.map(function(o) {\n            return feature(topology, o);\n        })\n    } : feature(topology, o1);\n};\nfunction feature(topology, o) {\n    var id = o.id, bbox = o.bbox, properties = o.properties == null ? {} : o.properties, geometry = object(topology, o);\n    return id == null && bbox == null ? {\n        type: \"Feature\",\n        properties: properties,\n        geometry: geometry\n    } : bbox == null ? {\n        type: \"Feature\",\n        id: id,\n        properties: properties,\n        geometry: geometry\n    } : {\n        type: \"Feature\",\n        id: id,\n        bbox: bbox,\n        properties: properties,\n        geometry: geometry\n    };\n}\nfunction object(topology, o2) {\n    var transformPoint = (0, _transformJsDefault.default)(topology.transform), arcs1 = topology.arcs;\n    function arc(i, points) {\n        if (points.length) points.pop();\n        for(var a = arcs1[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k)points.push(transformPoint(a[k], k));\n        if (i < 0) (0, _reverseJsDefault.default)(points, n);\n    }\n    function point(p) {\n        return transformPoint(p);\n    }\n    function line(arcs) {\n        var points = [];\n        for(var i = 0, n = arcs.length; i < n; ++i)arc(arcs[i], points);\n        if (points.length < 2) points.push(points[0]); // This should never happen per the specification.\n        return points;\n    }\n    function ring(arcs) {\n        var points = line(arcs);\n        while(points.length < 4)points.push(points[0]); // This may happen if an arc has only two points.\n        return points;\n    }\n    function polygon(arcs) {\n        return arcs.map(ring);\n    }\n    function geometry(o) {\n        var type = o.type, coordinates;\n        switch(type){\n            case \"GeometryCollection\":\n                return {\n                    type: type,\n                    geometries: o.geometries.map(geometry)\n                };\n            case \"Point\":\n                coordinates = point(o.coordinates);\n                break;\n            case \"MultiPoint\":\n                coordinates = o.coordinates.map(point);\n                break;\n            case \"LineString\":\n                coordinates = line(o.arcs);\n                break;\n            case \"MultiLineString\":\n                coordinates = o.arcs.map(line);\n                break;\n            case \"Polygon\":\n                coordinates = polygon(o.arcs);\n                break;\n            case \"MultiPolygon\":\n                coordinates = o.arcs.map(polygon);\n                break;\n            default:\n                return null;\n        }\n        return {\n            type: type,\n            coordinates: coordinates\n        };\n    }\n    return geometry(o2);\n}\n\n},{\"./reverse.js\":\"8qp1Y\",\"./transform.js\":\"lj8l3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8qp1Y\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(array, n) {\n    var t, j = array.length, i = j - n;\n    while(i < --j)t = array[i], array[i++] = array[j], array[j] = t;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4byrD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"meshArcs\", ()=>meshArcs);\nvar _featureJs = require(\"./feature.js\");\nvar _stitchJs = require(\"./stitch.js\");\nvar _stitchJsDefault = parcelHelpers.interopDefault(_stitchJs);\nexports.default = function(topology) {\n    return (0, _featureJs.object)(topology, meshArcs.apply(this, arguments));\n};\nfunction meshArcs(topology, object, filter) {\n    var arcs, i, n;\n    if (arguments.length > 1) arcs = extractArcs(topology, object, filter);\n    else for(i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i)arcs[i] = i;\n    return {\n        type: \"MultiLineString\",\n        arcs: (0, _stitchJsDefault.default)(topology, arcs)\n    };\n}\nfunction extractArcs(topology, object, filter) {\n    var arcs1 = [], geomsByArc = [], geom;\n    function extract0(i) {\n        var j = i < 0 ? ~i : i;\n        (geomsByArc[j] || (geomsByArc[j] = [])).push({\n            i: i,\n            g: geom\n        });\n    }\n    function extract1(arcs) {\n        arcs.forEach(extract0);\n    }\n    function extract2(arcs) {\n        arcs.forEach(extract1);\n    }\n    function extract3(arcs) {\n        arcs.forEach(extract2);\n    }\n    function geometry(o) {\n        switch(geom = o, o.type){\n            case \"GeometryCollection\":\n                o.geometries.forEach(geometry);\n                break;\n            case \"LineString\":\n                extract1(o.arcs);\n                break;\n            case \"MultiLineString\":\n            case \"Polygon\":\n                extract2(o.arcs);\n                break;\n            case \"MultiPolygon\":\n                extract3(o.arcs);\n                break;\n        }\n    }\n    geometry(object);\n    geomsByArc.forEach(filter == null ? function(geoms) {\n        arcs1.push(geoms[0].i);\n    } : function(geoms) {\n        if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs1.push(geoms[0].i);\n    });\n    return arcs1;\n}\n\n},{\"./feature.js\":\"92SRL\",\"./stitch.js\":\"kAWIL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kAWIL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(topology, arcs) {\n    var stitchedArcs = {}, fragmentByStart1 = {}, fragmentByEnd1 = {}, fragments = [], emptyIndex = -1;\n    // Stitch empty arcs first, since they may be subsumed by other arcs.\n    arcs.forEach(function(i, j) {\n        var arc = topology.arcs[i < 0 ? ~i : i], t;\n        if (arc.length < 3 && !arc[1][0] && !arc[1][1]) t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n    });\n    arcs.forEach(function(i) {\n        var e = ends(i), start = e[0], end = e[1], f, g;\n        if (f = fragmentByEnd1[start]) {\n            delete fragmentByEnd1[f.end];\n            f.push(i);\n            f.end = end;\n            if (g = fragmentByStart1[end]) {\n                delete fragmentByStart1[g.start];\n                var fg = g === f ? f : f.concat(g);\n                fragmentByStart1[fg.start = f.start] = fragmentByEnd1[fg.end = g.end] = fg;\n            } else fragmentByStart1[f.start] = fragmentByEnd1[f.end] = f;\n        } else if (f = fragmentByStart1[end]) {\n            delete fragmentByStart1[f.start];\n            f.unshift(i);\n            f.start = start;\n            if (g = fragmentByEnd1[start]) {\n                delete fragmentByEnd1[g.end];\n                var gf = g === f ? f : g.concat(f);\n                fragmentByStart1[gf.start = g.start] = fragmentByEnd1[gf.end = f.end] = gf;\n            } else fragmentByStart1[f.start] = fragmentByEnd1[f.end] = f;\n        } else {\n            f = [\n                i\n            ];\n            fragmentByStart1[f.start = start] = fragmentByEnd1[f.end = end] = f;\n        }\n    });\n    function ends(i) {\n        var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n        if (topology.transform) p1 = [\n            0,\n            0\n        ], arc.forEach(function(dp) {\n            p1[0] += dp[0], p1[1] += dp[1];\n        });\n        else p1 = arc[arc.length - 1];\n        return i < 0 ? [\n            p1,\n            p0\n        ] : [\n            p0,\n            p1\n        ];\n    }\n    function flush(fragmentByEnd, fragmentByStart) {\n        for(var k in fragmentByEnd){\n            var f = fragmentByEnd[k];\n            delete fragmentByStart[f.start];\n            delete f.start;\n            delete f.end;\n            f.forEach(function(i) {\n                stitchedArcs[i < 0 ? ~i : i] = 1;\n            });\n            fragments.push(f);\n        }\n    }\n    flush(fragmentByEnd1, fragmentByStart1);\n    flush(fragmentByStart1, fragmentByEnd1);\n    arcs.forEach(function(i) {\n        if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([\n            i\n        ]);\n    });\n    return fragments;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kd2Sj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mergeArcs\", ()=>mergeArcs);\nvar _featureJs = require(\"./feature.js\");\nvar _stitchJs = require(\"./stitch.js\");\nvar _stitchJsDefault = parcelHelpers.interopDefault(_stitchJs);\nfunction planarRingArea(ring) {\n    var i = -1, n = ring.length, a, b = ring[n - 1], area = 0;\n    while(++i < n)a = b, b = ring[i], area += a[0] * b[1] - a[1] * b[0];\n    return Math.abs(area); // Note: doubled area!\n}\nexports.default = function(topology) {\n    return (0, _featureJs.object)(topology, mergeArcs.apply(this, arguments));\n};\nfunction mergeArcs(topology, objects) {\n    var polygonsByArc = {}, polygons1 = [], groups = [];\n    objects.forEach(geometry);\n    function geometry(o) {\n        switch(o.type){\n            case \"GeometryCollection\":\n                o.geometries.forEach(geometry);\n                break;\n            case \"Polygon\":\n                extract(o.arcs);\n                break;\n            case \"MultiPolygon\":\n                o.arcs.forEach(extract);\n                break;\n        }\n    }\n    function extract(polygon) {\n        polygon.forEach(function(ring) {\n            ring.forEach(function(arc) {\n                (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n            });\n        });\n        polygons1.push(polygon);\n    }\n    function area(ring) {\n        return planarRingArea((0, _featureJs.object)(topology, {\n            type: \"Polygon\",\n            arcs: [\n                ring\n            ]\n        }).coordinates[0]);\n    }\n    polygons1.forEach(function(polygon1) {\n        if (!polygon1._) {\n            var group = [], neighbors = [\n                polygon1\n            ];\n            polygon1._ = 1;\n            groups.push(group);\n            while(polygon1 = neighbors.pop()){\n                group.push(polygon1);\n                polygon1.forEach(function(ring) {\n                    ring.forEach(function(arc) {\n                        polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n                            if (!polygon._) {\n                                polygon._ = 1;\n                                neighbors.push(polygon);\n                            }\n                        });\n                    });\n                });\n            }\n        }\n    });\n    polygons1.forEach(function(polygon) {\n        delete polygon._;\n    });\n    return {\n        type: \"MultiPolygon\",\n        arcs: groups.map(function(polygons) {\n            var arcs = [], n;\n            // Extract the exterior (unique) arcs.\n            polygons.forEach(function(polygon) {\n                polygon.forEach(function(ring) {\n                    ring.forEach(function(arc) {\n                        if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) arcs.push(arc);\n                    });\n                });\n            });\n            // Stitch the arcs into one or more rings.\n            arcs = (0, _stitchJsDefault.default)(topology, arcs);\n            // If more than one ring is returned,\n            // at most one of these rings can be the exterior;\n            // choose the one with the greatest absolute area.\n            if ((n = arcs.length) > 1) {\n                for(var i = 1, k = area(arcs[0]), ki, t; i < n; ++i)if ((ki = area(arcs[i])) > k) t = arcs[0], arcs[0] = arcs[i], arcs[i] = t, k = ki;\n            }\n            return arcs;\n        }).filter(function(arcs) {\n            return arcs.length > 0;\n        })\n    };\n}\n\n},{\"./feature.js\":\"92SRL\",\"./stitch.js\":\"kAWIL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eE8SV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _bisectJs = require(\"./bisect.js\");\nvar _bisectJsDefault = parcelHelpers.interopDefault(_bisectJs);\nexports.default = function(objects) {\n    var indexesByArc = {}, neighbors = objects.map(function() {\n        return [];\n    });\n    function line(arcs, i) {\n        arcs.forEach(function(a) {\n            if (a < 0) a = ~a;\n            var o = indexesByArc[a];\n            if (o) o.push(i);\n            else indexesByArc[a] = [\n                i\n            ];\n        });\n    }\n    function polygon(arcs, i) {\n        arcs.forEach(function(arc) {\n            line(arc, i);\n        });\n    }\n    function geometry(o1, i) {\n        if (o1.type === \"GeometryCollection\") o1.geometries.forEach(function(o) {\n            geometry(o, i);\n        });\n        else if (o1.type in geometryType) geometryType[o1.type](o1.arcs, i);\n    }\n    var geometryType = {\n        LineString: line,\n        MultiLineString: polygon,\n        Polygon: polygon,\n        MultiPolygon: function(arcs, i) {\n            arcs.forEach(function(arc) {\n                polygon(arc, i);\n            });\n        }\n    };\n    objects.forEach(geometry);\n    for(var i1 in indexesByArc){\n        for(var indexes = indexesByArc[i1], m = indexes.length, j = 0; j < m; ++j)for(var k = j + 1; k < m; ++k){\n            var ij = indexes[j], ik = indexes[k], n;\n            if ((n = neighbors[ij])[i1 = (0, _bisectJsDefault.default)(n, ik)] !== ik) n.splice(i1, 0, ik);\n            if ((n = neighbors[ik])[i1 = (0, _bisectJsDefault.default)(n, ij)] !== ij) n.splice(i1, 0, ij);\n        }\n    }\n    return neighbors;\n};\n\n},{\"./bisect.js\":\"7Xldg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Xldg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, x) {\n    var lo = 0, hi = a.length;\n    while(lo < hi){\n        var mid = lo + hi >>> 1;\n        if (a[mid] < x) lo = mid + 1;\n        else hi = mid;\n    }\n    return lo;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lJcUp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _bboxJs = require(\"./bbox.js\");\nvar _bboxJsDefault = parcelHelpers.interopDefault(_bboxJs);\nvar _untransformJs = require(\"./untransform.js\");\nvar _untransformJsDefault = parcelHelpers.interopDefault(_untransformJs);\nexports.default = function(topology, transform) {\n    if (topology.transform) throw new Error(\"already quantized\");\n    if (!transform || !transform.scale) {\n        if (!((n = Math.floor(transform)) >= 2)) throw new Error(\"n must be \\u22652\");\n        box = topology.bbox || (0, _bboxJsDefault.default)(topology);\n        var x0 = box[0], y0 = box[1], x1 = box[2], y1 = box[3], n;\n        transform = {\n            scale: [\n                x1 - x0 ? (x1 - x0) / (n - 1) : 1,\n                y1 - y0 ? (y1 - y0) / (n - 1) : 1\n            ],\n            translate: [\n                x0,\n                y0\n            ]\n        };\n    } else box = topology.bbox;\n    var t = (0, _untransformJsDefault.default)(transform), box, key, inputs = topology.objects, outputs = {};\n    function quantizePoint(point) {\n        return t(point);\n    }\n    function quantizeGeometry(input) {\n        var output;\n        switch(input.type){\n            case \"GeometryCollection\":\n                output = {\n                    type: \"GeometryCollection\",\n                    geometries: input.geometries.map(quantizeGeometry)\n                };\n                break;\n            case \"Point\":\n                output = {\n                    type: \"Point\",\n                    coordinates: quantizePoint(input.coordinates)\n                };\n                break;\n            case \"MultiPoint\":\n                output = {\n                    type: \"MultiPoint\",\n                    coordinates: input.coordinates.map(quantizePoint)\n                };\n                break;\n            default:\n                return input;\n        }\n        if (input.id != null) output.id = input.id;\n        if (input.bbox != null) output.bbox = input.bbox;\n        if (input.properties != null) output.properties = input.properties;\n        return output;\n    }\n    function quantizeArc(input) {\n        var i = 0, j = 1, n = input.length, p, output = new Array(n); // pessimistic\n        output[0] = t(input[0], 0);\n        while(++i < n)if ((p = t(input[i], i))[0] || p[1]) output[j++] = p; // non-coincident points\n        if (j === 1) output[j++] = [\n            0,\n            0\n        ]; // an arc must have at least two points\n        output.length = j;\n        return output;\n    }\n    for(key in inputs)outputs[key] = quantizeGeometry(inputs[key]);\n    return {\n        type: \"Topology\",\n        bbox: box,\n        transform: transform,\n        objects: outputs,\n        arcs: topology.arcs.map(quantizeArc)\n    };\n};\n\n},{\"./bbox.js\":\"4xKr2\",\"./untransform.js\":\"W0snH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"W0snH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nexports.default = function(transform) {\n    if (transform == null) return 0, _identityJsDefault.default;\n    var x0, y0, kx = transform.scale[0], ky = transform.scale[1], dx = transform.translate[0], dy = transform.translate[1];\n    return function(input, i) {\n        if (!i) x0 = y0 = 0;\n        var j = 2, n = input.length, output = new Array(n), x1 = Math.round((input[0] - dx) / kx), y1 = Math.round((input[1] - dy) / ky);\n        output[0] = x1 - x0, x0 = x1;\n        output[1] = y1 - y0, y0 = y1;\n        while(j < n)output[j] = input[j], ++j;\n        return output;\n    };\n};\n\n},{\"./identity.js\":\"3vQTx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bXIHh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultLocale\", ()=>defaultLocale);\nparcelHelpers.export(exports, \"locale\", ()=>locale);\nparcelHelpers.export(exports, \"numberFormatDefaultLocale\", ()=>numberFormatDefaultLocale);\nparcelHelpers.export(exports, \"numberFormatLocale\", ()=>numberFormatLocale);\nparcelHelpers.export(exports, \"resetDefaultLocale\", ()=>resetDefaultLocale);\nparcelHelpers.export(exports, \"resetNumberFormatDefaultLocale\", ()=>resetNumberFormatDefaultLocale);\nparcelHelpers.export(exports, \"resetTimeFormatDefaultLocale\", ()=>resetTimeFormatDefaultLocale);\nparcelHelpers.export(exports, \"timeFormatDefaultLocale\", ()=>timeFormatDefaultLocale);\nparcelHelpers.export(exports, \"timeFormatLocale\", ()=>timeFormatLocale);\nvar _d3Array = require(\"d3-array\");\nvar _d3Format = require(\"d3-format\");\nvar _vegaTime = require(\"vega-time\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3TimeFormat = require(\"d3-time-format\");\nfunction memoize(method) {\n    const cache = {};\n    return (spec)=>cache[spec] || (cache[spec] = method(spec));\n}\nfunction trimZeroes(numberFormat, decimalChar) {\n    return (x)=>{\n        const str = numberFormat(x), dec = str.indexOf(decimalChar);\n        if (dec < 0) return str;\n        let idx = rightmostDigit(str, dec);\n        const end = idx < str.length ? str.slice(idx) : \"\";\n        while(--idx > dec)if (str[idx] !== \"0\") {\n            ++idx;\n            break;\n        }\n        return str.slice(0, idx) + end;\n    };\n}\nfunction rightmostDigit(str, dec) {\n    let i = str.lastIndexOf(\"e\"), c;\n    if (i > 0) return i;\n    for(i = str.length; --i > dec;){\n        c = str.charCodeAt(i);\n        if (c >= 48 && c <= 57) return i + 1; // is digit\n    }\n}\nfunction numberLocale(locale1) {\n    const format = memoize(locale1.format), formatPrefix = locale1.formatPrefix;\n    return {\n        format,\n        formatPrefix,\n        formatFloat (spec) {\n            const s = (0, _d3Format.formatSpecifier)(spec || \",\");\n            if (s.precision == null) {\n                s.precision = 12;\n                switch(s.type){\n                    case \"%\":\n                        s.precision -= 2;\n                        break;\n                    case \"e\":\n                        s.precision -= 1;\n                        break;\n                }\n                return trimZeroes(format(s), format(\".1f\")(1)[1] // decimal point character\n                );\n            } else return format(s);\n        },\n        formatSpan (start, stop, count, specifier) {\n            specifier = (0, _d3Format.formatSpecifier)(specifier == null ? \",f\" : specifier);\n            const step = (0, _d3Array.tickStep)(start, stop, count), value = Math.max(Math.abs(start), Math.abs(stop));\n            let precision;\n            if (specifier.precision == null) switch(specifier.type){\n                case \"s\":\n                    if (!isNaN(precision = (0, _d3Format.precisionPrefix)(step, value))) specifier.precision = precision;\n                    return formatPrefix(specifier, value);\n                case \"\":\n                case \"e\":\n                case \"g\":\n                case \"p\":\n                case \"r\":\n                    if (!isNaN(precision = (0, _d3Format.precisionRound)(step, value))) specifier.precision = precision - (specifier.type === \"e\");\n                    break;\n                case \"f\":\n                case \"%\":\n                    if (!isNaN(precision = (0, _d3Format.precisionFixed)(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n                    break;\n            }\n            return format(specifier);\n        }\n    };\n}\nlet defaultNumberLocale;\nresetNumberFormatDefaultLocale();\nfunction resetNumberFormatDefaultLocale() {\n    return defaultNumberLocale = numberLocale({\n        format: (0, _d3Format.format),\n        formatPrefix: (0, _d3Format.formatPrefix)\n    });\n}\nfunction numberFormatLocale(definition) {\n    return numberLocale((0, _d3Format.formatLocale)(definition));\n}\nfunction numberFormatDefaultLocale(definition) {\n    return arguments.length ? defaultNumberLocale = numberFormatLocale(definition) : defaultNumberLocale;\n}\nfunction timeMultiFormat(format, interval, spec) {\n    spec = spec || {};\n    if (!(0, _vegaUtil.isObject)(spec)) (0, _vegaUtil.error)(\"Invalid time multi-format specifier: \".concat(spec));\n    const second = interval((0, _vegaTime.SECONDS)), minute = interval((0, _vegaTime.MINUTES)), hour = interval((0, _vegaTime.HOURS)), day = interval((0, _vegaTime.DATE)), week = interval((0, _vegaTime.WEEK)), month = interval((0, _vegaTime.MONTH)), quarter = interval((0, _vegaTime.QUARTER)), year = interval((0, _vegaTime.YEAR)), L = format(spec[0, _vegaTime.MILLISECONDS] || \".%L\"), S = format(spec[0, _vegaTime.SECONDS] || \":%S\"), M = format(spec[0, _vegaTime.MINUTES] || \"%I:%M\"), H = format(spec[0, _vegaTime.HOURS] || \"%I %p\"), d = format(spec[0, _vegaTime.DATE] || spec[0, _vegaTime.DAY] || \"%a %d\"), w = format(spec[0, _vegaTime.WEEK] || \"%b %d\"), m = format(spec[0, _vegaTime.MONTH] || \"%B\"), q = format(spec[0, _vegaTime.QUARTER] || \"%B\"), y = format(spec[0, _vegaTime.YEAR] || \"%Y\");\n    return (date)=>(second(date) < date ? L : minute(date) < date ? S : hour(date) < date ? M : day(date) < date ? H : month(date) < date ? week(date) < date ? d : w : year(date) < date ? quarter(date) < date ? m : q : y)(date);\n}\nfunction timeLocale(locale2) {\n    const timeFormat = memoize(locale2.format), utcFormat = memoize(locale2.utcFormat);\n    return {\n        timeFormat: (spec)=>(0, _vegaUtil.isString)(spec) ? timeFormat(spec) : timeMultiFormat(timeFormat, (0, _vegaTime.timeInterval), spec),\n        utcFormat: (spec)=>(0, _vegaUtil.isString)(spec) ? utcFormat(spec) : timeMultiFormat(utcFormat, (0, _vegaTime.utcInterval), spec),\n        timeParse: memoize(locale2.parse),\n        utcParse: memoize(locale2.utcParse)\n    };\n}\nlet defaultTimeLocale;\nresetTimeFormatDefaultLocale();\nfunction resetTimeFormatDefaultLocale() {\n    return defaultTimeLocale = timeLocale({\n        format: (0, _d3TimeFormat.timeFormat),\n        parse: (0, _d3TimeFormat.timeParse),\n        utcFormat: (0, _d3TimeFormat.utcFormat),\n        utcParse: (0, _d3TimeFormat.utcParse)\n    });\n}\nfunction timeFormatLocale(definition) {\n    return timeLocale((0, _d3TimeFormat.timeFormatLocale)(definition));\n}\nfunction timeFormatDefaultLocale(definition) {\n    return arguments.length ? defaultTimeLocale = timeFormatLocale(definition) : defaultTimeLocale;\n}\nconst createLocale = (number, time)=>(0, _vegaUtil.extend)({}, number, time);\nfunction locale(numberSpec, timeSpec) {\n    const number = numberSpec ? numberFormatLocale(numberSpec) : numberFormatDefaultLocale();\n    const time = timeSpec ? timeFormatLocale(timeSpec) : timeFormatDefaultLocale();\n    return createLocale(number, time);\n}\nfunction defaultLocale(numberSpec, timeSpec) {\n    const args = arguments.length;\n    if (args && args !== 2) (0, _vegaUtil.error)(\"defaultLocale expects either zero or two arguments.\");\n    return args ? createLocale(numberFormatDefaultLocale(numberSpec), timeFormatDefaultLocale(timeSpec)) : createLocale(numberFormatDefaultLocale(), timeFormatDefaultLocale());\n}\nfunction resetDefaultLocale() {\n    resetNumberFormatDefaultLocale();\n    resetTimeFormatDefaultLocale();\n    return defaultLocale();\n}\n\n},{\"d3-array\":\"8JMcC\",\"d3-format\":\"l5DiZ\",\"vega-time\":\"hDlOp\",\"vega-util\":\"dPFAY\",\"d3-time-format\":\"gQBqt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8JMcC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bisect\", ()=>(0, _bisectJsDefault.default));\nparcelHelpers.export(exports, \"bisectRight\", ()=>(0, _bisectJs.bisectRight));\nparcelHelpers.export(exports, \"bisectLeft\", ()=>(0, _bisectJs.bisectLeft));\nparcelHelpers.export(exports, \"bisectCenter\", ()=>(0, _bisectJs.bisectCenter));\nparcelHelpers.export(exports, \"ascending\", ()=>(0, _ascendingJsDefault.default));\nparcelHelpers.export(exports, \"bisector\", ()=>(0, _bisectorJsDefault.default));\nparcelHelpers.export(exports, \"count\", ()=>(0, _countJsDefault.default));\nparcelHelpers.export(exports, \"cross\", ()=>(0, _crossJsDefault.default));\nparcelHelpers.export(exports, \"cumsum\", ()=>(0, _cumsumJsDefault.default));\nparcelHelpers.export(exports, \"descending\", ()=>(0, _descendingJsDefault.default));\nparcelHelpers.export(exports, \"deviation\", ()=>(0, _deviationJsDefault.default));\nparcelHelpers.export(exports, \"extent\", ()=>(0, _extentJsDefault.default));\nparcelHelpers.export(exports, \"Adder\", ()=>(0, _fsumJs.Adder));\nparcelHelpers.export(exports, \"fsum\", ()=>(0, _fsumJs.fsum));\nparcelHelpers.export(exports, \"fcumsum\", ()=>(0, _fsumJs.fcumsum));\nparcelHelpers.export(exports, \"group\", ()=>(0, _groupJsDefault.default));\nparcelHelpers.export(exports, \"groups\", ()=>(0, _groupJs.groups));\nparcelHelpers.export(exports, \"index\", ()=>(0, _groupJs.index));\nparcelHelpers.export(exports, \"indexes\", ()=>(0, _groupJs.indexes));\nparcelHelpers.export(exports, \"rollup\", ()=>(0, _groupJs.rollup));\nparcelHelpers.export(exports, \"rollups\", ()=>(0, _groupJs.rollups));\nparcelHelpers.export(exports, \"groupSort\", ()=>(0, _groupSortJsDefault.default));\nparcelHelpers.export(exports, \"bin\", ()=>(0, _binJsDefault.default)) // Deprecated; use bin.\n;\nparcelHelpers.export(exports, \"histogram\", ()=>(0, _binJsDefault.default));\nparcelHelpers.export(exports, \"thresholdFreedmanDiaconis\", ()=>(0, _freedmanDiaconisJsDefault.default));\nparcelHelpers.export(exports, \"thresholdScott\", ()=>(0, _scottJsDefault.default));\nparcelHelpers.export(exports, \"thresholdSturges\", ()=>(0, _sturgesJsDefault.default));\nparcelHelpers.export(exports, \"max\", ()=>(0, _maxJsDefault.default));\nparcelHelpers.export(exports, \"maxIndex\", ()=>(0, _maxIndexJsDefault.default));\nparcelHelpers.export(exports, \"mean\", ()=>(0, _meanJsDefault.default));\nparcelHelpers.export(exports, \"median\", ()=>(0, _medianJsDefault.default));\nparcelHelpers.export(exports, \"merge\", ()=>(0, _mergeJsDefault.default));\nparcelHelpers.export(exports, \"min\", ()=>(0, _minJsDefault.default));\nparcelHelpers.export(exports, \"minIndex\", ()=>(0, _minIndexJsDefault.default));\nparcelHelpers.export(exports, \"nice\", ()=>(0, _niceJsDefault.default));\nparcelHelpers.export(exports, \"pairs\", ()=>(0, _pairsJsDefault.default));\nparcelHelpers.export(exports, \"permute\", ()=>(0, _permuteJsDefault.default));\nparcelHelpers.export(exports, \"quantile\", ()=>(0, _quantileJsDefault.default));\nparcelHelpers.export(exports, \"quantileSorted\", ()=>(0, _quantileJs.quantileSorted));\nparcelHelpers.export(exports, \"quickselect\", ()=>(0, _quickselectJsDefault.default));\nparcelHelpers.export(exports, \"range\", ()=>(0, _rangeJsDefault.default));\nparcelHelpers.export(exports, \"least\", ()=>(0, _leastJsDefault.default));\nparcelHelpers.export(exports, \"leastIndex\", ()=>(0, _leastIndexJsDefault.default));\nparcelHelpers.export(exports, \"greatest\", ()=>(0, _greatestJsDefault.default));\nparcelHelpers.export(exports, \"greatestIndex\", ()=>(0, _greatestIndexJsDefault.default));\nparcelHelpers.export(exports, \"scan\", ()=>(0, _scanJsDefault.default)) // Deprecated; use leastIndex.\n;\nparcelHelpers.export(exports, \"shuffle\", ()=>(0, _shuffleJsDefault.default));\nparcelHelpers.export(exports, \"shuffler\", ()=>(0, _shuffleJs.shuffler));\nparcelHelpers.export(exports, \"sum\", ()=>(0, _sumJsDefault.default));\nparcelHelpers.export(exports, \"ticks\", ()=>(0, _ticksJsDefault.default));\nparcelHelpers.export(exports, \"tickIncrement\", ()=>(0, _ticksJs.tickIncrement));\nparcelHelpers.export(exports, \"tickStep\", ()=>(0, _ticksJs.tickStep));\nparcelHelpers.export(exports, \"transpose\", ()=>(0, _transposeJsDefault.default));\nparcelHelpers.export(exports, \"variance\", ()=>(0, _varianceJsDefault.default));\nparcelHelpers.export(exports, \"zip\", ()=>(0, _zipJsDefault.default));\nparcelHelpers.export(exports, \"every\", ()=>(0, _everyJsDefault.default));\nparcelHelpers.export(exports, \"some\", ()=>(0, _someJsDefault.default));\nparcelHelpers.export(exports, \"filter\", ()=>(0, _filterJsDefault.default));\nparcelHelpers.export(exports, \"map\", ()=>(0, _mapJsDefault.default));\nparcelHelpers.export(exports, \"reduce\", ()=>(0, _reduceJsDefault.default));\nparcelHelpers.export(exports, \"reverse\", ()=>(0, _reverseJsDefault.default));\nparcelHelpers.export(exports, \"sort\", ()=>(0, _sortJsDefault.default));\nparcelHelpers.export(exports, \"difference\", ()=>(0, _differenceJsDefault.default));\nparcelHelpers.export(exports, \"disjoint\", ()=>(0, _disjointJsDefault.default));\nparcelHelpers.export(exports, \"intersection\", ()=>(0, _intersectionJsDefault.default));\nparcelHelpers.export(exports, \"subset\", ()=>(0, _subsetJsDefault.default));\nparcelHelpers.export(exports, \"superset\", ()=>(0, _supersetJsDefault.default));\nparcelHelpers.export(exports, \"union\", ()=>(0, _unionJsDefault.default));\nparcelHelpers.export(exports, \"InternMap\", ()=>(0, _internmap.InternMap));\nparcelHelpers.export(exports, \"InternSet\", ()=>(0, _internmap.InternSet));\nvar _bisectJs = require(\"./bisect.js\");\nvar _bisectJsDefault = parcelHelpers.interopDefault(_bisectJs);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nvar _bisectorJs = require(\"./bisector.js\");\nvar _bisectorJsDefault = parcelHelpers.interopDefault(_bisectorJs);\nvar _countJs = require(\"./count.js\");\nvar _countJsDefault = parcelHelpers.interopDefault(_countJs);\nvar _crossJs = require(\"./cross.js\");\nvar _crossJsDefault = parcelHelpers.interopDefault(_crossJs);\nvar _cumsumJs = require(\"./cumsum.js\");\nvar _cumsumJsDefault = parcelHelpers.interopDefault(_cumsumJs);\nvar _descendingJs = require(\"./descending.js\");\nvar _descendingJsDefault = parcelHelpers.interopDefault(_descendingJs);\nvar _deviationJs = require(\"./deviation.js\");\nvar _deviationJsDefault = parcelHelpers.interopDefault(_deviationJs);\nvar _extentJs = require(\"./extent.js\");\nvar _extentJsDefault = parcelHelpers.interopDefault(_extentJs);\nvar _fsumJs = require(\"./fsum.js\");\nvar _groupJs = require(\"./group.js\");\nvar _groupJsDefault = parcelHelpers.interopDefault(_groupJs);\nvar _groupSortJs = require(\"./groupSort.js\");\nvar _groupSortJsDefault = parcelHelpers.interopDefault(_groupSortJs);\nvar _binJs = require(\"./bin.js\");\nvar _binJsDefault = parcelHelpers.interopDefault(_binJs);\nvar _freedmanDiaconisJs = require(\"./threshold/freedmanDiaconis.js\");\nvar _freedmanDiaconisJsDefault = parcelHelpers.interopDefault(_freedmanDiaconisJs);\nvar _scottJs = require(\"./threshold/scott.js\");\nvar _scottJsDefault = parcelHelpers.interopDefault(_scottJs);\nvar _sturgesJs = require(\"./threshold/sturges.js\");\nvar _sturgesJsDefault = parcelHelpers.interopDefault(_sturgesJs);\nvar _maxJs = require(\"./max.js\");\nvar _maxJsDefault = parcelHelpers.interopDefault(_maxJs);\nvar _maxIndexJs = require(\"./maxIndex.js\");\nvar _maxIndexJsDefault = parcelHelpers.interopDefault(_maxIndexJs);\nvar _meanJs = require(\"./mean.js\");\nvar _meanJsDefault = parcelHelpers.interopDefault(_meanJs);\nvar _medianJs = require(\"./median.js\");\nvar _medianJsDefault = parcelHelpers.interopDefault(_medianJs);\nvar _mergeJs = require(\"./merge.js\");\nvar _mergeJsDefault = parcelHelpers.interopDefault(_mergeJs);\nvar _minJs = require(\"./min.js\");\nvar _minJsDefault = parcelHelpers.interopDefault(_minJs);\nvar _minIndexJs = require(\"./minIndex.js\");\nvar _minIndexJsDefault = parcelHelpers.interopDefault(_minIndexJs);\nvar _niceJs = require(\"./nice.js\");\nvar _niceJsDefault = parcelHelpers.interopDefault(_niceJs);\nvar _pairsJs = require(\"./pairs.js\");\nvar _pairsJsDefault = parcelHelpers.interopDefault(_pairsJs);\nvar _permuteJs = require(\"./permute.js\");\nvar _permuteJsDefault = parcelHelpers.interopDefault(_permuteJs);\nvar _quantileJs = require(\"./quantile.js\");\nvar _quantileJsDefault = parcelHelpers.interopDefault(_quantileJs);\nvar _quickselectJs = require(\"./quickselect.js\");\nvar _quickselectJsDefault = parcelHelpers.interopDefault(_quickselectJs);\nvar _rangeJs = require(\"./range.js\");\nvar _rangeJsDefault = parcelHelpers.interopDefault(_rangeJs);\nvar _leastJs = require(\"./least.js\");\nvar _leastJsDefault = parcelHelpers.interopDefault(_leastJs);\nvar _leastIndexJs = require(\"./leastIndex.js\");\nvar _leastIndexJsDefault = parcelHelpers.interopDefault(_leastIndexJs);\nvar _greatestJs = require(\"./greatest.js\");\nvar _greatestJsDefault = parcelHelpers.interopDefault(_greatestJs);\nvar _greatestIndexJs = require(\"./greatestIndex.js\");\nvar _greatestIndexJsDefault = parcelHelpers.interopDefault(_greatestIndexJs);\nvar _scanJs = require(\"./scan.js\");\nvar _scanJsDefault = parcelHelpers.interopDefault(_scanJs);\nvar _shuffleJs = require(\"./shuffle.js\");\nvar _shuffleJsDefault = parcelHelpers.interopDefault(_shuffleJs);\nvar _sumJs = require(\"./sum.js\");\nvar _sumJsDefault = parcelHelpers.interopDefault(_sumJs);\nvar _ticksJs = require(\"./ticks.js\");\nvar _ticksJsDefault = parcelHelpers.interopDefault(_ticksJs);\nvar _transposeJs = require(\"./transpose.js\");\nvar _transposeJsDefault = parcelHelpers.interopDefault(_transposeJs);\nvar _varianceJs = require(\"./variance.js\");\nvar _varianceJsDefault = parcelHelpers.interopDefault(_varianceJs);\nvar _zipJs = require(\"./zip.js\");\nvar _zipJsDefault = parcelHelpers.interopDefault(_zipJs);\nvar _everyJs = require(\"./every.js\");\nvar _everyJsDefault = parcelHelpers.interopDefault(_everyJs);\nvar _someJs = require(\"./some.js\");\nvar _someJsDefault = parcelHelpers.interopDefault(_someJs);\nvar _filterJs = require(\"./filter.js\");\nvar _filterJsDefault = parcelHelpers.interopDefault(_filterJs);\nvar _mapJs = require(\"./map.js\");\nvar _mapJsDefault = parcelHelpers.interopDefault(_mapJs);\nvar _reduceJs = require(\"./reduce.js\");\nvar _reduceJsDefault = parcelHelpers.interopDefault(_reduceJs);\nvar _reverseJs = require(\"./reverse.js\");\nvar _reverseJsDefault = parcelHelpers.interopDefault(_reverseJs);\nvar _sortJs = require(\"./sort.js\");\nvar _sortJsDefault = parcelHelpers.interopDefault(_sortJs);\nvar _differenceJs = require(\"./difference.js\");\nvar _differenceJsDefault = parcelHelpers.interopDefault(_differenceJs);\nvar _disjointJs = require(\"./disjoint.js\");\nvar _disjointJsDefault = parcelHelpers.interopDefault(_disjointJs);\nvar _intersectionJs = require(\"./intersection.js\");\nvar _intersectionJsDefault = parcelHelpers.interopDefault(_intersectionJs);\nvar _subsetJs = require(\"./subset.js\");\nvar _subsetJsDefault = parcelHelpers.interopDefault(_subsetJs);\nvar _supersetJs = require(\"./superset.js\");\nvar _supersetJsDefault = parcelHelpers.interopDefault(_supersetJs);\nvar _unionJs = require(\"./union.js\");\nvar _unionJsDefault = parcelHelpers.interopDefault(_unionJs);\nvar _internmap = require(\"internmap\");\n\n},{\"./bisect.js\":\"a9fyl\",\"./ascending.js\":\"3BPPi\",\"./bisector.js\":\"2bvKF\",\"./count.js\":false,\"./cross.js\":false,\"./cumsum.js\":false,\"./descending.js\":false,\"./deviation.js\":\"a68i2\",\"./extent.js\":false,\"./fsum.js\":\"ke2C0\",\"./group.js\":false,\"./groupSort.js\":false,\"./bin.js\":false,\"./threshold/freedmanDiaconis.js\":false,\"./threshold/scott.js\":false,\"./threshold/sturges.js\":false,\"./max.js\":\"8f8pE\",\"./maxIndex.js\":false,\"./mean.js\":\"88IUx\",\"./median.js\":\"c9ICZ\",\"./merge.js\":\"14kry\",\"./min.js\":\"1YYnD\",\"./minIndex.js\":false,\"./nice.js\":false,\"./pairs.js\":false,\"./permute.js\":\"2dx3E\",\"./quantile.js\":\"lHxtE\",\"./quickselect.js\":\"ec6zf\",\"./range.js\":\"7dCbL\",\"./least.js\":false,\"./leastIndex.js\":false,\"./greatest.js\":false,\"./greatestIndex.js\":false,\"./scan.js\":false,\"./shuffle.js\":false,\"./sum.js\":\"fvrgL\",\"./ticks.js\":\"eUhlt\",\"./transpose.js\":false,\"./variance.js\":\"dQA4P\",\"./zip.js\":false,\"./every.js\":false,\"./some.js\":false,\"./filter.js\":false,\"./map.js\":false,\"./reduce.js\":false,\"./reverse.js\":false,\"./sort.js\":false,\"./difference.js\":false,\"./disjoint.js\":false,\"./intersection.js\":false,\"./subset.js\":false,\"./superset.js\":false,\"./union.js\":false,\"internmap\":\"13ksD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a9fyl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bisectRight\", ()=>bisectRight);\nparcelHelpers.export(exports, \"bisectLeft\", ()=>bisectLeft);\nparcelHelpers.export(exports, \"bisectCenter\", ()=>bisectCenter);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nvar _bisectorJs = require(\"./bisector.js\");\nvar _bisectorJsDefault = parcelHelpers.interopDefault(_bisectorJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nconst ascendingBisect = (0, _bisectorJsDefault.default)((0, _ascendingJsDefault.default));\nconst bisectRight = ascendingBisect.right;\nconst bisectLeft = ascendingBisect.left;\nconst bisectCenter = (0, _bisectorJsDefault.default)((0, _numberJsDefault.default)).center;\nexports.default = bisectRight;\n\n},{\"./ascending.js\":\"3BPPi\",\"./bisector.js\":\"2bvKF\",\"./number.js\":\"h4wXR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3BPPi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2bvKF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nexports.default = function(f) {\n    let delta = f;\n    let compare = f;\n    if (f.length === 1) {\n        delta = (d, x)=>f(d) - x;\n        compare = ascendingComparator(f);\n    }\n    function left(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while(lo < hi){\n            const mid = lo + hi >>> 1;\n            if (compare(a[mid], x) < 0) lo = mid + 1;\n            else hi = mid;\n        }\n        return lo;\n    }\n    function right(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while(lo < hi){\n            const mid = lo + hi >>> 1;\n            if (compare(a[mid], x) > 0) hi = mid;\n            else lo = mid + 1;\n        }\n        return lo;\n    }\n    function center(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        const i = left(a, x, lo, hi - 1);\n        return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n    }\n    return {\n        left,\n        center,\n        right\n    };\n};\nfunction ascendingComparator(f) {\n    return (d, x)=>(0, _ascendingJsDefault.default)(f(d), x);\n}\n\n},{\"./ascending.js\":\"3BPPi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h4wXR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"numbers\", ()=>numbers);\nexports.default = function(x) {\n    return x === null ? NaN : +x;\n};\nfunction* numbers(values, valueof) {\n    if (valueof === undefined) {\n        for (let value of values)if (value != null && (value = +value) >= value) yield value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) yield value;\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a68i2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _varianceJs = require(\"./variance.js\");\nvar _varianceJsDefault = parcelHelpers.interopDefault(_varianceJs);\nfunction deviation(values, valueof) {\n    const v = (0, _varianceJsDefault.default)(values, valueof);\n    return v ? Math.sqrt(v) : v;\n}\nexports.default = deviation;\n\n},{\"./variance.js\":\"dQA4P\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dQA4P\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction variance(values, valueof) {\n    let count = 0;\n    let delta;\n    let mean = 0;\n    let sum = 0;\n    if (valueof === undefined) {\n        for (let value of values)if (value != null && (value = +value) >= value) {\n            delta = value - mean;\n            mean += delta / ++count;\n            sum += delta * (value - mean);\n        }\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n            delta = value - mean;\n            mean += delta / ++count;\n            sum += delta * (value - mean);\n        }\n    }\n    if (count > 1) return sum / (count - 1);\n}\nexports.default = variance;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ke2C0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423\nparcelHelpers.export(exports, \"Adder\", ()=>Adder);\nparcelHelpers.export(exports, \"fsum\", ()=>fsum);\nparcelHelpers.export(exports, \"fcumsum\", ()=>fcumsum);\nclass Adder {\n    constructor(){\n        this._partials = new Float64Array(32);\n        this._n = 0;\n    }\n    add(x) {\n        const p = this._partials;\n        let i = 0;\n        for(let j = 0; j < this._n && j < 32; j++){\n            const y = p[j], hi = x + y, lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);\n            if (lo) p[i++] = lo;\n            x = hi;\n        }\n        p[i] = x;\n        this._n = i + 1;\n        return this;\n    }\n    valueOf() {\n        const p = this._partials;\n        let n = this._n, x, y, lo, hi = 0;\n        if (n > 0) {\n            hi = p[--n];\n            while(n > 0){\n                x = hi;\n                y = p[--n];\n                hi = x + y;\n                lo = y - (hi - x);\n                if (lo) break;\n            }\n            if (n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0)) {\n                y = lo * 2;\n                x = hi + y;\n                if (y == x - hi) hi = x;\n            }\n        }\n        return hi;\n    }\n}\nfunction fsum(values, valueof) {\n    const adder = new Adder();\n    if (valueof === undefined) {\n        for (let value of values)if (value = +value) adder.add(value);\n    } else {\n        let index = -1;\n        for (let value of values)if (value = +valueof(value, ++index, values)) adder.add(value);\n    }\n    return +adder;\n}\nfunction fcumsum(values, valueof) {\n    const adder = new Adder();\n    let index = -1;\n    return Float64Array.from(values, valueof === undefined ? (v)=>adder.add(+v || 0) : (v)=>adder.add(+valueof(v, ++index, values) || 0));\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8f8pE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction max(values, valueof) {\n    let max1;\n    if (valueof === undefined) {\n        for (const value of values)if (value != null && (max1 < value || max1 === undefined && value >= value)) max1 = value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (max1 < value || max1 === undefined && value >= value)) max1 = value;\n    }\n    return max1;\n}\nexports.default = max;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"88IUx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction mean(values, valueof) {\n    let count = 0;\n    let sum = 0;\n    if (valueof === undefined) {\n        for (let value of values)if (value != null && (value = +value) >= value) ++count, sum += value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) ++count, sum += value;\n    }\n    if (count) return sum / count;\n}\nexports.default = mean;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c9ICZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _quantileJs = require(\"./quantile.js\");\nvar _quantileJsDefault = parcelHelpers.interopDefault(_quantileJs);\nexports.default = function(values, valueof) {\n    return (0, _quantileJsDefault.default)(values, 0.5, valueof);\n};\n\n},{\"./quantile.js\":\"lHxtE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lHxtE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"quantileSorted\", ()=>quantileSorted);\nvar _maxJs = require(\"./max.js\");\nvar _maxJsDefault = parcelHelpers.interopDefault(_maxJs);\nvar _minJs = require(\"./min.js\");\nvar _minJsDefault = parcelHelpers.interopDefault(_minJs);\nvar _quickselectJs = require(\"./quickselect.js\");\nvar _quickselectJsDefault = parcelHelpers.interopDefault(_quickselectJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nfunction quantile(values, p, valueof) {\n    values = Float64Array.from((0, _numberJs.numbers)(values, valueof));\n    if (!(n = values.length)) return;\n    if ((p = +p) <= 0 || n < 2) return (0, _minJsDefault.default)(values);\n    if (p >= 1) return (0, _maxJsDefault.default)(values);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = (0, _maxJsDefault.default)((0, _quickselectJsDefault.default)(values, i0).subarray(0, i0 + 1)), value1 = (0, _minJsDefault.default)(values.subarray(i0 + 1));\n    return value0 + (value1 - value0) * (i - i0);\n}\nexports.default = quantile;\nfunction quantileSorted(values, p, valueof = (0, _numberJsDefault.default)) {\n    if (!(n = values.length)) return;\n    if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n    if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values[i0], i0, values), value1 = +valueof(values[i0 + 1], i0 + 1, values);\n    return value0 + (value1 - value0) * (i - i0);\n}\n\n},{\"./max.js\":\"8f8pE\",\"./min.js\":\"1YYnD\",\"./quickselect.js\":\"ec6zf\",\"./number.js\":\"h4wXR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1YYnD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction min(values, valueof) {\n    let min1;\n    if (valueof === undefined) {\n        for (const value of values)if (value != null && (min1 > value || min1 === undefined && value >= value)) min1 = value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (min1 > value || min1 === undefined && value >= value)) min1 = value;\n    }\n    return min1;\n}\nexports.default = min;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ec6zf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nfunction quickselect(array, k, left = 0, right = array.length - 1, compare = (0, _ascendingJsDefault.default)) {\n    while(right > left){\n        if (right - left > 600) {\n            const n = right - left + 1;\n            const m = k - left + 1;\n            const z = Math.log(n);\n            const s = 0.5 * Math.exp(2 * z / 3);\n            const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n            const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n            const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n            quickselect(array, k, newLeft, newRight, compare);\n        }\n        const t = array[k];\n        let i = left;\n        let j = right;\n        swap(array, left, k);\n        if (compare(array[right], t) > 0) swap(array, left, right);\n        while(i < j){\n            swap(array, i, j), ++i, --j;\n            while(compare(array[i], t) < 0)++i;\n            while(compare(array[j], t) > 0)--j;\n        }\n        if (compare(array[left], t) === 0) swap(array, left, j);\n        else ++j, swap(array, j, right);\n        if (j <= k) left = j + 1;\n        if (k <= j) right = j - 1;\n    }\n    return array;\n}\nexports.default = quickselect;\nfunction swap(array, i, j) {\n    const t = array[i];\n    array[i] = array[j];\n    array[j] = t;\n}\n\n},{\"./ascending.js\":\"3BPPi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"14kry\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction* flatten(arrays) {\n    for (const array of arrays)yield* array;\n}\nfunction merge(arrays) {\n    return Array.from(flatten(arrays));\n}\nexports.default = merge;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2dx3E\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(source, keys) {\n    return Array.from(keys, (key)=>source[key]);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7dCbL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(start, stop, step) {\n    start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n    var i = -1, n = Math.max(0, Math.ceil((stop - start) / step)) | 0, range = new Array(n);\n    while(++i < n)range[i] = start + i * step;\n    return range;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fvrgL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction sum(values, valueof) {\n    let sum1 = 0;\n    if (valueof === undefined) {\n        for (let value of values)if (value = +value) sum1 += value;\n    } else {\n        let index = -1;\n        for (let value of values)if (value = +valueof(value, ++index, values)) sum1 += value;\n    }\n    return sum1;\n}\nexports.default = sum;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eUhlt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"tickIncrement\", ()=>tickIncrement);\nparcelHelpers.export(exports, \"tickStep\", ()=>tickStep);\nvar e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);\nexports.default = function(start, stop, count) {\n    var reverse, i = -1, n, ticks, step;\n    stop = +stop, start = +start, count = +count;\n    if (start === stop && count > 0) return [\n        start\n    ];\n    if (reverse = stop < start) n = start, start = stop, stop = n;\n    if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n    if (step > 0) {\n        let r0 = Math.round(start / step), r1 = Math.round(stop / step);\n        if (r0 * step < start) ++r0;\n        if (r1 * step > stop) --r1;\n        ticks = new Array(n = r1 - r0 + 1);\n        while(++i < n)ticks[i] = (r0 + i) * step;\n    } else {\n        step = -step;\n        let r0 = Math.round(start * step), r1 = Math.round(stop * step);\n        if (r0 / step < start) ++r0;\n        if (r1 / step > stop) --r1;\n        ticks = new Array(n = r1 - r0 + 1);\n        while(++i < n)ticks[i] = (r0 + i) / step;\n    }\n    if (reverse) ticks.reverse();\n    return ticks;\n};\nfunction tickIncrement(start, stop, count) {\n    var step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power);\n    return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\nfunction tickStep(start, stop, count) {\n    var step0 = Math.abs(stop - start) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1;\n    if (error >= e10) step1 *= 10;\n    else if (error >= e5) step1 *= 5;\n    else if (error >= e2) step1 *= 2;\n    return stop < start ? -step1 : step1;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"13ksD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"InternMap\", ()=>InternMap);\nparcelHelpers.export(exports, \"InternSet\", ()=>InternSet);\nclass InternMap extends Map {\n    constructor(entries, key = keyof){\n        super();\n        Object.defineProperties(this, {\n            _intern: {\n                value: new Map()\n            },\n            _key: {\n                value: key\n            }\n        });\n        if (entries != null) for (const [key1, value] of entries)this.set(key1, value);\n    }\n    get(key) {\n        return super.get(intern_get(this, key));\n    }\n    has(key) {\n        return super.has(intern_get(this, key));\n    }\n    set(key, value) {\n        return super.set(intern_set(this, key), value);\n    }\n    delete(key) {\n        return super.delete(intern_delete(this, key));\n    }\n}\nclass InternSet extends Set {\n    constructor(values, key = keyof){\n        super();\n        Object.defineProperties(this, {\n            _intern: {\n                value: new Map()\n            },\n            _key: {\n                value: key\n            }\n        });\n        if (values != null) for (const value of values)this.add(value);\n    }\n    has(value) {\n        return super.has(intern_get(this, value));\n    }\n    add(value) {\n        return super.add(intern_set(this, value));\n    }\n    delete(value) {\n        return super.delete(intern_delete(this, value));\n    }\n}\nfunction intern_get({ _intern , _key  }, value) {\n    const key = _key(value);\n    return _intern.has(key) ? _intern.get(key) : value;\n}\nfunction intern_set({ _intern , _key  }, value) {\n    const key = _key(value);\n    if (_intern.has(key)) return _intern.get(key);\n    _intern.set(key, value);\n    return value;\n}\nfunction intern_delete({ _intern , _key  }, value) {\n    const key = _key(value);\n    if (_intern.has(key)) {\n        value = _intern.get(value);\n        _intern.delete(key);\n    }\n    return value;\n}\nfunction keyof(value) {\n    return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l5DiZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatDefaultLocale\", ()=>(0, _defaultLocaleJsDefault.default));\nparcelHelpers.export(exports, \"format\", ()=>(0, _defaultLocaleJs.format));\nparcelHelpers.export(exports, \"formatPrefix\", ()=>(0, _defaultLocaleJs.formatPrefix));\nparcelHelpers.export(exports, \"formatLocale\", ()=>(0, _localeJsDefault.default));\nparcelHelpers.export(exports, \"formatSpecifier\", ()=>(0, _formatSpecifierJsDefault.default));\nparcelHelpers.export(exports, \"FormatSpecifier\", ()=>(0, _formatSpecifierJs.FormatSpecifier));\nparcelHelpers.export(exports, \"precisionFixed\", ()=>(0, _precisionFixedJsDefault.default));\nparcelHelpers.export(exports, \"precisionPrefix\", ()=>(0, _precisionPrefixJsDefault.default));\nparcelHelpers.export(exports, \"precisionRound\", ()=>(0, _precisionRoundJsDefault.default));\nvar _defaultLocaleJs = require(\"./defaultLocale.js\");\nvar _defaultLocaleJsDefault = parcelHelpers.interopDefault(_defaultLocaleJs);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar _formatSpecifierJs = require(\"./formatSpecifier.js\");\nvar _formatSpecifierJsDefault = parcelHelpers.interopDefault(_formatSpecifierJs);\nvar _precisionFixedJs = require(\"./precisionFixed.js\");\nvar _precisionFixedJsDefault = parcelHelpers.interopDefault(_precisionFixedJs);\nvar _precisionPrefixJs = require(\"./precisionPrefix.js\");\nvar _precisionPrefixJsDefault = parcelHelpers.interopDefault(_precisionPrefixJs);\nvar _precisionRoundJs = require(\"./precisionRound.js\");\nvar _precisionRoundJsDefault = parcelHelpers.interopDefault(_precisionRoundJs);\n\n},{\"./defaultLocale.js\":\"6XvAh\",\"./locale.js\":\"7wPev\",\"./formatSpecifier.js\":\"eraFk\",\"./precisionFixed.js\":\"kTGMh\",\"./precisionPrefix.js\":\"fpE7v\",\"./precisionRound.js\":\"kC9ZP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6XvAh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"format\", ()=>format);\nparcelHelpers.export(exports, \"formatPrefix\", ()=>formatPrefix);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar locale;\nvar format;\nvar formatPrefix;\ndefaultLocale({\n    thousands: \",\",\n    grouping: [\n        3\n    ],\n    currency: [\n        \"$\",\n        \"\"\n    ]\n});\nfunction defaultLocale(definition) {\n    locale = (0, _localeJsDefault.default)(definition);\n    format = locale.format;\n    formatPrefix = locale.formatPrefix;\n    return locale;\n}\nexports.default = defaultLocale;\n\n},{\"./locale.js\":\"7wPev\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7wPev\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nvar _formatGroupJs = require(\"./formatGroup.js\");\nvar _formatGroupJsDefault = parcelHelpers.interopDefault(_formatGroupJs);\nvar _formatNumeralsJs = require(\"./formatNumerals.js\");\nvar _formatNumeralsJsDefault = parcelHelpers.interopDefault(_formatNumeralsJs);\nvar _formatSpecifierJs = require(\"./formatSpecifier.js\");\nvar _formatSpecifierJsDefault = parcelHelpers.interopDefault(_formatSpecifierJs);\nvar _formatTrimJs = require(\"./formatTrim.js\");\nvar _formatTrimJsDefault = parcelHelpers.interopDefault(_formatTrimJs);\nvar _formatTypesJs = require(\"./formatTypes.js\");\nvar _formatTypesJsDefault = parcelHelpers.interopDefault(_formatTypesJs);\nvar _formatPrefixAutoJs = require(\"./formatPrefixAuto.js\");\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar map = Array.prototype.map, prefixes = [\n    \"y\",\n    \"z\",\n    \"a\",\n    \"f\",\n    \"p\",\n    \"n\",\n    \"\\xb5\",\n    \"m\",\n    \"\",\n    \"k\",\n    \"M\",\n    \"G\",\n    \"T\",\n    \"P\",\n    \"E\",\n    \"Z\",\n    \"Y\"\n];\nexports.default = function(locale) {\n    var group = locale.grouping === undefined || locale.thousands === undefined ? (0, _identityJsDefault.default) : (0, _formatGroupJsDefault.default)(map.call(locale.grouping, Number), locale.thousands + \"\"), currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\", currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\", decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\", numerals = locale.numerals === undefined ? (0, _identityJsDefault.default) : (0, _formatNumeralsJsDefault.default)(map.call(locale.numerals, String)), percent = locale.percent === undefined ? \"%\" : locale.percent + \"\", minus = locale.minus === undefined ? \"\\u2212\" : locale.minus + \"\", nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n    function newFormat(specifier) {\n        specifier = (0, _formatSpecifierJsDefault.default)(specifier);\n        var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;\n        // The \"n\" type is an alias for \",g\".\n        if (type === \"n\") comma = true, type = \"g\";\n        else if (!(0, _formatTypesJsDefault.default)[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n        // If zero fill is specified, padding goes after sign and before digits.\n        if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\";\n        // Compute the prefix and suffix.\n        // For SI-prefix, the suffix is lazily computed.\n        var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\", suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n        // What format function should we use?\n        // Is this an integer type?\n        // Can this type generate exponential notation?\n        var formatType = (0, _formatTypesJsDefault.default)[type], maybeSuffix = /[defgprs%]/.test(type);\n        // Set the default precision if not specified,\n        // or clamp the specified precision to the supported range.\n        // For significant precision, it must be in [1, 21].\n        // For fixed precision, it must be in [0, 20].\n        precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n        function format(value) {\n            var valuePrefix = prefix, valueSuffix = suffix, i, n, c;\n            if (type === \"c\") {\n                valueSuffix = formatType(value) + valueSuffix;\n                value = \"\";\n            } else {\n                value = +value;\n                // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n                var valueNegative = value < 0 || 1 / value < 0;\n                // Perform the initial formatting.\n                value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n                // Trim insignificant zeros.\n                if (trim) value = (0, _formatTrimJsDefault.default)(value);\n                // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n                if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n                // Compute the prefix and suffix.\n                valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n                valueSuffix = (type === \"s\" ? prefixes[8 + (0, _formatPrefixAutoJs.prefixExponent) / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n                // Break the formatted value into the integer “value” part that can be\n                // grouped, and fractional or exponential “suffix” part that is not.\n                if (maybeSuffix) {\n                    i = -1, n = value.length;\n                    while(++i < n)if (c = value.charCodeAt(i), 48 > c || c > 57) {\n                        valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n                        value = value.slice(0, i);\n                        break;\n                    }\n                }\n            }\n            // If the fill character is not \"0\", grouping is applied before padding.\n            if (comma && !zero) value = group(value, Infinity);\n            // Compute the padding.\n            var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n            // If the fill character is \"0\", grouping is applied after padding.\n            if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n            // Reconstruct the final output based on the desired alignment.\n            switch(align){\n                case \"<\":\n                    value = valuePrefix + value + valueSuffix + padding;\n                    break;\n                case \"=\":\n                    value = valuePrefix + padding + value + valueSuffix;\n                    break;\n                case \"^\":\n                    value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n                    break;\n                default:\n                    value = padding + valuePrefix + value + valueSuffix;\n                    break;\n            }\n            return numerals(value);\n        }\n        format.toString = function() {\n            return specifier + \"\";\n        };\n        return format;\n    }\n    function formatPrefix(specifier, value1) {\n        var f = newFormat((specifier = (0, _formatSpecifierJsDefault.default)(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor((0, _exponentJsDefault.default)(value1) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];\n        return function(value) {\n            return f(k * value) + prefix;\n        };\n    }\n    return {\n        format: newFormat,\n        formatPrefix: formatPrefix\n    };\n};\n\n},{\"./exponent.js\":\"9bsAq\",\"./formatGroup.js\":\"12No0\",\"./formatNumerals.js\":\"crMQE\",\"./formatSpecifier.js\":\"eraFk\",\"./formatTrim.js\":\"6VcUP\",\"./formatTypes.js\":\"hEgdx\",\"./formatPrefixAuto.js\":\"6pqKw\",\"./identity.js\":\"3w3bP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9bsAq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nexports.default = function(x) {\n    return x = (0, _formatDecimalJs.formatDecimalParts)(Math.abs(x)), x ? x[1] : NaN;\n};\n\n},{\"./formatDecimal.js\":\"xEoU6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"xEoU6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nparcelHelpers.export(exports, \"formatDecimalParts\", ()=>formatDecimalParts);\nexports.default = function(x) {\n    return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString(\"en\").replace(/,/g, \"\") : x.toString(10);\n};\nfunction formatDecimalParts(x, p) {\n    if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n    var i, coefficient = x.slice(0, i);\n    // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n    // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n    return [\n        coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n        +x.slice(i + 1)\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"12No0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(grouping, thousands) {\n    return function(value, width) {\n        var i = value.length, t = [], j = 0, g = grouping[0], length = 0;\n        while(i > 0 && g > 0){\n            if (length + g + 1 > width) g = Math.max(1, width - length);\n            t.push(value.substring(i -= g, i + g));\n            if ((length += g + 1) > width) break;\n            g = grouping[j = (j + 1) % grouping.length];\n        }\n        return t.reverse().join(thousands);\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"crMQE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(numerals) {\n    return function(value) {\n        return value.replace(/[0-9]/g, function(i) {\n            return numerals[+i];\n        });\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eraFk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FormatSpecifier\", ()=>FormatSpecifier);\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nfunction formatSpecifier(specifier) {\n    if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match;\n    return new FormatSpecifier({\n        fill: match[1],\n        align: match[2],\n        sign: match[3],\n        symbol: match[4],\n        zero: match[5],\n        width: match[6],\n        comma: match[7],\n        precision: match[8] && match[8].slice(1),\n        trim: match[9],\n        type: match[10]\n    });\n}\nexports.default = formatSpecifier;\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\nfunction FormatSpecifier(specifier) {\n    this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === undefined ? undefined : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\nFormatSpecifier.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6VcUP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexports.default = function(s) {\n    out: for(var n = s.length, i = 1, i0 = -1, i1; i < n; ++i)switch(s[i]){\n        case \".\":\n            i0 = i1 = i;\n            break;\n        case \"0\":\n            if (i0 === 0) i0 = i;\n            i1 = i;\n            break;\n        default:\n            if (!+s[i]) break out;\n            if (i0 > 0) i0 = 0;\n            break;\n    }\n    return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hEgdx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nvar _formatDecimalJsDefault = parcelHelpers.interopDefault(_formatDecimalJs);\nvar _formatPrefixAutoJs = require(\"./formatPrefixAuto.js\");\nvar _formatPrefixAutoJsDefault = parcelHelpers.interopDefault(_formatPrefixAutoJs);\nvar _formatRoundedJs = require(\"./formatRounded.js\");\nvar _formatRoundedJsDefault = parcelHelpers.interopDefault(_formatRoundedJs);\nexports.default = {\n    \"%\": (x, p)=>(x * 100).toFixed(p),\n    \"b\": (x)=>Math.round(x).toString(2),\n    \"c\": (x)=>x + \"\",\n    \"d\": (0, _formatDecimalJsDefault.default),\n    \"e\": (x, p)=>x.toExponential(p),\n    \"f\": (x, p)=>x.toFixed(p),\n    \"g\": (x, p)=>x.toPrecision(p),\n    \"o\": (x)=>Math.round(x).toString(8),\n    \"p\": (x, p)=>(0, _formatRoundedJsDefault.default)(x * 100, p),\n    \"r\": (0, _formatRoundedJsDefault.default),\n    \"s\": (0, _formatPrefixAutoJsDefault.default),\n    \"X\": (x)=>Math.round(x).toString(16).toUpperCase(),\n    \"x\": (x)=>Math.round(x).toString(16)\n};\n\n},{\"./formatDecimal.js\":\"xEoU6\",\"./formatPrefixAuto.js\":\"6pqKw\",\"./formatRounded.js\":\"eycqK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6pqKw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"prefixExponent\", ()=>prefixExponent);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nvar prefixExponent;\nexports.default = function(x, p) {\n    var d = (0, _formatDecimalJs.formatDecimalParts)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, _formatDecimalJs.formatDecimalParts)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n};\n\n},{\"./formatDecimal.js\":\"xEoU6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eycqK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nexports.default = function(x, p) {\n    var d = (0, _formatDecimalJs.formatDecimalParts)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1];\n    return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n};\n\n},{\"./formatDecimal.js\":\"xEoU6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3w3bP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return x;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kTGMh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nexports.default = function(step) {\n    return Math.max(0, -(0, _exponentJsDefault.default)(Math.abs(step)));\n};\n\n},{\"./exponent.js\":\"9bsAq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fpE7v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nexports.default = function(step, value) {\n    return Math.max(0, Math.max(-8, Math.min(8, Math.floor((0, _exponentJsDefault.default)(value) / 3))) * 3 - (0, _exponentJsDefault.default)(Math.abs(step)));\n};\n\n},{\"./exponent.js\":\"9bsAq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kC9ZP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nexports.default = function(step, max) {\n    step = Math.abs(step), max = Math.abs(max) - step;\n    return Math.max(0, (0, _exponentJsDefault.default)(max) - (0, _exponentJsDefault.default)(step)) + 1;\n};\n\n},{\"./exponent.js\":\"9bsAq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hDlOp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DATE\", ()=>DATE);\nparcelHelpers.export(exports, \"DAY\", ()=>DAY);\nparcelHelpers.export(exports, \"DAYOFYEAR\", ()=>DAYOFYEAR);\nparcelHelpers.export(exports, \"HOURS\", ()=>HOURS);\nparcelHelpers.export(exports, \"MILLISECONDS\", ()=>MILLISECONDS);\nparcelHelpers.export(exports, \"MINUTES\", ()=>MINUTES);\nparcelHelpers.export(exports, \"MONTH\", ()=>MONTH);\nparcelHelpers.export(exports, \"QUARTER\", ()=>QUARTER);\nparcelHelpers.export(exports, \"SECONDS\", ()=>SECONDS);\nparcelHelpers.export(exports, \"TIME_UNITS\", ()=>TIME_UNITS);\nparcelHelpers.export(exports, \"WEEK\", ()=>WEEK);\nparcelHelpers.export(exports, \"YEAR\", ()=>YEAR);\nparcelHelpers.export(exports, \"dayofyear\", ()=>dayofyear);\nparcelHelpers.export(exports, \"timeBin\", ()=>bin);\nparcelHelpers.export(exports, \"timeFloor\", ()=>timeFloor);\nparcelHelpers.export(exports, \"timeInterval\", ()=>timeInterval);\nparcelHelpers.export(exports, \"timeOffset\", ()=>timeOffset);\nparcelHelpers.export(exports, \"timeSequence\", ()=>timeSequence);\nparcelHelpers.export(exports, \"timeUnitSpecifier\", ()=>timeUnitSpecifier);\nparcelHelpers.export(exports, \"timeUnits\", ()=>timeUnits);\nparcelHelpers.export(exports, \"utcFloor\", ()=>utcFloor);\nparcelHelpers.export(exports, \"utcInterval\", ()=>utcInterval);\nparcelHelpers.export(exports, \"utcOffset\", ()=>utcOffset);\nparcelHelpers.export(exports, \"utcSequence\", ()=>utcSequence);\nparcelHelpers.export(exports, \"utcdayofyear\", ()=>utcdayofyear);\nparcelHelpers.export(exports, \"utcweek\", ()=>utcweek);\nparcelHelpers.export(exports, \"week\", ()=>week);\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Time = require(\"d3-time\");\nvar _d3Array = require(\"d3-array\");\nconst YEAR = \"year\";\nconst QUARTER = \"quarter\";\nconst MONTH = \"month\";\nconst WEEK = \"week\";\nconst DATE = \"date\";\nconst DAY = \"day\";\nconst DAYOFYEAR = \"dayofyear\";\nconst HOURS = \"hours\";\nconst MINUTES = \"minutes\";\nconst SECONDS = \"seconds\";\nconst MILLISECONDS = \"milliseconds\";\nconst TIME_UNITS = [\n    YEAR,\n    QUARTER,\n    MONTH,\n    WEEK,\n    DATE,\n    DAY,\n    DAYOFYEAR,\n    HOURS,\n    MINUTES,\n    SECONDS,\n    MILLISECONDS\n];\nconst UNITS = TIME_UNITS.reduce((o, u, i)=>(o[u] = 1 + i, o), {});\nfunction timeUnits(units) {\n    const u = (0, _vegaUtil.array)(units).slice(), m = {}; // check validity\n    if (!u.length) (0, _vegaUtil.error)(\"Missing time unit.\");\n    u.forEach((unit)=>{\n        if ((0, _vegaUtil.hasOwnProperty)(UNITS, unit)) m[unit] = 1;\n        else (0, _vegaUtil.error)(\"Invalid time unit: \".concat(unit, \".\"));\n    });\n    const numTypes = (m[WEEK] || m[DAY] ? 1 : 0) + (m[QUARTER] || m[MONTH] || m[DATE] ? 1 : 0) + (m[DAYOFYEAR] ? 1 : 0);\n    if (numTypes > 1) (0, _vegaUtil.error)(\"Incompatible time units: \".concat(units));\n     // ensure proper sort order\n    u.sort((a, b)=>UNITS[a] - UNITS[b]);\n    return u;\n}\nconst defaultSpecifiers = {\n    [YEAR]: \"%Y \",\n    [QUARTER]: \"Q%q \",\n    [MONTH]: \"%b \",\n    [DATE]: \"%d \",\n    [WEEK]: \"W%U \",\n    [DAY]: \"%a \",\n    [DAYOFYEAR]: \"%j \",\n    [HOURS]: \"%H:00\",\n    [MINUTES]: \"00:%M\",\n    [SECONDS]: \":%S\",\n    [MILLISECONDS]: \".%L\",\n    [\"\".concat(YEAR, \"-\").concat(MONTH)]: \"%Y-%m \",\n    [\"\".concat(YEAR, \"-\").concat(MONTH, \"-\").concat(DATE)]: \"%Y-%m-%d \",\n    [\"\".concat(HOURS, \"-\").concat(MINUTES)]: \"%H:%M\"\n};\nfunction timeUnitSpecifier(units, specifiers) {\n    const s = (0, _vegaUtil.extend)({}, defaultSpecifiers, specifiers), u = timeUnits(units), n = u.length;\n    let fmt = \"\", start = 0, end, key;\n    for(start = 0; start < n;)for(end = u.length; end > start; --end){\n        key = u.slice(start, end).join(\"-\");\n        if (s[key] != null) {\n            fmt += s[key];\n            start = end;\n            break;\n        }\n    }\n    return fmt.trim();\n}\nconst t0 = new Date();\nfunction localYear(y) {\n    t0.setFullYear(y);\n    t0.setMonth(0);\n    t0.setDate(1);\n    t0.setHours(0, 0, 0, 0);\n    return t0;\n}\nfunction dayofyear(d) {\n    return localDayOfYear(new Date(d));\n}\nfunction week(d) {\n    return localWeekNum(new Date(d));\n}\nfunction localDayOfYear(d) {\n    return (0, _d3Time.timeDay).count(localYear(d.getFullYear()) - 1, d);\n}\nfunction localWeekNum(d) {\n    return (0, _d3Time.timeWeek).count(localYear(d.getFullYear()) - 1, d);\n}\nfunction localFirst(y) {\n    return localYear(y).getDay();\n}\nfunction localDate(y, m, d, H, M, S, L) {\n    if (0 <= y && y < 100) {\n        const date = new Date(-1, m, d, H, M, S, L);\n        date.setFullYear(y);\n        return date;\n    }\n    return new Date(y, m, d, H, M, S, L);\n}\nfunction utcdayofyear(d) {\n    return utcDayOfYear(new Date(d));\n}\nfunction utcweek(d) {\n    return utcWeekNum(new Date(d));\n}\nfunction utcDayOfYear(d) {\n    const y = Date.UTC(d.getUTCFullYear(), 0, 1);\n    return (0, _d3Time.utcDay).count(y - 1, d);\n}\nfunction utcWeekNum(d) {\n    const y = Date.UTC(d.getUTCFullYear(), 0, 1);\n    return (0, _d3Time.utcWeek).count(y - 1, d);\n}\nfunction utcFirst(y) {\n    t0.setTime(Date.UTC(y, 0, 1));\n    return t0.getUTCDay();\n}\nfunction utcDate(y, m, d, H, M, S, L) {\n    if (0 <= y && y < 100) {\n        const date = new Date(Date.UTC(-1, m, d, H, M, S, L));\n        date.setUTCFullYear(d.y);\n        return date;\n    }\n    return new Date(Date.UTC(y, m, d, H, M, S, L));\n}\nfunction floor(units, step, get, inv, newDate) {\n    const s = step || 1, b = (0, _vegaUtil.peek)(units), _ = (unit, p, key)=>{\n        key = key || unit;\n        return getUnit(get[key], inv[key], unit === b && s, p);\n    };\n    const t = new Date(), u = (0, _vegaUtil.toSet)(units), y = u[YEAR] ? _(YEAR) : (0, _vegaUtil.constant)(2012), m = u[MONTH] ? _(MONTH) : u[QUARTER] ? _(QUARTER) : (0, _vegaUtil.zero), d = u[WEEK] && u[DAY] ? _(DAY, 1, WEEK + DAY) : u[WEEK] ? _(WEEK, 1) : u[DAY] ? _(DAY, 1) : u[DATE] ? _(DATE, 1) : u[DAYOFYEAR] ? _(DAYOFYEAR, 1) : (0, _vegaUtil.one), H = u[HOURS] ? _(HOURS) : (0, _vegaUtil.zero), M = u[MINUTES] ? _(MINUTES) : (0, _vegaUtil.zero), S = u[SECONDS] ? _(SECONDS) : (0, _vegaUtil.zero), L = u[MILLISECONDS] ? _(MILLISECONDS) : (0, _vegaUtil.zero);\n    return function(v) {\n        t.setTime(+v);\n        const year = y(t);\n        return newDate(year, m(t), d(t, year), H(t), M(t), S(t), L(t));\n    };\n}\nfunction getUnit(f, inv, step, phase) {\n    const u = step <= 1 ? f : phase ? (d, y)=>phase + step * Math.floor((f(d, y) - phase) / step) : (d, y)=>step * Math.floor(f(d, y) / step);\n    return inv ? (d, y)=>inv(u(d, y), y) : u;\n} // returns the day of the year based on week number, day of week,\n// and the day of the week for the first day of the year\nfunction weekday(week1, day, firstDay) {\n    return day + week1 * 7 - (firstDay + 6) % 7;\n} // -- LOCAL TIME --\nconst localGet = {\n    [YEAR]: (d)=>d.getFullYear(),\n    [QUARTER]: (d)=>Math.floor(d.getMonth() / 3),\n    [MONTH]: (d)=>d.getMonth(),\n    [DATE]: (d)=>d.getDate(),\n    [HOURS]: (d)=>d.getHours(),\n    [MINUTES]: (d)=>d.getMinutes(),\n    [SECONDS]: (d)=>d.getSeconds(),\n    [MILLISECONDS]: (d)=>d.getMilliseconds(),\n    [DAYOFYEAR]: (d)=>localDayOfYear(d),\n    [WEEK]: (d)=>localWeekNum(d),\n    [WEEK + DAY]: (d, y)=>weekday(localWeekNum(d), d.getDay(), localFirst(y)),\n    [DAY]: (d, y)=>weekday(1, d.getDay(), localFirst(y))\n};\nconst localInv = {\n    [QUARTER]: (q)=>3 * q,\n    [WEEK]: (w, y)=>weekday(w, 0, localFirst(y))\n};\nfunction timeFloor(units, step) {\n    return floor(units, step || 1, localGet, localInv, localDate);\n} // -- UTC TIME --\nconst utcGet = {\n    [YEAR]: (d)=>d.getUTCFullYear(),\n    [QUARTER]: (d)=>Math.floor(d.getUTCMonth() / 3),\n    [MONTH]: (d)=>d.getUTCMonth(),\n    [DATE]: (d)=>d.getUTCDate(),\n    [HOURS]: (d)=>d.getUTCHours(),\n    [MINUTES]: (d)=>d.getUTCMinutes(),\n    [SECONDS]: (d)=>d.getUTCSeconds(),\n    [MILLISECONDS]: (d)=>d.getUTCMilliseconds(),\n    [DAYOFYEAR]: (d)=>utcDayOfYear(d),\n    [WEEK]: (d)=>utcWeekNum(d),\n    [DAY]: (d, y)=>weekday(1, d.getUTCDay(), utcFirst(y)),\n    [WEEK + DAY]: (d, y)=>weekday(utcWeekNum(d), d.getUTCDay(), utcFirst(y))\n};\nconst utcInv = {\n    [QUARTER]: (q)=>3 * q,\n    [WEEK]: (w, y)=>weekday(w, 0, utcFirst(y))\n};\nfunction utcFloor(units, step) {\n    return floor(units, step || 1, utcGet, utcInv, utcDate);\n}\nconst timeIntervals = {\n    [YEAR]: (0, _d3Time.timeYear),\n    [QUARTER]: (0, _d3Time.timeMonth).every(3),\n    [MONTH]: (0, _d3Time.timeMonth),\n    [WEEK]: (0, _d3Time.timeWeek),\n    [DATE]: (0, _d3Time.timeDay),\n    [DAY]: (0, _d3Time.timeDay),\n    [DAYOFYEAR]: (0, _d3Time.timeDay),\n    [HOURS]: (0, _d3Time.timeHour),\n    [MINUTES]: (0, _d3Time.timeMinute),\n    [SECONDS]: (0, _d3Time.timeSecond),\n    [MILLISECONDS]: (0, _d3Time.timeMillisecond)\n};\nconst utcIntervals = {\n    [YEAR]: (0, _d3Time.utcYear),\n    [QUARTER]: (0, _d3Time.utcMonth).every(3),\n    [MONTH]: (0, _d3Time.utcMonth),\n    [WEEK]: (0, _d3Time.utcWeek),\n    [DATE]: (0, _d3Time.utcDay),\n    [DAY]: (0, _d3Time.utcDay),\n    [DAYOFYEAR]: (0, _d3Time.utcDay),\n    [HOURS]: (0, _d3Time.utcHour),\n    [MINUTES]: (0, _d3Time.utcMinute),\n    [SECONDS]: (0, _d3Time.utcSecond),\n    [MILLISECONDS]: (0, _d3Time.utcMillisecond)\n};\nfunction timeInterval(unit) {\n    return timeIntervals[unit];\n}\nfunction utcInterval(unit) {\n    return utcIntervals[unit];\n}\nfunction offset(ival, date, step) {\n    return ival ? ival.offset(date, step) : undefined;\n}\nfunction timeOffset(unit, date, step) {\n    return offset(timeInterval(unit), date, step);\n}\nfunction utcOffset(unit, date, step) {\n    return offset(utcInterval(unit), date, step);\n}\nfunction sequence(ival, start, stop, step) {\n    return ival ? ival.range(start, stop, step) : undefined;\n}\nfunction timeSequence(unit, start, stop, step) {\n    return sequence(timeInterval(unit), start, stop, step);\n}\nfunction utcSequence(unit, start, stop, step) {\n    return sequence(utcInterval(unit), start, stop, step);\n}\nconst durationSecond = 1000, durationMinute = durationSecond * 60, durationHour = durationMinute * 60, durationDay = durationHour * 24, durationWeek = durationDay * 7, durationMonth = durationDay * 30, durationYear = durationDay * 365;\nconst Milli = [\n    YEAR,\n    MONTH,\n    DATE,\n    HOURS,\n    MINUTES,\n    SECONDS,\n    MILLISECONDS\n], Seconds = Milli.slice(0, -1), Minutes = Seconds.slice(0, -1), Hours = Minutes.slice(0, -1), Day = Hours.slice(0, -1), Week = [\n    YEAR,\n    WEEK\n], Month = [\n    YEAR,\n    MONTH\n], Year = [\n    YEAR\n];\nconst intervals = [\n    [\n        Seconds,\n        1,\n        durationSecond\n    ],\n    [\n        Seconds,\n        5,\n        5 * durationSecond\n    ],\n    [\n        Seconds,\n        15,\n        15 * durationSecond\n    ],\n    [\n        Seconds,\n        30,\n        30 * durationSecond\n    ],\n    [\n        Minutes,\n        1,\n        durationMinute\n    ],\n    [\n        Minutes,\n        5,\n        5 * durationMinute\n    ],\n    [\n        Minutes,\n        15,\n        15 * durationMinute\n    ],\n    [\n        Minutes,\n        30,\n        30 * durationMinute\n    ],\n    [\n        Hours,\n        1,\n        durationHour\n    ],\n    [\n        Hours,\n        3,\n        3 * durationHour\n    ],\n    [\n        Hours,\n        6,\n        6 * durationHour\n    ],\n    [\n        Hours,\n        12,\n        12 * durationHour\n    ],\n    [\n        Day,\n        1,\n        durationDay\n    ],\n    [\n        Week,\n        1,\n        durationWeek\n    ],\n    [\n        Month,\n        1,\n        durationMonth\n    ],\n    [\n        Month,\n        3,\n        3 * durationMonth\n    ],\n    [\n        Year,\n        1,\n        durationYear\n    ]\n];\nfunction bin(opt) {\n    const ext = opt.extent, max = opt.maxbins || 40, target = Math.abs((0, _vegaUtil.span)(ext)) / max;\n    let i1 = (0, _d3Array.bisector)((i)=>i[2]).right(intervals, target), units, step;\n    if (i1 === intervals.length) units = Year, step = (0, _d3Array.tickStep)(ext[0] / durationYear, ext[1] / durationYear, max);\n    else if (i1) {\n        i1 = intervals[target / intervals[i1 - 1][2] < intervals[i1][2] / target ? i1 - 1 : i1];\n        units = i1[0];\n        step = i1[1];\n    } else {\n        units = Milli;\n        step = Math.max((0, _d3Array.tickStep)(ext[0], ext[1], max), 1);\n    }\n    return {\n        units,\n        step\n    };\n}\n\n},{\"vega-util\":\"dPFAY\",\"d3-time\":\"l42HK\",\"d3-array\":\"8JMcC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l42HK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"timeInterval\", ()=>(0, _intervalJsDefault.default));\nparcelHelpers.export(exports, \"timeMillisecond\", ()=>(0, _millisecondJsDefault.default));\nparcelHelpers.export(exports, \"timeMilliseconds\", ()=>(0, _millisecondJs.milliseconds));\nparcelHelpers.export(exports, \"utcMillisecond\", ()=>(0, _millisecondJsDefault.default));\nparcelHelpers.export(exports, \"utcMilliseconds\", ()=>(0, _millisecondJs.milliseconds));\nparcelHelpers.export(exports, \"timeSecond\", ()=>(0, _secondJsDefault.default));\nparcelHelpers.export(exports, \"timeSeconds\", ()=>(0, _secondJs.seconds));\nparcelHelpers.export(exports, \"utcSecond\", ()=>(0, _secondJsDefault.default));\nparcelHelpers.export(exports, \"utcSeconds\", ()=>(0, _secondJs.seconds));\nparcelHelpers.export(exports, \"timeMinute\", ()=>(0, _minuteJsDefault.default));\nparcelHelpers.export(exports, \"timeMinutes\", ()=>(0, _minuteJs.minutes));\nparcelHelpers.export(exports, \"timeHour\", ()=>(0, _hourJsDefault.default));\nparcelHelpers.export(exports, \"timeHours\", ()=>(0, _hourJs.hours));\nparcelHelpers.export(exports, \"timeDay\", ()=>(0, _dayJsDefault.default));\nparcelHelpers.export(exports, \"timeDays\", ()=>(0, _dayJs.days));\nparcelHelpers.export(exports, \"timeWeek\", ()=>(0, _weekJs.sunday));\nparcelHelpers.export(exports, \"timeWeeks\", ()=>(0, _weekJs.sundays));\nparcelHelpers.export(exports, \"timeSunday\", ()=>(0, _weekJs.sunday));\nparcelHelpers.export(exports, \"timeSundays\", ()=>(0, _weekJs.sundays));\nparcelHelpers.export(exports, \"timeMonday\", ()=>(0, _weekJs.monday));\nparcelHelpers.export(exports, \"timeMondays\", ()=>(0, _weekJs.mondays));\nparcelHelpers.export(exports, \"timeTuesday\", ()=>(0, _weekJs.tuesday));\nparcelHelpers.export(exports, \"timeTuesdays\", ()=>(0, _weekJs.tuesdays));\nparcelHelpers.export(exports, \"timeWednesday\", ()=>(0, _weekJs.wednesday));\nparcelHelpers.export(exports, \"timeWednesdays\", ()=>(0, _weekJs.wednesdays));\nparcelHelpers.export(exports, \"timeThursday\", ()=>(0, _weekJs.thursday));\nparcelHelpers.export(exports, \"timeThursdays\", ()=>(0, _weekJs.thursdays));\nparcelHelpers.export(exports, \"timeFriday\", ()=>(0, _weekJs.friday));\nparcelHelpers.export(exports, \"timeFridays\", ()=>(0, _weekJs.fridays));\nparcelHelpers.export(exports, \"timeSaturday\", ()=>(0, _weekJs.saturday));\nparcelHelpers.export(exports, \"timeSaturdays\", ()=>(0, _weekJs.saturdays));\nparcelHelpers.export(exports, \"timeMonth\", ()=>(0, _monthJsDefault.default));\nparcelHelpers.export(exports, \"timeMonths\", ()=>(0, _monthJs.months));\nparcelHelpers.export(exports, \"timeYear\", ()=>(0, _yearJsDefault.default));\nparcelHelpers.export(exports, \"timeYears\", ()=>(0, _yearJs.years));\nparcelHelpers.export(exports, \"utcMinute\", ()=>(0, _utcMinuteJsDefault.default));\nparcelHelpers.export(exports, \"utcMinutes\", ()=>(0, _utcMinuteJs.utcMinutes));\nparcelHelpers.export(exports, \"utcHour\", ()=>(0, _utcHourJsDefault.default));\nparcelHelpers.export(exports, \"utcHours\", ()=>(0, _utcHourJs.utcHours));\nparcelHelpers.export(exports, \"utcDay\", ()=>(0, _utcDayJsDefault.default));\nparcelHelpers.export(exports, \"utcDays\", ()=>(0, _utcDayJs.utcDays));\nparcelHelpers.export(exports, \"utcWeek\", ()=>(0, _utcWeekJs.utcSunday));\nparcelHelpers.export(exports, \"utcWeeks\", ()=>(0, _utcWeekJs.utcSundays));\nparcelHelpers.export(exports, \"utcSunday\", ()=>(0, _utcWeekJs.utcSunday));\nparcelHelpers.export(exports, \"utcSundays\", ()=>(0, _utcWeekJs.utcSundays));\nparcelHelpers.export(exports, \"utcMonday\", ()=>(0, _utcWeekJs.utcMonday));\nparcelHelpers.export(exports, \"utcMondays\", ()=>(0, _utcWeekJs.utcMondays));\nparcelHelpers.export(exports, \"utcTuesday\", ()=>(0, _utcWeekJs.utcTuesday));\nparcelHelpers.export(exports, \"utcTuesdays\", ()=>(0, _utcWeekJs.utcTuesdays));\nparcelHelpers.export(exports, \"utcWednesday\", ()=>(0, _utcWeekJs.utcWednesday));\nparcelHelpers.export(exports, \"utcWednesdays\", ()=>(0, _utcWeekJs.utcWednesdays));\nparcelHelpers.export(exports, \"utcThursday\", ()=>(0, _utcWeekJs.utcThursday));\nparcelHelpers.export(exports, \"utcThursdays\", ()=>(0, _utcWeekJs.utcThursdays));\nparcelHelpers.export(exports, \"utcFriday\", ()=>(0, _utcWeekJs.utcFriday));\nparcelHelpers.export(exports, \"utcFridays\", ()=>(0, _utcWeekJs.utcFridays));\nparcelHelpers.export(exports, \"utcSaturday\", ()=>(0, _utcWeekJs.utcSaturday));\nparcelHelpers.export(exports, \"utcSaturdays\", ()=>(0, _utcWeekJs.utcSaturdays));\nparcelHelpers.export(exports, \"utcMonth\", ()=>(0, _utcMonthJsDefault.default));\nparcelHelpers.export(exports, \"utcMonths\", ()=>(0, _utcMonthJs.utcMonths));\nparcelHelpers.export(exports, \"utcYear\", ()=>(0, _utcYearJsDefault.default));\nparcelHelpers.export(exports, \"utcYears\", ()=>(0, _utcYearJs.utcYears));\nparcelHelpers.export(exports, \"utcTicks\", ()=>(0, _ticksJs.utcTicks));\nparcelHelpers.export(exports, \"utcTickInterval\", ()=>(0, _ticksJs.utcTickInterval));\nparcelHelpers.export(exports, \"timeTicks\", ()=>(0, _ticksJs.timeTicks));\nparcelHelpers.export(exports, \"timeTickInterval\", ()=>(0, _ticksJs.timeTickInterval));\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _millisecondJs = require(\"./millisecond.js\");\nvar _millisecondJsDefault = parcelHelpers.interopDefault(_millisecondJs);\nvar _secondJs = require(\"./second.js\");\nvar _secondJsDefault = parcelHelpers.interopDefault(_secondJs);\nvar _minuteJs = require(\"./minute.js\");\nvar _minuteJsDefault = parcelHelpers.interopDefault(_minuteJs);\nvar _hourJs = require(\"./hour.js\");\nvar _hourJsDefault = parcelHelpers.interopDefault(_hourJs);\nvar _dayJs = require(\"./day.js\");\nvar _dayJsDefault = parcelHelpers.interopDefault(_dayJs);\nvar _weekJs = require(\"./week.js\");\nvar _monthJs = require(\"./month.js\");\nvar _monthJsDefault = parcelHelpers.interopDefault(_monthJs);\nvar _yearJs = require(\"./year.js\");\nvar _yearJsDefault = parcelHelpers.interopDefault(_yearJs);\nvar _utcMinuteJs = require(\"./utcMinute.js\");\nvar _utcMinuteJsDefault = parcelHelpers.interopDefault(_utcMinuteJs);\nvar _utcHourJs = require(\"./utcHour.js\");\nvar _utcHourJsDefault = parcelHelpers.interopDefault(_utcHourJs);\nvar _utcDayJs = require(\"./utcDay.js\");\nvar _utcDayJsDefault = parcelHelpers.interopDefault(_utcDayJs);\nvar _utcWeekJs = require(\"./utcWeek.js\");\nvar _utcMonthJs = require(\"./utcMonth.js\");\nvar _utcMonthJsDefault = parcelHelpers.interopDefault(_utcMonthJs);\nvar _utcYearJs = require(\"./utcYear.js\");\nvar _utcYearJsDefault = parcelHelpers.interopDefault(_utcYearJs);\nvar _ticksJs = require(\"./ticks.js\");\n\n},{\"./interval.js\":\"3VzLu\",\"./millisecond.js\":\"6qs8Q\",\"./second.js\":\"6ouMu\",\"./minute.js\":\"67yvc\",\"./hour.js\":\"SzQrx\",\"./day.js\":\"b79lL\",\"./week.js\":\"8oOHf\",\"./month.js\":\"813tK\",\"./year.js\":\"k3Fk7\",\"./utcMinute.js\":\"85vUK\",\"./utcHour.js\":\"aNZgt\",\"./utcDay.js\":\"iPMOW\",\"./utcWeek.js\":\"9uL5r\",\"./utcMonth.js\":\"y1Cb5\",\"./utcYear.js\":\"jzkOf\",\"./ticks.js\":\"kGCVx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3VzLu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar t0 = new Date, t1 = new Date;\nfunction newInterval(floori, offseti, count, field) {\n    function interval(date) {\n        return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n    }\n    interval.floor = function(date) {\n        return floori(date = new Date(+date)), date;\n    };\n    interval.ceil = function(date) {\n        return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n    };\n    interval.round = function(date) {\n        var d0 = interval(date), d1 = interval.ceil(date);\n        return date - d0 < d1 - date ? d0 : d1;\n    };\n    interval.offset = function(date, step) {\n        return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n    };\n    interval.range = function(start, stop, step) {\n        var range = [], previous;\n        start = interval.ceil(start);\n        step = step == null ? 1 : Math.floor(step);\n        if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n        do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n        while (previous < start && start < stop);\n        return range;\n    };\n    interval.filter = function(test) {\n        return newInterval(function(date) {\n            if (date >= date) while(floori(date), !test(date))date.setTime(date - 1);\n        }, function(date, step) {\n            if (date >= date) {\n                if (step < 0) while(++step <= 0){\n                    while(offseti(date, -1), !test(date)); // eslint-disable-line no-empty\n                }\n                else while(--step >= 0){\n                    while(offseti(date, 1), !test(date)); // eslint-disable-line no-empty\n                }\n            }\n        });\n    };\n    if (count) {\n        interval.count = function(start, end) {\n            t0.setTime(+start), t1.setTime(+end);\n            floori(t0), floori(t1);\n            return Math.floor(count(t0, t1));\n        };\n        interval.every = function(step) {\n            step = Math.floor(step);\n            return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval : interval.filter(field ? function(d) {\n                return field(d) % step === 0;\n            } : function(d) {\n                return interval.count(0, d) % step === 0;\n            });\n        };\n    }\n    return interval;\n}\nexports.default = newInterval;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6qs8Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"milliseconds\", ()=>milliseconds);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar millisecond = (0, _intervalJsDefault.default)(function() {\n// noop\n}, function(date, step) {\n    date.setTime(+date + step);\n}, function(start, end) {\n    return end - start;\n});\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n    k = Math.floor(k);\n    if (!isFinite(k) || !(k > 0)) return null;\n    if (!(k > 1)) return millisecond;\n    return (0, _intervalJsDefault.default)(function(date) {\n        date.setTime(Math.floor(date / k) * k);\n    }, function(date, step) {\n        date.setTime(+date + step * k);\n    }, function(start, end) {\n        return (end - start) / k;\n    });\n};\nexports.default = millisecond;\nvar milliseconds = millisecond.range;\n\n},{\"./interval.js\":\"3VzLu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6ouMu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"seconds\", ()=>seconds);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar second = (0, _intervalJsDefault.default)(function(date) {\n    date.setTime(date - date.getMilliseconds());\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationSecond));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationSecond);\n}, function(date) {\n    return date.getUTCSeconds();\n});\nexports.default = second;\nvar seconds = second.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iVdSe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"durationSecond\", ()=>durationSecond);\nparcelHelpers.export(exports, \"durationMinute\", ()=>durationMinute);\nparcelHelpers.export(exports, \"durationHour\", ()=>durationHour);\nparcelHelpers.export(exports, \"durationDay\", ()=>durationDay);\nparcelHelpers.export(exports, \"durationWeek\", ()=>durationWeek);\nparcelHelpers.export(exports, \"durationMonth\", ()=>durationMonth);\nparcelHelpers.export(exports, \"durationYear\", ()=>durationYear);\nconst durationSecond = 1000;\nconst durationMinute = durationSecond * 60;\nconst durationHour = durationMinute * 60;\nconst durationDay = durationHour * 24;\nconst durationWeek = durationDay * 7;\nconst durationMonth = durationDay * 30;\nconst durationYear = durationDay * 365;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"67yvc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"minutes\", ()=>minutes);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar minute = (0, _intervalJsDefault.default)(function(date) {\n    date.setTime(date - date.getMilliseconds() - date.getSeconds() * (0, _durationJs.durationSecond));\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationMinute));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationMinute);\n}, function(date) {\n    return date.getMinutes();\n});\nexports.default = minute;\nvar minutes = minute.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"SzQrx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hours\", ()=>hours);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar hour = (0, _intervalJsDefault.default)(function(date) {\n    date.setTime(date - date.getMilliseconds() - date.getSeconds() * (0, _durationJs.durationSecond) - date.getMinutes() * (0, _durationJs.durationMinute));\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationHour));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationHour);\n}, function(date) {\n    return date.getHours();\n});\nexports.default = hour;\nvar hours = hour.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b79lL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"days\", ()=>days);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar day = (0, _intervalJsDefault.default)((date)=>date.setHours(0, 0, 0, 0), (date, step)=>date.setDate(date.getDate() + step), (start, end)=>(end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * (0, _durationJs.durationMinute)) / (0, _durationJs.durationDay), (date)=>date.getDate() - 1);\nexports.default = day;\nvar days = day.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8oOHf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"sunday\", ()=>sunday);\nparcelHelpers.export(exports, \"monday\", ()=>monday);\nparcelHelpers.export(exports, \"tuesday\", ()=>tuesday);\nparcelHelpers.export(exports, \"wednesday\", ()=>wednesday);\nparcelHelpers.export(exports, \"thursday\", ()=>thursday);\nparcelHelpers.export(exports, \"friday\", ()=>friday);\nparcelHelpers.export(exports, \"saturday\", ()=>saturday);\nparcelHelpers.export(exports, \"sundays\", ()=>sundays);\nparcelHelpers.export(exports, \"mondays\", ()=>mondays);\nparcelHelpers.export(exports, \"tuesdays\", ()=>tuesdays);\nparcelHelpers.export(exports, \"wednesdays\", ()=>wednesdays);\nparcelHelpers.export(exports, \"thursdays\", ()=>thursdays);\nparcelHelpers.export(exports, \"fridays\", ()=>fridays);\nparcelHelpers.export(exports, \"saturdays\", ()=>saturdays);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nfunction weekday(i) {\n    return (0, _intervalJsDefault.default)(function(date) {\n        date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n        date.setHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setDate(date.getDate() + step * 7);\n    }, function(start, end) {\n        return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * (0, _durationJs.durationMinute)) / (0, _durationJs.durationWeek);\n    });\n}\nvar sunday = weekday(0);\nvar monday = weekday(1);\nvar tuesday = weekday(2);\nvar wednesday = weekday(3);\nvar thursday = weekday(4);\nvar friday = weekday(5);\nvar saturday = weekday(6);\nvar sundays = sunday.range;\nvar mondays = monday.range;\nvar tuesdays = tuesday.range;\nvar wednesdays = wednesday.range;\nvar thursdays = thursday.range;\nvar fridays = friday.range;\nvar saturdays = saturday.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"813tK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"months\", ()=>months);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar month = (0, _intervalJsDefault.default)(function(date) {\n    date.setDate(1);\n    date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n    return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n    return date.getMonth();\n});\nexports.default = month;\nvar months = month.range;\n\n},{\"./interval.js\":\"3VzLu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k3Fk7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"years\", ()=>years);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar year = (0, _intervalJsDefault.default)(function(date) {\n    date.setMonth(0, 1);\n    date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n    return end.getFullYear() - start.getFullYear();\n}, function(date) {\n    return date.getFullYear();\n});\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : (0, _intervalJsDefault.default)(function(date) {\n        date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n        date.setMonth(0, 1);\n        date.setHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setFullYear(date.getFullYear() + step * k);\n    });\n};\nexports.default = year;\nvar years = year.range;\n\n},{\"./interval.js\":\"3VzLu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"85vUK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcMinutes\", ()=>utcMinutes);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar utcMinute = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCSeconds(0, 0);\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationMinute));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationMinute);\n}, function(date) {\n    return date.getUTCMinutes();\n});\nexports.default = utcMinute;\nvar utcMinutes = utcMinute.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aNZgt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcHours\", ()=>utcHours);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar utcHour = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationHour));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationHour);\n}, function(date) {\n    return date.getUTCHours();\n});\nexports.default = utcHour;\nvar utcHours = utcHour.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iPMOW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcDays\", ()=>utcDays);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar utcDay = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationDay);\n}, function(date) {\n    return date.getUTCDate() - 1;\n});\nexports.default = utcDay;\nvar utcDays = utcDay.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9uL5r\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcSunday\", ()=>utcSunday);\nparcelHelpers.export(exports, \"utcMonday\", ()=>utcMonday);\nparcelHelpers.export(exports, \"utcTuesday\", ()=>utcTuesday);\nparcelHelpers.export(exports, \"utcWednesday\", ()=>utcWednesday);\nparcelHelpers.export(exports, \"utcThursday\", ()=>utcThursday);\nparcelHelpers.export(exports, \"utcFriday\", ()=>utcFriday);\nparcelHelpers.export(exports, \"utcSaturday\", ()=>utcSaturday);\nparcelHelpers.export(exports, \"utcSundays\", ()=>utcSundays);\nparcelHelpers.export(exports, \"utcMondays\", ()=>utcMondays);\nparcelHelpers.export(exports, \"utcTuesdays\", ()=>utcTuesdays);\nparcelHelpers.export(exports, \"utcWednesdays\", ()=>utcWednesdays);\nparcelHelpers.export(exports, \"utcThursdays\", ()=>utcThursdays);\nparcelHelpers.export(exports, \"utcFridays\", ()=>utcFridays);\nparcelHelpers.export(exports, \"utcSaturdays\", ()=>utcSaturdays);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nfunction utcWeekday(i) {\n    return (0, _intervalJsDefault.default)(function(date) {\n        date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n        date.setUTCHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setUTCDate(date.getUTCDate() + step * 7);\n    }, function(start, end) {\n        return (end - start) / (0, _durationJs.durationWeek);\n    });\n}\nvar utcSunday = utcWeekday(0);\nvar utcMonday = utcWeekday(1);\nvar utcTuesday = utcWeekday(2);\nvar utcWednesday = utcWeekday(3);\nvar utcThursday = utcWeekday(4);\nvar utcFriday = utcWeekday(5);\nvar utcSaturday = utcWeekday(6);\nvar utcSundays = utcSunday.range;\nvar utcMondays = utcMonday.range;\nvar utcTuesdays = utcTuesday.range;\nvar utcWednesdays = utcWednesday.range;\nvar utcThursdays = utcThursday.range;\nvar utcFridays = utcFriday.range;\nvar utcSaturdays = utcSaturday.range;\n\n},{\"./interval.js\":\"3VzLu\",\"./duration.js\":\"iVdSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"y1Cb5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcMonths\", ()=>utcMonths);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar utcMonth = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCDate(1);\n    date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n    return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n    return date.getUTCMonth();\n});\nexports.default = utcMonth;\nvar utcMonths = utcMonth.range;\n\n},{\"./interval.js\":\"3VzLu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jzkOf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcYears\", ()=>utcYears);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar utcYear = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCMonth(0, 1);\n    date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n    return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n    return date.getUTCFullYear();\n});\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : (0, _intervalJsDefault.default)(function(date) {\n        date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n        date.setUTCMonth(0, 1);\n        date.setUTCHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setUTCFullYear(date.getUTCFullYear() + step * k);\n    });\n};\nexports.default = utcYear;\nvar utcYears = utcYear.range;\n\n},{\"./interval.js\":\"3VzLu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kGCVx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcTicks\", ()=>utcTicks);\nparcelHelpers.export(exports, \"utcTickInterval\", ()=>utcTickInterval);\nparcelHelpers.export(exports, \"timeTicks\", ()=>timeTicks);\nparcelHelpers.export(exports, \"timeTickInterval\", ()=>timeTickInterval);\nvar _d3Array = require(\"d3-array\");\nvar _durationJs = require(\"./duration.js\");\nvar _millisecondJs = require(\"./millisecond.js\");\nvar _millisecondJsDefault = parcelHelpers.interopDefault(_millisecondJs);\nvar _secondJs = require(\"./second.js\");\nvar _secondJsDefault = parcelHelpers.interopDefault(_secondJs);\nvar _minuteJs = require(\"./minute.js\");\nvar _minuteJsDefault = parcelHelpers.interopDefault(_minuteJs);\nvar _hourJs = require(\"./hour.js\");\nvar _hourJsDefault = parcelHelpers.interopDefault(_hourJs);\nvar _dayJs = require(\"./day.js\");\nvar _dayJsDefault = parcelHelpers.interopDefault(_dayJs);\nvar _weekJs = require(\"./week.js\");\nvar _monthJs = require(\"./month.js\");\nvar _monthJsDefault = parcelHelpers.interopDefault(_monthJs);\nvar _yearJs = require(\"./year.js\");\nvar _yearJsDefault = parcelHelpers.interopDefault(_yearJs);\nvar _utcMinuteJs = require(\"./utcMinute.js\");\nvar _utcMinuteJsDefault = parcelHelpers.interopDefault(_utcMinuteJs);\nvar _utcHourJs = require(\"./utcHour.js\");\nvar _utcHourJsDefault = parcelHelpers.interopDefault(_utcHourJs);\nvar _utcDayJs = require(\"./utcDay.js\");\nvar _utcDayJsDefault = parcelHelpers.interopDefault(_utcDayJs);\nvar _utcWeekJs = require(\"./utcWeek.js\");\nvar _utcMonthJs = require(\"./utcMonth.js\");\nvar _utcMonthJsDefault = parcelHelpers.interopDefault(_utcMonthJs);\nvar _utcYearJs = require(\"./utcYear.js\");\nvar _utcYearJsDefault = parcelHelpers.interopDefault(_utcYearJs);\nfunction ticker(year, month, week, day, hour, minute) {\n    const tickIntervals = [\n        [\n            (0, _secondJsDefault.default),\n            1,\n            (0, _durationJs.durationSecond)\n        ],\n        [\n            (0, _secondJsDefault.default),\n            5,\n            5 * (0, _durationJs.durationSecond)\n        ],\n        [\n            (0, _secondJsDefault.default),\n            15,\n            15 * (0, _durationJs.durationSecond)\n        ],\n        [\n            (0, _secondJsDefault.default),\n            30,\n            30 * (0, _durationJs.durationSecond)\n        ],\n        [\n            minute,\n            1,\n            (0, _durationJs.durationMinute)\n        ],\n        [\n            minute,\n            5,\n            5 * (0, _durationJs.durationMinute)\n        ],\n        [\n            minute,\n            15,\n            15 * (0, _durationJs.durationMinute)\n        ],\n        [\n            minute,\n            30,\n            30 * (0, _durationJs.durationMinute)\n        ],\n        [\n            hour,\n            1,\n            (0, _durationJs.durationHour)\n        ],\n        [\n            hour,\n            3,\n            3 * (0, _durationJs.durationHour)\n        ],\n        [\n            hour,\n            6,\n            6 * (0, _durationJs.durationHour)\n        ],\n        [\n            hour,\n            12,\n            12 * (0, _durationJs.durationHour)\n        ],\n        [\n            day,\n            1,\n            (0, _durationJs.durationDay)\n        ],\n        [\n            day,\n            2,\n            2 * (0, _durationJs.durationDay)\n        ],\n        [\n            week,\n            1,\n            (0, _durationJs.durationWeek)\n        ],\n        [\n            month,\n            1,\n            (0, _durationJs.durationMonth)\n        ],\n        [\n            month,\n            3,\n            3 * (0, _durationJs.durationMonth)\n        ],\n        [\n            year,\n            1,\n            (0, _durationJs.durationYear)\n        ]\n    ];\n    function ticks1(start, stop, count) {\n        const reverse = stop < start;\n        if (reverse) [start, stop] = [\n            stop,\n            start\n        ];\n        const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n        const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n        return reverse ? ticks.reverse() : ticks;\n    }\n    function tickInterval(start, stop, count) {\n        const target = Math.abs(stop - start) / count;\n        const i = (0, _d3Array.bisector)(([, , step])=>step).right(tickIntervals, target);\n        if (i === tickIntervals.length) return year.every((0, _d3Array.tickStep)(start / (0, _durationJs.durationYear), stop / (0, _durationJs.durationYear), count));\n        if (i === 0) return (0, _millisecondJsDefault.default).every(Math.max((0, _d3Array.tickStep)(start, stop, count), 1));\n        const [t, step1] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n        return t.every(step1);\n    }\n    return [\n        ticks1,\n        tickInterval\n    ];\n}\nconst [utcTicks, utcTickInterval] = ticker((0, _utcYearJsDefault.default), (0, _utcMonthJsDefault.default), (0, _utcWeekJs.utcSunday), (0, _utcDayJsDefault.default), (0, _utcHourJsDefault.default), (0, _utcMinuteJsDefault.default));\nconst [timeTicks, timeTickInterval] = ticker((0, _yearJsDefault.default), (0, _monthJsDefault.default), (0, _weekJs.sunday), (0, _dayJsDefault.default), (0, _hourJsDefault.default), (0, _minuteJsDefault.default));\n\n},{\"d3-array\":\"8JMcC\",\"./duration.js\":\"iVdSe\",\"./millisecond.js\":\"6qs8Q\",\"./second.js\":\"6ouMu\",\"./minute.js\":\"67yvc\",\"./hour.js\":\"SzQrx\",\"./day.js\":\"b79lL\",\"./week.js\":\"8oOHf\",\"./month.js\":\"813tK\",\"./year.js\":\"k3Fk7\",\"./utcMinute.js\":\"85vUK\",\"./utcHour.js\":\"aNZgt\",\"./utcDay.js\":\"iPMOW\",\"./utcWeek.js\":\"9uL5r\",\"./utcMonth.js\":\"y1Cb5\",\"./utcYear.js\":\"jzkOf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gQBqt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"timeFormatDefaultLocale\", ()=>(0, _defaultLocaleJsDefault.default));\nparcelHelpers.export(exports, \"timeFormat\", ()=>(0, _defaultLocaleJs.timeFormat));\nparcelHelpers.export(exports, \"timeParse\", ()=>(0, _defaultLocaleJs.timeParse));\nparcelHelpers.export(exports, \"utcFormat\", ()=>(0, _defaultLocaleJs.utcFormat));\nparcelHelpers.export(exports, \"utcParse\", ()=>(0, _defaultLocaleJs.utcParse));\nparcelHelpers.export(exports, \"timeFormatLocale\", ()=>(0, _localeJsDefault.default));\nparcelHelpers.export(exports, \"isoFormat\", ()=>(0, _isoFormatJsDefault.default));\nparcelHelpers.export(exports, \"isoParse\", ()=>(0, _isoParseJsDefault.default));\nvar _defaultLocaleJs = require(\"./defaultLocale.js\");\nvar _defaultLocaleJsDefault = parcelHelpers.interopDefault(_defaultLocaleJs);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar _isoFormatJs = require(\"./isoFormat.js\");\nvar _isoFormatJsDefault = parcelHelpers.interopDefault(_isoFormatJs);\nvar _isoParseJs = require(\"./isoParse.js\");\nvar _isoParseJsDefault = parcelHelpers.interopDefault(_isoParseJs);\n\n},{\"./defaultLocale.js\":\"04Uh4\",\"./locale.js\":\"bnu2v\",\"./isoFormat.js\":false,\"./isoParse.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"04Uh4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"timeFormat\", ()=>timeFormat);\nparcelHelpers.export(exports, \"timeParse\", ()=>timeParse);\nparcelHelpers.export(exports, \"utcFormat\", ()=>utcFormat);\nparcelHelpers.export(exports, \"utcParse\", ()=>utcParse);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar locale;\nvar timeFormat;\nvar timeParse;\nvar utcFormat;\nvar utcParse;\ndefaultLocale({\n    dateTime: \"%x, %X\",\n    date: \"%-m/%-d/%Y\",\n    time: \"%-I:%M:%S %p\",\n    periods: [\n        \"AM\",\n        \"PM\"\n    ],\n    days: [\n        \"Sunday\",\n        \"Monday\",\n        \"Tuesday\",\n        \"Wednesday\",\n        \"Thursday\",\n        \"Friday\",\n        \"Saturday\"\n    ],\n    shortDays: [\n        \"Sun\",\n        \"Mon\",\n        \"Tue\",\n        \"Wed\",\n        \"Thu\",\n        \"Fri\",\n        \"Sat\"\n    ],\n    months: [\n        \"January\",\n        \"February\",\n        \"March\",\n        \"April\",\n        \"May\",\n        \"June\",\n        \"July\",\n        \"August\",\n        \"September\",\n        \"October\",\n        \"November\",\n        \"December\"\n    ],\n    shortMonths: [\n        \"Jan\",\n        \"Feb\",\n        \"Mar\",\n        \"Apr\",\n        \"May\",\n        \"Jun\",\n        \"Jul\",\n        \"Aug\",\n        \"Sep\",\n        \"Oct\",\n        \"Nov\",\n        \"Dec\"\n    ]\n});\nfunction defaultLocale(definition) {\n    locale = (0, _localeJsDefault.default)(definition);\n    timeFormat = locale.format;\n    timeParse = locale.parse;\n    utcFormat = locale.utcFormat;\n    utcParse = locale.utcParse;\n    return locale;\n}\nexports.default = defaultLocale;\n\n},{\"./locale.js\":\"bnu2v\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bnu2v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Time = require(\"d3-time\");\nfunction localDate(d) {\n    if (0 <= d.y && d.y < 100) {\n        var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n        date.setFullYear(d.y);\n        return date;\n    }\n    return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\nfunction utcDate(d) {\n    if (0 <= d.y && d.y < 100) {\n        var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n        date.setUTCFullYear(d.y);\n        return date;\n    }\n    return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\nfunction newDate(y, m, d) {\n    return {\n        y: y,\n        m: m,\n        d: d,\n        H: 0,\n        M: 0,\n        S: 0,\n        L: 0\n    };\n}\nfunction formatLocale(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_weekdays = locale.days, locale_shortWeekdays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    var periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths);\n    var formats1 = {\n        \"a\": formatShortWeekday,\n        \"A\": formatWeekday,\n        \"b\": formatShortMonth,\n        \"B\": formatMonth,\n        \"c\": null,\n        \"d\": formatDayOfMonth,\n        \"e\": formatDayOfMonth,\n        \"f\": formatMicroseconds,\n        \"g\": formatYearISO,\n        \"G\": formatFullYearISO,\n        \"H\": formatHour24,\n        \"I\": formatHour12,\n        \"j\": formatDayOfYear,\n        \"L\": formatMilliseconds,\n        \"m\": formatMonthNumber,\n        \"M\": formatMinutes,\n        \"p\": formatPeriod,\n        \"q\": formatQuarter,\n        \"Q\": formatUnixTimestamp,\n        \"s\": formatUnixTimestampSeconds,\n        \"S\": formatSeconds,\n        \"u\": formatWeekdayNumberMonday,\n        \"U\": formatWeekNumberSunday,\n        \"V\": formatWeekNumberISO,\n        \"w\": formatWeekdayNumberSunday,\n        \"W\": formatWeekNumberMonday,\n        \"x\": null,\n        \"X\": null,\n        \"y\": formatYear,\n        \"Y\": formatFullYear,\n        \"Z\": formatZone,\n        \"%\": formatLiteralPercent\n    };\n    var utcFormats = {\n        \"a\": formatUTCShortWeekday,\n        \"A\": formatUTCWeekday,\n        \"b\": formatUTCShortMonth,\n        \"B\": formatUTCMonth,\n        \"c\": null,\n        \"d\": formatUTCDayOfMonth,\n        \"e\": formatUTCDayOfMonth,\n        \"f\": formatUTCMicroseconds,\n        \"g\": formatUTCYearISO,\n        \"G\": formatUTCFullYearISO,\n        \"H\": formatUTCHour24,\n        \"I\": formatUTCHour12,\n        \"j\": formatUTCDayOfYear,\n        \"L\": formatUTCMilliseconds,\n        \"m\": formatUTCMonthNumber,\n        \"M\": formatUTCMinutes,\n        \"p\": formatUTCPeriod,\n        \"q\": formatUTCQuarter,\n        \"Q\": formatUnixTimestamp,\n        \"s\": formatUnixTimestampSeconds,\n        \"S\": formatUTCSeconds,\n        \"u\": formatUTCWeekdayNumberMonday,\n        \"U\": formatUTCWeekNumberSunday,\n        \"V\": formatUTCWeekNumberISO,\n        \"w\": formatUTCWeekdayNumberSunday,\n        \"W\": formatUTCWeekNumberMonday,\n        \"x\": null,\n        \"X\": null,\n        \"y\": formatUTCYear,\n        \"Y\": formatUTCFullYear,\n        \"Z\": formatUTCZone,\n        \"%\": formatLiteralPercent\n    };\n    var parses = {\n        \"a\": parseShortWeekday,\n        \"A\": parseWeekday,\n        \"b\": parseShortMonth,\n        \"B\": parseMonth,\n        \"c\": parseLocaleDateTime,\n        \"d\": parseDayOfMonth,\n        \"e\": parseDayOfMonth,\n        \"f\": parseMicroseconds,\n        \"g\": parseYear,\n        \"G\": parseFullYear,\n        \"H\": parseHour24,\n        \"I\": parseHour24,\n        \"j\": parseDayOfYear,\n        \"L\": parseMilliseconds,\n        \"m\": parseMonthNumber,\n        \"M\": parseMinutes,\n        \"p\": parsePeriod,\n        \"q\": parseQuarter,\n        \"Q\": parseUnixTimestamp,\n        \"s\": parseUnixTimestampSeconds,\n        \"S\": parseSeconds,\n        \"u\": parseWeekdayNumberMonday,\n        \"U\": parseWeekNumberSunday,\n        \"V\": parseWeekNumberISO,\n        \"w\": parseWeekdayNumberSunday,\n        \"W\": parseWeekNumberMonday,\n        \"x\": parseLocaleDate,\n        \"X\": parseLocaleTime,\n        \"y\": parseYear,\n        \"Y\": parseFullYear,\n        \"Z\": parseZone,\n        \"%\": parseLiteralPercent\n    };\n    // These recursive directive definitions must be deferred.\n    formats1.x = newFormat(locale_date, formats1);\n    formats1.X = newFormat(locale_time, formats1);\n    formats1.c = newFormat(locale_dateTime, formats1);\n    utcFormats.x = newFormat(locale_date, utcFormats);\n    utcFormats.X = newFormat(locale_time, utcFormats);\n    utcFormats.c = newFormat(locale_dateTime, utcFormats);\n    function newFormat(specifier, formats) {\n        return function(date) {\n            var string = [], i = -1, j = 0, n = specifier.length, c, pad1, format;\n            if (!(date instanceof Date)) date = new Date(+date);\n            while(++i < n)if (specifier.charCodeAt(i) === 37) {\n                string.push(specifier.slice(j, i));\n                if ((pad1 = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n                else pad1 = c === \"e\" ? \" \" : \"0\";\n                if (format = formats[c]) c = format(date, pad1);\n                string.push(c);\n                j = i + 1;\n            }\n            string.push(specifier.slice(j, i));\n            return string.join(\"\");\n        };\n    }\n    function newParse(specifier, Z) {\n        return function(string) {\n            var d = newDate(1900, undefined, 1), i = parseSpecifier(d, specifier, string += \"\", 0), week, day;\n            if (i != string.length) return null;\n            // If a UNIX timestamp is specified, return it.\n            if (\"Q\" in d) return new Date(d.Q);\n            if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n            // If this is utcParse, never use the local timezone.\n            if (Z && !(\"Z\" in d)) d.Z = 0;\n            // The am-pm flag is 0 for AM, and 1 for PM.\n            if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n            // If the month was not specified, inherit from the quarter.\n            if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n            // Convert day-of-week and week-of-year to day-of-year.\n            if (\"V\" in d) {\n                if (d.V < 1 || d.V > 53) return null;\n                if (!(\"w\" in d)) d.w = 1;\n                if (\"Z\" in d) {\n                    week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n                    week = day > 4 || day === 0 ? (0, _d3Time.utcMonday).ceil(week) : (0, _d3Time.utcMonday)(week);\n                    week = (0, _d3Time.utcDay).offset(week, (d.V - 1) * 7);\n                    d.y = week.getUTCFullYear();\n                    d.m = week.getUTCMonth();\n                    d.d = week.getUTCDate() + (d.w + 6) % 7;\n                } else {\n                    week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n                    week = day > 4 || day === 0 ? (0, _d3Time.timeMonday).ceil(week) : (0, _d3Time.timeMonday)(week);\n                    week = (0, _d3Time.timeDay).offset(week, (d.V - 1) * 7);\n                    d.y = week.getFullYear();\n                    d.m = week.getMonth();\n                    d.d = week.getDate() + (d.w + 6) % 7;\n                }\n            } else if (\"W\" in d || \"U\" in d) {\n                if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n                day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n                d.m = 0;\n                d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n            }\n            // If a time zone is specified, all fields are interpreted as UTC and then\n            // offset according to the specified time zone.\n            if (\"Z\" in d) {\n                d.H += d.Z / 100 | 0;\n                d.M += d.Z % 100;\n                return utcDate(d);\n            }\n            // Otherwise, all fields are in local time.\n            return localDate(d);\n        };\n    }\n    function parseSpecifier(d, specifier, string, j) {\n        var i = 0, n = specifier.length, m = string.length, c, parse;\n        while(i < n){\n            if (j >= m) return -1;\n            c = specifier.charCodeAt(i++);\n            if (c === 37) {\n                c = specifier.charAt(i++);\n                parse = parses[c in pads ? specifier.charAt(i++) : c];\n                if (!parse || (j = parse(d, string, j)) < 0) return -1;\n            } else if (c != string.charCodeAt(j++)) return -1;\n        }\n        return j;\n    }\n    function parsePeriod(d, string, i) {\n        var n = periodRe.exec(string.slice(i));\n        return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortWeekday(d, string, i) {\n        var n = shortWeekdayRe.exec(string.slice(i));\n        return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseWeekday(d, string, i) {\n        var n = weekdayRe.exec(string.slice(i));\n        return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortMonth(d, string, i) {\n        var n = shortMonthRe.exec(string.slice(i));\n        return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseMonth(d, string, i) {\n        var n = monthRe.exec(string.slice(i));\n        return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseLocaleDateTime(d, string, i) {\n        return parseSpecifier(d, locale_dateTime, string, i);\n    }\n    function parseLocaleDate(d, string, i) {\n        return parseSpecifier(d, locale_date, string, i);\n    }\n    function parseLocaleTime(d, string, i) {\n        return parseSpecifier(d, locale_time, string, i);\n    }\n    function formatShortWeekday(d) {\n        return locale_shortWeekdays[d.getDay()];\n    }\n    function formatWeekday(d) {\n        return locale_weekdays[d.getDay()];\n    }\n    function formatShortMonth(d) {\n        return locale_shortMonths[d.getMonth()];\n    }\n    function formatMonth(d) {\n        return locale_months[d.getMonth()];\n    }\n    function formatPeriod(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n    }\n    function formatQuarter(d) {\n        return 1 + ~~(d.getMonth() / 3);\n    }\n    function formatUTCShortWeekday(d) {\n        return locale_shortWeekdays[d.getUTCDay()];\n    }\n    function formatUTCWeekday(d) {\n        return locale_weekdays[d.getUTCDay()];\n    }\n    function formatUTCShortMonth(d) {\n        return locale_shortMonths[d.getUTCMonth()];\n    }\n    function formatUTCMonth(d) {\n        return locale_months[d.getUTCMonth()];\n    }\n    function formatUTCPeriod(d) {\n        return locale_periods[+(d.getUTCHours() >= 12)];\n    }\n    function formatUTCQuarter(d) {\n        return 1 + ~~(d.getUTCMonth() / 3);\n    }\n    return {\n        format: function(specifier) {\n            var f = newFormat(specifier += \"\", formats1);\n            f.toString = function() {\n                return specifier;\n            };\n            return f;\n        },\n        parse: function(specifier) {\n            var p = newParse(specifier += \"\", false);\n            p.toString = function() {\n                return specifier;\n            };\n            return p;\n        },\n        utcFormat: function(specifier) {\n            var f = newFormat(specifier += \"\", utcFormats);\n            f.toString = function() {\n                return specifier;\n            };\n            return f;\n        },\n        utcParse: function(specifier) {\n            var p = newParse(specifier += \"\", true);\n            p.toString = function() {\n                return specifier;\n            };\n            return p;\n        }\n    };\n}\nexports.default = formatLocale;\nvar pads = {\n    \"-\": \"\",\n    \"_\": \" \",\n    \"0\": \"0\"\n}, numberRe = /^\\s*\\d+/, percentRe = /^%/, requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\nfunction pad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\nfunction requote(s) {\n    return s.replace(requoteRe, \"\\\\$&\");\n}\nfunction formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\nfunction formatLookup(names) {\n    return new Map(names.map((name, i)=>[\n            name.toLowerCase(),\n            i\n        ]));\n}\nfunction parseWeekdayNumberSunday(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 1));\n    return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekdayNumberMonday(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 1));\n    return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberSunday(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberISO(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberMonday(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\nfunction parseFullYear(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 4));\n    return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\nfunction parseYear(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\nfunction parseZone(d, string, i) {\n    var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n    return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\nfunction parseQuarter(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 1));\n    return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\nfunction parseMonthNumber(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\nfunction parseDayOfMonth(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\nfunction parseDayOfYear(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 3));\n    return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\nfunction parseHour24(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\nfunction parseMinutes(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\nfunction parseSeconds(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\nfunction parseMilliseconds(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 3));\n    return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\nfunction parseMicroseconds(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 6));\n    return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\nfunction parseLiteralPercent(d, string, i) {\n    var n = percentRe.exec(string.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n}\nfunction parseUnixTimestamp(d, string, i) {\n    var n = numberRe.exec(string.slice(i));\n    return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\nfunction parseUnixTimestampSeconds(d, string, i) {\n    var n = numberRe.exec(string.slice(i));\n    return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\nfunction formatDayOfMonth(d, p) {\n    return pad(d.getDate(), p, 2);\n}\nfunction formatHour24(d, p) {\n    return pad(d.getHours(), p, 2);\n}\nfunction formatHour12(d, p) {\n    return pad(d.getHours() % 12 || 12, p, 2);\n}\nfunction formatDayOfYear(d, p) {\n    return pad(1 + (0, _d3Time.timeDay).count((0, _d3Time.timeYear)(d), d), p, 3);\n}\nfunction formatMilliseconds(d, p) {\n    return pad(d.getMilliseconds(), p, 3);\n}\nfunction formatMicroseconds(d, p) {\n    return formatMilliseconds(d, p) + \"000\";\n}\nfunction formatMonthNumber(d, p) {\n    return pad(d.getMonth() + 1, p, 2);\n}\nfunction formatMinutes(d, p) {\n    return pad(d.getMinutes(), p, 2);\n}\nfunction formatSeconds(d, p) {\n    return pad(d.getSeconds(), p, 2);\n}\nfunction formatWeekdayNumberMonday(d) {\n    var day = d.getDay();\n    return day === 0 ? 7 : day;\n}\nfunction formatWeekNumberSunday(d, p) {\n    return pad((0, _d3Time.timeSunday).count((0, _d3Time.timeYear)(d) - 1, d), p, 2);\n}\nfunction dISO(d) {\n    var day = d.getDay();\n    return day >= 4 || day === 0 ? (0, _d3Time.timeThursday)(d) : (0, _d3Time.timeThursday).ceil(d);\n}\nfunction formatWeekNumberISO(d, p) {\n    d = dISO(d);\n    return pad((0, _d3Time.timeThursday).count((0, _d3Time.timeYear)(d), d) + ((0, _d3Time.timeYear)(d).getDay() === 4), p, 2);\n}\nfunction formatWeekdayNumberSunday(d) {\n    return d.getDay();\n}\nfunction formatWeekNumberMonday(d, p) {\n    return pad((0, _d3Time.timeMonday).count((0, _d3Time.timeYear)(d) - 1, d), p, 2);\n}\nfunction formatYear(d, p) {\n    return pad(d.getFullYear() % 100, p, 2);\n}\nfunction formatYearISO(d, p) {\n    d = dISO(d);\n    return pad(d.getFullYear() % 100, p, 2);\n}\nfunction formatFullYear(d, p) {\n    return pad(d.getFullYear() % 10000, p, 4);\n}\nfunction formatFullYearISO(d, p) {\n    var day = d.getDay();\n    d = day >= 4 || day === 0 ? (0, _d3Time.timeThursday)(d) : (0, _d3Time.timeThursday).ceil(d);\n    return pad(d.getFullYear() % 10000, p, 4);\n}\nfunction formatZone(d) {\n    var z = d.getTimezoneOffset();\n    return (z > 0 ? \"-\" : (z *= -1, \"+\")) + pad(z / 60 | 0, \"0\", 2) + pad(z % 60, \"0\", 2);\n}\nfunction formatUTCDayOfMonth(d, p) {\n    return pad(d.getUTCDate(), p, 2);\n}\nfunction formatUTCHour24(d, p) {\n    return pad(d.getUTCHours(), p, 2);\n}\nfunction formatUTCHour12(d, p) {\n    return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\nfunction formatUTCDayOfYear(d, p) {\n    return pad(1 + (0, _d3Time.utcDay).count((0, _d3Time.utcYear)(d), d), p, 3);\n}\nfunction formatUTCMilliseconds(d, p) {\n    return pad(d.getUTCMilliseconds(), p, 3);\n}\nfunction formatUTCMicroseconds(d, p) {\n    return formatUTCMilliseconds(d, p) + \"000\";\n}\nfunction formatUTCMonthNumber(d, p) {\n    return pad(d.getUTCMonth() + 1, p, 2);\n}\nfunction formatUTCMinutes(d, p) {\n    return pad(d.getUTCMinutes(), p, 2);\n}\nfunction formatUTCSeconds(d, p) {\n    return pad(d.getUTCSeconds(), p, 2);\n}\nfunction formatUTCWeekdayNumberMonday(d) {\n    var dow = d.getUTCDay();\n    return dow === 0 ? 7 : dow;\n}\nfunction formatUTCWeekNumberSunday(d, p) {\n    return pad((0, _d3Time.utcSunday).count((0, _d3Time.utcYear)(d) - 1, d), p, 2);\n}\nfunction UTCdISO(d) {\n    var day = d.getUTCDay();\n    return day >= 4 || day === 0 ? (0, _d3Time.utcThursday)(d) : (0, _d3Time.utcThursday).ceil(d);\n}\nfunction formatUTCWeekNumberISO(d, p) {\n    d = UTCdISO(d);\n    return pad((0, _d3Time.utcThursday).count((0, _d3Time.utcYear)(d), d) + ((0, _d3Time.utcYear)(d).getUTCDay() === 4), p, 2);\n}\nfunction formatUTCWeekdayNumberSunday(d) {\n    return d.getUTCDay();\n}\nfunction formatUTCWeekNumberMonday(d, p) {\n    return pad((0, _d3Time.utcMonday).count((0, _d3Time.utcYear)(d) - 1, d), p, 2);\n}\nfunction formatUTCYear(d, p) {\n    return pad(d.getUTCFullYear() % 100, p, 2);\n}\nfunction formatUTCYearISO(d, p) {\n    d = UTCdISO(d);\n    return pad(d.getUTCFullYear() % 100, p, 2);\n}\nfunction formatUTCFullYear(d, p) {\n    return pad(d.getUTCFullYear() % 10000, p, 4);\n}\nfunction formatUTCFullYearISO(d, p) {\n    var day = d.getUTCDay();\n    d = day >= 4 || day === 0 ? (0, _d3Time.utcThursday)(d) : (0, _d3Time.utcThursday).ceil(d);\n    return pad(d.getUTCFullYear() % 10000, p, 4);\n}\nfunction formatUTCZone() {\n    return \"+0000\";\n}\nfunction formatLiteralPercent() {\n    return \"%\";\n}\nfunction formatUnixTimestamp(d) {\n    return +d;\n}\nfunction formatUnixTimestampSeconds(d) {\n    return Math.floor(+d / 1000);\n}\n\n},{\"d3-time\":\"l42HK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kZBmL\":[function(require,module,exports) {\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */ /* eslint-disable no-proto */ \"use strict\";\nvar base64 = require(\"base64-js\");\nvar ieee754 = require(\"ieee754\");\nvar customInspectSymbol = typeof Symbol === \"function\" && typeof Symbol[\"for\"] === \"function\" // eslint-disable-line dot-notation\n ? Symbol[\"for\"](\"nodejs.util.inspect.custom\") // eslint-disable-line dot-notation\n : null;\nexports.Buffer = Buffer;\nexports.SlowBuffer = SlowBuffer;\nexports.INSPECT_MAX_BYTES = 50;\nvar K_MAX_LENGTH = 0x7fffffff;\nexports.kMaxLength = K_MAX_LENGTH;\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */ Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport();\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== \"undefined\" && typeof console.error === \"function\") console.error(\"This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.\");\nfunction typedArraySupport() {\n    // Can typed array instances can be augmented?\n    try {\n        var arr = new Uint8Array(1);\n        var proto = {\n            foo: function() {\n                return 42;\n            }\n        };\n        Object.setPrototypeOf(proto, Uint8Array.prototype);\n        Object.setPrototypeOf(arr, proto);\n        return arr.foo() === 42;\n    } catch (e) {\n        return false;\n    }\n}\nObject.defineProperty(Buffer.prototype, \"parent\", {\n    enumerable: true,\n    get: function() {\n        if (!Buffer.isBuffer(this)) return undefined;\n        return this.buffer;\n    }\n});\nObject.defineProperty(Buffer.prototype, \"offset\", {\n    enumerable: true,\n    get: function() {\n        if (!Buffer.isBuffer(this)) return undefined;\n        return this.byteOffset;\n    }\n});\nfunction createBuffer(length) {\n    if (length > K_MAX_LENGTH) throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"');\n    // Return an augmented `Uint8Array` instance\n    var buf = new Uint8Array(length);\n    Object.setPrototypeOf(buf, Buffer.prototype);\n    return buf;\n}\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */ function Buffer(arg, encodingOrOffset, length) {\n    // Common case.\n    if (typeof arg === \"number\") {\n        if (typeof encodingOrOffset === \"string\") throw new TypeError('The \"string\" argument must be of type string. Received type number');\n        return allocUnsafe(arg);\n    }\n    return from(arg, encodingOrOffset, length);\n}\nBuffer.poolSize = 8192 // not used by this implementation\n;\nfunction from(value, encodingOrOffset, length) {\n    if (typeof value === \"string\") return fromString(value, encodingOrOffset);\n    if (ArrayBuffer.isView(value)) return fromArrayView(value);\n    if (value == null) throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value);\n    if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) return fromArrayBuffer(value, encodingOrOffset, length);\n    if (typeof SharedArrayBuffer !== \"undefined\" && (isInstance(value, SharedArrayBuffer) || value && isInstance(value.buffer, SharedArrayBuffer))) return fromArrayBuffer(value, encodingOrOffset, length);\n    if (typeof value === \"number\") throw new TypeError('The \"value\" argument must not be of type number. Received type number');\n    var valueOf = value.valueOf && value.valueOf();\n    if (valueOf != null && valueOf !== value) return Buffer.from(valueOf, encodingOrOffset, length);\n    var b = fromObject(value);\n    if (b) return b;\n    if (typeof Symbol !== \"undefined\" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === \"function\") return Buffer.from(value[Symbol.toPrimitive](\"string\"), encodingOrOffset, length);\n    throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value);\n}\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/ Buffer.from = function(value, encodingOrOffset, length) {\n    return from(value, encodingOrOffset, length);\n};\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype);\nObject.setPrototypeOf(Buffer, Uint8Array);\nfunction assertSize(size) {\n    if (typeof size !== \"number\") throw new TypeError('\"size\" argument must be of type number');\n    else if (size < 0) throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"');\n}\nfunction alloc(size, fill, encoding) {\n    assertSize(size);\n    if (size <= 0) return createBuffer(size);\n    if (fill !== undefined) // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpreted as a start offset.\n    return typeof encoding === \"string\" ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill);\n    return createBuffer(size);\n}\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/ Buffer.alloc = function(size, fill, encoding) {\n    return alloc(size, fill, encoding);\n};\nfunction allocUnsafe(size) {\n    assertSize(size);\n    return createBuffer(size < 0 ? 0 : checked(size) | 0);\n}\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */ Buffer.allocUnsafe = function(size) {\n    return allocUnsafe(size);\n};\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */ Buffer.allocUnsafeSlow = function(size) {\n    return allocUnsafe(size);\n};\nfunction fromString(string, encoding) {\n    if (typeof encoding !== \"string\" || encoding === \"\") encoding = \"utf8\";\n    if (!Buffer.isEncoding(encoding)) throw new TypeError(\"Unknown encoding: \" + encoding);\n    var length = byteLength(string, encoding) | 0;\n    var buf = createBuffer(length);\n    var actual = buf.write(string, encoding);\n    if (actual !== length) // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual);\n    return buf;\n}\nfunction fromArrayLike(array) {\n    var length = array.length < 0 ? 0 : checked(array.length) | 0;\n    var buf = createBuffer(length);\n    for(var i = 0; i < length; i += 1)buf[i] = array[i] & 255;\n    return buf;\n}\nfunction fromArrayView(arrayView) {\n    if (isInstance(arrayView, Uint8Array)) {\n        var copy = new Uint8Array(arrayView);\n        return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength);\n    }\n    return fromArrayLike(arrayView);\n}\nfunction fromArrayBuffer(array, byteOffset, length) {\n    if (byteOffset < 0 || array.byteLength < byteOffset) throw new RangeError('\"offset\" is outside of buffer bounds');\n    if (array.byteLength < byteOffset + (length || 0)) throw new RangeError('\"length\" is outside of buffer bounds');\n    var buf;\n    if (byteOffset === undefined && length === undefined) buf = new Uint8Array(array);\n    else if (length === undefined) buf = new Uint8Array(array, byteOffset);\n    else buf = new Uint8Array(array, byteOffset, length);\n    // Return an augmented `Uint8Array` instance\n    Object.setPrototypeOf(buf, Buffer.prototype);\n    return buf;\n}\nfunction fromObject(obj) {\n    if (Buffer.isBuffer(obj)) {\n        var len = checked(obj.length) | 0;\n        var buf = createBuffer(len);\n        if (buf.length === 0) return buf;\n        obj.copy(buf, 0, 0, len);\n        return buf;\n    }\n    if (obj.length !== undefined) {\n        if (typeof obj.length !== \"number\" || numberIsNaN(obj.length)) return createBuffer(0);\n        return fromArrayLike(obj);\n    }\n    if (obj.type === \"Buffer\" && Array.isArray(obj.data)) return fromArrayLike(obj.data);\n}\nfunction checked(length) {\n    // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n    // length is NaN (which is otherwise coerced to zero.)\n    if (length >= K_MAX_LENGTH) throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\" + K_MAX_LENGTH.toString(16) + \" bytes\");\n    return length | 0;\n}\nfunction SlowBuffer(length) {\n    if (+length != length) length = 0;\n    return Buffer.alloc(+length);\n}\nBuffer.isBuffer = function isBuffer(b) {\n    return b != null && b._isBuffer === true && b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n    ;\n};\nBuffer.compare = function compare(a, b) {\n    if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength);\n    if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength);\n    if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) throw new TypeError('The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array');\n    if (a === b) return 0;\n    var x = a.length;\n    var y = b.length;\n    for(var i = 0, len = Math.min(x, y); i < len; ++i)if (a[i] !== b[i]) {\n        x = a[i];\n        y = b[i];\n        break;\n    }\n    if (x < y) return -1;\n    if (y < x) return 1;\n    return 0;\n};\nBuffer.isEncoding = function isEncoding(encoding) {\n    switch(String(encoding).toLowerCase()){\n        case \"hex\":\n        case \"utf8\":\n        case \"utf-8\":\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n        case \"base64\":\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return true;\n        default:\n            return false;\n    }\n};\nBuffer.concat = function concat(list, length) {\n    if (!Array.isArray(list)) throw new TypeError('\"list\" argument must be an Array of Buffers');\n    if (list.length === 0) return Buffer.alloc(0);\n    var i;\n    if (length === undefined) {\n        length = 0;\n        for(i = 0; i < list.length; ++i)length += list[i].length;\n    }\n    var buffer = Buffer.allocUnsafe(length);\n    var pos = 0;\n    for(i = 0; i < list.length; ++i){\n        var buf = list[i];\n        if (isInstance(buf, Uint8Array)) {\n            if (pos + buf.length > buffer.length) Buffer.from(buf).copy(buffer, pos);\n            else Uint8Array.prototype.set.call(buffer, buf, pos);\n        } else if (!Buffer.isBuffer(buf)) throw new TypeError('\"list\" argument must be an Array of Buffers');\n        else buf.copy(buffer, pos);\n        pos += buf.length;\n    }\n    return buffer;\n};\nfunction byteLength(string, encoding) {\n    if (Buffer.isBuffer(string)) return string.length;\n    if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) return string.byteLength;\n    if (typeof string !== \"string\") throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string);\n    var len = string.length;\n    var mustMatch = arguments.length > 2 && arguments[2] === true;\n    if (!mustMatch && len === 0) return 0;\n    // Use a for loop to avoid recursion\n    var loweredCase = false;\n    for(;;)switch(encoding){\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n            return len;\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8ToBytes(string).length;\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return len * 2;\n        case \"hex\":\n            return len >>> 1;\n        case \"base64\":\n            return base64ToBytes(string).length;\n        default:\n            if (loweredCase) return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n            ;\n            encoding = (\"\" + encoding).toLowerCase();\n            loweredCase = true;\n    }\n}\nBuffer.byteLength = byteLength;\nfunction slowToString(encoding, start, end) {\n    var loweredCase = false;\n    // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n    // property of a typed array.\n    // This behaves neither like String nor Uint8Array in that we set start/end\n    // to their upper/lower bounds if the value passed is out of range.\n    // undefined is handled specially as per ECMA-262 6th Edition,\n    // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n    if (start === undefined || start < 0) start = 0;\n    // Return early if start > this.length. Done here to prevent potential uint32\n    // coercion fail below.\n    if (start > this.length) return \"\";\n    if (end === undefined || end > this.length) end = this.length;\n    if (end <= 0) return \"\";\n    // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n    end >>>= 0;\n    start >>>= 0;\n    if (end <= start) return \"\";\n    if (!encoding) encoding = \"utf8\";\n    while(true)switch(encoding){\n        case \"hex\":\n            return hexSlice(this, start, end);\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8Slice(this, start, end);\n        case \"ascii\":\n            return asciiSlice(this, start, end);\n        case \"latin1\":\n        case \"binary\":\n            return latin1Slice(this, start, end);\n        case \"base64\":\n            return base64Slice(this, start, end);\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return utf16leSlice(this, start, end);\n        default:\n            if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n            encoding = (encoding + \"\").toLowerCase();\n            loweredCase = true;\n    }\n}\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true;\nfunction swap(b, n, m) {\n    var i = b[n];\n    b[n] = b[m];\n    b[m] = i;\n}\nBuffer.prototype.swap16 = function swap16() {\n    var len = this.length;\n    if (len % 2 !== 0) throw new RangeError(\"Buffer size must be a multiple of 16-bits\");\n    for(var i = 0; i < len; i += 2)swap(this, i, i + 1);\n    return this;\n};\nBuffer.prototype.swap32 = function swap32() {\n    var len = this.length;\n    if (len % 4 !== 0) throw new RangeError(\"Buffer size must be a multiple of 32-bits\");\n    for(var i = 0; i < len; i += 4){\n        swap(this, i, i + 3);\n        swap(this, i + 1, i + 2);\n    }\n    return this;\n};\nBuffer.prototype.swap64 = function swap64() {\n    var len = this.length;\n    if (len % 8 !== 0) throw new RangeError(\"Buffer size must be a multiple of 64-bits\");\n    for(var i = 0; i < len; i += 8){\n        swap(this, i, i + 7);\n        swap(this, i + 1, i + 6);\n        swap(this, i + 2, i + 5);\n        swap(this, i + 3, i + 4);\n    }\n    return this;\n};\nBuffer.prototype.toString = function toString() {\n    var length = this.length;\n    if (length === 0) return \"\";\n    if (arguments.length === 0) return utf8Slice(this, 0, length);\n    return slowToString.apply(this, arguments);\n};\nBuffer.prototype.toLocaleString = Buffer.prototype.toString;\nBuffer.prototype.equals = function equals(b) {\n    if (!Buffer.isBuffer(b)) throw new TypeError(\"Argument must be a Buffer\");\n    if (this === b) return true;\n    return Buffer.compare(this, b) === 0;\n};\nBuffer.prototype.inspect = function inspect() {\n    var str = \"\";\n    var max = exports.INSPECT_MAX_BYTES;\n    str = this.toString(\"hex\", 0, max).replace(/(.{2})/g, \"$1 \").trim();\n    if (this.length > max) str += \" ... \";\n    return \"<Buffer \" + str + \">\";\n};\nif (customInspectSymbol) Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect;\nBuffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {\n    if (isInstance(target, Uint8Array)) target = Buffer.from(target, target.offset, target.byteLength);\n    if (!Buffer.isBuffer(target)) throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target);\n    if (start === undefined) start = 0;\n    if (end === undefined) end = target ? target.length : 0;\n    if (thisStart === undefined) thisStart = 0;\n    if (thisEnd === undefined) thisEnd = this.length;\n    if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) throw new RangeError(\"out of range index\");\n    if (thisStart >= thisEnd && start >= end) return 0;\n    if (thisStart >= thisEnd) return -1;\n    if (start >= end) return 1;\n    start >>>= 0;\n    end >>>= 0;\n    thisStart >>>= 0;\n    thisEnd >>>= 0;\n    if (this === target) return 0;\n    var x = thisEnd - thisStart;\n    var y = end - start;\n    var len = Math.min(x, y);\n    var thisCopy = this.slice(thisStart, thisEnd);\n    var targetCopy = target.slice(start, end);\n    for(var i = 0; i < len; ++i)if (thisCopy[i] !== targetCopy[i]) {\n        x = thisCopy[i];\n        y = targetCopy[i];\n        break;\n    }\n    if (x < y) return -1;\n    if (y < x) return 1;\n    return 0;\n};\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {\n    // Empty buffer means no match\n    if (buffer.length === 0) return -1;\n    // Normalize byteOffset\n    if (typeof byteOffset === \"string\") {\n        encoding = byteOffset;\n        byteOffset = 0;\n    } else if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff;\n    else if (byteOffset < -2147483648) byteOffset = -2147483648;\n    byteOffset = +byteOffset // Coerce to Number.\n    ;\n    if (numberIsNaN(byteOffset)) // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : buffer.length - 1;\n    // Normalize byteOffset: negative offsets start from the end of the buffer\n    if (byteOffset < 0) byteOffset = buffer.length + byteOffset;\n    if (byteOffset >= buffer.length) {\n        if (dir) return -1;\n        else byteOffset = buffer.length - 1;\n    } else if (byteOffset < 0) {\n        if (dir) byteOffset = 0;\n        else return -1;\n    }\n    // Normalize val\n    if (typeof val === \"string\") val = Buffer.from(val, encoding);\n    // Finally, search either indexOf (if dir is true) or lastIndexOf\n    if (Buffer.isBuffer(val)) {\n        // Special case: looking for empty string/buffer always fails\n        if (val.length === 0) return -1;\n        return arrayIndexOf(buffer, val, byteOffset, encoding, dir);\n    } else if (typeof val === \"number\") {\n        val = val & 0xFF // Search for a byte value [0-255]\n        ;\n        if (typeof Uint8Array.prototype.indexOf === \"function\") {\n            if (dir) return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);\n            else return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);\n        }\n        return arrayIndexOf(buffer, [\n            val\n        ], byteOffset, encoding, dir);\n    }\n    throw new TypeError(\"val must be string, number or Buffer\");\n}\nfunction arrayIndexOf(arr, val, byteOffset, encoding, dir) {\n    var indexSize = 1;\n    var arrLength = arr.length;\n    var valLength = val.length;\n    if (encoding !== undefined) {\n        encoding = String(encoding).toLowerCase();\n        if (encoding === \"ucs2\" || encoding === \"ucs-2\" || encoding === \"utf16le\" || encoding === \"utf-16le\") {\n            if (arr.length < 2 || val.length < 2) return -1;\n            indexSize = 2;\n            arrLength /= 2;\n            valLength /= 2;\n            byteOffset /= 2;\n        }\n    }\n    function read(buf, i) {\n        if (indexSize === 1) return buf[i];\n        else return buf.readUInt16BE(i * indexSize);\n    }\n    var i1;\n    if (dir) {\n        var foundIndex = -1;\n        for(i1 = byteOffset; i1 < arrLength; i1++)if (read(arr, i1) === read(val, foundIndex === -1 ? 0 : i1 - foundIndex)) {\n            if (foundIndex === -1) foundIndex = i1;\n            if (i1 - foundIndex + 1 === valLength) return foundIndex * indexSize;\n        } else {\n            if (foundIndex !== -1) i1 -= i1 - foundIndex;\n            foundIndex = -1;\n        }\n    } else {\n        if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;\n        for(i1 = byteOffset; i1 >= 0; i1--){\n            var found = true;\n            for(var j = 0; j < valLength; j++)if (read(arr, i1 + j) !== read(val, j)) {\n                found = false;\n                break;\n            }\n            if (found) return i1;\n        }\n    }\n    return -1;\n}\nBuffer.prototype.includes = function includes(val, byteOffset, encoding) {\n    return this.indexOf(val, byteOffset, encoding) !== -1;\n};\nBuffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {\n    return bidirectionalIndexOf(this, val, byteOffset, encoding, true);\n};\nBuffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {\n    return bidirectionalIndexOf(this, val, byteOffset, encoding, false);\n};\nfunction hexWrite(buf, string, offset, length) {\n    offset = Number(offset) || 0;\n    var remaining = buf.length - offset;\n    if (!length) length = remaining;\n    else {\n        length = Number(length);\n        if (length > remaining) length = remaining;\n    }\n    var strLen = string.length;\n    if (length > strLen / 2) length = strLen / 2;\n    for(var i = 0; i < length; ++i){\n        var parsed = parseInt(string.substr(i * 2, 2), 16);\n        if (numberIsNaN(parsed)) return i;\n        buf[offset + i] = parsed;\n    }\n    return i;\n}\nfunction utf8Write(buf, string, offset, length) {\n    return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);\n}\nfunction asciiWrite(buf, string, offset, length) {\n    return blitBuffer(asciiToBytes(string), buf, offset, length);\n}\nfunction base64Write(buf, string, offset, length) {\n    return blitBuffer(base64ToBytes(string), buf, offset, length);\n}\nfunction ucs2Write(buf, string, offset, length) {\n    return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);\n}\nBuffer.prototype.write = function write(string, offset, length, encoding) {\n    // Buffer#write(string)\n    if (offset === undefined) {\n        encoding = \"utf8\";\n        length = this.length;\n        offset = 0;\n    // Buffer#write(string, encoding)\n    } else if (length === undefined && typeof offset === \"string\") {\n        encoding = offset;\n        length = this.length;\n        offset = 0;\n    // Buffer#write(string, offset[, length][, encoding])\n    } else if (isFinite(offset)) {\n        offset = offset >>> 0;\n        if (isFinite(length)) {\n            length = length >>> 0;\n            if (encoding === undefined) encoding = \"utf8\";\n        } else {\n            encoding = length;\n            length = undefined;\n        }\n    } else throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");\n    var remaining = this.length - offset;\n    if (length === undefined || length > remaining) length = remaining;\n    if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) throw new RangeError(\"Attempt to write outside buffer bounds\");\n    if (!encoding) encoding = \"utf8\";\n    var loweredCase = false;\n    for(;;)switch(encoding){\n        case \"hex\":\n            return hexWrite(this, string, offset, length);\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8Write(this, string, offset, length);\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n            return asciiWrite(this, string, offset, length);\n        case \"base64\":\n            // Warning: maxLength not taken into account in base64Write\n            return base64Write(this, string, offset, length);\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return ucs2Write(this, string, offset, length);\n        default:\n            if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n            encoding = (\"\" + encoding).toLowerCase();\n            loweredCase = true;\n    }\n};\nBuffer.prototype.toJSON = function toJSON() {\n    return {\n        type: \"Buffer\",\n        data: Array.prototype.slice.call(this._arr || this, 0)\n    };\n};\nfunction base64Slice(buf, start, end) {\n    if (start === 0 && end === buf.length) return base64.fromByteArray(buf);\n    else return base64.fromByteArray(buf.slice(start, end));\n}\nfunction utf8Slice(buf, start, end) {\n    end = Math.min(buf.length, end);\n    var res = [];\n    var i = start;\n    while(i < end){\n        var firstByte = buf[i];\n        var codePoint = null;\n        var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;\n        if (i + bytesPerSequence <= end) {\n            var secondByte, thirdByte, fourthByte, tempCodePoint;\n            switch(bytesPerSequence){\n                case 1:\n                    if (firstByte < 0x80) codePoint = firstByte;\n                    break;\n                case 2:\n                    secondByte = buf[i + 1];\n                    if ((secondByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;\n                        if (tempCodePoint > 0x7F) codePoint = tempCodePoint;\n                    }\n                    break;\n                case 3:\n                    secondByte = buf[i + 1];\n                    thirdByte = buf[i + 2];\n                    if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;\n                        if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) codePoint = tempCodePoint;\n                    }\n                    break;\n                case 4:\n                    secondByte = buf[i + 1];\n                    thirdByte = buf[i + 2];\n                    fourthByte = buf[i + 3];\n                    if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;\n                        if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) codePoint = tempCodePoint;\n                    }\n            }\n        }\n        if (codePoint === null) {\n            // we did not generate a valid codePoint so insert a\n            // replacement char (U+FFFD) and advance only 1 byte\n            codePoint = 0xFFFD;\n            bytesPerSequence = 1;\n        } else if (codePoint > 0xFFFF) {\n            // encode to utf16 (surrogate pair dance)\n            codePoint -= 0x10000;\n            res.push(codePoint >>> 10 & 0x3FF | 0xD800);\n            codePoint = 0xDC00 | codePoint & 0x3FF;\n        }\n        res.push(codePoint);\n        i += bytesPerSequence;\n    }\n    return decodeCodePointsArray(res);\n}\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000;\nfunction decodeCodePointsArray(codePoints) {\n    var len = codePoints.length;\n    if (len <= MAX_ARGUMENTS_LENGTH) return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n    ;\n    // Decode in chunks to avoid \"call stack size exceeded\".\n    var res = \"\";\n    var i = 0;\n    while(i < len)res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));\n    return res;\n}\nfunction asciiSlice(buf, start, end) {\n    var ret = \"\";\n    end = Math.min(buf.length, end);\n    for(var i = start; i < end; ++i)ret += String.fromCharCode(buf[i] & 0x7F);\n    return ret;\n}\nfunction latin1Slice(buf, start, end) {\n    var ret = \"\";\n    end = Math.min(buf.length, end);\n    for(var i = start; i < end; ++i)ret += String.fromCharCode(buf[i]);\n    return ret;\n}\nfunction hexSlice(buf, start, end) {\n    var len = buf.length;\n    if (!start || start < 0) start = 0;\n    if (!end || end < 0 || end > len) end = len;\n    var out = \"\";\n    for(var i = start; i < end; ++i)out += hexSliceLookupTable[buf[i]];\n    return out;\n}\nfunction utf16leSlice(buf, start, end) {\n    var bytes = buf.slice(start, end);\n    var res = \"\";\n    // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n    for(var i = 0; i < bytes.length - 1; i += 2)res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);\n    return res;\n}\nBuffer.prototype.slice = function slice(start, end) {\n    var len = this.length;\n    start = ~~start;\n    end = end === undefined ? len : ~~end;\n    if (start < 0) {\n        start += len;\n        if (start < 0) start = 0;\n    } else if (start > len) start = len;\n    if (end < 0) {\n        end += len;\n        if (end < 0) end = 0;\n    } else if (end > len) end = len;\n    if (end < start) end = start;\n    var newBuf = this.subarray(start, end);\n    // Return an augmented `Uint8Array` instance\n    Object.setPrototypeOf(newBuf, Buffer.prototype);\n    return newBuf;\n};\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */ function checkOffset(offset, ext, length) {\n    if (offset % 1 !== 0 || offset < 0) throw new RangeError(\"offset is not uint\");\n    if (offset + ext > length) throw new RangeError(\"Trying to access beyond buffer length\");\n}\nBuffer.prototype.readUintLE = Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength1, noAssert) {\n    offset = offset >>> 0;\n    byteLength1 = byteLength1 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength1, this.length);\n    var val = this[offset];\n    var mul = 1;\n    var i = 0;\n    while(++i < byteLength1 && (mul *= 0x100))val += this[offset + i] * mul;\n    return val;\n};\nBuffer.prototype.readUintBE = Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength2, noAssert) {\n    offset = offset >>> 0;\n    byteLength2 = byteLength2 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength2, this.length);\n    var val = this[offset + --byteLength2];\n    var mul = 1;\n    while(byteLength2 > 0 && (mul *= 0x100))val += this[offset + --byteLength2] * mul;\n    return val;\n};\nBuffer.prototype.readUint8 = Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 1, this.length);\n    return this[offset];\n};\nBuffer.prototype.readUint16LE = Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    return this[offset] | this[offset + 1] << 8;\n};\nBuffer.prototype.readUint16BE = Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    return this[offset] << 8 | this[offset + 1];\n};\nBuffer.prototype.readUint32LE = Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;\n};\nBuffer.prototype.readUint32BE = Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);\n};\nBuffer.prototype.readIntLE = function readIntLE(offset, byteLength3, noAssert) {\n    offset = offset >>> 0;\n    byteLength3 = byteLength3 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength3, this.length);\n    var val = this[offset];\n    var mul = 1;\n    var i = 0;\n    while(++i < byteLength3 && (mul *= 0x100))val += this[offset + i] * mul;\n    mul *= 0x80;\n    if (val >= mul) val -= Math.pow(2, 8 * byteLength3);\n    return val;\n};\nBuffer.prototype.readIntBE = function readIntBE(offset, byteLength4, noAssert) {\n    offset = offset >>> 0;\n    byteLength4 = byteLength4 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength4, this.length);\n    var i = byteLength4;\n    var mul = 1;\n    var val = this[offset + --i];\n    while(i > 0 && (mul *= 0x100))val += this[offset + --i] * mul;\n    mul *= 0x80;\n    if (val >= mul) val -= Math.pow(2, 8 * byteLength4);\n    return val;\n};\nBuffer.prototype.readInt8 = function readInt8(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 1, this.length);\n    if (!(this[offset] & 0x80)) return this[offset];\n    return (0xff - this[offset] + 1) * -1;\n};\nBuffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    var val = this[offset] | this[offset + 1] << 8;\n    return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\nBuffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    var val = this[offset + 1] | this[offset] << 8;\n    return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\nBuffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;\n};\nBuffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];\n};\nBuffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return ieee754.read(this, offset, true, 23, 4);\n};\nBuffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return ieee754.read(this, offset, false, 23, 4);\n};\nBuffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 8, this.length);\n    return ieee754.read(this, offset, true, 52, 8);\n};\nBuffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 8, this.length);\n    return ieee754.read(this, offset, false, 52, 8);\n};\nfunction checkInt(buf, value, offset, ext, max, min) {\n    if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n    if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds');\n    if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n}\nBuffer.prototype.writeUintLE = Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength5, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    byteLength5 = byteLength5 >>> 0;\n    if (!noAssert) {\n        var maxBytes = Math.pow(2, 8 * byteLength5) - 1;\n        checkInt(this, value, offset, byteLength5, maxBytes, 0);\n    }\n    var mul = 1;\n    var i = 0;\n    this[offset] = value & 0xFF;\n    while(++i < byteLength5 && (mul *= 0x100))this[offset + i] = value / mul & 0xFF;\n    return offset + byteLength5;\n};\nBuffer.prototype.writeUintBE = Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength6, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    byteLength6 = byteLength6 >>> 0;\n    if (!noAssert) {\n        var maxBytes = Math.pow(2, 8 * byteLength6) - 1;\n        checkInt(this, value, offset, byteLength6, maxBytes, 0);\n    }\n    var i = byteLength6 - 1;\n    var mul = 1;\n    this[offset + i] = value & 0xFF;\n    while(--i >= 0 && (mul *= 0x100))this[offset + i] = value / mul & 0xFF;\n    return offset + byteLength6;\n};\nBuffer.prototype.writeUint8 = Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);\n    this[offset] = value & 0xff;\n    return offset + 1;\n};\nBuffer.prototype.writeUint16LE = Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    return offset + 2;\n};\nBuffer.prototype.writeUint16BE = Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n    this[offset] = value >>> 8;\n    this[offset + 1] = value & 0xff;\n    return offset + 2;\n};\nBuffer.prototype.writeUint32LE = Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n    this[offset + 3] = value >>> 24;\n    this[offset + 2] = value >>> 16;\n    this[offset + 1] = value >>> 8;\n    this[offset] = value & 0xff;\n    return offset + 4;\n};\nBuffer.prototype.writeUint32BE = Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n    this[offset] = value >>> 24;\n    this[offset + 1] = value >>> 16;\n    this[offset + 2] = value >>> 8;\n    this[offset + 3] = value & 0xff;\n    return offset + 4;\n};\nBuffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength7, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) {\n        var limit = Math.pow(2, 8 * byteLength7 - 1);\n        checkInt(this, value, offset, byteLength7, limit - 1, -limit);\n    }\n    var i = 0;\n    var mul = 1;\n    var sub = 0;\n    this[offset] = value & 0xFF;\n    while(++i < byteLength7 && (mul *= 0x100)){\n        if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) sub = 1;\n        this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n    }\n    return offset + byteLength7;\n};\nBuffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength8, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) {\n        var limit = Math.pow(2, 8 * byteLength8 - 1);\n        checkInt(this, value, offset, byteLength8, limit - 1, -limit);\n    }\n    var i = byteLength8 - 1;\n    var mul = 1;\n    var sub = 0;\n    this[offset + i] = value & 0xFF;\n    while(--i >= 0 && (mul *= 0x100)){\n        if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) sub = 1;\n        this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n    }\n    return offset + byteLength8;\n};\nBuffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -128);\n    if (value < 0) value = 0xff + value + 1;\n    this[offset] = value & 0xff;\n    return offset + 1;\n};\nBuffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    return offset + 2;\n};\nBuffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);\n    this[offset] = value >>> 8;\n    this[offset + 1] = value & 0xff;\n    return offset + 2;\n};\nBuffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    this[offset + 2] = value >>> 16;\n    this[offset + 3] = value >>> 24;\n    return offset + 4;\n};\nBuffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);\n    if (value < 0) value = 0xffffffff + value + 1;\n    this[offset] = value >>> 24;\n    this[offset + 1] = value >>> 16;\n    this[offset + 2] = value >>> 8;\n    this[offset + 3] = value & 0xff;\n    return offset + 4;\n};\nfunction checkIEEE754(buf, value, offset, ext, max, min) {\n    if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n    if (offset < 0) throw new RangeError(\"Index out of range\");\n}\nfunction writeFloat(buf, value, offset, littleEndian, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -340282346638528860000000000000000000000);\n    ieee754.write(buf, value, offset, littleEndian, 23, 4);\n    return offset + 4;\n}\nBuffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {\n    return writeFloat(this, value, offset, true, noAssert);\n};\nBuffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {\n    return writeFloat(this, value, offset, false, noAssert);\n};\nfunction writeDouble(buf, value, offset, littleEndian, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);\n    ieee754.write(buf, value, offset, littleEndian, 52, 8);\n    return offset + 8;\n}\nBuffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {\n    return writeDouble(this, value, offset, true, noAssert);\n};\nBuffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {\n    return writeDouble(this, value, offset, false, noAssert);\n};\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy(target, targetStart, start, end) {\n    if (!Buffer.isBuffer(target)) throw new TypeError(\"argument should be a Buffer\");\n    if (!start) start = 0;\n    if (!end && end !== 0) end = this.length;\n    if (targetStart >= target.length) targetStart = target.length;\n    if (!targetStart) targetStart = 0;\n    if (end > 0 && end < start) end = start;\n    // Copy 0 bytes; we're done\n    if (end === start) return 0;\n    if (target.length === 0 || this.length === 0) return 0;\n    // Fatal error conditions\n    if (targetStart < 0) throw new RangeError(\"targetStart out of bounds\");\n    if (start < 0 || start >= this.length) throw new RangeError(\"Index out of range\");\n    if (end < 0) throw new RangeError(\"sourceEnd out of bounds\");\n    // Are we oob?\n    if (end > this.length) end = this.length;\n    if (target.length - targetStart < end - start) end = target.length - targetStart + start;\n    var len = end - start;\n    if (this === target && typeof Uint8Array.prototype.copyWithin === \"function\") // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end);\n    else Uint8Array.prototype.set.call(target, this.subarray(start, end), targetStart);\n    return len;\n};\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill(val, start, end, encoding) {\n    // Handle string cases:\n    if (typeof val === \"string\") {\n        if (typeof start === \"string\") {\n            encoding = start;\n            start = 0;\n            end = this.length;\n        } else if (typeof end === \"string\") {\n            encoding = end;\n            end = this.length;\n        }\n        if (encoding !== undefined && typeof encoding !== \"string\") throw new TypeError(\"encoding must be a string\");\n        if (typeof encoding === \"string\" && !Buffer.isEncoding(encoding)) throw new TypeError(\"Unknown encoding: \" + encoding);\n        if (val.length === 1) {\n            var code = val.charCodeAt(0);\n            if (encoding === \"utf8\" && code < 128 || encoding === \"latin1\") // Fast path: If `val` fits into a single byte, use that numeric value.\n            val = code;\n        }\n    } else if (typeof val === \"number\") val = val & 255;\n    else if (typeof val === \"boolean\") val = Number(val);\n    // Invalid ranges are not set to a default, so can range check early.\n    if (start < 0 || this.length < start || this.length < end) throw new RangeError(\"Out of range index\");\n    if (end <= start) return this;\n    start = start >>> 0;\n    end = end === undefined ? this.length : end >>> 0;\n    if (!val) val = 0;\n    var i;\n    if (typeof val === \"number\") for(i = start; i < end; ++i)this[i] = val;\n    else {\n        var bytes = Buffer.isBuffer(val) ? val : Buffer.from(val, encoding);\n        var len = bytes.length;\n        if (len === 0) throw new TypeError('The value \"' + val + '\" is invalid for argument \"value\"');\n        for(i = 0; i < end - start; ++i)this[i + start] = bytes[i % len];\n    }\n    return this;\n};\n// HELPER FUNCTIONS\n// ================\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g;\nfunction base64clean(str) {\n    // Node takes equal signs as end of the Base64 encoding\n    str = str.split(\"=\")[0];\n    // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n    str = str.trim().replace(INVALID_BASE64_RE, \"\");\n    // Node converts strings with length < 2 to ''\n    if (str.length < 2) return \"\";\n    // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n    while(str.length % 4 !== 0)str = str + \"=\";\n    return str;\n}\nfunction utf8ToBytes(string, units) {\n    units = units || Infinity;\n    var codePoint;\n    var length = string.length;\n    var leadSurrogate = null;\n    var bytes = [];\n    for(var i = 0; i < length; ++i){\n        codePoint = string.charCodeAt(i);\n        // is surrogate component\n        if (codePoint > 0xD7FF && codePoint < 0xE000) {\n            // last char was a lead\n            if (!leadSurrogate) {\n                // no lead yet\n                if (codePoint > 0xDBFF) {\n                    // unexpected trail\n                    if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                    continue;\n                } else if (i + 1 === length) {\n                    // unpaired lead\n                    if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                    continue;\n                }\n                // valid lead\n                leadSurrogate = codePoint;\n                continue;\n            }\n            // 2 leads in a row\n            if (codePoint < 0xDC00) {\n                if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                leadSurrogate = codePoint;\n                continue;\n            }\n            // valid surrogate pair\n            codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;\n        } else if (leadSurrogate) // valid bmp char, but last char was a lead\n        {\n            if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n        }\n        leadSurrogate = null;\n        // encode utf8\n        if (codePoint < 0x80) {\n            if ((units -= 1) < 0) break;\n            bytes.push(codePoint);\n        } else if (codePoint < 0x800) {\n            if ((units -= 2) < 0) break;\n            bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);\n        } else if (codePoint < 0x10000) {\n            if ((units -= 3) < 0) break;\n            bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n        } else if (codePoint < 0x110000) {\n            if ((units -= 4) < 0) break;\n            bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n        } else throw new Error(\"Invalid code point\");\n    }\n    return bytes;\n}\nfunction asciiToBytes(str) {\n    var byteArray = [];\n    for(var i = 0; i < str.length; ++i)// Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF);\n    return byteArray;\n}\nfunction utf16leToBytes(str, units) {\n    var c, hi, lo;\n    var byteArray = [];\n    for(var i = 0; i < str.length; ++i){\n        if ((units -= 2) < 0) break;\n        c = str.charCodeAt(i);\n        hi = c >> 8;\n        lo = c % 256;\n        byteArray.push(lo);\n        byteArray.push(hi);\n    }\n    return byteArray;\n}\nfunction base64ToBytes(str) {\n    return base64.toByteArray(base64clean(str));\n}\nfunction blitBuffer(src, dst, offset, length) {\n    for(var i = 0; i < length; ++i){\n        if (i + offset >= dst.length || i >= src.length) break;\n        dst[i + offset] = src[i];\n    }\n    return i;\n}\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance(obj, type) {\n    return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name;\n}\nfunction numberIsNaN(obj) {\n    // For IE11 support\n    return obj !== obj // eslint-disable-line no-self-compare\n    ;\n}\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nvar hexSliceLookupTable = function() {\n    var alphabet = \"0123456789abcdef\";\n    var table = new Array(256);\n    for(var i = 0; i < 16; ++i){\n        var i16 = i * 16;\n        for(var j = 0; j < 16; ++j)table[i16 + j] = alphabet[i] + alphabet[j];\n    }\n    return table;\n}();\n\n},{\"base64-js\":\"1lZue\",\"ieee754\":\"2wWVg\"}],\"1lZue\":[function(require,module,exports) {\n\"use strict\";\nexports.byteLength = byteLength;\nexports.toByteArray = toByteArray;\nexports.fromByteArray = fromByteArray;\nvar lookup = [];\nvar revLookup = [];\nvar Arr = typeof Uint8Array !== \"undefined\" ? Uint8Array : Array;\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfor(var i = 0, len = code.length; i < len; ++i){\n    lookup[i] = code[i];\n    revLookup[code.charCodeAt(i)] = i;\n}\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup[\"-\".charCodeAt(0)] = 62;\nrevLookup[\"_\".charCodeAt(0)] = 63;\nfunction getLens(b64) {\n    var len1 = b64.length;\n    if (len1 % 4 > 0) throw new Error(\"Invalid string. Length must be a multiple of 4\");\n    // Trim off extra bytes after placeholder bytes are found\n    // See: https://github.com/beatgammit/base64-js/issues/42\n    var validLen = b64.indexOf(\"=\");\n    if (validLen === -1) validLen = len1;\n    var placeHoldersLen = validLen === len1 ? 0 : 4 - validLen % 4;\n    return [\n        validLen,\n        placeHoldersLen\n    ];\n}\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength(b64) {\n    var lens = getLens(b64);\n    var validLen = lens[0];\n    var placeHoldersLen = lens[1];\n    return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction _byteLength(b64, validLen, placeHoldersLen) {\n    return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction toByteArray(b64) {\n    var tmp;\n    var lens = getLens(b64);\n    var validLen = lens[0];\n    var placeHoldersLen = lens[1];\n    var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n    var curByte = 0;\n    // if there are placeholders, only get up to the last complete 4 chars\n    var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen;\n    var i1;\n    for(i1 = 0; i1 < len2; i1 += 4){\n        tmp = revLookup[b64.charCodeAt(i1)] << 18 | revLookup[b64.charCodeAt(i1 + 1)] << 12 | revLookup[b64.charCodeAt(i1 + 2)] << 6 | revLookup[b64.charCodeAt(i1 + 3)];\n        arr[curByte++] = tmp >> 16 & 0xFF;\n        arr[curByte++] = tmp >> 8 & 0xFF;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    if (placeHoldersLen === 2) {\n        tmp = revLookup[b64.charCodeAt(i1)] << 2 | revLookup[b64.charCodeAt(i1 + 1)] >> 4;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    if (placeHoldersLen === 1) {\n        tmp = revLookup[b64.charCodeAt(i1)] << 10 | revLookup[b64.charCodeAt(i1 + 1)] << 4 | revLookup[b64.charCodeAt(i1 + 2)] >> 2;\n        arr[curByte++] = tmp >> 8 & 0xFF;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    return arr;\n}\nfunction tripletToBase64(num) {\n    return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];\n}\nfunction encodeChunk(uint8, start, end) {\n    var tmp;\n    var output = [];\n    for(var i2 = start; i2 < end; i2 += 3){\n        tmp = (uint8[i2] << 16 & 0xFF0000) + (uint8[i2 + 1] << 8 & 0xFF00) + (uint8[i2 + 2] & 0xFF);\n        output.push(tripletToBase64(tmp));\n    }\n    return output.join(\"\");\n}\nfunction fromByteArray(uint8) {\n    var tmp;\n    var len3 = uint8.length;\n    var extraBytes = len3 % 3 // if we have 1 byte left, pad 2 bytes\n    ;\n    var parts = [];\n    var maxChunkLength = 16383 // must be multiple of 3\n    ;\n    // go through the array every three bytes, we'll deal with trailing stuff later\n    for(var i3 = 0, len2 = len3 - extraBytes; i3 < len2; i3 += maxChunkLength)parts.push(encodeChunk(uint8, i3, i3 + maxChunkLength > len2 ? len2 : i3 + maxChunkLength));\n    // pad the end with zeros, but make sure to not forget the extra bytes\n    if (extraBytes === 1) {\n        tmp = uint8[len3 - 1];\n        parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + \"==\");\n    } else if (extraBytes === 2) {\n        tmp = (uint8[len3 - 2] << 8) + uint8[len3 - 1];\n        parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + \"=\");\n    }\n    return parts.join(\"\");\n}\n\n},{}],\"2wWVg\":[function(require,module,exports) {\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */ exports.read = function(buffer, offset, isLE, mLen, nBytes) {\n    var e, m;\n    var eLen = nBytes * 8 - mLen - 1;\n    var eMax = (1 << eLen) - 1;\n    var eBias = eMax >> 1;\n    var nBits = -7;\n    var i = isLE ? nBytes - 1 : 0;\n    var d = isLE ? -1 : 1;\n    var s = buffer[offset + i];\n    i += d;\n    e = s & (1 << -nBits) - 1;\n    s >>= -nBits;\n    nBits += eLen;\n    for(; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);\n    m = e & (1 << -nBits) - 1;\n    e >>= -nBits;\n    nBits += mLen;\n    for(; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);\n    if (e === 0) e = 1 - eBias;\n    else if (e === eMax) return m ? NaN : (s ? -1 : 1) * Infinity;\n    else {\n        m = m + Math.pow(2, mLen);\n        e = e - eBias;\n    }\n    return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\nexports.write = function(buffer, value, offset, isLE, mLen, nBytes) {\n    var e, m, c;\n    var eLen = nBytes * 8 - mLen - 1;\n    var eMax = (1 << eLen) - 1;\n    var eBias = eMax >> 1;\n    var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n    var i = isLE ? 0 : nBytes - 1;\n    var d = isLE ? 1 : -1;\n    var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n    value = Math.abs(value);\n    if (isNaN(value) || value === Infinity) {\n        m = isNaN(value) ? 1 : 0;\n        e = eMax;\n    } else {\n        e = Math.floor(Math.log(value) / Math.LN2);\n        if (value * (c = Math.pow(2, -e)) < 1) {\n            e--;\n            c *= 2;\n        }\n        if (e + eBias >= 1) value += rt / c;\n        else value += rt * Math.pow(2, 1 - eBias);\n        if (value * c >= 2) {\n            e++;\n            c /= 2;\n        }\n        if (e + eBias >= eMax) {\n            m = 0;\n            e = eMax;\n        } else if (e + eBias >= 1) {\n            m = (value * c - 1) * Math.pow(2, mLen);\n            e = e + eBias;\n        } else {\n            m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n            e = 0;\n        }\n    }\n    for(; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);\n    e = e << mLen | m;\n    eLen += mLen;\n    for(; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);\n    buffer[offset + i - d] |= s * 128;\n};\n\n},{}],\"992De\":[function(require,module,exports) {\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */ /* eslint-disable no-proto */ \"use strict\";\nvar base64 = require(\"base64-js\");\nvar ieee754 = require(\"ieee754\");\nvar customInspectSymbol = typeof Symbol === \"function\" && typeof Symbol[\"for\"] === \"function\" // eslint-disable-line dot-notation\n ? Symbol[\"for\"](\"nodejs.util.inspect.custom\") // eslint-disable-line dot-notation\n : null;\nexports.Buffer = Buffer;\nexports.SlowBuffer = SlowBuffer;\nexports.INSPECT_MAX_BYTES = 50;\nvar K_MAX_LENGTH = 0x7fffffff;\nexports.kMaxLength = K_MAX_LENGTH;\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */ Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport();\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== \"undefined\" && typeof console.error === \"function\") console.error(\"This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.\");\nfunction typedArraySupport() {\n    // Can typed array instances can be augmented?\n    try {\n        var arr = new Uint8Array(1);\n        var proto = {\n            foo: function() {\n                return 42;\n            }\n        };\n        Object.setPrototypeOf(proto, Uint8Array.prototype);\n        Object.setPrototypeOf(arr, proto);\n        return arr.foo() === 42;\n    } catch (e) {\n        return false;\n    }\n}\nObject.defineProperty(Buffer.prototype, \"parent\", {\n    enumerable: true,\n    get: function() {\n        if (!Buffer.isBuffer(this)) return undefined;\n        return this.buffer;\n    }\n});\nObject.defineProperty(Buffer.prototype, \"offset\", {\n    enumerable: true,\n    get: function() {\n        if (!Buffer.isBuffer(this)) return undefined;\n        return this.byteOffset;\n    }\n});\nfunction createBuffer(length) {\n    if (length > K_MAX_LENGTH) throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"');\n    // Return an augmented `Uint8Array` instance\n    var buf = new Uint8Array(length);\n    Object.setPrototypeOf(buf, Buffer.prototype);\n    return buf;\n}\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */ function Buffer(arg, encodingOrOffset, length) {\n    // Common case.\n    if (typeof arg === \"number\") {\n        if (typeof encodingOrOffset === \"string\") throw new TypeError('The \"string\" argument must be of type string. Received type number');\n        return allocUnsafe(arg);\n    }\n    return from(arg, encodingOrOffset, length);\n}\nBuffer.poolSize = 8192 // not used by this implementation\n;\nfunction from(value, encodingOrOffset, length) {\n    if (typeof value === \"string\") return fromString(value, encodingOrOffset);\n    if (ArrayBuffer.isView(value)) return fromArrayView(value);\n    if (value == null) throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value);\n    if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) return fromArrayBuffer(value, encodingOrOffset, length);\n    if (typeof SharedArrayBuffer !== \"undefined\" && (isInstance(value, SharedArrayBuffer) || value && isInstance(value.buffer, SharedArrayBuffer))) return fromArrayBuffer(value, encodingOrOffset, length);\n    if (typeof value === \"number\") throw new TypeError('The \"value\" argument must not be of type number. Received type number');\n    var valueOf = value.valueOf && value.valueOf();\n    if (valueOf != null && valueOf !== value) return Buffer.from(valueOf, encodingOrOffset, length);\n    var b = fromObject(value);\n    if (b) return b;\n    if (typeof Symbol !== \"undefined\" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === \"function\") return Buffer.from(value[Symbol.toPrimitive](\"string\"), encodingOrOffset, length);\n    throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value);\n}\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/ Buffer.from = function(value, encodingOrOffset, length) {\n    return from(value, encodingOrOffset, length);\n};\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype);\nObject.setPrototypeOf(Buffer, Uint8Array);\nfunction assertSize(size) {\n    if (typeof size !== \"number\") throw new TypeError('\"size\" argument must be of type number');\n    else if (size < 0) throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"');\n}\nfunction alloc(size, fill, encoding) {\n    assertSize(size);\n    if (size <= 0) return createBuffer(size);\n    if (fill !== undefined) // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpreted as a start offset.\n    return typeof encoding === \"string\" ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill);\n    return createBuffer(size);\n}\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/ Buffer.alloc = function(size, fill, encoding) {\n    return alloc(size, fill, encoding);\n};\nfunction allocUnsafe(size) {\n    assertSize(size);\n    return createBuffer(size < 0 ? 0 : checked(size) | 0);\n}\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */ Buffer.allocUnsafe = function(size) {\n    return allocUnsafe(size);\n};\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */ Buffer.allocUnsafeSlow = function(size) {\n    return allocUnsafe(size);\n};\nfunction fromString(string, encoding) {\n    if (typeof encoding !== \"string\" || encoding === \"\") encoding = \"utf8\";\n    if (!Buffer.isEncoding(encoding)) throw new TypeError(\"Unknown encoding: \" + encoding);\n    var length = byteLength(string, encoding) | 0;\n    var buf = createBuffer(length);\n    var actual = buf.write(string, encoding);\n    if (actual !== length) // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual);\n    return buf;\n}\nfunction fromArrayLike(array) {\n    var length = array.length < 0 ? 0 : checked(array.length) | 0;\n    var buf = createBuffer(length);\n    for(var i = 0; i < length; i += 1)buf[i] = array[i] & 255;\n    return buf;\n}\nfunction fromArrayView(arrayView) {\n    if (isInstance(arrayView, Uint8Array)) {\n        var copy = new Uint8Array(arrayView);\n        return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength);\n    }\n    return fromArrayLike(arrayView);\n}\nfunction fromArrayBuffer(array, byteOffset, length) {\n    if (byteOffset < 0 || array.byteLength < byteOffset) throw new RangeError('\"offset\" is outside of buffer bounds');\n    if (array.byteLength < byteOffset + (length || 0)) throw new RangeError('\"length\" is outside of buffer bounds');\n    var buf;\n    if (byteOffset === undefined && length === undefined) buf = new Uint8Array(array);\n    else if (length === undefined) buf = new Uint8Array(array, byteOffset);\n    else buf = new Uint8Array(array, byteOffset, length);\n    // Return an augmented `Uint8Array` instance\n    Object.setPrototypeOf(buf, Buffer.prototype);\n    return buf;\n}\nfunction fromObject(obj) {\n    if (Buffer.isBuffer(obj)) {\n        var len = checked(obj.length) | 0;\n        var buf = createBuffer(len);\n        if (buf.length === 0) return buf;\n        obj.copy(buf, 0, 0, len);\n        return buf;\n    }\n    if (obj.length !== undefined) {\n        if (typeof obj.length !== \"number\" || numberIsNaN(obj.length)) return createBuffer(0);\n        return fromArrayLike(obj);\n    }\n    if (obj.type === \"Buffer\" && Array.isArray(obj.data)) return fromArrayLike(obj.data);\n}\nfunction checked(length) {\n    // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n    // length is NaN (which is otherwise coerced to zero.)\n    if (length >= K_MAX_LENGTH) throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\" + K_MAX_LENGTH.toString(16) + \" bytes\");\n    return length | 0;\n}\nfunction SlowBuffer(length) {\n    if (+length != length) length = 0;\n    return Buffer.alloc(+length);\n}\nBuffer.isBuffer = function isBuffer(b) {\n    return b != null && b._isBuffer === true && b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n    ;\n};\nBuffer.compare = function compare(a, b) {\n    if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength);\n    if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength);\n    if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) throw new TypeError('The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array');\n    if (a === b) return 0;\n    var x = a.length;\n    var y = b.length;\n    for(var i = 0, len = Math.min(x, y); i < len; ++i)if (a[i] !== b[i]) {\n        x = a[i];\n        y = b[i];\n        break;\n    }\n    if (x < y) return -1;\n    if (y < x) return 1;\n    return 0;\n};\nBuffer.isEncoding = function isEncoding(encoding) {\n    switch(String(encoding).toLowerCase()){\n        case \"hex\":\n        case \"utf8\":\n        case \"utf-8\":\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n        case \"base64\":\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return true;\n        default:\n            return false;\n    }\n};\nBuffer.concat = function concat(list, length) {\n    if (!Array.isArray(list)) throw new TypeError('\"list\" argument must be an Array of Buffers');\n    if (list.length === 0) return Buffer.alloc(0);\n    var i;\n    if (length === undefined) {\n        length = 0;\n        for(i = 0; i < list.length; ++i)length += list[i].length;\n    }\n    var buffer = Buffer.allocUnsafe(length);\n    var pos = 0;\n    for(i = 0; i < list.length; ++i){\n        var buf = list[i];\n        if (isInstance(buf, Uint8Array)) {\n            if (pos + buf.length > buffer.length) Buffer.from(buf).copy(buffer, pos);\n            else Uint8Array.prototype.set.call(buffer, buf, pos);\n        } else if (!Buffer.isBuffer(buf)) throw new TypeError('\"list\" argument must be an Array of Buffers');\n        else buf.copy(buffer, pos);\n        pos += buf.length;\n    }\n    return buffer;\n};\nfunction byteLength(string, encoding) {\n    if (Buffer.isBuffer(string)) return string.length;\n    if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) return string.byteLength;\n    if (typeof string !== \"string\") throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string);\n    var len = string.length;\n    var mustMatch = arguments.length > 2 && arguments[2] === true;\n    if (!mustMatch && len === 0) return 0;\n    // Use a for loop to avoid recursion\n    var loweredCase = false;\n    for(;;)switch(encoding){\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n            return len;\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8ToBytes(string).length;\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return len * 2;\n        case \"hex\":\n            return len >>> 1;\n        case \"base64\":\n            return base64ToBytes(string).length;\n        default:\n            if (loweredCase) return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n            ;\n            encoding = (\"\" + encoding).toLowerCase();\n            loweredCase = true;\n    }\n}\nBuffer.byteLength = byteLength;\nfunction slowToString(encoding, start, end) {\n    var loweredCase = false;\n    // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n    // property of a typed array.\n    // This behaves neither like String nor Uint8Array in that we set start/end\n    // to their upper/lower bounds if the value passed is out of range.\n    // undefined is handled specially as per ECMA-262 6th Edition,\n    // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n    if (start === undefined || start < 0) start = 0;\n    // Return early if start > this.length. Done here to prevent potential uint32\n    // coercion fail below.\n    if (start > this.length) return \"\";\n    if (end === undefined || end > this.length) end = this.length;\n    if (end <= 0) return \"\";\n    // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n    end >>>= 0;\n    start >>>= 0;\n    if (end <= start) return \"\";\n    if (!encoding) encoding = \"utf8\";\n    while(true)switch(encoding){\n        case \"hex\":\n            return hexSlice(this, start, end);\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8Slice(this, start, end);\n        case \"ascii\":\n            return asciiSlice(this, start, end);\n        case \"latin1\":\n        case \"binary\":\n            return latin1Slice(this, start, end);\n        case \"base64\":\n            return base64Slice(this, start, end);\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return utf16leSlice(this, start, end);\n        default:\n            if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n            encoding = (encoding + \"\").toLowerCase();\n            loweredCase = true;\n    }\n}\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true;\nfunction swap(b, n, m) {\n    var i = b[n];\n    b[n] = b[m];\n    b[m] = i;\n}\nBuffer.prototype.swap16 = function swap16() {\n    var len = this.length;\n    if (len % 2 !== 0) throw new RangeError(\"Buffer size must be a multiple of 16-bits\");\n    for(var i = 0; i < len; i += 2)swap(this, i, i + 1);\n    return this;\n};\nBuffer.prototype.swap32 = function swap32() {\n    var len = this.length;\n    if (len % 4 !== 0) throw new RangeError(\"Buffer size must be a multiple of 32-bits\");\n    for(var i = 0; i < len; i += 4){\n        swap(this, i, i + 3);\n        swap(this, i + 1, i + 2);\n    }\n    return this;\n};\nBuffer.prototype.swap64 = function swap64() {\n    var len = this.length;\n    if (len % 8 !== 0) throw new RangeError(\"Buffer size must be a multiple of 64-bits\");\n    for(var i = 0; i < len; i += 8){\n        swap(this, i, i + 7);\n        swap(this, i + 1, i + 6);\n        swap(this, i + 2, i + 5);\n        swap(this, i + 3, i + 4);\n    }\n    return this;\n};\nBuffer.prototype.toString = function toString() {\n    var length = this.length;\n    if (length === 0) return \"\";\n    if (arguments.length === 0) return utf8Slice(this, 0, length);\n    return slowToString.apply(this, arguments);\n};\nBuffer.prototype.toLocaleString = Buffer.prototype.toString;\nBuffer.prototype.equals = function equals(b) {\n    if (!Buffer.isBuffer(b)) throw new TypeError(\"Argument must be a Buffer\");\n    if (this === b) return true;\n    return Buffer.compare(this, b) === 0;\n};\nBuffer.prototype.inspect = function inspect() {\n    var str = \"\";\n    var max = exports.INSPECT_MAX_BYTES;\n    str = this.toString(\"hex\", 0, max).replace(/(.{2})/g, \"$1 \").trim();\n    if (this.length > max) str += \" ... \";\n    return \"<Buffer \" + str + \">\";\n};\nif (customInspectSymbol) Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect;\nBuffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {\n    if (isInstance(target, Uint8Array)) target = Buffer.from(target, target.offset, target.byteLength);\n    if (!Buffer.isBuffer(target)) throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target);\n    if (start === undefined) start = 0;\n    if (end === undefined) end = target ? target.length : 0;\n    if (thisStart === undefined) thisStart = 0;\n    if (thisEnd === undefined) thisEnd = this.length;\n    if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) throw new RangeError(\"out of range index\");\n    if (thisStart >= thisEnd && start >= end) return 0;\n    if (thisStart >= thisEnd) return -1;\n    if (start >= end) return 1;\n    start >>>= 0;\n    end >>>= 0;\n    thisStart >>>= 0;\n    thisEnd >>>= 0;\n    if (this === target) return 0;\n    var x = thisEnd - thisStart;\n    var y = end - start;\n    var len = Math.min(x, y);\n    var thisCopy = this.slice(thisStart, thisEnd);\n    var targetCopy = target.slice(start, end);\n    for(var i = 0; i < len; ++i)if (thisCopy[i] !== targetCopy[i]) {\n        x = thisCopy[i];\n        y = targetCopy[i];\n        break;\n    }\n    if (x < y) return -1;\n    if (y < x) return 1;\n    return 0;\n};\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {\n    // Empty buffer means no match\n    if (buffer.length === 0) return -1;\n    // Normalize byteOffset\n    if (typeof byteOffset === \"string\") {\n        encoding = byteOffset;\n        byteOffset = 0;\n    } else if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff;\n    else if (byteOffset < -2147483648) byteOffset = -2147483648;\n    byteOffset = +byteOffset // Coerce to Number.\n    ;\n    if (numberIsNaN(byteOffset)) // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : buffer.length - 1;\n    // Normalize byteOffset: negative offsets start from the end of the buffer\n    if (byteOffset < 0) byteOffset = buffer.length + byteOffset;\n    if (byteOffset >= buffer.length) {\n        if (dir) return -1;\n        else byteOffset = buffer.length - 1;\n    } else if (byteOffset < 0) {\n        if (dir) byteOffset = 0;\n        else return -1;\n    }\n    // Normalize val\n    if (typeof val === \"string\") val = Buffer.from(val, encoding);\n    // Finally, search either indexOf (if dir is true) or lastIndexOf\n    if (Buffer.isBuffer(val)) {\n        // Special case: looking for empty string/buffer always fails\n        if (val.length === 0) return -1;\n        return arrayIndexOf(buffer, val, byteOffset, encoding, dir);\n    } else if (typeof val === \"number\") {\n        val = val & 0xFF // Search for a byte value [0-255]\n        ;\n        if (typeof Uint8Array.prototype.indexOf === \"function\") {\n            if (dir) return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);\n            else return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);\n        }\n        return arrayIndexOf(buffer, [\n            val\n        ], byteOffset, encoding, dir);\n    }\n    throw new TypeError(\"val must be string, number or Buffer\");\n}\nfunction arrayIndexOf(arr, val, byteOffset, encoding, dir) {\n    var indexSize = 1;\n    var arrLength = arr.length;\n    var valLength = val.length;\n    if (encoding !== undefined) {\n        encoding = String(encoding).toLowerCase();\n        if (encoding === \"ucs2\" || encoding === \"ucs-2\" || encoding === \"utf16le\" || encoding === \"utf-16le\") {\n            if (arr.length < 2 || val.length < 2) return -1;\n            indexSize = 2;\n            arrLength /= 2;\n            valLength /= 2;\n            byteOffset /= 2;\n        }\n    }\n    function read(buf, i) {\n        if (indexSize === 1) return buf[i];\n        else return buf.readUInt16BE(i * indexSize);\n    }\n    var i1;\n    if (dir) {\n        var foundIndex = -1;\n        for(i1 = byteOffset; i1 < arrLength; i1++)if (read(arr, i1) === read(val, foundIndex === -1 ? 0 : i1 - foundIndex)) {\n            if (foundIndex === -1) foundIndex = i1;\n            if (i1 - foundIndex + 1 === valLength) return foundIndex * indexSize;\n        } else {\n            if (foundIndex !== -1) i1 -= i1 - foundIndex;\n            foundIndex = -1;\n        }\n    } else {\n        if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;\n        for(i1 = byteOffset; i1 >= 0; i1--){\n            var found = true;\n            for(var j = 0; j < valLength; j++)if (read(arr, i1 + j) !== read(val, j)) {\n                found = false;\n                break;\n            }\n            if (found) return i1;\n        }\n    }\n    return -1;\n}\nBuffer.prototype.includes = function includes(val, byteOffset, encoding) {\n    return this.indexOf(val, byteOffset, encoding) !== -1;\n};\nBuffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {\n    return bidirectionalIndexOf(this, val, byteOffset, encoding, true);\n};\nBuffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {\n    return bidirectionalIndexOf(this, val, byteOffset, encoding, false);\n};\nfunction hexWrite(buf, string, offset, length) {\n    offset = Number(offset) || 0;\n    var remaining = buf.length - offset;\n    if (!length) length = remaining;\n    else {\n        length = Number(length);\n        if (length > remaining) length = remaining;\n    }\n    var strLen = string.length;\n    if (length > strLen / 2) length = strLen / 2;\n    for(var i = 0; i < length; ++i){\n        var parsed = parseInt(string.substr(i * 2, 2), 16);\n        if (numberIsNaN(parsed)) return i;\n        buf[offset + i] = parsed;\n    }\n    return i;\n}\nfunction utf8Write(buf, string, offset, length) {\n    return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);\n}\nfunction asciiWrite(buf, string, offset, length) {\n    return blitBuffer(asciiToBytes(string), buf, offset, length);\n}\nfunction base64Write(buf, string, offset, length) {\n    return blitBuffer(base64ToBytes(string), buf, offset, length);\n}\nfunction ucs2Write(buf, string, offset, length) {\n    return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);\n}\nBuffer.prototype.write = function write(string, offset, length, encoding) {\n    // Buffer#write(string)\n    if (offset === undefined) {\n        encoding = \"utf8\";\n        length = this.length;\n        offset = 0;\n    // Buffer#write(string, encoding)\n    } else if (length === undefined && typeof offset === \"string\") {\n        encoding = offset;\n        length = this.length;\n        offset = 0;\n    // Buffer#write(string, offset[, length][, encoding])\n    } else if (isFinite(offset)) {\n        offset = offset >>> 0;\n        if (isFinite(length)) {\n            length = length >>> 0;\n            if (encoding === undefined) encoding = \"utf8\";\n        } else {\n            encoding = length;\n            length = undefined;\n        }\n    } else throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");\n    var remaining = this.length - offset;\n    if (length === undefined || length > remaining) length = remaining;\n    if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) throw new RangeError(\"Attempt to write outside buffer bounds\");\n    if (!encoding) encoding = \"utf8\";\n    var loweredCase = false;\n    for(;;)switch(encoding){\n        case \"hex\":\n            return hexWrite(this, string, offset, length);\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8Write(this, string, offset, length);\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n            return asciiWrite(this, string, offset, length);\n        case \"base64\":\n            // Warning: maxLength not taken into account in base64Write\n            return base64Write(this, string, offset, length);\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return ucs2Write(this, string, offset, length);\n        default:\n            if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n            encoding = (\"\" + encoding).toLowerCase();\n            loweredCase = true;\n    }\n};\nBuffer.prototype.toJSON = function toJSON() {\n    return {\n        type: \"Buffer\",\n        data: Array.prototype.slice.call(this._arr || this, 0)\n    };\n};\nfunction base64Slice(buf, start, end) {\n    if (start === 0 && end === buf.length) return base64.fromByteArray(buf);\n    else return base64.fromByteArray(buf.slice(start, end));\n}\nfunction utf8Slice(buf, start, end) {\n    end = Math.min(buf.length, end);\n    var res = [];\n    var i = start;\n    while(i < end){\n        var firstByte = buf[i];\n        var codePoint = null;\n        var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;\n        if (i + bytesPerSequence <= end) {\n            var secondByte, thirdByte, fourthByte, tempCodePoint;\n            switch(bytesPerSequence){\n                case 1:\n                    if (firstByte < 0x80) codePoint = firstByte;\n                    break;\n                case 2:\n                    secondByte = buf[i + 1];\n                    if ((secondByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;\n                        if (tempCodePoint > 0x7F) codePoint = tempCodePoint;\n                    }\n                    break;\n                case 3:\n                    secondByte = buf[i + 1];\n                    thirdByte = buf[i + 2];\n                    if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;\n                        if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) codePoint = tempCodePoint;\n                    }\n                    break;\n                case 4:\n                    secondByte = buf[i + 1];\n                    thirdByte = buf[i + 2];\n                    fourthByte = buf[i + 3];\n                    if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;\n                        if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) codePoint = tempCodePoint;\n                    }\n            }\n        }\n        if (codePoint === null) {\n            // we did not generate a valid codePoint so insert a\n            // replacement char (U+FFFD) and advance only 1 byte\n            codePoint = 0xFFFD;\n            bytesPerSequence = 1;\n        } else if (codePoint > 0xFFFF) {\n            // encode to utf16 (surrogate pair dance)\n            codePoint -= 0x10000;\n            res.push(codePoint >>> 10 & 0x3FF | 0xD800);\n            codePoint = 0xDC00 | codePoint & 0x3FF;\n        }\n        res.push(codePoint);\n        i += bytesPerSequence;\n    }\n    return decodeCodePointsArray(res);\n}\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000;\nfunction decodeCodePointsArray(codePoints) {\n    var len = codePoints.length;\n    if (len <= MAX_ARGUMENTS_LENGTH) return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n    ;\n    // Decode in chunks to avoid \"call stack size exceeded\".\n    var res = \"\";\n    var i = 0;\n    while(i < len)res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));\n    return res;\n}\nfunction asciiSlice(buf, start, end) {\n    var ret = \"\";\n    end = Math.min(buf.length, end);\n    for(var i = start; i < end; ++i)ret += String.fromCharCode(buf[i] & 0x7F);\n    return ret;\n}\nfunction latin1Slice(buf, start, end) {\n    var ret = \"\";\n    end = Math.min(buf.length, end);\n    for(var i = start; i < end; ++i)ret += String.fromCharCode(buf[i]);\n    return ret;\n}\nfunction hexSlice(buf, start, end) {\n    var len = buf.length;\n    if (!start || start < 0) start = 0;\n    if (!end || end < 0 || end > len) end = len;\n    var out = \"\";\n    for(var i = start; i < end; ++i)out += hexSliceLookupTable[buf[i]];\n    return out;\n}\nfunction utf16leSlice(buf, start, end) {\n    var bytes = buf.slice(start, end);\n    var res = \"\";\n    // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n    for(var i = 0; i < bytes.length - 1; i += 2)res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);\n    return res;\n}\nBuffer.prototype.slice = function slice(start, end) {\n    var len = this.length;\n    start = ~~start;\n    end = end === undefined ? len : ~~end;\n    if (start < 0) {\n        start += len;\n        if (start < 0) start = 0;\n    } else if (start > len) start = len;\n    if (end < 0) {\n        end += len;\n        if (end < 0) end = 0;\n    } else if (end > len) end = len;\n    if (end < start) end = start;\n    var newBuf = this.subarray(start, end);\n    // Return an augmented `Uint8Array` instance\n    Object.setPrototypeOf(newBuf, Buffer.prototype);\n    return newBuf;\n};\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */ function checkOffset(offset, ext, length) {\n    if (offset % 1 !== 0 || offset < 0) throw new RangeError(\"offset is not uint\");\n    if (offset + ext > length) throw new RangeError(\"Trying to access beyond buffer length\");\n}\nBuffer.prototype.readUintLE = Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength1, noAssert) {\n    offset = offset >>> 0;\n    byteLength1 = byteLength1 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength1, this.length);\n    var val = this[offset];\n    var mul = 1;\n    var i = 0;\n    while(++i < byteLength1 && (mul *= 0x100))val += this[offset + i] * mul;\n    return val;\n};\nBuffer.prototype.readUintBE = Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength2, noAssert) {\n    offset = offset >>> 0;\n    byteLength2 = byteLength2 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength2, this.length);\n    var val = this[offset + --byteLength2];\n    var mul = 1;\n    while(byteLength2 > 0 && (mul *= 0x100))val += this[offset + --byteLength2] * mul;\n    return val;\n};\nBuffer.prototype.readUint8 = Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 1, this.length);\n    return this[offset];\n};\nBuffer.prototype.readUint16LE = Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    return this[offset] | this[offset + 1] << 8;\n};\nBuffer.prototype.readUint16BE = Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    return this[offset] << 8 | this[offset + 1];\n};\nBuffer.prototype.readUint32LE = Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;\n};\nBuffer.prototype.readUint32BE = Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);\n};\nBuffer.prototype.readIntLE = function readIntLE(offset, byteLength3, noAssert) {\n    offset = offset >>> 0;\n    byteLength3 = byteLength3 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength3, this.length);\n    var val = this[offset];\n    var mul = 1;\n    var i = 0;\n    while(++i < byteLength3 && (mul *= 0x100))val += this[offset + i] * mul;\n    mul *= 0x80;\n    if (val >= mul) val -= Math.pow(2, 8 * byteLength3);\n    return val;\n};\nBuffer.prototype.readIntBE = function readIntBE(offset, byteLength4, noAssert) {\n    offset = offset >>> 0;\n    byteLength4 = byteLength4 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength4, this.length);\n    var i = byteLength4;\n    var mul = 1;\n    var val = this[offset + --i];\n    while(i > 0 && (mul *= 0x100))val += this[offset + --i] * mul;\n    mul *= 0x80;\n    if (val >= mul) val -= Math.pow(2, 8 * byteLength4);\n    return val;\n};\nBuffer.prototype.readInt8 = function readInt8(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 1, this.length);\n    if (!(this[offset] & 0x80)) return this[offset];\n    return (0xff - this[offset] + 1) * -1;\n};\nBuffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    var val = this[offset] | this[offset + 1] << 8;\n    return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\nBuffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    var val = this[offset + 1] | this[offset] << 8;\n    return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\nBuffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;\n};\nBuffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];\n};\nBuffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return ieee754.read(this, offset, true, 23, 4);\n};\nBuffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return ieee754.read(this, offset, false, 23, 4);\n};\nBuffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 8, this.length);\n    return ieee754.read(this, offset, true, 52, 8);\n};\nBuffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 8, this.length);\n    return ieee754.read(this, offset, false, 52, 8);\n};\nfunction checkInt(buf, value, offset, ext, max, min) {\n    if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n    if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds');\n    if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n}\nBuffer.prototype.writeUintLE = Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength5, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    byteLength5 = byteLength5 >>> 0;\n    if (!noAssert) {\n        var maxBytes = Math.pow(2, 8 * byteLength5) - 1;\n        checkInt(this, value, offset, byteLength5, maxBytes, 0);\n    }\n    var mul = 1;\n    var i = 0;\n    this[offset] = value & 0xFF;\n    while(++i < byteLength5 && (mul *= 0x100))this[offset + i] = value / mul & 0xFF;\n    return offset + byteLength5;\n};\nBuffer.prototype.writeUintBE = Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength6, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    byteLength6 = byteLength6 >>> 0;\n    if (!noAssert) {\n        var maxBytes = Math.pow(2, 8 * byteLength6) - 1;\n        checkInt(this, value, offset, byteLength6, maxBytes, 0);\n    }\n    var i = byteLength6 - 1;\n    var mul = 1;\n    this[offset + i] = value & 0xFF;\n    while(--i >= 0 && (mul *= 0x100))this[offset + i] = value / mul & 0xFF;\n    return offset + byteLength6;\n};\nBuffer.prototype.writeUint8 = Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);\n    this[offset] = value & 0xff;\n    return offset + 1;\n};\nBuffer.prototype.writeUint16LE = Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    return offset + 2;\n};\nBuffer.prototype.writeUint16BE = Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n    this[offset] = value >>> 8;\n    this[offset + 1] = value & 0xff;\n    return offset + 2;\n};\nBuffer.prototype.writeUint32LE = Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n    this[offset + 3] = value >>> 24;\n    this[offset + 2] = value >>> 16;\n    this[offset + 1] = value >>> 8;\n    this[offset] = value & 0xff;\n    return offset + 4;\n};\nBuffer.prototype.writeUint32BE = Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n    this[offset] = value >>> 24;\n    this[offset + 1] = value >>> 16;\n    this[offset + 2] = value >>> 8;\n    this[offset + 3] = value & 0xff;\n    return offset + 4;\n};\nBuffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength7, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) {\n        var limit = Math.pow(2, 8 * byteLength7 - 1);\n        checkInt(this, value, offset, byteLength7, limit - 1, -limit);\n    }\n    var i = 0;\n    var mul = 1;\n    var sub = 0;\n    this[offset] = value & 0xFF;\n    while(++i < byteLength7 && (mul *= 0x100)){\n        if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) sub = 1;\n        this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n    }\n    return offset + byteLength7;\n};\nBuffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength8, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) {\n        var limit = Math.pow(2, 8 * byteLength8 - 1);\n        checkInt(this, value, offset, byteLength8, limit - 1, -limit);\n    }\n    var i = byteLength8 - 1;\n    var mul = 1;\n    var sub = 0;\n    this[offset + i] = value & 0xFF;\n    while(--i >= 0 && (mul *= 0x100)){\n        if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) sub = 1;\n        this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n    }\n    return offset + byteLength8;\n};\nBuffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -128);\n    if (value < 0) value = 0xff + value + 1;\n    this[offset] = value & 0xff;\n    return offset + 1;\n};\nBuffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    return offset + 2;\n};\nBuffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);\n    this[offset] = value >>> 8;\n    this[offset + 1] = value & 0xff;\n    return offset + 2;\n};\nBuffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    this[offset + 2] = value >>> 16;\n    this[offset + 3] = value >>> 24;\n    return offset + 4;\n};\nBuffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);\n    if (value < 0) value = 0xffffffff + value + 1;\n    this[offset] = value >>> 24;\n    this[offset + 1] = value >>> 16;\n    this[offset + 2] = value >>> 8;\n    this[offset + 3] = value & 0xff;\n    return offset + 4;\n};\nfunction checkIEEE754(buf, value, offset, ext, max, min) {\n    if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n    if (offset < 0) throw new RangeError(\"Index out of range\");\n}\nfunction writeFloat(buf, value, offset, littleEndian, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -340282346638528860000000000000000000000);\n    ieee754.write(buf, value, offset, littleEndian, 23, 4);\n    return offset + 4;\n}\nBuffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {\n    return writeFloat(this, value, offset, true, noAssert);\n};\nBuffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {\n    return writeFloat(this, value, offset, false, noAssert);\n};\nfunction writeDouble(buf, value, offset, littleEndian, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);\n    ieee754.write(buf, value, offset, littleEndian, 52, 8);\n    return offset + 8;\n}\nBuffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {\n    return writeDouble(this, value, offset, true, noAssert);\n};\nBuffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {\n    return writeDouble(this, value, offset, false, noAssert);\n};\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy(target, targetStart, start, end) {\n    if (!Buffer.isBuffer(target)) throw new TypeError(\"argument should be a Buffer\");\n    if (!start) start = 0;\n    if (!end && end !== 0) end = this.length;\n    if (targetStart >= target.length) targetStart = target.length;\n    if (!targetStart) targetStart = 0;\n    if (end > 0 && end < start) end = start;\n    // Copy 0 bytes; we're done\n    if (end === start) return 0;\n    if (target.length === 0 || this.length === 0) return 0;\n    // Fatal error conditions\n    if (targetStart < 0) throw new RangeError(\"targetStart out of bounds\");\n    if (start < 0 || start >= this.length) throw new RangeError(\"Index out of range\");\n    if (end < 0) throw new RangeError(\"sourceEnd out of bounds\");\n    // Are we oob?\n    if (end > this.length) end = this.length;\n    if (target.length - targetStart < end - start) end = target.length - targetStart + start;\n    var len = end - start;\n    if (this === target && typeof Uint8Array.prototype.copyWithin === \"function\") // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end);\n    else Uint8Array.prototype.set.call(target, this.subarray(start, end), targetStart);\n    return len;\n};\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill(val, start, end, encoding) {\n    // Handle string cases:\n    if (typeof val === \"string\") {\n        if (typeof start === \"string\") {\n            encoding = start;\n            start = 0;\n            end = this.length;\n        } else if (typeof end === \"string\") {\n            encoding = end;\n            end = this.length;\n        }\n        if (encoding !== undefined && typeof encoding !== \"string\") throw new TypeError(\"encoding must be a string\");\n        if (typeof encoding === \"string\" && !Buffer.isEncoding(encoding)) throw new TypeError(\"Unknown encoding: \" + encoding);\n        if (val.length === 1) {\n            var code = val.charCodeAt(0);\n            if (encoding === \"utf8\" && code < 128 || encoding === \"latin1\") // Fast path: If `val` fits into a single byte, use that numeric value.\n            val = code;\n        }\n    } else if (typeof val === \"number\") val = val & 255;\n    else if (typeof val === \"boolean\") val = Number(val);\n    // Invalid ranges are not set to a default, so can range check early.\n    if (start < 0 || this.length < start || this.length < end) throw new RangeError(\"Out of range index\");\n    if (end <= start) return this;\n    start = start >>> 0;\n    end = end === undefined ? this.length : end >>> 0;\n    if (!val) val = 0;\n    var i;\n    if (typeof val === \"number\") for(i = start; i < end; ++i)this[i] = val;\n    else {\n        var bytes = Buffer.isBuffer(val) ? val : Buffer.from(val, encoding);\n        var len = bytes.length;\n        if (len === 0) throw new TypeError('The value \"' + val + '\" is invalid for argument \"value\"');\n        for(i = 0; i < end - start; ++i)this[i + start] = bytes[i % len];\n    }\n    return this;\n};\n// HELPER FUNCTIONS\n// ================\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g;\nfunction base64clean(str) {\n    // Node takes equal signs as end of the Base64 encoding\n    str = str.split(\"=\")[0];\n    // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n    str = str.trim().replace(INVALID_BASE64_RE, \"\");\n    // Node converts strings with length < 2 to ''\n    if (str.length < 2) return \"\";\n    // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n    while(str.length % 4 !== 0)str = str + \"=\";\n    return str;\n}\nfunction utf8ToBytes(string, units) {\n    units = units || Infinity;\n    var codePoint;\n    var length = string.length;\n    var leadSurrogate = null;\n    var bytes = [];\n    for(var i = 0; i < length; ++i){\n        codePoint = string.charCodeAt(i);\n        // is surrogate component\n        if (codePoint > 0xD7FF && codePoint < 0xE000) {\n            // last char was a lead\n            if (!leadSurrogate) {\n                // no lead yet\n                if (codePoint > 0xDBFF) {\n                    // unexpected trail\n                    if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                    continue;\n                } else if (i + 1 === length) {\n                    // unpaired lead\n                    if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                    continue;\n                }\n                // valid lead\n                leadSurrogate = codePoint;\n                continue;\n            }\n            // 2 leads in a row\n            if (codePoint < 0xDC00) {\n                if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                leadSurrogate = codePoint;\n                continue;\n            }\n            // valid surrogate pair\n            codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;\n        } else if (leadSurrogate) // valid bmp char, but last char was a lead\n        {\n            if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n        }\n        leadSurrogate = null;\n        // encode utf8\n        if (codePoint < 0x80) {\n            if ((units -= 1) < 0) break;\n            bytes.push(codePoint);\n        } else if (codePoint < 0x800) {\n            if ((units -= 2) < 0) break;\n            bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);\n        } else if (codePoint < 0x10000) {\n            if ((units -= 3) < 0) break;\n            bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n        } else if (codePoint < 0x110000) {\n            if ((units -= 4) < 0) break;\n            bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n        } else throw new Error(\"Invalid code point\");\n    }\n    return bytes;\n}\nfunction asciiToBytes(str) {\n    var byteArray = [];\n    for(var i = 0; i < str.length; ++i)// Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF);\n    return byteArray;\n}\nfunction utf16leToBytes(str, units) {\n    var c, hi, lo;\n    var byteArray = [];\n    for(var i = 0; i < str.length; ++i){\n        if ((units -= 2) < 0) break;\n        c = str.charCodeAt(i);\n        hi = c >> 8;\n        lo = c % 256;\n        byteArray.push(lo);\n        byteArray.push(hi);\n    }\n    return byteArray;\n}\nfunction base64ToBytes(str) {\n    return base64.toByteArray(base64clean(str));\n}\nfunction blitBuffer(src, dst, offset, length) {\n    for(var i = 0; i < length; ++i){\n        if (i + offset >= dst.length || i >= src.length) break;\n        dst[i + offset] = src[i];\n    }\n    return i;\n}\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance(obj, type) {\n    return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name;\n}\nfunction numberIsNaN(obj) {\n    // For IE11 support\n    return obj !== obj // eslint-disable-line no-self-compare\n    ;\n}\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nvar hexSliceLookupTable = function() {\n    var alphabet = \"0123456789abcdef\";\n    var table = new Array(256);\n    for(var i = 0; i < 16; ++i){\n        var i16 = i * 16;\n        for(var j = 0; j < 16; ++j)table[i16 + j] = alphabet[i] + alphabet[j];\n    }\n    return table;\n}();\n\n},{\"base64-js\":\"8lYRH\",\"ieee754\":\"4fSd4\"}],\"8lYRH\":[function(require,module,exports) {\n\"use strict\";\nexports.byteLength = byteLength;\nexports.toByteArray = toByteArray;\nexports.fromByteArray = fromByteArray;\nvar lookup = [];\nvar revLookup = [];\nvar Arr = typeof Uint8Array !== \"undefined\" ? Uint8Array : Array;\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfor(var i = 0, len = code.length; i < len; ++i){\n    lookup[i] = code[i];\n    revLookup[code.charCodeAt(i)] = i;\n}\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup[\"-\".charCodeAt(0)] = 62;\nrevLookup[\"_\".charCodeAt(0)] = 63;\nfunction getLens(b64) {\n    var len1 = b64.length;\n    if (len1 % 4 > 0) throw new Error(\"Invalid string. Length must be a multiple of 4\");\n    // Trim off extra bytes after placeholder bytes are found\n    // See: https://github.com/beatgammit/base64-js/issues/42\n    var validLen = b64.indexOf(\"=\");\n    if (validLen === -1) validLen = len1;\n    var placeHoldersLen = validLen === len1 ? 0 : 4 - validLen % 4;\n    return [\n        validLen,\n        placeHoldersLen\n    ];\n}\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength(b64) {\n    var lens = getLens(b64);\n    var validLen = lens[0];\n    var placeHoldersLen = lens[1];\n    return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction _byteLength(b64, validLen, placeHoldersLen) {\n    return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction toByteArray(b64) {\n    var tmp;\n    var lens = getLens(b64);\n    var validLen = lens[0];\n    var placeHoldersLen = lens[1];\n    var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n    var curByte = 0;\n    // if there are placeholders, only get up to the last complete 4 chars\n    var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen;\n    var i1;\n    for(i1 = 0; i1 < len2; i1 += 4){\n        tmp = revLookup[b64.charCodeAt(i1)] << 18 | revLookup[b64.charCodeAt(i1 + 1)] << 12 | revLookup[b64.charCodeAt(i1 + 2)] << 6 | revLookup[b64.charCodeAt(i1 + 3)];\n        arr[curByte++] = tmp >> 16 & 0xFF;\n        arr[curByte++] = tmp >> 8 & 0xFF;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    if (placeHoldersLen === 2) {\n        tmp = revLookup[b64.charCodeAt(i1)] << 2 | revLookup[b64.charCodeAt(i1 + 1)] >> 4;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    if (placeHoldersLen === 1) {\n        tmp = revLookup[b64.charCodeAt(i1)] << 10 | revLookup[b64.charCodeAt(i1 + 1)] << 4 | revLookup[b64.charCodeAt(i1 + 2)] >> 2;\n        arr[curByte++] = tmp >> 8 & 0xFF;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    return arr;\n}\nfunction tripletToBase64(num) {\n    return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];\n}\nfunction encodeChunk(uint8, start, end) {\n    var tmp;\n    var output = [];\n    for(var i2 = start; i2 < end; i2 += 3){\n        tmp = (uint8[i2] << 16 & 0xFF0000) + (uint8[i2 + 1] << 8 & 0xFF00) + (uint8[i2 + 2] & 0xFF);\n        output.push(tripletToBase64(tmp));\n    }\n    return output.join(\"\");\n}\nfunction fromByteArray(uint8) {\n    var tmp;\n    var len3 = uint8.length;\n    var extraBytes = len3 % 3 // if we have 1 byte left, pad 2 bytes\n    ;\n    var parts = [];\n    var maxChunkLength = 16383 // must be multiple of 3\n    ;\n    // go through the array every three bytes, we'll deal with trailing stuff later\n    for(var i3 = 0, len2 = len3 - extraBytes; i3 < len2; i3 += maxChunkLength)parts.push(encodeChunk(uint8, i3, i3 + maxChunkLength > len2 ? len2 : i3 + maxChunkLength));\n    // pad the end with zeros, but make sure to not forget the extra bytes\n    if (extraBytes === 1) {\n        tmp = uint8[len3 - 1];\n        parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + \"==\");\n    } else if (extraBytes === 2) {\n        tmp = (uint8[len3 - 2] << 8) + uint8[len3 - 1];\n        parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + \"=\");\n    }\n    return parts.join(\"\");\n}\n\n},{}],\"4fSd4\":[function(require,module,exports) {\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */ exports.read = function(buffer, offset, isLE, mLen, nBytes) {\n    var e, m;\n    var eLen = nBytes * 8 - mLen - 1;\n    var eMax = (1 << eLen) - 1;\n    var eBias = eMax >> 1;\n    var nBits = -7;\n    var i = isLE ? nBytes - 1 : 0;\n    var d = isLE ? -1 : 1;\n    var s = buffer[offset + i];\n    i += d;\n    e = s & (1 << -nBits) - 1;\n    s >>= -nBits;\n    nBits += eLen;\n    for(; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);\n    m = e & (1 << -nBits) - 1;\n    e >>= -nBits;\n    nBits += mLen;\n    for(; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);\n    if (e === 0) e = 1 - eBias;\n    else if (e === eMax) return m ? NaN : (s ? -1 : 1) * Infinity;\n    else {\n        m = m + Math.pow(2, mLen);\n        e = e - eBias;\n    }\n    return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\nexports.write = function(buffer, value, offset, isLE, mLen, nBytes) {\n    var e, m, c;\n    var eLen = nBytes * 8 - mLen - 1;\n    var eMax = (1 << eLen) - 1;\n    var eBias = eMax >> 1;\n    var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n    var i = isLE ? 0 : nBytes - 1;\n    var d = isLE ? 1 : -1;\n    var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n    value = Math.abs(value);\n    if (isNaN(value) || value === Infinity) {\n        m = isNaN(value) ? 1 : 0;\n        e = eMax;\n    } else {\n        e = Math.floor(Math.log(value) / Math.LN2);\n        if (value * (c = Math.pow(2, -e)) < 1) {\n            e--;\n            c *= 2;\n        }\n        if (e + eBias >= 1) value += rt / c;\n        else value += rt * Math.pow(2, 1 - eBias);\n        if (value * c >= 2) {\n            e++;\n            c /= 2;\n        }\n        if (e + eBias >= eMax) {\n            m = 0;\n            e = eMax;\n        } else if (e + eBias >= 1) {\n            m = (value * c - 1) * Math.pow(2, mLen);\n            e = e + eBias;\n        } else {\n            m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n            e = 0;\n        }\n    }\n    for(; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);\n    e = e << mLen | m;\n    eLen += mLen;\n    for(; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);\n    buffer[offset + i - d] |= s * 128;\n};\n\n},{}],\"b5NmQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"aggregate\", ()=>Aggregate);\nparcelHelpers.export(exports, \"bin\", ()=>Bin);\nparcelHelpers.export(exports, \"collect\", ()=>Collect);\nparcelHelpers.export(exports, \"compare\", ()=>Compare);\nparcelHelpers.export(exports, \"countpattern\", ()=>CountPattern);\nparcelHelpers.export(exports, \"cross\", ()=>Cross);\nparcelHelpers.export(exports, \"density\", ()=>Density);\nparcelHelpers.export(exports, \"dotbin\", ()=>DotBin);\nparcelHelpers.export(exports, \"expression\", ()=>Expression);\nparcelHelpers.export(exports, \"extent\", ()=>Extent);\nparcelHelpers.export(exports, \"facet\", ()=>Facet);\nparcelHelpers.export(exports, \"field\", ()=>Field);\nparcelHelpers.export(exports, \"filter\", ()=>Filter);\nparcelHelpers.export(exports, \"flatten\", ()=>Flatten);\nparcelHelpers.export(exports, \"fold\", ()=>Fold);\nparcelHelpers.export(exports, \"formula\", ()=>Formula);\nparcelHelpers.export(exports, \"generate\", ()=>Generate);\nparcelHelpers.export(exports, \"impute\", ()=>Impute);\nparcelHelpers.export(exports, \"joinaggregate\", ()=>JoinAggregate);\nparcelHelpers.export(exports, \"kde\", ()=>KDE);\nparcelHelpers.export(exports, \"key\", ()=>Key);\nparcelHelpers.export(exports, \"load\", ()=>Load);\nparcelHelpers.export(exports, \"lookup\", ()=>Lookup);\nparcelHelpers.export(exports, \"multiextent\", ()=>MultiExtent);\nparcelHelpers.export(exports, \"multivalues\", ()=>MultiValues);\nparcelHelpers.export(exports, \"params\", ()=>Params);\nparcelHelpers.export(exports, \"pivot\", ()=>Pivot);\nparcelHelpers.export(exports, \"prefacet\", ()=>PreFacet);\nparcelHelpers.export(exports, \"project\", ()=>Project);\nparcelHelpers.export(exports, \"proxy\", ()=>Proxy);\nparcelHelpers.export(exports, \"quantile\", ()=>Quantile);\nparcelHelpers.export(exports, \"relay\", ()=>Relay);\nparcelHelpers.export(exports, \"sample\", ()=>Sample);\nparcelHelpers.export(exports, \"sequence\", ()=>Sequence);\nparcelHelpers.export(exports, \"sieve\", ()=>Sieve);\nparcelHelpers.export(exports, \"subflow\", ()=>Subflow);\nparcelHelpers.export(exports, \"timeunit\", ()=>TimeUnit);\nparcelHelpers.export(exports, \"tupleindex\", ()=>TupleIndex);\nparcelHelpers.export(exports, \"values\", ()=>Values);\nparcelHelpers.export(exports, \"window\", ()=>Window);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaStatistics = require(\"vega-statistics\");\nvar _d3Array = require(\"d3-array\");\nvar _vegaTime = require(\"vega-time\");\nfunction multikey(f) {\n    return (x)=>{\n        const n = f.length;\n        let i = 1, k = String(f[0](x));\n        for(; i < n; ++i)k += \"|\" + f[i](x);\n        return k;\n    };\n}\nfunction groupkey(fields) {\n    return !fields || !fields.length ? function() {\n        return \"\";\n    } : fields.length === 1 ? fields[0] : multikey(fields);\n}\nfunction measureName(op, field, as) {\n    return as || op + (!field ? \"\" : \"_\" + field);\n}\nconst noop = ()=>{};\nconst base_op = {\n    init: noop,\n    add: noop,\n    rem: noop,\n    idx: 0\n};\nconst AggregateOps = {\n    values: {\n        init: (m)=>m.cell.store = true,\n        value: (m)=>m.cell.data.values(),\n        idx: -1\n    },\n    count: {\n        value: (m)=>m.cell.num\n    },\n    __count__: {\n        value: (m)=>m.missing + m.valid\n    },\n    missing: {\n        value: (m)=>m.missing\n    },\n    valid: {\n        value: (m)=>m.valid\n    },\n    sum: {\n        init: (m)=>m.sum = 0,\n        value: (m)=>m.sum,\n        add: (m, v)=>m.sum += +v,\n        rem: (m, v)=>m.sum -= v\n    },\n    product: {\n        init: (m)=>m.product = 1,\n        value: (m)=>m.valid ? m.product : undefined,\n        add: (m, v)=>m.product *= v,\n        rem: (m, v)=>m.product /= v\n    },\n    mean: {\n        init: (m)=>m.mean = 0,\n        value: (m)=>m.valid ? m.mean : undefined,\n        add: (m, v)=>(m.mean_d = v - m.mean, m.mean += m.mean_d / m.valid),\n        rem: (m, v)=>(m.mean_d = v - m.mean, m.mean -= m.valid ? m.mean_d / m.valid : m.mean)\n    },\n    average: {\n        value: (m)=>m.valid ? m.mean : undefined,\n        req: [\n            \"mean\"\n        ],\n        idx: 1\n    },\n    variance: {\n        init: (m)=>m.dev = 0,\n        value: (m)=>m.valid > 1 ? m.dev / (m.valid - 1) : undefined,\n        add: (m, v)=>m.dev += m.mean_d * (v - m.mean),\n        rem: (m, v)=>m.dev -= m.mean_d * (v - m.mean),\n        req: [\n            \"mean\"\n        ],\n        idx: 1\n    },\n    variancep: {\n        value: (m)=>m.valid > 1 ? m.dev / m.valid : undefined,\n        req: [\n            \"variance\"\n        ],\n        idx: 2\n    },\n    stdev: {\n        value: (m)=>m.valid > 1 ? Math.sqrt(m.dev / (m.valid - 1)) : undefined,\n        req: [\n            \"variance\"\n        ],\n        idx: 2\n    },\n    stdevp: {\n        value: (m)=>m.valid > 1 ? Math.sqrt(m.dev / m.valid) : undefined,\n        req: [\n            \"variance\"\n        ],\n        idx: 2\n    },\n    stderr: {\n        value: (m)=>m.valid > 1 ? Math.sqrt(m.dev / (m.valid * (m.valid - 1))) : undefined,\n        req: [\n            \"variance\"\n        ],\n        idx: 2\n    },\n    distinct: {\n        value: (m)=>m.cell.data.distinct(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    ci0: {\n        value: (m)=>m.cell.data.ci0(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    ci1: {\n        value: (m)=>m.cell.data.ci1(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    median: {\n        value: (m)=>m.cell.data.q2(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    q1: {\n        value: (m)=>m.cell.data.q1(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    q3: {\n        value: (m)=>m.cell.data.q3(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    min: {\n        init: (m)=>m.min = undefined,\n        value: (m)=>m.min = Number.isNaN(m.min) ? m.cell.data.min(m.get) : m.min,\n        add: (m, v)=>{\n            if (v < m.min || m.min === undefined) m.min = v;\n        },\n        rem: (m, v)=>{\n            if (v <= m.min) m.min = NaN;\n        },\n        req: [\n            \"values\"\n        ],\n        idx: 4\n    },\n    max: {\n        init: (m)=>m.max = undefined,\n        value: (m)=>m.max = Number.isNaN(m.max) ? m.cell.data.max(m.get) : m.max,\n        add: (m, v)=>{\n            if (v > m.max || m.max === undefined) m.max = v;\n        },\n        rem: (m, v)=>{\n            if (v >= m.max) m.max = NaN;\n        },\n        req: [\n            \"values\"\n        ],\n        idx: 4\n    },\n    argmin: {\n        init: (m)=>m.argmin = undefined,\n        value: (m)=>m.argmin || m.cell.data.argmin(m.get),\n        add: (m, v, t)=>{\n            if (v < m.min) m.argmin = t;\n        },\n        rem: (m, v)=>{\n            if (v <= m.min) m.argmin = undefined;\n        },\n        req: [\n            \"min\",\n            \"values\"\n        ],\n        idx: 3\n    },\n    argmax: {\n        init: (m)=>m.argmax = undefined,\n        value: (m)=>m.argmax || m.cell.data.argmax(m.get),\n        add: (m, v, t)=>{\n            if (v > m.max) m.argmax = t;\n        },\n        rem: (m, v)=>{\n            if (v >= m.max) m.argmax = undefined;\n        },\n        req: [\n            \"max\",\n            \"values\"\n        ],\n        idx: 3\n    }\n};\nconst ValidAggregateOps = Object.keys(AggregateOps);\nfunction measure(key, value) {\n    return (out)=>(0, _vegaUtil.extend)({\n            name: key,\n            out: out || key\n        }, base_op, value);\n}\nValidAggregateOps.forEach((key)=>{\n    AggregateOps[key] = measure(key, AggregateOps[key]);\n});\nfunction createMeasure(op, name) {\n    return AggregateOps[op](name);\n}\nfunction compareIndex(a, b) {\n    return a.idx - b.idx;\n}\nfunction resolve(agg) {\n    const map = {};\n    agg.forEach((a)=>map[a.name] = a);\n    const getreqs = (a)=>{\n        if (!a.req) return;\n        a.req.forEach((key)=>{\n            if (!map[key]) getreqs(map[key] = AggregateOps[key]());\n        });\n    };\n    agg.forEach(getreqs);\n    return Object.values(map).sort(compareIndex);\n}\nfunction init() {\n    this.valid = 0;\n    this.missing = 0;\n    this._ops.forEach((op)=>op.init(this));\n}\nfunction add(v, t) {\n    if (v == null || v === \"\") {\n        ++this.missing;\n        return;\n    }\n    if (v !== v) return;\n    ++this.valid;\n    this._ops.forEach((op)=>op.add(this, v, t));\n}\nfunction rem(v, t) {\n    if (v == null || v === \"\") {\n        --this.missing;\n        return;\n    }\n    if (v !== v) return;\n    --this.valid;\n    this._ops.forEach((op)=>op.rem(this, v, t));\n}\nfunction set(t) {\n    this._out.forEach((op)=>t[op.out] = op.value(this));\n    return t;\n}\nfunction compileMeasures(agg, field) {\n    const get1 = field || (0, _vegaUtil.identity), ops = resolve(agg), out = agg.slice().sort(compareIndex);\n    function ctr(cell1) {\n        this._ops = ops;\n        this._out = out;\n        this.cell = cell1;\n        this.init();\n    }\n    ctr.prototype.init = init;\n    ctr.prototype.add = add;\n    ctr.prototype.rem = rem;\n    ctr.prototype.set = set;\n    ctr.prototype.get = get1;\n    ctr.fields = agg.map((op)=>op.out);\n    return ctr;\n}\nfunction TupleStore(key) {\n    this._key = key ? (0, _vegaUtil.field)(key) : (0, _vegaDataflow.tupleid);\n    this.reset();\n}\nconst prototype$1 = TupleStore.prototype;\nprototype$1.reset = function() {\n    this._add = [];\n    this._rem = [];\n    this._ext = null;\n    this._get = null;\n    this._q = null;\n};\nprototype$1.add = function(v) {\n    this._add.push(v);\n};\nprototype$1.rem = function(v) {\n    this._rem.push(v);\n};\nprototype$1.values = function() {\n    this._get = null;\n    if (this._rem.length === 0) return this._add;\n    const a = this._add, r = this._rem, k = this._key, n = a.length, m = r.length, x = Array(n - m), map = {};\n    let i, j, v; // use unique key field to clear removed values\n    for(i = 0; i < m; ++i)map[k(r[i])] = 1;\n    for(i = 0, j = 0; i < n; ++i)if (map[k(v = a[i])]) map[k(v)] = 0;\n    else x[j++] = v;\n    this._rem = [];\n    return this._add = x;\n}; // memoizing statistics methods\nprototype$1.distinct = function(get2) {\n    const v = this.values(), map = {};\n    let n = v.length, count = 0, s;\n    while(--n >= 0){\n        s = get2(v[n]) + \"\";\n        if (!(0, _vegaUtil.hasOwnProperty)(map, s)) {\n            map[s] = 1;\n            ++count;\n        }\n    }\n    return count;\n};\nprototype$1.extent = function(get3) {\n    if (this._get !== get3 || !this._ext) {\n        const v = this.values(), i = (0, _vegaUtil.extentIndex)(v, get3);\n        this._ext = [\n            v[i[0]],\n            v[i[1]]\n        ];\n        this._get = get3;\n    }\n    return this._ext;\n};\nprototype$1.argmin = function(get4) {\n    return this.extent(get4)[0] || {};\n};\nprototype$1.argmax = function(get5) {\n    return this.extent(get5)[1] || {};\n};\nprototype$1.min = function(get6) {\n    const m = this.extent(get6)[0];\n    return m != null ? get6(m) : undefined;\n};\nprototype$1.max = function(get7) {\n    const m = this.extent(get7)[1];\n    return m != null ? get7(m) : undefined;\n};\nprototype$1.quartile = function(get8) {\n    if (this._get !== get8 || !this._q) {\n        this._q = (0, _vegaStatistics.quartiles)(this.values(), get8);\n        this._get = get8;\n    }\n    return this._q;\n};\nprototype$1.q1 = function(get9) {\n    return this.quartile(get9)[0];\n};\nprototype$1.q2 = function(get10) {\n    return this.quartile(get10)[1];\n};\nprototype$1.q3 = function(get11) {\n    return this.quartile(get11)[2];\n};\nprototype$1.ci = function(get12) {\n    if (this._get !== get12 || !this._ci) {\n        this._ci = (0, _vegaStatistics.bootstrapCI)(this.values(), 1000, 0.05, get12);\n        this._get = get12;\n    }\n    return this._ci;\n};\nprototype$1.ci0 = function(get13) {\n    return this.ci(get13)[0];\n};\nprototype$1.ci1 = function(get14) {\n    return this.ci(get14)[1];\n};\n/**\n * Group-by aggregation operator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {Array<function(object): *>} [params.fields] - An array of accessors to aggregate.\n * @param {Array<string>} [params.ops] - An array of strings indicating aggregation operations.\n * @param {Array<string>} [params.as] - An array of output field names for aggregated values.\n * @param {boolean} [params.cross=false] - A flag indicating that the full\n *   cross-product of groupby values should be generated, including empty cells.\n *   If true, the drop parameter is ignored and empty cells are retained.\n * @param {boolean} [params.drop=true] - A flag indicating if empty cells should be removed.\n */ function Aggregate(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n    this._adds = []; // array of added output tuples\n    this._mods = []; // array of modified output tuples\n    this._alen = 0; // number of active added tuples\n    this._mlen = 0; // number of active modified tuples\n    this._drop = true; // should empty aggregation cells be removed\n    this._cross = false; // produce full cross-product of group-by values\n    this._dims = []; // group-by dimension accessors\n    this._dnames = []; // group-by dimension names\n    this._measures = []; // collection of aggregation monoids\n    this._countOnly = false; // flag indicating only count aggregation\n    this._counts = null; // collection of count fields\n    this._prev = null; // previous aggregation cells\n    this._inputs = null; // array of dependent input tuple field names\n    this._outputs = null; // array of output tuple field names\n}\nAggregate.Definition = {\n    \"type\": \"Aggregate\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"ops\",\n            \"type\": \"enum\",\n            \"array\": true,\n            \"values\": ValidAggregateOps\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"drop\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"cross\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"key\",\n            \"type\": \"field\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Aggregate, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const aggr = this, out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), mod = _.modified();\n        aggr.stamp = out.stamp;\n        if (aggr.value && (mod || pulse.modified(aggr._inputs, true))) {\n            aggr._prev = aggr.value;\n            aggr.value = mod ? aggr.init(_) : {};\n            pulse.visit(pulse.SOURCE, (t)=>aggr.add(t));\n        } else {\n            aggr.value = aggr.value || aggr.init(_);\n            pulse.visit(pulse.REM, (t)=>aggr.rem(t));\n            pulse.visit(pulse.ADD, (t)=>aggr.add(t));\n        } // Indicate output fields and return aggregate tuples.\n        out.modifies(aggr._outputs); // Should empty cells be dropped?\n        aggr._drop = _.drop !== false; // If domain cross-product requested, generate empty cells as needed\n        // and ensure that empty cells are not dropped\n        if (_.cross && aggr._dims.length > 1) {\n            aggr._drop = false;\n            aggr.cross();\n        }\n        if (pulse.clean() && aggr._drop) out.clean(true).runAfter(()=>this.clean());\n        return aggr.changes(out);\n    },\n    cross () {\n        const aggr = this, curr = aggr.value, dims = aggr._dnames, vals = dims.map(()=>({})), n = dims.length; // collect all group-by domain values\n        function collect(cells) {\n            let key, i, t, v;\n            for(key in cells){\n                t = cells[key].tuple;\n                for(i = 0; i < n; ++i)vals[i][v = t[dims[i]]] = v;\n            }\n        }\n        collect(aggr._prev);\n        collect(curr); // iterate over key cross-product, create cells as needed\n        function generate(base, tuple, index) {\n            const name = dims[index], v = vals[index++];\n            for(const k in v){\n                const key = base ? base + \"|\" + k : k;\n                tuple[name] = v[k];\n                if (index < n) generate(key, tuple, index);\n                else if (!curr[key]) aggr.cell(key, tuple);\n            }\n        }\n        generate(\"\", {}, 0);\n    },\n    init (_) {\n        // initialize input and output fields\n        const inputs = this._inputs = [], outputs = this._outputs = [], inputMap = {};\n        function inputVisit(get15) {\n            const fields = (0, _vegaUtil.array)((0, _vegaUtil.accessorFields)(get15)), n = fields.length;\n            let i = 0, f;\n            for(; i < n; ++i)if (!inputMap[f = fields[i]]) {\n                inputMap[f] = 1;\n                inputs.push(f);\n            }\n        } // initialize group-by dimensions\n        this._dims = (0, _vegaUtil.array)(_.groupby);\n        this._dnames = this._dims.map((d)=>{\n            const dname = (0, _vegaUtil.accessorName)(d);\n            inputVisit(d);\n            outputs.push(dname);\n            return dname;\n        });\n        this.cellkey = _.key ? _.key : groupkey(this._dims); // initialize aggregate measures\n        this._countOnly = true;\n        this._counts = [];\n        this._measures = [];\n        const fields1 = _.fields || [\n            null\n        ], ops = _.ops || [\n            \"count\"\n        ], as = _.as || [], n1 = fields1.length, map = {};\n        let field, op, m1, mname, outname, i1;\n        if (n1 !== ops.length) (0, _vegaUtil.error)(\"Unmatched number of fields and aggregate ops.\");\n        for(i1 = 0; i1 < n1; ++i1){\n            field = fields1[i1];\n            op = ops[i1];\n            if (field == null && op !== \"count\") (0, _vegaUtil.error)(\"Null aggregate field specified.\");\n            mname = (0, _vegaUtil.accessorName)(field);\n            outname = measureName(op, mname, as[i1]);\n            outputs.push(outname);\n            if (op === \"count\") {\n                this._counts.push(outname);\n                continue;\n            }\n            m1 = map[mname];\n            if (!m1) {\n                inputVisit(field);\n                m1 = map[mname] = [];\n                m1.field = field;\n                this._measures.push(m1);\n            }\n            if (op !== \"count\") this._countOnly = false;\n            m1.push(createMeasure(op, outname));\n        }\n        this._measures = this._measures.map((m)=>compileMeasures(m, m.field));\n        return {}; // aggregation cells (this.value)\n    },\n    // -- Cell Management -----\n    cellkey: groupkey(),\n    cell (key, t) {\n        let cell2 = this.value[key];\n        if (!cell2) {\n            cell2 = this.value[key] = this.newcell(key, t);\n            this._adds[this._alen++] = cell2;\n        } else if (cell2.num === 0 && this._drop && cell2.stamp < this.stamp) {\n            cell2.stamp = this.stamp;\n            this._adds[this._alen++] = cell2;\n        } else if (cell2.stamp < this.stamp) {\n            cell2.stamp = this.stamp;\n            this._mods[this._mlen++] = cell2;\n        }\n        return cell2;\n    },\n    newcell (key, t) {\n        const cell3 = {\n            key: key,\n            num: 0,\n            agg: null,\n            tuple: this.newtuple(t, this._prev && this._prev[key]),\n            stamp: this.stamp,\n            store: false\n        };\n        if (!this._countOnly) {\n            const measures = this._measures, n = measures.length;\n            cell3.agg = Array(n);\n            for(let i = 0; i < n; ++i)cell3.agg[i] = new measures[i](cell3);\n        }\n        if (cell3.store) cell3.data = new TupleStore();\n        return cell3;\n    },\n    newtuple (t, p) {\n        const names = this._dnames, dims = this._dims, n = dims.length, x = {};\n        for(let i = 0; i < n; ++i)x[names[i]] = dims[i](t);\n        return p ? (0, _vegaDataflow.replace)(p.tuple, x) : (0, _vegaDataflow.ingest)(x);\n    },\n    clean () {\n        const cells = this.value;\n        for(const key in cells)if (cells[key].num === 0) delete cells[key];\n    },\n    // -- Process Tuples -----\n    add (t) {\n        const key = this.cellkey(t), cell4 = this.cell(key, t);\n        cell4.num += 1;\n        if (this._countOnly) return;\n        if (cell4.store) cell4.data.add(t);\n        const agg = cell4.agg;\n        for(let i = 0, n = agg.length; i < n; ++i)agg[i].add(agg[i].get(t), t);\n    },\n    rem (t) {\n        const key = this.cellkey(t), cell5 = this.cell(key, t);\n        cell5.num -= 1;\n        if (this._countOnly) return;\n        if (cell5.store) cell5.data.rem(t);\n        const agg = cell5.agg;\n        for(let i = 0, n = agg.length; i < n; ++i)agg[i].rem(agg[i].get(t), t);\n    },\n    celltuple (cell6) {\n        const tuple = cell6.tuple, counts = this._counts; // consolidate stored values\n        if (cell6.store) cell6.data.values();\n         // update tuple properties\n        for(let i = 0, n = counts.length; i < n; ++i)tuple[counts[i]] = cell6.num;\n        if (!this._countOnly) {\n            const agg = cell6.agg;\n            for(let i = 0, n = agg.length; i < n; ++i)agg[i].set(tuple);\n        }\n        return tuple;\n    },\n    changes (out) {\n        const adds = this._adds, mods = this._mods, prev = this._prev, drop = this._drop, add1 = out.add, rem1 = out.rem, mod = out.mod;\n        let cell7, key, i, n;\n        if (prev) for(key in prev){\n            cell7 = prev[key];\n            if (!drop || cell7.num) rem1.push(cell7.tuple);\n        }\n        for(i = 0, n = this._alen; i < n; ++i){\n            add1.push(this.celltuple(adds[i]));\n            adds[i] = null; // for garbage collection\n        }\n        for(i = 0, n = this._mlen; i < n; ++i){\n            cell7 = mods[i];\n            (cell7.num === 0 && drop ? rem1 : mod).push(this.celltuple(cell7));\n            mods[i] = null; // for garbage collection\n        }\n        this._alen = this._mlen = 0; // reset list of active cells\n        this._prev = null;\n        return out;\n    }\n});\nconst EPSILON$1 = 1e-14;\n/**\n * Generates a binning function for discretizing data.\n * @constructor\n * @param {object} params - The parameters for this operator. The\n *   provided values should be valid options for the {@link bin} function.\n * @param {function(object): *} params.field - The data field to bin.\n */ function Bin(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nBin.Definition = {\n    \"type\": \"Bin\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"interval\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"anchor\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"maxbins\",\n            \"type\": \"number\",\n            \"default\": 20\n        },\n        {\n            \"name\": \"base\",\n            \"type\": \"number\",\n            \"default\": 10\n        },\n        {\n            \"name\": \"divide\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"default\": [\n                5,\n                2\n            ]\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"required\": true\n        },\n        {\n            \"name\": \"span\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"steps\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"minstep\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"nice\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"name\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"bin0\",\n                \"bin1\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Bin, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const band = _.interval !== false, bins = this._bins(_), start = bins.start, step = bins.step, as = _.as || [\n            \"bin0\",\n            \"bin1\"\n        ], b0 = as[0], b1 = as[1];\n        let flag;\n        if (_.modified()) {\n            pulse = pulse.reflow(true);\n            flag = pulse.SOURCE;\n        } else flag = pulse.modified((0, _vegaUtil.accessorFields)(_.field)) ? pulse.ADD_MOD : pulse.ADD;\n        pulse.visit(flag, band ? (t)=>{\n            const v = bins(t); // minimum bin value (inclusive)\n            t[b0] = v; // maximum bin value (exclusive)\n            // use convoluted math for better floating point agreement\n            // see https://github.com/vega/vega/issues/830\n            // infinite values propagate through this formula! #2227\n            t[b1] = v == null ? null : start + step * (1 + (v - start) / step);\n        } : (t)=>t[b0] = bins(t));\n        return pulse.modifies(band ? as : b0);\n    },\n    _bins (_) {\n        if (this.value && !_.modified()) return this.value;\n        const field = _.field, bins = (0, _vegaStatistics.bin)(_), step = bins.step;\n        let start = bins.start, stop1 = start + Math.ceil((bins.stop - start) / step) * step, a, d;\n        if ((a = _.anchor) != null) {\n            d = a - (start + step * Math.floor((a - start) / step));\n            start += d;\n            stop1 += d;\n        }\n        const f = function(t) {\n            let v = (0, _vegaUtil.toNumber)(field(t));\n            return v == null ? null : v < start ? -Infinity : v > stop1 ? Infinity : (v = Math.max(start, Math.min(v, stop1 - step)), start + step * Math.floor(EPSILON$1 + (v - start) / step));\n        };\n        f.start = start;\n        f.stop = bins.stop;\n        f.step = step;\n        return this.value = (0, _vegaUtil.accessor)(f, (0, _vegaUtil.accessorFields)(field), _.name || \"bin_\" + (0, _vegaUtil.accessorName)(field));\n    }\n});\nfunction SortedList(idFunc, source1, input) {\n    const $ = idFunc;\n    let data = source1 || [], add2 = input || [], rem2 = {}, cnt = 0;\n    return {\n        add: (t)=>add2.push(t),\n        remove: (t)=>rem2[$(t)] = ++cnt,\n        size: ()=>data.length,\n        data: (compare, resort)=>{\n            if (cnt) {\n                data = data.filter((t)=>!rem2[$(t)]);\n                rem2 = {};\n                cnt = 0;\n            }\n            if (resort && compare) data.sort(compare);\n            if (add2.length) {\n                data = compare ? (0, _vegaUtil.merge)(compare, data, add2.sort(compare)) : data.concat(add2);\n                add2 = [];\n            }\n            return data;\n        }\n    };\n}\n/**\n * Collects all data tuples that pass through this operator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - An optional\n *   comparator function for additionally sorting the collected tuples.\n */ function Collect(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nCollect.Definition = {\n    \"type\": \"Collect\",\n    \"metadata\": {\n        \"source\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Collect, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.ALL), list = SortedList((0, _vegaDataflow.tupleid), this.value, out.materialize(out.ADD).add), sort = _.sort, mod = pulse.changed() || sort && (_.modified(\"sort\") || pulse.modified(sort.fields));\n        out.visit(out.REM, list.remove);\n        this.modified(mod);\n        this.value = out.source = list.data((0, _vegaDataflow.stableCompare)(sort), mod); // propagate tree root if defined\n        if (pulse.source && pulse.source.root) this.value.root = pulse.source.root;\n        return out;\n    }\n});\n/**\n * Generates a comparator function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<string|function>} params.fields - The fields to compare.\n * @param {Array<string>} [params.orders] - The sort orders.\n *   Each entry should be one of \"ascending\" (default) or \"descending\".\n */ function Compare(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$5, params);\n}\n(0, _vegaUtil.inherits)(Compare, (0, _vegaDataflow.Operator));\nfunction update$5(_) {\n    return this.value && !_.modified() ? this.value : (0, _vegaUtil.compare)(_.fields, _.orders);\n}\n/**\n * Count regexp-defined pattern occurrences in a text field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - An accessor for the text field.\n * @param {string} [params.pattern] - RegExp string defining the text pattern.\n * @param {string} [params.case] - One of 'lower', 'upper' or null (mixed) case.\n * @param {string} [params.stopwords] - RegExp string of words to ignore.\n */ function CountPattern(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nCountPattern.Definition = {\n    \"type\": \"CountPattern\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"case\",\n            \"type\": \"enum\",\n            \"values\": [\n                \"upper\",\n                \"lower\",\n                \"mixed\"\n            ],\n            \"default\": \"mixed\"\n        },\n        {\n            \"name\": \"pattern\",\n            \"type\": \"string\",\n            \"default\": '[\\\\w\"]+'\n        },\n        {\n            \"name\": \"stopwords\",\n            \"type\": \"string\",\n            \"default\": \"\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"text\",\n                \"count\"\n            ]\n        }\n    ]\n};\nfunction tokenize(text, tcase, match) {\n    switch(tcase){\n        case \"upper\":\n            text = text.toUpperCase();\n            break;\n        case \"lower\":\n            text = text.toLowerCase();\n            break;\n    }\n    return text.match(match);\n}\n(0, _vegaUtil.inherits)(CountPattern, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const process = (update1)=>(tuple)=>{\n                var tokens = tokenize(get16(tuple), _.case, match) || [], t;\n                for(var i = 0, n = tokens.length; i < n; ++i)if (!stop2.test(t = tokens[i])) update1(t);\n            };\n        const init1 = this._parameterCheck(_, pulse), counts = this._counts, match = this._match, stop2 = this._stop, get16 = _.field, as = _.as || [\n            \"text\",\n            \"count\"\n        ], add3 = process((t)=>counts[t] = 1 + (counts[t] || 0)), rem3 = process((t)=>counts[t] -= 1);\n        if (init1) pulse.visit(pulse.SOURCE, add3);\n        else {\n            pulse.visit(pulse.ADD, add3);\n            pulse.visit(pulse.REM, rem3);\n        }\n        return this._finish(pulse, as); // generate output tuples\n    },\n    _parameterCheck (_, pulse) {\n        let init2 = false;\n        if (_.modified(\"stopwords\") || !this._stop) {\n            this._stop = new RegExp(\"^\" + (_.stopwords || \"\") + \"$\", \"i\");\n            init2 = true;\n        }\n        if (_.modified(\"pattern\") || !this._match) {\n            this._match = new RegExp(_.pattern || \"[\\\\w']+\", \"g\");\n            init2 = true;\n        }\n        if (_.modified(\"field\") || pulse.modified(_.field.fields)) init2 = true;\n        if (init2) this._counts = {};\n        return init2;\n    },\n    _finish (pulse, as) {\n        const counts = this._counts, tuples = this._tuples || (this._tuples = {}), text = as[0], count = as[1], out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        let w, t, c;\n        for(w in counts){\n            t = tuples[w];\n            c = counts[w] || 0;\n            if (!t && c) {\n                tuples[w] = t = (0, _vegaDataflow.ingest)({});\n                t[text] = w;\n                t[count] = c;\n                out.add.push(t);\n            } else if (c === 0) {\n                if (t) out.rem.push(t);\n                counts[w] = null;\n                tuples[w] = null;\n            } else if (t[count] !== c) {\n                t[count] = c;\n                out.mod.push(t);\n            }\n        }\n        return out.modifies(as);\n    }\n});\n/**\n * Perform a cross-product of a tuple stream with itself.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object):boolean} [params.filter] - An optional filter\n *   function for selectively including tuples in the cross product.\n * @param {Array<string>} [params.as] - The names of the output fields.\n */ function Cross(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nCross.Definition = {\n    \"type\": \"Cross\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"filter\",\n            \"type\": \"expr\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"a\",\n                \"b\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Cross, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), as = _.as || [\n            \"a\",\n            \"b\"\n        ], a = as[0], b = as[1], reset = !this.value || pulse.changed(pulse.ADD_REM) || _.modified(\"as\") || _.modified(\"filter\");\n        let data = this.value;\n        if (reset) {\n            if (data) out.rem = data;\n            data = pulse.materialize(pulse.SOURCE).source;\n            out.add = this.value = cross(data, a, b, _.filter || (0, _vegaUtil.truthy));\n        } else out.mod = data;\n        out.source = this.value;\n        return out.modifies(as);\n    }\n});\nfunction cross(input, a, b, filter) {\n    var data = [], t = {}, n = input.length, i = 0, j, left;\n    for(; i < n; ++i){\n        t[a] = left = input[i];\n        for(j = 0; j < n; ++j){\n            t[b] = input[j];\n            if (filter(t)) {\n                data.push((0, _vegaDataflow.ingest)(t));\n                t = {};\n                t[a] = left;\n            }\n        }\n    }\n    return data;\n}\nconst Distributions = {\n    kde: (0, _vegaStatistics.randomKDE),\n    mixture: (0, _vegaStatistics.randomMixture),\n    normal: (0, _vegaStatistics.randomNormal),\n    lognormal: (0, _vegaStatistics.randomLogNormal),\n    uniform: (0, _vegaStatistics.randomUniform)\n};\nconst DISTRIBUTIONS = \"distributions\", FUNCTION = \"function\", FIELD = \"field\";\n/**\n * Parse a parameter object for a probability distribution.\n * @param {object} def - The distribution parameter object.\n * @param {function():Array<object>} - A method for requesting\n *   source data. Used for distributions (such as KDE) that\n *   require sample data points. This method will only be\n *   invoked if the 'from' parameter for a target data source\n *   is not provided. Typically this method returns backing\n *   source data for a Pulse object.\n * @return {object} - The output distribution object.\n */ function parse(def, data) {\n    const func = def[FUNCTION];\n    if (!(0, _vegaUtil.hasOwnProperty)(Distributions, func)) (0, _vegaUtil.error)(\"Unknown distribution function: \" + func);\n    const d = Distributions[func]();\n    for(const name in def){\n        // if data field, extract values\n        if (name === FIELD) d.data((def.from || data()).map(def[name]));\n        else if (name === DISTRIBUTIONS) d[name](def[name].map((_)=>parse(_, data)));\n        else if (typeof d[name] === FUNCTION) d[name](def[name]);\n    }\n    return d;\n}\n/**\n * Grid sample points for a probability density. Given a distribution and\n * a sampling extent, will generate points suitable for plotting either\n * PDF (probability density function) or CDF (cumulative distribution\n * function) curves.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.distribution - The probability distribution. This\n *   is an object parameter dependent on the distribution type.\n * @param {string} [params.method='pdf'] - The distribution method to sample.\n *   One of 'pdf' or 'cdf'.\n * @param {Array<number>} [params.extent] - The [min, max] extent over which\n *   to sample the distribution. This argument is required in most cases, but\n *   can be omitted if the distribution (e.g., 'kde') supports a 'data' method\n *   that returns numerical sample points from which the extent can be deduced.\n * @param {number} [params.minsteps=25] - The minimum number of curve samples\n *   for plotting the density.\n * @param {number} [params.maxsteps=200] - The maximum number of curve samples\n *   for plotting the density.\n * @param {number} [params.steps] - The exact number of curve samples for\n *   plotting the density. If specified, overrides both minsteps and maxsteps\n *   to set an exact number of uniform samples. Useful in conjunction with\n *   a fixed extent to ensure consistent sample points for stacked densities.\n */ function Density(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nconst distributions = [\n    {\n        \"key\": {\n            \"function\": \"normal\"\n        },\n        \"params\": [\n            {\n                \"name\": \"mean\",\n                \"type\": \"number\",\n                \"default\": 0\n            },\n            {\n                \"name\": \"stdev\",\n                \"type\": \"number\",\n                \"default\": 1\n            }\n        ]\n    },\n    {\n        \"key\": {\n            \"function\": \"lognormal\"\n        },\n        \"params\": [\n            {\n                \"name\": \"mean\",\n                \"type\": \"number\",\n                \"default\": 0\n            },\n            {\n                \"name\": \"stdev\",\n                \"type\": \"number\",\n                \"default\": 1\n            }\n        ]\n    },\n    {\n        \"key\": {\n            \"function\": \"uniform\"\n        },\n        \"params\": [\n            {\n                \"name\": \"min\",\n                \"type\": \"number\",\n                \"default\": 0\n            },\n            {\n                \"name\": \"max\",\n                \"type\": \"number\",\n                \"default\": 1\n            }\n        ]\n    },\n    {\n        \"key\": {\n            \"function\": \"kde\"\n        },\n        \"params\": [\n            {\n                \"name\": \"field\",\n                \"type\": \"field\",\n                \"required\": true\n            },\n            {\n                \"name\": \"from\",\n                \"type\": \"data\"\n            },\n            {\n                \"name\": \"bandwidth\",\n                \"type\": \"number\",\n                \"default\": 0\n            }\n        ]\n    }\n];\nconst mixture = {\n    \"key\": {\n        \"function\": \"mixture\"\n    },\n    \"params\": [\n        {\n            \"name\": \"distributions\",\n            \"type\": \"param\",\n            \"array\": true,\n            \"params\": distributions\n        },\n        {\n            \"name\": \"weights\",\n            \"type\": \"number\",\n            \"array\": true\n        }\n    ]\n};\nDensity.Definition = {\n    \"type\": \"Density\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"extent\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"steps\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"minsteps\",\n            \"type\": \"number\",\n            \"default\": 25\n        },\n        {\n            \"name\": \"maxsteps\",\n            \"type\": \"number\",\n            \"default\": 200\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"string\",\n            \"default\": \"pdf\",\n            \"values\": [\n                \"pdf\",\n                \"cdf\"\n            ]\n        },\n        {\n            \"name\": \"distribution\",\n            \"type\": \"param\",\n            \"params\": distributions.concat(mixture)\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"default\": [\n                \"value\",\n                \"density\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Density, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        if (!this.value || pulse.changed() || _.modified()) {\n            const dist = parse(_.distribution, source(pulse)), minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n            let method = _.method || \"pdf\";\n            if (method !== \"pdf\" && method !== \"cdf\") (0, _vegaUtil.error)(\"Invalid density method: \" + method);\n            if (!_.extent && !dist.data) (0, _vegaUtil.error)(\"Missing density extent parameter.\");\n            method = dist[method];\n            const as = _.as || [\n                \"value\",\n                \"density\"\n            ], domain = _.extent || (0, _vegaUtil.extent)(dist.data()), values = (0, _vegaStatistics.sampleCurve)(method, domain, minsteps, maxsteps).map((v)=>{\n                const tuple = {};\n                tuple[as[0]] = v[0];\n                tuple[as[1]] = v[1];\n                return (0, _vegaDataflow.ingest)(tuple);\n            });\n            if (this.value) out.rem = this.value;\n            this.value = out.add = out.source = values;\n        }\n        return out;\n    }\n});\nfunction source(pulse) {\n    return ()=>pulse.materialize(pulse.SOURCE).source;\n}\nfunction fieldNames(fields, as) {\n    if (!fields) return null;\n    return fields.map((f, i)=>as[i] || (0, _vegaUtil.accessorName)(f));\n}\nfunction partition$1(data, groupby, field) {\n    const groups = [], get17 = (f)=>f(t);\n    let map, i, n, t, k, g; // partition data points into groups\n    if (groupby == null) groups.push(data.map(field));\n    else for(map = {}, i = 0, n = data.length; i < n; ++i){\n        t = data[i];\n        k = groupby.map(get17);\n        g = map[k];\n        if (!g) {\n            map[k] = g = [];\n            g.dims = k;\n            groups.push(g);\n        }\n        g.push(field(t));\n    }\n    return groups;\n}\nconst Output = \"bin\";\n/**\n * Dot density binning for dot plot construction.\n * Based on Leland Wilkinson, Dot Plots, The American Statistician, 1999.\n * https://www.cs.uic.edu/~wilkinson/Publications/dotplots.pdf\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to bin.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {number} [params.step] - The step size (bin width) within which dots should be\n *   stacked. Defaults to 1/30 of the extent of the data *field*.\n * @param {boolean} [params.smooth=false] - A boolean flag indicating if dot density\n *   stacks should be smoothed to reduce variance.\n */ function DotBin(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nDotBin.Definition = {\n    \"type\": \"DotBin\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"smooth\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": Output\n        }\n    ]\n};\nconst autostep = (data, field)=>(0, _vegaUtil.span)((0, _vegaUtil.extent)(data, field)) / 30;\n(0, _vegaUtil.inherits)(DotBin, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !(_.modified() || pulse.changed())) return pulse; // early exit\n        const source2 = pulse.materialize(pulse.SOURCE).source, groups = partition$1(pulse.source, _.groupby, (0, _vegaUtil.identity)), smooth = _.smooth || false, field = _.field, step = _.step || autostep(source2, field), sort = (0, _vegaDataflow.stableCompare)((a, b)=>field(a) - field(b)), as = _.as || Output, n = groups.length; // compute dotplot bins per group\n        let min = Infinity, max = -Infinity, i = 0, j;\n        for(; i < n; ++i){\n            const g = groups[i].sort(sort);\n            j = -1;\n            for (const v of (0, _vegaStatistics.dotbin)(g, step, smooth, field)){\n                if (v < min) min = v;\n                if (v > max) max = v;\n                g[++j][as] = v;\n            }\n        }\n        this.value = {\n            start: min,\n            stop: max,\n            step: step\n        };\n        return pulse.reflow(true).modifies(as);\n    }\n});\n/**\n * Wraps an expression function with access to external parameters.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function} params.expr - The expression function. The\n *  function should accept both a datum and a parameter object.\n *  This operator's value will be a new function that wraps the\n *  expression function with access to this operator's parameters.\n */ function Expression(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$4, params);\n    this.modified(true);\n}\n(0, _vegaUtil.inherits)(Expression, (0, _vegaDataflow.Operator));\nfunction update$4(_) {\n    const expr = _.expr;\n    return this.value && !_.modified(\"expr\") ? this.value : (0, _vegaUtil.accessor)((datum)=>expr(datum, _), (0, _vegaUtil.accessorFields)(expr), (0, _vegaUtil.accessorName)(expr));\n}\n/**\n * Computes extents (min/max) for a data field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The field over which to compute extends.\n */ function Extent(params) {\n    (0, _vegaDataflow.Transform).call(this, [\n        undefined,\n        undefined\n    ], params);\n}\nExtent.Definition = {\n    \"type\": \"Extent\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Extent, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const extent = this.value, field = _.field, mod = pulse.changed() || pulse.modified(field.fields) || _.modified(\"field\");\n        let min = extent[0], max = extent[1];\n        if (mod || min == null) {\n            min = Infinity;\n            max = -Infinity;\n        }\n        pulse.visit(mod ? pulse.SOURCE : pulse.ADD, (t)=>{\n            const v = (0, _vegaUtil.toNumber)(field(t));\n            if (v != null) {\n                // NaNs will fail all comparisons!\n                if (v < min) min = v;\n                if (v > max) max = v;\n            }\n        });\n        if (!Number.isFinite(min) || !Number.isFinite(max)) {\n            let name = (0, _vegaUtil.accessorName)(field);\n            if (name) name = ` for field \"${name}\"`;\n            pulse.dataflow.warn(`Infinite extent${name}: [${min}, ${max}]`);\n            min = max = undefined;\n        }\n        this.value = [\n            min,\n            max\n        ];\n    }\n});\n/**\n * Provides a bridge between a parent transform and a target subflow that\n * consumes only a subset of the tuples that pass through the parent.\n * @constructor\n * @param {Pulse} pulse - A pulse to use as the value of this operator.\n * @param {Transform} parent - The parent transform (typically a Facet instance).\n */ function Subflow(pulse, parent) {\n    (0, _vegaDataflow.Operator).call(this, pulse);\n    this.parent = parent;\n    this.count = 0;\n}\n(0, _vegaUtil.inherits)(Subflow, (0, _vegaDataflow.Operator), {\n    /**\n   * Routes pulses from this subflow to a target transform.\n   * @param {Transform} target - A transform that receives the subflow of tuples.\n   */ connect (target) {\n        this.detachSubflow = target.detachSubflow;\n        this.targets().add(target);\n        return target.source = this;\n    },\n    /**\n   * Add an 'add' tuple to the subflow pulse.\n   * @param {Tuple} t - The tuple being added.\n   */ add (t) {\n        this.count += 1;\n        this.value.add.push(t);\n    },\n    /**\n   * Add a 'rem' tuple to the subflow pulse.\n   * @param {Tuple} t - The tuple being removed.\n   */ rem (t) {\n        this.count -= 1;\n        this.value.rem.push(t);\n    },\n    /**\n   * Add a 'mod' tuple to the subflow pulse.\n   * @param {Tuple} t - The tuple being modified.\n   */ mod (t) {\n        this.value.mod.push(t);\n    },\n    /**\n   * Re-initialize this operator's pulse value.\n   * @param {Pulse} pulse - The pulse to copy from.\n   * @see Pulse.init\n   */ init (pulse) {\n        this.value.init(pulse, pulse.NO_SOURCE);\n    },\n    /**\n   * Evaluate this operator. This method overrides the\n   * default behavior to simply return the contained pulse value.\n   * @return {Pulse}\n   */ evaluate () {\n        // assert: this.value.stamp === pulse.stamp\n        return this.value;\n    }\n});\n/**\n * Facets a dataflow into a set of subflows based on a key.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Dataflow, string): Operator} params.subflow - A function\n *   that generates a subflow of operators and returns its root operator.\n * @param {function(object): *} params.key - The key field to facet by.\n */ function Facet(params) {\n    (0, _vegaDataflow.Transform).call(this, {}, params);\n    this._keys = (0, _vegaUtil.fastmap)(); // cache previously calculated key values\n    // keep track of active subflows, use as targets array for listeners\n    // this allows us to limit propagation to only updated subflows\n    const a = this._targets = [];\n    a.active = 0;\n    a.forEach = (f)=>{\n        for(let i = 0, n = a.active; i < n; ++i)f(a[i], i, a);\n    };\n}\n(0, _vegaUtil.inherits)(Facet, (0, _vegaDataflow.Transform), {\n    activate (flow) {\n        this._targets[this._targets.active++] = flow;\n    },\n    // parent argument provided by PreFacet subclass\n    subflow (key, flow, pulse, parent) {\n        const flows = this.value;\n        let sf = (0, _vegaUtil.hasOwnProperty)(flows, key) && flows[key], df, p;\n        if (!sf) {\n            p = parent || (p = this._group[key]) && p.tuple;\n            df = pulse.dataflow;\n            sf = new Subflow(pulse.fork(pulse.NO_SOURCE), this);\n            df.add(sf).connect(flow(df, key, p));\n            flows[key] = sf;\n            this.activate(sf);\n        } else if (sf.value.stamp < pulse.stamp) {\n            sf.init(pulse);\n            this.activate(sf);\n        }\n        return sf;\n    },\n    clean () {\n        const flows = this.value;\n        let detached = 0;\n        for(const key in flows)if (flows[key].count === 0) {\n            const detach = flows[key].detachSubflow;\n            if (detach) detach();\n            delete flows[key];\n            ++detached;\n        }\n         // remove inactive targets from the active targets array\n        if (detached) {\n            const active = this._targets.filter((sf)=>sf && sf.count > 0);\n            this.initTargets(active);\n        }\n    },\n    initTargets (act) {\n        const a = this._targets, n = a.length, m = act ? act.length : 0;\n        let i = 0;\n        for(; i < m; ++i)a[i] = act[i];\n        for(; i < n && a[i] != null; ++i)a[i] = null; // ensure old flows can be garbage collected\n        a.active = m;\n    },\n    transform (_, pulse) {\n        const df = pulse.dataflow, key1 = _.key, flow = _.subflow, cache = this._keys, rekey = _.modified(\"key\"), subflow = (key)=>this.subflow(key, flow, pulse);\n        this._group = _.group || {};\n        this.initTargets(); // reset list of active subflows\n        pulse.visit(pulse.REM, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t), k = cache.get(id);\n            if (k !== undefined) {\n                cache.delete(id);\n                subflow(k).rem(t);\n            }\n        });\n        pulse.visit(pulse.ADD, (t)=>{\n            const k = key1(t);\n            cache.set((0, _vegaDataflow.tupleid)(t), k);\n            subflow(k).add(t);\n        });\n        if (rekey || pulse.modified(key1.fields)) pulse.visit(pulse.MOD, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t), k0 = cache.get(id), k1 = key1(t);\n            if (k0 === k1) subflow(k1).mod(t);\n            else {\n                cache.set(id, k1);\n                subflow(k0).rem(t);\n                subflow(k1).add(t);\n            }\n        });\n        else if (pulse.changed(pulse.MOD)) pulse.visit(pulse.MOD, (t)=>{\n            subflow(cache.get((0, _vegaDataflow.tupleid)(t))).mod(t);\n        });\n        if (rekey) pulse.visit(pulse.REFLOW, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t), k0 = cache.get(id), k1 = key1(t);\n            if (k0 !== k1) {\n                cache.set(id, k1);\n                subflow(k0).rem(t);\n                subflow(k1).add(t);\n            }\n        });\n        if (pulse.clean()) df.runAfter(()=>{\n            this.clean();\n            cache.clean();\n        });\n        else if (cache.empty > df.cleanThreshold) df.runAfter(cache.clean);\n        return pulse;\n    }\n});\n/**\n * Generates one or more field accessor functions.\n * If the 'name' parameter is an array, an array of field accessors\n * will be created and the 'as' parameter will be ignored.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.name - The field name(s) to access.\n * @param {string} params.as - The accessor function name.\n */ function Field(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$3, params);\n}\n(0, _vegaUtil.inherits)(Field, (0, _vegaDataflow.Operator));\nfunction update$3(_) {\n    return this.value && !_.modified() ? this.value : (0, _vegaUtil.isArray)(_.name) ? (0, _vegaUtil.array)(_.name).map((f)=>(0, _vegaUtil.field)(f)) : (0, _vegaUtil.field)(_.name, _.as);\n}\n/**\n * Filters data tuples according to a predicate function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.expr - The predicate expression function\n *   that determines a tuple's filter status. Truthy values pass the filter.\n */ function Filter(params) {\n    (0, _vegaDataflow.Transform).call(this, (0, _vegaUtil.fastmap)(), params);\n}\nFilter.Definition = {\n    \"type\": \"Filter\",\n    \"metadata\": {\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"expr\",\n            \"type\": \"expr\",\n            \"required\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Filter, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const df = pulse.dataflow, cache = this.value, // cache ids of filtered tuples\n        output1 = pulse.fork(), add4 = output1.add, rem4 = output1.rem, mod = output1.mod, test = _.expr;\n        let isMod = true;\n        pulse.visit(pulse.REM, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t);\n            if (!cache.has(id)) rem4.push(t);\n            else cache.delete(id);\n        });\n        pulse.visit(pulse.ADD, (t)=>{\n            if (test(t, _)) add4.push(t);\n            else cache.set((0, _vegaDataflow.tupleid)(t), 1);\n        });\n        function revisit(t) {\n            const id = (0, _vegaDataflow.tupleid)(t), b = test(t, _), s = cache.get(id);\n            if (b && s) {\n                cache.delete(id);\n                add4.push(t);\n            } else if (!b && !s) {\n                cache.set(id, 1);\n                rem4.push(t);\n            } else if (isMod && b && !s) mod.push(t);\n        }\n        pulse.visit(pulse.MOD, revisit);\n        if (_.modified()) {\n            isMod = false;\n            pulse.visit(pulse.REFLOW, revisit);\n        }\n        if (cache.empty > df.cleanThreshold) df.runAfter(cache.clean);\n        return output1;\n    }\n});\n/**\n * Flattens array-typed field values into new data objects.\n * If multiple fields are specified, they are treated as parallel arrays,\n * with output values included for each matching index (or null if missing).\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.fields - An array of field\n *   accessors for the tuple fields that should be flattened.\n * @param {string} [params.index] - Optional output field name for index\n *   value. If unspecified, no index field is included in the output.\n * @param {Array<string>} [params.as] - Output field names for flattened\n *   array fields. Any unspecified fields will use the field name provided\n *   by the fields accessors.\n */ function Flatten(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nFlatten.Definition = {\n    \"type\": \"Flatten\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true\n        },\n        {\n            \"name\": \"index\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Flatten, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), fields = _.fields, as = fieldNames(fields, _.as || []), index = _.index || null, m = as.length; // remove any previous results\n        out.rem = this.value; // generate flattened tuples\n        pulse.visit(pulse.SOURCE, (t)=>{\n            const arrays = fields.map((f)=>f(t)), maxlen = arrays.reduce((l, a)=>Math.max(l, a.length), 0);\n            let i = 0, j, d, v;\n            for(; i < maxlen; ++i){\n                d = (0, _vegaDataflow.derive)(t);\n                for(j = 0; j < m; ++j)d[as[j]] = (v = arrays[j][i]) == null ? null : v;\n                if (index) d[index] = i;\n                out.add.push(d);\n            }\n        });\n        this.value = out.source = out.add;\n        if (index) out.modifies(index);\n        return out.modifies(as);\n    }\n});\n/**\n * Folds one more tuple fields into multiple tuples in which the field\n * name and values are available under new 'key' and 'value' fields.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.fields - An array of field accessors\n *   for the tuple fields that should be folded.\n * @param {Array<string>} [params.as] - Output field names for folded key\n *   and value fields, defaults to ['key', 'value'].\n */ function Fold(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nFold.Definition = {\n    \"type\": \"Fold\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"key\",\n                \"value\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Fold, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), fields = _.fields, fnames = fields.map((0, _vegaUtil.accessorName)), as = _.as || [\n            \"key\",\n            \"value\"\n        ], k = as[0], v = as[1], n = fields.length;\n        out.rem = this.value;\n        pulse.visit(pulse.SOURCE, (t)=>{\n            for(let i = 0, d; i < n; ++i){\n                d = (0, _vegaDataflow.derive)(t);\n                d[k] = fnames[i];\n                d[v] = fields[i](t);\n                out.add.push(d);\n            }\n        });\n        this.value = out.source = out.add;\n        return out.modifies(as);\n    }\n});\n/**\n * Invokes a function for each data tuple and saves the results as a new field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.expr - The formula function to invoke for each tuple.\n * @param {string} params.as - The field name under which to save the result.\n * @param {boolean} [params.initonly=false] - If true, the formula is applied to\n *   added tuples only, and does not update in response to modifications.\n */ function Formula(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nFormula.Definition = {\n    \"type\": \"Formula\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"expr\",\n            \"type\": \"expr\",\n            \"required\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"required\": true\n        },\n        {\n            \"name\": \"initonly\",\n            \"type\": \"boolean\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Formula, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const func = _.expr, as = _.as, mod = _.modified(), flag = _.initonly ? pulse.ADD : mod ? pulse.SOURCE : pulse.modified(func.fields) || pulse.modified(as) ? pulse.ADD_MOD : pulse.ADD;\n        if (mod) // parameters updated, need to reflow\n        pulse = pulse.materialize().reflow(true);\n        if (!_.initonly) pulse.modifies(as);\n        return pulse.visit(flag, (t)=>t[as] = func(t, _));\n    }\n});\n/**\n * Generates data tuples using a provided generator function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Parameters): object} params.generator - A tuple generator\n *   function. This function is given the operator parameters as input.\n *   Changes to any additional parameters will not trigger re-calculation\n *   of previously generated tuples. Only future tuples are affected.\n * @param {number} params.size - The number of tuples to produce.\n */ function Generate(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\n(0, _vegaUtil.inherits)(Generate, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.ALL), gen = _.generator;\n        let data = this.value, num = _.size - data.length, add5, rem5, t;\n        if (num > 0) {\n            // need more tuples, generate and add\n            for(add5 = []; --num >= 0;){\n                add5.push(t = (0, _vegaDataflow.ingest)(gen(_)));\n                data.push(t);\n            }\n            out.add = out.add.length ? out.materialize(out.ADD).add.concat(add5) : add5;\n        } else {\n            // need fewer tuples, remove\n            rem5 = data.slice(0, -num);\n            out.rem = out.rem.length ? out.materialize(out.REM).rem.concat(rem5) : rem5;\n            data = data.slice(-num);\n        }\n        out.source = this.value = data;\n        return out;\n    }\n});\nconst Methods = {\n    value: \"value\",\n    median: (0, _d3Array.median),\n    mean: (0, _d3Array.mean),\n    min: (0, _d3Array.min),\n    max: (0, _d3Array.max)\n};\nconst Empty = [];\n/**\n * Impute missing values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to impute.\n * @param {Array<function(object): *>} [params.groupby] - An array of\n *   accessors to determine series within which to perform imputation.\n * @param {function(object): *} params.key - An accessor for a key value.\n *   Each key value should be unique within a group. New tuples will be\n *   imputed for any key values that are not found within a group.\n * @param {Array<*>} [params.keyvals] - Optional array of required key\n *   values. New tuples will be imputed for any key values that are not\n *   found within a group. In addition, these values will be automatically\n *   augmented with the key values observed in the input data.\n * @param {string} [method='value'] - The imputation method to use. One of\n *   'value', 'mean', 'median', 'max', 'min'.\n * @param {*} [value=0] - The constant value to use for imputation\n *   when using method 'value'.\n */ function Impute(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nImpute.Definition = {\n    \"type\": \"Impute\",\n    \"metadata\": {\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"key\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"keyvals\",\n            \"array\": true\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"enum\",\n            \"default\": \"value\",\n            \"values\": [\n                \"value\",\n                \"mean\",\n                \"median\",\n                \"max\",\n                \"min\"\n            ]\n        },\n        {\n            \"name\": \"value\",\n            \"default\": 0\n        }\n    ]\n};\nfunction getValue(_) {\n    var m = _.method || Methods.value, v;\n    if (Methods[m] == null) (0, _vegaUtil.error)(\"Unrecognized imputation method: \" + m);\n    else if (m === Methods.value) {\n        v = _.value !== undefined ? _.value : 0;\n        return ()=>v;\n    } else return Methods[m];\n}\nfunction getField(_) {\n    const f = _.field;\n    return (t)=>t ? f(t) : NaN;\n}\n(0, _vegaUtil.inherits)(Impute, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var out = pulse.fork(pulse.ALL), impute = getValue(_), field = getField(_), fName = (0, _vegaUtil.accessorName)(_.field), kName = (0, _vegaUtil.accessorName)(_.key), gNames = (_.groupby || []).map((0, _vegaUtil.accessorName)), groups = partition(pulse.source, _.groupby, _.key, _.keyvals), curr = [], prev = this.value, m = groups.domain.length, group, value, gVals, kVal, g, i, j, l, n, t;\n        for(g = 0, l = groups.length; g < l; ++g){\n            group = groups[g];\n            gVals = group.values;\n            value = NaN; // add tuples for missing values\n            for(j = 0; j < m; ++j){\n                if (group[j] != null) continue;\n                kVal = groups.domain[j];\n                t = {\n                    _impute: true\n                };\n                for(i = 0, n = gVals.length; i < n; ++i)t[gNames[i]] = gVals[i];\n                t[kName] = kVal;\n                t[fName] = Number.isNaN(value) ? value = impute(group, field) : value;\n                curr.push((0, _vegaDataflow.ingest)(t));\n            }\n        } // update pulse with imputed tuples\n        if (curr.length) out.add = out.materialize(out.ADD).add.concat(curr);\n        if (prev.length) out.rem = out.materialize(out.REM).rem.concat(prev);\n        this.value = curr;\n        return out;\n    }\n});\nfunction partition(data, groupby, key, keyvals) {\n    var get18 = (f)=>f(t), groups = [], domain = keyvals ? keyvals.slice() : [], kMap = {}, gMap = {}, gVals, gKey, group, i2, j, k2, n, t;\n    domain.forEach((k, i)=>kMap[k] = i + 1);\n    for(i2 = 0, n = data.length; i2 < n; ++i2){\n        t = data[i2];\n        k2 = key(t);\n        j = kMap[k2] || (kMap[k2] = domain.push(k2));\n        gKey = (gVals = groupby ? groupby.map(get18) : Empty) + \"\";\n        if (!(group = gMap[gKey])) {\n            group = gMap[gKey] = [];\n            groups.push(group);\n            group.values = gVals;\n        }\n        group[j - 1] = t;\n    }\n    groups.domain = domain;\n    return groups;\n}\n/**\n * Extend input tuples with aggregate values.\n * Calcuates aggregate values and joins them with the input stream.\n * @constructor\n */ function JoinAggregate(params) {\n    Aggregate.call(this, params);\n}\nJoinAggregate.Definition = {\n    \"type\": \"JoinAggregate\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"ops\",\n            \"type\": \"enum\",\n            \"array\": true,\n            \"values\": ValidAggregateOps\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"key\",\n            \"type\": \"field\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(JoinAggregate, Aggregate, {\n    transform (_, pulse) {\n        const aggr = this, mod = _.modified();\n        let cells; // process all input tuples to calculate aggregates\n        if (aggr.value && (mod || pulse.modified(aggr._inputs, true))) {\n            cells = aggr.value = mod ? aggr.init(_) : {};\n            pulse.visit(pulse.SOURCE, (t)=>aggr.add(t));\n        } else {\n            cells = aggr.value = aggr.value || this.init(_);\n            pulse.visit(pulse.REM, (t)=>aggr.rem(t));\n            pulse.visit(pulse.ADD, (t)=>aggr.add(t));\n        } // update aggregation cells\n        aggr.changes(); // write aggregate values to input tuples\n        pulse.visit(pulse.SOURCE, (t)=>{\n            (0, _vegaUtil.extend)(t, cells[aggr.cellkey(t)].tuple);\n        });\n        return pulse.reflow(mod).modifies(this._outputs);\n    },\n    changes () {\n        const adds = this._adds, mods = this._mods;\n        let i, n;\n        for(i = 0, n = this._alen; i < n; ++i){\n            this.celltuple(adds[i]);\n            adds[i] = null; // for garbage collection\n        }\n        for(i = 0, n = this._mlen; i < n; ++i){\n            this.celltuple(mods[i]);\n            mods[i] = null; // for garbage collection\n        }\n        this._alen = this._mlen = 0; // reset list of active cells\n    }\n});\n/**\n * Compute kernel density estimates (KDE) for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {function(object): *} params.field - An accessor for the data field\n *   to estimate.\n * @param {number} [params.bandwidth=0] - The KDE kernel bandwidth.\n *   If zero or unspecified, the bandwidth is automatically determined.\n * @param {boolean} [params.counts=false] - A boolean flag indicating if the\n *   output values should be probability estimates (false, default) or\n *   smoothed counts (true).\n * @param {string} [params.cumulative=false] - A boolean flag indicating if a\n *   density (false) or cumulative distribution (true) should be generated.\n * @param {Array<number>} [params.extent] - The domain extent over which to\n *   plot the density. If unspecified, the [min, max] data extent is used.\n * @param {string} [params.resolve='independent'] - Indicates how parameters for\n *   multiple densities should be resolved. If \"independent\" (the default), each\n *   density may have its own domain extent and dynamic number of curve sample\n *   steps. If \"shared\", the KDE transform will ensure that all densities are\n *   defined over a shared domain and curve steps, enabling stacking.\n * @param {number} [params.minsteps=25] - The minimum number of curve samples\n *   for plotting the density.\n * @param {number} [params.maxsteps=200] - The maximum number of curve samples\n *   for plotting the density.\n * @param {number} [params.steps] - The exact number of curve samples for\n *   plotting the density. If specified, overrides both minsteps and maxsteps\n *   to set an exact number of uniform samples. Useful in conjunction with\n *   a fixed extent to ensure consistent sample points for stacked densities.\n */ function KDE(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nKDE.Definition = {\n    \"type\": \"KDE\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"cumulative\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"counts\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"bandwidth\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"resolve\",\n            \"type\": \"enum\",\n            \"values\": [\n                \"shared\",\n                \"independent\"\n            ],\n            \"default\": \"independent\"\n        },\n        {\n            \"name\": \"steps\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"minsteps\",\n            \"type\": \"number\",\n            \"default\": 25\n        },\n        {\n            \"name\": \"maxsteps\",\n            \"type\": \"number\",\n            \"default\": 200\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"default\": [\n                \"value\",\n                \"density\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(KDE, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        if (!this.value || pulse.changed() || _.modified()) {\n            const source3 = pulse.materialize(pulse.SOURCE).source, groups = partition$1(source3, _.groupby, _.field), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), bandwidth = _.bandwidth, method = _.cumulative ? \"cdf\" : \"pdf\", as = _.as || [\n                \"value\",\n                \"density\"\n            ], values = [];\n            let domain = _.extent, minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n            if (method !== \"pdf\" && method !== \"cdf\") (0, _vegaUtil.error)(\"Invalid density method: \" + method);\n            if (_.resolve === \"shared\") {\n                if (!domain) domain = (0, _vegaUtil.extent)(source3, _.field);\n                minsteps = maxsteps = _.steps || maxsteps;\n            }\n            groups.forEach((g)=>{\n                const density = (0, _vegaStatistics.randomKDE)(g, bandwidth)[method], scale = _.counts ? g.length : 1, local = domain || (0, _vegaUtil.extent)(g);\n                (0, _vegaStatistics.sampleCurve)(density, local, minsteps, maxsteps).forEach((v)=>{\n                    const t = {};\n                    for(let i = 0; i < names.length; ++i)t[names[i]] = g.dims[i];\n                    t[as[0]] = v[0];\n                    t[as[1]] = v[1] * scale;\n                    values.push((0, _vegaDataflow.ingest)(t));\n                });\n            });\n            if (this.value) out.rem = this.value;\n            this.value = out.add = out.source = values;\n        }\n        return out;\n    }\n});\n/**\n * Generates a key function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<string>} params.fields - The field name(s) for the key function.\n * @param {boolean} params.flat - A boolean flag indicating if the field names\n *  should be treated as flat property names, side-stepping nested field\n *  lookups normally indicated by dot or bracket notation.\n */ function Key(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$2, params);\n}\n(0, _vegaUtil.inherits)(Key, (0, _vegaDataflow.Operator));\nfunction update$2(_) {\n    return this.value && !_.modified() ? this.value : (0, _vegaUtil.key)(_.fields, _.flat);\n}\n/**\n * Load and parse data from an external source. Marshalls parameter\n * values and then invokes the Dataflow request method.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.url - The URL to load from.\n * @param {object} params.format - The data format options.\n */ function Load(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n    this._pending = null;\n}\n(0, _vegaUtil.inherits)(Load, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const df1 = pulse.dataflow;\n        if (this._pending) // update state and return pulse\n        return output(this, pulse, this._pending);\n        if (stop(_)) return pulse.StopPropagation;\n        if (_.values) // parse and ingest values, return output pulse\n        return output(this, pulse, df1.parse(_.values, _.format));\n        else if (_.async) {\n            // return promise for non-blocking async loading\n            const p = df1.request(_.url, _.format).then((res)=>{\n                this._pending = (0, _vegaUtil.array)(res.data);\n                return (df)=>df.touch(this);\n            });\n            return {\n                async: p\n            };\n        } else // return promise for synchronous loading\n        return df1.request(_.url, _.format).then((res)=>output(this, pulse, (0, _vegaUtil.array)(res.data)));\n    }\n});\nfunction stop(_) {\n    return _.modified(\"async\") && !(_.modified(\"values\") || _.modified(\"url\") || _.modified(\"format\"));\n}\nfunction output(op, pulse, data) {\n    data.forEach((0, _vegaDataflow.ingest));\n    const out = pulse.fork(pulse.NO_FIELDS & pulse.NO_SOURCE);\n    out.rem = op.value;\n    op.value = out.source = out.add = data;\n    op._pending = null;\n    if (out.rem.length) out.clean(true);\n    return out;\n}\n/**\n * Extend tuples by joining them with values from a lookup table.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Map} params.index - The lookup table map.\n * @param {Array<function(object): *} params.fields - The fields to lookup.\n * @param {Array<string>} params.as - Output field names for each lookup value.\n * @param {*} [params.default] - A default value to use if lookup fails.\n */ function Lookup(params) {\n    (0, _vegaDataflow.Transform).call(this, {}, params);\n}\nLookup.Definition = {\n    \"type\": \"Lookup\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"index\",\n            \"type\": \"index\",\n            \"params\": [\n                {\n                    \"name\": \"from\",\n                    \"type\": \"data\",\n                    \"required\": true\n                },\n                {\n                    \"name\": \"key\",\n                    \"type\": \"field\",\n                    \"required\": true\n                }\n            ]\n        },\n        {\n            \"name\": \"values\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true\n        },\n        {\n            \"name\": \"default\",\n            \"default\": null\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Lookup, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const keys = _.fields, index = _.index, values = _.values, defaultValue = _.default == null ? null : _.default, reset = _.modified(), n = keys.length;\n        let flag = reset ? pulse.SOURCE : pulse.ADD, out = pulse, as = _.as, set1, m, mods;\n        if (values) {\n            m = values.length;\n            if (n > 1 && !as) (0, _vegaUtil.error)('Multi-field lookup requires explicit \"as\" parameter.');\n            if (as && as.length !== n * m) (0, _vegaUtil.error)('The \"as\" parameter has too few output field names.');\n            as = as || values.map((0, _vegaUtil.accessorName));\n            set1 = function(t) {\n                for(var i = 0, k = 0, j, v; i < n; ++i){\n                    v = index.get(keys[i](t));\n                    if (v == null) for(j = 0; j < m; ++j, ++k)t[as[k]] = defaultValue;\n                    else for(j = 0; j < m; ++j, ++k)t[as[k]] = values[j](v);\n                }\n            };\n        } else {\n            if (!as) (0, _vegaUtil.error)(\"Missing output field names.\");\n            set1 = function(t) {\n                for(var i = 0, v; i < n; ++i){\n                    v = index.get(keys[i](t));\n                    t[as[i]] = v == null ? defaultValue : v;\n                }\n            };\n        }\n        if (reset) out = pulse.reflow(true);\n        else {\n            mods = keys.some((k)=>pulse.modified(k.fields));\n            flag |= mods ? pulse.MOD : 0;\n        }\n        pulse.visit(flag, set1);\n        return out.modifies(as);\n    }\n});\n/**\n * Computes global min/max extents over a collection of extents.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<Array<number>>} params.extents - The input extents.\n */ function MultiExtent(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$1, params);\n}\n(0, _vegaUtil.inherits)(MultiExtent, (0, _vegaDataflow.Operator));\nfunction update$1(_) {\n    if (this.value && !_.modified()) return this.value;\n    const ext = _.extents, n = ext.length;\n    let min = Infinity, max = -Infinity, i, e;\n    for(i = 0; i < n; ++i){\n        e = ext[i];\n        if (e[0] < min) min = e[0];\n        if (e[1] > max) max = e[1];\n    }\n    return [\n        min,\n        max\n    ];\n}\n/**\n * Merge a collection of value arrays.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<Array<*>>} params.values - The input value arrrays.\n */ function MultiValues(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update, params);\n}\n(0, _vegaUtil.inherits)(MultiValues, (0, _vegaDataflow.Operator));\nfunction update(_1) {\n    return this.value && !_1.modified() ? this.value : _1.values.reduce((data, _)=>data.concat(_), []);\n}\n/**\n * Operator whose value is simply its parameter hash. This operator is\n * useful for enabling reactive updates to values of nested objects.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function Params(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Params, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        this.modified(_.modified());\n        this.value = _;\n        return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS); // do not pass tuples\n    }\n});\n/**\n * Aggregate and pivot selected field values to become new fields.\n * This operator is useful to construction cross-tabulations.\n * @constructor\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *  to groupby. These fields act just like groupby fields of an Aggregate transform.\n * @param {function(object): *} params.field - The field to pivot on. The unique\n *  values of this field become new field names in the output stream.\n * @param {function(object): *} params.value - The field to populate pivoted fields.\n *  The aggregate values of this field become the values of the new pivoted fields.\n * @param {string} [params.op] - The aggregation operation for the value field,\n *  applied per cell in the output stream. The default is \"sum\".\n * @param {number} [params.limit] - An optional parameter indicating the maximum\n *  number of pivoted fields to generate. The pivoted field names are sorted in\n *  ascending order prior to enforcing the limit.\n */ function Pivot(params) {\n    Aggregate.call(this, params);\n}\nPivot.Definition = {\n    \"type\": \"Pivot\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"value\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"op\",\n            \"type\": \"enum\",\n            \"values\": ValidAggregateOps,\n            \"default\": \"sum\"\n        },\n        {\n            \"name\": \"limit\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"key\",\n            \"type\": \"field\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Pivot, Aggregate, {\n    _transform: Aggregate.prototype.transform,\n    transform (_, pulse) {\n        return this._transform(aggregateParams(_, pulse), pulse);\n    }\n}); // Shoehorn a pivot transform into an aggregate transform!\n// First collect all unique pivot field values.\n// Then generate aggregate fields for each output pivot field.\nfunction aggregateParams(_, pulse) {\n    const key = _.field, value = _.value, op = (_.op === \"count\" ? \"__count__\" : _.op) || \"sum\", fields = (0, _vegaUtil.accessorFields)(key).concat((0, _vegaUtil.accessorFields)(value)), keys = pivotKeys(key, _.limit || 0, pulse); // if data stream content changes, pivot fields may change\n    // flag parameter modification to ensure re-initialization\n    if (pulse.changed()) _.set(\"__pivot__\", null, null, true);\n    return {\n        key: _.key,\n        groupby: _.groupby,\n        ops: keys.map(()=>op),\n        fields: keys.map((k)=>get(k, key, value, fields)),\n        as: keys.map((k)=>k + \"\"),\n        modified: _.modified.bind(_)\n    };\n} // Generate aggregate field accessor.\n// Output NaN for non-existent values; aggregator will ignore!\nfunction get(k, key, value, fields) {\n    return (0, _vegaUtil.accessor)((d)=>key(d) === k ? value(d) : NaN, fields, k + \"\");\n} // Collect (and optionally limit) all unique pivot values.\nfunction pivotKeys(key, limit, pulse) {\n    const map = {}, list = [];\n    pulse.visit(pulse.SOURCE, (t)=>{\n        const k = key(t);\n        if (!map[k]) {\n            map[k] = 1;\n            list.push(k);\n        }\n    });\n    list.sort((0, _vegaUtil.ascending));\n    return limit ? list.slice(0, limit) : list;\n}\n/**\n * Partitions pre-faceted data into tuple subflows.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Dataflow, string): Operator} params.subflow - A function\n *   that generates a subflow of operators and returns its root operator.\n * @param {function(object): Array<object>} params.field - The field\n *   accessor for an array of subflow tuple objects.\n */ function PreFacet(params) {\n    Facet.call(this, params);\n}\n(0, _vegaUtil.inherits)(PreFacet, Facet, {\n    transform (_2, pulse) {\n        const flow = _2.subflow, field = _2.field, subflow = (t)=>this.subflow((0, _vegaDataflow.tupleid)(t), flow, pulse, t);\n        if (_2.modified(\"field\") || field && pulse.modified((0, _vegaUtil.accessorFields)(field))) (0, _vegaUtil.error)(\"PreFacet does not support field modification.\");\n        this.initTargets(); // reset list of active subflows\n        if (field) {\n            pulse.visit(pulse.MOD, (t)=>{\n                const sf = subflow(t);\n                field(t).forEach((_)=>sf.mod(_));\n            });\n            pulse.visit(pulse.ADD, (t)=>{\n                const sf = subflow(t);\n                field(t).forEach((_)=>sf.add((0, _vegaDataflow.ingest)(_)));\n            });\n            pulse.visit(pulse.REM, (t)=>{\n                const sf = subflow(t);\n                field(t).forEach((_)=>sf.rem(_));\n            });\n        } else {\n            pulse.visit(pulse.MOD, (t)=>subflow(t).mod(t));\n            pulse.visit(pulse.ADD, (t)=>subflow(t).add(t));\n            pulse.visit(pulse.REM, (t)=>subflow(t).rem(t));\n        }\n        if (pulse.clean()) pulse.runAfter(()=>this.clean());\n        return pulse;\n    }\n});\n/**\n * Performs a relational projection, copying selected fields from source\n * tuples to a new set of derived tuples.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *} params.fields - The fields to project,\n *   as an array of field accessors. If unspecified, all fields will be\n *   copied with names unchanged.\n * @param {Array<string>} [params.as] - Output field names for each projected\n *   field. Any unspecified fields will use the field name provided by\n *   the field accessor.\n */ function Project(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nProject.Definition = {\n    \"type\": \"Project\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"array\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Project, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), fields = _.fields, as = fieldNames(_.fields, _.as || []), derive = fields ? (s, t)=>project(s, t, fields, as) : (0, _vegaDataflow.rederive);\n        let lut;\n        if (this.value) lut = this.value;\n        else {\n            pulse = pulse.addAll();\n            lut = this.value = {};\n        }\n        pulse.visit(pulse.REM, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t);\n            out.rem.push(lut[id]);\n            lut[id] = null;\n        });\n        pulse.visit(pulse.ADD, (t)=>{\n            const dt = derive(t, (0, _vegaDataflow.ingest)({}));\n            lut[(0, _vegaDataflow.tupleid)(t)] = dt;\n            out.add.push(dt);\n        });\n        pulse.visit(pulse.MOD, (t)=>{\n            out.mod.push(derive(t, lut[(0, _vegaDataflow.tupleid)(t)]));\n        });\n        return out;\n    }\n});\nfunction project(s, t, fields, as) {\n    for(let i = 0, n = fields.length; i < n; ++i)t[as[i]] = fields[i](s);\n    return t;\n}\n/**\n * Proxy the value of another operator as a pure signal value.\n * Ensures no tuples are propagated.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {*} params.value - The value to proxy, becomes the value of this operator.\n */ function Proxy(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Proxy, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        this.value = _.value;\n        return _.modified(\"value\") ? pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS) : pulse.StopPropagation;\n    }\n});\n/**\n * Generates sample quantile values from an input data stream.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - An accessor for the data field\n *   over which to calculate quantile values.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {Array<number>} [params.probs] - An array of probabilities in\n *   the range (0, 1) for which to compute quantile values. If not specified,\n *   the *step* parameter will be used.\n * @param {Array<number>} [params.step=0.01] - A probability step size for\n *   sampling quantile values. All values from one-half the step size up to\n *   1 (exclusive) will be sampled. This parameter is only used if the\n *   *quantiles* parameter is not provided.\n */ function Quantile(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nQuantile.Definition = {\n    \"type\": \"Quantile\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"probs\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\",\n            \"default\": 0.01\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"default\": [\n                \"prob\",\n                \"value\"\n            ]\n        }\n    ]\n};\nconst EPSILON = 1e-14;\n(0, _vegaUtil.inherits)(Quantile, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), as = _.as || [\n            \"prob\",\n            \"value\"\n        ];\n        if (this.value && !_.modified() && !pulse.changed()) {\n            out.source = this.value;\n            return out;\n        }\n        const source4 = pulse.materialize(pulse.SOURCE).source, groups = partition$1(source4, _.groupby, _.field), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), values = [], step = _.step || 0.01, p = _.probs || (0, _d3Array.range)(step / 2, 1 - EPSILON, step), n = p.length;\n        groups.forEach((g)=>{\n            const q = (0, _vegaStatistics.quantiles)(g, p);\n            for(let i = 0; i < n; ++i){\n                const t = {};\n                for(let i3 = 0; i3 < names.length; ++i3)t[names[i3]] = g.dims[i3];\n                t[as[0]] = p[i];\n                t[as[1]] = q[i];\n                values.push((0, _vegaDataflow.ingest)(t));\n            }\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values;\n        return out;\n    }\n});\n/**\n * Relays a data stream between data processing pipelines.\n * If the derive parameter is set, this transform will create derived\n * copies of observed tuples. This provides derived data streams in which\n * modifications to the tuples do not pollute an upstream data source.\n * @param {object} params - The parameters for this operator.\n * @param {number} [params.derive=false] - Boolean flag indicating if\n *   the transform should make derived copies of incoming tuples.\n * @constructor\n */ function Relay(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Relay, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        let out, lut;\n        if (this.value) lut = this.value;\n        else {\n            out = pulse = pulse.addAll();\n            lut = this.value = {};\n        }\n        if (_.derive) {\n            out = pulse.fork(pulse.NO_SOURCE);\n            pulse.visit(pulse.REM, (t)=>{\n                const id = (0, _vegaDataflow.tupleid)(t);\n                out.rem.push(lut[id]);\n                lut[id] = null;\n            });\n            pulse.visit(pulse.ADD, (t)=>{\n                const dt = (0, _vegaDataflow.derive)(t);\n                lut[(0, _vegaDataflow.tupleid)(t)] = dt;\n                out.add.push(dt);\n            });\n            pulse.visit(pulse.MOD, (t)=>{\n                const dt = lut[(0, _vegaDataflow.tupleid)(t)];\n                for(const k in t){\n                    dt[k] = t[k]; // down stream writes may overwrite re-derived tuples\n                    // conservatively mark all source fields as modified\n                    out.modifies(k);\n                }\n                out.mod.push(dt);\n            });\n        }\n        return out;\n    }\n});\n/**\n * Samples tuples passing through this operator.\n * Uses reservoir sampling to maintain a representative sample.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {number} [params.size=1000] - The maximum number of samples.\n */ function Sample(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n    this.count = 0;\n}\nSample.Definition = {\n    \"type\": \"Sample\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"default\": 1000\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Sample, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), mod = _.modified(\"size\"), num = _.size, map = this.value.reduce((m, t)=>(m[(0, _vegaDataflow.tupleid)(t)] = 1, m), {});\n        let res = this.value, cnt = this.count, cap = 0; // sample reservoir update function\n        function update2(t) {\n            let p, idx;\n            if (res.length < num) res.push(t);\n            else {\n                idx = ~~((cnt + 1) * (0, _vegaStatistics.random)());\n                if (idx < res.length && idx >= cap) {\n                    p = res[idx];\n                    if (map[(0, _vegaDataflow.tupleid)(p)]) out.rem.push(p); // eviction\n                    res[idx] = t;\n                }\n            }\n            ++cnt;\n        }\n        if (pulse.rem.length) {\n            // find all tuples that should be removed, add to output\n            pulse.visit(pulse.REM, (t)=>{\n                const id = (0, _vegaDataflow.tupleid)(t);\n                if (map[id]) {\n                    map[id] = -1;\n                    out.rem.push(t);\n                }\n                --cnt;\n            }); // filter removed tuples out of the sample reservoir\n            res = res.filter((t)=>map[(0, _vegaDataflow.tupleid)(t)] !== -1);\n        }\n        if ((pulse.rem.length || mod) && res.length < num && pulse.source) {\n            // replenish sample if backing data source is available\n            cap = cnt = res.length;\n            pulse.visit(pulse.SOURCE, (t)=>{\n                // update, but skip previously sampled tuples\n                if (!map[(0, _vegaDataflow.tupleid)(t)]) update2(t);\n            });\n            cap = -1;\n        }\n        if (mod && res.length > num) {\n            const n = res.length - num;\n            for(let i = 0; i < n; ++i){\n                map[(0, _vegaDataflow.tupleid)(res[i])] = -1;\n                out.rem.push(res[i]);\n            }\n            res = res.slice(n);\n        }\n        if (pulse.mod.length) // propagate modified tuples in the sample reservoir\n        pulse.visit(pulse.MOD, (t)=>{\n            if (map[(0, _vegaDataflow.tupleid)(t)]) out.mod.push(t);\n        });\n        if (pulse.add.length) // update sample reservoir\n        pulse.visit(pulse.ADD, update2);\n        if (pulse.add.length || cap < 0) // output newly added tuples\n        out.add = res.filter((t)=>!map[(0, _vegaDataflow.tupleid)(t)]);\n        this.count = cnt;\n        this.value = out.source = res;\n        return out;\n    }\n});\n/**\n * Generates data tuples for a specified sequence range of numbers.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {number} params.start - The first number in the sequence.\n * @param {number} params.stop - The last number (exclusive) in the sequence.\n * @param {number} [params.step=1] - The step size between numbers in the sequence.\n */ function Sequence(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nSequence.Definition = {\n    \"type\": \"Sequence\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"start\",\n            \"type\": \"number\",\n            \"required\": true\n        },\n        {\n            \"name\": \"stop\",\n            \"type\": \"number\",\n            \"required\": true\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\",\n            \"default\": 1\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"data\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Sequence, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !_.modified()) return;\n        const out = pulse.materialize().fork(pulse.MOD), as = _.as || \"data\";\n        out.rem = this.value ? pulse.rem.concat(this.value) : pulse.rem;\n        this.value = (0, _d3Array.range)(_.start, _.stop, _.step || 1).map((v)=>{\n            const t = {};\n            t[as] = v;\n            return (0, _vegaDataflow.ingest)(t);\n        });\n        out.add = pulse.add.concat(this.value);\n        return out;\n    }\n});\n/**\n * Propagates a new pulse without any tuples so long as the input\n * pulse contains some added, removed or modified tuples.\n * @param {object} params - The parameters for this operator.\n * @constructor\n */ function Sieve(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n    this.modified(true); // always treat as modified\n}\n(0, _vegaUtil.inherits)(Sieve, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        this.value = pulse.source;\n        return pulse.changed() ? pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS) : pulse.StopPropagation;\n    }\n});\n/**\n * Discretize dates to specific time units.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The data field containing date/time values.\n */ function TimeUnit(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nconst OUTPUT = [\n    \"unit0\",\n    \"unit1\"\n];\nTimeUnit.Definition = {\n    \"type\": \"TimeUnit\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"interval\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"units\",\n            \"type\": \"enum\",\n            \"values\": (0, _vegaTime.TIME_UNITS),\n            \"array\": true\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\",\n            \"default\": 1\n        },\n        {\n            \"name\": \"maxbins\",\n            \"type\": \"number\",\n            \"default\": 40\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"date\",\n            \"array\": true\n        },\n        {\n            \"name\": \"timezone\",\n            \"type\": \"enum\",\n            \"default\": \"local\",\n            \"values\": [\n                \"local\",\n                \"utc\"\n            ]\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": OUTPUT\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(TimeUnit, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const field = _.field, band = _.interval !== false, utc = _.timezone === \"utc\", floor = this._floor(_, pulse), offset = (utc ? (0, _vegaTime.utcInterval) : (0, _vegaTime.timeInterval))(floor.unit).offset, as = _.as || OUTPUT, u0 = as[0], u1 = as[1], step = floor.step;\n        let min = floor.start || Infinity, max = floor.stop || -Infinity, flag = pulse.ADD;\n        if (_.modified() || pulse.modified((0, _vegaUtil.accessorFields)(field))) {\n            pulse = pulse.reflow(true);\n            flag = pulse.SOURCE;\n            min = Infinity;\n            max = -Infinity;\n        }\n        pulse.visit(flag, (t)=>{\n            const v = field(t);\n            let a, b;\n            if (v == null) {\n                t[u0] = null;\n                if (band) t[u1] = null;\n            } else {\n                t[u0] = a = b = floor(v);\n                if (band) t[u1] = b = offset(a, step);\n                if (a < min) min = a;\n                if (b > max) max = b;\n            }\n        });\n        floor.start = min;\n        floor.stop = max;\n        return pulse.modifies(band ? as : u0);\n    },\n    _floor (_, pulse) {\n        const utc = _.timezone === \"utc\"; // get parameters\n        const { units , step  } = _.units ? {\n            units: _.units,\n            step: _.step || 1\n        } : (0, _vegaTime.timeBin)({\n            extent: _.extent || (0, _vegaUtil.extent)(pulse.materialize(pulse.SOURCE).source, _.field),\n            maxbins: _.maxbins\n        }); // check / standardize time units\n        const tunits = (0, _vegaTime.timeUnits)(units), prev = this.value || {}, floor = (utc ? (0, _vegaTime.utcFloor) : (0, _vegaTime.timeFloor))(tunits, step);\n        floor.unit = (0, _vegaUtil.peek)(tunits);\n        floor.units = tunits;\n        floor.step = step;\n        floor.start = prev.start;\n        floor.stop = prev.stop;\n        return this.value = floor;\n    }\n});\n/**\n * An index that maps from unique, string-coerced, field values to tuples.\n * Assumes that the field serves as a unique key with no duplicate values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The field accessor to index.\n */ function TupleIndex(params) {\n    (0, _vegaDataflow.Transform).call(this, (0, _vegaUtil.fastmap)(), params);\n}\n(0, _vegaUtil.inherits)(TupleIndex, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const df = pulse.dataflow, field = _.field, index = this.value, set2 = (t)=>index.set(field(t), t);\n        let mod = true;\n        if (_.modified(\"field\") || pulse.modified(field.fields)) {\n            index.clear();\n            pulse.visit(pulse.SOURCE, set2);\n        } else if (pulse.changed()) {\n            pulse.visit(pulse.REM, (t)=>index.delete(field(t)));\n            pulse.visit(pulse.ADD, set2);\n        } else mod = false;\n        this.modified(mod);\n        if (index.empty > df.cleanThreshold) df.runAfter(index.clean);\n        return pulse.fork();\n    }\n});\n/**\n * Extracts an array of values. Assumes the source data has already been\n * reduced as needed (e.g., by an upstream Aggregate transform).\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The domain field to extract.\n * @param {function(*,*): number} [params.sort] - An optional\n *   comparator function for sorting the values. The comparator will be\n *   applied to backing tuples prior to value extraction.\n */ function Values(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Values, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const run = !this.value || _.modified(\"field\") || _.modified(\"sort\") || pulse.changed() || _.sort && pulse.modified(_.sort.fields);\n        if (run) this.value = (_.sort ? pulse.source.slice().sort((0, _vegaDataflow.stableCompare)(_.sort)) : pulse.source).map(_.field);\n    }\n});\nfunction WindowOp(op, field, param, as) {\n    const fn = WindowOps[op](field, param);\n    return {\n        init: fn.init || (0, _vegaUtil.zero),\n        update: function(w, t) {\n            t[as] = fn.next(w);\n        }\n    };\n}\nconst WindowOps = {\n    row_number: function() {\n        return {\n            next: (w)=>w.index + 1\n        };\n    },\n    rank: function() {\n        let rank;\n        return {\n            init: ()=>rank = 1,\n            next: (w)=>{\n                const i = w.index, data = w.data;\n                return i && w.compare(data[i - 1], data[i]) ? rank = i + 1 : rank;\n            }\n        };\n    },\n    dense_rank: function() {\n        let drank;\n        return {\n            init: ()=>drank = 1,\n            next: (w)=>{\n                const i = w.index, d = w.data;\n                return i && w.compare(d[i - 1], d[i]) ? ++drank : drank;\n            }\n        };\n    },\n    percent_rank: function() {\n        const rank = WindowOps.rank(), next = rank.next;\n        return {\n            init: rank.init,\n            next: (w)=>(next(w) - 1) / (w.data.length - 1)\n        };\n    },\n    cume_dist: function() {\n        let cume;\n        return {\n            init: ()=>cume = 0,\n            next: (w)=>{\n                const d = w.data, c = w.compare;\n                let i = w.index;\n                if (cume < i) {\n                    while(i + 1 < d.length && !c(d[i], d[i + 1]))++i;\n                    cume = i;\n                }\n                return (1 + cume) / d.length;\n            }\n        };\n    },\n    ntile: function(field, num) {\n        num = +num;\n        if (!(num > 0)) (0, _vegaUtil.error)(\"ntile num must be greater than zero.\");\n        const cume = WindowOps.cume_dist(), next = cume.next;\n        return {\n            init: cume.init,\n            next: (w)=>Math.ceil(num * next(w))\n        };\n    },\n    lag: function(field, offset) {\n        offset = +offset || 1;\n        return {\n            next: (w)=>{\n                const i = w.index - offset;\n                return i >= 0 ? field(w.data[i]) : null;\n            }\n        };\n    },\n    lead: function(field, offset) {\n        offset = +offset || 1;\n        return {\n            next: (w)=>{\n                const i = w.index + offset, d = w.data;\n                return i < d.length ? field(d[i]) : null;\n            }\n        };\n    },\n    first_value: function(field) {\n        return {\n            next: (w)=>field(w.data[w.i0])\n        };\n    },\n    last_value: function(field) {\n        return {\n            next: (w)=>field(w.data[w.i1 - 1])\n        };\n    },\n    nth_value: function(field, nth) {\n        nth = +nth;\n        if (!(nth > 0)) (0, _vegaUtil.error)(\"nth_value nth must be greater than zero.\");\n        return {\n            next: (w)=>{\n                const i = w.i0 + (nth - 1);\n                return i < w.i1 ? field(w.data[i]) : null;\n            }\n        };\n    },\n    prev_value: function(field) {\n        let prev;\n        return {\n            init: ()=>prev = null,\n            next: (w)=>{\n                const v = field(w.data[w.index]);\n                return v != null ? prev = v : prev;\n            }\n        };\n    },\n    next_value: function(field) {\n        let v, i;\n        return {\n            init: ()=>(v = null, i = -1),\n            next: (w)=>{\n                const d = w.data;\n                return w.index <= i ? v : (i = find(field, d, w.index)) < 0 ? (i = d.length, v = null) : v = field(d[i]);\n            }\n        };\n    }\n};\nfunction find(field, data, index) {\n    for(let n = data.length; index < n; ++index){\n        const v = field(data[index]);\n        if (v != null) return index;\n    }\n    return -1;\n}\nconst ValidWindowOps = Object.keys(WindowOps);\nfunction WindowState(_3) {\n    const ops = (0, _vegaUtil.array)(_3.ops), fields = (0, _vegaUtil.array)(_3.fields), params = (0, _vegaUtil.array)(_3.params), as = (0, _vegaUtil.array)(_3.as), outputs = this.outputs = [], windows = this.windows = [], inputs = {}, map = {}, counts = [], measures = [];\n    let countOnly = true;\n    function visitInputs(f) {\n        (0, _vegaUtil.array)((0, _vegaUtil.accessorFields)(f)).forEach((_)=>inputs[_] = 1);\n    }\n    visitInputs(_3.sort);\n    ops.forEach((op, i)=>{\n        const field = fields[i], mname = (0, _vegaUtil.accessorName)(field), name = measureName(op, mname, as[i]);\n        visitInputs(field);\n        outputs.push(name); // Window operation\n        if ((0, _vegaUtil.hasOwnProperty)(WindowOps, op)) windows.push(WindowOp(op, fields[i], params[i], name));\n        else {\n            if (field == null && op !== \"count\") (0, _vegaUtil.error)(\"Null aggregate field specified.\");\n            if (op === \"count\") {\n                counts.push(name);\n                return;\n            }\n            countOnly = false;\n            let m = map[mname];\n            if (!m) {\n                m = map[mname] = [];\n                m.field = field;\n                measures.push(m);\n            }\n            m.push(createMeasure(op, name));\n        }\n    });\n    if (counts.length || measures.length) this.cell = cell(measures, counts, countOnly);\n    this.inputs = Object.keys(inputs);\n}\nconst prototype = WindowState.prototype;\nprototype.init = function() {\n    this.windows.forEach((_)=>_.init());\n    if (this.cell) this.cell.init();\n};\nprototype.update = function(w, t) {\n    const cell8 = this.cell, wind = this.windows, data = w.data, m = wind && wind.length;\n    let j;\n    if (cell8) {\n        for(j = w.p0; j < w.i0; ++j)cell8.rem(data[j]);\n        for(j = w.p1; j < w.i1; ++j)cell8.add(data[j]);\n        cell8.set(t);\n    }\n    for(j = 0; j < m; ++j)wind[j].update(w, t);\n};\nfunction cell(measures, counts, countOnly) {\n    measures = measures.map((m)=>compileMeasures(m, m.field));\n    const cell9 = {\n        num: 0,\n        agg: null,\n        store: false,\n        count: counts\n    };\n    if (!countOnly) {\n        var n = measures.length, a = cell9.agg = Array(n), i = 0;\n        for(; i < n; ++i)a[i] = new measures[i](cell9);\n    }\n    if (cell9.store) var store = cell9.data = new TupleStore();\n    cell9.add = function(t) {\n        cell9.num += 1;\n        if (countOnly) return;\n        if (store) store.add(t);\n        for(let i = 0; i < n; ++i)a[i].add(a[i].get(t), t);\n    };\n    cell9.rem = function(t) {\n        cell9.num -= 1;\n        if (countOnly) return;\n        if (store) store.rem(t);\n        for(let i = 0; i < n; ++i)a[i].rem(a[i].get(t), t);\n    };\n    cell9.set = function(t) {\n        let i, n; // consolidate stored values\n        if (store) store.values(); // update tuple properties\n        for(i = 0, n = counts.length; i < n; ++i)t[counts[i]] = cell9.num;\n        if (!countOnly) for(i = 0, n = a.length; i < n; ++i)a[i].set(t);\n    };\n    cell9.init = function() {\n        cell9.num = 0;\n        if (store) store.reset();\n        for(let i = 0; i < n; ++i)a[i].init();\n    };\n    return cell9;\n}\n/**\n * Perform window calculations and write results to the input stream.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator function for sorting tuples within a window.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors by which to partition tuples into separate windows.\n * @param {Array<string>} params.ops - An array of strings indicating window operations to perform.\n * @param {Array<function(object): *>} [params.fields] - An array of accessors\n *   for data fields to use as inputs to window operations.\n * @param {Array<*>} [params.params] - An array of parameter values for window operations.\n * @param {Array<string>} [params.as] - An array of output field names for window operations.\n * @param {Array<number>} [params.frame] - Window frame definition as two-element array.\n * @param {boolean} [params.ignorePeers=false] - If true, base window frame boundaries on row\n *   number alone, ignoring peers with identical sort values. If false (default),\n *   the window boundaries will be adjusted to include peer values.\n */ function Window(params) {\n    (0, _vegaDataflow.Transform).call(this, {}, params);\n    this._mlen = 0;\n    this._mods = [];\n}\nWindow.Definition = {\n    \"type\": \"Window\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"ops\",\n            \"type\": \"enum\",\n            \"array\": true,\n            \"values\": ValidWindowOps.concat(ValidAggregateOps)\n        },\n        {\n            \"name\": \"params\",\n            \"type\": \"number\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"frame\",\n            \"type\": \"number\",\n            \"null\": true,\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                null,\n                0\n            ]\n        },\n        {\n            \"name\": \"ignorePeers\",\n            \"type\": \"boolean\",\n            \"default\": false\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Window, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        this.stamp = pulse.stamp;\n        const mod = _.modified(), cmp = (0, _vegaDataflow.stableCompare)(_.sort), key = groupkey(_.groupby), group = (t)=>this.group(key(t)); // initialize window state\n        let state = this.state;\n        if (!state || mod) state = this.state = new WindowState(_);\n         // partition input tuples\n        if (mod || pulse.modified(state.inputs)) {\n            this.value = {};\n            pulse.visit(pulse.SOURCE, (t)=>group(t).add(t));\n        } else {\n            pulse.visit(pulse.REM, (t)=>group(t).remove(t));\n            pulse.visit(pulse.ADD, (t)=>group(t).add(t));\n        } // perform window calculations for each modified partition\n        for(let i = 0, n = this._mlen; i < n; ++i)processPartition(this._mods[i], state, cmp, _);\n        this._mlen = 0;\n        this._mods = []; // TODO don't reflow everything?\n        return pulse.reflow(mod).modifies(state.outputs);\n    },\n    group (key) {\n        let group = this.value[key];\n        if (!group) {\n            group = this.value[key] = SortedList((0, _vegaDataflow.tupleid));\n            group.stamp = -1;\n        }\n        if (group.stamp < this.stamp) {\n            group.stamp = this.stamp;\n            this._mods[this._mlen++] = group;\n        }\n        return group;\n    }\n});\nfunction processPartition(list, state, cmp, _) {\n    const sort = _.sort, range = sort && !_.ignorePeers, frame = _.frame || [\n        null,\n        0\n    ], data = list.data(cmp), // use cmp for stable sort\n    n = data.length, b = range ? (0, _d3Array.bisector)(sort) : null, w = {\n        i0: 0,\n        i1: 0,\n        p0: 0,\n        p1: 0,\n        index: 0,\n        data: data,\n        compare: sort || (0, _vegaUtil.constant)(-1)\n    };\n    state.init();\n    for(let i = 0; i < n; ++i){\n        setWindow(w, frame, i, n);\n        if (range) adjustRange(w, b);\n        state.update(w, data[i]);\n    }\n}\nfunction setWindow(w, f, i, n) {\n    w.p0 = w.i0;\n    w.p1 = w.i1;\n    w.i0 = f[0] == null ? 0 : Math.max(0, i - Math.abs(f[0]));\n    w.i1 = f[1] == null ? n : Math.min(n, i + Math.abs(f[1]) + 1);\n    w.index = i;\n} // if frame type is 'range', adjust window for peer values\nfunction adjustRange(w, bisect) {\n    const r0 = w.i0, r1 = w.i1 - 1, c = w.compare, d = w.data, n = d.length - 1;\n    if (r0 > 0 && !c(d[r0], d[r0 - 1])) w.i0 = bisect.left(d, d[r0]);\n    if (r1 < n && !c(d[r1], d[r1 + 1])) w.i1 = bisect.right(d, d[r1]);\n}\n\n},{\"vega-util\":\"dPFAY\",\"vega-dataflow\":\"4kvYg\",\"vega-statistics\":\"hZmG3\",\"d3-array\":\"8JMcC\",\"vega-time\":\"hDlOp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hZmG3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bandwidthNRD\", ()=>estimateBandwidth);\nparcelHelpers.export(exports, \"bin\", ()=>bin);\nparcelHelpers.export(exports, \"bootstrapCI\", ()=>bootstrapCI);\nparcelHelpers.export(exports, \"cumulativeLogNormal\", ()=>cumulativeLogNormal);\nparcelHelpers.export(exports, \"cumulativeNormal\", ()=>cumulativeNormal);\nparcelHelpers.export(exports, \"cumulativeUniform\", ()=>cumulativeUniform);\nparcelHelpers.export(exports, \"densityLogNormal\", ()=>densityLogNormal);\nparcelHelpers.export(exports, \"densityNormal\", ()=>densityNormal);\nparcelHelpers.export(exports, \"densityUniform\", ()=>densityUniform);\nparcelHelpers.export(exports, \"dotbin\", ()=>dotbin);\nparcelHelpers.export(exports, \"quantileLogNormal\", ()=>quantileLogNormal);\nparcelHelpers.export(exports, \"quantileNormal\", ()=>quantileNormal);\nparcelHelpers.export(exports, \"quantileUniform\", ()=>quantileUniform);\nparcelHelpers.export(exports, \"quantiles\", ()=>quantiles);\nparcelHelpers.export(exports, \"quartiles\", ()=>quartiles);\nparcelHelpers.export(exports, \"random\", ()=>random);\nparcelHelpers.export(exports, \"randomInteger\", ()=>integer);\nparcelHelpers.export(exports, \"randomKDE\", ()=>kde);\nparcelHelpers.export(exports, \"randomLCG\", ()=>lcg);\nparcelHelpers.export(exports, \"randomLogNormal\", ()=>lognormal);\nparcelHelpers.export(exports, \"randomMixture\", ()=>mixture);\nparcelHelpers.export(exports, \"randomNormal\", ()=>gaussian);\nparcelHelpers.export(exports, \"randomUniform\", ()=>uniform);\nparcelHelpers.export(exports, \"regressionExp\", ()=>exp);\nparcelHelpers.export(exports, \"regressionLinear\", ()=>linear);\nparcelHelpers.export(exports, \"regressionLoess\", ()=>loess);\nparcelHelpers.export(exports, \"regressionLog\", ()=>log);\nparcelHelpers.export(exports, \"regressionPoly\", ()=>poly);\nparcelHelpers.export(exports, \"regressionPow\", ()=>pow);\nparcelHelpers.export(exports, \"regressionQuad\", ()=>quad);\nparcelHelpers.export(exports, \"sampleCurve\", ()=>sampleCurve);\nparcelHelpers.export(exports, \"sampleLogNormal\", ()=>sampleLogNormal);\nparcelHelpers.export(exports, \"sampleNormal\", ()=>sampleNormal);\nparcelHelpers.export(exports, \"sampleUniform\", ()=>sampleUniform);\nparcelHelpers.export(exports, \"setRandom\", ()=>setRandom);\nvar _d3Array = require(\"d3-array\");\nfunction* numbers(values, valueof) {\n    if (valueof == null) {\n        for (let value of values)if (value != null && value !== \"\" && (value = +value) >= value) yield value;\n    } else {\n        let index = -1;\n        for (let value of values){\n            value = valueof(value, ++index, values);\n            if (value != null && value !== \"\" && (value = +value) >= value) yield value;\n        }\n    }\n}\nfunction quantiles(array, p, f) {\n    const values = Float64Array.from(numbers(array, f)); // don't depend on return value from typed array sort call\n    // protects against undefined sort results in Safari (vega/vega-lite#4964)\n    values.sort((0, _d3Array.ascending));\n    return p.map((_)=>(0, _d3Array.quantileSorted)(values, _));\n}\nfunction quartiles(array, f) {\n    return quantiles(array, [\n        0.25,\n        0.50,\n        0.75\n    ], f);\n}\n// Theory, Practice, and Visualization. Wiley.\nfunction estimateBandwidth(array, f) {\n    const n = array.length, d = (0, _d3Array.deviation)(array, f), q = quartiles(array, f), h = (q[2] - q[0]) / 1.34, v = Math.min(d, h) || d || Math.abs(q[0]) || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n}\nfunction bin(_) {\n    // determine range\n    const maxb = _.maxbins || 20, base = _.base || 10, logb = Math.log(base), div = _.divide || [\n        5,\n        2\n    ];\n    let min = _.extent[0], max = _.extent[1], step, level, minstep, v, i, n;\n    const span = _.span || max - min || Math.abs(min) || 1;\n    if (_.step) // if step size is explicitly given, use that\n    step = _.step;\n    else if (_.steps) {\n        // if provided, limit choice to acceptable step sizes\n        v = span / maxb;\n        for(i = 0, n = _.steps.length; i < n && _.steps[i] < v; ++i);\n        step = _.steps[Math.max(0, i - 1)];\n    } else {\n        // else use span to determine step size\n        level = Math.ceil(Math.log(maxb) / logb);\n        minstep = _.minstep || 0;\n        step = Math.max(minstep, Math.pow(base, Math.round(Math.log(span) / logb) - level)); // increase step size if too many bins\n        while(Math.ceil(span / step) > maxb)step *= base;\n         // decrease step size if allowed\n        for(i = 0, n = div.length; i < n; ++i){\n            v = step / div[i];\n            if (v >= minstep && span / v <= maxb) step = v;\n        }\n    } // update precision, min and max\n    v = Math.log(step);\n    const precision = v >= 0 ? 0 : ~~(-v / logb) + 1, eps = Math.pow(base, -precision - 1);\n    if (_.nice || _.nice === undefined) {\n        v = Math.floor(min / step + eps) * step;\n        min = min < v ? v - step : v;\n        max = Math.ceil(max / step) * step;\n    }\n    return {\n        start: min,\n        stop: max === min ? min + step : max,\n        step: step\n    };\n}\nvar random = Math.random;\nfunction setRandom(r) {\n    random = r;\n}\nfunction bootstrapCI(array, samples, alpha, f) {\n    if (!array.length) return [\n        undefined,\n        undefined\n    ];\n    const values = Float64Array.from(numbers(array, f)), n = values.length, m = samples;\n    let a, i, j, mu;\n    for(j = 0, mu = Array(m); j < m; ++j){\n        for(a = 0, i = 0; i < n; ++i)a += values[~~(random() * n)];\n        mu[j] = a / n;\n    }\n    mu.sort((0, _d3Array.ascending));\n    return [\n        (0, _d3Array.quantile)(mu, alpha / 2),\n        (0, _d3Array.quantile)(mu, 1 - alpha / 2)\n    ];\n}\n// Dot density binning for dot plot construction.\n// Based on Leland Wilkinson, Dot Plots, The American Statistician, 1999.\n// https://www.cs.uic.edu/~wilkinson/Publications/dotplots.pdf\nfunction dotbin(array, step, smooth, f) {\n    f = f || ((_)=>_);\n    const n = array.length, v = new Float64Array(n);\n    let i = 0, j = 1, a = f(array[0]), b = a, w = a + step, x;\n    for(; j < n; ++j){\n        x = f(array[j]);\n        if (x >= w) {\n            b = (a + b) / 2;\n            for(; i < j; ++i)v[i] = b;\n            w = x + step;\n            a = x;\n        }\n        b = x;\n    }\n    b = (a + b) / 2;\n    for(; i < j; ++i)v[i] = b;\n    return smooth ? smoothing(v, step + step / 4) : v;\n} // perform smoothing to reduce variance\n// swap points between \"adjacent\" stacks\n// Wilkinson defines adjacent as within step/4 units\nfunction smoothing(v, thresh) {\n    const n = v.length;\n    let a = 0, b = 1, c, d; // get left stack\n    while(v[a] === v[b])++b;\n    while(b < n){\n        // get right stack\n        c = b + 1;\n        while(v[b] === v[c])++c; // are stacks adjacent?\n        // if so, compare sizes and swap as needed\n        if (v[b] - v[b - 1] < thresh) {\n            d = b + (a + c - b - b >> 1);\n            while(d < b)v[d++] = v[b];\n            while(d > b)v[d--] = v[a];\n        } // update left stack indices\n        a = b;\n        b = c;\n    }\n    return v;\n}\nfunction lcg(seed) {\n    // Random numbers using a Linear Congruential Generator with seed value\n    // Uses glibc values from https://en.wikipedia.org/wiki/Linear_congruential_generator\n    return function() {\n        seed = (1103515245 * seed + 12345) % 2147483647;\n        return seed / 2147483647;\n    };\n}\nfunction integer(min, max) {\n    if (max == null) {\n        max = min;\n        min = 0;\n    }\n    let a, b, d;\n    const dist = {\n        min (_) {\n            if (arguments.length) {\n                a = _ || 0;\n                d = b - a;\n                return dist;\n            } else return a;\n        },\n        max (_) {\n            if (arguments.length) {\n                b = _ || 0;\n                d = b - a;\n                return dist;\n            } else return b;\n        },\n        sample () {\n            return a + Math.floor(d * random());\n        },\n        pdf (x) {\n            return x === Math.floor(x) && x >= a && x < b ? 1 / d : 0;\n        },\n        cdf (x) {\n            const v = Math.floor(x);\n            return v < a ? 0 : v >= b ? 1 : (v - a + 1) / d;\n        },\n        icdf (p) {\n            return p >= 0 && p <= 1 ? a - 1 + Math.floor(p * d) : NaN;\n        }\n    };\n    return dist.min(min).max(max);\n}\nconst SQRT2PI = Math.sqrt(2 * Math.PI);\nconst SQRT2 = Math.SQRT2;\nlet nextSample = NaN;\nfunction sampleNormal(mean, stdev) {\n    mean = mean || 0;\n    stdev = stdev == null ? 1 : stdev;\n    let x = 0, y = 0, rds, c;\n    if (nextSample === nextSample) {\n        x = nextSample;\n        nextSample = NaN;\n    } else {\n        do {\n            x = random() * 2 - 1;\n            y = random() * 2 - 1;\n            rds = x * x + y * y;\n        }while (rds === 0 || rds > 1);\n        c = Math.sqrt(-2 * Math.log(rds) / rds); // Box-Muller transform\n        x *= c;\n        nextSample = y * c;\n    }\n    return mean + x * stdev;\n}\nfunction densityNormal(value, mean, stdev) {\n    stdev = stdev == null ? 1 : stdev;\n    const z = (value - (mean || 0)) / stdev;\n    return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI);\n} // Approximation from West (2009)\n// Better Approximations to Cumulative Normal Functions\nfunction cumulativeNormal(value, mean, stdev) {\n    mean = mean || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z = (value - mean) / stdev, Z = Math.abs(z);\n    let cd;\n    if (Z > 37) cd = 0;\n    else {\n        const exp1 = Math.exp(-Z * Z / 2);\n        let sum;\n        if (Z < 7.07106781186547) {\n            sum = 3.52624965998911e-02 * Z + 0.700383064443688;\n            sum = sum * Z + 6.37396220353165;\n            sum = sum * Z + 33.912866078383;\n            sum = sum * Z + 112.079291497871;\n            sum = sum * Z + 221.213596169931;\n            sum = sum * Z + 220.206867912376;\n            cd = exp1 * sum;\n            sum = 8.83883476483184e-02 * Z + 1.75566716318264;\n            sum = sum * Z + 16.064177579207;\n            sum = sum * Z + 86.7807322029461;\n            sum = sum * Z + 296.564248779674;\n            sum = sum * Z + 637.333633378831;\n            sum = sum * Z + 793.826512519948;\n            sum = sum * Z + 440.413735824752;\n            cd = cd / sum;\n        } else {\n            sum = Z + 0.65;\n            sum = Z + 4 / sum;\n            sum = Z + 3 / sum;\n            sum = Z + 2 / sum;\n            sum = Z + 1 / sum;\n            cd = exp1 / sum / 2.506628274631;\n        }\n    }\n    return z > 0 ? 1 - cd : cd;\n} // Approximation of Probit function using inverse error function.\nfunction quantileNormal(p, mean, stdev) {\n    if (p < 0 || p > 1) return NaN;\n    return (mean || 0) + (stdev == null ? 1 : stdev) * SQRT2 * erfinv(2 * p - 1);\n} // Approximate inverse error function. Implementation from \"Approximating\n// the erfinv function\" by Mike Giles, GPU Computing Gems, volume 2, 2010.\n// Ported from Apache Commons Math, http://www.apache.org/licenses/LICENSE-2.0\nfunction erfinv(x) {\n    // beware that the logarithm argument must be\n    // commputed as (1.0 - x) * (1.0 + x),\n    // it must NOT be simplified as 1.0 - x * x as this\n    // would induce rounding errors near the boundaries +/-1\n    let w = -Math.log((1 - x) * (1 + x)), p;\n    if (w < 6.25) {\n        w -= 3.125;\n        p = -0.00000000000000000000364441206401782;\n        p = -0.00000000000000000016850591381820166 + p * w;\n        p = 1.2858480715256400167e-18 + p * w;\n        p = 1.115787767802518096e-17 + p * w;\n        p = -0.0000000000000001333171662854621 + p * w;\n        p = 2.0972767875968561637e-17 + p * w;\n        p = 6.6376381343583238325e-15 + p * w;\n        p = -0.00000000000004054566272975207 + p * w;\n        p = -0.00000000000008151934197605472 + p * w;\n        p = 2.6335093153082322977e-12 + p * w;\n        p = -0.000000000012975133253453532 + p * w;\n        p = -0.00000000005415412054294628 + p * w;\n        p = 1.051212273321532285e-09 + p * w;\n        p = -0.000000004112633980346984 + p * w;\n        p = -0.000000029070369957882005 + p * w;\n        p = 4.2347877827932403518e-07 + p * w;\n        p = -0.0000013654692000834679 + p * w;\n        p = -0.000013882523362786469 + p * w;\n        p = 0.0001867342080340571352 + p * w;\n        p = -0.000740702534166267 + p * w;\n        p = -0.006033670871430149 + p * w;\n        p = 0.24015818242558961693 + p * w;\n        p = 1.6536545626831027356 + p * w;\n    } else if (w < 16.0) {\n        w = Math.sqrt(w) - 3.25;\n        p = 2.2137376921775787049e-09;\n        p = 9.0756561938885390979e-08 + p * w;\n        p = -0.00000027517406297064545 + p * w;\n        p = 1.8239629214389227755e-08 + p * w;\n        p = 1.5027403968909827627e-06 + p * w;\n        p = -0.000004013867526981546 + p * w;\n        p = 2.9234449089955446044e-06 + p * w;\n        p = 1.2475304481671778723e-05 + p * w;\n        p = -0.000047318229009055734 + p * w;\n        p = 6.8284851459573175448e-05 + p * w;\n        p = 2.4031110387097893999e-05 + p * w;\n        p = -0.0003550375203628475 + p * w;\n        p = 0.00095328937973738049703 + p * w;\n        p = -0.0016882755560235047 + p * w;\n        p = 0.0024914420961078508066 + p * w;\n        p = -0.003751208507569241 + p * w;\n        p = 0.005370914553590063617 + p * w;\n        p = 1.0052589676941592334 + p * w;\n        p = 3.0838856104922207635 + p * w;\n    } else if (Number.isFinite(w)) {\n        w = Math.sqrt(w) - 5.0;\n        p = -0.000000000027109920616438573;\n        p = -0.0000000002555641816996525 + p * w;\n        p = 1.5076572693500548083e-09 + p * w;\n        p = -0.000000003789465440126737 + p * w;\n        p = 7.6157012080783393804e-09 + p * w;\n        p = -0.00000001496002662714924 + p * w;\n        p = 2.9147953450901080826e-08 + p * w;\n        p = -0.00000006771199775845234 + p * w;\n        p = 2.2900482228026654717e-07 + p * w;\n        p = -0.00000099298272942317 + p * w;\n        p = 4.5260625972231537039e-06 + p * w;\n        p = -0.00001968177810553167 + p * w;\n        p = 7.5995277030017761139e-05 + p * w;\n        p = -0.00021503011930044477 + p * w;\n        p = -0.00013871931833623122 + p * w;\n        p = 1.0103004648645343977 + p * w;\n        p = 4.8499064014085844221 + p * w;\n    } else p = Infinity;\n    return p * x;\n}\nfunction gaussian(mean, stdev) {\n    let mu, sigma;\n    const dist = {\n        mean (_) {\n            if (arguments.length) {\n                mu = _ || 0;\n                return dist;\n            } else return mu;\n        },\n        stdev (_) {\n            if (arguments.length) {\n                sigma = _ == null ? 1 : _;\n                return dist;\n            } else return sigma;\n        },\n        sample: ()=>sampleNormal(mu, sigma),\n        pdf: (value)=>densityNormal(value, mu, sigma),\n        cdf: (value)=>cumulativeNormal(value, mu, sigma),\n        icdf: (p)=>quantileNormal(p, mu, sigma)\n    };\n    return dist.mean(mean).stdev(stdev);\n}\nfunction kde(support, bandwidth) {\n    const kernel = gaussian();\n    let n = 0;\n    const dist = {\n        data (_) {\n            if (arguments.length) {\n                support = _;\n                n = _ ? _.length : 0;\n                return dist.bandwidth(bandwidth);\n            } else return support;\n        },\n        bandwidth (_) {\n            if (!arguments.length) return bandwidth;\n            bandwidth = _;\n            if (!bandwidth && support) bandwidth = estimateBandwidth(support);\n            return dist;\n        },\n        sample () {\n            return support[~~(random() * n)] + bandwidth * kernel.sample();\n        },\n        pdf (x) {\n            let y = 0, i = 0;\n            for(; i < n; ++i)y += kernel.pdf((x - support[i]) / bandwidth);\n            return y / bandwidth / n;\n        },\n        cdf (x) {\n            let y = 0, i = 0;\n            for(; i < n; ++i)y += kernel.cdf((x - support[i]) / bandwidth);\n            return y / n;\n        },\n        icdf () {\n            throw Error(\"KDE icdf not supported.\");\n        }\n    };\n    return dist.data(support);\n}\nfunction sampleLogNormal(mean, stdev) {\n    mean = mean || 0;\n    stdev = stdev == null ? 1 : stdev;\n    return Math.exp(mean + sampleNormal() * stdev);\n}\nfunction densityLogNormal(value, mean, stdev) {\n    if (value <= 0) return 0;\n    mean = mean || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z = (Math.log(value) - mean) / stdev;\n    return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI * value);\n}\nfunction cumulativeLogNormal(value, mean, stdev) {\n    return cumulativeNormal(Math.log(value), mean, stdev);\n}\nfunction quantileLogNormal(p, mean, stdev) {\n    return Math.exp(quantileNormal(p, mean, stdev));\n}\nfunction lognormal(mean, stdev) {\n    let mu, sigma;\n    const dist = {\n        mean (_) {\n            if (arguments.length) {\n                mu = _ || 0;\n                return dist;\n            } else return mu;\n        },\n        stdev (_) {\n            if (arguments.length) {\n                sigma = _ == null ? 1 : _;\n                return dist;\n            } else return sigma;\n        },\n        sample: ()=>sampleLogNormal(mu, sigma),\n        pdf: (value)=>densityLogNormal(value, mu, sigma),\n        cdf: (value)=>cumulativeLogNormal(value, mu, sigma),\n        icdf: (p)=>quantileLogNormal(p, mu, sigma)\n    };\n    return dist.mean(mean).stdev(stdev);\n}\nfunction mixture(dists, weights) {\n    let m = 0, w1;\n    function normalize(x) {\n        const w = [];\n        let sum = 0, i;\n        for(i = 0; i < m; ++i)sum += w[i] = x[i] == null ? 1 : +x[i];\n        for(i = 0; i < m; ++i)w[i] /= sum;\n        return w;\n    }\n    const dist = {\n        weights (_) {\n            if (arguments.length) {\n                w1 = normalize(weights = _ || []);\n                return dist;\n            }\n            return weights;\n        },\n        distributions (_) {\n            if (arguments.length) {\n                if (_) {\n                    m = _.length;\n                    dists = _;\n                } else {\n                    m = 0;\n                    dists = [];\n                }\n                return dist.weights(weights);\n            }\n            return dists;\n        },\n        sample () {\n            const r = random();\n            let d = dists[m - 1], v = w1[0], i = 0; // first select distribution\n            for(; i < m - 1; v += w1[++i])if (r < v) {\n                d = dists[i];\n                break;\n            }\n             // then sample from it\n            return d.sample();\n        },\n        pdf (x) {\n            let p = 0, i = 0;\n            for(; i < m; ++i)p += w1[i] * dists[i].pdf(x);\n            return p;\n        },\n        cdf (x) {\n            let p = 0, i = 0;\n            for(; i < m; ++i)p += w1[i] * dists[i].cdf(x);\n            return p;\n        },\n        icdf () {\n            throw Error(\"Mixture icdf not supported.\");\n        }\n    };\n    return dist.distributions(dists).weights(weights);\n}\nfunction sampleUniform(min, max) {\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return min + (max - min) * random();\n}\nfunction densityUniform(value, min, max) {\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return value >= min && value <= max ? 1 / (max - min) : 0;\n}\nfunction cumulativeUniform(value, min, max) {\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return value < min ? 0 : value > max ? 1 : (value - min) / (max - min);\n}\nfunction quantileUniform(p, min, max) {\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return p >= 0 && p <= 1 ? min + p * (max - min) : NaN;\n}\nfunction uniform(min, max) {\n    let a, b;\n    const dist = {\n        min (_) {\n            if (arguments.length) {\n                a = _ || 0;\n                return dist;\n            } else return a;\n        },\n        max (_) {\n            if (arguments.length) {\n                b = _ == null ? 1 : _;\n                return dist;\n            } else return b;\n        },\n        sample: ()=>sampleUniform(a, b),\n        pdf: (value)=>densityUniform(value, a, b),\n        cdf: (value)=>cumulativeUniform(value, a, b),\n        icdf: (p)=>quantileUniform(p, a, b)\n    };\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return dist.min(min).max(max);\n}\n// Ordinary Least Squares\nfunction ols(uX, uY, uXY, uX2) {\n    const delta = uX2 - uX * uX, slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta, intercept = uY - slope * uX;\n    return [\n        intercept,\n        slope\n    ];\n}\nfunction points(data, x, y, sort) {\n    data = data.filter((d)=>{\n        let u = x(d), v = y(d);\n        return u != null && (u = +u) >= u && v != null && (v = +v) >= v;\n    });\n    if (sort) data.sort((a, b)=>x(a) - x(b));\n    const n = data.length, X = new Float64Array(n), Y = new Float64Array(n); // extract values, calculate means\n    let i = 0, ux = 0, uy = 0, xv, yv, d1;\n    for (d1 of data){\n        X[i] = xv = +x(d1);\n        Y[i] = yv = +y(d1);\n        ++i;\n        ux += (xv - ux) / i;\n        uy += (yv - uy) / i;\n    } // mean center the data\n    for(i = 0; i < n; ++i){\n        X[i] -= ux;\n        Y[i] -= uy;\n    }\n    return [\n        X,\n        Y,\n        ux,\n        uy\n    ];\n}\nfunction visitPoints(data, x, y, callback) {\n    let i = -1, u, v;\n    for (const d of data){\n        u = x(d);\n        v = y(d);\n        if (u != null && (u = +u) >= u && v != null && (v = +v) >= v) callback(u, v, ++i);\n    }\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction rSquared(data, x, y, uY, predict) {\n    let SSE = 0, SST = 0;\n    visitPoints(data, x, y, (dx, dy)=>{\n        const sse = dy - predict(dx), sst = dy - uY;\n        SSE += sse * sse;\n        SST += sst * sst;\n    });\n    return 1 - SSE / SST;\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction linear(data, x1, y) {\n    let X = 0, Y = 0, XY = 0, X2 = 0, n = 0;\n    visitPoints(data, x1, y, (dx, dy)=>{\n        ++n;\n        X += (dx - X) / n;\n        Y += (dy - Y) / n;\n        XY += (dx * dy - XY) / n;\n        X2 += (dx * dx - X2) / n;\n    });\n    const coef = ols(X, Y, XY, X2), predict = (x)=>coef[0] + coef[1] * x;\n    return {\n        coef: coef,\n        predict: predict,\n        rSquared: rSquared(data, x1, y, Y, predict)\n    };\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction log(data, x2, y) {\n    let X = 0, Y = 0, XY = 0, X2 = 0, n = 0;\n    visitPoints(data, x2, y, (dx, dy)=>{\n        ++n;\n        dx = Math.log(dx);\n        X += (dx - X) / n;\n        Y += (dy - Y) / n;\n        XY += (dx * dy - XY) / n;\n        X2 += (dx * dx - X2) / n;\n    });\n    const coef = ols(X, Y, XY, X2), predict = (x)=>coef[0] + coef[1] * Math.log(x);\n    return {\n        coef: coef,\n        predict: predict,\n        rSquared: rSquared(data, x2, y, Y, predict)\n    };\n}\nfunction exp(data, x3, y) {\n    // eslint-disable-next-line no-unused-vars\n    const [xv, yv, ux, uy] = points(data, x3, y);\n    let YL = 0, XY = 0, XYL = 0, X2Y = 0, n = 0, dx, ly, xy;\n    visitPoints(data, x3, y, (_, dy)=>{\n        dx = xv[n++];\n        ly = Math.log(dy);\n        xy = dx * dy;\n        YL += (dy * ly - YL) / n;\n        XY += (xy - XY) / n;\n        XYL += (xy * ly - XYL) / n;\n        X2Y += (dx * xy - X2Y) / n;\n    });\n    const [c0, c1] = ols(XY / uy, YL / uy, XYL / uy, X2Y / uy), predict = (x)=>Math.exp(c0 + c1 * (x - ux));\n    return {\n        coef: [\n            Math.exp(c0 - c1 * ux),\n            c1\n        ],\n        predict: predict,\n        rSquared: rSquared(data, x3, y, uy, predict)\n    };\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction pow(data, x4, y) {\n    let X = 0, Y = 0, XY = 0, X2 = 0, YS = 0, n = 0;\n    visitPoints(data, x4, y, (dx, dy)=>{\n        const lx = Math.log(dx), ly = Math.log(dy);\n        ++n;\n        X += (lx - X) / n;\n        Y += (ly - Y) / n;\n        XY += (lx * ly - XY) / n;\n        X2 += (lx * lx - X2) / n;\n        YS += (dy - YS) / n;\n    });\n    const coef = ols(X, Y, XY, X2), predict = (x)=>coef[0] * Math.pow(x, coef[1]);\n    coef[0] = Math.exp(coef[0]);\n    return {\n        coef: coef,\n        predict: predict,\n        rSquared: rSquared(data, x4, y, YS, predict)\n    };\n}\nfunction quad(data, x5, y) {\n    const [xv, yv, ux, uy] = points(data, x5, y), n = xv.length;\n    let X2 = 0, X3 = 0, X4 = 0, XY = 0, X2Y = 0, i, dx, dy, x2;\n    for(i = 0; i < n;){\n        dx = xv[i];\n        dy = yv[i++];\n        x2 = dx * dx;\n        X2 += (x2 - X2) / i;\n        X3 += (x2 * dx - X3) / i;\n        X4 += (x2 * x2 - X4) / i;\n        XY += (dx * dy - XY) / i;\n        X2Y += (x2 * dy - X2Y) / i;\n    }\n    const X2X2 = X4 - X2 * X2, d = X2 * X2X2 - X3 * X3, a = (X2Y * X2 - XY * X3) / d, b = (XY * X2X2 - X2Y * X3) / d, c = -a * X2, predict = (x)=>{\n        x = x - ux;\n        return a * x * x + b * x + c + uy;\n    }; // transform coefficients back from mean-centered space\n    return {\n        coef: [\n            c - b * ux + a * ux * ux + uy,\n            b - 2 * a * ux,\n            a\n        ],\n        predict: predict,\n        rSquared: rSquared(data, x5, y, uy, predict)\n    };\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\n// ... which was adapted from regression-js by Tom Alexander\n// Source: https://github.com/Tom-Alexander/regression-js/blob/master/src/regression.js#L246\n// License: https://github.com/Tom-Alexander/regression-js/blob/master/LICENSE\nfunction poly(data, x6, y1, order) {\n    // use more efficient methods for lower orders\n    if (order === 1) return linear(data, x6, y1);\n    if (order === 2) return quad(data, x6, y1);\n    const [xv, yv, ux, uy] = points(data, x6, y1), n = xv.length, lhs = [], rhs = [], k = order + 1;\n    let i, j, l, v, c;\n    for(i = 0; i < k; ++i){\n        for(l = 0, v = 0; l < n; ++l)v += Math.pow(xv[l], i) * yv[l];\n        lhs.push(v);\n        c = new Float64Array(k);\n        for(j = 0; j < k; ++j){\n            for(l = 0, v = 0; l < n; ++l)v += Math.pow(xv[l], i + j);\n            c[j] = v;\n        }\n        rhs.push(c);\n    }\n    rhs.push(lhs);\n    const coef = gaussianElimination(rhs), predict = (x)=>{\n        x -= ux;\n        let y = uy + coef[0] + coef[1] * x + coef[2] * x * x;\n        for(i = 3; i < k; ++i)y += coef[i] * Math.pow(x, i);\n        return y;\n    };\n    return {\n        coef: uncenter(k, coef, -ux, uy),\n        predict: predict,\n        rSquared: rSquared(data, x6, y1, uy, predict)\n    };\n}\nfunction uncenter(k, a, x, y) {\n    const z = Array(k);\n    let i, j, v, c; // initialize to zero\n    for(i = 0; i < k; ++i)z[i] = 0; // polynomial expansion\n    for(i = k - 1; i >= 0; --i){\n        v = a[i];\n        c = 1;\n        z[i] += v;\n        for(j = 1; j <= i; ++j){\n            c *= (i + 1 - j) / j; // binomial coefficent\n            z[i - j] += v * Math.pow(x, j) * c;\n        }\n    } // bias term\n    z[0] += y;\n    return z;\n} // Given an array for a two-dimensional matrix and the polynomial order,\n// solve A * x = b using Gaussian elimination.\nfunction gaussianElimination(matrix) {\n    const n = matrix.length - 1, coef = [];\n    let i, j, k, r, t;\n    for(i = 0; i < n; ++i){\n        r = i; // max row\n        for(j = i + 1; j < n; ++j)if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) r = j;\n        for(k = i; k < n + 1; ++k){\n            t = matrix[k][i];\n            matrix[k][i] = matrix[k][r];\n            matrix[k][r] = t;\n        }\n        for(j = i + 1; j < n; ++j)for(k = n; k >= i; k--)matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i];\n    }\n    for(j = n - 1; j >= 0; --j){\n        t = 0;\n        for(k = j + 1; k < n; ++k)t += matrix[k][j] * coef[k];\n        coef[j] = (matrix[n][j] - t) / matrix[j][j];\n    }\n    return coef;\n}\nconst maxiters = 2, epsilon = 1e-12; // Adapted from science.js by Jason Davies\n// Source: https://github.com/jasondavies/science.js/blob/master/src/stats/loess.js\n// License: https://github.com/jasondavies/science.js/blob/master/LICENSE\nfunction loess(data, x, y, bandwidth) {\n    const [xv, yv, ux, uy] = points(data, x, y, true), n = xv.length, bw = Math.max(2, ~~(bandwidth * n)), // # nearest neighbors\n    yhat = new Float64Array(n), residuals = new Float64Array(n), robustWeights = new Float64Array(n).fill(1);\n    for(let iter = -1; ++iter <= maxiters;){\n        const interval = [\n            0,\n            bw - 1\n        ];\n        for(let i = 0; i < n; ++i){\n            const dx = xv[i], i0 = interval[0], i1 = interval[1], edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;\n            let W = 0, X = 0, Y = 0, XY = 0, X2 = 0;\n            const denom = 1 / Math.abs(xv[edge] - dx || 1); // avoid singularity!\n            for(let k = i0; k <= i1; ++k){\n                const xk = xv[k], yk = yv[k], w = tricube(Math.abs(dx - xk) * denom) * robustWeights[k], xkw = xk * w;\n                W += w;\n                X += xkw;\n                Y += yk * w;\n                XY += yk * xkw;\n                X2 += xk * xkw;\n            } // linear regression fit\n            const [a, b] = ols(X / W, Y / W, XY / W, X2 / W);\n            yhat[i] = a + b * dx;\n            residuals[i] = Math.abs(yv[i] - yhat[i]);\n            updateInterval(xv, i + 1, interval);\n        }\n        if (iter === maxiters) break;\n        const medianResidual = (0, _d3Array.median)(residuals);\n        if (Math.abs(medianResidual) < epsilon) break;\n        for(let i1 = 0, arg, w; i1 < n; ++i1){\n            arg = residuals[i1] / (6 * medianResidual); // default to epsilon (rather than zero) for large deviations\n            // keeping weights tiny but non-zero prevents singularites\n            robustWeights[i1] = arg >= 1 ? epsilon : (w = 1 - arg * arg) * w;\n        }\n    }\n    return output(xv, yhat, ux, uy);\n} // weighting kernel for local regression\nfunction tricube(x) {\n    return (x = 1 - x * x * x) * x * x;\n} // advance sliding window interval of nearest neighbors\nfunction updateInterval(xv, i, interval) {\n    const val = xv[i];\n    let left = interval[0], right = interval[1] + 1;\n    if (right >= xv.length) return; // step right if distance to new right edge is <= distance to old left edge\n    // step when distance is equal to ensure movement over duplicate x values\n    while(i > left && xv[right] - val <= val - xv[left]){\n        interval[0] = ++left;\n        interval[1] = right;\n        ++right;\n    }\n} // generate smoothed output points\n// average points with repeated x values\nfunction output(xv, yhat, ux, uy) {\n    const n = xv.length, out = [];\n    let i = 0, cnt = 0, prev = [], v;\n    for(; i < n; ++i){\n        v = xv[i] + ux;\n        if (prev[0] === v) // average output values via online update\n        prev[1] += (yhat[i] - prev[1]) / ++cnt;\n        else {\n            // add new output point\n            cnt = 0;\n            prev[1] += uy;\n            prev = [\n                v,\n                yhat[i]\n            ];\n            out.push(prev);\n        }\n    }\n    prev[1] += uy;\n    return out;\n}\n// subdivide up to accuracy of 0.5 degrees\nconst MIN_RADIANS = 0.5 * Math.PI / 180; // Adaptively sample an interpolated function over a domain extent\nfunction sampleCurve(f, extent, minSteps, maxSteps) {\n    minSteps = minSteps || 25;\n    maxSteps = Math.max(minSteps, maxSteps || 200);\n    const point = (x)=>[\n            x,\n            f(x)\n        ], minX = extent[0], maxX = extent[1], span = maxX - minX, stop = span / maxSteps, prev = [\n        point(minX)\n    ], next = [];\n    if (minSteps === maxSteps) {\n        // no adaptation, sample uniform grid directly and return\n        for(let i = 1; i < maxSteps; ++i)prev.push(point(minX + i / minSteps * span));\n        prev.push(point(maxX));\n        return prev;\n    } else {\n        // sample minimum points on uniform grid\n        // then move on to perform adaptive refinement\n        next.push(point(maxX));\n        for(let i = minSteps; --i > 0;)next.push(point(minX + i / minSteps * span));\n    }\n    let p0 = prev[0];\n    let p1 = next[next.length - 1];\n    const sx = 1 / span;\n    const sy = scaleY(p0[1], next);\n    while(p1){\n        // midpoint for potential curve subdivision\n        const pm = point((p0[0] + p1[0]) / 2);\n        const dx = pm[0] - p0[0] >= stop;\n        if (dx && angleDelta(p0, pm, p1, sx, sy) > MIN_RADIANS) // maximum resolution has not yet been met, and\n        // subdivision midpoint is sufficiently different from endpoint\n        // save subdivision, push midpoint onto the visitation stack\n        next.push(pm);\n        else {\n            // subdivision midpoint sufficiently similar to endpoint\n            // skip subdivision, store endpoint, move to next point on the stack\n            p0 = p1;\n            prev.push(p1);\n            next.pop();\n        }\n        p1 = next[next.length - 1];\n    }\n    return prev;\n}\nfunction scaleY(init, points1) {\n    let ymin = init;\n    let ymax = init;\n    const n = points1.length;\n    for(let i = 0; i < n; ++i){\n        const y = points1[i][1];\n        if (y < ymin) ymin = y;\n        if (y > ymax) ymax = y;\n    }\n    return 1 / (ymax - ymin);\n}\nfunction angleDelta(p, q, r, sx, sy) {\n    const a0 = Math.atan2(sy * (r[1] - p[1]), sx * (r[0] - p[0])), a1 = Math.atan2(sy * (q[1] - p[1]), sx * (q[0] - p[0]));\n    return Math.abs(a0 - a1);\n}\n\n},{\"d3-array\":\"8JMcC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5GAYs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bound\", ()=>Bound);\nparcelHelpers.export(exports, \"identifier\", ()=>Identifier);\nparcelHelpers.export(exports, \"mark\", ()=>Mark);\nparcelHelpers.export(exports, \"overlap\", ()=>Overlap);\nparcelHelpers.export(exports, \"render\", ()=>Render);\nparcelHelpers.export(exports, \"viewlayout\", ()=>ViewLayout);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nvar _vegaUtil = require(\"vega-util\");\nconst Top = \"top\";\nconst Left = \"left\";\nconst Right = \"right\";\nconst Bottom = \"bottom\";\nconst TopLeft = \"top-left\";\nconst TopRight = \"top-right\";\nconst BottomLeft = \"bottom-left\";\nconst BottomRight = \"bottom-right\";\nconst Start = \"start\";\nconst Middle = \"middle\";\nconst End = \"end\";\nconst X = \"x\";\nconst Y = \"y\";\nconst Group = \"group\";\nconst AxisRole = \"axis\";\nconst TitleRole = \"title\";\nconst FrameRole = \"frame\";\nconst ScopeRole = \"scope\";\nconst LegendRole = \"legend\";\nconst RowHeader = \"row-header\";\nconst RowFooter = \"row-footer\";\nconst RowTitle = \"row-title\";\nconst ColHeader = \"column-header\";\nconst ColFooter = \"column-footer\";\nconst ColTitle = \"column-title\";\nconst Padding = \"padding\";\nconst Symbols = \"symbol\";\nconst Fit = \"fit\";\nconst FitX = \"fit-x\";\nconst FitY = \"fit-y\";\nconst Pad = \"pad\";\nconst None = \"none\";\nconst All = \"all\";\nconst Each = \"each\";\nconst Flush = \"flush\";\nconst Column = \"column\";\nconst Row = \"row\";\n/**\n * Calculate bounding boxes for scenegraph items.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.mark - The scenegraph mark instance to bound.\n */ function Bound(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Bound, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const view = pulse.dataflow, mark = _.mark, type = mark.marktype, entry = (0, _vegaScenegraph.Marks)[type], bound = entry.bound;\n        let markBounds = mark.bounds, rebound;\n        if (entry.nested) {\n            // multi-item marks have a single bounds instance\n            if (mark.items.length) view.dirty(mark.items[0]);\n            markBounds = boundItem(mark, bound);\n            mark.items.forEach((item)=>{\n                item.bounds.clear().union(markBounds);\n            });\n        } else if (type === Group || _.modified()) {\n            // operator parameters modified -> re-bound all items\n            // updates group bounds in response to modified group content\n            pulse.visit(pulse.MOD, (item)=>view.dirty(item));\n            markBounds.clear();\n            mark.items.forEach((item)=>markBounds.union(boundItem(item, bound))); // force reflow for axes/legends/titles to propagate any layout changes\n            switch(mark.role){\n                case AxisRole:\n                case LegendRole:\n                case TitleRole:\n                    pulse.reflow();\n            }\n        } else {\n            // incrementally update bounds, re-bound mark as needed\n            rebound = pulse.changed(pulse.REM);\n            pulse.visit(pulse.ADD, (item)=>{\n                markBounds.union(boundItem(item, bound));\n            });\n            pulse.visit(pulse.MOD, (item)=>{\n                rebound = rebound || markBounds.alignsWith(item.bounds);\n                view.dirty(item);\n                markBounds.union(boundItem(item, bound));\n            });\n            if (rebound) {\n                markBounds.clear();\n                mark.items.forEach((item)=>markBounds.union(item.bounds));\n            }\n        } // ensure mark bounds do not exceed any clipping region\n        (0, _vegaScenegraph.boundClip)(mark);\n        return pulse.modifies(\"bounds\");\n    }\n});\nfunction boundItem(item, bound, opt) {\n    return bound(item.bounds.clear(), item, opt);\n}\nconst COUNTER_NAME = \":vega_identifier:\";\n/**\n * Adds a unique identifier to all added tuples.\n * This transform creates a new signal that serves as an id counter.\n * As a result, the id counter is shared across all instances of this\n * transform, generating unique ids across multiple data streams. In\n * addition, this signal value can be included in a snapshot of the\n * dataflow state, enabling correct resumption of id allocation.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.as - The field name for the generated identifier.\n */ function Identifier(params) {\n    (0, _vegaDataflow.Transform).call(this, 0, params);\n}\nIdentifier.Definition = {\n    \"type\": \"Identifier\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"required\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Identifier, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const counter = getCounter(pulse.dataflow), as = _.as;\n        let id = counter.value;\n        pulse.visit(pulse.ADD, (t)=>t[as] = t[as] || ++id);\n        counter.set(this.value = id);\n        return pulse;\n    }\n});\nfunction getCounter(view) {\n    return view._signals[COUNTER_NAME] || (view._signals[COUNTER_NAME] = view.add(0));\n}\n/**\n * Bind scenegraph items to a scenegraph mark instance.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.markdef - The mark definition for creating the mark.\n *   This is an object of legal scenegraph mark properties which *must* include\n *   the 'marktype' property.\n */ function Mark(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Mark, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        let mark = this.value; // acquire mark on first invocation, bind context and group\n        if (!mark) {\n            mark = pulse.dataflow.scenegraph().mark(_.markdef, lookup(_), _.index);\n            mark.group.context = _.context;\n            if (!_.context.group) _.context.group = mark.group;\n            mark.source = this.source; // point to upstream collector\n            mark.clip = _.clip;\n            mark.interactive = _.interactive;\n            this.value = mark;\n        } // initialize entering items\n        const Init = mark.marktype === Group ? (0, _vegaScenegraph.GroupItem) : (0, _vegaScenegraph.Item);\n        pulse.visit(pulse.ADD, (item)=>Init.call(item, mark)); // update clipping and/or interactive status\n        if (_.modified(\"clip\") || _.modified(\"interactive\")) {\n            mark.clip = _.clip;\n            mark.interactive = !!_.interactive;\n            mark.zdirty = true; // force scenegraph re-eval\n            pulse.reflow();\n        } // bind items array to scenegraph mark\n        mark.items = pulse.source;\n        return pulse;\n    }\n});\nfunction lookup(_) {\n    const g = _.groups, p = _.parent;\n    return g && g.size === 1 ? g.get(Object.keys(g.object)[0]) : g && p ? g.lookup(p) : null;\n}\n/**\n * Analyze items for overlap, changing opacity to hide items with\n * overlapping bounding boxes. This transform will preserve at least\n * two items (e.g., first and last) even if overlap persists.\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator\n *   function for sorting items.\n * @param {object} [params.method] - The overlap removal method to apply.\n *   One of 'parity' (default, hide every other item until there is no\n *   more overlap) or 'greedy' (sequentially scan and hide and items that\n *   overlap with the last visible item).\n * @param {object} [params.boundScale] - A scale whose range should be used\n *   to bound the items. Items exceeding the bounds of the scale range\n *   will be treated as overlapping. If null or undefined, no bounds check\n *   will be applied.\n * @param {object} [params.boundOrient] - The orientation of the scale\n *   (top, bottom, left, or right) used to bound items. This parameter is\n *   ignored if boundScale is null or undefined.\n * @param {object} [params.boundTolerance] - The tolerance in pixels for\n *   bound inclusion testing (default 1). This specifies by how many pixels\n *   an item's bounds may exceed the scale range bounds and not be culled.\n * @constructor\n */ function Overlap(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nconst methods = {\n    parity: (items)=>items.filter((item, i)=>i % 2 ? item.opacity = 0 : 1),\n    greedy: (items, sep)=>{\n        let a;\n        return items.filter((b, i)=>!i || !intersect(a.bounds, b.bounds, sep) ? (a = b, 1) : b.opacity = 0);\n    }\n}; // compute bounding box intersection\n// including padding pixels of separation\nconst intersect = (a, b, sep)=>sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);\nconst hasOverlap = (items, pad)=>{\n    for(var i = 1, n = items.length, a = items[0].bounds, b; i < n; a = b, ++i){\n        if (intersect(a, b = items[i].bounds, pad)) return true;\n    }\n};\nconst hasBounds = (item)=>{\n    const b = item.bounds;\n    return b.width() > 1 && b.height() > 1;\n};\nconst boundTest = (scale, orient, tolerance)=>{\n    var range = scale.range(), b = new (0, _vegaScenegraph.Bounds)();\n    if (orient === Top || orient === Bottom) b.set(range[0], -Infinity, range[1], Infinity);\n    else b.set(-Infinity, range[0], Infinity, range[1]);\n    b.expand(tolerance || 1);\n    return (item)=>b.encloses(item.bounds);\n}; // reset all items to be fully opaque\nconst reset = (source)=>{\n    source.forEach((item)=>item.opacity = 1);\n    return source;\n}; // add all tuples to mod, fork pulse if parameters were modified\n// fork prevents cross-stream tuple pollution (e.g., pulse from scale)\nconst reflow = (pulse, _)=>pulse.reflow(_.modified()).modifies(\"opacity\");\n(0, _vegaUtil.inherits)(Overlap, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const reduce = methods[_.method] || methods.parity, sep = _.separation || 0;\n        let source = pulse.materialize(pulse.SOURCE).source, items, test;\n        if (!source || !source.length) return;\n        if (!_.method) {\n            // early exit if method is falsy\n            if (_.modified(\"method\")) {\n                reset(source);\n                pulse = reflow(pulse, _);\n            }\n            return pulse;\n        } // skip labels with no content\n        source = source.filter(hasBounds); // early exit, nothing to do\n        if (!source.length) return;\n        if (_.sort) source = source.slice().sort(_.sort);\n        items = reset(source);\n        pulse = reflow(pulse, _);\n        if (items.length >= 3 && hasOverlap(items, sep)) {\n            do items = reduce(items, sep);\n            while (items.length >= 3 && hasOverlap(items, sep));\n            if (items.length < 3 && !(0, _vegaUtil.peek)(source).opacity) {\n                if (items.length > 1) (0, _vegaUtil.peek)(items).opacity = 0;\n                (0, _vegaUtil.peek)(source).opacity = 1;\n            }\n        }\n        if (_.boundScale && _.boundTolerance >= 0) {\n            test = boundTest(_.boundScale, _.boundOrient, +_.boundTolerance);\n            source.forEach((item)=>{\n                if (!test(item)) item.opacity = 0;\n            });\n        } // re-calculate mark bounds\n        const bounds = items[0].mark.bounds.clear();\n        source.forEach((item)=>{\n            if (item.opacity) bounds.union(item.bounds);\n        });\n        return pulse;\n    }\n});\n/**\n * Queue modified scenegraph items for rendering.\n * @constructor\n */ function Render(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Render, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const view = pulse.dataflow;\n        pulse.visit(pulse.ALL, (item)=>view.dirty(item)); // set z-index dirty flag as needed\n        if (pulse.fields && pulse.fields[\"zindex\"]) {\n            const item = pulse.source && pulse.source[0];\n            if (item) item.mark.zdirty = true;\n        }\n    }\n});\nconst tempBounds = new (0, _vegaScenegraph.Bounds)();\nfunction set(item, property, value) {\n    return item[property] === value ? 0 : (item[property] = value, 1);\n}\nfunction isYAxis(mark) {\n    var orient = mark.items[0].orient;\n    return orient === Left || orient === Right;\n}\nfunction axisIndices(datum) {\n    let index = +datum.grid;\n    return [\n        datum.ticks ? index++ : -1,\n        datum.labels ? index++ : -1,\n        index + +datum.domain // title index\n    ];\n}\nfunction axisLayout(view, axis, width, height) {\n    var item = axis.items[0], datum = item.datum, delta = item.translate != null ? item.translate : 0.5, orient = item.orient, indices = axisIndices(datum), range = item.range, offset = item.offset, position = item.position, minExtent = item.minExtent, maxExtent = item.maxExtent, title = datum.title && item.items[indices[2]].items[0], titlePadding = item.titlePadding, bounds = item.bounds, dl = title && (0, _vegaScenegraph.multiLineOffset)(title), x = 0, y = 0, i, s;\n    tempBounds.clear().union(bounds);\n    bounds.clear();\n    if ((i = indices[0]) > -1) bounds.union(item.items[i].bounds);\n    if ((i = indices[1]) > -1) bounds.union(item.items[i].bounds); // position axis group and title\n    switch(orient){\n        case Top:\n            x = position || 0;\n            y = -offset;\n            s = Math.max(minExtent, Math.min(maxExtent, -bounds.y1));\n            bounds.add(0, -s).add(range, 0);\n            if (title) axisTitleLayout(view, title, s, titlePadding, dl, 0, -1, bounds);\n            break;\n        case Left:\n            x = -offset;\n            y = position || 0;\n            s = Math.max(minExtent, Math.min(maxExtent, -bounds.x1));\n            bounds.add(-s, 0).add(0, range);\n            if (title) axisTitleLayout(view, title, s, titlePadding, dl, 1, -1, bounds);\n            break;\n        case Right:\n            x = width + offset;\n            y = position || 0;\n            s = Math.max(minExtent, Math.min(maxExtent, bounds.x2));\n            bounds.add(0, 0).add(s, range);\n            if (title) axisTitleLayout(view, title, s, titlePadding, dl, 1, 1, bounds);\n            break;\n        case Bottom:\n            x = position || 0;\n            y = height + offset;\n            s = Math.max(minExtent, Math.min(maxExtent, bounds.y2));\n            bounds.add(0, 0).add(range, s);\n            if (title) axisTitleLayout(view, title, s, titlePadding, 0, 0, 1, bounds);\n            break;\n        default:\n            x = item.x;\n            y = item.y;\n    } // update bounds\n    (0, _vegaScenegraph.boundStroke)(bounds.translate(x, y), item);\n    if (set(item, \"x\", x + delta) | set(item, \"y\", y + delta)) {\n        item.bounds = tempBounds;\n        view.dirty(item);\n        item.bounds = bounds;\n        view.dirty(item);\n    }\n    return item.mark.bounds.clear().union(bounds);\n}\nfunction axisTitleLayout(view, title, offset, pad, dl, isYAxis1, sign, bounds) {\n    const b = title.bounds;\n    if (title.auto) {\n        const v = sign * (offset + dl + pad);\n        let dx = 0, dy = 0;\n        view.dirty(title);\n        isYAxis1 ? dx = (title.x || 0) - (title.x = v) : dy = (title.y || 0) - (title.y = v);\n        title.mark.bounds.clear().union(b.translate(-dx, -dy));\n        view.dirty(title);\n    }\n    bounds.union(b);\n}\nconst min = (a, b)=>Math.floor(Math.min(a, b));\nconst max = (a, b)=>Math.ceil(Math.max(a, b));\nfunction gridLayoutGroups(group) {\n    var groups = group.items, n = groups.length, i = 0, mark, items;\n    const views = {\n        marks: [],\n        rowheaders: [],\n        rowfooters: [],\n        colheaders: [],\n        colfooters: [],\n        rowtitle: null,\n        coltitle: null\n    }; // layout axes, gather legends, collect bounds\n    for(; i < n; ++i){\n        mark = groups[i];\n        items = mark.items;\n        if (mark.marktype === Group) switch(mark.role){\n            case AxisRole:\n            case LegendRole:\n            case TitleRole:\n                break;\n            case RowHeader:\n                views.rowheaders.push(...items);\n                break;\n            case RowFooter:\n                views.rowfooters.push(...items);\n                break;\n            case ColHeader:\n                views.colheaders.push(...items);\n                break;\n            case ColFooter:\n                views.colfooters.push(...items);\n                break;\n            case RowTitle:\n                views.rowtitle = items[0];\n                break;\n            case ColTitle:\n                views.coltitle = items[0];\n                break;\n            default:\n                views.marks.push(...items);\n        }\n    }\n    return views;\n}\nfunction bboxFlush(item) {\n    return new (0, _vegaScenegraph.Bounds)().set(0, 0, item.width || 0, item.height || 0);\n}\nfunction bboxFull(item) {\n    const b = item.bounds.clone();\n    return b.empty() ? b.set(0, 0, 0, 0) : b.translate(-(item.x || 0), -(item.y || 0));\n}\nfunction get(opt, key, d) {\n    const v = (0, _vegaUtil.isObject)(opt) ? opt[key] : opt;\n    return v != null ? v : d !== undefined ? d : 0;\n}\nfunction offsetValue(v) {\n    return v < 0 ? Math.ceil(-v) : 0;\n}\nfunction gridLayout(view, groups, opt) {\n    var dirty = !opt.nodirty, bbox = opt.bounds === Flush ? bboxFlush : bboxFull, bounds = tempBounds.set(0, 0, 0, 0), alignCol = get(opt.align, Column), alignRow = get(opt.align, Row), padCol = get(opt.padding, Column), padRow = get(opt.padding, Row), ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), n = groups.length, xOffset = Array(n), xExtent = Array(ncols), xMax = 0, yOffset = Array(n), yExtent = Array(nrows), yMax = 0, dx = Array(n), dy = Array(n), boxes = Array(n), m, i, c, r, b, g, px, py, x, y, offset;\n    for(i = 0; i < ncols; ++i)xExtent[i] = 0;\n    for(i = 0; i < nrows; ++i)yExtent[i] = 0; // determine offsets for each group\n    for(i = 0; i < n; ++i){\n        g = groups[i];\n        b = boxes[i] = bbox(g);\n        g.x = g.x || 0;\n        dx[i] = 0;\n        g.y = g.y || 0;\n        dy[i] = 0;\n        c = i % ncols;\n        r = ~~(i / ncols);\n        xMax = Math.max(xMax, px = Math.ceil(b.x2));\n        yMax = Math.max(yMax, py = Math.ceil(b.y2));\n        xExtent[c] = Math.max(xExtent[c], px);\n        yExtent[r] = Math.max(yExtent[r], py);\n        xOffset[i] = padCol + offsetValue(b.x1);\n        yOffset[i] = padRow + offsetValue(b.y1);\n        if (dirty) view.dirty(groups[i]);\n    } // set initial alignment offsets\n    for(i = 0; i < n; ++i){\n        if (i % ncols === 0) xOffset[i] = 0;\n        if (i < ncols) yOffset[i] = 0;\n    } // enforce column alignment constraints\n    if (alignCol === Each) for(c = 1; c < ncols; ++c){\n        for(offset = 0, i = c; i < n; i += ncols)if (offset < xOffset[i]) offset = xOffset[i];\n        for(i = c; i < n; i += ncols)xOffset[i] = offset + xExtent[c - 1];\n    }\n    else if (alignCol === All) {\n        for(offset = 0, i = 0; i < n; ++i)if (i % ncols && offset < xOffset[i]) offset = xOffset[i];\n        for(i = 0; i < n; ++i)if (i % ncols) xOffset[i] = offset + xMax;\n    } else {\n        for(alignCol = false, c = 1; c < ncols; ++c)for(i = c; i < n; i += ncols)xOffset[i] += xExtent[c - 1];\n    } // enforce row alignment constraints\n    if (alignRow === Each) for(r = 1; r < nrows; ++r){\n        for(offset = 0, i = r * ncols, m = i + ncols; i < m; ++i)if (offset < yOffset[i]) offset = yOffset[i];\n        for(i = r * ncols; i < m; ++i)yOffset[i] = offset + yExtent[r - 1];\n    }\n    else if (alignRow === All) {\n        for(offset = 0, i = ncols; i < n; ++i)if (offset < yOffset[i]) offset = yOffset[i];\n        for(i = ncols; i < n; ++i)yOffset[i] = offset + yMax;\n    } else {\n        for(alignRow = false, r = 1; r < nrows; ++r)for(i = r * ncols, m = i + ncols; i < m; ++i)yOffset[i] += yExtent[r - 1];\n    } // perform horizontal grid layout\n    for(x = 0, i = 0; i < n; ++i){\n        x = xOffset[i] + (i % ncols ? x : 0);\n        dx[i] += x - groups[i].x;\n    } // perform vertical grid layout\n    for(c = 0; c < ncols; ++c)for(y = 0, i = c; i < n; i += ncols){\n        y += yOffset[i];\n        dy[i] += y - groups[i].y;\n    }\n     // perform horizontal centering\n    if (alignCol && get(opt.center, Column) && nrows > 1) for(i = 0; i < n; ++i){\n        b = alignCol === All ? xMax : xExtent[i % ncols];\n        x = b - boxes[i].x2 - groups[i].x - dx[i];\n        if (x > 0) dx[i] += x / 2;\n    }\n     // perform vertical centering\n    if (alignRow && get(opt.center, Row) && ncols !== 1) for(i = 0; i < n; ++i){\n        b = alignRow === All ? yMax : yExtent[~~(i / ncols)];\n        y = b - boxes[i].y2 - groups[i].y - dy[i];\n        if (y > 0) dy[i] += y / 2;\n    }\n     // position grid relative to anchor\n    for(i = 0; i < n; ++i)bounds.union(boxes[i].translate(dx[i], dy[i]));\n    x = get(opt.anchor, X);\n    y = get(opt.anchor, Y);\n    switch(get(opt.anchor, Column)){\n        case End:\n            x -= bounds.width();\n            break;\n        case Middle:\n            x -= bounds.width() / 2;\n    }\n    switch(get(opt.anchor, Row)){\n        case End:\n            y -= bounds.height();\n            break;\n        case Middle:\n            y -= bounds.height() / 2;\n    }\n    x = Math.round(x);\n    y = Math.round(y); // update mark positions, bounds, dirty\n    bounds.clear();\n    for(i = 0; i < n; ++i)groups[i].mark.bounds.clear();\n    for(i = 0; i < n; ++i){\n        g = groups[i];\n        g.x += dx[i] += x;\n        g.y += dy[i] += y;\n        bounds.union(g.mark.bounds.union(g.bounds.translate(dx[i], dy[i])));\n        if (dirty) view.dirty(g);\n    }\n    return bounds;\n}\nfunction trellisLayout(view, group, opt) {\n    var views = gridLayoutGroups(group), groups = views.marks, bbox = opt.bounds === Flush ? boundFlush : boundFull, off = opt.offset, ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), cells = nrows * ncols, x, y, x2, y2, anchor, band, offset; // -- initial grid layout\n    const bounds = gridLayout(view, groups, opt);\n    if (bounds.empty()) bounds.set(0, 0, 0, 0); // empty grid\n    // -- layout grid headers and footers --\n    // perform row header layout\n    if (views.rowheaders) {\n        band = get(opt.headerBand, Row, null);\n        x = layoutHeaders(view, views.rowheaders, groups, ncols, nrows, -get(off, \"rowHeader\"), min, 0, bbox, \"x1\", 0, ncols, 1, band);\n    } // perform column header layout\n    if (views.colheaders) {\n        band = get(opt.headerBand, Column, null);\n        y = layoutHeaders(view, views.colheaders, groups, ncols, ncols, -get(off, \"columnHeader\"), min, 1, bbox, \"y1\", 0, 1, ncols, band);\n    } // perform row footer layout\n    if (views.rowfooters) {\n        band = get(opt.footerBand, Row, null);\n        x2 = layoutHeaders(view, views.rowfooters, groups, ncols, nrows, get(off, \"rowFooter\"), max, 0, bbox, \"x2\", ncols - 1, ncols, 1, band);\n    } // perform column footer layout\n    if (views.colfooters) {\n        band = get(opt.footerBand, Column, null);\n        y2 = layoutHeaders(view, views.colfooters, groups, ncols, ncols, get(off, \"columnFooter\"), max, 1, bbox, \"y2\", cells - ncols, 1, ncols, band);\n    } // perform row title layout\n    if (views.rowtitle) {\n        anchor = get(opt.titleAnchor, Row);\n        offset = get(off, \"rowTitle\");\n        offset = anchor === End ? x2 + offset : x - offset;\n        band = get(opt.titleBand, Row, 0.5);\n        layoutTitle(view, views.rowtitle, offset, 0, bounds, band);\n    } // perform column title layout\n    if (views.coltitle) {\n        anchor = get(opt.titleAnchor, Column);\n        offset = get(off, \"columnTitle\");\n        offset = anchor === End ? y2 + offset : y - offset;\n        band = get(opt.titleBand, Column, 0.5);\n        layoutTitle(view, views.coltitle, offset, 1, bounds, band);\n    }\n}\nfunction boundFlush(item, field) {\n    return field === \"x1\" ? item.x || 0 : field === \"y1\" ? item.y || 0 : field === \"x2\" ? (item.x || 0) + (item.width || 0) : field === \"y2\" ? (item.y || 0) + (item.height || 0) : undefined;\n}\nfunction boundFull(item, field) {\n    return item.bounds[field];\n}\nfunction layoutHeaders(view, headers, groups, ncols, limit, offset, agg, isX, bound, bf, start, stride, back, band) {\n    var n = groups.length, init = 0, edge = 0, i, j, k, m, b, h, g, x, y; // if no groups, early exit and return 0\n    if (!n) return init; // compute margin\n    for(i = start; i < n; i += stride)if (groups[i]) init = agg(init, bound(groups[i], bf));\n     // if no headers, return margin calculation\n    if (!headers.length) return init; // check if number of headers exceeds number of rows or columns\n    if (headers.length > limit) {\n        view.warn(\"Grid headers exceed limit: \" + limit);\n        headers = headers.slice(0, limit);\n    } // apply offset\n    init += offset; // clear mark bounds for all headers\n    for(j = 0, m = headers.length; j < m; ++j){\n        view.dirty(headers[j]);\n        headers[j].mark.bounds.clear();\n    } // layout each header\n    for(i = start, j = 0, m = headers.length; j < m; ++j, i += stride){\n        h = headers[j];\n        b = h.mark.bounds; // search for nearest group to align to\n        // necessary if table has empty cells\n        for(k = i; k >= 0 && (g = groups[k]) == null; k -= back); // assign coordinates and update bounds\n        if (isX) {\n            x = band == null ? g.x : Math.round(g.bounds.x1 + band * g.bounds.width());\n            y = init;\n        } else {\n            x = init;\n            y = band == null ? g.y : Math.round(g.bounds.y1 + band * g.bounds.height());\n        }\n        b.union(h.bounds.translate(x - (h.x || 0), y - (h.y || 0)));\n        h.x = x;\n        h.y = y;\n        view.dirty(h); // update current edge of layout bounds\n        edge = agg(edge, b[bf]);\n    }\n    return edge;\n}\nfunction layoutTitle(view, g, offset, isX, bounds, band) {\n    if (!g) return;\n    view.dirty(g); // compute title coordinates\n    var x = offset, y = offset;\n    isX ? x = Math.round(bounds.x1 + band * bounds.width()) : y = Math.round(bounds.y1 + band * bounds.height()); // assign coordinates and update bounds\n    g.bounds.translate(x - (g.x || 0), y - (g.y || 0));\n    g.mark.bounds.clear().union(g.bounds);\n    g.x = x;\n    g.y = y; // queue title for redraw\n    view.dirty(g);\n}\nfunction lookup$1(config, orient) {\n    const opt = config[orient] || {};\n    return (key, d)=>opt[key] != null ? opt[key] : config[key] != null ? config[key] : d;\n} // if legends specify offset directly, use the maximum specified value\nfunction offsets(legends, value) {\n    let max1 = -Infinity;\n    legends.forEach((item)=>{\n        if (item.offset != null) max1 = Math.max(max1, item.offset);\n    });\n    return max1 > -Infinity ? max1 : value;\n}\nfunction legendParams(g, orient, config, xb, yb, w, h) {\n    const _ = lookup$1(config, orient), offset = offsets(g, _(\"offset\", 0)), anchor = _(\"anchor\", Start), mult = anchor === End ? 1 : anchor === Middle ? 0.5 : 0;\n    const p = {\n        align: Each,\n        bounds: _(\"bounds\", Flush),\n        columns: _(\"direction\") === \"vertical\" ? 1 : g.length,\n        padding: _(\"margin\", 8),\n        center: _(\"center\"),\n        nodirty: true\n    };\n    switch(orient){\n        case Left:\n            p.anchor = {\n                x: Math.floor(xb.x1) - offset,\n                column: End,\n                y: mult * (h || xb.height() + 2 * xb.y1),\n                row: anchor\n            };\n            break;\n        case Right:\n            p.anchor = {\n                x: Math.ceil(xb.x2) + offset,\n                y: mult * (h || xb.height() + 2 * xb.y1),\n                row: anchor\n            };\n            break;\n        case Top:\n            p.anchor = {\n                y: Math.floor(yb.y1) - offset,\n                row: End,\n                x: mult * (w || yb.width() + 2 * yb.x1),\n                column: anchor\n            };\n            break;\n        case Bottom:\n            p.anchor = {\n                y: Math.ceil(yb.y2) + offset,\n                x: mult * (w || yb.width() + 2 * yb.x1),\n                column: anchor\n            };\n            break;\n        case TopLeft:\n            p.anchor = {\n                x: offset,\n                y: offset\n            };\n            break;\n        case TopRight:\n            p.anchor = {\n                x: w - offset,\n                y: offset,\n                column: End\n            };\n            break;\n        case BottomLeft:\n            p.anchor = {\n                x: offset,\n                y: h - offset,\n                row: End\n            };\n            break;\n        case BottomRight:\n            p.anchor = {\n                x: w - offset,\n                y: h - offset,\n                column: End,\n                row: End\n            };\n            break;\n    }\n    return p;\n}\nfunction legendLayout(view, legend) {\n    var item = legend.items[0], datum = item.datum, orient = item.orient, bounds = item.bounds, x = item.x, y = item.y, w, h; // cache current bounds for later comparison\n    item._bounds ? item._bounds.clear().union(bounds) : item._bounds = bounds.clone();\n    bounds.clear(); // adjust legend to accommodate padding and title\n    legendGroupLayout(view, item, item.items[0].items[0]); // aggregate bounds to determine size, and include origin\n    bounds = legendBounds(item, bounds);\n    w = 2 * item.padding;\n    h = 2 * item.padding;\n    if (!bounds.empty()) {\n        w = Math.ceil(bounds.width() + w);\n        h = Math.ceil(bounds.height() + h);\n    }\n    if (datum.type === Symbols) legendEntryLayout(item.items[0].items[0].items[0].items);\n    if (orient !== None) {\n        item.x = x = 0;\n        item.y = y = 0;\n    }\n    item.width = w;\n    item.height = h;\n    (0, _vegaScenegraph.boundStroke)(bounds.set(x, y, x + w, y + h), item);\n    item.mark.bounds.clear().union(bounds);\n    return item;\n}\nfunction legendBounds(item, b) {\n    // aggregate item bounds\n    item.items.forEach((_)=>b.union(_.bounds)); // anchor to legend origin\n    b.x1 = item.padding;\n    b.y1 = item.padding;\n    return b;\n}\nfunction legendGroupLayout(view, item, entry) {\n    var pad = item.padding, ex = pad - entry.x, ey = pad - entry.y;\n    if (!item.datum.title) {\n        if (ex || ey) translate(view, entry, ex, ey);\n    } else {\n        var title = item.items[1].items[0], anchor = title.anchor, tpad = item.titlePadding || 0, tx = pad - title.x, ty = pad - title.y;\n        switch(title.orient){\n            case Left:\n                ex += Math.ceil(title.bounds.width()) + tpad;\n                break;\n            case Right:\n            case Bottom:\n                break;\n            default:\n                ey += title.bounds.height() + tpad;\n        }\n        if (ex || ey) translate(view, entry, ex, ey);\n        switch(title.orient){\n            case Left:\n                ty += legendTitleOffset(item, entry, title, anchor, 1, 1);\n                break;\n            case Right:\n                tx += legendTitleOffset(item, entry, title, End, 0, 0) + tpad;\n                ty += legendTitleOffset(item, entry, title, anchor, 1, 1);\n                break;\n            case Bottom:\n                tx += legendTitleOffset(item, entry, title, anchor, 0, 0);\n                ty += legendTitleOffset(item, entry, title, End, -1, 0, 1) + tpad;\n                break;\n            default:\n                tx += legendTitleOffset(item, entry, title, anchor, 0, 0);\n        }\n        if (tx || ty) translate(view, title, tx, ty); // translate legend if title pushes into negative coordinates\n        if ((tx = Math.round(title.bounds.x1 - pad)) < 0) {\n            translate(view, entry, -tx, 0);\n            translate(view, title, -tx, 0);\n        }\n    }\n}\nfunction legendTitleOffset(item, entry, title, anchor, y, lr, noBar) {\n    const grad = item.datum.type !== \"symbol\", vgrad = title.datum.vgrad, e = grad && (lr || !vgrad) && !noBar ? entry.items[0] : entry, s = e.bounds[y ? \"y2\" : \"x2\"] - item.padding, u = vgrad && lr ? s : 0, v = vgrad && lr ? 0 : s, o = y <= 0 ? 0 : (0, _vegaScenegraph.multiLineOffset)(title);\n    return Math.round(anchor === Start ? u : anchor === End ? v - o : 0.5 * (s - o));\n}\nfunction translate(view, item, dx, dy) {\n    item.x += dx;\n    item.y += dy;\n    item.bounds.translate(dx, dy);\n    item.mark.bounds.translate(dx, dy);\n    view.dirty(item);\n}\nfunction legendEntryLayout(entries) {\n    // get max widths for each column\n    const widths = entries.reduce((w, g)=>{\n        w[g.column] = Math.max(g.bounds.x2 - g.x, w[g.column] || 0);\n        return w;\n    }, {}); // set dimensions of legend entry groups\n    entries.forEach((g)=>{\n        g.width = widths[g.column];\n        g.height = g.bounds.y2 - g.y;\n    });\n}\nfunction titleLayout(view, mark, width, height, viewBounds) {\n    var group = mark.items[0], frame = group.frame, orient = group.orient, anchor = group.anchor, offset = group.offset, padding = group.padding, title = group.items[0].items[0], subtitle = group.items[1] && group.items[1].items[0], end = orient === Left || orient === Right ? height : width, start = 0, x = 0, y = 0, sx = 0, sy = 0, pos;\n    if (frame !== Group) orient === Left ? (start = viewBounds.y2, end = viewBounds.y1) : orient === Right ? (start = viewBounds.y1, end = viewBounds.y2) : (start = viewBounds.x1, end = viewBounds.x2);\n    else if (orient === Left) start = height, end = 0;\n    pos = anchor === Start ? start : anchor === End ? end : (start + end) / 2;\n    if (subtitle && subtitle.text) {\n        // position subtitle\n        switch(orient){\n            case Top:\n            case Bottom:\n                sy = title.bounds.height() + padding;\n                break;\n            case Left:\n                sx = title.bounds.width() + padding;\n                break;\n            case Right:\n                sx = -title.bounds.width() - padding;\n                break;\n        }\n        tempBounds.clear().union(subtitle.bounds);\n        tempBounds.translate(sx - (subtitle.x || 0), sy - (subtitle.y || 0));\n        if (set(subtitle, \"x\", sx) | set(subtitle, \"y\", sy)) {\n            view.dirty(subtitle);\n            subtitle.bounds.clear().union(tempBounds);\n            subtitle.mark.bounds.clear().union(tempBounds);\n            view.dirty(subtitle);\n        }\n        tempBounds.clear().union(subtitle.bounds);\n    } else tempBounds.clear();\n    tempBounds.union(title.bounds); // position title group\n    switch(orient){\n        case Top:\n            x = pos;\n            y = viewBounds.y1 - tempBounds.height() - offset;\n            break;\n        case Left:\n            x = viewBounds.x1 - tempBounds.width() - offset;\n            y = pos;\n            break;\n        case Right:\n            x = viewBounds.x2 + tempBounds.width() + offset;\n            y = pos;\n            break;\n        case Bottom:\n            x = pos;\n            y = viewBounds.y2 + offset;\n            break;\n        default:\n            x = group.x;\n            y = group.y;\n    }\n    if (set(group, \"x\", x) | set(group, \"y\", y)) {\n        tempBounds.translate(x, y);\n        view.dirty(group);\n        group.bounds.clear().union(tempBounds);\n        mark.bounds.clear().union(tempBounds);\n        view.dirty(group);\n    }\n    return group.bounds;\n}\n/**\n * Layout view elements such as axes and legends.\n * Also performs size adjustments.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.mark - Scenegraph mark of groups to layout.\n */ function ViewLayout(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(ViewLayout, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const view = pulse.dataflow;\n        _.mark.items.forEach((group)=>{\n            if (_.layout) trellisLayout(view, group, _.layout);\n            layoutGroup(view, group, _);\n        });\n        return shouldReflow(_.mark.group) ? pulse.reflow() : pulse;\n    }\n});\nfunction shouldReflow(group) {\n    // We typically should reflow if layout is invoked (#2568), as child items\n    // may have resized and reflow ensures group bounds are re-calculated.\n    // However, legend entries have a special exception to avoid instability.\n    // For example, if a selected legend symbol gains a stroke on hover,\n    // we don't want to re-position subsequent elements in the legend.\n    return group && group.mark.role !== \"legend-entry\";\n}\nfunction layoutGroup(view, group, _) {\n    var items = group.items, width = Math.max(0, group.width || 0), height = Math.max(0, group.height || 0), viewBounds = new (0, _vegaScenegraph.Bounds)().set(0, 0, width, height), xBounds = viewBounds.clone(), yBounds = viewBounds.clone(), legends = [], title, mark, orient, b1, i, n; // layout axes, gather legends, collect bounds\n    for(i = 0, n = items.length; i < n; ++i){\n        mark = items[i];\n        switch(mark.role){\n            case AxisRole:\n                b1 = isYAxis(mark) ? xBounds : yBounds;\n                b1.union(axisLayout(view, mark, width, height));\n                break;\n            case TitleRole:\n                title = mark;\n                break;\n            case LegendRole:\n                legends.push(legendLayout(view, mark));\n                break;\n            case FrameRole:\n            case ScopeRole:\n            case RowHeader:\n            case RowFooter:\n            case RowTitle:\n            case ColHeader:\n            case ColFooter:\n            case ColTitle:\n                xBounds.union(mark.bounds);\n                yBounds.union(mark.bounds);\n                break;\n            default:\n                viewBounds.union(mark.bounds);\n        }\n    } // layout legends, adjust viewBounds\n    if (legends.length) {\n        // group legends by orient\n        const l = {};\n        legends.forEach((item)=>{\n            orient = item.orient || Right;\n            if (orient !== None) (l[orient] || (l[orient] = [])).push(item);\n        }); // perform grid layout for each orient group\n        for(const orient1 in l){\n            const g = l[orient1];\n            gridLayout(view, g, legendParams(g, orient1, _.legends, xBounds, yBounds, width, height));\n        } // update view bounds\n        legends.forEach((item)=>{\n            const b = item.bounds;\n            if (!b.equals(item._bounds)) {\n                item.bounds = item._bounds;\n                view.dirty(item); // dirty previous location\n                item.bounds = b;\n                view.dirty(item);\n            }\n            if (_.autosize && _.autosize.type === Fit) // For autosize fit, incorporate the orthogonal dimension only.\n            // Legends that overrun the chart area will then be clipped;\n            // otherwise the chart area gets reduced to nothing!\n            switch(item.orient){\n                case Left:\n                case Right:\n                    viewBounds.add(b.x1, 0).add(b.x2, 0);\n                    break;\n                case Top:\n                case Bottom:\n                    viewBounds.add(0, b.y1).add(0, b.y2);\n            }\n            else viewBounds.union(b);\n        });\n    } // combine bounding boxes\n    viewBounds.union(xBounds).union(yBounds); // layout title, adjust bounds\n    if (title) viewBounds.union(titleLayout(view, title, width, height, viewBounds));\n     // override aggregated view bounds if content is clipped\n    if (group.clip) viewBounds.set(0, 0, group.width || 0, group.height || 0);\n     // perform size adjustment\n    viewSizeLayout(view, group, viewBounds, _);\n}\nfunction viewSizeLayout(view, group, viewBounds, _) {\n    const auto = _.autosize || {}, type = auto.type;\n    if (view._autosize < 1 || !type) return;\n    let viewWidth = view._width, viewHeight = view._height, width = Math.max(0, group.width || 0), left = Math.max(0, Math.ceil(-viewBounds.x1)), height = Math.max(0, group.height || 0), top = Math.max(0, Math.ceil(-viewBounds.y1));\n    const right = Math.max(0, Math.ceil(viewBounds.x2 - width)), bottom = Math.max(0, Math.ceil(viewBounds.y2 - height));\n    if (auto.contains === Padding) {\n        const padding = view.padding();\n        viewWidth -= padding.left + padding.right;\n        viewHeight -= padding.top + padding.bottom;\n    }\n    if (type === None) {\n        left = 0;\n        top = 0;\n        width = viewWidth;\n        height = viewHeight;\n    } else if (type === Fit) {\n        width = Math.max(0, viewWidth - left - right);\n        height = Math.max(0, viewHeight - top - bottom);\n    } else if (type === FitX) {\n        width = Math.max(0, viewWidth - left - right);\n        viewHeight = height + top + bottom;\n    } else if (type === FitY) {\n        viewWidth = width + left + right;\n        height = Math.max(0, viewHeight - top - bottom);\n    } else if (type === Pad) {\n        viewWidth = width + left + right;\n        viewHeight = height + top + bottom;\n    }\n    view._resizeView(viewWidth, viewHeight, width, height, [\n        left,\n        top\n    ], auto.resize);\n}\n\n},{\"vega-dataflow\":\"4kvYg\",\"vega-scenegraph\":\"gIB0Z\",\"vega-util\":\"dPFAY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gIB0Z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Bounds\", ()=>Bounds);\nparcelHelpers.export(exports, \"CanvasHandler\", ()=>CanvasHandler);\nparcelHelpers.export(exports, \"CanvasRenderer\", ()=>CanvasRenderer);\nparcelHelpers.export(exports, \"Gradient\", ()=>Gradient);\nparcelHelpers.export(exports, \"GroupItem\", ()=>GroupItem);\nparcelHelpers.export(exports, \"Handler\", ()=>Handler);\nparcelHelpers.export(exports, \"Item\", ()=>Item);\nparcelHelpers.export(exports, \"Marks\", ()=>Marks);\nparcelHelpers.export(exports, \"RenderType\", ()=>RenderType);\nparcelHelpers.export(exports, \"Renderer\", ()=>Renderer);\nparcelHelpers.export(exports, \"ResourceLoader\", ()=>ResourceLoader);\nparcelHelpers.export(exports, \"SVGHandler\", ()=>SVGHandler);\nparcelHelpers.export(exports, \"SVGRenderer\", ()=>SVGRenderer);\nparcelHelpers.export(exports, \"SVGStringRenderer\", ()=>SVGStringRenderer);\nparcelHelpers.export(exports, \"Scenegraph\", ()=>Scenegraph);\nparcelHelpers.export(exports, \"boundClip\", ()=>boundClip);\nparcelHelpers.export(exports, \"boundContext\", ()=>boundContext);\nparcelHelpers.export(exports, \"boundItem\", ()=>boundItem);\nparcelHelpers.export(exports, \"boundMark\", ()=>boundMark);\nparcelHelpers.export(exports, \"boundStroke\", ()=>boundStroke);\nparcelHelpers.export(exports, \"domChild\", ()=>domChild);\nparcelHelpers.export(exports, \"domClear\", ()=>domClear);\nparcelHelpers.export(exports, \"domCreate\", ()=>domCreate);\nparcelHelpers.export(exports, \"domFind\", ()=>domFind);\nparcelHelpers.export(exports, \"font\", ()=>font);\nparcelHelpers.export(exports, \"fontFamily\", ()=>fontFamily);\nparcelHelpers.export(exports, \"fontSize\", ()=>fontSize);\nparcelHelpers.export(exports, \"intersect\", ()=>intersect);\nparcelHelpers.export(exports, \"intersectBoxLine\", ()=>intersectBoxLine);\nparcelHelpers.export(exports, \"intersectPath\", ()=>intersectPath);\nparcelHelpers.export(exports, \"intersectPoint\", ()=>intersectPoint);\nparcelHelpers.export(exports, \"intersectRule\", ()=>intersectRule);\nparcelHelpers.export(exports, \"lineHeight\", ()=>lineHeight);\nparcelHelpers.export(exports, \"markup\", ()=>markup);\nparcelHelpers.export(exports, \"multiLineOffset\", ()=>multiLineOffset);\nparcelHelpers.export(exports, \"pathCurves\", ()=>curves);\nparcelHelpers.export(exports, \"pathEqual\", ()=>pathEqual);\nparcelHelpers.export(exports, \"pathParse\", ()=>pathParse);\nparcelHelpers.export(exports, \"pathRectangle\", ()=>vg_rect);\nparcelHelpers.export(exports, \"pathRender\", ()=>pathRender);\nparcelHelpers.export(exports, \"pathSymbols\", ()=>symbols);\nparcelHelpers.export(exports, \"pathTrail\", ()=>vg_trail);\nparcelHelpers.export(exports, \"point\", ()=>point);\nparcelHelpers.export(exports, \"renderModule\", ()=>renderModule);\nparcelHelpers.export(exports, \"resetSVGClipId\", ()=>resetSVGClipId);\nparcelHelpers.export(exports, \"resetSVGDefIds\", ()=>resetSVGDefIds);\nparcelHelpers.export(exports, \"sceneEqual\", ()=>sceneEqual);\nparcelHelpers.export(exports, \"sceneFromJSON\", ()=>sceneFromJSON);\nparcelHelpers.export(exports, \"scenePickVisit\", ()=>pickVisit);\nparcelHelpers.export(exports, \"sceneToJSON\", ()=>sceneToJSON);\nparcelHelpers.export(exports, \"sceneVisit\", ()=>visit);\nparcelHelpers.export(exports, \"sceneZOrder\", ()=>zorder);\nparcelHelpers.export(exports, \"serializeXML\", ()=>serializeXML);\nparcelHelpers.export(exports, \"textMetrics\", ()=>textMetrics);\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Shape = require(\"d3-shape\");\nvar _d3Path = require(\"d3-path\");\nvar _vegaCanvas = require(\"vega-canvas\");\nvar _vegaLoader = require(\"vega-loader\");\nvar _vegaScale = require(\"vega-scale\");\nlet gradient_id = 0;\nfunction resetSVGGradientId() {\n    gradient_id = 0;\n}\nconst patternPrefix = \"p_\";\nfunction isGradient(value1) {\n    return value1 && value1.gradient;\n}\nfunction gradientRef(g, defs, base1) {\n    const type1 = g.gradient;\n    let id = g.id, prefix = type1 === \"radial\" ? patternPrefix : \"\"; // check id, assign default values as needed\n    if (!id) {\n        id = g.id = \"gradient_\" + gradient_id++;\n        if (type1 === \"radial\") {\n            g.x1 = get(g.x1, 0.5);\n            g.y1 = get(g.y1, 0.5);\n            g.r1 = get(g.r1, 0);\n            g.x2 = get(g.x2, 0.5);\n            g.y2 = get(g.y2, 0.5);\n            g.r2 = get(g.r2, 0.5);\n            prefix = patternPrefix;\n        } else {\n            g.x1 = get(g.x1, 0);\n            g.y1 = get(g.y1, 0);\n            g.x2 = get(g.x2, 1);\n            g.y2 = get(g.y2, 0);\n        }\n    } // register definition\n    defs[id] = g; // return url reference\n    return \"url(\" + (base1 || \"\") + \"#\" + prefix + id + \")\";\n}\nfunction get(val, def1) {\n    return val != null ? val : def1;\n}\nfunction Gradient(p0, p1) {\n    var stops = [], gradient1;\n    return gradient1 = {\n        gradient: \"linear\",\n        x1: p0 ? p0[0] : 0,\n        y1: p0 ? p0[1] : 0,\n        x2: p1 ? p1[0] : 1,\n        y2: p1 ? p1[1] : 0,\n        stops: stops,\n        stop: function(offset1, color1) {\n            stops.push({\n                offset: offset1,\n                color: color1\n            });\n            return gradient1;\n        }\n    };\n}\nconst lookup = {\n    \"basis\": {\n        curve: (0, _d3Shape.curveBasis)\n    },\n    \"basis-closed\": {\n        curve: (0, _d3Shape.curveBasisClosed)\n    },\n    \"basis-open\": {\n        curve: (0, _d3Shape.curveBasisOpen)\n    },\n    \"bundle\": {\n        curve: (0, _d3Shape.curveBundle),\n        tension: \"beta\",\n        value: 0.85\n    },\n    \"cardinal\": {\n        curve: (0, _d3Shape.curveCardinal),\n        tension: \"tension\",\n        value: 0\n    },\n    \"cardinal-open\": {\n        curve: (0, _d3Shape.curveCardinalOpen),\n        tension: \"tension\",\n        value: 0\n    },\n    \"cardinal-closed\": {\n        curve: (0, _d3Shape.curveCardinalClosed),\n        tension: \"tension\",\n        value: 0\n    },\n    \"catmull-rom\": {\n        curve: (0, _d3Shape.curveCatmullRom),\n        tension: \"alpha\",\n        value: 0.5\n    },\n    \"catmull-rom-closed\": {\n        curve: (0, _d3Shape.curveCatmullRomClosed),\n        tension: \"alpha\",\n        value: 0.5\n    },\n    \"catmull-rom-open\": {\n        curve: (0, _d3Shape.curveCatmullRomOpen),\n        tension: \"alpha\",\n        value: 0.5\n    },\n    \"linear\": {\n        curve: (0, _d3Shape.curveLinear)\n    },\n    \"linear-closed\": {\n        curve: (0, _d3Shape.curveLinearClosed)\n    },\n    \"monotone\": {\n        horizontal: (0, _d3Shape.curveMonotoneY),\n        vertical: (0, _d3Shape.curveMonotoneX)\n    },\n    \"natural\": {\n        curve: (0, _d3Shape.curveNatural)\n    },\n    \"step\": {\n        curve: (0, _d3Shape.curveStep)\n    },\n    \"step-after\": {\n        curve: (0, _d3Shape.curveStepAfter)\n    },\n    \"step-before\": {\n        curve: (0, _d3Shape.curveStepBefore)\n    }\n};\nfunction curves(type2, orientation, tension) {\n    var entry = (0, _vegaUtil.hasOwnProperty)(lookup, type2) && lookup[type2], curve = null;\n    if (entry) {\n        curve = entry.curve || entry[orientation || \"vertical\"];\n        if (entry.tension && tension != null) curve = curve[entry.tension](tension);\n    }\n    return curve;\n}\n// Path parsing and rendering code adapted from fabric.js -- Thanks!\nconst cmdlen = {\n    m: 2,\n    l: 2,\n    h: 1,\n    v: 1,\n    c: 6,\n    s: 4,\n    q: 4,\n    t: 2,\n    a: 7\n}, regexp = [\n    /([MLHVCSQTAZmlhvcsqtaz])/g,\n    /###/,\n    /(\\.\\d+)(\\.\\d)/g,\n    /(\\d)([-+])/g,\n    /\\s|,|###/\n];\nfunction pathParse(pathstr) {\n    const result = [];\n    let curr, chunks, parsed, param, cmd, len, i, j, n, m; // First, break path into command sequence\n    const path1 = pathstr.slice().replace(regexp[0], \"###$1\").split(regexp[1]).slice(1); // Next, parse each command in turn\n    for(i = 0, n = path1.length; i < n; ++i){\n        curr = path1[i];\n        chunks = curr.slice(1).trim().replace(regexp[2], \"$1###$2\").replace(regexp[3], \"$1###$2\").split(regexp[4]);\n        cmd = curr.charAt(0);\n        parsed = [\n            cmd\n        ];\n        for(j = 0, m = chunks.length; j < m; ++j)if ((param = +chunks[j]) === param) // not NaN\n        parsed.push(param);\n        len = cmdlen[cmd.toLowerCase()];\n        if (parsed.length - 1 > len) {\n            const m = parsed.length;\n            j = 1;\n            result.push([\n                cmd\n            ].concat(parsed.slice(j, j += len))); // handle implicit lineTo (#2803)\n            cmd = cmd === \"M\" ? \"L\" : cmd === \"m\" ? \"l\" : cmd;\n            for(; j < m; j += len)result.push([\n                cmd\n            ].concat(parsed.slice(j, j + len)));\n        } else result.push(parsed);\n    }\n    return result;\n}\nconst DegToRad = Math.PI / 180;\nconst Epsilon = 1e-14;\nconst HalfPi = Math.PI / 2;\nconst Tau = Math.PI * 2;\nconst HalfSqrt3 = Math.sqrt(3) / 2;\nvar segmentCache = {};\nvar bezierCache = {};\nvar join = [].join; // Copied from Inkscape svgtopdf, thanks!\nfunction segments(x2, y2, rx, ry, large, sweep, rotateX, ox, oy) {\n    const key = join.call(arguments);\n    if (segmentCache[key]) return segmentCache[key];\n    const th = rotateX * DegToRad;\n    const sin_th = Math.sin(th);\n    const cos_th = Math.cos(th);\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n    const px1 = cos_th * (ox - x2) * 0.5 + sin_th * (oy - y2) * 0.5;\n    const py1 = cos_th * (oy - y2) * 0.5 - sin_th * (ox - x2) * 0.5;\n    let pl = px1 * px1 / (rx * rx) + py1 * py1 / (ry * ry);\n    if (pl > 1) {\n        pl = Math.sqrt(pl);\n        rx *= pl;\n        ry *= pl;\n    }\n    const a00 = cos_th / rx;\n    const a01 = sin_th / rx;\n    const a10 = -sin_th / ry;\n    const a11 = cos_th / ry;\n    const x0 = a00 * ox + a01 * oy;\n    const y0 = a10 * ox + a11 * oy;\n    const x1 = a00 * x2 + a01 * y2;\n    const y1 = a10 * x2 + a11 * y2;\n    const d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);\n    let sfactor_sq = 1 / d - 0.25;\n    if (sfactor_sq < 0) sfactor_sq = 0;\n    let sfactor = Math.sqrt(sfactor_sq);\n    if (sweep == large) sfactor = -sfactor;\n    const xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);\n    const yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);\n    const th0 = Math.atan2(y0 - yc, x0 - xc);\n    const th1 = Math.atan2(y1 - yc, x1 - xc);\n    let th_arc = th1 - th0;\n    if (th_arc < 0 && sweep === 1) th_arc += Tau;\n    else if (th_arc > 0 && sweep === 0) th_arc -= Tau;\n    const segs = Math.ceil(Math.abs(th_arc / (HalfPi + 0.001)));\n    const result = [];\n    for(let i = 0; i < segs; ++i){\n        const th2 = th0 + i * th_arc / segs;\n        const th3 = th0 + (i + 1) * th_arc / segs;\n        result[i] = [\n            xc,\n            yc,\n            th2,\n            th3,\n            rx,\n            ry,\n            sin_th,\n            cos_th\n        ];\n    }\n    return segmentCache[key] = result;\n}\nfunction bezier(params) {\n    const key = join.call(params);\n    if (bezierCache[key]) return bezierCache[key];\n    var cx = params[0], cy = params[1], th0 = params[2], th1 = params[3], rx = params[4], ry = params[5], sin_th = params[6], cos_th = params[7];\n    const a00 = cos_th * rx;\n    const a01 = -sin_th * ry;\n    const a10 = sin_th * rx;\n    const a11 = cos_th * ry;\n    const cos_th0 = Math.cos(th0);\n    const sin_th0 = Math.sin(th0);\n    const cos_th1 = Math.cos(th1);\n    const sin_th1 = Math.sin(th1);\n    const th_half = 0.5 * (th1 - th0);\n    const sin_th_h2 = Math.sin(th_half * 0.5);\n    const t = 8 / 3 * sin_th_h2 * sin_th_h2 / Math.sin(th_half);\n    const x1 = cx + cos_th0 - t * sin_th0;\n    const y1 = cy + sin_th0 + t * cos_th0;\n    const x3 = cx + cos_th1;\n    const y3 = cy + sin_th1;\n    const x2 = x3 + t * sin_th1;\n    const y2 = y3 - t * cos_th1;\n    return bezierCache[key] = [\n        a00 * x1 + a01 * y1,\n        a10 * x1 + a11 * y1,\n        a00 * x2 + a01 * y2,\n        a10 * x2 + a11 * y2,\n        a00 * x3 + a01 * y3,\n        a10 * x3 + a11 * y3\n    ];\n}\nconst temp = [\n    \"l\",\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0\n];\nfunction scale$1(current, sX, sY) {\n    const c = temp[0] = current[0];\n    if (c === \"a\" || c === \"A\") {\n        temp[1] = sX * current[1];\n        temp[2] = sY * current[2];\n        temp[3] = current[3];\n        temp[4] = current[4];\n        temp[5] = current[5];\n        temp[6] = sX * current[6];\n        temp[7] = sY * current[7];\n    } else if (c === \"h\" || c === \"H\") temp[1] = sX * current[1];\n    else if (c === \"v\" || c === \"V\") temp[1] = sY * current[1];\n    else for(var i = 1, n = current.length; i < n; ++i)temp[i] = (i % 2 == 1 ? sX : sY) * current[i];\n    return temp;\n}\nfunction pathRender(context1, path2, l, t, sX, sY) {\n    var current, // current instruction\n    previous = null, x4 = 0, // current x\n    y4 = 0, // current y\n    controlX = 0, // current control point x\n    controlY = 0, // current control point y\n    tempX, tempY, tempControlX, tempControlY;\n    if (l == null) l = 0;\n    if (t == null) t = 0;\n    if (sX == null) sX = 1;\n    if (sY == null) sY = sX;\n    if (context1.beginPath) context1.beginPath();\n    for(var i = 0, len = path2.length; i < len; ++i){\n        current = path2[i];\n        if (sX !== 1 || sY !== 1) current = scale$1(current, sX, sY);\n        switch(current[0]){\n            // first letter\n            case \"l\":\n                // lineto, relative\n                x4 += current[1];\n                y4 += current[2];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"L\":\n                // lineto, absolute\n                x4 = current[1];\n                y4 = current[2];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"h\":\n                // horizontal lineto, relative\n                x4 += current[1];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"H\":\n                // horizontal lineto, absolute\n                x4 = current[1];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"v\":\n                // vertical lineto, relative\n                y4 += current[1];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"V\":\n                // verical lineto, absolute\n                y4 = current[1];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"m\":\n                // moveTo, relative\n                x4 += current[1];\n                y4 += current[2];\n                context1.moveTo(x4 + l, y4 + t);\n                break;\n            case \"M\":\n                // moveTo, absolute\n                x4 = current[1];\n                y4 = current[2];\n                context1.moveTo(x4 + l, y4 + t);\n                break;\n            case \"c\":\n                // bezierCurveTo, relative\n                tempX = x4 + current[5];\n                tempY = y4 + current[6];\n                controlX = x4 + current[3];\n                controlY = y4 + current[4];\n                context1.bezierCurveTo(x4 + current[1] + l, y4 + current[2] + t, controlX + l, controlY + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                break;\n            case \"C\":\n                // bezierCurveTo, absolute\n                x4 = current[5];\n                y4 = current[6];\n                controlX = current[3];\n                controlY = current[4];\n                context1.bezierCurveTo(current[1] + l, current[2] + t, controlX + l, controlY + t, x4 + l, y4 + t);\n                break;\n            case \"s\":\n                // shorthand cubic bezierCurveTo, relative\n                // transform to absolute x,y\n                tempX = x4 + current[3];\n                tempY = y4 + current[4]; // calculate reflection of previous control points\n                controlX = 2 * x4 - controlX;\n                controlY = 2 * y4 - controlY;\n                context1.bezierCurveTo(controlX + l, controlY + t, x4 + current[1] + l, y4 + current[2] + t, tempX + l, tempY + t); // set control point to 2nd one of this command\n                // the first control point is assumed to be the reflection of\n                // the second control point on the previous command relative\n                // to the current point.\n                controlX = x4 + current[1];\n                controlY = y4 + current[2];\n                x4 = tempX;\n                y4 = tempY;\n                break;\n            case \"S\":\n                // shorthand cubic bezierCurveTo, absolute\n                tempX = current[3];\n                tempY = current[4]; // calculate reflection of previous control points\n                controlX = 2 * x4 - controlX;\n                controlY = 2 * y4 - controlY;\n                context1.bezierCurveTo(controlX + l, controlY + t, current[1] + l, current[2] + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY; // set control point to 2nd one of this command\n                // the first control point is assumed to be the reflection of\n                // the second control point on the previous command relative\n                // to the current point.\n                controlX = current[1];\n                controlY = current[2];\n                break;\n            case \"q\":\n                // quadraticCurveTo, relative\n                // transform to absolute x,y\n                tempX = x4 + current[3];\n                tempY = y4 + current[4];\n                controlX = x4 + current[1];\n                controlY = y4 + current[2];\n                context1.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                break;\n            case \"Q\":\n                // quadraticCurveTo, absolute\n                tempX = current[3];\n                tempY = current[4];\n                context1.quadraticCurveTo(current[1] + l, current[2] + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                controlX = current[1];\n                controlY = current[2];\n                break;\n            case \"t\":\n                // shorthand quadraticCurveTo, relative\n                // transform to absolute x,y\n                tempX = x4 + current[1];\n                tempY = y4 + current[2];\n                if (previous[0].match(/[QqTt]/) === null) {\n                    // If there is no previous command or if the previous command was not a Q, q, T or t,\n                    // assume the control point is coincident with the current point\n                    controlX = x4;\n                    controlY = y4;\n                } else if (previous[0] === \"t\") {\n                    // calculate reflection of previous control points for t\n                    controlX = 2 * x4 - tempControlX;\n                    controlY = 2 * y4 - tempControlY;\n                } else if (previous[0] === \"q\") {\n                    // calculate reflection of previous control points for q\n                    controlX = 2 * x4 - controlX;\n                    controlY = 2 * y4 - controlY;\n                }\n                tempControlX = controlX;\n                tempControlY = controlY;\n                context1.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                controlX = x4 + current[1];\n                controlY = y4 + current[2];\n                break;\n            case \"T\":\n                tempX = current[1];\n                tempY = current[2]; // calculate reflection of previous control points\n                controlX = 2 * x4 - controlX;\n                controlY = 2 * y4 - controlY;\n                context1.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                break;\n            case \"a\":\n                drawArc(context1, x4 + l, y4 + t, [\n                    current[1],\n                    current[2],\n                    current[3],\n                    current[4],\n                    current[5],\n                    current[6] + x4 + l,\n                    current[7] + y4 + t\n                ]);\n                x4 += current[6];\n                y4 += current[7];\n                break;\n            case \"A\":\n                drawArc(context1, x4 + l, y4 + t, [\n                    current[1],\n                    current[2],\n                    current[3],\n                    current[4],\n                    current[5],\n                    current[6] + l,\n                    current[7] + t\n                ]);\n                x4 = current[6];\n                y4 = current[7];\n                break;\n            case \"z\":\n            case \"Z\":\n                context1.closePath();\n                break;\n        }\n        previous = current;\n    }\n}\nfunction drawArc(context2, x5, y5, coords) {\n    const seg = segments(coords[5], coords[6], coords[0], coords[1], coords[3], coords[4], coords[2], x5, y5);\n    for(let i = 0; i < seg.length; ++i){\n        const bez = bezier(seg[i]);\n        context2.bezierCurveTo(bez[0], bez[1], bez[2], bez[3], bez[4], bez[5]);\n    }\n}\nconst Tan30 = 0.5773502691896257;\nconst builtins = {\n    \"circle\": {\n        draw: function(context3, size) {\n            const r = Math.sqrt(size) / 2;\n            context3.moveTo(r, 0);\n            context3.arc(0, 0, r, 0, Tau);\n        }\n    },\n    \"cross\": {\n        draw: function(context4, size) {\n            var r = Math.sqrt(size) / 2, s = r / 2.5;\n            context4.moveTo(-r, -s);\n            context4.lineTo(-r, s);\n            context4.lineTo(-s, s);\n            context4.lineTo(-s, r);\n            context4.lineTo(s, r);\n            context4.lineTo(s, s);\n            context4.lineTo(r, s);\n            context4.lineTo(r, -s);\n            context4.lineTo(s, -s);\n            context4.lineTo(s, -r);\n            context4.lineTo(-s, -r);\n            context4.lineTo(-s, -s);\n            context4.closePath();\n        }\n    },\n    \"diamond\": {\n        draw: function(context5, size) {\n            const r = Math.sqrt(size) / 2;\n            context5.moveTo(-r, 0);\n            context5.lineTo(0, -r);\n            context5.lineTo(r, 0);\n            context5.lineTo(0, r);\n            context5.closePath();\n        }\n    },\n    \"square\": {\n        draw: function(context6, size) {\n            var w1 = Math.sqrt(size), x6 = -w1 / 2;\n            context6.rect(x6, x6, w1, w1);\n        }\n    },\n    \"arrow\": {\n        draw: function(context7, size) {\n            var r = Math.sqrt(size) / 2, s = r / 7, t = r / 2.5, v = r / 8;\n            context7.moveTo(-s, r);\n            context7.lineTo(s, r);\n            context7.lineTo(s, -v);\n            context7.lineTo(t, -v);\n            context7.lineTo(0, -r);\n            context7.lineTo(-t, -v);\n            context7.lineTo(-s, -v);\n            context7.closePath();\n        }\n    },\n    \"wedge\": {\n        draw: function(context8, size) {\n            var r = Math.sqrt(size) / 2, h1 = HalfSqrt3 * r, o = h1 - r * Tan30, b1 = r / 4;\n            context8.moveTo(0, -h1 - o);\n            context8.lineTo(-b1, h1 - o);\n            context8.lineTo(b1, h1 - o);\n            context8.closePath();\n        }\n    },\n    \"triangle\": {\n        draw: function(context9, size) {\n            var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30;\n            context9.moveTo(0, -h2 - o);\n            context9.lineTo(-r, h2 - o);\n            context9.lineTo(r, h2 - o);\n            context9.closePath();\n        }\n    },\n    \"triangle-up\": {\n        draw: function(context10, size) {\n            var r = Math.sqrt(size) / 2, h3 = HalfSqrt3 * r;\n            context10.moveTo(0, -h3);\n            context10.lineTo(-r, h3);\n            context10.lineTo(r, h3);\n            context10.closePath();\n        }\n    },\n    \"triangle-down\": {\n        draw: function(context11, size) {\n            var r = Math.sqrt(size) / 2, h4 = HalfSqrt3 * r;\n            context11.moveTo(0, h4);\n            context11.lineTo(-r, -h4);\n            context11.lineTo(r, -h4);\n            context11.closePath();\n        }\n    },\n    \"triangle-right\": {\n        draw: function(context12, size) {\n            var r = Math.sqrt(size) / 2, h5 = HalfSqrt3 * r;\n            context12.moveTo(h5, 0);\n            context12.lineTo(-h5, -r);\n            context12.lineTo(-h5, r);\n            context12.closePath();\n        }\n    },\n    \"triangle-left\": {\n        draw: function(context13, size) {\n            var r = Math.sqrt(size) / 2, h6 = HalfSqrt3 * r;\n            context13.moveTo(-h6, 0);\n            context13.lineTo(h6, -r);\n            context13.lineTo(h6, r);\n            context13.closePath();\n        }\n    },\n    \"stroke\": {\n        draw: function(context14, size) {\n            const r = Math.sqrt(size) / 2;\n            context14.moveTo(-r, 0);\n            context14.lineTo(r, 0);\n        }\n    }\n};\nfunction symbols(_) {\n    return (0, _vegaUtil.hasOwnProperty)(builtins, _) ? builtins[_] : customSymbol(_);\n}\nvar custom = {};\nfunction customSymbol(path3) {\n    if (!(0, _vegaUtil.hasOwnProperty)(custom, path3)) {\n        const parsed = pathParse(path3);\n        custom[path3] = {\n            draw: function(context15, size) {\n                pathRender(context15, parsed, 0, 0, Math.sqrt(size) / 2);\n            }\n        };\n    }\n    return custom[path3];\n}\nconst C = 0.448084975506; // C = 1 - c\nfunction rectangleX(d) {\n    return d.x;\n}\nfunction rectangleY(d) {\n    return d.y;\n}\nfunction rectangleWidth(d) {\n    return d.width;\n}\nfunction rectangleHeight(d) {\n    return d.height;\n}\nfunction number(_) {\n    return typeof _ === \"function\" ? _ : ()=>+_;\n}\nfunction clamp(value2, min, max) {\n    return Math.max(min, Math.min(value2, max));\n}\nfunction vg_rect() {\n    var x7 = rectangleX, y6 = rectangleY, width = rectangleWidth, height = rectangleHeight, crTL = number(0), crTR = crTL, crBL = crTL, crBR = crTL, context16 = null;\n    function rectangle1(_, x0, y0) {\n        var buffer, x1 = x0 != null ? x0 : +x7.call(this, _), y1 = y0 != null ? y0 : +y6.call(this, _), w2 = +width.call(this, _), h7 = +height.call(this, _), s = Math.min(w2, h7) / 2, tl1 = clamp(+crTL.call(this, _), 0, s), tr1 = clamp(+crTR.call(this, _), 0, s), bl1 = clamp(+crBL.call(this, _), 0, s), br1 = clamp(+crBR.call(this, _), 0, s);\n        if (!context16) context16 = buffer = (0, _d3Path.path)();\n        if (tl1 <= 0 && tr1 <= 0 && bl1 <= 0 && br1 <= 0) context16.rect(x1, y1, w2, h7);\n        else {\n            var x2 = x1 + w2, y2 = y1 + h7;\n            context16.moveTo(x1 + tl1, y1);\n            context16.lineTo(x2 - tr1, y1);\n            context16.bezierCurveTo(x2 - C * tr1, y1, x2, y1 + C * tr1, x2, y1 + tr1);\n            context16.lineTo(x2, y2 - br1);\n            context16.bezierCurveTo(x2, y2 - C * br1, x2 - C * br1, y2, x2 - br1, y2);\n            context16.lineTo(x1 + bl1, y2);\n            context16.bezierCurveTo(x1 + C * bl1, y2, x1, y2 - C * bl1, x1, y2 - bl1);\n            context16.lineTo(x1, y1 + tl1);\n            context16.bezierCurveTo(x1, y1 + C * tl1, x1 + C * tl1, y1, x1 + tl1, y1);\n            context16.closePath();\n        }\n        if (buffer) {\n            context16 = null;\n            return buffer + \"\" || null;\n        }\n    }\n    rectangle1.x = function(_) {\n        if (arguments.length) {\n            x7 = number(_);\n            return rectangle1;\n        } else return x7;\n    };\n    rectangle1.y = function(_) {\n        if (arguments.length) {\n            y6 = number(_);\n            return rectangle1;\n        } else return y6;\n    };\n    rectangle1.width = function(_) {\n        if (arguments.length) {\n            width = number(_);\n            return rectangle1;\n        } else return width;\n    };\n    rectangle1.height = function(_) {\n        if (arguments.length) {\n            height = number(_);\n            return rectangle1;\n        } else return height;\n    };\n    rectangle1.cornerRadius = function(tl2, tr2, br2, bl2) {\n        if (arguments.length) {\n            crTL = number(tl2);\n            crTR = tr2 != null ? number(tr2) : crTL;\n            crBR = br2 != null ? number(br2) : crTL;\n            crBL = bl2 != null ? number(bl2) : crTR;\n            return rectangle1;\n        } else return crTL;\n    };\n    rectangle1.context = function(_) {\n        if (arguments.length) {\n            context16 = _ == null ? null : _;\n            return rectangle1;\n        } else return context16;\n    };\n    return rectangle1;\n}\nfunction vg_trail() {\n    var x8, y7, size, defined, context17 = null, ready, x1, y1, r1;\n    function point1(x2, y2, w2) {\n        const r2 = w2 / 2;\n        if (ready) {\n            var ux = y1 - y2, uy = x2 - x1;\n            if (ux || uy) {\n                // get normal vector\n                var ud = Math.sqrt(ux * ux + uy * uy), rx = (ux /= ud) * r1, ry = (uy /= ud) * r1, t = Math.atan2(uy, ux); // draw segment\n                context17.moveTo(x1 - rx, y1 - ry);\n                context17.lineTo(x2 - ux * r2, y2 - uy * r2);\n                context17.arc(x2, y2, r2, t - Math.PI, t);\n                context17.lineTo(x1 + rx, y1 + ry);\n                context17.arc(x1, y1, r1, t, t + Math.PI);\n            } else context17.arc(x2, y2, r2, 0, Tau);\n            context17.closePath();\n        } else ready = 1;\n        x1 = x2;\n        y1 = y2;\n        r1 = r2;\n    }\n    function trail1(data) {\n        var i, n = data.length, d, defined0 = false, buffer;\n        if (context17 == null) context17 = buffer = (0, _d3Path.path)();\n        for(i = 0; i <= n; ++i){\n            if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n                if (defined0 = !defined0) ready = 0;\n            }\n            if (defined0) point1(+x8(d, i, data), +y7(d, i, data), +size(d, i, data));\n        }\n        if (buffer) {\n            context17 = null;\n            return buffer + \"\" || null;\n        }\n    }\n    trail1.x = function(_) {\n        if (arguments.length) {\n            x8 = _;\n            return trail1;\n        } else return x8;\n    };\n    trail1.y = function(_) {\n        if (arguments.length) {\n            y7 = _;\n            return trail1;\n        } else return y7;\n    };\n    trail1.size = function(_) {\n        if (arguments.length) {\n            size = _;\n            return trail1;\n        } else return size;\n    };\n    trail1.defined = function(_) {\n        if (arguments.length) {\n            defined = _;\n            return trail1;\n        } else return defined;\n    };\n    trail1.context = function(_) {\n        if (arguments.length) {\n            if (_ == null) context17 = null;\n            else context17 = _;\n            return trail1;\n        } else return context17;\n    };\n    return trail1;\n}\nfunction value$1(a, b2) {\n    return a != null ? a : b2;\n}\nconst x = (item)=>item.x || 0, y = (item)=>item.y || 0, w = (item)=>item.width || 0, h = (item)=>item.height || 0, xw = (item)=>(item.x || 0) + (item.width || 0), yh = (item)=>(item.y || 0) + (item.height || 0), sa = (item)=>item.startAngle || 0, ea = (item)=>item.endAngle || 0, pa = (item)=>item.padAngle || 0, ir = (item)=>item.innerRadius || 0, or = (item)=>item.outerRadius || 0, cr = (item)=>item.cornerRadius || 0, tl = (item)=>value$1(item.cornerRadiusTopLeft, item.cornerRadius) || 0, tr = (item)=>value$1(item.cornerRadiusTopRight, item.cornerRadius) || 0, br = (item)=>value$1(item.cornerRadiusBottomRight, item.cornerRadius) || 0, bl = (item)=>value$1(item.cornerRadiusBottomLeft, item.cornerRadius) || 0, sz = (item)=>value$1(item.size, 64), ts = (item)=>item.size || 1, def = (item)=>!(item.defined === false), type = (item)=>symbols(item.shape || \"circle\");\nconst arcShape = (0, _d3Shape.arc)().startAngle(sa).endAngle(ea).padAngle(pa).innerRadius(ir).outerRadius(or).cornerRadius(cr), areavShape = (0, _d3Shape.area)().x(x).y1(y).y0(yh).defined(def), areahShape = (0, _d3Shape.area)().y(y).x1(x).x0(xw).defined(def), lineShape = (0, _d3Shape.line)().x(x).y(y).defined(def), rectShape = vg_rect().x(x).y(y).width(w).height(h).cornerRadius(tl, tr, br, bl), symbolShape = (0, _d3Shape.symbol)().type(type).size(sz), trailShape = vg_trail().x(x).y(y).defined(def).size(ts);\nfunction hasCornerRadius(item) {\n    return item.cornerRadius || item.cornerRadiusTopLeft || item.cornerRadiusTopRight || item.cornerRadiusBottomRight || item.cornerRadiusBottomLeft;\n}\nfunction arc$1(context18, item) {\n    return arcShape.context(context18)(item);\n}\nfunction area$1(context19, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return (item.orient === \"horizontal\" ? areahShape : areavShape).curve(curves(interp, item.orient, item.tension)).context(context19)(items);\n}\nfunction line$1(context20, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return lineShape.curve(curves(interp, item.orient, item.tension)).context(context20)(items);\n}\nfunction rectangle(context21, item, x9, y8) {\n    return rectShape.context(context21)(item, x9, y8);\n}\nfunction shape$1(context22, item) {\n    return (item.mark.shape || item.shape).context(context22)(item);\n}\nfunction symbol$1(context23, item) {\n    return symbolShape.context(context23)(item);\n}\nfunction trail$1(context24, items) {\n    return trailShape.context(context24)(items);\n}\nvar clip_id = 1;\nfunction resetSVGClipId() {\n    clip_id = 1;\n}\nfunction clip$1(renderer, item, size) {\n    var clip1 = item.clip, defs = renderer._defs, id = item.clip_id || (item.clip_id = \"clip\" + clip_id++), c = defs.clipping[id] || (defs.clipping[id] = {\n        id: id\n    });\n    if ((0, _vegaUtil.isFunction)(clip1)) c.path = clip1(null);\n    else if (hasCornerRadius(size)) c.path = rectangle(null, size, 0, 0);\n    else {\n        c.width = size.width || 0;\n        c.height = size.height || 0;\n    }\n    return \"url(#\" + id + \")\";\n}\nfunction Bounds(b3) {\n    this.clear();\n    if (b3) this.union(b3);\n}\nBounds.prototype = {\n    clone () {\n        return new Bounds(this);\n    },\n    clear () {\n        this.x1 = +Number.MAX_VALUE;\n        this.y1 = +Number.MAX_VALUE;\n        this.x2 = -Number.MAX_VALUE;\n        this.y2 = -Number.MAX_VALUE;\n        return this;\n    },\n    empty () {\n        return this.x1 === +Number.MAX_VALUE && this.y1 === +Number.MAX_VALUE && this.x2 === -Number.MAX_VALUE && this.y2 === -Number.MAX_VALUE;\n    },\n    equals (b4) {\n        return this.x1 === b4.x1 && this.y1 === b4.y1 && this.x2 === b4.x2 && this.y2 === b4.y2;\n    },\n    set (x1, y1, x2, y2) {\n        if (x2 < x1) {\n            this.x2 = x1;\n            this.x1 = x2;\n        } else {\n            this.x1 = x1;\n            this.x2 = x2;\n        }\n        if (y2 < y1) {\n            this.y2 = y1;\n            this.y1 = y2;\n        } else {\n            this.y1 = y1;\n            this.y2 = y2;\n        }\n        return this;\n    },\n    add (x10, y9) {\n        if (x10 < this.x1) this.x1 = x10;\n        if (y9 < this.y1) this.y1 = y9;\n        if (x10 > this.x2) this.x2 = x10;\n        if (y9 > this.y2) this.y2 = y9;\n        return this;\n    },\n    expand (d) {\n        this.x1 -= d;\n        this.y1 -= d;\n        this.x2 += d;\n        this.y2 += d;\n        return this;\n    },\n    round () {\n        this.x1 = Math.floor(this.x1);\n        this.y1 = Math.floor(this.y1);\n        this.x2 = Math.ceil(this.x2);\n        this.y2 = Math.ceil(this.y2);\n        return this;\n    },\n    scale (s) {\n        this.x1 *= s;\n        this.y1 *= s;\n        this.x2 *= s;\n        this.y2 *= s;\n        return this;\n    },\n    translate (dx, dy) {\n        this.x1 += dx;\n        this.x2 += dx;\n        this.y1 += dy;\n        this.y2 += dy;\n        return this;\n    },\n    rotate (angle, x11, y10) {\n        const p = this.rotatedPoints(angle, x11, y10);\n        return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n    },\n    rotatedPoints (angle, x12, y11) {\n        var { x1 , y1 , x2 , y2  } = this, cos = Math.cos(angle), sin = Math.sin(angle), cx = x12 - x12 * cos + y11 * sin, cy = y11 - x12 * sin - y11 * cos;\n        return [\n            cos * x1 - sin * y1 + cx,\n            sin * x1 + cos * y1 + cy,\n            cos * x1 - sin * y2 + cx,\n            sin * x1 + cos * y2 + cy,\n            cos * x2 - sin * y1 + cx,\n            sin * x2 + cos * y1 + cy,\n            cos * x2 - sin * y2 + cx,\n            sin * x2 + cos * y2 + cy\n        ];\n    },\n    union (b5) {\n        if (b5.x1 < this.x1) this.x1 = b5.x1;\n        if (b5.y1 < this.y1) this.y1 = b5.y1;\n        if (b5.x2 > this.x2) this.x2 = b5.x2;\n        if (b5.y2 > this.y2) this.y2 = b5.y2;\n        return this;\n    },\n    intersect (b6) {\n        if (b6.x1 > this.x1) this.x1 = b6.x1;\n        if (b6.y1 > this.y1) this.y1 = b6.y1;\n        if (b6.x2 < this.x2) this.x2 = b6.x2;\n        if (b6.y2 < this.y2) this.y2 = b6.y2;\n        return this;\n    },\n    encloses (b7) {\n        return b7 && this.x1 <= b7.x1 && this.x2 >= b7.x2 && this.y1 <= b7.y1 && this.y2 >= b7.y2;\n    },\n    alignsWith (b8) {\n        return b8 && (this.x1 == b8.x1 || this.x2 == b8.x2 || this.y1 == b8.y1 || this.y2 == b8.y2);\n    },\n    intersects (b9) {\n        return b9 && !(this.x2 < b9.x1 || this.x1 > b9.x2 || this.y2 < b9.y1 || this.y1 > b9.y2);\n    },\n    contains (x13, y12) {\n        return !(x13 < this.x1 || x13 > this.x2 || y12 < this.y1 || y12 > this.y2);\n    },\n    width () {\n        return this.x2 - this.x1;\n    },\n    height () {\n        return this.y2 - this.y1;\n    }\n};\nfunction Item(mark) {\n    this.mark = mark;\n    this.bounds = this.bounds || new Bounds();\n}\nfunction GroupItem(mark) {\n    Item.call(this, mark);\n    this.items = this.items || [];\n}\n(0, _vegaUtil.inherits)(GroupItem, Item);\nfunction ResourceLoader(customLoader) {\n    this._pending = 0;\n    this._loader = customLoader || (0, _vegaLoader.loader)();\n}\nfunction increment(loader) {\n    loader._pending += 1;\n}\nfunction decrement(loader) {\n    loader._pending -= 1;\n}\nResourceLoader.prototype = {\n    pending () {\n        return this._pending;\n    },\n    sanitizeURL (uri) {\n        const loader = this;\n        increment(loader);\n        return loader._loader.sanitize(uri, {\n            context: \"href\"\n        }).then((opt)=>{\n            decrement(loader);\n            return opt;\n        }).catch(()=>{\n            decrement(loader);\n            return null;\n        });\n    },\n    loadImage (uri) {\n        const loader = this, Image = (0, _vegaCanvas.image)();\n        increment(loader);\n        return loader._loader.sanitize(uri, {\n            context: \"image\"\n        }).then((opt)=>{\n            const url = opt.href;\n            if (!url || !Image) throw {\n                url: url\n            };\n            const img = new Image(); // set crossOrigin only if cors is defined; empty string sets anonymous mode\n            // https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/crossOrigin\n            const cors = (0, _vegaUtil.hasOwnProperty)(opt, \"crossOrigin\") ? opt.crossOrigin : \"anonymous\";\n            if (cors != null) img.crossOrigin = cors; // attempt to load image resource\n            img.onload = ()=>decrement(loader);\n            img.onerror = ()=>decrement(loader);\n            img.src = url;\n            return img;\n        }).catch((e)=>{\n            decrement(loader);\n            return {\n                complete: false,\n                width: 0,\n                height: 0,\n                src: e && e.url || \"\"\n            };\n        });\n    },\n    ready () {\n        const loader = this;\n        return new Promise((accept)=>{\n            function poll(value3) {\n                if (!loader.pending()) accept(value3);\n                else setTimeout(()=>{\n                    poll(true);\n                }, 10);\n            }\n            poll(false);\n        });\n    }\n};\nfunction boundStroke(bounds1, item, miter) {\n    if (item.stroke && item.opacity !== 0 && item.strokeOpacity !== 0) {\n        const sw = item.strokeWidth != null ? +item.strokeWidth : 1;\n        bounds1.expand(sw + (miter ? miterAdjustment(item, sw) : 0));\n    }\n    return bounds1;\n}\nfunction miterAdjustment(item, strokeWidth) {\n    // TODO: more sophisticated adjustment? Or miter support in boundContext?\n    return item.strokeJoin && item.strokeJoin !== \"miter\" ? 0 : strokeWidth;\n}\nconst circleThreshold = Tau - 1e-8;\nlet bounds, lx, ly, rot, ma, mb, mc, md;\nconst add = (x14, y13)=>bounds.add(x14, y13);\nconst addL = (x15, y14)=>add(lx = x15, ly = y14);\nconst addX = (x16)=>add(x16, bounds.y1);\nconst addY = (y15)=>add(bounds.x1, y15);\nconst px = (x17, y16)=>ma * x17 + mc * y16;\nconst py = (x18, y17)=>mb * x18 + md * y17;\nconst addp = (x19, y18)=>add(px(x19, y18), py(x19, y18));\nconst addpL = (x20, y19)=>addL(px(x20, y19), py(x20, y19));\nfunction boundContext(_, deg) {\n    bounds = _;\n    if (deg) {\n        rot = deg * DegToRad;\n        ma = md = Math.cos(rot);\n        mb = Math.sin(rot);\n        mc = -mb;\n    } else {\n        ma = md = 1;\n        rot = mb = mc = 0;\n    }\n    return context$1;\n}\nconst context$1 = {\n    beginPath () {},\n    closePath () {},\n    moveTo: addpL,\n    lineTo: addpL,\n    rect (x21, y20, w3, h8) {\n        if (rot) {\n            addp(x21 + w3, y20);\n            addp(x21 + w3, y20 + h8);\n            addp(x21, y20 + h8);\n            addpL(x21, y20);\n        } else {\n            add(x21 + w3, y20 + h8);\n            addL(x21, y20);\n        }\n    },\n    quadraticCurveTo (x1, y1, x2, y2) {\n        const px1 = px(x1, y1), py1 = py(x1, y1), px2 = px(x2, y2), py2 = py(x2, y2);\n        quadExtrema(lx, px1, px2, addX);\n        quadExtrema(ly, py1, py2, addY);\n        addL(px2, py2);\n    },\n    bezierCurveTo (x1, y1, x2, y2, x3, y3) {\n        const px1 = px(x1, y1), py1 = py(x1, y1), px2 = px(x2, y2), py2 = py(x2, y2), px3 = px(x3, y3), py3 = py(x3, y3);\n        cubicExtrema(lx, px1, px2, px3, addX);\n        cubicExtrema(ly, py1, py2, py3, addY);\n        addL(px3, py3);\n    },\n    arc (cx, cy, r, sa1, ea1, ccw) {\n        sa1 += rot;\n        ea1 += rot; // store last point on path\n        lx = r * Math.cos(ea1) + cx;\n        ly = r * Math.sin(ea1) + cy;\n        if (Math.abs(ea1 - sa1) > circleThreshold) {\n            // treat as full circle\n            add(cx - r, cy - r);\n            add(cx + r, cy + r);\n        } else {\n            const update = (a)=>add(r * Math.cos(a) + cx, r * Math.sin(a) + cy);\n            let s, i; // sample end points\n            update(sa1);\n            update(ea1); // sample interior points aligned with 90 degrees\n            if (ea1 !== sa1) {\n                sa1 = sa1 % Tau;\n                if (sa1 < 0) sa1 += Tau;\n                ea1 = ea1 % Tau;\n                if (ea1 < 0) ea1 += Tau;\n                if (ea1 < sa1) {\n                    ccw = !ccw; // flip direction\n                    s = sa1;\n                    sa1 = ea1;\n                    ea1 = s; // swap end-points\n                }\n                if (ccw) {\n                    ea1 -= Tau;\n                    s = sa1 - sa1 % HalfPi;\n                    for(i = 0; i < 4 && s > ea1; ++i, s -= HalfPi)update(s);\n                } else {\n                    s = sa1 - sa1 % HalfPi + HalfPi;\n                    for(i = 0; i < 4 && s < ea1; ++i, s = s + HalfPi)update(s);\n                }\n            }\n        }\n    }\n};\nfunction quadExtrema(x0, x1, x2, cb) {\n    const t = (x0 - x1) / (x0 + x2 - 2 * x1);\n    if (0 < t && t < 1) cb(x0 + (x1 - x0) * t);\n}\nfunction cubicExtrema(x0, x1, x2, x3, cb) {\n    const a = x3 - x0 + 3 * x1 - 3 * x2, b10 = x0 + x2 - 2 * x1, c = x0 - x1;\n    let t0 = 0, t1 = 0, r; // solve for parameter t\n    if (Math.abs(a) > Epsilon) {\n        // quadratic equation\n        r = b10 * b10 + c * a;\n        if (r >= 0) {\n            r = Math.sqrt(r);\n            t0 = (-b10 + r) / a;\n            t1 = (-b10 - r) / a;\n        }\n    } else // linear equation\n    t0 = 0.5 * c / b10;\n     // calculate position\n    if (0 < t0 && t0 < 1) cb(cubic(t0, x0, x1, x2, x3));\n    if (0 < t1 && t1 < 1) cb(cubic(t1, x0, x1, x2, x3));\n}\nfunction cubic(t, x0, x1, x2, x3) {\n    const s = 1 - t, s2 = s * s, t2 = t * t;\n    return s2 * s * x0 + 3 * s2 * t * x1 + 3 * s * t2 * x2 + t2 * t * x3;\n}\nvar context = (context = (0, _vegaCanvas.canvas)(1, 1)) ? context.getContext(\"2d\") : null;\nconst b = new Bounds();\nfunction intersectPath(draw1) {\n    return function(item, brush) {\n        // rely on (inaccurate) bounds intersection if no context\n        if (!context) return true; // add path to offscreen graphics context\n        draw1(context, item); // get bounds intersection region\n        b.clear().union(item.bounds).intersect(brush).round();\n        const { x1 , y1 , x2 , y2  } = b; // iterate over intersection region\n        // perform fine grained inclusion test\n        for(let y21 = y1; y21 <= y2; ++y21)for(let x22 = x1; x22 <= x2; ++x22){\n            if (context.isPointInPath(x22, y21)) return true;\n        }\n         // false if no hits in intersection region\n        return false;\n    };\n}\nfunction intersectPoint(item, box) {\n    return box.contains(item.x || 0, item.y || 0);\n}\nfunction intersectRect(item, box) {\n    const x23 = item.x || 0, y22 = item.y || 0, w4 = item.width || 0, h9 = item.height || 0;\n    return box.intersects(b.set(x23, y22, x23 + w4, y22 + h9));\n}\nfunction intersectRule(item, box) {\n    const x24 = item.x || 0, y23 = item.y || 0, x2 = item.x2 != null ? item.x2 : x24, y2 = item.y2 != null ? item.y2 : y23;\n    return intersectBoxLine(box, x24, y23, x2, y2);\n}\nfunction intersectBoxLine(box, x25, y24, u, v) {\n    const { x1 , y1 , x2 , y2  } = box, dx = u - x25, dy = v - y24;\n    let t0 = 0, t1 = 1, p, q, r, e;\n    for(e = 0; e < 4; ++e){\n        if (e === 0) {\n            p = -dx;\n            q = -(x1 - x25);\n        }\n        if (e === 1) {\n            p = dx;\n            q = x2 - x25;\n        }\n        if (e === 2) {\n            p = -dy;\n            q = -(y1 - y24);\n        }\n        if (e === 3) {\n            p = dy;\n            q = y2 - y24;\n        }\n        if (Math.abs(p) < 1e-10 && q < 0) return false;\n        r = q / p;\n        if (p < 0) {\n            if (r > t1) return false;\n            else if (r > t0) t0 = r;\n        } else if (p > 0) {\n            if (r < t0) return false;\n            else if (r < t1) t1 = r;\n        }\n    }\n    return true;\n}\nfunction blend(context25, item) {\n    context25.globalCompositeOperation = item.blend || \"source-over\";\n}\nfunction value(value4, dflt) {\n    return value4 == null ? dflt : value4;\n}\nfunction addStops(gradient2, stops) {\n    const n = stops.length;\n    for(let i = 0; i < n; ++i)gradient2.addColorStop(stops[i].offset, stops[i].color);\n    return gradient2;\n}\nfunction gradient(context26, spec, bounds2) {\n    const w5 = bounds2.width(), h10 = bounds2.height();\n    let gradient3;\n    if (spec.gradient === \"radial\") gradient3 = context26.createRadialGradient(bounds2.x1 + value(spec.x1, 0.5) * w5, bounds2.y1 + value(spec.y1, 0.5) * h10, Math.max(w5, h10) * value(spec.r1, 0), bounds2.x1 + value(spec.x2, 0.5) * w5, bounds2.y1 + value(spec.y2, 0.5) * h10, Math.max(w5, h10) * value(spec.r2, 0.5));\n    else {\n        // linear gradient\n        const x1 = value(spec.x1, 0), y1 = value(spec.y1, 0), x2 = value(spec.x2, 1), y2 = value(spec.y2, 0);\n        if (x1 === x2 || y1 === y2 || w5 === h10) // axis aligned: use normal gradient\n        gradient3 = context26.createLinearGradient(bounds2.x1 + x1 * w5, bounds2.y1 + y1 * h10, bounds2.x1 + x2 * w5, bounds2.y1 + y2 * h10);\n        else {\n            // not axis aligned: render gradient into a pattern (#2365)\n            // this allows us to use normalized bounding box coordinates\n            const image1 = (0, _vegaCanvas.canvas)(Math.ceil(w5), Math.ceil(h10)), ictx = image1.getContext(\"2d\");\n            ictx.scale(w5, h10);\n            ictx.fillStyle = addStops(ictx.createLinearGradient(x1, y1, x2, y2), spec.stops);\n            ictx.fillRect(0, 0, w5, h10);\n            return context26.createPattern(image1, \"no-repeat\");\n        }\n    }\n    return addStops(gradient3, spec.stops);\n}\nfunction color(context27, item, value5) {\n    return isGradient(value5) ? gradient(context27, value5, item.bounds) : value5;\n}\nfunction fill(context28, item, opacity) {\n    opacity *= item.fillOpacity == null ? 1 : item.fillOpacity;\n    if (opacity > 0) {\n        context28.globalAlpha = opacity;\n        context28.fillStyle = color(context28, item, item.fill);\n        return true;\n    } else return false;\n}\nvar Empty = [];\nfunction stroke(context29, item, opacity) {\n    var lw = (lw = item.strokeWidth) != null ? lw : 1;\n    if (lw <= 0) return false;\n    opacity *= item.strokeOpacity == null ? 1 : item.strokeOpacity;\n    if (opacity > 0) {\n        context29.globalAlpha = opacity;\n        context29.strokeStyle = color(context29, item, item.stroke);\n        context29.lineWidth = lw;\n        context29.lineCap = item.strokeCap || \"butt\";\n        context29.lineJoin = item.strokeJoin || \"miter\";\n        context29.miterLimit = item.strokeMiterLimit || 10;\n        if (context29.setLineDash) {\n            context29.setLineDash(item.strokeDash || Empty);\n            context29.lineDashOffset = item.strokeDashOffset || 0;\n        }\n        return true;\n    } else return false;\n}\nfunction compare(a, b11) {\n    return a.zindex - b11.zindex || a.index - b11.index;\n}\nfunction zorder(scene) {\n    if (!scene.zdirty) return scene.zitems;\n    var items = scene.items, output = [], item, i, n;\n    for(i = 0, n = items.length; i < n; ++i){\n        item = items[i];\n        item.index = i;\n        if (item.zindex) output.push(item);\n    }\n    scene.zdirty = false;\n    return scene.zitems = output.sort(compare);\n}\nfunction visit(scene, visitor) {\n    var items = scene.items, i, n;\n    if (!items || !items.length) return;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) {\n        for(i = 0, n = items.length; i < n; ++i)if (!items[i].zindex) visitor(items[i]);\n        items = zitems;\n    }\n    for(i = 0, n = items.length; i < n; ++i)visitor(items[i]);\n}\nfunction pickVisit(scene, visitor) {\n    var items = scene.items, hit1, i;\n    if (!items || !items.length) return null;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) items = zitems;\n    for(i = items.length; --i >= 0;){\n        if (hit1 = visitor(items[i])) return hit1;\n    }\n    if (items === zitems) {\n        for(items = scene.items, i = items.length; --i >= 0;)if (!items[i].zindex) {\n            if (hit1 = visitor(items[i])) return hit1;\n        }\n    }\n    return null;\n}\nfunction drawAll(path4) {\n    return function(context30, scene, bounds3) {\n        visit(scene, (item)=>{\n            if (!bounds3 || bounds3.intersects(item.bounds)) drawPath(path4, context30, item, item);\n        });\n    };\n}\nfunction drawOne(path5) {\n    return function(context31, scene, bounds4) {\n        if (scene.items.length && (!bounds4 || bounds4.intersects(scene.bounds))) drawPath(path5, context31, scene.items[0], scene.items);\n    };\n}\nfunction drawPath(path6, context32, item, items) {\n    var opacity = item.opacity == null ? 1 : item.opacity;\n    if (opacity === 0) return;\n    if (path6(context32, items)) return;\n    blend(context32, item);\n    if (item.fill && fill(context32, item, opacity)) context32.fill();\n    if (item.stroke && stroke(context32, item, opacity)) context32.stroke();\n}\nfunction pick$1(test) {\n    test = test || (0, _vegaUtil.truthy);\n    return function(context33, scene, x26, y25, gx, gy) {\n        x26 *= context33.pixelRatio;\n        y25 *= context33.pixelRatio;\n        return pickVisit(scene, (item)=>{\n            const b12 = item.bounds; // first hit test against bounding box\n            if (b12 && !b12.contains(gx, gy) || !b12) return; // if in bounding box, perform more careful test\n            if (test(context33, item, x26, y25, gx, gy)) return item;\n        });\n    };\n}\nfunction hitPath(path7, filled) {\n    return function(context34, o, x27, y26) {\n        var item = Array.isArray(o) ? o[0] : o, fill1 = filled == null ? item.fill : filled, stroke1 = item.stroke && context34.isPointInStroke, lw, lc;\n        if (stroke1) {\n            lw = item.strokeWidth;\n            lc = item.strokeCap;\n            context34.lineWidth = lw != null ? lw : 1;\n            context34.lineCap = lc != null ? lc : \"butt\";\n        }\n        return path7(context34, o) ? false : fill1 && context34.isPointInPath(x27, y26) || stroke1 && context34.isPointInStroke(x27, y26);\n    };\n}\nfunction pickPath(path8) {\n    return pick$1(hitPath(path8));\n}\nfunction translate(x28, y27) {\n    return \"translate(\" + x28 + \",\" + y27 + \")\";\n}\nfunction rotate(a) {\n    return \"rotate(\" + a + \")\";\n}\nfunction scale(scaleX, scaleY) {\n    return \"scale(\" + scaleX + \",\" + scaleY + \")\";\n}\nfunction translateItem(item) {\n    return translate(item.x || 0, item.y || 0);\n}\nfunction rotateItem(item) {\n    return translate(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\");\n}\nfunction transformItem(item) {\n    return translate(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\") + (item.scaleX || item.scaleY ? \" \" + scale(item.scaleX || 1, item.scaleY || 1) : \"\");\n}\nfunction markItemPath(type3, shape1, isect) {\n    function attr1(emit1, item) {\n        emit1(\"transform\", rotateItem(item));\n        emit1(\"d\", shape1(null, item));\n    }\n    function bound1(bounds5, item) {\n        shape1(boundContext(bounds5, item.angle), item);\n        return boundStroke(bounds5, item).translate(item.x || 0, item.y || 0);\n    }\n    function draw2(context35, item) {\n        var x29 = item.x || 0, y28 = item.y || 0, a = item.angle || 0;\n        context35.translate(x29, y28);\n        if (a) context35.rotate(a *= DegToRad);\n        context35.beginPath();\n        shape1(context35, item);\n        if (a) context35.rotate(-a);\n        context35.translate(-x29, -y28);\n    }\n    return {\n        type: type3,\n        tag: \"path\",\n        nested: false,\n        attr: attr1,\n        bound: bound1,\n        draw: drawAll(draw2),\n        pick: pickPath(draw2),\n        isect: isect || intersectPath(draw2)\n    };\n}\nvar arc = markItemPath(\"arc\", arc$1);\nfunction pickArea(a, p) {\n    var v = a[0].orient === \"horizontal\" ? p[1] : p[0], z = a[0].orient === \"horizontal\" ? \"y\" : \"x\", i = a.length, min = Infinity, hit2, d;\n    while(--i >= 0){\n        if (a[i].defined === false) continue;\n        d = Math.abs(a[i][z] - v);\n        if (d < min) {\n            min = d;\n            hit2 = a[i];\n        }\n    }\n    return hit2;\n}\nfunction pickLine(a, p) {\n    var t = Math.pow(a[0].strokeWidth || 1, 2), i = a.length, dx, dy, dd;\n    while(--i >= 0){\n        if (a[i].defined === false) continue;\n        dx = a[i].x - p[0];\n        dy = a[i].y - p[1];\n        dd = dx * dx + dy * dy;\n        if (dd < t) return a[i];\n    }\n    return null;\n}\nfunction pickTrail(a, p) {\n    var i = a.length, dx, dy, dd;\n    while(--i >= 0){\n        if (a[i].defined === false) continue;\n        dx = a[i].x - p[0];\n        dy = a[i].y - p[1];\n        dd = dx * dx + dy * dy;\n        dx = a[i].size || 1;\n        if (dd < dx * dx) return a[i];\n    }\n    return null;\n}\nfunction markMultiItemPath(type4, shape2, tip) {\n    function attr2(emit2, item) {\n        var items = item.mark.items;\n        if (items.length) emit2(\"d\", shape2(null, items));\n    }\n    function bound2(bounds6, mark) {\n        var items = mark.items;\n        if (items.length === 0) return bounds6;\n        else {\n            shape2(boundContext(bounds6), items);\n            return boundStroke(bounds6, items[0]);\n        }\n    }\n    function draw3(context36, items) {\n        context36.beginPath();\n        shape2(context36, items);\n    }\n    const hit3 = hitPath(draw3);\n    function pick1(context37, scene, x30, y29, gx, gy) {\n        var items = scene.items, b13 = scene.bounds;\n        if (!items || !items.length || b13 && !b13.contains(gx, gy)) return null;\n        x30 *= context37.pixelRatio;\n        y29 *= context37.pixelRatio;\n        return hit3(context37, items, x30, y29) ? items[0] : null;\n    }\n    return {\n        type: type4,\n        tag: \"path\",\n        nested: true,\n        attr: attr2,\n        bound: bound2,\n        draw: drawOne(draw3),\n        pick: pick1,\n        isect: intersectPoint,\n        tip: tip\n    };\n}\nvar area = markMultiItemPath(\"area\", area$1, pickArea);\nfunction clip(context38, scene) {\n    var clip2 = scene.clip;\n    context38.save();\n    if ((0, _vegaUtil.isFunction)(clip2)) {\n        context38.beginPath();\n        clip2(context38);\n        context38.clip();\n    } else clipGroup(context38, scene.group);\n}\nfunction clipGroup(context39, group1) {\n    context39.beginPath();\n    hasCornerRadius(group1) ? rectangle(context39, group1, 0, 0) : context39.rect(0, 0, group1.width || 0, group1.height || 0);\n    context39.clip();\n}\nfunction offset$1(item) {\n    const sw = value(item.strokeWidth, 1);\n    return item.strokeOffset != null ? item.strokeOffset : item.stroke && sw > 0.5 && sw < 1.5 ? 0.5 - Math.abs(sw - 1) : 0;\n}\nfunction attr$5(emit3, item) {\n    emit3(\"transform\", translateItem(item));\n}\nfunction emitRectangle(emit4, item) {\n    const off = offset$1(item);\n    emit4(\"d\", rectangle(null, item, off, off));\n}\nfunction background(emit5, item) {\n    emit5(\"class\", \"background\");\n    emit5(\"aria-hidden\", true);\n    emitRectangle(emit5, item);\n}\nfunction foreground(emit6, item) {\n    emit6(\"class\", \"foreground\");\n    emit6(\"aria-hidden\", true);\n    if (item.strokeForeground) emitRectangle(emit6, item);\n    else emit6(\"d\", \"\");\n}\nfunction content(emit7, item, renderer) {\n    const url = item.clip ? clip$1(renderer, item, item) : null;\n    emit7(\"clip-path\", url);\n}\nfunction bound$5(bounds7, group2) {\n    if (!group2.clip && group2.items) {\n        const items = group2.items, m = items.length;\n        for(let j = 0; j < m; ++j)bounds7.union(items[j].bounds);\n    }\n    if ((group2.clip || group2.width || group2.height) && !group2.noBound) bounds7.add(0, 0).add(group2.width || 0, group2.height || 0);\n    boundStroke(bounds7, group2);\n    return bounds7.translate(group2.x || 0, group2.y || 0);\n}\nfunction rectanglePath(context40, group3, x31, y30) {\n    const off = offset$1(group3);\n    context40.beginPath();\n    rectangle(context40, group3, (x31 || 0) + off, (y30 || 0) + off);\n}\nconst hitBackground = hitPath(rectanglePath);\nconst hitForeground = hitPath(rectanglePath, false);\nconst hitCorner = hitPath(rectanglePath, true);\nfunction draw$4(context41, scene, bounds8) {\n    visit(scene, (group4)=>{\n        const gx = group4.x || 0, gy = group4.y || 0, fore = group4.strokeForeground, opacity = group4.opacity == null ? 1 : group4.opacity; // draw group background\n        if ((group4.stroke || group4.fill) && opacity) {\n            rectanglePath(context41, group4, gx, gy);\n            blend(context41, group4);\n            if (group4.fill && fill(context41, group4, opacity)) context41.fill();\n            if (group4.stroke && !fore && stroke(context41, group4, opacity)) context41.stroke();\n        } // setup graphics context, set clip and bounds\n        context41.save();\n        context41.translate(gx, gy);\n        if (group4.clip) clipGroup(context41, group4);\n        if (bounds8) bounds8.translate(-gx, -gy); // draw group contents\n        visit(group4, (item)=>{\n            this.draw(context41, item, bounds8);\n        }); // restore graphics context\n        if (bounds8) bounds8.translate(gx, gy);\n        context41.restore(); // draw group foreground\n        if (fore && group4.stroke && opacity) {\n            rectanglePath(context41, group4, gx, gy);\n            blend(context41, group4);\n            if (stroke(context41, group4, opacity)) context41.stroke();\n        }\n    });\n}\nfunction pick(context42, scene, x32, y31, gx, gy) {\n    if (scene.bounds && !scene.bounds.contains(gx, gy) || !scene.items) return null;\n    const cx = x32 * context42.pixelRatio, cy = y31 * context42.pixelRatio;\n    return pickVisit(scene, (group5)=>{\n        let hit4, dx, dy; // first hit test bounding box\n        const b14 = group5.bounds;\n        if (b14 && !b14.contains(gx, gy)) return; // passed bounds check, test rectangular clip\n        dx = group5.x || 0;\n        dy = group5.y || 0;\n        const dw = dx + (group5.width || 0), dh = dy + (group5.height || 0), c = group5.clip;\n        if (c && (gx < dx || gx > dw || gy < dy || gy > dh)) return; // adjust coordinate system\n        context42.save();\n        context42.translate(dx, dy);\n        dx = gx - dx;\n        dy = gy - dy; // test background for rounded corner clip\n        if (c && hasCornerRadius(group5) && !hitCorner(context42, group5, cx, cy)) {\n            context42.restore();\n            return null;\n        }\n        const fore = group5.strokeForeground, ix = scene.interactive !== false; // hit test against group foreground\n        if (ix && fore && group5.stroke && hitForeground(context42, group5, cx, cy)) {\n            context42.restore();\n            return group5;\n        } // hit test against contained marks\n        hit4 = pickVisit(group5, (mark)=>pickMark(mark, dx, dy) ? this.pick(mark, x32, y31, dx, dy) : null); // hit test against group background\n        if (!hit4 && ix && (group5.fill || !fore && group5.stroke) && hitBackground(context42, group5, cx, cy)) hit4 = group5;\n         // restore state and return\n        context42.restore();\n        return hit4 || null;\n    });\n}\nfunction pickMark(mark, x33, y32) {\n    return (mark.interactive !== false || mark.marktype === \"group\") && mark.bounds && mark.bounds.contains(x33, y32);\n}\nvar group = {\n    type: \"group\",\n    tag: \"g\",\n    nested: false,\n    attr: attr$5,\n    bound: bound$5,\n    draw: draw$4,\n    pick: pick,\n    isect: intersectRect,\n    content: content,\n    background: background,\n    foreground: foreground\n};\nvar metadata = {\n    \"xmlns\": \"http://www.w3.org/2000/svg\",\n    \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n    \"version\": \"1.1\"\n};\nfunction getImage(item, renderer) {\n    var image2 = item.image;\n    if (!image2 || item.url && item.url !== image2.url) {\n        image2 = {\n            complete: false,\n            width: 0,\n            height: 0\n        };\n        renderer.loadImage(item.url).then((image3)=>{\n            item.image = image3;\n            item.image.url = item.url;\n        });\n    }\n    return image2;\n}\nfunction imageWidth(item, image4) {\n    return item.width != null ? item.width : !image4 || !image4.width ? 0 : item.aspect !== false && item.height ? item.height * image4.width / image4.height : image4.width;\n}\nfunction imageHeight(item, image5) {\n    return item.height != null ? item.height : !image5 || !image5.height ? 0 : item.aspect !== false && item.width ? item.width * image5.height / image5.width : image5.height;\n}\nfunction imageXOffset(align, w6) {\n    return align === \"center\" ? w6 / 2 : align === \"right\" ? w6 : 0;\n}\nfunction imageYOffset(baseline, h11) {\n    return baseline === \"middle\" ? h11 / 2 : baseline === \"bottom\" ? h11 : 0;\n}\nfunction attr$4(emit8, item, renderer) {\n    const img = getImage(item, renderer), w7 = imageWidth(item, img), h12 = imageHeight(item, img), x34 = (item.x || 0) - imageXOffset(item.align, w7), y33 = (item.y || 0) - imageYOffset(item.baseline, h12), i = !img.src && img.toDataURL ? img.toDataURL() : img.src || \"\";\n    emit8(\"href\", i, metadata[\"xmlns:xlink\"], \"xlink:href\");\n    emit8(\"transform\", translate(x34, y33));\n    emit8(\"width\", w7);\n    emit8(\"height\", h12);\n    emit8(\"preserveAspectRatio\", item.aspect === false ? \"none\" : \"xMidYMid\");\n}\nfunction bound$4(bounds9, item) {\n    const img = item.image, w8 = imageWidth(item, img), h13 = imageHeight(item, img), x35 = (item.x || 0) - imageXOffset(item.align, w8), y34 = (item.y || 0) - imageYOffset(item.baseline, h13);\n    return bounds9.set(x35, y34, x35 + w8, y34 + h13);\n}\nfunction draw$3(context43, scene, bounds10) {\n    visit(scene, (item)=>{\n        if (bounds10 && !bounds10.intersects(item.bounds)) return; // bounds check\n        const img = getImage(item, this);\n        let w9 = imageWidth(item, img);\n        let h14 = imageHeight(item, img);\n        if (w9 === 0 || h14 === 0) return; // early exit\n        let x36 = (item.x || 0) - imageXOffset(item.align, w9), y35 = (item.y || 0) - imageYOffset(item.baseline, h14), opacity, ar0, ar1, t;\n        if (item.aspect !== false) {\n            ar0 = img.width / img.height;\n            ar1 = item.width / item.height;\n            if (ar0 === ar0 && ar1 === ar1 && ar0 !== ar1) {\n                if (ar1 < ar0) {\n                    t = w9 / ar0;\n                    y35 += (h14 - t) / 2;\n                    h14 = t;\n                } else {\n                    t = h14 * ar0;\n                    x36 += (w9 - t) / 2;\n                    w9 = t;\n                }\n            }\n        }\n        if (img.complete || img.toDataURL) {\n            blend(context43, item);\n            context43.globalAlpha = (opacity = item.opacity) != null ? opacity : 1;\n            context43.imageSmoothingEnabled = item.smooth !== false;\n            context43.drawImage(img, x36, y35, w9, h14);\n        }\n    });\n}\nvar image = {\n    type: \"image\",\n    tag: \"image\",\n    nested: false,\n    attr: attr$4,\n    bound: bound$4,\n    draw: draw$3,\n    pick: pick$1(),\n    isect: (0, _vegaUtil.truthy),\n    // bounds check is sufficient\n    get: getImage,\n    xOffset: imageXOffset,\n    yOffset: imageYOffset\n};\nvar line = markMultiItemPath(\"line\", line$1, pickLine);\nfunction attr$3(emit9, item) {\n    var sx = item.scaleX || 1, sy = item.scaleY || 1;\n    if (sx !== 1 || sy !== 1) emit9(\"vector-effect\", \"non-scaling-stroke\");\n    emit9(\"transform\", transformItem(item));\n    emit9(\"d\", item.path);\n}\nfunction path$1(context44, item) {\n    var path9 = item.path;\n    if (path9 == null) return true;\n    var x37 = item.x || 0, y36 = item.y || 0, sx = item.scaleX || 1, sy = item.scaleY || 1, a = (item.angle || 0) * DegToRad, cache = item.pathCache;\n    if (!cache || cache.path !== path9) (item.pathCache = cache = pathParse(path9)).path = path9;\n    if (a && context44.rotate && context44.translate) {\n        context44.translate(x37, y36);\n        context44.rotate(a);\n        pathRender(context44, cache, 0, 0, sx, sy);\n        context44.rotate(-a);\n        context44.translate(-x37, -y36);\n    } else pathRender(context44, cache, x37, y36, sx, sy);\n}\nfunction bound$3(bounds11, item) {\n    return path$1(boundContext(bounds11, item.angle), item) ? bounds11.set(0, 0, 0, 0) : boundStroke(bounds11, item, true);\n}\nvar path$2 = {\n    type: \"path\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$3,\n    bound: bound$3,\n    draw: drawAll(path$1),\n    pick: pickPath(path$1),\n    isect: intersectPath(path$1)\n};\nfunction attr$2(emit10, item) {\n    emit10(\"d\", rectangle(null, item));\n}\nfunction bound$2(bounds12, item) {\n    var x38, y37;\n    return boundStroke(bounds12.set(x38 = item.x || 0, y37 = item.y || 0, x38 + item.width || 0, y37 + item.height || 0), item);\n}\nfunction draw$2(context45, item) {\n    context45.beginPath();\n    rectangle(context45, item);\n}\nvar rect = {\n    type: \"rect\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$2,\n    bound: bound$2,\n    draw: drawAll(draw$2),\n    pick: pickPath(draw$2),\n    isect: intersectRect\n};\nfunction attr$1(emit11, item) {\n    emit11(\"transform\", translateItem(item));\n    emit11(\"x2\", item.x2 != null ? item.x2 - (item.x || 0) : 0);\n    emit11(\"y2\", item.y2 != null ? item.y2 - (item.y || 0) : 0);\n}\nfunction bound$1(bounds13, item) {\n    var x1, y1;\n    return boundStroke(bounds13.set(x1 = item.x || 0, y1 = item.y || 0, item.x2 != null ? item.x2 : x1, item.y2 != null ? item.y2 : y1), item);\n}\nfunction path(context46, item, opacity) {\n    var x1, y1, x2, y2;\n    if (item.stroke && stroke(context46, item, opacity)) {\n        x1 = item.x || 0;\n        y1 = item.y || 0;\n        x2 = item.x2 != null ? item.x2 : x1;\n        y2 = item.y2 != null ? item.y2 : y1;\n        context46.beginPath();\n        context46.moveTo(x1, y1);\n        context46.lineTo(x2, y2);\n        return true;\n    }\n    return false;\n}\nfunction draw$1(context47, scene, bounds14) {\n    visit(scene, (item)=>{\n        if (bounds14 && !bounds14.intersects(item.bounds)) return; // bounds check\n        var opacity = item.opacity == null ? 1 : item.opacity;\n        if (opacity && path(context47, item, opacity)) {\n            blend(context47, item);\n            context47.stroke();\n        }\n    });\n}\nfunction hit$1(context48, item, x39, y38) {\n    if (!context48.isPointInStroke) return false;\n    return path(context48, item, 1) && context48.isPointInStroke(x39, y38);\n}\nvar rule = {\n    type: \"rule\",\n    tag: \"line\",\n    nested: false,\n    attr: attr$1,\n    bound: bound$1,\n    draw: draw$1,\n    pick: pick$1(hit$1),\n    isect: intersectRule\n};\nvar shape = markItemPath(\"shape\", shape$1);\nvar symbol = markItemPath(\"symbol\", symbol$1, intersectPoint);\nconst widthCache = (0, _vegaUtil.lruCache)();\nvar textMetrics = {\n    height: fontSize,\n    measureWidth: measureWidth,\n    estimateWidth: estimateWidth,\n    width: estimateWidth,\n    canvas: useCanvas\n};\nuseCanvas(true);\nfunction useCanvas(use) {\n    textMetrics.width = use && context ? measureWidth : estimateWidth;\n} // make simple estimate if no canvas is available\nfunction estimateWidth(item, text1) {\n    return _estimateWidth(textValue(item, text1), fontSize(item));\n}\nfunction _estimateWidth(text2, currentFontHeight) {\n    return ~~(0.8 * text2.length * currentFontHeight);\n} // measure text width if canvas is available\nfunction measureWidth(item, text3) {\n    return fontSize(item) <= 0 || !(text3 = textValue(item, text3)) ? 0 : _measureWidth(text3, font(item));\n}\nfunction _measureWidth(text4, currentFont) {\n    const key = `(${currentFont}) ${text4}`;\n    let width = widthCache.get(key);\n    if (width === undefined) {\n        context.font = currentFont;\n        width = context.measureText(text4).width;\n        widthCache.set(key, width);\n    }\n    return width;\n}\nfunction fontSize(item) {\n    return item.fontSize != null ? +item.fontSize || 0 : 11;\n}\nfunction lineHeight(item) {\n    return item.lineHeight != null ? item.lineHeight : fontSize(item) + 2;\n}\nfunction lineArray(_) {\n    return (0, _vegaUtil.isArray)(_) ? _.length > 1 ? _ : _[0] : _;\n}\nfunction textLines(item) {\n    return lineArray(item.lineBreak && item.text && !(0, _vegaUtil.isArray)(item.text) ? item.text.split(item.lineBreak) : item.text);\n}\nfunction multiLineOffset(item) {\n    const tl3 = textLines(item);\n    return ((0, _vegaUtil.isArray)(tl3) ? tl3.length - 1 : 0) * lineHeight(item);\n}\nfunction textValue(item, line1) {\n    const text5 = line1 == null ? \"\" : (line1 + \"\").trim();\n    return item.limit > 0 && text5.length ? truncate(item, text5) : text5;\n}\nfunction widthGetter(item) {\n    if (textMetrics.width === measureWidth) {\n        // we are using canvas\n        const currentFont = font(item);\n        return (text6)=>_measureWidth(text6, currentFont);\n    } else {\n        // we are relying on estimates\n        const currentFontHeight = fontSize(item);\n        return (text7)=>_estimateWidth(text7, currentFontHeight);\n    }\n}\nfunction truncate(item, text8) {\n    var limit = +item.limit, width = widthGetter(item);\n    if (width(text8) < limit) return text8;\n    var ellipsis = item.ellipsis || \"\\u2026\", rtl = item.dir === \"rtl\", lo = 0, hi = text8.length, mid;\n    limit -= width(ellipsis);\n    if (rtl) {\n        while(lo < hi){\n            mid = lo + hi >>> 1;\n            if (width(text8.slice(mid)) > limit) lo = mid + 1;\n            else hi = mid;\n        }\n        return ellipsis + text8.slice(lo);\n    } else {\n        while(lo < hi){\n            mid = 1 + (lo + hi >>> 1);\n            if (width(text8.slice(0, mid)) < limit) lo = mid;\n            else hi = mid - 1;\n        }\n        return text8.slice(0, lo) + ellipsis;\n    }\n}\nfunction fontFamily(item, quote) {\n    var font1 = item.font;\n    return (quote && font1 ? String(font1).replace(/\"/g, \"'\") : font1) || \"sans-serif\";\n}\nfunction font(item, quote) {\n    return \"\" + (item.fontStyle ? item.fontStyle + \" \" : \"\") + (item.fontVariant ? item.fontVariant + \" \" : \"\") + (item.fontWeight ? item.fontWeight + \" \" : \"\") + fontSize(item) + \"px \" + fontFamily(item, quote);\n}\nfunction offset(item) {\n    // perform our own font baseline calculation\n    // why? not all browsers support SVG 1.1 'alignment-baseline' :(\n    // this also ensures consistent layout across renderers\n    var baseline = item.baseline, h15 = fontSize(item);\n    return Math.round(baseline === \"top\" ? 0.79 * h15 : baseline === \"middle\" ? 0.30 * h15 : baseline === \"bottom\" ? -0.21 * h15 : baseline === \"line-top\" ? 0.29 * h15 + 0.5 * lineHeight(item) : baseline === \"line-bottom\" ? 0.29 * h15 - 0.5 * lineHeight(item) : 0);\n}\nconst textAlign = {\n    \"left\": \"start\",\n    \"center\": \"middle\",\n    \"right\": \"end\"\n};\nconst tempBounds = new Bounds();\nfunction anchorPoint(item) {\n    var x40 = item.x || 0, y39 = item.y || 0, r = item.radius || 0, t;\n    if (r) {\n        t = (item.theta || 0) - HalfPi;\n        x40 += r * Math.cos(t);\n        y39 += r * Math.sin(t);\n    }\n    tempBounds.x1 = x40;\n    tempBounds.y1 = y39;\n    return tempBounds;\n}\nfunction attr(emit12, item) {\n    var dx = item.dx || 0, dy = (item.dy || 0) + offset(item), p = anchorPoint(item), x41 = p.x1, y40 = p.y1, a = item.angle || 0, t;\n    emit12(\"text-anchor\", textAlign[item.align] || \"start\");\n    if (a) {\n        t = translate(x41, y40) + \" \" + rotate(a);\n        if (dx || dy) t += \" \" + translate(dx, dy);\n    } else t = translate(x41 + dx, y40 + dy);\n    emit12(\"transform\", t);\n}\nfunction bound(bounds15, item, mode) {\n    var h16 = textMetrics.height(item), a = item.align, p = anchorPoint(item), x42 = p.x1, y41 = p.y1, dx = item.dx || 0, dy = (item.dy || 0) + offset(item) - Math.round(0.8 * h16), // use 4/5 offset\n    tl4 = textLines(item), w10; // get dimensions\n    if ((0, _vegaUtil.isArray)(tl4)) {\n        // multi-line text\n        h16 += lineHeight(item) * (tl4.length - 1);\n        w10 = tl4.reduce((w11, t)=>Math.max(w11, textMetrics.width(item, t)), 0);\n    } else // single-line text\n    w10 = textMetrics.width(item, tl4);\n     // horizontal alignment\n    if (a === \"center\") dx -= w10 / 2;\n    else if (a === \"right\") dx -= w10;\n    bounds15.set(dx += x42, dy += y41, dx + w10, dy + h16);\n    if (item.angle && !mode) bounds15.rotate(item.angle * DegToRad, x42, y41);\n    else if (mode === 2) return bounds15.rotatedPoints(item.angle * DegToRad, x42, y41);\n    return bounds15;\n}\nfunction draw(context49, scene, bounds16) {\n    visit(scene, (item)=>{\n        var opacity = item.opacity == null ? 1 : item.opacity, p, x43, y42, i, lh, tl5, str;\n        if (bounds16 && !bounds16.intersects(item.bounds) || opacity === 0 || item.fontSize <= 0 || item.text == null || item.text.length === 0) return;\n        context49.font = font(item);\n        context49.textAlign = item.align || \"left\";\n        p = anchorPoint(item);\n        x43 = p.x1, y42 = p.y1;\n        if (item.angle) {\n            context49.save();\n            context49.translate(x43, y42);\n            context49.rotate(item.angle * DegToRad);\n            x43 = y42 = 0; // reset x, y\n        }\n        x43 += item.dx || 0;\n        y42 += (item.dy || 0) + offset(item);\n        tl5 = textLines(item);\n        blend(context49, item);\n        if ((0, _vegaUtil.isArray)(tl5)) {\n            lh = lineHeight(item);\n            for(i = 0; i < tl5.length; ++i){\n                str = textValue(item, tl5[i]);\n                if (item.fill && fill(context49, item, opacity)) context49.fillText(str, x43, y42);\n                if (item.stroke && stroke(context49, item, opacity)) context49.strokeText(str, x43, y42);\n                y42 += lh;\n            }\n        } else {\n            str = textValue(item, tl5);\n            if (item.fill && fill(context49, item, opacity)) context49.fillText(str, x43, y42);\n            if (item.stroke && stroke(context49, item, opacity)) context49.strokeText(str, x43, y42);\n        }\n        if (item.angle) context49.restore();\n    });\n}\nfunction hit(context, item, x, y, gx, gy) {\n    if (item.fontSize <= 0) return false;\n    if (!item.angle) return true; // bounds sufficient if no rotation\n    // project point into space of unrotated bounds\n    var p = anchorPoint(item), ax = p.x1, ay = p.y1, b15 = bound(tempBounds, item, 1), a = -item.angle * DegToRad, cos = Math.cos(a), sin = Math.sin(a), px4 = cos * gx - sin * gy + (ax - cos * ax + sin * ay), py4 = sin * gx + cos * gy + (ay - sin * ax - cos * ay);\n    return b15.contains(px4, py4);\n}\nfunction intersectText(item, box) {\n    const p = bound(tempBounds, item, 2);\n    return intersectBoxLine(box, p[0], p[1], p[2], p[3]) || intersectBoxLine(box, p[0], p[1], p[4], p[5]) || intersectBoxLine(box, p[4], p[5], p[6], p[7]) || intersectBoxLine(box, p[2], p[3], p[6], p[7]);\n}\nvar text = {\n    type: \"text\",\n    tag: \"text\",\n    nested: false,\n    attr: attr,\n    bound: bound,\n    draw: draw,\n    pick: pick$1(hit),\n    isect: intersectText\n};\nvar trail = markMultiItemPath(\"trail\", trail$1, pickTrail);\nvar Marks = {\n    arc: arc,\n    area: area,\n    group: group,\n    image: image,\n    line: line,\n    path: path$2,\n    rect: rect,\n    rule: rule,\n    shape: shape,\n    symbol: symbol,\n    text: text,\n    trail: trail\n};\nfunction boundItem(item, func, opt) {\n    var type5 = Marks[item.mark.marktype], bound3 = func || type5.bound;\n    if (type5.nested) item = item.mark;\n    return bound3(item.bounds || (item.bounds = new Bounds()), item, opt);\n}\nvar DUMMY = {\n    mark: null\n};\nfunction boundMark(mark, bounds17, opt) {\n    var type6 = Marks[mark.marktype], bound4 = type6.bound, items = mark.items, hasItems = items && items.length, i, n, item, b16;\n    if (type6.nested) {\n        if (hasItems) item = items[0];\n        else {\n            // no items, fake it\n            DUMMY.mark = mark;\n            item = DUMMY;\n        }\n        b16 = boundItem(item, bound4, opt);\n        bounds17 = bounds17 && bounds17.union(b16) || b16;\n        return bounds17;\n    }\n    bounds17 = bounds17 || mark.bounds && mark.bounds.clear() || new Bounds();\n    if (hasItems) for(i = 0, n = items.length; i < n; ++i)bounds17.union(boundItem(items[i], bound4, opt));\n    return mark.bounds = bounds17;\n}\nconst keys = [\n    \"marktype\",\n    \"name\",\n    \"role\",\n    \"interactive\",\n    \"clip\",\n    \"items\",\n    \"zindex\",\n    \"x\",\n    \"y\",\n    \"width\",\n    \"height\",\n    \"align\",\n    \"baseline\",\n    \"fill\",\n    \"fillOpacity\",\n    \"opacity\",\n    \"blend\",\n    \"stroke\",\n    \"strokeOpacity\",\n    \"strokeWidth\",\n    \"strokeCap\",\n    \"strokeDash\",\n    \"strokeDashOffset\",\n    \"strokeForeground\",\n    \"strokeOffset\",\n    \"startAngle\",\n    \"endAngle\",\n    \"innerRadius\",\n    \"outerRadius\",\n    \"cornerRadius\",\n    \"padAngle\",\n    \"cornerRadiusTopLeft\",\n    \"cornerRadiusTopRight\",\n    \"cornerRadiusBottomLeft\",\n    \"cornerRadiusBottomRight\",\n    \"interpolate\",\n    \"tension\",\n    \"orient\",\n    \"defined\",\n    \"url\",\n    \"aspect\",\n    \"smooth\",\n    \"path\",\n    \"scaleX\",\n    \"scaleY\",\n    \"x2\",\n    \"y2\",\n    \"size\",\n    \"shape\",\n    \"text\",\n    \"angle\",\n    \"theta\",\n    \"radius\",\n    \"dir\",\n    \"dx\",\n    \"dy\",\n    \"ellipsis\",\n    \"limit\",\n    \"lineBreak\",\n    \"lineHeight\",\n    \"font\",\n    \"fontSize\",\n    \"fontWeight\",\n    \"fontStyle\",\n    \"fontVariant\",\n    \"description\",\n    \"aria\",\n    \"ariaRole\",\n    \"ariaRoleDescription\" // aria\n];\nfunction sceneToJSON(scene, indent) {\n    return JSON.stringify(scene, keys, indent);\n}\nfunction sceneFromJSON(json) {\n    const scene = typeof json === \"string\" ? JSON.parse(json) : json;\n    return initialize(scene);\n}\nfunction initialize(scene) {\n    var type7 = scene.marktype, items = scene.items, parent, i, n;\n    if (items) for(i = 0, n = items.length; i < n; ++i){\n        parent = type7 ? \"mark\" : \"group\";\n        items[i][parent] = scene;\n        if (items[i].zindex) items[i][parent].zdirty = true;\n        if (\"group\" === (type7 || parent)) initialize(items[i]);\n    }\n    if (type7) boundMark(scene);\n    return scene;\n}\nfunction Scenegraph(scene) {\n    if (arguments.length) this.root = sceneFromJSON(scene);\n    else {\n        this.root = createMark({\n            marktype: \"group\",\n            name: \"root\",\n            role: \"frame\"\n        });\n        this.root.items = [\n            new GroupItem(this.root)\n        ];\n    }\n}\nScenegraph.prototype = {\n    toJSON (indent) {\n        return sceneToJSON(this.root, indent || 0);\n    },\n    mark (markdef, group6, index) {\n        group6 = group6 || this.root.items[0];\n        const mark = createMark(markdef, group6);\n        group6.items[index] = mark;\n        if (mark.zindex) mark.group.zdirty = true;\n        return mark;\n    }\n};\nfunction createMark(def2, group7) {\n    const mark = {\n        bounds: new Bounds(),\n        clip: !!def2.clip,\n        group: group7,\n        interactive: def2.interactive === false ? false : true,\n        items: [],\n        marktype: def2.marktype,\n        name: def2.name || undefined,\n        role: def2.role || undefined,\n        zindex: def2.zindex || 0\n    }; // add accessibility properties if defined\n    if (def2.aria != null) mark.aria = def2.aria;\n    if (def2.description) mark.description = def2.description;\n    return mark;\n}\n// create a new DOM element\nfunction domCreate(doc, tag, ns) {\n    if (!doc && typeof document !== \"undefined\" && document.createElement) doc = document;\n    return doc ? ns ? doc.createElementNS(ns, tag) : doc.createElement(tag) : null;\n} // find first child element with matching tag\nfunction domFind(el, tag) {\n    tag = tag.toLowerCase();\n    var nodes = el.childNodes, i = 0, n = nodes.length;\n    for(; i < n; ++i)if (nodes[i].tagName.toLowerCase() === tag) return nodes[i];\n} // retrieve child element at given index\n// create & insert if doesn't exist or if tags do not match\nfunction domChild(el, index, tag, ns) {\n    var a = el.childNodes[index], b17;\n    if (!a || a.tagName.toLowerCase() !== tag.toLowerCase()) {\n        b17 = a || null;\n        a = domCreate(el.ownerDocument, tag, ns);\n        el.insertBefore(a, b17);\n    }\n    return a;\n} // remove all child elements at or above the given index\nfunction domClear(el, index) {\n    var nodes = el.childNodes, curr = nodes.length;\n    while(curr > index)el.removeChild(nodes[--curr]);\n    return el;\n} // generate css class name for mark\nfunction cssClass(mark) {\n    return \"mark-\" + mark.marktype + (mark.role ? \" role-\" + mark.role : \"\") + (mark.name ? \" \" + mark.name : \"\");\n}\nfunction point(event, el) {\n    const rect1 = el.getBoundingClientRect();\n    return [\n        event.clientX - rect1.left - (el.clientLeft || 0),\n        event.clientY - rect1.top - (el.clientTop || 0)\n    ];\n}\nfunction resolveItem(item, event, el, origin) {\n    var mark = item && item.mark, mdef, p;\n    if (mark && (mdef = Marks[mark.marktype]).tip) {\n        p = point(event, el);\n        p[0] -= origin[0];\n        p[1] -= origin[1];\n        while(item = item.mark.group){\n            p[0] -= item.x || 0;\n            p[1] -= item.y || 0;\n        }\n        item = mdef.tip(mark.items, p);\n    }\n    return item;\n}\n/**\n * Create a new Handler instance.\n * @param {object} [customLoader] - Optional loader instance for\n *   href URL sanitization. If not specified, a standard loader\n *   instance will be generated.\n * @param {function} [customTooltip] - Optional tooltip handler\n *   function for custom tooltip display.\n * @constructor\n */ function Handler(customLoader, customTooltip) {\n    this._active = null;\n    this._handlers = {};\n    this._loader = customLoader || (0, _vegaLoader.loader)();\n    this._tooltip = customTooltip || defaultTooltip;\n} // The default tooltip display handler.\n// Sets the HTML title attribute on the visualization container.\nfunction defaultTooltip(handler, event, item, value6) {\n    handler.element().setAttribute(\"title\", value6 || \"\");\n}\nHandler.prototype = {\n    /**\n   * Initialize a new Handler instance.\n   * @param {DOMElement} el - The containing DOM element for the display.\n   * @param {Array<number>} origin - The origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {object} [obj] - Optional context object that should serve as\n   *   the \"this\" context for event callbacks.\n   * @return {Handler} - This handler instance.\n   */ initialize (el, origin, obj) {\n        this._el = el;\n        this._obj = obj || null;\n        return this.origin(origin);\n    },\n    /**\n   * Returns the parent container element for a visualization.\n   * @return {DOMElement} - The containing DOM element.\n   */ element () {\n        return this._el;\n    },\n    /**\n   * Returns the scene element (e.g., canvas or SVG) of the visualization\n   * Subclasses must override if the first child is not the scene element.\n   * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n   */ canvas () {\n        return this._el && this._el.firstChild;\n    },\n    /**\n   * Get / set the origin coordinates of the visualization.\n   */ origin (origin) {\n        if (arguments.length) {\n            this._origin = origin || [\n                0,\n                0\n            ];\n            return this;\n        } else return this._origin.slice();\n    },\n    /**\n   * Get / set the scenegraph root.\n   */ scene (scene) {\n        if (!arguments.length) return this._scene;\n        this._scene = scene;\n        return this;\n    },\n    /**\n   * Add an event handler. Subclasses should override this method.\n   */ on () /*type, handler*/ {},\n    /**\n   * Remove an event handler. Subclasses should override this method.\n   */ off () /*type, handler*/ {},\n    /**\n   * Utility method for finding the array index of an event handler.\n   * @param {Array} h - An array of registered event handlers.\n   * @param {string} type - The event type.\n   * @param {function} handler - The event handler instance to find.\n   * @return {number} - The handler's array index or -1 if not registered.\n   */ _handlerIndex (h17, type8, handler) {\n        for(let i = h17 ? h17.length : 0; --i >= 0;){\n            if (h17[i].type === type8 && (!handler || h17[i].handler === handler)) return i;\n        }\n        return -1;\n    },\n    /**\n   * Returns an array with registered event handlers.\n   * @param {string} [type] - The event type to query. Any annotations\n   *   are ignored; for example, for the argument \"click.foo\", \".foo\" will\n   *   be ignored and the method returns all \"click\" handlers. If type is\n   *   null or unspecified, this method returns handlers for all types.\n   * @return {Array} - A new array containing all registered event handlers.\n   */ handlers (type9) {\n        const h18 = this._handlers, a = [];\n        if (type9) a.push(...h18[this.eventName(type9)]);\n        else for(const k in h18)a.push(...h18[k]);\n        return a;\n    },\n    /**\n   * Parses an event name string to return the specific event type.\n   * For example, given \"click.foo\" returns \"click\"\n   * @param {string} name - The input event type string.\n   * @return {string} - A string with the event type only.\n   */ eventName (name) {\n        const i = name.indexOf(\".\");\n        return i < 0 ? name : name.slice(0, i);\n    },\n    /**\n   * Handle hyperlink navigation in response to an item.href value.\n   * @param {Event} event - The event triggering hyperlink navigation.\n   * @param {Item} item - The scenegraph item.\n   * @param {string} href - The URL to navigate to.\n   */ handleHref (event, item, href1) {\n        this._loader.sanitize(href1, {\n            context: \"href\"\n        }).then((opt)=>{\n            const e = new MouseEvent(event.type, event), a = domCreate(null, \"a\");\n            for(const name in opt)a.setAttribute(name, opt[name]);\n            a.dispatchEvent(e);\n        }).catch(()=>{\n        /* do nothing */ });\n    },\n    /**\n   * Handle tooltip display in response to an item.tooltip value.\n   * @param {Event} event - The event triggering tooltip display.\n   * @param {Item} item - The scenegraph item.\n   * @param {boolean} show - A boolean flag indicating whether\n   *   to show or hide a tooltip for the given item.\n   */ handleTooltip (event, item, show) {\n        if (item && item.tooltip != null) {\n            item = resolveItem(item, event, this.canvas(), this._origin);\n            const value7 = show && item && item.tooltip || null;\n            this._tooltip.call(this._obj, this, event, item, value7);\n        }\n    },\n    /**\n   * Returns the size of a scenegraph item and its position relative\n   * to the viewport.\n   * @param {Item} item - The scenegraph item.\n   * @return {object} - A bounding box object (compatible with the\n   *   DOMRect type) consisting of x, y, width, heigh, top, left,\n   *   right, and bottom properties.\n   */ getItemBoundingClientRect (item) {\n        const el = this.canvas();\n        if (!el) return;\n        const rect2 = el.getBoundingClientRect(), origin = this._origin, bounds18 = item.bounds, width = bounds18.width(), height = bounds18.height();\n        let x44 = bounds18.x1 + origin[0] + rect2.left, y43 = bounds18.y1 + origin[1] + rect2.top; // translate coordinate for each parent group\n        while(item.mark && (item = item.mark.group)){\n            x44 += item.x || 0;\n            y43 += item.y || 0;\n        } // return DOMRect-compatible bounding box\n        return {\n            x: x44,\n            y: y43,\n            width,\n            height,\n            left: x44,\n            top: y43,\n            right: x44 + width,\n            bottom: y43 + height\n        };\n    }\n};\n/**\n * Create a new Renderer instance.\n * @param {object} [loader] - Optional loader instance for\n *   image and href URL sanitization. If not specified, a\n *   standard loader instance will be generated.\n * @constructor\n */ function Renderer(loader) {\n    this._el = null;\n    this._bgcolor = null;\n    this._loader = new ResourceLoader(loader);\n}\nRenderer.prototype = {\n    /**\n   * Initialize a new Renderer instance.\n   * @param {DOMElement} el - The containing DOM element for the display.\n   * @param {number} width - The coordinate width of the display, in pixels.\n   * @param {number} height - The coordinate height of the display, in pixels.\n   * @param {Array<number>} origin - The origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n   *   the width and height to determine the final pixel size.\n   * @return {Renderer} - This renderer instance.\n   */ initialize (el, width, height, origin, scaleFactor) {\n        this._el = el;\n        return this.resize(width, height, origin, scaleFactor);\n    },\n    /**\n   * Returns the parent container element for a visualization.\n   * @return {DOMElement} - The containing DOM element.\n   */ element () {\n        return this._el;\n    },\n    /**\n   * Returns the scene element (e.g., canvas or SVG) of the visualization\n   * Subclasses must override if the first child is not the scene element.\n   * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n   */ canvas () {\n        return this._el && this._el.firstChild;\n    },\n    /**\n   * Get / set the background color.\n   */ background (bgcolor) {\n        if (arguments.length === 0) return this._bgcolor;\n        this._bgcolor = bgcolor;\n        return this;\n    },\n    /**\n   * Resize the display.\n   * @param {number} width - The new coordinate width of the display, in pixels.\n   * @param {number} height - The new coordinate height of the display, in pixels.\n   * @param {Array<number>} origin - The new origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n   *   the width and height to determine the final pixel size.\n   * @return {Renderer} - This renderer instance;\n   */ resize (width, height, origin, scaleFactor) {\n        this._width = width;\n        this._height = height;\n        this._origin = origin || [\n            0,\n            0\n        ];\n        this._scale = scaleFactor || 1;\n        return this;\n    },\n    /**\n   * Report a dirty item whose bounds should be redrawn.\n   * This base class method does nothing. Subclasses that perform\n   * incremental should implement this method.\n   * @param {Item} item - The dirty item whose bounds should be redrawn.\n   */ dirty () /*item*/ {},\n    /**\n   * Render an input scenegraph, potentially with a set of dirty items.\n   * This method will perform an immediate rendering with available resources.\n   * The renderer may also need to perform image loading to perform a complete\n   * render. This process can lead to asynchronous re-rendering of the scene\n   * after this method returns. To receive notification when rendering is\n   * complete, use the renderAsync method instead.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   * @return {Renderer} - This renderer instance.\n   */ render (scene) {\n        const r = this; // bind arguments into a render call, and cache it\n        // this function may be subsequently called for async redraw\n        r._call = function() {\n            r._render(scene);\n        }; // invoke the renderer\n        r._call(); // clear the cached call for garbage collection\n        // async redraws will stash their own copy\n        r._call = null;\n        return r;\n    },\n    /**\n   * Internal rendering method. Renderer subclasses should override this\n   * method to actually perform rendering.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   */ _render () /*scene*/ {},\n    /**\n   * Asynchronous rendering method. Similar to render, but returns a Promise\n   * that resolves when all rendering is completed. Sometimes a renderer must\n   * perform image loading to get a complete rendering. The returned\n   * Promise will not resolve until this process completes.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   * @return {Promise} - A Promise that resolves when rendering is complete.\n   */ renderAsync (scene) {\n        const r = this.render(scene);\n        return this._ready ? this._ready.then(()=>r) : Promise.resolve(r);\n    },\n    /**\n   * Internal method for asynchronous resource loading.\n   * Proxies method calls to the ImageLoader, and tracks loading\n   * progress to invoke a re-render once complete.\n   * @param {string} method - The method name to invoke on the ImageLoader.\n   * @param {string} uri - The URI for the requested resource.\n   * @return {Promise} - A Promise that resolves to the requested resource.\n   */ _load (method, uri) {\n        var r = this, p = r._loader[method](uri);\n        if (!r._ready) {\n            // re-render the scene when loading completes\n            const call = r._call;\n            r._ready = r._loader.ready().then((redraw)=>{\n                if (redraw) call();\n                r._ready = null;\n            });\n        }\n        return p;\n    },\n    /**\n   * Sanitize a URL to include as a hyperlink in the rendered scene.\n   * This method proxies a call to ImageLoader.sanitizeURL, but also tracks\n   * image loading progress and invokes a re-render once complete.\n   * @param {string} uri - The URI string to sanitize.\n   * @return {Promise} - A Promise that resolves to the sanitized URL.\n   */ sanitizeURL (uri) {\n        return this._load(\"sanitizeURL\", uri);\n    },\n    /**\n   * Requests an image to include in the rendered scene.\n   * This method proxies a call to ImageLoader.loadImage, but also tracks\n   * image loading progress and invokes a re-render once complete.\n   * @param {string} uri - The URI string of the image.\n   * @return {Promise} - A Promise that resolves to the loaded Image.\n   */ loadImage (uri) {\n        return this._load(\"loadImage\", uri);\n    }\n};\nconst KeyDownEvent = \"keydown\";\nconst KeyPressEvent = \"keypress\";\nconst KeyUpEvent = \"keyup\";\nconst DragEnterEvent = \"dragenter\";\nconst DragLeaveEvent = \"dragleave\";\nconst DragOverEvent = \"dragover\";\nconst MouseDownEvent = \"mousedown\";\nconst MouseUpEvent = \"mouseup\";\nconst MouseMoveEvent = \"mousemove\";\nconst MouseOutEvent = \"mouseout\";\nconst MouseOverEvent = \"mouseover\";\nconst ClickEvent = \"click\";\nconst DoubleClickEvent = \"dblclick\";\nconst WheelEvent = \"wheel\";\nconst MouseWheelEvent = \"mousewheel\";\nconst TouchStartEvent = \"touchstart\";\nconst TouchMoveEvent = \"touchmove\";\nconst TouchEndEvent = \"touchend\";\nconst Events = [\n    KeyDownEvent,\n    KeyPressEvent,\n    KeyUpEvent,\n    DragEnterEvent,\n    DragLeaveEvent,\n    DragOverEvent,\n    MouseDownEvent,\n    MouseUpEvent,\n    MouseMoveEvent,\n    MouseOutEvent,\n    MouseOverEvent,\n    ClickEvent,\n    DoubleClickEvent,\n    WheelEvent,\n    MouseWheelEvent,\n    TouchStartEvent,\n    TouchMoveEvent,\n    TouchEndEvent\n];\nconst TooltipShowEvent = MouseMoveEvent;\nconst TooltipHideEvent = MouseOutEvent;\nconst HrefEvent = ClickEvent;\nfunction CanvasHandler(loader, tooltip) {\n    Handler.call(this, loader, tooltip);\n    this._down = null;\n    this._touch = null;\n    this._first = true;\n    this._events = {};\n}\nconst eventBundle = (type10)=>type10 === TouchStartEvent || type10 === TouchMoveEvent || type10 === TouchEndEvent ? [\n        TouchStartEvent,\n        TouchMoveEvent,\n        TouchEndEvent\n    ] : [\n        type10\n    ]; // lazily add listeners to the canvas as needed\nfunction eventListenerCheck(handler, type11) {\n    eventBundle(type11).forEach((_)=>addEventListener(handler, _));\n}\nfunction addEventListener(handler, type12) {\n    const canvas = handler.canvas();\n    if (canvas && !handler._events[type12]) {\n        handler._events[type12] = 1;\n        canvas.addEventListener(type12, handler[type12] ? (evt)=>handler[type12](evt) : (evt)=>handler.fire(type12, evt));\n    }\n}\nfunction move(moveEvent, overEvent, outEvent) {\n    return function(evt) {\n        const a = this._active, p = this.pickEvent(evt);\n        if (p === a) // active item and picked item are the same\n        this.fire(moveEvent, evt); // fire move\n        else {\n            // active item and picked item are different\n            if (!a || !a.exit) // fire out for prior active item\n            // suppress if active item was removed from scene\n            this.fire(outEvent, evt);\n            this._active = p; // set new active item\n            this.fire(overEvent, evt); // fire over for new active item\n            this.fire(moveEvent, evt); // fire move for new active item\n        }\n    };\n}\nfunction inactive(type13) {\n    return function(evt) {\n        this.fire(type13, evt);\n        this._active = null;\n    };\n}\n(0, _vegaUtil.inherits)(CanvasHandler, Handler, {\n    initialize (el, origin, obj) {\n        this._canvas = el && domFind(el, \"canvas\"); // add minimal events required for proper state management\n        [\n            ClickEvent,\n            MouseDownEvent,\n            MouseMoveEvent,\n            MouseOutEvent,\n            DragLeaveEvent\n        ].forEach((type14)=>eventListenerCheck(this, type14));\n        return Handler.prototype.initialize.call(this, el, origin, obj);\n    },\n    // return the backing canvas instance\n    canvas () {\n        return this._canvas;\n    },\n    // retrieve the current canvas context\n    context () {\n        return this._canvas.getContext(\"2d\");\n    },\n    // supported events\n    events: Events,\n    // to keep old versions of firefox happy\n    DOMMouseScroll (evt) {\n        this.fire(MouseWheelEvent, evt);\n    },\n    mousemove: move(MouseMoveEvent, MouseOverEvent, MouseOutEvent),\n    dragover: move(DragOverEvent, DragEnterEvent, DragLeaveEvent),\n    mouseout: inactive(MouseOutEvent),\n    dragleave: inactive(DragLeaveEvent),\n    mousedown (evt) {\n        this._down = this._active;\n        this.fire(MouseDownEvent, evt);\n    },\n    click (evt) {\n        if (this._down === this._active) {\n            this.fire(ClickEvent, evt);\n            this._down = null;\n        }\n    },\n    touchstart (evt) {\n        this._touch = this.pickEvent(evt.changedTouches[0]);\n        if (this._first) {\n            this._active = this._touch;\n            this._first = false;\n        }\n        this.fire(TouchStartEvent, evt, true);\n    },\n    touchmove (evt) {\n        this.fire(TouchMoveEvent, evt, true);\n    },\n    touchend (evt) {\n        this.fire(TouchEndEvent, evt, true);\n        this._touch = null;\n    },\n    // fire an event\n    fire (type15, evt, touch) {\n        const a = touch ? this._touch : this._active, h19 = this._handlers[type15]; // set event type relative to scenegraph items\n        evt.vegaType = type15; // handle hyperlinks and tooltips first\n        if (type15 === HrefEvent && a && a.href) this.handleHref(evt, a, a.href);\n        else if (type15 === TooltipShowEvent || type15 === TooltipHideEvent) this.handleTooltip(evt, a, type15 !== TooltipHideEvent);\n         // invoke all registered handlers\n        if (h19) for(let i = 0, len = h19.length; i < len; ++i)h19[i].handler.call(this._obj, evt, a);\n    },\n    // add an event handler\n    on (type16, handler) {\n        const name = this.eventName(type16), h20 = this._handlers, i = this._handlerIndex(h20[name], type16, handler);\n        if (i < 0) {\n            eventListenerCheck(this, type16);\n            (h20[name] || (h20[name] = [])).push({\n                type: type16,\n                handler: handler\n            });\n        }\n        return this;\n    },\n    // remove an event handler\n    off (type17, handler) {\n        const name = this.eventName(type17), h21 = this._handlers[name], i = this._handlerIndex(h21, type17, handler);\n        if (i >= 0) h21.splice(i, 1);\n        return this;\n    },\n    pickEvent (evt) {\n        const p = point(evt, this._canvas), o = this._origin;\n        return this.pick(this._scene, p[0], p[1], p[0] - o[0], p[1] - o[1]);\n    },\n    // find the scenegraph item at the current mouse position\n    // x, y -- the absolute x, y mouse coordinates on the canvas element\n    // gx, gy -- the relative coordinates within the current group\n    pick (scene, x45, y44, gx, gy) {\n        const g = this.context(), mark = Marks[scene.marktype];\n        return mark.pick.call(this, g, scene, x45, y44, gx, gy);\n    }\n});\nfunction devicePixelRatio() {\n    return typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1;\n}\nvar pixelRatio = devicePixelRatio();\nfunction resize(canvas, width, height, origin, scaleFactor, opt) {\n    const inDOM = typeof HTMLElement !== \"undefined\" && canvas instanceof HTMLElement && canvas.parentNode != null, context50 = canvas.getContext(\"2d\"), ratio = inDOM ? pixelRatio : scaleFactor;\n    canvas.width = width * ratio;\n    canvas.height = height * ratio;\n    for(const key in opt)context50[key] = opt[key];\n    if (inDOM && ratio !== 1) {\n        canvas.style.width = width + \"px\";\n        canvas.style.height = height + \"px\";\n    }\n    context50.pixelRatio = ratio;\n    context50.setTransform(ratio, 0, 0, ratio, ratio * origin[0], ratio * origin[1]);\n    return canvas;\n}\nfunction CanvasRenderer(loader) {\n    Renderer.call(this, loader);\n    this._options = {};\n    this._redraw = false;\n    this._dirty = new Bounds();\n    this._tempb = new Bounds();\n}\nconst base$1 = Renderer.prototype;\nconst viewBounds = (origin, width, height)=>new Bounds().set(0, 0, width, height).translate(-origin[0], -origin[1]);\nfunction clipToBounds(g, b18, origin) {\n    // expand bounds by 1 pixel, then round to pixel boundaries\n    b18.expand(1).round(); // align to base pixel grid in case of non-integer scaling (#2425)\n    if (g.pixelRatio % 1) b18.scale(g.pixelRatio).round().scale(1 / g.pixelRatio);\n     // to avoid artifacts translate if origin has fractional pixels\n    b18.translate(-(origin[0] % 1), -(origin[1] % 1)); // set clip path\n    g.beginPath();\n    g.rect(b18.x1, b18.y1, b18.width(), b18.height());\n    g.clip();\n    return b18;\n}\n(0, _vegaUtil.inherits)(CanvasRenderer, Renderer, {\n    initialize (el, width, height, origin, scaleFactor, options) {\n        this._options = options || {};\n        this._canvas = this._options.externalContext ? null : (0, _vegaCanvas.canvas)(1, 1, this._options.type); // instantiate a small canvas\n        if (el && this._canvas) {\n            domClear(el, 0).appendChild(this._canvas);\n            this._canvas.setAttribute(\"class\", \"marks\");\n        } // this method will invoke resize to size the canvas appropriately\n        return base$1.initialize.call(this, el, width, height, origin, scaleFactor);\n    },\n    resize (width, height, origin, scaleFactor) {\n        base$1.resize.call(this, width, height, origin, scaleFactor);\n        if (this._canvas) // configure canvas size and transform\n        resize(this._canvas, this._width, this._height, this._origin, this._scale, this._options.context);\n        else {\n            // external context needs to be scaled and positioned to origin\n            const ctx = this._options.externalContext;\n            if (!ctx) (0, _vegaUtil.error)(\"CanvasRenderer is missing a valid canvas or context\");\n            ctx.scale(this._scale, this._scale);\n            ctx.translate(this._origin[0], this._origin[1]);\n        }\n        this._redraw = true;\n        return this;\n    },\n    canvas () {\n        return this._canvas;\n    },\n    context () {\n        return this._options.externalContext || (this._canvas ? this._canvas.getContext(\"2d\") : null);\n    },\n    dirty (item) {\n        const b19 = this._tempb.clear().union(item.bounds);\n        let g = item.mark.group;\n        while(g){\n            b19.translate(g.x || 0, g.y || 0);\n            g = g.mark.group;\n        }\n        this._dirty.union(b19);\n    },\n    _render (scene) {\n        const g = this.context(), o = this._origin, w12 = this._width, h22 = this._height, db = this._dirty, vb = viewBounds(o, w12, h22); // setup\n        g.save();\n        const b20 = this._redraw || db.empty() ? (this._redraw = false, vb.expand(1)) : clipToBounds(g, vb.intersect(db), o);\n        this.clear(-o[0], -o[1], w12, h22); // render\n        this.draw(g, scene, b20); // takedown\n        g.restore();\n        db.clear();\n        return this;\n    },\n    draw (ctx, scene, bounds19) {\n        const mark = Marks[scene.marktype];\n        if (scene.clip) clip(ctx, scene);\n        mark.draw.call(this, ctx, scene, bounds19);\n        if (scene.clip) ctx.restore();\n    },\n    clear (x46, y45, w13, h23) {\n        const opt = this._options, g = this.context();\n        if (opt.type !== \"pdf\" && !opt.externalContext) // calling clear rect voids vector output in pdf mode\n        // and could remove external context content (#2615)\n        g.clearRect(x46, y45, w13, h23);\n        if (this._bgcolor != null) {\n            g.fillStyle = this._bgcolor;\n            g.fillRect(x46, y45, w13, h23);\n        }\n    }\n});\nfunction SVGHandler(loader, tooltip) {\n    Handler.call(this, loader, tooltip);\n    const h24 = this;\n    h24._hrefHandler = listener(h24, (evt, item)=>{\n        if (item && item.href) h24.handleHref(evt, item, item.href);\n    });\n    h24._tooltipHandler = listener(h24, (evt, item)=>{\n        h24.handleTooltip(evt, item, evt.type !== TooltipHideEvent);\n    });\n} // wrap an event listener for the SVG DOM\nconst listener = (context51, handler)=>(evt)=>{\n        let item = evt.target.__data__;\n        item = Array.isArray(item) ? item[0] : item;\n        evt.vegaType = evt.type;\n        handler.call(context51._obj, evt, item);\n    };\n(0, _vegaUtil.inherits)(SVGHandler, Handler, {\n    initialize (el, origin, obj) {\n        let svg = this._svg;\n        if (svg) {\n            svg.removeEventListener(HrefEvent, this._hrefHandler);\n            svg.removeEventListener(TooltipShowEvent, this._tooltipHandler);\n            svg.removeEventListener(TooltipHideEvent, this._tooltipHandler);\n        }\n        this._svg = svg = el && domFind(el, \"svg\");\n        if (svg) {\n            svg.addEventListener(HrefEvent, this._hrefHandler);\n            svg.addEventListener(TooltipShowEvent, this._tooltipHandler);\n            svg.addEventListener(TooltipHideEvent, this._tooltipHandler);\n        }\n        return Handler.prototype.initialize.call(this, el, origin, obj);\n    },\n    canvas () {\n        return this._svg;\n    },\n    // add an event handler\n    on (type18, handler) {\n        const name = this.eventName(type18), h25 = this._handlers, i = this._handlerIndex(h25[name], type18, handler);\n        if (i < 0) {\n            const x47 = {\n                type: type18,\n                handler,\n                listener: listener(this, handler)\n            };\n            (h25[name] || (h25[name] = [])).push(x47);\n            if (this._svg) this._svg.addEventListener(name, x47.listener);\n        }\n        return this;\n    },\n    // remove an event handler\n    off (type19, handler) {\n        const name = this.eventName(type19), h26 = this._handlers[name], i = this._handlerIndex(h26, type19, handler);\n        if (i >= 0) {\n            if (this._svg) this._svg.removeEventListener(name, h26[i].listener);\n            h26.splice(i, 1);\n        }\n        return this;\n    }\n});\nconst ARIA_HIDDEN = \"aria-hidden\";\nconst ARIA_LABEL = \"aria-label\";\nconst ARIA_ROLE = \"role\";\nconst ARIA_ROLEDESCRIPTION = \"aria-roledescription\";\nconst GRAPHICS_OBJECT = \"graphics-object\";\nconst GRAPHICS_SYMBOL = \"graphics-symbol\";\nconst bundle = (role, roledesc, label)=>({\n        [ARIA_ROLE]: role,\n        [ARIA_ROLEDESCRIPTION]: roledesc,\n        [ARIA_LABEL]: label || undefined\n    }); // these roles are covered by related roles\n// we can ignore them, no need to generate attributes\nconst AriaIgnore = (0, _vegaUtil.toSet)([\n    \"axis-domain\",\n    \"axis-grid\",\n    \"axis-label\",\n    \"axis-tick\",\n    \"axis-title\",\n    \"legend-band\",\n    \"legend-entry\",\n    \"legend-gradient\",\n    \"legend-label\",\n    \"legend-title\",\n    \"legend-symbol\",\n    \"title\"\n]); // aria attribute generators for guide roles\nconst AriaGuides = {\n    \"axis\": {\n        desc: \"axis\",\n        caption: axisCaption\n    },\n    \"legend\": {\n        desc: \"legend\",\n        caption: legendCaption\n    },\n    \"title-text\": {\n        desc: \"title\",\n        caption: (item)=>`Title text '${titleCaption(item)}'`\n    },\n    \"title-subtitle\": {\n        desc: \"subtitle\",\n        caption: (item)=>`Subtitle text '${titleCaption(item)}'`\n    }\n}; // aria properties generated for mark item encoding channels\nconst AriaEncode = {\n    ariaRole: ARIA_ROLE,\n    ariaRoleDescription: ARIA_ROLEDESCRIPTION,\n    description: ARIA_LABEL\n};\nfunction ariaItemAttributes(emit13, item) {\n    const hide = item.aria === false;\n    emit13(ARIA_HIDDEN, hide || undefined);\n    if (hide || item.description == null) for(const prop in AriaEncode)emit13(AriaEncode[prop], undefined);\n    else {\n        const type20 = item.mark.marktype;\n        emit13(ARIA_LABEL, item.description);\n        emit13(ARIA_ROLE, item.ariaRole || (type20 === \"group\" ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL));\n        emit13(ARIA_ROLEDESCRIPTION, item.ariaRoleDescription || `${type20} mark`);\n    }\n}\nfunction ariaMarkAttributes(mark) {\n    return mark.aria === false ? {\n        [ARIA_HIDDEN]: true\n    } : AriaIgnore[mark.role] ? null : AriaGuides[mark.role] ? ariaGuide(mark, AriaGuides[mark.role]) : ariaMark(mark);\n}\nfunction ariaMark(mark) {\n    const type21 = mark.marktype;\n    const recurse1 = type21 === \"group\" || type21 === \"text\" || mark.items.some((_)=>_.description != null && _.aria !== false);\n    return bundle(recurse1 ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL, `${type21} mark container`, mark.description);\n}\nfunction ariaGuide(mark, opt) {\n    try {\n        const item = mark.items[0], caption = opt.caption || (()=>\"\");\n        return bundle(opt.role || GRAPHICS_SYMBOL, opt.desc, item.description || caption(item));\n    } catch (err) {\n        return null;\n    }\n}\nfunction titleCaption(item) {\n    return (0, _vegaUtil.array)(item.text).join(\" \");\n}\nfunction axisCaption(item) {\n    const datum = item.datum, orient = item.orient, title = datum.title ? extractTitle(item) : null, ctx = item.context, scale1 = ctx.scales[datum.scale].value, locale = ctx.dataflow.locale(), type22 = scale1.type, xy = orient === \"left\" || orient === \"right\" ? \"Y\" : \"X\";\n    return `${xy}-axis` + (title ? ` titled '${title}'` : \"\") + ` for a ${(0, _vegaScale.isDiscrete)(type22) ? \"discrete\" : type22} scale` + ` with ${(0, _vegaScale.domainCaption)(locale, scale1, item)}`;\n}\nfunction legendCaption(item) {\n    const datum = item.datum, title = datum.title ? extractTitle(item) : null, type23 = `${datum.type || \"\"} legend`.trim(), scales = datum.scales, props = Object.keys(scales), ctx = item.context, scale2 = ctx.scales[scales[props[0]]].value, locale = ctx.dataflow.locale();\n    return capitalize(type23) + (title ? ` titled '${title}'` : \"\") + ` for ${channelCaption(props)}` + ` with ${(0, _vegaScale.domainCaption)(locale, scale2, item)}`;\n}\nfunction extractTitle(item) {\n    try {\n        return (0, _vegaUtil.array)((0, _vegaUtil.peek)(item.items).items[0].text).join(\" \");\n    } catch (err) {\n        return null;\n    }\n}\nfunction channelCaption(props) {\n    props = props.map((p)=>p + (p === \"fill\" || p === \"stroke\" ? \" color\" : \"\"));\n    return props.length < 2 ? props[0] : props.slice(0, -1).join(\", \") + \" and \" + (0, _vegaUtil.peek)(props);\n}\nfunction capitalize(s) {\n    return s.length ? s[0].toUpperCase() + s.slice(1) : s;\n}\nconst innerText = (val)=>(val + \"\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\nconst attrText = (val)=>innerText(val).replace(/\"/g, \"&quot;\").replace(/\\t/g, \"&#x9;\").replace(/\\n/g, \"&#xA;\").replace(/\\r/g, \"&#xD;\");\nfunction markup() {\n    let buf = \"\", outer = \"\", inner = \"\";\n    const stack = [], clear = ()=>outer = inner = \"\", push = (tag)=>{\n        if (outer) {\n            buf += `${outer}>${inner}`;\n            clear();\n        }\n        stack.push(tag);\n    }, attr3 = (name, value8)=>{\n        if (value8 != null) outer += ` ${name}=\"${attrText(value8)}\"`;\n        return m;\n    }, m = {\n        open (tag, ...attrs) {\n            push(tag);\n            outer = \"<\" + tag;\n            for (const set of attrs)for(const key in set)attr3(key, set[key]);\n            return m;\n        },\n        close () {\n            const tag = stack.pop();\n            if (outer) buf += outer + (inner ? `>${inner}</${tag}>` : \"/>\");\n            else buf += `</${tag}>`;\n            clear();\n            return m;\n        },\n        attr: attr3,\n        text: (t)=>(inner += innerText(t), m),\n        toString: ()=>buf\n    };\n    return m;\n}\nconst serializeXML = (node)=>_serialize(markup(), node) + \"\";\nfunction _serialize(m, node) {\n    m.open(node.tagName);\n    if (node.hasAttributes()) {\n        const attrs = node.attributes, n = attrs.length;\n        for(let i = 0; i < n; ++i)m.attr(attrs[i].name, attrs[i].value);\n    }\n    if (node.hasChildNodes()) {\n        const children = node.childNodes, n = children.length;\n        for(let i = 0; i < n; i++){\n            const child = children[i];\n            child.nodeType === 3 // text node\n             ? m.text(child.nodeValue) : _serialize(m, child);\n        }\n    }\n    return m.close();\n}\nconst styles = {\n    fill: \"fill\",\n    fillOpacity: \"fill-opacity\",\n    stroke: \"stroke\",\n    strokeOpacity: \"stroke-opacity\",\n    strokeWidth: \"stroke-width\",\n    strokeCap: \"stroke-linecap\",\n    strokeJoin: \"stroke-linejoin\",\n    strokeDash: \"stroke-dasharray\",\n    strokeDashOffset: \"stroke-dashoffset\",\n    strokeMiterLimit: \"stroke-miterlimit\",\n    opacity: \"opacity\",\n    blend: \"mix-blend-mode\"\n}; // ensure miter limit default is consistent with canvas (#2498)\nconst rootAttributes = {\n    \"fill\": \"none\",\n    \"stroke-miterlimit\": 10\n};\nconst RootIndex = 0, xmlns = \"http://www.w3.org/2000/xmlns/\", svgns = metadata.xmlns;\nfunction SVGRenderer(loader) {\n    Renderer.call(this, loader);\n    this._dirtyID = 0;\n    this._dirty = [];\n    this._svg = null;\n    this._root = null;\n    this._defs = null;\n}\nconst base = Renderer.prototype;\n(0, _vegaUtil.inherits)(SVGRenderer, Renderer, {\n    /**\n   * Initialize a new SVGRenderer instance.\n   * @param {DOMElement} el - The containing DOM element for the display.\n   * @param {number} width - The coordinate width of the display, in pixels.\n   * @param {number} height - The coordinate height of the display, in pixels.\n   * @param {Array<number>} origin - The origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n   *   the width and height to determine the final pixel size.\n   * @return {SVGRenderer} - This renderer instance.\n   */ initialize (el, width, height, origin, scaleFactor) {\n        // create the svg definitions cache\n        this._defs = {};\n        this._clearDefs();\n        if (el) {\n            this._svg = domChild(el, 0, \"svg\", svgns);\n            this._svg.setAttributeNS(xmlns, \"xmlns\", svgns);\n            this._svg.setAttributeNS(xmlns, \"xmlns:xlink\", metadata[\"xmlns:xlink\"]);\n            this._svg.setAttribute(\"version\", metadata[\"version\"]);\n            this._svg.setAttribute(\"class\", \"marks\");\n            domClear(el, 1); // set the svg root group\n            this._root = domChild(this._svg, RootIndex, \"g\", svgns);\n            setAttributes(this._root, rootAttributes); // ensure no additional child elements\n            domClear(this._svg, RootIndex + 1);\n        } // set background color if defined\n        this.background(this._bgcolor);\n        return base.initialize.call(this, el, width, height, origin, scaleFactor);\n    },\n    /**\n   * Get / set the background color.\n   */ background (bgcolor) {\n        if (arguments.length && this._svg) this._svg.style.setProperty(\"background-color\", bgcolor);\n        return base.background.apply(this, arguments);\n    },\n    /**\n   * Resize the display.\n   * @param {number} width - The new coordinate width of the display, in pixels.\n   * @param {number} height - The new coordinate height of the display, in pixels.\n   * @param {Array<number>} origin - The new origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n   *   the width and height to determine the final pixel size.\n   * @return {SVGRenderer} - This renderer instance;\n   */ resize (width, height, origin, scaleFactor) {\n        base.resize.call(this, width, height, origin, scaleFactor);\n        if (this._svg) {\n            setAttributes(this._svg, {\n                width: this._width * this._scale,\n                height: this._height * this._scale,\n                viewBox: `0 0 ${this._width} ${this._height}`\n            });\n            this._root.setAttribute(\"transform\", `translate(${this._origin})`);\n        }\n        this._dirty = [];\n        return this;\n    },\n    /**\n   * Returns the SVG element of the visualization.\n   * @return {DOMElement} - The SVG element.\n   */ canvas () {\n        return this._svg;\n    },\n    /**\n   * Returns an SVG text string for the rendered content,\n   * or null if this renderer is currently headless.\n   */ svg () {\n        const svg = this._svg, bg = this._bgcolor;\n        if (!svg) return null;\n        let node;\n        if (bg) {\n            svg.removeAttribute(\"style\");\n            node = domChild(svg, RootIndex, \"rect\", svgns);\n            setAttributes(node, {\n                width: this._width,\n                height: this._height,\n                fill: bg\n            });\n        }\n        const text9 = serializeXML(svg);\n        if (bg) {\n            svg.removeChild(node);\n            this._svg.style.setProperty(\"background-color\", bg);\n        }\n        return text9;\n    },\n    /**\n   * Internal rendering method.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   */ _render (scene) {\n        // perform spot updates and re-render markup\n        if (this._dirtyCheck()) {\n            if (this._dirtyAll) this._clearDefs();\n            this.mark(this._root, scene);\n            domClear(this._root, 1);\n        }\n        this.defs();\n        this._dirty = [];\n        ++this._dirtyID;\n        return this;\n    },\n    // -- Manage rendering of items marked as dirty --\n    /**\n   * Flag a mark item as dirty.\n   * @param {Item} item - The mark item.\n   */ dirty (item) {\n        if (item.dirty !== this._dirtyID) {\n            item.dirty = this._dirtyID;\n            this._dirty.push(item);\n        }\n    },\n    /**\n   * Check if a mark item is considered dirty.\n   * @param {Item} item - The mark item.\n   */ isDirty (item) {\n        return this._dirtyAll || !item._svg || item.dirty === this._dirtyID;\n    },\n    /**\n   * Internal method to check dirty status and, if possible,\n   * make targetted updates without a full rendering pass.\n   */ _dirtyCheck () {\n        this._dirtyAll = true;\n        const items = this._dirty;\n        if (!items.length || !this._dirtyID) return true;\n        const id = ++this._dirtyID;\n        let item, mark, type24, mdef, i1, n, o;\n        for(i1 = 0, n = items.length; i1 < n; ++i1){\n            item = items[i1];\n            mark = item.mark;\n            if (mark.marktype !== type24) {\n                // memoize mark instance lookup\n                type24 = mark.marktype;\n                mdef = Marks[type24];\n            }\n            if (mark.zdirty && mark.dirty !== id) {\n                this._dirtyAll = false;\n                dirtyParents(item, id);\n                mark.items.forEach((i)=>{\n                    i.dirty = id;\n                });\n            }\n            if (mark.zdirty) continue; // handle in standard drawing pass\n            if (item.exit) {\n                // EXIT\n                if (mdef.nested && mark.items.length) {\n                    // if nested mark with remaining points, update instead\n                    o = mark.items[0];\n                    if (o._svg) this._update(mdef, o._svg, o);\n                } else if (item._svg) {\n                    // otherwise remove from DOM\n                    o = item._svg.parentNode;\n                    if (o) o.removeChild(item._svg);\n                }\n                item._svg = null;\n                continue;\n            }\n            item = mdef.nested ? mark.items[0] : item;\n            if (item._update === id) continue; // already visited\n            if (!item._svg || !item._svg.ownerSVGElement) {\n                // ENTER\n                this._dirtyAll = false;\n                dirtyParents(item, id);\n            } else // IN-PLACE UPDATE\n            this._update(mdef, item._svg, item);\n            item._update = id;\n        }\n        return !this._dirtyAll;\n    },\n    // -- Construct & maintain scenegraph to SVG mapping ---\n    /**\n   * Render a set of mark items.\n   * @param {SVGElement} el - The parent element in the SVG tree.\n   * @param {object} scene - The mark parent to render.\n   * @param {SVGElement} prev - The previous sibling in the SVG tree.\n   */ mark (el, scene, prev) {\n        if (!this.isDirty(scene)) return scene._svg;\n        const svg = this._svg, mdef = Marks[scene.marktype], events = scene.interactive === false ? \"none\" : null, isGroup = mdef.tag === \"g\";\n        let sibling = null, i = 0;\n        const parent = bind(scene, el, prev, \"g\", svg);\n        parent.setAttribute(\"class\", cssClass(scene)); // apply aria attributes to parent container element\n        const aria = ariaMarkAttributes(scene);\n        for(const key in aria)setAttribute(parent, key, aria[key]);\n        if (!isGroup) setAttribute(parent, \"pointer-events\", events);\n        setAttribute(parent, \"clip-path\", scene.clip ? clip$1(this, scene, scene.group) : null);\n        const process = (item)=>{\n            const dirty = this.isDirty(item), node = bind(item, parent, sibling, mdef.tag, svg);\n            if (dirty) {\n                this._update(mdef, node, item);\n                if (isGroup) recurse(this, node, item);\n            }\n            sibling = node;\n            ++i;\n        };\n        if (mdef.nested) {\n            if (scene.items.length) process(scene.items[0]);\n        } else visit(scene, process);\n        domClear(parent, i);\n        return parent;\n    },\n    /**\n   * Update the attributes of an SVG element for a mark item.\n   * @param {object} mdef - The mark definition object\n   * @param {SVGElement} el - The SVG element.\n   * @param {Item} item - The mark item.\n   */ _update (mdef, el, item) {\n        // set dom element and values cache\n        // provides access to emit method\n        element = el;\n        values = el.__values__; // apply aria-specific properties\n        ariaItemAttributes(emit, item); // apply svg attributes\n        mdef.attr(emit, item, this); // some marks need special treatment\n        const extra = mark_extras[mdef.type];\n        if (extra) extra.call(this, mdef, el, item); // apply svg style attributes\n        // note: element state may have been modified by 'extra' method\n        if (element) this.style(element, item);\n    },\n    /**\n   * Update the presentation attributes of an SVG element for a mark item.\n   * @param {SVGElement} el - The SVG element.\n   * @param {Item} item - The mark item.\n   */ style (el, item) {\n        if (item == null) return;\n        for(const prop in styles){\n            let value9 = prop === \"font\" ? fontFamily(item) : item[prop];\n            if (value9 === values[prop]) continue;\n            const name = styles[prop];\n            if (value9 == null) el.removeAttribute(name);\n            else {\n                if (isGradient(value9)) value9 = gradientRef(value9, this._defs.gradient, href());\n                el.setAttribute(name, value9 + \"\");\n            }\n            values[prop] = value9;\n        }\n    },\n    /**\n   * Render SVG defs, as needed.\n   * Must be called *after* marks have been processed to ensure the\n   * collected state is current and accurate.\n   */ defs () {\n        const svg = this._svg, defs = this._defs;\n        let el = defs.el, index = 0;\n        for(const id in defs.gradient){\n            if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n            index = updateGradient(el, defs.gradient[id], index);\n        }\n        for(const id1 in defs.clipping){\n            if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n            index = updateClipping(el, defs.clipping[id1], index);\n        } // clean-up\n        if (el) index === 0 ? (svg.removeChild(el), defs.el = null) : domClear(el, index);\n    },\n    /**\n   * Clear defs caches.\n   */ _clearDefs () {\n        const def3 = this._defs;\n        def3.gradient = {};\n        def3.clipping = {};\n    }\n}); // mark ancestor chain with a dirty id\nfunction dirtyParents(item, id) {\n    for(; item && item.dirty !== id; item = item.mark.group){\n        item.dirty = id;\n        if (item.mark && item.mark.dirty !== id) item.mark.dirty = id;\n        else return;\n    }\n} // update gradient definitions\nfunction updateGradient(el, grad, index) {\n    let i, n, stop;\n    if (grad.gradient === \"radial\") {\n        // SVG radial gradients automatically transform to normalized bbox\n        // coordinates, in a way that is cumbersome to replicate in canvas.\n        // We wrap the radial gradient in a pattern element, allowing us to\n        // maintain a circular gradient that matches what canvas provides.\n        let pt = domChild(el, index++, \"pattern\", svgns);\n        setAttributes(pt, {\n            id: patternPrefix + grad.id,\n            viewBox: \"0,0,1,1\",\n            width: \"100%\",\n            height: \"100%\",\n            preserveAspectRatio: \"xMidYMid slice\"\n        });\n        pt = domChild(pt, 0, \"rect\", svgns);\n        setAttributes(pt, {\n            width: 1,\n            height: 1,\n            fill: `url(${href()}#${grad.id})`\n        });\n        el = domChild(el, index++, \"radialGradient\", svgns);\n        setAttributes(el, {\n            id: grad.id,\n            fx: grad.x1,\n            fy: grad.y1,\n            fr: grad.r1,\n            cx: grad.x2,\n            cy: grad.y2,\n            r: grad.r2\n        });\n    } else {\n        el = domChild(el, index++, \"linearGradient\", svgns);\n        setAttributes(el, {\n            id: grad.id,\n            x1: grad.x1,\n            x2: grad.x2,\n            y1: grad.y1,\n            y2: grad.y2\n        });\n    }\n    for(i = 0, n = grad.stops.length; i < n; ++i){\n        stop = domChild(el, i, \"stop\", svgns);\n        stop.setAttribute(\"offset\", grad.stops[i].offset);\n        stop.setAttribute(\"stop-color\", grad.stops[i].color);\n    }\n    domClear(el, i);\n    return index;\n} // update clipping path definitions\nfunction updateClipping(el, clip3, index) {\n    let mask;\n    el = domChild(el, index, \"clipPath\", svgns);\n    el.setAttribute(\"id\", clip3.id);\n    if (clip3.path) {\n        mask = domChild(el, 0, \"path\", svgns);\n        mask.setAttribute(\"d\", clip3.path);\n    } else {\n        mask = domChild(el, 0, \"rect\", svgns);\n        setAttributes(mask, {\n            x: 0,\n            y: 0,\n            width: clip3.width,\n            height: clip3.height\n        });\n    }\n    domClear(el, 1);\n    return index + 1;\n} // Recursively process group contents.\nfunction recurse(renderer, el, group8) {\n    el = el.lastChild.previousSibling;\n    let prev, idx = 0;\n    visit(group8, (item)=>{\n        prev = renderer.mark(el, item, prev);\n        ++idx;\n    }); // remove any extraneous DOM elements\n    domClear(el, 1 + idx);\n} // Bind a scenegraph item to an SVG DOM element.\n// Create new SVG elements as needed.\nfunction bind(item, el, sibling, tag, svg) {\n    let node = item._svg, doc; // create a new dom node if needed\n    if (!node) {\n        doc = el.ownerDocument;\n        node = domCreate(doc, tag, svgns);\n        item._svg = node;\n        if (item.mark) {\n            node.__data__ = item;\n            node.__values__ = {\n                fill: \"default\"\n            }; // if group, create background, content, and foreground elements\n            if (tag === \"g\") {\n                const bg = domCreate(doc, \"path\", svgns);\n                node.appendChild(bg);\n                bg.__data__ = item;\n                const cg = domCreate(doc, \"g\", svgns);\n                node.appendChild(cg);\n                cg.__data__ = item;\n                const fg = domCreate(doc, \"path\", svgns);\n                node.appendChild(fg);\n                fg.__data__ = item;\n                fg.__values__ = {\n                    fill: \"default\"\n                };\n            }\n        }\n    } // (re-)insert if (a) not contained in SVG or (b) sibling order has changed\n    if (node.ownerSVGElement !== svg || siblingCheck(node, sibling)) el.insertBefore(node, sibling ? sibling.nextSibling : el.firstChild);\n    return node;\n} // check if two nodes are ordered siblings\nfunction siblingCheck(node, sibling) {\n    return node.parentNode && node.parentNode.childNodes.length > 1 && node.previousSibling != sibling; // treat null/undefined the same\n} // -- Set attributes & styles on SVG elements ---\nlet element = null, // temp var for current SVG element\nvalues = null; // temp var for current values hash\n// Extra configuration for certain mark types\nconst mark_extras = {\n    group (mdef, el, item) {\n        const fg = element = el.childNodes[2];\n        values = fg.__values__;\n        mdef.foreground(emit, item, this);\n        values = el.__values__; // use parent's values hash\n        element = el.childNodes[1];\n        mdef.content(emit, item, this);\n        const bg = element = el.childNodes[0];\n        mdef.background(emit, item, this);\n        const value10 = item.mark.interactive === false ? \"none\" : null;\n        if (value10 !== values.events) {\n            setAttribute(fg, \"pointer-events\", value10);\n            setAttribute(bg, \"pointer-events\", value10);\n            values.events = value10;\n        }\n        if (item.strokeForeground && item.stroke) {\n            const fill2 = item.fill;\n            setAttribute(fg, \"display\", null); // set style of background\n            this.style(bg, item);\n            setAttribute(bg, \"stroke\", null); // set style of foreground\n            if (fill2) item.fill = null;\n            values = fg.__values__;\n            this.style(fg, item);\n            if (fill2) item.fill = fill2; // leave element null to prevent downstream styling\n            element = null;\n        } else // ensure foreground is ignored\n        setAttribute(fg, \"display\", \"none\");\n    },\n    image (mdef, el, item) {\n        if (item.smooth === false) {\n            setStyle(el, \"image-rendering\", \"optimizeSpeed\");\n            setStyle(el, \"image-rendering\", \"pixelated\");\n        } else setStyle(el, \"image-rendering\", null);\n    },\n    text (mdef, el, item) {\n        const tl6 = textLines(item);\n        let key, value11, doc, lh;\n        if ((0, _vegaUtil.isArray)(tl6)) {\n            // multi-line text\n            value11 = tl6.map((_)=>textValue(item, _));\n            key = value11.join(\"\\n\"); // content cache key\n            if (key !== values.text) {\n                domClear(el, 0);\n                doc = el.ownerDocument;\n                lh = lineHeight(item);\n                value11.forEach((t, i)=>{\n                    const ts1 = domCreate(doc, \"tspan\", svgns);\n                    ts1.__data__ = item; // data binding\n                    ts1.textContent = t;\n                    if (i) {\n                        ts1.setAttribute(\"x\", 0);\n                        ts1.setAttribute(\"dy\", lh);\n                    }\n                    el.appendChild(ts1);\n                });\n                values.text = key;\n            }\n        } else {\n            // single-line text\n            value11 = textValue(item, tl6);\n            if (value11 !== values.text) {\n                el.textContent = value11;\n                values.text = value11;\n            }\n        }\n        setAttribute(el, \"font-family\", fontFamily(item));\n        setAttribute(el, \"font-size\", fontSize(item) + \"px\");\n        setAttribute(el, \"font-style\", item.fontStyle);\n        setAttribute(el, \"font-variant\", item.fontVariant);\n        setAttribute(el, \"font-weight\", item.fontWeight);\n    }\n};\nfunction emit(name, value12, ns) {\n    // early exit if value is unchanged\n    if (value12 === values[name]) return; // use appropriate method given namespace (ns)\n    if (ns) setAttributeNS(element, name, value12, ns);\n    else setAttribute(element, name, value12);\n     // note current value for future comparison\n    values[name] = value12;\n}\nfunction setStyle(el, name, value13) {\n    if (value13 !== values[name]) {\n        if (value13 == null) el.style.removeProperty(name);\n        else el.style.setProperty(name, value13 + \"\");\n        values[name] = value13;\n    }\n}\nfunction setAttributes(el, attrs) {\n    for(const key in attrs)setAttribute(el, key, attrs[key]);\n}\nfunction setAttribute(el, name, value14) {\n    if (value14 != null) // if value is provided, update DOM attribute\n    el.setAttribute(name, value14);\n    else // else remove DOM attribute\n    el.removeAttribute(name);\n}\nfunction setAttributeNS(el, name, value15, ns) {\n    if (value15 != null) // if value is provided, update DOM attribute\n    el.setAttributeNS(ns, name, value15);\n    else // else remove DOM attribute\n    el.removeAttributeNS(ns, name);\n}\nfunction href() {\n    let loc;\n    return typeof window === \"undefined\" ? \"\" : (loc = window.location).hash ? loc.href.slice(0, -loc.hash.length) : loc.href;\n}\nfunction SVGStringRenderer(loader) {\n    Renderer.call(this, loader);\n    this._text = null;\n    this._defs = {\n        gradient: {},\n        clipping: {}\n    };\n}\n(0, _vegaUtil.inherits)(SVGStringRenderer, Renderer, {\n    /**\n   * Returns the rendered SVG text string,\n   * or null if rendering has not yet occurred.\n   */ svg () {\n        return this._text;\n    },\n    /**\n   * Internal rendering method.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   */ _render (scene) {\n        const m = markup(); // svg tag\n        m.open(\"svg\", (0, _vegaUtil.extend)({}, metadata, {\n            class: \"marks\",\n            width: this._width * this._scale,\n            height: this._height * this._scale,\n            viewBox: `0 0 ${this._width} ${this._height}`\n        })); // background, if defined\n        const bg = this._bgcolor;\n        if (bg && bg !== \"transparent\" && bg !== \"none\") m.open(\"rect\", {\n            width: this._width,\n            height: this._height,\n            fill: bg\n        }).close();\n         // root content group\n        m.open(\"g\", rootAttributes, {\n            transform: \"translate(\" + this._origin + \")\"\n        });\n        this.mark(m, scene);\n        m.close(); // </g>\n        // defs\n        this.defs(m); // get SVG text string\n        this._text = m.close() + \"\";\n        return this;\n    },\n    /**\n   * Render a set of mark items.\n   * @param {object} m - The markup context.\n   * @param {object} scene - The mark parent to render.\n   */ mark (m, scene1) {\n        const mdef = Marks[scene1.marktype], tag = mdef.tag, attrList = [\n            ariaItemAttributes,\n            mdef.attr\n        ]; // render opening group tag\n        m.open(\"g\", {\n            \"class\": cssClass(scene1),\n            \"clip-path\": scene1.clip ? clip$1(this, scene1, scene1.group) : null\n        }, ariaMarkAttributes(scene1), {\n            \"pointer-events\": tag !== \"g\" && scene1.interactive === false ? \"none\" : null\n        }); // render contained elements\n        const process = (item)=>{\n            const href2 = this.href(item);\n            if (href2) m.open(\"a\", href2);\n            m.open(tag, this.attr(scene1, item, attrList, tag !== \"g\" ? tag : null));\n            if (tag === \"text\") {\n                const tl7 = textLines(item);\n                if ((0, _vegaUtil.isArray)(tl7)) {\n                    // multi-line text\n                    const attrs = {\n                        x: 0,\n                        dy: lineHeight(item)\n                    };\n                    for(let i = 0; i < tl7.length; ++i)m.open(\"tspan\", i ? attrs : null).text(textValue(item, tl7[i])).close();\n                } else // single-line text\n                m.text(textValue(item, tl7));\n            } else if (tag === \"g\") {\n                const fore = item.strokeForeground, fill3 = item.fill, stroke2 = item.stroke;\n                if (fore && stroke2) item.stroke = null;\n                m.open(\"path\", this.attr(scene1, item, mdef.background, \"bgrect\")).close(); // recurse for group content\n                m.open(\"g\", this.attr(scene1, item, mdef.content));\n                visit(item, (scene)=>this.mark(m, scene));\n                m.close();\n                if (fore && stroke2) {\n                    if (fill3) item.fill = null;\n                    item.stroke = stroke2;\n                    m.open(\"path\", this.attr(scene1, item, mdef.foreground, \"bgrect\")).close();\n                    if (fill3) item.fill = fill3;\n                } else m.open(\"path\", this.attr(scene1, item, mdef.foreground, \"bgfore\")).close();\n            }\n            m.close(); // </tag>\n            if (href2) m.close(); // </a>\n        };\n        if (mdef.nested) {\n            if (scene1.items && scene1.items.length) process(scene1.items[0]);\n        } else visit(scene1, process);\n         // render closing group tag\n        return m.close(); // </g>\n    },\n    /**\n   * Get href attributes for a hyperlinked mark item.\n   * @param {Item} item - The mark item.\n   */ href (item) {\n        const href3 = item.href;\n        let attr4;\n        if (href3) {\n            if (attr4 = this._hrefs && this._hrefs[href3]) return attr4;\n            else this.sanitizeURL(href3).then((attr5)=>{\n                // rewrite to use xlink namespace\n                attr5[\"xlink:href\"] = attr5.href;\n                attr5.href = null;\n                (this._hrefs || (this._hrefs = {}))[href3] = attr5;\n            });\n        }\n        return null;\n    },\n    /**\n   * Get an object of SVG attributes for a mark item.\n   * @param {object} scene - The mark parent.\n   * @param {Item} item - The mark item.\n   * @param {array|function} attrs - One or more attribute emitters.\n   * @param {string} tag - The tag being rendered.\n   */ attr (scene, item, attrs, tag) {\n        const object = {}, emit14 = (name, value16, ns, prefixed)=>{\n            object[prefixed || name] = value16;\n        }; // apply mark specific attributes\n        if (Array.isArray(attrs)) attrs.forEach((fn)=>fn(emit14, item, this));\n        else attrs(emit14, item, this);\n         // apply style attributes\n        if (tag) style(object, item, scene, tag, this._defs);\n        return object;\n    },\n    /**\n   * Render SVG defs, as needed.\n   * Must be called *after* marks have been processed to ensure the\n   * collected state is current and accurate.\n   * @param {object} m - The markup context.\n   */ defs (m) {\n        const gradient4 = this._defs.gradient, clipping = this._defs.clipping, count = Object.keys(gradient4).length + Object.keys(clipping).length;\n        if (count === 0) return; // nothing to do\n        m.open(\"defs\");\n        for(const id in gradient4){\n            const def4 = gradient4[id], stops = def4.stops;\n            if (def4.gradient === \"radial\") {\n                // SVG radial gradients automatically transform to normalized bbox\n                // coordinates, in a way that is cumbersome to replicate in canvas.\n                // We wrap the radial gradient in a pattern element, allowing us to\n                // maintain a circular gradient that matches what canvas provides.\n                m.open(\"pattern\", {\n                    id: patternPrefix + id,\n                    viewBox: \"0,0,1,1\",\n                    width: \"100%\",\n                    height: \"100%\",\n                    preserveAspectRatio: \"xMidYMid slice\"\n                });\n                m.open(\"rect\", {\n                    width: \"1\",\n                    height: \"1\",\n                    fill: \"url(#\" + id + \")\"\n                }).close();\n                m.close(); // </pattern>\n                m.open(\"radialGradient\", {\n                    id: id,\n                    fx: def4.x1,\n                    fy: def4.y1,\n                    fr: def4.r1,\n                    cx: def4.x2,\n                    cy: def4.y2,\n                    r: def4.r2\n                });\n            } else m.open(\"linearGradient\", {\n                id: id,\n                x1: def4.x1,\n                x2: def4.x2,\n                y1: def4.y1,\n                y2: def4.y2\n            });\n            for(let i = 0; i < stops.length; ++i)m.open(\"stop\", {\n                offset: stops[i].offset,\n                \"stop-color\": stops[i].color\n            }).close();\n            m.close();\n        }\n        for(const id2 in clipping){\n            const def5 = clipping[id2];\n            m.open(\"clipPath\", {\n                id: id2\n            });\n            if (def5.path) m.open(\"path\", {\n                d: def5.path\n            }).close();\n            else m.open(\"rect\", {\n                x: 0,\n                y: 0,\n                width: def5.width,\n                height: def5.height\n            }).close();\n            m.close();\n        }\n        m.close();\n    }\n}); // Helper function for attr for style presentation attributes\nfunction style(s, item, scene, tag, defs) {\n    if (item == null) return s;\n    if (tag === \"bgrect\" && scene.interactive === false) s[\"pointer-events\"] = \"none\";\n    if (tag === \"bgfore\") {\n        if (scene.interactive === false) s[\"pointer-events\"] = \"none\";\n        s.display = \"none\";\n        if (item.fill !== null) return s;\n    }\n    if (tag === \"image\" && item.smooth === false) s.style = \"image-rendering: optimizeSpeed; image-rendering: pixelated;\";\n    if (tag === \"text\") {\n        s[\"font-family\"] = fontFamily(item);\n        s[\"font-size\"] = fontSize(item) + \"px\";\n        s[\"font-style\"] = item.fontStyle;\n        s[\"font-variant\"] = item.fontVariant;\n        s[\"font-weight\"] = item.fontWeight;\n    }\n    for(const prop in styles){\n        let value17 = item[prop];\n        const name = styles[prop];\n        if (value17 === \"transparent\" && (name === \"fill\" || name === \"stroke\")) ;\n        else if (value17 != null) {\n            if (isGradient(value17)) value17 = gradientRef(value17, defs.gradient, \"\");\n            s[name] = value17;\n        }\n    }\n    return s;\n}\nconst Canvas = \"canvas\";\nconst PNG = \"png\";\nconst SVG = \"svg\";\nconst None = \"none\";\nconst RenderType = {\n    Canvas: Canvas,\n    PNG: PNG,\n    SVG: SVG,\n    None: None\n};\nconst modules = {};\nmodules[Canvas] = modules[PNG] = {\n    renderer: CanvasRenderer,\n    headless: CanvasRenderer,\n    handler: CanvasHandler\n};\nmodules[SVG] = {\n    renderer: SVGRenderer,\n    headless: SVGStringRenderer,\n    handler: SVGHandler\n};\nmodules[None] = {};\nfunction renderModule(name, _) {\n    name = String(name || \"\").toLowerCase();\n    if (arguments.length > 1) {\n        modules[name] = _;\n        return this;\n    } else return modules[name];\n}\nfunction intersect(scene, bounds20, filter) {\n    const hits = [], // intersection results\n    box = new Bounds().union(bounds20), // defensive copy\n    type25 = scene.marktype;\n    return type25 ? intersectMark(scene, box, filter, hits) : type25 === \"group\" ? intersectGroup(scene, box, filter, hits) : (0, _vegaUtil.error)(\"Intersect scene must be mark node or group item.\");\n}\nfunction intersectMark(mark, box, filter, hits) {\n    if (visitMark(mark, box, filter)) {\n        const items = mark.items, type26 = mark.marktype, n = items.length;\n        let i = 0;\n        if (type26 === \"group\") for(; i < n; ++i)intersectGroup(items[i], box, filter, hits);\n        else for(const test = Marks[type26].isect; i < n; ++i){\n            const item = items[i];\n            if (intersectItem(item, box, test)) hits.push(item);\n        }\n    }\n    return hits;\n}\nfunction visitMark(mark, box, filter) {\n    // process if bounds intersect and if\n    // (1) mark is a group mark (so we must recurse), or\n    // (2) mark is interactive and passes filter\n    return mark.bounds && box.intersects(mark.bounds) && (mark.marktype === \"group\" || mark.interactive !== false && (!filter || filter(mark)));\n}\nfunction intersectGroup(group9, box, filter, hits) {\n    // test intersect against group\n    // skip groups by default unless filter says otherwise\n    if (filter && filter(group9.mark) && intersectItem(group9, box, Marks.group.isect)) hits.push(group9);\n     // recursively test children marks\n    // translate box to group coordinate space\n    const marks = group9.items, n = marks && marks.length;\n    if (n) {\n        const x48 = group9.x || 0, y46 = group9.y || 0;\n        box.translate(-x48, -y46);\n        for(let i = 0; i < n; ++i)intersectMark(marks[i], box, filter, hits);\n        box.translate(x48, y46);\n    }\n    return hits;\n}\nfunction intersectItem(item, box, test) {\n    // test bounds enclosure, bounds intersection, then detailed test\n    const bounds21 = item.bounds;\n    return box.encloses(bounds21) || box.intersects(bounds21) && test(item, box);\n}\nconst clipBounds = new Bounds();\nfunction boundClip(mark) {\n    const clip4 = mark.clip;\n    if ((0, _vegaUtil.isFunction)(clip4)) clip4(boundContext(clipBounds.clear()));\n    else if (clip4) clipBounds.set(0, 0, mark.group.width, mark.group.height);\n    else return;\n    mark.bounds.intersect(clipBounds);\n}\nconst TOLERANCE = 1e-9;\nfunction sceneEqual(a, b21, key) {\n    return a === b21 ? true : key === \"path\" ? pathEqual(a, b21) : a instanceof Date && b21 instanceof Date ? +a === +b21 : (0, _vegaUtil.isNumber)(a) && (0, _vegaUtil.isNumber)(b21) ? Math.abs(a - b21) <= TOLERANCE : !a || !b21 || !(0, _vegaUtil.isObject)(a) && !(0, _vegaUtil.isObject)(b21) ? a == b21 : objectEqual(a, b21);\n}\nfunction pathEqual(a, b22) {\n    return sceneEqual(pathParse(a), pathParse(b22));\n}\nfunction objectEqual(a, b23) {\n    var ka = Object.keys(a), kb = Object.keys(b23), key, i;\n    if (ka.length !== kb.length) return false;\n    ka.sort();\n    kb.sort();\n    for(i = ka.length - 1; i >= 0; i--){\n        if (ka[i] != kb[i]) return false;\n    }\n    for(i = ka.length - 1; i >= 0; i--){\n        key = ka[i];\n        if (!sceneEqual(a[key], b23[key], key)) return false;\n    }\n    return typeof a === typeof b23;\n}\nfunction resetSVGDefIds() {\n    resetSVGClipId();\n    resetSVGGradientId();\n}\n\n},{\"vega-util\":\"dPFAY\",\"d3-shape\":\"eB1UR\",\"d3-path\":\"erNya\",\"vega-canvas\":\"7F0ce\",\"vega-loader\":\"fAGtK\",\"vega-scale\":\"evQIv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eB1UR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"arc\", ()=>(0, _arcJsDefault.default));\nparcelHelpers.export(exports, \"area\", ()=>(0, _areaJsDefault.default));\nparcelHelpers.export(exports, \"line\", ()=>(0, _lineJsDefault.default));\nparcelHelpers.export(exports, \"pie\", ()=>(0, _pieJsDefault.default));\nparcelHelpers.export(exports, \"areaRadial\", ()=>(0, _areaRadialJsDefault.default)) // Note: radialArea is deprecated!\n;\nparcelHelpers.export(exports, \"radialArea\", ()=>(0, _areaRadialJsDefault.default));\nparcelHelpers.export(exports, \"lineRadial\", ()=>(0, _lineRadialJsDefault.default)) // Note: radialLine is deprecated!\n;\nparcelHelpers.export(exports, \"radialLine\", ()=>(0, _lineRadialJsDefault.default));\nparcelHelpers.export(exports, \"pointRadial\", ()=>(0, _pointRadialJsDefault.default));\nparcelHelpers.export(exports, \"linkHorizontal\", ()=>(0, _indexJs.linkHorizontal));\nparcelHelpers.export(exports, \"linkVertical\", ()=>(0, _indexJs.linkVertical));\nparcelHelpers.export(exports, \"linkRadial\", ()=>(0, _indexJs.linkRadial));\nparcelHelpers.export(exports, \"symbol\", ()=>(0, _symbolJsDefault.default));\nparcelHelpers.export(exports, \"symbols\", ()=>(0, _symbolJs.symbols));\nparcelHelpers.export(exports, \"symbolCircle\", ()=>(0, _circleJsDefault.default));\nparcelHelpers.export(exports, \"symbolCross\", ()=>(0, _crossJsDefault.default));\nparcelHelpers.export(exports, \"symbolDiamond\", ()=>(0, _diamondJsDefault.default));\nparcelHelpers.export(exports, \"symbolSquare\", ()=>(0, _squareJsDefault.default));\nparcelHelpers.export(exports, \"symbolStar\", ()=>(0, _starJsDefault.default));\nparcelHelpers.export(exports, \"symbolTriangle\", ()=>(0, _triangleJsDefault.default));\nparcelHelpers.export(exports, \"symbolWye\", ()=>(0, _wyeJsDefault.default));\nparcelHelpers.export(exports, \"curveBasisClosed\", ()=>(0, _basisClosedJsDefault.default));\nparcelHelpers.export(exports, \"curveBasisOpen\", ()=>(0, _basisOpenJsDefault.default));\nparcelHelpers.export(exports, \"curveBasis\", ()=>(0, _basisJsDefault.default));\nparcelHelpers.export(exports, \"curveBumpX\", ()=>(0, _bumpJs.bumpX));\nparcelHelpers.export(exports, \"curveBumpY\", ()=>(0, _bumpJs.bumpY));\nparcelHelpers.export(exports, \"curveBundle\", ()=>(0, _bundleJsDefault.default));\nparcelHelpers.export(exports, \"curveCardinalClosed\", ()=>(0, _cardinalClosedJsDefault.default));\nparcelHelpers.export(exports, \"curveCardinalOpen\", ()=>(0, _cardinalOpenJsDefault.default));\nparcelHelpers.export(exports, \"curveCardinal\", ()=>(0, _cardinalJsDefault.default));\nparcelHelpers.export(exports, \"curveCatmullRomClosed\", ()=>(0, _catmullRomClosedJsDefault.default));\nparcelHelpers.export(exports, \"curveCatmullRomOpen\", ()=>(0, _catmullRomOpenJsDefault.default));\nparcelHelpers.export(exports, \"curveCatmullRom\", ()=>(0, _catmullRomJsDefault.default));\nparcelHelpers.export(exports, \"curveLinearClosed\", ()=>(0, _linearClosedJsDefault.default));\nparcelHelpers.export(exports, \"curveLinear\", ()=>(0, _linearJsDefault.default));\nparcelHelpers.export(exports, \"curveMonotoneX\", ()=>(0, _monotoneJs.monotoneX));\nparcelHelpers.export(exports, \"curveMonotoneY\", ()=>(0, _monotoneJs.monotoneY));\nparcelHelpers.export(exports, \"curveNatural\", ()=>(0, _naturalJsDefault.default));\nparcelHelpers.export(exports, \"curveStep\", ()=>(0, _stepJsDefault.default));\nparcelHelpers.export(exports, \"curveStepAfter\", ()=>(0, _stepJs.stepAfter));\nparcelHelpers.export(exports, \"curveStepBefore\", ()=>(0, _stepJs.stepBefore));\nparcelHelpers.export(exports, \"stack\", ()=>(0, _stackJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetExpand\", ()=>(0, _expandJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetDiverging\", ()=>(0, _divergingJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetNone\", ()=>(0, _noneJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetSilhouette\", ()=>(0, _silhouetteJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetWiggle\", ()=>(0, _wiggleJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderAppearance\", ()=>(0, _appearanceJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderAscending\", ()=>(0, _ascendingJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderDescending\", ()=>(0, _descendingJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderInsideOut\", ()=>(0, _insideOutJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderNone\", ()=>(0, _noneJsDefault1.default));\nparcelHelpers.export(exports, \"stackOrderReverse\", ()=>(0, _reverseJsDefault.default));\nvar _arcJs = require(\"./arc.js\");\nvar _arcJsDefault = parcelHelpers.interopDefault(_arcJs);\nvar _areaJs = require(\"./area.js\");\nvar _areaJsDefault = parcelHelpers.interopDefault(_areaJs);\nvar _lineJs = require(\"./line.js\");\nvar _lineJsDefault = parcelHelpers.interopDefault(_lineJs);\nvar _pieJs = require(\"./pie.js\");\nvar _pieJsDefault = parcelHelpers.interopDefault(_pieJs);\nvar _areaRadialJs = require(\"./areaRadial.js\");\nvar _areaRadialJsDefault = parcelHelpers.interopDefault(_areaRadialJs);\nvar _lineRadialJs = require(\"./lineRadial.js\");\nvar _lineRadialJsDefault = parcelHelpers.interopDefault(_lineRadialJs);\nvar _pointRadialJs = require(\"./pointRadial.js\");\nvar _pointRadialJsDefault = parcelHelpers.interopDefault(_pointRadialJs);\nvar _indexJs = require(\"./link/index.js\");\nvar _symbolJs = require(\"./symbol.js\");\nvar _symbolJsDefault = parcelHelpers.interopDefault(_symbolJs);\nvar _circleJs = require(\"./symbol/circle.js\");\nvar _circleJsDefault = parcelHelpers.interopDefault(_circleJs);\nvar _crossJs = require(\"./symbol/cross.js\");\nvar _crossJsDefault = parcelHelpers.interopDefault(_crossJs);\nvar _diamondJs = require(\"./symbol/diamond.js\");\nvar _diamondJsDefault = parcelHelpers.interopDefault(_diamondJs);\nvar _squareJs = require(\"./symbol/square.js\");\nvar _squareJsDefault = parcelHelpers.interopDefault(_squareJs);\nvar _starJs = require(\"./symbol/star.js\");\nvar _starJsDefault = parcelHelpers.interopDefault(_starJs);\nvar _triangleJs = require(\"./symbol/triangle.js\");\nvar _triangleJsDefault = parcelHelpers.interopDefault(_triangleJs);\nvar _wyeJs = require(\"./symbol/wye.js\");\nvar _wyeJsDefault = parcelHelpers.interopDefault(_wyeJs);\nvar _basisClosedJs = require(\"./curve/basisClosed.js\");\nvar _basisClosedJsDefault = parcelHelpers.interopDefault(_basisClosedJs);\nvar _basisOpenJs = require(\"./curve/basisOpen.js\");\nvar _basisOpenJsDefault = parcelHelpers.interopDefault(_basisOpenJs);\nvar _basisJs = require(\"./curve/basis.js\");\nvar _basisJsDefault = parcelHelpers.interopDefault(_basisJs);\nvar _bumpJs = require(\"./curve/bump.js\");\nvar _bundleJs = require(\"./curve/bundle.js\");\nvar _bundleJsDefault = parcelHelpers.interopDefault(_bundleJs);\nvar _cardinalClosedJs = require(\"./curve/cardinalClosed.js\");\nvar _cardinalClosedJsDefault = parcelHelpers.interopDefault(_cardinalClosedJs);\nvar _cardinalOpenJs = require(\"./curve/cardinalOpen.js\");\nvar _cardinalOpenJsDefault = parcelHelpers.interopDefault(_cardinalOpenJs);\nvar _cardinalJs = require(\"./curve/cardinal.js\");\nvar _cardinalJsDefault = parcelHelpers.interopDefault(_cardinalJs);\nvar _catmullRomClosedJs = require(\"./curve/catmullRomClosed.js\");\nvar _catmullRomClosedJsDefault = parcelHelpers.interopDefault(_catmullRomClosedJs);\nvar _catmullRomOpenJs = require(\"./curve/catmullRomOpen.js\");\nvar _catmullRomOpenJsDefault = parcelHelpers.interopDefault(_catmullRomOpenJs);\nvar _catmullRomJs = require(\"./curve/catmullRom.js\");\nvar _catmullRomJsDefault = parcelHelpers.interopDefault(_catmullRomJs);\nvar _linearClosedJs = require(\"./curve/linearClosed.js\");\nvar _linearClosedJsDefault = parcelHelpers.interopDefault(_linearClosedJs);\nvar _linearJs = require(\"./curve/linear.js\");\nvar _linearJsDefault = parcelHelpers.interopDefault(_linearJs);\nvar _monotoneJs = require(\"./curve/monotone.js\");\nvar _naturalJs = require(\"./curve/natural.js\");\nvar _naturalJsDefault = parcelHelpers.interopDefault(_naturalJs);\nvar _stepJs = require(\"./curve/step.js\");\nvar _stepJsDefault = parcelHelpers.interopDefault(_stepJs);\nvar _stackJs = require(\"./stack.js\");\nvar _stackJsDefault = parcelHelpers.interopDefault(_stackJs);\nvar _expandJs = require(\"./offset/expand.js\");\nvar _expandJsDefault = parcelHelpers.interopDefault(_expandJs);\nvar _divergingJs = require(\"./offset/diverging.js\");\nvar _divergingJsDefault = parcelHelpers.interopDefault(_divergingJs);\nvar _noneJs = require(\"./offset/none.js\");\nvar _noneJsDefault = parcelHelpers.interopDefault(_noneJs);\nvar _silhouetteJs = require(\"./offset/silhouette.js\");\nvar _silhouetteJsDefault = parcelHelpers.interopDefault(_silhouetteJs);\nvar _wiggleJs = require(\"./offset/wiggle.js\");\nvar _wiggleJsDefault = parcelHelpers.interopDefault(_wiggleJs);\nvar _appearanceJs = require(\"./order/appearance.js\");\nvar _appearanceJsDefault = parcelHelpers.interopDefault(_appearanceJs);\nvar _ascendingJs = require(\"./order/ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nvar _descendingJs = require(\"./order/descending.js\");\nvar _descendingJsDefault = parcelHelpers.interopDefault(_descendingJs);\nvar _insideOutJs = require(\"./order/insideOut.js\");\nvar _insideOutJsDefault = parcelHelpers.interopDefault(_insideOutJs);\nvar _noneJs1 = require(\"./order/none.js\");\nvar _noneJsDefault1 = parcelHelpers.interopDefault(_noneJs1);\nvar _reverseJs = require(\"./order/reverse.js\");\nvar _reverseJsDefault = parcelHelpers.interopDefault(_reverseJs);\n\n},{\"./arc.js\":\"hBXaC\",\"./area.js\":\"7HGRc\",\"./line.js\":\"iTpSu\",\"./pie.js\":false,\"./areaRadial.js\":false,\"./lineRadial.js\":false,\"./pointRadial.js\":false,\"./link/index.js\":false,\"./symbol.js\":\"6wXmG\",\"./symbol/circle.js\":\"9G0bU\",\"./symbol/cross.js\":\"3dJnN\",\"./symbol/diamond.js\":\"O6MwS\",\"./symbol/square.js\":\"llhtb\",\"./symbol/star.js\":\"4OIBI\",\"./symbol/triangle.js\":\"bcE3R\",\"./symbol/wye.js\":\"ceglC\",\"./curve/basisClosed.js\":\"LU7y1\",\"./curve/basisOpen.js\":\"iUFcz\",\"./curve/basis.js\":\"fxwIG\",\"./curve/bump.js\":false,\"./curve/bundle.js\":\"1IdIu\",\"./curve/cardinalClosed.js\":\"i9B3n\",\"./curve/cardinalOpen.js\":\"feING\",\"./curve/cardinal.js\":\"jFqTA\",\"./curve/catmullRomClosed.js\":\"7vsUO\",\"./curve/catmullRomOpen.js\":\"gmFtf\",\"./curve/catmullRom.js\":\"9AIhm\",\"./curve/linearClosed.js\":\"iNV0m\",\"./curve/linear.js\":\"kDDgD\",\"./curve/monotone.js\":\"jALvT\",\"./curve/natural.js\":\"9Lzi3\",\"./curve/step.js\":\"1D7Gv\",\"./stack.js\":false,\"./offset/expand.js\":false,\"./offset/diverging.js\":false,\"./offset/none.js\":false,\"./offset/silhouette.js\":false,\"./offset/wiggle.js\":false,\"./order/appearance.js\":false,\"./order/ascending.js\":false,\"./order/descending.js\":false,\"./order/insideOut.js\":false,\"./order/none.js\":false,\"./order/reverse.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hBXaC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Path = require(\"d3-path\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _mathJs = require(\"./math.js\");\nfunction arcInnerRadius(d) {\n    return d.innerRadius;\n}\nfunction arcOuterRadius(d) {\n    return d.outerRadius;\n}\nfunction arcStartAngle(d) {\n    return d.startAngle;\n}\nfunction arcEndAngle(d) {\n    return d.endAngle;\n}\nfunction arcPadAngle(d) {\n    return d && d.padAngle; // Note: optional!\n}\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n    var x10 = x1 - x0, y10 = y1 - y0, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10;\n    if (t * t < (0, _mathJs.epsilon)) return;\n    t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n    return [\n        x0 + t * x10,\n        y0 + t * y10\n    ];\n}\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n    var x01 = x0 - x1, y01 = y0 - y1, lo = (cw ? rc : -rc) / (0, _mathJs.sqrt)(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x0 + ox, y11 = y0 + oy, x10 = x1 + ox, y10 = y1 + oy, x00 = (x11 + x10) / 2, y00 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * (0, _mathJs.sqrt)((0, _mathJs.max)(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x00, dy0 = cy0 - y00, dx1 = cx1 - x00, dy1 = cy1 - y00;\n    // Pick the closer of the two intersection points.\n    // TODO Is there a faster way to determine which intersection to use?\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return {\n        cx: cx0,\n        cy: cy0,\n        x01: -ox,\n        y01: -oy,\n        x11: cx0 * (r1 / r - 1),\n        y11: cy0 * (r1 / r - 1)\n    };\n}\nexports.default = function() {\n    var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = (0, _constantJsDefault.default)(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context = null;\n    function arc() {\n        var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - (0, _mathJs.halfPi), a1 = endAngle.apply(this, arguments) - (0, _mathJs.halfPi), da = (0, _mathJs.abs)(a1 - a0), cw = a1 > a0;\n        if (!context) context = buffer = (0, _d3Path.path)();\n        // Ensure that the outer radius is always larger than the inner radius.\n        if (r1 < r0) r = r1, r1 = r0, r0 = r;\n        // Is it a point?\n        if (!(r1 > (0, _mathJs.epsilon))) context.moveTo(0, 0);\n        else if (da > (0, _mathJs.tau) - (0, _mathJs.epsilon)) {\n            context.moveTo(r1 * (0, _mathJs.cos)(a0), r1 * (0, _mathJs.sin)(a0));\n            context.arc(0, 0, r1, a0, a1, !cw);\n            if (r0 > (0, _mathJs.epsilon)) {\n                context.moveTo(r0 * (0, _mathJs.cos)(a1), r0 * (0, _mathJs.sin)(a1));\n                context.arc(0, 0, r0, a1, a0, cw);\n            }\n        } else {\n            var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > (0, _mathJs.epsilon) && (padRadius ? +padRadius.apply(this, arguments) : (0, _mathJs.sqrt)(r0 * r0 + r1 * r1)), rc = (0, _mathJs.min)((0, _mathJs.abs)(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t0, t1;\n            // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n            if (rp > (0, _mathJs.epsilon)) {\n                var p0 = (0, _mathJs.asin)(rp / r0 * (0, _mathJs.sin)(ap)), p1 = (0, _mathJs.asin)(rp / r1 * (0, _mathJs.sin)(ap));\n                if ((da0 -= p0 * 2) > (0, _mathJs.epsilon)) p0 *= cw ? 1 : -1, a00 += p0, a10 -= p0;\n                else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n                if ((da1 -= p1 * 2) > (0, _mathJs.epsilon)) p1 *= cw ? 1 : -1, a01 += p1, a11 -= p1;\n                else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n            }\n            var x01 = r1 * (0, _mathJs.cos)(a01), y01 = r1 * (0, _mathJs.sin)(a01), x10 = r0 * (0, _mathJs.cos)(a10), y10 = r0 * (0, _mathJs.sin)(a10);\n            // Apply rounded corners?\n            if (rc > (0, _mathJs.epsilon)) {\n                var x11 = r1 * (0, _mathJs.cos)(a11), y11 = r1 * (0, _mathJs.sin)(a11), x00 = r0 * (0, _mathJs.cos)(a00), y00 = r0 * (0, _mathJs.sin)(a00), oc;\n                // Restrict the corner radius according to the sector angle.\n                if (da < (0, _mathJs.pi) && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n                    var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / (0, _mathJs.sin)((0, _mathJs.acos)((ax * bx + ay * by) / ((0, _mathJs.sqrt)(ax * ax + ay * ay) * (0, _mathJs.sqrt)(bx * bx + by * by))) / 2), lc = (0, _mathJs.sqrt)(oc[0] * oc[0] + oc[1] * oc[1]);\n                    rc0 = (0, _mathJs.min)(rc, (r0 - lc) / (kc - 1));\n                    rc1 = (0, _mathJs.min)(rc, (r1 - lc) / (kc + 1));\n                }\n            }\n            // Is the sector collapsed to a line?\n            if (!(da1 > (0, _mathJs.epsilon))) context.moveTo(x01, y01);\n            else if (rc1 > (0, _mathJs.epsilon)) {\n                t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n                t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n                context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n                // Have the corners merged?\n                if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, (0, _mathJs.atan2)(t0.y01, t0.x01), (0, _mathJs.atan2)(t1.y01, t1.x01), !cw);\n                else {\n                    context.arc(t0.cx, t0.cy, rc1, (0, _mathJs.atan2)(t0.y01, t0.x01), (0, _mathJs.atan2)(t0.y11, t0.x11), !cw);\n                    context.arc(0, 0, r1, (0, _mathJs.atan2)(t0.cy + t0.y11, t0.cx + t0.x11), (0, _mathJs.atan2)(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n                    context.arc(t1.cx, t1.cy, rc1, (0, _mathJs.atan2)(t1.y11, t1.x11), (0, _mathJs.atan2)(t1.y01, t1.x01), !cw);\n                }\n            } else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n            // Is there no inner ring, and it’s a circular sector?\n            // Or perhaps it’s an annular sector collapsed due to padding?\n            if (!(r0 > (0, _mathJs.epsilon)) || !(da0 > (0, _mathJs.epsilon))) context.lineTo(x10, y10);\n            else if (rc0 > (0, _mathJs.epsilon)) {\n                t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n                t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n                context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n                // Have the corners merged?\n                if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, (0, _mathJs.atan2)(t0.y01, t0.x01), (0, _mathJs.atan2)(t1.y01, t1.x01), !cw);\n                else {\n                    context.arc(t0.cx, t0.cy, rc0, (0, _mathJs.atan2)(t0.y01, t0.x01), (0, _mathJs.atan2)(t0.y11, t0.x11), !cw);\n                    context.arc(0, 0, r0, (0, _mathJs.atan2)(t0.cy + t0.y11, t0.cx + t0.x11), (0, _mathJs.atan2)(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n                    context.arc(t1.cx, t1.cy, rc0, (0, _mathJs.atan2)(t1.y11, t1.x11), (0, _mathJs.atan2)(t1.y01, t1.x01), !cw);\n                }\n            } else context.arc(0, 0, r0, a10, a00, cw);\n        }\n        context.closePath();\n        if (buffer) return context = null, buffer + \"\" || null;\n    }\n    arc.centroid = function() {\n        var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - (0, _mathJs.pi) / 2;\n        return [\n            (0, _mathJs.cos)(a) * r,\n            (0, _mathJs.sin)(a) * r\n        ];\n    };\n    arc.innerRadius = function(_) {\n        return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : innerRadius;\n    };\n    arc.outerRadius = function(_) {\n        return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : outerRadius;\n    };\n    arc.cornerRadius = function(_) {\n        return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : cornerRadius;\n    };\n    arc.padRadius = function(_) {\n        return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : padRadius;\n    };\n    arc.startAngle = function(_) {\n        return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : startAngle;\n    };\n    arc.endAngle = function(_) {\n        return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : endAngle;\n    };\n    arc.padAngle = function(_) {\n        return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : padAngle;\n    };\n    arc.context = function(_) {\n        return arguments.length ? (context = _ == null ? null : _, arc) : context;\n    };\n    return arc;\n};\n\n},{\"d3-path\":\"erNya\",\"./constant.js\":\"6fSWz\",\"./math.js\":\"fkq1E\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"erNya\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"path\", ()=>(0, _pathJsDefault.default));\nvar _pathJs = require(\"./path.js\");\nvar _pathJsDefault = parcelHelpers.interopDefault(_pathJs);\n\n},{\"./path.js\":\"kJpKL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kJpKL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nconst pi = Math.PI, tau = 2 * pi, epsilon = 1e-6, tauEpsilon = tau - epsilon;\nfunction Path() {\n    this._x0 = this._y0 = this._x1 = this._y1 = null; // end of current subpath\n    this._ = \"\";\n}\nfunction path() {\n    return new Path;\n}\nPath.prototype = path.prototype = {\n    constructor: Path,\n    moveTo: function(x, y) {\n        this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n    },\n    closePath: function() {\n        if (this._x1 !== null) {\n            this._x1 = this._x0, this._y1 = this._y0;\n            this._ += \"Z\";\n        }\n    },\n    lineTo: function(x, y) {\n        this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n    },\n    quadraticCurveTo: function(x1, y1, x, y) {\n        this._ += \"Q\" + +x1 + \",\" + +y1 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n    },\n    bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n        this._ += \"C\" + +x1 + \",\" + +y1 + \",\" + +x2 + \",\" + +y2 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n    },\n    arcTo: function(x1, y1, x2, y2, r) {\n        x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n        var x0 = this._x1, y0 = this._y1, x21 = x2 - x1, y21 = y2 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;\n        // Is the radius negative? Error.\n        if (r < 0) throw new Error(\"negative radius: \" + r);\n        // Is this path empty? Move to (x1,y1).\n        if (this._x1 === null) this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n        else if (!(l01_2 > epsilon)) ;\n        else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n        else {\n            var x20 = x2 - x0, y20 = y2 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;\n            // If the start tangent is not coincident with (x0,y0), line to.\n            if (Math.abs(t01 - 1) > epsilon) this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n            this._ += \"A\" + r + \",\" + r + \",0,0,\" + +(y01 * x20 > x01 * y20) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n        }\n    },\n    arc: function(x, y, r, a0, a1, ccw) {\n        x = +x, y = +y, r = +r, ccw = !!ccw;\n        var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x + dx, y0 = y + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;\n        // Is the radius negative? Error.\n        if (r < 0) throw new Error(\"negative radius: \" + r);\n        // Is this path empty? Move to (x0,y0).\n        if (this._x1 === null) this._ += \"M\" + x0 + \",\" + y0;\n        else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += \"L\" + x0 + \",\" + y0;\n        // Is this arc empty? We’re done.\n        if (!r) return;\n        // Does the angle go the wrong way? Flip the direction.\n        if (da < 0) da = da % tau + tau;\n        // Is this a complete circle? Draw two arcs to complete the circle.\n        if (da > tauEpsilon) this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n        else if (da > epsilon) this._ += \"A\" + r + \",\" + r + \",0,\" + +(da >= pi) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n    },\n    rect: function(x, y, w, h) {\n        this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + +w + \"v\" + +h + \"h\" + -w + \"Z\";\n    },\n    toString: function() {\n        return this._;\n    }\n};\nexports.default = path;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6fSWz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return function constant() {\n        return x;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fkq1E\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"abs\", ()=>abs);\nparcelHelpers.export(exports, \"atan2\", ()=>atan2);\nparcelHelpers.export(exports, \"cos\", ()=>cos);\nparcelHelpers.export(exports, \"max\", ()=>max);\nparcelHelpers.export(exports, \"min\", ()=>min);\nparcelHelpers.export(exports, \"sin\", ()=>sin);\nparcelHelpers.export(exports, \"sqrt\", ()=>sqrt);\nparcelHelpers.export(exports, \"epsilon\", ()=>epsilon);\nparcelHelpers.export(exports, \"pi\", ()=>pi);\nparcelHelpers.export(exports, \"halfPi\", ()=>halfPi);\nparcelHelpers.export(exports, \"tau\", ()=>tau);\nparcelHelpers.export(exports, \"acos\", ()=>acos);\nparcelHelpers.export(exports, \"asin\", ()=>asin);\nvar abs = Math.abs;\nvar atan2 = Math.atan2;\nvar cos = Math.cos;\nvar max = Math.max;\nvar min = Math.min;\nvar sin = Math.sin;\nvar sqrt = Math.sqrt;\nvar epsilon = 1e-12;\nvar pi = Math.PI;\nvar halfPi = pi / 2;\nvar tau = 2 * pi;\nfunction acos(x) {\n    return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\nfunction asin(x) {\n    return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7HGRc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Path = require(\"d3-path\");\nvar _arrayJs = require(\"./array.js\");\nvar _arrayJsDefault = parcelHelpers.interopDefault(_arrayJs);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _linearJs = require(\"./curve/linear.js\");\nvar _linearJsDefault = parcelHelpers.interopDefault(_linearJs);\nvar _lineJs = require(\"./line.js\");\nvar _lineJsDefault = parcelHelpers.interopDefault(_lineJs);\nvar _pointJs = require(\"./point.js\");\nexports.default = function(x0, y0, y1) {\n    var x1 = null, defined = (0, _constantJsDefault.default)(true), context = null, curve = (0, _linearJsDefault.default), output = null;\n    x0 = typeof x0 === \"function\" ? x0 : x0 === undefined ? (0, _pointJs.x) : (0, _constantJsDefault.default)(+x0);\n    y0 = typeof y0 === \"function\" ? y0 : y0 === undefined ? (0, _constantJsDefault.default)(0) : (0, _constantJsDefault.default)(+y0);\n    y1 = typeof y1 === \"function\" ? y1 : y1 === undefined ? (0, _pointJs.y) : (0, _constantJsDefault.default)(+y1);\n    function area(data) {\n        var i, j, k, n = (data = (0, _arrayJsDefault.default)(data)).length, d, defined0 = false, buffer, x0z = new Array(n), y0z = new Array(n);\n        if (context == null) output = curve(buffer = (0, _d3Path.path)());\n        for(i = 0; i <= n; ++i){\n            if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n                if (defined0 = !defined0) {\n                    j = i;\n                    output.areaStart();\n                    output.lineStart();\n                } else {\n                    output.lineEnd();\n                    output.lineStart();\n                    for(k = i - 1; k >= j; --k)output.point(x0z[k], y0z[k]);\n                    output.lineEnd();\n                    output.areaEnd();\n                }\n            }\n            if (defined0) {\n                x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n                output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n            }\n        }\n        if (buffer) return output = null, buffer + \"\" || null;\n    }\n    function arealine() {\n        return (0, _lineJsDefault.default)().defined(defined).curve(curve).context(context);\n    }\n    area.x = function(_) {\n        return arguments.length ? (x0 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), x1 = null, area) : x0;\n    };\n    area.x0 = function(_) {\n        return arguments.length ? (x0 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), area) : x0;\n    };\n    area.x1 = function(_) {\n        return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), area) : x1;\n    };\n    area.y = function(_) {\n        return arguments.length ? (y0 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), y1 = null, area) : y0;\n    };\n    area.y0 = function(_) {\n        return arguments.length ? (y0 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), area) : y0;\n    };\n    area.y1 = function(_) {\n        return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), area) : y1;\n    };\n    area.lineX0 = area.lineY0 = function() {\n        return arealine().x(x0).y(y0);\n    };\n    area.lineY1 = function() {\n        return arealine().x(x0).y(y1);\n    };\n    area.lineX1 = function() {\n        return arealine().x(x1).y(y0);\n    };\n    area.defined = function(_) {\n        return arguments.length ? (defined = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(!!_), area) : defined;\n    };\n    area.curve = function(_) {\n        return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n    };\n    area.context = function(_) {\n        return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n    };\n    return area;\n};\n\n},{\"d3-path\":\"erNya\",\"./array.js\":\"7SE13\",\"./constant.js\":\"6fSWz\",\"./curve/linear.js\":\"kDDgD\",\"./line.js\":\"iTpSu\",\"./point.js\":\"ejXdh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7SE13\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"slice\", ()=>slice);\nvar slice = Array.prototype.slice;\nexports.default = function(x) {\n    return typeof x === \"object\" && \"length\" in x ? x // Array, TypedArray, NodeList, array-like\n     : Array.from(x); // Map, Set, iterable, string, or anything else\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kDDgD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction Linear(context) {\n    this._context = context;\n}\nLinear.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2; // proceed\n            default:\n                this._context.lineTo(x, y);\n                break;\n        }\n    }\n};\nexports.default = function(context) {\n    return new Linear(context);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iTpSu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Path = require(\"d3-path\");\nvar _arrayJs = require(\"./array.js\");\nvar _arrayJsDefault = parcelHelpers.interopDefault(_arrayJs);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _linearJs = require(\"./curve/linear.js\");\nvar _linearJsDefault = parcelHelpers.interopDefault(_linearJs);\nvar _pointJs = require(\"./point.js\");\nexports.default = function(x, y) {\n    var defined = (0, _constantJsDefault.default)(true), context = null, curve = (0, _linearJsDefault.default), output = null;\n    x = typeof x === \"function\" ? x : x === undefined ? (0, _pointJs.x) : (0, _constantJsDefault.default)(x);\n    y = typeof y === \"function\" ? y : y === undefined ? (0, _pointJs.y) : (0, _constantJsDefault.default)(y);\n    function line(data) {\n        var i, n = (data = (0, _arrayJsDefault.default)(data)).length, d, defined0 = false, buffer;\n        if (context == null) output = curve(buffer = (0, _d3Path.path)());\n        for(i = 0; i <= n; ++i){\n            if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n                if (defined0 = !defined0) output.lineStart();\n                else output.lineEnd();\n            }\n            if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n        }\n        if (buffer) return output = null, buffer + \"\" || null;\n    }\n    line.x = function(_) {\n        return arguments.length ? (x = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), line) : x;\n    };\n    line.y = function(_) {\n        return arguments.length ? (y = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), line) : y;\n    };\n    line.defined = function(_) {\n        return arguments.length ? (defined = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(!!_), line) : defined;\n    };\n    line.curve = function(_) {\n        return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n    };\n    line.context = function(_) {\n        return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n    };\n    return line;\n};\n\n},{\"d3-path\":\"erNya\",\"./array.js\":\"7SE13\",\"./constant.js\":\"6fSWz\",\"./curve/linear.js\":\"kDDgD\",\"./point.js\":\"ejXdh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ejXdh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"x\", ()=>x);\nparcelHelpers.export(exports, \"y\", ()=>y);\nfunction x(p) {\n    return p[0];\n}\nfunction y(p) {\n    return p[1];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6wXmG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"symbols\", ()=>symbols);\nvar _d3Path = require(\"d3-path\");\nvar _circleJs = require(\"./symbol/circle.js\");\nvar _circleJsDefault = parcelHelpers.interopDefault(_circleJs);\nvar _crossJs = require(\"./symbol/cross.js\");\nvar _crossJsDefault = parcelHelpers.interopDefault(_crossJs);\nvar _diamondJs = require(\"./symbol/diamond.js\");\nvar _diamondJsDefault = parcelHelpers.interopDefault(_diamondJs);\nvar _starJs = require(\"./symbol/star.js\");\nvar _starJsDefault = parcelHelpers.interopDefault(_starJs);\nvar _squareJs = require(\"./symbol/square.js\");\nvar _squareJsDefault = parcelHelpers.interopDefault(_squareJs);\nvar _triangleJs = require(\"./symbol/triangle.js\");\nvar _triangleJsDefault = parcelHelpers.interopDefault(_triangleJs);\nvar _wyeJs = require(\"./symbol/wye.js\");\nvar _wyeJsDefault = parcelHelpers.interopDefault(_wyeJs);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar symbols = [\n    (0, _circleJsDefault.default),\n    (0, _crossJsDefault.default),\n    (0, _diamondJsDefault.default),\n    (0, _squareJsDefault.default),\n    (0, _starJsDefault.default),\n    (0, _triangleJsDefault.default),\n    (0, _wyeJsDefault.default)\n];\nexports.default = function(type, size) {\n    var context = null;\n    type = typeof type === \"function\" ? type : (0, _constantJsDefault.default)(type || (0, _circleJsDefault.default));\n    size = typeof size === \"function\" ? size : (0, _constantJsDefault.default)(size === undefined ? 64 : +size);\n    function symbol() {\n        var buffer;\n        if (!context) context = buffer = (0, _d3Path.path)();\n        type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n        if (buffer) return context = null, buffer + \"\" || null;\n    }\n    symbol.type = function(_) {\n        return arguments.length ? (type = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(_), symbol) : type;\n    };\n    symbol.size = function(_) {\n        return arguments.length ? (size = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), symbol) : size;\n    };\n    symbol.context = function(_) {\n        return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n    };\n    return symbol;\n};\n\n},{\"d3-path\":\"erNya\",\"./symbol/circle.js\":\"9G0bU\",\"./symbol/cross.js\":\"3dJnN\",\"./symbol/diamond.js\":\"O6MwS\",\"./symbol/star.js\":\"4OIBI\",\"./symbol/square.js\":\"llhtb\",\"./symbol/triangle.js\":\"bcE3R\",\"./symbol/wye.js\":\"ceglC\",\"./constant.js\":\"6fSWz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9G0bU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nexports.default = {\n    draw: function(context, size) {\n        var r = Math.sqrt(size / (0, _mathJs.pi));\n        context.moveTo(r, 0);\n        context.arc(0, 0, r, 0, (0, _mathJs.tau));\n    }\n};\n\n},{\"../math.js\":\"fkq1E\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3dJnN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = {\n    draw: function(context, size) {\n        var r = Math.sqrt(size / 5) / 2;\n        context.moveTo(-3 * r, -r);\n        context.lineTo(-r, -r);\n        context.lineTo(-r, -3 * r);\n        context.lineTo(r, -3 * r);\n        context.lineTo(r, -r);\n        context.lineTo(3 * r, -r);\n        context.lineTo(3 * r, r);\n        context.lineTo(r, r);\n        context.lineTo(r, 3 * r);\n        context.lineTo(-r, 3 * r);\n        context.lineTo(-r, r);\n        context.lineTo(-3 * r, r);\n        context.closePath();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"O6MwS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar tan30 = Math.sqrt(1 / 3), tan30_2 = tan30 * 2;\nexports.default = {\n    draw: function(context, size) {\n        var y = Math.sqrt(size / tan30_2), x = y * tan30;\n        context.moveTo(0, -y);\n        context.lineTo(x, 0);\n        context.lineTo(0, y);\n        context.lineTo(-x, 0);\n        context.closePath();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4OIBI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nvar ka = 0.89081309152928522810, kr = Math.sin((0, _mathJs.pi) / 10) / Math.sin(7 * (0, _mathJs.pi) / 10), kx = Math.sin((0, _mathJs.tau) / 10) * kr, ky = -Math.cos((0, _mathJs.tau) / 10) * kr;\nexports.default = {\n    draw: function(context, size) {\n        var r = Math.sqrt(size * ka), x = kx * r, y = ky * r;\n        context.moveTo(0, -r);\n        context.lineTo(x, y);\n        for(var i = 1; i < 5; ++i){\n            var a = (0, _mathJs.tau) * i / 5, c = Math.cos(a), s = Math.sin(a);\n            context.lineTo(s * r, -c * r);\n            context.lineTo(c * x - s * y, s * x + c * y);\n        }\n        context.closePath();\n    }\n};\n\n},{\"../math.js\":\"fkq1E\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"llhtb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = {\n    draw: function(context, size) {\n        var w = Math.sqrt(size), x = -w / 2;\n        context.rect(x, x, w, w);\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bcE3R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar sqrt3 = Math.sqrt(3);\nexports.default = {\n    draw: function(context, size) {\n        var y = -Math.sqrt(size / (sqrt3 * 3));\n        context.moveTo(0, y * 2);\n        context.lineTo(-sqrt3 * y, -y);\n        context.lineTo(sqrt3 * y, -y);\n        context.closePath();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ceglC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar c = -0.5, s = Math.sqrt(3) / 2, k = 1 / Math.sqrt(12), a = (k / 2 + 1) * 3;\nexports.default = {\n    draw: function(context, size) {\n        var r = Math.sqrt(size / a), x0 = r / 2, y0 = r * k, x1 = x0, y1 = r * k + r, x2 = -x1, y2 = y1;\n        context.moveTo(x0, y0);\n        context.lineTo(x1, y1);\n        context.lineTo(x2, y2);\n        context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n        context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n        context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n        context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n        context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n        context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n        context.closePath();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"LU7y1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _basisJs = require(\"./basis.js\");\nfunction BasisClosed(context) {\n    this._context = context;\n}\nBasisClosed.prototype = {\n    areaStart: (0, _noopJsDefault.default),\n    areaEnd: (0, _noopJsDefault.default),\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 1:\n                this._context.moveTo(this._x2, this._y2);\n                this._context.closePath();\n                break;\n            case 2:\n                this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n                this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n                this._context.closePath();\n                break;\n            case 3:\n                this.point(this._x2, this._y2);\n                this.point(this._x3, this._y3);\n                this.point(this._x4, this._y4);\n                break;\n        }\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._x2 = x, this._y2 = y;\n                break;\n            case 1:\n                this._point = 2;\n                this._x3 = x, this._y3 = y;\n                break;\n            case 2:\n                this._point = 3;\n                this._x4 = x, this._y4 = y;\n                this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6);\n                break;\n            default:\n                (0, _basisJs.point)(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = x;\n        this._y0 = this._y1, this._y1 = y;\n    }\n};\nexports.default = function(context) {\n    return new BasisClosed(context);\n};\n\n},{\"../noop.js\":\"l9aRi\",\"./basis.js\":\"fxwIG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l9aRi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fxwIG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"point\", ()=>point);\nparcelHelpers.export(exports, \"Basis\", ()=>Basis);\nfunction point(that, x, y) {\n    that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x) / 6, (that._y0 + 4 * that._y1 + y) / 6);\n}\nfunction Basis(context) {\n    this._context = context;\n}\nBasis.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 3:\n                point(this, this._x1, this._y1); // proceed\n            case 2:\n                this._context.lineTo(this._x1, this._y1);\n                break;\n        }\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n            default:\n                point(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = x;\n        this._y0 = this._y1, this._y1 = y;\n    }\n};\nexports.default = function(context) {\n    return new Basis(context);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iUFcz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _basisJs = require(\"./basis.js\");\nfunction BasisOpen(context) {\n    this._context = context;\n}\nBasisOpen.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6;\n                this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0);\n                break;\n            case 3:\n                this._point = 4; // proceed\n            default:\n                (0, _basisJs.point)(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = x;\n        this._y0 = this._y1, this._y1 = y;\n    }\n};\nexports.default = function(context) {\n    return new BasisOpen(context);\n};\n\n},{\"./basis.js\":\"fxwIG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1IdIu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _basisJs = require(\"./basis.js\");\nfunction Bundle(context, beta) {\n    this._basis = new (0, _basisJs.Basis)(context);\n    this._beta = beta;\n}\nBundle.prototype = {\n    lineStart: function() {\n        this._x = [];\n        this._y = [];\n        this._basis.lineStart();\n    },\n    lineEnd: function() {\n        var x = this._x, y = this._y, j = x.length - 1;\n        if (j > 0) {\n            var x0 = x[0], y0 = y[0], dx = x[j] - x0, dy = y[j] - y0, i = -1, t;\n            while(++i <= j){\n                t = i / j;\n                this._basis.point(this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y[i] + (1 - this._beta) * (y0 + t * dy));\n            }\n        }\n        this._x = this._y = null;\n        this._basis.lineEnd();\n    },\n    point: function(x, y) {\n        this._x.push(+x);\n        this._y.push(+y);\n    }\n};\nexports.default = function custom(beta1) {\n    function bundle(context) {\n        return beta1 === 1 ? new (0, _basisJs.Basis)(context) : new Bundle(context, beta1);\n    }\n    bundle.beta = function(beta) {\n        return custom(+beta);\n    };\n    return bundle;\n}(0.85);\n\n},{\"./basis.js\":\"fxwIG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i9B3n\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CardinalClosed\", ()=>CardinalClosed);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _cardinalJs = require(\"./cardinal.js\");\nfunction CardinalClosed(context, tension) {\n    this._context = context;\n    this._k = (1 - tension) / 6;\n}\nCardinalClosed.prototype = {\n    areaStart: (0, _noopJsDefault.default),\n    areaEnd: (0, _noopJsDefault.default),\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 1:\n                this._context.moveTo(this._x3, this._y3);\n                this._context.closePath();\n                break;\n            case 2:\n                this._context.lineTo(this._x3, this._y3);\n                this._context.closePath();\n                break;\n            case 3:\n                this.point(this._x3, this._y3);\n                this.point(this._x4, this._y4);\n                this.point(this._x5, this._y5);\n                break;\n        }\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._x3 = x, this._y3 = y;\n                break;\n            case 1:\n                this._point = 2;\n                this._context.moveTo(this._x4 = x, this._y4 = y);\n                break;\n            case 2:\n                this._point = 3;\n                this._x5 = x, this._y5 = y;\n                break;\n            default:\n                (0, _cardinalJs.point)(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(tension1) {\n    function cardinal(context) {\n        return new CardinalClosed(context, tension1);\n    }\n    cardinal.tension = function(tension) {\n        return custom(+tension);\n    };\n    return cardinal;\n}(0);\n\n},{\"../noop.js\":\"l9aRi\",\"./cardinal.js\":\"jFqTA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jFqTA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"point\", ()=>point);\nparcelHelpers.export(exports, \"Cardinal\", ()=>Cardinal);\nfunction point(that, x, y) {\n    that._context.bezierCurveTo(that._x1 + that._k * (that._x2 - that._x0), that._y1 + that._k * (that._y2 - that._y0), that._x2 + that._k * (that._x1 - x), that._y2 + that._k * (that._y1 - y), that._x2, that._y2);\n}\nfunction Cardinal(context, tension) {\n    this._context = context;\n    this._k = (1 - tension) / 6;\n}\nCardinal.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 2:\n                this._context.lineTo(this._x2, this._y2);\n                break;\n            case 3:\n                point(this, this._x1, this._y1);\n                break;\n        }\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2;\n                this._x1 = x, this._y1 = y;\n                break;\n            case 2:\n                this._point = 3; // proceed\n            default:\n                point(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(tension1) {\n    function cardinal(context) {\n        return new Cardinal(context, tension1);\n    }\n    cardinal.tension = function(tension) {\n        return custom(+tension);\n    };\n    return cardinal;\n}(0);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"feING\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CardinalOpen\", ()=>CardinalOpen);\nvar _cardinalJs = require(\"./cardinal.js\");\nfunction CardinalOpen(context, tension) {\n    this._context = context;\n    this._k = (1 - tension) / 6;\n}\nCardinalOpen.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n                break;\n            case 3:\n                this._point = 4; // proceed\n            default:\n                (0, _cardinalJs.point)(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(tension1) {\n    function cardinal(context) {\n        return new CardinalOpen(context, tension1);\n    }\n    cardinal.tension = function(tension) {\n        return custom(+tension);\n    };\n    return cardinal;\n}(0);\n\n},{\"./cardinal.js\":\"jFqTA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7vsUO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _cardinalClosedJs = require(\"./cardinalClosed.js\");\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _catmullRomJs = require(\"./catmullRom.js\");\nfunction CatmullRomClosed(context, alpha) {\n    this._context = context;\n    this._alpha = alpha;\n}\nCatmullRomClosed.prototype = {\n    areaStart: (0, _noopJsDefault.default),\n    areaEnd: (0, _noopJsDefault.default),\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n        this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 1:\n                this._context.moveTo(this._x3, this._y3);\n                this._context.closePath();\n                break;\n            case 2:\n                this._context.lineTo(this._x3, this._y3);\n                this._context.closePath();\n                break;\n            case 3:\n                this.point(this._x3, this._y3);\n                this.point(this._x4, this._y4);\n                this.point(this._x5, this._y5);\n                break;\n        }\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        if (this._point) {\n            var x23 = this._x2 - x, y23 = this._y2 - y;\n            this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n        }\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._x3 = x, this._y3 = y;\n                break;\n            case 1:\n                this._point = 2;\n                this._context.moveTo(this._x4 = x, this._y4 = y);\n                break;\n            case 2:\n                this._point = 3;\n                this._x5 = x, this._y5 = y;\n                break;\n            default:\n                (0, _catmullRomJs.point)(this, x, y);\n                break;\n        }\n        this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n        this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(alpha1) {\n    function catmullRom(context) {\n        return alpha1 ? new CatmullRomClosed(context, alpha1) : new (0, _cardinalClosedJs.CardinalClosed)(context, 0);\n    }\n    catmullRom.alpha = function(alpha) {\n        return custom(+alpha);\n    };\n    return catmullRom;\n}(0.5);\n\n},{\"./cardinalClosed.js\":\"i9B3n\",\"../noop.js\":\"l9aRi\",\"./catmullRom.js\":\"9AIhm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9AIhm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"point\", ()=>point);\nvar _mathJs = require(\"../math.js\");\nvar _cardinalJs = require(\"./cardinal.js\");\nfunction point(that, x, y) {\n    var x1 = that._x1, y1 = that._y1, x2 = that._x2, y2 = that._y2;\n    if (that._l01_a > (0, _mathJs.epsilon)) {\n        var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n        x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n        y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n    }\n    if (that._l23_a > (0, _mathJs.epsilon)) {\n        var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n        x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n        y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n    }\n    that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\nfunction CatmullRom(context, alpha) {\n    this._context = context;\n    this._alpha = alpha;\n}\nCatmullRom.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n        this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 2:\n                this._context.lineTo(this._x2, this._y2);\n                break;\n            case 3:\n                this.point(this._x2, this._y2);\n                break;\n        }\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        if (this._point) {\n            var x23 = this._x2 - x, y23 = this._y2 - y;\n            this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n        }\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3; // proceed\n            default:\n                point(this, x, y);\n                break;\n        }\n        this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n        this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(alpha1) {\n    function catmullRom(context) {\n        return alpha1 ? new CatmullRom(context, alpha1) : new (0, _cardinalJs.Cardinal)(context, 0);\n    }\n    catmullRom.alpha = function(alpha) {\n        return custom(+alpha);\n    };\n    return catmullRom;\n}(0.5);\n\n},{\"../math.js\":\"fkq1E\",\"./cardinal.js\":\"jFqTA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gmFtf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _cardinalOpenJs = require(\"./cardinalOpen.js\");\nvar _catmullRomJs = require(\"./catmullRom.js\");\nfunction CatmullRomOpen(context, alpha) {\n    this._context = context;\n    this._alpha = alpha;\n}\nCatmullRomOpen.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n        this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        if (this._point) {\n            var x23 = this._x2 - x, y23 = this._y2 - y;\n            this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n        }\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n                break;\n            case 3:\n                this._point = 4; // proceed\n            default:\n                (0, _catmullRomJs.point)(this, x, y);\n                break;\n        }\n        this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n        this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(alpha1) {\n    function catmullRom(context) {\n        return alpha1 ? new CatmullRomOpen(context, alpha1) : new (0, _cardinalOpenJs.CardinalOpen)(context, 0);\n    }\n    catmullRom.alpha = function(alpha) {\n        return custom(+alpha);\n    };\n    return catmullRom;\n}(0.5);\n\n},{\"./cardinalOpen.js\":\"feING\",\"./catmullRom.js\":\"9AIhm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iNV0m\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nfunction LinearClosed(context) {\n    this._context = context;\n}\nLinearClosed.prototype = {\n    areaStart: (0, _noopJsDefault.default),\n    areaEnd: (0, _noopJsDefault.default),\n    lineStart: function() {\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._point) this._context.closePath();\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        if (this._point) this._context.lineTo(x, y);\n        else this._point = 1, this._context.moveTo(x, y);\n    }\n};\nexports.default = function(context) {\n    return new LinearClosed(context);\n};\n\n},{\"../noop.js\":\"l9aRi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jALvT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"monotoneX\", ()=>monotoneX);\nparcelHelpers.export(exports, \"monotoneY\", ()=>monotoneY);\nfunction sign(x) {\n    return x < 0 ? -1 : 1;\n}\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n    var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);\n    return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n    var h = that._x1 - that._x0;\n    return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n    var x0 = that._x0, y0 = that._y0, x1 = that._x1, y1 = that._y1, dx = (x1 - x0) / 3;\n    that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\nfunction MonotoneX(context) {\n    this._context = context;\n}\nMonotoneX.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 2:\n                this._context.lineTo(this._x1, this._y1);\n                break;\n            case 3:\n                point(this, this._t0, slope2(this, this._t0));\n                break;\n        }\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        var t1 = NaN;\n        x = +x, y = +y;\n        if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                point(this, slope2(this, t1 = slope3(this, x, y)), t1);\n                break;\n            default:\n                point(this, this._t0, t1 = slope3(this, x, y));\n                break;\n        }\n        this._x0 = this._x1, this._x1 = x;\n        this._y0 = this._y1, this._y1 = y;\n        this._t0 = t1;\n    }\n};\nfunction MonotoneY(context) {\n    this._context = new ReflectContext(context);\n}\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n    MonotoneX.prototype.point.call(this, y, x);\n};\nfunction ReflectContext(context) {\n    this._context = context;\n}\nReflectContext.prototype = {\n    moveTo: function(x, y) {\n        this._context.moveTo(y, x);\n    },\n    closePath: function() {\n        this._context.closePath();\n    },\n    lineTo: function(x, y) {\n        this._context.lineTo(y, x);\n    },\n    bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n        this._context.bezierCurveTo(y1, x1, y2, x2, y, x);\n    }\n};\nfunction monotoneX(context) {\n    return new MonotoneX(context);\n}\nfunction monotoneY(context) {\n    return new MonotoneY(context);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Lzi3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction Natural(context) {\n    this._context = context;\n}\nNatural.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x = [];\n        this._y = [];\n    },\n    lineEnd: function() {\n        var x = this._x, y = this._y, n = x.length;\n        if (n) {\n            this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n            if (n === 2) this._context.lineTo(x[1], y[1]);\n            else {\n                var px = controlPoints(x), py = controlPoints(y);\n                for(var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1)this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n            }\n        }\n        if (this._line || this._line !== 0 && n === 1) this._context.closePath();\n        this._line = 1 - this._line;\n        this._x = this._y = null;\n    },\n    point: function(x, y) {\n        this._x.push(+x);\n        this._y.push(+y);\n    }\n};\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n    var i, n = x.length - 1, m, a = new Array(n), b = new Array(n), r = new Array(n);\n    a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n    for(i = 1; i < n - 1; ++i)a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n    a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n    for(i = 1; i < n; ++i)m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n    a[n - 1] = r[n - 1] / b[n - 1];\n    for(i = n - 2; i >= 0; --i)a[i] = (r[i] - a[i + 1]) / b[i];\n    b[n - 1] = (x[n] + a[n - 1]) / 2;\n    for(i = 0; i < n - 1; ++i)b[i] = 2 * x[i + 1] - a[i + 1];\n    return [\n        a,\n        b\n    ];\n}\nexports.default = function(context) {\n    return new Natural(context);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1D7Gv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"stepBefore\", ()=>stepBefore);\nparcelHelpers.export(exports, \"stepAfter\", ()=>stepAfter);\nfunction Step(context, t) {\n    this._context = context;\n    this._t = t;\n}\nStep.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x = this._y = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2; // proceed\n            default:\n                if (this._t <= 0) {\n                    this._context.lineTo(this._x, y);\n                    this._context.lineTo(x, y);\n                } else {\n                    var x1 = this._x * (1 - this._t) + x * this._t;\n                    this._context.lineTo(x1, this._y);\n                    this._context.lineTo(x1, y);\n                }\n                break;\n        }\n        this._x = x, this._y = y;\n    }\n};\nexports.default = function(context) {\n    return new Step(context, 0.5);\n};\nfunction stepBefore(context) {\n    return new Step(context, 0);\n}\nfunction stepAfter(context) {\n    return new Step(context, 1);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7F0ce\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"domCanvas\", ()=>(0, _domCanvas.domCanvas));\nparcelHelpers.export(exports, \"canvas\", ()=>(0, _domCanvas.domCanvas));\nparcelHelpers.export(exports, \"image\", ()=>(0, _domCanvas.domImage));\nvar _domCanvas = require(\"./src/domCanvas\");\n\n},{\"./src/domCanvas\":\"khrrB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"khrrB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"domCanvas\", ()=>domCanvas);\nparcelHelpers.export(exports, \"domImage\", ()=>domImage);\nfunction domCanvas(w, h) {\n    if (typeof document !== \"undefined\" && document.createElement) {\n        const c = document.createElement(\"canvas\");\n        if (c && c.getContext) {\n            c.width = w;\n            c.height = h;\n            return c;\n        }\n    }\n    return null;\n}\nconst domImage = ()=>typeof Image !== \"undefined\" ? Image : null;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"evQIv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"scaleImplicit\", ()=>(0, _d3Scale.scaleImplicit));\nparcelHelpers.export(exports, \"Band\", ()=>Band);\nparcelHelpers.export(exports, \"BinOrdinal\", ()=>BinOrdinal);\nparcelHelpers.export(exports, \"DiscreteLegend\", ()=>DiscreteLegend);\nparcelHelpers.export(exports, \"Diverging\", ()=>Diverging);\nparcelHelpers.export(exports, \"GradientLegend\", ()=>GradientLegend);\nparcelHelpers.export(exports, \"Identity\", ()=>Identity);\nparcelHelpers.export(exports, \"Linear\", ()=>Linear);\nparcelHelpers.export(exports, \"Log\", ()=>Log);\nparcelHelpers.export(exports, \"Ordinal\", ()=>Ordinal);\nparcelHelpers.export(exports, \"Point\", ()=>Point);\nparcelHelpers.export(exports, \"Pow\", ()=>Pow);\nparcelHelpers.export(exports, \"Quantile\", ()=>Quantile);\nparcelHelpers.export(exports, \"Quantize\", ()=>Quantize);\nparcelHelpers.export(exports, \"Sequential\", ()=>Sequential);\nparcelHelpers.export(exports, \"Sqrt\", ()=>Sqrt);\nparcelHelpers.export(exports, \"SymbolLegend\", ()=>SymbolLegend);\nparcelHelpers.export(exports, \"Symlog\", ()=>Symlog);\nparcelHelpers.export(exports, \"Threshold\", ()=>Threshold);\nparcelHelpers.export(exports, \"Time\", ()=>Time);\nparcelHelpers.export(exports, \"UTC\", ()=>UTC);\nparcelHelpers.export(exports, \"bandSpace\", ()=>bandSpace);\nparcelHelpers.export(exports, \"domainCaption\", ()=>domainCaption);\nparcelHelpers.export(exports, \"interpolate\", ()=>interpolate);\nparcelHelpers.export(exports, \"interpolateColors\", ()=>interpolateColors);\nparcelHelpers.export(exports, \"interpolateRange\", ()=>interpolateRange);\nparcelHelpers.export(exports, \"isContinuous\", ()=>isContinuous);\nparcelHelpers.export(exports, \"isDiscrete\", ()=>isDiscrete);\nparcelHelpers.export(exports, \"isDiscretizing\", ()=>isDiscretizing);\nparcelHelpers.export(exports, \"isInterpolating\", ()=>isInterpolating);\nparcelHelpers.export(exports, \"isLogarithmic\", ()=>isLogarithmic);\nparcelHelpers.export(exports, \"isQuantile\", ()=>isQuantile);\nparcelHelpers.export(exports, \"isTemporal\", ()=>isTemporal);\nparcelHelpers.export(exports, \"isValidScaleType\", ()=>isValidScaleType);\nparcelHelpers.export(exports, \"labelFormat\", ()=>labelFormat);\nparcelHelpers.export(exports, \"labelFraction\", ()=>labelFraction);\nparcelHelpers.export(exports, \"labelValues\", ()=>labelValues);\nparcelHelpers.export(exports, \"quantizeInterpolator\", ()=>quantizeInterpolator);\nparcelHelpers.export(exports, \"scale\", ()=>scale);\nparcelHelpers.export(exports, \"scaleCopy\", ()=>scaleCopy);\nparcelHelpers.export(exports, \"scaleFraction\", ()=>scaleFraction);\nparcelHelpers.export(exports, \"scheme\", ()=>scheme);\nparcelHelpers.export(exports, \"tickCount\", ()=>tickCount);\nparcelHelpers.export(exports, \"tickFormat\", ()=>tickFormat);\nparcelHelpers.export(exports, \"tickValues\", ()=>tickValues);\nparcelHelpers.export(exports, \"validTicks\", ()=>validTicks);\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Array = require(\"d3-array\");\nvar _d3Scale = require(\"d3-scale\");\nvar _d3Interpolate = require(\"d3-interpolate\");\nvar _vegaTime = require(\"vega-time\");\nfunction bandSpace(count, paddingInner, paddingOuter) {\n    const space = count - paddingInner + paddingOuter * 2;\n    return count ? space > 0 ? space : 1 : 0;\n}\nconst Identity = \"identity\";\nconst Linear = \"linear\";\nconst Log = \"log\";\nconst Pow = \"pow\";\nconst Sqrt = \"sqrt\";\nconst Symlog = \"symlog\";\nconst Time = \"time\";\nconst UTC = \"utc\";\nconst Sequential = \"sequential\";\nconst Diverging = \"diverging\";\nconst Quantile = \"quantile\";\nconst Quantize = \"quantize\";\nconst Threshold = \"threshold\";\nconst Ordinal = \"ordinal\";\nconst Point = \"point\";\nconst Band = \"band\";\nconst BinOrdinal = \"bin-ordinal\"; // categories\nconst Continuous = \"continuous\";\nconst Discrete = \"discrete\";\nconst Discretizing = \"discretizing\";\nconst Interpolating = \"interpolating\";\nconst Temporal = \"temporal\";\nfunction invertRange(scale1) {\n    return function(_) {\n        let lo = _[0], hi = _[1], t;\n        if (hi < lo) {\n            t = lo;\n            lo = hi;\n            hi = t;\n        }\n        return [\n            scale1.invert(lo),\n            scale1.invert(hi)\n        ];\n    };\n}\nfunction invertRangeExtent(scale2) {\n    return function(_) {\n        const range = scale2.range();\n        let lo = _[0], hi = _[1], min = -1, max, t, i, n;\n        if (hi < lo) {\n            t = lo;\n            lo = hi;\n            hi = t;\n        }\n        for(i = 0, n = range.length; i < n; ++i)if (range[i] >= lo && range[i] <= hi) {\n            if (min < 0) min = i;\n            max = i;\n        }\n        if (min < 0) return undefined;\n        lo = scale2.invertExtent(range[min]);\n        hi = scale2.invertExtent(range[max]);\n        return [\n            lo[0] === undefined ? lo[1] : lo[0],\n            hi[1] === undefined ? hi[0] : hi[1]\n        ];\n    };\n}\nfunction band() {\n    const scale3 = (0, _d3Scale.scaleOrdinal)().unknown(undefined), domain = scale3.domain, ordinalRange = scale3.range;\n    let range$1 = [\n        0,\n        1\n    ], step, bandwidth, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5;\n    delete scale3.unknown;\n    function rescale() {\n        const n = domain().length, reverse = range$1[1] < range$1[0], stop = range$1[1 - reverse], space = bandSpace(n, paddingInner, paddingOuter);\n        let start = range$1[reverse - 0];\n        step = (stop - start) / (space || 1);\n        if (round) step = Math.floor(step);\n        start += (stop - start - step * (n - paddingInner)) * align;\n        bandwidth = step * (1 - paddingInner);\n        if (round) {\n            start = Math.round(start);\n            bandwidth = Math.round(bandwidth);\n        }\n        const values = (0, _d3Array.range)(n).map((i)=>start + step * i);\n        return ordinalRange(reverse ? values.reverse() : values);\n    }\n    scale3.domain = function(_) {\n        if (arguments.length) {\n            domain(_);\n            return rescale();\n        } else return domain();\n    };\n    scale3.range = function(_) {\n        if (arguments.length) {\n            range$1 = [\n                +_[0],\n                +_[1]\n            ];\n            return rescale();\n        } else return range$1.slice();\n    };\n    scale3.rangeRound = function(_) {\n        range$1 = [\n            +_[0],\n            +_[1]\n        ];\n        round = true;\n        return rescale();\n    };\n    scale3.bandwidth = function() {\n        return bandwidth;\n    };\n    scale3.step = function() {\n        return step;\n    };\n    scale3.round = function(_) {\n        if (arguments.length) {\n            round = !!_;\n            return rescale();\n        } else return round;\n    };\n    scale3.padding = function(_) {\n        if (arguments.length) {\n            paddingOuter = Math.max(0, Math.min(1, _));\n            paddingInner = paddingOuter;\n            return rescale();\n        } else return paddingInner;\n    };\n    scale3.paddingInner = function(_) {\n        if (arguments.length) {\n            paddingInner = Math.max(0, Math.min(1, _));\n            return rescale();\n        } else return paddingInner;\n    };\n    scale3.paddingOuter = function(_) {\n        if (arguments.length) {\n            paddingOuter = Math.max(0, Math.min(1, _));\n            return rescale();\n        } else return paddingOuter;\n    };\n    scale3.align = function(_) {\n        if (arguments.length) {\n            align = Math.max(0, Math.min(1, _));\n            return rescale();\n        } else return align;\n    };\n    scale3.invertRange = function(_) {\n        // bail if range has null or undefined values\n        if (_[0] == null || _[1] == null) return;\n        const reverse = range$1[1] < range$1[0], values = reverse ? ordinalRange().reverse() : ordinalRange(), n = values.length - 1;\n        let lo = +_[0], hi = +_[1], a, b, t; // bail if either range endpoint is invalid\n        if (lo !== lo || hi !== hi) return; // order range inputs, bail if outside of scale range\n        if (hi < lo) {\n            t = lo;\n            lo = hi;\n            hi = t;\n        }\n        if (hi < values[0] || lo > range$1[1 - reverse]) return; // binary search to index into scale range\n        a = Math.max(0, (0, _d3Array.bisectRight)(values, lo) - 1);\n        b = lo === hi ? a : (0, _d3Array.bisectRight)(values, hi) - 1; // increment index a if lo is within padding gap\n        if (lo - values[a] > bandwidth + 1e-10) ++a;\n        if (reverse) {\n            // map + swap\n            t = a;\n            a = n - b;\n            b = n - t;\n        }\n        return a > b ? undefined : domain().slice(a, b + 1);\n    };\n    scale3.invert = function(_) {\n        const value = scale3.invertRange([\n            _,\n            _\n        ]);\n        return value ? value[0] : value;\n    };\n    scale3.copy = function() {\n        return band().domain(domain()).range(range$1).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n    };\n    return rescale();\n}\nfunction pointish(scale4) {\n    const copy = scale4.copy;\n    scale4.padding = scale4.paddingOuter;\n    delete scale4.paddingInner;\n    scale4.copy = function() {\n        return pointish(copy());\n    };\n    return scale4;\n}\nfunction point() {\n    return pointish(band().paddingInner(1));\n}\nvar map = Array.prototype.map;\nfunction numbers(_) {\n    return map.call(_, (0, _vegaUtil.toNumber));\n}\nconst slice = Array.prototype.slice;\nfunction scaleBinOrdinal() {\n    let domain = [], range = [];\n    function scale5(x) {\n        return x == null || x !== x ? undefined : range[((0, _d3Array.bisect)(domain, x) - 1) % range.length];\n    }\n    scale5.domain = function(_) {\n        if (arguments.length) {\n            domain = numbers(_);\n            return scale5;\n        } else return domain.slice();\n    };\n    scale5.range = function(_) {\n        if (arguments.length) {\n            range = slice.call(_);\n            return scale5;\n        } else return range.slice();\n    };\n    scale5.tickFormat = function(count, specifier) {\n        return (0, _d3Scale.tickFormat)(domain[0], (0, _vegaUtil.peek)(domain), count == null ? 10 : count, specifier);\n    };\n    scale5.copy = function() {\n        return scaleBinOrdinal().domain(scale5.domain()).range(scale5.range());\n    };\n    return scale5;\n}\nconst scales = {};\n/**\n * Augment scales with their type and needed inverse methods.\n */ function create(type, constructor, metadata) {\n    const ctr = function scale() {\n        const s = constructor();\n        if (!s.invertRange) s.invertRange = s.invert ? invertRange(s) : s.invertExtent ? invertRangeExtent(s) : undefined;\n        s.type = type;\n        return s;\n    };\n    ctr.metadata = (0, _vegaUtil.toSet)((0, _vegaUtil.array)(metadata));\n    return ctr;\n}\nfunction scale(type, scale6, metadata) {\n    if (arguments.length > 1) {\n        scales[type] = create(type, scale6, metadata);\n        return this;\n    } else return isValidScaleType(type) ? scales[type] : undefined;\n} // identity scale\nscale(Identity, (0, _d3Scale.scaleIdentity)); // continuous scales\nscale(Linear, (0, _d3Scale.scaleLinear), Continuous);\nscale(Log, (0, _d3Scale.scaleLog), [\n    Continuous,\n    Log\n]);\nscale(Pow, (0, _d3Scale.scalePow), Continuous);\nscale(Sqrt, (0, _d3Scale.scaleSqrt), Continuous);\nscale(Symlog, (0, _d3Scale.scaleSymlog), Continuous);\nscale(Time, (0, _d3Scale.scaleTime), [\n    Continuous,\n    Temporal\n]);\nscale(UTC, (0, _d3Scale.scaleUtc), [\n    Continuous,\n    Temporal\n]); // sequential scales\nscale(Sequential, (0, _d3Scale.scaleSequential), [\n    Continuous,\n    Interpolating\n]); // backwards compat\nscale(\"\".concat(Sequential, \"-\").concat(Linear), (0, _d3Scale.scaleSequential), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Sequential, \"-\").concat(Log), (0, _d3Scale.scaleSequentialLog), [\n    Continuous,\n    Interpolating,\n    Log\n]);\nscale(\"\".concat(Sequential, \"-\").concat(Pow), (0, _d3Scale.scaleSequentialPow), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Sequential, \"-\").concat(Sqrt), (0, _d3Scale.scaleSequentialSqrt), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Sequential, \"-\").concat(Symlog), (0, _d3Scale.scaleSequentialSymlog), [\n    Continuous,\n    Interpolating\n]); // diverging scales\nscale(\"\".concat(Diverging, \"-\").concat(Linear), (0, _d3Scale.scaleDiverging), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Diverging, \"-\").concat(Log), (0, _d3Scale.scaleDivergingLog), [\n    Continuous,\n    Interpolating,\n    Log\n]);\nscale(\"\".concat(Diverging, \"-\").concat(Pow), (0, _d3Scale.scaleDivergingPow), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Diverging, \"-\").concat(Sqrt), (0, _d3Scale.scaleDivergingSqrt), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Diverging, \"-\").concat(Symlog), (0, _d3Scale.scaleDivergingSymlog), [\n    Continuous,\n    Interpolating\n]); // discretizing scales\nscale(Quantile, (0, _d3Scale.scaleQuantile), [\n    Discretizing,\n    Quantile\n]);\nscale(Quantize, (0, _d3Scale.scaleQuantize), Discretizing);\nscale(Threshold, (0, _d3Scale.scaleThreshold), Discretizing); // discrete scales\nscale(BinOrdinal, scaleBinOrdinal, [\n    Discrete,\n    Discretizing\n]);\nscale(Ordinal, (0, _d3Scale.scaleOrdinal), Discrete);\nscale(Band, band, Discrete);\nscale(Point, point, Discrete);\nfunction isValidScaleType(type) {\n    return (0, _vegaUtil.hasOwnProperty)(scales, type);\n}\nfunction hasType(key, type) {\n    const s = scales[key];\n    return s && s.metadata[type];\n}\nfunction isContinuous(key) {\n    return hasType(key, Continuous);\n}\nfunction isDiscrete(key) {\n    return hasType(key, Discrete);\n}\nfunction isDiscretizing(key) {\n    return hasType(key, Discretizing);\n}\nfunction isLogarithmic(key) {\n    return hasType(key, Log);\n}\nfunction isTemporal(key) {\n    return hasType(key, Temporal);\n}\nfunction isInterpolating(key) {\n    return hasType(key, Interpolating);\n}\nfunction isQuantile(key) {\n    return hasType(key, Quantile);\n}\nconst scaleProps = [\n    \"clamp\",\n    \"base\",\n    \"constant\",\n    \"exponent\"\n];\nfunction interpolateRange(interpolator, range) {\n    const start = range[0], span = (0, _vegaUtil.peek)(range) - start;\n    return function(i) {\n        return interpolator(start + i * span);\n    };\n}\nfunction interpolateColors(colors1, type, gamma) {\n    return (0, _d3Interpolate.piecewise)(interpolate(type || \"rgb\", gamma), colors1);\n}\nfunction quantizeInterpolator(interpolator, count) {\n    const samples = new Array(count), n = count + 1;\n    for(let i = 0; i < count;)samples[i] = interpolator(++i / n);\n    return samples;\n}\nfunction scaleCopy(scale7) {\n    const t = scale7.type, s = scale7.copy();\n    s.type = t;\n    return s;\n}\nfunction scaleFraction(scale$1, min, max) {\n    const delta = max - min;\n    let i, t, s;\n    if (!delta || !Number.isFinite(delta)) return (0, _vegaUtil.constant)(0.5);\n    else {\n        i = (t = scale$1.type).indexOf(\"-\");\n        t = i < 0 ? t : t.slice(i + 1);\n        s = scale(t)().domain([\n            min,\n            max\n        ]).range([\n            0,\n            1\n        ]);\n        scaleProps.forEach((m)=>scale$1[m] ? s[m](scale$1[m]()) : 0);\n        return s;\n    }\n}\nfunction interpolate(type, gamma) {\n    const interp = _d3Interpolate[method(type)];\n    return gamma != null && interp && interp.gamma ? interp.gamma(gamma) : interp;\n}\nfunction method(type) {\n    return \"interpolate\" + type.toLowerCase().split(\"-\").map((s)=>s[0].toUpperCase() + s.slice(1)).join(\"\");\n}\nconst continuous = {\n    blues: \"cfe1f2bed8eca8cee58fc1de74b2d75ba3cf4592c63181bd206fb2125ca40a4a90\",\n    greens: \"d3eecdc0e6baabdda594d3917bc77d60ba6c46ab5e329a512089430e7735036429\",\n    greys: \"e2e2e2d4d4d4c4c4c4b1b1b19d9d9d8888887575756262624d4d4d3535351e1e1e\",\n    oranges: \"fdd8b3fdc998fdb87bfda55efc9244f87f2cf06b18e4580bd14904b93d029f3303\",\n    purples: \"e2e1efd4d4e8c4c5e0b4b3d6a3a0cc928ec3827cb97566ae684ea25c3696501f8c\",\n    reds: \"fdc9b4fcb49afc9e80fc8767fa7051f6573fec3f2fdc2a25c81b1db21218970b13\",\n    blueGreen: \"d5efedc1e8e0a7ddd18bd2be70c6a958ba9144ad77319c5d2089460e7736036429\",\n    bluePurple: \"ccddecbad0e4a8c2dd9ab0d4919cc98d85be8b6db28a55a6873c99822287730f71\",\n    greenBlue: \"d3eecec5e8c3b1e1bb9bd8bb82cec269c2ca51b2cd3c9fc7288abd1675b10b60a1\",\n    orangeRed: \"fddcaffdcf9bfdc18afdad77fb9562f67d53ee6545e24932d32d1ebf130da70403\",\n    purpleBlue: \"dbdaebc8cee4b1c3de97b7d87bacd15b9fc93a90c01e7fb70b70ab056199045281\",\n    purpleBlueGreen: \"dbd8eac8cee4b0c3de93b7d872acd1549fc83892bb1c88a3097f8702736b016353\",\n    purpleRed: \"dcc9e2d3b3d7ce9eccd186c0da6bb2e14da0e23189d91e6fc61159ab07498f023a\",\n    redPurple: \"fccfccfcbec0faa9b8f98faff571a5ec539ddb3695c41b8aa908808d0179700174\",\n    yellowGreen: \"e4f4acd1eca0b9e2949ed68880c97c62bb6e47aa5e3297502083440e723b036034\",\n    yellowOrangeBrown: \"feeaa1fedd84fecc63feb746fca031f68921eb7215db5e0bc54c05ab3d038f3204\",\n    yellowOrangeRed: \"fee087fed16ffebd59fea849fd903efc7335f9522bee3423de1b20ca0b22af0225\",\n    blueOrange: \"134b852f78b35da2cb9dcae1d2e5eff2f0ebfce0bafbbf74e8932fc5690d994a07\",\n    brownBlueGreen: \"704108a0651ac79548e3c78af3e6c6eef1eac9e9e48ed1c74da79e187a72025147\",\n    purpleGreen: \"5b1667834792a67fb6c9aed3e6d6e8eff0efd9efd5aedda971bb75368e490e5e29\",\n    purpleOrange: \"4114696647968f83b7b9b4d6dadbebf3eeeafce0bafbbf74e8932fc5690d994a07\",\n    redBlue: \"8c0d25bf363adf745ef4ae91fbdbc9f2efeed2e5ef9dcae15da2cb2f78b3134b85\",\n    redGrey: \"8c0d25bf363adf745ef4ae91fcdccbfaf4f1e2e2e2c0c0c0969696646464343434\",\n    yellowGreenBlue: \"eff9bddbf1b4bde5b594d5b969c5be45b4c22c9ec02182b82163aa23479c1c3185\",\n    redYellowBlue: \"a50026d4322cf16e43fcac64fedd90faf8c1dcf1ecabd6e875abd04a74b4313695\",\n    redYellowGreen: \"a50026d4322cf16e43fcac63fedd8df9f7aed7ee8ea4d86e64bc6122964f006837\",\n    pinkYellowGreen: \"8e0152c0267edd72adf0b3d6faddedf5f3efe1f2cab6de8780bb474f9125276419\",\n    spectral: \"9e0142d13c4bf0704afcac63fedd8dfbf8b0e0f3a1a9dda269bda94288b55e4fa2\",\n    viridis: \"440154470e61481a6c482575472f7d443a834144873d4e8a39568c35608d31688e2d708e2a788e27818e23888e21918d1f988b1fa08822a8842ab07f35b77943bf7154c56866cc5d7ad1518fd744a5db36bcdf27d2e21be9e51afde725\",\n    magma: \"0000040404130b0924150e3720114b2c11603b0f704a107957157e651a80721f817f24828c29819a2e80a8327db6377ac43c75d1426fde4968e95462f1605df76f5cfa7f5efc8f65fe9f6dfeaf78febf84fece91fddea0fcedaffcfdbf\",\n    inferno: \"0000040403130c0826170c3b240c4f330a5f420a68500d6c5d126e6b176e781c6d86216b932667a12b62ae305cbb3755c73e4cd24644dd513ae65c30ed6925f3771af8850ffb9506fca50afcb519fac62df6d645f2e661f3f484fcffa4\",\n    plasma: \"0d088723069033059742039d5002a25d01a66a00a87801a88405a7900da49c179ea72198b12a90ba3488c33d80cb4779d35171da5a69e16462e76e5bed7953f2834cf68f44fa9a3dfca636fdb32ffec029fcce25f9dc24f5ea27f0f921\",\n    cividis: \"00205100235800265d002961012b65042e670831690d346b11366c16396d1c3c6e213f6e26426e2c456e31476e374a6e3c4d6e42506e47536d4c566d51586e555b6e5a5e6e5e616e62646f66676f6a6a706e6d717270717573727976737c79747f7c75827f758682768985778c8877908b78938e789691789a94789e9778a19b78a59e77a9a177aea575b2a874b6ab73bbaf71c0b26fc5b66dc9b96acebd68d3c065d8c462ddc85fe2cb5ce7cf58ebd355f0d652f3da4ff7de4cfae249fce647\",\n    rainbow: \"6e40aa883eb1a43db3bf3cafd83fa4ee4395fe4b83ff576eff6659ff7847ff8c38f3a130e2b72fcfcc36bee044aff05b8ff4576ff65b52f6673af27828ea8d1ddfa319d0b81cbecb23abd82f96e03d82e14c6edb5a5dd0664dbf6e40aa\",\n    sinebow: \"ff4040fc582af47218e78d0bd5a703bfbf00a7d5038de70b72f41858fc2a40ff402afc5818f4720be78d03d5a700bfbf03a7d50b8de71872f42a58fc4040ff582afc7218f48d0be7a703d5bf00bfd503a7e70b8df41872fc2a58ff4040\",\n    turbo: \"23171b32204a3e2a71453493493eae4b49c54a53d7485ee44569ee4074f53c7ff8378af93295f72e9ff42ba9ef28b3e926bce125c5d925cdcf27d5c629dcbc2de3b232e9a738ee9d3ff39347f68950f9805afc7765fd6e70fe667cfd5e88fc5795fb51a1f84badf545b9f140c5ec3cd0e637dae034e4d931ecd12ef4c92bfac029ffb626ffad24ffa223ff9821ff8d1fff821dff771cfd6c1af76118f05616e84b14df4111d5380fcb2f0dc0260ab61f07ac1805a313029b0f00950c00910b00\",\n    browns: \"eedbbdecca96e9b97ae4a865dc9856d18954c7784cc0673fb85536ad44339f3632\",\n    tealBlues: \"bce4d89dd3d181c3cb65b3c245a2b9368fae347da0306a932c5985\",\n    teals: \"bbdfdfa2d4d58ac9c975bcbb61b0af4da5a43799982b8b8c1e7f7f127273006667\",\n    warmGreys: \"dcd4d0cec5c1c0b8b4b3aaa7a59c9998908c8b827f7e7673726866665c5a59504e\",\n    goldGreen: \"f4d166d5ca60b6c35c98bb597cb25760a6564b9c533f8f4f33834a257740146c36\",\n    goldOrange: \"f4d166f8be5cf8aa4cf5983bf3852aef701be2621fd65322c54923b142239e3a26\",\n    goldRed: \"f4d166f6be59f9aa51fc964ef6834bee734ae56249db5247cf4244c43141b71d3e\",\n    lightGreyRed: \"efe9e6e1dad7d5cbc8c8bdb9bbaea9cd967ddc7b43e15f19df4011dc000b\",\n    lightGreyTeal: \"e4eaead6dcddc8ced2b7c2c7a6b4bc64b0bf22a6c32295c11f85be1876bc\",\n    lightMulti: \"e0f1f2c4e9d0b0de9fd0e181f6e072f6c053f3993ef77440ef4a3c\",\n    lightOrange: \"f2e7daf7d5baf9c499fab184fa9c73f68967ef7860e8645bde515bd43d5b\",\n    lightTealBlue: \"e3e9e0c0dccf9aceca7abfc859afc0389fb9328dad2f7ca0276b95255988\",\n    darkBlue: \"3232322d46681a5c930074af008cbf05a7ce25c0dd38daed50f3faffffff\",\n    darkGold: \"3c3c3c584b37725e348c7631ae8b2bcfa424ecc31ef9de30fff184ffffff\",\n    darkGreen: \"3a3a3a215748006f4d048942489e4276b340a6c63dd2d836ffeb2cffffaa\",\n    darkMulti: \"3737371f5287197d8c29a86995ce3fffe800ffffff\",\n    darkRed: \"3434347036339e3c38cc4037e75d1eec8620eeab29f0ce32ffeb2c\"\n};\nconst discrete = {\n    category10: \"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\",\n    category20: \"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\",\n    category20b: \"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\",\n    category20c: \"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\",\n    tableau10: \"4c78a8f58518e4575672b7b254a24beeca3bb279a2ff9da69d755dbab0ac\",\n    tableau20: \"4c78a89ecae9f58518ffbf7954a24b88d27ab79a20f2cf5b43989483bcb6e45756ff9d9879706ebab0acd67195fcbfd2b279a2d6a5c99e765fd8b5a5\",\n    accent: \"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\",\n    dark2: \"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\",\n    paired: \"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\",\n    pastel1: \"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\",\n    pastel2: \"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\",\n    set1: \"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\",\n    set2: \"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\",\n    set3: \"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\"\n};\nfunction colors(palette) {\n    const n = palette.length / 6 | 0, c = new Array(n);\n    for(let i = 0; i < n;)c[i] = \"#\" + palette.slice(i * 6, ++i * 6);\n    return c;\n}\nfunction apply(_, f) {\n    for(const k in _)scheme(k, f(_[k]));\n}\nconst schemes = {};\napply(discrete, colors);\napply(continuous, (_)=>interpolateColors(colors(_)));\nfunction scheme(name, scheme1) {\n    name = name && name.toLowerCase();\n    if (arguments.length > 1) {\n        schemes[name] = scheme1;\n        return this;\n    } else return schemes[name];\n}\nconst SymbolLegend = \"symbol\";\nconst DiscreteLegend = \"discrete\";\nconst GradientLegend = \"gradient\";\nconst defaultFormatter = (value)=>(0, _vegaUtil.isArray)(value) ? value.map((v)=>String(v)) : String(value);\nconst ascending = (a, b)=>a[1] - b[1];\nconst descending = (a, b)=>b[1] - a[1];\n/**\n * Determine the tick count or interval function.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {*} count - The desired tick count or interval specifier.\n * @param {number} minStep - The desired minimum step between tick values.\n * @return {*} - The tick count or interval function.\n */ function tickCount(scale8, count, minStep) {\n    let step;\n    if ((0, _vegaUtil.isNumber)(count)) {\n        if (scale8.bins) count = Math.max(count, scale8.bins.length);\n        if (minStep != null) count = Math.min(count, Math.floor((0, _vegaUtil.span)(scale8.domain()) / minStep || 1));\n    }\n    if ((0, _vegaUtil.isObject)(count)) {\n        step = count.step;\n        count = count.interval;\n    }\n    if ((0, _vegaUtil.isString)(count)) {\n        count = scale8.type === Time ? (0, _vegaTime.timeInterval)(count) : scale8.type == UTC ? (0, _vegaTime.utcInterval)(count) : (0, _vegaUtil.error)(\"Only time and utc scales accept interval strings.\");\n        if (step) count = count.every(step);\n    }\n    return count;\n}\n/**\n * Filter a set of candidate tick values, ensuring that only tick values\n * that lie within the scale range are included.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {Array<*>} ticks - The candidate tick values.\n * @param {*} count - The tick count or interval function.\n * @return {Array<*>} - The filtered tick values.\n */ function validTicks(scale9, ticks, count) {\n    let range = scale9.range(), lo = range[0], hi = (0, _vegaUtil.peek)(range), cmp = ascending;\n    if (lo > hi) {\n        range = hi;\n        hi = lo;\n        lo = range;\n        cmp = descending;\n    }\n    lo = Math.floor(lo);\n    hi = Math.ceil(hi); // filter ticks to valid values within the range\n    // additionally sort ticks in range order (#2579)\n    ticks = ticks.map((v)=>[\n            v,\n            scale9(v)\n        ]).filter((_)=>lo <= _[1] && _[1] <= hi).sort(cmp).map((_)=>_[0]);\n    if (count > 0 && ticks.length > 1) {\n        const endpoints = [\n            ticks[0],\n            (0, _vegaUtil.peek)(ticks)\n        ];\n        while(ticks.length > count && ticks.length >= 3)ticks = ticks.filter((_, i)=>!(i % 2));\n        if (ticks.length < 3) ticks = endpoints;\n    }\n    return ticks;\n}\n/**\n * Generate tick values for the given scale and approximate tick count or\n * interval value. If the scale has a 'ticks' method, it will be used to\n * generate the ticks, with the count argument passed as a parameter. If the\n * scale lacks a 'ticks' method, the full scale domain will be returned.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {*} [count] - The approximate number of desired ticks.\n * @return {Array<*>} - The generated tick values.\n */ function tickValues(scale10, count) {\n    return scale10.bins ? validTicks(scale10, scale10.bins) : scale10.ticks ? scale10.ticks(count) : scale10.domain();\n}\n/**\n * Generate a label format function for a scale. If the scale has a\n * 'tickFormat' method, it will be used to generate the formatter, with the\n * count and specifier arguments passed as parameters. If the scale lacks a\n * 'tickFormat' method, the returned formatter performs simple string coercion.\n * If the input scale is a logarithmic scale and the format specifier does not\n * indicate a desired decimal precision, a special variable precision formatter\n * that automatically trims trailing zeroes will be generated.\n * @param {Scale} scale - The scale for which to generate the label formatter.\n * @param {*} [count] - The approximate number of desired ticks.\n * @param {string} [specifier] - The format specifier. Must be a legal d3\n *   specifier string (see https://github.com/d3/d3-format#formatSpecifier) or\n *   time multi-format specifier object.\n * @return {function(*):string} - The generated label formatter.\n */ function tickFormat(locale, scale11, count, specifier, formatType, noSkip) {\n    const type = scale11.type;\n    let format1 = defaultFormatter;\n    if (type === Time || formatType === Time) format1 = locale.timeFormat(specifier);\n    else if (type === UTC || formatType === UTC) format1 = locale.utcFormat(specifier);\n    else if (isLogarithmic(type)) {\n        const varfmt = locale.formatFloat(specifier);\n        if (noSkip || scale11.bins) format1 = varfmt;\n        else {\n            const test = tickLog(scale11, count, false);\n            format1 = (_)=>test(_) ? varfmt(_) : \"\";\n        }\n    } else if (scale11.tickFormat) {\n        // if d3 scale has tickFormat, it must be continuous\n        const d = scale11.domain();\n        format1 = locale.formatSpan(d[0], d[d.length - 1], count, specifier);\n    } else if (specifier) format1 = locale.format(specifier);\n    return format1;\n}\nfunction tickLog(scale12, count, values) {\n    const ticks = tickValues(scale12, count), base = scale12.base(), logb = Math.log(base), k = Math.max(1, base * count / ticks.length); // apply d3-scale's log format filter criteria\n    const test = (d)=>{\n        let i = d / Math.pow(base, Math.round(Math.log(d) / logb));\n        if (i * base < base - 0.5) i *= base;\n        return i <= k;\n    };\n    return values ? ticks.filter(test) : test;\n}\nconst symbols = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"thresholds\",\n    [Threshold]: \"domain\"\n};\nconst formats = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"domain\"\n};\nfunction labelValues(scale13, count) {\n    return scale13.bins ? binValues(scale13.bins) : scale13.type === Log ? tickLog(scale13, count, true) : symbols[scale13.type] ? thresholdValues(scale13[symbols[scale13.type]]()) : tickValues(scale13, count);\n}\nfunction thresholdFormat(locale, scale14, specifier) {\n    const _ = scale14[formats[scale14.type]](), n = _.length;\n    let d = n > 1 ? _[1] - _[0] : _[0], i;\n    for(i = 1; i < n; ++i)d = Math.min(d, _[i] - _[i - 1]);\n     // tickCount = 3 ticks times 10 for increased resolution\n    return locale.formatSpan(0, d, 30, specifier);\n}\nfunction thresholdValues(thresholds) {\n    const values = [\n        -Infinity\n    ].concat(thresholds);\n    values.max = Infinity;\n    return values;\n}\nfunction binValues(bins) {\n    const values = bins.slice(0, -1);\n    values.max = (0, _vegaUtil.peek)(bins);\n    return values;\n}\nconst isDiscreteRange = (scale15)=>symbols[scale15.type] || scale15.bins;\nfunction labelFormat(locale, scale16, count, type, specifier, formatType, noSkip) {\n    const format2 = formats[scale16.type] && formatType !== Time && formatType !== UTC ? thresholdFormat(locale, scale16, specifier) : tickFormat(locale, scale16, count, specifier, formatType, noSkip);\n    return type === SymbolLegend && isDiscreteRange(scale16) ? formatRange(format2) : type === DiscreteLegend ? formatDiscrete(format2) : formatPoint(format2);\n}\nconst formatRange = (format3)=>(value, index, array)=>{\n        const limit = get(array[index + 1], get(array.max, Infinity)), lo = formatValue(value, format3), hi = formatValue(limit, format3);\n        return lo && hi ? lo + \" \\u2013 \" + hi : hi ? \"< \" + hi : \"\\u2265 \" + lo;\n    };\nconst get = (value, dflt)=>value != null ? value : dflt;\nconst formatDiscrete = (format4)=>(value, index)=>index ? format4(value) : null;\nconst formatPoint = (format5)=>(value)=>format5(value);\nconst formatValue = (value, format6)=>Number.isFinite(value) ? format6(value) : null;\nfunction labelFraction(scale17) {\n    const domain = scale17.domain(), count = domain.length - 1;\n    let lo = +domain[0], hi = +(0, _vegaUtil.peek)(domain), span = hi - lo;\n    if (scale17.type === Threshold) {\n        const adjust = count ? span / count : 0.1;\n        lo -= adjust;\n        hi += adjust;\n        span = hi - lo;\n    }\n    return (value)=>(value - lo) / span;\n}\nfunction format(locale, scale18, specifier, formatType) {\n    const type = formatType || scale18.type; // replace abbreviated time specifiers to improve screen reader experience\n    if ((0, _vegaUtil.isString)(specifier) && isTemporal(type)) specifier = specifier.replace(/%a/g, \"%A\").replace(/%b/g, \"%B\");\n    return !specifier && type === Time ? locale.timeFormat(\"%A, %d %B %Y, %X\") : !specifier && type === UTC ? locale.utcFormat(\"%A, %d %B %Y, %X UTC\") : labelFormat(locale, scale18, 5, null, specifier, formatType, true);\n}\nfunction domainCaption(locale, scale19, opt) {\n    opt = opt || {};\n    const max = Math.max(3, opt.maxlen || 7), fmt = format(locale, scale19, opt.format, opt.formatType); // if scale breaks domain into bins, describe boundaries\n    if (isDiscretizing(scale19.type)) {\n        const v = labelValues(scale19).slice(1).map(fmt), n = v.length;\n        return \"\".concat(n, \" boundar\").concat(n === 1 ? \"y\" : \"ies\", \": \").concat(v.join(\", \"));\n    } else if (isDiscrete(scale19.type)) {\n        const d = scale19.domain(), n = d.length, v = n > max ? d.slice(0, max - 2).map(fmt).join(\", \") + \", ending with \" + d.slice(-1).map(fmt) : d.map(fmt).join(\", \");\n        return \"\".concat(n, \" value\").concat(n === 1 ? \"\" : \"s\", \": \").concat(v);\n    } else {\n        const d = scale19.domain();\n        return \"values from \".concat(fmt(d[0]), \" to \").concat(fmt((0, _vegaUtil.peek)(d)));\n    }\n}\n\n},{\"vega-util\":\"dPFAY\",\"d3-array\":\"8JMcC\",\"d3-scale\":\"03x1i\",\"d3-interpolate\":\"dQqYJ\",\"vega-time\":\"hDlOp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"03x1i\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"scaleBand\", ()=>(0, _bandJsDefault.default));\nparcelHelpers.export(exports, \"scalePoint\", ()=>(0, _bandJs.point));\nparcelHelpers.export(exports, \"scaleIdentity\", ()=>(0, _identityJsDefault.default));\nparcelHelpers.export(exports, \"scaleLinear\", ()=>(0, _linearJsDefault.default));\nparcelHelpers.export(exports, \"scaleLog\", ()=>(0, _logJsDefault.default));\nparcelHelpers.export(exports, \"scaleSymlog\", ()=>(0, _symlogJsDefault.default));\nparcelHelpers.export(exports, \"scaleOrdinal\", ()=>(0, _ordinalJsDefault.default));\nparcelHelpers.export(exports, \"scaleImplicit\", ()=>(0, _ordinalJs.implicit));\nparcelHelpers.export(exports, \"scalePow\", ()=>(0, _powJsDefault.default));\nparcelHelpers.export(exports, \"scaleSqrt\", ()=>(0, _powJs.sqrt));\nparcelHelpers.export(exports, \"scaleRadial\", ()=>(0, _radialJsDefault.default));\nparcelHelpers.export(exports, \"scaleQuantile\", ()=>(0, _quantileJsDefault.default));\nparcelHelpers.export(exports, \"scaleQuantize\", ()=>(0, _quantizeJsDefault.default));\nparcelHelpers.export(exports, \"scaleThreshold\", ()=>(0, _thresholdJsDefault.default));\nparcelHelpers.export(exports, \"scaleTime\", ()=>(0, _timeJsDefault.default));\nparcelHelpers.export(exports, \"scaleUtc\", ()=>(0, _utcTimeJsDefault.default));\nparcelHelpers.export(exports, \"scaleSequential\", ()=>(0, _sequentialJsDefault.default));\nparcelHelpers.export(exports, \"scaleSequentialLog\", ()=>(0, _sequentialJs.sequentialLog));\nparcelHelpers.export(exports, \"scaleSequentialPow\", ()=>(0, _sequentialJs.sequentialPow));\nparcelHelpers.export(exports, \"scaleSequentialSqrt\", ()=>(0, _sequentialJs.sequentialSqrt));\nparcelHelpers.export(exports, \"scaleSequentialSymlog\", ()=>(0, _sequentialJs.sequentialSymlog));\nparcelHelpers.export(exports, \"scaleSequentialQuantile\", ()=>(0, _sequentialQuantileJsDefault.default));\nparcelHelpers.export(exports, \"scaleDiverging\", ()=>(0, _divergingJsDefault.default));\nparcelHelpers.export(exports, \"scaleDivergingLog\", ()=>(0, _divergingJs.divergingLog));\nparcelHelpers.export(exports, \"scaleDivergingPow\", ()=>(0, _divergingJs.divergingPow));\nparcelHelpers.export(exports, \"scaleDivergingSqrt\", ()=>(0, _divergingJs.divergingSqrt));\nparcelHelpers.export(exports, \"scaleDivergingSymlog\", ()=>(0, _divergingJs.divergingSymlog));\nparcelHelpers.export(exports, \"tickFormat\", ()=>(0, _tickFormatJsDefault.default));\nvar _bandJs = require(\"./band.js\");\nvar _bandJsDefault = parcelHelpers.interopDefault(_bandJs);\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _linearJs = require(\"./linear.js\");\nvar _linearJsDefault = parcelHelpers.interopDefault(_linearJs);\nvar _logJs = require(\"./log.js\");\nvar _logJsDefault = parcelHelpers.interopDefault(_logJs);\nvar _symlogJs = require(\"./symlog.js\");\nvar _symlogJsDefault = parcelHelpers.interopDefault(_symlogJs);\nvar _ordinalJs = require(\"./ordinal.js\");\nvar _ordinalJsDefault = parcelHelpers.interopDefault(_ordinalJs);\nvar _powJs = require(\"./pow.js\");\nvar _powJsDefault = parcelHelpers.interopDefault(_powJs);\nvar _radialJs = require(\"./radial.js\");\nvar _radialJsDefault = parcelHelpers.interopDefault(_radialJs);\nvar _quantileJs = require(\"./quantile.js\");\nvar _quantileJsDefault = parcelHelpers.interopDefault(_quantileJs);\nvar _quantizeJs = require(\"./quantize.js\");\nvar _quantizeJsDefault = parcelHelpers.interopDefault(_quantizeJs);\nvar _thresholdJs = require(\"./threshold.js\");\nvar _thresholdJsDefault = parcelHelpers.interopDefault(_thresholdJs);\nvar _timeJs = require(\"./time.js\");\nvar _timeJsDefault = parcelHelpers.interopDefault(_timeJs);\nvar _utcTimeJs = require(\"./utcTime.js\");\nvar _utcTimeJsDefault = parcelHelpers.interopDefault(_utcTimeJs);\nvar _sequentialJs = require(\"./sequential.js\");\nvar _sequentialJsDefault = parcelHelpers.interopDefault(_sequentialJs);\nvar _sequentialQuantileJs = require(\"./sequentialQuantile.js\");\nvar _sequentialQuantileJsDefault = parcelHelpers.interopDefault(_sequentialQuantileJs);\nvar _divergingJs = require(\"./diverging.js\");\nvar _divergingJsDefault = parcelHelpers.interopDefault(_divergingJs);\nvar _tickFormatJs = require(\"./tickFormat.js\");\nvar _tickFormatJsDefault = parcelHelpers.interopDefault(_tickFormatJs);\n\n},{\"./band.js\":false,\"./identity.js\":\"4lmrT\",\"./linear.js\":\"2Mb1X\",\"./log.js\":\"fjlvX\",\"./symlog.js\":\"jw0HW\",\"./ordinal.js\":\"l4AYv\",\"./pow.js\":\"a3E7U\",\"./radial.js\":false,\"./quantile.js\":\"8l8gh\",\"./quantize.js\":\"asmDg\",\"./threshold.js\":\"bXV4m\",\"./time.js\":\"hf0gG\",\"./utcTime.js\":\"gH413\",\"./sequential.js\":\"7utjO\",\"./sequentialQuantile.js\":false,\"./diverging.js\":\"hvyvZ\",\"./tickFormat.js\":\"bbchH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4lmrT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _linearJs = require(\"./linear.js\");\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nfunction identity(domain) {\n    var unknown;\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : x;\n    }\n    scale.invert = scale;\n    scale.domain = scale.range = function(_) {\n        return arguments.length ? (domain = Array.from(_, (0, _numberJsDefault.default)), scale) : domain.slice();\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    scale.copy = function() {\n        return identity(domain).unknown(unknown);\n    };\n    domain = arguments.length ? Array.from(domain, (0, _numberJsDefault.default)) : [\n        0,\n        1\n    ];\n    return (0, _linearJs.linearish)(scale);\n}\nexports.default = identity;\n\n},{\"./linear.js\":\"2Mb1X\",\"./number.js\":\"1GMBF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2Mb1X\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"linearish\", ()=>linearish);\nvar _d3Array = require(\"d3-array\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _continuousJsDefault = parcelHelpers.interopDefault(_continuousJs);\nvar _initJs = require(\"./init.js\");\nvar _tickFormatJs = require(\"./tickFormat.js\");\nvar _tickFormatJsDefault = parcelHelpers.interopDefault(_tickFormatJs);\nfunction linearish(scale) {\n    var domain = scale.domain;\n    scale.ticks = function(count) {\n        var d = domain();\n        return (0, _d3Array.ticks)(d[0], d[d.length - 1], count == null ? 10 : count);\n    };\n    scale.tickFormat = function(count, specifier) {\n        var d = domain();\n        return (0, _tickFormatJsDefault.default)(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n    };\n    scale.nice = function(count) {\n        if (count == null) count = 10;\n        var d = domain();\n        var i0 = 0;\n        var i1 = d.length - 1;\n        var start = d[i0];\n        var stop = d[i1];\n        var prestep;\n        var step;\n        var maxIter = 10;\n        if (stop < start) {\n            step = start, start = stop, stop = step;\n            step = i0, i0 = i1, i1 = step;\n        }\n        while(maxIter-- > 0){\n            step = (0, _d3Array.tickIncrement)(start, stop, count);\n            if (step === prestep) {\n                d[i0] = start;\n                d[i1] = stop;\n                return domain(d);\n            } else if (step > 0) {\n                start = Math.floor(start / step) * step;\n                stop = Math.ceil(stop / step) * step;\n            } else if (step < 0) {\n                start = Math.ceil(start * step) / step;\n                stop = Math.floor(stop * step) / step;\n            } else break;\n            prestep = step;\n        }\n        return scale;\n    };\n    return scale;\n}\nfunction linear() {\n    var scale = (0, _continuousJsDefault.default)();\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, linear());\n    };\n    (0, _initJs.initRange).apply(scale, arguments);\n    return linearish(scale);\n}\nexports.default = linear;\n\n},{\"d3-array\":\"8JMcC\",\"./continuous.js\":\"Mo65z\",\"./init.js\":\"efWLG\",\"./tickFormat.js\":\"bbchH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Mo65z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"identity\", ()=>identity);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"transformer\", ()=>transformer);\nvar _d3Array = require(\"d3-array\");\nvar _d3Interpolate = require(\"d3-interpolate\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar unit = [\n    0,\n    1\n];\nfunction identity(x) {\n    return x;\n}\nfunction normalize(a, b) {\n    return (b -= a = +a) ? function(x) {\n        return (x - a) / b;\n    } : (0, _constantJsDefault.default)(isNaN(b) ? NaN : 0.5);\n}\nfunction clamper(a, b) {\n    var t;\n    if (a > b) t = a, a = b, b = t;\n    return function(x) {\n        return Math.max(a, Math.min(b, x));\n    };\n}\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n    var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n    if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n    else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n    return function(x) {\n        return r0(d0(x));\n    };\n}\nfunction polymap(domain, range, interpolate) {\n    var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i1 = -1;\n    // Reverse descending domains.\n    if (domain[j] < domain[0]) {\n        domain = domain.slice().reverse();\n        range = range.slice().reverse();\n    }\n    while(++i1 < j){\n        d[i1] = normalize(domain[i1], domain[i1 + 1]);\n        r[i1] = interpolate(range[i1], range[i1 + 1]);\n    }\n    return function(x) {\n        var i = (0, _d3Array.bisect)(domain, x, 1, j) - 1;\n        return r[i](d[i](x));\n    };\n}\nfunction copy(source, target) {\n    return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());\n}\nfunction transformer() {\n    var domain = unit, range = unit, interpolate = (0, _d3Interpolate.interpolate), transform, untransform, unknown, clamp = identity, piecewise, output, input;\n    function rescale() {\n        var n = Math.min(domain.length, range.length);\n        if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n        piecewise = n > 2 ? polymap : bimap;\n        output = input = null;\n        return scale;\n    }\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n    }\n    scale.invert = function(y) {\n        return clamp(untransform((input || (input = piecewise(range, domain.map(transform), (0, _d3Interpolate.interpolateNumber))))(y)));\n    };\n    scale.domain = function(_) {\n        return arguments.length ? (domain = Array.from(_, (0, _numberJsDefault.default)), rescale()) : domain.slice();\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n    };\n    scale.rangeRound = function(_) {\n        return range = Array.from(_), interpolate = (0, _d3Interpolate.interpolateRound), rescale();\n    };\n    scale.clamp = function(_) {\n        return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n    };\n    scale.interpolate = function(_) {\n        return arguments.length ? (interpolate = _, rescale()) : interpolate;\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    return function(t, u) {\n        transform = t, untransform = u;\n        return rescale();\n    };\n}\nfunction continuous() {\n    return transformer()(identity, identity);\n}\nexports.default = continuous;\n\n},{\"d3-array\":\"8JMcC\",\"d3-interpolate\":\"dQqYJ\",\"./constant.js\":\"kc0ku\",\"./number.js\":\"1GMBF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dQqYJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"interpolate\", ()=>(0, _valueJsDefault.default));\nparcelHelpers.export(exports, \"interpolateArray\", ()=>(0, _arrayJsDefault.default));\nparcelHelpers.export(exports, \"interpolateBasis\", ()=>(0, _basisJsDefault.default));\nparcelHelpers.export(exports, \"interpolateBasisClosed\", ()=>(0, _basisClosedJsDefault.default));\nparcelHelpers.export(exports, \"interpolateDate\", ()=>(0, _dateJsDefault.default));\nparcelHelpers.export(exports, \"interpolateDiscrete\", ()=>(0, _discreteJsDefault.default));\nparcelHelpers.export(exports, \"interpolateHue\", ()=>(0, _hueJsDefault.default));\nparcelHelpers.export(exports, \"interpolateNumber\", ()=>(0, _numberJsDefault.default));\nparcelHelpers.export(exports, \"interpolateNumberArray\", ()=>(0, _numberArrayJsDefault.default));\nparcelHelpers.export(exports, \"interpolateObject\", ()=>(0, _objectJsDefault.default));\nparcelHelpers.export(exports, \"interpolateRound\", ()=>(0, _roundJsDefault.default));\nparcelHelpers.export(exports, \"interpolateString\", ()=>(0, _stringJsDefault.default));\nparcelHelpers.export(exports, \"interpolateTransformCss\", ()=>(0, _indexJs.interpolateTransformCss));\nparcelHelpers.export(exports, \"interpolateTransformSvg\", ()=>(0, _indexJs.interpolateTransformSvg));\nparcelHelpers.export(exports, \"interpolateZoom\", ()=>(0, _zoomJsDefault.default));\nparcelHelpers.export(exports, \"interpolateRgb\", ()=>(0, _rgbJsDefault.default));\nparcelHelpers.export(exports, \"interpolateRgbBasis\", ()=>(0, _rgbJs.rgbBasis));\nparcelHelpers.export(exports, \"interpolateRgbBasisClosed\", ()=>(0, _rgbJs.rgbBasisClosed));\nparcelHelpers.export(exports, \"interpolateHsl\", ()=>(0, _hslJsDefault.default));\nparcelHelpers.export(exports, \"interpolateHslLong\", ()=>(0, _hslJs.hslLong));\nparcelHelpers.export(exports, \"interpolateLab\", ()=>(0, _labJsDefault.default));\nparcelHelpers.export(exports, \"interpolateHcl\", ()=>(0, _hclJsDefault.default));\nparcelHelpers.export(exports, \"interpolateHclLong\", ()=>(0, _hclJs.hclLong));\nparcelHelpers.export(exports, \"interpolateCubehelix\", ()=>(0, _cubehelixJsDefault.default));\nparcelHelpers.export(exports, \"interpolateCubehelixLong\", ()=>(0, _cubehelixJs.cubehelixLong));\nparcelHelpers.export(exports, \"piecewise\", ()=>(0, _piecewiseJsDefault.default));\nparcelHelpers.export(exports, \"quantize\", ()=>(0, _quantizeJsDefault.default));\nvar _valueJs = require(\"./value.js\");\nvar _valueJsDefault = parcelHelpers.interopDefault(_valueJs);\nvar _arrayJs = require(\"./array.js\");\nvar _arrayJsDefault = parcelHelpers.interopDefault(_arrayJs);\nvar _basisJs = require(\"./basis.js\");\nvar _basisJsDefault = parcelHelpers.interopDefault(_basisJs);\nvar _basisClosedJs = require(\"./basisClosed.js\");\nvar _basisClosedJsDefault = parcelHelpers.interopDefault(_basisClosedJs);\nvar _dateJs = require(\"./date.js\");\nvar _dateJsDefault = parcelHelpers.interopDefault(_dateJs);\nvar _discreteJs = require(\"./discrete.js\");\nvar _discreteJsDefault = parcelHelpers.interopDefault(_discreteJs);\nvar _hueJs = require(\"./hue.js\");\nvar _hueJsDefault = parcelHelpers.interopDefault(_hueJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar _numberArrayJs = require(\"./numberArray.js\");\nvar _numberArrayJsDefault = parcelHelpers.interopDefault(_numberArrayJs);\nvar _objectJs = require(\"./object.js\");\nvar _objectJsDefault = parcelHelpers.interopDefault(_objectJs);\nvar _roundJs = require(\"./round.js\");\nvar _roundJsDefault = parcelHelpers.interopDefault(_roundJs);\nvar _stringJs = require(\"./string.js\");\nvar _stringJsDefault = parcelHelpers.interopDefault(_stringJs);\nvar _indexJs = require(\"./transform/index.js\");\nvar _zoomJs = require(\"./zoom.js\");\nvar _zoomJsDefault = parcelHelpers.interopDefault(_zoomJs);\nvar _rgbJs = require(\"./rgb.js\");\nvar _rgbJsDefault = parcelHelpers.interopDefault(_rgbJs);\nvar _hslJs = require(\"./hsl.js\");\nvar _hslJsDefault = parcelHelpers.interopDefault(_hslJs);\nvar _labJs = require(\"./lab.js\");\nvar _labJsDefault = parcelHelpers.interopDefault(_labJs);\nvar _hclJs = require(\"./hcl.js\");\nvar _hclJsDefault = parcelHelpers.interopDefault(_hclJs);\nvar _cubehelixJs = require(\"./cubehelix.js\");\nvar _cubehelixJsDefault = parcelHelpers.interopDefault(_cubehelixJs);\nvar _piecewiseJs = require(\"./piecewise.js\");\nvar _piecewiseJsDefault = parcelHelpers.interopDefault(_piecewiseJs);\nvar _quantizeJs = require(\"./quantize.js\");\nvar _quantizeJsDefault = parcelHelpers.interopDefault(_quantizeJs);\n\n},{\"./value.js\":\"g5oI1\",\"./array.js\":\"6w2qi\",\"./basis.js\":\"5WSWe\",\"./basisClosed.js\":\"5lu5D\",\"./date.js\":\"eXHAc\",\"./discrete.js\":\"4QG3L\",\"./hue.js\":\"eGZGV\",\"./number.js\":\"aOAbv\",\"./numberArray.js\":\"fC5Lm\",\"./object.js\":\"lV6Np\",\"./round.js\":\"k1Pk4\",\"./string.js\":\"hOO9Q\",\"./transform/index.js\":\"b6cE0\",\"./zoom.js\":\"cJyFe\",\"./rgb.js\":\"4K8jq\",\"./hsl.js\":\"3szOU\",\"./lab.js\":\"5L1if\",\"./hcl.js\":\"8zfWm\",\"./cubehelix.js\":\"jji77\",\"./piecewise.js\":\"43IcW\",\"./quantize.js\":\"9FyXn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g5oI1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Color = require(\"d3-color\");\nvar _rgbJs = require(\"./rgb.js\");\nvar _rgbJsDefault = parcelHelpers.interopDefault(_rgbJs);\nvar _arrayJs = require(\"./array.js\");\nvar _dateJs = require(\"./date.js\");\nvar _dateJsDefault = parcelHelpers.interopDefault(_dateJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar _objectJs = require(\"./object.js\");\nvar _objectJsDefault = parcelHelpers.interopDefault(_objectJs);\nvar _stringJs = require(\"./string.js\");\nvar _stringJsDefault = parcelHelpers.interopDefault(_stringJs);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _numberArrayJs = require(\"./numberArray.js\");\nvar _numberArrayJsDefault = parcelHelpers.interopDefault(_numberArrayJs);\nexports.default = function(a, b) {\n    var t = typeof b, c;\n    return b == null || t === \"boolean\" ? (0, _constantJsDefault.default)(b) : (t === \"number\" ? (0, _numberJsDefault.default) : t === \"string\" ? (c = (0, _d3Color.color)(b)) ? (b = c, _rgbJsDefault.default) : (0, _stringJsDefault.default) : b instanceof (0, _d3Color.color) ? (0, _rgbJsDefault.default) : b instanceof Date ? (0, _dateJsDefault.default) : (0, _numberArrayJs.isNumberArray)(b) ? (0, _numberArrayJsDefault.default) : Array.isArray(b) ? (0, _arrayJs.genericArray) : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? (0, _objectJsDefault.default) : (0, _numberJsDefault.default))(a, b);\n};\n\n},{\"d3-color\":\"2I9cJ\",\"./rgb.js\":\"4K8jq\",\"./array.js\":\"6w2qi\",\"./date.js\":\"eXHAc\",\"./number.js\":\"aOAbv\",\"./object.js\":\"lV6Np\",\"./string.js\":\"hOO9Q\",\"./constant.js\":\"cPXJi\",\"./numberArray.js\":\"fC5Lm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2I9cJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"color\", ()=>(0, _colorJsDefault.default));\nparcelHelpers.export(exports, \"rgb\", ()=>(0, _colorJs.rgb));\nparcelHelpers.export(exports, \"hsl\", ()=>(0, _colorJs.hsl));\nparcelHelpers.export(exports, \"lab\", ()=>(0, _labJsDefault.default));\nparcelHelpers.export(exports, \"hcl\", ()=>(0, _labJs.hcl));\nparcelHelpers.export(exports, \"lch\", ()=>(0, _labJs.lch));\nparcelHelpers.export(exports, \"gray\", ()=>(0, _labJs.gray));\nparcelHelpers.export(exports, \"cubehelix\", ()=>(0, _cubehelixJsDefault.default));\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nvar _labJs = require(\"./lab.js\");\nvar _labJsDefault = parcelHelpers.interopDefault(_labJs);\nvar _cubehelixJs = require(\"./cubehelix.js\");\nvar _cubehelixJsDefault = parcelHelpers.interopDefault(_cubehelixJs);\n\n},{\"./color.js\":\"4Sct2\",\"./lab.js\":\"cK4SQ\",\"./cubehelix.js\":\"1AVio\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4Sct2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Color\", ()=>Color);\nparcelHelpers.export(exports, \"darker\", ()=>darker);\nparcelHelpers.export(exports, \"brighter\", ()=>brighter);\nparcelHelpers.export(exports, \"rgbConvert\", ()=>rgbConvert);\nparcelHelpers.export(exports, \"rgb\", ()=>rgb);\nparcelHelpers.export(exports, \"Rgb\", ()=>Rgb);\nparcelHelpers.export(exports, \"hslConvert\", ()=>hslConvert);\nparcelHelpers.export(exports, \"hsl\", ()=>hsl);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nfunction Color() {}\nvar darker = 0.7;\nvar brighter = 1 / darker;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(\"^rgb\\\\(\" + [\n    reI,\n    reI,\n    reI\n] + \"\\\\)$\"), reRgbPercent = new RegExp(\"^rgb\\\\(\" + [\n    reP,\n    reP,\n    reP\n] + \"\\\\)$\"), reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [\n    reI,\n    reI,\n    reI,\n    reN\n] + \"\\\\)$\"), reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [\n    reP,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\"), reHslPercent = new RegExp(\"^hsl\\\\(\" + [\n    reN,\n    reP,\n    reP\n] + \"\\\\)$\"), reHslaPercent = new RegExp(\"^hsla\\\\(\" + [\n    reN,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\");\nvar named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, _defineJsDefault.default)(Color, color, {\n    copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable: function() {\n        return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    formatHex: color_formatHex,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n});\nfunction color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction color_formatHsl() {\n    return hslConvert(this).formatHsl();\n}\nfunction color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n     : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\nexports.default = color;\nfunction rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n}\nfunction rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n}\nfunction rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Rgb, rgb, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb: function() {\n        return this;\n    },\n    displayable: function() {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: rgb_formatHex,\n    formatHex: rgb_formatHex,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n}));\nfunction rgb_formatHex() {\n    return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\nfunction rgb_formatRgb() {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction hex(value) {\n    value = Math.max(0, Math.min(255, Math.round(value) || 0));\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n}\nfunction hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new Hsl(h, s, l, o.opacity);\n}\nfunction hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Hsl, hsl, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl: function() {\n        var a = this.opacity;\n        a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n},{\"./define.js\":\"bavHA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bavHA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"extend\", ()=>extend);\nexports.default = function(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n};\nfunction extend(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cK4SQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"gray\", ()=>gray);\nparcelHelpers.export(exports, \"Lab\", ()=>Lab);\nparcelHelpers.export(exports, \"lch\", ()=>lch);\nparcelHelpers.export(exports, \"hcl\", ()=>hcl);\nparcelHelpers.export(exports, \"Hcl\", ()=>Hcl);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nvar _colorJs = require(\"./color.js\");\nvar _mathJs = require(\"./math.js\");\n// https://observablehq.com/@mbostock/lab-and-rgb\nconst K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1;\nfunction labConvert(o) {\n    if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n    if (o instanceof Hcl) return hcl2lab(o);\n    if (!(o instanceof (0, _colorJs.Rgb))) o = (0, _colorJs.rgbConvert)(o);\n    var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b = rgb2lrgb(o.b), y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n    if (r === g && g === b) x = z = y;\n    else {\n        x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n        z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n    }\n    return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\nfunction gray(l, opacity) {\n    return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\nfunction lab(l, a, b, opacity) {\n    return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\nexports.default = lab;\nfunction Lab(l, a, b, opacity) {\n    this.l = +l;\n    this.a = +a;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Lab, lab, (0, _defineJs.extend)((0, _colorJs.Color), {\n    brighter: function(k) {\n        return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    darker: function(k) {\n        return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    rgb: function() {\n        var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200;\n        x = Xn * lab2xyz(x);\n        y = Yn * lab2xyz(y);\n        z = Zn * lab2xyz(z);\n        return new (0, _colorJs.Rgb)(lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity);\n    }\n}));\nfunction xyz2lab(t) {\n    return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\nfunction lab2xyz(t) {\n    return t > t1 ? t * t * t : t2 * (t - t0);\n}\nfunction lrgb2rgb(x) {\n    return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\nfunction rgb2lrgb(x) {\n    return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\nfunction hclConvert(o) {\n    if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n    if (!(o instanceof Lab)) o = labConvert(o);\n    if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n    var h = Math.atan2(o.b, o.a) * (0, _mathJs.degrees);\n    return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\nfunction lch(l, c, h, opacity) {\n    return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\nfunction hcl(h, c, l, opacity) {\n    return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\nfunction Hcl(h, c, l, opacity) {\n    this.h = +h;\n    this.c = +c;\n    this.l = +l;\n    this.opacity = +opacity;\n}\nfunction hcl2lab(o) {\n    if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n    var h = o.h * (0, _mathJs.radians);\n    return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n(0, _defineJsDefault.default)(Hcl, hcl, (0, _defineJs.extend)((0, _colorJs.Color), {\n    brighter: function(k) {\n        return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n    },\n    darker: function(k) {\n        return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n    },\n    rgb: function() {\n        return hcl2lab(this).rgb();\n    }\n}));\n\n},{\"./define.js\":\"bavHA\",\"./color.js\":\"4Sct2\",\"./math.js\":\"5IAFc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5IAFc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"radians\", ()=>radians);\nparcelHelpers.export(exports, \"degrees\", ()=>degrees);\nconst radians = Math.PI / 180;\nconst degrees = 180 / Math.PI;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1AVio\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Cubehelix\", ()=>Cubehelix);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nvar _colorJs = require(\"./color.js\");\nvar _mathJs = require(\"./math.js\");\nvar A = -0.14861, B = 1.78277, C = -0.29227, D = -0.90649, E = 1.97294, ED = E * D, EB = E * B, BC_DA = B * C - D * A;\nfunction cubehelixConvert(o) {\n    if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof (0, _colorJs.Rgb))) o = (0, _colorJs.rgbConvert)(o);\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), h = s ? Math.atan2(k, bl) * (0, _mathJs.degrees) - 120 : NaN;\n    return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\nfunction cubehelix(h, s, l, opacity) {\n    return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\nexports.default = cubehelix;\nfunction Cubehelix(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Cubehelix, cubehelix, (0, _defineJs.extend)((0, _colorJs.Color), {\n    brighter: function(k) {\n        k = k == null ? (0, _colorJs.brighter) : Math.pow((0, _colorJs.brighter), k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? (0, _colorJs.darker) : Math.pow((0, _colorJs.darker), k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = isNaN(this.h) ? 0 : (this.h + 120) * (0, _mathJs.radians), l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh = Math.cos(h), sinh = Math.sin(h);\n        return new (0, _colorJs.Rgb)(255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity);\n    }\n}));\n\n},{\"./define.js\":\"bavHA\",\"./color.js\":\"4Sct2\",\"./math.js\":\"5IAFc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4K8jq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"rgbBasis\", ()=>rgbBasis);\nparcelHelpers.export(exports, \"rgbBasisClosed\", ()=>rgbBasisClosed);\nvar _d3Color = require(\"d3-color\");\nvar _basisJs = require(\"./basis.js\");\nvar _basisJsDefault = parcelHelpers.interopDefault(_basisJs);\nvar _basisClosedJs = require(\"./basisClosed.js\");\nvar _basisClosedJsDefault = parcelHelpers.interopDefault(_basisClosedJs);\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nexports.default = function rgbGamma(y) {\n    var color = (0, _colorJs.gamma)(y);\n    function rgb(start, end) {\n        var r = color((start = (0, _d3Color.rgb)(start)).r, (end = (0, _d3Color.rgb)(end)).r), g = color(start.g, end.g), b = color(start.b, end.b), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n        return function(t) {\n            start.r = r(t);\n            start.g = g(t);\n            start.b = b(t);\n            start.opacity = opacity(t);\n            return start + \"\";\n        };\n    }\n    rgb.gamma = rgbGamma;\n    return rgb;\n}(1);\nfunction rgbSpline(spline) {\n    return function(colors) {\n        var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color;\n        for(i = 0; i < n; ++i){\n            color = (0, _d3Color.rgb)(colors[i]);\n            r[i] = color.r || 0;\n            g[i] = color.g || 0;\n            b[i] = color.b || 0;\n        }\n        r = spline(r);\n        g = spline(g);\n        b = spline(b);\n        color.opacity = 1;\n        return function(t) {\n            color.r = r(t);\n            color.g = g(t);\n            color.b = b(t);\n            return color + \"\";\n        };\n    };\n}\nvar rgbBasis = rgbSpline((0, _basisJsDefault.default));\nvar rgbBasisClosed = rgbSpline((0, _basisClosedJsDefault.default));\n\n},{\"d3-color\":\"2I9cJ\",\"./basis.js\":\"5WSWe\",\"./basisClosed.js\":\"5lu5D\",\"./color.js\":\"3c8Il\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5WSWe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"basis\", ()=>basis);\nfunction basis(t1, v0, v1, v2, v3) {\n    var t2 = t1 * t1, t3 = t2 * t1;\n    return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;\n}\nexports.default = function(values) {\n    var n = values.length - 1;\n    return function(t) {\n        var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n        return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5lu5D\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _basisJs = require(\"./basis.js\");\nexports.default = function(values) {\n    var n = values.length;\n    return function(t) {\n        var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];\n        return (0, _basisJs.basis)((t - i / n) * n, v0, v1, v2, v3);\n    };\n};\n\n},{\"./basis.js\":\"5WSWe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3c8Il\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hue\", ()=>hue);\nparcelHelpers.export(exports, \"gamma\", ()=>gamma);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nfunction linear(a, d) {\n    return function(t) {\n        return a + t * d;\n    };\n}\nfunction exponential(a, b, y) {\n    return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n        return Math.pow(a + t * b, y);\n    };\n}\nfunction hue(a, b) {\n    var d = b - a;\n    return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : (0, _constantJsDefault.default)(isNaN(a) ? b : a);\n}\nfunction gamma(y) {\n    return (y = +y) === 1 ? nogamma : function(a, b) {\n        return b - a ? exponential(a, b, y) : (0, _constantJsDefault.default)(isNaN(a) ? b : a);\n    };\n}\nfunction nogamma(a, b) {\n    var d = b - a;\n    return d ? linear(a, d) : (0, _constantJsDefault.default)(isNaN(a) ? b : a);\n}\nexports.default = nogamma;\n\n},{\"./constant.js\":\"cPXJi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cPXJi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = (x)=>()=>x;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6w2qi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"genericArray\", ()=>genericArray);\nvar _valueJs = require(\"./value.js\");\nvar _valueJsDefault = parcelHelpers.interopDefault(_valueJs);\nvar _numberArrayJs = require(\"./numberArray.js\");\nvar _numberArrayJsDefault = parcelHelpers.interopDefault(_numberArrayJs);\nexports.default = function(a, b) {\n    return ((0, _numberArrayJs.isNumberArray)(b) ? (0, _numberArrayJsDefault.default) : genericArray)(a, b);\n};\nfunction genericArray(a, b) {\n    var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i;\n    for(i = 0; i < na; ++i)x[i] = (0, _valueJsDefault.default)(a[i], b[i]);\n    for(; i < nb; ++i)c[i] = b[i];\n    return function(t) {\n        for(i = 0; i < na; ++i)c[i] = x[i](t);\n        return c;\n    };\n}\n\n},{\"./value.js\":\"g5oI1\",\"./numberArray.js\":\"fC5Lm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fC5Lm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isNumberArray\", ()=>isNumberArray);\nexports.default = function(a, b) {\n    if (!b) b = [];\n    var n = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i;\n    return function(t) {\n        for(i = 0; i < n; ++i)c[i] = a[i] * (1 - t) + b[i] * t;\n        return c;\n    };\n};\nfunction isNumberArray(x) {\n    return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eXHAc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    var d = new Date;\n    return a = +a, b = +b, function(t) {\n        return d.setTime(a * (1 - t) + b * t), d;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aOAbv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    return a = +a, b = +b, function(t) {\n        return a * (1 - t) + b * t;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lV6Np\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _valueJs = require(\"./value.js\");\nvar _valueJsDefault = parcelHelpers.interopDefault(_valueJs);\nexports.default = function(a, b) {\n    var i = {}, c = {}, k;\n    if (a === null || typeof a !== \"object\") a = {};\n    if (b === null || typeof b !== \"object\") b = {};\n    for(k in b)if (k in a) i[k] = (0, _valueJsDefault.default)(a[k], b[k]);\n    else c[k] = b[k];\n    return function(t) {\n        for(k in i)c[k] = i[k](t);\n        return c;\n    };\n};\n\n},{\"./value.js\":\"g5oI1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hOO9Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, reB = new RegExp(reA.source, \"g\");\nfunction zero(b) {\n    return function() {\n        return b;\n    };\n}\nfunction one(b) {\n    return function(t) {\n        return b(t) + \"\";\n    };\n}\nexports.default = function(a, b) {\n    var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i1 = -1, s = [], q = []; // number interpolators\n    // Coerce inputs to strings.\n    a = a + \"\", b = b + \"\";\n    // Interpolate pairs of numbers in a & b.\n    while((am = reA.exec(a)) && (bm = reB.exec(b))){\n        if ((bs = bm.index) > bi) {\n            bs = b.slice(bi, bs);\n            if (s[i1]) s[i1] += bs; // coalesce with previous string\n            else s[++i1] = bs;\n        }\n        if ((am = am[0]) === (bm = bm[0])) {\n            if (s[i1]) s[i1] += bm; // coalesce with previous string\n            else s[++i1] = bm;\n        } else {\n            s[++i1] = null;\n            q.push({\n                i: i1,\n                x: (0, _numberJsDefault.default)(am, bm)\n            });\n        }\n        bi = reB.lastIndex;\n    }\n    // Add remains of b.\n    if (bi < b.length) {\n        bs = b.slice(bi);\n        if (s[i1]) s[i1] += bs; // coalesce with previous string\n        else s[++i1] = bs;\n    }\n    // Special optimization for only a single match.\n    // Otherwise, interpolate each of the numbers and rejoin the string.\n    return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function(t) {\n        for(var i = 0, o; i < b; ++i)s[(o = q[i]).i] = o.x(t);\n        return s.join(\"\");\n    });\n};\n\n},{\"./number.js\":\"aOAbv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4QG3L\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(range) {\n    var n = range.length;\n    return function(t) {\n        return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eGZGV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _colorJs = require(\"./color.js\");\nexports.default = function(a, b) {\n    var i = (0, _colorJs.hue)(+a, +b);\n    return function(t) {\n        var x = i(t);\n        return x - 360 * Math.floor(x / 360);\n    };\n};\n\n},{\"./color.js\":\"3c8Il\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k1Pk4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    return a = +a, b = +b, function(t) {\n        return Math.round(a * (1 - t) + b * t);\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b6cE0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"interpolateTransformCss\", ()=>interpolateTransformCss);\nparcelHelpers.export(exports, \"interpolateTransformSvg\", ()=>interpolateTransformSvg);\nvar _numberJs = require(\"../number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar _parseJs = require(\"./parse.js\");\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n    function pop(s) {\n        return s.length ? s.pop() + \" \" : \"\";\n    }\n    function translate(xa, ya, xb, yb, s, q) {\n        if (xa !== xb || ya !== yb) {\n            var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n            q.push({\n                i: i - 4,\n                x: (0, _numberJsDefault.default)(xa, xb)\n            }, {\n                i: i - 2,\n                x: (0, _numberJsDefault.default)(ya, yb)\n            });\n        } else if (xb || yb) s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n    }\n    function rotate(a, b, s, q) {\n        if (a !== b) {\n            if (a - b > 180) b += 360;\n            else if (b - a > 180) a += 360; // shortest path\n            q.push({\n                i: s.push(pop(s) + \"rotate(\", null, degParen) - 2,\n                x: (0, _numberJsDefault.default)(a, b)\n            });\n        } else if (b) s.push(pop(s) + \"rotate(\" + b + degParen);\n    }\n    function skewX(a, b, s, q) {\n        if (a !== b) q.push({\n            i: s.push(pop(s) + \"skewX(\", null, degParen) - 2,\n            x: (0, _numberJsDefault.default)(a, b)\n        });\n        else if (b) s.push(pop(s) + \"skewX(\" + b + degParen);\n    }\n    function scale(xa, ya, xb, yb, s, q) {\n        if (xa !== xb || ya !== yb) {\n            var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n            q.push({\n                i: i - 4,\n                x: (0, _numberJsDefault.default)(xa, xb)\n            }, {\n                i: i - 2,\n                x: (0, _numberJsDefault.default)(ya, yb)\n            });\n        } else if (xb !== 1 || yb !== 1) s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n    }\n    return function(a, b) {\n        var s = [], q = []; // number interpolators\n        a = parse(a), b = parse(b);\n        translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n        rotate(a.rotate, b.rotate, s, q);\n        skewX(a.skewX, b.skewX, s, q);\n        scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n        a = b = null; // gc\n        return function(t) {\n            var i = -1, n = q.length, o;\n            while(++i < n)s[(o = q[i]).i] = o.x(t);\n            return s.join(\"\");\n        };\n    };\n}\nvar interpolateTransformCss = interpolateTransform((0, _parseJs.parseCss), \"px, \", \"px)\", \"deg)\");\nvar interpolateTransformSvg = interpolateTransform((0, _parseJs.parseSvg), \", \", \")\", \")\");\n\n},{\"../number.js\":\"aOAbv\",\"./parse.js\":\"lGyQv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lGyQv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/* eslint-disable no-undef */ parcelHelpers.export(exports, \"parseCss\", ()=>parseCss);\nparcelHelpers.export(exports, \"parseSvg\", ()=>parseSvg);\nvar _decomposeJs = require(\"./decompose.js\");\nvar _decomposeJsDefault = parcelHelpers.interopDefault(_decomposeJs);\nvar svgNode;\nfunction parseCss(value) {\n    const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n    return m.isIdentity ? (0, _decomposeJs.identity) : (0, _decomposeJsDefault.default)(m.a, m.b, m.c, m.d, m.e, m.f);\n}\nfunction parseSvg(value) {\n    if (value == null) return 0, _decomposeJs.identity;\n    if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n    svgNode.setAttribute(\"transform\", value);\n    if (!(value = svgNode.transform.baseVal.consolidate())) return 0, _decomposeJs.identity;\n    value = value.matrix;\n    return (0, _decomposeJsDefault.default)(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n\n},{\"./decompose.js\":\"9EbKw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9EbKw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"identity\", ()=>identity);\nvar degrees = 180 / Math.PI;\nvar identity = {\n    translateX: 0,\n    translateY: 0,\n    rotate: 0,\n    skewX: 0,\n    scaleX: 1,\n    scaleY: 1\n};\nexports.default = function(a, b, c, d, e, f) {\n    var scaleX, scaleY, skewX;\n    if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n    if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n    if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n    if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n    return {\n        translateX: e,\n        translateY: f,\n        rotate: Math.atan2(b, a) * degrees,\n        skewX: Math.atan(skewX) * degrees,\n        scaleX: scaleX,\n        scaleY: scaleY\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cJyFe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar epsilon2 = 1e-12;\nfunction cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n}\nfunction sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n}\nfunction tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\nexports.default = function zoomRho(rho, rho2, rho4) {\n    // p0 = [ux0, uy0, w0]\n    // p1 = [ux1, uy1, w1]\n    function zoom(p0, p1) {\n        var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n        // Special case for u0 ≅ u1.\n        if (d2 < epsilon2) {\n            S = Math.log(w1 / w0) / rho;\n            i = function(t) {\n                return [\n                    ux0 + t * dx,\n                    uy0 + t * dy,\n                    w0 * Math.exp(rho * t * S)\n                ];\n            };\n        } else {\n            var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n            S = (r1 - r0) / rho;\n            i = function(t) {\n                var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n                return [\n                    ux0 + u * dx,\n                    uy0 + u * dy,\n                    w0 * coshr0 / cosh(rho * s + r0)\n                ];\n            };\n        }\n        i.duration = S * 1000 * rho / Math.SQRT2;\n        return i;\n    }\n    zoom.rho = function(_) {\n        var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n        return zoomRho(_1, _2, _4);\n    };\n    return zoom;\n}(Math.SQRT2, 2, 4);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3szOU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hslLong\", ()=>hslLong);\nvar _d3Color = require(\"d3-color\");\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nfunction hsl(hue) {\n    return function(start, end) {\n        var h = hue((start = (0, _d3Color.hsl)(start)).h, (end = (0, _d3Color.hsl)(end)).h), s = (0, _colorJsDefault.default)(start.s, end.s), l = (0, _colorJsDefault.default)(start.l, end.l), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n        return function(t) {\n            start.h = h(t);\n            start.s = s(t);\n            start.l = l(t);\n            start.opacity = opacity(t);\n            return start + \"\";\n        };\n    };\n}\nexports.default = hsl((0, _colorJs.hue));\nvar hslLong = hsl((0, _colorJsDefault.default));\n\n},{\"d3-color\":\"2I9cJ\",\"./color.js\":\"3c8Il\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5L1if\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Color = require(\"d3-color\");\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nfunction lab(start, end) {\n    var l = (0, _colorJsDefault.default)((start = (0, _d3Color.lab)(start)).l, (end = (0, _d3Color.lab)(end)).l), a = (0, _colorJsDefault.default)(start.a, end.a), b = (0, _colorJsDefault.default)(start.b, end.b), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n    return function(t) {\n        start.l = l(t);\n        start.a = a(t);\n        start.b = b(t);\n        start.opacity = opacity(t);\n        return start + \"\";\n    };\n}\nexports.default = lab;\n\n},{\"d3-color\":\"2I9cJ\",\"./color.js\":\"3c8Il\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8zfWm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hclLong\", ()=>hclLong);\nvar _d3Color = require(\"d3-color\");\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nfunction hcl(hue) {\n    return function(start, end) {\n        var h = hue((start = (0, _d3Color.hcl)(start)).h, (end = (0, _d3Color.hcl)(end)).h), c = (0, _colorJsDefault.default)(start.c, end.c), l = (0, _colorJsDefault.default)(start.l, end.l), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n        return function(t) {\n            start.h = h(t);\n            start.c = c(t);\n            start.l = l(t);\n            start.opacity = opacity(t);\n            return start + \"\";\n        };\n    };\n}\nexports.default = hcl((0, _colorJs.hue));\nvar hclLong = hcl((0, _colorJsDefault.default));\n\n},{\"d3-color\":\"2I9cJ\",\"./color.js\":\"3c8Il\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jji77\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cubehelixLong\", ()=>cubehelixLong);\nvar _d3Color = require(\"d3-color\");\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nfunction cubehelix(hue) {\n    return function cubehelixGamma(y) {\n        y = +y;\n        function cubehelix1(start, end) {\n            var h = hue((start = (0, _d3Color.cubehelix)(start)).h, (end = (0, _d3Color.cubehelix)(end)).h), s = (0, _colorJsDefault.default)(start.s, end.s), l = (0, _colorJsDefault.default)(start.l, end.l), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n            return function(t) {\n                start.h = h(t);\n                start.s = s(t);\n                start.l = l(Math.pow(t, y));\n                start.opacity = opacity(t);\n                return start + \"\";\n            };\n        }\n        cubehelix1.gamma = cubehelixGamma;\n        return cubehelix1;\n    }(1);\n}\nexports.default = cubehelix((0, _colorJs.hue));\nvar cubehelixLong = cubehelix((0, _colorJsDefault.default));\n\n},{\"d3-color\":\"2I9cJ\",\"./color.js\":\"3c8Il\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"43IcW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _valueJs = require(\"./value.js\");\nvar _valueJsDefault = parcelHelpers.interopDefault(_valueJs);\nfunction piecewise(interpolate, values) {\n    if (values === undefined) values = interpolate, interpolate = (0, _valueJsDefault.default);\n    var i1 = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);\n    while(i1 < n)I[i1] = interpolate(v, v = values[++i1]);\n    return function(t) {\n        var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n        return I[i](t - i);\n    };\n}\nexports.default = piecewise;\n\n},{\"./value.js\":\"g5oI1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9FyXn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(interpolator, n) {\n    var samples = new Array(n);\n    for(var i = 0; i < n; ++i)samples[i] = interpolator(i / (n - 1));\n    return samples;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kc0ku\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction constants(x) {\n    return function() {\n        return x;\n    };\n}\nexports.default = constants;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1GMBF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction number(x) {\n    return +x;\n}\nexports.default = number;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"efWLG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initRange\", ()=>initRange);\nparcelHelpers.export(exports, \"initInterpolator\", ()=>initInterpolator);\nfunction initRange(domain, range) {\n    switch(arguments.length){\n        case 0:\n            break;\n        case 1:\n            this.range(domain);\n            break;\n        default:\n            this.range(range).domain(domain);\n            break;\n    }\n    return this;\n}\nfunction initInterpolator(domain, interpolator) {\n    switch(arguments.length){\n        case 0:\n            break;\n        case 1:\n            if (typeof domain === \"function\") this.interpolator(domain);\n            else this.range(domain);\n            break;\n        default:\n            this.domain(domain);\n            if (typeof interpolator === \"function\") this.interpolator(interpolator);\n            else this.range(interpolator);\n            break;\n    }\n    return this;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bbchH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _d3Format = require(\"d3-format\");\nfunction tickFormat(start, stop, count, specifier) {\n    var step = (0, _d3Array.tickStep)(start, stop, count), precision;\n    specifier = (0, _d3Format.formatSpecifier)(specifier == null ? \",f\" : specifier);\n    switch(specifier.type){\n        case \"s\":\n            var value = Math.max(Math.abs(start), Math.abs(stop));\n            if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionPrefix)(step, value))) specifier.precision = precision;\n            return (0, _d3Format.formatPrefix)(specifier, value);\n        case \"\":\n        case \"e\":\n        case \"g\":\n        case \"p\":\n        case \"r\":\n            if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionRound)(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n            break;\n        case \"f\":\n        case \"%\":\n            if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionFixed)(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n            break;\n    }\n    return (0, _d3Format.format)(specifier);\n}\nexports.default = tickFormat;\n\n},{\"d3-array\":\"8JMcC\",\"d3-format\":\"l5DiZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fjlvX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"loggish\", ()=>loggish);\nvar _d3Array = require(\"d3-array\");\nvar _d3Format = require(\"d3-format\");\nvar _niceJs = require(\"./nice.js\");\nvar _niceJsDefault = parcelHelpers.interopDefault(_niceJs);\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nfunction transformLog(x) {\n    return Math.log(x);\n}\nfunction transformExp(x) {\n    return Math.exp(x);\n}\nfunction transformLogn(x) {\n    return -Math.log(-x);\n}\nfunction transformExpn(x) {\n    return -Math.exp(-x);\n}\nfunction pow10(x) {\n    return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\nfunction powp(base) {\n    return base === 10 ? pow10 : base === Math.E ? Math.exp : function(x) {\n        return Math.pow(base, x);\n    };\n}\nfunction logp(base) {\n    return base === Math.E ? Math.log : base === 10 && Math.log10 || base === 2 && Math.log2 || (base = Math.log(base), function(x) {\n        return Math.log(x) / base;\n    });\n}\nfunction reflect(f) {\n    return function(x) {\n        return -f(-x);\n    };\n}\nfunction loggish(transform) {\n    var scale = transform(transformLog, transformExp), domain = scale.domain, base = 10, logs, pows;\n    function rescale() {\n        logs = logp(base), pows = powp(base);\n        if (domain()[0] < 0) {\n            logs = reflect(logs), pows = reflect(pows);\n            transform(transformLogn, transformExpn);\n        } else transform(transformLog, transformExp);\n        return scale;\n    }\n    scale.base = function(_) {\n        return arguments.length ? (base = +_, rescale()) : base;\n    };\n    scale.domain = function(_) {\n        return arguments.length ? (domain(_), rescale()) : domain();\n    };\n    scale.ticks = function(count) {\n        var d = domain(), u = d[0], v = d[d.length - 1], r;\n        if (r = v < u) i = u, u = v, v = i;\n        var i = logs(u), j = logs(v), p, k, t, n = count == null ? 10 : +count, z = [];\n        if (!(base % 1) && j - i < n) {\n            i = Math.floor(i), j = Math.ceil(j);\n            if (u > 0) for(; i <= j; ++i)for(k = 1, p = pows(i); k < base; ++k){\n                t = p * k;\n                if (t < u) continue;\n                if (t > v) break;\n                z.push(t);\n            }\n            else for(; i <= j; ++i)for(k = base - 1, p = pows(i); k >= 1; --k){\n                t = p * k;\n                if (t < u) continue;\n                if (t > v) break;\n                z.push(t);\n            }\n            if (z.length * 2 < n) z = (0, _d3Array.ticks)(u, v, n);\n        } else z = (0, _d3Array.ticks)(i, j, Math.min(j - i, n)).map(pows);\n        return r ? z.reverse() : z;\n    };\n    scale.tickFormat = function(count, specifier) {\n        if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n        if (typeof specifier !== \"function\") specifier = (0, _d3Format.format)(specifier);\n        if (count === Infinity) return specifier;\n        if (count == null) count = 10;\n        var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n        return function(d) {\n            var i = d / pows(Math.round(logs(d)));\n            if (i * base < base - 0.5) i *= base;\n            return i <= k ? specifier(d) : \"\";\n        };\n    };\n    scale.nice = function() {\n        return domain((0, _niceJsDefault.default)(domain(), {\n            floor: function(x) {\n                return pows(Math.floor(logs(x)));\n            },\n            ceil: function(x) {\n                return pows(Math.ceil(logs(x)));\n            }\n        }));\n    };\n    return scale;\n}\nfunction log() {\n    var scale = loggish((0, _continuousJs.transformer)()).domain([\n        1,\n        10\n    ]);\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, log()).base(scale.base());\n    };\n    (0, _initJs.initRange).apply(scale, arguments);\n    return scale;\n}\nexports.default = log;\n\n},{\"d3-array\":\"8JMcC\",\"d3-format\":\"l5DiZ\",\"./nice.js\":\"1mSns\",\"./continuous.js\":\"Mo65z\",\"./init.js\":\"efWLG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1mSns\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction nice(domain, interval) {\n    domain = domain.slice();\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], t;\n    if (x1 < x0) {\n        t = i0, i0 = i1, i1 = t;\n        t = x0, x0 = x1, x1 = t;\n    }\n    domain[i0] = interval.floor(x0);\n    domain[i1] = interval.ceil(x1);\n    return domain;\n}\nexports.default = nice;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jw0HW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"symlogish\", ()=>symlogish);\nvar _linearJs = require(\"./linear.js\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nfunction transformSymlog(c) {\n    return function(x) {\n        return Math.sign(x) * Math.log1p(Math.abs(x / c));\n    };\n}\nfunction transformSymexp(c) {\n    return function(x) {\n        return Math.sign(x) * Math.expm1(Math.abs(x)) * c;\n    };\n}\nfunction symlogish(transform) {\n    var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));\n    scale.constant = function(_) {\n        return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;\n    };\n    return (0, _linearJs.linearish)(scale);\n}\nfunction symlog() {\n    var scale = symlogish((0, _continuousJs.transformer)());\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, symlog()).constant(scale.constant());\n    };\n    return (0, _initJs.initRange).apply(scale, arguments);\n}\nexports.default = symlog;\n\n},{\"./linear.js\":\"2Mb1X\",\"./continuous.js\":\"Mo65z\",\"./init.js\":\"efWLG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l4AYv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"implicit\", ()=>implicit);\nvar _initJs = require(\"./init.js\");\nconst implicit = Symbol(\"implicit\");\nfunction ordinal() {\n    var index = new Map(), domain = [], range = [], unknown = implicit;\n    function scale(d) {\n        var key = d + \"\", i = index.get(key);\n        if (!i) {\n            if (unknown !== implicit) return unknown;\n            index.set(key, i = domain.push(d));\n        }\n        return range[(i - 1) % range.length];\n    }\n    scale.domain = function(_) {\n        if (!arguments.length) return domain.slice();\n        domain = [], index = new Map();\n        for (const value of _){\n            const key = value + \"\";\n            if (index.has(key)) continue;\n            index.set(key, domain.push(value));\n        }\n        return scale;\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), scale) : range.slice();\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    scale.copy = function() {\n        return ordinal(domain, range).unknown(unknown);\n    };\n    (0, _initJs.initRange).apply(scale, arguments);\n    return scale;\n}\nexports.default = ordinal;\n\n},{\"./init.js\":\"efWLG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a3E7U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"powish\", ()=>powish);\nparcelHelpers.export(exports, \"sqrt\", ()=>sqrt);\nvar _linearJs = require(\"./linear.js\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nfunction transformPow(exponent) {\n    return function(x) {\n        return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n    };\n}\nfunction transformSqrt(x) {\n    return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\nfunction transformSquare(x) {\n    return x < 0 ? -x * x : x * x;\n}\nfunction powish(transform) {\n    var scale = transform((0, _continuousJs.identity), (0, _continuousJs.identity)), exponent = 1;\n    function rescale() {\n        return exponent === 1 ? transform((0, _continuousJs.identity), (0, _continuousJs.identity)) : exponent === 0.5 ? transform(transformSqrt, transformSquare) : transform(transformPow(exponent), transformPow(1 / exponent));\n    }\n    scale.exponent = function(_) {\n        return arguments.length ? (exponent = +_, rescale()) : exponent;\n    };\n    return (0, _linearJs.linearish)(scale);\n}\nfunction pow() {\n    var scale = powish((0, _continuousJs.transformer)());\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, pow()).exponent(scale.exponent());\n    };\n    (0, _initJs.initRange).apply(scale, arguments);\n    return scale;\n}\nexports.default = pow;\nfunction sqrt() {\n    return pow.apply(null, arguments).exponent(0.5);\n}\n\n},{\"./linear.js\":\"2Mb1X\",\"./continuous.js\":\"Mo65z\",\"./init.js\":\"efWLG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8l8gh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _initJs = require(\"./init.js\");\nfunction quantile() {\n    var domain = [], range = [], thresholds = [], unknown;\n    function rescale() {\n        var i = 0, n = Math.max(1, range.length);\n        thresholds = new Array(n - 1);\n        while(++i < n)thresholds[i - 1] = (0, _d3Array.quantileSorted)(domain, i / n);\n        return scale;\n    }\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : range[(0, _d3Array.bisect)(thresholds, x)];\n    }\n    scale.invertExtent = function(y) {\n        var i = range.indexOf(y);\n        return i < 0 ? [\n            NaN,\n            NaN\n        ] : [\n            i > 0 ? thresholds[i - 1] : domain[0],\n            i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n        ];\n    };\n    scale.domain = function(_) {\n        if (!arguments.length) return domain.slice();\n        domain = [];\n        for (let d of _)if (d != null && !isNaN(d = +d)) domain.push(d);\n        domain.sort((0, _d3Array.ascending));\n        return rescale();\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    scale.quantiles = function() {\n        return thresholds.slice();\n    };\n    scale.copy = function() {\n        return quantile().domain(domain).range(range).unknown(unknown);\n    };\n    return (0, _initJs.initRange).apply(scale, arguments);\n}\nexports.default = quantile;\n\n},{\"d3-array\":\"8JMcC\",\"./init.js\":\"efWLG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"asmDg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _linearJs = require(\"./linear.js\");\nvar _initJs = require(\"./init.js\");\nfunction quantize() {\n    var x0 = 0, x1 = 1, n = 1, domain = [\n        0.5\n    ], range = [\n        0,\n        1\n    ], unknown;\n    function scale(x) {\n        return x != null && x <= x ? range[(0, _d3Array.bisect)(domain, x, 0, n)] : unknown;\n    }\n    function rescale() {\n        var i = -1;\n        domain = new Array(n);\n        while(++i < n)domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n        return scale;\n    }\n    scale.domain = function(_) {\n        return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [\n            x0,\n            x1\n        ];\n    };\n    scale.range = function(_) {\n        return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();\n    };\n    scale.invertExtent = function(y) {\n        var i = range.indexOf(y);\n        return i < 0 ? [\n            NaN,\n            NaN\n        ] : i < 1 ? [\n            x0,\n            domain[0]\n        ] : i >= n ? [\n            domain[n - 1],\n            x1\n        ] : [\n            domain[i - 1],\n            domain[i]\n        ];\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : scale;\n    };\n    scale.thresholds = function() {\n        return domain.slice();\n    };\n    scale.copy = function() {\n        return quantize().domain([\n            x0,\n            x1\n        ]).range(range).unknown(unknown);\n    };\n    return (0, _initJs.initRange).apply((0, _linearJs.linearish)(scale), arguments);\n}\nexports.default = quantize;\n\n},{\"d3-array\":\"8JMcC\",\"./linear.js\":\"2Mb1X\",\"./init.js\":\"efWLG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bXV4m\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _initJs = require(\"./init.js\");\nfunction threshold() {\n    var domain = [\n        0.5\n    ], range = [\n        0,\n        1\n    ], unknown, n = 1;\n    function scale(x) {\n        return x != null && x <= x ? range[(0, _d3Array.bisect)(domain, x, 0, n)] : unknown;\n    }\n    scale.domain = function(_) {\n        return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n    };\n    scale.invertExtent = function(y) {\n        var i = range.indexOf(y);\n        return [\n            domain[i - 1],\n            domain[i]\n        ];\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    scale.copy = function() {\n        return threshold().domain(domain).range(range).unknown(unknown);\n    };\n    return (0, _initJs.initRange).apply(scale, arguments);\n}\nexports.default = threshold;\n\n},{\"d3-array\":\"8JMcC\",\"./init.js\":\"efWLG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hf0gG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"calendar\", ()=>calendar);\nvar _d3Time = require(\"d3-time\");\nvar _d3TimeFormat = require(\"d3-time-format\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _continuousJsDefault = parcelHelpers.interopDefault(_continuousJs);\nvar _initJs = require(\"./init.js\");\nvar _niceJs = require(\"./nice.js\");\nvar _niceJsDefault = parcelHelpers.interopDefault(_niceJs);\nfunction date(t) {\n    return new Date(t);\n}\nfunction number(t) {\n    return t instanceof Date ? +t : +new Date(+t);\n}\nfunction calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) {\n    var scale = (0, _continuousJsDefault.default)(), invert = scale.invert, domain = scale.domain;\n    var formatMillisecond = format(\".%L\"), formatSecond = format(\":%S\"), formatMinute = format(\"%I:%M\"), formatHour = format(\"%I %p\"), formatDay = format(\"%a %d\"), formatWeek = format(\"%b %d\"), formatMonth = format(\"%B\"), formatYear = format(\"%Y\");\n    function tickFormat(date1) {\n        return (second(date1) < date1 ? formatMillisecond : minute(date1) < date1 ? formatSecond : hour(date1) < date1 ? formatMinute : day(date1) < date1 ? formatHour : month(date1) < date1 ? week(date1) < date1 ? formatDay : formatWeek : year(date1) < date1 ? formatMonth : formatYear)(date1);\n    }\n    scale.invert = function(y) {\n        return new Date(invert(y));\n    };\n    scale.domain = function(_) {\n        return arguments.length ? domain(Array.from(_, number)) : domain().map(date);\n    };\n    scale.ticks = function(interval) {\n        var d = domain();\n        return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval);\n    };\n    scale.tickFormat = function(count, specifier) {\n        return specifier == null ? tickFormat : format(specifier);\n    };\n    scale.nice = function(interval) {\n        var d = domain();\n        if (!interval || typeof interval.range !== \"function\") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval);\n        return interval ? domain((0, _niceJsDefault.default)(d, interval)) : scale;\n    };\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format));\n    };\n    return scale;\n}\nfunction time() {\n    return (0, _initJs.initRange).apply(calendar((0, _d3Time.timeTicks), (0, _d3Time.timeTickInterval), (0, _d3Time.timeYear), (0, _d3Time.timeMonth), (0, _d3Time.timeWeek), (0, _d3Time.timeDay), (0, _d3Time.timeHour), (0, _d3Time.timeMinute), (0, _d3Time.timeSecond), (0, _d3TimeFormat.timeFormat)).domain([\n        new Date(2000, 0, 1),\n        new Date(2000, 0, 2)\n    ]), arguments);\n}\nexports.default = time;\n\n},{\"d3-time\":\"l42HK\",\"d3-time-format\":\"gQBqt\",\"./continuous.js\":\"Mo65z\",\"./init.js\":\"efWLG\",\"./nice.js\":\"1mSns\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gH413\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Time = require(\"d3-time\");\nvar _d3TimeFormat = require(\"d3-time-format\");\nvar _timeJs = require(\"./time.js\");\nvar _initJs = require(\"./init.js\");\nfunction utcTime() {\n    return (0, _initJs.initRange).apply((0, _timeJs.calendar)((0, _d3Time.utcTicks), (0, _d3Time.utcTickInterval), (0, _d3Time.utcYear), (0, _d3Time.utcMonth), (0, _d3Time.utcWeek), (0, _d3Time.utcDay), (0, _d3Time.utcHour), (0, _d3Time.utcMinute), (0, _d3Time.utcSecond), (0, _d3TimeFormat.utcFormat)).domain([\n        Date.UTC(2000, 0, 1),\n        Date.UTC(2000, 0, 2)\n    ]), arguments);\n}\nexports.default = utcTime;\n\n},{\"d3-time\":\"l42HK\",\"d3-time-format\":\"gQBqt\",\"./time.js\":\"hf0gG\",\"./init.js\":\"efWLG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7utjO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"sequentialLog\", ()=>sequentialLog);\nparcelHelpers.export(exports, \"sequentialSymlog\", ()=>sequentialSymlog);\nparcelHelpers.export(exports, \"sequentialPow\", ()=>sequentialPow);\nparcelHelpers.export(exports, \"sequentialSqrt\", ()=>sequentialSqrt);\nvar _d3Interpolate = require(\"d3-interpolate\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nvar _linearJs = require(\"./linear.js\");\nvar _logJs = require(\"./log.js\");\nvar _symlogJs = require(\"./symlog.js\");\nvar _powJs = require(\"./pow.js\");\nfunction transformer() {\n    var x0 = 0, x1 = 1, t0, t1, k10, transform, interpolator = (0, _continuousJs.identity), clamp = false, unknown;\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n    }\n    scale.domain = function(_) {\n        return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [\n            x0,\n            x1\n        ];\n    };\n    scale.clamp = function(_) {\n        return arguments.length ? (clamp = !!_, scale) : clamp;\n    };\n    scale.interpolator = function(_) {\n        return arguments.length ? (interpolator = _, scale) : interpolator;\n    };\n    function range(interpolate) {\n        return function(_) {\n            var r0, r1;\n            return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [\n                interpolator(0),\n                interpolator(1)\n            ];\n        };\n    }\n    scale.range = range((0, _d3Interpolate.interpolate));\n    scale.rangeRound = range((0, _d3Interpolate.interpolateRound));\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    return function(t) {\n        transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n        return scale;\n    };\n}\nfunction copy(source, target) {\n    return target.domain(source.domain()).interpolator(source.interpolator()).clamp(source.clamp()).unknown(source.unknown());\n}\nfunction sequential() {\n    var scale = (0, _linearJs.linearish)(transformer()((0, _continuousJs.identity)));\n    scale.copy = function() {\n        return copy(scale, sequential());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nexports.default = sequential;\nfunction sequentialLog() {\n    var scale = (0, _logJs.loggish)(transformer()).domain([\n        1,\n        10\n    ]);\n    scale.copy = function() {\n        return copy(scale, sequentialLog()).base(scale.base());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction sequentialSymlog() {\n    var scale = (0, _symlogJs.symlogish)(transformer());\n    scale.copy = function() {\n        return copy(scale, sequentialSymlog()).constant(scale.constant());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction sequentialPow() {\n    var scale = (0, _powJs.powish)(transformer());\n    scale.copy = function() {\n        return copy(scale, sequentialPow()).exponent(scale.exponent());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction sequentialSqrt() {\n    return sequentialPow.apply(null, arguments).exponent(0.5);\n}\n\n},{\"d3-interpolate\":\"dQqYJ\",\"./continuous.js\":\"Mo65z\",\"./init.js\":\"efWLG\",\"./linear.js\":\"2Mb1X\",\"./log.js\":\"fjlvX\",\"./symlog.js\":\"jw0HW\",\"./pow.js\":\"a3E7U\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hvyvZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"divergingLog\", ()=>divergingLog);\nparcelHelpers.export(exports, \"divergingSymlog\", ()=>divergingSymlog);\nparcelHelpers.export(exports, \"divergingPow\", ()=>divergingPow);\nparcelHelpers.export(exports, \"divergingSqrt\", ()=>divergingSqrt);\nvar _d3Interpolate = require(\"d3-interpolate\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nvar _linearJs = require(\"./linear.js\");\nvar _logJs = require(\"./log.js\");\nvar _sequentialJs = require(\"./sequential.js\");\nvar _symlogJs = require(\"./symlog.js\");\nvar _powJs = require(\"./pow.js\");\nfunction transformer() {\n    var x0 = 0, x1 = 0.5, x2 = 1, s = 1, t0, t1, t2, k10, k21, interpolator = (0, _continuousJs.identity), transform, clamp = false, unknown;\n    function scale(x) {\n        return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));\n    }\n    scale.domain = function(_) {\n        return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [\n            x0,\n            x1,\n            x2\n        ];\n    };\n    scale.clamp = function(_) {\n        return arguments.length ? (clamp = !!_, scale) : clamp;\n    };\n    scale.interpolator = function(_) {\n        return arguments.length ? (interpolator = _, scale) : interpolator;\n    };\n    function range(interpolate) {\n        return function(_) {\n            var r0, r1, r2;\n            return arguments.length ? ([r0, r1, r2] = _, interpolator = (0, _d3Interpolate.piecewise)(interpolate, [\n                r0,\n                r1,\n                r2\n            ]), scale) : [\n                interpolator(0),\n                interpolator(0.5),\n                interpolator(1)\n            ];\n        };\n    }\n    scale.range = range((0, _d3Interpolate.interpolate));\n    scale.rangeRound = range((0, _d3Interpolate.interpolateRound));\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    return function(t) {\n        transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1;\n        return scale;\n    };\n}\nfunction diverging() {\n    var scale = (0, _linearJs.linearish)(transformer()((0, _continuousJs.identity)));\n    scale.copy = function() {\n        return (0, _sequentialJs.copy)(scale, diverging());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nexports.default = diverging;\nfunction divergingLog() {\n    var scale = (0, _logJs.loggish)(transformer()).domain([\n        0.1,\n        1,\n        10\n    ]);\n    scale.copy = function() {\n        return (0, _sequentialJs.copy)(scale, divergingLog()).base(scale.base());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction divergingSymlog() {\n    var scale = (0, _symlogJs.symlogish)(transformer());\n    scale.copy = function() {\n        return (0, _sequentialJs.copy)(scale, divergingSymlog()).constant(scale.constant());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction divergingPow() {\n    var scale = (0, _powJs.powish)(transformer());\n    scale.copy = function() {\n        return (0, _sequentialJs.copy)(scale, divergingPow()).exponent(scale.exponent());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction divergingSqrt() {\n    return divergingPow.apply(null, arguments).exponent(0.5);\n}\n\n},{\"d3-interpolate\":\"dQqYJ\",\"./continuous.js\":\"Mo65z\",\"./init.js\":\"efWLG\",\"./linear.js\":\"2Mb1X\",\"./log.js\":\"fjlvX\",\"./sequential.js\":\"7utjO\",\"./symlog.js\":\"jw0HW\",\"./pow.js\":\"a3E7U\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"045Ip\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"axisticks\", ()=>AxisTicks);\nparcelHelpers.export(exports, \"datajoin\", ()=>DataJoin);\nparcelHelpers.export(exports, \"encode\", ()=>Encode);\nparcelHelpers.export(exports, \"legendentries\", ()=>LegendEntries);\nparcelHelpers.export(exports, \"linkpath\", ()=>LinkPath);\nparcelHelpers.export(exports, \"pie\", ()=>Pie);\nparcelHelpers.export(exports, \"scale\", ()=>Scale);\nparcelHelpers.export(exports, \"sortitems\", ()=>SortItems);\nparcelHelpers.export(exports, \"stack\", ()=>Stack);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Array = require(\"d3-array\");\nvar _d3Interpolate = require(\"d3-interpolate\");\n/**\n * Generates axis ticks for visualizing a spatial scale.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Scale} params.scale - The scale to generate ticks for.\n * @param {*} [params.count=10] - The approximate number of ticks, or\n *   desired tick interval, to use.\n * @param {Array<*>} [params.values] - The exact tick values to use.\n *   These must be legal domain values for the provided scale.\n *   If provided, the count argument is ignored.\n * @param {function(*):string} [params.formatSpecifier] - A format specifier\n *   to use in conjunction with scale.tickFormat. Legal values are\n *   any valid d3 4.0 format specifier.\n * @param {function(*):string} [params.format] - The format function to use.\n *   If provided, the formatSpecifier argument is ignored.\n */ function AxisTicks(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(AxisTicks, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !_.modified()) return pulse.StopPropagation;\n        var locale = pulse.dataflow.locale(), out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), ticks = this.value, scale = _.scale, tally = _.count == null ? _.values ? _.values.length : 10 : _.count, count = (0, _vegaScale.tickCount)(scale, tally, _.minstep), format = _.format || (0, _vegaScale.tickFormat)(locale, scale, count, _.formatSpecifier, _.formatType, !!_.values), values = _.values ? (0, _vegaScale.validTicks)(scale, _.values, count) : (0, _vegaScale.tickValues)(scale, count);\n        if (ticks) out.rem = ticks;\n        ticks = values.map((value, i)=>(0, _vegaDataflow.ingest)({\n                index: i / (values.length - 1 || 1),\n                value: value,\n                label: format(value)\n            }));\n        if (_.extra && ticks.length) // add an extra tick pegged to the initial domain value\n        // this is used to generate axes with 'binned' domains\n        ticks.push((0, _vegaDataflow.ingest)({\n            index: -1,\n            extra: {\n                value: ticks[0].value\n            },\n            label: \"\"\n        }));\n        out.source = ticks;\n        out.add = ticks;\n        this.value = ticks;\n        return out;\n    }\n});\n/**\n * Joins a set of data elements against a set of visual items.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): object} [params.item] - An item generator function.\n * @param {function(object): *} [params.key] - The key field associating data and visual items.\n */ function DataJoin(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nfunction defaultItemCreate() {\n    return (0, _vegaDataflow.ingest)({});\n}\nfunction newMap(key) {\n    const map = (0, _vegaUtil.fastmap)().test((t)=>t.exit);\n    map.lookup = (t)=>map.get(key(t));\n    return map;\n}\n(0, _vegaUtil.inherits)(DataJoin, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var df = pulse.dataflow, out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), item = _.item || defaultItemCreate, key = _.key || (0, _vegaDataflow.tupleid), map = this.value; // prevent transient (e.g., hover) requests from\n        // cascading across marks derived from marks\n        if ((0, _vegaUtil.isArray)(out.encode)) out.encode = null;\n        if (map && (_.modified(\"key\") || pulse.modified(key))) (0, _vegaUtil.error)(\"DataJoin does not support modified key function or fields.\");\n        if (!map) {\n            pulse = pulse.addAll();\n            this.value = map = newMap(key);\n        }\n        pulse.visit(pulse.ADD, (t)=>{\n            const k = key(t);\n            let x = map.get(k);\n            if (x) {\n                if (x.exit) {\n                    map.empty--;\n                    out.add.push(x);\n                } else out.mod.push(x);\n            } else {\n                x = item(t);\n                map.set(k, x);\n                out.add.push(x);\n            }\n            x.datum = t;\n            x.exit = false;\n        });\n        pulse.visit(pulse.MOD, (t)=>{\n            const k = key(t), x = map.get(k);\n            if (x) {\n                x.datum = t;\n                out.mod.push(x);\n            }\n        });\n        pulse.visit(pulse.REM, (t)=>{\n            const k = key(t), x = map.get(k);\n            if (t === x.datum && !x.exit) {\n                out.rem.push(x);\n                x.exit = true;\n                ++map.empty;\n            }\n        });\n        if (pulse.changed(pulse.ADD_MOD)) out.modifies(\"datum\");\n        if (pulse.clean() || _.clean && map.empty > df.cleanThreshold) df.runAfter(map.clean);\n        return out;\n    }\n});\n/**\n * Invokes encoding functions for visual items.\n * @constructor\n * @param {object} params - The parameters to the encoding functions. This\n *   parameter object will be passed through to all invoked encoding functions.\n * @param {object} [params.mod=false] - Flag indicating if tuples in the input\n *   mod set that are unmodified by encoders should be included in the output.\n * @param {object} param.encoders - The encoding functions\n * @param {function(object, object): boolean} [param.encoders.update] - Update encoding set\n * @param {function(object, object): boolean} [param.encoders.enter] - Enter encoding set\n * @param {function(object, object): boolean} [param.encoders.exit] - Exit encoding set\n */ function Encode(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Encode, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var out = pulse.fork(pulse.ADD_REM), fmod = _.mod || false, encoders = _.encoders, encode = pulse.encode; // if an array, the encode directive includes additional sets\n        // that must be defined in order for the primary set to be invoked\n        // e.g., only run the update set if the hover set is defined\n        if ((0, _vegaUtil.isArray)(encode)) {\n            if (out.changed() || encode.every((e)=>encoders[e])) {\n                encode = encode[0];\n                out.encode = null; // consume targeted encode directive\n            } else return pulse.StopPropagation;\n        } // marshall encoder functions\n        var reenter = encode === \"enter\", update = encoders.update || (0, _vegaUtil.falsy), enter = encoders.enter || (0, _vegaUtil.falsy), exit = encoders.exit || (0, _vegaUtil.falsy), set = (encode && !reenter ? encoders[encode] : update) || (0, _vegaUtil.falsy);\n        if (pulse.changed(pulse.ADD)) {\n            pulse.visit(pulse.ADD, (t)=>{\n                enter(t, _);\n                update(t, _);\n            });\n            out.modifies(enter.output);\n            out.modifies(update.output);\n            if (set !== (0, _vegaUtil.falsy) && set !== update) {\n                pulse.visit(pulse.ADD, (t)=>{\n                    set(t, _);\n                });\n                out.modifies(set.output);\n            }\n        }\n        if (pulse.changed(pulse.REM) && exit !== (0, _vegaUtil.falsy)) {\n            pulse.visit(pulse.REM, (t)=>{\n                exit(t, _);\n            });\n            out.modifies(exit.output);\n        }\n        if (reenter || set !== (0, _vegaUtil.falsy)) {\n            const flag = pulse.MOD | (_.modified() ? pulse.REFLOW : 0);\n            if (reenter) {\n                pulse.visit(flag, (t)=>{\n                    const mod = enter(t, _) || fmod;\n                    if (set(t, _) || mod) out.mod.push(t);\n                });\n                if (out.mod.length) out.modifies(enter.output);\n            } else pulse.visit(flag, (t)=>{\n                if (set(t, _) || fmod) out.mod.push(t);\n            });\n            if (out.mod.length) out.modifies(set.output);\n        }\n        return out.changed() ? out : pulse.StopPropagation;\n    }\n});\n/**\n * Generates legend entries for visualizing a scale.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Scale} params.scale - The scale to generate items for.\n * @param {*} [params.count=5] - The approximate number of items, or\n *   desired tick interval, to use.\n * @param {*} [params.limit] - The maximum number of entries to\n *   include in a symbol legend.\n * @param {Array<*>} [params.values] - The exact tick values to use.\n *   These must be legal domain values for the provided scale.\n *   If provided, the count argument is ignored.\n * @param {string} [params.formatSpecifier] - A format specifier\n *   to use in conjunction with scale.tickFormat. Legal values are\n *   any valid D3 format specifier string.\n * @param {function(*):string} [params.format] - The format function to use.\n *   If provided, the formatSpecifier argument is ignored.\n */ function LegendEntries(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\n(0, _vegaUtil.inherits)(LegendEntries, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value != null && !_.modified()) return pulse.StopPropagation;\n        var locale = pulse.dataflow.locale(), out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), items = this.value, type = _.type || (0, _vegaScale.SymbolLegend), scale = _.scale, limit = +_.limit, count = (0, _vegaScale.tickCount)(scale, _.count == null ? 5 : _.count, _.minstep), lskip = !!_.values || type === (0, _vegaScale.SymbolLegend), format = _.format || (0, _vegaScale.labelFormat)(locale, scale, count, type, _.formatSpecifier, _.formatType, lskip), values = _.values || (0, _vegaScale.labelValues)(scale, count), domain, fraction, size, offset, ellipsis;\n        if (items) out.rem = items;\n        if (type === (0, _vegaScale.SymbolLegend)) {\n            if (limit && values.length > limit) {\n                pulse.dataflow.warn(\"Symbol legend count exceeds limit, filtering items.\");\n                items = values.slice(0, limit - 1);\n                ellipsis = true;\n            } else items = values;\n            if ((0, _vegaUtil.isFunction)(size = _.size)) {\n                // if first value maps to size zero, remove from list (vega#717)\n                if (!_.values && scale(items[0]) === 0) items = items.slice(1);\n                 // compute size offset for legend entries\n                offset = items.reduce((max, value)=>Math.max(max, size(value, _)), 0);\n            } else size = (0, _vegaUtil.constant)(offset = size || 8);\n            items = items.map((value, index)=>(0, _vegaDataflow.ingest)({\n                    index: index,\n                    label: format(value, index, items),\n                    value: value,\n                    offset: offset,\n                    size: size(value, _)\n                }));\n            if (ellipsis) {\n                ellipsis = values[items.length];\n                items.push((0, _vegaDataflow.ingest)({\n                    index: items.length,\n                    label: \"\\u2026\".concat(values.length - items.length, \" entries\"),\n                    value: ellipsis,\n                    offset: offset,\n                    size: size(ellipsis, _)\n                }));\n            }\n        } else if (type === (0, _vegaScale.GradientLegend)) {\n            domain = scale.domain(), fraction = (0, _vegaScale.scaleFraction)(scale, domain[0], (0, _vegaUtil.peek)(domain)); // if automatic label generation produces 2 or fewer values,\n            // use the domain end points instead (fixes vega/vega#1364)\n            if (values.length < 3 && !_.values && domain[0] !== (0, _vegaUtil.peek)(domain)) values = [\n                domain[0],\n                (0, _vegaUtil.peek)(domain)\n            ];\n            items = values.map((value, index)=>(0, _vegaDataflow.ingest)({\n                    index: index,\n                    label: format(value, index, values),\n                    value: value,\n                    perc: fraction(value)\n                }));\n        } else {\n            size = values.length - 1;\n            fraction = (0, _vegaScale.labelFraction)(scale);\n            items = values.map((value, index)=>(0, _vegaDataflow.ingest)({\n                    index: index,\n                    label: format(value, index, values),\n                    value: value,\n                    perc: index ? fraction(value) : 0,\n                    perc2: index === size ? 1 : fraction(values[index + 1])\n                }));\n        }\n        out.source = items;\n        out.add = items;\n        this.value = items;\n        return out;\n    }\n});\nconst sourceX = (t)=>t.source.x;\nconst sourceY = (t)=>t.source.y;\nconst targetX = (t)=>t.target.x;\nconst targetY = (t)=>t.target.y;\n/**\n * Layout paths linking source and target elements.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function LinkPath(params) {\n    (0, _vegaDataflow.Transform).call(this, {}, params);\n}\nLinkPath.Definition = {\n    \"type\": \"LinkPath\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"sourceX\",\n            \"type\": \"field\",\n            \"default\": \"source.x\"\n        },\n        {\n            \"name\": \"sourceY\",\n            \"type\": \"field\",\n            \"default\": \"source.y\"\n        },\n        {\n            \"name\": \"targetX\",\n            \"type\": \"field\",\n            \"default\": \"target.x\"\n        },\n        {\n            \"name\": \"targetY\",\n            \"type\": \"field\",\n            \"default\": \"target.y\"\n        },\n        {\n            \"name\": \"orient\",\n            \"type\": \"enum\",\n            \"default\": \"vertical\",\n            \"values\": [\n                \"horizontal\",\n                \"vertical\",\n                \"radial\"\n            ]\n        },\n        {\n            \"name\": \"shape\",\n            \"type\": \"enum\",\n            \"default\": \"line\",\n            \"values\": [\n                \"line\",\n                \"arc\",\n                \"curve\",\n                \"diagonal\",\n                \"orthogonal\"\n            ]\n        },\n        {\n            \"name\": \"require\",\n            \"type\": \"signal\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"path\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(LinkPath, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var sx = _.sourceX || sourceX, sy = _.sourceY || sourceY, tx = _.targetX || targetX, ty = _.targetY || targetY, as = _.as || \"path\", orient = _.orient || \"vertical\", shape = _.shape || \"line\", path = Paths.get(shape + \"-\" + orient) || Paths.get(shape);\n        if (!path) (0, _vegaUtil.error)(\"LinkPath unsupported type: \" + _.shape + (_.orient ? \"-\" + _.orient : \"\"));\n        pulse.visit(pulse.SOURCE, (t)=>{\n            t[as] = path(sx(t), sy(t), tx(t), ty(t));\n        });\n        return pulse.reflow(_.modified()).modifies(as);\n    }\n});\nconst line = (sx, sy, tx, ty)=>\"M\" + sx + \",\" + sy + \"L\" + tx + \",\" + ty;\nconst lineR = (sa, sr, ta, tr)=>line(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\nconst arc = (sx, sy, tx, ty)=>{\n    var dx = tx - sx, dy = ty - sy, rr = Math.sqrt(dx * dx + dy * dy) / 2, ra = 180 * Math.atan2(dy, dx) / Math.PI;\n    return \"M\" + sx + \",\" + sy + \"A\" + rr + \",\" + rr + \" \" + ra + \" 0 1\" + \" \" + tx + \",\" + ty;\n};\nconst arcR = (sa, sr, ta, tr)=>arc(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\nconst curve = (sx, sy, tx, ty)=>{\n    const dx = tx - sx, dy = ty - sy, ix = 0.2 * (dx + dy), iy = 0.2 * (dy - dx);\n    return \"M\" + sx + \",\" + sy + \"C\" + (sx + ix) + \",\" + (sy + iy) + \" \" + (tx + iy) + \",\" + (ty - ix) + \" \" + tx + \",\" + ty;\n};\nconst curveR = (sa, sr, ta, tr)=>curve(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\nconst orthoX = (sx, sy, tx, ty)=>\"M\" + sx + \",\" + sy + \"V\" + ty + \"H\" + tx;\nconst orthoY = (sx, sy, tx, ty)=>\"M\" + sx + \",\" + sy + \"H\" + tx + \"V\" + ty;\nconst orthoR = (sa, sr, ta, tr)=>{\n    const sc = Math.cos(sa), ss = Math.sin(sa), tc = Math.cos(ta), ts = Math.sin(ta), sf = Math.abs(ta - sa) > Math.PI ? ta <= sa : ta > sa;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"A\" + sr + \",\" + sr + \" 0 0,\" + (sf ? 1 : 0) + \" \" + sr * tc + \",\" + sr * ts + \"L\" + tr * tc + \",\" + tr * ts;\n};\nconst diagonalX = (sx, sy, tx, ty)=>{\n    const m = (sx + tx) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + m + \",\" + sy + \" \" + m + \",\" + ty + \" \" + tx + \",\" + ty;\n};\nconst diagonalY = (sx, sy, tx, ty)=>{\n    const m = (sy + ty) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + sx + \",\" + m + \" \" + tx + \",\" + m + \" \" + tx + \",\" + ty;\n};\nconst diagonalR = (sa, sr, ta, tr)=>{\n    const sc = Math.cos(sa), ss = Math.sin(sa), tc = Math.cos(ta), ts = Math.sin(ta), mr = (sr + tr) / 2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"C\" + mr * sc + \",\" + mr * ss + \" \" + mr * tc + \",\" + mr * ts + \" \" + tr * tc + \",\" + tr * ts;\n};\nconst Paths = (0, _vegaUtil.fastmap)({\n    \"line\": line,\n    \"line-radial\": lineR,\n    \"arc\": arc,\n    \"arc-radial\": arcR,\n    \"curve\": curve,\n    \"curve-radial\": curveR,\n    \"orthogonal-horizontal\": orthoX,\n    \"orthogonal-vertical\": orthoY,\n    \"orthogonal-radial\": orthoR,\n    \"diagonal-horizontal\": diagonalX,\n    \"diagonal-vertical\": diagonalY,\n    \"diagonal-radial\": diagonalR\n});\n/**\n * Pie and donut chart layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size pie segments.\n * @param {number} [params.startAngle=0] - The start angle (in radians) of the layout.\n * @param {number} [params.endAngle=2π] - The end angle (in radians) of the layout.\n * @param {boolean} [params.sort] - Boolean flag for sorting sectors by value.\n */ function Pie(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nPie.Definition = {\n    \"type\": \"Pie\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"startAngle\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"endAngle\",\n            \"type\": \"number\",\n            \"default\": 6.283185307179586\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"startAngle\",\n                \"endAngle\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Pie, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var as = _.as || [\n            \"startAngle\",\n            \"endAngle\"\n        ], startAngle = as[0], endAngle = as[1], field = _.field || (0, _vegaUtil.one), start = _.startAngle || 0, stop = _.endAngle != null ? _.endAngle : 2 * Math.PI, data = pulse.source, values = data.map(field), n = values.length, a1 = start, k = (stop - start) / (0, _d3Array.sum)(values), index = (0, _d3Array.range)(n), i, t, v;\n        if (_.sort) index.sort((a, b)=>values[a] - values[b]);\n        for(i = 0; i < n; ++i){\n            v = values[index[i]];\n            t = data[index[i]];\n            t[startAngle] = a1;\n            t[endAngle] = a1 += v * k;\n        }\n        this.value = values;\n        return pulse.reflow(_.modified()).modifies(as);\n    }\n});\nconst DEFAULT_COUNT = 5;\nfunction includeZero(scale) {\n    const type = scale.type;\n    return !scale.bins && (type === (0, _vegaScale.Linear) || type === (0, _vegaScale.Pow) || type === (0, _vegaScale.Sqrt));\n}\nfunction includePad(type) {\n    return (0, _vegaScale.isContinuous)(type) && type !== (0, _vegaScale.Sequential);\n}\nconst SKIP = (0, _vegaUtil.toSet)([\n    \"set\",\n    \"modified\",\n    \"clear\",\n    \"type\",\n    \"scheme\",\n    \"schemeExtent\",\n    \"schemeCount\",\n    \"domain\",\n    \"domainMin\",\n    \"domainMid\",\n    \"domainMax\",\n    \"domainRaw\",\n    \"domainImplicit\",\n    \"nice\",\n    \"zero\",\n    \"bins\",\n    \"range\",\n    \"rangeStep\",\n    \"round\",\n    \"reverse\",\n    \"interpolate\",\n    \"interpolateGamma\"\n]);\n/**\n * Maintains a scale function mapping data values to visual channels.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function Scale(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n    this.modified(true); // always treat as modified\n}\n(0, _vegaUtil.inherits)(Scale, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var df = pulse.dataflow, scale$1 = this.value, key = scaleKey(_);\n        if (!scale$1 || key !== scale$1.type) this.value = scale$1 = (0, _vegaScale.scale)(key)();\n        for(key in _)if (!SKIP[key]) {\n            // padding is a scale property for band/point but not others\n            if (key === \"padding\" && includePad(scale$1.type)) continue; // invoke scale property setter, raise warning if not found\n            (0, _vegaUtil.isFunction)(scale$1[key]) ? scale$1[key](_[key]) : df.warn(\"Unsupported scale property: \" + key);\n        }\n        configureRange(scale$1, _, configureBins(scale$1, _, configureDomain(scale$1, _, df)));\n        return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n    }\n});\nfunction scaleKey(_) {\n    var t = _.type, d = \"\", n; // backwards compatibility pre Vega 5.\n    if (t === (0, _vegaScale.Sequential)) return (0, _vegaScale.Sequential) + \"-\" + (0, _vegaScale.Linear);\n    if (isContinuousColor(_)) {\n        n = _.rawDomain ? _.rawDomain.length : _.domain ? _.domain.length + +(_.domainMid != null) : 0;\n        d = n === 2 ? (0, _vegaScale.Sequential) + \"-\" : n === 3 ? (0, _vegaScale.Diverging) + \"-\" : \"\";\n    }\n    return (d + t || (0, _vegaScale.Linear)).toLowerCase();\n}\nfunction isContinuousColor(_) {\n    const t = _.type;\n    return (0, _vegaScale.isContinuous)(t) && t !== (0, _vegaScale.Time) && t !== (0, _vegaScale.UTC) && (_.scheme || _.range && _.range.length && _.range.every((0, _vegaUtil.isString)));\n}\nfunction configureDomain(scale, _, df) {\n    // check raw domain, if provided use that and exit early\n    const raw = rawDomain(scale, _.domainRaw, df);\n    if (raw > -1) return raw;\n    var domain = _.domain, type = scale.type, zero = _.zero || _.zero === undefined && includeZero(scale), n, mid;\n    if (!domain) return 0; // adjust continuous domain for minimum pixel padding\n    if (includePad(type) && _.padding && domain[0] !== (0, _vegaUtil.peek)(domain)) domain = padDomain(type, domain, _.range, _.padding, _.exponent, _.constant);\n     // adjust domain based on zero, min, max settings\n    if (zero || _.domainMin != null || _.domainMax != null || _.domainMid != null) {\n        n = (domain = domain.slice()).length - 1 || 1;\n        if (zero) {\n            if (domain[0] > 0) domain[0] = 0;\n            if (domain[n] < 0) domain[n] = 0;\n        }\n        if (_.domainMin != null) domain[0] = _.domainMin;\n        if (_.domainMax != null) domain[n] = _.domainMax;\n        if (_.domainMid != null) {\n            mid = _.domainMid;\n            const i = mid > domain[n] ? n + 1 : mid < domain[0] ? 0 : n;\n            if (i !== n) df.warn(\"Scale domainMid exceeds domain min or max.\", mid);\n            domain.splice(i, 0, mid);\n        }\n    } // set the scale domain\n    scale.domain(domainCheck(type, domain, df)); // if ordinal scale domain is defined, prevent implicit\n    // domain construction as side-effect of scale lookup\n    if (type === (0, _vegaScale.Ordinal)) scale.unknown(_.domainImplicit ? (0, _vegaScale.scaleImplicit) : undefined);\n     // perform 'nice' adjustment as requested\n    if (_.nice && scale.nice) scale.nice(_.nice !== true && (0, _vegaScale.tickCount)(scale, _.nice) || null);\n     // return the cardinality of the domain\n    return domain.length;\n}\nfunction rawDomain(scale, raw, df) {\n    if (raw) {\n        scale.domain(domainCheck(scale.type, raw, df));\n        return raw.length;\n    } else return -1;\n}\nfunction padDomain(type, domain, range, pad, exponent, constant) {\n    var span = Math.abs((0, _vegaUtil.peek)(range) - range[0]), frac = span / (span - 2 * pad), d = type === (0, _vegaScale.Log) ? (0, _vegaUtil.zoomLog)(domain, null, frac) : type === (0, _vegaScale.Sqrt) ? (0, _vegaUtil.zoomPow)(domain, null, frac, 0.5) : type === (0, _vegaScale.Pow) ? (0, _vegaUtil.zoomPow)(domain, null, frac, exponent || 1) : type === (0, _vegaScale.Symlog) ? (0, _vegaUtil.zoomSymlog)(domain, null, frac, constant || 1) : (0, _vegaUtil.zoomLinear)(domain, null, frac);\n    domain = domain.slice();\n    domain[0] = d[0];\n    domain[domain.length - 1] = d[1];\n    return domain;\n}\nfunction domainCheck(type, domain, df) {\n    if ((0, _vegaScale.isLogarithmic)(type)) {\n        // sum signs of domain values\n        // if all pos or all neg, abs(sum) === domain.length\n        var s1 = Math.abs(domain.reduce((s, v)=>s + (v < 0 ? -1 : v > 0 ? 1 : 0), 0));\n        if (s1 !== domain.length) df.warn(\"Log scale domain includes zero: \" + (0, _vegaUtil.stringValue)(domain));\n    }\n    return domain;\n}\nfunction configureBins(scale, _, count) {\n    let bins = _.bins;\n    if (bins && !(0, _vegaUtil.isArray)(bins)) {\n        // generate bin boundary array\n        const domain = scale.domain(), lo = domain[0], hi = (0, _vegaUtil.peek)(domain), step = bins.step;\n        let start = bins.start == null ? lo : bins.start, stop = bins.stop == null ? hi : bins.stop;\n        if (!step) (0, _vegaUtil.error)(\"Scale bins parameter missing step property.\");\n        if (start < lo) start = step * Math.ceil(lo / step);\n        if (stop > hi) stop = step * Math.floor(hi / step);\n        bins = (0, _d3Array.range)(start, stop + step / 2, step);\n    }\n    if (bins) // assign bin boundaries to scale instance\n    scale.bins = bins;\n    else if (scale.bins) // no current bins, remove bins if previously set\n    delete scale.bins;\n     // special handling for bin-ordinal scales\n    if (scale.type === (0, _vegaScale.BinOrdinal)) {\n        if (!bins) // the domain specifies the bins\n        scale.bins = scale.domain();\n        else if (!_.domain && !_.domainRaw) {\n            // the bins specify the domain\n            scale.domain(bins);\n            count = bins.length;\n        }\n    } // return domain cardinality\n    return count;\n}\nfunction configureRange(scale, _, count) {\n    var type = scale.type, round = _.round || false, range = _.range; // if range step specified, calculate full range extent\n    if (_.rangeStep != null) range = configureRangeStep(type, _, count);\n    else if (_.scheme) {\n        range = configureScheme(type, _, count);\n        if ((0, _vegaUtil.isFunction)(range)) {\n            if (scale.interpolator) return scale.interpolator(range);\n            else (0, _vegaUtil.error)(\"Scale type \".concat(type, \" does not support interpolating color schemes.\"));\n        }\n    } // given a range array for an interpolating scale, convert to interpolator\n    if (range && (0, _vegaScale.isInterpolating)(type)) return scale.interpolator((0, _vegaScale.interpolateColors)(flip(range, _.reverse), _.interpolate, _.interpolateGamma));\n     // configure rounding / interpolation\n    if (range && _.interpolate && scale.interpolate) scale.interpolate((0, _vegaScale.interpolate)(_.interpolate, _.interpolateGamma));\n    else if ((0, _vegaUtil.isFunction)(scale.round)) scale.round(round);\n    else if ((0, _vegaUtil.isFunction)(scale.rangeRound)) scale.interpolate(round ? (0, _d3Interpolate.interpolateRound) : (0, _d3Interpolate.interpolate));\n    if (range) scale.range(flip(range, _.reverse));\n}\nfunction configureRangeStep(type, _, count) {\n    if (type !== (0, _vegaScale.Band) && type !== (0, _vegaScale.Point)) (0, _vegaUtil.error)(\"Only band and point scales support rangeStep.\");\n     // calculate full range based on requested step size and padding\n    var outer = (_.paddingOuter != null ? _.paddingOuter : _.padding) || 0, inner = type === (0, _vegaScale.Point) ? 1 : (_.paddingInner != null ? _.paddingInner : _.padding) || 0;\n    return [\n        0,\n        _.rangeStep * (0, _vegaScale.bandSpace)(count, inner, outer)\n    ];\n}\nfunction configureScheme(type, _, count) {\n    var extent = _.schemeExtent, name, scheme$1;\n    if ((0, _vegaUtil.isArray)(_.scheme)) scheme$1 = (0, _vegaScale.interpolateColors)(_.scheme, _.interpolate, _.interpolateGamma);\n    else {\n        name = _.scheme.toLowerCase();\n        scheme$1 = (0, _vegaScale.scheme)(name);\n        if (!scheme$1) (0, _vegaUtil.error)(\"Unrecognized scheme name: \".concat(_.scheme));\n    } // determine size for potential discrete range\n    count = type === (0, _vegaScale.Threshold) ? count + 1 : type === (0, _vegaScale.BinOrdinal) ? count - 1 : type === (0, _vegaScale.Quantile) || type === (0, _vegaScale.Quantize) ? +_.schemeCount || DEFAULT_COUNT : count; // adjust and/or quantize scheme as appropriate\n    return (0, _vegaScale.isInterpolating)(type) ? adjustScheme(scheme$1, extent, _.reverse) : (0, _vegaUtil.isFunction)(scheme$1) ? (0, _vegaScale.quantizeInterpolator)(adjustScheme(scheme$1, extent), count) : type === (0, _vegaScale.Ordinal) ? scheme$1 : scheme$1.slice(0, count);\n}\nfunction adjustScheme(scheme, extent, reverse) {\n    return (0, _vegaUtil.isFunction)(scheme) && (extent || reverse) ? (0, _vegaScale.interpolateRange)(scheme, flip(extent || [\n        0,\n        1\n    ], reverse)) : scheme;\n}\nfunction flip(array, reverse) {\n    return reverse ? array.slice().reverse() : array;\n}\n/**\n * Sorts scenegraph items in the pulse source array.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator\n *   function for sorting tuples.\n */ function SortItems(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(SortItems, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const mod = _.modified(\"sort\") || pulse.changed(pulse.ADD) || pulse.modified(_.sort.fields) || pulse.modified(\"datum\");\n        if (mod) pulse.source.sort((0, _vegaDataflow.stableCompare)(_.sort));\n        this.modified(mod);\n        return pulse;\n    }\n});\nconst Zero = \"zero\", Center = \"center\", Normalize = \"normalize\", DefOutput = [\n    \"y0\",\n    \"y1\"\n];\n/**\n * Stack layout for visualization elements.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to stack.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {function(object,object): number} [params.sort] - A comparator for stack sorting.\n * @param {string} [offset='zero'] - Stack baseline offset. One of 'zero', 'center', 'normalize'.\n */ function Stack(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nStack.Definition = {\n    \"type\": \"Stack\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"offset\",\n            \"type\": \"enum\",\n            \"default\": Zero,\n            \"values\": [\n                Zero,\n                Center,\n                Normalize\n            ]\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": DefOutput\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Stack, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var as = _.as || DefOutput, y0 = as[0], y1 = as[1], sort = (0, _vegaDataflow.stableCompare)(_.sort), field = _.field || (0, _vegaUtil.one), stack = _.offset === Center ? stackCenter : _.offset === Normalize ? stackNormalize : stackZero, groups, i, n, max; // partition, sum, and sort the stack groups\n        groups = partition(pulse.source, _.groupby, sort, field); // compute stack layouts per group\n        for(i = 0, n = groups.length, max = groups.max; i < n; ++i)stack(groups[i], max, field, y0, y1);\n        return pulse.reflow(_.modified()).modifies(as);\n    }\n});\nfunction stackCenter(group, max, field, y0, y1) {\n    var last = (max - group.sum) / 2, m = group.length, j = 0, t;\n    for(; j < m; ++j){\n        t = group[j];\n        t[y0] = last;\n        t[y1] = last += Math.abs(field(t));\n    }\n}\nfunction stackNormalize(group, max, field, y0, y1) {\n    var scale = 1 / group.sum, last = 0, m = group.length, j = 0, v = 0, t;\n    for(; j < m; ++j){\n        t = group[j];\n        t[y0] = last;\n        t[y1] = last = scale * (v += Math.abs(field(t)));\n    }\n}\nfunction stackZero(group, max, field, y0, y1) {\n    var lastPos = 0, lastNeg = 0, m = group.length, j = 0, v, t;\n    for(; j < m; ++j){\n        t = group[j];\n        v = +field(t);\n        if (v < 0) {\n            t[y0] = lastNeg;\n            t[y1] = lastNeg += v;\n        } else {\n            t[y0] = lastPos;\n            t[y1] = lastPos += v;\n        }\n    }\n}\nfunction partition(data, groupby, sort, field) {\n    var groups = [], get = (f)=>f(t), map, i, n, m, t, k, g, s, max; // partition data points into stack groups\n    if (groupby == null) groups.push(data.slice());\n    else for(map = {}, i = 0, n = data.length; i < n; ++i){\n        t = data[i];\n        k = groupby.map(get);\n        g = map[k];\n        if (!g) {\n            map[k] = g = [];\n            groups.push(g);\n        }\n        g.push(t);\n    }\n     // compute sums of groups, sort groups as needed\n    for(k = 0, max = 0, m = groups.length; k < m; ++k){\n        g = groups[k];\n        for(i = 0, s = 0, n = g.length; i < n; ++i)s += Math.abs(field(g[i]));\n        g.sum = s;\n        if (s > max) max = s;\n        if (sort) g.sort(sort);\n    }\n    groups.max = max;\n    return groups;\n}\n\n},{\"vega-dataflow\":\"4kvYg\",\"vega-scale\":\"evQIv\",\"vega-util\":\"dPFAY\",\"d3-array\":\"8JMcC\",\"d3-interpolate\":\"dQqYJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"35zWv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"contour\", ()=>Contour);\nparcelHelpers.export(exports, \"geojson\", ()=>GeoJSON);\nparcelHelpers.export(exports, \"geopath\", ()=>GeoPath);\nparcelHelpers.export(exports, \"geopoint\", ()=>GeoPoint);\nparcelHelpers.export(exports, \"geoshape\", ()=>GeoShape);\nparcelHelpers.export(exports, \"graticule\", ()=>Graticule);\nparcelHelpers.export(exports, \"heatmap\", ()=>Heatmap);\nparcelHelpers.export(exports, \"isocontour\", ()=>Isocontour);\nparcelHelpers.export(exports, \"kde2d\", ()=>KDE2D);\nparcelHelpers.export(exports, \"projection\", ()=>Projection);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Array = require(\"d3-array\");\nvar _vegaStatistics = require(\"vega-statistics\");\nvar _vegaProjection = require(\"vega-projection\");\nvar _d3Geo = require(\"d3-geo\");\nvar _d3Color = require(\"d3-color\");\nvar _vegaCanvas = require(\"vega-canvas\");\nfunction noop() {}\nconst cases = [\n    [],\n    [\n        [\n            [\n                1.0,\n                1.5\n            ],\n            [\n                0.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.5,\n                1.0\n            ],\n            [\n                1.0,\n                1.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.5,\n                1.0\n            ],\n            [\n                0.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                0.5\n            ],\n            [\n                1.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                1.5\n            ],\n            [\n                0.5,\n                1.0\n            ]\n        ],\n        [\n            [\n                1.0,\n                0.5\n            ],\n            [\n                1.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                0.5\n            ],\n            [\n                1.0,\n                1.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                0.5\n            ],\n            [\n                0.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                0.5,\n                1.0\n            ],\n            [\n                1.0,\n                0.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                1.5\n            ],\n            [\n                1.0,\n                0.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                0.5,\n                1.0\n            ],\n            [\n                1.0,\n                0.5\n            ]\n        ],\n        [\n            [\n                1.5,\n                1.0\n            ],\n            [\n                1.0,\n                1.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.5,\n                1.0\n            ],\n            [\n                1.0,\n                0.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                0.5,\n                1.0\n            ],\n            [\n                1.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                1.5\n            ],\n            [\n                1.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                0.5,\n                1.0\n            ],\n            [\n                1.0,\n                1.5\n            ]\n        ]\n    ],\n    []\n]; // Implementation adapted from d3/d3-contour. Thanks!\nfunction contours() {\n    var dx = 1, dy = 1, smooth = smoothLinear;\n    function contours1(values, tz) {\n        return tz.map((value)=>contour(values, value));\n    } // Accumulate, smooth contour rings, assign holes to exterior rings.\n    // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js\n    function contour(values, value) {\n        var polygons = [], holes = [];\n        isorings(values, value, (ring)=>{\n            smooth(ring, values, value);\n            if (area(ring) > 0) polygons.push([\n                ring\n            ]);\n            else holes.push(ring);\n        });\n        holes.forEach((hole)=>{\n            for(var i = 0, n = polygons.length, polygon; i < n; ++i)if (contains((polygon = polygons[i])[0], hole) !== -1) {\n                polygon.push(hole);\n                return;\n            }\n        });\n        return {\n            type: \"MultiPolygon\",\n            value: value,\n            coordinates: polygons\n        };\n    } // Marching squares with isolines stitched into rings.\n    // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js\n    function isorings(values, value, callback) {\n        var fragmentByStart = new Array(), fragmentByEnd = new Array(), x, y, t0, t1, t2, t3; // Special case for the first row (y = -1, t2 = t3 = 0).\n        x = y = -1;\n        t1 = values[0] >= value;\n        cases[t1 << 1].forEach(stitch);\n        while(++x < dx - 1){\n            t0 = t1, t1 = values[x + 1] >= value;\n            cases[t0 | t1 << 1].forEach(stitch);\n        }\n        cases[t1 << 0].forEach(stitch); // General case for the intermediate rows.\n        while(++y < dy - 1){\n            x = -1;\n            t1 = values[y * dx + dx] >= value;\n            t2 = values[y * dx] >= value;\n            cases[t1 << 1 | t2 << 2].forEach(stitch);\n            while(++x < dx - 1){\n                t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;\n                t3 = t2, t2 = values[y * dx + x + 1] >= value;\n                cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);\n            }\n            cases[t1 | t2 << 3].forEach(stitch);\n        } // Special case for the last row (y = dy - 1, t0 = t1 = 0).\n        x = -1;\n        t2 = values[y * dx] >= value;\n        cases[t2 << 2].forEach(stitch);\n        while(++x < dx - 1){\n            t3 = t2, t2 = values[y * dx + x + 1] >= value;\n            cases[t2 << 2 | t3 << 3].forEach(stitch);\n        }\n        cases[t2 << 3].forEach(stitch);\n        function stitch(line) {\n            var start = [\n                line[0][0] + x,\n                line[0][1] + y\n            ], end = [\n                line[1][0] + x,\n                line[1][1] + y\n            ], startIndex = index(start), endIndex = index(end), f, g;\n            if (f = fragmentByEnd[startIndex]) {\n                if (g = fragmentByStart[endIndex]) {\n                    delete fragmentByEnd[f.end];\n                    delete fragmentByStart[g.start];\n                    if (f === g) {\n                        f.ring.push(end);\n                        callback(f.ring);\n                    } else fragmentByStart[f.start] = fragmentByEnd[g.end] = {\n                        start: f.start,\n                        end: g.end,\n                        ring: f.ring.concat(g.ring)\n                    };\n                } else {\n                    delete fragmentByEnd[f.end];\n                    f.ring.push(end);\n                    fragmentByEnd[f.end = endIndex] = f;\n                }\n            } else if (f = fragmentByStart[endIndex]) {\n                if (g = fragmentByEnd[startIndex]) {\n                    delete fragmentByStart[f.start];\n                    delete fragmentByEnd[g.end];\n                    if (f === g) {\n                        f.ring.push(end);\n                        callback(f.ring);\n                    } else fragmentByStart[g.start] = fragmentByEnd[f.end] = {\n                        start: g.start,\n                        end: f.end,\n                        ring: g.ring.concat(f.ring)\n                    };\n                } else {\n                    delete fragmentByStart[f.start];\n                    f.ring.unshift(start);\n                    fragmentByStart[f.start = startIndex] = f;\n                }\n            } else fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {\n                start: startIndex,\n                end: endIndex,\n                ring: [\n                    start,\n                    end\n                ]\n            };\n        }\n    }\n    function index(point) {\n        return point[0] * 2 + point[1] * (dx + 1) * 4;\n    }\n    function smoothLinear(ring, values, value) {\n        ring.forEach((point)=>{\n            var x = point[0], y = point[1], xt = x | 0, yt = y | 0, v0, v1 = values[yt * dx + xt];\n            if (x > 0 && x < dx && xt === x) {\n                v0 = values[yt * dx + xt - 1];\n                point[0] = x + (value - v0) / (v1 - v0) - 0.5;\n            }\n            if (y > 0 && y < dy && yt === y) {\n                v0 = values[(yt - 1) * dx + xt];\n                point[1] = y + (value - v0) / (v1 - v0) - 0.5;\n            }\n        });\n    }\n    contours1.contour = contour;\n    contours1.size = function(_) {\n        if (!arguments.length) return [\n            dx,\n            dy\n        ];\n        var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]);\n        if (!(_0 >= 0 && _1 >= 0)) (0, _vegaUtil.error)(\"invalid size\");\n        return dx = _0, dy = _1, contours1;\n    };\n    contours1.smooth = function(_) {\n        return arguments.length ? (smooth = _ ? smoothLinear : noop, contours1) : smooth === smoothLinear;\n    };\n    return contours1;\n}\nfunction area(ring) {\n    var i = 0, n = ring.length, area1 = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n    while(++i < n)area1 += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n    return area1;\n}\nfunction contains(ring, hole) {\n    var i = -1, n = hole.length, c;\n    while(++i < n)if (c = ringContains(ring, hole[i])) return c;\n    return 0;\n}\nfunction ringContains(ring, point) {\n    var x = point[0], y = point[1], contains1 = -1;\n    for(var i = 0, n = ring.length, j = n - 1; i < n; j = i++){\n        var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];\n        if (segmentContains(pi, pj, point)) return 0;\n        if (yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi) contains1 = -contains1;\n    }\n    return contains1;\n}\nfunction segmentContains(a, b, c) {\n    var i;\n    return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);\n}\nfunction collinear(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);\n}\nfunction within(p, q, r) {\n    return p <= q && q <= r || r <= q && q <= p;\n}\nfunction quantize(k, nice, zero) {\n    return function(values) {\n        var ex = (0, _vegaUtil.extent)(values), start = zero ? Math.min(ex[0], 0) : ex[0], stop = ex[1], span = stop - start, step = nice ? (0, _d3Array.tickStep)(start, stop, k) : span / (k + 1);\n        return (0, _d3Array.range)(start + step, stop, step);\n    };\n}\n/**\n * Generate isocontours (level sets) based on input raster grid data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} [params.field] - The field with raster grid\n *   data. If unspecified, the tuple itself is interpreted as a raster grid.\n * @param {Array<number>} [params.thresholds] - Contour threshold array. If\n *   specified, the levels, nice, resolve, and zero parameters are ignored.\n * @param {number} [params.levels] - The desired number of contour levels.\n * @param {boolean} [params.nice] - Boolean flag indicating if the contour\n *   threshold values should be automatically aligned to \"nice\"\n *   human-friendly values. Setting this flag may cause the number of\n *   thresholds to deviate from the specified levels.\n * @param {string} [params.resolve] - The method for resolving thresholds\n *   across multiple input grids. If 'independent' (the default), threshold\n *   calculation will be performed separately for each grid. If 'shared', a\n *   single set of threshold values will be used for all input grids.\n * @param {boolean} [params.zero] - Boolean flag indicating if the contour\n *   threshold values should include zero.\n * @param {boolean} [params.smooth] - Boolean flag indicating if the contour\n *   polygons should be smoothed using linear interpolation. The default is\n *   true. The parameter is ignored when using density estimation.\n * @param {boolean} [params.scale] - Optional numerical value by which to\n *   scale the output isocontour coordinates. This parameter can be useful\n *   to scale the contours to match a desired output resolution.\n * @param {string} [params.as='contour'] - The output field in which to store\n *   the generated isocontour data (default 'contour').\n */ function Isocontour(params1) {\n    (0, _vegaDataflow.Transform).call(this, null, params1);\n}\nIsocontour.Definition = {\n    \"type\": \"Isocontour\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"thresholds\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"levels\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"nice\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"resolve\",\n            \"type\": \"enum\",\n            \"values\": [\n                \"shared\",\n                \"independent\"\n            ],\n            \"default\": \"independent\"\n        },\n        {\n            \"name\": \"zero\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"smooth\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"scale\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"translate\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"expr\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"default\": \"contour\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Isocontour, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !pulse.changed() && !_.modified()) return pulse.StopPropagation;\n        var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), source = pulse.materialize(pulse.SOURCE).source, field = _.field || (0, _vegaUtil.identity), contour = contours().smooth(_.smooth !== false), tz = _.thresholds || levels(source, field, _), as = _.as === null ? null : _.as || \"contour\", values = [];\n        source.forEach((t)=>{\n            const grid = field(t); // generate contour paths in GeoJSON format\n            const paths = contour.size([\n                grid.width,\n                grid.height\n            ])(grid.values, (0, _vegaUtil.isArray)(tz) ? tz : tz(grid.values)); // adjust contour path coordinates as needed\n            transformPaths(paths, grid, t, _); // ingest; copy source data properties to output\n            paths.forEach((p)=>{\n                values.push((0, _vegaDataflow.rederive)(t, (0, _vegaDataflow.ingest)(as != null ? {\n                    [as]: p\n                } : p)));\n            });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.source = out.add = values;\n        return out;\n    }\n});\nfunction levels(values, f, _) {\n    const q = quantize(_.levels || 10, _.nice, _.zero !== false);\n    return _.resolve !== \"shared\" ? q : q(values.map((t)=>(0, _d3Array.max)(f(t).values)));\n}\nfunction transformPaths(paths, grid, datum, _) {\n    let s = _.scale || grid.scale, t = _.translate || grid.translate;\n    if ((0, _vegaUtil.isFunction)(s)) s = s(datum, _);\n    if ((0, _vegaUtil.isFunction)(t)) t = t(datum, _);\n    if ((s === 1 || s == null) && !t) return;\n    const sx = ((0, _vegaUtil.isNumber)(s) ? s : s[0]) || 1, sy = ((0, _vegaUtil.isNumber)(s) ? s : s[1]) || 1, tx = t && t[0] || 0, ty = t && t[1] || 0;\n    paths.forEach(transform(grid, sx, sy, tx, ty));\n}\nfunction transform(grid, sx, sy, tx, ty) {\n    const x1 = grid.x1 || 0, y1 = grid.y1 || 0, flip = sx * sy < 0;\n    function transformPolygon(coordinates) {\n        coordinates.forEach(transformRing);\n    }\n    function transformRing(coordinates) {\n        if (flip) coordinates.reverse(); // maintain winding order\n        coordinates.forEach(transformPoint);\n    }\n    function transformPoint(coordinates) {\n        coordinates[0] = (coordinates[0] - x1) * sx + tx;\n        coordinates[1] = (coordinates[1] - y1) * sy + ty;\n    }\n    return function(geometry) {\n        geometry.coordinates.forEach(transformPolygon);\n        return geometry;\n    };\n}\nfunction radius(bw, data, f) {\n    const v = bw >= 0 ? bw : (0, _vegaStatistics.bandwidthNRD)(data, f);\n    return Math.round((Math.sqrt(4 * v * v + 1) - 1) / 2);\n}\nfunction number(_) {\n    return (0, _vegaUtil.isFunction)(_) ? _ : (0, _vegaUtil.constant)(+_);\n} // Implementation adapted from d3/d3-contour. Thanks!\nfunction density2D() {\n    var x = (d)=>d[0], y = (d)=>d[1], weight = (0, _vegaUtil.one), bandwidth = [\n        -1,\n        -1\n    ], dx = 960, dy = 500, k = 2; // log2(cellSize)\n    function density(data, counts) {\n        const rx = radius(bandwidth[0], data, x) >> k, // blur x-radius\n        ry = radius(bandwidth[1], data, y) >> k, // blur y-radius\n        ox = rx ? rx + 2 : 0, // x-offset padding for blur\n        oy = ry ? ry + 2 : 0, // y-offset padding for blur\n        n = 2 * ox + (dx >> k), // grid width\n        m = 2 * oy + (dy >> k), // grid height\n        values0 = new Float32Array(n * m), values1 = new Float32Array(n * m);\n        let values = values0;\n        data.forEach((d)=>{\n            const xi = ox + (+x(d) >> k), yi = oy + (+y(d) >> k);\n            if (xi >= 0 && xi < n && yi >= 0 && yi < m) values0[xi + yi * n] += +weight(d);\n        });\n        if (rx > 0 && ry > 0) {\n            blurX(n, m, values0, values1, rx);\n            blurY(n, m, values1, values0, ry);\n            blurX(n, m, values0, values1, rx);\n            blurY(n, m, values1, values0, ry);\n            blurX(n, m, values0, values1, rx);\n            blurY(n, m, values1, values0, ry);\n        } else if (rx > 0) {\n            blurX(n, m, values0, values1, rx);\n            blurX(n, m, values1, values0, rx);\n            blurX(n, m, values0, values1, rx);\n            values = values1;\n        } else if (ry > 0) {\n            blurY(n, m, values0, values1, ry);\n            blurY(n, m, values1, values0, ry);\n            blurY(n, m, values0, values1, ry);\n            values = values1;\n        } // scale density estimates\n        // density in points per square pixel or probability density\n        const s = counts ? Math.pow(2, -2 * k) : 1 / (0, _d3Array.sum)(values);\n        for(let i = 0, sz = n * m; i < sz; ++i)values[i] *= s;\n        return {\n            values: values,\n            scale: 1 << k,\n            width: n,\n            height: m,\n            x1: ox,\n            y1: oy,\n            x2: ox + (dx >> k),\n            y2: oy + (dy >> k)\n        };\n    }\n    density.x = function(_) {\n        return arguments.length ? (x = number(_), density) : x;\n    };\n    density.y = function(_) {\n        return arguments.length ? (y = number(_), density) : y;\n    };\n    density.weight = function(_) {\n        return arguments.length ? (weight = number(_), density) : weight;\n    };\n    density.size = function(_) {\n        if (!arguments.length) return [\n            dx,\n            dy\n        ];\n        var _0 = +_[0], _1 = +_[1];\n        if (!(_0 >= 0 && _1 >= 0)) (0, _vegaUtil.error)(\"invalid size\");\n        return dx = _0, dy = _1, density;\n    };\n    density.cellSize = function(_) {\n        if (!arguments.length) return 1 << k;\n        if (!((_ = +_) >= 1)) (0, _vegaUtil.error)(\"invalid cell size\");\n        k = Math.floor(Math.log(_) / Math.LN2);\n        return density;\n    };\n    density.bandwidth = function(_) {\n        if (!arguments.length) return bandwidth;\n        _ = (0, _vegaUtil.array)(_);\n        if (_.length === 1) _ = [\n            +_[0],\n            +_[0]\n        ];\n        if (_.length !== 2) (0, _vegaUtil.error)(\"invalid bandwidth\");\n        return bandwidth = _, density;\n    };\n    return density;\n}\nfunction blurX(n, m, source, target, r) {\n    const w = (r << 1) + 1;\n    for(let j = 0; j < m; ++j)for(let i = 0, sr = 0; i < n + r; ++i){\n        if (i < n) sr += source[i + j * n];\n        if (i >= r) {\n            if (i >= w) sr -= source[i - w + j * n];\n            target[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);\n        }\n    }\n}\nfunction blurY(n, m, source, target, r) {\n    const w = (r << 1) + 1;\n    for(let i = 0; i < n; ++i)for(let j = 0, sr = 0; j < m + r; ++j){\n        if (j < m) sr += source[i + j * n];\n        if (j >= r) {\n            if (j >= w) sr -= source[i + (j - w) * n];\n            target[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);\n        }\n    }\n}\n/**\n * Perform 2D kernel-density estimation of point data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<number>} params.size - The [width, height] extent (in\n *   units of input pixels) over which to perform density estimation.\n * @param {function(object): number} params.x - The x-coordinate accessor.\n * @param {function(object): number} params.y - The y-coordinate accessor.\n * @param {function(object): number} [params.weight] - The weight accessor.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {number} [params.cellSize] - Contour density calculation cell size.\n *   This parameter determines the level of spatial approximation. For example,\n *   the default value of 4 maps to 2x reductions in both x- and y- dimensions.\n *   A value of 1 will result in an output raster grid whose dimensions exactly\n *   matches the size parameter.\n * @param {Array<number>} [params.bandwidth] - The KDE kernel bandwidths,\n *   in pixels. The input can be a two-element array specifying separate\n *   x and y bandwidths, or a single-element array specifying both. If the\n *   bandwidth is unspecified or less than zero, the bandwidth will be\n *   automatically determined.\n * @param {boolean} [params.counts=false] - A boolean flag indicating if the\n *   output values should be probability estimates (false, default) or\n *   smoothed counts (true).\n * @param {string} [params.as='grid'] - The output field in which to store\n *   the generated raster grid (default 'grid').\n */ function KDE2D(params2) {\n    (0, _vegaDataflow.Transform).call(this, null, params2);\n}\nKDE2D.Definition = {\n    \"type\": \"KDE2D\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"required\": true\n        },\n        {\n            \"name\": \"x\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"weight\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"cellSize\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"bandwidth\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"counts\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"grid\"\n        }\n    ]\n};\nconst PARAMS = [\n    \"x\",\n    \"y\",\n    \"weight\",\n    \"size\",\n    \"cellSize\",\n    \"bandwidth\"\n];\nfunction params(obj, _) {\n    PARAMS.forEach((param)=>_[param] != null ? obj[param](_[param]) : 0);\n    return obj;\n}\n(0, _vegaUtil.inherits)(KDE2D, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !pulse.changed() && !_.modified()) return pulse.StopPropagation;\n        var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), source = pulse.materialize(pulse.SOURCE).source, groups = partition(source, _.groupby), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), kde = params(density2D(), _), as = _.as || \"grid\", values = [];\n        function set1(t, vals) {\n            for(let i = 0; i < names.length; ++i)t[names[i]] = vals[i];\n            return t;\n        } // generate density raster grids\n        values = groups.map((g)=>(0, _vegaDataflow.ingest)(set1({\n                [as]: kde(g, _.counts)\n            }, g.dims)));\n        if (this.value) out.rem = this.value;\n        this.value = out.source = out.add = values;\n        return out;\n    }\n});\nfunction partition(data, groupby) {\n    var groups = [], get = (f)=>f(t), map, i, n, t, k, g; // partition data points into groups\n    if (groupby == null) groups.push(data);\n    else for(map = {}, i = 0, n = data.length; i < n; ++i){\n        t = data[i];\n        k = groupby.map(get);\n        g = map[k];\n        if (!g) {\n            map[k] = g = [];\n            g.dims = k;\n            groups.push(g);\n        }\n        g.push(t);\n    }\n    return groups;\n}\n/**\n * Generate contours based on kernel-density estimation of point data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<number>} params.size - The dimensions [width, height] over which to compute contours.\n *  If the values parameter is provided, this must be the dimensions of the input data.\n *  If density estimation is performed, this is the output view dimensions in pixels.\n * @param {Array<number>} [params.values] - An array of numeric values representing an\n *  width x height grid of values over which to compute contours. If unspecified, this\n *  transform will instead attempt to compute contours for the kernel density estimate\n *  using values drawn from data tuples in the input pulse.\n * @param {function(object): number} [params.x] - The pixel x-coordinate accessor for density estimation.\n * @param {function(object): number} [params.y] - The pixel y-coordinate accessor for density estimation.\n * @param {function(object): number} [params.weight] - The data point weight accessor for density estimation.\n * @param {number} [params.cellSize] - Contour density calculation cell size.\n * @param {number} [params.bandwidth] - Kernel density estimation bandwidth.\n * @param {Array<number>} [params.thresholds] - Contour threshold array. If\n *   this parameter is set, the count and nice parameters will be ignored.\n * @param {number} [params.count] - The desired number of contours.\n * @param {boolean} [params.nice] - Boolean flag indicating if the contour\n *   threshold values should be automatically aligned to \"nice\"\n *   human-friendly values. Setting this flag may cause the number of\n *   thresholds to deviate from the specified count.\n * @param {boolean} [params.smooth] - Boolean flag indicating if the contour\n *   polygons should be smoothed using linear interpolation. The default is\n *   true. The parameter is ignored when using density estimation.\n */ function Contour(params3) {\n    (0, _vegaDataflow.Transform).call(this, null, params3);\n}\nContour.Definition = {\n    \"type\": \"Contour\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"required\": true\n        },\n        {\n            \"name\": \"values\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"x\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"weight\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"cellSize\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"bandwidth\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"count\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"nice\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"thresholds\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"smooth\",\n            \"type\": \"boolean\",\n            \"default\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Contour, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !pulse.changed() && !_.modified()) return pulse.StopPropagation;\n        var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), contour = contours().smooth(_.smooth !== false), values = _.values, thresh = _.thresholds || quantize(_.count || 10, _.nice, !!values), size = _.size, grid, post;\n        if (!values) {\n            values = pulse.materialize(pulse.SOURCE).source;\n            grid = params(density2D(), _)(values, true);\n            post = transform(grid, grid.scale || 1, grid.scale || 1, 0, 0);\n            size = [\n                grid.width,\n                grid.height\n            ];\n            values = grid.values;\n        }\n        thresh = (0, _vegaUtil.isArray)(thresh) ? thresh : thresh(values);\n        values = contour.size(size)(values, thresh);\n        if (post) values.forEach(post);\n        if (this.value) out.rem = this.value;\n        this.value = out.source = out.add = (values || []).map((0, _vegaDataflow.ingest));\n        return out;\n    }\n});\nconst Feature = \"Feature\";\nconst FeatureCollection = \"FeatureCollection\";\nconst MultiPoint = \"MultiPoint\";\n/**\n * Consolidate an array of [longitude, latitude] points or GeoJSON features\n * into a combined GeoJSON object. This transform is particularly useful for\n * combining geo data for a Projection's fit argument. The resulting GeoJSON\n * data is available as this transform's value. Input pulses are unchanged.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.fields] - A two-element array\n *   of field accessors for the longitude and latitude values.\n * @param {function(object): *} params.geojson - A field accessor for\n *   retrieving GeoJSON feature data.\n */ function GeoJSON(params4) {\n    (0, _vegaDataflow.Transform).call(this, null, params4);\n}\nGeoJSON.Definition = {\n    \"type\": \"GeoJSON\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"geojson\",\n            \"type\": \"field\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(GeoJSON, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var features = this._features, points = this._points, fields = _.fields, lon = fields && fields[0], lat = fields && fields[1], geojson = _.geojson || !fields && (0, _vegaUtil.identity), flag = pulse.ADD, mod;\n        mod = _.modified() || pulse.changed(pulse.REM) || pulse.modified((0, _vegaUtil.accessorFields)(geojson)) || lon && pulse.modified((0, _vegaUtil.accessorFields)(lon)) || lat && pulse.modified((0, _vegaUtil.accessorFields)(lat));\n        if (!this.value || mod) {\n            flag = pulse.SOURCE;\n            this._features = features = [];\n            this._points = points = [];\n        }\n        if (geojson) pulse.visit(flag, (t)=>features.push(geojson(t)));\n        if (lon && lat) {\n            pulse.visit(flag, (t)=>{\n                var x = lon(t), y = lat(t);\n                if (x != null && y != null && (x = +x) === x && (y = +y) === y) points.push([\n                    x,\n                    y\n                ]);\n            });\n            features = features.concat({\n                type: Feature,\n                geometry: {\n                    type: MultiPoint,\n                    coordinates: points\n                }\n            });\n        }\n        this.value = {\n            type: FeatureCollection,\n            features: features\n        };\n    }\n});\n/**\n * Map GeoJSON data to an SVG path string.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {function(object): *} [params.field] - The field with GeoJSON data,\n *   or null if the tuple itself is a GeoJSON feature.\n * @param {string} [params.as='path'] - The output field in which to store\n *   the generated path data (default 'path').\n */ function GeoPath(params5) {\n    (0, _vegaDataflow.Transform).call(this, null, params5);\n}\nGeoPath.Definition = {\n    \"type\": \"GeoPath\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"projection\"\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"pointRadius\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"path\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(GeoPath, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var out = pulse.fork(pulse.ALL), path = this.value, field = _.field || (0, _vegaUtil.identity), as = _.as || \"path\", flag = out.SOURCE;\n        if (!path || _.modified()) {\n            // parameters updated, reset and reflow\n            this.value = path = (0, _vegaProjection.getProjectionPath)(_.projection);\n            out.materialize().reflow();\n        } else flag = field === (0, _vegaUtil.identity) || pulse.modified(field.fields) ? out.ADD_MOD : out.ADD;\n        const prev = initPath(path, _.pointRadius);\n        out.visit(flag, (t)=>t[as] = path(field(t)));\n        path.pointRadius(prev);\n        return out.modifies(as);\n    }\n});\nfunction initPath(path, pointRadius) {\n    const prev = path.pointRadius();\n    path.context(null);\n    if (pointRadius != null) path.pointRadius(pointRadius);\n    return prev;\n}\n/**\n * Geo-code a longitude/latitude point to an x/y coordinate.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {Array<function(object): *>} params.fields - A two-element array of\n *   field accessors for the longitude and latitude values.\n * @param {Array<string>} [params.as] - A two-element array of field names\n *   under which to store the result. Defaults to ['x','y'].\n */ function GeoPoint(params6) {\n    (0, _vegaDataflow.Transform).call(this, null, params6);\n}\nGeoPoint.Definition = {\n    \"type\": \"GeoPoint\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"projection\",\n            \"required\": true\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"x\",\n                \"y\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(GeoPoint, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var proj = _.projection, lon = _.fields[0], lat = _.fields[1], as = _.as || [\n            \"x\",\n            \"y\"\n        ], x = as[0], y = as[1], mod;\n        function set2(t) {\n            const xy = proj([\n                lon(t),\n                lat(t)\n            ]);\n            if (xy) {\n                t[x] = xy[0];\n                t[y] = xy[1];\n            } else {\n                t[x] = undefined;\n                t[y] = undefined;\n            }\n        }\n        if (_.modified()) // parameters updated, reflow\n        pulse = pulse.materialize().reflow(true).visit(pulse.SOURCE, set2);\n        else {\n            mod = pulse.modified(lon.fields) || pulse.modified(lat.fields);\n            pulse.visit(mod ? pulse.ADD_MOD : pulse.ADD, set2);\n        }\n        return pulse.modifies(as);\n    }\n});\n/**\n * Annotate items with a geopath shape generator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {function(object): *} [params.field] - The field with GeoJSON data,\n *   or null if the tuple itself is a GeoJSON feature.\n * @param {string} [params.as='shape'] - The output field in which to store\n *   the generated path data (default 'shape').\n */ function GeoShape(params7) {\n    (0, _vegaDataflow.Transform).call(this, null, params7);\n}\nGeoShape.Definition = {\n    \"type\": \"GeoShape\",\n    \"metadata\": {\n        \"modifies\": true,\n        \"nomod\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"projection\"\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"default\": \"datum\"\n        },\n        {\n            \"name\": \"pointRadius\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"shape\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(GeoShape, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var out = pulse.fork(pulse.ALL), shape = this.value, as = _.as || \"shape\", flag = out.ADD;\n        if (!shape || _.modified()) {\n            // parameters updated, reset and reflow\n            this.value = shape = shapeGenerator((0, _vegaProjection.getProjectionPath)(_.projection), _.field || (0, _vegaUtil.field)(\"datum\"), _.pointRadius);\n            out.materialize().reflow();\n            flag = out.SOURCE;\n        }\n        out.visit(flag, (t)=>t[as] = shape);\n        return out.modifies(as);\n    }\n});\nfunction shapeGenerator(path, field, pointRadius) {\n    const shape = pointRadius == null ? (_)=>path(field(_)) : (_)=>{\n        var prev = path.pointRadius(), value = path.pointRadius(pointRadius)(field(_));\n        path.pointRadius(prev);\n        return value;\n    };\n    shape.context = (_)=>{\n        path.context(_);\n        return shape;\n    };\n    return shape;\n}\n/**\n * GeoJSON feature generator for creating graticules.\n * @constructor\n */ function Graticule(params8) {\n    (0, _vegaDataflow.Transform).call(this, [], params8);\n    this.generator = (0, _d3Geo.geoGraticule)();\n}\nGraticule.Definition = {\n    \"type\": \"Graticule\",\n    \"metadata\": {\n        \"changes\": true,\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"extent\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"length\": 2,\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        },\n        {\n            \"name\": \"extentMajor\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"length\": 2,\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        },\n        {\n            \"name\": \"extentMinor\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"length\": 2,\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"stepMajor\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                90,\n                360\n            ]\n        },\n        {\n            \"name\": \"stepMinor\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                10,\n                10\n            ]\n        },\n        {\n            \"name\": \"precision\",\n            \"type\": \"number\",\n            \"default\": 2.5\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Graticule, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var src = this.value, gen = this.generator, t;\n        if (!src.length || _.modified()) {\n            for(const prop in _)if ((0, _vegaUtil.isFunction)(gen[prop])) gen[prop](_[prop]);\n        }\n        t = gen();\n        if (src.length) pulse.mod.push((0, _vegaDataflow.replace)(src[0], t));\n        else pulse.add.push((0, _vegaDataflow.ingest)(t));\n        src[0] = t;\n        return pulse;\n    }\n});\n/**\n * Render a heatmap image for input raster grid data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} [params.field] - The field with raster grid\n *   data. If unspecified, the tuple itself is interpreted as a raster grid.\n * @param {string} [params.color] - A constant color value or function for\n *   individual pixel color. If a function, it will be invoked with an input\n *   object that includes $x, $y, $value, and $max fields for the grid.\n * @param {number} [params.opacity] - A constant opacity value or function for\n *   individual pixel opacity. If a function, it will be invoked with an input\n *   object that includes $x, $y, $value, and $max fields for the grid.\n * @param {string} [params.resolve] - The method for resolving maximum values\n *   across multiple input grids. If 'independent' (the default), maximum\n *   calculation will be performed separately for each grid. If 'shared',\n *   a single global maximum will be used for all input grids.\n * @param {string} [params.as='image'] - The output field in which to store\n *   the generated bitmap canvas images (default 'image').\n */ function Heatmap(params9) {\n    (0, _vegaDataflow.Transform).call(this, null, params9);\n}\nHeatmap.Definition = {\n    \"type\": \"heatmap\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"color\",\n            \"type\": \"string\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"opacity\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"resolve\",\n            \"type\": \"enum\",\n            \"values\": [\n                \"shared\",\n                \"independent\"\n            ],\n            \"default\": \"independent\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"image\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Heatmap, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!pulse.changed() && !_.modified()) return pulse.StopPropagation;\n        var source = pulse.materialize(pulse.SOURCE).source, shared = _.resolve === \"shared\", field = _.field || (0, _vegaUtil.identity), opacity = opacity_(_.opacity, _), color = color_(_.color, _), as = _.as || \"image\", obj = {\n            $x: 0,\n            $y: 0,\n            $value: 0,\n            $max: shared ? (0, _d3Array.max)(source.map((t)=>(0, _d3Array.max)(field(t).values))) : 0\n        };\n        source.forEach((t)=>{\n            const v = field(t); // build proxy data object\n            const o = (0, _vegaUtil.extend)({}, t, obj); // set maximum value if not globally shared\n            if (!shared) o.$max = (0, _d3Array.max)(v.values || []); // generate canvas image\n            // optimize color/opacity if not pixel-dependent\n            t[as] = toCanvas(v, o, color.dep ? color : (0, _vegaUtil.constant)(color(o)), opacity.dep ? opacity : (0, _vegaUtil.constant)(opacity(o)));\n        });\n        return pulse.reflow(true).modifies(as);\n    }\n}); // get image color function\nfunction color_(color, _) {\n    let f;\n    if ((0, _vegaUtil.isFunction)(color)) {\n        f = (obj)=>(0, _d3Color.rgb)(color(obj, _));\n        f.dep = dependency(color);\n    } else // default to mid-grey\n    f = (0, _vegaUtil.constant)((0, _d3Color.rgb)(color || \"#888\"));\n    return f;\n} // get image opacity function\nfunction opacity_(opacity, _) {\n    let f;\n    if ((0, _vegaUtil.isFunction)(opacity)) {\n        f = (obj)=>opacity(obj, _);\n        f.dep = dependency(opacity);\n    } else if (opacity) f = (0, _vegaUtil.constant)(opacity);\n    else {\n        // default to [0, max] opacity gradient\n        f = (obj)=>obj.$value / obj.$max || 0;\n        f.dep = true;\n    }\n    return f;\n} // check if function depends on individual pixel data\nfunction dependency(f) {\n    if (!(0, _vegaUtil.isFunction)(f)) return false;\n    const set3 = (0, _vegaUtil.toSet)((0, _vegaUtil.accessorFields)(f));\n    return set3.$x || set3.$y || set3.$value || set3.$max;\n} // render raster grid to canvas\nfunction toCanvas(grid, obj, color, opacity) {\n    const n = grid.width, m = grid.height, x1 = grid.x1 || 0, y1 = grid.y1 || 0, x2 = grid.x2 || n, y2 = grid.y2 || m, val = grid.values, value = val ? (i)=>val[i] : (0, _vegaUtil.zero), can = (0, _vegaCanvas.canvas)(x2 - x1, y2 - y1), ctx = can.getContext(\"2d\"), img = ctx.getImageData(0, 0, x2 - x1, y2 - y1), pix = img.data;\n    for(let j = y1, k = 0; j < y2; ++j){\n        obj.$y = j - y1;\n        for(let i = x1, r = j * n; i < x2; ++i, k += 4){\n            obj.$x = i - x1;\n            obj.$value = value(i + r);\n            const v = color(obj);\n            pix[k + 0] = v.r;\n            pix[k + 1] = v.g;\n            pix[k + 2] = v.b;\n            pix[k + 3] = ~~(255 * opacity(obj));\n        }\n    }\n    ctx.putImageData(img, 0, 0);\n    return can;\n}\n/**\n * Maintains a cartographic projection.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function Projection(params10) {\n    (0, _vegaDataflow.Transform).call(this, null, params10);\n    this.modified(true); // always treat as modified\n}\n(0, _vegaUtil.inherits)(Projection, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        let proj = this.value;\n        if (!proj || _.modified(\"type\")) {\n            this.value = proj = create(_.type);\n            (0, _vegaProjection.projectionProperties).forEach((prop)=>{\n                if (_[prop] != null) set(proj, prop, _[prop]);\n            });\n        } else (0, _vegaProjection.projectionProperties).forEach((prop)=>{\n            if (_.modified(prop)) set(proj, prop, _[prop]);\n        });\n        if (_.pointRadius != null) proj.path.pointRadius(_.pointRadius);\n        if (_.fit) fit(proj, _);\n        return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n    }\n});\nfunction fit(proj, _) {\n    const data = collectGeoJSON(_.fit);\n    _.extent ? proj.fitExtent(_.extent, data) : _.size && proj.fitSize(_.size, data);\n}\nfunction create(type) {\n    const constructor = (0, _vegaProjection.projection)((type || \"mercator\").toLowerCase());\n    if (!constructor) (0, _vegaUtil.error)(\"Unrecognized projection type: \" + type);\n    return constructor();\n}\nfunction set(proj, key, value) {\n    if ((0, _vegaUtil.isFunction)(proj[key])) proj[key](value);\n}\nfunction collectGeoJSON(data) {\n    data = (0, _vegaUtil.array)(data);\n    return data.length === 1 ? data[0] : {\n        type: FeatureCollection,\n        features: data.reduce((a, f)=>a.concat(featurize(f)), [])\n    };\n}\nfunction featurize(f) {\n    return f.type === FeatureCollection ? f.features : (0, _vegaUtil.array)(f).filter((d)=>d != null).map((d)=>d.type === Feature ? d : {\n            type: Feature,\n            geometry: d\n        });\n}\n\n},{\"vega-dataflow\":\"4kvYg\",\"vega-util\":\"dPFAY\",\"d3-array\":\"8JMcC\",\"vega-statistics\":\"hZmG3\",\"vega-projection\":\"6FRxi\",\"d3-geo\":\"1UFrq\",\"d3-color\":\"2I9cJ\",\"vega-canvas\":\"7F0ce\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6FRxi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getProjectionPath\", ()=>getProjectionPath);\nparcelHelpers.export(exports, \"projection\", ()=>projection);\nparcelHelpers.export(exports, \"projectionProperties\", ()=>projectionProperties);\nvar _d3Geo = require(\"d3-geo\");\nvar _d3GeoProjection = require(\"d3-geo-projection\");\nconst defaultPath = (0, _d3Geo.geoPath)();\nconst projectionProperties = [\n    \"clipAngle\",\n    \"clipExtent\",\n    \"scale\",\n    \"translate\",\n    \"center\",\n    \"rotate\",\n    \"parallels\",\n    \"precision\",\n    \"reflectX\",\n    \"reflectY\",\n    \"coefficient\",\n    \"distance\",\n    \"fraction\",\n    \"lobes\",\n    \"parallel\",\n    \"radius\",\n    \"ratio\",\n    \"spacing\",\n    \"tilt\"\n];\n/**\n * Augment projections with their type and a copy method.\n */ function create(type, constructor) {\n    return function projection1() {\n        const p = constructor();\n        p.type = type;\n        p.path = (0, _d3Geo.geoPath)().projection(p);\n        p.copy = p.copy || function() {\n            const c = projection1();\n            projectionProperties.forEach((prop)=>{\n                if (p[prop]) c[prop](p[prop]());\n            });\n            c.path.pointRadius(p.path.pointRadius());\n            return c;\n        };\n        return p;\n    };\n}\nfunction projection(type, proj) {\n    if (!type || typeof type !== \"string\") throw new Error(\"Projection type must be a name string.\");\n    type = type.toLowerCase();\n    if (arguments.length > 1) {\n        projections[type] = create(type, proj);\n        return this;\n    } else return projections[type] || null;\n}\nfunction getProjectionPath(proj) {\n    return proj && proj.path || defaultPath;\n}\nconst projections = {\n    // base d3-geo projection types\n    albers: (0, _d3Geo.geoAlbers),\n    albersusa: (0, _d3Geo.geoAlbersUsa),\n    azimuthalequalarea: (0, _d3Geo.geoAzimuthalEqualArea),\n    azimuthalequidistant: (0, _d3Geo.geoAzimuthalEquidistant),\n    conicconformal: (0, _d3Geo.geoConicConformal),\n    conicequalarea: (0, _d3Geo.geoConicEqualArea),\n    conicequidistant: (0, _d3Geo.geoConicEquidistant),\n    equalEarth: (0, _d3Geo.geoEqualEarth),\n    equirectangular: (0, _d3Geo.geoEquirectangular),\n    gnomonic: (0, _d3Geo.geoGnomonic),\n    identity: (0, _d3Geo.geoIdentity),\n    mercator: (0, _d3Geo.geoMercator),\n    mollweide: (0, _d3GeoProjection.geoMollweide),\n    naturalEarth1: (0, _d3Geo.geoNaturalEarth1),\n    orthographic: (0, _d3Geo.geoOrthographic),\n    stereographic: (0, _d3Geo.geoStereographic),\n    transversemercator: (0, _d3Geo.geoTransverseMercator)\n};\nfor(const key in projections)projection(key, projections[key]);\n\n},{\"d3-geo\":\"1UFrq\",\"d3-geo-projection\":\"3lKpN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1UFrq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"geoArea\", ()=>(0, _areaJsDefault.default));\nparcelHelpers.export(exports, \"geoBounds\", ()=>(0, _boundsJsDefault.default));\nparcelHelpers.export(exports, \"geoCentroid\", ()=>(0, _centroidJsDefault.default));\nparcelHelpers.export(exports, \"geoCircle\", ()=>(0, _circleJsDefault.default));\nparcelHelpers.export(exports, \"geoClipAntimeridian\", ()=>(0, _antimeridianJsDefault.default));\nparcelHelpers.export(exports, \"geoClipCircle\", ()=>(0, _circleJsDefault1.default));\nparcelHelpers.export(exports, \"geoClipExtent\", ()=>(0, _extentJsDefault.default)) // DEPRECATED! Use d3.geoIdentity().clipExtent(…).\n;\nparcelHelpers.export(exports, \"geoClipRectangle\", ()=>(0, _rectangleJsDefault.default));\nparcelHelpers.export(exports, \"geoContains\", ()=>(0, _containsJsDefault.default));\nparcelHelpers.export(exports, \"geoDistance\", ()=>(0, _distanceJsDefault.default));\nparcelHelpers.export(exports, \"geoGraticule\", ()=>(0, _graticuleJsDefault.default));\nparcelHelpers.export(exports, \"geoGraticule10\", ()=>(0, _graticuleJs.graticule10));\nparcelHelpers.export(exports, \"geoInterpolate\", ()=>(0, _interpolateJsDefault.default));\nparcelHelpers.export(exports, \"geoLength\", ()=>(0, _lengthJsDefault.default));\nparcelHelpers.export(exports, \"geoPath\", ()=>(0, _indexJsDefault.default));\nparcelHelpers.export(exports, \"geoAlbers\", ()=>(0, _albersJsDefault.default));\nparcelHelpers.export(exports, \"geoAlbersUsa\", ()=>(0, _albersUsaJsDefault.default));\nparcelHelpers.export(exports, \"geoAzimuthalEqualArea\", ()=>(0, _azimuthalEqualAreaJsDefault.default));\nparcelHelpers.export(exports, \"geoAzimuthalEqualAreaRaw\", ()=>(0, _azimuthalEqualAreaJs.azimuthalEqualAreaRaw));\nparcelHelpers.export(exports, \"geoAzimuthalEquidistant\", ()=>(0, _azimuthalEquidistantJsDefault.default));\nparcelHelpers.export(exports, \"geoAzimuthalEquidistantRaw\", ()=>(0, _azimuthalEquidistantJs.azimuthalEquidistantRaw));\nparcelHelpers.export(exports, \"geoConicConformal\", ()=>(0, _conicConformalJsDefault.default));\nparcelHelpers.export(exports, \"geoConicConformalRaw\", ()=>(0, _conicConformalJs.conicConformalRaw));\nparcelHelpers.export(exports, \"geoConicEqualArea\", ()=>(0, _conicEqualAreaJsDefault.default));\nparcelHelpers.export(exports, \"geoConicEqualAreaRaw\", ()=>(0, _conicEqualAreaJs.conicEqualAreaRaw));\nparcelHelpers.export(exports, \"geoConicEquidistant\", ()=>(0, _conicEquidistantJsDefault.default));\nparcelHelpers.export(exports, \"geoConicEquidistantRaw\", ()=>(0, _conicEquidistantJs.conicEquidistantRaw));\nparcelHelpers.export(exports, \"geoEqualEarth\", ()=>(0, _equalEarthJsDefault.default));\nparcelHelpers.export(exports, \"geoEqualEarthRaw\", ()=>(0, _equalEarthJs.equalEarthRaw));\nparcelHelpers.export(exports, \"geoEquirectangular\", ()=>(0, _equirectangularJsDefault.default));\nparcelHelpers.export(exports, \"geoEquirectangularRaw\", ()=>(0, _equirectangularJs.equirectangularRaw));\nparcelHelpers.export(exports, \"geoGnomonic\", ()=>(0, _gnomonicJsDefault.default));\nparcelHelpers.export(exports, \"geoGnomonicRaw\", ()=>(0, _gnomonicJs.gnomonicRaw));\nparcelHelpers.export(exports, \"geoIdentity\", ()=>(0, _identityJsDefault.default));\nparcelHelpers.export(exports, \"geoProjection\", ()=>(0, _indexJsDefault1.default));\nparcelHelpers.export(exports, \"geoProjectionMutator\", ()=>(0, _indexJs1.projectionMutator));\nparcelHelpers.export(exports, \"geoMercator\", ()=>(0, _mercatorJsDefault.default));\nparcelHelpers.export(exports, \"geoMercatorRaw\", ()=>(0, _mercatorJs.mercatorRaw));\nparcelHelpers.export(exports, \"geoNaturalEarth1\", ()=>(0, _naturalEarth1JsDefault.default));\nparcelHelpers.export(exports, \"geoNaturalEarth1Raw\", ()=>(0, _naturalEarth1Js.naturalEarth1Raw));\nparcelHelpers.export(exports, \"geoOrthographic\", ()=>(0, _orthographicJsDefault.default));\nparcelHelpers.export(exports, \"geoOrthographicRaw\", ()=>(0, _orthographicJs.orthographicRaw));\nparcelHelpers.export(exports, \"geoStereographic\", ()=>(0, _stereographicJsDefault.default));\nparcelHelpers.export(exports, \"geoStereographicRaw\", ()=>(0, _stereographicJs.stereographicRaw));\nparcelHelpers.export(exports, \"geoTransverseMercator\", ()=>(0, _transverseMercatorJsDefault.default));\nparcelHelpers.export(exports, \"geoTransverseMercatorRaw\", ()=>(0, _transverseMercatorJs.transverseMercatorRaw));\nparcelHelpers.export(exports, \"geoRotation\", ()=>(0, _rotationJsDefault.default));\nparcelHelpers.export(exports, \"geoStream\", ()=>(0, _streamJsDefault.default));\nparcelHelpers.export(exports, \"geoTransform\", ()=>(0, _transformJsDefault.default));\nvar _areaJs = require(\"./area.js\");\nvar _areaJsDefault = parcelHelpers.interopDefault(_areaJs);\nvar _boundsJs = require(\"./bounds.js\");\nvar _boundsJsDefault = parcelHelpers.interopDefault(_boundsJs);\nvar _centroidJs = require(\"./centroid.js\");\nvar _centroidJsDefault = parcelHelpers.interopDefault(_centroidJs);\nvar _circleJs = require(\"./circle.js\");\nvar _circleJsDefault = parcelHelpers.interopDefault(_circleJs);\nvar _antimeridianJs = require(\"./clip/antimeridian.js\");\nvar _antimeridianJsDefault = parcelHelpers.interopDefault(_antimeridianJs);\nvar _circleJs1 = require(\"./clip/circle.js\");\nvar _circleJsDefault1 = parcelHelpers.interopDefault(_circleJs1);\nvar _extentJs = require(\"./clip/extent.js\");\nvar _extentJsDefault = parcelHelpers.interopDefault(_extentJs);\nvar _rectangleJs = require(\"./clip/rectangle.js\");\nvar _rectangleJsDefault = parcelHelpers.interopDefault(_rectangleJs);\nvar _containsJs = require(\"./contains.js\");\nvar _containsJsDefault = parcelHelpers.interopDefault(_containsJs);\nvar _distanceJs = require(\"./distance.js\");\nvar _distanceJsDefault = parcelHelpers.interopDefault(_distanceJs);\nvar _graticuleJs = require(\"./graticule.js\");\nvar _graticuleJsDefault = parcelHelpers.interopDefault(_graticuleJs);\nvar _interpolateJs = require(\"./interpolate.js\");\nvar _interpolateJsDefault = parcelHelpers.interopDefault(_interpolateJs);\nvar _lengthJs = require(\"./length.js\");\nvar _lengthJsDefault = parcelHelpers.interopDefault(_lengthJs);\nvar _indexJs = require(\"./path/index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _albersJs = require(\"./projection/albers.js\");\nvar _albersJsDefault = parcelHelpers.interopDefault(_albersJs);\nvar _albersUsaJs = require(\"./projection/albersUsa.js\");\nvar _albersUsaJsDefault = parcelHelpers.interopDefault(_albersUsaJs);\nvar _azimuthalEqualAreaJs = require(\"./projection/azimuthalEqualArea.js\");\nvar _azimuthalEqualAreaJsDefault = parcelHelpers.interopDefault(_azimuthalEqualAreaJs);\nvar _azimuthalEquidistantJs = require(\"./projection/azimuthalEquidistant.js\");\nvar _azimuthalEquidistantJsDefault = parcelHelpers.interopDefault(_azimuthalEquidistantJs);\nvar _conicConformalJs = require(\"./projection/conicConformal.js\");\nvar _conicConformalJsDefault = parcelHelpers.interopDefault(_conicConformalJs);\nvar _conicEqualAreaJs = require(\"./projection/conicEqualArea.js\");\nvar _conicEqualAreaJsDefault = parcelHelpers.interopDefault(_conicEqualAreaJs);\nvar _conicEquidistantJs = require(\"./projection/conicEquidistant.js\");\nvar _conicEquidistantJsDefault = parcelHelpers.interopDefault(_conicEquidistantJs);\nvar _equalEarthJs = require(\"./projection/equalEarth.js\");\nvar _equalEarthJsDefault = parcelHelpers.interopDefault(_equalEarthJs);\nvar _equirectangularJs = require(\"./projection/equirectangular.js\");\nvar _equirectangularJsDefault = parcelHelpers.interopDefault(_equirectangularJs);\nvar _gnomonicJs = require(\"./projection/gnomonic.js\");\nvar _gnomonicJsDefault = parcelHelpers.interopDefault(_gnomonicJs);\nvar _identityJs = require(\"./projection/identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _indexJs1 = require(\"./projection/index.js\");\nvar _indexJsDefault1 = parcelHelpers.interopDefault(_indexJs1);\nvar _mercatorJs = require(\"./projection/mercator.js\");\nvar _mercatorJsDefault = parcelHelpers.interopDefault(_mercatorJs);\nvar _naturalEarth1Js = require(\"./projection/naturalEarth1.js\");\nvar _naturalEarth1JsDefault = parcelHelpers.interopDefault(_naturalEarth1Js);\nvar _orthographicJs = require(\"./projection/orthographic.js\");\nvar _orthographicJsDefault = parcelHelpers.interopDefault(_orthographicJs);\nvar _stereographicJs = require(\"./projection/stereographic.js\");\nvar _stereographicJsDefault = parcelHelpers.interopDefault(_stereographicJs);\nvar _transverseMercatorJs = require(\"./projection/transverseMercator.js\");\nvar _transverseMercatorJsDefault = parcelHelpers.interopDefault(_transverseMercatorJs);\nvar _rotationJs = require(\"./rotation.js\");\nvar _rotationJsDefault = parcelHelpers.interopDefault(_rotationJs);\nvar _streamJs = require(\"./stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar _transformJs = require(\"./transform.js\");\nvar _transformJsDefault = parcelHelpers.interopDefault(_transformJs);\n\n},{\"./area.js\":\"9OI2w\",\"./bounds.js\":\"8uxad\",\"./centroid.js\":\"ctR4z\",\"./circle.js\":\"3JboS\",\"./clip/antimeridian.js\":\"bvEzz\",\"./clip/circle.js\":\"gm7cL\",\"./clip/extent.js\":false,\"./clip/rectangle.js\":\"1FZ3Z\",\"./contains.js\":false,\"./distance.js\":false,\"./graticule.js\":\"dyZlA\",\"./interpolate.js\":false,\"./length.js\":false,\"./path/index.js\":\"3dcD3\",\"./projection/albers.js\":\"bpSYz\",\"./projection/albersUsa.js\":\"7IuwQ\",\"./projection/azimuthalEqualArea.js\":\"63blr\",\"./projection/azimuthalEquidistant.js\":\"7w2oT\",\"./projection/conicConformal.js\":\"evY8P\",\"./projection/conicEqualArea.js\":\"95gV8\",\"./projection/conicEquidistant.js\":\"5ECob\",\"./projection/equalEarth.js\":\"lL9Mh\",\"./projection/equirectangular.js\":\"7LWmg\",\"./projection/gnomonic.js\":\"f5IMi\",\"./projection/identity.js\":\"74iXI\",\"./projection/index.js\":\"err8N\",\"./projection/mercator.js\":\"a3u6b\",\"./projection/naturalEarth1.js\":\"bSXCt\",\"./projection/orthographic.js\":\"b9yDq\",\"./projection/stereographic.js\":\"7rm2j\",\"./projection/transverseMercator.js\":\"k1100\",\"./rotation.js\":\"5axF2\",\"./stream.js\":\"iPxfz\",\"./transform.js\":\"dzOgu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9OI2w\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"areaRingSum\", ()=>areaRingSum);\nparcelHelpers.export(exports, \"areaStream\", ()=>areaStream);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"./math.js\");\nvar _noopJs = require(\"./noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _streamJs = require(\"./stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar areaRingSum = new (0, _d3Array.Adder)();\n// hello?\nvar areaSum = new (0, _d3Array.Adder)(), lambda00, phi00, lambda0, cosPhi0, sinPhi0;\nvar areaStream = {\n    point: (0, _noopJsDefault.default),\n    lineStart: (0, _noopJsDefault.default),\n    lineEnd: (0, _noopJsDefault.default),\n    polygonStart: function() {\n        areaRingSum = new (0, _d3Array.Adder)();\n        areaStream.lineStart = areaRingStart;\n        areaStream.lineEnd = areaRingEnd;\n    },\n    polygonEnd: function() {\n        var areaRing = +areaRingSum;\n        areaSum.add(areaRing < 0 ? (0, _mathJs.tau) + areaRing : areaRing);\n        this.lineStart = this.lineEnd = this.point = (0, _noopJsDefault.default);\n    },\n    sphere: function() {\n        areaSum.add((0, _mathJs.tau));\n    }\n};\nfunction areaRingStart() {\n    areaStream.point = areaPointFirst;\n}\nfunction areaRingEnd() {\n    areaPoint(lambda00, phi00);\n}\nfunction areaPointFirst(lambda, phi) {\n    areaStream.point = areaPoint;\n    lambda00 = lambda, phi00 = phi;\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    lambda0 = lambda, cosPhi0 = (0, _mathJs.cos)(phi = phi / 2 + (0, _mathJs.quarterPi)), sinPhi0 = (0, _mathJs.sin)(phi);\n}\nfunction areaPoint(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    phi = phi / 2 + (0, _mathJs.quarterPi); // half the angular distance from south pole\n    // Spherical excess E for a spherical triangle with vertices: south pole,\n    // previous point, current point.  Uses a formula derived from Cagnoli’s\n    // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n    var dLambda = lambda - lambda0, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = (0, _mathJs.cos)(phi), sinPhi = (0, _mathJs.sin)(phi), k = sinPhi0 * sinPhi, u = cosPhi0 * cosPhi + k * (0, _mathJs.cos)(adLambda), v = k * sdLambda * (0, _mathJs.sin)(adLambda);\n    areaRingSum.add((0, _mathJs.atan2)(v, u));\n    // Advance the previous points.\n    lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\nexports.default = function(object) {\n    areaSum = new (0, _d3Array.Adder)();\n    (0, _streamJsDefault.default)(object, areaStream);\n    return areaSum * 2;\n};\n\n},{\"d3-array\":\"8JMcC\",\"./math.js\":\"cDOGy\",\"./noop.js\":\"jtH2K\",\"./stream.js\":\"iPxfz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cDOGy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"epsilon\", ()=>epsilon);\nparcelHelpers.export(exports, \"epsilon2\", ()=>epsilon2);\nparcelHelpers.export(exports, \"pi\", ()=>pi);\nparcelHelpers.export(exports, \"halfPi\", ()=>halfPi);\nparcelHelpers.export(exports, \"quarterPi\", ()=>quarterPi);\nparcelHelpers.export(exports, \"tau\", ()=>tau);\nparcelHelpers.export(exports, \"degrees\", ()=>degrees);\nparcelHelpers.export(exports, \"radians\", ()=>radians);\nparcelHelpers.export(exports, \"abs\", ()=>abs);\nparcelHelpers.export(exports, \"atan\", ()=>atan);\nparcelHelpers.export(exports, \"atan2\", ()=>atan2);\nparcelHelpers.export(exports, \"cos\", ()=>cos);\nparcelHelpers.export(exports, \"ceil\", ()=>ceil);\nparcelHelpers.export(exports, \"exp\", ()=>exp);\nparcelHelpers.export(exports, \"floor\", ()=>floor);\nparcelHelpers.export(exports, \"hypot\", ()=>hypot);\nparcelHelpers.export(exports, \"log\", ()=>log);\nparcelHelpers.export(exports, \"pow\", ()=>pow);\nparcelHelpers.export(exports, \"sin\", ()=>sin);\nparcelHelpers.export(exports, \"sign\", ()=>sign);\nparcelHelpers.export(exports, \"sqrt\", ()=>sqrt);\nparcelHelpers.export(exports, \"tan\", ()=>tan);\nparcelHelpers.export(exports, \"acos\", ()=>acos);\nparcelHelpers.export(exports, \"asin\", ()=>asin);\nparcelHelpers.export(exports, \"haversin\", ()=>haversin);\nvar epsilon = 1e-6;\nvar epsilon2 = 1e-12;\nvar pi = Math.PI;\nvar halfPi = pi / 2;\nvar quarterPi = pi / 4;\nvar tau = pi * 2;\nvar degrees = 180 / pi;\nvar radians = pi / 180;\nvar abs = Math.abs;\nvar atan = Math.atan;\nvar atan2 = Math.atan2;\nvar cos = Math.cos;\nvar ceil = Math.ceil;\nvar exp = Math.exp;\nvar floor = Math.floor;\nvar hypot = Math.hypot;\nvar log = Math.log;\nvar pow = Math.pow;\nvar sin = Math.sin;\nvar sign = Math.sign || function(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n};\nvar sqrt = Math.sqrt;\nvar tan = Math.tan;\nfunction acos(x) {\n    return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\nfunction asin(x) {\n    return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\nfunction haversin(x) {\n    return (x = sin(x / 2)) * x;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jtH2K\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction noop() {}\nexports.default = noop;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iPxfz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction streamGeometry(geometry, stream) {\n    if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) streamGeometryType[geometry.type](geometry, stream);\n}\nvar streamObjectType = {\n    Feature: function(object, stream) {\n        streamGeometry(object.geometry, stream);\n    },\n    FeatureCollection: function(object, stream) {\n        var features = object.features, i = -1, n = features.length;\n        while(++i < n)streamGeometry(features[i].geometry, stream);\n    }\n};\nvar streamGeometryType = {\n    Sphere: function(object, stream) {\n        stream.sphere();\n    },\n    Point: function(object, stream) {\n        object = object.coordinates;\n        stream.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, stream) {\n        var coordinates = object.coordinates, i = -1, n = coordinates.length;\n        while(++i < n)object = coordinates[i], stream.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, stream) {\n        streamLine(object.coordinates, stream, 0);\n    },\n    MultiLineString: function(object, stream) {\n        var coordinates = object.coordinates, i = -1, n = coordinates.length;\n        while(++i < n)streamLine(coordinates[i], stream, 0);\n    },\n    Polygon: function(object, stream) {\n        streamPolygon(object.coordinates, stream);\n    },\n    MultiPolygon: function(object, stream) {\n        var coordinates = object.coordinates, i = -1, n = coordinates.length;\n        while(++i < n)streamPolygon(coordinates[i], stream);\n    },\n    GeometryCollection: function(object, stream) {\n        var geometries = object.geometries, i = -1, n = geometries.length;\n        while(++i < n)streamGeometry(geometries[i], stream);\n    }\n};\nfunction streamLine(coordinates, stream, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    stream.lineStart();\n    while(++i < n)coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n    stream.lineEnd();\n}\nfunction streamPolygon(coordinates, stream) {\n    var i = -1, n = coordinates.length;\n    stream.polygonStart();\n    while(++i < n)streamLine(coordinates[i], stream, 1);\n    stream.polygonEnd();\n}\nexports.default = function(object, stream) {\n    if (object && streamObjectType.hasOwnProperty(object.type)) streamObjectType[object.type](object, stream);\n    else streamGeometry(object, stream);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8uxad\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _areaJs = require(\"./area.js\");\nvar _cartesianJs = require(\"./cartesian.js\");\nvar _mathJs = require(\"./math.js\");\nvar _streamJs = require(\"./stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar lambda0, phi0, lambda1, phi1, lambda2, lambda00, phi00, p0, deltaSum, ranges, range;\nvar boundsStream = {\n    point: boundsPoint,\n    lineStart: boundsLineStart,\n    lineEnd: boundsLineEnd,\n    polygonStart: function() {\n        boundsStream.point = boundsRingPoint;\n        boundsStream.lineStart = boundsRingStart;\n        boundsStream.lineEnd = boundsRingEnd;\n        deltaSum = new (0, _d3Array.Adder)();\n        (0, _areaJs.areaStream).polygonStart();\n    },\n    polygonEnd: function() {\n        (0, _areaJs.areaStream).polygonEnd();\n        boundsStream.point = boundsPoint;\n        boundsStream.lineStart = boundsLineStart;\n        boundsStream.lineEnd = boundsLineEnd;\n        if ((0, _areaJs.areaRingSum) < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n        else if (deltaSum > (0, _mathJs.epsilon)) phi1 = 90;\n        else if (deltaSum < -(0, _mathJs.epsilon)) phi0 = -90;\n        range[0] = lambda0, range[1] = lambda1;\n    },\n    sphere: function() {\n        lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n    }\n};\nfunction boundsPoint(lambda, phi) {\n    ranges.push(range = [\n        lambda0 = lambda,\n        lambda1 = lambda\n    ]);\n    if (phi < phi0) phi0 = phi;\n    if (phi > phi1) phi1 = phi;\n}\nfunction linePoint(lambda, phi) {\n    var p = (0, _cartesianJs.cartesian)([\n        lambda * (0, _mathJs.radians),\n        phi * (0, _mathJs.radians)\n    ]);\n    if (p0) {\n        var normal = (0, _cartesianJs.cartesianCross)(p0, p), equatorial = [\n            normal[1],\n            -normal[0],\n            0\n        ], inflection = (0, _cartesianJs.cartesianCross)(equatorial, normal);\n        (0, _cartesianJs.cartesianNormalizeInPlace)(inflection);\n        inflection = (0, _cartesianJs.spherical)(inflection);\n        var delta = lambda - lambda2, sign = delta > 0 ? 1 : -1, lambdai = inflection[0] * (0, _mathJs.degrees) * sign, phii, antimeridian = (0, _mathJs.abs)(delta) > 180;\n        if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n            phii = inflection[1] * (0, _mathJs.degrees);\n            if (phii > phi1) phi1 = phii;\n        } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n            phii = -inflection[1] * (0, _mathJs.degrees);\n            if (phii < phi0) phi0 = phii;\n        } else {\n            if (phi < phi0) phi0 = phi;\n            if (phi > phi1) phi1 = phi;\n        }\n        if (antimeridian) {\n            if (lambda < lambda2) {\n                if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n            } else if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        } else if (lambda1 >= lambda0) {\n            if (lambda < lambda0) lambda0 = lambda;\n            if (lambda > lambda1) lambda1 = lambda;\n        } else {\n            if (lambda > lambda2) {\n                if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n            } else if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        }\n    } else ranges.push(range = [\n        lambda0 = lambda,\n        lambda1 = lambda\n    ]);\n    if (phi < phi0) phi0 = phi;\n    if (phi > phi1) phi1 = phi;\n    p0 = p, lambda2 = lambda;\n}\nfunction boundsLineStart() {\n    boundsStream.point = linePoint;\n}\nfunction boundsLineEnd() {\n    range[0] = lambda0, range[1] = lambda1;\n    boundsStream.point = boundsPoint;\n    p0 = null;\n}\nfunction boundsRingPoint(lambda, phi) {\n    if (p0) {\n        var delta = lambda - lambda2;\n        deltaSum.add((0, _mathJs.abs)(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n    } else lambda00 = lambda, phi00 = phi;\n    (0, _areaJs.areaStream).point(lambda, phi);\n    linePoint(lambda, phi);\n}\nfunction boundsRingStart() {\n    (0, _areaJs.areaStream).lineStart();\n}\nfunction boundsRingEnd() {\n    boundsRingPoint(lambda00, phi00);\n    (0, _areaJs.areaStream).lineEnd();\n    if ((0, _mathJs.abs)(deltaSum) > (0, _mathJs.epsilon)) lambda0 = -(lambda1 = 180);\n    range[0] = lambda0, range[1] = lambda1;\n    p0 = null;\n}\n// Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want\n// the distance between ±180° to be 360°.\nfunction angle(lambda01, lambda11) {\n    return (lambda11 -= lambda01) < 0 ? lambda11 + 360 : lambda11;\n}\nfunction rangeCompare(a, b) {\n    return a[0] - b[0];\n}\nfunction rangeContains(range1, x) {\n    return range1[0] <= range1[1] ? range1[0] <= x && x <= range1[1] : x < range1[0] || range1[1] < x;\n}\nexports.default = function(feature) {\n    var i, n, a, b, merged, deltaMax, delta;\n    phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n    ranges = [];\n    (0, _streamJsDefault.default)(feature, boundsStream);\n    // First, sort ranges by their minimum longitudes.\n    if (n = ranges.length) {\n        ranges.sort(rangeCompare);\n        // Then, merge any ranges that overlap.\n        for(i = 1, a = ranges[0], merged = [\n            a\n        ]; i < n; ++i){\n            b = ranges[i];\n            if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n                if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n                if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n            } else merged.push(a = b);\n        }\n        // Finally, find the largest gap between the merged ranges.\n        // The final bounding box will be the inverse of this gap.\n        for(deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i){\n            b = merged[i];\n            if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n        }\n    }\n    ranges = range = null;\n    return lambda0 === Infinity || phi0 === Infinity ? [\n        [\n            NaN,\n            NaN\n        ],\n        [\n            NaN,\n            NaN\n        ]\n    ] : [\n        [\n            lambda0,\n            phi0\n        ],\n        [\n            lambda1,\n            phi1\n        ]\n    ];\n};\n\n},{\"d3-array\":\"8JMcC\",\"./area.js\":\"9OI2w\",\"./cartesian.js\":\"e5njx\",\"./math.js\":\"cDOGy\",\"./stream.js\":\"iPxfz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e5njx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"spherical\", ()=>spherical);\nparcelHelpers.export(exports, \"cartesian\", ()=>cartesian);\nparcelHelpers.export(exports, \"cartesianDot\", ()=>cartesianDot);\nparcelHelpers.export(exports, \"cartesianCross\", ()=>cartesianCross);\n// TODO return a\nparcelHelpers.export(exports, \"cartesianAddInPlace\", ()=>cartesianAddInPlace);\nparcelHelpers.export(exports, \"cartesianScale\", ()=>cartesianScale);\n// TODO return d\nparcelHelpers.export(exports, \"cartesianNormalizeInPlace\", ()=>cartesianNormalizeInPlace);\nvar _mathJs = require(\"./math.js\");\nfunction spherical(cartesian1) {\n    return [\n        (0, _mathJs.atan2)(cartesian1[1], cartesian1[0]),\n        (0, _mathJs.asin)(cartesian1[2])\n    ];\n}\nfunction cartesian(spherical1) {\n    var lambda = spherical1[0], phi = spherical1[1], cosPhi = (0, _mathJs.cos)(phi);\n    return [\n        cosPhi * (0, _mathJs.cos)(lambda),\n        cosPhi * (0, _mathJs.sin)(lambda),\n        (0, _mathJs.sin)(phi)\n    ];\n}\nfunction cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\nfunction cartesianCross(a, b) {\n    return [\n        a[1] * b[2] - a[2] * b[1],\n        a[2] * b[0] - a[0] * b[2],\n        a[0] * b[1] - a[1] * b[0]\n    ];\n}\nfunction cartesianAddInPlace(a, b) {\n    a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\nfunction cartesianScale(vector, k) {\n    return [\n        vector[0] * k,\n        vector[1] * k,\n        vector[2] * k\n    ];\n}\nfunction cartesianNormalizeInPlace(d) {\n    var l = (0, _mathJs.sqrt)(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l, d[1] /= l, d[2] /= l;\n}\n\n},{\"./math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ctR4z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"./math.js\");\nvar _noopJs = require(\"./noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _streamJs = require(\"./stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar W0, W1, X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, lambda00, phi00, x0, y0, z0; // previous point\nvar centroidStream = {\n    sphere: (0, _noopJsDefault.default),\n    point: centroidPoint,\n    lineStart: centroidLineStart,\n    lineEnd: centroidLineEnd,\n    polygonStart: function() {\n        centroidStream.lineStart = centroidRingStart;\n        centroidStream.lineEnd = centroidRingEnd;\n    },\n    polygonEnd: function() {\n        centroidStream.lineStart = centroidLineStart;\n        centroidStream.lineEnd = centroidLineEnd;\n    }\n};\n// Arithmetic mean of Cartesian vectors.\nfunction centroidPoint(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    var cosPhi = (0, _mathJs.cos)(phi);\n    centroidPointCartesian(cosPhi * (0, _mathJs.cos)(lambda), cosPhi * (0, _mathJs.sin)(lambda), (0, _mathJs.sin)(phi));\n}\nfunction centroidPointCartesian(x, y, z) {\n    ++W0;\n    X0 += (x - X0) / W0;\n    Y0 += (y - Y0) / W0;\n    Z0 += (z - Z0) / W0;\n}\nfunction centroidLineStart() {\n    centroidStream.point = centroidLinePointFirst;\n}\nfunction centroidLinePointFirst(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    var cosPhi = (0, _mathJs.cos)(phi);\n    x0 = cosPhi * (0, _mathJs.cos)(lambda);\n    y0 = cosPhi * (0, _mathJs.sin)(lambda);\n    z0 = (0, _mathJs.sin)(phi);\n    centroidStream.point = centroidLinePoint;\n    centroidPointCartesian(x0, y0, z0);\n}\nfunction centroidLinePoint(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    var cosPhi = (0, _mathJs.cos)(phi), x = cosPhi * (0, _mathJs.cos)(lambda), y = cosPhi * (0, _mathJs.sin)(lambda), z = (0, _mathJs.sin)(phi), w = (0, _mathJs.atan2)((0, _mathJs.sqrt)((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n    W1 += w;\n    X1 += w * (x0 + (x0 = x));\n    Y1 += w * (y0 + (y0 = y));\n    Z1 += w * (z0 + (z0 = z));\n    centroidPointCartesian(x0, y0, z0);\n}\nfunction centroidLineEnd() {\n    centroidStream.point = centroidPoint;\n}\n// See J. E. Brock, The Inertia Tensor for a Spherical Triangle,\n// J. Applied Mechanics 42, 239 (1975).\nfunction centroidRingStart() {\n    centroidStream.point = centroidRingPointFirst;\n}\nfunction centroidRingEnd() {\n    centroidRingPoint(lambda00, phi00);\n    centroidStream.point = centroidPoint;\n}\nfunction centroidRingPointFirst(lambda, phi) {\n    lambda00 = lambda, phi00 = phi;\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    centroidStream.point = centroidRingPoint;\n    var cosPhi = (0, _mathJs.cos)(phi);\n    x0 = cosPhi * (0, _mathJs.cos)(lambda);\n    y0 = cosPhi * (0, _mathJs.sin)(lambda);\n    z0 = (0, _mathJs.sin)(phi);\n    centroidPointCartesian(x0, y0, z0);\n}\nfunction centroidRingPoint(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    var cosPhi = (0, _mathJs.cos)(phi), x = cosPhi * (0, _mathJs.cos)(lambda), y = cosPhi * (0, _mathJs.sin)(lambda), z = (0, _mathJs.sin)(phi), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = (0, _mathJs.hypot)(cx, cy, cz), w = (0, _mathJs.asin)(m), v = m && -w / m; // area weight multiplier\n    X2.add(v * cx);\n    Y2.add(v * cy);\n    Z2.add(v * cz);\n    W1 += w;\n    X1 += w * (x0 + (x0 = x));\n    Y1 += w * (y0 + (y0 = y));\n    Z1 += w * (z0 + (z0 = z));\n    centroidPointCartesian(x0, y0, z0);\n}\nexports.default = function(object) {\n    W0 = W1 = X0 = Y0 = Z0 = X1 = Y1 = Z1 = 0;\n    X2 = new (0, _d3Array.Adder)();\n    Y2 = new (0, _d3Array.Adder)();\n    Z2 = new (0, _d3Array.Adder)();\n    (0, _streamJsDefault.default)(object, centroidStream);\n    var x = +X2, y = +Y2, z = +Z2, m = (0, _mathJs.hypot)(x, y, z);\n    // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.\n    if (m < (0, _mathJs.epsilon2)) {\n        x = X1, y = Y1, z = Z1;\n        // If the feature has zero length, fall back to arithmetic mean of point vectors.\n        if (W1 < (0, _mathJs.epsilon)) x = X0, y = Y0, z = Z0;\n        m = (0, _mathJs.hypot)(x, y, z);\n        // If the feature still has an undefined ccentroid, then return.\n        if (m < (0, _mathJs.epsilon2)) return [\n            NaN,\n            NaN\n        ];\n    }\n    return [\n        (0, _mathJs.atan2)(y, x) * (0, _mathJs.degrees),\n        (0, _mathJs.asin)(z / m) * (0, _mathJs.degrees)\n    ];\n};\n\n},{\"d3-array\":\"8JMcC\",\"./math.js\":\"cDOGy\",\"./noop.js\":\"jtH2K\",\"./stream.js\":\"iPxfz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3JboS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\nparcelHelpers.export(exports, \"circleStream\", ()=>circleStream);\nvar _cartesianJs = require(\"./cartesian.js\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _mathJs = require(\"./math.js\");\nvar _rotationJs = require(\"./rotation.js\");\nfunction circleStream(stream, radius, delta, direction, t0, t1) {\n    if (!delta) return;\n    var cosRadius = (0, _mathJs.cos)(radius), sinRadius = (0, _mathJs.sin)(radius), step = direction * delta;\n    if (t0 == null) {\n        t0 = radius + direction * (0, _mathJs.tau);\n        t1 = radius - step / 2;\n    } else {\n        t0 = circleRadius(cosRadius, t0);\n        t1 = circleRadius(cosRadius, t1);\n        if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * (0, _mathJs.tau);\n    }\n    for(var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step){\n        point = (0, _cartesianJs.spherical)([\n            cosRadius,\n            -sinRadius * (0, _mathJs.cos)(t),\n            -sinRadius * (0, _mathJs.sin)(t)\n        ]);\n        stream.point(point[0], point[1]);\n    }\n}\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n    point = (0, _cartesianJs.cartesian)(point), point[0] -= cosRadius;\n    (0, _cartesianJs.cartesianNormalizeInPlace)(point);\n    var radius = (0, _mathJs.acos)(-point[1]);\n    return ((-point[2] < 0 ? -radius : radius) + (0, _mathJs.tau) - (0, _mathJs.epsilon)) % (0, _mathJs.tau);\n}\nexports.default = function() {\n    var center = (0, _constantJsDefault.default)([\n        0,\n        0\n    ]), radius = (0, _constantJsDefault.default)(90), precision = (0, _constantJsDefault.default)(6), ring, rotate, stream = {\n        point: point\n    };\n    function point(x, y) {\n        ring.push(x = rotate(x, y));\n        x[0] *= (0, _mathJs.degrees), x[1] *= (0, _mathJs.degrees);\n    }\n    function circle() {\n        var c = center.apply(this, arguments), r = radius.apply(this, arguments) * (0, _mathJs.radians), p = precision.apply(this, arguments) * (0, _mathJs.radians);\n        ring = [];\n        rotate = (0, _rotationJs.rotateRadians)(-c[0] * (0, _mathJs.radians), -c[1] * (0, _mathJs.radians), 0).invert;\n        circleStream(stream, r, p, 1);\n        c = {\n            type: \"Polygon\",\n            coordinates: [\n                ring\n            ]\n        };\n        ring = rotate = null;\n        return c;\n    }\n    circle.center = function(_) {\n        return arguments.length ? (center = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)([\n            +_[0],\n            +_[1]\n        ]), circle) : center;\n    };\n    circle.radius = function(_) {\n        return arguments.length ? (radius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), circle) : radius;\n    };\n    circle.precision = function(_) {\n        return arguments.length ? (precision = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), circle) : precision;\n    };\n    return circle;\n};\n\n},{\"./cartesian.js\":\"e5njx\",\"./constant.js\":\"haHmu\",\"./math.js\":\"cDOGy\",\"./rotation.js\":\"5axF2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"haHmu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return function() {\n        return x;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5axF2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"rotateRadians\", ()=>rotateRadians);\nvar _composeJs = require(\"./compose.js\");\nvar _composeJsDefault = parcelHelpers.interopDefault(_composeJs);\nvar _mathJs = require(\"./math.js\");\nfunction rotationIdentity(lambda, phi) {\n    return [\n        (0, _mathJs.abs)(lambda) > (0, _mathJs.pi) ? lambda + Math.round(-lambda / (0, _mathJs.tau)) * (0, _mathJs.tau) : lambda,\n        phi\n    ];\n}\nrotationIdentity.invert = rotationIdentity;\nfunction rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n    return (deltaLambda %= (0, _mathJs.tau)) ? deltaPhi || deltaGamma ? (0, _composeJsDefault.default)(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;\n}\nfunction forwardRotationLambda(deltaLambda) {\n    return function(lambda, phi) {\n        return lambda += deltaLambda, [\n            lambda > (0, _mathJs.pi) ? lambda - (0, _mathJs.tau) : lambda < -(0, _mathJs.pi) ? lambda + (0, _mathJs.tau) : lambda,\n            phi\n        ];\n    };\n}\nfunction rotationLambda(deltaLambda) {\n    var rotation = forwardRotationLambda(deltaLambda);\n    rotation.invert = forwardRotationLambda(-deltaLambda);\n    return rotation;\n}\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n    var cosDeltaPhi = (0, _mathJs.cos)(deltaPhi), sinDeltaPhi = (0, _mathJs.sin)(deltaPhi), cosDeltaGamma = (0, _mathJs.cos)(deltaGamma), sinDeltaGamma = (0, _mathJs.sin)(deltaGamma);\n    function rotation(lambda, phi) {\n        var cosPhi = (0, _mathJs.cos)(phi), x = (0, _mathJs.cos)(lambda) * cosPhi, y = (0, _mathJs.sin)(lambda) * cosPhi, z = (0, _mathJs.sin)(phi), k = z * cosDeltaPhi + x * sinDeltaPhi;\n        return [\n            (0, _mathJs.atan2)(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n            (0, _mathJs.asin)(k * cosDeltaGamma + y * sinDeltaGamma)\n        ];\n    }\n    rotation.invert = function(lambda, phi) {\n        var cosPhi = (0, _mathJs.cos)(phi), x = (0, _mathJs.cos)(lambda) * cosPhi, y = (0, _mathJs.sin)(lambda) * cosPhi, z = (0, _mathJs.sin)(phi), k = z * cosDeltaGamma - y * sinDeltaGamma;\n        return [\n            (0, _mathJs.atan2)(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n            (0, _mathJs.asin)(k * cosDeltaPhi - x * sinDeltaPhi)\n        ];\n    };\n    return rotation;\n}\nexports.default = function(rotate) {\n    rotate = rotateRadians(rotate[0] * (0, _mathJs.radians), rotate[1] * (0, _mathJs.radians), rotate.length > 2 ? rotate[2] * (0, _mathJs.radians) : 0);\n    function forward(coordinates) {\n        coordinates = rotate(coordinates[0] * (0, _mathJs.radians), coordinates[1] * (0, _mathJs.radians));\n        return coordinates[0] *= (0, _mathJs.degrees), coordinates[1] *= (0, _mathJs.degrees), coordinates;\n    }\n    forward.invert = function(coordinates) {\n        coordinates = rotate.invert(coordinates[0] * (0, _mathJs.radians), coordinates[1] * (0, _mathJs.radians));\n        return coordinates[0] *= (0, _mathJs.degrees), coordinates[1] *= (0, _mathJs.degrees), coordinates;\n    };\n    return forward;\n};\n\n},{\"./compose.js\":\"8JySJ\",\"./math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8JySJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    function compose(x, y) {\n        return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n        return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bvEzz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _mathJs = require(\"../math.js\");\nexports.default = (0, _indexJsDefault.default)(function() {\n    return true;\n}, clipAntimeridianLine, clipAntimeridianInterpolate, [\n    -(0, _mathJs.pi),\n    -(0, _mathJs.halfPi)\n]);\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n    var lambda0 = NaN, phi0 = NaN, sign0 = NaN, clean; // no intersections\n    return {\n        lineStart: function() {\n            stream.lineStart();\n            clean = 1;\n        },\n        point: function(lambda1, phi1) {\n            var sign1 = lambda1 > 0 ? (0, _mathJs.pi) : -(0, _mathJs.pi), delta = (0, _mathJs.abs)(lambda1 - lambda0);\n            if ((0, _mathJs.abs)(delta - (0, _mathJs.pi)) < (0, _mathJs.epsilon)) {\n                stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? (0, _mathJs.halfPi) : -(0, _mathJs.halfPi));\n                stream.point(sign0, phi0);\n                stream.lineEnd();\n                stream.lineStart();\n                stream.point(sign1, phi0);\n                stream.point(lambda1, phi0);\n                clean = 0;\n            } else if (sign0 !== sign1 && delta >= (0, _mathJs.pi)) {\n                if ((0, _mathJs.abs)(lambda0 - sign0) < (0, _mathJs.epsilon)) lambda0 -= sign0 * (0, _mathJs.epsilon); // handle degeneracies\n                if ((0, _mathJs.abs)(lambda1 - sign1) < (0, _mathJs.epsilon)) lambda1 -= sign1 * (0, _mathJs.epsilon);\n                phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n                stream.point(sign0, phi0);\n                stream.lineEnd();\n                stream.lineStart();\n                stream.point(sign1, phi0);\n                clean = 0;\n            }\n            stream.point(lambda0 = lambda1, phi0 = phi1);\n            sign0 = sign1;\n        },\n        lineEnd: function() {\n            stream.lineEnd();\n            lambda0 = phi0 = NaN;\n        },\n        clean: function() {\n            return 2 - clean; // if intersections, rejoin first and last segments\n        }\n    };\n}\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n    var cosPhi0, cosPhi1, sinLambda0Lambda1 = (0, _mathJs.sin)(lambda0 - lambda1);\n    return (0, _mathJs.abs)(sinLambda0Lambda1) > (0, _mathJs.epsilon) ? (0, _mathJs.atan)(((0, _mathJs.sin)(phi0) * (cosPhi1 = (0, _mathJs.cos)(phi1)) * (0, _mathJs.sin)(lambda1) - (0, _mathJs.sin)(phi1) * (cosPhi0 = (0, _mathJs.cos)(phi0)) * (0, _mathJs.sin)(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi0 + phi1) / 2;\n}\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n    var phi;\n    if (from == null) {\n        phi = direction * (0, _mathJs.halfPi);\n        stream.point(-(0, _mathJs.pi), phi);\n        stream.point(0, phi);\n        stream.point((0, _mathJs.pi), phi);\n        stream.point((0, _mathJs.pi), 0);\n        stream.point((0, _mathJs.pi), -phi);\n        stream.point(0, -phi);\n        stream.point(-(0, _mathJs.pi), -phi);\n        stream.point(-(0, _mathJs.pi), 0);\n        stream.point(-(0, _mathJs.pi), phi);\n    } else if ((0, _mathJs.abs)(from[0] - to[0]) > (0, _mathJs.epsilon)) {\n        var lambda = from[0] < to[0] ? (0, _mathJs.pi) : -(0, _mathJs.pi);\n        phi = direction * lambda / 2;\n        stream.point(-lambda, phi);\n        stream.point(0, phi);\n        stream.point(lambda, phi);\n    } else stream.point(to[0], to[1]);\n}\n\n},{\"./index.js\":\"29u4z\",\"../math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"29u4z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _bufferJs = require(\"./buffer.js\");\nvar _bufferJsDefault = parcelHelpers.interopDefault(_bufferJs);\nvar _rejoinJs = require(\"./rejoin.js\");\nvar _rejoinJsDefault = parcelHelpers.interopDefault(_rejoinJs);\nvar _mathJs = require(\"../math.js\");\nvar _polygonContainsJs = require(\"../polygonContains.js\");\nvar _polygonContainsJsDefault = parcelHelpers.interopDefault(_polygonContainsJs);\nvar _d3Array = require(\"d3-array\");\nexports.default = function(pointVisible, clipLine, interpolate, start) {\n    return function(sink) {\n        var line = clipLine(sink), ringBuffer = (0, _bufferJsDefault.default)(), ringSink = clipLine(ringBuffer), polygonStarted = false, polygon, segments, ring;\n        var clip = {\n            point: point1,\n            lineStart: lineStart,\n            lineEnd: lineEnd,\n            polygonStart: function() {\n                clip.point = pointRing;\n                clip.lineStart = ringStart;\n                clip.lineEnd = ringEnd;\n                segments = [];\n                polygon = [];\n            },\n            polygonEnd: function() {\n                clip.point = point1;\n                clip.lineStart = lineStart;\n                clip.lineEnd = lineEnd;\n                segments = (0, _d3Array.merge)(segments);\n                var startInside = (0, _polygonContainsJsDefault.default)(polygon, start);\n                if (segments.length) {\n                    if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n                    (0, _rejoinJsDefault.default)(segments, compareIntersection, startInside, interpolate, sink);\n                } else if (startInside) {\n                    if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n                    sink.lineStart();\n                    interpolate(null, null, 1, sink);\n                    sink.lineEnd();\n                }\n                if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n                segments = polygon = null;\n            },\n            sphere: function() {\n                sink.polygonStart();\n                sink.lineStart();\n                interpolate(null, null, 1, sink);\n                sink.lineEnd();\n                sink.polygonEnd();\n            }\n        };\n        function point1(lambda, phi) {\n            if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n        }\n        function pointLine(lambda, phi) {\n            line.point(lambda, phi);\n        }\n        function lineStart() {\n            clip.point = pointLine;\n            line.lineStart();\n        }\n        function lineEnd() {\n            clip.point = point1;\n            line.lineEnd();\n        }\n        function pointRing(lambda, phi) {\n            ring.push([\n                lambda,\n                phi\n            ]);\n            ringSink.point(lambda, phi);\n        }\n        function ringStart() {\n            ringSink.lineStart();\n            ring = [];\n        }\n        function ringEnd() {\n            pointRing(ring[0][0], ring[0][1]);\n            ringSink.lineEnd();\n            var clean = ringSink.clean(), ringSegments = ringBuffer.result(), i, n = ringSegments.length, m, segment, point;\n            ring.pop();\n            polygon.push(ring);\n            ring = null;\n            if (!n) return;\n            // No intersections.\n            if (clean & 1) {\n                segment = ringSegments[0];\n                if ((m = segment.length - 1) > 0) {\n                    if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n                    sink.lineStart();\n                    for(i = 0; i < m; ++i)sink.point((point = segment[i])[0], point[1]);\n                    sink.lineEnd();\n                }\n                return;\n            }\n            // Rejoin connected segments.\n            // TODO reuse ringBuffer.rejoin()?\n            if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n            segments.push(ringSegments.filter(validSegment));\n        }\n        return clip;\n    };\n};\nfunction validSegment(segment) {\n    return segment.length > 1;\n}\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - (0, _mathJs.halfPi) - (0, _mathJs.epsilon) : (0, _mathJs.halfPi) - a[1]) - ((b = b.x)[0] < 0 ? b[1] - (0, _mathJs.halfPi) - (0, _mathJs.epsilon) : (0, _mathJs.halfPi) - b[1]);\n}\n\n},{\"./buffer.js\":\"tWINt\",\"./rejoin.js\":\"5wYCY\",\"../math.js\":\"cDOGy\",\"../polygonContains.js\":\"6aszZ\",\"d3-array\":\"8JMcC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"tWINt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nexports.default = function() {\n    var lines = [], line;\n    return {\n        point: function(x, y, m) {\n            line.push([\n                x,\n                y,\n                m\n            ]);\n        },\n        lineStart: function() {\n            lines.push(line = []);\n        },\n        lineEnd: (0, _noopJsDefault.default),\n        rejoin: function() {\n            if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n        },\n        result: function() {\n            var result = lines;\n            lines = [];\n            line = null;\n            return result;\n        }\n    };\n};\n\n},{\"../noop.js\":\"jtH2K\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5wYCY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _pointEqualJs = require(\"../pointEqual.js\");\nvar _pointEqualJsDefault = parcelHelpers.interopDefault(_pointEqualJs);\nvar _mathJs = require(\"../math.js\");\nfunction Intersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other; // another intersection\n    this.e = entry; // is an entry?\n    this.v = false; // visited\n    this.n = this.p = null; // next & previous\n}\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexports.default = function(segments, compareIntersection, startInside, interpolate, stream) {\n    var subject = [], clip = [], i, n1;\n    segments.forEach(function(segment) {\n        if ((n = segment.length - 1) <= 0) return;\n        var n, p0 = segment[0], p1 = segment[n], x;\n        if ((0, _pointEqualJsDefault.default)(p0, p1)) {\n            if (!p0[2] && !p1[2]) {\n                stream.lineStart();\n                for(i = 0; i < n; ++i)stream.point((p0 = segment[i])[0], p0[1]);\n                stream.lineEnd();\n                return;\n            }\n            // handle degenerate cases by moving the point\n            p1[0] += 2 * (0, _mathJs.epsilon);\n        }\n        subject.push(x = new Intersection(p0, segment, null, true));\n        clip.push(x.o = new Intersection(p0, null, x, false));\n        subject.push(x = new Intersection(p1, segment, null, false));\n        clip.push(x.o = new Intersection(p1, null, x, true));\n    });\n    if (!subject.length) return;\n    clip.sort(compareIntersection);\n    link(subject);\n    link(clip);\n    for(i = 0, n1 = clip.length; i < n1; ++i)clip[i].e = startInside = !startInside;\n    var start = subject[0], points, point;\n    while(true){\n        // Find first unvisited intersection.\n        var current = start, isSubject = true;\n        while(current.v)if ((current = current.n) === start) return;\n        points = current.z;\n        stream.lineStart();\n        do {\n            current.v = current.o.v = true;\n            if (current.e) {\n                if (isSubject) for(i = 0, n1 = points.length; i < n1; ++i)stream.point((point = points[i])[0], point[1]);\n                else interpolate(current.x, current.n.x, 1, stream);\n                current = current.n;\n            } else {\n                if (isSubject) {\n                    points = current.p.z;\n                    for(i = points.length - 1; i >= 0; --i)stream.point((point = points[i])[0], point[1]);\n                } else interpolate(current.x, current.p.x, -1, stream);\n                current = current.p;\n            }\n            current = current.o;\n            points = current.z;\n            isSubject = !isSubject;\n        }while (!current.v);\n        stream.lineEnd();\n    }\n};\nfunction link(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while(++i < n){\n        a.n = b = array[i];\n        b.p = a;\n        a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n}\n\n},{\"../pointEqual.js\":\"dMCwK\",\"../math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dMCwK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"./math.js\");\nexports.default = function(a, b) {\n    return (0, _mathJs.abs)(a[0] - b[0]) < (0, _mathJs.epsilon) && (0, _mathJs.abs)(a[1] - b[1]) < (0, _mathJs.epsilon);\n};\n\n},{\"./math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6aszZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _cartesianJs = require(\"./cartesian.js\");\nvar _mathJs = require(\"./math.js\");\nfunction longitude(point) {\n    if ((0, _mathJs.abs)(point[0]) <= (0, _mathJs.pi)) return point[0];\n    else return (0, _mathJs.sign)(point[0]) * (((0, _mathJs.abs)(point[0]) + (0, _mathJs.pi)) % (0, _mathJs.tau) - (0, _mathJs.pi));\n}\nexports.default = function(polygon, point) {\n    var lambda = longitude(point), phi = point[1], sinPhi = (0, _mathJs.sin)(phi), normal = [\n        (0, _mathJs.sin)(lambda),\n        -(0, _mathJs.cos)(lambda),\n        0\n    ], angle = 0, winding = 0;\n    var sum = new (0, _d3Array.Adder)();\n    if (sinPhi === 1) phi = (0, _mathJs.halfPi) + (0, _mathJs.epsilon);\n    else if (sinPhi === -1) phi = -(0, _mathJs.halfPi) - (0, _mathJs.epsilon);\n    for(var i = 0, n = polygon.length; i < n; ++i){\n        if (!(m = (ring = polygon[i]).length)) continue;\n        var ring, m, point0 = ring[m - 1], lambda0 = longitude(point0), phi0 = point0[1] / 2 + (0, _mathJs.quarterPi), sinPhi0 = (0, _mathJs.sin)(phi0), cosPhi0 = (0, _mathJs.cos)(phi0);\n        for(var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1){\n            var point1 = ring[j], lambda1 = longitude(point1), phi1 = point1[1] / 2 + (0, _mathJs.quarterPi), sinPhi1 = (0, _mathJs.sin)(phi1), cosPhi1 = (0, _mathJs.cos)(phi1), delta = lambda1 - lambda0, sign = delta >= 0 ? 1 : -1, absDelta = sign * delta, antimeridian = absDelta > (0, _mathJs.pi), k = sinPhi0 * sinPhi1;\n            sum.add((0, _mathJs.atan2)(k * sign * (0, _mathJs.sin)(absDelta), cosPhi0 * cosPhi1 + k * (0, _mathJs.cos)(absDelta)));\n            angle += antimeridian ? delta + sign * (0, _mathJs.tau) : delta;\n            // Are the longitudes either side of the point’s meridian (lambda),\n            // and are the latitudes smaller than the parallel (phi)?\n            if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n                var arc = (0, _cartesianJs.cartesianCross)((0, _cartesianJs.cartesian)(point0), (0, _cartesianJs.cartesian)(point1));\n                (0, _cartesianJs.cartesianNormalizeInPlace)(arc);\n                var intersection = (0, _cartesianJs.cartesianCross)(normal, arc);\n                (0, _cartesianJs.cartesianNormalizeInPlace)(intersection);\n                var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * (0, _mathJs.asin)(intersection[2]);\n                if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) winding += antimeridian ^ delta >= 0 ? 1 : -1;\n            }\n        }\n    }\n    // First, determine whether the South pole is inside or outside:\n    //\n    // It is inside if:\n    // * the polygon winds around it in a clockwise direction.\n    // * the polygon does not (cumulatively) wind around it, but has a negative\n    //   (counter-clockwise) area.\n    //\n    // Second, count the (signed) number of times a segment crosses a lambda\n    // from the point to the South pole.  If it is zero, then the point is the\n    // same side as the South pole.\n    return (angle < -(0, _mathJs.epsilon) || angle < (0, _mathJs.epsilon) && sum < -(0, _mathJs.epsilon2)) ^ winding & 1;\n};\n\n},{\"d3-array\":\"8JMcC\",\"./cartesian.js\":\"e5njx\",\"./math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gm7cL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _cartesianJs = require(\"../cartesian.js\");\nvar _circleJs = require(\"../circle.js\");\nvar _mathJs = require(\"../math.js\");\nvar _pointEqualJs = require(\"../pointEqual.js\");\nvar _pointEqualJsDefault = parcelHelpers.interopDefault(_pointEqualJs);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nexports.default = function(radius) {\n    var cr = (0, _mathJs.cos)(radius), delta1 = 6 * (0, _mathJs.radians), smallRadius = cr > 0, notHemisphere = (0, _mathJs.abs)(cr) > (0, _mathJs.epsilon); // TODO optimise for this common case\n    function interpolate(from, to, direction, stream) {\n        (0, _circleJs.circleStream)(stream, radius, delta1, direction, from, to);\n    }\n    function visible(lambda, phi) {\n        return (0, _mathJs.cos)(lambda) * (0, _mathJs.cos)(phi) > cr;\n    }\n    // Takes a line and cuts into visible segments. Return values used for polygon\n    // clipping: 0 - there were intersections or the line was empty; 1 - no\n    // intersections 2 - there were intersections, and the first and last segments\n    // should be rejoined.\n    function clipLine(stream) {\n        var point0, c0, v0, v00, clean; // no intersections\n        return {\n            lineStart: function() {\n                v00 = v0 = false;\n                clean = 1;\n            },\n            point: function(lambda, phi) {\n                var point1 = [\n                    lambda,\n                    phi\n                ], point2, v = visible(lambda, phi), c = smallRadius ? v ? 0 : code1(lambda, phi) : v ? code1(lambda + (lambda < 0 ? (0, _mathJs.pi) : -(0, _mathJs.pi)), phi) : 0;\n                if (!point0 && (v00 = v0 = v)) stream.lineStart();\n                if (v !== v0) {\n                    point2 = intersect(point0, point1);\n                    if (!point2 || (0, _pointEqualJsDefault.default)(point0, point2) || (0, _pointEqualJsDefault.default)(point1, point2)) point1[2] = 1;\n                }\n                if (v !== v0) {\n                    clean = 0;\n                    if (v) {\n                        // outside going in\n                        stream.lineStart();\n                        point2 = intersect(point1, point0);\n                        stream.point(point2[0], point2[1]);\n                    } else {\n                        // inside going out\n                        point2 = intersect(point0, point1);\n                        stream.point(point2[0], point2[1], 2);\n                        stream.lineEnd();\n                    }\n                    point0 = point2;\n                } else if (notHemisphere && point0 && smallRadius ^ v) {\n                    var t;\n                    // If the codes for two points are different, or are both zero,\n                    // and there this segment intersects with the small circle.\n                    if (!(c & c0) && (t = intersect(point1, point0, true))) {\n                        clean = 0;\n                        if (smallRadius) {\n                            stream.lineStart();\n                            stream.point(t[0][0], t[0][1]);\n                            stream.point(t[1][0], t[1][1]);\n                            stream.lineEnd();\n                        } else {\n                            stream.point(t[1][0], t[1][1]);\n                            stream.lineEnd();\n                            stream.lineStart();\n                            stream.point(t[0][0], t[0][1], 3);\n                        }\n                    }\n                }\n                if (v && (!point0 || !(0, _pointEqualJsDefault.default)(point0, point1))) stream.point(point1[0], point1[1]);\n                point0 = point1, v0 = v, c0 = c;\n            },\n            lineEnd: function() {\n                if (v0) stream.lineEnd();\n                point0 = null;\n            },\n            // Rejoin first and last segments if there were intersections and the first\n            // and last points were visible.\n            clean: function() {\n                return clean | (v00 && v0) << 1;\n            }\n        };\n    }\n    // Intersects the great circle between a and b with the clip circle.\n    function intersect(a, b, two) {\n        var pa = (0, _cartesianJs.cartesian)(a), pb = (0, _cartesianJs.cartesian)(b);\n        // We have two planes, n1.p = d1 and n2.p = d2.\n        // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).\n        var n1 = [\n            1,\n            0,\n            0\n        ], n2 = (0, _cartesianJs.cartesianCross)(pa, pb), n2n2 = (0, _cartesianJs.cartesianDot)(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n        // Two polar points.\n        if (!determinant) return !two && a;\n        var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = (0, _cartesianJs.cartesianCross)(n1, n2), A = (0, _cartesianJs.cartesianScale)(n1, c1), B = (0, _cartesianJs.cartesianScale)(n2, c2);\n        (0, _cartesianJs.cartesianAddInPlace)(A, B);\n        // Solve |p(t)|^2 = 1.\n        var u = n1xn2, w = (0, _cartesianJs.cartesianDot)(A, u), uu = (0, _cartesianJs.cartesianDot)(u, u), t2 = w * w - uu * ((0, _cartesianJs.cartesianDot)(A, A) - 1);\n        if (t2 < 0) return;\n        var t = (0, _mathJs.sqrt)(t2), q = (0, _cartesianJs.cartesianScale)(u, (-w - t) / uu);\n        (0, _cartesianJs.cartesianAddInPlace)(q, A);\n        q = (0, _cartesianJs.spherical)(q);\n        if (!two) return q;\n        // Two intersection points.\n        var lambda0 = a[0], lambda1 = b[0], phi0 = a[1], phi1 = b[1], z;\n        if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\n        var delta = lambda1 - lambda0, polar = (0, _mathJs.abs)(delta - (0, _mathJs.pi)) < (0, _mathJs.epsilon), meridian = polar || delta < (0, _mathJs.epsilon);\n        if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;\n        // Check that the first point is between a and b.\n        if (meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < ((0, _mathJs.abs)(q[0] - lambda0) < (0, _mathJs.epsilon) ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 : delta > (0, _mathJs.pi) ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\n            var q1 = (0, _cartesianJs.cartesianScale)(u, (-w + t) / uu);\n            (0, _cartesianJs.cartesianAddInPlace)(q1, A);\n            return [\n                q,\n                (0, _cartesianJs.spherical)(q1)\n            ];\n        }\n    }\n    // Generates a 4-bit vector representing the location of a point relative to\n    // the small circle's bounding box.\n    function code1(lambda, phi) {\n        var r = smallRadius ? radius : (0, _mathJs.pi) - radius, code = 0;\n        if (lambda < -r) code |= 1; // left\n        else if (lambda > r) code |= 2; // right\n        if (phi < -r) code |= 4; // below\n        else if (phi > r) code |= 8; // above\n        return code;\n    }\n    return (0, _indexJsDefault.default)(visible, clipLine, interpolate, smallRadius ? [\n        0,\n        -radius\n    ] : [\n        -(0, _mathJs.pi),\n        radius - (0, _mathJs.pi)\n    ]);\n};\n\n},{\"../cartesian.js\":\"e5njx\",\"../circle.js\":\"3JboS\",\"../math.js\":\"cDOGy\",\"../pointEqual.js\":\"dMCwK\",\"./index.js\":\"29u4z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1FZ3Z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nvar _bufferJs = require(\"./buffer.js\");\nvar _bufferJsDefault = parcelHelpers.interopDefault(_bufferJs);\nvar _lineJs = require(\"./line.js\");\nvar _lineJsDefault = parcelHelpers.interopDefault(_lineJs);\nvar _rejoinJs = require(\"./rejoin.js\");\nvar _rejoinJsDefault = parcelHelpers.interopDefault(_rejoinJs);\nvar _d3Array = require(\"d3-array\");\nvar clipMax = 1e9, clipMin = -clipMax;\nfunction clipRectangle(x0, y0, x1, y1) {\n    function visible1(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n    }\n    function interpolate(from, to, direction, stream) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n        while ((a = (a + direction + 4) % 4) !== a1);\n        else stream.point(to[0], to[1]);\n    }\n    function corner(p, direction) {\n        return (0, _mathJs.abs)(p[0] - x0) < (0, _mathJs.epsilon) ? direction > 0 ? 0 : 3 : (0, _mathJs.abs)(p[0] - x1) < (0, _mathJs.epsilon) ? direction > 0 ? 2 : 1 : (0, _mathJs.abs)(p[1] - y0) < (0, _mathJs.epsilon) ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n    }\n    function compareIntersection(a, b) {\n        return comparePoint(a.x, b.x);\n    }\n    function comparePoint(a, b) {\n        var ca = corner(a, 1), cb = corner(b, 1);\n        return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n    return function(stream) {\n        var activeStream = stream, bufferStream = (0, _bufferJsDefault.default)(), segments, polygon, ring1, x__, y__, v__, x_, y_, v_, first, clean;\n        var clipStream = {\n            point: point1,\n            lineStart: lineStart,\n            lineEnd: lineEnd,\n            polygonStart: polygonStart,\n            polygonEnd: polygonEnd\n        };\n        function point1(x, y) {\n            if (visible1(x, y)) activeStream.point(x, y);\n        }\n        function polygonInside() {\n            var winding = 0;\n            for(var i = 0, n = polygon.length; i < n; ++i)for(var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j){\n                a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n                if (a1 <= y1) {\n                    if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding;\n                } else if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding;\n            }\n            return winding;\n        }\n        // Buffer geometry within a polygon and then clip it en masse.\n        function polygonStart() {\n            activeStream = bufferStream, segments = [], polygon = [], clean = true;\n        }\n        function polygonEnd() {\n            var startInside = polygonInside(), cleanInside = clean && startInside, visible = (segments = (0, _d3Array.merge)(segments)).length;\n            if (cleanInside || visible) {\n                stream.polygonStart();\n                if (cleanInside) {\n                    stream.lineStart();\n                    interpolate(null, null, 1, stream);\n                    stream.lineEnd();\n                }\n                if (visible) (0, _rejoinJsDefault.default)(segments, compareIntersection, startInside, interpolate, stream);\n                stream.polygonEnd();\n            }\n            activeStream = stream, segments = polygon = ring1 = null;\n        }\n        function lineStart() {\n            clipStream.point = linePoint;\n            if (polygon) polygon.push(ring1 = []);\n            first = true;\n            v_ = false;\n            x_ = y_ = NaN;\n        }\n        // TODO rather than special-case polygons, simply handle them separately.\n        // Ideally, coincident intersection points should be jittered to avoid\n        // clipping issues.\n        function lineEnd() {\n            if (segments) {\n                linePoint(x__, y__);\n                if (v__ && v_) bufferStream.rejoin();\n                segments.push(bufferStream.result());\n            }\n            clipStream.point = point1;\n            if (v_) activeStream.lineEnd();\n        }\n        function linePoint(x, y) {\n            var v = visible1(x, y);\n            if (polygon) ring1.push([\n                x,\n                y\n            ]);\n            if (first) {\n                x__ = x, y__ = y, v__ = v;\n                first = false;\n                if (v) {\n                    activeStream.lineStart();\n                    activeStream.point(x, y);\n                }\n            } else if (v && v_) activeStream.point(x, y);\n            else {\n                var a = [\n                    x_ = Math.max(clipMin, Math.min(clipMax, x_)),\n                    y_ = Math.max(clipMin, Math.min(clipMax, y_))\n                ], b = [\n                    x = Math.max(clipMin, Math.min(clipMax, x)),\n                    y = Math.max(clipMin, Math.min(clipMax, y))\n                ];\n                if ((0, _lineJsDefault.default)(a, b, x0, y0, x1, y1)) {\n                    if (!v_) {\n                        activeStream.lineStart();\n                        activeStream.point(a[0], a[1]);\n                    }\n                    activeStream.point(b[0], b[1]);\n                    if (!v) activeStream.lineEnd();\n                    clean = false;\n                } else if (v) {\n                    activeStream.lineStart();\n                    activeStream.point(x, y);\n                    clean = false;\n                }\n            }\n            x_ = x, y_ = y, v_ = v;\n        }\n        return clipStream;\n    };\n}\nexports.default = clipRectangle;\n\n},{\"../math.js\":\"cDOGy\",\"./buffer.js\":\"tWINt\",\"./line.js\":\"1nIGh\",\"./rejoin.js\":\"5wYCY\",\"d3-array\":\"8JMcC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1nIGh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b, x0, y0, x1, y1) {\n    var ax = a[0], ay = a[1], bx = b[0], by = b[1], t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n    r = x0 - ax;\n    if (!dx && r > 0) return;\n    r /= dx;\n    if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n    } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n    }\n    r = x1 - ax;\n    if (!dx && r < 0) return;\n    r /= dx;\n    if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n    } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n    }\n    r = y0 - ay;\n    if (!dy && r > 0) return;\n    r /= dy;\n    if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n    } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n    }\n    r = y1 - ay;\n    if (!dy && r < 0) return;\n    r /= dy;\n    if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n    } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n    }\n    if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n    if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n    return true;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dyZlA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"graticule10\", ()=>graticule10);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"./math.js\");\nfunction graticuleX(y0, y1, dy) {\n    var y2 = (0, _d3Array.range)(y0, y1 - (0, _mathJs.epsilon), dy).concat(y1);\n    return function(x) {\n        return y2.map(function(y) {\n            return [\n                x,\n                y\n            ];\n        });\n    };\n}\nfunction graticuleY(x0, x1, dx) {\n    var x2 = (0, _d3Array.range)(x0, x1 - (0, _mathJs.epsilon), dx).concat(x1);\n    return function(y) {\n        return x2.map(function(x) {\n            return [\n                x,\n                y\n            ];\n        });\n    };\n}\nfunction graticule() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x3, y3, X, Y, precision = 2.5;\n    function graticule1() {\n        return {\n            type: \"MultiLineString\",\n            coordinates: lines()\n        };\n    }\n    function lines() {\n        return (0, _d3Array.range)((0, _mathJs.ceil)(X0 / DX) * DX, X1, DX).map(X).concat((0, _d3Array.range)((0, _mathJs.ceil)(Y0 / DY) * DY, Y1, DY).map(Y)).concat((0, _d3Array.range)((0, _mathJs.ceil)(x0 / dx) * dx, x1, dx).filter(function(x) {\n            return (0, _mathJs.abs)(x % DX) > (0, _mathJs.epsilon);\n        }).map(x3)).concat((0, _d3Array.range)((0, _mathJs.ceil)(y0 / dy) * dy, y1, dy).filter(function(y) {\n            return (0, _mathJs.abs)(y % DY) > (0, _mathJs.epsilon);\n        }).map(y3));\n    }\n    graticule1.lines = function() {\n        return lines().map(function(coordinates) {\n            return {\n                type: \"LineString\",\n                coordinates: coordinates\n            };\n        });\n    };\n    graticule1.outline = function() {\n        return {\n            type: \"Polygon\",\n            coordinates: [\n                X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1))\n            ]\n        };\n    };\n    graticule1.extent = function(_) {\n        if (!arguments.length) return graticule1.extentMinor();\n        return graticule1.extentMajor(_).extentMinor(_);\n    };\n    graticule1.extentMajor = function(_) {\n        if (!arguments.length) return [\n            [\n                X0,\n                Y0\n            ],\n            [\n                X1,\n                Y1\n            ]\n        ];\n        X0 = +_[0][0], X1 = +_[1][0];\n        Y0 = +_[0][1], Y1 = +_[1][1];\n        if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n        if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n        return graticule1.precision(precision);\n    };\n    graticule1.extentMinor = function(_) {\n        if (!arguments.length) return [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n        x0 = +_[0][0], x1 = +_[1][0];\n        y0 = +_[0][1], y1 = +_[1][1];\n        if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n        if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n        return graticule1.precision(precision);\n    };\n    graticule1.step = function(_) {\n        if (!arguments.length) return graticule1.stepMinor();\n        return graticule1.stepMajor(_).stepMinor(_);\n    };\n    graticule1.stepMajor = function(_) {\n        if (!arguments.length) return [\n            DX,\n            DY\n        ];\n        DX = +_[0], DY = +_[1];\n        return graticule1;\n    };\n    graticule1.stepMinor = function(_) {\n        if (!arguments.length) return [\n            dx,\n            dy\n        ];\n        dx = +_[0], dy = +_[1];\n        return graticule1;\n    };\n    graticule1.precision = function(_) {\n        if (!arguments.length) return precision;\n        precision = +_;\n        x3 = graticuleX(y0, y1, 90);\n        y3 = graticuleY(x0, x1, precision);\n        X = graticuleX(Y0, Y1, 90);\n        Y = graticuleY(X0, X1, precision);\n        return graticule1;\n    };\n    return graticule1.extentMajor([\n        [\n            -180,\n            -90 + (0, _mathJs.epsilon)\n        ],\n        [\n            180,\n            90 - (0, _mathJs.epsilon)\n        ]\n    ]).extentMinor([\n        [\n            -180,\n            -80 - (0, _mathJs.epsilon)\n        ],\n        [\n            180,\n            80 + (0, _mathJs.epsilon)\n        ]\n    ]);\n}\nexports.default = graticule;\nfunction graticule10() {\n    return graticule()();\n}\n\n},{\"d3-array\":\"8JMcC\",\"./math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3dcD3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _identityJs = require(\"../identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _streamJs = require(\"../stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar _areaJs = require(\"./area.js\");\nvar _areaJsDefault = parcelHelpers.interopDefault(_areaJs);\nvar _boundsJs = require(\"./bounds.js\");\nvar _boundsJsDefault = parcelHelpers.interopDefault(_boundsJs);\nvar _centroidJs = require(\"./centroid.js\");\nvar _centroidJsDefault = parcelHelpers.interopDefault(_centroidJs);\nvar _contextJs = require(\"./context.js\");\nvar _contextJsDefault = parcelHelpers.interopDefault(_contextJs);\nvar _measureJs = require(\"./measure.js\");\nvar _measureJsDefault = parcelHelpers.interopDefault(_measureJs);\nvar _stringJs = require(\"./string.js\");\nvar _stringJsDefault = parcelHelpers.interopDefault(_stringJs);\nexports.default = function(projection, context) {\n    var pointRadius = 4.5, projectionStream, contextStream;\n    function path(object) {\n        if (object) {\n            if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n            (0, _streamJsDefault.default)(object, projectionStream(contextStream));\n        }\n        return contextStream.result();\n    }\n    path.area = function(object) {\n        (0, _streamJsDefault.default)(object, projectionStream((0, _areaJsDefault.default)));\n        return (0, _areaJsDefault.default).result();\n    };\n    path.measure = function(object) {\n        (0, _streamJsDefault.default)(object, projectionStream((0, _measureJsDefault.default)));\n        return (0, _measureJsDefault.default).result();\n    };\n    path.bounds = function(object) {\n        (0, _streamJsDefault.default)(object, projectionStream((0, _boundsJsDefault.default)));\n        return (0, _boundsJsDefault.default).result();\n    };\n    path.centroid = function(object) {\n        (0, _streamJsDefault.default)(object, projectionStream((0, _centroidJsDefault.default)));\n        return (0, _centroidJsDefault.default).result();\n    };\n    path.projection = function(_) {\n        return arguments.length ? (projectionStream = _ == null ? (projection = null, _identityJsDefault.default) : (projection = _).stream, path) : projection;\n    };\n    path.context = function(_) {\n        if (!arguments.length) return context;\n        contextStream = _ == null ? (context = null, new (0, _stringJsDefault.default)) : new (0, _contextJsDefault.default)(context = _);\n        if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n        return path;\n    };\n    path.pointRadius = function(_) {\n        if (!arguments.length) return pointRadius;\n        pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n        return path;\n    };\n    return path.projection(projection).context(context);\n};\n\n},{\"../identity.js\":\"bKsMQ\",\"../stream.js\":\"iPxfz\",\"./area.js\":\"grvv6\",\"./bounds.js\":\"8kVkb\",\"./centroid.js\":\"ltxEa\",\"./context.js\":\"kTiUD\",\"./measure.js\":\"dtuLH\",\"./string.js\":\"cNb3J\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bKsMQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = (x)=>x;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"grvv6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"../math.js\");\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar areaSum = new (0, _d3Array.Adder)(), areaRingSum = new (0, _d3Array.Adder)(), x00, y00, x0, y0;\nvar areaStream = {\n    point: (0, _noopJsDefault.default),\n    lineStart: (0, _noopJsDefault.default),\n    lineEnd: (0, _noopJsDefault.default),\n    polygonStart: function() {\n        areaStream.lineStart = areaRingStart;\n        areaStream.lineEnd = areaRingEnd;\n    },\n    polygonEnd: function() {\n        areaStream.lineStart = areaStream.lineEnd = areaStream.point = (0, _noopJsDefault.default);\n        areaSum.add((0, _mathJs.abs)(areaRingSum));\n        areaRingSum = new (0, _d3Array.Adder)();\n    },\n    result: function() {\n        var area = areaSum / 2;\n        areaSum = new (0, _d3Array.Adder)();\n        return area;\n    }\n};\nfunction areaRingStart() {\n    areaStream.point = areaPointFirst;\n}\nfunction areaPointFirst(x, y) {\n    areaStream.point = areaPoint;\n    x00 = x0 = x, y00 = y0 = y;\n}\nfunction areaPoint(x, y) {\n    areaRingSum.add(y0 * x - x0 * y);\n    x0 = x, y0 = y;\n}\nfunction areaRingEnd() {\n    areaPoint(x00, y00);\n}\nexports.default = areaStream;\n\n},{\"d3-array\":\"8JMcC\",\"../math.js\":\"cDOGy\",\"../noop.js\":\"jtH2K\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8kVkb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar x0 = Infinity, y0 = x0, x1 = -x0, y1 = x1;\nvar boundsStream = {\n    point: boundsPoint,\n    lineStart: (0, _noopJsDefault.default),\n    lineEnd: (0, _noopJsDefault.default),\n    polygonStart: (0, _noopJsDefault.default),\n    polygonEnd: (0, _noopJsDefault.default),\n    result: function() {\n        var bounds = [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n        x1 = y1 = -(y0 = x0 = Infinity);\n        return bounds;\n    }\n};\nfunction boundsPoint(x, y) {\n    if (x < x0) x0 = x;\n    if (x > x1) x1 = x;\n    if (y < y0) y0 = y;\n    if (y > y1) y1 = y;\n}\nexports.default = boundsStream;\n\n},{\"../noop.js\":\"jtH2K\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ltxEa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\n// TODO Enforce positive area for exterior, negative area for interior?\nvar X0 = 0, Y0 = 0, Z0 = 0, X1 = 0, Y1 = 0, Z1 = 0, X2 = 0, Y2 = 0, Z2 = 0, x00, y00, x0, y0;\nvar centroidStream = {\n    point: centroidPoint,\n    lineStart: centroidLineStart,\n    lineEnd: centroidLineEnd,\n    polygonStart: function() {\n        centroidStream.lineStart = centroidRingStart;\n        centroidStream.lineEnd = centroidRingEnd;\n    },\n    polygonEnd: function() {\n        centroidStream.point = centroidPoint;\n        centroidStream.lineStart = centroidLineStart;\n        centroidStream.lineEnd = centroidLineEnd;\n    },\n    result: function() {\n        var centroid = Z2 ? [\n            X2 / Z2,\n            Y2 / Z2\n        ] : Z1 ? [\n            X1 / Z1,\n            Y1 / Z1\n        ] : Z0 ? [\n            X0 / Z0,\n            Y0 / Z0\n        ] : [\n            NaN,\n            NaN\n        ];\n        X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;\n        return centroid;\n    }\n};\nfunction centroidPoint(x, y) {\n    X0 += x;\n    Y0 += y;\n    ++Z0;\n}\nfunction centroidLineStart() {\n    centroidStream.point = centroidPointFirstLine;\n}\nfunction centroidPointFirstLine(x, y) {\n    centroidStream.point = centroidPointLine;\n    centroidPoint(x0 = x, y0 = y);\n}\nfunction centroidPointLine(x, y) {\n    var dx = x - x0, dy = y - y0, z = (0, _mathJs.sqrt)(dx * dx + dy * dy);\n    X1 += z * (x0 + x) / 2;\n    Y1 += z * (y0 + y) / 2;\n    Z1 += z;\n    centroidPoint(x0 = x, y0 = y);\n}\nfunction centroidLineEnd() {\n    centroidStream.point = centroidPoint;\n}\nfunction centroidRingStart() {\n    centroidStream.point = centroidPointFirstRing;\n}\nfunction centroidRingEnd() {\n    centroidPointRing(x00, y00);\n}\nfunction centroidPointFirstRing(x, y) {\n    centroidStream.point = centroidPointRing;\n    centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\nfunction centroidPointRing(x, y) {\n    var dx = x - x0, dy = y - y0, z = (0, _mathJs.sqrt)(dx * dx + dy * dy);\n    X1 += z * (x0 + x) / 2;\n    Y1 += z * (y0 + y) / 2;\n    Z1 += z;\n    z = y0 * x - x0 * y;\n    X2 += z * (x0 + x);\n    Y2 += z * (y0 + y);\n    Z2 += z * 3;\n    centroidPoint(x0 = x, y0 = y);\n}\nexports.default = centroidStream;\n\n},{\"../math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kTiUD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nfunction PathContext(context) {\n    this._context = context;\n}\nexports.default = PathContext;\nPathContext.prototype = {\n    _radius: 4.5,\n    pointRadius: function(_) {\n        return this._radius = _, this;\n    },\n    polygonStart: function() {\n        this._line = 0;\n    },\n    polygonEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line === 0) this._context.closePath();\n        this._point = NaN;\n    },\n    point: function(x, y) {\n        switch(this._point){\n            case 0:\n                this._context.moveTo(x, y);\n                this._point = 1;\n                break;\n            case 1:\n                this._context.lineTo(x, y);\n                break;\n            default:\n                this._context.moveTo(x + this._radius, y);\n                this._context.arc(x, y, this._radius, 0, (0, _mathJs.tau));\n                break;\n        }\n    },\n    result: (0, _noopJsDefault.default)\n};\n\n},{\"../math.js\":\"cDOGy\",\"../noop.js\":\"jtH2K\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dtuLH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"../math.js\");\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar lengthSum = new (0, _d3Array.Adder)(), lengthRing, x00, y00, x0, y0;\nvar lengthStream = {\n    point: (0, _noopJsDefault.default),\n    lineStart: function() {\n        lengthStream.point = lengthPointFirst;\n    },\n    lineEnd: function() {\n        if (lengthRing) lengthPoint(x00, y00);\n        lengthStream.point = (0, _noopJsDefault.default);\n    },\n    polygonStart: function() {\n        lengthRing = true;\n    },\n    polygonEnd: function() {\n        lengthRing = null;\n    },\n    result: function() {\n        var length = +lengthSum;\n        lengthSum = new (0, _d3Array.Adder)();\n        return length;\n    }\n};\nfunction lengthPointFirst(x, y) {\n    lengthStream.point = lengthPoint;\n    x00 = x0 = x, y00 = y0 = y;\n}\nfunction lengthPoint(x, y) {\n    x0 -= x, y0 -= y;\n    lengthSum.add((0, _mathJs.sqrt)(x0 * x0 + y0 * y0));\n    x0 = x, y0 = y;\n}\nexports.default = lengthStream;\n\n},{\"d3-array\":\"8JMcC\",\"../math.js\":\"cDOGy\",\"../noop.js\":\"jtH2K\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cNb3J\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction PathString() {\n    this._string = [];\n}\nexports.default = PathString;\nPathString.prototype = {\n    _radius: 4.5,\n    _circle: circle(4.5),\n    pointRadius: function(_) {\n        if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n        return this;\n    },\n    polygonStart: function() {\n        this._line = 0;\n    },\n    polygonEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line === 0) this._string.push(\"Z\");\n        this._point = NaN;\n    },\n    point: function(x, y) {\n        switch(this._point){\n            case 0:\n                this._string.push(\"M\", x, \",\", y);\n                this._point = 1;\n                break;\n            case 1:\n                this._string.push(\"L\", x, \",\", y);\n                break;\n            default:\n                if (this._circle == null) this._circle = circle(this._radius);\n                this._string.push(\"M\", x, \",\", y, this._circle);\n                break;\n        }\n    },\n    result: function() {\n        if (this._string.length) {\n            var result = this._string.join(\"\");\n            this._string = [];\n            return result;\n        } else return null;\n    }\n};\nfunction circle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bpSYz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _conicEqualAreaJs = require(\"./conicEqualArea.js\");\nvar _conicEqualAreaJsDefault = parcelHelpers.interopDefault(_conicEqualAreaJs);\nexports.default = function() {\n    return (0, _conicEqualAreaJsDefault.default)().parallels([\n        29.5,\n        45.5\n    ]).scale(1070).translate([\n        480,\n        250\n    ]).rotate([\n        96,\n        0\n    ]).center([\n        -0.6,\n        38.7\n    ]);\n};\n\n},{\"./conicEqualArea.js\":\"95gV8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"95gV8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"conicEqualAreaRaw\", ()=>conicEqualAreaRaw);\nvar _mathJs = require(\"../math.js\");\nvar _conicJs = require(\"./conic.js\");\nvar _cylindricalEqualAreaJs = require(\"./cylindricalEqualArea.js\");\nfunction conicEqualAreaRaw(y0, y1) {\n    var sy0 = (0, _mathJs.sin)(y0), n = (sy0 + (0, _mathJs.sin)(y1)) / 2;\n    // Are the parallels symmetrical around the Equator?\n    if ((0, _mathJs.abs)(n) < (0, _mathJs.epsilon)) return (0, _cylindricalEqualAreaJs.cylindricalEqualAreaRaw)(y0);\n    var c = 1 + sy0 * (2 * n - sy0), r0 = (0, _mathJs.sqrt)(c) / n;\n    function project(x, y) {\n        var r = (0, _mathJs.sqrt)(c - 2 * n * (0, _mathJs.sin)(y)) / n;\n        return [\n            r * (0, _mathJs.sin)(x *= n),\n            r0 - r * (0, _mathJs.cos)(x)\n        ];\n    }\n    project.invert = function(x, y) {\n        var r0y = r0 - y, l = (0, _mathJs.atan2)(x, (0, _mathJs.abs)(r0y)) * (0, _mathJs.sign)(r0y);\n        if (r0y * n < 0) l -= (0, _mathJs.pi) * (0, _mathJs.sign)(x) * (0, _mathJs.sign)(r0y);\n        return [\n            l / n,\n            (0, _mathJs.asin)((c - (x * x + r0y * r0y) * n * n) / (2 * n))\n        ];\n    };\n    return project;\n}\nexports.default = function() {\n    return (0, _conicJs.conicProjection)(conicEqualAreaRaw).scale(155.424).center([\n        0,\n        33.6442\n    ]);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./conic.js\":\"aF8Oh\",\"./cylindricalEqualArea.js\":\"hDeKr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aF8Oh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"conicProjection\", ()=>conicProjection);\nvar _mathJs = require(\"../math.js\");\nvar _indexJs = require(\"./index.js\");\nfunction conicProjection(projectAt) {\n    var phi0 = 0, phi1 = (0, _mathJs.pi) / 3, m = (0, _indexJs.projectionMutator)(projectAt), p = m(phi0, phi1);\n    p.parallels = function(_) {\n        return arguments.length ? m(phi0 = _[0] * (0, _mathJs.radians), phi1 = _[1] * (0, _mathJs.radians)) : [\n            phi0 * (0, _mathJs.degrees),\n            phi1 * (0, _mathJs.degrees)\n        ];\n    };\n    return p;\n}\n\n},{\"../math.js\":\"cDOGy\",\"./index.js\":\"err8N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"err8N\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"projectionMutator\", ()=>projectionMutator);\nvar _antimeridianJs = require(\"../clip/antimeridian.js\");\nvar _antimeridianJsDefault = parcelHelpers.interopDefault(_antimeridianJs);\nvar _circleJs = require(\"../clip/circle.js\");\nvar _circleJsDefault = parcelHelpers.interopDefault(_circleJs);\nvar _rectangleJs = require(\"../clip/rectangle.js\");\nvar _rectangleJsDefault = parcelHelpers.interopDefault(_rectangleJs);\nvar _composeJs = require(\"../compose.js\");\nvar _composeJsDefault = parcelHelpers.interopDefault(_composeJs);\nvar _identityJs = require(\"../identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _mathJs = require(\"../math.js\");\nvar _rotationJs = require(\"../rotation.js\");\nvar _transformJs = require(\"../transform.js\");\nvar _fitJs = require(\"./fit.js\");\nvar _resampleJs = require(\"./resample.js\");\nvar _resampleJsDefault = parcelHelpers.interopDefault(_resampleJs);\nvar transformRadians = (0, _transformJs.transformer)({\n    point: function(x, y) {\n        this.stream.point(x * (0, _mathJs.radians), y * (0, _mathJs.radians));\n    }\n});\nfunction transformRotate(rotate) {\n    return (0, _transformJs.transformer)({\n        point: function(x, y) {\n            var r = rotate(x, y);\n            return this.stream.point(r[0], r[1]);\n        }\n    });\n}\nfunction scaleTranslate(k, dx, dy, sx, sy) {\n    function transform(x, y) {\n        x *= sx;\n        y *= sy;\n        return [\n            dx + k * x,\n            dy - k * y\n        ];\n    }\n    transform.invert = function(x, y) {\n        return [\n            (x - dx) / k * sx,\n            (dy - y) / k * sy\n        ];\n    };\n    return transform;\n}\nfunction scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n    if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n    var cosAlpha = (0, _mathJs.cos)(alpha), sinAlpha = (0, _mathJs.sin)(alpha), a = cosAlpha * k, b = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;\n    function transform(x, y) {\n        x *= sx;\n        y *= sy;\n        return [\n            a * x - b * y + dx,\n            dy - b * x - a * y\n        ];\n    }\n    transform.invert = function(x, y) {\n        return [\n            sx * (ai * x - bi * y + ci),\n            sy * (fi - bi * x - ai * y)\n        ];\n    };\n    return transform;\n}\nfunction projection(project) {\n    return projectionMutator(function() {\n        return project;\n    })();\n}\nexports.default = projection;\nfunction projectionMutator(projectAt) {\n    var project, k = 150, x = 480, y = 250, lambda = 0, phi = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, alpha = 0, sx = 1, sy = 1, theta = null, preclip = (0, _antimeridianJsDefault.default), x0 = null, y0, x1, y1, postclip = (0, _identityJsDefault.default), delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache, cacheStream;\n    function projection1(point) {\n        return projectRotateTransform(point[0] * (0, _mathJs.radians), point[1] * (0, _mathJs.radians));\n    }\n    function invert(point) {\n        point = projectRotateTransform.invert(point[0], point[1]);\n        return point && [\n            point[0] * (0, _mathJs.degrees),\n            point[1] * (0, _mathJs.degrees)\n        ];\n    }\n    projection1.stream = function(stream) {\n        return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n    };\n    projection1.preclip = function(_) {\n        return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n    };\n    projection1.postclip = function(_) {\n        return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n    };\n    projection1.clipAngle = function(_) {\n        return arguments.length ? (preclip = +_ ? (0, _circleJsDefault.default)(theta = _ * (0, _mathJs.radians)) : (theta = null, _antimeridianJsDefault.default), reset()) : theta * (0, _mathJs.degrees);\n    };\n    projection1.clipExtent = function(_) {\n        return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, _identityJsDefault.default) : (0, _rectangleJsDefault.default)(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n    };\n    projection1.scale = function(_) {\n        return arguments.length ? (k = +_, recenter()) : k;\n    };\n    projection1.translate = function(_) {\n        return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [\n            x,\n            y\n        ];\n    };\n    projection1.center = function(_) {\n        return arguments.length ? (lambda = _[0] % 360 * (0, _mathJs.radians), phi = _[1] % 360 * (0, _mathJs.radians), recenter()) : [\n            lambda * (0, _mathJs.degrees),\n            phi * (0, _mathJs.degrees)\n        ];\n    };\n    projection1.rotate = function(_) {\n        return arguments.length ? (deltaLambda = _[0] % 360 * (0, _mathJs.radians), deltaPhi = _[1] % 360 * (0, _mathJs.radians), deltaGamma = _.length > 2 ? _[2] % 360 * (0, _mathJs.radians) : 0, recenter()) : [\n            deltaLambda * (0, _mathJs.degrees),\n            deltaPhi * (0, _mathJs.degrees),\n            deltaGamma * (0, _mathJs.degrees)\n        ];\n    };\n    projection1.angle = function(_) {\n        return arguments.length ? (alpha = _ % 360 * (0, _mathJs.radians), recenter()) : alpha * (0, _mathJs.degrees);\n    };\n    projection1.reflectX = function(_) {\n        return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n    };\n    projection1.reflectY = function(_) {\n        return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n    };\n    projection1.precision = function(_) {\n        return arguments.length ? (projectResample = (0, _resampleJsDefault.default)(projectTransform, delta2 = _ * _), reset()) : (0, _mathJs.sqrt)(delta2);\n    };\n    projection1.fitExtent = function(extent, object) {\n        return (0, _fitJs.fitExtent)(projection1, extent, object);\n    };\n    projection1.fitSize = function(size, object) {\n        return (0, _fitJs.fitSize)(projection1, size, object);\n    };\n    projection1.fitWidth = function(width, object) {\n        return (0, _fitJs.fitWidth)(projection1, width, object);\n    };\n    projection1.fitHeight = function(height, object) {\n        return (0, _fitJs.fitHeight)(projection1, height, object);\n    };\n    function recenter() {\n        var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);\n        rotate = (0, _rotationJs.rotateRadians)(deltaLambda, deltaPhi, deltaGamma);\n        projectTransform = (0, _composeJsDefault.default)(project, transform);\n        projectRotateTransform = (0, _composeJsDefault.default)(rotate, projectTransform);\n        projectResample = (0, _resampleJsDefault.default)(projectTransform, delta2);\n        return reset();\n    }\n    function reset() {\n        cache = cacheStream = null;\n        return projection1;\n    }\n    return function() {\n        project = projectAt.apply(this, arguments);\n        projection1.invert = project.invert && invert;\n        return recenter();\n    };\n}\n\n},{\"../clip/antimeridian.js\":\"bvEzz\",\"../clip/circle.js\":\"gm7cL\",\"../clip/rectangle.js\":\"1FZ3Z\",\"../compose.js\":\"8JySJ\",\"../identity.js\":\"bKsMQ\",\"../math.js\":\"cDOGy\",\"../rotation.js\":\"5axF2\",\"../transform.js\":\"dzOgu\",\"./fit.js\":\"3C0cd\",\"./resample.js\":\"gBBSp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dzOgu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"transformer\", ()=>transformer);\nexports.default = function(methods) {\n    return {\n        stream: transformer(methods)\n    };\n};\nfunction transformer(methods) {\n    return function(stream) {\n        var s = new TransformStream;\n        for(var key in methods)s[key] = methods[key];\n        s.stream = stream;\n        return s;\n    };\n}\nfunction TransformStream() {}\nTransformStream.prototype = {\n    constructor: TransformStream,\n    point: function(x, y) {\n        this.stream.point(x, y);\n    },\n    sphere: function() {\n        this.stream.sphere();\n    },\n    lineStart: function() {\n        this.stream.lineStart();\n    },\n    lineEnd: function() {\n        this.stream.lineEnd();\n    },\n    polygonStart: function() {\n        this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n        this.stream.polygonEnd();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3C0cd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fitExtent\", ()=>fitExtent);\nparcelHelpers.export(exports, \"fitSize\", ()=>fitSize);\nparcelHelpers.export(exports, \"fitWidth\", ()=>fitWidth);\nparcelHelpers.export(exports, \"fitHeight\", ()=>fitHeight);\nvar _streamJs = require(\"../stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar _boundsJs = require(\"../path/bounds.js\");\nvar _boundsJsDefault = parcelHelpers.interopDefault(_boundsJs);\nfunction fit(projection, fitBounds, object) {\n    var clip = projection.clipExtent && projection.clipExtent();\n    projection.scale(150).translate([\n        0,\n        0\n    ]);\n    if (clip != null) projection.clipExtent(null);\n    (0, _streamJsDefault.default)(object, projection.stream((0, _boundsJsDefault.default)));\n    fitBounds((0, _boundsJsDefault.default).result());\n    if (clip != null) projection.clipExtent(clip);\n    return projection;\n}\nfunction fitExtent(projection, extent, object) {\n    return fit(projection, function(b) {\n        var w = extent[1][0] - extent[0][0], h = extent[1][1] - extent[0][1], k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n        projection.scale(150 * k).translate([\n            x,\n            y\n        ]);\n    }, object);\n}\nfunction fitSize(projection, size, object) {\n    return fitExtent(projection, [\n        [\n            0,\n            0\n        ],\n        size\n    ], object);\n}\nfunction fitWidth(projection, width, object) {\n    return fit(projection, function(b) {\n        var w = +width, k = w / (b[1][0] - b[0][0]), x = (w - k * (b[1][0] + b[0][0])) / 2, y = -k * b[0][1];\n        projection.scale(150 * k).translate([\n            x,\n            y\n        ]);\n    }, object);\n}\nfunction fitHeight(projection, height, object) {\n    return fit(projection, function(b) {\n        var h = +height, k = h / (b[1][1] - b[0][1]), x = -k * b[0][0], y = (h - k * (b[1][1] + b[0][1])) / 2;\n        projection.scale(150 * k).translate([\n            x,\n            y\n        ]);\n    }, object);\n}\n\n},{\"../stream.js\":\"iPxfz\",\"../path/bounds.js\":\"8kVkb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gBBSp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _cartesianJs = require(\"../cartesian.js\");\nvar _mathJs = require(\"../math.js\");\nvar _transformJs = require(\"../transform.js\");\nvar maxDepth = 16, cosMinDistance = (0, _mathJs.cos)(30 * (0, _mathJs.radians)); // cos(minimum angular distance)\nexports.default = function(project, delta2) {\n    return +delta2 ? resample(project, delta2) : resampleNone(project);\n};\nfunction resampleNone(project) {\n    return (0, _transformJs.transformer)({\n        point: function(x, y) {\n            x = project(x, y);\n            this.stream.point(x[0], x[1]);\n        }\n    });\n}\nfunction resample(project, delta2) {\n    function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n        var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n        if (d2 > 4 * delta2 && depth--) {\n            var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = (0, _mathJs.sqrt)(a * a + b * b + c * c), phi2 = (0, _mathJs.asin)(c /= m), lambda2 = (0, _mathJs.abs)((0, _mathJs.abs)(c) - 1) < (0, _mathJs.epsilon) || (0, _mathJs.abs)(lambda0 - lambda1) < (0, _mathJs.epsilon) ? (lambda0 + lambda1) / 2 : (0, _mathJs.atan2)(b, a), p = project(lambda2, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n            if (dz * dz / d2 > delta2 // perpendicular projected distance\n             || (0, _mathJs.abs)((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n             || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n                resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n                stream.point(x2, y2);\n                resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n            }\n        }\n    }\n    return function(stream) {\n        var lambda00, x00, y00, a00, b00, c00, lambda0, x0, y0, a0, b0, c0; // previous point\n        var resampleStream = {\n            point: point,\n            lineStart: lineStart,\n            lineEnd: lineEnd,\n            polygonStart: function() {\n                stream.polygonStart();\n                resampleStream.lineStart = ringStart;\n            },\n            polygonEnd: function() {\n                stream.polygonEnd();\n                resampleStream.lineStart = lineStart;\n            }\n        };\n        function point(x, y) {\n            x = project(x, y);\n            stream.point(x[0], x[1]);\n        }\n        function lineStart() {\n            x0 = NaN;\n            resampleStream.point = linePoint;\n            stream.lineStart();\n        }\n        function linePoint(lambda, phi) {\n            var c = (0, _cartesianJs.cartesian)([\n                lambda,\n                phi\n            ]), p = project(lambda, phi);\n            resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n            stream.point(x0, y0);\n        }\n        function lineEnd() {\n            resampleStream.point = point;\n            stream.lineEnd();\n        }\n        function ringStart() {\n            lineStart();\n            resampleStream.point = ringPoint;\n            resampleStream.lineEnd = ringEnd;\n        }\n        function ringPoint(lambda, phi) {\n            linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n            resampleStream.point = linePoint;\n        }\n        function ringEnd() {\n            resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n            resampleStream.lineEnd = lineEnd;\n            lineEnd();\n        }\n        return resampleStream;\n    };\n}\n\n},{\"../cartesian.js\":\"e5njx\",\"../math.js\":\"cDOGy\",\"../transform.js\":\"dzOgu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hDeKr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cylindricalEqualAreaRaw\", ()=>cylindricalEqualAreaRaw);\nvar _mathJs = require(\"../math.js\");\nfunction cylindricalEqualAreaRaw(phi0) {\n    var cosPhi0 = (0, _mathJs.cos)(phi0);\n    function forward(lambda, phi) {\n        return [\n            lambda * cosPhi0,\n            (0, _mathJs.sin)(phi) / cosPhi0\n        ];\n    }\n    forward.invert = function(x, y) {\n        return [\n            x / cosPhi0,\n            (0, _mathJs.asin)(y * cosPhi0)\n        ];\n    };\n    return forward;\n}\n\n},{\"../math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7IuwQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nvar _albersJs = require(\"./albers.js\");\nvar _albersJsDefault = parcelHelpers.interopDefault(_albersJs);\nvar _conicEqualAreaJs = require(\"./conicEqualArea.js\");\nvar _conicEqualAreaJsDefault = parcelHelpers.interopDefault(_conicEqualAreaJs);\nvar _fitJs = require(\"./fit.js\");\n// The projections must have mutually exclusive clip regions on the sphere,\n// as this will avoid emitting interleaving lines and polygons.\nfunction multiplex(streams) {\n    var n = streams.length;\n    return {\n        point: function(x, y) {\n            var i = -1;\n            while(++i < n)streams[i].point(x, y);\n        },\n        sphere: function() {\n            var i = -1;\n            while(++i < n)streams[i].sphere();\n        },\n        lineStart: function() {\n            var i = -1;\n            while(++i < n)streams[i].lineStart();\n        },\n        lineEnd: function() {\n            var i = -1;\n            while(++i < n)streams[i].lineEnd();\n        },\n        polygonStart: function() {\n            var i = -1;\n            while(++i < n)streams[i].polygonStart();\n        },\n        polygonEnd: function() {\n            var i = -1;\n            while(++i < n)streams[i].polygonEnd();\n        }\n    };\n}\n// A composite projection for the United States, configured by default for\n// 960×500. The projection also works quite well at 960×600 if you change the\n// scale to 1285 and adjust the translate accordingly. The set of standard\n// parallels for each region comes from USGS, which is published here:\n// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers\nexports.default = function() {\n    var cache, cacheStream, lower48 = (0, _albersJsDefault.default)(), lower48Point, alaska = (0, _conicEqualAreaJsDefault.default)().rotate([\n        154,\n        0\n    ]).center([\n        -2,\n        58.5\n    ]).parallels([\n        55,\n        65\n    ]), alaskaPoint, hawaii = (0, _conicEqualAreaJsDefault.default)().rotate([\n        157,\n        0\n    ]).center([\n        -3,\n        19.9\n    ]).parallels([\n        8,\n        18\n    ]), hawaiiPoint, point, pointStream = {\n        point: function(x, y) {\n            point = [\n                x,\n                y\n            ];\n        }\n    };\n    function albersUsa(coordinates) {\n        var x = coordinates[0], y = coordinates[1];\n        return point = null, (lower48Point.point(x, y), point) || (alaskaPoint.point(x, y), point) || (hawaiiPoint.point(x, y), point);\n    }\n    albersUsa.invert = function(coordinates) {\n        var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n        return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n        return cache && cacheStream === stream ? cache : cache = multiplex([\n            lower48.stream(cacheStream = stream),\n            alaska.stream(stream),\n            hawaii.stream(stream)\n        ]);\n    };\n    albersUsa.precision = function(_) {\n        if (!arguments.length) return lower48.precision();\n        lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n        return reset();\n    };\n    albersUsa.scale = function(_) {\n        if (!arguments.length) return lower48.scale();\n        lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n        return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n        if (!arguments.length) return lower48.translate();\n        var k = lower48.scale(), x = +_[0], y = +_[1];\n        lower48Point = lower48.translate(_).clipExtent([\n            [\n                x - 0.455 * k,\n                y - 0.238 * k\n            ],\n            [\n                x + 0.455 * k,\n                y + 0.238 * k\n            ]\n        ]).stream(pointStream);\n        alaskaPoint = alaska.translate([\n            x - 0.307 * k,\n            y + 0.201 * k\n        ]).clipExtent([\n            [\n                x - 0.425 * k + (0, _mathJs.epsilon),\n                y + 0.120 * k + (0, _mathJs.epsilon)\n            ],\n            [\n                x - 0.214 * k - (0, _mathJs.epsilon),\n                y + 0.234 * k - (0, _mathJs.epsilon)\n            ]\n        ]).stream(pointStream);\n        hawaiiPoint = hawaii.translate([\n            x - 0.205 * k,\n            y + 0.212 * k\n        ]).clipExtent([\n            [\n                x - 0.214 * k + (0, _mathJs.epsilon),\n                y + 0.166 * k + (0, _mathJs.epsilon)\n            ],\n            [\n                x - 0.115 * k - (0, _mathJs.epsilon),\n                y + 0.234 * k - (0, _mathJs.epsilon)\n            ]\n        ]).stream(pointStream);\n        return reset();\n    };\n    albersUsa.fitExtent = function(extent, object) {\n        return (0, _fitJs.fitExtent)(albersUsa, extent, object);\n    };\n    albersUsa.fitSize = function(size, object) {\n        return (0, _fitJs.fitSize)(albersUsa, size, object);\n    };\n    albersUsa.fitWidth = function(width, object) {\n        return (0, _fitJs.fitWidth)(albersUsa, width, object);\n    };\n    albersUsa.fitHeight = function(height, object) {\n        return (0, _fitJs.fitHeight)(albersUsa, height, object);\n    };\n    function reset() {\n        cache = cacheStream = null;\n        return albersUsa;\n    }\n    return albersUsa.scale(1070);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./albers.js\":\"bpSYz\",\"./conicEqualArea.js\":\"95gV8\",\"./fit.js\":\"3C0cd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"63blr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"azimuthalEqualAreaRaw\", ()=>azimuthalEqualAreaRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar azimuthalEqualAreaRaw = (0, _azimuthalJs.azimuthalRaw)(function(cxcy) {\n    return (0, _mathJs.sqrt)(2 / (1 + cxcy));\n});\nazimuthalEqualAreaRaw.invert = (0, _azimuthalJs.azimuthalInvert)(function(z) {\n    return 2 * (0, _mathJs.asin)(z / 2);\n});\nexports.default = function() {\n    return (0, _indexJsDefault.default)(azimuthalEqualAreaRaw).scale(124.75).clipAngle(179.999);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./azimuthal.js\":\"kWFKJ\",\"./index.js\":\"err8N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kWFKJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"azimuthalRaw\", ()=>azimuthalRaw);\nparcelHelpers.export(exports, \"azimuthalInvert\", ()=>azimuthalInvert);\nvar _mathJs = require(\"../math.js\");\nfunction azimuthalRaw(scale) {\n    return function(x, y) {\n        var cx = (0, _mathJs.cos)(x), cy = (0, _mathJs.cos)(y), k = scale(cx * cy);\n        if (k === Infinity) return [\n            2,\n            0\n        ];\n        return [\n            k * cy * (0, _mathJs.sin)(x),\n            k * (0, _mathJs.sin)(y)\n        ];\n    };\n}\nfunction azimuthalInvert(angle) {\n    return function(x, y) {\n        var z = (0, _mathJs.sqrt)(x * x + y * y), c = angle(z), sc = (0, _mathJs.sin)(c), cc = (0, _mathJs.cos)(c);\n        return [\n            (0, _mathJs.atan2)(x * sc, z * cc),\n            (0, _mathJs.asin)(z && y * sc / z)\n        ];\n    };\n}\n\n},{\"../math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7w2oT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"azimuthalEquidistantRaw\", ()=>azimuthalEquidistantRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar azimuthalEquidistantRaw = (0, _azimuthalJs.azimuthalRaw)(function(c) {\n    return (c = (0, _mathJs.acos)(c)) && c / (0, _mathJs.sin)(c);\n});\nazimuthalEquidistantRaw.invert = (0, _azimuthalJs.azimuthalInvert)(function(z) {\n    return z;\n});\nexports.default = function() {\n    return (0, _indexJsDefault.default)(azimuthalEquidistantRaw).scale(79.4188).clipAngle(179.999);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./azimuthal.js\":\"kWFKJ\",\"./index.js\":\"err8N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"evY8P\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"conicConformalRaw\", ()=>conicConformalRaw);\nvar _mathJs = require(\"../math.js\");\nvar _conicJs = require(\"./conic.js\");\nvar _mercatorJs = require(\"./mercator.js\");\nfunction tany(y) {\n    return (0, _mathJs.tan)(((0, _mathJs.halfPi) + y) / 2);\n}\nfunction conicConformalRaw(y0, y1) {\n    var cy0 = (0, _mathJs.cos)(y0), n = y0 === y1 ? (0, _mathJs.sin)(y0) : (0, _mathJs.log)(cy0 / (0, _mathJs.cos)(y1)) / (0, _mathJs.log)(tany(y1) / tany(y0)), f = cy0 * (0, _mathJs.pow)(tany(y0), n) / n;\n    if (!n) return 0, _mercatorJs.mercatorRaw;\n    function project(x, y) {\n        if (f > 0) {\n            if (y < -(0, _mathJs.halfPi) + (0, _mathJs.epsilon)) y = -(0, _mathJs.halfPi) + (0, _mathJs.epsilon);\n        } else if (y > (0, _mathJs.halfPi) - (0, _mathJs.epsilon)) y = (0, _mathJs.halfPi) - (0, _mathJs.epsilon);\n        var r = f / (0, _mathJs.pow)(tany(y), n);\n        return [\n            r * (0, _mathJs.sin)(n * x),\n            f - r * (0, _mathJs.cos)(n * x)\n        ];\n    }\n    project.invert = function(x, y) {\n        var fy = f - y, r = (0, _mathJs.sign)(n) * (0, _mathJs.sqrt)(x * x + fy * fy), l = (0, _mathJs.atan2)(x, (0, _mathJs.abs)(fy)) * (0, _mathJs.sign)(fy);\n        if (fy * n < 0) l -= (0, _mathJs.pi) * (0, _mathJs.sign)(x) * (0, _mathJs.sign)(fy);\n        return [\n            l / n,\n            2 * (0, _mathJs.atan)((0, _mathJs.pow)(f / r, 1 / n)) - (0, _mathJs.halfPi)\n        ];\n    };\n    return project;\n}\nexports.default = function() {\n    return (0, _conicJs.conicProjection)(conicConformalRaw).scale(109.5).parallels([\n        30,\n        30\n    ]);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./conic.js\":\"aF8Oh\",\"./mercator.js\":\"a3u6b\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a3u6b\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mercatorRaw\", ()=>mercatorRaw);\nparcelHelpers.export(exports, \"mercatorProjection\", ()=>mercatorProjection);\nvar _mathJs = require(\"../math.js\");\nvar _rotationJs = require(\"../rotation.js\");\nvar _rotationJsDefault = parcelHelpers.interopDefault(_rotationJs);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction mercatorRaw(lambda, phi) {\n    return [\n        lambda,\n        (0, _mathJs.log)((0, _mathJs.tan)(((0, _mathJs.halfPi) + phi) / 2))\n    ];\n}\nmercatorRaw.invert = function(x, y) {\n    return [\n        x,\n        2 * (0, _mathJs.atan)((0, _mathJs.exp)(y)) - (0, _mathJs.halfPi)\n    ];\n};\nexports.default = function() {\n    return mercatorProjection(mercatorRaw).scale(961 / (0, _mathJs.tau));\n};\nfunction mercatorProjection(project) {\n    var m = (0, _indexJsDefault.default)(project), center = m.center, scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, x0 = null, y0, x1, y1; // clip extent\n    m.scale = function(_) {\n        return arguments.length ? (scale(_), reclip()) : scale();\n    };\n    m.translate = function(_) {\n        return arguments.length ? (translate(_), reclip()) : translate();\n    };\n    m.center = function(_) {\n        return arguments.length ? (center(_), reclip()) : center();\n    };\n    m.clipExtent = function(_) {\n        return arguments.length ? (_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reclip()) : x0 == null ? null : [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n    };\n    function reclip() {\n        var k = (0, _mathJs.pi) * scale(), t = m((0, _rotationJsDefault.default)(m.rotate()).invert([\n            0,\n            0\n        ]));\n        return clipExtent(x0 == null ? [\n            [\n                t[0] - k,\n                t[1] - k\n            ],\n            [\n                t[0] + k,\n                t[1] + k\n            ]\n        ] : project === mercatorRaw ? [\n            [\n                Math.max(t[0] - k, x0),\n                y0\n            ],\n            [\n                Math.min(t[0] + k, x1),\n                y1\n            ]\n        ] : [\n            [\n                x0,\n                Math.max(t[1] - k, y0)\n            ],\n            [\n                x1,\n                Math.min(t[1] + k, y1)\n            ]\n        ]);\n    }\n    return reclip();\n}\n\n},{\"../math.js\":\"cDOGy\",\"../rotation.js\":\"5axF2\",\"./index.js\":\"err8N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5ECob\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"conicEquidistantRaw\", ()=>conicEquidistantRaw);\nvar _mathJs = require(\"../math.js\");\nvar _conicJs = require(\"./conic.js\");\nvar _equirectangularJs = require(\"./equirectangular.js\");\nfunction conicEquidistantRaw(y0, y1) {\n    var cy0 = (0, _mathJs.cos)(y0), n = y0 === y1 ? (0, _mathJs.sin)(y0) : (cy0 - (0, _mathJs.cos)(y1)) / (y1 - y0), g = cy0 / n + y0;\n    if ((0, _mathJs.abs)(n) < (0, _mathJs.epsilon)) return 0, _equirectangularJs.equirectangularRaw;\n    function project(x, y) {\n        var gy = g - y, nx = n * x;\n        return [\n            gy * (0, _mathJs.sin)(nx),\n            g - gy * (0, _mathJs.cos)(nx)\n        ];\n    }\n    project.invert = function(x, y) {\n        var gy = g - y, l = (0, _mathJs.atan2)(x, (0, _mathJs.abs)(gy)) * (0, _mathJs.sign)(gy);\n        if (gy * n < 0) l -= (0, _mathJs.pi) * (0, _mathJs.sign)(x) * (0, _mathJs.sign)(gy);\n        return [\n            l / n,\n            g - (0, _mathJs.sign)(n) * (0, _mathJs.sqrt)(x * x + gy * gy)\n        ];\n    };\n    return project;\n}\nexports.default = function() {\n    return (0, _conicJs.conicProjection)(conicEquidistantRaw).scale(131.154).center([\n        0,\n        13.9389\n    ]);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./conic.js\":\"aF8Oh\",\"./equirectangular.js\":\"7LWmg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7LWmg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"equirectangularRaw\", ()=>equirectangularRaw);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction equirectangularRaw(lambda, phi) {\n    return [\n        lambda,\n        phi\n    ];\n}\nequirectangularRaw.invert = equirectangularRaw;\nexports.default = function() {\n    return (0, _indexJsDefault.default)(equirectangularRaw).scale(152.63);\n};\n\n},{\"./index.js\":\"err8N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lL9Mh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"equalEarthRaw\", ()=>equalEarthRaw);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _mathJs = require(\"../math.js\");\nvar A1 = 1.340264, A2 = -0.081106, A3 = 0.000893, A4 = 0.003796, M = (0, _mathJs.sqrt)(3) / 2, iterations = 12;\nfunction equalEarthRaw(lambda, phi) {\n    var l = (0, _mathJs.asin)(M * (0, _mathJs.sin)(phi)), l2 = l * l, l6 = l2 * l2 * l2;\n    return [\n        lambda * (0, _mathJs.cos)(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n        l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n    ];\n}\nequalEarthRaw.invert = function(x, y) {\n    var l = y, l2 = l * l, l6 = l2 * l2 * l2;\n    for(var i = 0, delta, fy, fpy; i < iterations; ++i){\n        fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;\n        fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n        l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n        if ((0, _mathJs.abs)(delta) < (0, _mathJs.epsilon2)) break;\n    }\n    return [\n        M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / (0, _mathJs.cos)(l),\n        (0, _mathJs.asin)((0, _mathJs.sin)(l) / M)\n    ];\n};\nexports.default = function() {\n    return (0, _indexJsDefault.default)(equalEarthRaw).scale(177.158);\n};\n\n},{\"./index.js\":\"err8N\",\"../math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f5IMi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"gnomonicRaw\", ()=>gnomonicRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction gnomonicRaw(x, y) {\n    var cy = (0, _mathJs.cos)(y), k = (0, _mathJs.cos)(x) * cy;\n    return [\n        cy * (0, _mathJs.sin)(x) / k,\n        (0, _mathJs.sin)(y) / k\n    ];\n}\ngnomonicRaw.invert = (0, _azimuthalJs.azimuthalInvert)((0, _mathJs.atan));\nexports.default = function() {\n    return (0, _indexJsDefault.default)(gnomonicRaw).scale(144.049).clipAngle(60);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./azimuthal.js\":\"kWFKJ\",\"./index.js\":\"err8N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"74iXI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _rectangleJs = require(\"../clip/rectangle.js\");\nvar _rectangleJsDefault = parcelHelpers.interopDefault(_rectangleJs);\nvar _identityJs = require(\"../identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _transformJs = require(\"../transform.js\");\nvar _fitJs = require(\"./fit.js\");\nvar _mathJs = require(\"../math.js\");\nexports.default = function() {\n    var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, alpha = 0, ca, sa, x0 = null, y0, x1, y1, kx = 1, ky = 1, transform = (0, _transformJs.transformer)({\n        point: function(x, y) {\n            var p = projection([\n                x,\n                y\n            ]);\n            this.stream.point(p[0], p[1]);\n        }\n    }), postclip = (0, _identityJsDefault.default), cache, cacheStream;\n    function reset() {\n        kx = k * sx;\n        ky = k * sy;\n        cache = cacheStream = null;\n        return projection;\n    }\n    function projection(p) {\n        var x = p[0] * kx, y = p[1] * ky;\n        if (alpha) {\n            var t = y * ca - x * sa;\n            x = x * ca + y * sa;\n            y = t;\n        }\n        return [\n            x + tx,\n            y + ty\n        ];\n    }\n    projection.invert = function(p) {\n        var x = p[0] - tx, y = p[1] - ty;\n        if (alpha) {\n            var t = y * ca + x * sa;\n            x = x * ca - y * sa;\n            y = t;\n        }\n        return [\n            x / kx,\n            y / ky\n        ];\n    };\n    projection.stream = function(stream) {\n        return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));\n    };\n    projection.postclip = function(_) {\n        return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n    };\n    projection.clipExtent = function(_) {\n        return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, _identityJsDefault.default) : (0, _rectangleJsDefault.default)(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n    };\n    projection.scale = function(_) {\n        return arguments.length ? (k = +_, reset()) : k;\n    };\n    projection.translate = function(_) {\n        return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [\n            tx,\n            ty\n        ];\n    };\n    projection.angle = function(_) {\n        return arguments.length ? (alpha = _ % 360 * (0, _mathJs.radians), sa = (0, _mathJs.sin)(alpha), ca = (0, _mathJs.cos)(alpha), reset()) : alpha * (0, _mathJs.degrees);\n    };\n    projection.reflectX = function(_) {\n        return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0;\n    };\n    projection.reflectY = function(_) {\n        return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0;\n    };\n    projection.fitExtent = function(extent, object) {\n        return (0, _fitJs.fitExtent)(projection, extent, object);\n    };\n    projection.fitSize = function(size, object) {\n        return (0, _fitJs.fitSize)(projection, size, object);\n    };\n    projection.fitWidth = function(width, object) {\n        return (0, _fitJs.fitWidth)(projection, width, object);\n    };\n    projection.fitHeight = function(height, object) {\n        return (0, _fitJs.fitHeight)(projection, height, object);\n    };\n    return projection;\n};\n\n},{\"../clip/rectangle.js\":\"1FZ3Z\",\"../identity.js\":\"bKsMQ\",\"../transform.js\":\"dzOgu\",\"./fit.js\":\"3C0cd\",\"../math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bSXCt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"naturalEarth1Raw\", ()=>naturalEarth1Raw);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _mathJs = require(\"../math.js\");\nfunction naturalEarth1Raw(lambda, phi) {\n    var phi2 = phi * phi, phi4 = phi2 * phi2;\n    return [\n        lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),\n        phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))\n    ];\n}\nnaturalEarth1Raw.invert = function(x, y) {\n    var phi = y, i = 25, delta;\n    do {\n        var phi2 = phi * phi, phi4 = phi2 * phi2;\n        phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / (1.007226 + phi2 * (0.045255 + phi4 * (-0.311325 + 0.259866 * phi2 - 0.005916 * 11 * phi4)));\n    }while ((0, _mathJs.abs)(delta) > (0, _mathJs.epsilon) && --i > 0);\n    return [\n        x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),\n        phi\n    ];\n};\nexports.default = function() {\n    return (0, _indexJsDefault.default)(naturalEarth1Raw).scale(175.295);\n};\n\n},{\"./index.js\":\"err8N\",\"../math.js\":\"cDOGy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b9yDq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"orthographicRaw\", ()=>orthographicRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction orthographicRaw(x, y) {\n    return [\n        (0, _mathJs.cos)(y) * (0, _mathJs.sin)(x),\n        (0, _mathJs.sin)(y)\n    ];\n}\northographicRaw.invert = (0, _azimuthalJs.azimuthalInvert)((0, _mathJs.asin));\nexports.default = function() {\n    return (0, _indexJsDefault.default)(orthographicRaw).scale(249.5).clipAngle(90 + (0, _mathJs.epsilon));\n};\n\n},{\"../math.js\":\"cDOGy\",\"./azimuthal.js\":\"kWFKJ\",\"./index.js\":\"err8N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7rm2j\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"stereographicRaw\", ()=>stereographicRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction stereographicRaw(x, y) {\n    var cy = (0, _mathJs.cos)(y), k = 1 + (0, _mathJs.cos)(x) * cy;\n    return [\n        cy * (0, _mathJs.sin)(x) / k,\n        (0, _mathJs.sin)(y) / k\n    ];\n}\nstereographicRaw.invert = (0, _azimuthalJs.azimuthalInvert)(function(z) {\n    return 2 * (0, _mathJs.atan)(z);\n});\nexports.default = function() {\n    return (0, _indexJsDefault.default)(stereographicRaw).scale(250).clipAngle(142);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./azimuthal.js\":\"kWFKJ\",\"./index.js\":\"err8N\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k1100\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"transverseMercatorRaw\", ()=>transverseMercatorRaw);\nvar _mathJs = require(\"../math.js\");\nvar _mercatorJs = require(\"./mercator.js\");\nfunction transverseMercatorRaw(lambda, phi) {\n    return [\n        (0, _mathJs.log)((0, _mathJs.tan)(((0, _mathJs.halfPi) + phi) / 2)),\n        -lambda\n    ];\n}\ntransverseMercatorRaw.invert = function(x, y) {\n    return [\n        -y,\n        2 * (0, _mathJs.atan)((0, _mathJs.exp)(x)) - (0, _mathJs.halfPi)\n    ];\n};\nexports.default = function() {\n    var m = (0, _mercatorJs.mercatorProjection)(transverseMercatorRaw), center = m.center, rotate = m.rotate;\n    m.center = function(_) {\n        return arguments.length ? center([\n            -_[1],\n            _[0]\n        ]) : (_ = center(), [\n            _[1],\n            -_[0]\n        ]);\n    };\n    m.rotate = function(_) {\n        return arguments.length ? rotate([\n            _[0],\n            _[1],\n            _.length > 2 ? _[2] + 90 : 90\n        ]) : (_ = rotate(), [\n            _[0],\n            _[1],\n            _[2] - 90\n        ]);\n    };\n    return rotate([\n        0,\n        0,\n        90\n    ]).scale(159.155);\n};\n\n},{\"../math.js\":\"cDOGy\",\"./mercator.js\":\"a3u6b\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3lKpN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"geoAiry\", ()=>(0, _airyDefault.default));\nparcelHelpers.export(exports, \"geoAiryRaw\", ()=>(0, _airy.airyRaw));\nparcelHelpers.export(exports, \"geoAitoff\", ()=>(0, _aitoffDefault.default));\nparcelHelpers.export(exports, \"geoAitoffRaw\", ()=>(0, _aitoff.aitoffRaw));\nparcelHelpers.export(exports, \"geoArmadillo\", ()=>(0, _armadilloDefault.default));\nparcelHelpers.export(exports, \"geoArmadilloRaw\", ()=>(0, _armadillo.armadilloRaw));\nparcelHelpers.export(exports, \"geoAugust\", ()=>(0, _augustDefault.default));\nparcelHelpers.export(exports, \"geoAugustRaw\", ()=>(0, _august.augustRaw));\nparcelHelpers.export(exports, \"geoBaker\", ()=>(0, _bakerDefault.default));\nparcelHelpers.export(exports, \"geoBakerRaw\", ()=>(0, _baker.bakerRaw));\nparcelHelpers.export(exports, \"geoBerghaus\", ()=>(0, _berghausDefault.default));\nparcelHelpers.export(exports, \"geoBerghausRaw\", ()=>(0, _berghaus.berghausRaw));\nparcelHelpers.export(exports, \"geoBertin1953\", ()=>(0, _bertinDefault.default));\nparcelHelpers.export(exports, \"geoBertin1953Raw\", ()=>(0, _bertin.bertin1953Raw));\nparcelHelpers.export(exports, \"geoBoggs\", ()=>(0, _boggsDefault.default));\nparcelHelpers.export(exports, \"geoBoggsRaw\", ()=>(0, _boggs.boggsRaw));\nparcelHelpers.export(exports, \"geoBonne\", ()=>(0, _bonneDefault.default));\nparcelHelpers.export(exports, \"geoBonneRaw\", ()=>(0, _bonne.bonneRaw));\nparcelHelpers.export(exports, \"geoBottomley\", ()=>(0, _bottomleyDefault.default));\nparcelHelpers.export(exports, \"geoBottomleyRaw\", ()=>(0, _bottomley.bottomleyRaw));\nparcelHelpers.export(exports, \"geoBromley\", ()=>(0, _bromleyDefault.default));\nparcelHelpers.export(exports, \"geoBromleyRaw\", ()=>(0, _bromley.bromleyRaw));\nparcelHelpers.export(exports, \"geoChamberlin\", ()=>(0, _chamberlinDefault.default));\nparcelHelpers.export(exports, \"geoChamberlinRaw\", ()=>(0, _chamberlin.chamberlinRaw));\nparcelHelpers.export(exports, \"geoChamberlinAfrica\", ()=>(0, _chamberlin.chamberlinAfrica));\nparcelHelpers.export(exports, \"geoCollignon\", ()=>(0, _collignonDefault.default));\nparcelHelpers.export(exports, \"geoCollignonRaw\", ()=>(0, _collignon.collignonRaw));\nparcelHelpers.export(exports, \"geoCraig\", ()=>(0, _craigDefault.default));\nparcelHelpers.export(exports, \"geoCraigRaw\", ()=>(0, _craig.craigRaw));\nparcelHelpers.export(exports, \"geoCraster\", ()=>(0, _crasterDefault.default));\nparcelHelpers.export(exports, \"geoCrasterRaw\", ()=>(0, _craster.crasterRaw));\nparcelHelpers.export(exports, \"geoCylindricalEqualArea\", ()=>(0, _cylindricalEqualAreaDefault.default));\nparcelHelpers.export(exports, \"geoCylindricalEqualAreaRaw\", ()=>(0, _cylindricalEqualArea.cylindricalEqualAreaRaw));\nparcelHelpers.export(exports, \"geoCylindricalStereographic\", ()=>(0, _cylindricalStereographicDefault.default));\nparcelHelpers.export(exports, \"geoCylindricalStereographicRaw\", ()=>(0, _cylindricalStereographic.cylindricalStereographicRaw));\nparcelHelpers.export(exports, \"geoEckert1\", ()=>(0, _eckert1JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert1Raw\", ()=>(0, _eckert1Js.eckert1Raw));\nparcelHelpers.export(exports, \"geoEckert2\", ()=>(0, _eckert2JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert2Raw\", ()=>(0, _eckert2Js.eckert2Raw));\nparcelHelpers.export(exports, \"geoEckert3\", ()=>(0, _eckert3JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert3Raw\", ()=>(0, _eckert3Js.eckert3Raw));\nparcelHelpers.export(exports, \"geoEckert4\", ()=>(0, _eckert4JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert4Raw\", ()=>(0, _eckert4Js.eckert4Raw));\nparcelHelpers.export(exports, \"geoEckert5\", ()=>(0, _eckert5JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert5Raw\", ()=>(0, _eckert5Js.eckert5Raw));\nparcelHelpers.export(exports, \"geoEckert6\", ()=>(0, _eckert6JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert6Raw\", ()=>(0, _eckert6Js.eckert6Raw));\nparcelHelpers.export(exports, \"geoEisenlohr\", ()=>(0, _eisenlohrJsDefault.default));\nparcelHelpers.export(exports, \"geoEisenlohrRaw\", ()=>(0, _eisenlohrJs.eisenlohrRaw));\nparcelHelpers.export(exports, \"geoFahey\", ()=>(0, _faheyJsDefault.default));\nparcelHelpers.export(exports, \"geoFaheyRaw\", ()=>(0, _faheyJs.faheyRaw));\nparcelHelpers.export(exports, \"geoFoucaut\", ()=>(0, _foucautJsDefault.default));\nparcelHelpers.export(exports, \"geoFoucautRaw\", ()=>(0, _foucautJs.foucautRaw));\nparcelHelpers.export(exports, \"geoFoucautSinusoidal\", ()=>(0, _foucautSinusoidalJsDefault.default));\nparcelHelpers.export(exports, \"geoFoucautSinusoidalRaw\", ()=>(0, _foucautSinusoidalJs.foucautSinusoidalRaw));\nparcelHelpers.export(exports, \"geoGilbert\", ()=>(0, _gilbertJsDefault.default));\nparcelHelpers.export(exports, \"geoGingery\", ()=>(0, _gingeryJsDefault.default));\nparcelHelpers.export(exports, \"geoGingeryRaw\", ()=>(0, _gingeryJs.gingeryRaw));\nparcelHelpers.export(exports, \"geoGinzburg4\", ()=>(0, _ginzburg4JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg4Raw\", ()=>(0, _ginzburg4Js.ginzburg4Raw));\nparcelHelpers.export(exports, \"geoGinzburg5\", ()=>(0, _ginzburg5JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg5Raw\", ()=>(0, _ginzburg5Js.ginzburg5Raw));\nparcelHelpers.export(exports, \"geoGinzburg6\", ()=>(0, _ginzburg6JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg6Raw\", ()=>(0, _ginzburg6Js.ginzburg6Raw));\nparcelHelpers.export(exports, \"geoGinzburg8\", ()=>(0, _ginzburg8JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg8Raw\", ()=>(0, _ginzburg8Js.ginzburg8Raw));\nparcelHelpers.export(exports, \"geoGinzburg9\", ()=>(0, _ginzburg9JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg9Raw\", ()=>(0, _ginzburg9Js.ginzburg9Raw));\nparcelHelpers.export(exports, \"geoGringorten\", ()=>(0, _gringortenJsDefault.default));\nparcelHelpers.export(exports, \"geoGringortenRaw\", ()=>(0, _gringortenJs.gringortenRaw));\nparcelHelpers.export(exports, \"geoGuyou\", ()=>(0, _guyouJsDefault.default));\nparcelHelpers.export(exports, \"geoGuyouRaw\", ()=>(0, _guyouJs.guyouRaw));\nparcelHelpers.export(exports, \"geoHammer\", ()=>(0, _hammerJsDefault.default));\nparcelHelpers.export(exports, \"geoHammerRaw\", ()=>(0, _hammerJs.hammerRaw));\nparcelHelpers.export(exports, \"geoHammerRetroazimuthal\", ()=>(0, _hammerRetroazimuthalJsDefault.default));\nparcelHelpers.export(exports, \"geoHammerRetroazimuthalRaw\", ()=>(0, _hammerRetroazimuthalJs.hammerRetroazimuthalRaw));\nparcelHelpers.export(exports, \"geoHealpix\", ()=>(0, _healpixJsDefault.default));\nparcelHelpers.export(exports, \"geoHealpixRaw\", ()=>(0, _healpixJs.healpixRaw));\nparcelHelpers.export(exports, \"geoHill\", ()=>(0, _hillJsDefault.default));\nparcelHelpers.export(exports, \"geoHillRaw\", ()=>(0, _hillJs.hillRaw));\nparcelHelpers.export(exports, \"geoHomolosine\", ()=>(0, _homolosineJsDefault.default));\nparcelHelpers.export(exports, \"geoHomolosineRaw\", ()=>(0, _homolosineJs.homolosineRaw));\nparcelHelpers.export(exports, \"geoHufnagel\", ()=>(0, _hufnagelJsDefault.default));\nparcelHelpers.export(exports, \"geoHufnagelRaw\", ()=>(0, _hufnagelJs.hufnagelRaw));\nparcelHelpers.export(exports, \"geoHyperelliptical\", ()=>(0, _hyperellipticalDefault.default));\nparcelHelpers.export(exports, \"geoHyperellipticalRaw\", ()=>(0, _hyperelliptical.hyperellipticalRaw));\nparcelHelpers.export(exports, \"geoInterrupt\", ()=>(0, _indexDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedBoggs\", ()=>(0, _boggsDefault1.default));\nparcelHelpers.export(exports, \"geoInterruptedHomolosine\", ()=>(0, _homolosineDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedMollweide\", ()=>(0, _mollweideDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedMollweideHemispheres\", ()=>(0, _mollweideHemispheresDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedSinuMollweide\", ()=>(0, _sinuMollweideDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedSinusoidal\", ()=>(0, _sinusoidalDefault.default));\nparcelHelpers.export(exports, \"geoKavrayskiy7\", ()=>(0, _kavrayskiy7JsDefault.default));\nparcelHelpers.export(exports, \"geoKavrayskiy7Raw\", ()=>(0, _kavrayskiy7Js.kavrayskiy7Raw));\nparcelHelpers.export(exports, \"geoLagrange\", ()=>(0, _lagrangeJsDefault.default));\nparcelHelpers.export(exports, \"geoLagrangeRaw\", ()=>(0, _lagrangeJs.lagrangeRaw));\nparcelHelpers.export(exports, \"geoLarrivee\", ()=>(0, _larriveeDefault.default));\nparcelHelpers.export(exports, \"geoLarriveeRaw\", ()=>(0, _larrivee.larriveeRaw));\nparcelHelpers.export(exports, \"geoLaskowski\", ()=>(0, _laskowskiDefault.default));\nparcelHelpers.export(exports, \"geoLaskowskiRaw\", ()=>(0, _laskowski.laskowskiRaw));\nparcelHelpers.export(exports, \"geoLittrow\", ()=>(0, _littrowJsDefault.default));\nparcelHelpers.export(exports, \"geoLittrowRaw\", ()=>(0, _littrowJs.littrowRaw));\nparcelHelpers.export(exports, \"geoLoximuthal\", ()=>(0, _loximuthalJsDefault.default));\nparcelHelpers.export(exports, \"geoLoximuthalRaw\", ()=>(0, _loximuthalJs.loximuthalRaw));\nparcelHelpers.export(exports, \"geoMiller\", ()=>(0, _millerDefault.default));\nparcelHelpers.export(exports, \"geoMillerRaw\", ()=>(0, _miller.millerRaw));\nparcelHelpers.export(exports, \"geoModifiedStereographic\", ()=>(0, _modifiedStereographicDefault.default));\nparcelHelpers.export(exports, \"geoModifiedStereographicRaw\", ()=>(0, _modifiedStereographic.modifiedStereographicRaw));\nparcelHelpers.export(exports, \"geoModifiedStereographicAlaska\", ()=>(0, _modifiedStereographic.modifiedStereographicAlaska));\nparcelHelpers.export(exports, \"geoModifiedStereographicGs48\", ()=>(0, _modifiedStereographic.modifiedStereographicGs48));\nparcelHelpers.export(exports, \"geoModifiedStereographicGs50\", ()=>(0, _modifiedStereographic.modifiedStereographicGs50));\nparcelHelpers.export(exports, \"geoModifiedStereographicMiller\", ()=>(0, _modifiedStereographic.modifiedStereographicMiller));\nparcelHelpers.export(exports, \"geoModifiedStereographicLee\", ()=>(0, _modifiedStereographic.modifiedStereographicLee));\nparcelHelpers.export(exports, \"geoMollweide\", ()=>(0, _mollweideDefault1.default));\nparcelHelpers.export(exports, \"geoMollweideRaw\", ()=>(0, _mollweide1.mollweideRaw));\nparcelHelpers.export(exports, \"geoMtFlatPolarParabolic\", ()=>(0, _mtFlatPolarParabolicDefault.default));\nparcelHelpers.export(exports, \"geoMtFlatPolarParabolicRaw\", ()=>(0, _mtFlatPolarParabolic.mtFlatPolarParabolicRaw));\nparcelHelpers.export(exports, \"geoMtFlatPolarQuartic\", ()=>(0, _mtFlatPolarQuarticDefault.default));\nparcelHelpers.export(exports, \"geoMtFlatPolarQuarticRaw\", ()=>(0, _mtFlatPolarQuartic.mtFlatPolarQuarticRaw));\nparcelHelpers.export(exports, \"geoMtFlatPolarSinusoidal\", ()=>(0, _mtFlatPolarSinusoidalDefault.default));\nparcelHelpers.export(exports, \"geoMtFlatPolarSinusoidalRaw\", ()=>(0, _mtFlatPolarSinusoidal.mtFlatPolarSinusoidalRaw));\nparcelHelpers.export(exports, \"geoNaturalEarth2\", ()=>(0, _naturalEarth2Default.default));\nparcelHelpers.export(exports, \"geoNaturalEarth2Raw\", ()=>(0, _naturalEarth2.naturalEarth2Raw));\nparcelHelpers.export(exports, \"geoNellHammer\", ()=>(0, _nellHammerDefault.default));\nparcelHelpers.export(exports, \"geoNellHammerRaw\", ()=>(0, _nellHammer.nellHammerRaw));\nparcelHelpers.export(exports, \"geoInterruptedQuarticAuthalic\", ()=>(0, _quarticAuthalicDefault.default));\nparcelHelpers.export(exports, \"geoNicolosi\", ()=>(0, _nicolosiDefault.default));\nparcelHelpers.export(exports, \"geoNicolosiRaw\", ()=>(0, _nicolosi.nicolosiRaw));\nparcelHelpers.export(exports, \"geoPatterson\", ()=>(0, _pattersonDefault.default));\nparcelHelpers.export(exports, \"geoPattersonRaw\", ()=>(0, _patterson.pattersonRaw));\nparcelHelpers.export(exports, \"geoPolyconic\", ()=>(0, _polyconicDefault.default));\nparcelHelpers.export(exports, \"geoPolyconicRaw\", ()=>(0, _polyconic.polyconicRaw));\nparcelHelpers.export(exports, \"geoPolyhedral\", ()=>(0, _indexJsDefault.default));\nparcelHelpers.export(exports, \"geoPolyhedralButterfly\", ()=>(0, _butterflyJsDefault.default));\nparcelHelpers.export(exports, \"geoPolyhedralCollignon\", ()=>(0, _collignonJsDefault.default));\nparcelHelpers.export(exports, \"geoPolyhedralWaterman\", ()=>(0, _watermanJsDefault.default));\nparcelHelpers.export(exports, \"geoProject\", ()=>(0, _indexDefault1.default));\nparcelHelpers.export(exports, \"geoGringortenQuincuncial\", ()=>(0, _gringortenJsDefault1.default));\nparcelHelpers.export(exports, \"geoPeirceQuincuncial\", ()=>(0, _peirceJsDefault.default));\nparcelHelpers.export(exports, \"geoQuantize\", ()=>(0, _quantizeDefault.default));\nparcelHelpers.export(exports, \"geoQuincuncial\", ()=>(0, _indexJsDefault1.default));\nparcelHelpers.export(exports, \"geoRectangularPolyconic\", ()=>(0, _rectangularPolyconicDefault.default));\nparcelHelpers.export(exports, \"geoRectangularPolyconicRaw\", ()=>(0, _rectangularPolyconic.rectangularPolyconicRaw));\nparcelHelpers.export(exports, \"geoRobinson\", ()=>(0, _robinsonDefault.default));\nparcelHelpers.export(exports, \"geoRobinsonRaw\", ()=>(0, _robinson.robinsonRaw));\nparcelHelpers.export(exports, \"geoSatellite\", ()=>(0, _satelliteDefault.default));\nparcelHelpers.export(exports, \"geoSatelliteRaw\", ()=>(0, _satellite.satelliteRaw));\nparcelHelpers.export(exports, \"geoSinuMollweide\", ()=>(0, _sinuMollweideDefault1.default));\nparcelHelpers.export(exports, \"geoSinuMollweideRaw\", ()=>(0, _sinuMollweide1.sinuMollweideRaw));\nparcelHelpers.export(exports, \"geoSinusoidal\", ()=>(0, _sinusoidalDefault1.default));\nparcelHelpers.export(exports, \"geoSinusoidalRaw\", ()=>(0, _sinusoidal1.sinusoidalRaw));\nparcelHelpers.export(exports, \"geoStitch\", ()=>(0, _stitchDefault.default));\nparcelHelpers.export(exports, \"geoTimes\", ()=>(0, _timesDefault.default));\nparcelHelpers.export(exports, \"geoTimesRaw\", ()=>(0, _times.timesRaw));\nparcelHelpers.export(exports, \"geoTwoPointAzimuthal\", ()=>(0, _twoPointAzimuthalDefault.default));\nparcelHelpers.export(exports, \"geoTwoPointAzimuthalRaw\", ()=>(0, _twoPointAzimuthal.twoPointAzimuthalRaw));\nparcelHelpers.export(exports, \"geoTwoPointAzimuthalUsa\", ()=>(0, _twoPointAzimuthal.twoPointAzimuthalUsa));\nparcelHelpers.export(exports, \"geoTwoPointEquidistant\", ()=>(0, _twoPointEquidistantDefault.default));\nparcelHelpers.export(exports, \"geoTwoPointEquidistantRaw\", ()=>(0, _twoPointEquidistant.twoPointEquidistantRaw));\nparcelHelpers.export(exports, \"geoTwoPointEquidistantUsa\", ()=>(0, _twoPointEquidistant.twoPointEquidistantUsa));\nparcelHelpers.export(exports, \"geoVanDerGrinten\", ()=>(0, _vanDerGrintenDefault.default));\nparcelHelpers.export(exports, \"geoVanDerGrintenRaw\", ()=>(0, _vanDerGrinten.vanDerGrintenRaw));\nparcelHelpers.export(exports, \"geoVanDerGrinten2\", ()=>(0, _vanDerGrinten2Default.default));\nparcelHelpers.export(exports, \"geoVanDerGrinten2Raw\", ()=>(0, _vanDerGrinten2.vanDerGrinten2Raw));\nparcelHelpers.export(exports, \"geoVanDerGrinten3\", ()=>(0, _vanDerGrinten3Default.default));\nparcelHelpers.export(exports, \"geoVanDerGrinten3Raw\", ()=>(0, _vanDerGrinten3.vanDerGrinten3Raw));\nparcelHelpers.export(exports, \"geoVanDerGrinten4\", ()=>(0, _vanDerGrinten4Default.default));\nparcelHelpers.export(exports, \"geoVanDerGrinten4Raw\", ()=>(0, _vanDerGrinten4.vanDerGrinten4Raw));\nparcelHelpers.export(exports, \"geoWagner\", ()=>(0, _wagnerJsDefault.default));\nparcelHelpers.export(exports, \"geoWagner7\", ()=>(0, _wagnerJs.wagner7));\nparcelHelpers.export(exports, \"geoWagnerRaw\", ()=>(0, _wagnerJs.wagnerRaw));\nparcelHelpers.export(exports, \"geoWagner4\", ()=>(0, _wagner4JsDefault.default));\nparcelHelpers.export(exports, \"geoWagner4Raw\", ()=>(0, _wagner4Js.wagner4Raw));\nparcelHelpers.export(exports, \"geoWagner6\", ()=>(0, _wagner6JsDefault.default));\nparcelHelpers.export(exports, \"geoWagner6Raw\", ()=>(0, _wagner6Js.wagner6Raw));\nparcelHelpers.export(exports, \"geoWiechel\", ()=>(0, _wiechelJsDefault.default));\nparcelHelpers.export(exports, \"geoWiechelRaw\", ()=>(0, _wiechelJs.wiechelRaw));\nparcelHelpers.export(exports, \"geoWinkel3\", ()=>(0, _winkel3Default.default));\nparcelHelpers.export(exports, \"geoWinkel3Raw\", ()=>(0, _winkel3.winkel3Raw));\nvar _airy = require(\"./airy\");\nvar _airyDefault = parcelHelpers.interopDefault(_airy);\nvar _aitoff = require(\"./aitoff\");\nvar _aitoffDefault = parcelHelpers.interopDefault(_aitoff);\nvar _armadillo = require(\"./armadillo\");\nvar _armadilloDefault = parcelHelpers.interopDefault(_armadillo);\nvar _august = require(\"./august\");\nvar _augustDefault = parcelHelpers.interopDefault(_august);\nvar _baker = require(\"./baker\");\nvar _bakerDefault = parcelHelpers.interopDefault(_baker);\nvar _berghaus = require(\"./berghaus\");\nvar _berghausDefault = parcelHelpers.interopDefault(_berghaus);\nvar _bertin = require(\"./bertin\");\nvar _bertinDefault = parcelHelpers.interopDefault(_bertin);\nvar _boggs = require(\"./boggs\");\nvar _boggsDefault = parcelHelpers.interopDefault(_boggs);\nvar _bonne = require(\"./bonne\");\nvar _bonneDefault = parcelHelpers.interopDefault(_bonne);\nvar _bottomley = require(\"./bottomley\");\nvar _bottomleyDefault = parcelHelpers.interopDefault(_bottomley);\nvar _bromley = require(\"./bromley\");\nvar _bromleyDefault = parcelHelpers.interopDefault(_bromley);\nvar _chamberlin = require(\"./chamberlin\");\nvar _chamberlinDefault = parcelHelpers.interopDefault(_chamberlin);\nvar _collignon = require(\"./collignon\");\nvar _collignonDefault = parcelHelpers.interopDefault(_collignon);\nvar _craig = require(\"./craig\");\nvar _craigDefault = parcelHelpers.interopDefault(_craig);\nvar _craster = require(\"./craster\");\nvar _crasterDefault = parcelHelpers.interopDefault(_craster);\nvar _cylindricalEqualArea = require(\"./cylindricalEqualArea\");\nvar _cylindricalEqualAreaDefault = parcelHelpers.interopDefault(_cylindricalEqualArea);\nvar _cylindricalStereographic = require(\"./cylindricalStereographic\");\nvar _cylindricalStereographicDefault = parcelHelpers.interopDefault(_cylindricalStereographic);\nvar _eckert1Js = require(\"./eckert1.js\");\nvar _eckert1JsDefault = parcelHelpers.interopDefault(_eckert1Js);\nvar _eckert2Js = require(\"./eckert2.js\");\nvar _eckert2JsDefault = parcelHelpers.interopDefault(_eckert2Js);\nvar _eckert3Js = require(\"./eckert3.js\");\nvar _eckert3JsDefault = parcelHelpers.interopDefault(_eckert3Js);\nvar _eckert4Js = require(\"./eckert4.js\");\nvar _eckert4JsDefault = parcelHelpers.interopDefault(_eckert4Js);\nvar _eckert5Js = require(\"./eckert5.js\");\nvar _eckert5JsDefault = parcelHelpers.interopDefault(_eckert5Js);\nvar _eckert6Js = require(\"./eckert6.js\");\nvar _eckert6JsDefault = parcelHelpers.interopDefault(_eckert6Js);\nvar _eisenlohrJs = require(\"./eisenlohr.js\");\nvar _eisenlohrJsDefault = parcelHelpers.interopDefault(_eisenlohrJs);\nvar _faheyJs = require(\"./fahey.js\");\nvar _faheyJsDefault = parcelHelpers.interopDefault(_faheyJs);\nvar _foucautJs = require(\"./foucaut.js\");\nvar _foucautJsDefault = parcelHelpers.interopDefault(_foucautJs);\nvar _foucautSinusoidalJs = require(\"./foucautSinusoidal.js\");\nvar _foucautSinusoidalJsDefault = parcelHelpers.interopDefault(_foucautSinusoidalJs);\nvar _gilbertJs = require(\"./gilbert.js\");\nvar _gilbertJsDefault = parcelHelpers.interopDefault(_gilbertJs);\nvar _gingeryJs = require(\"./gingery.js\");\nvar _gingeryJsDefault = parcelHelpers.interopDefault(_gingeryJs);\nvar _ginzburg4Js = require(\"./ginzburg4.js\");\nvar _ginzburg4JsDefault = parcelHelpers.interopDefault(_ginzburg4Js);\nvar _ginzburg5Js = require(\"./ginzburg5.js\");\nvar _ginzburg5JsDefault = parcelHelpers.interopDefault(_ginzburg5Js);\nvar _ginzburg6Js = require(\"./ginzburg6.js\");\nvar _ginzburg6JsDefault = parcelHelpers.interopDefault(_ginzburg6Js);\nvar _ginzburg8Js = require(\"./ginzburg8.js\");\nvar _ginzburg8JsDefault = parcelHelpers.interopDefault(_ginzburg8Js);\nvar _ginzburg9Js = require(\"./ginzburg9.js\");\nvar _ginzburg9JsDefault = parcelHelpers.interopDefault(_ginzburg9Js);\nvar _gringortenJs = require(\"./gringorten.js\");\nvar _gringortenJsDefault = parcelHelpers.interopDefault(_gringortenJs);\nvar _guyouJs = require(\"./guyou.js\");\nvar _guyouJsDefault = parcelHelpers.interopDefault(_guyouJs);\nvar _hammerJs = require(\"./hammer.js\");\nvar _hammerJsDefault = parcelHelpers.interopDefault(_hammerJs);\nvar _hammerRetroazimuthalJs = require(\"./hammerRetroazimuthal.js\");\nvar _hammerRetroazimuthalJsDefault = parcelHelpers.interopDefault(_hammerRetroazimuthalJs);\nvar _healpixJs = require(\"./healpix.js\");\nvar _healpixJsDefault = parcelHelpers.interopDefault(_healpixJs);\nvar _hillJs = require(\"./hill.js\");\nvar _hillJsDefault = parcelHelpers.interopDefault(_hillJs);\nvar _homolosineJs = require(\"./homolosine.js\");\nvar _homolosineJsDefault = parcelHelpers.interopDefault(_homolosineJs);\nvar _hufnagelJs = require(\"./hufnagel.js\");\nvar _hufnagelJsDefault = parcelHelpers.interopDefault(_hufnagelJs);\nvar _hyperelliptical = require(\"./hyperelliptical\");\nvar _hyperellipticalDefault = parcelHelpers.interopDefault(_hyperelliptical);\nvar _index = require(\"./interrupted/index\");\nvar _indexDefault = parcelHelpers.interopDefault(_index);\nvar _boggs1 = require(\"./interrupted/boggs\");\nvar _boggsDefault1 = parcelHelpers.interopDefault(_boggs1);\nvar _homolosine = require(\"./interrupted/homolosine\");\nvar _homolosineDefault = parcelHelpers.interopDefault(_homolosine);\nvar _mollweide = require(\"./interrupted/mollweide\");\nvar _mollweideDefault = parcelHelpers.interopDefault(_mollweide);\nvar _mollweideHemispheres = require(\"./interrupted/mollweideHemispheres\");\nvar _mollweideHemispheresDefault = parcelHelpers.interopDefault(_mollweideHemispheres);\nvar _sinuMollweide = require(\"./interrupted/sinuMollweide\");\nvar _sinuMollweideDefault = parcelHelpers.interopDefault(_sinuMollweide);\nvar _sinusoidal = require(\"./interrupted/sinusoidal\");\nvar _sinusoidalDefault = parcelHelpers.interopDefault(_sinusoidal);\nvar _kavrayskiy7Js = require(\"./kavrayskiy7.js\");\nvar _kavrayskiy7JsDefault = parcelHelpers.interopDefault(_kavrayskiy7Js);\nvar _lagrangeJs = require(\"./lagrange.js\");\nvar _lagrangeJsDefault = parcelHelpers.interopDefault(_lagrangeJs);\nvar _larrivee = require(\"./larrivee\");\nvar _larriveeDefault = parcelHelpers.interopDefault(_larrivee);\nvar _laskowski = require(\"./laskowski\");\nvar _laskowskiDefault = parcelHelpers.interopDefault(_laskowski);\nvar _littrowJs = require(\"./littrow.js\");\nvar _littrowJsDefault = parcelHelpers.interopDefault(_littrowJs);\nvar _loximuthalJs = require(\"./loximuthal.js\");\nvar _loximuthalJsDefault = parcelHelpers.interopDefault(_loximuthalJs);\nvar _miller = require(\"./miller\");\nvar _millerDefault = parcelHelpers.interopDefault(_miller);\nvar _modifiedStereographic = require(\"./modifiedStereographic\");\nvar _modifiedStereographicDefault = parcelHelpers.interopDefault(_modifiedStereographic);\nvar _mollweide1 = require(\"./mollweide\");\nvar _mollweideDefault1 = parcelHelpers.interopDefault(_mollweide1);\nvar _mtFlatPolarParabolic = require(\"./mtFlatPolarParabolic\");\nvar _mtFlatPolarParabolicDefault = parcelHelpers.interopDefault(_mtFlatPolarParabolic);\nvar _mtFlatPolarQuartic = require(\"./mtFlatPolarQuartic\");\nvar _mtFlatPolarQuarticDefault = parcelHelpers.interopDefault(_mtFlatPolarQuartic);\nvar _mtFlatPolarSinusoidal = require(\"./mtFlatPolarSinusoidal\");\nvar _mtFlatPolarSinusoidalDefault = parcelHelpers.interopDefault(_mtFlatPolarSinusoidal);\nvar _naturalEarth2 = require(\"./naturalEarth2\");\nvar _naturalEarth2Default = parcelHelpers.interopDefault(_naturalEarth2);\nvar _nellHammer = require(\"./nellHammer\");\nvar _nellHammerDefault = parcelHelpers.interopDefault(_nellHammer);\nvar _quarticAuthalic = require(\"./interrupted/quarticAuthalic\");\nvar _quarticAuthalicDefault = parcelHelpers.interopDefault(_quarticAuthalic);\nvar _nicolosi = require(\"./nicolosi\");\nvar _nicolosiDefault = parcelHelpers.interopDefault(_nicolosi);\nvar _patterson = require(\"./patterson\");\nvar _pattersonDefault = parcelHelpers.interopDefault(_patterson);\nvar _polyconic = require(\"./polyconic\");\nvar _polyconicDefault = parcelHelpers.interopDefault(_polyconic);\nvar _indexJs = require(\"./polyhedral/index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _butterflyJs = require(\"./polyhedral/butterfly.js\");\nvar _butterflyJsDefault = parcelHelpers.interopDefault(_butterflyJs);\nvar _collignonJs = require(\"./polyhedral/collignon.js\");\nvar _collignonJsDefault = parcelHelpers.interopDefault(_collignonJs);\nvar _watermanJs = require(\"./polyhedral/waterman.js\");\nvar _watermanJsDefault = parcelHelpers.interopDefault(_watermanJs);\nvar _index1 = require(\"./project/index\");\nvar _indexDefault1 = parcelHelpers.interopDefault(_index1);\nvar _gringortenJs1 = require(\"./quincuncial/gringorten.js\");\nvar _gringortenJsDefault1 = parcelHelpers.interopDefault(_gringortenJs1);\nvar _peirceJs = require(\"./quincuncial/peirce.js\");\nvar _peirceJsDefault = parcelHelpers.interopDefault(_peirceJs);\nvar _quantize = require(\"./quantize\");\nvar _quantizeDefault = parcelHelpers.interopDefault(_quantize);\nvar _indexJs1 = require(\"./quincuncial/index.js\");\nvar _indexJsDefault1 = parcelHelpers.interopDefault(_indexJs1);\nvar _rectangularPolyconic = require(\"./rectangularPolyconic\");\nvar _rectangularPolyconicDefault = parcelHelpers.interopDefault(_rectangularPolyconic);\nvar _robinson = require(\"./robinson\");\nvar _robinsonDefault = parcelHelpers.interopDefault(_robinson);\nvar _satellite = require(\"./satellite\");\nvar _satelliteDefault = parcelHelpers.interopDefault(_satellite);\nvar _sinuMollweide1 = require(\"./sinuMollweide\");\nvar _sinuMollweideDefault1 = parcelHelpers.interopDefault(_sinuMollweide1);\nvar _sinusoidal1 = require(\"./sinusoidal\");\nvar _sinusoidalDefault1 = parcelHelpers.interopDefault(_sinusoidal1);\nvar _stitch = require(\"./stitch\");\nvar _stitchDefault = parcelHelpers.interopDefault(_stitch);\nvar _times = require(\"./times\");\nvar _timesDefault = parcelHelpers.interopDefault(_times);\nvar _twoPointAzimuthal = require(\"./twoPointAzimuthal\");\nvar _twoPointAzimuthalDefault = parcelHelpers.interopDefault(_twoPointAzimuthal);\nvar _twoPointEquidistant = require(\"./twoPointEquidistant\");\nvar _twoPointEquidistantDefault = parcelHelpers.interopDefault(_twoPointEquidistant);\nvar _vanDerGrinten = require(\"./vanDerGrinten\");\nvar _vanDerGrintenDefault = parcelHelpers.interopDefault(_vanDerGrinten);\nvar _vanDerGrinten2 = require(\"./vanDerGrinten2\");\nvar _vanDerGrinten2Default = parcelHelpers.interopDefault(_vanDerGrinten2);\nvar _vanDerGrinten3 = require(\"./vanDerGrinten3\");\nvar _vanDerGrinten3Default = parcelHelpers.interopDefault(_vanDerGrinten3);\nvar _vanDerGrinten4 = require(\"./vanDerGrinten4\");\nvar _vanDerGrinten4Default = parcelHelpers.interopDefault(_vanDerGrinten4);\nvar _wagnerJs = require(\"./wagner.js\");\nvar _wagnerJsDefault = parcelHelpers.interopDefault(_wagnerJs);\nvar _wagner4Js = require(\"./wagner4.js\");\nvar _wagner4JsDefault = parcelHelpers.interopDefault(_wagner4Js);\nvar _wagner6Js = require(\"./wagner6.js\");\nvar _wagner6JsDefault = parcelHelpers.interopDefault(_wagner6Js);\nvar _wiechelJs = require(\"./wiechel.js\");\nvar _wiechelJsDefault = parcelHelpers.interopDefault(_wiechelJs);\nvar _winkel3 = require(\"./winkel3\");\nvar _winkel3Default = parcelHelpers.interopDefault(_winkel3);\n\n},{\"./airy\":false,\"./aitoff\":false,\"./armadillo\":false,\"./august\":false,\"./baker\":false,\"./berghaus\":false,\"./bertin\":false,\"./boggs\":false,\"./bonne\":false,\"./bottomley\":false,\"./bromley\":false,\"./chamberlin\":false,\"./collignon\":false,\"./craig\":false,\"./craster\":false,\"./cylindricalEqualArea\":false,\"./cylindricalStereographic\":false,\"./eckert1.js\":false,\"./eckert2.js\":false,\"./eckert3.js\":false,\"./eckert4.js\":false,\"./eckert5.js\":false,\"./eckert6.js\":false,\"./eisenlohr.js\":false,\"./fahey.js\":false,\"./foucaut.js\":false,\"./foucautSinusoidal.js\":false,\"./gilbert.js\":false,\"./gingery.js\":false,\"./ginzburg4.js\":false,\"./ginzburg5.js\":false,\"./ginzburg6.js\":false,\"./ginzburg8.js\":false,\"./ginzburg9.js\":false,\"./gringorten.js\":false,\"./guyou.js\":false,\"./hammer.js\":false,\"./hammerRetroazimuthal.js\":false,\"./healpix.js\":false,\"./hill.js\":false,\"./homolosine.js\":false,\"./hufnagel.js\":false,\"./hyperelliptical\":false,\"./interrupted/index\":false,\"./interrupted/boggs\":false,\"./interrupted/homolosine\":false,\"./interrupted/mollweide\":false,\"./interrupted/mollweideHemispheres\":false,\"./interrupted/sinuMollweide\":false,\"./interrupted/sinusoidal\":false,\"./kavrayskiy7.js\":false,\"./lagrange.js\":false,\"./larrivee\":false,\"./laskowski\":false,\"./littrow.js\":false,\"./loximuthal.js\":false,\"./miller\":false,\"./modifiedStereographic\":false,\"./mollweide\":\"IWcRL\",\"./mtFlatPolarParabolic\":false,\"./mtFlatPolarQuartic\":false,\"./mtFlatPolarSinusoidal\":false,\"./naturalEarth2\":false,\"./nellHammer\":false,\"./interrupted/quarticAuthalic\":false,\"./nicolosi\":false,\"./patterson\":false,\"./polyconic\":false,\"./polyhedral/index.js\":false,\"./polyhedral/butterfly.js\":false,\"./polyhedral/collignon.js\":false,\"./polyhedral/waterman.js\":false,\"./project/index\":false,\"./quincuncial/gringorten.js\":false,\"./quincuncial/peirce.js\":false,\"./quantize\":false,\"./quincuncial/index.js\":false,\"./rectangularPolyconic\":false,\"./robinson\":false,\"./satellite\":false,\"./sinuMollweide\":false,\"./sinusoidal\":false,\"./stitch\":false,\"./times\":false,\"./twoPointAzimuthal\":false,\"./twoPointEquidistant\":false,\"./vanDerGrinten\":false,\"./vanDerGrinten2\":false,\"./vanDerGrinten3\":false,\"./vanDerGrinten4\":false,\"./wagner.js\":false,\"./wagner4.js\":false,\"./wagner6.js\":false,\"./wiechel.js\":false,\"./winkel3\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"IWcRL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mollweideBromleyTheta\", ()=>mollweideBromleyTheta);\nparcelHelpers.export(exports, \"mollweideBromleyRaw\", ()=>mollweideBromleyRaw);\nparcelHelpers.export(exports, \"mollweideRaw\", ()=>mollweideRaw);\nvar _d3Geo = require(\"d3-geo\");\nvar _mathJs = require(\"./math.js\");\nfunction mollweideBromleyTheta(cp, phi) {\n    var cpsinPhi = cp * (0, _mathJs.sin)(phi), i = 30, delta;\n    do phi -= delta = (phi + (0, _mathJs.sin)(phi) - cpsinPhi) / (1 + (0, _mathJs.cos)(phi));\n    while ((0, _mathJs.abs)(delta) > (0, _mathJs.epsilon) && --i > 0);\n    return phi / 2;\n}\nfunction mollweideBromleyRaw(cx, cy, cp) {\n    function forward(lambda, phi) {\n        return [\n            cx * lambda * (0, _mathJs.cos)(phi = mollweideBromleyTheta(cp, phi)),\n            cy * (0, _mathJs.sin)(phi)\n        ];\n    }\n    forward.invert = function(x, y) {\n        return y = (0, _mathJs.asin)(y / cy), [\n            x / (cx * (0, _mathJs.cos)(y)),\n            (0, _mathJs.asin)((2 * y + (0, _mathJs.sin)(2 * y)) / cp)\n        ];\n    };\n    return forward;\n}\nvar mollweideRaw = mollweideBromleyRaw((0, _mathJs.sqrt2) / (0, _mathJs.halfPi), (0, _mathJs.sqrt2), (0, _mathJs.pi));\nexports.default = function() {\n    return (0, _d3Geo.geoProjection)(mollweideRaw).scale(169.529);\n};\n\n},{\"d3-geo\":\"1UFrq\",\"./math.js\":\"5mXJl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5mXJl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"abs\", ()=>abs);\nparcelHelpers.export(exports, \"atan\", ()=>atan);\nparcelHelpers.export(exports, \"atan2\", ()=>atan2);\nparcelHelpers.export(exports, \"ceil\", ()=>ceil);\nparcelHelpers.export(exports, \"cos\", ()=>cos);\nparcelHelpers.export(exports, \"exp\", ()=>exp);\nparcelHelpers.export(exports, \"floor\", ()=>floor);\nparcelHelpers.export(exports, \"log\", ()=>log);\nparcelHelpers.export(exports, \"max\", ()=>max);\nparcelHelpers.export(exports, \"min\", ()=>min);\nparcelHelpers.export(exports, \"pow\", ()=>pow);\nparcelHelpers.export(exports, \"round\", ()=>round);\nparcelHelpers.export(exports, \"sign\", ()=>sign);\nparcelHelpers.export(exports, \"sin\", ()=>sin);\nparcelHelpers.export(exports, \"tan\", ()=>tan);\nparcelHelpers.export(exports, \"epsilon\", ()=>epsilon);\nparcelHelpers.export(exports, \"epsilon2\", ()=>epsilon2);\nparcelHelpers.export(exports, \"pi\", ()=>pi);\nparcelHelpers.export(exports, \"halfPi\", ()=>halfPi);\nparcelHelpers.export(exports, \"quarterPi\", ()=>quarterPi);\nparcelHelpers.export(exports, \"sqrt1_2\", ()=>sqrt1_2);\nparcelHelpers.export(exports, \"sqrt2\", ()=>sqrt2);\nparcelHelpers.export(exports, \"sqrtPi\", ()=>sqrtPi);\nparcelHelpers.export(exports, \"tau\", ()=>tau);\nparcelHelpers.export(exports, \"degrees\", ()=>degrees);\nparcelHelpers.export(exports, \"radians\", ()=>radians);\nparcelHelpers.export(exports, \"sinci\", ()=>sinci);\nparcelHelpers.export(exports, \"asin\", ()=>asin);\nparcelHelpers.export(exports, \"acos\", ()=>acos);\nparcelHelpers.export(exports, \"sqrt\", ()=>sqrt);\nparcelHelpers.export(exports, \"tanh\", ()=>tanh);\nparcelHelpers.export(exports, \"sinh\", ()=>sinh);\nparcelHelpers.export(exports, \"cosh\", ()=>cosh);\nparcelHelpers.export(exports, \"arsinh\", ()=>arsinh);\nparcelHelpers.export(exports, \"arcosh\", ()=>arcosh);\nvar abs = Math.abs;\nvar atan = Math.atan;\nvar atan2 = Math.atan2;\nvar ceil = Math.ceil;\nvar cos = Math.cos;\nvar exp = Math.exp;\nvar floor = Math.floor;\nvar log = Math.log;\nvar max = Math.max;\nvar min = Math.min;\nvar pow = Math.pow;\nvar round = Math.round;\nvar sign = Math.sign || function(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n};\nvar sin = Math.sin;\nvar tan = Math.tan;\nvar epsilon = 1e-6;\nvar epsilon2 = 1e-12;\nvar pi = Math.PI;\nvar halfPi = pi / 2;\nvar quarterPi = pi / 4;\nvar sqrt1_2 = Math.SQRT1_2;\nvar sqrt2 = sqrt(2);\nvar sqrtPi = sqrt(pi);\nvar tau = pi * 2;\nvar degrees = 180 / pi;\nvar radians = pi / 180;\nfunction sinci(x) {\n    return x ? x / Math.sin(x) : 1;\n}\nfunction asin(x) {\n    return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\nfunction acos(x) {\n    return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\nfunction sqrt(x) {\n    return x > 0 ? Math.sqrt(x) : 0;\n}\nfunction tanh(x) {\n    x = exp(2 * x);\n    return (x - 1) / (x + 1);\n}\nfunction sinh(x) {\n    return (exp(x) - exp(-x)) / 2;\n}\nfunction cosh(x) {\n    return (exp(x) + exp(-x)) / 2;\n}\nfunction arsinh(x) {\n    return log(x + sqrt(x * x + 1));\n}\nfunction arcosh(x) {\n    return log(x + sqrt(x * x - 1));\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gbywE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"force\", ()=>Force);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Force = require(\"d3-force\");\nconst ForceMap = {\n    center: (0, _d3Force.forceCenter),\n    collide: (0, _d3Force.forceCollide),\n    nbody: (0, _d3Force.forceManyBody),\n    link: (0, _d3Force.forceLink),\n    x: (0, _d3Force.forceX),\n    y: (0, _d3Force.forceY)\n};\nconst Forces = \"forces\", ForceParams = [\n    \"alpha\",\n    \"alphaMin\",\n    \"alphaTarget\",\n    \"velocityDecay\",\n    \"forces\"\n], ForceConfig = [\n    \"static\",\n    \"iterations\"\n], ForceOutput = [\n    \"x\",\n    \"y\",\n    \"vx\",\n    \"vy\"\n];\n/**\n * Force simulation layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<object>} params.forces - The forces to apply.\n */ function Force(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nForce.Definition = {\n    \"type\": \"Force\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"static\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"restart\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"iterations\",\n            \"type\": \"number\",\n            \"default\": 300\n        },\n        {\n            \"name\": \"alpha\",\n            \"type\": \"number\",\n            \"default\": 1\n        },\n        {\n            \"name\": \"alphaMin\",\n            \"type\": \"number\",\n            \"default\": 0.001\n        },\n        {\n            \"name\": \"alphaTarget\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"velocityDecay\",\n            \"type\": \"number\",\n            \"default\": 0.4\n        },\n        {\n            \"name\": \"forces\",\n            \"type\": \"param\",\n            \"array\": true,\n            \"params\": [\n                {\n                    \"key\": {\n                        \"force\": \"center\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"x\",\n                            \"type\": \"number\",\n                            \"default\": 0\n                        },\n                        {\n                            \"name\": \"y\",\n                            \"type\": \"number\",\n                            \"default\": 0\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"collide\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"radius\",\n                            \"type\": \"number\",\n                            \"expr\": true\n                        },\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"default\": 0.7\n                        },\n                        {\n                            \"name\": \"iterations\",\n                            \"type\": \"number\",\n                            \"default\": 1\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"nbody\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"default\": -30\n                        },\n                        {\n                            \"name\": \"theta\",\n                            \"type\": \"number\",\n                            \"default\": 0.9\n                        },\n                        {\n                            \"name\": \"distanceMin\",\n                            \"type\": \"number\",\n                            \"default\": 1\n                        },\n                        {\n                            \"name\": \"distanceMax\",\n                            \"type\": \"number\"\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"link\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"links\",\n                            \"type\": \"data\"\n                        },\n                        {\n                            \"name\": \"id\",\n                            \"type\": \"field\"\n                        },\n                        {\n                            \"name\": \"distance\",\n                            \"type\": \"number\",\n                            \"default\": 30,\n                            \"expr\": true\n                        },\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"expr\": true\n                        },\n                        {\n                            \"name\": \"iterations\",\n                            \"type\": \"number\",\n                            \"default\": 1\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"x\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"default\": 0.1\n                        },\n                        {\n                            \"name\": \"x\",\n                            \"type\": \"field\"\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"y\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"default\": 0.1\n                        },\n                        {\n                            \"name\": \"y\",\n                            \"type\": \"field\"\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"modify\": false,\n            \"default\": ForceOutput\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Force, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var sim = this.value, change = pulse.changed(pulse.ADD_REM), params = _.modified(ForceParams), iters = _.iterations || 300; // configure simulation\n        if (!sim) {\n            this.value = sim = simulation(pulse.source, _);\n            sim.on(\"tick\", rerun(pulse.dataflow, this));\n            if (!_.static) {\n                change = true;\n                sim.tick(); // ensure we run on init\n            }\n            pulse.modifies(\"index\");\n        } else {\n            if (change) {\n                pulse.modifies(\"index\");\n                sim.nodes(pulse.source);\n            }\n            if (params || pulse.changed(pulse.MOD)) setup(sim, _, 0, pulse);\n        } // run simulation\n        if (params || change || _.modified(ForceConfig) || pulse.changed() && _.restart) {\n            sim.alpha(Math.max(sim.alpha(), _.alpha || 1)).alphaDecay(1 - Math.pow(sim.alphaMin(), 1 / iters));\n            if (_.static) for(sim.stop(); --iters >= 0;)sim.tick();\n            else {\n                if (sim.stopped()) sim.restart();\n                if (!change) return pulse.StopPropagation; // defer to sim ticks\n            }\n        }\n        return this.finish(_, pulse);\n    },\n    finish (_, pulse) {\n        const dataflow = pulse.dataflow; // inspect dependencies, touch link source data\n        for(let args = this._argops, j = 0, m = args.length, arg; j < m; ++j){\n            arg = args[j];\n            if (arg.name !== Forces || arg.op._argval.force !== \"link\") continue;\n            for(var ops = arg.op._argops, i = 0, n = ops.length, op; i < n; ++i)if (ops[i].name === \"links\" && (op = ops[i].op.source)) {\n                dataflow.pulse(op, dataflow.changeset().reflow());\n                break;\n            }\n        } // reflow all nodes\n        return pulse.reflow(_.modified()).modifies(ForceOutput);\n    }\n});\nfunction rerun(df, op) {\n    return ()=>df.touch(op).run();\n}\nfunction simulation(nodes, _) {\n    const sim = (0, _d3Force.forceSimulation)(nodes), stop = sim.stop, restart = sim.restart;\n    let stopped = false;\n    sim.stopped = ()=>stopped;\n    sim.restart = ()=>(stopped = false, restart());\n    sim.stop = ()=>(stopped = true, stop());\n    return setup(sim, _, true).on(\"end\", ()=>stopped = true);\n}\nfunction setup(sim, _, init, pulse) {\n    var f = (0, _vegaUtil.array)(_.forces), i, n, p, name;\n    for(i = 0, n = ForceParams.length; i < n; ++i){\n        p = ForceParams[i];\n        if (p !== Forces && _.modified(p)) sim[p](_[p]);\n    }\n    for(i = 0, n = f.length; i < n; ++i){\n        name = Forces + i;\n        p = init || _.modified(Forces, i) ? getForce(f[i]) : pulse && modified(f[i], pulse) ? sim.force(name) : null;\n        if (p) sim.force(name, p);\n    }\n    for(n = sim.numForces || 0; i < n; ++i)sim.force(Forces + i, null); // remove\n    sim.numForces = f.length;\n    return sim;\n}\nfunction modified(f, pulse) {\n    var k, v;\n    for(k in f){\n        if ((0, _vegaUtil.isFunction)(v = f[k]) && pulse.modified((0, _vegaUtil.accessorFields)(v))) return 1;\n    }\n    return 0;\n}\nfunction getForce(_) {\n    var f, p;\n    if (!(0, _vegaUtil.hasOwnProperty)(ForceMap, _.force)) (0, _vegaUtil.error)(\"Unrecognized force: \" + _.force);\n    f = ForceMap[_.force]();\n    for(p in _)if ((0, _vegaUtil.isFunction)(f[p])) setForceParam(f[p], _[p], _);\n    return f;\n}\nfunction setForceParam(f, v, _) {\n    f((0, _vegaUtil.isFunction)(v) ? (d)=>v(d, _) : v);\n}\n\n},{\"vega-dataflow\":\"4kvYg\",\"vega-util\":\"dPFAY\",\"d3-force\":\"krYJV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"krYJV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"forceCenter\", ()=>(0, _centerJsDefault.default));\nparcelHelpers.export(exports, \"forceCollide\", ()=>(0, _collideJsDefault.default));\nparcelHelpers.export(exports, \"forceLink\", ()=>(0, _linkJsDefault.default));\nparcelHelpers.export(exports, \"forceManyBody\", ()=>(0, _manyBodyJsDefault.default));\nparcelHelpers.export(exports, \"forceRadial\", ()=>(0, _radialJsDefault.default));\nparcelHelpers.export(exports, \"forceSimulation\", ()=>(0, _simulationJsDefault.default));\nparcelHelpers.export(exports, \"forceX\", ()=>(0, _xJsDefault.default));\nparcelHelpers.export(exports, \"forceY\", ()=>(0, _yJsDefault.default));\nvar _centerJs = require(\"./center.js\");\nvar _centerJsDefault = parcelHelpers.interopDefault(_centerJs);\nvar _collideJs = require(\"./collide.js\");\nvar _collideJsDefault = parcelHelpers.interopDefault(_collideJs);\nvar _linkJs = require(\"./link.js\");\nvar _linkJsDefault = parcelHelpers.interopDefault(_linkJs);\nvar _manyBodyJs = require(\"./manyBody.js\");\nvar _manyBodyJsDefault = parcelHelpers.interopDefault(_manyBodyJs);\nvar _radialJs = require(\"./radial.js\");\nvar _radialJsDefault = parcelHelpers.interopDefault(_radialJs);\nvar _simulationJs = require(\"./simulation.js\");\nvar _simulationJsDefault = parcelHelpers.interopDefault(_simulationJs);\nvar _xJs = require(\"./x.js\");\nvar _xJsDefault = parcelHelpers.interopDefault(_xJs);\nvar _yJs = require(\"./y.js\");\nvar _yJsDefault = parcelHelpers.interopDefault(_yJs);\n\n},{\"./center.js\":\"3Gt3R\",\"./collide.js\":\"5xuZt\",\"./link.js\":\"jGYgd\",\"./manyBody.js\":\"gzRJm\",\"./radial.js\":false,\"./simulation.js\":\"8V27m\",\"./x.js\":\"i7ZBj\",\"./y.js\":\"bC0Hi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Gt3R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x, y) {\n    var nodes, strength = 1;\n    if (x == null) x = 0;\n    if (y == null) y = 0;\n    function force() {\n        var i, n = nodes.length, node, sx = 0, sy = 0;\n        for(i = 0; i < n; ++i)node = nodes[i], sx += node.x, sy += node.y;\n        for(sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i)node = nodes[i], node.x -= sx, node.y -= sy;\n    }\n    force.initialize = function(_) {\n        nodes = _;\n    };\n    force.x = function(_) {\n        return arguments.length ? (x = +_, force) : x;\n    };\n    force.y = function(_) {\n        return arguments.length ? (y = +_, force) : y;\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = +_, force) : strength;\n    };\n    return force;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5xuZt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Quadtree = require(\"d3-quadtree\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _jiggleJs = require(\"./jiggle.js\");\nvar _jiggleJsDefault = parcelHelpers.interopDefault(_jiggleJs);\nfunction x(d) {\n    return d.x + d.vx;\n}\nfunction y(d) {\n    return d.y + d.vy;\n}\nexports.default = function(radius) {\n    var nodes, radii, random, strength = 1, iterations = 1;\n    if (typeof radius !== \"function\") radius = (0, _constantJsDefault.default)(radius == null ? 1 : +radius);\n    function force() {\n        var i, n = nodes.length, tree, node, xi, yi, ri, ri2;\n        for(var k = 0; k < iterations; ++k){\n            tree = (0, _d3Quadtree.quadtree)(nodes, x, y).visitAfter(prepare);\n            for(i = 0; i < n; ++i){\n                node = nodes[i];\n                ri = radii[node.index], ri2 = ri * ri;\n                xi = node.x + node.vx;\n                yi = node.y + node.vy;\n                tree.visit(apply);\n            }\n        }\n        function apply(quad, x0, y0, x1, y1) {\n            var data = quad.data, rj = quad.r, r = ri + rj;\n            if (data) {\n                if (data.index > node.index) {\n                    var x2 = xi - data.x - data.vx, y2 = yi - data.y - data.vy, l = x2 * x2 + y2 * y2;\n                    if (l < r * r) {\n                        if (x2 === 0) x2 = (0, _jiggleJsDefault.default)(random), l += x2 * x2;\n                        if (y2 === 0) y2 = (0, _jiggleJsDefault.default)(random), l += y2 * y2;\n                        l = (r - (l = Math.sqrt(l))) / l * strength;\n                        node.vx += (x2 *= l) * (r = (rj *= rj) / (ri2 + rj));\n                        node.vy += (y2 *= l) * r;\n                        data.vx -= x2 * (r = 1 - r);\n                        data.vy -= y2 * r;\n                    }\n                }\n                return;\n            }\n            return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;\n        }\n    }\n    function prepare(quad) {\n        if (quad.data) return quad.r = radii[quad.data.index];\n        for(var i = quad.r = 0; i < 4; ++i)if (quad[i] && quad[i].r > quad.r) quad.r = quad[i].r;\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i, n = nodes.length, node;\n        radii = new Array(n);\n        for(i = 0; i < n; ++i)node = nodes[i], radii[node.index] = +radius(node, i, nodes);\n    }\n    force.initialize = function(_nodes, _random) {\n        nodes = _nodes;\n        random = _random;\n        initialize();\n    };\n    force.iterations = function(_) {\n        return arguments.length ? (iterations = +_, force) : iterations;\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = +_, force) : strength;\n    };\n    force.radius = function(_) {\n        return arguments.length ? (radius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : radius;\n    };\n    return force;\n};\n\n},{\"d3-quadtree\":\"bLOuD\",\"./constant.js\":\"b2eZT\",\"./jiggle.js\":\"fV9Ia\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bLOuD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"quadtree\", ()=>(0, _quadtreeJsDefault.default));\nvar _quadtreeJs = require(\"./quadtree.js\");\nvar _quadtreeJsDefault = parcelHelpers.interopDefault(_quadtreeJs);\n\n},{\"./quadtree.js\":\"d9Dfj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d9Dfj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _addJs = require(\"./add.js\");\nvar _addJsDefault = parcelHelpers.interopDefault(_addJs);\nvar _coverJs = require(\"./cover.js\");\nvar _coverJsDefault = parcelHelpers.interopDefault(_coverJs);\nvar _dataJs = require(\"./data.js\");\nvar _dataJsDefault = parcelHelpers.interopDefault(_dataJs);\nvar _extentJs = require(\"./extent.js\");\nvar _extentJsDefault = parcelHelpers.interopDefault(_extentJs);\nvar _findJs = require(\"./find.js\");\nvar _findJsDefault = parcelHelpers.interopDefault(_findJs);\nvar _removeJs = require(\"./remove.js\");\nvar _removeJsDefault = parcelHelpers.interopDefault(_removeJs);\nvar _rootJs = require(\"./root.js\");\nvar _rootJsDefault = parcelHelpers.interopDefault(_rootJs);\nvar _sizeJs = require(\"./size.js\");\nvar _sizeJsDefault = parcelHelpers.interopDefault(_sizeJs);\nvar _visitJs = require(\"./visit.js\");\nvar _visitJsDefault = parcelHelpers.interopDefault(_visitJs);\nvar _visitAfterJs = require(\"./visitAfter.js\");\nvar _visitAfterJsDefault = parcelHelpers.interopDefault(_visitAfterJs);\nvar _xJs = require(\"./x.js\");\nvar _xJsDefault = parcelHelpers.interopDefault(_xJs);\nvar _yJs = require(\"./y.js\");\nvar _yJsDefault = parcelHelpers.interopDefault(_yJs);\nfunction quadtree(nodes, x, y) {\n    var tree = new Quadtree(x == null ? (0, _xJs.defaultX) : x, y == null ? (0, _yJs.defaultY) : y, NaN, NaN, NaN, NaN);\n    return nodes == null ? tree : tree.addAll(nodes);\n}\nexports.default = quadtree;\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n    this._x = x;\n    this._y = y;\n    this._x0 = x0;\n    this._y0 = y0;\n    this._x1 = x1;\n    this._y1 = y1;\n    this._root = undefined;\n}\nfunction leaf_copy(leaf) {\n    var copy = {\n        data: leaf.data\n    }, next = copy;\n    while(leaf = leaf.next)next = next.next = {\n        data: leaf.data\n    };\n    return copy;\n}\nvar treeProto = quadtree.prototype = Quadtree.prototype;\ntreeProto.copy = function() {\n    var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child;\n    if (!node) return copy;\n    if (!node.length) return copy._root = leaf_copy(node), copy;\n    nodes = [\n        {\n            source: node,\n            target: copy._root = new Array(4)\n        }\n    ];\n    while(node = nodes.pop()){\n        for(var i = 0; i < 4; ++i)if (child = node.source[i]) {\n            if (child.length) nodes.push({\n                source: child,\n                target: node.target[i] = new Array(4)\n            });\n            else node.target[i] = leaf_copy(child);\n        }\n    }\n    return copy;\n};\ntreeProto.add = (0, _addJsDefault.default);\ntreeProto.addAll = (0, _addJs.addAll);\ntreeProto.cover = (0, _coverJsDefault.default);\ntreeProto.data = (0, _dataJsDefault.default);\ntreeProto.extent = (0, _extentJsDefault.default);\ntreeProto.find = (0, _findJsDefault.default);\ntreeProto.remove = (0, _removeJsDefault.default);\ntreeProto.removeAll = (0, _removeJs.removeAll);\ntreeProto.root = (0, _rootJsDefault.default);\ntreeProto.size = (0, _sizeJsDefault.default);\ntreeProto.visit = (0, _visitJsDefault.default);\ntreeProto.visitAfter = (0, _visitAfterJsDefault.default);\ntreeProto.x = (0, _xJsDefault.default);\ntreeProto.y = (0, _yJsDefault.default);\n\n},{\"./add.js\":\"5vNtP\",\"./cover.js\":\"kI9oh\",\"./data.js\":\"8JXlW\",\"./extent.js\":\"5f3p3\",\"./find.js\":\"iGHz5\",\"./remove.js\":\"JL81h\",\"./root.js\":\"8puIZ\",\"./size.js\":\"7o2cy\",\"./visit.js\":\"3WHtz\",\"./visitAfter.js\":\"BlWjS\",\"./x.js\":\"bux1G\",\"./y.js\":\"1GmNG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5vNtP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addAll\", ()=>addAll);\nexports.default = function(d) {\n    const x = +this._x.call(null, d), y = +this._y.call(null, d);\n    return add(this.cover(x, y), x, y, d);\n};\nfunction add(tree, x, y, d) {\n    if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n    var parent, node = tree._root, leaf = {\n        data: d\n    }, x0 = tree._x0, y0 = tree._y0, x1 = tree._x1, y1 = tree._y1, xm, ym, xp, yp, right, bottom, i, j;\n    // If the tree is empty, initialize the root as a leaf.\n    if (!node) return tree._root = leaf, tree;\n    // Find the existing leaf for the new point, or add it.\n    while(node.length){\n        if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;\n        else x1 = xm;\n        if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;\n        else y1 = ym;\n        if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n    }\n    // Is the new point is exactly coincident with the existing point?\n    xp = +tree._x.call(null, node.data);\n    yp = +tree._y.call(null, node.data);\n    if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n    // Otherwise, split the leaf node until the old and new point are separated.\n    do {\n        parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n        if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;\n        else x1 = xm;\n        if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;\n        else y1 = ym;\n    }while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));\n    return parent[j] = node, parent[i] = leaf, tree;\n}\nfunction addAll(data) {\n    var d, i, n = data.length, x, y, xz = new Array(n), yz = new Array(n), x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n    // Compute the points and their extent.\n    for(i = 0; i < n; ++i){\n        if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n        xz[i] = x;\n        yz[i] = y;\n        if (x < x0) x0 = x;\n        if (x > x1) x1 = x;\n        if (y < y0) y0 = y;\n        if (y > y1) y1 = y;\n    }\n    // If there were no (valid) points, abort.\n    if (x0 > x1 || y0 > y1) return this;\n    // Expand the tree to cover the new points.\n    this.cover(x0, y0).cover(x1, y1);\n    // Add the new points.\n    for(i = 0; i < n; ++i)add(this, xz[i], yz[i], data[i]);\n    return this;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kI9oh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x, y) {\n    if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n    var x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1;\n    // If the quadtree has no extent, initialize them.\n    // Integer extent are necessary so that if we later double the extent,\n    // the existing quadrant boundaries don’t change due to floating point error!\n    if (isNaN(x0)) {\n        x1 = (x0 = Math.floor(x)) + 1;\n        y1 = (y0 = Math.floor(y)) + 1;\n    } else {\n        var z = x1 - x0 || 1, node = this._root, parent, i;\n        while(x0 > x || x >= x1 || y0 > y || y >= y1){\n            i = (y < y0) << 1 | x < x0;\n            parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n            switch(i){\n                case 0:\n                    x1 = x0 + z, y1 = y0 + z;\n                    break;\n                case 1:\n                    x0 = x1 - z, y1 = y0 + z;\n                    break;\n                case 2:\n                    x1 = x0 + z, y0 = y1 - z;\n                    break;\n                case 3:\n                    x0 = x1 - z, y0 = y1 - z;\n                    break;\n            }\n        }\n        if (this._root && this._root.length) this._root = node;\n    }\n    this._x0 = x0;\n    this._y0 = y0;\n    this._x1 = x1;\n    this._y1 = y1;\n    return this;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8JXlW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var data = [];\n    this.visit(function(node) {\n        if (!node.length) do data.push(node.data);\n        while (node = node.next);\n    });\n    return data;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5f3p3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(_) {\n    return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? undefined : [\n        [\n            this._x0,\n            this._y0\n        ],\n        [\n            this._x1,\n            this._y1\n        ]\n    ];\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iGHz5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _quadJs = require(\"./quad.js\");\nvar _quadJsDefault = parcelHelpers.interopDefault(_quadJs);\nexports.default = function(x, y, radius) {\n    var data, x0 = this._x0, y0 = this._y0, x1, y1, x2, y2, x3 = this._x1, y3 = this._y1, quads = [], node = this._root, q, i;\n    if (node) quads.push(new (0, _quadJsDefault.default)(node, x0, y0, x3, y3));\n    if (radius == null) radius = Infinity;\n    else {\n        x0 = x - radius, y0 = y - radius;\n        x3 = x + radius, y3 = y + radius;\n        radius *= radius;\n    }\n    while(q = quads.pop()){\n        // Stop searching if this quadrant can’t contain a closer node.\n        if (!(node = q.node) || (x1 = q.x0) > x3 || (y1 = q.y0) > y3 || (x2 = q.x1) < x0 || (y2 = q.y1) < y0) continue;\n        // Bisect the current quadrant.\n        if (node.length) {\n            var xm = (x1 + x2) / 2, ym = (y1 + y2) / 2;\n            quads.push(new (0, _quadJsDefault.default)(node[3], xm, ym, x2, y2), new (0, _quadJsDefault.default)(node[2], x1, ym, xm, y2), new (0, _quadJsDefault.default)(node[1], xm, y1, x2, ym), new (0, _quadJsDefault.default)(node[0], x1, y1, xm, ym));\n            // Visit the closest quadrant first.\n            if (i = (y >= ym) << 1 | x >= xm) {\n                q = quads[quads.length - 1];\n                quads[quads.length - 1] = quads[quads.length - 1 - i];\n                quads[quads.length - 1 - i] = q;\n            }\n        } else {\n            var dx = x - +this._x.call(null, node.data), dy = y - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;\n            if (d2 < radius) {\n                var d = Math.sqrt(radius = d2);\n                x0 = x - d, y0 = y - d;\n                x3 = x + d, y3 = y + d;\n                data = node.data;\n            }\n        }\n    }\n    return data;\n};\n\n},{\"./quad.js\":\"ctkiE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ctkiE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(node, x0, y0, x1, y1) {\n    this.node = node;\n    this.x0 = x0;\n    this.y0 = y0;\n    this.x1 = x1;\n    this.y1 = y1;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"JL81h\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"removeAll\", ()=>removeAll);\nexports.default = function(d) {\n    if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n    var parent, node = this._root, retainer, previous, next, x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1, x, y, xm, ym, right, bottom, i, j;\n    // If the tree is empty, initialize the root as a leaf.\n    if (!node) return this;\n    // Find the leaf node for the point.\n    // While descending, also retain the deepest parent with a non-removed sibling.\n    if (node.length) while(true){\n        if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;\n        else x1 = xm;\n        if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;\n        else y1 = ym;\n        if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n        if (!node.length) break;\n        if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) retainer = parent, j = i;\n    }\n    // Find the point to remove.\n    while(node.data !== d)if (!(previous = node, node = node.next)) return this;\n    if (next = node.next) delete node.next;\n    // If there are multiple coincident points, remove just the point.\n    if (previous) return next ? previous.next = next : delete previous.next, this;\n    // If this is the root point, remove it.\n    if (!parent) return this._root = next, this;\n    // Remove this leaf.\n    next ? parent[i] = next : delete parent[i];\n    // If the parent now contains exactly one leaf, collapse superfluous parents.\n    if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {\n        if (retainer) retainer[j] = node;\n        else this._root = node;\n    }\n    return this;\n};\nfunction removeAll(data) {\n    for(var i = 0, n = data.length; i < n; ++i)this.remove(data[i]);\n    return this;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8puIZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    return this._root;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7o2cy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var size = 0;\n    this.visit(function(node) {\n        if (!node.length) do ++size;\n        while (node = node.next);\n    });\n    return size;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3WHtz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _quadJs = require(\"./quad.js\");\nvar _quadJsDefault = parcelHelpers.interopDefault(_quadJs);\nexports.default = function(callback) {\n    var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n    if (node) quads.push(new (0, _quadJsDefault.default)(node, this._x0, this._y0, this._x1, this._y1));\n    while(q = quads.pop())if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n        var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n        if (child = node[3]) quads.push(new (0, _quadJsDefault.default)(child, xm, ym, x1, y1));\n        if (child = node[2]) quads.push(new (0, _quadJsDefault.default)(child, x0, ym, xm, y1));\n        if (child = node[1]) quads.push(new (0, _quadJsDefault.default)(child, xm, y0, x1, ym));\n        if (child = node[0]) quads.push(new (0, _quadJsDefault.default)(child, x0, y0, xm, ym));\n    }\n    return this;\n};\n\n},{\"./quad.js\":\"ctkiE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"BlWjS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _quadJs = require(\"./quad.js\");\nvar _quadJsDefault = parcelHelpers.interopDefault(_quadJs);\nexports.default = function(callback) {\n    var quads = [], next = [], q;\n    if (this._root) quads.push(new (0, _quadJsDefault.default)(this._root, this._x0, this._y0, this._x1, this._y1));\n    while(q = quads.pop()){\n        var node = q.node;\n        if (node.length) {\n            var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n            if (child = node[0]) quads.push(new (0, _quadJsDefault.default)(child, x0, y0, xm, ym));\n            if (child = node[1]) quads.push(new (0, _quadJsDefault.default)(child, xm, y0, x1, ym));\n            if (child = node[2]) quads.push(new (0, _quadJsDefault.default)(child, x0, ym, xm, y1));\n            if (child = node[3]) quads.push(new (0, _quadJsDefault.default)(child, xm, ym, x1, y1));\n        }\n        next.push(q);\n    }\n    while(q = next.pop())callback(q.node, q.x0, q.y0, q.x1, q.y1);\n    return this;\n};\n\n},{\"./quad.js\":\"ctkiE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bux1G\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultX\", ()=>defaultX);\nfunction defaultX(d) {\n    return d[0];\n}\nexports.default = function(_) {\n    return arguments.length ? (this._x = _, this) : this._x;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1GmNG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultY\", ()=>defaultY);\nfunction defaultY(d) {\n    return d[1];\n}\nexports.default = function(_) {\n    return arguments.length ? (this._y = _, this) : this._y;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b2eZT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return function() {\n        return x;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fV9Ia\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(random) {\n    return (random() - 0.5) * 1e-6;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jGYgd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _jiggleJs = require(\"./jiggle.js\");\nvar _jiggleJsDefault = parcelHelpers.interopDefault(_jiggleJs);\nfunction index(d) {\n    return d.index;\n}\nfunction find(nodeById, nodeId) {\n    var node = nodeById.get(nodeId);\n    if (!node) throw new Error(\"node not found: \" + nodeId);\n    return node;\n}\nexports.default = function(links) {\n    var id = index, strength = defaultStrength, strengths, distance = (0, _constantJsDefault.default)(30), distances, nodes, count, bias, random, iterations = 1;\n    if (links == null) links = [];\n    function defaultStrength(link) {\n        return 1 / Math.min(count[link.source.index], count[link.target.index]);\n    }\n    function force(alpha) {\n        for(var k = 0, n = links.length; k < iterations; ++k)for(var i = 0, link, source, target, x, y, l, b; i < n; ++i){\n            link = links[i], source = link.source, target = link.target;\n            x = target.x + target.vx - source.x - source.vx || (0, _jiggleJsDefault.default)(random);\n            y = target.y + target.vy - source.y - source.vy || (0, _jiggleJsDefault.default)(random);\n            l = Math.sqrt(x * x + y * y);\n            l = (l - distances[i]) / l * alpha * strengths[i];\n            x *= l, y *= l;\n            target.vx -= x * (b = bias[i]);\n            target.vy -= y * b;\n            source.vx += x * (b = 1 - b);\n            source.vy += y * b;\n        }\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i1, n = nodes.length, m = links.length, nodeById = new Map(nodes.map((d, i)=>[\n                id(d, i, nodes),\n                d\n            ])), link;\n        for(i1 = 0, count = new Array(n); i1 < m; ++i1){\n            link = links[i1], link.index = i1;\n            if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n            if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n            count[link.source.index] = (count[link.source.index] || 0) + 1;\n            count[link.target.index] = (count[link.target.index] || 0) + 1;\n        }\n        for(i1 = 0, bias = new Array(m); i1 < m; ++i1)link = links[i1], bias[i1] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n        strengths = new Array(m), initializeStrength();\n        distances = new Array(m), initializeDistance();\n    }\n    function initializeStrength() {\n        if (!nodes) return;\n        for(var i = 0, n = links.length; i < n; ++i)strengths[i] = +strength(links[i], i, links);\n    }\n    function initializeDistance() {\n        if (!nodes) return;\n        for(var i = 0, n = links.length; i < n; ++i)distances[i] = +distance(links[i], i, links);\n    }\n    force.initialize = function(_nodes, _random) {\n        nodes = _nodes;\n        random = _random;\n        initialize();\n    };\n    force.links = function(_) {\n        return arguments.length ? (links = _, initialize(), force) : links;\n    };\n    force.id = function(_) {\n        return arguments.length ? (id = _, force) : id;\n    };\n    force.iterations = function(_) {\n        return arguments.length ? (iterations = +_, force) : iterations;\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initializeStrength(), force) : strength;\n    };\n    force.distance = function(_) {\n        return arguments.length ? (distance = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initializeDistance(), force) : distance;\n    };\n    return force;\n};\n\n},{\"./constant.js\":\"b2eZT\",\"./jiggle.js\":\"fV9Ia\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gzRJm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Quadtree = require(\"d3-quadtree\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _jiggleJs = require(\"./jiggle.js\");\nvar _jiggleJsDefault = parcelHelpers.interopDefault(_jiggleJs);\nvar _simulationJs = require(\"./simulation.js\");\nexports.default = function() {\n    var nodes, node1, random, alpha, strength1 = (0, _constantJsDefault.default)(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81;\n    function force(_) {\n        var i, n = nodes.length, tree = (0, _d3Quadtree.quadtree)(nodes, (0, _simulationJs.x), (0, _simulationJs.y)).visitAfter(accumulate);\n        for(alpha = _, i = 0; i < n; ++i)node1 = nodes[i], tree.visit(apply);\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i, n = nodes.length, node;\n        strengths = new Array(n);\n        for(i = 0; i < n; ++i)node = nodes[i], strengths[node.index] = +strength1(node, i, nodes);\n    }\n    function accumulate(quad) {\n        var strength = 0, q, c, weight = 0, x, y, i;\n        // For internal nodes, accumulate forces from child quadrants.\n        if (quad.length) {\n            for(x = y = i = 0; i < 4; ++i)if ((q = quad[i]) && (c = Math.abs(q.value))) strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n            quad.x = x / weight;\n            quad.y = y / weight;\n        } else {\n            q = quad;\n            q.x = q.data.x;\n            q.y = q.data.y;\n            do strength += strengths[q.data.index];\n            while (q = q.next);\n        }\n        quad.value = strength;\n    }\n    function apply(quad, x1, _, x2) {\n        if (!quad.value) return true;\n        var x = quad.x - node1.x, y = quad.y - node1.y, w = x2 - x1, l = x * x + y * y;\n        // Apply the Barnes-Hut approximation if possible.\n        // Limit forces for very close nodes; randomize direction if coincident.\n        if (w * w / theta2 < l) {\n            if (l < distanceMax2) {\n                if (x === 0) x = (0, _jiggleJsDefault.default)(random), l += x * x;\n                if (y === 0) y = (0, _jiggleJsDefault.default)(random), l += y * y;\n                if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n                node1.vx += x * quad.value * alpha / l;\n                node1.vy += y * quad.value * alpha / l;\n            }\n            return true;\n        } else if (quad.length || l >= distanceMax2) return;\n        // Limit forces for very close nodes; randomize direction if coincident.\n        if (quad.data !== node1 || quad.next) {\n            if (x === 0) x = (0, _jiggleJsDefault.default)(random), l += x * x;\n            if (y === 0) y = (0, _jiggleJsDefault.default)(random), l += y * y;\n            if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n        }\n        do if (quad.data !== node1) {\n            w = strengths[quad.data.index] * alpha / l;\n            node1.vx += x * w;\n            node1.vy += y * w;\n        }\n        while (quad = quad.next);\n    }\n    force.initialize = function(_nodes, _random) {\n        nodes = _nodes;\n        random = _random;\n        initialize();\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength1 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : strength1;\n    };\n    force.distanceMin = function(_) {\n        return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n    };\n    force.distanceMax = function(_) {\n        return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n    };\n    force.theta = function(_) {\n        return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n    };\n    return force;\n};\n\n},{\"d3-quadtree\":\"bLOuD\",\"./constant.js\":\"b2eZT\",\"./jiggle.js\":\"fV9Ia\",\"./simulation.js\":\"8V27m\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8V27m\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"x\", ()=>x);\nparcelHelpers.export(exports, \"y\", ()=>y);\nvar _d3Dispatch = require(\"d3-dispatch\");\nvar _d3Timer = require(\"d3-timer\");\nvar _lcgJs = require(\"./lcg.js\");\nvar _lcgJsDefault = parcelHelpers.interopDefault(_lcgJs);\nfunction x(d) {\n    return d.x;\n}\nfunction y(d) {\n    return d.y;\n}\nvar initialRadius = 10, initialAngle = Math.PI * (3 - Math.sqrt(5));\nexports.default = function(nodes) {\n    var simulation, alpha = 1, alphaMin = 0.001, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = new Map(), stepper = (0, _d3Timer.timer)(step), event = (0, _d3Dispatch.dispatch)(\"tick\", \"end\"), random = (0, _lcgJsDefault.default)();\n    if (nodes == null) nodes = [];\n    function step() {\n        tick();\n        event.call(\"tick\", simulation);\n        if (alpha < alphaMin) {\n            stepper.stop();\n            event.call(\"end\", simulation);\n        }\n    }\n    function tick(iterations) {\n        var i, n = nodes.length, node;\n        if (iterations === undefined) iterations = 1;\n        for(var k = 0; k < iterations; ++k){\n            alpha += (alphaTarget - alpha) * alphaDecay;\n            forces.forEach(function(force) {\n                force(alpha);\n            });\n            for(i = 0; i < n; ++i){\n                node = nodes[i];\n                if (node.fx == null) node.x += node.vx *= velocityDecay;\n                else node.x = node.fx, node.vx = 0;\n                if (node.fy == null) node.y += node.vy *= velocityDecay;\n                else node.y = node.fy, node.vy = 0;\n            }\n        }\n        return simulation;\n    }\n    function initializeNodes() {\n        for(var i = 0, n = nodes.length, node; i < n; ++i){\n            node = nodes[i], node.index = i;\n            if (node.fx != null) node.x = node.fx;\n            if (node.fy != null) node.y = node.fy;\n            if (isNaN(node.x) || isNaN(node.y)) {\n                var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle;\n                node.x = radius * Math.cos(angle);\n                node.y = radius * Math.sin(angle);\n            }\n            if (isNaN(node.vx) || isNaN(node.vy)) node.vx = node.vy = 0;\n        }\n    }\n    function initializeForce(force) {\n        if (force.initialize) force.initialize(nodes, random);\n        return force;\n    }\n    initializeNodes();\n    return simulation = {\n        tick: tick,\n        restart: function() {\n            return stepper.restart(step), simulation;\n        },\n        stop: function() {\n            return stepper.stop(), simulation;\n        },\n        nodes: function(_) {\n            return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n        },\n        alpha: function(_) {\n            return arguments.length ? (alpha = +_, simulation) : alpha;\n        },\n        alphaMin: function(_) {\n            return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n        },\n        alphaDecay: function(_) {\n            return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n        },\n        alphaTarget: function(_) {\n            return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n        },\n        velocityDecay: function(_) {\n            return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n        },\n        randomSource: function(_) {\n            return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n        },\n        force: function(name, _) {\n            return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name);\n        },\n        find: function(x1, y1, radius) {\n            var i = 0, n = nodes.length, dx, dy, d2, node, closest;\n            if (radius == null) radius = Infinity;\n            else radius *= radius;\n            for(i = 0; i < n; ++i){\n                node = nodes[i];\n                dx = x1 - node.x;\n                dy = y1 - node.y;\n                d2 = dx * dx + dy * dy;\n                if (d2 < radius) closest = node, radius = d2;\n            }\n            return closest;\n        },\n        on: function(name, _) {\n            return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n        }\n    };\n};\n\n},{\"d3-dispatch\":\"emtwH\",\"d3-timer\":\"ekGPQ\",\"./lcg.js\":\"20OK0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"emtwH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dispatch\", ()=>(0, _dispatchJsDefault.default));\nvar _dispatchJs = require(\"./dispatch.js\");\nvar _dispatchJsDefault = parcelHelpers.interopDefault(_dispatchJs);\n\n},{\"./dispatch.js\":\"5xe85\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5xe85\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar noop = {\n    value: ()=>{}\n};\nfunction dispatch() {\n    for(var i = 0, n = arguments.length, _ = {}, t; i < n; ++i){\n        if (!(t = arguments[i] + \"\") || t in _ || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n        _[t] = [];\n    }\n    return new Dispatch(_);\n}\nfunction Dispatch(_) {\n    this._ = _;\n}\nfunction parseTypenames(typenames, types) {\n    return typenames.trim().split(/^|\\s+/).map(function(t) {\n        var name = \"\", i = t.indexOf(\".\");\n        if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n        if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n        return {\n            type: t,\n            name: name\n        };\n    });\n}\nDispatch.prototype = dispatch.prototype = {\n    constructor: Dispatch,\n    on: function(typename, callback) {\n        var _ = this._, T = parseTypenames(typename + \"\", _), t, i = -1, n = T.length;\n        // If no callback was specified, return the callback of the given type and name.\n        if (arguments.length < 2) {\n            while(++i < n)if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n            return;\n        }\n        // If a type was specified, set the callback for the given type and name.\n        // Otherwise, if a null callback was specified, remove callbacks of the given name.\n        if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n        while(++i < n){\n            if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n            else if (callback == null) for(t in _)_[t] = set(_[t], typename.name, null);\n        }\n        return this;\n    },\n    copy: function() {\n        var copy = {}, _ = this._;\n        for(var t in _)copy[t] = _[t].slice();\n        return new Dispatch(copy);\n    },\n    call: function(type, that) {\n        if ((n = arguments.length - 2) > 0) for(var args = new Array(n), i = 0, n, t; i < n; ++i)args[i] = arguments[i + 2];\n        if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n        for(t = this._[type], i = 0, n = t.length; i < n; ++i)t[i].value.apply(that, args);\n    },\n    apply: function(type, that, args) {\n        if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n        for(var t = this._[type], i = 0, n = t.length; i < n; ++i)t[i].value.apply(that, args);\n    }\n};\nfunction get(type, name) {\n    for(var i = 0, n = type.length, c; i < n; ++i){\n        if ((c = type[i]).name === name) return c.value;\n    }\n}\nfunction set(type, name, callback) {\n    for(var i = 0, n = type.length; i < n; ++i)if (type[i].name === name) {\n        type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n        break;\n    }\n    if (callback != null) type.push({\n        name: name,\n        value: callback\n    });\n    return type;\n}\nexports.default = dispatch;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ekGPQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"now\", ()=>(0, _timerJs.now));\nparcelHelpers.export(exports, \"timer\", ()=>(0, _timerJs.timer));\nparcelHelpers.export(exports, \"timerFlush\", ()=>(0, _timerJs.timerFlush));\nparcelHelpers.export(exports, \"timeout\", ()=>(0, _timeoutJsDefault.default));\nparcelHelpers.export(exports, \"interval\", ()=>(0, _intervalJsDefault.default));\nvar _timerJs = require(\"./timer.js\");\nvar _timeoutJs = require(\"./timeout.js\");\nvar _timeoutJsDefault = parcelHelpers.interopDefault(_timeoutJs);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\n\n},{\"./timer.js\":\"5HEi6\",\"./timeout.js\":false,\"./interval.js\":\"i9f4W\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5HEi6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"now\", ()=>now);\nparcelHelpers.export(exports, \"Timer\", ()=>Timer);\nparcelHelpers.export(exports, \"timer\", ()=>timer);\nparcelHelpers.export(exports, \"timerFlush\", ()=>timerFlush);\nvar frame = 0, timeout = 0, interval = 0, pokeDelay = 1000, taskHead, taskTail, clockLast = 0, clockNow = 0, clockSkew = 0, clock = typeof performance === \"object\" && performance.now ? performance : Date, setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {\n    setTimeout(f, 17);\n};\nfunction now() {\n    return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\nfunction clearNow() {\n    clockNow = 0;\n}\nfunction Timer() {\n    this._call = this._time = this._next = null;\n}\nTimer.prototype = timer.prototype = {\n    constructor: Timer,\n    restart: function(callback, delay, time) {\n        if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n        time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n        if (!this._next && taskTail !== this) {\n            if (taskTail) taskTail._next = this;\n            else taskHead = this;\n            taskTail = this;\n        }\n        this._call = callback;\n        this._time = time;\n        sleep();\n    },\n    stop: function() {\n        if (this._call) {\n            this._call = null;\n            this._time = Infinity;\n            sleep();\n        }\n    }\n};\nfunction timer(callback, delay, time) {\n    var t = new Timer;\n    t.restart(callback, delay, time);\n    return t;\n}\nfunction timerFlush() {\n    now(); // Get the current time, if not already set.\n    ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n    var t = taskHead, e;\n    while(t){\n        if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n        t = t._next;\n    }\n    --frame;\n}\nfunction wake() {\n    clockNow = (clockLast = clock.now()) + clockSkew;\n    frame = timeout = 0;\n    try {\n        timerFlush();\n    } finally{\n        frame = 0;\n        nap();\n        clockNow = 0;\n    }\n}\nfunction poke() {\n    var now1 = clock.now(), delay = now1 - clockLast;\n    if (delay > pokeDelay) clockSkew -= delay, clockLast = now1;\n}\nfunction nap() {\n    var t0, t1 = taskHead, t2, time = Infinity;\n    while(t1)if (t1._call) {\n        if (time > t1._time) time = t1._time;\n        t0 = t1, t1 = t1._next;\n    } else {\n        t2 = t1._next, t1._next = null;\n        t1 = t0 ? t0._next = t2 : taskHead = t2;\n    }\n    taskTail = t0;\n    sleep(time);\n}\nfunction sleep(time) {\n    if (frame) return; // Soonest alarm already set, or will be.\n    if (timeout) timeout = clearTimeout(timeout);\n    var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n    if (delay > 24) {\n        if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n        if (interval) interval = clearInterval(interval);\n    } else {\n        if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n        frame = 1, setFrame(wake);\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i9f4W\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _timerJs = require(\"./timer.js\");\nexports.default = function(callback1, delay1, time1) {\n    var t = new (0, _timerJs.Timer), total = delay1;\n    if (delay1 == null) return t.restart(callback1, delay1, time1), t;\n    t._restart = t.restart;\n    t.restart = function(callback, delay, time) {\n        delay = +delay, time = time == null ? (0, _timerJs.now)() : +time;\n        t._restart(function tick(elapsed) {\n            elapsed += total;\n            t._restart(tick, total += delay, time);\n            callback(elapsed);\n        }, delay, time);\n    };\n    t.restart(callback1, delay1, time1);\n    return t;\n};\n\n},{\"./timer.js\":\"5HEi6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"20OK0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\nexports.default = function() {\n    let s = 1;\n    return ()=>(s = (a * s + c) % m) / m;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i7ZBj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nexports.default = function(x) {\n    var strength = (0, _constantJsDefault.default)(0.1), nodes, strengths, xz;\n    if (typeof x !== \"function\") x = (0, _constantJsDefault.default)(x == null ? 0 : +x);\n    function force(alpha) {\n        for(var i = 0, n = nodes.length, node; i < n; ++i)node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i, n = nodes.length;\n        strengths = new Array(n);\n        xz = new Array(n);\n        for(i = 0; i < n; ++i)strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n    }\n    force.initialize = function(_) {\n        nodes = _;\n        initialize();\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : strength;\n    };\n    force.x = function(_) {\n        return arguments.length ? (x = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : x;\n    };\n    return force;\n};\n\n},{\"./constant.js\":\"b2eZT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bC0Hi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nexports.default = function(y) {\n    var strength = (0, _constantJsDefault.default)(0.1), nodes, strengths, yz;\n    if (typeof y !== \"function\") y = (0, _constantJsDefault.default)(y == null ? 0 : +y);\n    function force(alpha) {\n        for(var i = 0, n = nodes.length, node; i < n; ++i)node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i, n = nodes.length;\n        strengths = new Array(n);\n        yz = new Array(n);\n        for(i = 0; i < n; ++i)strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n    }\n    force.initialize = function(_) {\n        nodes = _;\n        initialize();\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : strength;\n    };\n    force.y = function(_) {\n        return arguments.length ? (y = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : y;\n    };\n    return force;\n};\n\n},{\"./constant.js\":\"b2eZT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5vTN6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"nest\", ()=>Nest);\nparcelHelpers.export(exports, \"pack\", ()=>Pack);\nparcelHelpers.export(exports, \"partition\", ()=>Partition);\nparcelHelpers.export(exports, \"stratify\", ()=>Stratify);\nparcelHelpers.export(exports, \"tree\", ()=>Tree);\nparcelHelpers.export(exports, \"treelinks\", ()=>TreeLinks);\nparcelHelpers.export(exports, \"treemap\", ()=>Treemap);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Hierarchy = require(\"d3-hierarchy\");\n// Build lookup table mapping tuple keys to tree node instances\nfunction lookup(tree, key, filter) {\n    const map = {};\n    tree.each((node)=>{\n        const t = node.data;\n        if (filter(t)) map[key(t)] = node;\n    });\n    tree.lookup = map;\n    return tree;\n}\n/**\n * Nest tuples into a tree structure, grouped by key values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.keys - The key fields to nest by, in order.\n * @param {boolean} [params.generate=false] - A boolean flag indicating if\n *   non-leaf nodes generated by this transform should be included in the\n *   output. The default (false) includes only the input data (leaf nodes)\n *   in the data stream.\n */ function Nest(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nNest.Definition = {\n    \"type\": \"Nest\",\n    \"metadata\": {\n        \"treesource\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"keys\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"generate\",\n            \"type\": \"boolean\"\n        }\n    ]\n};\nconst children = (n)=>n.values;\n(0, _vegaUtil.inherits)(Nest, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!pulse.source) (0, _vegaUtil.error)(\"Nest transform requires an upstream data source.\");\n        var gen = _.generate, mod = _.modified(), out = pulse.clone(), tree = this.value;\n        if (!tree || mod || pulse.changed()) {\n            // collect nodes to remove\n            if (tree) tree.each((node)=>{\n                if (node.children && (0, _vegaDataflow.isTuple)(node.data)) out.rem.push(node.data);\n            });\n             // generate new tree structure\n            this.value = tree = (0, _d3Hierarchy.hierarchy)({\n                values: (0, _vegaUtil.array)(_.keys).reduce((n, k)=>{\n                    n.key(k);\n                    return n;\n                }, nest()).entries(out.source)\n            }, children); // collect nodes to add\n            if (gen) tree.each((node)=>{\n                if (node.children) {\n                    node = (0, _vegaDataflow.ingest)(node.data);\n                    out.add.push(node);\n                    out.source.push(node);\n                }\n            });\n             // build lookup table\n            lookup(tree, (0, _vegaDataflow.tupleid), (0, _vegaDataflow.tupleid));\n        }\n        out.source.root = tree;\n        return out;\n    }\n});\nfunction nest() {\n    const keys = [], nest1 = {\n        entries: (array)=>entries(apply(array, 0), 0),\n        key: (d)=>(keys.push(d), nest1)\n    };\n    function apply(array, depth) {\n        if (depth >= keys.length) return array;\n        const n = array.length, key = keys[depth++], valuesByKey = {}, result = {};\n        let i = -1, keyValue, value, values;\n        while(++i < n){\n            keyValue = key(value = array[i]) + \"\";\n            if (values = valuesByKey[keyValue]) values.push(value);\n            else valuesByKey[keyValue] = [\n                value\n            ];\n        }\n        for(keyValue in valuesByKey)result[keyValue] = apply(valuesByKey[keyValue], depth);\n        return result;\n    }\n    function entries(map, depth) {\n        if (++depth > keys.length) return map;\n        const array = [];\n        for(const key in map)array.push({\n            key,\n            values: entries(map[key], depth)\n        });\n        return array;\n    }\n    return nest1;\n}\n/**\n * Abstract class for tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function HierarchyLayout(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nconst defaultSeparation = (a, b)=>a.parent === b.parent ? 1 : 2;\n(0, _vegaUtil.inherits)(HierarchyLayout, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!pulse.source || !pulse.source.root) (0, _vegaUtil.error)(this.constructor.name + \" transform requires a backing tree data source.\");\n        const layout = this.layout(_.method), fields = this.fields, root = pulse.source.root, as = _.as || fields;\n        if (_.field) root.sum(_.field);\n        else root.count();\n        if (_.sort) root.sort((0, _vegaDataflow.stableCompare)(_.sort, (d)=>d.data));\n        setParams(layout, this.params, _);\n        if (layout.separation) layout.separation(_.separation !== false ? defaultSeparation : (0, _vegaUtil.one));\n        try {\n            this.value = layout(root);\n        } catch (err) {\n            (0, _vegaUtil.error)(err);\n        }\n        root.each((node)=>setFields(node, fields, as));\n        return pulse.reflow(_.modified()).modifies(as).modifies(\"leaf\");\n    }\n});\nfunction setParams(layout, params, _) {\n    for(let p, i = 0, n = params.length; i < n; ++i){\n        p = params[i];\n        if (p in _) layout[p](_[p]);\n    }\n}\nfunction setFields(node, fields, as) {\n    const t = node.data, n = fields.length - 1;\n    for(let i = 0; i < n; ++i)t[as[i]] = node[fields[i]];\n    t[as[n]] = node.children ? node.children.length : 0;\n}\nconst Output = [\n    \"x\",\n    \"y\",\n    \"r\",\n    \"depth\",\n    \"children\"\n];\n/**\n * Packed circle tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */ function Pack(params) {\n    HierarchyLayout.call(this, params);\n}\nPack.Definition = {\n    \"type\": \"Pack\",\n    \"metadata\": {\n        \"tree\": true,\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"padding\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"radius\",\n            \"type\": \"field\",\n            \"default\": null\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": Output.length,\n            \"default\": Output\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Pack, HierarchyLayout, {\n    layout: (0, _d3Hierarchy.pack),\n    params: [\n        \"radius\",\n        \"size\",\n        \"padding\"\n    ],\n    fields: Output\n});\nconst Output$1 = [\n    \"x0\",\n    \"y0\",\n    \"x1\",\n    \"y1\",\n    \"depth\",\n    \"children\"\n];\n/**\n * Partition tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */ function Partition(params) {\n    HierarchyLayout.call(this, params);\n}\nPartition.Definition = {\n    \"type\": \"Partition\",\n    \"metadata\": {\n        \"tree\": true,\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"padding\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"round\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": Output$1.length,\n            \"default\": Output$1\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Partition, HierarchyLayout, {\n    layout: (0, _d3Hierarchy.partition),\n    params: [\n        \"size\",\n        \"round\",\n        \"padding\"\n    ],\n    fields: Output$1\n});\n/**\n * Stratify a collection of tuples into a tree structure based on\n * id and parent id fields.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.key - Unique key field for each tuple.\n * @param {function(object): *} params.parentKey - Field with key for parent tuple.\n */ function Stratify(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nStratify.Definition = {\n    \"type\": \"Stratify\",\n    \"metadata\": {\n        \"treesource\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"key\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"parentKey\",\n            \"type\": \"field\",\n            \"required\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Stratify, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!pulse.source) (0, _vegaUtil.error)(\"Stratify transform requires an upstream data source.\");\n        let tree = this.value;\n        const mod = _.modified(), out = pulse.fork(pulse.ALL).materialize(pulse.SOURCE), run = !tree || mod || pulse.changed(pulse.ADD_REM) || pulse.modified(_.key.fields) || pulse.modified(_.parentKey.fields); // prevent upstream source pollution\n        out.source = out.source.slice();\n        if (run) tree = out.source.length ? lookup((0, _d3Hierarchy.stratify)().id(_.key).parentId(_.parentKey)(out.source), _.key, (0, _vegaUtil.truthy)) : lookup((0, _d3Hierarchy.stratify)()([\n            {}\n        ]), _.key, _.key);\n        out.source.root = this.value = tree;\n        return out;\n    }\n});\nconst Layouts = {\n    tidy: (0, _d3Hierarchy.tree),\n    cluster: (0, _d3Hierarchy.cluster)\n};\nconst Output$2 = [\n    \"x\",\n    \"y\",\n    \"depth\",\n    \"children\"\n];\n/**\n * Tree layout. Depending on the method parameter, performs either\n * Reingold-Tilford 'tidy' layout or dendrogram 'cluster' layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function Tree(params) {\n    HierarchyLayout.call(this, params);\n}\nTree.Definition = {\n    \"type\": \"Tree\",\n    \"metadata\": {\n        \"tree\": true,\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"enum\",\n            \"default\": \"tidy\",\n            \"values\": [\n                \"tidy\",\n                \"cluster\"\n            ]\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"nodeSize\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"separation\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": Output$2.length,\n            \"default\": Output$2\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Tree, HierarchyLayout, {\n    /**\n   * Tree layout generator. Supports both 'tidy' and 'cluster' layouts.\n   */ layout (method) {\n        const m = method || \"tidy\";\n        if ((0, _vegaUtil.hasOwnProperty)(Layouts, m)) return Layouts[m]();\n        else (0, _vegaUtil.error)(\"Unrecognized Tree layout method: \" + m);\n    },\n    params: [\n        \"size\",\n        \"nodeSize\"\n    ],\n    fields: Output$2\n});\n/**\n * Generate tuples representing links between tree nodes.\n * The resulting tuples will contain 'source' and 'target' fields,\n * which point to parent and child node tuples, respectively.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function TreeLinks(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nTreeLinks.Definition = {\n    \"type\": \"TreeLinks\",\n    \"metadata\": {\n        \"tree\": true,\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": []\n};\n(0, _vegaUtil.inherits)(TreeLinks, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const links = this.value, tree = pulse.source && pulse.source.root, out = pulse.fork(pulse.NO_SOURCE), lut = {};\n        if (!tree) (0, _vegaUtil.error)(\"TreeLinks transform requires a tree data source.\");\n        if (pulse.changed(pulse.ADD_REM)) {\n            // remove previous links\n            out.rem = links; // build lookup table of valid tuples\n            pulse.visit(pulse.SOURCE, (t)=>lut[(0, _vegaDataflow.tupleid)(t)] = 1); // generate links for all edges incident on valid tuples\n            tree.each((node)=>{\n                const t = node.data, p = node.parent && node.parent.data;\n                if (p && lut[(0, _vegaDataflow.tupleid)(t)] && lut[(0, _vegaDataflow.tupleid)(p)]) out.add.push((0, _vegaDataflow.ingest)({\n                    source: p,\n                    target: t\n                }));\n            });\n            this.value = out.add;\n        } else if (pulse.changed(pulse.MOD)) {\n            // build lookup table of modified tuples\n            pulse.visit(pulse.MOD, (t)=>lut[(0, _vegaDataflow.tupleid)(t)] = 1); // gather links incident on modified tuples\n            links.forEach((link)=>{\n                if (lut[(0, _vegaDataflow.tupleid)(link.source)] || lut[(0, _vegaDataflow.tupleid)(link.target)]) out.mod.push(link);\n            });\n        }\n        return out;\n    }\n});\nconst Tiles = {\n    binary: (0, _d3Hierarchy.treemapBinary),\n    dice: (0, _d3Hierarchy.treemapDice),\n    slice: (0, _d3Hierarchy.treemapSlice),\n    slicedice: (0, _d3Hierarchy.treemapSliceDice),\n    squarify: (0, _d3Hierarchy.treemapSquarify),\n    resquarify: (0, _d3Hierarchy.treemapResquarify)\n};\nconst Output$3 = [\n    \"x0\",\n    \"y0\",\n    \"x1\",\n    \"y1\",\n    \"depth\",\n    \"children\"\n];\n/**\n * Treemap layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */ function Treemap(params) {\n    HierarchyLayout.call(this, params);\n}\nTreemap.Definition = {\n    \"type\": \"Treemap\",\n    \"metadata\": {\n        \"tree\": true,\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"enum\",\n            \"default\": \"squarify\",\n            \"values\": [\n                \"squarify\",\n                \"resquarify\",\n                \"binary\",\n                \"dice\",\n                \"slice\",\n                \"slicedice\"\n            ]\n        },\n        {\n            \"name\": \"padding\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingInner\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingOuter\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingTop\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingRight\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingBottom\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingLeft\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"ratio\",\n            \"type\": \"number\",\n            \"default\": 1.618033988749895\n        },\n        {\n            \"name\": \"round\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": Output$3.length,\n            \"default\": Output$3\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Treemap, HierarchyLayout, {\n    /**\n   * Treemap layout generator. Adds 'method' and 'ratio' parameters\n   * to configure the underlying tile method.\n   */ layout () {\n        const x = (0, _d3Hierarchy.treemap)();\n        x.ratio = (_)=>{\n            const t = x.tile();\n            if (t.ratio) x.tile(t.ratio(_));\n        };\n        x.method = (_)=>{\n            if ((0, _vegaUtil.hasOwnProperty)(Tiles, _)) x.tile(Tiles[_]);\n            else (0, _vegaUtil.error)(\"Unrecognized Treemap layout method: \" + _);\n        };\n        return x;\n    },\n    params: [\n        \"method\",\n        \"ratio\",\n        \"size\",\n        \"round\",\n        \"padding\",\n        \"paddingInner\",\n        \"paddingOuter\",\n        \"paddingTop\",\n        \"paddingRight\",\n        \"paddingBottom\",\n        \"paddingLeft\"\n    ],\n    fields: Output$3\n});\n\n},{\"vega-dataflow\":\"4kvYg\",\"vega-util\":\"dPFAY\",\"d3-hierarchy\":\"bkLr4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bkLr4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cluster\", ()=>(0, _clusterJsDefault.default));\nparcelHelpers.export(exports, \"hierarchy\", ()=>(0, _indexJsDefault.default));\nparcelHelpers.export(exports, \"pack\", ()=>(0, _indexJsDefault1.default));\nparcelHelpers.export(exports, \"packSiblings\", ()=>(0, _siblingsJsDefault.default));\nparcelHelpers.export(exports, \"packEnclose\", ()=>(0, _encloseJsDefault.default));\nparcelHelpers.export(exports, \"partition\", ()=>(0, _partitionJsDefault.default));\nparcelHelpers.export(exports, \"stratify\", ()=>(0, _stratifyJsDefault.default));\nparcelHelpers.export(exports, \"tree\", ()=>(0, _treeJsDefault.default));\nparcelHelpers.export(exports, \"treemap\", ()=>(0, _indexJsDefault2.default));\nparcelHelpers.export(exports, \"treemapBinary\", ()=>(0, _binaryJsDefault.default));\nparcelHelpers.export(exports, \"treemapDice\", ()=>(0, _diceJsDefault.default));\nparcelHelpers.export(exports, \"treemapSlice\", ()=>(0, _sliceJsDefault.default));\nparcelHelpers.export(exports, \"treemapSliceDice\", ()=>(0, _sliceDiceJsDefault.default));\nparcelHelpers.export(exports, \"treemapSquarify\", ()=>(0, _squarifyJsDefault.default));\nparcelHelpers.export(exports, \"treemapResquarify\", ()=>(0, _resquarifyJsDefault.default));\nvar _clusterJs = require(\"./cluster.js\");\nvar _clusterJsDefault = parcelHelpers.interopDefault(_clusterJs);\nvar _indexJs = require(\"./hierarchy/index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _indexJs1 = require(\"./pack/index.js\");\nvar _indexJsDefault1 = parcelHelpers.interopDefault(_indexJs1);\nvar _siblingsJs = require(\"./pack/siblings.js\");\nvar _siblingsJsDefault = parcelHelpers.interopDefault(_siblingsJs);\nvar _encloseJs = require(\"./pack/enclose.js\");\nvar _encloseJsDefault = parcelHelpers.interopDefault(_encloseJs);\nvar _partitionJs = require(\"./partition.js\");\nvar _partitionJsDefault = parcelHelpers.interopDefault(_partitionJs);\nvar _stratifyJs = require(\"./stratify.js\");\nvar _stratifyJsDefault = parcelHelpers.interopDefault(_stratifyJs);\nvar _treeJs = require(\"./tree.js\");\nvar _treeJsDefault = parcelHelpers.interopDefault(_treeJs);\nvar _indexJs2 = require(\"./treemap/index.js\");\nvar _indexJsDefault2 = parcelHelpers.interopDefault(_indexJs2);\nvar _binaryJs = require(\"./treemap/binary.js\");\nvar _binaryJsDefault = parcelHelpers.interopDefault(_binaryJs);\nvar _diceJs = require(\"./treemap/dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nvar _sliceJs = require(\"./treemap/slice.js\");\nvar _sliceJsDefault = parcelHelpers.interopDefault(_sliceJs);\nvar _sliceDiceJs = require(\"./treemap/sliceDice.js\");\nvar _sliceDiceJsDefault = parcelHelpers.interopDefault(_sliceDiceJs);\nvar _squarifyJs = require(\"./treemap/squarify.js\");\nvar _squarifyJsDefault = parcelHelpers.interopDefault(_squarifyJs);\nvar _resquarifyJs = require(\"./treemap/resquarify.js\");\nvar _resquarifyJsDefault = parcelHelpers.interopDefault(_resquarifyJs);\n\n},{\"./cluster.js\":\"gVmUh\",\"./hierarchy/index.js\":\"eiPwy\",\"./pack/index.js\":\"66RdA\",\"./pack/siblings.js\":\"46bgV\",\"./pack/enclose.js\":\"3Unie\",\"./partition.js\":\"7ce19\",\"./stratify.js\":\"f8AkF\",\"./tree.js\":\"coCqL\",\"./treemap/index.js\":\"8QnJl\",\"./treemap/binary.js\":\"7ZVIw\",\"./treemap/dice.js\":\"715Ix\",\"./treemap/slice.js\":\"8Sw28\",\"./treemap/sliceDice.js\":\"eNLWs\",\"./treemap/squarify.js\":\"l99lF\",\"./treemap/resquarify.js\":\"jjXCy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gVmUh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction defaultSeparation(a, b) {\n    return a.parent === b.parent ? 1 : 2;\n}\nfunction meanX(children) {\n    return children.reduce(meanXReduce, 0) / children.length;\n}\nfunction meanXReduce(x, c) {\n    return x + c.x;\n}\nfunction maxY(children) {\n    return 1 + children.reduce(maxYReduce, 0);\n}\nfunction maxYReduce(y, c) {\n    return Math.max(y, c.y);\n}\nfunction leafLeft(node) {\n    var children;\n    while(children = node.children)node = children[0];\n    return node;\n}\nfunction leafRight(node) {\n    var children;\n    while(children = node.children)node = children[children.length - 1];\n    return node;\n}\nexports.default = function() {\n    var separation = defaultSeparation, dx = 1, dy = 1, nodeSize = false;\n    function cluster(root) {\n        var previousNode, x = 0;\n        // First walk, computing the initial x & y values.\n        root.eachAfter(function(node) {\n            var children = node.children;\n            if (children) {\n                node.x = meanX(children);\n                node.y = maxY(children);\n            } else {\n                node.x = previousNode ? x += separation(node, previousNode) : 0;\n                node.y = 0;\n                previousNode = node;\n            }\n        });\n        var left = leafLeft(root), right = leafRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n        // Second walk, normalizing x & y to the desired size.\n        return root.eachAfter(nodeSize ? function(node) {\n            node.x = (node.x - root.x) * dx;\n            node.y = (root.y - node.y) * dy;\n        } : function(node) {\n            node.x = (node.x - x0) / (x1 - x0) * dx;\n            node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n        });\n    }\n    cluster.separation = function(x) {\n        return arguments.length ? (separation = x, cluster) : separation;\n    };\n    cluster.size = function(x) {\n        return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : nodeSize ? null : [\n            dx,\n            dy\n        ];\n    };\n    cluster.nodeSize = function(x) {\n        return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : nodeSize ? [\n            dx,\n            dy\n        ] : null;\n    };\n    return cluster;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eiPwy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"computeHeight\", ()=>computeHeight);\nparcelHelpers.export(exports, \"Node\", ()=>Node);\nvar _countJs = require(\"./count.js\");\nvar _countJsDefault = parcelHelpers.interopDefault(_countJs);\nvar _eachJs = require(\"./each.js\");\nvar _eachJsDefault = parcelHelpers.interopDefault(_eachJs);\nvar _eachBeforeJs = require(\"./eachBefore.js\");\nvar _eachBeforeJsDefault = parcelHelpers.interopDefault(_eachBeforeJs);\nvar _eachAfterJs = require(\"./eachAfter.js\");\nvar _eachAfterJsDefault = parcelHelpers.interopDefault(_eachAfterJs);\nvar _findJs = require(\"./find.js\");\nvar _findJsDefault = parcelHelpers.interopDefault(_findJs);\nvar _sumJs = require(\"./sum.js\");\nvar _sumJsDefault = parcelHelpers.interopDefault(_sumJs);\nvar _sortJs = require(\"./sort.js\");\nvar _sortJsDefault = parcelHelpers.interopDefault(_sortJs);\nvar _pathJs = require(\"./path.js\");\nvar _pathJsDefault = parcelHelpers.interopDefault(_pathJs);\nvar _ancestorsJs = require(\"./ancestors.js\");\nvar _ancestorsJsDefault = parcelHelpers.interopDefault(_ancestorsJs);\nvar _descendantsJs = require(\"./descendants.js\");\nvar _descendantsJsDefault = parcelHelpers.interopDefault(_descendantsJs);\nvar _leavesJs = require(\"./leaves.js\");\nvar _leavesJsDefault = parcelHelpers.interopDefault(_leavesJs);\nvar _linksJs = require(\"./links.js\");\nvar _linksJsDefault = parcelHelpers.interopDefault(_linksJs);\nvar _iteratorJs = require(\"./iterator.js\");\nvar _iteratorJsDefault = parcelHelpers.interopDefault(_iteratorJs);\nfunction hierarchy(data, children) {\n    if (data instanceof Map) {\n        data = [\n            undefined,\n            data\n        ];\n        if (children === undefined) children = mapChildren;\n    } else if (children === undefined) children = objectChildren;\n    var root = new Node(data), node, nodes = [\n        root\n    ], child, childs, i, n;\n    while(node = nodes.pop())if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) {\n        node.children = childs;\n        for(i = n - 1; i >= 0; --i){\n            nodes.push(child = childs[i] = new Node(childs[i]));\n            child.parent = node;\n            child.depth = node.depth + 1;\n        }\n    }\n    return root.eachBefore(computeHeight);\n}\nexports.default = hierarchy;\nfunction node_copy() {\n    return hierarchy(this).eachBefore(copyData);\n}\nfunction objectChildren(d) {\n    return d.children;\n}\nfunction mapChildren(d) {\n    return Array.isArray(d) ? d[1] : null;\n}\nfunction copyData(node) {\n    if (node.data.value !== undefined) node.value = node.data.value;\n    node.data = node.data.data;\n}\nfunction computeHeight(node) {\n    var height = 0;\n    do node.height = height;\n    while ((node = node.parent) && node.height < ++height);\n}\nfunction Node(data) {\n    this.data = data;\n    this.depth = this.height = 0;\n    this.parent = null;\n}\nNode.prototype = hierarchy.prototype = {\n    constructor: Node,\n    count: (0, _countJsDefault.default),\n    each: (0, _eachJsDefault.default),\n    eachAfter: (0, _eachAfterJsDefault.default),\n    eachBefore: (0, _eachBeforeJsDefault.default),\n    find: (0, _findJsDefault.default),\n    sum: (0, _sumJsDefault.default),\n    sort: (0, _sortJsDefault.default),\n    path: (0, _pathJsDefault.default),\n    ancestors: (0, _ancestorsJsDefault.default),\n    descendants: (0, _descendantsJsDefault.default),\n    leaves: (0, _leavesJsDefault.default),\n    links: (0, _linksJsDefault.default),\n    copy: node_copy,\n    [Symbol.iterator]: (0, _iteratorJsDefault.default)\n};\n\n},{\"./count.js\":\"Nlhxc\",\"./each.js\":\"6TPsc\",\"./eachBefore.js\":\"baZsw\",\"./eachAfter.js\":\"fMQY2\",\"./find.js\":\"evAaO\",\"./sum.js\":\"gSSwv\",\"./sort.js\":\"1SFQw\",\"./path.js\":\"1tmXT\",\"./ancestors.js\":\"5nXQ2\",\"./descendants.js\":\"dWiOn\",\"./leaves.js\":\"l2nZA\",\"./links.js\":\"gmgIB\",\"./iterator.js\":\"e5XmF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Nlhxc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction count(node) {\n    var sum = 0, children = node.children, i = children && children.length;\n    if (!i) sum = 1;\n    else while(--i >= 0)sum += children[i].value;\n    node.value = sum;\n}\nexports.default = function() {\n    return this.eachAfter(count);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6TPsc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(callback, that) {\n    let index = -1;\n    for (const node of this)callback.call(that, node, ++index, this);\n    return this;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"baZsw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(callback, that) {\n    var node = this, nodes = [\n        node\n    ], children, i, index = -1;\n    while(node = nodes.pop()){\n        callback.call(that, node, ++index, this);\n        if (children = node.children) for(i = children.length - 1; i >= 0; --i)nodes.push(children[i]);\n    }\n    return this;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fMQY2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(callback, that) {\n    var node = this, nodes = [\n        node\n    ], next = [], children, i, n, index = -1;\n    while(node = nodes.pop()){\n        next.push(node);\n        if (children = node.children) for(i = 0, n = children.length; i < n; ++i)nodes.push(children[i]);\n    }\n    while(node = next.pop())callback.call(that, node, ++index, this);\n    return this;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"evAaO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(callback, that) {\n    let index = -1;\n    for (const node of this){\n        if (callback.call(that, node, ++index, this)) return node;\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gSSwv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(value) {\n    return this.eachAfter(function(node) {\n        var sum = +value(node.data) || 0, children = node.children, i = children && children.length;\n        while(--i >= 0)sum += children[i].value;\n        node.value = sum;\n    });\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1SFQw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(compare) {\n    return this.eachBefore(function(node) {\n        if (node.children) node.children.sort(compare);\n    });\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1tmXT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(end) {\n    var start = this, ancestor = leastCommonAncestor(start, end), nodes = [\n        start\n    ];\n    while(start !== ancestor){\n        start = start.parent;\n        nodes.push(start);\n    }\n    var k = nodes.length;\n    while(end !== ancestor){\n        nodes.splice(k, 0, end);\n        end = end.parent;\n    }\n    return nodes;\n};\nfunction leastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = a.ancestors(), bNodes = b.ancestors(), c = null;\n    a = aNodes.pop();\n    b = bNodes.pop();\n    while(a === b){\n        c = a;\n        a = aNodes.pop();\n        b = bNodes.pop();\n    }\n    return c;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5nXQ2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var node = this, nodes = [\n        node\n    ];\n    while(node = node.parent)nodes.push(node);\n    return nodes;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dWiOn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    return Array.from(this);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l2nZA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var leaves = [];\n    this.eachBefore(function(node) {\n        if (!node.children) leaves.push(node);\n    });\n    return leaves;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gmgIB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var root = this, links = [];\n    root.each(function(node) {\n        if (node !== root) links.push({\n            source: node.parent,\n            target: node\n        });\n    });\n    return links;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e5XmF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function*() {\n    var node = this, current, next = [\n        node\n    ], children, i, n;\n    do {\n        current = next.reverse(), next = [];\n        while(node = current.pop()){\n            yield node;\n            if (children = node.children) for(i = 0, n = children.length; i < n; ++i)next.push(children[i]);\n        }\n    }while (next.length);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"66RdA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _siblingsJs = require(\"./siblings.js\");\nvar _accessorsJs = require(\"../accessors.js\");\nvar _constantJs = require(\"../constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nfunction defaultRadius(d) {\n    return Math.sqrt(d.value);\n}\nexports.default = function() {\n    var radius = null, dx = 1, dy = 1, padding = (0, _constantJs.constantZero);\n    function pack(root) {\n        root.x = dx / 2, root.y = dy / 2;\n        if (radius) root.eachBefore(radiusLeaf(radius)).eachAfter(packChildren(padding, 0.5)).eachBefore(translateChild(1));\n        else root.eachBefore(radiusLeaf(defaultRadius)).eachAfter(packChildren((0, _constantJs.constantZero), 1)).eachAfter(packChildren(padding, root.r / Math.min(dx, dy))).eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n        return root;\n    }\n    pack.radius = function(x) {\n        return arguments.length ? (radius = (0, _accessorsJs.optional)(x), pack) : radius;\n    };\n    pack.size = function(x) {\n        return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [\n            dx,\n            dy\n        ];\n    };\n    pack.padding = function(x) {\n        return arguments.length ? (padding = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), pack) : padding;\n    };\n    return pack;\n};\nfunction radiusLeaf(radius) {\n    return function(node) {\n        if (!node.children) node.r = Math.max(0, +radius(node) || 0);\n    };\n}\nfunction packChildren(padding, k) {\n    return function(node) {\n        if (children = node.children) {\n            var children, i, n = children.length, r = padding(node) * k || 0, e;\n            if (r) for(i = 0; i < n; ++i)children[i].r += r;\n            e = (0, _siblingsJs.packEnclose)(children);\n            if (r) for(i = 0; i < n; ++i)children[i].r -= r;\n            node.r = e + r;\n        }\n    };\n}\nfunction translateChild(k) {\n    return function(node) {\n        var parent = node.parent;\n        node.r *= k;\n        if (parent) {\n            node.x = parent.x + k * node.x;\n            node.y = parent.y + k * node.y;\n        }\n    };\n}\n\n},{\"./siblings.js\":\"46bgV\",\"../accessors.js\":\"bsUy0\",\"../constant.js\":\"e122v\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"46bgV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"packEnclose\", ()=>packEnclose);\nvar _arrayJs = require(\"../array.js\");\nvar _arrayJsDefault = parcelHelpers.interopDefault(_arrayJs);\nvar _encloseJs = require(\"./enclose.js\");\nvar _encloseJsDefault = parcelHelpers.interopDefault(_encloseJs);\nfunction place(b, a, c) {\n    var dx = b.x - a.x, x, a2, dy = b.y - a.y, y, b2, d2 = dx * dx + dy * dy;\n    if (d2) {\n        a2 = a.r + c.r, a2 *= a2;\n        b2 = b.r + c.r, b2 *= b2;\n        if (a2 > b2) {\n            x = (d2 + b2 - a2) / (2 * d2);\n            y = Math.sqrt(Math.max(0, b2 / d2 - x * x));\n            c.x = b.x - x * dx - y * dy;\n            c.y = b.y - x * dy + y * dx;\n        } else {\n            x = (d2 + a2 - b2) / (2 * d2);\n            y = Math.sqrt(Math.max(0, a2 / d2 - x * x));\n            c.x = a.x + x * dx - y * dy;\n            c.y = a.y + x * dy + y * dx;\n        }\n    } else {\n        c.x = a.x + c.r;\n        c.y = a.y;\n    }\n}\nfunction intersects(a, b) {\n    var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\nfunction score(node) {\n    var a = node._, b = node.next._, ab = a.r + b.r, dx = (a.x * b.r + b.x * a.r) / ab, dy = (a.y * b.r + b.y * a.r) / ab;\n    return dx * dx + dy * dy;\n}\nfunction Node(circle) {\n    this._ = circle;\n    this.next = null;\n    this.previous = null;\n}\nfunction packEnclose(circles) {\n    if (!(n = (circles = (0, _arrayJsDefault.default)(circles)).length)) return 0;\n    var a, b, c, n, aa, ca, i, j, k, sj, sk;\n    // Place the first circle.\n    a = circles[0], a.x = 0, a.y = 0;\n    if (!(n > 1)) return a.r;\n    // Place the second circle.\n    b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;\n    if (!(n > 2)) return a.r + b.r;\n    // Place the third circle.\n    place(b, a, c = circles[2]);\n    // Initialize the front-chain using the first three circles a, b and c.\n    a = new Node(a), b = new Node(b), c = new Node(c);\n    a.next = c.previous = b;\n    b.next = a.previous = c;\n    c.next = b.previous = a;\n    // Attempt to place each remaining circle…\n    pack: for(i = 3; i < n; ++i){\n        place(a._, b._, c = circles[i]), c = new Node(c);\n        // Find the closest intersecting circle on the front-chain, if any.\n        // “Closeness” is determined by linear distance along the front-chain.\n        // “Ahead” or “behind” is likewise determined by linear distance.\n        j = b.next, k = a.previous, sj = b._.r, sk = a._.r;\n        do if (sj <= sk) {\n            if (intersects(j._, c._)) {\n                b = j, a.next = b, b.previous = a, --i;\n                continue pack;\n            }\n            sj += j._.r, j = j.next;\n        } else {\n            if (intersects(k._, c._)) {\n                a = k, a.next = b, b.previous = a, --i;\n                continue pack;\n            }\n            sk += k._.r, k = k.previous;\n        }\n        while (j !== k.next);\n        // Success! Insert the new circle c between a and b.\n        c.previous = a, c.next = b, a.next = b.previous = b = c;\n        // Compute the new closest circle pair to the centroid.\n        aa = score(a);\n        while((c = c.next) !== b)if ((ca = score(c)) < aa) a = c, aa = ca;\n        b = a.next;\n    }\n    // Compute the enclosing circle of the front chain.\n    a = [\n        b._\n    ], c = b;\n    while((c = c.next) !== b)a.push(c._);\n    c = (0, _encloseJsDefault.default)(a);\n    // Translate the circles to put the enclosing circle around the origin.\n    for(i = 0; i < n; ++i)a = circles[i], a.x -= c.x, a.y -= c.y;\n    return c.r;\n}\nexports.default = function(circles) {\n    packEnclose(circles);\n    return circles;\n};\n\n},{\"../array.js\":\"eKsOC\",\"./enclose.js\":\"3Unie\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eKsOC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"shuffle\", ()=>shuffle);\nexports.default = function(x) {\n    return typeof x === \"object\" && \"length\" in x ? x // Array, TypedArray, NodeList, array-like\n     : Array.from(x); // Map, Set, iterable, string, or anything else\n};\nfunction shuffle(array) {\n    var m = array.length, t, i;\n    while(m){\n        i = Math.random() * m-- | 0;\n        t = array[m];\n        array[m] = array[i];\n        array[i] = t;\n    }\n    return array;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Unie\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayJs = require(\"../array.js\");\nexports.default = function(circles) {\n    var i = 0, n = (circles = (0, _arrayJs.shuffle)(Array.from(circles))).length, B = [], p, e;\n    while(i < n){\n        p = circles[i];\n        if (e && enclosesWeak(e, p)) ++i;\n        else e = encloseBasis(B = extendBasis(B, p)), i = 0;\n    }\n    return e;\n};\nfunction extendBasis(B, p) {\n    var i, j;\n    if (enclosesWeakAll(p, B)) return [\n        p\n    ];\n    // If we get here then B must have at least one element.\n    for(i = 0; i < B.length; ++i){\n        if (enclosesNot(p, B[i]) && enclosesWeakAll(encloseBasis2(B[i], p), B)) return [\n            B[i],\n            p\n        ];\n    }\n    // If we get here then B must have at least two elements.\n    for(i = 0; i < B.length - 1; ++i)for(j = i + 1; j < B.length; ++j){\n        if (enclosesNot(encloseBasis2(B[i], B[j]), p) && enclosesNot(encloseBasis2(B[i], p), B[j]) && enclosesNot(encloseBasis2(B[j], p), B[i]) && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) return [\n            B[i],\n            B[j],\n            p\n        ];\n    }\n    // If we get here then something is very wrong.\n    throw new Error;\n}\nfunction enclosesNot(a, b) {\n    var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;\n    return dr < 0 || dr * dr < dx * dx + dy * dy;\n}\nfunction enclosesWeak(a, b) {\n    var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\nfunction enclosesWeakAll(a, B) {\n    for(var i = 0; i < B.length; ++i){\n        if (!enclosesWeak(a, B[i])) return false;\n    }\n    return true;\n}\nfunction encloseBasis(B) {\n    switch(B.length){\n        case 1:\n            return encloseBasis1(B[0]);\n        case 2:\n            return encloseBasis2(B[0], B[1]);\n        case 3:\n            return encloseBasis3(B[0], B[1], B[2]);\n    }\n}\nfunction encloseBasis1(a) {\n    return {\n        x: a.x,\n        y: a.y,\n        r: a.r\n    };\n}\nfunction encloseBasis2(a, b) {\n    var x1 = a.x, y1 = a.y, r1 = a.r, x2 = b.x, y2 = b.y, r2 = b.r, x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, l = Math.sqrt(x21 * x21 + y21 * y21);\n    return {\n        x: (x1 + x2 + x21 / l * r21) / 2,\n        y: (y1 + y2 + y21 / l * r21) / 2,\n        r: (l + r1 + r2) / 2\n    };\n}\nfunction encloseBasis3(a, b, c) {\n    var x1 = a.x, y1 = a.y, r1 = a.r, x2 = b.x, y2 = b.y, r2 = b.r, x3 = c.x, y3 = c.y, r3 = c.r, a2 = x1 - x2, a3 = x1 - x3, b2 = y1 - y2, b3 = y1 - y3, c2 = r2 - r1, c3 = r3 - r1, d1 = x1 * x1 + y1 * y1 - r1 * r1, d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, ab = a3 * b2 - a2 * b3, xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, xb = (b3 * c2 - b2 * c3) / ab, ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, yb = (a2 * c3 - a3 * c2) / ab, A = xb * xb + yb * yb - 1, B = 2 * (r1 + xa * xb + ya * yb), C = xa * xa + ya * ya - r1 * r1, r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);\n    return {\n        x: x1 + xa + xb * r,\n        y: y1 + ya + yb * r,\n        r: r\n    };\n}\n\n},{\"../array.js\":\"eKsOC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bsUy0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"optional\", ()=>optional);\nparcelHelpers.export(exports, \"required\", ()=>required);\nfunction optional(f) {\n    return f == null ? null : required(f);\n}\nfunction required(f) {\n    if (typeof f !== \"function\") throw new Error;\n    return f;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e122v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"constantZero\", ()=>constantZero);\nfunction constantZero() {\n    return 0;\n}\nexports.default = function(x) {\n    return function() {\n        return x;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ce19\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _roundJs = require(\"./treemap/round.js\");\nvar _roundJsDefault = parcelHelpers.interopDefault(_roundJs);\nvar _diceJs = require(\"./treemap/dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nexports.default = function() {\n    var dx = 1, dy1 = 1, padding = 0, round = false;\n    function partition(root) {\n        var n = root.height + 1;\n        root.x0 = root.y0 = padding;\n        root.x1 = dx;\n        root.y1 = dy1 / n;\n        root.eachBefore(positionNode(dy1, n));\n        if (round) root.eachBefore((0, _roundJsDefault.default));\n        return root;\n    }\n    function positionNode(dy, n) {\n        return function(node) {\n            if (node.children) (0, _diceJsDefault.default)(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);\n            var x0 = node.x0, y0 = node.y0, x1 = node.x1 - padding, y1 = node.y1 - padding;\n            if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n            if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n            node.x0 = x0;\n            node.y0 = y0;\n            node.x1 = x1;\n            node.y1 = y1;\n        };\n    }\n    partition.round = function(x) {\n        return arguments.length ? (round = !!x, partition) : round;\n    };\n    partition.size = function(x) {\n        return arguments.length ? (dx = +x[0], dy1 = +x[1], partition) : [\n            dx,\n            dy1\n        ];\n    };\n    partition.padding = function(x) {\n        return arguments.length ? (padding = +x, partition) : padding;\n    };\n    return partition;\n};\n\n},{\"./treemap/round.js\":\"i9GYz\",\"./treemap/dice.js\":\"715Ix\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i9GYz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(node) {\n    node.x0 = Math.round(node.x0);\n    node.y0 = Math.round(node.y0);\n    node.x1 = Math.round(node.x1);\n    node.y1 = Math.round(node.y1);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"715Ix\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(parent, x0, y0, x1, y1) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (x1 - x0) / parent.value;\n    while(++i < n){\n        node = nodes[i], node.y0 = y0, node.y1 = y1;\n        node.x0 = x0, node.x1 = x0 += node.value * k;\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f8AkF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _accessorsJs = require(\"./accessors.js\");\nvar _indexJs = require(\"./hierarchy/index.js\");\nvar preroot = {\n    depth: -1\n}, ambiguous = {};\nfunction defaultId(d) {\n    return d.id;\n}\nfunction defaultParentId(d) {\n    return d.parentId;\n}\nexports.default = function() {\n    var id = defaultId, parentId = defaultParentId;\n    function stratify(data) {\n        var nodes = Array.from(data), n = nodes.length, d, i, root, parent, node1, nodeId, nodeKey, nodeByKey = new Map;\n        for(i = 0; i < n; ++i){\n            d = nodes[i], node1 = nodes[i] = new (0, _indexJs.Node)(d);\n            if ((nodeId = id(d, i, data)) != null && (nodeId += \"\")) {\n                nodeKey = node1.id = nodeId;\n                nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node1);\n            }\n            if ((nodeId = parentId(d, i, data)) != null && (nodeId += \"\")) node1.parent = nodeId;\n        }\n        for(i = 0; i < n; ++i){\n            node1 = nodes[i];\n            if (nodeId = node1.parent) {\n                parent = nodeByKey.get(nodeId);\n                if (!parent) throw new Error(\"missing: \" + nodeId);\n                if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n                if (parent.children) parent.children.push(node1);\n                else parent.children = [\n                    node1\n                ];\n                node1.parent = parent;\n            } else {\n                if (root) throw new Error(\"multiple roots\");\n                root = node1;\n            }\n        }\n        if (!root) throw new Error(\"no root\");\n        root.parent = preroot;\n        root.eachBefore(function(node) {\n            node.depth = node.parent.depth + 1;\n            --n;\n        }).eachBefore((0, _indexJs.computeHeight));\n        root.parent = null;\n        if (n > 0) throw new Error(\"cycle\");\n        return root;\n    }\n    stratify.id = function(x) {\n        return arguments.length ? (id = (0, _accessorsJs.required)(x), stratify) : id;\n    };\n    stratify.parentId = function(x) {\n        return arguments.length ? (parentId = (0, _accessorsJs.required)(x), stratify) : parentId;\n    };\n    return stratify;\n};\n\n},{\"./accessors.js\":\"bsUy0\",\"./hierarchy/index.js\":\"eiPwy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"coCqL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _indexJs = require(\"./hierarchy/index.js\");\nfunction defaultSeparation(a, b) {\n    return a.parent === b.parent ? 1 : 2;\n}\n// function radialSeparation(a, b) {\n//   return (a.parent === b.parent ? 1 : 2) / a.depth;\n// }\n// This function is used to traverse the left contour of a subtree (or\n// subforest). It returns the successor of v on this contour. This successor is\n// either given by the leftmost child of v or by the thread of v. The function\n// returns null if and only if v is on the highest level of its subtree.\nfunction nextLeft(v) {\n    var children = v.children;\n    return children ? children[0] : v.t;\n}\n// This function works analogously to nextLeft.\nfunction nextRight(v) {\n    var children = v.children;\n    return children ? children[children.length - 1] : v.t;\n}\n// Shifts the current subtree rooted at w+. This is done by increasing\n// prelim(w+) and mod(w+) by shift.\nfunction moveSubtree(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n}\n// All other shifts, applied to the smaller subtrees between w- and w+, are\n// performed by this function. To prepare the shifts, we have to adjust\n// change(w+), shift(w+), and change(w-).\nfunction executeShifts(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while(--i >= 0){\n        w = children[i];\n        w.z += shift;\n        w.m += shift;\n        shift += w.s + (change += w.c);\n    }\n}\n// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,\n// returns the specified (default) ancestor.\nfunction nextAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n}\nfunction TreeNode(node, i) {\n    this._ = node;\n    this.parent = null;\n    this.children = null;\n    this.A = null; // default ancestor\n    this.a = this; // ancestor\n    this.z = 0; // prelim\n    this.m = 0; // mod\n    this.c = 0; // change\n    this.s = 0; // shift\n    this.t = null; // thread\n    this.i = i; // number\n}\nTreeNode.prototype = Object.create((0, _indexJs.Node).prototype);\nfunction treeRoot(root) {\n    var tree = new TreeNode(root, 0), node, nodes = [\n        tree\n    ], child, children, i, n;\n    while(node = nodes.pop())if (children = node._.children) {\n        node.children = new Array(n = children.length);\n        for(i = n - 1; i >= 0; --i){\n            nodes.push(child = node.children[i] = new TreeNode(children[i], i));\n            child.parent = node;\n        }\n    }\n    (tree.parent = new TreeNode(null, 0)).children = [\n        tree\n    ];\n    return tree;\n}\n// Node-link tree diagram using the Reingold-Tilford \"tidy\" algorithm\nexports.default = function() {\n    var separation = defaultSeparation, dx = 1, dy = 1, nodeSize = null;\n    function tree(root) {\n        var t = treeRoot(root);\n        // Compute the layout using Buchheim et al.’s algorithm.\n        t.eachAfter(firstWalk), t.parent.m = -t.z;\n        t.eachBefore(secondWalk);\n        // If a fixed node size is specified, scale x and y.\n        if (nodeSize) root.eachBefore(sizeNode);\n        else {\n            var left = root, right = root, bottom = root;\n            root.eachBefore(function(node) {\n                if (node.x < left.x) left = node;\n                if (node.x > right.x) right = node;\n                if (node.depth > bottom.depth) bottom = node;\n            });\n            var s = left === right ? 1 : separation(left, right) / 2, tx = s - left.x, kx = dx / (right.x + s + tx), ky = dy / (bottom.depth || 1);\n            root.eachBefore(function(node) {\n                node.x = (node.x + tx) * kx;\n                node.y = node.depth * ky;\n            });\n        }\n        return root;\n    }\n    // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is\n    // applied recursively to the children of v, as well as the function\n    // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the\n    // node v is placed to the midpoint of its outermost children.\n    function firstWalk(v) {\n        var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n        if (children) {\n            executeShifts(v);\n            var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n            if (w) {\n                v.z = w.z + separation(v._, w._);\n                v.m = v.z - midpoint;\n            } else v.z = midpoint;\n        } else if (w) v.z = w.z + separation(v._, w._);\n        v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    // Computes all real x-coordinates by summing up the modifiers recursively.\n    function secondWalk(v) {\n        v._.x = v.z + v.parent.m;\n        v.m += v.parent.m;\n    }\n    // The core of the algorithm. Here, a new subtree is combined with the\n    // previous subtrees. Threads are used to traverse the inside and outside\n    // contours of the left and right subtree up to the highest common level. The\n    // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the\n    // superscript o means outside and i means inside, the subscript - means left\n    // subtree and + means right subtree. For summing up the modifiers along the\n    // contour, we use respective variables si+, si-, so-, and so+. Whenever two\n    // nodes of the inside contours conflict, we compute the left one of the\n    // greatest uncommon ancestors using the function ANCESTOR and call MOVE\n    // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.\n    // Finally, we add a new thread (if necessary).\n    function apportion(v, w, ancestor) {\n        if (w) {\n            var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n            while(vim = nextRight(vim), vip = nextLeft(vip), vim && vip){\n                vom = nextLeft(vom);\n                vop = nextRight(vop);\n                vop.a = v;\n                shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n                if (shift > 0) {\n                    moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n                    sip += shift;\n                    sop += shift;\n                }\n                sim += vim.m;\n                sip += vip.m;\n                som += vom.m;\n                sop += vop.m;\n            }\n            if (vim && !nextRight(vop)) {\n                vop.t = vim;\n                vop.m += sim - sop;\n            }\n            if (vip && !nextLeft(vom)) {\n                vom.t = vip;\n                vom.m += sip - som;\n                ancestor = v;\n            }\n        }\n        return ancestor;\n    }\n    function sizeNode(node) {\n        node.x *= dx;\n        node.y = node.depth * dy;\n    }\n    tree.separation = function(x) {\n        return arguments.length ? (separation = x, tree) : separation;\n    };\n    tree.size = function(x) {\n        return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : nodeSize ? null : [\n            dx,\n            dy\n        ];\n    };\n    tree.nodeSize = function(x) {\n        return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : nodeSize ? [\n            dx,\n            dy\n        ] : null;\n    };\n    return tree;\n};\n\n},{\"./hierarchy/index.js\":\"eiPwy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8QnJl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _roundJs = require(\"./round.js\");\nvar _roundJsDefault = parcelHelpers.interopDefault(_roundJs);\nvar _squarifyJs = require(\"./squarify.js\");\nvar _squarifyJsDefault = parcelHelpers.interopDefault(_squarifyJs);\nvar _accessorsJs = require(\"../accessors.js\");\nvar _constantJs = require(\"../constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nexports.default = function() {\n    var tile = (0, _squarifyJsDefault.default), round = false, dx = 1, dy = 1, paddingStack = [\n        0\n    ], paddingInner = (0, _constantJs.constantZero), paddingTop = (0, _constantJs.constantZero), paddingRight = (0, _constantJs.constantZero), paddingBottom = (0, _constantJs.constantZero), paddingLeft = (0, _constantJs.constantZero);\n    function treemap(root) {\n        root.x0 = root.y0 = 0;\n        root.x1 = dx;\n        root.y1 = dy;\n        root.eachBefore(positionNode);\n        paddingStack = [\n            0\n        ];\n        if (round) root.eachBefore((0, _roundJsDefault.default));\n        return root;\n    }\n    function positionNode(node) {\n        var p = paddingStack[node.depth], x0 = node.x0 + p, y0 = node.y0 + p, x1 = node.x1 - p, y1 = node.y1 - p;\n        if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n        if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n        node.x0 = x0;\n        node.y0 = y0;\n        node.x1 = x1;\n        node.y1 = y1;\n        if (node.children) {\n            p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n            x0 += paddingLeft(node) - p;\n            y0 += paddingTop(node) - p;\n            x1 -= paddingRight(node) - p;\n            y1 -= paddingBottom(node) - p;\n            if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n            if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n            tile(node, x0, y0, x1, y1);\n        }\n    }\n    treemap.round = function(x) {\n        return arguments.length ? (round = !!x, treemap) : round;\n    };\n    treemap.size = function(x) {\n        return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [\n            dx,\n            dy\n        ];\n    };\n    treemap.tile = function(x) {\n        return arguments.length ? (tile = (0, _accessorsJs.required)(x), treemap) : tile;\n    };\n    treemap.padding = function(x) {\n        return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();\n    };\n    treemap.paddingInner = function(x) {\n        return arguments.length ? (paddingInner = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingInner;\n    };\n    treemap.paddingOuter = function(x) {\n        return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();\n    };\n    treemap.paddingTop = function(x) {\n        return arguments.length ? (paddingTop = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingTop;\n    };\n    treemap.paddingRight = function(x) {\n        return arguments.length ? (paddingRight = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingRight;\n    };\n    treemap.paddingBottom = function(x) {\n        return arguments.length ? (paddingBottom = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingBottom;\n    };\n    treemap.paddingLeft = function(x) {\n        return arguments.length ? (paddingLeft = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingLeft;\n    };\n    return treemap;\n};\n\n},{\"./round.js\":\"i9GYz\",\"./squarify.js\":\"l99lF\",\"../accessors.js\":\"bsUy0\",\"../constant.js\":\"e122v\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l99lF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"phi\", ()=>phi);\nparcelHelpers.export(exports, \"squarifyRatio\", ()=>squarifyRatio);\nvar _diceJs = require(\"./dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nvar _sliceJs = require(\"./slice.js\");\nvar _sliceJsDefault = parcelHelpers.interopDefault(_sliceJs);\nvar phi = (1 + Math.sqrt(5)) / 2;\nfunction squarifyRatio(ratio, parent, x0, y0, x1, y1) {\n    var rows = [], nodes = parent.children, row, nodeValue, i0 = 0, i1 = 0, n = nodes.length, dx, dy, value = parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta;\n    while(i0 < n){\n        dx = x1 - x0, dy = y1 - y0;\n        // Find the next non-empty node.\n        do sumValue = nodes[i1++].value;\n        while (!sumValue && i1 < n);\n        minValue = maxValue = sumValue;\n        alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\n        beta = sumValue * sumValue * alpha;\n        minRatio = Math.max(maxValue / beta, beta / minValue);\n        // Keep adding nodes while the aspect ratio maintains or improves.\n        for(; i1 < n; ++i1){\n            sumValue += nodeValue = nodes[i1].value;\n            if (nodeValue < minValue) minValue = nodeValue;\n            if (nodeValue > maxValue) maxValue = nodeValue;\n            beta = sumValue * sumValue * alpha;\n            newRatio = Math.max(maxValue / beta, beta / minValue);\n            if (newRatio > minRatio) {\n                sumValue -= nodeValue;\n                break;\n            }\n            minRatio = newRatio;\n        }\n        // Position and record the row orientation.\n        rows.push(row = {\n            value: sumValue,\n            dice: dx < dy,\n            children: nodes.slice(i0, i1)\n        });\n        if (row.dice) (0, _diceJsDefault.default)(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);\n        else (0, _sliceJsDefault.default)(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\n        value -= sumValue, i0 = i1;\n    }\n    return rows;\n}\nexports.default = function custom(ratio) {\n    function squarify(parent, x0, y0, x1, y1) {\n        squarifyRatio(ratio, parent, x0, y0, x1, y1);\n    }\n    squarify.ratio = function(x) {\n        return custom((x = +x) > 1 ? x : 1);\n    };\n    return squarify;\n}(phi);\n\n},{\"./dice.js\":\"715Ix\",\"./slice.js\":\"8Sw28\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8Sw28\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(parent, x0, y0, x1, y1) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (y1 - y0) / parent.value;\n    while(++i < n){\n        node = nodes[i], node.x0 = x0, node.x1 = x1;\n        node.y0 = y0, node.y1 = y0 += node.value * k;\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ZVIw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(parent, x01, y01, x11, y11) {\n    var nodes = parent.children, i1, n = nodes.length, sum, sums = new Array(n + 1);\n    for(sums[0] = sum = i1 = 0; i1 < n; ++i1)sums[i1 + 1] = sum += nodes[i1].value;\n    partition(0, n, parent.value, x01, y01, x11, y11);\n    function partition(i, j, value, x0, y0, x1, y1) {\n        if (i >= j - 1) {\n            var node = nodes[i];\n            node.x0 = x0, node.y0 = y0;\n            node.x1 = x1, node.y1 = y1;\n            return;\n        }\n        var valueOffset = sums[i], valueTarget = value / 2 + valueOffset, k = i + 1, hi = j - 1;\n        while(k < hi){\n            var mid = k + hi >>> 1;\n            if (sums[mid] < valueTarget) k = mid + 1;\n            else hi = mid;\n        }\n        if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i + 1 < k) --k;\n        var valueLeft = sums[k] - valueOffset, valueRight = value - valueLeft;\n        if (x1 - x0 > y1 - y0) {\n            var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1;\n            partition(i, k, valueLeft, x0, y0, xk, y1);\n            partition(k, j, valueRight, xk, y0, x1, y1);\n        } else {\n            var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1;\n            partition(i, k, valueLeft, x0, y0, x1, yk);\n            partition(k, j, valueRight, x0, yk, x1, y1);\n        }\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eNLWs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _diceJs = require(\"./dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nvar _sliceJs = require(\"./slice.js\");\nvar _sliceJsDefault = parcelHelpers.interopDefault(_sliceJs);\nexports.default = function(parent, x0, y0, x1, y1) {\n    (parent.depth & 1 ? (0, _sliceJsDefault.default) : (0, _diceJsDefault.default))(parent, x0, y0, x1, y1);\n};\n\n},{\"./dice.js\":\"715Ix\",\"./slice.js\":\"8Sw28\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jjXCy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _diceJs = require(\"./dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nvar _sliceJs = require(\"./slice.js\");\nvar _sliceJsDefault = parcelHelpers.interopDefault(_sliceJs);\nvar _squarifyJs = require(\"./squarify.js\");\nexports.default = function custom(ratio) {\n    function resquarify(parent, x0, y0, x1, y1) {\n        if ((rows = parent._squarify) && rows.ratio === ratio) {\n            var rows, row, nodes, i, j = -1, n, m = rows.length, value = parent.value;\n            while(++j < m){\n                row = rows[j], nodes = row.children;\n                for(i = row.value = 0, n = nodes.length; i < n; ++i)row.value += nodes[i].value;\n                if (row.dice) (0, _diceJsDefault.default)(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1);\n                else (0, _sliceJsDefault.default)(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1);\n                value -= row.value;\n            }\n        } else {\n            parent._squarify = rows = (0, _squarifyJs.squarifyRatio)(ratio, parent, x0, y0, x1, y1);\n            rows.ratio = ratio;\n        }\n    }\n    resquarify.ratio = function(x) {\n        return custom((x = +x) > 1 ? x : 1);\n    };\n    return resquarify;\n}((0, _squarifyJs.phi));\n\n},{\"./dice.js\":\"715Ix\",\"./slice.js\":\"8Sw28\",\"./squarify.js\":\"l99lF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1Rqgb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"label\", ()=>Label);\nvar _vegaCanvas = require(\"vega-canvas\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nvar _vegaUtil = require(\"vega-util\");\nconst ALPHA_MASK = 0xff000000; // alpha value equivalent to opacity 0.0625\nconst INSIDE_OPACITY_IN_ALPHA = 0x10000000;\nconst INSIDE_OPACITY = 0.0625;\nfunction baseBitmaps($, data) {\n    const bitmap = $.bitmap(); // when there is no base mark but data points are to be avoided\n    (data || []).forEach((d)=>bitmap.set($(d.boundary[0]), $(d.boundary[3])));\n    return [\n        bitmap,\n        undefined\n    ];\n}\nfunction markBitmaps($, avoidMarks, labelInside, isGroupArea) {\n    // create canvas\n    const width = $.width, height = $.height, border = labelInside || isGroupArea, context = (0, _vegaCanvas.canvas)(width, height).getContext(\"2d\"); // render all marks to be avoided into canvas\n    avoidMarks.forEach((items)=>draw(context, items, border)); // get canvas buffer, create bitmaps\n    const buffer = new Uint32Array(context.getImageData(0, 0, width, height).data.buffer), layer1 = $.bitmap(), layer2 = border && $.bitmap(); // populate bitmap layers\n    let x, y, u, v, alpha;\n    for(y = 0; y < height; ++y)for(x = 0; x < width; ++x){\n        alpha = buffer[y * width + x] & ALPHA_MASK;\n        if (alpha) {\n            u = $(x);\n            v = $(y);\n            if (!isGroupArea) layer1.set(u, v); // update interior bitmap\n            if (border && alpha ^ INSIDE_OPACITY_IN_ALPHA) layer2.set(u, v); // update border bitmap\n        }\n    }\n    return [\n        layer1,\n        layer2\n    ];\n}\nfunction draw(context, items, interior) {\n    if (!items.length) return;\n    const type = items[0].mark.marktype;\n    if (type === \"group\") items.forEach((group)=>{\n        group.items.forEach((mark)=>draw(context, mark.items, interior));\n    });\n    else (0, _vegaScenegraph.Marks)[type].draw(context, {\n        items: interior ? items.map(prepare) : items\n    });\n}\n/**\n * Prepare item before drawing into canvas (setting stroke and opacity)\n * @param {object} source item to be prepared\n * @returns prepared item\n */ function prepare(source) {\n    const item = (0, _vegaDataflow.rederive)(source, {});\n    if (item.stroke) item.strokeOpacity = 1;\n    if (item.fill) {\n        item.fillOpacity = INSIDE_OPACITY;\n        item.stroke = \"#000\";\n        item.strokeOpacity = 1;\n        item.strokeWidth = 2;\n    }\n    return item;\n}\nconst DIV = 5, // bit shift from x, y index to bit vector array index\nMOD = 31, // bit mask for index lookup within a bit vector\nSIZE = 32, // individual bit vector size\nRIGHT0 = new Uint32Array(SIZE + 1), // left-anchored bit vectors, full -> 0\nRIGHT1 = new Uint32Array(SIZE + 1); // right-anchored bit vectors, 0 -> full\nRIGHT1[0] = 0;\nRIGHT0[0] = ~RIGHT1[0];\nfor(let i = 1; i <= SIZE; ++i){\n    RIGHT1[i] = RIGHT1[i - 1] << 1 | 1;\n    RIGHT0[i] = ~RIGHT1[i];\n}\nfunction Bitmap(w, h) {\n    const array = new Uint32Array(~~((w * h + SIZE) / SIZE));\n    function _set(index, mask) {\n        array[index] |= mask;\n    }\n    function _clear(index, mask) {\n        array[index] &= mask;\n    }\n    return {\n        array: array,\n        get: (x, y)=>{\n            const index = y * w + x;\n            return array[index >>> DIV] & 1 << (index & MOD);\n        },\n        set: (x, y)=>{\n            const index = y * w + x;\n            _set(index >>> DIV, 1 << (index & MOD));\n        },\n        clear: (x, y)=>{\n            const index = y * w + x;\n            _clear(index >>> DIV, ~(1 << (index & MOD)));\n        },\n        getRange: (x, y, x2, y2)=>{\n            let r = y2, start, end, indexStart, indexEnd;\n            for(; r >= y; --r){\n                start = r * w + x;\n                end = r * w + x2;\n                indexStart = start >>> DIV;\n                indexEnd = end >>> DIV;\n                if (indexStart === indexEnd) {\n                    if (array[indexStart] & RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]) return true;\n                } else {\n                    if (array[indexStart] & RIGHT0[start & MOD]) return true;\n                    if (array[indexEnd] & RIGHT1[(end & MOD) + 1]) return true;\n                    for(let i1 = indexStart + 1; i1 < indexEnd; ++i1){\n                        if (array[i1]) return true;\n                    }\n                }\n            }\n            return false;\n        },\n        setRange: (x, y, x2, y2)=>{\n            let start, end, indexStart, indexEnd, i2;\n            for(; y <= y2; ++y){\n                start = y * w + x;\n                end = y * w + x2;\n                indexStart = start >>> DIV;\n                indexEnd = end >>> DIV;\n                if (indexStart === indexEnd) _set(indexStart, RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]);\n                else {\n                    _set(indexStart, RIGHT0[start & MOD]);\n                    _set(indexEnd, RIGHT1[(end & MOD) + 1]);\n                    for(i2 = indexStart + 1; i2 < indexEnd; ++i2)_set(i2, 0xffffffff);\n                }\n            }\n        },\n        clearRange: (x, y, x2, y2)=>{\n            let start, end, indexStart, indexEnd, i3;\n            for(; y <= y2; ++y){\n                start = y * w + x;\n                end = y * w + x2;\n                indexStart = start >>> DIV;\n                indexEnd = end >>> DIV;\n                if (indexStart === indexEnd) _clear(indexStart, RIGHT1[start & MOD] | RIGHT0[(end & MOD) + 1]);\n                else {\n                    _clear(indexStart, RIGHT1[start & MOD]);\n                    _clear(indexEnd, RIGHT0[(end & MOD) + 1]);\n                    for(i3 = indexStart + 1; i3 < indexEnd; ++i3)_clear(i3, 0);\n                }\n            }\n        },\n        outOfBounds: (x, y, x2, y2)=>x < 0 || y < 0 || y2 >= h || x2 >= w\n    };\n}\nfunction scaler(width, height, padding) {\n    const ratio = Math.max(1, Math.sqrt(width * height / 1e6)), w = ~~((width + 2 * padding + ratio) / ratio), h = ~~((height + 2 * padding + ratio) / ratio), scale = (_)=>~~((_ + padding) / ratio);\n    scale.invert = (_)=>_ * ratio - padding;\n    scale.bitmap = ()=>Bitmap(w, h);\n    scale.ratio = ratio;\n    scale.padding = padding;\n    scale.width = width;\n    scale.height = height;\n    return scale;\n}\nfunction placeAreaLabelNaive($, bitmaps, avoidBaseMark, markIndex) {\n    const width = $.width, height = $.height; // try to place a label within an input area mark\n    return function(d) {\n        const items = d.datum.datum.items[markIndex].items, // area points\n        n = items.length, // number of points\n        textHeight = d.datum.fontSize, // label width\n        textWidth = (0, _vegaScenegraph.textMetrics).width(d.datum, d.datum.text); // label height\n        let maxAreaWidth = 0, x1, x2, y1, y2, x, y, areaWidth; // for each area sample point\n        for(let i4 = 0; i4 < n; ++i4){\n            x1 = items[i4].x;\n            y1 = items[i4].y;\n            x2 = items[i4].x2 === undefined ? x1 : items[i4].x2;\n            y2 = items[i4].y2 === undefined ? y1 : items[i4].y2;\n            x = (x1 + x2) / 2;\n            y = (y1 + y2) / 2;\n            areaWidth = Math.abs(x2 - x1 + y2 - y1);\n            if (areaWidth >= maxAreaWidth) {\n                maxAreaWidth = areaWidth;\n                d.x = x;\n                d.y = y;\n            }\n        }\n        x = textWidth / 2;\n        y = textHeight / 2;\n        x1 = d.x - x;\n        x2 = d.x + x;\n        y1 = d.y - y;\n        y2 = d.y + y;\n        d.align = \"center\";\n        if (x1 < 0 && x2 <= width) d.align = \"left\";\n        else if (0 <= x1 && width < x2) d.align = \"right\";\n        d.baseline = \"middle\";\n        if (y1 < 0 && y2 <= height) d.baseline = \"top\";\n        else if (0 <= y1 && height < y2) d.baseline = \"bottom\";\n        return true;\n    };\n}\nfunction outOfBounds(x, y, textWidth, textHeight, width, height) {\n    let r = textWidth / 2;\n    return x - r < 0 || x + r > width || y - (r = textHeight / 2) < 0 || y + r > height;\n}\nfunction collision($, x, y, textHeight, textWidth, h, bm0, bm1) {\n    const w = textWidth * h / (textHeight * 2), x1 = $(x - w), x2 = $(x + w), y1 = $(y - (h = h / 2)), y2 = $(y + h);\n    return bm0.outOfBounds(x1, y1, x2, y2) || bm0.getRange(x1, y1, x2, y2) || bm1 && bm1.getRange(x1, y1, x2, y2);\n}\nfunction placeAreaLabelReducedSearch($, bitmaps, avoidBaseMark, markIndex) {\n    const width = $.width, height = $.height, bm0 = bitmaps[0], // where labels have been placed\n    bm1 = bitmaps[1]; // area outlines\n    function tryLabel(_x, _y, maxSize, textWidth, textHeight) {\n        const x = $.invert(_x), y = $.invert(_y);\n        let lo = maxSize, hi = height, mid;\n        if (!outOfBounds(x, y, textWidth, textHeight, width, height) && !collision($, x, y, textHeight, textWidth, lo, bm0, bm1) && !collision($, x, y, textHeight, textWidth, textHeight, bm0, null)) {\n            // if the label fits at the current sample point,\n            // perform binary search to find the largest font size that fits\n            while(hi - lo >= 1){\n                mid = (lo + hi) / 2;\n                if (collision($, x, y, textHeight, textWidth, mid, bm0, bm1)) hi = mid;\n                else lo = mid;\n            } // place label if current lower bound exceeds prior max font size\n            if (lo > maxSize) return [\n                x,\n                y,\n                lo,\n                true\n            ];\n        }\n    } // try to place a label within an input area mark\n    return function(d) {\n        const items = d.datum.datum.items[markIndex].items, // area points\n        n = items.length, // number of points\n        textHeight = d.datum.fontSize, // label width\n        textWidth = (0, _vegaScenegraph.textMetrics).width(d.datum, d.datum.text); // label height\n        let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x1, x2, y1, y2, x, y, _x, _y, _x1, _xMid, _x2, _y1, _yMid, _y2, areaWidth, result, swapTmp; // for each area sample point\n        for(let i5 = 0; i5 < n; ++i5){\n            x1 = items[i5].x;\n            y1 = items[i5].y;\n            x2 = items[i5].x2 === undefined ? x1 : items[i5].x2;\n            y2 = items[i5].y2 === undefined ? y1 : items[i5].y2;\n            if (x1 > x2) {\n                swapTmp = x1;\n                x1 = x2;\n                x2 = swapTmp;\n            }\n            if (y1 > y2) {\n                swapTmp = y1;\n                y1 = y2;\n                y2 = swapTmp;\n            }\n            _x1 = $(x1);\n            _x2 = $(x2);\n            _xMid = ~~((_x1 + _x2) / 2);\n            _y1 = $(y1);\n            _y2 = $(y2);\n            _yMid = ~~((_y1 + _y2) / 2); // search along the line from mid point between the 2 border to lower border\n            for(_x = _xMid; _x >= _x1; --_x)for(_y = _yMid; _y >= _y1; --_y){\n                result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n                if (result) [d.x, d.y, maxSize, labelPlaced] = result;\n            }\n             // search along the line from mid point between the 2 border to upper border\n            for(_x = _xMid; _x <= _x2; ++_x)for(_y = _yMid; _y <= _y2; ++_y){\n                result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n                if (result) [d.x, d.y, maxSize, labelPlaced] = result;\n            }\n             // place label at slice center if not placed through other means\n            // and if we're not avoiding overlap with other areas\n            if (!labelPlaced && !avoidBaseMark) {\n                // one span is zero, hence we can add\n                areaWidth = Math.abs(x2 - x1 + y2 - y1);\n                x = (x1 + x2) / 2;\n                y = (y1 + y2) / 2; // place label if it fits and improves the max area width\n                if (areaWidth >= maxAreaWidth && !outOfBounds(x, y, textWidth, textHeight, width, height) && !collision($, x, y, textHeight, textWidth, textHeight, bm0, null)) {\n                    maxAreaWidth = areaWidth;\n                    d.x = x;\n                    d.y = y;\n                    labelPlaced2 = true;\n                }\n            }\n        } // record current label placement information, update label bitmap\n        if (labelPlaced || labelPlaced2) {\n            x = textWidth / 2;\n            y = textHeight / 2;\n            bm0.setRange($(d.x - x), $(d.y - y), $(d.x + x), $(d.y + y));\n            d.align = \"center\";\n            d.baseline = \"middle\";\n            return true;\n        } else return false;\n    };\n}\nconst X_DIR = [\n    -1,\n    -1,\n    1,\n    1\n];\nconst Y_DIR = [\n    -1,\n    1,\n    -1,\n    1\n];\nfunction placeAreaLabelFloodFill($, bitmaps, avoidBaseMark, markIndex) {\n    const width = $.width, height = $.height, bm0 = bitmaps[0], // where labels have been placed\n    bm1 = bitmaps[1], // area outlines\n    bm2 = $.bitmap(); // flood-fill visitations\n    // try to place a label within an input area mark\n    return function(d) {\n        const items = d.datum.datum.items[markIndex].items, // area points\n        n = items.length, // number of points\n        textHeight = d.datum.fontSize, // label width\n        textWidth = (0, _vegaScenegraph.textMetrics).width(d.datum, d.datum.text), // label height\n        stack = []; // flood fill stack\n        let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x1, x2, y1, y2, x, y, _x, _y, lo, hi, mid, areaWidth; // for each area sample point\n        for(let i6 = 0; i6 < n; ++i6){\n            x1 = items[i6].x;\n            y1 = items[i6].y;\n            x2 = items[i6].x2 === undefined ? x1 : items[i6].x2;\n            y2 = items[i6].y2 === undefined ? y1 : items[i6].y2; // add scaled center point to stack\n            stack.push([\n                $((x1 + x2) / 2),\n                $((y1 + y2) / 2)\n            ]); // perform flood fill, visit points\n            while(stack.length){\n                [_x, _y] = stack.pop(); // exit if point already marked\n                if (bm0.get(_x, _y) || bm1.get(_x, _y) || bm2.get(_x, _y)) continue; // mark point in flood fill bitmap\n                // add search points for all (in bound) directions\n                bm2.set(_x, _y);\n                for(let j = 0; j < 4; ++j){\n                    x = _x + X_DIR[j];\n                    y = _y + Y_DIR[j];\n                    if (!bm2.outOfBounds(x, y, x, y)) stack.push([\n                        x,\n                        y\n                    ]);\n                } // unscale point back to x, y space\n                x = $.invert(_x);\n                y = $.invert(_y);\n                lo = maxSize;\n                hi = height; // TODO: make this bound smaller\n                if (!outOfBounds(x, y, textWidth, textHeight, width, height) && !collision($, x, y, textHeight, textWidth, lo, bm0, bm1) && !collision($, x, y, textHeight, textWidth, textHeight, bm0, null)) {\n                    // if the label fits at the current sample point,\n                    // perform binary search to find the largest font size that fits\n                    while(hi - lo >= 1){\n                        mid = (lo + hi) / 2;\n                        if (collision($, x, y, textHeight, textWidth, mid, bm0, bm1)) hi = mid;\n                        else lo = mid;\n                    } // place label if current lower bound exceeds prior max font size\n                    if (lo > maxSize) {\n                        d.x = x;\n                        d.y = y;\n                        maxSize = lo;\n                        labelPlaced = true;\n                    }\n                }\n            } // place label at slice center if not placed through other means\n            // and if we're not avoiding overlap with other areas\n            if (!labelPlaced && !avoidBaseMark) {\n                // one span is zero, hence we can add\n                areaWidth = Math.abs(x2 - x1 + y2 - y1);\n                x = (x1 + x2) / 2;\n                y = (y1 + y2) / 2; // place label if it fits and improves the max area width\n                if (areaWidth >= maxAreaWidth && !outOfBounds(x, y, textWidth, textHeight, width, height) && !collision($, x, y, textHeight, textWidth, textHeight, bm0, null)) {\n                    maxAreaWidth = areaWidth;\n                    d.x = x;\n                    d.y = y;\n                    labelPlaced2 = true;\n                }\n            }\n        } // record current label placement information, update label bitmap\n        if (labelPlaced || labelPlaced2) {\n            x = textWidth / 2;\n            y = textHeight / 2;\n            bm0.setRange($(d.x - x), $(d.y - y), $(d.x + x), $(d.y + y));\n            d.align = \"center\";\n            d.baseline = \"middle\";\n            return true;\n        } else return false;\n    };\n}\nconst Aligns = [\n    \"right\",\n    \"center\",\n    \"left\"\n], Baselines = [\n    \"bottom\",\n    \"middle\",\n    \"top\"\n];\nfunction placeMarkLabel($, bitmaps, anchors, offsets) {\n    const width = $.width, height = $.height, bm0 = bitmaps[0], bm1 = bitmaps[1], n = offsets.length;\n    return function(d) {\n        const boundary = d.boundary, textHeight = d.datum.fontSize; // can not be placed if the mark is not visible in the graph bound\n        if (boundary[2] < 0 || boundary[5] < 0 || boundary[0] > width || boundary[3] > height) return false;\n        let textWidth = 0, dx, dy, isInside, sizeFactor, insideFactor, x1, x2, y1, y2, xc, yc, _x1, _x2, _y1, _y2; // for each anchor and offset\n        for(let i7 = 0; i7 < n; ++i7){\n            dx = (anchors[i7] & 0x3) - 1;\n            dy = (anchors[i7] >>> 0x2 & 0x3) - 1;\n            isInside = dx === 0 && dy === 0 || offsets[i7] < 0;\n            sizeFactor = dx && dy ? Math.SQRT1_2 : 1;\n            insideFactor = offsets[i7] < 0 ? -1 : 1;\n            x1 = boundary[1 + dx] + offsets[i7] * dx * sizeFactor;\n            yc = boundary[4 + dy] + insideFactor * textHeight * dy / 2 + offsets[i7] * dy * sizeFactor;\n            y1 = yc - textHeight / 2;\n            y2 = yc + textHeight / 2;\n            _x1 = $(x1);\n            _y1 = $(y1);\n            _y2 = $(y2);\n            if (!textWidth) {\n                // to avoid finding width of text label,\n                if (!test(_x1, _x1, _y1, _y2, bm0, bm1, x1, x1, y1, y2, boundary, isInside)) continue;\n                else // Otherwise, find the label width\n                textWidth = (0, _vegaScenegraph.textMetrics).width(d.datum, d.datum.text);\n            }\n            xc = x1 + insideFactor * textWidth * dx / 2;\n            x1 = xc - textWidth / 2;\n            x2 = xc + textWidth / 2;\n            _x1 = $(x1);\n            _x2 = $(x2);\n            if (test(_x1, _x2, _y1, _y2, bm0, bm1, x1, x2, y1, y2, boundary, isInside)) {\n                // place label if the position is placeable\n                d.x = !dx ? xc : dx * insideFactor < 0 ? x2 : x1;\n                d.y = !dy ? yc : dy * insideFactor < 0 ? y2 : y1;\n                d.align = Aligns[dx * insideFactor + 1];\n                d.baseline = Baselines[dy * insideFactor + 1];\n                bm0.setRange(_x1, _y1, _x2, _y2);\n                return true;\n            }\n        }\n        return false;\n    };\n} // Test if a label with the given dimensions can be added without overlap\nfunction test(_x1, _x2, _y1, _y2, bm0, bm1, x1, x2, y1, y2, boundary, isInside) {\n    return !(bm0.outOfBounds(_x1, _y1, _x2, _y2) || (isInside && bm1 ? bm1.getRange(_x1, _y1, _x2, _y2) || !isInMarkBound(x1, y1, x2, y2, boundary) : bm0.getRange(_x1, _y1, _x2, _y2)));\n}\nfunction isInMarkBound(x1, y1, x2, y2, boundary) {\n    return boundary[0] <= x1 && x2 <= boundary[2] && boundary[3] <= y1 && y2 <= boundary[5];\n}\nconst TOP = 0x0, MIDDLE = 0x4, BOTTOM = 0x8, LEFT = 0x0, CENTER = 0x1, RIGHT = 0x2; // Mapping from text anchor to number representation\nconst anchorCode = {\n    \"top-left\": TOP + LEFT,\n    \"top\": TOP + CENTER,\n    \"top-right\": TOP + RIGHT,\n    \"left\": MIDDLE + LEFT,\n    \"middle\": MIDDLE + CENTER,\n    \"right\": MIDDLE + RIGHT,\n    \"bottom-left\": BOTTOM + LEFT,\n    \"bottom\": BOTTOM + CENTER,\n    \"bottom-right\": BOTTOM + RIGHT\n};\nconst placeAreaLabel = {\n    \"naive\": placeAreaLabelNaive,\n    \"reduced-search\": placeAreaLabelReducedSearch,\n    \"floodfill\": placeAreaLabelFloodFill\n};\nfunction labelLayout(texts, size, compare, offset, anchor, avoidMarks, avoidBaseMark, lineAnchor, markIndex, padding, method) {\n    // early exit for empty data\n    if (!texts.length) return texts;\n    const positions = Math.max(offset.length, anchor.length), offsets = getOffsets(offset, positions), anchors = getAnchors(anchor, positions), marktype = markType(texts[0].datum), grouptype = marktype === \"group\" && texts[0].datum.items[markIndex].marktype, isGroupArea = grouptype === \"area\", boundary = markBoundary(marktype, grouptype, lineAnchor, markIndex), $ = scaler(size[0], size[1], padding), isNaiveGroupArea = isGroupArea && method === \"naive\"; // prepare text mark data for placing\n    const data = texts.map((d)=>({\n            datum: d,\n            opacity: 0,\n            x: undefined,\n            y: undefined,\n            align: undefined,\n            baseline: undefined,\n            boundary: boundary(d)\n        }));\n    let bitmaps;\n    if (!isNaiveGroupArea) {\n        // sort labels in priority order, if comparator is provided\n        if (compare) data.sort((a, b)=>compare(a.datum, b.datum));\n         // flag indicating if label can be placed inside its base mark\n        let labelInside = false;\n        for(let i8 = 0; i8 < anchors.length && !labelInside; ++i8)// label inside if anchor is at center\n        // label inside if offset to be inside the mark bound\n        labelInside = anchors[i8] === 0x5 || offsets[i8] < 0;\n         // extract data information from base mark when base mark is to be avoided\n        // base mark is implicitly avoided if it is a group area\n        if (marktype && (avoidBaseMark || isGroupArea)) avoidMarks = [\n            texts.map((d)=>d.datum)\n        ].concat(avoidMarks);\n         // generate bitmaps for layout calculation\n        bitmaps = avoidMarks.length ? markBitmaps($, avoidMarks, labelInside, isGroupArea) : baseBitmaps($, avoidBaseMark && data);\n    } // generate label placement function\n    const place = isGroupArea ? placeAreaLabel[method]($, bitmaps, avoidBaseMark, markIndex) : placeMarkLabel($, bitmaps, anchors, offsets); // place all labels\n    data.forEach((d)=>d.opacity = +place(d));\n    return data;\n}\nfunction getOffsets(_, count) {\n    const offsets = new Float64Array(count), n = _.length;\n    for(let i10 = 0; i10 < n; ++i10)offsets[i10] = _[i10] || 0;\n    for(let i9 = n; i9 < count; ++i9)offsets[i9] = offsets[n - 1];\n    return offsets;\n}\nfunction getAnchors(_, count) {\n    const anchors = new Int8Array(count), n = _.length;\n    for(let i12 = 0; i12 < n; ++i12)anchors[i12] |= anchorCode[_[i12]];\n    for(let i11 = n; i11 < count; ++i11)anchors[i11] = anchors[n - 1];\n    return anchors;\n}\nfunction markType(item) {\n    return item && item.mark && item.mark.marktype;\n}\n/**\n * Factory function for function for getting base mark boundary, depending\n * on mark and group type. When mark type is undefined, line or area: boundary\n * is the coordinate of each data point. When base mark is grouped line,\n * boundary is either at the beginning or end of the line depending on the\n * value of lineAnchor. Otherwise, use bounds of base mark.\n */ function markBoundary(marktype, grouptype, lineAnchor, markIndex) {\n    const xy = (d)=>[\n            d.x,\n            d.x,\n            d.x,\n            d.y,\n            d.y,\n            d.y\n        ];\n    if (!marktype) return xy; // no reactive geometry\n    else if (marktype === \"line\" || marktype === \"area\") return (d)=>xy(d.datum);\n    else if (grouptype === \"line\") return (d)=>{\n        const items = d.datum.items[markIndex].items;\n        return xy(items.length ? items[lineAnchor === \"start\" ? 0 : items.length - 1] : {\n            x: NaN,\n            y: NaN\n        });\n    };\n    else return (d)=>{\n        const b = d.datum.bounds;\n        return [\n            b.x1,\n            (b.x1 + b.x2) / 2,\n            b.x2,\n            b.y1,\n            (b.y1 + b.y2) / 2,\n            b.y2\n        ];\n    };\n}\nconst Output = [\n    \"x\",\n    \"y\",\n    \"opacity\",\n    \"align\",\n    \"baseline\"\n];\nconst Anchors = [\n    \"top-left\",\n    \"left\",\n    \"bottom-left\",\n    \"top\",\n    \"bottom\",\n    \"top-right\",\n    \"right\",\n    \"bottom-right\"\n];\n/**\n * Compute text label layout to annotate marks.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<number>} params.size - The size of the layout, provided as a [width, height] array.\n * @param {function(*,*): number} [params.sort] - An optional\n *   comparator function for sorting label data in priority order.\n * @param {Array<string>} [params.anchor] - Label anchor points relative to the base mark bounding box.\n *   The available options are 'top-left', 'left', 'bottom-left', 'top',\n *   'bottom', 'top-right', 'right', 'bottom-right', 'middle'.\n * @param {Array<number>} [params.offset] - Label offsets (in pixels) from the base mark bounding box.\n *   This parameter  is parallel to the list of anchor points.\n * @param {number} [params.padding=0] - The amount (in pixels) that a label may exceed the layout size.\n * @param {string} [params.lineAnchor='end'] - For group line mark labels only, indicates the anchor\n *   position for labels. One of 'start' or 'end'.\n * @param {string} [params.markIndex=0] - For group mark labels only, an index indicating\n *   which mark within the group should be labeled.\n * @param {Array<number>} [params.avoidMarks] - A list of additional mark names for which the label\n *   layout should avoid overlap.\n * @param {boolean} [params.avoidBaseMark=true] - Boolean flag indicating if labels should avoid\n *   overlap with the underlying base mark being labeled.\n * @param {string} [params.method='naive'] - For area make labels only, a method for\n *   place labels. One of 'naive', 'reduced-search', or 'floodfill'.\n * @param {Array<string>} [params.as] - The output fields written by the transform.\n *   The default is ['x', 'y', 'opacity', 'align', 'baseline'].\n */ function Label(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nLabel.Definition = {\n    type: \"Label\",\n    metadata: {\n        modifies: true\n    },\n    params: [\n        {\n            name: \"size\",\n            type: \"number\",\n            array: true,\n            length: 2,\n            required: true\n        },\n        {\n            name: \"sort\",\n            type: \"compare\"\n        },\n        {\n            name: \"anchor\",\n            type: \"string\",\n            array: true,\n            default: Anchors\n        },\n        {\n            name: \"offset\",\n            type: \"number\",\n            array: true,\n            default: [\n                1\n            ]\n        },\n        {\n            name: \"padding\",\n            type: \"number\",\n            default: 0\n        },\n        {\n            name: \"lineAnchor\",\n            type: \"string\",\n            values: [\n                \"start\",\n                \"end\"\n            ],\n            default: \"end\"\n        },\n        {\n            name: \"markIndex\",\n            type: \"number\",\n            default: 0\n        },\n        {\n            name: \"avoidBaseMark\",\n            type: \"boolean\",\n            default: true\n        },\n        {\n            name: \"avoidMarks\",\n            type: \"data\",\n            array: true\n        },\n        {\n            name: \"method\",\n            type: \"string\",\n            default: \"naive\"\n        },\n        {\n            name: \"as\",\n            type: \"string\",\n            array: true,\n            length: Output.length,\n            default: Output\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Label, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        function modp(param) {\n            const p = _[param];\n            return (0, _vegaUtil.isFunction)(p) && pulse.modified(p.fields);\n        }\n        const mod = _.modified();\n        if (!(mod || pulse.changed(pulse.ADD_REM) || modp(\"sort\"))) return;\n        if (!_.size || _.size.length !== 2) (0, _vegaUtil.error)(\"Size parameter should be specified as a [width, height] array.\");\n        const as = _.as || Output; // run label layout\n        labelLayout(pulse.materialize(pulse.SOURCE).source, _.size, _.sort, (0, _vegaUtil.array)(_.offset || 1), (0, _vegaUtil.array)(_.anchor || Anchors), _.avoidMarks || [], _.avoidBaseMark === false ? false : true, _.lineAnchor || \"end\", _.markIndex || 0, _.padding || 0, _.method || \"naive\").forEach((l)=>{\n            // write layout results to data stream\n            const t = l.datum;\n            t[as[0]] = l.x;\n            t[as[1]] = l.y;\n            t[as[2]] = l.opacity;\n            t[as[3]] = l.align;\n            t[as[4]] = l.baseline;\n        });\n        return pulse.reflow(mod).modifies(as);\n    }\n});\n\n},{\"vega-canvas\":\"7F0ce\",\"vega-dataflow\":\"4kvYg\",\"vega-scenegraph\":\"gIB0Z\",\"vega-util\":\"dPFAY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kvZot\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"loess\", ()=>Loess);\nparcelHelpers.export(exports, \"regression\", ()=>Regression);\nvar _vegaStatistics = require(\"vega-statistics\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nfunction partition(data, groupby) {\n    var groups = [], get = function(f) {\n        return f(t);\n    }, map, i, n, t, k, g; // partition data points into stack groups\n    if (groupby == null) groups.push(data);\n    else for(map = {}, i = 0, n = data.length; i < n; ++i){\n        t = data[i];\n        k = groupby.map(get);\n        g = map[k];\n        if (!g) {\n            map[k] = g = [];\n            g.dims = k;\n            groups.push(g);\n        }\n        g.push(t);\n    }\n    return groups;\n}\n/**\n * Compute locally-weighted regression fits for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.x - An accessor for the predictor data field.\n * @param {function(object): *} params.y - An accessor for the predicted data field.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {number} [params.bandwidth=0.3] - The loess bandwidth.\n */ function Loess(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nLoess.Definition = {\n    \"type\": \"Loess\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"bandwidth\",\n            \"type\": \"number\",\n            \"default\": 0.3\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Loess, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        if (!this.value || pulse.changed() || _.modified()) {\n            const source = pulse.materialize(pulse.SOURCE).source, groups = partition(source, _.groupby), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), m = names.length, as = _.as || [\n                (0, _vegaUtil.accessorName)(_.x),\n                (0, _vegaUtil.accessorName)(_.y)\n            ], values = [];\n            groups.forEach((g)=>{\n                (0, _vegaStatistics.regressionLoess)(g, _.x, _.y, _.bandwidth || 0.3).forEach((p)=>{\n                    const t = {};\n                    for(let i = 0; i < m; ++i)t[names[i]] = g.dims[i];\n                    t[as[0]] = p[0];\n                    t[as[1]] = p[1];\n                    values.push((0, _vegaDataflow.ingest)(t));\n                });\n            });\n            if (this.value) out.rem = this.value;\n            this.value = out.add = out.source = values;\n        }\n        return out;\n    }\n});\nconst Methods = {\n    linear: (0, _vegaStatistics.regressionLinear),\n    log: (0, _vegaStatistics.regressionLog),\n    exp: (0, _vegaStatistics.regressionExp),\n    pow: (0, _vegaStatistics.regressionPow),\n    quad: (0, _vegaStatistics.regressionQuad),\n    poly: (0, _vegaStatistics.regressionPoly)\n};\nconst degreesOfFreedom = (method, order)=>method === \"poly\" ? order : method === \"quad\" ? 2 : 1;\n/**\n * Compute regression fits for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.x - An accessor for the predictor data field.\n * @param {function(object): *} params.y - An accessor for the predicted data field.\n * @param {string} [params.method='linear'] - The regression method to apply.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {Array<number>} [params.extent] - The domain extent over which to plot the regression line.\n * @param {number} [params.order=3] - The polynomial order. Only applies to the 'poly' method.\n */ function Regression(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nRegression.Definition = {\n    \"type\": \"Regression\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"string\",\n            \"default\": \"linear\",\n            \"values\": Object.keys(Methods)\n        },\n        {\n            \"name\": \"order\",\n            \"type\": \"number\",\n            \"default\": 3\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"params\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Regression, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        if (!this.value || pulse.changed() || _.modified()) {\n            const source = pulse.materialize(pulse.SOURCE).source, groups = partition(source, _.groupby), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), method = _.method || \"linear\", order = _.order || 3, dof = degreesOfFreedom(method, order), as = _.as || [\n                (0, _vegaUtil.accessorName)(_.x),\n                (0, _vegaUtil.accessorName)(_.y)\n            ], fit = Methods[method], values = [];\n            let domain = _.extent;\n            if (!(0, _vegaUtil.hasOwnProperty)(Methods, method)) (0, _vegaUtil.error)(\"Invalid regression method: \" + method);\n            if (domain != null) {\n                if (method === \"log\" && domain[0] <= 0) {\n                    pulse.dataflow.warn(\"Ignoring extent with values <= 0 for log regression.\");\n                    domain = null;\n                }\n            }\n            groups.forEach((g)=>{\n                const n = g.length;\n                if (n <= dof) {\n                    pulse.dataflow.warn(\"Skipping regression with more parameters than data points.\");\n                    return;\n                }\n                const model = fit(g, _.x, _.y, order);\n                if (_.params) {\n                    // if parameter vectors requested return those\n                    values.push((0, _vegaDataflow.ingest)({\n                        keys: g.dims,\n                        coef: model.coef,\n                        rSquared: model.rSquared\n                    }));\n                    return;\n                }\n                const dom = domain || (0, _vegaUtil.extent)(g, _.x), add = (p)=>{\n                    const t = {};\n                    for(let i = 0; i < names.length; ++i)t[names[i]] = g.dims[i];\n                    t[as[0]] = p[0];\n                    t[as[1]] = p[1];\n                    values.push((0, _vegaDataflow.ingest)(t));\n                };\n                if (method === \"linear\") // for linear regression we only need the end points\n                dom.forEach((x)=>add([\n                        x,\n                        model.predict(x)\n                    ]));\n                else // otherwise return trend line sample points\n                (0, _vegaStatistics.sampleCurve)(model.predict, dom, 25, 200).forEach(add);\n            });\n            if (this.value) out.rem = this.value;\n            this.value = out.add = out.source = values;\n        }\n        return out;\n    }\n});\n\n},{\"vega-statistics\":\"hZmG3\",\"vega-dataflow\":\"4kvYg\",\"vega-util\":\"dPFAY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6qrVt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"voronoi\", ()=>Voronoi);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Delaunay = require(\"d3-delaunay\");\nfunction Voronoi(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nVoronoi.Definition = {\n    \"type\": \"Voronoi\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                [\n                    -100000,\n                    -100000\n                ],\n                [\n                    1e5,\n                    1e5\n                ]\n            ],\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"path\"\n        }\n    ]\n};\nconst defaultExtent = [\n    -100000,\n    -100000,\n    1e5,\n    1e5\n];\n(0, _vegaUtil.inherits)(Voronoi, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const as = _.as || \"path\", data = pulse.source; // nothing to do if no data\n        if (!data || !data.length) return pulse; // configure and construct voronoi diagram\n        let s = _.size;\n        s = s ? [\n            0,\n            0,\n            s[0],\n            s[1]\n        ] : (s = _.extent) ? [\n            s[0][0],\n            s[0][1],\n            s[1][0],\n            s[1][1]\n        ] : defaultExtent;\n        const voronoi = this.value = (0, _d3Delaunay.Delaunay).from(data, _.x, _.y).voronoi(s); // map polygons to paths\n        for(let i = 0, n = data.length; i < n; ++i){\n            const polygon = voronoi.cellPolygon(i);\n            data[i][as] = polygon ? toPathString(polygon) : null;\n        }\n        return pulse.reflow(_.modified()).modifies(as);\n    }\n}); // suppress duplicated end point vertices\nfunction toPathString(p) {\n    const x = p[0][0], y = p[0][1];\n    let n = p.length - 1;\n    for(; p[n][0] === x && p[n][1] === y; --n);\n    return \"M\" + p.slice(0, n + 1).join(\"L\") + \"Z\";\n}\n\n},{\"vega-dataflow\":\"4kvYg\",\"vega-util\":\"dPFAY\",\"d3-delaunay\":\"cD8xj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cD8xj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Delaunay\", ()=>(0, _delaunayJsDefault.default));\nparcelHelpers.export(exports, \"Voronoi\", ()=>(0, _voronoiJsDefault.default));\nvar _delaunayJs = require(\"./delaunay.js\");\nvar _delaunayJsDefault = parcelHelpers.interopDefault(_delaunayJs);\nvar _voronoiJs = require(\"./voronoi.js\");\nvar _voronoiJsDefault = parcelHelpers.interopDefault(_voronoiJs);\n\n},{\"./delaunay.js\":\"5Crol\",\"./voronoi.js\":\"2t78D\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Crol\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _delaunator = require(\"delaunator\");\nvar _delaunatorDefault = parcelHelpers.interopDefault(_delaunator);\nvar _pathJs = require(\"./path.js\");\nvar _pathJsDefault = parcelHelpers.interopDefault(_pathJs);\nvar _polygonJs = require(\"./polygon.js\");\nvar _polygonJsDefault = parcelHelpers.interopDefault(_polygonJs);\nvar _voronoiJs = require(\"./voronoi.js\");\nvar _voronoiJsDefault = parcelHelpers.interopDefault(_voronoiJs);\nconst tau = 2 * Math.PI, pow = Math.pow;\nfunction pointX(p) {\n    return p[0];\n}\nfunction pointY(p) {\n    return p[1];\n}\n// A triangulation is collinear if all its triangles have a non-null area\nfunction collinear(d) {\n    const { triangles , coords  } = d;\n    for(let i = 0; i < triangles.length; i += 3){\n        const a = 2 * triangles[i], b = 2 * triangles[i + 1], c = 2 * triangles[i + 2], cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]);\n        if (cross > 1e-10) return false;\n    }\n    return true;\n}\nfunction jitter(x, y, r) {\n    return [\n        x + Math.sin(x + y) * r,\n        y + Math.cos(x - y) * r\n    ];\n}\nclass Delaunay {\n    static from(points, fx = pointX, fy = pointY, that) {\n        return new Delaunay(\"length\" in points ? flatArray(points, fx, fy, that) : Float64Array.from(flatIterable(points, fx, fy, that)));\n    }\n    constructor(points){\n        this._delaunator = new (0, _delaunatorDefault.default)(points);\n        this.inedges = new Int32Array(points.length / 2);\n        this._hullIndex = new Int32Array(points.length / 2);\n        this.points = this._delaunator.coords;\n        this._init();\n    }\n    update() {\n        this._delaunator.update();\n        this._init();\n        return this;\n    }\n    _init() {\n        const d = this._delaunator, points = this.points;\n        // check for collinear\n        if (d.hull && d.hull.length > 2 && collinear(d)) {\n            this.collinear = Int32Array.from({\n                length: points.length / 2\n            }, (_, i)=>i).sort((i, j)=>points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors\n            const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds = [\n                points[2 * e],\n                points[2 * e + 1],\n                points[2 * f],\n                points[2 * f + 1]\n            ], r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]);\n            for(let i1 = 0, n = points.length / 2; i1 < n; ++i1){\n                const p = jitter(points[2 * i1], points[2 * i1 + 1], r);\n                points[2 * i1] = p[0];\n                points[2 * i1 + 1] = p[1];\n            }\n            this._delaunator = new (0, _delaunatorDefault.default)(points);\n        } else delete this.collinear;\n        const halfedges = this.halfedges = this._delaunator.halfedges;\n        const hull = this.hull = this._delaunator.hull;\n        const triangles = this.triangles = this._delaunator.triangles;\n        const inedges = this.inedges.fill(-1);\n        const hullIndex = this._hullIndex.fill(-1);\n        // Compute an index from each point to an (arbitrary) incoming halfedge\n        // Used to give the first neighbor of each point; for this reason,\n        // on the hull we give priority to exterior halfedges\n        for(let e = 0, n = halfedges.length; e < n; ++e){\n            const p = triangles[e % 3 === 2 ? e - 2 : e + 1];\n            if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e;\n        }\n        for(let i2 = 0, n1 = hull.length; i2 < n1; ++i2)hullIndex[hull[i2]] = i2;\n        // degenerate case: 1 or 2 (distinct) points\n        if (hull.length <= 2 && hull.length > 0) {\n            this.triangles = new Int32Array(3).fill(-1);\n            this.halfedges = new Int32Array(3).fill(-1);\n            this.triangles[0] = hull[0];\n            this.triangles[1] = hull[1];\n            this.triangles[2] = hull[1];\n            inedges[hull[0]] = 1;\n            if (hull.length === 2) inedges[hull[1]] = 0;\n        }\n    }\n    voronoi(bounds) {\n        return new (0, _voronoiJsDefault.default)(this, bounds);\n    }\n    *neighbors(i) {\n        const { inedges , hull , _hullIndex , halfedges , triangles , collinear: collinear1  } = this;\n        // degenerate case with several collinear points\n        if (collinear1) {\n            const l = collinear1.indexOf(i);\n            if (l > 0) yield collinear1[l - 1];\n            if (l < collinear1.length - 1) yield collinear1[l + 1];\n            return;\n        }\n        const e0 = inedges[i];\n        if (e0 === -1) return; // coincident point\n        let e = e0, p0 = -1;\n        do {\n            yield p0 = triangles[e];\n            e = e % 3 === 2 ? e - 2 : e + 1;\n            if (triangles[e] !== i) return; // bad triangulation\n            e = halfedges[e];\n            if (e === -1) {\n                const p = hull[(_hullIndex[i] + 1) % hull.length];\n                if (p !== p0) yield p;\n                return;\n            }\n        }while (e !== e0);\n    }\n    find(x, y, i = 0) {\n        if ((x = +x, x !== x) || (y = +y, y !== y)) return -1;\n        const i0 = i;\n        let c;\n        while((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0)i = c;\n        return c;\n    }\n    _step(i, x, y) {\n        const { inedges , hull , _hullIndex , halfedges , triangles , points  } = this;\n        if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1);\n        let c = i;\n        let dc = pow(x - points[i * 2], 2) + pow(y - points[i * 2 + 1], 2);\n        const e0 = inedges[i];\n        let e = e0;\n        do {\n            let t = triangles[e];\n            const dt = pow(x - points[t * 2], 2) + pow(y - points[t * 2 + 1], 2);\n            if (dt < dc) dc = dt, c = t;\n            e = e % 3 === 2 ? e - 2 : e + 1;\n            if (triangles[e] !== i) break; // bad triangulation\n            e = halfedges[e];\n            if (e === -1) {\n                e = hull[(_hullIndex[i] + 1) % hull.length];\n                if (e !== t) {\n                    if (pow(x - points[e * 2], 2) + pow(y - points[e * 2 + 1], 2) < dc) return e;\n                }\n                break;\n            }\n        }while (e !== e0);\n        return c;\n    }\n    render(context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { points , halfedges , triangles  } = this;\n        for(let i = 0, n = halfedges.length; i < n; ++i){\n            const j = halfedges[i];\n            if (j < i) continue;\n            const ti = triangles[i] * 2;\n            const tj = triangles[j] * 2;\n            context.moveTo(points[ti], points[ti + 1]);\n            context.lineTo(points[tj], points[tj + 1]);\n        }\n        this.renderHull(context);\n        return buffer && buffer.value();\n    }\n    renderPoints(context, r = 2) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { points  } = this;\n        for(let i = 0, n = points.length; i < n; i += 2){\n            const x = points[i], y = points[i + 1];\n            context.moveTo(x + r, y);\n            context.arc(x, y, r, 0, tau);\n        }\n        return buffer && buffer.value();\n    }\n    renderHull(context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { hull , points  } = this;\n        const h = hull[0] * 2, n = hull.length;\n        context.moveTo(points[h], points[h + 1]);\n        for(let i = 1; i < n; ++i){\n            const h = 2 * hull[i];\n            context.lineTo(points[h], points[h + 1]);\n        }\n        context.closePath();\n        return buffer && buffer.value();\n    }\n    hullPolygon() {\n        const polygon = new (0, _polygonJsDefault.default);\n        this.renderHull(polygon);\n        return polygon.value();\n    }\n    renderTriangle(i, context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { points , triangles  } = this;\n        const t0 = triangles[i *= 3] * 2;\n        const t1 = triangles[i + 1] * 2;\n        const t2 = triangles[i + 2] * 2;\n        context.moveTo(points[t0], points[t0 + 1]);\n        context.lineTo(points[t1], points[t1 + 1]);\n        context.lineTo(points[t2], points[t2 + 1]);\n        context.closePath();\n        return buffer && buffer.value();\n    }\n    *trianglePolygons() {\n        const { triangles  } = this;\n        for(let i = 0, n = triangles.length / 3; i < n; ++i)yield this.trianglePolygon(i);\n    }\n    trianglePolygon(i) {\n        const polygon = new (0, _polygonJsDefault.default);\n        this.renderTriangle(i, polygon);\n        return polygon.value();\n    }\n}\nexports.default = Delaunay;\nfunction flatArray(points, fx, fy, that) {\n    const n = points.length;\n    const array = new Float64Array(n * 2);\n    for(let i = 0; i < n; ++i){\n        const p = points[i];\n        array[i * 2] = fx.call(that, p, i, points);\n        array[i * 2 + 1] = fy.call(that, p, i, points);\n    }\n    return array;\n}\nfunction* flatIterable(points, fx, fy, that) {\n    let i = 0;\n    for (const p of points){\n        yield fx.call(that, p, i, points);\n        yield fy.call(that, p, i, points);\n        ++i;\n    }\n}\n\n},{\"delaunator\":\"dz3p9\",\"./path.js\":\"deeck\",\"./polygon.js\":\"1aYy2\",\"./voronoi.js\":\"2t78D\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dz3p9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nconst EPSILON = Math.pow(2, -52);\nconst EDGE_STACK = new Uint32Array(512);\nclass Delaunator {\n    static from(points, getX = defaultGetX, getY = defaultGetY) {\n        const n = points.length;\n        const coords = new Float64Array(n * 2);\n        for(let i = 0; i < n; i++){\n            const p = points[i];\n            coords[2 * i] = getX(p);\n            coords[2 * i + 1] = getY(p);\n        }\n        return new Delaunator(coords);\n    }\n    constructor(coords){\n        const n = coords.length >> 1;\n        if (n > 0 && typeof coords[0] !== \"number\") throw new Error(\"Expected coords to contain numbers.\");\n        this.coords = coords;\n        // arrays that will store the triangulation graph\n        const maxTriangles = Math.max(2 * n - 5, 0);\n        this._triangles = new Uint32Array(maxTriangles * 3);\n        this._halfedges = new Int32Array(maxTriangles * 3);\n        // temporary arrays for tracking the edges of the advancing convex hull\n        this._hashSize = Math.ceil(Math.sqrt(n));\n        this._hullPrev = new Uint32Array(n); // edge to prev edge\n        this._hullNext = new Uint32Array(n); // edge to next edge\n        this._hullTri = new Uint32Array(n); // edge to adjacent triangle\n        this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash\n        // temporary arrays for sorting points\n        this._ids = new Uint32Array(n);\n        this._dists = new Float64Array(n);\n        this.update();\n    }\n    update() {\n        const { coords , _hullPrev: hullPrev , _hullNext: hullNext , _hullTri: hullTri , _hullHash: hullHash  } = this;\n        const n = coords.length >> 1;\n        // populate an array of point indices; calculate input data bbox\n        let minX = Infinity;\n        let minY = Infinity;\n        let maxX = -Infinity;\n        let maxY = -Infinity;\n        for(let i = 0; i < n; i++){\n            const x = coords[2 * i];\n            const y = coords[2 * i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n            this._ids[i] = i;\n        }\n        const cx = (minX + maxX) / 2;\n        const cy = (minY + maxY) / 2;\n        let minDist = Infinity;\n        let i0, i1, i2;\n        // pick a seed point close to the center\n        for(let i3 = 0; i3 < n; i3++){\n            const d = dist(cx, cy, coords[2 * i3], coords[2 * i3 + 1]);\n            if (d < minDist) {\n                i0 = i3;\n                minDist = d;\n            }\n        }\n        const i0x = coords[2 * i0];\n        const i0y = coords[2 * i0 + 1];\n        minDist = Infinity;\n        // find the point closest to the seed\n        for(let i4 = 0; i4 < n; i4++){\n            if (i4 === i0) continue;\n            const d = dist(i0x, i0y, coords[2 * i4], coords[2 * i4 + 1]);\n            if (d < minDist && d > 0) {\n                i1 = i4;\n                minDist = d;\n            }\n        }\n        let i1x = coords[2 * i1];\n        let i1y = coords[2 * i1 + 1];\n        let minRadius = Infinity;\n        // find the third point which forms the smallest circumcircle with the first two\n        for(let i5 = 0; i5 < n; i5++){\n            if (i5 === i0 || i5 === i1) continue;\n            const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i5], coords[2 * i5 + 1]);\n            if (r < minRadius) {\n                i2 = i5;\n                minRadius = r;\n            }\n        }\n        let i2x = coords[2 * i2];\n        let i2y = coords[2 * i2 + 1];\n        if (minRadius === Infinity) {\n            // order collinear points by dx (or dy if all x are identical)\n            // and return the list as a hull\n            for(let i = 0; i < n; i++)this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];\n            quicksort(this._ids, this._dists, 0, n - 1);\n            const hull = new Uint32Array(n);\n            let j = 0;\n            for(let i8 = 0, d0 = -Infinity; i8 < n; i8++){\n                const id = this._ids[i8];\n                if (this._dists[id] > d0) {\n                    hull[j++] = id;\n                    d0 = this._dists[id];\n                }\n            }\n            this.hull = hull.subarray(0, j);\n            this.triangles = new Uint32Array(0);\n            this.halfedges = new Uint32Array(0);\n            return;\n        }\n        // swap the order of the seed points for counter-clockwise orientation\n        if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) {\n            const i = i1;\n            const x = i1x;\n            const y = i1y;\n            i1 = i2;\n            i1x = i2x;\n            i1y = i2y;\n            i2 = i;\n            i2x = x;\n            i2y = y;\n        }\n        const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n        this._cx = center.x;\n        this._cy = center.y;\n        for(let i6 = 0; i6 < n; i6++)this._dists[i6] = dist(coords[2 * i6], coords[2 * i6 + 1], center.x, center.y);\n        // sort the points by distance from the seed triangle circumcenter\n        quicksort(this._ids, this._dists, 0, n - 1);\n        // set up the seed triangle as the starting hull\n        this._hullStart = i0;\n        let hullSize = 3;\n        hullNext[i0] = hullPrev[i2] = i1;\n        hullNext[i1] = hullPrev[i0] = i2;\n        hullNext[i2] = hullPrev[i1] = i0;\n        hullTri[i0] = 0;\n        hullTri[i1] = 1;\n        hullTri[i2] = 2;\n        hullHash.fill(-1);\n        hullHash[this._hashKey(i0x, i0y)] = i0;\n        hullHash[this._hashKey(i1x, i1y)] = i1;\n        hullHash[this._hashKey(i2x, i2y)] = i2;\n        this.trianglesLen = 0;\n        this._addTriangle(i0, i1, i2, -1, -1, -1);\n        for(let k = 0, xp, yp; k < this._ids.length; k++){\n            const i = this._ids[k];\n            const x = coords[2 * i];\n            const y = coords[2 * i + 1];\n            // skip near-duplicate points\n            if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue;\n            xp = x;\n            yp = y;\n            // skip seed triangle points\n            if (i === i0 || i === i1 || i === i2) continue;\n            // find a visible edge on the convex hull using edge hash\n            let start = 0;\n            for(let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++){\n                start = hullHash[(key + j) % this._hashSize];\n                if (start !== -1 && start !== hullNext[start]) break;\n            }\n            start = hullPrev[start];\n            let e = start, q;\n            while(q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])){\n                e = q;\n                if (e === start) {\n                    e = -1;\n                    break;\n                }\n            }\n            if (e === -1) continue; // likely a near-duplicate point; skip it\n            // add the first triangle from the point\n            let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n            // recursively flip triangles from the point until they satisfy the Delaunay condition\n            hullTri[i] = this._legalize(t + 2);\n            hullTri[e] = t; // keep track of boundary triangles on the hull\n            hullSize++;\n            // walk forward through the hull, adding more triangles and flipping recursively\n            let n = hullNext[e];\n            while(q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])){\n                t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]);\n                hullTri[i] = this._legalize(t + 2);\n                hullNext[n] = n; // mark as removed\n                hullSize--;\n                n = q;\n            }\n            // walk backward from the other side, adding more triangles and flipping\n            if (e === start) while(q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])){\n                t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n                this._legalize(t + 2);\n                hullTri[q] = t;\n                hullNext[e] = e; // mark as removed\n                hullSize--;\n                e = q;\n            }\n            // update the hull indices\n            this._hullStart = hullPrev[i] = e;\n            hullNext[e] = hullPrev[n] = i;\n            hullNext[i] = n;\n            // save the two new edges in the hash table\n            hullHash[this._hashKey(x, y)] = i;\n            hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n        }\n        this.hull = new Uint32Array(hullSize);\n        for(let i7 = 0, e = this._hullStart; i7 < hullSize; i7++){\n            this.hull[i7] = e;\n            e = hullNext[e];\n        }\n        // trim typed triangle mesh arrays\n        this.triangles = this._triangles.subarray(0, this.trianglesLen);\n        this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n    }\n    _hashKey(x, y) {\n        return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize;\n    }\n    _legalize(a) {\n        const { _triangles: triangles , _halfedges: halfedges , coords  } = this;\n        let i = 0;\n        let ar = 0;\n        // recursion eliminated with a fixed-size stack\n        while(true){\n            const b = halfedges[a];\n            /* if the pair of triangles doesn't satisfy the Delaunay condition\n             * (p1 is inside the circumcircle of [p0, pl, pr]), flip them,\n             * then do the same check/flip recursively for the new pair of triangles\n             *\n             *           pl                    pl\n             *          /||\\                  /  \\\n             *       al/ || \\bl            al/    \\a\n             *        /  ||  \\              /      \\\n             *       /  a||b  \\    flip    /___ar___\\\n             *     p0\\   ||   /p1   =>   p0\\---bl---/p1\n             *        \\  ||  /              \\      /\n             *       ar\\ || /br             b\\    /br\n             *          \\||/                  \\  /\n             *           pr                    pr\n             */ const a0 = a - a % 3;\n            ar = a0 + (a + 2) % 3;\n            if (b === -1) {\n                if (i === 0) break;\n                a = EDGE_STACK[--i];\n                continue;\n            }\n            const b0 = b - b % 3;\n            const al = a0 + (a + 1) % 3;\n            const bl = b0 + (b + 2) % 3;\n            const p0 = triangles[ar];\n            const pr = triangles[a];\n            const pl = triangles[al];\n            const p1 = triangles[bl];\n            const illegal = inCircle(coords[2 * p0], coords[2 * p0 + 1], coords[2 * pr], coords[2 * pr + 1], coords[2 * pl], coords[2 * pl + 1], coords[2 * p1], coords[2 * p1 + 1]);\n            if (illegal) {\n                triangles[a] = p1;\n                triangles[b] = p0;\n                const hbl = halfedges[bl];\n                // edge swapped on the other side of the hull (rare); fix the halfedge reference\n                if (hbl === -1) {\n                    let e = this._hullStart;\n                    do {\n                        if (this._hullTri[e] === bl) {\n                            this._hullTri[e] = a;\n                            break;\n                        }\n                        e = this._hullPrev[e];\n                    }while (e !== this._hullStart);\n                }\n                this._link(a, hbl);\n                this._link(b, halfedges[ar]);\n                this._link(ar, bl);\n                const br = b0 + (b + 1) % 3;\n                // don't worry about hitting the cap: it can only happen on extremely degenerate input\n                if (i < EDGE_STACK.length) EDGE_STACK[i++] = br;\n            } else {\n                if (i === 0) break;\n                a = EDGE_STACK[--i];\n            }\n        }\n        return ar;\n    }\n    _link(a, b) {\n        this._halfedges[a] = b;\n        if (b !== -1) this._halfedges[b] = a;\n    }\n    // add a new triangle given vertex indices and adjacent half-edge ids\n    _addTriangle(i0, i1, i2, a, b, c) {\n        const t = this.trianglesLen;\n        this._triangles[t] = i0;\n        this._triangles[t + 1] = i1;\n        this._triangles[t + 2] = i2;\n        this._link(t, a);\n        this._link(t + 1, b);\n        this._link(t + 2, c);\n        this.trianglesLen += 3;\n        return t;\n    }\n}\nexports.default = Delaunator;\n// monotonically increases with real angle, but doesn't need expensive trigonometry\nfunction pseudoAngle(dx, dy) {\n    const p = dx / (Math.abs(dx) + Math.abs(dy));\n    return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1]\n}\nfunction dist(ax, ay, bx, by) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return dx * dx + dy * dy;\n}\n// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check\nfunction orientIfSure(px, py, rx, ry, qx, qy) {\n    const l = (ry - py) * (qx - px);\n    const r = (rx - px) * (qy - py);\n    return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0;\n}\n// a more robust orientation test that's stable in a given triangle (to fix robustness issues)\nfunction orient(rx, ry, qx, qy, px, py) {\n    const sign = orientIfSure(px, py, rx, ry, qx, qy) || orientIfSure(rx, ry, qx, qy, px, py) || orientIfSure(qx, qy, px, py, rx, ry);\n    return sign < 0;\n}\nfunction inCircle(ax, ay, bx, by, cx, cy, px, py) {\n    const dx = ax - px;\n    const dy = ay - py;\n    const ex = bx - px;\n    const ey = by - py;\n    const fx = cx - px;\n    const fy = cy - py;\n    const ap = dx * dx + dy * dy;\n    const bp = ex * ex + ey * ey;\n    const cp = fx * fx + fy * fy;\n    return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n}\nfunction circumradius(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n    const x = (ey * bl - dy * cl) * d;\n    const y = (dx * cl - ex * bl) * d;\n    return x * x + y * y;\n}\nfunction circumcenter(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n    const x = ax + (ey * bl - dy * cl) * d;\n    const y = ay + (dx * cl - ex * bl) * d;\n    return {\n        x,\n        y\n    };\n}\nfunction quicksort(ids, dists, left, right) {\n    if (right - left <= 20) for(let i = left + 1; i <= right; i++){\n        const temp = ids[i];\n        const tempDist = dists[temp];\n        let j = i - 1;\n        while(j >= left && dists[ids[j]] > tempDist)ids[j + 1] = ids[j--];\n        ids[j + 1] = temp;\n    }\n    else {\n        const median = left + right >> 1;\n        let i = left + 1;\n        let j = right;\n        swap(ids, median, i);\n        if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n        if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n        if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n        const temp = ids[i];\n        const tempDist = dists[temp];\n        while(true){\n            do i++;\n            while (dists[ids[i]] < tempDist);\n            do j--;\n            while (dists[ids[j]] > tempDist);\n            if (j < i) break;\n            swap(ids, i, j);\n        }\n        ids[left + 1] = ids[j];\n        ids[j] = temp;\n        if (right - i + 1 >= j - left) {\n            quicksort(ids, dists, i, right);\n            quicksort(ids, dists, left, j - 1);\n        } else {\n            quicksort(ids, dists, left, j - 1);\n            quicksort(ids, dists, i, right);\n        }\n    }\n}\nfunction swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\nfunction defaultGetX(p) {\n    return p[0];\n}\nfunction defaultGetY(p) {\n    return p[1];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"deeck\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nconst epsilon = 1e-6;\nclass Path {\n    constructor(){\n        this._x0 = this._y0 = this._x1 = this._y1 = null; // end of current subpath\n        this._ = \"\";\n    }\n    moveTo(x, y) {\n        this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n    }\n    closePath() {\n        if (this._x1 !== null) {\n            this._x1 = this._x0, this._y1 = this._y0;\n            this._ += \"Z\";\n        }\n    }\n    lineTo(x, y) {\n        this._ += `L${this._x1 = +x},${this._y1 = +y}`;\n    }\n    arc(x, y, r) {\n        x = +x, y = +y, r = +r;\n        const x0 = x + r;\n        const y0 = y;\n        if (r < 0) throw new Error(\"negative radius\");\n        if (this._x1 === null) this._ += `M${x0},${y0}`;\n        else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += \"L\" + x0 + \",\" + y0;\n        if (!r) return;\n        this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`;\n    }\n    rect(x, y, w, h) {\n        this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`;\n    }\n    value() {\n        return this._ || null;\n    }\n}\nexports.default = Path;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1aYy2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nclass Polygon {\n    constructor(){\n        this._ = [];\n    }\n    moveTo(x, y) {\n        this._.push([\n            x,\n            y\n        ]);\n    }\n    closePath() {\n        this._.push(this._[0].slice());\n    }\n    lineTo(x, y) {\n        this._.push([\n            x,\n            y\n        ]);\n    }\n    value() {\n        return this._.length ? this._ : null;\n    }\n}\nexports.default = Polygon;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2t78D\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _pathJs = require(\"./path.js\");\nvar _pathJsDefault = parcelHelpers.interopDefault(_pathJs);\nvar _polygonJs = require(\"./polygon.js\");\nvar _polygonJsDefault = parcelHelpers.interopDefault(_polygonJs);\nclass Voronoi {\n    constructor(delaunay, [xmin, ymin, xmax, ymax] = [\n        0,\n        0,\n        960,\n        500\n    ]){\n        if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error(\"invalid bounds\");\n        this.delaunay = delaunay;\n        this._circumcenters = new Float64Array(delaunay.points.length * 2);\n        this.vectors = new Float64Array(delaunay.points.length * 2);\n        this.xmax = xmax, this.xmin = xmin;\n        this.ymax = ymax, this.ymin = ymin;\n        this._init();\n    }\n    update() {\n        this.delaunay.update();\n        this._init();\n        return this;\n    }\n    _init() {\n        const { delaunay: { points , hull , triangles  } , vectors  } = this;\n        // Compute circumcenters.\n        const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);\n        for(let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2){\n            const t1 = triangles[i] * 2;\n            const t2 = triangles[i + 1] * 2;\n            const t3 = triangles[i + 2] * 2;\n            const x1 = points[t1];\n            const y1 = points[t1 + 1];\n            const x2 = points[t2];\n            const y2 = points[t2 + 1];\n            const x3 = points[t3];\n            const y3 = points[t3 + 1];\n            const dx = x2 - x1;\n            const dy = y2 - y1;\n            const ex = x3 - x1;\n            const ey = y3 - y1;\n            const bl = dx * dx + dy * dy;\n            const cl = ex * ex + ey * ey;\n            const ab = (dx * ey - dy * ex) * 2;\n            if (!ab) {\n                // degenerate case (collinear diagram)\n                x = (x1 + x3) / 2 - 1e8 * ey;\n                y = (y1 + y3) / 2 + 1e8 * ex;\n            } else if (Math.abs(ab) < 1e-8) {\n                // almost equal points (degenerate triangle)\n                x = (x1 + x3) / 2;\n                y = (y1 + y3) / 2;\n            } else {\n                const d = 1 / ab;\n                x = x1 + (ey * bl - dy * cl) * d;\n                y = y1 + (dx * cl - ex * bl) * d;\n            }\n            circumcenters[j] = x;\n            circumcenters[j + 1] = y;\n        }\n        // Compute exterior cell rays.\n        let h = hull[hull.length - 1];\n        let p0, p1 = h * 4;\n        let x0, x1 = points[2 * h];\n        let y0, y1 = points[2 * h + 1];\n        vectors.fill(0);\n        for(let i1 = 0; i1 < hull.length; ++i1){\n            h = hull[i1];\n            p0 = p1, x0 = x1, y0 = y1;\n            p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1];\n            vectors[p0 + 2] = vectors[p1] = y0 - y1;\n            vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0;\n        }\n    }\n    render(context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { delaunay: { halfedges , inedges , hull  } , circumcenters , vectors  } = this;\n        if (hull.length <= 1) return null;\n        for(let i = 0, n = halfedges.length; i < n; ++i){\n            const j = halfedges[i];\n            if (j < i) continue;\n            const ti = Math.floor(i / 3) * 2;\n            const tj = Math.floor(j / 3) * 2;\n            const xi = circumcenters[ti];\n            const yi = circumcenters[ti + 1];\n            const xj = circumcenters[tj];\n            const yj = circumcenters[tj + 1];\n            this._renderSegment(xi, yi, xj, yj, context);\n        }\n        let h0, h1 = hull[hull.length - 1];\n        for(let i2 = 0; i2 < hull.length; ++i2){\n            h0 = h1, h1 = hull[i2];\n            const t = Math.floor(inedges[h1] / 3) * 2;\n            const x = circumcenters[t];\n            const y = circumcenters[t + 1];\n            const v = h0 * 4;\n            const p = this._project(x, y, vectors[v + 2], vectors[v + 3]);\n            if (p) this._renderSegment(x, y, p[0], p[1], context);\n        }\n        return buffer && buffer.value();\n    }\n    renderBounds(context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin);\n        return buffer && buffer.value();\n    }\n    renderCell(i, context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const points = this._clip(i);\n        if (points === null || !points.length) return;\n        context.moveTo(points[0], points[1]);\n        let n = points.length;\n        while(points[0] === points[n - 2] && points[1] === points[n - 1] && n > 1)n -= 2;\n        for(let i3 = 2; i3 < n; i3 += 2)if (points[i3] !== points[i3 - 2] || points[i3 + 1] !== points[i3 - 1]) context.lineTo(points[i3], points[i3 + 1]);\n        context.closePath();\n        return buffer && buffer.value();\n    }\n    *cellPolygons() {\n        const { delaunay: { points  }  } = this;\n        for(let i = 0, n = points.length / 2; i < n; ++i){\n            const cell = this.cellPolygon(i);\n            if (cell) cell.index = i, yield cell;\n        }\n    }\n    cellPolygon(i) {\n        const polygon = new (0, _polygonJsDefault.default);\n        this.renderCell(i, polygon);\n        return polygon.value();\n    }\n    _renderSegment(x0, y0, x1, y1, context) {\n        let S;\n        const c0 = this._regioncode(x0, y0);\n        const c1 = this._regioncode(x1, y1);\n        if (c0 === 0 && c1 === 0) {\n            context.moveTo(x0, y0);\n            context.lineTo(x1, y1);\n        } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) {\n            context.moveTo(S[0], S[1]);\n            context.lineTo(S[2], S[3]);\n        }\n    }\n    contains(i, x, y) {\n        if ((x = +x, x !== x) || (y = +y, y !== y)) return false;\n        return this.delaunay._step(i, x, y) === i;\n    }\n    *neighbors(i) {\n        const ci = this._clip(i);\n        if (ci) for (const j of this.delaunay.neighbors(i)){\n            const cj = this._clip(j);\n            // find the common edge\n            if (cj) loop: for(let ai = 0, li = ci.length; ai < li; ai += 2){\n                for(let aj = 0, lj = cj.length; aj < lj; aj += 2)if (ci[ai] == cj[aj] && ci[ai + 1] == cj[aj + 1] && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj]) {\n                    yield j;\n                    break loop;\n                }\n            }\n        }\n    }\n    _cell(i) {\n        const { circumcenters , delaunay: { inedges , halfedges , triangles  }  } = this;\n        const e0 = inedges[i];\n        if (e0 === -1) return null; // coincident point\n        const points = [];\n        let e = e0;\n        do {\n            const t = Math.floor(e / 3);\n            points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]);\n            e = e % 3 === 2 ? e - 2 : e + 1;\n            if (triangles[e] !== i) break; // bad triangulation\n            e = halfedges[e];\n        }while (e !== e0 && e !== -1);\n        return points;\n    }\n    _clip(i) {\n        // degenerate case (1 valid point: return the box)\n        if (i === 0 && this.delaunay.hull.length === 1) return [\n            this.xmax,\n            this.ymin,\n            this.xmax,\n            this.ymax,\n            this.xmin,\n            this.ymax,\n            this.xmin,\n            this.ymin\n        ];\n        const points = this._cell(i);\n        if (points === null) return null;\n        const { vectors: V  } = this;\n        const v = i * 4;\n        return V[v] || V[v + 1] ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) : this._clipFinite(i, points);\n    }\n    _clipFinite(i, points) {\n        const n = points.length;\n        let P = null;\n        let x0, y0, x1 = points[n - 2], y1 = points[n - 1];\n        let c0, c1 = this._regioncode(x1, y1);\n        let e0, e1;\n        for(let j = 0; j < n; j += 2){\n            x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1];\n            c0 = c1, c1 = this._regioncode(x1, y1);\n            if (c0 === 0 && c1 === 0) {\n                e0 = e1, e1 = 0;\n                if (P) P.push(x1, y1);\n                else P = [\n                    x1,\n                    y1\n                ];\n            } else {\n                let S, sx0, sy0, sx1, sy1;\n                if (c0 === 0) {\n                    if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue;\n                    [sx0, sy0, sx1, sy1] = S;\n                } else {\n                    if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue;\n                    [sx1, sy1, sx0, sy0] = S;\n                    e0 = e1, e1 = this._edgecode(sx0, sy0);\n                    if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n                    if (P) P.push(sx0, sy0);\n                    else P = [\n                        sx0,\n                        sy0\n                    ];\n                }\n                e0 = e1, e1 = this._edgecode(sx1, sy1);\n                if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n                if (P) P.push(sx1, sy1);\n                else P = [\n                    sx1,\n                    sy1\n                ];\n            }\n        }\n        if (P) {\n            e0 = e1, e1 = this._edgecode(P[0], P[1]);\n            if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n        } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) return [\n            this.xmax,\n            this.ymin,\n            this.xmax,\n            this.ymax,\n            this.xmin,\n            this.ymax,\n            this.xmin,\n            this.ymin\n        ];\n        return P;\n    }\n    _clipSegment(x0, y0, x1, y1, c0, c1) {\n        while(true){\n            if (c0 === 0 && c1 === 0) return [\n                x0,\n                y0,\n                x1,\n                y1\n            ];\n            if (c0 & c1) return null;\n            let x, y, c = c0 || c1;\n            if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax;\n            else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin;\n            else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax;\n            else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin;\n            if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0);\n            else x1 = x, y1 = y, c1 = this._regioncode(x1, y1);\n        }\n    }\n    _clipInfinite(i, points, vx0, vy0, vxn, vyn) {\n        let P = Array.from(points), p;\n        if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]);\n        if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]);\n        if (P = this._clipFinite(i, P)) for(let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2){\n            c0 = c1, c1 = this._edgecode(P[j], P[j + 1]);\n            if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length;\n        }\n        else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) P = [\n            this.xmin,\n            this.ymin,\n            this.xmax,\n            this.ymin,\n            this.xmax,\n            this.ymax,\n            this.xmin,\n            this.ymax\n        ];\n        return P;\n    }\n    _edge(i, e0, e1, P, j) {\n        while(e0 !== e1){\n            let x, y;\n            switch(e0){\n                case 0b0101:\n                    e0 = 0b0100;\n                    continue; // top-left\n                case 0b0100:\n                    e0 = 0b0110, x = this.xmax, y = this.ymin;\n                    break; // top\n                case 0b0110:\n                    e0 = 0b0010;\n                    continue; // top-right\n                case 0b0010:\n                    e0 = 0b1010, x = this.xmax, y = this.ymax;\n                    break; // right\n                case 0b1010:\n                    e0 = 0b1000;\n                    continue; // bottom-right\n                case 0b1000:\n                    e0 = 0b1001, x = this.xmin, y = this.ymax;\n                    break; // bottom\n                case 0b1001:\n                    e0 = 0b0001;\n                    continue; // bottom-left\n                case 0b0001:\n                    e0 = 0b0101, x = this.xmin, y = this.ymin;\n                    break; // left\n            }\n            if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) P.splice(j, 0, x, y), j += 2;\n        }\n        if (P.length > 4) for(let i4 = 0; i4 < P.length; i4 += 2){\n            const j = (i4 + 2) % P.length, k = (i4 + 4) % P.length;\n            if (P[i4] === P[j] && P[j] === P[k] || P[i4 + 1] === P[j + 1] && P[j + 1] === P[k + 1]) P.splice(j, 2), i4 -= 2;\n        }\n        return j;\n    }\n    _project(x0, y0, vx, vy) {\n        let t = Infinity, c, x, y;\n        if (vy < 0) {\n            if (y0 <= this.ymin) return null;\n            if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx;\n        } else if (vy > 0) {\n            if (y0 >= this.ymax) return null;\n            if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx;\n        }\n        if (vx > 0) {\n            if (x0 >= this.xmax) return null;\n            if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy;\n        } else if (vx < 0) {\n            if (x0 <= this.xmin) return null;\n            if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy;\n        }\n        return [\n            x,\n            y\n        ];\n    }\n    _edgecode(x, y) {\n        return (x === this.xmin ? 0b0001 : x === this.xmax ? 0b0010 : 0b0000) | (y === this.ymin ? 0b0100 : y === this.ymax ? 0b1000 : 0b0000);\n    }\n    _regioncode(x, y) {\n        return (x < this.xmin ? 0b0001 : x > this.xmax ? 0b0010 : 0b0000) | (y < this.ymin ? 0b0100 : y > this.ymax ? 0b1000 : 0b0000);\n    }\n}\nexports.default = Voronoi;\n\n},{\"./path.js\":\"deeck\",\"./polygon.js\":\"1aYy2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"77b1A\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"wordcloud\", ()=>Wordcloud);\nvar _vegaCanvas = require(\"vega-canvas\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaStatistics = require(\"vega-statistics\");\n/*\nCopyright (c) 2013, Jason Davies.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n  * Redistributions of source code must retain the above copyright notice, this\n    list of conditions and the following disclaimer.\n\n  * Redistributions in binary form must reproduce the above copyright notice,\n    this list of conditions and the following disclaimer in the documentation\n    and/or other materials provided with the distribution.\n\n  * The name Jason Davies may not be used to endorse or promote products\n    derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL JASON DAVIES BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\nOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\nADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/ // Word cloud layout by Jason Davies, https://www.jasondavies.com/wordcloud/\n// Algorithm due to Jonathan Feinberg, http://static.mrfeinberg.com/bv_ch03.pdf\nvar cloudRadians = Math.PI / 180, cw = 64, ch = 2048;\nfunction cloud() {\n    var size = [\n        256,\n        256\n    ], text, font, fontSize, fontStyle, fontWeight, rotate, padding, spiral = archimedeanSpiral, words = [], random = Math.random, cloud1 = {};\n    cloud1.layout = function() {\n        var contextAndRatio = getContext((0, _vegaCanvas.canvas)()), board = zeroArray((size[0] >> 5) * size[1]), bounds = null, n = words.length, i = -1, tags = [], data = words.map((d)=>({\n                text: text(d),\n                font: font(d),\n                style: fontStyle(d),\n                weight: fontWeight(d),\n                rotate: rotate(d),\n                size: ~~(fontSize(d) + 1e-14),\n                padding: padding(d),\n                xoff: 0,\n                yoff: 0,\n                x1: 0,\n                y1: 0,\n                x0: 0,\n                y0: 0,\n                hasText: false,\n                sprite: null,\n                datum: d\n            })).sort((a, b)=>b.size - a.size);\n        while(++i < n){\n            var d1 = data[i];\n            d1.x = size[0] * (random() + .5) >> 1;\n            d1.y = size[1] * (random() + .5) >> 1;\n            cloudSprite(contextAndRatio, d1, data, i);\n            if (d1.hasText && place(board, d1, bounds)) {\n                tags.push(d1);\n                if (bounds) cloudBounds(bounds, d1);\n                else bounds = [\n                    {\n                        x: d1.x + d1.x0,\n                        y: d1.y + d1.y0\n                    },\n                    {\n                        x: d1.x + d1.x1,\n                        y: d1.y + d1.y1\n                    }\n                ]; // Temporary hack\n                d1.x -= size[0] >> 1;\n                d1.y -= size[1] >> 1;\n            }\n        }\n        return tags;\n    };\n    function getContext(canvas) {\n        canvas.width = canvas.height = 1;\n        var ratio = Math.sqrt(canvas.getContext(\"2d\").getImageData(0, 0, 1, 1).data.length >> 2);\n        canvas.width = (cw << 5) / ratio;\n        canvas.height = ch / ratio;\n        var context = canvas.getContext(\"2d\");\n        context.fillStyle = context.strokeStyle = \"red\";\n        context.textAlign = \"center\";\n        return {\n            context: context,\n            ratio: ratio\n        };\n    }\n    function place(board, tag, bounds) {\n        var startX = tag.x, startY = tag.y, maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]), s = spiral(size), dt = random() < .5 ? 1 : -1, t = -dt, dxdy, dx, dy;\n        while(dxdy = s(t += dt)){\n            dx = ~~dxdy[0];\n            dy = ~~dxdy[1];\n            if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break;\n            tag.x = startX + dx;\n            tag.y = startY + dy;\n            if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue; // TODO only check for collisions within current bounds.\n            if (!bounds || !cloudCollide(tag, board, size[0])) {\n                if (!bounds || collideRects(tag, bounds)) {\n                    var sprite = tag.sprite, w = tag.width >> 5, sw = size[0] >> 5, lx = tag.x - (w << 4), sx = lx & 0x7f, msx = 32 - sx, h = tag.y1 - tag.y0, x = (tag.y + tag.y0) * sw + (lx >> 5), last;\n                    for(var j = 0; j < h; j++){\n                        last = 0;\n                        for(var i = 0; i <= w; i++)board[x + i] |= last << msx | (i < w ? (last = sprite[j * w + i]) >>> sx : 0);\n                        x += sw;\n                    }\n                    tag.sprite = null;\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    cloud1.words = function(_) {\n        if (arguments.length) {\n            words = _;\n            return cloud1;\n        } else return words;\n    };\n    cloud1.size = function(_) {\n        if (arguments.length) {\n            size = [\n                +_[0],\n                +_[1]\n            ];\n            return cloud1;\n        } else return size;\n    };\n    cloud1.font = function(_) {\n        if (arguments.length) {\n            font = functor(_);\n            return cloud1;\n        } else return font;\n    };\n    cloud1.fontStyle = function(_) {\n        if (arguments.length) {\n            fontStyle = functor(_);\n            return cloud1;\n        } else return fontStyle;\n    };\n    cloud1.fontWeight = function(_) {\n        if (arguments.length) {\n            fontWeight = functor(_);\n            return cloud1;\n        } else return fontWeight;\n    };\n    cloud1.rotate = function(_) {\n        if (arguments.length) {\n            rotate = functor(_);\n            return cloud1;\n        } else return rotate;\n    };\n    cloud1.text = function(_) {\n        if (arguments.length) {\n            text = functor(_);\n            return cloud1;\n        } else return text;\n    };\n    cloud1.spiral = function(_) {\n        if (arguments.length) {\n            spiral = spirals[_] || _;\n            return cloud1;\n        } else return spiral;\n    };\n    cloud1.fontSize = function(_) {\n        if (arguments.length) {\n            fontSize = functor(_);\n            return cloud1;\n        } else return fontSize;\n    };\n    cloud1.padding = function(_) {\n        if (arguments.length) {\n            padding = functor(_);\n            return cloud1;\n        } else return padding;\n    };\n    cloud1.random = function(_) {\n        if (arguments.length) {\n            random = _;\n            return cloud1;\n        } else return random;\n    };\n    return cloud1;\n} // Fetches a monochrome sprite bitmap for the specified text.\n// Load in batches for speed.\nfunction cloudSprite(contextAndRatio, d, data, di) {\n    if (d.sprite) return;\n    var c = contextAndRatio.context, ratio = contextAndRatio.ratio;\n    c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);\n    var x = 0, y = 0, maxh = 0, n = data.length, w, w32, h, i, j;\n    --di;\n    while(++di < n){\n        d = data[di];\n        c.save();\n        c.font = d.style + \" \" + d.weight + \" \" + ~~((d.size + 1) / ratio) + \"px \" + d.font;\n        w = c.measureText(d.text + \"m\").width * ratio;\n        h = d.size << 1;\n        if (d.rotate) {\n            var sr = Math.sin(d.rotate * cloudRadians), cr = Math.cos(d.rotate * cloudRadians), wcr = w * cr, wsr = w * sr, hcr = h * cr, hsr = h * sr;\n            w = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f >> 5 << 5;\n            h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));\n        } else w = w + 0x1f >> 5 << 5;\n        if (h > maxh) maxh = h;\n        if (x + w >= cw << 5) {\n            x = 0;\n            y += maxh;\n            maxh = 0;\n        }\n        if (y + h >= ch) break;\n        c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio);\n        if (d.rotate) c.rotate(d.rotate * cloudRadians);\n        c.fillText(d.text, 0, 0);\n        if (d.padding) {\n            c.lineWidth = 2 * d.padding;\n            c.strokeText(d.text, 0, 0);\n        }\n        c.restore();\n        d.width = w;\n        d.height = h;\n        d.xoff = x;\n        d.yoff = y;\n        d.x1 = w >> 1;\n        d.y1 = h >> 1;\n        d.x0 = -d.x1;\n        d.y0 = -d.y1;\n        d.hasText = true;\n        x += w;\n    }\n    var pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, sprite = [];\n    while(--di >= 0){\n        d = data[di];\n        if (!d.hasText) continue;\n        w = d.width;\n        w32 = w >> 5;\n        h = d.y1 - d.y0; // Zero the buffer\n        for(i = 0; i < h * w32; i++)sprite[i] = 0;\n        x = d.xoff;\n        if (x == null) return;\n        y = d.yoff;\n        var seen = 0, seenRow = -1;\n        for(j = 0; j < h; j++){\n            for(i = 0; i < w; i++){\n                var k = w32 * j + (i >> 5), m = pixels[(y + j) * (cw << 5) + (x + i) << 2] ? 1 << 31 - i % 32 : 0;\n                sprite[k] |= m;\n                seen |= m;\n            }\n            if (seen) seenRow = j;\n            else {\n                d.y0++;\n                h--;\n                j--;\n                y++;\n            }\n        }\n        d.y1 = d.y0 + seenRow;\n        d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32);\n    }\n} // Use mask-based collision detection.\nfunction cloudCollide(tag, board, sw) {\n    sw >>= 5;\n    var sprite = tag.sprite, w = tag.width >> 5, lx = tag.x - (w << 4), sx = lx & 0x7f, msx = 32 - sx, h = tag.y1 - tag.y0, x = (tag.y + tag.y0) * sw + (lx >> 5), last;\n    for(var j = 0; j < h; j++){\n        last = 0;\n        for(var i = 0; i <= w; i++){\n            if ((last << msx | (i < w ? (last = sprite[j * w + i]) >>> sx : 0)) & board[x + i]) return true;\n        }\n        x += sw;\n    }\n    return false;\n}\nfunction cloudBounds(bounds, d) {\n    var b0 = bounds[0], b1 = bounds[1];\n    if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0;\n    if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0;\n    if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1;\n    if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1;\n}\nfunction collideRects(a, b) {\n    return a.x + a.x1 > b[0].x && a.x + a.x0 < b[1].x && a.y + a.y1 > b[0].y && a.y + a.y0 < b[1].y;\n}\nfunction archimedeanSpiral(size) {\n    var e = size[0] / size[1];\n    return function(t) {\n        return [\n            e * (t *= .1) * Math.cos(t),\n            t * Math.sin(t)\n        ];\n    };\n}\nfunction rectangularSpiral(size) {\n    var dy = 4, dx = dy * size[0] / size[1], x = 0, y = 0;\n    return function(t) {\n        var sign = t < 0 ? -1 : 1; // See triangular numbers: T_n = n * (n + 1) / 2.\n        switch(Math.sqrt(1 + 4 * sign * t) - sign & 3){\n            case 0:\n                x += dx;\n                break;\n            case 1:\n                y += dy;\n                break;\n            case 2:\n                x -= dx;\n                break;\n            default:\n                y -= dy;\n                break;\n        }\n        return [\n            x,\n            y\n        ];\n    };\n} // TODO reuse arrays?\nfunction zeroArray(n) {\n    var a = [], i = -1;\n    while(++i < n)a[i] = 0;\n    return a;\n}\nfunction functor(d) {\n    return typeof d === \"function\" ? d : function() {\n        return d;\n    };\n}\nvar spirals = {\n    archimedean: archimedeanSpiral,\n    rectangular: rectangularSpiral\n};\nconst Output = [\n    \"x\",\n    \"y\",\n    \"font\",\n    \"fontSize\",\n    \"fontStyle\",\n    \"fontWeight\",\n    \"angle\"\n];\nconst Params = [\n    \"text\",\n    \"font\",\n    \"rotate\",\n    \"fontSize\",\n    \"fontStyle\",\n    \"fontWeight\"\n];\nfunction Wordcloud(params) {\n    (0, _vegaDataflow.Transform).call(this, cloud(), params);\n}\nWordcloud.Definition = {\n    \"type\": \"Wordcloud\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"font\",\n            \"type\": \"string\",\n            \"expr\": true,\n            \"default\": \"sans-serif\"\n        },\n        {\n            \"name\": \"fontStyle\",\n            \"type\": \"string\",\n            \"expr\": true,\n            \"default\": \"normal\"\n        },\n        {\n            \"name\": \"fontWeight\",\n            \"type\": \"string\",\n            \"expr\": true,\n            \"default\": \"normal\"\n        },\n        {\n            \"name\": \"fontSize\",\n            \"type\": \"number\",\n            \"expr\": true,\n            \"default\": 14\n        },\n        {\n            \"name\": \"fontSizeRange\",\n            \"type\": \"number\",\n            \"array\": \"nullable\",\n            \"default\": [\n                10,\n                50\n            ]\n        },\n        {\n            \"name\": \"rotate\",\n            \"type\": \"number\",\n            \"expr\": true,\n            \"default\": 0\n        },\n        {\n            \"name\": \"text\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"spiral\",\n            \"type\": \"string\",\n            \"values\": [\n                \"archimedean\",\n                \"rectangular\"\n            ]\n        },\n        {\n            \"name\": \"padding\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 7,\n            \"default\": Output\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Wordcloud, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (_.size && !(_.size[0] && _.size[1])) (0, _vegaUtil.error)(\"Wordcloud size dimensions must be non-zero.\");\n        function modp(param) {\n            const p = _[param];\n            return (0, _vegaUtil.isFunction)(p) && pulse.modified(p.fields);\n        }\n        const mod = _.modified();\n        if (!(mod || pulse.changed(pulse.ADD_REM) || Params.some(modp))) return;\n        const data = pulse.materialize(pulse.SOURCE).source, layout = this.value, as = _.as || Output;\n        let fontSize = _.fontSize || 14, range;\n        (0, _vegaUtil.isFunction)(fontSize) ? range = _.fontSizeRange : fontSize = (0, _vegaUtil.constant)(fontSize); // create font size scaling function as needed\n        if (range) {\n            const fsize = fontSize, sizeScale = (0, _vegaScale.scale)(\"sqrt\")().domain((0, _vegaUtil.extent)(data, fsize)).range(range);\n            fontSize = (x)=>sizeScale(fsize(x));\n        }\n        data.forEach((t)=>{\n            t[as[0]] = NaN;\n            t[as[1]] = NaN;\n            t[as[3]] = 0;\n        }); // configure layout\n        const words = layout.words(data).text(_.text).size(_.size || [\n            500,\n            500\n        ]).padding(_.padding || 1).spiral(_.spiral || \"archimedean\").rotate(_.rotate || 0).font(_.font || \"sans-serif\").fontStyle(_.fontStyle || \"normal\").fontWeight(_.fontWeight || \"normal\").fontSize(fontSize).random((0, _vegaStatistics.random)).layout();\n        const size = layout.size(), dx = size[0] >> 1, dy = size[1] >> 1, n = words.length;\n        for(let i = 0, w, t1; i < n; ++i){\n            w = words[i];\n            t1 = w.datum;\n            t1[as[0]] = w.x + dx;\n            t1[as[1]] = w.y + dy;\n            t1[as[2]] = w.font;\n            t1[as[3]] = w.size;\n            t1[as[4]] = w.style;\n            t1[as[5]] = w.weight;\n            t1[as[6]] = w.rotate;\n        }\n        return pulse.reflow(mod).modifies(as);\n    }\n});\n\n},{\"vega-canvas\":\"7F0ce\",\"vega-dataflow\":\"4kvYg\",\"vega-util\":\"dPFAY\",\"vega-scale\":\"evQIv\",\"vega-statistics\":\"hZmG3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e4OAM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"crossfilter\", ()=>CrossFilter);\nparcelHelpers.export(exports, \"resolvefilter\", ()=>ResolveFilter);\nvar _d3Array = require(\"d3-array\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nconst array8 = (n)=>new Uint8Array(n);\nconst array16 = (n)=>new Uint16Array(n);\nconst array32 = (n)=>new Uint32Array(n);\n/**\n * Maintains CrossFilter state.\n */ function Bitmaps() {\n    let width = 8, data = [], seen = array32(0), curr = array(0, width), prev = array(0, width);\n    return {\n        data: ()=>data,\n        seen: ()=>seen = lengthen(seen, data.length),\n        add (array1) {\n            for(let i = 0, j = data.length, n = array1.length, t; i < n; ++i){\n                t = array1[i];\n                t._index = j++;\n                data.push(t);\n            }\n        },\n        remove (num, map) {\n            // map: index -> boolean (true => remove)\n            const n = data.length, copy = Array(n - num), reindex = data; // reuse old data array for index map\n            let t, i, j; // seek forward to first removal\n            for(i = 0; !map[i] && i < n; ++i){\n                copy[i] = data[i];\n                reindex[i] = i;\n            } // condense arrays\n            for(j = i; i < n; ++i){\n                t = data[i];\n                if (!map[i]) {\n                    reindex[i] = j;\n                    curr[j] = curr[i];\n                    prev[j] = prev[i];\n                    copy[j] = t;\n                    t._index = j++;\n                } else reindex[i] = -1;\n                curr[i] = 0; // clear unused bits\n            }\n            data = copy;\n            return reindex;\n        },\n        size: ()=>data.length,\n        curr: ()=>curr,\n        prev: ()=>prev,\n        reset: (k)=>prev[k] = curr[k],\n        all: ()=>width < 0x101 ? 0xff : width < 0x10001 ? 0xffff : 0xffffffff,\n        set (k, one) {\n            curr[k] |= one;\n        },\n        clear (k, one) {\n            curr[k] &= ~one;\n        },\n        resize (n, m) {\n            const k = curr.length;\n            if (n > k || m > width) {\n                width = Math.max(m, width);\n                curr = array(n, width, curr);\n                prev = array(n, width);\n            }\n        }\n    };\n}\nfunction lengthen(array2, length, copy) {\n    if (array2.length >= length) return array2;\n    copy = copy || new array2.constructor(length);\n    copy.set(array2);\n    return copy;\n}\nfunction array(n, m, array3) {\n    const copy = (m < 0x101 ? array8 : m < 0x10001 ? array16 : array32)(n);\n    if (array3) copy.set(array3);\n    return copy;\n}\nfunction Dimension(index, i1, query) {\n    const bit = 1 << i1;\n    return {\n        one: bit,\n        zero: ~bit,\n        range: query.slice(),\n        bisect: index.bisect,\n        index: index.index,\n        size: index.size,\n        onAdd (added, curr) {\n            const dim = this, range = dim.bisect(dim.range, added.value), idx = added.index, lo = range[0], hi = range[1], n1 = idx.length;\n            let i;\n            for(i = 0; i < lo; ++i)curr[idx[i]] |= bit;\n            for(i = hi; i < n1; ++i)curr[idx[i]] |= bit;\n            return dim;\n        }\n    };\n}\n/**\n * Maintains a list of values, sorted by key.\n */ function SortedIndex() {\n    let index = array32(0), value = [], size = 0;\n    function insert(key, data, base) {\n        if (!data.length) return [];\n        const n0 = size, n1 = data.length, addi = array32(n1);\n        let addv = Array(n1), oldv, oldi, i;\n        for(i = 0; i < n1; ++i){\n            addv[i] = key(data[i]);\n            addi[i] = i;\n        }\n        addv = sort(addv, addi);\n        if (n0) {\n            oldv = value;\n            oldi = index;\n            value = Array(n0 + n1);\n            index = array32(n0 + n1);\n            merge(base, oldv, oldi, n0, addv, addi, n1, value, index);\n        } else {\n            if (base > 0) for(i = 0; i < n1; ++i)addi[i] += base;\n            value = addv;\n            index = addi;\n        }\n        size = n0 + n1;\n        return {\n            index: addi,\n            value: addv\n        };\n    }\n    function remove(num, map) {\n        // map: index -> remove\n        const n = size;\n        let idx, i, j; // seek forward to first removal\n        for(i = 0; !map[index[i]] && i < n; ++i); // condense index and value arrays\n        for(j = i; i < n; ++i)if (!map[idx = index[i]]) {\n            index[j] = idx;\n            value[j] = value[i];\n            ++j;\n        }\n        size = n - num;\n    }\n    function reindex(map) {\n        for(let i = 0, n = size; i < n; ++i)index[i] = map[index[i]];\n    }\n    function bisect(range, array4) {\n        let n;\n        if (array4) n = array4.length;\n        else {\n            array4 = value;\n            n = size;\n        }\n        return [\n            (0, _d3Array.bisectLeft)(array4, range[0], 0, n),\n            (0, _d3Array.bisectRight)(array4, range[1], 0, n)\n        ];\n    }\n    return {\n        insert: insert,\n        remove: remove,\n        bisect: bisect,\n        reindex: reindex,\n        index: ()=>index,\n        size: ()=>size\n    };\n}\nfunction sort(values, index) {\n    values.sort.call(index, (a, b)=>{\n        const x = values[a], y = values[b];\n        return x < y ? -1 : x > y ? 1 : 0;\n    });\n    return (0, _d3Array.permute)(values, index);\n}\nfunction merge(base, value0, index0, n0, value1, index1, n1, value, index) {\n    let i0 = 0, i1 = 0, i;\n    for(i = 0; i0 < n0 && i1 < n1; ++i)if (value0[i0] < value1[i1]) {\n        value[i] = value0[i0];\n        index[i] = index0[i0++];\n    } else {\n        value[i] = value1[i1];\n        index[i] = index1[i1++] + base;\n    }\n    for(; i0 < n0; ++i0, ++i){\n        value[i] = value0[i0];\n        index[i] = index0[i0];\n    }\n    for(; i1 < n1; ++i1, ++i){\n        value[i] = value1[i1];\n        index[i] = index1[i1] + base;\n    }\n}\n/**\n * An indexed multi-dimensional filter.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.fields - An array of dimension accessors to filter.\n * @param {Array} params.query - An array of per-dimension range queries.\n */ function CrossFilter(params) {\n    (0, _vegaDataflow.Transform).call(this, Bitmaps(), params);\n    this._indices = null;\n    this._dims = null;\n}\nCrossFilter.Definition = {\n    \"type\": \"CrossFilter\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true\n        },\n        {\n            \"name\": \"query\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"required\": true,\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(CrossFilter, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!this._dims) return this.init(_, pulse);\n        else {\n            var init = _.modified(\"fields\") || _.fields.some((f)=>pulse.modified(f.fields));\n            return init ? this.reinit(_, pulse) : this.eval(_, pulse);\n        }\n    },\n    init (_, pulse) {\n        const fields = _.fields, query = _.query, indices = this._indices = {}, dims = this._dims = [], m = query.length;\n        let i = 0, key, index; // instantiate indices and dimensions\n        for(; i < m; ++i){\n            key = fields[i].fname;\n            index = indices[key] || (indices[key] = SortedIndex());\n            dims.push(Dimension(index, i, query[i]));\n        }\n        return this.eval(_, pulse);\n    },\n    reinit (_, pulse) {\n        const output = pulse.materialize().fork(), fields = _.fields, query = _.query, indices = this._indices, dims = this._dims, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), out = output.rem = output.add, mod = output.mod, m = query.length, adds = {};\n        let add, index, key, mods, remMap, modMap, i, n, f; // set prev to current state\n        prev.set(curr); // if pulse has remove tuples, process them first\n        if (pulse.rem.length) remMap = this.remove(_, pulse, output);\n         // if pulse has added tuples, add them to state\n        if (pulse.add.length) bits.add(pulse.add);\n         // if pulse has modified tuples, create an index map\n        if (pulse.mod.length) {\n            modMap = {};\n            for(mods = pulse.mod, i = 0, n = mods.length; i < n; ++i)modMap[mods[i]._index] = 1;\n        } // re-initialize indices as needed, update curr bitmap\n        for(i = 0; i < m; ++i){\n            f = fields[i];\n            if (!dims[i] || _.modified(\"fields\", i) || pulse.modified(f.fields)) {\n                key = f.fname;\n                if (!(add = adds[key])) {\n                    indices[key] = index = SortedIndex();\n                    adds[key] = add = index.insert(f, pulse.source, 0);\n                }\n                dims[i] = Dimension(index, i, query[i]).onAdd(add, curr);\n            }\n        } // visit each tuple\n        // if filter state changed, push index to add/rem\n        // else if in mod and passes a filter, push index to mod\n        for(i = 0, n = bits.data().length; i < n; ++i){\n            if (remMap[i]) continue;\n            else if (prev[i] !== curr[i]) // add if state changed\n            out.push(i);\n            else if (modMap[i] && curr[i] !== all) // otherwise, pass mods through\n            mod.push(i);\n        }\n        bits.mask = (1 << m) - 1;\n        return output;\n    },\n    eval (_, pulse) {\n        const output = pulse.materialize().fork(), m = this._dims.length;\n        let mask = 0;\n        if (pulse.rem.length) {\n            this.remove(_, pulse, output);\n            mask |= (1 << m) - 1;\n        }\n        if (_.modified(\"query\") && !_.modified(\"fields\")) mask |= this.update(_, pulse, output);\n        if (pulse.add.length) {\n            this.insert(_, pulse, output);\n            mask |= (1 << m) - 1;\n        }\n        if (pulse.mod.length) {\n            this.modify(pulse, output);\n            mask |= (1 << m) - 1;\n        }\n        this.value.mask = mask;\n        return output;\n    },\n    insert (_, pulse, output) {\n        const tuples = pulse.add, bits = this.value, dims = this._dims, indices = this._indices, fields = _.fields, adds = {}, out = output.add, n = bits.size() + tuples.length, m = dims.length;\n        let k = bits.size(), j, key, add; // resize bitmaps and add tuples as needed\n        bits.resize(n, m);\n        bits.add(tuples);\n        const curr = bits.curr(), prev = bits.prev(), all = bits.all(); // add to dimensional indices\n        for(j = 0; j < m; ++j){\n            key = fields[j].fname;\n            add = adds[key] || (adds[key] = indices[key].insert(fields[j], tuples, k));\n            dims[j].onAdd(add, curr);\n        } // set previous filters, output if passes at least one filter\n        for(; k < n; ++k){\n            prev[k] = all;\n            if (curr[k] !== all) out.push(k);\n        }\n    },\n    modify (pulse, output) {\n        const out = output.mod, bits = this.value, curr = bits.curr(), all = bits.all(), tuples = pulse.mod;\n        let i, n, k;\n        for(i = 0, n = tuples.length; i < n; ++i){\n            k = tuples[i]._index;\n            if (curr[k] !== all) out.push(k);\n        }\n    },\n    remove (_, pulse, output) {\n        const indices = this._indices, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), map = {}, out = output.rem, tuples = pulse.rem;\n        let i, n, k, f; // process tuples, output if passes at least one filter\n        for(i = 0, n = tuples.length; i < n; ++i){\n            k = tuples[i]._index;\n            map[k] = 1; // build index map\n            prev[k] = f = curr[k];\n            curr[k] = all;\n            if (f !== all) out.push(k);\n        } // remove from dimensional indices\n        for(k in indices)indices[k].remove(n, map);\n        this.reindex(pulse, n, map);\n        return map;\n    },\n    // reindex filters and indices after propagation completes\n    reindex (pulse, num, map) {\n        const indices = this._indices, bits = this.value;\n        pulse.runAfter(()=>{\n            const indexMap = bits.remove(num, map);\n            for(const key in indices)indices[key].reindex(indexMap);\n        });\n    },\n    update (_, pulse, output) {\n        const dims = this._dims, query = _.query, stamp = pulse.stamp, m = dims.length;\n        let mask = 0, i, q; // survey how many queries have changed\n        output.filters = 0;\n        for(q = 0; q < m; ++q)if (_.modified(\"query\", q)) {\n            i = q;\n            ++mask;\n        }\n        if (mask === 1) {\n            // only one query changed, use more efficient update\n            mask = dims[i].one;\n            this.incrementOne(dims[i], query[i], output.add, output.rem);\n        } else // multiple queries changed, perform full record keeping\n        for(q = 0, mask = 0; q < m; ++q){\n            if (!_.modified(\"query\", q)) continue;\n            mask |= dims[q].one;\n            this.incrementAll(dims[q], query[q], stamp, output.add);\n            output.rem = output.add; // duplicate add/rem for downstream resolve\n        }\n        return mask;\n    },\n    incrementAll (dim, query, stamp, out) {\n        const bits = this.value, seen = bits.seen(), curr = bits.curr(), prev = bits.prev(), index = dim.index(), old = dim.bisect(dim.range), range = dim.bisect(query), lo1 = range[0], hi1 = range[1], lo0 = old[0], hi0 = old[1], one = dim.one;\n        let i, j, k; // Fast incremental update based on previous lo index.\n        if (lo1 < lo0) for(i = lo1, j = Math.min(lo0, hi1); i < j; ++i){\n            k = index[i];\n            if (seen[k] !== stamp) {\n                prev[k] = curr[k];\n                seen[k] = stamp;\n                out.push(k);\n            }\n            curr[k] ^= one;\n        }\n        else if (lo1 > lo0) for(i = lo0, j = Math.min(lo1, hi0); i < j; ++i){\n            k = index[i];\n            if (seen[k] !== stamp) {\n                prev[k] = curr[k];\n                seen[k] = stamp;\n                out.push(k);\n            }\n            curr[k] ^= one;\n        }\n         // Fast incremental update based on previous hi index.\n        if (hi1 > hi0) for(i = Math.max(lo1, hi0), j = hi1; i < j; ++i){\n            k = index[i];\n            if (seen[k] !== stamp) {\n                prev[k] = curr[k];\n                seen[k] = stamp;\n                out.push(k);\n            }\n            curr[k] ^= one;\n        }\n        else if (hi1 < hi0) for(i = Math.max(lo0, hi1), j = hi0; i < j; ++i){\n            k = index[i];\n            if (seen[k] !== stamp) {\n                prev[k] = curr[k];\n                seen[k] = stamp;\n                out.push(k);\n            }\n            curr[k] ^= one;\n        }\n        dim.range = query.slice();\n    },\n    incrementOne (dim, query, add, rem) {\n        const bits = this.value, curr = bits.curr(), index = dim.index(), old = dim.bisect(dim.range), range = dim.bisect(query), lo1 = range[0], hi1 = range[1], lo0 = old[0], hi0 = old[1], one = dim.one;\n        let i, j, k; // Fast incremental update based on previous lo index.\n        if (lo1 < lo0) for(i = lo1, j = Math.min(lo0, hi1); i < j; ++i){\n            k = index[i];\n            curr[k] ^= one;\n            add.push(k);\n        }\n        else if (lo1 > lo0) for(i = lo0, j = Math.min(lo1, hi0); i < j; ++i){\n            k = index[i];\n            curr[k] ^= one;\n            rem.push(k);\n        }\n         // Fast incremental update based on previous hi index.\n        if (hi1 > hi0) for(i = Math.max(lo1, hi0), j = hi1; i < j; ++i){\n            k = index[i];\n            curr[k] ^= one;\n            add.push(k);\n        }\n        else if (hi1 < hi0) for(i = Math.max(lo0, hi1), j = hi0; i < j; ++i){\n            k = index[i];\n            curr[k] ^= one;\n            rem.push(k);\n        }\n        dim.range = query.slice();\n    }\n});\n/**\n * Selectively filters tuples by resolving against a filter bitmap.\n * Useful for processing the output of a cross-filter transform.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.ignore - A bit mask indicating which filters to ignore.\n * @param {object} params.filter - The per-tuple filter bitmaps. Typically this\n *   parameter value is a reference to a {@link CrossFilter} transform.\n */ function ResolveFilter(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nResolveFilter.Definition = {\n    \"type\": \"ResolveFilter\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"ignore\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"description\": \"A bit mask indicating which filters to ignore.\"\n        },\n        {\n            \"name\": \"filter\",\n            \"type\": \"object\",\n            \"required\": true,\n            \"description\": \"Per-tuple filter bitmaps from a CrossFilter transform.\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(ResolveFilter, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const ignore = ~(_.ignore || 0), // bit mask where zeros -> dims to ignore\n        bitmap = _.filter, mask = bitmap.mask; // exit early if no relevant filter changes\n        if ((mask & ignore) === 0) return pulse.StopPropagation;\n        const output = pulse.fork(pulse.ALL), data = bitmap.data(), curr = bitmap.curr(), prev = bitmap.prev(), pass = (k)=>!(curr[k] & ignore) ? data[k] : null; // propagate all mod tuples that pass the filter\n        output.filter(output.MOD, pass); // determine add & rem tuples via filter functions\n        // for efficiency, we do *not* populate new arrays,\n        // instead we add filter functions applied downstream\n        if (!(mask & mask - 1)) {\n            // only one filter changed\n            output.filter(output.ADD, pass);\n            output.filter(output.REM, (k)=>(curr[k] & ignore) === mask ? data[k] : null);\n        } else {\n            // multiple filters changed\n            output.filter(output.ADD, (k)=>{\n                const c = curr[k] & ignore, f = !c && c ^ prev[k] & ignore;\n                return f ? data[k] : null;\n            });\n            output.filter(output.REM, (k)=>{\n                const c = curr[k] & ignore, f = c && !(c ^ (c ^ prev[k] & ignore));\n                return f ? data[k] : null;\n            });\n        } // add filter to source data in case of reflow...\n        return output.filter(output.SOURCE, (t)=>pass(t._index));\n    }\n});\n\n},{\"d3-array\":\"8JMcC\",\"vega-dataflow\":\"4kvYg\",\"vega-util\":\"dPFAY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"trjDL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"View\", ()=>View);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nvar _d3Array = require(\"d3-array\");\nvar _vegaFunctions = require(\"vega-functions\");\nvar _vegaRuntime = require(\"vega-runtime\");\nvar _d3Timer = require(\"d3-timer\");\nvar _vegaFormat = require(\"vega-format\");\n// initialize aria role and label attributes\nfunction initializeAria(view) {\n    const el = view.container();\n    if (el) {\n        el.setAttribute(\"role\", \"graphics-document\");\n        el.setAttribute(\"aria-roleDescription\", \"visualization\");\n        ariaLabel(el, view.description());\n    }\n} // update aria-label if we have a DOM container element\nfunction ariaLabel(el, desc) {\n    if (el) desc == null ? el.removeAttribute(\"aria-label\") : el.setAttribute(\"aria-label\", desc);\n}\nfunction background(view) {\n    // respond to background signal\n    view.add(null, (_)=>{\n        view._background = _.bg;\n        view._resize = 1;\n        return _.bg;\n    }, {\n        bg: view._signals.background\n    });\n}\nconst Default = \"default\";\nfunction cursor(view) {\n    // get cursor signal, add to dataflow if needed\n    const cursor1 = view._signals.cursor || (view._signals.cursor = view.add({\n        user: Default,\n        item: null\n    })); // evaluate cursor on each mousemove event\n    view.on(view.events(\"view\", \"mousemove\"), cursor1, (_, event1)=>{\n        const value = cursor1.value, user = value ? (0, _vegaUtil.isString)(value) ? value : value.user : Default, item = event1.item && event1.item.cursor || null;\n        return value && user === value.user && item == value.item ? value : {\n            user: user,\n            item: item\n        };\n    }); // when cursor signal updates, set visible cursor\n    view.add(null, function(_) {\n        let user = _.cursor, item = this.value;\n        if (!(0, _vegaUtil.isString)(user)) {\n            item = user.item;\n            user = user.user;\n        }\n        setCursor(view, user && user !== Default ? user : item || user);\n        return item;\n    }, {\n        cursor: cursor1\n    });\n}\nfunction setCursor(view, cursor2) {\n    const el = view.globalCursor() ? typeof document !== \"undefined\" && document.body : view.container();\n    if (el) return cursor2 == null ? el.style.removeProperty(\"cursor\") : el.style.cursor = cursor2;\n}\nfunction dataref(view, name) {\n    var data1 = view._runtime.data;\n    if (!(0, _vegaUtil.hasOwnProperty)(data1, name)) (0, _vegaUtil.error)(\"Unrecognized data set: \" + name);\n    return data1[name];\n}\nfunction data(name, values) {\n    return arguments.length < 2 ? dataref(this, name).values.value : change.call(this, name, (0, _vegaDataflow.changeset)().remove((0, _vegaUtil.truthy)).insert(values));\n}\nfunction change(name, changes) {\n    if (!(0, _vegaDataflow.isChangeSet)(changes)) (0, _vegaUtil.error)(\"Second argument to changes must be a changeset.\");\n    const dataset = dataref(this, name);\n    dataset.modified = true;\n    return this.pulse(dataset.input, changes);\n}\nfunction insert(name, _) {\n    return change.call(this, name, (0, _vegaDataflow.changeset)().insert(_));\n}\nfunction remove(name, _) {\n    return change.call(this, name, (0, _vegaDataflow.changeset)().remove(_));\n}\nfunction width(view) {\n    var padding1 = view.padding();\n    return Math.max(0, view._viewWidth + padding1.left + padding1.right);\n}\nfunction height(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewHeight + padding2.top + padding2.bottom);\n}\nfunction offset(view) {\n    var padding3 = view.padding(), origin = view._origin;\n    return [\n        padding3.left + origin[0],\n        padding3.top + origin[1]\n    ];\n}\nfunction resizeRenderer(view) {\n    var origin = offset(view), w = width(view), h = height(view);\n    view._renderer.background(view.background());\n    view._renderer.resize(w, h, origin);\n    view._handler.origin(origin);\n    view._resizeListeners.forEach((handler)=>{\n        try {\n            handler(w, h);\n        } catch (error) {\n            view.error(error);\n        }\n    });\n}\n/**\n * Extend an event with additional view-specific methods.\n * Adds a new property ('vega') to an event that provides a number\n * of methods for querying information about the current interaction.\n * The vega object provides the following methods:\n *   view - Returns the backing View instance.\n *   item - Returns the currently active scenegraph item (if any).\n *   group - Returns the currently active scenegraph group (if any).\n *     This method accepts a single string-typed argument indicating the name\n *     of the desired parent group. The scenegraph will be traversed from\n *     the item up towards the root to search for a matching group. If no\n *     argument is provided the enclosing group for the active item is\n *     returned, unless the item it itself a group, in which case it is\n *     returned directly.\n *   xy - Returns a two-element array containing the x and y coordinates for\n *     mouse or touch events. For touch events, this is based on the first\n *     elements in the changedTouches array. This method accepts a single\n *     argument: either an item instance or mark name that should serve as\n *     the reference coordinate system. If no argument is provided the\n *     top-level view coordinate system is assumed.\n *   x - Returns the current x-coordinate, accepts the same arguments as xy.\n *   y - Returns the current y-coordinate, accepts the same arguments as xy.\n * @param {Event} event - The input event to extend.\n * @param {Item} item - The currently active scenegraph item (if any).\n * @return {Event} - The extended input event.\n */ function eventExtend(view, event2, item) {\n    var r = view._renderer, el = r && r.canvas(), p, e, translate;\n    if (el) {\n        translate = offset(view);\n        e = event2.changedTouches ? event2.changedTouches[0] : event2;\n        p = (0, _vegaScenegraph.point)(e, el);\n        p[0] -= translate[0];\n        p[1] -= translate[1];\n    }\n    event2.dataflow = view;\n    event2.item = item;\n    event2.vega = extension(view, item, p);\n    return event2;\n}\nfunction extension(view, item1, point) {\n    const itemGroup = item1 ? item1.mark.marktype === \"group\" ? item1 : item1.mark.group : null;\n    function group(name) {\n        var g = itemGroup, i;\n        if (name) {\n            for(i = item1; i; i = i.mark.group)if (i.mark.name === name) {\n                g = i;\n                break;\n            }\n        }\n        return g && g.mark && g.mark.interactive ? g : {};\n    }\n    function xy(item) {\n        if (!item) return point;\n        if ((0, _vegaUtil.isString)(item)) item = group(item);\n        const p = point.slice();\n        while(item){\n            p[0] -= item.x || 0;\n            p[1] -= item.y || 0;\n            item = item.mark && item.mark.group;\n        }\n        return p;\n    }\n    return {\n        view: (0, _vegaUtil.constant)(view),\n        item: (0, _vegaUtil.constant)(item1 || {}),\n        group: group,\n        xy: xy,\n        x: (item)=>xy(item)[0],\n        y: (item)=>xy(item)[1]\n    };\n}\nconst VIEW = \"view\", TIMER = \"timer\", WINDOW = \"window\", NO_TRAP = {\n    trap: false\n};\n/**\n * Initialize event handling configuration.\n * @param {object} config - The configuration settings.\n * @return {object}\n */ function initializeEventConfig(config) {\n    const events1 = (0, _vegaUtil.extend)({\n        defaults: {}\n    }, config);\n    const unpack = (obj, keys)=>{\n        keys.forEach((k)=>{\n            if ((0, _vegaUtil.isArray)(obj[k])) obj[k] = (0, _vegaUtil.toSet)(obj[k]);\n        });\n    };\n    unpack(events1.defaults, [\n        \"prevent\",\n        \"allow\"\n    ]);\n    unpack(events1, [\n        \"view\",\n        \"window\",\n        \"selector\"\n    ]);\n    return events1;\n}\nfunction trackEventListener(view, sources, type, handler) {\n    view._eventListeners.push({\n        type: type,\n        sources: (0, _vegaUtil.array)(sources),\n        handler: handler\n    });\n}\nfunction prevent(view, type) {\n    var def = view._eventConfig.defaults, prevent1 = def.prevent, allow = def.allow;\n    return prevent1 === false || allow === true ? false : prevent1 === true || allow === false ? true : prevent1 ? prevent1[type] : allow ? !allow[type] : view.preventDefault();\n}\nfunction permit(view, key, type) {\n    const rule = view._eventConfig && view._eventConfig[key];\n    if (rule === false || (0, _vegaUtil.isObject)(rule) && !rule[type]) {\n        view.warn(`Blocked ${key} ${type} event listener.`);\n        return false;\n    }\n    return true;\n}\n/**\n * Create a new event stream from an event source.\n * @param {object} source - The event source to monitor.\n * @param {string} type - The event type.\n * @param {function(object): boolean} [filter] - Event filter function.\n * @return {EventStream}\n */ function events(source, type, filter) {\n    var view = this, s = new (0, _vegaDataflow.EventStream)(filter), send = function(e, item) {\n        view.runAsync(null, ()=>{\n            if (source === VIEW && prevent(view, type)) e.preventDefault();\n            s.receive(eventExtend(view, e, item));\n        });\n    }, sources;\n    if (source === TIMER) {\n        if (permit(view, \"timer\", type)) view.timer(send, type);\n    } else if (source === VIEW) {\n        if (permit(view, \"view\", type)) // send traps errors, so use {trap: false} option\n        view.addEventListener(type, send, NO_TRAP);\n    } else {\n        if (source === WINDOW) {\n            if (permit(view, \"window\", type) && typeof window !== \"undefined\") sources = [\n                window\n            ];\n        } else if (typeof document !== \"undefined\") {\n            if (permit(view, \"selector\", type)) sources = document.querySelectorAll(source);\n        }\n        if (!sources) view.warn(\"Can not resolve event source: \" + source);\n        else {\n            for(var i = 0, n = sources.length; i < n; ++i)sources[i].addEventListener(type, send);\n            trackEventListener(view, sources, type, send);\n        }\n    }\n    return s;\n}\nfunction itemFilter(event3) {\n    return event3.item;\n}\nfunction markTarget(event4) {\n    // grab upstream collector feeding the mark operator\n    return event4.item.mark.source;\n}\nfunction invoke(name) {\n    return function(_, event5) {\n        return event5.vega.view().changeset().encode(event5.item, name);\n    };\n}\nfunction hover(hoverSet, leaveSet) {\n    hoverSet = [\n        hoverSet || \"hover\"\n    ];\n    leaveSet = [\n        leaveSet || \"update\",\n        hoverSet[0]\n    ]; // invoke hover set upon mouseover\n    this.on(this.events(\"view\", \"mouseover\", itemFilter), markTarget, invoke(hoverSet)); // invoke leave set upon mouseout\n    this.on(this.events(\"view\", \"mouseout\", itemFilter), markTarget, invoke(leaveSet));\n    return this;\n}\n/**\n * Finalize a View instance that is being removed.\n * Cancel any running timers.\n * Remove all external event listeners.\n * Remove any currently displayed tooltip.\n */ function finalize() {\n    var tooltip = this._tooltip, timers = this._timers, listeners = this._eventListeners, n, m, e;\n    n = timers.length;\n    while(--n >= 0)timers[n].stop();\n    n = listeners.length;\n    while(--n >= 0){\n        e = listeners[n];\n        m = e.sources.length;\n        while(--m >= 0)e.sources[m].removeEventListener(e.type, e.handler);\n    }\n    if (tooltip) tooltip.call(this, this._handler, null, null, null);\n    return this;\n}\nfunction element(tag, attr, text) {\n    const el = document.createElement(tag);\n    for(const key in attr)el.setAttribute(key, attr[key]);\n    if (text != null) el.textContent = text;\n    return el;\n}\nconst BindClass = \"vega-bind\", NameClass = \"vega-bind-name\", RadioClass = \"vega-bind-radio\";\n/**\n * Bind a signal to an external HTML input element. The resulting two-way\n * binding will propagate input changes to signals, and propagate signal\n * changes to the input element state. If this view instance has no parent\n * element, we assume the view is headless and no bindings are created.\n * @param {Element|string} el - The parent DOM element to which the input\n *   element should be appended as a child. If string-valued, this argument\n *   will be treated as a CSS selector. If null or undefined, the parent\n *   element of this view will be used as the element.\n * @param {object} param - The binding parameters which specify the signal\n *   to bind to, the input element type, and type-specific configuration.\n * @return {View} - This view instance.\n */ function bind(view, el, binding) {\n    if (!el) return;\n    const param = binding.param;\n    let bind1 = binding.state;\n    if (!bind1) {\n        bind1 = binding.state = {\n            elements: null,\n            active: false,\n            set: null,\n            update: (value)=>{\n                if (value != view.signal(param.signal)) view.runAsync(null, ()=>{\n                    bind1.source = true;\n                    view.signal(param.signal, value);\n                });\n            }\n        };\n        if (param.debounce) bind1.update = (0, _vegaUtil.debounce)(param.debounce, bind1.update);\n    }\n    const create = param.input == null && param.element ? target : generate;\n    create(bind1, el, param, view);\n    if (!bind1.active) {\n        view.on(view._signals[param.signal], null, ()=>{\n            bind1.source ? bind1.source = false : bind1.set(view.signal(param.signal));\n        });\n        bind1.active = true;\n    }\n    return bind1;\n}\n/**\n * Bind the signal to an external EventTarget.\n */ function target(bind2, node, param, view) {\n    const type = param.event || \"input\";\n    const handler = ()=>bind2.update(node.value); // initialize signal value to external input value\n    view.signal(param.signal, node.value); // listen for changes on the element\n    node.addEventListener(type, handler); // register with view, so we can remove it upon finalization\n    trackEventListener(view, node, type, handler); // propagate change to element\n    bind2.set = (value)=>{\n        node.value = value;\n        node.dispatchEvent(event(type));\n    };\n}\nfunction event(type) {\n    return typeof Event !== \"undefined\" ? new Event(type) : {\n        type\n    };\n}\n/**\n * Generate an HTML input form element and bind it to a signal.\n */ function generate(bind3, el, param, view) {\n    const value = view.signal(param.signal);\n    const div = element(\"div\", {\n        \"class\": BindClass\n    });\n    const wrapper = param.input === \"radio\" ? div : div.appendChild(element(\"label\"));\n    wrapper.appendChild(element(\"span\", {\n        \"class\": NameClass\n    }, param.name || param.signal));\n    el.appendChild(div);\n    let input = form;\n    switch(param.input){\n        case \"checkbox\":\n            input = checkbox;\n            break;\n        case \"select\":\n            input = select;\n            break;\n        case \"radio\":\n            input = radio;\n            break;\n        case \"range\":\n            input = range;\n            break;\n    }\n    input(bind3, wrapper, param, value);\n}\n/**\n * Generates an arbitrary input form element.\n * The input type is controlled via user-provided parameters.\n */ function form(bind4, el, param, value1) {\n    const node = element(\"input\");\n    for(const key in param)if (key !== \"signal\" && key !== \"element\") node.setAttribute(key === \"input\" ? \"type\" : key, param[key]);\n    node.setAttribute(\"name\", param.signal);\n    node.value = value1;\n    el.appendChild(node);\n    node.addEventListener(\"input\", ()=>bind4.update(node.value));\n    bind4.elements = [\n        node\n    ];\n    bind4.set = (value)=>node.value = value;\n}\n/**\n * Generates a checkbox input element.\n */ function checkbox(bind5, el, param, value2) {\n    const attr = {\n        type: \"checkbox\",\n        name: param.signal\n    };\n    if (value2) attr.checked = true;\n    const node = element(\"input\", attr);\n    el.appendChild(node);\n    node.addEventListener(\"change\", ()=>bind5.update(node.checked));\n    bind5.elements = [\n        node\n    ];\n    bind5.set = (value)=>node.checked = !!value || null;\n}\n/**\n * Generates a selection list input element.\n */ function select(bind6, el, param, value3) {\n    const node = element(\"select\", {\n        name: param.signal\n    }), labels = param.labels || [];\n    param.options.forEach((option, i)=>{\n        const attr = {\n            value: option\n        };\n        if (valuesEqual(option, value3)) attr.selected = true;\n        node.appendChild(element(\"option\", attr, (labels[i] || option) + \"\"));\n    });\n    el.appendChild(node);\n    node.addEventListener(\"change\", ()=>{\n        bind6.update(param.options[node.selectedIndex]);\n    });\n    bind6.elements = [\n        node\n    ];\n    bind6.set = (value)=>{\n        for(let i = 0, n = param.options.length; i < n; ++i)if (valuesEqual(param.options[i], value)) {\n            node.selectedIndex = i;\n            return;\n        }\n    };\n}\n/**\n * Generates a radio button group.\n */ function radio(bind7, el, param, value4) {\n    const group = element(\"span\", {\n        \"class\": RadioClass\n    }), labels = param.labels || [];\n    el.appendChild(group);\n    bind7.elements = param.options.map((option, i)=>{\n        const attr = {\n            type: \"radio\",\n            name: param.signal,\n            value: option\n        };\n        if (valuesEqual(option, value4)) attr.checked = true;\n        const input = element(\"input\", attr);\n        input.addEventListener(\"change\", ()=>bind7.update(option));\n        const label = element(\"label\", {}, (labels[i] || option) + \"\");\n        label.prepend(input);\n        group.appendChild(label);\n        return input;\n    });\n    bind7.set = (value)=>{\n        const nodes = bind7.elements, n = nodes.length;\n        for(let i = 0; i < n; ++i)if (valuesEqual(nodes[i].value, value)) nodes[i].checked = true;\n    };\n}\n/**\n * Generates a slider input element.\n */ function range(bind8, el, param, value5) {\n    value5 = value5 !== undefined ? value5 : (+param.max + +param.min) / 2;\n    const max = param.max != null ? param.max : Math.max(100, +value5) || 100, min = param.min || Math.min(0, max, +value5) || 0, step = param.step || (0, _d3Array.tickStep)(min, max, 100);\n    const node = element(\"input\", {\n        type: \"range\",\n        name: param.signal,\n        min: min,\n        max: max,\n        step: step\n    });\n    node.value = value5;\n    const span = element(\"span\", {}, +value5);\n    el.appendChild(node);\n    el.appendChild(span);\n    const update = ()=>{\n        span.textContent = node.value;\n        bind8.update(+node.value);\n    }; // subscribe to both input and change\n    node.addEventListener(\"input\", update);\n    node.addEventListener(\"change\", update);\n    bind8.elements = [\n        node\n    ];\n    bind8.set = (value)=>{\n        node.value = value;\n        span.textContent = value;\n    };\n}\nfunction valuesEqual(a, b) {\n    return a === b || a + \"\" === b + \"\";\n}\nfunction initializeRenderer(view, r, el, constructor, scaleFactor, opt) {\n    r = r || new constructor(view.loader());\n    return r.initialize(el, width(view), height(view), offset(view), scaleFactor, opt).background(view.background());\n}\nfunction trap(view, fn) {\n    return !fn ? null : function() {\n        try {\n            fn.apply(this, arguments);\n        } catch (error) {\n            view.error(error);\n        }\n    };\n}\nfunction initializeHandler(view, prevHandler, el, constructor) {\n    // instantiate scenegraph handler\n    const handler = new constructor(view.loader(), trap(view, view.tooltip())).scene(view.scenegraph().root).initialize(el, offset(view), view); // transfer event handlers\n    if (prevHandler) prevHandler.handlers().forEach((h)=>{\n        handler.on(h.type, h.handler);\n    });\n    return handler;\n}\nfunction initialize(el, elBind) {\n    const view = this, type = view._renderType, config = view._eventConfig.bind, module = (0, _vegaScenegraph.renderModule)(type); // containing dom element\n    el = view._el = el ? lookup(view, el, true) : null; // initialize aria attributes\n    initializeAria(view); // select appropriate renderer & handler\n    if (!module) view.error(\"Unrecognized renderer type: \" + type);\n    const Handler = module.handler || (0, _vegaScenegraph.CanvasHandler), Renderer = el ? module.renderer : module.headless; // initialize renderer and input handler\n    view._renderer = !Renderer ? null : initializeRenderer(view, view._renderer, el, Renderer);\n    view._handler = initializeHandler(view, view._handler, el, Handler);\n    view._redraw = true; // initialize signal bindings\n    if (el && config !== \"none\") {\n        elBind = elBind ? view._elBind = lookup(view, elBind, true) : el.appendChild(element(\"form\", {\n            \"class\": \"vega-bindings\"\n        }));\n        view._bind.forEach((_)=>{\n            if (_.param.element && config !== \"container\") _.element = lookup(view, _.param.element, !!_.param.input);\n        });\n        view._bind.forEach((_)=>{\n            bind(view, _.element || elBind, _);\n        });\n    }\n    return view;\n}\nfunction lookup(view, el, clear) {\n    if (typeof el === \"string\") {\n        if (typeof document !== \"undefined\") {\n            el = document.querySelector(el);\n            if (!el) {\n                view.error(\"Signal bind element not found: \" + el);\n                return null;\n            }\n        } else {\n            view.error(\"DOM document instance not found.\");\n            return null;\n        }\n    }\n    if (el && clear) try {\n        el.innerHTML = \"\";\n    } catch (e) {\n        el = null;\n        view.error(e);\n    }\n    return el;\n}\nconst number = (_)=>+_ || 0;\nconst paddingObject = (_)=>({\n        top: _,\n        bottom: _,\n        left: _,\n        right: _\n    });\nfunction padding(_) {\n    return (0, _vegaUtil.isObject)(_) ? {\n        top: number(_.top),\n        bottom: number(_.bottom),\n        left: number(_.left),\n        right: number(_.right)\n    } : paddingObject(number(_));\n}\n/**\n * Render the current scene in a headless fashion.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A Promise that resolves to a renderer.\n */ async function renderHeadless(view, type, scaleFactor, opt) {\n    const module = (0, _vegaScenegraph.renderModule)(type), ctr = module && module.headless;\n    if (!ctr) (0, _vegaUtil.error)(\"Unrecognized renderer type: \" + type);\n    await view.runAsync();\n    return initializeRenderer(view, null, null, ctr, scaleFactor, opt).renderAsync(view._scenegraph.root);\n}\n/**\n * Produce an image URL for the visualization. Depending on the type\n * parameter, the generated URL contains data for either a PNG or SVG image.\n * The URL can be used (for example) to download images of the visualization.\n * This method is asynchronous, returning a Promise instance.\n * @param {string} type - The image type. One of 'svg', 'png' or 'canvas'.\n *   The 'canvas' and 'png' types are synonyms for a PNG image.\n * @return {Promise} - A promise that resolves to an image URL.\n */ async function renderToImageURL(type, scaleFactor) {\n    if (type !== (0, _vegaScenegraph.RenderType).Canvas && type !== (0, _vegaScenegraph.RenderType).SVG && type !== (0, _vegaScenegraph.RenderType).PNG) (0, _vegaUtil.error)(\"Unrecognized image type: \" + type);\n    const r = await renderHeadless(this, type, scaleFactor);\n    return type === (0, _vegaScenegraph.RenderType).SVG ? toBlobURL(r.svg(), \"image/svg+xml\") : r.canvas().toDataURL(\"image/png\");\n}\nfunction toBlobURL(data2, mime) {\n    const blob = new Blob([\n        data2\n    ], {\n        type: mime\n    });\n    return window.URL.createObjectURL(blob);\n}\n/**\n * Produce a Canvas instance containing a rendered visualization.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A promise that resolves to a Canvas instance.\n */ async function renderToCanvas(scaleFactor, opt) {\n    const r = await renderHeadless(this, (0, _vegaScenegraph.RenderType).Canvas, scaleFactor, opt);\n    return r.canvas();\n}\n/**\n * Produce a rendered SVG string of the visualization.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A promise that resolves to an SVG string.\n */ async function renderToSVG(scaleFactor) {\n    const r = await renderHeadless(this, (0, _vegaScenegraph.RenderType).SVG, scaleFactor);\n    return r.svg();\n}\nfunction runtime(view, spec, expr) {\n    return (0, _vegaRuntime.context)(view, (0, _vegaDataflow.transforms), (0, _vegaFunctions.functionContext), expr).parse(spec);\n}\nfunction scale(name) {\n    var scales = this._runtime.scales;\n    if (!(0, _vegaUtil.hasOwnProperty)(scales, name)) (0, _vegaUtil.error)(\"Unrecognized scale or projection: \" + name);\n    return scales[name].value;\n}\nvar Width = \"width\", Height = \"height\", Padding = \"padding\", Skip = {\n    skip: true\n};\nfunction viewWidth(view, width1) {\n    var a = view.autosize(), p = view.padding();\n    return width1 - (a && a.contains === Padding ? p.left + p.right : 0);\n}\nfunction viewHeight(view, height1) {\n    var a = view.autosize(), p = view.padding();\n    return height1 - (a && a.contains === Padding ? p.top + p.bottom : 0);\n}\nfunction initializeResize(view) {\n    var s = view._signals, w = s[Width], h = s[Height], p = s[Padding];\n    function resetSize() {\n        view._autosize = view._resize = 1;\n    } // respond to width signal\n    view._resizeWidth = view.add(null, (_)=>{\n        view._width = _.size;\n        view._viewWidth = viewWidth(view, _.size);\n        resetSize();\n    }, {\n        size: w\n    }); // respond to height signal\n    view._resizeHeight = view.add(null, (_)=>{\n        view._height = _.size;\n        view._viewHeight = viewHeight(view, _.size);\n        resetSize();\n    }, {\n        size: h\n    }); // respond to padding signal\n    const resizePadding = view.add(null, resetSize, {\n        pad: p\n    }); // set rank to run immediately after source signal\n    view._resizeWidth.rank = w.rank + 1;\n    view._resizeHeight.rank = h.rank + 1;\n    resizePadding.rank = p.rank + 1;\n}\nfunction resizeView(viewWidth1, viewHeight1, width2, height2, origin, auto) {\n    this.runAfter((view)=>{\n        let rerun = 0; // reset autosize flag\n        view._autosize = 0; // width value changed: update signal, skip resize op\n        if (view.width() !== width2) {\n            rerun = 1;\n            view.signal(Width, width2, Skip); // set width, skip update calc\n            view._resizeWidth.skip(true); // skip width resize handler\n        } // height value changed: update signal, skip resize op\n        if (view.height() !== height2) {\n            rerun = 1;\n            view.signal(Height, height2, Skip); // set height, skip update calc\n            view._resizeHeight.skip(true); // skip height resize handler\n        } // view width changed: update view property, set resize flag\n        if (view._viewWidth !== viewWidth1) {\n            view._resize = 1;\n            view._viewWidth = viewWidth1;\n        } // view height changed: update view property, set resize flag\n        if (view._viewHeight !== viewHeight1) {\n            view._resize = 1;\n            view._viewHeight = viewHeight1;\n        } // origin changed: update view property, set resize flag\n        if (view._origin[0] !== origin[0] || view._origin[1] !== origin[1]) {\n            view._resize = 1;\n            view._origin = origin;\n        } // run dataflow on width/height signal change\n        if (rerun) view.run(\"enter\");\n        if (auto) view.runAfter((v)=>v.resize());\n    }, false, 1);\n}\n/**\n * Get the current view state, consisting of signal values and/or data sets.\n * @param {object} [options] - Options flags indicating which state to export.\n *   If unspecified, all signals and data sets will be exported.\n * @param {function(string, Operator):boolean} [options.signals] - Optional\n *   predicate function for testing if a signal should be included in the\n *   exported state. If unspecified, all signals will be included, except for\n *   those named 'parent' or those which refer to a Transform value.\n * @param {function(string, object):boolean} [options.data] - Optional\n *   predicate function for testing if a data set's input should be included\n *   in the exported state. If unspecified, all data sets that have been\n *   explicitly modified will be included.\n * @param {boolean} [options.recurse=true] - Flag indicating if the exported\n *   state should recursively include state from group mark sub-contexts.\n * @return {object} - An object containing the exported state values.\n */ function getState(options) {\n    return this._runtime.getState(options || {\n        data: dataTest,\n        signals: signalTest,\n        recurse: true\n    });\n}\nfunction dataTest(name, data3) {\n    return data3.modified && (0, _vegaUtil.isArray)(data3.input.value) && name.indexOf(\"_:vega:_\");\n}\nfunction signalTest(name, op) {\n    return !(name === \"parent\" || op instanceof (0, _vegaDataflow.transforms).proxy);\n}\n/**\n * Sets the current view state and updates the view by invoking run.\n * @param {object} state - A state object containing signal and/or\n *   data set values, following the format used by the getState method.\n * @return {View} - This view instance.\n */ function setState(state) {\n    this.runAsync(null, (v)=>{\n        v._trigger = false;\n        v._runtime.setState(state);\n    }, (v)=>{\n        v._trigger = true;\n    });\n    return this;\n}\nfunction timer(callback, delay) {\n    function tick(elapsed) {\n        callback({\n            timestamp: Date.now(),\n            elapsed: elapsed\n        });\n    }\n    this._timers.push((0, _d3Timer.interval)(tick, delay));\n}\nfunction defaultTooltip(handler, event, item, value) {\n    const el = handler.element();\n    if (el) el.setAttribute(\"title\", formatTooltip(value));\n}\nfunction formatTooltip(value) {\n    return value == null ? \"\" : (0, _vegaUtil.isArray)(value) ? formatArray(value) : (0, _vegaUtil.isObject)(value) && !(0, _vegaUtil.isDate)(value) ? formatObject(value) : value + \"\";\n}\nfunction formatObject(obj) {\n    return Object.keys(obj).map((key)=>{\n        const v = obj[key];\n        return key + \": \" + ((0, _vegaUtil.isArray)(v) ? formatArray(v) : formatValue(v));\n    }).join(\"\\n\");\n}\nfunction formatArray(value) {\n    return \"[\" + value.map(formatValue).join(\", \") + \"]\";\n}\nfunction formatValue(value) {\n    return (0, _vegaUtil.isArray)(value) ? \"[\\u2026]\" : (0, _vegaUtil.isObject)(value) && !(0, _vegaUtil.isDate)(value) ? \"{\\u2026}\" : value;\n}\n/**\n * Create a new View instance from a Vega dataflow runtime specification.\n * The generated View will not immediately be ready for display. Callers\n * should also invoke the initialize method (e.g., to set the parent\n * DOM element in browser-based deployment) and then invoke the run\n * method to evaluate the dataflow graph. Rendering will automatically\n * be performed upon dataflow runs.\n * @constructor\n * @param {object} spec - The Vega dataflow runtime specification.\n */ function View(spec, options) {\n    const view = this;\n    options = options || {};\n    (0, _vegaDataflow.Dataflow).call(view);\n    if (options.loader) view.loader(options.loader);\n    if (options.logger) view.logger(options.logger);\n    if (options.logLevel != null) view.logLevel(options.logLevel);\n    if (options.locale || spec.locale) {\n        const loc = (0, _vegaUtil.extend)({}, spec.locale, options.locale);\n        view.locale((0, _vegaFormat.locale)(loc.number, loc.time));\n    }\n    view._el = null;\n    view._elBind = null;\n    view._renderType = options.renderer || (0, _vegaScenegraph.RenderType).Canvas;\n    view._scenegraph = new (0, _vegaScenegraph.Scenegraph)();\n    const root = view._scenegraph.root; // initialize renderer, handler and event management\n    view._renderer = null;\n    view._tooltip = options.tooltip || defaultTooltip, view._redraw = true;\n    view._handler = new (0, _vegaScenegraph.CanvasHandler)().scene(root);\n    view._globalCursor = false;\n    view._preventDefault = false;\n    view._timers = [];\n    view._eventListeners = [];\n    view._resizeListeners = []; // initialize event configuration\n    view._eventConfig = initializeEventConfig(spec.eventConfig);\n    view.globalCursor(view._eventConfig.globalCursor); // initialize dataflow graph\n    const ctx = runtime(view, spec, options.expr);\n    view._runtime = ctx;\n    view._signals = ctx.signals;\n    view._bind = (spec.bindings || []).map((_)=>({\n            state: null,\n            param: (0, _vegaUtil.extend)({}, _)\n        })); // initialize scenegraph\n    if (ctx.root) ctx.root.set(root);\n    root.source = ctx.data.root.input;\n    view.pulse(ctx.data.root.input, view.changeset().insert(root.items)); // initialize view size\n    view._width = view.width();\n    view._height = view.height();\n    view._viewWidth = viewWidth(view, view._width);\n    view._viewHeight = viewHeight(view, view._height);\n    view._origin = [\n        0,\n        0\n    ];\n    view._resize = 0;\n    view._autosize = 1;\n    initializeResize(view); // initialize background color\n    background(view); // initialize cursor\n    cursor(view); // initialize view description\n    view.description(spec.description); // initialize hover proessing, if requested\n    if (options.hover) view.hover(); // initialize DOM container(s) and renderer\n    if (options.container) view.initialize(options.container, options.bind);\n}\nfunction lookupSignal(view, name) {\n    return (0, _vegaUtil.hasOwnProperty)(view._signals, name) ? view._signals[name] : (0, _vegaUtil.error)(\"Unrecognized signal name: \" + (0, _vegaUtil.stringValue)(name));\n}\nfunction findOperatorHandler(op1, handler) {\n    const h = (op1._targets || []).filter((op)=>op._update && op._update.handler === handler);\n    return h.length ? h[0] : null;\n}\nfunction addOperatorListener(view, name, op, handler) {\n    let h = findOperatorHandler(op, handler);\n    if (!h) {\n        h = trap(view, ()=>handler(name, op.value));\n        h.handler = handler;\n        view.on(op, null, h);\n    }\n    return view;\n}\nfunction removeOperatorListener(view, op, handler) {\n    const h = findOperatorHandler(op, handler);\n    if (h) op._targets.remove(h);\n    return view;\n}\n(0, _vegaUtil.inherits)(View, (0, _vegaDataflow.Dataflow), {\n    // -- DATAFLOW / RENDERING ----\n    async evaluate (encode, prerun, postrun) {\n        // evaluate dataflow and prerun\n        await (0, _vegaDataflow.Dataflow).prototype.evaluate.call(this, encode, prerun); // render as needed\n        if (this._redraw || this._resize) try {\n            if (this._renderer) {\n                if (this._resize) {\n                    this._resize = 0;\n                    resizeRenderer(this);\n                }\n                await this._renderer.renderAsync(this._scenegraph.root);\n            }\n            this._redraw = false;\n        } catch (e) {\n            this.error(e);\n        }\n         // evaluate postrun\n        if (postrun) (0, _vegaDataflow.asyncCallback)(this, postrun);\n        return this;\n    },\n    dirty (item) {\n        this._redraw = true;\n        this._renderer && this._renderer.dirty(item);\n    },\n    // -- GET / SET ----\n    description (text) {\n        if (arguments.length) {\n            const desc = text != null ? text + \"\" : null;\n            if (desc !== this._desc) ariaLabel(this._el, this._desc = desc);\n            return this;\n        }\n        return this._desc;\n    },\n    container () {\n        return this._el;\n    },\n    scenegraph () {\n        return this._scenegraph;\n    },\n    origin () {\n        return this._origin.slice();\n    },\n    signal (name, value, options) {\n        const op = lookupSignal(this, name);\n        return arguments.length === 1 ? op.value : this.update(op, value, options);\n    },\n    width (_) {\n        return arguments.length ? this.signal(\"width\", _) : this.signal(\"width\");\n    },\n    height (_) {\n        return arguments.length ? this.signal(\"height\", _) : this.signal(\"height\");\n    },\n    padding (_) {\n        return arguments.length ? this.signal(\"padding\", padding(_)) : padding(this.signal(\"padding\"));\n    },\n    autosize (_) {\n        return arguments.length ? this.signal(\"autosize\", _) : this.signal(\"autosize\");\n    },\n    background (_) {\n        return arguments.length ? this.signal(\"background\", _) : this.signal(\"background\");\n    },\n    renderer (type) {\n        if (!arguments.length) return this._renderType;\n        if (!(0, _vegaScenegraph.renderModule)(type)) (0, _vegaUtil.error)(\"Unrecognized renderer type: \" + type);\n        if (type !== this._renderType) {\n            this._renderType = type;\n            this._resetRenderer();\n        }\n        return this;\n    },\n    tooltip (handler) {\n        if (!arguments.length) return this._tooltip;\n        if (handler !== this._tooltip) {\n            this._tooltip = handler;\n            this._resetRenderer();\n        }\n        return this;\n    },\n    loader (loader) {\n        if (!arguments.length) return this._loader;\n        if (loader !== this._loader) {\n            (0, _vegaDataflow.Dataflow).prototype.loader.call(this, loader);\n            this._resetRenderer();\n        }\n        return this;\n    },\n    resize () {\n        // set flag to perform autosize\n        this._autosize = 1; // touch autosize signal to ensure top-level ViewLayout runs\n        return this.touch(lookupSignal(this, \"autosize\"));\n    },\n    _resetRenderer () {\n        if (this._renderer) {\n            this._renderer = null;\n            this.initialize(this._el, this._elBind);\n        }\n    },\n    // -- SIZING ----\n    _resizeView: resizeView,\n    // -- EVENT HANDLING ----\n    addEventListener (type, handler, options) {\n        let callback = handler;\n        if (!(options && options.trap === false)) {\n            // wrap callback in error handler\n            callback = trap(this, handler);\n            callback.raw = handler;\n        }\n        this._handler.on(type, callback);\n        return this;\n    },\n    removeEventListener (type, handler) {\n        var handlers = this._handler.handlers(type), i = handlers.length, h, t; // search registered handlers, remove if match found\n        while(--i >= 0){\n            t = handlers[i].type;\n            h = handlers[i].handler;\n            if (type === t && (handler === h || handler === h.raw)) {\n                this._handler.off(t, h);\n                break;\n            }\n        }\n        return this;\n    },\n    addResizeListener (handler) {\n        const l = this._resizeListeners;\n        if (l.indexOf(handler) < 0) // add handler if it isn't already registered\n        // note: error trapping handled elsewhere, so\n        // no need to wrap handlers here\n        l.push(handler);\n        return this;\n    },\n    removeResizeListener (handler) {\n        var l = this._resizeListeners, i = l.indexOf(handler);\n        if (i >= 0) l.splice(i, 1);\n        return this;\n    },\n    addSignalListener (name, handler) {\n        return addOperatorListener(this, name, lookupSignal(this, name), handler);\n    },\n    removeSignalListener (name, handler) {\n        return removeOperatorListener(this, lookupSignal(this, name), handler);\n    },\n    addDataListener (name, handler) {\n        return addOperatorListener(this, name, dataref(this, name).values, handler);\n    },\n    removeDataListener (name, handler) {\n        return removeOperatorListener(this, dataref(this, name).values, handler);\n    },\n    globalCursor (_) {\n        if (arguments.length) {\n            if (this._globalCursor !== !!_) {\n                const prev = setCursor(this, null); // clear previous cursor\n                this._globalCursor = !!_;\n                if (prev) setCursor(this, prev); // swap cursor\n            }\n            return this;\n        } else return this._globalCursor;\n    },\n    preventDefault (_) {\n        if (arguments.length) {\n            this._preventDefault = _;\n            return this;\n        } else return this._preventDefault;\n    },\n    timer,\n    events,\n    finalize,\n    hover,\n    // -- DATA ----\n    data,\n    change,\n    insert,\n    remove,\n    // -- SCALES --\n    scale,\n    // -- INITIALIZATION ----\n    initialize,\n    // -- HEADLESS RENDERING ----\n    toImageURL: renderToImageURL,\n    toCanvas: renderToCanvas,\n    toSVG: renderToSVG,\n    // -- SAVE / RESTORE STATE ----\n    getState,\n    setState\n});\n\n},{\"vega-util\":\"dPFAY\",\"vega-dataflow\":\"4kvYg\",\"vega-scenegraph\":\"gIB0Z\",\"d3-array\":\"8JMcC\",\"vega-functions\":\"92bWe\",\"vega-runtime\":\"37uhx\",\"d3-timer\":\"ekGPQ\",\"vega-format\":\"bXIHh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"92bWe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataPrefix\", ()=>DataPrefix);\nparcelHelpers.export(exports, \"IndexPrefix\", ()=>IndexPrefix);\nparcelHelpers.export(exports, \"ScalePrefix\", ()=>ScalePrefix);\nparcelHelpers.export(exports, \"SignalPrefix\", ()=>SignalPrefix);\nparcelHelpers.export(exports, \"bandspace\", ()=>bandspace);\nparcelHelpers.export(exports, \"bandwidth\", ()=>bandwidth);\nparcelHelpers.export(exports, \"codeGenerator\", ()=>codeGenerator);\nparcelHelpers.export(exports, \"codegenParams\", ()=>codegenParams);\nparcelHelpers.export(exports, \"containerSize\", ()=>containerSize);\nparcelHelpers.export(exports, \"contrast\", ()=>contrast);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"data\", ()=>data);\nparcelHelpers.export(exports, \"dataVisitor\", ()=>dataVisitor);\nparcelHelpers.export(exports, \"dayAbbrevFormat\", ()=>dayAbbrevFormat);\nparcelHelpers.export(exports, \"dayFormat\", ()=>dayFormat);\nparcelHelpers.export(exports, \"debug\", ()=>debug);\nparcelHelpers.export(exports, \"domain\", ()=>domain);\nparcelHelpers.export(exports, \"encode\", ()=>encode);\nparcelHelpers.export(exports, \"expressionFunction\", ()=>expressionFunction);\nparcelHelpers.export(exports, \"format\", ()=>format);\nparcelHelpers.export(exports, \"functionContext\", ()=>functionContext);\nparcelHelpers.export(exports, \"geoArea\", ()=>geoArea);\nparcelHelpers.export(exports, \"geoBounds\", ()=>geoBounds);\nparcelHelpers.export(exports, \"geoCentroid\", ()=>geoCentroid);\nparcelHelpers.export(exports, \"geoShape\", ()=>geoShape);\nparcelHelpers.export(exports, \"inScope\", ()=>inScope);\nparcelHelpers.export(exports, \"indata\", ()=>indata);\nparcelHelpers.export(exports, \"indataVisitor\", ()=>indataVisitor);\nparcelHelpers.export(exports, \"indexof\", ()=>indexof);\nparcelHelpers.export(exports, \"info\", ()=>info);\nparcelHelpers.export(exports, \"invert\", ()=>invert);\nparcelHelpers.export(exports, \"join\", ()=>join);\nparcelHelpers.export(exports, \"lastindexof\", ()=>lastindexof);\nparcelHelpers.export(exports, \"luminance\", ()=>luminance);\nparcelHelpers.export(exports, \"merge\", ()=>merge);\nparcelHelpers.export(exports, \"modify\", ()=>modify);\nparcelHelpers.export(exports, \"monthAbbrevFormat\", ()=>monthAbbrevFormat);\nparcelHelpers.export(exports, \"monthFormat\", ()=>monthFormat);\nparcelHelpers.export(exports, \"parseExpression\", ()=>parser);\nparcelHelpers.export(exports, \"pathShape\", ()=>pathShape);\nparcelHelpers.export(exports, \"pinchAngle\", ()=>pinchAngle);\nparcelHelpers.export(exports, \"pinchDistance\", ()=>pinchDistance);\nparcelHelpers.export(exports, \"pluck\", ()=>pluck);\nparcelHelpers.export(exports, \"range\", ()=>range);\nparcelHelpers.export(exports, \"replace\", ()=>replace);\nparcelHelpers.export(exports, \"reverse\", ()=>reverse);\nparcelHelpers.export(exports, \"scale\", ()=>scale);\nparcelHelpers.export(exports, \"scaleGradient\", ()=>scaleGradient);\nparcelHelpers.export(exports, \"scaleVisitor\", ()=>scaleVisitor);\nparcelHelpers.export(exports, \"screen\", ()=>screen);\nparcelHelpers.export(exports, \"setdata\", ()=>setdata);\nparcelHelpers.export(exports, \"slice\", ()=>slice);\nparcelHelpers.export(exports, \"timeFormat\", ()=>timeFormat);\nparcelHelpers.export(exports, \"timeParse\", ()=>timeParse);\nparcelHelpers.export(exports, \"treeAncestors\", ()=>treeAncestors);\nparcelHelpers.export(exports, \"treePath\", ()=>treePath);\nparcelHelpers.export(exports, \"utcFormat\", ()=>utcFormat);\nparcelHelpers.export(exports, \"utcParse\", ()=>utcParse);\nparcelHelpers.export(exports, \"warn\", ()=>warn);\nparcelHelpers.export(exports, \"windowSize\", ()=>windowSize);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaExpression = require(\"vega-expression\");\nvar _d3Geo = require(\"d3-geo\");\nvar _d3Color = require(\"d3-color\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nvar _vegaSelections = require(\"vega-selections\");\nvar _vegaStatistics = require(\"vega-statistics\");\nvar _vegaTime = require(\"vega-time\");\nvar _d3Array = require(\"d3-array\");\nfunction data(name) {\n    const data1 = this.context.data[name];\n    return data1 ? data1.values.value : [];\n}\nfunction indata(name, field, value) {\n    const index = this.context.data[name][\"index:\" + field], entry = index ? index.value.get(value) : undefined;\n    return entry ? entry.count : entry;\n}\nfunction setdata(name, tuples) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input;\n    df.pulse(input, df.changeset().remove((0, _vegaUtil.truthy)).insert(tuples));\n    return 1;\n}\nfunction encode(item, name, retval) {\n    if (item) {\n        const df = this.context.dataflow, target = item.mark.source;\n        df.pulse(target, df.changeset().encode(item, name));\n    }\n    return retval !== undefined ? retval : item;\n}\nconst wrap = (method)=>function(value, spec) {\n        const locale = this.context.dataflow.locale();\n        return locale[method](spec)(value);\n    };\nconst format = wrap(\"format\");\nconst timeFormat = wrap(\"timeFormat\");\nconst utcFormat = wrap(\"utcFormat\");\nconst timeParse = wrap(\"timeParse\");\nconst utcParse = wrap(\"utcParse\");\nconst dateObj = new Date(2000, 0, 1);\nfunction time(month, day, specifier) {\n    if (!Number.isInteger(month) || !Number.isInteger(day)) return \"\";\n    dateObj.setYear(2000);\n    dateObj.setMonth(month);\n    dateObj.setDate(day);\n    return timeFormat.call(this, dateObj, specifier);\n}\nfunction monthFormat(month) {\n    return time.call(this, month, 1, \"%B\");\n}\nfunction monthAbbrevFormat(month) {\n    return time.call(this, month, 1, \"%b\");\n}\nfunction dayFormat(day) {\n    return time.call(this, 0, 2 + day, \"%A\");\n}\nfunction dayAbbrevFormat(day) {\n    return time.call(this, 0, 2 + day, \"%a\");\n}\nconst DataPrefix = \":\";\nconst IndexPrefix = \"@\";\nconst ScalePrefix = \"%\";\nconst SignalPrefix = \"$\";\nfunction dataVisitor(name, args, scope, params) {\n    if (args[0].type !== (0, _vegaExpression.Literal)) (0, _vegaUtil.error)(\"First argument to data functions must be a string literal.\");\n    const data3 = args[0].value, dataName = DataPrefix + data3;\n    if (!(0, _vegaUtil.hasOwnProperty)(dataName, params)) try {\n        params[dataName] = scope.getData(data3).tuplesRef();\n    } catch (err) {}\n}\nfunction indataVisitor(name, args, scope, params) {\n    if (args[0].type !== (0, _vegaExpression.Literal)) (0, _vegaUtil.error)(\"First argument to indata must be a string literal.\");\n    if (args[1].type !== (0, _vegaExpression.Literal)) (0, _vegaUtil.error)(\"Second argument to indata must be a string literal.\");\n    const data4 = args[0].value, field = args[1].value, indexName = IndexPrefix + field;\n    if (!(0, _vegaUtil.hasOwnProperty)(indexName, params)) params[indexName] = scope.getData(data4).indataRef(scope, field);\n}\nfunction scaleVisitor(name, args, scope, params) {\n    if (args[0].type === (0, _vegaExpression.Literal)) // add scale dependency\n    addScaleDependency(scope, params, args[0].value);\n    else // indirect scale lookup; add all scales as parameters\n    for(name in scope.scales)addScaleDependency(scope, params, name);\n}\nfunction addScaleDependency(scope, params, name) {\n    const scaleName = ScalePrefix + name;\n    if (!(0, _vegaUtil.hasOwnProperty)(params, scaleName)) try {\n        params[scaleName] = scope.scaleRef(name);\n    } catch (err) {}\n}\nfunction getScale(name, ctx) {\n    let s;\n    return (0, _vegaUtil.isFunction)(name) ? name : (0, _vegaUtil.isString)(name) ? (s = ctx.scales[name]) && s.value : undefined;\n}\nfunction internalScaleFunctions(codegen, fnctx, visitors) {\n    // add helper method to the 'this' expression function context\n    fnctx.__bandwidth = (s)=>s && s.bandwidth ? s.bandwidth() : 0; // register AST visitors for internal scale functions\n    visitors._bandwidth = scaleVisitor;\n    visitors._range = scaleVisitor;\n    visitors._scale = scaleVisitor; // resolve scale reference directly to the signal hash argument\n    const ref = (arg)=>\"_[\" + (arg.type === (0, _vegaExpression.Literal) ? (0, _vegaUtil.stringValue)(ScalePrefix + arg.value) : (0, _vegaUtil.stringValue)(ScalePrefix) + \"+\" + codegen(arg)) + \"]\"; // define and return internal scale function code generators\n    // these internal functions are called by mark encoders\n    return {\n        _bandwidth: (args)=>`this.__bandwidth(${ref(args[0])})`,\n        _range: (args)=>`${ref(args[0])}.range()`,\n        _scale: (args)=>`${ref(args[0])}(${codegen(args[1])})`\n    };\n}\nfunction geoMethod(methodName, globalMethod) {\n    return function(projection, geojson, group) {\n        if (projection) {\n            // projection defined, use it\n            const p = getScale(projection, (group || this).context);\n            return p && p.path[methodName](geojson);\n        } else // projection undefined, use global method\n        return globalMethod(geojson);\n    };\n}\nconst geoArea = geoMethod(\"area\", (0, _d3Geo.geoArea));\nconst geoBounds = geoMethod(\"bounds\", (0, _d3Geo.geoBounds));\nconst geoCentroid = geoMethod(\"centroid\", (0, _d3Geo.geoCentroid));\nfunction inScope(item) {\n    const group = this.context.group;\n    let value = false;\n    if (group) while(item){\n        if (item === group) {\n            value = true;\n            break;\n        }\n        item = item.mark.group;\n    }\n    return value;\n}\nfunction log(df, method, args) {\n    try {\n        df[method].apply(df, [\n            \"EXPRESSION\"\n        ].concat([].slice.call(args)));\n    } catch (err) {\n        df.warn(err);\n    }\n    return args[args.length - 1];\n}\nfunction warn() {\n    return log(this.context.dataflow, \"warn\", arguments);\n}\nfunction info() {\n    return log(this.context.dataflow, \"info\", arguments);\n}\nfunction debug() {\n    return log(this.context.dataflow, \"debug\", arguments);\n}\nfunction channel_luminance_value(channelValue) {\n    const val = channelValue / 255;\n    if (val <= 0.03928) return val / 12.92;\n    return Math.pow((val + 0.055) / 1.055, 2.4);\n}\nfunction luminance(color) {\n    const c = (0, _d3Color.rgb)(color), r = channel_luminance_value(c.r), g = channel_luminance_value(c.g), b = channel_luminance_value(c.b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n} // https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\nfunction contrast(color1, color2) {\n    const lum1 = luminance(color1), lum2 = luminance(color2), lumL = Math.max(lum1, lum2), lumD = Math.min(lum1, lum2);\n    return (lumL + 0.05) / (lumD + 0.05);\n}\nfunction merge() {\n    const args = [].slice.call(arguments);\n    args.unshift({});\n    return (0, _vegaUtil.extend)(...args);\n}\nfunction equal(a, b) {\n    return a === b || a !== a && b !== b ? true : (0, _vegaUtil.isArray)(a) ? (0, _vegaUtil.isArray)(b) && a.length === b.length ? equalArray(a, b) : false : (0, _vegaUtil.isObject)(a) && (0, _vegaUtil.isObject)(b) ? equalObject(a, b) : false;\n}\nfunction equalArray(a, b) {\n    for(let i = 0, n = a.length; i < n; ++i){\n        if (!equal(a[i], b[i])) return false;\n    }\n    return true;\n}\nfunction equalObject(a, b) {\n    for(const key in a){\n        if (!equal(a[key], b[key])) return false;\n    }\n    return true;\n}\nfunction removePredicate(props) {\n    return (_)=>equalObject(props, _);\n}\nfunction modify(name, insert, remove, toggle, modify1, values) {\n    const df = this.context.dataflow, data5 = this.context.data[name], input = data5.input, stamp = df.stamp();\n    let changes = data5.changes, predicate, key;\n    if (df._trigger === false || !(input.value.length || insert || toggle)) // nothing to do!\n    return 0;\n    if (!changes || changes.stamp < stamp) {\n        data5.changes = changes = df.changeset();\n        changes.stamp = stamp;\n        df.runAfter(()=>{\n            data5.modified = true;\n            df.pulse(input, changes).run();\n        }, true, 1);\n    }\n    if (remove) {\n        predicate = remove === true ? (0, _vegaUtil.truthy) : (0, _vegaUtil.isArray)(remove) || (0, _vegaDataflow.isTuple)(remove) ? remove : removePredicate(remove);\n        changes.remove(predicate);\n    }\n    if (insert) changes.insert(insert);\n    if (toggle) {\n        predicate = removePredicate(toggle);\n        if (input.value.some(predicate)) changes.remove(predicate);\n        else changes.insert(toggle);\n    }\n    if (modify1) for(key in values)changes.modify(modify1, key, values[key]);\n    return 1;\n}\nfunction pinchDistance(event) {\n    const t = event.touches, dx = t[0].clientX - t[1].clientX, dy = t[0].clientY - t[1].clientY;\n    return Math.sqrt(dx * dx + dy * dy);\n}\nfunction pinchAngle(event) {\n    const t = event.touches;\n    return Math.atan2(t[0].clientY - t[1].clientY, t[0].clientX - t[1].clientX);\n}\nconst accessors = {};\nfunction pluck(data6, name) {\n    const accessor = accessors[name] || (accessors[name] = (0, _vegaUtil.field)(name));\n    return (0, _vegaUtil.isArray)(data6) ? data6.map(accessor) : accessor(data6);\n}\nfunction array(seq) {\n    return (0, _vegaUtil.isArray)(seq) || ArrayBuffer.isView(seq) ? seq : null;\n}\nfunction sequence(seq) {\n    return array(seq) || ((0, _vegaUtil.isString)(seq) ? seq : null);\n}\nfunction join(seq, ...args) {\n    return array(seq).join(...args);\n}\nfunction indexof(seq, ...args) {\n    return sequence(seq).indexOf(...args);\n}\nfunction lastindexof(seq, ...args) {\n    return sequence(seq).lastIndexOf(...args);\n}\nfunction slice(seq, ...args) {\n    return sequence(seq).slice(...args);\n}\nfunction replace(str, pattern, repl) {\n    if ((0, _vegaUtil.isFunction)(repl)) (0, _vegaUtil.error)(\"Function argument passed to replace.\");\n    return String(str).replace(pattern, repl);\n}\nfunction reverse(seq) {\n    return array(seq).slice().reverse();\n}\nfunction bandspace(count, paddingInner, paddingOuter) {\n    return (0, _vegaScale.bandSpace)(count || 0, paddingInner || 0, paddingOuter || 0);\n}\nfunction bandwidth(name, group) {\n    const s = getScale(name, (group || this).context);\n    return s && s.bandwidth ? s.bandwidth() : 0;\n}\nfunction copy(name, group) {\n    const s = getScale(name, (group || this).context);\n    return s ? s.copy() : undefined;\n}\nfunction domain(name, group) {\n    const s = getScale(name, (group || this).context);\n    return s ? s.domain() : [];\n}\nfunction invert(name, range1, group) {\n    const s = getScale(name, (group || this).context);\n    return !s ? undefined : (0, _vegaUtil.isArray)(range1) ? (s.invertRange || s.invert)(range1) : (s.invert || s.invertExtent)(range1);\n}\nfunction range(name, group) {\n    const s = getScale(name, (group || this).context);\n    return s && s.range ? s.range() : [];\n}\nfunction scale(name, value, group) {\n    const s = getScale(name, (group || this).context);\n    return s ? s(value) : undefined;\n}\nfunction scaleGradient(scale1, p0, p1, count, group) {\n    scale1 = getScale(scale1, (group || this).context);\n    const gradient = (0, _vegaScenegraph.Gradient)(p0, p1);\n    let stops = scale1.domain(), min = stops[0], max = (0, _vegaUtil.peek)(stops), fraction = (0, _vegaUtil.identity);\n    if (!(max - min)) // expand scale if domain has zero span, fix #1479\n    scale1 = (scale1.interpolator ? (0, _vegaScale.scale)(\"sequential\")().interpolator(scale1.interpolator()) : (0, _vegaScale.scale)(\"linear\")().interpolate(scale1.interpolate()).range(scale1.range())).domain([\n        min = 0,\n        max = 1\n    ]);\n    else fraction = (0, _vegaScale.scaleFraction)(scale1, min, max);\n    if (scale1.ticks) {\n        stops = scale1.ticks(+count || 15);\n        if (min !== stops[0]) stops.unshift(min);\n        if (max !== (0, _vegaUtil.peek)(stops)) stops.push(max);\n    }\n    stops.forEach((_)=>gradient.stop(fraction(_), scale1(_)));\n    return gradient;\n}\nfunction geoShape(projection, geojson, group) {\n    const p = getScale(projection, (group || this).context);\n    return function(context) {\n        return p ? p.path.context(context)(geojson) : \"\";\n    };\n}\nfunction pathShape(path) {\n    let p = null;\n    return function(context) {\n        return context ? (0, _vegaScenegraph.pathRender)(context, p = p || (0, _vegaScenegraph.pathParse)(path)) : path;\n    };\n}\nconst datum = (d)=>d.data;\nfunction treeNodes(name, context) {\n    const tree = data.call(context, name);\n    return tree.root && tree.root.lookup || {};\n}\nfunction treePath(name, source, target) {\n    const nodes = treeNodes(name, this), s = nodes[source], t = nodes[target];\n    return s && t ? s.path(t).map(datum) : undefined;\n}\nfunction treeAncestors(name, node) {\n    const n = treeNodes(name, this)[node];\n    return n ? n.ancestors().map(datum) : undefined;\n}\nconst _window = ()=>typeof window !== \"undefined\" && window || null;\nfunction screen() {\n    const w = _window();\n    return w ? w.screen : {};\n}\nfunction windowSize() {\n    const w = _window();\n    return w ? [\n        w.innerWidth,\n        w.innerHeight\n    ] : [\n        undefined,\n        undefined\n    ];\n}\nfunction containerSize() {\n    const view = this.context.dataflow, el = view.container && view.container();\n    return el ? [\n        el.clientWidth,\n        el.clientHeight\n    ] : [\n        undefined,\n        undefined\n    ];\n}\nfunction intersect(b, opt, group) {\n    if (!b) return [];\n    const [u, v] = b, box = new (0, _vegaScenegraph.Bounds)().set(u[0], u[1], v[0], v[1]), scene = group || this.context.dataflow.scenegraph().root;\n    return (0, _vegaScenegraph.intersect)(scene, box, filter(opt));\n}\nfunction filter(opt) {\n    let p = null;\n    if (opt) {\n        const types = (0, _vegaUtil.array)(opt.marktype), names = (0, _vegaUtil.array)(opt.markname);\n        p = (_)=>(!types.length || types.some((t)=>_.marktype === t)) && (!names.length || names.some((s)=>_.name === s));\n    }\n    return p;\n}\nconst functionContext = {\n    random () {\n        return (0, _vegaStatistics.random)();\n    },\n    cumulativeNormal: // override default\n    (0, _vegaStatistics.cumulativeNormal),\n    cumulativeLogNormal: (0, _vegaStatistics.cumulativeLogNormal),\n    cumulativeUniform: (0, _vegaStatistics.cumulativeUniform),\n    densityNormal: (0, _vegaStatistics.densityNormal),\n    densityLogNormal: (0, _vegaStatistics.densityLogNormal),\n    densityUniform: (0, _vegaStatistics.densityUniform),\n    quantileNormal: (0, _vegaStatistics.quantileNormal),\n    quantileLogNormal: (0, _vegaStatistics.quantileLogNormal),\n    quantileUniform: (0, _vegaStatistics.quantileUniform),\n    sampleNormal: (0, _vegaStatistics.sampleNormal),\n    sampleLogNormal: (0, _vegaStatistics.sampleLogNormal),\n    sampleUniform: (0, _vegaStatistics.sampleUniform),\n    isArray: (0, _vegaUtil.isArray),\n    isBoolean: (0, _vegaUtil.isBoolean),\n    isDate: (0, _vegaUtil.isDate),\n    isDefined (_) {\n        return _ !== undefined;\n    },\n    isNumber: (0, _vegaUtil.isNumber),\n    isObject: (0, _vegaUtil.isObject),\n    isRegExp: (0, _vegaUtil.isRegExp),\n    isString: (0, _vegaUtil.isString),\n    isTuple: (0, _vegaDataflow.isTuple),\n    isValid (_) {\n        return _ != null && _ === _;\n    },\n    toBoolean: (0, _vegaUtil.toBoolean),\n    toDate: (0, _vegaUtil.toDate),\n    toNumber: (0, _vegaUtil.toNumber),\n    toString: (0, _vegaUtil.toString),\n    indexof,\n    join,\n    lastindexof,\n    replace,\n    reverse,\n    slice,\n    flush: (0, _vegaUtil.flush),\n    lerp: (0, _vegaUtil.lerp),\n    merge,\n    pad: (0, _vegaUtil.pad),\n    peek: (0, _vegaUtil.peek),\n    pluck,\n    span: (0, _vegaUtil.span),\n    inrange: (0, _vegaUtil.inrange),\n    truncate: (0, _vegaUtil.truncate),\n    rgb: (0, _d3Color.rgb),\n    lab: (0, _d3Color.lab),\n    hcl: (0, _d3Color.hcl),\n    hsl: (0, _d3Color.hsl),\n    luminance,\n    contrast,\n    sequence: (0, _d3Array.range),\n    format,\n    utcFormat,\n    utcParse,\n    utcOffset: (0, _vegaTime.utcOffset),\n    utcSequence: (0, _vegaTime.utcSequence),\n    timeFormat,\n    timeParse,\n    timeOffset: (0, _vegaTime.timeOffset),\n    timeSequence: (0, _vegaTime.timeSequence),\n    timeUnitSpecifier: (0, _vegaTime.timeUnitSpecifier),\n    monthFormat,\n    monthAbbrevFormat,\n    dayFormat,\n    dayAbbrevFormat,\n    quarter: (0, _vegaUtil.quarter),\n    utcquarter: (0, _vegaUtil.utcquarter),\n    week: (0, _vegaTime.week),\n    utcweek: (0, _vegaTime.utcweek),\n    dayofyear: (0, _vegaTime.dayofyear),\n    utcdayofyear: (0, _vegaTime.utcdayofyear),\n    warn,\n    info,\n    debug,\n    extent: (0, _vegaUtil.extent),\n    inScope,\n    intersect,\n    clampRange: (0, _vegaUtil.clampRange),\n    pinchDistance,\n    pinchAngle,\n    screen,\n    containerSize,\n    windowSize,\n    bandspace,\n    setdata,\n    pathShape,\n    panLinear: (0, _vegaUtil.panLinear),\n    panLog: (0, _vegaUtil.panLog),\n    panPow: (0, _vegaUtil.panPow),\n    panSymlog: (0, _vegaUtil.panSymlog),\n    zoomLinear: (0, _vegaUtil.zoomLinear),\n    zoomLog: (0, _vegaUtil.zoomLog),\n    zoomPow: (0, _vegaUtil.zoomPow),\n    zoomSymlog: (0, _vegaUtil.zoomSymlog),\n    encode,\n    modify\n};\nconst eventFunctions = [\n    \"view\",\n    \"item\",\n    \"group\",\n    \"xy\",\n    \"x\",\n    \"y\"\n], // event functions\neventPrefix = \"event.vega.\", // event function prefix\nthisPrefix = \"this.\", // function context prefix\nastVisitors = {}; // AST visitors for dependency analysis\n// export code generator parameters\nconst codegenParams = {\n    forbidden: [\n        \"_\"\n    ],\n    allowed: [\n        \"datum\",\n        \"event\",\n        \"item\"\n    ],\n    fieldvar: \"datum\",\n    globalvar: (id)=>`_[${(0, _vegaUtil.stringValue)(SignalPrefix + id)}]`,\n    functions: buildFunctions,\n    constants: (0, _vegaExpression.constants),\n    visitors: astVisitors\n}; // export code generator\nconst codeGenerator = (0, _vegaExpression.codegenExpression)(codegenParams); // Build expression function registry\nfunction buildFunctions(codegen) {\n    const fn = (0, _vegaExpression.functions)(codegen);\n    eventFunctions.forEach((name)=>fn[name] = eventPrefix + name);\n    for(const name1 in functionContext)fn[name1] = thisPrefix + name1;\n    (0, _vegaUtil.extend)(fn, internalScaleFunctions(codegen, functionContext, astVisitors));\n    return fn;\n} // Register an expression function\nfunction expressionFunction(name, fn, visitor) {\n    if (arguments.length === 1) return functionContext[name];\n     // register with the functionContext\n    functionContext[name] = fn; // if there is an astVisitor register that, too\n    if (visitor) astVisitors[name] = visitor; // if the code generator has already been initialized,\n    // we need to also register the function with it\n    if (codeGenerator) codeGenerator.functions[name] = thisPrefix + name;\n    return this;\n} // register expression functions with ast visitors\nexpressionFunction(\"bandwidth\", bandwidth, scaleVisitor);\nexpressionFunction(\"copy\", copy, scaleVisitor);\nexpressionFunction(\"domain\", domain, scaleVisitor);\nexpressionFunction(\"range\", range, scaleVisitor);\nexpressionFunction(\"invert\", invert, scaleVisitor);\nexpressionFunction(\"scale\", scale, scaleVisitor);\nexpressionFunction(\"gradient\", scaleGradient, scaleVisitor);\nexpressionFunction(\"geoArea\", geoArea, scaleVisitor);\nexpressionFunction(\"geoBounds\", geoBounds, scaleVisitor);\nexpressionFunction(\"geoCentroid\", geoCentroid, scaleVisitor);\nexpressionFunction(\"geoShape\", geoShape, scaleVisitor);\nexpressionFunction(\"indata\", indata, indataVisitor);\nexpressionFunction(\"data\", data, dataVisitor);\nexpressionFunction(\"treePath\", treePath, dataVisitor);\nexpressionFunction(\"treeAncestors\", treeAncestors, dataVisitor); // register Vega-Lite selection functions\nexpressionFunction(\"vlSelectionTest\", (0, _vegaSelections.selectionTest), (0, _vegaSelections.selectionVisitor));\nexpressionFunction(\"vlSelectionIdTest\", (0, _vegaSelections.selectionIdTest), (0, _vegaSelections.selectionVisitor));\nexpressionFunction(\"vlSelectionResolve\", (0, _vegaSelections.selectionResolve), (0, _vegaSelections.selectionVisitor));\nexpressionFunction(\"vlSelectionTuples\", (0, _vegaSelections.selectionTuples));\nfunction parser(expr, scope) {\n    const params = {}; // parse the expression to an abstract syntax tree (ast)\n    let ast;\n    try {\n        expr = (0, _vegaUtil.isString)(expr) ? expr : (0, _vegaUtil.stringValue)(expr) + \"\";\n        ast = (0, _vegaExpression.parseExpression)(expr);\n    } catch (err) {\n        (0, _vegaUtil.error)(\"Expression parse error: \" + expr);\n    } // analyze ast function calls for dependencies\n    ast.visit((node)=>{\n        if (node.type !== (0, _vegaExpression.CallExpression)) return;\n        const name = node.callee.name, visit = codegenParams.visitors[name];\n        if (visit) visit(name, node.arguments, scope, params);\n    }); // perform code generation\n    const gen = codeGenerator(ast); // collect signal dependencies\n    gen.globals.forEach((name)=>{\n        const signalName = SignalPrefix + name;\n        if (!(0, _vegaUtil.hasOwnProperty)(params, signalName) && scope.getSignal(name)) params[signalName] = scope.signalRef(name);\n    }); // return generated expression code and dependencies\n    return {\n        $expr: (0, _vegaUtil.extend)({\n            code: gen.code\n        }, scope.options.ast ? {\n            ast\n        } : null),\n        $fields: gen.fields,\n        $params: params\n    };\n}\n\n},{\"vega-util\":\"dPFAY\",\"vega-expression\":\"ic0a8\",\"d3-geo\":\"1UFrq\",\"d3-color\":\"2I9cJ\",\"vega-dataflow\":\"4kvYg\",\"vega-scale\":\"evQIv\",\"vega-scenegraph\":\"gIB0Z\",\"vega-selections\":\"7uoGs\",\"vega-statistics\":\"hZmG3\",\"vega-time\":\"hDlOp\",\"d3-array\":\"8JMcC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ic0a8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ASTNode\", ()=>ASTNode);\nparcelHelpers.export(exports, \"ArrayExpression\", ()=>ArrayExpression);\nparcelHelpers.export(exports, \"BinaryExpression\", ()=>BinaryExpression);\nparcelHelpers.export(exports, \"CallExpression\", ()=>CallExpression);\nparcelHelpers.export(exports, \"ConditionalExpression\", ()=>ConditionalExpression);\nparcelHelpers.export(exports, \"Identifier\", ()=>Identifier);\nparcelHelpers.export(exports, \"Literal\", ()=>Literal);\nparcelHelpers.export(exports, \"LogicalExpression\", ()=>LogicalExpression);\nparcelHelpers.export(exports, \"MemberExpression\", ()=>MemberExpression);\nparcelHelpers.export(exports, \"ObjectExpression\", ()=>ObjectExpression);\nparcelHelpers.export(exports, \"Property\", ()=>Property);\nparcelHelpers.export(exports, \"RawCode\", ()=>RawCode);\nparcelHelpers.export(exports, \"UnaryExpression\", ()=>UnaryExpression);\nparcelHelpers.export(exports, \"codegenExpression\", ()=>codegen);\nparcelHelpers.export(exports, \"constants\", ()=>Constants);\nparcelHelpers.export(exports, \"functions\", ()=>Functions);\nparcelHelpers.export(exports, \"parseExpression\", ()=>parser);\nvar _vegaUtil = require(\"vega-util\");\nconst RawCode = \"RawCode\";\nconst Literal = \"Literal\";\nconst Property = \"Property\";\nconst Identifier = \"Identifier\";\nconst ArrayExpression = \"ArrayExpression\";\nconst BinaryExpression = \"BinaryExpression\";\nconst CallExpression = \"CallExpression\";\nconst ConditionalExpression = \"ConditionalExpression\";\nconst LogicalExpression = \"LogicalExpression\";\nconst MemberExpression = \"MemberExpression\";\nconst ObjectExpression = \"ObjectExpression\";\nconst UnaryExpression = \"UnaryExpression\";\nfunction ASTNode(type) {\n    this.type = type;\n}\nASTNode.prototype.visit = function(visitor) {\n    let c, i, n;\n    if (visitor(this)) return 1;\n    for(c = children(this), i = 0, n = c.length; i < n; ++i){\n        if (c[i].visit(visitor)) return 1;\n    }\n};\nfunction children(node) {\n    switch(node.type){\n        case ArrayExpression:\n            return node.elements;\n        case BinaryExpression:\n        case LogicalExpression:\n            return [\n                node.left,\n                node.right\n            ];\n        case CallExpression:\n            return [\n                node.callee\n            ].concat(node.arguments);\n        case ConditionalExpression:\n            return [\n                node.test,\n                node.consequent,\n                node.alternate\n            ];\n        case MemberExpression:\n            return [\n                node.object,\n                node.property\n            ];\n        case ObjectExpression:\n            return node.properties;\n        case Property:\n            return [\n                node.key,\n                node.value\n            ];\n        case UnaryExpression:\n            return [\n                node.argument\n            ];\n        case Identifier:\n        case Literal:\n        case RawCode:\n        default:\n            return [];\n    }\n}\n/*\n  The following expression parser is based on Esprima (http://esprima.org/).\n  Original header comment and license for Esprima is included here:\n\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/ var TokenName, source, index, length, lookahead;\nvar TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\nTokenName = {};\nTokenName[TokenBooleanLiteral] = \"Boolean\";\nTokenName[TokenEOF] = \"<end>\";\nTokenName[TokenIdentifier] = \"Identifier\";\nTokenName[TokenKeyword] = \"Keyword\";\nTokenName[TokenNullLiteral] = \"Null\";\nTokenName[TokenNumericLiteral] = \"Numeric\";\nTokenName[TokenPunctuator] = \"Punctuator\";\nTokenName[TokenStringLiteral] = \"String\";\nTokenName[TokenRegularExpression] = \"RegularExpression\";\nvar SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\"; // Error messages should be identical to V8.\nvar MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\nvar ILLEGAL = \"ILLEGAL\", DISABLED = \"Disabled.\"; // See also tools/generate-unicode-regex.py.\nvar RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), // eslint-disable-next-line no-misleading-character-class\nRegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"); // Ensure the condition is true, otherwise throw an error.\n// This is only to have a better contract semantic, i.e. another safety net\n// to catch a logic error. The condition shall be fulfilled in normal case.\n// Do NOT use this to enforce a certain condition on any user input.\nfunction assert(condition, message) {\n    /* istanbul ignore next */ if (!condition) throw new Error(\"ASSERT: \" + message);\n}\nfunction isDecimalDigit(ch) {\n    return ch >= 0x30 && ch <= 0x39; // 0..9\n}\nfunction isHexDigit(ch) {\n    return \"0123456789abcdefABCDEF\".indexOf(ch) >= 0;\n}\nfunction isOctalDigit(ch) {\n    return \"01234567\".indexOf(ch) >= 0;\n} // 7.2 White Space\nfunction isWhiteSpace(ch) {\n    return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && [\n        0x1680,\n        0x180E,\n        0x2000,\n        0x2001,\n        0x2002,\n        0x2003,\n        0x2004,\n        0x2005,\n        0x2006,\n        0x2007,\n        0x2008,\n        0x2009,\n        0x200A,\n        0x202F,\n        0x205F,\n        0x3000,\n        0xFEFF\n    ].indexOf(ch) >= 0;\n} // 7.3 Line Terminators\nfunction isLineTerminator(ch) {\n    return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;\n} // 7.6 Identifier Names and Identifiers\nfunction isIdentifierStart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch));\n}\nfunction isIdentifierPart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch >= 0x30 && ch <= 0x39 || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch));\n} // 7.6.1.1 Keywords\nconst keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n};\nfunction skipComment() {\n    while(index < length){\n        const ch = source.charCodeAt(index);\n        if (isWhiteSpace(ch) || isLineTerminator(ch)) ++index;\n        else break;\n    }\n}\nfunction scanHexEscape(prefix) {\n    var i, len, ch, code = 0;\n    len = prefix === \"u\" ? 4 : 2;\n    for(i = 0; i < len; ++i)if (index < length && isHexDigit(source[index])) {\n        ch = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    } else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return String.fromCharCode(code);\n}\nfunction scanUnicodeCodePointEscape() {\n    var ch, code, cu1, cu2;\n    ch = source[index];\n    code = 0; // At least, one hex digit is required.\n    if (ch === \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    while(index < length){\n        ch = source[index++];\n        if (!isHexDigit(ch)) break;\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    }\n    if (code > 0x10FFFF || ch !== \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // UTF-16 Encoding\n    if (code <= 0xFFFF) return String.fromCharCode(code);\n    cu1 = (code - 0x10000 >> 10) + 0xD800;\n    cu2 = (code - 0x10000 & 1023) + 0xDC00;\n    return String.fromCharCode(cu1, cu2);\n}\nfunction getEscapedIdentifier() {\n    var ch, id;\n    ch = source.charCodeAt(index++);\n    id = String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n    if (ch === 0x5C) {\n        if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        ++index;\n        ch = scanHexEscape(\"u\");\n        if (!ch || ch === \"\\\\\" || !isIdentifierStart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        id = ch;\n    }\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (!isIdentifierPart(ch)) break;\n        ++index;\n        id += String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n        if (ch === 0x5C) {\n            id = id.substr(0, id.length - 1);\n            if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            ++index;\n            ch = scanHexEscape(\"u\");\n            if (!ch || ch === \"\\\\\" || !isIdentifierPart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            id += ch;\n        }\n    }\n    return id;\n}\nfunction getIdentifier() {\n    var start, ch;\n    start = index++;\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (ch === 0x5C) {\n            // Blackslash (U+005C) marks Unicode escape sequence.\n            index = start;\n            return getEscapedIdentifier();\n        }\n        if (isIdentifierPart(ch)) ++index;\n        else break;\n    }\n    return source.slice(start, index);\n}\nfunction scanIdentifier() {\n    var start, id, type;\n    start = index; // Backslash (U+005C) starts an escaped character.\n    id = source.charCodeAt(index) === 0x5C ? getEscapedIdentifier() : getIdentifier(); // There is no keyword or literal with only one character.\n    // Thus, it must be an identifier.\n    if (id.length === 1) type = TokenIdentifier;\n    else if (keywords.hasOwnProperty(id)) // eslint-disable-line no-prototype-builtins\n    type = TokenKeyword;\n    else if (id === \"null\") type = TokenNullLiteral;\n    else if (id === \"true\" || id === \"false\") type = TokenBooleanLiteral;\n    else type = TokenIdentifier;\n    return {\n        type: type,\n        value: id,\n        start: start,\n        end: index\n    };\n} // 7.7 Punctuators\nfunction scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch(code){\n        // Check for most common single-character punctuators.\n        case 0x2E:\n        case 0x28:\n        case 0x29:\n        case 0x3B:\n        case 0x2C:\n        case 0x7B:\n        case 0x7D:\n        case 0x5B:\n        case 0x5D:\n        case 0x3A:\n        case 0x3F:\n        case 0x7E:\n            // ~\n            ++index;\n            return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code),\n                start: start,\n                end: index\n            };\n        default:\n            code2 = source.charCodeAt(index + 1); // '=' (U+003D) marks an assignment or comparison operator.\n            if (code2 === 0x3D) switch(code){\n                case 0x2B:\n                case 0x2D:\n                case 0x2F:\n                case 0x3C:\n                case 0x3E:\n                case 0x5E:\n                case 0x7C:\n                case 0x25:\n                case 0x26:\n                case 0x2A:\n                    // *\n                    index += 2;\n                    return {\n                        type: TokenPunctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        start: start,\n                        end: index\n                    };\n                case 0x21:\n                case 0x3D:\n                    // =\n                    index += 2; // !== and ===\n                    if (source.charCodeAt(index) === 0x3D) ++index;\n                    return {\n                        type: TokenPunctuator,\n                        value: source.slice(start, index),\n                        start: start,\n                        end: index\n                    };\n            }\n    } // 4-character punctuator: >>>=\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n        index += 4;\n        return {\n            type: TokenPunctuator,\n            value: ch4,\n            start: start,\n            end: index\n        };\n    } // 3-character punctuators: === !== >>> <<= >>=\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n        index += 3;\n        return {\n            type: TokenPunctuator,\n            value: ch3,\n            start: start,\n            end: index\n        };\n    } // Other 2-character punctuators: ++ -- << >> && ||\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".indexOf(ch1) >= 0 || ch2 === \"=>\") {\n        index += 2;\n        return {\n            type: TokenPunctuator,\n            value: ch2,\n            start: start,\n            end: index\n        };\n    }\n    if (ch2 === \"//\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // 1-character punctuators: < > = ! + - * % & | ^ /\n    if (\"<>=!+-*%&|^/\".indexOf(ch1) >= 0) {\n        ++index;\n        return {\n            type: TokenPunctuator,\n            value: ch1,\n            start: start,\n            end: index\n        };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n} // 7.8.3 Numeric Literals\nfunction scanHexLiteral(start) {\n    let number = \"\";\n    while(index < length){\n        if (!isHexDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (number.length === 0) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(\"0x\" + number, 16),\n        start: start,\n        end: index\n    };\n}\nfunction scanOctalLiteral(start) {\n    let number = \"0\" + source[index++];\n    while(index < length){\n        if (!isOctalDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(number, 8),\n        octal: true,\n        start: start,\n        end: index\n    };\n}\nfunction scanNumericLiteral() {\n    var number, start, ch;\n    ch = source[index];\n    assert(isDecimalDigit(ch.charCodeAt(0)) || ch === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number = \"\";\n    if (ch !== \".\") {\n        number = source[index++];\n        ch = source[index]; // Hex number starts with '0x'.\n        // Octal number starts with '0'.\n        if (number === \"0\") {\n            if (ch === \"x\" || ch === \"X\") {\n                ++index;\n                return scanHexLiteral(start);\n            }\n            if (isOctalDigit(ch)) return scanOctalLiteral(start);\n             // decimal number starts with '0' such as '09' is illegal.\n            if (ch && isDecimalDigit(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        }\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \".\") {\n        number += source[index++];\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \"e\" || ch === \"E\") {\n        number += source[index++];\n        ch = source[index];\n        if (ch === \"+\" || ch === \"-\") number += source[index++];\n        if (isDecimalDigit(source.charCodeAt(index))) while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseFloat(number),\n        start: start,\n        end: index\n    };\n} // 7.8.4 String Literals\nfunction scanStringLiteral() {\n    var str = \"\", quote, start, ch, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while(index < length){\n        ch = source[index++];\n        if (ch === quote) {\n            quote = \"\";\n            break;\n        } else if (ch === \"\\\\\") {\n            ch = source[index++];\n            if (!ch || !isLineTerminator(ch.charCodeAt(0))) switch(ch){\n                case \"u\":\n                case \"x\":\n                    if (source[index] === \"{\") {\n                        ++index;\n                        str += scanUnicodeCodePointEscape();\n                    } else str += scanHexEscape(ch);\n                    break;\n                case \"n\":\n                    str += \"\\n\";\n                    break;\n                case \"r\":\n                    str += \"\\r\";\n                    break;\n                case \"t\":\n                    str += \"\t\";\n                    break;\n                case \"b\":\n                    str += \"\\b\";\n                    break;\n                case \"f\":\n                    str += \"\\f\";\n                    break;\n                case \"v\":\n                    str += \"\\v\";\n                    break;\n                default:\n                    if (isOctalDigit(ch)) {\n                        code = \"01234567\".indexOf(ch); // \\0 is not octal escape sequence\n                        if (code !== 0) octal = true;\n                        if (index < length && isOctalDigit(source[index])) {\n                            octal = true;\n                            code = code * 8 + \"01234567\".indexOf(source[index++]); // 3 digits are only allowed when string starts\n                            // with 0, 1, 2, 3\n                            if (\"0123\".indexOf(ch) >= 0 && index < length && isOctalDigit(source[index])) code = code * 8 + \"01234567\".indexOf(source[index++]);\n                        }\n                        str += String.fromCharCode(code);\n                    } else str += ch;\n                    break;\n            }\n            else if (ch === \"\\r\" && source[index] === \"\\n\") ++index;\n        } else if (isLineTerminator(ch.charCodeAt(0))) break;\n        else str += ch;\n    }\n    if (quote !== \"\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenStringLiteral,\n        value: str,\n        octal: octal,\n        start: start,\n        end: index\n    };\n}\nfunction testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.indexOf(\"u\") >= 0) // Replace each astral symbol and every Unicode code point\n    // escape sequence with a single ASCII symbol to avoid throwing on\n    // regular expressions that are only valid in combination with the\n    // `/u` flag.\n    // Note: replacing with the ASCII symbol `x` might cause false\n    // negatives in unlikely scenarios. For example, `[\\u{61}-b]` is a\n    // perfectly valid pattern that is equivalent to `[a-b]`, but it\n    // would be replaced by `[x-b]` which throws an error.\n    tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1)=>{\n        if (parseInt($1, 16) <= 0x10FFFF) return \"x\";\n        throwError({}, MessageInvalidRegExp);\n    }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n     // First, detect invalid regular expressions.\n    try {\n        new RegExp(tmp);\n    } catch (e) {\n        throwError({}, MessageInvalidRegExp);\n    } // Return a regular expression object for this pattern-flag pair, or\n    // `null` in case the current environment doesn't support the flags it\n    // uses.\n    try {\n        return new RegExp(pattern, flags);\n    } catch (exception) {\n        return null;\n    }\n}\nfunction scanRegExpBody() {\n    var ch, str, classMarker, terminated, body;\n    ch = source[index];\n    assert(ch === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while(index < length){\n        ch = source[index++];\n        str += ch;\n        if (ch === \"\\\\\") {\n            ch = source[index++]; // ECMA-262 7.8.5\n            if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n            str += ch;\n        } else if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n        else if (classMarker) {\n            if (ch === \"]\") classMarker = false;\n        } else {\n            if (ch === \"/\") {\n                terminated = true;\n                break;\n            } else if (ch === \"[\") classMarker = true;\n        }\n    }\n    if (!terminated) throwError({}, MessageUnterminatedRegExp);\n     // Exclude leading and trailing slash.\n    body = str.substr(1, str.length - 2);\n    return {\n        value: body,\n        literal: str\n    };\n}\nfunction scanRegExpFlags() {\n    var ch, str, flags;\n    str = \"\";\n    flags = \"\";\n    while(index < length){\n        ch = source[index];\n        if (!isIdentifierPart(ch.charCodeAt(0))) break;\n        ++index;\n        if (ch === \"\\\\\" && index < length) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        else {\n            flags += ch;\n            str += ch;\n        }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) throwError({}, MessageInvalidRegExp, flags);\n    return {\n        value: flags,\n        literal: str\n    };\n}\nfunction scanRegExp() {\n    var start, body, flags, value;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value = testRegExp(body.value, flags.value);\n    return {\n        literal: body.literal + flags.literal,\n        value: value,\n        regex: {\n            pattern: body.value,\n            flags: flags.value\n        },\n        start: start,\n        end: index\n    };\n}\nfunction isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n}\nfunction advance() {\n    skipComment();\n    if (index >= length) return {\n        type: TokenEOF,\n        start: index,\n        end: index\n    };\n    const ch = source.charCodeAt(index);\n    if (isIdentifierStart(ch)) return scanIdentifier();\n     // Very common: ( and ) and ;\n    if (ch === 0x28 || ch === 0x29 || ch === 0x3B) return scanPunctuator();\n     // String literal starts with single quote (U+0027) or double quote (U+0022).\n    if (ch === 0x27 || ch === 0x22) return scanStringLiteral();\n     // Dot (.) U+002E can also start a floating-point number, hence the need\n    // to check the next character.\n    if (ch === 0x2E) {\n        if (isDecimalDigit(source.charCodeAt(index + 1))) return scanNumericLiteral();\n        return scanPunctuator();\n    }\n    if (isDecimalDigit(ch)) return scanNumericLiteral();\n    return scanPunctuator();\n}\nfunction lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n}\nfunction peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n}\nfunction finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n}\nfunction finishBinaryExpression(operator, left, right) {\n    const node = new ASTNode(operator === \"||\" || operator === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator;\n    node.left = left;\n    node.right = right;\n    return node;\n}\nfunction finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n}\nfunction finishConditionalExpression(test, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n}\nfunction finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n}\nfunction finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n        if (node.raw === \"//\") node.raw = \"/(?:)/\";\n        node.regex = token.regex;\n    }\n    return node;\n}\nfunction finishMemberExpression(accessor, object, property) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor === \"[\";\n    node.object = object;\n    node.property = property;\n    if (!node.computed) property.member = true;\n    return node;\n}\nfunction finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n}\nfunction finishProperty(kind, key, value) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key;\n    node.value = value;\n    node.kind = kind;\n    return node;\n}\nfunction finishUnaryExpression(operator, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n} // Throw an exception\nfunction throwError(token, messageFormat) {\n    var error, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index1)=>{\n        assert(index1 < args.length, \"Message reference must be in range\");\n        return args[index1];\n    });\n    error = new Error(msg);\n    error.index = index;\n    error.description = msg;\n    throw error;\n} // Throw an exception because of the token.\nfunction throwUnexpected(token) {\n    if (token.type === TokenEOF) throwError(token, MessageUnexpectedEOS);\n    if (token.type === TokenNumericLiteral) throwError(token, MessageUnexpectedNumber);\n    if (token.type === TokenStringLiteral) throwError(token, MessageUnexpectedString);\n    if (token.type === TokenIdentifier) throwError(token, MessageUnexpectedIdentifier);\n    if (token.type === TokenKeyword) throwError(token, MessageUnexpectedReserved);\n     // BooleanLiteral, NullLiteral, or Punctuator.\n    throwError(token, MessageUnexpectedToken, token.value);\n} // Expect the next token to match the specified punctuator.\n// If not, an exception will be thrown.\nfunction expect(value) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value) throwUnexpected(token);\n} // Return true if the next token matches the specified punctuator.\nfunction match(value) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value;\n} // Return true if the next token matches the specified keyword\nfunction matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n} // 11.1.4 Array Initialiser\nfunction parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while(!match(\"]\"))if (match(\",\")) {\n        lex();\n        elements.push(null);\n    } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) expect(\",\");\n    }\n    lex();\n    return finishArrayExpression(elements);\n} // 11.1.5 Object Initialiser\nfunction parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex(); // Note: This function is called only from parseObjectProperty(), where\n    // EOF and Punctuator tokens are already filtered out.\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n        if (token.octal) throwError(token, MessageStrictOctalLiteral);\n        return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n}\nfunction parseObjectProperty() {\n    var token, key, id, value;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n        id = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", id, value);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) throwUnexpected(token);\n    else {\n        key = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", key, value);\n    }\n}\nfunction parseObjectInitialiser() {\n    var properties = [], property, name, key, map = {}, toString = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while(!match(\"}\")){\n        property = parseObjectProperty();\n        if (property.key.type === SyntaxIdentifier) name = property.key.name;\n        else name = toString(property.key.value);\n        key = \"$\" + name;\n        if (Object.prototype.hasOwnProperty.call(map, key)) throwError({}, MessageStrictDuplicateProperty);\n        else map[key] = true;\n        properties.push(property);\n        if (!match(\"}\")) expect(\",\");\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n} // 11.1.6 The Grouping Operator\nfunction parseGroupExpression() {\n    expect(\"(\");\n    const expr = parseExpression();\n    expect(\")\");\n    return expr;\n} // 11.1 Primary Expressions\nconst legalKeywords = {\n    \"if\": 1\n};\nfunction parsePrimaryExpression() {\n    var type, token, expr;\n    if (match(\"(\")) return parseGroupExpression();\n    if (match(\"[\")) return parseArrayInitialiser();\n    if (match(\"{\")) return parseObjectInitialiser();\n    type = lookahead.type;\n    index = lookahead.start;\n    if (type === TokenIdentifier || legalKeywords[lookahead.value]) expr = finishIdentifier(lex().value);\n    else if (type === TokenStringLiteral || type === TokenNumericLiteral) {\n        if (lookahead.octal) throwError(lookahead, MessageStrictOctalLiteral);\n        expr = finishLiteral(lex());\n    } else if (type === TokenKeyword) throw new Error(DISABLED);\n    else if (type === TokenBooleanLiteral) {\n        token = lex();\n        token.value = token.value === \"true\";\n        expr = finishLiteral(token);\n    } else if (type === TokenNullLiteral) {\n        token = lex();\n        token.value = null;\n        expr = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n        expr = finishLiteral(scanRegExp());\n        peek();\n    } else throwUnexpected(lex());\n    return expr;\n} // 11.2 Left-Hand-Side Expressions\nfunction parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) while(index < length){\n        args.push(parseConditionalExpression());\n        if (match(\")\")) break;\n        expect(\",\");\n    }\n    expect(\")\");\n    return args;\n}\nfunction parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) throwUnexpected(token);\n    return finishIdentifier(token.value);\n}\nfunction parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n}\nfunction parseComputedMember() {\n    expect(\"[\");\n    const expr = parseExpression();\n    expect(\"]\");\n    return expr;\n}\nfunction parseLeftHandSideExpressionAllowCall() {\n    var expr, args, property;\n    expr = parsePrimaryExpression();\n    for(;;){\n        if (match(\".\")) {\n            property = parseNonComputedMember();\n            expr = finishMemberExpression(\".\", expr, property);\n        } else if (match(\"(\")) {\n            args = parseArguments();\n            expr = finishCallExpression(expr, args);\n        } else if (match(\"[\")) {\n            property = parseComputedMember();\n            expr = finishMemberExpression(\"[\", expr, property);\n        } else break;\n    }\n    return expr;\n} // 11.3 Postfix Expressions\nfunction parsePostfixExpression() {\n    const expr = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n        if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    }\n    return expr;\n} // 11.4 Unary Operators\nfunction parseUnaryExpression() {\n    var token, expr;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) expr = parsePostfixExpression();\n    else if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n        token = lex();\n        expr = parseUnaryExpression();\n        expr = finishUnaryExpression(token.value, expr);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) throw new Error(DISABLED);\n    else expr = parsePostfixExpression();\n    return expr;\n}\nfunction binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) return 0;\n    switch(token.value){\n        case \"||\":\n            prec = 1;\n            break;\n        case \"&&\":\n            prec = 2;\n            break;\n        case \"|\":\n            prec = 3;\n            break;\n        case \"^\":\n            prec = 4;\n            break;\n        case \"&\":\n            prec = 5;\n            break;\n        case \"==\":\n        case \"!=\":\n        case \"===\":\n        case \"!==\":\n            prec = 6;\n            break;\n        case \"<\":\n        case \">\":\n        case \"<=\":\n        case \">=\":\n        case \"instanceof\":\n        case \"in\":\n            prec = 7;\n            break;\n        case \"<<\":\n        case \">>\":\n        case \">>>\":\n            prec = 8;\n            break;\n        case \"+\":\n        case \"-\":\n            prec = 9;\n            break;\n        case \"*\":\n        case \"/\":\n        case \"%\":\n            prec = 11;\n            break;\n    }\n    return prec;\n} // 11.5 Multiplicative Operators\n// 11.6 Additive Operators\n// 11.7 Bitwise Shift Operators\n// 11.8 Relational Operators\n// 11.9 Equality Operators\n// 11.10 Binary Bitwise Operators\n// 11.11 Binary Logical Operators\nfunction parseBinaryExpression() {\n    var marker, markers, expr, token, prec, stack, right, operator, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) return left;\n    token.prec = prec;\n    lex();\n    markers = [\n        marker,\n        lookahead\n    ];\n    right = parseUnaryExpression();\n    stack = [\n        left,\n        token,\n        right\n    ];\n    while((prec = binaryPrecedence(lookahead)) > 0){\n        // Reduce: make a binary expression from the three topmost entries.\n        while(stack.length > 2 && prec <= stack[stack.length - 2].prec){\n            right = stack.pop();\n            operator = stack.pop().value;\n            left = stack.pop();\n            markers.pop();\n            expr = finishBinaryExpression(operator, left, right);\n            stack.push(expr);\n        } // Shift.\n        token = lex();\n        token.prec = prec;\n        stack.push(token);\n        markers.push(lookahead);\n        expr = parseUnaryExpression();\n        stack.push(expr);\n    } // Final reduce to clean-up the stack.\n    i = stack.length - 1;\n    expr = stack[i];\n    markers.pop();\n    while(i > 1){\n        markers.pop();\n        expr = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n        i -= 2;\n    }\n    return expr;\n} // 11.12 Conditional Operator\nfunction parseConditionalExpression() {\n    var expr, consequent, alternate;\n    expr = parseBinaryExpression();\n    if (match(\"?\")) {\n        lex();\n        consequent = parseConditionalExpression();\n        expect(\":\");\n        alternate = parseConditionalExpression();\n        expr = finishConditionalExpression(expr, consequent, alternate);\n    }\n    return expr;\n} // 11.14 Comma Operator\nfunction parseExpression() {\n    const expr = parseConditionalExpression();\n    if (match(\",\")) throw new Error(DISABLED); // no sequence expressions\n    return expr;\n}\nfunction parser(code) {\n    source = code;\n    index = 0;\n    length = source.length;\n    lookahead = null;\n    peek();\n    const expr = parseExpression();\n    if (lookahead.type !== TokenEOF) throw new Error(\"Unexpect token after expression.\");\n    return expr;\n}\nvar Constants = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n};\nfunction Functions(codegen1) {\n    function fncall(name, args, cast, type) {\n        let obj = codegen1(args[0]);\n        if (cast) {\n            obj = cast + \"(\" + obj + \")\";\n            if (cast.lastIndexOf(\"new \", 0) === 0) obj = \"(\" + obj + \")\";\n        }\n        return obj + \".\" + name + (type < 0 ? \"\" : type === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen1).join(\",\") + \")\");\n    }\n    function fn(name, cast, type) {\n        return (args)=>fncall(name, args, cast, type);\n    }\n    const DATE = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n        // MATH functions\n        isNaN: \"Number.isNaN\",\n        isFinite: \"Number.isFinite\",\n        abs: \"Math.abs\",\n        acos: \"Math.acos\",\n        asin: \"Math.asin\",\n        atan: \"Math.atan\",\n        atan2: \"Math.atan2\",\n        ceil: \"Math.ceil\",\n        cos: \"Math.cos\",\n        exp: \"Math.exp\",\n        floor: \"Math.floor\",\n        log: \"Math.log\",\n        max: \"Math.max\",\n        min: \"Math.min\",\n        pow: \"Math.pow\",\n        random: \"Math.random\",\n        round: \"Math.round\",\n        sin: \"Math.sin\",\n        sqrt: \"Math.sqrt\",\n        tan: \"Math.tan\",\n        clamp: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to clamp function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to clamp function.\");\n            const a = args.map(codegen1);\n            return \"Math.max(\" + a[1] + \", Math.min(\" + a[2] + \",\" + a[0] + \"))\";\n        },\n        // DATE functions\n        now: \"Date.now\",\n        utc: \"Date.UTC\",\n        datetime: DATE,\n        date: fn(\"getDate\", DATE, 0),\n        day: fn(\"getDay\", DATE, 0),\n        year: fn(\"getFullYear\", DATE, 0),\n        month: fn(\"getMonth\", DATE, 0),\n        hours: fn(\"getHours\", DATE, 0),\n        minutes: fn(\"getMinutes\", DATE, 0),\n        seconds: fn(\"getSeconds\", DATE, 0),\n        milliseconds: fn(\"getMilliseconds\", DATE, 0),\n        time: fn(\"getTime\", DATE, 0),\n        timezoneoffset: fn(\"getTimezoneOffset\", DATE, 0),\n        utcdate: fn(\"getUTCDate\", DATE, 0),\n        utcday: fn(\"getUTCDay\", DATE, 0),\n        utcyear: fn(\"getUTCFullYear\", DATE, 0),\n        utcmonth: fn(\"getUTCMonth\", DATE, 0),\n        utchours: fn(\"getUTCHours\", DATE, 0),\n        utcminutes: fn(\"getUTCMinutes\", DATE, 0),\n        utcseconds: fn(\"getUTCSeconds\", DATE, 0),\n        utcmilliseconds: fn(\"getUTCMilliseconds\", DATE, 0),\n        // sequence functions\n        length: fn(\"length\", null, -1),\n        // STRING functions\n        parseFloat: \"parseFloat\",\n        parseInt: \"parseInt\",\n        upper: fn(\"toUpperCase\", STRING, 0),\n        lower: fn(\"toLowerCase\", STRING, 0),\n        substring: fn(\"substring\", STRING),\n        split: fn(\"split\", STRING),\n        trim: fn(\"trim\", STRING, 0),\n        // REGEXP functions\n        regexp: REGEXP,\n        test: fn(\"test\", REGEXP),\n        // Control Flow functions\n        if: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to if function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to if function.\");\n            const a = args.map(codegen1);\n            return \"(\" + a[0] + \"?\" + a[1] + \":\" + a[2] + \")\";\n        }\n    };\n}\nfunction stripQuotes(s) {\n    const n = s && s.length - 1;\n    return n && (s[0] === '\"' && s[n] === '\"' || s[0] === \"'\" && s[n] === \"'\") ? s.slice(1, -1) : s;\n}\nfunction codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? (0, _vegaUtil.toSet)(opt.allowed) : {}, forbidden = opt.forbidden ? (0, _vegaUtil.toSet)(opt.forbidden) : {}, constants = opt.constants || Constants, functions = (opt.functions || Functions)(visit), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = (0, _vegaUtil.isFunction)(globalvar) ? globalvar : (id)=>`${globalvar}[\"${id}\"]`;\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit(ast) {\n        if ((0, _vegaUtil.isString)(ast)) return ast;\n        const generator = Generators[ast.type];\n        if (generator == null) (0, _vegaUtil.error)(\"Unsupported type: \" + ast.type);\n        return generator(ast);\n    }\n    const Generators = {\n        Literal: (n)=>n.raw,\n        Identifier: (n)=>{\n            const id = n.name;\n            if (memberDepth > 0) return id;\n            else if ((0, _vegaUtil.hasOwnProperty)(forbidden, id)) return (0, _vegaUtil.error)(\"Illegal identifier: \" + id);\n            else if ((0, _vegaUtil.hasOwnProperty)(constants, id)) return constants[id];\n            else if ((0, _vegaUtil.hasOwnProperty)(allowed, id)) return id;\n            else {\n                globals[id] = 1;\n                return outputGlobal(id);\n            }\n        },\n        MemberExpression: (n)=>{\n            const d = !n.computed, o = visit(n.object);\n            if (d) memberDepth += 1;\n            const p = visit(n.property);\n            if (o === fieldvar) // strip quotes to sanitize field name (#1653)\n            fields[stripQuotes(p)] = 1;\n            if (d) memberDepth -= 1;\n            return o + (d ? \".\" + p : \"[\" + p + \"]\");\n        },\n        CallExpression: (n)=>{\n            if (n.callee.type !== \"Identifier\") (0, _vegaUtil.error)(\"Illegal callee type: \" + n.callee.type);\n            const callee = n.callee.name, args = n.arguments, fn = (0, _vegaUtil.hasOwnProperty)(functions, callee) && functions[callee];\n            if (!fn) (0, _vegaUtil.error)(\"Unrecognized function: \" + callee);\n            return (0, _vegaUtil.isFunction)(fn) ? fn(args) : fn + \"(\" + args.map(visit).join(\",\") + \")\";\n        },\n        ArrayExpression: (n)=>\"[\" + n.elements.map(visit).join(\",\") + \"]\",\n        BinaryExpression: (n)=>\"(\" + visit(n.left) + \" \" + n.operator + \" \" + visit(n.right) + \")\",\n        UnaryExpression: (n)=>\"(\" + n.operator + visit(n.argument) + \")\",\n        ConditionalExpression: (n)=>\"(\" + visit(n.test) + \"?\" + visit(n.consequent) + \":\" + visit(n.alternate) + \")\",\n        LogicalExpression: (n)=>\"(\" + visit(n.left) + n.operator + visit(n.right) + \")\",\n        ObjectExpression: (n)=>\"{\" + n.properties.map(visit).join(\",\") + \"}\",\n        Property: (n)=>{\n            memberDepth += 1;\n            const k = visit(n.key);\n            memberDepth -= 1;\n            return k + \":\" + visit(n.value);\n        }\n    };\n    function codegen2(ast) {\n        const result = {\n            code: visit(ast),\n            globals: Object.keys(globals),\n            fields: Object.keys(fields)\n        };\n        globals = {};\n        fields = {};\n        return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants;\n    return codegen2;\n}\n\n},{\"vega-util\":\"dPFAY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7uoGs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"selectionIdTest\", ()=>selectionIdTest);\nparcelHelpers.export(exports, \"selectionResolve\", ()=>selectionResolve);\nparcelHelpers.export(exports, \"selectionTest\", ()=>selectionTest);\nparcelHelpers.export(exports, \"selectionTuples\", ()=>selectionTuples);\nparcelHelpers.export(exports, \"selectionVisitor\", ()=>selectionVisitor);\nvar _d3Array = require(\"d3-array\");\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaExpression = require(\"vega-expression\");\nconst Intersect = \"intersect\";\nconst Union = \"union\";\nconst VlMulti = \"vlMulti\";\nconst VlPoint = \"vlPoint\";\nconst Or = \"or\";\nconst And = \"and\";\nconst SelectionId = \"_vgsid_\";\nconst $selectionId = (0, _vegaUtil.field)(SelectionId);\nconst TYPE_ENUM = \"E\", TYPE_RANGE_INC = \"R\", TYPE_RANGE_EXC = \"R-E\", TYPE_RANGE_LE = \"R-LE\", TYPE_RANGE_RE = \"R-RE\", UNIT_INDEX = \"index:unit\"; // TODO: revisit date coercion?\nfunction testPoint(datum, entry) {\n    var fields = entry.fields, values = entry.values, n = fields.length, i = 0, dval, f;\n    for(; i < n; ++i){\n        f = fields[i];\n        f.getter = (0, _vegaUtil.field).getter || (0, _vegaUtil.field)(f.field);\n        dval = f.getter(datum);\n        if ((0, _vegaUtil.isDate)(dval)) dval = (0, _vegaUtil.toNumber)(dval);\n        if ((0, _vegaUtil.isDate)(values[i])) values[i] = (0, _vegaUtil.toNumber)(values[i]);\n        if ((0, _vegaUtil.isDate)(values[i][0])) values[i] = values[i].map((0, _vegaUtil.toNumber));\n        if (f.type === TYPE_ENUM) {\n            // Enumerated fields can either specify individual values (single/multi selections)\n            // or an array of values (interval selections).\n            if ((0, _vegaUtil.isArray)(values[i]) ? values[i].indexOf(dval) < 0 : dval !== values[i]) return false;\n        } else {\n            if (f.type === TYPE_RANGE_INC) {\n                if (!(0, _vegaUtil.inrange)(dval, values[i])) return false;\n            } else if (f.type === TYPE_RANGE_RE) {\n                // Discrete selection of bins test within the range [bin_start, bin_end).\n                if (!(0, _vegaUtil.inrange)(dval, values[i], true, false)) return false;\n            } else if (f.type === TYPE_RANGE_EXC) {\n                // 'R-E'/'R-LE' included for completeness.\n                if (!(0, _vegaUtil.inrange)(dval, values[i], false, false)) return false;\n            } else if (f.type === TYPE_RANGE_LE) {\n                if (!(0, _vegaUtil.inrange)(dval, values[i], false, true)) return false;\n            }\n        }\n    }\n    return true;\n}\n/**\n * Tests if a tuple is contained within an interactive selection.\n * @param {string} name - The name of the data set representing the selection.\n *  Tuples in the dataset are of the form\n *  {unit: string, fields: array<fielddef>, values: array<*>}.\n *  Fielddef is of the form\n *  {field: string, channel: string, type: 'E' | 'R'} where\n *  'type' identifies whether tuples in the dataset enumerate\n *  values for the field, or specify a continuous range.\n * @param {object} datum - The tuple to test for inclusion.\n * @param {string} op - The set operation for combining selections.\n *   One of 'intersect' or 'union' (default).\n * @return {boolean} - True if the datum is in the selection, false otherwise.\n */ function selectionTest(name, datum, op) {\n    var data = this.context.data[name], entries = data ? data.values.value : [], unitIdx = data ? data[UNIT_INDEX] && data[UNIT_INDEX].value : undefined, intersect = op === Intersect, n = entries.length, i = 0, entry, miss, count, unit, b;\n    for(; i < n; ++i){\n        entry = entries[i];\n        if (unitIdx && intersect) {\n            // multi selections union within the same unit and intersect across units.\n            miss = miss || {};\n            count = miss[unit = entry.unit] || 0; // if we've already matched this unit, skip.\n            if (count === -1) continue;\n            b = testPoint(datum, entry);\n            miss[unit] = b ? -1 : ++count; // if we match and there are no other units return true\n            // if we've missed against all tuples in this unit return false\n            if (b && unitIdx.size === 1) return true;\n            if (!b && count === unitIdx.get(unit).count) return false;\n        } else {\n            b = testPoint(datum, entry); // if we find a miss and we do require intersection return false\n            // if we find a match and we don't require intersection return true\n            if (intersect ^ b) return b;\n        }\n    } // if intersecting and we made it here, then we saw no misses\n    // if not intersecting, then we saw no matches\n    // if no active selections, return false\n    return n && intersect;\n}\nconst bisect = (0, _d3Array.bisector)($selectionId), bisectLeft = bisect.left, bisectRight = bisect.right;\nfunction selectionIdTest(name, datum, op) {\n    const data = this.context.data[name], entries = data ? data.values.value : [], unitIdx = data ? data[UNIT_INDEX] && data[UNIT_INDEX].value : undefined, intersect = op === Intersect, value = $selectionId(datum), index = bisectLeft(entries, value);\n    if (index === entries.length) return false;\n    if ($selectionId(entries[index]) !== value) return false;\n    if (unitIdx && intersect) {\n        if (unitIdx.size === 1) return true;\n        if (bisectRight(entries, value) - index < unitIdx.size) return false;\n    }\n    return true;\n}\n/**\n * Maps an array of scene graph items to an array of selection tuples.\n * @param {string} name  - The name of the dataset representing the selection.\n * @param {string} base  - The base object that generated tuples extend.\n *\n * @returns {array} An array of selection entries for the given unit.\n */ function selectionTuples(array, base) {\n    return array.map((x)=>(0, _vegaUtil.extend)(base.fields ? {\n            values: base.fields.map((f)=>(f.getter || (f.getter = (0, _vegaUtil.field)(f.field)))(x.datum))\n        } : {\n            [SelectionId]: $selectionId(x.datum)\n        }, base));\n}\n/**\n * Resolves selection for use as a scale domain or reads via the API.\n * @param {string} name - The name of the dataset representing the selection\n * @param {string} [op='union'] - The set operation for combining selections.\n *                 One of 'intersect' or 'union' (default).\n * @param {boolean} isMulti - Identifies a \"multi\" selection to perform more\n *                 expensive resolution computation.\n * @param {boolean} vl5 - With Vega-Lite v5, \"multi\" selections are now called \"point\"\n *                 selections, and thus the resolved tuple should reflect this name.\n *                 This parameter allows us to reflect this change without triggering\n *                 a major version bump for Vega.\n * @returns {object} An object of selected fields and values.\n */ function selectionResolve(name, op, isMulti, vl5) {\n    var data = this.context.data[name], entries = data ? data.values.value : [], resolved = {}, multiRes = {}, types = {}, entry, fields, values, unit1, field1, value, res, resUnit, type, union, n = entries.length, i = 0, j1, m; // First union all entries within the same unit.\n    for(; i < n; ++i){\n        entry = entries[i];\n        unit1 = entry.unit;\n        fields = entry.fields;\n        values = entry.values;\n        if (fields && values) {\n            // Intentional selection stores\n            for(j1 = 0, m = fields.length; j1 < m; ++j1){\n                field1 = fields[j1];\n                res = resolved[field1.field] || (resolved[field1.field] = {});\n                resUnit = res[unit1] || (res[unit1] = []);\n                types[field1.field] = type = field1.type.charAt(0);\n                union = ops[\"\".concat(type, \"_union\")];\n                res[unit1] = union(resUnit, (0, _vegaUtil.array)(values[j1]));\n            } // If the same multi-selection is repeated over views and projected over\n            // an encoding, it may operate over different fields making it especially\n            // tricky to reliably resolve it. At best, we can de-dupe identical entries\n            // but doing so may be more computationally expensive than it is worth.\n            // Instead, for now, we simply transform our store representation into\n            // a more human-friendly one.\n            if (isMulti) {\n                resUnit = multiRes[unit1] || (multiRes[unit1] = []);\n                resUnit.push((0, _vegaUtil.array)(values).reduce((obj, curr, j)=>(obj[fields[j].field] = curr, obj), {}));\n            }\n        } else {\n            // Short circuit extensional selectionId stores which hold sorted IDs unique to each unit.\n            field1 = SelectionId;\n            value = $selectionId(entry);\n            res = resolved[field1] || (resolved[field1] = {});\n            resUnit = res[unit1] || (res[unit1] = []);\n            resUnit.push(value);\n            if (isMulti) {\n                resUnit = multiRes[unit1] || (multiRes[unit1] = []);\n                resUnit.push({\n                    [SelectionId]: value\n                });\n            }\n        }\n    } // Then resolve fields across units as per the op.\n    op = op || Union;\n    if (resolved[SelectionId]) resolved[SelectionId] = ops[\"\".concat(SelectionId, \"_\").concat(op)](...Object.values(resolved[SelectionId]));\n    else Object.keys(resolved).forEach((field)=>{\n        resolved[field] = Object.keys(resolved[field]).map((unit)=>resolved[field][unit]).reduce((acc, curr)=>acc === undefined ? curr : ops[\"\".concat(types[field], \"_\").concat(op)](acc, curr));\n    });\n    entries = Object.keys(multiRes);\n    if (isMulti && entries.length) {\n        const key = vl5 ? VlPoint : VlMulti;\n        resolved[key] = op === Union ? {\n            [Or]: entries.reduce((acc, k)=>(acc.push(...multiRes[k]), acc), [])\n        } : {\n            [And]: entries.map((k)=>({\n                    [Or]: multiRes[k]\n                }))\n        };\n    }\n    return resolved;\n}\nvar ops = {\n    [\"\".concat(SelectionId, \"_union\")]: (0, _d3Array.union),\n    [\"\".concat(SelectionId, \"_intersect\")]: (0, _d3Array.intersection),\n    E_union: function(base, value) {\n        if (!base.length) return value;\n        var i = 0, n = value.length;\n        for(; i < n; ++i)if (base.indexOf(value[i]) < 0) base.push(value[i]);\n        return base;\n    },\n    E_intersect: function(base, value) {\n        return !base.length ? value : base.filter((v)=>value.indexOf(v) >= 0);\n    },\n    R_union: function(base, value) {\n        var lo = (0, _vegaUtil.toNumber)(value[0]), hi = (0, _vegaUtil.toNumber)(value[1]);\n        if (lo > hi) {\n            lo = value[1];\n            hi = value[0];\n        }\n        if (!base.length) return [\n            lo,\n            hi\n        ];\n        if (base[0] > lo) base[0] = lo;\n        if (base[1] < hi) base[1] = hi;\n        return base;\n    },\n    R_intersect: function(base, value) {\n        var lo = (0, _vegaUtil.toNumber)(value[0]), hi = (0, _vegaUtil.toNumber)(value[1]);\n        if (lo > hi) {\n            lo = value[1];\n            hi = value[0];\n        }\n        if (!base.length) return [\n            lo,\n            hi\n        ];\n        if (hi < base[0] || base[1] < lo) return [];\n        else {\n            if (base[0] < lo) base[0] = lo;\n            if (base[1] > hi) base[1] = hi;\n        }\n        return base;\n    }\n};\nconst DataPrefix = \":\", IndexPrefix = \"@\";\nfunction selectionVisitor(name, args, scope, params) {\n    if (args[0].type !== (0, _vegaExpression.Literal)) (0, _vegaUtil.error)(\"First argument to selection functions must be a string literal.\");\n    const data = args[0].value, op = args.length >= 2 && (0, _vegaUtil.peek)(args).value, field = \"unit\", indexName = IndexPrefix + field, dataName = DataPrefix + data; // eslint-disable-next-line no-prototype-builtins\n    if (op === Intersect && !(0, _vegaUtil.hasOwnProperty)(params, indexName)) params[indexName] = scope.getData(data).indataRef(scope, field);\n     // eslint-disable-next-line no-prototype-builtins\n    if (!(0, _vegaUtil.hasOwnProperty)(params, dataName)) params[dataName] = scope.getData(data).tuplesRef();\n}\n\n},{\"d3-array\":\"hwjyc\",\"vega-util\":\"dPFAY\",\"vega-expression\":\"huXGR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hwjyc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bisect\", ()=>(0, _bisectJsDefault.default));\nparcelHelpers.export(exports, \"bisectRight\", ()=>(0, _bisectJs.bisectRight));\nparcelHelpers.export(exports, \"bisectLeft\", ()=>(0, _bisectJs.bisectLeft));\nparcelHelpers.export(exports, \"bisectCenter\", ()=>(0, _bisectJs.bisectCenter));\nparcelHelpers.export(exports, \"ascending\", ()=>(0, _ascendingJsDefault.default));\nparcelHelpers.export(exports, \"bisector\", ()=>(0, _bisectorJsDefault.default));\nparcelHelpers.export(exports, \"count\", ()=>(0, _countJsDefault.default));\nparcelHelpers.export(exports, \"cross\", ()=>(0, _crossJsDefault.default));\nparcelHelpers.export(exports, \"cumsum\", ()=>(0, _cumsumJsDefault.default));\nparcelHelpers.export(exports, \"descending\", ()=>(0, _descendingJsDefault.default));\nparcelHelpers.export(exports, \"deviation\", ()=>(0, _deviationJsDefault.default));\nparcelHelpers.export(exports, \"extent\", ()=>(0, _extentJsDefault.default));\nparcelHelpers.export(exports, \"Adder\", ()=>(0, _fsumJs.Adder));\nparcelHelpers.export(exports, \"fsum\", ()=>(0, _fsumJs.fsum));\nparcelHelpers.export(exports, \"fcumsum\", ()=>(0, _fsumJs.fcumsum));\nparcelHelpers.export(exports, \"group\", ()=>(0, _groupJsDefault.default));\nparcelHelpers.export(exports, \"flatGroup\", ()=>(0, _groupJs.flatGroup));\nparcelHelpers.export(exports, \"flatRollup\", ()=>(0, _groupJs.flatRollup));\nparcelHelpers.export(exports, \"groups\", ()=>(0, _groupJs.groups));\nparcelHelpers.export(exports, \"index\", ()=>(0, _groupJs.index));\nparcelHelpers.export(exports, \"indexes\", ()=>(0, _groupJs.indexes));\nparcelHelpers.export(exports, \"rollup\", ()=>(0, _groupJs.rollup));\nparcelHelpers.export(exports, \"rollups\", ()=>(0, _groupJs.rollups));\nparcelHelpers.export(exports, \"groupSort\", ()=>(0, _groupSortJsDefault.default));\nparcelHelpers.export(exports, \"bin\", ()=>(0, _binJsDefault.default)) // Deprecated; use bin.\n;\nparcelHelpers.export(exports, \"histogram\", ()=>(0, _binJsDefault.default));\nparcelHelpers.export(exports, \"thresholdFreedmanDiaconis\", ()=>(0, _freedmanDiaconisJsDefault.default));\nparcelHelpers.export(exports, \"thresholdScott\", ()=>(0, _scottJsDefault.default));\nparcelHelpers.export(exports, \"thresholdSturges\", ()=>(0, _sturgesJsDefault.default));\nparcelHelpers.export(exports, \"max\", ()=>(0, _maxJsDefault.default));\nparcelHelpers.export(exports, \"maxIndex\", ()=>(0, _maxIndexJsDefault.default));\nparcelHelpers.export(exports, \"mean\", ()=>(0, _meanJsDefault.default));\nparcelHelpers.export(exports, \"median\", ()=>(0, _medianJsDefault.default));\nparcelHelpers.export(exports, \"merge\", ()=>(0, _mergeJsDefault.default));\nparcelHelpers.export(exports, \"min\", ()=>(0, _minJsDefault.default));\nparcelHelpers.export(exports, \"minIndex\", ()=>(0, _minIndexJsDefault.default));\nparcelHelpers.export(exports, \"mode\", ()=>(0, _modeJsDefault.default));\nparcelHelpers.export(exports, \"nice\", ()=>(0, _niceJsDefault.default));\nparcelHelpers.export(exports, \"pairs\", ()=>(0, _pairsJsDefault.default));\nparcelHelpers.export(exports, \"permute\", ()=>(0, _permuteJsDefault.default));\nparcelHelpers.export(exports, \"quantile\", ()=>(0, _quantileJsDefault.default));\nparcelHelpers.export(exports, \"quantileSorted\", ()=>(0, _quantileJs.quantileSorted));\nparcelHelpers.export(exports, \"quickselect\", ()=>(0, _quickselectJsDefault.default));\nparcelHelpers.export(exports, \"range\", ()=>(0, _rangeJsDefault.default));\nparcelHelpers.export(exports, \"rank\", ()=>(0, _rankJsDefault.default));\nparcelHelpers.export(exports, \"least\", ()=>(0, _leastJsDefault.default));\nparcelHelpers.export(exports, \"leastIndex\", ()=>(0, _leastIndexJsDefault.default));\nparcelHelpers.export(exports, \"greatest\", ()=>(0, _greatestJsDefault.default));\nparcelHelpers.export(exports, \"greatestIndex\", ()=>(0, _greatestIndexJsDefault.default));\nparcelHelpers.export(exports, \"scan\", ()=>(0, _scanJsDefault.default)) // Deprecated; use leastIndex.\n;\nparcelHelpers.export(exports, \"shuffle\", ()=>(0, _shuffleJsDefault.default));\nparcelHelpers.export(exports, \"shuffler\", ()=>(0, _shuffleJs.shuffler));\nparcelHelpers.export(exports, \"sum\", ()=>(0, _sumJsDefault.default));\nparcelHelpers.export(exports, \"ticks\", ()=>(0, _ticksJsDefault.default));\nparcelHelpers.export(exports, \"tickIncrement\", ()=>(0, _ticksJs.tickIncrement));\nparcelHelpers.export(exports, \"tickStep\", ()=>(0, _ticksJs.tickStep));\nparcelHelpers.export(exports, \"transpose\", ()=>(0, _transposeJsDefault.default));\nparcelHelpers.export(exports, \"variance\", ()=>(0, _varianceJsDefault.default));\nparcelHelpers.export(exports, \"zip\", ()=>(0, _zipJsDefault.default));\nparcelHelpers.export(exports, \"every\", ()=>(0, _everyJsDefault.default));\nparcelHelpers.export(exports, \"some\", ()=>(0, _someJsDefault.default));\nparcelHelpers.export(exports, \"filter\", ()=>(0, _filterJsDefault.default));\nparcelHelpers.export(exports, \"map\", ()=>(0, _mapJsDefault.default));\nparcelHelpers.export(exports, \"reduce\", ()=>(0, _reduceJsDefault.default));\nparcelHelpers.export(exports, \"reverse\", ()=>(0, _reverseJsDefault.default));\nparcelHelpers.export(exports, \"sort\", ()=>(0, _sortJsDefault.default));\nparcelHelpers.export(exports, \"difference\", ()=>(0, _differenceJsDefault.default));\nparcelHelpers.export(exports, \"disjoint\", ()=>(0, _disjointJsDefault.default));\nparcelHelpers.export(exports, \"intersection\", ()=>(0, _intersectionJsDefault.default));\nparcelHelpers.export(exports, \"subset\", ()=>(0, _subsetJsDefault.default));\nparcelHelpers.export(exports, \"superset\", ()=>(0, _supersetJsDefault.default));\nparcelHelpers.export(exports, \"union\", ()=>(0, _unionJsDefault.default));\nparcelHelpers.export(exports, \"InternMap\", ()=>(0, _internmap.InternMap));\nparcelHelpers.export(exports, \"InternSet\", ()=>(0, _internmap.InternSet));\nvar _bisectJs = require(\"./bisect.js\");\nvar _bisectJsDefault = parcelHelpers.interopDefault(_bisectJs);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nvar _bisectorJs = require(\"./bisector.js\");\nvar _bisectorJsDefault = parcelHelpers.interopDefault(_bisectorJs);\nvar _countJs = require(\"./count.js\");\nvar _countJsDefault = parcelHelpers.interopDefault(_countJs);\nvar _crossJs = require(\"./cross.js\");\nvar _crossJsDefault = parcelHelpers.interopDefault(_crossJs);\nvar _cumsumJs = require(\"./cumsum.js\");\nvar _cumsumJsDefault = parcelHelpers.interopDefault(_cumsumJs);\nvar _descendingJs = require(\"./descending.js\");\nvar _descendingJsDefault = parcelHelpers.interopDefault(_descendingJs);\nvar _deviationJs = require(\"./deviation.js\");\nvar _deviationJsDefault = parcelHelpers.interopDefault(_deviationJs);\nvar _extentJs = require(\"./extent.js\");\nvar _extentJsDefault = parcelHelpers.interopDefault(_extentJs);\nvar _fsumJs = require(\"./fsum.js\");\nvar _groupJs = require(\"./group.js\");\nvar _groupJsDefault = parcelHelpers.interopDefault(_groupJs);\nvar _groupSortJs = require(\"./groupSort.js\");\nvar _groupSortJsDefault = parcelHelpers.interopDefault(_groupSortJs);\nvar _binJs = require(\"./bin.js\");\nvar _binJsDefault = parcelHelpers.interopDefault(_binJs);\nvar _freedmanDiaconisJs = require(\"./threshold/freedmanDiaconis.js\");\nvar _freedmanDiaconisJsDefault = parcelHelpers.interopDefault(_freedmanDiaconisJs);\nvar _scottJs = require(\"./threshold/scott.js\");\nvar _scottJsDefault = parcelHelpers.interopDefault(_scottJs);\nvar _sturgesJs = require(\"./threshold/sturges.js\");\nvar _sturgesJsDefault = parcelHelpers.interopDefault(_sturgesJs);\nvar _maxJs = require(\"./max.js\");\nvar _maxJsDefault = parcelHelpers.interopDefault(_maxJs);\nvar _maxIndexJs = require(\"./maxIndex.js\");\nvar _maxIndexJsDefault = parcelHelpers.interopDefault(_maxIndexJs);\nvar _meanJs = require(\"./mean.js\");\nvar _meanJsDefault = parcelHelpers.interopDefault(_meanJs);\nvar _medianJs = require(\"./median.js\");\nvar _medianJsDefault = parcelHelpers.interopDefault(_medianJs);\nvar _mergeJs = require(\"./merge.js\");\nvar _mergeJsDefault = parcelHelpers.interopDefault(_mergeJs);\nvar _minJs = require(\"./min.js\");\nvar _minJsDefault = parcelHelpers.interopDefault(_minJs);\nvar _minIndexJs = require(\"./minIndex.js\");\nvar _minIndexJsDefault = parcelHelpers.interopDefault(_minIndexJs);\nvar _modeJs = require(\"./mode.js\");\nvar _modeJsDefault = parcelHelpers.interopDefault(_modeJs);\nvar _niceJs = require(\"./nice.js\");\nvar _niceJsDefault = parcelHelpers.interopDefault(_niceJs);\nvar _pairsJs = require(\"./pairs.js\");\nvar _pairsJsDefault = parcelHelpers.interopDefault(_pairsJs);\nvar _permuteJs = require(\"./permute.js\");\nvar _permuteJsDefault = parcelHelpers.interopDefault(_permuteJs);\nvar _quantileJs = require(\"./quantile.js\");\nvar _quantileJsDefault = parcelHelpers.interopDefault(_quantileJs);\nvar _quickselectJs = require(\"./quickselect.js\");\nvar _quickselectJsDefault = parcelHelpers.interopDefault(_quickselectJs);\nvar _rangeJs = require(\"./range.js\");\nvar _rangeJsDefault = parcelHelpers.interopDefault(_rangeJs);\nvar _rankJs = require(\"./rank.js\");\nvar _rankJsDefault = parcelHelpers.interopDefault(_rankJs);\nvar _leastJs = require(\"./least.js\");\nvar _leastJsDefault = parcelHelpers.interopDefault(_leastJs);\nvar _leastIndexJs = require(\"./leastIndex.js\");\nvar _leastIndexJsDefault = parcelHelpers.interopDefault(_leastIndexJs);\nvar _greatestJs = require(\"./greatest.js\");\nvar _greatestJsDefault = parcelHelpers.interopDefault(_greatestJs);\nvar _greatestIndexJs = require(\"./greatestIndex.js\");\nvar _greatestIndexJsDefault = parcelHelpers.interopDefault(_greatestIndexJs);\nvar _scanJs = require(\"./scan.js\");\nvar _scanJsDefault = parcelHelpers.interopDefault(_scanJs);\nvar _shuffleJs = require(\"./shuffle.js\");\nvar _shuffleJsDefault = parcelHelpers.interopDefault(_shuffleJs);\nvar _sumJs = require(\"./sum.js\");\nvar _sumJsDefault = parcelHelpers.interopDefault(_sumJs);\nvar _ticksJs = require(\"./ticks.js\");\nvar _ticksJsDefault = parcelHelpers.interopDefault(_ticksJs);\nvar _transposeJs = require(\"./transpose.js\");\nvar _transposeJsDefault = parcelHelpers.interopDefault(_transposeJs);\nvar _varianceJs = require(\"./variance.js\");\nvar _varianceJsDefault = parcelHelpers.interopDefault(_varianceJs);\nvar _zipJs = require(\"./zip.js\");\nvar _zipJsDefault = parcelHelpers.interopDefault(_zipJs);\nvar _everyJs = require(\"./every.js\");\nvar _everyJsDefault = parcelHelpers.interopDefault(_everyJs);\nvar _someJs = require(\"./some.js\");\nvar _someJsDefault = parcelHelpers.interopDefault(_someJs);\nvar _filterJs = require(\"./filter.js\");\nvar _filterJsDefault = parcelHelpers.interopDefault(_filterJs);\nvar _mapJs = require(\"./map.js\");\nvar _mapJsDefault = parcelHelpers.interopDefault(_mapJs);\nvar _reduceJs = require(\"./reduce.js\");\nvar _reduceJsDefault = parcelHelpers.interopDefault(_reduceJs);\nvar _reverseJs = require(\"./reverse.js\");\nvar _reverseJsDefault = parcelHelpers.interopDefault(_reverseJs);\nvar _sortJs = require(\"./sort.js\");\nvar _sortJsDefault = parcelHelpers.interopDefault(_sortJs);\nvar _differenceJs = require(\"./difference.js\");\nvar _differenceJsDefault = parcelHelpers.interopDefault(_differenceJs);\nvar _disjointJs = require(\"./disjoint.js\");\nvar _disjointJsDefault = parcelHelpers.interopDefault(_disjointJs);\nvar _intersectionJs = require(\"./intersection.js\");\nvar _intersectionJsDefault = parcelHelpers.interopDefault(_intersectionJs);\nvar _subsetJs = require(\"./subset.js\");\nvar _subsetJsDefault = parcelHelpers.interopDefault(_subsetJs);\nvar _supersetJs = require(\"./superset.js\");\nvar _supersetJsDefault = parcelHelpers.interopDefault(_supersetJs);\nvar _unionJs = require(\"./union.js\");\nvar _unionJsDefault = parcelHelpers.interopDefault(_unionJs);\nvar _internmap = require(\"internmap\");\n\n},{\"./bisect.js\":false,\"./ascending.js\":\"gutss\",\"./bisector.js\":\"Z4kVZ\",\"./count.js\":false,\"./cross.js\":false,\"./cumsum.js\":false,\"./descending.js\":false,\"./deviation.js\":false,\"./extent.js\":false,\"./fsum.js\":false,\"./group.js\":false,\"./groupSort.js\":false,\"./bin.js\":false,\"./threshold/freedmanDiaconis.js\":false,\"./threshold/scott.js\":false,\"./threshold/sturges.js\":false,\"./max.js\":false,\"./maxIndex.js\":false,\"./mean.js\":false,\"./median.js\":false,\"./merge.js\":false,\"./min.js\":false,\"./minIndex.js\":false,\"./mode.js\":false,\"./nice.js\":false,\"./pairs.js\":false,\"./permute.js\":false,\"./quantile.js\":false,\"./quickselect.js\":false,\"./range.js\":false,\"./rank.js\":false,\"./least.js\":false,\"./leastIndex.js\":false,\"./greatest.js\":false,\"./greatestIndex.js\":false,\"./scan.js\":false,\"./shuffle.js\":false,\"./sum.js\":false,\"./ticks.js\":false,\"./transpose.js\":false,\"./variance.js\":false,\"./zip.js\":false,\"./every.js\":false,\"./some.js\":false,\"./filter.js\":false,\"./map.js\":false,\"./reduce.js\":false,\"./reverse.js\":false,\"./sort.js\":false,\"./difference.js\":false,\"./disjoint.js\":false,\"./intersection.js\":\"d8mPJ\",\"./subset.js\":false,\"./superset.js\":false,\"./union.js\":\"e3IHr\",\"internmap\":\"13ksD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gutss\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction ascending(a, b) {\n    return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\nexports.default = ascending;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Z4kVZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nfunction bisector(f) {\n    let delta = f;\n    let compare1 = f;\n    let compare2 = f;\n    if (f.length !== 2) {\n        delta = (d, x)=>f(d) - x;\n        compare1 = (0, _ascendingJsDefault.default);\n        compare2 = (d, x)=>(0, _ascendingJsDefault.default)(f(d), x);\n    }\n    function left(a, x, lo = 0, hi = a.length) {\n        if (lo < hi) {\n            if (compare1(x, x) !== 0) return hi;\n            do {\n                const mid = lo + hi >>> 1;\n                if (compare2(a[mid], x) < 0) lo = mid + 1;\n                else hi = mid;\n            }while (lo < hi);\n        }\n        return lo;\n    }\n    function right(a, x, lo = 0, hi = a.length) {\n        if (lo < hi) {\n            if (compare1(x, x) !== 0) return hi;\n            do {\n                const mid = lo + hi >>> 1;\n                if (compare2(a[mid], x) <= 0) lo = mid + 1;\n                else hi = mid;\n            }while (lo < hi);\n        }\n        return lo;\n    }\n    function center(a, x, lo = 0, hi = a.length) {\n        const i = left(a, x, lo, hi - 1);\n        return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n    }\n    return {\n        left,\n        center,\n        right\n    };\n}\nexports.default = bisector;\n\n},{\"./ascending.js\":\"gutss\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d8mPJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _internmap = require(\"internmap\");\nfunction intersection(values, ...others) {\n    values = new (0, _internmap.InternSet)(values);\n    others = others.map(set);\n    out: for (const value of values){\n        for (const other of others)if (!other.has(value)) {\n            values.delete(value);\n            continue out;\n        }\n    }\n    return values;\n}\nexports.default = intersection;\nfunction set(values) {\n    return values instanceof (0, _internmap.InternSet) ? values : new (0, _internmap.InternSet)(values);\n}\n\n},{\"internmap\":\"13ksD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e3IHr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _internmap = require(\"internmap\");\nfunction union(...others) {\n    const set = new (0, _internmap.InternSet)();\n    for (const other of others)for (const o of other)set.add(o);\n    return set;\n}\nexports.default = union;\n\n},{\"internmap\":\"13ksD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"huXGR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ASTNode\", ()=>ASTNode);\nparcelHelpers.export(exports, \"ArrayExpression\", ()=>ArrayExpression);\nparcelHelpers.export(exports, \"BinaryExpression\", ()=>BinaryExpression);\nparcelHelpers.export(exports, \"CallExpression\", ()=>CallExpression);\nparcelHelpers.export(exports, \"ConditionalExpression\", ()=>ConditionalExpression);\nparcelHelpers.export(exports, \"Identifier\", ()=>Identifier);\nparcelHelpers.export(exports, \"Literal\", ()=>Literal);\nparcelHelpers.export(exports, \"LogicalExpression\", ()=>LogicalExpression);\nparcelHelpers.export(exports, \"MemberExpression\", ()=>MemberExpression);\nparcelHelpers.export(exports, \"ObjectExpression\", ()=>ObjectExpression);\nparcelHelpers.export(exports, \"Property\", ()=>Property);\nparcelHelpers.export(exports, \"RawCode\", ()=>RawCode);\nparcelHelpers.export(exports, \"UnaryExpression\", ()=>UnaryExpression);\nparcelHelpers.export(exports, \"codegenExpression\", ()=>codegen);\nparcelHelpers.export(exports, \"constants\", ()=>Constants);\nparcelHelpers.export(exports, \"functions\", ()=>Functions);\nparcelHelpers.export(exports, \"parseExpression\", ()=>parser);\nvar _vegaUtil = require(\"vega-util\");\nconst RawCode = \"RawCode\";\nconst Literal = \"Literal\";\nconst Property = \"Property\";\nconst Identifier = \"Identifier\";\nconst ArrayExpression = \"ArrayExpression\";\nconst BinaryExpression = \"BinaryExpression\";\nconst CallExpression = \"CallExpression\";\nconst ConditionalExpression = \"ConditionalExpression\";\nconst LogicalExpression = \"LogicalExpression\";\nconst MemberExpression = \"MemberExpression\";\nconst ObjectExpression = \"ObjectExpression\";\nconst UnaryExpression = \"UnaryExpression\";\nfunction ASTNode(type) {\n    this.type = type;\n}\nASTNode.prototype.visit = function(visitor) {\n    let c, i, n;\n    if (visitor(this)) return 1;\n    for(c = children(this), i = 0, n = c.length; i < n; ++i){\n        if (c[i].visit(visitor)) return 1;\n    }\n};\nfunction children(node) {\n    switch(node.type){\n        case ArrayExpression:\n            return node.elements;\n        case BinaryExpression:\n        case LogicalExpression:\n            return [\n                node.left,\n                node.right\n            ];\n        case CallExpression:\n            return [\n                node.callee\n            ].concat(node.arguments);\n        case ConditionalExpression:\n            return [\n                node.test,\n                node.consequent,\n                node.alternate\n            ];\n        case MemberExpression:\n            return [\n                node.object,\n                node.property\n            ];\n        case ObjectExpression:\n            return node.properties;\n        case Property:\n            return [\n                node.key,\n                node.value\n            ];\n        case UnaryExpression:\n            return [\n                node.argument\n            ];\n        case Identifier:\n        case Literal:\n        case RawCode:\n        default:\n            return [];\n    }\n}\n/*\n  The following expression parser is based on Esprima (http://esprima.org/).\n  Original header comment and license for Esprima is included here:\n\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/ var TokenName, source, index, length, lookahead;\nvar TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\nTokenName = {};\nTokenName[TokenBooleanLiteral] = \"Boolean\";\nTokenName[TokenEOF] = \"<end>\";\nTokenName[TokenIdentifier] = \"Identifier\";\nTokenName[TokenKeyword] = \"Keyword\";\nTokenName[TokenNullLiteral] = \"Null\";\nTokenName[TokenNumericLiteral] = \"Numeric\";\nTokenName[TokenPunctuator] = \"Punctuator\";\nTokenName[TokenStringLiteral] = \"String\";\nTokenName[TokenRegularExpression] = \"RegularExpression\";\nvar SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\"; // Error messages should be identical to V8.\nvar MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\nvar ILLEGAL = \"ILLEGAL\", DISABLED = \"Disabled.\"; // See also tools/generate-unicode-regex.py.\nvar RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), // eslint-disable-next-line no-misleading-character-class\nRegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"); // Ensure the condition is true, otherwise throw an error.\n// This is only to have a better contract semantic, i.e. another safety net\n// to catch a logic error. The condition shall be fulfilled in normal case.\n// Do NOT use this to enforce a certain condition on any user input.\nfunction assert(condition, message) {\n    /* istanbul ignore next */ if (!condition) throw new Error(\"ASSERT: \" + message);\n}\nfunction isDecimalDigit(ch) {\n    return ch >= 0x30 && ch <= 0x39; // 0..9\n}\nfunction isHexDigit(ch) {\n    return \"0123456789abcdefABCDEF\".indexOf(ch) >= 0;\n}\nfunction isOctalDigit(ch) {\n    return \"01234567\".indexOf(ch) >= 0;\n} // 7.2 White Space\nfunction isWhiteSpace(ch) {\n    return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && [\n        0x1680,\n        0x180E,\n        0x2000,\n        0x2001,\n        0x2002,\n        0x2003,\n        0x2004,\n        0x2005,\n        0x2006,\n        0x2007,\n        0x2008,\n        0x2009,\n        0x200A,\n        0x202F,\n        0x205F,\n        0x3000,\n        0xFEFF\n    ].indexOf(ch) >= 0;\n} // 7.3 Line Terminators\nfunction isLineTerminator(ch) {\n    return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;\n} // 7.6 Identifier Names and Identifiers\nfunction isIdentifierStart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch));\n}\nfunction isIdentifierPart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch >= 0x30 && ch <= 0x39 || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch));\n} // 7.6.1.1 Keywords\nconst keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n};\nfunction skipComment() {\n    while(index < length){\n        const ch = source.charCodeAt(index);\n        if (isWhiteSpace(ch) || isLineTerminator(ch)) ++index;\n        else break;\n    }\n}\nfunction scanHexEscape(prefix) {\n    var i, len, ch, code = 0;\n    len = prefix === \"u\" ? 4 : 2;\n    for(i = 0; i < len; ++i)if (index < length && isHexDigit(source[index])) {\n        ch = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    } else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return String.fromCharCode(code);\n}\nfunction scanUnicodeCodePointEscape() {\n    var ch, code, cu1, cu2;\n    ch = source[index];\n    code = 0; // At least, one hex digit is required.\n    if (ch === \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    while(index < length){\n        ch = source[index++];\n        if (!isHexDigit(ch)) break;\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    }\n    if (code > 0x10FFFF || ch !== \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // UTF-16 Encoding\n    if (code <= 0xFFFF) return String.fromCharCode(code);\n    cu1 = (code - 0x10000 >> 10) + 0xD800;\n    cu2 = (code - 0x10000 & 1023) + 0xDC00;\n    return String.fromCharCode(cu1, cu2);\n}\nfunction getEscapedIdentifier() {\n    var ch, id;\n    ch = source.charCodeAt(index++);\n    id = String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n    if (ch === 0x5C) {\n        if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        ++index;\n        ch = scanHexEscape(\"u\");\n        if (!ch || ch === \"\\\\\" || !isIdentifierStart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        id = ch;\n    }\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (!isIdentifierPart(ch)) break;\n        ++index;\n        id += String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n        if (ch === 0x5C) {\n            id = id.substr(0, id.length - 1);\n            if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            ++index;\n            ch = scanHexEscape(\"u\");\n            if (!ch || ch === \"\\\\\" || !isIdentifierPart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            id += ch;\n        }\n    }\n    return id;\n}\nfunction getIdentifier() {\n    var start, ch;\n    start = index++;\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (ch === 0x5C) {\n            // Blackslash (U+005C) marks Unicode escape sequence.\n            index = start;\n            return getEscapedIdentifier();\n        }\n        if (isIdentifierPart(ch)) ++index;\n        else break;\n    }\n    return source.slice(start, index);\n}\nfunction scanIdentifier() {\n    var start, id, type;\n    start = index; // Backslash (U+005C) starts an escaped character.\n    id = source.charCodeAt(index) === 0x5C ? getEscapedIdentifier() : getIdentifier(); // There is no keyword or literal with only one character.\n    // Thus, it must be an identifier.\n    if (id.length === 1) type = TokenIdentifier;\n    else if (keywords.hasOwnProperty(id)) // eslint-disable-line no-prototype-builtins\n    type = TokenKeyword;\n    else if (id === \"null\") type = TokenNullLiteral;\n    else if (id === \"true\" || id === \"false\") type = TokenBooleanLiteral;\n    else type = TokenIdentifier;\n    return {\n        type: type,\n        value: id,\n        start: start,\n        end: index\n    };\n} // 7.7 Punctuators\nfunction scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch(code){\n        // Check for most common single-character punctuators.\n        case 0x2E:\n        case 0x28:\n        case 0x29:\n        case 0x3B:\n        case 0x2C:\n        case 0x7B:\n        case 0x7D:\n        case 0x5B:\n        case 0x5D:\n        case 0x3A:\n        case 0x3F:\n        case 0x7E:\n            // ~\n            ++index;\n            return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code),\n                start: start,\n                end: index\n            };\n        default:\n            code2 = source.charCodeAt(index + 1); // '=' (U+003D) marks an assignment or comparison operator.\n            if (code2 === 0x3D) switch(code){\n                case 0x2B:\n                case 0x2D:\n                case 0x2F:\n                case 0x3C:\n                case 0x3E:\n                case 0x5E:\n                case 0x7C:\n                case 0x25:\n                case 0x26:\n                case 0x2A:\n                    // *\n                    index += 2;\n                    return {\n                        type: TokenPunctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        start: start,\n                        end: index\n                    };\n                case 0x21:\n                case 0x3D:\n                    // =\n                    index += 2; // !== and ===\n                    if (source.charCodeAt(index) === 0x3D) ++index;\n                    return {\n                        type: TokenPunctuator,\n                        value: source.slice(start, index),\n                        start: start,\n                        end: index\n                    };\n            }\n    } // 4-character punctuator: >>>=\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n        index += 4;\n        return {\n            type: TokenPunctuator,\n            value: ch4,\n            start: start,\n            end: index\n        };\n    } // 3-character punctuators: === !== >>> <<= >>=\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n        index += 3;\n        return {\n            type: TokenPunctuator,\n            value: ch3,\n            start: start,\n            end: index\n        };\n    } // Other 2-character punctuators: ++ -- << >> && ||\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".indexOf(ch1) >= 0 || ch2 === \"=>\") {\n        index += 2;\n        return {\n            type: TokenPunctuator,\n            value: ch2,\n            start: start,\n            end: index\n        };\n    }\n    if (ch2 === \"//\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // 1-character punctuators: < > = ! + - * % & | ^ /\n    if (\"<>=!+-*%&|^/\".indexOf(ch1) >= 0) {\n        ++index;\n        return {\n            type: TokenPunctuator,\n            value: ch1,\n            start: start,\n            end: index\n        };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n} // 7.8.3 Numeric Literals\nfunction scanHexLiteral(start) {\n    let number = \"\";\n    while(index < length){\n        if (!isHexDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (number.length === 0) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(\"0x\" + number, 16),\n        start: start,\n        end: index\n    };\n}\nfunction scanOctalLiteral(start) {\n    let number = \"0\" + source[index++];\n    while(index < length){\n        if (!isOctalDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(number, 8),\n        octal: true,\n        start: start,\n        end: index\n    };\n}\nfunction scanNumericLiteral() {\n    var number, start, ch;\n    ch = source[index];\n    assert(isDecimalDigit(ch.charCodeAt(0)) || ch === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number = \"\";\n    if (ch !== \".\") {\n        number = source[index++];\n        ch = source[index]; // Hex number starts with '0x'.\n        // Octal number starts with '0'.\n        if (number === \"0\") {\n            if (ch === \"x\" || ch === \"X\") {\n                ++index;\n                return scanHexLiteral(start);\n            }\n            if (isOctalDigit(ch)) return scanOctalLiteral(start);\n             // decimal number starts with '0' such as '09' is illegal.\n            if (ch && isDecimalDigit(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        }\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \".\") {\n        number += source[index++];\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \"e\" || ch === \"E\") {\n        number += source[index++];\n        ch = source[index];\n        if (ch === \"+\" || ch === \"-\") number += source[index++];\n        if (isDecimalDigit(source.charCodeAt(index))) while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseFloat(number),\n        start: start,\n        end: index\n    };\n} // 7.8.4 String Literals\nfunction scanStringLiteral() {\n    var str = \"\", quote, start, ch, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while(index < length){\n        ch = source[index++];\n        if (ch === quote) {\n            quote = \"\";\n            break;\n        } else if (ch === \"\\\\\") {\n            ch = source[index++];\n            if (!ch || !isLineTerminator(ch.charCodeAt(0))) switch(ch){\n                case \"u\":\n                case \"x\":\n                    if (source[index] === \"{\") {\n                        ++index;\n                        str += scanUnicodeCodePointEscape();\n                    } else str += scanHexEscape(ch);\n                    break;\n                case \"n\":\n                    str += \"\\n\";\n                    break;\n                case \"r\":\n                    str += \"\\r\";\n                    break;\n                case \"t\":\n                    str += \"\t\";\n                    break;\n                case \"b\":\n                    str += \"\\b\";\n                    break;\n                case \"f\":\n                    str += \"\\f\";\n                    break;\n                case \"v\":\n                    str += \"\\v\";\n                    break;\n                default:\n                    if (isOctalDigit(ch)) {\n                        code = \"01234567\".indexOf(ch); // \\0 is not octal escape sequence\n                        if (code !== 0) octal = true;\n                        if (index < length && isOctalDigit(source[index])) {\n                            octal = true;\n                            code = code * 8 + \"01234567\".indexOf(source[index++]); // 3 digits are only allowed when string starts\n                            // with 0, 1, 2, 3\n                            if (\"0123\".indexOf(ch) >= 0 && index < length && isOctalDigit(source[index])) code = code * 8 + \"01234567\".indexOf(source[index++]);\n                        }\n                        str += String.fromCharCode(code);\n                    } else str += ch;\n                    break;\n            }\n            else if (ch === \"\\r\" && source[index] === \"\\n\") ++index;\n        } else if (isLineTerminator(ch.charCodeAt(0))) break;\n        else str += ch;\n    }\n    if (quote !== \"\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenStringLiteral,\n        value: str,\n        octal: octal,\n        start: start,\n        end: index\n    };\n}\nfunction testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.indexOf(\"u\") >= 0) // Replace each astral symbol and every Unicode code point\n    // escape sequence with a single ASCII symbol to avoid throwing on\n    // regular expressions that are only valid in combination with the\n    // `/u` flag.\n    // Note: replacing with the ASCII symbol `x` might cause false\n    // negatives in unlikely scenarios. For example, `[\\u{61}-b]` is a\n    // perfectly valid pattern that is equivalent to `[a-b]`, but it\n    // would be replaced by `[x-b]` which throws an error.\n    tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1)=>{\n        if (parseInt($1, 16) <= 0x10FFFF) return \"x\";\n        throwError({}, MessageInvalidRegExp);\n    }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n     // First, detect invalid regular expressions.\n    try {\n        new RegExp(tmp);\n    } catch (e) {\n        throwError({}, MessageInvalidRegExp);\n    } // Return a regular expression object for this pattern-flag pair, or\n    // `null` in case the current environment doesn't support the flags it\n    // uses.\n    try {\n        return new RegExp(pattern, flags);\n    } catch (exception) {\n        return null;\n    }\n}\nfunction scanRegExpBody() {\n    var ch, str, classMarker, terminated, body;\n    ch = source[index];\n    assert(ch === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while(index < length){\n        ch = source[index++];\n        str += ch;\n        if (ch === \"\\\\\") {\n            ch = source[index++]; // ECMA-262 7.8.5\n            if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n            str += ch;\n        } else if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n        else if (classMarker) {\n            if (ch === \"]\") classMarker = false;\n        } else {\n            if (ch === \"/\") {\n                terminated = true;\n                break;\n            } else if (ch === \"[\") classMarker = true;\n        }\n    }\n    if (!terminated) throwError({}, MessageUnterminatedRegExp);\n     // Exclude leading and trailing slash.\n    body = str.substr(1, str.length - 2);\n    return {\n        value: body,\n        literal: str\n    };\n}\nfunction scanRegExpFlags() {\n    var ch, str, flags;\n    str = \"\";\n    flags = \"\";\n    while(index < length){\n        ch = source[index];\n        if (!isIdentifierPart(ch.charCodeAt(0))) break;\n        ++index;\n        if (ch === \"\\\\\" && index < length) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        else {\n            flags += ch;\n            str += ch;\n        }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) throwError({}, MessageInvalidRegExp, flags);\n    return {\n        value: flags,\n        literal: str\n    };\n}\nfunction scanRegExp() {\n    var start, body, flags, value;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value = testRegExp(body.value, flags.value);\n    return {\n        literal: body.literal + flags.literal,\n        value: value,\n        regex: {\n            pattern: body.value,\n            flags: flags.value\n        },\n        start: start,\n        end: index\n    };\n}\nfunction isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n}\nfunction advance() {\n    skipComment();\n    if (index >= length) return {\n        type: TokenEOF,\n        start: index,\n        end: index\n    };\n    const ch = source.charCodeAt(index);\n    if (isIdentifierStart(ch)) return scanIdentifier();\n     // Very common: ( and ) and ;\n    if (ch === 0x28 || ch === 0x29 || ch === 0x3B) return scanPunctuator();\n     // String literal starts with single quote (U+0027) or double quote (U+0022).\n    if (ch === 0x27 || ch === 0x22) return scanStringLiteral();\n     // Dot (.) U+002E can also start a floating-point number, hence the need\n    // to check the next character.\n    if (ch === 0x2E) {\n        if (isDecimalDigit(source.charCodeAt(index + 1))) return scanNumericLiteral();\n        return scanPunctuator();\n    }\n    if (isDecimalDigit(ch)) return scanNumericLiteral();\n    return scanPunctuator();\n}\nfunction lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n}\nfunction peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n}\nfunction finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n}\nfunction finishBinaryExpression(operator, left, right) {\n    const node = new ASTNode(operator === \"||\" || operator === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator;\n    node.left = left;\n    node.right = right;\n    return node;\n}\nfunction finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n}\nfunction finishConditionalExpression(test, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n}\nfunction finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n}\nfunction finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n        if (node.raw === \"//\") node.raw = \"/(?:)/\";\n        node.regex = token.regex;\n    }\n    return node;\n}\nfunction finishMemberExpression(accessor, object, property) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor === \"[\";\n    node.object = object;\n    node.property = property;\n    if (!node.computed) property.member = true;\n    return node;\n}\nfunction finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n}\nfunction finishProperty(kind, key, value) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key;\n    node.value = value;\n    node.kind = kind;\n    return node;\n}\nfunction finishUnaryExpression(operator, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n} // Throw an exception\nfunction throwError(token, messageFormat) {\n    var error, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index1)=>{\n        assert(index1 < args.length, \"Message reference must be in range\");\n        return args[index1];\n    });\n    error = new Error(msg);\n    error.index = index;\n    error.description = msg;\n    throw error;\n} // Throw an exception because of the token.\nfunction throwUnexpected(token) {\n    if (token.type === TokenEOF) throwError(token, MessageUnexpectedEOS);\n    if (token.type === TokenNumericLiteral) throwError(token, MessageUnexpectedNumber);\n    if (token.type === TokenStringLiteral) throwError(token, MessageUnexpectedString);\n    if (token.type === TokenIdentifier) throwError(token, MessageUnexpectedIdentifier);\n    if (token.type === TokenKeyword) throwError(token, MessageUnexpectedReserved);\n     // BooleanLiteral, NullLiteral, or Punctuator.\n    throwError(token, MessageUnexpectedToken, token.value);\n} // Expect the next token to match the specified punctuator.\n// If not, an exception will be thrown.\nfunction expect(value) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value) throwUnexpected(token);\n} // Return true if the next token matches the specified punctuator.\nfunction match(value) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value;\n} // Return true if the next token matches the specified keyword\nfunction matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n} // 11.1.4 Array Initialiser\nfunction parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while(!match(\"]\"))if (match(\",\")) {\n        lex();\n        elements.push(null);\n    } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) expect(\",\");\n    }\n    lex();\n    return finishArrayExpression(elements);\n} // 11.1.5 Object Initialiser\nfunction parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex(); // Note: This function is called only from parseObjectProperty(), where\n    // EOF and Punctuator tokens are already filtered out.\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n        if (token.octal) throwError(token, MessageStrictOctalLiteral);\n        return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n}\nfunction parseObjectProperty() {\n    var token, key, id, value;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n        id = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", id, value);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) throwUnexpected(token);\n    else {\n        key = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", key, value);\n    }\n}\nfunction parseObjectInitialiser() {\n    var properties = [], property, name, key, map = {}, toString = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while(!match(\"}\")){\n        property = parseObjectProperty();\n        if (property.key.type === SyntaxIdentifier) name = property.key.name;\n        else name = toString(property.key.value);\n        key = \"$\" + name;\n        if (Object.prototype.hasOwnProperty.call(map, key)) throwError({}, MessageStrictDuplicateProperty);\n        else map[key] = true;\n        properties.push(property);\n        if (!match(\"}\")) expect(\",\");\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n} // 11.1.6 The Grouping Operator\nfunction parseGroupExpression() {\n    expect(\"(\");\n    const expr = parseExpression();\n    expect(\")\");\n    return expr;\n} // 11.1 Primary Expressions\nconst legalKeywords = {\n    \"if\": 1\n};\nfunction parsePrimaryExpression() {\n    var type, token, expr;\n    if (match(\"(\")) return parseGroupExpression();\n    if (match(\"[\")) return parseArrayInitialiser();\n    if (match(\"{\")) return parseObjectInitialiser();\n    type = lookahead.type;\n    index = lookahead.start;\n    if (type === TokenIdentifier || legalKeywords[lookahead.value]) expr = finishIdentifier(lex().value);\n    else if (type === TokenStringLiteral || type === TokenNumericLiteral) {\n        if (lookahead.octal) throwError(lookahead, MessageStrictOctalLiteral);\n        expr = finishLiteral(lex());\n    } else if (type === TokenKeyword) throw new Error(DISABLED);\n    else if (type === TokenBooleanLiteral) {\n        token = lex();\n        token.value = token.value === \"true\";\n        expr = finishLiteral(token);\n    } else if (type === TokenNullLiteral) {\n        token = lex();\n        token.value = null;\n        expr = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n        expr = finishLiteral(scanRegExp());\n        peek();\n    } else throwUnexpected(lex());\n    return expr;\n} // 11.2 Left-Hand-Side Expressions\nfunction parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) while(index < length){\n        args.push(parseConditionalExpression());\n        if (match(\")\")) break;\n        expect(\",\");\n    }\n    expect(\")\");\n    return args;\n}\nfunction parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) throwUnexpected(token);\n    return finishIdentifier(token.value);\n}\nfunction parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n}\nfunction parseComputedMember() {\n    expect(\"[\");\n    const expr = parseExpression();\n    expect(\"]\");\n    return expr;\n}\nfunction parseLeftHandSideExpressionAllowCall() {\n    var expr, args, property;\n    expr = parsePrimaryExpression();\n    for(;;){\n        if (match(\".\")) {\n            property = parseNonComputedMember();\n            expr = finishMemberExpression(\".\", expr, property);\n        } else if (match(\"(\")) {\n            args = parseArguments();\n            expr = finishCallExpression(expr, args);\n        } else if (match(\"[\")) {\n            property = parseComputedMember();\n            expr = finishMemberExpression(\"[\", expr, property);\n        } else break;\n    }\n    return expr;\n} // 11.3 Postfix Expressions\nfunction parsePostfixExpression() {\n    const expr = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n        if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    }\n    return expr;\n} // 11.4 Unary Operators\nfunction parseUnaryExpression() {\n    var token, expr;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) expr = parsePostfixExpression();\n    else if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n        token = lex();\n        expr = parseUnaryExpression();\n        expr = finishUnaryExpression(token.value, expr);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) throw new Error(DISABLED);\n    else expr = parsePostfixExpression();\n    return expr;\n}\nfunction binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) return 0;\n    switch(token.value){\n        case \"||\":\n            prec = 1;\n            break;\n        case \"&&\":\n            prec = 2;\n            break;\n        case \"|\":\n            prec = 3;\n            break;\n        case \"^\":\n            prec = 4;\n            break;\n        case \"&\":\n            prec = 5;\n            break;\n        case \"==\":\n        case \"!=\":\n        case \"===\":\n        case \"!==\":\n            prec = 6;\n            break;\n        case \"<\":\n        case \">\":\n        case \"<=\":\n        case \">=\":\n        case \"instanceof\":\n        case \"in\":\n            prec = 7;\n            break;\n        case \"<<\":\n        case \">>\":\n        case \">>>\":\n            prec = 8;\n            break;\n        case \"+\":\n        case \"-\":\n            prec = 9;\n            break;\n        case \"*\":\n        case \"/\":\n        case \"%\":\n            prec = 11;\n            break;\n    }\n    return prec;\n} // 11.5 Multiplicative Operators\n// 11.6 Additive Operators\n// 11.7 Bitwise Shift Operators\n// 11.8 Relational Operators\n// 11.9 Equality Operators\n// 11.10 Binary Bitwise Operators\n// 11.11 Binary Logical Operators\nfunction parseBinaryExpression() {\n    var marker, markers, expr, token, prec, stack, right, operator, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) return left;\n    token.prec = prec;\n    lex();\n    markers = [\n        marker,\n        lookahead\n    ];\n    right = parseUnaryExpression();\n    stack = [\n        left,\n        token,\n        right\n    ];\n    while((prec = binaryPrecedence(lookahead)) > 0){\n        // Reduce: make a binary expression from the three topmost entries.\n        while(stack.length > 2 && prec <= stack[stack.length - 2].prec){\n            right = stack.pop();\n            operator = stack.pop().value;\n            left = stack.pop();\n            markers.pop();\n            expr = finishBinaryExpression(operator, left, right);\n            stack.push(expr);\n        } // Shift.\n        token = lex();\n        token.prec = prec;\n        stack.push(token);\n        markers.push(lookahead);\n        expr = parseUnaryExpression();\n        stack.push(expr);\n    } // Final reduce to clean-up the stack.\n    i = stack.length - 1;\n    expr = stack[i];\n    markers.pop();\n    while(i > 1){\n        markers.pop();\n        expr = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n        i -= 2;\n    }\n    return expr;\n} // 11.12 Conditional Operator\nfunction parseConditionalExpression() {\n    var expr, consequent, alternate;\n    expr = parseBinaryExpression();\n    if (match(\"?\")) {\n        lex();\n        consequent = parseConditionalExpression();\n        expect(\":\");\n        alternate = parseConditionalExpression();\n        expr = finishConditionalExpression(expr, consequent, alternate);\n    }\n    return expr;\n} // 11.14 Comma Operator\nfunction parseExpression() {\n    const expr = parseConditionalExpression();\n    if (match(\",\")) throw new Error(DISABLED); // no sequence expressions\n    return expr;\n}\nfunction parser(code) {\n    source = code;\n    index = 0;\n    length = source.length;\n    lookahead = null;\n    peek();\n    const expr = parseExpression();\n    if (lookahead.type !== TokenEOF) throw new Error(\"Unexpect token after expression.\");\n    return expr;\n}\nvar Constants = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n};\nfunction Functions(codegen1) {\n    function fncall(name, args, cast, type) {\n        let obj = codegen1(args[0]);\n        if (cast) {\n            obj = cast + \"(\" + obj + \")\";\n            if (cast.lastIndexOf(\"new \", 0) === 0) obj = \"(\" + obj + \")\";\n        }\n        return obj + \".\" + name + (type < 0 ? \"\" : type === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen1).join(\",\") + \")\");\n    }\n    function fn(name, cast, type) {\n        return (args)=>fncall(name, args, cast, type);\n    }\n    const DATE = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n        // MATH functions\n        isNaN: \"Number.isNaN\",\n        isFinite: \"Number.isFinite\",\n        abs: \"Math.abs\",\n        acos: \"Math.acos\",\n        asin: \"Math.asin\",\n        atan: \"Math.atan\",\n        atan2: \"Math.atan2\",\n        ceil: \"Math.ceil\",\n        cos: \"Math.cos\",\n        exp: \"Math.exp\",\n        floor: \"Math.floor\",\n        log: \"Math.log\",\n        max: \"Math.max\",\n        min: \"Math.min\",\n        pow: \"Math.pow\",\n        random: \"Math.random\",\n        round: \"Math.round\",\n        sin: \"Math.sin\",\n        sqrt: \"Math.sqrt\",\n        tan: \"Math.tan\",\n        clamp: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to clamp function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to clamp function.\");\n            const a = args.map(codegen1);\n            return \"Math.max(\" + a[1] + \", Math.min(\" + a[2] + \",\" + a[0] + \"))\";\n        },\n        // DATE functions\n        now: \"Date.now\",\n        utc: \"Date.UTC\",\n        datetime: DATE,\n        date: fn(\"getDate\", DATE, 0),\n        day: fn(\"getDay\", DATE, 0),\n        year: fn(\"getFullYear\", DATE, 0),\n        month: fn(\"getMonth\", DATE, 0),\n        hours: fn(\"getHours\", DATE, 0),\n        minutes: fn(\"getMinutes\", DATE, 0),\n        seconds: fn(\"getSeconds\", DATE, 0),\n        milliseconds: fn(\"getMilliseconds\", DATE, 0),\n        time: fn(\"getTime\", DATE, 0),\n        timezoneoffset: fn(\"getTimezoneOffset\", DATE, 0),\n        utcdate: fn(\"getUTCDate\", DATE, 0),\n        utcday: fn(\"getUTCDay\", DATE, 0),\n        utcyear: fn(\"getUTCFullYear\", DATE, 0),\n        utcmonth: fn(\"getUTCMonth\", DATE, 0),\n        utchours: fn(\"getUTCHours\", DATE, 0),\n        utcminutes: fn(\"getUTCMinutes\", DATE, 0),\n        utcseconds: fn(\"getUTCSeconds\", DATE, 0),\n        utcmilliseconds: fn(\"getUTCMilliseconds\", DATE, 0),\n        // sequence functions\n        length: fn(\"length\", null, -1),\n        // STRING functions\n        parseFloat: \"parseFloat\",\n        parseInt: \"parseInt\",\n        upper: fn(\"toUpperCase\", STRING, 0),\n        lower: fn(\"toLowerCase\", STRING, 0),\n        substring: fn(\"substring\", STRING),\n        split: fn(\"split\", STRING),\n        trim: fn(\"trim\", STRING, 0),\n        // REGEXP functions\n        regexp: REGEXP,\n        test: fn(\"test\", REGEXP),\n        // Control Flow functions\n        if: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to if function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to if function.\");\n            const a = args.map(codegen1);\n            return \"(\" + a[0] + \"?\" + a[1] + \":\" + a[2] + \")\";\n        }\n    };\n}\nfunction stripQuotes(s) {\n    const n = s && s.length - 1;\n    return n && (s[0] === '\"' && s[n] === '\"' || s[0] === \"'\" && s[n] === \"'\") ? s.slice(1, -1) : s;\n}\nfunction codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? (0, _vegaUtil.toSet)(opt.allowed) : {}, forbidden = opt.forbidden ? (0, _vegaUtil.toSet)(opt.forbidden) : {}, constants = opt.constants || Constants, functions = (opt.functions || Functions)(visit), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = (0, _vegaUtil.isFunction)(globalvar) ? globalvar : (id)=>`${globalvar}[\"${id}\"]`;\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit(ast) {\n        if ((0, _vegaUtil.isString)(ast)) return ast;\n        const generator = Generators[ast.type];\n        if (generator == null) (0, _vegaUtil.error)(\"Unsupported type: \" + ast.type);\n        return generator(ast);\n    }\n    const Generators = {\n        Literal: (n)=>n.raw,\n        Identifier: (n)=>{\n            const id = n.name;\n            if (memberDepth > 0) return id;\n            else if ((0, _vegaUtil.hasOwnProperty)(forbidden, id)) return (0, _vegaUtil.error)(\"Illegal identifier: \" + id);\n            else if ((0, _vegaUtil.hasOwnProperty)(constants, id)) return constants[id];\n            else if ((0, _vegaUtil.hasOwnProperty)(allowed, id)) return id;\n            else {\n                globals[id] = 1;\n                return outputGlobal(id);\n            }\n        },\n        MemberExpression: (n)=>{\n            const d = !n.computed, o = visit(n.object);\n            if (d) memberDepth += 1;\n            const p = visit(n.property);\n            if (o === fieldvar) // strip quotes to sanitize field name (#1653)\n            fields[stripQuotes(p)] = 1;\n            if (d) memberDepth -= 1;\n            return o + (d ? \".\" + p : \"[\" + p + \"]\");\n        },\n        CallExpression: (n)=>{\n            if (n.callee.type !== \"Identifier\") (0, _vegaUtil.error)(\"Illegal callee type: \" + n.callee.type);\n            const callee = n.callee.name, args = n.arguments, fn = (0, _vegaUtil.hasOwnProperty)(functions, callee) && functions[callee];\n            if (!fn) (0, _vegaUtil.error)(\"Unrecognized function: \" + callee);\n            return (0, _vegaUtil.isFunction)(fn) ? fn(args) : fn + \"(\" + args.map(visit).join(\",\") + \")\";\n        },\n        ArrayExpression: (n)=>\"[\" + n.elements.map(visit).join(\",\") + \"]\",\n        BinaryExpression: (n)=>\"(\" + visit(n.left) + \" \" + n.operator + \" \" + visit(n.right) + \")\",\n        UnaryExpression: (n)=>\"(\" + n.operator + visit(n.argument) + \")\",\n        ConditionalExpression: (n)=>\"(\" + visit(n.test) + \"?\" + visit(n.consequent) + \":\" + visit(n.alternate) + \")\",\n        LogicalExpression: (n)=>\"(\" + visit(n.left) + n.operator + visit(n.right) + \")\",\n        ObjectExpression: (n)=>\"{\" + n.properties.map(visit).join(\",\") + \"}\",\n        Property: (n)=>{\n            memberDepth += 1;\n            const k = visit(n.key);\n            memberDepth -= 1;\n            return k + \":\" + visit(n.value);\n        }\n    };\n    function codegen2(ast) {\n        const result = {\n            code: visit(ast),\n            globals: Object.keys(globals),\n            fields: Object.keys(fields)\n        };\n        globals = {};\n        fields = {};\n        return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants;\n    return codegen2;\n}\n\n},{\"vega-util\":\"dPFAY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"37uhx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"context\", ()=>context);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaDataflow = require(\"vega-dataflow\");\n/**\n * Parse a serialized dataflow specification.\n */ function parse(spec) {\n    const ctx = this, operators = spec.operators || []; // parse background\n    if (spec.background) ctx.background = spec.background;\n     // parse event configuration\n    if (spec.eventConfig) ctx.eventConfig = spec.eventConfig;\n     // parse locale configuration\n    if (spec.locale) ctx.locale = spec.locale;\n     // parse operators\n    operators.forEach((entry)=>ctx.parseOperator(entry)); // parse operator parameters\n    operators.forEach((entry)=>ctx.parseOperatorParameters(entry)); // parse streams\n    (spec.streams || []).forEach((entry)=>ctx.parseStream(entry)); // parse updates\n    (spec.updates || []).forEach((entry)=>ctx.parseUpdate(entry));\n    return ctx.resolve();\n}\nconst Skip = (0, _vegaUtil.toSet)([\n    \"rule\"\n]), Swap = (0, _vegaUtil.toSet)([\n    \"group\",\n    \"image\",\n    \"rect\"\n]);\nfunction adjustSpatial(encode, marktype) {\n    let code = \"\";\n    if (Skip[marktype]) return code;\n    if (encode.x2) {\n        if (encode.x) {\n            if (Swap[marktype]) code += \"if(o.x>o.x2)$=o.x,o.x=o.x2,o.x2=$;\";\n            code += \"o.width=o.x2-o.x;\";\n        } else code += \"o.x=o.x2-(o.width||0);\";\n    }\n    if (encode.xc) code += \"o.x=o.xc-(o.width||0)/2;\";\n    if (encode.y2) {\n        if (encode.y) {\n            if (Swap[marktype]) code += \"if(o.y>o.y2)$=o.y,o.y=o.y2,o.y2=$;\";\n            code += \"o.height=o.y2-o.y;\";\n        } else code += \"o.y=o.y2-(o.height||0);\";\n    }\n    if (encode.yc) code += \"o.y=o.yc-(o.height||0)/2;\";\n    return code;\n}\nfunction canonicalType(type) {\n    return (type + \"\").toLowerCase();\n}\nfunction isOperator(type) {\n    return canonicalType(type) === \"operator\";\n}\nfunction isCollect(type) {\n    return canonicalType(type) === \"collect\";\n}\nfunction expression(ctx, args, code) {\n    // wrap code in return statement if expression does not terminate\n    if (code[code.length - 1] !== \";\") code = \"return(\" + code + \");\";\n    const fn = Function(...args.concat(code));\n    return ctx && ctx.functions ? fn.bind(ctx.functions) : fn;\n} // generate code for comparing a single field\nfunction _compare(u, v, lt, gt) {\n    return \"((u = \".concat(u, \") < (v = \").concat(v, \") || u == null) && v != null ? \").concat(lt, \"\\n  : (u > v || v == null) && u != null ? \").concat(gt, \"\\n  : ((v = v instanceof Date ? +v : v), (u = u instanceof Date ? +u : u)) !== u && v === v ? \").concat(lt, \"\\n  : v !== v && u === u ? \").concat(gt, \" : \");\n}\nvar expressionCodegen = {\n    /**\n   * Parse an expression used to update an operator value.\n   */ operator: (ctx, expr)=>expression(ctx, [\n            \"_\"\n        ], expr.code),\n    /**\n   * Parse an expression provided as an operator parameter value.\n   */ parameter: (ctx, expr)=>expression(ctx, [\n            \"datum\",\n            \"_\"\n        ], expr.code),\n    /**\n   * Parse an expression applied to an event stream.\n   */ event: (ctx, expr)=>expression(ctx, [\n            \"event\"\n        ], expr.code),\n    /**\n   * Parse an expression used to handle an event-driven operator update.\n   */ handler: (ctx, expr)=>{\n        const code = \"var datum=event.item&&event.item.datum;return \".concat(expr.code, \";\");\n        return expression(ctx, [\n            \"_\",\n            \"event\"\n        ], code);\n    },\n    /**\n   * Parse an expression that performs visual encoding.\n   */ encode: (ctx, encode)=>{\n        const { marktype , channels  } = encode;\n        let code = \"var o=item,datum=o.datum,m=0,$;\";\n        for(const name in channels){\n            const o = \"o[\" + (0, _vegaUtil.stringValue)(name) + \"]\";\n            code += \"$=\".concat(channels[name].code, \";if(\").concat(o, \"!==$)\").concat(o, \"=$,m=1;\");\n        }\n        code += adjustSpatial(channels, marktype);\n        code += \"return m;\";\n        return expression(ctx, [\n            \"item\",\n            \"_\"\n        ], code);\n    },\n    /**\n   * Optimized code generators for access and comparison.\n   */ codegen: {\n        get (path) {\n            const ref = \"[\".concat(path.map((0, _vegaUtil.stringValue)).join(\"][\"), \"]\");\n            const get = Function(\"_\", \"return _\".concat(ref, \";\"));\n            get.path = ref;\n            return get;\n        },\n        comparator (fields, orders) {\n            let t;\n            const map = (f, i)=>{\n                const o = orders[i];\n                let u, v;\n                if (f.path) {\n                    u = \"a\".concat(f.path);\n                    v = \"b\".concat(f.path);\n                } else {\n                    (t = t || {})[\"f\" + i] = f;\n                    u = \"this.f\".concat(i, \"(a)\");\n                    v = \"this.f\".concat(i, \"(b)\");\n                }\n                return _compare(u, v, -o, o);\n            };\n            const fn = Function(\"a\", \"b\", \"var u, v; return \" + fields.map(map).join(\"\") + \"0;\");\n            return t ? fn.bind(t) : fn;\n        }\n    }\n};\n/**\n * Parse a dataflow operator.\n */ function parseOperator(spec) {\n    const ctx = this;\n    if (isOperator(spec.type) || !spec.type) ctx.operator(spec, spec.update ? ctx.operatorExpression(spec.update) : null);\n    else ctx.transform(spec, spec.type);\n}\n/**\n * Parse and assign operator parameters.\n */ function parseOperatorParameters(spec) {\n    const ctx = this;\n    if (spec.params) {\n        const op = ctx.get(spec.id);\n        if (!op) (0, _vegaUtil.error)(\"Invalid operator id: \" + spec.id);\n        ctx.dataflow.connect(op, op.parameters(ctx.parseParameters(spec.params), spec.react, spec.initonly));\n    }\n}\n/**\n * Parse a set of operator parameters.\n */ function parseParameters(spec, params) {\n    params = params || {};\n    const ctx = this;\n    for(const key in spec){\n        const value = spec[key];\n        params[key] = (0, _vegaUtil.isArray)(value) ? value.map((v)=>parseParameter(v, ctx, params)) : parseParameter(value, ctx, params);\n    }\n    return params;\n}\n/**\n * Parse a single parameter.\n */ function parseParameter(spec, ctx, params) {\n    if (!spec || !(0, _vegaUtil.isObject)(spec)) return spec;\n    for(let i = 0, n = PARSERS.length, p; i < n; ++i){\n        p = PARSERS[i];\n        if ((0, _vegaUtil.hasOwnProperty)(spec, p.key)) return p.parse(spec, ctx, params);\n    }\n    return spec;\n}\n/** Reference parsers. */ var PARSERS = [\n    {\n        key: \"$ref\",\n        parse: getOperator\n    },\n    {\n        key: \"$key\",\n        parse: getKey\n    },\n    {\n        key: \"$expr\",\n        parse: getExpression\n    },\n    {\n        key: \"$field\",\n        parse: getField\n    },\n    {\n        key: \"$encode\",\n        parse: getEncode\n    },\n    {\n        key: \"$compare\",\n        parse: getCompare\n    },\n    {\n        key: \"$context\",\n        parse: getContext\n    },\n    {\n        key: \"$subflow\",\n        parse: getSubflow\n    },\n    {\n        key: \"$tupleid\",\n        parse: getTupleId\n    }\n];\n/**\n * Resolve an operator reference.\n */ function getOperator(_, ctx) {\n    return ctx.get(_.$ref) || (0, _vegaUtil.error)(\"Operator not defined: \" + _.$ref);\n}\n/**\n * Resolve an expression reference.\n */ function getExpression(_, ctx, params) {\n    if (_.$params) // parse expression parameters\n    ctx.parseParameters(_.$params, params);\n    const k = \"e:\" + _.$expr.code + \"_\" + _.$name;\n    return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.accessor)(ctx.parameterExpression(_.$expr), _.$fields, _.$name));\n}\n/**\n * Resolve a key accessor reference.\n */ function getKey(_, ctx) {\n    const k = \"k:\" + _.$key + \"_\" + !!_.$flat;\n    return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.key)(_.$key, _.$flat, ctx.expr.codegen));\n}\n/**\n * Resolve a field accessor reference.\n */ function getField(_, ctx) {\n    if (!_.$field) return null;\n    const k = \"f:\" + _.$field + \"_\" + _.$name;\n    return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.field)(_.$field, _.$name, ctx.expr.codegen));\n}\n/**\n * Resolve a comparator function reference.\n */ function getCompare(_1, ctx) {\n    // As of Vega 5.5.3, $tupleid sort is no longer used.\n    // Keep here for now for backwards compatibility.\n    const k = \"c:\" + _1.$compare + \"_\" + _1.$order, c = (0, _vegaUtil.array)(_1.$compare).map((_)=>_ && _.$tupleid ? (0, _vegaDataflow.tupleid) : _);\n    return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.compare)(c, _1.$order, ctx.expr.codegen));\n}\n/**\n * Resolve an encode operator reference.\n */ function getEncode(_, ctx) {\n    const spec = _.$encode, encode = {};\n    for(const name in spec){\n        const enc = spec[name];\n        encode[name] = (0, _vegaUtil.accessor)(ctx.encodeExpression(enc.$expr), enc.$fields);\n        encode[name].output = enc.$output;\n    }\n    return encode;\n}\n/**\n * Resolve a context reference.\n */ function getContext(_, ctx) {\n    return ctx;\n}\n/**\n * Resolve a recursive subflow specification.\n */ function getSubflow(_, ctx) {\n    const spec = _.$subflow;\n    return function(dataflow, key, parent) {\n        const subctx = ctx.fork().parse(spec), op = subctx.get(spec.operators[0].id), p = subctx.signals.parent;\n        if (p) p.set(parent);\n        op.detachSubflow = ()=>ctx.detach(subctx);\n        return op;\n    };\n}\n/**\n * Resolve a tuple id reference.\n */ function getTupleId() {\n    return 0, _vegaDataflow.tupleid;\n}\n/**\n * Parse an event stream specification.\n */ function parseStream(spec) {\n    var ctx = this, filter = spec.filter != null ? ctx.eventExpression(spec.filter) : undefined, stream = spec.stream != null ? ctx.get(spec.stream) : undefined, args;\n    if (spec.source) stream = ctx.events(spec.source, spec.type, filter);\n    else if (spec.merge) {\n        args = spec.merge.map((_)=>ctx.get(_));\n        stream = args[0].merge.apply(args[0], args.slice(1));\n    }\n    if (spec.between) {\n        args = spec.between.map((_)=>ctx.get(_));\n        stream = stream.between(args[0], args[1]);\n    }\n    if (spec.filter) stream = stream.filter(filter);\n    if (spec.throttle != null) stream = stream.throttle(+spec.throttle);\n    if (spec.debounce != null) stream = stream.debounce(+spec.debounce);\n    if (stream == null) (0, _vegaUtil.error)(\"Invalid stream definition: \" + JSON.stringify(spec));\n    if (spec.consume) stream.consume(true);\n    ctx.stream(spec, stream);\n}\n/**\n * Parse an event-driven operator update.\n */ function parseUpdate(spec) {\n    var ctx = this, srcid = (0, _vegaUtil.isObject)(srcid = spec.source) ? srcid.$ref : srcid, source = ctx.get(srcid), target = null, update = spec.update, params = undefined;\n    if (!source) (0, _vegaUtil.error)(\"Source not defined: \" + spec.source);\n    target = spec.target && spec.target.$expr ? ctx.eventExpression(spec.target.$expr) : ctx.get(spec.target);\n    if (update && update.$expr) {\n        if (update.$params) params = ctx.parseParameters(update.$params);\n        update = ctx.handlerExpression(update.$expr);\n    }\n    ctx.update(spec, source, target, update, params);\n}\nconst SKIP = {\n    skip: true\n};\nfunction getState(options) {\n    var ctx1 = this, state = {};\n    if (options.signals) {\n        var signals = state.signals = {};\n        Object.keys(ctx1.signals).forEach((key)=>{\n            const op = ctx1.signals[key];\n            if (options.signals(key, op)) signals[key] = op.value;\n        });\n    }\n    if (options.data) {\n        var data = state.data = {};\n        Object.keys(ctx1.data).forEach((key)=>{\n            const dataset = ctx1.data[key];\n            if (options.data(key, dataset)) data[key] = dataset.input.value;\n        });\n    }\n    if (ctx1.subcontext && options.recurse !== false) state.subcontext = ctx1.subcontext.map((ctx)=>ctx.getState(options));\n    return state;\n}\nfunction setState(state) {\n    var ctx = this, df = ctx.dataflow, data = state.data, signals = state.signals;\n    Object.keys(signals || {}).forEach((key)=>{\n        df.update(ctx.signals[key], signals[key], SKIP);\n    });\n    Object.keys(data || {}).forEach((key)=>{\n        df.pulse(ctx.data[key].input, df.changeset().remove((0, _vegaUtil.truthy)).insert(data[key]));\n    });\n    (state.subcontext || []).forEach((substate, i)=>{\n        const subctx = ctx.subcontext[i];\n        if (subctx) subctx.setState(substate);\n    });\n}\n/**\n * Context objects store the current parse state.\n * Enables lookup of parsed operators, event streams, accessors, etc.\n * Provides a 'fork' method for creating child contexts for subflows.\n */ function context(df, transforms, functions, expr) {\n    return new Context(df, transforms, functions, expr);\n}\nfunction Context(df, transforms, functions, expr) {\n    this.dataflow = df;\n    this.transforms = transforms;\n    this.events = df.events.bind(df);\n    this.expr = expr || expressionCodegen, this.signals = {};\n    this.scales = {};\n    this.nodes = {};\n    this.data = {};\n    this.fn = {};\n    if (functions) {\n        this.functions = Object.create(functions);\n        this.functions.context = this;\n    }\n}\nfunction Subcontext(ctx) {\n    this.dataflow = ctx.dataflow;\n    this.transforms = ctx.transforms;\n    this.events = ctx.events;\n    this.expr = ctx.expr;\n    this.signals = Object.create(ctx.signals);\n    this.scales = Object.create(ctx.scales);\n    this.nodes = Object.create(ctx.nodes);\n    this.data = Object.create(ctx.data);\n    this.fn = Object.create(ctx.fn);\n    if (ctx.functions) {\n        this.functions = Object.create(ctx.functions);\n        this.functions.context = this;\n    }\n}\nContext.prototype = Subcontext.prototype = {\n    fork () {\n        const ctx = new Subcontext(this);\n        (this.subcontext || (this.subcontext = [])).push(ctx);\n        return ctx;\n    },\n    detach (ctx) {\n        this.subcontext = this.subcontext.filter((c)=>c !== ctx); // disconnect all nodes in the subcontext\n        // wipe out targets first for better efficiency\n        const keys = Object.keys(ctx.nodes);\n        for (const key of keys)ctx.nodes[key]._targets = null;\n        for (const key1 of keys)ctx.nodes[key1].detach();\n        ctx.nodes = null;\n    },\n    get (id) {\n        return this.nodes[id];\n    },\n    set (id, node) {\n        return this.nodes[id] = node;\n    },\n    add (spec, op) {\n        const ctx = this, df = ctx.dataflow, data = spec.value;\n        ctx.set(spec.id, op);\n        if (isCollect(spec.type) && data) {\n            if (data.$ingest) df.ingest(op, data.$ingest, data.$format);\n            else if (data.$request) df.preload(op, data.$request, data.$format);\n            else df.pulse(op, df.changeset().insert(data));\n        }\n        if (spec.root) ctx.root = op;\n        if (spec.parent) {\n            let p = ctx.get(spec.parent.$ref);\n            if (p) {\n                df.connect(p, [\n                    op\n                ]);\n                op.targets().add(p);\n            } else (ctx.unresolved = ctx.unresolved || []).push(()=>{\n                p = ctx.get(spec.parent.$ref);\n                df.connect(p, [\n                    op\n                ]);\n                op.targets().add(p);\n            });\n        }\n        if (spec.signal) ctx.signals[spec.signal] = op;\n        if (spec.scale) ctx.scales[spec.scale] = op;\n        if (spec.data) for(const name in spec.data){\n            const data = ctx.data[name] || (ctx.data[name] = {});\n            spec.data[name].forEach((role)=>data[role] = op);\n        }\n    },\n    resolve () {\n        (this.unresolved || []).forEach((fn)=>fn());\n        delete this.unresolved;\n        return this;\n    },\n    operator (spec, update) {\n        this.add(spec, this.dataflow.add(spec.value, update));\n    },\n    transform (spec, type) {\n        this.add(spec, this.dataflow.add(this.transforms[canonicalType(type)]));\n    },\n    stream (spec, stream) {\n        this.set(spec.id, stream);\n    },\n    update (spec, stream, target, update, params) {\n        this.dataflow.on(stream, target, update, params, spec.options);\n    },\n    // expression parsing\n    operatorExpression (expr) {\n        return this.expr.operator(this, expr);\n    },\n    parameterExpression (expr) {\n        return this.expr.parameter(this, expr);\n    },\n    eventExpression (expr) {\n        return this.expr.event(this, expr);\n    },\n    handlerExpression (expr) {\n        return this.expr.handler(this, expr);\n    },\n    encodeExpression (encode) {\n        return this.expr.encode(this, encode);\n    },\n    // parse methods\n    parse,\n    parseOperator,\n    parseOperatorParameters,\n    parseParameters,\n    parseStream,\n    parseUpdate,\n    // state methods\n    getState,\n    setState\n};\n\n},{\"vega-util\":\"dPFAY\",\"vega-dataflow\":\"4kvYg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"irqWQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AxisDomainRole\", ()=>AxisDomainRole);\nparcelHelpers.export(exports, \"AxisGridRole\", ()=>AxisGridRole);\nparcelHelpers.export(exports, \"AxisLabelRole\", ()=>AxisLabelRole);\nparcelHelpers.export(exports, \"AxisRole\", ()=>AxisRole);\nparcelHelpers.export(exports, \"AxisTickRole\", ()=>AxisTickRole);\nparcelHelpers.export(exports, \"AxisTitleRole\", ()=>AxisTitleRole);\nparcelHelpers.export(exports, \"DataScope\", ()=>DataScope);\nparcelHelpers.export(exports, \"FrameRole\", ()=>FrameRole);\nparcelHelpers.export(exports, \"LegendEntryRole\", ()=>LegendEntryRole);\nparcelHelpers.export(exports, \"LegendLabelRole\", ()=>LegendLabelRole);\nparcelHelpers.export(exports, \"LegendRole\", ()=>LegendRole);\nparcelHelpers.export(exports, \"LegendSymbolRole\", ()=>LegendSymbolRole);\nparcelHelpers.export(exports, \"LegendTitleRole\", ()=>LegendTitleRole);\nparcelHelpers.export(exports, \"MarkRole\", ()=>MarkRole);\nparcelHelpers.export(exports, \"Scope\", ()=>Scope);\nparcelHelpers.export(exports, \"ScopeRole\", ()=>ScopeRole);\nparcelHelpers.export(exports, \"config\", ()=>defaults);\nparcelHelpers.export(exports, \"parse\", ()=>parse);\nparcelHelpers.export(exports, \"signal\", ()=>parseSignal);\nparcelHelpers.export(exports, \"signalUpdates\", ()=>parseSignalUpdates);\nparcelHelpers.export(exports, \"stream\", ()=>parseStream);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaFunctions = require(\"vega-functions\");\nvar _vegaEventSelector = require(\"vega-event-selector\");\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nfunction parseAutosize(spec) {\n    return (0, _vegaUtil.isObject)(spec) ? spec : {\n        type: spec || \"pad\"\n    };\n}\nconst number = (_)=>+_ || 0;\nconst paddingObject = (_)=>({\n        top: _,\n        bottom: _,\n        left: _,\n        right: _\n    });\nfunction parsePadding(spec) {\n    return !(0, _vegaUtil.isObject)(spec) ? paddingObject(number(spec)) : spec.signal ? spec : {\n        top: number(spec.top),\n        bottom: number(spec.bottom),\n        left: number(spec.left),\n        right: number(spec.right)\n    };\n}\nconst encoder = (_)=>(0, _vegaUtil.isObject)(_) && !(0, _vegaUtil.isArray)(_) ? (0, _vegaUtil.extend)({}, _) : {\n        value: _\n    };\nfunction addEncode(object, name, value1, set) {\n    if (value1 != null) {\n        const isEncoder = (0, _vegaUtil.isObject)(value1) && !(0, _vegaUtil.isArray)(value1) || (0, _vegaUtil.isArray)(value1) && value1.length && (0, _vegaUtil.isObject)(value1[0]); // Always assign signal to update, even if the signal is from the enter block\n        if (isEncoder) object.update[name] = value1;\n        else object[set || \"enter\"][name] = {\n            value: value1\n        };\n        return 1;\n    } else return 0;\n}\nfunction addEncoders(object, enter, update) {\n    for(const name in enter)addEncode(object, name, enter[name]);\n    for(const name1 in update)addEncode(object, name1, update[name1], \"update\");\n}\nfunction extendEncode(encode, extra, skip) {\n    for(const name in extra){\n        if (skip && (0, _vegaUtil.hasOwnProperty)(skip, name)) continue;\n        encode[name] = (0, _vegaUtil.extend)(encode[name] || {}, extra[name]);\n    }\n    return encode;\n}\nfunction has(key, encode) {\n    return encode && (encode.enter && encode.enter[key] || encode.update && encode.update[key]);\n}\nconst MarkRole = \"mark\";\nconst FrameRole = \"frame\";\nconst ScopeRole = \"scope\";\nconst AxisRole = \"axis\";\nconst AxisDomainRole = \"axis-domain\";\nconst AxisGridRole = \"axis-grid\";\nconst AxisLabelRole = \"axis-label\";\nconst AxisTickRole = \"axis-tick\";\nconst AxisTitleRole = \"axis-title\";\nconst LegendRole = \"legend\";\nconst LegendBandRole = \"legend-band\";\nconst LegendEntryRole = \"legend-entry\";\nconst LegendGradientRole = \"legend-gradient\";\nconst LegendLabelRole = \"legend-label\";\nconst LegendSymbolRole = \"legend-symbol\";\nconst LegendTitleRole = \"legend-title\";\nconst TitleRole = \"title\";\nconst TitleTextRole = \"title-text\";\nconst TitleSubtitleRole = \"title-subtitle\";\nfunction applyDefaults(encode, type, role, style, config) {\n    const defaults1 = {}, enter = {};\n    let update, key1, skip, props1; // if text mark, apply global lineBreak settings (#2370)\n    key1 = \"lineBreak\";\n    if (type === \"text\" && config[key1] != null && !has(key1, encode)) applyDefault(defaults1, key1, config[key1]);\n     // ignore legend and axis roles\n    if (role == \"legend\" || String(role).startsWith(\"axis\")) role = null;\n     // resolve mark config\n    props1 = role === FrameRole ? config.group : role === MarkRole ? (0, _vegaUtil.extend)({}, config.mark, config[type]) : null;\n    for(key1 in props1){\n        // do not apply defaults if relevant fields are defined\n        skip = has(key1, encode) || (key1 === \"fill\" || key1 === \"stroke\") && (has(\"fill\", encode) || has(\"stroke\", encode));\n        if (!skip) applyDefault(defaults1, key1, props1[key1]);\n    } // resolve styles, apply with increasing precedence\n    (0, _vegaUtil.array)(style).forEach((name)=>{\n        const props = config.style && config.style[name];\n        for(const key in props)if (!has(key, encode)) applyDefault(defaults1, key, props[key]);\n    });\n    encode = (0, _vegaUtil.extend)({}, encode); // defensive copy\n    for(key1 in defaults1){\n        props1 = defaults1[key1];\n        if (props1.signal) (update = update || {})[key1] = props1;\n        else enter[key1] = props1;\n    }\n    encode.enter = (0, _vegaUtil.extend)(enter, encode.enter);\n    if (update) encode.update = (0, _vegaUtil.extend)(update, encode.update);\n    return encode;\n}\nfunction applyDefault(defaults2, key, value2) {\n    defaults2[key] = value2 && value2.signal ? {\n        signal: value2.signal\n    } : {\n        value: value2\n    };\n}\nconst scaleRef = (scale1)=>(0, _vegaUtil.isString)(scale1) ? (0, _vegaUtil.stringValue)(scale1) : scale1.signal ? `(${scale1.signal})` : field(scale1);\nfunction entry$1(enc) {\n    if (enc.gradient != null) return gradient(enc);\n    let value3 = enc.signal ? `(${enc.signal})` : enc.color ? color(enc.color) : enc.field != null ? field(enc.field) : enc.value !== undefined ? (0, _vegaUtil.stringValue)(enc.value) : undefined;\n    if (enc.scale != null) value3 = scale(enc, value3);\n    if (value3 === undefined) value3 = null;\n    if (enc.exponent != null) value3 = `pow(${value3},${property(enc.exponent)})`;\n    if (enc.mult != null) value3 += `*${property(enc.mult)}`;\n    if (enc.offset != null) value3 += `+${property(enc.offset)}`;\n    if (enc.round) value3 = `round(${value3})`;\n    return value3;\n}\nconst _color = (type, x, y, z)=>`(${type}(${[\n        x,\n        y,\n        z\n    ].map(entry$1).join(\",\")})+'')`;\nfunction color(enc) {\n    return enc.c ? _color(\"hcl\", enc.h, enc.c, enc.l) : enc.h || enc.s ? _color(\"hsl\", enc.h, enc.s, enc.l) : enc.l || enc.a ? _color(\"lab\", enc.l, enc.a, enc.b) : enc.r || enc.g || enc.b ? _color(\"rgb\", enc.r, enc.g, enc.b) : null;\n}\nfunction gradient(enc) {\n    // map undefined to null; expression lang does not allow undefined\n    const args = [\n        enc.start,\n        enc.stop,\n        enc.count\n    ].map((_)=>_ == null ? null : (0, _vegaUtil.stringValue)(_)); // trim null inputs from the end\n    while(args.length && (0, _vegaUtil.peek)(args) == null)args.pop();\n    args.unshift(scaleRef(enc.gradient));\n    return `gradient(${args.join(\",\")})`;\n}\nfunction property(property1) {\n    return (0, _vegaUtil.isObject)(property1) ? \"(\" + entry$1(property1) + \")\" : property1;\n}\nfunction field(ref1) {\n    return resolveField((0, _vegaUtil.isObject)(ref1) ? ref1 : {\n        datum: ref1\n    });\n}\nfunction resolveField(ref2) {\n    let object, level, field1;\n    if (ref2.signal) {\n        object = \"datum\";\n        field1 = ref2.signal;\n    } else if (ref2.group || ref2.parent) {\n        level = Math.max(1, ref2.level || 1);\n        object = \"item\";\n        while(level-- > 0)object += \".mark.group\";\n        if (ref2.parent) {\n            field1 = ref2.parent;\n            object += \".datum\";\n        } else field1 = ref2.group;\n    } else if (ref2.datum) {\n        object = \"datum\";\n        field1 = ref2.datum;\n    } else (0, _vegaUtil.error)(\"Invalid field reference: \" + (0, _vegaUtil.stringValue)(ref2));\n    if (!ref2.signal) field1 = (0, _vegaUtil.isString)(field1) ? (0, _vegaUtil.splitAccessPath)(field1).map((0, _vegaUtil.stringValue)).join(\"][\") : resolveField(field1);\n    return object + \"[\" + field1 + \"]\";\n}\nfunction scale(enc, value4) {\n    const scale2 = scaleRef(enc.scale);\n    if (enc.range != null) // pull value from scale range\n    value4 = `lerp(_range(${scale2}), ${+enc.range})`;\n    else {\n        // run value through scale and/or pull scale bandwidth\n        if (value4 !== undefined) value4 = `_scale(${scale2}, ${value4})`;\n        if (enc.band) {\n            value4 = (value4 ? value4 + \"+\" : \"\") + `_bandwidth(${scale2})` + (+enc.band === 1 ? \"\" : \"*\" + property(enc.band));\n            if (enc.extra) // include logic to handle extraneous elements\n            value4 = `(datum.extra ? _scale(${scale2}, datum.extra.value) : ${value4})`;\n        }\n        if (value4 == null) value4 = \"0\";\n    }\n    return value4;\n}\nfunction rule(enc) {\n    let code = \"\";\n    enc.forEach((rule1)=>{\n        const value5 = entry$1(rule1);\n        code += rule1.test ? `(${rule1.test})?${value5}:` : value5;\n    }); // if no else clause, terminate with null (#1366)\n    if ((0, _vegaUtil.peek)(code) === \":\") code += \"null\";\n    return code;\n}\nfunction parseEncode(encode, type, role, style, scope, params) {\n    const enc = {};\n    params = params || {};\n    params.encoders = {\n        $encode: enc\n    };\n    encode = applyDefaults(encode, type, role, style, scope.config);\n    for(const key in encode)enc[key] = parseBlock(encode[key], type, params, scope);\n    return params;\n}\nfunction parseBlock(block, marktype, params, scope) {\n    const channels = {}, fields = {};\n    for(const name in block)if (block[name] != null) // skip any null entries\n    channels[name] = parse$1(expr(block[name]), scope, params, fields);\n    return {\n        $expr: {\n            marktype,\n            channels\n        },\n        $fields: Object.keys(fields),\n        $output: Object.keys(block)\n    };\n}\nfunction expr(enc) {\n    return (0, _vegaUtil.isArray)(enc) ? rule(enc) : entry$1(enc);\n}\nfunction parse$1(code, scope, params, fields) {\n    const expr1 = (0, _vegaFunctions.parseExpression)(code, scope);\n    expr1.$fields.forEach((name)=>fields[name] = 1);\n    (0, _vegaUtil.extend)(params, expr1.$params);\n    return expr1.$expr;\n}\nconst OUTER = \"outer\", OUTER_INVALID = [\n    \"value\",\n    \"update\",\n    \"init\",\n    \"react\",\n    \"bind\"\n];\nfunction outerError(prefix, name) {\n    (0, _vegaUtil.error)(prefix + ' for \"outer\" push: ' + (0, _vegaUtil.stringValue)(name));\n}\nfunction parseSignal(signal, scope) {\n    const name = signal.name;\n    if (signal.push === OUTER) {\n        // signal must already be defined, raise error if not\n        if (!scope.signals[name]) outerError(\"No prior signal definition\", name); // signal push must not use properties reserved for standard definition\n        OUTER_INVALID.forEach((prop)=>{\n            if (signal[prop] !== undefined) outerError(\"Invalid property \", prop);\n        });\n    } else {\n        // define a new signal in the current scope\n        const op = scope.addSignal(name, signal.value);\n        if (signal.react === false) op.react = false;\n        if (signal.bind) scope.addBinding(name, signal.bind);\n    }\n}\nfunction Entry(type, value6, params, parent) {\n    this.id = -1;\n    this.type = type;\n    this.value = value6;\n    this.params = params;\n    if (parent) this.parent = parent;\n}\nfunction entry(type, value7, params, parent) {\n    return new Entry(type, value7, params, parent);\n}\nfunction operator(value8, params) {\n    return entry(\"operator\", value8, params);\n} // -----\nfunction ref(op) {\n    const ref3 = {\n        $ref: op.id\n    }; // if operator not yet registered, cache ref to resolve later\n    if (op.id < 0) (op.refs = op.refs || []).push(ref3);\n    return ref3;\n}\nfunction fieldRef$1(field2, name) {\n    return name ? {\n        $field: field2,\n        $name: name\n    } : {\n        $field: field2\n    };\n}\nconst keyFieldRef = fieldRef$1(\"key\");\nfunction compareRef(fields, orders) {\n    return {\n        $compare: fields,\n        $order: orders\n    };\n}\nfunction keyRef(fields, flat) {\n    const ref4 = {\n        $key: fields\n    };\n    if (flat) ref4.$flat = true;\n    return ref4;\n} // -----\nconst Ascending = \"ascending\";\nconst Descending = \"descending\";\nfunction sortKey(sort) {\n    return !(0, _vegaUtil.isObject)(sort) ? \"\" : (sort.order === Descending ? \"-\" : \"+\") + aggrField(sort.op, sort.field);\n}\nfunction aggrField(op, field3) {\n    return (op && op.signal ? \"$\" + op.signal : op || \"\") + (op && field3 ? \"_\" : \"\") + (field3 && field3.signal ? \"$\" + field3.signal : field3 || \"\");\n} // -----\nconst Scope$1 = \"scope\";\nconst View = \"view\";\nfunction isSignal(_) {\n    return _ && _.signal;\n}\nfunction isExpr$1(_) {\n    return _ && _.expr;\n}\nfunction hasSignal(_) {\n    if (isSignal(_)) return true;\n    if ((0, _vegaUtil.isObject)(_)) for(const key in _){\n        if (hasSignal(_[key])) return true;\n    }\n    return false;\n}\nfunction value(specValue, defaultValue) {\n    return specValue != null ? specValue : defaultValue;\n}\nfunction deref(v) {\n    return v && v.signal || v;\n}\nconst Timer = \"timer\";\nfunction parseStream(stream, scope) {\n    const method = stream.merge ? mergeStream : stream.stream ? nestedStream : stream.type ? eventStream : (0, _vegaUtil.error)(\"Invalid stream specification: \" + (0, _vegaUtil.stringValue)(stream));\n    return method(stream, scope);\n}\nfunction eventSource(source) {\n    return source === Scope$1 ? View : source || View;\n}\nfunction mergeStream(stream, scope) {\n    const list = stream.merge.map((s)=>parseStream(s, scope)), entry1 = streamParameters({\n        merge: list\n    }, stream, scope);\n    return scope.addStream(entry1).id;\n}\nfunction nestedStream(stream, scope) {\n    const id = parseStream(stream.stream, scope), entry2 = streamParameters({\n        stream: id\n    }, stream, scope);\n    return scope.addStream(entry2).id;\n}\nfunction eventStream(stream, scope) {\n    let id;\n    if (stream.type === Timer) {\n        id = scope.event(Timer, stream.throttle);\n        stream = {\n            between: stream.between,\n            filter: stream.filter\n        };\n    } else id = scope.event(eventSource(stream.source), stream.type);\n    const entry3 = streamParameters({\n        stream: id\n    }, stream, scope);\n    return Object.keys(entry3).length === 1 ? id : scope.addStream(entry3).id;\n}\nfunction streamParameters(entry4, stream, scope) {\n    let param1 = stream.between;\n    if (param1) {\n        if (param1.length !== 2) (0, _vegaUtil.error)('Stream \"between\" parameter must have 2 entries: ' + (0, _vegaUtil.stringValue)(stream));\n        entry4.between = [\n            parseStream(param1[0], scope),\n            parseStream(param1[1], scope)\n        ];\n    }\n    param1 = stream.filter ? [].concat(stream.filter) : [];\n    if (stream.marktype || stream.markname || stream.markrole) // add filter for mark type, name and/or role\n    param1.push(filterMark(stream.marktype, stream.markname, stream.markrole));\n    if (stream.source === Scope$1) // add filter to limit events from sub-scope only\n    param1.push(\"inScope(event.item)\");\n    if (param1.length) entry4.filter = (0, _vegaFunctions.parseExpression)(\"(\" + param1.join(\")&&(\") + \")\", scope).$expr;\n    if ((param1 = stream.throttle) != null) entry4.throttle = +param1;\n    if ((param1 = stream.debounce) != null) entry4.debounce = +param1;\n    if (stream.consume) entry4.consume = true;\n    return entry4;\n}\nfunction filterMark(type, name, role) {\n    const item = \"event.item\";\n    return item + (type && type !== \"*\" ? \"&&\" + item + \".mark.marktype==='\" + type + \"'\" : \"\") + (role ? \"&&\" + item + \".mark.role==='\" + role + \"'\" : \"\") + (name ? \"&&\" + item + \".mark.name==='\" + name + \"'\" : \"\");\n}\nconst OP_VALUE_EXPR = {\n    code: \"_.$value\",\n    ast: {\n        type: \"Identifier\",\n        value: \"value\"\n    }\n};\nfunction parseUpdate(spec, scope, target) {\n    const encode = spec.encode, entry5 = {\n        target: target\n    };\n    let events = spec.events, update = spec.update, sources = [];\n    if (!events) (0, _vegaUtil.error)(\"Signal update missing events specification.\");\n     // interpret as an event selector string\n    if ((0, _vegaUtil.isString)(events)) events = (0, _vegaEventSelector.parseSelector)(events, scope.isSubscope() ? Scope$1 : View);\n     // separate event streams from signal updates\n    events = (0, _vegaUtil.array)(events).filter((s)=>s.signal || s.scale ? (sources.push(s), 0) : 1); // merge internal operator listeners\n    if (sources.length > 1) sources = [\n        mergeSources(sources)\n    ];\n     // merge event streams, include as source\n    if (events.length) sources.push(events.length > 1 ? {\n        merge: events\n    } : events[0]);\n    if (encode != null) {\n        if (update) (0, _vegaUtil.error)(\"Signal encode and update are mutually exclusive.\");\n        update = \"encode(item(),\" + (0, _vegaUtil.stringValue)(encode) + \")\";\n    } // resolve update value\n    entry5.update = (0, _vegaUtil.isString)(update) ? (0, _vegaFunctions.parseExpression)(update, scope) : update.expr != null ? (0, _vegaFunctions.parseExpression)(update.expr, scope) : update.value != null ? update.value : update.signal != null ? {\n        $expr: OP_VALUE_EXPR,\n        $params: {\n            $value: scope.signalRef(update.signal)\n        }\n    } : (0, _vegaUtil.error)(\"Invalid signal update specification.\");\n    if (spec.force) entry5.options = {\n        force: true\n    };\n    sources.forEach((source)=>scope.addUpdate((0, _vegaUtil.extend)(streamSource(source, scope), entry5)));\n}\nfunction streamSource(stream, scope) {\n    return {\n        source: stream.signal ? scope.signalRef(stream.signal) : stream.scale ? scope.scaleRef(stream.scale) : parseStream(stream, scope)\n    };\n}\nfunction mergeSources(sources) {\n    return {\n        signal: \"[\" + sources.map((s)=>s.scale ? 'scale(\"' + s.scale + '\")' : s.signal) + \"]\"\n    };\n}\nfunction parseSignalUpdates(signal, scope) {\n    const op = scope.getSignal(signal.name);\n    let expr2 = signal.update;\n    if (signal.init) {\n        if (expr2) (0, _vegaUtil.error)(\"Signals can not include both init and update expressions.\");\n        else {\n            expr2 = signal.init;\n            op.initonly = true;\n        }\n    }\n    if (expr2) {\n        expr2 = (0, _vegaFunctions.parseExpression)(expr2, scope);\n        op.update = expr2.$expr;\n        op.params = expr2.$params;\n    }\n    if (signal.on) signal.on.forEach((_)=>parseUpdate(_, scope, op.id));\n}\nconst transform = (name)=>(params, value9, parent)=>entry(name, value9, params || undefined, parent);\nconst Aggregate = transform(\"aggregate\");\nconst AxisTicks = transform(\"axisticks\");\nconst Bound = transform(\"bound\");\nconst Collect = transform(\"collect\");\nconst Compare = transform(\"compare\");\nconst DataJoin = transform(\"datajoin\");\nconst Encode = transform(\"encode\");\nconst Expression = transform(\"expression\");\nconst Facet = transform(\"facet\");\nconst Field = transform(\"field\");\nconst Key = transform(\"key\");\nconst LegendEntries = transform(\"legendentries\");\nconst Load = transform(\"load\");\nconst Mark = transform(\"mark\");\nconst MultiExtent = transform(\"multiextent\");\nconst MultiValues = transform(\"multivalues\");\nconst Overlap = transform(\"overlap\");\nconst Params = transform(\"params\");\nconst PreFacet = transform(\"prefacet\");\nconst Projection = transform(\"projection\");\nconst Proxy = transform(\"proxy\");\nconst Relay = transform(\"relay\");\nconst Render = transform(\"render\");\nconst Scale = transform(\"scale\");\nconst Sieve = transform(\"sieve\");\nconst SortItems = transform(\"sortitems\");\nconst ViewLayout = transform(\"viewlayout\");\nconst Values = transform(\"values\");\nlet FIELD_REF_ID = 0;\nconst MULTIDOMAIN_SORT_OPS = {\n    min: \"min\",\n    max: \"max\",\n    count: \"sum\"\n};\nfunction initScale(spec, scope) {\n    const type = spec.type || \"linear\";\n    if (!(0, _vegaScale.isValidScaleType)(type)) (0, _vegaUtil.error)(\"Unrecognized scale type: \" + (0, _vegaUtil.stringValue)(type));\n    scope.addScale(spec.name, {\n        type,\n        domain: undefined\n    });\n}\nfunction parseScale(spec, scope) {\n    const params = scope.getScale(spec.name).params;\n    let key;\n    params.domain = parseScaleDomain(spec.domain, spec, scope);\n    if (spec.range != null) params.range = parseScaleRange(spec, scope, params);\n    if (spec.interpolate != null) parseScaleInterpolate(spec.interpolate, params);\n    if (spec.nice != null) params.nice = parseScaleNice(spec.nice);\n    if (spec.bins != null) params.bins = parseScaleBins(spec.bins, scope);\n    for(key in spec){\n        if ((0, _vegaUtil.hasOwnProperty)(params, key) || key === \"name\") continue;\n        params[key] = parseLiteral(spec[key], scope);\n    }\n}\nfunction parseLiteral(v, scope) {\n    return !(0, _vegaUtil.isObject)(v) ? v : v.signal ? scope.signalRef(v.signal) : (0, _vegaUtil.error)(\"Unsupported object: \" + (0, _vegaUtil.stringValue)(v));\n}\nfunction parseArray(v1, scope) {\n    return v1.signal ? scope.signalRef(v1.signal) : v1.map((v)=>parseLiteral(v, scope));\n}\nfunction dataLookupError(name) {\n    (0, _vegaUtil.error)(\"Can not find data set: \" + (0, _vegaUtil.stringValue)(name));\n} // -- SCALE DOMAIN ----\nfunction parseScaleDomain(domain, spec, scope) {\n    if (!domain) {\n        if (spec.domainMin != null || spec.domainMax != null) (0, _vegaUtil.error)(\"No scale domain defined for domainMin/domainMax to override.\");\n        return; // default domain\n    }\n    return domain.signal ? scope.signalRef(domain.signal) : ((0, _vegaUtil.isArray)(domain) ? explicitDomain : domain.fields ? multipleDomain : singularDomain)(domain, spec, scope);\n}\nfunction explicitDomain(domain, spec, scope) {\n    return domain.map((v)=>parseLiteral(v, scope));\n}\nfunction singularDomain(domain, spec, scope) {\n    const data = scope.getData(domain.data);\n    if (!data) dataLookupError(domain.data);\n    return (0, _vegaScale.isDiscrete)(spec.type) ? data.valuesRef(scope, domain.field, parseSort(domain.sort, false)) : (0, _vegaScale.isQuantile)(spec.type) ? data.domainRef(scope, domain.field) : data.extentRef(scope, domain.field);\n}\nfunction multipleDomain(domain, spec, scope) {\n    const data = domain.data, fields = domain.fields.reduce((dom, d)=>{\n        d = (0, _vegaUtil.isString)(d) ? {\n            data: data,\n            field: d\n        } : (0, _vegaUtil.isArray)(d) || d.signal ? fieldRef(d, scope) : d;\n        dom.push(d);\n        return dom;\n    }, []);\n    return ((0, _vegaScale.isDiscrete)(spec.type) ? ordinalMultipleDomain : (0, _vegaScale.isQuantile)(spec.type) ? quantileMultipleDomain : numericMultipleDomain)(domain, scope, fields);\n}\nfunction fieldRef(data, scope) {\n    const name = \"_:vega:_\" + FIELD_REF_ID++, coll = Collect({});\n    if ((0, _vegaUtil.isArray)(data)) coll.value = {\n        $ingest: data\n    };\n    else if (data.signal) {\n        const code = \"setdata(\" + (0, _vegaUtil.stringValue)(name) + \",\" + data.signal + \")\";\n        coll.params.input = scope.signalRef(code);\n    }\n    scope.addDataPipeline(name, [\n        coll,\n        Sieve({})\n    ]);\n    return {\n        data: name,\n        field: \"data\"\n    };\n}\nfunction ordinalMultipleDomain(domain, scope, fields) {\n    const sort = parseSort(domain.sort, true);\n    let a, v; // get value counts for each domain field\n    const counts = fields.map((f)=>{\n        const data = scope.getData(f.data);\n        if (!data) dataLookupError(f.data);\n        return data.countsRef(scope, f.field, sort);\n    }); // aggregate the results from each domain field\n    const p = {\n        groupby: keyFieldRef,\n        pulse: counts\n    };\n    if (sort) {\n        a = sort.op || \"count\";\n        v = sort.field ? aggrField(a, sort.field) : \"count\";\n        p.ops = [\n            MULTIDOMAIN_SORT_OPS[a]\n        ];\n        p.fields = [\n            scope.fieldRef(v)\n        ];\n        p.as = [\n            v\n        ];\n    }\n    a = scope.add(Aggregate(p)); // collect aggregate output\n    const c = scope.add(Collect({\n        pulse: ref(a)\n    })); // extract values for combined domain\n    v = scope.add(Values({\n        field: keyFieldRef,\n        sort: scope.sortRef(sort),\n        pulse: ref(c)\n    }));\n    return ref(v);\n}\nfunction parseSort(sort, multidomain) {\n    if (sort) {\n        if (!sort.field && !sort.op) {\n            if ((0, _vegaUtil.isObject)(sort)) sort.field = \"key\";\n            else sort = {\n                field: \"key\"\n            };\n        } else if (!sort.field && sort.op !== \"count\") (0, _vegaUtil.error)(\"No field provided for sort aggregate op: \" + sort.op);\n        else if (multidomain && sort.field) {\n            if (sort.op && !MULTIDOMAIN_SORT_OPS[sort.op]) (0, _vegaUtil.error)(\"Multiple domain scales can not be sorted using \" + sort.op);\n        }\n    }\n    return sort;\n}\nfunction quantileMultipleDomain(domain, scope, fields) {\n    // get value arrays for each domain field\n    const values = fields.map((f)=>{\n        const data = scope.getData(f.data);\n        if (!data) dataLookupError(f.data);\n        return data.domainRef(scope, f.field);\n    }); // combine value arrays\n    return ref(scope.add(MultiValues({\n        values: values\n    })));\n}\nfunction numericMultipleDomain(domain, scope, fields) {\n    // get extents for each domain field\n    const extents = fields.map((f)=>{\n        const data = scope.getData(f.data);\n        if (!data) dataLookupError(f.data);\n        return data.extentRef(scope, f.field);\n    }); // combine extents\n    return ref(scope.add(MultiExtent({\n        extents: extents\n    })));\n} // -- SCALE BINS -----\nfunction parseScaleBins(v, scope) {\n    return v.signal || (0, _vegaUtil.isArray)(v) ? parseArray(v, scope) : scope.objectProperty(v);\n} // -- SCALE NICE -----\nfunction parseScaleNice(nice) {\n    return (0, _vegaUtil.isObject)(nice) ? {\n        interval: parseLiteral(nice.interval),\n        step: parseLiteral(nice.step)\n    } : parseLiteral(nice);\n} // -- SCALE INTERPOLATION -----\nfunction parseScaleInterpolate(interpolate, params) {\n    params.interpolate = parseLiteral(interpolate.type || interpolate);\n    if (interpolate.gamma != null) params.interpolateGamma = parseLiteral(interpolate.gamma);\n} // -- SCALE RANGE -----\nfunction parseScaleRange(spec, scope, params) {\n    const config = scope.config.range;\n    let range = spec.range;\n    if (range.signal) return scope.signalRef(range.signal);\n    else if ((0, _vegaUtil.isString)(range)) {\n        if (config && (0, _vegaUtil.hasOwnProperty)(config, range)) {\n            spec = (0, _vegaUtil.extend)({}, spec, {\n                range: config[range]\n            });\n            return parseScaleRange(spec, scope, params);\n        } else if (range === \"width\") range = [\n            0,\n            {\n                signal: \"width\"\n            }\n        ];\n        else if (range === \"height\") range = (0, _vegaScale.isDiscrete)(spec.type) ? [\n            0,\n            {\n                signal: \"height\"\n            }\n        ] : [\n            {\n                signal: \"height\"\n            },\n            0\n        ];\n        else (0, _vegaUtil.error)(\"Unrecognized scale range value: \" + (0, _vegaUtil.stringValue)(range));\n    } else if (range.scheme) {\n        params.scheme = (0, _vegaUtil.isArray)(range.scheme) ? parseArray(range.scheme, scope) : parseLiteral(range.scheme, scope);\n        if (range.extent) params.schemeExtent = parseArray(range.extent, scope);\n        if (range.count) params.schemeCount = parseLiteral(range.count, scope);\n        return;\n    } else if (range.step) {\n        params.rangeStep = parseLiteral(range.step, scope);\n        return;\n    } else if ((0, _vegaScale.isDiscrete)(spec.type) && !(0, _vegaUtil.isArray)(range)) return parseScaleDomain(range, spec, scope);\n    else if (!(0, _vegaUtil.isArray)(range)) (0, _vegaUtil.error)(\"Unsupported range type: \" + (0, _vegaUtil.stringValue)(range));\n    return range.map((v)=>((0, _vegaUtil.isArray)(v) ? parseArray : parseLiteral)(v, scope));\n}\nfunction parseProjection(proj, scope) {\n    const config = scope.config.projection || {}, params = {};\n    for(const name in proj){\n        if (name === \"name\") continue;\n        params[name] = parseParameter$1(proj[name], name, scope);\n    } // apply projection defaults from config\n    for(const name2 in config)if (params[name2] == null) params[name2] = parseParameter$1(config[name2], name2, scope);\n    scope.addProjection(proj.name, params);\n}\nfunction parseParameter$1(_1, name, scope) {\n    return (0, _vegaUtil.isArray)(_1) ? _1.map((_)=>parseParameter$1(_, name, scope)) : !(0, _vegaUtil.isObject)(_1) ? _1 : _1.signal ? scope.signalRef(_1.signal) : name === \"fit\" ? _1 : (0, _vegaUtil.error)(\"Unsupported parameter object: \" + (0, _vegaUtil.stringValue)(_1));\n}\nconst Top = \"top\";\nconst Left = \"left\";\nconst Right = \"right\";\nconst Bottom = \"bottom\";\nconst Center = \"center\";\nconst Vertical = \"vertical\";\nconst Start = \"start\";\nconst Middle = \"middle\";\nconst End = \"end\";\nconst Index = \"index\";\nconst Label = \"label\";\nconst Offset = \"offset\";\nconst Perc = \"perc\";\nconst Perc2 = \"perc2\";\nconst Value = \"value\";\nconst GuideLabelStyle = \"guide-label\";\nconst GuideTitleStyle = \"guide-title\";\nconst GroupTitleStyle = \"group-title\";\nconst GroupSubtitleStyle = \"group-subtitle\";\nconst Symbols = \"symbol\";\nconst Gradient = \"gradient\";\nconst Discrete = \"discrete\";\nconst Size = \"size\";\nconst Shape = \"shape\";\nconst Fill = \"fill\";\nconst Stroke = \"stroke\";\nconst StrokeWidth = \"strokeWidth\";\nconst StrokeDash = \"strokeDash\";\nconst Opacity = \"opacity\"; // Encoding channels supported by legends\n// In priority order of 'canonical' scale\nconst LegendScales = [\n    Size,\n    Shape,\n    Fill,\n    Stroke,\n    StrokeWidth,\n    StrokeDash,\n    Opacity\n];\nconst Skip = {\n    name: 1,\n    style: 1,\n    interactive: 1\n};\nconst zero = {\n    value: 0\n};\nconst one = {\n    value: 1\n};\nconst GroupMark = \"group\";\nconst RectMark = \"rect\";\nconst RuleMark = \"rule\";\nconst SymbolMark = \"symbol\";\nconst TextMark = \"text\";\nfunction guideGroup(mark) {\n    mark.type = GroupMark;\n    mark.interactive = mark.interactive || false;\n    return mark;\n}\nfunction lookup(spec, config) {\n    const _ = (name, dflt)=>value(spec[name], value(config[name], dflt));\n    _.isVertical = (s)=>Vertical === value(spec.direction, config.direction || (s ? config.symbolDirection : config.gradientDirection));\n    _.gradientLength = ()=>value(spec.gradientLength, config.gradientLength || config.gradientWidth);\n    _.gradientThickness = ()=>value(spec.gradientThickness, config.gradientThickness || config.gradientHeight);\n    _.entryColumns = ()=>value(spec.columns, value(config.columns, +_.isVertical(true)));\n    return _;\n}\nfunction getEncoding(name, encode) {\n    const v = encode && (encode.update && encode.update[name] || encode.enter && encode.enter[name]);\n    return v && v.signal ? v : v ? v.value : null;\n}\nfunction getStyle(name, scope, style) {\n    const s = scope.config.style[style];\n    return s && s[name];\n}\nfunction anchorExpr(s, e, m) {\n    return `item.anchor === '${Start}' ? ${s} : item.anchor === '${End}' ? ${e} : ${m}`;\n}\nconst alignExpr$1 = anchorExpr((0, _vegaUtil.stringValue)(Left), (0, _vegaUtil.stringValue)(Right), (0, _vegaUtil.stringValue)(Center));\nfunction tickBand(_) {\n    const v = _(\"tickBand\");\n    let offset = _(\"tickOffset\"), band, extra;\n    if (!v) {\n        // if no tick band entry, fall back on other properties\n        band = _(\"bandPosition\");\n        extra = _(\"tickExtra\");\n    } else if (v.signal) {\n        // if signal, augment code to interpret values\n        band = {\n            signal: `(${v.signal}) === 'extent' ? 1 : 0.5`\n        };\n        extra = {\n            signal: `(${v.signal}) === 'extent'`\n        };\n        if (!(0, _vegaUtil.isObject)(offset)) offset = {\n            signal: `(${v.signal}) === 'extent' ? 0 : ${offset}`\n        };\n    } else if (v === \"extent\") {\n        // if constant, simply set values\n        band = 1;\n        extra = true;\n        offset = 0;\n    } else {\n        band = 0.5;\n        extra = false;\n    }\n    return {\n        extra,\n        band,\n        offset\n    };\n}\nfunction extendOffset(value10, offset) {\n    return !offset ? value10 : !value10 ? offset : !(0, _vegaUtil.isObject)(value10) ? {\n        value: value10,\n        offset\n    } : Object.assign({}, value10, {\n        offset: extendOffset(value10.offset, offset)\n    });\n}\nfunction guideMark(mark, extras) {\n    if (extras) {\n        mark.name = extras.name;\n        mark.style = extras.style || mark.style;\n        mark.interactive = !!extras.interactive;\n        mark.encode = extendEncode(mark.encode, extras, Skip);\n    } else mark.interactive = false;\n    return mark;\n}\nfunction legendGradient(spec, scale3, config, userEncode) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length = _.gradientLength();\n    let enter, start, stop, width, height;\n    if (vertical) {\n        start = [\n            0,\n            1\n        ];\n        stop = [\n            0,\n            0\n        ];\n        width = thickness;\n        height = length;\n    } else {\n        start = [\n            0,\n            0\n        ];\n        stop = [\n            1,\n            0\n        ];\n        width = length;\n        height = thickness;\n    }\n    const encode = {\n        enter: enter = {\n            opacity: zero,\n            x: zero,\n            y: zero,\n            width: encoder(width),\n            height: encoder(height)\n        },\n        update: (0, _vegaUtil.extend)({}, enter, {\n            opacity: one,\n            fill: {\n                gradient: scale3,\n                start: start,\n                stop: stop\n            }\n        }),\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"gradientStrokeColor\"),\n        strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n        // update\n        opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n        type: RectMark,\n        role: LegendGradientRole,\n        encode\n    }, userEncode);\n}\nfunction legendGradientDiscrete(spec, scale4, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length = _.gradientLength();\n    let u, v, uu, vv, adjust = \"\";\n    vertical ? (u = \"y\", uu = \"y2\", v = \"x\", vv = \"width\", adjust = \"1-\") : (u = \"x\", uu = \"x2\", v = \"y\", vv = \"height\");\n    const enter = {\n        opacity: zero,\n        fill: {\n            scale: scale4,\n            field: Value\n        }\n    };\n    enter[u] = {\n        signal: adjust + \"datum.\" + Perc,\n        mult: length\n    };\n    enter[v] = zero;\n    enter[uu] = {\n        signal: adjust + \"datum.\" + Perc2,\n        mult: length\n    };\n    enter[vv] = encoder(thickness);\n    const encode = {\n        enter: enter,\n        update: (0, _vegaUtil.extend)({}, enter, {\n            opacity: one\n        }),\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"gradientStrokeColor\"),\n        strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n        // update\n        opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n        type: RectMark,\n        role: LegendBandRole,\n        key: Value,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nconst alignExpr = `datum.${Perc}<=0?\"${Left}\":datum.${Perc}>=1?\"${Right}\":\"${Center}\"`, baselineExpr = `datum.${Perc}<=0?\"${Bottom}\":datum.${Perc}>=1?\"${Top}\":\"${Middle}\"`;\nfunction legendGradientLabels(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = encoder(_.gradientThickness()), length = _.gradientLength();\n    let overlap = _(\"labelOverlap\"), enter, update, u, v, adjust = \"\";\n    const encode = {\n        enter: enter = {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one,\n            text: {\n                field: Label\n            }\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        fill: _(\"labelColor\"),\n        fillOpacity: _(\"labelOpacity\"),\n        font: _(\"labelFont\"),\n        fontSize: _(\"labelFontSize\"),\n        fontStyle: _(\"labelFontStyle\"),\n        fontWeight: _(\"labelFontWeight\"),\n        limit: value(spec.labelLimit, config.gradientLabelLimit)\n    });\n    if (vertical) {\n        enter.align = {\n            value: \"left\"\n        };\n        enter.baseline = update.baseline = {\n            signal: baselineExpr\n        };\n        u = \"y\";\n        v = \"x\";\n        adjust = \"1-\";\n    } else {\n        enter.align = update.align = {\n            signal: alignExpr\n        };\n        enter.baseline = {\n            value: \"top\"\n        };\n        u = \"x\";\n        v = \"y\";\n    }\n    enter[u] = update[u] = {\n        signal: adjust + \"datum.\" + Perc,\n        mult: length\n    };\n    enter[v] = update[v] = thickness;\n    thickness.offset = value(spec.labelOffset, config.gradientLabelOffset) || 0;\n    overlap = overlap ? {\n        separation: _(\"labelSeparation\"),\n        method: overlap,\n        order: \"datum.\" + Index\n    } : undefined; // type, role, style, key, dataRef, encode, extras\n    return guideMark({\n        type: TextMark,\n        role: LegendLabelRole,\n        style: GuideLabelStyle,\n        key: Value,\n        from: dataRef,\n        encode,\n        overlap\n    }, userEncode);\n}\nfunction legendSymbolGroups(spec, config, userEncode, dataRef, columns) {\n    const _ = lookup(spec, config), entries = userEncode.entries, interactive1 = !!(entries && entries.interactive), name = entries ? entries.name : undefined, height = _(\"clipHeight\"), symbolOffset = _(\"symbolOffset\"), valueRef = {\n        data: \"value\"\n    }, xSignal = `(${columns}) ? datum.${Offset} : datum.${Size}`, yEncode = height ? encoder(height) : {\n        field: Size\n    }, index = `datum.${Index}`, ncols = `max(1, ${columns})`;\n    let encode, enter, update, nrows, sort;\n    yEncode.mult = 0.5; // -- LEGEND SYMBOLS --\n    encode = {\n        enter: enter = {\n            opacity: zero,\n            x: {\n                signal: xSignal,\n                mult: 0.5,\n                offset: symbolOffset\n            },\n            y: yEncode\n        },\n        update: update = {\n            opacity: one,\n            x: enter.x,\n            y: enter.y\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    let baseFill = null, baseStroke = null;\n    if (!spec.fill) {\n        baseFill = config.symbolBaseFillColor;\n        baseStroke = config.symbolBaseStrokeColor;\n    }\n    addEncoders(encode, {\n        fill: _(\"symbolFillColor\", baseFill),\n        shape: _(\"symbolType\"),\n        size: _(\"symbolSize\"),\n        stroke: _(\"symbolStrokeColor\", baseStroke),\n        strokeDash: _(\"symbolDash\"),\n        strokeDashOffset: _(\"symbolDashOffset\"),\n        strokeWidth: _(\"symbolStrokeWidth\")\n    }, {\n        // update\n        opacity: _(\"symbolOpacity\")\n    });\n    LegendScales.forEach((scale5)=>{\n        if (spec[scale5]) update[scale5] = enter[scale5] = {\n            scale: spec[scale5],\n            field: Value\n        };\n    });\n    const symbols = guideMark({\n        type: SymbolMark,\n        role: LegendSymbolRole,\n        key: Value,\n        from: valueRef,\n        clip: height ? true : undefined,\n        encode\n    }, userEncode.symbols); // -- LEGEND LABELS --\n    const labelOffset = encoder(symbolOffset);\n    labelOffset.offset = _(\"labelOffset\");\n    encode = {\n        enter: enter = {\n            opacity: zero,\n            x: {\n                signal: xSignal,\n                offset: labelOffset\n            },\n            y: yEncode\n        },\n        update: update = {\n            opacity: one,\n            text: {\n                field: Label\n            },\n            x: enter.x,\n            y: enter.y\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        align: _(\"labelAlign\"),\n        baseline: _(\"labelBaseline\"),\n        fill: _(\"labelColor\"),\n        fillOpacity: _(\"labelOpacity\"),\n        font: _(\"labelFont\"),\n        fontSize: _(\"labelFontSize\"),\n        fontStyle: _(\"labelFontStyle\"),\n        fontWeight: _(\"labelFontWeight\"),\n        limit: _(\"labelLimit\")\n    });\n    const labels = guideMark({\n        type: TextMark,\n        role: LegendLabelRole,\n        style: GuideLabelStyle,\n        key: Value,\n        from: valueRef,\n        encode\n    }, userEncode.labels); // -- LEGEND ENTRY GROUPS --\n    encode = {\n        enter: {\n            noBound: {\n                value: !height\n            },\n            // ignore width/height in bounds calc\n            width: zero,\n            height: height ? encoder(height) : zero,\n            opacity: zero\n        },\n        exit: {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one,\n            row: {\n                signal: null\n            },\n            column: {\n                signal: null\n            }\n        }\n    }; // annotate and sort groups to ensure correct ordering\n    if (_.isVertical(true)) {\n        nrows = `ceil(item.mark.items.length / ${ncols})`;\n        update.row.signal = `${index}%${nrows}`;\n        update.column.signal = `floor(${index} / ${nrows})`;\n        sort = {\n            field: [\n                \"row\",\n                index\n            ]\n        };\n    } else {\n        update.row.signal = `floor(${index} / ${ncols})`;\n        update.column.signal = `${index} % ${ncols}`;\n        sort = {\n            field: index\n        };\n    } // handle zero column case (implies infinite columns)\n    update.column.signal = `(${columns})?${update.column.signal}:${index}`; // facet legend entries into sub-groups\n    dataRef = {\n        facet: {\n            data: dataRef,\n            name: \"value\",\n            groupby: Index\n        }\n    };\n    return guideGroup({\n        role: ScopeRole,\n        from: dataRef,\n        encode: extendEncode(encode, entries, Skip),\n        marks: [\n            symbols,\n            labels\n        ],\n        name,\n        interactive: interactive1,\n        sort\n    });\n}\nfunction legendSymbolLayout(spec, config) {\n    const _ = lookup(spec, config); // layout parameters for legend entries\n    return {\n        align: _(\"gridAlign\"),\n        columns: _.entryColumns(),\n        center: {\n            row: true,\n            column: false\n        },\n        padding: {\n            row: _(\"rowPadding\"),\n            column: _(\"columnPadding\")\n        }\n    };\n}\nconst isL = 'item.orient === \"left\"', isR = 'item.orient === \"right\"', isLR = `(${isL} || ${isR})`, isVG = `datum.vgrad && ${isLR}`, baseline = anchorExpr('\"top\"', '\"bottom\"', '\"middle\"'), alignFlip = anchorExpr('\"right\"', '\"left\"', '\"center\"'), exprAlign = `datum.vgrad && ${isR} ? (${alignFlip}) : (${isLR} && !(datum.vgrad && ${isL})) ? \"left\" : ${alignExpr$1}`, exprAnchor = `item._anchor || (${isLR} ? \"middle\" : \"start\")`, exprAngle = `${isVG} ? (${isL} ? -90 : 90) : 0`, exprBaseline = `${isLR} ? (datum.vgrad ? (${isR} ? \"bottom\" : \"top\") : ${baseline}) : \"top\"`;\nfunction legendTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config);\n    const encode = {\n        enter: {\n            opacity: zero\n        },\n        update: {\n            opacity: one,\n            x: {\n                field: {\n                    group: \"padding\"\n                }\n            },\n            y: {\n                field: {\n                    group: \"padding\"\n                }\n            }\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        orient: _(\"titleOrient\"),\n        _anchor: _(\"titleAnchor\"),\n        anchor: {\n            signal: exprAnchor\n        },\n        angle: {\n            signal: exprAngle\n        },\n        align: {\n            signal: exprAlign\n        },\n        baseline: {\n            signal: exprBaseline\n        },\n        text: spec.title,\n        fill: _(\"titleColor\"),\n        fillOpacity: _(\"titleOpacity\"),\n        font: _(\"titleFont\"),\n        fontSize: _(\"titleFontSize\"),\n        fontStyle: _(\"titleFontStyle\"),\n        fontWeight: _(\"titleFontWeight\"),\n        limit: _(\"titleLimit\"),\n        lineHeight: _(\"titleLineHeight\")\n    }, {\n        // require update\n        align: _(\"titleAlign\"),\n        baseline: _(\"titleBaseline\")\n    });\n    return guideMark({\n        type: TextMark,\n        role: LegendTitleRole,\n        style: GuideTitleStyle,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction clip(clip1, scope) {\n    let expr3;\n    if ((0, _vegaUtil.isObject)(clip1)) {\n        if (clip1.signal) expr3 = clip1.signal;\n        else if (clip1.path) expr3 = \"pathShape(\" + param(clip1.path) + \")\";\n        else if (clip1.sphere) expr3 = \"geoShape(\" + param(clip1.sphere) + ', {type: \"Sphere\"})';\n    }\n    return expr3 ? scope.signalRef(expr3) : !!clip1;\n}\nfunction param(value11) {\n    return (0, _vegaUtil.isObject)(value11) && value11.signal ? value11.signal : (0, _vegaUtil.stringValue)(value11);\n}\nfunction getRole(spec) {\n    const role = spec.role || \"\";\n    return !role.indexOf(\"axis\") || !role.indexOf(\"legend\") || !role.indexOf(\"title\") ? role : spec.type === GroupMark ? ScopeRole : role || MarkRole;\n}\nfunction definition(spec) {\n    return {\n        marktype: spec.type,\n        name: spec.name || undefined,\n        role: spec.role || getRole(spec),\n        zindex: +spec.zindex || undefined,\n        aria: spec.aria,\n        description: spec.description\n    };\n}\nfunction interactive(spec, scope) {\n    return spec && spec.signal ? scope.signalRef(spec.signal) : spec === false ? false : true;\n}\n/**\n * Parse a data transform specification.\n */ function parseTransform(spec, scope) {\n    const def = (0, _vegaDataflow.definition)(spec.type);\n    if (!def) (0, _vegaUtil.error)(\"Unrecognized transform type: \" + (0, _vegaUtil.stringValue)(spec.type));\n    const t = entry(def.type.toLowerCase(), null, parseParameters(def, spec, scope));\n    if (spec.signal) scope.addSignal(spec.signal, scope.proxy(t));\n    t.metadata = def.metadata || {};\n    return t;\n}\n/**\n * Parse all parameters of a data transform.\n */ function parseParameters(def, spec, scope) {\n    const params = {}, n = def.params.length;\n    for(let i = 0; i < n; ++i){\n        const pdef = def.params[i];\n        params[pdef.name] = parseParameter(pdef, spec, scope);\n    }\n    return params;\n}\n/**\n * Parse a data transform parameter.\n */ function parseParameter(def, spec, scope) {\n    const type = def.type, value12 = spec[def.name];\n    if (type === \"index\") return parseIndexParameter(def, spec, scope);\n    else if (value12 === undefined) {\n        if (def.required) (0, _vegaUtil.error)(\"Missing required \" + (0, _vegaUtil.stringValue)(spec.type) + \" parameter: \" + (0, _vegaUtil.stringValue)(def.name));\n        return;\n    } else if (type === \"param\") return parseSubParameters(def, spec, scope);\n    else if (type === \"projection\") return scope.projectionRef(spec[def.name]);\n    return def.array && !isSignal(value12) ? value12.map((v)=>parameterValue(def, v, scope)) : parameterValue(def, value12, scope);\n}\n/**\n * Parse a single parameter value.\n */ function parameterValue(def, value13, scope) {\n    const type = def.type;\n    if (isSignal(value13)) return isExpr(type) ? (0, _vegaUtil.error)(\"Expression references can not be signals.\") : isField(type) ? scope.fieldRef(value13) : isCompare(type) ? scope.compareRef(value13) : scope.signalRef(value13.signal);\n    else {\n        const expr4 = def.expr || isField(type);\n        return expr4 && outerExpr(value13) ? scope.exprRef(value13.expr, value13.as) : expr4 && outerField(value13) ? fieldRef$1(value13.field, value13.as) : isExpr(type) ? (0, _vegaFunctions.parseExpression)(value13, scope) : isData(type) ? ref(scope.getData(value13).values) : isField(type) ? fieldRef$1(value13) : isCompare(type) ? scope.compareRef(value13) : value13;\n    }\n}\n/**\n * Parse parameter for accessing an index of another data set.\n */ function parseIndexParameter(def, spec, scope) {\n    if (!(0, _vegaUtil.isString)(spec.from)) (0, _vegaUtil.error)('Lookup \"from\" parameter must be a string literal.');\n    return scope.getData(spec.from).lookupRef(scope, spec.key);\n}\n/**\n * Parse a parameter that contains one or more sub-parameter objects.\n */ function parseSubParameters(def, spec, scope) {\n    const value14 = spec[def.name];\n    if (def.array) {\n        if (!(0, _vegaUtil.isArray)(value14)) // signals not allowed!\n        (0, _vegaUtil.error)(\"Expected an array of sub-parameters. Instead: \" + (0, _vegaUtil.stringValue)(value14));\n        return value14.map((v)=>parseSubParameter(def, v, scope));\n    } else return parseSubParameter(def, value14, scope);\n}\n/**\n * Parse a sub-parameter object.\n */ function parseSubParameter(def, value15, scope) {\n    const n = def.params.length;\n    let pdef; // loop over defs to find matching key\n    for(let i = 0; i < n; ++i){\n        pdef = def.params[i];\n        for(const k in pdef.key)if (pdef.key[k] !== value15[k]) {\n            pdef = null;\n            break;\n        }\n        if (pdef) break;\n    } // raise error if matching key not found\n    if (!pdef) (0, _vegaUtil.error)(\"Unsupported parameter: \" + (0, _vegaUtil.stringValue)(value15)); // parse params, create Params transform, return ref\n    const params = (0, _vegaUtil.extend)(parseParameters(pdef, value15, scope), pdef.key);\n    return ref(scope.add(Params(params)));\n} // -- Utilities -----\nconst outerExpr = (_)=>_ && _.expr;\nconst outerField = (_)=>_ && _.field;\nconst isData = (_)=>_ === \"data\";\nconst isExpr = (_)=>_ === \"expr\";\nconst isField = (_)=>_ === \"field\";\nconst isCompare = (_)=>_ === \"compare\";\nfunction parseData$1(from, group, scope) {\n    let facet, key, op, dataRef, parent; // if no source data, generate singleton datum\n    if (!from) dataRef = ref(scope.add(Collect(null, [\n        {}\n    ])));\n    else if (facet = from.facet) {\n        if (!group) (0, _vegaUtil.error)(\"Only group marks can be faceted.\"); // use pre-faceted source data, if available\n        if (facet.field != null) dataRef = parent = getDataRef(facet, scope);\n        else {\n            // generate facet aggregates if no direct data specification\n            if (!from.data) {\n                op = parseTransform((0, _vegaUtil.extend)({\n                    type: \"aggregate\",\n                    groupby: (0, _vegaUtil.array)(facet.groupby)\n                }, facet.aggregate), scope);\n                op.params.key = scope.keyRef(facet.groupby);\n                op.params.pulse = getDataRef(facet, scope);\n                dataRef = parent = ref(scope.add(op));\n            } else parent = ref(scope.getData(from.data).aggregate);\n            key = scope.keyRef(facet.groupby, true);\n        }\n    } // if not yet defined, get source data reference\n    if (!dataRef) dataRef = getDataRef(from, scope);\n    return {\n        key: key,\n        pulse: dataRef,\n        parent: parent\n    };\n}\nfunction getDataRef(from, scope) {\n    return from.$ref ? from : from.data && from.data.$ref ? from.data : ref(scope.getData(from.data).output);\n}\nfunction DataScope(scope, input, output, values, aggr) {\n    this.scope = scope; // parent scope object\n    this.input = input; // first operator in pipeline (tuple input)\n    this.output = output; // last operator in pipeline (tuple output)\n    this.values = values; // operator for accessing tuples (but not tuple flow)\n    // last aggregate in transform pipeline\n    this.aggregate = aggr; // lookup table of field indices\n    this.index = {};\n}\nDataScope.fromEntries = function(scope, entries) {\n    const n = entries.length, values = entries[n - 1], output = entries[n - 2];\n    let input = entries[0], aggr = null, i = 1;\n    if (input && input.type === \"load\") input = entries[1];\n     // add operator entries to this scope, wire up pulse chain\n    scope.add(entries[0]);\n    for(; i < n; ++i){\n        entries[i].params.pulse = ref(entries[i - 1]);\n        scope.add(entries[i]);\n        if (entries[i].type === \"aggregate\") aggr = entries[i];\n    }\n    return new DataScope(scope, input, output, values, aggr);\n};\nfunction fieldKey(field4) {\n    return (0, _vegaUtil.isString)(field4) ? field4 : null;\n}\nfunction addSortField(scope, p, sort) {\n    const as = aggrField(sort.op, sort.field);\n    let s;\n    if (p.ops) for(let i = 0, n = p.as.length; i < n; ++i){\n        if (p.as[i] === as) return;\n    }\n    else {\n        p.ops = [\n            \"count\"\n        ];\n        p.fields = [\n            null\n        ];\n        p.as = [\n            \"count\"\n        ];\n    }\n    if (sort.op) {\n        p.ops.push((s = sort.op.signal) ? scope.signalRef(s) : sort.op);\n        p.fields.push(scope.fieldRef(sort.field));\n        p.as.push(as);\n    }\n}\nfunction cache(scope, ds, name, optype, field5, counts, index) {\n    const cache1 = ds[name] || (ds[name] = {}), sort = sortKey(counts);\n    let k = fieldKey(field5), v, op;\n    if (k != null) {\n        scope = ds.scope;\n        k = k + (sort ? \"|\" + sort : \"\");\n        v = cache1[k];\n    }\n    if (!v) {\n        const params = counts ? {\n            field: keyFieldRef,\n            pulse: ds.countsRef(scope, field5, counts)\n        } : {\n            field: scope.fieldRef(field5),\n            pulse: ref(ds.output)\n        };\n        if (sort) params.sort = scope.sortRef(counts);\n        op = scope.add(entry(optype, undefined, params));\n        if (index) ds.index[field5] = op;\n        v = ref(op);\n        if (k != null) cache1[k] = v;\n    }\n    return v;\n}\nDataScope.prototype = {\n    countsRef (scope, field6, sort) {\n        const ds = this, cache2 = ds.counts || (ds.counts = {}), k = fieldKey(field6);\n        let v, a, p;\n        if (k != null) {\n            scope = ds.scope;\n            v = cache2[k];\n        }\n        if (!v) {\n            p = {\n                groupby: scope.fieldRef(field6, \"key\"),\n                pulse: ref(ds.output)\n            };\n            if (sort && sort.field) addSortField(scope, p, sort);\n            a = scope.add(Aggregate(p));\n            v = scope.add(Collect({\n                pulse: ref(a)\n            }));\n            v = {\n                agg: a,\n                ref: ref(v)\n            };\n            if (k != null) cache2[k] = v;\n        } else if (sort && sort.field) addSortField(scope, v.agg.params, sort);\n        return v.ref;\n    },\n    tuplesRef () {\n        return ref(this.values);\n    },\n    extentRef (scope, field7) {\n        return cache(scope, this, \"extent\", \"extent\", field7, false);\n    },\n    domainRef (scope, field8) {\n        return cache(scope, this, \"domain\", \"values\", field8, false);\n    },\n    valuesRef (scope, field9, sort) {\n        return cache(scope, this, \"vals\", \"values\", field9, sort || true);\n    },\n    lookupRef (scope, field10) {\n        return cache(scope, this, \"lookup\", \"tupleindex\", field10, false);\n    },\n    indataRef (scope, field11) {\n        return cache(scope, this, \"indata\", \"tupleindex\", field11, true, true);\n    }\n};\nfunction parseFacet(spec, scope, group) {\n    const facet = spec.from.facet, name = facet.name, data = getDataRef(facet, scope);\n    let op;\n    if (!facet.name) (0, _vegaUtil.error)(\"Facet must have a name: \" + (0, _vegaUtil.stringValue)(facet));\n    if (!facet.data) (0, _vegaUtil.error)(\"Facet must reference a data set: \" + (0, _vegaUtil.stringValue)(facet));\n    if (facet.field) op = scope.add(PreFacet({\n        field: scope.fieldRef(facet.field),\n        pulse: data\n    }));\n    else if (facet.groupby) op = scope.add(Facet({\n        key: scope.keyRef(facet.groupby),\n        group: ref(scope.proxy(group.parent)),\n        pulse: data\n    }));\n    else (0, _vegaUtil.error)(\"Facet must specify groupby or field: \" + (0, _vegaUtil.stringValue)(facet));\n     // initialize facet subscope\n    const subscope = scope.fork(), source = subscope.add(Collect()), values = subscope.add(Sieve({\n        pulse: ref(source)\n    }));\n    subscope.addData(name, new DataScope(subscope, source, source, values));\n    subscope.addSignal(\"parent\", null); // parse faceted subflow\n    op.params.subflow = {\n        $subflow: subscope.parse(spec).toRuntime()\n    };\n}\nfunction parseSubflow(spec, scope, input) {\n    const op = scope.add(PreFacet({\n        pulse: input.pulse\n    })), subscope = scope.fork();\n    subscope.add(Sieve());\n    subscope.addSignal(\"parent\", null); // parse group mark subflow\n    op.params.subflow = {\n        $subflow: subscope.parse(spec).toRuntime()\n    };\n}\nfunction parseTrigger(spec, scope, name) {\n    const remove = spec.remove, insert = spec.insert, toggle = spec.toggle, modify = spec.modify, values = spec.values, op = scope.add(operator());\n    const update = \"if(\" + spec.trigger + ',modify(\"' + name + '\",' + [\n        insert,\n        remove,\n        toggle,\n        modify,\n        values\n    ].map((_)=>_ == null ? \"null\" : _).join(\",\") + \"),0)\";\n    const expr5 = (0, _vegaFunctions.parseExpression)(update, scope);\n    op.update = expr5.$expr;\n    op.params = expr5.$params;\n}\nfunction parseMark(spec, scope) {\n    const role = getRole(spec), group = spec.type === GroupMark, facet = spec.from && spec.from.facet, overlap = spec.overlap;\n    let layout = spec.layout || role === ScopeRole || role === FrameRole, ops, op, store, enc, name, layoutRef, boundRef;\n    const nested = role === MarkRole || layout || facet; // resolve input data\n    const input = parseData$1(spec.from, group, scope); // data join to map tuples to visual items\n    op = scope.add(DataJoin({\n        key: input.key || (spec.key ? fieldRef$1(spec.key) : undefined),\n        pulse: input.pulse,\n        clean: !group\n    }));\n    const joinRef = ref(op); // collect visual items\n    op = store = scope.add(Collect({\n        pulse: joinRef\n    })); // connect visual items to scenegraph\n    op = scope.add(Mark({\n        markdef: definition(spec),\n        interactive: interactive(spec.interactive, scope),\n        clip: clip(spec.clip, scope),\n        context: {\n            $context: true\n        },\n        groups: scope.lookup(),\n        parent: scope.signals.parent ? scope.signalRef(\"parent\") : null,\n        index: scope.markpath(),\n        pulse: ref(op)\n    }));\n    const markRef = ref(op); // add visual encoders\n    op = enc = scope.add(Encode(parseEncode(spec.encode, spec.type, role, spec.style, scope, {\n        mod: false,\n        pulse: markRef\n    }))); // monitor parent marks to propagate changes\n    op.params.parent = scope.encode(); // add post-encoding transforms, if defined\n    if (spec.transform) spec.transform.forEach((_)=>{\n        const tx = parseTransform(_, scope), md = tx.metadata;\n        if (md.generates || md.changes) (0, _vegaUtil.error)(\"Mark transforms should not generate new data.\");\n        if (!md.nomod) enc.params.mod = true; // update encode mod handling\n        tx.params.pulse = ref(op);\n        scope.add(op = tx);\n    });\n     // if item sort specified, perform post-encoding\n    if (spec.sort) op = scope.add(SortItems({\n        sort: scope.compareRef(spec.sort),\n        pulse: ref(op)\n    }));\n    const encodeRef = ref(op); // add view layout operator if needed\n    if (facet || layout) {\n        layout = scope.add(ViewLayout({\n            layout: scope.objectProperty(spec.layout),\n            legends: scope.legends,\n            mark: markRef,\n            pulse: encodeRef\n        }));\n        layoutRef = ref(layout);\n    } // compute bounding boxes\n    const bound = scope.add(Bound({\n        mark: markRef,\n        pulse: layoutRef || encodeRef\n    }));\n    boundRef = ref(bound); // if group mark, recurse to parse nested content\n    if (group) {\n        // juggle layout & bounds to ensure they run *after* any faceting transforms\n        if (nested) {\n            ops = scope.operators;\n            ops.pop();\n            if (layout) ops.pop();\n        }\n        scope.pushState(encodeRef, layoutRef || boundRef, joinRef);\n        facet ? parseFacet(spec, scope, input) // explicit facet\n         : nested ? parseSubflow(spec, scope, input) // standard mark group\n         : scope.parse(spec); // guide group, we can avoid nested scopes\n        scope.popState();\n        if (nested) {\n            if (layout) ops.push(layout);\n            ops.push(bound);\n        }\n    } // if requested, add overlap removal transform\n    if (overlap) boundRef = parseOverlap(overlap, boundRef, scope);\n     // render / sieve items\n    const render = scope.add(Render({\n        pulse: boundRef\n    })), sieve = scope.add(Sieve({\n        pulse: ref(render)\n    }, undefined, scope.parent())); // if mark is named, make accessible as reactive geometry\n    // add trigger updates if defined\n    if (spec.name != null) {\n        name = spec.name;\n        scope.addData(name, new DataScope(scope, store, render, sieve));\n        if (spec.on) spec.on.forEach((on)=>{\n            if (on.insert || on.remove || on.toggle) (0, _vegaUtil.error)(\"Marks only support modify triggers.\");\n            parseTrigger(on, scope, name);\n        });\n    }\n}\nfunction parseOverlap(overlap, source, scope) {\n    const method = overlap.method, bound = overlap.bound, sep = overlap.separation;\n    const params = {\n        separation: isSignal(sep) ? scope.signalRef(sep.signal) : sep,\n        method: isSignal(method) ? scope.signalRef(method.signal) : method,\n        pulse: source\n    };\n    if (overlap.order) params.sort = scope.compareRef({\n        field: overlap.order\n    });\n    if (bound) {\n        const tol = bound.tolerance;\n        params.boundTolerance = isSignal(tol) ? scope.signalRef(tol.signal) : +tol;\n        params.boundScale = scope.scaleRef(bound.scale);\n        params.boundOrient = bound.orient;\n    }\n    return ref(scope.add(Overlap(params)));\n}\nfunction parseLegend(spec, scope) {\n    const config = scope.config.legend, encode = spec.encode || {}, _ = lookup(spec, config), legendEncode = encode.legend || {}, name = legendEncode.name || undefined, interactive2 = legendEncode.interactive, style = legendEncode.style, scales = {};\n    let scale6 = 0, entryLayout, params, children; // resolve scales and 'canonical' scale name\n    LegendScales.forEach((s)=>spec[s] ? (scales[s] = spec[s], scale6 = scale6 || spec[s]) : 0);\n    if (!scale6) (0, _vegaUtil.error)(\"Missing valid scale for legend.\"); // resolve legend type (symbol, gradient, or discrete gradient)\n    const type = legendType(spec, scope.scaleType(scale6)); // single-element data source for legend group\n    const datum = {\n        title: spec.title != null,\n        scales: scales,\n        type: type,\n        vgrad: type !== \"symbol\" && _.isVertical()\n    };\n    const dataRef = ref(scope.add(Collect(null, [\n        datum\n    ]))); // encoding properties for legend entry sub-group\n    const entryEncode = {\n        enter: {\n            x: {\n                value: 0\n            },\n            y: {\n                value: 0\n            }\n        }\n    }; // data source for legend values\n    const entryRef = ref(scope.add(LegendEntries(params = {\n        type: type,\n        scale: scope.scaleRef(scale6),\n        count: scope.objectProperty(_(\"tickCount\")),\n        limit: scope.property(_(\"symbolLimit\")),\n        values: scope.objectProperty(spec.values),\n        minstep: scope.property(spec.tickMinStep),\n        formatType: scope.property(spec.formatType),\n        formatSpecifier: scope.property(spec.format)\n    }))); // continuous gradient legend\n    if (type === Gradient) {\n        children = [\n            legendGradient(spec, scale6, config, encode.gradient),\n            legendGradientLabels(spec, config, encode.labels, entryRef)\n        ]; // adjust default tick count based on the gradient length\n        params.count = params.count || scope.signalRef(`max(2,2*floor((${deref(_.gradientLength())})/100))`);\n    } else if (type === Discrete) children = [\n        legendGradientDiscrete(spec, scale6, config, encode.gradient, entryRef),\n        legendGradientLabels(spec, config, encode.labels, entryRef)\n    ];\n    else {\n        // determine legend symbol group layout\n        entryLayout = legendSymbolLayout(spec, config);\n        children = [\n            legendSymbolGroups(spec, config, encode, entryRef, deref(entryLayout.columns))\n        ]; // pass symbol size information to legend entry generator\n        params.size = sizeExpression(spec, scope, children[0].marks);\n    } // generate legend marks\n    children = [\n        guideGroup({\n            role: LegendEntryRole,\n            from: dataRef,\n            encode: entryEncode,\n            marks: children,\n            layout: entryLayout,\n            interactive: interactive2\n        })\n    ]; // include legend title if defined\n    if (datum.title) children.push(legendTitle(spec, config, encode.title, dataRef));\n     // parse legend specification\n    return parseMark(guideGroup({\n        role: LegendRole,\n        from: dataRef,\n        encode: extendEncode(buildLegendEncode(_, spec, config), legendEncode, Skip),\n        marks: children,\n        aria: _(\"aria\"),\n        description: _(\"description\"),\n        zindex: _(\"zindex\"),\n        name,\n        interactive: interactive2,\n        style\n    }), scope);\n}\nfunction legendType(spec, scaleType) {\n    let type = spec.type || Symbols;\n    if (!spec.type && scaleCount(spec) === 1 && (spec.fill || spec.stroke)) type = (0, _vegaScale.isContinuous)(scaleType) ? Gradient : (0, _vegaScale.isDiscretizing)(scaleType) ? Discrete : Symbols;\n    return type !== Gradient ? type : (0, _vegaScale.isDiscretizing)(scaleType) ? Discrete : Gradient;\n}\nfunction scaleCount(spec) {\n    return LegendScales.reduce((count, type)=>count + (spec[type] ? 1 : 0), 0);\n}\nfunction buildLegendEncode(_, spec, config) {\n    const encode = {\n        enter: {},\n        update: {}\n    };\n    addEncoders(encode, {\n        orient: _(\"orient\"),\n        offset: _(\"offset\"),\n        padding: _(\"padding\"),\n        titlePadding: _(\"titlePadding\"),\n        cornerRadius: _(\"cornerRadius\"),\n        fill: _(\"fillColor\"),\n        stroke: _(\"strokeColor\"),\n        strokeWidth: config.strokeWidth,\n        strokeDash: config.strokeDash,\n        x: _(\"legendX\"),\n        y: _(\"legendY\"),\n        // accessibility support\n        format: spec.format,\n        formatType: spec.formatType\n    });\n    return encode;\n}\nfunction sizeExpression(spec, scope, marks) {\n    const size = deref(getChannel(\"size\", spec, marks)), strokeWidth = deref(getChannel(\"strokeWidth\", spec, marks)), fontSize = deref(getFontSize(marks[1].encode, scope, GuideLabelStyle));\n    return (0, _vegaFunctions.parseExpression)(`max(ceil(sqrt(${size})+${strokeWidth}),${fontSize})`, scope);\n}\nfunction getChannel(name, spec, marks) {\n    return spec[name] ? `scale(\"${spec[name]}\",datum)` : getEncoding(name, marks[0].encode);\n}\nfunction getFontSize(encode, scope, style) {\n    return getEncoding(\"fontSize\", encode) || getStyle(\"fontSize\", scope, style);\n}\nconst angleExpr = `item.orient===\"${Left}\"?-90:item.orient===\"${Right}\"?90:0`;\nfunction parseTitle(spec, scope) {\n    spec = (0, _vegaUtil.isString)(spec) ? {\n        text: spec\n    } : spec;\n    const _ = lookup(spec, scope.config.title), encode = spec.encode || {}, userEncode = encode.group || {}, name = userEncode.name || undefined, interactive3 = userEncode.interactive, style = userEncode.style, children = []; // single-element data source for group title\n    const datum = {}, dataRef = ref(scope.add(Collect(null, [\n        datum\n    ]))); // include title text\n    children.push(buildTitle(spec, _, titleEncode(spec), dataRef)); // include subtitle text\n    if (spec.subtitle) children.push(buildSubTitle(spec, _, encode.subtitle, dataRef));\n     // parse title specification\n    return parseMark(guideGroup({\n        role: TitleRole,\n        from: dataRef,\n        encode: groupEncode(_, userEncode),\n        marks: children,\n        aria: _(\"aria\"),\n        description: _(\"description\"),\n        zindex: _(\"zindex\"),\n        name,\n        interactive: interactive3,\n        style\n    }), scope);\n} // provide backwards-compatibility for title custom encode;\n// the top-level encode block has been *deprecated*.\nfunction titleEncode(spec) {\n    const encode = spec.encode;\n    return encode && encode.title || (0, _vegaUtil.extend)({\n        name: spec.name,\n        interactive: spec.interactive,\n        style: spec.style\n    }, encode);\n}\nfunction groupEncode(_, userEncode) {\n    const encode = {\n        enter: {},\n        update: {}\n    };\n    addEncoders(encode, {\n        orient: _(\"orient\"),\n        anchor: _(\"anchor\"),\n        align: {\n            signal: alignExpr$1\n        },\n        angle: {\n            signal: angleExpr\n        },\n        limit: _(\"limit\"),\n        frame: _(\"frame\"),\n        offset: _(\"offset\") || 0,\n        padding: _(\"subtitlePadding\")\n    });\n    return extendEncode(encode, userEncode, Skip);\n}\nfunction buildTitle(spec, _, userEncode, dataRef) {\n    const zero1 = {\n        value: 0\n    }, text = spec.text, encode = {\n        enter: {\n            opacity: zero1\n        },\n        update: {\n            opacity: {\n                value: 1\n            }\n        },\n        exit: {\n            opacity: zero1\n        }\n    };\n    addEncoders(encode, {\n        text: text,\n        align: {\n            signal: \"item.mark.group.align\"\n        },\n        angle: {\n            signal: \"item.mark.group.angle\"\n        },\n        limit: {\n            signal: \"item.mark.group.limit\"\n        },\n        baseline: \"top\",\n        dx: _(\"dx\"),\n        dy: _(\"dy\"),\n        fill: _(\"color\"),\n        font: _(\"font\"),\n        fontSize: _(\"fontSize\"),\n        fontStyle: _(\"fontStyle\"),\n        fontWeight: _(\"fontWeight\"),\n        lineHeight: _(\"lineHeight\")\n    }, {\n        // update\n        align: _(\"align\"),\n        angle: _(\"angle\"),\n        baseline: _(\"baseline\")\n    });\n    return guideMark({\n        type: TextMark,\n        role: TitleTextRole,\n        style: GroupTitleStyle,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction buildSubTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n        value: 0\n    }, text = spec.subtitle, encode = {\n        enter: {\n            opacity: zero2\n        },\n        update: {\n            opacity: {\n                value: 1\n            }\n        },\n        exit: {\n            opacity: zero2\n        }\n    };\n    addEncoders(encode, {\n        text: text,\n        align: {\n            signal: \"item.mark.group.align\"\n        },\n        angle: {\n            signal: \"item.mark.group.angle\"\n        },\n        limit: {\n            signal: \"item.mark.group.limit\"\n        },\n        baseline: \"top\",\n        dx: _(\"dx\"),\n        dy: _(\"dy\"),\n        fill: _(\"subtitleColor\"),\n        font: _(\"subtitleFont\"),\n        fontSize: _(\"subtitleFontSize\"),\n        fontStyle: _(\"subtitleFontStyle\"),\n        fontWeight: _(\"subtitleFontWeight\"),\n        lineHeight: _(\"subtitleLineHeight\")\n    }, {\n        // update\n        align: _(\"align\"),\n        angle: _(\"angle\"),\n        baseline: _(\"baseline\")\n    });\n    return guideMark({\n        type: TextMark,\n        role: TitleSubtitleRole,\n        style: GroupSubtitleStyle,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction parseData(data, scope) {\n    const transforms = [];\n    if (data.transform) data.transform.forEach((tx)=>{\n        transforms.push(parseTransform(tx, scope));\n    });\n    if (data.on) data.on.forEach((on)=>{\n        parseTrigger(on, scope, data.name);\n    });\n    scope.addDataPipeline(data.name, analyze(data, scope, transforms));\n}\n/**\n * Analyze a data pipeline, add needed operators.\n */ function analyze(data, scope, ops) {\n    const output = [];\n    let source = null, modify = false, generate = false, upstream, i, n, t, m;\n    if (data.values) {\n        // hard-wired input data set\n        if (isSignal(data.values) || hasSignal(data.format)) {\n            // if either values is signal or format has signal, use dynamic loader\n            output.push(load(scope, data));\n            output.push(source = collect());\n        } else // otherwise, ingest upon dataflow init\n        output.push(source = collect({\n            $ingest: data.values,\n            $format: data.format\n        }));\n    } else if (data.url) {\n        // load data from external source\n        if (hasSignal(data.url) || hasSignal(data.format)) {\n            // if either url or format has signal, use dynamic loader\n            output.push(load(scope, data));\n            output.push(source = collect());\n        } else // otherwise, request load upon dataflow init\n        output.push(source = collect({\n            $request: data.url,\n            $format: data.format\n        }));\n    } else if (data.source) {\n        // derives from one or more other data sets\n        source = upstream = (0, _vegaUtil.array)(data.source).map((d)=>ref(scope.getData(d).output));\n        output.push(null); // populate later\n    } // scan data transforms, add collectors as needed\n    for(i = 0, n = ops.length; i < n; ++i){\n        t = ops[i];\n        m = t.metadata;\n        if (!source && !m.source) output.push(source = collect());\n        output.push(t);\n        if (m.generates) generate = true;\n        if (m.modifies && !generate) modify = true;\n        if (m.source) source = t;\n        else if (m.changes) source = null;\n    }\n    if (upstream) {\n        n = upstream.length - 1;\n        output[0] = Relay({\n            derive: modify,\n            pulse: n ? upstream : upstream[0]\n        });\n        if (modify || n) // collect derived and multi-pulse tuples\n        output.splice(1, 0, collect());\n    }\n    if (!source) output.push(collect());\n    output.push(Sieve({}));\n    return output;\n}\nfunction collect(values) {\n    const s = Collect({}, values);\n    s.metadata = {\n        source: true\n    };\n    return s;\n}\nfunction load(scope, data) {\n    return Load({\n        url: data.url ? scope.property(data.url) : undefined,\n        async: data.async ? scope.property(data.async) : undefined,\n        values: data.values ? scope.property(data.values) : undefined,\n        format: scope.objectProperty(data.format)\n    });\n}\nconst isX = (orient)=>orient === Bottom || orient === Top; // get sign coefficient based on axis orient\nconst getSign = (orient, a, b)=>isSignal(orient) ? ifLeftTopExpr(orient.signal, a, b) : orient === Left || orient === Top ? a : b; // condition on axis x-direction\nconst ifX = (orient, a, b)=>isSignal(orient) ? ifXEnc(orient.signal, a, b) : isX(orient) ? a : b; // condition on axis y-direction\nconst ifY = (orient, a, b)=>isSignal(orient) ? ifYEnc(orient.signal, a, b) : isX(orient) ? b : a;\nconst ifTop = (orient, a, b)=>isSignal(orient) ? ifTopExpr(orient.signal, a, b) : orient === Top ? {\n        value: a\n    } : {\n        value: b\n    };\nconst ifRight = (orient, a, b)=>isSignal(orient) ? ifRightExpr(orient.signal, a, b) : orient === Right ? {\n        value: a\n    } : {\n        value: b\n    };\nconst ifXEnc = ($orient, a, b)=>ifEnc(`${$orient} === '${Top}' || ${$orient} === '${Bottom}'`, a, b);\nconst ifYEnc = ($orient, a, b)=>ifEnc(`${$orient} !== '${Top}' && ${$orient} !== '${Bottom}'`, a, b);\nconst ifLeftTopExpr = ($orient, a, b)=>ifExpr(`${$orient} === '${Left}' || ${$orient} === '${Top}'`, a, b);\nconst ifTopExpr = ($orient, a, b)=>ifExpr(`${$orient} === '${Top}'`, a, b);\nconst ifRightExpr = ($orient, a, b)=>ifExpr(`${$orient} === '${Right}'`, a, b);\nconst ifEnc = (test, a, b)=>{\n    // ensure inputs are encoder objects (or null)\n    a = a != null ? encoder(a) : a;\n    b = b != null ? encoder(b) : b;\n    if (isSimple(a) && isSimple(b)) {\n        // if possible generate simple signal expression\n        a = a ? a.signal || (0, _vegaUtil.stringValue)(a.value) : null;\n        b = b ? b.signal || (0, _vegaUtil.stringValue)(b.value) : null;\n        return {\n            signal: `${test} ? (${a}) : (${b})`\n        };\n    } else // otherwise generate rule set\n    return [\n        (0, _vegaUtil.extend)({\n            test\n        }, a)\n    ].concat(b || []);\n};\nconst isSimple = (enc)=>enc == null || Object.keys(enc).length === 1;\nconst ifExpr = (test, a, b)=>({\n        signal: `${test} ? (${toExpr(a)}) : (${toExpr(b)})`\n    });\nconst ifOrient = ($orient, t, b, l, r)=>({\n        signal: (l != null ? `${$orient} === '${Left}' ? (${toExpr(l)}) : ` : \"\") + (b != null ? `${$orient} === '${Bottom}' ? (${toExpr(b)}) : ` : \"\") + (r != null ? `${$orient} === '${Right}' ? (${toExpr(r)}) : ` : \"\") + (t != null ? `${$orient} === '${Top}' ? (${toExpr(t)}) : ` : \"\") + \"(null)\"\n    });\nconst toExpr = (v)=>isSignal(v) ? v.signal : v == null ? null : (0, _vegaUtil.stringValue)(v);\nconst mult = (sign, value16)=>value16 === 0 ? 0 : isSignal(sign) ? {\n        signal: `(${sign.signal}) * ${value16}`\n    } : {\n        value: sign * value16\n    };\nconst patch = (value17, base)=>{\n    const s = value17.signal;\n    return s && s.endsWith(\"(null)\") ? {\n        signal: s.slice(0, -6) + base.signal\n    } : value17;\n};\nfunction fallback(prop, config, axisConfig1, style) {\n    let styleProp;\n    if (config && (0, _vegaUtil.hasOwnProperty)(config, prop)) return config[prop];\n    else if ((0, _vegaUtil.hasOwnProperty)(axisConfig1, prop)) return axisConfig1[prop];\n    else if (prop.startsWith(\"title\")) {\n        switch(prop){\n            case \"titleColor\":\n                styleProp = \"fill\";\n                break;\n            case \"titleFont\":\n            case \"titleFontSize\":\n            case \"titleFontWeight\":\n                styleProp = prop[5].toLowerCase() + prop.slice(6);\n        }\n        return style[GuideTitleStyle][styleProp];\n    } else if (prop.startsWith(\"label\")) {\n        switch(prop){\n            case \"labelColor\":\n                styleProp = \"fill\";\n                break;\n            case \"labelFont\":\n            case \"labelFontSize\":\n                styleProp = prop[5].toLowerCase() + prop.slice(6);\n        }\n        return style[GuideLabelStyle][styleProp];\n    }\n    return null;\n}\nfunction keys(objects) {\n    const map = {};\n    for (const obj of objects){\n        if (!obj) continue;\n        for(const key in obj)map[key] = 1;\n    }\n    return Object.keys(map);\n}\nfunction axisConfig(spec, scope) {\n    var config = scope.config, style = config.style, axis = config.axis, band = scope.scaleType(spec.scale) === \"band\" && config.axisBand, orient = spec.orient, xy, or, key;\n    if (isSignal(orient)) {\n        const xyKeys = keys([\n            config.axisX,\n            config.axisY\n        ]), orientKeys = keys([\n            config.axisTop,\n            config.axisBottom,\n            config.axisLeft,\n            config.axisRight\n        ]);\n        xy = {};\n        for (key of xyKeys)xy[key] = ifX(orient, fallback(key, config.axisX, axis, style), fallback(key, config.axisY, axis, style));\n        or = {};\n        for (key of orientKeys)or[key] = ifOrient(orient.signal, fallback(key, config.axisTop, axis, style), fallback(key, config.axisBottom, axis, style), fallback(key, config.axisLeft, axis, style), fallback(key, config.axisRight, axis, style));\n    } else {\n        xy = orient === Top || orient === Bottom ? config.axisX : config.axisY;\n        or = config[\"axis\" + orient[0].toUpperCase() + orient.slice(1)];\n    }\n    const result = xy || or || band ? (0, _vegaUtil.extend)({}, axis, xy, or, band) : axis;\n    return result;\n}\nfunction axisDomain(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient;\n    let enter, update;\n    const encode = {\n        enter: enter = {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"domainColor\"),\n        strokeCap: _(\"domainCap\"),\n        strokeDash: _(\"domainDash\"),\n        strokeDashOffset: _(\"domainDashOffset\"),\n        strokeWidth: _(\"domainWidth\"),\n        strokeOpacity: _(\"domainOpacity\")\n    });\n    const pos0 = position(spec, 0);\n    const pos1 = position(spec, 1);\n    enter.x = update.x = ifX(orient, pos0, zero);\n    enter.x2 = update.x2 = ifX(orient, pos1);\n    enter.y = update.y = ifY(orient, pos0, zero);\n    enter.y2 = update.y2 = ifY(orient, pos1);\n    return guideMark({\n        type: RuleMark,\n        role: AxisDomainRole,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction position(spec, pos) {\n    return {\n        scale: spec.scale,\n        range: pos\n    };\n}\nfunction axisGrid(spec, config, userEncode, dataRef, band) {\n    const _ = lookup(spec, config), orient = spec.orient, vscale = spec.gridScale, sign = getSign(orient, 1, -1), offset = offsetValue(spec.offset, sign);\n    let enter, exit, update;\n    const encode = {\n        enter: enter = {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one\n        },\n        exit: exit = {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"gridColor\"),\n        strokeCap: _(\"gridCap\"),\n        strokeDash: _(\"gridDash\"),\n        strokeDashOffset: _(\"gridDashOffset\"),\n        strokeOpacity: _(\"gridOpacity\"),\n        strokeWidth: _(\"gridWidth\")\n    });\n    const tickPos = {\n        scale: spec.scale,\n        field: Value,\n        band: band.band,\n        extra: band.extra,\n        offset: band.offset,\n        round: _(\"tickRound\")\n    };\n    const sz = ifX(orient, {\n        signal: \"height\"\n    }, {\n        signal: \"width\"\n    });\n    const gridStart = vscale ? {\n        scale: vscale,\n        range: 0,\n        mult: sign,\n        offset: offset\n    } : {\n        value: 0,\n        offset: offset\n    };\n    const gridEnd = vscale ? {\n        scale: vscale,\n        range: 1,\n        mult: sign,\n        offset: offset\n    } : (0, _vegaUtil.extend)(sz, {\n        mult: sign,\n        offset: offset\n    });\n    enter.x = update.x = ifX(orient, tickPos, gridStart);\n    enter.y = update.y = ifY(orient, tickPos, gridStart);\n    enter.x2 = update.x2 = ifY(orient, gridEnd);\n    enter.y2 = update.y2 = ifX(orient, gridEnd);\n    exit.x = ifX(orient, tickPos);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n        type: RuleMark,\n        role: AxisGridRole,\n        key: Value,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction offsetValue(offset, sign) {\n    if (sign === 1) ;\n    else if (!(0, _vegaUtil.isObject)(offset)) offset = isSignal(sign) ? {\n        signal: `(${sign.signal}) * (${offset || 0})`\n    } : sign * (offset || 0);\n    else {\n        let entry6 = offset = (0, _vegaUtil.extend)({}, offset);\n        while(entry6.mult != null)if (!(0, _vegaUtil.isObject)(entry6.mult)) {\n            entry6.mult = isSignal(sign) // no offset if sign === 1\n             ? {\n                signal: `(${entry6.mult}) * (${sign.signal})`\n            } : entry6.mult * sign;\n            return offset;\n        } else entry6 = entry6.mult = (0, _vegaUtil.extend)({}, entry6.mult);\n        entry6.mult = sign;\n    }\n    return offset;\n}\nfunction axisTicks(spec, config, userEncode, dataRef, size, band) {\n    const _ = lookup(spec, config), orient = spec.orient, sign = getSign(orient, -1, 1);\n    let enter, exit, update;\n    const encode = {\n        enter: enter = {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one\n        },\n        exit: exit = {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"tickColor\"),\n        strokeCap: _(\"tickCap\"),\n        strokeDash: _(\"tickDash\"),\n        strokeDashOffset: _(\"tickDashOffset\"),\n        strokeOpacity: _(\"tickOpacity\"),\n        strokeWidth: _(\"tickWidth\")\n    });\n    const tickSize = encoder(size);\n    tickSize.mult = sign;\n    const tickPos = {\n        scale: spec.scale,\n        field: Value,\n        band: band.band,\n        extra: band.extra,\n        offset: band.offset,\n        round: _(\"tickRound\")\n    };\n    update.y = enter.y = ifX(orient, zero, tickPos);\n    update.y2 = enter.y2 = ifX(orient, tickSize);\n    exit.x = ifX(orient, tickPos);\n    update.x = enter.x = ifY(orient, zero, tickPos);\n    update.x2 = enter.x2 = ifY(orient, tickSize);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n        type: RuleMark,\n        role: AxisTickRole,\n        key: Value,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction flushExpr(scale7, threshold, a, b, c) {\n    return {\n        signal: 'flush(range(\"' + scale7 + '\"), ' + 'scale(\"' + scale7 + '\", datum.value), ' + threshold + \",\" + a + \",\" + b + \",\" + c + \")\"\n    };\n}\nfunction axisLabels(spec, config, userEncode, dataRef, size, band) {\n    const _ = lookup(spec, config), orient = spec.orient, scale8 = spec.scale, sign = getSign(orient, -1, 1), flush = deref(_(\"labelFlush\")), flushOffset = deref(_(\"labelFlushOffset\")), labelAlign = _(\"labelAlign\"), labelBaseline = _(\"labelBaseline\");\n    let flushOn = flush === 0 || !!flush, update;\n    const tickSize = encoder(size);\n    tickSize.mult = sign;\n    tickSize.offset = encoder(_(\"labelPadding\") || 0);\n    tickSize.offset.mult = sign;\n    const tickPos = {\n        scale: scale8,\n        field: Value,\n        band: 0.5,\n        offset: extendOffset(band.offset, _(\"labelOffset\"))\n    };\n    const align = ifX(orient, flushOn ? flushExpr(scale8, flush, '\"left\"', '\"right\"', '\"center\"') : {\n        value: \"center\"\n    }, ifRight(orient, \"left\", \"right\"));\n    const baseline1 = ifX(orient, ifTop(orient, \"bottom\", \"top\"), flushOn ? flushExpr(scale8, flush, '\"top\"', '\"bottom\"', '\"middle\"') : {\n        value: \"middle\"\n    });\n    const offsetExpr = flushExpr(scale8, flush, `-(${flushOffset})`, flushOffset, 0);\n    flushOn = flushOn && flushOffset;\n    const enter = {\n        opacity: zero,\n        x: ifX(orient, tickPos, tickSize),\n        y: ifY(orient, tickPos, tickSize)\n    };\n    const encode = {\n        enter: enter,\n        update: update = {\n            opacity: one,\n            text: {\n                field: Label\n            },\n            x: enter.x,\n            y: enter.y,\n            align,\n            baseline: baseline1\n        },\n        exit: {\n            opacity: zero,\n            x: enter.x,\n            y: enter.y\n        }\n    };\n    addEncoders(encode, {\n        dx: !labelAlign && flushOn ? ifX(orient, offsetExpr) : null,\n        dy: !labelBaseline && flushOn ? ifY(orient, offsetExpr) : null\n    });\n    addEncoders(encode, {\n        angle: _(\"labelAngle\"),\n        fill: _(\"labelColor\"),\n        fillOpacity: _(\"labelOpacity\"),\n        font: _(\"labelFont\"),\n        fontSize: _(\"labelFontSize\"),\n        fontWeight: _(\"labelFontWeight\"),\n        fontStyle: _(\"labelFontStyle\"),\n        limit: _(\"labelLimit\"),\n        lineHeight: _(\"labelLineHeight\")\n    }, {\n        align: labelAlign,\n        baseline: labelBaseline\n    });\n    const bound = _(\"labelBound\");\n    let overlap = _(\"labelOverlap\"); // if overlap method or bound defined, request label overlap removal\n    overlap = overlap || bound ? {\n        separation: _(\"labelSeparation\"),\n        method: overlap,\n        order: \"datum.index\",\n        bound: bound ? {\n            scale: scale8,\n            orient,\n            tolerance: bound\n        } : null\n    } : undefined;\n    if (update.align !== align) update.align = patch(update.align, align);\n    if (update.baseline !== baseline1) update.baseline = patch(update.baseline, baseline1);\n    return guideMark({\n        type: TextMark,\n        role: AxisLabelRole,\n        style: GuideLabelStyle,\n        key: Value,\n        from: dataRef,\n        encode,\n        overlap\n    }, userEncode);\n}\nfunction axisTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient, sign = getSign(orient, -1, 1);\n    let enter, update;\n    const encode = {\n        enter: enter = {\n            opacity: zero,\n            anchor: encoder(_(\"titleAnchor\", null)),\n            align: {\n                signal: alignExpr$1\n            }\n        },\n        update: update = (0, _vegaUtil.extend)({}, enter, {\n            opacity: one,\n            text: encoder(spec.title)\n        }),\n        exit: {\n            opacity: zero\n        }\n    };\n    const titlePos = {\n        signal: `lerp(range(\"${spec.scale}\"), ${anchorExpr(0, 1, 0.5)})`\n    };\n    update.x = ifX(orient, titlePos);\n    update.y = ifY(orient, titlePos);\n    enter.angle = ifX(orient, zero, mult(sign, 90));\n    enter.baseline = ifX(orient, ifTop(orient, Bottom, Top), {\n        value: Bottom\n    });\n    update.angle = enter.angle;\n    update.baseline = enter.baseline;\n    addEncoders(encode, {\n        fill: _(\"titleColor\"),\n        fillOpacity: _(\"titleOpacity\"),\n        font: _(\"titleFont\"),\n        fontSize: _(\"titleFontSize\"),\n        fontStyle: _(\"titleFontStyle\"),\n        fontWeight: _(\"titleFontWeight\"),\n        limit: _(\"titleLimit\"),\n        lineHeight: _(\"titleLineHeight\")\n    }, {\n        // require update\n        align: _(\"titleAlign\"),\n        angle: _(\"titleAngle\"),\n        baseline: _(\"titleBaseline\")\n    });\n    autoLayout(_, orient, encode, userEncode);\n    encode.update.align = patch(encode.update.align, enter.align);\n    encode.update.angle = patch(encode.update.angle, enter.angle);\n    encode.update.baseline = patch(encode.update.baseline, enter.baseline);\n    return guideMark({\n        type: TextMark,\n        role: AxisTitleRole,\n        style: GuideTitleStyle,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction autoLayout(_, orient, encode, userEncode) {\n    const auto = (value18, dim)=>value18 != null ? (encode.update[dim] = patch(encoder(value18), encode.update[dim]), false) : !has(dim, userEncode) ? true : false;\n    const autoY = auto(_(\"titleX\"), \"x\"), autoX = auto(_(\"titleY\"), \"y\");\n    encode.enter.auto = autoX === autoY ? encoder(autoX) : ifX(orient, encoder(autoX), encoder(autoY));\n}\nfunction parseAxis(spec, scope) {\n    const config = axisConfig(spec, scope), encode = spec.encode || {}, axisEncode = encode.axis || {}, name = axisEncode.name || undefined, interactive4 = axisEncode.interactive, style = axisEncode.style, _ = lookup(spec, config), band = tickBand(_); // single-element data source for axis group\n    const datum = {\n        scale: spec.scale,\n        ticks: !!_(\"ticks\"),\n        labels: !!_(\"labels\"),\n        grid: !!_(\"grid\"),\n        domain: !!_(\"domain\"),\n        title: spec.title != null\n    };\n    const dataRef = ref(scope.add(Collect({}, [\n        datum\n    ]))); // data source for axis ticks\n    const ticksRef = ref(scope.add(AxisTicks({\n        scale: scope.scaleRef(spec.scale),\n        extra: scope.property(band.extra),\n        count: scope.objectProperty(spec.tickCount),\n        values: scope.objectProperty(spec.values),\n        minstep: scope.property(spec.tickMinStep),\n        formatType: scope.property(spec.formatType),\n        formatSpecifier: scope.property(spec.format)\n    }))); // generate axis marks\n    const children = [];\n    let size; // include axis gridlines if requested\n    if (datum.grid) children.push(axisGrid(spec, config, encode.grid, ticksRef, band));\n     // include axis ticks if requested\n    if (datum.ticks) {\n        size = _(\"tickSize\");\n        children.push(axisTicks(spec, config, encode.ticks, ticksRef, size, band));\n    } // include axis labels if requested\n    if (datum.labels) {\n        size = datum.ticks ? size : 0;\n        children.push(axisLabels(spec, config, encode.labels, ticksRef, size, band));\n    } // include axis domain path if requested\n    if (datum.domain) children.push(axisDomain(spec, config, encode.domain, dataRef));\n     // include axis title if defined\n    if (datum.title) children.push(axisTitle(spec, config, encode.title, dataRef));\n     // parse axis specification\n    return parseMark(guideGroup({\n        role: AxisRole,\n        from: dataRef,\n        encode: extendEncode(buildAxisEncode(_, spec), axisEncode, Skip),\n        marks: children,\n        aria: _(\"aria\"),\n        description: _(\"description\"),\n        zindex: _(\"zindex\"),\n        name,\n        interactive: interactive4,\n        style\n    }), scope);\n}\nfunction buildAxisEncode(_, spec) {\n    const encode = {\n        enter: {},\n        update: {}\n    };\n    addEncoders(encode, {\n        orient: _(\"orient\"),\n        offset: _(\"offset\") || 0,\n        position: value(spec.position, 0),\n        titlePadding: _(\"titlePadding\"),\n        minExtent: _(\"minExtent\"),\n        maxExtent: _(\"maxExtent\"),\n        range: {\n            signal: `abs(span(range(\"${spec.scale}\")))`\n        },\n        translate: _(\"translate\"),\n        // accessibility support\n        format: spec.format,\n        formatType: spec.formatType\n    });\n    return encode;\n}\nfunction parseScope(spec, scope, preprocessed) {\n    const signals = (0, _vegaUtil.array)(spec.signals), scales = (0, _vegaUtil.array)(spec.scales); // parse signal definitions, if not already preprocessed\n    if (!preprocessed) signals.forEach((_)=>parseSignal(_, scope)); // parse cartographic projection definitions\n    (0, _vegaUtil.array)(spec.projections).forEach((_)=>parseProjection(_, scope)); // initialize scale references\n    scales.forEach((_)=>initScale(_, scope)); // parse data sources\n    (0, _vegaUtil.array)(spec.data).forEach((_)=>parseData(_, scope)); // parse scale definitions\n    scales.forEach((_)=>parseScale(_, scope)); // parse signal updates\n    (preprocessed || signals).forEach((_)=>parseSignalUpdates(_, scope)); // parse axis definitions\n    (0, _vegaUtil.array)(spec.axes).forEach((_)=>parseAxis(_, scope)); // parse mark definitions\n    (0, _vegaUtil.array)(spec.marks).forEach((_)=>parseMark(_, scope)); // parse legend definitions\n    (0, _vegaUtil.array)(spec.legends).forEach((_)=>parseLegend(_, scope)); // parse title, if defined\n    if (spec.title) parseTitle(spec.title, scope); // parse collected lambda (anonymous) expressions\n    scope.parseLambdas();\n    return scope;\n}\nconst rootEncode = (spec)=>extendEncode({\n        enter: {\n            x: {\n                value: 0\n            },\n            y: {\n                value: 0\n            }\n        },\n        update: {\n            width: {\n                signal: \"width\"\n            },\n            height: {\n                signal: \"height\"\n            }\n        }\n    }, spec);\nfunction parseView(spec, scope) {\n    const config = scope.config; // add scenegraph root\n    const root = ref(scope.root = scope.add(operator())); // parse top-level signal definitions\n    const signals = collectSignals(spec, config);\n    signals.forEach((_)=>parseSignal(_, scope)); // assign description, event, legend, and locale configuration\n    scope.description = spec.description || config.description;\n    scope.eventConfig = config.events;\n    scope.legends = scope.objectProperty(config.legend && config.legend.layout);\n    scope.locale = config.locale; // store root group item\n    const input = scope.add(Collect()); // encode root group item\n    const encode = scope.add(Encode(parseEncode(rootEncode(spec.encode), GroupMark, FrameRole, spec.style, scope, {\n        pulse: ref(input)\n    }))); // perform view layout\n    const parent = scope.add(ViewLayout({\n        layout: scope.objectProperty(spec.layout),\n        legends: scope.legends,\n        autosize: scope.signalRef(\"autosize\"),\n        mark: root,\n        pulse: ref(encode)\n    }));\n    scope.operators.pop(); // parse remainder of specification\n    scope.pushState(ref(encode), ref(parent), null);\n    parseScope(spec, scope, signals);\n    scope.operators.push(parent); // bound / render / sieve root item\n    let op = scope.add(Bound({\n        mark: root,\n        pulse: ref(parent)\n    }));\n    op = scope.add(Render({\n        pulse: ref(op)\n    }));\n    op = scope.add(Sieve({\n        pulse: ref(op)\n    })); // track metadata for root item\n    scope.addData(\"root\", new DataScope(scope, input, input, op));\n    return scope;\n}\nfunction signalObject(name, value19) {\n    return value19 && value19.signal ? {\n        name,\n        update: value19.signal\n    } : {\n        name,\n        value: value19\n    };\n}\n/**\n * Collect top-level signals, merging values as needed. Signals\n * defined in the config signals arrays are added only if that\n * signal is not explicitly defined in the specification.\n * Built-in signals (autosize, background, padding, width, height)\n * receive special treatment. They are initialized using the\n * top-level spec property, or, if undefined in the spec, using\n * the corresponding top-level config property. If this property\n * is a signal reference object, the signal expression maps to the\n * signal 'update' property. If the spec's top-level signal array\n * contains an entry that matches a built-in signal, that entry\n * will be merged with the built-in specification, potentially\n * overwriting existing 'value' or 'update' properties.\n */ function collectSignals(spec, config) {\n    const _ = (name)=>value(spec[name], config[name]), signals = [\n        signalObject(\"background\", _(\"background\")),\n        signalObject(\"autosize\", parseAutosize(_(\"autosize\"))),\n        signalObject(\"padding\", parsePadding(_(\"padding\"))),\n        signalObject(\"width\", _(\"width\") || 0),\n        signalObject(\"height\", _(\"height\") || 0)\n    ], pre = signals.reduce((p, s)=>(p[s.name] = s, p), {}), map = {}; // add spec signal array\n    (0, _vegaUtil.array)(spec.signals).forEach((s)=>{\n        if ((0, _vegaUtil.hasOwnProperty)(pre, s.name)) // merge if built-in signal\n        s = (0, _vegaUtil.extend)(pre[s.name], s);\n        else // otherwise add to signal list\n        signals.push(s);\n        map[s.name] = s;\n    }); // add config signal array\n    (0, _vegaUtil.array)(config.signals).forEach((s)=>{\n        if (!(0, _vegaUtil.hasOwnProperty)(map, s.name) && !(0, _vegaUtil.hasOwnProperty)(pre, s.name)) // add to signal list if not already defined\n        signals.push(s);\n    });\n    return signals;\n}\nfunction Scope(config, options) {\n    this.config = config || {};\n    this.options = options || {};\n    this.bindings = [];\n    this.field = {};\n    this.signals = {};\n    this.lambdas = {};\n    this.scales = {};\n    this.events = {};\n    this.data = {};\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this.eventConfig = null;\n    this.locale = null;\n    this._id = 0;\n    this._subid = 0;\n    this._nextsub = [\n        0\n    ];\n    this._parent = [];\n    this._encode = [];\n    this._lookup = [];\n    this._markpath = [];\n}\nfunction Subscope(scope) {\n    this.config = scope.config;\n    this.options = scope.options;\n    this.legends = scope.legends;\n    this.field = Object.create(scope.field);\n    this.signals = Object.create(scope.signals);\n    this.lambdas = Object.create(scope.lambdas);\n    this.scales = Object.create(scope.scales);\n    this.events = Object.create(scope.events);\n    this.data = Object.create(scope.data);\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this._id = 0;\n    this._subid = ++scope._nextsub[0];\n    this._nextsub = scope._nextsub;\n    this._parent = scope._parent.slice();\n    this._encode = scope._encode.slice();\n    this._lookup = scope._lookup.slice();\n    this._markpath = scope._markpath;\n}\nScope.prototype = Subscope.prototype = {\n    parse (spec) {\n        return parseScope(spec, this);\n    },\n    fork () {\n        return new Subscope(this);\n    },\n    isSubscope () {\n        return this._subid > 0;\n    },\n    toRuntime () {\n        this.finish();\n        return {\n            description: this.description,\n            operators: this.operators,\n            streams: this.streams,\n            updates: this.updates,\n            bindings: this.bindings,\n            eventConfig: this.eventConfig,\n            locale: this.locale\n        };\n    },\n    id () {\n        return (this._subid ? this._subid + \":\" : 0) + this._id++;\n    },\n    add (op) {\n        this.operators.push(op);\n        op.id = this.id(); // if pre-registration references exist, resolve them now\n        if (op.refs) {\n            op.refs.forEach((ref5)=>{\n                ref5.$ref = op.id;\n            });\n            op.refs = null;\n        }\n        return op;\n    },\n    proxy (op) {\n        const vref = op instanceof Entry ? ref(op) : op;\n        return this.add(Proxy({\n            value: vref\n        }));\n    },\n    addStream (stream) {\n        this.streams.push(stream);\n        stream.id = this.id();\n        return stream;\n    },\n    addUpdate (update) {\n        this.updates.push(update);\n        return update;\n    },\n    // Apply metadata\n    finish () {\n        let name3, ds; // annotate root\n        if (this.root) this.root.root = true; // annotate signals\n        for(name3 in this.signals)this.signals[name3].signal = name3;\n         // annotate scales\n        for(name3 in this.scales)this.scales[name3].scale = name3;\n         // annotate data sets\n        function annotate(op, name, type) {\n            let data, list;\n            if (op) {\n                data = op.data || (op.data = {});\n                list = data[name] || (data[name] = []);\n                list.push(type);\n            }\n        }\n        for(name3 in this.data){\n            ds = this.data[name3];\n            annotate(ds.input, name3, \"input\");\n            annotate(ds.output, name3, \"output\");\n            annotate(ds.values, name3, \"values\");\n            for(const field12 in ds.index)annotate(ds.index[field12], name3, \"index:\" + field12);\n        }\n        return this;\n    },\n    // ----\n    pushState (encode, parent, lookup1) {\n        this._encode.push(ref(this.add(Sieve({\n            pulse: encode\n        }))));\n        this._parent.push(parent);\n        this._lookup.push(lookup1 ? ref(this.proxy(lookup1)) : null);\n        this._markpath.push(-1);\n    },\n    popState () {\n        this._encode.pop();\n        this._parent.pop();\n        this._lookup.pop();\n        this._markpath.pop();\n    },\n    parent () {\n        return (0, _vegaUtil.peek)(this._parent);\n    },\n    encode () {\n        return (0, _vegaUtil.peek)(this._encode);\n    },\n    lookup () {\n        return (0, _vegaUtil.peek)(this._lookup);\n    },\n    markpath () {\n        const p = this._markpath;\n        return ++p[p.length - 1];\n    },\n    // ----\n    fieldRef (field13, name) {\n        if ((0, _vegaUtil.isString)(field13)) return fieldRef$1(field13, name);\n        if (!field13.signal) (0, _vegaUtil.error)(\"Unsupported field reference: \" + (0, _vegaUtil.stringValue)(field13));\n        const s = field13.signal;\n        let f = this.field[s];\n        if (!f) {\n            const params = {\n                name: this.signalRef(s)\n            };\n            if (name) params.as = name;\n            this.field[s] = f = ref(this.add(Field(params)));\n        }\n        return f;\n    },\n    compareRef (cmp) {\n        let signal = false;\n        const check = (_)=>isSignal(_) ? (signal = true, this.signalRef(_.signal)) : isExpr$1(_) ? (signal = true, this.exprRef(_.expr)) : _;\n        const fields = (0, _vegaUtil.array)(cmp.field).map(check), orders = (0, _vegaUtil.array)(cmp.order).map(check);\n        return signal ? ref(this.add(Compare({\n            fields: fields,\n            orders: orders\n        }))) : compareRef(fields, orders);\n    },\n    keyRef (fields, flat) {\n        let signal = false;\n        const check = (_)=>isSignal(_) ? (signal = true, ref(sig[_.signal])) : _;\n        const sig = this.signals;\n        fields = (0, _vegaUtil.array)(fields).map(check);\n        return signal ? ref(this.add(Key({\n            fields: fields,\n            flat: flat\n        }))) : keyRef(fields, flat);\n    },\n    sortRef (sort) {\n        if (!sort) return sort; // including id ensures stable sorting\n        const a = aggrField(sort.op, sort.field), o = sort.order || Ascending;\n        return o.signal ? ref(this.add(Compare({\n            fields: a,\n            orders: this.signalRef(o.signal)\n        }))) : compareRef(a, o);\n    },\n    // ----\n    event (source, type) {\n        const key = source + \":\" + type;\n        if (!this.events[key]) {\n            const id = this.id();\n            this.streams.push({\n                id: id,\n                source: source,\n                type: type\n            });\n            this.events[key] = id;\n        }\n        return this.events[key];\n    },\n    // ----\n    hasOwnSignal (name) {\n        return (0, _vegaUtil.hasOwnProperty)(this.signals, name);\n    },\n    addSignal (name, value20) {\n        if (this.hasOwnSignal(name)) (0, _vegaUtil.error)(\"Duplicate signal name: \" + (0, _vegaUtil.stringValue)(name));\n        const op = value20 instanceof Entry ? value20 : this.add(operator(value20));\n        return this.signals[name] = op;\n    },\n    getSignal (name) {\n        if (!this.signals[name]) (0, _vegaUtil.error)(\"Unrecognized signal name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.signals[name];\n    },\n    signalRef (s) {\n        if (this.signals[s]) return ref(this.signals[s]);\n        else if (!(0, _vegaUtil.hasOwnProperty)(this.lambdas, s)) this.lambdas[s] = this.add(operator(null));\n        return ref(this.lambdas[s]);\n    },\n    parseLambdas () {\n        const code = Object.keys(this.lambdas);\n        for(let i = 0, n = code.length; i < n; ++i){\n            const s = code[i], e = (0, _vegaFunctions.parseExpression)(s, this), op = this.lambdas[s];\n            op.params = e.$params;\n            op.update = e.$expr;\n        }\n    },\n    property (spec) {\n        return spec && spec.signal ? this.signalRef(spec.signal) : spec;\n    },\n    objectProperty (spec) {\n        return !spec || !(0, _vegaUtil.isObject)(spec) ? spec : this.signalRef(spec.signal || propertyLambda(spec));\n    },\n    exprRef (code, name) {\n        const params = {\n            expr: (0, _vegaFunctions.parseExpression)(code, this)\n        };\n        if (name) params.expr.$name = name;\n        return ref(this.add(Expression(params)));\n    },\n    addBinding (name, bind) {\n        if (!this.bindings) (0, _vegaUtil.error)(\"Nested signals do not support binding: \" + (0, _vegaUtil.stringValue)(name));\n        this.bindings.push((0, _vegaUtil.extend)({\n            signal: name\n        }, bind));\n    },\n    // ----\n    addScaleProj (name, transform1) {\n        if ((0, _vegaUtil.hasOwnProperty)(this.scales, name)) (0, _vegaUtil.error)(\"Duplicate scale or projection name: \" + (0, _vegaUtil.stringValue)(name));\n        this.scales[name] = this.add(transform1);\n    },\n    addScale (name, params) {\n        this.addScaleProj(name, Scale(params));\n    },\n    addProjection (name, params) {\n        this.addScaleProj(name, Projection(params));\n    },\n    getScale (name) {\n        if (!this.scales[name]) (0, _vegaUtil.error)(\"Unrecognized scale name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.scales[name];\n    },\n    scaleRef (name) {\n        return ref(this.getScale(name));\n    },\n    scaleType (name) {\n        return this.getScale(name).params.type;\n    },\n    projectionRef (name) {\n        return this.scaleRef(name);\n    },\n    projectionType (name) {\n        return this.scaleType(name);\n    },\n    // ----\n    addData (name, dataScope) {\n        if ((0, _vegaUtil.hasOwnProperty)(this.data, name)) (0, _vegaUtil.error)(\"Duplicate data set name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.data[name] = dataScope;\n    },\n    getData (name) {\n        if (!this.data[name]) (0, _vegaUtil.error)(\"Undefined data set name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.data[name];\n    },\n    addDataPipeline (name, entries) {\n        if ((0, _vegaUtil.hasOwnProperty)(this.data, name)) (0, _vegaUtil.error)(\"Duplicate data set name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.addData(name, DataScope.fromEntries(this, entries));\n    }\n};\nfunction propertyLambda(spec) {\n    return ((0, _vegaUtil.isArray)(spec) ? arrayLambda : objectLambda)(spec);\n}\nfunction arrayLambda(array) {\n    const n = array.length;\n    let code = \"[\";\n    for(let i = 0; i < n; ++i){\n        const value21 = array[i];\n        code += (i > 0 ? \",\" : \"\") + ((0, _vegaUtil.isObject)(value21) ? value21.signal || propertyLambda(value21) : (0, _vegaUtil.stringValue)(value21));\n    }\n    return code + \"]\";\n}\nfunction objectLambda(obj) {\n    let code = \"{\", i = 0, key, value22;\n    for(key in obj){\n        value22 = obj[key];\n        code += (++i > 1 ? \",\" : \"\") + (0, _vegaUtil.stringValue)(key) + \":\" + ((0, _vegaUtil.isObject)(value22) ? value22.signal || propertyLambda(value22) : (0, _vegaUtil.stringValue)(value22));\n    }\n    return code + \"}\";\n}\n/**\n * Standard configuration defaults for Vega specification parsing.\n * Users can provide their own (sub-)set of these default values\n * by passing in a config object to the top-level parse method.\n */ function defaults() {\n    const defaultFont = \"sans-serif\", defaultSymbolSize = 30, defaultStrokeWidth = 2, defaultColor = \"#4c78a8\", black = \"#000\", gray = \"#888\", lightGray = \"#ddd\";\n    return {\n        // default visualization description\n        description: \"Vega visualization\",\n        // default padding around visualization\n        padding: 0,\n        // default for automatic sizing; options: 'none', 'pad', 'fit'\n        // or provide an object (e.g., {'type': 'pad', 'resize': true})\n        autosize: \"pad\",\n        // default view background color\n        // covers the entire view component\n        background: null,\n        // default event handling configuration\n        // preventDefault for view-sourced event types except 'wheel'\n        events: {\n            defaults: {\n                allow: [\n                    \"wheel\"\n                ]\n            }\n        },\n        // defaults for top-level group marks\n        // accepts mark properties (fill, stroke, etc)\n        // covers the data rectangle within group width/height\n        group: null,\n        // defaults for basic mark types\n        // each subset accepts mark properties (fill, stroke, etc)\n        mark: null,\n        arc: {\n            fill: defaultColor\n        },\n        area: {\n            fill: defaultColor\n        },\n        image: null,\n        line: {\n            stroke: defaultColor,\n            strokeWidth: defaultStrokeWidth\n        },\n        path: {\n            stroke: defaultColor\n        },\n        rect: {\n            fill: defaultColor\n        },\n        rule: {\n            stroke: black\n        },\n        shape: {\n            stroke: defaultColor\n        },\n        symbol: {\n            fill: defaultColor,\n            size: 64\n        },\n        text: {\n            fill: black,\n            font: defaultFont,\n            fontSize: 11\n        },\n        trail: {\n            fill: defaultColor,\n            size: defaultStrokeWidth\n        },\n        // style definitions\n        style: {\n            // axis & legend labels\n            \"guide-label\": {\n                fill: black,\n                font: defaultFont,\n                fontSize: 10\n            },\n            // axis & legend titles\n            \"guide-title\": {\n                fill: black,\n                font: defaultFont,\n                fontSize: 11,\n                fontWeight: \"bold\"\n            },\n            // headers, including chart title\n            \"group-title\": {\n                fill: black,\n                font: defaultFont,\n                fontSize: 13,\n                fontWeight: \"bold\"\n            },\n            // chart subtitle\n            \"group-subtitle\": {\n                fill: black,\n                font: defaultFont,\n                fontSize: 12\n            },\n            // defaults for styled point marks in Vega-Lite\n            point: {\n                size: defaultSymbolSize,\n                strokeWidth: defaultStrokeWidth,\n                shape: \"circle\"\n            },\n            circle: {\n                size: defaultSymbolSize,\n                strokeWidth: defaultStrokeWidth\n            },\n            square: {\n                size: defaultSymbolSize,\n                strokeWidth: defaultStrokeWidth,\n                shape: \"square\"\n            },\n            // defaults for styled group marks in Vega-Lite\n            cell: {\n                fill: \"transparent\",\n                stroke: lightGray\n            }\n        },\n        // defaults for title\n        title: {\n            orient: \"top\",\n            anchor: \"middle\",\n            offset: 4,\n            subtitlePadding: 3\n        },\n        // defaults for axes\n        axis: {\n            minExtent: 0,\n            maxExtent: 200,\n            bandPosition: 0.5,\n            domain: true,\n            domainWidth: 1,\n            domainColor: gray,\n            grid: false,\n            gridWidth: 1,\n            gridColor: lightGray,\n            labels: true,\n            labelAngle: 0,\n            labelLimit: 180,\n            labelOffset: 0,\n            labelPadding: 2,\n            ticks: true,\n            tickColor: gray,\n            tickOffset: 0,\n            tickRound: true,\n            tickSize: 5,\n            tickWidth: 1,\n            titlePadding: 4\n        },\n        // correction for centering bias\n        axisBand: {\n            tickOffset: -0.5\n        },\n        // defaults for cartographic projection\n        projection: {\n            type: \"mercator\"\n        },\n        // defaults for legends\n        legend: {\n            orient: \"right\",\n            padding: 0,\n            gridAlign: \"each\",\n            columnPadding: 10,\n            rowPadding: 2,\n            symbolDirection: \"vertical\",\n            gradientDirection: \"vertical\",\n            gradientLength: 200,\n            gradientThickness: 16,\n            gradientStrokeColor: lightGray,\n            gradientStrokeWidth: 0,\n            gradientLabelOffset: 2,\n            labelAlign: \"left\",\n            labelBaseline: \"middle\",\n            labelLimit: 160,\n            labelOffset: 4,\n            labelOverlap: true,\n            symbolLimit: 30,\n            symbolType: \"circle\",\n            symbolSize: 100,\n            symbolOffset: 0,\n            symbolStrokeWidth: 1.5,\n            symbolBaseFillColor: \"transparent\",\n            symbolBaseStrokeColor: gray,\n            titleLimit: 180,\n            titleOrient: \"top\",\n            titlePadding: 5,\n            layout: {\n                offset: 18,\n                direction: \"horizontal\",\n                left: {\n                    direction: \"vertical\"\n                },\n                right: {\n                    direction: \"vertical\"\n                }\n            }\n        },\n        // defaults for scale ranges\n        range: {\n            category: {\n                scheme: \"tableau10\"\n            },\n            ordinal: {\n                scheme: \"blues\"\n            },\n            heatmap: {\n                scheme: \"yellowgreenblue\"\n            },\n            ramp: {\n                scheme: \"blues\"\n            },\n            diverging: {\n                scheme: \"blueorange\",\n                extent: [\n                    1,\n                    0\n                ]\n            },\n            symbol: [\n                \"circle\",\n                \"square\",\n                \"triangle-up\",\n                \"cross\",\n                \"diamond\",\n                \"triangle-right\",\n                \"triangle-down\",\n                \"triangle-left\"\n            ]\n        }\n    };\n}\nfunction parse(spec, config, options) {\n    if (!(0, _vegaUtil.isObject)(spec)) (0, _vegaUtil.error)(\"Input Vega specification must be an object.\");\n    config = (0, _vegaUtil.mergeConfig)(defaults(), config, spec.config);\n    return parseView(spec, new Scope(config, options)).toRuntime();\n}\n\n},{\"vega-util\":\"dPFAY\",\"vega-functions\":\"92bWe\",\"vega-event-selector\":\"lNasS\",\"vega-scale\":\"evQIv\",\"vega-dataflow\":\"4kvYg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lNasS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parseSelector\", ()=>eventSelector);\nconst VIEW = \"view\", LBRACK = \"[\", RBRACK = \"]\", LBRACE = \"{\", RBRACE = \"}\", COLON = \":\", COMMA = \",\", NAME = \"@\", GT = \">\", ILLEGAL = /[[\\]{}]/, DEFAULT_MARKS = {\n    \"*\": 1,\n    arc: 1,\n    area: 1,\n    group: 1,\n    image: 1,\n    line: 1,\n    path: 1,\n    rect: 1,\n    rule: 1,\n    shape: 1,\n    symbol: 1,\n    text: 1,\n    trail: 1\n};\nlet DEFAULT_SOURCE, MARKS;\n/**\n * Parse an event selector string.\n * Returns an array of event stream definitions.\n */ function eventSelector(selector, source, marks) {\n    DEFAULT_SOURCE = source || VIEW;\n    MARKS = marks || DEFAULT_MARKS;\n    return parseMerge(selector.trim()).map(parseSelector);\n}\nfunction isMarkType(type) {\n    return MARKS[type];\n}\nfunction find(s, i, endChar, pushChar, popChar) {\n    const n = s.length;\n    let count = 0, c;\n    for(; i < n; ++i){\n        c = s[i];\n        if (!count && c === endChar) return i;\n        else if (popChar && popChar.indexOf(c) >= 0) --count;\n        else if (pushChar && pushChar.indexOf(c) >= 0) ++count;\n    }\n    return i;\n}\nfunction parseMerge(s) {\n    const output = [], n = s.length;\n    let start = 0, i = 0;\n    while(i < n){\n        i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n        output.push(s.substring(start, i).trim());\n        start = ++i;\n    }\n    if (output.length === 0) throw \"Empty event selector: \" + s;\n    return output;\n}\nfunction parseSelector(s) {\n    return s[0] === \"[\" ? parseBetween(s) : parseStream(s);\n}\nfunction parseBetween(s) {\n    const n = s.length;\n    let i = 1, b;\n    i = find(s, i, RBRACK, LBRACK, RBRACK);\n    if (i === n) throw \"Empty between selector: \" + s;\n    b = parseMerge(s.substring(1, i));\n    if (b.length !== 2) throw \"Between selector must have two elements: \" + s;\n    s = s.slice(i + 1).trim();\n    if (s[0] !== GT) throw \"Expected '>' after between selector: \" + s;\n    b = b.map(parseSelector);\n    const stream = parseSelector(s.slice(1).trim());\n    if (stream.between) return {\n        between: b,\n        stream: stream\n    };\n    else stream.between = b;\n    return stream;\n}\nfunction parseStream(s) {\n    const stream = {\n        source: DEFAULT_SOURCE\n    }, source = [];\n    let throttle = [\n        0,\n        0\n    ], markname = 0, start = 0, n = s.length, i = 0, j, filter; // extract throttle from end\n    if (s[n - 1] === RBRACE) {\n        i = s.lastIndexOf(LBRACE);\n        if (i >= 0) {\n            try {\n                throttle = parseThrottle(s.substring(i + 1, n - 1));\n            } catch (e) {\n                throw \"Invalid throttle specification: \" + s;\n            }\n            s = s.slice(0, i).trim();\n            n = s.length;\n        } else throw \"Unmatched right brace: \" + s;\n        i = 0;\n    }\n    if (!n) throw s; // set name flag based on first char\n    if (s[0] === NAME) markname = ++i; // extract first part of multi-part stream selector\n    j = find(s, i, COLON);\n    if (j < n) {\n        source.push(s.substring(start, j).trim());\n        start = i = ++j;\n    } // extract remaining part of stream selector\n    i = find(s, i, LBRACK);\n    if (i === n) source.push(s.substring(start, n).trim());\n    else {\n        source.push(s.substring(start, i).trim());\n        filter = [];\n        start = ++i;\n        if (start === n) throw \"Unmatched left bracket: \" + s;\n    } // extract filters\n    while(i < n){\n        i = find(s, i, RBRACK);\n        if (i === n) throw \"Unmatched left bracket: \" + s;\n        filter.push(s.substring(start, i).trim());\n        if (i < n - 1 && s[++i] !== LBRACK) throw \"Expected left bracket: \" + s;\n        start = ++i;\n    } // marshall event stream specification\n    if (!(n = source.length) || ILLEGAL.test(source[n - 1])) throw \"Invalid event selector: \" + s;\n    if (n > 1) {\n        stream.type = source[1];\n        if (markname) stream.markname = source[0].slice(1);\n        else if (isMarkType(source[0])) stream.marktype = source[0];\n        else stream.source = source[0];\n    } else stream.type = source[0];\n    if (stream.type.slice(-1) === \"!\") {\n        stream.consume = true;\n        stream.type = stream.type.slice(0, -1);\n    }\n    if (filter != null) stream.filter = filter;\n    if (throttle[0]) stream.throttle = throttle[0];\n    if (throttle[1]) stream.debounce = throttle[1];\n    return stream;\n}\nfunction parseThrottle(s) {\n    const a = s.split(COMMA);\n    if (!s.length || a.length > 2) throw s;\n    return a.map((_)=>{\n        const x = +_;\n        if (x !== x) throw s;\n        return x;\n    });\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kqWZH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ASTNode\", ()=>ASTNode);\nparcelHelpers.export(exports, \"ArrayExpression\", ()=>ArrayExpression);\nparcelHelpers.export(exports, \"BinaryExpression\", ()=>BinaryExpression);\nparcelHelpers.export(exports, \"CallExpression\", ()=>CallExpression);\nparcelHelpers.export(exports, \"ConditionalExpression\", ()=>ConditionalExpression);\nparcelHelpers.export(exports, \"Identifier\", ()=>Identifier);\nparcelHelpers.export(exports, \"Literal\", ()=>Literal);\nparcelHelpers.export(exports, \"LogicalExpression\", ()=>LogicalExpression);\nparcelHelpers.export(exports, \"MemberExpression\", ()=>MemberExpression);\nparcelHelpers.export(exports, \"ObjectExpression\", ()=>ObjectExpression);\nparcelHelpers.export(exports, \"Property\", ()=>Property);\nparcelHelpers.export(exports, \"RawCode\", ()=>RawCode);\nparcelHelpers.export(exports, \"UnaryExpression\", ()=>UnaryExpression);\nparcelHelpers.export(exports, \"codegen\", ()=>codegen);\nparcelHelpers.export(exports, \"constants\", ()=>Constants);\nparcelHelpers.export(exports, \"functions\", ()=>Functions);\nparcelHelpers.export(exports, \"parse\", ()=>parser);\nvar _vegaUtil = require(\"vega-util\");\nconst RawCode = \"RawCode\";\nconst Literal = \"Literal\";\nconst Property = \"Property\";\nconst Identifier = \"Identifier\";\nconst ArrayExpression = \"ArrayExpression\";\nconst BinaryExpression = \"BinaryExpression\";\nconst CallExpression = \"CallExpression\";\nconst ConditionalExpression = \"ConditionalExpression\";\nconst LogicalExpression = \"LogicalExpression\";\nconst MemberExpression = \"MemberExpression\";\nconst ObjectExpression = \"ObjectExpression\";\nconst UnaryExpression = \"UnaryExpression\";\nfunction ASTNode(type) {\n    this.type = type;\n}\nASTNode.prototype.visit = function(visitor) {\n    let c, i, n;\n    if (visitor(this)) return 1;\n    for(c = children(this), i = 0, n = c.length; i < n; ++i){\n        if (c[i].visit(visitor)) return 1;\n    }\n};\nfunction children(node) {\n    switch(node.type){\n        case ArrayExpression:\n            return node.elements;\n        case BinaryExpression:\n        case LogicalExpression:\n            return [\n                node.left,\n                node.right\n            ];\n        case CallExpression:\n            return [\n                node.callee\n            ].concat(node.arguments);\n        case ConditionalExpression:\n            return [\n                node.test,\n                node.consequent,\n                node.alternate\n            ];\n        case MemberExpression:\n            return [\n                node.object,\n                node.property\n            ];\n        case ObjectExpression:\n            return node.properties;\n        case Property:\n            return [\n                node.key,\n                node.value\n            ];\n        case UnaryExpression:\n            return [\n                node.argument\n            ];\n        case Identifier:\n        case Literal:\n        case RawCode:\n        default:\n            return [];\n    }\n}\n/*\n  The following expression parser is based on Esprima (http://esprima.org/).\n  Original header comment and license for Esprima is included here:\n\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/ var TokenName, source, index, length, lookahead;\nvar TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\nTokenName = {};\nTokenName[TokenBooleanLiteral] = \"Boolean\";\nTokenName[TokenEOF] = \"<end>\";\nTokenName[TokenIdentifier] = \"Identifier\";\nTokenName[TokenKeyword] = \"Keyword\";\nTokenName[TokenNullLiteral] = \"Null\";\nTokenName[TokenNumericLiteral] = \"Numeric\";\nTokenName[TokenPunctuator] = \"Punctuator\";\nTokenName[TokenStringLiteral] = \"String\";\nTokenName[TokenRegularExpression] = \"RegularExpression\";\nvar SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\"; // Error messages should be identical to V8.\nvar MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\nvar ILLEGAL = \"ILLEGAL\", DISABLED = \"Disabled.\"; // See also tools/generate-unicode-regex.py.\nvar RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), // eslint-disable-next-line no-misleading-character-class\nRegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"); // Ensure the condition is true, otherwise throw an error.\n// This is only to have a better contract semantic, i.e. another safety net\n// to catch a logic error. The condition shall be fulfilled in normal case.\n// Do NOT use this to enforce a certain condition on any user input.\nfunction assert(condition, message) {\n    /* istanbul ignore next */ if (!condition) throw new Error(\"ASSERT: \" + message);\n}\nfunction isDecimalDigit(ch) {\n    return ch >= 0x30 && ch <= 0x39; // 0..9\n}\nfunction isHexDigit(ch) {\n    return \"0123456789abcdefABCDEF\".indexOf(ch) >= 0;\n}\nfunction isOctalDigit(ch) {\n    return \"01234567\".indexOf(ch) >= 0;\n} // 7.2 White Space\nfunction isWhiteSpace(ch) {\n    return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && [\n        0x1680,\n        0x180E,\n        0x2000,\n        0x2001,\n        0x2002,\n        0x2003,\n        0x2004,\n        0x2005,\n        0x2006,\n        0x2007,\n        0x2008,\n        0x2009,\n        0x200A,\n        0x202F,\n        0x205F,\n        0x3000,\n        0xFEFF\n    ].indexOf(ch) >= 0;\n} // 7.3 Line Terminators\nfunction isLineTerminator(ch) {\n    return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;\n} // 7.6 Identifier Names and Identifiers\nfunction isIdentifierStart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch));\n}\nfunction isIdentifierPart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch >= 0x30 && ch <= 0x39 || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch));\n} // 7.6.1.1 Keywords\nconst keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n};\nfunction skipComment() {\n    while(index < length){\n        const ch = source.charCodeAt(index);\n        if (isWhiteSpace(ch) || isLineTerminator(ch)) ++index;\n        else break;\n    }\n}\nfunction scanHexEscape(prefix) {\n    var i, len, ch, code = 0;\n    len = prefix === \"u\" ? 4 : 2;\n    for(i = 0; i < len; ++i)if (index < length && isHexDigit(source[index])) {\n        ch = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    } else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return String.fromCharCode(code);\n}\nfunction scanUnicodeCodePointEscape() {\n    var ch, code, cu1, cu2;\n    ch = source[index];\n    code = 0; // At least, one hex digit is required.\n    if (ch === \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    while(index < length){\n        ch = source[index++];\n        if (!isHexDigit(ch)) break;\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    }\n    if (code > 0x10FFFF || ch !== \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // UTF-16 Encoding\n    if (code <= 0xFFFF) return String.fromCharCode(code);\n    cu1 = (code - 0x10000 >> 10) + 0xD800;\n    cu2 = (code - 0x10000 & 1023) + 0xDC00;\n    return String.fromCharCode(cu1, cu2);\n}\nfunction getEscapedIdentifier() {\n    var ch, id;\n    ch = source.charCodeAt(index++);\n    id = String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n    if (ch === 0x5C) {\n        if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        ++index;\n        ch = scanHexEscape(\"u\");\n        if (!ch || ch === \"\\\\\" || !isIdentifierStart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        id = ch;\n    }\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (!isIdentifierPart(ch)) break;\n        ++index;\n        id += String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n        if (ch === 0x5C) {\n            id = id.substr(0, id.length - 1);\n            if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            ++index;\n            ch = scanHexEscape(\"u\");\n            if (!ch || ch === \"\\\\\" || !isIdentifierPart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            id += ch;\n        }\n    }\n    return id;\n}\nfunction getIdentifier() {\n    var start, ch;\n    start = index++;\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (ch === 0x5C) {\n            // Blackslash (U+005C) marks Unicode escape sequence.\n            index = start;\n            return getEscapedIdentifier();\n        }\n        if (isIdentifierPart(ch)) ++index;\n        else break;\n    }\n    return source.slice(start, index);\n}\nfunction scanIdentifier() {\n    var start, id, type;\n    start = index; // Backslash (U+005C) starts an escaped character.\n    id = source.charCodeAt(index) === 0x5C ? getEscapedIdentifier() : getIdentifier(); // There is no keyword or literal with only one character.\n    // Thus, it must be an identifier.\n    if (id.length === 1) type = TokenIdentifier;\n    else if (keywords.hasOwnProperty(id)) // eslint-disable-line no-prototype-builtins\n    type = TokenKeyword;\n    else if (id === \"null\") type = TokenNullLiteral;\n    else if (id === \"true\" || id === \"false\") type = TokenBooleanLiteral;\n    else type = TokenIdentifier;\n    return {\n        type: type,\n        value: id,\n        start: start,\n        end: index\n    };\n} // 7.7 Punctuators\nfunction scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch(code){\n        // Check for most common single-character punctuators.\n        case 0x2E:\n        case 0x28:\n        case 0x29:\n        case 0x3B:\n        case 0x2C:\n        case 0x7B:\n        case 0x7D:\n        case 0x5B:\n        case 0x5D:\n        case 0x3A:\n        case 0x3F:\n        case 0x7E:\n            // ~\n            ++index;\n            return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code),\n                start: start,\n                end: index\n            };\n        default:\n            code2 = source.charCodeAt(index + 1); // '=' (U+003D) marks an assignment or comparison operator.\n            if (code2 === 0x3D) switch(code){\n                case 0x2B:\n                case 0x2D:\n                case 0x2F:\n                case 0x3C:\n                case 0x3E:\n                case 0x5E:\n                case 0x7C:\n                case 0x25:\n                case 0x26:\n                case 0x2A:\n                    // *\n                    index += 2;\n                    return {\n                        type: TokenPunctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        start: start,\n                        end: index\n                    };\n                case 0x21:\n                case 0x3D:\n                    // =\n                    index += 2; // !== and ===\n                    if (source.charCodeAt(index) === 0x3D) ++index;\n                    return {\n                        type: TokenPunctuator,\n                        value: source.slice(start, index),\n                        start: start,\n                        end: index\n                    };\n            }\n    } // 4-character punctuator: >>>=\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n        index += 4;\n        return {\n            type: TokenPunctuator,\n            value: ch4,\n            start: start,\n            end: index\n        };\n    } // 3-character punctuators: === !== >>> <<= >>=\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n        index += 3;\n        return {\n            type: TokenPunctuator,\n            value: ch3,\n            start: start,\n            end: index\n        };\n    } // Other 2-character punctuators: ++ -- << >> && ||\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".indexOf(ch1) >= 0 || ch2 === \"=>\") {\n        index += 2;\n        return {\n            type: TokenPunctuator,\n            value: ch2,\n            start: start,\n            end: index\n        };\n    }\n    if (ch2 === \"//\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // 1-character punctuators: < > = ! + - * % & | ^ /\n    if (\"<>=!+-*%&|^/\".indexOf(ch1) >= 0) {\n        ++index;\n        return {\n            type: TokenPunctuator,\n            value: ch1,\n            start: start,\n            end: index\n        };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n} // 7.8.3 Numeric Literals\nfunction scanHexLiteral(start) {\n    let number = \"\";\n    while(index < length){\n        if (!isHexDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (number.length === 0) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(\"0x\" + number, 16),\n        start: start,\n        end: index\n    };\n}\nfunction scanOctalLiteral(start) {\n    let number = \"0\" + source[index++];\n    while(index < length){\n        if (!isOctalDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(number, 8),\n        octal: true,\n        start: start,\n        end: index\n    };\n}\nfunction scanNumericLiteral() {\n    var number, start, ch;\n    ch = source[index];\n    assert(isDecimalDigit(ch.charCodeAt(0)) || ch === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number = \"\";\n    if (ch !== \".\") {\n        number = source[index++];\n        ch = source[index]; // Hex number starts with '0x'.\n        // Octal number starts with '0'.\n        if (number === \"0\") {\n            if (ch === \"x\" || ch === \"X\") {\n                ++index;\n                return scanHexLiteral(start);\n            }\n            if (isOctalDigit(ch)) return scanOctalLiteral(start);\n             // decimal number starts with '0' such as '09' is illegal.\n            if (ch && isDecimalDigit(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        }\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \".\") {\n        number += source[index++];\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \"e\" || ch === \"E\") {\n        number += source[index++];\n        ch = source[index];\n        if (ch === \"+\" || ch === \"-\") number += source[index++];\n        if (isDecimalDigit(source.charCodeAt(index))) while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseFloat(number),\n        start: start,\n        end: index\n    };\n} // 7.8.4 String Literals\nfunction scanStringLiteral() {\n    var str = \"\", quote, start, ch, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while(index < length){\n        ch = source[index++];\n        if (ch === quote) {\n            quote = \"\";\n            break;\n        } else if (ch === \"\\\\\") {\n            ch = source[index++];\n            if (!ch || !isLineTerminator(ch.charCodeAt(0))) switch(ch){\n                case \"u\":\n                case \"x\":\n                    if (source[index] === \"{\") {\n                        ++index;\n                        str += scanUnicodeCodePointEscape();\n                    } else str += scanHexEscape(ch);\n                    break;\n                case \"n\":\n                    str += \"\\n\";\n                    break;\n                case \"r\":\n                    str += \"\\r\";\n                    break;\n                case \"t\":\n                    str += \"\t\";\n                    break;\n                case \"b\":\n                    str += \"\\b\";\n                    break;\n                case \"f\":\n                    str += \"\\f\";\n                    break;\n                case \"v\":\n                    str += \"\\v\";\n                    break;\n                default:\n                    if (isOctalDigit(ch)) {\n                        code = \"01234567\".indexOf(ch); // \\0 is not octal escape sequence\n                        if (code !== 0) octal = true;\n                        if (index < length && isOctalDigit(source[index])) {\n                            octal = true;\n                            code = code * 8 + \"01234567\".indexOf(source[index++]); // 3 digits are only allowed when string starts\n                            // with 0, 1, 2, 3\n                            if (\"0123\".indexOf(ch) >= 0 && index < length && isOctalDigit(source[index])) code = code * 8 + \"01234567\".indexOf(source[index++]);\n                        }\n                        str += String.fromCharCode(code);\n                    } else str += ch;\n                    break;\n            }\n            else if (ch === \"\\r\" && source[index] === \"\\n\") ++index;\n        } else if (isLineTerminator(ch.charCodeAt(0))) break;\n        else str += ch;\n    }\n    if (quote !== \"\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenStringLiteral,\n        value: str,\n        octal: octal,\n        start: start,\n        end: index\n    };\n}\nfunction testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.indexOf(\"u\") >= 0) // Replace each astral symbol and every Unicode code point\n    // escape sequence with a single ASCII symbol to avoid throwing on\n    // regular expressions that are only valid in combination with the\n    // `/u` flag.\n    // Note: replacing with the ASCII symbol `x` might cause false\n    // negatives in unlikely scenarios. For example, `[\\u{61}-b]` is a\n    // perfectly valid pattern that is equivalent to `[a-b]`, but it\n    // would be replaced by `[x-b]` which throws an error.\n    tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1)=>{\n        if (parseInt($1, 16) <= 0x10FFFF) return \"x\";\n        throwError({}, MessageInvalidRegExp);\n    }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n     // First, detect invalid regular expressions.\n    try {\n        new RegExp(tmp);\n    } catch (e) {\n        throwError({}, MessageInvalidRegExp);\n    } // Return a regular expression object for this pattern-flag pair, or\n    // `null` in case the current environment doesn't support the flags it\n    // uses.\n    try {\n        return new RegExp(pattern, flags);\n    } catch (exception) {\n        return null;\n    }\n}\nfunction scanRegExpBody() {\n    var ch, str, classMarker, terminated, body;\n    ch = source[index];\n    assert(ch === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while(index < length){\n        ch = source[index++];\n        str += ch;\n        if (ch === \"\\\\\") {\n            ch = source[index++]; // ECMA-262 7.8.5\n            if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n            str += ch;\n        } else if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n        else if (classMarker) {\n            if (ch === \"]\") classMarker = false;\n        } else {\n            if (ch === \"/\") {\n                terminated = true;\n                break;\n            } else if (ch === \"[\") classMarker = true;\n        }\n    }\n    if (!terminated) throwError({}, MessageUnterminatedRegExp);\n     // Exclude leading and trailing slash.\n    body = str.substr(1, str.length - 2);\n    return {\n        value: body,\n        literal: str\n    };\n}\nfunction scanRegExpFlags() {\n    var ch, str, flags;\n    str = \"\";\n    flags = \"\";\n    while(index < length){\n        ch = source[index];\n        if (!isIdentifierPart(ch.charCodeAt(0))) break;\n        ++index;\n        if (ch === \"\\\\\" && index < length) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        else {\n            flags += ch;\n            str += ch;\n        }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) throwError({}, MessageInvalidRegExp, flags);\n    return {\n        value: flags,\n        literal: str\n    };\n}\nfunction scanRegExp() {\n    var start, body, flags, value;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value = testRegExp(body.value, flags.value);\n    return {\n        literal: body.literal + flags.literal,\n        value: value,\n        regex: {\n            pattern: body.value,\n            flags: flags.value\n        },\n        start: start,\n        end: index\n    };\n}\nfunction isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n}\nfunction advance() {\n    skipComment();\n    if (index >= length) return {\n        type: TokenEOF,\n        start: index,\n        end: index\n    };\n    const ch = source.charCodeAt(index);\n    if (isIdentifierStart(ch)) return scanIdentifier();\n     // Very common: ( and ) and ;\n    if (ch === 0x28 || ch === 0x29 || ch === 0x3B) return scanPunctuator();\n     // String literal starts with single quote (U+0027) or double quote (U+0022).\n    if (ch === 0x27 || ch === 0x22) return scanStringLiteral();\n     // Dot (.) U+002E can also start a floating-point number, hence the need\n    // to check the next character.\n    if (ch === 0x2E) {\n        if (isDecimalDigit(source.charCodeAt(index + 1))) return scanNumericLiteral();\n        return scanPunctuator();\n    }\n    if (isDecimalDigit(ch)) return scanNumericLiteral();\n    return scanPunctuator();\n}\nfunction lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n}\nfunction peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n}\nfunction finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n}\nfunction finishBinaryExpression(operator, left, right) {\n    const node = new ASTNode(operator === \"||\" || operator === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator;\n    node.left = left;\n    node.right = right;\n    return node;\n}\nfunction finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n}\nfunction finishConditionalExpression(test, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n}\nfunction finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n}\nfunction finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n        if (node.raw === \"//\") node.raw = \"/(?:)/\";\n        node.regex = token.regex;\n    }\n    return node;\n}\nfunction finishMemberExpression(accessor, object, property) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor === \"[\";\n    node.object = object;\n    node.property = property;\n    if (!node.computed) property.member = true;\n    return node;\n}\nfunction finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n}\nfunction finishProperty(kind, key, value) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key;\n    node.value = value;\n    node.kind = kind;\n    return node;\n}\nfunction finishUnaryExpression(operator, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n} // Throw an exception\nfunction throwError(token, messageFormat) {\n    var error, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index1)=>{\n        assert(index1 < args.length, \"Message reference must be in range\");\n        return args[index1];\n    });\n    error = new Error(msg);\n    error.index = index;\n    error.description = msg;\n    throw error;\n} // Throw an exception because of the token.\nfunction throwUnexpected(token) {\n    if (token.type === TokenEOF) throwError(token, MessageUnexpectedEOS);\n    if (token.type === TokenNumericLiteral) throwError(token, MessageUnexpectedNumber);\n    if (token.type === TokenStringLiteral) throwError(token, MessageUnexpectedString);\n    if (token.type === TokenIdentifier) throwError(token, MessageUnexpectedIdentifier);\n    if (token.type === TokenKeyword) throwError(token, MessageUnexpectedReserved);\n     // BooleanLiteral, NullLiteral, or Punctuator.\n    throwError(token, MessageUnexpectedToken, token.value);\n} // Expect the next token to match the specified punctuator.\n// If not, an exception will be thrown.\nfunction expect(value) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value) throwUnexpected(token);\n} // Return true if the next token matches the specified punctuator.\nfunction match(value) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value;\n} // Return true if the next token matches the specified keyword\nfunction matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n} // 11.1.4 Array Initialiser\nfunction parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while(!match(\"]\"))if (match(\",\")) {\n        lex();\n        elements.push(null);\n    } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) expect(\",\");\n    }\n    lex();\n    return finishArrayExpression(elements);\n} // 11.1.5 Object Initialiser\nfunction parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex(); // Note: This function is called only from parseObjectProperty(), where\n    // EOF and Punctuator tokens are already filtered out.\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n        if (token.octal) throwError(token, MessageStrictOctalLiteral);\n        return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n}\nfunction parseObjectProperty() {\n    var token, key, id, value;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n        id = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", id, value);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) throwUnexpected(token);\n    else {\n        key = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", key, value);\n    }\n}\nfunction parseObjectInitialiser() {\n    var properties = [], property, name, key, map = {}, toString = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while(!match(\"}\")){\n        property = parseObjectProperty();\n        if (property.key.type === SyntaxIdentifier) name = property.key.name;\n        else name = toString(property.key.value);\n        key = \"$\" + name;\n        if (Object.prototype.hasOwnProperty.call(map, key)) throwError({}, MessageStrictDuplicateProperty);\n        else map[key] = true;\n        properties.push(property);\n        if (!match(\"}\")) expect(\",\");\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n} // 11.1.6 The Grouping Operator\nfunction parseGroupExpression() {\n    expect(\"(\");\n    const expr = parseExpression();\n    expect(\")\");\n    return expr;\n} // 11.1 Primary Expressions\nconst legalKeywords = {\n    \"if\": 1\n};\nfunction parsePrimaryExpression() {\n    var type, token, expr;\n    if (match(\"(\")) return parseGroupExpression();\n    if (match(\"[\")) return parseArrayInitialiser();\n    if (match(\"{\")) return parseObjectInitialiser();\n    type = lookahead.type;\n    index = lookahead.start;\n    if (type === TokenIdentifier || legalKeywords[lookahead.value]) expr = finishIdentifier(lex().value);\n    else if (type === TokenStringLiteral || type === TokenNumericLiteral) {\n        if (lookahead.octal) throwError(lookahead, MessageStrictOctalLiteral);\n        expr = finishLiteral(lex());\n    } else if (type === TokenKeyword) throw new Error(DISABLED);\n    else if (type === TokenBooleanLiteral) {\n        token = lex();\n        token.value = token.value === \"true\";\n        expr = finishLiteral(token);\n    } else if (type === TokenNullLiteral) {\n        token = lex();\n        token.value = null;\n        expr = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n        expr = finishLiteral(scanRegExp());\n        peek();\n    } else throwUnexpected(lex());\n    return expr;\n} // 11.2 Left-Hand-Side Expressions\nfunction parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) while(index < length){\n        args.push(parseConditionalExpression());\n        if (match(\")\")) break;\n        expect(\",\");\n    }\n    expect(\")\");\n    return args;\n}\nfunction parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) throwUnexpected(token);\n    return finishIdentifier(token.value);\n}\nfunction parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n}\nfunction parseComputedMember() {\n    expect(\"[\");\n    const expr = parseExpression();\n    expect(\"]\");\n    return expr;\n}\nfunction parseLeftHandSideExpressionAllowCall() {\n    var expr, args, property;\n    expr = parsePrimaryExpression();\n    for(;;){\n        if (match(\".\")) {\n            property = parseNonComputedMember();\n            expr = finishMemberExpression(\".\", expr, property);\n        } else if (match(\"(\")) {\n            args = parseArguments();\n            expr = finishCallExpression(expr, args);\n        } else if (match(\"[\")) {\n            property = parseComputedMember();\n            expr = finishMemberExpression(\"[\", expr, property);\n        } else break;\n    }\n    return expr;\n} // 11.3 Postfix Expressions\nfunction parsePostfixExpression() {\n    const expr = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n        if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    }\n    return expr;\n} // 11.4 Unary Operators\nfunction parseUnaryExpression() {\n    var token, expr;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) expr = parsePostfixExpression();\n    else if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n        token = lex();\n        expr = parseUnaryExpression();\n        expr = finishUnaryExpression(token.value, expr);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) throw new Error(DISABLED);\n    else expr = parsePostfixExpression();\n    return expr;\n}\nfunction binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) return 0;\n    switch(token.value){\n        case \"||\":\n            prec = 1;\n            break;\n        case \"&&\":\n            prec = 2;\n            break;\n        case \"|\":\n            prec = 3;\n            break;\n        case \"^\":\n            prec = 4;\n            break;\n        case \"&\":\n            prec = 5;\n            break;\n        case \"==\":\n        case \"!=\":\n        case \"===\":\n        case \"!==\":\n            prec = 6;\n            break;\n        case \"<\":\n        case \">\":\n        case \"<=\":\n        case \">=\":\n        case \"instanceof\":\n        case \"in\":\n            prec = 7;\n            break;\n        case \"<<\":\n        case \">>\":\n        case \">>>\":\n            prec = 8;\n            break;\n        case \"+\":\n        case \"-\":\n            prec = 9;\n            break;\n        case \"*\":\n        case \"/\":\n        case \"%\":\n            prec = 11;\n            break;\n    }\n    return prec;\n} // 11.5 Multiplicative Operators\n// 11.6 Additive Operators\n// 11.7 Bitwise Shift Operators\n// 11.8 Relational Operators\n// 11.9 Equality Operators\n// 11.10 Binary Bitwise Operators\n// 11.11 Binary Logical Operators\nfunction parseBinaryExpression() {\n    var marker, markers, expr, token, prec, stack, right, operator, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) return left;\n    token.prec = prec;\n    lex();\n    markers = [\n        marker,\n        lookahead\n    ];\n    right = parseUnaryExpression();\n    stack = [\n        left,\n        token,\n        right\n    ];\n    while((prec = binaryPrecedence(lookahead)) > 0){\n        // Reduce: make a binary expression from the three topmost entries.\n        while(stack.length > 2 && prec <= stack[stack.length - 2].prec){\n            right = stack.pop();\n            operator = stack.pop().value;\n            left = stack.pop();\n            markers.pop();\n            expr = finishBinaryExpression(operator, left, right);\n            stack.push(expr);\n        } // Shift.\n        token = lex();\n        token.prec = prec;\n        stack.push(token);\n        markers.push(lookahead);\n        expr = parseUnaryExpression();\n        stack.push(expr);\n    } // Final reduce to clean-up the stack.\n    i = stack.length - 1;\n    expr = stack[i];\n    markers.pop();\n    while(i > 1){\n        markers.pop();\n        expr = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n        i -= 2;\n    }\n    return expr;\n} // 11.12 Conditional Operator\nfunction parseConditionalExpression() {\n    var expr, consequent, alternate;\n    expr = parseBinaryExpression();\n    if (match(\"?\")) {\n        lex();\n        consequent = parseConditionalExpression();\n        expect(\":\");\n        alternate = parseConditionalExpression();\n        expr = finishConditionalExpression(expr, consequent, alternate);\n    }\n    return expr;\n} // 11.14 Comma Operator\nfunction parseExpression() {\n    const expr = parseConditionalExpression();\n    if (match(\",\")) throw new Error(DISABLED); // no sequence expressions\n    return expr;\n}\nfunction parser(code) {\n    source = code;\n    index = 0;\n    length = source.length;\n    lookahead = null;\n    peek();\n    const expr = parseExpression();\n    if (lookahead.type !== TokenEOF) throw new Error(\"Unexpect token after expression.\");\n    return expr;\n}\nvar Constants = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n};\nfunction Functions(codegen1) {\n    function fncall(name, args, cast, type) {\n        let obj = codegen1(args[0]);\n        if (cast) {\n            obj = cast + \"(\" + obj + \")\";\n            if (cast.lastIndexOf(\"new \", 0) === 0) obj = \"(\" + obj + \")\";\n        }\n        return obj + \".\" + name + (type < 0 ? \"\" : type === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen1).join(\",\") + \")\");\n    }\n    function fn(name, cast, type) {\n        return (args)=>fncall(name, args, cast, type);\n    }\n    const DATE = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n        // MATH functions\n        isNaN: \"Number.isNaN\",\n        isFinite: \"Number.isFinite\",\n        abs: \"Math.abs\",\n        acos: \"Math.acos\",\n        asin: \"Math.asin\",\n        atan: \"Math.atan\",\n        atan2: \"Math.atan2\",\n        ceil: \"Math.ceil\",\n        cos: \"Math.cos\",\n        exp: \"Math.exp\",\n        floor: \"Math.floor\",\n        log: \"Math.log\",\n        max: \"Math.max\",\n        min: \"Math.min\",\n        pow: \"Math.pow\",\n        random: \"Math.random\",\n        round: \"Math.round\",\n        sin: \"Math.sin\",\n        sqrt: \"Math.sqrt\",\n        tan: \"Math.tan\",\n        clamp: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to clamp function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to clamp function.\");\n            const a = args.map(codegen1);\n            return \"Math.max(\" + a[1] + \", Math.min(\" + a[2] + \",\" + a[0] + \"))\";\n        },\n        // DATE functions\n        now: \"Date.now\",\n        utc: \"Date.UTC\",\n        datetime: DATE,\n        date: fn(\"getDate\", DATE, 0),\n        day: fn(\"getDay\", DATE, 0),\n        year: fn(\"getFullYear\", DATE, 0),\n        month: fn(\"getMonth\", DATE, 0),\n        hours: fn(\"getHours\", DATE, 0),\n        minutes: fn(\"getMinutes\", DATE, 0),\n        seconds: fn(\"getSeconds\", DATE, 0),\n        milliseconds: fn(\"getMilliseconds\", DATE, 0),\n        time: fn(\"getTime\", DATE, 0),\n        timezoneoffset: fn(\"getTimezoneOffset\", DATE, 0),\n        utcdate: fn(\"getUTCDate\", DATE, 0),\n        utcday: fn(\"getUTCDay\", DATE, 0),\n        utcyear: fn(\"getUTCFullYear\", DATE, 0),\n        utcmonth: fn(\"getUTCMonth\", DATE, 0),\n        utchours: fn(\"getUTCHours\", DATE, 0),\n        utcminutes: fn(\"getUTCMinutes\", DATE, 0),\n        utcseconds: fn(\"getUTCSeconds\", DATE, 0),\n        utcmilliseconds: fn(\"getUTCMilliseconds\", DATE, 0),\n        // sequence functions\n        length: fn(\"length\", null, -1),\n        // STRING functions\n        parseFloat: \"parseFloat\",\n        parseInt: \"parseInt\",\n        upper: fn(\"toUpperCase\", STRING, 0),\n        lower: fn(\"toLowerCase\", STRING, 0),\n        substring: fn(\"substring\", STRING),\n        split: fn(\"split\", STRING),\n        trim: fn(\"trim\", STRING, 0),\n        // REGEXP functions\n        regexp: REGEXP,\n        test: fn(\"test\", REGEXP),\n        // Control Flow functions\n        if: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to if function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to if function.\");\n            const a = args.map(codegen1);\n            return \"(\" + a[0] + \"?\" + a[1] + \":\" + a[2] + \")\";\n        }\n    };\n}\nfunction stripQuotes(s) {\n    const n = s && s.length - 1;\n    return n && (s[0] === '\"' && s[n] === '\"' || s[0] === \"'\" && s[n] === \"'\") ? s.slice(1, -1) : s;\n}\nfunction codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? (0, _vegaUtil.toSet)(opt.allowed) : {}, forbidden = opt.forbidden ? (0, _vegaUtil.toSet)(opt.forbidden) : {}, constants = opt.constants || Constants, functions = (opt.functions || Functions)(visit), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = (0, _vegaUtil.isFunction)(globalvar) ? globalvar : (id)=>\"\".concat(globalvar, '[\"').concat(id, '\"]');\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit(ast) {\n        if ((0, _vegaUtil.isString)(ast)) return ast;\n        const generator = Generators[ast.type];\n        if (generator == null) (0, _vegaUtil.error)(\"Unsupported type: \" + ast.type);\n        return generator(ast);\n    }\n    const Generators = {\n        Literal: (n)=>n.raw,\n        Identifier: (n)=>{\n            const id = n.name;\n            if (memberDepth > 0) return id;\n            else if ((0, _vegaUtil.hasOwnProperty)(forbidden, id)) return (0, _vegaUtil.error)(\"Illegal identifier: \" + id);\n            else if ((0, _vegaUtil.hasOwnProperty)(constants, id)) return constants[id];\n            else if ((0, _vegaUtil.hasOwnProperty)(allowed, id)) return id;\n            else {\n                globals[id] = 1;\n                return outputGlobal(id);\n            }\n        },\n        MemberExpression: (n)=>{\n            const d = !n.computed, o = visit(n.object);\n            if (d) memberDepth += 1;\n            const p = visit(n.property);\n            if (o === fieldvar) // strip quotes to sanitize field name (#1653)\n            fields[stripQuotes(p)] = 1;\n            if (d) memberDepth -= 1;\n            return o + (d ? \".\" + p : \"[\" + p + \"]\");\n        },\n        CallExpression: (n)=>{\n            if (n.callee.type !== \"Identifier\") (0, _vegaUtil.error)(\"Illegal callee type: \" + n.callee.type);\n            const callee = n.callee.name, args = n.arguments, fn = (0, _vegaUtil.hasOwnProperty)(functions, callee) && functions[callee];\n            if (!fn) (0, _vegaUtil.error)(\"Unrecognized function: \" + callee);\n            return (0, _vegaUtil.isFunction)(fn) ? fn(args) : fn + \"(\" + args.map(visit).join(\",\") + \")\";\n        },\n        ArrayExpression: (n)=>\"[\" + n.elements.map(visit).join(\",\") + \"]\",\n        BinaryExpression: (n)=>\"(\" + visit(n.left) + \" \" + n.operator + \" \" + visit(n.right) + \")\",\n        UnaryExpression: (n)=>\"(\" + n.operator + visit(n.argument) + \")\",\n        ConditionalExpression: (n)=>\"(\" + visit(n.test) + \"?\" + visit(n.consequent) + \":\" + visit(n.alternate) + \")\",\n        LogicalExpression: (n)=>\"(\" + visit(n.left) + n.operator + visit(n.right) + \")\",\n        ObjectExpression: (n)=>\"{\" + n.properties.map(visit).join(\",\") + \"}\",\n        Property: (n)=>{\n            memberDepth += 1;\n            const k = visit(n.key);\n            memberDepth -= 1;\n            return k + \":\" + visit(n.value);\n        }\n    };\n    function codegen2(ast) {\n        const result = {\n            code: visit(ast),\n            globals: Object.keys(globals),\n            fields: Object.keys(fields)\n        };\n        globals = {};\n        fields = {};\n        return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants;\n    return codegen2;\n}\n\n},{\"vega-util\":\"dPFAY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kbnnw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"selector\", ()=>eventSelector);\nconst VIEW = \"view\", LBRACK = \"[\", RBRACK = \"]\", LBRACE = \"{\", RBRACE = \"}\", COLON = \":\", COMMA = \",\", NAME = \"@\", GT = \">\", ILLEGAL = /[[\\]{}]/, DEFAULT_MARKS = {\n    \"*\": 1,\n    arc: 1,\n    area: 1,\n    group: 1,\n    image: 1,\n    line: 1,\n    path: 1,\n    rect: 1,\n    rule: 1,\n    shape: 1,\n    symbol: 1,\n    text: 1,\n    trail: 1\n};\nlet DEFAULT_SOURCE, MARKS;\n/**\n * Parse an event selector string.\n * Returns an array of event stream definitions.\n */ function eventSelector(selector, source, marks) {\n    DEFAULT_SOURCE = source || VIEW;\n    MARKS = marks || DEFAULT_MARKS;\n    return parseMerge(selector.trim()).map(parseSelector);\n}\nfunction isMarkType(type) {\n    return MARKS[type];\n}\nfunction find(s, i, endChar, pushChar, popChar) {\n    const n = s.length;\n    let count = 0, c;\n    for(; i < n; ++i){\n        c = s[i];\n        if (!count && c === endChar) return i;\n        else if (popChar && popChar.indexOf(c) >= 0) --count;\n        else if (pushChar && pushChar.indexOf(c) >= 0) ++count;\n    }\n    return i;\n}\nfunction parseMerge(s) {\n    const output = [], n = s.length;\n    let start = 0, i = 0;\n    while(i < n){\n        i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n        output.push(s.substring(start, i).trim());\n        start = ++i;\n    }\n    if (output.length === 0) throw \"Empty event selector: \" + s;\n    return output;\n}\nfunction parseSelector(s) {\n    return s[0] === \"[\" ? parseBetween(s) : parseStream(s);\n}\nfunction parseBetween(s) {\n    const n = s.length;\n    let i = 1, b;\n    i = find(s, i, RBRACK, LBRACK, RBRACK);\n    if (i === n) throw \"Empty between selector: \" + s;\n    b = parseMerge(s.substring(1, i));\n    if (b.length !== 2) throw \"Between selector must have two elements: \" + s;\n    s = s.slice(i + 1).trim();\n    if (s[0] !== GT) throw \"Expected '>' after between selector: \" + s;\n    b = b.map(parseSelector);\n    const stream = parseSelector(s.slice(1).trim());\n    if (stream.between) return {\n        between: b,\n        stream: stream\n    };\n    else stream.between = b;\n    return stream;\n}\nfunction parseStream(s) {\n    const stream = {\n        source: DEFAULT_SOURCE\n    }, source = [];\n    let throttle = [\n        0,\n        0\n    ], markname = 0, start = 0, n = s.length, i = 0, j, filter; // extract throttle from end\n    if (s[n - 1] === RBRACE) {\n        i = s.lastIndexOf(LBRACE);\n        if (i >= 0) {\n            try {\n                throttle = parseThrottle(s.substring(i + 1, n - 1));\n            } catch (e) {\n                throw \"Invalid throttle specification: \" + s;\n            }\n            s = s.slice(0, i).trim();\n            n = s.length;\n        } else throw \"Unmatched right brace: \" + s;\n        i = 0;\n    }\n    if (!n) throw s; // set name flag based on first char\n    if (s[0] === NAME) markname = ++i; // extract first part of multi-part stream selector\n    j = find(s, i, COLON);\n    if (j < n) {\n        source.push(s.substring(start, j).trim());\n        start = i = ++j;\n    } // extract remaining part of stream selector\n    i = find(s, i, LBRACK);\n    if (i === n) source.push(s.substring(start, n).trim());\n    else {\n        source.push(s.substring(start, i).trim());\n        filter = [];\n        start = ++i;\n        if (start === n) throw \"Unmatched left bracket: \" + s;\n    } // extract filters\n    while(i < n){\n        i = find(s, i, RBRACK);\n        if (i === n) throw \"Unmatched left bracket: \" + s;\n        filter.push(s.substring(start, i).trim());\n        if (i < n - 1 && s[++i] !== LBRACK) throw \"Expected left bracket: \" + s;\n        start = ++i;\n    } // marshall event stream specification\n    if (!(n = source.length) || ILLEGAL.test(source[n - 1])) throw \"Invalid event selector: \" + s;\n    if (n > 1) {\n        stream.type = source[1];\n        if (markname) stream.markname = source[0].slice(1);\n        else if (isMarkType(source[0])) stream.marktype = source[0];\n        else stream.source = source[0];\n    } else stream.type = source[0];\n    if (stream.type.slice(-1) === \"!\") {\n        stream.consume = true;\n        stream.type = stream.type.slice(0, -1);\n    }\n    if (filter != null) stream.filter = filter;\n    if (throttle[0]) stream.throttle = throttle[0];\n    if (throttle[1]) stream.debounce = throttle[1];\n    return stream;\n}\nfunction parseThrottle(s) {\n    const a = s.split(COMMA);\n    if (!s.length || a.length > 2) throw s;\n    return a.map((_)=>{\n        const x = +_;\n        if (x !== x) throw s;\n        return x;\n    });\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}]},[\"fV4j0\"], \"fV4j0\", \"parcelRequire6a36\")\n\n"
  },
  {
    "path": "docs/tests/v3/es6/js/sanddance-test-es6.js",
    "content": "// modules are defined as an array\n// [ module function, map of requires ]\n//\n// map of requires is short require name -> numeric require\n//\n// anything defined in a previous bundle is accessed via the\n// orig method which is the require for previous bundles\n\n(function (modules, entry, mainEntry, parcelRequireName, globalName) {\n  /* eslint-disable no-undef */\n  var globalObject =\n    typeof globalThis !== 'undefined'\n      ? globalThis\n      : typeof self !== 'undefined'\n      ? self\n      : typeof window !== 'undefined'\n      ? window\n      : typeof global !== 'undefined'\n      ? global\n      : {};\n  /* eslint-enable no-undef */\n\n  // Save the require from previous bundle to this closure if any\n  var previousRequire =\n    typeof globalObject[parcelRequireName] === 'function' &&\n    globalObject[parcelRequireName];\n\n  var cache = previousRequire.cache || {};\n  // Do not use `require` to prevent Webpack from trying to bundle this call\n  var nodeRequire =\n    typeof module !== 'undefined' &&\n    typeof module.require === 'function' &&\n    module.require.bind(module);\n\n  function newRequire(name, jumped) {\n    if (!cache[name]) {\n      if (!modules[name]) {\n        // if we cannot find the module within our internal map or\n        // cache jump to the current global require ie. the last bundle\n        // that was added to the page.\n        var currentRequire =\n          typeof globalObject[parcelRequireName] === 'function' &&\n          globalObject[parcelRequireName];\n        if (!jumped && currentRequire) {\n          return currentRequire(name, true);\n        }\n\n        // If there are other bundles on this page the require from the\n        // previous one is saved to 'previousRequire'. Repeat this as\n        // many times as there are bundles until the module is found or\n        // we exhaust the require chain.\n        if (previousRequire) {\n          return previousRequire(name, true);\n        }\n\n        // Try the node require function if it exists.\n        if (nodeRequire && typeof name === 'string') {\n          return nodeRequire(name);\n        }\n\n        var err = new Error(\"Cannot find module '\" + name + \"'\");\n        err.code = 'MODULE_NOT_FOUND';\n        throw err;\n      }\n\n      localRequire.resolve = resolve;\n      localRequire.cache = {};\n\n      var module = (cache[name] = new newRequire.Module(name));\n\n      modules[name][0].call(\n        module.exports,\n        localRequire,\n        module,\n        module.exports,\n        this\n      );\n    }\n\n    return cache[name].exports;\n\n    function localRequire(x) {\n      var res = localRequire.resolve(x);\n      return res === false ? {} : newRequire(res);\n    }\n\n    function resolve(x) {\n      var id = modules[name][1][x];\n      return id != null ? id : x;\n    }\n  }\n\n  function Module(moduleName) {\n    this.id = moduleName;\n    this.bundle = newRequire;\n    this.exports = {};\n  }\n\n  newRequire.isParcelRequire = true;\n  newRequire.Module = Module;\n  newRequire.modules = modules;\n  newRequire.cache = cache;\n  newRequire.parent = previousRequire;\n  newRequire.register = function (id, exports) {\n    modules[id] = [\n      function (require, module) {\n        module.exports = exports;\n      },\n      {},\n    ];\n  };\n\n  Object.defineProperty(newRequire, 'root', {\n    get: function () {\n      return globalObject[parcelRequireName];\n    },\n  });\n\n  globalObject[parcelRequireName] = newRequire;\n\n  for (var i = 0; i < entry.length; i++) {\n    newRequire(entry[i]);\n  }\n\n  if (mainEntry) {\n    // Expose entry point to Node, AMD or browser globals\n    // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js\n    var mainExports = newRequire(mainEntry);\n\n    // CommonJS\n    if (typeof exports === 'object' && typeof module !== 'undefined') {\n      module.exports = mainExports;\n\n      // RequireJS\n    } else if (typeof define === 'function' && define.amd) {\n      define(function () {\n        return mainExports;\n      });\n\n      // <script>\n    } else if (globalName) {\n      this[globalName] = mainExports;\n    }\n  }\n})({\"gK9HS\":[function(require,module,exports) {\n// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nvar _core = require(\"@deck.gl/core\");\nvar _layers = require(\"@deck.gl/layers\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _vega = require(\"vega\");\nvar _sanddance = require(\"@msrvida/sanddance\");\nconst data = [];\nconst size = 100;\nfor(let x = 0; x < size; x++)for(let y = 0; y < size; y++){\n    const id = x * y;\n    const z = Math.random() * size * (x % 10) * (y % 10);\n    const w = Math.random() * size;\n    data.push({\n        id,\n        x,\n        y,\n        z,\n        w\n    });\n}\n_sanddance.use(_vega, _core, _layers, _core1);\nconst viewer = new _sanddance.Viewer(document.getElementById(\"vis\"));\nconst insight = {\n    columns: {\n        color: \"z\",\n        uid: \"id\",\n        x: \"x\",\n        y: \"y\",\n        z: \"z\"\n    },\n    scheme: \"blues\",\n    size: {\n        height: 500,\n        width: 500\n    },\n    chart: \"scatterplot\",\n    view: \"3d\"\n};\nviewer.render(insight, data);\n\n},{\"@deck.gl/core\":\"lTaaR\",\"@deck.gl/layers\":\"286Y0\",\"@luma.gl/core\":\"bW3Qv\",\"vega\":\"2BRQe\",\"@msrvida/sanddance\":\"4LXyM\"}],\"lTaaR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"COORDINATE_SYSTEM\", ()=>(0, _constants.COORDINATE_SYSTEM));\nparcelHelpers.export(exports, \"LightingEffect\", ()=>(0, _lightingEffectDefault.default));\nparcelHelpers.export(exports, \"AmbientLight\", ()=>(0, _ambientLight.AmbientLight));\nparcelHelpers.export(exports, \"DirectionalLight\", ()=>(0, _directionalLight.DirectionalLight));\nparcelHelpers.export(exports, \"PointLight\", ()=>(0, _pointLight.PointLight));\nparcelHelpers.export(exports, \"_CameraLight\", ()=>(0, _cameraLightDefault.default));\nparcelHelpers.export(exports, \"_SunLight\", ()=>(0, _sunLightDefault.default));\nparcelHelpers.export(exports, \"PostProcessEffect\", ()=>(0, _postProcessEffectDefault.default));\nparcelHelpers.export(exports, \"_LayersPass\", ()=>(0, _layersPassDefault.default));\nparcelHelpers.export(exports, \"Deck\", ()=>(0, _deckDefault.default));\nparcelHelpers.export(exports, \"LayerManager\", ()=>(0, _layerManagerDefault.default));\nparcelHelpers.export(exports, \"AttributeManager\", ()=>(0, _attributeManagerDefault.default));\nparcelHelpers.export(exports, \"Layer\", ()=>(0, _layerDefault.default));\nparcelHelpers.export(exports, \"CompositeLayer\", ()=>(0, _compositeLayerDefault.default));\nparcelHelpers.export(exports, \"DeckRenderer\", ()=>(0, _deckRendererDefault.default));\nparcelHelpers.export(exports, \"Viewport\", ()=>(0, _viewportDefault.default));\nparcelHelpers.export(exports, \"WebMercatorViewport\", ()=>(0, _webMercatorViewportDefault.default));\nparcelHelpers.export(exports, \"_GlobeViewport\", ()=>(0, _globeViewportDefault.default));\nparcelHelpers.export(exports, \"picking\", ()=>(0, _shaderlib.picking));\nparcelHelpers.export(exports, \"project\", ()=>(0, _shaderlib.project));\nparcelHelpers.export(exports, \"project32\", ()=>(0, _shaderlib.project32));\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>(0, _shaderlib.gouraudLighting));\nparcelHelpers.export(exports, \"phongLighting\", ()=>(0, _shaderlib.phongLighting));\nparcelHelpers.export(exports, \"shadow\", ()=>(0, _shaderlib.shadow));\nparcelHelpers.export(exports, \"View\", ()=>(0, _viewDefault.default));\nparcelHelpers.export(exports, \"MapView\", ()=>(0, _mapViewDefault.default));\nparcelHelpers.export(exports, \"FirstPersonView\", ()=>(0, _firstPersonViewDefault.default));\nparcelHelpers.export(exports, \"OrbitView\", ()=>(0, _orbitViewDefault.default));\nparcelHelpers.export(exports, \"OrthographicView\", ()=>(0, _orthographicViewDefault.default));\nparcelHelpers.export(exports, \"_GlobeView\", ()=>(0, _globeViewDefault.default));\nparcelHelpers.export(exports, \"Controller\", ()=>(0, _controllerDefault.default));\nparcelHelpers.export(exports, \"MapController\", ()=>(0, _mapControllerDefault.default));\nparcelHelpers.export(exports, \"_GlobeController\", ()=>(0, _globeControllerDefault.default));\nparcelHelpers.export(exports, \"FirstPersonController\", ()=>(0, _firstPersonControllerDefault.default));\nparcelHelpers.export(exports, \"OrbitController\", ()=>(0, _orbitControllerDefault.default));\nparcelHelpers.export(exports, \"OrthographicController\", ()=>(0, _orthographicControllerDefault.default));\nparcelHelpers.export(exports, \"Effect\", ()=>(0, _effectDefault.default));\nparcelHelpers.export(exports, \"LayerExtension\", ()=>(0, _layerExtensionDefault.default));\nparcelHelpers.export(exports, \"TRANSITION_EVENTS\", ()=>(0, _transitionManager.TRANSITION_EVENTS));\nparcelHelpers.export(exports, \"TransitionInterpolator\", ()=>(0, _transitionInterpolatorDefault.default));\nparcelHelpers.export(exports, \"LinearInterpolator\", ()=>(0, _linearInterpolatorDefault.default));\nparcelHelpers.export(exports, \"FlyToInterpolator\", ()=>(0, _viewportFlyToInterpolatorDefault.default));\nparcelHelpers.export(exports, \"log\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"createIterable\", ()=>(0, _iterableUtils.createIterable));\nparcelHelpers.export(exports, \"fp64LowPart\", ()=>(0, _mathUtils.fp64LowPart));\nparcelHelpers.export(exports, \"Tesselator\", ()=>(0, _tesselatorDefault.default));\nparcelHelpers.export(exports, \"_fillArray\", ()=>(0, _flatten.fillArray));\nparcelHelpers.export(exports, \"_flatten\", ()=>(0, _flatten.flatten));\nparcelHelpers.export(exports, \"_count\", ()=>(0, _count.count));\nparcelHelpers.export(exports, \"_memoize\", ()=>(0, _memoizeDefault.default));\nparcelHelpers.export(exports, \"_mergeShaders\", ()=>(0, _shader.mergeShaders));\nparcelHelpers.export(exports, \"_compareProps\", ()=>(0, _props.compareProps));\nvar _init = require(\"./lib/init\");\nvar _shaderlib = require(\"./shaderlib\");\nvar _constants = require(\"./lib/constants\");\nvar _lightingEffect = require(\"./effects/lighting/lighting-effect\");\nvar _lightingEffectDefault = parcelHelpers.interopDefault(_lightingEffect);\nvar _ambientLight = require(\"./effects/lighting/ambient-light\");\nvar _directionalLight = require(\"./effects/lighting/directional-light\");\nvar _pointLight = require(\"./effects/lighting/point-light\");\nvar _cameraLight = require(\"./effects/lighting/camera-light\");\nvar _cameraLightDefault = parcelHelpers.interopDefault(_cameraLight);\nvar _sunLight = require(\"./effects/lighting/sun-light\");\nvar _sunLightDefault = parcelHelpers.interopDefault(_sunLight);\nvar _postProcessEffect = require(\"./effects/post-process-effect\");\nvar _postProcessEffectDefault = parcelHelpers.interopDefault(_postProcessEffect);\nvar _layersPass = require(\"./passes/layers-pass\");\nvar _layersPassDefault = parcelHelpers.interopDefault(_layersPass);\nvar _deck = require(\"./lib/deck\");\nvar _deckDefault = parcelHelpers.interopDefault(_deck);\nvar _layerManager = require(\"./lib/layer-manager\");\nvar _layerManagerDefault = parcelHelpers.interopDefault(_layerManager);\nvar _attributeManager = require(\"./lib/attribute/attribute-manager\");\nvar _attributeManagerDefault = parcelHelpers.interopDefault(_attributeManager);\nvar _layer = require(\"./lib/layer\");\nvar _layerDefault = parcelHelpers.interopDefault(_layer);\nvar _compositeLayer = require(\"./lib/composite-layer\");\nvar _compositeLayerDefault = parcelHelpers.interopDefault(_compositeLayer);\nvar _deckRenderer = require(\"./lib/deck-renderer\");\nvar _deckRendererDefault = parcelHelpers.interopDefault(_deckRenderer);\nvar _viewport = require(\"./viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _webMercatorViewport = require(\"./viewports/web-mercator-viewport\");\nvar _webMercatorViewportDefault = parcelHelpers.interopDefault(_webMercatorViewport);\nvar _globeViewport = require(\"./viewports/globe-viewport\");\nvar _globeViewportDefault = parcelHelpers.interopDefault(_globeViewport);\nvar _view = require(\"./views/view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _mapView = require(\"./views/map-view\");\nvar _mapViewDefault = parcelHelpers.interopDefault(_mapView);\nvar _firstPersonView = require(\"./views/first-person-view\");\nvar _firstPersonViewDefault = parcelHelpers.interopDefault(_firstPersonView);\nvar _orbitView = require(\"./views/orbit-view\");\nvar _orbitViewDefault = parcelHelpers.interopDefault(_orbitView);\nvar _orthographicView = require(\"./views/orthographic-view\");\nvar _orthographicViewDefault = parcelHelpers.interopDefault(_orthographicView);\nvar _globeView = require(\"./views/globe-view\");\nvar _globeViewDefault = parcelHelpers.interopDefault(_globeView);\nvar _controller = require(\"./controllers/controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _mapController = require(\"./controllers/map-controller\");\nvar _mapControllerDefault = parcelHelpers.interopDefault(_mapController);\nvar _globeController = require(\"./controllers/globe-controller\");\nvar _globeControllerDefault = parcelHelpers.interopDefault(_globeController);\nvar _firstPersonController = require(\"./controllers/first-person-controller\");\nvar _firstPersonControllerDefault = parcelHelpers.interopDefault(_firstPersonController);\nvar _orbitController = require(\"./controllers/orbit-controller\");\nvar _orbitControllerDefault = parcelHelpers.interopDefault(_orbitController);\nvar _orthographicController = require(\"./controllers/orthographic-controller\");\nvar _orthographicControllerDefault = parcelHelpers.interopDefault(_orthographicController);\nvar _effect = require(\"./lib/effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _layerExtension = require(\"./lib/layer-extension\");\nvar _layerExtensionDefault = parcelHelpers.interopDefault(_layerExtension);\nvar _transitionManager = require(\"./controllers/transition-manager\");\nvar _transitionInterpolator = require(\"./transitions/transition-interpolator\");\nvar _transitionInterpolatorDefault = parcelHelpers.interopDefault(_transitionInterpolator);\nvar _linearInterpolator = require(\"./transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _viewportFlyToInterpolator = require(\"./transitions/viewport-fly-to-interpolator\");\nvar _viewportFlyToInterpolatorDefault = parcelHelpers.interopDefault(_viewportFlyToInterpolator);\nvar _log = require(\"./utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _iterableUtils = require(\"./utils/iterable-utils\");\nvar _mathUtils = require(\"./utils/math-utils\");\nvar _tesselator = require(\"./utils/tesselator\");\nvar _tesselatorDefault = parcelHelpers.interopDefault(_tesselator);\nvar _flatten = require(\"./utils/flatten\");\nvar _count = require(\"./utils/count\");\nvar _memoize = require(\"./utils/memoize\");\nvar _memoizeDefault = parcelHelpers.interopDefault(_memoize);\nvar _shader = require(\"./utils/shader\");\nvar _props = require(\"./lifecycle/props\");\n\n},{\"./lib/init\":\"5f05H\",\"./shaderlib\":\"1gK4T\",\"./lib/constants\":\"4VZPz\",\"./effects/lighting/lighting-effect\":\"dZgtU\",\"./effects/lighting/ambient-light\":\"i0d2q\",\"./effects/lighting/directional-light\":\"fSFHG\",\"./effects/lighting/point-light\":\"fm0J3\",\"./effects/lighting/camera-light\":\"2DoRn\",\"./effects/lighting/sun-light\":\"knWP0\",\"./effects/post-process-effect\":\"7ZbR5\",\"./passes/layers-pass\":\"hn8Gi\",\"./lib/deck\":\"9rIJR\",\"./lib/layer-manager\":\"9sEq0\",\"./lib/attribute/attribute-manager\":\"1b6eu\",\"./lib/layer\":\"jJOdt\",\"./lib/composite-layer\":\"9c4Ap\",\"./lib/deck-renderer\":\"uwNC4\",\"./viewports/viewport\":\"jETN1\",\"./viewports/web-mercator-viewport\":\"kRsWv\",\"./viewports/globe-viewport\":\"gqPD1\",\"./views/view\":\"d0jsQ\",\"./views/map-view\":\"c4mn5\",\"./views/first-person-view\":\"5FfGZ\",\"./views/orbit-view\":\"5kdbb\",\"./views/orthographic-view\":\"4neKz\",\"./views/globe-view\":\"9oBnn\",\"./controllers/controller\":\"j3Tf5\",\"./controllers/map-controller\":\"e5pb1\",\"./controllers/globe-controller\":\"k6wKr\",\"./controllers/first-person-controller\":\"6ip9Y\",\"./controllers/orbit-controller\":\"4xiSq\",\"./controllers/orthographic-controller\":\"hh26F\",\"./lib/effect\":\"hVnbQ\",\"./lib/layer-extension\":\"jly9m\",\"./controllers/transition-manager\":\"alxon\",\"./transitions/transition-interpolator\":\"6hSx4\",\"./transitions/linear-interpolator\":\"8J7qW\",\"./transitions/viewport-fly-to-interpolator\":\"kbBRx\",\"./utils/log\":\"fg4UT\",\"./utils/iterable-utils\":\"8gMuf\",\"./utils/math-utils\":\"jmX3c\",\"./utils/tesselator\":\"98d8C\",\"./utils/flatten\":\"1zGCw\",\"./utils/count\":\"9arx2\",\"./utils/memoize\":\"hjEig\",\"./utils/shader\":\"j0UQD\",\"./lifecycle/props\":\"2rTFu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5f05H\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _core = require(\"@loaders.gl/core\");\nvar _images = require(\"@loaders.gl/images\");\nvar _env = require(\"probe.gl/env\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _debug = require(\"../debug\");\nvar _jsonLoader = require(\"../utils/json-loader\");\nvar _jsonLoaderDefault = parcelHelpers.interopDefault(_jsonLoader);\nvar version = \"8.3.7\";\nvar existingVersion = (0, _env.global).deck && (0, _env.global).deck.VERSION;\nif (existingVersion && existingVersion !== version) throw new Error(\"deck.gl - multiple versions detected: \".concat(existingVersion, \" vs \").concat(version));\nif (!existingVersion) {\n    (0, _env.global).deck = Object.assign((0, _env.global).deck || {}, {\n        VERSION: version,\n        version: version,\n        log: (0, _logDefault.default),\n        _registerLoggers: (0, _debug.register)\n    });\n    (0, _core.registerLoaders)([\n        (0, _jsonLoaderDefault.default),\n        [\n            (0, _images.ImageLoader),\n            {\n                imagebitmap: {\n                    premultiplyAlpha: \"none\"\n                }\n            }\n        ]\n    ]);\n}\nexports.default = (0, _env.global).deck;\n\n},{\"@loaders.gl/core\":\"7dwvE\",\"@loaders.gl/images\":\"2TXhJ\",\"probe.gl/env\":\"4WXZh\",\"../utils/log\":\"fg4UT\",\"../debug\":\"8AxDM\",\"../utils/json-loader\":\"1UeYQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7dwvE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fetchFile\", ()=>(0, _fetchFile.fetchFile));\nparcelHelpers.export(exports, \"readFileSync\", ()=>(0, _readFile.readFileSync));\nparcelHelpers.export(exports, \"writeFile\", ()=>(0, _writeFile.writeFile));\nparcelHelpers.export(exports, \"writeFileSync\", ()=>(0, _writeFile.writeFileSync));\nparcelHelpers.export(exports, \"setLoaderOptions\", ()=>(0, _setLoaderOptions.setLoaderOptions));\nparcelHelpers.export(exports, \"registerLoaders\", ()=>(0, _registerLoaders.registerLoaders));\nparcelHelpers.export(exports, \"parse\", ()=>(0, _parse.parse));\nparcelHelpers.export(exports, \"parseSync\", ()=>(0, _parseSync.parseSync));\nparcelHelpers.export(exports, \"parseInBatches\", ()=>(0, _parseInBatches.parseInBatches));\nparcelHelpers.export(exports, \"selectLoader\", ()=>(0, _selectLoader.selectLoader));\nparcelHelpers.export(exports, \"selectLoaderSync\", ()=>(0, _selectLoader.selectLoaderSync));\nparcelHelpers.export(exports, \"load\", ()=>(0, _load.load));\nparcelHelpers.export(exports, \"loadInBatches\", ()=>(0, _loadInBatches.loadInBatches));\nparcelHelpers.export(exports, \"encode\", ()=>(0, _encode.encode));\nparcelHelpers.export(exports, \"encodeSync\", ()=>(0, _encode.encodeSync));\nparcelHelpers.export(exports, \"encodeInBatches\", ()=>(0, _encode.encodeInBatches));\nparcelHelpers.export(exports, \"encodeText\", ()=>(0, _encode.encodeText));\nparcelHelpers.export(exports, \"encodeURLtoURL\", ()=>(0, _encode.encodeURLtoURL));\nparcelHelpers.export(exports, \"save\", ()=>(0, _save.save));\nparcelHelpers.export(exports, \"saveSync\", ()=>(0, _save.saveSync));\nparcelHelpers.export(exports, \"makeIterator\", ()=>(0, _makeIterator.makeIterator));\nparcelHelpers.export(exports, \"NullLoader\", ()=>(0, _nullLoader.NullLoader));\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>(0, _loaderUtils.setPathPrefix));\nparcelHelpers.export(exports, \"getPathPrefix\", ()=>(0, _loaderUtils.getPathPrefix));\nparcelHelpers.export(exports, \"resolvePath\", ()=>(0, _loaderUtils.resolvePath));\nparcelHelpers.export(exports, \"RequestScheduler\", ()=>(0, _loaderUtils.RequestScheduler));\nparcelHelpers.export(exports, \"_fetchProgress\", ()=>(0, _fetchProgressDefault.default));\nparcelHelpers.export(exports, \"_BrowserFileSystem\", ()=>(0, _browserFilesystemDefault.default));\nparcelHelpers.export(exports, \"_unregisterLoaders\", ()=>(0, _registerLoaders._unregisterLoaders));\nparcelHelpers.export(exports, \"isBrowser\", ()=>(0, _loaderUtils.isBrowser));\nparcelHelpers.export(exports, \"isWorker\", ()=>(0, _loaderUtils.isWorker));\nparcelHelpers.export(exports, \"self\", ()=>(0, _loaderUtils.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _loaderUtils.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _loaderUtils.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _loaderUtils.document));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _loaderUtils.assert));\nparcelHelpers.export(exports, \"forEach\", ()=>(0, _loaderUtils.forEach));\nparcelHelpers.export(exports, \"concatenateChunksAsync\", ()=>(0, _loaderUtils.concatenateChunksAsync));\nparcelHelpers.export(exports, \"makeTextDecoderIterator\", ()=>(0, _loaderUtils.makeTextDecoderIterator));\nparcelHelpers.export(exports, \"makeTextEncoderIterator\", ()=>(0, _loaderUtils.makeTextEncoderIterator));\nparcelHelpers.export(exports, \"makeLineIterator\", ()=>(0, _loaderUtils.makeLineIterator));\nparcelHelpers.export(exports, \"makeNumberedLineIterator\", ()=>(0, _loaderUtils.makeNumberedLineIterator));\nparcelHelpers.export(exports, \"isPromise\", ()=>(0, _isType.isPromise));\nparcelHelpers.export(exports, \"isIterable\", ()=>(0, _isType.isIterable));\nparcelHelpers.export(exports, \"isAsyncIterable\", ()=>(0, _isType.isAsyncIterable));\nparcelHelpers.export(exports, \"isIterator\", ()=>(0, _isType.isIterator));\nparcelHelpers.export(exports, \"isResponse\", ()=>(0, _isType.isResponse));\nparcelHelpers.export(exports, \"isReadableStream\", ()=>(0, _isType.isReadableStream));\nparcelHelpers.export(exports, \"isWritableStream\", ()=>(0, _isType.isWritableStream));\nvar _init = require(\"./lib/init\");\nvar _fetchFile = require(\"./lib/fetch/fetch-file\");\nvar _readFile = require(\"./lib/fetch/read-file\");\nvar _writeFile = require(\"./lib/fetch/write-file\");\nvar _setLoaderOptions = require(\"./lib/api/set-loader-options\");\nvar _registerLoaders = require(\"./lib/api/register-loaders\");\nvar _parse = require(\"./lib/api/parse\");\nvar _parseSync = require(\"./lib/api/parse-sync\");\nvar _parseInBatches = require(\"./lib/api/parse-in-batches\");\nvar _selectLoader = require(\"./lib/api/select-loader\");\nvar _load = require(\"./lib/api/load\");\nvar _loadInBatches = require(\"./lib/api/load-in-batches\");\nvar _encode = require(\"./lib/api/encode\");\nvar _save = require(\"./lib/api/save\");\nvar _makeIterator = require(\"./iterator-utils/make-iterator/make-iterator\");\nvar _nullLoader = require(\"./null-loader\");\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _fetchProgress = require(\"./lib/progress/fetch-progress\");\nvar _fetchProgressDefault = parcelHelpers.interopDefault(_fetchProgress);\nvar _browserFilesystem = require(\"./lib/filesystems/browser-filesystem\");\nvar _browserFilesystemDefault = parcelHelpers.interopDefault(_browserFilesystem);\nvar _isType = require(\"./javascript-utils/is-type\");\n\n},{\"./lib/init\":\"3hLJy\",\"./lib/fetch/fetch-file\":\"1F0F2\",\"./lib/fetch/read-file\":false,\"./lib/fetch/write-file\":false,\"./lib/api/set-loader-options\":false,\"./lib/api/register-loaders\":\"lmt4b\",\"./lib/api/parse\":\"1vDZj\",\"./lib/api/parse-sync\":false,\"./lib/api/parse-in-batches\":false,\"./lib/api/select-loader\":\"h62jy\",\"./lib/api/load\":\"hdPHA\",\"./lib/api/load-in-batches\":false,\"./lib/api/encode\":false,\"./lib/api/save\":false,\"./iterator-utils/make-iterator/make-iterator\":\"3fpne\",\"./null-loader\":false,\"@loaders.gl/loader-utils\":\"bhMte\",\"./lib/progress/fetch-progress\":false,\"./lib/filesystems/browser-filesystem\":false,\"./javascript-utils/is-type\":\"a5AOB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3hLJy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar version = \"2.3.13\";\n(0, _loaderUtils.global).loaders = Object.assign((0, _loaderUtils.global).loaders || {}, {\n    VERSION: version\n});\nexports.default = (0, _loaderUtils.global).loaders;\n\n},{\"@loaders.gl/loader-utils\":\"bhMte\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bhMte\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nparcelHelpers.export(exports, \"isBrowser\", ()=>(0, _globals.isBrowser));\nparcelHelpers.export(exports, \"isWorker\", ()=>(0, _globals.isWorker));\nparcelHelpers.export(exports, \"nodeVersion\", ()=>(0, _globals.nodeVersion));\nparcelHelpers.export(exports, \"self\", ()=>(0, _globals.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _globals.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _globals.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _globals.document));\nparcelHelpers.export(exports, \"createWorker\", ()=>(0, _createWorkerDefault.default));\nparcelHelpers.export(exports, \"validateLoaderVersion\", ()=>(0, _validateLoaderVersion.validateLoaderVersion));\nparcelHelpers.export(exports, \"makeTransformIterator\", ()=>(0, _makeTransformIterator.makeTransformIterator));\nparcelHelpers.export(exports, \"getTransferList\", ()=>(0, _getTransferList.getTransferList));\nparcelHelpers.export(exports, \"_WorkerFarm\", ()=>(0, _workerFarmDefault.default));\nparcelHelpers.export(exports, \"_WorkerPool\", ()=>(0, _workerPoolDefault.default));\nparcelHelpers.export(exports, \"_WorkerThread\", ()=>(0, _workerThreadDefault.default));\nparcelHelpers.export(exports, \"getLibraryUrl\", ()=>(0, _libraryUtils.getLibraryUrl));\nparcelHelpers.export(exports, \"loadLibrary\", ()=>(0, _libraryUtils.loadLibrary));\nparcelHelpers.export(exports, \"parseJSON\", ()=>(0, _parseJson.parseJSON));\nparcelHelpers.export(exports, \"isBuffer\", ()=>(0, _bufferUtils.isBuffer));\nparcelHelpers.export(exports, \"toBuffer\", ()=>(0, _bufferUtils.toBuffer));\nparcelHelpers.export(exports, \"bufferToArrayBuffer\", ()=>(0, _bufferUtils.bufferToArrayBuffer));\nparcelHelpers.export(exports, \"toArrayBuffer\", ()=>(0, _arrayBufferUtils.toArrayBuffer));\nparcelHelpers.export(exports, \"sliceArrayBuffer\", ()=>(0, _arrayBufferUtils.sliceArrayBuffer));\nparcelHelpers.export(exports, \"concatenateArrayBuffers\", ()=>(0, _arrayBufferUtils.concatenateArrayBuffers));\nparcelHelpers.export(exports, \"compareArrayBuffers\", ()=>(0, _arrayBufferUtils.compareArrayBuffers));\nparcelHelpers.export(exports, \"padTo4Bytes\", ()=>(0, _memoryCopyUtils.padTo4Bytes));\nparcelHelpers.export(exports, \"copyToArray\", ()=>(0, _memoryCopyUtils.copyToArray));\nparcelHelpers.export(exports, \"copyArrayBuffer\", ()=>(0, _memoryCopyUtils.copyArrayBuffer));\nparcelHelpers.export(exports, \"copyPaddedArrayBufferToDataView\", ()=>(0, _binaryCopyUtils.copyPaddedArrayBufferToDataView));\nparcelHelpers.export(exports, \"copyPaddedStringToDataView\", ()=>(0, _binaryCopyUtils.copyPaddedStringToDataView));\nparcelHelpers.export(exports, \"padStringToByteAlignment\", ()=>(0, _encodeUtils.padStringToByteAlignment));\nparcelHelpers.export(exports, \"copyStringToDataView\", ()=>(0, _encodeUtils.copyStringToDataView));\nparcelHelpers.export(exports, \"copyBinaryToDataView\", ()=>(0, _encodeUtils.copyBinaryToDataView));\nparcelHelpers.export(exports, \"getFirstCharacters\", ()=>(0, _getFirstCharacters.getFirstCharacters));\nparcelHelpers.export(exports, \"getMagicString\", ()=>(0, _getFirstCharacters.getMagicString));\nparcelHelpers.export(exports, \"path\", ()=>_path);\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>(0, _fileAliases.setPathPrefix));\nparcelHelpers.export(exports, \"getPathPrefix\", ()=>(0, _fileAliases.getPathPrefix));\nparcelHelpers.export(exports, \"resolvePath\", ()=>(0, _fileAliases.resolvePath));\nparcelHelpers.export(exports, \"_addAliases\", ()=>(0, _fileAliasesJs.addAliases));\nparcelHelpers.export(exports, \"makeTextEncoderIterator\", ()=>(0, _textIterators.makeTextEncoderIterator));\nparcelHelpers.export(exports, \"makeTextDecoderIterator\", ()=>(0, _textIterators.makeTextDecoderIterator));\nparcelHelpers.export(exports, \"makeLineIterator\", ()=>(0, _textIterators.makeLineIterator));\nparcelHelpers.export(exports, \"makeNumberedLineIterator\", ()=>(0, _textIterators.makeNumberedLineIterator));\nparcelHelpers.export(exports, \"forEach\", ()=>(0, _asyncIteration.forEach));\nparcelHelpers.export(exports, \"concatenateChunksAsync\", ()=>(0, _asyncIteration.concatenateChunksAsync));\nparcelHelpers.export(exports, \"RequestScheduler\", ()=>(0, _requestSchedulerDefault.default));\nparcelHelpers.export(exports, \"ChildProcessProxy\", ()=>(0, _childProcessProxyDefault.default));\nparcelHelpers.export(exports, \"_getMeshSize\", ()=>(0, _meshUtils.getMeshSize));\nparcelHelpers.export(exports, \"getMeshBoundingBox\", ()=>(0, _meshUtils.getMeshBoundingBox));\nparcelHelpers.export(exports, \"getZeroOffsetArrayBuffer\", ()=>(0, _memoryCopyUtils.getZeroOffsetArrayBuffer));\nvar _path = require(\"./lib/path-utils/path\");\nvar _assert = require(\"./lib/env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _globals = require(\"./lib/env-utils/globals\");\nvar _createWorker = require(\"./lib/worker-loader-utils/create-worker\");\nvar _createWorkerDefault = parcelHelpers.interopDefault(_createWorker);\nvar _validateLoaderVersion = require(\"./lib/worker-loader-utils/validate-loader-version\");\nvar _makeTransformIterator = require(\"./lib/iterator-utils/make-transform-iterator\");\nvar _getTransferList = require(\"./lib/worker-utils/get-transfer-list\");\nvar _workerFarm = require(\"./lib/worker-utils/worker-farm\");\nvar _workerFarmDefault = parcelHelpers.interopDefault(_workerFarm);\nvar _workerPool = require(\"./lib/worker-utils/worker-pool\");\nvar _workerPoolDefault = parcelHelpers.interopDefault(_workerPool);\nvar _workerThread = require(\"./lib/worker-utils/worker-thread\");\nvar _workerThreadDefault = parcelHelpers.interopDefault(_workerThread);\nvar _libraryUtils = require(\"./lib/library-utils/library-utils\");\nvar _parseJson = require(\"./lib/parser-utils/parse-json\");\nvar _bufferUtils = require(\"./lib/binary-utils/buffer-utils\");\nvar _arrayBufferUtils = require(\"./lib/binary-utils/array-buffer-utils\");\nvar _memoryCopyUtils = require(\"./lib/binary-utils/memory-copy-utils\");\nvar _binaryCopyUtils = require(\"./lib/binary-utils/binary-copy-utils\");\nvar _encodeUtils = require(\"./lib/binary-utils/encode-utils\");\nvar _getFirstCharacters = require(\"./lib/binary-utils/get-first-characters\");\nvar _fileAliases = require(\"./lib/path-utils/file-aliases\");\nvar _fileAliasesJs = require(\"./lib/path-utils/file-aliases.js\");\nvar _textIterators = require(\"./lib/iterator-utils/text-iterators\");\nvar _asyncIteration = require(\"./lib/iterator-utils/async-iteration\");\nvar _requestScheduler = require(\"./lib/request-utils/request-scheduler\");\nvar _requestSchedulerDefault = parcelHelpers.interopDefault(_requestScheduler);\nvar _childProcessProxy = require(\"./lib/process-utils/child-process-proxy\");\nvar _childProcessProxyDefault = parcelHelpers.interopDefault(_childProcessProxy);\nvar _meshUtils = require(\"./categories/mesh/mesh-utils\");\n\n},{\"./lib/path-utils/path\":\"eUONq\",\"./lib/env-utils/assert\":\"cIPKG\",\"./lib/env-utils/globals\":\"ePRrJ\",\"./lib/worker-loader-utils/create-worker\":false,\"./lib/worker-loader-utils/validate-loader-version\":\"7M9JP\",\"./lib/iterator-utils/make-transform-iterator\":false,\"./lib/worker-utils/get-transfer-list\":\"9YLKl\",\"./lib/worker-utils/worker-farm\":\"9zyvz\",\"./lib/worker-utils/worker-pool\":\"c0bFx\",\"./lib/worker-utils/worker-thread\":\"j7lkJ\",\"./lib/library-utils/library-utils\":false,\"./lib/parser-utils/parse-json\":false,\"./lib/binary-utils/buffer-utils\":false,\"./lib/binary-utils/array-buffer-utils\":\"4W57a\",\"./lib/binary-utils/memory-copy-utils\":false,\"./lib/binary-utils/binary-copy-utils\":false,\"./lib/binary-utils/encode-utils\":false,\"./lib/binary-utils/get-first-characters\":false,\"./lib/path-utils/file-aliases\":\"d3NlM\",\"./lib/path-utils/file-aliases.js\":\"d3NlM\",\"./lib/iterator-utils/text-iterators\":\"kPenS\",\"./lib/iterator-utils/async-iteration\":\"hdj4D\",\"./lib/request-utils/request-scheduler\":\"NRX8k\",\"./lib/process-utils/child-process-proxy\":false,\"./categories/mesh/mesh-utils\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eUONq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dirname\", ()=>dirname);\nfunction dirname(url) {\n    var slashIndex = url && url.lastIndexOf(\"/\");\n    return slashIndex >= 0 ? url.substr(0, slashIndex) : \"\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jA2du\":[function(require,module,exports) {\nexports.interopDefault = function(a) {\n    return a && a.__esModule ? a : {\n        default: a\n    };\n};\nexports.defineInteropFlag = function(a) {\n    Object.defineProperty(a, \"__esModule\", {\n        value: true\n    });\n};\nexports.exportAll = function(source, dest) {\n    Object.keys(source).forEach(function(key) {\n        if (key === \"default\" || key === \"__esModule\" || dest.hasOwnProperty(key)) return;\n        Object.defineProperty(dest, key, {\n            enumerable: true,\n            get: function() {\n                return source[key];\n            }\n        });\n    });\n    return dest;\n};\nexports.export = function(dest, destName, get) {\n    Object.defineProperty(dest, destName, {\n        enumerable: true,\n        get: get\n    });\n};\n\n},{}],\"cIPKG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"loader assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ePRrJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"self\", ()=>self_);\nparcelHelpers.export(exports, \"window\", ()=>window_);\nparcelHelpers.export(exports, \"global\", ()=>global_);\nparcelHelpers.export(exports, \"document\", ()=>document_);\nparcelHelpers.export(exports, \"isBrowser\", ()=>isBrowser);\nparcelHelpers.export(exports, \"isWorker\", ()=>isWorker);\nparcelHelpers.export(exports, \"nodeVersion\", ()=>nodeVersion);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar process = require(\"process\");\nvar global = arguments[3];\nvar globals = {\n    self: typeof self !== \"undefined\" && self,\n    window: typeof window !== \"undefined\" && window,\n    global: typeof global !== \"undefined\" && global,\n    document: typeof document !== \"undefined\" && document\n};\nvar self_ = globals.self || globals.window || globals.global;\nvar window_ = globals.window || globals.self || globals.global;\nvar global_ = globals.global || globals.self || globals.window;\nvar document_ = globals.document || {};\nvar isBrowser = (typeof process === \"undefined\" ? \"undefined\" : (0, _typeofDefault.default)(process)) !== \"object\" || String(process) !== \"[object process]\" || true;\nvar isWorker = typeof importScripts === \"function\";\nvar matches = typeof process !== \"undefined\" && process.version && process.version.match(/v([0-9]*)/);\nvar nodeVersion = matches && parseFloat(matches[1]) || 0;\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"process\":\"eKMhv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1p2Zr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _typeof(obj1) {\n    \"@babel/helpers - typeof\";\n    return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, _typeof(obj1);\n}\nexports.default = _typeof;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hecPM\":[function(require,module,exports) {\n// shim for using process in browser\nvar process = module.exports = {};\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\nvar cachedSetTimeout;\nvar cachedClearTimeout;\nfunction defaultSetTimout() {\n    throw new Error(\"setTimeout has not been defined\");\n}\nfunction defaultClearTimeout() {\n    throw new Error(\"clearTimeout has not been defined\");\n}\n(function() {\n    try {\n        if (typeof setTimeout === \"function\") cachedSetTimeout = setTimeout;\n        else cachedSetTimeout = defaultSetTimout;\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === \"function\") cachedClearTimeout = clearTimeout;\n        else cachedClearTimeout = defaultClearTimeout;\n    } catch (e1) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n})();\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) //normal enviroments in sane situations\n    return setTimeout(fun, 0);\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch (e) {\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch (e) {\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) //normal enviroments in sane situations\n    return clearTimeout(marker);\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e) {\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e) {\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) return;\n    draining = false;\n    if (currentQueue.length) queue = currentQueue.concat(queue);\n    else queueIndex = -1;\n    if (queue.length) drainQueue();\n}\nfunction drainQueue() {\n    if (draining) return;\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n    var len = queue.length;\n    while(len){\n        currentQueue = queue;\n        queue = [];\n        while(++queueIndex < len)if (currentQueue) currentQueue[queueIndex].run();\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\nprocess.nextTick = function(fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) for(var i = 1; i < arguments.length; i++)args[i - 1] = arguments[i];\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) runTimeout(drainQueue);\n};\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function() {\n    this.fun.apply(null, this.array);\n};\nprocess.title = \"browser\";\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = \"\"; // empty string to avoid regexp issues\nprocess.versions = {};\nfunction noop() {}\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\nprocess.listeners = function(name) {\n    return [];\n};\nprocess.binding = function(name) {\n    throw new Error(\"process.binding is not supported\");\n};\nprocess.cwd = function() {\n    return \"/\";\n};\nprocess.chdir = function(dir) {\n    throw new Error(\"process.chdir is not supported\");\n};\nprocess.umask = function() {\n    return 0;\n};\n\n},{}],\"eKMhv\":[function(require,module,exports) {\n// shim for using process in browser\nvar process = module.exports = {};\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\nvar cachedSetTimeout;\nvar cachedClearTimeout;\nfunction defaultSetTimout() {\n    throw new Error(\"setTimeout has not been defined\");\n}\nfunction defaultClearTimeout() {\n    throw new Error(\"clearTimeout has not been defined\");\n}\n(function() {\n    try {\n        if (typeof setTimeout === \"function\") cachedSetTimeout = setTimeout;\n        else cachedSetTimeout = defaultSetTimout;\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === \"function\") cachedClearTimeout = clearTimeout;\n        else cachedClearTimeout = defaultClearTimeout;\n    } catch (e1) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n})();\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) //normal enviroments in sane situations\n    return setTimeout(fun, 0);\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch (e) {\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch (e) {\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) //normal enviroments in sane situations\n    return clearTimeout(marker);\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e) {\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e) {\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) return;\n    draining = false;\n    if (currentQueue.length) queue = currentQueue.concat(queue);\n    else queueIndex = -1;\n    if (queue.length) drainQueue();\n}\nfunction drainQueue() {\n    if (draining) return;\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n    var len = queue.length;\n    while(len){\n        currentQueue = queue;\n        queue = [];\n        while(++queueIndex < len)if (currentQueue) currentQueue[queueIndex].run();\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\nprocess.nextTick = function(fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) for(var i = 1; i < arguments.length; i++)args[i - 1] = arguments[i];\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) runTimeout(drainQueue);\n};\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function() {\n    this.fun.apply(null, this.array);\n};\nprocess.title = \"browser\";\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = \"\"; // empty string to avoid regexp issues\nprocess.versions = {};\nfunction noop() {}\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\nprocess.listeners = function(name) {\n    return [];\n};\nprocess.binding = function(name) {\n    throw new Error(\"process.binding is not supported\");\n};\nprocess.cwd = function() {\n    return \"/\";\n};\nprocess.chdir = function(dir) {\n    throw new Error(\"process.chdir is not supported\");\n};\nprocess.umask = function() {\n    return 0;\n};\n\n},{}],\"7M9JP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"validateLoaderVersion\", ()=>validateLoaderVersion);\nvar _assert = require(\"../env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar VERSION = \"2.3.13\";\nfunction validateLoaderVersion(loader) {\n    var coreVersion = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : VERSION;\n    (0, _assertDefault.default)(loader, \"no loader provided\");\n    var loaderVersion = loader.version;\n    if (!coreVersion || !loaderVersion) return;\n    coreVersion = parseVersion(coreVersion);\n    loaderVersion = parseVersion(loaderVersion);\n}\nfunction parseVersion(version) {\n    var parts = version.split(\".\").map(Number);\n    return {\n        major: parts[0],\n        minor: parts[1]\n    };\n}\n\n},{\"../env-utils/assert\":\"cIPKG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9YLKl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getTransferList\", ()=>getTransferList);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nfunction getTransferList(object) {\n    var recursive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n    var transfers = arguments.length > 2 ? arguments[2] : undefined;\n    var transfersSet = transfers || new Set();\n    if (!object) ;\n    else if (isTransferable(object)) transfersSet.add(object);\n    else if (isTransferable(object.buffer)) transfersSet.add(object.buffer);\n    else if (ArrayBuffer.isView(object)) ;\n    else if (recursive && (0, _typeofDefault.default)(object) === \"object\") for(var key in object)getTransferList(object[key], recursive, transfersSet);\n    return transfers === undefined ? Array.from(transfersSet) : [];\n}\nfunction isTransferable(object) {\n    if (!object) return false;\n    if (object instanceof ArrayBuffer) return true;\n    if (typeof MessagePort !== \"undefined\" && object instanceof MessagePort) return true;\n    if (typeof ImageBitmap !== \"undefined\" && object instanceof ImageBitmap) return true;\n    if (typeof OffscreenCanvas !== \"undefined\" && object instanceof OffscreenCanvas) return true;\n    return false;\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9zyvz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>WorkerFarm);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _workerPool = require(\"./worker-pool\");\nvar _workerPoolDefault = parcelHelpers.interopDefault(_workerPool);\nvar DEFAULT_MAX_CONCURRENCY = 5;\nvar WorkerFarm = function() {\n    (0, _createClassDefault.default)(WorkerFarm1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported() {\n                return typeof Worker !== \"undefined\";\n            }\n        }\n    ]);\n    function WorkerFarm1(_ref) {\n        var _ref$maxConcurrency = _ref.maxConcurrency, maxConcurrency = _ref$maxConcurrency === void 0 ? DEFAULT_MAX_CONCURRENCY : _ref$maxConcurrency, _ref$onMessage = _ref.onMessage, onMessage = _ref$onMessage === void 0 ? null : _ref$onMessage, _ref$onDebug = _ref.onDebug, onDebug = _ref$onDebug === void 0 ? function() {} : _ref$onDebug, _ref$reuseWorkers = _ref.reuseWorkers, reuseWorkers = _ref$reuseWorkers === void 0 ? true : _ref$reuseWorkers;\n        (0, _classCallCheckDefault.default)(this, WorkerFarm1);\n        this.maxConcurrency = maxConcurrency;\n        this.onMessage = onMessage;\n        this.onDebug = onDebug;\n        this.workerPools = new Map();\n        this.reuseWorkers = reuseWorkers;\n    }\n    (0, _createClassDefault.default)(WorkerFarm1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"maxConcurrency\" in props) this.maxConcurrency = props.maxConcurrency;\n                if (\"onDebug\" in props) this.onDebug = props.onDebug;\n                if (\"reuseWorkers\" in props) this.reuseWorkers = props.reuseWorkers;\n            }\n        },\n        {\n            key: \"destroy\",\n            value: function destroy() {\n                this.workerPools.forEach(function(workerPool) {\n                    return workerPool.destroy();\n                });\n            }\n        },\n        {\n            key: \"process\",\n            value: function() {\n                var _process = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(workerSource, workerName, data) {\n                    var workerPool;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                workerPool = this._getWorkerPool(workerSource, workerName);\n                                return _context.abrupt(\"return\", workerPool.process(data));\n                            case 2:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this);\n                }));\n                function process(_x, _x2, _x3) {\n                    return _process.apply(this, arguments);\n                }\n                return process;\n            }()\n        },\n        {\n            key: \"_getWorkerPool\",\n            value: function _getWorkerPool(workerSource, workerName) {\n                var workerPool = this.workerPools.get(workerName);\n                if (!workerPool) {\n                    workerPool = new (0, _workerPoolDefault.default)({\n                        source: workerSource,\n                        name: workerName,\n                        onMessage: onWorkerMessage.bind(null, this.onMessage),\n                        maxConcurrency: this.maxConcurrency,\n                        onDebug: this.onDebug,\n                        reuseWorkers: this.reuseWorkers\n                    });\n                    this.workerPools.set(workerName, workerPool);\n                }\n                return workerPool;\n            }\n        }\n    ]);\n    return WorkerFarm1;\n}();\nfunction onWorkerMessage(onMessage, _ref2) {\n    var worker = _ref2.worker, data = _ref2.data, resolve = _ref2.resolve, reject = _ref2.reject;\n    if (onMessage) {\n        onMessage({\n            worker: worker,\n            data: data,\n            resolve: resolve,\n            reject: reject\n        });\n        return;\n    }\n    switch(data.type){\n        case \"done\":\n            resolve(data.result);\n            break;\n        case \"error\":\n            reject(data.message);\n            break;\n        default:\n    }\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./worker-pool\":\"c0bFx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eGRXL\":[function(require,module,exports) {\n// TODO(Babel 8): Remove this file.\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n    regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n    if (typeof globalThis === \"object\") globalThis.regeneratorRuntime = runtime;\n    else Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n\n},{\"../helpers/regeneratorRuntime\":\"kghw1\"}],\"kghw1\":[function(require,module,exports) {\nvar _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n    \"use strict\";\n    /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n        return exports;\n    }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n    var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, $Symbol = \"function\" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || \"@@iterator\", asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\", toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n    function define(obj, key, value) {\n        return Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }), obj[key];\n    }\n    try {\n        define({}, \"\");\n    } catch (err1) {\n        define = function define(obj, key, value) {\n            return obj[key] = value;\n        };\n    }\n    function wrap(innerFn1, outerFn, self1, tryLocsList) {\n        var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context1 = new Context(tryLocsList || []);\n        return generator._invoke = function(innerFn, self, context) {\n            var state = \"suspendedStart\";\n            return function(method, arg) {\n                if (\"executing\" === state) throw new Error(\"Generator is already running\");\n                if (\"completed\" === state) {\n                    if (\"throw\" === method) throw arg;\n                    return doneResult();\n                }\n                for(context.method = method, context.arg = arg;;){\n                    var delegate = context.delegate;\n                    if (delegate) {\n                        var delegateResult = maybeInvokeDelegate(delegate, context);\n                        if (delegateResult) {\n                            if (delegateResult === ContinueSentinel) continue;\n                            return delegateResult;\n                        }\n                    }\n                    if (\"next\" === context.method) context.sent = context._sent = context.arg;\n                    else if (\"throw\" === context.method) {\n                        if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n                        context.dispatchException(context.arg);\n                    } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n                    state = \"executing\";\n                    var record = tryCatch(innerFn, self, context);\n                    if (\"normal\" === record.type) {\n                        if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n                        return {\n                            value: record.arg,\n                            done: context.done\n                        };\n                    }\n                    \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n                }\n            };\n        }(innerFn1, self1, context1), generator;\n    }\n    function tryCatch(fn, obj, arg) {\n        try {\n            return {\n                type: \"normal\",\n                arg: fn.call(obj, arg)\n            };\n        } catch (err) {\n            return {\n                type: \"throw\",\n                arg: err\n            };\n        }\n    }\n    exports.wrap = wrap;\n    var ContinueSentinel = {};\n    function Generator() {}\n    function GeneratorFunction() {}\n    function GeneratorFunctionPrototype() {}\n    var IteratorPrototype = {};\n    define(IteratorPrototype, iteratorSymbol, function() {\n        return this;\n    });\n    var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n    NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n    var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n    function defineIteratorMethods(prototype) {\n        [\n            \"next\",\n            \"throw\",\n            \"return\"\n        ].forEach(function(method) {\n            define(prototype, method, function(arg) {\n                return this._invoke(method, arg);\n            });\n        });\n    }\n    function AsyncIterator(generator, PromiseImpl) {\n        function invoke(method, arg, resolve, reject) {\n            var record = tryCatch(generator[method], generator, arg);\n            if (\"throw\" !== record.type) {\n                var result = record.arg, value1 = result.value;\n                return value1 && \"object\" == _typeof(value1) && hasOwn.call(value1, \"__await\") ? PromiseImpl.resolve(value1.__await).then(function(value) {\n                    invoke(\"next\", value, resolve, reject);\n                }, function(err) {\n                    invoke(\"throw\", err, resolve, reject);\n                }) : PromiseImpl.resolve(value1).then(function(unwrapped) {\n                    result.value = unwrapped, resolve(result);\n                }, function(error) {\n                    return invoke(\"throw\", error, resolve, reject);\n                });\n            }\n            reject(record.arg);\n        }\n        var previousPromise;\n        this._invoke = function(method, arg) {\n            function callInvokeWithMethodAndArg() {\n                return new PromiseImpl(function(resolve, reject) {\n                    invoke(method, arg, resolve, reject);\n                });\n            }\n            return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n        };\n    }\n    function maybeInvokeDelegate(delegate, context) {\n        var method = delegate.iterator[context.method];\n        if (undefined === method) {\n            if (context.delegate = null, \"throw\" === context.method) {\n                if (delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method)) return ContinueSentinel;\n                context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a 'throw' method\");\n            }\n            return ContinueSentinel;\n        }\n        var record = tryCatch(method, delegate.iterator, context.arg);\n        if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n        var info = record.arg;\n        return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n    }\n    function pushTryEntry(locs) {\n        var entry = {\n            tryLoc: locs[0]\n        };\n        1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n    }\n    function resetTryEntry(entry) {\n        var record = entry.completion || {};\n        record.type = \"normal\", delete record.arg, entry.completion = record;\n    }\n    function Context(tryLocsList) {\n        this.tryEntries = [\n            {\n                tryLoc: \"root\"\n            }\n        ], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n    }\n    function values(iterable) {\n        if (iterable) {\n            var iteratorMethod = iterable[iteratorSymbol];\n            if (iteratorMethod) return iteratorMethod.call(iterable);\n            if (\"function\" == typeof iterable.next) return iterable;\n            if (!isNaN(iterable.length)) {\n                var i = -1, next1 = function next() {\n                    for(; ++i < iterable.length;){\n                        if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n                    }\n                    return next.value = undefined, next.done = !0, next;\n                };\n                return next1.next = next1;\n            }\n        }\n        return {\n            next: doneResult\n        };\n    }\n    function doneResult() {\n        return {\n            value: undefined,\n            done: !0\n        };\n    }\n    return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, \"constructor\", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function(genFun) {\n        var ctor = \"function\" == typeof genFun && genFun.constructor;\n        return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n    }, exports.mark = function(genFun) {\n        return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n    }, exports.awrap = function(arg) {\n        return {\n            __await: arg\n        };\n    }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function() {\n        return this;\n    }), exports.AsyncIterator = AsyncIterator, exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n        void 0 === PromiseImpl && (PromiseImpl = Promise);\n        var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n        return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function(result) {\n            return result.done ? result.value : iter.next();\n        });\n    }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function() {\n        return this;\n    }), define(Gp, \"toString\", function() {\n        return \"[object Generator]\";\n    }), exports.keys = function(object) {\n        var keys = [];\n        for(var key1 in object)keys.push(key1);\n        return keys.reverse(), function next() {\n            for(; keys.length;){\n                var key = keys.pop();\n                if (key in object) return next.value = key, next.done = !1, next;\n            }\n            return next.done = !0, next;\n        };\n    }, exports.values = values, Context.prototype = {\n        constructor: Context,\n        reset: function reset(skipTempReset) {\n            if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for(var name in this)\"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n        },\n        stop: function stop() {\n            this.done = !0;\n            var rootRecord = this.tryEntries[0].completion;\n            if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n            return this.rval;\n        },\n        dispatchException: function dispatchException(exception) {\n            if (this.done) throw exception;\n            var context = this;\n            function handle(loc, caught) {\n                return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n            }\n            for(var i = this.tryEntries.length - 1; i >= 0; --i){\n                var entry = this.tryEntries[i], record = entry.completion;\n                if (\"root\" === entry.tryLoc) return handle(\"end\");\n                if (entry.tryLoc <= this.prev) {\n                    var hasCatch = hasOwn.call(entry, \"catchLoc\"), hasFinally = hasOwn.call(entry, \"finallyLoc\");\n                    if (hasCatch && hasFinally) {\n                        if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n                        if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n                    } else if (hasCatch) {\n                        if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n                    } else {\n                        if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n                        if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n                    }\n                }\n            }\n        },\n        abrupt: function abrupt(type, arg) {\n            for(var i = this.tryEntries.length - 1; i >= 0; --i){\n                var entry = this.tryEntries[i];\n                if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n                    var finallyEntry = entry;\n                    break;\n                }\n            }\n            finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n            var record = finallyEntry ? finallyEntry.completion : {};\n            return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n        },\n        complete: function complete(record, afterLoc) {\n            if (\"throw\" === record.type) throw record.arg;\n            return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n        },\n        finish: function finish(finallyLoc) {\n            for(var i = this.tryEntries.length - 1; i >= 0; --i){\n                var entry = this.tryEntries[i];\n                if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n            }\n        },\n        \"catch\": function _catch(tryLoc) {\n            for(var i = this.tryEntries.length - 1; i >= 0; --i){\n                var entry = this.tryEntries[i];\n                if (entry.tryLoc === tryLoc) {\n                    var record = entry.completion;\n                    if (\"throw\" === record.type) {\n                        var thrown = record.arg;\n                        resetTryEntry(entry);\n                    }\n                    return thrown;\n                }\n            }\n            throw new Error(\"illegal catch attempt\");\n        },\n        delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n            return this.delegate = {\n                iterator: values(iterable),\n                resultName: resultName,\n                nextLoc: nextLoc\n            }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n        }\n    }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n\n},{\"./typeof.js\":\"48e6J\"}],\"48e6J\":[function(require,module,exports) {\nfunction _typeof(obj1) {\n    \"@babel/helpers - typeof\";\n    return module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports, _typeof(obj1);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n\n},{}],\"cPT1v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n    try {\n        var info = gen[key](arg);\n        var value = info.value;\n    } catch (error) {\n        reject(error);\n        return;\n    }\n    if (info.done) resolve(value);\n    else Promise.resolve(value).then(_next, _throw);\n}\nfunction _asyncToGenerator(fn) {\n    return function() {\n        var self = this, args = arguments;\n        return new Promise(function(resolve, reject) {\n            var gen = fn.apply(self, args);\n            function _next(value) {\n                asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n            }\n            function _throw(err) {\n                asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n            }\n            _next(undefined);\n        });\n    };\n}\nexports.default = _asyncToGenerator;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cQI2E\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexports.default = _classCallCheck;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3n6fc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _defineProperties(target, props) {\n    for(var i = 0; i < props.length; i++){\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n    }\n}\nfunction _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    Object.defineProperty(Constructor, \"prototype\", {\n        writable: false\n    });\n    return Constructor;\n}\nexports.default = _createClass;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c0bFx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>WorkerPool);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _workerThread = require(\"./worker-thread\");\nvar _workerThreadDefault = parcelHelpers.interopDefault(_workerThread);\nvar WorkerPool = function() {\n    function WorkerPool1(_ref) {\n        var source = _ref.source, _ref$name = _ref.name, name = _ref$name === void 0 ? \"unnamed\" : _ref$name, _ref$maxConcurrency = _ref.maxConcurrency, maxConcurrency = _ref$maxConcurrency === void 0 ? 1 : _ref$maxConcurrency, onMessage = _ref.onMessage, _ref$onDebug = _ref.onDebug, onDebug = _ref$onDebug === void 0 ? function() {} : _ref$onDebug, _ref$reuseWorkers = _ref.reuseWorkers, reuseWorkers = _ref$reuseWorkers === void 0 ? true : _ref$reuseWorkers;\n        (0, _classCallCheckDefault.default)(this, WorkerPool1);\n        this.source = source;\n        this.name = name;\n        this.maxConcurrency = maxConcurrency;\n        this.onMessage = onMessage;\n        this.onDebug = onDebug;\n        this.jobQueue = [];\n        this.idleQueue = [];\n        this.count = 0;\n        this.isDestroyed = false;\n        this.reuseWorkers = reuseWorkers;\n    }\n    (0, _createClassDefault.default)(WorkerPool1, [\n        {\n            key: \"destroy\",\n            value: function destroy() {\n                this.idleQueue.forEach(function(worker) {\n                    return worker.destroy();\n                });\n                this.isDestroyed = true;\n            }\n        },\n        {\n            key: \"process\",\n            value: function process(data, jobName) {\n                var _this = this;\n                return new Promise(function(resolve, reject) {\n                    _this.jobQueue.push({\n                        data: data,\n                        jobName: jobName,\n                        resolve: resolve,\n                        reject: reject\n                    });\n                    _this._startQueuedJob();\n                });\n            }\n        },\n        {\n            key: \"_startQueuedJob\",\n            value: function() {\n                var _startQueuedJob2 = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee() {\n                    var worker, job;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                if (this.jobQueue.length) {\n                                    _context.next = 2;\n                                    break;\n                                }\n                                return _context.abrupt(\"return\");\n                            case 2:\n                                worker = this._getAvailableWorker();\n                                if (worker) {\n                                    _context.next = 5;\n                                    break;\n                                }\n                                return _context.abrupt(\"return\");\n                            case 5:\n                                job = this.jobQueue.shift();\n                                this.onDebug({\n                                    message: \"processing\",\n                                    worker: worker.name,\n                                    job: job.jobName,\n                                    backlog: this.jobQueue.length\n                                });\n                                _context.prev = 7;\n                                _context.t0 = job;\n                                _context.next = 11;\n                                return worker.process(job.data);\n                            case 11:\n                                _context.t1 = _context.sent;\n                                _context.t0.resolve.call(_context.t0, _context.t1);\n                                _context.next = 18;\n                                break;\n                            case 15:\n                                _context.prev = 15;\n                                _context.t2 = _context[\"catch\"](7);\n                                job.reject(_context.t2);\n                            case 18:\n                                _context.prev = 18;\n                                this._onWorkerDone(worker);\n                                return _context.finish(18);\n                            case 21:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this, [\n                        [\n                            7,\n                            15,\n                            18,\n                            21\n                        ]\n                    ]);\n                }));\n                function _startQueuedJob() {\n                    return _startQueuedJob2.apply(this, arguments);\n                }\n                return _startQueuedJob;\n            }()\n        },\n        {\n            key: \"_onWorkerDone\",\n            value: function _onWorkerDone(worker) {\n                if (this.isDestroyed) {\n                    worker.destroy();\n                    return;\n                }\n                if (this.reuseWorkers) this.idleQueue.push(worker);\n                else {\n                    worker.destroy();\n                    this.count--;\n                }\n                this._startQueuedJob();\n            }\n        },\n        {\n            key: \"_getAvailableWorker\",\n            value: function _getAvailableWorker() {\n                if (this.idleQueue.length > 0) return this.idleQueue.shift();\n                if (this.count < this.maxConcurrency) {\n                    this.count++;\n                    var name = \"\".concat(this.name.toLowerCase(), \" (#\").concat(this.count, \" of \").concat(this.maxConcurrency, \")\");\n                    return new (0, _workerThreadDefault.default)({\n                        source: this.source,\n                        onMessage: this.onMessage,\n                        name: name\n                    });\n                }\n                return null;\n            }\n        }\n    ]);\n    return WorkerPool1;\n}();\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./worker-thread\":\"j7lkJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j7lkJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>WorkerThread);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _getWorkerUrl = require(\"./get-worker-url\");\nvar _getTransferList = require(\"./get-transfer-list\");\nvar count = 0;\nfunction defaultOnMessage(_ref) {\n    var data = _ref.data, resolve = _ref.resolve;\n    resolve(data);\n}\nvar WorkerThread = function() {\n    function WorkerThread1(_ref2) {\n        var source = _ref2.source, _ref2$name = _ref2.name, name = _ref2$name === void 0 ? \"web-worker-\".concat(count++) : _ref2$name, onMessage = _ref2.onMessage;\n        (0, _classCallCheckDefault.default)(this, WorkerThread1);\n        var url = (0, _getWorkerUrl.getWorkerURL)(source, name);\n        this.worker = new Worker(url, {\n            name: name\n        });\n        this.name = name;\n        this.onMessage = onMessage || defaultOnMessage;\n    }\n    (0, _createClassDefault.default)(WorkerThread1, [\n        {\n            key: \"process\",\n            value: function() {\n                var _process = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(data) {\n                    var _this = this;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                return _context.abrupt(\"return\", new Promise(function(resolve, reject) {\n                                    _this.worker.onmessage = function(event) {\n                                        _this.onMessage({\n                                            worker: _this.worker,\n                                            data: event.data,\n                                            resolve: resolve,\n                                            reject: reject\n                                        });\n                                    };\n                                    _this.worker.onerror = function(error) {\n                                        var message = \"\".concat(_this.name, \": WorkerThread.process() failed\");\n                                        if (error.message) message += \" \".concat(error.message, \" \").concat(error.filename, \":\").concat(error.lineno, \":\").concat(error.colno);\n                                        var betterError = new Error(message);\n                                        console.error(error);\n                                        reject(betterError);\n                                    };\n                                    var transferList = (0, _getTransferList.getTransferList)(data);\n                                    _this.worker.postMessage(data, transferList);\n                                }));\n                            case 1:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee);\n                }));\n                function process(_x) {\n                    return _process.apply(this, arguments);\n                }\n                return process;\n            }()\n        },\n        {\n            key: \"destroy\",\n            value: function destroy() {\n                this.worker.terminate();\n                this.worker = null;\n            }\n        }\n    ]);\n    return WorkerThread1;\n}();\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./get-worker-url\":\"bt7LA\",\"./get-transfer-list\":\"9YLKl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bt7LA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getWorkerURL\", ()=>getWorkerURL);\nvar _assert = require(\"../env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar workerURLCache = new Map();\nfunction getWorkerURL(workerSource) {\n    var workerName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"Worker\";\n    (0, _assertDefault.default)(typeof workerSource === \"string\", \"worker source\");\n    if (workerSource.startsWith(\"url(\") && workerSource.endsWith(\")\")) {\n        var workerUrl = workerSource.match(/^url\\((.*)\\)$/)[1];\n        if (workerUrl && !workerUrl.startsWith(\"http\")) return workerUrl;\n        workerSource = buildScript(workerUrl);\n    }\n    var workerURL = workerURLCache.get(workerSource);\n    if (!workerURL) {\n        var blob = new Blob([\n            workerSource\n        ], {\n            type: \"application/javascript\"\n        });\n        workerURL = URL.createObjectURL(blob);\n        workerURLCache.set(workerSource, workerURL);\n    }\n    return workerURL;\n}\nfunction buildScript(workerUrl) {\n    return \"try {\\n  importScripts('\".concat(workerUrl, \"');\\n} catch (error) {\\n  console.error(error);\\n}\");\n}\n\n},{\"../env-utils/assert\":\"cIPKG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4W57a\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"toArrayBuffer\", ()=>toArrayBuffer);\nparcelHelpers.export(exports, \"compareArrayBuffers\", ()=>compareArrayBuffers);\nparcelHelpers.export(exports, \"concatenateArrayBuffers\", ()=>concatenateArrayBuffers);\nparcelHelpers.export(exports, \"sliceArrayBuffer\", ()=>sliceArrayBuffer);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _assert = require(\"../env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _bufferUtilsNode = require(\"../node/buffer-utils.node\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction toArrayBuffer(data) {\n    if (_bufferUtilsNode.toArrayBuffer) data = _bufferUtilsNode.toArrayBuffer(data);\n    if (data instanceof ArrayBuffer) return data;\n    if (ArrayBuffer.isView(data)) return data.buffer;\n    if (typeof data === \"string\") {\n        var text = data;\n        var uint8Array = new TextEncoder().encode(text);\n        return uint8Array.buffer;\n    }\n    if (data && (0, _typeofDefault.default)(data) === \"object\" && data._toArrayBuffer) return data._toArrayBuffer();\n    return (0, _assertDefault.default)(false);\n}\nfunction compareArrayBuffers(arrayBuffer1, arrayBuffer2, byteLength) {\n    byteLength = byteLength || arrayBuffer1.byteLength;\n    if (arrayBuffer1.byteLength < byteLength || arrayBuffer2.byteLength < byteLength) return false;\n    var array1 = new Uint8Array(arrayBuffer1);\n    var array2 = new Uint8Array(arrayBuffer2);\n    for(var i = 0; i < array1.length; ++i){\n        if (array1[i] !== array2[i]) return false;\n    }\n    return true;\n}\nfunction concatenateArrayBuffers() {\n    for(var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++)sources[_key] = arguments[_key];\n    var sourceArrays = sources.map(function(source2) {\n        return source2 instanceof ArrayBuffer ? new Uint8Array(source2) : source2;\n    });\n    var byteLength = sourceArrays.reduce(function(length, typedArray) {\n        return length + typedArray.byteLength;\n    }, 0);\n    var result = new Uint8Array(byteLength);\n    var offset = 0;\n    var _iterator = _createForOfIteratorHelper(sourceArrays), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var sourceArray = _step.value;\n            result.set(sourceArray, offset);\n            offset += sourceArray.byteLength;\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    return result.buffer;\n}\nfunction sliceArrayBuffer(arrayBuffer, byteOffset, byteLength) {\n    var subArray = byteLength !== undefined ? new Uint8Array(arrayBuffer).subarray(byteOffset, byteOffset + byteLength) : new Uint8Array(arrayBuffer).subarray(byteOffset);\n    var arrayCopy = new Uint8Array(subArray);\n    return arrayCopy.buffer;\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"../env-utils/assert\":\"cIPKG\",\"../node/buffer-utils.node\":\"gJghy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gJghy\":[function(require,module,exports) {\n\"use strict\";\n\n},{}],\"d3NlM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>setPathPrefix);\nparcelHelpers.export(exports, \"getPathPrefix\", ()=>getPathPrefix);\nparcelHelpers.export(exports, \"addAliases\", ()=>addAliases);\nparcelHelpers.export(exports, \"resolvePath\", ()=>resolvePath);\nvar pathPrefix = \"\";\nvar fileAliases = {};\nfunction setPathPrefix(prefix) {\n    pathPrefix = prefix;\n}\nfunction getPathPrefix() {\n    return pathPrefix;\n}\nfunction addAliases(aliases) {\n    Object.assign(fileAliases, aliases);\n}\nfunction resolvePath(filename) {\n    for(var alias in fileAliases)if (filename.startsWith(alias)) {\n        var replacement = fileAliases[alias];\n        filename = filename.replace(alias, replacement);\n    }\n    if (!filename.startsWith(\"http://\") && !filename.startsWith(\"https://\")) filename = \"\".concat(pathPrefix).concat(filename);\n    return filename;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kPenS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeTextDecoderIterator\", ()=>makeTextDecoderIterator);\nparcelHelpers.export(exports, \"makeTextEncoderIterator\", ()=>makeTextEncoderIterator);\nparcelHelpers.export(exports, \"makeLineIterator\", ()=>makeLineIterator);\nparcelHelpers.export(exports, \"makeNumberedLineIterator\", ()=>makeNumberedLineIterator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _awaitAsyncGenerator = require(\"@babel/runtime/helpers/esm/awaitAsyncGenerator\");\nvar _awaitAsyncGeneratorDefault = parcelHelpers.interopDefault(_awaitAsyncGenerator);\nvar _wrapAsyncGenerator = require(\"@babel/runtime/helpers/esm/wrapAsyncGenerator\");\nvar _wrapAsyncGeneratorDefault = parcelHelpers.interopDefault(_wrapAsyncGenerator);\nvar _asyncIterator = require(\"@babel/runtime/helpers/esm/asyncIterator\");\nvar _asyncIteratorDefault = parcelHelpers.interopDefault(_asyncIterator);\nfunction makeTextDecoderIterator(_x, _x2) {\n    return _makeTextDecoderIterator.apply(this, arguments);\n}\nfunction _makeTextDecoderIterator() {\n    _makeTextDecoderIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(arrayBufferIterator, options) {\n        var textDecoder, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, arrayBuffer;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    textDecoder = new TextDecoder(options);\n                    _iteratorNormalCompletion = true;\n                    _didIteratorError = false;\n                    _context.prev = 3;\n                    _iterator = (0, _asyncIteratorDefault.default)(arrayBufferIterator);\n                case 5:\n                    _context.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator.next());\n                case 7:\n                    _step = _context.sent;\n                    _iteratorNormalCompletion = _step.done;\n                    _context.next = 11;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step.value);\n                case 11:\n                    _value = _context.sent;\n                    if (_iteratorNormalCompletion) {\n                        _context.next = 19;\n                        break;\n                    }\n                    arrayBuffer = _value;\n                    _context.next = 16;\n                    return typeof arrayBuffer === \"string\" ? arrayBuffer : textDecoder.decode(arrayBuffer, {\n                        stream: true\n                    });\n                case 16:\n                    _iteratorNormalCompletion = true;\n                    _context.next = 5;\n                    break;\n                case 19:\n                    _context.next = 25;\n                    break;\n                case 21:\n                    _context.prev = 21;\n                    _context.t0 = _context[\"catch\"](3);\n                    _didIteratorError = true;\n                    _iteratorError = _context.t0;\n                case 25:\n                    _context.prev = 25;\n                    _context.prev = 26;\n                    if (!(!_iteratorNormalCompletion && _iterator[\"return\"] != null)) {\n                        _context.next = 30;\n                        break;\n                    }\n                    _context.next = 30;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator[\"return\"]());\n                case 30:\n                    _context.prev = 30;\n                    if (!_didIteratorError) {\n                        _context.next = 33;\n                        break;\n                    }\n                    throw _iteratorError;\n                case 33:\n                    return _context.finish(30);\n                case 34:\n                    return _context.finish(25);\n                case 35:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                3,\n                21,\n                25,\n                35\n            ],\n            [\n                26,\n                ,\n                30,\n                34\n            ]\n        ]);\n    }));\n    return _makeTextDecoderIterator.apply(this, arguments);\n}\nfunction makeTextEncoderIterator(_x3, _x4) {\n    return _makeTextEncoderIterator.apply(this, arguments);\n}\nfunction _makeTextEncoderIterator() {\n    _makeTextEncoderIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(textIterator, options) {\n        var textEncoder, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, _value2, text;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    textEncoder = new TextEncoder();\n                    _iteratorNormalCompletion2 = true;\n                    _didIteratorError2 = false;\n                    _context2.prev = 3;\n                    _iterator2 = (0, _asyncIteratorDefault.default)(textIterator);\n                case 5:\n                    _context2.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator2.next());\n                case 7:\n                    _step2 = _context2.sent;\n                    _iteratorNormalCompletion2 = _step2.done;\n                    _context2.next = 11;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step2.value);\n                case 11:\n                    _value2 = _context2.sent;\n                    if (_iteratorNormalCompletion2) {\n                        _context2.next = 19;\n                        break;\n                    }\n                    text = _value2;\n                    _context2.next = 16;\n                    return typeof text === \"string\" ? textEncoder.encode(text) : text;\n                case 16:\n                    _iteratorNormalCompletion2 = true;\n                    _context2.next = 5;\n                    break;\n                case 19:\n                    _context2.next = 25;\n                    break;\n                case 21:\n                    _context2.prev = 21;\n                    _context2.t0 = _context2[\"catch\"](3);\n                    _didIteratorError2 = true;\n                    _iteratorError2 = _context2.t0;\n                case 25:\n                    _context2.prev = 25;\n                    _context2.prev = 26;\n                    if (!(!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null)) {\n                        _context2.next = 30;\n                        break;\n                    }\n                    _context2.next = 30;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator2[\"return\"]());\n                case 30:\n                    _context2.prev = 30;\n                    if (!_didIteratorError2) {\n                        _context2.next = 33;\n                        break;\n                    }\n                    throw _iteratorError2;\n                case 33:\n                    return _context2.finish(30);\n                case 34:\n                    return _context2.finish(25);\n                case 35:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2, null, [\n            [\n                3,\n                21,\n                25,\n                35\n            ],\n            [\n                26,\n                ,\n                30,\n                34\n            ]\n        ]);\n    }));\n    return _makeTextEncoderIterator.apply(this, arguments);\n}\nfunction makeLineIterator(_x5) {\n    return _makeLineIterator.apply(this, arguments);\n}\nfunction _makeLineIterator() {\n    _makeLineIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee3(textIterator) {\n        var previous, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, _value3, textChunk, eolIndex, line;\n        return (0, _regeneratorDefault.default).wrap(function _callee3$(_context3) {\n            while(true)switch(_context3.prev = _context3.next){\n                case 0:\n                    previous = \"\";\n                    _iteratorNormalCompletion3 = true;\n                    _didIteratorError3 = false;\n                    _context3.prev = 3;\n                    _iterator3 = (0, _asyncIteratorDefault.default)(textIterator);\n                case 5:\n                    _context3.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator3.next());\n                case 7:\n                    _step3 = _context3.sent;\n                    _iteratorNormalCompletion3 = _step3.done;\n                    _context3.next = 11;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step3.value);\n                case 11:\n                    _value3 = _context3.sent;\n                    if (_iteratorNormalCompletion3) {\n                        _context3.next = 26;\n                        break;\n                    }\n                    textChunk = _value3;\n                    previous += textChunk;\n                    eolIndex = void 0;\n                case 16:\n                    if (!((eolIndex = previous.indexOf(\"\\n\")) >= 0)) {\n                        _context3.next = 23;\n                        break;\n                    }\n                    line = previous.slice(0, eolIndex + 1);\n                    previous = previous.slice(eolIndex + 1);\n                    _context3.next = 21;\n                    return line;\n                case 21:\n                    _context3.next = 16;\n                    break;\n                case 23:\n                    _iteratorNormalCompletion3 = true;\n                    _context3.next = 5;\n                    break;\n                case 26:\n                    _context3.next = 32;\n                    break;\n                case 28:\n                    _context3.prev = 28;\n                    _context3.t0 = _context3[\"catch\"](3);\n                    _didIteratorError3 = true;\n                    _iteratorError3 = _context3.t0;\n                case 32:\n                    _context3.prev = 32;\n                    _context3.prev = 33;\n                    if (!(!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null)) {\n                        _context3.next = 37;\n                        break;\n                    }\n                    _context3.next = 37;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator3[\"return\"]());\n                case 37:\n                    _context3.prev = 37;\n                    if (!_didIteratorError3) {\n                        _context3.next = 40;\n                        break;\n                    }\n                    throw _iteratorError3;\n                case 40:\n                    return _context3.finish(37);\n                case 41:\n                    return _context3.finish(32);\n                case 42:\n                    if (!(previous.length > 0)) {\n                        _context3.next = 45;\n                        break;\n                    }\n                    _context3.next = 45;\n                    return previous;\n                case 45:\n                case \"end\":\n                    return _context3.stop();\n            }\n        }, _callee3, null, [\n            [\n                3,\n                28,\n                32,\n                42\n            ],\n            [\n                33,\n                ,\n                37,\n                41\n            ]\n        ]);\n    }));\n    return _makeLineIterator.apply(this, arguments);\n}\nfunction makeNumberedLineIterator(_x6) {\n    return _makeNumberedLineIterator.apply(this, arguments);\n}\nfunction _makeNumberedLineIterator() {\n    _makeNumberedLineIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee4(lineIterator) {\n        var counter, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, _value4, line;\n        return (0, _regeneratorDefault.default).wrap(function _callee4$(_context4) {\n            while(true)switch(_context4.prev = _context4.next){\n                case 0:\n                    counter = 1;\n                    _iteratorNormalCompletion4 = true;\n                    _didIteratorError4 = false;\n                    _context4.prev = 3;\n                    _iterator4 = (0, _asyncIteratorDefault.default)(lineIterator);\n                case 5:\n                    _context4.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator4.next());\n                case 7:\n                    _step4 = _context4.sent;\n                    _iteratorNormalCompletion4 = _step4.done;\n                    _context4.next = 11;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step4.value);\n                case 11:\n                    _value4 = _context4.sent;\n                    if (_iteratorNormalCompletion4) {\n                        _context4.next = 20;\n                        break;\n                    }\n                    line = _value4;\n                    _context4.next = 16;\n                    return {\n                        counter: counter,\n                        line: line\n                    };\n                case 16:\n                    counter++;\n                case 17:\n                    _iteratorNormalCompletion4 = true;\n                    _context4.next = 5;\n                    break;\n                case 20:\n                    _context4.next = 26;\n                    break;\n                case 22:\n                    _context4.prev = 22;\n                    _context4.t0 = _context4[\"catch\"](3);\n                    _didIteratorError4 = true;\n                    _iteratorError4 = _context4.t0;\n                case 26:\n                    _context4.prev = 26;\n                    _context4.prev = 27;\n                    if (!(!_iteratorNormalCompletion4 && _iterator4[\"return\"] != null)) {\n                        _context4.next = 31;\n                        break;\n                    }\n                    _context4.next = 31;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator4[\"return\"]());\n                case 31:\n                    _context4.prev = 31;\n                    if (!_didIteratorError4) {\n                        _context4.next = 34;\n                        break;\n                    }\n                    throw _iteratorError4;\n                case 34:\n                    return _context4.finish(31);\n                case 35:\n                    return _context4.finish(26);\n                case 36:\n                case \"end\":\n                    return _context4.stop();\n            }\n        }, _callee4, null, [\n            [\n                3,\n                22,\n                26,\n                36\n            ],\n            [\n                27,\n                ,\n                31,\n                35\n            ]\n        ]);\n    }));\n    return _makeNumberedLineIterator.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/awaitAsyncGenerator\":\"79Bzs\",\"@babel/runtime/helpers/esm/wrapAsyncGenerator\":\"avO1B\",\"@babel/runtime/helpers/esm/asyncIterator\":\"hoXxr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"79Bzs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _awaitValueJs = require(\"./AwaitValue.js\");\nvar _awaitValueJsDefault = parcelHelpers.interopDefault(_awaitValueJs);\nfunction _awaitAsyncGenerator(value) {\n    return new (0, _awaitValueJsDefault.default)(value);\n}\nexports.default = _awaitAsyncGenerator;\n\n},{\"./AwaitValue.js\":\"249UJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"249UJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _AwaitValue(value) {\n    this.wrapped = value;\n}\nexports.default = _AwaitValue;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"avO1B\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _asyncGeneratorJs = require(\"./AsyncGenerator.js\");\nvar _asyncGeneratorJsDefault = parcelHelpers.interopDefault(_asyncGeneratorJs);\nfunction _wrapAsyncGenerator(fn) {\n    return function() {\n        return new (0, _asyncGeneratorJsDefault.default)(fn.apply(this, arguments));\n    };\n}\nexports.default = _wrapAsyncGenerator;\n\n},{\"./AsyncGenerator.js\":\"3RPo6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3RPo6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _awaitValueJs = require(\"./AwaitValue.js\");\nvar _awaitValueJsDefault = parcelHelpers.interopDefault(_awaitValueJs);\nfunction AsyncGenerator(gen) {\n    var front, back;\n    function send(key, arg) {\n        return new Promise(function(resolve, reject) {\n            var request = {\n                key: key,\n                arg: arg,\n                resolve: resolve,\n                reject: reject,\n                next: null\n            };\n            if (back) back = back.next = request;\n            else {\n                front = back = request;\n                resume(key, arg);\n            }\n        });\n    }\n    function resume(key, arg1) {\n        try {\n            var result = gen[key](arg1);\n            var value = result.value;\n            var wrappedAwait = value instanceof (0, _awaitValueJsDefault.default);\n            Promise.resolve(wrappedAwait ? value.wrapped : value).then(function(arg) {\n                if (wrappedAwait) {\n                    resume(key === \"return\" ? \"return\" : \"next\", arg);\n                    return;\n                }\n                settle(result.done ? \"return\" : \"normal\", arg);\n            }, function(err) {\n                resume(\"throw\", err);\n            });\n        } catch (err) {\n            settle(\"throw\", err);\n        }\n    }\n    function settle(type, value) {\n        switch(type){\n            case \"return\":\n                front.resolve({\n                    value: value,\n                    done: true\n                });\n                break;\n            case \"throw\":\n                front.reject(value);\n                break;\n            default:\n                front.resolve({\n                    value: value,\n                    done: false\n                });\n                break;\n        }\n        front = front.next;\n        if (front) resume(front.key, front.arg);\n        else back = null;\n    }\n    this._invoke = send;\n    if (typeof gen[\"return\"] !== \"function\") this[\"return\"] = undefined;\n}\nexports.default = AsyncGenerator;\nAsyncGenerator.prototype[typeof Symbol === \"function\" && Symbol.asyncIterator || \"@@asyncIterator\"] = function() {\n    return this;\n};\nAsyncGenerator.prototype.next = function(arg) {\n    return this._invoke(\"next\", arg);\n};\nAsyncGenerator.prototype[\"throw\"] = function(arg) {\n    return this._invoke(\"throw\", arg);\n};\nAsyncGenerator.prototype[\"return\"] = function(arg) {\n    return this._invoke(\"return\", arg);\n};\n\n},{\"./AwaitValue.js\":\"249UJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hoXxr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _asyncIterator(iterable) {\n    var method, async, sync, retry = 2;\n    for(\"undefined\" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;){\n        if (async && null != (method = iterable[async])) return method.call(iterable);\n        if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable));\n        async = \"@@asyncIterator\", sync = \"@@iterator\";\n    }\n    throw new TypeError(\"Object is not async iterable\");\n}\nexports.default = _asyncIterator;\nfunction AsyncFromSyncIterator(s1) {\n    function AsyncFromSyncIteratorContinuation(r) {\n        if (Object(r) !== r) return Promise.reject(new TypeError(r + \" is not an object.\"));\n        var done = r.done;\n        return Promise.resolve(r.value).then(function(value) {\n            return {\n                value: value,\n                done: done\n            };\n        });\n    }\n    return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) {\n        this.s = s, this.n = s.next;\n    }, AsyncFromSyncIterator.prototype = {\n        s: null,\n        n: null,\n        next: function next() {\n            return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));\n        },\n        \"return\": function _return(value) {\n            var ret = this.s[\"return\"];\n            return void 0 === ret ? Promise.resolve({\n                value: value,\n                done: !0\n            }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments));\n        },\n        \"throw\": function _throw(value) {\n            var thr = this.s[\"return\"];\n            return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments));\n        }\n    }, new AsyncFromSyncIterator(s1);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hdj4D\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"forEach\", ()=>forEach);\nparcelHelpers.export(exports, \"concatenateChunksAsync\", ()=>concatenateChunksAsync);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _asyncIterator = require(\"@babel/runtime/helpers/esm/asyncIterator\");\nvar _asyncIteratorDefault = parcelHelpers.interopDefault(_asyncIterator);\nvar _arrayBufferUtils = require(\"../binary-utils/array-buffer-utils\");\nvar _assert = require(\"../env-utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction forEach(_x, _x2) {\n    return _forEach.apply(this, arguments);\n}\nfunction _forEach() {\n    _forEach = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(iterator, visitor) {\n        var _yield$iterator$next, done, value, cancel;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    _context.next = 3;\n                    return iterator.next();\n                case 3:\n                    _yield$iterator$next = _context.sent;\n                    done = _yield$iterator$next.done;\n                    value = _yield$iterator$next.value;\n                    if (!done) {\n                        _context.next = 9;\n                        break;\n                    }\n                    iterator[\"return\"]();\n                    return _context.abrupt(\"return\");\n                case 9:\n                    cancel = visitor(value);\n                    if (!cancel) {\n                        _context.next = 12;\n                        break;\n                    }\n                    return _context.abrupt(\"return\");\n                case 12:\n                    _context.next = 0;\n                    break;\n                case 14:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _forEach.apply(this, arguments);\n}\nfunction concatenateChunksAsync(_x3) {\n    return _concatenateChunksAsync.apply(this, arguments);\n}\nfunction _concatenateChunksAsync() {\n    _concatenateChunksAsync = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(asyncIterator) {\n        var arrayBuffers, strings, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, chunk;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    arrayBuffers = [];\n                    strings = [];\n                    _iteratorNormalCompletion = true;\n                    _didIteratorError = false;\n                    _context2.prev = 4;\n                    _iterator = (0, _asyncIteratorDefault.default)(asyncIterator);\n                case 6:\n                    _context2.next = 8;\n                    return _iterator.next();\n                case 8:\n                    _step = _context2.sent;\n                    _iteratorNormalCompletion = _step.done;\n                    _context2.next = 12;\n                    return _step.value;\n                case 12:\n                    _value = _context2.sent;\n                    if (_iteratorNormalCompletion) {\n                        _context2.next = 19;\n                        break;\n                    }\n                    chunk = _value;\n                    if (typeof chunk === \"string\") strings.push(chunk);\n                    else arrayBuffers.push(chunk);\n                case 16:\n                    _iteratorNormalCompletion = true;\n                    _context2.next = 6;\n                    break;\n                case 19:\n                    _context2.next = 25;\n                    break;\n                case 21:\n                    _context2.prev = 21;\n                    _context2.t0 = _context2[\"catch\"](4);\n                    _didIteratorError = true;\n                    _iteratorError = _context2.t0;\n                case 25:\n                    _context2.prev = 25;\n                    _context2.prev = 26;\n                    if (!(!_iteratorNormalCompletion && _iterator[\"return\"] != null)) {\n                        _context2.next = 30;\n                        break;\n                    }\n                    _context2.next = 30;\n                    return _iterator[\"return\"]();\n                case 30:\n                    _context2.prev = 30;\n                    if (!_didIteratorError) {\n                        _context2.next = 33;\n                        break;\n                    }\n                    throw _iteratorError;\n                case 33:\n                    return _context2.finish(30);\n                case 34:\n                    return _context2.finish(25);\n                case 35:\n                    if (!(strings.length > 0)) {\n                        _context2.next = 38;\n                        break;\n                    }\n                    (0, _assertDefault.default)(arrayBuffers.length === 0);\n                    return _context2.abrupt(\"return\", strings.join(\"\"));\n                case 38:\n                    return _context2.abrupt(\"return\", (0, _arrayBufferUtils.concatenateArrayBuffers).apply(void 0, arrayBuffers));\n                case 39:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2, null, [\n            [\n                4,\n                21,\n                25,\n                35\n            ],\n            [\n                26,\n                ,\n                30,\n                34\n            ]\n        ]);\n    }));\n    return _concatenateChunksAsync.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/helpers/esm/asyncIterator\":\"hoXxr\",\"../binary-utils/array-buffer-utils\":\"4W57a\",\"../env-utils/assert\":\"cIPKG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"NRX8k\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>RequestScheduler);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _stats = require(\"@probe.gl/stats\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar STAT_QUEUED_REQUESTS = \"Queued Requests\";\nvar STAT_ACTIVE_REQUESTS = \"Active Requests\";\nvar STAT_CANCELLED_REQUESTS = \"Cancelled Requests\";\nvar STAT_QUEUED_REQUESTS_EVER = \"Queued Requests Ever\";\nvar STAT_ACTIVE_REQUESTS_EVER = \"Active Requests Ever\";\nvar DEFAULT_PROPS = {\n    id: \"request-scheduler\",\n    throttleRequests: true,\n    maxRequests: 6\n};\nvar RequestScheduler = function() {\n    function RequestScheduler1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, RequestScheduler1);\n        this.props = _objectSpread(_objectSpread({}, DEFAULT_PROPS), props);\n        this.requestQueue = [];\n        this.activeRequestCount = 0;\n        this.requestMap = new Map();\n        this.stats = new (0, _stats.Stats)({\n            id: props.id\n        });\n        this.stats.get(STAT_QUEUED_REQUESTS);\n        this.stats.get(STAT_ACTIVE_REQUESTS);\n        this.stats.get(STAT_CANCELLED_REQUESTS);\n        this.stats.get(STAT_QUEUED_REQUESTS_EVER);\n        this.stats.get(STAT_ACTIVE_REQUESTS_EVER);\n        this._deferredUpdate = null;\n    }\n    (0, _createClassDefault.default)(RequestScheduler1, [\n        {\n            key: \"scheduleRequest\",\n            value: function scheduleRequest(handle) {\n                var getPriority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function() {\n                    return 0;\n                };\n                if (!this.props.throttleRequests) return Promise.resolve({\n                    done: function done() {}\n                });\n                if (this.requestMap.has(handle)) return this.requestMap.get(handle);\n                var request = {\n                    handle: handle,\n                    getPriority: getPriority\n                };\n                var promise = new Promise(function(resolve) {\n                    request.resolve = resolve;\n                    return request;\n                });\n                this.requestQueue.push(request);\n                this.requestMap.set(handle, promise);\n                this._issueNewRequests();\n                return promise;\n            }\n        },\n        {\n            key: \"_issueRequest\",\n            value: function _issueRequest(request) {\n                var _this = this;\n                var handle = request.handle, resolve = request.resolve;\n                var isDone = false;\n                var done = function done() {\n                    if (!isDone) {\n                        isDone = true;\n                        _this.requestMap[\"delete\"](handle);\n                        _this.activeRequestCount--;\n                        _this._issueNewRequests();\n                    }\n                };\n                this.activeRequestCount++;\n                return resolve ? resolve({\n                    done: done\n                }) : Promise.resolve({\n                    done: done\n                });\n            }\n        },\n        {\n            key: \"_issueNewRequests\",\n            value: function _issueNewRequests() {\n                var _this2 = this;\n                if (!this._deferredUpdate) this._deferredUpdate = setTimeout(function() {\n                    return _this2._issueNewRequestsAsync();\n                }, 0);\n            }\n        },\n        {\n            key: \"_issueNewRequestsAsync\",\n            value: function _issueNewRequestsAsync() {\n                this._deferredUpdate = null;\n                var freeSlots = Math.max(this.props.maxRequests - this.activeRequestCount, 0);\n                if (freeSlots === 0) return;\n                this._updateAllRequests();\n                for(var i = 0; i < freeSlots; ++i)if (this.requestQueue.length > 0) {\n                    var request = this.requestQueue.shift();\n                    this._issueRequest(request);\n                }\n            }\n        },\n        {\n            key: \"_updateAllRequests\",\n            value: function _updateAllRequests() {\n                var requestQueue = this.requestQueue;\n                for(var i = 0; i < requestQueue.length; ++i){\n                    var request = requestQueue[i];\n                    if (!this._updateRequest(request)) {\n                        requestQueue.splice(i, 1);\n                        this.requestMap[\"delete\"](request.handle);\n                        i--;\n                    }\n                }\n                requestQueue.sort(function(a, b) {\n                    return a.priority - b.priority;\n                });\n            }\n        },\n        {\n            key: \"_updateRequest\",\n            value: function _updateRequest(request) {\n                request.priority = request.getPriority(request.handle);\n                if (request.priority < 0) {\n                    request.resolve(null);\n                    return false;\n                }\n                return true;\n            }\n        }\n    ]);\n    return RequestScheduler1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@probe.gl/stats\":\"c65AV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dlHSV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _defineProperty(obj, key, value) {\n    if (key in obj) Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n    });\n    else obj[key] = value;\n    return obj;\n}\nexports.default = _defineProperty;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c65AV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Stats\", ()=>(0, _statsDefault.default));\nparcelHelpers.export(exports, \"Stat\", ()=>(0, _statDefault.default));\nparcelHelpers.export(exports, \"_getHiResTimestamp\", ()=>(0, _hiResTimestampDefault.default));\nvar _stats = require(\"./lib/stats\");\nvar _statsDefault = parcelHelpers.interopDefault(_stats);\nvar _stat = require(\"./lib/stat\");\nvar _statDefault = parcelHelpers.interopDefault(_stat);\nvar _hiResTimestamp = require(\"./utils/hi-res-timestamp\");\nvar _hiResTimestampDefault = parcelHelpers.interopDefault(_hiResTimestamp);\n\n},{\"./lib/stats\":\"67eIK\",\"./lib/stat\":\"8sZbB\",\"./utils/hi-res-timestamp\":\"46ODq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"67eIK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _stat = require(\"./stat\");\nvar _statDefault = parcelHelpers.interopDefault(_stat);\nclass Stats {\n    constructor(options){\n        (0, _definePropertyDefault.default)(this, \"id\", void 0);\n        (0, _definePropertyDefault.default)(this, \"stats\", {});\n        this.id = options.id;\n        this.stats = {};\n        this._initializeStats(options.stats);\n        Object.seal(this);\n    }\n    get(name) {\n        let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"count\";\n        return this._getOrCreate({\n            name,\n            type\n        });\n    }\n    get size() {\n        return Object.keys(this.stats).length;\n    }\n    reset() {\n        for(const key in this.stats)this.stats[key].reset();\n        return this;\n    }\n    forEach(fn) {\n        for(const key in this.stats)fn(this.stats[key]);\n    }\n    getTable() {\n        const table = {};\n        this.forEach((stat)=>{\n            table[stat.name] = {\n                time: stat.time || 0,\n                count: stat.count || 0,\n                average: stat.getAverageTime() || 0,\n                hz: stat.getHz() || 0\n            };\n        });\n        return table;\n    }\n    _initializeStats() {\n        let stats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n        stats.forEach((stat)=>this._getOrCreate(stat));\n    }\n    _getOrCreate(stat) {\n        if (!stat || !stat.name) return null;\n        const { name , type  } = stat;\n        if (!this.stats[name]) {\n            if (stat instanceof (0, _statDefault.default)) this.stats[name] = stat;\n            else this.stats[name] = new (0, _statDefault.default)(name, type);\n        }\n        return this.stats[name];\n    }\n}\nexports.default = Stats;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"./stat\":\"8sZbB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8sZbB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _hiResTimestamp = require(\"../utils/hi-res-timestamp\");\nvar _hiResTimestampDefault = parcelHelpers.interopDefault(_hiResTimestamp);\nclass Stat {\n    constructor(name, type){\n        (0, _definePropertyDefault.default)(this, \"name\", void 0);\n        (0, _definePropertyDefault.default)(this, \"type\", void 0);\n        (0, _definePropertyDefault.default)(this, \"sampleSize\", 1);\n        (0, _definePropertyDefault.default)(this, \"time\", void 0);\n        (0, _definePropertyDefault.default)(this, \"count\", void 0);\n        (0, _definePropertyDefault.default)(this, \"samples\", void 0);\n        (0, _definePropertyDefault.default)(this, \"lastTiming\", void 0);\n        (0, _definePropertyDefault.default)(this, \"lastSampleTime\", void 0);\n        (0, _definePropertyDefault.default)(this, \"lastSampleCount\", void 0);\n        (0, _definePropertyDefault.default)(this, \"_count\", 0);\n        (0, _definePropertyDefault.default)(this, \"_time\", 0);\n        (0, _definePropertyDefault.default)(this, \"_samples\", 0);\n        (0, _definePropertyDefault.default)(this, \"_startTime\", 0);\n        (0, _definePropertyDefault.default)(this, \"_timerPending\", false);\n        this.name = name;\n        this.type = type;\n        this.reset();\n    }\n    setSampleSize(samples) {\n        this.sampleSize = samples;\n        return this;\n    }\n    incrementCount() {\n        this.addCount(1);\n        return this;\n    }\n    decrementCount() {\n        this.subtractCount(1);\n        return this;\n    }\n    addCount(value) {\n        this._count += value;\n        this._samples++;\n        this._checkSampling();\n        return this;\n    }\n    subtractCount(value) {\n        this._count -= value;\n        this._samples++;\n        this._checkSampling();\n        return this;\n    }\n    addTime(time) {\n        this._time += time;\n        this.lastTiming = time;\n        this._samples++;\n        this._checkSampling();\n        return this;\n    }\n    timeStart() {\n        this._startTime = (0, _hiResTimestampDefault.default)();\n        this._timerPending = true;\n        return this;\n    }\n    timeEnd() {\n        if (!this._timerPending) return this;\n        this.addTime((0, _hiResTimestampDefault.default)() - this._startTime);\n        this._timerPending = false;\n        this._checkSampling();\n        return this;\n    }\n    getSampleAverageCount() {\n        return this.sampleSize > 0 ? this.lastSampleCount / this.sampleSize : 0;\n    }\n    getSampleAverageTime() {\n        return this.sampleSize > 0 ? this.lastSampleTime / this.sampleSize : 0;\n    }\n    getSampleHz() {\n        return this.lastSampleTime > 0 ? this.sampleSize / (this.lastSampleTime / 1000) : 0;\n    }\n    getAverageCount() {\n        return this.samples > 0 ? this.count / this.samples : 0;\n    }\n    getAverageTime() {\n        return this.samples > 0 ? this.time / this.samples : 0;\n    }\n    getHz() {\n        return this.time > 0 ? this.samples / (this.time / 1000) : 0;\n    }\n    reset() {\n        this.time = 0;\n        this.count = 0;\n        this.samples = 0;\n        this.lastTiming = 0;\n        this.lastSampleTime = 0;\n        this.lastSampleCount = 0;\n        this._count = 0;\n        this._time = 0;\n        this._samples = 0;\n        this._startTime = 0;\n        this._timerPending = false;\n        return this;\n    }\n    _checkSampling() {\n        if (this._samples === this.sampleSize) {\n            this.lastSampleTime = this._time;\n            this.lastSampleCount = this._count;\n            this.count += this._count;\n            this.time += this._time;\n            this.samples += this._samples;\n            this._time = 0;\n            this._count = 0;\n            this._samples = 0;\n        }\n    }\n}\nexports.default = Stat;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../utils/hi-res-timestamp\":\"46ODq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"46ODq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar process = require(\"process\");\nfunction getHiResTimestamp() {\n    let timestamp;\n    if (typeof window !== \"undefined\" && window.performance) timestamp = window.performance.now();\n    else if (typeof process !== \"undefined\" && process.hrtime) {\n        const timeParts = process.hrtime();\n        timestamp = timeParts[0] * 1000 + timeParts[1] / 1e6;\n    } else timestamp = Date.now();\n    return timestamp;\n}\nexports.default = getHiResTimestamp;\n\n},{\"process\":\"eKMhv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1F0F2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fetchFile\", ()=>fetchFile);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _responseUtils = require(\"../utils/response-utils\");\nvar _fetchErrorMessage = require(\"./fetch-error-message\");\nfunction fetchFile(_x) {\n    return _fetchFile.apply(this, arguments);\n}\nfunction _fetchFile() {\n    _fetchFile = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(url) {\n        var options, response, _args = arguments;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n                    if (!(typeof url !== \"string\")) {\n                        _context.next = 5;\n                        break;\n                    }\n                    _context.next = 4;\n                    return (0, _responseUtils.makeResponse)(url);\n                case 4:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 5:\n                    url = (0, _loaderUtils.resolvePath)(url);\n                    _context.next = 8;\n                    return fetch(url, options);\n                case 8:\n                    response = _context.sent;\n                    if (!(!response.ok && options[\"throws\"])) {\n                        _context.next = 15;\n                        break;\n                    }\n                    _context.t0 = Error;\n                    _context.next = 13;\n                    return (0, _fetchErrorMessage.getErrorMessageFromResponse)(response);\n                case 13:\n                    _context.t1 = _context.sent;\n                    throw new _context.t0(_context.t1);\n                case 15:\n                    return _context.abrupt(\"return\", response);\n                case 16:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _fetchFile.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@loaders.gl/loader-utils\":\"bhMte\",\"../utils/response-utils\":\"4j8S2\",\"./fetch-error-message\":\"iqMls\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4j8S2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeResponse\", ()=>makeResponse);\nparcelHelpers.export(exports, \"checkResponse\", ()=>checkResponse);\nparcelHelpers.export(exports, \"checkResponseSync\", ()=>checkResponseSync);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _resourceUtils = require(\"./resource-utils\");\nfunction makeResponse(_x) {\n    return _makeResponse.apply(this, arguments);\n}\nfunction _makeResponse() {\n    _makeResponse = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(resource) {\n        var headers, contentLength, _getResourceUrlAndTyp, url, type, initialDataUrl, response;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    if (!(0, _isType.isResponse)(resource)) {\n                        _context.next = 2;\n                        break;\n                    }\n                    return _context.abrupt(\"return\", resource);\n                case 2:\n                    headers = {};\n                    contentLength = (0, _resourceUtils.getResourceContentLength)(resource);\n                    if (contentLength >= 0) headers[\"content-length\"] = String(contentLength);\n                    _getResourceUrlAndTyp = (0, _resourceUtils.getResourceUrlAndType)(resource), url = _getResourceUrlAndTyp.url, type = _getResourceUrlAndTyp.type;\n                    if (type) headers[\"content-type\"] = type;\n                    _context.next = 9;\n                    return getInitialDataUrl(resource);\n                case 9:\n                    initialDataUrl = _context.sent;\n                    if (initialDataUrl) headers[\"x-first-bytes\"] = initialDataUrl;\n                    if (typeof resource === \"string\") resource = new TextEncoder().encode(resource);\n                    response = new Response(resource, {\n                        headers: headers\n                    });\n                    Object.defineProperty(response, \"url\", {\n                        value: url\n                    });\n                    return _context.abrupt(\"return\", response);\n                case 15:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _makeResponse.apply(this, arguments);\n}\nfunction checkResponse(_x2) {\n    return _checkResponse.apply(this, arguments);\n}\nfunction _checkResponse() {\n    _checkResponse = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(response) {\n        var message;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    if (response.ok) {\n                        _context2.next = 5;\n                        break;\n                    }\n                    _context2.next = 3;\n                    return getResponseError(response);\n                case 3:\n                    message = _context2.sent;\n                    throw new Error(message);\n                case 5:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2);\n    }));\n    return _checkResponse.apply(this, arguments);\n}\nfunction checkResponseSync(response) {\n    if (!response.ok) {\n        var message = \"\".concat(response.status, \" \").concat(response.statusText);\n        message = message.length > 60 ? \"\".concat(message.slice(60), \"...\") : message;\n        throw new Error(message);\n    }\n}\nfunction getResponseError(_x3) {\n    return _getResponseError.apply(this, arguments);\n}\nfunction _getResponseError() {\n    _getResponseError = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee3(response) {\n        var message, contentType, text;\n        return (0, _regeneratorDefault.default).wrap(function _callee3$(_context3) {\n            while(true)switch(_context3.prev = _context3.next){\n                case 0:\n                    message = \"Failed to fetch resource \".concat(response.url, \" (\").concat(response.status, \"): \");\n                    _context3.prev = 1;\n                    contentType = response.headers.get(\"Content-Type\");\n                    text = response.statusText;\n                    if (!contentType.includes(\"application/json\")) {\n                        _context3.next = 11;\n                        break;\n                    }\n                    _context3.t0 = text;\n                    _context3.t1 = \" \";\n                    _context3.next = 9;\n                    return response.text();\n                case 9:\n                    _context3.t2 = _context3.sent;\n                    text = _context3.t0 += _context3.t1.concat.call(_context3.t1, _context3.t2);\n                case 11:\n                    message += text;\n                    message = message.length > 60 ? \"\".concat(message.slice(60), \"...\") : message;\n                    _context3.next = 17;\n                    break;\n                case 15:\n                    _context3.prev = 15;\n                    _context3.t3 = _context3[\"catch\"](1);\n                case 17:\n                    return _context3.abrupt(\"return\", message);\n                case 18:\n                case \"end\":\n                    return _context3.stop();\n            }\n        }, _callee3, null, [\n            [\n                1,\n                15\n            ]\n        ]);\n    }));\n    return _getResponseError.apply(this, arguments);\n}\nfunction getInitialDataUrl(_x4) {\n    return _getInitialDataUrl.apply(this, arguments);\n}\nfunction _getInitialDataUrl() {\n    _getInitialDataUrl = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee4(resource) {\n        var INITIAL_DATA_LENGTH, blobSlice, slice, base64;\n        return (0, _regeneratorDefault.default).wrap(function _callee4$(_context4) {\n            while(true)switch(_context4.prev = _context4.next){\n                case 0:\n                    INITIAL_DATA_LENGTH = 5;\n                    if (!(typeof resource === \"string\")) {\n                        _context4.next = 3;\n                        break;\n                    }\n                    return _context4.abrupt(\"return\", \"data:,\".concat(resource.slice(0, INITIAL_DATA_LENGTH)));\n                case 3:\n                    if (!(resource instanceof Blob)) {\n                        _context4.next = 8;\n                        break;\n                    }\n                    blobSlice = resource.slice(0, 5);\n                    _context4.next = 7;\n                    return new Promise(function(resolve) {\n                        var reader = new FileReader();\n                        reader.onload = function(event) {\n                            return resolve(event.target && event.target.result);\n                        };\n                        reader.readAsDataURL(blobSlice);\n                    });\n                case 7:\n                    return _context4.abrupt(\"return\", _context4.sent);\n                case 8:\n                    if (!(resource instanceof ArrayBuffer)) {\n                        _context4.next = 12;\n                        break;\n                    }\n                    slice = resource.slice(0, INITIAL_DATA_LENGTH);\n                    base64 = arrayBufferToBase64(slice);\n                    return _context4.abrupt(\"return\", \"data:base64,\".concat(base64));\n                case 12:\n                    return _context4.abrupt(\"return\", null);\n                case 13:\n                case \"end\":\n                    return _context4.stop();\n            }\n        }, _callee4);\n    }));\n    return _getInitialDataUrl.apply(this, arguments);\n}\nfunction arrayBufferToBase64(buffer) {\n    var binary = \"\";\n    var bytes = new Uint8Array(buffer);\n    for(var i = 0; i < bytes.byteLength; i++)binary += String.fromCharCode(bytes[i]);\n    return btoa(binary);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"../../javascript-utils/is-type\":\"a5AOB\",\"./resource-utils\":\"79vKg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a5AOB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isObject\", ()=>isObject);\nparcelHelpers.export(exports, \"isPureObject\", ()=>isPureObject);\nparcelHelpers.export(exports, \"isPromise\", ()=>isPromise);\nparcelHelpers.export(exports, \"isIterable\", ()=>isIterable);\nparcelHelpers.export(exports, \"isAsyncIterable\", ()=>isAsyncIterable);\nparcelHelpers.export(exports, \"isIterator\", ()=>isIterator);\nparcelHelpers.export(exports, \"isResponse\", ()=>isResponse);\nparcelHelpers.export(exports, \"isFile\", ()=>isFile);\nparcelHelpers.export(exports, \"isBlob\", ()=>isBlob);\nparcelHelpers.export(exports, \"isWritableDOMStream\", ()=>isWritableDOMStream);\nparcelHelpers.export(exports, \"isReadableDOMStream\", ()=>isReadableDOMStream);\nparcelHelpers.export(exports, \"isBuffer\", ()=>isBuffer);\nparcelHelpers.export(exports, \"isWritableNodeStream\", ()=>isWritableNodeStream);\nparcelHelpers.export(exports, \"isReadableNodeStream\", ()=>isReadableNodeStream);\nparcelHelpers.export(exports, \"isReadableStream\", ()=>isReadableStream);\nparcelHelpers.export(exports, \"isWritableStream\", ()=>isWritableStream);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar isBoolean = function isBoolean(x) {\n    return typeof x === \"boolean\";\n};\nvar isFunction = function isFunction(x) {\n    return typeof x === \"function\";\n};\nvar isObject = function isObject(x) {\n    return x !== null && (0, _typeofDefault.default)(x) === \"object\";\n};\nvar isPureObject = function isPureObject(x) {\n    return isObject(x) && x.constructor === ({}).constructor;\n};\nvar isPromise = function isPromise(x) {\n    return isObject(x) && isFunction(x.then);\n};\nvar isIterable = function isIterable(x) {\n    return x && typeof x[Symbol.iterator] === \"function\";\n};\nvar isAsyncIterable = function isAsyncIterable(x) {\n    return x && typeof x[Symbol.asyncIterator] === \"function\";\n};\nvar isIterator = function isIterator(x) {\n    return x && isFunction(x.next);\n};\nvar isResponse = function isResponse(x) {\n    return typeof Response !== \"undefined\" && x instanceof Response || x && x.arrayBuffer && x.text && x.json;\n};\nvar isFile = function isFile(x) {\n    return typeof File !== \"undefined\" && x instanceof File;\n};\nvar isBlob = function isBlob(x) {\n    return typeof Blob !== \"undefined\" && x instanceof Blob;\n};\nvar isWritableDOMStream = function isWritableDOMStream(x) {\n    return isObject(x) && isFunction(x.abort) && isFunction(x.getWriter);\n};\nvar isReadableDOMStream = function isReadableDOMStream(x) {\n    return typeof ReadableStream !== \"undefined\" && x instanceof ReadableStream || isObject(x) && isFunction(x.tee) && isFunction(x.cancel) && isFunction(x.getReader);\n};\nvar isBuffer = function isBuffer(x) {\n    return x && (0, _typeofDefault.default)(x) === \"object\" && x.isBuffer;\n};\nvar isWritableNodeStream = function isWritableNodeStream(x) {\n    return isObject(x) && isFunction(x.end) && isFunction(x.write) && isBoolean(x.writable);\n};\nvar isReadableNodeStream = function isReadableNodeStream(x) {\n    return isObject(x) && isFunction(x.read) && isFunction(x.pipe) && isBoolean(x.readable);\n};\nvar isReadableStream = function isReadableStream(x) {\n    return isReadableDOMStream(x) || isReadableNodeStream(x);\n};\nvar isWritableStream = function isWritableStream(x) {\n    return isWritableDOMStream(x) || isWritableNodeStream(x);\n};\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"79vKg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getResourceUrlAndType\", ()=>getResourceUrlAndType);\nparcelHelpers.export(exports, \"getResourceContentLength\", ()=>getResourceContentLength);\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _mimeTypeUtils = require(\"./mime-type-utils\");\nvar QUERY_STRING_PATTERN = /\\?.*/;\nfunction getResourceUrlAndType(resource) {\n    if ((0, _isType.isResponse)(resource)) {\n        var contentType = (0, _mimeTypeUtils.parseMIMEType)(resource.headers.get(\"content-type\"));\n        var urlType = (0, _mimeTypeUtils.parseMIMETypeFromURL)(resource.url);\n        return {\n            url: stripQueryString(resource.url || \"\"),\n            type: contentType || urlType || null\n        };\n    }\n    if ((0, _isType.isBlob)(resource)) return {\n        url: stripQueryString(resource.name || \"\"),\n        type: resource.type || \"\"\n    };\n    if (typeof resource === \"string\") return {\n        url: stripQueryString(resource),\n        type: (0, _mimeTypeUtils.parseMIMETypeFromURL)(resource)\n    };\n    return {\n        url: \"\",\n        type: \"\"\n    };\n}\nfunction getResourceContentLength(resource) {\n    if ((0, _isType.isResponse)(resource)) return resource.headers[\"content-length\"] || -1;\n    if ((0, _isType.isBlob)(resource)) return resource.size;\n    if (typeof resource === \"string\") return resource.length;\n    if (resource instanceof ArrayBuffer) return resource.byteLength;\n    if (ArrayBuffer.isView(resource)) return resource.byteLength;\n    return -1;\n}\nfunction stripQueryString(url) {\n    return url.replace(QUERY_STRING_PATTERN, \"\");\n}\n\n},{\"../../javascript-utils/is-type\":\"a5AOB\",\"./mime-type-utils\":\"4sVRN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4sVRN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parseMIMEType\", ()=>parseMIMEType);\nparcelHelpers.export(exports, \"parseMIMETypeFromURL\", ()=>parseMIMETypeFromURL);\nvar DATA_URL_PATTERN = /^data:([-\\w.]+\\/[-\\w.+]+)(;|,)/;\nvar MIME_TYPE_PATTERN = /^([-\\w.]+\\/[-\\w.+]+)/;\nfunction parseMIMEType(mimeString) {\n    if (typeof mimeString !== \"string\") return \"\";\n    var matches = mimeString.match(MIME_TYPE_PATTERN);\n    if (matches) return matches[1];\n    return mimeString;\n}\nfunction parseMIMETypeFromURL(dataUrl) {\n    if (typeof dataUrl !== \"string\") return \"\";\n    var matches = dataUrl.match(DATA_URL_PATTERN);\n    if (matches) return matches[1];\n    return \"\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iqMls\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getErrorMessageFromResponseSync\", ()=>getErrorMessageFromResponseSync);\nparcelHelpers.export(exports, \"getErrorMessageFromResponse\", ()=>getErrorMessageFromResponse);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nfunction getErrorMessageFromResponseSync(response) {\n    return \"Failed to fetch resource \".concat(response.url, \"(\").concat(response.status, \"): \").concat(response.statusText, \" \");\n}\nfunction getErrorMessageFromResponse(_x) {\n    return _getErrorMessageFromResponse.apply(this, arguments);\n}\nfunction _getErrorMessageFromResponse() {\n    _getErrorMessageFromResponse = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(response) {\n        var message, contentType;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    message = \"Failed to fetch resource \".concat(response.url, \" (\").concat(response.status, \"): \");\n                    _context.prev = 1;\n                    contentType = response.headers.get(\"Content-Type\");\n                    if (!contentType.includes(\"application/json\")) {\n                        _context.next = 10;\n                        break;\n                    }\n                    _context.t0 = message;\n                    _context.next = 7;\n                    return response.text();\n                case 7:\n                    message = _context.t0 += _context.sent;\n                    _context.next = 11;\n                    break;\n                case 10:\n                    message += response.statusText;\n                case 11:\n                    _context.next = 16;\n                    break;\n                case 13:\n                    _context.prev = 13;\n                    _context.t1 = _context[\"catch\"](1);\n                    return _context.abrupt(\"return\", message);\n                case 16:\n                    return _context.abrupt(\"return\", message);\n                case 17:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                1,\n                13\n            ]\n        ]);\n    }));\n    return _getErrorMessageFromResponse.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lmt4b\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"registerLoaders\", ()=>registerLoaders);\nparcelHelpers.export(exports, \"getRegisteredLoaders\", ()=>getRegisteredLoaders);\nparcelHelpers.export(exports, \"_unregisterLoaders\", ()=>_unregisterLoaders);\nvar _normalizeLoader = require(\"../loader-utils/normalize-loader\");\nvar _optionUtils = require(\"../loader-utils/option-utils\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar getGlobalLoaderRegistry = function getGlobalLoaderRegistry() {\n    var state = (0, _optionUtils.getGlobalLoaderState)();\n    state.loaderRegistry = state.loaderRegistry || [];\n    return state.loaderRegistry;\n};\nfunction registerLoaders(loaders) {\n    var loaderRegistry = getGlobalLoaderRegistry();\n    loaders = Array.isArray(loaders) ? loaders : [\n        loaders\n    ];\n    var _iterator = _createForOfIteratorHelper(loaders), _step;\n    try {\n        var _loop = function _loop() {\n            var loader = _step.value;\n            var normalizedLoader = (0, _normalizeLoader.normalizeLoader)(loader);\n            if (!loaderRegistry.find(function(registeredLoader) {\n                return normalizedLoader === registeredLoader;\n            })) loaderRegistry.unshift(normalizedLoader);\n        };\n        for(_iterator.s(); !(_step = _iterator.n()).done;)_loop();\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n}\nfunction getRegisteredLoaders() {\n    return getGlobalLoaderRegistry();\n}\nfunction _unregisterLoaders() {\n    var state = (0, _optionUtils.getGlobalLoaderState)();\n    state.loaderRegistry = [];\n}\n\n},{\"../loader-utils/normalize-loader\":\"3Yt77\",\"../loader-utils/option-utils\":\"hpM1J\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Yt77\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isLoaderObject\", ()=>isLoaderObject);\nparcelHelpers.export(exports, \"normalizeLoader\", ()=>normalizeLoader);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction isLoaderObject(loader) {\n    if (!loader) return false;\n    if (Array.isArray(loader)) loader = loader[0];\n    var hasParser = loader.parseTextSync || loader.parseSync || loader.parse || loader.parseStream || loader.parseInBatches;\n    var loaderOptions = loader.options && loader.options[loader.id];\n    hasParser = hasParser || loaderOptions && loaderOptions.workerUrl;\n    return hasParser;\n}\nfunction normalizeLoader(loader) {\n    (0, _loaderUtils.assert)(loader, \"null loader\");\n    (0, _loaderUtils.assert)(isLoaderObject(loader), \"invalid loader\");\n    var options;\n    if (Array.isArray(loader)) {\n        options = loader[1];\n        loader = loader[0];\n        loader = _objectSpread(_objectSpread({}, loader), {}, {\n            options: _objectSpread(_objectSpread({}, loader.options), options)\n        });\n    }\n    if (loader.extension) {\n        loader.extensions = loader.extensions || loader.extension;\n        delete loader.extension;\n    }\n    if (!Array.isArray(loader.extensions)) loader.extensions = [\n        loader.extensions\n    ];\n    (0, _loaderUtils.assert)(loader.extensions && loader.extensions.length > 0 && loader.extensions[0]);\n    if (loader.parseTextSync || loader.parseText) loader.text = true;\n    if (!loader.text) loader.binary = true;\n    return loader;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@loaders.gl/loader-utils\":\"bhMte\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hpM1J\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getGlobalLoaderState\", ()=>getGlobalLoaderState);\nparcelHelpers.export(exports, \"setGlobalOptions\", ()=>setGlobalOptions);\nparcelHelpers.export(exports, \"normalizeOptions\", ()=>normalizeOptions);\nparcelHelpers.export(exports, \"getFetchFunction\", ()=>getFetchFunction);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _fetchFile = require(\"../fetch/fetch-file\");\nvar _loggers = require(\"./loggers\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar DEFAULT_LOADER_OPTIONS = {\n    baseUri: \"\",\n    fetch: null,\n    CDN: \"https://unpkg.com/@loaders.gl\",\n    worker: true,\n    log: new (0, _loggers.ConsoleLog)(),\n    metadata: false,\n    transforms: [],\n    reuseWorkers: true\n};\nvar DEPRECATED_LOADER_OPTIONS = {\n    dataType: \"(no longer used)\",\n    method: \"fetch.method\",\n    headers: \"fetch.headers\",\n    body: \"fetch.body\",\n    mode: \"fetch.mode\",\n    credentials: \"fetch.credentials\",\n    cache: \"fetch.cache\",\n    redirect: \"fetch.redirect\",\n    referrer: \"fetch.referrer\",\n    referrerPolicy: \"fetch.referrerPolicy\",\n    integrity: \"fetch.integrity\",\n    keepalive: \"fetch.keepalive\",\n    signal: \"fetch.signal\"\n};\nvar getGlobalLoaderState = function getGlobalLoaderState() {\n    (0, _loaderUtils.global).loaders = (0, _loaderUtils.global).loaders || {};\n    var loaders = (0, _loaderUtils.global).loaders;\n    loaders._state = loaders._state || {};\n    return loaders._state;\n};\nvar getGlobalLoaderOptions = function getGlobalLoaderOptions() {\n    var state = getGlobalLoaderState();\n    state.globalOptions = state.globalOptions || _objectSpread({}, DEFAULT_LOADER_OPTIONS);\n    return state.globalOptions;\n};\nfunction setGlobalOptions(options) {\n    var state = getGlobalLoaderState();\n    var globalOptions = getGlobalLoaderOptions();\n    state.globalOptions = normalizeOptionsInternal(globalOptions, options);\n}\nfunction normalizeOptions(options, loader, loaders, url) {\n    loaders = loaders || [];\n    loaders = Array.isArray(loaders) ? loaders : [\n        loaders\n    ];\n    validateOptions(options, loaders);\n    return normalizeOptionsInternal(loader, options, url);\n}\nfunction getFetchFunction(options, context) {\n    var globalOptions = getGlobalLoaderOptions();\n    var fetch = options.fetch || globalOptions.fetch;\n    if (typeof fetch === \"function\") return fetch;\n    if ((0, _isType.isObject)(fetch)) return function(url) {\n        return (0, _fetchFile.fetchFile)(url, fetch);\n    };\n    if (context && context.fetch) return context.fetch;\n    return function(url) {\n        return (0, _fetchFile.fetchFile)(url, options);\n    };\n}\nfunction validateOptions(options, loaders) {\n    var log = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : console;\n    validateOptionsObject(options, null, log, DEFAULT_LOADER_OPTIONS, DEPRECATED_LOADER_OPTIONS, loaders);\n    var _iterator = _createForOfIteratorHelper(loaders), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var loader = _step.value;\n            var idOptions = options && options[loader.id] || {};\n            var loaderOptions = loader.options && loader.options[loader.id] || {};\n            var deprecatedOptions = loader.defaultOptions && loader.defaultOptions[loader.id] || {};\n            validateOptionsObject(idOptions, loader.id, log, loaderOptions, deprecatedOptions, loaders);\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n}\nfunction validateOptionsObject(options, id, log, defaultOptions, deprecatedOptions, loaders) {\n    var loaderName = id || \"Top level\";\n    var prefix = id ? \"\".concat(id, \".\") : \"\";\n    for(var key in options){\n        var isSubOptions = !id && (0, _isType.isObject)(options[key]);\n        if (!(key in defaultOptions)) {\n            if (key in deprecatedOptions) log.warn(\"\".concat(loaderName, \" loader option '\").concat(prefix).concat(key, \"' deprecated, use '\").concat(deprecatedOptions[key], \"'\"));\n            else if (!isSubOptions) {\n                var suggestion = findSimilarOption(key, loaders);\n                log.warn(\"\".concat(loaderName, \" loader option '\").concat(prefix).concat(key, \"' not recognized. \").concat(suggestion));\n            }\n        }\n    }\n}\nfunction findSimilarOption(optionKey, loaders) {\n    var lowerCaseOptionKey = optionKey.toLowerCase();\n    var bestSuggestion = \"\";\n    var _iterator2 = _createForOfIteratorHelper(loaders), _step2;\n    try {\n        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n            var loader = _step2.value;\n            for(var key in loader.options){\n                if (optionKey === key) return \"Did you mean '\".concat(loader.id, \".\").concat(key, \"'?\");\n                var lowerCaseKey = key.toLowerCase();\n                var isPartialMatch = lowerCaseOptionKey.startsWith(lowerCaseKey) || lowerCaseKey.startsWith(lowerCaseOptionKey);\n                if (isPartialMatch) bestSuggestion = bestSuggestion || \"Did you mean '\".concat(loader.id, \".\").concat(key, \"'?\");\n            }\n        }\n    } catch (err) {\n        _iterator2.e(err);\n    } finally{\n        _iterator2.f();\n    }\n    return bestSuggestion;\n}\nfunction normalizeOptionsInternal(loader, options, url) {\n    var loaderDefaultOptions = loader.options || {};\n    var mergedOptions = _objectSpread({}, loaderDefaultOptions);\n    if (mergedOptions.log === null) mergedOptions.log = new (0, _loggers.NullLog)();\n    mergeNestedFields(mergedOptions, getGlobalLoaderOptions());\n    mergeNestedFields(mergedOptions, options);\n    addUrlOptions(mergedOptions, url);\n    return mergedOptions;\n}\nfunction mergeNestedFields(mergedOptions, options) {\n    for(var key in options)if (key in options) {\n        var value = options[key];\n        if ((0, _isType.isPureObject)(value) && (0, _isType.isPureObject)(mergedOptions[key])) mergedOptions[key] = _objectSpread(_objectSpread({}, mergedOptions[key]), options[key]);\n        else mergedOptions[key] = options[key];\n    }\n}\nfunction addUrlOptions(options, url) {\n    if (url && !options.baseUri) options.baseUri = url;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@loaders.gl/loader-utils\":\"bhMte\",\"../../javascript-utils/is-type\":\"a5AOB\",\"../fetch/fetch-file\":\"1F0F2\",\"./loggers\":\"7uEPI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7uEPI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"NullLog\", ()=>NullLog);\nparcelHelpers.export(exports, \"ConsoleLog\", ()=>ConsoleLog);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar NullLog = function() {\n    function NullLog1() {\n        (0, _classCallCheckDefault.default)(this, NullLog1);\n    }\n    (0, _createClassDefault.default)(NullLog1, [\n        {\n            key: \"log\",\n            value: function log() {\n                return function(_) {};\n            }\n        },\n        {\n            key: \"info\",\n            value: function info() {\n                return function(_) {};\n            }\n        },\n        {\n            key: \"warn\",\n            value: function warn() {\n                return function(_) {};\n            }\n        },\n        {\n            key: \"error\",\n            value: function error() {\n                return function(_) {};\n            }\n        }\n    ]);\n    return NullLog1;\n}();\nvar ConsoleLog = function() {\n    function ConsoleLog1() {\n        (0, _classCallCheckDefault.default)(this, ConsoleLog1);\n        this.console = console;\n    }\n    (0, _createClassDefault.default)(ConsoleLog1, [\n        {\n            key: \"log\",\n            value: function log() {\n                var _this$console$log;\n                for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++)args[_key] = arguments[_key];\n                return (_this$console$log = this.console.log).bind.apply(_this$console$log, [\n                    this.console\n                ].concat(args));\n            }\n        },\n        {\n            key: \"info\",\n            value: function info() {\n                var _this$console$info;\n                for(var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++)args[_key2] = arguments[_key2];\n                return (_this$console$info = this.console.info).bind.apply(_this$console$info, [\n                    this.console\n                ].concat(args));\n            }\n        },\n        {\n            key: \"warn\",\n            value: function warn() {\n                var _this$console$warn;\n                for(var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++)args[_key3] = arguments[_key3];\n                return (_this$console$warn = this.console.warn).bind.apply(_this$console$warn, [\n                    this.console\n                ].concat(args));\n            }\n        },\n        {\n            key: \"error\",\n            value: function error() {\n                var _this$console$error;\n                for(var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++)args[_key4] = arguments[_key4];\n                return (_this$console$error = this.console.error).bind.apply(_this$console$error, [\n                    this.console\n                ].concat(args));\n            }\n        }\n    ]);\n    return ConsoleLog1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1vDZj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parse\", ()=>parse);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _normalizeLoader = require(\"../loader-utils/normalize-loader\");\nvar _optionUtils = require(\"../loader-utils/option-utils\");\nvar _getData = require(\"../loader-utils/get-data\");\nvar _contextUtils = require(\"../loader-utils/context-utils\");\nvar _parseWithWorker = require(\"../loader-utils/parse-with-worker\");\nvar _parseWithWorkerDefault = parcelHelpers.interopDefault(_parseWithWorker);\nvar _resourceUtils = require(\"../utils/resource-utils\");\nvar _selectLoader = require(\"./select-loader\");\nfunction parse(_x, _x2, _x3, _x4) {\n    return _parse.apply(this, arguments);\n}\nfunction _parse() {\n    _parse = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(data, loaders, options, context) {\n        var _getResourceUrlAndTyp, url, candidateLoaders, loader;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    (0, _loaderUtils.assert)(!context || typeof context !== \"string\", \"parse no longer accepts final url\");\n                    if (loaders && !Array.isArray(loaders) && !(0, _normalizeLoader.isLoaderObject)(loaders)) {\n                        context = options;\n                        options = loaders;\n                        loaders = null;\n                    }\n                    _context.next = 4;\n                    return data;\n                case 4:\n                    data = _context.sent;\n                    options = options || {};\n                    _getResourceUrlAndTyp = (0, _resourceUtils.getResourceUrlAndType)(data), url = _getResourceUrlAndTyp.url;\n                    candidateLoaders = (0, _contextUtils.getLoaders)(loaders, context);\n                    _context.next = 10;\n                    return (0, _selectLoader.selectLoader)(data, candidateLoaders, options);\n                case 10:\n                    loader = _context.sent;\n                    if (loader) {\n                        _context.next = 13;\n                        break;\n                    }\n                    return _context.abrupt(\"return\", null);\n                case 13:\n                    options = (0, _optionUtils.normalizeOptions)(options, loader, candidateLoaders, url);\n                    context = (0, _contextUtils.getLoaderContext)({\n                        url: url,\n                        parse: parse,\n                        loaders: candidateLoaders\n                    }, options, context);\n                    _context.next = 17;\n                    return parseWithLoader(loader, data, options, context);\n                case 17:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 18:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _parse.apply(this, arguments);\n}\nfunction parseWithLoader(_x5, _x6, _x7, _x8) {\n    return _parseWithLoader.apply(this, arguments);\n}\nfunction _parseWithLoader() {\n    _parseWithLoader = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(loader, data, options, context) {\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    (0, _loaderUtils.validateLoaderVersion)(loader);\n                    _context2.next = 3;\n                    return (0, _getData.getArrayBufferOrStringFromData)(data, loader);\n                case 3:\n                    data = _context2.sent;\n                    if (!(loader.parseTextSync && typeof data === \"string\")) {\n                        _context2.next = 7;\n                        break;\n                    }\n                    options.dataType = \"text\";\n                    return _context2.abrupt(\"return\", loader.parseTextSync(data, options, context, loader));\n                case 7:\n                    if (!(0, _parseWithWorker.canParseWithWorker)(loader, data, options, context)) {\n                        _context2.next = 11;\n                        break;\n                    }\n                    _context2.next = 10;\n                    return (0, _parseWithWorkerDefault.default)(loader, data, options, context);\n                case 10:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 11:\n                    if (!(loader.parseText && typeof data === \"string\")) {\n                        _context2.next = 15;\n                        break;\n                    }\n                    _context2.next = 14;\n                    return loader.parseText(data, options, context, loader);\n                case 14:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 15:\n                    if (!loader.parse) {\n                        _context2.next = 19;\n                        break;\n                    }\n                    _context2.next = 18;\n                    return loader.parse(data, options, context, loader);\n                case 18:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 19:\n                    (0, _loaderUtils.assert)(!loader.parseSync);\n                    return _context2.abrupt(\"return\", (0, _loaderUtils.assert)(false));\n                case 21:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2);\n    }));\n    return _parseWithLoader.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@loaders.gl/loader-utils\":\"bhMte\",\"../loader-utils/normalize-loader\":\"3Yt77\",\"../loader-utils/option-utils\":\"hpM1J\",\"../loader-utils/get-data\":\"8XlWO\",\"../loader-utils/context-utils\":\"JY3Ja\",\"../loader-utils/parse-with-worker\":\"7cCbS\",\"../utils/resource-utils\":\"79vKg\",\"./select-loader\":\"h62jy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8XlWO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getArrayBufferOrStringFromDataSync\", ()=>getArrayBufferOrStringFromDataSync);\nparcelHelpers.export(exports, \"getArrayBufferOrStringFromData\", ()=>getArrayBufferOrStringFromData);\nparcelHelpers.export(exports, \"getAsyncIteratorFromData\", ()=>getAsyncIteratorFromData);\nparcelHelpers.export(exports, \"getReadableStream\", ()=>getReadableStream);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _makeIterator = require(\"../../iterator-utils/make-iterator/make-iterator\");\nvar _responseUtils = require(\"../utils/response-utils\");\nvar ERR_DATA = \"Cannot convert supplied data type\";\nfunction getArrayBufferOrStringFromDataSync(data, loader) {\n    if (loader.text && typeof data === \"string\") return data;\n    if (data instanceof ArrayBuffer) {\n        var arrayBuffer = data;\n        if (loader.text && !loader.binary) {\n            var textDecoder = new TextDecoder(\"utf8\");\n            return textDecoder.decode(arrayBuffer);\n        }\n        return arrayBuffer;\n    }\n    if (ArrayBuffer.isView(data) || (0, _isType.isBuffer)(data)) {\n        if (loader.text && !loader.binary) {\n            var _textDecoder = new TextDecoder(\"utf8\");\n            return _textDecoder.decode(data);\n        }\n        var _arrayBuffer = data.buffer;\n        var byteLength = data.byteLength || data.length;\n        if (data.byteOffset !== 0 || byteLength !== _arrayBuffer.byteLength) _arrayBuffer = _arrayBuffer.slice(data.byteOffset, data.byteOffset + byteLength);\n        return _arrayBuffer;\n    }\n    throw new Error(ERR_DATA);\n}\nfunction getArrayBufferOrStringFromData(_x, _x2) {\n    return _getArrayBufferOrStringFromData.apply(this, arguments);\n}\nfunction _getArrayBufferOrStringFromData() {\n    _getArrayBufferOrStringFromData = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(data, loader) {\n        var isArrayBuffer, response;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context3) {\n            while(true)switch(_context3.prev = _context3.next){\n                case 0:\n                    isArrayBuffer = data instanceof ArrayBuffer || ArrayBuffer.isView(data);\n                    if (!(typeof data === \"string\" || isArrayBuffer)) {\n                        _context3.next = 3;\n                        break;\n                    }\n                    return _context3.abrupt(\"return\", getArrayBufferOrStringFromDataSync(data, loader));\n                case 3:\n                    if (!(0, _isType.isBlob)(data)) {\n                        _context3.next = 7;\n                        break;\n                    }\n                    _context3.next = 6;\n                    return (0, _responseUtils.makeResponse)(data);\n                case 6:\n                    data = _context3.sent;\n                case 7:\n                    if (!(0, _isType.isResponse)(data)) {\n                        _context3.next = 21;\n                        break;\n                    }\n                    response = data;\n                    _context3.next = 11;\n                    return (0, _responseUtils.checkResponse)(response);\n                case 11:\n                    if (!loader.binary) {\n                        _context3.next = 17;\n                        break;\n                    }\n                    _context3.next = 14;\n                    return response.arrayBuffer();\n                case 14:\n                    _context3.t0 = _context3.sent;\n                    _context3.next = 20;\n                    break;\n                case 17:\n                    _context3.next = 19;\n                    return response.text();\n                case 19:\n                    _context3.t0 = _context3.sent;\n                case 20:\n                    return _context3.abrupt(\"return\", _context3.t0);\n                case 21:\n                    if ((0, _isType.isReadableStream)(data)) data = (0, _makeIterator.makeIterator)(data);\n                    if (!((0, _isType.isIterable)(data) || (0, _isType.isAsyncIterable)(data))) {\n                        _context3.next = 24;\n                        break;\n                    }\n                    return _context3.abrupt(\"return\", (0, _loaderUtils.concatenateChunksAsync)(data));\n                case 24:\n                    throw new Error(ERR_DATA);\n                case 25:\n                case \"end\":\n                    return _context3.stop();\n            }\n        }, _callee);\n    }));\n    return _getArrayBufferOrStringFromData.apply(this, arguments);\n}\nfunction getAsyncIteratorFromData(_x3) {\n    return _getAsyncIteratorFromData.apply(this, arguments);\n}\nfunction _getAsyncIteratorFromData() {\n    _getAsyncIteratorFromData = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(data) {\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context4) {\n            while(true)switch(_context4.prev = _context4.next){\n                case 0:\n                    if (!(0, _isType.isIterator)(data)) {\n                        _context4.next = 2;\n                        break;\n                    }\n                    return _context4.abrupt(\"return\", data);\n                case 2:\n                    if (!(0, _isType.isResponse)(data)) {\n                        _context4.next = 6;\n                        break;\n                    }\n                    _context4.next = 5;\n                    return (0, _responseUtils.checkResponse)(data);\n                case 5:\n                    return _context4.abrupt(\"return\", (0, _makeIterator.makeIterator)(data.body));\n                case 6:\n                    if (!((0, _isType.isBlob)(data) || (0, _isType.isReadableStream)(data))) {\n                        _context4.next = 8;\n                        break;\n                    }\n                    return _context4.abrupt(\"return\", (0, _makeIterator.makeIterator)(data));\n                case 8:\n                    if (!(0, _isType.isAsyncIterable)(data)) {\n                        _context4.next = 10;\n                        break;\n                    }\n                    return _context4.abrupt(\"return\", data[Symbol.asyncIterator]());\n                case 10:\n                    return _context4.abrupt(\"return\", getIteratorFromData(data));\n                case 11:\n                case \"end\":\n                    return _context4.stop();\n            }\n        }, _callee2);\n    }));\n    return _getAsyncIteratorFromData.apply(this, arguments);\n}\nfunction getIteratorFromData(data) {\n    if (ArrayBuffer.isView(data)) return (0, _regeneratorDefault.default).mark(function oneChunk() {\n        return (0, _regeneratorDefault.default).wrap(function oneChunk$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    _context.next = 2;\n                    return data.buffer;\n                case 2:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, oneChunk);\n    })();\n    if (data instanceof ArrayBuffer) return (0, _regeneratorDefault.default).mark(function oneChunk() {\n        return (0, _regeneratorDefault.default).wrap(function oneChunk$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    _context2.next = 2;\n                    return data;\n                case 2:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, oneChunk);\n    })();\n    if ((0, _isType.isIterator)(data)) return data;\n    if ((0, _isType.isIterable)(data)) return data[Symbol.iterator]();\n    throw new Error(ERR_DATA);\n}\nfunction getReadableStream(_x4) {\n    return _getReadableStream.apply(this, arguments);\n}\nfunction _getReadableStream() {\n    _getReadableStream = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee3(data) {\n        var response;\n        return (0, _regeneratorDefault.default).wrap(function _callee3$(_context5) {\n            while(true)switch(_context5.prev = _context5.next){\n                case 0:\n                    if (!(0, _isType.isReadableStream)(data)) {\n                        _context5.next = 2;\n                        break;\n                    }\n                    return _context5.abrupt(\"return\", data);\n                case 2:\n                    if (!(0, _isType.isResponse)(data)) {\n                        _context5.next = 4;\n                        break;\n                    }\n                    return _context5.abrupt(\"return\", data.body);\n                case 4:\n                    _context5.next = 6;\n                    return (0, _responseUtils.makeResponse)(data);\n                case 6:\n                    response = _context5.sent;\n                    return _context5.abrupt(\"return\", response.body);\n                case 8:\n                case \"end\":\n                    return _context5.stop();\n            }\n        }, _callee3);\n    }));\n    return _getReadableStream.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@loaders.gl/loader-utils\":\"bhMte\",\"../../javascript-utils/is-type\":\"a5AOB\",\"../../iterator-utils/make-iterator/make-iterator\":\"3fpne\",\"../utils/response-utils\":\"4j8S2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3fpne\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeIterator\", ()=>makeIterator);\nvar _stringIterator = require(\"./string-iterator\");\nvar _arrayBufferIterator = require(\"./array-buffer-iterator\");\nvar _blobIterator = require(\"./blob-iterator\");\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _streamIterator = require(\"./stream-iterator\");\nvar _isType = require(\"../../javascript-utils/is-type\");\nfunction makeIterator(data) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    if (typeof data === \"string\") return (0, _stringIterator.makeStringIterator)(data, options);\n    if (data instanceof ArrayBuffer) return (0, _arrayBufferIterator.makeArrayBufferIterator)(data, options);\n    if ((0, _isType.isBlob)(data)) return (0, _blobIterator.makeBlobIterator)(data, options);\n    if ((0, _isType.isReadableStream)(data)) return (0, _streamIterator.makeStreamIterator)(data);\n    if ((0, _isType.isResponse)(data)) return (0, _streamIterator.makeStreamIterator)(data.body);\n    return (0, _loaderUtils.assert)(false);\n}\n\n},{\"./string-iterator\":\"aw727\",\"./array-buffer-iterator\":\"dRubr\",\"./blob-iterator\":\"4LKKC\",\"@loaders.gl/loader-utils\":\"bhMte\",\"./stream-iterator\":\"3BHzY\",\"../../javascript-utils/is-type\":\"a5AOB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aw727\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeStringIterator\", ()=>makeStringIterator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _marked = (0, _regeneratorDefault.default).mark(makeStringIterator);\nfunction makeStringIterator(string) {\n    var options, _options$chunkSize, chunkSize, offset, textEncoder, chunkLength, chunk, _args = arguments;\n    return (0, _regeneratorDefault.default).wrap(function makeStringIterator$(_context) {\n        while(true)switch(_context.prev = _context.next){\n            case 0:\n                options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n                _options$chunkSize = options.chunkSize, chunkSize = _options$chunkSize === void 0 ? 262144 : _options$chunkSize;\n                offset = 0;\n                textEncoder = new TextEncoder();\n            case 4:\n                if (!(offset < string.length)) {\n                    _context.next = 12;\n                    break;\n                }\n                chunkLength = Math.min(string.length - offset, chunkSize);\n                chunk = string.slice(offset, offset + chunkLength);\n                offset += chunkLength;\n                _context.next = 10;\n                return textEncoder.encode(chunk);\n            case 10:\n                _context.next = 4;\n                break;\n            case 12:\n            case \"end\":\n                return _context.stop();\n        }\n    }, _marked);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dRubr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeArrayBufferIterator\", ()=>makeArrayBufferIterator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _marked = (0, _regeneratorDefault.default).mark(makeArrayBufferIterator);\nfunction makeArrayBufferIterator(arrayBuffer) {\n    var options, _options$chunkSize, chunkSize, byteOffset, chunkByteLength, chunk, sourceArray, chunkArray, _args = arguments;\n    return (0, _regeneratorDefault.default).wrap(function makeArrayBufferIterator$(_context) {\n        while(true)switch(_context.prev = _context.next){\n            case 0:\n                options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n                _options$chunkSize = options.chunkSize, chunkSize = _options$chunkSize === void 0 ? 262144 : _options$chunkSize;\n                byteOffset = 0;\n            case 3:\n                if (!(byteOffset < arrayBuffer.byteLength)) {\n                    _context.next = 14;\n                    break;\n                }\n                chunkByteLength = Math.min(arrayBuffer.byteLength - byteOffset, chunkSize);\n                chunk = new ArrayBuffer(chunkByteLength);\n                sourceArray = new Uint8Array(arrayBuffer, byteOffset, chunkByteLength);\n                chunkArray = new Uint8Array(chunk);\n                chunkArray.set(sourceArray);\n                byteOffset += chunkByteLength;\n                _context.next = 12;\n                return chunk;\n            case 12:\n                _context.next = 3;\n                break;\n            case 14:\n            case \"end\":\n                return _context.stop();\n        }\n    }, _marked);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4LKKC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeBlobIterator\", ()=>makeBlobIterator);\nparcelHelpers.export(exports, \"readFileSlice\", ()=>readFileSlice);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _awaitAsyncGenerator = require(\"@babel/runtime/helpers/esm/awaitAsyncGenerator\");\nvar _awaitAsyncGeneratorDefault = parcelHelpers.interopDefault(_awaitAsyncGenerator);\nvar _wrapAsyncGenerator = require(\"@babel/runtime/helpers/esm/wrapAsyncGenerator\");\nvar _wrapAsyncGeneratorDefault = parcelHelpers.interopDefault(_wrapAsyncGenerator);\nvar DEFAULT_CHUNK_SIZE = 1048576;\nfunction makeBlobIterator(_x) {\n    return _makeBlobIterator.apply(this, arguments);\n}\nfunction _makeBlobIterator() {\n    _makeBlobIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(file) {\n        var options, chunkSize, offset, end, chunk, _args = arguments;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    options = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};\n                    chunkSize = options.chunkSize || DEFAULT_CHUNK_SIZE;\n                    offset = 0;\n                case 3:\n                    if (!(offset < file.size)) {\n                        _context.next = 13;\n                        break;\n                    }\n                    end = offset + chunkSize;\n                    _context.next = 7;\n                    return (0, _awaitAsyncGeneratorDefault.default)(readFileSlice(file, offset, end));\n                case 7:\n                    chunk = _context.sent;\n                    offset = end;\n                    _context.next = 11;\n                    return chunk;\n                case 11:\n                    _context.next = 3;\n                    break;\n                case 13:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _makeBlobIterator.apply(this, arguments);\n}\nfunction readFileSlice(_x2, _x3, _x4) {\n    return _readFileSlice.apply(this, arguments);\n}\nfunction _readFileSlice() {\n    _readFileSlice = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(file, offset, end) {\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    _context2.next = 2;\n                    return new Promise(function(resolve, reject) {\n                        var slice = file.slice(offset, end);\n                        var fileReader = new FileReader();\n                        fileReader.onload = function(event) {\n                            return resolve(event.target && event.target.result);\n                        };\n                        fileReader.onerror = function(error) {\n                            return reject(error);\n                        };\n                        fileReader.readAsArrayBuffer(slice);\n                    });\n                case 2:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 3:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2);\n    }));\n    return _readFileSlice.apply(this, arguments);\n}\n\n},{\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/awaitAsyncGenerator\":\"79Bzs\",\"@babel/runtime/helpers/esm/wrapAsyncGenerator\":\"avO1B\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3BHzY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"makeStreamIterator\", ()=>makeStreamIterator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _awaitAsyncGenerator = require(\"@babel/runtime/helpers/esm/awaitAsyncGenerator\");\nvar _awaitAsyncGeneratorDefault = parcelHelpers.interopDefault(_awaitAsyncGenerator);\nvar _wrapAsyncGenerator = require(\"@babel/runtime/helpers/esm/wrapAsyncGenerator\");\nvar _wrapAsyncGeneratorDefault = parcelHelpers.interopDefault(_wrapAsyncGenerator);\nvar _asyncIterator = require(\"@babel/runtime/helpers/esm/asyncIterator\");\nvar _asyncIteratorDefault = parcelHelpers.interopDefault(_asyncIterator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nfunction makeStreamIterator(stream) {\n    if ((0, _loaderUtils.isBrowser) || (0, _loaderUtils.nodeVersion) >= 10) {\n        if (typeof stream[Symbol.asyncIterator] === \"function\") return makeToArrayBufferIterator(stream);\n        if (typeof stream.getIterator === \"function\") return stream.getIterator();\n    }\n    return (0, _loaderUtils.isBrowser) ? makeBrowserStreamIterator(stream) : makeNodeStreamIterator(stream);\n}\nfunction makeToArrayBufferIterator(_x) {\n    return _makeToArrayBufferIterator.apply(this, arguments);\n}\nfunction _makeToArrayBufferIterator() {\n    _makeToArrayBufferIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(asyncIterator) {\n        var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, chunk;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    _iteratorNormalCompletion = true;\n                    _didIteratorError = false;\n                    _context.prev = 2;\n                    _iterator = (0, _asyncIteratorDefault.default)(asyncIterator);\n                case 4:\n                    _context.next = 6;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator.next());\n                case 6:\n                    _step = _context.sent;\n                    _iteratorNormalCompletion = _step.done;\n                    _context.next = 10;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_step.value);\n                case 10:\n                    _value = _context.sent;\n                    if (_iteratorNormalCompletion) {\n                        _context.next = 18;\n                        break;\n                    }\n                    chunk = _value;\n                    _context.next = 15;\n                    return (0, _loaderUtils.toArrayBuffer)(chunk);\n                case 15:\n                    _iteratorNormalCompletion = true;\n                    _context.next = 4;\n                    break;\n                case 18:\n                    _context.next = 24;\n                    break;\n                case 20:\n                    _context.prev = 20;\n                    _context.t0 = _context[\"catch\"](2);\n                    _didIteratorError = true;\n                    _iteratorError = _context.t0;\n                case 24:\n                    _context.prev = 24;\n                    _context.prev = 25;\n                    if (!(!_iteratorNormalCompletion && _iterator[\"return\"] != null)) {\n                        _context.next = 29;\n                        break;\n                    }\n                    _context.next = 29;\n                    return (0, _awaitAsyncGeneratorDefault.default)(_iterator[\"return\"]());\n                case 29:\n                    _context.prev = 29;\n                    if (!_didIteratorError) {\n                        _context.next = 32;\n                        break;\n                    }\n                    throw _iteratorError;\n                case 32:\n                    return _context.finish(29);\n                case 33:\n                    return _context.finish(24);\n                case 34:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                2,\n                20,\n                24,\n                34\n            ],\n            [\n                25,\n                ,\n                29,\n                33\n            ]\n        ]);\n    }));\n    return _makeToArrayBufferIterator.apply(this, arguments);\n}\nfunction makeBrowserStreamIterator(_x2) {\n    return _makeBrowserStreamIterator.apply(this, arguments);\n}\nfunction _makeBrowserStreamIterator() {\n    _makeBrowserStreamIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(stream) {\n        var reader, _yield$_awaitAsyncGen, done, value;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    reader = stream.getReader();\n                    _context2.prev = 1;\n                case 2:\n                    _context2.next = 5;\n                    return (0, _awaitAsyncGeneratorDefault.default)(reader.read());\n                case 5:\n                    _yield$_awaitAsyncGen = _context2.sent;\n                    done = _yield$_awaitAsyncGen.done;\n                    value = _yield$_awaitAsyncGen.value;\n                    if (!done) {\n                        _context2.next = 10;\n                        break;\n                    }\n                    return _context2.abrupt(\"return\");\n                case 10:\n                    _context2.next = 12;\n                    return (0, _loaderUtils.toArrayBuffer)(value);\n                case 12:\n                    _context2.next = 2;\n                    break;\n                case 14:\n                    _context2.next = 19;\n                    break;\n                case 16:\n                    _context2.prev = 16;\n                    _context2.t0 = _context2[\"catch\"](1);\n                    reader.releaseLock();\n                case 19:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2, null, [\n            [\n                1,\n                16\n            ]\n        ]);\n    }));\n    return _makeBrowserStreamIterator.apply(this, arguments);\n}\nfunction makeNodeStreamIterator(_x3) {\n    return _makeNodeStreamIterator.apply(this, arguments);\n}\nfunction _makeNodeStreamIterator() {\n    _makeNodeStreamIterator = (0, _wrapAsyncGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee3(stream) {\n        var data;\n        return (0, _regeneratorDefault.default).wrap(function _callee3$(_context3) {\n            while(true)switch(_context3.prev = _context3.next){\n                case 0:\n                    _context3.next = 2;\n                    return (0, _awaitAsyncGeneratorDefault.default)(stream);\n                case 2:\n                    stream = _context3.sent;\n                case 3:\n                    data = stream.read();\n                    if (!(data !== null)) {\n                        _context3.next = 9;\n                        break;\n                    }\n                    _context3.next = 8;\n                    return (0, _loaderUtils.toArrayBuffer)(data);\n                case 8:\n                    return _context3.abrupt(\"continue\", 3);\n                case 9:\n                    if (!stream._readableState.ended) {\n                        _context3.next = 11;\n                        break;\n                    }\n                    return _context3.abrupt(\"return\");\n                case 11:\n                    _context3.next = 13;\n                    return (0, _awaitAsyncGeneratorDefault.default)(onceReadable(stream));\n                case 13:\n                    _context3.next = 3;\n                    break;\n                case 15:\n                case \"end\":\n                    return _context3.stop();\n            }\n        }, _callee3);\n    }));\n    return _makeNodeStreamIterator.apply(this, arguments);\n}\nfunction onceReadable(_x4) {\n    return _onceReadable.apply(this, arguments);\n}\nfunction _onceReadable() {\n    _onceReadable = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee4(stream) {\n        return (0, _regeneratorDefault.default).wrap(function _callee4$(_context4) {\n            while(true)switch(_context4.prev = _context4.next){\n                case 0:\n                    return _context4.abrupt(\"return\", new Promise(function(resolve) {\n                        stream.once(\"readable\", resolve);\n                    }));\n                case 1:\n                case \"end\":\n                    return _context4.stop();\n            }\n        }, _callee4);\n    }));\n    return _onceReadable.apply(this, arguments);\n}\n\n},{\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/awaitAsyncGenerator\":\"79Bzs\",\"@babel/runtime/helpers/esm/wrapAsyncGenerator\":\"avO1B\",\"@babel/runtime/helpers/esm/asyncIterator\":\"hoXxr\",\"@loaders.gl/loader-utils\":\"bhMte\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"JY3Ja\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getLoaderContext\", ()=>getLoaderContext);\nparcelHelpers.export(exports, \"getLoaders\", ()=>getLoaders);\nvar _toConsumableArray = require(\"@babel/runtime/helpers/esm/toConsumableArray\");\nvar _toConsumableArrayDefault = parcelHelpers.interopDefault(_toConsumableArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _optionUtils = require(\"./option-utils\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction getLoaderContext(context, options) {\n    var previousContext = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n    if (previousContext) return previousContext;\n    context = _objectSpread({\n        fetch: (0, _optionUtils.getFetchFunction)(options || {}, context)\n    }, context);\n    if (!Array.isArray(context.loaders)) context.loaders = null;\n    return context;\n}\nfunction getLoaders(loaders, context) {\n    if (!context && loaders && !Array.isArray(loaders)) return loaders;\n    var candidateLoaders;\n    if (loaders) candidateLoaders = Array.isArray(loaders) ? loaders : [\n        loaders\n    ];\n    if (context && context.loaders) {\n        var contextLoaders = Array.isArray(context.loaders) ? context.loaders : [\n            context.loaders\n        ];\n        candidateLoaders = candidateLoaders ? [].concat((0, _toConsumableArrayDefault.default)(candidateLoaders), (0, _toConsumableArrayDefault.default)(contextLoaders)) : contextLoaders;\n    }\n    return candidateLoaders && candidateLoaders.length ? candidateLoaders : null;\n}\n\n},{\"@babel/runtime/helpers/esm/toConsumableArray\":\"2mzaU\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"./option-utils\":\"hpM1J\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2mzaU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayWithoutHolesJs = require(\"./arrayWithoutHoles.js\");\nvar _arrayWithoutHolesJsDefault = parcelHelpers.interopDefault(_arrayWithoutHolesJs);\nvar _iterableToArrayJs = require(\"./iterableToArray.js\");\nvar _iterableToArrayJsDefault = parcelHelpers.interopDefault(_iterableToArrayJs);\nvar _unsupportedIterableToArrayJs = require(\"./unsupportedIterableToArray.js\");\nvar _unsupportedIterableToArrayJsDefault = parcelHelpers.interopDefault(_unsupportedIterableToArrayJs);\nvar _nonIterableSpreadJs = require(\"./nonIterableSpread.js\");\nvar _nonIterableSpreadJsDefault = parcelHelpers.interopDefault(_nonIterableSpreadJs);\nfunction _toConsumableArray(arr) {\n    return (0, _arrayWithoutHolesJsDefault.default)(arr) || (0, _iterableToArrayJsDefault.default)(arr) || (0, _unsupportedIterableToArrayJsDefault.default)(arr) || (0, _nonIterableSpreadJsDefault.default)();\n}\nexports.default = _toConsumableArray;\n\n},{\"./arrayWithoutHoles.js\":\"f9eMB\",\"./iterableToArray.js\":\"5joKW\",\"./unsupportedIterableToArray.js\":\"jwpEQ\",\"./nonIterableSpread.js\":\"1LXcu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f9eMB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayLikeToArrayJs = require(\"./arrayLikeToArray.js\");\nvar _arrayLikeToArrayJsDefault = parcelHelpers.interopDefault(_arrayLikeToArrayJs);\nfunction _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) return (0, _arrayLikeToArrayJsDefault.default)(arr);\n}\nexports.default = _arrayWithoutHoles;\n\n},{\"./arrayLikeToArray.js\":\"h2idP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h2idP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nexports.default = _arrayLikeToArray;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5joKW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _iterableToArray(iter) {\n    if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nexports.default = _iterableToArray;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jwpEQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayLikeToArrayJs = require(\"./arrayLikeToArray.js\");\nvar _arrayLikeToArrayJsDefault = parcelHelpers.interopDefault(_arrayLikeToArrayJs);\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return (0, _arrayLikeToArrayJsDefault.default)(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return (0, _arrayLikeToArrayJsDefault.default)(o, minLen);\n}\nexports.default = _unsupportedIterableToArray;\n\n},{\"./arrayLikeToArray.js\":\"h2idP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1LXcu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexports.default = _nonIterableSpread;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7cCbS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"canParseWithWorker\", ()=>canParseWithWorker);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _parse = require(\"../api/parse\");\nvar VERSION = \"2.3.13\";\nfunction canParseWithWorker(loader, data, options, context) {\n    if (!(0, _loaderUtils._WorkerFarm).isSupported()) return false;\n    var loaderOptions = options && options[loader.id];\n    if (options.worker === \"local\" && loaderOptions && loaderOptions.localWorkerUrl || options.worker && loaderOptions && loaderOptions.workerUrl) return loader.useWorker ? loader.useWorker(options) : true;\n    return false;\n}\nfunction parseWithWorker(loader, data, options, context) {\n    var _ref = options || {}, worker = _ref.worker;\n    var loaderOptions = options && options[loader.id] || {};\n    var workerUrl = worker === \"local\" ? loaderOptions.localWorkerUrl : loaderOptions.workerUrl;\n    var workerSource = \"url(\".concat(workerUrl, \")\");\n    var workerName = loader.name;\n    var workerFarm = getWorkerFarm(options);\n    options = JSON.parse(JSON.stringify(options));\n    var warning = loader.version !== VERSION ? \"(core version \".concat(VERSION, \")\") : \"\";\n    return workerFarm.process(workerSource, \"\".concat(workerName, \"-worker@\").concat(loader.version).concat(warning), {\n        arraybuffer: (0, _loaderUtils.toArrayBuffer)(data),\n        options: options,\n        source: \"loaders.gl@\".concat(VERSION),\n        type: \"parse\"\n    });\n}\nexports.default = parseWithWorker;\nvar _workerFarm = null;\nfunction getWorkerFarm() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var props = {};\n    if (options.maxConcurrency) props.maxConcurrency = options.maxConcurrency;\n    if (options.onDebug) props.onDebug = options.onDebug;\n    if (\"reuseWorkers\" in options) props.reuseWorkers = options.reuseWorkers;\n    if (!_workerFarm) _workerFarm = new (0, _loaderUtils._WorkerFarm)({\n        onMessage: onWorkerMessage\n    });\n    _workerFarm.setProps(props);\n    return _workerFarm;\n}\nfunction onWorkerMessage(_x) {\n    return _onWorkerMessage.apply(this, arguments);\n}\nfunction _onWorkerMessage() {\n    _onWorkerMessage = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(_ref2) {\n        var worker, data, resolve, reject, result;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    worker = _ref2.worker, data = _ref2.data, resolve = _ref2.resolve, reject = _ref2.reject;\n                    _context.t0 = data.type;\n                    _context.next = _context.t0 === \"done\" ? 4 : _context.t0 === \"parse\" ? 6 : _context.t0 === \"error\" ? 17 : 19;\n                    break;\n                case 4:\n                    resolve(data.result);\n                    return _context.abrupt(\"break\", 19);\n                case 6:\n                    _context.prev = 6;\n                    _context.next = 9;\n                    return (0, _parse.parse)(data.arraybuffer, data.options, data.url);\n                case 9:\n                    result = _context.sent;\n                    worker.postMessage({\n                        type: \"parse-done\",\n                        id: data.id,\n                        result: result\n                    }, (0, _loaderUtils.getTransferList)(result));\n                    _context.next = 16;\n                    break;\n                case 13:\n                    _context.prev = 13;\n                    _context.t1 = _context[\"catch\"](6);\n                    worker.postMessage({\n                        type: \"parse-error\",\n                        id: data.id,\n                        message: _context.t1.message\n                    });\n                case 16:\n                    return _context.abrupt(\"break\", 19);\n                case 17:\n                    reject(data.message);\n                    return _context.abrupt(\"break\", 19);\n                case 19:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                6,\n                13\n            ]\n        ]);\n    }));\n    return _onWorkerMessage.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@loaders.gl/loader-utils\":\"bhMte\",\"../api/parse\":\"1vDZj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h62jy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"selectLoader\", ()=>selectLoader);\nparcelHelpers.export(exports, \"selectLoaderSync\", ()=>selectLoaderSync);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _toConsumableArray = require(\"@babel/runtime/helpers/esm/toConsumableArray\");\nvar _toConsumableArrayDefault = parcelHelpers.interopDefault(_toConsumableArray);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _loaderUtils = require(\"@loaders.gl/loader-utils\");\nvar _normalizeLoader = require(\"../loader-utils/normalize-loader\");\nvar _resourceUtils = require(\"../utils/resource-utils\");\nvar _registerLoaders = require(\"./register-loaders\");\nvar _blobIterator = require(\"../../iterator-utils/make-iterator/blob-iterator\");\nvar _isType = require(\"../../javascript-utils/is-type\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar EXT_PATTERN = /\\.([^.]+)$/;\nfunction selectLoader(_x) {\n    return _selectLoader.apply(this, arguments);\n}\nfunction _selectLoader() {\n    _selectLoader = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(data) {\n        var loaders, options, context, loader, _args = arguments;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    loaders = _args.length > 1 && _args[1] !== undefined ? _args[1] : [];\n                    options = _args.length > 2 && _args[2] !== undefined ? _args[2] : {};\n                    context = _args.length > 3 && _args[3] !== undefined ? _args[3] : {};\n                    loader = selectLoaderSync(data, loaders, _objectSpread(_objectSpread({}, options), {}, {\n                        nothrow: true\n                    }), context);\n                    if (!loader) {\n                        _context.next = 6;\n                        break;\n                    }\n                    return _context.abrupt(\"return\", loader);\n                case 6:\n                    if (!(0, _isType.isBlob)(data)) {\n                        _context.next = 11;\n                        break;\n                    }\n                    _context.next = 9;\n                    return (0, _blobIterator.readFileSlice)(data, 0, 10);\n                case 9:\n                    data = _context.sent;\n                    loader = selectLoaderSync(data, loaders, options, context);\n                case 11:\n                    if (!(!loader && !options.nothrow)) {\n                        _context.next = 13;\n                        break;\n                    }\n                    throw new Error(getNoValidLoaderMessage(data));\n                case 13:\n                    return _context.abrupt(\"return\", loader);\n                case 14:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _selectLoader.apply(this, arguments);\n}\nfunction selectLoaderSync(data) {\n    var loaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var context = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    if (loaders && !Array.isArray(loaders)) return (0, _normalizeLoader.normalizeLoader)(loaders);\n    loaders = [].concat((0, _toConsumableArrayDefault.default)(loaders || []), (0, _toConsumableArrayDefault.default)((0, _registerLoaders.getRegisteredLoaders)()));\n    normalizeLoaders(loaders);\n    var _getResourceUrlAndTyp = (0, _resourceUtils.getResourceUrlAndType)(data), url = _getResourceUrlAndTyp.url, type = _getResourceUrlAndTyp.type;\n    var loader = findLoaderByUrl(loaders, url || context.url);\n    loader = loader || findLoaderByContentType(loaders, type);\n    loader = loader || findLoaderByExamingInitialData(loaders, data);\n    if (!loader && !options.nothrow) throw new Error(getNoValidLoaderMessage(data));\n    return loader;\n}\nfunction getNoValidLoaderMessage(data) {\n    var _getResourceUrlAndTyp2 = (0, _resourceUtils.getResourceUrlAndType)(data), url = _getResourceUrlAndTyp2.url, type = _getResourceUrlAndTyp2.type;\n    var message = \"No valid loader found\";\n    if (data) message += ' data: \"'.concat(getFirstCharacters(data), '\", contentType: \"').concat(type, '\"');\n    if (url) message += \" url: \".concat(url);\n    return message;\n}\nfunction normalizeLoaders(loaders) {\n    var _iterator = _createForOfIteratorHelper(loaders), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var loader = _step.value;\n            (0, _normalizeLoader.normalizeLoader)(loader);\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n}\nfunction findLoaderByUrl(loaders, url) {\n    var match = url && url.match(EXT_PATTERN);\n    var extension = match && match[1];\n    return extension && findLoaderByExtension(loaders, extension);\n}\nfunction findLoaderByExtension(loaders, extension) {\n    extension = extension.toLowerCase();\n    var _iterator2 = _createForOfIteratorHelper(loaders), _step2;\n    try {\n        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n            var loader = _step2.value;\n            var _iterator3 = _createForOfIteratorHelper(loader.extensions), _step3;\n            try {\n                for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                    var loaderExtension = _step3.value;\n                    if (loaderExtension.toLowerCase() === extension) return loader;\n                }\n            } catch (err) {\n                _iterator3.e(err);\n            } finally{\n                _iterator3.f();\n            }\n        }\n    } catch (err) {\n        _iterator2.e(err);\n    } finally{\n        _iterator2.f();\n    }\n    return null;\n}\nfunction findLoaderByContentType(loaders, mimeType) {\n    var _iterator4 = _createForOfIteratorHelper(loaders), _step4;\n    try {\n        for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n            var loader = _step4.value;\n            if (loader.mimeTypes && loader.mimeTypes.includes(mimeType)) return loader;\n            if (mimeType === \"application/x.\".concat(loader.id)) return loader;\n        }\n    } catch (err) {\n        _iterator4.e(err);\n    } finally{\n        _iterator4.f();\n    }\n    return null;\n}\nfunction findLoaderByExamingInitialData(loaders, data) {\n    if (!data) return null;\n    var _iterator5 = _createForOfIteratorHelper(loaders), _step5;\n    try {\n        for(_iterator5.s(); !(_step5 = _iterator5.n()).done;){\n            var loader = _step5.value;\n            if (typeof data === \"string\") {\n                if (testDataAgainstText(data, loader)) return loader;\n            } else if (ArrayBuffer.isView(data)) {\n                if (testDataAgainstBinary(data.buffer, data.byteOffset, loader)) return loader;\n            } else if (data instanceof ArrayBuffer) {\n                var byteOffset = 0;\n                if (testDataAgainstBinary(data, byteOffset, loader)) return loader;\n            }\n        }\n    } catch (err) {\n        _iterator5.e(err);\n    } finally{\n        _iterator5.f();\n    }\n    return null;\n}\nfunction testDataAgainstText(data, loader) {\n    return loader.testText && loader.testText(data);\n}\nfunction testDataAgainstBinary(data, byteOffset, loader) {\n    var tests = Array.isArray(loader.tests) ? loader.tests : [\n        loader.tests\n    ];\n    return tests.some(function(test) {\n        return testBinary(data, byteOffset, loader, test);\n    });\n}\nfunction testBinary(data, byteOffset, loader, test) {\n    if (test instanceof ArrayBuffer) return (0, _loaderUtils.compareArrayBuffers)(test, data, test.byteLength);\n    switch((0, _typeofDefault.default)(test)){\n        case \"function\":\n            return test(data, loader);\n        case \"string\":\n            var magic = getMagicString(data, byteOffset, test.length);\n            return test === magic;\n        default:\n            return false;\n    }\n}\nfunction getFirstCharacters(data) {\n    var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;\n    if (typeof data === \"string\") return data.slice(0, length);\n    else if (ArrayBuffer.isView(data)) return getMagicString(data.buffer, data.byteOffset, length);\n    else if (data instanceof ArrayBuffer) {\n        var byteOffset = 0;\n        return getMagicString(data, byteOffset, length);\n    }\n    return \"\";\n}\nfunction getMagicString(arrayBuffer, byteOffset, length) {\n    if (arrayBuffer.byteLength < byteOffset + length) return \"\";\n    var dataView = new DataView(arrayBuffer);\n    var magic = \"\";\n    for(var i = 0; i < length; i++)magic += String.fromCharCode(dataView.getUint8(byteOffset + i));\n    return magic;\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@babel/runtime/helpers/esm/toConsumableArray\":\"2mzaU\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@loaders.gl/loader-utils\":\"bhMte\",\"../loader-utils/normalize-loader\":\"3Yt77\",\"../utils/resource-utils\":\"79vKg\",\"./register-loaders\":\"lmt4b\",\"../../iterator-utils/make-iterator/blob-iterator\":\"4LKKC\",\"../../javascript-utils/is-type\":\"a5AOB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hdPHA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"load\", ()=>load);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _isType = require(\"../../javascript-utils/is-type\");\nvar _normalizeLoader = require(\"../loader-utils/normalize-loader\");\nvar _optionUtils = require(\"../loader-utils/option-utils\");\nvar _parse = require(\"./parse\");\nfunction load(_x, _x2, _x3) {\n    return _load.apply(this, arguments);\n}\nfunction _load() {\n    _load = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(url, loaders, options) {\n        var fetch, data;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    if (!Array.isArray(loaders) && !(0, _normalizeLoader.isLoaderObject)(loaders)) {\n                        options = loaders;\n                        loaders = null;\n                    }\n                    fetch = (0, _optionUtils.getFetchFunction)(options || {});\n                    data = url;\n                    if (!(typeof url === \"string\")) {\n                        _context.next = 9;\n                        break;\n                    }\n                    _context.next = 6;\n                    return fetch(url);\n                case 6:\n                    data = _context.sent;\n                    _context.next = 10;\n                    break;\n                case 9:\n                    url = null;\n                case 10:\n                    if (!(0, _isType.isBlob)(url)) {\n                        _context.next = 15;\n                        break;\n                    }\n                    _context.next = 13;\n                    return fetch(url);\n                case 13:\n                    data = _context.sent;\n                    url = null;\n                case 15:\n                    _context.next = 17;\n                    return (0, _parse.parse)(data, loaders, options);\n                case 17:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 18:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _load.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"../../javascript-utils/is-type\":\"a5AOB\",\"../loader-utils/normalize-loader\":\"3Yt77\",\"../loader-utils/option-utils\":\"hpM1J\",\"./parse\":\"1vDZj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2TXhJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ImageLoader\", ()=>(0, _imageLoaderDefault.default));\nparcelHelpers.export(exports, \"ImageWriter\", ()=>(0, _imageWriterDefault.default));\nparcelHelpers.export(exports, \"getBinaryImageMetadata\", ()=>(0, _binaryImageApi.getBinaryImageMetadata));\nparcelHelpers.export(exports, \"isImageTypeSupported\", ()=>(0, _imageType.isImageTypeSupported));\nparcelHelpers.export(exports, \"getDefaultImageType\", ()=>(0, _imageType.getDefaultImageType));\nparcelHelpers.export(exports, \"isImage\", ()=>(0, _parsedImageApi.isImage));\nparcelHelpers.export(exports, \"getImageType\", ()=>(0, _parsedImageApi.getImageType));\nparcelHelpers.export(exports, \"getImageSize\", ()=>(0, _parsedImageApi.getImageSize));\nparcelHelpers.export(exports, \"getImageData\", ()=>(0, _parsedImageApi.getImageData));\nparcelHelpers.export(exports, \"loadImage\", ()=>(0, _loadImage.loadImage));\nparcelHelpers.export(exports, \"loadImageArray\", ()=>(0, _loadImageArray.loadImageArray));\nparcelHelpers.export(exports, \"loadImageCube\", ()=>(0, _loadImageCube.loadImageCube));\nparcelHelpers.export(exports, \"HTMLImageLoader\", ()=>(0, _imageLoaderDefault.default));\nparcelHelpers.export(exports, \"getSupportedImageType\", ()=>getSupportedImageType);\nparcelHelpers.export(exports, \"isBinaryImage\", ()=>(0, _binaryImageApiDeprecated.isBinaryImage));\nparcelHelpers.export(exports, \"getBinaryImageMIMEType\", ()=>(0, _binaryImageApiDeprecated.getBinaryImageMIMEType));\nparcelHelpers.export(exports, \"getBinaryImageSize\", ()=>(0, _binaryImageApiDeprecated.getBinaryImageSize));\nvar _imageType = require(\"./lib/category-api/image-type\");\nvar _imageLoader = require(\"./image-loader\");\nvar _imageLoaderDefault = parcelHelpers.interopDefault(_imageLoader);\nvar _imageWriter = require(\"./image-writer\");\nvar _imageWriterDefault = parcelHelpers.interopDefault(_imageWriter);\nvar _binaryImageApi = require(\"./lib/category-api/binary-image-api\");\nvar _parsedImageApi = require(\"./lib/category-api/parsed-image-api\");\nvar _loadImage = require(\"./lib/texture-api/load-image\");\nvar _loadImageArray = require(\"./lib/texture-api/load-image-array\");\nvar _loadImageCube = require(\"./lib/texture-api/load-image-cube\");\nvar _binaryImageApiDeprecated = require(\"./lib/deprecated/binary-image-api-deprecated\");\nfunction getSupportedImageType() {\n    var imageType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    return (0, _imageType.getDefaultImageType)();\n}\n\n},{\"./lib/category-api/image-type\":\"jd4JZ\",\"./image-loader\":\"i3GPu\",\"./image-writer\":false,\"./lib/category-api/binary-image-api\":\"cDFx7\",\"./lib/category-api/parsed-image-api\":\"9GJxq\",\"./lib/texture-api/load-image\":false,\"./lib/texture-api/load-image-array\":false,\"./lib/texture-api/load-image-cube\":false,\"./lib/deprecated/binary-image-api-deprecated\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jd4JZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isImageTypeSupported\", ()=>isImageTypeSupported);\nparcelHelpers.export(exports, \"getDefaultImageType\", ()=>getDefaultImageType);\nvar _globals = require(\"../utils/globals\");\nvar _parseImageNode = (0, _globals.global)._parseImageNode;\nvar IMAGE_SUPPORTED = typeof Image !== \"undefined\";\nvar IMAGE_BITMAP_SUPPORTED = typeof ImageBitmap !== \"undefined\";\nvar NODE_IMAGE_SUPPORTED = Boolean(_parseImageNode);\nvar DATA_SUPPORTED = (0, _globals.isBrowser) ? true : NODE_IMAGE_SUPPORTED;\nfunction isImageTypeSupported(type) {\n    switch(type){\n        case \"auto\":\n            return IMAGE_BITMAP_SUPPORTED || IMAGE_SUPPORTED || DATA_SUPPORTED;\n        case \"imagebitmap\":\n            return IMAGE_BITMAP_SUPPORTED;\n        case \"image\":\n            return IMAGE_SUPPORTED;\n        case \"data\":\n            return DATA_SUPPORTED;\n        case \"html\":\n            return IMAGE_SUPPORTED;\n        case \"ndarray\":\n            return DATA_SUPPORTED;\n        default:\n            throw new Error(\"@loaders.gl/images: image \".concat(type, \" not supported in this environment\"));\n    }\n}\nfunction getDefaultImageType() {\n    if (IMAGE_BITMAP_SUPPORTED) return \"imagebitmap\";\n    if (IMAGE_SUPPORTED) return \"image\";\n    if (DATA_SUPPORTED) return \"data\";\n    throw new Error(\"Install '@loaders.gl/polyfills' to parse images under Node.js\");\n}\n\n},{\"../utils/globals\":\"icOJ2\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"icOJ2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"self\", ()=>self_);\nparcelHelpers.export(exports, \"window\", ()=>window_);\nparcelHelpers.export(exports, \"global\", ()=>global_);\nparcelHelpers.export(exports, \"document\", ()=>document_);\nparcelHelpers.export(exports, \"isBrowser\", ()=>isBrowser);\nparcelHelpers.export(exports, \"isWorker\", ()=>isWorker);\nparcelHelpers.export(exports, \"nodeVersion\", ()=>nodeVersion);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar process = require(\"process\");\nvar global = arguments[3];\nvar globals = {\n    self: typeof self !== \"undefined\" && self,\n    window: typeof window !== \"undefined\" && window,\n    global: typeof global !== \"undefined\" && global,\n    document: typeof document !== \"undefined\" && document\n};\nvar self_ = globals.self || globals.window || globals.global;\nvar window_ = globals.window || globals.self || globals.global;\nvar global_ = globals.global || globals.self || globals.window;\nvar document_ = globals.document || {};\nvar isBrowser = (typeof process === \"undefined\" ? \"undefined\" : (0, _typeofDefault.default)(process)) !== \"object\" || String(process) !== \"[object process]\" || true;\nvar isWorker = typeof importScripts === \"function\";\nvar matches = typeof process !== \"undefined\" && process.version && process.version.match(/v([0-9]*)/);\nvar nodeVersion = matches && parseFloat(matches[1]) || 0;\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"process\":\"eKMhv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i3GPu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _parseImage = require(\"./lib/parsers/parse-image\");\nvar _parseImageDefault = parcelHelpers.interopDefault(_parseImage);\nvar _binaryImageApi = require(\"./lib/category-api/binary-image-api\");\nvar VERSION = \"2.3.13\";\nvar EXTENSIONS = [\n    \"png\",\n    \"jpg\",\n    \"jpeg\",\n    \"gif\",\n    \"webp\",\n    \"bmp\",\n    \"ico\",\n    \"svg\"\n];\nvar MIME_TYPES = [\n    \"image/png\",\n    \"image/jpeg\",\n    \"image/gif\",\n    \"image/webp\",\n    \"image/bmp\",\n    \"image/vnd.microsoft.icon\",\n    \"image/svg+xml\"\n];\nvar ImageLoader = {\n    id: \"image\",\n    name: \"Images\",\n    version: VERSION,\n    mimeTypes: MIME_TYPES,\n    extensions: EXTENSIONS,\n    parse: (0, _parseImageDefault.default),\n    tests: [\n        function(arrayBuffer) {\n            return Boolean((0, _binaryImageApi.getBinaryImageMetadata)(new DataView(arrayBuffer)));\n        }\n    ],\n    options: {\n        image: {\n            type: \"auto\",\n            decode: true\n        }\n    }\n};\nexports.default = ImageLoader;\n\n},{\"./lib/parsers/parse-image\":\"6W2J9\",\"./lib/category-api/binary-image-api\":\"cDFx7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6W2J9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _imageType = require(\"../category-api/image-type\");\nvar _parsedImageApi = require(\"../category-api/parsed-image-api\");\nvar _parseToImage = require(\"./parse-to-image\");\nvar _parseToImageDefault = parcelHelpers.interopDefault(_parseToImage);\nvar _parseToImageBitmap = require(\"./parse-to-image-bitmap\");\nvar _parseToImageBitmapDefault = parcelHelpers.interopDefault(_parseToImageBitmap);\nvar _parseToNodeImage = require(\"./parse-to-node-image\");\nvar _parseToNodeImageDefault = parcelHelpers.interopDefault(_parseToNodeImage);\nfunction parseImage(_x, _x2, _x3) {\n    return _parseImage.apply(this, arguments);\n}\nexports.default = parseImage;\nfunction _parseImage() {\n    _parseImage = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(arrayBuffer, options, context) {\n        var imageOptions, imageType, _ref, url, loadType, image;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    options = options || {};\n                    imageOptions = options.image || {};\n                    imageType = imageOptions.type || \"auto\";\n                    _ref = context || {}, url = _ref.url;\n                    loadType = getLoadableImageType(imageType);\n                    _context.t0 = loadType;\n                    _context.next = _context.t0 === \"imagebitmap\" ? 8 : _context.t0 === \"image\" ? 12 : _context.t0 === \"data\" ? 16 : 20;\n                    break;\n                case 8:\n                    _context.next = 10;\n                    return (0, _parseToImageBitmapDefault.default)(arrayBuffer, options, url);\n                case 10:\n                    image = _context.sent;\n                    return _context.abrupt(\"break\", 21);\n                case 12:\n                    _context.next = 14;\n                    return (0, _parseToImageDefault.default)(arrayBuffer, options, url);\n                case 14:\n                    image = _context.sent;\n                    return _context.abrupt(\"break\", 21);\n                case 16:\n                    _context.next = 18;\n                    return (0, _parseToNodeImageDefault.default)(arrayBuffer, options);\n                case 18:\n                    image = _context.sent;\n                    return _context.abrupt(\"break\", 21);\n                case 20:\n                    (0, _assertDefault.default)(false);\n                case 21:\n                    if (imageType === \"data\") image = (0, _parsedImageApi.getImageData)(image);\n                    return _context.abrupt(\"return\", image);\n                case 23:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _parseImage.apply(this, arguments);\n}\nfunction getLoadableImageType(type) {\n    switch(type){\n        case \"auto\":\n        case \"data\":\n            return (0, _imageType.getDefaultImageType)();\n        default:\n            (0, _imageType.isImageTypeSupported)(type);\n            return type;\n    }\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"../utils/assert\":\"dmHuo\",\"../category-api/image-type\":\"jd4JZ\",\"../category-api/parsed-image-api\":\"9GJxq\",\"./parse-to-image\":\"cSR1J\",\"./parse-to-image-bitmap\":\"b87Cc\",\"./parse-to-node-image\":\"kg2un\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dmHuo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message);\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9GJxq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isImage\", ()=>isImage);\nparcelHelpers.export(exports, \"deleteImage\", ()=>deleteImage);\nparcelHelpers.export(exports, \"getImageType\", ()=>getImageType);\nparcelHelpers.export(exports, \"getImageData\", ()=>getImageData);\nparcelHelpers.export(exports, \"getImageSize\", ()=>getImageData);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction isImage(image) {\n    return Boolean(getImageTypeOrNull(image));\n}\nfunction deleteImage(image) {\n    switch(getImageType(image)){\n        case \"imagebitmap\":\n            image.close();\n            break;\n        default:\n    }\n}\nfunction getImageType(image) {\n    var format = getImageTypeOrNull(image);\n    if (!format) throw new Error(\"Not an image\");\n    return format;\n}\nfunction getImageData(image) {\n    switch(getImageType(image)){\n        case \"data\":\n            return image;\n        case \"image\":\n        case \"imagebitmap\":\n            var canvas = document.createElement(\"canvas\");\n            var context = canvas.getContext(\"2d\");\n            if (context) {\n                canvas.width = image.width;\n                canvas.height = image.height;\n                context.drawImage(image, 0, 0);\n                return context.getImageData(0, 0, image.width, image.height);\n            }\n        default:\n            return (0, _assertDefault.default)(false);\n    }\n}\nfunction getImageTypeOrNull(image) {\n    if (typeof ImageBitmap !== \"undefined\" && image instanceof ImageBitmap) return \"imagebitmap\";\n    if (typeof Image !== \"undefined\" && image instanceof Image) return \"image\";\n    if (image && (0, _typeofDefault.default)(image) === \"object\" && image.data && image.width && image.height) return \"data\";\n    return null;\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"../utils/assert\":\"dmHuo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cSR1J\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"loadToImage\", ()=>loadToImage);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _svgUtils = require(\"./svg-utils\");\nfunction parseToImage(_x, _x2, _x3) {\n    return _parseToImage.apply(this, arguments);\n}\nexports.default = parseToImage;\nfunction _parseToImage() {\n    _parseToImage = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(arrayBuffer, options, url) {\n        var blobOrDataUrl, URL, objectUrl;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    blobOrDataUrl = (0, _svgUtils.getBlobOrSVGDataUrl)(arrayBuffer, url);\n                    URL = self.URL || self.webkitURL;\n                    objectUrl = typeof blobOrDataUrl !== \"string\" && URL.createObjectURL(blobOrDataUrl);\n                    _context.prev = 3;\n                    _context.next = 6;\n                    return loadToImage(objectUrl || blobOrDataUrl, options);\n                case 6:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 7:\n                    _context.prev = 7;\n                    if (objectUrl) URL.revokeObjectURL(objectUrl);\n                    return _context.finish(7);\n                case 10:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee, null, [\n            [\n                3,\n                ,\n                7,\n                10\n            ]\n        ]);\n    }));\n    return _parseToImage.apply(this, arguments);\n}\nfunction loadToImage(_x4, _x5) {\n    return _loadToImage.apply(this, arguments);\n}\nfunction _loadToImage() {\n    _loadToImage = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(url, options) {\n        var image;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    image = new Image();\n                    image.src = url;\n                    if (!(options.image && options.image.decode && image.decode)) {\n                        _context2.next = 6;\n                        break;\n                    }\n                    _context2.next = 5;\n                    return image.decode();\n                case 5:\n                    return _context2.abrupt(\"return\", image);\n                case 6:\n                    _context2.next = 8;\n                    return new Promise(function(resolve, reject) {\n                        try {\n                            image.onload = function() {\n                                return resolve(image);\n                            };\n                            image.onerror = function(err) {\n                                return reject(new Error(\"Could not load image \".concat(url, \": \").concat(err)));\n                            };\n                        } catch (error) {\n                            reject(error);\n                        }\n                    });\n                case 8:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 9:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2);\n    }));\n    return _loadToImage.apply(this, arguments);\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"./svg-utils\":\"clMS7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"clMS7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isSVG\", ()=>isSVG);\nparcelHelpers.export(exports, \"getBlobOrSVGDataUrl\", ()=>getBlobOrSVGDataUrl);\nparcelHelpers.export(exports, \"getBlob\", ()=>getBlob);\nvar SVG_DATA_URL_PATTERN = /^data:image\\/svg\\+xml/;\nvar SVG_URL_PATTERN = /\\.svg((\\?|#).*)?$/;\nfunction isSVG(url) {\n    return url && (SVG_DATA_URL_PATTERN.test(url) || SVG_URL_PATTERN.test(url));\n}\nfunction getBlobOrSVGDataUrl(arrayBuffer, url) {\n    if (isSVG(url)) {\n        var textDecoder = new TextDecoder();\n        var xmlText = textDecoder.decode(arrayBuffer);\n        var src = \"data:image/svg+xml;base64,\".concat(btoa(xmlText));\n        return src;\n    }\n    return getBlob(arrayBuffer, url);\n}\nfunction getBlob(arrayBuffer, url) {\n    if (isSVG(url)) throw new Error(\"SVG cannot be parsed directly to imagebitmap\");\n    return new Blob([\n        new Uint8Array(arrayBuffer)\n    ]);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b87Cc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _svgUtils = require(\"./svg-utils\");\nvar _parseToImage = require(\"./parse-to-image\");\nvar _parseToImageDefault = parcelHelpers.interopDefault(_parseToImage);\nvar EMPTY_OBJECT = {};\nvar imagebitmapOptionsSupported = true;\nfunction parseToImageBitmap(_x, _x2, _x3) {\n    return _parseToImageBitmap.apply(this, arguments);\n}\nexports.default = parseToImageBitmap;\nfunction _parseToImageBitmap() {\n    _parseToImageBitmap = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(arrayBuffer, options, url) {\n        var blob, image, imagebitmapOptions;\n        return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n            while(true)switch(_context.prev = _context.next){\n                case 0:\n                    if (!(0, _svgUtils.isSVG)(url)) {\n                        _context.next = 7;\n                        break;\n                    }\n                    _context.next = 3;\n                    return (0, _parseToImageDefault.default)(arrayBuffer, options, url);\n                case 3:\n                    image = _context.sent;\n                    blob = image;\n                    _context.next = 8;\n                    break;\n                case 7:\n                    blob = (0, _svgUtils.getBlob)(arrayBuffer, url);\n                case 8:\n                    imagebitmapOptions = options && options.imagebitmap;\n                    _context.next = 11;\n                    return safeCreateImageBitmap(blob, imagebitmapOptions);\n                case 11:\n                    return _context.abrupt(\"return\", _context.sent);\n                case 12:\n                case \"end\":\n                    return _context.stop();\n            }\n        }, _callee);\n    }));\n    return _parseToImageBitmap.apply(this, arguments);\n}\nfunction safeCreateImageBitmap(_x4) {\n    return _safeCreateImageBitmap.apply(this, arguments);\n}\nfunction _safeCreateImageBitmap() {\n    _safeCreateImageBitmap = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee2(blob) {\n        var imagebitmapOptions, _args2 = arguments;\n        return (0, _regeneratorDefault.default).wrap(function _callee2$(_context2) {\n            while(true)switch(_context2.prev = _context2.next){\n                case 0:\n                    imagebitmapOptions = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : null;\n                    if (isEmptyObject(imagebitmapOptions) || !imagebitmapOptionsSupported) imagebitmapOptions = null;\n                    if (!imagebitmapOptions) {\n                        _context2.next = 13;\n                        break;\n                    }\n                    _context2.prev = 3;\n                    _context2.next = 6;\n                    return createImageBitmap(blob, imagebitmapOptions);\n                case 6:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 9:\n                    _context2.prev = 9;\n                    _context2.t0 = _context2[\"catch\"](3);\n                    console.warn(_context2.t0);\n                    imagebitmapOptionsSupported = false;\n                case 13:\n                    _context2.next = 15;\n                    return createImageBitmap(blob);\n                case 15:\n                    return _context2.abrupt(\"return\", _context2.sent);\n                case 16:\n                case \"end\":\n                    return _context2.stop();\n            }\n        }, _callee2, null, [\n            [\n                3,\n                9\n            ]\n        ]);\n    }));\n    return _safeCreateImageBitmap.apply(this, arguments);\n}\nfunction isEmptyObject(object) {\n    for(var key in object || EMPTY_OBJECT)return false;\n    return true;\n}\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"./svg-utils\":\"clMS7\",\"./parse-to-image\":\"cSR1J\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kg2un\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _globals = require(\"../utils/globals\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _binaryImageApi = require(\"../category-api/binary-image-api\");\nfunction parseToNodeImage(arrayBuffer, options) {\n    var _ref = (0, _binaryImageApi.getBinaryImageMetadata)(arrayBuffer) || {}, mimeType = _ref.mimeType;\n    var _parseImageNode = (0, _globals.global)._parseImageNode;\n    (0, _assertDefault.default)(_parseImageNode);\n    return _parseImageNode(arrayBuffer, mimeType, options);\n}\nexports.default = parseToNodeImage;\n\n},{\"../utils/globals\":\"icOJ2\",\"../utils/assert\":\"dmHuo\",\"../category-api/binary-image-api\":\"cDFx7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cDFx7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getBinaryImageMetadata\", ()=>getBinaryImageMetadata);\nparcelHelpers.export(exports, \"getBmpMetadata\", ()=>getBmpMetadata);\nvar BIG_ENDIAN = false;\nvar LITTLE_ENDIAN = true;\nfunction getBinaryImageMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    return getPngMetadata(dataView) || getJpegMetadata(dataView) || getGifMetadata(dataView) || getBmpMetadata(dataView);\n}\nfunction getPngMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    var isPng = dataView.byteLength >= 24 && dataView.getUint32(0, BIG_ENDIAN) === 0x89504e47;\n    if (!isPng) return null;\n    return {\n        mimeType: \"image/png\",\n        width: dataView.getUint32(16, BIG_ENDIAN),\n        height: dataView.getUint32(20, BIG_ENDIAN)\n    };\n}\nfunction getGifMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    var isGif = dataView.byteLength >= 10 && dataView.getUint32(0, BIG_ENDIAN) === 0x47494638;\n    if (!isGif) return null;\n    return {\n        mimeType: \"image/gif\",\n        width: dataView.getUint16(6, LITTLE_ENDIAN),\n        height: dataView.getUint16(8, LITTLE_ENDIAN)\n    };\n}\nfunction getBmpMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    var isBmp = dataView.byteLength >= 14 && dataView.getUint16(0, BIG_ENDIAN) === 0x424d && dataView.getUint32(2, LITTLE_ENDIAN) === dataView.byteLength;\n    if (!isBmp) return null;\n    return {\n        mimeType: \"image/bmp\",\n        width: dataView.getUint32(18, LITTLE_ENDIAN),\n        height: dataView.getUint32(22, LITTLE_ENDIAN)\n    };\n}\nfunction getJpegMetadata(binaryData) {\n    var dataView = toDataView(binaryData);\n    var isJpeg = dataView.byteLength >= 3 && dataView.getUint16(0, BIG_ENDIAN) === 0xffd8 && dataView.getUint8(2) === 0xff;\n    if (!isJpeg) return null;\n    var _getJpegMarkers = getJpegMarkers(), tableMarkers = _getJpegMarkers.tableMarkers, sofMarkers = _getJpegMarkers.sofMarkers;\n    var i = 2;\n    while(i + 9 < dataView.byteLength){\n        var marker = dataView.getUint16(i, BIG_ENDIAN);\n        if (sofMarkers.has(marker)) return {\n            mimeType: \"image/jpeg\",\n            height: dataView.getUint16(i + 5, BIG_ENDIAN),\n            width: dataView.getUint16(i + 7, BIG_ENDIAN)\n        };\n        if (!tableMarkers.has(marker)) return null;\n        i += 2;\n        i += dataView.getUint16(i, BIG_ENDIAN);\n    }\n    return null;\n}\nfunction getJpegMarkers() {\n    var tableMarkers = new Set([\n        0xffdb,\n        0xffc4,\n        0xffcc,\n        0xffdd,\n        0xfffe\n    ]);\n    for(var i = 0xffe0; i < 0xfff0; ++i)tableMarkers.add(i);\n    var sofMarkers = new Set([\n        0xffc0,\n        0xffc1,\n        0xffc2,\n        0xffc3,\n        0xffc5,\n        0xffc6,\n        0xffc7,\n        0xffc9,\n        0xffca,\n        0xffcb,\n        0xffcd,\n        0xffce,\n        0xffcf,\n        0xffde\n    ]);\n    return {\n        tableMarkers: tableMarkers,\n        sofMarkers: sofMarkers\n    };\n}\nfunction toDataView(data) {\n    if (data instanceof DataView) return data;\n    if (ArrayBuffer.isView(data)) return new DataView(data.buffer);\n    if (data instanceof ArrayBuffer) return new DataView(data);\n    throw new Error(\"toDataView\");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4WXZh\":[function(require,module,exports) {\n// This file enables: import 'probe.gl/bench'.\n// Note: Must be published using package.json \"files\" field\nmodule.exports = require(\"@probe.gl/env\");\n\n},{\"@probe.gl/env\":\"W5Epy\"}],\"W5Epy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VERSION\", ()=>(0, _globals.VERSION));\nparcelHelpers.export(exports, \"self\", ()=>(0, _globals1.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _globals1.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _globals1.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _globals1.document));\nparcelHelpers.export(exports, \"process\", ()=>(0, _globals1.process));\nparcelHelpers.export(exports, \"console\", ()=>(0, _globals1.console));\nparcelHelpers.export(exports, \"isBrowser\", ()=>(0, _isBrowserDefault.default));\nparcelHelpers.export(exports, \"isBrowserMainThread\", ()=>(0, _isBrowser.isBrowserMainThread));\nparcelHelpers.export(exports, \"getBrowser\", ()=>(0, _getBrowserDefault.default));\nparcelHelpers.export(exports, \"isMobile\", ()=>(0, _getBrowser.isMobile));\nparcelHelpers.export(exports, \"isElectron\", ()=>(0, _isElectronDefault.default));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nvar _globals = require(\"./utils/globals\");\nvar _globals1 = require(\"./lib/globals\");\nvar _isBrowser = require(\"./lib/is-browser\");\nvar _isBrowserDefault = parcelHelpers.interopDefault(_isBrowser);\nvar _getBrowser = require(\"./lib/get-browser\");\nvar _getBrowserDefault = parcelHelpers.interopDefault(_getBrowser);\nvar _isElectron = require(\"./lib/is-electron\");\nvar _isElectronDefault = parcelHelpers.interopDefault(_isElectron);\nvar _assert = require(\"./utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\n\n},{\"./utils/globals\":\"f8xDe\",\"./lib/globals\":\"hugo1\",\"./lib/is-browser\":\"hIozq\",\"./lib/get-browser\":\"f8u6h\",\"./lib/is-electron\":\"lw2a6\",\"./utils/assert\":\"egAiy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f8xDe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"self\", ()=>(0, _globals.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _globals.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _globals.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _globals.document));\nparcelHelpers.export(exports, \"process\", ()=>(0, _globals.process));\nparcelHelpers.export(exports, \"console\", ()=>(0, _globals.console));\nparcelHelpers.export(exports, \"VERSION\", ()=>VERSION);\nparcelHelpers.export(exports, \"isBrowser\", ()=>isBrowser);\nvar _isBrowser = require(\"../lib/is-browser\");\nvar _isBrowserDefault = parcelHelpers.interopDefault(_isBrowser);\nvar _globals = require(\"../lib/globals\");\nconst VERSION = typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"untranspiled source\";\nconst isBrowser = (0, _isBrowserDefault.default)();\n\n},{\"../lib/is-browser\":\"hIozq\",\"../lib/globals\":\"hugo1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hIozq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isBrowserMainThread\", ()=>isBrowserMainThread);\nvar _isElectron = require(\"./is-electron\");\nvar _isElectronDefault = parcelHelpers.interopDefault(_isElectron);\nvar process = require(\"process\");\nfunction isBrowser() {\n    const isNode = typeof process === \"object\" && String(process) === \"[object process]\" && false;\n    return !isNode || (0, _isElectronDefault.default)();\n}\nexports.default = isBrowser;\nfunction isBrowserMainThread() {\n    return isBrowser() && typeof document !== \"undefined\";\n}\n\n},{\"./is-electron\":\"lw2a6\",\"process\":\"eKMhv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lw2a6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar process = require(\"process\");\nfunction isElectron(mockUserAgent) {\n    if (typeof window !== \"undefined\" && typeof window.process === \"object\" && window.process.type === \"renderer\") return true;\n    if (typeof process !== \"undefined\" && typeof process.versions === \"object\" && Boolean(process.versions.electron)) return true;\n    const realUserAgent = typeof navigator === \"object\" && typeof navigator.userAgent === \"string\" && navigator.userAgent;\n    const userAgent = mockUserAgent || realUserAgent;\n    if (userAgent && userAgent.indexOf(\"Electron\") >= 0) return true;\n    return false;\n}\nexports.default = isElectron;\n\n},{\"process\":\"eKMhv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hugo1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"self\", ()=>self_);\nparcelHelpers.export(exports, \"window\", ()=>window_);\nparcelHelpers.export(exports, \"global\", ()=>global_);\nparcelHelpers.export(exports, \"document\", ()=>document_);\nparcelHelpers.export(exports, \"process\", ()=>process_);\nparcelHelpers.export(exports, \"console\", ()=>console_);\nvar global = arguments[3];\nvar process = require(\"process\");\nconst globals = {\n    self: typeof self !== \"undefined\" && self,\n    window: typeof window !== \"undefined\" && window,\n    global: typeof global !== \"undefined\" && global,\n    document: typeof document !== \"undefined\" && document,\n    process: typeof process === \"object\" && process\n};\nconst global_ = globalThis;\nconst self_ = globals.self || globals.window || globals.global;\nconst window_ = globals.window || globals.self || globals.global;\nconst document_ = globals.document || {};\nconst process_ = globals.process || {};\nconst console_ = console;\n\n},{\"process\":\"eKMhv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f8u6h\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isMobile\", ()=>isMobile);\nvar _isBrowser = require(\"./is-browser\");\nvar _isBrowserDefault = parcelHelpers.interopDefault(_isBrowser);\nvar _isElectron = require(\"./is-electron\");\nvar _isElectronDefault = parcelHelpers.interopDefault(_isElectron);\nconst window = globalThis;\nfunction isMobile() {\n    return typeof window.orientation !== \"undefined\";\n}\nfunction getBrowser(mockUserAgent) {\n    if (!mockUserAgent && !(0, _isBrowserDefault.default)()) return \"Node\";\n    if ((0, _isElectronDefault.default)(mockUserAgent)) return \"Electron\";\n    const navigator_ = typeof navigator !== \"undefined\" ? navigator : {};\n    const userAgent = mockUserAgent || navigator_.userAgent || \"\";\n    if (userAgent.indexOf(\"Edge\") > -1) return \"Edge\";\n    const isMSIE = userAgent.indexOf(\"MSIE \") !== -1;\n    const isTrident = userAgent.indexOf(\"Trident/\") !== -1;\n    if (isMSIE || isTrident) return \"IE\";\n    if (window.chrome) return \"Chrome\";\n    if (window.safari) return \"Safari\";\n    if (window.mozInnerScreenX) return \"Firefox\";\n    return \"Unknown\";\n}\nexports.default = getBrowser;\n\n},{\"./is-browser\":\"hIozq\",\"./is-electron\":\"lw2a6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"egAiy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"Assertion failed\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fg4UT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _probeGl = require(\"probe.gl\");\nexports.default = new (0, _probeGl.Log)({\n    id: \"deck\"\n});\n\n},{\"probe.gl\":\"f91qf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f91qf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VERSION\", ()=>(0, _env.VERSION));\nparcelHelpers.export(exports, \"self\", ()=>(0, _env.self));\nparcelHelpers.export(exports, \"window\", ()=>(0, _env.window));\nparcelHelpers.export(exports, \"global\", ()=>(0, _env.global));\nparcelHelpers.export(exports, \"document\", ()=>(0, _env.document));\nparcelHelpers.export(exports, \"process\", ()=>(0, _env.process));\nparcelHelpers.export(exports, \"console\", ()=>(0, _env.console));\nparcelHelpers.export(exports, \"isBrowser\", ()=>(0, _env.isBrowser));\nparcelHelpers.export(exports, \"isBrowserMainThread\", ()=>(0, _env.isBrowserMainThread));\nparcelHelpers.export(exports, \"getBrowser\", ()=>(0, _env.getBrowser));\nparcelHelpers.export(exports, \"isMobile\", ()=>(0, _env.isMobile));\nparcelHelpers.export(exports, \"isElectron\", ()=>(0, _env.isElectron));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _env.assert));\nparcelHelpers.export(exports, \"Log\", ()=>(0, _log.Log));\nparcelHelpers.export(exports, \"COLOR\", ()=>(0, _log.COLOR));\nparcelHelpers.export(exports, \"default\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"addColor\", ()=>(0, _log.addColor));\nparcelHelpers.export(exports, \"leftPad\", ()=>(0, _log.leftPad));\nparcelHelpers.export(exports, \"rightPad\", ()=>(0, _log.rightPad));\nparcelHelpers.export(exports, \"autobind\", ()=>(0, _log.autobind));\nparcelHelpers.export(exports, \"LocalStorage\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"getHiResTimestamp\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"Stats\", ()=>(0, _stats.Stats));\nparcelHelpers.export(exports, \"Stat\", ()=>(0, _stats.Stat));\nvar _env = require(\"@probe.gl/env\");\nvar _log = require(\"@probe.gl/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _stats = require(\"@probe.gl/stats\");\n\n},{\"@probe.gl/env\":\"W5Epy\",\"@probe.gl/log\":\"2k0af\",\"@probe.gl/stats\":\"c65AV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2k0af\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Log\", ()=>(0, _logDefault.default));\nparcelHelpers.export(exports, \"COLOR\", ()=>(0, _color.COLOR));\nparcelHelpers.export(exports, \"addColor\", ()=>(0, _color.addColor));\nparcelHelpers.export(exports, \"leftPad\", ()=>(0, _formatters.leftPad));\nparcelHelpers.export(exports, \"rightPad\", ()=>(0, _formatters.rightPad));\nparcelHelpers.export(exports, \"autobind\", ()=>(0, _autobind.autobind));\nparcelHelpers.export(exports, \"LocalStorage\", ()=>(0, _localStorageDefault.default));\nparcelHelpers.export(exports, \"getHiResTimestamp\", ()=>(0, _hiResTimestamp.getHiResTimestamp));\nvar _log = require(\"./log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _init = require(\"./init\");\nvar _color = require(\"./utils/color\");\nvar _formatters = require(\"./utils/formatters\");\nvar _autobind = require(\"./utils/autobind\");\nvar _localStorage = require(\"./utils/local-storage\");\nvar _localStorageDefault = parcelHelpers.interopDefault(_localStorage);\nvar _hiResTimestamp = require(\"./utils/hi-res-timestamp\");\nexports.default = new (0, _logDefault.default)({\n    id: \"@probe.gl/log\"\n});\n\n},{\"./log\":\"loPXd\",\"./init\":\"g3dRc\",\"./utils/color\":\"7l4ir\",\"./utils/formatters\":\"dNnGa\",\"./utils/autobind\":\"iy5Y6\",\"./utils/local-storage\":\"fTcMu\",\"./utils/hi-res-timestamp\":\"8YbZJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"loPXd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalizeArguments\", ()=>normalizeArguments);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _env = require(\"@probe.gl/env\");\nvar _localStorage = require(\"./utils/local-storage\");\nvar _localStorageDefault = parcelHelpers.interopDefault(_localStorage);\nvar _formatters = require(\"./utils/formatters\");\nvar _color = require(\"./utils/color\");\nvar _autobind = require(\"./utils/autobind\");\nvar _assert = require(\"./utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _hiResTimestamp = require(\"./utils/hi-res-timestamp\");\nconst originalConsole = {\n    debug: (0, _env.isBrowser) ? console.debug || console.log : console.log,\n    log: console.log,\n    info: console.info,\n    warn: console.warn,\n    error: console.error\n};\nconst DEFAULT_SETTINGS = {\n    enabled: true,\n    level: 0\n};\nfunction noop() {}\nconst cache = {};\nconst ONCE = {\n    once: true\n};\nclass Log {\n    constructor(){\n        let { id  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n            id: \"\"\n        };\n        (0, _definePropertyDefault.default)(this, \"id\", void 0);\n        (0, _definePropertyDefault.default)(this, \"VERSION\", (0, _env.VERSION));\n        (0, _definePropertyDefault.default)(this, \"_startTs\", (0, _hiResTimestamp.getHiResTimestamp)());\n        (0, _definePropertyDefault.default)(this, \"_deltaTs\", (0, _hiResTimestamp.getHiResTimestamp)());\n        (0, _definePropertyDefault.default)(this, \"_storage\", void 0);\n        (0, _definePropertyDefault.default)(this, \"userData\", {});\n        (0, _definePropertyDefault.default)(this, \"LOG_THROTTLE_TIMEOUT\", 0);\n        this.id = id;\n        this._storage = new (0, _localStorageDefault.default)(\"__probe-\".concat(this.id, \"__\"), DEFAULT_SETTINGS);\n        this.userData = {};\n        this.timeStamp(\"\".concat(this.id, \" started\"));\n        (0, _autobind.autobind)(this);\n        Object.seal(this);\n    }\n    set level(newLevel) {\n        this.setLevel(newLevel);\n    }\n    get level() {\n        return this.getLevel();\n    }\n    isEnabled() {\n        return this._storage.config.enabled;\n    }\n    getLevel() {\n        return this._storage.config.level;\n    }\n    getTotal() {\n        return Number(((0, _hiResTimestamp.getHiResTimestamp)() - this._startTs).toPrecision(10));\n    }\n    getDelta() {\n        return Number(((0, _hiResTimestamp.getHiResTimestamp)() - this._deltaTs).toPrecision(10));\n    }\n    set priority(newPriority) {\n        this.level = newPriority;\n    }\n    get priority() {\n        return this.level;\n    }\n    getPriority() {\n        return this.level;\n    }\n    enable() {\n        let enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n        this._storage.updateConfiguration({\n            enabled\n        });\n        return this;\n    }\n    setLevel(level) {\n        this._storage.updateConfiguration({\n            level\n        });\n        return this;\n    }\n    get(setting) {\n        return this._storage.config[setting];\n    }\n    set(setting, value) {\n        this._storage.updateConfiguration({\n            [setting]: value\n        });\n    }\n    settings() {\n        if (console.table) console.table(this._storage.config);\n        else console.log(this._storage.config);\n    }\n    assert(condition, message) {\n        (0, _assertDefault.default)(condition, message);\n    }\n    warn(message) {\n        return this._getLogFunction(0, message, originalConsole.warn, arguments, ONCE);\n    }\n    error(message) {\n        return this._getLogFunction(0, message, originalConsole.error, arguments);\n    }\n    deprecated(oldUsage, newUsage) {\n        return this.warn(\"`\".concat(oldUsage, \"` is deprecated and will be removed in a later version. Use `\").concat(newUsage, \"` instead\"));\n    }\n    removed(oldUsage, newUsage) {\n        return this.error(\"`\".concat(oldUsage, \"` has been removed. Use `\").concat(newUsage, \"` instead\"));\n    }\n    probe(logLevel, message) {\n        return this._getLogFunction(logLevel, message, originalConsole.log, arguments, {\n            time: true,\n            once: true\n        });\n    }\n    log(logLevel, message) {\n        return this._getLogFunction(logLevel, message, originalConsole.debug, arguments);\n    }\n    info(logLevel, message) {\n        return this._getLogFunction(logLevel, message, console.info, arguments);\n    }\n    once(logLevel, message) {\n        for(var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++)args[_key - 2] = arguments[_key];\n        return this._getLogFunction(logLevel, message, originalConsole.debug || originalConsole.info, arguments, ONCE);\n    }\n    table(logLevel, table, columns) {\n        if (table) return this._getLogFunction(logLevel, table, console.table || noop, columns && [\n            columns\n        ], {\n            tag: getTableHeader(table)\n        });\n        return noop;\n    }\n    image(_ref) {\n        let { logLevel , priority , image , message =\"\" , scale =1  } = _ref;\n        if (!this._shouldLog(logLevel || priority)) return noop;\n        return (0, _env.isBrowser) ? logImageInBrowser({\n            image,\n            message,\n            scale\n        }) : logImageInNode({\n            image,\n            message,\n            scale\n        });\n    }\n    time(logLevel, message) {\n        return this._getLogFunction(logLevel, message, console.time ? console.time : console.info);\n    }\n    timeEnd(logLevel, message) {\n        return this._getLogFunction(logLevel, message, console.timeEnd ? console.timeEnd : console.info);\n    }\n    timeStamp(logLevel, message) {\n        return this._getLogFunction(logLevel, message, console.timeStamp || noop);\n    }\n    group(logLevel, message) {\n        let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n            collapsed: false\n        };\n        const options = normalizeArguments({\n            logLevel,\n            message,\n            opts\n        });\n        const { collapsed  } = opts;\n        options.method = (collapsed ? console.groupCollapsed : console.group) || console.info;\n        return this._getLogFunction(options);\n    }\n    groupCollapsed(logLevel, message) {\n        let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n        return this.group(logLevel, message, Object.assign({}, opts, {\n            collapsed: true\n        }));\n    }\n    groupEnd(logLevel) {\n        return this._getLogFunction(logLevel, \"\", console.groupEnd || noop);\n    }\n    withGroup(logLevel, message, func) {\n        this.group(logLevel, message)();\n        try {\n            func();\n        } finally{\n            this.groupEnd(logLevel)();\n        }\n    }\n    trace() {\n        if (console.trace) console.trace();\n    }\n    _shouldLog(logLevel) {\n        return this.isEnabled() && this.getLevel() >= normalizeLogLevel(logLevel);\n    }\n    _getLogFunction(logLevel, message, method, args, opts) {\n        if (this._shouldLog(logLevel)) {\n            opts = normalizeArguments({\n                logLevel,\n                message,\n                args,\n                opts\n            });\n            method = method || opts.method;\n            (0, _assertDefault.default)(method);\n            opts.total = this.getTotal();\n            opts.delta = this.getDelta();\n            this._deltaTs = (0, _hiResTimestamp.getHiResTimestamp)();\n            const tag = opts.tag || opts.message;\n            if (opts.once) {\n                if (!cache[tag]) cache[tag] = (0, _hiResTimestamp.getHiResTimestamp)();\n                else return noop;\n            }\n            message = decorateMessage(this.id, opts.message, opts);\n            return method.bind(console, message, ...opts.args);\n        }\n        return noop;\n    }\n}\nexports.default = Log;\n(0, _definePropertyDefault.default)(Log, \"VERSION\", (0, _env.VERSION));\nfunction normalizeLogLevel(logLevel) {\n    if (!logLevel) return 0;\n    let resolvedLevel;\n    switch(typeof logLevel){\n        case \"number\":\n            resolvedLevel = logLevel;\n            break;\n        case \"object\":\n            resolvedLevel = logLevel.logLevel || logLevel.priority || 0;\n            break;\n        default:\n            return 0;\n    }\n    (0, _assertDefault.default)(Number.isFinite(resolvedLevel) && resolvedLevel >= 0);\n    return resolvedLevel;\n}\nfunction normalizeArguments(opts) {\n    const { logLevel , message  } = opts;\n    opts.logLevel = normalizeLogLevel(logLevel);\n    const args = opts.args ? Array.from(opts.args) : [];\n    while(args.length && args.shift() !== message);\n    switch(typeof logLevel){\n        case \"string\":\n        case \"function\":\n            if (message !== undefined) args.unshift(message);\n            opts.message = logLevel;\n            break;\n        case \"object\":\n            Object.assign(opts, logLevel);\n            break;\n        default:\n    }\n    if (typeof opts.message === \"function\") opts.message = opts.message();\n    const messageType = typeof opts.message;\n    (0, _assertDefault.default)(messageType === \"string\" || messageType === \"object\");\n    return Object.assign(opts, {\n        args\n    }, opts.opts);\n}\nfunction decorateMessage(id, message, opts) {\n    if (typeof message === \"string\") {\n        const time = opts.time ? (0, _formatters.leftPad)((0, _formatters.formatTime)(opts.total)) : \"\";\n        message = opts.time ? \"\".concat(id, \": \").concat(time, \"  \").concat(message) : \"\".concat(id, \": \").concat(message);\n        message = (0, _color.addColor)(message, opts.color, opts.background);\n    }\n    return message;\n}\nfunction logImageInNode(_ref2) {\n    let { image , message =\"\" , scale =1  } = _ref2;\n    let asciify = null;\n    try {\n        asciify = module.require(\"asciify-image\");\n    } catch (error) {}\n    if (asciify) return ()=>asciify(image, {\n            fit: \"box\",\n            width: \"\".concat(Math.round(80 * scale), \"%\")\n        }).then((data)=>console.log(data));\n    return noop;\n}\nfunction logImageInBrowser(_ref3) {\n    let { image , message =\"\" , scale =1  } = _ref3;\n    if (typeof image === \"string\") {\n        const img = new Image();\n        img.onload = ()=>{\n            const args = (0, _formatters.formatImage)(img, message, scale);\n            console.log(...args);\n        };\n        img.src = image;\n        return noop;\n    }\n    const element = image.nodeName || \"\";\n    if (element.toLowerCase() === \"img\") {\n        console.log(...(0, _formatters.formatImage)(image, message, scale));\n        return noop;\n    }\n    if (element.toLowerCase() === \"canvas\") {\n        const img = new Image();\n        img.onload = ()=>console.log(...(0, _formatters.formatImage)(img, message, scale));\n        img.src = image.toDataURL();\n        return noop;\n    }\n    return noop;\n}\nfunction getTableHeader(table) {\n    for(const key in table){\n        for(const title in table[key])return title || \"untitled\";\n    }\n    return \"empty\";\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@probe.gl/env\":\"W5Epy\",\"./utils/local-storage\":\"fTcMu\",\"./utils/formatters\":\"dNnGa\",\"./utils/color\":\"7l4ir\",\"./utils/autobind\":\"iy5Y6\",\"./utils/assert\":\"hyDXV\",\"./utils/hi-res-timestamp\":\"8YbZJ\",\"asciify-image\":\"gJghy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fTcMu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nfunction getStorage(type) {\n    try {\n        const storage = window[type];\n        const x = \"__storage_test__\";\n        storage.setItem(x, x);\n        storage.removeItem(x);\n        return storage;\n    } catch (e) {\n        return null;\n    }\n}\nclass LocalStorage {\n    constructor(id){\n        let defaultSettings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"sessionStorage\";\n        (0, _definePropertyDefault.default)(this, \"storage\", void 0);\n        (0, _definePropertyDefault.default)(this, \"id\", void 0);\n        (0, _definePropertyDefault.default)(this, \"config\", {});\n        this.storage = getStorage(type);\n        this.id = id;\n        this.config = {};\n        Object.assign(this.config, defaultSettings);\n        this._loadConfiguration();\n    }\n    getConfiguration() {\n        return this.config;\n    }\n    setConfiguration(configuration) {\n        this.config = {};\n        return this.updateConfiguration(configuration);\n    }\n    updateConfiguration(configuration) {\n        Object.assign(this.config, configuration);\n        if (this.storage) {\n            const serialized = JSON.stringify(this.config);\n            this.storage.setItem(this.id, serialized);\n        }\n        return this;\n    }\n    _loadConfiguration() {\n        let configuration = {};\n        if (this.storage) {\n            const serializedConfiguration = this.storage.getItem(this.id);\n            configuration = serializedConfiguration ? JSON.parse(serializedConfiguration) : {};\n        }\n        Object.assign(this.config, configuration);\n        return this;\n    }\n}\nexports.default = LocalStorage;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dNnGa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatTime\", ()=>formatTime);\nparcelHelpers.export(exports, \"leftPad\", ()=>leftPad);\nparcelHelpers.export(exports, \"rightPad\", ()=>rightPad);\nparcelHelpers.export(exports, \"formatValue\", ()=>formatValue);\nparcelHelpers.export(exports, \"formatImage\", ()=>formatImage);\nfunction formatTime(ms) {\n    let formatted;\n    if (ms < 10) formatted = \"\".concat(ms.toFixed(2), \"ms\");\n    else if (ms < 100) formatted = \"\".concat(ms.toFixed(1), \"ms\");\n    else if (ms < 1000) formatted = \"\".concat(ms.toFixed(0), \"ms\");\n    else formatted = \"\".concat((ms / 1000).toFixed(2), \"s\");\n    return formatted;\n}\nfunction leftPad(string) {\n    let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8;\n    const padLength = Math.max(length - string.length, 0);\n    return \"\".concat(\" \".repeat(padLength)).concat(string);\n}\nfunction rightPad(string) {\n    let length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 8;\n    const padLength = Math.max(length - string.length, 0);\n    return \"\".concat(string).concat(\" \".repeat(padLength));\n}\nfunction formatValue(v) {\n    let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    const EPSILON = 1e-16;\n    const { isInteger =false  } = opts;\n    if (Array.isArray(v) || ArrayBuffer.isView(v)) return formatArrayValue(v, opts);\n    if (!Number.isFinite(v)) return String(v);\n    if (Math.abs(v) < EPSILON) return isInteger ? \"0\" : \"0.\";\n    if (isInteger) return v.toFixed(0);\n    if (Math.abs(v) > 100 && Math.abs(v) < 10000) return v.toFixed(0);\n    const string = v.toPrecision(2);\n    const decimal = string.indexOf(\".0\");\n    return decimal === string.length - 2 ? string.slice(0, -1) : string;\n}\nfunction formatArrayValue(v, opts) {\n    const { maxElts =16 , size =1  } = opts;\n    let string = \"[\";\n    for(let i = 0; i < v.length && i < maxElts; ++i){\n        if (i > 0) string += \",\".concat(i % size === 0 ? \" \" : \"\");\n        string += formatValue(v[i], opts);\n    }\n    const terminator = v.length > maxElts ? \"...\" : \"]\";\n    return \"\".concat(string).concat(terminator);\n}\nfunction formatImage(image, message, scale) {\n    let maxWidth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 600;\n    const imageUrl = image.src.replace(/\\(/g, \"%28\").replace(/\\)/g, \"%29\");\n    if (image.width > maxWidth) scale = Math.min(scale, maxWidth / image.width);\n    const width = image.width * scale;\n    const height = image.height * scale;\n    const style = [\n        \"font-size:1px;\",\n        \"padding:\".concat(Math.floor(height / 2), \"px \").concat(Math.floor(width / 2), \"px;\"),\n        \"line-height:\".concat(height, \"px;\"),\n        \"background:url(\".concat(imageUrl, \");\"),\n        \"background-size:\".concat(width, \"px \").concat(height, \"px;\"),\n        \"color:transparent;\"\n    ].join(\"\");\n    return [\n        \"\".concat(message, \" %c+\"),\n        style\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7l4ir\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"COLOR\", ()=>COLOR);\nparcelHelpers.export(exports, \"addColor\", ()=>addColor);\nvar _env = require(\"@probe.gl/env\");\nlet COLOR;\n(function(COLOR1) {\n    COLOR1[COLOR1[\"BLACK\"] = 30] = \"BLACK\";\n    COLOR1[COLOR1[\"RED\"] = 31] = \"RED\";\n    COLOR1[COLOR1[\"GREEN\"] = 32] = \"GREEN\";\n    COLOR1[COLOR1[\"YELLOW\"] = 33] = \"YELLOW\";\n    COLOR1[COLOR1[\"BLUE\"] = 34] = \"BLUE\";\n    COLOR1[COLOR1[\"MAGENTA\"] = 35] = \"MAGENTA\";\n    COLOR1[COLOR1[\"CYAN\"] = 36] = \"CYAN\";\n    COLOR1[COLOR1[\"WHITE\"] = 37] = \"WHITE\";\n    COLOR1[COLOR1[\"BRIGHT_BLACK\"] = 90] = \"BRIGHT_BLACK\";\n    COLOR1[COLOR1[\"BRIGHT_RED\"] = 91] = \"BRIGHT_RED\";\n    COLOR1[COLOR1[\"BRIGHT_GREEN\"] = 92] = \"BRIGHT_GREEN\";\n    COLOR1[COLOR1[\"BRIGHT_YELLOW\"] = 93] = \"BRIGHT_YELLOW\";\n    COLOR1[COLOR1[\"BRIGHT_BLUE\"] = 94] = \"BRIGHT_BLUE\";\n    COLOR1[COLOR1[\"BRIGHT_MAGENTA\"] = 95] = \"BRIGHT_MAGENTA\";\n    COLOR1[COLOR1[\"BRIGHT_CYAN\"] = 96] = \"BRIGHT_CYAN\";\n    COLOR1[COLOR1[\"BRIGHT_WHITE\"] = 97] = \"BRIGHT_WHITE\";\n})(COLOR || (COLOR = {}));\nfunction getColor(color) {\n    return typeof color === \"string\" ? COLOR[color.toUpperCase()] || COLOR.WHITE : color;\n}\nfunction addColor(string, color, background) {\n    if (!(0, _env.isBrowser) && typeof string === \"string\") {\n        if (color) {\n            color = getColor(color);\n            string = \"\\x1b[\".concat(color, \"m\").concat(string, \"\\x1b[39m\");\n        }\n        if (background) {\n            color = getColor(background);\n            string = \"\\x1b[\".concat(background + 10, \"m\").concat(string, \"\\x1b[49m\");\n        }\n    }\n    return string;\n}\n\n},{\"@probe.gl/env\":\"W5Epy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iy5Y6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"autobind\", ()=>autobind);\nfunction autobind(obj) {\n    let predefined = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [\n        \"constructor\"\n    ];\n    const proto = Object.getPrototypeOf(obj);\n    const propNames = Object.getOwnPropertyNames(proto);\n    for (const key of propNames){\n        if (typeof obj[key] === \"function\") {\n            if (!predefined.find((name)=>key === name)) obj[key] = obj[key].bind(obj);\n        }\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hyDXV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"Assertion failed\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8YbZJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getHiResTimestamp\", ()=>getHiResTimestamp);\nvar _env = require(\"@probe.gl/env\");\nfunction getHiResTimestamp() {\n    let timestamp;\n    if ((0, _env.isBrowser) && \"performance\" in (0, _env.window)) {\n        var _window$performance, _window$performance$n;\n        timestamp = (0, _env.window) === null || (0, _env.window) === void 0 ? void 0 : (_window$performance = (0, _env.window).performance) === null || _window$performance === void 0 ? void 0 : (_window$performance$n = _window$performance.now) === null || _window$performance$n === void 0 ? void 0 : _window$performance$n.call(_window$performance);\n    } else if (\"hrtime\" in (0, _env.process)) {\n        var _process$hrtime;\n        const timeParts = (0, _env.process) === null || (0, _env.process) === void 0 ? void 0 : (_process$hrtime = (0, _env.process).hrtime) === null || _process$hrtime === void 0 ? void 0 : _process$hrtime.call((0, _env.process));\n        timestamp = timeParts[0] * 1000 + timeParts[1] / 1e6;\n    } else timestamp = Date.now();\n    return timestamp;\n}\n\n},{\"@probe.gl/env\":\"W5Epy\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g3dRc\":[function(require,module,exports) {\nglobalThis.probe = {};\n\n},{}],\"8AxDM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"register\", ()=>register);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _loggers = require(\"./loggers\");\nvar loggers = {};\nfunction register(handlers) {\n    loggers = handlers;\n}\nfunction debug(eventType) {\n    if ((0, _logDefault.default).level > 0 && loggers[eventType]) {\n        var _loggers$eventType;\n        (_loggers$eventType = loggers[eventType]).call.apply(_loggers$eventType, arguments);\n    }\n}\nexports.default = debug;\n\n},{\"../utils/log\":\"fg4UT\",\"./loggers\":\"axHyC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"axHyC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getLoggers\", ()=>getLoggers);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar logState = {\n    attributeUpdateMessages: []\n};\nvar LOG_LEVEL_MAJOR_UPDATE = 1;\nvar LOG_LEVEL_MINOR_UPDATE = 2;\nvar LOG_LEVEL_UPDATE_DETAIL = 3;\nvar LOG_LEVEL_INFO = 4;\nvar LOG_LEVEL_DRAW = 2;\nvar getLoggers = function getLoggers(log) {\n    return {\n        \"layer.changeFlag\": function layerChangeFlag(layer, key, flags) {\n            log.log(LOG_LEVEL_UPDATE_DETAIL, \"\".concat(layer.id, \" \").concat(key, \": \"), flags[key])();\n        },\n        \"layer.initialize\": function layerInitialize(layer) {\n            log.log(LOG_LEVEL_MAJOR_UPDATE, \"Initializing \".concat(layer))();\n        },\n        \"layer.update\": function layerUpdate(layer, needsUpdate) {\n            if (needsUpdate) {\n                var flags = layer.getChangeFlags();\n                log.log(LOG_LEVEL_MINOR_UPDATE, \"Updating \".concat(layer, \" because: \").concat(Object.keys(flags).filter(function(key) {\n                    return flags[key];\n                }).join(\", \")))();\n            } else log.log(LOG_LEVEL_INFO, \"\".concat(layer, \" does not need update\"))();\n        },\n        \"layer.matched\": function layerMatched(layer, changed) {\n            if (changed) log.log(LOG_LEVEL_INFO, \"Matched \".concat(layer, \", state transfered\"))();\n        },\n        \"layer.finalize\": function layerFinalize(layer) {\n            log.log(LOG_LEVEL_MAJOR_UPDATE, \"Finalizing \".concat(layer))();\n        },\n        \"compositeLayer.renderLayers\": function compositeLayerRenderLayers(layer, updated, subLayers) {\n            if (updated) log.log(LOG_LEVEL_MINOR_UPDATE, \"Composite layer rendered new subLayers \".concat(layer), subLayers)();\n            else log.log(LOG_LEVEL_INFO, \"Composite layer reused subLayers \".concat(layer), subLayers)();\n        },\n        \"layerManager.setLayers\": function layerManagerSetLayers(layerManager, updated, layers) {\n            if (updated) log.log(LOG_LEVEL_MINOR_UPDATE, \"Updating \".concat(layers.length, \" deck layers\"))();\n        },\n        \"layerManager.activateViewport\": function layerManagerActivateViewport(layerManager, viewport) {\n            log.log(LOG_LEVEL_UPDATE_DETAIL, \"Viewport changed\", viewport)();\n        },\n        \"attributeManager.invalidate\": function attributeManagerInvalidate(attributeManager, trigger, attributeNames) {\n            log.log(LOG_LEVEL_MAJOR_UPDATE, attributeNames ? \"invalidated attributes \".concat(attributeNames, \" (\").concat(trigger, \") for \").concat(attributeManager.id) : \"invalidated all attributes for \".concat(attributeManager.id))();\n        },\n        \"attributeManager.updateStart\": function attributeManagerUpdateStart(attributeManager) {\n            logState.attributeUpdateMessages.length = 0;\n            logState.attributeManagerUpdateStart = Date.now();\n        },\n        \"attributeManager.updateEnd\": function attributeManagerUpdateEnd(attributeManager, numInstances) {\n            var timeMs = Math.round(Date.now() - logState.attributeManagerUpdateStart);\n            log.groupCollapsed(LOG_LEVEL_MINOR_UPDATE, \"Updated attributes for \".concat(numInstances, \" instances in \").concat(attributeManager.id, \" in \").concat(timeMs, \"ms\"))();\n            var _iterator = _createForOfIteratorHelper(logState.attributeUpdateMessages), _step;\n            try {\n                for(_iterator.s(); !(_step = _iterator.n()).done;){\n                    var updateMessage = _step.value;\n                    log.log(LOG_LEVEL_UPDATE_DETAIL, updateMessage)();\n                }\n            } catch (err) {\n                _iterator.e(err);\n            } finally{\n                _iterator.f();\n            }\n            log.groupEnd(LOG_LEVEL_MINOR_UPDATE)();\n        },\n        \"attribute.updateStart\": function attributeUpdateStart(attribute) {\n            logState.attributeUpdateStart = Date.now();\n        },\n        \"attribute.allocate\": function attributeAllocate(attribute, numInstances) {\n            var message = \"\".concat(attribute.id, \" allocated \").concat(numInstances);\n            logState.attributeUpdateMessages.push(message);\n        },\n        \"attribute.updateEnd\": function attributeUpdateEnd(attribute, numInstances) {\n            var timeMs = Math.round(Date.now() - logState.attributeUpdateStart);\n            var message = \"\".concat(attribute.id, \" updated \").concat(numInstances, \" in \").concat(timeMs, \"ms\");\n            logState.attributeUpdateMessages.push(message);\n        },\n        \"deckRenderer.renderLayers\": function deckRendererRenderLayers(deckRenderer, renderStats, opts) {\n            var pass = opts.pass, redrawReason = opts.redrawReason, stats = opts.stats;\n            var _iterator2 = _createForOfIteratorHelper(renderStats), _step2;\n            try {\n                for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                    var status = _step2.value;\n                    var totalCount = status.totalCount, visibleCount = status.visibleCount, compositeCount = status.compositeCount, pickableCount = status.pickableCount;\n                    var primitiveCount = totalCount - compositeCount;\n                    var hiddenCount = primitiveCount - visibleCount;\n                    log.log(LOG_LEVEL_DRAW, \"RENDER #\".concat(deckRenderer.renderCount, \"   \").concat(visibleCount, \" (of \").concat(totalCount, \" layers) to \").concat(pass, \" because \").concat(redrawReason, \"   (\").concat(hiddenCount, \" hidden, \").concat(compositeCount, \" composite \").concat(pickableCount, \" pickable)\"))();\n                    if (stats) stats.get(\"Redraw Layers\").add(visibleCount);\n                }\n            } catch (err) {\n                _iterator2.e(err);\n            } finally{\n                _iterator2.f();\n            }\n        }\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1UeYQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction isJSON(text) {\n    var firstChar = text[0];\n    var lastChar = text[text.length - 1];\n    return firstChar === \"{\" && lastChar === \"}\" || firstChar === \"[\" && lastChar === \"]\";\n}\nexports.default = {\n    name: \"JSON\",\n    extensions: [\n        \"json\",\n        \"geojson\"\n    ],\n    mimeTypes: [\n        \"application/json\",\n        \"application/geo+json\"\n    ],\n    testText: isJSON,\n    parseTextSync: JSON.parse\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1gK4T\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createProgramManager\", ()=>createProgramManager);\nparcelHelpers.export(exports, \"picking\", ()=>(0, _pickingDefault.default));\nparcelHelpers.export(exports, \"project\", ()=>(0, _projectDefault.default));\nparcelHelpers.export(exports, \"project32\", ()=>(0, _project32Default.default));\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>(0, _core.gouraudLighting));\nparcelHelpers.export(exports, \"phongLighting\", ()=>(0, _core.phongLighting));\nparcelHelpers.export(exports, \"shadow\", ()=>(0, _shadowDefault.default));\nvar _core = require(\"@luma.gl/core\");\nvar _geometry = require(\"./misc/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _project = require(\"./project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar _project32 = require(\"./project32/project32\");\nvar _project32Default = parcelHelpers.interopDefault(_project32);\nvar _shadow = require(\"./shadow/shadow\");\nvar _shadowDefault = parcelHelpers.interopDefault(_shadow);\nvar _picking = require(\"./picking/picking\");\nvar _pickingDefault = parcelHelpers.interopDefault(_picking);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar DEFAULT_MODULES = [\n    (0, _geometryDefault.default),\n    (0, _projectDefault.default)\n];\nvar SHADER_HOOKS = [\n    \"vs:DECKGL_FILTER_SIZE(inout vec3 size, VertexGeometry geometry)\",\n    \"vs:DECKGL_FILTER_GL_POSITION(inout vec4 position, VertexGeometry geometry)\",\n    \"vs:DECKGL_FILTER_COLOR(inout vec4 color, VertexGeometry geometry)\",\n    \"fs:DECKGL_FILTER_COLOR(inout vec4 color, FragmentGeometry geometry)\"\n];\nfunction createProgramManager(gl) {\n    var programManager = (0, _core.ProgramManager).getDefaultProgramManager(gl);\n    var _iterator = _createForOfIteratorHelper(DEFAULT_MODULES), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var shaderModule = _step.value;\n            programManager.addDefaultModule(shaderModule);\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    var _iterator2 = _createForOfIteratorHelper(SHADER_HOOKS), _step2;\n    try {\n        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n            var shaderHook = _step2.value;\n            programManager.addShaderHook(shaderHook);\n        }\n    } catch (err1) {\n        _iterator2.e(err1);\n    } finally{\n        _iterator2.f();\n    }\n    return programManager;\n}\n\n},{\"@luma.gl/core\":\"bW3Qv\",\"./misc/geometry\":\"hFGto\",\"./project/project\":\"8zLfE\",\"./project32/project32\":\"hPHOW\",\"./shadow/shadow\":\"dXWGr\",\"./picking/picking\":\"ceFyb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bW3Qv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createGLContext\", ()=>(0, _gltools.createGLContext));\nparcelHelpers.export(exports, \"instrumentGLContext\", ()=>(0, _gltools.instrumentGLContext));\nparcelHelpers.export(exports, \"isWebGL\", ()=>(0, _gltools.isWebGL));\nparcelHelpers.export(exports, \"isWebGL2\", ()=>(0, _gltools.isWebGL2));\nparcelHelpers.export(exports, \"getParameters\", ()=>(0, _gltools.getParameters));\nparcelHelpers.export(exports, \"setParameters\", ()=>(0, _gltools.setParameters));\nparcelHelpers.export(exports, \"withParameters\", ()=>(0, _gltools.withParameters));\nparcelHelpers.export(exports, \"resetParameters\", ()=>(0, _gltools.resetParameters));\nparcelHelpers.export(exports, \"cssToDeviceRatio\", ()=>(0, _gltools.cssToDeviceRatio));\nparcelHelpers.export(exports, \"cssToDevicePixels\", ()=>(0, _gltools.cssToDevicePixels));\nparcelHelpers.export(exports, \"lumaStats\", ()=>(0, _webgl.lumaStats));\nparcelHelpers.export(exports, \"FEATURES\", ()=>(0, _webgl.FEATURES));\nparcelHelpers.export(exports, \"hasFeature\", ()=>(0, _webgl.hasFeature));\nparcelHelpers.export(exports, \"hasFeatures\", ()=>(0, _webgl.hasFeatures));\nparcelHelpers.export(exports, \"Buffer\", ()=>(0, _webgl.Buffer));\nparcelHelpers.export(exports, \"Program\", ()=>(0, _webgl.Program));\nparcelHelpers.export(exports, \"Framebuffer\", ()=>(0, _webgl.Framebuffer));\nparcelHelpers.export(exports, \"Renderbuffer\", ()=>(0, _webgl.Renderbuffer));\nparcelHelpers.export(exports, \"Texture2D\", ()=>(0, _webgl.Texture2D));\nparcelHelpers.export(exports, \"TextureCube\", ()=>(0, _webgl.TextureCube));\nparcelHelpers.export(exports, \"clear\", ()=>(0, _webgl.clear));\nparcelHelpers.export(exports, \"readPixelsToArray\", ()=>(0, _webgl.readPixelsToArray));\nparcelHelpers.export(exports, \"readPixelsToBuffer\", ()=>(0, _webgl.readPixelsToBuffer));\nparcelHelpers.export(exports, \"cloneTextureFrom\", ()=>(0, _webgl.cloneTextureFrom));\nparcelHelpers.export(exports, \"copyToTexture\", ()=>(0, _webgl.copyToTexture));\nparcelHelpers.export(exports, \"Texture3D\", ()=>(0, _webgl.Texture3D));\nparcelHelpers.export(exports, \"TransformFeedback\", ()=>(0, _webgl.TransformFeedback));\nparcelHelpers.export(exports, \"AnimationLoop\", ()=>(0, _engine.AnimationLoop));\nparcelHelpers.export(exports, \"Model\", ()=>(0, _engine.Model));\nparcelHelpers.export(exports, \"Transform\", ()=>(0, _engine.Transform));\nparcelHelpers.export(exports, \"ProgramManager\", ()=>(0, _engine.ProgramManager));\nparcelHelpers.export(exports, \"Timeline\", ()=>(0, _engine.Timeline));\nparcelHelpers.export(exports, \"Geometry\", ()=>(0, _engine.Geometry));\nparcelHelpers.export(exports, \"ClipSpace\", ()=>(0, _engine.ClipSpace));\nparcelHelpers.export(exports, \"ConeGeometry\", ()=>(0, _engine.ConeGeometry));\nparcelHelpers.export(exports, \"CubeGeometry\", ()=>(0, _engine.CubeGeometry));\nparcelHelpers.export(exports, \"CylinderGeometry\", ()=>(0, _engine.CylinderGeometry));\nparcelHelpers.export(exports, \"IcoSphereGeometry\", ()=>(0, _engine.IcoSphereGeometry));\nparcelHelpers.export(exports, \"PlaneGeometry\", ()=>(0, _engine.PlaneGeometry));\nparcelHelpers.export(exports, \"SphereGeometry\", ()=>(0, _engine.SphereGeometry));\nparcelHelpers.export(exports, \"TruncatedConeGeometry\", ()=>(0, _engine.TruncatedConeGeometry));\nparcelHelpers.export(exports, \"normalizeShaderModule\", ()=>(0, _shadertools.normalizeShaderModule));\nparcelHelpers.export(exports, \"fp32\", ()=>(0, _shadertools.fp32));\nparcelHelpers.export(exports, \"fp64\", ()=>(0, _shadertools.fp64));\nparcelHelpers.export(exports, \"project\", ()=>(0, _shadertools.project));\nparcelHelpers.export(exports, \"dirlight\", ()=>(0, _shadertools.dirlight));\nparcelHelpers.export(exports, \"picking\", ()=>(0, _shadertools.picking));\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>(0, _shadertools.gouraudLighting));\nparcelHelpers.export(exports, \"phongLighting\", ()=>(0, _shadertools.phongLighting));\nparcelHelpers.export(exports, \"pbr\", ()=>(0, _shadertools.pbr));\nparcelHelpers.export(exports, \"log\", ()=>(0, _webgl.log));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _webgl.assert));\nparcelHelpers.export(exports, \"uid\", ()=>(0, _webgl.uid));\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _engine = require(\"@luma.gl/engine\");\nvar _shadertools = require(\"@luma.gl/shadertools\");\n\n},{\"@luma.gl/gltools\":\"grcb8\",\"@luma.gl/webgl\":\"7gBVn\",\"@luma.gl/engine\":\"bhQM0\",\"@luma.gl/shadertools\":\"5aMWt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"grcb8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"polyfillContext\", ()=>(0, _polyfillContextDefault.default));\nparcelHelpers.export(exports, \"getParameters\", ()=>(0, _unifiedParameterApi.getParameters));\nparcelHelpers.export(exports, \"setParameters\", ()=>(0, _unifiedParameterApi.setParameters));\nparcelHelpers.export(exports, \"resetParameters\", ()=>(0, _unifiedParameterApi.resetParameters));\nparcelHelpers.export(exports, \"withParameters\", ()=>(0, _unifiedParameterApi.withParameters));\nparcelHelpers.export(exports, \"trackContextState\", ()=>(0, _trackContextStateDefault.default));\nparcelHelpers.export(exports, \"pushContextState\", ()=>(0, _trackContextState.pushContextState));\nparcelHelpers.export(exports, \"popContextState\", ()=>(0, _trackContextState.popContextState));\nparcelHelpers.export(exports, \"createGLContext\", ()=>(0, _context.createGLContext));\nparcelHelpers.export(exports, \"resizeGLContext\", ()=>(0, _context.resizeGLContext));\nparcelHelpers.export(exports, \"instrumentGLContext\", ()=>(0, _context.instrumentGLContext));\nparcelHelpers.export(exports, \"getContextDebugInfo\", ()=>(0, _context.getContextDebugInfo));\nparcelHelpers.export(exports, \"log\", ()=>(0, _utils.log));\nparcelHelpers.export(exports, \"cssToDeviceRatio\", ()=>(0, _utils.cssToDeviceRatio));\nparcelHelpers.export(exports, \"cssToDevicePixels\", ()=>(0, _utils.cssToDevicePixels));\nparcelHelpers.export(exports, \"isWebGL\", ()=>(0, _utils.isWebGL));\nparcelHelpers.export(exports, \"isWebGL2\", ()=>(0, _utils.isWebGL2));\nvar _polyfillContext = require(\"./polyfill/polyfill-context\");\nvar _polyfillContextDefault = parcelHelpers.interopDefault(_polyfillContext);\nvar _unifiedParameterApi = require(\"./state-tracker/unified-parameter-api\");\nvar _trackContextState = require(\"./state-tracker/track-context-state\");\nvar _trackContextStateDefault = parcelHelpers.interopDefault(_trackContextState);\nvar _context = require(\"./context/context\");\nvar _utils = require(\"./utils\");\n\n},{\"./polyfill/polyfill-context\":\"5mVai\",\"./state-tracker/unified-parameter-api\":\"ibNMv\",\"./state-tracker/track-context-state\":\"7nRj1\",\"./context/context\":\"hO8vL\",\"./utils\":\"lOb37\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5mVai\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _polyfillVertexArrayObject = require(\"./polyfill-vertex-array-object\");\nvar _utils = require(\"../utils\");\nvar _polyfillTable = require(\"./polyfill-table\");\nvar global = arguments[3];\nfunction polyfillContext(gl) {\n    gl.luma = gl.luma || {};\n    if (!gl.luma.polyfilled) {\n        (0, _polyfillVertexArrayObject.polyfillVertexArrayObject)(gl);\n        initializeExtensions(gl);\n        installPolyfills(gl, (0, _polyfillTable.WEBGL2_CONTEXT_POLYFILLS));\n        installOverrides(gl, {\n            target: gl.luma,\n            target2: gl\n        });\n        gl.luma.polyfilled = true;\n    }\n    return gl;\n}\nexports.default = polyfillContext;\nvar global_ = typeof global !== \"undefined\" ? global : window;\nglobal_.polyfillContext = polyfillContext;\nfunction initializeExtensions(gl) {\n    gl.luma.extensions = {};\n    var EXTENSIONS = gl.getSupportedExtensions() || [];\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = EXTENSIONS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var extension = _step.value;\n            gl.luma[extension] = gl.getExtension(extension);\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n}\nfunction installOverrides(gl, _ref) {\n    var target = _ref.target, target2 = _ref.target2;\n    Object.keys((0, _polyfillTable.WEBGL2_CONTEXT_OVERRIDES)).forEach(function(key) {\n        if (typeof (0, _polyfillTable.WEBGL2_CONTEXT_OVERRIDES)[key] === \"function\") {\n            var originalFunc = gl[key] ? gl[key].bind(gl) : function() {};\n            var polyfill = (0, _polyfillTable.WEBGL2_CONTEXT_OVERRIDES)[key].bind(null, gl, originalFunc);\n            target[key] = polyfill;\n            target2[key] = polyfill;\n        }\n    });\n}\nfunction installPolyfills(gl, polyfills) {\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n    try {\n        for(var _iterator2 = Object.getOwnPropertyNames(polyfills)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n            var extension = _step2.value;\n            if (extension !== \"overrides\") polyfillExtension(gl, {\n                extension: extension,\n                target: gl.luma,\n                target2: gl\n            });\n        }\n    } catch (err) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n        } finally{\n            if (_didIteratorError2) throw _iteratorError2;\n        }\n    }\n}\nfunction polyfillExtension(gl, _ref2) {\n    var extension = _ref2.extension, target = _ref2.target, target2 = _ref2.target2;\n    var defaults = (0, _polyfillTable.WEBGL2_CONTEXT_POLYFILLS)[extension];\n    (0, _utils.assert)(defaults);\n    var _defaults$meta = defaults.meta, meta = _defaults$meta === void 0 ? {} : _defaults$meta;\n    var _meta$suffix = meta.suffix, suffix = _meta$suffix === void 0 ? \"\" : _meta$suffix;\n    var ext = gl.getExtension(extension);\n    var _loop = function _loop() {\n        var key = _Object$keys[_i];\n        var extKey = \"\".concat(key).concat(suffix);\n        var polyfill = null;\n        if (key === \"meta\") ;\n        else if (typeof gl[key] === \"function\") ;\n        else if (ext && typeof ext[extKey] === \"function\") polyfill = function polyfill() {\n            return ext[extKey].apply(ext, arguments);\n        };\n        else if (typeof defaults[key] === \"function\") polyfill = defaults[key].bind(target);\n        if (polyfill) {\n            target[key] = polyfill;\n            target2[key] = polyfill;\n        }\n    };\n    for(var _i = 0, _Object$keys = Object.keys(defaults); _i < _Object$keys.length; _i++)_loop();\n}\n\n},{\"./polyfill-vertex-array-object\":\"7oo4R\",\"../utils\":\"lOb37\",\"./polyfill-table\":\"7gl3t\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7oo4R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"polyfillVertexArrayObject\", ()=>polyfillVertexArrayObject);\nvar _env = require(\"probe.gl/env\");\nvar glErrorShadow = {};\nfunction error(msg) {\n    if ((0, _env.global).console && (0, _env.global).console.error) (0, _env.global).console.error(msg);\n}\nfunction log(msg) {\n    if ((0, _env.global).console && (0, _env.global).console.log) (0, _env.global).console.log(msg);\n}\nfunction synthesizeGLError(err, opt_msg) {\n    glErrorShadow[err] = true;\n    if (opt_msg !== undefined) error(opt_msg);\n}\nfunction wrapGLError(gl) {\n    var f = gl.getError;\n    gl.getError = function getError() {\n        var err;\n        do {\n            err = f.apply(gl);\n            if (err !== 0) glErrorShadow[err] = true;\n        }while (err !== 0);\n        for(err in glErrorShadow)if (glErrorShadow[err]) {\n            delete glErrorShadow[err];\n            return parseInt(err, 10);\n        }\n        return 0;\n    };\n}\nvar WebGLVertexArrayObjectOES = function WebGLVertexArrayObjectOES1(ext) {\n    var gl = ext.gl;\n    this.ext = ext;\n    this.isAlive = true;\n    this.hasBeenBound = false;\n    this.elementArrayBuffer = null;\n    this.attribs = new Array(ext.maxVertexAttribs);\n    for(var n = 0; n < this.attribs.length; n++){\n        var attrib = new WebGLVertexArrayObjectOES1.VertexAttrib(gl);\n        this.attribs[n] = attrib;\n    }\n    this.maxAttrib = 0;\n};\nWebGLVertexArrayObjectOES.VertexAttrib = function VertexAttrib(gl) {\n    this.enabled = false;\n    this.buffer = null;\n    this.size = 4;\n    this.type = 5126;\n    this.normalized = false;\n    this.stride = 16;\n    this.offset = 0;\n    this.cached = \"\";\n    this.recache();\n};\nWebGLVertexArrayObjectOES.VertexAttrib.prototype.recache = function recache() {\n    this.cached = [\n        this.size,\n        this.type,\n        this.normalized,\n        this.stride,\n        this.offset\n    ].join(\":\");\n};\nvar OESVertexArrayObject = function OESVertexArrayObject(gl) {\n    var self = this;\n    this.gl = gl;\n    wrapGLError(gl);\n    var original = this.original = {\n        getParameter: gl.getParameter,\n        enableVertexAttribArray: gl.enableVertexAttribArray,\n        disableVertexAttribArray: gl.disableVertexAttribArray,\n        bindBuffer: gl.bindBuffer,\n        getVertexAttrib: gl.getVertexAttrib,\n        vertexAttribPointer: gl.vertexAttribPointer\n    };\n    gl.getParameter = function getParameter(pname) {\n        if (pname === self.VERTEX_ARRAY_BINDING_OES) {\n            if (self.currentVertexArrayObject === self.defaultVertexArrayObject) return null;\n            return self.currentVertexArrayObject;\n        }\n        return original.getParameter.apply(this, arguments);\n    };\n    gl.enableVertexAttribArray = function enableVertexAttribArray(index) {\n        var vao = self.currentVertexArrayObject;\n        vao.maxAttrib = Math.max(vao.maxAttrib, index);\n        var attrib = vao.attribs[index];\n        attrib.enabled = true;\n        return original.enableVertexAttribArray.apply(this, arguments);\n    };\n    gl.disableVertexAttribArray = function disableVertexAttribArray(index) {\n        var vao = self.currentVertexArrayObject;\n        vao.maxAttrib = Math.max(vao.maxAttrib, index);\n        var attrib = vao.attribs[index];\n        attrib.enabled = false;\n        return original.disableVertexAttribArray.apply(this, arguments);\n    };\n    gl.bindBuffer = function bindBuffer(target, buffer) {\n        switch(target){\n            case 34962:\n                self.currentArrayBuffer = buffer;\n                break;\n            case 34963:\n                self.currentVertexArrayObject.elementArrayBuffer = buffer;\n                break;\n            default:\n        }\n        return original.bindBuffer.apply(this, arguments);\n    };\n    gl.getVertexAttrib = function getVertexAttrib(index, pname) {\n        var vao = self.currentVertexArrayObject;\n        var attrib = vao.attribs[index];\n        switch(pname){\n            case 34975:\n                return attrib.buffer;\n            case 34338:\n                return attrib.enabled;\n            case 34339:\n                return attrib.size;\n            case 34340:\n                return attrib.stride;\n            case 34341:\n                return attrib.type;\n            case 34922:\n                return attrib.normalized;\n            default:\n                return original.getVertexAttrib.apply(this, arguments);\n        }\n    };\n    gl.vertexAttribPointer = function vertexAttribPointer(indx, size, type, normalized, stride, offset) {\n        var vao = self.currentVertexArrayObject;\n        vao.maxAttrib = Math.max(vao.maxAttrib, indx);\n        var attrib = vao.attribs[indx];\n        attrib.buffer = self.currentArrayBuffer;\n        attrib.size = size;\n        attrib.type = type;\n        attrib.normalized = normalized;\n        attrib.stride = stride;\n        attrib.offset = offset;\n        attrib.recache();\n        return original.vertexAttribPointer.apply(this, arguments);\n    };\n    if (gl.instrumentExtension) gl.instrumentExtension(this, \"OES_vertex_array_object\");\n    if (gl.canvas) gl.canvas.addEventListener(\"webglcontextrestored\", function() {\n        log(\"OESVertexArrayObject emulation library context restored\");\n        self.reset_();\n    }, true);\n    this.reset_();\n};\nOESVertexArrayObject.prototype.VERTEX_ARRAY_BINDING_OES = 0x85b5;\nOESVertexArrayObject.prototype.reset_ = function reset_() {\n    var contextWasLost = this.vertexArrayObjects !== undefined;\n    if (contextWasLost) for(var ii = 0; ii < this.vertexArrayObjects.length; ++ii)this.vertexArrayObjects.isAlive = false;\n    var gl = this.gl;\n    this.maxVertexAttribs = gl.getParameter(34921);\n    this.defaultVertexArrayObject = new WebGLVertexArrayObjectOES(this);\n    this.currentVertexArrayObject = null;\n    this.currentArrayBuffer = null;\n    this.vertexArrayObjects = [\n        this.defaultVertexArrayObject\n    ];\n    this.bindVertexArrayOES(null);\n};\nOESVertexArrayObject.prototype.createVertexArrayOES = function createVertexArrayOES() {\n    var arrayObject = new WebGLVertexArrayObjectOES(this);\n    this.vertexArrayObjects.push(arrayObject);\n    return arrayObject;\n};\nOESVertexArrayObject.prototype.deleteVertexArrayOES = function deleteVertexArrayOES(arrayObject) {\n    arrayObject.isAlive = false;\n    this.vertexArrayObjects.splice(this.vertexArrayObjects.indexOf(arrayObject), 1);\n    if (this.currentVertexArrayObject === arrayObject) this.bindVertexArrayOES(null);\n};\nOESVertexArrayObject.prototype.isVertexArrayOES = function isVertexArrayOES(arrayObject) {\n    if (arrayObject && arrayObject instanceof WebGLVertexArrayObjectOES) {\n        if (arrayObject.hasBeenBound && arrayObject.ext === this) return true;\n    }\n    return false;\n};\nOESVertexArrayObject.prototype.bindVertexArrayOES = function bindVertexArrayOES(arrayObject) {\n    var gl = this.gl;\n    if (arrayObject && !arrayObject.isAlive) {\n        synthesizeGLError(1282, \"bindVertexArrayOES: attempt to bind deleted arrayObject\");\n        return;\n    }\n    var original = this.original;\n    var oldVAO = this.currentVertexArrayObject;\n    this.currentVertexArrayObject = arrayObject || this.defaultVertexArrayObject;\n    this.currentVertexArrayObject.hasBeenBound = true;\n    var newVAO = this.currentVertexArrayObject;\n    if (oldVAO === newVAO) return;\n    if (!oldVAO || newVAO.elementArrayBuffer !== oldVAO.elementArrayBuffer) original.bindBuffer.call(gl, 34963, newVAO.elementArrayBuffer);\n    var currentBinding = this.currentArrayBuffer;\n    var maxAttrib = Math.max(oldVAO ? oldVAO.maxAttrib : 0, newVAO.maxAttrib);\n    for(var n = 0; n <= maxAttrib; n++){\n        var attrib = newVAO.attribs[n];\n        var oldAttrib = oldVAO ? oldVAO.attribs[n] : null;\n        if (!oldVAO || attrib.enabled !== oldAttrib.enabled) {\n            if (attrib.enabled) original.enableVertexAttribArray.call(gl, n);\n            else original.disableVertexAttribArray.call(gl, n);\n        }\n        if (attrib.enabled) {\n            var bufferChanged = false;\n            if (!oldVAO || attrib.buffer !== oldAttrib.buffer) {\n                if (currentBinding !== attrib.buffer) {\n                    original.bindBuffer.call(gl, 34962, attrib.buffer);\n                    currentBinding = attrib.buffer;\n                }\n                bufferChanged = true;\n            }\n            if (bufferChanged || attrib.cached !== oldAttrib.cached) original.vertexAttribPointer.call(gl, n, attrib.size, attrib.type, attrib.normalized, attrib.stride, attrib.offset);\n        }\n    }\n    if (this.currentArrayBuffer !== currentBinding) original.bindBuffer.call(gl, 34962, this.currentArrayBuffer);\n};\nfunction polyfillVertexArrayObject(gl) {\n    if (typeof gl.createVertexArray === \"function\") return;\n    var original_getSupportedExtensions = gl.getSupportedExtensions;\n    gl.getSupportedExtensions = function getSupportedExtensions() {\n        var list = original_getSupportedExtensions.call(this) || [];\n        if (list.indexOf(\"OES_vertex_array_object\") < 0) list.push(\"OES_vertex_array_object\");\n        return list;\n    };\n    var original_getExtension = gl.getExtension;\n    gl.getExtension = function getExtension(name) {\n        var ext = original_getExtension.call(this, name);\n        if (ext) return ext;\n        if (name !== \"OES_vertex_array_object\") return null;\n        if (!gl.__OESVertexArrayObject) this.__OESVertexArrayObject = new OESVertexArrayObject(this);\n        return this.__OESVertexArrayObject;\n    };\n}\n\n},{\"probe.gl/env\":\"4WXZh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lOb37\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>(0, _utils.assert));\nparcelHelpers.export(exports, \"deepArrayEqual\", ()=>(0, _utils.deepArrayEqual));\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>(0, _utils.isObjectEmpty));\nparcelHelpers.export(exports, \"cssToDevicePixels\", ()=>(0, _devicePixels.cssToDevicePixels));\nparcelHelpers.export(exports, \"cssToDeviceRatio\", ()=>(0, _devicePixels.cssToDeviceRatio));\nparcelHelpers.export(exports, \"getDevicePixelRatio\", ()=>(0, _devicePixels.getDevicePixelRatio));\nparcelHelpers.export(exports, \"isWebGL\", ()=>(0, _webglChecks.isWebGL));\nparcelHelpers.export(exports, \"isWebGL2\", ()=>(0, _webglChecks.isWebGL2));\nparcelHelpers.export(exports, \"log\", ()=>log);\nvar _probeGl = require(\"probe.gl\");\nvar _utils = require(\"./utils\");\nvar _devicePixels = require(\"./device-pixels\");\nvar _webglChecks = require(\"./webgl-checks\");\nvar log = new (0, _probeGl.Log)({\n    id: \"luma.gl\"\n});\n\n},{\"probe.gl\":\"f91qf\",\"./utils\":\"hHrc3\",\"./device-pixels\":\"57Iin\",\"./webgl-checks\":\"e6GnJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hHrc3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>assert);\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>isObjectEmpty);\nparcelHelpers.export(exports, \"deepArrayEqual\", ()=>deepArrayEqual);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"luma.gl: assertion failed.\");\n}\nfunction isObjectEmpty(object) {\n    for(var key in object)return false;\n    return true;\n}\nfunction deepArrayEqual(x, y) {\n    if (x === y) return true;\n    var isArrayX = Array.isArray(x) || ArrayBuffer.isView(x);\n    var isArrayY = Array.isArray(y) || ArrayBuffer.isView(y);\n    if (isArrayX && isArrayY && x.length === y.length) {\n        for(var i = 0; i < x.length; ++i){\n            if (x[i] !== y[i]) return false;\n        }\n        return true;\n    }\n    return false;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"57Iin\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cssToDeviceRatio\", ()=>cssToDeviceRatio);\nparcelHelpers.export(exports, \"cssToDevicePixels\", ()=>cssToDevicePixels);\nparcelHelpers.export(exports, \"getDevicePixelRatio\", ()=>getDevicePixelRatio);\nfunction cssToDeviceRatio(gl) {\n    if (gl.canvas && gl.luma) {\n        var clientWidth = gl.luma.canvasSizeInfo.clientWidth;\n        return clientWidth ? gl.drawingBufferWidth / clientWidth : 1;\n    }\n    return 1;\n}\nfunction cssToDevicePixels(gl, cssPixel) {\n    var yInvert = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n    var ratio = cssToDeviceRatio(gl);\n    var width = gl.drawingBufferWidth;\n    var height = gl.drawingBufferHeight;\n    return scalePixels(cssPixel, ratio, width, height, yInvert);\n}\nfunction getDevicePixelRatio(useDevicePixels) {\n    var windowRatio = typeof window === \"undefined\" ? 1 : window.devicePixelRatio || 1;\n    if (Number.isFinite(useDevicePixels)) return useDevicePixels <= 0 ? 1 : useDevicePixels;\n    return useDevicePixels ? windowRatio : 1;\n}\nfunction scalePixels(pixel, ratio, width, height, yInvert) {\n    var x = scaleX(pixel[0], ratio, width);\n    var y = scaleY(pixel[1], ratio, height, yInvert);\n    var t = scaleX(pixel[0] + 1, ratio, width);\n    var xHigh = t === width - 1 ? t : t - 1;\n    t = scaleY(pixel[1] + 1, ratio, height, yInvert);\n    var yHigh;\n    if (yInvert) {\n        t = t === 0 ? t : t + 1;\n        yHigh = y;\n        y = t;\n    } else yHigh = t === height - 1 ? t : t - 1;\n    return {\n        x: x,\n        y: y,\n        width: Math.max(xHigh - x + 1, 1),\n        height: Math.max(yHigh - y + 1, 1)\n    };\n}\nfunction scaleX(x, ratio, width) {\n    var r = Math.min(Math.round(x * ratio), width - 1);\n    return r;\n}\nfunction scaleY(y, ratio, height, yInvert) {\n    return yInvert ? Math.max(0, height - 1 - Math.round(y * ratio)) : Math.min(Math.round(y * ratio), height - 1);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e6GnJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ERR_CONTEXT\", ()=>ERR_CONTEXT);\nparcelHelpers.export(exports, \"ERR_WEBGL\", ()=>ERR_WEBGL);\nparcelHelpers.export(exports, \"ERR_WEBGL2\", ()=>ERR_WEBGL2);\nparcelHelpers.export(exports, \"isWebGL\", ()=>isWebGL);\nparcelHelpers.export(exports, \"isWebGL2\", ()=>isWebGL2);\nparcelHelpers.export(exports, \"assertWebGLContext\", ()=>assertWebGLContext);\nparcelHelpers.export(exports, \"assertWebGL2Context\", ()=>assertWebGL2Context);\nvar _utils = require(\"./utils\");\nvar ERR_CONTEXT = \"Invalid WebGLRenderingContext\";\nvar ERR_WEBGL = ERR_CONTEXT;\nvar ERR_WEBGL2 = \"Requires WebGL2\";\nfunction isWebGL(gl) {\n    return Boolean(gl && Number.isFinite(gl._version));\n}\nfunction isWebGL2(gl) {\n    return Boolean(gl && gl._version === 2);\n}\nfunction assertWebGLContext(gl) {\n    (0, _utils.assert)(isWebGL(gl), ERR_CONTEXT);\n}\nfunction assertWebGL2Context(gl) {\n    (0, _utils.assert)(isWebGL2(gl), ERR_WEBGL2);\n}\n\n},{\"./utils\":\"hHrc3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7gl3t\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"WEBGL2_CONTEXT_POLYFILLS\", ()=>WEBGL2_CONTEXT_POLYFILLS);\nparcelHelpers.export(exports, \"WEBGL2_CONTEXT_OVERRIDES\", ()=>WEBGL2_CONTEXT_OVERRIDES);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nvar _getParameterPolyfill = require(\"./get-parameter-polyfill\");\nvar _WEBGL2_CONTEXT_POLYF;\nvar OES_vertex_array_object = \"OES_vertex_array_object\";\nvar ANGLE_instanced_arrays = \"ANGLE_instanced_arrays\";\nvar WEBGL_draw_buffers = \"WEBGL_draw_buffers\";\nvar EXT_disjoint_timer_query = \"EXT_disjoint_timer_query\";\nvar EXT_texture_filter_anisotropic = \"EXT_texture_filter_anisotropic\";\nvar ERR_VAO_NOT_SUPPORTED = \"VertexArray requires WebGL2 or OES_vertex_array_object extension\";\nfunction getExtensionData(gl, extension) {\n    return {\n        webgl2: (0, _utils.isWebGL2)(gl),\n        ext: gl.getExtension(extension)\n    };\n}\nvar WEBGL2_CONTEXT_POLYFILLS = (_WEBGL2_CONTEXT_POLYF = {}, (0, _definePropertyDefault.default)(_WEBGL2_CONTEXT_POLYF, OES_vertex_array_object, {\n    meta: {\n        suffix: \"OES\"\n    },\n    createVertexArray: function createVertexArray() {\n        (0, _utils.assert)(false, ERR_VAO_NOT_SUPPORTED);\n    },\n    deleteVertexArray: function deleteVertexArray() {},\n    bindVertexArray: function bindVertexArray() {},\n    isVertexArray: function isVertexArray() {\n        return false;\n    }\n}), (0, _definePropertyDefault.default)(_WEBGL2_CONTEXT_POLYF, ANGLE_instanced_arrays, {\n    meta: {\n        suffix: \"ANGLE\"\n    },\n    vertexAttribDivisor: function vertexAttribDivisor(location, divisor) {\n        (0, _utils.assert)(divisor === 0, \"WebGL instanced rendering not supported\");\n    },\n    drawElementsInstanced: function drawElementsInstanced() {},\n    drawArraysInstanced: function drawArraysInstanced() {}\n}), (0, _definePropertyDefault.default)(_WEBGL2_CONTEXT_POLYF, WEBGL_draw_buffers, {\n    meta: {\n        suffix: \"WEBGL\"\n    },\n    drawBuffers: function drawBuffers() {\n        (0, _utils.assert)(false);\n    }\n}), (0, _definePropertyDefault.default)(_WEBGL2_CONTEXT_POLYF, EXT_disjoint_timer_query, {\n    meta: {\n        suffix: \"EXT\"\n    },\n    createQuery: function createQuery() {\n        (0, _utils.assert)(false);\n    },\n    deleteQuery: function deleteQuery() {\n        (0, _utils.assert)(false);\n    },\n    beginQuery: function beginQuery() {\n        (0, _utils.assert)(false);\n    },\n    endQuery: function endQuery() {},\n    getQuery: function getQuery(handle, pname) {\n        return this.getQueryObject(handle, pname);\n    },\n    getQueryParameter: function getQueryParameter(handle, pname) {\n        return this.getQueryObject(handle, pname);\n    },\n    getQueryObject: function getQueryObject() {}\n}), _WEBGL2_CONTEXT_POLYF);\nvar WEBGL2_CONTEXT_OVERRIDES = {\n    readBuffer: function readBuffer(gl, originalFunc, attachment) {\n        if ((0, _utils.isWebGL2)(gl)) originalFunc(attachment);\n    },\n    getVertexAttrib: function getVertexAttrib(gl, originalFunc, location, pname) {\n        var _getExtensionData = getExtensionData(gl, ANGLE_instanced_arrays), webgl2 = _getExtensionData.webgl2, ext = _getExtensionData.ext;\n        var result;\n        switch(pname){\n            case 35069:\n                result = !webgl2 ? false : undefined;\n                break;\n            case 35070:\n                result = !webgl2 && !ext ? 0 : undefined;\n                break;\n            default:\n        }\n        return result !== undefined ? result : originalFunc(location, pname);\n    },\n    getProgramParameter: function getProgramParameter(gl, originalFunc, program, pname) {\n        if (!(0, _utils.isWebGL2)(gl)) switch(pname){\n            case 35967:\n                return 35981;\n            case 35971:\n                return 0;\n            case 35382:\n                return 0;\n            default:\n        }\n        return originalFunc(program, pname);\n    },\n    getInternalformatParameter: function getInternalformatParameter(gl, originalFunc, target, format, pname) {\n        if (!(0, _utils.isWebGL2)(gl)) switch(pname){\n            case 32937:\n                return new Int32Array([\n                    0\n                ]);\n            default:\n        }\n        return gl.getInternalformatParameter(target, format, pname);\n    },\n    getTexParameter: function getTexParameter(gl, originalFunc, target, pname) {\n        switch(pname){\n            case 34046:\n                var extensions = gl.luma.extensions;\n                var ext = extensions[EXT_texture_filter_anisotropic];\n                pname = ext && ext.TEXTURE_MAX_ANISOTROPY_EXT || 34046;\n                break;\n            default:\n        }\n        return originalFunc(target, pname);\n    },\n    getParameter: (0, _getParameterPolyfill.getParameterPolyfill),\n    hint: function hint(gl, originalFunc, pname, value) {\n        return originalFunc(pname, value);\n    }\n};\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../utils\":\"lOb37\",\"./get-parameter-polyfill\":\"4zXGH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4zXGH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getParameterPolyfill\", ()=>getParameterPolyfill);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nvar _WEBGL_PARAMETERS;\nvar OES_element_index = \"OES_element_index\";\nvar WEBGL_draw_buffers = \"WEBGL_draw_buffers\";\nvar EXT_disjoint_timer_query = \"EXT_disjoint_timer_query\";\nvar EXT_disjoint_timer_query_webgl2 = \"EXT_disjoint_timer_query_webgl2\";\nvar EXT_texture_filter_anisotropic = \"EXT_texture_filter_anisotropic\";\nvar WEBGL_debug_renderer_info = \"WEBGL_debug_renderer_info\";\nvar GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8b8b;\nvar GL_DONT_CARE = 0x1100;\nvar GL_GPU_DISJOINT_EXT = 0x8fbb;\nvar GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84ff;\nvar GL_UNMASKED_VENDOR_WEBGL = 0x9245;\nvar GL_UNMASKED_RENDERER_WEBGL = 0x9246;\nvar getWebGL2ValueOrZero = function getWebGL2ValueOrZero(gl) {\n    return !(0, _utils.isWebGL2)(gl) ? 0 : undefined;\n};\nvar WEBGL_PARAMETERS = (_WEBGL_PARAMETERS = {}, (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 3074, function(gl) {\n    return !(0, _utils.isWebGL2)(gl) ? 36064 : undefined;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_FRAGMENT_SHADER_DERIVATIVE_HINT, function(gl) {\n    return !(0, _utils.isWebGL2)(gl) ? GL_DONT_CARE : undefined;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35977, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 32937, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_GPU_DISJOINT_EXT, function(gl, getParameter) {\n    var ext = (0, _utils.isWebGL2)(gl) ? gl.getExtension(EXT_disjoint_timer_query_webgl2) : gl.getExtension(EXT_disjoint_timer_query);\n    return ext && ext.GPU_DISJOINT_EXT ? getParameter(ext.GPU_DISJOINT_EXT) : 0;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_UNMASKED_VENDOR_WEBGL, function(gl, getParameter) {\n    var ext = gl.getExtension(WEBGL_debug_renderer_info);\n    return getParameter(ext && ext.UNMASKED_VENDOR_WEBGL || 7936);\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_UNMASKED_RENDERER_WEBGL, function(gl, getParameter) {\n    var ext = gl.getExtension(WEBGL_debug_renderer_info);\n    return getParameter(ext && ext.UNMASKED_RENDERER_WEBGL || 7937);\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, function(gl, getParameter) {\n    var ext = gl.luma.extensions[EXT_texture_filter_anisotropic];\n    return ext ? getParameter(ext.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1.0;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 32883, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35071, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 37447, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 36063, function(gl, getParameter) {\n    if (!(0, _utils.isWebGL2)(gl)) {\n        var ext = gl.getExtension(WEBGL_draw_buffers);\n        return ext ? getParameter(ext.MAX_COLOR_ATTACHMENTS_WEBGL) : 0;\n    }\n    return undefined;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35379, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35374, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35377, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 34852, function(gl) {\n    if (!(0, _utils.isWebGL2)(gl)) {\n        var ext = gl.getExtension(WEBGL_draw_buffers);\n        return ext ? ext.MAX_DRAW_BUFFERS_WEBGL : 0;\n    }\n    return undefined;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 36203, function(gl) {\n    return gl.getExtension(OES_element_index) ? 2147483647 : 65535;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 33001, function(gl) {\n    return gl.getExtension(OES_element_index) ? 16777216 : 65535;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 33000, function(gl) {\n    return 16777216;\n}), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 37157, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35373, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35657, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 36183, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 37137, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 34045, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35978, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35979, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35968, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35376, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35375, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35659, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 37154, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35371, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35658, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35076, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35077, getWebGL2ValueOrZero), (0, _definePropertyDefault.default)(_WEBGL_PARAMETERS, 35380, getWebGL2ValueOrZero), _WEBGL_PARAMETERS);\nfunction getParameterPolyfill(gl, originalGetParameter, pname) {\n    var limit = WEBGL_PARAMETERS[pname];\n    var value = typeof limit === \"function\" ? limit(gl, originalGetParameter, pname) : limit;\n    var result = value !== undefined ? value : originalGetParameter(pname);\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../utils\":\"lOb37\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ibNMv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setParameters\", ()=>setParameters);\nparcelHelpers.export(exports, \"getParameters\", ()=>getParameters);\nparcelHelpers.export(exports, \"resetParameters\", ()=>resetParameters);\nparcelHelpers.export(exports, \"withParameters\", ()=>withParameters);\nvar _webglParameterTables = require(\"./webgl-parameter-tables\");\nvar _trackContextState = require(\"./track-context-state\");\nvar _utils = require(\"../utils\");\nfunction setParameters(gl, values) {\n    (0, _utils.assert)((0, _utils.isWebGL)(gl), \"setParameters requires a WebGL context\");\n    if ((0, _utils.isObjectEmpty)(values)) return;\n    var compositeSetters = {};\n    for(var key in values){\n        var glConstant = Number(key);\n        var setter = (0, _webglParameterTables.GL_PARAMETER_SETTERS)[key];\n        if (setter) {\n            if (typeof setter === \"string\") compositeSetters[setter] = true;\n            else setter(gl, values[key], glConstant);\n        }\n    }\n    var cache = gl.state && gl.state.cache;\n    if (cache) for(var _key in compositeSetters){\n        var compositeSetter = (0, _webglParameterTables.GL_COMPOSITE_PARAMETER_SETTERS)[_key];\n        compositeSetter(gl, values, cache);\n    }\n}\nfunction getParameters(gl, parameters) {\n    parameters = parameters || (0, _webglParameterTables.GL_PARAMETER_DEFAULTS);\n    if (typeof parameters === \"number\") {\n        var key = parameters;\n        var getter = (0, _webglParameterTables.GL_PARAMETER_GETTERS)[key];\n        return getter ? getter(gl, key) : gl.getParameter(key);\n    }\n    var parameterKeys = Array.isArray(parameters) ? parameters : Object.keys(parameters);\n    var state = {};\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = parameterKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var _key2 = _step.value;\n            var _getter = (0, _webglParameterTables.GL_PARAMETER_GETTERS)[_key2];\n            state[_key2] = _getter ? _getter(gl, Number(_key2)) : gl.getParameter(Number(_key2));\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    return state;\n}\nfunction resetParameters(gl) {\n    setParameters(gl, (0, _webglParameterTables.GL_PARAMETER_DEFAULTS));\n}\nfunction withParameters(gl, parameters, func) {\n    if ((0, _utils.isObjectEmpty)(parameters)) return func(gl);\n    var _parameters$nocatch = parameters.nocatch, nocatch = _parameters$nocatch === void 0 ? true : _parameters$nocatch;\n    (0, _trackContextState.pushContextState)(gl);\n    setParameters(gl, parameters);\n    var value;\n    if (nocatch) {\n        value = func(gl);\n        (0, _trackContextState.popContextState)(gl);\n    } else try {\n        value = func(gl);\n    } finally{\n        (0, _trackContextState.popContextState)(gl);\n    }\n    return value;\n}\n\n},{\"./webgl-parameter-tables\":\"8m0fy\",\"./track-context-state\":\"7nRj1\",\"../utils\":\"lOb37\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8m0fy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"GL_PARAMETER_DEFAULTS\", ()=>GL_PARAMETER_DEFAULTS);\nparcelHelpers.export(exports, \"GL_PARAMETER_SETTERS\", ()=>GL_PARAMETER_SETTERS);\nparcelHelpers.export(exports, \"GL_COMPOSITE_PARAMETER_SETTERS\", ()=>GL_COMPOSITE_PARAMETER_SETTERS);\nparcelHelpers.export(exports, \"GL_HOOKED_SETTERS\", ()=>GL_HOOKED_SETTERS);\nparcelHelpers.export(exports, \"GL_PARAMETER_GETTERS\", ()=>GL_PARAMETER_GETTERS);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _toConsumableArray = require(\"@babel/runtime/helpers/esm/toConsumableArray\");\nvar _toConsumableArrayDefault = parcelHelpers.interopDefault(_toConsumableArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nvar _GL_PARAMETER_DEFAULT, _GL_PARAMETER_SETTERS, _GL_PARAMETER_GETTERS;\nvar GL_PARAMETER_DEFAULTS = (_GL_PARAMETER_DEFAULT = {}, (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3042, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32773, new Float32Array([\n    0,\n    0,\n    0,\n    0\n])), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32777, 32774), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34877, 32774), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32969, 1), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32968, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32971, 1), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32970, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3106, new Float32Array([\n    0,\n    0,\n    0,\n    0\n])), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3107, [\n    true,\n    true,\n    true,\n    true\n]), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2884, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2885, 1029), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2929, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2931, 1), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2932, 513), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2928, new Float32Array([\n    0,\n    1\n])), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2930, true), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3024, true), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36006, null), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2886, 2305), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 33170, 4352), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2849, 1), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32823, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32824, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 10752, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32938, 1.0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32939, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3089, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3088, new Int32Array([\n    0,\n    0,\n    1024,\n    1024\n])), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2960, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2961, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2968, 0xffffffff), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36005, 0xffffffff), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2962, 519), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2967, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2963, 0xffffffff), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34816, 519), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36003, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36004, 0xffffffff), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2964, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2965, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2966, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34817, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34818, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 34819, 7680), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 2978, [\n    0,\n    0,\n    1024,\n    1024\n]), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3333, 4), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3317, 4), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 37440, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 37441, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 37443, 37444), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 35723, 4352), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 36010, null), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 35977, false), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3330, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3332, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3331, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3314, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32878, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3316, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 3315, 0), (0, _definePropertyDefault.default)(_GL_PARAMETER_DEFAULT, 32877, 0), _GL_PARAMETER_DEFAULT);\nvar enable = function enable(gl, value, key) {\n    return value ? gl.enable(key) : gl.disable(key);\n};\nvar hint = function hint(gl, value, key) {\n    return gl.hint(key, value);\n};\nvar pixelStorei = function pixelStorei(gl, value, key) {\n    return gl.pixelStorei(key, value);\n};\nvar drawFramebuffer = function drawFramebuffer(gl, value) {\n    var target = (0, _utils.isWebGL2)(gl) ? 36009 : 36160;\n    return gl.bindFramebuffer(target, value);\n};\nvar readFramebuffer = function readFramebuffer(gl, value) {\n    return gl.bindFramebuffer(36008, value);\n};\nfunction isArray(array) {\n    return Array.isArray(array) || ArrayBuffer.isView(array);\n}\nvar GL_PARAMETER_SETTERS = (_GL_PARAMETER_SETTERS = {}, (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3042, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32773, function(gl, value) {\n    return gl.blendColor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32777, \"blendEquation\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34877, \"blendEquation\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32969, \"blendFunc\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32968, \"blendFunc\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32971, \"blendFunc\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32970, \"blendFunc\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3106, function(gl, value) {\n    return gl.clearColor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3107, function(gl, value) {\n    return gl.colorMask.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2884, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2885, function(gl, value) {\n    return gl.cullFace(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2929, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2931, function(gl, value) {\n    return gl.clearDepth(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2932, function(gl, value) {\n    return gl.depthFunc(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2928, function(gl, value) {\n    return gl.depthRange.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2930, function(gl, value) {\n    return gl.depthMask(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3024, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 35723, hint), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36006, drawFramebuffer), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2886, function(gl, value) {\n    return gl.frontFace(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 33170, hint), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2849, function(gl, value) {\n    return gl.lineWidth(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32823, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32824, \"polygonOffset\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 10752, \"polygonOffset\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 35977, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32938, \"sampleCoverage\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32939, \"sampleCoverage\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3089, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3088, function(gl, value) {\n    return gl.scissor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2960, enable), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2961, function(gl, value) {\n    return gl.clearStencil(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2968, function(gl, value) {\n    return gl.stencilMaskSeparate(1028, value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36005, function(gl, value) {\n    return gl.stencilMaskSeparate(1029, value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2962, \"stencilFuncFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2967, \"stencilFuncFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2963, \"stencilFuncFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34816, \"stencilFuncBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36003, \"stencilFuncBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36004, \"stencilFuncBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2964, \"stencilOpFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2965, \"stencilOpFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2966, \"stencilOpFront\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34817, \"stencilOpBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34818, \"stencilOpBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 34819, \"stencilOpBack\"), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 2978, function(gl, value) {\n    return gl.viewport.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3333, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3317, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 37440, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 37441, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 37443, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3330, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3332, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3331, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 36010, readFramebuffer), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3314, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32878, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3316, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 3315, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, 32877, pixelStorei), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"framebuffer\", function framebuffer(gl, _framebuffer) {\n    var handle = _framebuffer && \"handle\" in _framebuffer ? _framebuffer.handle : _framebuffer;\n    return gl.bindFramebuffer(36160, handle);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"blend\", function blend(gl, value) {\n    return value ? gl.enable(3042) : gl.disable(3042);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"blendColor\", function blendColor(gl, value) {\n    return gl.blendColor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"blendEquation\", function blendEquation(gl, args) {\n    args = isArray(args) ? args : [\n        args,\n        args\n    ];\n    gl.blendEquationSeparate.apply(gl, (0, _toConsumableArrayDefault.default)(args));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"blendFunc\", function blendFunc(gl, args) {\n    args = isArray(args) && args.length === 2 ? [].concat((0, _toConsumableArrayDefault.default)(args), (0, _toConsumableArrayDefault.default)(args)) : args;\n    gl.blendFuncSeparate.apply(gl, (0, _toConsumableArrayDefault.default)(args));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"clearColor\", function clearColor(gl, value) {\n    return gl.clearColor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"clearDepth\", function clearDepth(gl, value) {\n    return gl.clearDepth(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"clearStencil\", function clearStencil(gl, value) {\n    return gl.clearStencil(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"colorMask\", function colorMask(gl, value) {\n    return gl.colorMask.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"cull\", function cull(gl, value) {\n    return value ? gl.enable(2884) : gl.disable(2884);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"cullFace\", function cullFace(gl, value) {\n    return gl.cullFace(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"depthTest\", function depthTest(gl, value) {\n    return value ? gl.enable(2929) : gl.disable(2929);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"depthFunc\", function depthFunc(gl, value) {\n    return gl.depthFunc(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"depthMask\", function depthMask(gl, value) {\n    return gl.depthMask(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"depthRange\", function depthRange(gl, value) {\n    return gl.depthRange.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"dither\", function dither(gl, value) {\n    return value ? gl.enable(3024) : gl.disable(3024);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"derivativeHint\", function derivativeHint(gl, value) {\n    gl.hint(35723, value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"frontFace\", function frontFace(gl, value) {\n    return gl.frontFace(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"mipmapHint\", function mipmapHint(gl, value) {\n    return gl.hint(33170, value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"lineWidth\", function lineWidth(gl, value) {\n    return gl.lineWidth(value);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"polygonOffsetFill\", function polygonOffsetFill(gl, value) {\n    return value ? gl.enable(32823) : gl.disable(32823);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"polygonOffset\", function polygonOffset(gl, value) {\n    return gl.polygonOffset.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"sampleCoverage\", function sampleCoverage(gl, value) {\n    return gl.sampleCoverage.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"scissorTest\", function scissorTest(gl, value) {\n    return value ? gl.enable(3089) : gl.disable(3089);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"scissor\", function scissor(gl, value) {\n    return gl.scissor.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"stencilTest\", function stencilTest(gl, value) {\n    return value ? gl.enable(2960) : gl.disable(2960);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"stencilMask\", function stencilMask(gl, value) {\n    value = isArray(value) ? value : [\n        value,\n        value\n    ];\n    var _value = value, _value2 = (0, _slicedToArrayDefault.default)(_value, 2), mask = _value2[0], backMask = _value2[1];\n    gl.stencilMaskSeparate(1028, mask);\n    gl.stencilMaskSeparate(1029, backMask);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"stencilFunc\", function stencilFunc(gl, args) {\n    args = isArray(args) && args.length === 3 ? [].concat((0, _toConsumableArrayDefault.default)(args), (0, _toConsumableArrayDefault.default)(args)) : args;\n    var _args = args, _args2 = (0, _slicedToArrayDefault.default)(_args, 6), func = _args2[0], ref = _args2[1], mask = _args2[2], backFunc = _args2[3], backRef = _args2[4], backMask = _args2[5];\n    gl.stencilFuncSeparate(1028, func, ref, mask);\n    gl.stencilFuncSeparate(1029, backFunc, backRef, backMask);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"stencilOp\", function stencilOp(gl, args) {\n    args = isArray(args) && args.length === 3 ? [].concat((0, _toConsumableArrayDefault.default)(args), (0, _toConsumableArrayDefault.default)(args)) : args;\n    var _args3 = args, _args4 = (0, _slicedToArrayDefault.default)(_args3, 6), sfail = _args4[0], dpfail = _args4[1], dppass = _args4[2], backSfail = _args4[3], backDpfail = _args4[4], backDppass = _args4[5];\n    gl.stencilOpSeparate(1028, sfail, dpfail, dppass);\n    gl.stencilOpSeparate(1029, backSfail, backDpfail, backDppass);\n}), (0, _definePropertyDefault.default)(_GL_PARAMETER_SETTERS, \"viewport\", function viewport(gl, value) {\n    return gl.viewport.apply(gl, (0, _toConsumableArrayDefault.default)(value));\n}), _GL_PARAMETER_SETTERS);\nfunction getValue(glEnum, values, cache) {\n    return values[glEnum] !== undefined ? values[glEnum] : cache[glEnum];\n}\nvar GL_COMPOSITE_PARAMETER_SETTERS = {\n    blendEquation: function blendEquation(gl, values, cache) {\n        return gl.blendEquationSeparate(getValue(32777, values, cache), getValue(34877, values, cache));\n    },\n    blendFunc: function blendFunc(gl, values, cache) {\n        return gl.blendFuncSeparate(getValue(32969, values, cache), getValue(32968, values, cache), getValue(32971, values, cache), getValue(32970, values, cache));\n    },\n    polygonOffset: function polygonOffset(gl, values, cache) {\n        return gl.polygonOffset(getValue(32824, values, cache), getValue(10752, values, cache));\n    },\n    sampleCoverage: function sampleCoverage(gl, values, cache) {\n        return gl.sampleCoverage(getValue(32938, values, cache), getValue(32939, values, cache));\n    },\n    stencilFuncFront: function stencilFuncFront(gl, values, cache) {\n        return gl.stencilFuncSeparate(1028, getValue(2962, values, cache), getValue(2967, values, cache), getValue(2963, values, cache));\n    },\n    stencilFuncBack: function stencilFuncBack(gl, values, cache) {\n        return gl.stencilFuncSeparate(1029, getValue(34816, values, cache), getValue(36003, values, cache), getValue(36004, values, cache));\n    },\n    stencilOpFront: function stencilOpFront(gl, values, cache) {\n        return gl.stencilOpSeparate(1028, getValue(2964, values, cache), getValue(2965, values, cache), getValue(2966, values, cache));\n    },\n    stencilOpBack: function stencilOpBack(gl, values, cache) {\n        return gl.stencilOpSeparate(1029, getValue(34817, values, cache), getValue(34818, values, cache), getValue(34819, values, cache));\n    }\n};\nvar GL_HOOKED_SETTERS = {\n    enable: function enable(update, capability) {\n        return update((0, _definePropertyDefault.default)({}, capability, true));\n    },\n    disable: function disable(update, capability) {\n        return update((0, _definePropertyDefault.default)({}, capability, false));\n    },\n    pixelStorei: function pixelStorei(update, pname, value) {\n        return update((0, _definePropertyDefault.default)({}, pname, value));\n    },\n    hint: function hint(update, pname, _hint) {\n        return update((0, _definePropertyDefault.default)({}, pname, _hint));\n    },\n    bindFramebuffer: function bindFramebuffer(update, target, framebuffer) {\n        var _update5;\n        switch(target){\n            case 36160:\n                return update((_update5 = {}, (0, _definePropertyDefault.default)(_update5, 36006, framebuffer), (0, _definePropertyDefault.default)(_update5, 36010, framebuffer), _update5));\n            case 36009:\n                return update((0, _definePropertyDefault.default)({}, 36006, framebuffer));\n            case 36008:\n                return update((0, _definePropertyDefault.default)({}, 36010, framebuffer));\n            default:\n                return null;\n        }\n    },\n    blendColor: function blendColor(update, r, g, b, a) {\n        return update((0, _definePropertyDefault.default)({}, 32773, new Float32Array([\n            r,\n            g,\n            b,\n            a\n        ])));\n    },\n    blendEquation: function blendEquation(update, mode) {\n        var _update9;\n        return update((_update9 = {}, (0, _definePropertyDefault.default)(_update9, 32777, mode), (0, _definePropertyDefault.default)(_update9, 34877, mode), _update9));\n    },\n    blendEquationSeparate: function blendEquationSeparate(update, modeRGB, modeAlpha) {\n        var _update10;\n        return update((_update10 = {}, (0, _definePropertyDefault.default)(_update10, 32777, modeRGB), (0, _definePropertyDefault.default)(_update10, 34877, modeAlpha), _update10));\n    },\n    blendFunc: function blendFunc(update, src, dst) {\n        var _update11;\n        return update((_update11 = {}, (0, _definePropertyDefault.default)(_update11, 32969, src), (0, _definePropertyDefault.default)(_update11, 32968, dst), (0, _definePropertyDefault.default)(_update11, 32971, src), (0, _definePropertyDefault.default)(_update11, 32970, dst), _update11));\n    },\n    blendFuncSeparate: function blendFuncSeparate(update, srcRGB, dstRGB, srcAlpha, dstAlpha) {\n        var _update12;\n        return update((_update12 = {}, (0, _definePropertyDefault.default)(_update12, 32969, srcRGB), (0, _definePropertyDefault.default)(_update12, 32968, dstRGB), (0, _definePropertyDefault.default)(_update12, 32971, srcAlpha), (0, _definePropertyDefault.default)(_update12, 32970, dstAlpha), _update12));\n    },\n    clearColor: function clearColor(update, r, g, b, a) {\n        return update((0, _definePropertyDefault.default)({}, 3106, new Float32Array([\n            r,\n            g,\n            b,\n            a\n        ])));\n    },\n    clearDepth: function clearDepth(update, depth) {\n        return update((0, _definePropertyDefault.default)({}, 2931, depth));\n    },\n    clearStencil: function clearStencil(update, s) {\n        return update((0, _definePropertyDefault.default)({}, 2961, s));\n    },\n    colorMask: function colorMask(update, r, g, b, a) {\n        return update((0, _definePropertyDefault.default)({}, 3107, [\n            r,\n            g,\n            b,\n            a\n        ]));\n    },\n    cullFace: function cullFace(update, mode) {\n        return update((0, _definePropertyDefault.default)({}, 2885, mode));\n    },\n    depthFunc: function depthFunc(update, func) {\n        return update((0, _definePropertyDefault.default)({}, 2932, func));\n    },\n    depthRange: function depthRange(update, zNear, zFar) {\n        return update((0, _definePropertyDefault.default)({}, 2928, new Float32Array([\n            zNear,\n            zFar\n        ])));\n    },\n    depthMask: function depthMask(update, mask) {\n        return update((0, _definePropertyDefault.default)({}, 2930, mask));\n    },\n    frontFace: function frontFace(update, face) {\n        return update((0, _definePropertyDefault.default)({}, 2886, face));\n    },\n    lineWidth: function lineWidth(update, width) {\n        return update((0, _definePropertyDefault.default)({}, 2849, width));\n    },\n    polygonOffset: function polygonOffset(update, factor, units) {\n        var _update23;\n        return update((_update23 = {}, (0, _definePropertyDefault.default)(_update23, 32824, factor), (0, _definePropertyDefault.default)(_update23, 10752, units), _update23));\n    },\n    sampleCoverage: function sampleCoverage(update, value, invert) {\n        var _update24;\n        return update((_update24 = {}, (0, _definePropertyDefault.default)(_update24, 32938, value), (0, _definePropertyDefault.default)(_update24, 32939, invert), _update24));\n    },\n    scissor: function scissor(update, x, y, width, height) {\n        return update((0, _definePropertyDefault.default)({}, 3088, new Int32Array([\n            x,\n            y,\n            width,\n            height\n        ])));\n    },\n    stencilMask: function stencilMask(update, mask) {\n        var _update26;\n        return update((_update26 = {}, (0, _definePropertyDefault.default)(_update26, 2968, mask), (0, _definePropertyDefault.default)(_update26, 36005, mask), _update26));\n    },\n    stencilMaskSeparate: function stencilMaskSeparate(update, face, mask) {\n        return update((0, _definePropertyDefault.default)({}, face === 1028 ? 2968 : 36005, mask));\n    },\n    stencilFunc: function stencilFunc(update, func, ref, mask) {\n        var _update28;\n        return update((_update28 = {}, (0, _definePropertyDefault.default)(_update28, 2962, func), (0, _definePropertyDefault.default)(_update28, 2967, ref), (0, _definePropertyDefault.default)(_update28, 2963, mask), (0, _definePropertyDefault.default)(_update28, 34816, func), (0, _definePropertyDefault.default)(_update28, 36003, ref), (0, _definePropertyDefault.default)(_update28, 36004, mask), _update28));\n    },\n    stencilFuncSeparate: function stencilFuncSeparate(update, face, func, ref, mask) {\n        var _update29;\n        return update((_update29 = {}, (0, _definePropertyDefault.default)(_update29, face === 1028 ? 2962 : 34816, func), (0, _definePropertyDefault.default)(_update29, face === 1028 ? 2967 : 36003, ref), (0, _definePropertyDefault.default)(_update29, face === 1028 ? 2963 : 36004, mask), _update29));\n    },\n    stencilOp: function stencilOp(update, fail, zfail, zpass) {\n        var _update30;\n        return update((_update30 = {}, (0, _definePropertyDefault.default)(_update30, 2964, fail), (0, _definePropertyDefault.default)(_update30, 2965, zfail), (0, _definePropertyDefault.default)(_update30, 2966, zpass), (0, _definePropertyDefault.default)(_update30, 34817, fail), (0, _definePropertyDefault.default)(_update30, 34818, zfail), (0, _definePropertyDefault.default)(_update30, 34819, zpass), _update30));\n    },\n    stencilOpSeparate: function stencilOpSeparate(update, face, fail, zfail, zpass) {\n        var _update31;\n        return update((_update31 = {}, (0, _definePropertyDefault.default)(_update31, face === 1028 ? 2964 : 34817, fail), (0, _definePropertyDefault.default)(_update31, face === 1028 ? 2965 : 34818, zfail), (0, _definePropertyDefault.default)(_update31, face === 1028 ? 2966 : 34819, zpass), _update31));\n    },\n    viewport: function viewport(update, x, y, width, height) {\n        return update((0, _definePropertyDefault.default)({}, 2978, [\n            x,\n            y,\n            width,\n            height\n        ]));\n    }\n};\nvar isEnabled = function isEnabled(gl, key) {\n    return gl.isEnabled(key);\n};\nvar GL_PARAMETER_GETTERS = (_GL_PARAMETER_GETTERS = {}, (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 3042, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 2884, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 2929, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 3024, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 32823, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 32926, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 32928, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 3089, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 2960, isEnabled), (0, _definePropertyDefault.default)(_GL_PARAMETER_GETTERS, 35977, isEnabled), _GL_PARAMETER_GETTERS);\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/toConsumableArray\":\"2mzaU\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../utils\":\"lOb37\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iXlTc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayWithHolesJs = require(\"./arrayWithHoles.js\");\nvar _arrayWithHolesJsDefault = parcelHelpers.interopDefault(_arrayWithHolesJs);\nvar _iterableToArrayLimitJs = require(\"./iterableToArrayLimit.js\");\nvar _iterableToArrayLimitJsDefault = parcelHelpers.interopDefault(_iterableToArrayLimitJs);\nvar _unsupportedIterableToArrayJs = require(\"./unsupportedIterableToArray.js\");\nvar _unsupportedIterableToArrayJsDefault = parcelHelpers.interopDefault(_unsupportedIterableToArrayJs);\nvar _nonIterableRestJs = require(\"./nonIterableRest.js\");\nvar _nonIterableRestJsDefault = parcelHelpers.interopDefault(_nonIterableRestJs);\nfunction _slicedToArray(arr, i) {\n    return (0, _arrayWithHolesJsDefault.default)(arr) || (0, _iterableToArrayLimitJsDefault.default)(arr, i) || (0, _unsupportedIterableToArrayJsDefault.default)(arr, i) || (0, _nonIterableRestJsDefault.default)();\n}\nexports.default = _slicedToArray;\n\n},{\"./arrayWithHoles.js\":\"8e3d6\",\"./iterableToArrayLimit.js\":\"3Ko5C\",\"./unsupportedIterableToArray.js\":\"jwpEQ\",\"./nonIterableRest.js\":\"7Rs7o\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8e3d6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _arrayWithHoles(arr) {\n    if (Array.isArray(arr)) return arr;\n}\nexports.default = _arrayWithHoles;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Ko5C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _iterableToArrayLimit(arr, i) {\n    var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n    if (_i == null) return;\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _s, _e;\n    try {\n        for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){\n            _arr.push(_s.value);\n            if (i && _arr.length === i) break;\n        }\n    } catch (err) {\n        _d = true;\n        _e = err;\n    } finally{\n        try {\n            if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n        } finally{\n            if (_d) throw _e;\n        }\n    }\n    return _arr;\n}\nexports.default = _iterableToArrayLimit;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Rs7o\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _nonIterableRest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexports.default = _nonIterableRest;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7nRj1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"pushContextState\", ()=>pushContextState);\nparcelHelpers.export(exports, \"popContextState\", ()=>popContextState);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _webglParameterTables = require(\"./webgl-parameter-tables\");\nvar _unifiedParameterApi = require(\"./unified-parameter-api\");\nvar _utils = require(\"../utils\");\nvar global = arguments[3];\nfunction installGetterOverride(gl, functionName) {\n    var originalGetterFunc = gl[functionName].bind(gl);\n    gl[functionName] = function get() {\n        var pname = arguments.length <= 0 ? undefined : arguments[0];\n        if (!(pname in gl.state.cache)) gl.state.cache[pname] = originalGetterFunc.apply(void 0, arguments);\n        return gl.state.enable ? gl.state.cache[pname] : originalGetterFunc.apply(void 0, arguments);\n    };\n    Object.defineProperty(gl[functionName], \"name\", {\n        value: \"\".concat(functionName, \"-from-cache\"),\n        configurable: false\n    });\n}\nfunction installSetterSpy(gl, functionName, setter) {\n    var originalSetterFunc = gl[functionName].bind(gl);\n    gl[functionName] = function set() {\n        for(var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++)params[_key] = arguments[_key];\n        var _setter = setter.apply(void 0, [\n            gl.state._updateCache\n        ].concat(params)), valueChanged = _setter.valueChanged, oldValue = _setter.oldValue;\n        if (valueChanged) originalSetterFunc.apply(void 0, params);\n        return oldValue;\n    };\n    Object.defineProperty(gl[functionName], \"name\", {\n        value: \"\".concat(functionName, \"-to-cache\"),\n        configurable: false\n    });\n}\nfunction installProgramSpy(gl) {\n    var originalUseProgram = gl.useProgram.bind(gl);\n    gl.useProgram = function useProgramLuma(handle) {\n        if (gl.state.program !== handle) {\n            originalUseProgram(handle);\n            gl.state.program = handle;\n        }\n    };\n}\nvar GLState = function() {\n    function GLState1(gl) {\n        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$copyState = _ref.copyState, copyState = _ref$copyState === void 0 ? false : _ref$copyState, _ref$log = _ref.log, log = _ref$log === void 0 ? function() {} : _ref$log;\n        (0, _classCallCheckDefault.default)(this, GLState1);\n        this.gl = gl;\n        this.program = null;\n        this.stateStack = [];\n        this.enable = true;\n        this.cache = copyState ? (0, _unifiedParameterApi.getParameters)(gl) : Object.assign({}, (0, _webglParameterTables.GL_PARAMETER_DEFAULTS));\n        this.log = log;\n        this._updateCache = this._updateCache.bind(this);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(GLState1, [\n        {\n            key: \"push\",\n            value: function push() {\n                var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this.stateStack.push({});\n            }\n        },\n        {\n            key: \"pop\",\n            value: function pop() {\n                (0, _utils.assert)(this.stateStack.length > 0);\n                var oldValues = this.stateStack[this.stateStack.length - 1];\n                (0, _unifiedParameterApi.setParameters)(this.gl, oldValues, this.cache);\n                this.stateStack.pop();\n            }\n        },\n        {\n            key: \"_updateCache\",\n            value: function _updateCache(values) {\n                var valueChanged = false;\n                var oldValue;\n                var oldValues = this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1];\n                for(var key in values){\n                    (0, _utils.assert)(key !== undefined);\n                    var value = values[key];\n                    var cached = this.cache[key];\n                    if (!(0, _utils.deepArrayEqual)(value, cached)) {\n                        valueChanged = true;\n                        oldValue = cached;\n                        if (oldValues && !(key in oldValues)) oldValues[key] = cached;\n                        this.cache[key] = value;\n                    }\n                }\n                return {\n                    valueChanged: valueChanged,\n                    oldValue: oldValue\n                };\n            }\n        }\n    ]);\n    return GLState1;\n}();\nfunction trackContextState(gl) {\n    var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$enable = _ref2.enable, enable = _ref2$enable === void 0 ? true : _ref2$enable, copyState = _ref2.copyState;\n    (0, _utils.assert)(copyState !== undefined);\n    if (!gl.state) {\n        var global_ = typeof global !== \"undefined\" ? global : window;\n        if (global_.polyfillContext) global_.polyfillContext(gl);\n        gl.state = new GLState(gl, {\n            copyState: copyState,\n            enable: enable\n        });\n        installProgramSpy(gl);\n        for(var key in 0, _webglParameterTables.GL_HOOKED_SETTERS){\n            var setter = (0, _webglParameterTables.GL_HOOKED_SETTERS)[key];\n            installSetterSpy(gl, key, setter);\n        }\n        installGetterOverride(gl, \"getParameter\");\n        installGetterOverride(gl, \"isEnabled\");\n    }\n    gl.state.enable = enable;\n    return gl;\n}\nexports.default = trackContextState;\nfunction pushContextState(gl) {\n    if (!gl.state) trackContextState(gl, {\n        copyState: false\n    });\n    gl.state.push();\n}\nfunction popContextState(gl) {\n    (0, _utils.assert)(gl.state);\n    gl.state.pop();\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./webgl-parameter-tables\":\"8m0fy\",\"./unified-parameter-api\":\"ibNMv\",\"../utils\":\"lOb37\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hO8vL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ERR_CONTEXT\", ()=>ERR_CONTEXT);\nparcelHelpers.export(exports, \"ERR_WEBGL\", ()=>ERR_WEBGL);\nparcelHelpers.export(exports, \"ERR_WEBGL2\", ()=>ERR_WEBGL2);\nparcelHelpers.export(exports, \"createGLContext\", ()=>createGLContext);\nparcelHelpers.export(exports, \"instrumentGLContext\", ()=>instrumentGLContext);\nparcelHelpers.export(exports, \"getContextDebugInfo\", ()=>getContextDebugInfo);\nparcelHelpers.export(exports, \"resizeGLContext\", ()=>resizeGLContext);\nvar _env = require(\"probe.gl/env\");\nvar _trackContextState = require(\"../state-tracker/track-context-state\");\nvar _trackContextStateDefault = parcelHelpers.interopDefault(_trackContextState);\nvar _utils = require(\"../utils\");\nvar ERR_CONTEXT = \"Invalid WebGLRenderingContext\";\nvar ERR_WEBGL = ERR_CONTEXT;\nvar ERR_WEBGL2 = \"Requires WebGL2\";\nvar isBrowser = (0, _env.isBrowser)();\nvar isPage = isBrowser && typeof document !== \"undefined\";\nvar CONTEXT_DEFAULTS = {\n    webgl2: true,\n    webgl1: true,\n    throwOnError: true,\n    manageState: true,\n    canvas: null,\n    debug: false,\n    width: 800,\n    height: 600\n};\nfunction createGLContext() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _utils.assert)(isBrowser, \"createGLContext on available in the browser.\\nCreate your own headless context or use 'createHeadlessContext' from @luma.gl/test-utils\");\n    options = Object.assign({}, CONTEXT_DEFAULTS, options);\n    var _options = options, width = _options.width, height = _options.height;\n    function onError(message) {\n        if (options.throwOnError) throw new Error(message);\n        console.error(message);\n        return null;\n    }\n    options.onError = onError;\n    var gl;\n    var _options2 = options, canvas = _options2.canvas;\n    var targetCanvas = getCanvas({\n        canvas: canvas,\n        width: width,\n        height: height,\n        onError: onError\n    });\n    gl = createBrowserContext(targetCanvas, options);\n    if (!gl) return null;\n    gl = instrumentGLContext(gl, options);\n    logInfo(gl);\n    return gl;\n}\nfunction instrumentGLContext(gl) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    if (!gl || gl._instrumented) return gl;\n    gl._version = gl._version || getVersion(gl);\n    gl.luma = gl.luma || {};\n    gl.luma.canvasSizeInfo = gl.luma.canvasSizeInfo || {};\n    options = Object.assign({}, CONTEXT_DEFAULTS, options);\n    var _options3 = options, manageState = _options3.manageState, debug = _options3.debug;\n    if (manageState) (0, _trackContextStateDefault.default)(gl, {\n        copyState: false,\n        log: function log() {\n            for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++)args[_key] = arguments[_key];\n            return (0, _utils.log).log.apply((0, _utils.log), [\n                1\n            ].concat(args))();\n        }\n    });\n    if (isBrowser && debug) {\n        if (!(0, _env.global).makeDebugContext) (0, _utils.log).warn('WebGL debug mode not activated. import \"@luma.gl/debug\" to enable.')();\n        else {\n            gl = (0, _env.global).makeDebugContext(gl, options);\n            (0, _utils.log).level = Math.max((0, _utils.log).level, 1);\n        }\n    }\n    gl._instrumented = true;\n    return gl;\n}\nfunction getContextDebugInfo(gl) {\n    var vendorMasked = gl.getParameter(7936);\n    var rendererMasked = gl.getParameter(7937);\n    var ext = gl.getExtension(\"WEBGL_debug_renderer_info\");\n    var vendorUnmasked = ext && gl.getParameter(ext.UNMASKED_VENDOR_WEBGL || 7936);\n    var rendererUnmasked = ext && gl.getParameter(ext.UNMASKED_RENDERER_WEBGL || 7937);\n    return {\n        vendor: vendorUnmasked || vendorMasked,\n        renderer: rendererUnmasked || rendererMasked,\n        vendorMasked: vendorMasked,\n        rendererMasked: rendererMasked,\n        version: gl.getParameter(7938),\n        shadingLanguageVersion: gl.getParameter(35724)\n    };\n}\nfunction resizeGLContext(gl) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    if (gl.canvas) {\n        var devicePixelRatio = (0, _utils.getDevicePixelRatio)(options.useDevicePixels);\n        setDevicePixelRatio(gl, devicePixelRatio, options);\n        return;\n    }\n    var ext = gl.getExtension(\"STACKGL_resize_drawingbuffer\");\n    if (ext && \"width\" in options && \"height\" in options) ext.resize(options.width, options.height);\n}\nfunction createBrowserContext(canvas, options) {\n    var onError = options.onError;\n    var onCreateError = function onCreateError(error) {\n        return onError(\"WebGL context: \".concat(error.statusMessage || \"error\"));\n    };\n    canvas.addEventListener(\"webglcontextcreationerror\", onCreateError, false);\n    var _options$webgl = options.webgl1, webgl1 = _options$webgl === void 0 ? true : _options$webgl, _options$webgl2 = options.webgl2, webgl2 = _options$webgl2 === void 0 ? true : _options$webgl2;\n    var gl = null;\n    if (webgl2) {\n        gl = gl || canvas.getContext(\"webgl2\", options);\n        gl = gl || canvas.getContext(\"experimental-webgl2\", options);\n    }\n    if (webgl1) {\n        gl = gl || canvas.getContext(\"webgl\", options);\n        gl = gl || canvas.getContext(\"experimental-webgl\", options);\n    }\n    canvas.removeEventListener(\"webglcontextcreationerror\", onCreateError, false);\n    if (!gl) return onError(\"Failed to create \".concat(webgl2 && !webgl1 ? \"WebGL2\" : \"WebGL\", \" context\"));\n    return gl;\n}\nfunction getCanvas(_ref) {\n    var canvas = _ref.canvas, _ref$width = _ref.width, width = _ref$width === void 0 ? 800 : _ref$width, _ref$height = _ref.height, height = _ref$height === void 0 ? 600 : _ref$height, onError = _ref.onError;\n    var targetCanvas;\n    if (typeof canvas === \"string\") {\n        var isPageLoaded = isPage && document.readyState === \"complete\";\n        if (!isPageLoaded) onError(\"createGLContext called on canvas '\".concat(canvas, \"' before page was loaded\"));\n        targetCanvas = document.getElementById(canvas);\n    } else if (canvas) targetCanvas = canvas;\n    else {\n        targetCanvas = document.createElement(\"canvas\");\n        targetCanvas.id = \"lumagl-canvas\";\n        targetCanvas.style.width = Number.isFinite(width) ? \"\".concat(width, \"px\") : \"100%\";\n        targetCanvas.style.height = Number.isFinite(height) ? \"\".concat(height, \"px\") : \"100%\";\n        document.body.insertBefore(targetCanvas, document.body.firstChild);\n    }\n    return targetCanvas;\n}\nfunction logInfo(gl) {\n    var webGL = (0, _utils.isWebGL2)(gl) ? \"WebGL2\" : \"WebGL1\";\n    var info = getContextDebugInfo(gl);\n    var driver = info ? \"(\".concat(info.vendor, \",\").concat(info.renderer, \")\") : \"\";\n    var debug = gl.debug ? \" debug\" : \"\";\n    (0, _utils.log).info(1, \"\".concat(webGL).concat(debug, \" context \").concat(driver))();\n}\nfunction getVersion(gl) {\n    if (typeof WebGL2RenderingContext !== \"undefined\" && gl instanceof WebGL2RenderingContext) return 2;\n    return 1;\n}\nfunction setDevicePixelRatio(gl, devicePixelRatio, options) {\n    var clientWidth = \"width\" in options ? options.width : gl.canvas.clientWidth;\n    var clientHeight = \"height\" in options ? options.height : gl.canvas.clientHeight;\n    if (!clientWidth || !clientHeight) {\n        (0, _utils.log).log(1, \"Canvas clientWidth/clientHeight is 0\")();\n        devicePixelRatio = 1;\n        clientWidth = gl.canvas.width || 1;\n        clientHeight = gl.canvas.height || 1;\n    }\n    gl.luma = gl.luma || {};\n    gl.luma.canvasSizeInfo = gl.luma.canvasSizeInfo || {};\n    var cachedSize = gl.luma.canvasSizeInfo;\n    if (cachedSize.clientWidth !== clientWidth || cachedSize.clientHeight !== clientHeight || cachedSize.devicePixelRatio !== devicePixelRatio) {\n        var clampedPixelRatio = devicePixelRatio;\n        var canvasWidth = Math.floor(clientWidth * clampedPixelRatio);\n        var canvasHeight = Math.floor(clientHeight * clampedPixelRatio);\n        gl.canvas.width = canvasWidth;\n        gl.canvas.height = canvasHeight;\n        if (gl.drawingBufferWidth !== canvasWidth || gl.drawingBufferHeight !== canvasHeight) {\n            (0, _utils.log).warn(\"Device pixel ratio clamped\")();\n            clampedPixelRatio = Math.min(gl.drawingBufferWidth / clientWidth, gl.drawingBufferHeight / clientHeight);\n            gl.canvas.width = Math.floor(clientWidth * clampedPixelRatio);\n            gl.canvas.height = Math.floor(clientHeight * clampedPixelRatio);\n        }\n        Object.assign(gl.luma.canvasSizeInfo, {\n            clientWidth: clientWidth,\n            clientHeight: clientHeight,\n            devicePixelRatio: devicePixelRatio\n        });\n    }\n}\n\n},{\"probe.gl/env\":\"4WXZh\",\"../state-tracker/track-context-state\":\"7nRj1\",\"../utils\":\"lOb37\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7gBVn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"lumaStats\", ()=>(0, _init.lumaStats));\nparcelHelpers.export(exports, \"requestAnimationFrame\", ()=>(0, _requestAnimationFrame.requestAnimationFrame));\nparcelHelpers.export(exports, \"cancelAnimationFrame\", ()=>(0, _requestAnimationFrame.cancelAnimationFrame));\nparcelHelpers.export(exports, \"cloneTextureFrom\", ()=>(0, _textureUtils.cloneTextureFrom));\nparcelHelpers.export(exports, \"getKeyValue\", ()=>(0, _constantsToKeys.getKeyValue));\nparcelHelpers.export(exports, \"getKey\", ()=>(0, _constantsToKeys.getKey));\nparcelHelpers.export(exports, \"getContextInfo\", ()=>(0, _limits.getContextInfo));\nparcelHelpers.export(exports, \"getGLContextInfo\", ()=>(0, _limits.getGLContextInfo));\nparcelHelpers.export(exports, \"getContextLimits\", ()=>(0, _limits.getContextLimits));\nparcelHelpers.export(exports, \"FEATURES\", ()=>(0, _webglFeaturesTable.FEATURES));\nparcelHelpers.export(exports, \"hasFeature\", ()=>(0, _features.hasFeature));\nparcelHelpers.export(exports, \"hasFeatures\", ()=>(0, _features.hasFeatures));\nparcelHelpers.export(exports, \"getFeatures\", ()=>(0, _features.getFeatures));\nparcelHelpers.export(exports, \"canCompileGLGSExtension\", ()=>(0, _checkGlslExtensionDefault.default));\nparcelHelpers.export(exports, \"Accessor\", ()=>(0, _accessorDefault.default));\nparcelHelpers.export(exports, \"Buffer\", ()=>(0, _bufferDefault.default));\nparcelHelpers.export(exports, \"Shader\", ()=>(0, _shader.Shader));\nparcelHelpers.export(exports, \"VertexShader\", ()=>(0, _shader.VertexShader));\nparcelHelpers.export(exports, \"FragmentShader\", ()=>(0, _shader.FragmentShader));\nparcelHelpers.export(exports, \"Program\", ()=>(0, _programDefault.default));\nparcelHelpers.export(exports, \"Framebuffer\", ()=>(0, _framebufferDefault.default));\nparcelHelpers.export(exports, \"Renderbuffer\", ()=>(0, _renderbufferDefault.default));\nparcelHelpers.export(exports, \"Texture2D\", ()=>(0, _texture2DDefault.default));\nparcelHelpers.export(exports, \"TextureCube\", ()=>(0, _textureCubeDefault.default));\nparcelHelpers.export(exports, \"clear\", ()=>(0, _clear.clear));\nparcelHelpers.export(exports, \"clearBuffer\", ()=>(0, _clear.clearBuffer));\nparcelHelpers.export(exports, \"readPixelsToArray\", ()=>(0, _copyAndBlit.readPixelsToArray));\nparcelHelpers.export(exports, \"readPixelsToBuffer\", ()=>(0, _copyAndBlit.readPixelsToBuffer));\nparcelHelpers.export(exports, \"copyToDataUrl\", ()=>(0, _copyAndBlit.copyToDataUrl));\nparcelHelpers.export(exports, \"copyToImage\", ()=>(0, _copyAndBlit.copyToImage));\nparcelHelpers.export(exports, \"copyToTexture\", ()=>(0, _copyAndBlit.copyToTexture));\nparcelHelpers.export(exports, \"blit\", ()=>(0, _copyAndBlit.blit));\nparcelHelpers.export(exports, \"Query\", ()=>(0, _queryDefault.default));\nparcelHelpers.export(exports, \"Texture3D\", ()=>(0, _texture3DDefault.default));\nparcelHelpers.export(exports, \"TransformFeedback\", ()=>(0, _transformFeedbackDefault.default));\nparcelHelpers.export(exports, \"VertexArrayObject\", ()=>(0, _vertexArrayObjectDefault.default));\nparcelHelpers.export(exports, \"VertexArray\", ()=>(0, _vertexArrayDefault.default));\nparcelHelpers.export(exports, \"UniformBufferLayout\", ()=>(0, _uniformBufferLayoutDefault.default));\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>(0, _loadFile.setPathPrefix));\nparcelHelpers.export(exports, \"loadFile\", ()=>(0, _loadFile.loadFile));\nparcelHelpers.export(exports, \"loadImage\", ()=>(0, _loadFile.loadImage));\nparcelHelpers.export(exports, \"getShaderName\", ()=>(0, _getShaderNameDefault.default));\nparcelHelpers.export(exports, \"getShaderVersion\", ()=>(0, _getShaderVersionDefault.default));\nparcelHelpers.export(exports, \"log\", ()=>(0, _gltools.log));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nparcelHelpers.export(exports, \"uid\", ()=>(0, _utils.uid));\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>(0, _utils.isObjectEmpty));\nparcelHelpers.export(exports, \"parseUniformName\", ()=>(0, _uniforms.parseUniformName));\nparcelHelpers.export(exports, \"getUniformSetter\", ()=>(0, _uniforms.getUniformSetter));\nparcelHelpers.export(exports, \"getDebugTableForUniforms\", ()=>(0, _debugUniforms.getDebugTableForUniforms));\nparcelHelpers.export(exports, \"getDebugTableForVertexArray\", ()=>(0, _debugVertexArray.getDebugTableForVertexArray));\nparcelHelpers.export(exports, \"getDebugTableForProgramConfiguration\", ()=>(0, _debugProgramConfiguration.getDebugTableForProgramConfiguration));\nvar _init = require(\"./init\");\nvar _requestAnimationFrame = require(\"./webgl-utils/request-animation-frame\");\nvar _textureUtils = require(\"./webgl-utils/texture-utils\");\nvar _constantsToKeys = require(\"./webgl-utils/constants-to-keys\");\nvar _limits = require(\"./features/limits\");\nvar _webglFeaturesTable = require(\"./features/webgl-features-table\");\nvar _features = require(\"./features/features\");\nvar _checkGlslExtension = require(\"./features/check-glsl-extension\");\nvar _checkGlslExtensionDefault = parcelHelpers.interopDefault(_checkGlslExtension);\nvar _accessor = require(\"./classes/accessor\");\nvar _accessorDefault = parcelHelpers.interopDefault(_accessor);\nvar _buffer = require(\"./classes/buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _shader = require(\"./classes/shader\");\nvar _program = require(\"./classes/program\");\nvar _programDefault = parcelHelpers.interopDefault(_program);\nvar _framebuffer = require(\"./classes/framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _renderbuffer = require(\"./classes/renderbuffer\");\nvar _renderbufferDefault = parcelHelpers.interopDefault(_renderbuffer);\nvar _texture2D = require(\"./classes/texture-2d\");\nvar _texture2DDefault = parcelHelpers.interopDefault(_texture2D);\nvar _textureCube = require(\"./classes/texture-cube\");\nvar _textureCubeDefault = parcelHelpers.interopDefault(_textureCube);\nvar _clear = require(\"./classes/clear\");\nvar _copyAndBlit = require(\"./classes/copy-and-blit\");\nvar _query = require(\"./classes/query\");\nvar _queryDefault = parcelHelpers.interopDefault(_query);\nvar _texture3D = require(\"./classes/texture-3d\");\nvar _texture3DDefault = parcelHelpers.interopDefault(_texture3D);\nvar _transformFeedback = require(\"./classes/transform-feedback\");\nvar _transformFeedbackDefault = parcelHelpers.interopDefault(_transformFeedback);\nvar _vertexArrayObject = require(\"./classes/vertex-array-object\");\nvar _vertexArrayObjectDefault = parcelHelpers.interopDefault(_vertexArrayObject);\nvar _vertexArray = require(\"./classes/vertex-array\");\nvar _vertexArrayDefault = parcelHelpers.interopDefault(_vertexArray);\nvar _uniformBufferLayout = require(\"./classes/uniform-buffer-layout\");\nvar _uniformBufferLayoutDefault = parcelHelpers.interopDefault(_uniformBufferLayout);\nvar _loadFile = require(\"./utils/load-file\");\nvar _getShaderName = require(\"./glsl-utils/get-shader-name\");\nvar _getShaderNameDefault = parcelHelpers.interopDefault(_getShaderName);\nvar _getShaderVersion = require(\"./glsl-utils/get-shader-version\");\nvar _getShaderVersionDefault = parcelHelpers.interopDefault(_getShaderVersion);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _assert = require(\"./utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _utils = require(\"./utils/utils\");\nvar _uniforms = require(\"./classes/uniforms\");\nvar _debugUniforms = require(\"./debug/debug-uniforms\");\nvar _debugVertexArray = require(\"./debug/debug-vertex-array\");\nvar _debugProgramConfiguration = require(\"./debug/debug-program-configuration\");\n\n},{\"./init\":\"5yVKQ\",\"./webgl-utils/request-animation-frame\":\"b5IYg\",\"./webgl-utils/texture-utils\":\"6cScQ\",\"./webgl-utils/constants-to-keys\":\"juwY4\",\"./features/limits\":false,\"./features/webgl-features-table\":\"7Ryrb\",\"./features/features\":\"2wucn\",\"./features/check-glsl-extension\":false,\"./classes/accessor\":\"dlKlM\",\"./classes/buffer\":\"98zcF\",\"./classes/shader\":\"JIn1p\",\"./classes/program\":\"je3o0\",\"./classes/framebuffer\":\"62K0L\",\"./classes/renderbuffer\":\"am3Nj\",\"./classes/texture-2d\":\"82MrD\",\"./classes/texture-cube\":\"bQu89\",\"./classes/clear\":\"bsboh\",\"./classes/copy-and-blit\":\"2xoyG\",\"./classes/query\":\"kXVBY\",\"./classes/texture-3d\":\"j82Gz\",\"./classes/transform-feedback\":\"ftDTD\",\"./classes/vertex-array-object\":\"eAFK7\",\"./classes/vertex-array\":\"jfSJa\",\"./classes/uniform-buffer-layout\":false,\"./utils/load-file\":\"6omqp\",\"./glsl-utils/get-shader-name\":\"fe3Q6\",\"./glsl-utils/get-shader-version\":\"6Hh5D\",\"@luma.gl/gltools\":\"grcb8\",\"./utils/assert\":\"lMkUn\",\"./utils/utils\":\"cRYxr\",\"./classes/uniforms\":\"c7cHF\",\"./debug/debug-uniforms\":\"j7rOp\",\"./debug/debug-vertex-array\":\"dQgkU\",\"./debug/debug-program-configuration\":\"2FA46\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5yVKQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"lumaStats\", ()=>lumaStats);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _probeGl = require(\"probe.gl\");\nvar _env = require(\"probe.gl/env\");\nvar VERSION = \"8.3.1\";\nvar STARTUP_MESSAGE = \"set luma.log.level=1 (or higher) to trace rendering\";\nvar StatsManager = function() {\n    function StatsManager1() {\n        (0, _classCallCheckDefault.default)(this, StatsManager1);\n        this.stats = new Map();\n    }\n    (0, _createClassDefault.default)(StatsManager1, [\n        {\n            key: \"get\",\n            value: function get(name) {\n                if (!this.stats.has(name)) this.stats.set(name, new (0, _probeGl.Stats)({\n                    id: name\n                }));\n                return this.stats.get(name);\n            }\n        }\n    ]);\n    return StatsManager1;\n}();\nvar lumaStats = new StatsManager();\nif ((0, _env.global).luma && (0, _env.global).luma.VERSION !== VERSION) throw new Error(\"luma.gl - multiple VERSIONs detected: \".concat((0, _env.global).luma.VERSION, \" vs \").concat(VERSION));\nif (!(0, _env.global).luma) {\n    if ((0, _env.isBrowser)()) (0, _gltools.log).log(1, \"luma.gl \".concat(VERSION, \" - \").concat(STARTUP_MESSAGE))();\n    (0, _env.global).luma = (0, _env.global).luma || {\n        VERSION: VERSION,\n        version: VERSION,\n        log: (0, _gltools.log),\n        stats: lumaStats,\n        globals: {\n            modules: {},\n            nodeIO: {}\n        }\n    };\n}\nexports.default = (0, _env.global).luma;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/gltools\":\"grcb8\",\"probe.gl\":\"f91qf\",\"probe.gl/env\":\"4WXZh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b5IYg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"requestAnimationFrame\", ()=>requestAnimationFrame);\nparcelHelpers.export(exports, \"cancelAnimationFrame\", ()=>cancelAnimationFrame);\nfunction requestAnimationFrame(callback) {\n    return typeof window !== \"undefined\" && window.requestAnimationFrame ? window.requestAnimationFrame(callback) : setTimeout(callback, 1000 / 60);\n}\nfunction cancelAnimationFrame(timerId) {\n    return typeof window !== \"undefined\" && window.cancelAnimationFrame ? window.cancelAnimationFrame(timerId) : clearTimeout(timerId);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6cScQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cloneTextureFrom\", ()=>cloneTextureFrom);\nparcelHelpers.export(exports, \"toFramebuffer\", ()=>toFramebuffer);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _texture2D = require(\"../classes/texture-2d\");\nvar _texture2DDefault = parcelHelpers.interopDefault(_texture2D);\nvar _textureCube = require(\"../classes/texture-cube\");\nvar _textureCubeDefault = parcelHelpers.interopDefault(_textureCube);\nvar _texture3D = require(\"../classes/texture-3d\");\nvar _texture3DDefault = parcelHelpers.interopDefault(_texture3D);\nvar _framebuffer = require(\"../classes/framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _utils = require(\"../utils\");\nfunction cloneTextureFrom(refTexture, overrides) {\n    (0, _utils.assert)(refTexture instanceof (0, _texture2DDefault.default) || refTexture instanceof (0, _textureCubeDefault.default) || refTexture instanceof (0, _texture3DDefault.default));\n    var TextureType = refTexture.constructor;\n    var gl = refTexture.gl, width = refTexture.width, height = refTexture.height, format = refTexture.format, type = refTexture.type, dataFormat = refTexture.dataFormat, border = refTexture.border, mipmaps = refTexture.mipmaps;\n    var textureOptions = Object.assign({\n        width: width,\n        height: height,\n        format: format,\n        type: type,\n        dataFormat: dataFormat,\n        border: border,\n        mipmaps: mipmaps\n    }, overrides);\n    return new TextureType(gl, textureOptions);\n}\nfunction toFramebuffer(texture, opts) {\n    var gl = texture.gl, width = texture.width, height = texture.height, id = texture.id;\n    var framebuffer = new (0, _framebufferDefault.default)(gl, Object.assign({}, opts, {\n        id: \"framebuffer-for-\".concat(id),\n        width: width,\n        height: height,\n        attachments: (0, _definePropertyDefault.default)({}, 36064, texture)\n    }));\n    return framebuffer;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../classes/texture-2d\":\"82MrD\",\"../classes/texture-cube\":\"bQu89\",\"../classes/texture-3d\":\"j82Gz\",\"../classes/framebuffer\":\"62K0L\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"82MrD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Texture2D);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _loadFile = require(\"../utils/load-file\");\nvar Texture2D = function(_Texture) {\n    (0, _inheritsDefault.default)(Texture2D1, _Texture);\n    (0, _createClassDefault.default)(Texture2D1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl, opts) {\n                return (0, _textureDefault.default).isSupported(gl, opts);\n            }\n        }\n    ]);\n    function Texture2D1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Texture2D1);\n        (0, _webglUtils.assertWebGLContext)(gl);\n        if (props instanceof Promise || typeof props === \"string\") props = {\n            data: props\n        };\n        if (typeof props.data === \"string\") props = Object.assign({}, props, {\n            data: (0, _loadFile.loadImage)(props.data)\n        });\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Texture2D1).call(this, gl, Object.assign({}, props, {\n            target: 3553\n        })));\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    return Texture2D1;\n}((0, _textureDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./texture\":\"e0vyJ\",\"../webgl-utils\":\"c96L8\",\"../utils/load-file\":\"6omqp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6HRPt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _typeofJs = require(\"./typeof.js\");\nvar _typeofJsDefault = parcelHelpers.interopDefault(_typeofJs);\nvar _assertThisInitializedJs = require(\"./assertThisInitialized.js\");\nvar _assertThisInitializedJsDefault = parcelHelpers.interopDefault(_assertThisInitializedJs);\nfunction _possibleConstructorReturn(self, call) {\n    if (call && ((0, _typeofJsDefault.default)(call) === \"object\" || typeof call === \"function\")) return call;\n    else if (call !== void 0) throw new TypeError(\"Derived constructors may only return object or undefined\");\n    return (0, _assertThisInitializedJsDefault.default)(self);\n}\nexports.default = _possibleConstructorReturn;\n\n},{\"./typeof.js\":\"1p2Zr\",\"./assertThisInitialized.js\":\"l7Ppm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l7Ppm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _assertThisInitialized(self) {\n    if (self === void 0) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n    return self;\n}\nexports.default = _assertThisInitialized;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3gKMG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _getPrototypeOf(o1) {\n    _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n        return o.__proto__ || Object.getPrototypeOf(o);\n    };\n    return _getPrototypeOf(o1);\n}\nexports.default = _getPrototypeOf;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jPqq4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _setPrototypeOfJs = require(\"./setPrototypeOf.js\");\nvar _setPrototypeOfJsDefault = parcelHelpers.interopDefault(_setPrototypeOfJs);\nfunction _inherits(subClass, superClass) {\n    if (typeof superClass !== \"function\" && superClass !== null) throw new TypeError(\"Super expression must either be null or a function\");\n    subClass.prototype = Object.create(superClass && superClass.prototype, {\n        constructor: {\n            value: subClass,\n            writable: true,\n            configurable: true\n        }\n    });\n    Object.defineProperty(subClass, \"prototype\", {\n        writable: false\n    });\n    if (superClass) (0, _setPrototypeOfJsDefault.default)(subClass, superClass);\n}\nexports.default = _inherits;\n\n},{\"./setPrototypeOf.js\":\"9qmcb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9qmcb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _setPrototypeOf(o1, p1) {\n    _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n        o.__proto__ = p;\n        return o;\n    };\n    return _setPrototypeOf(o1, p1);\n}\nexports.default = _setPrototypeOf;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e0vyJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Texture);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _textureFormats = require(\"./texture-formats\");\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _env = require(\"probe.gl/env\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar NPOT_MIN_FILTERS = [\n    9729,\n    9728\n];\nvar WebGLBuffer = (0, _env.global).WebGLBuffer || function WebGLBuffer() {};\nvar Texture = function(_Resource) {\n    (0, _inheritsDefault.default)(Texture1, _Resource);\n    (0, _createClassDefault.default)(Texture1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, format = _ref.format, linearFiltering = _ref.linearFiltering;\n                var supported = true;\n                if (format) {\n                    supported = supported && (0, _textureFormats.isFormatSupported)(gl, format);\n                    supported = supported && (!linearFiltering || (0, _textureFormats.isLinearFilteringSupported)(gl, format));\n                }\n                return supported;\n            }\n        }\n    ]);\n    function Texture1(gl, props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, Texture1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _utils.uid)(\"texture\") : _props$id, handle = props.handle, target = props.target;\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Texture1).call(this, gl, {\n            id: id,\n            handle: handle\n        }));\n        _this.target = target;\n        _this.textureUnit = undefined;\n        _this.loaded = false;\n        _this.width = undefined;\n        _this.height = undefined;\n        _this.depth = undefined;\n        _this.format = undefined;\n        _this.type = undefined;\n        _this.dataFormat = undefined;\n        _this.border = undefined;\n        _this.textureUnit = undefined;\n        _this.mipmaps = undefined;\n        return _this;\n    }\n    (0, _createClassDefault.default)(Texture1, [\n        {\n            key: \"toString\",\n            value: function toString() {\n                return \"Texture(\".concat(this.id, \",\").concat(this.width, \"x\").concat(this.height, \")\");\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var _this2 = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var data = props.data;\n                if (data instanceof Promise) {\n                    data.then(function(resolvedImageData) {\n                        return _this2.initialize(Object.assign({}, props, {\n                            pixels: resolvedImageData,\n                            data: resolvedImageData\n                        }));\n                    });\n                    return this;\n                }\n                var _props$pixels = props.pixels, pixels = _props$pixels === void 0 ? null : _props$pixels, _props$format = props.format, format = _props$format === void 0 ? 6408 : _props$format, _props$border = props.border, border = _props$border === void 0 ? 0 : _props$border, _props$recreate = props.recreate, recreate = _props$recreate === void 0 ? false : _props$recreate, _props$parameters = props.parameters, parameters = _props$parameters === void 0 ? {} : _props$parameters, _props$pixelStore = props.pixelStore, pixelStore = _props$pixelStore === void 0 ? {} : _props$pixelStore, _props$textureUnit = props.textureUnit, textureUnit = _props$textureUnit === void 0 ? undefined : _props$textureUnit;\n                var _props$mipmaps = props.mipmaps, mipmaps = _props$mipmaps === void 0 ? true : _props$mipmaps;\n                if (!data) data = pixels;\n                var width = props.width, height = props.height, dataFormat = props.dataFormat, type = props.type;\n                var _props$depth = props.depth, depth = _props$depth === void 0 ? 0 : _props$depth;\n                var _this$_deduceParamete = this._deduceParameters({\n                    format: format,\n                    type: type,\n                    dataFormat: dataFormat,\n                    compressed: false,\n                    data: data,\n                    width: width,\n                    height: height\n                });\n                width = _this$_deduceParamete.width;\n                height = _this$_deduceParamete.height;\n                dataFormat = _this$_deduceParamete.dataFormat;\n                type = _this$_deduceParamete.type;\n                this.width = width;\n                this.height = height;\n                this.depth = depth;\n                this.format = format;\n                this.type = type;\n                this.dataFormat = dataFormat;\n                this.border = border;\n                this.textureUnit = textureUnit;\n                if (Number.isFinite(this.textureUnit)) {\n                    this.gl.activeTexture(33984 + this.textureUnit);\n                    this.gl.bindTexture(this.target, this.handle);\n                }\n                if (mipmaps && this._isNPOT()) {\n                    (0, _gltools.log).warn(\"texture: \".concat(this, \" is Non-Power-Of-Two, disabling mipmaping\"))();\n                    mipmaps = false;\n                    this._updateForNPOT(parameters);\n                }\n                this.mipmaps = mipmaps;\n                this.setImageData({\n                    data: data,\n                    width: width,\n                    height: height,\n                    depth: depth,\n                    format: format,\n                    type: type,\n                    dataFormat: dataFormat,\n                    border: border,\n                    mipmaps: mipmaps,\n                    parameters: pixelStore\n                });\n                if (mipmaps) this.generateMipmap();\n                this.setParameters(parameters);\n                if (recreate) this.data = data;\n                return this;\n            }\n        },\n        {\n            key: \"resize\",\n            value: function resize(_ref2) {\n                var height = _ref2.height, width = _ref2.width, _ref2$mipmaps = _ref2.mipmaps, mipmaps = _ref2$mipmaps === void 0 ? false : _ref2$mipmaps;\n                if (width !== this.width || height !== this.height) return this.initialize({\n                    width: width,\n                    height: height,\n                    format: this.format,\n                    type: this.type,\n                    dataFormat: this.dataFormat,\n                    border: this.border,\n                    mipmaps: mipmaps\n                });\n                return this;\n            }\n        },\n        {\n            key: \"generateMipmap\",\n            value: function generateMipmap() {\n                var _this3 = this;\n                var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (this._isNPOT()) {\n                    (0, _gltools.log).warn(\"texture: \".concat(this, \" is Non-Power-Of-Two, disabling mipmaping\"))();\n                    return this;\n                }\n                this.mipmaps = true;\n                this.gl.bindTexture(this.target, this.handle);\n                (0, _gltools.withParameters)(this.gl, params, function() {\n                    _this3.gl.generateMipmap(_this3.target);\n                });\n                this.gl.bindTexture(this.target, null);\n                return this;\n            }\n        },\n        {\n            key: \"setImageData\",\n            value: function setImageData(options) {\n                this._trackDeallocatedMemory(\"Texture\");\n                var _options$target = options.target, target = _options$target === void 0 ? this.target : _options$target, _options$pixels = options.pixels, pixels = _options$pixels === void 0 ? null : _options$pixels, _options$level = options.level, level = _options$level === void 0 ? 0 : _options$level, _options$format = options.format, format = _options$format === void 0 ? this.format : _options$format, _options$border = options.border, border = _options$border === void 0 ? this.border : _options$border, _options$offset = options.offset, offset = _options$offset === void 0 ? 0 : _options$offset, _options$parameters = options.parameters, parameters = _options$parameters === void 0 ? {} : _options$parameters;\n                var _options$data = options.data, data = _options$data === void 0 ? null : _options$data, _options$type = options.type, type = _options$type === void 0 ? this.type : _options$type, _options$width = options.width, width = _options$width === void 0 ? this.width : _options$width, _options$height = options.height, height = _options$height === void 0 ? this.height : _options$height, _options$dataFormat = options.dataFormat, dataFormat = _options$dataFormat === void 0 ? this.dataFormat : _options$dataFormat, _options$compressed = options.compressed, compressed = _options$compressed === void 0 ? false : _options$compressed;\n                if (!data) data = pixels;\n                var _this$_deduceParamete2 = this._deduceParameters({\n                    format: format,\n                    type: type,\n                    dataFormat: dataFormat,\n                    compressed: compressed,\n                    data: data,\n                    width: width,\n                    height: height\n                });\n                type = _this$_deduceParamete2.type;\n                dataFormat = _this$_deduceParamete2.dataFormat;\n                compressed = _this$_deduceParamete2.compressed;\n                width = _this$_deduceParamete2.width;\n                height = _this$_deduceParamete2.height;\n                var gl = this.gl;\n                gl.bindTexture(this.target, this.handle);\n                var dataType = null;\n                var _this$_getDataType = this._getDataType({\n                    data: data,\n                    compressed: compressed\n                });\n                data = _this$_getDataType.data;\n                dataType = _this$_getDataType.dataType;\n                (0, _gltools.withParameters)(this.gl, parameters, function() {\n                    switch(dataType){\n                        case \"null\":\n                            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data);\n                            break;\n                        case \"typed-array\":\n                            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data, offset);\n                            break;\n                        case \"buffer\":\n                            (0, _webglUtils.assertWebGL2Context)(gl);\n                            gl.bindBuffer(35052, data.handle || data);\n                            gl.texImage2D(target, level, format, width, height, border, dataFormat, type, offset);\n                            gl.bindBuffer(35052, null);\n                            break;\n                        case \"browser-object\":\n                            if ((0, _gltools.isWebGL2)(gl)) gl.texImage2D(target, level, format, width, height, border, dataFormat, type, data);\n                            else gl.texImage2D(target, level, format, dataFormat, type, data);\n                            break;\n                        case \"compressed\":\n                            gl.compressedTexImage2D(target, level, format, width, height, border, data);\n                            break;\n                        default:\n                            (0, _utils.assert)(false, \"Unknown image data type\");\n                    }\n                });\n                if (data && data.byteLength) this._trackAllocatedMemory(data.byteLength, \"Texture\");\n                else {\n                    var channels = (0, _textureFormats.DATA_FORMAT_CHANNELS)[this.dataFormat] || 4;\n                    var channelSize = (0, _textureFormats.TYPE_SIZES)[this.type] || 1;\n                    this._trackAllocatedMemory(this.width * this.height * channels * channelSize, \"Texture\");\n                }\n                this.loaded = true;\n                return this;\n            }\n        },\n        {\n            key: \"setSubImageData\",\n            value: function setSubImageData(_ref3) {\n                var _this4 = this;\n                var _ref3$target = _ref3.target, target = _ref3$target === void 0 ? this.target : _ref3$target, _ref3$pixels = _ref3.pixels, pixels = _ref3$pixels === void 0 ? null : _ref3$pixels, _ref3$data = _ref3.data, data = _ref3$data === void 0 ? null : _ref3$data, _ref3$x = _ref3.x, x = _ref3$x === void 0 ? 0 : _ref3$x, _ref3$y = _ref3.y, y = _ref3$y === void 0 ? 0 : _ref3$y, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? this.width : _ref3$width, _ref3$height = _ref3.height, height = _ref3$height === void 0 ? this.height : _ref3$height, _ref3$level = _ref3.level, level = _ref3$level === void 0 ? 0 : _ref3$level, _ref3$format = _ref3.format, format = _ref3$format === void 0 ? this.format : _ref3$format, _ref3$type = _ref3.type, type = _ref3$type === void 0 ? this.type : _ref3$type, _ref3$dataFormat = _ref3.dataFormat, dataFormat = _ref3$dataFormat === void 0 ? this.dataFormat : _ref3$dataFormat, _ref3$compressed = _ref3.compressed, compressed = _ref3$compressed === void 0 ? false : _ref3$compressed, _ref3$offset = _ref3.offset, offset = _ref3$offset === void 0 ? 0 : _ref3$offset, _ref3$border = _ref3.border, border = _ref3$border === void 0 ? this.border : _ref3$border, _ref3$parameters = _ref3.parameters, parameters = _ref3$parameters === void 0 ? {} : _ref3$parameters;\n                var _this$_deduceParamete3 = this._deduceParameters({\n                    format: format,\n                    type: type,\n                    dataFormat: dataFormat,\n                    compressed: compressed,\n                    data: data,\n                    width: width,\n                    height: height\n                });\n                type = _this$_deduceParamete3.type;\n                dataFormat = _this$_deduceParamete3.dataFormat;\n                compressed = _this$_deduceParamete3.compressed;\n                width = _this$_deduceParamete3.width;\n                height = _this$_deduceParamete3.height;\n                (0, _utils.assert)(this.depth === 0, \"texSubImage not supported for 3D textures\");\n                if (!data) data = pixels;\n                if (data && data.data) {\n                    var ndarray = data;\n                    data = ndarray.data;\n                    width = ndarray.shape[0];\n                    height = ndarray.shape[1];\n                }\n                if (data instanceof (0, _bufferDefault.default)) data = data.handle;\n                this.gl.bindTexture(this.target, this.handle);\n                (0, _gltools.withParameters)(this.gl, parameters, function() {\n                    if (compressed) _this4.gl.compressedTexSubImage2D(target, level, x, y, width, height, format, data);\n                    else if (data === null) _this4.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, null);\n                    else if (ArrayBuffer.isView(data)) _this4.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data, offset);\n                    else if (data instanceof WebGLBuffer) {\n                        (0, _webglUtils.assertWebGL2Context)(_this4.gl);\n                        _this4.gl.bindBuffer(35052, data);\n                        _this4.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, offset);\n                        _this4.gl.bindBuffer(35052, null);\n                    } else if ((0, _gltools.isWebGL2)(_this4.gl)) _this4.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data);\n                    else _this4.gl.texSubImage2D(target, level, x, y, dataFormat, type, data);\n                });\n                this.gl.bindTexture(this.target, null);\n            }\n        },\n        {\n            key: \"copyFramebuffer\",\n            value: function copyFramebuffer() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Texture.copyFramebuffer({...}) is no logner supported, use copyToTexture(source, target, opts})\")();\n                return null;\n            }\n        },\n        {\n            key: \"getActiveUnit\",\n            value: function getActiveUnit() {\n                return this.gl.getParameter(34016) - 33984;\n            }\n        },\n        {\n            key: \"bind\",\n            value: function bind() {\n                var textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;\n                var gl = this.gl;\n                if (textureUnit !== undefined) {\n                    this.textureUnit = textureUnit;\n                    gl.activeTexture(33984 + textureUnit);\n                }\n                gl.bindTexture(this.target, this.handle);\n                return textureUnit;\n            }\n        },\n        {\n            key: \"unbind\",\n            value: function unbind() {\n                var textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;\n                var gl = this.gl;\n                if (textureUnit !== undefined) {\n                    this.textureUnit = textureUnit;\n                    gl.activeTexture(33984 + textureUnit);\n                }\n                gl.bindTexture(this.target, null);\n                return textureUnit;\n            }\n        },\n        {\n            key: \"_getDataType\",\n            value: function _getDataType(_ref4) {\n                var data = _ref4.data, _ref4$compressed = _ref4.compressed, compressed = _ref4$compressed === void 0 ? false : _ref4$compressed;\n                if (compressed) return {\n                    data: data,\n                    dataType: \"compressed\"\n                };\n                if (data === null) return {\n                    data: data,\n                    dataType: \"null\"\n                };\n                if (ArrayBuffer.isView(data)) return {\n                    data: data,\n                    dataType: \"typed-array\"\n                };\n                if (data instanceof (0, _bufferDefault.default)) return {\n                    data: data.handle,\n                    dataType: \"buffer\"\n                };\n                if (data instanceof WebGLBuffer) return {\n                    data: data,\n                    dataType: \"buffer\"\n                };\n                return {\n                    data: data,\n                    dataType: \"browser-object\"\n                };\n            }\n        },\n        {\n            key: \"_deduceParameters\",\n            value: function _deduceParameters(opts) {\n                var format = opts.format, data = opts.data;\n                var width = opts.width, height = opts.height, dataFormat = opts.dataFormat, type = opts.type, compressed = opts.compressed;\n                var textureFormat = (0, _textureFormats.TEXTURE_FORMATS)[format];\n                dataFormat = dataFormat || textureFormat && textureFormat.dataFormat;\n                type = type || textureFormat && textureFormat.types[0];\n                compressed = compressed || textureFormat && textureFormat.compressed;\n                var _this$_deduceImageSiz = this._deduceImageSize(data, width, height);\n                width = _this$_deduceImageSiz.width;\n                height = _this$_deduceImageSiz.height;\n                return {\n                    dataFormat: dataFormat,\n                    type: type,\n                    compressed: compressed,\n                    width: width,\n                    height: height,\n                    format: format,\n                    data: data\n                };\n            }\n        },\n        {\n            key: \"_deduceImageSize\",\n            value: function _deduceImageSize(data, width, height) {\n                var size;\n                if (typeof ImageData !== \"undefined\" && data instanceof ImageData) size = {\n                    width: data.width,\n                    height: data.height\n                };\n                else if (typeof HTMLImageElement !== \"undefined\" && data instanceof HTMLImageElement) size = {\n                    width: data.naturalWidth,\n                    height: data.naturalHeight\n                };\n                else if (typeof HTMLCanvasElement !== \"undefined\" && data instanceof HTMLCanvasElement) size = {\n                    width: data.width,\n                    height: data.height\n                };\n                else if (typeof ImageBitmap !== \"undefined\" && data instanceof ImageBitmap) size = {\n                    width: data.width,\n                    height: data.height\n                };\n                else if (typeof HTMLVideoElement !== \"undefined\" && data instanceof HTMLVideoElement) size = {\n                    width: data.videoWidth,\n                    height: data.videoHeight\n                };\n                else if (!data) size = {\n                    width: width >= 0 ? width : 1,\n                    height: height >= 0 ? height : 1\n                };\n                else size = {\n                    width: width,\n                    height: height\n                };\n                (0, _utils.assert)(size, \"Could not deduced texture size\");\n                (0, _utils.assert)(width === undefined || size.width === width, \"Deduced texture width does not match supplied width\");\n                (0, _utils.assert)(height === undefined || size.height === height, \"Deduced texture height does not match supplied height\");\n                return size;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createTexture();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteTexture(this.handle);\n                this._trackDeallocatedMemory(\"Texture\");\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname) {\n                switch(pname){\n                    case 4096:\n                        return this.width;\n                    case 4097:\n                        return this.height;\n                    default:\n                        this.gl.bindTexture(this.target, this.handle);\n                        var value = this.gl.getTexParameter(this.target, pname);\n                        this.gl.bindTexture(this.target, null);\n                        return value;\n                }\n            }\n        },\n        {\n            key: \"_setParameter\",\n            value: function _setParameter(pname, param) {\n                this.gl.bindTexture(this.target, this.handle);\n                param = this._getNPOTParam(pname, param);\n                switch(pname){\n                    case 33082:\n                    case 33083:\n                        this.gl.texParameterf(this.handle, pname, param);\n                        break;\n                    case 4096:\n                    case 4097:\n                        (0, _utils.assert)(false);\n                        break;\n                    default:\n                        this.gl.texParameteri(this.target, pname, param);\n                        break;\n                }\n                this.gl.bindTexture(this.target, null);\n                return this;\n            }\n        },\n        {\n            key: \"_isNPOT\",\n            value: function _isNPOT() {\n                if ((0, _gltools.isWebGL2)(this.gl)) return false;\n                if (!this.width || !this.height) return false;\n                return !(0, _utils.isPowerOfTwo)(this.width) || !(0, _utils.isPowerOfTwo)(this.height);\n            }\n        },\n        {\n            key: \"_updateForNPOT\",\n            value: function _updateForNPOT(parameters) {\n                if (parameters[this.gl.TEXTURE_MIN_FILTER] === undefined) parameters[this.gl.TEXTURE_MIN_FILTER] = this.gl.LINEAR;\n                if (parameters[this.gl.TEXTURE_WRAP_S] === undefined) parameters[this.gl.TEXTURE_WRAP_S] = this.gl.CLAMP_TO_EDGE;\n                if (parameters[this.gl.TEXTURE_WRAP_T] === undefined) parameters[this.gl.TEXTURE_WRAP_T] = this.gl.CLAMP_TO_EDGE;\n            }\n        },\n        {\n            key: \"_getNPOTParam\",\n            value: function _getNPOTParam(pname, param) {\n                if (this._isNPOT()) switch(pname){\n                    case 10241:\n                        if (NPOT_MIN_FILTERS.indexOf(param) === -1) param = 9729;\n                        break;\n                    case 10242:\n                    case 10243:\n                        if (param !== 33071) param = 33071;\n                        break;\n                    default:\n                        break;\n                }\n                return param;\n            }\n        }\n    ]);\n    return Texture1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./resource\":\"1yIzW\",\"./buffer\":\"98zcF\",\"./texture-formats\":\"gR89D\",\"@luma.gl/gltools\":\"grcb8\",\"probe.gl/env\":\"4WXZh\",\"../webgl-utils\":\"c96L8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1yIzW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Resource);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _init = require(\"../init\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar ERR_RESOURCE_METHOD_UNDEFINED = \"Resource subclass must define virtual methods\";\nvar Resource = function() {\n    function Resource1(gl) {\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Resource1);\n        (0, _webglUtils.assertWebGLContext)(gl);\n        var id = opts.id, _opts$userData = opts.userData, userData = _opts$userData === void 0 ? {} : _opts$userData;\n        this.gl = gl;\n        this.id = id || (0, _utils.uid)(this.constructor.name);\n        this.userData = userData;\n        this._bound = false;\n        this._handle = opts.handle;\n        if (this._handle === undefined) this._handle = this._createHandle();\n        this.byteLength = 0;\n        this._addStats();\n    }\n    (0, _createClassDefault.default)(Resource1, [\n        {\n            key: \"toString\",\n            value: function toString() {\n                return \"\".concat(this.constructor.name, \"(\").concat(this.id, \")\");\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$deleteChildren = _ref.deleteChildren, deleteChildren = _ref$deleteChildren === void 0 ? false : _ref$deleteChildren;\n                var children = this._handle && this._deleteHandle(this._handle);\n                if (this._handle) this._removeStats();\n                this._handle = null;\n                if (children && deleteChildren) children.filter(Boolean).forEach(function(child) {\n                    child[\"delete\"]();\n                });\n                return this;\n            }\n        },\n        {\n            key: \"bind\",\n            value: function bind() {\n                var funcOrHandle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.handle;\n                if (typeof funcOrHandle !== \"function\") {\n                    this._bindHandle(funcOrHandle);\n                    return this;\n                }\n                var value;\n                if (!this._bound) {\n                    this._bindHandle(this.handle);\n                    this._bound = true;\n                    value = funcOrHandle();\n                    this._bound = false;\n                    this._bindHandle(null);\n                } else value = funcOrHandle();\n                return value;\n            }\n        },\n        {\n            key: \"unbind\",\n            value: function unbind() {\n                this.bind(null);\n            }\n        },\n        {\n            key: \"getParameter\",\n            value: function getParameter(pname) {\n                var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                pname = (0, _webglUtils.getKeyValue)(this.gl, pname);\n                (0, _utils.assert)(pname);\n                var parameters = this.constructor.PARAMETERS || {};\n                var parameter = parameters[pname];\n                if (parameter) {\n                    var isWebgl2 = (0, _gltools.isWebGL2)(this.gl);\n                    var parameterAvailable = (!(\"webgl2\" in parameter) || isWebgl2) && (!(\"extension\" in parameter) || this.gl.getExtension(parameter.extension));\n                    if (!parameterAvailable) {\n                        var webgl1Default = parameter.webgl1;\n                        var webgl2Default = \"webgl2\" in parameter ? parameter.webgl2 : parameter.webgl1;\n                        var defaultValue = isWebgl2 ? webgl2Default : webgl1Default;\n                        return defaultValue;\n                    }\n                }\n                return this._getParameter(pname, opts);\n            }\n        },\n        {\n            key: \"getParameters\",\n            value: function getParameters() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _ref2 = {}, parameters = _ref2.parameters, keys = _ref2.keys;\n                var PARAMETERS = this.constructor.PARAMETERS || {};\n                var isWebgl2 = (0, _gltools.isWebGL2)(this.gl);\n                var values = {};\n                var parameterKeys = parameters || Object.keys(PARAMETERS);\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = parameterKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var pname = _step.value;\n                        var parameter = PARAMETERS[pname];\n                        var parameterAvailable = parameter && (!(\"webgl2\" in parameter) || isWebgl2) && (!(\"extension\" in parameter) || this.gl.getExtension(parameter.extension));\n                        if (parameterAvailable) {\n                            var key = keys ? (0, _webglUtils.getKey)(this.gl, pname) : pname;\n                            values[key] = this.getParameter(pname, opts);\n                            if (keys && parameter.type === \"GLenum\") values[key] = (0, _webglUtils.getKey)(this.gl, values[key]);\n                        }\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                return values;\n            }\n        },\n        {\n            key: \"setParameter\",\n            value: function setParameter(pname, value) {\n                pname = (0, _webglUtils.getKeyValue)(this.gl, pname);\n                (0, _utils.assert)(pname);\n                var parameters = this.constructor.PARAMETERS || {};\n                var parameter = parameters[pname];\n                if (parameter) {\n                    var isWebgl2 = (0, _gltools.isWebGL2)(this.gl);\n                    var parameterAvailable = (!(\"webgl2\" in parameter) || isWebgl2) && (!(\"extension\" in parameter) || this.gl.getExtension(parameter.extension));\n                    if (!parameterAvailable) throw new Error(\"Parameter not available on this platform\");\n                    if (parameter.type === \"GLenum\") value = (0, _webglUtils.getKeyValue)(value);\n                }\n                this._setParameter(pname, value);\n                return this;\n            }\n        },\n        {\n            key: \"setParameters\",\n            value: function setParameters(parameters) {\n                for(var pname in parameters)this.setParameter(pname, parameters[pname]);\n                return this;\n            }\n        },\n        {\n            key: \"stubRemovedMethods\",\n            value: function stubRemovedMethods(className, version, methodNames) {\n                return (0, _utils.stubRemovedMethods)(this, className, version, methodNames);\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize(opts) {}\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle() {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_getOptsFromHandle\",\n            value: function _getOptsFromHandle() {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname, opts) {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_setParameter\",\n            value: function _setParameter(pname, value) {\n                throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n            }\n        },\n        {\n            key: \"_context\",\n            value: function _context() {\n                this.gl.luma = this.gl.luma || {};\n                return this.gl.luma;\n            }\n        },\n        {\n            key: \"_addStats\",\n            value: function _addStats() {\n                var name = this.constructor.name;\n                var stats = (0, _init.lumaStats).get(\"Resource Counts\");\n                stats.get(\"Resources Created\").incrementCount();\n                stats.get(\"\".concat(name, \"s Created\")).incrementCount();\n                stats.get(\"\".concat(name, \"s Active\")).incrementCount();\n            }\n        },\n        {\n            key: \"_removeStats\",\n            value: function _removeStats() {\n                var name = this.constructor.name;\n                var stats = (0, _init.lumaStats).get(\"Resource Counts\");\n                stats.get(\"\".concat(name, \"s Active\")).decrementCount();\n            }\n        },\n        {\n            key: \"_trackAllocatedMemory\",\n            value: function _trackAllocatedMemory(bytes) {\n                var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.name;\n                var stats = (0, _init.lumaStats).get(\"Memory Usage\");\n                stats.get(\"GPU Memory\").addCount(bytes);\n                stats.get(\"\".concat(name, \" Memory\")).addCount(bytes);\n                this.byteLength = bytes;\n            }\n        },\n        {\n            key: \"_trackDeallocatedMemory\",\n            value: function _trackDeallocatedMemory() {\n                var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.constructor.name;\n                var stats = (0, _init.lumaStats).get(\"Memory Usage\");\n                stats.get(\"GPU Memory\").subtractCount(this.byteLength);\n                stats.get(\"\".concat(name, \" Memory\")).subtractCount(this.byteLength);\n                this.byteLength = 0;\n            }\n        },\n        {\n            key: \"handle\",\n            get: function get() {\n                return this._handle;\n            }\n        }\n    ]);\n    return Resource1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/gltools\":\"grcb8\",\"../init\":\"5yVKQ\",\"../webgl-utils\":\"c96L8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c96L8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assertWebGLContext\", ()=>(0, _webglChecks.assertWebGLContext));\nparcelHelpers.export(exports, \"assertWebGL2Context\", ()=>(0, _webglChecks.assertWebGL2Context));\nparcelHelpers.export(exports, \"requestAnimationFrame\", ()=>(0, _requestAnimationFrame.requestAnimationFrame));\nparcelHelpers.export(exports, \"cancelAnimationFrame\", ()=>(0, _requestAnimationFrame.cancelAnimationFrame));\nparcelHelpers.export(exports, \"getGLTypeFromTypedArray\", ()=>(0, _typedArrayUtils.getGLTypeFromTypedArray));\nparcelHelpers.export(exports, \"getTypedArrayFromGLType\", ()=>(0, _typedArrayUtils.getTypedArrayFromGLType));\nparcelHelpers.export(exports, \"flipRows\", ()=>(0, _typedArrayUtils.flipRows));\nparcelHelpers.export(exports, \"scalePixels\", ()=>(0, _typedArrayUtils.scalePixels));\nparcelHelpers.export(exports, \"getKeyValue\", ()=>(0, _constantsToKeys.getKeyValue));\nparcelHelpers.export(exports, \"getKey\", ()=>(0, _constantsToKeys.getKey));\nparcelHelpers.export(exports, \"getKeyType\", ()=>(0, _constantsToKeys.getKeyType));\nparcelHelpers.export(exports, \"cloneTextureFrom\", ()=>(0, _textureUtils.cloneTextureFrom));\nvar _webglChecks = require(\"./webgl-checks\");\nvar _requestAnimationFrame = require(\"./request-animation-frame\");\nvar _typedArrayUtils = require(\"./typed-array-utils\");\nvar _constantsToKeys = require(\"./constants-to-keys\");\nvar _textureUtils = require(\"./texture-utils\");\n\n},{\"./webgl-checks\":\"1j2y6\",\"./request-animation-frame\":\"b5IYg\",\"./typed-array-utils\":\"j7A6U\",\"./constants-to-keys\":\"juwY4\",\"./texture-utils\":\"6cScQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1j2y6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ERR_CONTEXT\", ()=>ERR_CONTEXT);\nparcelHelpers.export(exports, \"ERR_WEBGL\", ()=>ERR_WEBGL);\nparcelHelpers.export(exports, \"ERR_WEBGL2\", ()=>ERR_WEBGL2);\nparcelHelpers.export(exports, \"assertWebGLContext\", ()=>assertWebGLContext);\nparcelHelpers.export(exports, \"assertWebGL2Context\", ()=>assertWebGL2Context);\nvar _utils = require(\"../utils\");\nvar _gltools = require(\"@luma.gl/gltools\");\nvar ERR_CONTEXT = \"Invalid WebGLRenderingContext\";\nvar ERR_WEBGL = ERR_CONTEXT;\nvar ERR_WEBGL2 = \"Requires WebGL2\";\nfunction assertWebGLContext(gl) {\n    (0, _utils.assert)((0, _gltools.isWebGL)(gl), ERR_CONTEXT);\n}\nfunction assertWebGL2Context(gl) {\n    (0, _utils.assert)((0, _gltools.isWebGL2)(gl), ERR_WEBGL2);\n}\n\n},{\"../utils\":\"dIy34\",\"@luma.gl/gltools\":\"grcb8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dIy34\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nparcelHelpers.export(exports, \"isOldIE\", ()=>(0, _isOldIeDefault.default));\nparcelHelpers.export(exports, \"uid\", ()=>(0, _utils.uid));\nparcelHelpers.export(exports, \"isPowerOfTwo\", ()=>(0, _utils.isPowerOfTwo));\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>(0, _utils.isObjectEmpty));\nparcelHelpers.export(exports, \"formatValue\", ()=>(0, _formatValue.formatValue));\nparcelHelpers.export(exports, \"stubRemovedMethods\", ()=>(0, _stubMethods.stubRemovedMethods));\nparcelHelpers.export(exports, \"checkProps\", ()=>(0, _checkProps.checkProps));\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _isOldIe = require(\"./is-old-ie\");\nvar _isOldIeDefault = parcelHelpers.interopDefault(_isOldIe);\nvar _utils = require(\"./utils\");\nvar _formatValue = require(\"./format-value\");\nvar _stubMethods = require(\"./stub-methods\");\nvar _checkProps = require(\"./check-props\");\n\n},{\"./assert\":\"lMkUn\",\"./is-old-ie\":false,\"./utils\":\"cRYxr\",\"./format-value\":\"k6XGf\",\"./stub-methods\":\"Nc3co\",\"./check-props\":\"kuIji\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lMkUn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"luma.gl: assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cRYxr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"uid\", ()=>uid);\nparcelHelpers.export(exports, \"isPowerOfTwo\", ()=>isPowerOfTwo);\nparcelHelpers.export(exports, \"isObjectEmpty\", ()=>isObjectEmpty);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar uidCounters = {};\nfunction uid() {\n    var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"id\";\n    uidCounters[id] = uidCounters[id] || 1;\n    var count = uidCounters[id]++;\n    return \"\".concat(id, \"-\").concat(count);\n}\nfunction isPowerOfTwo(n) {\n    (0, _assertDefault.default)(typeof n === \"number\", \"Input must be a number\");\n    return n && (n & n - 1) === 0;\n}\nfunction isObjectEmpty(obj) {\n    var isEmpty = true;\n    for(var key in obj){\n        isEmpty = false;\n        break;\n    }\n    return isEmpty;\n}\n\n},{\"./assert\":\"lMkUn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k6XGf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatValue\", ()=>formatValue);\nfunction formatArrayValue(v, opts) {\n    var _opts$maxElts = opts.maxElts, maxElts = _opts$maxElts === void 0 ? 16 : _opts$maxElts, _opts$size = opts.size, size = _opts$size === void 0 ? 1 : _opts$size;\n    var string = \"[\";\n    for(var i = 0; i < v.length && i < maxElts; ++i){\n        if (i > 0) string += \",\".concat(i % size === 0 ? \" \" : \"\");\n        string += formatValue(v[i], opts);\n    }\n    var terminator = v.length > maxElts ? \"...\" : \"]\";\n    return \"\".concat(string).concat(terminator);\n}\nfunction formatValue(v) {\n    var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var EPSILON = 1e-16;\n    var _opts$isInteger = opts.isInteger, isInteger = _opts$isInteger === void 0 ? false : _opts$isInteger;\n    if (Array.isArray(v) || ArrayBuffer.isView(v)) return formatArrayValue(v, opts);\n    if (!Number.isFinite(v)) return String(v);\n    if (Math.abs(v) < EPSILON) return isInteger ? \"0\" : \"0.\";\n    if (isInteger) return v.toFixed(0);\n    if (Math.abs(v) > 100 && Math.abs(v) < 10000) return v.toFixed(0);\n    var string = v.toPrecision(2);\n    var decimal = string.indexOf(\".0\");\n    return decimal === string.length - 2 ? string.slice(0, -1) : string;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Nc3co\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"stubRemovedMethods\", ()=>stubRemovedMethods);\nvar _gltools = require(\"@luma.gl/gltools\");\nfunction stubRemovedMethods(instance, className, version, methodNames) {\n    var upgradeMessage = \"See luma.gl \".concat(version, \" Upgrade Guide at https://luma.gl/docs/upgrade-guide\");\n    var prototype = Object.getPrototypeOf(instance);\n    methodNames.forEach(function(methodName) {\n        if (prototype.methodName) return;\n        prototype[methodName] = function() {\n            (0, _gltools.log).removed(\"Calling removed method \".concat(className, \".\").concat(methodName, \": \"), upgradeMessage)();\n            throw new Error(methodName);\n        };\n    });\n}\n\n},{\"@luma.gl/gltools\":\"grcb8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kuIji\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"checkProps\", ()=>checkProps);\nvar _gltools = require(\"@luma.gl/gltools\");\nfunction checkProps(className, props, propChecks) {\n    var _propChecks$removedPr = propChecks.removedProps, removedProps = _propChecks$removedPr === void 0 ? {} : _propChecks$removedPr, _propChecks$deprecate = propChecks.deprecatedProps, deprecatedProps = _propChecks$deprecate === void 0 ? {} : _propChecks$deprecate, _propChecks$replacedP = propChecks.replacedProps, replacedProps = _propChecks$replacedP === void 0 ? {} : _propChecks$replacedP;\n    for(var propName in removedProps)if (propName in props) {\n        var replacementProp = removedProps[propName];\n        var replacement = replacementProp ? \"\".concat(className, \".\").concat(removedProps[propName]) : \"N/A\";\n        (0, _gltools.log).removed(\"\".concat(className, \".\").concat(propName), replacement)();\n    }\n    for(var _propName in deprecatedProps)if (_propName in props) {\n        var _replacementProp = deprecatedProps[_propName];\n        (0, _gltools.log).deprecated(\"\".concat(className, \".\").concat(_propName), \"\".concat(className, \".\").concat(_replacementProp))();\n    }\n    var newProps = null;\n    for(var _propName2 in replacedProps)if (_propName2 in props) {\n        var _replacementProp2 = replacedProps[_propName2];\n        (0, _gltools.log).deprecated(\"\".concat(className, \".\").concat(_propName2), \"\".concat(className, \".\").concat(_replacementProp2))();\n        newProps = newProps || Object.assign({}, props);\n        newProps[_replacementProp2] = props[_propName2];\n        delete newProps[_propName2];\n    }\n    return newProps || props;\n}\n\n},{\"@luma.gl/gltools\":\"grcb8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j7A6U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getGLTypeFromTypedArray\", ()=>getGLTypeFromTypedArray);\nparcelHelpers.export(exports, \"getTypedArrayFromGLType\", ()=>getTypedArrayFromGLType);\nparcelHelpers.export(exports, \"flipRows\", ()=>flipRows);\nparcelHelpers.export(exports, \"scalePixels\", ()=>scalePixels);\nvar ERR_TYPE_DEDUCTION = \"Failed to deduce GL constant from typed array\";\nfunction getGLTypeFromTypedArray(arrayOrType) {\n    var type = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;\n    switch(type){\n        case Float32Array:\n            return 5126;\n        case Uint16Array:\n            return 5123;\n        case Uint32Array:\n            return 5125;\n        case Uint8Array:\n            return 5121;\n        case Uint8ClampedArray:\n            return 5121;\n        case Int8Array:\n            return 5120;\n        case Int16Array:\n            return 5122;\n        case Int32Array:\n            return 5124;\n        default:\n            throw new Error(ERR_TYPE_DEDUCTION);\n    }\n}\nfunction getTypedArrayFromGLType(glType) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$clamped = _ref.clamped, clamped = _ref$clamped === void 0 ? true : _ref$clamped;\n    switch(glType){\n        case 5126:\n            return Float32Array;\n        case 5123:\n        case 33635:\n        case 32819:\n        case 32820:\n            return Uint16Array;\n        case 5125:\n            return Uint32Array;\n        case 5121:\n            return clamped ? Uint8ClampedArray : Uint8Array;\n        case 5120:\n            return Int8Array;\n        case 5122:\n            return Int16Array;\n        case 5124:\n            return Int32Array;\n        default:\n            throw new Error(\"Failed to deduce typed array type from GL constant\");\n    }\n}\nfunction flipRows(_ref2) {\n    var data = _ref2.data, width = _ref2.width, height = _ref2.height, _ref2$bytesPerPixel = _ref2.bytesPerPixel, bytesPerPixel = _ref2$bytesPerPixel === void 0 ? 4 : _ref2$bytesPerPixel, temp = _ref2.temp;\n    var bytesPerRow = width * bytesPerPixel;\n    temp = temp || new Uint8Array(bytesPerRow);\n    for(var y = 0; y < height / 2; ++y){\n        var topOffset = y * bytesPerRow;\n        var bottomOffset = (height - y - 1) * bytesPerRow;\n        temp.set(data.subarray(topOffset, topOffset + bytesPerRow));\n        data.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow);\n        data.set(temp, bottomOffset);\n    }\n}\nfunction scalePixels(_ref3) {\n    var data = _ref3.data, width = _ref3.width, height = _ref3.height;\n    var newWidth = Math.round(width / 2);\n    var newHeight = Math.round(height / 2);\n    var newData = new Uint8Array(newWidth * newHeight * 4);\n    for(var y = 0; y < newHeight; y++){\n        for(var x = 0; x < newWidth; x++)for(var c = 0; c < 4; c++)newData[(y * newWidth + x) * 4 + c] = data[(y * 2 * width + x * 2) * 4 + c];\n    }\n    return {\n        data: newData,\n        width: newWidth,\n        height: newHeight\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"juwY4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getKeyValue\", ()=>getKeyValue);\nparcelHelpers.export(exports, \"getKey\", ()=>getKey);\nparcelHelpers.export(exports, \"getKeyType\", ()=>getKeyType);\nvar _utils = require(\"../utils\");\nfunction getKeyValue(gl, name) {\n    if (typeof name !== \"string\") return name;\n    var number = Number(name);\n    if (!isNaN(number)) return number;\n    name = name.replace(/^.*\\./, \"\");\n    var value = gl[name];\n    (0, _utils.assert)(value !== undefined, \"Accessing undefined constant GL.\".concat(name));\n    return value;\n}\nfunction getKey(gl, value) {\n    value = Number(value);\n    for(var key in gl){\n        if (gl[key] === value) return \"GL.\".concat(key);\n    }\n    return String(value);\n}\nfunction getKeyType(gl, value) {\n    (0, _utils.assert)(value !== undefined, \"undefined key\");\n    value = Number(value);\n    for(var key in gl){\n        if (gl[key] === value) return \"GL.\".concat(key);\n    }\n    return String(value);\n}\n\n},{\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"98zcF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Buffer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _accessor = require(\"./accessor\");\nvar _accessorDefault = parcelHelpers.interopDefault(_accessor);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _utils = require(\"../utils\");\nvar DEBUG_DATA_LENGTH = 10;\nvar DEPRECATED_PROPS = {\n    offset: \"accessor.offset\",\n    stride: \"accessor.stride\",\n    type: \"accessor.type\",\n    size: \"accessor.size\",\n    divisor: \"accessor.divisor\",\n    normalized: \"accessor.normalized\",\n    integer: \"accessor.integer\",\n    instanced: \"accessor.divisor\",\n    isInstanced: \"accessor.divisor\"\n};\nvar PROP_CHECKS_INITIALIZE = {\n    removedProps: {},\n    replacedProps: {\n        bytes: \"byteLength\"\n    },\n    deprecatedProps: DEPRECATED_PROPS\n};\nvar PROP_CHECKS_SET_PROPS = {\n    removedProps: DEPRECATED_PROPS\n};\nvar Buffer = function(_Resource) {\n    (0, _inheritsDefault.default)(Buffer1, _Resource);\n    function Buffer1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Buffer1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Buffer1).call(this, gl, props));\n        _this.stubRemovedMethods(\"Buffer\", \"v6.0\", [\n            \"layout\",\n            \"setLayout\",\n            \"getIndexedParameter\"\n        ]);\n        _this.target = props.target || (_this.gl.webgl2 ? 36662 : 34962);\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Buffer1, [\n        {\n            key: \"getElementCount\",\n            value: function getElementCount() {\n                var accessor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.accessor;\n                return Math.round(this.byteLength / (0, _accessorDefault.default).getBytesPerElement(accessor));\n            }\n        },\n        {\n            key: \"getVertexCount\",\n            value: function getVertexCount() {\n                var accessor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.accessor;\n                return Math.round(this.byteLength / (0, _accessorDefault.default).getBytesPerVertex(accessor));\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (ArrayBuffer.isView(props)) props = {\n                    data: props\n                };\n                if (Number.isFinite(props)) props = {\n                    byteLength: props\n                };\n                props = (0, _utils.checkProps)(\"Buffer\", props, PROP_CHECKS_INITIALIZE);\n                this.usage = props.usage || 35044;\n                this.debugData = null;\n                this.setAccessor(Object.assign({}, props, props.accessor));\n                if (props.data) this._setData(props.data, props.offset, props.byteLength);\n                else this._setByteLength(props.byteLength || 0);\n                return this;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                props = (0, _utils.checkProps)(\"Buffer\", props, PROP_CHECKS_SET_PROPS);\n                if (\"accessor\" in props) this.setAccessor(props.accessor);\n                return this;\n            }\n        },\n        {\n            key: \"setAccessor\",\n            value: function setAccessor(accessor) {\n                accessor = Object.assign({}, accessor);\n                delete accessor.buffer;\n                this.accessor = new (0, _accessorDefault.default)(accessor);\n                return this;\n            }\n        },\n        {\n            key: \"reallocate\",\n            value: function reallocate(byteLength) {\n                if (byteLength > this.byteLength) {\n                    this._setByteLength(byteLength);\n                    return true;\n                }\n                this.bytesUsed = byteLength;\n                return false;\n            }\n        },\n        {\n            key: \"setData\",\n            value: function setData(props) {\n                return this.initialize(props);\n            }\n        },\n        {\n            key: \"subData\",\n            value: function subData(props) {\n                if (ArrayBuffer.isView(props)) props = {\n                    data: props\n                };\n                var _props = props, data = _props.data, _props$offset = _props.offset, offset = _props$offset === void 0 ? 0 : _props$offset, _props$srcOffset = _props.srcOffset, srcOffset = _props$srcOffset === void 0 ? 0 : _props$srcOffset;\n                var byteLength = props.byteLength || props.length;\n                (0, _utils.assert)(data);\n                var target = this.gl.webgl2 ? 36663 : this.target;\n                this.gl.bindBuffer(target, this.handle);\n                if (srcOffset !== 0 || byteLength !== undefined) {\n                    (0, _webglUtils.assertWebGL2Context)(this.gl);\n                    this.gl.bufferSubData(this.target, offset, data, srcOffset, byteLength);\n                } else this.gl.bufferSubData(target, offset, data);\n                this.gl.bindBuffer(target, null);\n                this.debugData = null;\n                this._inferType(data);\n                return this;\n            }\n        },\n        {\n            key: \"copyData\",\n            value: function copyData(_ref) {\n                var sourceBuffer = _ref.sourceBuffer, _ref$readOffset = _ref.readOffset, readOffset = _ref$readOffset === void 0 ? 0 : _ref$readOffset, _ref$writeOffset = _ref.writeOffset, writeOffset = _ref$writeOffset === void 0 ? 0 : _ref$writeOffset, size = _ref.size;\n                var gl = this.gl;\n                (0, _webglUtils.assertWebGL2Context)(gl);\n                gl.bindBuffer(36662, sourceBuffer.handle);\n                gl.bindBuffer(36663, this.handle);\n                gl.copyBufferSubData(36662, 36663, readOffset, writeOffset, size);\n                gl.bindBuffer(36662, null);\n                gl.bindBuffer(36663, null);\n                this.debugData = null;\n                return this;\n            }\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$dstData = _ref2.dstData, dstData = _ref2$dstData === void 0 ? null : _ref2$dstData, _ref2$srcByteOffset = _ref2.srcByteOffset, srcByteOffset = _ref2$srcByteOffset === void 0 ? 0 : _ref2$srcByteOffset, _ref2$dstOffset = _ref2.dstOffset, dstOffset = _ref2$dstOffset === void 0 ? 0 : _ref2$dstOffset, _ref2$length = _ref2.length, length = _ref2$length === void 0 ? 0 : _ref2$length;\n                (0, _webglUtils.assertWebGL2Context)(this.gl);\n                var ArrayType = (0, _webglUtils.getTypedArrayFromGLType)(this.accessor.type || 5126, {\n                    clamped: false\n                });\n                var sourceAvailableElementCount = this._getAvailableElementCount(srcByteOffset);\n                var dstElementOffset = dstOffset;\n                var dstAvailableElementCount;\n                var dstElementCount;\n                if (dstData) {\n                    dstElementCount = dstData.length;\n                    dstAvailableElementCount = dstElementCount - dstElementOffset;\n                } else {\n                    dstAvailableElementCount = Math.min(sourceAvailableElementCount, length || sourceAvailableElementCount);\n                    dstElementCount = dstElementOffset + dstAvailableElementCount;\n                }\n                var copyElementCount = Math.min(sourceAvailableElementCount, dstAvailableElementCount);\n                length = length || copyElementCount;\n                (0, _utils.assert)(length <= copyElementCount);\n                dstData = dstData || new ArrayType(dstElementCount);\n                this.gl.bindBuffer(36662, this.handle);\n                this.gl.getBufferSubData(36662, srcByteOffset, dstData, dstOffset, length);\n                this.gl.bindBuffer(36662, null);\n                return dstData;\n            }\n        },\n        {\n            key: \"bind\",\n            value: function bind() {\n                var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref3$target = _ref3.target, target = _ref3$target === void 0 ? this.target : _ref3$target, _ref3$index = _ref3.index, index = _ref3$index === void 0 ? this.accessor && this.accessor.index : _ref3$index, _ref3$offset = _ref3.offset, offset = _ref3$offset === void 0 ? 0 : _ref3$offset, size = _ref3.size;\n                if (target === 35345 || target === 35982) {\n                    if (size !== undefined) this.gl.bindBufferRange(target, index, this.handle, offset, size);\n                    else {\n                        (0, _utils.assert)(offset === 0);\n                        this.gl.bindBufferBase(target, index, this.handle);\n                    }\n                } else this.gl.bindBuffer(target, this.handle);\n                return this;\n            }\n        },\n        {\n            key: \"unbind\",\n            value: function unbind() {\n                var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref4$target = _ref4.target, target = _ref4$target === void 0 ? this.target : _ref4$target, _ref4$index = _ref4.index, index = _ref4$index === void 0 ? this.accessor && this.accessor.index : _ref4$index;\n                var isIndexedBuffer = target === 35345 || target === 35982;\n                if (isIndexedBuffer) this.gl.bindBufferBase(target, index, null);\n                else this.gl.bindBuffer(target, null);\n                return this;\n            }\n        },\n        {\n            key: \"getDebugData\",\n            value: function getDebugData() {\n                if (!this.debugData) {\n                    this.debugData = this.getData({\n                        length: Math.min(DEBUG_DATA_LENGTH, this.byteLength)\n                    });\n                    return {\n                        data: this.debugData,\n                        changed: true\n                    };\n                }\n                return {\n                    data: this.debugData,\n                    changed: false\n                };\n            }\n        },\n        {\n            key: \"invalidateDebugData\",\n            value: function invalidateDebugData() {\n                this.debugData = null;\n            }\n        },\n        {\n            key: \"_setData\",\n            value: function _setData(data) {\n                var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n                var byteLength = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : data.byteLength + offset;\n                (0, _utils.assert)(ArrayBuffer.isView(data));\n                this._trackDeallocatedMemory();\n                var target = this._getTarget();\n                this.gl.bindBuffer(target, this.handle);\n                this.gl.bufferData(target, byteLength, this.usage);\n                this.gl.bufferSubData(target, offset, data);\n                this.gl.bindBuffer(target, null);\n                this.debugData = data.slice(0, DEBUG_DATA_LENGTH);\n                this.bytesUsed = byteLength;\n                this._trackAllocatedMemory(byteLength);\n                var type = (0, _webglUtils.getGLTypeFromTypedArray)(data);\n                (0, _utils.assert)(type);\n                this.setAccessor(new (0, _accessorDefault.default)(this.accessor, {\n                    type: type\n                }));\n                return this;\n            }\n        },\n        {\n            key: \"_setByteLength\",\n            value: function _setByteLength(byteLength) {\n                var usage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.usage;\n                (0, _utils.assert)(byteLength >= 0);\n                this._trackDeallocatedMemory();\n                var data = byteLength;\n                if (byteLength === 0) data = new Float32Array(0);\n                var target = this._getTarget();\n                this.gl.bindBuffer(target, this.handle);\n                this.gl.bufferData(target, data, usage);\n                this.gl.bindBuffer(target, null);\n                this.usage = usage;\n                this.debugData = null;\n                this.bytesUsed = byteLength;\n                this._trackAllocatedMemory(byteLength);\n                return this;\n            }\n        },\n        {\n            key: \"_getTarget\",\n            value: function _getTarget() {\n                return this.gl.webgl2 ? 36663 : this.target;\n            }\n        },\n        {\n            key: \"_getAvailableElementCount\",\n            value: function _getAvailableElementCount(srcByteOffset) {\n                var ArrayType = (0, _webglUtils.getTypedArrayFromGLType)(this.accessor.type || 5126, {\n                    clamped: false\n                });\n                var sourceElementOffset = srcByteOffset / ArrayType.BYTES_PER_ELEMENT;\n                return this.getElementCount() - sourceElementOffset;\n            }\n        },\n        {\n            key: \"_inferType\",\n            value: function _inferType(data) {\n                if (!this.accessor.type) this.setAccessor(new (0, _accessorDefault.default)(this.accessor, {\n                    type: (0, _webglUtils.getGLTypeFromTypedArray)(data)\n                }));\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createBuffer();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteBuffer(this.handle);\n                this._trackDeallocatedMemory();\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname) {\n                this.gl.bindBuffer(this.target, this.handle);\n                var value = this.gl.getBufferParameter(this.target, pname);\n                this.gl.bindBuffer(this.target, null);\n                return value;\n            }\n        },\n        {\n            key: \"setByteLength\",\n            value: function setByteLength(byteLength) {\n                (0, _gltools.log).deprecated(\"setByteLength\", \"reallocate\")();\n                return this.reallocate(byteLength);\n            }\n        },\n        {\n            key: \"updateAccessor\",\n            value: function updateAccessor(opts) {\n                (0, _gltools.log).deprecated(\"updateAccessor(...)\", \"setAccessor(new Accessor(buffer.accessor, ...)\")();\n                this.accessor = new (0, _accessorDefault.default)(this.accessor, opts);\n                return this;\n            }\n        },\n        {\n            key: \"type\",\n            get: function get() {\n                (0, _gltools.log).deprecated(\"Buffer.type\", \"Buffer.accessor.type\")();\n                return this.accessor.type;\n            }\n        },\n        {\n            key: \"bytes\",\n            get: function get() {\n                (0, _gltools.log).deprecated(\"Buffer.bytes\", \"Buffer.byteLength\")();\n                return this.byteLength;\n            }\n        }\n    ]);\n    return Buffer1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./resource\":\"1yIzW\",\"./accessor\":\"dlKlM\",\"../webgl-utils\":\"c96L8\",\"@luma.gl/gltools\":\"grcb8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dlKlM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Accessor);\nparcelHelpers.export(exports, \"DEFAULT_ACCESSOR_VALUES\", ()=>DEFAULT_ACCESSOR_VALUES);\nvar _construct = require(\"@babel/runtime/helpers/esm/construct\");\nvar _constructDefault = parcelHelpers.interopDefault(_construct);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar DEFAULT_ACCESSOR_VALUES = {\n    offset: 0,\n    stride: 0,\n    type: 5126,\n    size: 1,\n    divisor: 0,\n    normalized: false,\n    integer: false\n};\nvar PROP_CHECKS = {\n    deprecatedProps: {\n        instanced: \"divisor\",\n        isInstanced: \"divisor\"\n    }\n};\nvar Accessor = function() {\n    (0, _createClassDefault.default)(Accessor1, null, [\n        {\n            key: \"getBytesPerElement\",\n            value: function getBytesPerElement(accessor) {\n                var ArrayType = (0, _webglUtils.getTypedArrayFromGLType)(accessor.type || 5126);\n                return ArrayType.BYTES_PER_ELEMENT;\n            }\n        },\n        {\n            key: \"getBytesPerVertex\",\n            value: function getBytesPerVertex(accessor) {\n                (0, _utils.assert)(accessor.size);\n                var ArrayType = (0, _webglUtils.getTypedArrayFromGLType)(accessor.type || 5126);\n                return ArrayType.BYTES_PER_ELEMENT * accessor.size;\n            }\n        },\n        {\n            key: \"resolve\",\n            value: function resolve() {\n                for(var _len = arguments.length, accessors = new Array(_len), _key = 0; _key < _len; _key++)accessors[_key] = arguments[_key];\n                return (0, _constructDefault.default)(Accessor1, [\n                    DEFAULT_ACCESSOR_VALUES\n                ].concat(accessors));\n            }\n        }\n    ]);\n    function Accessor1() {\n        var _this = this;\n        (0, _classCallCheckDefault.default)(this, Accessor1);\n        for(var _len2 = arguments.length, accessors = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++)accessors[_key2] = arguments[_key2];\n        accessors.forEach(function(accessor) {\n            return _this._assign(accessor);\n        });\n        Object.freeze(this);\n    }\n    (0, _createClassDefault.default)(Accessor1, [\n        {\n            key: \"toString\",\n            value: function toString() {\n                return JSON.stringify(this);\n            }\n        },\n        {\n            key: \"_assign\",\n            value: function _assign() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                props = (0, _utils.checkProps)(\"Accessor\", props, PROP_CHECKS);\n                if (props.type !== undefined) {\n                    this.type = props.type;\n                    if (props.type === 5124 || props.type === 5125) this.integer = true;\n                }\n                if (props.size !== undefined) this.size = props.size;\n                if (props.offset !== undefined) this.offset = props.offset;\n                if (props.stride !== undefined) this.stride = props.stride;\n                if (props.normalized !== undefined) this.normalized = props.normalized;\n                if (props.integer !== undefined) this.integer = props.integer;\n                if (props.divisor !== undefined) this.divisor = props.divisor;\n                if (props.buffer !== undefined) this.buffer = props.buffer;\n                if (props.index !== undefined) {\n                    if (typeof index === \"boolean\") this.index = props.index ? 1 : 0;\n                    else this.index = props.index;\n                }\n                if (props.instanced !== undefined) this.divisor = props.instanced ? 1 : 0;\n                if (props.isInstanced !== undefined) this.divisor = props.isInstanced ? 1 : 0;\n                return this;\n            }\n        },\n        {\n            key: \"BYTES_PER_ELEMENT\",\n            get: function get() {\n                return Accessor1.getBytesPerElement(this);\n            }\n        },\n        {\n            key: \"BYTES_PER_VERTEX\",\n            get: function get() {\n                return Accessor1.getBytesPerVertex(this);\n            }\n        }\n    ]);\n    return Accessor1;\n}();\n\n},{\"@babel/runtime/helpers/esm/construct\":\"9HMy4\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../webgl-utils\":\"c96L8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9HMy4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _setPrototypeOfJs = require(\"./setPrototypeOf.js\");\nvar _setPrototypeOfJsDefault = parcelHelpers.interopDefault(_setPrototypeOfJs);\nvar _isNativeReflectConstructJs = require(\"./isNativeReflectConstruct.js\");\nvar _isNativeReflectConstructJsDefault = parcelHelpers.interopDefault(_isNativeReflectConstructJs);\nfunction _construct(Parent1, args1, Class1) {\n    if ((0, _isNativeReflectConstructJsDefault.default)()) _construct = Reflect.construct.bind();\n    else _construct = function _construct(Parent, args, Class) {\n        var a = [\n            null\n        ];\n        a.push.apply(a, args);\n        var Constructor = Function.bind.apply(Parent, a);\n        var instance = new Constructor();\n        if (Class) (0, _setPrototypeOfJsDefault.default)(instance, Class.prototype);\n        return instance;\n    };\n    return _construct.apply(null, arguments);\n}\nexports.default = _construct;\n\n},{\"./setPrototypeOf.js\":\"9qmcb\",\"./isNativeReflectConstruct.js\":\"hfypc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hfypc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nexports.default = _isNativeReflectConstruct;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gR89D\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TEXTURE_FORMATS\", ()=>TEXTURE_FORMATS);\nparcelHelpers.export(exports, \"DATA_FORMAT_CHANNELS\", ()=>DATA_FORMAT_CHANNELS);\nparcelHelpers.export(exports, \"TYPE_SIZES\", ()=>TYPE_SIZES);\nparcelHelpers.export(exports, \"isFormatSupported\", ()=>isFormatSupported);\nparcelHelpers.export(exports, \"isLinearFilteringSupported\", ()=>isLinearFilteringSupported);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _TEXTURE_FORMATS, _DATA_FORMAT_CHANNELS, _TYPE_SIZES;\nvar TEXTURE_FORMATS = (_TEXTURE_FORMATS = {}, (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6407, {\n    dataFormat: 6407,\n    types: [\n        5121,\n        33635\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6408, {\n    dataFormat: 6408,\n    types: [\n        5121,\n        32819,\n        32820\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6406, {\n    dataFormat: 6406,\n    types: [\n        5121\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6409, {\n    dataFormat: 6409,\n    types: [\n        5121\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 6410, {\n    dataFormat: 6410,\n    types: [\n        5121\n    ]\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 33326, {\n    dataFormat: 6403,\n    types: [\n        5126\n    ],\n    gl2: true\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 33328, {\n    dataFormat: 33319,\n    types: [\n        5126\n    ],\n    gl2: true\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 34837, {\n    dataFormat: 6407,\n    types: [\n        5126\n    ],\n    gl2: true\n}), (0, _definePropertyDefault.default)(_TEXTURE_FORMATS, 34836, {\n    dataFormat: 6408,\n    types: [\n        5126\n    ],\n    gl2: true\n}), _TEXTURE_FORMATS);\nvar DATA_FORMAT_CHANNELS = (_DATA_FORMAT_CHANNELS = {}, (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6403, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 36244, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 33319, 2), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 33320, 2), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6407, 3), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 36248, 3), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6408, 4), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 36249, 4), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6402, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 34041, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6406, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6409, 1), (0, _definePropertyDefault.default)(_DATA_FORMAT_CHANNELS, 6410, 2), _DATA_FORMAT_CHANNELS);\nvar TYPE_SIZES = (_TYPE_SIZES = {}, (0, _definePropertyDefault.default)(_TYPE_SIZES, 5126, 4), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5125, 4), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5124, 4), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5123, 2), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5122, 2), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5131, 2), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5120, 1), (0, _definePropertyDefault.default)(_TYPE_SIZES, 5121, 1), _TYPE_SIZES);\nfunction isFormatSupported(gl, format) {\n    var info = TEXTURE_FORMATS[format];\n    if (!info) return false;\n    if (info.gl1 === undefined && info.gl2 === undefined) return true;\n    var value = (0, _gltools.isWebGL2)(gl) ? info.gl2 || info.gl1 : info.gl1;\n    return typeof value === \"string\" ? gl.getExtension(value) : value;\n}\nfunction isLinearFilteringSupported(gl, format) {\n    var info = TEXTURE_FORMATS[format];\n    switch(info && info.types[0]){\n        case 5126:\n            return gl.getExtension(\"OES_texture_float_linear\");\n        case 5131:\n            return gl.getExtension(\"OES_texture_half_float_linear\");\n        default:\n            return true;\n    }\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@luma.gl/gltools\":\"grcb8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6omqp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"setPathPrefix\", ()=>setPathPrefix);\nparcelHelpers.export(exports, \"loadFile\", ()=>loadFile);\nparcelHelpers.export(exports, \"loadImage\", ()=>loadImage);\nvar _utils = require(\"../utils\");\nvar pathPrefix = \"\";\nfunction setPathPrefix(prefix) {\n    pathPrefix = prefix;\n}\nfunction loadFile(url) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    (0, _utils.assert)(typeof url === \"string\");\n    url = pathPrefix + url;\n    var dataType = options.dataType || \"text\";\n    return fetch(url, options).then(function(res) {\n        return res[dataType]();\n    });\n}\nfunction loadImage(url, opts) {\n    (0, _utils.assert)(typeof url === \"string\");\n    url = pathPrefix + url;\n    return new Promise(function(resolve, reject) {\n        try {\n            var image = new Image();\n            image.onload = function() {\n                return resolve(image);\n            };\n            image.onerror = function() {\n                return reject(new Error(\"Could not load image \".concat(url, \".\")));\n            };\n            image.crossOrigin = opts && opts.crossOrigin || \"anonymous\";\n            image.src = url;\n        } catch (error) {\n            reject(error);\n        }\n    });\n}\n\n},{\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bQu89\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TextureCube);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _webglUtils = require(\"../webgl-utils\");\nvar FACES = [\n    34069,\n    34070,\n    34071,\n    34072,\n    34073,\n    34074\n];\nvar TextureCube = function(_Texture) {\n    (0, _inheritsDefault.default)(TextureCube1, _Texture);\n    function TextureCube1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, TextureCube1);\n        (0, _webglUtils.assertWebGLContext)(gl);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(TextureCube1).call(this, gl, Object.assign({}, props, {\n            target: 34067\n        })));\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(TextureCube1, [\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var _this2 = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _props$mipmaps = props.mipmaps, mipmaps = _props$mipmaps === void 0 ? true : _props$mipmaps, _props$parameters = props.parameters, parameters = _props$parameters === void 0 ? {} : _props$parameters;\n                this.opts = props;\n                this.setCubeMapImageData(props).then(function() {\n                    _this2.loaded = true;\n                    if (mipmaps) _this2.generateMipmap(props);\n                    _this2.setParameters(parameters);\n                });\n            }\n        },\n        {\n            key: \"subImage\",\n            value: function subImage(_ref) {\n                var face = _ref.face, data = _ref.data, _ref$x = _ref.x, x = _ref$x === void 0 ? 0 : _ref$x, _ref$y = _ref.y, y = _ref$y === void 0 ? 0 : _ref$y, _ref$mipmapLevel = _ref.mipmapLevel, mipmapLevel = _ref$mipmapLevel === void 0 ? 0 : _ref$mipmapLevel;\n                return this._subImage({\n                    target: face,\n                    data: data,\n                    x: x,\n                    y: y,\n                    mipmapLevel: mipmapLevel\n                });\n            }\n        },\n        {\n            key: \"setCubeMapImageData\",\n            value: function() {\n                var _setCubeMapImageData = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(_ref2) {\n                    var _this3 = this;\n                    var width, height, pixels, data, _ref2$border, border, _ref2$format, format, _ref2$type, type, gl, imageDataMap, resolvedFaces;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                width = _ref2.width, height = _ref2.height, pixels = _ref2.pixels, data = _ref2.data, _ref2$border = _ref2.border, border = _ref2$border === void 0 ? 0 : _ref2$border, _ref2$format = _ref2.format, format = _ref2$format === void 0 ? 6408 : _ref2$format, _ref2$type = _ref2.type, type = _ref2$type === void 0 ? 5121 : _ref2$type;\n                                gl = this.gl;\n                                imageDataMap = pixels || data;\n                                _context.next = 5;\n                                return Promise.all(FACES.map(function(face) {\n                                    var facePixels = imageDataMap[face];\n                                    return Promise.all(Array.isArray(facePixels) ? facePixels : [\n                                        facePixels\n                                    ]);\n                                }));\n                            case 5:\n                                resolvedFaces = _context.sent;\n                                this.bind();\n                                FACES.forEach(function(face, index) {\n                                    if (resolvedFaces[index].length > 1 && _this3.opts.mipmaps !== false) (0, _gltools.log).warn(\"\".concat(_this3.id, \" has mipmap and multiple LODs.\"))();\n                                    resolvedFaces[index].forEach(function(image, lodLevel) {\n                                        if (width && height) gl.texImage2D(face, lodLevel, format, width, height, border, format, type, image);\n                                        else gl.texImage2D(face, lodLevel, format, format, type, image);\n                                    });\n                                });\n                                this.unbind();\n                            case 9:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this);\n                }));\n                function setCubeMapImageData(_x) {\n                    return _setCubeMapImageData.apply(this, arguments);\n                }\n                return setCubeMapImageData;\n            }()\n        },\n        {\n            key: \"setImageDataForFace\",\n            value: function setImageDataForFace(options) {\n                var _this4 = this;\n                var face = options.face, width = options.width, height = options.height, pixels = options.pixels, data = options.data, _options$border = options.border, border = _options$border === void 0 ? 0 : _options$border, _options$format = options.format, format = _options$format === void 0 ? 6408 : _options$format, _options$type = options.type, type = _options$type === void 0 ? 5121 : _options$type;\n                var gl = this.gl;\n                var imageData = pixels || data;\n                this.bind();\n                if (imageData instanceof Promise) imageData.then(function(resolvedImageData) {\n                    return _this4.setImageDataForFace(Object.assign({}, options, {\n                        face: face,\n                        data: resolvedImageData,\n                        pixels: resolvedImageData\n                    }));\n                });\n                else if (this.width || this.height) gl.texImage2D(face, 0, format, width, height, border, format, type, imageData);\n                else gl.texImage2D(face, 0, format, format, type, imageData);\n                return this;\n            }\n        }\n    ]);\n    return TextureCube1;\n}((0, _textureDefault.default));\nTextureCube.FACES = FACES;\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@luma.gl/gltools\":\"grcb8\",\"./texture\":\"e0vyJ\",\"../webgl-utils\":\"c96L8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j82Gz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Texture3D);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _textureFormats = require(\"./texture-formats\");\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar Texture3D = function(_Texture) {\n    (0, _inheritsDefault.default)(Texture3D1, _Texture);\n    (0, _createClassDefault.default)(Texture3D1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                return (0, _gltools.isWebGL2)(gl);\n            }\n        }\n    ]);\n    function Texture3D1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Texture3D1);\n        (0, _webglUtils.assertWebGL2Context)(gl);\n        props = Object.assign({\n            depth: 1\n        }, props, {\n            target: 32879,\n            unpackFlipY: false\n        });\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Texture3D1).call(this, gl, props));\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Texture3D1, [\n        {\n            key: \"setImageData\",\n            value: function setImageData(_ref) {\n                var _this2 = this;\n                var _ref$level = _ref.level, level = _ref$level === void 0 ? 0 : _ref$level, _ref$dataFormat = _ref.dataFormat, dataFormat = _ref$dataFormat === void 0 ? 6408 : _ref$dataFormat, width = _ref.width, height = _ref.height, _ref$depth = _ref.depth, depth = _ref$depth === void 0 ? 1 : _ref$depth, _ref$border = _ref.border, border = _ref$border === void 0 ? 0 : _ref$border, format = _ref.format, _ref$type = _ref.type, type = _ref$type === void 0 ? 5121 : _ref$type, _ref$offset = _ref.offset, offset = _ref$offset === void 0 ? 0 : _ref$offset, data = _ref.data, _ref$parameters = _ref.parameters, parameters = _ref$parameters === void 0 ? {} : _ref$parameters;\n                this._trackDeallocatedMemory(\"Texture\");\n                this.gl.bindTexture(this.target, this.handle);\n                (0, _gltools.withParameters)(this.gl, parameters, function() {\n                    if (ArrayBuffer.isView(data)) _this2.gl.texImage3D(_this2.target, level, dataFormat, width, height, depth, border, format, type, data);\n                    if (data instanceof (0, _bufferDefault.default)) {\n                        _this2.gl.bindBuffer(35052, data.handle);\n                        _this2.gl.texImage3D(_this2.target, level, dataFormat, width, height, depth, border, format, type, offset);\n                    }\n                });\n                if (data && data.byteLength) this._trackAllocatedMemory(data.byteLength, \"Texture\");\n                else {\n                    var channels = (0, _textureFormats.DATA_FORMAT_CHANNELS)[this.dataFormat] || 4;\n                    var channelSize = (0, _textureFormats.TYPE_SIZES)[this.type] || 1;\n                    this._trackAllocatedMemory(this.width * this.height * this.depth * channels * channelSize, \"Texture\");\n                }\n                this.loaded = true;\n                return this;\n            }\n        }\n    ]);\n    return Texture3D1;\n}((0, _textureDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@luma.gl/gltools\":\"grcb8\",\"../webgl-utils\":\"c96L8\",\"./texture\":\"e0vyJ\",\"./texture-formats\":\"gR89D\",\"./buffer\":\"98zcF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"62K0L\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Framebuffer);\nparcelHelpers.export(exports, \"FRAMEBUFFER_ATTACHMENT_PARAMETERS\", ()=>FRAMEBUFFER_ATTACHMENT_PARAMETERS);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _texture2D = require(\"./texture-2d\");\nvar _texture2DDefault = parcelHelpers.interopDefault(_texture2D);\nvar _renderbuffer = require(\"./renderbuffer\");\nvar _renderbufferDefault = parcelHelpers.interopDefault(_renderbuffer);\nvar _clear = require(\"./clear\");\nvar _copyAndBlitJs = require(\"./copy-and-blit.js\");\nvar _features = require(\"../features\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar ERR_MULTIPLE_RENDERTARGETS = \"Multiple render targets not supported\";\nvar Framebuffer = function(_Resource) {\n    (0, _inheritsDefault.default)(Framebuffer1, _Resource);\n    (0, _createClassDefault.default)(Framebuffer1, [\n        {\n            key: \"MAX_COLOR_ATTACHMENTS\",\n            get: function get() {\n                return this.gl.getParameter(this.gl.MAX_COLOR_ATTACHMENTS);\n            }\n        },\n        {\n            key: \"MAX_DRAW_BUFFERS\",\n            get: function get() {\n                return this.gl.getParameter(this.gl.MAX_DRAW_BUFFERS);\n            }\n        }\n    ], [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, colorBufferFloat = _ref.colorBufferFloat, colorBufferHalfFloat = _ref.colorBufferHalfFloat;\n                var supported = true;\n                if (colorBufferFloat) supported = Boolean(gl.getExtension(\"EXT_color_buffer_float\") || gl.getExtension(\"WEBGL_color_buffer_float\") || gl.getExtension(\"OES_texture_float\"));\n                if (colorBufferHalfFloat) supported = supported && Boolean(gl.getExtension(\"EXT_color_buffer_float\") || gl.getExtension(\"EXT_color_buffer_half_float\"));\n                return supported;\n            }\n        },\n        {\n            key: \"getDefaultFramebuffer\",\n            value: function getDefaultFramebuffer(gl) {\n                gl.luma = gl.luma || {};\n                gl.luma.defaultFramebuffer = gl.luma.defaultFramebuffer || new Framebuffer1(gl, {\n                    id: \"default-framebuffer\",\n                    handle: null,\n                    attachments: {}\n                });\n                return gl.luma.defaultFramebuffer;\n            }\n        }\n    ]);\n    function Framebuffer1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Framebuffer1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Framebuffer1).call(this, gl, opts));\n        _this.width = null;\n        _this.height = null;\n        _this.attachments = {};\n        _this.readBuffer = 36064;\n        _this.drawBuffers = [\n            36064\n        ];\n        _this.ownResources = [];\n        _this.initialize(opts);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Framebuffer1, [\n        {\n            key: \"initialize\",\n            value: function initialize(_ref2) {\n                var _ref2$width = _ref2.width, width = _ref2$width === void 0 ? 1 : _ref2$width, _ref2$height = _ref2.height, height = _ref2$height === void 0 ? 1 : _ref2$height, _ref2$attachments = _ref2.attachments, attachments = _ref2$attachments === void 0 ? null : _ref2$attachments, _ref2$color = _ref2.color, color = _ref2$color === void 0 ? true : _ref2$color, _ref2$depth = _ref2.depth, depth = _ref2$depth === void 0 ? true : _ref2$depth, _ref2$stencil = _ref2.stencil, stencil = _ref2$stencil === void 0 ? false : _ref2$stencil, _ref2$check = _ref2.check, check = _ref2$check === void 0 ? true : _ref2$check, readBuffer = _ref2.readBuffer, drawBuffers = _ref2.drawBuffers;\n                (0, _utils.assert)(width >= 0 && height >= 0, \"Width and height need to be integers\");\n                this.width = width;\n                this.height = height;\n                if (attachments) for(var attachment in attachments){\n                    var target = attachments[attachment];\n                    var object = Array.isArray(target) ? target[0] : target;\n                    object.resize({\n                        width: width,\n                        height: height\n                    });\n                }\n                else attachments = this._createDefaultAttachments(color, depth, stencil, width, height);\n                this.update({\n                    clearAttachments: true,\n                    attachments: attachments,\n                    readBuffer: readBuffer,\n                    drawBuffers: drawBuffers\n                });\n                if (attachments && check) this.checkStatus();\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = this.ownResources[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var resource = _step.value;\n                        resource[\"delete\"]();\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Framebuffer1.prototype), \"delete\", this).call(this);\n            }\n        },\n        {\n            key: \"update\",\n            value: function update(_ref3) {\n                var _ref3$attachments = _ref3.attachments, attachments = _ref3$attachments === void 0 ? {} : _ref3$attachments, readBuffer = _ref3.readBuffer, drawBuffers = _ref3.drawBuffers, _ref3$clearAttachment = _ref3.clearAttachments, clearAttachments = _ref3$clearAttachment === void 0 ? false : _ref3$clearAttachment, _ref3$resizeAttachmen = _ref3.resizeAttachments, resizeAttachments = _ref3$resizeAttachmen === void 0 ? true : _ref3$resizeAttachmen;\n                this.attach(attachments, {\n                    clearAttachments: clearAttachments,\n                    resizeAttachments: resizeAttachments\n                });\n                var gl = this.gl;\n                var prevHandle = gl.bindFramebuffer(36160, this.handle);\n                if (readBuffer) this._setReadBuffer(readBuffer);\n                if (drawBuffers) this._setDrawBuffers(drawBuffers);\n                gl.bindFramebuffer(36160, prevHandle || null);\n                return this;\n            }\n        },\n        {\n            key: \"resize\",\n            value: function resize() {\n                var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, width = _ref4.width, height = _ref4.height;\n                if (this.handle === null) {\n                    (0, _utils.assert)(width === undefined && height === undefined);\n                    this.width = this.gl.drawingBufferWidth;\n                    this.height = this.gl.drawingBufferHeight;\n                    return this;\n                }\n                if (width === undefined) width = this.gl.drawingBufferWidth;\n                if (height === undefined) height = this.gl.drawingBufferHeight;\n                if (width !== this.width && height !== this.height) (0, _gltools.log).log(2, \"Resizing framebuffer \".concat(this.id, \" to \").concat(width, \"x\").concat(height))();\n                for(var attachmentPoint in this.attachments)this.attachments[attachmentPoint].resize({\n                    width: width,\n                    height: height\n                });\n                this.width = width;\n                this.height = height;\n                return this;\n            }\n        },\n        {\n            key: \"attach\",\n            value: function attach(attachments) {\n                var _this2 = this;\n                var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref5$clearAttachment = _ref5.clearAttachments, clearAttachments = _ref5$clearAttachment === void 0 ? false : _ref5$clearAttachment, _ref5$resizeAttachmen = _ref5.resizeAttachments, resizeAttachments = _ref5$resizeAttachmen === void 0 ? true : _ref5$resizeAttachmen;\n                var newAttachments = {};\n                if (clearAttachments) Object.keys(this.attachments).forEach(function(key) {\n                    newAttachments[key] = null;\n                });\n                Object.assign(newAttachments, attachments);\n                var prevHandle = this.gl.bindFramebuffer(36160, this.handle);\n                for(var key1 in newAttachments){\n                    (0, _utils.assert)(key1 !== undefined, \"Misspelled framebuffer binding point?\");\n                    var attachment = Number(key1);\n                    var descriptor = newAttachments[attachment];\n                    var object = descriptor;\n                    if (!object) this._unattach(attachment);\n                    else if (object instanceof (0, _renderbufferDefault.default)) this._attachRenderbuffer({\n                        attachment: attachment,\n                        renderbuffer: object\n                    });\n                    else if (Array.isArray(descriptor)) {\n                        var _descriptor = (0, _slicedToArrayDefault.default)(descriptor, 3), texture = _descriptor[0], _descriptor$ = _descriptor[1], layer = _descriptor$ === void 0 ? 0 : _descriptor$, _descriptor$2 = _descriptor[2], level = _descriptor$2 === void 0 ? 0 : _descriptor$2;\n                        object = texture;\n                        this._attachTexture({\n                            attachment: attachment,\n                            texture: texture,\n                            layer: layer,\n                            level: level\n                        });\n                    } else this._attachTexture({\n                        attachment: attachment,\n                        texture: object,\n                        layer: 0,\n                        level: 0\n                    });\n                    if (resizeAttachments && object) object.resize({\n                        width: this.width,\n                        height: this.height\n                    });\n                }\n                this.gl.bindFramebuffer(36160, prevHandle || null);\n                Object.assign(this.attachments, attachments);\n                Object.keys(this.attachments).filter(function(key) {\n                    return !_this2.attachments[key];\n                }).forEach(function(key) {\n                    delete _this2.attachments[key];\n                });\n            }\n        },\n        {\n            key: \"checkStatus\",\n            value: function checkStatus() {\n                var gl = this.gl;\n                var status = this.getStatus();\n                if (status !== 36053) throw new Error(_getFrameBufferStatus(status));\n                return this;\n            }\n        },\n        {\n            key: \"getStatus\",\n            value: function getStatus() {\n                var gl = this.gl;\n                var prevHandle = gl.bindFramebuffer(36160, this.handle);\n                var status = gl.checkFramebufferStatus(36160);\n                gl.bindFramebuffer(36160, prevHandle || null);\n                return status;\n            }\n        },\n        {\n            key: \"clear\",\n            value: function clear() {\n                var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, color = _ref6.color, depth = _ref6.depth, stencil = _ref6.stencil, _ref6$drawBuffers = _ref6.drawBuffers, drawBuffers = _ref6$drawBuffers === void 0 ? [] : _ref6$drawBuffers;\n                var prevHandle = this.gl.bindFramebuffer(36160, this.handle);\n                if (color || depth || stencil) (0, _clear.clear)(this.gl, {\n                    color: color,\n                    depth: depth,\n                    stencil: stencil\n                });\n                drawBuffers.forEach(function(value, drawBuffer) {\n                    (0, _clear.clearBuffer)({\n                        drawBuffer: drawBuffer,\n                        value: value\n                    });\n                });\n                this.gl.bindFramebuffer(36160, prevHandle || null);\n                return this;\n            }\n        },\n        {\n            key: \"readPixels\",\n            value: function readPixels() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.readPixels() is no logner supported, use readPixelsToArray(framebuffer)\")();\n                return null;\n            }\n        },\n        {\n            key: \"readPixelsToBuffer\",\n            value: function readPixelsToBuffer() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.readPixelsToBuffer()is no logner supported, use readPixelsToBuffer(framebuffer)\")();\n                return null;\n            }\n        },\n        {\n            key: \"copyToDataUrl\",\n            value: function copyToDataUrl() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.copyToDataUrl() is no logner supported, use copyToDataUrl(framebuffer)\")();\n                return null;\n            }\n        },\n        {\n            key: \"copyToImage\",\n            value: function copyToImage() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.copyToImage() is no logner supported, use copyToImage(framebuffer)\")();\n                return null;\n            }\n        },\n        {\n            key: \"copyToTexture\",\n            value: function copyToTexture() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.copyToTexture({...}) is no logner supported, use copyToTexture(source, target, opts})\")();\n                return null;\n            }\n        },\n        {\n            key: \"blit\",\n            value: function blit() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _gltools.log).error(\"Framebuffer.blit({...}) is no logner supported, use blit(source, target, opts)\")();\n                return null;\n            }\n        },\n        {\n            key: \"invalidate\",\n            value: function invalidate(_ref7) {\n                var _ref7$attachments = _ref7.attachments, attachments = _ref7$attachments === void 0 ? [] : _ref7$attachments, _ref7$x = _ref7.x, x = _ref7$x === void 0 ? 0 : _ref7$x, _ref7$y = _ref7.y, y = _ref7$y === void 0 ? 0 : _ref7$y, width = _ref7.width, height = _ref7.height;\n                var gl = this.gl;\n                (0, _webglUtils.assertWebGL2Context)(gl);\n                var prevHandle = gl.bindFramebuffer(36008, this.handle);\n                var invalidateAll = x === 0 && y === 0 && width === undefined && height === undefined;\n                if (invalidateAll) gl.invalidateFramebuffer(36008, attachments);\n                else gl.invalidateFramebuffer(36008, attachments, x, y, width, height);\n                gl.bindFramebuffer(36008, prevHandle);\n                return this;\n            }\n        },\n        {\n            key: \"getAttachmentParameter\",\n            value: function getAttachmentParameter(attachment, pname, keys) {\n                var value = this._getAttachmentParameterFallback(pname);\n                if (value === null) {\n                    this.gl.bindFramebuffer(36160, this.handle);\n                    value = this.gl.getFramebufferAttachmentParameter(36160, attachment, pname);\n                    this.gl.bindFramebuffer(36160, null);\n                }\n                if (keys && value > 1000) value = (0, _webglUtils.getKey)(this.gl, value);\n                return value;\n            }\n        },\n        {\n            key: \"getAttachmentParameters\",\n            value: function getAttachmentParameters() {\n                var attachment = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 36064;\n                var keys = arguments.length > 1 ? arguments[1] : undefined;\n                var parameters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.constructor.ATTACHMENT_PARAMETERS || [];\n                var values = {};\n                var _iteratorNormalCompletion2 = true;\n                var _didIteratorError2 = false;\n                var _iteratorError2 = undefined;\n                try {\n                    for(var _iterator2 = parameters[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                        var pname = _step2.value;\n                        var key = keys ? (0, _webglUtils.getKey)(this.gl, pname) : pname;\n                        values[key] = this.getAttachmentParameter(attachment, pname, keys);\n                    }\n                } catch (err) {\n                    _didIteratorError2 = true;\n                    _iteratorError2 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n                    } finally{\n                        if (_didIteratorError2) throw _iteratorError2;\n                    }\n                }\n                return values;\n            }\n        },\n        {\n            key: \"getParameters\",\n            value: function getParameters() {\n                var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n                var attachments = Object.keys(this.attachments);\n                var parameters = {};\n                for(var _i = 0, _attachments = attachments; _i < _attachments.length; _i++){\n                    var attachmentName = _attachments[_i];\n                    var attachment = Number(attachmentName);\n                    var key = keys ? (0, _webglUtils.getKey)(this.gl, attachment) : attachment;\n                    parameters[key] = this.getAttachmentParameters(attachment, keys);\n                }\n                return parameters;\n            }\n        },\n        {\n            key: \"show\",\n            value: function show() {\n                if (typeof window !== \"undefined\") window.open((0, _copyAndBlitJs.copyToDataUrl)(this), \"luma-debug-texture\");\n                return this;\n            }\n        },\n        {\n            key: \"log\",\n            value: function log() {\n                var logLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n                var message = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n                if (logLevel > (0, _gltools.log).level || typeof window === \"undefined\") return this;\n                message = message || \"Framebuffer \".concat(this.id);\n                var image = (0, _copyAndBlitJs.copyToDataUrl)(this, {\n                    maxHeight: 100\n                });\n                (0, _gltools.log).image({\n                    logLevel: logLevel,\n                    message: message,\n                    image: image\n                }, message)();\n                return this;\n            }\n        },\n        {\n            key: \"bind\",\n            value: function bind() {\n                var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref8$target = _ref8.target, target = _ref8$target === void 0 ? 36160 : _ref8$target;\n                this.gl.bindFramebuffer(target, this.handle);\n                return this;\n            }\n        },\n        {\n            key: \"unbind\",\n            value: function unbind() {\n                var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref9$target = _ref9.target, target = _ref9$target === void 0 ? 36160 : _ref9$target;\n                this.gl.bindFramebuffer(target, null);\n                return this;\n            }\n        },\n        {\n            key: \"_createDefaultAttachments\",\n            value: function _createDefaultAttachments(color, depth, stencil, width, height) {\n                var defaultAttachments = null;\n                if (color) {\n                    var _parameters;\n                    defaultAttachments = defaultAttachments || {};\n                    defaultAttachments[36064] = new (0, _texture2DDefault.default)(this.gl, {\n                        id: \"\".concat(this.id, \"-color0\"),\n                        pixels: null,\n                        format: 6408,\n                        type: 5121,\n                        width: width,\n                        height: height,\n                        mipmaps: false,\n                        parameters: (_parameters = {}, (0, _definePropertyDefault.default)(_parameters, 10241, 9729), (0, _definePropertyDefault.default)(_parameters, 10240, 9729), (0, _definePropertyDefault.default)(_parameters, 10242, 33071), (0, _definePropertyDefault.default)(_parameters, 10243, 33071), _parameters)\n                    });\n                    this.ownResources.push(defaultAttachments[36064]);\n                }\n                if (depth && stencil) {\n                    defaultAttachments = defaultAttachments || {};\n                    defaultAttachments[33306] = new (0, _renderbufferDefault.default)(this.gl, {\n                        id: \"\".concat(this.id, \"-depth-stencil\"),\n                        format: 35056,\n                        width: width,\n                        height: 111\n                    });\n                    this.ownResources.push(defaultAttachments[33306]);\n                } else if (depth) {\n                    defaultAttachments = defaultAttachments || {};\n                    defaultAttachments[36096] = new (0, _renderbufferDefault.default)(this.gl, {\n                        id: \"\".concat(this.id, \"-depth\"),\n                        format: 33189,\n                        width: width,\n                        height: height\n                    });\n                    this.ownResources.push(defaultAttachments[36096]);\n                } else if (stencil) (0, _utils.assert)(false);\n                return defaultAttachments;\n            }\n        },\n        {\n            key: \"_unattach\",\n            value: function _unattach(attachment) {\n                var oldAttachment = this.attachments[attachment];\n                if (!oldAttachment) return;\n                if (oldAttachment instanceof (0, _renderbufferDefault.default)) this.gl.framebufferRenderbuffer(36160, attachment, 36161, null);\n                else this.gl.framebufferTexture2D(36160, attachment, 3553, null, 0);\n                delete this.attachments[attachment];\n            }\n        },\n        {\n            key: \"_attachRenderbuffer\",\n            value: function _attachRenderbuffer(_ref10) {\n                var _ref10$attachment = _ref10.attachment, attachment = _ref10$attachment === void 0 ? 36064 : _ref10$attachment, renderbuffer = _ref10.renderbuffer;\n                var gl = this.gl;\n                gl.framebufferRenderbuffer(36160, attachment, 36161, renderbuffer.handle);\n                this.attachments[attachment] = renderbuffer;\n            }\n        },\n        {\n            key: \"_attachTexture\",\n            value: function _attachTexture(_ref11) {\n                var _ref11$attachment = _ref11.attachment, attachment = _ref11$attachment === void 0 ? 36064 : _ref11$attachment, texture = _ref11.texture, layer = _ref11.layer, level = _ref11.level;\n                var gl = this.gl;\n                gl.bindTexture(texture.target, texture.handle);\n                switch(texture.target){\n                    case 35866:\n                    case 32879:\n                        gl.framebufferTextureLayer(36160, attachment, texture.target, level, layer);\n                        break;\n                    case 34067:\n                        var face = mapIndexToCubeMapFace(layer);\n                        gl.framebufferTexture2D(36160, attachment, face, texture.handle, level);\n                        break;\n                    case 3553:\n                        gl.framebufferTexture2D(36160, attachment, 3553, texture.handle, level);\n                        break;\n                    default:\n                        (0, _utils.assert)(false, \"Illegal texture type\");\n                }\n                gl.bindTexture(texture.target, null);\n                this.attachments[attachment] = texture;\n            }\n        },\n        {\n            key: \"_setReadBuffer\",\n            value: function _setReadBuffer(readBuffer) {\n                var gl = this.gl;\n                if ((0, _gltools.isWebGL2)(gl)) gl.readBuffer(readBuffer);\n                else (0, _utils.assert)(readBuffer === 36064 || readBuffer === 1029, ERR_MULTIPLE_RENDERTARGETS);\n                this.readBuffer = readBuffer;\n            }\n        },\n        {\n            key: \"_setDrawBuffers\",\n            value: function _setDrawBuffers(drawBuffers) {\n                var gl = this.gl;\n                if ((0, _gltools.isWebGL2)(gl)) gl.drawBuffers(drawBuffers);\n                else {\n                    var ext = gl.getExtension(\"WEBGL.draw_buffers\");\n                    if (ext) ext.drawBuffersWEBGL(drawBuffers);\n                    else (0, _utils.assert)(drawBuffers.length === 1 && (drawBuffers[0] === 36064 || drawBuffers[0] === 1029), ERR_MULTIPLE_RENDERTARGETS);\n                }\n                this.drawBuffers = drawBuffers;\n            }\n        },\n        {\n            key: \"_getAttachmentParameterFallback\",\n            value: function _getAttachmentParameterFallback(pname) {\n                var caps = (0, _features.getFeatures)(this.gl);\n                switch(pname){\n                    case 36052:\n                        return !caps.WEBGL2 ? 0 : null;\n                    case 33298:\n                    case 33299:\n                    case 33300:\n                    case 33301:\n                    case 33302:\n                    case 33303:\n                        return !caps.WEBGL2 ? 8 : null;\n                    case 33297:\n                        return !caps.WEBGL2 ? 5125 : null;\n                    case 33296:\n                        return !caps.WEBGL2 && !caps.EXT_sRGB ? 9729 : null;\n                    default:\n                        return null;\n                }\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createFramebuffer();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteFramebuffer(this.handle);\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle(handle) {\n                return this.gl.bindFramebuffer(36160, handle);\n            }\n        },\n        {\n            key: \"color\",\n            get: function get() {\n                return this.attachments[36064] || null;\n            }\n        },\n        {\n            key: \"texture\",\n            get: function get() {\n                return this.attachments[36064] || null;\n            }\n        },\n        {\n            key: \"depth\",\n            get: function get() {\n                return this.attachments[36096] || this.attachments[33306] || null;\n            }\n        },\n        {\n            key: \"stencil\",\n            get: function get() {\n                return this.attachments[36128] || this.attachments[33306] || null;\n            }\n        }\n    ]);\n    return Framebuffer1;\n}((0, _resourceDefault.default));\nfunction mapIndexToCubeMapFace(layer) {\n    return layer < 34069 ? layer + 34069 : layer;\n}\nfunction _getFrameBufferStatus(status) {\n    var STATUS = Framebuffer.STATUS || {};\n    return STATUS[status] || \"Framebuffer error \".concat(status);\n}\nvar FRAMEBUFFER_ATTACHMENT_PARAMETERS = [\n    36049,\n    36048,\n    33296,\n    33298,\n    33299,\n    33300,\n    33301,\n    33302,\n    33303\n];\nFramebuffer.ATTACHMENT_PARAMETERS = FRAMEBUFFER_ATTACHMENT_PARAMETERS;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@luma.gl/gltools\":\"grcb8\",\"./resource\":\"1yIzW\",\"./texture-2d\":\"82MrD\",\"./renderbuffer\":\"am3Nj\",\"./clear\":\"bsboh\",\"./copy-and-blit.js\":\"2xoyG\",\"../features\":\"jlK3J\",\"../webgl-utils\":\"c96L8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3LBf5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _superPropBaseJs = require(\"./superPropBase.js\");\nvar _superPropBaseJsDefault = parcelHelpers.interopDefault(_superPropBaseJs);\nfunction _get() {\n    if (typeof Reflect !== \"undefined\" && Reflect.get) _get = Reflect.get.bind();\n    else _get = function _get(target, property, receiver) {\n        var base = (0, _superPropBaseJsDefault.default)(target, property);\n        if (!base) return;\n        var desc = Object.getOwnPropertyDescriptor(base, property);\n        if (desc.get) return desc.get.call(arguments.length < 3 ? target : receiver);\n        return desc.value;\n    };\n    return _get.apply(this, arguments);\n}\nexports.default = _get;\n\n},{\"./superPropBase.js\":\"1Bx97\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1Bx97\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _getPrototypeOfJs = require(\"./getPrototypeOf.js\");\nvar _getPrototypeOfJsDefault = parcelHelpers.interopDefault(_getPrototypeOfJs);\nfunction _superPropBase(object, property) {\n    while(!Object.prototype.hasOwnProperty.call(object, property)){\n        object = (0, _getPrototypeOfJsDefault.default)(object);\n        if (object === null) break;\n    }\n    return object;\n}\nexports.default = _superPropBase;\n\n},{\"./getPrototypeOf.js\":\"3gKMG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"am3Nj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Renderbuffer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _renderbufferFormats = require(\"./renderbuffer-formats\");\nvar _renderbufferFormatsDefault = parcelHelpers.interopDefault(_renderbufferFormats);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _utils = require(\"../utils\");\nfunction isFormatSupported(gl, format, formats) {\n    var info = formats[format];\n    if (!info) return false;\n    var value = (0, _gltools.isWebGL2)(gl) ? info.gl2 || info.gl1 : info.gl1;\n    if (typeof value === \"string\") return gl.getExtension(value);\n    return value;\n}\nvar Renderbuffer = function(_Resource) {\n    (0, _inheritsDefault.default)(Renderbuffer1, _Resource);\n    (0, _createClassDefault.default)(Renderbuffer1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n                    format: null\n                }, format = _ref.format;\n                return !format || isFormatSupported(gl, format, (0, _renderbufferFormatsDefault.default));\n            }\n        },\n        {\n            key: \"getSamplesForFormat\",\n            value: function getSamplesForFormat(gl, _ref2) {\n                var format = _ref2.format;\n                return gl.getInternalformatParameter(36161, format, 32937);\n            }\n        }\n    ]);\n    function Renderbuffer1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Renderbuffer1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Renderbuffer1).call(this, gl, opts));\n        _this.initialize(opts);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Renderbuffer1, [\n        {\n            key: \"initialize\",\n            value: function initialize(_ref3) {\n                var format = _ref3.format, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? 1 : _ref3$width, _ref3$height = _ref3.height, height = _ref3$height === void 0 ? 1 : _ref3$height, _ref3$samples = _ref3.samples, samples = _ref3$samples === void 0 ? 0 : _ref3$samples;\n                (0, _utils.assert)(format, \"Needs format\");\n                this._trackDeallocatedMemory();\n                this.gl.bindRenderbuffer(36161, this.handle);\n                if (samples !== 0 && (0, _gltools.isWebGL2)(this.gl)) this.gl.renderbufferStorageMultisample(36161, samples, format, width, height);\n                else this.gl.renderbufferStorage(36161, format, width, height);\n                this.format = format;\n                this.width = width;\n                this.height = height;\n                this.samples = samples;\n                this._trackAllocatedMemory(this.width * this.height * (this.samples || 1) * (0, _renderbufferFormatsDefault.default)[this.format].bpp);\n                return this;\n            }\n        },\n        {\n            key: \"resize\",\n            value: function resize(_ref4) {\n                var width = _ref4.width, height = _ref4.height;\n                if (width !== this.width || height !== this.height) return this.initialize({\n                    width: width,\n                    height: height,\n                    format: this.format,\n                    samples: this.samples\n                });\n                return this;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createRenderbuffer();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteRenderbuffer(this.handle);\n                this._trackDeallocatedMemory();\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle(handle) {\n                this.gl.bindRenderbuffer(36161, handle);\n            }\n        },\n        {\n            key: \"_syncHandle\",\n            value: function _syncHandle(handle) {\n                this.format = this.getParameter(36164);\n                this.width = this.getParameter(36162);\n                this.height = this.getParameter(36163);\n                this.samples = this.getParameter(36011);\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname) {\n                this.gl.bindRenderbuffer(36161, this.handle);\n                var value = this.gl.getRenderbufferParameter(36161, pname);\n                return value;\n            }\n        }\n    ]);\n    return Renderbuffer1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./resource\":\"1yIzW\",\"./renderbuffer-formats\":\"2C9xW\",\"@luma.gl/gltools\":\"grcb8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2C9xW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _$33190$36012$;\nvar EXT_FLOAT_WEBGL2 = \"EXT_color_buffer_float\";\nexports.default = (_$33190$36012$ = {}, (0, _definePropertyDefault.default)(_$33190$36012$, 33189, {\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33190, {\n    gl2: true,\n    bpp: 3\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36012, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36168, {\n    bpp: 1\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 34041, {\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 35056, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36013, {\n    gl2: true,\n    bpp: 5\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32854, {\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36194, {\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32855, {\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33321, {\n    gl2: true,\n    bpp: 1\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33330, {\n    gl2: true,\n    bpp: 1\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33329, {\n    gl2: true,\n    bpp: 1\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33332, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33331, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33334, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33333, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33323, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33336, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33335, {\n    gl2: true,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33338, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33337, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33340, {\n    gl2: true,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33339, {\n    gl2: true,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32849, {\n    gl2: true,\n    bpp: 3\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32856, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 32857, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36220, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36238, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36975, {\n    gl2: true,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36214, {\n    gl2: true,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36232, {\n    gl2: true,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36226, {\n    gl2: true,\n    bpp: 16\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 36208, {\n    gl2: true,\n    bpp: 16\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33325, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 2\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33327, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 34842, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33326, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 4\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 33328, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 8\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 34836, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 16\n}), (0, _definePropertyDefault.default)(_$33190$36012$, 35898, {\n    gl2: EXT_FLOAT_WEBGL2,\n    bpp: 4\n}), _$33190$36012$);\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bsboh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"clear\", ()=>clear);\nparcelHelpers.export(exports, \"clearBuffer\", ()=>clearBuffer);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar GL_DEPTH_BUFFER_BIT = 0x00000100;\nvar GL_STENCIL_BUFFER_BIT = 0x00000400;\nvar GL_COLOR_BUFFER_BIT = 0x00004000;\nvar GL_COLOR = 0x1800;\nvar GL_DEPTH = 0x1801;\nvar GL_STENCIL = 0x1802;\nvar GL_DEPTH_STENCIL = 0x84f9;\nvar ERR_ARGUMENTS = \"clear: bad arguments\";\nfunction clear(gl) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$framebuffer = _ref.framebuffer, framebuffer = _ref$framebuffer === void 0 ? null : _ref$framebuffer, _ref$color = _ref.color, color = _ref$color === void 0 ? null : _ref$color, _ref$depth = _ref.depth, depth = _ref$depth === void 0 ? null : _ref$depth, _ref$stencil = _ref.stencil, stencil = _ref$stencil === void 0 ? null : _ref$stencil;\n    var parameters = {};\n    if (framebuffer) parameters.framebuffer = framebuffer;\n    var clearFlags = 0;\n    if (color) {\n        clearFlags |= GL_COLOR_BUFFER_BIT;\n        if (color !== true) parameters.clearColor = color;\n    }\n    if (depth) {\n        clearFlags |= GL_DEPTH_BUFFER_BIT;\n        if (depth !== true) parameters.clearDepth = depth;\n    }\n    if (stencil) {\n        clearFlags |= GL_STENCIL_BUFFER_BIT;\n        if (depth !== true) parameters.clearStencil = depth;\n    }\n    (0, _utils.assert)(clearFlags !== 0, ERR_ARGUMENTS);\n    (0, _gltools.withParameters)(gl, parameters, function() {\n        gl.clear(clearFlags);\n    });\n}\nfunction clearBuffer(gl) {\n    var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$framebuffer = _ref2.framebuffer, framebuffer = _ref2$framebuffer === void 0 ? null : _ref2$framebuffer, _ref2$buffer = _ref2.buffer, buffer = _ref2$buffer === void 0 ? GL_COLOR : _ref2$buffer, _ref2$drawBuffer = _ref2.drawBuffer, drawBuffer = _ref2$drawBuffer === void 0 ? 0 : _ref2$drawBuffer, _ref2$value = _ref2.value, value = _ref2$value === void 0 ? [\n        0,\n        0,\n        0,\n        0\n    ] : _ref2$value;\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    (0, _gltools.withParameters)(gl, {\n        framebuffer: framebuffer\n    }, function() {\n        switch(buffer){\n            case GL_COLOR:\n                switch(value.constructor){\n                    case Int32Array:\n                        gl.clearBufferiv(buffer, drawBuffer, value);\n                        break;\n                    case Uint32Array:\n                        gl.clearBufferuiv(buffer, drawBuffer, value);\n                        break;\n                    case Float32Array:\n                    default:\n                        gl.clearBufferfv(buffer, drawBuffer, value);\n                }\n                break;\n            case GL_DEPTH:\n                gl.clearBufferfv(GL_DEPTH, 0, [\n                    value\n                ]);\n                break;\n            case GL_STENCIL:\n                gl.clearBufferiv(GL_STENCIL, 0, [\n                    value\n                ]);\n                break;\n            case GL_DEPTH_STENCIL:\n                var _value = (0, _slicedToArrayDefault.default)(value, 2), depth = _value[0], stencil = _value[1];\n                gl.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);\n                break;\n            default:\n                (0, _utils.assert)(false, ERR_ARGUMENTS);\n        }\n    });\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@luma.gl/gltools\":\"grcb8\",\"../webgl-utils\":\"c96L8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2xoyG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"readPixelsToArray\", ()=>readPixelsToArray);\nparcelHelpers.export(exports, \"readPixelsToBuffer\", ()=>readPixelsToBuffer);\nparcelHelpers.export(exports, \"copyToDataUrl\", ()=>copyToDataUrl);\nparcelHelpers.export(exports, \"copyToImage\", ()=>copyToImage);\nparcelHelpers.export(exports, \"copyToTexture\", ()=>copyToTexture);\nparcelHelpers.export(exports, \"blit\", ()=>blit);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _framebuffer = require(\"./framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _typedArrayUtils = require(\"../webgl-utils/typed-array-utils\");\nvar _formatUtils = require(\"../webgl-utils/format-utils\");\nvar _textureUtils = require(\"../webgl-utils/texture-utils\");\nvar _utils = require(\"../utils\");\nfunction readPixelsToArray(source) {\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$sourceX = _ref.sourceX, sourceX = _ref$sourceX === void 0 ? 0 : _ref$sourceX, _ref$sourceY = _ref.sourceY, sourceY = _ref$sourceY === void 0 ? 0 : _ref$sourceY, _ref$sourceFormat = _ref.sourceFormat, sourceFormat = _ref$sourceFormat === void 0 ? 6408 : _ref$sourceFormat, _ref$sourceAttachment = _ref.sourceAttachment, sourceAttachment = _ref$sourceAttachment === void 0 ? 36064 : _ref$sourceAttachment, _ref$target = _ref.target, target = _ref$target === void 0 ? null : _ref$target, sourceWidth = _ref.sourceWidth, sourceHeight = _ref.sourceHeight, sourceType = _ref.sourceType;\n    var _getFramebuffer = getFramebuffer(source), framebuffer = _getFramebuffer.framebuffer, deleteFramebuffer = _getFramebuffer.deleteFramebuffer;\n    (0, _utils.assert)(framebuffer);\n    var gl = framebuffer.gl, handle = framebuffer.handle, attachments = framebuffer.attachments;\n    sourceWidth = sourceWidth || framebuffer.width;\n    sourceHeight = sourceHeight || framebuffer.height;\n    if (sourceAttachment === 36064 && handle === null) sourceAttachment = 1028;\n    (0, _utils.assert)(attachments[sourceAttachment]);\n    sourceType = sourceType || attachments[sourceAttachment].type;\n    target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight);\n    sourceType = sourceType || (0, _typedArrayUtils.getGLTypeFromTypedArray)(target);\n    var prevHandle = gl.bindFramebuffer(36160, handle);\n    gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, target);\n    gl.bindFramebuffer(36160, prevHandle || null);\n    if (deleteFramebuffer) framebuffer[\"delete\"]();\n    return target;\n}\nfunction readPixelsToBuffer(source, _ref2) {\n    var _ref2$sourceX = _ref2.sourceX, sourceX = _ref2$sourceX === void 0 ? 0 : _ref2$sourceX, _ref2$sourceY = _ref2.sourceY, sourceY = _ref2$sourceY === void 0 ? 0 : _ref2$sourceY, _ref2$sourceFormat = _ref2.sourceFormat, sourceFormat = _ref2$sourceFormat === void 0 ? 6408 : _ref2$sourceFormat, _ref2$target = _ref2.target, target = _ref2$target === void 0 ? null : _ref2$target, _ref2$targetByteOffse = _ref2.targetByteOffset, targetByteOffset = _ref2$targetByteOffse === void 0 ? 0 : _ref2$targetByteOffse, sourceWidth = _ref2.sourceWidth, sourceHeight = _ref2.sourceHeight, sourceType = _ref2.sourceType;\n    var _getFramebuffer2 = getFramebuffer(source), framebuffer = _getFramebuffer2.framebuffer, deleteFramebuffer = _getFramebuffer2.deleteFramebuffer;\n    (0, _utils.assert)(framebuffer);\n    var gl = framebuffer.gl;\n    sourceWidth = sourceWidth || framebuffer.width;\n    sourceHeight = sourceHeight || framebuffer.height;\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    sourceType = sourceType || (target ? target.type : 5121);\n    if (!target) {\n        var components = (0, _formatUtils.glFormatToComponents)(sourceFormat);\n        var byteCount = (0, _formatUtils.glTypeToBytes)(sourceType);\n        var byteLength = targetByteOffset + sourceWidth * sourceHeight * components * byteCount;\n        target = new (0, _bufferDefault.default)(gl, {\n            byteLength: byteLength,\n            accessor: {\n                type: sourceType,\n                size: components\n            }\n        });\n    }\n    target.bind({\n        target: 35051\n    });\n    (0, _gltools.withParameters)(gl, {\n        framebuffer: framebuffer\n    }, function() {\n        gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, targetByteOffset);\n    });\n    target.unbind({\n        target: 35051\n    });\n    if (deleteFramebuffer) framebuffer[\"delete\"]();\n    return target;\n}\nfunction copyToDataUrl(source) {\n    var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref3$sourceAttachmen = _ref3.sourceAttachment, sourceAttachment = _ref3$sourceAttachmen === void 0 ? 36064 : _ref3$sourceAttachmen, _ref3$targetMaxHeight = _ref3.targetMaxHeight, targetMaxHeight = _ref3$targetMaxHeight === void 0 ? Number.MAX_SAFE_INTEGER : _ref3$targetMaxHeight;\n    var data = readPixelsToArray(source, {\n        sourceAttachment: sourceAttachment\n    });\n    var width = source.width, height = source.height;\n    while(height > targetMaxHeight){\n        var _scalePixels = (0, _webglUtils.scalePixels)({\n            data: data,\n            width: width,\n            height: height\n        });\n        data = _scalePixels.data;\n        width = _scalePixels.width;\n        height = _scalePixels.height;\n    }\n    (0, _webglUtils.flipRows)({\n        data: data,\n        width: width,\n        height: height\n    });\n    var canvas = document.createElement(\"canvas\");\n    canvas.width = width;\n    canvas.height = height;\n    var context = canvas.getContext(\"2d\");\n    var imageData = context.createImageData(width, height);\n    imageData.data.set(data);\n    context.putImageData(imageData, 0, 0);\n    return canvas.toDataURL();\n}\nfunction copyToImage(source) {\n    var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref4$sourceAttachmen = _ref4.sourceAttachment, sourceAttachment = _ref4$sourceAttachmen === void 0 ? 36064 : _ref4$sourceAttachmen, _ref4$targetImage = _ref4.targetImage, targetImage = _ref4$targetImage === void 0 ? null : _ref4$targetImage;\n    var dataUrl = copyToDataUrl(source, {\n        sourceAttachment: sourceAttachment\n    });\n    targetImage = targetImage || new Image();\n    targetImage.src = dataUrl;\n    return targetImage;\n}\nfunction copyToTexture(source, target) {\n    var _ref5 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref5$sourceX = _ref5.sourceX, sourceX = _ref5$sourceX === void 0 ? 0 : _ref5$sourceX, _ref5$sourceY = _ref5.sourceY, sourceY = _ref5$sourceY === void 0 ? 0 : _ref5$sourceY, targetX = _ref5.targetX, targetY = _ref5.targetY, targetZ = _ref5.targetZ, _ref5$targetMipmaplev = _ref5.targetMipmaplevel, targetMipmaplevel = _ref5$targetMipmaplev === void 0 ? 0 : _ref5$targetMipmaplev, _ref5$targetInternalF = _ref5.targetInternalFormat, targetInternalFormat = _ref5$targetInternalF === void 0 ? 6408 : _ref5$targetInternalF, width = _ref5.width, height = _ref5.height;\n    var _getFramebuffer3 = getFramebuffer(source), framebuffer = _getFramebuffer3.framebuffer, deleteFramebuffer = _getFramebuffer3.deleteFramebuffer;\n    (0, _utils.assert)(framebuffer);\n    var gl = framebuffer.gl, handle = framebuffer.handle;\n    var isSubCopy = typeof targetX !== \"undefined\" || typeof targetY !== \"undefined\" || typeof targetZ !== \"undefined\";\n    targetX = targetX || 0;\n    targetY = targetY || 0;\n    targetZ = targetZ || 0;\n    var prevHandle = gl.bindFramebuffer(36160, handle);\n    (0, _utils.assert)(target);\n    var texture = null;\n    if (target instanceof (0, _textureDefault.default)) {\n        texture = target;\n        width = Number.isFinite(width) ? width : texture.width;\n        height = Number.isFinite(height) ? height : texture.height;\n        texture.bind(0);\n        target = texture.target;\n    }\n    if (!isSubCopy) gl.copyTexImage2D(target, targetMipmaplevel, targetInternalFormat, sourceX, sourceY, width, height, 0);\n    else switch(target){\n        case 3553:\n        case 34067:\n            gl.copyTexSubImage2D(target, targetMipmaplevel, targetX, targetY, sourceX, sourceY, width, height);\n            break;\n        case 35866:\n        case 32879:\n            gl.copyTexSubImage3D(target, targetMipmaplevel, targetX, targetY, targetZ, sourceX, sourceY, width, height);\n            break;\n        default:\n    }\n    if (texture) texture.unbind();\n    gl.bindFramebuffer(36160, prevHandle || null);\n    if (deleteFramebuffer) framebuffer[\"delete\"]();\n    return texture;\n}\nfunction blit(source, target) {\n    var _ref6 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref6$sourceAttachmen = _ref6.sourceAttachment, sourceAttachment = _ref6$sourceAttachmen === void 0 ? 36064 : _ref6$sourceAttachmen, _ref6$sourceX = _ref6.sourceX0, sourceX0 = _ref6$sourceX === void 0 ? 0 : _ref6$sourceX, _ref6$sourceY = _ref6.sourceY0, sourceY0 = _ref6$sourceY === void 0 ? 0 : _ref6$sourceY, sourceX1 = _ref6.sourceX1, sourceY1 = _ref6.sourceY1, _ref6$targetX = _ref6.targetX0, targetX0 = _ref6$targetX === void 0 ? 0 : _ref6$targetX, _ref6$targetY = _ref6.targetY0, targetY0 = _ref6$targetY === void 0 ? 0 : _ref6$targetY, targetX1 = _ref6.targetX1, targetY1 = _ref6.targetY1, _ref6$color = _ref6.color, color = _ref6$color === void 0 ? true : _ref6$color, _ref6$depth = _ref6.depth, depth = _ref6$depth === void 0 ? false : _ref6$depth, _ref6$stencil = _ref6.stencil, stencil = _ref6$stencil === void 0 ? false : _ref6$stencil, _ref6$mask = _ref6.mask, mask = _ref6$mask === void 0 ? 0 : _ref6$mask, _ref6$filter = _ref6.filter, filter = _ref6$filter === void 0 ? 9728 : _ref6$filter;\n    var _getFramebuffer4 = getFramebuffer(source), srcFramebuffer = _getFramebuffer4.framebuffer, deleteSrcFramebuffer = _getFramebuffer4.deleteFramebuffer;\n    var _getFramebuffer5 = getFramebuffer(target), dstFramebuffer = _getFramebuffer5.framebuffer, deleteDstFramebuffer = _getFramebuffer5.deleteFramebuffer;\n    (0, _utils.assert)(srcFramebuffer);\n    (0, _utils.assert)(dstFramebuffer);\n    var gl = dstFramebuffer.gl, handle = dstFramebuffer.handle, width = dstFramebuffer.width, height = dstFramebuffer.height, readBuffer = dstFramebuffer.readBuffer;\n    (0, _webglUtils.assertWebGL2Context)(gl);\n    if (!srcFramebuffer.handle && sourceAttachment === 36064) sourceAttachment = 1028;\n    if (color) mask |= 16384;\n    if (depth) mask |= 256;\n    if (stencil) mask |= 1024;\n    if (deleteSrcFramebuffer || deleteDstFramebuffer) {\n        if (mask & 1280) {\n            mask = 16384;\n            (0, _gltools.log).warn(\"Blitting from or into a Texture object, forcing mask to GL.COLOR_BUFFER_BIT\")();\n        }\n    }\n    (0, _utils.assert)(mask);\n    sourceX1 = sourceX1 === undefined ? srcFramebuffer.width : sourceX1;\n    sourceY1 = sourceY1 === undefined ? srcFramebuffer.height : sourceY1;\n    targetX1 = targetX1 === undefined ? width : targetX1;\n    targetY1 = targetY1 === undefined ? height : targetY1;\n    var prevDrawHandle = gl.bindFramebuffer(36009, handle);\n    var prevReadHandle = gl.bindFramebuffer(36008, srcFramebuffer.handle);\n    gl.readBuffer(sourceAttachment);\n    gl.blitFramebuffer(sourceX0, sourceY0, sourceX1, sourceY1, targetX0, targetY0, targetX1, targetY1, mask, filter);\n    gl.readBuffer(readBuffer);\n    gl.bindFramebuffer(36008, prevReadHandle || null);\n    gl.bindFramebuffer(36009, prevDrawHandle || null);\n    if (deleteSrcFramebuffer) srcFramebuffer[\"delete\"]();\n    if (deleteDstFramebuffer) dstFramebuffer[\"delete\"]();\n    return dstFramebuffer;\n}\nfunction getFramebuffer(source) {\n    if (!(source instanceof (0, _framebufferDefault.default))) return {\n        framebuffer: (0, _textureUtils.toFramebuffer)(source),\n        deleteFramebuffer: true\n    };\n    return {\n        framebuffer: source,\n        deleteFramebuffer: false\n    };\n}\nfunction getPixelArray(pixelArray, type, format, width, height) {\n    if (pixelArray) return pixelArray;\n    type = type || 5121;\n    var ArrayType = (0, _typedArrayUtils.getTypedArrayFromGLType)(type, {\n        clamped: false\n    });\n    var components = (0, _formatUtils.glFormatToComponents)(format);\n    return new ArrayType(width * height * components);\n}\n\n},{\"./buffer\":\"98zcF\",\"./framebuffer\":\"62K0L\",\"./texture\":\"e0vyJ\",\"@luma.gl/gltools\":\"grcb8\",\"../webgl-utils\":\"c96L8\",\"../webgl-utils/typed-array-utils\":\"j7A6U\",\"../webgl-utils/format-utils\":\"2cCQO\",\"../webgl-utils/texture-utils\":\"6cScQ\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2cCQO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"glFormatToComponents\", ()=>glFormatToComponents);\nparcelHelpers.export(exports, \"glTypeToBytes\", ()=>glTypeToBytes);\nvar _utils = require(\"../utils\");\nfunction glFormatToComponents(format) {\n    switch(format){\n        case 6406:\n        case 33326:\n        case 6403:\n            return 1;\n        case 33328:\n        case 33319:\n            return 2;\n        case 6407:\n        case 34837:\n            return 3;\n        case 6408:\n        case 34836:\n            return 4;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\nfunction glTypeToBytes(type) {\n    switch(type){\n        case 5121:\n            return 1;\n        case 33635:\n        case 32819:\n        case 32820:\n            return 2;\n        case 5126:\n            return 4;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\n\n},{\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jlK3J\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getContextInfo\", ()=>(0, _limits.getContextInfo));\nparcelHelpers.export(exports, \"getGLContextInfo\", ()=>(0, _limits.getGLContextInfo));\nparcelHelpers.export(exports, \"getContextLimits\", ()=>(0, _limits.getContextLimits));\nparcelHelpers.export(exports, \"FEATURES\", ()=>(0, _webglFeaturesTable.FEATURES));\nparcelHelpers.export(exports, \"hasFeature\", ()=>(0, _features.hasFeature));\nparcelHelpers.export(exports, \"hasFeatures\", ()=>(0, _features.hasFeatures));\nparcelHelpers.export(exports, \"getFeatures\", ()=>(0, _features.getFeatures));\nparcelHelpers.export(exports, \"canCompileGLGSExtension\", ()=>(0, _checkGlslExtensionDefault.default));\nvar _limits = require(\"./limits\");\nvar _webglFeaturesTable = require(\"./webgl-features-table\");\nvar _features = require(\"./features\");\nvar _checkGlslExtension = require(\"./check-glsl-extension\");\nvar _checkGlslExtensionDefault = parcelHelpers.interopDefault(_checkGlslExtension);\n\n},{\"./limits\":false,\"./webgl-features-table\":\"7Ryrb\",\"./features\":\"2wucn\",\"./check-glsl-extension\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Ryrb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FEATURES\", ()=>FEATURES);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _framebuffer = require(\"../classes/framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _texture2D = require(\"../classes/texture-2d\");\nvar _texture2DDefault = parcelHelpers.interopDefault(_texture2D);\nvar _FEATURES$WEBGL2$FEAT;\nvar FEATURES = {\n    WEBGL2: \"WEBGL2\",\n    VERTEX_ARRAY_OBJECT: \"VERTEX_ARRAY_OBJECT\",\n    TIMER_QUERY: \"TIMER_QUERY\",\n    INSTANCED_RENDERING: \"INSTANCED_RENDERING\",\n    MULTIPLE_RENDER_TARGETS: \"MULTIPLE_RENDER_TARGETS\",\n    ELEMENT_INDEX_UINT32: \"ELEMENT_INDEX_UINT32\",\n    BLEND_EQUATION_MINMAX: \"BLEND_EQUATION_MINMAX\",\n    FLOAT_BLEND: \"FLOAT_BLEND\",\n    COLOR_ENCODING_SRGB: \"COLOR_ENCODING_SRGB\",\n    TEXTURE_DEPTH: \"TEXTURE_DEPTH\",\n    TEXTURE_FLOAT: \"TEXTURE_FLOAT\",\n    TEXTURE_HALF_FLOAT: \"TEXTURE_HALF_FLOAT\",\n    TEXTURE_FILTER_LINEAR_FLOAT: \"TEXTURE_FILTER_LINEAR_FLOAT\",\n    TEXTURE_FILTER_LINEAR_HALF_FLOAT: \"TEXTURE_FILTER_LINEAR_HALF_FLOAT\",\n    TEXTURE_FILTER_ANISOTROPIC: \"TEXTURE_FILTER_ANISOTROPIC\",\n    COLOR_ATTACHMENT_RGBA32F: \"COLOR_ATTACHMENT_RGBA32F\",\n    COLOR_ATTACHMENT_FLOAT: \"COLOR_ATTACHMENT_FLOAT\",\n    COLOR_ATTACHMENT_HALF_FLOAT: \"COLOR_ATTACHMENT_HALF_FLOAT\",\n    GLSL_FRAG_DATA: \"GLSL_FRAG_DATA\",\n    GLSL_FRAG_DEPTH: \"GLSL_FRAG_DEPTH\",\n    GLSL_DERIVATIVES: \"GLSL_DERIVATIVES\",\n    GLSL_TEXTURE_LOD: \"GLSL_TEXTURE_LOD\"\n};\nfunction checkFloat32ColorAttachment(gl) {\n    var testTexture = new (0, _texture2DDefault.default)(gl, {\n        format: 6408,\n        type: 5126,\n        dataFormat: 6408\n    });\n    var testFb = new (0, _framebufferDefault.default)(gl, {\n        id: \"test-framebuffer\",\n        check: false,\n        attachments: (0, _definePropertyDefault.default)({}, 36064, testTexture)\n    });\n    var status = testFb.getStatus();\n    testTexture[\"delete\"]();\n    testFb[\"delete\"]();\n    return status === 36053;\n}\nexports.default = (_FEATURES$WEBGL2$FEAT = {}, (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.WEBGL2, [\n    false,\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.VERTEX_ARRAY_OBJECT, [\n    \"OES_vertex_array_object\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TIMER_QUERY, [\n    \"EXT_disjoint_timer_query\",\n    \"EXT_disjoint_timer_query_webgl2\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.INSTANCED_RENDERING, [\n    \"ANGLE_instanced_arrays\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.MULTIPLE_RENDER_TARGETS, [\n    \"WEBGL_draw_buffers\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.ELEMENT_INDEX_UINT32, [\n    \"OES_element_index_uint\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.BLEND_EQUATION_MINMAX, [\n    \"EXT_blend_minmax\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.FLOAT_BLEND, [\n    \"EXT_float_blend\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.COLOR_ENCODING_SRGB, [\n    \"EXT_sRGB\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_DEPTH, [\n    \"WEBGL_depth_texture\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_FLOAT, [\n    \"OES_texture_float\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_HALF_FLOAT, [\n    \"OES_texture_half_float\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_FILTER_LINEAR_FLOAT, [\n    \"OES_texture_float_linear\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_FILTER_LINEAR_HALF_FLOAT, [\n    \"OES_texture_half_float_linear\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.TEXTURE_FILTER_ANISOTROPIC, [\n    \"EXT_texture_filter_anisotropic\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.COLOR_ATTACHMENT_RGBA32F, [\n    checkFloat32ColorAttachment,\n    \"EXT_color_buffer_float\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.COLOR_ATTACHMENT_FLOAT, [\n    false,\n    \"EXT_color_buffer_float\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.COLOR_ATTACHMENT_HALF_FLOAT, [\n    \"EXT_color_buffer_half_float\"\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.GLSL_FRAG_DATA, [\n    \"WEBGL_draw_buffers\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.GLSL_FRAG_DEPTH, [\n    \"EXT_frag_depth\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.GLSL_DERIVATIVES, [\n    \"OES_standard_derivatives\",\n    true\n]), (0, _definePropertyDefault.default)(_FEATURES$WEBGL2$FEAT, FEATURES.GLSL_TEXTURE_LOD, [\n    \"EXT_shader_texture_lod\",\n    true\n]), _FEATURES$WEBGL2$FEAT);\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../classes/framebuffer\":\"62K0L\",\"../classes/texture-2d\":\"82MrD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2wucn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hasFeature\", ()=>hasFeature);\nparcelHelpers.export(exports, \"hasFeatures\", ()=>hasFeatures);\nparcelHelpers.export(exports, \"getFeatures\", ()=>getFeatures);\nvar _webglFeaturesTable = require(\"./webgl-features-table\");\nvar _webglFeaturesTableDefault = parcelHelpers.interopDefault(_webglFeaturesTable);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _utils = require(\"../utils\");\nvar LOG_UNSUPPORTED_FEATURE = 2;\nfunction hasFeature(gl, feature) {\n    return hasFeatures(gl, feature);\n}\nfunction hasFeatures(gl, features) {\n    features = Array.isArray(features) ? features : [\n        features\n    ];\n    return features.every(function(feature) {\n        return isFeatureSupported(gl, feature);\n    });\n}\nfunction getFeatures(gl) {\n    gl.luma = gl.luma || {};\n    gl.luma.caps = gl.luma.caps || {};\n    for(var cap in 0, _webglFeaturesTableDefault.default)if (gl.luma.caps[cap] === undefined) gl.luma.caps[cap] = isFeatureSupported(gl, cap);\n    return gl.luma.caps;\n}\nfunction isFeatureSupported(gl, cap) {\n    gl.luma = gl.luma || {};\n    gl.luma.caps = gl.luma.caps || {};\n    if (gl.luma.caps[cap] === undefined) gl.luma.caps[cap] = queryFeature(gl, cap);\n    if (!gl.luma.caps[cap]) (0, _gltools.log).log(LOG_UNSUPPORTED_FEATURE, \"Feature: \".concat(cap, \" not supported\"))();\n    return gl.luma.caps[cap];\n}\nfunction queryFeature(gl, cap) {\n    var feature = (0, _webglFeaturesTableDefault.default)[cap];\n    (0, _utils.assert)(feature, cap);\n    var isSupported;\n    var featureDefinition = (0, _gltools.isWebGL2)(gl) ? feature[1] || feature[0] : feature[0];\n    if (typeof featureDefinition === \"function\") isSupported = featureDefinition(gl);\n    else if (Array.isArray(featureDefinition)) {\n        isSupported = true;\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n        try {\n            for(var _iterator = featureDefinition[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                var extension = _step.value;\n                isSupported = isSupported && Boolean(gl.getExtension(extension));\n            }\n        } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n        } finally{\n            try {\n                if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n            } finally{\n                if (_didIteratorError) throw _iteratorError;\n            }\n        }\n    } else if (typeof featureDefinition === \"string\") isSupported = Boolean(gl.getExtension(featureDefinition));\n    else if (typeof featureDefinition === \"boolean\") isSupported = featureDefinition;\n    else (0, _utils.assert)(false);\n    return isSupported;\n}\n\n},{\"./webgl-features-table\":\"7Ryrb\",\"@luma.gl/gltools\":\"grcb8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"JIn1p\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Shader\", ()=>Shader);\nparcelHelpers.export(exports, \"VertexShader\", ()=>VertexShader);\nparcelHelpers.export(exports, \"FragmentShader\", ()=>FragmentShader);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _glslUtils = require(\"../glsl-utils\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar ERR_SOURCE = \"Shader: GLSL source code must be a JavaScript string\";\nvar Shader = function(_Resource) {\n    (0, _inheritsDefault.default)(Shader1, _Resource);\n    (0, _createClassDefault.default)(Shader1, null, [\n        {\n            key: \"getTypeName\",\n            value: function getTypeName(shaderType) {\n                switch(shaderType){\n                    case 35633:\n                        return \"vertex-shader\";\n                    case 35632:\n                        return \"fragment-shader\";\n                    default:\n                        (0, _utils.assert)(false);\n                        return \"unknown\";\n                }\n            }\n        }\n    ]);\n    function Shader1(gl, props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, Shader1);\n        (0, _webglUtils.assertWebGLContext)(gl);\n        (0, _utils.assert)(typeof props.source === \"string\", ERR_SOURCE);\n        var id = (0, _glslUtils.getShaderName)(props.source, null) || props.id || (0, _utils.uid)(\"unnamed \".concat(Shader1.getTypeName(props.shaderType)));\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Shader1).call(this, gl, {\n            id: id\n        }));\n        _this.shaderType = props.shaderType;\n        _this.source = props.source;\n        _this.initialize(props);\n        return _this;\n    }\n    (0, _createClassDefault.default)(Shader1, [\n        {\n            key: \"initialize\",\n            value: function initialize(_ref) {\n                var source = _ref.source;\n                var shaderName = (0, _glslUtils.getShaderName)(source, null);\n                if (shaderName) this.id = (0, _utils.uid)(shaderName);\n                this._compile(source);\n            }\n        },\n        {\n            key: \"getParameter\",\n            value: function getParameter(pname) {\n                return this.gl.getShaderParameter(this.handle, pname);\n            }\n        },\n        {\n            key: \"toString\",\n            value: function toString() {\n                return \"\".concat(Shader1.getTypeName(this.shaderType), \":\").concat(this.id);\n            }\n        },\n        {\n            key: \"getName\",\n            value: function getName() {\n                return (0, _glslUtils.getShaderName)(this.source) || \"unnamed-shader\";\n            }\n        },\n        {\n            key: \"getSource\",\n            value: function getSource() {\n                return this.gl.getShaderSource(this.handle);\n            }\n        },\n        {\n            key: \"getTranslatedSource\",\n            value: function getTranslatedSource() {\n                var extension = this.gl.getExtension(\"WEBGL.debug_shaders\");\n                return extension ? extension.getTranslatedShaderSource(this.handle) : \"No translated source available. WEBGL.debug_shaders not implemented\";\n            }\n        },\n        {\n            key: \"_compile\",\n            value: function _compile() {\n                var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.source;\n                if (!source.startsWith(\"#version \")) source = \"#version 100\\n\".concat(source);\n                this.source = source;\n                this.gl.shaderSource(this.handle, this.source);\n                this.gl.compileShader(this.handle);\n                var compileStatus = this.getParameter(35713);\n                if (!compileStatus) {\n                    var infoLog = this.gl.getShaderInfoLog(this.handle);\n                    var _parseGLSLCompilerErr = (0, _glslUtils.parseGLSLCompilerError)(infoLog, this.source, this.shaderType, this.id), shaderName = _parseGLSLCompilerErr.shaderName, errors = _parseGLSLCompilerErr.errors, warnings = _parseGLSLCompilerErr.warnings;\n                    (0, _gltools.log).error(\"GLSL compilation errors in \".concat(shaderName, \"\\n\").concat(errors))();\n                    (0, _gltools.log).warn(\"GLSL compilation warnings in \".concat(shaderName, \"\\n\").concat(warnings))();\n                    throw new Error(\"GLSL compilation errors in \".concat(shaderName));\n                }\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteShader(this.handle);\n            }\n        },\n        {\n            key: \"_getOptsFromHandle\",\n            value: function _getOptsFromHandle() {\n                return {\n                    type: this.getParameter(35663),\n                    source: this.getSource()\n                };\n            }\n        }\n    ]);\n    return Shader1;\n}((0, _resourceDefault.default));\nvar VertexShader = function(_Shader) {\n    (0, _inheritsDefault.default)(VertexShader1, _Shader);\n    function VertexShader1(gl, props) {\n        (0, _classCallCheckDefault.default)(this, VertexShader1);\n        if (typeof props === \"string\") props = {\n            source: props\n        };\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(VertexShader1).call(this, gl, Object.assign({}, props, {\n            shaderType: 35633\n        })));\n    }\n    (0, _createClassDefault.default)(VertexShader1, [\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createShader(35633);\n            }\n        }\n    ]);\n    return VertexShader1;\n}(Shader);\nvar FragmentShader = function(_Shader2) {\n    (0, _inheritsDefault.default)(FragmentShader1, _Shader2);\n    function FragmentShader1(gl, props) {\n        (0, _classCallCheckDefault.default)(this, FragmentShader1);\n        if (typeof props === \"string\") props = {\n            source: props\n        };\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(FragmentShader1).call(this, gl, Object.assign({}, props, {\n            shaderType: 35632\n        })));\n    }\n    (0, _createClassDefault.default)(FragmentShader1, [\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createShader(35632);\n            }\n        }\n    ]);\n    return FragmentShader1;\n}(Shader);\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@luma.gl/gltools\":\"grcb8\",\"../glsl-utils\":\"1ZOdh\",\"../webgl-utils\":\"c96L8\",\"../utils\":\"dIy34\",\"./resource\":\"1yIzW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1ZOdh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatGLSLCompilerError\", ()=>(0, _formatGlslErrorDefault.default));\nparcelHelpers.export(exports, \"parseGLSLCompilerError\", ()=>(0, _formatGlslError.parseGLSLCompilerError));\nparcelHelpers.export(exports, \"getShaderName\", ()=>(0, _getShaderNameDefault.default));\nparcelHelpers.export(exports, \"getShaderVersion\", ()=>(0, _getShaderVersionDefault.default));\nparcelHelpers.export(exports, \"getShaderTypeName\", ()=>(0, _getShaderTypeNameDefault.default));\nvar _formatGlslError = require(\"./format-glsl-error\");\nvar _formatGlslErrorDefault = parcelHelpers.interopDefault(_formatGlslError);\nvar _getShaderName = require(\"./get-shader-name\");\nvar _getShaderNameDefault = parcelHelpers.interopDefault(_getShaderName);\nvar _getShaderVersion = require(\"./get-shader-version\");\nvar _getShaderVersionDefault = parcelHelpers.interopDefault(_getShaderVersion);\nvar _getShaderTypeName = require(\"./get-shader-type-name\");\nvar _getShaderTypeNameDefault = parcelHelpers.interopDefault(_getShaderTypeName);\n\n},{\"./format-glsl-error\":\"fZrmD\",\"./get-shader-name\":\"fe3Q6\",\"./get-shader-version\":\"6Hh5D\",\"./get-shader-type-name\":\"MkeHb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fZrmD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parseGLSLCompilerError\", ()=>parseGLSLCompilerError);\nvar _getShaderName = require(\"./get-shader-name\");\nvar _getShaderNameDefault = parcelHelpers.interopDefault(_getShaderName);\nvar _getShaderTypeName = require(\"./get-shader-type-name\");\nvar _getShaderTypeNameDefault = parcelHelpers.interopDefault(_getShaderTypeName);\nfunction formatGLSLCompilerError(errLog, src, shaderType) {\n    var _parseGLSLCompilerErr = parseGLSLCompilerError(errLog, src, shaderType), shaderName = _parseGLSLCompilerErr.shaderName, errors = _parseGLSLCompilerErr.errors, warnings = _parseGLSLCompilerErr.warnings;\n    return \"GLSL compilation error in \".concat(shaderName, \"\\n\\n\").concat(errors, \"\\n\").concat(warnings);\n}\nexports.default = formatGLSLCompilerError;\nfunction parseGLSLCompilerError(errLog, src, shaderType, shaderName) {\n    var errorStrings = errLog.split(/\\r?\\n/);\n    var errors = {};\n    var warnings = {};\n    var name = shaderName || (0, _getShaderNameDefault.default)(src) || \"(unnamed)\";\n    var shaderDescription = \"\".concat((0, _getShaderTypeNameDefault.default)(shaderType), \" shader \").concat(name);\n    for(var i = 0; i < errorStrings.length; i++){\n        var errorString = errorStrings[i];\n        if (errorString.length <= 1) continue;\n        var segments = errorString.split(\":\");\n        var type = segments[0];\n        var line = parseInt(segments[2], 10);\n        if (isNaN(line)) throw new Error(\"GLSL compilation error in \".concat(shaderDescription, \": \").concat(errLog));\n        if (type !== \"WARNING\") errors[line] = errorString;\n        else warnings[line] = errorString;\n    }\n    var lines = addLineNumbers(src);\n    return {\n        shaderName: shaderDescription,\n        errors: formatErrors(errors, lines),\n        warnings: formatErrors(warnings, lines)\n    };\n}\nfunction formatErrors(errors, lines) {\n    var message = \"\";\n    for(var i = 0; i < lines.length; i++){\n        var line = lines[i];\n        if (!errors[i + 3] && !errors[i + 2] && !errors[i + 1]) continue;\n        message += \"\".concat(line, \"\\n\");\n        if (errors[i + 1]) {\n            var error = errors[i + 1];\n            var segments = error.split(\":\", 3);\n            var type = segments[0];\n            var column = parseInt(segments[1], 10) || 0;\n            var err = error.substring(segments.join(\":\").length + 1).trim();\n            message += padLeft(\"^^^ \".concat(type, \": \").concat(err, \"\\n\\n\"), column);\n        }\n    }\n    return message;\n}\nfunction addLineNumbers(string) {\n    var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n    var delim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \": \";\n    var lines = string.split(/\\r?\\n/);\n    var maxDigits = String(lines.length + start - 1).length;\n    return lines.map(function(line, i) {\n        var lineNumber = i + start;\n        var digits = String(lineNumber).length;\n        var prefix = padLeft(lineNumber, maxDigits - digits);\n        return prefix + delim + line;\n    });\n}\nfunction padLeft(string, digits) {\n    var result = \"\";\n    for(var i = 0; i < digits; ++i)result += \" \";\n    return \"\".concat(result).concat(string);\n}\n\n},{\"./get-shader-name\":\"fe3Q6\",\"./get-shader-type-name\":\"MkeHb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fe3Q6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction getShaderName(shader) {\n    var defaultName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"unnamed\";\n    var SHADER_NAME_REGEXP = /#define[\\s*]SHADER_NAME[\\s*]([A-Za-z0-9_-]+)[\\s*]/;\n    var match = shader.match(SHADER_NAME_REGEXP);\n    return match ? match[1] : defaultName;\n}\nexports.default = getShaderName;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"MkeHb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar GL_FRAGMENT_SHADER = 0x8b30;\nvar GL_VERTEX_SHADER = 0x8b31;\nfunction getShaderTypeName(type) {\n    switch(type){\n        case GL_FRAGMENT_SHADER:\n            return \"fragment\";\n        case GL_VERTEX_SHADER:\n            return \"vertex\";\n        default:\n            return \"unknown type\";\n    }\n}\nexports.default = getShaderTypeName;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6Hh5D\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction getShaderVersion(source) {\n    var version = 100;\n    var words = source.match(/[^\\s]+/g);\n    if (words.length >= 2 && words[0] === \"#version\") {\n        var v = parseInt(words[1], 10);\n        if (Number.isFinite(v)) version = v;\n    }\n    return version;\n}\nexports.default = getShaderVersion;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"je3o0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Program);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _framebuffer = require(\"./framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _uniforms = require(\"./uniforms\");\nvar _shader = require(\"./shader\");\nvar _programConfiguration = require(\"./program-configuration\");\nvar _programConfigurationDefault = parcelHelpers.interopDefault(_programConfiguration);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webglUtils = require(\"../webgl-utils\");\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\nvar _utils = require(\"../utils\");\nvar LOG_PROGRAM_PERF_PRIORITY = 4;\nvar GL_SEPARATE_ATTRIBS = 0x8c8d;\nvar V6_DEPRECATED_METHODS = [\n    \"setVertexArray\",\n    \"setAttributes\",\n    \"setBuffers\",\n    \"unsetBuffers\",\n    \"use\",\n    \"getUniformCount\",\n    \"getUniformInfo\",\n    \"getUniformLocation\",\n    \"getUniformValue\",\n    \"getVarying\",\n    \"getFragDataLocation\",\n    \"getAttachedShaders\",\n    \"getAttributeCount\",\n    \"getAttributeLocation\",\n    \"getAttributeInfo\"\n];\nvar Program = function(_Resource) {\n    (0, _inheritsDefault.default)(Program1, _Resource);\n    function Program1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Program1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Program1).call(this, gl, props));\n        _this.stubRemovedMethods(\"Program\", \"v6.0\", V6_DEPRECATED_METHODS);\n        _this._isCached = false;\n        _this.initialize(props);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        _this._setId(props.id);\n        return _this;\n    }\n    (0, _createClassDefault.default)(Program1, [\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var hash = props.hash, vs = props.vs, fs = props.fs, varyings = props.varyings, _props$bufferMode = props.bufferMode, bufferMode = _props$bufferMode === void 0 ? GL_SEPARATE_ATTRIBS : _props$bufferMode;\n                this.hash = hash || \"\";\n                this.vs = typeof vs === \"string\" ? new (0, _shader.VertexShader)(this.gl, {\n                    id: \"\".concat(props.id, \"-vs\"),\n                    source: vs\n                }) : vs;\n                this.fs = typeof fs === \"string\" ? new (0, _shader.FragmentShader)(this.gl, {\n                    id: \"\".concat(props.id, \"-fs\"),\n                    source: fs\n                }) : fs;\n                (0, _utils.assert)(this.vs instanceof (0, _shader.VertexShader));\n                (0, _utils.assert)(this.fs instanceof (0, _shader.FragmentShader));\n                this.uniforms = {};\n                this._textureUniforms = {};\n                this._texturesRenderable = true;\n                if (varyings && varyings.length > 0) {\n                    (0, _webglUtils.assertWebGL2Context)(this.gl);\n                    this.varyings = varyings;\n                    this.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n                }\n                this._compileAndLink();\n                this._readUniformLocationsFromLinkedProgram();\n                this.configuration = new (0, _programConfigurationDefault.default)(this);\n                return this.setProps(props);\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (this._isCached) return this;\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Program1.prototype), \"delete\", this).call(this, options);\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"uniforms\" in props) this.setUniforms(props.uniforms);\n                return this;\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref) {\n                var _this2 = this;\n                var logPriority = _ref.logPriority, _ref$drawMode = _ref.drawMode, drawMode = _ref$drawMode === void 0 ? 4 : _ref$drawMode, vertexCount = _ref.vertexCount, _ref$offset = _ref.offset, offset = _ref$offset === void 0 ? 0 : _ref$offset, start = _ref.start, end = _ref.end, _ref$isIndexed = _ref.isIndexed, isIndexed = _ref$isIndexed === void 0 ? false : _ref$isIndexed, _ref$indexType = _ref.indexType, indexType = _ref$indexType === void 0 ? 5123 : _ref$indexType, _ref$instanceCount = _ref.instanceCount, instanceCount = _ref$instanceCount === void 0 ? 0 : _ref$instanceCount, _ref$isInstanced = _ref.isInstanced, isInstanced = _ref$isInstanced === void 0 ? instanceCount > 0 : _ref$isInstanced, _ref$vertexArray = _ref.vertexArray, vertexArray = _ref$vertexArray === void 0 ? null : _ref$vertexArray, transformFeedback = _ref.transformFeedback, framebuffer = _ref.framebuffer, _ref$parameters = _ref.parameters, parameters = _ref$parameters === void 0 ? {} : _ref$parameters, uniforms = _ref.uniforms, samplers = _ref.samplers;\n                if (uniforms || samplers) {\n                    (0, _gltools.log).deprecated(\"Program.draw({uniforms})\", \"Program.setUniforms(uniforms)\")();\n                    this.setUniforms(uniforms || {});\n                }\n                if ((0, _gltools.log).priority >= logPriority) {\n                    var fb = framebuffer ? framebuffer.id : \"default\";\n                    var message = \"mode=\".concat((0, _webglUtils.getKey)(this.gl, drawMode), \" verts=\").concat(vertexCount, \" \") + \"instances=\".concat(instanceCount, \" indexType=\").concat((0, _webglUtils.getKey)(this.gl, indexType), \" \") + \"isInstanced=\".concat(isInstanced, \" isIndexed=\").concat(isIndexed, \" \") + \"Framebuffer=\".concat(fb);\n                    (0, _gltools.log).log(logPriority, message)();\n                }\n                (0, _utils.assert)(vertexArray);\n                this.gl.useProgram(this.handle);\n                if (!this._areTexturesRenderable() || vertexCount === 0 || isInstanced && instanceCount === 0) return false;\n                vertexArray.bindForDraw(vertexCount, instanceCount, function() {\n                    if (framebuffer !== undefined) parameters = Object.assign({}, parameters, {\n                        framebuffer: framebuffer\n                    });\n                    if (transformFeedback) {\n                        var primitiveMode = (0, _attributeUtils.getPrimitiveDrawMode)(drawMode);\n                        transformFeedback.begin(primitiveMode);\n                    }\n                    _this2._bindTextures();\n                    (0, _gltools.withParameters)(_this2.gl, parameters, function() {\n                        if (isIndexed && isInstanced) _this2.gl.drawElementsInstanced(drawMode, vertexCount, indexType, offset, instanceCount);\n                        else if (isIndexed && (0, _gltools.isWebGL2)(_this2.gl) && !isNaN(start) && !isNaN(end)) _this2.gl.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n                        else if (isIndexed) _this2.gl.drawElements(drawMode, vertexCount, indexType, offset);\n                        else if (isInstanced) _this2.gl.drawArraysInstanced(drawMode, offset, vertexCount, instanceCount);\n                        else _this2.gl.drawArrays(drawMode, offset, vertexCount);\n                    });\n                    if (transformFeedback) transformFeedback.end();\n                });\n                return true;\n            }\n        },\n        {\n            key: \"setUniforms\",\n            value: function setUniforms() {\n                var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if ((0, _gltools.log).priority >= 2) (0, _uniforms.checkUniformValues)(uniforms, this.id, this._uniformSetters);\n                this.gl.useProgram(this.handle);\n                for(var uniformName in uniforms){\n                    var uniform = uniforms[uniformName];\n                    var uniformSetter = this._uniformSetters[uniformName];\n                    if (uniformSetter) {\n                        var value = uniform;\n                        var textureUpdate = false;\n                        if (value instanceof (0, _framebufferDefault.default)) value = value.texture;\n                        if (value instanceof (0, _textureDefault.default)) {\n                            textureUpdate = this.uniforms[uniformName] !== uniform;\n                            if (textureUpdate) {\n                                if (uniformSetter.textureIndex === undefined) uniformSetter.textureIndex = this._textureIndexCounter++;\n                                var texture = value;\n                                var textureIndex = uniformSetter.textureIndex;\n                                texture.bind(textureIndex);\n                                value = textureIndex;\n                                if (!texture.loaded) this._texturesRenderable = false;\n                                this._textureUniforms[uniformName] = texture;\n                            } else value = uniformSetter.textureIndex;\n                        } else if (this._textureUniforms[uniformName]) delete this._textureUniforms[uniformName];\n                        if (uniformSetter(value) || textureUpdate) (0, _uniforms.copyUniform)(this.uniforms, uniformName, uniform);\n                    }\n                }\n                return this;\n            }\n        },\n        {\n            key: \"_areTexturesRenderable\",\n            value: function _areTexturesRenderable() {\n                if (this._texturesRenderable) return true;\n                this._texturesRenderable = true;\n                for(var uniformName in this._textureUniforms){\n                    var texture = this._textureUniforms[uniformName];\n                    this._texturesRenderable = this._texturesRenderable && texture.loaded;\n                }\n                return this._texturesRenderable;\n            }\n        },\n        {\n            key: \"_bindTextures\",\n            value: function _bindTextures() {\n                for(var uniformName in this._textureUniforms){\n                    var textureIndex = this._uniformSetters[uniformName].textureIndex;\n                    this._textureUniforms[uniformName].bind(textureIndex);\n                }\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createProgram();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteProgram(this.handle);\n            }\n        },\n        {\n            key: \"_getOptionsFromHandle\",\n            value: function _getOptionsFromHandle(handle) {\n                var shaderHandles = this.gl.getAttachedShaders(handle);\n                var opts = {};\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = shaderHandles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var shaderHandle = _step.value;\n                        var type = this.gl.getShaderParameter(this.handle, 35663);\n                        switch(type){\n                            case 35633:\n                                opts.vs = new (0, _shader.VertexShader)({\n                                    handle: shaderHandle\n                                });\n                                break;\n                            case 35632:\n                                opts.fs = new (0, _shader.FragmentShader)({\n                                    handle: shaderHandle\n                                });\n                                break;\n                            default:\n                        }\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                return opts;\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname) {\n                return this.gl.getProgramParameter(this.handle, pname);\n            }\n        },\n        {\n            key: \"_setId\",\n            value: function _setId(id) {\n                if (!id) {\n                    var programName = this._getName();\n                    this.id = (0, _utils.uid)(programName);\n                }\n            }\n        },\n        {\n            key: \"_getName\",\n            value: function _getName() {\n                var programName = this.vs.getName() || this.fs.getName();\n                programName = programName.replace(/shader/i, \"\");\n                programName = programName ? \"\".concat(programName, \"-program\") : \"program\";\n                return programName;\n            }\n        },\n        {\n            key: \"_compileAndLink\",\n            value: function _compileAndLink() {\n                var gl = this.gl;\n                gl.attachShader(this.handle, this.vs.handle);\n                gl.attachShader(this.handle, this.fs.handle);\n                (0, _gltools.log).time(LOG_PROGRAM_PERF_PRIORITY, \"linkProgram for \".concat(this._getName()))();\n                gl.linkProgram(this.handle);\n                (0, _gltools.log).timeEnd(LOG_PROGRAM_PERF_PRIORITY, \"linkProgram for \".concat(this._getName()))();\n                if (gl.debug || (0, _gltools.log).level > 0) {\n                    var linked = gl.getProgramParameter(this.handle, 35714);\n                    if (!linked) throw new Error(\"Error linking: \".concat(gl.getProgramInfoLog(this.handle)));\n                    gl.validateProgram(this.handle);\n                    var validated = gl.getProgramParameter(this.handle, 35715);\n                    if (!validated) throw new Error(\"Error validating: \".concat(gl.getProgramInfoLog(this.handle)));\n                }\n            }\n        },\n        {\n            key: \"_readUniformLocationsFromLinkedProgram\",\n            value: function _readUniformLocationsFromLinkedProgram() {\n                var gl = this.gl;\n                this._uniformSetters = {};\n                this._uniformCount = this._getParameter(35718);\n                for(var i = 0; i < this._uniformCount; i++){\n                    var info = this.gl.getActiveUniform(this.handle, i);\n                    var _parseUniformName = (0, _uniforms.parseUniformName)(info.name), name = _parseUniformName.name, isArray = _parseUniformName.isArray;\n                    var location = gl.getUniformLocation(this.handle, name);\n                    this._uniformSetters[name] = (0, _uniforms.getUniformSetter)(gl, location, info, isArray);\n                    if (info.size > 1) for(var l = 0; l < info.size; l++){\n                        location = gl.getUniformLocation(this.handle, \"\".concat(name, \"[\").concat(l, \"]\"));\n                        this._uniformSetters[\"\".concat(name, \"[\").concat(l, \"]\")] = (0, _uniforms.getUniformSetter)(gl, location, info, isArray);\n                    }\n                }\n                this._textureIndexCounter = 0;\n            }\n        },\n        {\n            key: \"getActiveUniforms\",\n            value: function getActiveUniforms(uniformIndices, pname) {\n                return this.gl.getActiveUniforms(this.handle, uniformIndices, pname);\n            }\n        },\n        {\n            key: \"getUniformBlockIndex\",\n            value: function getUniformBlockIndex(blockName) {\n                return this.gl.getUniformBlockIndex(this.handle, blockName);\n            }\n        },\n        {\n            key: \"getActiveUniformBlockParameter\",\n            value: function getActiveUniformBlockParameter(blockIndex, pname) {\n                return this.gl.getActiveUniformBlockParameter(this.handle, blockIndex, pname);\n            }\n        },\n        {\n            key: \"uniformBlockBinding\",\n            value: function uniformBlockBinding(blockIndex, blockBinding) {\n                this.gl.uniformBlockBinding(this.handle, blockIndex, blockBinding);\n            }\n        }\n    ]);\n    return Program1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./resource\":\"1yIzW\",\"./texture\":\"e0vyJ\",\"./framebuffer\":\"62K0L\",\"./uniforms\":\"c7cHF\",\"./shader\":\"JIn1p\",\"./program-configuration\":\"iJRaY\",\"@luma.gl/gltools\":\"grcb8\",\"../webgl-utils\":\"c96L8\",\"../webgl-utils/attribute-utils\":\"fneLx\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c7cHF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parseUniformName\", ()=>parseUniformName);\nparcelHelpers.export(exports, \"getUniformSetter\", ()=>getUniformSetter);\nparcelHelpers.export(exports, \"checkUniformValues\", ()=>checkUniformValues);\nparcelHelpers.export(exports, \"copyUniform\", ()=>copyUniform);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _framebuffer = require(\"./framebuffer\");\nvar _framebufferDefault = parcelHelpers.interopDefault(_framebuffer);\nvar _renderbuffer = require(\"./renderbuffer\");\nvar _renderbufferDefault = parcelHelpers.interopDefault(_renderbuffer);\nvar _texture = require(\"./texture\");\nvar _textureDefault = parcelHelpers.interopDefault(_texture);\nvar _utils = require(\"../utils\");\nvar _UNIFORM_SETTERS;\nvar UNIFORM_SETTERS = (_UNIFORM_SETTERS = {}, (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 5126, getArraySetter.bind(null, \"uniform1fv\", toFloatArray, 1, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35664, getArraySetter.bind(null, \"uniform2fv\", toFloatArray, 2, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35665, getArraySetter.bind(null, \"uniform3fv\", toFloatArray, 3, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35666, getArraySetter.bind(null, \"uniform4fv\", toFloatArray, 4, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 5124, getArraySetter.bind(null, \"uniform1iv\", toIntArray, 1, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35667, getArraySetter.bind(null, \"uniform2iv\", toIntArray, 2, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35668, getArraySetter.bind(null, \"uniform3iv\", toIntArray, 3, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35669, getArraySetter.bind(null, \"uniform4iv\", toIntArray, 4, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35670, getArraySetter.bind(null, \"uniform1iv\", toIntArray, 1, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35671, getArraySetter.bind(null, \"uniform2iv\", toIntArray, 2, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35672, getArraySetter.bind(null, \"uniform3iv\", toIntArray, 3, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35673, getArraySetter.bind(null, \"uniform4iv\", toIntArray, 4, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35674, getArraySetter.bind(null, \"uniformMatrix2fv\", toFloatArray, 4, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35675, getArraySetter.bind(null, \"uniformMatrix3fv\", toFloatArray, 9, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35676, getArraySetter.bind(null, \"uniformMatrix4fv\", toFloatArray, 16, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35678, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35680, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 5125, getArraySetter.bind(null, \"uniform1uiv\", toUIntArray, 1, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36294, getArraySetter.bind(null, \"uniform2uiv\", toUIntArray, 2, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36295, getArraySetter.bind(null, \"uniform3uiv\", toUIntArray, 3, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36296, getArraySetter.bind(null, \"uniform4uiv\", toUIntArray, 4, setVectorUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35685, getArraySetter.bind(null, \"uniformMatrix2x3fv\", toFloatArray, 6, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35686, getArraySetter.bind(null, \"uniformMatrix2x4fv\", toFloatArray, 8, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35687, getArraySetter.bind(null, \"uniformMatrix3x2fv\", toFloatArray, 6, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35688, getArraySetter.bind(null, \"uniformMatrix3x4fv\", toFloatArray, 12, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35689, getArraySetter.bind(null, \"uniformMatrix4x2fv\", toFloatArray, 8, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35690, getArraySetter.bind(null, \"uniformMatrix4x3fv\", toFloatArray, 12, setMatrixUniform)), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35679, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 35682, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36289, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36292, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36293, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36298, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36299, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36300, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36303, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36306, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36307, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36308, getSamplerSetter), (0, _definePropertyDefault.default)(_UNIFORM_SETTERS, 36311, getSamplerSetter), _UNIFORM_SETTERS);\nvar FLOAT_ARRAY = {};\nvar INT_ARRAY = {};\nvar UINT_ARRAY = {};\nvar array1 = [\n    0\n];\nfunction toTypedArray(value, uniformLength, Type, cache) {\n    if (uniformLength === 1 && typeof value === \"boolean\") value = value ? 1 : 0;\n    if (Number.isFinite(value)) {\n        array1[0] = value;\n        value = array1;\n    }\n    var length = value.length;\n    if (length % uniformLength) (0, _gltools.log).warn(\"Uniform size should be multiples of \".concat(uniformLength), value)();\n    if (value instanceof Type) return value;\n    var result = cache[length];\n    if (!result) {\n        result = new Type(length);\n        cache[length] = result;\n    }\n    for(var i = 0; i < length; i++)result[i] = value[i];\n    return result;\n}\nfunction toFloatArray(value, uniformLength) {\n    return toTypedArray(value, uniformLength, Float32Array, FLOAT_ARRAY);\n}\nfunction toIntArray(value, uniformLength) {\n    return toTypedArray(value, uniformLength, Int32Array, INT_ARRAY);\n}\nfunction toUIntArray(value, uniformLength) {\n    return toTypedArray(value, uniformLength, Uint32Array, UINT_ARRAY);\n}\nfunction parseUniformName(name) {\n    if (name[name.length - 1] !== \"]\") return {\n        name: name,\n        length: 1,\n        isArray: false\n    };\n    var UNIFORM_NAME_REGEXP = /([^[]*)(\\[[0-9]+\\])?/;\n    var matches = name.match(UNIFORM_NAME_REGEXP);\n    if (!matches || matches.length < 2) throw new Error(\"Failed to parse GLSL uniform name \".concat(name));\n    return {\n        name: matches[1],\n        length: matches[2] || 1,\n        isArray: Boolean(matches[2])\n    };\n}\nfunction getUniformSetter(gl, location, info) {\n    var setter = UNIFORM_SETTERS[info.type];\n    if (!setter) throw new Error(\"Unknown GLSL uniform type \".concat(info.type));\n    return setter().bind(null, gl, location);\n}\nfunction checkUniformValues(uniforms, source, uniformMap) {\n    for(var uniformName in uniforms){\n        var value = uniforms[uniformName];\n        var shouldCheck = !uniformMap || Boolean(uniformMap[uniformName]);\n        if (shouldCheck && !checkUniformValue(value)) {\n            source = source ? \"\".concat(source, \" \") : \"\";\n            console.error(\"\".concat(source, \" Bad uniform \").concat(uniformName), value);\n            throw new Error(\"\".concat(source, \" Bad uniform \").concat(uniformName));\n        }\n    }\n    return true;\n}\nfunction checkUniformValue(value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) return checkUniformArray(value);\n    if (isFinite(value)) return true;\n    else if (value === true || value === false) return true;\n    else if (value instanceof (0, _textureDefault.default)) return true;\n    else if (value instanceof (0, _renderbufferDefault.default)) return true;\n    else if (value instanceof (0, _framebufferDefault.default)) return Boolean(value.texture);\n    return false;\n}\nfunction checkUniformArray(value) {\n    if (value.length === 0) return false;\n    var checkLength = Math.min(value.length, 16);\n    for(var i = 0; i < checkLength; ++i){\n        if (!Number.isFinite(value[i])) return false;\n    }\n    return true;\n}\nfunction copyUniform(uniforms, key, value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n        if (uniforms[key]) {\n            var dest = uniforms[key];\n            for(var i = 0, len = value.length; i < len; ++i)dest[i] = value[i];\n        } else uniforms[key] = value.slice();\n    } else uniforms[key] = value;\n}\nfunction getSamplerSetter() {\n    var cache = null;\n    return function(gl, location, value) {\n        var update = cache !== value;\n        if (update) {\n            gl.uniform1i(location, value);\n            cache = value;\n        }\n        return update;\n    };\n}\nfunction getArraySetter(functionName, toArray, size, uniformSetter) {\n    var cache = null;\n    var cacheLength = null;\n    return function(gl, location, value) {\n        var arrayValue = toArray(value, size);\n        var length = arrayValue.length;\n        var update = false;\n        if (cache === null) {\n            cache = new Float32Array(length);\n            cacheLength = length;\n            update = true;\n        } else {\n            (0, _utils.assert)(cacheLength === length, \"Uniform length cannot change.\");\n            for(var i = 0; i < length; ++i)if (arrayValue[i] !== cache[i]) {\n                update = true;\n                break;\n            }\n        }\n        if (update) {\n            uniformSetter(gl, functionName, location, arrayValue);\n            cache.set(arrayValue);\n        }\n        return update;\n    };\n}\nfunction setVectorUniform(gl, functionName, location, value) {\n    gl[functionName](location, value);\n}\nfunction setMatrixUniform(gl, functionName, location, value) {\n    gl[functionName](location, false, value);\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@luma.gl/gltools\":\"grcb8\",\"./framebuffer\":\"62K0L\",\"./renderbuffer\":\"am3Nj\",\"./texture\":\"e0vyJ\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iJRaY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ProgramConfiguration);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _accessor = require(\"./accessor\");\nvar _accessorDefault = parcelHelpers.interopDefault(_accessor);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\nvar ProgramConfiguration = function() {\n    function ProgramConfiguration1(program) {\n        (0, _classCallCheckDefault.default)(this, ProgramConfiguration1);\n        this.id = program.id;\n        this.attributeInfos = [];\n        this.attributeInfosByName = {};\n        this.attributeInfosByLocation = [];\n        this.varyingInfos = [];\n        this.varyingInfosByName = {};\n        Object.seal(this);\n        this._readAttributesFromProgram(program);\n        this._readVaryingsFromProgram(program);\n    }\n    (0, _createClassDefault.default)(ProgramConfiguration1, [\n        {\n            key: \"getAttributeInfo\",\n            value: function getAttributeInfo(locationOrName) {\n                var location = Number(locationOrName);\n                if (Number.isFinite(location)) return this.attributeInfosByLocation[location];\n                return this.attributeInfosByName[locationOrName] || null;\n            }\n        },\n        {\n            key: \"getAttributeLocation\",\n            value: function getAttributeLocation(locationOrName) {\n                var attributeInfo = this.getAttributeInfo(locationOrName);\n                return attributeInfo ? attributeInfo.location : -1;\n            }\n        },\n        {\n            key: \"getAttributeAccessor\",\n            value: function getAttributeAccessor(locationOrName) {\n                var attributeInfo = this.getAttributeInfo(locationOrName);\n                return attributeInfo ? attributeInfo.accessor : null;\n            }\n        },\n        {\n            key: \"getVaryingInfo\",\n            value: function getVaryingInfo(locationOrName) {\n                var location = Number(locationOrName);\n                if (Number.isFinite(location)) return this.varyingInfos[location];\n                return this.varyingInfosByName[locationOrName] || null;\n            }\n        },\n        {\n            key: \"getVaryingIndex\",\n            value: function getVaryingIndex(locationOrName) {\n                var varying = this.getVaryingInfo();\n                return varying ? varying.location : -1;\n            }\n        },\n        {\n            key: \"getVaryingAccessor\",\n            value: function getVaryingAccessor(locationOrName) {\n                var varying = this.getVaryingInfo();\n                return varying ? varying.accessor : null;\n            }\n        },\n        {\n            key: \"_readAttributesFromProgram\",\n            value: function _readAttributesFromProgram(program) {\n                var gl = program.gl;\n                var count = gl.getProgramParameter(program.handle, 35721);\n                for(var index = 0; index < count; index++){\n                    var _gl$getActiveAttrib = gl.getActiveAttrib(program.handle, index), name = _gl$getActiveAttrib.name, type = _gl$getActiveAttrib.type, size = _gl$getActiveAttrib.size;\n                    var location = gl.getAttribLocation(program.handle, name);\n                    if (location >= 0) this._addAttribute(location, name, type, size);\n                }\n                this.attributeInfos.sort(function(a, b) {\n                    return a.location - b.location;\n                });\n            }\n        },\n        {\n            key: \"_readVaryingsFromProgram\",\n            value: function _readVaryingsFromProgram(program) {\n                var gl = program.gl;\n                if (!(0, _gltools.isWebGL2)(gl)) return;\n                var count = gl.getProgramParameter(program.handle, 35971);\n                for(var location = 0; location < count; location++){\n                    var _gl$getTransformFeedb = gl.getTransformFeedbackVarying(program.handle, location), name = _gl$getTransformFeedb.name, type = _gl$getTransformFeedb.type, size = _gl$getTransformFeedb.size;\n                    this._addVarying(location, name, type, size);\n                }\n                this.varyingInfos.sort(function(a, b) {\n                    return a.location - b.location;\n                });\n            }\n        },\n        {\n            key: \"_addAttribute\",\n            value: function _addAttribute(location, name, compositeType, size) {\n                var _decomposeCompositeGL = (0, _attributeUtils.decomposeCompositeGLType)(compositeType), type = _decomposeCompositeGL.type, components = _decomposeCompositeGL.components;\n                var accessor = {\n                    type: type,\n                    size: size * components\n                };\n                this._inferProperties(location, name, accessor);\n                var attributeInfo = {\n                    location: location,\n                    name: name,\n                    accessor: new (0, _accessorDefault.default)(accessor)\n                };\n                this.attributeInfos.push(attributeInfo);\n                this.attributeInfosByLocation[location] = attributeInfo;\n                this.attributeInfosByName[attributeInfo.name] = attributeInfo;\n            }\n        },\n        {\n            key: \"_inferProperties\",\n            value: function _inferProperties(location, name, accessor) {\n                if (/instance/i.test(name)) accessor.divisor = 1;\n            }\n        },\n        {\n            key: \"_addVarying\",\n            value: function _addVarying(location, name, compositeType, size) {\n                var _decomposeCompositeGL2 = (0, _attributeUtils.decomposeCompositeGLType)(compositeType), type = _decomposeCompositeGL2.type, components = _decomposeCompositeGL2.components;\n                var accessor = new (0, _accessorDefault.default)({\n                    type: type,\n                    size: size * components\n                });\n                var varying = {\n                    location: location,\n                    name: name,\n                    accessor: accessor\n                };\n                this.varyingInfos.push(varying);\n                this.varyingInfosByName[varying.name] = varying;\n            }\n        }\n    ]);\n    return ProgramConfiguration1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./accessor\":\"dlKlM\",\"@luma.gl/gltools\":\"grcb8\",\"../webgl-utils/attribute-utils\":\"fneLx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fneLx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getPrimitiveDrawMode\", ()=>getPrimitiveDrawMode);\nparcelHelpers.export(exports, \"getPrimitiveCount\", ()=>getPrimitiveCount);\nparcelHelpers.export(exports, \"getVertexCount\", ()=>getVertexCount);\nparcelHelpers.export(exports, \"decomposeCompositeGLType\", ()=>decomposeCompositeGLType);\nparcelHelpers.export(exports, \"getCompositeGLType\", ()=>getCompositeGLType);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nvar _COMPOSITE_GL_TYPES;\nvar GL_BYTE = 0x1400;\nvar GL_UNSIGNED_BYTE = 0x1401;\nvar GL_SHORT = 0x1402;\nvar GL_UNSIGNED_SHORT = 0x1403;\nvar GL_POINTS = 0x0;\nvar GL_LINES = 0x1;\nvar GL_LINE_LOOP = 0x2;\nvar GL_LINE_STRIP = 0x3;\nvar GL_TRIANGLES = 0x4;\nvar GL_TRIANGLE_STRIP = 0x5;\nvar GL_TRIANGLE_FAN = 0x6;\nvar GL_FLOAT = 0x1406;\nvar GL_FLOAT_VEC2 = 0x8b50;\nvar GL_FLOAT_VEC3 = 0x8b51;\nvar GL_FLOAT_VEC4 = 0x8b52;\nvar GL_INT = 0x1404;\nvar GL_INT_VEC2 = 0x8b53;\nvar GL_INT_VEC3 = 0x8b54;\nvar GL_INT_VEC4 = 0x8b55;\nvar GL_UNSIGNED_INT = 0x1405;\nvar GL_UNSIGNED_INT_VEC2 = 0x8dc6;\nvar GL_UNSIGNED_INT_VEC3 = 0x8dc7;\nvar GL_UNSIGNED_INT_VEC4 = 0x8dc8;\nvar GL_BOOL = 0x8b56;\nvar GL_BOOL_VEC2 = 0x8b57;\nvar GL_BOOL_VEC3 = 0x8b58;\nvar GL_BOOL_VEC4 = 0x8b59;\nvar GL_FLOAT_MAT2 = 0x8b5a;\nvar GL_FLOAT_MAT3 = 0x8b5b;\nvar GL_FLOAT_MAT4 = 0x8b5c;\nvar GL_FLOAT_MAT2x3 = 0x8b65;\nvar GL_FLOAT_MAT2x4 = 0x8b66;\nvar GL_FLOAT_MAT3x2 = 0x8b67;\nvar GL_FLOAT_MAT3x4 = 0x8b68;\nvar GL_FLOAT_MAT4x2 = 0x8b69;\nvar GL_FLOAT_MAT4x3 = 0x8b6a;\nvar COMPOSITE_GL_TYPES = (_COMPOSITE_GL_TYPES = {}, (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT, [\n    GL_FLOAT,\n    1,\n    \"float\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC2, [\n    GL_FLOAT,\n    2,\n    \"vec2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC3, [\n    GL_FLOAT,\n    3,\n    \"vec3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_VEC4, [\n    GL_FLOAT,\n    4,\n    \"vec4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_INT, [\n    GL_INT,\n    1,\n    \"int\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC2, [\n    GL_INT,\n    2,\n    \"ivec2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC3, [\n    GL_INT,\n    3,\n    \"ivec3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_INT_VEC4, [\n    GL_INT,\n    4,\n    \"ivec4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT, [\n    GL_UNSIGNED_INT,\n    1,\n    \"uint\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC2, [\n    GL_UNSIGNED_INT,\n    2,\n    \"uvec2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC3, [\n    GL_UNSIGNED_INT,\n    3,\n    \"uvec3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_UNSIGNED_INT_VEC4, [\n    GL_UNSIGNED_INT,\n    4,\n    \"uvec4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_BOOL, [\n    GL_FLOAT,\n    1,\n    \"bool\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC2, [\n    GL_FLOAT,\n    2,\n    \"bvec2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC3, [\n    GL_FLOAT,\n    3,\n    \"bvec3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_BOOL_VEC4, [\n    GL_FLOAT,\n    4,\n    \"bvec4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2, [\n    GL_FLOAT,\n    8,\n    \"mat2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2x3, [\n    GL_FLOAT,\n    8,\n    \"mat2x3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT2x4, [\n    GL_FLOAT,\n    8,\n    \"mat2x4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3, [\n    GL_FLOAT,\n    12,\n    \"mat3\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3x2, [\n    GL_FLOAT,\n    12,\n    \"mat3x2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT3x4, [\n    GL_FLOAT,\n    12,\n    \"mat3x4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4, [\n    GL_FLOAT,\n    16,\n    \"mat4\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4x2, [\n    GL_FLOAT,\n    16,\n    \"mat4x2\"\n]), (0, _definePropertyDefault.default)(_COMPOSITE_GL_TYPES, GL_FLOAT_MAT4x3, [\n    GL_FLOAT,\n    16,\n    \"mat4x3\"\n]), _COMPOSITE_GL_TYPES);\nfunction getPrimitiveDrawMode(drawMode) {\n    switch(drawMode){\n        case GL_POINTS:\n            return GL_POINTS;\n        case GL_LINES:\n            return GL_LINES;\n        case GL_LINE_STRIP:\n            return GL_LINES;\n        case GL_LINE_LOOP:\n            return GL_LINES;\n        case GL_TRIANGLES:\n            return GL_TRIANGLES;\n        case GL_TRIANGLE_STRIP:\n            return GL_TRIANGLES;\n        case GL_TRIANGLE_FAN:\n            return GL_TRIANGLES;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\nfunction getPrimitiveCount(_ref) {\n    var drawMode = _ref.drawMode, vertexCount = _ref.vertexCount;\n    switch(drawMode){\n        case GL_POINTS:\n        case GL_LINE_LOOP:\n            return vertexCount;\n        case GL_LINES:\n            return vertexCount / 2;\n        case GL_LINE_STRIP:\n            return vertexCount - 1;\n        case GL_TRIANGLES:\n            return vertexCount / 3;\n        case GL_TRIANGLE_STRIP:\n        case GL_TRIANGLE_FAN:\n            return vertexCount - 2;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\nfunction getVertexCount(_ref2) {\n    var drawMode = _ref2.drawMode, vertexCount = _ref2.vertexCount;\n    var primitiveCount = getPrimitiveCount({\n        drawMode: drawMode,\n        vertexCount: vertexCount\n    });\n    switch(getPrimitiveDrawMode(drawMode)){\n        case GL_POINTS:\n            return primitiveCount;\n        case GL_LINES:\n            return primitiveCount * 2;\n        case GL_TRIANGLES:\n            return primitiveCount * 3;\n        default:\n            (0, _utils.assert)(false);\n            return 0;\n    }\n}\nfunction decomposeCompositeGLType(compositeGLType) {\n    var typeAndSize = COMPOSITE_GL_TYPES[compositeGLType];\n    if (!typeAndSize) return null;\n    var _typeAndSize = (0, _slicedToArrayDefault.default)(typeAndSize, 2), type = _typeAndSize[0], components = _typeAndSize[1];\n    return {\n        type: type,\n        components: components\n    };\n}\nfunction getCompositeGLType(type, components) {\n    switch(type){\n        case GL_BYTE:\n        case GL_UNSIGNED_BYTE:\n        case GL_SHORT:\n        case GL_UNSIGNED_SHORT:\n            type = GL_FLOAT;\n            break;\n        default:\n    }\n    for(var glType in COMPOSITE_GL_TYPES){\n        var _COMPOSITE_GL_TYPES$g = (0, _slicedToArrayDefault.default)(COMPOSITE_GL_TYPES[glType], 3), compType = _COMPOSITE_GL_TYPES$g[0], compComponents = _COMPOSITE_GL_TYPES$g[1], name = _COMPOSITE_GL_TYPES$g[2];\n        if (compType === type && compComponents === components) return {\n            glType: glType,\n            name: name\n        };\n    }\n    return null;\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kXVBY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Query);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _features = require(\"../features\");\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _utils = require(\"../utils\");\nvar GL_QUERY_RESULT = 0x8866;\nvar GL_QUERY_RESULT_AVAILABLE = 0x8867;\nvar GL_TIME_ELAPSED_EXT = 0x88bf;\nvar GL_GPU_DISJOINT_EXT = 0x8fbb;\nvar GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8c88;\nvar GL_ANY_SAMPLES_PASSED = 0x8c2f;\nvar GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8d6a;\nvar Query = function(_Resource) {\n    (0, _inheritsDefault.default)(Query1, _Resource);\n    (0, _createClassDefault.default)(Query1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n                var webgl2 = (0, _gltools.isWebGL2)(gl);\n                var hasTimerQuery = (0, _features.hasFeatures)(gl, (0, _features.FEATURES).TIMER_QUERY);\n                var supported = webgl2 || hasTimerQuery;\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = opts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var key = _step.value;\n                        switch(key){\n                            case \"queries\":\n                                supported = supported && webgl2;\n                                break;\n                            case \"timers\":\n                                supported = supported && hasTimerQuery;\n                                break;\n                            default:\n                                (0, _utils.assert)(false);\n                        }\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                return supported;\n            }\n        }\n    ]);\n    function Query1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Query1);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(Query1).call(this, gl, opts));\n        _this.target = null;\n        _this._queryPending = false;\n        _this._pollingPromise = null;\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(Query1, [\n        {\n            key: \"beginTimeElapsedQuery\",\n            value: function beginTimeElapsedQuery() {\n                return this.begin(GL_TIME_ELAPSED_EXT);\n            }\n        },\n        {\n            key: \"beginOcclusionQuery\",\n            value: function beginOcclusionQuery() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$conservative = _ref.conservative, conservative = _ref$conservative === void 0 ? false : _ref$conservative;\n                return this.begin(conservative ? GL_ANY_SAMPLES_PASSED_CONSERVATIVE : GL_ANY_SAMPLES_PASSED);\n            }\n        },\n        {\n            key: \"beginTransformFeedbackQuery\",\n            value: function beginTransformFeedbackQuery() {\n                return this.begin(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);\n            }\n        },\n        {\n            key: \"begin\",\n            value: function begin(target) {\n                if (this._queryPending) return this;\n                this.target = target;\n                this.gl.beginQuery(this.target, this.handle);\n                return this;\n            }\n        },\n        {\n            key: \"end\",\n            value: function end() {\n                if (this._queryPending) return this;\n                if (this.target) {\n                    this.gl.endQuery(this.target);\n                    this.target = null;\n                    this._queryPending = true;\n                }\n                return this;\n            }\n        },\n        {\n            key: \"isResultAvailable\",\n            value: function isResultAvailable() {\n                if (!this._queryPending) return false;\n                var resultAvailable = this.gl.getQueryParameter(this.handle, GL_QUERY_RESULT_AVAILABLE);\n                if (resultAvailable) this._queryPending = false;\n                return resultAvailable;\n            }\n        },\n        {\n            key: \"isTimerDisjoint\",\n            value: function isTimerDisjoint() {\n                return this.gl.getParameter(GL_GPU_DISJOINT_EXT);\n            }\n        },\n        {\n            key: \"getResult\",\n            value: function getResult() {\n                return this.gl.getQueryParameter(this.handle, GL_QUERY_RESULT);\n            }\n        },\n        {\n            key: \"getTimerMilliseconds\",\n            value: function getTimerMilliseconds() {\n                return this.getResult() / 1e6;\n            }\n        },\n        {\n            key: \"createPoll\",\n            value: function createPoll() {\n                var _this2 = this;\n                var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.POSITIVE_INFINITY;\n                if (this._pollingPromise) return this._pollingPromise;\n                var counter = 0;\n                this._pollingPromise = new Promise(function(resolve, reject) {\n                    var poll1 = function poll() {\n                        if (_this2.isResultAvailable()) {\n                            resolve(_this2.getResult());\n                            _this2._pollingPromise = null;\n                        } else if ((counter++) > limit) {\n                            reject(\"Timed out\");\n                            _this2._pollingPromise = null;\n                        } else requestAnimationFrame(poll);\n                    };\n                    requestAnimationFrame(poll1);\n                });\n                return this._pollingPromise;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return Query1.isSupported(this.gl) ? this.gl.createQuery() : null;\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteQuery(this.handle);\n            }\n        }\n    ]);\n    return Query1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./resource\":\"1yIzW\",\"../features\":\"jlK3J\",\"@luma.gl/gltools\":\"grcb8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ftDTD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TransformFeedback);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _utils = require(\"../utils\");\nvar TransformFeedback = function(_Resource) {\n    (0, _inheritsDefault.default)(TransformFeedback1, _Resource);\n    (0, _createClassDefault.default)(TransformFeedback1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                return (0, _gltools.isWebGL2)(gl);\n            }\n        }\n    ]);\n    function TransformFeedback1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, TransformFeedback1);\n        (0, _webglUtils.assertWebGL2Context)(gl);\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(TransformFeedback1).call(this, gl, props));\n        _this.initialize(props);\n        _this.stubRemovedMethods(\"TransformFeedback\", \"v6.0\", [\n            \"pause\",\n            \"resume\"\n        ]);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(TransformFeedback1, [\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var _this2 = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this.buffers = {};\n                this.unused = {};\n                this.configuration = null;\n                this.bindOnUse = true;\n                if (!(0, _utils.isObjectEmpty)(this.buffers)) this.bind(function() {\n                    return _this2._unbindBuffers();\n                });\n                this.setProps(props);\n                return this;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"program\" in props) this.configuration = props.program && props.program.configuration;\n                if (\"configuration\" in props) this.configuration = props.configuration;\n                if (\"bindOnUse\" in props) props = props.bindOnUse;\n                if (\"buffers\" in props) this.setBuffers(props.buffers);\n            }\n        },\n        {\n            key: \"setBuffers\",\n            value: function setBuffers() {\n                var _this3 = this;\n                var buffers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this.bind(function() {\n                    for(var bufferName in buffers)_this3.setBuffer(bufferName, buffers[bufferName]);\n                });\n                return this;\n            }\n        },\n        {\n            key: \"setBuffer\",\n            value: function setBuffer(locationOrName, bufferOrParams) {\n                var _this4 = this;\n                var location = this._getVaryingIndex(locationOrName);\n                var _this$_getBufferParam = this._getBufferParams(bufferOrParams), buffer = _this$_getBufferParam.buffer, byteSize = _this$_getBufferParam.byteSize, byteOffset = _this$_getBufferParam.byteOffset;\n                if (location < 0) {\n                    this.unused[locationOrName] = buffer;\n                    (0, _gltools.log).warn(function() {\n                        return \"\".concat(_this4.id, \" unused varying buffer \").concat(locationOrName);\n                    })();\n                    return this;\n                }\n                this.buffers[location] = bufferOrParams;\n                if (!this.bindOnUse) this._bindBuffer(location, buffer, byteOffset, byteSize);\n                return this;\n            }\n        },\n        {\n            key: \"begin\",\n            value: function begin() {\n                var primitiveMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n                this.gl.bindTransformFeedback(36386, this.handle);\n                this._bindBuffers();\n                this.gl.beginTransformFeedback(primitiveMode);\n                return this;\n            }\n        },\n        {\n            key: \"end\",\n            value: function end() {\n                this.gl.endTransformFeedback();\n                this._unbindBuffers();\n                this.gl.bindTransformFeedback(36386, null);\n                return this;\n            }\n        },\n        {\n            key: \"_getBufferParams\",\n            value: function _getBufferParams(bufferOrParams) {\n                var byteOffset;\n                var byteSize;\n                var buffer;\n                if (bufferOrParams instanceof (0, _bufferDefault.default) === false) {\n                    buffer = bufferOrParams.buffer;\n                    byteSize = bufferOrParams.byteSize;\n                    byteOffset = bufferOrParams.byteOffset;\n                } else buffer = bufferOrParams;\n                if (byteOffset !== undefined || byteSize !== undefined) {\n                    byteOffset = byteOffset || 0;\n                    byteSize = byteSize || buffer.byteLength - byteOffset;\n                }\n                return {\n                    buffer: buffer,\n                    byteOffset: byteOffset,\n                    byteSize: byteSize\n                };\n            }\n        },\n        {\n            key: \"_getVaryingInfo\",\n            value: function _getVaryingInfo(locationOrName) {\n                return this.configuration && this.configuration.getVaryingInfo(locationOrName);\n            }\n        },\n        {\n            key: \"_getVaryingIndex\",\n            value: function _getVaryingIndex(locationOrName) {\n                if (this.configuration) return this.configuration.getVaryingInfo(locationOrName).location;\n                var location = Number(locationOrName);\n                return Number.isFinite(location) ? location : -1;\n            }\n        },\n        {\n            key: \"_bindBuffers\",\n            value: function _bindBuffers() {\n                if (this.bindOnUse) for(var bufferIndex in this.buffers){\n                    var _this$_getBufferParam2 = this._getBufferParams(this.buffers[bufferIndex]), buffer = _this$_getBufferParam2.buffer, byteSize = _this$_getBufferParam2.byteSize, byteOffset = _this$_getBufferParam2.byteOffset;\n                    this._bindBuffer(bufferIndex, buffer, byteOffset, byteSize);\n                }\n            }\n        },\n        {\n            key: \"_unbindBuffers\",\n            value: function _unbindBuffers() {\n                if (this.bindOnUse) for(var bufferIndex in this.buffers)this._bindBuffer(bufferIndex, null);\n            }\n        },\n        {\n            key: \"_bindBuffer\",\n            value: function _bindBuffer(index, buffer) {\n                var byteOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n                var byteSize = arguments.length > 3 ? arguments[3] : undefined;\n                var handle = buffer && buffer.handle;\n                if (!handle || byteSize === undefined) this.gl.bindBufferBase(35982, index, handle);\n                else this.gl.bindBufferRange(35982, index, handle, byteOffset, byteSize);\n                return this;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createTransformFeedback();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle() {\n                this.gl.deleteTransformFeedback(this.handle);\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle(handle) {\n                this.gl.bindTransformFeedback(36386, this.handle);\n            }\n        }\n    ]);\n    return TransformFeedback1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@luma.gl/gltools\":\"grcb8\",\"./resource\":\"1yIzW\",\"./buffer\":\"98zcF\",\"../webgl-utils\":\"c96L8\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eAFK7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>VertexArrayObject);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _arrayUtilsFlat = require(\"../utils/array-utils-flat\");\nvar _utils = require(\"../utils\");\nvar _probeGl = require(\"probe.gl\");\nvar ERR_ELEMENTS = \"elements must be GL.ELEMENT_ARRAY_BUFFER\";\nvar VertexArrayObject = function(_Resource) {\n    (0, _inheritsDefault.default)(VertexArrayObject1, _Resource);\n    (0, _createClassDefault.default)(VertexArrayObject1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                if (options.constantAttributeZero) return (0, _gltools.isWebGL2)(gl) || (0, _probeGl.getBrowser)() === \"Chrome\";\n                return true;\n            }\n        },\n        {\n            key: \"getDefaultArray\",\n            value: function getDefaultArray(gl) {\n                gl.luma = gl.luma || {};\n                if (!gl.luma.defaultVertexArray) gl.luma.defaultVertexArray = new VertexArrayObject1(gl, {\n                    handle: null,\n                    isDefaultArray: true\n                });\n                return gl.luma.defaultVertexArray;\n            }\n        },\n        {\n            key: \"getMaxAttributes\",\n            value: function getMaxAttributes(gl) {\n                VertexArrayObject1.MAX_ATTRIBUTES = VertexArrayObject1.MAX_ATTRIBUTES || gl.getParameter(34921);\n                return VertexArrayObject1.MAX_ATTRIBUTES;\n            }\n        },\n        {\n            key: \"setConstant\",\n            value: function setConstant(gl, location, array) {\n                switch(array.constructor){\n                    case Float32Array:\n                        VertexArrayObject1._setConstantFloatArray(gl, location, array);\n                        break;\n                    case Int32Array:\n                        VertexArrayObject1._setConstantIntArray(gl, location, array);\n                        break;\n                    case Uint32Array:\n                        VertexArrayObject1._setConstantUintArray(gl, location, array);\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n            }\n        }\n    ]);\n    function VertexArrayObject1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, VertexArrayObject1);\n        var id = opts.id || opts.program && opts.program.id;\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(VertexArrayObject1).call(this, gl, Object.assign({}, opts, {\n            id: id\n        })));\n        _this.buffer = null;\n        _this.bufferValue = null;\n        _this.isDefaultArray = opts.isDefaultArray || false;\n        _this.initialize(opts);\n        Object.seal((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(VertexArrayObject1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(VertexArrayObject1.prototype), \"delete\", this).call(this);\n                if (this.buffer) this.buffer[\"delete\"]();\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                return this.setProps(props);\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                return this;\n            }\n        },\n        {\n            key: \"setElementBuffer\",\n            value: function setElementBuffer() {\n                var _this2 = this;\n                var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                (0, _utils.assert)(!elementBuffer || elementBuffer.target === 34963, ERR_ELEMENTS);\n                this.bind(function() {\n                    _this2.gl.bindBuffer(34963, elementBuffer ? elementBuffer.handle : null);\n                });\n                return this;\n            }\n        },\n        {\n            key: \"setBuffer\",\n            value: function setBuffer(location, buffer, accessor) {\n                if (buffer.target === 34963) return this.setElementBuffer(buffer, accessor);\n                var size = accessor.size, type = accessor.type, stride = accessor.stride, offset = accessor.offset, normalized = accessor.normalized, integer = accessor.integer, divisor = accessor.divisor;\n                var gl = this.gl;\n                location = Number(location);\n                this.bind(function() {\n                    gl.bindBuffer(34962, buffer.handle);\n                    if (integer) {\n                        (0, _utils.assert)((0, _gltools.isWebGL2)(gl));\n                        gl.vertexAttribIPointer(location, size, type, stride, offset);\n                    } else gl.vertexAttribPointer(location, size, type, normalized, stride, offset);\n                    gl.enableVertexAttribArray(location);\n                    gl.vertexAttribDivisor(location, divisor || 0);\n                });\n                return this;\n            }\n        },\n        {\n            key: \"enable\",\n            value: function enable(location) {\n                var _this3 = this;\n                var _enable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n                var disablingAttributeZero = !_enable && location === 0 && !VertexArrayObject1.isSupported(this.gl, {\n                    constantAttributeZero: true\n                });\n                if (!disablingAttributeZero) {\n                    location = Number(location);\n                    this.bind(function() {\n                        return _enable ? _this3.gl.enableVertexAttribArray(location) : _this3.gl.disableVertexAttribArray(location);\n                    });\n                }\n                return this;\n            }\n        },\n        {\n            key: \"getConstantBuffer\",\n            value: function getConstantBuffer(elementCount, value, accessor) {\n                var constantValue = this._normalizeConstantArrayValue(value, accessor);\n                var byteLength = constantValue.byteLength * elementCount;\n                var length = constantValue.length * elementCount;\n                var updateNeeded = !this.buffer;\n                this.buffer = this.buffer || new (0, _bufferDefault.default)(this.gl, byteLength);\n                updateNeeded = updateNeeded || this.buffer.reallocate(byteLength);\n                updateNeeded = updateNeeded || !this._compareConstantArrayValues(constantValue, this.bufferValue);\n                if (updateNeeded) {\n                    var typedArray = (0, _arrayUtilsFlat.getScratchArray)(value.constructor, length);\n                    (0, _arrayUtilsFlat.fillArray)({\n                        target: typedArray,\n                        source: constantValue,\n                        start: 0,\n                        count: length\n                    });\n                    this.buffer.subData(typedArray);\n                    this.bufferValue = value;\n                }\n                return this.buffer;\n            }\n        },\n        {\n            key: \"_normalizeConstantArrayValue\",\n            value: function _normalizeConstantArrayValue(arrayValue, accessor) {\n                if (Array.isArray(arrayValue)) return new Float32Array(arrayValue);\n                return arrayValue;\n            }\n        },\n        {\n            key: \"_compareConstantArrayValues\",\n            value: function _compareConstantArrayValues(v1, v2) {\n                if (!v1 || !v2 || v1.length !== v2.length || v1.constructor !== v2.constructor) return false;\n                for(var i = 0; i < v1.length; ++i){\n                    if (v1[i] !== v2[i]) return false;\n                }\n                return true;\n            }\n        },\n        {\n            key: \"_createHandle\",\n            value: function _createHandle() {\n                return this.gl.createVertexArray();\n            }\n        },\n        {\n            key: \"_deleteHandle\",\n            value: function _deleteHandle(handle) {\n                this.gl.deleteVertexArray(handle);\n                return [\n                    this.elements\n                ];\n            }\n        },\n        {\n            key: \"_bindHandle\",\n            value: function _bindHandle(handle) {\n                this.gl.bindVertexArray(handle);\n            }\n        },\n        {\n            key: \"_getParameter\",\n            value: function _getParameter(pname, _ref) {\n                var _this4 = this;\n                var location = _ref.location;\n                (0, _utils.assert)(Number.isFinite(location));\n                return this.bind(function() {\n                    switch(pname){\n                        case 34373:\n                            return _this4.gl.getVertexAttribOffset(location, pname);\n                        default:\n                            return _this4.gl.getVertexAttrib(location, pname);\n                    }\n                });\n            }\n        },\n        {\n            key: \"MAX_ATTRIBUTES\",\n            get: function get() {\n                return VertexArrayObject1.getMaxAttributes(this.gl);\n            }\n        }\n    ], [\n        {\n            key: \"_setConstantFloatArray\",\n            value: function _setConstantFloatArray(gl, location, array) {\n                switch(array.length){\n                    case 1:\n                        gl.vertexAttrib1fv(location, array);\n                        break;\n                    case 2:\n                        gl.vertexAttrib2fv(location, array);\n                        break;\n                    case 3:\n                        gl.vertexAttrib3fv(location, array);\n                        break;\n                    case 4:\n                        gl.vertexAttrib4fv(location, array);\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n            }\n        },\n        {\n            key: \"_setConstantIntArray\",\n            value: function _setConstantIntArray(gl, location, array) {\n                (0, _utils.assert)((0, _gltools.isWebGL2)(gl));\n                switch(array.length){\n                    case 1:\n                        gl.vertexAttribI1iv(location, array);\n                        break;\n                    case 2:\n                        gl.vertexAttribI2iv(location, array);\n                        break;\n                    case 3:\n                        gl.vertexAttribI3iv(location, array);\n                        break;\n                    case 4:\n                        gl.vertexAttribI4iv(location, array);\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n            }\n        },\n        {\n            key: \"_setConstantUintArray\",\n            value: function _setConstantUintArray(gl, location, array) {\n                (0, _utils.assert)((0, _gltools.isWebGL2)(gl));\n                switch(array.length){\n                    case 1:\n                        gl.vertexAttribI1uiv(location, array);\n                        break;\n                    case 2:\n                        gl.vertexAttribI2uiv(location, array);\n                        break;\n                    case 3:\n                        gl.vertexAttribI3uiv(location, array);\n                        break;\n                    case 4:\n                        gl.vertexAttribI4uiv(location, array);\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n            }\n        }\n    ]);\n    return VertexArrayObject1;\n}((0, _resourceDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./resource\":\"1yIzW\",\"./buffer\":\"98zcF\",\"@luma.gl/gltools\":\"grcb8\",\"../utils/array-utils-flat\":\"fotQF\",\"../utils\":\"dIy34\",\"probe.gl\":\"f91qf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fotQF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getScratchArrayBuffer\", ()=>getScratchArrayBuffer);\nparcelHelpers.export(exports, \"getScratchArray\", ()=>getScratchArray);\nparcelHelpers.export(exports, \"fillArray\", ()=>fillArray);\nvar arrayBuffer = null;\nfunction getScratchArrayBuffer(byteLength) {\n    if (!arrayBuffer || arrayBuffer.byteLength < byteLength) arrayBuffer = new ArrayBuffer(byteLength);\n    return arrayBuffer;\n}\nfunction getScratchArray(Type, length) {\n    var scratchArrayBuffer = getScratchArrayBuffer(Type.BYTES_PER_ELEMENT * length);\n    return new Type(scratchArrayBuffer, 0, length);\n}\nfunction fillArray(_ref) {\n    var target = _ref.target, source = _ref.source, _ref$start = _ref.start, start = _ref$start === void 0 ? 0 : _ref$start, _ref$count = _ref.count, count = _ref$count === void 0 ? 1 : _ref$count;\n    var length = source.length;\n    var total = count * length;\n    var copied = 0;\n    for(var i = start; copied < length; copied++)target[i++] = source[copied];\n    while(copied < total)if (copied < total - copied) {\n        target.copyWithin(start + copied, start, start + copied);\n        copied *= 2;\n    } else {\n        target.copyWithin(start + copied, start, start + total - copied);\n        copied = total;\n    }\n    return target;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jfSJa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>VertexArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _accessor = require(\"./accessor\");\nvar _accessorDefault = parcelHelpers.interopDefault(_accessor);\nvar _buffer = require(\"./buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _vertexArrayObject = require(\"./vertex-array-object\");\nvar _vertexArrayObjectDefault = parcelHelpers.interopDefault(_vertexArrayObject);\nvar _utils = require(\"../utils\");\nvar ERR_ATTRIBUTE_TYPE = \"VertexArray: attributes must be Buffers or constants (i.e. typed array)\";\nvar MULTI_LOCATION_ATTRIBUTE_REGEXP = /^(.+)__LOCATION_([0-9]+)$/;\nvar DEPRECATIONS_V6 = [\n    \"setBuffers\",\n    \"setGeneric\",\n    \"clearBindings\",\n    \"setLocations\",\n    \"setGenericValues\",\n    \"setDivisor\",\n    \"enable\",\n    \"disable\"\n];\nvar VertexArray = function() {\n    function VertexArray1(gl) {\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, VertexArray1);\n        var id = opts.id || opts.program && opts.program.id;\n        this.id = id;\n        this.gl = gl;\n        this.configuration = null;\n        this.elements = null;\n        this.elementsAccessor = null;\n        this.values = null;\n        this.accessors = null;\n        this.unused = null;\n        this.drawParams = null;\n        this.buffer = null;\n        this.attributes = {};\n        this.vertexArrayObject = new (0, _vertexArrayObjectDefault.default)(gl);\n        (0, _utils.stubRemovedMethods)(this, \"VertexArray\", \"v6.0\", DEPRECATIONS_V6);\n        this.initialize(opts);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(VertexArray1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                if (this.buffer) this.buffer[\"delete\"]();\n                this.vertexArrayObject[\"delete\"]();\n            }\n        },\n        {\n            key: \"initialize\",\n            value: function initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this.reset();\n                this.configuration = null;\n                this.bindOnUse = false;\n                return this.setProps(props);\n            }\n        },\n        {\n            key: \"reset\",\n            value: function reset() {\n                this.elements = null;\n                this.elementsAccessor = null;\n                var MAX_ATTRIBUTES = this.vertexArrayObject.MAX_ATTRIBUTES;\n                this.values = new Array(MAX_ATTRIBUTES).fill(null);\n                this.accessors = new Array(MAX_ATTRIBUTES).fill(null);\n                this.unused = {};\n                this.drawParams = null;\n                return this;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"program\" in props) this.configuration = props.program && props.program.configuration;\n                if (\"configuration\" in props) this.configuration = props.configuration;\n                if (\"attributes\" in props) this.setAttributes(props.attributes);\n                if (\"elements\" in props) this.setElementBuffer(props.elements);\n                if (\"bindOnUse\" in props) props = props.bindOnUse;\n                return this;\n            }\n        },\n        {\n            key: \"clearDrawParams\",\n            value: function clearDrawParams() {\n                this.drawParams = null;\n            }\n        },\n        {\n            key: \"getDrawParams\",\n            value: function getDrawParams() {\n                this.drawParams = this.drawParams || this._updateDrawParams();\n                return this.drawParams;\n            }\n        },\n        {\n            key: \"setAttributes\",\n            value: function setAttributes(attributes) {\n                var _this = this;\n                Object.assign(this.attributes, attributes);\n                this.vertexArrayObject.bind(function() {\n                    for(var locationOrName in attributes){\n                        var value = attributes[locationOrName];\n                        _this._setAttribute(locationOrName, value);\n                    }\n                    _this.gl.bindBuffer(34962, null);\n                });\n                return this;\n            }\n        },\n        {\n            key: \"setElementBuffer\",\n            value: function setElementBuffer() {\n                var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                var accessor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                this.elements = elementBuffer;\n                this.elementsAccessor = accessor;\n                this.clearDrawParams();\n                this.vertexArrayObject.setElementBuffer(elementBuffer, accessor);\n                return this;\n            }\n        },\n        {\n            key: \"setBuffer\",\n            value: function setBuffer(locationOrName, buffer) {\n                var appAccessor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n                if (buffer.target === 34963) return this.setElementBuffer(buffer, appAccessor);\n                var _this$_resolveLocatio = this._resolveLocationAndAccessor(locationOrName, buffer, buffer.accessor, appAccessor), location = _this$_resolveLocatio.location, accessor = _this$_resolveLocatio.accessor;\n                if (location >= 0) {\n                    this.values[location] = buffer;\n                    this.accessors[location] = accessor;\n                    this.clearDrawParams();\n                    this.vertexArrayObject.setBuffer(location, buffer, accessor);\n                }\n                return this;\n            }\n        },\n        {\n            key: \"setConstant\",\n            value: function setConstant(locationOrName, arrayValue) {\n                var appAccessor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n                var _this$_resolveLocatio2 = this._resolveLocationAndAccessor(locationOrName, arrayValue, Object.assign({\n                    size: arrayValue.length\n                }, appAccessor)), location = _this$_resolveLocatio2.location, accessor = _this$_resolveLocatio2.accessor;\n                if (location >= 0) {\n                    arrayValue = this.vertexArrayObject._normalizeConstantArrayValue(arrayValue, accessor);\n                    this.values[location] = arrayValue;\n                    this.accessors[location] = accessor;\n                    this.clearDrawParams();\n                    this.vertexArrayObject.enable(location, false);\n                }\n                return this;\n            }\n        },\n        {\n            key: \"unbindBuffers\",\n            value: function unbindBuffers() {\n                var _this2 = this;\n                this.vertexArrayObject.bind(function() {\n                    if (_this2.elements) _this2.vertexArrayObject.setElementBuffer(null);\n                    _this2.buffer = _this2.buffer || new (0, _bufferDefault.default)(_this2.gl, {\n                        accessor: {\n                            size: 4\n                        }\n                    });\n                    for(var location = 0; location < _this2.vertexArrayObject.MAX_ATTRIBUTES; location++)if (_this2.values[location] instanceof (0, _bufferDefault.default)) {\n                        _this2.gl.disableVertexAttribArray(location);\n                        _this2.gl.bindBuffer(34962, _this2.buffer.handle);\n                        _this2.gl.vertexAttribPointer(location, 1, 5126, false, 0, 0);\n                    }\n                });\n                return this;\n            }\n        },\n        {\n            key: \"bindBuffers\",\n            value: function bindBuffers() {\n                var _this3 = this;\n                this.vertexArrayObject.bind(function() {\n                    if (_this3.elements) _this3.setElementBuffer(_this3.elements);\n                    for(var location = 0; location < _this3.vertexArrayObject.MAX_ATTRIBUTES; location++){\n                        var buffer = _this3.values[location];\n                        if (buffer instanceof (0, _bufferDefault.default)) _this3.setBuffer(location, buffer);\n                    }\n                });\n                return this;\n            }\n        },\n        {\n            key: \"bindForDraw\",\n            value: function bindForDraw(vertexCount, instanceCount, func) {\n                var _this4 = this;\n                var value;\n                this.vertexArrayObject.bind(function() {\n                    _this4._setConstantAttributes(vertexCount, instanceCount);\n                    value = func();\n                });\n                return value;\n            }\n        },\n        {\n            key: \"_resolveLocationAndAccessor\",\n            value: function _resolveLocationAndAccessor(locationOrName, value, valueAccessor, appAccessor) {\n                var _this5 = this;\n                var _this$_getAttributeIn = this._getAttributeIndex(locationOrName), location = _this$_getAttributeIn.location, name = _this$_getAttributeIn.name;\n                if (!Number.isFinite(location) || location < 0) {\n                    this.unused[locationOrName] = value;\n                    (0, _gltools.log).once(3, function() {\n                        return \"unused value \".concat(locationOrName, \" in \").concat(_this5.id);\n                    })();\n                    return this;\n                }\n                var accessInfo = this._getAttributeInfo(name || location);\n                if (!accessInfo) return {\n                    location: -1,\n                    accessor: null\n                };\n                var currentAccessor = this.accessors[location] || {};\n                var accessor = (0, _accessorDefault.default).resolve(accessInfo.accessor, currentAccessor, valueAccessor, appAccessor);\n                var size = accessor.size, type = accessor.type;\n                (0, _utils.assert)(Number.isFinite(size) && Number.isFinite(type));\n                return {\n                    location: location,\n                    accessor: accessor\n                };\n            }\n        },\n        {\n            key: \"_getAttributeInfo\",\n            value: function _getAttributeInfo(attributeName) {\n                return this.configuration && this.configuration.getAttributeInfo(attributeName);\n            }\n        },\n        {\n            key: \"_getAttributeIndex\",\n            value: function _getAttributeIndex(locationOrName) {\n                var location = Number(locationOrName);\n                if (Number.isFinite(location)) return {\n                    location: location\n                };\n                var multiLocation = MULTI_LOCATION_ATTRIBUTE_REGEXP.exec(locationOrName);\n                var name = multiLocation ? multiLocation[1] : locationOrName;\n                var locationOffset = multiLocation ? Number(multiLocation[2]) : 0;\n                if (this.configuration) return {\n                    location: this.configuration.getAttributeLocation(name) + locationOffset,\n                    name: name\n                };\n                return {\n                    location: -1\n                };\n            }\n        },\n        {\n            key: \"_setAttribute\",\n            value: function _setAttribute(locationOrName, value) {\n                if (value instanceof (0, _bufferDefault.default)) this.setBuffer(locationOrName, value);\n                else if (Array.isArray(value) && value.length && value[0] instanceof (0, _bufferDefault.default)) {\n                    var buffer = value[0];\n                    var accessor = value[1];\n                    this.setBuffer(locationOrName, buffer, accessor);\n                } else if (ArrayBuffer.isView(value) || Array.isArray(value)) {\n                    var constant = value;\n                    this.setConstant(locationOrName, constant);\n                } else if (value.buffer instanceof (0, _bufferDefault.default)) {\n                    var _accessor1 = value;\n                    this.setBuffer(locationOrName, _accessor1.buffer, _accessor1);\n                } else throw new Error(ERR_ATTRIBUTE_TYPE);\n            }\n        },\n        {\n            key: \"_setConstantAttributes\",\n            value: function _setConstantAttributes(vertexCount, instanceCount) {\n                var elementCount = Math.max(vertexCount | 0, instanceCount | 0);\n                var constant = this.values[0];\n                if (ArrayBuffer.isView(constant)) this._setConstantAttributeZero(constant, elementCount);\n                for(var location = 1; location < this.vertexArrayObject.MAX_ATTRIBUTES; location++){\n                    constant = this.values[location];\n                    if (ArrayBuffer.isView(constant)) this._setConstantAttribute(location, constant);\n                }\n            }\n        },\n        {\n            key: \"_setConstantAttributeZero\",\n            value: function _setConstantAttributeZero(constant, elementCount) {\n                if ((0, _vertexArrayObjectDefault.default).isSupported(this.gl, {\n                    constantAttributeZero: true\n                })) {\n                    this._setConstantAttribute(0, constant);\n                    return;\n                }\n                var buffer = this.vertexArrayObject.getConstantBuffer(elementCount, constant);\n                this.vertexArrayObject.setBuffer(0, buffer, this.accessors[0]);\n            }\n        },\n        {\n            key: \"_setConstantAttribute\",\n            value: function _setConstantAttribute(location, constant) {\n                (0, _vertexArrayObjectDefault.default).setConstant(this.gl, location, constant);\n            }\n        },\n        {\n            key: \"_updateDrawParams\",\n            value: function _updateDrawParams() {\n                var drawParams = {\n                    isIndexed: false,\n                    isInstanced: false,\n                    indexCount: Infinity,\n                    vertexCount: Infinity,\n                    instanceCount: Infinity\n                };\n                for(var location = 0; location < this.vertexArrayObject.MAX_ATTRIBUTES; location++)this._updateDrawParamsForLocation(drawParams, location);\n                if (this.elements) {\n                    drawParams.elementCount = this.elements.getElementCount(this.elements.accessor);\n                    drawParams.isIndexed = true;\n                    drawParams.indexType = this.elementsAccessor.type || this.elements.accessor.type;\n                    drawParams.indexOffset = this.elementsAccessor.offset || 0;\n                }\n                if (drawParams.indexCount === Infinity) drawParams.indexCount = 0;\n                if (drawParams.vertexCount === Infinity) drawParams.vertexCount = 0;\n                if (drawParams.instanceCount === Infinity) drawParams.instanceCount = 0;\n                return drawParams;\n            }\n        },\n        {\n            key: \"_updateDrawParamsForLocation\",\n            value: function _updateDrawParamsForLocation(drawParams, location) {\n                var value = this.values[location];\n                var accessor = this.accessors[location];\n                if (!value) return;\n                var divisor = accessor.divisor;\n                var isInstanced = divisor > 0;\n                drawParams.isInstanced = drawParams.isInstanced || isInstanced;\n                if (value instanceof (0, _bufferDefault.default)) {\n                    var buffer = value;\n                    if (isInstanced) {\n                        var instanceCount = buffer.getVertexCount(accessor);\n                        drawParams.instanceCount = Math.min(drawParams.instanceCount, instanceCount);\n                    } else {\n                        var vertexCount = buffer.getVertexCount(accessor);\n                        drawParams.vertexCount = Math.min(drawParams.vertexCount, vertexCount);\n                    }\n                }\n            }\n        },\n        {\n            key: \"setElements\",\n            value: function setElements() {\n                var elementBuffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                var accessor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                (0, _gltools.log).deprecated(\"setElements\", \"setElementBuffer\")();\n                return this.setElementBuffer(elementBuffer, accessor);\n            }\n        }\n    ]);\n    return VertexArray1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/gltools\":\"grcb8\",\"./accessor\":\"dlKlM\",\"./buffer\":\"98zcF\",\"./vertex-array-object\":\"eAFK7\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j7rOp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getDebugTableForUniforms\", ()=>getDebugTableForUniforms);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _utils = require(\"../utils\");\nfunction getDebugTableForUniforms() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$header = _ref.header, header = _ref$header === void 0 ? \"Uniforms\" : _ref$header, program = _ref.program, uniforms = _ref.uniforms, _ref$undefinedOnly = _ref.undefinedOnly, undefinedOnly = _ref$undefinedOnly === void 0 ? false : _ref$undefinedOnly;\n    (0, _utils.assert)(program);\n    var SHADER_MODULE_UNIFORM_REGEXP = \".*_.*\";\n    var PROJECT_MODULE_UNIFORM_REGEXP = \".*Matrix\";\n    var uniformLocations = program._uniformSetters;\n    var table = {};\n    var uniformNames = Object.keys(uniformLocations).sort();\n    var count = 0;\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = uniformNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var _uniformName = _step.value;\n            if (!_uniformName.match(SHADER_MODULE_UNIFORM_REGEXP) && !_uniformName.match(PROJECT_MODULE_UNIFORM_REGEXP)) {\n                if (addUniformToTable({\n                    table: table,\n                    header: header,\n                    uniforms: uniforms,\n                    uniformName: _uniformName,\n                    undefinedOnly: undefinedOnly\n                })) count++;\n            }\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n    try {\n        for(var _iterator2 = uniformNames[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n            var _uniformName2 = _step2.value;\n            if (_uniformName2.match(PROJECT_MODULE_UNIFORM_REGEXP)) {\n                if (addUniformToTable({\n                    table: table,\n                    header: header,\n                    uniforms: uniforms,\n                    uniformName: _uniformName2,\n                    undefinedOnly: undefinedOnly\n                })) count++;\n            }\n        }\n    } catch (err1) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err1;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n        } finally{\n            if (_didIteratorError2) throw _iteratorError2;\n        }\n    }\n    var _iteratorNormalCompletion3 = true;\n    var _didIteratorError3 = false;\n    var _iteratorError3 = undefined;\n    try {\n        for(var _iterator3 = uniformNames[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){\n            var _uniformName3 = _step3.value;\n            if (!table[_uniformName3]) {\n                if (addUniformToTable({\n                    table: table,\n                    header: header,\n                    uniforms: uniforms,\n                    uniformName: _uniformName3,\n                    undefinedOnly: undefinedOnly\n                })) count++;\n            }\n        }\n    } catch (err2) {\n        _didIteratorError3 = true;\n        _iteratorError3 = err2;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) _iterator3[\"return\"]();\n        } finally{\n            if (_didIteratorError3) throw _iteratorError3;\n        }\n    }\n    var unusedCount = 0;\n    var unusedTable = {};\n    if (!undefinedOnly) for(var uniformName in uniforms){\n        var uniform = uniforms[uniformName];\n        if (!table[uniformName]) {\n            unusedCount++;\n            unusedTable[uniformName] = (0, _definePropertyDefault.default)({\n                Type: \"NOT USED: \".concat(uniform)\n            }, header, (0, _utils.formatValue)(uniform));\n        }\n    }\n    return {\n        table: table,\n        count: count,\n        unusedTable: unusedTable,\n        unusedCount: unusedCount\n    };\n}\nfunction addUniformToTable(_ref2) {\n    var table = _ref2.table, header = _ref2.header, uniforms = _ref2.uniforms, uniformName = _ref2.uniformName, undefinedOnly = _ref2.undefinedOnly;\n    var value = uniforms[uniformName];\n    var isDefined = isUniformDefined(value);\n    if (!undefinedOnly || !isDefined) {\n        var _table$uniformName;\n        table[uniformName] = (_table$uniformName = {}, (0, _definePropertyDefault.default)(_table$uniformName, header, isDefined ? (0, _utils.formatValue)(value) : \"N/A\"), (0, _definePropertyDefault.default)(_table$uniformName, \"Uniform Type\", isDefined ? value : \"NOT PROVIDED\"), _table$uniformName);\n        return true;\n    }\n    return false;\n}\nfunction isUniformDefined(value) {\n    return value !== undefined && value !== null;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dQgkU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getDebugTableForVertexArray\", ()=>getDebugTableForVertexArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _buffer = require(\"../classes/buffer\");\nvar _bufferDefault = parcelHelpers.interopDefault(_buffer);\nvar _webglUtils = require(\"../webgl-utils\");\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\nvar _utils = require(\"../utils\");\nfunction getDebugTableForVertexArray() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, vertexArray = _ref.vertexArray, _ref$header = _ref.header, header = _ref$header === void 0 ? \"Attributes\" : _ref$header;\n    if (!vertexArray.configuration) return {};\n    var table = {};\n    if (vertexArray.elements) table.ELEMENT_ARRAY_BUFFER = getDebugTableRow(vertexArray, vertexArray.elements, null, header);\n    var attributes = vertexArray.values;\n    for(var attributeLocation in attributes){\n        var info = vertexArray._getAttributeInfo(attributeLocation);\n        if (info) {\n            var rowHeader = \"\".concat(attributeLocation, \": \").concat(info.name);\n            var accessor = vertexArray.accessors[info.location];\n            if (accessor) rowHeader = \"\".concat(attributeLocation, \": \").concat(getGLSLDeclaration(info.name, accessor));\n            table[rowHeader] = getDebugTableRow(vertexArray, attributes[attributeLocation], accessor, header);\n        }\n    }\n    return table;\n}\nfunction getDebugTableRow(vertexArray, attribute, accessor, header) {\n    var _ref4;\n    var gl = vertexArray.gl;\n    if (!attribute) {\n        var _ref2;\n        return _ref2 = {}, (0, _definePropertyDefault.default)(_ref2, header, \"null\"), (0, _definePropertyDefault.default)(_ref2, \"Format \", \"N/A\"), _ref2;\n    }\n    var type = \"NOT PROVIDED\";\n    var size = \"N/A\";\n    var verts = \"N/A\";\n    var bytes = \"N/A\";\n    var isInteger;\n    var marker;\n    var value;\n    if (accessor) {\n        type = accessor.type;\n        size = accessor.size;\n        type = String(type).replace(\"Array\", \"\");\n        isInteger = type.indexOf(\"nt\") !== -1;\n    }\n    if (attribute instanceof (0, _bufferDefault.default)) {\n        var _ref3;\n        var buffer = attribute;\n        var _buffer$getDebugData = buffer.getDebugData(), data = _buffer$getDebugData.data, modified = _buffer$getDebugData.modified;\n        marker = modified ? \"*\" : \"\";\n        value = data;\n        bytes = buffer.byteLength;\n        verts = bytes / data.BYTES_PER_ELEMENT / size;\n        var format;\n        if (accessor) {\n            var instanced = accessor.divisor > 0;\n            format = \"\".concat(instanced ? \"I \" : \"P \", \" \").concat(verts, \" (x\").concat(size, \"=\").concat(bytes, \" bytes \").concat((0, _webglUtils.getKey)(gl, type), \")\");\n        } else {\n            isInteger = true;\n            format = \"\".concat(bytes, \" bytes\");\n        }\n        return _ref3 = {}, (0, _definePropertyDefault.default)(_ref3, header, \"\".concat(marker).concat((0, _utils.formatValue)(value, {\n            size: size,\n            isInteger: isInteger\n        }))), (0, _definePropertyDefault.default)(_ref3, \"Format \", format), _ref3;\n    }\n    value = attribute;\n    size = attribute.length;\n    type = String(attribute.constructor.name).replace(\"Array\", \"\");\n    isInteger = type.indexOf(\"nt\") !== -1;\n    return _ref4 = {}, (0, _definePropertyDefault.default)(_ref4, header, \"\".concat((0, _utils.formatValue)(value, {\n        size: size,\n        isInteger: isInteger\n    }), \" (constant)\")), (0, _definePropertyDefault.default)(_ref4, \"Format \", \"\".concat(size, \"x\").concat(type, \" (constant)\")), _ref4;\n}\nfunction getGLSLDeclaration(name, accessor) {\n    var type = accessor.type, size = accessor.size;\n    var typeAndName = (0, _attributeUtils.getCompositeGLType)(type, size);\n    return typeAndName ? \"\".concat(name, \" (\").concat(typeAndName.name, \")\") : name;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../classes/buffer\":\"98zcF\",\"../webgl-utils\":\"c96L8\",\"../webgl-utils/attribute-utils\":\"fneLx\",\"../utils\":\"dIy34\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2FA46\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getDebugTableForProgramConfiguration\", ()=>getDebugTableForProgramConfiguration);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _attributeUtils = require(\"../webgl-utils/attribute-utils\");\nfunction getDebugTableForProgramConfiguration(config) {\n    var table = {};\n    var header = \"Accessors for \".concat(config.id);\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = config.attributeInfos[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var attributeInfo = _step.value;\n            if (attributeInfo) {\n                var glslDeclaration = getGLSLDeclaration(attributeInfo);\n                table[\"in \".concat(glslDeclaration)] = (0, _definePropertyDefault.default)({}, header, JSON.stringify(attributeInfo.accessor));\n            }\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n    try {\n        for(var _iterator2 = config.varyingInfos[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n            var varyingInfo = _step2.value;\n            if (varyingInfo) {\n                var _glslDeclaration = getGLSLDeclaration(varyingInfo);\n                table[\"out \".concat(_glslDeclaration)] = (0, _definePropertyDefault.default)({}, header, JSON.stringify(varyingInfo.accessor));\n            }\n        }\n    } catch (err1) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err1;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n        } finally{\n            if (_didIteratorError2) throw _iteratorError2;\n        }\n    }\n    return table;\n}\nfunction getGLSLDeclaration(attributeInfo) {\n    var _attributeInfo$access = attributeInfo.accessor, type = _attributeInfo$access.type, size = _attributeInfo$access.size;\n    var typeAndName = (0, _attributeUtils.getCompositeGLType)(type, size);\n    if (typeAndName) return \"\".concat(typeAndName.name, \" \").concat(attributeInfo.name);\n    return attributeInfo.name;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../webgl-utils/attribute-utils\":\"fneLx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bhQM0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AnimationLoop\", ()=>(0, _animationLoopDefault.default));\nparcelHelpers.export(exports, \"Model\", ()=>(0, _modelDefault.default));\nparcelHelpers.export(exports, \"ProgramManager\", ()=>(0, _programManagerDefault.default));\nparcelHelpers.export(exports, \"Transform\", ()=>(0, _transformDefault.default));\nparcelHelpers.export(exports, \"Geometry\", ()=>(0, _geometryDefault.default));\nparcelHelpers.export(exports, \"ConeGeometry\", ()=>(0, _coneGeometryDefault.default));\nparcelHelpers.export(exports, \"CubeGeometry\", ()=>(0, _cubeGeometryDefault.default));\nparcelHelpers.export(exports, \"CylinderGeometry\", ()=>(0, _cylinderGeometryDefault.default));\nparcelHelpers.export(exports, \"IcoSphereGeometry\", ()=>(0, _icoSphereGeometryDefault.default));\nparcelHelpers.export(exports, \"PlaneGeometry\", ()=>(0, _planeGeometryDefault.default));\nparcelHelpers.export(exports, \"SphereGeometry\", ()=>(0, _sphereGeometryDefault.default));\nparcelHelpers.export(exports, \"TruncatedConeGeometry\", ()=>(0, _truncatedConeGeometryDefault.default));\nparcelHelpers.export(exports, \"Timeline\", ()=>(0, _timeline.Timeline));\nparcelHelpers.export(exports, \"KeyFrames\", ()=>(0, _keyFrames.KeyFrames));\nparcelHelpers.export(exports, \"ClipSpace\", ()=>(0, _clipSpaceDefault.default));\nvar _animationLoop = require(\"./lib/animation-loop\");\nvar _animationLoopDefault = parcelHelpers.interopDefault(_animationLoop);\nvar _model = require(\"./lib/model\");\nvar _modelDefault = parcelHelpers.interopDefault(_model);\nvar _programManager = require(\"./lib/program-manager\");\nvar _programManagerDefault = parcelHelpers.interopDefault(_programManager);\nvar _transform = require(\"./transform/transform\");\nvar _transformDefault = parcelHelpers.interopDefault(_transform);\nvar _geometry = require(\"./geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _coneGeometry = require(\"./geometries/cone-geometry\");\nvar _coneGeometryDefault = parcelHelpers.interopDefault(_coneGeometry);\nvar _cubeGeometry = require(\"./geometries/cube-geometry\");\nvar _cubeGeometryDefault = parcelHelpers.interopDefault(_cubeGeometry);\nvar _cylinderGeometry = require(\"./geometries/cylinder-geometry\");\nvar _cylinderGeometryDefault = parcelHelpers.interopDefault(_cylinderGeometry);\nvar _icoSphereGeometry = require(\"./geometries/ico-sphere-geometry\");\nvar _icoSphereGeometryDefault = parcelHelpers.interopDefault(_icoSphereGeometry);\nvar _planeGeometry = require(\"./geometries/plane-geometry\");\nvar _planeGeometryDefault = parcelHelpers.interopDefault(_planeGeometry);\nvar _sphereGeometry = require(\"./geometries/sphere-geometry\");\nvar _sphereGeometryDefault = parcelHelpers.interopDefault(_sphereGeometry);\nvar _truncatedConeGeometry = require(\"./geometries/truncated-cone-geometry\");\nvar _truncatedConeGeometryDefault = parcelHelpers.interopDefault(_truncatedConeGeometry);\nvar _timeline = require(\"./animation/timeline\");\nvar _keyFrames = require(\"./animation/key-frames\");\nvar _clipSpace = require(\"./utils/clip-space\");\nvar _clipSpaceDefault = parcelHelpers.interopDefault(_clipSpace);\n\n},{\"./lib/animation-loop\":\"gzj5O\",\"./lib/model\":\"6H3H1\",\"./lib/program-manager\":\"aXWW9\",\"./transform/transform\":\"i1pdx\",\"./geometry/geometry\":\"3diJw\",\"./geometries/cone-geometry\":\"7nCdk\",\"./geometries/cube-geometry\":\"flTH5\",\"./geometries/cylinder-geometry\":\"k0ODM\",\"./geometries/ico-sphere-geometry\":\"5Nbgi\",\"./geometries/plane-geometry\":\"avrih\",\"./geometries/sphere-geometry\":\"3j0XY\",\"./geometries/truncated-cone-geometry\":\"bJXwV\",\"./animation/timeline\":\"ebmMe\",\"./animation/key-frames\":false,\"./utils/clip-space\":\"bCM9J\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gzj5O\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>AnimationLoop);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _env = require(\"probe.gl/env\");\nvar isPage = (0, _env.isBrowser)() && typeof document !== \"undefined\";\nvar statIdCounter = 0;\nvar AnimationLoop = function() {\n    function AnimationLoop1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, AnimationLoop1);\n        var _props$onCreateContex = props.onCreateContext, onCreateContext = _props$onCreateContex === void 0 ? function(opts) {\n            return (0, _gltools.createGLContext)(opts);\n        } : _props$onCreateContex, _props$onAddHTML = props.onAddHTML, onAddHTML = _props$onAddHTML === void 0 ? null : _props$onAddHTML, _props$onInitialize = props.onInitialize, onInitialize = _props$onInitialize === void 0 ? function() {} : _props$onInitialize, _props$onRender = props.onRender, onRender = _props$onRender === void 0 ? function() {} : _props$onRender, _props$onFinalize = props.onFinalize, onFinalize = _props$onFinalize === void 0 ? function() {} : _props$onFinalize, onError = props.onError, _props$gl = props.gl, gl = _props$gl === void 0 ? null : _props$gl, _props$glOptions = props.glOptions, glOptions = _props$glOptions === void 0 ? {} : _props$glOptions, _props$debug = props.debug, debug = _props$debug === void 0 ? false : _props$debug, _props$createFramebuf = props.createFramebuffer, createFramebuffer = _props$createFramebuf === void 0 ? false : _props$createFramebuf, _props$autoResizeView = props.autoResizeViewport, autoResizeViewport = _props$autoResizeView === void 0 ? true : _props$autoResizeView, _props$autoResizeDraw = props.autoResizeDrawingBuffer, autoResizeDrawingBuffer = _props$autoResizeDraw === void 0 ? true : _props$autoResizeDraw, _props$stats = props.stats, stats = _props$stats === void 0 ? (0, _webgl.lumaStats).get(\"animation-loop-\".concat(statIdCounter++)) : _props$stats;\n        var _props$useDevicePixel = props.useDevicePixels, useDevicePixels = _props$useDevicePixel === void 0 ? true : _props$useDevicePixel;\n        if (\"useDevicePixelRatio\" in props) {\n            (0, _webgl.log).deprecated(\"useDevicePixelRatio\", \"useDevicePixels\")();\n            useDevicePixels = props.useDevicePixelRatio;\n        }\n        this.props = {\n            onCreateContext: onCreateContext,\n            onAddHTML: onAddHTML,\n            onInitialize: onInitialize,\n            onRender: onRender,\n            onFinalize: onFinalize,\n            onError: onError,\n            gl: gl,\n            glOptions: glOptions,\n            debug: debug,\n            createFramebuffer: createFramebuffer\n        };\n        this.gl = gl;\n        this.needsRedraw = null;\n        this.timeline = null;\n        this.stats = stats;\n        this.cpuTime = this.stats.get(\"CPU Time\");\n        this.gpuTime = this.stats.get(\"GPU Time\");\n        this.frameRate = this.stats.get(\"Frame Rate\");\n        this._initialized = false;\n        this._running = false;\n        this._animationFrameId = null;\n        this._nextFramePromise = null;\n        this._resolveNextFrame = null;\n        this._cpuStartTime = 0;\n        this.setProps({\n            autoResizeViewport: autoResizeViewport,\n            autoResizeDrawingBuffer: autoResizeDrawingBuffer,\n            useDevicePixels: useDevicePixels\n        });\n        this.start = this.start.bind(this);\n        this.stop = this.stop.bind(this);\n        this._pageLoadPromise = null;\n        this._onMousemove = this._onMousemove.bind(this);\n        this._onMouseleave = this._onMouseleave.bind(this);\n    }\n    (0, _createClassDefault.default)(AnimationLoop1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                this.stop();\n                this._setDisplay(null);\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw(reason) {\n                (0, _webgl.assert)(typeof reason === \"string\");\n                this.needsRedraw = this.needsRedraw || reason;\n                return this;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"autoResizeViewport\" in props) this.autoResizeViewport = props.autoResizeViewport;\n                if (\"autoResizeDrawingBuffer\" in props) this.autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;\n                if (\"useDevicePixels\" in props) this.useDevicePixels = props.useDevicePixels;\n                return this;\n            }\n        },\n        {\n            key: \"start\",\n            value: function start() {\n                var _this = this;\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (this._running) return this;\n                this._running = true;\n                var startPromise = this._getPageLoadPromise().then(function() {\n                    if (!_this._running || _this._initialized) return null;\n                    _this._createWebGLContext(opts);\n                    _this._createFramebuffer();\n                    _this._startEventHandling();\n                    _this._initializeCallbackData();\n                    _this._updateCallbackData();\n                    _this._resizeCanvasDrawingBuffer();\n                    _this._resizeViewport();\n                    _this._gpuTimeQuery = (0, _webgl.Query).isSupported(_this.gl, [\n                        \"timers\"\n                    ]) ? new (0, _webgl.Query)(_this.gl) : null;\n                    _this._initialized = true;\n                    return _this.onInitialize(_this.animationProps);\n                }).then(function(appContext) {\n                    if (_this._running) {\n                        _this._addCallbackData(appContext || {});\n                        if (appContext !== false) _this._startLoop();\n                    }\n                });\n                if (this.props.onError) startPromise[\"catch\"](this.props.onError);\n                return this;\n            }\n        },\n        {\n            key: \"redraw\",\n            value: function redraw() {\n                this._beginTimers();\n                this._setupFrame();\n                this._updateCallbackData();\n                this._renderFrame(this.animationProps);\n                this._clearNeedsRedraw();\n                if (this.offScreen && this.gl.commit) this.gl.commit();\n                if (this._resolveNextFrame) {\n                    this._resolveNextFrame(this);\n                    this._nextFramePromise = null;\n                    this._resolveNextFrame = null;\n                }\n                this._endTimers();\n                return this;\n            }\n        },\n        {\n            key: \"stop\",\n            value: function stop() {\n                if (this._running) {\n                    this._finalizeCallbackData();\n                    (0, _webgl.cancelAnimationFrame)(this._animationFrameId);\n                    this._nextFramePromise = null;\n                    this._resolveNextFrame = null;\n                    this._animationFrameId = null;\n                    this._running = false;\n                }\n                return this;\n            }\n        },\n        {\n            key: \"attachTimeline\",\n            value: function attachTimeline(timeline) {\n                this.timeline = timeline;\n                return this.timeline;\n            }\n        },\n        {\n            key: \"detachTimeline\",\n            value: function detachTimeline() {\n                this.timeline = null;\n            }\n        },\n        {\n            key: \"waitForRender\",\n            value: function waitForRender() {\n                var _this2 = this;\n                this.setNeedsRedraw(\"waitForRender\");\n                if (!this._nextFramePromise) this._nextFramePromise = new Promise(function(resolve) {\n                    _this2._resolveNextFrame = resolve;\n                });\n                return this._nextFramePromise;\n            }\n        },\n        {\n            key: \"toDataURL\",\n            value: function() {\n                var _toDataURL = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee() {\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                this.setNeedsRedraw(\"toDataURL\");\n                                _context.next = 3;\n                                return this.waitForRender();\n                            case 3:\n                                return _context.abrupt(\"return\", this.gl.canvas.toDataURL());\n                            case 4:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this);\n                }));\n                function toDataURL() {\n                    return _toDataURL.apply(this, arguments);\n                }\n                return toDataURL;\n            }()\n        },\n        {\n            key: \"onCreateContext\",\n            value: function onCreateContext() {\n                var _this$props;\n                return (_this$props = this.props).onCreateContext.apply(_this$props, arguments);\n            }\n        },\n        {\n            key: \"onInitialize\",\n            value: function onInitialize() {\n                var _this$props2;\n                return (_this$props2 = this.props).onInitialize.apply(_this$props2, arguments);\n            }\n        },\n        {\n            key: \"onRender\",\n            value: function onRender() {\n                var _this$props3;\n                return (_this$props3 = this.props).onRender.apply(_this$props3, arguments);\n            }\n        },\n        {\n            key: \"onFinalize\",\n            value: function onFinalize() {\n                var _this$props4;\n                return (_this$props4 = this.props).onFinalize.apply(_this$props4, arguments);\n            }\n        },\n        {\n            key: \"getHTMLControlValue\",\n            value: function getHTMLControlValue(id) {\n                var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n                var element = document.getElementById(id);\n                return element ? Number(element.value) : defaultValue;\n            }\n        },\n        {\n            key: \"setViewParameters\",\n            value: function setViewParameters() {\n                (0, _webgl.log).removed(\"AnimationLoop.setViewParameters\", \"AnimationLoop.setProps\")();\n                return this;\n            }\n        },\n        {\n            key: \"_startLoop\",\n            value: function _startLoop() {\n                var _this3 = this;\n                var renderFrame1 = function renderFrame() {\n                    if (!_this3._running) return;\n                    _this3.redraw();\n                    _this3._animationFrameId = _this3._requestAnimationFrame(renderFrame);\n                };\n                (0, _webgl.cancelAnimationFrame)(this._animationFrameId);\n                this._animationFrameId = this._requestAnimationFrame(renderFrame1);\n            }\n        },\n        {\n            key: \"_getPageLoadPromise\",\n            value: function _getPageLoadPromise() {\n                if (!this._pageLoadPromise) this._pageLoadPromise = isPage ? new Promise(function(resolve, reject) {\n                    if (isPage && document.readyState === \"complete\") {\n                        resolve(document);\n                        return;\n                    }\n                    window.addEventListener(\"load\", function() {\n                        resolve(document);\n                    });\n                }) : Promise.resolve({});\n                return this._pageLoadPromise;\n            }\n        },\n        {\n            key: \"_setDisplay\",\n            value: function _setDisplay(display) {\n                if (this.display) {\n                    this.display[\"delete\"]();\n                    this.display.animationLoop = null;\n                }\n                if (display) display.animationLoop = this;\n                this.display = display;\n            }\n        },\n        {\n            key: \"_requestAnimationFrame\",\n            value: function _requestAnimationFrame(renderFrameCallback) {\n                if (this.display && this.display.requestAnimationFrame(renderFrameCallback)) return;\n                (0, _webgl.requestAnimationFrame)(renderFrameCallback);\n            }\n        },\n        {\n            key: \"_renderFrame\",\n            value: function _renderFrame() {\n                if (this.display) {\n                    var _this$display;\n                    (_this$display = this.display)._renderFrame.apply(_this$display, arguments);\n                    return;\n                }\n                this.onRender.apply(this, arguments);\n            }\n        },\n        {\n            key: \"_clearNeedsRedraw\",\n            value: function _clearNeedsRedraw() {\n                this.needsRedraw = null;\n            }\n        },\n        {\n            key: \"_setupFrame\",\n            value: function _setupFrame() {\n                if (this._onSetupFrame) this._onSetupFrame(this.animationProps);\n                else {\n                    this._resizeCanvasDrawingBuffer();\n                    this._resizeViewport();\n                    this._resizeFramebuffer();\n                }\n            }\n        },\n        {\n            key: \"_initializeCallbackData\",\n            value: function _initializeCallbackData() {\n                this.animationProps = {\n                    gl: this.gl,\n                    stop: this.stop,\n                    canvas: this.gl.canvas,\n                    framebuffer: this.framebuffer,\n                    useDevicePixels: this.useDevicePixels,\n                    needsRedraw: null,\n                    startTime: Date.now(),\n                    engineTime: 0,\n                    tick: 0,\n                    tock: 0,\n                    time: 0,\n                    _timeline: this.timeline,\n                    _loop: this,\n                    _animationLoop: this,\n                    _mousePosition: null\n                };\n            }\n        },\n        {\n            key: \"_updateCallbackData\",\n            value: function _updateCallbackData() {\n                var _this$_getSizeAndAspe = this._getSizeAndAspect(), width = _this$_getSizeAndAspe.width, height = _this$_getSizeAndAspe.height, aspect = _this$_getSizeAndAspe.aspect;\n                if (width !== this.animationProps.width || height !== this.animationProps.height) this.setNeedsRedraw(\"drawing buffer resized\");\n                if (aspect !== this.animationProps.aspect) this.setNeedsRedraw(\"drawing buffer aspect changed\");\n                this.animationProps.width = width;\n                this.animationProps.height = height;\n                this.animationProps.aspect = aspect;\n                this.animationProps.needsRedraw = this.needsRedraw;\n                this.animationProps.engineTime = Date.now() - this.animationProps.startTime;\n                if (this.timeline) this.timeline.update(this.animationProps.engineTime);\n                this.animationProps.tick = Math.floor(this.animationProps.time / 1000 * 60);\n                this.animationProps.tock++;\n                this.animationProps.time = this.timeline ? this.timeline.getTime() : this.animationProps.engineTime;\n                this.animationProps._offScreen = this.offScreen;\n            }\n        },\n        {\n            key: \"_finalizeCallbackData\",\n            value: function _finalizeCallbackData() {\n                this.onFinalize(this.animationProps);\n            }\n        },\n        {\n            key: \"_addCallbackData\",\n            value: function _addCallbackData(appContext) {\n                if ((0, _typeofDefault.default)(appContext) === \"object\" && appContext !== null) this.animationProps = Object.assign({}, this.animationProps, appContext);\n            }\n        },\n        {\n            key: \"_createWebGLContext\",\n            value: function _createWebGLContext(opts) {\n                this.offScreen = opts.canvas && typeof OffscreenCanvas !== \"undefined\" && opts.canvas instanceof OffscreenCanvas;\n                opts = Object.assign({}, opts, this.props.glOptions);\n                this.gl = this.props.gl ? (0, _gltools.instrumentGLContext)(this.props.gl, opts) : this.onCreateContext(opts);\n                if (!(0, _gltools.isWebGL)(this.gl)) throw new Error(\"AnimationLoop.onCreateContext - illegal context returned\");\n                (0, _gltools.resetParameters)(this.gl);\n                this._createInfoDiv();\n            }\n        },\n        {\n            key: \"_createInfoDiv\",\n            value: function _createInfoDiv() {\n                if (this.gl.canvas && this.props.onAddHTML) {\n                    var wrapperDiv = document.createElement(\"div\");\n                    document.body.appendChild(wrapperDiv);\n                    wrapperDiv.style.position = \"relative\";\n                    var div = document.createElement(\"div\");\n                    div.style.position = \"absolute\";\n                    div.style.left = \"10px\";\n                    div.style.bottom = \"10px\";\n                    div.style.width = \"300px\";\n                    div.style.background = \"white\";\n                    wrapperDiv.appendChild(this.gl.canvas);\n                    wrapperDiv.appendChild(div);\n                    var html = this.props.onAddHTML(div);\n                    if (html) div.innerHTML = html;\n                }\n            }\n        },\n        {\n            key: \"_getSizeAndAspect\",\n            value: function _getSizeAndAspect() {\n                var width = this.gl.drawingBufferWidth;\n                var height = this.gl.drawingBufferHeight;\n                var aspect = 1;\n                var canvas = this.gl.canvas;\n                if (canvas && canvas.clientHeight) aspect = canvas.clientWidth / canvas.clientHeight;\n                else if (width > 0 && height > 0) aspect = width / height;\n                return {\n                    width: width,\n                    height: height,\n                    aspect: aspect\n                };\n            }\n        },\n        {\n            key: \"_resizeViewport\",\n            value: function _resizeViewport() {\n                if (this.autoResizeViewport) this.gl.viewport(0, 0, this.gl.drawingBufferWidth, this.gl.drawingBufferHeight);\n            }\n        },\n        {\n            key: \"_resizeCanvasDrawingBuffer\",\n            value: function _resizeCanvasDrawingBuffer() {\n                if (this.autoResizeDrawingBuffer) (0, _gltools.resizeGLContext)(this.gl, {\n                    useDevicePixels: this.useDevicePixels\n                });\n            }\n        },\n        {\n            key: \"_createFramebuffer\",\n            value: function _createFramebuffer() {\n                if (this.props.createFramebuffer) this.framebuffer = new (0, _webgl.Framebuffer)(this.gl);\n            }\n        },\n        {\n            key: \"_resizeFramebuffer\",\n            value: function _resizeFramebuffer() {\n                if (this.framebuffer) this.framebuffer.resize({\n                    width: this.gl.drawingBufferWidth,\n                    height: this.gl.drawingBufferHeight\n                });\n            }\n        },\n        {\n            key: \"_beginTimers\",\n            value: function _beginTimers() {\n                this.frameRate.timeEnd();\n                this.frameRate.timeStart();\n                if (this._gpuTimeQuery && this._gpuTimeQuery.isResultAvailable() && !this._gpuTimeQuery.isTimerDisjoint()) this.stats.get(\"GPU Time\").addTime(this._gpuTimeQuery.getTimerMilliseconds());\n                if (this._gpuTimeQuery) this._gpuTimeQuery.beginTimeElapsedQuery();\n                this.cpuTime.timeStart();\n            }\n        },\n        {\n            key: \"_endTimers\",\n            value: function _endTimers() {\n                this.cpuTime.timeEnd();\n                if (this._gpuTimeQuery) this._gpuTimeQuery.end();\n            }\n        },\n        {\n            key: \"_startEventHandling\",\n            value: function _startEventHandling() {\n                var canvas = this.gl.canvas;\n                if (canvas) {\n                    canvas.addEventListener(\"mousemove\", this._onMousemove);\n                    canvas.addEventListener(\"mouseleave\", this._onMouseleave);\n                }\n            }\n        },\n        {\n            key: \"_onMousemove\",\n            value: function _onMousemove(e) {\n                this.animationProps._mousePosition = [\n                    e.offsetX,\n                    e.offsetY\n                ];\n            }\n        },\n        {\n            key: \"_onMouseleave\",\n            value: function _onMouseleave(e) {\n                this.animationProps._mousePosition = null;\n            }\n        }\n    ]);\n    return AnimationLoop1;\n}();\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/gltools\":\"grcb8\",\"@luma.gl/webgl\":\"7gBVn\",\"probe.gl/env\":\"4WXZh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6H3H1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Model);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _programManager = require(\"./program-manager\");\nvar _programManagerDefault = parcelHelpers.interopDefault(_programManager);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _modelUtils = require(\"./model-utils\");\nvar LOG_DRAW_PRIORITY = 2;\nvar LOG_DRAW_TIMEOUT = 10000;\nvar ERR_MODEL_PARAMS = \"Model needs drawMode and vertexCount\";\nvar NOOP = function NOOP() {};\nvar DRAW_PARAMS = {};\nvar Model = function() {\n    function Model1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Model1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"model\") : _props$id;\n        (0, _webgl.assert)((0, _gltools.isWebGL)(gl));\n        this.id = id;\n        this.gl = gl;\n        this.id = props.id || (0, _webgl.uid)(\"Model\");\n        this.lastLogTime = 0;\n        this.initialize(props);\n    }\n    (0, _createClassDefault.default)(Model1, [\n        {\n            key: \"initialize\",\n            value: function initialize(props) {\n                this.props = {};\n                this.programManager = props.programManager || (0, _programManagerDefault.default).getDefaultProgramManager(this.gl);\n                this._programManagerState = -1;\n                this._managedProgram = false;\n                var _props$program = props.program, program = _props$program === void 0 ? null : _props$program, vs = props.vs, fs = props.fs, modules = props.modules, defines = props.defines, inject = props.inject, varyings = props.varyings, bufferMode = props.bufferMode, transpileToGLSL100 = props.transpileToGLSL100;\n                this.programProps = {\n                    program: program,\n                    vs: vs,\n                    fs: fs,\n                    modules: modules,\n                    defines: defines,\n                    inject: inject,\n                    varyings: varyings,\n                    bufferMode: bufferMode,\n                    transpileToGLSL100: transpileToGLSL100\n                };\n                this.program = null;\n                this.vertexArray = null;\n                this._programDirty = true;\n                this.userData = {};\n                this.needsRedraw = true;\n                this._attributes = {};\n                this.attributes = {};\n                this.uniforms = {};\n                this.pickable = true;\n                this._checkProgram();\n                this.setUniforms(Object.assign({}, this.getModuleUniforms(props.moduleSettings)));\n                this.drawMode = props.drawMode !== undefined ? props.drawMode : 4;\n                this.vertexCount = props.vertexCount || 0;\n                this.geometryBuffers = {};\n                this.isInstanced = props.isInstanced || props.instanced || props.instanceCount > 0;\n                this._setModelProps(props);\n                this.geometry = {};\n                (0, _webgl.assert)(this.drawMode !== undefined && Number.isFinite(this.vertexCount), ERR_MODEL_PARAMS);\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                this._setModelProps(props);\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                for(var key in this._attributes)if (this._attributes[key] !== this.attributes[key]) this._attributes[key][\"delete\"]();\n                if (this._managedProgram) {\n                    this.programManager.release(this.program);\n                    this._managedProgram = false;\n                }\n                this.vertexArray[\"delete\"]();\n                this._deleteGeometryBuffers();\n            }\n        },\n        {\n            key: \"getDrawMode\",\n            value: function getDrawMode() {\n                return this.drawMode;\n            }\n        },\n        {\n            key: \"getVertexCount\",\n            value: function getVertexCount() {\n                return this.vertexCount;\n            }\n        },\n        {\n            key: \"getInstanceCount\",\n            value: function getInstanceCount() {\n                return this.instanceCount;\n            }\n        },\n        {\n            key: \"getAttributes\",\n            value: function getAttributes() {\n                return this.attributes;\n            }\n        },\n        {\n            key: \"getProgram\",\n            value: function getProgram() {\n                return this.program;\n            }\n        },\n        {\n            key: \"setProgram\",\n            value: function setProgram(props) {\n                var program = props.program, vs = props.vs, fs = props.fs, modules = props.modules, defines = props.defines, inject = props.inject, varyings = props.varyings, bufferMode = props.bufferMode, transpileToGLSL100 = props.transpileToGLSL100;\n                this.programProps = {\n                    program: program,\n                    vs: vs,\n                    fs: fs,\n                    modules: modules,\n                    defines: defines,\n                    inject: inject,\n                    varyings: varyings,\n                    bufferMode: bufferMode,\n                    transpileToGLSL100: transpileToGLSL100\n                };\n                this._programDirty = true;\n            }\n        },\n        {\n            key: \"getUniforms\",\n            value: function getUniforms() {\n                return this.uniforms;\n            }\n        },\n        {\n            key: \"setDrawMode\",\n            value: function setDrawMode(drawMode) {\n                this.drawMode = drawMode;\n                return this;\n            }\n        },\n        {\n            key: \"setVertexCount\",\n            value: function setVertexCount(vertexCount) {\n                (0, _webgl.assert)(Number.isFinite(vertexCount));\n                this.vertexCount = vertexCount;\n                return this;\n            }\n        },\n        {\n            key: \"setInstanceCount\",\n            value: function setInstanceCount(instanceCount) {\n                (0, _webgl.assert)(Number.isFinite(instanceCount));\n                this.instanceCount = instanceCount;\n                return this;\n            }\n        },\n        {\n            key: \"setGeometry\",\n            value: function setGeometry(geometry) {\n                this.drawMode = geometry.drawMode;\n                this.vertexCount = geometry.getVertexCount();\n                this._deleteGeometryBuffers();\n                this.geometryBuffers = (0, _modelUtils.getBuffersFromGeometry)(this.gl, geometry);\n                this.vertexArray.setAttributes(this.geometryBuffers);\n                return this;\n            }\n        },\n        {\n            key: \"setAttributes\",\n            value: function setAttributes() {\n                var attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if ((0, _webgl.isObjectEmpty)(attributes)) return this;\n                var normalizedAttributes = {};\n                for(var name in attributes){\n                    var attribute = attributes[name];\n                    normalizedAttributes[name] = attribute.getValue ? attribute.getValue() : attribute;\n                }\n                this.vertexArray.setAttributes(normalizedAttributes);\n                return this;\n            }\n        },\n        {\n            key: \"setUniforms\",\n            value: function setUniforms() {\n                var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                Object.assign(this.uniforms, uniforms);\n                return this;\n            }\n        },\n        {\n            key: \"getModuleUniforms\",\n            value: function getModuleUniforms(opts) {\n                this._checkProgram();\n                var getUniforms = this.programManager.getUniforms(this.program);\n                if (getUniforms) return getUniforms(opts);\n                return {};\n            }\n        },\n        {\n            key: \"updateModuleSettings\",\n            value: function updateModuleSettings(opts) {\n                var uniforms = this.getModuleUniforms(opts || {});\n                return this.setUniforms(uniforms);\n            }\n        },\n        {\n            key: \"clear\",\n            value: function clear(opts) {\n                (0, _webgl.clear)(this.program.gl, opts);\n                return this;\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this._checkProgram();\n                var _opts$moduleSettings = opts.moduleSettings, moduleSettings = _opts$moduleSettings === void 0 ? null : _opts$moduleSettings, framebuffer = opts.framebuffer, _opts$uniforms = opts.uniforms, uniforms = _opts$uniforms === void 0 ? {} : _opts$uniforms, _opts$attributes = opts.attributes, attributes = _opts$attributes === void 0 ? {} : _opts$attributes, _opts$transformFeedba = opts.transformFeedback, transformFeedback = _opts$transformFeedba === void 0 ? this.transformFeedback : _opts$transformFeedba, _opts$parameters = opts.parameters, parameters = _opts$parameters === void 0 ? {} : _opts$parameters, _opts$vertexArray = opts.vertexArray, vertexArray = _opts$vertexArray === void 0 ? this.vertexArray : _opts$vertexArray;\n                this.setAttributes(attributes);\n                this.updateModuleSettings(moduleSettings);\n                this.setUniforms(uniforms);\n                var logPriority;\n                if ((0, _webgl.log).priority >= LOG_DRAW_PRIORITY) logPriority = this._logDrawCallStart(LOG_DRAW_PRIORITY);\n                var drawParams = this.vertexArray.getDrawParams();\n                var _this$props = this.props, _this$props$isIndexed = _this$props.isIndexed, isIndexed = _this$props$isIndexed === void 0 ? drawParams.isIndexed : _this$props$isIndexed, _this$props$indexType = _this$props.indexType, indexType = _this$props$indexType === void 0 ? drawParams.indexType : _this$props$indexType, _this$props$indexOffs = _this$props.indexOffset, indexOffset = _this$props$indexOffs === void 0 ? drawParams.indexOffset : _this$props$indexOffs, _this$props$vertexArr = _this$props.vertexArrayInstanced, vertexArrayInstanced = _this$props$vertexArr === void 0 ? drawParams.isInstanced : _this$props$vertexArr;\n                if (vertexArrayInstanced && !this.isInstanced) (0, _webgl.log).warn(\"Found instanced attributes on non-instanced model\", this.id)();\n                var isInstanced = this.isInstanced, instanceCount = this.instanceCount;\n                var _this$props2 = this.props, _this$props2$onBefore = _this$props2.onBeforeRender, onBeforeRender = _this$props2$onBefore === void 0 ? NOOP : _this$props2$onBefore, _this$props2$onAfterR = _this$props2.onAfterRender, onAfterRender = _this$props2$onAfterR === void 0 ? NOOP : _this$props2$onAfterR;\n                onBeforeRender();\n                this.program.setUniforms(this.uniforms);\n                var didDraw = this.program.draw(Object.assign(DRAW_PARAMS, opts, {\n                    logPriority: logPriority,\n                    uniforms: null,\n                    framebuffer: framebuffer,\n                    parameters: parameters,\n                    drawMode: this.getDrawMode(),\n                    vertexCount: this.getVertexCount(),\n                    vertexArray: vertexArray,\n                    transformFeedback: transformFeedback,\n                    isIndexed: isIndexed,\n                    indexType: indexType,\n                    isInstanced: isInstanced,\n                    instanceCount: instanceCount,\n                    offset: isIndexed ? indexOffset : 0\n                }));\n                onAfterRender();\n                if ((0, _webgl.log).priority >= LOG_DRAW_PRIORITY) this._logDrawCallEnd(logPriority, vertexArray, framebuffer);\n                return didDraw;\n            }\n        },\n        {\n            key: \"transform\",\n            value: function transform() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _opts$discard = opts.discard, discard = _opts$discard === void 0 ? true : _opts$discard, feedbackBuffers = opts.feedbackBuffers, _opts$unbindModels = opts.unbindModels, unbindModels = _opts$unbindModels === void 0 ? [] : _opts$unbindModels;\n                var parameters = opts.parameters;\n                if (feedbackBuffers) this._setFeedbackBuffers(feedbackBuffers);\n                if (discard) parameters = Object.assign({}, parameters, (0, _definePropertyDefault.default)({}, 35977, discard));\n                unbindModels.forEach(function(model) {\n                    return model.vertexArray.unbindBuffers();\n                });\n                try {\n                    this.draw(Object.assign({}, opts, {\n                        parameters: parameters\n                    }));\n                } finally{\n                    unbindModels.forEach(function(model) {\n                        return model.vertexArray.bindBuffers();\n                    });\n                }\n                return this;\n            }\n        },\n        {\n            key: \"render\",\n            value: function render() {\n                var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                (0, _webgl.log).warn(\"Model.render() is deprecated. Use Model.setUniforms() and Model.draw()\")();\n                return this.setUniforms(uniforms).draw();\n            }\n        },\n        {\n            key: \"_setModelProps\",\n            value: function _setModelProps(props) {\n                Object.assign(this.props, props);\n                if (\"uniforms\" in props) this.setUniforms(props.uniforms);\n                if (\"pickable\" in props) this.pickable = props.pickable;\n                if (\"instanceCount\" in props) this.instanceCount = props.instanceCount;\n                if (\"geometry\" in props) this.setGeometry(props.geometry);\n                if (\"attributes\" in props) this.setAttributes(props.attributes);\n                if (\"_feedbackBuffers\" in props) this._setFeedbackBuffers(props._feedbackBuffers);\n            }\n        },\n        {\n            key: \"_checkProgram\",\n            value: function _checkProgram() {\n                var shaderCache = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                var needsUpdate = this._programDirty || this.programManager.stateHash !== this._programManagerState;\n                if (!needsUpdate) return;\n                var program = this.programProps.program;\n                if (program) this._managedProgram = false;\n                else {\n                    var _this$programProps = this.programProps, vs = _this$programProps.vs, fs = _this$programProps.fs, modules = _this$programProps.modules, inject = _this$programProps.inject, defines = _this$programProps.defines, varyings = _this$programProps.varyings, bufferMode = _this$programProps.bufferMode, transpileToGLSL100 = _this$programProps.transpileToGLSL100;\n                    program = this.programManager.get({\n                        vs: vs,\n                        fs: fs,\n                        modules: modules,\n                        inject: inject,\n                        defines: defines,\n                        varyings: varyings,\n                        bufferMode: bufferMode,\n                        transpileToGLSL100: transpileToGLSL100\n                    });\n                    if (this.program && this._managedProgram) this.programManager.release(this.program);\n                    this._programManagerState = this.programManager.stateHash;\n                    this._managedProgram = true;\n                }\n                (0, _webgl.assert)(program instanceof (0, _webgl.Program), \"Model needs a program\");\n                this._programDirty = false;\n                if (program === this.program) return;\n                this.program = program;\n                if (this.vertexArray) this.vertexArray.setProps({\n                    program: this.program,\n                    attributes: this.vertexArray.attributes\n                });\n                else this.vertexArray = new (0, _webgl.VertexArray)(this.gl, {\n                    program: this.program\n                });\n                this.setUniforms(Object.assign({}, this.getModuleUniforms()));\n            }\n        },\n        {\n            key: \"_deleteGeometryBuffers\",\n            value: function _deleteGeometryBuffers() {\n                for(var name in this.geometryBuffers){\n                    var buffer = this.geometryBuffers[name][0] || this.geometryBuffers[name];\n                    if (buffer instanceof (0, _webgl.Buffer)) buffer[\"delete\"]();\n                }\n            }\n        },\n        {\n            key: \"_setAnimationProps\",\n            value: function _setAnimationProps(animationProps) {\n                if (this.animated) {\n                    (0, _webgl.assert)(animationProps, \"Model.draw(): animated uniforms but no animationProps\");\n                    var animatedUniforms = this._evaluateAnimateUniforms(animationProps);\n                    Object.assign(this.uniforms, animatedUniforms);\n                }\n            }\n        },\n        {\n            key: \"_setFeedbackBuffers\",\n            value: function _setFeedbackBuffers() {\n                var feedbackBuffers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if ((0, _webgl.isObjectEmpty)(feedbackBuffers)) return this;\n                var gl = this.program.gl;\n                this.transformFeedback = this.transformFeedback || new (0, _webgl.TransformFeedback)(gl, {\n                    program: this.program\n                });\n                this.transformFeedback.setBuffers(feedbackBuffers);\n                return this;\n            }\n        },\n        {\n            key: \"_logDrawCallStart\",\n            value: function _logDrawCallStart(logLevel) {\n                var logDrawTimeout = logLevel > 3 ? 0 : LOG_DRAW_TIMEOUT;\n                if (Date.now() - this.lastLogTime < logDrawTimeout) return undefined;\n                this.lastLogTime = Date.now();\n                (0, _webgl.log).group(LOG_DRAW_PRIORITY, \">>> DRAWING MODEL \".concat(this.id), {\n                    collapsed: (0, _webgl.log).level <= 2\n                })();\n                return logLevel;\n            }\n        },\n        {\n            key: \"_logDrawCallEnd\",\n            value: function _logDrawCallEnd(logLevel, vertexArray, uniforms, framebuffer) {\n                if (logLevel === undefined) return;\n                var attributeTable = (0, _webgl.getDebugTableForVertexArray)({\n                    vertexArray: vertexArray,\n                    header: \"\".concat(this.id, \" attributes\"),\n                    attributes: this._attributes\n                });\n                var _getDebugTableForUnif = (0, _webgl.getDebugTableForUniforms)({\n                    header: \"\".concat(this.id, \" uniforms\"),\n                    program: this.program,\n                    uniforms: Object.assign({}, this.program.uniforms, uniforms)\n                }), uniformTable = _getDebugTableForUnif.table, unusedTable = _getDebugTableForUnif.unusedTable, unusedCount = _getDebugTableForUnif.unusedCount;\n                var _getDebugTableForUnif2 = (0, _webgl.getDebugTableForUniforms)({\n                    header: \"\".concat(this.id, \" uniforms\"),\n                    program: this.program,\n                    uniforms: Object.assign({}, this.program.uniforms, uniforms),\n                    undefinedOnly: true\n                }), missingTable = _getDebugTableForUnif2.table, missingCount = _getDebugTableForUnif2.count;\n                if (missingCount > 0) (0, _webgl.log).log(\"MISSING UNIFORMS\", Object.keys(missingTable))();\n                if (unusedCount > 0) (0, _webgl.log).log(\"UNUSED UNIFORMS\", Object.keys(unusedTable))();\n                var configTable = (0, _webgl.getDebugTableForProgramConfiguration)(this.vertexArray.configuration);\n                (0, _webgl.log).table(logLevel, attributeTable)();\n                (0, _webgl.log).table(logLevel, uniformTable)();\n                (0, _webgl.log).table(logLevel + 1, configTable)();\n                if (framebuffer) framebuffer.log({\n                    logLevel: LOG_DRAW_PRIORITY,\n                    message: \"Rendered to \".concat(framebuffer.id)\n                });\n                (0, _webgl.log).groupEnd(LOG_DRAW_PRIORITY, \">>> DRAWING MODEL \".concat(this.id))();\n            }\n        }\n    ]);\n    return Model1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/gltools\":\"grcb8\",\"./program-manager\":\"aXWW9\",\"@luma.gl/webgl\":\"7gBVn\",\"./model-utils\":\"iojEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aXWW9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ProgramManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _shadertools = require(\"@luma.gl/shadertools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar ProgramManager = function() {\n    (0, _createClassDefault.default)(ProgramManager1, null, [\n        {\n            key: \"getDefaultProgramManager\",\n            value: function getDefaultProgramManager(gl) {\n                gl.luma = gl.luma || {};\n                gl.luma.defaultProgramManager = gl.luma.defaultProgramManager || new ProgramManager1(gl);\n                return gl.luma.defaultProgramManager;\n            }\n        }\n    ]);\n    function ProgramManager1(gl) {\n        (0, _classCallCheckDefault.default)(this, ProgramManager1);\n        this.gl = gl;\n        this._programCache = {};\n        this._getUniforms = {};\n        this._registeredModules = {};\n        this._hookFunctions = [];\n        this._defaultModules = [];\n        this._hashes = {};\n        this._hashCounter = 0;\n        this.stateHash = 0;\n        this._useCounts = {};\n    }\n    (0, _createClassDefault.default)(ProgramManager1, [\n        {\n            key: \"addDefaultModule\",\n            value: function addDefaultModule(module) {\n                if (!this._defaultModules.find(function(m) {\n                    return m.name === module.name;\n                })) this._defaultModules.push(module);\n                this.stateHash++;\n            }\n        },\n        {\n            key: \"removeDefaultModule\",\n            value: function removeDefaultModule(module) {\n                var moduleName = typeof module === \"string\" ? module : module.name;\n                this._defaultModules = this._defaultModules.filter(function(m) {\n                    return m.name !== moduleName;\n                });\n                this.stateHash++;\n            }\n        },\n        {\n            key: \"addShaderHook\",\n            value: function addShaderHook(hook, opts) {\n                if (opts) hook = Object.assign(opts, {\n                    hook: hook\n                });\n                this._hookFunctions.push(hook);\n                this.stateHash++;\n            }\n        },\n        {\n            key: \"get\",\n            value: function get() {\n                var _this = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _props$vs = props.vs, vs = _props$vs === void 0 ? \"\" : _props$vs, _props$fs = props.fs, fs = _props$fs === void 0 ? \"\" : _props$fs, _props$defines = props.defines, defines = _props$defines === void 0 ? {} : _props$defines, _props$inject = props.inject, inject = _props$inject === void 0 ? {} : _props$inject, _props$varyings = props.varyings, varyings = _props$varyings === void 0 ? [] : _props$varyings, _props$bufferMode = props.bufferMode, bufferMode = _props$bufferMode === void 0 ? 0x8c8d : _props$bufferMode, _props$transpileToGLS = props.transpileToGLSL100, transpileToGLSL100 = _props$transpileToGLS === void 0 ? false : _props$transpileToGLS;\n                var modules = this._getModuleList(props.modules);\n                var vsHash = this._getHash(vs);\n                var fsHash = this._getHash(fs);\n                var moduleHashes = modules.map(function(m) {\n                    return _this._getHash(m.name);\n                }).sort();\n                var varyingHashes = varyings.map(function(v) {\n                    return _this._getHash(v);\n                });\n                var defineKeys = Object.keys(defines).sort();\n                var injectKeys = Object.keys(inject).sort();\n                var defineHashes = [];\n                var injectHashes = [];\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = defineKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var key = _step.value;\n                        defineHashes.push(this._getHash(key));\n                        defineHashes.push(this._getHash(defines[key]));\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                var _iteratorNormalCompletion2 = true;\n                var _didIteratorError2 = false;\n                var _iteratorError2 = undefined;\n                try {\n                    for(var _iterator2 = injectKeys[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                        var _key = _step2.value;\n                        injectHashes.push(this._getHash(_key));\n                        injectHashes.push(this._getHash(inject[_key]));\n                    }\n                } catch (err1) {\n                    _didIteratorError2 = true;\n                    _iteratorError2 = err1;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n                    } finally{\n                        if (_didIteratorError2) throw _iteratorError2;\n                    }\n                }\n                var hash = \"\".concat(vsHash, \"/\").concat(fsHash, \"D\").concat(defineHashes.join(\"/\"), \"M\").concat(moduleHashes.join(\"/\"), \"I\").concat(injectHashes.join(\"/\"), \"V\").concat(varyingHashes.join(\"/\"), \"H\").concat(this.stateHash, \"B\").concat(bufferMode).concat(transpileToGLSL100 ? \"T\" : \"\");\n                if (!this._programCache[hash]) {\n                    var assembled = (0, _shadertools.assembleShaders)(this.gl, {\n                        vs: vs,\n                        fs: fs,\n                        modules: modules,\n                        inject: inject,\n                        defines: defines,\n                        hookFunctions: this._hookFunctions,\n                        transpileToGLSL100: transpileToGLSL100\n                    });\n                    this._programCache[hash] = new (0, _webgl.Program)(this.gl, {\n                        hash: hash,\n                        vs: assembled.vs,\n                        fs: assembled.fs,\n                        varyings: varyings,\n                        bufferMode: bufferMode\n                    });\n                    this._getUniforms[hash] = assembled.getUniforms || function(x) {};\n                    this._useCounts[hash] = 0;\n                }\n                this._useCounts[hash]++;\n                return this._programCache[hash];\n            }\n        },\n        {\n            key: \"getUniforms\",\n            value: function getUniforms(program) {\n                return this._getUniforms[program.hash] || null;\n            }\n        },\n        {\n            key: \"release\",\n            value: function release(program) {\n                var hash = program.hash;\n                this._useCounts[hash]--;\n                if (this._useCounts[hash] === 0) {\n                    this._programCache[hash][\"delete\"]();\n                    delete this._programCache[hash];\n                    delete this._getUniforms[hash];\n                    delete this._useCounts[hash];\n                }\n            }\n        },\n        {\n            key: \"_getHash\",\n            value: function _getHash(key) {\n                if (this._hashes[key] === undefined) this._hashes[key] = this._hashCounter++;\n                return this._hashes[key];\n            }\n        },\n        {\n            key: \"_getModuleList\",\n            value: function _getModuleList() {\n                var appModules = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n                var modules = new Array(this._defaultModules.length + appModules.length);\n                var seen = {};\n                var count = 0;\n                for(var i = 0, len = this._defaultModules.length; i < len; ++i){\n                    var module = this._defaultModules[i];\n                    var name = module.name;\n                    modules[count++] = module;\n                    seen[name] = true;\n                }\n                for(var _i = 0, _len = appModules.length; _i < _len; ++_i){\n                    var _module = appModules[_i];\n                    var _name = _module.name;\n                    if (!seen[_name]) {\n                        modules[count++] = _module;\n                        seen[_name] = true;\n                    }\n                }\n                modules.length = count;\n                return modules;\n            }\n        }\n    ]);\n    return ProgramManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/shadertools\":\"5aMWt\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5aMWt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assembleShaders\", ()=>(0, _assembleShaders.assembleShaders));\nparcelHelpers.export(exports, \"combineInjects\", ()=>(0, _injectShader.combineInjects));\nparcelHelpers.export(exports, \"normalizeShaderModule\", ()=>(0, _shaderModule.normalizeShaderModule));\nparcelHelpers.export(exports, \"getQualifierDetails\", ()=>(0, _shaderUtils.getQualifierDetails));\nparcelHelpers.export(exports, \"getPassthroughFS\", ()=>(0, _shaderUtils.getPassthroughFS));\nparcelHelpers.export(exports, \"typeToChannelSuffix\", ()=>(0, _shaderUtils.typeToChannelSuffix));\nparcelHelpers.export(exports, \"typeToChannelCount\", ()=>(0, _shaderUtils.typeToChannelCount));\nparcelHelpers.export(exports, \"convertToVec4\", ()=>(0, _shaderUtils.convertToVec4));\nvar _assembleShaders = require(\"./lib/assemble-shaders\");\nvar _injectShader = require(\"./lib/inject-shader\");\nvar _shaderModule = require(\"./lib/shader-module\");\nvar _shaderUtils = require(\"./utils/shader-utils\");\nvar _modules = require(\"./modules\");\nparcelHelpers.exportAll(_modules, exports);\n\n},{\"./lib/assemble-shaders\":\"77F3k\",\"./lib/inject-shader\":\"djPC6\",\"./lib/shader-module\":\"2V3PP\",\"./utils/shader-utils\":\"7Wd4c\",\"./modules\":\"lW0Pc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"77F3k\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assembleShaders\", ()=>assembleShaders);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _constants = require(\"./constants\");\nvar _resolveModules = require(\"./resolve-modules\");\nvar _platformDefines = require(\"./platform-defines\");\nvar _injectShader = require(\"./inject-shader\");\nvar _injectShaderDefault = parcelHelpers.interopDefault(_injectShader);\nvar _transpileShader = require(\"./transpile-shader\");\nvar _transpileShaderDefault = parcelHelpers.interopDefault(_transpileShader);\nvar _utils = require(\"../utils\");\nvar _SHADER_TYPE;\nvar INJECT_SHADER_DECLARATIONS = \"\\n\\n\".concat((0, _injectShader.DECLARATION_INJECT_MARKER), \"\\n\\n\");\nvar SHADER_TYPE = (_SHADER_TYPE = {}, (0, _definePropertyDefault.default)(_SHADER_TYPE, (0, _constants.VERTEX_SHADER), \"vertex\"), (0, _definePropertyDefault.default)(_SHADER_TYPE, (0, _constants.FRAGMENT_SHADER), \"fragment\"), _SHADER_TYPE);\nvar FRAGMENT_SHADER_PROLOGUE = \"precision highp float;\\n\\n\";\nfunction assembleShaders(gl, opts) {\n    var vs = opts.vs, fs = opts.fs;\n    var modules = (0, _resolveModules.resolveModules)(opts.modules || []);\n    return {\n        gl: gl,\n        vs: assembleShader(gl, Object.assign({}, opts, {\n            source: vs,\n            type: (0, _constants.VERTEX_SHADER),\n            modules: modules\n        })),\n        fs: assembleShader(gl, Object.assign({}, opts, {\n            source: fs,\n            type: (0, _constants.FRAGMENT_SHADER),\n            modules: modules\n        })),\n        getUniforms: assembleGetUniforms(modules)\n    };\n}\nfunction assembleShader(gl, _ref) {\n    var id = _ref.id, source = _ref.source, type = _ref.type, modules = _ref.modules, _ref$defines = _ref.defines, defines = _ref$defines === void 0 ? {} : _ref$defines, _ref$hookFunctions = _ref.hookFunctions, hookFunctions = _ref$hookFunctions === void 0 ? [] : _ref$hookFunctions, _ref$inject = _ref.inject, inject = _ref$inject === void 0 ? {} : _ref$inject, _ref$transpileToGLSL = _ref.transpileToGLSL100, transpileToGLSL100 = _ref$transpileToGLSL === void 0 ? false : _ref$transpileToGLSL, _ref$prologue = _ref.prologue, prologue = _ref$prologue === void 0 ? true : _ref$prologue, log = _ref.log;\n    (0, _utils.assert)(typeof source === \"string\", \"shader source must be a string\");\n    var isVertex = type === (0, _constants.VERTEX_SHADER);\n    var sourceLines = source.split(\"\\n\");\n    var glslVersion = 100;\n    var versionLine = \"\";\n    var coreSource = source;\n    if (sourceLines[0].indexOf(\"#version \") === 0) {\n        glslVersion = 300;\n        versionLine = sourceLines[0];\n        coreSource = sourceLines.slice(1).join(\"\\n\");\n    } else versionLine = \"#version \".concat(glslVersion);\n    var allDefines = {};\n    modules.forEach(function(module) {\n        Object.assign(allDefines, module.getDefines());\n    });\n    Object.assign(allDefines, defines);\n    var assembledSource = prologue ? \"\".concat(versionLine, \"\\n\").concat(getShaderName({\n        id: id,\n        source: source,\n        type: type\n    }), \"\\n\").concat(getShaderType({\n        type: type\n    }), \"\\n\").concat((0, _platformDefines.getPlatformShaderDefines)(gl), \"\\n\").concat((0, _platformDefines.getVersionDefines)(gl, glslVersion, !isVertex), \"\\n\").concat(getApplicationDefines(allDefines), \"\\n\").concat(isVertex ? \"\" : FRAGMENT_SHADER_PROLOGUE, \"\\n\") : \"\".concat(versionLine, \"\\n\");\n    hookFunctions = normalizeHookFunctions(hookFunctions);\n    var hookInjections = {};\n    var declInjections = {};\n    var mainInjections = {};\n    for(var key in inject){\n        var injection = typeof inject[key] === \"string\" ? {\n            injection: inject[key],\n            order: 0\n        } : inject[key];\n        var match = key.match(/^(v|f)s:(#)?([\\w-]+)$/);\n        if (match) {\n            var hash = match[2];\n            var name = match[3];\n            if (hash) {\n                if (name === \"decl\") declInjections[key] = [\n                    injection\n                ];\n                else mainInjections[key] = [\n                    injection\n                ];\n            } else hookInjections[key] = [\n                injection\n            ];\n        } else mainInjections[key] = [\n            injection\n        ];\n    }\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = modules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var module1 = _step.value;\n            if (log) module1.checkDeprecations(coreSource, log);\n            var moduleSource = module1.getModuleSource(type, glslVersion);\n            assembledSource += moduleSource;\n            var injections = module1.injections[type];\n            for(var _key in injections){\n                var _match = _key.match(/^(v|f)s:#([\\w-]+)$/);\n                if (_match) {\n                    var _name = _match[2];\n                    var injectionType = _name === \"decl\" ? declInjections : mainInjections;\n                    injectionType[_key] = injectionType[_key] || [];\n                    injectionType[_key].push(injections[_key]);\n                } else {\n                    hookInjections[_key] = hookInjections[_key] || [];\n                    hookInjections[_key].push(injections[_key]);\n                }\n            }\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    assembledSource += INJECT_SHADER_DECLARATIONS;\n    assembledSource = (0, _injectShaderDefault.default)(assembledSource, type, declInjections);\n    assembledSource += getHookFunctions(hookFunctions[type], hookInjections);\n    assembledSource += coreSource;\n    assembledSource = (0, _injectShaderDefault.default)(assembledSource, type, mainInjections);\n    assembledSource = (0, _transpileShaderDefault.default)(assembledSource, transpileToGLSL100 ? 100 : glslVersion, isVertex);\n    return assembledSource;\n}\nfunction assembleGetUniforms(modules) {\n    return function getUniforms(opts) {\n        var uniforms = {};\n        var _iteratorNormalCompletion2 = true;\n        var _didIteratorError2 = false;\n        var _iteratorError2 = undefined;\n        try {\n            for(var _iterator2 = modules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                var module = _step2.value;\n                var moduleUniforms = module.getUniforms(opts, uniforms);\n                Object.assign(uniforms, moduleUniforms);\n            }\n        } catch (err) {\n            _didIteratorError2 = true;\n            _iteratorError2 = err;\n        } finally{\n            try {\n                if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n            } finally{\n                if (_didIteratorError2) throw _iteratorError2;\n            }\n        }\n        return uniforms;\n    };\n}\nfunction getShaderType(_ref2) {\n    var type = _ref2.type;\n    return \"\\n#define SHADER_TYPE_\".concat(SHADER_TYPE[type].toUpperCase(), \"\\n\");\n}\nfunction getShaderName(_ref3) {\n    var id = _ref3.id, source = _ref3.source, type = _ref3.type;\n    var injectShaderName = id && typeof id === \"string\" && source.indexOf(\"SHADER_NAME\") === -1;\n    return injectShaderName ? \"\\n#define SHADER_NAME \".concat(id, \"_\").concat(SHADER_TYPE[type], \"\\n\\n\") : \"\";\n}\nfunction getApplicationDefines() {\n    var defines = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var count = 0;\n    var sourceText = \"\";\n    for(var define in defines){\n        if (count === 0) sourceText += \"\\n// APPLICATION DEFINES\\n\";\n        count++;\n        var value = defines[define];\n        if (value || Number.isFinite(value)) sourceText += \"#define \".concat(define.toUpperCase(), \" \").concat(defines[define], \"\\n\");\n    }\n    if (count === 0) sourceText += \"\\n\";\n    return sourceText;\n}\nfunction getHookFunctions(hookFunctions, hookInjections) {\n    var result = \"\";\n    for(var hookName in hookFunctions){\n        var hookFunction = hookFunctions[hookName];\n        result += \"void \".concat(hookFunction.signature, \" {\\n\");\n        if (hookFunction.header) result += \"  \".concat(hookFunction.header);\n        if (hookInjections[hookName]) {\n            var injections = hookInjections[hookName];\n            injections.sort(function(a, b) {\n                return a.order - b.order;\n            });\n            var _iteratorNormalCompletion3 = true;\n            var _didIteratorError3 = false;\n            var _iteratorError3 = undefined;\n            try {\n                for(var _iterator3 = injections[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){\n                    var injection = _step3.value;\n                    result += \"  \".concat(injection.injection, \"\\n\");\n                }\n            } catch (err) {\n                _didIteratorError3 = true;\n                _iteratorError3 = err;\n            } finally{\n                try {\n                    if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) _iterator3[\"return\"]();\n                } finally{\n                    if (_didIteratorError3) throw _iteratorError3;\n                }\n            }\n        }\n        if (hookFunction.footer) result += \"  \".concat(hookFunction.footer);\n        result += \"}\\n\";\n    }\n    return result;\n}\nfunction normalizeHookFunctions(hookFunctions) {\n    var result = {\n        vs: {},\n        fs: {}\n    };\n    hookFunctions.forEach(function(hook) {\n        var opts;\n        if (typeof hook !== \"string\") {\n            opts = hook;\n            hook = opts.hook;\n        } else opts = {};\n        hook = hook.trim();\n        var _hook$split = hook.split(\":\"), _hook$split2 = (0, _slicedToArrayDefault.default)(_hook$split, 2), stage = _hook$split2[0], signature = _hook$split2[1];\n        var name = hook.replace(/\\(.+/, \"\");\n        result[stage][name] = Object.assign(opts, {\n            signature: signature\n        });\n    });\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"./constants\":\"P6X05\",\"./resolve-modules\":\"d1twO\",\"./platform-defines\":\"aTINd\",\"./inject-shader\":\"djPC6\",\"./transpile-shader\":\"cDEKu\",\"../utils\":\"1BJqA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"P6X05\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"VERTEX_SHADER\", ()=>VERTEX_SHADER);\nparcelHelpers.export(exports, \"FRAGMENT_SHADER\", ()=>FRAGMENT_SHADER);\nvar VERTEX_SHADER = \"vs\";\nvar FRAGMENT_SHADER = \"fs\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d1twO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"resolveModules\", ()=>resolveModules);\nparcelHelpers.export(exports, \"TEST_EXPORTS\", ()=>TEST_EXPORTS);\nvar _shaderModule = require(\"./shader-module\");\nvar _shaderModuleDefault = parcelHelpers.interopDefault(_shaderModule);\nvar _utils = require(\"../utils\");\nfunction resolveModules(modules) {\n    return getShaderDependencies(instantiateModules(modules));\n}\nfunction getShaderDependencies(modules) {\n    var moduleMap = {};\n    var moduleDepth = {};\n    getDependencyGraph({\n        modules: modules,\n        level: 0,\n        moduleMap: moduleMap,\n        moduleDepth: moduleDepth\n    });\n    return Object.keys(moduleDepth).sort(function(a, b) {\n        return moduleDepth[b] - moduleDepth[a];\n    }).map(function(name) {\n        return moduleMap[name];\n    });\n}\nfunction getDependencyGraph(_ref) {\n    var modules = _ref.modules, level = _ref.level, moduleMap = _ref.moduleMap, moduleDepth = _ref.moduleDepth;\n    if (level >= 5) throw new Error(\"Possible loop in shader dependency graph\");\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n    try {\n        for(var _iterator = modules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n            var module = _step.value;\n            moduleMap[module.name] = module;\n            if (moduleDepth[module.name] === undefined || moduleDepth[module.name] < level) moduleDepth[module.name] = level;\n        }\n    } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n        } finally{\n            if (_didIteratorError) throw _iteratorError;\n        }\n    }\n    var _iteratorNormalCompletion2 = true;\n    var _didIteratorError2 = false;\n    var _iteratorError2 = undefined;\n    try {\n        for(var _iterator2 = modules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n            var _module = _step2.value;\n            if (_module.dependencies) getDependencyGraph({\n                modules: _module.dependencies,\n                level: level + 1,\n                moduleMap: moduleMap,\n                moduleDepth: moduleDepth\n            });\n        }\n    } catch (err1) {\n        _didIteratorError2 = true;\n        _iteratorError2 = err1;\n    } finally{\n        try {\n            if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n        } finally{\n            if (_didIteratorError2) throw _iteratorError2;\n        }\n    }\n}\nfunction instantiateModules(modules, seen) {\n    return modules.map(function(module) {\n        if (module instanceof (0, _shaderModuleDefault.default)) return module;\n        (0, _utils.assert)(typeof module !== \"string\", \"Shader module use by name is deprecated. Import shader module '\".concat(module, \"' and use it directly.\"));\n        (0, _utils.assert)(module.name, \"shader module has no name\");\n        module = new (0, _shaderModuleDefault.default)(module);\n        module.dependencies = instantiateModules(module.dependencies);\n        return module;\n    });\n}\nvar TEST_EXPORTS = {\n    getShaderDependencies: getShaderDependencies,\n    getDependencyGraph: getDependencyGraph\n};\n\n},{\"./shader-module\":\"2V3PP\",\"../utils\":\"1BJqA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2V3PP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ShaderModule);\nparcelHelpers.export(exports, \"normalizeShaderModule\", ()=>normalizeShaderModule);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _utils = require(\"../utils\");\nvar _propTypes = require(\"./filters/prop-types\");\nvar VERTEX_SHADER = \"vs\";\nvar FRAGMENT_SHADER = \"fs\";\nvar ShaderModule = function() {\n    function ShaderModule1(_ref) {\n        var name = _ref.name, vs = _ref.vs, fs = _ref.fs, _ref$dependencies = _ref.dependencies, dependencies = _ref$dependencies === void 0 ? [] : _ref$dependencies, uniforms = _ref.uniforms, getUniforms = _ref.getUniforms, _ref$deprecations = _ref.deprecations, deprecations = _ref$deprecations === void 0 ? [] : _ref$deprecations, _ref$defines = _ref.defines, defines = _ref$defines === void 0 ? {} : _ref$defines, _ref$inject = _ref.inject, inject = _ref$inject === void 0 ? {} : _ref$inject, vertexShader = _ref.vertexShader, fragmentShader = _ref.fragmentShader;\n        (0, _classCallCheckDefault.default)(this, ShaderModule1);\n        (0, _utils.assert)(typeof name === \"string\");\n        this.name = name;\n        this.vs = vs || vertexShader;\n        this.fs = fs || fragmentShader;\n        this.getModuleUniforms = getUniforms;\n        this.dependencies = dependencies;\n        this.deprecations = this._parseDeprecationDefinitions(deprecations);\n        this.defines = defines;\n        this.injections = normalizeInjections(inject);\n        if (uniforms) this.uniforms = (0, _propTypes.parsePropTypes)(uniforms);\n    }\n    (0, _createClassDefault.default)(ShaderModule1, [\n        {\n            key: \"getModuleSource\",\n            value: function getModuleSource(type) {\n                var moduleSource;\n                switch(type){\n                    case VERTEX_SHADER:\n                        moduleSource = this.vs || \"\";\n                        break;\n                    case FRAGMENT_SHADER:\n                        moduleSource = this.fs || \"\";\n                        break;\n                    default:\n                        (0, _utils.assert)(false);\n                }\n                return \"#define MODULE_\".concat(this.name.toUpperCase().replace(/[^0-9a-z]/gi, \"_\"), \"\\n\").concat(moduleSource, \"// END MODULE_\").concat(this.name, \"\\n\\n\");\n            }\n        },\n        {\n            key: \"getUniforms\",\n            value: function getUniforms(opts, uniforms) {\n                if (this.getModuleUniforms) return this.getModuleUniforms(opts, uniforms);\n                if (this.uniforms) return this._defaultGetUniforms(opts);\n                return {};\n            }\n        },\n        {\n            key: \"getDefines\",\n            value: function getDefines() {\n                return this.defines;\n            }\n        },\n        {\n            key: \"checkDeprecations\",\n            value: function checkDeprecations(shaderSource, log) {\n                this.deprecations.forEach(function(def) {\n                    if (def.regex.test(shaderSource)) {\n                        if (def.deprecated) log.deprecated(def.old, def[\"new\"])();\n                        else log.removed(def.old, def[\"new\"])();\n                    }\n                });\n            }\n        },\n        {\n            key: \"_parseDeprecationDefinitions\",\n            value: function _parseDeprecationDefinitions(deprecations) {\n                deprecations.forEach(function(def) {\n                    switch(def.type){\n                        case \"function\":\n                            def.regex = new RegExp(\"\\\\b\".concat(def.old, \"\\\\(\"));\n                            break;\n                        default:\n                            def.regex = new RegExp(\"\".concat(def.type, \" \").concat(def.old, \";\"));\n                    }\n                });\n                return deprecations;\n            }\n        },\n        {\n            key: \"_defaultGetUniforms\",\n            value: function _defaultGetUniforms() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var uniforms = {};\n                var propTypes = this.uniforms;\n                for(var key in propTypes){\n                    var propDef = propTypes[key];\n                    if (key in opts && !propDef[\"private\"]) {\n                        if (propDef.validate) (0, _utils.assert)(propDef.validate(opts[key], propDef), \"\".concat(this.name, \": invalid \").concat(key));\n                        uniforms[key] = opts[key];\n                    } else uniforms[key] = propDef.value;\n                }\n                return uniforms;\n            }\n        }\n    ]);\n    return ShaderModule1;\n}();\nfunction normalizeShaderModule(module) {\n    if (!module.normalized) {\n        module.normalized = true;\n        if (module.uniforms && !module.getUniforms) {\n            var shaderModule = new ShaderModule(module);\n            module.getUniforms = shaderModule.getUniforms.bind(shaderModule);\n        }\n    }\n    return module;\n}\nfunction normalizeInjections(injections) {\n    var result = {\n        vs: {},\n        fs: {}\n    };\n    for(var hook in injections){\n        var injection = injections[hook];\n        var stage = hook.slice(0, 2);\n        if (typeof injection === \"string\") injection = {\n            injection: injection\n        };\n        result[stage][hook] = injection;\n    }\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../utils\":\"1BJqA\",\"./filters/prop-types\":\"kAG0o\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1BJqA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\n\n},{\"./assert\":\"kFraG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kFraG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"shadertools: assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kAG0o\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parsePropTypes\", ()=>parsePropTypes);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar TYPE_DEFINITIONS = {\n    number: {\n        validate: function validate(value, propType) {\n            return Number.isFinite(value) && (!(\"max\" in propType) || value <= propType.max) && (!(\"min\" in propType) || value >= propType.min);\n        }\n    },\n    array: {\n        validate: function validate(value, propType) {\n            return Array.isArray(value) || ArrayBuffer.isView(value);\n        }\n    }\n};\nfunction parsePropTypes(propDefs) {\n    var propTypes = {};\n    for(var propName in propDefs){\n        var propDef = propDefs[propName];\n        var propType = parsePropType(propDef);\n        propTypes[propName] = propType;\n    }\n    return propTypes;\n}\nfunction parsePropType(propDef) {\n    var type = getTypeOf(propDef);\n    if (type === \"object\") {\n        if (!propDef) return {\n            type: \"object\",\n            value: null\n        };\n        if (\"type\" in propDef) return Object.assign({}, propDef, TYPE_DEFINITIONS[propDef.type]);\n        if (!(\"value\" in propDef)) return {\n            type: \"object\",\n            value: propDef\n        };\n        type = getTypeOf(propDef.value);\n        return Object.assign({\n            type: type\n        }, propDef, TYPE_DEFINITIONS[type]);\n    }\n    return Object.assign({\n        type: type,\n        value: propDef\n    }, TYPE_DEFINITIONS[type]);\n}\nfunction getTypeOf(value) {\n    if (Array.isArray(value) || ArrayBuffer.isView(value)) return \"array\";\n    return (0, _typeofDefault.default)(value);\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aTINd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getPlatformShaderDefines\", ()=>getPlatformShaderDefines);\nparcelHelpers.export(exports, \"getVersionDefines\", ()=>getVersionDefines);\nvar _webglInfo = require(\"../utils/webgl-info\");\nfunction getPlatformShaderDefines(gl) {\n    var debugInfo = (0, _webglInfo.getContextInfo)(gl);\n    switch(debugInfo.gpuVendor.toLowerCase()){\n        case \"nvidia\":\n            return \"#define NVIDIA_GPU\\n// Nvidia optimizes away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n\";\n        case \"intel\":\n            return \"#define INTEL_GPU\\n// Intel optimizes away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n// Intel's built-in 'tan' function doesn't have acceptable precision\\n#define LUMA_FP32_TAN_PRECISION_WORKAROUND 1\\n// Intel GPU doesn't have full 32 bits precision in same cases, causes overflow\\n#define LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND 1\\n\";\n        case \"amd\":\n            return \"#define AMD_GPU\\n\";\n        default:\n            return \"#define DEFAULT_GPU\\n// Prevent driver from optimizing away the calculation necessary for emulated fp64\\n#define LUMA_FP64_CODE_ELIMINATION_WORKAROUND 1\\n// Intel's built-in 'tan' function doesn't have acceptable precision\\n#define LUMA_FP32_TAN_PRECISION_WORKAROUND 1\\n// Intel GPU doesn't have full 32 bits precision in same cases, causes overflow\\n#define LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND 1\\n\";\n    }\n}\nfunction getVersionDefines(gl, glslVersion, isFragment) {\n    var versionDefines = \"#if (__VERSION__ > 120)\\n\\n# define FRAG_DEPTH\\n# define DERIVATIVES\\n# define DRAW_BUFFERS\\n# define TEXTURE_LOD\\n\\n#endif // __VERSION\\n\";\n    if ((0, _webglInfo.hasFeatures)(gl, (0, _webglInfo.FEATURES).GLSL_FRAG_DEPTH)) versionDefines += \"// FRAG_DEPTH => gl_FragDepth is available\\n#ifdef GL_EXT_frag_depth\\n#extension GL_EXT_frag_depth : enable\\n# define FRAG_DEPTH\\n# define gl_FragDepth gl_FragDepthEXT\\n#endif\\n\";\n    if ((0, _webglInfo.hasFeatures)(gl, (0, _webglInfo.FEATURES).GLSL_DERIVATIVES) && (0, _webglInfo.canCompileGLGSExtension)(gl, (0, _webglInfo.FEATURES).GLSL_DERIVATIVES)) versionDefines += \"// DERIVATIVES => dxdF, dxdY and fwidth are available\\n#ifdef GL_OES_standard_derivatives\\n#extension GL_OES_standard_derivatives : enable\\n# define DERIVATIVES\\n#endif\\n\";\n    if ((0, _webglInfo.hasFeatures)(gl, (0, _webglInfo.FEATURES).GLSL_FRAG_DATA) && (0, _webglInfo.canCompileGLGSExtension)(gl, (0, _webglInfo.FEATURES).GLSL_FRAG_DATA, {\n        behavior: \"require\"\n    })) versionDefines += \"// DRAW_BUFFERS => gl_FragData[] is available\\n#ifdef GL_EXT_draw_buffers\\n#extension GL_EXT_draw_buffers : require\\n#define DRAW_BUFFERS\\n#endif\\n\";\n    if ((0, _webglInfo.hasFeatures)(gl, (0, _webglInfo.FEATURES).GLSL_TEXTURE_LOD)) versionDefines += \"// TEXTURE_LOD => texture2DLod etc are available\\n#ifdef GL_EXT_shader_texture_lod\\n#extension GL_EXT_shader_texture_lod : enable\\n# define TEXTURE_LOD\\n#define texture2DLod texture2DLodEXT\\n#define texture2DProjLod texture2DProjLodEXT\\n#define texture2DProjLod texture2DProjLodEXT\\n#define textureCubeLod textureCubeLodEXT\\n#define texture2DGrad texture2DGradEXT\\n#define texture2DProjGrad texture2DProjGradEXT\\n#define texture2DProjGrad texture2DProjGradEXT\\n#define textureCubeGrad textureCubeGradEXT\\n#endif\\n\";\n    return versionDefines;\n}\n\n},{\"../utils/webgl-info\":\"f57jP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f57jP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FEATURES\", ()=>FEATURES);\nparcelHelpers.export(exports, \"getContextInfo\", ()=>getContextInfo);\nparcelHelpers.export(exports, \"canCompileGLGSExtension\", ()=>canCompileGLGSExtension);\nparcelHelpers.export(exports, \"hasFeatures\", ()=>hasFeatures);\nvar _isOldIe = require(\"./is-old-ie\");\nvar _isOldIeDefault = parcelHelpers.interopDefault(_isOldIe);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar GL_VENDOR = 0x1f00;\nvar GL_RENDERER = 0x1f01;\nvar GL_VERSION = 0x1f02;\nvar GL_SHADING_LANGUAGE_VERSION = 0x8b8c;\nvar WEBGL_FEATURES = {\n    GLSL_FRAG_DATA: [\n        \"WEBGL_draw_buffers\",\n        true\n    ],\n    GLSL_FRAG_DEPTH: [\n        \"EXT_frag_depth\",\n        true\n    ],\n    GLSL_DERIVATIVES: [\n        \"OES_standard_derivatives\",\n        true\n    ],\n    GLSL_TEXTURE_LOD: [\n        \"EXT_shader_texture_lod\",\n        true\n    ]\n};\nvar FEATURES = {};\nObject.keys(WEBGL_FEATURES).forEach(function(key) {\n    FEATURES[key] = key;\n});\nfunction isWebGL2(gl) {\n    return Boolean(gl && gl._version === 2);\n}\nfunction getContextInfo(gl) {\n    var info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n    var vendor = gl.getParameter(info && info.UNMASKED_VENDOR_WEBGL || GL_VENDOR);\n    var renderer = gl.getParameter(info && info.UNMASKED_RENDERER_WEBGL || GL_RENDERER);\n    var gpuVendor = identifyGPUVendor(vendor, renderer);\n    var gpuInfo = {\n        gpuVendor: gpuVendor,\n        vendor: vendor,\n        renderer: renderer,\n        version: gl.getParameter(GL_VERSION),\n        shadingLanguageVersion: gl.getParameter(GL_SHADING_LANGUAGE_VERSION)\n    };\n    return gpuInfo;\n}\nfunction identifyGPUVendor(vendor, renderer) {\n    if (vendor.match(/NVIDIA/i) || renderer.match(/NVIDIA/i)) return \"NVIDIA\";\n    if (vendor.match(/INTEL/i) || renderer.match(/INTEL/i)) return \"INTEL\";\n    if (vendor.match(/AMD/i) || renderer.match(/AMD/i) || vendor.match(/ATI/i) || renderer.match(/ATI/i)) return \"AMD\";\n    return \"UNKNOWN GPU\";\n}\nvar compiledGlslExtensions = {};\nfunction canCompileGLGSExtension(gl, cap) {\n    var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var feature = WEBGL_FEATURES[cap];\n    (0, _assertDefault.default)(feature, cap);\n    if (!(0, _isOldIeDefault.default)(opts)) return true;\n    if (cap in compiledGlslExtensions) return compiledGlslExtensions[cap];\n    var extensionName = feature[0];\n    var behavior = opts.behavior || \"enable\";\n    var source = \"#extension GL_\".concat(extensionName, \" : \").concat(behavior, \"\\nvoid main(void) {}\");\n    var shader = gl.createShader(35633);\n    gl.shaderSource(shader, source);\n    gl.compileShader(shader);\n    var canCompile = gl.getShaderParameter(shader, 35713);\n    gl.deleteShader(shader);\n    compiledGlslExtensions[cap] = canCompile;\n    return canCompile;\n}\nfunction getFeature(gl, cap) {\n    var feature = WEBGL_FEATURES[cap];\n    (0, _assertDefault.default)(feature, cap);\n    var extensionName = isWebGL2(gl) ? feature[1] || feature[0] : feature[0];\n    var value = typeof extensionName === \"string\" ? Boolean(gl.getExtension(extensionName)) : extensionName;\n    (0, _assertDefault.default)(value === false || value === true);\n    return value;\n}\nfunction hasFeatures(gl, features) {\n    features = Array.isArray(features) ? features : [\n        features\n    ];\n    return features.every(function(feature) {\n        return getFeature(gl, feature);\n    });\n}\n\n},{\"./is-old-ie\":\"2CFcf\",\"./assert\":\"kFraG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2CFcf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction isOldIE() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var navigator = typeof window !== \"undefined\" ? window.navigator || {} : {};\n    var userAgent = opts.userAgent || navigator.userAgent || \"\";\n    var isMSIE = userAgent.indexOf(\"MSIE \") !== -1;\n    var isTrident = userAgent.indexOf(\"Trident/\") !== -1;\n    return isMSIE || isTrident;\n}\nexports.default = isOldIE;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"djPC6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DECLARATION_INJECT_MARKER\", ()=>DECLARATION_INJECT_MARKER);\nparcelHelpers.export(exports, \"combineInjects\", ()=>combineInjects);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _moduleInjectors = require(\"../modules/module-injectors\");\nvar _constants = require(\"./constants\");\nvar _utils = require(\"../utils\");\nvar _MODULE_INJECTORS;\nvar MODULE_INJECTORS = (_MODULE_INJECTORS = {}, (0, _definePropertyDefault.default)(_MODULE_INJECTORS, (0, _constants.VERTEX_SHADER), (0, _moduleInjectors.MODULE_INJECTORS_VS)), (0, _definePropertyDefault.default)(_MODULE_INJECTORS, (0, _constants.FRAGMENT_SHADER), (0, _moduleInjectors.MODULE_INJECTORS_FS)), _MODULE_INJECTORS);\nvar DECLARATION_INJECT_MARKER = \"__LUMA_INJECT_DECLARATIONS__\";\nvar REGEX_START_OF_MAIN = /void\\s+main\\s*\\([^)]*\\)\\s*\\{\\n?/;\nvar REGEX_END_OF_MAIN = /}\\n?[^{}]*$/;\nvar fragments = [];\nfunction injectShader(source, type, inject, injectStandardStubs) {\n    var isVertex = type === (0, _constants.VERTEX_SHADER);\n    var _loop = function _loop(key) {\n        var fragmentData = inject[key];\n        fragmentData.sort(function(a, b) {\n            return a.order - b.order;\n        });\n        fragments.length = fragmentData.length;\n        for(var i = 0, len = fragmentData.length; i < len; ++i)fragments[i] = fragmentData[i].injection;\n        var fragmentString = \"\".concat(fragments.join(\"\\n\"), \"\\n\");\n        switch(key){\n            case \"vs:#decl\":\n                if (isVertex) source = source.replace(DECLARATION_INJECT_MARKER, fragmentString);\n                break;\n            case \"vs:#main-start\":\n                if (isVertex) source = source.replace(REGEX_START_OF_MAIN, function(match) {\n                    return match + fragmentString;\n                });\n                break;\n            case \"vs:#main-end\":\n                if (isVertex) source = source.replace(REGEX_END_OF_MAIN, function(match) {\n                    return fragmentString + match;\n                });\n                break;\n            case \"fs:#decl\":\n                if (!isVertex) source = source.replace(DECLARATION_INJECT_MARKER, fragmentString);\n                break;\n            case \"fs:#main-start\":\n                if (!isVertex) source = source.replace(REGEX_START_OF_MAIN, function(match) {\n                    return match + fragmentString;\n                });\n                break;\n            case \"fs:#main-end\":\n                if (!isVertex) source = source.replace(REGEX_END_OF_MAIN, function(match) {\n                    return fragmentString + match;\n                });\n                break;\n            default:\n                source = source.replace(key, function(match) {\n                    return match + fragmentString;\n                });\n        }\n    };\n    for(var key1 in inject)_loop(key1);\n    source = source.replace(DECLARATION_INJECT_MARKER, \"\");\n    if (injectStandardStubs) source = source.replace(/\\}\\s*$/, function(match) {\n        return match + MODULE_INJECTORS[type];\n    });\n    return source;\n}\nexports.default = injectShader;\nfunction combineInjects(injects) {\n    var result = {};\n    (0, _utils.assert)(Array.isArray(injects) && injects.length > 1);\n    injects.forEach(function(inject) {\n        for(var key in inject)result[key] = result[key] ? \"\".concat(result[key], \"\\n\").concat(inject[key]) : inject[key];\n    });\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"../modules/module-injectors\":\"gU2QT\",\"./constants\":\"P6X05\",\"../utils\":\"1BJqA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gU2QT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"MODULE_INJECTORS_VS\", ()=>MODULE_INJECTORS_VS);\nparcelHelpers.export(exports, \"MODULE_INJECTORS_FS\", ()=>MODULE_INJECTORS_FS);\nvar MODULE_INJECTORS_VS = \"#ifdef MODULE_LOGDEPTH\\n  logdepth_adjustPosition(gl_Position);\\n#endif\\n\";\nvar MODULE_INJECTORS_FS = \"#ifdef MODULE_MATERIAL\\n  gl_FragColor = material_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_LIGHTING\\n  gl_FragColor = lighting_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_FOG\\n  gl_FragColor = fog_filterColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_PICKING\\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\\n#endif\\n\\n#ifdef MODULE_LOGDEPTH\\n  logdepth_setFragDepth();\\n#endif\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cDEKu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction transpileShader(source, targetGLSLVersion, isVertex) {\n    switch(targetGLSLVersion){\n        case 300:\n            return isVertex ? convertVertexShaderTo300(source) : convertFragmentShaderTo300(source);\n        case 100:\n            return isVertex ? convertVertexShaderTo100(source) : convertFragmentShaderTo100(source);\n        default:\n            throw new Error(\"unknown GLSL version \".concat(targetGLSLVersion));\n    }\n}\nexports.default = transpileShader;\nvar FS_OUTPUT_REGEX = /^[ \\t]*out[ \\t]+vec4[ \\t]+(\\w+)[ \\t]*;\\s+/m;\nfunction convertVertexShaderTo300(source) {\n    return source.replace(/^(#version[ \\t]+(100|300[ \\t]+es))?[ \\t]*\\n/, \"#version 300 es\\n\").replace(/^[ \\t]*attribute[ \\t]+(.+;)/gm, \"in $1\").replace(/^[ \\t]*varying[ \\t]+(.+;)/gm, \"out $1\").replace(/\\btexture2D\\(/g, \"texture(\").replace(/\\btextureCube\\(+/g, \"texture(\").replace(/\\btexture2DLodEXT\\(/g, \"textureLod(\").replace(/\\btextureCubeLodEXT\\(/g, \"textureLod(\");\n}\nfunction convertFragmentShaderTo300(source) {\n    return source.replace(/^(#version[ \\t]+(100|300[ \\t]+es))?[ \\t]*\\n/, \"#version 300 es\\n\").replace(/^[ \\t]*varying[ \\t]+(.+;)/gm, \"in $1\").replace(/\\btexture2D\\(/g, \"texture(\").replace(/\\btextureCube\\(/g, \"texture(\").replace(/\\btexture2DLodEXT\\(/g, \"textureLod(\").replace(/\\btextureCubeLodEXT\\(/g, \"textureLod(\");\n}\nfunction convertVertexShaderTo100(source) {\n    return source.replace(/^#version[ \\t]+300[ \\t]+es/, \"#version 100\").replace(/^[ \\t]*in[ \\t]+(.+;)/gm, \"attribute $1\").replace(/^[ \\t]*out[ \\t]+(.+;)/gm, \"varying $1\").replace(/\\btexture\\(/g, \"texture2D(\").replace(/\\btextureLod\\(/g, \"texture2DLodEXT(\");\n}\nfunction convertFragmentShaderTo100(source) {\n    source = source.replace(/^#version[ \\t]+300[ \\t]+es/, \"#version 100\").replace(/^[ \\t]*in[ \\t]+/gm, \"varying \").replace(/\\btexture\\(/g, \"texture2D(\").replace(/\\btextureLod\\(/g, \"texture2DLodEXT(\");\n    var outputMatch = source.match(FS_OUTPUT_REGEX);\n    if (outputMatch) {\n        var outputName = outputMatch[1];\n        source = source.replace(FS_OUTPUT_REGEX, \"\").replace(new RegExp(\"\\\\b\".concat(outputName, \"\\\\b\"), \"g\"), \"gl_FragColor\");\n    }\n    return source;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Wd4c\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getQualifierDetails\", ()=>getQualifierDetails);\nparcelHelpers.export(exports, \"getPassthroughFS\", ()=>getPassthroughFS);\nparcelHelpers.export(exports, \"typeToChannelSuffix\", ()=>typeToChannelSuffix);\nparcelHelpers.export(exports, \"typeToChannelCount\", ()=>typeToChannelCount);\nparcelHelpers.export(exports, \"convertToVec4\", ()=>convertToVec4);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _utils = require(\"../utils\");\nvar FS100 = \"void main() {gl_FragColor = vec4(0);}\";\nvar FS_GLES = \"out vec4 transform_output;\\nvoid main() {\\n  transform_output = vec4(0);\\n}\";\nvar FS300 = \"#version 300 es\\n\".concat(FS_GLES);\nfunction getQualifierDetails(line, qualifiers) {\n    qualifiers = Array.isArray(qualifiers) ? qualifiers : [\n        qualifiers\n    ];\n    var words = line.replace(/^\\s+/, \"\").split(/\\s+/);\n    var _words = (0, _slicedToArrayDefault.default)(words, 3), qualifier = _words[0], type = _words[1], definition = _words[2];\n    if (!qualifiers.includes(qualifier) || !type || !definition) return null;\n    var name = definition.split(\";\")[0];\n    return {\n        qualifier: qualifier,\n        type: type,\n        name: name\n    };\n}\nfunction getPassthroughFS() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$version = _ref.version, version = _ref$version === void 0 ? 100 : _ref$version, input = _ref.input, inputType = _ref.inputType, output = _ref.output;\n    if (!input) {\n        if (version === 300) return FS300;\n        else if (version > 300) return \"#version \".concat(version, \"\\n\").concat(FS_GLES);\n        return FS100;\n    }\n    var outputValue = convertToVec4(input, inputType);\n    if (version >= 300) return \"#version \".concat(version, \" \").concat(version === 300 ? \"es\" : \"\", \"\\nin \").concat(inputType, \" \").concat(input, \";\\nout vec4 \").concat(output, \";\\nvoid main() {\\n  \").concat(output, \" = \").concat(outputValue, \";\\n}\");\n    return \"varying \".concat(inputType, \" \").concat(input, \";\\nvoid main() {\\n  gl_FragColor = \").concat(outputValue, \";\\n}\");\n}\nfunction typeToChannelSuffix(type) {\n    switch(type){\n        case \"float\":\n            return \"x\";\n        case \"vec2\":\n            return \"xy\";\n        case \"vec3\":\n            return \"xyz\";\n        case \"vec4\":\n            return \"xyzw\";\n        default:\n            (0, _utils.assert)(false);\n            return null;\n    }\n}\nfunction typeToChannelCount(type) {\n    switch(type){\n        case \"float\":\n            return 1;\n        case \"vec2\":\n            return 2;\n        case \"vec3\":\n            return 3;\n        case \"vec4\":\n            return 4;\n        default:\n            (0, _utils.assert)(false);\n            return null;\n    }\n}\nfunction convertToVec4(variable, type) {\n    switch(type){\n        case \"float\":\n            return \"vec4(\".concat(variable, \", 0.0, 0.0, 1.0)\");\n        case \"vec2\":\n            return \"vec4(\".concat(variable, \", 0.0, 1.0)\");\n        case \"vec3\":\n            return \"vec4(\".concat(variable, \", 1.0)\");\n        case \"vec4\":\n            return variable;\n        default:\n            (0, _utils.assert)(false);\n            return null;\n    }\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"../utils\":\"1BJqA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lW0Pc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fp32\", ()=>(0, _fp32Default.default));\nparcelHelpers.export(exports, \"fp64\", ()=>(0, _fp64Default.default));\nparcelHelpers.export(exports, \"fp64arithmetic\", ()=>(0, _fp64.fp64arithmetic));\nparcelHelpers.export(exports, \"project\", ()=>(0, _projectDefault.default));\nparcelHelpers.export(exports, \"lights\", ()=>(0, _lightsDefault.default));\nparcelHelpers.export(exports, \"dirlight\", ()=>(0, _dirlightDefault.default));\nparcelHelpers.export(exports, \"picking\", ()=>(0, _pickingDefault.default));\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>(0, _phongLighting.gouraudLighting));\nparcelHelpers.export(exports, \"phongLighting\", ()=>(0, _phongLighting.phongLighting));\nparcelHelpers.export(exports, \"pbr\", ()=>(0, _pbrDefault.default));\nparcelHelpers.export(exports, \"brightnessContrast\", ()=>(0, _brightnesscontrastDefault.default));\nparcelHelpers.export(exports, \"denoise\", ()=>(0, _denoiseDefault.default));\nparcelHelpers.export(exports, \"hueSaturation\", ()=>(0, _huesaturationDefault.default));\nparcelHelpers.export(exports, \"noise\", ()=>(0, _noiseDefault.default));\nparcelHelpers.export(exports, \"sepia\", ()=>(0, _sepiaDefault.default));\nparcelHelpers.export(exports, \"vibrance\", ()=>(0, _vibranceDefault.default));\nparcelHelpers.export(exports, \"vignette\", ()=>(0, _vignetteDefault.default));\nparcelHelpers.export(exports, \"tiltShift\", ()=>(0, _tiltshiftDefault.default));\nparcelHelpers.export(exports, \"triangleBlur\", ()=>(0, _triangleblurDefault.default));\nparcelHelpers.export(exports, \"zoomBlur\", ()=>(0, _zoomblurDefault.default));\nparcelHelpers.export(exports, \"colorHalftone\", ()=>(0, _colorhalftoneDefault.default));\nparcelHelpers.export(exports, \"dotScreen\", ()=>(0, _dotscreenDefault.default));\nparcelHelpers.export(exports, \"edgeWork\", ()=>(0, _edgeworkDefault.default));\nparcelHelpers.export(exports, \"hexagonalPixelate\", ()=>(0, _hexagonalpixelateDefault.default));\nparcelHelpers.export(exports, \"ink\", ()=>(0, _inkDefault.default));\nparcelHelpers.export(exports, \"bulgePinch\", ()=>(0, _bulgepinchDefault.default));\nparcelHelpers.export(exports, \"swirl\", ()=>(0, _swirlDefault.default));\nparcelHelpers.export(exports, \"fxaa\", ()=>(0, _fxaaDefault.default));\nparcelHelpers.export(exports, \"_transform\", ()=>(0, _transformDefault.default));\nvar _fp32 = require(\"./fp32/fp32\");\nvar _fp32Default = parcelHelpers.interopDefault(_fp32);\nvar _fp64 = require(\"./fp64/fp64\");\nvar _fp64Default = parcelHelpers.interopDefault(_fp64);\nvar _project = require(\"./project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar _lights = require(\"./lights/lights\");\nvar _lightsDefault = parcelHelpers.interopDefault(_lights);\nvar _dirlight = require(\"./dirlight/dirlight\");\nvar _dirlightDefault = parcelHelpers.interopDefault(_dirlight);\nvar _picking = require(\"./picking/picking\");\nvar _pickingDefault = parcelHelpers.interopDefault(_picking);\nvar _phongLighting = require(\"./phong-lighting/phong-lighting\");\nvar _pbr = require(\"./pbr/pbr\");\nvar _pbrDefault = parcelHelpers.interopDefault(_pbr);\nvar _brightnesscontrast = require(\"./adjust-filters/brightnesscontrast\");\nvar _brightnesscontrastDefault = parcelHelpers.interopDefault(_brightnesscontrast);\nvar _denoise = require(\"./adjust-filters/denoise\");\nvar _denoiseDefault = parcelHelpers.interopDefault(_denoise);\nvar _huesaturation = require(\"./adjust-filters/huesaturation\");\nvar _huesaturationDefault = parcelHelpers.interopDefault(_huesaturation);\nvar _noise = require(\"./adjust-filters/noise\");\nvar _noiseDefault = parcelHelpers.interopDefault(_noise);\nvar _sepia = require(\"./adjust-filters/sepia\");\nvar _sepiaDefault = parcelHelpers.interopDefault(_sepia);\nvar _vibrance = require(\"./adjust-filters/vibrance\");\nvar _vibranceDefault = parcelHelpers.interopDefault(_vibrance);\nvar _vignette = require(\"./adjust-filters/vignette\");\nvar _vignetteDefault = parcelHelpers.interopDefault(_vignette);\nvar _tiltshift = require(\"./blur-filters/tiltshift\");\nvar _tiltshiftDefault = parcelHelpers.interopDefault(_tiltshift);\nvar _triangleblur = require(\"./blur-filters/triangleblur\");\nvar _triangleblurDefault = parcelHelpers.interopDefault(_triangleblur);\nvar _zoomblur = require(\"./blur-filters/zoomblur\");\nvar _zoomblurDefault = parcelHelpers.interopDefault(_zoomblur);\nvar _colorhalftone = require(\"./fun-filters/colorhalftone\");\nvar _colorhalftoneDefault = parcelHelpers.interopDefault(_colorhalftone);\nvar _dotscreen = require(\"./fun-filters/dotscreen\");\nvar _dotscreenDefault = parcelHelpers.interopDefault(_dotscreen);\nvar _edgework = require(\"./fun-filters/edgework\");\nvar _edgeworkDefault = parcelHelpers.interopDefault(_edgework);\nvar _hexagonalpixelate = require(\"./fun-filters/hexagonalpixelate\");\nvar _hexagonalpixelateDefault = parcelHelpers.interopDefault(_hexagonalpixelate);\nvar _ink = require(\"./fun-filters/ink\");\nvar _inkDefault = parcelHelpers.interopDefault(_ink);\nvar _bulgepinch = require(\"./warp-filters/bulgepinch\");\nvar _bulgepinchDefault = parcelHelpers.interopDefault(_bulgepinch);\nvar _swirl = require(\"./warp-filters/swirl\");\nvar _swirlDefault = parcelHelpers.interopDefault(_swirl);\nvar _fxaa = require(\"./fxaa/fxaa\");\nvar _fxaaDefault = parcelHelpers.interopDefault(_fxaa);\nvar _transform = require(\"./transform/transform\");\nvar _transformDefault = parcelHelpers.interopDefault(_transform);\n\n},{\"./fp32/fp32\":\"lfWnQ\",\"./fp64/fp64\":\"jF0wj\",\"./project/project\":\"cZp55\",\"./lights/lights\":\"cTDxr\",\"./dirlight/dirlight\":\"gDQIZ\",\"./picking/picking\":\"2T1yx\",\"./phong-lighting/phong-lighting\":\"kNtaI\",\"./pbr/pbr\":\"5zqOp\",\"./adjust-filters/brightnesscontrast\":\"lSv9q\",\"./adjust-filters/denoise\":\"eqY1x\",\"./adjust-filters/huesaturation\":\"8WZug\",\"./adjust-filters/noise\":\"lESRJ\",\"./adjust-filters/sepia\":\"f44v6\",\"./adjust-filters/vibrance\":\"lEVz2\",\"./adjust-filters/vignette\":\"4CaGz\",\"./blur-filters/tiltshift\":\"KfZur\",\"./blur-filters/triangleblur\":\"aOod8\",\"./blur-filters/zoomblur\":\"0vP3r\",\"./fun-filters/colorhalftone\":\"6oIsO\",\"./fun-filters/dotscreen\":\"ho4mG\",\"./fun-filters/edgework\":\"bxMS7\",\"./fun-filters/hexagonalpixelate\":\"8NBWq\",\"./fun-filters/ink\":\"3i3El\",\"./warp-filters/bulgepinch\":\"9PAL9\",\"./warp-filters/swirl\":\"45UY0\",\"./fxaa/fxaa\":\"4ANRj\",\"./transform/transform\":\"krcqY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lfWnQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fp32shader = \"#ifdef LUMA_FP32_TAN_PRECISION_WORKAROUND\\nconst float TWO_PI = 6.2831854820251465;\\nconst float PI_2 = 1.5707963705062866;\\nconst float PI_16 = 0.1963495463132858;\\n\\nconst float SIN_TABLE_0 = 0.19509032368659973;\\nconst float SIN_TABLE_1 = 0.3826834261417389;\\nconst float SIN_TABLE_2 = 0.5555702447891235;\\nconst float SIN_TABLE_3 = 0.7071067690849304;\\n\\nconst float COS_TABLE_0 = 0.9807852506637573;\\nconst float COS_TABLE_1 = 0.9238795042037964;\\nconst float COS_TABLE_2 = 0.8314695954322815;\\nconst float COS_TABLE_3 = 0.7071067690849304;\\n\\nconst float INVERSE_FACTORIAL_3 = 1.666666716337204e-01;\\nconst float INVERSE_FACTORIAL_5 = 8.333333767950535e-03;\\nconst float INVERSE_FACTORIAL_7 = 1.9841270113829523e-04;\\nconst float INVERSE_FACTORIAL_9 = 2.75573188446287533e-06;\\n\\nfloat sin_taylor_fp32(float a) {\\n  float r, s, t, x;\\n\\n  if (a == 0.0) {\\n    return 0.0;\\n  }\\n\\n  x = -a * a;\\n  s = a;\\n  r = a;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_3;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_5;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_7;\\n  s = s + t;\\n\\n  r = r * x;\\n  t = r * INVERSE_FACTORIAL_9;\\n  s = s + t;\\n\\n  return s;\\n}\\n\\nvoid sincos_taylor_fp32(float a, out float sin_t, out float cos_t) {\\n  if (a == 0.0) {\\n    sin_t = 0.0;\\n    cos_t = 1.0;\\n  }\\n  sin_t = sin_taylor_fp32(a);\\n  cos_t = sqrt(1.0 - sin_t * sin_t);\\n}\\n\\nfloat tan_taylor_fp32(float a) {\\n    float sin_a;\\n    float cos_a;\\n\\n    if (a == 0.0) {\\n        return 0.0;\\n    }\\n    float z = floor(a / TWO_PI);\\n    float r = a - TWO_PI * z;\\n\\n    float t;\\n    float q = floor(r / PI_2 + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return 0.0 / 0.0;\\n    }\\n\\n    t = r - PI_2 * q;\\n\\n    q = floor(t / PI_16 + 0.5);\\n    int k = int(q);\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return 0.0 / 0.0;\\n    } else {\\n        t = t - PI_16 * q;\\n    }\\n\\n    float u = 0.0;\\n    float v = 0.0;\\n\\n    float sin_t, cos_t;\\n    float s, c;\\n    sincos_taylor_fp32(t, sin_t, cos_t);\\n\\n    if (k == 0) {\\n        s = sin_t;\\n        c = cos_t;\\n    } else {\\n        if (abs(float(abs_k) - 1.0) < 0.5) {\\n            u = COS_TABLE_0;\\n            v = SIN_TABLE_0;\\n        } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n            u = COS_TABLE_1;\\n            v = SIN_TABLE_1;\\n        } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n            u = COS_TABLE_2;\\n            v = SIN_TABLE_2;\\n        } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n            u = COS_TABLE_3;\\n            v = SIN_TABLE_3;\\n        }\\n        if (k > 0) {\\n            s = u * sin_t + v * cos_t;\\n            c = u * cos_t - v * sin_t;\\n        } else {\\n            s = u * sin_t - v * cos_t;\\n            c = u * cos_t + v * sin_t;\\n        }\\n    }\\n\\n    if (j == 0) {\\n        sin_a = s;\\n        cos_a = c;\\n    } else if (j == 1) {\\n        sin_a = c;\\n        cos_a = -s;\\n    } else if (j == -1) {\\n        sin_a = -c;\\n        cos_a = s;\\n    } else {\\n        sin_a = -s;\\n        cos_a = -c;\\n    }\\n    return sin_a / cos_a;\\n}\\n#endif\\n\\nfloat tan_fp32(float a) {\\n#ifdef LUMA_FP32_TAN_PRECISION_WORKAROUND\\n  return tan_taylor_fp32(a);\\n#else\\n  return tan(a);\\n#endif\\n}\\n\";\nexports.default = {\n    name: \"fp32\",\n    vs: fp32shader,\n    fs: null\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jF0wj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fp64ify\", ()=>(0, _fp64Utils.fp64ify));\nparcelHelpers.export(exports, \"fp64LowPart\", ()=>(0, _fp64Utils.fp64LowPart));\nparcelHelpers.export(exports, \"fp64ifyMatrix4\", ()=>(0, _fp64Utils.fp64ifyMatrix4));\nparcelHelpers.export(exports, \"fp64arithmetic\", ()=>fp64arithmetic);\nvar _fp64Utils = require(\"./fp64-utils\");\nvar _fp64ArithmeticGlsl = require(\"./fp64-arithmetic.glsl\");\nvar _fp64ArithmeticGlslDefault = parcelHelpers.interopDefault(_fp64ArithmeticGlsl);\nvar _fp64FunctionsGlsl = require(\"./fp64-functions.glsl\");\nvar _fp64FunctionsGlslDefault = parcelHelpers.interopDefault(_fp64FunctionsGlsl);\nvar CONST_UNIFORMS = {\n    ONE: 1.0\n};\nfunction getUniforms() {\n    return CONST_UNIFORMS;\n}\nvar fp64arithmetic = {\n    name: \"fp64-arithmetic\",\n    vs: (0, _fp64ArithmeticGlslDefault.default),\n    fs: null,\n    getUniforms: getUniforms,\n    fp64ify: (0, _fp64Utils.fp64ify),\n    fp64LowPart: (0, _fp64Utils.fp64LowPart)\n};\nexports.default = {\n    name: \"fp64\",\n    vs: (0, _fp64FunctionsGlslDefault.default),\n    fs: null,\n    dependencies: [\n        fp64arithmetic\n    ],\n    fp64ify: (0, _fp64Utils.fp64ify),\n    fp64LowPart: (0, _fp64Utils.fp64LowPart),\n    fp64ifyMatrix4: (0, _fp64Utils.fp64ifyMatrix4)\n};\n\n},{\"./fp64-utils\":\"kluEp\",\"./fp64-arithmetic.glsl\":\"19Huu\",\"./fp64-functions.glsl\":\"4XDMC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kluEp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fp64ify\", ()=>fp64ify);\nparcelHelpers.export(exports, \"fp64LowPart\", ()=>fp64LowPart);\nparcelHelpers.export(exports, \"fp64ifyMatrix4\", ()=>fp64ifyMatrix4);\nfunction fp64ify(a) {\n    var out = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n    var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n    var hiPart = Math.fround(a);\n    var loPart = a - hiPart;\n    out[startIndex] = hiPart;\n    out[startIndex + 1] = loPart;\n    return out;\n}\nfunction fp64LowPart(a) {\n    return a - Math.fround(a);\n}\nfunction fp64ifyMatrix4(matrix) {\n    var matrixFP64 = new Float32Array(32);\n    for(var i = 0; i < 4; ++i)for(var j = 0; j < 4; ++j){\n        var index = i * 4 + j;\n        fp64ify(matrix[j * 4 + i], matrixFP64, index * 2);\n    }\n    return matrixFP64;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"19Huu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"uniform float ONE;\\nvec2 split(float a) {\\n  const float SPLIT = 4097.0;\\n  float t = a * SPLIT;\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float a_hi = t * ONE - (t - a);\\n  float a_lo = a * ONE - a_hi;\\n#else\\n  float a_hi = t - (t - a);\\n  float a_lo = a - a_hi;\\n#endif\\n  return vec2(a_hi, a_lo);\\n}\\nvec2 split2(vec2 a) {\\n  vec2 b = split(a.x);\\n  b.y += a.y;\\n  return b;\\n}\\nvec2 quickTwoSum(float a, float b) {\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float sum = (a + b) * ONE;\\n  float err = b - (sum - a) * ONE;\\n#else\\n  float sum = a + b;\\n  float err = b - (sum - a);\\n#endif\\n  return vec2(sum, err);\\n}\\nvec2 twoSum(float a, float b) {\\n  float s = (a + b);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float v = (s * ONE - a) * ONE;\\n  float err = (a - (s - v) * ONE) * ONE * ONE * ONE + (b - v);\\n#else\\n  float v = s - a;\\n  float err = (a - (s - v)) + (b - v);\\n#endif\\n  return vec2(s, err);\\n}\\n\\nvec2 twoSub(float a, float b) {\\n  float s = (a - b);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float v = (s * ONE - a) * ONE;\\n  float err = (a - (s - v) * ONE) * ONE * ONE * ONE - (b + v);\\n#else\\n  float v = s - a;\\n  float err = (a - (s - v)) - (b + v);\\n#endif\\n  return vec2(s, err);\\n}\\n\\nvec2 twoSqr(float a) {\\n  float prod = a * a;\\n  vec2 a_fp64 = split(a);\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  float err = ((a_fp64.x * a_fp64.x - prod) * ONE + 2.0 * a_fp64.x *\\n    a_fp64.y * ONE * ONE) + a_fp64.y * a_fp64.y * ONE * ONE * ONE;\\n#else\\n  float err = ((a_fp64.x * a_fp64.x - prod) + 2.0 * a_fp64.x * a_fp64.y) + a_fp64.y * a_fp64.y;\\n#endif\\n  return vec2(prod, err);\\n}\\n\\nvec2 twoProd(float a, float b) {\\n  float prod = a * b;\\n  vec2 a_fp64 = split(a);\\n  vec2 b_fp64 = split(b);\\n  float err = ((a_fp64.x * b_fp64.x - prod) + a_fp64.x * b_fp64.y +\\n    a_fp64.y * b_fp64.x) + a_fp64.y * b_fp64.y;\\n  return vec2(prod, err);\\n}\\n\\nvec2 sum_fp64(vec2 a, vec2 b) {\\n  vec2 s, t;\\n  s = twoSum(a.x, b.x);\\n  t = twoSum(a.y, b.y);\\n  s.y += t.x;\\n  s = quickTwoSum(s.x, s.y);\\n  s.y += t.y;\\n  s = quickTwoSum(s.x, s.y);\\n  return s;\\n}\\n\\nvec2 sub_fp64(vec2 a, vec2 b) {\\n  vec2 s, t;\\n  s = twoSub(a.x, b.x);\\n  t = twoSub(a.y, b.y);\\n  s.y += t.x;\\n  s = quickTwoSum(s.x, s.y);\\n  s.y += t.y;\\n  s = quickTwoSum(s.x, s.y);\\n  return s;\\n}\\n\\nvec2 mul_fp64(vec2 a, vec2 b) {\\n  vec2 prod = twoProd(a.x, b.x);\\n  prod.y += a.x * b.y;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  prod = split2(prod);\\n#endif\\n  prod = quickTwoSum(prod.x, prod.y);\\n  prod.y += a.y * b.x;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  prod = split2(prod);\\n#endif\\n  prod = quickTwoSum(prod.x, prod.y);\\n  return prod;\\n}\\n\\nvec2 div_fp64(vec2 a, vec2 b) {\\n  float xn = 1.0 / b.x;\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  vec2 yn = mul_fp64(a, vec2(xn, 0));\\n#else\\n  vec2 yn = a * xn;\\n#endif\\n  float diff = (sub_fp64(a, mul_fp64(b, yn))).x;\\n  vec2 prod = twoProd(xn, diff);\\n  return sum_fp64(yn, prod);\\n}\\n\\nvec2 sqrt_fp64(vec2 a) {\\n  if (a.x == 0.0 && a.y == 0.0) return vec2(0.0, 0.0);\\n  if (a.x < 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);\\n\\n  float x = 1.0 / sqrt(a.x);\\n  float yn = a.x * x;\\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\\n  vec2 yn_sqr = twoSqr(yn) * ONE;\\n#else\\n  vec2 yn_sqr = twoSqr(yn);\\n#endif\\n  float diff = sub_fp64(a, yn_sqr).x;\\n  vec2 prod = twoProd(x * 0.5, diff);\\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\\n  return sum_fp64(split(yn), prod);\\n#else\\n  return sum_fp64(vec2(yn, 0.0), prod);\\n#endif\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4XDMC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);\\nconst vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);\\nconst vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);\\nconst vec2 TWO_PI_FP64 = vec2(6.2831854820251465, -1.7484556025237907e-7);\\nconst vec2 PI_2_FP64 = vec2(1.5707963705062866, -4.371139006309477e-8);\\nconst vec2 PI_4_FP64 = vec2(0.7853981852531433, -2.1855695031547384e-8);\\nconst vec2 PI_16_FP64 = vec2(0.19634954631328583, -5.463923757886846e-9);\\nconst vec2 PI_16_2_FP64 = vec2(0.39269909262657166, -1.0927847515773692e-8);\\nconst vec2 PI_16_3_FP64 = vec2(0.5890486240386963, -1.4906100798128818e-9);\\nconst vec2 PI_180_FP64 = vec2(0.01745329238474369, 1.3519960498364902e-10);\\n\\nconst vec2 SIN_TABLE_0_FP64 = vec2(0.19509032368659973, -1.6704714833615242e-9);\\nconst vec2 SIN_TABLE_1_FP64 = vec2(0.3826834261417389, 6.22335089017767e-9);\\nconst vec2 SIN_TABLE_2_FP64 = vec2(0.5555702447891235, -1.1769521357507529e-8);\\nconst vec2 SIN_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617041793133e-8);\\n\\nconst vec2 COS_TABLE_0_FP64 = vec2(0.9807852506637573, 2.9739473106360492e-8);\\nconst vec2 COS_TABLE_1_FP64 = vec2(0.9238795042037964, 2.8307490351764386e-8);\\nconst vec2 COS_TABLE_2_FP64 = vec2(0.8314695954322815, 1.6870263741530778e-8);\\nconst vec2 COS_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617152815436e-8);\\n\\nconst vec2 INVERSE_FACTORIAL_3_FP64 = vec2(1.666666716337204e-01, -4.967053879312289e-09);\\nconst vec2 INVERSE_FACTORIAL_4_FP64 = vec2(4.16666679084301e-02, -1.2417634698280722e-09);\\nconst vec2 INVERSE_FACTORIAL_5_FP64 = vec2(8.333333767950535e-03, -4.34617203337595e-10);\\nconst vec2 INVERSE_FACTORIAL_6_FP64 = vec2(1.3888889225199819e-03, -3.3631094437103215e-11);\\nconst vec2 INVERSE_FACTORIAL_7_FP64 = vec2(1.9841270113829523e-04,  -2.725596874933456e-12);\\nconst vec2 INVERSE_FACTORIAL_8_FP64 = vec2(2.4801587642286904e-05, -3.406996025904184e-13);\\nconst vec2 INVERSE_FACTORIAL_9_FP64 = vec2(2.75573188446287533e-06, 3.7935713937038186e-14);\\nconst vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15);\\n\\nfloat nint(float d) {\\n    if (d == floor(d)) return d;\\n    return floor(d + 0.5);\\n}\\n\\nvec2 nint_fp64(vec2 a) {\\n    float hi = nint(a.x);\\n    float lo;\\n    vec2 tmp;\\n    if (hi == a.x) {\\n        lo = nint(a.y);\\n        tmp = quickTwoSum(hi, lo);\\n    } else {\\n        lo = 0.0;\\n        if (abs(hi - a.x) == 0.5 && a.y < 0.0) {\\n            hi -= 1.0;\\n        }\\n        tmp = vec2(hi, lo);\\n    }\\n    return tmp;\\n}\\n\\nvec2 exp_fp64(vec2 a) {\\n\\n  const int k_power = 4;\\n  const float k = 16.0;\\n\\n  const float inv_k = 1.0 / k;\\n\\n  if (a.x <= -88.0) return vec2(0.0, 0.0);\\n  if (a.x >= 88.0) return vec2(1.0 / 0.0, 1.0 / 0.0);\\n  if (a.x == 0.0 && a.y == 0.0) return vec2(1.0, 0.0);\\n  if (a.x == 1.0 && a.y == 0.0) return E_FP64;\\n\\n  float m = floor(a.x / LOG2_FP64.x + 0.5);\\n  vec2 r = sub_fp64(a, mul_fp64(LOG2_FP64, vec2(m, 0.0))) * inv_k;\\n  vec2 s, t, p;\\n\\n  p = mul_fp64(r, r);\\n  s = sum_fp64(r, p * 0.5);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_3_FP64);\\n\\n  s = sum_fp64(s, t);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_4_FP64);\\n\\n  s = sum_fp64(s, t);\\n  p = mul_fp64(p, r);\\n  t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);\\n\\n\\n\\n\\n\\n\\n  s = sum_fp64(s, t);\\n  for (int i = 0; i < k_power; i++) {\\n    s = sum_fp64(s * 2.0, mul_fp64(s, s));\\n  }\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n  s = sum_fp64(s, vec2(ONE, 0.0));\\n#else\\n  s = sum_fp64(s, vec2(1.0, 0.0));\\n#endif\\n\\n  return s * pow(2.0, m);\\n}\\n\\nvec2 log_fp64(vec2 a)\\n{\\n  if (a.x == 1.0 && a.y == 0.0) return vec2(0.0, 0.0);\\n  if (a.x <= 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);\\n  vec2 x = vec2(log(a.x), 0.0);\\n  vec2 s;\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n  s = vec2(ONE, 0.0);\\n#else\\n  s = vec2(1.0, 0.0);\\n#endif\\n\\n  x = sub_fp64(sum_fp64(x, mul_fp64(a, exp_fp64(-x))), s);\\n  return x;\\n}\\n\\nvec2 sin_taylor_fp64(vec2 a) {\\n  vec2 r, s, t, x;\\n\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    return vec2(0.0, 0.0);\\n  }\\n\\n  x = -mul_fp64(a, a);\\n  s = a;\\n  r = a;\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_3_FP64);\\n  s = sum_fp64(s, t);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);\\n  s = sum_fp64(s, t);\\n\\n\\n\\n\\n\\n\\n  return s;\\n}\\n\\nvec2 cos_taylor_fp64(vec2 a) {\\n  vec2 r, s, t, x;\\n\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    return vec2(1.0, 0.0);\\n  }\\n\\n  x = -mul_fp64(a, a);\\n  r = x;\\n  s = sum_fp64(vec2(1.0, 0.0), r * 0.5);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_4_FP64);\\n  s = sum_fp64(s, t);\\n\\n  r = mul_fp64(r, x);\\n  t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);\\n  s = sum_fp64(s, t);\\n\\n\\n\\n\\n\\n\\n  return s;\\n}\\n\\nvoid sincos_taylor_fp64(vec2 a, out vec2 sin_t, out vec2 cos_t) {\\n  if (a.x == 0.0 && a.y == 0.0) {\\n    sin_t = vec2(0.0, 0.0);\\n    cos_t = vec2(1.0, 0.0);\\n  }\\n\\n  sin_t = sin_taylor_fp64(a);\\n  cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));\\n}\\n\\nvec2 sin_fp64(vec2 a) {\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(0.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n\\n    if (k == 0) {\\n        if (j == 0) {\\n            return sin_taylor_fp64(t);\\n        } else if (j == 1) {\\n            return cos_taylor_fp64(t);\\n        } else if (j == -1) {\\n            return -cos_taylor_fp64(t);\\n        } else {\\n            return -sin_taylor_fp64(t);\\n        }\\n    }\\n\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n    if (abs(float(abs_k) - 1.0) < 0.5) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#else\\n    if (abs_k == 1) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs_k == 2) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs_k == 3) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs_k == 4) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#endif\\n\\n    vec2 sin_t, cos_t;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n\\n\\n    vec2 result = vec2(0.0, 0.0);\\n    if (j == 0) {\\n        if (k > 0) {\\n            result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        }\\n    } else if (j == 1) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    } else if (j == -1) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        } else {\\n            result = -sum_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        }\\n    } else {\\n        if (k > 0) {\\n            result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));\\n        }\\n    }\\n\\n    return result;\\n}\\n\\nvec2 cos_fp64(vec2 a) {\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(1.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n\\n    if (k == 0) {\\n        if (j == 0) {\\n            return cos_taylor_fp64(t);\\n        } else if (j == 1) {\\n            return -sin_taylor_fp64(t);\\n        } else if (j == -1) {\\n            return sin_taylor_fp64(t);\\n        } else {\\n            return -cos_taylor_fp64(t);\\n        }\\n    }\\n\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n    if (abs(float(abs_k) - 1.0) < 0.5) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#else\\n    if (abs_k == 1) {\\n        u = COS_TABLE_0_FP64;\\n        v = SIN_TABLE_0_FP64;\\n    } else if (abs_k == 2) {\\n        u = COS_TABLE_1_FP64;\\n        v = SIN_TABLE_1_FP64;\\n    } else if (abs_k == 3) {\\n        u = COS_TABLE_2_FP64;\\n        v = SIN_TABLE_2_FP64;\\n    } else if (abs_k == 4) {\\n        u = COS_TABLE_3_FP64;\\n        v = SIN_TABLE_3_FP64;\\n    }\\n#endif\\n\\n    vec2 sin_t, cos_t;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n    vec2 result = vec2(0.0, 0.0);\\n    if (j == 0) {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    } else if (j == 1) {\\n        if (k > 0) {\\n            result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));\\n        }\\n    } else if (j == -1) {\\n        if (k > 0) {\\n            result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        } else {\\n            result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n        }\\n    } else {\\n        if (k > 0) {\\n            result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));\\n        } else {\\n            result = -sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    }\\n\\n    return result;\\n}\\n\\nvec2 tan_fp64(vec2 a) {\\n    vec2 sin_a;\\n    vec2 cos_a;\\n\\n    if (a.x == 0.0 && a.y == 0.0) {\\n        return vec2(0.0, 0.0);\\n    }\\n    vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));\\n    vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));\\n\\n    vec2 t;\\n    float q = floor(r.x / PI_2_FP64.x + 0.5);\\n    int j = int(q);\\n\\n\\n    if (j < -2 || j > 2) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    }\\n\\n    t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));\\n\\n    q = floor(t.x / PI_16_FP64.x + 0.5);\\n    int k = int(q);\\n    int abs_k = int(abs(float(k)));\\n\\n    if (abs_k > 4) {\\n        return vec2(0.0 / 0.0, 0.0 / 0.0);\\n    } else {\\n        t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));\\n    }\\n\\n\\n    vec2 u = vec2(0.0, 0.0);\\n    vec2 v = vec2(0.0, 0.0);\\n\\n    vec2 sin_t, cos_t;\\n    vec2 s, c;\\n    sincos_taylor_fp64(t, sin_t, cos_t);\\n\\n    if (k == 0) {\\n        s = sin_t;\\n        c = cos_t;\\n    } else {\\n#if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)\\n        if (abs(float(abs_k) - 1.0) < 0.5) {\\n            u = COS_TABLE_0_FP64;\\n            v = SIN_TABLE_0_FP64;\\n        } else if (abs(float(abs_k) - 2.0) < 0.5) {\\n            u = COS_TABLE_1_FP64;\\n            v = SIN_TABLE_1_FP64;\\n        } else if (abs(float(abs_k) - 3.0) < 0.5) {\\n            u = COS_TABLE_2_FP64;\\n            v = SIN_TABLE_2_FP64;\\n        } else if (abs(float(abs_k) - 4.0) < 0.5) {\\n            u = COS_TABLE_3_FP64;\\n            v = SIN_TABLE_3_FP64;\\n        }\\n#else\\n        if (abs_k == 1) {\\n            u = COS_TABLE_0_FP64;\\n            v = SIN_TABLE_0_FP64;\\n        } else if (abs_k == 2) {\\n            u = COS_TABLE_1_FP64;\\n            v = SIN_TABLE_1_FP64;\\n        } else if (abs_k == 3) {\\n            u = COS_TABLE_2_FP64;\\n            v = SIN_TABLE_2_FP64;\\n        } else if (abs_k == 4) {\\n            u = COS_TABLE_3_FP64;\\n            v = SIN_TABLE_3_FP64;\\n        }\\n#endif\\n        if (k > 0) {\\n            s = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n            c = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        } else {\\n            s = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));\\n            c = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));\\n        }\\n    }\\n\\n    if (j == 0) {\\n        sin_a = s;\\n        cos_a = c;\\n    } else if (j == 1) {\\n        sin_a = c;\\n        cos_a = -s;\\n    } else if (j == -1) {\\n        sin_a = -c;\\n        cos_a = s;\\n    } else {\\n        sin_a = -s;\\n        cos_a = -c;\\n    }\\n    return div_fp64(sin_a, cos_a);\\n}\\n\\nvec2 radians_fp64(vec2 degree) {\\n  return mul_fp64(degree, PI_180_FP64);\\n}\\n\\nvec2 mix_fp64(vec2 a, vec2 b, float x) {\\n  vec2 range = sub_fp64(b, a);\\n  return sum_fp64(a, mul_fp64(range, vec2(x, 0.0)));\\n}\\n\\nvoid vec2_sum_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = sum_fp64(a[0], b[0]);\\n    out_val[1] = sum_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_sub_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = sub_fp64(a[0], b[0]);\\n    out_val[1] = sub_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_mul_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = mul_fp64(a[0], b[0]);\\n    out_val[1] = mul_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_div_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {\\n    out_val[0] = div_fp64(a[0], b[0]);\\n    out_val[1] = div_fp64(a[1], b[1]);\\n}\\n\\nvoid vec2_mix_fp64(vec2 x[2], vec2 y[2], float a, out vec2 out_val[2]) {\\n  vec2 range[2];\\n  vec2_sub_fp64(y, x, range);\\n  vec2 portion[2];\\n  portion[0] = range[0] * a;\\n  portion[1] = range[1] * a;\\n  vec2_sum_fp64(x, portion, out_val);\\n}\\n\\nvec2 vec2_length_fp64(vec2 x[2]) {\\n  return sqrt_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])));\\n}\\n\\nvoid vec2_normalize_fp64(vec2 x[2], out vec2 out_val[2]) {\\n  vec2 length = vec2_length_fp64(x);\\n  vec2 length_vec2[2];\\n  length_vec2[0] = length;\\n  length_vec2[1] = length;\\n\\n  vec2_div_fp64(x, length_vec2, out_val);\\n}\\n\\nvec2 vec2_distance_fp64(vec2 x[2], vec2 y[2]) {\\n  vec2 diff[2];\\n  vec2_sub_fp64(x, y, diff);\\n  return vec2_length_fp64(diff);\\n}\\n\\nvec2 vec2_dot_fp64(vec2 a[2], vec2 b[2]) {\\n  vec2 v[2];\\n\\n  v[0] = mul_fp64(a[0], b[0]);\\n  v[1] = mul_fp64(a[1], b[1]);\\n\\n  return sum_fp64(v[0], v[1]);\\n}\\nvoid vec3_sub_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {\\n  for (int i = 0; i < 3; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvoid vec3_sum_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {\\n  for (int i = 0; i < 3; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvec2 vec3_length_fp64(vec2 x[3]) {\\n  return sqrt_fp64(sum_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])),\\n    mul_fp64(x[2], x[2])));\\n}\\n\\nvec2 vec3_distance_fp64(vec2 x[3], vec2 y[3]) {\\n  vec2 diff[3];\\n  vec3_sub_fp64(x, y, diff);\\n  return vec3_length_fp64(diff);\\n}\\nvoid vec4_fp64(vec4 a, out vec2 out_val[4]) {\\n  out_val[0].x = a[0];\\n  out_val[0].y = 0.0;\\n\\n  out_val[1].x = a[1];\\n  out_val[1].y = 0.0;\\n\\n  out_val[2].x = a[2];\\n  out_val[2].y = 0.0;\\n\\n  out_val[3].x = a[3];\\n  out_val[3].y = 0.0;\\n}\\n\\nvoid vec4_scalar_mul_fp64(vec2 a[4], vec2 b, out vec2 out_val[4]) {\\n  out_val[0] = mul_fp64(a[0], b);\\n  out_val[1] = mul_fp64(a[1], b);\\n  out_val[2] = mul_fp64(a[2], b);\\n  out_val[3] = mul_fp64(a[3], b);\\n}\\n\\nvoid vec4_sum_fp64(vec2 a[4], vec2 b[4], out vec2 out_val[4]) {\\n  for (int i = 0; i < 4; i++) {\\n    out_val[i] = sum_fp64(a[i], b[i]);\\n  }\\n}\\n\\nvoid vec4_dot_fp64(vec2 a[4], vec2 b[4], out vec2 out_val) {\\n  vec2 v[4];\\n\\n  v[0] = mul_fp64(a[0], b[0]);\\n  v[1] = mul_fp64(a[1], b[1]);\\n  v[2] = mul_fp64(a[2], b[2]);\\n  v[3] = mul_fp64(a[3], b[3]);\\n\\n  out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));\\n}\\n\\nvoid mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {\\n  vec2 tmp[4];\\n\\n  for (int i = 0; i < 4; i++)\\n  {\\n    for (int j = 0; j < 4; j++)\\n    {\\n      tmp[j] = b[j + i * 4];\\n    }\\n    vec4_dot_fp64(a, tmp, out_val[i]);\\n  }\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cZp55\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathGl = require(\"math.gl\");\nvar IDENTITY_MATRIX = [\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1\n];\nvar DEFAULT_MODULE_OPTIONS = {\n    modelMatrix: IDENTITY_MATRIX,\n    viewMatrix: IDENTITY_MATRIX,\n    projectionMatrix: IDENTITY_MATRIX,\n    cameraPositionWorld: [\n        0,\n        0,\n        0\n    ]\n};\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n    var prevUniforms = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var uniforms = {};\n    if (opts.modelMatrix !== undefined) uniforms.modelMatrix = opts.modelMatrix;\n    if (opts.viewMatrix !== undefined) uniforms.viewMatrix = opts.viewMatrix;\n    if (opts.projectionMatrix !== undefined) uniforms.projectionMatrix = opts.projectionMatrix;\n    if (opts.cameraPositionWorld !== undefined) uniforms.cameraPositionWorld = opts.cameraPositionWorld;\n    if (opts.projectionMatrix !== undefined || opts.viewMatrix !== undefined) uniforms.viewProjectionMatrix = new (0, _mathGl.Matrix4)(opts.projectionMatrix).multiplyRight(opts.viewMatrix);\n    return uniforms;\n}\nvar common = \"varying vec4 project_vPositionWorld;\\nvarying vec3 project_vNormalWorld;\\n\\nvec4 project_getPosition_World() {\\n  return project_vPositionWorld;\\n}\\n\\nvec3 project_getNormal_World() {\\n  return project_vNormalWorld;\\n}\\n\";\nvar vs = \"\".concat(common, \"\\nuniform mat4 modelMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewProjectionMatrix;\\nuniform vec3 cameraPositionWorld;\\n\\nstruct World {\\n  vec3 position;\\n  vec3 normal;\\n};\\n\\nWorld world;\\n\\nvoid project_setPosition(vec4 position) {\\n  project_vPositionWorld = position;\\n}\\n\\nvoid project_setNormal(vec3 normal) {\\n  project_vNormalWorld = normal;\\n}\\n\\nvoid project_setPositionAndNormal_World(vec3 position, vec3 normal) {\\n  world.position = position;\\n  world.normal = normal;\\n}\\n\\nvoid project_setPositionAndNormal_Model(vec3 position, vec3 normal) {\\n  world.position = (modelMatrix * vec4(position, 1.)).xyz;\\n  world.normal = mat3(modelMatrix) * normal;\\n}\\n\\nvec4 project_model_to_clipspace(vec4 position) {\\n  return viewProjectionMatrix * modelMatrix * position;\\n}\\n\\nvec4 project_model_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * modelMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_world_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_view_to_clipspace(vec3 position) {\\n  return projectionMatrix * vec4(position, 1.);\\n}\\n\\nvec4 project_to_clipspace(vec3 position) {\\n  return viewProjectionMatrix * vec4(position, 1.);\\n}\\n\");\nvar fs = \"\\n\".concat(common);\nexports.default = {\n    name: \"project\",\n    getUniforms: getUniforms,\n    vs: vs,\n    fs: fs\n};\n\n},{\"math.gl\":\"6aDAl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6aDAl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _core = require(\"@math.gl/core\");\nparcelHelpers.exportAll(_core, exports);\n\n},{\"@math.gl/core\":\"itQSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"itQSe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Vector2\", ()=>(0, _vector2Default.default));\nparcelHelpers.export(exports, \"Vector3\", ()=>(0, _vector3Default.default));\nparcelHelpers.export(exports, \"Vector4\", ()=>(0, _vector4Default.default));\nparcelHelpers.export(exports, \"Matrix3\", ()=>(0, _matrix3Default.default));\nparcelHelpers.export(exports, \"Matrix4\", ()=>(0, _matrix4Default.default));\nparcelHelpers.export(exports, \"Quaternion\", ()=>(0, _quaternionDefault.default));\nparcelHelpers.export(exports, \"SphericalCoordinates\", ()=>(0, _sphericalCoordinatesDefault.default));\nparcelHelpers.export(exports, \"Pose\", ()=>(0, _poseDefault.default));\nparcelHelpers.export(exports, \"Euler\", ()=>(0, _eulerDefault.default));\nparcelHelpers.export(exports, \"_MathUtils\", ()=>(0, _mathUtilsDefault.default));\nparcelHelpers.export(exports, \"assert\", ()=>(0, _assertDefault.default));\nparcelHelpers.export(exports, \"config\", ()=>(0, _common.config));\nparcelHelpers.export(exports, \"configure\", ()=>(0, _common.configure));\nparcelHelpers.export(exports, \"formatValue\", ()=>(0, _common.formatValue));\nparcelHelpers.export(exports, \"isArray\", ()=>(0, _common.isArray));\nparcelHelpers.export(exports, \"clone\", ()=>(0, _common.clone));\nparcelHelpers.export(exports, \"equals\", ()=>(0, _common.equals));\nparcelHelpers.export(exports, \"exactEquals\", ()=>(0, _common.exactEquals));\nparcelHelpers.export(exports, \"toRadians\", ()=>(0, _common.toRadians));\nparcelHelpers.export(exports, \"toDegrees\", ()=>(0, _common.toDegrees));\nparcelHelpers.export(exports, \"radians\", ()=>(0, _common.radians));\nparcelHelpers.export(exports, \"degrees\", ()=>(0, _common.degrees));\nparcelHelpers.export(exports, \"sin\", ()=>(0, _common.sin));\nparcelHelpers.export(exports, \"cos\", ()=>(0, _common.cos));\nparcelHelpers.export(exports, \"tan\", ()=>(0, _common.tan));\nparcelHelpers.export(exports, \"asin\", ()=>(0, _common.asin));\nparcelHelpers.export(exports, \"acos\", ()=>(0, _common.acos));\nparcelHelpers.export(exports, \"atan\", ()=>(0, _common.atan));\nparcelHelpers.export(exports, \"clamp\", ()=>(0, _common.clamp));\nparcelHelpers.export(exports, \"lerp\", ()=>(0, _common.lerp));\nparcelHelpers.export(exports, \"withEpsilon\", ()=>(0, _common.withEpsilon));\nparcelHelpers.export(exports, \"_SphericalCoordinates\", ()=>(0, _sphericalCoordinatesDefault.default));\nparcelHelpers.export(exports, \"_Pose\", ()=>(0, _poseDefault.default));\nparcelHelpers.export(exports, \"_Euler\", ()=>(0, _eulerDefault.default));\nvar _vector2 = require(\"./classes/vector2\");\nvar _vector2Default = parcelHelpers.interopDefault(_vector2);\nvar _vector3 = require(\"./classes/vector3\");\nvar _vector3Default = parcelHelpers.interopDefault(_vector3);\nvar _vector4 = require(\"./classes/vector4\");\nvar _vector4Default = parcelHelpers.interopDefault(_vector4);\nvar _matrix3 = require(\"./classes/matrix3\");\nvar _matrix3Default = parcelHelpers.interopDefault(_matrix3);\nvar _matrix4 = require(\"./classes/matrix4\");\nvar _matrix4Default = parcelHelpers.interopDefault(_matrix4);\nvar _quaternion = require(\"./classes/quaternion\");\nvar _quaternionDefault = parcelHelpers.interopDefault(_quaternion);\nvar _sphericalCoordinates = require(\"./classes/spherical-coordinates\");\nvar _sphericalCoordinatesDefault = parcelHelpers.interopDefault(_sphericalCoordinates);\nvar _pose = require(\"./classes/pose\");\nvar _poseDefault = parcelHelpers.interopDefault(_pose);\nvar _euler = require(\"./classes/euler\");\nvar _eulerDefault = parcelHelpers.interopDefault(_euler);\nvar _mathUtils = require(\"./lib/math-utils\");\nvar _mathUtilsDefault = parcelHelpers.interopDefault(_mathUtils);\nvar _assert = require(\"./lib/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _common = require(\"./lib/common\");\n\n},{\"./classes/vector2\":\"7DBV0\",\"./classes/vector3\":\"96vh2\",\"./classes/vector4\":\"kYKaF\",\"./classes/matrix3\":\"1fJyH\",\"./classes/matrix4\":\"2ggmN\",\"./classes/quaternion\":\"lx9bC\",\"./classes/spherical-coordinates\":\"bY1ks\",\"./classes/pose\":\"9CEXP\",\"./classes/euler\":\"jqmWN\",\"./lib/math-utils\":\"5l9eA\",\"./lib/assert\":\"lUwHV\",\"./lib/common\":\"849uR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7DBV0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _vector = require(\"./base/vector\");\nvar _vectorDefault = parcelHelpers.interopDefault(_vector);\nvar _common = require(\"../lib/common\");\nvar _validators = require(\"../lib/validators\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nclass Vector2 extends (0, _vectorDefault.default) {\n    constructor(x = 0, y = 0){\n        super(2);\n        if ((0, _common.isArray)(x) && arguments.length === 1) this.copy(x);\n        else {\n            if ((0, _common.config).debug) {\n                (0, _validators.checkNumber)(x);\n                (0, _validators.checkNumber)(y);\n            }\n            this[0] = x;\n            this[1] = y;\n        }\n    }\n    set(x, y) {\n        this[0] = x;\n        this[1] = y;\n        return this.check();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        return this.check();\n    }\n    fromObject(object) {\n        if ((0, _common.config).debug) {\n            (0, _validators.checkNumber)(object.x);\n            (0, _validators.checkNumber)(object.y);\n        }\n        this[0] = object.x;\n        this[1] = object.y;\n        return this.check();\n    }\n    toObject(object) {\n        object.x = this[0];\n        object.y = this[1];\n        return object;\n    }\n    get ELEMENTS() {\n        return 2;\n    }\n    horizontalAngle() {\n        return Math.atan2(this.y, this.x);\n    }\n    verticalAngle() {\n        return Math.atan2(this.x, this.y);\n    }\n    transform(matrix4) {\n        return this.transformAsPoint(matrix4);\n    }\n    transformAsPoint(matrix4) {\n        _vec2.transformMat4(this, this, matrix4);\n        return this.check();\n    }\n    transformAsVector(matrix4) {\n        (0, _glMatrixExtras.vec2_transformMat4AsVector)(this, this, matrix4);\n        return this.check();\n    }\n    transformByMatrix3(matrix3) {\n        _vec2.transformMat3(this, this, matrix3);\n        return this.check();\n    }\n    transformByMatrix2x3(matrix2x3) {\n        _vec2.transformMat2d(this, this, matrix2x3);\n        return this.check();\n    }\n    transformByMatrix2(matrix2) {\n        _vec2.transformMat2(this, this, matrix2);\n        return this.check();\n    }\n}\nexports.default = Vector2;\n\n},{\"./base/vector\":\"2zkS1\",\"../lib/common\":\"849uR\",\"../lib/validators\":\"904Rf\",\"gl-matrix/vec2\":\"ceSVb\",\"../lib/gl-matrix-extras\":\"1SdjF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2zkS1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathArray = require(\"./math-array\");\nvar _mathArrayDefault = parcelHelpers.interopDefault(_mathArray);\nvar _validators = require(\"../../lib/validators\");\nvar _assert = require(\"../../lib/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nclass Vector extends (0, _mathArrayDefault.default) {\n    get x() {\n        return this[0];\n    }\n    set x(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get y() {\n        return this[1];\n    }\n    set y(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    len() {\n        return Math.sqrt(this.lengthSquared());\n    }\n    magnitude() {\n        return this.len();\n    }\n    lengthSquared() {\n        let length = 0;\n        for(let i = 0; i < this.ELEMENTS; ++i)length += this[i] * this[i];\n        return length;\n    }\n    magnitudeSquared() {\n        return this.lengthSquared();\n    }\n    distance(mathArray) {\n        return Math.sqrt(this.distanceSquared(mathArray));\n    }\n    distanceSquared(mathArray) {\n        let length = 0;\n        for(let i = 0; i < this.ELEMENTS; ++i){\n            const dist = this[i] - mathArray[i];\n            length += dist * dist;\n        }\n        return (0, _validators.checkNumber)(length);\n    }\n    dot(mathArray) {\n        let product = 0;\n        for(let i = 0; i < this.ELEMENTS; ++i)product += this[i] * mathArray[i];\n        return (0, _validators.checkNumber)(product);\n    }\n    normalize() {\n        const length = this.magnitude();\n        if (length !== 0) for(let i = 0; i < this.ELEMENTS; ++i)this[i] /= length;\n        return this.check();\n    }\n    multiply(...vectors) {\n        for (const vector of vectors)for(let i = 0; i < this.ELEMENTS; ++i)this[i] *= vector[i];\n        return this.check();\n    }\n    divide(...vectors) {\n        for (const vector of vectors)for(let i = 0; i < this.ELEMENTS; ++i)this[i] /= vector[i];\n        return this.check();\n    }\n    lengthSq() {\n        return this.lengthSquared();\n    }\n    distanceTo(vector) {\n        return this.distance(vector);\n    }\n    distanceToSquared(vector) {\n        return this.distanceSquared(vector);\n    }\n    getComponent(i) {\n        (0, _assertDefault.default)(i >= 0 && i < this.ELEMENTS, \"index is out of range\");\n        return (0, _validators.checkNumber)(this[i]);\n    }\n    setComponent(i, value) {\n        (0, _assertDefault.default)(i >= 0 && i < this.ELEMENTS, \"index is out of range\");\n        this[i] = value;\n        return this.check();\n    }\n    addVectors(a, b) {\n        return this.copy(a).add(b);\n    }\n    subVectors(a, b) {\n        return this.copy(a).subtract(b);\n    }\n    multiplyVectors(a, b) {\n        return this.copy(a).multiply(b);\n    }\n    addScaledVector(a, b) {\n        return this.add(new this.constructor(a).multiplyScalar(b));\n    }\n}\nexports.default = Vector;\n\n},{\"./math-array\":\"fDlnO\",\"../../lib/validators\":\"904Rf\",\"../../lib/assert\":\"lUwHV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fDlnO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _common = require(\"../../lib/common\");\nfunction _extendableBuiltin(cls) {\n    function ExtendableBuiltin() {\n        var instance = Reflect.construct(cls, Array.from(arguments));\n        Object.setPrototypeOf(instance, Object.getPrototypeOf(this));\n        return instance;\n    }\n    ExtendableBuiltin.prototype = Object.create(cls.prototype, {\n        constructor: {\n            value: cls,\n            enumerable: false,\n            writable: true,\n            configurable: true\n        }\n    });\n    if (Object.setPrototypeOf) Object.setPrototypeOf(ExtendableBuiltin, cls);\n    else ExtendableBuiltin.__proto__ = cls;\n    return ExtendableBuiltin;\n}\nclass MathArray extends _extendableBuiltin(Array) {\n    clone() {\n        return new this.constructor().copy(this);\n    }\n    fromArray(array, offset = 0) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = array[i + offset];\n        return this.check();\n    }\n    toArray(targetArray = [], offset = 0) {\n        for(let i = 0; i < this.ELEMENTS; ++i)targetArray[offset + i] = this[i];\n        return targetArray;\n    }\n    from(arrayOrObject) {\n        return Array.isArray(arrayOrObject) ? this.copy(arrayOrObject) : this.fromObject(arrayOrObject);\n    }\n    to(arrayOrObject) {\n        if (arrayOrObject === this) return this;\n        return (0, _common.isArray)(arrayOrObject) ? this.toArray(arrayOrObject) : this.toObject(arrayOrObject);\n    }\n    toTarget(target) {\n        return target ? this.to(target) : this;\n    }\n    toFloat32Array() {\n        return new Float32Array(this);\n    }\n    toString() {\n        return this.formatString((0, _common.config));\n    }\n    formatString(opts) {\n        let string = \"\";\n        for(let i = 0; i < this.ELEMENTS; ++i)string += (i > 0 ? \", \" : \"\") + (0, _common.formatValue)(this[i], opts);\n        return \"\".concat(opts.printTypes ? this.constructor.name : \"\", \"[\").concat(string, \"]\");\n    }\n    equals(array) {\n        if (!array || this.length !== array.length) return false;\n        for(let i = 0; i < this.ELEMENTS; ++i){\n            if (!(0, _common.equals)(this[i], array[i])) return false;\n        }\n        return true;\n    }\n    exactEquals(array) {\n        if (!array || this.length !== array.length) return false;\n        for(let i = 0; i < this.ELEMENTS; ++i){\n            if (this[i] !== array[i]) return false;\n        }\n        return true;\n    }\n    negate() {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = -this[i];\n        return this.check();\n    }\n    lerp(a, b, t) {\n        if (t === undefined) return this.lerp(this, a, b);\n        for(let i = 0; i < this.ELEMENTS; ++i){\n            const ai = a[i];\n            this[i] = ai + t * (b[i] - ai);\n        }\n        return this.check();\n    }\n    min(vector) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = Math.min(vector[i], this[i]);\n        return this.check();\n    }\n    max(vector) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = Math.max(vector[i], this[i]);\n        return this.check();\n    }\n    clamp(minVector, maxVector) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = Math.min(Math.max(this[i], minVector[i]), maxVector[i]);\n        return this.check();\n    }\n    add(...vectors) {\n        for (const vector of vectors)for(let i = 0; i < this.ELEMENTS; ++i)this[i] += vector[i];\n        return this.check();\n    }\n    subtract(...vectors) {\n        for (const vector of vectors)for(let i = 0; i < this.ELEMENTS; ++i)this[i] -= vector[i];\n        return this.check();\n    }\n    scale(scale) {\n        if (typeof scale === \"number\") for(let i = 0; i < this.ELEMENTS; ++i)this[i] *= scale;\n        else for(let i1 = 0; i1 < this.ELEMENTS && i1 < scale.length; ++i1)this[i1] *= scale[i1];\n        return this.check();\n    }\n    multiplyByScalar(scalar) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] *= scalar;\n        return this.check();\n    }\n    check() {\n        if ((0, _common.config).debug && !this.validate()) throw new Error(\"math.gl: \".concat(this.constructor.name, \" some fields set to invalid numbers'\"));\n        return this;\n    }\n    validate() {\n        let valid = this.length === this.ELEMENTS;\n        for(let i = 0; i < this.ELEMENTS; ++i)valid = valid && Number.isFinite(this[i]);\n        return valid;\n    }\n    sub(a) {\n        return this.subtract(a);\n    }\n    setScalar(a) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = a;\n        return this.check();\n    }\n    addScalar(a) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] += a;\n        return this.check();\n    }\n    subScalar(a) {\n        return this.addScalar(-a);\n    }\n    multiplyScalar(scalar) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] *= scalar;\n        return this.check();\n    }\n    divideScalar(a) {\n        return this.multiplyByScalar(1 / a);\n    }\n    clampScalar(min, max) {\n        for(let i = 0; i < this.ELEMENTS; ++i)this[i] = Math.min(Math.max(this[i], min), max);\n        return this.check();\n    }\n    get elements() {\n        return this;\n    }\n}\nexports.default = MathArray;\n\n},{\"../../lib/common\":\"849uR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"849uR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"config\", ()=>config);\nparcelHelpers.export(exports, \"configure\", ()=>configure);\nparcelHelpers.export(exports, \"formatValue\", ()=>formatValue);\nparcelHelpers.export(exports, \"isArray\", ()=>isArray);\nparcelHelpers.export(exports, \"clone\", ()=>clone);\nparcelHelpers.export(exports, \"toRadians\", ()=>toRadians);\nparcelHelpers.export(exports, \"toDegrees\", ()=>toDegrees);\nparcelHelpers.export(exports, \"radians\", ()=>radians);\nparcelHelpers.export(exports, \"degrees\", ()=>degrees);\nparcelHelpers.export(exports, \"sin\", ()=>sin);\nparcelHelpers.export(exports, \"cos\", ()=>cos);\nparcelHelpers.export(exports, \"tan\", ()=>tan);\nparcelHelpers.export(exports, \"asin\", ()=>asin);\nparcelHelpers.export(exports, \"acos\", ()=>acos);\nparcelHelpers.export(exports, \"atan\", ()=>atan);\nparcelHelpers.export(exports, \"clamp\", ()=>clamp);\nparcelHelpers.export(exports, \"lerp\", ()=>lerp);\nparcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\nparcelHelpers.export(exports, \"withEpsilon\", ()=>withEpsilon);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nconst RADIANS_TO_DEGREES = 1 / Math.PI * 180;\nconst DEGREES_TO_RADIANS = 1 / 180 * Math.PI;\nconst config = {\n    EPSILON: 1e-12,\n    debug: false,\n    precision: 4,\n    printTypes: false,\n    printDegrees: false,\n    printRowMajor: true\n};\nfunction configure(options) {\n    for(const key in options){\n        (0, _assertDefault.default)(key in config);\n        config[key] = options[key];\n    }\n    return config;\n}\nfunction formatValue(value, { precision =config.precision  } = {}) {\n    value = round(value);\n    return \"\".concat(parseFloat(value.toPrecision(precision)));\n}\nfunction isArray(value) {\n    return Array.isArray(value) || ArrayBuffer.isView(value) && !(value instanceof DataView);\n}\nfunction clone(array) {\n    return \"clone\" in array ? array.clone() : array.slice();\n}\nfunction toRadians(degrees1) {\n    return radians(degrees1);\n}\nfunction toDegrees(radians1) {\n    return degrees(radians1);\n}\nfunction radians(degrees2, result) {\n    return map(degrees2, (degrees3)=>degrees3 * DEGREES_TO_RADIANS, result);\n}\nfunction degrees(radians2, result) {\n    return map(radians2, (radians3)=>radians3 * RADIANS_TO_DEGREES, result);\n}\nfunction sin(radians4, result) {\n    return map(radians4, (angle)=>Math.sin(angle), result);\n}\nfunction cos(radians5, result) {\n    return map(radians5, (angle)=>Math.cos(angle), result);\n}\nfunction tan(radians6, result) {\n    return map(radians6, (angle)=>Math.tan(angle), result);\n}\nfunction asin(radians7, result) {\n    return map(radians7, (angle)=>Math.asin(angle), result);\n}\nfunction acos(radians8, result) {\n    return map(radians8, (angle)=>Math.acos(angle), result);\n}\nfunction atan(radians9, result) {\n    return map(radians9, (angle)=>Math.atan(angle), result);\n}\nfunction clamp(value1, min, max) {\n    return map(value1, (value)=>Math.max(min, Math.min(max, value)));\n}\nfunction lerp(a, b, t) {\n    if (isArray(a)) return a.map((ai, i)=>lerp(ai, b[i], t));\n    return t * b + (1 - t) * a;\n}\nfunction equals(a, b, epsilon) {\n    const oldEpsilon = config.EPSILON;\n    if (epsilon) config.EPSILON = epsilon;\n    try {\n        if (a === b) return true;\n        if (isArray(a) && isArray(b)) {\n            if (a.length !== b.length) return false;\n            for(let i = 0; i < a.length; ++i){\n                if (!equals(a[i], b[i])) return false;\n            }\n            return true;\n        }\n        if (a && a.equals) return a.equals(b);\n        if (b && b.equals) return b.equals(a);\n        if (typeof a === \"number\" && typeof b === \"number\") return Math.abs(a - b) <= config.EPSILON * Math.max(1, Math.abs(a), Math.abs(b));\n        return false;\n    } finally{\n        config.EPSILON = oldEpsilon;\n    }\n}\nfunction exactEquals(a, b) {\n    if (a === b) return true;\n    if (a && typeof a === \"object\" && b && typeof b === \"object\") {\n        if (a.constructor !== b.constructor) return false;\n        if (a.exactEquals) return a.exactEquals(b);\n    }\n    if (isArray(a) && isArray(b)) {\n        if (a.length !== b.length) return false;\n        for(let i = 0; i < a.length; ++i){\n            if (!exactEquals(a[i], b[i])) return false;\n        }\n        return true;\n    }\n    return false;\n}\nfunction withEpsilon(epsilon, func) {\n    const oldPrecision = config.EPSILON;\n    config.EPSILON = epsilon;\n    let value;\n    try {\n        value = func();\n    } finally{\n        config.EPSILON = oldPrecision;\n    }\n    return value;\n}\nfunction round(value) {\n    return Math.round(value / config.EPSILON) * config.EPSILON;\n}\nfunction duplicateArray(array) {\n    return array.clone ? array.clone() : new Array(array.length);\n}\nfunction map(value, func, result) {\n    if (isArray(value)) {\n        const array = value;\n        result = result || duplicateArray(array);\n        for(let i = 0; i < result.length && i < array.length; ++i)result[i] = func(value[i], i, result);\n        return result;\n    }\n    return func(value);\n}\n\n},{\"./assert\":\"lUwHV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lUwHV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(\"math.gl assertion \".concat(message));\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"904Rf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"validateVector\", ()=>validateVector);\nparcelHelpers.export(exports, \"checkNumber\", ()=>checkNumber);\nparcelHelpers.export(exports, \"checkVector\", ()=>checkVector);\nparcelHelpers.export(exports, \"deprecated\", ()=>deprecated);\nvar _common = require(\"./common\");\nfunction validateVector(v, length) {\n    if (v.length !== length) return false;\n    for(let i = 0; i < v.length; ++i){\n        if (!Number.isFinite(v[i])) return false;\n    }\n    return true;\n}\nfunction checkNumber(value) {\n    if (!Number.isFinite(value)) throw new Error(\"Invalid number \".concat(value));\n    return value;\n}\nfunction checkVector(v, length, callerName = \"\") {\n    if ((0, _common.config).debug && !validateVector(v, length)) throw new Error(\"math.gl: \".concat(callerName, \" some fields set to invalid numbers'\"));\n    return v;\n}\nconst map = {};\nfunction deprecated(method, version) {\n    if (!map[method]) {\n        map[method] = true;\n        console.warn(\"\".concat(method, \" has been removed in version \").concat(version, \", see upgrade guide for more information\"));\n    }\n}\n\n},{\"./common\":\"849uR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ceSVb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 2 Dimensional Vector\n * @module vec2\n */ /**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"divide\", ()=>divide);\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"ceil\", ()=>ceil);\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"floor\", ()=>floor);\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"min\", ()=>min);\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"max\", ()=>max);\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"round\", ()=>round);\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"scaleAndAdd\", ()=>scaleAndAdd);\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */ parcelHelpers.export(exports, \"distance\", ()=>distance);\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */ parcelHelpers.export(exports, \"squaredDistance\", ()=>squaredDistance);\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */ parcelHelpers.export(exports, \"length\", ()=>length);\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */ parcelHelpers.export(exports, \"squaredLength\", ()=>squaredLength);\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"negate\", ()=>negate);\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"inverse\", ()=>inverse);\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"normalize\", ()=>normalize);\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */ parcelHelpers.export(exports, \"dot\", ()=>dot);\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"cross\", ()=>cross);\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"lerp\", ()=>lerp);\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"random\", ()=>random);\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"transformMat2\", ()=>transformMat2);\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"transformMat2d\", ()=>transformMat2d);\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"transformMat3\", ()=>transformMat3);\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"transformMat4\", ()=>transformMat4);\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"rotate\", ()=>rotate);\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */ parcelHelpers.export(exports, \"angle\", ()=>angle);\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */ parcelHelpers.export(exports, \"zero\", ()=>zero);\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"len\", ()=>len);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"div\", ()=>div);\nparcelHelpers.export(exports, \"dist\", ()=>dist);\nparcelHelpers.export(exports, \"sqrDist\", ()=>sqrDist);\nparcelHelpers.export(exports, \"sqrLen\", ()=>sqrLen);\nparcelHelpers.export(exports, \"forEach\", ()=>forEach);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(2);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n    }\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(2);\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n}\nfunction fromValues(x, y) {\n    var out = new _commonJs.ARRAY_TYPE(2);\n    out[0] = x;\n    out[1] = y;\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n}\nfunction set(out, x, y) {\n    out[0] = x;\n    out[1] = y;\n    return out;\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    return out;\n}\nfunction multiply(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    return out;\n}\nfunction divide(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    return out;\n}\nfunction ceil(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    return out;\n}\nfunction floor(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    return out;\n}\nfunction min(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    return out;\n}\nfunction max(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    return out;\n}\nfunction round(out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    return out;\n}\nfunction scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    return out;\n}\nfunction scaleAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    return out;\n}\nfunction distance(a, b) {\n    var x = b[0] - a[0], y = b[1] - a[1];\n    return Math.hypot(x, y);\n}\nfunction squaredDistance(a, b) {\n    var x = b[0] - a[0], y = b[1] - a[1];\n    return x * x + y * y;\n}\nfunction length(a) {\n    var x = a[0], y = a[1];\n    return Math.hypot(x, y);\n}\nfunction squaredLength(a) {\n    var x = a[0], y = a[1];\n    return x * x + y * y;\n}\nfunction negate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    return out;\n}\nfunction inverse(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    return out;\n}\nfunction normalize(out, a) {\n    var x = a[0], y = a[1];\n    var len1 = x * x + y * y;\n    if (len1 > 0) //TODO: evaluate use of glm_invsqrt here?\n    len1 = 1 / Math.sqrt(len1);\n    out[0] = a[0] * len1;\n    out[1] = a[1] * len1;\n    return out;\n}\nfunction dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n}\nfunction cross(out, a, b) {\n    var z = a[0] * b[1] - a[1] * b[0];\n    out[0] = out[1] = 0;\n    out[2] = z;\n    return out;\n}\nfunction lerp(out, a, b, t) {\n    var ax = a[0], ay = a[1];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    return out;\n}\nfunction random(out, scale2) {\n    scale2 = scale2 || 1.0;\n    var r = _commonJs.RANDOM() * 2.0 * Math.PI;\n    out[0] = Math.cos(r) * scale2;\n    out[1] = Math.sin(r) * scale2;\n    return out;\n}\nfunction transformMat2(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    return out;\n}\nfunction transformMat2d(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[2] * y + m[4];\n    out[1] = m[1] * x + m[3] * y + m[5];\n    return out;\n}\nfunction transformMat3(out, a, m) {\n    var x = a[0], y = a[1];\n    out[0] = m[0] * x + m[3] * y + m[6];\n    out[1] = m[1] * x + m[4] * y + m[7];\n    return out;\n}\nfunction transformMat4(out, a, m) {\n    var x = a[0];\n    var y = a[1];\n    out[0] = m[0] * x + m[4] * y + m[12];\n    out[1] = m[1] * x + m[5] * y + m[13];\n    return out;\n}\nfunction rotate(out, a, b, rad) {\n    //Translate point to the origin\n    var p0 = a[0] - b[0], p1 = a[1] - b[1], sinC = Math.sin(rad), cosC = Math.cos(rad); //perform rotation and translate to correct position\n    out[0] = p0 * cosC - p1 * sinC + b[0];\n    out[1] = p0 * sinC + p1 * cosC + b[1];\n    return out;\n}\nfunction angle(a, b) {\n    var x1 = a[0], y1 = a[1], x2 = b[0], y2 = b[1], // mag is the product of the magnitudes of a and b\n    mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2), // mag &&.. short circuits if mag == 0\n    cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n    return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\nfunction zero(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    return out;\n}\nfunction str(a) {\n    return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1];\n    var b0 = b[0], b1 = b[1];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\nvar len = length;\nvar sub = subtract;\nvar mul = multiply;\nvar div = divide;\nvar dist = distance;\nvar sqrDist = squaredDistance;\nvar sqrLen = squaredLength;\nvar forEach = function() {\n    var vec = create();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 2;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n        }\n        return a;\n    };\n}();\n\n},{\"./common.js\":\"Li4u6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Li4u6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"EPSILON\", ()=>EPSILON);\nparcelHelpers.export(exports, \"ARRAY_TYPE\", ()=>ARRAY_TYPE);\nparcelHelpers.export(exports, \"RANDOM\", ()=>RANDOM);\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */ parcelHelpers.export(exports, \"setMatrixArrayType\", ()=>setMatrixArrayType);\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */ parcelHelpers.export(exports, \"toRadian\", ()=>toRadian);\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nvar EPSILON = 0.000001;\nvar ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nvar RANDOM = Math.random;\nfunction setMatrixArrayType(type) {\n    ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\nfunction toRadian(a) {\n    return a * degree;\n}\nfunction equals(a, b) {\n    return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function() {\n    var y = 0, i = arguments.length;\n    while(i--)y += arguments[i] * arguments[i];\n    return Math.sqrt(y);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1SdjF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"vec2_transformMat4AsVector\", ()=>vec2_transformMat4AsVector);\nparcelHelpers.export(exports, \"vec3_transformMat4AsVector\", ()=>vec3_transformMat4AsVector);\nparcelHelpers.export(exports, \"vec3_transformMat2\", ()=>vec3_transformMat2);\nparcelHelpers.export(exports, \"vec4_transformMat2\", ()=>vec4_transformMat2);\nparcelHelpers.export(exports, \"vec4_transformMat3\", ()=>vec4_transformMat3);\nfunction vec2_transformMat4AsVector(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    const w = m[3] * x + m[7] * y || 1.0;\n    out[0] = (m[0] * x + m[4] * y) / w;\n    out[1] = (m[1] * x + m[5] * y) / w;\n    return out;\n}\nfunction vec3_transformMat4AsVector(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    const z = a[2];\n    const w = m[3] * x + m[7] * y + m[11] * z || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z) / w;\n    return out;\n}\nfunction vec3_transformMat2(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    out[2] = a[2];\n    return out;\n}\nfunction vec4_transformMat2(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction vec4_transformMat3(out, a, m) {\n    const x = a[0];\n    const y = a[1];\n    const z = a[2];\n    out[0] = m[0] * x + m[3] * y + m[6] * z;\n    out[1] = m[1] * x + m[4] * y + m[7] * z;\n    out[2] = m[2] * x + m[5] * y + m[8] * z;\n    out[3] = a[3];\n    return out;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"96vh2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _vector = require(\"./base/vector\");\nvar _vectorDefault = parcelHelpers.interopDefault(_vector);\nvar _common = require(\"../lib/common\");\nvar _validators = require(\"../lib/validators\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nconst ORIGIN = [\n    0,\n    0,\n    0\n];\nlet ZERO;\nclass Vector3 extends (0, _vectorDefault.default) {\n    static get ZERO() {\n        if (!ZERO) {\n            ZERO = new Vector3(0, 0, 0);\n            Object.freeze(ZERO);\n        }\n        return ZERO;\n    }\n    constructor(x = 0, y = 0, z = 0){\n        super(-0, -0, -0);\n        if (arguments.length === 1 && (0, _common.isArray)(x)) this.copy(x);\n        else {\n            if ((0, _common.config).debug) {\n                (0, _validators.checkNumber)(x);\n                (0, _validators.checkNumber)(y);\n                (0, _validators.checkNumber)(z);\n            }\n            this[0] = x;\n            this[1] = y;\n            this[2] = z;\n        }\n    }\n    set(x, y, z) {\n        this[0] = x;\n        this[1] = y;\n        this[2] = z;\n        return this.check();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        return this.check();\n    }\n    fromObject(object) {\n        if ((0, _common.config).debug) {\n            (0, _validators.checkNumber)(object.x);\n            (0, _validators.checkNumber)(object.y);\n            (0, _validators.checkNumber)(object.z);\n        }\n        this[0] = object.x;\n        this[1] = object.y;\n        this[2] = object.z;\n        return this.check();\n    }\n    toObject(object) {\n        object.x = this[0];\n        object.y = this[1];\n        object.z = this[2];\n        return object;\n    }\n    get ELEMENTS() {\n        return 3;\n    }\n    get z() {\n        return this[2];\n    }\n    set z(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    angle(vector) {\n        return _vec3.angle(this, vector);\n    }\n    cross(vector) {\n        _vec3.cross(this, this, vector);\n        return this.check();\n    }\n    rotateX({ radians , origin =ORIGIN  }) {\n        _vec3.rotateX(this, this, origin, radians);\n        return this.check();\n    }\n    rotateY({ radians , origin =ORIGIN  }) {\n        _vec3.rotateY(this, this, origin, radians);\n        return this.check();\n    }\n    rotateZ({ radians , origin =ORIGIN  }) {\n        _vec3.rotateZ(this, this, origin, radians);\n        return this.check();\n    }\n    transform(matrix4) {\n        return this.transformAsPoint(matrix4);\n    }\n    transformAsPoint(matrix4) {\n        _vec3.transformMat4(this, this, matrix4);\n        return this.check();\n    }\n    transformAsVector(matrix4) {\n        (0, _glMatrixExtras.vec3_transformMat4AsVector)(this, this, matrix4);\n        return this.check();\n    }\n    transformByMatrix3(matrix3) {\n        _vec3.transformMat3(this, this, matrix3);\n        return this.check();\n    }\n    transformByMatrix2(matrix2) {\n        (0, _glMatrixExtras.vec3_transformMat2)(this, this, matrix2);\n        return this.check();\n    }\n    transformByQuaternion(quaternion) {\n        _vec3.transformQuat(this, this, quaternion);\n        return this.check();\n    }\n}\nexports.default = Vector3;\n\n},{\"./base/vector\":\"2zkS1\",\"../lib/common\":\"849uR\",\"../lib/validators\":\"904Rf\",\"gl-matrix/vec3\":\"cAIcX\",\"../lib/gl-matrix-extras\":\"1SdjF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cAIcX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 3 Dimensional Vector\n * @module vec3\n */ /**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */ parcelHelpers.export(exports, \"length\", ()=>length);\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"divide\", ()=>divide);\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"ceil\", ()=>ceil);\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"floor\", ()=>floor);\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"min\", ()=>min);\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"max\", ()=>max);\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"round\", ()=>round);\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"scaleAndAdd\", ()=>scaleAndAdd);\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */ parcelHelpers.export(exports, \"distance\", ()=>distance);\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */ parcelHelpers.export(exports, \"squaredDistance\", ()=>squaredDistance);\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */ parcelHelpers.export(exports, \"squaredLength\", ()=>squaredLength);\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"negate\", ()=>negate);\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"inverse\", ()=>inverse);\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"normalize\", ()=>normalize);\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */ parcelHelpers.export(exports, \"dot\", ()=>dot);\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"cross\", ()=>cross);\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"lerp\", ()=>lerp);\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"hermite\", ()=>hermite);\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"bezier\", ()=>bezier);\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"random\", ()=>random);\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"transformMat4\", ()=>transformMat4);\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"transformMat3\", ()=>transformMat3);\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"transformQuat\", ()=>transformQuat);\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"rotateX\", ()=>rotateX);\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"rotateY\", ()=>rotateY);\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"rotateZ\", ()=>rotateZ);\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */ parcelHelpers.export(exports, \"angle\", ()=>angle);\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */ parcelHelpers.export(exports, \"zero\", ()=>zero);\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"div\", ()=>div);\nparcelHelpers.export(exports, \"dist\", ()=>dist);\nparcelHelpers.export(exports, \"sqrDist\", ()=>sqrDist);\nparcelHelpers.export(exports, \"len\", ()=>len);\nparcelHelpers.export(exports, \"sqrLen\", ()=>sqrLen);\nparcelHelpers.export(exports, \"forEach\", ()=>forEach);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(3);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n    }\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(3);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n}\nfunction length(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    return Math.hypot(x, y, z);\n}\nfunction fromValues(x, y, z) {\n    var out = new _commonJs.ARRAY_TYPE(3);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n}\nfunction set(out, x, y, z) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    return out;\n}\nfunction multiply(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    return out;\n}\nfunction divide(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    return out;\n}\nfunction ceil(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    return out;\n}\nfunction floor(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    return out;\n}\nfunction min(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    return out;\n}\nfunction max(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    return out;\n}\nfunction round(out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    return out;\n}\nfunction scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    return out;\n}\nfunction scaleAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    out[2] = a[2] + b[2] * scale1;\n    return out;\n}\nfunction distance(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    return Math.hypot(x, y, z);\n}\nfunction squaredDistance(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    return x * x + y * y + z * z;\n}\nfunction squaredLength(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    return x * x + y * y + z * z;\n}\nfunction negate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    return out;\n}\nfunction inverse(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    out[2] = 1.0 / a[2];\n    return out;\n}\nfunction normalize(out, a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var len1 = x * x + y * y + z * z;\n    if (len1 > 0) //TODO: evaluate use of glm_invsqrt here?\n    len1 = 1 / Math.sqrt(len1);\n    out[0] = a[0] * len1;\n    out[1] = a[1] * len1;\n    out[2] = a[2] * len1;\n    return out;\n}\nfunction dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\nfunction cross(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2];\n    var bx = b[0], by = b[1], bz = b[2];\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n}\nfunction lerp(out, a, b, t) {\n    var ax = a[0];\n    var ay = a[1];\n    var az = a[2];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    return out;\n}\nfunction hermite(out, a, b, c, d, t) {\n    var factorTimes2 = t * t;\n    var factor1 = factorTimes2 * (2 * t - 3) + 1;\n    var factor2 = factorTimes2 * (t - 2) + t;\n    var factor3 = factorTimes2 * (t - 1);\n    var factor4 = factorTimes2 * (3 - 2 * t);\n    out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n    out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n    out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n    return out;\n}\nfunction bezier(out, a, b, c, d, t) {\n    var inverseFactor = 1 - t;\n    var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n    var factorTimes2 = t * t;\n    var factor1 = inverseFactorTimesTwo * inverseFactor;\n    var factor2 = 3 * t * inverseFactorTimesTwo;\n    var factor3 = 3 * factorTimes2 * inverseFactor;\n    var factor4 = factorTimes2 * t;\n    out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n    out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n    out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n    return out;\n}\nfunction random(out, scale2) {\n    scale2 = scale2 || 1.0;\n    var r = _commonJs.RANDOM() * 2.0 * Math.PI;\n    var z = _commonJs.RANDOM() * 2.0 - 1.0;\n    var zScale = Math.sqrt(1.0 - z * z) * scale2;\n    out[0] = Math.cos(r) * zScale;\n    out[1] = Math.sin(r) * zScale;\n    out[2] = z * scale2;\n    return out;\n}\nfunction transformMat4(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n    return out;\n}\nfunction transformMat3(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x * m[0] + y * m[3] + z * m[6];\n    out[1] = x * m[1] + y * m[4] + z * m[7];\n    out[2] = x * m[2] + y * m[5] + z * m[8];\n    return out;\n}\nfunction transformQuat(out, a, q) {\n    // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3];\n    var x = a[0], y = a[1], z = a[2]; // var qvec = [qx, qy, qz];\n    // var uv = vec3.cross([], qvec, a);\n    var uvx = qy * z - qz * y, uvy = qz * x - qx * z, uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n    var uuvx = qy * uvz - qz * uvy, uuvy = qz * uvx - qx * uvz, uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n    var w2 = qw * 2;\n    uvx *= w2;\n    uvy *= w2;\n    uvz *= w2; // vec3.scale(uuv, uuv, 2);\n    uuvx *= 2;\n    uuvy *= 2;\n    uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n    out[0] = x + uvx + uuvx;\n    out[1] = y + uvy + uuvy;\n    out[2] = z + uvz + uuvz;\n    return out;\n}\nfunction rotateX(out, a, b, rad) {\n    var p = [], r = []; //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2]; //perform rotation\n    r[0] = p[0];\n    r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n    r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction rotateY(out, a, b, rad) {\n    var p = [], r = []; //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2]; //perform rotation\n    r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n    r[1] = p[1];\n    r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction rotateZ(out, a, b, rad) {\n    var p = [], r = []; //Translate point to the origin\n    p[0] = a[0] - b[0];\n    p[1] = a[1] - b[1];\n    p[2] = a[2] - b[2]; //perform rotation\n    r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n    r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n    r[2] = p[2]; //translate to correct position\n    out[0] = r[0] + b[0];\n    out[1] = r[1] + b[1];\n    out[2] = r[2] + b[2];\n    return out;\n}\nfunction angle(a, b) {\n    var ax = a[0], ay = a[1], az = a[2], bx = b[0], by = b[1], bz = b[2], mag1 = Math.sqrt(ax * ax + ay * ay + az * az), mag2 = Math.sqrt(bx * bx + by * by + bz * bz), mag = mag1 * mag2, cosine = mag && dot(a, b) / mag;\n    return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\nfunction zero(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    return out;\n}\nfunction str(a) {\n    return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2];\n    var b0 = b[0], b1 = b[1], b2 = b[2];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\nvar sub = subtract;\nvar mul = multiply;\nvar div = divide;\nvar dist = distance;\nvar sqrDist = squaredDistance;\nvar len = length;\nvar sqrLen = squaredLength;\nvar forEach = function() {\n    var vec = create();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 3;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            vec[2] = a[i + 2];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n            a[i + 2] = vec[2];\n        }\n        return a;\n    };\n}();\n\n},{\"./common.js\":\"Li4u6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kYKaF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _vector = require(\"./base/vector\");\nvar _vectorDefault = parcelHelpers.interopDefault(_vector);\nvar _common = require(\"../lib/common\");\nvar _validators = require(\"../lib/validators\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nlet ZERO;\nclass Vector4 extends (0, _vectorDefault.default) {\n    static get ZERO() {\n        if (!ZERO) {\n            ZERO = new Vector4(0, 0, 0, 0);\n            Object.freeze(ZERO);\n        }\n        return ZERO;\n    }\n    constructor(x = 0, y = 0, z = 0, w = 0){\n        super(-0, -0, -0, -0);\n        if ((0, _common.isArray)(x) && arguments.length === 1) this.copy(x);\n        else {\n            if ((0, _common.config).debug) {\n                (0, _validators.checkNumber)(x);\n                (0, _validators.checkNumber)(y);\n                (0, _validators.checkNumber)(z);\n                (0, _validators.checkNumber)(w);\n            }\n            this[0] = x;\n            this[1] = y;\n            this[2] = z;\n            this[3] = w;\n        }\n    }\n    set(x, y, z, w) {\n        this[0] = x;\n        this[1] = y;\n        this[2] = z;\n        this[3] = w;\n        return this.check();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = array[3];\n        return this.check();\n    }\n    fromObject(object) {\n        if ((0, _common.config).debug) {\n            (0, _validators.checkNumber)(object.x);\n            (0, _validators.checkNumber)(object.y);\n            (0, _validators.checkNumber)(object.z);\n            (0, _validators.checkNumber)(object.w);\n        }\n        this[0] = object.x;\n        this[1] = object.y;\n        this[2] = object.z;\n        this[3] = object.w;\n        return this;\n    }\n    toObject(object) {\n        object.x = this[0];\n        object.y = this[1];\n        object.z = this[2];\n        object.w = this[3];\n        return object;\n    }\n    get ELEMENTS() {\n        return 4;\n    }\n    get z() {\n        return this[2];\n    }\n    set z(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get w() {\n        return this[3];\n    }\n    set w(value) {\n        this[3] = (0, _validators.checkNumber)(value);\n    }\n    transform(matrix4) {\n        _vec3.transformMat4(this, this, matrix4);\n        return this.check();\n    }\n    transformByMatrix3(matrix3) {\n        (0, _glMatrixExtras.vec4_transformMat3)(this, this, matrix3);\n        return this.check();\n    }\n    transformByMatrix2(matrix2) {\n        (0, _glMatrixExtras.vec4_transformMat2)(this, this, matrix2);\n        return this.check();\n    }\n    transformByQuaternion(quaternion) {\n        _vec3.transformQuat(this, this, quaternion);\n        return this.check();\n    }\n    applyMatrix4(m) {\n        m.transform(this, this);\n        return this;\n    }\n}\nexports.default = Vector4;\n\n},{\"./base/vector\":\"2zkS1\",\"../lib/common\":\"849uR\",\"../lib/validators\":\"904Rf\",\"gl-matrix/vec3\":\"cAIcX\",\"../lib/gl-matrix-extras\":\"1SdjF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1fJyH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _matrix = require(\"./base/matrix\");\nvar _matrixDefault = parcelHelpers.interopDefault(_matrix);\nvar _validators = require(\"../lib/validators\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nvar _mat3 = require(\"gl-matrix/mat3\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar INDICES;\n(function(INDICES1) {\n    INDICES1[INDICES1[\"COL0ROW0\"] = 0] = \"COL0ROW0\";\n    INDICES1[INDICES1[\"COL0ROW1\"] = 1] = \"COL0ROW1\";\n    INDICES1[INDICES1[\"COL0ROW2\"] = 2] = \"COL0ROW2\";\n    INDICES1[INDICES1[\"COL1ROW0\"] = 3] = \"COL1ROW0\";\n    INDICES1[INDICES1[\"COL1ROW1\"] = 4] = \"COL1ROW1\";\n    INDICES1[INDICES1[\"COL1ROW2\"] = 5] = \"COL1ROW2\";\n    INDICES1[INDICES1[\"COL2ROW0\"] = 6] = \"COL2ROW0\";\n    INDICES1[INDICES1[\"COL2ROW1\"] = 7] = \"COL2ROW1\";\n    INDICES1[INDICES1[\"COL2ROW2\"] = 8] = \"COL2ROW2\";\n})(INDICES || (INDICES = {}));\nconst IDENTITY_MATRIX = Object.freeze([\n    1,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    1\n]);\nclass Matrix3 extends (0, _matrixDefault.default) {\n    static get IDENTITY() {\n        return getIdentityMatrix();\n    }\n    static get ZERO() {\n        return getZeroMatrix();\n    }\n    get ELEMENTS() {\n        return 9;\n    }\n    get RANK() {\n        return 3;\n    }\n    get INDICES() {\n        return INDICES;\n    }\n    constructor(array, ...args){\n        super(-0, -0, -0, -0, -0, -0, -0, -0, -0);\n        if (arguments.length === 1 && Array.isArray(array)) this.copy(array);\n        else if (args.length > 0) this.copy([\n            array,\n            ...args\n        ]);\n        else this.identity();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = array[3];\n        this[4] = array[4];\n        this[5] = array[5];\n        this[6] = array[6];\n        this[7] = array[7];\n        this[8] = array[8];\n        return this.check();\n    }\n    identity() {\n        return this.copy(IDENTITY_MATRIX);\n    }\n    fromObject(object) {\n        return this.check();\n    }\n    fromQuaternion(q) {\n        _mat3.fromQuat(this, q);\n        return this.check();\n    }\n    set(m00, m10, m20, m01, m11, m21, m02, m12, m22) {\n        this[0] = m00;\n        this[1] = m10;\n        this[2] = m20;\n        this[3] = m01;\n        this[4] = m11;\n        this[5] = m21;\n        this[6] = m02;\n        this[7] = m12;\n        this[8] = m22;\n        return this.check();\n    }\n    setRowMajor(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n        this[0] = m00;\n        this[1] = m10;\n        this[2] = m20;\n        this[3] = m01;\n        this[4] = m11;\n        this[5] = m21;\n        this[6] = m02;\n        this[7] = m12;\n        this[8] = m22;\n        return this.check();\n    }\n    determinant() {\n        return _mat3.determinant(this);\n    }\n    transpose() {\n        _mat3.transpose(this, this);\n        return this.check();\n    }\n    invert() {\n        _mat3.invert(this, this);\n        return this.check();\n    }\n    multiplyLeft(a) {\n        _mat3.multiply(this, a, this);\n        return this.check();\n    }\n    multiplyRight(a) {\n        _mat3.multiply(this, this, a);\n        return this.check();\n    }\n    rotate(radians) {\n        _mat3.rotate(this, this, radians);\n        return this.check();\n    }\n    scale(factor) {\n        if (Array.isArray(factor)) _mat3.scale(this, this, factor);\n        else _mat3.scale(this, this, [\n            factor,\n            factor\n        ]);\n        return this.check();\n    }\n    translate(vec) {\n        _mat3.translate(this, this, vec);\n        return this.check();\n    }\n    transform(vector, result) {\n        let out;\n        switch(vector.length){\n            case 2:\n                out = _vec2.transformMat3(result || [\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            case 3:\n                out = _vec3.transformMat3(result || [\n                    -0,\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            case 4:\n                out = (0, _glMatrixExtras.vec4_transformMat3)(result || [\n                    -0,\n                    -0,\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            default:\n                throw new Error(\"Illegal vector\");\n        }\n        (0, _validators.checkVector)(out, vector.length);\n        return out;\n    }\n    transformVector(vector, result) {\n        return this.transform(vector, result);\n    }\n    transformVector2(vector, result) {\n        return this.transform(vector, result);\n    }\n    transformVector3(vector, result) {\n        return this.transform(vector, result);\n    }\n}\nexports.default = Matrix3;\nlet ZERO_MATRIX3;\nlet IDENTITY_MATRIX3;\nfunction getZeroMatrix() {\n    if (!ZERO_MATRIX3) {\n        ZERO_MATRIX3 = new Matrix3([\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0\n        ]);\n        Object.freeze(ZERO_MATRIX3);\n    }\n    return ZERO_MATRIX3;\n}\nfunction getIdentityMatrix() {\n    if (!IDENTITY_MATRIX3) {\n        IDENTITY_MATRIX3 = new Matrix3();\n        Object.freeze(IDENTITY_MATRIX3);\n    }\n    return IDENTITY_MATRIX3;\n}\n\n},{\"./base/matrix\":\"b1TWa\",\"../lib/validators\":\"904Rf\",\"../lib/gl-matrix-extras\":\"1SdjF\",\"gl-matrix/mat3\":\"5XUpE\",\"gl-matrix/vec2\":\"ceSVb\",\"gl-matrix/vec3\":\"cAIcX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b1TWa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathArray = require(\"./math-array\");\nvar _mathArrayDefault = parcelHelpers.interopDefault(_mathArray);\nvar _validators = require(\"../../lib/validators\");\nvar _common = require(\"../../lib/common\");\nclass Matrix extends (0, _mathArrayDefault.default) {\n    toString() {\n        let string = \"[\";\n        if ((0, _common.config).printRowMajor) {\n            string += \"row-major:\";\n            for(let row = 0; row < this.RANK; ++row)for(let col = 0; col < this.RANK; ++col)string += \" \".concat(this[col * this.RANK + row]);\n        } else {\n            string += \"column-major:\";\n            for(let i = 0; i < this.ELEMENTS; ++i)string += \" \".concat(this[i]);\n        }\n        string += \"]\";\n        return string;\n    }\n    getElementIndex(row, col) {\n        return col * this.RANK + row;\n    }\n    getElement(row, col) {\n        return this[col * this.RANK + row];\n    }\n    setElement(row, col, value) {\n        this[col * this.RANK + row] = (0, _validators.checkNumber)(value);\n        return this;\n    }\n    getColumn(columnIndex, result = new Array(this.RANK).fill(-0)) {\n        const firstIndex = columnIndex * this.RANK;\n        for(let i = 0; i < this.RANK; ++i)result[i] = this[firstIndex + i];\n        return result;\n    }\n    setColumn(columnIndex, columnVector) {\n        const firstIndex = columnIndex * this.RANK;\n        for(let i = 0; i < this.RANK; ++i)this[firstIndex + i] = columnVector[i];\n        return this;\n    }\n}\nexports.default = Matrix;\n\n},{\"./math-array\":\"fDlnO\",\"../../lib/validators\":\"904Rf\",\"../../lib/common\":\"849uR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5XUpE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 3x3 Matrix\n * @module mat3\n */ /**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromMat4\", ()=>fromMat4);\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"identity\", ()=>identity);\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"transpose\", ()=>transpose);\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"invert\", ()=>invert);\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"adjoint\", ()=>adjoint);\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */ parcelHelpers.export(exports, \"determinant\", ()=>determinant);\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"translate\", ()=>translate);\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"rotate\", ()=>rotate);\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromTranslation\", ()=>fromTranslation);\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromRotation\", ()=>fromRotation);\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromScaling\", ()=>fromScaling);\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/ parcelHelpers.export(exports, \"fromMat2d\", ()=>fromMat2d);\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"fromQuat\", ()=>fromQuat);\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"normalFromMat4\", ()=>normalFromMat4);\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"projection\", ()=>projection);\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */ parcelHelpers.export(exports, \"frob\", ()=>frob);\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"multiplyScalar\", ()=>multiplyScalar);\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */ parcelHelpers.export(exports, \"multiplyScalarAndAdd\", ()=>multiplyScalarAndAdd);\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(9);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[5] = 0;\n        out[6] = 0;\n        out[7] = 0;\n    }\n    out[0] = 1;\n    out[4] = 1;\n    out[8] = 1;\n    return out;\n}\nfunction fromMat4(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[4];\n    out[4] = a[5];\n    out[5] = a[6];\n    out[6] = a[8];\n    out[7] = a[9];\n    out[8] = a[10];\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(9);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new _commonJs.ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n}\nfunction set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n}\nfunction identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction transpose(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a12 = a[5];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a01;\n        out[5] = a[7];\n        out[6] = a02;\n        out[7] = a12;\n    } else {\n        out[0] = a[0];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a[1];\n        out[4] = a[4];\n        out[5] = a[7];\n        out[6] = a[2];\n        out[7] = a[5];\n        out[8] = a[8];\n    }\n    return out;\n}\nfunction invert(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    var b01 = a22 * a11 - a12 * a21;\n    var b11 = -a22 * a10 + a12 * a20;\n    var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n    var det = a00 * b01 + a01 * b11 + a02 * b21;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = b01 * det;\n    out[1] = (-a22 * a01 + a02 * a21) * det;\n    out[2] = (a12 * a01 - a02 * a11) * det;\n    out[3] = b11 * det;\n    out[4] = (a22 * a00 - a02 * a20) * det;\n    out[5] = (-a12 * a00 + a02 * a10) * det;\n    out[6] = b21 * det;\n    out[7] = (-a21 * a00 + a01 * a20) * det;\n    out[8] = (a11 * a00 - a01 * a10) * det;\n    return out;\n}\nfunction adjoint(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    out[0] = a11 * a22 - a12 * a21;\n    out[1] = a02 * a21 - a01 * a22;\n    out[2] = a01 * a12 - a02 * a11;\n    out[3] = a12 * a20 - a10 * a22;\n    out[4] = a00 * a22 - a02 * a20;\n    out[5] = a02 * a10 - a00 * a12;\n    out[6] = a10 * a21 - a11 * a20;\n    out[7] = a01 * a20 - a00 * a21;\n    out[8] = a00 * a11 - a01 * a10;\n    return out;\n}\nfunction determinant(a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\nfunction multiply(out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2];\n    var a10 = a[3], a11 = a[4], a12 = a[5];\n    var a20 = a[6], a21 = a[7], a22 = a[8];\n    var b00 = b[0], b01 = b[1], b02 = b[2];\n    var b10 = b[3], b11 = b[4], b12 = b[5];\n    var b20 = b[6], b21 = b[7], b22 = b[8];\n    out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n    out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n    out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n    out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n    out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n    out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n    out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n    out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n    out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n    return out;\n}\nfunction translate(out, a, v) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], x = v[0], y = v[1];\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n    out[3] = a10;\n    out[4] = a11;\n    out[5] = a12;\n    out[6] = x * a00 + y * a10 + a20;\n    out[7] = x * a01 + y * a11 + a21;\n    out[8] = x * a02 + y * a12 + a22;\n    return out;\n}\nfunction rotate(out, a, rad) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a10 = a[3], a11 = a[4], a12 = a[5], a20 = a[6], a21 = a[7], a22 = a[8], s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c * a00 + s * a10;\n    out[1] = c * a01 + s * a11;\n    out[2] = c * a02 + s * a12;\n    out[3] = c * a10 - s * a00;\n    out[4] = c * a11 - s * a01;\n    out[5] = c * a12 - s * a02;\n    out[6] = a20;\n    out[7] = a21;\n    out[8] = a22;\n    return out;\n}\nfunction scale(out, a, v) {\n    var x = v[0], y = v[1];\n    out[0] = x * a[0];\n    out[1] = x * a[1];\n    out[2] = x * a[2];\n    out[3] = y * a[3];\n    out[4] = y * a[4];\n    out[5] = y * a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\nfunction fromTranslation(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = v[0];\n    out[7] = v[1];\n    out[8] = 1;\n    return out;\n}\nfunction fromRotation(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n    out[3] = -s;\n    out[4] = c;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction fromScaling(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = v[1];\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\nfunction fromMat2d(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = 0;\n    out[3] = a[2];\n    out[4] = a[3];\n    out[5] = 0;\n    out[6] = a[4];\n    out[7] = a[5];\n    out[8] = 1;\n    return out;\n}\nfunction fromQuat(out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var yx = y * x2;\n    var yy = y * y2;\n    var zx = z * x2;\n    var zy = z * y2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n    return out;\n}\nfunction normalFromMat4(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    return out;\n}\nfunction projection(out, width, height) {\n    out[0] = 2 / width;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = -2 / height;\n    out[5] = 0;\n    out[6] = -1;\n    out[7] = 1;\n    out[8] = 1;\n    return out;\n}\nfunction str(a) {\n    return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\nfunction frob(a) {\n    return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    return out;\n}\nfunction multiplyScalar(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    return out;\n}\nfunction multiplyScalarAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    out[2] = a[2] + b[2] * scale1;\n    out[3] = a[3] + b[3] * scale1;\n    out[4] = a[4] + b[4] * scale1;\n    out[5] = a[5] + b[5] * scale1;\n    out[6] = a[6] + b[6] * scale1;\n    out[7] = a[7] + b[7] * scale1;\n    out[8] = a[8] + b[8] * scale1;\n    return out;\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\nvar mul = multiply;\nvar sub = subtract;\n\n},{\"./common.js\":\"Li4u6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2ggmN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _matrix = require(\"./base/matrix\");\nvar _matrixDefault = parcelHelpers.interopDefault(_matrix);\nvar _validators = require(\"../lib/validators\");\nvar _glMatrixExtras = require(\"../lib/gl-matrix-extras\");\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _vec4 = require(\"gl-matrix/vec4\");\nvar INDICES;\n(function(INDICES1) {\n    INDICES1[INDICES1[\"COL0ROW0\"] = 0] = \"COL0ROW0\";\n    INDICES1[INDICES1[\"COL0ROW1\"] = 1] = \"COL0ROW1\";\n    INDICES1[INDICES1[\"COL0ROW2\"] = 2] = \"COL0ROW2\";\n    INDICES1[INDICES1[\"COL0ROW3\"] = 3] = \"COL0ROW3\";\n    INDICES1[INDICES1[\"COL1ROW0\"] = 4] = \"COL1ROW0\";\n    INDICES1[INDICES1[\"COL1ROW1\"] = 5] = \"COL1ROW1\";\n    INDICES1[INDICES1[\"COL1ROW2\"] = 6] = \"COL1ROW2\";\n    INDICES1[INDICES1[\"COL1ROW3\"] = 7] = \"COL1ROW3\";\n    INDICES1[INDICES1[\"COL2ROW0\"] = 8] = \"COL2ROW0\";\n    INDICES1[INDICES1[\"COL2ROW1\"] = 9] = \"COL2ROW1\";\n    INDICES1[INDICES1[\"COL2ROW2\"] = 10] = \"COL2ROW2\";\n    INDICES1[INDICES1[\"COL2ROW3\"] = 11] = \"COL2ROW3\";\n    INDICES1[INDICES1[\"COL3ROW0\"] = 12] = \"COL3ROW0\";\n    INDICES1[INDICES1[\"COL3ROW1\"] = 13] = \"COL3ROW1\";\n    INDICES1[INDICES1[\"COL3ROW2\"] = 14] = \"COL3ROW2\";\n    INDICES1[INDICES1[\"COL3ROW3\"] = 15] = \"COL3ROW3\";\n})(INDICES || (INDICES = {}));\nconst DEFAULT_FOVY = 45 * Math.PI / 180;\nconst DEFAULT_ASPECT = 1;\nconst DEFAULT_NEAR = 0.1;\nconst DEFAULT_FAR = 500;\nconst IDENTITY_MATRIX = Object.freeze([\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1\n]);\nclass Matrix4 extends (0, _matrixDefault.default) {\n    static get IDENTITY() {\n        return getIdentityMatrix();\n    }\n    static get ZERO() {\n        return getZeroMatrix();\n    }\n    get ELEMENTS() {\n        return 16;\n    }\n    get RANK() {\n        return 4;\n    }\n    get INDICES() {\n        return INDICES;\n    }\n    constructor(array){\n        super(-0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0);\n        if (arguments.length === 1 && Array.isArray(array)) this.copy(array);\n        else this.identity();\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = array[3];\n        this[4] = array[4];\n        this[5] = array[5];\n        this[6] = array[6];\n        this[7] = array[7];\n        this[8] = array[8];\n        this[9] = array[9];\n        this[10] = array[10];\n        this[11] = array[11];\n        this[12] = array[12];\n        this[13] = array[13];\n        this[14] = array[14];\n        this[15] = array[15];\n        return this.check();\n    }\n    set(m00, m10, m20, m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33) {\n        this[0] = m00;\n        this[1] = m10;\n        this[2] = m20;\n        this[3] = m30;\n        this[4] = m01;\n        this[5] = m11;\n        this[6] = m21;\n        this[7] = m31;\n        this[8] = m02;\n        this[9] = m12;\n        this[10] = m22;\n        this[11] = m32;\n        this[12] = m03;\n        this[13] = m13;\n        this[14] = m23;\n        this[15] = m33;\n        return this.check();\n    }\n    setRowMajor(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n        this[0] = m00;\n        this[1] = m10;\n        this[2] = m20;\n        this[3] = m30;\n        this[4] = m01;\n        this[5] = m11;\n        this[6] = m21;\n        this[7] = m31;\n        this[8] = m02;\n        this[9] = m12;\n        this[10] = m22;\n        this[11] = m32;\n        this[12] = m03;\n        this[13] = m13;\n        this[14] = m23;\n        this[15] = m33;\n        return this.check();\n    }\n    toRowMajor(result) {\n        result[0] = this[0];\n        result[1] = this[4];\n        result[2] = this[8];\n        result[3] = this[12];\n        result[4] = this[1];\n        result[5] = this[5];\n        result[6] = this[9];\n        result[7] = this[13];\n        result[8] = this[2];\n        result[9] = this[6];\n        result[10] = this[10];\n        result[11] = this[14];\n        result[12] = this[3];\n        result[13] = this[7];\n        result[14] = this[11];\n        result[15] = this[15];\n        return result;\n    }\n    identity() {\n        return this.copy(IDENTITY_MATRIX);\n    }\n    fromObject(object) {\n        return this.check();\n    }\n    fromQuaternion(quaternion) {\n        _mat4.fromQuat(this, quaternion);\n        return this.check();\n    }\n    frustum(view) {\n        const { left , right , bottom , top , near =DEFAULT_NEAR , far =DEFAULT_FAR  } = view;\n        if (far === Infinity) computeInfinitePerspectiveOffCenter(this, left, right, bottom, top, near);\n        else _mat4.frustum(this, left, right, bottom, top, near, far);\n        return this.check();\n    }\n    lookAt(view) {\n        const { eye , center =[\n            0,\n            0,\n            0\n        ] , up =[\n            0,\n            1,\n            0\n        ]  } = view;\n        _mat4.lookAt(this, eye, center, up);\n        return this.check();\n    }\n    ortho(view) {\n        const { left , right , bottom , top , near =DEFAULT_NEAR , far =DEFAULT_FAR  } = view;\n        _mat4.ortho(this, left, right, bottom, top, near, far);\n        return this.check();\n    }\n    orthographic(view) {\n        const { fovy =DEFAULT_FOVY , aspect =DEFAULT_ASPECT , focalDistance =1 , near =DEFAULT_NEAR , far =DEFAULT_FAR  } = view;\n        checkRadians(fovy);\n        const halfY = fovy / 2;\n        const top = focalDistance * Math.tan(halfY);\n        const right = top * aspect;\n        return this.ortho({\n            left: -right,\n            right,\n            bottom: -top,\n            top,\n            near,\n            far\n        });\n    }\n    perspective(view) {\n        const { fovy =45 * Math.PI / 180 , aspect =1 , near =0.1 , far =500  } = view;\n        checkRadians(fovy);\n        _mat4.perspective(this, fovy, aspect, near, far);\n        return this.check();\n    }\n    determinant() {\n        return _mat4.determinant(this);\n    }\n    getScale(result = [\n        -0,\n        -0,\n        -0\n    ]) {\n        result[0] = Math.sqrt(this[0] * this[0] + this[1] * this[1] + this[2] * this[2]);\n        result[1] = Math.sqrt(this[4] * this[4] + this[5] * this[5] + this[6] * this[6]);\n        result[2] = Math.sqrt(this[8] * this[8] + this[9] * this[9] + this[10] * this[10]);\n        return result;\n    }\n    getTranslation(result = [\n        -0,\n        -0,\n        -0\n    ]) {\n        result[0] = this[12];\n        result[1] = this[13];\n        result[2] = this[14];\n        return result;\n    }\n    getRotation(result, scaleResult) {\n        result = result || [\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0\n        ];\n        scaleResult = scaleResult || [\n            -0,\n            -0,\n            -0\n        ];\n        const scale = this.getScale(scaleResult);\n        const inverseScale0 = 1 / scale[0];\n        const inverseScale1 = 1 / scale[1];\n        const inverseScale2 = 1 / scale[2];\n        result[0] = this[0] * inverseScale0;\n        result[1] = this[1] * inverseScale1;\n        result[2] = this[2] * inverseScale2;\n        result[3] = 0;\n        result[4] = this[4] * inverseScale0;\n        result[5] = this[5] * inverseScale1;\n        result[6] = this[6] * inverseScale2;\n        result[7] = 0;\n        result[8] = this[8] * inverseScale0;\n        result[9] = this[9] * inverseScale1;\n        result[10] = this[10] * inverseScale2;\n        result[11] = 0;\n        result[12] = 0;\n        result[13] = 0;\n        result[14] = 0;\n        result[15] = 1;\n        return result;\n    }\n    getRotationMatrix3(result, scaleResult) {\n        result = result || [\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0\n        ];\n        scaleResult = scaleResult || [\n            -0,\n            -0,\n            -0\n        ];\n        const scale = this.getScale(scaleResult);\n        const inverseScale0 = 1 / scale[0];\n        const inverseScale1 = 1 / scale[1];\n        const inverseScale2 = 1 / scale[2];\n        result[0] = this[0] * inverseScale0;\n        result[1] = this[1] * inverseScale1;\n        result[2] = this[2] * inverseScale2;\n        result[3] = this[4] * inverseScale0;\n        result[4] = this[5] * inverseScale1;\n        result[5] = this[6] * inverseScale2;\n        result[6] = this[8] * inverseScale0;\n        result[7] = this[9] * inverseScale1;\n        result[8] = this[10] * inverseScale2;\n        return result;\n    }\n    transpose() {\n        _mat4.transpose(this, this);\n        return this.check();\n    }\n    invert() {\n        _mat4.invert(this, this);\n        return this.check();\n    }\n    multiplyLeft(a) {\n        _mat4.multiply(this, a, this);\n        return this.check();\n    }\n    multiplyRight(a) {\n        _mat4.multiply(this, this, a);\n        return this.check();\n    }\n    rotateX(radians) {\n        _mat4.rotateX(this, this, radians);\n        return this.check();\n    }\n    rotateY(radians) {\n        _mat4.rotateY(this, this, radians);\n        return this.check();\n    }\n    rotateZ(radians) {\n        _mat4.rotateZ(this, this, radians);\n        return this.check();\n    }\n    rotateXYZ(angleXYZ) {\n        return this.rotateX(angleXYZ[0]).rotateY(angleXYZ[1]).rotateZ(angleXYZ[2]);\n    }\n    rotateAxis(radians, axis) {\n        _mat4.rotate(this, this, radians, axis);\n        return this.check();\n    }\n    scale(factor) {\n        _mat4.scale(this, this, Array.isArray(factor) ? factor : [\n            factor,\n            factor,\n            factor\n        ]);\n        return this.check();\n    }\n    translate(vector) {\n        _mat4.translate(this, this, vector);\n        return this.check();\n    }\n    transform(vector, result) {\n        if (vector.length === 4) {\n            result = _vec4.transformMat4(result || [\n                -0,\n                -0,\n                -0,\n                -0\n            ], vector, this);\n            (0, _validators.checkVector)(result, 4);\n            return result;\n        }\n        return this.transformAsPoint(vector, result);\n    }\n    transformAsPoint(vector, result) {\n        const { length  } = vector;\n        let out;\n        switch(length){\n            case 2:\n                out = _vec2.transformMat4(result || [\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            case 3:\n                out = _vec3.transformMat4(result || [\n                    -0,\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            default:\n                throw new Error(\"Illegal vector\");\n        }\n        (0, _validators.checkVector)(out, vector.length);\n        return out;\n    }\n    transformAsVector(vector, result) {\n        let out;\n        switch(vector.length){\n            case 2:\n                out = (0, _glMatrixExtras.vec2_transformMat4AsVector)(result || [\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            case 3:\n                out = (0, _glMatrixExtras.vec3_transformMat4AsVector)(result || [\n                    -0,\n                    -0,\n                    -0\n                ], vector, this);\n                break;\n            default:\n                throw new Error(\"Illegal vector\");\n        }\n        (0, _validators.checkVector)(out, vector.length);\n        return out;\n    }\n    transformPoint(vector, result) {\n        return this.transformAsPoint(vector, result);\n    }\n    transformVector(vector, result) {\n        return this.transformAsPoint(vector, result);\n    }\n    transformDirection(vector, result) {\n        return this.transformAsVector(vector, result);\n    }\n    makeRotationX(radians) {\n        return this.identity().rotateX(radians);\n    }\n    makeTranslation(x, y, z) {\n        return this.identity().translate([\n            x,\n            y,\n            z\n        ]);\n    }\n}\nexports.default = Matrix4;\nlet ZERO;\nlet IDENTITY;\nfunction getZeroMatrix() {\n    if (!ZERO) {\n        ZERO = new Matrix4([\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0\n        ]);\n        Object.freeze(ZERO);\n    }\n    return ZERO;\n}\nfunction getIdentityMatrix() {\n    if (!IDENTITY) {\n        IDENTITY = new Matrix4();\n        Object.freeze(IDENTITY);\n    }\n    return IDENTITY;\n}\nfunction checkRadians(possiblyDegrees) {\n    if (possiblyDegrees > Math.PI * 2) throw Error(\"expected radians\");\n}\nfunction computeInfinitePerspectiveOffCenter(result, left, right, bottom, top, near) {\n    const column0Row0 = 2 * near / (right - left);\n    const column1Row1 = 2 * near / (top - bottom);\n    const column2Row0 = (right + left) / (right - left);\n    const column2Row1 = (top + bottom) / (top - bottom);\n    const column2Row2 = -1;\n    const column2Row3 = -1;\n    const column3Row2 = -2 * near;\n    result[0] = column0Row0;\n    result[1] = 0;\n    result[2] = 0;\n    result[3] = 0;\n    result[4] = 0;\n    result[5] = column1Row1;\n    result[6] = 0;\n    result[7] = 0;\n    result[8] = column2Row0;\n    result[9] = column2Row1;\n    result[10] = column2Row2;\n    result[11] = column2Row3;\n    result[12] = 0;\n    result[13] = 0;\n    result[14] = column3Row2;\n    result[15] = 0;\n    return result;\n}\n\n},{\"./base/matrix\":\"b1TWa\",\"../lib/validators\":\"904Rf\",\"../lib/gl-matrix-extras\":\"1SdjF\",\"gl-matrix/mat4\":\"jn7Bp\",\"gl-matrix/vec2\":\"ceSVb\",\"gl-matrix/vec3\":\"cAIcX\",\"gl-matrix/vec4\":\"czCsm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jn7Bp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */ /**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"identity\", ()=>identity);\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"transpose\", ()=>transpose);\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"invert\", ()=>invert);\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"adjoint\", ()=>adjoint);\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */ parcelHelpers.export(exports, \"determinant\", ()=>determinant);\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"translate\", ()=>translate);\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"rotate\", ()=>rotate);\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"rotateX\", ()=>rotateX);\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"rotateY\", ()=>rotateY);\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"rotateZ\", ()=>rotateZ);\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromTranslation\", ()=>fromTranslation);\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromScaling\", ()=>fromScaling);\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromRotation\", ()=>fromRotation);\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromXRotation\", ()=>fromXRotation);\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromYRotation\", ()=>fromYRotation);\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromZRotation\", ()=>fromZRotation);\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromRotationTranslation\", ()=>fromRotationTranslation);\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */ parcelHelpers.export(exports, \"fromQuat2\", ()=>fromQuat2);\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */ parcelHelpers.export(exports, \"getTranslation\", ()=>getTranslation);\n/**\n * Returns the scaling factor component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslationScale\n *  with a normalized Quaternion paramter, the returned vector will be\n *  the same as the scaling vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive scaling factor component\n * @param  {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */ parcelHelpers.export(exports, \"getScaling\", ()=>getScaling);\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */ parcelHelpers.export(exports, \"getRotation\", ()=>getRotation);\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromRotationTranslationScale\", ()=>fromRotationTranslationScale);\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     mat4.translate(dest, origin);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *     mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromRotationTranslationScaleOrigin\", ()=>fromRotationTranslationScaleOrigin);\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"fromQuat\", ()=>fromQuat);\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"frustum\", ()=>frustum);\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"perspectiveNO\", ()=>perspectiveNO);\nparcelHelpers.export(exports, \"perspective\", ()=>perspective);\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"perspectiveZO\", ()=>perspectiveZO);\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"perspectiveFromFieldOfView\", ()=>perspectiveFromFieldOfView);\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"orthoNO\", ()=>orthoNO);\nparcelHelpers.export(exports, \"ortho\", ()=>ortho);\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"orthoZO\", ()=>orthoZO);\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"lookAt\", ()=>lookAt);\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"targetTo\", ()=>targetTo);\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */ parcelHelpers.export(exports, \"frob\", ()=>frob);\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"multiplyScalar\", ()=>multiplyScalar);\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */ parcelHelpers.export(exports, \"multiplyScalarAndAdd\", ()=>multiplyScalarAndAdd);\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(16);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n        out[4] = 0;\n        out[6] = 0;\n        out[7] = 0;\n        out[8] = 0;\n        out[9] = 0;\n        out[11] = 0;\n        out[12] = 0;\n        out[13] = 0;\n        out[14] = 0;\n    }\n    out[0] = 1;\n    out[5] = 1;\n    out[10] = 1;\n    out[15] = 1;\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(16);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new _commonJs.ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n}\nfunction set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n}\nfunction identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction transpose(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a03 = a[3];\n        var a12 = a[6], a13 = a[7];\n        var a23 = a[11];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a01;\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a02;\n        out[9] = a12;\n        out[11] = a[14];\n        out[12] = a03;\n        out[13] = a13;\n        out[14] = a23;\n    } else {\n        out[0] = a[0];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a[1];\n        out[5] = a[5];\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a[2];\n        out[9] = a[6];\n        out[10] = a[10];\n        out[11] = a[14];\n        out[12] = a[3];\n        out[13] = a[7];\n        out[14] = a[11];\n        out[15] = a[15];\n    }\n    return out;\n}\nfunction invert(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) return null;\n    det = 1.0 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n    return out;\n}\nfunction adjoint(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n    out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n    out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n    out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n    out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n    out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n    out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n    out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n    out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n    out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n    out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n    out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n    out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n    out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n    out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n    out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n    return out;\n}\nfunction determinant(a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n    return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\nfunction multiply(out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];\n    var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];\n    var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];\n    var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; // Cache only the current line of the second matrix\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[4];\n    b1 = b[5];\n    b2 = b[6];\n    b3 = b[7];\n    out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[8];\n    b1 = b[9];\n    b2 = b[10];\n    b3 = b[11];\n    out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    b0 = b[12];\n    b1 = b[13];\n    b2 = b[14];\n    b3 = b[15];\n    out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    return out;\n}\nfunction translate(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n        a00 = a[0];\n        a01 = a[1];\n        a02 = a[2];\n        a03 = a[3];\n        a10 = a[4];\n        a11 = a[5];\n        a12 = a[6];\n        a13 = a[7];\n        a20 = a[8];\n        a21 = a[9];\n        a22 = a[10];\n        a23 = a[11];\n        out[0] = a00;\n        out[1] = a01;\n        out[2] = a02;\n        out[3] = a03;\n        out[4] = a10;\n        out[5] = a11;\n        out[6] = a12;\n        out[7] = a13;\n        out[8] = a20;\n        out[9] = a21;\n        out[10] = a22;\n        out[11] = a23;\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n    return out;\n}\nfunction scale(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n    out[0] = a[0] * x;\n    out[1] = a[1] * x;\n    out[2] = a[2] * x;\n    out[3] = a[3] * x;\n    out[4] = a[4] * y;\n    out[5] = a[5] * y;\n    out[6] = a[6] * y;\n    out[7] = a[7] * y;\n    out[8] = a[8] * z;\n    out[9] = a[9] * z;\n    out[10] = a[10] * z;\n    out[11] = a[11] * z;\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\nfunction rotate(out, a, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2];\n    var len = Math.hypot(x, y, z);\n    var s, c, t;\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    var b00, b01, b02;\n    var b10, b11, b12;\n    var b20, b21, b22;\n    if (len < _commonJs.EPSILON) return null;\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n    a00 = a[0];\n    a01 = a[1];\n    a02 = a[2];\n    a03 = a[3];\n    a10 = a[4];\n    a11 = a[5];\n    a12 = a[6];\n    a13 = a[7];\n    a20 = a[8];\n    a21 = a[9];\n    a22 = a[10];\n    a23 = a[11]; // Construct the elements of the rotation matrix\n    b00 = x * x * t + c;\n    b01 = y * x * t + z * s;\n    b02 = z * x * t - y * s;\n    b10 = x * y * t - z * s;\n    b11 = y * y * t + c;\n    b12 = z * y * t + x * s;\n    b20 = x * z * t + y * s;\n    b21 = y * z * t - x * s;\n    b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n    out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n    out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n    out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n    out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n    out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n    out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n    out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n    out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n    out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n    out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n    out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n    out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged last row\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    return out;\n}\nfunction rotateX(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a10 = a[4];\n    var a11 = a[5];\n    var a12 = a[6];\n    var a13 = a[7];\n    var a20 = a[8];\n    var a21 = a[9];\n    var a22 = a[10];\n    var a23 = a[11];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged rows\n        out[0] = a[0];\n        out[1] = a[1];\n        out[2] = a[2];\n        out[3] = a[3];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    } // Perform axis-specific matrix multiplication\n    out[4] = a10 * c + a20 * s;\n    out[5] = a11 * c + a21 * s;\n    out[6] = a12 * c + a22 * s;\n    out[7] = a13 * c + a23 * s;\n    out[8] = a20 * c - a10 * s;\n    out[9] = a21 * c - a11 * s;\n    out[10] = a22 * c - a12 * s;\n    out[11] = a23 * c - a13 * s;\n    return out;\n}\nfunction rotateY(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a00 = a[0];\n    var a01 = a[1];\n    var a02 = a[2];\n    var a03 = a[3];\n    var a20 = a[8];\n    var a21 = a[9];\n    var a22 = a[10];\n    var a23 = a[11];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged rows\n        out[4] = a[4];\n        out[5] = a[5];\n        out[6] = a[6];\n        out[7] = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    } // Perform axis-specific matrix multiplication\n    out[0] = a00 * c - a20 * s;\n    out[1] = a01 * c - a21 * s;\n    out[2] = a02 * c - a22 * s;\n    out[3] = a03 * c - a23 * s;\n    out[8] = a00 * s + a20 * c;\n    out[9] = a01 * s + a21 * c;\n    out[10] = a02 * s + a22 * c;\n    out[11] = a03 * s + a23 * c;\n    return out;\n}\nfunction rotateZ(out, a, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad);\n    var a00 = a[0];\n    var a01 = a[1];\n    var a02 = a[2];\n    var a03 = a[3];\n    var a10 = a[4];\n    var a11 = a[5];\n    var a12 = a[6];\n    var a13 = a[7];\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged last row\n        out[8] = a[8];\n        out[9] = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    } // Perform axis-specific matrix multiplication\n    out[0] = a00 * c + a10 * s;\n    out[1] = a01 * c + a11 * s;\n    out[2] = a02 * c + a12 * s;\n    out[3] = a03 * c + a13 * s;\n    out[4] = a10 * c - a00 * s;\n    out[5] = a11 * c - a01 * s;\n    out[6] = a12 * c - a02 * s;\n    out[7] = a13 * c - a03 * s;\n    return out;\n}\nfunction fromTranslation(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction fromScaling(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromRotation(out, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2];\n    var len = Math.hypot(x, y, z);\n    var s, c, t;\n    if (len < _commonJs.EPSILON) return null;\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c; // Perform rotation-specific matrix multiplication\n    out[0] = x * x * t + c;\n    out[1] = y * x * t + z * s;\n    out[2] = z * x * t - y * s;\n    out[3] = 0;\n    out[4] = x * y * t - z * s;\n    out[5] = y * y * t + c;\n    out[6] = z * y * t + x * s;\n    out[7] = 0;\n    out[8] = x * z * t + y * s;\n    out[9] = y * z * t - x * s;\n    out[10] = z * z * t + c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromXRotation(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = c;\n    out[6] = s;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = -s;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromYRotation(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n    out[0] = c;\n    out[1] = 0;\n    out[2] = -s;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = s;\n    out[9] = 0;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromZRotation(out, rad) {\n    var s = Math.sin(rad);\n    var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = -s;\n    out[5] = c;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction fromRotationTranslation(out, q, v) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - (yy + zz);\n    out[1] = xy + wz;\n    out[2] = xz - wy;\n    out[3] = 0;\n    out[4] = xy - wz;\n    out[5] = 1 - (xx + zz);\n    out[6] = yz + wx;\n    out[7] = 0;\n    out[8] = xz + wy;\n    out[9] = yz - wx;\n    out[10] = 1 - (xx + yy);\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction fromQuat2(out, a) {\n    var translation = new _commonJs.ARRAY_TYPE(3);\n    var bx = -a[0], by = -a[1], bz = -a[2], bw = a[3], ax = a[4], ay = a[5], az = a[6], aw = a[7];\n    var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n    if (magnitude > 0) {\n        translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n        translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n        translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n    } else {\n        translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n        translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n        translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n    }\n    fromRotationTranslation(out, a, translation);\n    return out;\n}\nfunction getTranslation(out, mat) {\n    out[0] = mat[12];\n    out[1] = mat[13];\n    out[2] = mat[14];\n    return out;\n}\nfunction getScaling(out, mat) {\n    var m11 = mat[0];\n    var m12 = mat[1];\n    var m13 = mat[2];\n    var m21 = mat[4];\n    var m22 = mat[5];\n    var m23 = mat[6];\n    var m31 = mat[8];\n    var m32 = mat[9];\n    var m33 = mat[10];\n    out[0] = Math.hypot(m11, m12, m13);\n    out[1] = Math.hypot(m21, m22, m23);\n    out[2] = Math.hypot(m31, m32, m33);\n    return out;\n}\nfunction getRotation(out, mat) {\n    var scaling = new _commonJs.ARRAY_TYPE(3);\n    getScaling(scaling, mat);\n    var is1 = 1 / scaling[0];\n    var is2 = 1 / scaling[1];\n    var is3 = 1 / scaling[2];\n    var sm11 = mat[0] * is1;\n    var sm12 = mat[1] * is2;\n    var sm13 = mat[2] * is3;\n    var sm21 = mat[4] * is1;\n    var sm22 = mat[5] * is2;\n    var sm23 = mat[6] * is3;\n    var sm31 = mat[8] * is1;\n    var sm32 = mat[9] * is2;\n    var sm33 = mat[10] * is3;\n    var trace = sm11 + sm22 + sm33;\n    var S = 0;\n    if (trace > 0) {\n        S = Math.sqrt(trace + 1.0) * 2;\n        out[3] = 0.25 * S;\n        out[0] = (sm23 - sm32) / S;\n        out[1] = (sm31 - sm13) / S;\n        out[2] = (sm12 - sm21) / S;\n    } else if (sm11 > sm22 && sm11 > sm33) {\n        S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n        out[3] = (sm23 - sm32) / S;\n        out[0] = 0.25 * S;\n        out[1] = (sm12 + sm21) / S;\n        out[2] = (sm31 + sm13) / S;\n    } else if (sm22 > sm33) {\n        S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n        out[3] = (sm31 - sm13) / S;\n        out[0] = (sm12 + sm21) / S;\n        out[1] = 0.25 * S;\n        out[2] = (sm23 + sm32) / S;\n    } else {\n        S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n        out[3] = (sm12 - sm21) / S;\n        out[0] = (sm31 + sm13) / S;\n        out[1] = (sm23 + sm32) / S;\n        out[2] = 0.25 * S;\n    }\n    return out;\n}\nfunction fromRotationTranslationScale(out, q, v, s) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz = s[2];\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz;\n    out[9] = (yz - wx) * sz;\n    out[10] = (1 - (xx + yy)) * sz;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var xy = x * y2;\n    var xz = x * z2;\n    var yy = y * y2;\n    var yz = y * z2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz = s[2];\n    var ox = o[0];\n    var oy = o[1];\n    var oz = o[2];\n    var out0 = (1 - (yy + zz)) * sx;\n    var out1 = (xy + wz) * sx;\n    var out2 = (xz - wy) * sx;\n    var out4 = (xy - wz) * sy;\n    var out5 = (1 - (xx + zz)) * sy;\n    var out6 = (yz + wx) * sy;\n    var out8 = (xz + wy) * sz;\n    var out9 = (yz - wx) * sz;\n    var out10 = (1 - (xx + yy)) * sz;\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = 0;\n    out[4] = out4;\n    out[5] = out5;\n    out[6] = out6;\n    out[7] = 0;\n    out[8] = out8;\n    out[9] = out9;\n    out[10] = out10;\n    out[11] = 0;\n    out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n    out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n    out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n    out[15] = 1;\n    return out;\n}\nfunction fromQuat(out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3];\n    var x2 = x + x;\n    var y2 = y + y;\n    var z2 = z + z;\n    var xx = x * x2;\n    var yx = y * x2;\n    var yy = y * y2;\n    var zx = z * x2;\n    var zy = z * y2;\n    var zz = z * z2;\n    var wx = w * x2;\n    var wy = w * y2;\n    var wz = w * z2;\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\nfunction frustum(out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left);\n    var tb = 1 / (top - bottom);\n    var nf = 1 / (near - far);\n    out[0] = near * 2 * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = near * 2 * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = far * near * 2 * nf;\n    out[15] = 0;\n    return out;\n}\nfunction perspectiveNO(out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2), nf;\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n        nf = 1 / (near - far);\n        out[10] = (far + near) * nf;\n        out[14] = 2 * far * near * nf;\n    } else {\n        out[10] = -1;\n        out[14] = -2 * near;\n    }\n    return out;\n}\nvar perspective = perspectiveNO;\nfunction perspectiveZO(out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2), nf;\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n        nf = 1 / (near - far);\n        out[10] = far * nf;\n        out[14] = far * near * nf;\n    } else {\n        out[10] = -1;\n        out[14] = -near;\n    }\n    return out;\n}\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n    var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n    var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n    var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n    var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n    var xScale = 2.0 / (leftTan + rightTan);\n    var yScale = 2.0 / (upTan + downTan);\n    out[0] = xScale;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    out[4] = 0.0;\n    out[5] = yScale;\n    out[6] = 0.0;\n    out[7] = 0.0;\n    out[8] = -((leftTan - rightTan) * xScale * 0.5);\n    out[9] = (upTan - downTan) * yScale * 0.5;\n    out[10] = far / (near - far);\n    out[11] = -1;\n    out[12] = 0.0;\n    out[13] = 0.0;\n    out[14] = far * near / (near - far);\n    out[15] = 0.0;\n    return out;\n}\nfunction orthoNO(out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right);\n    var bt = 1 / (bottom - top);\n    var nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 2 * nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = (far + near) * nf;\n    out[15] = 1;\n    return out;\n}\nvar ortho = orthoNO;\nfunction orthoZO(out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right);\n    var bt = 1 / (bottom - top);\n    var nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = near * nf;\n    out[15] = 1;\n    return out;\n}\nfunction lookAt(out, eye, center, up) {\n    var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n    var eyex = eye[0];\n    var eyey = eye[1];\n    var eyez = eye[2];\n    var upx = up[0];\n    var upy = up[1];\n    var upz = up[2];\n    var centerx = center[0];\n    var centery = center[1];\n    var centerz = center[2];\n    if (Math.abs(eyex - centerx) < _commonJs.EPSILON && Math.abs(eyey - centery) < _commonJs.EPSILON && Math.abs(eyez - centerz) < _commonJs.EPSILON) return identity(out);\n    z0 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n    len = 1 / Math.hypot(z0, z1, z2);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n    x0 = upy * z2 - upz * z1;\n    x1 = upz * z0 - upx * z2;\n    x2 = upx * z1 - upy * z0;\n    len = Math.hypot(x0, x1, x2);\n    if (!len) {\n        x0 = 0;\n        x1 = 0;\n        x2 = 0;\n    } else {\n        len = 1 / len;\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n    y0 = z1 * x2 - z2 * x1;\n    y1 = z2 * x0 - z0 * x2;\n    y2 = z0 * x1 - z1 * x0;\n    len = Math.hypot(y0, y1, y2);\n    if (!len) {\n        y0 = 0;\n        y1 = 0;\n        y2 = 0;\n    } else {\n        len = 1 / len;\n        y0 *= len;\n        y1 *= len;\n        y2 *= len;\n    }\n    out[0] = x0;\n    out[1] = y0;\n    out[2] = z0;\n    out[3] = 0;\n    out[4] = x1;\n    out[5] = y1;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n    out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n    out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n    return out;\n}\nfunction targetTo(out, eye, target, up) {\n    var eyex = eye[0], eyey = eye[1], eyez = eye[2], upx = up[0], upy = up[1], upz = up[2];\n    var z0 = eyex - target[0], z1 = eyey - target[1], z2 = eyez - target[2];\n    var len = z0 * z0 + z1 * z1 + z2 * z2;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        z0 *= len;\n        z1 *= len;\n        z2 *= len;\n    }\n    var x0 = upy * z2 - upz * z1, x1 = upz * z0 - upx * z2, x2 = upx * z1 - upy * z0;\n    len = x0 * x0 + x1 * x1 + x2 * x2;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n    out[0] = x0;\n    out[1] = x1;\n    out[2] = x2;\n    out[3] = 0;\n    out[4] = z1 * x2 - z2 * x1;\n    out[5] = z2 * x0 - z0 * x2;\n    out[6] = z0 * x1 - z1 * x0;\n    out[7] = 0;\n    out[8] = z0;\n    out[9] = z1;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = eyex;\n    out[13] = eyey;\n    out[14] = eyez;\n    out[15] = 1;\n    return out;\n}\nfunction str(a) {\n    return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\nfunction frob(a) {\n    return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    out[9] = a[9] + b[9];\n    out[10] = a[10] + b[10];\n    out[11] = a[11] + b[11];\n    out[12] = a[12] + b[12];\n    out[13] = a[13] + b[13];\n    out[14] = a[14] + b[14];\n    out[15] = a[15] + b[15];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    out[9] = a[9] - b[9];\n    out[10] = a[10] - b[10];\n    out[11] = a[11] - b[11];\n    out[12] = a[12] - b[12];\n    out[13] = a[13] - b[13];\n    out[14] = a[14] - b[14];\n    out[15] = a[15] - b[15];\n    return out;\n}\nfunction multiplyScalar(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    out[9] = a[9] * b;\n    out[10] = a[10] * b;\n    out[11] = a[11] * b;\n    out[12] = a[12] * b;\n    out[13] = a[13] * b;\n    out[14] = a[14] * b;\n    out[15] = a[15] * b;\n    return out;\n}\nfunction multiplyScalarAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    out[2] = a[2] + b[2] * scale1;\n    out[3] = a[3] + b[3] * scale1;\n    out[4] = a[4] + b[4] * scale1;\n    out[5] = a[5] + b[5] * scale1;\n    out[6] = a[6] + b[6] * scale1;\n    out[7] = a[7] + b[7] * scale1;\n    out[8] = a[8] + b[8] * scale1;\n    out[9] = a[9] + b[9] * scale1;\n    out[10] = a[10] + b[10] * scale1;\n    out[11] = a[11] + b[11] * scale1;\n    out[12] = a[12] + b[12] * scale1;\n    out[13] = a[13] + b[13] * scale1;\n    out[14] = a[14] + b[14] * scale1;\n    out[15] = a[15] + b[15] * scale1;\n    return out;\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7];\n    var a8 = a[8], a9 = a[9], a10 = a[10], a11 = a[11];\n    var a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    var b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7];\n    var b8 = b[8], b9 = b[9], b10 = b[10], b11 = b[11];\n    var b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\nvar mul = multiply;\nvar sub = subtract;\n\n},{\"./common.js\":\"Li4u6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"czCsm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * 4 Dimensional Vector\n * @module vec4\n */ /**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */ parcelHelpers.export(exports, \"clone\", ()=>clone);\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */ parcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"copy\", ()=>copy);\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"set\", ()=>set);\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"add\", ()=>add);\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"subtract\", ()=>subtract);\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"divide\", ()=>divide);\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"ceil\", ()=>ceil);\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"floor\", ()=>floor);\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"min\", ()=>min);\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"max\", ()=>max);\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"round\", ()=>round);\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"scale\", ()=>scale);\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"scaleAndAdd\", ()=>scaleAndAdd);\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */ parcelHelpers.export(exports, \"distance\", ()=>distance);\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */ parcelHelpers.export(exports, \"squaredDistance\", ()=>squaredDistance);\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */ parcelHelpers.export(exports, \"length\", ()=>length);\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */ parcelHelpers.export(exports, \"squaredLength\", ()=>squaredLength);\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"negate\", ()=>negate);\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"inverse\", ()=>inverse);\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"normalize\", ()=>normalize);\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */ parcelHelpers.export(exports, \"dot\", ()=>dot);\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */ parcelHelpers.export(exports, \"cross\", ()=>cross);\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"lerp\", ()=>lerp);\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"random\", ()=>random);\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"transformMat4\", ()=>transformMat4);\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"transformQuat\", ()=>transformQuat);\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */ parcelHelpers.export(exports, \"zero\", ()=>zero);\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */ parcelHelpers.export(exports, \"str\", ()=>str);\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */ parcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"sub\", ()=>sub);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"div\", ()=>div);\nparcelHelpers.export(exports, \"dist\", ()=>dist);\nparcelHelpers.export(exports, \"sqrDist\", ()=>sqrDist);\nparcelHelpers.export(exports, \"len\", ()=>len);\nparcelHelpers.export(exports, \"sqrLen\", ()=>sqrLen);\nparcelHelpers.export(exports, \"forEach\", ()=>forEach);\nvar _commonJs = require(\"./common.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(4);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 0;\n    }\n    return out;\n}\nfunction clone(a) {\n    var out = new _commonJs.ARRAY_TYPE(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction fromValues(x, y, z, w) {\n    var out = new _commonJs.ARRAY_TYPE(4);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n}\nfunction copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction set(out, x, y, z, w) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n}\nfunction add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n}\nfunction subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n}\nfunction multiply(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    out[3] = a[3] * b[3];\n    return out;\n}\nfunction divide(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    out[3] = a[3] / b[3];\n    return out;\n}\nfunction ceil(out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    out[3] = Math.ceil(a[3]);\n    return out;\n}\nfunction floor(out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    out[3] = Math.floor(a[3]);\n    return out;\n}\nfunction min(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    out[3] = Math.min(a[3], b[3]);\n    return out;\n}\nfunction max(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    out[3] = Math.max(a[3], b[3]);\n    return out;\n}\nfunction round(out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    out[3] = Math.round(a[3]);\n    return out;\n}\nfunction scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n}\nfunction scaleAndAdd(out, a, b, scale1) {\n    out[0] = a[0] + b[0] * scale1;\n    out[1] = a[1] + b[1] * scale1;\n    out[2] = a[2] + b[2] * scale1;\n    out[3] = a[3] + b[3] * scale1;\n    return out;\n}\nfunction distance(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    var w = b[3] - a[3];\n    return Math.hypot(x, y, z, w);\n}\nfunction squaredDistance(a, b) {\n    var x = b[0] - a[0];\n    var y = b[1] - a[1];\n    var z = b[2] - a[2];\n    var w = b[3] - a[3];\n    return x * x + y * y + z * z + w * w;\n}\nfunction length(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    return Math.hypot(x, y, z, w);\n}\nfunction squaredLength(a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    return x * x + y * y + z * z + w * w;\n}\nfunction negate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = -a[3];\n    return out;\n}\nfunction inverse(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    out[2] = 1.0 / a[2];\n    out[3] = 1.0 / a[3];\n    return out;\n}\nfunction normalize(out, a) {\n    var x = a[0];\n    var y = a[1];\n    var z = a[2];\n    var w = a[3];\n    var len1 = x * x + y * y + z * z + w * w;\n    if (len1 > 0) len1 = 1 / Math.sqrt(len1);\n    out[0] = x * len1;\n    out[1] = y * len1;\n    out[2] = z * len1;\n    out[3] = w * len1;\n    return out;\n}\nfunction dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\nfunction cross(out, u, v, w) {\n    var A = v[0] * w[1] - v[1] * w[0], B = v[0] * w[2] - v[2] * w[0], C = v[0] * w[3] - v[3] * w[0], D = v[1] * w[2] - v[2] * w[1], E = v[1] * w[3] - v[3] * w[1], F = v[2] * w[3] - v[3] * w[2];\n    var G = u[0];\n    var H = u[1];\n    var I = u[2];\n    var J = u[3];\n    out[0] = H * F - I * E + J * D;\n    out[1] = -(G * F) + I * C - J * B;\n    out[2] = G * E - H * C + J * A;\n    out[3] = -(G * D) + H * B - I * A;\n    return out;\n}\nfunction lerp(out, a, b, t) {\n    var ax = a[0];\n    var ay = a[1];\n    var az = a[2];\n    var aw = a[3];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    out[3] = aw + t * (b[3] - aw);\n    return out;\n}\nfunction random(out, scale2) {\n    scale2 = scale2 || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n    // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n    // http://projecteuclid.org/euclid.aoms/1177692644;\n    var v1, v2, v3, v4;\n    var s1, s2;\n    do {\n        v1 = _commonJs.RANDOM() * 2 - 1;\n        v2 = _commonJs.RANDOM() * 2 - 1;\n        s1 = v1 * v1 + v2 * v2;\n    }while (s1 >= 1);\n    do {\n        v3 = _commonJs.RANDOM() * 2 - 1;\n        v4 = _commonJs.RANDOM() * 2 - 1;\n        s2 = v3 * v3 + v4 * v4;\n    }while (s2 >= 1);\n    var d = Math.sqrt((1 - s1) / s2);\n    out[0] = scale2 * v1;\n    out[1] = scale2 * v2;\n    out[2] = scale2 * v3 * d;\n    out[3] = scale2 * v4 * d;\n    return out;\n}\nfunction transformMat4(out, a, m) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n    out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n    out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n    out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n    return out;\n}\nfunction transformQuat(out, a, q) {\n    var x = a[0], y = a[1], z = a[2];\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3]; // calculate quat * vec\n    var ix = qw * x + qy * z - qz * y;\n    var iy = qw * y + qz * x - qx * z;\n    var iz = qw * z + qx * y - qy * x;\n    var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    out[3] = a[3];\n    return out;\n}\nfunction zero(out) {\n    out[0] = 0.0;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    return out;\n}\nfunction str(a) {\n    return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\nfunction exactEquals(a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\nfunction equals(a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return Math.abs(a0 - b0) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= _commonJs.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\nvar sub = subtract;\nvar mul = multiply;\nvar div = divide;\nvar dist = distance;\nvar sqrDist = squaredDistance;\nvar len = length;\nvar sqrLen = squaredLength;\nvar forEach = function() {\n    var vec = create();\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if (!stride) stride = 4;\n        if (!offset) offset = 0;\n        if (count) l = Math.min(count * stride + offset, a.length);\n        else l = a.length;\n        for(i = offset; i < l; i += stride){\n            vec[0] = a[i];\n            vec[1] = a[i + 1];\n            vec[2] = a[i + 2];\n            vec[3] = a[i + 3];\n            fn(vec, vec, arg);\n            a[i] = vec[0];\n            a[i + 1] = vec[1];\n            a[i + 2] = vec[2];\n            a[i + 3] = vec[3];\n        }\n        return a;\n    };\n}();\n\n},{\"./common.js\":\"Li4u6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lx9bC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathArray = require(\"./base/math-array\");\nvar _mathArrayDefault = parcelHelpers.interopDefault(_mathArray);\nvar _validators = require(\"../lib/validators\");\nvar _vector4 = require(\"./vector4\");\nvar _vector4Default = parcelHelpers.interopDefault(_vector4);\nvar _quat = require(\"gl-matrix/quat\");\nvar _vec4 = require(\"gl-matrix/vec4\");\nconst IDENTITY_QUATERNION = [\n    0,\n    0,\n    0,\n    1\n];\nclass Quaternion extends (0, _mathArrayDefault.default) {\n    constructor(x = 0, y = 0, z = 0, w = 1){\n        super(-0, -0, -0, -0);\n        if (Array.isArray(x) && arguments.length === 1) this.copy(x);\n        else this.set(x, y, z, w);\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = array[3];\n        return this.check();\n    }\n    set(x, y, z, w) {\n        this[0] = x;\n        this[1] = y;\n        this[2] = z;\n        this[3] = w;\n        return this.check();\n    }\n    fromObject(object) {\n        this[0] = object.x;\n        this[1] = object.y;\n        this[2] = object.z;\n        this[3] = object.w;\n        return this.check();\n    }\n    fromMatrix3(m) {\n        _quat.fromMat3(this, m);\n        return this.check();\n    }\n    fromAxisRotation(axis, rad) {\n        _quat.setAxisAngle(this, axis, rad);\n        return this.check();\n    }\n    identity() {\n        _quat.identity(this);\n        return this.check();\n    }\n    setAxisAngle(axis, rad) {\n        return this.fromAxisRotation(axis, rad);\n    }\n    get ELEMENTS() {\n        return 4;\n    }\n    get x() {\n        return this[0];\n    }\n    set x(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get y() {\n        return this[1];\n    }\n    set y(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get z() {\n        return this[2];\n    }\n    set z(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get w() {\n        return this[3];\n    }\n    set w(value) {\n        this[3] = (0, _validators.checkNumber)(value);\n    }\n    len() {\n        return _quat.length(this);\n    }\n    lengthSquared() {\n        return _quat.squaredLength(this);\n    }\n    dot(a) {\n        return _quat.dot(this, a);\n    }\n    rotationTo(vectorA, vectorB) {\n        _quat.rotationTo(this, vectorA, vectorB);\n        return this.check();\n    }\n    add(a) {\n        _quat.add(this, this, a);\n        return this.check();\n    }\n    calculateW() {\n        _quat.calculateW(this, this);\n        return this.check();\n    }\n    conjugate() {\n        _quat.conjugate(this, this);\n        return this.check();\n    }\n    invert() {\n        _quat.invert(this, this);\n        return this.check();\n    }\n    lerp(a, b, t) {\n        if (t === undefined) return this.lerp(this, a, b);\n        _quat.lerp(this, a, b, t);\n        return this.check();\n    }\n    multiplyRight(a) {\n        _quat.multiply(this, this, a);\n        return this.check();\n    }\n    multiplyLeft(a) {\n        _quat.multiply(this, a, this);\n        return this.check();\n    }\n    normalize() {\n        const length = this.len();\n        const l = length > 0 ? 1 / length : 0;\n        this[0] = this[0] * l;\n        this[1] = this[1] * l;\n        this[2] = this[2] * l;\n        this[3] = this[3] * l;\n        if (length === 0) this[3] = 1;\n        return this.check();\n    }\n    rotateX(rad) {\n        _quat.rotateX(this, this, rad);\n        return this.check();\n    }\n    rotateY(rad) {\n        _quat.rotateY(this, this, rad);\n        return this.check();\n    }\n    rotateZ(rad) {\n        _quat.rotateZ(this, this, rad);\n        return this.check();\n    }\n    scale(b) {\n        _quat.scale(this, this, b);\n        return this.check();\n    }\n    slerp(arg0, arg1, arg2) {\n        let start;\n        let target;\n        let ratio;\n        switch(arguments.length){\n            case 1:\n                ({ start =IDENTITY_QUATERNION , target , ratio  } = arg0);\n                break;\n            case 2:\n                start = this;\n                target = arg0;\n                ratio = arg1;\n                break;\n            default:\n                start = arg0;\n                target = arg1;\n                ratio = arg2;\n        }\n        _quat.slerp(this, start, target, ratio);\n        return this.check();\n    }\n    transformVector4(vector, result = new (0, _vector4Default.default)()) {\n        _vec4.transformQuat(result, vector, this);\n        return (0, _validators.checkVector)(result, 4);\n    }\n    lengthSq() {\n        return this.lengthSquared();\n    }\n    setFromAxisAngle(axis, rad) {\n        return this.setAxisAngle(axis, rad);\n    }\n    premultiply(a) {\n        return this.multiplyLeft(a);\n    }\n    multiply(a) {\n        return this.multiplyRight(a);\n    }\n}\nexports.default = Quaternion;\n\n},{\"./base/math-array\":\"fDlnO\",\"../lib/validators\":\"904Rf\",\"./vector4\":\"kYKaF\",\"gl-matrix/quat\":\"khTmL\",\"gl-matrix/vec4\":\"czCsm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"khTmL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Quaternion\n * @module quat\n */ /**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */ parcelHelpers.export(exports, \"create\", ()=>create);\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"identity\", ()=>identity);\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/ parcelHelpers.export(exports, \"setAxisAngle\", ()=>setAxisAngle);\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @param  {ReadonlyQuat} q     Quaternion to be decomposed\n * @return {Number}     Angle, in radians, of the rotation\n */ parcelHelpers.export(exports, \"getAxisAngle\", ()=>getAxisAngle);\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param  {ReadonlyQuat} a     Origin unit quaternion\n * @param  {ReadonlyQuat} b     Destination unit quaternion\n * @return {Number}     Angle, in radians, between the two quaternions\n */ parcelHelpers.export(exports, \"getAngle\", ()=>getAngle);\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"multiply\", ()=>multiply);\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"rotateX\", ()=>rotateX);\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"rotateY\", ()=>rotateY);\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"rotateZ\", ()=>rotateZ);\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"calculateW\", ()=>calculateW);\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"exp\", ()=>exp);\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"ln\", ()=>ln);\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"pow\", ()=>pow);\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"slerp\", ()=>slerp);\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"random\", ()=>random);\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"invert\", ()=>invert);\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */ parcelHelpers.export(exports, \"conjugate\", ()=>conjugate);\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */ parcelHelpers.export(exports, \"fromMat3\", ()=>fromMat3);\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */ parcelHelpers.export(exports, \"fromEuler\", ()=>fromEuler);\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */ parcelHelpers.export(exports, \"str\", ()=>str);\nparcelHelpers.export(exports, \"clone\", ()=>clone);\nparcelHelpers.export(exports, \"fromValues\", ()=>fromValues);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"set\", ()=>set);\nparcelHelpers.export(exports, \"add\", ()=>add);\nparcelHelpers.export(exports, \"mul\", ()=>mul);\nparcelHelpers.export(exports, \"scale\", ()=>scale);\nparcelHelpers.export(exports, \"dot\", ()=>dot);\nparcelHelpers.export(exports, \"lerp\", ()=>lerp);\nparcelHelpers.export(exports, \"length\", ()=>length);\nparcelHelpers.export(exports, \"len\", ()=>len);\nparcelHelpers.export(exports, \"squaredLength\", ()=>squaredLength);\nparcelHelpers.export(exports, \"sqrLen\", ()=>sqrLen);\nparcelHelpers.export(exports, \"normalize\", ()=>normalize);\nparcelHelpers.export(exports, \"exactEquals\", ()=>exactEquals);\nparcelHelpers.export(exports, \"equals\", ()=>equals);\nparcelHelpers.export(exports, \"rotationTo\", ()=>rotationTo);\nparcelHelpers.export(exports, \"sqlerp\", ()=>sqlerp);\nparcelHelpers.export(exports, \"setAxes\", ()=>setAxes);\nvar _commonJs = require(\"./common.js\");\nvar _mat3Js = require(\"./mat3.js\");\nvar _vec3Js = require(\"./vec3.js\");\nvar _vec4Js = require(\"./vec4.js\");\nfunction create() {\n    var out = new _commonJs.ARRAY_TYPE(4);\n    if (_commonJs.ARRAY_TYPE != Float32Array) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n    }\n    out[3] = 1;\n    return out;\n}\nfunction identity(out) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n}\nfunction setAxisAngle(out, axis, rad) {\n    rad = rad * 0.5;\n    var s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n}\nfunction getAxisAngle(out_axis, q) {\n    var rad = Math.acos(q[3]) * 2.0;\n    var s = Math.sin(rad / 2.0);\n    if (s > _commonJs.EPSILON) {\n        out_axis[0] = q[0] / s;\n        out_axis[1] = q[1] / s;\n        out_axis[2] = q[2] / s;\n    } else {\n        // If s is zero, return any axis (no rotation - axis does not matter)\n        out_axis[0] = 1;\n        out_axis[1] = 0;\n        out_axis[2] = 0;\n    }\n    return rad;\n}\nfunction getAngle(a, b) {\n    var dotproduct = dot(a, b);\n    return Math.acos(2 * dotproduct * dotproduct - 1);\n}\nfunction multiply(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = b[0], by = b[1], bz = b[2], bw = b[3];\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n}\nfunction rotateX(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n}\nfunction rotateY(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var by = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n}\nfunction rotateZ(out, a, rad) {\n    rad *= 0.5;\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bz = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + ay * bz;\n    out[1] = ay * bw - ax * bz;\n    out[2] = az * bw + aw * bz;\n    out[3] = aw * bw - az * bz;\n    return out;\n}\nfunction calculateW(out, a) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n    return out;\n}\nfunction exp(out, a) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    var r = Math.sqrt(x * x + y * y + z * z);\n    var et = Math.exp(w);\n    var s = r > 0 ? et * Math.sin(r) / r : 0;\n    out[0] = x * s;\n    out[1] = y * s;\n    out[2] = z * s;\n    out[3] = et * Math.cos(r);\n    return out;\n}\nfunction ln(out, a) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    var r = Math.sqrt(x * x + y * y + z * z);\n    var t = r > 0 ? Math.atan2(r, w) / r : 0;\n    out[0] = x * t;\n    out[1] = y * t;\n    out[2] = z * t;\n    out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n    return out;\n}\nfunction pow(out, a, b) {\n    ln(out, a);\n    scale(out, out, b);\n    exp(out, out);\n    return out;\n}\nfunction slerp(out, a, b, t) {\n    // benchmarks:\n    //    http://jsperf.com/quaternion-slerp-implementations\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3];\n    var bx = b[0], by = b[1], bz = b[2], bw = b[3];\n    var omega, cosom, sinom, scale0, scale1; // calc cosine\n    cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n    if (cosom < 0.0) {\n        cosom = -cosom;\n        bx = -bx;\n        by = -by;\n        bz = -bz;\n        bw = -bw;\n    } // calculate coefficients\n    if (1.0 - cosom > _commonJs.EPSILON) {\n        // standard case (slerp)\n        omega = Math.acos(cosom);\n        sinom = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n    } else {\n        // \"from\" and \"to\" quaternions are very close\n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n    } // calculate final values\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    return out;\n}\nfunction random(out) {\n    // Implementation of http://planning.cs.uiuc.edu/node198.html\n    // TODO: Calling random 3 times is probably not the fastest solution\n    var u1 = _commonJs.RANDOM();\n    var u2 = _commonJs.RANDOM();\n    var u3 = _commonJs.RANDOM();\n    var sqrt1MinusU1 = Math.sqrt(1 - u1);\n    var sqrtU1 = Math.sqrt(u1);\n    out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n    out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n    out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n    out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n    return out;\n}\nfunction invert(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var dot1 = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n    var invDot = dot1 ? 1.0 / dot1 : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n    out[0] = -a0 * invDot;\n    out[1] = -a1 * invDot;\n    out[2] = -a2 * invDot;\n    out[3] = a3 * invDot;\n    return out;\n}\nfunction conjugate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = a[3];\n    return out;\n}\nfunction fromMat3(out, m) {\n    // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n    // article \"Quaternion Calculus and Fast Animation\".\n    var fTrace = m[0] + m[4] + m[8];\n    var fRoot;\n    if (fTrace > 0.0) {\n        // |w| > 1/2, may as well choose w > 1/2\n        fRoot = Math.sqrt(fTrace + 1.0); // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot; // 1/(4w)\n        out[0] = (m[5] - m[7]) * fRoot;\n        out[1] = (m[6] - m[2]) * fRoot;\n        out[2] = (m[1] - m[3]) * fRoot;\n    } else {\n        // |w| <= 1/2\n        var i = 0;\n        if (m[4] > m[0]) i = 1;\n        if (m[8] > m[i * 3 + i]) i = 2;\n        var j = (i + 1) % 3;\n        var k = (i + 2) % 3;\n        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n    }\n    return out;\n}\nfunction fromEuler(out, x, y, z) {\n    var halfToRad = 0.5 * Math.PI / 180.0;\n    x *= halfToRad;\n    y *= halfToRad;\n    z *= halfToRad;\n    var sx = Math.sin(x);\n    var cx = Math.cos(x);\n    var sy = Math.sin(y);\n    var cy = Math.cos(y);\n    var sz = Math.sin(z);\n    var cz = Math.cos(z);\n    out[0] = sx * cy * cz - cx * sy * sz;\n    out[1] = cx * sy * cz + sx * cy * sz;\n    out[2] = cx * cy * sz - sx * sy * cz;\n    out[3] = cx * cy * cz + sx * sy * sz;\n    return out;\n}\nfunction str(a) {\n    return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\nvar clone = _vec4Js.clone;\nvar fromValues = _vec4Js.fromValues;\nvar copy = _vec4Js.copy;\nvar set = _vec4Js.set;\nvar add = _vec4Js.add;\nvar mul = multiply;\nvar scale = _vec4Js.scale;\nvar dot = _vec4Js.dot;\nvar lerp = _vec4Js.lerp;\nvar length = _vec4Js.length;\nvar len = length;\nvar squaredLength = _vec4Js.squaredLength;\nvar sqrLen = squaredLength;\nvar normalize = _vec4Js.normalize;\nvar exactEquals = _vec4Js.exactEquals;\nvar equals = _vec4Js.equals;\nvar rotationTo = function() {\n    var tmpvec3 = _vec3Js.create();\n    var xUnitVec3 = _vec3Js.fromValues(1, 0, 0);\n    var yUnitVec3 = _vec3Js.fromValues(0, 1, 0);\n    return function(out, a, b) {\n        var dot2 = _vec3Js.dot(a, b);\n        if (dot2 < -0.999999) {\n            _vec3Js.cross(tmpvec3, xUnitVec3, a);\n            if (_vec3Js.len(tmpvec3) < 0.000001) _vec3Js.cross(tmpvec3, yUnitVec3, a);\n            _vec3Js.normalize(tmpvec3, tmpvec3);\n            setAxisAngle(out, tmpvec3, Math.PI);\n            return out;\n        } else if (dot2 > 0.999999) {\n            out[0] = 0;\n            out[1] = 0;\n            out[2] = 0;\n            out[3] = 1;\n            return out;\n        } else {\n            _vec3Js.cross(tmpvec3, a, b);\n            out[0] = tmpvec3[0];\n            out[1] = tmpvec3[1];\n            out[2] = tmpvec3[2];\n            out[3] = 1 + dot2;\n            return normalize(out, out);\n        }\n    };\n}();\nvar sqlerp = function() {\n    var temp1 = create();\n    var temp2 = create();\n    return function(out, a, b, c, d, t) {\n        slerp(temp1, a, d, t);\n        slerp(temp2, b, c, t);\n        slerp(out, temp1, temp2, 2 * t * (1 - t));\n        return out;\n    };\n}();\nvar setAxes = function() {\n    var matr = _mat3Js.create();\n    return function(out, view, right, up) {\n        matr[0] = right[0];\n        matr[3] = right[1];\n        matr[6] = right[2];\n        matr[1] = up[0];\n        matr[4] = up[1];\n        matr[7] = up[2];\n        matr[2] = -view[0];\n        matr[5] = -view[1];\n        matr[8] = -view[2];\n        return normalize(out, fromMat3(out, matr));\n    };\n}();\n\n},{\"./common.js\":\"Li4u6\",\"./mat3.js\":\"5XUpE\",\"./vec3.js\":\"cAIcX\",\"./vec4.js\":\"czCsm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bY1ks\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _vector3 = require(\"./vector3\");\nvar _vector3Default = parcelHelpers.interopDefault(_vector3);\nvar _common = require(\"../lib/common\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nconst EPSILON = 0.000001;\nconst EARTH_RADIUS_METERS = 6371000;\nclass SphericalCoordinates {\n    constructor({ phi =0 , theta =0 , radius =1 , bearing , pitch , altitude , radiusScale =EARTH_RADIUS_METERS  } = {}){\n        (0, _definePropertyDefault.default)(this, \"phi\", void 0);\n        (0, _definePropertyDefault.default)(this, \"theta\", void 0);\n        (0, _definePropertyDefault.default)(this, \"radius\", void 0);\n        (0, _definePropertyDefault.default)(this, \"radiusScale\", void 0);\n        this.phi = phi;\n        this.theta = theta;\n        this.radius = radius || altitude || 1;\n        this.radiusScale = radiusScale || 1;\n        if (bearing !== undefined) this.bearing = bearing;\n        if (pitch !== undefined) this.pitch = pitch;\n        this.check();\n    }\n    toString() {\n        return this.formatString((0, _common.config));\n    }\n    formatString({ printTypes =false  }) {\n        const f = (0, _common.formatValue);\n        return \"\".concat(printTypes ? \"Spherical\" : \"\", \"[rho:\").concat(f(this.radius), \",theta:\").concat(f(this.theta), \",phi:\").concat(f(this.phi), \"]\");\n    }\n    equals(other) {\n        return (0, _common.equals)(this.radius, other.radius) && (0, _common.equals)(this.theta, other.theta) && (0, _common.equals)(this.phi, other.phi);\n    }\n    exactEquals(other) {\n        return this.radius === other.radius && this.theta === other.theta && this.phi === other.phi;\n    }\n    get bearing() {\n        return 180 - (0, _common.degrees)(this.phi);\n    }\n    set bearing(v) {\n        this.phi = Math.PI - (0, _common.radians)(v);\n    }\n    get pitch() {\n        return (0, _common.degrees)(this.theta);\n    }\n    set pitch(v) {\n        this.theta = (0, _common.radians)(v);\n    }\n    get longitude() {\n        return (0, _common.degrees)(this.phi);\n    }\n    get latitude() {\n        return (0, _common.degrees)(this.theta);\n    }\n    get lng() {\n        return (0, _common.degrees)(this.phi);\n    }\n    get lat() {\n        return (0, _common.degrees)(this.theta);\n    }\n    get z() {\n        return (this.radius - 1) * this.radiusScale;\n    }\n    set(radius, phi, theta) {\n        this.radius = radius;\n        this.phi = phi;\n        this.theta = theta;\n        return this.check();\n    }\n    clone() {\n        return new SphericalCoordinates().copy(this);\n    }\n    copy(other) {\n        this.radius = other.radius;\n        this.phi = other.phi;\n        this.theta = other.theta;\n        return this.check();\n    }\n    fromLngLatZ([lng, lat, z]) {\n        this.radius = 1 + z / this.radiusScale;\n        this.phi = (0, _common.radians)(lat);\n        this.theta = (0, _common.radians)(lng);\n        return this.check();\n    }\n    fromVector3(v) {\n        this.radius = _vec3.length(v);\n        if (this.radius > 0) {\n            this.theta = Math.atan2(v[0], v[1]);\n            this.phi = Math.acos((0, _common.clamp)(v[2] / this.radius, -1, 1));\n        }\n        return this.check();\n    }\n    toVector3() {\n        return new (0, _vector3Default.default)(0, 0, this.radius).rotateX({\n            radians: this.theta\n        }).rotateZ({\n            radians: this.phi\n        });\n    }\n    makeSafe() {\n        this.phi = Math.max(EPSILON, Math.min(Math.PI - EPSILON, this.phi));\n        return this;\n    }\n    check() {\n        if (!Number.isFinite(this.phi) || !Number.isFinite(this.theta) || !(this.radius > 0)) throw new Error(\"SphericalCoordinates: some fields set to invalid numbers\");\n        return this;\n    }\n}\nexports.default = SphericalCoordinates;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"./vector3\":\"96vh2\",\"../lib/common\":\"849uR\",\"gl-matrix/vec3\":\"cAIcX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9CEXP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _matrix4 = require(\"./matrix4\");\nvar _matrix4Default = parcelHelpers.interopDefault(_matrix4);\nvar _vector3 = require(\"./vector3\");\nvar _vector3Default = parcelHelpers.interopDefault(_vector3);\nvar _euler = require(\"./euler\");\nvar _eulerDefault = parcelHelpers.interopDefault(_euler);\nclass Pose {\n    constructor({ x =0 , y =0 , z =0 , roll =0 , pitch =0 , yaw =0 , position , orientation  } = {}){\n        (0, _definePropertyDefault.default)(this, \"position\", void 0);\n        (0, _definePropertyDefault.default)(this, \"orientation\", void 0);\n        if (Array.isArray(position) && position.length === 3) this.position = new (0, _vector3Default.default)(position);\n        else this.position = new (0, _vector3Default.default)(x, y, z);\n        if (Array.isArray(orientation) && orientation.length === 4) this.orientation = new (0, _eulerDefault.default)(orientation, orientation[3]);\n        else this.orientation = new (0, _eulerDefault.default)(roll, pitch, yaw, (0, _eulerDefault.default).RollPitchYaw);\n    }\n    get x() {\n        return this.position.x;\n    }\n    set x(value) {\n        this.position.x = value;\n    }\n    get y() {\n        return this.position.y;\n    }\n    set y(value) {\n        this.position.y = value;\n    }\n    get z() {\n        return this.position.z;\n    }\n    set z(value) {\n        this.position.z = value;\n    }\n    get roll() {\n        return this.orientation.roll;\n    }\n    set roll(value) {\n        this.orientation.roll = value;\n    }\n    get pitch() {\n        return this.orientation.pitch;\n    }\n    set pitch(value) {\n        this.orientation.pitch = value;\n    }\n    get yaw() {\n        return this.orientation.yaw;\n    }\n    set yaw(value) {\n        this.orientation.yaw = value;\n    }\n    getPosition() {\n        return this.position;\n    }\n    getOrientation() {\n        return this.orientation;\n    }\n    equals(pose) {\n        if (!pose) return false;\n        return this.position.equals(pose.position) && this.orientation.equals(pose.orientation);\n    }\n    exactEquals(pose) {\n        if (!pose) return false;\n        return this.position.exactEquals(pose.position) && this.orientation.exactEquals(pose.orientation);\n    }\n    getTransformationMatrix() {\n        const sr = Math.sin(this.roll);\n        const sp = Math.sin(this.pitch);\n        const sw = Math.sin(this.yaw);\n        const cr = Math.cos(this.roll);\n        const cp = Math.cos(this.pitch);\n        const cw = Math.cos(this.yaw);\n        return new (0, _matrix4Default.default)().setRowMajor(cw * cp, -sw * cr + cw * sp * sr, sw * sr + cw * sp * cr, this.x, sw * cp, cw * cr + sw * sp * sr, -cw * sr + sw * sp * cr, this.y, -sp, cp * sr, cp * cr, this.z, 0, 0, 0, 1);\n    }\n    getTransformationMatrixFromPose(pose) {\n        return new (0, _matrix4Default.default)().multiplyRight(this.getTransformationMatrix()).multiplyRight(pose.getTransformationMatrix().invert());\n    }\n    getTransformationMatrixToPose(pose) {\n        return new (0, _matrix4Default.default)().multiplyRight(pose.getTransformationMatrix()).multiplyRight(this.getTransformationMatrix().invert());\n    }\n}\nexports.default = Pose;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"./matrix4\":\"2ggmN\",\"./vector3\":\"96vh2\",\"./euler\":\"jqmWN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jqmWN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathArray = require(\"./base/math-array\");\nvar _mathArrayDefault = parcelHelpers.interopDefault(_mathArray);\nvar _quaternion = require(\"./quaternion\");\nvar _quaternionDefault = parcelHelpers.interopDefault(_quaternion);\nvar _common = require(\"../lib/common\");\nvar _validators = require(\"../lib/validators\");\nconst ERR_UNKNOWN_ORDER = \"Unknown Euler angle order\";\nconst ALMOST_ONE = 0.99999;\nvar RotationOrder;\n(function(RotationOrder1) {\n    RotationOrder1[RotationOrder1[\"ZYX\"] = 0] = \"ZYX\";\n    RotationOrder1[RotationOrder1[\"YXZ\"] = 1] = \"YXZ\";\n    RotationOrder1[RotationOrder1[\"XZY\"] = 2] = \"XZY\";\n    RotationOrder1[RotationOrder1[\"ZXY\"] = 3] = \"ZXY\";\n    RotationOrder1[RotationOrder1[\"YZX\"] = 4] = \"YZX\";\n    RotationOrder1[RotationOrder1[\"XYZ\"] = 5] = \"XYZ\";\n})(RotationOrder || (RotationOrder = {}));\nclass Euler extends (0, _mathArrayDefault.default) {\n    static get ZYX() {\n        return RotationOrder.ZYX;\n    }\n    static get YXZ() {\n        return RotationOrder.YXZ;\n    }\n    static get XZY() {\n        return RotationOrder.XZY;\n    }\n    static get ZXY() {\n        return RotationOrder.ZXY;\n    }\n    static get YZX() {\n        return RotationOrder.YZX;\n    }\n    static get XYZ() {\n        return RotationOrder.XYZ;\n    }\n    static get RollPitchYaw() {\n        return RotationOrder.ZYX;\n    }\n    static get DefaultOrder() {\n        return RotationOrder.ZYX;\n    }\n    static get RotationOrders() {\n        return RotationOrder;\n    }\n    static rotationOrder(order) {\n        return RotationOrder[order];\n    }\n    get ELEMENTS() {\n        return 4;\n    }\n    constructor(x = 0, y = 0, z = 0, order = Euler.DefaultOrder){\n        super(-0, -0, -0, -0);\n        if (arguments.length > 0 && Array.isArray(arguments[0])) this.fromVector3(...arguments);\n        else this.set(x, y, z, order);\n    }\n    fromQuaternion(quaternion) {\n        const [x, y, z, w] = quaternion;\n        const ysqr = y * y;\n        const t0 = -2 * (ysqr + z * z) + 1;\n        const t1 = 2 * (x * y + w * z);\n        let t2 = -2 * (x * z - w * y);\n        const t3 = 2 * (y * z + w * x);\n        const t4 = -2 * (x * x + ysqr) + 1;\n        t2 = t2 > 1 ? 1 : t2;\n        t2 = t2 < -1 ? -1 : t2;\n        const roll = Math.atan2(t3, t4);\n        const pitch = Math.asin(t2);\n        const yaw = Math.atan2(t1, t0);\n        return this.set(roll, pitch, yaw, Euler.RollPitchYaw);\n    }\n    fromObject(object) {\n        throw new Error(\"not implemented\");\n    }\n    copy(array) {\n        this[0] = array[0];\n        this[1] = array[1];\n        this[2] = array[2];\n        this[3] = Number.isFinite(array[3]) || this.order;\n        return this.check();\n    }\n    set(x = 0, y = 0, z = 0, order) {\n        this[0] = x;\n        this[1] = y;\n        this[2] = z;\n        this[3] = Number.isFinite(order) ? order : this[3];\n        return this.check();\n    }\n    validate() {\n        return validateOrder(this[3]) && Number.isFinite(this[0]) && Number.isFinite(this[1]) && Number.isFinite(this[2]);\n    }\n    toArray(array = [], offset = 0) {\n        array[offset] = this[0];\n        array[offset + 1] = this[1];\n        array[offset + 2] = this[2];\n        return array;\n    }\n    toArray4(array = [], offset = 0) {\n        array[offset] = this[0];\n        array[offset + 1] = this[1];\n        array[offset + 2] = this[2];\n        array[offset + 3] = this[3];\n        return array;\n    }\n    toVector3(result = [\n        -0,\n        -0,\n        -0\n    ]) {\n        result[0] = this[0];\n        result[1] = this[1];\n        result[2] = this[2];\n        return result;\n    }\n    get x() {\n        return this[0];\n    }\n    set x(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get y() {\n        return this[1];\n    }\n    set y(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get z() {\n        return this[2];\n    }\n    set z(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get alpha() {\n        return this[0];\n    }\n    set alpha(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get beta() {\n        return this[1];\n    }\n    set beta(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get gamma() {\n        return this[2];\n    }\n    set gamma(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get phi() {\n        return this[0];\n    }\n    set phi(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get theta() {\n        return this[1];\n    }\n    set theta(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get psi() {\n        return this[2];\n    }\n    set psi(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get roll() {\n        return this[0];\n    }\n    set roll(value) {\n        this[0] = (0, _validators.checkNumber)(value);\n    }\n    get pitch() {\n        return this[1];\n    }\n    set pitch(value) {\n        this[1] = (0, _validators.checkNumber)(value);\n    }\n    get yaw() {\n        return this[2];\n    }\n    set yaw(value) {\n        this[2] = (0, _validators.checkNumber)(value);\n    }\n    get order() {\n        return this[3];\n    }\n    set order(value) {\n        this[3] = checkOrder(value);\n    }\n    fromVector3(v, order) {\n        return this.set(v[0], v[1], v[2], Number.isFinite(order) ? order : this[3]);\n    }\n    fromArray(array, offset = 0) {\n        this[0] = array[0 + offset];\n        this[1] = array[1 + offset];\n        this[2] = array[2 + offset];\n        if (array[3] !== undefined) this[3] = array[3];\n        return this.check();\n    }\n    fromRollPitchYaw(roll, pitch, yaw) {\n        return this.set(roll, pitch, yaw, RotationOrder.ZYX);\n    }\n    fromRotationMatrix(m, order = Euler.DefaultOrder) {\n        this._fromRotationMatrix(m, order);\n        return this.check();\n    }\n    getRotationMatrix(m) {\n        return this._getRotationMatrix(m);\n    }\n    getQuaternion() {\n        const q = new (0, _quaternionDefault.default)();\n        switch(this[4]){\n            case RotationOrder.XYZ:\n                return q.rotateX(this[0]).rotateY(this[1]).rotateZ(this[2]);\n            case RotationOrder.YXZ:\n                return q.rotateY(this[0]).rotateX(this[1]).rotateZ(this[2]);\n            case RotationOrder.ZXY:\n                return q.rotateZ(this[0]).rotateX(this[1]).rotateY(this[2]);\n            case RotationOrder.ZYX:\n                return q.rotateZ(this[0]).rotateY(this[1]).rotateX(this[2]);\n            case RotationOrder.YZX:\n                return q.rotateY(this[0]).rotateZ(this[1]).rotateX(this[2]);\n            case RotationOrder.XZY:\n                return q.rotateX(this[0]).rotateZ(this[1]).rotateY(this[2]);\n            default:\n                throw new Error(ERR_UNKNOWN_ORDER);\n        }\n    }\n    _fromRotationMatrix(m, order = Euler.DefaultOrder) {\n        const m11 = m[0], m12 = m[4], m13 = m[8];\n        const m21 = m[1], m22 = m[5], m23 = m[9];\n        const m31 = m[2], m32 = m[6], m33 = m[10];\n        order = order || this[3];\n        switch(order){\n            case Euler.XYZ:\n                this[1] = Math.asin((0, _common.clamp)(m13, -1, 1));\n                if (Math.abs(m13) < ALMOST_ONE) {\n                    this[0] = Math.atan2(-m23, m33);\n                    this[2] = Math.atan2(-m12, m11);\n                } else {\n                    this[0] = Math.atan2(m32, m22);\n                    this[2] = 0;\n                }\n                break;\n            case Euler.YXZ:\n                this[0] = Math.asin(-(0, _common.clamp)(m23, -1, 1));\n                if (Math.abs(m23) < ALMOST_ONE) {\n                    this[1] = Math.atan2(m13, m33);\n                    this[2] = Math.atan2(m21, m22);\n                } else {\n                    this[1] = Math.atan2(-m31, m11);\n                    this[2] = 0;\n                }\n                break;\n            case Euler.ZXY:\n                this[0] = Math.asin((0, _common.clamp)(m32, -1, 1));\n                if (Math.abs(m32) < ALMOST_ONE) {\n                    this[1] = Math.atan2(-m31, m33);\n                    this[2] = Math.atan2(-m12, m22);\n                } else {\n                    this[1] = 0;\n                    this[2] = Math.atan2(m21, m11);\n                }\n                break;\n            case Euler.ZYX:\n                this[1] = Math.asin(-(0, _common.clamp)(m31, -1, 1));\n                if (Math.abs(m31) < ALMOST_ONE) {\n                    this[0] = Math.atan2(m32, m33);\n                    this[2] = Math.atan2(m21, m11);\n                } else {\n                    this[0] = 0;\n                    this[2] = Math.atan2(-m12, m22);\n                }\n                break;\n            case Euler.YZX:\n                this[2] = Math.asin((0, _common.clamp)(m21, -1, 1));\n                if (Math.abs(m21) < ALMOST_ONE) {\n                    this[0] = Math.atan2(-m23, m22);\n                    this[1] = Math.atan2(-m31, m11);\n                } else {\n                    this[0] = 0;\n                    this[1] = Math.atan2(m13, m33);\n                }\n                break;\n            case Euler.XZY:\n                this[2] = Math.asin(-(0, _common.clamp)(m12, -1, 1));\n                if (Math.abs(m12) < ALMOST_ONE) {\n                    this[0] = Math.atan2(m32, m22);\n                    this[1] = Math.atan2(m13, m11);\n                } else {\n                    this[0] = Math.atan2(-m23, m33);\n                    this[1] = 0;\n                }\n                break;\n            default:\n                throw new Error(ERR_UNKNOWN_ORDER);\n        }\n        this[3] = order;\n        return this;\n    }\n    _getRotationMatrix(result) {\n        const te = result || [\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0,\n            -0\n        ];\n        const x = this.x, y = this.y, z = this.z;\n        const a = Math.cos(x);\n        const c = Math.cos(y);\n        const e = Math.cos(z);\n        const b = Math.sin(x);\n        const d = Math.sin(y);\n        const f = Math.sin(z);\n        switch(this[3]){\n            case Euler.XYZ:\n                {\n                    const ae = a * e, af = a * f, be = b * e, bf = b * f;\n                    te[0] = c * e;\n                    te[4] = -c * f;\n                    te[8] = d;\n                    te[1] = af + be * d;\n                    te[5] = ae - bf * d;\n                    te[9] = -b * c;\n                    te[2] = bf - ae * d;\n                    te[6] = be + af * d;\n                    te[10] = a * c;\n                    break;\n                }\n            case Euler.YXZ:\n                {\n                    const ce = c * e, cf = c * f, de = d * e, df = d * f;\n                    te[0] = ce + df * b;\n                    te[4] = de * b - cf;\n                    te[8] = a * d;\n                    te[1] = a * f;\n                    te[5] = a * e;\n                    te[9] = -b;\n                    te[2] = cf * b - de;\n                    te[6] = df + ce * b;\n                    te[10] = a * c;\n                    break;\n                }\n            case Euler.ZXY:\n                {\n                    const ce = c * e, cf = c * f, de = d * e, df = d * f;\n                    te[0] = ce - df * b;\n                    te[4] = -a * f;\n                    te[8] = de + cf * b;\n                    te[1] = cf + de * b;\n                    te[5] = a * e;\n                    te[9] = df - ce * b;\n                    te[2] = -a * d;\n                    te[6] = b;\n                    te[10] = a * c;\n                    break;\n                }\n            case Euler.ZYX:\n                {\n                    const ae = a * e, af = a * f, be = b * e, bf = b * f;\n                    te[0] = c * e;\n                    te[4] = be * d - af;\n                    te[8] = ae * d + bf;\n                    te[1] = c * f;\n                    te[5] = bf * d + ae;\n                    te[9] = af * d - be;\n                    te[2] = -d;\n                    te[6] = b * c;\n                    te[10] = a * c;\n                    break;\n                }\n            case Euler.YZX:\n                {\n                    const ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n                    te[0] = c * e;\n                    te[4] = bd - ac * f;\n                    te[8] = bc * f + ad;\n                    te[1] = f;\n                    te[5] = a * e;\n                    te[9] = -b * e;\n                    te[2] = -d * e;\n                    te[6] = ad * f + bc;\n                    te[10] = ac - bd * f;\n                    break;\n                }\n            case Euler.XZY:\n                {\n                    const ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n                    te[0] = c * e;\n                    te[4] = -f;\n                    te[8] = d * e;\n                    te[1] = ac * f + bd;\n                    te[5] = a * e;\n                    te[9] = ad * f - bc;\n                    te[2] = bc * f - ad;\n                    te[6] = b * e;\n                    te[10] = bd * f + ac;\n                    break;\n                }\n            default:\n                throw new Error(ERR_UNKNOWN_ORDER);\n        }\n        te[3] = 0;\n        te[7] = 0;\n        te[11] = 0;\n        te[12] = 0;\n        te[13] = 0;\n        te[14] = 0;\n        te[15] = 1;\n        return te;\n    }\n    toQuaternion() {\n        const cy = Math.cos(this.yaw * 0.5);\n        const sy = Math.sin(this.yaw * 0.5);\n        const cr = Math.cos(this.roll * 0.5);\n        const sr = Math.sin(this.roll * 0.5);\n        const cp = Math.cos(this.pitch * 0.5);\n        const sp = Math.sin(this.pitch * 0.5);\n        const w = cy * cr * cp + sy * sr * sp;\n        const x = cy * sr * cp - sy * cr * sp;\n        const y = cy * cr * sp + sy * sr * cp;\n        const z = sy * cr * cp - cy * sr * sp;\n        return new (0, _quaternionDefault.default)(x, y, z, w);\n    }\n}\nexports.default = Euler;\nfunction validateOrder(value) {\n    return value >= 0 && value < 6;\n}\nfunction checkOrder(value) {\n    if (value < 0 && value >= 6) throw new Error(ERR_UNKNOWN_ORDER);\n    return value;\n}\n\n},{\"./base/math-array\":\"fDlnO\",\"./quaternion\":\"lx9bC\",\"../lib/common\":\"849uR\",\"../lib/validators\":\"904Rf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5l9eA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = {\n    EPSILON1: 1e-1,\n    EPSILON2: 1e-2,\n    EPSILON3: 1e-3,\n    EPSILON4: 1e-4,\n    EPSILON5: 1e-5,\n    EPSILON6: 1e-6,\n    EPSILON7: 1e-7,\n    EPSILON8: 1e-8,\n    EPSILON9: 1e-9,\n    EPSILON10: 1e-10,\n    EPSILON11: 1e-11,\n    EPSILON12: 1e-12,\n    EPSILON13: 1e-13,\n    EPSILON14: 1e-14,\n    EPSILON15: 1e-15,\n    EPSILON16: 1e-16,\n    EPSILON17: 1e-17,\n    EPSILON18: 1e-18,\n    EPSILON19: 1e-19,\n    EPSILON20: 1e-20,\n    PI_OVER_TWO: Math.PI / 2,\n    PI_OVER_FOUR: Math.PI / 4,\n    PI_OVER_SIX: Math.PI / 6,\n    TWO_PI: Math.PI * 2\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cTDxr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _lightsGlsl = require(\"./lights.glsl\");\nvar _lightsGlslDefault = parcelHelpers.interopDefault(_lightsGlsl);\nexports.default = {\n    name: \"lights\",\n    vs: (0, _lightsGlslDefault.default),\n    fs: (0, _lightsGlslDefault.default),\n    getUniforms: getUniforms,\n    defines: {\n        MAX_LIGHTS: 3\n    }\n};\nvar INITIAL_MODULE_OPTIONS = {};\nfunction convertColor() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$color = _ref.color, color = _ref$color === void 0 ? [\n        0,\n        0,\n        0\n    ] : _ref$color, _ref$intensity = _ref.intensity, intensity = _ref$intensity === void 0 ? 1.0 : _ref$intensity;\n    return color.map(function(component) {\n        return component * intensity / 255.0;\n    });\n}\nfunction getLightSourceUniforms(_ref2) {\n    var ambientLight = _ref2.ambientLight, _ref2$pointLights = _ref2.pointLights, pointLights = _ref2$pointLights === void 0 ? [] : _ref2$pointLights, _ref2$directionalLigh = _ref2.directionalLights, directionalLights = _ref2$directionalLigh === void 0 ? [] : _ref2$directionalLigh;\n    var lightSourceUniforms = {};\n    if (ambientLight) lightSourceUniforms[\"lighting_uAmbientLight.color\"] = convertColor(ambientLight);\n    else lightSourceUniforms[\"lighting_uAmbientLight.color\"] = [\n        0,\n        0,\n        0\n    ];\n    pointLights.forEach(function(pointLight, index) {\n        lightSourceUniforms[\"lighting_uPointLight[\".concat(index, \"].color\")] = convertColor(pointLight);\n        lightSourceUniforms[\"lighting_uPointLight[\".concat(index, \"].position\")] = pointLight.position;\n        lightSourceUniforms[\"lighting_uPointLight[\".concat(index, \"].attenuation\")] = pointLight.attenuation || [\n            1,\n            0,\n            0\n        ];\n    });\n    lightSourceUniforms.lighting_uPointLightCount = pointLights.length;\n    directionalLights.forEach(function(directionalLight, index) {\n        lightSourceUniforms[\"lighting_uDirectionalLight[\".concat(index, \"].color\")] = convertColor(directionalLight);\n        lightSourceUniforms[\"lighting_uDirectionalLight[\".concat(index, \"].direction\")] = directionalLight.direction;\n    });\n    lightSourceUniforms.lighting_uDirectionalLightCount = directionalLights.length;\n    return lightSourceUniforms;\n}\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_MODULE_OPTIONS;\n    if (\"lightSources\" in opts) {\n        var _ref3 = opts.lightSources || {}, ambientLight = _ref3.ambientLight, pointLights = _ref3.pointLights, directionalLights = _ref3.directionalLights;\n        var hasLights = ambientLight || pointLights && pointLights.length > 0 || directionalLights && directionalLights.length > 0;\n        if (!hasLights) return {\n            lighting_uEnabled: false\n        };\n        return Object.assign({}, getLightSourceUniforms({\n            ambientLight: ambientLight,\n            pointLights: pointLights,\n            directionalLights: directionalLights\n        }), {\n            lighting_uEnabled: true\n        });\n    }\n    if (\"lights\" in opts) {\n        var lightSources = {\n            pointLights: [],\n            directionalLights: []\n        };\n        var _iteratorNormalCompletion = true;\n        var _didIteratorError = false;\n        var _iteratorError = undefined;\n        try {\n            for(var _iterator = (opts.lights || [])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                var light = _step.value;\n                switch(light.type){\n                    case \"ambient\":\n                        lightSources.ambientLight = light;\n                        break;\n                    case \"directional\":\n                        lightSources.directionalLights.push(light);\n                        break;\n                    case \"point\":\n                        lightSources.pointLights.push(light);\n                        break;\n                    default:\n                }\n            }\n        } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n        } finally{\n            try {\n                if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n            } finally{\n                if (_didIteratorError) throw _iteratorError;\n            }\n        }\n        return getUniforms({\n            lightSources: lightSources\n        });\n    }\n    return {};\n}\n\n},{\"./lights.glsl\":\"dRlOc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dRlOc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#if (defined(SHADER_TYPE_FRAGMENT) && defined(LIGHTING_FRAGMENT)) || (defined(SHADER_TYPE_VERTEX) && defined(LIGHTING_VERTEX))\\n\\nstruct AmbientLight {\\n vec3 color;\\n};\\n\\nstruct PointLight {\\n vec3 color;\\n vec3 position;\\n vec3 attenuation;\\n};\\n\\nstruct DirectionalLight {\\n  vec3 color;\\n  vec3 direction;\\n};\\n\\nuniform AmbientLight lighting_uAmbientLight;\\nuniform PointLight lighting_uPointLight[MAX_LIGHTS];\\nuniform DirectionalLight lighting_uDirectionalLight[MAX_LIGHTS];\\nuniform int lighting_uPointLightCount;\\nuniform int lighting_uDirectionalLightCount;\\n\\nuniform bool lighting_uEnabled;\\n\\nfloat getPointLightAttenuation(PointLight pointLight, float distance) {\\n  return pointLight.attenuation.x\\n       + pointLight.attenuation.y * distance\\n       + pointLight.attenuation.z * distance * distance;\\n}\\n\\n#endif\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gDQIZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _project = require(\"../project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar DEFAULT_LIGHT_DIRECTION = new Float32Array([\n    1,\n    1,\n    2\n]);\nvar DEFAULT_MODULE_OPTIONS = {\n    lightDirection: DEFAULT_LIGHT_DIRECTION\n};\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n    var uniforms = {};\n    if (opts.lightDirection) uniforms.dirlight_uLightDirection = opts.lightDirection;\n    return uniforms;\n}\nvar vs = null;\nvar fs = \"uniform vec3 dirlight_uLightDirection;\\nvec4 dirlight_filterColor(vec4 color) {\\n  vec3 normal = project_getNormal_World();\\n  float d = abs(dot(normalize(normal), normalize(dirlight_uLightDirection)));\\n  return vec4(color.rgb * d, color.a);\\n}\\n\";\nexports.default = {\n    name: \"dirlight\",\n    vs: vs,\n    fs: fs,\n    getUniforms: getUniforms,\n    dependencies: [\n        (0, _projectDefault.default)\n    ]\n};\n\n},{\"../project/project\":\"cZp55\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2T1yx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar DEFAULT_HIGHLIGHT_COLOR = new Uint8Array([\n    0,\n    255,\n    255,\n    255\n]);\nvar DEFAULT_MODULE_OPTIONS = {\n    pickingSelectedColor: null,\n    pickingHighlightColor: DEFAULT_HIGHLIGHT_COLOR,\n    pickingActive: false,\n    pickingAttribute: false\n};\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_MODULE_OPTIONS;\n    var uniforms = {};\n    if (opts.pickingSelectedColor !== undefined) {\n        if (!opts.pickingSelectedColor) uniforms.picking_uSelectedColorValid = 0;\n        else {\n            var selectedColor = opts.pickingSelectedColor.slice(0, 3);\n            uniforms.picking_uSelectedColorValid = 1;\n            uniforms.picking_uSelectedColor = selectedColor;\n        }\n    }\n    if (opts.pickingHighlightColor) {\n        var color = Array.from(opts.pickingHighlightColor, function(x) {\n            return x / 255;\n        });\n        if (!Number.isFinite(color[3])) color[3] = 1;\n        uniforms.picking_uHighlightColor = color;\n    }\n    if (opts.pickingActive !== undefined) {\n        uniforms.picking_uActive = Boolean(opts.pickingActive);\n        uniforms.picking_uAttribute = Boolean(opts.pickingAttribute);\n    }\n    return uniforms;\n}\nvar vs = \"uniform bool picking_uActive;\\nuniform bool picking_uAttribute;\\nuniform vec3 picking_uSelectedColor;\\nuniform bool picking_uSelectedColorValid;\\n\\nout vec4 picking_vRGBcolor_Avalid;\\n\\nconst float COLOR_SCALE = 1. / 255.;\\n\\nbool picking_isColorValid(vec3 color) {\\n  return dot(color, vec3(1.0)) > 0.001;\\n}\\n\\nbool isVertexPicked(vec3 vertexColor) {\\n  return\\n    picking_uSelectedColorValid &&\\n    !picking_isColorValid(abs(vertexColor - picking_uSelectedColor));\\n}\\n\\nvoid picking_setPickingColor(vec3 pickingColor) {\\n  if (picking_uActive) {\\n    picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));\\n\\n    if (!picking_uAttribute) {\\n      picking_vRGBcolor_Avalid.rgb = pickingColor * COLOR_SCALE;\\n    }\\n  } else {\\n    picking_vRGBcolor_Avalid.a = float(isVertexPicked(pickingColor));\\n  }\\n}\\n\\nvoid picking_setPickingAttribute(float value) {\\n  if (picking_uAttribute) {\\n    picking_vRGBcolor_Avalid.r = value;\\n  }\\n}\\nvoid picking_setPickingAttribute(vec2 value) {\\n  if (picking_uAttribute) {\\n    picking_vRGBcolor_Avalid.rg = value;\\n  }\\n}\\nvoid picking_setPickingAttribute(vec3 value) {\\n  if (picking_uAttribute) {\\n    picking_vRGBcolor_Avalid.rgb = value;\\n  }\\n}\\n\";\nvar fs = \"uniform bool picking_uActive;\\nuniform vec3 picking_uSelectedColor;\\nuniform vec4 picking_uHighlightColor;\\n\\nin vec4 picking_vRGBcolor_Avalid;\\nvec4 picking_filterHighlightColor(vec4 color) {\\n  if (picking_uActive) {\\n    return color;\\n  }\\n  bool selected = bool(picking_vRGBcolor_Avalid.a);\\n\\n  if (selected) {\\n    float highLightAlpha = picking_uHighlightColor.a;\\n    float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);\\n    float highLightRatio = highLightAlpha / blendedAlpha;\\n\\n    vec3 blendedRGB = mix(color.rgb, picking_uHighlightColor.rgb, highLightRatio);\\n    return vec4(blendedRGB, blendedAlpha);\\n  } else {\\n    return color;\\n  }\\n}\\nvec4 picking_filterPickingColor(vec4 color) {\\n  if (picking_uActive) {\\n    if (picking_vRGBcolor_Avalid.a == 0.0) {\\n      discard;\\n    }\\n    return picking_vRGBcolor_Avalid;\\n  }\\n  return color;\\n}\\nvec4 picking_filterColor(vec4 color) {\\n  vec4 highightColor = picking_filterHighlightColor(color);\\n  return picking_filterPickingColor(highightColor);\\n}\\n\\n\";\nexports.default = {\n    name: \"picking\",\n    vs: vs,\n    fs: fs,\n    getUniforms: getUniforms\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kNtaI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"gouraudLighting\", ()=>gouraudLighting);\nparcelHelpers.export(exports, \"phongLighting\", ()=>phongLighting);\nvar _lights = require(\"../lights/lights\");\nvar _lightsDefault = parcelHelpers.interopDefault(_lights);\nvar _phongLightingGlsl = require(\"./phong-lighting.glsl\");\nvar _phongLightingGlslDefault = parcelHelpers.interopDefault(_phongLightingGlsl);\nvar gouraudLighting = {\n    name: \"gouraud-lighting\",\n    dependencies: [\n        (0, _lightsDefault.default)\n    ],\n    vs: (0, _phongLightingGlslDefault.default),\n    defines: {\n        LIGHTING_VERTEX: 1\n    },\n    getUniforms: getUniforms\n};\nvar phongLighting = {\n    name: \"phong-lighting\",\n    dependencies: [\n        (0, _lightsDefault.default)\n    ],\n    fs: (0, _phongLightingGlslDefault.default),\n    defines: {\n        LIGHTING_FRAGMENT: 1\n    },\n    getUniforms: getUniforms\n};\nvar INITIAL_MODULE_OPTIONS = {};\nfunction getMaterialUniforms(material) {\n    var _material$ambient = material.ambient, ambient = _material$ambient === void 0 ? 0.35 : _material$ambient, _material$diffuse = material.diffuse, diffuse = _material$diffuse === void 0 ? 0.6 : _material$diffuse, _material$shininess = material.shininess, shininess = _material$shininess === void 0 ? 32 : _material$shininess, _material$specularCol = material.specularColor, specularColor = _material$specularCol === void 0 ? [\n        30,\n        30,\n        30\n    ] : _material$specularCol;\n    return {\n        lighting_uAmbient: ambient,\n        lighting_uDiffuse: diffuse,\n        lighting_uShininess: shininess,\n        lighting_uSpecularColor: specularColor.map(function(x) {\n            return x / 255;\n        })\n    };\n}\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_MODULE_OPTIONS;\n    if (!(\"material\" in opts)) return {};\n    var material = opts.material;\n    if (!material) return {\n        lighting_uEnabled: false\n    };\n    return getMaterialUniforms(material);\n}\n\n},{\"../lights/lights\":\"cTDxr\",\"./phong-lighting.glsl\":\"cGBuf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cGBuf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\nuniform float lighting_uAmbient;\\nuniform float lighting_uDiffuse;\\nuniform float lighting_uShininess;\\nuniform vec3  lighting_uSpecularColor;\\n\\nvec3 lighting_getLightColor(vec3 surfaceColor, vec3 light_direction, vec3 view_direction, vec3 normal_worldspace, vec3 color) {\\n    vec3 halfway_direction = normalize(light_direction + view_direction);\\n    float lambertian = dot(light_direction, normal_worldspace);\\n    float specular = 0.0;\\n    if (lambertian > 0.0) {\\n      float specular_angle = max(dot(normal_worldspace, halfway_direction), 0.0);\\n      specular = pow(specular_angle, lighting_uShininess);\\n    }\\n    lambertian = max(lambertian, 0.0);\\n    return (lambertian * lighting_uDiffuse * surfaceColor + specular * lighting_uSpecularColor) * color;\\n}\\n\\nvec3 lighting_getLightColor(vec3 surfaceColor, vec3 cameraPosition, vec3 position_worldspace, vec3 normal_worldspace) {\\n  vec3 lightColor = surfaceColor;\\n\\n  if (lighting_uEnabled) {\\n    vec3 view_direction = normalize(cameraPosition - position_worldspace);\\n    lightColor = lighting_uAmbient * surfaceColor * lighting_uAmbientLight.color;\\n\\n    for (int i = 0; i < MAX_LIGHTS; i++) {\\n      if (i >= lighting_uPointLightCount) {\\n        break;\\n      }\\n      PointLight pointLight = lighting_uPointLight[i];\\n      vec3 light_position_worldspace = pointLight.position;\\n      vec3 light_direction = normalize(light_position_worldspace - position_worldspace);\\n      lightColor += lighting_getLightColor(surfaceColor, light_direction, view_direction, normal_worldspace, pointLight.color);\\n    }\\n\\n    for (int i = 0; i < MAX_LIGHTS; i++) {\\n      if (i >= lighting_uDirectionalLightCount) {\\n        break;\\n      }\\n      DirectionalLight directionalLight = lighting_uDirectionalLight[i];\\n      lightColor += lighting_getLightColor(surfaceColor, -directionalLight.direction, view_direction, normal_worldspace, directionalLight.color);\\n    }\\n  }\\n  return lightColor;\\n}\\n\\nvec3 lighting_getSpecularLightColor(vec3 cameraPosition, vec3 position_worldspace, vec3 normal_worldspace) {\\n  vec3 lightColor = vec3(0, 0, 0);\\n  vec3 surfaceColor = vec3(0, 0, 0);\\n\\n  if (lighting_uEnabled) {\\n    vec3 view_direction = normalize(cameraPosition - position_worldspace);\\n\\n    for (int i = 0; i < MAX_LIGHTS; i++) {\\n      if (i >= lighting_uPointLightCount) {\\n        break;\\n      }\\n      PointLight pointLight = lighting_uPointLight[i];\\n      vec3 light_position_worldspace = pointLight.position;\\n      vec3 light_direction = normalize(light_position_worldspace - position_worldspace);\\n      lightColor += lighting_getLightColor(surfaceColor, light_direction, view_direction, normal_worldspace, pointLight.color);\\n    }\\n\\n    for (int i = 0; i < MAX_LIGHTS; i++) {\\n      if (i >= lighting_uDirectionalLightCount) {\\n        break;\\n      }\\n      DirectionalLight directionalLight = lighting_uDirectionalLight[i];\\n      lightColor += lighting_getLightColor(surfaceColor, -directionalLight.direction, view_direction, normal_worldspace, directionalLight.color);\\n    }\\n  }\\n  return lightColor;\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5zqOp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _lights = require(\"../lights/lights\");\nvar _lightsDefault = parcelHelpers.interopDefault(_lights);\nvar _pbrVertexGlsl = require(\"./pbr-vertex.glsl\");\nvar _pbrVertexGlslDefault = parcelHelpers.interopDefault(_pbrVertexGlsl);\nvar _pbrFragmentGlsl = require(\"./pbr-fragment.glsl\");\nvar _pbrFragmentGlslDefault = parcelHelpers.interopDefault(_pbrFragmentGlsl);\nexports.default = {\n    name: \"pbr\",\n    vs: (0, _pbrVertexGlslDefault.default),\n    fs: (0, _pbrFragmentGlslDefault.default),\n    defines: {\n        LIGHTING_FRAGMENT: 1\n    },\n    dependencies: [\n        (0, _lightsDefault.default)\n    ]\n};\n\n},{\"../lights/lights\":\"cTDxr\",\"./pbr-vertex.glsl\":\"kaBBf\",\"./pbr-fragment.glsl\":\"9Kgoz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kaBBf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"uniform mat4 u_MVPMatrix;\\nuniform mat4 u_ModelMatrix;\\nuniform mat4 u_NormalMatrix;\\n\\nvarying vec3 pbr_vPosition;\\nvarying vec2 pbr_vUV;\\n\\n#ifdef HAS_NORMALS\\n# ifdef HAS_TANGENTS\\nvarying mat3 pbr_vTBN;\\n# else\\nvarying vec3 pbr_vNormal;\\n# endif\\n#endif\\n\\nvoid pbr_setPositionNormalTangentUV(vec4 position, vec4 normal, vec4 tangent, vec2 uv)\\n{\\n  vec4 pos = u_ModelMatrix * position;\\n  pbr_vPosition = vec3(pos.xyz) / pos.w;\\n\\n#ifdef HAS_NORMALS\\n#ifdef HAS_TANGENTS\\n  vec3 normalW = normalize(vec3(u_NormalMatrix * vec4(normal.xyz, 0.0)));\\n  vec3 tangentW = normalize(vec3(u_ModelMatrix * vec4(tangent.xyz, 0.0)));\\n  vec3 bitangentW = cross(normalW, tangentW) * tangent.w;\\n  pbr_vTBN = mat3(tangentW, bitangentW, normalW);\\n#else\\n  pbr_vNormal = normalize(vec3(u_ModelMatrix * vec4(normal.xyz, 0.0)));\\n#endif\\n#endif\\n\\n#ifdef HAS_UV\\n  pbr_vUV = uv;\\n#else\\n  pbr_vUV = vec2(0.,0.);\\n#endif\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Kgoz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#if (__VERSION__ < 300)\\n#extension GL_EXT_shader_texture_lod: enable\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\n\\n\\n#if (__VERSION__ < 300)\\n  #define SMART_FOR(INIT, WEBGL1COND, WEBGL2COND, INCR) for (INIT; WEBGL1COND; INCR)\\n#else\\n  #define SMART_FOR(INIT, WEBGL1COND, WEBGL2COND, INCR) for (INIT; WEBGL2COND; INCR)\\n#endif\\n\\nprecision highp float;\\n\\nuniform bool pbr_uUnlit;\\n\\n#ifdef USE_IBL\\nuniform samplerCube u_DiffuseEnvSampler;\\nuniform samplerCube u_SpecularEnvSampler;\\nuniform sampler2D u_brdfLUT;\\nuniform vec2 u_ScaleIBLAmbient;\\n#endif\\n\\n#ifdef HAS_BASECOLORMAP\\nuniform sampler2D u_BaseColorSampler;\\n#endif\\n#ifdef HAS_NORMALMAP\\nuniform sampler2D u_NormalSampler;\\nuniform float u_NormalScale;\\n#endif\\n#ifdef HAS_EMISSIVEMAP\\nuniform sampler2D u_EmissiveSampler;\\nuniform vec3 u_EmissiveFactor;\\n#endif\\n#ifdef HAS_METALROUGHNESSMAP\\nuniform sampler2D u_MetallicRoughnessSampler;\\n#endif\\n#ifdef HAS_OCCLUSIONMAP\\nuniform sampler2D u_OcclusionSampler;\\nuniform float u_OcclusionStrength;\\n#endif\\n\\n#ifdef ALPHA_CUTOFF\\nuniform float u_AlphaCutoff;\\n#endif\\n\\nuniform vec2 u_MetallicRoughnessValues;\\nuniform vec4 u_BaseColorFactor;\\n\\nuniform vec3 u_Camera;\\n#ifdef PBR_DEBUG\\nuniform vec4 u_ScaleDiffBaseMR;\\nuniform vec4 u_ScaleFGDSpec;\\n#endif\\n\\nvarying vec3 pbr_vPosition;\\n\\nvarying vec2 pbr_vUV;\\n\\n#ifdef HAS_NORMALS\\n#ifdef HAS_TANGENTS\\nvarying mat3 pbr_vTBN;\\n#else\\nvarying vec3 pbr_vNormal;\\n#endif\\n#endif\\n\\n\\nstruct PBRInfo\\n{\\n  float NdotL;\\n  float NdotV;\\n  float NdotH;\\n  float LdotH;\\n  float VdotH;\\n  float perceptualRoughness;\\n  float metalness;\\n  vec3 reflectance0;\\n  vec3 reflectance90;\\n  float alphaRoughness;\\n  vec3 diffuseColor;\\n  vec3 specularColor;\\n  vec3 n;\\n  vec3 v;\\n};\\n\\nconst float M_PI = 3.141592653589793;\\nconst float c_MinRoughness = 0.04;\\n\\nvec4 SRGBtoLINEAR(vec4 srgbIn)\\n{\\n#ifdef MANUAL_SRGB\\n#ifdef SRGB_FAST_APPROXIMATION\\n  vec3 linOut = pow(srgbIn.xyz,vec3(2.2));\\n#else\\n  vec3 bLess = step(vec3(0.04045),srgbIn.xyz);\\n  vec3 linOut = mix( srgbIn.xyz/vec3(12.92), pow((srgbIn.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), bLess );\\n#endif\\n  return vec4(linOut,srgbIn.w);;\\n#else\\n  return srgbIn;\\n#endif\\n}\\n\\nvec3 getNormal()\\n{\\n#ifndef HAS_TANGENTS\\n  vec3 pos_dx = dFdx(pbr_vPosition);\\n  vec3 pos_dy = dFdy(pbr_vPosition);\\n  vec3 tex_dx = dFdx(vec3(pbr_vUV, 0.0));\\n  vec3 tex_dy = dFdy(vec3(pbr_vUV, 0.0));\\n  vec3 t = (tex_dy.t * pos_dx - tex_dx.t * pos_dy) / (tex_dx.s * tex_dy.t - tex_dy.s * tex_dx.t);\\n\\n#ifdef HAS_NORMALS\\n  vec3 ng = normalize(pbr_vNormal);\\n#else\\n  vec3 ng = cross(pos_dx, pos_dy);\\n#endif\\n\\n  t = normalize(t - ng * dot(ng, t));\\n  vec3 b = normalize(cross(ng, t));\\n  mat3 tbn = mat3(t, b, ng);\\n#else\\n  mat3 tbn = pbr_vTBN;\\n#endif\\n\\n#ifdef HAS_NORMALMAP\\n  vec3 n = texture2D(u_NormalSampler, pbr_vUV).rgb;\\n  n = normalize(tbn * ((2.0 * n - 1.0) * vec3(u_NormalScale, u_NormalScale, 1.0)));\\n#else\\n  vec3 n = normalize(tbn[2].xyz);\\n#endif\\n\\n  return n;\\n}\\n\\n\\n#ifdef USE_IBL\\nvec3 getIBLContribution(PBRInfo pbrInputs, vec3 n, vec3 reflection)\\n{\\n  float mipCount = 9.0;\\n  float lod = (pbrInputs.perceptualRoughness * mipCount);\\n  vec3 brdf = SRGBtoLINEAR(texture2D(u_brdfLUT,\\n    vec2(pbrInputs.NdotV, 1.0 - pbrInputs.perceptualRoughness))).rgb;\\n  vec3 diffuseLight = SRGBtoLINEAR(textureCube(u_DiffuseEnvSampler, n)).rgb;\\n\\n#ifdef USE_TEX_LOD\\n  vec3 specularLight = SRGBtoLINEAR(textureCubeLodEXT(u_SpecularEnvSampler, reflection, lod)).rgb;\\n#else\\n  vec3 specularLight = SRGBtoLINEAR(textureCube(u_SpecularEnvSampler, reflection)).rgb;\\n#endif\\n\\n  vec3 diffuse = diffuseLight * pbrInputs.diffuseColor;\\n  vec3 specular = specularLight * (pbrInputs.specularColor * brdf.x + brdf.y);\\n  diffuse *= u_ScaleIBLAmbient.x;\\n  specular *= u_ScaleIBLAmbient.y;\\n\\n  return diffuse + specular;\\n}\\n#endif\\n\\n\\nvec3 diffuse(PBRInfo pbrInputs)\\n{\\n  return pbrInputs.diffuseColor / M_PI;\\n}\\n\\nvec3 specularReflection(PBRInfo pbrInputs)\\n{\\n  return pbrInputs.reflectance0 +\\n    (pbrInputs.reflectance90 - pbrInputs.reflectance0) *\\n    pow(clamp(1.0 - pbrInputs.VdotH, 0.0, 1.0), 5.0);\\n}\\n\\n\\n\\nfloat geometricOcclusion(PBRInfo pbrInputs)\\n{\\n  float NdotL = pbrInputs.NdotL;\\n  float NdotV = pbrInputs.NdotV;\\n  float r = pbrInputs.alphaRoughness;\\n\\n  float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL)));\\n  float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV)));\\n  return attenuationL * attenuationV;\\n}\\n\\n\\n\\n\\n\\nfloat microfacetDistribution(PBRInfo pbrInputs)\\n{\\n  float roughnessSq = pbrInputs.alphaRoughness * pbrInputs.alphaRoughness;\\n  float f = (pbrInputs.NdotH * roughnessSq - pbrInputs.NdotH) * pbrInputs.NdotH + 1.0;\\n  return roughnessSq / (M_PI * f * f);\\n}\\n\\nvoid PBRInfo_setAmbientLight(inout PBRInfo pbrInputs) {\\n  pbrInputs.NdotL = 1.0;\\n  pbrInputs.NdotH = 0.0;\\n  pbrInputs.LdotH = 0.0;\\n  pbrInputs.VdotH = 1.0;\\n}\\n\\nvoid PBRInfo_setDirectionalLight(inout PBRInfo pbrInputs, vec3 lightDirection) {\\n  vec3 n = pbrInputs.n;\\n  vec3 v = pbrInputs.v;\\n  vec3 l = normalize(lightDirection);\\n  vec3 h = normalize(l+v);\\n\\n  pbrInputs.NdotL = clamp(dot(n, l), 0.001, 1.0);\\n  pbrInputs.NdotH = clamp(dot(n, h), 0.0, 1.0);\\n  pbrInputs.LdotH = clamp(dot(l, h), 0.0, 1.0);\\n  pbrInputs.VdotH = clamp(dot(v, h), 0.0, 1.0);\\n}\\n\\nvoid PBRInfo_setPointLight(inout PBRInfo pbrInputs, PointLight pointLight) {\\n  vec3 light_direction = normalize(pointLight.position - pbr_vPosition);\\n  PBRInfo_setDirectionalLight(pbrInputs, light_direction);\\n}\\n\\nvec3 calculateFinalColor(PBRInfo pbrInputs, vec3 lightColor) {\\n  vec3 F = specularReflection(pbrInputs);\\n  float G = geometricOcclusion(pbrInputs);\\n  float D = microfacetDistribution(pbrInputs);\\n  vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs);\\n  vec3 specContrib = F * G * D / (4.0 * pbrInputs.NdotL * pbrInputs.NdotV);\\n  return pbrInputs.NdotL * lightColor * (diffuseContrib + specContrib);\\n}\\n\\nvec4 pbr_filterColor(vec4 colorUnused)\\n{\\n#ifdef HAS_BASECOLORMAP\\n  vec4 baseColor = SRGBtoLINEAR(texture2D(u_BaseColorSampler, pbr_vUV)) * u_BaseColorFactor;\\n#else\\n  vec4 baseColor = u_BaseColorFactor;\\n#endif\\n\\n#ifdef ALPHA_CUTOFF\\n  if (baseColor.a < u_AlphaCutoff) {\\n    discard;\\n  }\\n#endif\\n\\n  vec3 color = vec3(0, 0, 0);\\n\\n  if(pbr_uUnlit){\\n    color.rgb = baseColor.rgb;\\n  }\\n  else{\\n\\n\\n    float perceptualRoughness = u_MetallicRoughnessValues.y;\\n    float metallic = u_MetallicRoughnessValues.x;\\n#ifdef HAS_METALROUGHNESSMAP\\n\\n    vec4 mrSample = texture2D(u_MetallicRoughnessSampler, pbr_vUV);\\n    perceptualRoughness = mrSample.g * perceptualRoughness;\\n    metallic = mrSample.b * metallic;\\n#endif\\n    perceptualRoughness = clamp(perceptualRoughness, c_MinRoughness, 1.0);\\n    metallic = clamp(metallic, 0.0, 1.0);\\n\\n    float alphaRoughness = perceptualRoughness * perceptualRoughness;\\n\\n    vec3 f0 = vec3(0.04);\\n    vec3 diffuseColor = baseColor.rgb * (vec3(1.0) - f0);\\n    diffuseColor *= 1.0 - metallic;\\n    vec3 specularColor = mix(f0, baseColor.rgb, metallic);\\n    float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);\\n\\n\\n\\n    float reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0);\\n    vec3 specularEnvironmentR0 = specularColor.rgb;\\n    vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0) * reflectance90;\\n\\n    vec3 n = getNormal();\\n    vec3 v = normalize(u_Camera - pbr_vPosition);\\n\\n    float NdotV = clamp(abs(dot(n, v)), 0.001, 1.0);\\n    vec3 reflection = -normalize(reflect(v, n));\\n\\n    PBRInfo pbrInputs = PBRInfo(\\n      0.0,\\n      NdotV,\\n      0.0,\\n      0.0,\\n      0.0,\\n      perceptualRoughness,\\n      metallic,\\n      specularEnvironmentR0,\\n      specularEnvironmentR90,\\n      alphaRoughness,\\n      diffuseColor,\\n      specularColor,\\n      n,\\n      v\\n    );\\n\\n#ifdef USE_LIGHTS\\n    PBRInfo_setAmbientLight(pbrInputs);\\n    color += calculateFinalColor(pbrInputs, lighting_uAmbientLight.color);\\n    SMART_FOR(int i = 0, i < MAX_LIGHTS, i < lighting_uDirectionalLightCount, i++) {\\n      if (i < lighting_uDirectionalLightCount) {\\n        PBRInfo_setDirectionalLight(pbrInputs, lighting_uDirectionalLight[i].direction);\\n        color += calculateFinalColor(pbrInputs, lighting_uDirectionalLight[i].color);\\n      }\\n    }\\n    SMART_FOR(int i = 0, i < MAX_LIGHTS, i < lighting_uPointLightCount, i++) {\\n      if (i < lighting_uPointLightCount) {\\n        PBRInfo_setPointLight(pbrInputs, lighting_uPointLight[i]);\\n        float attenuation = getPointLightAttenuation(lighting_uPointLight[i], distance(lighting_uPointLight[i].position, pbr_vPosition));\\n        color += calculateFinalColor(pbrInputs, lighting_uPointLight[i].color / attenuation);\\n      }\\n    }\\n#endif\\n#ifdef USE_IBL\\n    color += getIBLContribution(pbrInputs, n, reflection);\\n#endif\\n#ifdef HAS_OCCLUSIONMAP\\n    float ao = texture2D(u_OcclusionSampler, pbr_vUV).r;\\n    color = mix(color, color * ao, u_OcclusionStrength);\\n#endif\\n\\n#ifdef HAS_EMISSIVEMAP\\n    vec3 emissive = SRGBtoLINEAR(texture2D(u_EmissiveSampler, pbr_vUV)).rgb * u_EmissiveFactor;\\n    color += emissive;\\n#endif\\n\\n#ifdef PBR_DEBUG\\n\\n\\n\\n\\n\\n    color = mix(color, baseColor.rgb, u_ScaleDiffBaseMR.y);\\n    color = mix(color, vec3(metallic), u_ScaleDiffBaseMR.z);\\n    color = mix(color, vec3(perceptualRoughness), u_ScaleDiffBaseMR.w);\\n#endif\\n\\n  }\\n\\n  return vec4(pow(color,vec3(1.0/2.2)), baseColor.a);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lSv9q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float brightness;\\nuniform float contrast;\\n\\nvec4 brightnessContrast_filterColor(vec4 color) {\\n  color.rgb += brightness;\\n  if (contrast > 0.0) {\\n    color.rgb = (color.rgb - 0.5) / (1.0 - contrast) + 0.5;\\n  } else {\\n    color.rgb = (color.rgb - 0.5) * (1.0 + contrast) + 0.5;\\n  }\\n  return color;\\n}\\n\\nvec4 brightnessContrast_filterColor(vec4 color, vec2 texSize, vec2 texCoords) {\\n  return brightnessContrast_filterColor(color);\\n}\\n\";\nvar uniforms = {\n    brightness: {\n        value: 0,\n        min: -1,\n        max: 1\n    },\n    contrast: {\n        value: 0,\n        min: -1,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"brightnessContrast\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eqY1x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float strength;\\n\\nvec4 denoise_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  float adjustedExponent = 3. + 200. * pow(1. - strength, 4.);\\n\\n  vec4 center = texture2D(texture, texCoord);\\n  vec4 color = vec4(0.0);\\n  float total = 0.0;\\n  for (float x = -4.0; x <= 4.0; x += 1.0) {\\n    for (float y = -4.0; y <= 4.0; y += 1.0) {\\n      vec4 sample = texture2D(texture, texCoord + vec2(x, y) / texSize);\\n      float weight = 1.0 - abs(dot(sample.rgb - center.rgb, vec3(0.25)));\\n      weight = pow(weight, adjustedExponent);\\n      color += sample * weight;\\n      total += weight;\\n    }\\n  }\\n\\n  return color / total;\\n}\\n\";\nvar uniforms = {\n    strength: {\n        value: 0.5,\n        min: 0,\n        max: 0.1,\n        adjust: function adjust(strength) {\n            return 0.53 + 200 * Math.pow(1 - strength, 4);\n        }\n    }\n};\nexports.default = {\n    name: \"denoise\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            sampler: true\n        },\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8WZug\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float hue;\\nuniform float saturation;\\n\\nvec4 hueSaturation_filterColor(vec4 color) {\\n  float angle = hue * 3.14159265;\\n  float s = sin(angle), c = cos(angle);\\n  vec3 weights = (vec3(2.0 * c, -sqrt(3.0) * s - c, sqrt(3.0) * s - c) + 1.0) / 3.0;\\n  float len = length(color.rgb);\\n  color.rgb = vec3(\\n    dot(color.rgb, weights.xyz),\\n    dot(color.rgb, weights.zxy),\\n    dot(color.rgb, weights.yzx)\\n  );\\n  float average = (color.r + color.g + color.b) / 3.0;\\n  if (saturation > 0.0) {\\n    color.rgb += (average - color.rgb) * (1.0 - 1.0 / (1.001 - saturation));\\n  } else {\\n    color.rgb += (average - color.rgb) * (-saturation);\\n  }\\n\\n  return color;\\n}\\n\\nvec4 hueSaturation_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return hueSaturation_filterColor(color);\\n}\\n\";\nvar uniforms = {\n    hue: {\n        value: 0,\n        min: -1,\n        max: 1\n    },\n    saturation: {\n        value: 0,\n        min: -1,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"hueSaturation\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lESRJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float amount;\\n\\nfloat rand(vec2 co) {\\n  return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\\n}\\n\\nvec4 noise_filterColor(vec4 color, vec2 texCoord) {\\n  float diff = (rand(texCoord) - 0.5) * amount;\\n  color.r += diff;\\n  color.g += diff;\\n  color.b += diff;\\n  return color;\\n}\\n\\nvec4 noise_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return noise_filterColor(color, texCoord);\\n}\\n\";\nvar uniforms = {\n    amount: {\n        value: 0.5,\n        min: 0,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"noise\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f44v6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float amount;\\n\\nvec4 sepia_filterColor(vec4 color) {\\n  float r = color.r;\\n  float g = color.g;\\n  float b = color.b;\\n\\n  color.r =\\n    min(1.0, (r * (1.0 - (0.607 * amount))) + (g * (0.769 * amount)) + (b * (0.189 * amount)));\\n  color.g = min(1.0, (r * 0.349 * amount) + (g * (1.0 - (0.314 * amount))) + (b * 0.168 * amount));\\n  color.b = min(1.0, (r * 0.272 * amount) + (g * 0.534 * amount) + (b * (1.0 - (0.869 * amount))));\\n\\n  return color;\\n}\\n\\nvec4 sepia_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return sepia_filterColor(color);\\n}\\n\";\nvar uniforms = {\n    amount: {\n        value: 0.5,\n        min: 0,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"sepia\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lEVz2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float amount;\\n\\nvec4 vibrance_filterColor(vec4 color) {\\n  float average = (color.r + color.g + color.b) / 3.0;\\n  float mx = max(color.r, max(color.g, color.b));\\n  float amt = (mx - average) * (-amount * 3.0);\\n  color.rgb = mix(color.rgb, vec3(mx), amt);\\n  return color;\\n}\\n\\nvec4 vibrance_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return vibrance_filterColor(color);\\n}\\n\";\nvar uniforms = {\n    amount: {\n        value: 0,\n        min: -1,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"vibrance\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4CaGz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float radius;\\nuniform float amount;\\n\\nvec4 vignette_filterColor(vec4 color, vec2 texCoord) {\\n  float dist = distance(texCoord, vec2(0.5, 0.5));\\n  float ratio = smoothstep(0.8, radius * 0.799, dist * (amount + radius));\\n  return color.rgba * ratio + (1.0 - ratio)*vec4(0.0, 0.0, 0.0, 1.0);\\n}\\n\\nvec4 vignette_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  return vignette_filterColor(color, texCoord);\\n}\\n\";\nvar uniforms = {\n    radius: {\n        value: 0.5,\n        min: 0,\n        max: 1\n    },\n    amount: {\n        value: 0.5,\n        min: 0,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"vignette\",\n    fs: fs,\n    uniforms: uniforms,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"KfZur\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _random = require(\"../utils/random\");\nvar _randomDefault = parcelHelpers.interopDefault(_random);\nvar fs = \"uniform float blurRadius;\\nuniform float gradientRadius;\\nuniform vec2 start;\\nuniform vec2 end;\\nuniform bool invert;\\n\\nvec2 tiltShift_getDelta(vec2 texSize) {\\n  vec2 vector = normalize((end - start) * texSize);\\n  return invert ? vec2(-vector.y, vector.x) : vector;\\n}\\n\\nvec4 tiltShift_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec4 color = vec4(0.0);\\n  float total = 0.0;\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  vec2 normal = normalize(vec2((start.y - end.y) * texSize.y, (end.x - start.x) * texSize.x));\\n  float radius = smoothstep(0.0, 1.0,\\n    abs(dot(texCoord * texSize - start * texSize, normal)) / gradientRadius) * blurRadius;\\n\\n  for (float t = -30.0; t <= 30.0; t++) {\\n    float percent = (t + offset - 0.5) / 30.0;\\n    float weight = 1.0 - abs(percent);\\n    vec4 sample = texture2D(texture, texCoord + tiltShift_getDelta(texSize) / texSize * percent * radius);\\n    sample.rgb *= sample.a;\\n\\n    color += sample * weight;\\n    total += weight;\\n  }\\n\\n  color = color / total;\\n  color.rgb /= color.a + 0.00001;\\n\\n  return color;\\n}\\n\";\nvar uniforms = {\n    blurRadius: {\n        value: 15,\n        min: 0,\n        max: 50\n    },\n    gradientRadius: {\n        value: 200,\n        min: 0,\n        max: 400\n    },\n    start: [\n        0,\n        0\n    ],\n    end: [\n        1,\n        1\n    ],\n    invert: {\n        value: false,\n        \"private\": true\n    }\n};\nexports.default = {\n    name: \"tiltShift\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _randomDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true,\n            uniforms: {\n                invert: false\n            }\n        },\n        {\n            sampler: true,\n            uniforms: {\n                invert: true\n            }\n        }\n    ]\n};\n\n},{\"../utils/random\":\"5FKKa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5FKKa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"float random(vec3 scale, float seed) {\\n  return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\\n}\\n\";\nexports.default = {\n    name: \"random\",\n    fs: fs\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aOod8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _random = require(\"../utils/random\");\nvar _randomDefault = parcelHelpers.interopDefault(_random);\nvar fs = \"uniform float radius;\\nuniform vec2 delta;\\n\\nvec4 triangleBlur_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 adjustedDelta = delta * radius / texSize;\\n\\n  vec4 color = vec4(0.0);\\n  float total = 0.0;\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  for (float t = -30.0; t <= 30.0; t++) {\\n    float percent = (t + offset - 0.5) / 30.0;\\n    float weight = 1.0 - abs(percent);\\n    vec4 sample = texture2D(texture, texCoord + adjustedDelta * percent);\\n    sample.rgb *= sample.a;\\n\\n    color += sample * weight;\\n    total += weight;\\n  }\\n\\n  color = color / total;\\n  color.rgb /= color.a + 0.00001;\\n\\n  return color;\\n}\\n\";\nvar uniforms = {\n    radius: {\n        value: 20,\n        min: 0,\n        softMax: 100\n    },\n    delta: {\n        value: [\n            1,\n            0\n        ],\n        \"private\": true\n    }\n};\nexports.default = {\n    name: \"triangleBlur\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _randomDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true,\n            uniforms: {\n                delta: [\n                    1,\n                    0\n                ]\n            }\n        },\n        {\n            sampler: true,\n            uniforms: {\n                delta: [\n                    0,\n                    1\n                ]\n            }\n        }\n    ]\n};\n\n},{\"../utils/random\":\"5FKKa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"0vP3r\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _random = require(\"../utils/random\");\nvar _randomDefault = parcelHelpers.interopDefault(_random);\nvar fs = \"\\nuniform vec2 center;\\nuniform float strength;\\n\\nvec4 zoomBlur_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec4 color = vec4(0.0);\\n  float total = 0.0;\\n  vec2 toCenter = center * texSize - texCoord * texSize;\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  for (float t = 0.0; t <= 40.0; t++) {\\n    float percent = (t + offset) / 40.0;\\n    float weight = 4.0 * (percent - percent * percent);\\n    vec4 sample = texture2D(texture, texCoord + toCenter * percent * strength / texSize);\\n    sample.rgb *= sample.a;\\n\\n    color += sample * weight;\\n    total += weight;\\n  }\\n\\n  color = color / total;\\n  color.rgb /= color.a + 0.00001;\\n\\n  return color;\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    strength: {\n        value: 0.3,\n        min: 0,\n        softMax: 1\n    }\n};\nexports.default = {\n    name: \"zoomBlur\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _randomDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"../utils/random\":\"5FKKa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6oIsO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform vec2 center;\\nuniform float angle;\\nuniform float size;\\n\\nfloat scale = 3.1514 / size;\\n\\nfloat pattern(float angle, vec2 texSize, vec2 texCoord) {\\n  float s = sin(angle), c = cos(angle);\\n  vec2 tex = texCoord * texSize - center * texSize;\\n  vec2 point = vec2(\\n\tc * tex.x - s * tex.y,\\n\ts * tex.x + c * tex.y\\n  ) * scale;\\n  return (sin(point.x) * sin(point.y)) * 4.0;\\n}\\n\\nvec4 colorHalftone_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  vec3 cmy = 1.0 - color.rgb;\\n  float k = min(cmy.x, min(cmy.y, cmy.z));\\n  cmy = (cmy - k) / (1.0 - k);\\n  cmy = clamp(\\n\tcmy * 10.0 - 3.0 + vec3(\\n    pattern(angle + 0.26179, texSize, texCoord),\\n\t  pattern(angle + 1.30899, texSize, texCoord),\\n    pattern(angle, texSize, texCoord)\\n  ),\\n\t0.0,\\n\t1.0\\n  );\\n  k = clamp(k * 10.0 - 5.0 + pattern(angle + 0.78539, texSize, texCoord), 0.0, 1.0);\\n  return vec4(1.0 - cmy - k, color.a);\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    angle: {\n        value: 1.1,\n        softMin: 0,\n        softMax: Math.PI / 2\n    },\n    size: {\n        value: 4,\n        min: 1,\n        softMin: 3,\n        softMax: 20\n    }\n};\nexports.default = {\n    name: \"colorHalftone\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ho4mG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform vec2 center;\\nuniform float angle;\\nuniform float size;\\n\\nfloat pattern(vec2 texSize, vec2 texCoord) {\\n  float scale = 3.1415 / size;\\n\\n  float s = sin(angle), c = cos(angle);\\n  vec2 tex = texCoord * texSize - center * texSize;\\n  vec2 point = vec2(\\n    c * tex.x - s * tex.y,\\n    s * tex.x + c * tex.y\\n  ) * scale;\\n  return (sin(point.x) * sin(point.y)) * 4.0;\\n}\\n\\nvec4 dotScreen_filterColor(vec4 color, vec2 texSize, vec2 texCoord) {\\n  float average = (color.r + color.g + color.b) / 3.0;\\n  return vec4(vec3(average * 10.0 - 5.0 + pattern(texSize, texCoord)), color.a);\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    angle: {\n        value: 1.1,\n        softMin: 0,\n        softMax: Math.PI / 2\n    },\n    size: {\n        value: 3,\n        min: 1,\n        softMin: 3,\n        softMax: 20\n    }\n};\nexports.default = {\n    name: \"dotScreen\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            filter: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bxMS7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _random = require(\"../utils/random\");\nvar _randomDefault = parcelHelpers.interopDefault(_random);\nvar fs = \"uniform float radius;\\nuniform vec2 delta;\\n\\nvec4 edgeWork_sampleColor1(sampler2D source, vec2 texSize, vec2 texCoord) {\\n  vec2 relativeDelta = radius * delta / texSize;\\n\\n  vec2 color = vec2(0.0);\\n  vec2 total = vec2(0.0);\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  for (float t = -30.0; t <= 30.0; t++) {\\n    float percent = (t + offset - 0.5) / 30.0;\\n    float weight = 1.0 - abs(percent);\\n    vec3 sampleColor = texture2D(source, texCoord + relativeDelta * percent).rgb;\\n    float average = (sampleColor.r + sampleColor.g + sampleColor.b) / 3.0;\\n    color.x += average * weight;\\n    total.x += weight;\\n    if (abs(t) < 15.0) {\\n      weight = weight * 2.0 - 1.0;\\n      color.y += average * weight;\\n      total.y += weight;\\n    }\\n  }\\n  return vec4(color / total, 0.0, 1.0);\\n}\\n\\nvec4 edgeWork_sampleColor2(sampler2D source, vec2 texSize, vec2 texCoord) {\\n  vec2 relativeDelta = radius * delta / texSize;\\n\\n  vec2 color = vec2(0.0);\\n  vec2 total = vec2(0.0);\\n  float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n\\n  for (float t = -30.0; t <= 30.0; t++) {\\n    float percent = (t + offset - 0.5) / 30.0;\\n    float weight = 1.0 - abs(percent);\\n    vec2 sampleColor = texture2D(source, texCoord + relativeDelta * percent).xy;\\n    color.x += sampleColor.x * weight;\\n    total.x += weight;\\n    if (abs(t) < 15.0) {\\n      weight = weight * 2.0 - 1.0;\\n      color.y += sampleColor.y * weight;\\n      total.y += weight;\\n    }\\n  }\\n  float c = clamp(10000.0 * (color.y / total.y - color.x / total.x) + 0.5, 0.0, 1.0);\\n  return vec4(c, c, c, 1.0);\\n}\\n\";\nvar uniforms = {\n    radius: {\n        value: 2,\n        min: 1,\n        softMax: 50\n    },\n    delta: {\n        value: [\n            1,\n            0\n        ],\n        \"private\": true\n    }\n};\nexports.default = {\n    name: \"edgeWork\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _randomDefault.default)\n    ],\n    passes: [\n        {\n            sampler: \"edgeWork_sampleColor1\",\n            uniforms: {\n                delta: [\n                    1,\n                    0\n                ]\n            }\n        },\n        {\n            sampler: \"edgeWork_sampleColor2\",\n            uniforms: {\n                delta: [\n                    0,\n                    1\n                ]\n            }\n        }\n    ]\n};\n\n},{\"../utils/random\":\"5FKKa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8NBWq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform vec2 center;\\nuniform float scale;\\n\\nvec4 hexagonalPixelate_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 tex = (texCoord * texSize - center * texSize) / scale;\\n  tex.y /= 0.866025404;\\n  tex.x -= tex.y * 0.5;\\n\\n  vec2 a;\\n  if (tex.x + tex.y - floor(tex.x) - floor(tex.y) < 1.0) {\\n    a = vec2(floor(tex.x), floor(tex.y));\\n  }\\n  else a = vec2(ceil(tex.x), ceil(tex.y));\\n  vec2 b = vec2(ceil(tex.x), floor(tex.y));\\n  vec2 c = vec2(floor(tex.x), ceil(tex.y));\\n\\n  vec3 TEX = vec3(tex.x, tex.y, 1.0 - tex.x - tex.y);\\n  vec3 A = vec3(a.x, a.y, 1.0 - a.x - a.y);\\n  vec3 B = vec3(b.x, b.y, 1.0 - b.x - b.y);\\n  vec3 C = vec3(c.x, c.y, 1.0 - c.x - c.y);\\n\\n  float alen = length(TEX - A);\\n  float blen = length(TEX - B);\\n  float clen = length(TEX - C);\\n\\n  vec2 choice;\\n  if (alen < blen) {\\n    if (alen < clen) choice = a;\\n    else choice = c;\\n  } else {\\n    if (blen < clen) choice = b;\\n    else choice = c;\\n  }\\n\\n  choice.x += choice.y * 0.5;\\n  choice.y *= 0.866025404;\\n  choice *= scale / texSize;\\n\\n  return texture2D(texture, choice + center);\\n}\\n\";\nvar uniforms = {\n    center: {\n        value: [\n            0.5,\n            0.5\n        ],\n        hint: \"screenspace\"\n    },\n    scale: {\n        value: 10,\n        min: 1,\n        softMin: 5,\n        softMax: 50\n    }\n};\nexports.default = {\n    name: \"hexagonalPixelate\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3i3El\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"uniform float strength;\\n\\nvec4 ink_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 dx = vec2(1.0 / texSize.x, 0.0);\\n  vec2 dy = vec2(0.0, 1.0 / texSize.y);\\n  vec4 color = texture2D(texture, texCoord);\\n  float bigTotal = 0.0;\\n  float smallTotal = 0.0;\\n  vec3 bigAverage = vec3(0.0);\\n  vec3 smallAverage = vec3(0.0);\\n  for (float x = -2.0; x <= 2.0; x += 1.0) {\\n    for (float y = -2.0; y <= 2.0; y += 1.0) {\\n      vec3 sample = texture2D(texture, texCoord + dx * x + dy * y).rgb;\\n      bigAverage += sample;\\n      bigTotal += 1.0;\\n      if (abs(x) + abs(y) < 2.0) {\\n        smallAverage += sample;\\n        smallTotal += 1.0;\\n      }\\n    }\\n  }\\n  vec3 edge = max(vec3(0.0), bigAverage / bigTotal - smallAverage / smallTotal);\\n  float power = strength * strength * strength * strength * strength;\\n  return vec4(color.rgb - dot(edge, edge) * power * 100000.0, color.a);\\n}\\n\";\nvar uniforms = {\n    strength: {\n        value: 0.25,\n        min: 0,\n        softMax: 1\n    }\n};\nexports.default = {\n    name: \"ink\",\n    uniforms: uniforms,\n    fs: fs,\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9PAL9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _warp = require(\"./warp\");\nvar _warpDefault = parcelHelpers.interopDefault(_warp);\nvar fs = \"uniform float radius;\\nuniform float strength;\\nuniform vec2 center;\\n\\nvec2 bulgePinch_warp(vec2 coord, vec2 texCenter) {\\n  coord -= texCenter;\\n  float distance = length(coord);\\n  if (distance < radius) {\\n    float percent = distance / radius;\\n    if (strength > 0.0) {\\n      coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75);\\n    } else {\\n      coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent);\\n    }\\n  }\\n  coord += texCenter;\\n  return coord;\\n}\\n\\nvec4 bulgePinch_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 coord = texCoord * texSize;\\n  coord = bulgePinch_warp(coord, center * texSize);\\n\\n  return warp_sampleColor(texture, texSize, coord);\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    radius: {\n        value: 200,\n        min: 1,\n        softMax: 600\n    },\n    strength: {\n        value: 0.5,\n        min: -1,\n        max: 1\n    }\n};\nexports.default = {\n    name: \"bulgePinch\",\n    fs: fs,\n    uniforms: uniforms,\n    dependencies: [\n        (0, _warpDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"./warp\":\"lvjUL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lvjUL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar fs = \"vec4 warp_sampleColor(sampler2D texture, vec2 texSize, vec2 coord) {\\n  vec4 color = texture2D(texture, coord / texSize);\\n  vec2 clampedCoord = clamp(coord, vec2(0.0), texSize);\\n  if (coord != clampedCoord) {\\n    color.a *= max(0.0, 1.0 - length(coord - clampedCoord));\\n  }\\n\\n  return color;\\n}\\n\";\nexports.default = {\n    name: \"warp\",\n    fs: fs\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"45UY0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _warp = require(\"./warp\");\nvar _warpDefault = parcelHelpers.interopDefault(_warp);\nvar fs = \"uniform float radius;\\nuniform float angle;\\nuniform vec2 center;\\n\\nvec2 swirl_warp(vec2 coord, vec2 texCenter) {\\n  coord -= texCenter;\\n  float distance = length(coord);\\n  if (distance < radius) {\\n    float percent = (radius - distance) / radius;\\n    float theta = percent * percent * angle;\\n    float s = sin(theta);\\n    float c = cos(theta);\\n    coord = vec2(\\n      coord.x * c - coord.y * s,\\n      coord.x * s + coord.y * c\\n    );\\n  }\\n  coord += texCenter;\\n  return coord;\\n}\\n\\nvec4 swirl_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n  vec2 coord = texCoord * texSize;\\n  coord = swirl_warp(coord, center * texSize);\\n\\n  return warp_sampleColor(texture, texSize, coord);\\n}\\n\";\nvar uniforms = {\n    center: [\n        0.5,\n        0.5\n    ],\n    radius: {\n        value: 200,\n        min: 1,\n        softMax: 600\n    },\n    angle: {\n        value: 3,\n        softMin: -25,\n        softMax: 25\n    }\n};\nexports.default = {\n    name: \"swirl\",\n    uniforms: uniforms,\n    fs: fs,\n    dependencies: [\n        (0, _warpDefault.default)\n    ],\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"./warp\":\"lvjUL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4ANRj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * ORIGINAL LICENCE\n * @license\n * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *  * Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *  * Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *  * Neither the name of NVIDIA CORPORATION nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */ var fs = \"\\n#define FXAA_QUALITY_PRESET 29\\n\\n#if (FXAA_QUALITY_PRESET == 10)\\n    #define FXAA_QUALITY_PS 3\\n    #define FXAA_QUALITY_P0 1.5\\n    #define FXAA_QUALITY_P1 3.0\\n    #define FXAA_QUALITY_P2 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 11)\\n    #define FXAA_QUALITY_PS 4\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 3.0\\n    #define FXAA_QUALITY_P3 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 12)\\n    #define FXAA_QUALITY_PS 5\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 4.0\\n    #define FXAA_QUALITY_P4 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 13)\\n    #define FXAA_QUALITY_PS 6\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 4.0\\n    #define FXAA_QUALITY_P5 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 14)\\n    #define FXAA_QUALITY_PS 7\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 4.0\\n    #define FXAA_QUALITY_P6 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 15)\\n    #define FXAA_QUALITY_PS 8\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 4.0\\n    #define FXAA_QUALITY_P7 12.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 20)\\n    #define FXAA_QUALITY_PS 3\\n    #define FXAA_QUALITY_P0 1.5\\n    #define FXAA_QUALITY_P1 2.0\\n    #define FXAA_QUALITY_P2 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 21)\\n    #define FXAA_QUALITY_PS 4\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 22)\\n    #define FXAA_QUALITY_PS 5\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 23)\\n    #define FXAA_QUALITY_PS 6\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 24)\\n    #define FXAA_QUALITY_PS 7\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 3.0\\n    #define FXAA_QUALITY_P6 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 25)\\n    #define FXAA_QUALITY_PS 8\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 4.0\\n    #define FXAA_QUALITY_P7 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 26)\\n    #define FXAA_QUALITY_PS 9\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 4.0\\n    #define FXAA_QUALITY_P8 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 27)\\n    #define FXAA_QUALITY_PS 10\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 2.0\\n    #define FXAA_QUALITY_P8 4.0\\n    #define FXAA_QUALITY_P9 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 28)\\n    #define FXAA_QUALITY_PS 11\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 2.0\\n    #define FXAA_QUALITY_P8 2.0\\n    #define FXAA_QUALITY_P9 4.0\\n    #define FXAA_QUALITY_P10 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 29)\\n    #define FXAA_QUALITY_PS 12\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.5\\n    #define FXAA_QUALITY_P2 2.0\\n    #define FXAA_QUALITY_P3 2.0\\n    #define FXAA_QUALITY_P4 2.0\\n    #define FXAA_QUALITY_P5 2.0\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 2.0\\n    #define FXAA_QUALITY_P8 2.0\\n    #define FXAA_QUALITY_P9 2.0\\n    #define FXAA_QUALITY_P10 4.0\\n    #define FXAA_QUALITY_P11 8.0\\n#endif\\n#if (FXAA_QUALITY_PRESET == 39)\\n    #define FXAA_QUALITY_PS 12\\n    #define FXAA_QUALITY_P0 1.0\\n    #define FXAA_QUALITY_P1 1.0\\n    #define FXAA_QUALITY_P2 1.0\\n    #define FXAA_QUALITY_P3 1.0\\n    #define FXAA_QUALITY_P4 1.0\\n    #define FXAA_QUALITY_P5 1.5\\n    #define FXAA_QUALITY_P6 2.0\\n    #define FXAA_QUALITY_P7 2.0\\n    #define FXAA_QUALITY_P8 2.0\\n    #define FXAA_QUALITY_P9 2.0\\n    #define FXAA_QUALITY_P10 4.0\\n    #define FXAA_QUALITY_P11 8.0\\n#endif\\n\\n#define FxaaBool bool\\n#define FxaaFloat float\\n#define FxaaFloat2 vec2\\n#define FxaaFloat3 vec3\\n#define FxaaFloat4 vec4\\n#define FxaaHalf float\\n#define FxaaHalf2 vec2\\n#define FxaaHalf3 vec3\\n#define FxaaHalf4 vec4\\n#define FxaaInt2 vec2\\n#define FxaaTex sampler2D\\n\\n#define FxaaSat(x) clamp(x, 0.0, 1.0)\\n#define FxaaTexTop(t, p) texture2D(t, p)\\n#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r))\\n\\nFxaaFloat FxaaLuma_(FxaaFloat4 rgba) { return dot(rgba.rgb, vec3(0.2126, 0.7152, 0.0722)); }\\n\\nFxaaFloat4 FxaaPixelShader_(\\n\\n\\n    FxaaFloat2 pos,\\n\\n\\n\\n\\n    FxaaTex tex,\\n\\n\\n\\n\\n    FxaaFloat2 fxaaQualityRcpFrame,\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n    FxaaFloat fxaaQualitySubpix,\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n    FxaaFloat fxaaQualityEdgeThreshold,\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n    FxaaFloat fxaaQualityEdgeThresholdMin\\n) {\\n    FxaaFloat2 posM;\\n    posM.x = pos.x;\\n    posM.y = pos.y;\\n    FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\\n    #define lumaM rgbyM.y\\n    FxaaFloat lumaS = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaE = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaN = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaW = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));\\n    FxaaFloat maxSM = max(lumaS, lumaM);\\n    FxaaFloat minSM = min(lumaS, lumaM);\\n    FxaaFloat maxESM = max(lumaE, maxSM);\\n    FxaaFloat minESM = min(lumaE, minSM);\\n    FxaaFloat maxWN = max(lumaN, lumaW);\\n    FxaaFloat minWN = min(lumaN, lumaW);\\n    FxaaFloat rangeMax = max(maxWN, maxESM);\\n    FxaaFloat rangeMin = min(minWN, minESM);\\n    FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;\\n    FxaaFloat range = rangeMax - rangeMin;\\n    FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);\\n    FxaaBool earlyExit = range < rangeMaxClamped;\\n    if(earlyExit)\\n        return rgbyM;\\n    FxaaFloat lumaNW = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaSE = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaNE = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaSW = FxaaLuma_(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\\n    FxaaFloat lumaNS = lumaN + lumaS;\\n    FxaaFloat lumaWE = lumaW + lumaE;\\n    FxaaFloat subpixRcpRange = 1.0/range;\\n    FxaaFloat subpixNSWE = lumaNS + lumaWE;\\n    FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;\\n    FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;\\n    FxaaFloat lumaNESE = lumaNE + lumaSE;\\n    FxaaFloat lumaNWNE = lumaNW + lumaNE;\\n    FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;\\n    FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;\\n    FxaaFloat lumaNWSW = lumaNW + lumaSW;\\n    FxaaFloat lumaSWSE = lumaSW + lumaSE;\\n    FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);\\n    FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);\\n    FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;\\n    FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;\\n    FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;\\n    FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;\\n    FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;\\n    FxaaFloat lengthSign = fxaaQualityRcpFrame.x;\\n    FxaaBool horzSpan = edgeHorz >= edgeVert;\\n    FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;\\n    if(!horzSpan) lumaN = lumaW;\\n    if(!horzSpan) lumaS = lumaE;\\n    if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;\\n    FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;\\n    FxaaFloat gradientN = lumaN - lumaM;\\n    FxaaFloat gradientS = lumaS - lumaM;\\n    FxaaFloat lumaNN = lumaN + lumaM;\\n    FxaaFloat lumaSS = lumaS + lumaM;\\n    FxaaBool pairN = abs(gradientN) >= abs(gradientS);\\n    FxaaFloat gradient = max(abs(gradientN), abs(gradientS));\\n    if(pairN) lengthSign = -lengthSign;\\n    FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);\\n    FxaaFloat2 posB;\\n    posB.x = posM.x;\\n    posB.y = posM.y;\\n    FxaaFloat2 offNP;\\n    offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\\n    offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\\n    if(!horzSpan) posB.x += lengthSign * 0.5;\\n    if( horzSpan) posB.y += lengthSign * 0.5;\\n    FxaaFloat2 posN;\\n    posN.x = posB.x - offNP.x * FXAA_QUALITY_P0;\\n    posN.y = posB.y - offNP.y * FXAA_QUALITY_P0;\\n    FxaaFloat2 posP;\\n    posP.x = posB.x + offNP.x * FXAA_QUALITY_P0;\\n    posP.y = posB.y + offNP.y * FXAA_QUALITY_P0;\\n    FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;\\n    FxaaFloat lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN));\\n    FxaaFloat subpixE = subpixC * subpixC;\\n    FxaaFloat lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP));\\n    if(!pairN) lumaNN = lumaSS;\\n    FxaaFloat gradientScaled = gradient * 1.0/4.0;\\n    FxaaFloat lumaMM = lumaM - lumaNN * 0.5;\\n    FxaaFloat subpixF = subpixD * subpixE;\\n    FxaaBool lumaMLTZero = lumaMM < 0.0;\\n    lumaEndN -= lumaNN * 0.5;\\n    lumaEndP -= lumaNN * 0.5;\\n    FxaaBool doneN = abs(lumaEndN) >= gradientScaled;\\n    FxaaBool doneP = abs(lumaEndP) >= gradientScaled;\\n    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P1;\\n    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P1;\\n    FxaaBool doneNP = (!doneN) || (!doneP);\\n    if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P1;\\n    if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P1;\\n    if(doneNP) {\\n        if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n        if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n        doneN = abs(lumaEndN) >= gradientScaled;\\n        doneP = abs(lumaEndP) >= gradientScaled;\\n        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P2;\\n        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P2;\\n        doneNP = (!doneN) || (!doneP);\\n        if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P2;\\n        if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P2;\\n        #if (FXAA_QUALITY_PS > 3)\\n        if(doneNP) {\\n            if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n            if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n            doneN = abs(lumaEndN) >= gradientScaled;\\n            doneP = abs(lumaEndP) >= gradientScaled;\\n            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P3;\\n            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P3;\\n            doneNP = (!doneN) || (!doneP);\\n            if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P3;\\n            if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P3;\\n            #if (FXAA_QUALITY_PS > 4)\\n            if(doneNP) {\\n                if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                doneN = abs(lumaEndN) >= gradientScaled;\\n                doneP = abs(lumaEndP) >= gradientScaled;\\n                if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P4;\\n                if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P4;\\n                doneNP = (!doneN) || (!doneP);\\n                if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P4;\\n                if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P4;\\n                #if (FXAA_QUALITY_PS > 5)\\n                if(doneNP) {\\n                    if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                    if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                    if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                    if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                    doneN = abs(lumaEndN) >= gradientScaled;\\n                    doneP = abs(lumaEndP) >= gradientScaled;\\n                    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P5;\\n                    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P5;\\n                    doneNP = (!doneN) || (!doneP);\\n                    if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P5;\\n                    if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P5;\\n                    #if (FXAA_QUALITY_PS > 6)\\n                    if(doneNP) {\\n                        if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                        if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                        doneN = abs(lumaEndN) >= gradientScaled;\\n                        doneP = abs(lumaEndP) >= gradientScaled;\\n                        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P6;\\n                        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P6;\\n                        doneNP = (!doneN) || (!doneP);\\n                        if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P6;\\n                        if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P6;\\n                        #if (FXAA_QUALITY_PS > 7)\\n                        if(doneNP) {\\n                            if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                            if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                            doneN = abs(lumaEndN) >= gradientScaled;\\n                            doneP = abs(lumaEndP) >= gradientScaled;\\n                            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P7;\\n                            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P7;\\n                            doneNP = (!doneN) || (!doneP);\\n                            if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P7;\\n                            if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P7;\\n    #if (FXAA_QUALITY_PS > 8)\\n    if(doneNP) {\\n        if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n        if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n        doneN = abs(lumaEndN) >= gradientScaled;\\n        doneP = abs(lumaEndP) >= gradientScaled;\\n        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P8;\\n        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P8;\\n        doneNP = (!doneN) || (!doneP);\\n        if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P8;\\n        if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P8;\\n        #if (FXAA_QUALITY_PS > 9)\\n        if(doneNP) {\\n            if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n            if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n            doneN = abs(lumaEndN) >= gradientScaled;\\n            doneP = abs(lumaEndP) >= gradientScaled;\\n            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P9;\\n            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P9;\\n            doneNP = (!doneN) || (!doneP);\\n            if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P9;\\n            if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P9;\\n            #if (FXAA_QUALITY_PS > 10)\\n            if(doneNP) {\\n                if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                doneN = abs(lumaEndN) >= gradientScaled;\\n                doneP = abs(lumaEndP) >= gradientScaled;\\n                if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P10;\\n                if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P10;\\n                doneNP = (!doneN) || (!doneP);\\n                if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P10;\\n                if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P10;\\n                #if (FXAA_QUALITY_PS > 11)\\n                if(doneNP) {\\n                    if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                    if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                    if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                    if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                    doneN = abs(lumaEndN) >= gradientScaled;\\n                    doneP = abs(lumaEndP) >= gradientScaled;\\n                    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P11;\\n                    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P11;\\n                    doneNP = (!doneN) || (!doneP);\\n                    if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P11;\\n                    if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P11;\\n                    #if (FXAA_QUALITY_PS > 12)\\n                    if(doneNP) {\\n                        if(!doneN) lumaEndN = FxaaLuma_(FxaaTexTop(tex, posN.xy));\\n                        if(!doneP) lumaEndP = FxaaLuma_(FxaaTexTop(tex, posP.xy));\\n                        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\\n                        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\\n                        doneN = abs(lumaEndN) >= gradientScaled;\\n                        doneP = abs(lumaEndP) >= gradientScaled;\\n                        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY_P12;\\n                        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY_P12;\\n                        doneNP = (!doneN) || (!doneP);\\n                        if(!doneP) posP.x += offNP.x * FXAA_QUALITY_P12;\\n                        if(!doneP) posP.y += offNP.y * FXAA_QUALITY_P12;\\n                    }\\n                    #endif\\n                }\\n                #endif\\n            }\\n            #endif\\n        }\\n        #endif\\n    }\\n    #endif\\n                        }\\n                        #endif\\n                    }\\n                    #endif\\n                }\\n                #endif\\n            }\\n            #endif\\n        }\\n        #endif\\n    }\\n    FxaaFloat dstN = posM.x - posN.x;\\n    FxaaFloat dstP = posP.x - posM.x;\\n    if(!horzSpan) dstN = posM.y - posN.y;\\n    if(!horzSpan) dstP = posP.y - posM.y;\\n    FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;\\n    FxaaFloat spanLength = (dstP + dstN);\\n    FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;\\n    FxaaFloat spanLengthRcp = 1.0/spanLength;\\n    FxaaBool directionN = dstN < dstP;\\n    FxaaFloat dst = min(dstN, dstP);\\n    FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;\\n    FxaaFloat subpixG = subpixF * subpixF;\\n    FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;\\n    FxaaFloat subpixH = subpixG * fxaaQualitySubpix;\\n    FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;\\n    FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);\\n    if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;\\n    if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;\\n    return FxaaTexTop(tex, posM);\\n}\\n\\nvec4 fxaa_sampleColor(sampler2D texture, vec2 texSize, vec2 texCoord) {\\n    const float fxaa_QualitySubpix = 0.5;\\n    const float fxaa_QualityEdgeThreshold = 0.125;\\n    const float fxaa_QualityEdgeThresholdMin = 0.0833;\\n\\n    return FxaaPixelShader_(\\n        texCoord,\\n        texture,\\n        vec2(1.0) / texSize,\\n        fxaa_QualitySubpix,\\n        fxaa_QualityEdgeThreshold,\\n        fxaa_QualityEdgeThresholdMin\\n    );\\n}\\n\";\nexports.default = {\n    name: \"fxaa\",\n    uniforms: {},\n    fs: fs,\n    passes: [\n        {\n            sampler: true\n        }\n    ]\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"krcqY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar vs = \"attribute float transform_elementID;\\nvec2 transform_getPixelSizeHalf(vec2 size) {\\n  return vec2(1.) / (2. * size);\\n}\\n\\nvec2 transform_getPixelIndices(vec2 texSize, vec2 pixelSizeHalf) {\\n  float yIndex = floor((transform_elementID / texSize[0]) + pixelSizeHalf[1]);\\n  float xIndex = transform_elementID - (yIndex * texSize[0]);\\n  return vec2(xIndex, yIndex);\\n}\\nvec2 transform_getTexCoord(vec2 size) {\\n  vec2 pixelSizeHalf = transform_getPixelSizeHalf(size);\\n  vec2 indices = transform_getPixelIndices(size, pixelSizeHalf);\\n  vec2 coord = indices / size + pixelSizeHalf;\\n  return coord;\\n}\\nvec2 transform_getPos(vec2 size) {\\n  vec2 texCoord = transform_getTexCoord(size);\\n  vec2 pos = (texCoord * (2.0, 2.0)) - (1., 1.);\\n  return pos;\\n}\\nvec4 transform_getInput(sampler2D texSampler, vec2 size) {\\n  vec2 texCoord = transform_getTexCoord(size);\\n  vec4 textureColor = texture2D(texSampler, texCoord);\\n  return textureColor;\\n}\\n\";\nexports.default = {\n    name: \"transform\",\n    vs: vs,\n    fs: null\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iojEv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getBuffersFromGeometry\", ()=>getBuffersFromGeometry);\nparcelHelpers.export(exports, \"inferAttributeAccessor\", ()=>inferAttributeAccessor);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar GLTF_TO_LUMA_ATTRIBUTE_MAP = {\n    POSITION: \"positions\",\n    NORMAL: \"normals\",\n    COLOR_0: \"colors\",\n    TEXCOORD_0: \"texCoords\",\n    TEXCOORD_1: \"texCoords1\",\n    TEXCOORD_2: \"texCoords2\"\n};\nfunction getBuffersFromGeometry(gl, geometry, options) {\n    var buffers = {};\n    var indices = geometry.indices;\n    for(var name in geometry.attributes){\n        var attribute = geometry.attributes[name];\n        var remappedName = mapAttributeName(name, options);\n        if (name === \"indices\") indices = attribute;\n        else if (attribute.constant) buffers[remappedName] = attribute.value;\n        else {\n            var typedArray = attribute.value;\n            var accessor = (0, _objectSpreadDefault.default)({}, attribute);\n            delete accessor.value;\n            buffers[remappedName] = [\n                new (0, _webgl.Buffer)(gl, typedArray),\n                accessor\n            ];\n            inferAttributeAccessor(name, accessor);\n        }\n    }\n    if (indices) {\n        var data = indices.value || indices;\n        (0, _webgl.assert)(data instanceof Uint16Array || data instanceof Uint32Array, 'attribute array for \"indices\" must be of integer type');\n        var _accessor = {\n            size: 1,\n            isIndexed: indices.isIndexed === undefined ? true : indices.isIndexed\n        };\n        buffers.indices = [\n            new (0, _webgl.Buffer)(gl, {\n                data: data,\n                target: 34963\n            }),\n            _accessor\n        ];\n    }\n    return buffers;\n}\nfunction mapAttributeName(name, options) {\n    var _ref = options || {}, _ref$attributeMap = _ref.attributeMap, attributeMap = _ref$attributeMap === void 0 ? GLTF_TO_LUMA_ATTRIBUTE_MAP : _ref$attributeMap;\n    return attributeMap && attributeMap[name] || name;\n}\nfunction inferAttributeAccessor(attributeName, attribute) {\n    var category;\n    switch(attributeName){\n        case \"texCoords\":\n        case \"texCoord1\":\n        case \"texCoord2\":\n        case \"texCoord3\":\n            category = \"uvs\";\n            break;\n        case \"vertices\":\n        case \"positions\":\n        case \"normals\":\n        case \"pickingColors\":\n            category = \"vectors\";\n            break;\n        default:\n    }\n    switch(category){\n        case \"vectors\":\n            attribute.size = attribute.size || 3;\n            break;\n        case \"uvs\":\n            attribute.size = attribute.size || 2;\n            break;\n        default:\n    }\n    (0, _webgl.assert)(Number.isFinite(attribute.size), \"attribute \".concat(attributeName, \" needs size\"));\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"Js3JN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _definePropertyJs = require(\"./defineProperty.js\");\nvar _definePropertyJsDefault = parcelHelpers.interopDefault(_definePropertyJs);\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? Object(arguments[i]) : {};\n        var ownKeys = Object.keys(source);\n        if (typeof Object.getOwnPropertySymbols === \"function\") ownKeys.push.apply(ownKeys, Object.getOwnPropertySymbols(source).filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n        ownKeys.forEach(function(key) {\n            (0, _definePropertyJsDefault.default)(target, key, source[key]);\n        });\n    }\n    return target;\n}\nexports.default = _objectSpread;\n\n},{\"./defineProperty.js\":\"dlHSV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i1pdx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Transform);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _shadertools = require(\"@luma.gl/shadertools\");\nvar _bufferTransform = require(\"./buffer-transform\");\nvar _bufferTransformDefault = parcelHelpers.interopDefault(_bufferTransform);\nvar _textureTransform = require(\"./texture-transform\");\nvar _textureTransformDefault = parcelHelpers.interopDefault(_textureTransform);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _model = require(\"../lib/model\");\nvar _modelDefault = parcelHelpers.interopDefault(_model);\nvar Transform = function() {\n    (0, _createClassDefault.default)(Transform1, null, [\n        {\n            key: \"isSupported\",\n            value: function isSupported(gl) {\n                return (0, _gltools.isWebGL2)(gl);\n            }\n        }\n    ]);\n    function Transform1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Transform1);\n        this.gl = gl;\n        this.model = null;\n        this.elementCount = 0;\n        this.bufferTransform = null;\n        this.textureTransform = null;\n        this.elementIDBuffer = null;\n        this._initialize(props);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(Transform1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                var model = this.model, bufferTransform = this.bufferTransform, textureTransform = this.textureTransform;\n                if (model) model[\"delete\"]();\n                if (bufferTransform) bufferTransform[\"delete\"]();\n                if (textureTransform) textureTransform[\"delete\"]();\n            }\n        },\n        {\n            key: \"run\",\n            value: function run() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _opts$clearRenderTarg = opts.clearRenderTarget, clearRenderTarget = _opts$clearRenderTarg === void 0 ? true : _opts$clearRenderTarg;\n                var updatedOpts = this._updateDrawOptions(opts);\n                if (clearRenderTarget && updatedOpts.framebuffer) updatedOpts.framebuffer.clear({\n                    color: true\n                });\n                this.model.transform(updatedOpts);\n            }\n        },\n        {\n            key: \"swap\",\n            value: function swap() {\n                var swapped = false;\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = resourceTransforms[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var resourceTransform = _step.value;\n                        swapped = swapped || resourceTransform.swap();\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n                (0, _webgl.assert)(swapped, \"Nothing to swap\");\n            }\n        },\n        {\n            key: \"getBuffer\",\n            value: function getBuffer() {\n                var varyingName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                return this.bufferTransform && this.bufferTransform.getBuffer(varyingName);\n            }\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion2 = true;\n                var _didIteratorError2 = false;\n                var _iteratorError2 = undefined;\n                try {\n                    for(var _iterator2 = resourceTransforms[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                        var resourceTransform = _step2.value;\n                        var data = resourceTransform.getData(opts);\n                        if (data) return data;\n                    }\n                } catch (err) {\n                    _didIteratorError2 = true;\n                    _iteratorError2 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n                    } finally{\n                        if (_didIteratorError2) throw _iteratorError2;\n                    }\n                }\n                return null;\n            }\n        },\n        {\n            key: \"getFramebuffer\",\n            value: function getFramebuffer() {\n                return this.textureTransform && this.textureTransform.getFramebuffer();\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                if (\"elementCount\" in opts) this.model.setVertexCount(opts.elementCount);\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion3 = true;\n                var _didIteratorError3 = false;\n                var _iteratorError3 = undefined;\n                try {\n                    for(var _iterator3 = resourceTransforms[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){\n                        var resourceTransform = _step3.value;\n                        resourceTransform.update(opts);\n                    }\n                } catch (err) {\n                    _didIteratorError3 = true;\n                    _iteratorError3 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) _iterator3[\"return\"]();\n                    } finally{\n                        if (_didIteratorError3) throw _iteratorError3;\n                    }\n                }\n            }\n        },\n        {\n            key: \"_initialize\",\n            value: function _initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var gl = this.gl;\n                this._buildResourceTransforms(gl, props);\n                props = this._updateModelProps(props);\n                this.model = new (0, _modelDefault.default)(gl, Object.assign({}, props, {\n                    fs: props.fs || (0, _shadertools.getPassthroughFS)({\n                        version: (0, _webgl.getShaderVersion)(props.vs)\n                    }),\n                    id: props.id || \"transform-model\",\n                    drawMode: props.drawMode || 0,\n                    vertexCount: props.elementCount\n                }));\n                this.bufferTransform && this.bufferTransform.setupResources({\n                    model: this.model\n                });\n            }\n        },\n        {\n            key: \"_updateModelProps\",\n            value: function _updateModelProps(props) {\n                var updatedProps = Object.assign({}, props);\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion4 = true;\n                var _didIteratorError4 = false;\n                var _iteratorError4 = undefined;\n                try {\n                    for(var _iterator4 = resourceTransforms[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true){\n                        var resourceTransform = _step4.value;\n                        updatedProps = resourceTransform.updateModelProps(updatedProps);\n                    }\n                } catch (err) {\n                    _didIteratorError4 = true;\n                    _iteratorError4 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion4 && _iterator4[\"return\"] != null) _iterator4[\"return\"]();\n                    } finally{\n                        if (_didIteratorError4) throw _iteratorError4;\n                    }\n                }\n                return updatedProps;\n            }\n        },\n        {\n            key: \"_buildResourceTransforms\",\n            value: function _buildResourceTransforms(gl, props) {\n                if (canCreateBufferTransform(props)) this.bufferTransform = new (0, _bufferTransformDefault.default)(gl, props);\n                if (canCreateTextureTransform(props)) this.textureTransform = new (0, _textureTransformDefault.default)(gl, props);\n                (0, _webgl.assert)(this.bufferTransform || this.textureTransform, \"must provide source/feedback buffers or source/target textures\");\n            }\n        },\n        {\n            key: \"_updateDrawOptions\",\n            value: function _updateDrawOptions(opts) {\n                var updatedOpts = Object.assign({}, opts);\n                var resourceTransforms = [\n                    this.bufferTransform,\n                    this.textureTransform\n                ].filter(Boolean);\n                var _iteratorNormalCompletion5 = true;\n                var _didIteratorError5 = false;\n                var _iteratorError5 = undefined;\n                try {\n                    for(var _iterator5 = resourceTransforms[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true){\n                        var resourceTransform = _step5.value;\n                        updatedOpts = Object.assign(updatedOpts, resourceTransform.getDrawOptions(updatedOpts));\n                    }\n                } catch (err) {\n                    _didIteratorError5 = true;\n                    _iteratorError5 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion5 && _iterator5[\"return\"] != null) _iterator5[\"return\"]();\n                    } finally{\n                        if (_didIteratorError5) throw _iteratorError5;\n                    }\n                }\n                return updatedOpts;\n            }\n        }\n    ]);\n    return Transform1;\n}();\nfunction canCreateBufferTransform(props) {\n    if (!(0, _webgl.isObjectEmpty)(props.feedbackBuffers) || !(0, _webgl.isObjectEmpty)(props.feedbackMap) || props.varyings && props.varyings.length > 0) return true;\n    return false;\n}\nfunction canCreateTextureTransform(props) {\n    if (!(0, _webgl.isObjectEmpty)(props._sourceTextures) || props._targetTexture || props._targetTextureVarying) return true;\n    return false;\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/shadertools\":\"5aMWt\",\"./buffer-transform\":\"9nRrB\",\"./texture-transform\":\"9jpAe\",\"@luma.gl/gltools\":\"grcb8\",\"@luma.gl/webgl\":\"7gBVn\",\"../lib/model\":\"6H3H1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9nRrB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>BufferTransform);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _gltools = require(\"@luma.gl/gltools\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar BufferTransform = function() {\n    function BufferTransform1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, BufferTransform1);\n        this.gl = gl;\n        this.currentIndex = 0;\n        this.feedbackMap = {};\n        this.varyings = null;\n        this.bindings = [];\n        this.resources = {};\n        this._initialize(props);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(BufferTransform1, [\n        {\n            key: \"setupResources\",\n            value: function setupResources(opts) {\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = this.bindings[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var binding = _step.value;\n                        this._setupTransformFeedback(binding, opts);\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n            }\n        },\n        {\n            key: \"updateModelProps\",\n            value: function updateModelProps() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var varyings = this.varyings;\n                if (varyings.length > 0) props = Object.assign({}, props, {\n                    varyings: varyings\n                });\n                return props;\n            }\n        },\n        {\n            key: \"getDrawOptions\",\n            value: function getDrawOptions() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var binding = this.bindings[this.currentIndex];\n                var sourceBuffers = binding.sourceBuffers, transformFeedback = binding.transformFeedback;\n                var attributes = Object.assign({}, sourceBuffers, opts.attributes);\n                return {\n                    attributes: attributes,\n                    transformFeedback: transformFeedback\n                };\n            }\n        },\n        {\n            key: \"swap\",\n            value: function swap() {\n                if (this.feedbackMap) {\n                    this.currentIndex = this._getNextIndex();\n                    return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this._setupBuffers(opts);\n            }\n        },\n        {\n            key: \"getBuffer\",\n            value: function getBuffer(varyingName) {\n                var feedbackBuffers = this.bindings[this.currentIndex].feedbackBuffers;\n                var bufferOrParams = varyingName ? feedbackBuffers[varyingName] : null;\n                if (!bufferOrParams) return null;\n                return bufferOrParams instanceof (0, _webgl.Buffer) ? bufferOrParams : bufferOrParams.buffer;\n            }\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, varyingName = _ref.varyingName;\n                var buffer = this.getBuffer(varyingName);\n                if (buffer) return buffer.getData();\n                return null;\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                for(var name in this.resources)this.resources[name][\"delete\"]();\n            }\n        },\n        {\n            key: \"_initialize\",\n            value: function _initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this._setupBuffers(props);\n                this.varyings = props.varyings || Object.keys(this.bindings[this.currentIndex].feedbackBuffers);\n                if (this.varyings.length > 0) (0, _webgl.assert)((0, _gltools.isWebGL2)(this.gl));\n            }\n        },\n        {\n            key: \"_getFeedbackBuffers\",\n            value: function _getFeedbackBuffers(props) {\n                var _props$sourceBuffers = props.sourceBuffers, sourceBuffers = _props$sourceBuffers === void 0 ? {} : _props$sourceBuffers;\n                var feedbackBuffers = {};\n                if (this.bindings[this.currentIndex]) Object.assign(feedbackBuffers, this.bindings[this.currentIndex].feedbackBuffers);\n                if (this.feedbackMap) for(var sourceName in this.feedbackMap){\n                    var feedbackName = this.feedbackMap[sourceName];\n                    if (sourceName in sourceBuffers) feedbackBuffers[feedbackName] = sourceName;\n                }\n                Object.assign(feedbackBuffers, props.feedbackBuffers);\n                for(var bufferName in feedbackBuffers){\n                    var bufferOrRef = feedbackBuffers[bufferName];\n                    if (typeof bufferOrRef === \"string\") {\n                        var sourceBuffer = sourceBuffers[bufferOrRef];\n                        var byteLength = sourceBuffer.byteLength, usage = sourceBuffer.usage, accessor = sourceBuffer.accessor;\n                        feedbackBuffers[bufferName] = this._createNewBuffer(bufferName, {\n                            byteLength: byteLength,\n                            usage: usage,\n                            accessor: accessor\n                        });\n                    }\n                }\n                return feedbackBuffers;\n            }\n        },\n        {\n            key: \"_setupBuffers\",\n            value: function _setupBuffers() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _props$sourceBuffers2 = props.sourceBuffers, sourceBuffers = _props$sourceBuffers2 === void 0 ? null : _props$sourceBuffers2;\n                Object.assign(this.feedbackMap, props.feedbackMap);\n                var feedbackBuffers = this._getFeedbackBuffers(props);\n                this._updateBindings({\n                    sourceBuffers: sourceBuffers,\n                    feedbackBuffers: feedbackBuffers\n                });\n            }\n        },\n        {\n            key: \"_setupTransformFeedback\",\n            value: function _setupTransformFeedback(binding, _ref2) {\n                var model = _ref2.model;\n                var program = model.program;\n                binding.transformFeedback = new (0, _webgl.TransformFeedback)(this.gl, {\n                    program: program,\n                    buffers: binding.feedbackBuffers\n                });\n            }\n        },\n        {\n            key: \"_updateBindings\",\n            value: function _updateBindings(opts) {\n                this.bindings[this.currentIndex] = this._updateBinding(this.bindings[this.currentIndex], opts);\n                if (this.feedbackMap) {\n                    var _this$_swapBuffers = this._swapBuffers(this.bindings[this.currentIndex]), sourceBuffers = _this$_swapBuffers.sourceBuffers, feedbackBuffers = _this$_swapBuffers.feedbackBuffers;\n                    var nextIndex = this._getNextIndex();\n                    this.bindings[nextIndex] = this._updateBinding(this.bindings[nextIndex], {\n                        sourceBuffers: sourceBuffers,\n                        feedbackBuffers: feedbackBuffers\n                    });\n                }\n            }\n        },\n        {\n            key: \"_updateBinding\",\n            value: function _updateBinding(binding, opts) {\n                if (!binding) return {\n                    sourceBuffers: Object.assign({}, opts.sourceBuffers),\n                    feedbackBuffers: Object.assign({}, opts.feedbackBuffers)\n                };\n                Object.assign(binding.sourceBuffers, opts.sourceBuffers);\n                Object.assign(binding.feedbackBuffers, opts.feedbackBuffers);\n                if (binding.transformFeedback) binding.transformFeedback.setBuffers(binding.feedbackBuffers);\n                return binding;\n            }\n        },\n        {\n            key: \"_swapBuffers\",\n            value: function _swapBuffers(opts) {\n                if (!this.feedbackMap) return null;\n                var sourceBuffers = Object.assign({}, opts.sourceBuffers);\n                var feedbackBuffers = Object.assign({}, opts.feedbackBuffers);\n                for(var srcName in this.feedbackMap){\n                    var dstName = this.feedbackMap[srcName];\n                    sourceBuffers[srcName] = opts.feedbackBuffers[dstName];\n                    feedbackBuffers[dstName] = opts.sourceBuffers[srcName];\n                    (0, _webgl.assert)(feedbackBuffers[dstName] instanceof (0, _webgl.Buffer));\n                }\n                return {\n                    sourceBuffers: sourceBuffers,\n                    feedbackBuffers: feedbackBuffers\n                };\n            }\n        },\n        {\n            key: \"_createNewBuffer\",\n            value: function _createNewBuffer(name, opts) {\n                var buffer = new (0, _webgl.Buffer)(this.gl, opts);\n                if (this.resources[name]) this.resources[name][\"delete\"]();\n                this.resources[name] = buffer;\n                return buffer;\n            }\n        },\n        {\n            key: \"_getNextIndex\",\n            value: function _getNextIndex() {\n                return (this.currentIndex + 1) % 2;\n            }\n        }\n    ]);\n    return BufferTransform1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/gltools\":\"grcb8\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9jpAe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TextureTransform);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _shadertools = require(\"@luma.gl/shadertools\");\nvar _transformShaderUtils = require(\"./transform-shader-utils\");\nvar _SRC_TEX_PARAMETER_OV;\nvar SRC_TEX_PARAMETER_OVERRIDES = (_SRC_TEX_PARAMETER_OV = {}, (0, _definePropertyDefault.default)(_SRC_TEX_PARAMETER_OV, 10241, 9728), (0, _definePropertyDefault.default)(_SRC_TEX_PARAMETER_OV, 10240, 9728), (0, _definePropertyDefault.default)(_SRC_TEX_PARAMETER_OV, 10242, 33071), (0, _definePropertyDefault.default)(_SRC_TEX_PARAMETER_OV, 10243, 33071), _SRC_TEX_PARAMETER_OV);\nvar FS_OUTPUT_VARIABLE = \"transform_output\";\nvar TextureTransform = function() {\n    function TextureTransform1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, TextureTransform1);\n        this.gl = gl;\n        this.currentIndex = 0;\n        this._swapTexture = null;\n        this.targetTextureVarying = null;\n        this.targetTextureType = null;\n        this.samplerTextureMap = null;\n        this.bindings = [];\n        this.resources = {};\n        this._initialize(props);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(TextureTransform1, [\n        {\n            key: \"updateModelProps\",\n            value: function updateModelProps() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var updatedModelProps = this._processVertexShader(props);\n                return Object.assign({}, props, updatedModelProps);\n            }\n        },\n        {\n            key: \"getDrawOptions\",\n            value: function getDrawOptions() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _this$bindings$this$c = this.bindings[this.currentIndex], sourceBuffers = _this$bindings$this$c.sourceBuffers, sourceTextures = _this$bindings$this$c.sourceTextures, framebuffer = _this$bindings$this$c.framebuffer, targetTexture = _this$bindings$this$c.targetTexture;\n                var attributes = Object.assign({}, sourceBuffers, opts.attributes);\n                var uniforms = Object.assign({}, opts.uniforms);\n                var parameters = Object.assign({}, opts.parameters);\n                var discard = opts.discard;\n                if (this.hasSourceTextures || this.hasTargetTexture) {\n                    attributes.transform_elementID = this.elementIDBuffer;\n                    for(var sampler in this.samplerTextureMap){\n                        var textureName = this.samplerTextureMap[sampler];\n                        uniforms[sampler] = sourceTextures[textureName];\n                    }\n                    this._setSourceTextureParameters();\n                    var sizeUniforms = (0, _transformShaderUtils.getSizeUniforms)({\n                        sourceTextureMap: sourceTextures,\n                        targetTextureVarying: this.targetTextureVarying,\n                        targetTexture: targetTexture\n                    });\n                    Object.assign(uniforms, sizeUniforms);\n                }\n                if (this.hasTargetTexture) {\n                    discard = false;\n                    parameters.viewport = [\n                        0,\n                        0,\n                        framebuffer.width,\n                        framebuffer.height\n                    ];\n                }\n                return {\n                    attributes: attributes,\n                    framebuffer: framebuffer,\n                    uniforms: uniforms,\n                    discard: discard,\n                    parameters: parameters\n                };\n            }\n        },\n        {\n            key: \"swap\",\n            value: function swap() {\n                if (this._swapTexture) {\n                    this.currentIndex = this._getNextIndex();\n                    return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                this._setupTextures(opts);\n            }\n        },\n        {\n            key: \"getTargetTexture\",\n            value: function getTargetTexture() {\n                var targetTexture = this.bindings[this.currentIndex].targetTexture;\n                return targetTexture;\n            }\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$packed = _ref.packed, packed = _ref$packed === void 0 ? false : _ref$packed;\n                var framebuffer = this.bindings[this.currentIndex].framebuffer;\n                var pixels = (0, _webgl.readPixelsToArray)(framebuffer);\n                if (!packed) return pixels;\n                var ArrayType = pixels.constructor;\n                var channelCount = (0, _shadertools.typeToChannelCount)(this.targetTextureType);\n                var packedPixels = new ArrayType(pixels.length * channelCount / 4);\n                var packCount = 0;\n                for(var i = 0; i < pixels.length; i += 4)for(var j = 0; j < channelCount; j++)packedPixels[packCount++] = pixels[i + j];\n                return packedPixels;\n            }\n        },\n        {\n            key: \"getFramebuffer\",\n            value: function getFramebuffer() {\n                var currentResources = this.bindings[this.currentIndex];\n                return currentResources.framebuffer;\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                if (this.ownTexture) this.ownTexture[\"delete\"]();\n                if (this.elementIDBuffer) this.elementIDBuffer[\"delete\"]();\n            }\n        },\n        {\n            key: \"_initialize\",\n            value: function _initialize() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _targetTextureVarying = props._targetTextureVarying, _swapTexture = props._swapTexture;\n                this._swapTexture = _swapTexture;\n                this.targetTextureVarying = _targetTextureVarying;\n                this.hasTargetTexture = _targetTextureVarying;\n                this._setupTextures(props);\n            }\n        },\n        {\n            key: \"_createTargetTexture\",\n            value: function _createTargetTexture(props) {\n                var sourceTextures = props.sourceTextures, textureOrReference = props.textureOrReference;\n                if (textureOrReference instanceof (0, _webgl.Texture2D)) return textureOrReference;\n                var refTexture = sourceTextures[textureOrReference];\n                if (!refTexture) return null;\n                this._targetRefTexName = textureOrReference;\n                return this._createNewTexture(refTexture);\n            }\n        },\n        {\n            key: \"_setupTextures\",\n            value: function _setupTextures() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var sourceBuffers = props.sourceBuffers, _props$_sourceTexture = props._sourceTextures, _sourceTextures = _props$_sourceTexture === void 0 ? {} : _props$_sourceTexture, _targetTexture = props._targetTexture;\n                var targetTexture = this._createTargetTexture({\n                    sourceTextures: _sourceTextures,\n                    textureOrReference: _targetTexture\n                });\n                this.hasSourceTextures = this.hasSourceTextures || _sourceTextures && Object.keys(_sourceTextures).length > 0;\n                this._updateBindings({\n                    sourceBuffers: sourceBuffers,\n                    sourceTextures: _sourceTextures,\n                    targetTexture: targetTexture\n                });\n                if (\"elementCount\" in props) this._updateElementIDBuffer(props.elementCount);\n            }\n        },\n        {\n            key: \"_updateElementIDBuffer\",\n            value: function _updateElementIDBuffer(elementCount) {\n                if (typeof elementCount !== \"number\" || this.elementCount >= elementCount) return;\n                var elementIds = new Float32Array(elementCount);\n                elementIds.forEach(function(_, index, array) {\n                    array[index] = index;\n                });\n                if (!this.elementIDBuffer) this.elementIDBuffer = new (0, _webgl.Buffer)(this.gl, {\n                    data: elementIds,\n                    accessor: {\n                        size: 1\n                    }\n                });\n                else this.elementIDBuffer.setData({\n                    data: elementIds\n                });\n                this.elementCount = elementCount;\n            }\n        },\n        {\n            key: \"_updateBindings\",\n            value: function _updateBindings(opts) {\n                this.bindings[this.currentIndex] = this._updateBinding(this.bindings[this.currentIndex], opts);\n                if (this._swapTexture) {\n                    var _this$_swapTextures = this._swapTextures(this.bindings[this.currentIndex]), sourceTextures = _this$_swapTextures.sourceTextures, targetTexture = _this$_swapTextures.targetTexture;\n                    var nextIndex = this._getNextIndex();\n                    this.bindings[nextIndex] = this._updateBinding(this.bindings[nextIndex], {\n                        sourceTextures: sourceTextures,\n                        targetTexture: targetTexture\n                    });\n                }\n            }\n        },\n        {\n            key: \"_updateBinding\",\n            value: function _updateBinding(binding, opts) {\n                var sourceBuffers = opts.sourceBuffers, sourceTextures = opts.sourceTextures, targetTexture = opts.targetTexture;\n                if (!binding) binding = {\n                    sourceBuffers: {},\n                    sourceTextures: {},\n                    targetTexture: null\n                };\n                Object.assign(binding.sourceTextures, sourceTextures);\n                Object.assign(binding.sourceBuffers, sourceBuffers);\n                if (targetTexture) {\n                    binding.targetTexture = targetTexture;\n                    var width = targetTexture.width, height = targetTexture.height;\n                    var _binding = binding, framebuffer = _binding.framebuffer;\n                    if (framebuffer) {\n                        framebuffer.update({\n                            attachments: (0, _definePropertyDefault.default)({}, 36064, targetTexture),\n                            resizeAttachments: false\n                        });\n                        framebuffer.resize({\n                            width: width,\n                            height: height\n                        });\n                    } else binding.framebuffer = new (0, _webgl.Framebuffer)(this.gl, {\n                        id: \"\".concat(this.id || \"transform\", \"-framebuffer\"),\n                        width: width,\n                        height: height,\n                        attachments: (0, _definePropertyDefault.default)({}, 36064, targetTexture)\n                    });\n                }\n                return binding;\n            }\n        },\n        {\n            key: \"_setSourceTextureParameters\",\n            value: function _setSourceTextureParameters() {\n                var index = this.currentIndex;\n                var sourceTextures = this.bindings[index].sourceTextures;\n                for(var name in sourceTextures)sourceTextures[name].setParameters(SRC_TEX_PARAMETER_OVERRIDES);\n            }\n        },\n        {\n            key: \"_swapTextures\",\n            value: function _swapTextures(opts) {\n                if (!this._swapTexture) return null;\n                var sourceTextures = Object.assign({}, opts.sourceTextures);\n                sourceTextures[this._swapTexture] = opts.targetTexture;\n                var targetTexture = opts.sourceTextures[this._swapTexture];\n                return {\n                    sourceTextures: sourceTextures,\n                    targetTexture: targetTexture\n                };\n            }\n        },\n        {\n            key: \"_createNewTexture\",\n            value: function _createNewTexture(refTexture) {\n                var _parameters;\n                var texture = (0, _webgl.cloneTextureFrom)(refTexture, {\n                    parameters: (_parameters = {}, (0, _definePropertyDefault.default)(_parameters, 10241, 9728), (0, _definePropertyDefault.default)(_parameters, 10240, 9728), (0, _definePropertyDefault.default)(_parameters, 10242, 33071), (0, _definePropertyDefault.default)(_parameters, 10243, 33071), _parameters),\n                    pixelStore: (0, _definePropertyDefault.default)({}, 37440, false)\n                });\n                if (this.ownTexture) this.ownTexture[\"delete\"]();\n                this.ownTexture = texture;\n                return texture;\n            }\n        },\n        {\n            key: \"_getNextIndex\",\n            value: function _getNextIndex() {\n                return (this.currentIndex + 1) % 2;\n            }\n        },\n        {\n            key: \"_processVertexShader\",\n            value: function _processVertexShader() {\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _this$bindings$this$c2 = this.bindings[this.currentIndex], sourceTextures = _this$bindings$this$c2.sourceTextures, targetTexture = _this$bindings$this$c2.targetTexture;\n                var _updateForTextures = (0, _transformShaderUtils.updateForTextures)({\n                    vs: props.vs,\n                    sourceTextureMap: sourceTextures,\n                    targetTextureVarying: this.targetTextureVarying,\n                    targetTexture: targetTexture\n                }), vs = _updateForTextures.vs, uniforms = _updateForTextures.uniforms, targetTextureType = _updateForTextures.targetTextureType, inject = _updateForTextures.inject, samplerTextureMap = _updateForTextures.samplerTextureMap;\n                var combinedInject = (0, _shadertools.combineInjects)([\n                    props.inject || {},\n                    inject\n                ]);\n                this.targetTextureType = targetTextureType;\n                this.samplerTextureMap = samplerTextureMap;\n                var fs = props._fs || (0, _shadertools.getPassthroughFS)({\n                    version: (0, _webgl.getShaderVersion)(vs),\n                    input: this.targetTextureVarying,\n                    inputType: targetTextureType,\n                    output: FS_OUTPUT_VARIABLE\n                });\n                var modules = this.hasSourceTextures || this.targetTextureVarying ? [\n                    (0, _shadertools._transform)\n                ].concat(props.modules || []) : props.modules;\n                return {\n                    vs: vs,\n                    fs: fs,\n                    modules: modules,\n                    uniforms: uniforms,\n                    inject: combinedInject\n                };\n            }\n        }\n    ]);\n    return TextureTransform1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@luma.gl/webgl\":\"7gBVn\",\"@luma.gl/shadertools\":\"5aMWt\",\"./transform-shader-utils\":\"eMNWO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eMNWO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"updateForTextures\", ()=>updateForTextures);\nparcelHelpers.export(exports, \"getSizeUniforms\", ()=>getSizeUniforms);\nparcelHelpers.export(exports, \"getVaryingType\", ()=>getVaryingType);\nparcelHelpers.export(exports, \"processAttributeDefinition\", ()=>processAttributeDefinition);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar _shadertools = require(\"@luma.gl/shadertools\");\nvar SAMPLER_UNIFORM_PREFIX = \"transform_uSampler_\";\nvar SIZE_UNIFORM_PREFIX = \"transform_uSize_\";\nvar VS_POS_VARIABLE = \"transform_position\";\nfunction updateForTextures(_ref) {\n    var vs = _ref.vs, sourceTextureMap = _ref.sourceTextureMap, targetTextureVarying = _ref.targetTextureVarying, targetTexture = _ref.targetTexture;\n    var texAttributeNames = Object.keys(sourceTextureMap);\n    var sourceCount = texAttributeNames.length;\n    var targetTextureType = null;\n    var samplerTextureMap = {};\n    var updatedVs = vs;\n    var finalInject = {};\n    if (sourceCount > 0 || targetTextureVarying) {\n        var vsLines = updatedVs.split(\"\\n\");\n        var updateVsLines = vsLines.slice();\n        vsLines.forEach(function(line, index, lines) {\n            if (sourceCount > 0) {\n                var updated = processAttributeDefinition(line, sourceTextureMap);\n                if (updated) {\n                    var updatedLine = updated.updatedLine, inject = updated.inject;\n                    updateVsLines[index] = updatedLine;\n                    finalInject = (0, _shadertools.combineInjects)([\n                        finalInject,\n                        inject\n                    ]);\n                    Object.assign(samplerTextureMap, updated.samplerTextureMap);\n                    sourceCount--;\n                }\n            }\n            if (targetTextureVarying && !targetTextureType) targetTextureType = getVaryingType(line, targetTextureVarying);\n        });\n        if (targetTextureVarying) {\n            (0, _webgl.assert)(targetTexture);\n            var sizeName = \"\".concat(SIZE_UNIFORM_PREFIX).concat(targetTextureVarying);\n            var uniformDeclaration = \"uniform vec2 \".concat(sizeName, \";\\n\");\n            var posInstructions = \"     vec2 \".concat(VS_POS_VARIABLE, \" = transform_getPos(\").concat(sizeName, \");\\n     gl_Position = vec4(\").concat(VS_POS_VARIABLE, \", 0, 1.);\\n\");\n            var inject1 = {\n                \"vs:#decl\": uniformDeclaration,\n                \"vs:#main-start\": posInstructions\n            };\n            finalInject = (0, _shadertools.combineInjects)([\n                finalInject,\n                inject1\n            ]);\n        }\n        updatedVs = updateVsLines.join(\"\\n\");\n    }\n    return {\n        vs: updatedVs,\n        targetTextureType: targetTextureType,\n        inject: finalInject,\n        samplerTextureMap: samplerTextureMap\n    };\n}\nfunction getSizeUniforms(_ref2) {\n    var sourceTextureMap = _ref2.sourceTextureMap, targetTextureVarying = _ref2.targetTextureVarying, targetTexture = _ref2.targetTexture;\n    var uniforms = {};\n    var width;\n    var height;\n    if (targetTextureVarying) {\n        width = targetTexture.width;\n        height = targetTexture.height;\n        uniforms[\"\".concat(SIZE_UNIFORM_PREFIX).concat(targetTextureVarying)] = [\n            width,\n            height\n        ];\n    }\n    for(var textureName in sourceTextureMap){\n        var _sourceTextureMap$tex = sourceTextureMap[textureName];\n        width = _sourceTextureMap$tex.width;\n        height = _sourceTextureMap$tex.height;\n        uniforms[\"\".concat(SIZE_UNIFORM_PREFIX).concat(textureName)] = [\n            width,\n            height\n        ];\n    }\n    return uniforms;\n}\nfunction getAttributeDefinition(line) {\n    return (0, _shadertools.getQualifierDetails)(line, [\n        \"attribute\",\n        \"in\"\n    ]);\n}\nfunction getSamplerDeclerations(textureName) {\n    var samplerName = \"\".concat(SAMPLER_UNIFORM_PREFIX).concat(textureName);\n    var sizeName = \"\".concat(SIZE_UNIFORM_PREFIX).concat(textureName);\n    var uniformDeclerations = \"  uniform sampler2D \".concat(samplerName, \";\\n  uniform vec2 \").concat(sizeName, \";\");\n    return {\n        samplerName: samplerName,\n        sizeName: sizeName,\n        uniformDeclerations: uniformDeclerations\n    };\n}\nfunction getVaryingType(line, varying) {\n    var qualaiferDetails = (0, _shadertools.getQualifierDetails)(line, [\n        \"varying\",\n        \"out\"\n    ]);\n    if (!qualaiferDetails) return null;\n    return qualaiferDetails.name === varying ? qualaiferDetails.type : null;\n}\nfunction processAttributeDefinition(line, textureMap) {\n    var samplerTextureMap = {};\n    var attributeData = getAttributeDefinition(line);\n    if (!attributeData) return null;\n    var type = attributeData.type, name = attributeData.name;\n    if (name && textureMap[name]) {\n        var updatedLine = \"// \".concat(line, \" => Replaced by Transform with a sampler\");\n        var _getSamplerDecleratio = getSamplerDeclerations(name), samplerName = _getSamplerDecleratio.samplerName, sizeName = _getSamplerDecleratio.sizeName, uniformDeclerations = _getSamplerDecleratio.uniformDeclerations;\n        var channels = (0, _shadertools.typeToChannelSuffix)(type);\n        var sampleInstruction = \"  \".concat(type, \" \").concat(name, \" = transform_getInput(\").concat(samplerName, \", \").concat(sizeName, \").\").concat(channels, \";\\n\");\n        samplerTextureMap[samplerName] = name;\n        var inject = {\n            \"vs:#decl\": uniformDeclerations,\n            \"vs:#main-start\": sampleInstruction\n        };\n        return {\n            updatedLine: updatedLine,\n            inject: inject,\n            samplerTextureMap: samplerTextureMap\n        };\n    }\n    return null;\n}\n\n},{\"@luma.gl/webgl\":\"7gBVn\",\"@luma.gl/shadertools\":\"5aMWt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3diJw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DRAW_MODE\", ()=>DRAW_MODE);\nparcelHelpers.export(exports, \"default\", ()=>Geometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar DRAW_MODE = {\n    POINTS: 0x0000,\n    LINES: 0x0001,\n    LINE_LOOP: 0x0002,\n    LINE_STRIP: 0x0003,\n    TRIANGLES: 0x0004,\n    TRIANGLE_STRIP: 0x0005,\n    TRIANGLE_FAN: 0x0006\n};\nvar Geometry = function() {\n    (0, _createClassDefault.default)(Geometry1, null, [\n        {\n            key: \"DRAW_MODE\",\n            get: function get() {\n                return DRAW_MODE;\n            }\n        }\n    ]);\n    function Geometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, Geometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"geometry\") : _props$id, _props$drawMode = props.drawMode, drawMode = _props$drawMode === void 0 ? DRAW_MODE.TRIANGLES : _props$drawMode, _props$attributes = props.attributes, attributes = _props$attributes === void 0 ? {} : _props$attributes, _props$indices = props.indices, indices = _props$indices === void 0 ? null : _props$indices, _props$vertexCount = props.vertexCount, vertexCount = _props$vertexCount === void 0 ? null : _props$vertexCount;\n        this.id = id;\n        this.drawMode = drawMode | 0;\n        this.attributes = {};\n        this.userData = {};\n        this._setAttributes(attributes, indices);\n        this.vertexCount = vertexCount || this._calculateVertexCount(this.attributes, this.indices);\n    }\n    (0, _createClassDefault.default)(Geometry1, [\n        {\n            key: \"getVertexCount\",\n            value: function getVertexCount() {\n                return this.vertexCount;\n            }\n        },\n        {\n            key: \"getAttributes\",\n            value: function getAttributes() {\n                return this.indices ? (0, _objectSpreadDefault.default)({\n                    indices: this.indices\n                }, this.attributes) : this.attributes;\n            }\n        },\n        {\n            key: \"_print\",\n            value: function _print(attributeName) {\n                return \"Geometry \".concat(this.id, \" attribute \").concat(attributeName);\n            }\n        },\n        {\n            key: \"_setAttributes\",\n            value: function _setAttributes(attributes, indices) {\n                if (indices) this.indices = ArrayBuffer.isView(indices) ? {\n                    value: indices,\n                    size: 1\n                } : indices;\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    attribute = ArrayBuffer.isView(attribute) ? {\n                        value: attribute\n                    } : attribute;\n                    (0, _webgl.assert)(ArrayBuffer.isView(attribute.value), \"\".concat(this._print(attributeName), \": must be typed array or object with value as typed array\"));\n                    if ((attributeName === \"POSITION\" || attributeName === \"positions\") && !attribute.size) attribute.size = 3;\n                    if (attributeName === \"indices\") {\n                        (0, _webgl.assert)(!this.indices);\n                        this.indices = attribute;\n                    } else this.attributes[attributeName] = attribute;\n                }\n                if (this.indices && this.indices.isIndexed !== undefined) {\n                    this.indices = Object.assign({}, this.indices);\n                    delete this.indices.isIndexed;\n                }\n                return this;\n            }\n        },\n        {\n            key: \"_calculateVertexCount\",\n            value: function _calculateVertexCount(attributes, indices) {\n                if (indices) return indices.value.length;\n                var vertexCount = Infinity;\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    var value = attribute.value, size = attribute.size, constant = attribute.constant;\n                    if (!constant && value && size >= 1) vertexCount = Math.min(vertexCount, value.length / size);\n                }\n                (0, _webgl.assert)(Number.isFinite(vertexCount));\n                return vertexCount;\n            }\n        },\n        {\n            key: \"mode\",\n            get: function get() {\n                return this.drawMode;\n            }\n        }\n    ]);\n    return Geometry1;\n}();\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7nCdk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ConeGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _truncatedConeGeometry = require(\"./truncated-cone-geometry\");\nvar _truncatedConeGeometryDefault = parcelHelpers.interopDefault(_truncatedConeGeometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar ConeGeometry = function(_TruncatedConeGeometr) {\n    (0, _inheritsDefault.default)(ConeGeometry1, _TruncatedConeGeometr);\n    function ConeGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, ConeGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"cone-geometry\") : _props$id, _props$radius = props.radius, radius = _props$radius === void 0 ? 1 : _props$radius, _props$cap = props.cap, cap = _props$cap === void 0 ? true : _props$cap;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(ConeGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            topRadius: 0,\n            topCap: Boolean(cap),\n            bottomCap: Boolean(cap),\n            bottomRadius: radius\n        })));\n    }\n    return ConeGeometry1;\n}((0, _truncatedConeGeometryDefault.default));\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./truncated-cone-geometry\":\"bJXwV\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bJXwV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TruncatedConeGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar INDEX_OFFSETS = {\n    x: [\n        2,\n        0,\n        1\n    ],\n    y: [\n        0,\n        1,\n        2\n    ],\n    z: [\n        1,\n        2,\n        0\n    ]\n};\nvar TruncatedConeGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(TruncatedConeGeometry1, _Geometry);\n    function TruncatedConeGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, TruncatedConeGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"truncated-code-geometry\") : _props$id;\n        var _tesselateTruncatedCo = tesselateTruncatedCone(props), indices = _tesselateTruncatedCo.indices, attributes = _tesselateTruncatedCo.attributes;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(TruncatedConeGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: indices,\n            attributes: (0, _objectSpreadDefault.default)({}, attributes, props.attributes)\n        })));\n    }\n    return TruncatedConeGeometry1;\n}((0, _geometryDefault.default));\nfunction tesselateTruncatedCone(props) {\n    var _props$bottomRadius = props.bottomRadius, bottomRadius = _props$bottomRadius === void 0 ? 0 : _props$bottomRadius, _props$topRadius = props.topRadius, topRadius = _props$topRadius === void 0 ? 0 : _props$topRadius, _props$height = props.height, height = _props$height === void 0 ? 1 : _props$height, _props$nradial = props.nradial, nradial = _props$nradial === void 0 ? 10 : _props$nradial, _props$nvertical = props.nvertical, nvertical = _props$nvertical === void 0 ? 10 : _props$nvertical, _props$verticalAxis = props.verticalAxis, verticalAxis = _props$verticalAxis === void 0 ? \"y\" : _props$verticalAxis, _props$topCap = props.topCap, topCap = _props$topCap === void 0 ? false : _props$topCap, _props$bottomCap = props.bottomCap, bottomCap = _props$bottomCap === void 0 ? false : _props$bottomCap;\n    var extra = (topCap ? 2 : 0) + (bottomCap ? 2 : 0);\n    var numVertices = (nradial + 1) * (nvertical + 1 + extra);\n    var slant = Math.atan2(bottomRadius - topRadius, height);\n    var msin = Math.sin;\n    var mcos = Math.cos;\n    var mpi = Math.PI;\n    var cosSlant = mcos(slant);\n    var sinSlant = msin(slant);\n    var start = topCap ? -2 : 0;\n    var end = nvertical + (bottomCap ? 2 : 0);\n    var vertsAroundEdge = nradial + 1;\n    var indices = new Uint16Array(nradial * (nvertical + extra) * 6);\n    var indexOffset = INDEX_OFFSETS[verticalAxis];\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var texCoords = new Float32Array(numVertices * 2);\n    var i3 = 0;\n    var i2 = 0;\n    for(var i = start; i <= end; i++){\n        var v = i / nvertical;\n        var y = height * v;\n        var ringRadius = void 0;\n        if (i < 0) {\n            y = 0;\n            v = 1;\n            ringRadius = bottomRadius;\n        } else if (i > nvertical) {\n            y = height;\n            v = 1;\n            ringRadius = topRadius;\n        } else ringRadius = bottomRadius + (topRadius - bottomRadius) * (i / nvertical);\n        if (i === -2 || i === nvertical + 2) {\n            ringRadius = 0;\n            v = 0;\n        }\n        y -= height / 2;\n        for(var j = 0; j < vertsAroundEdge; j++){\n            var sin = msin(j * mpi * 2 / nradial);\n            var cos = mcos(j * mpi * 2 / nradial);\n            positions[i3 + indexOffset[0]] = sin * ringRadius;\n            positions[i3 + indexOffset[1]] = y;\n            positions[i3 + indexOffset[2]] = cos * ringRadius;\n            normals[i3 + indexOffset[0]] = i < 0 || i > nvertical ? 0 : sin * cosSlant;\n            normals[i3 + indexOffset[1]] = i < 0 ? -1 : i > nvertical ? 1 : sinSlant;\n            normals[i3 + indexOffset[2]] = i < 0 || i > nvertical ? 0 : cos * cosSlant;\n            texCoords[i2 + 0] = j / nradial;\n            texCoords[i2 + 1] = v;\n            i2 += 2;\n            i3 += 3;\n        }\n    }\n    for(var _i = 0; _i < nvertical + extra; _i++)for(var _j = 0; _j < nradial; _j++){\n        var index = (_i * nradial + _j) * 6;\n        indices[index + 0] = vertsAroundEdge * (_i + 0) + 0 + _j;\n        indices[index + 1] = vertsAroundEdge * (_i + 0) + 1 + _j;\n        indices[index + 2] = vertsAroundEdge * (_i + 1) + 1 + _j;\n        indices[index + 3] = vertsAroundEdge * (_i + 0) + 0 + _j;\n        indices[index + 4] = vertsAroundEdge * (_i + 1) + 1 + _j;\n        indices[index + 5] = vertsAroundEdge * (_i + 1) + 0 + _j;\n    }\n    return {\n        indices: indices,\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: positions\n            },\n            NORMAL: {\n                size: 3,\n                value: normals\n            },\n            TEXCOORD_0: {\n                size: 2,\n                value: texCoords\n            }\n        }\n    };\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"../geometry/geometry\":\"3diJw\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"flTH5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CubeGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar CUBE_INDICES = new Uint16Array([\n    0,\n    1,\n    2,\n    0,\n    2,\n    3,\n    4,\n    5,\n    6,\n    4,\n    6,\n    7,\n    8,\n    9,\n    10,\n    8,\n    10,\n    11,\n    12,\n    13,\n    14,\n    12,\n    14,\n    15,\n    16,\n    17,\n    18,\n    16,\n    18,\n    19,\n    20,\n    21,\n    22,\n    20,\n    22,\n    23\n]);\nvar CUBE_POSITIONS = new Float32Array([\n    -1,\n    -1,\n    1,\n    1,\n    -1,\n    1,\n    1,\n    1,\n    1,\n    -1,\n    1,\n    1,\n    -1,\n    -1,\n    -1,\n    -1,\n    1,\n    -1,\n    1,\n    1,\n    -1,\n    1,\n    -1,\n    -1,\n    -1,\n    1,\n    -1,\n    -1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    1,\n    -1,\n    -1,\n    -1,\n    -1,\n    1,\n    -1,\n    -1,\n    1,\n    -1,\n    1,\n    -1,\n    -1,\n    1,\n    1,\n    -1,\n    -1,\n    1,\n    1,\n    -1,\n    1,\n    1,\n    1,\n    1,\n    -1,\n    1,\n    -1,\n    -1,\n    -1,\n    -1,\n    -1,\n    1,\n    -1,\n    1,\n    1,\n    -1,\n    1,\n    -1\n]);\nvar CUBE_NORMALS = new Float32Array([\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    -1,\n    0,\n    0\n]);\nvar CUBE_TEX_COORDS = new Float32Array([\n    0,\n    0,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    1,\n    1,\n    1,\n    1,\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    1,\n    1,\n    0,\n    1\n]);\nvar ATTRIBUTES = {\n    POSITION: {\n        size: 3,\n        value: new Float32Array(CUBE_POSITIONS)\n    },\n    NORMAL: {\n        size: 3,\n        value: new Float32Array(CUBE_NORMALS)\n    },\n    TEXCOORD_0: {\n        size: 2,\n        value: new Float32Array(CUBE_TEX_COORDS)\n    }\n};\nvar CubeGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(CubeGeometry1, _Geometry);\n    function CubeGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, CubeGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"cube-geometry\") : _props$id;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(CubeGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: {\n                size: 1,\n                value: new Uint16Array(CUBE_INDICES)\n            },\n            attributes: (0, _objectSpreadDefault.default)({}, ATTRIBUTES, props.attributes)\n        })));\n    }\n    return CubeGeometry1;\n}((0, _geometryDefault.default));\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"../geometry/geometry\":\"3diJw\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k0ODM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CylinderGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _truncatedConeGeometry = require(\"./truncated-cone-geometry\");\nvar _truncatedConeGeometryDefault = parcelHelpers.interopDefault(_truncatedConeGeometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar CylinderGeometry = function(_TruncatedConeGeometr) {\n    (0, _inheritsDefault.default)(CylinderGeometry1, _TruncatedConeGeometr);\n    function CylinderGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, CylinderGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"cylinder-geometry\") : _props$id, _props$radius = props.radius, radius = _props$radius === void 0 ? 1 : _props$radius;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(CylinderGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            bottomRadius: radius,\n            topRadius: radius\n        })));\n    }\n    return CylinderGeometry1;\n}((0, _truncatedConeGeometryDefault.default));\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"./truncated-cone-geometry\":\"bJXwV\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Nbgi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>IcoSphereGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _mathGl = require(\"math.gl\");\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar ICO_POSITIONS = [\n    -1,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    -1,\n    0,\n    0,\n    1,\n    0,\n    -1,\n    0,\n    1,\n    0,\n    0\n];\nvar ICO_INDICES = [\n    3,\n    4,\n    5,\n    3,\n    5,\n    1,\n    3,\n    1,\n    0,\n    3,\n    0,\n    4,\n    4,\n    0,\n    2,\n    4,\n    2,\n    5,\n    2,\n    0,\n    1,\n    5,\n    2,\n    1\n];\nvar IcoSphereGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(IcoSphereGeometry1, _Geometry);\n    function IcoSphereGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, IcoSphereGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"ico-sphere-geometry\") : _props$id;\n        var _tesselateIcosaHedron = tesselateIcosaHedron(props), indices = _tesselateIcosaHedron.indices, attributes = _tesselateIcosaHedron.attributes;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(IcoSphereGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: indices,\n            attributes: (0, _objectSpreadDefault.default)({}, attributes, props.attributes)\n        })));\n    }\n    return IcoSphereGeometry1;\n}((0, _geometryDefault.default));\nfunction tesselateIcosaHedron(props) {\n    var _props$iterations = props.iterations, iterations = _props$iterations === void 0 ? 0 : _props$iterations;\n    var PI = Math.PI;\n    var PI2 = PI * 2;\n    var positions = [].concat(ICO_POSITIONS);\n    var indices = [].concat(ICO_INDICES);\n    positions.push();\n    indices.push();\n    var getMiddlePoint = function() {\n        var pointMemo = {};\n        return function(i1, i2) {\n            i1 *= 3;\n            i2 *= 3;\n            var mini = i1 < i2 ? i1 : i2;\n            var maxi = i1 > i2 ? i1 : i2;\n            var key = \"\".concat(mini, \"|\").concat(maxi);\n            if (key in pointMemo) return pointMemo[key];\n            var x1 = positions[i1];\n            var y1 = positions[i1 + 1];\n            var z1 = positions[i1 + 2];\n            var x2 = positions[i2];\n            var y2 = positions[i2 + 1];\n            var z2 = positions[i2 + 2];\n            var xm = (x1 + x2) / 2;\n            var ym = (y1 + y2) / 2;\n            var zm = (z1 + z2) / 2;\n            var len = Math.sqrt(xm * xm + ym * ym + zm * zm);\n            xm /= len;\n            ym /= len;\n            zm /= len;\n            positions.push(xm, ym, zm);\n            return pointMemo[key] = positions.length / 3 - 1;\n        };\n    }();\n    for(var i = 0; i < iterations; i++){\n        var indices2 = [];\n        for(var j = 0; j < indices.length; j += 3){\n            var a = getMiddlePoint(indices[j + 0], indices[j + 1]);\n            var b = getMiddlePoint(indices[j + 1], indices[j + 2]);\n            var c = getMiddlePoint(indices[j + 2], indices[j + 0]);\n            indices2.push(c, indices[j + 0], a, a, indices[j + 1], b, b, indices[j + 2], c, a, b, c);\n        }\n        indices = indices2;\n    }\n    var normals = new Array(positions.length);\n    var texCoords = new Array(positions.length / 3 * 2);\n    var l = indices.length;\n    for(var _i = l - 3; _i >= 0; _i -= 3){\n        var i11 = indices[_i + 0];\n        var i21 = indices[_i + 1];\n        var i3 = indices[_i + 2];\n        var in1 = i11 * 3;\n        var in2 = i21 * 3;\n        var in3 = i3 * 3;\n        var iu1 = i11 * 2;\n        var iu2 = i21 * 2;\n        var iu3 = i3 * 2;\n        var x11 = positions[in1 + 0];\n        var y11 = positions[in1 + 1];\n        var z11 = positions[in1 + 2];\n        var theta1 = Math.acos(z11 / Math.sqrt(x11 * x11 + y11 * y11 + z11 * z11));\n        var phi1 = Math.atan2(y11, x11) + PI;\n        var v1 = theta1 / PI;\n        var u1 = 1 - phi1 / PI2;\n        var x21 = positions[in2 + 0];\n        var y21 = positions[in2 + 1];\n        var z21 = positions[in2 + 2];\n        var theta2 = Math.acos(z21 / Math.sqrt(x21 * x21 + y21 * y21 + z21 * z21));\n        var phi2 = Math.atan2(y21, x21) + PI;\n        var v2 = theta2 / PI;\n        var u2 = 1 - phi2 / PI2;\n        var x3 = positions[in3 + 0];\n        var y3 = positions[in3 + 1];\n        var z3 = positions[in3 + 2];\n        var theta3 = Math.acos(z3 / Math.sqrt(x3 * x3 + y3 * y3 + z3 * z3));\n        var phi3 = Math.atan2(y3, x3) + PI;\n        var v3 = theta3 / PI;\n        var u3 = 1 - phi3 / PI2;\n        var vec1 = [\n            x3 - x21,\n            y3 - y21,\n            z3 - z21\n        ];\n        var vec2 = [\n            x11 - x21,\n            y11 - y21,\n            z11 - z21\n        ];\n        var normal = new (0, _mathGl.Vector3)(vec1).cross(vec2).normalize();\n        var newIndex = void 0;\n        if ((u1 === 0 || u2 === 0 || u3 === 0) && (u1 === 0 || u1 > 0.5) && (u2 === 0 || u2 > 0.5) && (u3 === 0 || u3 > 0.5)) {\n            positions.push(positions[in1 + 0], positions[in1 + 1], positions[in1 + 2]);\n            newIndex = positions.length / 3 - 1;\n            indices.push(newIndex);\n            texCoords[newIndex * 2 + 0] = 1;\n            texCoords[newIndex * 2 + 1] = v1;\n            normals[newIndex * 3 + 0] = normal.x;\n            normals[newIndex * 3 + 1] = normal.y;\n            normals[newIndex * 3 + 2] = normal.z;\n            positions.push(positions[in2 + 0], positions[in2 + 1], positions[in2 + 2]);\n            newIndex = positions.length / 3 - 1;\n            indices.push(newIndex);\n            texCoords[newIndex * 2 + 0] = 1;\n            texCoords[newIndex * 2 + 1] = v2;\n            normals[newIndex * 3 + 0] = normal.x;\n            normals[newIndex * 3 + 1] = normal.y;\n            normals[newIndex * 3 + 2] = normal.z;\n            positions.push(positions[in3 + 0], positions[in3 + 1], positions[in3 + 2]);\n            newIndex = positions.length / 3 - 1;\n            indices.push(newIndex);\n            texCoords[newIndex * 2 + 0] = 1;\n            texCoords[newIndex * 2 + 1] = v3;\n            normals[newIndex * 3 + 0] = normal.x;\n            normals[newIndex * 3 + 1] = normal.y;\n            normals[newIndex * 3 + 2] = normal.z;\n        }\n        normals[in1 + 0] = normals[in2 + 0] = normals[in3 + 0] = normal.x;\n        normals[in1 + 1] = normals[in2 + 1] = normals[in3 + 1] = normal.y;\n        normals[in1 + 2] = normals[in2 + 2] = normals[in3 + 2] = normal.z;\n        texCoords[iu1 + 0] = u1;\n        texCoords[iu1 + 1] = v1;\n        texCoords[iu2 + 0] = u2;\n        texCoords[iu2 + 1] = v2;\n        texCoords[iu3 + 0] = u3;\n        texCoords[iu3 + 1] = v3;\n    }\n    return {\n        indices: {\n            size: 1,\n            value: new Uint16Array(indices)\n        },\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: new Float32Array(positions)\n            },\n            NORMAL: {\n                size: 3,\n                value: new Float32Array(normals)\n            },\n            TEXCOORD_0: {\n                size: 2,\n                value: new Float32Array(texCoords)\n            }\n        }\n    };\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"math.gl\":\"6aDAl\",\"../geometry/geometry\":\"3diJw\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"avrih\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PlaneGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _geometryUtils = require(\"../geometry/geometry-utils\");\nvar _webgl = require(\"@luma.gl/webgl\");\nvar PlaneGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(PlaneGeometry1, _Geometry);\n    function PlaneGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, PlaneGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"plane-geometry\") : _props$id;\n        var _tesselatePlane = tesselatePlane(props), indices = _tesselatePlane.indices, attributes = _tesselatePlane.attributes;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(PlaneGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: indices,\n            attributes: (0, _objectSpreadDefault.default)({}, attributes, props.attributes)\n        })));\n    }\n    return PlaneGeometry1;\n}((0, _geometryDefault.default));\nfunction tesselatePlane(props) {\n    var _props$type = props.type, type = _props$type === void 0 ? \"x,y\" : _props$type, _props$offset = props.offset, offset = _props$offset === void 0 ? 0 : _props$offset, _props$flipCull = props.flipCull, flipCull = _props$flipCull === void 0 ? false : _props$flipCull, _props$unpack = props.unpack, unpack = _props$unpack === void 0 ? false : _props$unpack;\n    var coords = type.split(\",\");\n    var c1len = props[\"\".concat(coords[0], \"len\")] || 1;\n    var c2len = props[\"\".concat(coords[1], \"len\")] || 1;\n    var subdivisions1 = props[\"n\".concat(coords[0])] || 1;\n    var subdivisions2 = props[\"n\".concat(coords[1])] || 1;\n    var numVertices = (subdivisions1 + 1) * (subdivisions2 + 1);\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var texCoords = new Float32Array(numVertices * 2);\n    if (flipCull) c1len = -c1len;\n    var i2 = 0;\n    var i3 = 0;\n    for(var z = 0; z <= subdivisions2; z++)for(var x = 0; x <= subdivisions1; x++){\n        var u = x / subdivisions1;\n        var v = z / subdivisions2;\n        texCoords[i2 + 0] = flipCull ? 1 - u : u;\n        texCoords[i2 + 1] = v;\n        switch(type){\n            case \"x,y\":\n                positions[i3 + 0] = c1len * u - c1len * 0.5;\n                positions[i3 + 1] = c2len * v - c2len * 0.5;\n                positions[i3 + 2] = offset;\n                normals[i3 + 0] = 0;\n                normals[i3 + 1] = 0;\n                normals[i3 + 2] = flipCull ? 1 : -1;\n                break;\n            case \"x,z\":\n                positions[i3 + 0] = c1len * u - c1len * 0.5;\n                positions[i3 + 1] = offset;\n                positions[i3 + 2] = c2len * v - c2len * 0.5;\n                normals[i3 + 0] = 0;\n                normals[i3 + 1] = flipCull ? 1 : -1;\n                normals[i3 + 2] = 0;\n                break;\n            case \"y,z\":\n                positions[i3 + 0] = offset;\n                positions[i3 + 1] = c1len * u - c1len * 0.5;\n                positions[i3 + 2] = c2len * v - c2len * 0.5;\n                normals[i3 + 0] = flipCull ? 1 : -1;\n                normals[i3 + 1] = 0;\n                normals[i3 + 2] = 0;\n                break;\n            default:\n                throw new Error(\"PlaneGeometry: unknown type\");\n        }\n        i2 += 2;\n        i3 += 3;\n    }\n    var numVertsAcross = subdivisions1 + 1;\n    var indices = new Uint16Array(subdivisions1 * subdivisions2 * 6);\n    for(var _z = 0; _z < subdivisions2; _z++)for(var _x = 0; _x < subdivisions1; _x++){\n        var index = (_z * subdivisions1 + _x) * 6;\n        indices[index + 0] = (_z + 0) * numVertsAcross + _x;\n        indices[index + 1] = (_z + 1) * numVertsAcross + _x;\n        indices[index + 2] = (_z + 0) * numVertsAcross + _x + 1;\n        indices[index + 3] = (_z + 1) * numVertsAcross + _x;\n        indices[index + 4] = (_z + 1) * numVertsAcross + _x + 1;\n        indices[index + 5] = (_z + 0) * numVertsAcross + _x + 1;\n    }\n    var geometry = {\n        indices: {\n            size: 1,\n            value: indices\n        },\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: positions\n            },\n            NORMAL: {\n                size: 3,\n                value: normals\n            },\n            TEXCOORD_0: {\n                size: 2,\n                value: texCoords\n            }\n        }\n    };\n    return unpack ? (0, _geometryUtils.unpackIndexedGeometry)(geometry) : geometry;\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"../geometry/geometry\":\"3diJw\",\"../geometry/geometry-utils\":\"iaOP0\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iaOP0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"unpackIndexedGeometry\", ()=>unpackIndexedGeometry);\nfunction unpackIndexedGeometry(geometry) {\n    var indices = geometry.indices, attributes = geometry.attributes;\n    if (!indices) return geometry;\n    var vertexCount = indices.value.length;\n    var unpackedAttributes = {};\n    for(var attributeName in attributes){\n        var attribute = attributes[attributeName];\n        var constant = attribute.constant, value = attribute.value, size = attribute.size;\n        if (constant || !size) continue;\n        var unpackedValue = new value.constructor(vertexCount * size);\n        for(var x = 0; x < vertexCount; ++x){\n            var index = indices.value[x];\n            for(var i = 0; i < size; i++)unpackedValue[x * size + i] = value[index * size + i];\n        }\n        unpackedAttributes[attributeName] = {\n            size: size,\n            value: unpackedValue\n        };\n    }\n    return {\n        attributes: Object.assign({}, attributes, unpackedAttributes)\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3j0XY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>SphereGeometry);\nvar _objectSpread = require(\"@babel/runtime/helpers/esm/objectSpread\");\nvar _objectSpreadDefault = parcelHelpers.interopDefault(_objectSpread);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar _webgl = require(\"@luma.gl/webgl\");\nvar SphereGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(SphereGeometry1, _Geometry);\n    function SphereGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, SphereGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _webgl.uid)(\"sphere-geometry\") : _props$id;\n        var _tesselateSphere = tesselateSphere(props), indices = _tesselateSphere.indices, attributes = _tesselateSphere.attributes;\n        return (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(SphereGeometry1).call(this, (0, _objectSpreadDefault.default)({}, props, {\n            id: id,\n            indices: indices,\n            attributes: (0, _objectSpreadDefault.default)({}, attributes, props.attributes)\n        })));\n    }\n    return SphereGeometry1;\n}((0, _geometryDefault.default));\nfunction tesselateSphere(props) {\n    var _props$nlat = props.nlat, nlat = _props$nlat === void 0 ? 10 : _props$nlat, _props$nlong = props.nlong, nlong = _props$nlong === void 0 ? 10 : _props$nlong;\n    var _props$radius = props.radius, radius = _props$radius === void 0 ? 1 : _props$radius;\n    var startLat = 0;\n    var endLat = Math.PI;\n    var latRange = endLat - startLat;\n    var startLong = 0;\n    var endLong = 2 * Math.PI;\n    var longRange = endLong - startLong;\n    var numVertices = (nlat + 1) * (nlong + 1);\n    if (typeof radius === \"number\") {\n        var value = radius;\n        radius = function radius(n1, n2, n3, u, v) {\n            return value;\n        };\n    }\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var texCoords = new Float32Array(numVertices * 2);\n    var IndexType = numVertices > 0xffff ? Uint32Array : Uint16Array;\n    var indices = new IndexType(nlat * nlong * 6);\n    for(var y = 0; y <= nlat; y++)for(var x = 0; x <= nlong; x++){\n        var u = x / nlong;\n        var v = y / nlat;\n        var index = x + y * (nlong + 1);\n        var i2 = index * 2;\n        var i3 = index * 3;\n        var theta = longRange * u;\n        var phi = latRange * v;\n        var sinTheta = Math.sin(theta);\n        var cosTheta = Math.cos(theta);\n        var sinPhi = Math.sin(phi);\n        var cosPhi = Math.cos(phi);\n        var ux = cosTheta * sinPhi;\n        var uy = cosPhi;\n        var uz = sinTheta * sinPhi;\n        var r = radius(ux, uy, uz, u, v);\n        positions[i3 + 0] = r * ux;\n        positions[i3 + 1] = r * uy;\n        positions[i3 + 2] = r * uz;\n        normals[i3 + 0] = ux;\n        normals[i3 + 1] = uy;\n        normals[i3 + 2] = uz;\n        texCoords[i2 + 0] = u;\n        texCoords[i2 + 1] = 1 - v;\n    }\n    var numVertsAround = nlong + 1;\n    for(var _x = 0; _x < nlong; _x++)for(var _y = 0; _y < nlat; _y++){\n        var _index = (_x * nlat + _y) * 6;\n        indices[_index + 0] = _y * numVertsAround + _x;\n        indices[_index + 1] = _y * numVertsAround + _x + 1;\n        indices[_index + 2] = (_y + 1) * numVertsAround + _x;\n        indices[_index + 3] = (_y + 1) * numVertsAround + _x;\n        indices[_index + 4] = _y * numVertsAround + _x + 1;\n        indices[_index + 5] = (_y + 1) * numVertsAround + _x + 1;\n    }\n    return {\n        indices: {\n            size: 1,\n            value: indices\n        },\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: positions\n            },\n            NORMAL: {\n                size: 3,\n                value: normals\n            },\n            TEXCOORD_0: {\n                size: 2,\n                value: texCoords\n            }\n        }\n    };\n}\n\n},{\"@babel/runtime/helpers/esm/objectSpread\":\"Js3JN\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"../geometry/geometry\":\"3diJw\",\"@luma.gl/webgl\":\"7gBVn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ebmMe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Timeline\", ()=>Timeline);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar channelHandles = 1;\nvar animationHandles = 1;\nvar Timeline = function() {\n    function Timeline1() {\n        (0, _classCallCheckDefault.default)(this, Timeline1);\n        this.time = 0;\n        this.channels = new Map();\n        this.animations = new Map();\n        this.playing = false;\n        this.lastEngineTime = -1;\n    }\n    (0, _createClassDefault.default)(Timeline1, [\n        {\n            key: \"addChannel\",\n            value: function addChannel(props) {\n                var _props$delay = props.delay, delay = _props$delay === void 0 ? 0 : _props$delay, _props$duration = props.duration, duration = _props$duration === void 0 ? Number.POSITIVE_INFINITY : _props$duration, _props$rate = props.rate, rate = _props$rate === void 0 ? 1 : _props$rate, _props$repeat = props.repeat, repeat = _props$repeat === void 0 ? 1 : _props$repeat;\n                var handle = channelHandles++;\n                var channel = {\n                    time: 0,\n                    delay: delay,\n                    duration: duration,\n                    rate: rate,\n                    repeat: repeat\n                };\n                this._setChannelTime(channel, this.time);\n                this.channels.set(handle, channel);\n                return handle;\n            }\n        },\n        {\n            key: \"removeChannel\",\n            value: function removeChannel(handle) {\n                this.channels[\"delete\"](handle);\n                var _iteratorNormalCompletion = true;\n                var _didIteratorError = false;\n                var _iteratorError = undefined;\n                try {\n                    for(var _iterator = this.animations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){\n                        var _step$value = (0, _slicedToArrayDefault.default)(_step.value, 2), animationHandle = _step$value[0], animation = _step$value[1];\n                        if (animation.channel === handle) this.detachAnimation(animationHandle);\n                    }\n                } catch (err) {\n                    _didIteratorError = true;\n                    _iteratorError = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion && _iterator[\"return\"] != null) _iterator[\"return\"]();\n                    } finally{\n                        if (_didIteratorError) throw _iteratorError;\n                    }\n                }\n            }\n        },\n        {\n            key: \"isFinished\",\n            value: function isFinished(handle) {\n                var channel = this.channels.get(handle);\n                if (channel === undefined) return false;\n                return this.time >= channel.delay + channel.duration * channel.repeat;\n            }\n        },\n        {\n            key: \"getTime\",\n            value: function getTime(handle) {\n                if (handle === undefined) return this.time;\n                var channel = this.channels.get(handle);\n                if (channel === undefined) return -1;\n                return channel.time;\n            }\n        },\n        {\n            key: \"setTime\",\n            value: function setTime(time) {\n                this.time = Math.max(0, time);\n                var channels = this.channels.values();\n                var _iteratorNormalCompletion2 = true;\n                var _didIteratorError2 = false;\n                var _iteratorError2 = undefined;\n                try {\n                    for(var _iterator2 = channels[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){\n                        var channel = _step2.value;\n                        this._setChannelTime(channel, this.time);\n                    }\n                } catch (err) {\n                    _didIteratorError2 = true;\n                    _iteratorError2 = err;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion2 && _iterator2[\"return\"] != null) _iterator2[\"return\"]();\n                    } finally{\n                        if (_didIteratorError2) throw _iteratorError2;\n                    }\n                }\n                var animations = this.animations.values();\n                var _iteratorNormalCompletion3 = true;\n                var _didIteratorError3 = false;\n                var _iteratorError3 = undefined;\n                try {\n                    for(var _iterator3 = animations[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true){\n                        var animationData = _step3.value;\n                        var animation = animationData.animation, _channel = animationData.channel;\n                        animation.setTime(this.getTime(_channel));\n                    }\n                } catch (err1) {\n                    _didIteratorError3 = true;\n                    _iteratorError3 = err1;\n                } finally{\n                    try {\n                        if (!_iteratorNormalCompletion3 && _iterator3[\"return\"] != null) _iterator3[\"return\"]();\n                    } finally{\n                        if (_didIteratorError3) throw _iteratorError3;\n                    }\n                }\n            }\n        },\n        {\n            key: \"play\",\n            value: function play() {\n                this.playing = true;\n            }\n        },\n        {\n            key: \"pause\",\n            value: function pause() {\n                this.playing = false;\n                this.lastEngineTime = -1;\n            }\n        },\n        {\n            key: \"reset\",\n            value: function reset() {\n                this.setTime(0);\n            }\n        },\n        {\n            key: \"attachAnimation\",\n            value: function attachAnimation(animation, channelHandle) {\n                var animationHandle = animationHandles++;\n                this.animations.set(animationHandle, {\n                    animation: animation,\n                    channel: channelHandle\n                });\n                animation.setTime(this.getTime(channelHandle));\n                return animationHandle;\n            }\n        },\n        {\n            key: \"detachAnimation\",\n            value: function detachAnimation(handle) {\n                this.animations[\"delete\"](handle);\n            }\n        },\n        {\n            key: \"update\",\n            value: function update(engineTime) {\n                if (this.playing) {\n                    if (this.lastEngineTime === -1) this.lastEngineTime = engineTime;\n                    this.setTime(this.time + (engineTime - this.lastEngineTime));\n                    this.lastEngineTime = engineTime;\n                }\n            }\n        },\n        {\n            key: \"_setChannelTime\",\n            value: function _setChannelTime(channel, time) {\n                var offsetTime = time - channel.delay;\n                var totalDuration = channel.duration * channel.repeat;\n                if (offsetTime >= totalDuration) channel.time = channel.duration * channel.rate;\n                else {\n                    channel.time = Math.max(0, offsetTime) % channel.duration;\n                    channel.time *= channel.rate;\n                }\n            }\n        }\n    ]);\n    return Timeline1;\n}();\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bCM9J\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ClipSpace);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _model = require(\"../lib/model\");\nvar _modelDefault = parcelHelpers.interopDefault(_model);\nvar _geometry = require(\"../geometry/geometry\");\nvar _geometryDefault = parcelHelpers.interopDefault(_geometry);\nvar CLIPSPACE_VERTEX_SHADER = \"attribute vec2 aClipSpacePosition;\\nattribute vec2 aTexCoord;\\nattribute vec2 aCoordinate;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  gl_Position = vec4(aClipSpacePosition, 0., 1.);\\n  position = aClipSpacePosition;\\n  coordinate = aCoordinate;\\n  uv = aTexCoord;\\n}\\n\";\nvar POSITIONS = [\n    -1,\n    -1,\n    1,\n    -1,\n    -1,\n    1,\n    1,\n    1\n];\nvar ClipSpace = function(_Model) {\n    (0, _inheritsDefault.default)(ClipSpace1, _Model);\n    function ClipSpace1(gl, opts) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, ClipSpace1);\n        var TEX_COORDS = POSITIONS.map(function(coord) {\n            return coord === -1 ? 0 : coord;\n        });\n        _this = (0, _possibleConstructorReturnDefault.default)(this, (0, _getPrototypeOfDefault.default)(ClipSpace1).call(this, gl, Object.assign({}, opts, {\n            vs: CLIPSPACE_VERTEX_SHADER,\n            geometry: new (0, _geometryDefault.default)({\n                drawMode: 5,\n                vertexCount: 4,\n                attributes: {\n                    aClipSpacePosition: {\n                        size: 2,\n                        value: new Float32Array(POSITIONS)\n                    },\n                    aTexCoord: {\n                        size: 2,\n                        value: new Float32Array(TEX_COORDS)\n                    },\n                    aCoordinate: {\n                        size: 2,\n                        value: new Float32Array(TEX_COORDS)\n                    }\n                }\n            })\n        })));\n        _this.setVertexCount(4);\n        return _this;\n    }\n    return ClipSpace1;\n}((0, _modelDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"../lib/model\":\"6H3H1\",\"../geometry/geometry\":\"3diJw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hFGto\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar vs = \"\\nstruct VertexGeometry {\\n  vec4 position;\\n  vec3 worldPosition;\\n  vec3 worldPositionAlt;\\n  vec3 normal;\\n  vec2 uv;\\n  vec3 pickingColor;\\n} geometry;\\n\";\nvar fs = \"\\n#define SMOOTH_EDGE_RADIUS 0.5\\n\\nstruct FragmentGeometry {\\n  vec2 uv;\\n} geometry;\\n\\nfloat smoothedge(float edge, float x) {\\n  return smoothstep(edge - SMOOTH_EDGE_RADIUS, edge + SMOOTH_EDGE_RADIUS, x);\\n}\\n\";\nexports.default = {\n    name: \"geometry\",\n    vs: vs,\n    fs: fs\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8zLfE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _core = require(\"@luma.gl/core\");\nvar _projectGlsl = require(\"./project.glsl\");\nvar _projectGlslDefault = parcelHelpers.interopDefault(_projectGlsl);\nvar _viewportUniforms = require(\"./viewport-uniforms\");\nvar INITIAL_MODULE_OPTIONS = {};\nfunction getUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_MODULE_OPTIONS;\n    if (opts.viewport) return (0, _viewportUniforms.getUniformsFromViewport)(opts);\n    return {};\n}\nexports.default = {\n    name: \"project\",\n    dependencies: [\n        (0, _core.fp32)\n    ],\n    vs: (0, _projectGlslDefault.default),\n    getUniforms: getUniforms\n};\n\n},{\"@luma.gl/core\":\"bW3Qv\",\"./project.glsl\":\"jPAEV\",\"./viewport-uniforms\":\"gQm6z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jPAEV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constants = require(\"../../lib/constants\");\nvar COORDINATE_SYSTEM_GLSL_CONSTANTS = Object.keys((0, _constants.COORDINATE_SYSTEM)).map(function(key) {\n    return \"const int COORDINATE_SYSTEM_\".concat(key, \" = \").concat((0, _constants.COORDINATE_SYSTEM)[key], \";\");\n}).join(\"\");\nvar PROJECTION_MODE_GLSL_CONSTANTS = Object.keys((0, _constants.PROJECTION_MODE)).map(function(key) {\n    return \"const int PROJECTION_MODE_\".concat(key, \" = \").concat((0, _constants.PROJECTION_MODE)[key], \";\");\n}).join(\"\");\nexports.default = \"\".concat(COORDINATE_SYSTEM_GLSL_CONSTANTS, \"\\n\").concat(PROJECTION_MODE_GLSL_CONSTANTS, \"\\n\\nuniform int project_uCoordinateSystem;\\nuniform int project_uProjectionMode;\\nuniform float project_uScale;\\nuniform bool project_uWrapLongitude;\\nuniform float project_uAntimeridian;\\nuniform vec3 project_uCommonUnitsPerMeter;\\nuniform vec3 project_uCommonUnitsPerWorldUnit;\\nuniform vec3 project_uCommonUnitsPerWorldUnit2;\\nuniform vec4 project_uCenter;\\nuniform mat4 project_uModelMatrix;\\nuniform mat4 project_uViewProjectionMatrix;\\nuniform vec2 project_uViewportSize;\\nuniform float project_uDevicePixelRatio;\\nuniform float project_uFocalDistance;\\nuniform vec3 project_uCameraPosition;\\nuniform vec3 project_uCoordinateOrigin;\\n\\nconst float TILE_SIZE = 512.0;\\nconst float PI = 3.1415926536;\\nconst float WORLD_SCALE = TILE_SIZE / (PI * 2.0);\\nconst vec3 ZERO_64_LOW = vec3(0.0);\\nconst float EARTH_RADIUS = 6370972.0;\\nconst float GLOBE_RADIUS = 256.0;\\nfloat project_size(float meters) {\\n  return meters * project_uCommonUnitsPerMeter.z;\\n}\\n\\nvec2 project_size(vec2 meters) {\\n  return meters * project_uCommonUnitsPerMeter.xy;\\n}\\n\\nvec3 project_size(vec3 meters) {\\n  return meters * project_uCommonUnitsPerMeter;\\n}\\n\\nvec4 project_size(vec4 meters) {\\n  return vec4(meters.xyz * project_uCommonUnitsPerMeter, meters.w);\\n}\\nvec3 project_normal(vec3 vector) {\\n  vec4 normal_modelspace = project_uModelMatrix * vec4(vector, 0.0);\\n  return normalize(normal_modelspace.xyz * project_uCommonUnitsPerMeter);\\n}\\n\\nvec4 project_offset_(vec4 offset) {\\n  float dy = offset.y;\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT) {\\n    dy = clamp(dy, -1., 1.);\\n  }\\n  vec3 commonUnitsPerWorldUnit = project_uCommonUnitsPerWorldUnit + project_uCommonUnitsPerWorldUnit2 * dy;\\n  return vec4(offset.xyz * commonUnitsPerWorldUnit, offset.w);\\n}\\nvec2 project_mercator_(vec2 lnglat) {\\n  float x = lnglat.x;\\n  if (project_uWrapLongitude) {\\n    x = mod(x - project_uAntimeridian, 360.0) + project_uAntimeridian;\\n  }\\n  float y = clamp(lnglat.y, -89.9, 89.9);\\n  return vec2(\\n    radians(x) + PI,\\n    PI + log(tan_fp32(PI * 0.25 + radians(y) * 0.5))\\n  );\\n}\\n\\nvec3 project_globe_(vec3 lnglatz) {\\n  float lambda = radians(lnglatz.x);\\n  float phi = radians(lnglatz.y);\\n  float cosPhi = cos(phi);\\n  float D = (lnglatz.z / EARTH_RADIUS + 1.0) * GLOBE_RADIUS;\\n\\n  return vec3(\\n    sin(lambda) * cosPhi,\\n    -cos(lambda) * cosPhi,\\n    sin(phi)\\n  ) * D;\\n}\\nvec4 project_position(vec4 position, vec3 position64Low) {\\n  vec4 position_world = project_uModelMatrix * position;\\n  if (project_uProjectionMode == PROJECTION_MODE_WEB_MERCATOR) {\\n    if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT) {\\n      return vec4(\\n        project_mercator_(position_world.xy) * WORLD_SCALE,\\n        project_size(position_world.z),\\n        position_world.w\\n      );\\n    }\\n    if (project_uCoordinateSystem == COORDINATE_SYSTEM_CARTESIAN) {\\n      position_world.xyz += project_uCoordinateOrigin;\\n    }\\n  }\\n  if (project_uProjectionMode == PROJECTION_MODE_GLOBE) {\\n    if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT) {\\n      return vec4(\\n        project_globe_(position_world.xyz),\\n        position_world.w\\n      );\\n    }\\n  }\\n  if (project_uProjectionMode == PROJECTION_MODE_IDENTITY ||\\n    (project_uProjectionMode == PROJECTION_MODE_WEB_MERCATOR_AUTO_OFFSET &&\\n    (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT ||\\n     project_uCoordinateSystem == COORDINATE_SYSTEM_CARTESIAN))) {\\n    position_world.xyz -= project_uCoordinateOrigin;\\n  }\\n  return project_offset_(position_world + project_uModelMatrix * vec4(position64Low, 0.0));\\n}\\n\\nvec4 project_position(vec4 position) {\\n  return project_position(position, ZERO_64_LOW);\\n}\\n\\nvec3 project_position(vec3 position, vec3 position64Low) {\\n  vec4 projected_position = project_position(vec4(position, 1.0), position64Low);\\n  return projected_position.xyz;\\n}\\n\\nvec3 project_position(vec3 position) {\\n  vec4 projected_position = project_position(vec4(position, 1.0), ZERO_64_LOW);\\n  return projected_position.xyz;\\n}\\n\\nvec2 project_position(vec2 position) {\\n  vec4 projected_position = project_position(vec4(position, 0.0, 1.0), ZERO_64_LOW);\\n  return projected_position.xy;\\n}\\n\\nvec4 project_common_position_to_clipspace(vec4 position, mat4 viewProjectionMatrix, vec4 center) {\\n  return viewProjectionMatrix * position + center;\\n}\\nvec4 project_common_position_to_clipspace(vec4 position) {\\n  return project_common_position_to_clipspace(position, project_uViewProjectionMatrix, project_uCenter);\\n}\\nvec2 project_pixel_size_to_clipspace(vec2 pixels) {\\n  vec2 offset = pixels / project_uViewportSize * project_uDevicePixelRatio * 2.0;\\n  return offset * project_uFocalDistance;\\n}\\n\\nfloat project_size_to_pixel(float meters) {\\n  return project_size(meters) * project_uScale;\\n}\\nfloat project_pixel_size(float pixels) {\\n  return pixels / project_uScale;\\n}\\nvec2 project_pixel_size(vec2 pixels) {\\n  return pixels / project_uScale;\\n}\\nmat3 project_get_orientation_matrix(vec3 up) {\\n  vec3 uz = normalize(up);\\n  vec3 ux = abs(uz.z) == 1.0 ? vec3(1.0, 0.0, 0.0) : normalize(vec3(uz.y, -uz.x, 0));\\n  vec3 uy = cross(uz, ux);\\n  return mat3(ux, uy, uz);\\n}\\n\\nbool project_needs_rotation(vec3 commonPosition, out mat3 transform) {\\n  if (project_uProjectionMode == PROJECTION_MODE_GLOBE) {\\n    transform = project_get_orientation_matrix(commonPosition);\\n    return true;\\n  }\\n  return false;\\n}\\n\");\n\n},{\"../../lib/constants\":\"4VZPz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4VZPz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"COORDINATE_SYSTEM\", ()=>COORDINATE_SYSTEM);\nparcelHelpers.export(exports, \"PROJECTION_MODE\", ()=>PROJECTION_MODE);\nparcelHelpers.export(exports, \"EVENTS\", ()=>EVENTS);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar COORDINATE_SYSTEM = {\n    DEFAULT: -1,\n    LNGLAT: 1,\n    METER_OFFSETS: 2,\n    LNGLAT_OFFSETS: 3,\n    CARTESIAN: 0\n};\nObject.defineProperty(COORDINATE_SYSTEM, \"IDENTITY\", {\n    get: function get() {\n        return (0, _logDefault.default).deprecated(\"COORDINATE_SYSTEM.IDENTITY\", \"COORDINATE_SYSTEM.CARTESIAN\")() || 0;\n    }\n});\nvar PROJECTION_MODE = {\n    WEB_MERCATOR: 1,\n    GLOBE: 2,\n    WEB_MERCATOR_AUTO_OFFSET: 4,\n    IDENTITY: 0\n};\nvar EVENTS = {\n    click: {\n        handler: \"onClick\"\n    },\n    panstart: {\n        handler: \"onDragStart\"\n    },\n    panmove: {\n        handler: \"onDrag\"\n    },\n    panend: {\n        handler: \"onDragEnd\"\n    }\n};\n\n},{\"../utils/log\":\"fg4UT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gQm6z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getOffsetOrigin\", ()=>getOffsetOrigin);\nparcelHelpers.export(exports, \"getUniformsFromViewport\", ()=>getUniformsFromViewport);\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _vec4 = require(\"gl-matrix/vec4\");\nvar _constants = require(\"../../lib/constants\");\nvar _memoize = require(\"../../utils/memoize\");\nvar _memoizeDefault = parcelHelpers.interopDefault(_memoize);\nvar _assert = require(\"../../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar ZERO_VECTOR = [\n    0,\n    0,\n    0,\n    0\n];\nvar VECTOR_TO_POINT_MATRIX = [\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    0\n];\nvar IDENTITY_MATRIX = [\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1\n];\nvar DEFAULT_PIXELS_PER_UNIT2 = [\n    0,\n    0,\n    0\n];\nvar DEFAULT_COORDINATE_ORIGIN = [\n    0,\n    0,\n    0\n];\nvar getMemoizedViewportUniforms = (0, _memoizeDefault.default)(calculateViewportUniforms);\nfunction getOffsetOrigin(viewport, coordinateSystem) {\n    var coordinateOrigin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_COORDINATE_ORIGIN;\n    var shaderCoordinateOrigin = coordinateOrigin;\n    var geospatialOrigin;\n    var offsetMode = true;\n    if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT_OFFSETS || coordinateSystem === (0, _constants.COORDINATE_SYSTEM).METER_OFFSETS) geospatialOrigin = coordinateOrigin;\n    else geospatialOrigin = viewport.isGeospatial ? [\n        Math.fround(viewport.longitude),\n        Math.fround(viewport.latitude),\n        0\n    ] : null;\n    switch(viewport.projectionMode){\n        case (0, _constants.PROJECTION_MODE).WEB_MERCATOR:\n            if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT || coordinateSystem === (0, _constants.COORDINATE_SYSTEM).CARTESIAN) offsetMode = false;\n            break;\n        case (0, _constants.PROJECTION_MODE).WEB_MERCATOR_AUTO_OFFSET:\n            if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT) shaderCoordinateOrigin = geospatialOrigin;\n            else if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).CARTESIAN) {\n                shaderCoordinateOrigin = [\n                    Math.fround(viewport.center[0]),\n                    Math.fround(viewport.center[1]),\n                    0\n                ];\n                geospatialOrigin = viewport.unprojectPosition(shaderCoordinateOrigin);\n                shaderCoordinateOrigin[0] -= coordinateOrigin[0];\n                shaderCoordinateOrigin[1] -= coordinateOrigin[1];\n                shaderCoordinateOrigin[2] -= coordinateOrigin[2];\n            }\n            break;\n        case (0, _constants.PROJECTION_MODE).IDENTITY:\n            shaderCoordinateOrigin = viewport.position.map(Math.fround);\n            break;\n        case (0, _constants.PROJECTION_MODE).GLOBE:\n            offsetMode = false;\n            geospatialOrigin = null;\n            break;\n        default:\n            offsetMode = false;\n    }\n    shaderCoordinateOrigin[2] = shaderCoordinateOrigin[2] || 0;\n    return {\n        geospatialOrigin: geospatialOrigin,\n        shaderCoordinateOrigin: shaderCoordinateOrigin,\n        offsetMode: offsetMode\n    };\n}\nfunction calculateMatrixAndOffset(viewport, coordinateSystem, coordinateOrigin) {\n    var viewMatrixUncentered = viewport.viewMatrixUncentered, projectionMatrix = viewport.projectionMatrix;\n    var viewMatrix = viewport.viewMatrix, viewProjectionMatrix = viewport.viewProjectionMatrix;\n    var projectionCenter = ZERO_VECTOR;\n    var cameraPosCommon = viewport.cameraPosition;\n    var _getOffsetOrigin = getOffsetOrigin(viewport, coordinateSystem, coordinateOrigin), geospatialOrigin = _getOffsetOrigin.geospatialOrigin, shaderCoordinateOrigin = _getOffsetOrigin.shaderCoordinateOrigin, offsetMode = _getOffsetOrigin.offsetMode;\n    if (offsetMode) {\n        var positionCommonSpace = viewport.projectPosition(geospatialOrigin || shaderCoordinateOrigin);\n        cameraPosCommon = [\n            cameraPosCommon[0] - positionCommonSpace[0],\n            cameraPosCommon[1] - positionCommonSpace[1],\n            cameraPosCommon[2] - positionCommonSpace[2]\n        ];\n        positionCommonSpace[3] = 1;\n        projectionCenter = _vec4.transformMat4([], positionCommonSpace, viewProjectionMatrix);\n        viewMatrix = viewMatrixUncentered || viewMatrix;\n        viewProjectionMatrix = _mat4.multiply([], projectionMatrix, viewMatrix);\n        viewProjectionMatrix = _mat4.multiply([], viewProjectionMatrix, VECTOR_TO_POINT_MATRIX);\n    }\n    return {\n        viewMatrix: viewMatrix,\n        viewProjectionMatrix: viewProjectionMatrix,\n        projectionCenter: projectionCenter,\n        cameraPosCommon: cameraPosCommon,\n        shaderCoordinateOrigin: shaderCoordinateOrigin,\n        geospatialOrigin: geospatialOrigin\n    };\n}\nfunction getUniformsFromViewport() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, viewport = _ref.viewport, _ref$devicePixelRatio = _ref.devicePixelRatio, devicePixelRatio = _ref$devicePixelRatio === void 0 ? 1 : _ref$devicePixelRatio, _ref$modelMatrix = _ref.modelMatrix, modelMatrix = _ref$modelMatrix === void 0 ? null : _ref$modelMatrix, _ref$coordinateSystem = _ref.coordinateSystem, coordinateSystem = _ref$coordinateSystem === void 0 ? (0, _constants.COORDINATE_SYSTEM).DEFAULT : _ref$coordinateSystem, coordinateOrigin = _ref.coordinateOrigin, _ref$autoWrapLongitud = _ref.autoWrapLongitude, autoWrapLongitude = _ref$autoWrapLongitud === void 0 ? false : _ref$autoWrapLongitud, projectionMode = _ref.projectionMode, positionOrigin = _ref.positionOrigin;\n    (0, _assertDefault.default)(viewport);\n    if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).DEFAULT) coordinateSystem = viewport.isGeospatial ? (0, _constants.COORDINATE_SYSTEM).LNGLAT : (0, _constants.COORDINATE_SYSTEM).CARTESIAN;\n    var uniforms = getMemoizedViewportUniforms({\n        viewport: viewport,\n        devicePixelRatio: devicePixelRatio,\n        coordinateSystem: coordinateSystem,\n        coordinateOrigin: coordinateOrigin\n    });\n    uniforms.project_uWrapLongitude = autoWrapLongitude;\n    uniforms.project_uModelMatrix = modelMatrix || IDENTITY_MATRIX;\n    return uniforms;\n}\nfunction calculateViewportUniforms(_ref2) {\n    var viewport = _ref2.viewport, devicePixelRatio = _ref2.devicePixelRatio, coordinateSystem = _ref2.coordinateSystem, coordinateOrigin = _ref2.coordinateOrigin;\n    var _calculateMatrixAndOf = calculateMatrixAndOffset(viewport, coordinateSystem, coordinateOrigin), projectionCenter = _calculateMatrixAndOf.projectionCenter, viewProjectionMatrix = _calculateMatrixAndOf.viewProjectionMatrix, cameraPosCommon = _calculateMatrixAndOf.cameraPosCommon, shaderCoordinateOrigin = _calculateMatrixAndOf.shaderCoordinateOrigin, geospatialOrigin = _calculateMatrixAndOf.geospatialOrigin;\n    var distanceScales = viewport.getDistanceScales();\n    var viewportSize = [\n        viewport.width * devicePixelRatio,\n        viewport.height * devicePixelRatio\n    ];\n    var uniforms = {\n        project_uCoordinateSystem: coordinateSystem,\n        project_uProjectionMode: viewport.projectionMode,\n        project_uCoordinateOrigin: shaderCoordinateOrigin,\n        project_uCenter: projectionCenter,\n        project_uAntimeridian: (viewport.longitude || 0) - 180,\n        project_uViewportSize: viewportSize,\n        project_uDevicePixelRatio: devicePixelRatio,\n        project_uFocalDistance: viewport.focalDistance || 1,\n        project_uCommonUnitsPerMeter: distanceScales.unitsPerMeter,\n        project_uCommonUnitsPerWorldUnit: distanceScales.unitsPerMeter,\n        project_uCommonUnitsPerWorldUnit2: DEFAULT_PIXELS_PER_UNIT2,\n        project_uScale: viewport.scale,\n        project_uViewProjectionMatrix: viewProjectionMatrix,\n        project_uCameraPosition: cameraPosCommon\n    };\n    if (geospatialOrigin) {\n        var distanceScalesAtOrigin = viewport.getDistanceScales(geospatialOrigin);\n        switch(coordinateSystem){\n            case (0, _constants.COORDINATE_SYSTEM).METER_OFFSETS:\n                uniforms.project_uCommonUnitsPerWorldUnit = distanceScalesAtOrigin.unitsPerMeter;\n                uniforms.project_uCommonUnitsPerWorldUnit2 = distanceScalesAtOrigin.unitsPerMeter2;\n                break;\n            case (0, _constants.COORDINATE_SYSTEM).LNGLAT:\n            case (0, _constants.COORDINATE_SYSTEM).LNGLAT_OFFSETS:\n                uniforms.project_uCommonUnitsPerWorldUnit = distanceScalesAtOrigin.unitsPerDegree;\n                uniforms.project_uCommonUnitsPerWorldUnit2 = distanceScalesAtOrigin.unitsPerDegree2;\n                break;\n            case (0, _constants.COORDINATE_SYSTEM).CARTESIAN:\n                uniforms.project_uCommonUnitsPerWorldUnit = [\n                    1,\n                    1,\n                    distanceScalesAtOrigin.unitsPerMeter[2]\n                ];\n                uniforms.project_uCommonUnitsPerWorldUnit2 = [\n                    0,\n                    0,\n                    distanceScalesAtOrigin.unitsPerMeter2[2]\n                ];\n                break;\n            default:\n                break;\n        }\n    }\n    return uniforms;\n}\n\n},{\"gl-matrix/mat4\":\"jn7Bp\",\"gl-matrix/vec4\":\"czCsm\",\"../../lib/constants\":\"4VZPz\",\"../../utils/memoize\":\"hjEig\",\"../../utils/assert\":\"8goZO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hjEig\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction isEqual(a, b) {\n    if (a === b) return true;\n    if (Array.isArray(a)) {\n        var len = a.length;\n        if (!b || b.length !== len) return false;\n        for(var i = 0; i < len; i++){\n            if (a[i] !== b[i]) return false;\n        }\n        return true;\n    }\n    return false;\n}\nfunction memoize(compute) {\n    var cachedArgs = {};\n    var cachedResult;\n    return function(args) {\n        for(var key in args)if (!isEqual(args[key], cachedArgs[key])) {\n            cachedResult = compute(args);\n            cachedArgs = args;\n            break;\n        }\n        return cachedResult;\n    };\n}\nexports.default = memoize;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8goZO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"deck.gl: assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hPHOW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _project = require(\"../project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar vs = \"\\nvec4 project_position_to_clipspace(\\n  vec3 position, vec3 position64Low, vec3 offset, out vec4 commonPosition\\n) {\\n  vec3 projectedPosition = project_position(position, position64Low);\\n  if (project_uProjectionMode == PROJECTION_MODE_GLOBE) {\\n    // offset is specified as ENU\\n    // when in globe projection, rotate offset so that the ground alighs with the surface of the globe\\n    mat3 rotation = project_get_orientation_matrix(projectedPosition);\\n    offset = rotation * offset;\\n  }\\n  commonPosition = vec4(projectedPosition + offset, 1.0);\\n  return project_common_position_to_clipspace(commonPosition);\\n}\\n\\nvec4 project_position_to_clipspace(\\n  vec3 position, vec3 position64Low, vec3 offset\\n) {\\n  vec4 commonPosition;\\n  return project_position_to_clipspace(position, position64Low, offset, commonPosition);\\n}\\n\";\nexports.default = {\n    name: \"project32\",\n    dependencies: [\n        (0, _projectDefault.default)\n    ],\n    vs: vs\n};\n\n},{\"../project/project\":\"8zLfE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dXWGr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _toConsumableArray = require(\"@babel/runtime/helpers/esm/toConsumableArray\");\nvar _toConsumableArrayDefault = parcelHelpers.interopDefault(_toConsumableArray);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _constants = require(\"../../lib/constants\");\nvar _project = require(\"../project/project\");\nvar _projectDefault = parcelHelpers.interopDefault(_project);\nvar _mathGl = require(\"math.gl\");\nvar _memoize = require(\"../../utils/memoize\");\nvar _memoizeDefault = parcelHelpers.interopDefault(_memoize);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar vs = \"\\nconst int max_lights = 2;\\nuniform mat4 shadow_uViewProjectionMatrices[max_lights];\\nuniform vec4 shadow_uProjectCenters[max_lights];\\nuniform bool shadow_uDrawShadowMap;\\nuniform bool shadow_uUseShadowMap;\\nuniform int shadow_uLightId;\\nuniform float shadow_uLightCount;\\n\\nvarying vec3 shadow_vPosition[max_lights];\\n\\nvec4 shadow_setVertexPosition(vec4 position_commonspace) {\\n  if (shadow_uDrawShadowMap) {\\n    return project_common_position_to_clipspace(position_commonspace, shadow_uViewProjectionMatrices[shadow_uLightId], shadow_uProjectCenters[shadow_uLightId]);\\n  }\\n  if (shadow_uUseShadowMap) {\\n    for (int i = 0; i < max_lights; i++) {\\n      if(i < int(shadow_uLightCount)) {\\n        vec4 shadowMap_position = project_common_position_to_clipspace(position_commonspace, shadow_uViewProjectionMatrices[i], shadow_uProjectCenters[i]);\\n        shadow_vPosition[i] = (shadowMap_position.xyz / shadowMap_position.w + 1.0) / 2.0;\\n      }\\n    }\\n  }\\n  return gl_Position;\\n}\\n\";\nvar fs = \"\\nconst int max_lights = 2;\\nuniform bool shadow_uDrawShadowMap;\\nuniform bool shadow_uUseShadowMap;\\nuniform sampler2D shadow_uShadowMap0;\\nuniform sampler2D shadow_uShadowMap1;\\nuniform vec4 shadow_uColor;\\nuniform float shadow_uLightCount;\\n\\nvarying vec3 shadow_vPosition[max_lights];\\n\\nconst vec4 bitPackShift = vec4(1.0, 255.0, 65025.0, 16581375.0);\\nconst vec4 bitUnpackShift = 1.0 / bitPackShift;\\nconst vec4 bitMask = vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0,  0.0);\\n\\nfloat shadow_getShadowWeight(vec3 position, sampler2D shadowMap) {\\n  vec4 rgbaDepth = texture2D(shadowMap, position.xy);\\n\\n  float z = dot(rgbaDepth, bitUnpackShift);\\n  return smoothstep(0.001, 0.01, position.z - z);\\n}\\n\\nvec4 shadow_filterShadowColor(vec4 color) {\\n  if (shadow_uDrawShadowMap) {\\n    vec4 rgbaDepth = fract(gl_FragCoord.z * bitPackShift);\\n    rgbaDepth -= rgbaDepth.gbaa * bitMask;\\n    return rgbaDepth;\\n  }\\n  if (shadow_uUseShadowMap) {\\n    float shadowAlpha = 0.0;\\n    shadowAlpha += shadow_getShadowWeight(shadow_vPosition[0], shadow_uShadowMap0);\\n    if(shadow_uLightCount > 1.0) {\\n      shadowAlpha += shadow_getShadowWeight(shadow_vPosition[1], shadow_uShadowMap1);\\n    }\\n    shadowAlpha *= shadow_uColor.a / shadow_uLightCount;\\n    float blendedAlpha = shadowAlpha + color.a * (1.0 - shadowAlpha);\\n\\n    return vec4(\\n      mix(color.rgb, shadow_uColor.rgb, shadowAlpha / blendedAlpha),\\n      blendedAlpha\\n    );\\n  }\\n  return color;\\n}\\n\";\nvar getMemoizedViewportCenterPosition = (0, _memoizeDefault.default)(getViewportCenterPosition);\nvar getMemoizedViewProjectionMatrices = (0, _memoizeDefault.default)(getViewProjectionMatrices);\nvar DEFAULT_SHADOW_COLOR = [\n    0,\n    0,\n    0,\n    1.0\n];\nvar VECTOR_TO_POINT_MATRIX = [\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    1,\n    0,\n    0,\n    0,\n    0,\n    0\n];\nfunction screenToCommonSpace(xyz, pixelUnprojectionMatrix) {\n    var _xyz = (0, _slicedToArrayDefault.default)(xyz, 3), x = _xyz[0], y = _xyz[1], z = _xyz[2];\n    var coord = (0, _webMercator.pixelsToWorld)([\n        x,\n        y,\n        z\n    ], pixelUnprojectionMatrix);\n    if (Number.isFinite(z)) return coord;\n    return [\n        coord[0],\n        coord[1],\n        0\n    ];\n}\nfunction getViewportCenterPosition(_ref) {\n    var viewport = _ref.viewport, center = _ref.center;\n    return new (0, _mathGl.Matrix4)(viewport.viewProjectionMatrix).invert().transform(center);\n}\nfunction getViewProjectionMatrices(_ref2) {\n    var viewport = _ref2.viewport, shadowMatrices = _ref2.shadowMatrices;\n    var projectionMatrices = [];\n    var pixelUnprojectionMatrix = viewport.pixelUnprojectionMatrix;\n    var farZ = viewport.isGeospatial ? undefined : 1;\n    var corners = [\n        [\n            0,\n            0,\n            farZ\n        ],\n        [\n            viewport.width,\n            0,\n            farZ\n        ],\n        [\n            0,\n            viewport.height,\n            farZ\n        ],\n        [\n            viewport.width,\n            viewport.height,\n            farZ\n        ],\n        [\n            0,\n            0,\n            -1\n        ],\n        [\n            viewport.width,\n            0,\n            -1\n        ],\n        [\n            0,\n            viewport.height,\n            -1\n        ],\n        [\n            viewport.width,\n            viewport.height,\n            -1\n        ]\n    ].map(function(pixel) {\n        return screenToCommonSpace(pixel, pixelUnprojectionMatrix);\n    });\n    var _iterator = _createForOfIteratorHelper(shadowMatrices), _step;\n    try {\n        var _loop = function _loop() {\n            var shadowMatrix = _step.value;\n            var viewMatrix = shadowMatrix.clone().translate(new (0, _mathGl.Vector3)(viewport.center).negate());\n            var positions = corners.map(function(corner) {\n                return viewMatrix.transform(corner);\n            });\n            var projectionMatrix = new (0, _mathGl.Matrix4)().ortho({\n                left: Math.min.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return position[0];\n                }))),\n                right: Math.max.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return position[0];\n                }))),\n                bottom: Math.min.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return position[1];\n                }))),\n                top: Math.max.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return position[1];\n                }))),\n                near: Math.min.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return -position[2];\n                }))),\n                far: Math.max.apply(Math, (0, _toConsumableArrayDefault.default)(positions.map(function(position) {\n                    return -position[2];\n                })))\n            });\n            projectionMatrices.push(projectionMatrix.multiplyRight(shadowMatrix));\n        };\n        for(_iterator.s(); !(_step = _iterator.n()).done;)_loop();\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    return projectionMatrices;\n}\nfunction createShadowUniforms() {\n    var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var uniforms = {\n        shadow_uDrawShadowMap: Boolean(opts.drawToShadowMap),\n        shadow_uUseShadowMap: opts.shadowMaps ? opts.shadowMaps.length > 0 : false,\n        shadow_uColor: opts.shadowColor || DEFAULT_SHADOW_COLOR,\n        shadow_uLightId: opts.shadowLightId || 0,\n        shadow_uLightCount: opts.shadowMatrices.length\n    };\n    var center = getMemoizedViewportCenterPosition({\n        viewport: opts.viewport,\n        center: context.project_uCenter\n    });\n    var projectCenters = [];\n    var viewProjectionMatrices = getMemoizedViewProjectionMatrices({\n        shadowMatrices: opts.shadowMatrices,\n        viewport: opts.viewport\n    }).slice();\n    for(var i = 0; i < opts.shadowMatrices.length; i++){\n        var viewProjectionMatrix = viewProjectionMatrices[i];\n        var viewProjectionMatrixCentered = viewProjectionMatrix.clone().translate(new (0, _mathGl.Vector3)(opts.viewport.center).negate());\n        if (context.project_uCoordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT && context.project_uProjectionMode === (0, _constants.PROJECTION_MODE).WEB_MERCATOR) {\n            viewProjectionMatrices[i] = viewProjectionMatrixCentered;\n            projectCenters[i] = center;\n        } else {\n            viewProjectionMatrices[i] = viewProjectionMatrix.clone().multiplyRight(VECTOR_TO_POINT_MATRIX);\n            projectCenters[i] = viewProjectionMatrixCentered.transform(center);\n        }\n    }\n    for(var _i = 0; _i < viewProjectionMatrices.length; _i++){\n        uniforms[\"shadow_uViewProjectionMatrices[\".concat(_i, \"]\")] = viewProjectionMatrices[_i];\n        uniforms[\"shadow_uProjectCenters[\".concat(_i, \"]\")] = projectCenters[_i];\n        if (opts.shadowMaps && opts.shadowMaps.length > 0) uniforms[\"shadow_uShadowMap\".concat(_i)] = opts.shadowMaps[_i];\n        else uniforms[\"shadow_uShadowMap\".concat(_i)] = opts.dummyShadowMap;\n    }\n    return uniforms;\n}\nexports.default = {\n    name: \"shadow\",\n    dependencies: [\n        (0, _projectDefault.default)\n    ],\n    vs: vs,\n    fs: fs,\n    inject: {\n        \"vs:DECKGL_FILTER_GL_POSITION\": \"\\n    position = shadow_setVertexPosition(geometry.position);\\n    \",\n        \"fs:DECKGL_FILTER_COLOR\": \"\\n    color = shadow_filterShadowColor(color);\\n    \"\n    },\n    getUniforms: function getUniforms() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        if (opts.drawToShadowMap || opts.shadowMaps && opts.shadowMaps.length > 0) {\n            var shadowUniforms = {};\n            var _opts$shadowEnabled = opts.shadowEnabled, shadowEnabled = _opts$shadowEnabled === void 0 ? true : _opts$shadowEnabled;\n            if (shadowEnabled && opts.shadowMatrices && opts.shadowMatrices.length > 0) Object.assign(shadowUniforms, createShadowUniforms(opts, context));\n            else Object.assign(shadowUniforms, {\n                shadow_uDrawShadowMap: false,\n                shadow_uUseShadowMap: false\n            });\n            return shadowUniforms;\n        }\n        return {};\n    }\n};\n\n},{\"@babel/runtime/helpers/esm/toConsumableArray\":\"2mzaU\",\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"../../lib/constants\":\"4VZPz\",\"../project/project\":\"8zLfE\",\"math.gl\":\"6aDAl\",\"../../utils/memoize\":\"hjEig\",\"@math.gl/web-mercator\":\"jS2l3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jS2l3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>(0, _webMercatorViewportDefault.default));\nparcelHelpers.export(exports, \"WebMercatorViewport\", ()=>(0, _webMercatorViewportDefault.default));\nparcelHelpers.export(exports, \"getBounds\", ()=>(0, _getBoundsDefault.default));\nparcelHelpers.export(exports, \"fitBounds\", ()=>(0, _fitBoundsDefault.default));\nparcelHelpers.export(exports, \"normalizeViewportProps\", ()=>(0, _normalizeViewportPropsDefault.default));\nparcelHelpers.export(exports, \"flyToViewport\", ()=>(0, _flyToViewportDefault.default));\nparcelHelpers.export(exports, \"getFlyToDuration\", ()=>(0, _flyToViewport.getFlyToDuration));\nparcelHelpers.export(exports, \"MAX_LATITUDE\", ()=>(0, _webMercatorUtils.MAX_LATITUDE));\nparcelHelpers.export(exports, \"lngLatToWorld\", ()=>(0, _webMercatorUtils.lngLatToWorld));\nparcelHelpers.export(exports, \"worldToLngLat\", ()=>(0, _webMercatorUtils.worldToLngLat));\nparcelHelpers.export(exports, \"worldToPixels\", ()=>(0, _webMercatorUtils.worldToPixels));\nparcelHelpers.export(exports, \"pixelsToWorld\", ()=>(0, _webMercatorUtils.pixelsToWorld));\nparcelHelpers.export(exports, \"zoomToScale\", ()=>(0, _webMercatorUtils.zoomToScale));\nparcelHelpers.export(exports, \"scaleToZoom\", ()=>(0, _webMercatorUtils.scaleToZoom));\nparcelHelpers.export(exports, \"altitudeToFovy\", ()=>(0, _webMercatorUtils.altitudeToFovy));\nparcelHelpers.export(exports, \"fovyToAltitude\", ()=>(0, _webMercatorUtils.fovyToAltitude));\nparcelHelpers.export(exports, \"getMeterZoom\", ()=>(0, _webMercatorUtils.getMeterZoom));\nparcelHelpers.export(exports, \"unitsPerMeter\", ()=>(0, _webMercatorUtils.unitsPerMeter));\nparcelHelpers.export(exports, \"getDistanceScales\", ()=>(0, _webMercatorUtils.getDistanceScales));\nparcelHelpers.export(exports, \"addMetersToLngLat\", ()=>(0, _webMercatorUtils.addMetersToLngLat));\nparcelHelpers.export(exports, \"getViewMatrix\", ()=>(0, _webMercatorUtils.getViewMatrix));\nparcelHelpers.export(exports, \"getProjectionMatrix\", ()=>(0, _webMercatorUtils.getProjectionMatrix));\nparcelHelpers.export(exports, \"getProjectionParameters\", ()=>(0, _webMercatorUtils.getProjectionParameters));\nvar _webMercatorViewport = require(\"./web-mercator-viewport\");\nvar _webMercatorViewportDefault = parcelHelpers.interopDefault(_webMercatorViewport);\nvar _getBounds = require(\"./get-bounds\");\nvar _getBoundsDefault = parcelHelpers.interopDefault(_getBounds);\nvar _fitBounds = require(\"./fit-bounds\");\nvar _fitBoundsDefault = parcelHelpers.interopDefault(_fitBounds);\nvar _normalizeViewportProps = require(\"./normalize-viewport-props\");\nvar _normalizeViewportPropsDefault = parcelHelpers.interopDefault(_normalizeViewportProps);\nvar _flyToViewport = require(\"./fly-to-viewport\");\nvar _flyToViewportDefault = parcelHelpers.interopDefault(_flyToViewport);\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\n\n},{\"./web-mercator-viewport\":\"7xEvM\",\"./get-bounds\":\"e6OPW\",\"./fit-bounds\":\"cqZRF\",\"./normalize-viewport-props\":\"bsgSc\",\"./fly-to-viewport\":\"fvPqb\",\"./web-mercator-utils\":\"jQHfU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7xEvM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _mathUtils = require(\"./math-utils\");\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nvar _fitBounds = require(\"./fit-bounds\");\nvar _fitBoundsDefault = parcelHelpers.interopDefault(_fitBounds);\nvar _getBounds = require(\"./get-bounds\");\nvar _getBoundsDefault = parcelHelpers.interopDefault(_getBounds);\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nclass WebMercatorViewport {\n    constructor(props = {\n        width: 1,\n        height: 1\n    }){\n        (0, _definePropertyDefault.default)(this, \"latitude\", void 0);\n        (0, _definePropertyDefault.default)(this, \"longitude\", void 0);\n        (0, _definePropertyDefault.default)(this, \"zoom\", void 0);\n        (0, _definePropertyDefault.default)(this, \"pitch\", void 0);\n        (0, _definePropertyDefault.default)(this, \"bearing\", void 0);\n        (0, _definePropertyDefault.default)(this, \"altitude\", void 0);\n        (0, _definePropertyDefault.default)(this, \"fovy\", void 0);\n        (0, _definePropertyDefault.default)(this, \"meterOffset\", void 0);\n        (0, _definePropertyDefault.default)(this, \"center\", void 0);\n        (0, _definePropertyDefault.default)(this, \"width\", void 0);\n        (0, _definePropertyDefault.default)(this, \"height\", void 0);\n        (0, _definePropertyDefault.default)(this, \"scale\", void 0);\n        (0, _definePropertyDefault.default)(this, \"distanceScales\", void 0);\n        (0, _definePropertyDefault.default)(this, \"viewMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"projectionMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"viewProjectionMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"pixelProjectionMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"pixelUnprojectionMatrix\", void 0);\n        (0, _definePropertyDefault.default)(this, \"equals\", (viewport)=>{\n            if (!(viewport instanceof WebMercatorViewport)) return false;\n            return viewport.width === this.width && viewport.height === this.height && _mat4.equals(viewport.projectionMatrix, this.projectionMatrix) && _mat4.equals(viewport.viewMatrix, this.viewMatrix);\n        });\n        (0, _definePropertyDefault.default)(this, \"project\", (lngLatZ, options = {})=>{\n            const { topLeft =true  } = options;\n            const worldPosition = this.projectPosition(lngLatZ);\n            const coord = (0, _webMercatorUtils.worldToPixels)(worldPosition, this.pixelProjectionMatrix);\n            const [x, y] = coord;\n            const y2 = topLeft ? y : this.height - y;\n            return lngLatZ.length === 2 ? [\n                x,\n                y2\n            ] : [\n                x,\n                y2,\n                coord[2]\n            ];\n        });\n        (0, _definePropertyDefault.default)(this, \"unproject\", (xyz, options = {})=>{\n            const { topLeft =true , targetZ  } = options;\n            const [x, y, z] = xyz;\n            const y2 = topLeft ? y : this.height - y;\n            const targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n            const coord = (0, _webMercatorUtils.pixelsToWorld)([\n                x,\n                y2,\n                z\n            ], this.pixelUnprojectionMatrix, targetZWorld);\n            const [X, Y, Z] = this.unprojectPosition(coord);\n            if (Number.isFinite(z)) return [\n                X,\n                Y,\n                Z\n            ];\n            return Number.isFinite(targetZ) ? [\n                X,\n                Y,\n                targetZ\n            ] : [\n                X,\n                Y\n            ];\n        });\n        (0, _definePropertyDefault.default)(this, \"projectPosition\", (xyz)=>{\n            const [X, Y] = (0, _webMercatorUtils.lngLatToWorld)(xyz);\n            const Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n            return [\n                X,\n                Y,\n                Z\n            ];\n        });\n        (0, _definePropertyDefault.default)(this, \"unprojectPosition\", (xyz)=>{\n            const [X, Y] = (0, _webMercatorUtils.worldToLngLat)(xyz);\n            const Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n            return [\n                X,\n                Y,\n                Z\n            ];\n        });\n        let { width , height , altitude =null , fovy =null  } = props;\n        const { latitude =0 , longitude =0 , zoom =0 , pitch =0 , bearing =0 , position =null , nearZMultiplier =0.02 , farZMultiplier =1.01  } = props;\n        width = width || 1;\n        height = height || 1;\n        if (fovy === null && altitude === null) {\n            altitude = (0, _webMercatorUtils.DEFAULT_ALTITUDE);\n            fovy = (0, _webMercatorUtils.altitudeToFovy)(altitude);\n        } else if (fovy === null) fovy = (0, _webMercatorUtils.altitudeToFovy)(altitude);\n        else if (altitude === null) altitude = (0, _webMercatorUtils.fovyToAltitude)(fovy);\n        const scale = (0, _webMercatorUtils.zoomToScale)(zoom);\n        altitude = Math.max(0.75, altitude);\n        const distanceScales = (0, _webMercatorUtils.getDistanceScales)({\n            longitude,\n            latitude\n        });\n        const center = (0, _webMercatorUtils.lngLatToWorld)([\n            longitude,\n            latitude\n        ]);\n        center.push(0);\n        if (position) _vec3.add(center, center, _vec3.mul([], position, distanceScales.unitsPerMeter));\n        this.projectionMatrix = (0, _webMercatorUtils.getProjectionMatrix)({\n            width,\n            height,\n            scale,\n            center,\n            pitch,\n            fovy,\n            nearZMultiplier,\n            farZMultiplier\n        });\n        this.viewMatrix = (0, _webMercatorUtils.getViewMatrix)({\n            height,\n            scale,\n            center,\n            pitch,\n            bearing,\n            altitude\n        });\n        this.width = width;\n        this.height = height;\n        this.scale = scale;\n        this.latitude = latitude;\n        this.longitude = longitude;\n        this.zoom = zoom;\n        this.pitch = pitch;\n        this.bearing = bearing;\n        this.altitude = altitude;\n        this.fovy = fovy;\n        this.center = center;\n        this.meterOffset = position || [\n            0,\n            0,\n            0\n        ];\n        this.distanceScales = distanceScales;\n        this._initMatrices();\n        Object.freeze(this);\n    }\n    _initMatrices() {\n        const { width , height , projectionMatrix , viewMatrix  } = this;\n        const vpm = (0, _mathUtils.createMat4)();\n        _mat4.multiply(vpm, vpm, projectionMatrix);\n        _mat4.multiply(vpm, vpm, viewMatrix);\n        this.viewProjectionMatrix = vpm;\n        const m = (0, _mathUtils.createMat4)();\n        _mat4.scale(m, m, [\n            width / 2,\n            -height / 2,\n            1\n        ]);\n        _mat4.translate(m, m, [\n            1,\n            -1,\n            0\n        ]);\n        _mat4.multiply(m, m, vpm);\n        const mInverse = _mat4.invert((0, _mathUtils.createMat4)(), m);\n        if (!mInverse) throw new Error(\"Pixel project matrix not invertible\");\n        this.pixelProjectionMatrix = m;\n        this.pixelUnprojectionMatrix = mInverse;\n    }\n    projectFlat(lngLat) {\n        return (0, _webMercatorUtils.lngLatToWorld)(lngLat);\n    }\n    unprojectFlat(xy) {\n        return (0, _webMercatorUtils.worldToLngLat)(xy);\n    }\n    getMapCenterByLngLatPosition({ lngLat , pos  }) {\n        const fromLocation = (0, _webMercatorUtils.pixelsToWorld)(pos, this.pixelUnprojectionMatrix);\n        const toLocation = (0, _webMercatorUtils.lngLatToWorld)(lngLat);\n        const translate = _vec2.add([], toLocation, _vec2.negate([], fromLocation));\n        const newCenter = _vec2.add([], this.center, translate);\n        return (0, _webMercatorUtils.worldToLngLat)(newCenter);\n    }\n    fitBounds(bounds, options = {}) {\n        const { width , height  } = this;\n        const { longitude , latitude , zoom  } = (0, _fitBoundsDefault.default)(Object.assign({\n            width,\n            height,\n            bounds\n        }, options));\n        return new WebMercatorViewport({\n            width,\n            height,\n            longitude,\n            latitude,\n            zoom\n        });\n    }\n    getBounds(options) {\n        const corners = this.getBoundingRegion(options);\n        const west = Math.min(...corners.map((p)=>p[0]));\n        const east = Math.max(...corners.map((p)=>p[0]));\n        const south = Math.min(...corners.map((p)=>p[1]));\n        const north = Math.max(...corners.map((p)=>p[1]));\n        return [\n            [\n                west,\n                south\n            ],\n            [\n                east,\n                north\n            ]\n        ];\n    }\n    getBoundingRegion(options = {}) {\n        return (0, _getBoundsDefault.default)(this, options.z || 0);\n    }\n    getLocationAtPoint({ lngLat , pos  }) {\n        return this.getMapCenterByLngLatPosition({\n            lngLat,\n            pos\n        });\n    }\n}\nexports.default = WebMercatorViewport;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"./math-utils\":\"2XQ2B\",\"./web-mercator-utils\":\"jQHfU\",\"./fit-bounds\":\"cqZRF\",\"./get-bounds\":\"e6OPW\",\"gl-matrix/mat4\":\"jn7Bp\",\"gl-matrix/vec2\":\"ceSVb\",\"gl-matrix/vec3\":\"cAIcX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2XQ2B\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createMat4\", ()=>createMat4);\nparcelHelpers.export(exports, \"transformVector\", ()=>transformVector);\nparcelHelpers.export(exports, \"mod\", ()=>mod);\nparcelHelpers.export(exports, \"lerp\", ()=>lerp);\nparcelHelpers.export(exports, \"clamp\", ()=>clamp);\nparcelHelpers.export(exports, \"log2\", ()=>log2);\nvar _vec4 = require(\"gl-matrix/vec4\");\nfunction createMat4() {\n    return [\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1\n    ];\n}\nfunction transformVector(matrix, vector) {\n    const result = (0, _vec4.transformMat4)([], vector, matrix);\n    (0, _vec4.scale)(result, result, 1 / result[3]);\n    return result;\n}\nfunction mod(value, divisor) {\n    const modulus = value % divisor;\n    return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction lerp(start, end, step) {\n    return step * end + (1 - step) * start;\n}\nfunction clamp(x, min, max) {\n    return x < min ? min : x > max ? max : x;\n}\nfunction ieLog2(x) {\n    return Math.log(x) * Math.LOG2E;\n}\nconst log2 = Math.log2 || ieLog2;\n\n},{\"gl-matrix/vec4\":\"czCsm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jQHfU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"MAX_LATITUDE\", ()=>MAX_LATITUDE);\nparcelHelpers.export(exports, \"DEFAULT_ALTITUDE\", ()=>DEFAULT_ALTITUDE);\nparcelHelpers.export(exports, \"zoomToScale\", ()=>zoomToScale);\nparcelHelpers.export(exports, \"scaleToZoom\", ()=>scaleToZoom);\nparcelHelpers.export(exports, \"lngLatToWorld\", ()=>lngLatToWorld);\nparcelHelpers.export(exports, \"worldToLngLat\", ()=>worldToLngLat);\nparcelHelpers.export(exports, \"getMeterZoom\", ()=>getMeterZoom);\nparcelHelpers.export(exports, \"unitsPerMeter\", ()=>unitsPerMeter);\nparcelHelpers.export(exports, \"getDistanceScales\", ()=>getDistanceScales);\nparcelHelpers.export(exports, \"addMetersToLngLat\", ()=>addMetersToLngLat);\nparcelHelpers.export(exports, \"getViewMatrix\", ()=>getViewMatrix);\nparcelHelpers.export(exports, \"getProjectionParameters\", ()=>getProjectionParameters);\nparcelHelpers.export(exports, \"getProjectionMatrix\", ()=>getProjectionMatrix);\nparcelHelpers.export(exports, \"altitudeToFovy\", ()=>altitudeToFovy);\nparcelHelpers.export(exports, \"fovyToAltitude\", ()=>fovyToAltitude);\nparcelHelpers.export(exports, \"worldToPixels\", ()=>worldToPixels);\nparcelHelpers.export(exports, \"pixelsToWorld\", ()=>pixelsToWorld);\nvar _mathUtils = require(\"./math-utils\");\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nconst PI = Math.PI;\nconst PI_4 = PI / 4;\nconst DEGREES_TO_RADIANS = PI / 180;\nconst RADIANS_TO_DEGREES = 180 / PI;\nconst TILE_SIZE = 512;\nconst EARTH_CIRCUMFERENCE = 40.03e6;\nconst MAX_LATITUDE = 85.051129;\nconst DEFAULT_ALTITUDE = 1.5;\nfunction zoomToScale(zoom) {\n    return Math.pow(2, zoom);\n}\nfunction scaleToZoom(scale) {\n    return (0, _mathUtils.log2)(scale);\n}\nfunction lngLatToWorld(lngLat) {\n    const [lng, lat] = lngLat;\n    (0, _assertDefault.default)(Number.isFinite(lng));\n    (0, _assertDefault.default)(Number.isFinite(lat) && lat >= -90 && lat <= 90, \"invalid latitude\");\n    const lambda2 = lng * DEGREES_TO_RADIANS;\n    const phi2 = lat * DEGREES_TO_RADIANS;\n    const x = TILE_SIZE * (lambda2 + PI) / (2 * PI);\n    const y = TILE_SIZE * (PI + Math.log(Math.tan(PI_4 + phi2 * 0.5))) / (2 * PI);\n    return [\n        x,\n        y\n    ];\n}\nfunction worldToLngLat(xy) {\n    const [x, y] = xy;\n    const lambda2 = x / TILE_SIZE * (2 * PI) - PI;\n    const phi2 = 2 * (Math.atan(Math.exp(y / TILE_SIZE * (2 * PI) - PI)) - PI_4);\n    return [\n        lambda2 * RADIANS_TO_DEGREES,\n        phi2 * RADIANS_TO_DEGREES\n    ];\n}\nfunction getMeterZoom(options) {\n    const { latitude  } = options;\n    (0, _assertDefault.default)(Number.isFinite(latitude));\n    const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n    return scaleToZoom(EARTH_CIRCUMFERENCE * latCosine) - 9;\n}\nfunction unitsPerMeter(latitude) {\n    const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n    return TILE_SIZE / EARTH_CIRCUMFERENCE / latCosine;\n}\nfunction getDistanceScales(options) {\n    const { latitude , longitude , highPrecision =false  } = options;\n    (0, _assertDefault.default)(Number.isFinite(latitude) && Number.isFinite(longitude));\n    const worldSize = TILE_SIZE;\n    const latCosine = Math.cos(latitude * DEGREES_TO_RADIANS);\n    const unitsPerDegreeX = worldSize / 360;\n    const unitsPerDegreeY = unitsPerDegreeX / latCosine;\n    const altUnitsPerMeter = worldSize / EARTH_CIRCUMFERENCE / latCosine;\n    const result = {\n        unitsPerMeter: [\n            altUnitsPerMeter,\n            altUnitsPerMeter,\n            altUnitsPerMeter\n        ],\n        metersPerUnit: [\n            1 / altUnitsPerMeter,\n            1 / altUnitsPerMeter,\n            1 / altUnitsPerMeter\n        ],\n        unitsPerDegree: [\n            unitsPerDegreeX,\n            unitsPerDegreeY,\n            altUnitsPerMeter\n        ],\n        degreesPerUnit: [\n            1 / unitsPerDegreeX,\n            1 / unitsPerDegreeY,\n            1 / altUnitsPerMeter\n        ]\n    };\n    if (highPrecision) {\n        const latCosine2 = DEGREES_TO_RADIANS * Math.tan(latitude * DEGREES_TO_RADIANS) / latCosine;\n        const unitsPerDegreeY2 = unitsPerDegreeX * latCosine2 / 2;\n        const altUnitsPerDegree2 = worldSize / EARTH_CIRCUMFERENCE * latCosine2;\n        const altUnitsPerMeter2 = altUnitsPerDegree2 / unitsPerDegreeY * altUnitsPerMeter;\n        result.unitsPerDegree2 = [\n            0,\n            unitsPerDegreeY2,\n            altUnitsPerDegree2\n        ];\n        result.unitsPerMeter2 = [\n            altUnitsPerMeter2,\n            0,\n            altUnitsPerMeter2\n        ];\n    }\n    return result;\n}\nfunction addMetersToLngLat(lngLatZ, xyz) {\n    const [longitude, latitude, z0] = lngLatZ;\n    const [x, y, z] = xyz;\n    const { unitsPerMeter: unitsPerMeter1 , unitsPerMeter2  } = getDistanceScales({\n        longitude,\n        latitude,\n        highPrecision: true\n    });\n    const worldspace = lngLatToWorld(lngLatZ);\n    worldspace[0] += x * (unitsPerMeter1[0] + unitsPerMeter2[0] * y);\n    worldspace[1] += y * (unitsPerMeter1[1] + unitsPerMeter2[1] * y);\n    const newLngLat = worldToLngLat(worldspace);\n    const newZ = (z0 || 0) + (z || 0);\n    return Number.isFinite(z0) || Number.isFinite(z) ? [\n        newLngLat[0],\n        newLngLat[1],\n        newZ\n    ] : newLngLat;\n}\nfunction getViewMatrix(options) {\n    const { height , pitch , bearing , altitude , scale , center  } = options;\n    const vm = (0, _mathUtils.createMat4)();\n    _mat4.translate(vm, vm, [\n        0,\n        0,\n        -altitude\n    ]);\n    _mat4.rotateX(vm, vm, -pitch * DEGREES_TO_RADIANS);\n    _mat4.rotateZ(vm, vm, bearing * DEGREES_TO_RADIANS);\n    const relativeScale = scale / height;\n    _mat4.scale(vm, vm, [\n        relativeScale,\n        relativeScale,\n        relativeScale\n    ]);\n    if (center) _mat4.translate(vm, vm, _vec3.negate([], center));\n    return vm;\n}\nfunction getProjectionParameters(options) {\n    const { width , height , altitude , pitch =0 , offset , center , scale , nearZMultiplier =1 , farZMultiplier =1  } = options;\n    let { fovy =altitudeToFovy(DEFAULT_ALTITUDE)  } = options;\n    if (altitude !== undefined) fovy = altitudeToFovy(altitude);\n    const fovRadians = fovy * DEGREES_TO_RADIANS;\n    const pitchRadians = pitch * DEGREES_TO_RADIANS;\n    const focalDistance = fovyToAltitude(fovy);\n    let cameraToSeaLevelDistance = focalDistance;\n    if (center) cameraToSeaLevelDistance += center[2] * scale / Math.cos(pitchRadians) / height;\n    const fovAboveCenter = fovRadians * (0.5 + (offset ? offset[1] : 0) / height);\n    const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin((0, _mathUtils.clamp)(Math.PI / 2 - pitchRadians - fovAboveCenter, 0.01, Math.PI - 0.01));\n    const furthestDistance = Math.sin(pitchRadians) * topHalfSurfaceDistance + cameraToSeaLevelDistance;\n    const horizonDistance = cameraToSeaLevelDistance * 10;\n    const farZ = Math.min(furthestDistance * farZMultiplier, horizonDistance);\n    return {\n        fov: fovRadians,\n        aspect: width / height,\n        focalDistance,\n        near: nearZMultiplier,\n        far: farZ\n    };\n}\nfunction getProjectionMatrix(options) {\n    const { fov , aspect , near , far  } = getProjectionParameters(options);\n    const projectionMatrix = _mat4.perspective([], fov, aspect, near, far);\n    return projectionMatrix;\n}\nfunction altitudeToFovy(altitude) {\n    return 2 * Math.atan(0.5 / altitude) * RADIANS_TO_DEGREES;\n}\nfunction fovyToAltitude(fovy) {\n    return 0.5 / Math.tan(0.5 * fovy * DEGREES_TO_RADIANS);\n}\nfunction worldToPixels(xyz, pixelProjectionMatrix) {\n    const [x, y, z = 0] = xyz;\n    (0, _assertDefault.default)(Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z));\n    return (0, _mathUtils.transformVector)(pixelProjectionMatrix, [\n        x,\n        y,\n        z,\n        1\n    ]);\n}\nfunction pixelsToWorld(xyz, pixelUnprojectionMatrix, targetZ = 0) {\n    const [x, y, z] = xyz;\n    (0, _assertDefault.default)(Number.isFinite(x) && Number.isFinite(y), \"invalid pixel coordinate\");\n    if (Number.isFinite(z)) {\n        const coord = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n            x,\n            y,\n            z,\n            1\n        ]);\n        return coord;\n    }\n    const coord0 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n        x,\n        y,\n        0,\n        1\n    ]);\n    const coord1 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n        x,\n        y,\n        1,\n        1\n    ]);\n    const z0 = coord0[2];\n    const z1 = coord1[2];\n    const t = z0 === z1 ? 0 : ((targetZ || 0) - z0) / (z1 - z0);\n    return _vec2.lerp([], coord0, coord1, t);\n}\n\n},{\"./math-utils\":\"2XQ2B\",\"gl-matrix/mat4\":\"jn7Bp\",\"gl-matrix/vec2\":\"ceSVb\",\"gl-matrix/vec3\":\"cAIcX\",\"./assert\":\"iDNhJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iDNhJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction assert(condition, message) {\n    if (!condition) throw new Error(message || \"@math.gl/web-mercator: assertion failed.\");\n}\nexports.default = assert;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cqZRF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _mathUtils = require(\"./math-utils\");\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nfunction fitBounds(options) {\n    const { width , height , bounds , minExtent =0 , maxZoom =24 , offset =[\n        0,\n        0\n    ]  } = options;\n    const [[west, south], [east, north]] = bounds;\n    const padding = getPaddingObject(options.padding);\n    const nw = (0, _webMercatorUtils.lngLatToWorld)([\n        west,\n        (0, _mathUtils.clamp)(north, -(0, _webMercatorUtils.MAX_LATITUDE), (0, _webMercatorUtils.MAX_LATITUDE))\n    ]);\n    const se = (0, _webMercatorUtils.lngLatToWorld)([\n        east,\n        (0, _mathUtils.clamp)(south, -(0, _webMercatorUtils.MAX_LATITUDE), (0, _webMercatorUtils.MAX_LATITUDE))\n    ]);\n    const size = [\n        Math.max(Math.abs(se[0] - nw[0]), minExtent),\n        Math.max(Math.abs(se[1] - nw[1]), minExtent)\n    ];\n    const targetSize = [\n        width - padding.left - padding.right - Math.abs(offset[0]) * 2,\n        height - padding.top - padding.bottom - Math.abs(offset[1]) * 2\n    ];\n    (0, _assertDefault.default)(targetSize[0] > 0 && targetSize[1] > 0);\n    const scaleX = targetSize[0] / size[0];\n    const scaleY = targetSize[1] / size[1];\n    const offsetX = (padding.right - padding.left) / 2 / scaleX;\n    const offsetY = (padding.bottom - padding.top) / 2 / scaleY;\n    const center = [\n        (se[0] + nw[0]) / 2 + offsetX,\n        (se[1] + nw[1]) / 2 + offsetY\n    ];\n    const centerLngLat = (0, _webMercatorUtils.worldToLngLat)(center);\n    const zoom = Math.min(maxZoom, (0, _mathUtils.log2)(Math.abs(Math.min(scaleX, scaleY))));\n    (0, _assertDefault.default)(Number.isFinite(zoom));\n    return {\n        longitude: centerLngLat[0],\n        latitude: centerLngLat[1],\n        zoom\n    };\n}\nexports.default = fitBounds;\nfunction getPaddingObject(padding = 0) {\n    if (typeof padding === \"number\") return {\n        top: padding,\n        bottom: padding,\n        left: padding,\n        right: padding\n    };\n    (0, _assertDefault.default)(Number.isFinite(padding.top) && Number.isFinite(padding.bottom) && Number.isFinite(padding.left) && Number.isFinite(padding.right));\n    return padding;\n}\n\n},{\"./assert\":\"iDNhJ\",\"./math-utils\":\"2XQ2B\",\"./web-mercator-utils\":\"jQHfU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e6OPW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _mathUtils = require(\"./math-utils\");\nconst DEGREES_TO_RADIANS = Math.PI / 180;\nfunction getBounds(viewport, z = 0) {\n    const { width , height , unproject  } = viewport;\n    const unprojectOps = {\n        targetZ: z\n    };\n    const bottomLeft = unproject([\n        0,\n        height\n    ], unprojectOps);\n    const bottomRight = unproject([\n        width,\n        height\n    ], unprojectOps);\n    let topLeft;\n    let topRight;\n    const halfFov = viewport.fovy ? 0.5 * viewport.fovy * DEGREES_TO_RADIANS : Math.atan(0.5 / viewport.altitude);\n    const angleToGround = (90 - viewport.pitch) * DEGREES_TO_RADIANS;\n    if (halfFov > angleToGround - 0.01) {\n        topLeft = unprojectOnFarPlane(viewport, 0, z);\n        topRight = unprojectOnFarPlane(viewport, width, z);\n    } else {\n        topLeft = unproject([\n            0,\n            0\n        ], unprojectOps);\n        topRight = unproject([\n            width,\n            0\n        ], unprojectOps);\n    }\n    return [\n        bottomLeft,\n        bottomRight,\n        topRight,\n        topLeft\n    ];\n}\nexports.default = getBounds;\nfunction unprojectOnFarPlane(viewport, x, targetZ) {\n    const { pixelUnprojectionMatrix  } = viewport;\n    const coord0 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n        x,\n        0,\n        1,\n        1\n    ]);\n    const coord1 = (0, _mathUtils.transformVector)(pixelUnprojectionMatrix, [\n        x,\n        viewport.height,\n        1,\n        1\n    ]);\n    const z = targetZ * viewport.distanceScales.unitsPerMeter[2];\n    const t = (z - coord0[2]) / (coord1[2] - coord0[2]);\n    const coord = _vec2.lerp([], coord0, coord1, t);\n    const result = (0, _webMercatorUtils.worldToLngLat)(coord);\n    result.push(targetZ);\n    return result;\n}\n\n},{\"./web-mercator-utils\":\"jQHfU\",\"gl-matrix/vec2\":\"ceSVb\",\"./math-utils\":\"2XQ2B\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bsgSc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nvar _mathUtils = require(\"./math-utils\");\nconst TILE_SIZE = 512;\nfunction normalizeViewportProps(props) {\n    const { width , height , pitch =0  } = props;\n    let { longitude , latitude , zoom , bearing =0  } = props;\n    if (longitude < -180 || longitude > 180) longitude = (0, _mathUtils.mod)(longitude + 180, 360) - 180;\n    if (bearing < -180 || bearing > 180) bearing = (0, _mathUtils.mod)(bearing + 180, 360) - 180;\n    const minZoom = (0, _mathUtils.log2)(height / TILE_SIZE);\n    if (zoom <= minZoom) {\n        zoom = minZoom;\n        latitude = 0;\n    } else {\n        const halfHeightPixels = height / 2 / Math.pow(2, zoom);\n        const minLatitude = (0, _webMercatorUtils.worldToLngLat)([\n            0,\n            halfHeightPixels\n        ])[1];\n        if (latitude < minLatitude) latitude = minLatitude;\n        else {\n            const maxLatitude = (0, _webMercatorUtils.worldToLngLat)([\n                0,\n                TILE_SIZE - halfHeightPixels\n            ])[1];\n            if (latitude > maxLatitude) latitude = maxLatitude;\n        }\n    }\n    return {\n        width,\n        height,\n        longitude,\n        latitude,\n        zoom,\n        pitch,\n        bearing\n    };\n}\nexports.default = normalizeViewportProps;\n\n},{\"./web-mercator-utils\":\"jQHfU\",\"./math-utils\":\"2XQ2B\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fvPqb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getFlyToDuration\", ()=>getFlyToDuration);\nvar _mathUtils = require(\"./math-utils\");\nvar _webMercatorUtils = require(\"./web-mercator-utils\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nconst EPSILON = 0.01;\nconst VIEWPORT_TRANSITION_PROPS = [\n    \"longitude\",\n    \"latitude\",\n    \"zoom\"\n];\nconst DEFAULT_OPTS = {\n    curve: 1.414,\n    speed: 1.2\n};\nfunction flyToViewport(startProps, endProps, t, options) {\n    const { startZoom , startCenterXY , uDelta , w0 , u1 , S , rho , rho2 , r0  } = getFlyToTransitionParams(startProps, endProps, options);\n    if (u1 < EPSILON) {\n        const viewport = {};\n        for (const key of VIEWPORT_TRANSITION_PROPS){\n            const startValue = startProps[key];\n            const endValue = endProps[key];\n            viewport[key] = (0, _mathUtils.lerp)(startValue, endValue, t);\n        }\n        return viewport;\n    }\n    const s = t * S;\n    const w = Math.cosh(r0) / Math.cosh(r0 + rho * s);\n    const u = w0 * ((Math.cosh(r0) * Math.tanh(r0 + rho * s) - Math.sinh(r0)) / rho2) / u1;\n    const scaleIncrement = 1 / w;\n    const newZoom = startZoom + (0, _webMercatorUtils.scaleToZoom)(scaleIncrement);\n    const newCenterWorld = _vec2.scale([], uDelta, u);\n    _vec2.add(newCenterWorld, newCenterWorld, startCenterXY);\n    const newCenter = (0, _webMercatorUtils.worldToLngLat)(newCenterWorld);\n    return {\n        longitude: newCenter[0],\n        latitude: newCenter[1],\n        zoom: newZoom\n    };\n}\nexports.default = flyToViewport;\nfunction getFlyToDuration(startProps, endProps, options) {\n    const opts = {\n        ...DEFAULT_OPTS,\n        ...options\n    };\n    const { screenSpeed , speed , maxDuration  } = opts;\n    const { S , rho  } = getFlyToTransitionParams(startProps, endProps, opts);\n    const length = 1000 * S;\n    let duration;\n    if (Number.isFinite(screenSpeed)) duration = length / (screenSpeed / rho);\n    else duration = length / speed;\n    return Number.isFinite(maxDuration) && duration > maxDuration ? 0 : duration;\n}\nfunction getFlyToTransitionParams(startProps, endProps, opts) {\n    opts = Object.assign({}, DEFAULT_OPTS, opts);\n    const rho = opts.curve;\n    const startZoom = startProps.zoom;\n    const startCenter = [\n        startProps.longitude,\n        startProps.latitude\n    ];\n    const startScale = (0, _webMercatorUtils.zoomToScale)(startZoom);\n    const endZoom = endProps.zoom;\n    const endCenter = [\n        endProps.longitude,\n        endProps.latitude\n    ];\n    const scale = (0, _webMercatorUtils.zoomToScale)(endZoom - startZoom);\n    const startCenterXY = (0, _webMercatorUtils.lngLatToWorld)(startCenter);\n    const endCenterXY = (0, _webMercatorUtils.lngLatToWorld)(endCenter);\n    const uDelta = _vec2.sub([], endCenterXY, startCenterXY);\n    const w0 = Math.max(startProps.width, startProps.height);\n    const w1 = w0 / scale;\n    const u1 = _vec2.length(uDelta) * startScale;\n    const _u1 = Math.max(u1, EPSILON);\n    const rho2 = rho * rho;\n    const b0 = (w1 * w1 - w0 * w0 + rho2 * rho2 * _u1 * _u1) / (2 * w0 * rho2 * _u1);\n    const b1 = (w1 * w1 - w0 * w0 - rho2 * rho2 * _u1 * _u1) / (2 * w1 * rho2 * _u1);\n    const r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0);\n    const r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n    const S = (r1 - r0) / rho;\n    return {\n        startZoom,\n        startCenterXY,\n        uDelta,\n        w0,\n        u1,\n        S,\n        rho,\n        rho2,\n        r0,\n        r1\n    };\n}\n\n},{\"./math-utils\":\"2XQ2B\",\"./web-mercator-utils\":\"jQHfU\",\"gl-matrix/vec2\":\"ceSVb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ceFyb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _core = require(\"@luma.gl/core\");\nexports.default = Object.assign({\n    inject: {\n        \"vs:DECKGL_FILTER_COLOR\": \"\\n    picking_setPickingColor(geometry.pickingColor);\\n    // for picking depth values\\n    picking_setPickingAttribute(geometry.position.z);\\n    \",\n        \"fs:DECKGL_FILTER_COLOR\": {\n            order: 99,\n            injection: \"\\n    // use highlight color if this fragment belongs to the selected object.\\n    color = picking_filterHighlightColor(color);\\n\\n    // use picking color if rendering to picking FBO.\\n    color = picking_filterPickingColor(color);\\n      \"\n        }\n    }\n}, (0, _core.picking));\n\n},{\"@luma.gl/core\":\"bW3Qv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dZgtU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LightingEffect);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@luma.gl/core\");\nvar _ambientLight = require(\"./ambient-light\");\nvar _directionalLight = require(\"./directional-light\");\nvar _effect = require(\"../../lib/effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _mathGl = require(\"math.gl\");\nvar _shadowPass = require(\"../../passes/shadow-pass\");\nvar _shadowPassDefault = parcelHelpers.interopDefault(_shadowPass);\nvar _shadow = require(\"../../shaderlib/shadow/shadow\");\nvar _shadowDefault = parcelHelpers.interopDefault(_shadow);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_AMBIENT_LIGHT_PROPS = {\n    color: [\n        255,\n        255,\n        255\n    ],\n    intensity: 1.0\n};\nvar DEFAULT_DIRECTIONAL_LIGHT_PROPS = [\n    {\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 1.0,\n        direction: [\n            -1,\n            3,\n            -1\n        ]\n    },\n    {\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 0.9,\n        direction: [\n            1,\n            -8,\n            -2.5\n        ]\n    }\n];\nvar DEFAULT_SHADOW_COLOR = [\n    0,\n    0,\n    0,\n    200 / 255\n];\nvar LightingEffect = function(_Effect) {\n    (0, _inheritsDefault.default)(LightingEffect1, _Effect);\n    var _super = _createSuper(LightingEffect1);\n    function LightingEffect1(props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, LightingEffect1);\n        _this = _super.call(this, props);\n        _this.ambientLight = null;\n        _this.directionalLights = [];\n        _this.pointLights = [];\n        _this.shadowColor = DEFAULT_SHADOW_COLOR;\n        _this.shadowPasses = [];\n        _this.shadowMaps = [];\n        _this.dummyShadowMap = null;\n        _this.shadow = false;\n        _this.programManager = null;\n        for(var key in props){\n            var lightSource = props[key];\n            switch(lightSource.type){\n                case \"ambient\":\n                    _this.ambientLight = lightSource;\n                    break;\n                case \"directional\":\n                    _this.directionalLights.push(lightSource);\n                    break;\n                case \"point\":\n                    _this.pointLights.push(lightSource);\n                    break;\n                default:\n            }\n        }\n        _this._applyDefaultLights();\n        _this.shadow = _this.directionalLights.some(function(light) {\n            return light.shadow;\n        });\n        return _this;\n    }\n    (0, _createClassDefault.default)(LightingEffect1, [\n        {\n            key: \"preRender\",\n            value: function preRender(gl, _ref) {\n                var layers = _ref.layers, layerFilter = _ref.layerFilter, viewports = _ref.viewports, onViewportActive = _ref.onViewportActive, views = _ref.views;\n                if (!this.shadow) return;\n                this.shadowMatrices = this._createLightMatrix();\n                if (this.shadowPasses.length === 0) this._createShadowPasses(gl);\n                if (!this.programManager) {\n                    this.programManager = (0, _core.ProgramManager).getDefaultProgramManager(gl);\n                    if (0, _shadowDefault.default) this.programManager.addDefaultModule((0, _shadowDefault.default));\n                }\n                if (!this.dummyShadowMap) this.dummyShadowMap = new (0, _core.Texture2D)(gl, {\n                    width: 1,\n                    height: 1\n                });\n                for(var i = 0; i < this.shadowPasses.length; i++){\n                    var shadowPass = this.shadowPasses[i];\n                    shadowPass.render({\n                        layers: layers,\n                        layerFilter: layerFilter,\n                        viewports: viewports,\n                        onViewportActive: onViewportActive,\n                        views: views,\n                        moduleParameters: {\n                            shadowLightId: i,\n                            dummyShadowMap: this.dummyShadowMap,\n                            shadowMatrices: this.shadowMatrices\n                        }\n                    });\n                }\n            }\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters(layer) {\n                var parameters = this.shadow ? {\n                    shadowMaps: this.shadowMaps,\n                    dummyShadowMap: this.dummyShadowMap,\n                    shadowColor: this.shadowColor,\n                    shadowMatrices: this.shadowMatrices\n                } : {};\n                parameters.lightSources = {\n                    ambientLight: this.ambientLight,\n                    directionalLights: this.directionalLights.map(function(directionalLight) {\n                        return directionalLight.getProjectedLight({\n                            layer: layer\n                        });\n                    }),\n                    pointLights: this.pointLights.map(function(pointLight) {\n                        return pointLight.getProjectedLight({\n                            layer: layer\n                        });\n                    })\n                };\n                return parameters;\n            }\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {\n                var _iterator = _createForOfIteratorHelper(this.shadowPasses), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var shadowPass = _step.value;\n                        shadowPass[\"delete\"]();\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                this.shadowPasses.length = 0;\n                this.shadowMaps.length = 0;\n                if (this.dummyShadowMap) {\n                    this.dummyShadowMap[\"delete\"]();\n                    this.dummyShadowMap = null;\n                }\n                if (this.shadow && this.programManager) {\n                    this.programManager.removeDefaultModule((0, _shadowDefault.default));\n                    this.programManager = null;\n                }\n            }\n        },\n        {\n            key: \"_createLightMatrix\",\n            value: function _createLightMatrix() {\n                var lightMatrices = [];\n                var _iterator2 = _createForOfIteratorHelper(this.directionalLights), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var light = _step2.value;\n                        var viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n                            eye: new (0, _mathGl.Vector3)(light.direction).negate()\n                        });\n                        lightMatrices.push(viewMatrix);\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n                return lightMatrices;\n            }\n        },\n        {\n            key: \"_createShadowPasses\",\n            value: function _createShadowPasses(gl) {\n                for(var i = 0; i < this.directionalLights.length; i++){\n                    var shadowPass = new (0, _shadowPassDefault.default)(gl);\n                    this.shadowPasses[i] = shadowPass;\n                    this.shadowMaps[i] = shadowPass.shadowMap;\n                }\n            }\n        },\n        {\n            key: \"_applyDefaultLights\",\n            value: function _applyDefaultLights() {\n                var ambientLight = this.ambientLight, pointLights = this.pointLights, directionalLights = this.directionalLights;\n                if (!ambientLight && pointLights.length === 0 && directionalLights.length === 0) {\n                    this.ambientLight = new (0, _ambientLight.AmbientLight)(DEFAULT_AMBIENT_LIGHT_PROPS);\n                    this.directionalLights.push(new (0, _directionalLight.DirectionalLight)(DEFAULT_DIRECTIONAL_LIGHT_PROPS[0]), new (0, _directionalLight.DirectionalLight)(DEFAULT_DIRECTIONAL_LIGHT_PROPS[1]));\n                }\n            }\n        }\n    ]);\n    return LightingEffect1;\n}((0, _effectDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@luma.gl/core\":\"bW3Qv\",\"./ambient-light\":\"i0d2q\",\"./directional-light\":\"fSFHG\",\"../../lib/effect\":\"hVnbQ\",\"math.gl\":\"6aDAl\",\"../../passes/shadow-pass\":\"aGWRm\",\"../../shaderlib/shadow/shadow\":\"dXWGr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i0d2q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AmbientLight\", ()=>AmbientLight);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar DEFAULT_LIGHT_COLOR = [\n    255,\n    255,\n    255\n];\nvar DEFAULT_LIGHT_INTENSITY = 1.0;\nvar idCount = 0;\nvar AmbientLight = function AmbientLight1() {\n    var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    (0, _classCallCheckDefault.default)(this, AmbientLight1);\n    var _props$color = props.color, color = _props$color === void 0 ? DEFAULT_LIGHT_COLOR : _props$color;\n    var _props$intensity = props.intensity, intensity = _props$intensity === void 0 ? DEFAULT_LIGHT_INTENSITY : _props$intensity;\n    this.id = props.id || \"ambient-\".concat(idCount++);\n    this.color = color;\n    this.intensity = intensity;\n    this.type = \"ambient\";\n};\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fSFHG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DirectionalLight\", ()=>DirectionalLight);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _mathGl = require(\"math.gl\");\nvar DEFAULT_LIGHT_COLOR = [\n    255,\n    255,\n    255\n];\nvar DEFAULT_LIGHT_INTENSITY = 1.0;\nvar DEFAULT_LIGHT_DIRECTION = [\n    0.0,\n    0.0,\n    -1\n];\nvar idCount = 0;\nvar DirectionalLight = function() {\n    function DirectionalLight1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, DirectionalLight1);\n        var _props$color = props.color, color = _props$color === void 0 ? DEFAULT_LIGHT_COLOR : _props$color;\n        var _props$intensity = props.intensity, intensity = _props$intensity === void 0 ? DEFAULT_LIGHT_INTENSITY : _props$intensity;\n        var _props$direction = props.direction, direction = _props$direction === void 0 ? DEFAULT_LIGHT_DIRECTION : _props$direction;\n        var _props$_shadow = props._shadow, _shadow = _props$_shadow === void 0 ? false : _props$_shadow;\n        this.id = props.id || \"directional-\".concat(idCount++);\n        this.color = color;\n        this.intensity = intensity;\n        this.type = \"directional\";\n        this.direction = new (0, _mathGl.Vector3)(direction).normalize().toArray();\n        this.shadow = _shadow;\n    }\n    (0, _createClassDefault.default)(DirectionalLight1, [\n        {\n            key: \"getProjectedLight\",\n            value: function getProjectedLight() {\n                return this;\n            }\n        }\n    ]);\n    return DirectionalLight1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"math.gl\":\"6aDAl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hVnbQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Effect);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar Effect = function() {\n    function Effect1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, Effect1);\n        var _props$id = props.id, id = _props$id === void 0 ? \"effect\" : _props$id;\n        this.id = id;\n        this.props = {};\n        Object.assign(this.props, props);\n    }\n    (0, _createClassDefault.default)(Effect1, [\n        {\n            key: \"preRender\",\n            value: function preRender() {}\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters() {}\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {}\n        }\n    ]);\n    return Effect1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aGWRm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ShadowPass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _layersPass = require(\"./layers-pass\");\nvar _layersPassDefault = parcelHelpers.interopDefault(_layersPass);\nvar _core = require(\"@luma.gl/core\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar ShadowPass = function(_LayersPass) {\n    (0, _inheritsDefault.default)(ShadowPass1, _LayersPass);\n    var _super = _createSuper(ShadowPass1);\n    function ShadowPass1(gl, props) {\n        var _parameters, _attachments;\n        var _this;\n        (0, _classCallCheckDefault.default)(this, ShadowPass1);\n        _this = _super.call(this, gl, props);\n        _this.shadowMap = new (0, _core.Texture2D)(gl, {\n            width: 1,\n            height: 1,\n            parameters: (_parameters = {}, (0, _definePropertyDefault.default)(_parameters, 10241, 9729), (0, _definePropertyDefault.default)(_parameters, 10240, 9729), (0, _definePropertyDefault.default)(_parameters, 10242, 33071), (0, _definePropertyDefault.default)(_parameters, 10243, 33071), _parameters)\n        });\n        _this.depthBuffer = new (0, _core.Renderbuffer)(gl, {\n            format: 33189,\n            width: 1,\n            height: 1\n        });\n        _this.fbo = new (0, _core.Framebuffer)(gl, {\n            id: \"shadowmap\",\n            width: 1,\n            height: 1,\n            attachments: (_attachments = {}, (0, _definePropertyDefault.default)(_attachments, 36064, _this.shadowMap), (0, _definePropertyDefault.default)(_attachments, 36096, _this.depthBuffer), _attachments)\n        });\n        return _this;\n    }\n    (0, _createClassDefault.default)(ShadowPass1, [\n        {\n            key: \"render\",\n            value: function render(params) {\n                var _this2 = this;\n                var target = this.fbo;\n                (0, _core.withParameters)(this.gl, {\n                    depthRange: [\n                        0,\n                        1\n                    ],\n                    depthTest: true,\n                    blend: false,\n                    clearColor: [\n                        1,\n                        1,\n                        1,\n                        1\n                    ]\n                }, function() {\n                    var viewport = params.viewports[0];\n                    var pixelRatio = (0, _core.cssToDeviceRatio)(_this2.gl);\n                    var width = viewport.width * pixelRatio;\n                    var height = viewport.height * pixelRatio;\n                    if (width !== target.width || height !== target.height) target.resize({\n                        width: width,\n                        height: height\n                    });\n                    (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ShadowPass1.prototype), \"render\", _this2).call(_this2, _objectSpread(_objectSpread({}, params), {}, {\n                        target: target,\n                        pass: \"shadow\"\n                    }));\n                });\n            }\n        },\n        {\n            key: \"shouldDrawLayer\",\n            value: function shouldDrawLayer(layer) {\n                return layer.props.shadowEnabled !== false;\n            }\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters() {\n                return {\n                    drawToShadowMap: true\n                };\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                if (this.fbo) {\n                    this.fbo[\"delete\"]();\n                    this.fbo = null;\n                }\n                if (this.shadowMap) {\n                    this.shadowMap[\"delete\"]();\n                    this.shadowMap = null;\n                }\n                if (this.depthBuffer) {\n                    this.depthBuffer[\"delete\"]();\n                    this.depthBuffer = null;\n                }\n            }\n        }\n    ]);\n    return ShadowPass1;\n}((0, _layersPassDefault.default));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./layers-pass\":\"hn8Gi\",\"@luma.gl/core\":\"bW3Qv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hn8Gi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LayersPass);\nparcelHelpers.export(exports, \"layerIndexResolver\", ()=>layerIndexResolver);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _pass = require(\"./pass\");\nvar _passDefault = parcelHelpers.interopDefault(_pass);\nvar _core = require(\"@luma.gl/core\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LayersPass = function(_Pass) {\n    (0, _inheritsDefault.default)(LayersPass1, _Pass);\n    var _super = _createSuper(LayersPass1);\n    function LayersPass1() {\n        (0, _classCallCheckDefault.default)(this, LayersPass1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(LayersPass1, [\n        {\n            key: \"render\",\n            value: function render(props) {\n                var gl = this.gl;\n                (0, _core.setParameters)(gl, {\n                    framebuffer: props.target\n                });\n                return this._drawLayers(props);\n            }\n        },\n        {\n            key: \"_drawLayers\",\n            value: function _drawLayers(props) {\n                var viewports = props.viewports, views = props.views, onViewportActive = props.onViewportActive, _props$clearCanvas = props.clearCanvas, clearCanvas = _props$clearCanvas === void 0 ? true : _props$clearCanvas;\n                var gl = this.gl;\n                if (clearCanvas) clearGLCanvas(gl);\n                var renderStats = [];\n                var _iterator = _createForOfIteratorHelper(viewports), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var viewportOrDescriptor = _step.value;\n                        var viewport = viewportOrDescriptor.viewport || viewportOrDescriptor;\n                        var view = views && views[viewport.id];\n                        onViewportActive(viewport);\n                        var drawLayerParams = this._getDrawLayerParams(viewport, props);\n                        props.view = view;\n                        var subViewports = viewport.subViewports || [\n                            viewport\n                        ];\n                        var _iterator2 = _createForOfIteratorHelper(subViewports), _step2;\n                        try {\n                            for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                                var subViewport = _step2.value;\n                                props.viewport = subViewport;\n                                var stats = this._drawLayersInViewport(gl, props, drawLayerParams);\n                                renderStats.push(stats);\n                            }\n                        } catch (err) {\n                            _iterator2.e(err);\n                        } finally{\n                            _iterator2.f();\n                        }\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return renderStats;\n            }\n        },\n        {\n            key: \"_getDrawLayerParams\",\n            value: function _getDrawLayerParams(viewport, _ref) {\n                var layers = _ref.layers, _ref$pass = _ref.pass, pass = _ref$pass === void 0 ? \"unknown\" : _ref$pass, layerFilter = _ref.layerFilter, effects = _ref.effects, moduleParameters = _ref.moduleParameters;\n                var drawLayerParams = [];\n                var indexResolver = layerIndexResolver();\n                for(var layerIndex = 0; layerIndex < layers.length; layerIndex++){\n                    var layer = layers[layerIndex];\n                    var shouldDrawLayer = this._shouldDrawLayer(layer, viewport, pass, layerFilter);\n                    var layerRenderIndex = indexResolver(layer, shouldDrawLayer);\n                    var layerParam = {\n                        shouldDrawLayer: shouldDrawLayer,\n                        layerRenderIndex: layerRenderIndex\n                    };\n                    if (shouldDrawLayer) {\n                        layerParam.moduleParameters = this._getModuleParameters(layer, effects, pass, moduleParameters);\n                        layerParam.layerParameters = this.getLayerParameters(layer, layerIndex);\n                    }\n                    drawLayerParams[layerIndex] = layerParam;\n                }\n                return drawLayerParams;\n            }\n        },\n        {\n            key: \"_drawLayersInViewport\",\n            value: function _drawLayersInViewport(gl, _ref2, drawLayerParams) {\n                var layers = _ref2.layers, onError = _ref2.onError, viewport = _ref2.viewport, view = _ref2.view;\n                var glViewport = getGLViewport(gl, {\n                    viewport: viewport\n                });\n                if (view && view.props.clear) {\n                    var clearOpts = view.props.clear === true ? {\n                        color: true,\n                        depth: true\n                    } : view.props.clear;\n                    (0, _core.withParameters)(gl, {\n                        scissorTest: true,\n                        scissor: glViewport\n                    }, function() {\n                        return (0, _core.clear)(gl, clearOpts);\n                    });\n                }\n                var renderStatus = {\n                    totalCount: layers.length,\n                    visibleCount: 0,\n                    compositeCount: 0,\n                    pickableCount: 0\n                };\n                (0, _core.setParameters)(gl, {\n                    viewport: glViewport\n                });\n                for(var layerIndex = 0; layerIndex < layers.length; layerIndex++){\n                    var layer = layers[layerIndex];\n                    var _drawLayerParams$laye = drawLayerParams[layerIndex], shouldDrawLayer = _drawLayerParams$laye.shouldDrawLayer, layerRenderIndex = _drawLayerParams$laye.layerRenderIndex, moduleParameters = _drawLayerParams$laye.moduleParameters, layerParameters = _drawLayerParams$laye.layerParameters;\n                    if (shouldDrawLayer && layer.props.pickable) renderStatus.pickableCount++;\n                    if (layer.isComposite) renderStatus.compositeCount++;\n                    else if (shouldDrawLayer) {\n                        renderStatus.visibleCount++;\n                        moduleParameters.viewport = viewport;\n                        try {\n                            layer.drawLayer({\n                                moduleParameters: moduleParameters,\n                                uniforms: {\n                                    layerIndex: layerRenderIndex\n                                },\n                                parameters: layerParameters\n                            });\n                        } catch (err) {\n                            if (onError) onError(err, layer);\n                            else (0, _logDefault.default).error(\"error during drawing of \".concat(layer), err)();\n                        }\n                    }\n                }\n                return renderStatus;\n            }\n        },\n        {\n            key: \"shouldDrawLayer\",\n            value: function shouldDrawLayer(layer) {\n                return true;\n            }\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters(layer, effects) {\n                return null;\n            }\n        },\n        {\n            key: \"getLayerParameters\",\n            value: function getLayerParameters(layer, layerIndex) {\n                return layer.props.parameters;\n            }\n        },\n        {\n            key: \"_shouldDrawLayer\",\n            value: function _shouldDrawLayer(layer, viewport, pass, layerFilter) {\n                var shouldDrawLayer = this.shouldDrawLayer(layer) && layer.props.visible;\n                if (shouldDrawLayer && layerFilter) shouldDrawLayer = layerFilter({\n                    layer: layer,\n                    viewport: viewport,\n                    isPicking: pass.startsWith(\"picking\"),\n                    renderPass: pass\n                });\n                if (shouldDrawLayer) layer.activateViewport(viewport);\n                return shouldDrawLayer;\n            }\n        },\n        {\n            key: \"_getModuleParameters\",\n            value: function _getModuleParameters(layer, effects, pass, overrides) {\n                var moduleParameters = Object.assign(Object.create(layer.props), {\n                    autoWrapLongitude: layer.wrapLongitude,\n                    viewport: layer.context.viewport,\n                    mousePosition: layer.context.mousePosition,\n                    pickingActive: 0,\n                    devicePixelRatio: (0, _core.cssToDeviceRatio)(this.gl)\n                });\n                if (effects) {\n                    var _iterator3 = _createForOfIteratorHelper(effects), _step3;\n                    try {\n                        for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                            var effect = _step3.value;\n                            Object.assign(moduleParameters, effect.getModuleParameters(layer));\n                        }\n                    } catch (err) {\n                        _iterator3.e(err);\n                    } finally{\n                        _iterator3.f();\n                    }\n                }\n                return Object.assign(moduleParameters, this.getModuleParameters(layer, effects), overrides);\n            }\n        }\n    ]);\n    return LayersPass1;\n}((0, _passDefault.default));\nfunction layerIndexResolver() {\n    var startIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n    var layerIndices = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    var resolvers = {};\n    var resolveLayerIndex1 = function resolveLayerIndex(layer, isDrawn) {\n        var indexOverride = layer.props._offset;\n        var layerId = layer.id;\n        var parentId = layer.parent && layer.parent.id;\n        var index;\n        if (parentId && !(parentId in layerIndices)) resolveLayerIndex(layer.parent, false);\n        if (parentId in resolvers) {\n            var resolver = resolvers[parentId] = resolvers[parentId] || layerIndexResolver(layerIndices[parentId], layerIndices);\n            index = resolver(layer, isDrawn);\n            resolvers[layerId] = resolver;\n        } else if (Number.isFinite(indexOverride)) {\n            index = indexOverride + (layerIndices[parentId] || 0);\n            resolvers[layerId] = null;\n        } else index = startIndex;\n        if (isDrawn && index >= startIndex) startIndex = index + 1;\n        layerIndices[layerId] = index;\n        return index;\n    };\n    return resolveLayerIndex1;\n}\nfunction getGLViewport(gl, _ref3) {\n    var viewport = _ref3.viewport;\n    var height = gl.canvas ? gl.canvas.clientHeight || gl.canvas.height : 100;\n    var dimensions = viewport;\n    var pixelRatio = (0, _core.cssToDeviceRatio)(gl);\n    return [\n        dimensions.x * pixelRatio,\n        (height - dimensions.y - dimensions.height) * pixelRatio,\n        dimensions.width * pixelRatio,\n        dimensions.height * pixelRatio\n    ];\n}\nfunction clearGLCanvas(gl) {\n    var width = gl.drawingBufferWidth;\n    var height = gl.drawingBufferHeight;\n    (0, _core.setParameters)(gl, {\n        viewport: [\n            0,\n            0,\n            width,\n            height\n        ]\n    });\n    gl.clear(16640);\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./pass\":\"kEGgO\",\"@luma.gl/core\":\"bW3Qv\",\"../utils/log\":\"fg4UT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kEGgO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Pass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar Pass = function() {\n    function Pass1(gl) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Pass1);\n        var _props$id = props.id, id = _props$id === void 0 ? \"pass\" : _props$id;\n        this.id = id;\n        this.gl = gl;\n        this.props = {};\n        Object.assign(this.props, props);\n    }\n    (0, _createClassDefault.default)(Pass1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                Object.assign(this.props, props);\n            }\n        },\n        {\n            key: \"render\",\n            value: function render() {}\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {}\n        }\n    ]);\n    return Pass1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fm0J3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"PointLight\", ()=>PointLight);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _projectFunctions = require(\"../../shaderlib/project/project-functions\");\nvar _lib = require(\"../../lib\");\nvar DEFAULT_LIGHT_COLOR = [\n    255,\n    255,\n    255\n];\nvar DEFAULT_LIGHT_INTENSITY = 1.0;\nvar DEFAULT_ATTENUATION = [\n    0,\n    0,\n    1\n];\nvar DEFAULT_LIGHT_POSITION = [\n    0.0,\n    0.0,\n    1.0\n];\nvar idCount = 0;\nvar PointLight = function() {\n    function PointLight1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, PointLight1);\n        var _props$color = props.color, color = _props$color === void 0 ? DEFAULT_LIGHT_COLOR : _props$color;\n        var _props$intensity = props.intensity, intensity = _props$intensity === void 0 ? DEFAULT_LIGHT_INTENSITY : _props$intensity;\n        var _props$position = props.position, position = _props$position === void 0 ? DEFAULT_LIGHT_POSITION : _props$position;\n        this.id = props.id || \"point-\".concat(idCount++);\n        this.color = color;\n        this.intensity = intensity;\n        this.type = \"point\";\n        this.position = position;\n        this.attenuation = getAttenuation(props);\n        this.projectedLight = Object.assign({}, this);\n    }\n    (0, _createClassDefault.default)(PointLight1, [\n        {\n            key: \"getProjectedLight\",\n            value: function getProjectedLight(_ref) {\n                var layer = _ref.layer;\n                var projectedLight = this.projectedLight;\n                var viewport = layer.context.viewport;\n                var _layer$props = layer.props, coordinateSystem = _layer$props.coordinateSystem, coordinateOrigin = _layer$props.coordinateOrigin;\n                var position = (0, _projectFunctions.projectPosition)(this.position, {\n                    viewport: viewport,\n                    coordinateSystem: coordinateSystem,\n                    coordinateOrigin: coordinateOrigin,\n                    fromCoordinateSystem: viewport.isGeospatial ? (0, _lib.COORDINATE_SYSTEM).LNGLAT : (0, _lib.COORDINATE_SYSTEM).CARTESIAN,\n                    fromCoordinateOrigin: [\n                        0,\n                        0,\n                        0\n                    ]\n                });\n                projectedLight.color = this.color;\n                projectedLight.intensity = this.intensity;\n                projectedLight.position = position;\n                return projectedLight;\n            }\n        }\n    ]);\n    return PointLight1;\n}();\nfunction getAttenuation(props) {\n    if (\"attenuation\" in props) return props.attenuation;\n    if (\"intensity\" in props) return [\n        0,\n        0,\n        props.intensity\n    ];\n    return DEFAULT_ATTENUATION;\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../../shaderlib/project/project-functions\":\"baNIK\",\"../../lib\":\"5rCl8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"baNIK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getWorldPosition\", ()=>getWorldPosition);\nparcelHelpers.export(exports, \"projectPosition\", ()=>projectPosition);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _constants = require(\"../../lib/constants\");\nvar _viewportUniforms = require(\"./viewport-uniforms\");\nvar _webMercatorViewport = require(\"../../viewports/web-mercator-viewport\");\nvar _webMercatorViewportDefault = parcelHelpers.interopDefault(_webMercatorViewport);\nvar _vec4 = require(\"gl-matrix/vec4\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _webMercator = require(\"@math.gl/web-mercator\");\nfunction lngLatZToWorldPosition(lngLatZ, viewport) {\n    var offsetMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n    var p = viewport.projectPosition(lngLatZ);\n    if (offsetMode && viewport instanceof (0, _webMercatorViewportDefault.default)) {\n        var _lngLatZ = (0, _slicedToArrayDefault.default)(lngLatZ, 3), longitude = _lngLatZ[0], latitude = _lngLatZ[1], _lngLatZ$ = _lngLatZ[2], z = _lngLatZ$ === void 0 ? 0 : _lngLatZ$;\n        var distanceScales = viewport.getDistanceScales([\n            longitude,\n            latitude\n        ]);\n        p[2] = z * distanceScales.unitsPerMeter[2];\n    }\n    return p;\n}\nfunction normalizeParameters(opts) {\n    var normalizedParams = Object.assign({}, opts);\n    var coordinateSystem = opts.coordinateSystem;\n    var viewport = opts.viewport, coordinateOrigin = opts.coordinateOrigin, fromCoordinateSystem = opts.fromCoordinateSystem, fromCoordinateOrigin = opts.fromCoordinateOrigin;\n    if (coordinateSystem === (0, _constants.COORDINATE_SYSTEM).DEFAULT) coordinateSystem = viewport.isGeospatial ? (0, _constants.COORDINATE_SYSTEM).LNGLAT : (0, _constants.COORDINATE_SYSTEM).CARTESIAN;\n    if (fromCoordinateSystem === undefined) normalizedParams.fromCoordinateSystem = coordinateSystem;\n    if (fromCoordinateOrigin === undefined) normalizedParams.fromCoordinateOrigin = coordinateOrigin;\n    normalizedParams.coordinateSystem = coordinateSystem;\n    return normalizedParams;\n}\nfunction getWorldPosition(position, _ref) {\n    var viewport = _ref.viewport, modelMatrix = _ref.modelMatrix, coordinateSystem = _ref.coordinateSystem, coordinateOrigin = _ref.coordinateOrigin, offsetMode = _ref.offsetMode;\n    var _position = (0, _slicedToArrayDefault.default)(position, 3), x = _position[0], y = _position[1], _position$ = _position[2], z = _position$ === void 0 ? 0 : _position$;\n    if (modelMatrix) {\n        var _vec4$transformMat = _vec4.transformMat4([], [\n            x,\n            y,\n            z,\n            1.0\n        ], modelMatrix);\n        var _vec4$transformMat2 = (0, _slicedToArrayDefault.default)(_vec4$transformMat, 3);\n        x = _vec4$transformMat2[0];\n        y = _vec4$transformMat2[1];\n        z = _vec4$transformMat2[2];\n    }\n    switch(coordinateSystem){\n        case (0, _constants.COORDINATE_SYSTEM).LNGLAT:\n            return lngLatZToWorldPosition([\n                x,\n                y,\n                z\n            ], viewport, offsetMode);\n        case (0, _constants.COORDINATE_SYSTEM).LNGLAT_OFFSETS:\n            return lngLatZToWorldPosition([\n                x + coordinateOrigin[0],\n                y + coordinateOrigin[1],\n                z + (coordinateOrigin[2] || 0)\n            ], viewport, offsetMode);\n        case (0, _constants.COORDINATE_SYSTEM).METER_OFFSETS:\n            return lngLatZToWorldPosition((0, _webMercator.addMetersToLngLat)(coordinateOrigin, [\n                x,\n                y,\n                z\n            ]), viewport, offsetMode);\n        case (0, _constants.COORDINATE_SYSTEM).CARTESIAN:\n        default:\n            return viewport.isGeospatial ? [\n                x + coordinateOrigin[0],\n                y + coordinateOrigin[1],\n                z + coordinateOrigin[2]\n            ] : viewport.projectPosition([\n                x,\n                y,\n                z\n            ]);\n    }\n}\nfunction projectPosition(position, params) {\n    var _normalizeParameters = normalizeParameters(params), viewport = _normalizeParameters.viewport, coordinateSystem = _normalizeParameters.coordinateSystem, coordinateOrigin = _normalizeParameters.coordinateOrigin, modelMatrix = _normalizeParameters.modelMatrix, fromCoordinateSystem = _normalizeParameters.fromCoordinateSystem, fromCoordinateOrigin = _normalizeParameters.fromCoordinateOrigin;\n    var _getOffsetOrigin = (0, _viewportUniforms.getOffsetOrigin)(viewport, coordinateSystem, coordinateOrigin), geospatialOrigin = _getOffsetOrigin.geospatialOrigin, shaderCoordinateOrigin = _getOffsetOrigin.shaderCoordinateOrigin, offsetMode = _getOffsetOrigin.offsetMode;\n    var worldPosition = getWorldPosition(position, {\n        viewport: viewport,\n        modelMatrix: modelMatrix,\n        coordinateSystem: fromCoordinateSystem,\n        coordinateOrigin: fromCoordinateOrigin,\n        offsetMode: offsetMode\n    });\n    if (offsetMode) {\n        var positionCommonSpace = viewport.projectPosition(geospatialOrigin || shaderCoordinateOrigin);\n        _vec3.sub(worldPosition, worldPosition, positionCommonSpace);\n    }\n    return worldPosition;\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"../../lib/constants\":\"4VZPz\",\"./viewport-uniforms\":\"gQm6z\",\"../../viewports/web-mercator-viewport\":\"kRsWv\",\"gl-matrix/vec4\":\"czCsm\",\"gl-matrix/vec3\":\"cAIcX\",\"@math.gl/web-mercator\":\"jS2l3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kRsWv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>WebMercatorViewport);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _assertThisInitialized = require(\"@babel/runtime/helpers/esm/assertThisInitialized\");\nvar _assertThisInitializedDefault = parcelHelpers.interopDefault(_assertThisInitialized);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _viewport = require(\"./viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _vec2 = require(\"gl-matrix/vec2\");\nvar _mathGl = require(\"math.gl\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar WebMercatorViewport = function(_Viewport) {\n    (0, _inheritsDefault.default)(WebMercatorViewport1, _Viewport);\n    var _super = _createSuper(WebMercatorViewport1);\n    function WebMercatorViewport1() {\n        var _this;\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, WebMercatorViewport1);\n        var _opts$latitude = opts.latitude, latitude = _opts$latitude === void 0 ? 0 : _opts$latitude, _opts$longitude = opts.longitude, longitude = _opts$longitude === void 0 ? 0 : _opts$longitude, _opts$zoom = opts.zoom, zoom = _opts$zoom === void 0 ? 11 : _opts$zoom, _opts$pitch = opts.pitch, pitch = _opts$pitch === void 0 ? 0 : _opts$pitch, _opts$bearing = opts.bearing, bearing = _opts$bearing === void 0 ? 0 : _opts$bearing, _opts$nearZMultiplier = opts.nearZMultiplier, nearZMultiplier = _opts$nearZMultiplier === void 0 ? 0.1 : _opts$nearZMultiplier, _opts$farZMultiplier = opts.farZMultiplier, farZMultiplier = _opts$farZMultiplier === void 0 ? 1.01 : _opts$farZMultiplier, _opts$orthographic = opts.orthographic, orthographic = _opts$orthographic === void 0 ? false : _opts$orthographic, _opts$repeat = opts.repeat, repeat = _opts$repeat === void 0 ? false : _opts$repeat, _opts$worldOffset = opts.worldOffset, worldOffset = _opts$worldOffset === void 0 ? 0 : _opts$worldOffset;\n        var width = opts.width, height = opts.height, _opts$altitude = opts.altitude, altitude = _opts$altitude === void 0 ? 1.5 : _opts$altitude;\n        var scale = Math.pow(2, zoom);\n        width = width || 1;\n        height = height || 1;\n        altitude = Math.max(0.75, altitude);\n        var _getProjectionParamet = (0, _webMercator.getProjectionParameters)({\n            width: width,\n            height: height,\n            pitch: pitch,\n            altitude: altitude,\n            nearZMultiplier: nearZMultiplier,\n            farZMultiplier: farZMultiplier\n        }), fov = _getProjectionParamet.fov, aspect = _getProjectionParamet.aspect, focalDistance = _getProjectionParamet.focalDistance, near = _getProjectionParamet.near, far = _getProjectionParamet.far;\n        var viewMatrixUncentered = (0, _webMercator.getViewMatrix)({\n            height: height,\n            pitch: pitch,\n            bearing: bearing,\n            scale: scale,\n            altitude: altitude\n        });\n        if (worldOffset) {\n            var viewOffset = new (0, _mathGl.Matrix4)().translate([\n                512 * worldOffset,\n                0,\n                0\n            ]);\n            viewMatrixUncentered = viewOffset.multiplyLeft(viewMatrixUncentered);\n        }\n        var viewportOpts = Object.assign({}, opts, {\n            width: width,\n            height: height,\n            viewMatrix: viewMatrixUncentered,\n            longitude: longitude,\n            latitude: latitude,\n            zoom: zoom,\n            orthographic: orthographic,\n            fovyRadians: fov,\n            aspect: aspect,\n            focalDistance: orthographic ? focalDistance : 1,\n            near: near,\n            far: far\n        });\n        _this = _super.call(this, viewportOpts);\n        _this.latitude = latitude;\n        _this.longitude = longitude;\n        _this.zoom = zoom;\n        _this.pitch = pitch;\n        _this.bearing = bearing;\n        _this.altitude = altitude;\n        _this.orthographic = orthographic;\n        _this._subViewports = repeat ? [] : null;\n        Object.freeze((0, _assertThisInitializedDefault.default)(_this));\n        return _this;\n    }\n    (0, _createClassDefault.default)(WebMercatorViewport1, [\n        {\n            key: \"addMetersToLngLat\",\n            value: function addMetersToLngLat(lngLatZ, xyz) {\n                return (0, _webMercator.addMetersToLngLat)(lngLatZ, xyz);\n            }\n        },\n        {\n            key: \"getMapCenterByLngLatPosition\",\n            value: function getMapCenterByLngLatPosition(_ref) {\n                var lngLat = _ref.lngLat, pos = _ref.pos;\n                var fromLocation = (0, _webMercator.pixelsToWorld)(pos, this.pixelUnprojectionMatrix);\n                var toLocation = this.projectFlat(lngLat);\n                var translate = _vec2.add([], toLocation, _vec2.negate([], fromLocation));\n                var newCenter = _vec2.add([], this.center, translate);\n                return this.unprojectFlat(newCenter);\n            }\n        },\n        {\n            key: \"getBounds\",\n            value: function getBounds() {\n                var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var corners = (0, _webMercator.getBounds)(this, options.z || 0);\n                return [\n                    Math.min(corners[0][0], corners[1][0], corners[2][0], corners[3][0]),\n                    Math.min(corners[0][1], corners[1][1], corners[2][1], corners[3][1]),\n                    Math.max(corners[0][0], corners[1][0], corners[2][0], corners[3][0]),\n                    Math.max(corners[0][1], corners[1][1], corners[2][1], corners[3][1])\n                ];\n            }\n        },\n        {\n            key: \"fitBounds\",\n            value: function fitBounds(bounds) {\n                var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                var width = this.width, height = this.height;\n                var _fitBounds2 = (0, _webMercator.fitBounds)(Object.assign({\n                    width: width,\n                    height: height,\n                    bounds: bounds\n                }, options)), longitude = _fitBounds2.longitude, latitude = _fitBounds2.latitude, zoom = _fitBounds2.zoom;\n                return new WebMercatorViewport1({\n                    width: width,\n                    height: height,\n                    longitude: longitude,\n                    latitude: latitude,\n                    zoom: zoom\n                });\n            }\n        },\n        {\n            key: \"subViewports\",\n            get: function get() {\n                if (this._subViewports && !this._subViewports.length) {\n                    var bounds = this.getBounds();\n                    var minOffset = Math.floor((bounds[0] + 180) / 360);\n                    var maxOffset = Math.ceil((bounds[2] - 180) / 360);\n                    for(var x = minOffset; x <= maxOffset; x++){\n                        var offsetViewport = x ? new WebMercatorViewport1(_objectSpread(_objectSpread({}, this), {}, {\n                            worldOffset: x\n                        })) : this;\n                        this._subViewports.push(offsetViewport);\n                    }\n                }\n                return this._subViewports;\n            }\n        }\n    ]);\n    return WebMercatorViewport1;\n}((0, _viewportDefault.default));\nWebMercatorViewport.displayName = \"WebMercatorViewport\";\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/assertThisInitialized\":\"l7Ppm\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./viewport\":\"jETN1\",\"@math.gl/web-mercator\":\"jS2l3\",\"gl-matrix/vec2\":\"ceSVb\",\"math.gl\":\"6aDAl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jETN1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Viewport);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _mathUtils = require(\"../utils/math-utils\");\nvar _mathGl = require(\"math.gl\");\nvar _mat4 = require(\"gl-matrix/mat4\");\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _constants = require(\"../lib/constants\");\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nvar IDENTITY = (0, _mathUtils.createMat4)();\nvar ZERO_VECTOR = [\n    0,\n    0,\n    0\n];\nvar DEFAULT_ZOOM = 0;\nvar DEFAULT_DISTANCE_SCALES = {\n    unitsPerMeter: [\n        1,\n        1,\n        1\n    ],\n    metersPerUnit: [\n        1,\n        1,\n        1\n    ]\n};\nvar Viewport = function() {\n    function Viewport1() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, Viewport1);\n        var _opts$id = opts.id, id = _opts$id === void 0 ? null : _opts$id, _opts$x = opts.x, x = _opts$x === void 0 ? 0 : _opts$x, _opts$y = opts.y, y = _opts$y === void 0 ? 0 : _opts$y, _opts$width = opts.width, width = _opts$width === void 0 ? 1 : _opts$width, _opts$height = opts.height, height = _opts$height === void 0 ? 1 : _opts$height;\n        this.id = id || this.constructor.displayName || \"viewport\";\n        this.x = x;\n        this.y = y;\n        this.width = width || 1;\n        this.height = height || 1;\n        this._frustumPlanes = {};\n        this._initViewMatrix(opts);\n        this._initProjectionMatrix(opts);\n        this._initPixelMatrices();\n        this.equals = this.equals.bind(this);\n        this.project = this.project.bind(this);\n        this.unproject = this.unproject.bind(this);\n        this.projectPosition = this.projectPosition.bind(this);\n        this.unprojectPosition = this.unprojectPosition.bind(this);\n        this.projectFlat = this.projectFlat.bind(this);\n        this.unprojectFlat = this.unprojectFlat.bind(this);\n    }\n    (0, _createClassDefault.default)(Viewport1, [\n        {\n            key: \"equals\",\n            value: function equals(viewport) {\n                if (!(viewport instanceof Viewport1)) return false;\n                if (this === viewport) return true;\n                return viewport.width === this.width && viewport.height === this.height && viewport.scale === this.scale && (0, _mathGl.equals)(viewport.projectionMatrix, this.projectionMatrix) && (0, _mathGl.equals)(viewport.viewMatrix, this.viewMatrix);\n            }\n        },\n        {\n            key: \"project\",\n            value: function project(xyz) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$topLeft = _ref.topLeft, topLeft = _ref$topLeft === void 0 ? true : _ref$topLeft;\n                var worldPosition = this.projectPosition(xyz);\n                var coord = (0, _webMercator.worldToPixels)(worldPosition, this.pixelProjectionMatrix);\n                var _coord = (0, _slicedToArrayDefault.default)(coord, 2), x = _coord[0], y = _coord[1];\n                var y2 = topLeft ? y : this.height - y;\n                return xyz.length === 2 ? [\n                    x,\n                    y2\n                ] : [\n                    x,\n                    y2,\n                    coord[2]\n                ];\n            }\n        },\n        {\n            key: \"unproject\",\n            value: function unproject(xyz) {\n                var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$topLeft = _ref2.topLeft, topLeft = _ref2$topLeft === void 0 ? true : _ref2$topLeft, targetZ = _ref2.targetZ;\n                var _xyz = (0, _slicedToArrayDefault.default)(xyz, 3), x = _xyz[0], y = _xyz[1], z = _xyz[2];\n                var y2 = topLeft ? y : this.height - y;\n                var targetZWorld = targetZ && targetZ * this.distanceScales.unitsPerMeter[2];\n                var coord = (0, _webMercator.pixelsToWorld)([\n                    x,\n                    y2,\n                    z\n                ], this.pixelUnprojectionMatrix, targetZWorld);\n                var _this$unprojectPositi = this.unprojectPosition(coord), _this$unprojectPositi2 = (0, _slicedToArrayDefault.default)(_this$unprojectPositi, 3), X = _this$unprojectPositi2[0], Y = _this$unprojectPositi2[1], Z = _this$unprojectPositi2[2];\n                if (Number.isFinite(z)) return [\n                    X,\n                    Y,\n                    Z\n                ];\n                return Number.isFinite(targetZ) ? [\n                    X,\n                    Y,\n                    targetZ\n                ] : [\n                    X,\n                    Y\n                ];\n            }\n        },\n        {\n            key: \"projectPosition\",\n            value: function projectPosition(xyz) {\n                var _this$projectFlat = this.projectFlat(xyz), _this$projectFlat2 = (0, _slicedToArrayDefault.default)(_this$projectFlat, 2), X = _this$projectFlat2[0], Y = _this$projectFlat2[1];\n                var Z = (xyz[2] || 0) * this.distanceScales.unitsPerMeter[2];\n                return [\n                    X,\n                    Y,\n                    Z\n                ];\n            }\n        },\n        {\n            key: \"unprojectPosition\",\n            value: function unprojectPosition(xyz) {\n                var _this$unprojectFlat = this.unprojectFlat(xyz), _this$unprojectFlat2 = (0, _slicedToArrayDefault.default)(_this$unprojectFlat, 2), X = _this$unprojectFlat2[0], Y = _this$unprojectFlat2[1];\n                var Z = (xyz[2] || 0) * this.distanceScales.metersPerUnit[2];\n                return [\n                    X,\n                    Y,\n                    Z\n                ];\n            }\n        },\n        {\n            key: \"projectFlat\",\n            value: function projectFlat(xyz) {\n                if (this.isGeospatial) return (0, _webMercator.lngLatToWorld)(xyz);\n                return xyz;\n            }\n        },\n        {\n            key: \"unprojectFlat\",\n            value: function unprojectFlat(xyz) {\n                if (this.isGeospatial) return (0, _webMercator.worldToLngLat)(xyz);\n                return xyz;\n            }\n        },\n        {\n            key: \"getBounds\",\n            value: function getBounds() {\n                var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var unprojectOption = {\n                    targetZ: options.z || 0\n                };\n                var topLeft = this.unproject([\n                    0,\n                    0\n                ], unprojectOption);\n                var topRight = this.unproject([\n                    this.width,\n                    0\n                ], unprojectOption);\n                var bottomLeft = this.unproject([\n                    0,\n                    this.height\n                ], unprojectOption);\n                var bottomRight = this.unproject([\n                    this.width,\n                    this.height\n                ], unprojectOption);\n                return [\n                    Math.min(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),\n                    Math.min(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]),\n                    Math.max(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),\n                    Math.max(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1])\n                ];\n            }\n        },\n        {\n            key: \"getDistanceScales\",\n            value: function getDistanceScales() {\n                var coordinateOrigin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n                if (coordinateOrigin) return (0, _webMercator.getDistanceScales)({\n                    longitude: coordinateOrigin[0],\n                    latitude: coordinateOrigin[1],\n                    highPrecision: true\n                });\n                return this.distanceScales;\n            }\n        },\n        {\n            key: \"containsPixel\",\n            value: function containsPixel(_ref3) {\n                var x = _ref3.x, y = _ref3.y, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? 1 : _ref3$width, _ref3$height = _ref3.height, height = _ref3$height === void 0 ? 1 : _ref3$height;\n                return x < this.x + this.width && this.x < x + width && y < this.y + this.height && this.y < y + height;\n            }\n        },\n        {\n            key: \"getFrustumPlanes\",\n            value: function getFrustumPlanes() {\n                if (this._frustumPlanes.near) return this._frustumPlanes;\n                var _this$projectionProps = this.projectionProps, near = _this$projectionProps.near, far = _this$projectionProps.far, fovyRadians = _this$projectionProps.fovyRadians, aspect = _this$projectionProps.aspect;\n                Object.assign(this._frustumPlanes, (0, _mathUtils.getFrustumPlanes)({\n                    aspect: aspect,\n                    near: near,\n                    far: far,\n                    fovyRadians: fovyRadians,\n                    position: this.cameraPosition,\n                    direction: this.cameraDirection,\n                    up: this.cameraUp,\n                    right: this.cameraRight\n                }));\n                return this._frustumPlanes;\n            }\n        },\n        {\n            key: \"getCameraPosition\",\n            value: function getCameraPosition() {\n                return this.cameraPosition;\n            }\n        },\n        {\n            key: \"getCameraDirection\",\n            value: function getCameraDirection() {\n                return this.cameraDirection;\n            }\n        },\n        {\n            key: \"getCameraUp\",\n            value: function getCameraUp() {\n                return this.cameraUp;\n            }\n        },\n        {\n            key: \"_createProjectionMatrix\",\n            value: function _createProjectionMatrix(_ref4) {\n                var orthographic = _ref4.orthographic, fovyRadians = _ref4.fovyRadians, aspect = _ref4.aspect, focalDistance = _ref4.focalDistance, near = _ref4.near, far = _ref4.far;\n                return orthographic ? new (0, _mathGl.Matrix4)().orthographic({\n                    fovy: fovyRadians,\n                    aspect: aspect,\n                    focalDistance: focalDistance,\n                    near: near,\n                    far: far\n                }) : new (0, _mathGl.Matrix4)().perspective({\n                    fovy: fovyRadians,\n                    aspect: aspect,\n                    near: near,\n                    far: far\n                });\n            }\n        },\n        {\n            key: \"_initViewMatrix\",\n            value: function _initViewMatrix(opts) {\n                var _opts$viewMatrix = opts.viewMatrix, viewMatrix = _opts$viewMatrix === void 0 ? IDENTITY : _opts$viewMatrix, _opts$longitude = opts.longitude, longitude = _opts$longitude === void 0 ? null : _opts$longitude, _opts$latitude = opts.latitude, latitude = _opts$latitude === void 0 ? null : _opts$latitude, _opts$zoom = opts.zoom, zoom = _opts$zoom === void 0 ? null : _opts$zoom, _opts$position = opts.position, position = _opts$position === void 0 ? null : _opts$position, _opts$modelMatrix = opts.modelMatrix, modelMatrix = _opts$modelMatrix === void 0 ? null : _opts$modelMatrix, _opts$focalDistance = opts.focalDistance, focalDistance = _opts$focalDistance === void 0 ? 1 : _opts$focalDistance, _opts$distanceScales = opts.distanceScales, distanceScales = _opts$distanceScales === void 0 ? null : _opts$distanceScales;\n                this.isGeospatial = Number.isFinite(latitude) && Number.isFinite(longitude);\n                this.zoom = zoom;\n                if (!Number.isFinite(this.zoom)) this.zoom = this.isGeospatial ? (0, _webMercator.getMeterZoom)({\n                    latitude: latitude\n                }) + Math.log2(focalDistance) : DEFAULT_ZOOM;\n                var scale = Math.pow(2, this.zoom);\n                this.scale = scale;\n                this.distanceScales = this.isGeospatial ? (0, _webMercator.getDistanceScales)({\n                    latitude: latitude,\n                    longitude: longitude\n                }) : distanceScales || DEFAULT_DISTANCE_SCALES;\n                this.focalDistance = focalDistance;\n                this.distanceScales.metersPerUnit = new (0, _mathGl.Vector3)(this.distanceScales.metersPerUnit);\n                this.distanceScales.unitsPerMeter = new (0, _mathGl.Vector3)(this.distanceScales.unitsPerMeter);\n                this.position = ZERO_VECTOR;\n                this.meterOffset = ZERO_VECTOR;\n                if (position) {\n                    this.position = position;\n                    this.modelMatrix = modelMatrix;\n                    this.meterOffset = modelMatrix ? modelMatrix.transformVector(position) : position;\n                }\n                if (this.isGeospatial) {\n                    this.longitude = longitude;\n                    this.latitude = latitude;\n                    this.center = this._getCenterInWorld({\n                        longitude: longitude,\n                        latitude: latitude\n                    });\n                } else this.center = position ? this.projectPosition(position) : [\n                    0,\n                    0,\n                    0\n                ];\n                this.viewMatrixUncentered = viewMatrix;\n                this.viewMatrix = new (0, _mathGl.Matrix4)().multiplyRight(this.viewMatrixUncentered).translate(new (0, _mathGl.Vector3)(this.center || ZERO_VECTOR).negate());\n            }\n        },\n        {\n            key: \"_getCenterInWorld\",\n            value: function _getCenterInWorld(_ref5) {\n                var longitude = _ref5.longitude, latitude = _ref5.latitude;\n                var meterOffset = this.meterOffset, distanceScales = this.distanceScales;\n                var center = new (0, _mathGl.Vector3)(this.projectPosition([\n                    longitude,\n                    latitude,\n                    0\n                ]));\n                if (meterOffset) {\n                    var commonPosition = new (0, _mathGl.Vector3)(meterOffset).scale(distanceScales.unitsPerMeter);\n                    center.add(commonPosition);\n                }\n                return center;\n            }\n        },\n        {\n            key: \"_initProjectionMatrix\",\n            value: function _initProjectionMatrix(opts) {\n                var _opts$projectionMatri = opts.projectionMatrix, projectionMatrix = _opts$projectionMatri === void 0 ? null : _opts$projectionMatri, _opts$orthographic = opts.orthographic, orthographic = _opts$orthographic === void 0 ? false : _opts$orthographic, fovyRadians = opts.fovyRadians, _opts$fovy = opts.fovy, fovy = _opts$fovy === void 0 ? 75 : _opts$fovy, _opts$near = opts.near, near = _opts$near === void 0 ? 0.1 : _opts$near, _opts$far = opts.far, far = _opts$far === void 0 ? 1000 : _opts$far, _opts$focalDistance2 = opts.focalDistance, focalDistance = _opts$focalDistance2 === void 0 ? 1 : _opts$focalDistance2;\n                this.projectionProps = {\n                    orthographic: orthographic,\n                    fovyRadians: fovyRadians || fovy * DEGREES_TO_RADIANS,\n                    aspect: this.width / this.height,\n                    focalDistance: focalDistance,\n                    near: near,\n                    far: far\n                };\n                this.projectionMatrix = projectionMatrix || this._createProjectionMatrix(this.projectionProps);\n            }\n        },\n        {\n            key: \"_initPixelMatrices\",\n            value: function _initPixelMatrices() {\n                var vpm = (0, _mathUtils.createMat4)();\n                _mat4.multiply(vpm, vpm, this.projectionMatrix);\n                _mat4.multiply(vpm, vpm, this.viewMatrix);\n                this.viewProjectionMatrix = vpm;\n                this.viewMatrixInverse = _mat4.invert([], this.viewMatrix) || this.viewMatrix;\n                var _extractCameraVectors = (0, _mathUtils.extractCameraVectors)({\n                    viewMatrix: this.viewMatrix,\n                    viewMatrixInverse: this.viewMatrixInverse\n                }), eye = _extractCameraVectors.eye, direction = _extractCameraVectors.direction, up = _extractCameraVectors.up, right = _extractCameraVectors.right;\n                this.cameraPosition = eye;\n                this.cameraDirection = direction;\n                this.cameraUp = up;\n                this.cameraRight = right;\n                var viewportMatrix = (0, _mathUtils.createMat4)();\n                var pixelProjectionMatrix = (0, _mathUtils.createMat4)();\n                _mat4.scale(viewportMatrix, viewportMatrix, [\n                    this.width / 2,\n                    -this.height / 2,\n                    1\n                ]);\n                _mat4.translate(viewportMatrix, viewportMatrix, [\n                    1,\n                    -1,\n                    0\n                ]);\n                _mat4.multiply(pixelProjectionMatrix, viewportMatrix, this.viewProjectionMatrix);\n                this.pixelProjectionMatrix = pixelProjectionMatrix;\n                this.viewportMatrix = viewportMatrix;\n                this.pixelUnprojectionMatrix = _mat4.invert((0, _mathUtils.createMat4)(), this.pixelProjectionMatrix);\n                if (!this.pixelUnprojectionMatrix) (0, _logDefault.default).warn(\"Pixel project matrix not invertible\")();\n            }\n        },\n        {\n            key: \"metersPerPixel\",\n            get: function get() {\n                return this.distanceScales.metersPerUnit[2] / this.scale;\n            }\n        },\n        {\n            key: \"projectionMode\",\n            get: function get() {\n                if (this.isGeospatial) return this.zoom < 12 ? (0, _constants.PROJECTION_MODE).WEB_MERCATOR : (0, _constants.PROJECTION_MODE).WEB_MERCATOR_AUTO_OFFSET;\n                return (0, _constants.PROJECTION_MODE).IDENTITY;\n            }\n        }\n    ]);\n    return Viewport1;\n}();\nViewport.displayName = \"Viewport\";\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../utils/log\":\"fg4UT\",\"../utils/math-utils\":\"jmX3c\",\"math.gl\":\"6aDAl\",\"gl-matrix/mat4\":\"jn7Bp\",\"@math.gl/web-mercator\":\"jS2l3\",\"../lib/constants\":\"4VZPz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jmX3c\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createMat4\", ()=>createMat4);\nparcelHelpers.export(exports, \"mod\", ()=>mod);\nparcelHelpers.export(exports, \"extractCameraVectors\", ()=>extractCameraVectors);\nparcelHelpers.export(exports, \"getFrustumPlanes\", ()=>getFrustumPlanes);\nparcelHelpers.export(exports, \"fp64LowPart\", ()=>fp64LowPart);\nparcelHelpers.export(exports, \"toDoublePrecisionArray\", ()=>toDoublePrecisionArray);\nvar _typedArrayManager = require(\"./typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _mathGl = require(\"math.gl\");\nfunction createMat4() {\n    return [\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1,\n        0,\n        0,\n        0,\n        0,\n        1\n    ];\n}\nfunction mod(value, divisor) {\n    var modulus = value % divisor;\n    return modulus < 0 ? divisor + modulus : modulus;\n}\nfunction extractCameraVectors(_ref) {\n    var viewMatrix = _ref.viewMatrix, viewMatrixInverse = _ref.viewMatrixInverse;\n    return {\n        eye: [\n            viewMatrixInverse[12],\n            viewMatrixInverse[13],\n            viewMatrixInverse[14]\n        ],\n        direction: [\n            -viewMatrix[2],\n            -viewMatrix[6],\n            -viewMatrix[10]\n        ],\n        up: [\n            viewMatrix[1],\n            viewMatrix[5],\n            viewMatrix[9]\n        ],\n        right: [\n            viewMatrix[0],\n            viewMatrix[4],\n            viewMatrix[8]\n        ]\n    };\n}\nvar cameraPosition = new (0, _mathGl.Vector3)();\nvar cameraDirection = new (0, _mathGl.Vector3)();\nvar cameraUp = new (0, _mathGl.Vector3)();\nvar cameraRight = new (0, _mathGl.Vector3)();\nvar nearCenter = new (0, _mathGl.Vector3)();\nvar farCenter = new (0, _mathGl.Vector3)();\nvar a = new (0, _mathGl.Vector3)();\nfunction getFrustumPlanes(_ref2) {\n    var aspect = _ref2.aspect, near = _ref2.near, far = _ref2.far, fovyRadians = _ref2.fovyRadians, position = _ref2.position, direction = _ref2.direction, up = _ref2.up, right = _ref2.right;\n    cameraDirection.copy(direction);\n    var nearFarScale = 1 / cameraDirection.len();\n    cameraDirection.normalize();\n    cameraPosition.copy(position);\n    cameraUp.copy(up);\n    var widthScale = 1 / cameraUp.len();\n    cameraUp.normalize();\n    cameraRight.copy(right).normalize();\n    var nearHeight = 2 * Math.tan(fovyRadians / 2) * near * widthScale;\n    var nearWidth = nearHeight * aspect;\n    nearCenter.copy(cameraDirection).scale(near * nearFarScale).add(cameraPosition);\n    farCenter.copy(cameraDirection).scale(far * nearFarScale).add(cameraPosition);\n    var normal = cameraDirection.clone().negate();\n    var distance = normal.dot(nearCenter);\n    var planes = {\n        near: {\n            distance: distance,\n            normal: normal\n        },\n        far: {\n            distance: cameraDirection.dot(farCenter),\n            normal: cameraDirection.clone()\n        }\n    };\n    a.copy(cameraRight).scale(nearWidth * 0.5).add(nearCenter).subtract(cameraPosition).normalize();\n    normal = new (0, _mathGl.Vector3)(a).cross(cameraUp);\n    distance = cameraPosition.dot(normal);\n    planes.right = {\n        normal: normal,\n        distance: distance\n    };\n    a.copy(cameraRight).scale(-nearWidth * 0.5).add(nearCenter).subtract(cameraPosition).normalize();\n    normal = new (0, _mathGl.Vector3)(cameraUp).cross(a);\n    distance = cameraPosition.dot(normal);\n    planes.left = {\n        normal: normal,\n        distance: distance\n    };\n    a.copy(cameraUp).scale(nearHeight * 0.5).add(nearCenter).subtract(cameraPosition).normalize();\n    normal = new (0, _mathGl.Vector3)(cameraRight).cross(a);\n    distance = cameraPosition.dot(normal);\n    planes.top = {\n        normal: normal,\n        distance: distance\n    };\n    a.copy(cameraUp).scale(-nearHeight * 0.5).add(nearCenter).subtract(cameraPosition).normalize();\n    normal = new (0, _mathGl.Vector3)(a).cross(cameraRight);\n    distance = cameraPosition.dot(normal);\n    planes.bottom = {\n        normal: normal,\n        distance: distance\n    };\n    return planes;\n}\nfunction fp64LowPart(x) {\n    return x - Math.fround(x);\n}\nvar scratchArray;\nfunction toDoublePrecisionArray(typedArray, _ref3) {\n    var _ref3$size = _ref3.size, size = _ref3$size === void 0 ? 1 : _ref3$size, _ref3$startIndex = _ref3.startIndex, startIndex = _ref3$startIndex === void 0 ? 0 : _ref3$startIndex, endIndex = _ref3.endIndex;\n    if (!Number.isFinite(endIndex)) endIndex = typedArray.length;\n    var count = (endIndex - startIndex) / size;\n    scratchArray = (0, _typedArrayManagerDefault.default).allocate(scratchArray, count, {\n        type: Float32Array,\n        size: size * 2\n    });\n    var sourceIndex = startIndex;\n    var targetIndex = 0;\n    while(sourceIndex < endIndex){\n        for(var j = 0; j < size; j++){\n            var value = typedArray[sourceIndex++];\n            scratchArray[targetIndex + j] = value;\n            scratchArray[targetIndex + j + size] = fp64LowPart(value);\n        }\n        targetIndex += size * 2;\n    }\n    return scratchArray.subarray(0, count * size * 2);\n}\n\n},{\"./typed-array-manager\":\"91rvg\",\"math.gl\":\"6aDAl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"91rvg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TypedArrayManager\", ()=>TypedArrayManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar TypedArrayManager = function() {\n    function TypedArrayManager1(props) {\n        (0, _classCallCheckDefault.default)(this, TypedArrayManager1);\n        this._pool = [];\n        this.props = {\n            overAlloc: 2,\n            poolSize: 100\n        };\n        this.setProps(props);\n    }\n    (0, _createClassDefault.default)(TypedArrayManager1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                Object.assign(this.props, props);\n            }\n        },\n        {\n            key: \"allocate\",\n            value: function allocate(typedArray, count, _ref) {\n                var _ref$size = _ref.size, size = _ref$size === void 0 ? 1 : _ref$size, type = _ref.type, _ref$padding = _ref.padding, padding = _ref$padding === void 0 ? 0 : _ref$padding, _ref$copy = _ref.copy, copy = _ref$copy === void 0 ? false : _ref$copy, _ref$initialize = _ref.initialize, initialize = _ref$initialize === void 0 ? false : _ref$initialize, maxCount = _ref.maxCount;\n                var Type = type || typedArray && typedArray.constructor || Float32Array;\n                var newSize = count * size + padding;\n                if (ArrayBuffer.isView(typedArray)) {\n                    if (newSize <= typedArray.length) return typedArray;\n                    if (newSize * typedArray.BYTES_PER_ELEMENT <= typedArray.buffer.byteLength) return new Type(typedArray.buffer, 0, newSize);\n                }\n                var maxSize;\n                if (maxCount) maxSize = maxCount * size + padding;\n                var newArray = this._allocate(Type, newSize, initialize, maxSize);\n                if (typedArray && copy) newArray.set(typedArray);\n                else if (!initialize) newArray.fill(0, 0, 4);\n                this._release(typedArray);\n                return newArray;\n            }\n        },\n        {\n            key: \"release\",\n            value: function release(typedArray) {\n                this._release(typedArray);\n            }\n        },\n        {\n            key: \"_allocate\",\n            value: function _allocate(Type, size, initialize, maxSize) {\n                var sizeToAllocate = Math.max(Math.ceil(size * this.props.overAlloc), 1);\n                if (sizeToAllocate > maxSize) sizeToAllocate = maxSize;\n                var pool = this._pool;\n                var byteLength = Type.BYTES_PER_ELEMENT * sizeToAllocate;\n                var i = pool.findIndex(function(b) {\n                    return b.byteLength >= byteLength;\n                });\n                if (i >= 0) {\n                    var array = new Type(pool.splice(i, 1)[0], 0, sizeToAllocate);\n                    if (initialize) array.fill(0);\n                    return array;\n                }\n                return new Type(sizeToAllocate);\n            }\n        },\n        {\n            key: \"_release\",\n            value: function _release(typedArray) {\n                if (!ArrayBuffer.isView(typedArray)) return;\n                var pool = this._pool;\n                var buffer = typedArray.buffer;\n                var byteLength = buffer.byteLength;\n                var i = pool.findIndex(function(b) {\n                    return b.byteLength >= byteLength;\n                });\n                if (i < 0) pool.push(buffer);\n                else if (i > 0 || pool.length < this.props.poolSize) pool.splice(i, 0, buffer);\n                if (pool.length > this.props.poolSize) pool.shift();\n            }\n        }\n    ]);\n    return TypedArrayManager1;\n}();\nexports.default = new TypedArrayManager();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5rCl8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"COORDINATE_SYSTEM\", ()=>(0, _constants.COORDINATE_SYSTEM));\nparcelHelpers.export(exports, \"Deck\", ()=>(0, _deckDefault.default));\nparcelHelpers.export(exports, \"DeckRenderer\", ()=>(0, _deckRendererDefault.default));\nparcelHelpers.export(exports, \"Effect\", ()=>(0, _effectDefault.default));\nparcelHelpers.export(exports, \"Layer\", ()=>(0, _layerDefault.default));\nparcelHelpers.export(exports, \"CompositeLayer\", ()=>(0, _compositeLayerDefault.default));\nparcelHelpers.export(exports, \"LayerExtension\", ()=>(0, _layerExtensionDefault.default));\nparcelHelpers.export(exports, \"AttributeManager\", ()=>(0, _attributeManagerDefault.default));\nparcelHelpers.export(exports, \"LayerManager\", ()=>(0, _layerManagerDefault.default));\nvar _constants = require(\"./constants\");\nvar _deck = require(\"./deck\");\nvar _deckDefault = parcelHelpers.interopDefault(_deck);\nvar _deckRenderer = require(\"./deck-renderer\");\nvar _deckRendererDefault = parcelHelpers.interopDefault(_deckRenderer);\nvar _effect = require(\"./effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _layer = require(\"./layer\");\nvar _layerDefault = parcelHelpers.interopDefault(_layer);\nvar _compositeLayer = require(\"./composite-layer\");\nvar _compositeLayerDefault = parcelHelpers.interopDefault(_compositeLayer);\nvar _layerExtension = require(\"./layer-extension\");\nvar _layerExtensionDefault = parcelHelpers.interopDefault(_layerExtension);\nvar _attributeManager = require(\"./attribute/attribute-manager\");\nvar _attributeManagerDefault = parcelHelpers.interopDefault(_attributeManager);\nvar _layerManager = require(\"./layer-manager\");\nvar _layerManagerDefault = parcelHelpers.interopDefault(_layerManager);\n\n},{\"./constants\":\"4VZPz\",\"./deck\":\"9rIJR\",\"./deck-renderer\":\"uwNC4\",\"./effect\":\"hVnbQ\",\"./layer\":\"jJOdt\",\"./composite-layer\":\"9c4Ap\",\"./layer-extension\":\"jly9m\",\"./attribute/attribute-manager\":\"1b6eu\",\"./layer-manager\":\"9sEq0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9rIJR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Deck);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _layerManager = require(\"./layer-manager\");\nvar _layerManagerDefault = parcelHelpers.interopDefault(_layerManager);\nvar _viewManager = require(\"./view-manager\");\nvar _viewManagerDefault = parcelHelpers.interopDefault(_viewManager);\nvar _mapView = require(\"../views/map-view\");\nvar _mapViewDefault = parcelHelpers.interopDefault(_mapView);\nvar _effectManager = require(\"./effect-manager\");\nvar _effectManagerDefault = parcelHelpers.interopDefault(_effectManager);\nvar _effect = require(\"./effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _deckRenderer = require(\"./deck-renderer\");\nvar _deckRendererDefault = parcelHelpers.interopDefault(_deckRenderer);\nvar _deckPicker = require(\"./deck-picker\");\nvar _deckPickerDefault = parcelHelpers.interopDefault(_deckPicker);\nvar _tooltip = require(\"./tooltip\");\nvar _tooltipDefault = parcelHelpers.interopDefault(_tooltip);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar _typedArrayManager = require(\"../utils/typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _init = require(\"./init\");\nvar _initDefault = parcelHelpers.interopDefault(_init);\nvar _env = require(\"probe.gl/env\");\nvar _core = require(\"@luma.gl/core\");\nvar _probeGl = require(\"probe.gl\");\nvar _mjolnirJs = require(\"mjolnir.js\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _constants = require(\"./constants\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction noop() {}\nvar getCursor = function getCursor(_ref) {\n    var isDragging = _ref.isDragging;\n    return isDragging ? \"grabbing\" : \"grab\";\n};\nfunction getPropTypes(PropTypes) {\n    return {\n        id: PropTypes.string,\n        width: PropTypes.oneOfType([\n            PropTypes.number,\n            PropTypes.string\n        ]),\n        height: PropTypes.oneOfType([\n            PropTypes.number,\n            PropTypes.string\n        ]),\n        layers: PropTypes.oneOfType([\n            PropTypes.object,\n            PropTypes.array\n        ]),\n        layerFilter: PropTypes.func,\n        views: PropTypes.oneOfType([\n            PropTypes.object,\n            PropTypes.array\n        ]),\n        viewState: PropTypes.object,\n        effects: PropTypes.arrayOf(PropTypes.instanceOf((0, _effectDefault.default))),\n        controller: PropTypes.oneOfType([\n            PropTypes.func,\n            PropTypes.bool,\n            PropTypes.object\n        ]),\n        gl: PropTypes.object,\n        glOptions: PropTypes.object,\n        parameters: PropTypes.object,\n        pickingRadius: PropTypes.number,\n        useDevicePixels: PropTypes.oneOfType([\n            PropTypes.bool,\n            PropTypes.number\n        ]),\n        touchAction: PropTypes.string,\n        onWebGLInitialized: PropTypes.func,\n        onResize: PropTypes.func,\n        onViewStateChange: PropTypes.func,\n        onBeforeRender: PropTypes.func,\n        onAfterRender: PropTypes.func,\n        onLoad: PropTypes.func,\n        onError: PropTypes.func,\n        debug: PropTypes.bool,\n        drawPickingColors: PropTypes.bool,\n        _framebuffer: PropTypes.object,\n        _animate: PropTypes.bool,\n        _pickable: PropTypes.bool,\n        _typedArrayManagerProps: PropTypes.object\n    };\n}\nvar defaultProps = {\n    id: \"deckgl-overlay\",\n    width: \"100%\",\n    height: \"100%\",\n    pickingRadius: 0,\n    layerFilter: null,\n    glOptions: {},\n    gl: null,\n    layers: [],\n    effects: [],\n    views: null,\n    controller: null,\n    useDevicePixels: true,\n    touchAction: \"none\",\n    _framebuffer: null,\n    _animate: false,\n    _pickable: true,\n    _typedArrayManagerProps: {},\n    onWebGLInitialized: noop,\n    onResize: noop,\n    onViewStateChange: noop,\n    onBeforeRender: noop,\n    onAfterRender: noop,\n    onLoad: noop,\n    onError: null,\n    _onMetrics: null,\n    getCursor: getCursor,\n    debug: false,\n    drawPickingColors: false\n};\nvar Deck = function() {\n    function Deck1(props) {\n        (0, _classCallCheckDefault.default)(this, Deck1);\n        props = Object.assign({}, defaultProps, props);\n        this.props = {};\n        this.width = 0;\n        this.height = 0;\n        this.viewManager = null;\n        this.layerManager = null;\n        this.effectManager = null;\n        this.deckRenderer = null;\n        this.deckPicker = null;\n        this._needsRedraw = true;\n        this._pickRequest = {};\n        this._lastPointerDownInfo = null;\n        this.viewState = null;\n        this.interactiveState = {\n            isDragging: false\n        };\n        this._onEvent = this._onEvent.bind(this);\n        this._onPointerDown = this._onPointerDown.bind(this);\n        this._onPointerMove = this._onPointerMove.bind(this);\n        this._pickAndCallback = this._pickAndCallback.bind(this);\n        this._onRendererInitialized = this._onRendererInitialized.bind(this);\n        this._onRenderFrame = this._onRenderFrame.bind(this);\n        this._onViewStateChange = this._onViewStateChange.bind(this);\n        this._onInteractiveStateChange = this._onInteractiveStateChange.bind(this);\n        if (props.viewState && props.initialViewState) (0, _logDefault.default).warn(\"View state tracking is disabled. Use either `initialViewState` for auto update or `viewState` for manual update.\")();\n        if ((0, _env.getBrowser)() === \"IE\") (0, _logDefault.default).warn(\"IE 11 support will be deprecated in v8.0\")();\n        if (!props.gl) {\n            if (typeof document !== \"undefined\") this.canvas = this._createCanvas(props);\n        }\n        this.animationLoop = this._createAnimationLoop(props);\n        this.stats = new (0, _probeGl.Stats)({\n            id: \"deck.gl\"\n        });\n        this.metrics = {\n            fps: 0,\n            setPropsTime: 0,\n            updateAttributesTime: 0,\n            framesRedrawn: 0,\n            pickTime: 0,\n            pickCount: 0,\n            gpuTime: 0,\n            gpuTimePerFrame: 0,\n            cpuTime: 0,\n            cpuTimePerFrame: 0,\n            bufferMemory: 0,\n            textureMemory: 0,\n            renderbufferMemory: 0,\n            gpuMemory: 0\n        };\n        this._metricsCounter = 0;\n        this.setProps(props);\n        if (props._typedArrayManagerProps) (0, _typedArrayManagerDefault.default).setProps(props._typedArrayManagerProps);\n        this.animationLoop.start();\n    }\n    (0, _createClassDefault.default)(Deck1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this.animationLoop.stop();\n                this.animationLoop = null;\n                this._lastPointerDownInfo = null;\n                if (this.layerManager) {\n                    this.layerManager.finalize();\n                    this.layerManager = null;\n                    this.viewManager.finalize();\n                    this.viewManager = null;\n                    this.effectManager.finalize();\n                    this.effectManager = null;\n                    this.deckRenderer.finalize();\n                    this.deckRenderer = null;\n                    this.deckPicker.finalize();\n                    this.deckPicker = null;\n                    this.eventManager.destroy();\n                    this.eventManager = null;\n                    this.tooltip.remove();\n                    this.tooltip = null;\n                }\n                if (!this.props.canvas && !this.props.gl && this.canvas) {\n                    this.canvas.parentElement.removeChild(this.canvas);\n                    this.canvas = null;\n                }\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                this.stats.get(\"setProps Time\").timeStart();\n                if (\"onLayerHover\" in props) (0, _logDefault.default).removed(\"onLayerHover\", \"onHover\")();\n                if (\"onLayerClick\" in props) (0, _logDefault.default).removed(\"onLayerClick\", \"onClick\")();\n                if (props.initialViewState && !(0, _deepEqual.deepEqual)(this.props.initialViewState, props.initialViewState)) this.viewState = props.initialViewState;\n                Object.assign(this.props, props);\n                this._setCanvasSize(this.props);\n                var resolvedProps = Object.create(this.props);\n                Object.assign(resolvedProps, {\n                    views: this._getViews(),\n                    width: this.width,\n                    height: this.height,\n                    viewState: this._getViewState()\n                });\n                this.animationLoop.setProps(resolvedProps);\n                if (this.layerManager) {\n                    this.viewManager.setProps(resolvedProps);\n                    this.layerManager.activateViewport(this.getViewports()[0]);\n                    this.layerManager.setProps(resolvedProps);\n                    this.effectManager.setProps(resolvedProps);\n                    this.deckRenderer.setProps(resolvedProps);\n                    this.deckPicker.setProps(resolvedProps);\n                }\n                this.stats.get(\"setProps Time\").timeEnd();\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                if (this.props._animate) return \"Deck._animate\";\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                var viewManagerNeedsRedraw = this.viewManager.needsRedraw(opts);\n                var layerManagerNeedsRedraw = this.layerManager.needsRedraw(opts);\n                var effectManagerNeedsRedraw = this.effectManager.needsRedraw(opts);\n                var deckRendererNeedsRedraw = this.deckRenderer.needsRedraw(opts);\n                redraw = redraw || viewManagerNeedsRedraw || layerManagerNeedsRedraw || effectManagerNeedsRedraw || deckRendererNeedsRedraw;\n                return redraw;\n            }\n        },\n        {\n            key: \"redraw\",\n            value: function redraw(force) {\n                if (!this.layerManager) return;\n                var redrawReason = force || this.needsRedraw({\n                    clearRedrawFlags: true\n                });\n                if (!redrawReason) return;\n                this.stats.get(\"Redraw Count\").incrementCount();\n                if (this.props._customRender) this.props._customRender(redrawReason);\n                else this._drawLayers(redrawReason);\n            }\n        },\n        {\n            key: \"getViews\",\n            value: function getViews() {\n                return this.viewManager.views;\n            }\n        },\n        {\n            key: \"getViewports\",\n            value: function getViewports(rect) {\n                return this.viewManager.getViewports(rect);\n            }\n        },\n        {\n            key: \"pickObject\",\n            value: function pickObject(opts) {\n                var infos = this._pick(\"pickObject\", \"pickObject Time\", opts).result;\n                return infos.length ? infos[0] : null;\n            }\n        },\n        {\n            key: \"pickMultipleObjects\",\n            value: function pickMultipleObjects(opts) {\n                opts.depth = opts.depth || 10;\n                return this._pick(\"pickObject\", \"pickMultipleObjects Time\", opts).result;\n            }\n        },\n        {\n            key: \"pickObjects\",\n            value: function pickObjects(opts) {\n                return this._pick(\"pickObjects\", \"pickObjects Time\", opts);\n            }\n        },\n        {\n            key: \"_addResources\",\n            value: function _addResources(resources) {\n                var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n                for(var id in resources)this.layerManager.resourceManager.add({\n                    resourceId: id,\n                    data: resources[id],\n                    forceUpdate: forceUpdate\n                });\n            }\n        },\n        {\n            key: \"_removeResources\",\n            value: function _removeResources(resourceIds) {\n                var _iterator = _createForOfIteratorHelper(resourceIds), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var id = _step.value;\n                        this.layerManager.resourceManager.remove(id);\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n            }\n        },\n        {\n            key: \"_pick\",\n            value: function _pick(method, statKey, opts) {\n                var stats = this.stats;\n                stats.get(\"Pick Count\").incrementCount();\n                stats.get(statKey).timeStart();\n                var infos = this.deckPicker[method](Object.assign({\n                    layers: this.layerManager.getLayers(opts),\n                    views: this.viewManager.getViews(),\n                    viewports: this.getViewports(opts),\n                    onViewportActive: this.layerManager.activateViewport\n                }, opts));\n                stats.get(statKey).timeEnd();\n                return infos;\n            }\n        },\n        {\n            key: \"_createCanvas\",\n            value: function _createCanvas(props) {\n                var canvas = props.canvas;\n                if (typeof canvas === \"string\") {\n                    canvas = document.getElementById(canvas);\n                    (0, _assertDefault.default)(canvas);\n                }\n                if (!canvas) {\n                    canvas = document.createElement(\"canvas\");\n                    var parent = props.parent || document.body;\n                    parent.appendChild(canvas);\n                }\n                var id = props.id, style = props.style;\n                canvas.id = id;\n                Object.assign(canvas.style, style);\n                return canvas;\n            }\n        },\n        {\n            key: \"_setCanvasSize\",\n            value: function _setCanvasSize(props) {\n                if (!this.canvas) return;\n                var width = props.width, height = props.height;\n                if (width || width === 0) {\n                    width = Number.isFinite(width) ? \"\".concat(width, \"px\") : width;\n                    this.canvas.style.width = width;\n                }\n                if (height || height === 0) {\n                    height = Number.isFinite(height) ? \"\".concat(height, \"px\") : height;\n                    this.canvas.style.position = \"absolute\";\n                    this.canvas.style.height = height;\n                }\n            }\n        },\n        {\n            key: \"_updateCanvasSize\",\n            value: function _updateCanvasSize() {\n                if (this._checkForCanvasSizeChange()) {\n                    var width = this.width, height = this.height;\n                    this.viewManager.setProps({\n                        width: width,\n                        height: height\n                    });\n                    this.props.onResize({\n                        width: this.width,\n                        height: this.height\n                    });\n                }\n            }\n        },\n        {\n            key: \"_checkForCanvasSizeChange\",\n            value: function _checkForCanvasSizeChange() {\n                var canvas = this.canvas;\n                if (!canvas) return false;\n                var newWidth = canvas.clientWidth || canvas.width;\n                var newHeight = canvas.clientHeight || canvas.height;\n                if (newWidth !== this.width || newHeight !== this.height) {\n                    this.width = newWidth;\n                    this.height = newHeight;\n                    return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"_createAnimationLoop\",\n            value: function _createAnimationLoop(props) {\n                var _this = this;\n                var width = props.width, height = props.height, gl = props.gl, glOptions = props.glOptions, debug = props.debug, useDevicePixels = props.useDevicePixels, autoResizeDrawingBuffer = props.autoResizeDrawingBuffer;\n                return new (0, _core.AnimationLoop)({\n                    width: width,\n                    height: height,\n                    useDevicePixels: useDevicePixels,\n                    autoResizeDrawingBuffer: autoResizeDrawingBuffer,\n                    autoResizeViewport: false,\n                    gl: gl,\n                    onCreateContext: function onCreateContext(opts) {\n                        return (0, _core.createGLContext)(Object.assign({}, glOptions, opts, {\n                            canvas: _this.canvas,\n                            debug: debug\n                        }));\n                    },\n                    onInitialize: this._onRendererInitialized,\n                    onRender: this._onRenderFrame,\n                    onBeforeRender: props.onBeforeRender,\n                    onAfterRender: props.onAfterRender\n                });\n            }\n        },\n        {\n            key: \"_getViewState\",\n            value: function _getViewState() {\n                return this.props.viewState || this.viewState;\n            }\n        },\n        {\n            key: \"_getViews\",\n            value: function _getViews() {\n                var views = this.props.views || [\n                    new (0, _mapViewDefault.default)({\n                        id: \"default-view\"\n                    })\n                ];\n                views = Array.isArray(views) ? views : [\n                    views\n                ];\n                if (views.length && this.props.controller) views[0].props.controller = this.props.controller;\n                return views;\n            }\n        },\n        {\n            key: \"_onPointerMove\",\n            value: function _onPointerMove(event) {\n                var _pickRequest = this._pickRequest;\n                if (event.type === \"pointerleave\") {\n                    _pickRequest.x = -1;\n                    _pickRequest.y = -1;\n                    _pickRequest.radius = 0;\n                } else if (event.leftButton || event.rightButton) return;\n                else {\n                    var pos = event.offsetCenter;\n                    if (!pos) return;\n                    _pickRequest.x = pos.x;\n                    _pickRequest.y = pos.y;\n                    _pickRequest.radius = this.props.pickingRadius;\n                }\n                if (this.layerManager) this.layerManager.context.mousePosition = {\n                    x: _pickRequest.x,\n                    y: _pickRequest.y\n                };\n                _pickRequest.event = event;\n                _pickRequest.mode = \"hover\";\n            }\n        },\n        {\n            key: \"_pickAndCallback\",\n            value: function _pickAndCallback() {\n                var _pickRequest = this._pickRequest;\n                if (_pickRequest.event) {\n                    var _this$_pick = this._pick(\"pickObject\", \"pickObject Time\", _pickRequest), result = _this$_pick.result, emptyInfo = _this$_pick.emptyInfo;\n                    var pickedInfo = emptyInfo;\n                    var handled = false;\n                    var _iterator2 = _createForOfIteratorHelper(result), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var info = _step2.value;\n                            pickedInfo = info;\n                            handled = info.layer.onHover(info, _pickRequest.event);\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                    if (!handled && this.props.onHover) this.props.onHover(pickedInfo, _pickRequest.event);\n                    if (this.props.getTooltip) {\n                        var displayInfo = this.props.getTooltip(pickedInfo);\n                        this.tooltip.setTooltip(displayInfo, pickedInfo.x, pickedInfo.y);\n                    }\n                    _pickRequest.event = null;\n                }\n            }\n        },\n        {\n            key: \"_updateCursor\",\n            value: function _updateCursor() {\n                var container = this.props.parent || this.canvas;\n                if (container) container.style.cursor = this.props.getCursor(this.interactiveState);\n            }\n        },\n        {\n            key: \"_setGLContext\",\n            value: function _setGLContext(gl) {\n                if (this.layerManager) return;\n                if (!this.canvas) {\n                    this.canvas = gl.canvas;\n                    (0, _core.instrumentGLContext)(gl, {\n                        enable: true,\n                        copyState: true\n                    });\n                }\n                this.tooltip = new (0, _tooltipDefault.default)(this.canvas);\n                (0, _core.setParameters)(gl, {\n                    blend: true,\n                    blendFunc: [\n                        770,\n                        771,\n                        1,\n                        771\n                    ],\n                    polygonOffsetFill: true,\n                    depthTest: true,\n                    depthFunc: 515\n                });\n                this.props.onWebGLInitialized(gl);\n                var timeline = new (0, _core.Timeline)();\n                timeline.play();\n                this.animationLoop.attachTimeline(timeline);\n                this.eventManager = new (0, _mjolnirJs.EventManager)(this.props.parent || gl.canvas, {\n                    touchAction: this.props.touchAction,\n                    events: {\n                        pointerdown: this._onPointerDown,\n                        pointermove: this._onPointerMove,\n                        pointerleave: this._onPointerMove\n                    }\n                });\n                for(var eventType in 0, _constants.EVENTS)this.eventManager.on(eventType, this._onEvent);\n                this.viewManager = new (0, _viewManagerDefault.default)({\n                    timeline: timeline,\n                    eventManager: this.eventManager,\n                    onViewStateChange: this._onViewStateChange,\n                    onInteractiveStateChange: this._onInteractiveStateChange,\n                    views: this._getViews(),\n                    viewState: this._getViewState(),\n                    width: this.width,\n                    height: this.height\n                });\n                var viewport = this.viewManager.getViewports()[0];\n                this.layerManager = new (0, _layerManagerDefault.default)(gl, {\n                    deck: this,\n                    stats: this.stats,\n                    viewport: viewport,\n                    timeline: timeline\n                });\n                this.effectManager = new (0, _effectManagerDefault.default)();\n                this.deckRenderer = new (0, _deckRendererDefault.default)(gl);\n                this.deckPicker = new (0, _deckPickerDefault.default)(gl);\n                this.setProps(this.props);\n                this._updateCanvasSize();\n                this.props.onLoad();\n            }\n        },\n        {\n            key: \"_drawLayers\",\n            value: function _drawLayers(redrawReason, renderOptions) {\n                var gl = this.layerManager.context.gl;\n                (0, _core.setParameters)(gl, this.props.parameters);\n                this.props.onBeforeRender({\n                    gl: gl\n                });\n                this.deckRenderer.renderLayers(Object.assign({\n                    target: this.props._framebuffer,\n                    layers: this.layerManager.getLayers(),\n                    viewports: this.viewManager.getViewports(),\n                    onViewportActive: this.layerManager.activateViewport,\n                    views: this.viewManager.getViews(),\n                    pass: \"screen\",\n                    redrawReason: redrawReason,\n                    effects: this.effectManager.getEffects()\n                }, renderOptions));\n                this.props.onAfterRender({\n                    gl: gl\n                });\n            }\n        },\n        {\n            key: \"_onRendererInitialized\",\n            value: function _onRendererInitialized(_ref2) {\n                var gl = _ref2.gl;\n                this._setGLContext(gl);\n            }\n        },\n        {\n            key: \"_onRenderFrame\",\n            value: function _onRenderFrame(animationProps) {\n                this._getFrameStats();\n                if ((this._metricsCounter++) % 60 === 0) {\n                    this._getMetrics();\n                    this.stats.reset();\n                    (0, _logDefault.default).table(4, this.metrics)();\n                    if (this.props._onMetrics) this.props._onMetrics(this.metrics);\n                }\n                this._updateCanvasSize();\n                this._updateCursor();\n                this.layerManager.updateLayers();\n                this._pickAndCallback();\n                this.redraw(false);\n                if (this.viewManager) this.viewManager.updateViewStates();\n            }\n        },\n        {\n            key: \"_onViewStateChange\",\n            value: function _onViewStateChange(params) {\n                var viewState = this.props.onViewStateChange(params) || params.viewState;\n                if (this.viewState) {\n                    this.viewState = _objectSpread(_objectSpread({}, this.viewState), {}, (0, _definePropertyDefault.default)({}, params.viewId, viewState));\n                    if (!this.props.viewState) this.viewManager.setProps({\n                        viewState: this.viewState\n                    });\n                }\n            }\n        },\n        {\n            key: \"_onInteractiveStateChange\",\n            value: function _onInteractiveStateChange(_ref3) {\n                var _ref3$isDragging = _ref3.isDragging, isDragging = _ref3$isDragging === void 0 ? false : _ref3$isDragging;\n                if (isDragging !== this.interactiveState.isDragging) this.interactiveState.isDragging = isDragging;\n            }\n        },\n        {\n            key: \"_onEvent\",\n            value: function _onEvent(event) {\n                var eventOptions = (0, _constants.EVENTS)[event.type];\n                var pos = event.offsetCenter;\n                if (!eventOptions || !pos) return;\n                var layers = this.layerManager.getLayers();\n                var info = this.deckPicker.getLastPickedObject({\n                    x: pos.x,\n                    y: pos.y,\n                    layers: layers,\n                    viewports: this.getViewports(pos)\n                }, this._lastPointerDownInfo);\n                var layer = info.layer;\n                var layerHandler = layer && (layer[eventOptions.handler] || layer.props[eventOptions.handler]);\n                var rootHandler = this.props[eventOptions.handler];\n                var handled = false;\n                if (layerHandler) handled = layerHandler.call(layer, info, event);\n                if (!handled && rootHandler) rootHandler(info, event);\n            }\n        },\n        {\n            key: \"_onPointerDown\",\n            value: function _onPointerDown(event) {\n                var pos = event.offsetCenter;\n                this._lastPointerDownInfo = this.pickObject({\n                    x: pos.x,\n                    y: pos.y,\n                    radius: this.props.pickingRadius\n                });\n            }\n        },\n        {\n            key: \"_getFrameStats\",\n            value: function _getFrameStats() {\n                var stats = this.stats;\n                stats.get(\"frameRate\").timeEnd();\n                stats.get(\"frameRate\").timeStart();\n                var animationLoopStats = this.animationLoop.stats;\n                stats.get(\"GPU Time\").addTime(animationLoopStats.get(\"GPU Time\").lastTiming);\n                stats.get(\"CPU Time\").addTime(animationLoopStats.get(\"CPU Time\").lastTiming);\n            }\n        },\n        {\n            key: \"_getMetrics\",\n            value: function _getMetrics() {\n                var metrics = this.metrics, stats = this.stats;\n                metrics.fps = stats.get(\"frameRate\").getHz();\n                metrics.setPropsTime = stats.get(\"setProps Time\").time;\n                metrics.updateAttributesTime = stats.get(\"Update Attributes\").time;\n                metrics.framesRedrawn = stats.get(\"Redraw Count\").count;\n                metrics.pickTime = stats.get(\"pickObject Time\").time + stats.get(\"pickMultipleObjects Time\").time + stats.get(\"pickObjects Time\").time;\n                metrics.pickCount = stats.get(\"Pick Count\").count;\n                metrics.gpuTime = stats.get(\"GPU Time\").time;\n                metrics.cpuTime = stats.get(\"CPU Time\").time;\n                metrics.gpuTimePerFrame = stats.get(\"GPU Time\").getAverageTime();\n                metrics.cpuTimePerFrame = stats.get(\"CPU Time\").getAverageTime();\n                var memoryStats = (0, _core.lumaStats).get(\"Memory Usage\");\n                metrics.bufferMemory = memoryStats.get(\"Buffer Memory\").count;\n                metrics.textureMemory = memoryStats.get(\"Texture Memory\").count;\n                metrics.renderbufferMemory = memoryStats.get(\"Renderbuffer Memory\").count;\n                metrics.gpuMemory = memoryStats.get(\"GPU Memory\").count;\n            }\n        }\n    ]);\n    return Deck1;\n}();\nDeck.getPropTypes = getPropTypes;\nDeck.defaultProps = defaultProps;\nDeck.VERSION = (0, _initDefault.default).VERSION;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./layer-manager\":\"9sEq0\",\"./view-manager\":\"lLkpv\",\"../views/map-view\":\"c4mn5\",\"./effect-manager\":\"2c6dD\",\"./effect\":\"hVnbQ\",\"./deck-renderer\":\"uwNC4\",\"./deck-picker\":\"7N62N\",\"./tooltip\":\"7cczt\",\"../utils/log\":\"fg4UT\",\"../utils/deep-equal\":\"kF0nW\",\"../utils/typed-array-manager\":\"91rvg\",\"./init\":\"5f05H\",\"probe.gl/env\":\"4WXZh\",\"@luma.gl/core\":\"bW3Qv\",\"probe.gl\":\"f91qf\",\"mjolnir.js\":\"c947x\",\"../utils/assert\":\"8goZO\",\"./constants\":\"4VZPz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9sEq0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LayerManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _layer = require(\"./layer\");\nvar _layerDefault = parcelHelpers.interopDefault(_layer);\nvar _constants = require(\"../lifecycle/constants\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _debug = require(\"../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _flatten = require(\"../utils/flatten\");\nvar _probeGl = require(\"probe.gl\");\nvar _resourceManager = require(\"./resource/resource-manager\");\nvar _resourceManagerDefault = parcelHelpers.interopDefault(_resourceManager);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _shaderlib = require(\"../shaderlib\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar TRACE_SET_LAYERS = \"layerManager.setLayers\";\nvar TRACE_ACTIVATE_VIEWPORT = \"layerManager.activateViewport\";\nvar INITIAL_CONTEXT = Object.seal({\n    layerManager: null,\n    resourceManager: null,\n    deck: null,\n    gl: null,\n    stats: null,\n    shaderCache: null,\n    pickingFBO: null,\n    mousePosition: null,\n    userData: {}\n});\nvar layerName = function layerName(layer) {\n    return layer instanceof (0, _layerDefault.default) ? \"\".concat(layer) : !layer ? \"null\" : \"invalid\";\n};\nvar LayerManager = function() {\n    function LayerManager1(gl) {\n        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, deck = _ref.deck, stats = _ref.stats, viewport = _ref.viewport, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, LayerManager1);\n        this.lastRenderedLayers = [];\n        this.layers = [];\n        this.resourceManager = new (0, _resourceManagerDefault.default)({\n            gl: gl,\n            protocol: \"deck://\"\n        });\n        this.context = Object.assign({}, INITIAL_CONTEXT, {\n            layerManager: this,\n            gl: gl,\n            deck: deck,\n            programManager: gl && (0, _shaderlib.createProgramManager)(gl),\n            stats: stats || new (0, _probeGl.Stats)({\n                id: \"deck.gl\"\n            }),\n            viewport: viewport || new (0, _viewportDefault.default)({\n                id: \"DEFAULT-INITIAL-VIEWPORT\"\n            }),\n            timeline: timeline || new (0, _core.Timeline)(),\n            resourceManager: this.resourceManager\n        });\n        this._needsRedraw = \"Initial render\";\n        this._needsUpdate = false;\n        this._debug = false;\n        this._onError = null;\n        this.activateViewport = this.activateViewport.bind(this);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(LayerManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this.resourceManager.finalize();\n                var _iterator = _createForOfIteratorHelper(this.layers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var layer = _step.value;\n                        this._finalizeLayer(layer);\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                var _iterator2 = _createForOfIteratorHelper(this.layers), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var layer = _step2.value;\n                        var layerNeedsRedraw = layer.getNeedsRedraw(opts);\n                        redraw = redraw || layerNeedsRedraw;\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n                return redraw;\n            }\n        },\n        {\n            key: \"needsUpdate\",\n            value: function needsUpdate() {\n                return this._needsUpdate;\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw(reason) {\n                this._needsRedraw = this._needsRedraw || reason;\n            }\n        },\n        {\n            key: \"setNeedsUpdate\",\n            value: function setNeedsUpdate(reason) {\n                this._needsUpdate = this._needsUpdate || reason;\n            }\n        },\n        {\n            key: \"getLayers\",\n            value: function getLayers() {\n                var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$layerIds = _ref2.layerIds, layerIds = _ref2$layerIds === void 0 ? null : _ref2$layerIds;\n                return layerIds ? this.layers.filter(function(layer) {\n                    return layerIds.find(function(layerId) {\n                        return layer.id.indexOf(layerId) === 0;\n                    });\n                }) : this.layers;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"debug\" in props) this._debug = props.debug;\n                if (\"userData\" in props) this.context.userData = props.userData;\n                if (\"layers\" in props) this.setLayers(props.layers);\n                if (\"onError\" in props) this._onError = props.onError;\n            }\n        },\n        {\n            key: \"setLayers\",\n            value: function setLayers(newLayers) {\n                var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n                var shouldUpdate = forceUpdate || newLayers !== this.lastRenderedLayers;\n                (0, _debugDefault.default)(TRACE_SET_LAYERS, this, shouldUpdate, newLayers);\n                if (!shouldUpdate) return this;\n                this.lastRenderedLayers = newLayers;\n                newLayers = (0, _flatten.flatten)(newLayers, Boolean);\n                var _iterator3 = _createForOfIteratorHelper(newLayers), _step3;\n                try {\n                    for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                        var layer = _step3.value;\n                        layer.context = this.context;\n                    }\n                } catch (err) {\n                    _iterator3.e(err);\n                } finally{\n                    _iterator3.f();\n                }\n                this._updateLayers(this.layers, newLayers);\n                return this;\n            }\n        },\n        {\n            key: \"updateLayers\",\n            value: function updateLayers() {\n                var reason = this.needsUpdate();\n                if (reason) {\n                    this.setNeedsRedraw(\"updating layers: \".concat(reason));\n                    var forceUpdate = true;\n                    this.setLayers(this.lastRenderedLayers, forceUpdate);\n                }\n            }\n        },\n        {\n            key: \"activateViewport\",\n            value: function activateViewport(viewport) {\n                (0, _debugDefault.default)(TRACE_ACTIVATE_VIEWPORT, this, viewport);\n                if (viewport) this.context.viewport = viewport;\n                return this;\n            }\n        },\n        {\n            key: \"_handleError\",\n            value: function _handleError(stage, error, layer) {\n                if (this._onError) this._onError(error, layer);\n                else (0, _logDefault.default).error(\"error during \".concat(stage, \" of \").concat(layerName(layer)), error)();\n            }\n        },\n        {\n            key: \"_updateLayers\",\n            value: function _updateLayers(oldLayers, newLayers) {\n                var oldLayerMap = {};\n                var _iterator4 = _createForOfIteratorHelper(oldLayers), _step4;\n                try {\n                    for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n                        var oldLayer = _step4.value;\n                        if (oldLayerMap[oldLayer.id]) (0, _logDefault.default).warn(\"Multiple old layers with same id \".concat(layerName(oldLayer)))();\n                        else oldLayerMap[oldLayer.id] = oldLayer;\n                    }\n                } catch (err) {\n                    _iterator4.e(err);\n                } finally{\n                    _iterator4.f();\n                }\n                var generatedLayers = [];\n                this._updateSublayersRecursively(newLayers, oldLayerMap, generatedLayers);\n                this._finalizeOldLayers(oldLayerMap);\n                var needsUpdate = false;\n                for(var _i = 0, _generatedLayers = generatedLayers; _i < _generatedLayers.length; _i++){\n                    var layer = _generatedLayers[_i];\n                    if (layer.hasUniformTransition()) {\n                        needsUpdate = true;\n                        break;\n                    }\n                }\n                this._needsUpdate = needsUpdate;\n                this.layers = generatedLayers;\n            }\n        },\n        {\n            key: \"_updateSublayersRecursively\",\n            value: function _updateSublayersRecursively(newLayers, oldLayerMap, generatedLayers) {\n                var _iterator5 = _createForOfIteratorHelper(newLayers), _step5;\n                try {\n                    for(_iterator5.s(); !(_step5 = _iterator5.n()).done;){\n                        var newLayer = _step5.value;\n                        newLayer.context = this.context;\n                        var oldLayer = oldLayerMap[newLayer.id];\n                        if (oldLayer === null) (0, _logDefault.default).warn(\"Multiple new layers with same id \".concat(layerName(newLayer)))();\n                        oldLayerMap[newLayer.id] = null;\n                        var sublayers = null;\n                        try {\n                            if (this._debug && oldLayer !== newLayer) newLayer.validateProps();\n                            if (!oldLayer) this._initializeLayer(newLayer);\n                            else {\n                                this._transferLayerState(oldLayer, newLayer);\n                                this._updateLayer(newLayer);\n                            }\n                            generatedLayers.push(newLayer);\n                            sublayers = newLayer.isComposite && newLayer.getSubLayers();\n                        } catch (err) {\n                            this._handleError(\"matching\", err, newLayer);\n                        }\n                        if (sublayers) this._updateSublayersRecursively(sublayers, oldLayerMap, generatedLayers);\n                    }\n                } catch (err) {\n                    _iterator5.e(err);\n                } finally{\n                    _iterator5.f();\n                }\n            }\n        },\n        {\n            key: \"_finalizeOldLayers\",\n            value: function _finalizeOldLayers(oldLayerMap) {\n                for(var layerId in oldLayerMap){\n                    var layer = oldLayerMap[layerId];\n                    if (layer) this._finalizeLayer(layer);\n                }\n            }\n        },\n        {\n            key: \"_initializeLayer\",\n            value: function _initializeLayer(layer) {\n                try {\n                    layer._initialize();\n                    layer.lifecycle = (0, _constants.LIFECYCLE).INITIALIZED;\n                } catch (err) {\n                    this._handleError(\"initialization\", err, layer);\n                }\n            }\n        },\n        {\n            key: \"_transferLayerState\",\n            value: function _transferLayerState(oldLayer, newLayer) {\n                newLayer._transferState(oldLayer);\n                newLayer.lifecycle = (0, _constants.LIFECYCLE).MATCHED;\n                if (newLayer !== oldLayer) oldLayer.lifecycle = (0, _constants.LIFECYCLE).AWAITING_GC;\n            }\n        },\n        {\n            key: \"_updateLayer\",\n            value: function _updateLayer(layer) {\n                try {\n                    layer._update();\n                } catch (err) {\n                    this._handleError(\"update\", err, layer);\n                }\n            }\n        },\n        {\n            key: \"_finalizeLayer\",\n            value: function _finalizeLayer(layer) {\n                this._needsRedraw = this._needsRedraw || \"finalized \".concat(layerName(layer));\n                layer.lifecycle = (0, _constants.LIFECYCLE).AWAITING_FINALIZATION;\n                try {\n                    layer._finalize();\n                    layer.lifecycle = (0, _constants.LIFECYCLE).FINALIZED;\n                } catch (err) {\n                    this._handleError(\"finalization\", err, layer);\n                }\n            }\n        }\n    ]);\n    return LayerManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/core\":\"bW3Qv\",\"./layer\":\"jJOdt\",\"../lifecycle/constants\":\"3Gl8a\",\"../utils/log\":\"fg4UT\",\"../debug\":\"8AxDM\",\"../utils/flatten\":\"1zGCw\",\"probe.gl\":\"f91qf\",\"./resource/resource-manager\":\"kZ5ua\",\"../viewports/viewport\":\"jETN1\",\"../shaderlib\":\"1gK4T\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jJOdt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Layer);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _constants = require(\"./constants\");\nvar _attributeManager = require(\"./attribute/attribute-manager\");\nvar _attributeManagerDefault = parcelHelpers.interopDefault(_attributeManager);\nvar _uniformTransitionManager = require(\"./uniform-transition-manager\");\nvar _uniformTransitionManagerDefault = parcelHelpers.interopDefault(_uniformTransitionManager);\nvar _props = require(\"../lifecycle/props\");\nvar _count = require(\"../utils/count\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _debug = require(\"../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _core = require(\"@luma.gl/core\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _memoize = require(\"../utils/memoize\");\nvar _memoizeDefault = parcelHelpers.interopDefault(_memoize);\nvar _shader = require(\"../utils/shader\");\nvar _projectFunctions = require(\"../shaderlib/project/project-functions\");\nvar _typedArrayManager = require(\"../utils/typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _component = require(\"../lifecycle/component\");\nvar _componentDefault = parcelHelpers.interopDefault(_component);\nvar _layerState = require(\"./layer-state\");\nvar _layerStateDefault = parcelHelpers.interopDefault(_layerState);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _core1 = require(\"@loaders.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar TRACE_CHANGE_FLAG = \"layer.changeFlag\";\nvar TRACE_INITIALIZE = \"layer.initialize\";\nvar TRACE_UPDATE = \"layer.update\";\nvar TRACE_FINALIZE = \"layer.finalize\";\nvar TRACE_MATCHED = \"layer.matched\";\nvar MAX_PICKING_COLOR_CACHE_SIZE = Math.pow(2, 24) - 1;\nvar EMPTY_ARRAY = Object.freeze([]);\nvar areViewportsEqual = (0, _memoizeDefault.default)(function(_ref) {\n    var oldViewport = _ref.oldViewport, viewport = _ref.viewport;\n    return oldViewport.equals(viewport);\n});\nvar pickingColorCache = new Uint8ClampedArray(0);\nvar defaultProps = {\n    data: {\n        type: \"data\",\n        value: EMPTY_ARRAY,\n        async: true\n    },\n    dataComparator: null,\n    _dataDiff: {\n        type: \"function\",\n        value: function value(data) {\n            return data && data.__diff;\n        },\n        compare: false,\n        optional: true\n    },\n    dataTransform: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onDataLoad: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    fetch: {\n        type: \"function\",\n        value: function value(url, _ref2) {\n            var propName = _ref2.propName, layer = _ref2.layer;\n            var resourceManager = layer.context.resourceManager;\n            var loadOptions = layer.getLoadOptions();\n            var inResourceManager = resourceManager.contains(url);\n            if (!inResourceManager && !loadOptions) {\n                resourceManager.add({\n                    resourceId: url,\n                    data: url,\n                    persistent: false\n                });\n                inResourceManager = true;\n            }\n            if (inResourceManager) return resourceManager.subscribe({\n                resourceId: url,\n                onChange: function onChange(data) {\n                    return layer.internalState.reloadAsyncProp(propName, data);\n                },\n                consumerId: layer.id,\n                requestId: propName\n            });\n            return (0, _core1.load)(url, loadOptions);\n        },\n        compare: false\n    },\n    updateTriggers: {},\n    visible: true,\n    pickable: false,\n    opacity: {\n        type: \"number\",\n        min: 0,\n        max: 1,\n        value: 1\n    },\n    onHover: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onClick: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onDragStart: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onDrag: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    onDragEnd: {\n        type: \"function\",\n        value: null,\n        compare: false,\n        optional: true\n    },\n    coordinateSystem: (0, _constants.COORDINATE_SYSTEM).DEFAULT,\n    coordinateOrigin: {\n        type: \"array\",\n        value: [\n            0,\n            0,\n            0\n        ],\n        compare: true\n    },\n    modelMatrix: {\n        type: \"array\",\n        value: null,\n        compare: true,\n        optional: true\n    },\n    wrapLongitude: false,\n    positionFormat: \"XYZ\",\n    colorFormat: \"RGBA\",\n    parameters: {},\n    uniforms: {},\n    extensions: [],\n    getPolygonOffset: {\n        type: \"function\",\n        value: function value(_ref3) {\n            var layerIndex = _ref3.layerIndex;\n            return [\n                0,\n                -layerIndex * 100\n            ];\n        },\n        compare: false\n    },\n    highlightedObjectIndex: -1,\n    autoHighlight: false,\n    highlightColor: {\n        type: \"accessor\",\n        value: [\n            0,\n            0,\n            128,\n            128\n        ]\n    }\n};\nvar Layer = function(_Component) {\n    (0, _inheritsDefault.default)(Layer1, _Component);\n    var _super = _createSuper(Layer1);\n    function Layer1() {\n        (0, _classCallCheckDefault.default)(this, Layer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(Layer1, [\n        {\n            key: \"toString\",\n            value: function toString() {\n                var className = this.constructor.layerName || this.constructor.name;\n                return \"\".concat(className, \"({id: '\").concat(this.props.id, \"'})\");\n            }\n        },\n        {\n            key: \"setState\",\n            value: function setState(updateObject) {\n                this.setChangeFlags({\n                    stateChanged: true\n                });\n                Object.assign(this.state, updateObject);\n                this.setNeedsRedraw();\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw() {\n                var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n                if (this.internalState) this.internalState.needsRedraw = redraw;\n            }\n        },\n        {\n            key: \"setNeedsUpdate\",\n            value: function setNeedsUpdate() {\n                this.context.layerManager.setNeedsUpdate(String(this));\n                this.internalState.needsUpdate = true;\n            }\n        },\n        {\n            key: \"getNeedsRedraw\",\n            value: function getNeedsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                return this._getNeedsRedraw(opts);\n            }\n        },\n        {\n            key: \"needsUpdate\",\n            value: function needsUpdate() {\n                return this.internalState.needsUpdate || this.hasUniformTransition() || this.shouldUpdateState(this._getUpdateParams());\n            }\n        },\n        {\n            key: \"hasUniformTransition\",\n            value: function hasUniformTransition() {\n                return this.internalState.uniformTransitions.active;\n            }\n        },\n        {\n            key: \"isPickable\",\n            value: function isPickable() {\n                return this.props.pickable && this.props.visible;\n            }\n        },\n        {\n            key: \"getModels\",\n            value: function getModels() {\n                return this.state && (this.state.models || (this.state.model ? [\n                    this.state.model\n                ] : []));\n            }\n        },\n        {\n            key: \"getAttributeManager\",\n            value: function getAttributeManager() {\n                return this.internalState && this.internalState.attributeManager;\n            }\n        },\n        {\n            key: \"getCurrentLayer\",\n            value: function getCurrentLayer() {\n                return this.internalState && this.internalState.layer;\n            }\n        },\n        {\n            key: \"getLoadOptions\",\n            value: function getLoadOptions() {\n                return this.props.loadOptions;\n            }\n        },\n        {\n            key: \"project\",\n            value: function project(xyz) {\n                var viewport = this.context.viewport;\n                var worldPosition = (0, _projectFunctions.getWorldPosition)(xyz, {\n                    viewport: viewport,\n                    modelMatrix: this.props.modelMatrix,\n                    coordinateOrigin: this.props.coordinateOrigin,\n                    coordinateSystem: this.props.coordinateSystem\n                });\n                var _worldToPixels = (0, _webMercator.worldToPixels)(worldPosition, viewport.pixelProjectionMatrix), _worldToPixels2 = (0, _slicedToArrayDefault.default)(_worldToPixels, 3), x = _worldToPixels2[0], y = _worldToPixels2[1], z = _worldToPixels2[2];\n                return xyz.length === 2 ? [\n                    x,\n                    y\n                ] : [\n                    x,\n                    y,\n                    z\n                ];\n            }\n        },\n        {\n            key: \"unproject\",\n            value: function unproject(xy) {\n                var viewport = this.context.viewport;\n                return viewport.unproject(xy);\n            }\n        },\n        {\n            key: \"projectPosition\",\n            value: function projectPosition(xyz) {\n                return (0, _projectFunctions.projectPosition)(xyz, {\n                    viewport: this.context.viewport,\n                    modelMatrix: this.props.modelMatrix,\n                    coordinateOrigin: this.props.coordinateOrigin,\n                    coordinateSystem: this.props.coordinateSystem\n                });\n            }\n        },\n        {\n            key: \"use64bitPositions\",\n            value: function use64bitPositions() {\n                var coordinateSystem = this.props.coordinateSystem;\n                return coordinateSystem === (0, _constants.COORDINATE_SYSTEM).DEFAULT || coordinateSystem === (0, _constants.COORDINATE_SYSTEM).LNGLAT || coordinateSystem === (0, _constants.COORDINATE_SYSTEM).CARTESIAN;\n            }\n        },\n        {\n            key: \"onHover\",\n            value: function onHover(info, pickingEvent) {\n                if (this.props.onHover) return this.props.onHover(info, pickingEvent);\n                return false;\n            }\n        },\n        {\n            key: \"onClick\",\n            value: function onClick(info, pickingEvent) {\n                if (this.props.onClick) return this.props.onClick(info, pickingEvent);\n                return false;\n            }\n        },\n        {\n            key: \"nullPickingColor\",\n            value: function nullPickingColor() {\n                return [\n                    0,\n                    0,\n                    0\n                ];\n            }\n        },\n        {\n            key: \"encodePickingColor\",\n            value: function encodePickingColor(i) {\n                var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n                target[0] = i + 1 & 255;\n                target[1] = i + 1 >> 8 & 255;\n                target[2] = i + 1 >> 8 >> 8 & 255;\n                return target;\n            }\n        },\n        {\n            key: \"decodePickingColor\",\n            value: function decodePickingColor(color) {\n                (0, _assertDefault.default)(color instanceof Uint8Array);\n                var _color = (0, _slicedToArrayDefault.default)(color, 3), i1 = _color[0], i2 = _color[1], i3 = _color[2];\n                var index = i1 + i2 * 256 + i3 * 65536 - 1;\n                return index;\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                throw new Error(\"Layer \".concat(this, \" has not defined initializeState\"));\n            }\n        },\n        {\n            key: \"getShaders\",\n            value: function getShaders(shaders) {\n                var _iterator = _createForOfIteratorHelper(this.props.extensions), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var extension = _step.value;\n                        shaders = (0, _shader.mergeShaders)(shaders, extension.getShaders.call(this, extension));\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return shaders;\n            }\n        },\n        {\n            key: \"shouldUpdateState\",\n            value: function shouldUpdateState(_ref4) {\n                var oldProps = _ref4.oldProps, props = _ref4.props, context = _ref4.context, changeFlags = _ref4.changeFlags;\n                return changeFlags.propsOrDataChanged;\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref5) {\n                var oldProps = _ref5.oldProps, props = _ref5.props, context = _ref5.context, changeFlags = _ref5.changeFlags;\n                var attributeManager = this.getAttributeManager();\n                if (changeFlags.dataChanged && attributeManager) {\n                    var dataChanged = changeFlags.dataChanged;\n                    if (Array.isArray(dataChanged)) {\n                        var _iterator2 = _createForOfIteratorHelper(dataChanged), _step2;\n                        try {\n                            for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                                var dataRange = _step2.value;\n                                attributeManager.invalidateAll(dataRange);\n                            }\n                        } catch (err) {\n                            _iterator2.e(err);\n                        } finally{\n                            _iterator2.f();\n                        }\n                    } else attributeManager.invalidateAll();\n                }\n                var neededPickingBuffer = oldProps.highlightedObjectIndex >= 0 || oldProps.pickable;\n                var needPickingBuffer = props.highlightedObjectIndex >= 0 || props.pickable;\n                if (neededPickingBuffer !== needPickingBuffer && attributeManager) {\n                    var _attributeManager$att = attributeManager.attributes, pickingColors = _attributeManager$att.pickingColors, instancePickingColors = _attributeManager$att.instancePickingColors;\n                    var pickingColorsAttribute = pickingColors || instancePickingColors;\n                    if (pickingColorsAttribute) {\n                        if (needPickingBuffer && pickingColorsAttribute.constant) {\n                            pickingColorsAttribute.constant = false;\n                            attributeManager.invalidate(pickingColorsAttribute.id);\n                        }\n                        if (!pickingColorsAttribute.value && !needPickingBuffer) {\n                            pickingColorsAttribute.constant = true;\n                            pickingColorsAttribute.value = [\n                                0,\n                                0,\n                                0\n                            ];\n                        }\n                    }\n                }\n            }\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState() {\n                var _iterator3 = _createForOfIteratorHelper(this.getModels()), _step3;\n                try {\n                    for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                        var model = _step3.value;\n                        model[\"delete\"]();\n                    }\n                } catch (err) {\n                    _iterator3.e(err);\n                } finally{\n                    _iterator3.f();\n                }\n                var attributeManager = this.getAttributeManager();\n                if (attributeManager) attributeManager.finalize();\n                this.context.resourceManager.unsubscribe({\n                    consumerId: this.id\n                });\n                this.internalState.uniformTransitions.clear();\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(opts) {\n                var _iterator4 = _createForOfIteratorHelper(this.getModels()), _step4;\n                try {\n                    for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n                        var model = _step4.value;\n                        model.draw(opts);\n                    }\n                } catch (err) {\n                    _iterator4.e(err);\n                } finally{\n                    _iterator4.f();\n                }\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(_ref6) {\n                var info = _ref6.info, mode = _ref6.mode;\n                var index = info.index;\n                if (index >= 0) {\n                    if (Array.isArray(this.props.data)) info.object = this.props.data[index];\n                }\n                return info;\n            }\n        },\n        {\n            key: \"activateViewport\",\n            value: function activateViewport(viewport) {\n                var oldViewport = this.internalState.viewport;\n                this.internalState.viewport = viewport;\n                if (!oldViewport || !areViewportsEqual({\n                    oldViewport: oldViewport,\n                    viewport: viewport\n                })) {\n                    this.setChangeFlags({\n                        viewportChanged: true\n                    });\n                    this._update();\n                }\n            }\n        },\n        {\n            key: \"invalidateAttribute\",\n            value: function invalidateAttribute() {\n                var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"all\";\n                var diffReason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n                var attributeManager = this.getAttributeManager();\n                if (!attributeManager) return;\n                if (name === \"all\") attributeManager.invalidateAll();\n                else attributeManager.invalidate(name);\n            }\n        },\n        {\n            key: \"updateAttributes\",\n            value: function updateAttributes(changedAttributes) {\n                var _iterator5 = _createForOfIteratorHelper(this.getModels()), _step5;\n                try {\n                    for(_iterator5.s(); !(_step5 = _iterator5.n()).done;){\n                        var model = _step5.value;\n                        this._setModelAttributes(model, changedAttributes);\n                    }\n                } catch (err) {\n                    _iterator5.e(err);\n                } finally{\n                    _iterator5.f();\n                }\n            }\n        },\n        {\n            key: \"_updateAttributes\",\n            value: function _updateAttributes(props) {\n                var attributeManager = this.getAttributeManager();\n                if (!attributeManager) return;\n                var numInstances = this.getNumInstances(props);\n                var startIndices = this.getStartIndices(props);\n                attributeManager.update({\n                    data: props.data,\n                    numInstances: numInstances,\n                    startIndices: startIndices,\n                    props: props,\n                    transitions: props.transitions,\n                    buffers: props.data.attributes,\n                    context: this,\n                    ignoreUnknownAttributes: true\n                });\n                var changedAttributes = attributeManager.getChangedAttributes({\n                    clearChangedFlags: true\n                });\n                this.updateAttributes(changedAttributes);\n            }\n        },\n        {\n            key: \"_updateAttributeTransition\",\n            value: function _updateAttributeTransition() {\n                var attributeManager = this.getAttributeManager();\n                if (attributeManager) attributeManager.updateTransition();\n            }\n        },\n        {\n            key: \"_updateUniformTransition\",\n            value: function _updateUniformTransition() {\n                var uniformTransitions = this.internalState.uniformTransitions;\n                if (uniformTransitions.active) {\n                    var propsInTransition = uniformTransitions.update();\n                    var props = Object.create(this.props);\n                    for(var key in propsInTransition)Object.defineProperty(props, key, {\n                        value: propsInTransition[key]\n                    });\n                    return props;\n                }\n                return this.props;\n            }\n        },\n        {\n            key: \"calculateInstancePickingColors\",\n            value: function calculateInstancePickingColors(attribute, _ref7) {\n                var numInstances = _ref7.numInstances;\n                if (attribute.constant) return;\n                var cacheSize = pickingColorCache.length / 3;\n                if (cacheSize < numInstances) {\n                    if (numInstances > MAX_PICKING_COLOR_CACHE_SIZE) (0, _logDefault.default).warn(\"Layer has too many data objects. Picking might not be able to distinguish all objects.\")();\n                    pickingColorCache = (0, _typedArrayManagerDefault.default).allocate(pickingColorCache, numInstances, {\n                        size: 3,\n                        copy: true,\n                        maxCount: Math.max(numInstances, MAX_PICKING_COLOR_CACHE_SIZE)\n                    });\n                    var newCacheSize = pickingColorCache.length / 3;\n                    var pickingColor = [];\n                    for(var i = cacheSize; i < newCacheSize; i++){\n                        this.encodePickingColor(i, pickingColor);\n                        pickingColorCache[i * 3 + 0] = pickingColor[0];\n                        pickingColorCache[i * 3 + 1] = pickingColor[1];\n                        pickingColorCache[i * 3 + 2] = pickingColor[2];\n                    }\n                }\n                attribute.value = pickingColorCache.subarray(0, numInstances * 3);\n            }\n        },\n        {\n            key: \"_setModelAttributes\",\n            value: function _setModelAttributes(model, changedAttributes) {\n                var attributeManager = this.getAttributeManager();\n                var excludeAttributes = model.userData.excludeAttributes || {};\n                var shaderAttributes = attributeManager.getShaderAttributes(changedAttributes, excludeAttributes);\n                model.setAttributes(shaderAttributes);\n            }\n        },\n        {\n            key: \"clearPickingColor\",\n            value: function clearPickingColor(color) {\n                var _this$getAttributeMan = this.getAttributeManager().attributes, pickingColors = _this$getAttributeMan.pickingColors, instancePickingColors = _this$getAttributeMan.instancePickingColors;\n                var colors = pickingColors || instancePickingColors;\n                var i = this.decodePickingColor(color);\n                var start = colors.getVertexOffset(i);\n                var end = colors.getVertexOffset(i + 1);\n                colors.buffer.subData({\n                    data: new Uint8Array(end - start),\n                    offset: start\n                });\n            }\n        },\n        {\n            key: \"restorePickingColors\",\n            value: function restorePickingColors() {\n                var _this$getAttributeMan2 = this.getAttributeManager().attributes, pickingColors = _this$getAttributeMan2.pickingColors, instancePickingColors = _this$getAttributeMan2.instancePickingColors;\n                var colors = pickingColors || instancePickingColors;\n                colors.updateSubBuffer({\n                    startOffset: 0\n                });\n            }\n        },\n        {\n            key: \"getNumInstances\",\n            value: function getNumInstances(props) {\n                props = props || this.props;\n                if (props.numInstances !== undefined) return props.numInstances;\n                if (this.state && this.state.numInstances !== undefined) return this.state.numInstances;\n                return (0, _count.count)(props.data);\n            }\n        },\n        {\n            key: \"getStartIndices\",\n            value: function getStartIndices(props) {\n                props = props || this.props;\n                if (props.startIndices !== undefined) return props.startIndices;\n                if (this.state && this.state.startIndices) return this.state.startIndices;\n                return null;\n            }\n        },\n        {\n            key: \"_initialize\",\n            value: function _initialize() {\n                (0, _debugDefault.default)(TRACE_INITIALIZE, this);\n                this._initState();\n                this.initializeState(this.context);\n                var _iterator6 = _createForOfIteratorHelper(this.props.extensions), _step6;\n                try {\n                    for(_iterator6.s(); !(_step6 = _iterator6.n()).done;){\n                        var extension = _step6.value;\n                        extension.initializeState.call(this, this.context, extension);\n                    }\n                } catch (err) {\n                    _iterator6.e(err);\n                } finally{\n                    _iterator6.f();\n                }\n                this.setChangeFlags({\n                    dataChanged: true,\n                    propsChanged: true,\n                    viewportChanged: true,\n                    extensionsChanged: true\n                });\n                this._updateState();\n            }\n        },\n        {\n            key: \"_update\",\n            value: function _update() {\n                var stateNeedsUpdate = this.needsUpdate();\n                (0, _debugDefault.default)(TRACE_UPDATE, this, stateNeedsUpdate);\n                if (stateNeedsUpdate) this._updateState();\n            }\n        },\n        {\n            key: \"_updateState\",\n            value: function _updateState() {\n                var currentProps = this.props;\n                var currentViewport = this.context.viewport;\n                var propsInTransition = this._updateUniformTransition();\n                this.internalState.propsInTransition = propsInTransition;\n                this.context.viewport = this.internalState.viewport || currentViewport;\n                this.props = propsInTransition;\n                var updateParams = this._getUpdateParams();\n                var oldModels = this.getModels();\n                if (this.context.gl) this.updateState(updateParams);\n                else try {\n                    this.updateState(updateParams);\n                } catch (error) {}\n                var _iterator7 = _createForOfIteratorHelper(this.props.extensions), _step7;\n                try {\n                    for(_iterator7.s(); !(_step7 = _iterator7.n()).done;){\n                        var extension = _step7.value;\n                        extension.updateState.call(this, updateParams, extension);\n                    }\n                } catch (err) {\n                    _iterator7.e(err);\n                } finally{\n                    _iterator7.f();\n                }\n                var modelChanged = this.getModels()[0] !== oldModels[0];\n                this._updateModules(updateParams, modelChanged);\n                if (this.isComposite) this._renderLayers(updateParams);\n                else {\n                    this.setNeedsRedraw();\n                    this._updateAttributes(this.props);\n                    if (this.state.model) this.state.model.setInstanceCount(this.getNumInstances());\n                }\n                this.context.viewport = currentViewport;\n                this.props = currentProps;\n                this.clearChangeFlags();\n                this.internalState.needsUpdate = false;\n                this.internalState.resetOldProps();\n            }\n        },\n        {\n            key: \"_finalize\",\n            value: function _finalize() {\n                (0, _debugDefault.default)(TRACE_FINALIZE, this);\n                (0, _assertDefault.default)(this.internalState && this.state);\n                this.finalizeState(this.context);\n                var _iterator8 = _createForOfIteratorHelper(this.props.extensions), _step8;\n                try {\n                    for(_iterator8.s(); !(_step8 = _iterator8.n()).done;){\n                        var extension = _step8.value;\n                        extension.finalizeState.call(this, extension);\n                    }\n                } catch (err) {\n                    _iterator8.e(err);\n                } finally{\n                    _iterator8.f();\n                }\n            }\n        },\n        {\n            key: \"drawLayer\",\n            value: function drawLayer(_ref8) {\n                var _this = this;\n                var _ref8$moduleParameter = _ref8.moduleParameters, moduleParameters = _ref8$moduleParameter === void 0 ? null : _ref8$moduleParameter, _ref8$uniforms = _ref8.uniforms, uniforms = _ref8$uniforms === void 0 ? {} : _ref8$uniforms, _ref8$parameters = _ref8.parameters, parameters = _ref8$parameters === void 0 ? {} : _ref8$parameters;\n                this._updateAttributeTransition();\n                var currentProps = this.props;\n                this.props = this.internalState.propsInTransition || currentProps;\n                var opacity = this.props.opacity;\n                uniforms.opacity = Math.pow(opacity, 1 / 2.2);\n                if (moduleParameters) this.setModuleParameters(moduleParameters);\n                var getPolygonOffset = this.props.getPolygonOffset;\n                var offsets = getPolygonOffset && getPolygonOffset(uniforms) || [\n                    0,\n                    0\n                ];\n                (0, _core.setParameters)(this.context.gl, {\n                    polygonOffset: offsets\n                });\n                (0, _core.withParameters)(this.context.gl, parameters, function() {\n                    var opts = {\n                        moduleParameters: moduleParameters,\n                        uniforms: uniforms,\n                        parameters: parameters,\n                        context: _this.context\n                    };\n                    var _iterator9 = _createForOfIteratorHelper(_this.props.extensions), _step9;\n                    try {\n                        for(_iterator9.s(); !(_step9 = _iterator9.n()).done;){\n                            var extension = _step9.value;\n                            extension.draw.call(_this, opts, extension);\n                        }\n                    } catch (err) {\n                        _iterator9.e(err);\n                    } finally{\n                        _iterator9.f();\n                    }\n                    _this.draw(opts);\n                });\n                this.props = currentProps;\n            }\n        },\n        {\n            key: \"getChangeFlags\",\n            value: function getChangeFlags() {\n                return this.internalState.changeFlags;\n            }\n        },\n        {\n            key: \"setChangeFlags\",\n            value: function setChangeFlags(flags) {\n                var changeFlags = this.internalState.changeFlags;\n                for(var key in flags)if (flags[key]) {\n                    var flagChanged = false;\n                    switch(key){\n                        case \"dataChanged\":\n                            if (Array.isArray(changeFlags[key])) {\n                                changeFlags[key] = Array.isArray(flags[key]) ? changeFlags[key].concat(flags[key]) : flags[key];\n                                flagChanged = true;\n                            }\n                        default:\n                            if (!changeFlags[key]) {\n                                changeFlags[key] = flags[key];\n                                flagChanged = true;\n                            }\n                    }\n                    if (flagChanged) (0, _debugDefault.default)(TRACE_CHANGE_FLAG, this, key, flags);\n                }\n                var propsOrDataChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged || changeFlags.propsChanged || changeFlags.extensionsChanged;\n                changeFlags.propsOrDataChanged = propsOrDataChanged;\n                changeFlags.somethingChanged = propsOrDataChanged || flags.viewportChanged || flags.stateChanged;\n            }\n        },\n        {\n            key: \"clearChangeFlags\",\n            value: function clearChangeFlags() {\n                this.internalState.changeFlags = {\n                    dataChanged: false,\n                    propsChanged: false,\n                    updateTriggersChanged: false,\n                    viewportChanged: false,\n                    stateChanged: false,\n                    extensionsChanged: false,\n                    propsOrDataChanged: false,\n                    somethingChanged: false\n                };\n            }\n        },\n        {\n            key: \"diffProps\",\n            value: function diffProps(newProps, oldProps) {\n                var changeFlags = (0, _props.diffProps)(newProps, oldProps);\n                if (changeFlags.updateTriggersChanged) {\n                    for(var key in changeFlags.updateTriggersChanged)if (changeFlags.updateTriggersChanged[key]) this.invalidateAttribute(key);\n                }\n                if (changeFlags.transitionsChanged) for(var _key in changeFlags.transitionsChanged)this.internalState.uniformTransitions.add(_key, oldProps[_key], newProps[_key], newProps.transitions[_key]);\n                return this.setChangeFlags(changeFlags);\n            }\n        },\n        {\n            key: \"validateProps\",\n            value: function validateProps() {\n                (0, _props.validateProps)(this.props);\n            }\n        },\n        {\n            key: \"setModuleParameters\",\n            value: function setModuleParameters(moduleParameters) {\n                var _iterator10 = _createForOfIteratorHelper(this.getModels()), _step10;\n                try {\n                    for(_iterator10.s(); !(_step10 = _iterator10.n()).done;){\n                        var model = _step10.value;\n                        model.updateModuleSettings(moduleParameters);\n                    }\n                } catch (err) {\n                    _iterator10.e(err);\n                } finally{\n                    _iterator10.f();\n                }\n            }\n        },\n        {\n            key: \"_updateModules\",\n            value: function _updateModules(_ref9, forceUpdate) {\n                var props = _ref9.props, oldProps = _ref9.oldProps;\n                var autoHighlight = props.autoHighlight, highlightedObjectIndex = props.highlightedObjectIndex, highlightColor = props.highlightColor;\n                if (forceUpdate || oldProps.autoHighlight !== autoHighlight || oldProps.highlightedObjectIndex !== highlightedObjectIndex || oldProps.highlightColor !== highlightColor) {\n                    var parameters = {};\n                    if (!autoHighlight) parameters.pickingSelectedColor = null;\n                    if (Array.isArray(highlightColor)) parameters.pickingHighlightColor = highlightColor;\n                    if (Number.isInteger(highlightedObjectIndex)) parameters.pickingSelectedColor = highlightedObjectIndex >= 0 ? this.encodePickingColor(highlightedObjectIndex) : null;\n                    this.setModuleParameters(parameters);\n                }\n            }\n        },\n        {\n            key: \"_getUpdateParams\",\n            value: function _getUpdateParams() {\n                return {\n                    props: this.props,\n                    oldProps: this.internalState.getOldProps(),\n                    context: this.context,\n                    changeFlags: this.internalState.changeFlags\n                };\n            }\n        },\n        {\n            key: \"_getNeedsRedraw\",\n            value: function _getNeedsRedraw(opts) {\n                if (!this.internalState) return false;\n                var redraw = false;\n                redraw = redraw || this.internalState.needsRedraw && this.id;\n                this.internalState.needsRedraw = this.internalState.needsRedraw && !opts.clearRedrawFlags;\n                var attributeManager = this.getAttributeManager();\n                var attributeManagerNeedsRedraw = attributeManager && attributeManager.getNeedsRedraw(opts);\n                redraw = redraw || attributeManagerNeedsRedraw;\n                return redraw;\n            }\n        },\n        {\n            key: \"_getAttributeManager\",\n            value: function _getAttributeManager() {\n                return new (0, _attributeManagerDefault.default)(this.context.gl, {\n                    id: this.props.id,\n                    stats: this.context.stats,\n                    timeline: this.context.timeline\n                });\n            }\n        },\n        {\n            key: \"_initState\",\n            value: function _initState() {\n                (0, _assertDefault.default)(!this.internalState && !this.state);\n                (0, _assertDefault.default)(isFinite(this.props.coordinateSystem), \"\".concat(this.id, \": invalid coordinateSystem\"));\n                var attributeManager = this._getAttributeManager();\n                if (attributeManager) attributeManager.addInstanced({\n                    instancePickingColors: {\n                        type: 5121,\n                        size: 3,\n                        noAlloc: true,\n                        update: this.calculateInstancePickingColors\n                    }\n                });\n                this.internalState = new (0, _layerStateDefault.default)({\n                    attributeManager: attributeManager,\n                    layer: this\n                });\n                this.clearChangeFlags();\n                this.state = {};\n                Object.defineProperty(this.state, \"attributeManager\", {\n                    get: function get() {\n                        (0, _logDefault.default).deprecated(\"layer.state.attributeManager\", \"layer.getAttributeManager()\");\n                        return attributeManager;\n                    }\n                });\n                this.internalState.layer = this;\n                this.internalState.uniformTransitions = new (0, _uniformTransitionManagerDefault.default)(this.context.timeline);\n                this.internalState.onAsyncPropUpdated = this._onAsyncPropUpdated.bind(this);\n                this.internalState.setAsyncProps(this.props);\n            }\n        },\n        {\n            key: \"_transferState\",\n            value: function _transferState(oldLayer) {\n                (0, _debugDefault.default)(TRACE_MATCHED, this, this === oldLayer);\n                var state = oldLayer.state, internalState = oldLayer.internalState;\n                (0, _assertDefault.default)(state && internalState);\n                if (this === oldLayer) return;\n                this.internalState = internalState;\n                this.internalState.layer = this;\n                this.state = state;\n                this.internalState.setAsyncProps(this.props);\n                this.diffProps(this.props, this.internalState.getOldProps());\n            }\n        },\n        {\n            key: \"_onAsyncPropUpdated\",\n            value: function _onAsyncPropUpdated() {\n                this.diffProps(this.props, this.internalState.getOldProps());\n                this.setNeedsUpdate();\n            }\n        },\n        {\n            key: \"isLoaded\",\n            get: function get() {\n                return this.internalState && !this.internalState.isAsyncPropLoading();\n            }\n        },\n        {\n            key: \"wrapLongitude\",\n            get: function get() {\n                return this.props.wrapLongitude;\n            }\n        }\n    ]);\n    return Layer1;\n}((0, _componentDefault.default));\nLayer.layerName = \"Layer\";\nLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./constants\":\"4VZPz\",\"./attribute/attribute-manager\":\"1b6eu\",\"./uniform-transition-manager\":\"2Wwsw\",\"../lifecycle/props\":\"2rTFu\",\"../utils/count\":\"9arx2\",\"../utils/log\":\"fg4UT\",\"../debug\":\"8AxDM\",\"@luma.gl/core\":\"bW3Qv\",\"../utils/assert\":\"8goZO\",\"../utils/memoize\":\"hjEig\",\"../utils/shader\":\"j0UQD\",\"../shaderlib/project/project-functions\":\"baNIK\",\"../utils/typed-array-manager\":\"91rvg\",\"../lifecycle/component\":\"fwxt6\",\"./layer-state\":\"ftSh0\",\"@math.gl/web-mercator\":\"jS2l3\",\"@loaders.gl/core\":\"7dwvE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1b6eu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>AttributeManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _attribute = require(\"./attribute\");\nvar _attributeDefault = parcelHelpers.interopDefault(_attribute);\nvar _log = require(\"../../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _debug = require(\"../../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _attributeTransitionManager = require(\"./attribute-transition-manager\");\nvar _attributeTransitionManagerDefault = parcelHelpers.interopDefault(_attributeTransitionManager);\nvar TRACE_INVALIDATE = \"attributeManager.invalidate\";\nvar TRACE_UPDATE_START = \"attributeManager.updateStart\";\nvar TRACE_UPDATE_END = \"attributeManager.updateEnd\";\nvar TRACE_ATTRIBUTE_UPDATE_START = \"attribute.updateStart\";\nvar TRACE_ATTRIBUTE_ALLOCATE = \"attribute.allocate\";\nvar TRACE_ATTRIBUTE_UPDATE_END = \"attribute.updateEnd\";\nvar AttributeManager = function() {\n    function AttributeManager1(gl) {\n        var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$id = _ref.id, id = _ref$id === void 0 ? \"attribute-manager\" : _ref$id, stats = _ref.stats, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, AttributeManager1);\n        this.id = id;\n        this.gl = gl;\n        this.attributes = {};\n        this.updateTriggers = {};\n        this.accessors = {};\n        this.needsRedraw = true;\n        this.userData = {};\n        this.stats = stats;\n        this.attributeTransitionManager = new (0, _attributeTransitionManagerDefault.default)(gl, {\n            id: \"\".concat(id, \"-transitions\"),\n            timeline: timeline\n        });\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(AttributeManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var attributeName in this.attributes)this.attributes[attributeName][\"delete\"]();\n                this.attributeTransitionManager.finalize();\n            }\n        },\n        {\n            key: \"getNeedsRedraw\",\n            value: function getNeedsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this.needsRedraw;\n                this.needsRedraw = this.needsRedraw && !opts.clearRedrawFlags;\n                return redraw && this.id;\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw() {\n                var redraw = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n                this.needsRedraw = true;\n                return this;\n            }\n        },\n        {\n            key: \"add\",\n            value: function add(attributes, updaters) {\n                this._add(attributes, updaters);\n            }\n        },\n        {\n            key: \"addInstanced\",\n            value: function addInstanced(attributes, updaters) {\n                this._add(attributes, updaters, {\n                    instanced: 1\n                });\n            }\n        },\n        {\n            key: \"remove\",\n            value: function remove(attributeNameArray) {\n                for(var i = 0; i < attributeNameArray.length; i++){\n                    var name = attributeNameArray[i];\n                    if (this.attributes[name] !== undefined) {\n                        this.attributes[name][\"delete\"]();\n                        delete this.attributes[name];\n                    }\n                }\n            }\n        },\n        {\n            key: \"invalidate\",\n            value: function invalidate(triggerName, dataRange) {\n                var invalidatedAttributes = this._invalidateTrigger(triggerName, dataRange);\n                (0, _debugDefault.default)(TRACE_INVALIDATE, this, triggerName, invalidatedAttributes);\n            }\n        },\n        {\n            key: \"invalidateAll\",\n            value: function invalidateAll(dataRange) {\n                for(var attributeName in this.attributes)this.attributes[attributeName].setNeedsUpdate(attributeName, dataRange);\n                (0, _debugDefault.default)(TRACE_INVALIDATE, this, \"all\");\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, data = _ref2.data, numInstances = _ref2.numInstances, _ref2$startIndices = _ref2.startIndices, startIndices = _ref2$startIndices === void 0 ? null : _ref2$startIndices, transitions = _ref2.transitions, _ref2$props = _ref2.props, props = _ref2$props === void 0 ? {} : _ref2$props, _ref2$buffers = _ref2.buffers, buffers = _ref2$buffers === void 0 ? {} : _ref2$buffers, _ref2$context = _ref2.context, context = _ref2$context === void 0 ? {} : _ref2$context;\n                var updated = false;\n                (0, _debugDefault.default)(TRACE_UPDATE_START, this);\n                if (this.stats) this.stats.get(\"Update Attributes\").timeStart();\n                for(var attributeName in this.attributes){\n                    var attribute = this.attributes[attributeName];\n                    var accessorName = attribute.settings.accessor;\n                    attribute.startIndices = startIndices;\n                    if (props[attributeName]) (0, _logDefault.default).removed(\"props.\".concat(attributeName), \"data.attributes.\".concat(attributeName))();\n                    if (attribute.setExternalBuffer(buffers[attributeName])) ;\n                    else if (attribute.setBinaryValue(buffers[accessorName], data.startIndices)) ;\n                    else if (!buffers[accessorName] && attribute.setConstantValue(props[accessorName])) ;\n                    else if (attribute.needsUpdate()) {\n                        updated = true;\n                        this._updateAttribute({\n                            attribute: attribute,\n                            numInstances: numInstances,\n                            data: data,\n                            props: props,\n                            context: context\n                        });\n                    }\n                    this.needsRedraw |= attribute.needsRedraw();\n                }\n                if (updated) (0, _debugDefault.default)(TRACE_UPDATE_END, this, numInstances);\n                if (this.stats) this.stats.get(\"Update Attributes\").timeEnd();\n                this.attributeTransitionManager.update({\n                    attributes: this.attributes,\n                    numInstances: numInstances,\n                    transitions: transitions\n                });\n            }\n        },\n        {\n            key: \"updateTransition\",\n            value: function updateTransition() {\n                var attributeTransitionManager = this.attributeTransitionManager;\n                var transitionUpdated = attributeTransitionManager.run();\n                this.needsRedraw = this.needsRedraw || transitionUpdated;\n                return transitionUpdated;\n            }\n        },\n        {\n            key: \"getAttributes\",\n            value: function getAttributes() {\n                return this.attributes;\n            }\n        },\n        {\n            key: \"getChangedAttributes\",\n            value: function getChangedAttributes() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearChangedFlags: false\n                };\n                var attributes = this.attributes, attributeTransitionManager = this.attributeTransitionManager;\n                var changedAttributes = Object.assign({}, attributeTransitionManager.getAttributes());\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    if (attribute.needsRedraw(opts) && !attributeTransitionManager.hasAttribute(attributeName)) changedAttributes[attributeName] = attribute;\n                }\n                return changedAttributes;\n            }\n        },\n        {\n            key: \"getShaderAttributes\",\n            value: function getShaderAttributes(attributes) {\n                var excludeAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                if (!attributes) attributes = this.getAttributes();\n                var shaderAttributes = {};\n                for(var attributeName in attributes)if (!excludeAttributes[attributeName]) Object.assign(shaderAttributes, attributes[attributeName].getShaderAttributes());\n                return shaderAttributes;\n            }\n        },\n        {\n            key: \"getAccessors\",\n            value: function getAccessors() {\n                return this.updateTriggers;\n            }\n        },\n        {\n            key: \"_add\",\n            value: function _add(attributes, updaters) {\n                var extraProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n                if (updaters) (0, _logDefault.default).warn(\"AttributeManager.add({updaters}) - updater map no longer supported\")();\n                var newAttributes = {};\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    var newAttribute = this._createAttribute(attributeName, attribute, extraProps);\n                    newAttributes[attributeName] = newAttribute;\n                }\n                Object.assign(this.attributes, newAttributes);\n                this._mapUpdateTriggersToAttributes();\n            }\n        },\n        {\n            key: \"_createAttribute\",\n            value: function _createAttribute(name, attribute, extraProps) {\n                var props = {\n                    id: name,\n                    constant: attribute.constant || false,\n                    isIndexed: attribute.isIndexed || attribute.elements,\n                    size: attribute.elements && 1 || attribute.size,\n                    value: attribute.value || null,\n                    divisor: attribute.instanced || extraProps.instanced ? 1 : attribute.divisor\n                };\n                return new (0, _attributeDefault.default)(this.gl, Object.assign({}, attribute, props));\n            }\n        },\n        {\n            key: \"_mapUpdateTriggersToAttributes\",\n            value: function _mapUpdateTriggersToAttributes() {\n                var _this = this;\n                var triggers = {};\n                var _loop = function _loop(attributeName) {\n                    var attribute = _this.attributes[attributeName];\n                    attribute.getUpdateTriggers().forEach(function(triggerName) {\n                        if (!triggers[triggerName]) triggers[triggerName] = [];\n                        triggers[triggerName].push(attributeName);\n                    });\n                };\n                for(var attributeName1 in this.attributes)_loop(attributeName1);\n                this.updateTriggers = triggers;\n            }\n        },\n        {\n            key: \"_invalidateTrigger\",\n            value: function _invalidateTrigger(triggerName, dataRange) {\n                var attributes = this.attributes, updateTriggers = this.updateTriggers;\n                var invalidatedAttributes = updateTriggers[triggerName];\n                if (invalidatedAttributes) invalidatedAttributes.forEach(function(name) {\n                    var attribute = attributes[name];\n                    if (attribute) attribute.setNeedsUpdate(attribute.id, dataRange);\n                });\n                return invalidatedAttributes;\n            }\n        },\n        {\n            key: \"_updateAttribute\",\n            value: function _updateAttribute(opts) {\n                var attribute = opts.attribute, numInstances = opts.numInstances;\n                (0, _debugDefault.default)(TRACE_ATTRIBUTE_UPDATE_START, attribute);\n                if (attribute.allocate(numInstances)) (0, _debugDefault.default)(TRACE_ATTRIBUTE_ALLOCATE, attribute, numInstances);\n                var updated = attribute.updateBuffer(opts);\n                if (updated) {\n                    this.needsRedraw = true;\n                    (0, _debugDefault.default)(TRACE_ATTRIBUTE_UPDATE_END, attribute, numInstances);\n                }\n            }\n        }\n    ]);\n    return AttributeManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./attribute\":\"2a0SU\",\"../../utils/log\":\"fg4UT\",\"../../debug\":\"8AxDM\",\"./attribute-transition-manager\":\"aZW5q\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2a0SU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Attribute);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _dataColumn = require(\"./data-column\");\nvar _dataColumnDefault = parcelHelpers.interopDefault(_dataColumn);\nvar _assert = require(\"../../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _iterableUtils = require(\"../../utils/iterable-utils\");\nvar _flatten = require(\"../../utils/flatten\");\nvar _range = require(\"../../utils/range\");\nvar _attributeTransitionUtils = require(\"./attribute-transition-utils\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar Attribute = function(_DataColumn) {\n    (0, _inheritsDefault.default)(Attribute1, _DataColumn);\n    var _super = _createSuper(Attribute1);\n    function Attribute1(gl) {\n        var _this;\n        var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Attribute1);\n        _this = _super.call(this, gl, opts);\n        var _opts$transition = opts.transition, transition = _opts$transition === void 0 ? false : _opts$transition, _opts$noAlloc = opts.noAlloc, noAlloc = _opts$noAlloc === void 0 ? false : _opts$noAlloc, _opts$update = opts.update, update = _opts$update === void 0 ? null : _opts$update, _opts$accessor = opts.accessor, accessor = _opts$accessor === void 0 ? null : _opts$accessor, _opts$transform = opts.transform, transform = _opts$transform === void 0 ? null : _opts$transform, _opts$startIndices = opts.startIndices, startIndices = _opts$startIndices === void 0 ? null : _opts$startIndices;\n        Object.assign(_this.settings, {\n            transition: transition,\n            noAlloc: noAlloc,\n            update: update || accessor && _this._autoUpdater,\n            accessor: accessor,\n            transform: transform\n        });\n        Object.assign(_this.state, {\n            lastExternalBuffer: null,\n            binaryValue: null,\n            binaryAccessor: null,\n            needsUpdate: true,\n            needsRedraw: false,\n            updateRanges: _range.FULL,\n            startIndices: startIndices\n        });\n        Object.seal(_this.settings);\n        Object.seal(_this.state);\n        _this._validateAttributeUpdaters();\n        return _this;\n    }\n    (0, _createClassDefault.default)(Attribute1, [\n        {\n            key: \"needsUpdate\",\n            value: function needsUpdate() {\n                return this.state.needsUpdate;\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$clearChangedFlag = _ref.clearChangedFlags, clearChangedFlags = _ref$clearChangedFlag === void 0 ? false : _ref$clearChangedFlag;\n                var needsRedraw = this.state.needsRedraw;\n                this.state.needsRedraw = needsRedraw && !clearChangedFlags;\n                return needsRedraw;\n            }\n        },\n        {\n            key: \"getUpdateTriggers\",\n            value: function getUpdateTriggers() {\n                var accessor = this.settings.accessor;\n                return [\n                    this.id\n                ].concat(typeof accessor !== \"function\" && accessor || []);\n            }\n        },\n        {\n            key: \"supportsTransition\",\n            value: function supportsTransition() {\n                return Boolean(this.settings.transition);\n            }\n        },\n        {\n            key: \"getTransitionSetting\",\n            value: function getTransitionSetting(opts) {\n                var accessor = this.settings.accessor;\n                var layerSettings = this.settings.transition;\n                if (!this.supportsTransition()) return null;\n                var userSettings = Array.isArray(accessor) ? opts[accessor.find(function(a) {\n                    return opts[a];\n                })] : opts[accessor];\n                return (0, _attributeTransitionUtils.normalizeTransitionSettings)(userSettings, layerSettings);\n            }\n        },\n        {\n            key: \"setNeedsUpdate\",\n            value: function setNeedsUpdate() {\n                var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.id;\n                var dataRange = arguments.length > 1 ? arguments[1] : undefined;\n                this.state.needsUpdate = this.state.needsUpdate || reason;\n                this.setNeedsRedraw(reason);\n                if (dataRange) {\n                    var _dataRange$startRow = dataRange.startRow, startRow = _dataRange$startRow === void 0 ? 0 : _dataRange$startRow, _dataRange$endRow = dataRange.endRow, endRow = _dataRange$endRow === void 0 ? Infinity : _dataRange$endRow;\n                    this.state.updateRanges = _range.add(this.state.updateRanges, [\n                        startRow,\n                        endRow\n                    ]);\n                } else this.state.updateRanges = _range.FULL;\n            }\n        },\n        {\n            key: \"clearNeedsUpdate\",\n            value: function clearNeedsUpdate() {\n                this.state.needsUpdate = false;\n                this.state.updateRanges = _range.EMPTY;\n            }\n        },\n        {\n            key: \"setNeedsRedraw\",\n            value: function setNeedsRedraw() {\n                var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.id;\n                this.state.needsRedraw = this.state.needsRedraw || reason;\n            }\n        },\n        {\n            key: \"update\",\n            value: function update(opts) {\n                this.setData(opts);\n            }\n        },\n        {\n            key: \"allocate\",\n            value: function allocate(numInstances) {\n                var state = this.state, settings = this.settings;\n                if (settings.noAlloc) return false;\n                if (settings.update) {\n                    (0, _assertDefault.default)(Number.isFinite(numInstances));\n                    (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Attribute1.prototype), \"allocate\", this).call(this, {\n                        numInstances: numInstances,\n                        copy: state.updateRanges !== _range.FULL\n                    });\n                    return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"updateBuffer\",\n            value: function updateBuffer(_ref2) {\n                var numInstances = _ref2.numInstances, data = _ref2.data, props = _ref2.props, context = _ref2.context;\n                if (!this.needsUpdate()) return false;\n                var updateRanges = this.state.updateRanges, _this$settings = this.settings, update = _this$settings.update, noAlloc = _this$settings.noAlloc;\n                var updated = true;\n                if (update) {\n                    var _iterator = _createForOfIteratorHelper(updateRanges), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var _step$value = (0, _slicedToArrayDefault.default)(_step.value, 2), _startRow = _step$value[0], _endRow = _step$value[1];\n                            update.call(context, this, {\n                                data: data,\n                                startRow: _startRow,\n                                endRow: _endRow,\n                                props: props,\n                                numInstances: numInstances\n                            });\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    if (!this.value) ;\n                    else if (this.constant || this.buffer.byteLength < this.value.byteLength + this.byteOffset) this.setData({\n                        value: this.value,\n                        constant: this.constant\n                    });\n                    else {\n                        var _iterator2 = _createForOfIteratorHelper(updateRanges), _step2;\n                        try {\n                            for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                                var _step2$value = (0, _slicedToArrayDefault.default)(_step2.value, 2), startRow = _step2$value[0], endRow = _step2$value[1];\n                                var startOffset = Number.isFinite(startRow) ? this.getVertexOffset(startRow) : 0;\n                                var endOffset = Number.isFinite(endRow) ? this.getVertexOffset(endRow) : noAlloc || !Number.isFinite(numInstances) ? this.value.length : numInstances * this.size;\n                                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Attribute1.prototype), \"updateSubBuffer\", this).call(this, {\n                                    startOffset: startOffset,\n                                    endOffset: endOffset\n                                });\n                            }\n                        } catch (err) {\n                            _iterator2.e(err);\n                        } finally{\n                            _iterator2.f();\n                        }\n                    }\n                    this._checkAttributeArray();\n                } else updated = false;\n                this.clearNeedsUpdate();\n                this.setNeedsRedraw();\n                return updated;\n            }\n        },\n        {\n            key: \"setConstantValue\",\n            value: function setConstantValue(value) {\n                if (value === undefined || typeof value === \"function\") return false;\n                var hasChanged = this.setData({\n                    constant: true,\n                    value: value\n                });\n                if (hasChanged) this.setNeedsRedraw();\n                this.clearNeedsUpdate();\n                return true;\n            }\n        },\n        {\n            key: \"setExternalBuffer\",\n            value: function setExternalBuffer(buffer) {\n                var state = this.state;\n                if (!buffer) {\n                    state.lastExternalBuffer = null;\n                    return false;\n                }\n                this.clearNeedsUpdate();\n                if (state.lastExternalBuffer === buffer) return true;\n                state.lastExternalBuffer = buffer;\n                this.setNeedsRedraw();\n                this.setData(buffer);\n                return true;\n            }\n        },\n        {\n            key: \"setBinaryValue\",\n            value: function setBinaryValue(buffer) {\n                var startIndices = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n                var state = this.state, settings = this.settings;\n                if (!buffer) {\n                    state.binaryValue = null;\n                    state.binaryAccessor = null;\n                    return false;\n                }\n                if (settings.noAlloc) return false;\n                if (state.binaryValue === buffer) {\n                    this.clearNeedsUpdate();\n                    return true;\n                }\n                state.binaryValue = buffer;\n                this.setNeedsRedraw();\n                if (ArrayBuffer.isView(buffer)) buffer = {\n                    value: buffer\n                };\n                var needsUpdate = settings.transform || startIndices !== this.startIndices;\n                if (needsUpdate) {\n                    (0, _assertDefault.default)(ArrayBuffer.isView(buffer.value), \"invalid \".concat(settings.accessor));\n                    var needsNormalize = buffer.size && buffer.size !== this.size;\n                    state.binaryAccessor = (0, _iterableUtils.getAccessorFromBuffer)(buffer.value, {\n                        size: buffer.size || this.size,\n                        stride: buffer.stride,\n                        offset: buffer.offset,\n                        startIndices: startIndices,\n                        nested: needsNormalize\n                    });\n                    return false;\n                }\n                this.clearNeedsUpdate();\n                this.setData(buffer);\n                return true;\n            }\n        },\n        {\n            key: \"getVertexOffset\",\n            value: function getVertexOffset(row) {\n                var startIndices = this.startIndices;\n                var vertexIndex = startIndices ? startIndices[row] : row;\n                return vertexIndex * this.size;\n            }\n        },\n        {\n            key: \"getShaderAttributes\",\n            value: function getShaderAttributes() {\n                var shaderAttributeDefs = this.settings.shaderAttributes || (0, _definePropertyDefault.default)({}, this.id, null);\n                var shaderAttributes = {};\n                for(var shaderAttributeName in shaderAttributeDefs)Object.assign(shaderAttributes, (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(Attribute1.prototype), \"getShaderAttributes\", this).call(this, shaderAttributeName, shaderAttributeDefs[shaderAttributeName]));\n                return shaderAttributes;\n            }\n        },\n        {\n            key: \"_autoUpdater\",\n            value: function _autoUpdater(attribute, _ref4) {\n                var data = _ref4.data, startRow = _ref4.startRow, endRow = _ref4.endRow, props = _ref4.props, numInstances = _ref4.numInstances;\n                if (attribute.constant) return;\n                var settings = attribute.settings, state = attribute.state, value = attribute.value, size = attribute.size, startIndices = attribute.startIndices;\n                var accessor = settings.accessor, transform = settings.transform;\n                var accessorFunc = state.binaryAccessor || (typeof accessor === \"function\" ? accessor : props[accessor]);\n                (0, _assertDefault.default)(typeof accessorFunc === \"function\", 'accessor \"'.concat(accessor, '\" is not a function'));\n                var i = attribute.getVertexOffset(startRow);\n                var _createIterable = (0, _iterableUtils.createIterable)(data, startRow, endRow), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n                var _iterator3 = _createForOfIteratorHelper(iterable), _step3;\n                try {\n                    for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                        var object = _step3.value;\n                        objectInfo.index++;\n                        var objectValue = accessorFunc(object, objectInfo);\n                        if (transform) objectValue = transform.call(this, objectValue);\n                        if (startIndices) {\n                            var numVertices = (objectInfo.index < startIndices.length - 1 ? startIndices[objectInfo.index + 1] : numInstances) - startIndices[objectInfo.index];\n                            if (objectValue && Array.isArray(objectValue[0])) {\n                                var startIndex = i;\n                                var _iterator4 = _createForOfIteratorHelper(objectValue), _step4;\n                                try {\n                                    for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n                                        var item = _step4.value;\n                                        attribute._normalizeValue(item, value, startIndex);\n                                        startIndex += size;\n                                    }\n                                } catch (err) {\n                                    _iterator4.e(err);\n                                } finally{\n                                    _iterator4.f();\n                                }\n                            } else if (objectValue && objectValue.length > size) value.set(objectValue, i);\n                            else {\n                                attribute._normalizeValue(objectValue, objectInfo.target, 0);\n                                (0, _flatten.fillArray)({\n                                    target: value,\n                                    source: objectInfo.target,\n                                    start: i,\n                                    count: numVertices\n                                });\n                            }\n                            i += numVertices * size;\n                        } else {\n                            attribute._normalizeValue(objectValue, value, i);\n                            i += size;\n                        }\n                    }\n                } catch (err) {\n                    _iterator3.e(err);\n                } finally{\n                    _iterator3.f();\n                }\n            }\n        },\n        {\n            key: \"_validateAttributeUpdaters\",\n            value: function _validateAttributeUpdaters() {\n                var settings = this.settings;\n                var hasUpdater = settings.noAlloc || typeof settings.update === \"function\";\n                if (!hasUpdater) throw new Error(\"Attribute \".concat(this.id, \" missing update or accessor\"));\n            }\n        },\n        {\n            key: \"_checkAttributeArray\",\n            value: function _checkAttributeArray() {\n                var value = this.value;\n                var limit = Math.min(4, this.size);\n                if (value && value.length >= limit) {\n                    var valid = true;\n                    switch(limit){\n                        case 4:\n                            valid = valid && Number.isFinite(value[3]);\n                        case 3:\n                            valid = valid && Number.isFinite(value[2]);\n                        case 2:\n                            valid = valid && Number.isFinite(value[1]);\n                        case 1:\n                            valid = valid && Number.isFinite(value[0]);\n                            break;\n                        default:\n                            valid = false;\n                    }\n                    if (!valid) throw new Error(\"Illegal attribute generated for \".concat(this.id));\n                }\n            }\n        },\n        {\n            key: \"startIndices\",\n            get: function get() {\n                return this.state.startIndices;\n            },\n            set: function set(layout) {\n                this.state.startIndices = layout;\n            }\n        }\n    ]);\n    return Attribute1;\n}((0, _dataColumnDefault.default));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./data-column\":\"bkJKC\",\"../../utils/assert\":\"8goZO\",\"../../utils/iterable-utils\":\"8gMuf\",\"../../utils/flatten\":\"1zGCw\",\"../../utils/range\":\"kL5Sg\",\"./attribute-transition-utils\":\"GR4Rl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bkJKC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>DataColumn);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _core = require(\"@luma.gl/core\");\nvar _shaderAttribute = require(\"./shader-attribute\");\nvar _shaderAttributeDefault = parcelHelpers.interopDefault(_shaderAttribute);\nvar _glUtils = require(\"./gl-utils\");\nvar _typedArrayManager = require(\"../../utils/typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _mathUtils = require(\"../../utils/math-utils\");\nvar _log = require(\"../../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction getStride(accessor) {\n    return accessor.stride || accessor.size * accessor.bytesPerElement;\n}\nfunction resolveShaderAttribute(baseAccessor, shaderAttributeOptions) {\n    if (shaderAttributeOptions.offset) (0, _logDefault.default).removed(\"shaderAttribute.offset\", \"vertexOffset, elementOffset\")();\n    var stride = getStride(baseAccessor);\n    var vertexOffset = \"vertexOffset\" in shaderAttributeOptions ? shaderAttributeOptions.vertexOffset : baseAccessor.vertexOffset || 0;\n    var elementOffset = shaderAttributeOptions.elementOffset || 0;\n    var offset = vertexOffset * stride + elementOffset * baseAccessor.bytesPerElement + (baseAccessor.offset || 0);\n    return _objectSpread(_objectSpread({}, shaderAttributeOptions), {}, {\n        offset: offset,\n        stride: stride\n    });\n}\nfunction resolveDoublePrecisionShaderAttributes(baseAccessor, shaderAttributeOptions) {\n    var resolvedOptions = resolveShaderAttribute(baseAccessor, shaderAttributeOptions);\n    return {\n        high: resolvedOptions,\n        low: _objectSpread(_objectSpread({}, resolvedOptions), {}, {\n            offset: resolvedOptions.offset + baseAccessor.size * 4\n        })\n    };\n}\nvar DataColumn = function() {\n    function DataColumn1(gl, opts) {\n        (0, _classCallCheckDefault.default)(this, DataColumn1);\n        this.gl = gl;\n        this.id = opts.id;\n        this.size = opts.size;\n        var logicalType = opts.logicalType || opts.type;\n        var doublePrecision = logicalType === 5130;\n        var defaultValue = opts.defaultValue;\n        defaultValue = Number.isFinite(defaultValue) ? [\n            defaultValue\n        ] : defaultValue || new Array(this.size).fill(0);\n        opts.defaultValue = defaultValue;\n        var bufferType = logicalType;\n        if (doublePrecision) bufferType = 5126;\n        else if (!bufferType && opts.isIndexed) bufferType = gl && (0, _core.hasFeature)(gl, (0, _core.FEATURES).ELEMENT_INDEX_UINT32) ? 5125 : 5123;\n        else if (!bufferType) bufferType = 5126;\n        opts.logicalType = logicalType;\n        opts.type = bufferType;\n        var defaultType = (0, _glUtils.glArrayFromType)(logicalType || bufferType || 5126);\n        this.shaderAttributes = {};\n        this.doublePrecision = doublePrecision;\n        if (doublePrecision && opts.fp64 === false) defaultType = Float32Array;\n        opts.bytesPerElement = defaultType.BYTES_PER_ELEMENT;\n        this.defaultType = defaultType;\n        this.value = null;\n        this.settings = opts;\n        this.state = {\n            externalBuffer: null,\n            bufferAccessor: opts,\n            allocatedValue: null,\n            constant: false\n        };\n        this._buffer = null;\n        this.setData(opts);\n    }\n    (0, _createClassDefault.default)(DataColumn1, [\n        {\n            key: \"delete\",\n            value: function _delete() {\n                if (this._buffer) {\n                    this._buffer[\"delete\"]();\n                    this._buffer = null;\n                }\n                (0, _typedArrayManagerDefault.default).release(this.state.allocatedValue);\n            }\n        },\n        {\n            key: \"getShaderAttributes\",\n            value: function getShaderAttributes(id, options) {\n                if (this.doublePrecision) {\n                    var shaderAttributes = {};\n                    var isBuffer64Bit = this.value instanceof Float64Array;\n                    var doubleShaderAttributeDefs = resolveDoublePrecisionShaderAttributes(this.getAccessor(), options || {});\n                    shaderAttributes[id] = new (0, _shaderAttributeDefault.default)(this, doubleShaderAttributeDefs.high);\n                    shaderAttributes[\"\".concat(id, \"64Low\")] = isBuffer64Bit ? new (0, _shaderAttributeDefault.default)(this, doubleShaderAttributeDefs.low) : new Float32Array(this.size);\n                    return shaderAttributes;\n                }\n                if (options) {\n                    var shaderAttributeDef = resolveShaderAttribute(this.getAccessor(), options);\n                    return (0, _definePropertyDefault.default)({}, id, new (0, _shaderAttributeDefault.default)(this, shaderAttributeDef));\n                }\n                return (0, _definePropertyDefault.default)({}, id, this);\n            }\n        },\n        {\n            key: \"getBuffer\",\n            value: function getBuffer() {\n                if (this.state.constant) return null;\n                return this.state.externalBuffer || this._buffer;\n            }\n        },\n        {\n            key: \"getValue\",\n            value: function getValue() {\n                if (this.state.constant) return this.value;\n                return [\n                    this.getBuffer(),\n                    this.getAccessor()\n                ];\n            }\n        },\n        {\n            key: \"getAccessor\",\n            value: function getAccessor() {\n                return this.state.bufferAccessor;\n            }\n        },\n        {\n            key: \"setData\",\n            value: function setData(opts) {\n                var state = this.state;\n                if (ArrayBuffer.isView(opts)) opts = {\n                    value: opts\n                };\n                else if (opts instanceof (0, _core.Buffer)) opts = {\n                    buffer: opts\n                };\n                var accessor = _objectSpread(_objectSpread({}, this.settings), opts);\n                state.bufferAccessor = accessor;\n                if (opts.constant) {\n                    var value = opts.value;\n                    value = this._normalizeValue(value, [], 0);\n                    if (this.settings.normalized) value = this._normalizeConstant(value);\n                    var hasChanged = !state.constant || !this._areValuesEqual(value, this.value);\n                    if (!hasChanged) return false;\n                    state.externalBuffer = null;\n                    state.constant = true;\n                    this.value = value;\n                } else if (opts.buffer) {\n                    var buffer = opts.buffer;\n                    state.externalBuffer = buffer;\n                    state.constant = false;\n                    this.value = opts.value;\n                    var isBuffer64Bit = opts.value instanceof Float64Array;\n                    accessor.type = opts.type || buffer.accessor.type;\n                    accessor.bytesPerElement = buffer.accessor.BYTES_PER_ELEMENT * (isBuffer64Bit ? 2 : 1);\n                    accessor.stride = getStride(accessor);\n                } else if (opts.value) {\n                    this._checkExternalBuffer(opts);\n                    var _value = opts.value;\n                    state.externalBuffer = null;\n                    state.constant = false;\n                    this.value = _value;\n                    accessor.bytesPerElement = _value.BYTES_PER_ELEMENT;\n                    accessor.stride = getStride(accessor);\n                    var _buffer = this.buffer, byteOffset = this.byteOffset;\n                    if (this.doublePrecision && _value instanceof Float64Array) _value = (0, _mathUtils.toDoublePrecisionArray)(_value, accessor);\n                    var requiredBufferSize = _value.byteLength + byteOffset + accessor.stride * 2;\n                    if (_buffer.byteLength < requiredBufferSize) _buffer.reallocate(requiredBufferSize);\n                    _buffer.setAccessor(null);\n                    _buffer.subData({\n                        data: _value,\n                        offset: byteOffset\n                    });\n                    accessor.type = opts.type || _buffer.accessor.type;\n                }\n                return true;\n            }\n        },\n        {\n            key: \"updateSubBuffer\",\n            value: function updateSubBuffer() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var value = this.value;\n                var _opts$startOffset = opts.startOffset, startOffset = _opts$startOffset === void 0 ? 0 : _opts$startOffset, endOffset = opts.endOffset;\n                this.buffer.subData({\n                    data: this.doublePrecision && value instanceof Float64Array ? (0, _mathUtils.toDoublePrecisionArray)(value, {\n                        size: this.size,\n                        startIndex: startOffset,\n                        endIndex: endOffset\n                    }) : value.subarray(startOffset, endOffset),\n                    offset: startOffset * value.BYTES_PER_ELEMENT + this.byteOffset\n                });\n            }\n        },\n        {\n            key: \"allocate\",\n            value: function allocate(_ref3) {\n                var numInstances = _ref3.numInstances, _ref3$copy = _ref3.copy, copy = _ref3$copy === void 0 ? false : _ref3$copy;\n                var state = this.state;\n                var oldValue = state.allocatedValue;\n                var value = (0, _typedArrayManagerDefault.default).allocate(oldValue, numInstances + 1, {\n                    size: this.size,\n                    type: this.defaultType,\n                    copy: copy\n                });\n                this.value = value;\n                var buffer = this.buffer, byteOffset = this.byteOffset;\n                if (buffer.byteLength < value.byteLength + byteOffset) {\n                    buffer.reallocate(value.byteLength + byteOffset);\n                    if (copy && oldValue) buffer.subData({\n                        data: oldValue instanceof Float64Array ? (0, _mathUtils.toDoublePrecisionArray)(oldValue, this) : oldValue,\n                        offset: byteOffset\n                    });\n                }\n                state.allocatedValue = value;\n                state.constant = false;\n                state.externalBuffer = null;\n                state.bufferAccessor = this.settings;\n                return true;\n            }\n        },\n        {\n            key: \"_checkExternalBuffer\",\n            value: function _checkExternalBuffer(opts) {\n                var value = opts.value;\n                if (!opts.constant && value) {\n                    var ArrayType = this.defaultType;\n                    var illegalArrayType = false;\n                    if (this.doublePrecision) illegalArrayType = value.BYTES_PER_ELEMENT < 4;\n                    if (illegalArrayType) throw new Error(\"Attribute \".concat(this.id, \" does not support \").concat(value.constructor.name));\n                    if (!(value instanceof ArrayType) && this.settings.normalized && !(\"normalized\" in opts)) (0, _logDefault.default).warn(\"Attribute \".concat(this.id, \" is normalized\"))();\n                }\n            }\n        },\n        {\n            key: \"_normalizeConstant\",\n            value: function _normalizeConstant(value) {\n                switch(this.settings.type){\n                    case 5120:\n                        return new Float32Array(value).map(function(x) {\n                            return (x + 128) / 255 * 2 - 1;\n                        });\n                    case 5122:\n                        return new Float32Array(value).map(function(x) {\n                            return (x + 32768) / 65535 * 2 - 1;\n                        });\n                    case 5121:\n                        return new Float32Array(value).map(function(x) {\n                            return x / 255;\n                        });\n                    case 5123:\n                        return new Float32Array(value).map(function(x) {\n                            return x / 65535;\n                        });\n                    default:\n                        return value;\n                }\n            }\n        },\n        {\n            key: \"_normalizeValue\",\n            value: function _normalizeValue(value, out, start) {\n                var _this$settings = this.settings, defaultValue = _this$settings.defaultValue, size = _this$settings.size;\n                if (Number.isFinite(value)) {\n                    out[start] = value;\n                    return out;\n                }\n                if (!value) {\n                    out[start] = defaultValue[0];\n                    return out;\n                }\n                switch(size){\n                    case 4:\n                        out[start + 3] = Number.isFinite(value[3]) ? value[3] : defaultValue[3];\n                    case 3:\n                        out[start + 2] = Number.isFinite(value[2]) ? value[2] : defaultValue[2];\n                    case 2:\n                        out[start + 1] = Number.isFinite(value[1]) ? value[1] : defaultValue[1];\n                    case 1:\n                        out[start + 0] = Number.isFinite(value[0]) ? value[0] : defaultValue[0];\n                        break;\n                    default:\n                        var i = size;\n                        while(--i >= 0)out[start + i] = Number.isFinite(value[i]) ? value[i] : defaultValue[i];\n                }\n                return out;\n            }\n        },\n        {\n            key: \"_areValuesEqual\",\n            value: function _areValuesEqual(value1, value2) {\n                if (!value1 || !value2) return false;\n                var size = this.size;\n                for(var i = 0; i < size; i++){\n                    if (value1[i] !== value2[i]) return false;\n                }\n                return true;\n            }\n        },\n        {\n            key: \"buffer\",\n            get: function get() {\n                if (!this._buffer) {\n                    var _this$settings2 = this.settings, isIndexed = _this$settings2.isIndexed, type = _this$settings2.type;\n                    this._buffer = new (0, _core.Buffer)(this.gl, {\n                        id: this.id,\n                        target: isIndexed ? 34963 : 34962,\n                        accessor: {\n                            type: type\n                        }\n                    });\n                }\n                return this._buffer;\n            }\n        },\n        {\n            key: \"byteOffset\",\n            get: function get() {\n                var accessor = this.getAccessor();\n                if (accessor.vertexOffset) return accessor.vertexOffset * getStride(accessor);\n                return 0;\n            }\n        }\n    ]);\n    return DataColumn1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@luma.gl/core\":\"bW3Qv\",\"./shader-attribute\":\"aAKKT\",\"./gl-utils\":\"edglJ\",\"../../utils/typed-array-manager\":\"91rvg\",\"../../utils/math-utils\":\"jmX3c\",\"../../utils/log\":\"fg4UT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aAKKT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ShaderAttribute);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar ShaderAttribute = function() {\n    function ShaderAttribute1(dataColumn, opts) {\n        (0, _classCallCheckDefault.default)(this, ShaderAttribute1);\n        this.opts = opts;\n        this.source = dataColumn;\n    }\n    (0, _createClassDefault.default)(ShaderAttribute1, [\n        {\n            key: \"getValue\",\n            value: function getValue() {\n                var buffer = this.source.getBuffer();\n                var accessor = this.getAccessor();\n                if (buffer) return [\n                    buffer,\n                    accessor\n                ];\n                var value = this.source.value;\n                var size = accessor.size;\n                var constantValue = value;\n                if (value && value.length !== size) {\n                    constantValue = new Float32Array(size);\n                    var index = accessor.elementOffset || 0;\n                    for(var i = 0; i < size; ++i)constantValue[i] = value[index + i];\n                }\n                return constantValue;\n            }\n        },\n        {\n            key: \"getAccessor\",\n            value: function getAccessor() {\n                return _objectSpread(_objectSpread({}, this.source.getAccessor()), this.opts);\n            }\n        },\n        {\n            key: \"value\",\n            get: function get() {\n                return this.source.value;\n            }\n        }\n    ]);\n    return ShaderAttribute1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"edglJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"glArrayFromType\", ()=>glArrayFromType);\nfunction glArrayFromType(glType) {\n    switch(glType){\n        case 5126:\n            return Float32Array;\n        case 5130:\n            return Float64Array;\n        case 5123:\n        case 33635:\n        case 32819:\n        case 32820:\n            return Uint16Array;\n        case 5125:\n            return Uint32Array;\n        case 5121:\n            return Uint8ClampedArray;\n        case 5120:\n            return Int8Array;\n        case 5122:\n            return Int16Array;\n        case 5124:\n            return Int32Array;\n        default:\n            throw new Error(\"Unknown GL type\");\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8gMuf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createIterable\", ()=>createIterable);\nparcelHelpers.export(exports, \"isAsyncIterable\", ()=>isAsyncIterable);\nparcelHelpers.export(exports, \"getAccessorFromBuffer\", ()=>getAccessorFromBuffer);\nvar EMPTY_ARRAY = [];\nvar placeholderArray = [];\nfunction createIterable(data) {\n    var startRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n    var endRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Infinity;\n    var iterable = EMPTY_ARRAY;\n    var objectInfo = {\n        index: -1,\n        data: data,\n        target: []\n    };\n    if (!data) iterable = EMPTY_ARRAY;\n    else if (typeof data[Symbol.iterator] === \"function\") iterable = data;\n    else if (data.length > 0) {\n        placeholderArray.length = data.length;\n        iterable = placeholderArray;\n    }\n    if (startRow > 0 || Number.isFinite(endRow)) {\n        iterable = (Array.isArray(iterable) ? iterable : Array.from(iterable)).slice(startRow, endRow);\n        objectInfo.index = startRow - 1;\n    }\n    return {\n        iterable: iterable,\n        objectInfo: objectInfo\n    };\n}\nfunction isAsyncIterable(data) {\n    return data && data[Symbol.asyncIterator];\n}\nfunction getAccessorFromBuffer(typedArray, _ref) {\n    var size = _ref.size, stride = _ref.stride, offset = _ref.offset, startIndices = _ref.startIndices, nested = _ref.nested;\n    var bytesPerElement = typedArray.BYTES_PER_ELEMENT;\n    var elementStride = stride ? stride / bytesPerElement : size;\n    var elementOffset = offset ? offset / bytesPerElement : 0;\n    var vertexCount = Math.floor((typedArray.length - elementOffset) / elementStride);\n    return function(_, _ref2) {\n        var index = _ref2.index, target = _ref2.target;\n        if (!startIndices) {\n            var sourceIndex = index * elementStride + elementOffset;\n            for(var j = 0; j < size; j++)target[j] = typedArray[sourceIndex + j];\n            return target;\n        }\n        var startIndex = startIndices[index];\n        var endIndex = startIndices[index + 1] || vertexCount;\n        var result;\n        if (nested) {\n            result = new Array(endIndex - startIndex);\n            for(var i = startIndex; i < endIndex; i++){\n                var _sourceIndex = i * elementStride + elementOffset;\n                target = new Array(size);\n                for(var _j = 0; _j < size; _j++)target[_j] = typedArray[_sourceIndex + _j];\n                result[i - startIndex] = target;\n            }\n        } else if (elementStride === size) result = typedArray.subarray(startIndex * size + elementOffset, endIndex * size + elementOffset);\n        else {\n            result = new typedArray.constructor((endIndex - startIndex) * size);\n            var targetIndex = 0;\n            for(var _i = startIndex; _i < endIndex; _i++){\n                var _sourceIndex2 = _i * elementStride + elementOffset;\n                for(var _j2 = 0; _j2 < size; _j2++)result[targetIndex++] = typedArray[_sourceIndex2 + _j2];\n            }\n        }\n        return result;\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1zGCw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"flatten\", ()=>flatten);\nparcelHelpers.export(exports, \"fillArray\", ()=>fillArray);\nfunction flatten(array) {\n    var filter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function() {\n        return true;\n    };\n    if (!Array.isArray(array)) return filter(array) ? [\n        array\n    ] : [];\n    return flattenArray(array, filter, []);\n}\nfunction flattenArray(array, filter, result) {\n    var index = -1;\n    while(++index < array.length){\n        var value = array[index];\n        if (Array.isArray(value)) flattenArray(value, filter, result);\n        else if (filter(value)) result.push(value);\n    }\n    return result;\n}\nfunction fillArray(_ref) {\n    var target = _ref.target, source = _ref.source, _ref$start = _ref.start, start = _ref$start === void 0 ? 0 : _ref$start, _ref$count = _ref.count, count = _ref$count === void 0 ? 1 : _ref$count;\n    var length = source.length;\n    var total = count * length;\n    var copied = 0;\n    for(var i = start; copied < length; copied++)target[i++] = source[copied];\n    while(copied < total)if (copied < total - copied) {\n        target.copyWithin(start + copied, start, start + copied);\n        copied *= 2;\n    } else {\n        target.copyWithin(start + copied, start, start + total - copied);\n        copied = total;\n    }\n    return target;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kL5Sg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"EMPTY\", ()=>EMPTY);\nparcelHelpers.export(exports, \"FULL\", ()=>FULL);\nparcelHelpers.export(exports, \"add\", ()=>add);\nvar EMPTY = [];\nvar FULL = [\n    [\n        0,\n        Infinity\n    ]\n];\nfunction add(rangeList, range) {\n    if (rangeList === FULL) return rangeList;\n    if (range[0] < 0) range[0] = 0;\n    if (range[0] >= range[1]) return rangeList;\n    var newRangeList = [];\n    var len = rangeList.length;\n    var insertPosition = 0;\n    for(var i = 0; i < len; i++){\n        var range0 = rangeList[i];\n        if (range0[1] < range[0]) {\n            newRangeList.push(range0);\n            insertPosition = i + 1;\n        } else if (range0[0] > range[1]) newRangeList.push(range0);\n        else range = [\n            Math.min(range0[0], range[0]),\n            Math.max(range0[1], range[1])\n        ];\n    }\n    newRangeList.splice(insertPosition, 0, range);\n    return newRangeList;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"GR4Rl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalizeTransitionSettings\", ()=>normalizeTransitionSettings);\nparcelHelpers.export(exports, \"getSourceBufferAttribute\", ()=>getSourceBufferAttribute);\nparcelHelpers.export(exports, \"getAttributeTypeFromSize\", ()=>getAttributeTypeFromSize);\nparcelHelpers.export(exports, \"cycleBuffers\", ()=>cycleBuffers);\nparcelHelpers.export(exports, \"getAttributeBufferLength\", ()=>getAttributeBufferLength);\nparcelHelpers.export(exports, \"padBuffer\", ()=>padBuffer);\nvar _arrayUtils = require(\"../../utils/array-utils\");\nvar DEFAULT_TRANSITION_SETTINGS = {\n    interpolation: {\n        duration: 0,\n        easing: function easing(t) {\n            return t;\n        }\n    },\n    spring: {\n        stiffness: 0.05,\n        damping: 0.5\n    }\n};\nfunction normalizeTransitionSettings(userSettings, layerSettings) {\n    if (!userSettings) return null;\n    if (Number.isFinite(userSettings)) userSettings = {\n        duration: userSettings\n    };\n    userSettings.type = userSettings.type || \"interpolation\";\n    return Object.assign({}, DEFAULT_TRANSITION_SETTINGS[userSettings.type], layerSettings, userSettings);\n}\nfunction getSourceBufferAttribute(gl, attribute) {\n    var buffer = attribute.getBuffer();\n    if (buffer) return [\n        attribute.getBuffer(),\n        {\n            divisor: 0,\n            size: attribute.size,\n            normalized: attribute.settings.normalized\n        }\n    ];\n    return attribute.value;\n}\nfunction getAttributeTypeFromSize(size) {\n    switch(size){\n        case 1:\n            return \"float\";\n        case 2:\n            return \"vec2\";\n        case 3:\n            return \"vec3\";\n        case 4:\n            return \"vec4\";\n        default:\n            throw new Error('No defined attribute type for size \"'.concat(size, '\"'));\n    }\n}\nfunction cycleBuffers(buffers) {\n    buffers.push(buffers.shift());\n}\nfunction getAttributeBufferLength(attribute, numInstances) {\n    var doublePrecision = attribute.doublePrecision, settings = attribute.settings, value = attribute.value, size = attribute.size;\n    var multiplier = doublePrecision ? 2 : 1;\n    return (settings.noAlloc ? value.length : numInstances * size) * multiplier;\n}\nfunction padBuffer(_ref) {\n    var buffer = _ref.buffer, numInstances = _ref.numInstances, attribute = _ref.attribute, fromLength = _ref.fromLength, fromStartIndices = _ref.fromStartIndices, _ref$getData = _ref.getData, getData = _ref$getData === void 0 ? function(x) {\n        return x;\n    } : _ref$getData;\n    var precisionMultiplier = attribute.doublePrecision ? 2 : 1;\n    var size = attribute.size * precisionMultiplier;\n    var byteOffset = attribute.byteOffset;\n    var toStartIndices = attribute.startIndices;\n    var hasStartIndices = fromStartIndices && toStartIndices;\n    var toLength = getAttributeBufferLength(attribute, numInstances);\n    var isConstant = attribute.state.constant;\n    if (!hasStartIndices && fromLength >= toLength) return;\n    var toData = isConstant ? attribute.value : attribute.getBuffer().getData({\n        srcByteOffset: byteOffset\n    });\n    if (attribute.settings.normalized && !isConstant) {\n        var getter = getData;\n        getData = function getData(value, chunk) {\n            return attribute._normalizeConstant(getter(value, chunk));\n        };\n    }\n    var getMissingData = isConstant ? function(i, chunk) {\n        return getData(toData, chunk);\n    } : function(i, chunk) {\n        return getData(toData.subarray(i, i + size), chunk);\n    };\n    var source = buffer.getData({\n        length: fromLength\n    });\n    var data = new Float32Array(toLength);\n    (0, _arrayUtils.padArray)({\n        source: source,\n        target: data,\n        sourceStartIndices: fromStartIndices,\n        targetStartIndices: toStartIndices,\n        size: size,\n        getData: getMissingData\n    });\n    if (buffer.byteLength < data.byteLength + byteOffset) buffer.reallocate(data.byteLength + byteOffset);\n    buffer.subData({\n        data: data,\n        offset: byteOffset\n    });\n}\n\n},{\"../../utils/array-utils\":\"de00Q\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"de00Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"padArray\", ()=>padArray);\nfunction padArrayChunk(_ref) {\n    var source = _ref.source, target = _ref.target, _ref$start = _ref.start, start = _ref$start === void 0 ? 0 : _ref$start, end = _ref.end, getData = _ref.getData;\n    end = end || target.length;\n    var sourceLength = source.length;\n    var targetLength = end - start;\n    if (sourceLength > targetLength) {\n        target.set(source.subarray(0, targetLength), start);\n        return;\n    }\n    target.set(source, start);\n    if (!getData) return;\n    var i = sourceLength;\n    while(i < targetLength){\n        var datum = getData(i, source);\n        for(var j = 0; j < datum.length; j++){\n            target[start + i] = datum[j];\n            i++;\n        }\n    }\n}\nfunction padArray(_ref2) {\n    var source = _ref2.source, target = _ref2.target, size = _ref2.size, getData = _ref2.getData, sourceStartIndices = _ref2.sourceStartIndices, targetStartIndices = _ref2.targetStartIndices;\n    if (!Array.isArray(targetStartIndices)) {\n        padArrayChunk({\n            source: source,\n            target: target,\n            getData: getData\n        });\n        return target;\n    }\n    var sourceIndex = 0;\n    var targetIndex = 0;\n    var getChunkData = getData && function(i, chunk) {\n        return getData(i + targetIndex, chunk);\n    };\n    var n = Math.min(sourceStartIndices.length, targetStartIndices.length);\n    for(var i1 = 1; i1 < n; i1++){\n        var nextSourceIndex = sourceStartIndices[i1] * size;\n        var nextTargetIndex = targetStartIndices[i1] * size;\n        padArrayChunk({\n            source: source.subarray(sourceIndex, nextSourceIndex),\n            target: target,\n            start: targetIndex,\n            end: nextTargetIndex,\n            getData: getChunkData\n        });\n        sourceIndex = nextSourceIndex;\n        targetIndex = nextTargetIndex;\n    }\n    if (targetIndex < target.length) padArrayChunk({\n        source: [],\n        target: target,\n        start: targetIndex,\n        getData: getChunkData\n    });\n    return target;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aZW5q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>AttributeTransitionManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _gpuInterpolationTransition = require(\"../../transitions/gpu-interpolation-transition\");\nvar _gpuInterpolationTransitionDefault = parcelHelpers.interopDefault(_gpuInterpolationTransition);\nvar _gpuSpringTransition = require(\"../../transitions/gpu-spring-transition\");\nvar _gpuSpringTransitionDefault = parcelHelpers.interopDefault(_gpuSpringTransition);\nvar _log = require(\"../../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar TRANSITION_TYPES = {\n    interpolation: (0, _gpuInterpolationTransitionDefault.default),\n    spring: (0, _gpuSpringTransitionDefault.default)\n};\nvar AttributeTransitionManager = function() {\n    function AttributeTransitionManager1(gl, _ref) {\n        var id = _ref.id, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, AttributeTransitionManager1);\n        this.id = id;\n        this.gl = gl;\n        this.timeline = timeline;\n        this.transitions = {};\n        this.needsRedraw = false;\n        this.numInstances = 1;\n        if ((0, _core.Transform).isSupported(gl)) this.isSupported = true;\n        else if (gl) (0, _logDefault.default).warn(\"WebGL2 not supported by this browser. Transition animation is disabled.\")();\n    }\n    (0, _createClassDefault.default)(AttributeTransitionManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var attributeName in this.transitions)this._removeTransition(attributeName);\n            }\n        },\n        {\n            key: \"update\",\n            value: function update(_ref2) {\n                var attributes = _ref2.attributes, _ref2$transitions = _ref2.transitions, transitions = _ref2$transitions === void 0 ? {} : _ref2$transitions, numInstances = _ref2.numInstances;\n                this.numInstances = numInstances || 1;\n                if (!this.isSupported) return;\n                for(var attributeName in attributes){\n                    var attribute = attributes[attributeName];\n                    var settings = attribute.getTransitionSetting(transitions);\n                    if (!settings) continue;\n                    this._updateAttribute(attributeName, attribute, settings);\n                }\n                for(var _attributeName in this.transitions){\n                    var _attribute = attributes[_attributeName];\n                    if (!_attribute || !_attribute.getTransitionSetting(transitions)) this._removeTransition(_attributeName);\n                }\n            }\n        },\n        {\n            key: \"hasAttribute\",\n            value: function hasAttribute(attributeName) {\n                var transition = this.transitions[attributeName];\n                return transition && transition.inProgress;\n            }\n        },\n        {\n            key: \"getAttributes\",\n            value: function getAttributes() {\n                var animatedAttributes = {};\n                for(var attributeName in this.transitions){\n                    var transition = this.transitions[attributeName];\n                    if (transition.inProgress) animatedAttributes[attributeName] = transition.attributeInTransition;\n                }\n                return animatedAttributes;\n            }\n        },\n        {\n            key: \"run\",\n            value: function run() {\n                if (!this.isSupported || this.numInstances === 0) return false;\n                for(var attributeName in this.transitions){\n                    var updated = this.transitions[attributeName].update();\n                    if (updated) this.needsRedraw = true;\n                }\n                var needsRedraw = this.needsRedraw;\n                this.needsRedraw = false;\n                return needsRedraw;\n            }\n        },\n        {\n            key: \"_removeTransition\",\n            value: function _removeTransition(attributeName) {\n                this.transitions[attributeName].cancel();\n                delete this.transitions[attributeName];\n            }\n        },\n        {\n            key: \"_updateAttribute\",\n            value: function _updateAttribute(attributeName, attribute, settings) {\n                var transition = this.transitions[attributeName];\n                var isNew = !transition || transition.type !== settings.type;\n                if (isNew) {\n                    if (transition) this._removeTransition(attributeName);\n                    var TransitionType = TRANSITION_TYPES[settings.type];\n                    if (TransitionType) this.transitions[attributeName] = new TransitionType({\n                        attribute: attribute,\n                        timeline: this.timeline,\n                        gl: this.gl\n                    });\n                    else {\n                        (0, _logDefault.default).error(\"unsupported transition type '\".concat(settings.type, \"'\"))();\n                        isNew = false;\n                    }\n                }\n                if (isNew || attribute.needsRedraw()) {\n                    this.needsRedraw = true;\n                    this.transitions[attributeName].start(settings, this.numInstances);\n                }\n            }\n        }\n    ]);\n    return AttributeTransitionManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/core\":\"bW3Qv\",\"../../transitions/gpu-interpolation-transition\":\"2ZWot\",\"../../transitions/gpu-spring-transition\":\"jN7zx\",\"../../utils/log\":\"fg4UT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2ZWot\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GPUInterpolationTransition);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _attribute = require(\"../lib/attribute/attribute\");\nvar _attributeDefault = parcelHelpers.interopDefault(_attribute);\nvar _attributeTransitionUtils = require(\"../lib/attribute/attribute-transition-utils\");\nvar _transition = require(\"./transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar GPUInterpolationTransition = function() {\n    function GPUInterpolationTransition1(_ref) {\n        var gl = _ref.gl, attribute = _ref.attribute, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, GPUInterpolationTransition1);\n        this.gl = gl;\n        this.type = \"interpolation\";\n        this.transition = new (0, _transitionDefault.default)(timeline);\n        this.attribute = attribute;\n        this.attributeInTransition = new (0, _attributeDefault.default)(gl, attribute.settings);\n        this.currentStartIndices = attribute.startIndices;\n        this.currentLength = 0;\n        this.transform = getTransform(gl, attribute);\n        var bufferOpts = {\n            byteLength: 0,\n            usage: 35050\n        };\n        this.buffers = [\n            new (0, _core.Buffer)(gl, bufferOpts),\n            new (0, _core.Buffer)(gl, bufferOpts)\n        ];\n    }\n    (0, _createClassDefault.default)(GPUInterpolationTransition1, [\n        {\n            key: \"start\",\n            value: function start(transitionSettings, numInstances) {\n                if (transitionSettings.duration <= 0) {\n                    this.transition.cancel();\n                    return;\n                }\n                var gl = this.gl, buffers = this.buffers, attribute = this.attribute;\n                (0, _attributeTransitionUtils.cycleBuffers)(buffers);\n                var padBufferOpts = {\n                    numInstances: numInstances,\n                    attribute: attribute,\n                    fromLength: this.currentLength,\n                    fromStartIndices: this.currentStartIndices,\n                    getData: transitionSettings.enter\n                };\n                var _iterator = _createForOfIteratorHelper(buffers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var buffer = _step.value;\n                        (0, _attributeTransitionUtils.padBuffer)(_objectSpread({\n                            buffer: buffer\n                        }, padBufferOpts));\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                this.currentStartIndices = attribute.startIndices;\n                this.currentLength = (0, _attributeTransitionUtils.getAttributeBufferLength)(attribute, numInstances);\n                this.attributeInTransition.update({\n                    buffer: buffers[1],\n                    value: attribute.value\n                });\n                this.transition.start(transitionSettings);\n                this.transform.update({\n                    elementCount: Math.floor(this.currentLength / attribute.size),\n                    sourceBuffers: {\n                        aFrom: buffers[0],\n                        aTo: (0, _attributeTransitionUtils.getSourceBufferAttribute)(gl, attribute)\n                    },\n                    feedbackBuffers: {\n                        vCurrent: buffers[1]\n                    }\n                });\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var updated = this.transition.update();\n                if (updated) {\n                    var _this$transition = this.transition, time = _this$transition.time, _this$transition$sett = _this$transition.settings, duration = _this$transition$sett.duration, easing = _this$transition$sett.easing;\n                    var t = easing(time / duration);\n                    this.transform.run({\n                        uniforms: {\n                            time: t\n                        }\n                    });\n                }\n                return updated;\n            }\n        },\n        {\n            key: \"cancel\",\n            value: function cancel() {\n                this.transition.cancel();\n                this.transform[\"delete\"]();\n                while(this.buffers.length)this.buffers.pop()[\"delete\"]();\n            }\n        },\n        {\n            key: \"inProgress\",\n            get: function get() {\n                return this.transition.inProgress;\n            }\n        }\n    ]);\n    return GPUInterpolationTransition1;\n}();\nvar vs = \"\\n#define SHADER_NAME interpolation-transition-vertex-shader\\n\\nuniform float time;\\nattribute ATTRIBUTE_TYPE aFrom;\\nattribute ATTRIBUTE_TYPE aTo;\\nvarying ATTRIBUTE_TYPE vCurrent;\\n\\nvoid main(void) {\\n  vCurrent = mix(aFrom, aTo, time);\\n  gl_Position = vec4(0.0);\\n}\\n\";\nfunction getTransform(gl, attribute) {\n    var attributeType = (0, _attributeTransitionUtils.getAttributeTypeFromSize)(attribute.size);\n    return new (0, _core.Transform)(gl, {\n        vs: vs,\n        defines: {\n            ATTRIBUTE_TYPE: attributeType\n        },\n        varyings: [\n            \"vCurrent\"\n        ]\n    });\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/core\":\"bW3Qv\",\"../lib/attribute/attribute\":\"2a0SU\",\"../lib/attribute/attribute-transition-utils\":\"GR4Rl\",\"./transition\":\"fGNeu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fGNeu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Transition);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nfunction noop() {}\nvar DEFAULT_SETTINGS = {\n    onStart: noop,\n    onUpdate: noop,\n    onInterrupt: noop,\n    onEnd: noop\n};\nvar Transition = function() {\n    function Transition1(timeline) {\n        (0, _classCallCheckDefault.default)(this, Transition1);\n        this._inProgress = false;\n        this._handle = null;\n        this.timeline = timeline;\n        this.settings = {};\n    }\n    (0, _createClassDefault.default)(Transition1, [\n        {\n            key: \"start\",\n            value: function start(props) {\n                this.cancel();\n                this.settings = Object.assign({}, DEFAULT_SETTINGS, props);\n                this._inProgress = true;\n                this.settings.onStart(this);\n            }\n        },\n        {\n            key: \"end\",\n            value: function end() {\n                if (this._inProgress) {\n                    this.timeline.removeChannel(this._handle);\n                    this._handle = null;\n                    this._inProgress = false;\n                    this.settings.onEnd(this);\n                }\n            }\n        },\n        {\n            key: \"cancel\",\n            value: function cancel() {\n                if (this._inProgress) {\n                    this.settings.onInterrupt(this);\n                    this.timeline.removeChannel(this._handle);\n                    this._handle = null;\n                    this._inProgress = false;\n                }\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                if (!this._inProgress) return false;\n                if (this._handle === null) {\n                    var timeline = this.timeline, settings = this.settings;\n                    this._handle = timeline.addChannel({\n                        delay: timeline.getTime(),\n                        duration: settings.duration\n                    });\n                }\n                this.time = this.timeline.getTime(this._handle);\n                this._onUpdate();\n                this.settings.onUpdate(this);\n                if (this.timeline.isFinished(this._handle)) this.end();\n                return true;\n            }\n        },\n        {\n            key: \"_onUpdate\",\n            value: function _onUpdate() {}\n        },\n        {\n            key: \"inProgress\",\n            get: function get() {\n                return this._inProgress;\n            }\n        }\n    ]);\n    return Transition1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jN7zx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GPUSpringTransition);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _attributeTransitionUtils = require(\"../lib/attribute/attribute-transition-utils\");\nvar _attribute = require(\"../lib/attribute/attribute\");\nvar _attributeDefault = parcelHelpers.interopDefault(_attribute);\nvar _transition = require(\"./transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar GPUSpringTransition = function() {\n    function GPUSpringTransition1(_ref) {\n        var gl = _ref.gl, attribute = _ref.attribute, timeline = _ref.timeline;\n        (0, _classCallCheckDefault.default)(this, GPUSpringTransition1);\n        this.gl = gl;\n        this.type = \"spring\";\n        this.transition = new (0, _transitionDefault.default)(timeline);\n        this.attribute = attribute;\n        this.attributeInTransition = new (0, _attributeDefault.default)(gl, Object.assign({}, attribute.settings, {\n            normalized: false\n        }));\n        this.currentStartIndices = attribute.startIndices;\n        this.currentLength = 0;\n        this.texture = getTexture(gl);\n        this.framebuffer = getFramebuffer(gl, this.texture);\n        this.transform = getTransform(gl, attribute, this.framebuffer);\n        var bufferOpts = {\n            byteLength: 0,\n            usage: 35050\n        };\n        this.buffers = [\n            new (0, _core.Buffer)(gl, bufferOpts),\n            new (0, _core.Buffer)(gl, bufferOpts),\n            new (0, _core.Buffer)(gl, bufferOpts)\n        ];\n    }\n    (0, _createClassDefault.default)(GPUSpringTransition1, [\n        {\n            key: \"start\",\n            value: function start(transitionSettings, numInstances) {\n                var gl = this.gl, buffers = this.buffers, attribute = this.attribute;\n                var padBufferOpts = {\n                    numInstances: numInstances,\n                    attribute: attribute,\n                    fromLength: this.currentLength,\n                    fromStartIndices: this.currentStartIndices,\n                    getData: transitionSettings.enter\n                };\n                var _iterator = _createForOfIteratorHelper(buffers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var buffer = _step.value;\n                        (0, _attributeTransitionUtils.padBuffer)(_objectSpread({\n                            buffer: buffer\n                        }, padBufferOpts));\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                this.currentStartIndices = attribute.startIndices;\n                this.currentLength = (0, _attributeTransitionUtils.getAttributeBufferLength)(attribute, numInstances);\n                this.attributeInTransition.update({\n                    buffer: buffers[1],\n                    value: attribute.value\n                });\n                this.transition.start(transitionSettings);\n                this.transform.update({\n                    elementCount: Math.floor(this.currentLength / attribute.size),\n                    sourceBuffers: {\n                        aTo: (0, _attributeTransitionUtils.getSourceBufferAttribute)(gl, attribute)\n                    }\n                });\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var buffers = this.buffers, transform = this.transform, framebuffer = this.framebuffer, transition = this.transition;\n                var updated = transition.update();\n                if (!updated) return false;\n                transform.update({\n                    sourceBuffers: {\n                        aPrev: buffers[0],\n                        aCur: buffers[1]\n                    },\n                    feedbackBuffers: {\n                        vNext: buffers[2]\n                    }\n                });\n                transform.run({\n                    framebuffer: framebuffer,\n                    discard: false,\n                    clearRenderTarget: true,\n                    uniforms: {\n                        stiffness: transition.settings.stiffness,\n                        damping: transition.settings.damping\n                    },\n                    parameters: {\n                        depthTest: false,\n                        blend: true,\n                        viewport: [\n                            0,\n                            0,\n                            1,\n                            1\n                        ],\n                        blendFunc: [\n                            1,\n                            1\n                        ],\n                        blendEquation: [\n                            32776,\n                            32776\n                        ]\n                    }\n                });\n                (0, _attributeTransitionUtils.cycleBuffers)(buffers);\n                this.attributeInTransition.update({\n                    buffer: buffers[1],\n                    value: this.attribute.value\n                });\n                var isTransitioning = (0, _core.readPixelsToArray)(framebuffer)[0] > 0;\n                if (!isTransitioning) transition.end();\n                return true;\n            }\n        },\n        {\n            key: \"cancel\",\n            value: function cancel() {\n                this.transition.cancel();\n                this.transform[\"delete\"]();\n                while(this.buffers.length)this.buffers.pop()[\"delete\"]();\n                this.texture[\"delete\"]();\n                this.texture = null;\n                this.framebuffer[\"delete\"]();\n                this.framebuffer = null;\n            }\n        },\n        {\n            key: \"inProgress\",\n            get: function get() {\n                return this.transition.inProgress;\n            }\n        }\n    ]);\n    return GPUSpringTransition1;\n}();\nfunction getTransform(gl, attribute, framebuffer) {\n    var attributeType = (0, _attributeTransitionUtils.getAttributeTypeFromSize)(attribute.size);\n    return new (0, _core.Transform)(gl, {\n        framebuffer: framebuffer,\n        vs: \"\\n#define SHADER_NAME spring-transition-vertex-shader\\n\\n#define EPSILON 0.00001\\n\\nuniform float stiffness;\\nuniform float damping;\\nattribute ATTRIBUTE_TYPE aPrev;\\nattribute ATTRIBUTE_TYPE aCur;\\nattribute ATTRIBUTE_TYPE aTo;\\nvarying ATTRIBUTE_TYPE vNext;\\nvarying float vIsTransitioningFlag;\\n\\nATTRIBUTE_TYPE getNextValue(ATTRIBUTE_TYPE cur, ATTRIBUTE_TYPE prev, ATTRIBUTE_TYPE dest) {\\n  ATTRIBUTE_TYPE velocity = cur - prev;\\n  ATTRIBUTE_TYPE delta = dest - cur;\\n  ATTRIBUTE_TYPE spring = delta * stiffness;\\n  ATTRIBUTE_TYPE damper = velocity * -1.0 * damping;\\n  return spring + damper + velocity + cur;\\n}\\n\\nvoid main(void) {\\n  bool isTransitioning = length(aCur - aPrev) > EPSILON || length(aTo - aCur) > EPSILON;\\n  vIsTransitioningFlag = isTransitioning ? 1.0 : 0.0;\\n\\n  vNext = getNextValue(aCur, aPrev, aTo);\\n  gl_Position = vec4(0, 0, 0, 1);\\n  gl_PointSize = 100.0;\\n}\\n\",\n        fs: \"\\n#define SHADER_NAME spring-transition-is-transitioning-fragment-shader\\n\\nvarying float vIsTransitioningFlag;\\n\\nvoid main(void) {\\n  if (vIsTransitioningFlag == 0.0) {\\n    discard;\\n  }\\n  gl_FragColor = vec4(1.0);\\n}\",\n        defines: {\n            ATTRIBUTE_TYPE: attributeType\n        },\n        varyings: [\n            \"vNext\"\n        ]\n    });\n}\nfunction getTexture(gl) {\n    return new (0, _core.Texture2D)(gl, {\n        data: new Uint8Array(4),\n        format: 6408,\n        type: 5121,\n        border: 0,\n        mipmaps: false,\n        dataFormat: 6408,\n        width: 1,\n        height: 1\n    });\n}\nfunction getFramebuffer(gl, texture) {\n    return new (0, _core.Framebuffer)(gl, {\n        id: \"spring-transition-is-transitioning-framebuffer\",\n        width: 1,\n        height: 1,\n        attachments: (0, _definePropertyDefault.default)({}, 36064, texture)\n    });\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/core\":\"bW3Qv\",\"../lib/attribute/attribute-transition-utils\":\"GR4Rl\",\"../lib/attribute/attribute\":\"2a0SU\",\"./transition\":\"fGNeu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2Wwsw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>UniformTransitionManager);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _attributeTransitionUtils = require(\"./attribute/attribute-transition-utils\");\nvar _cpuInterpolationTransition = require(\"../transitions/cpu-interpolation-transition\");\nvar _cpuInterpolationTransitionDefault = parcelHelpers.interopDefault(_cpuInterpolationTransition);\nvar _cpuSpringTransition = require(\"../transitions/cpu-spring-transition\");\nvar _cpuSpringTransitionDefault = parcelHelpers.interopDefault(_cpuSpringTransition);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar TRANSITION_TYPES = {\n    interpolation: (0, _cpuInterpolationTransitionDefault.default),\n    spring: (0, _cpuSpringTransitionDefault.default)\n};\nvar UniformTransitionManager = function() {\n    function UniformTransitionManager1(timeline) {\n        (0, _classCallCheckDefault.default)(this, UniformTransitionManager1);\n        this.transitions = new Map();\n        this.timeline = timeline;\n    }\n    (0, _createClassDefault.default)(UniformTransitionManager1, [\n        {\n            key: \"add\",\n            value: function add(key, fromValue, toValue, settings) {\n                var transitions = this.transitions;\n                if (transitions.has(key)) {\n                    var _transition = transitions.get(key);\n                    var _transition$value = _transition.value, value = _transition$value === void 0 ? _transition.settings.fromValue : _transition$value;\n                    fromValue = value;\n                    this.remove(key);\n                }\n                settings = (0, _attributeTransitionUtils.normalizeTransitionSettings)(settings);\n                if (!settings) return;\n                var TransitionType = TRANSITION_TYPES[settings.type];\n                if (!TransitionType) {\n                    (0, _logDefault.default).error(\"unsupported transition type '\".concat(settings.type, \"'\"))();\n                    return;\n                }\n                var transition = new TransitionType(this.timeline);\n                transition.start(_objectSpread(_objectSpread({}, settings), {}, {\n                    fromValue: fromValue,\n                    toValue: toValue\n                }));\n                transitions.set(key, transition);\n            }\n        },\n        {\n            key: \"remove\",\n            value: function remove(key) {\n                var transitions = this.transitions;\n                if (transitions.has(key)) {\n                    transitions.get(key).cancel();\n                    transitions[\"delete\"](key);\n                }\n            }\n        },\n        {\n            key: \"update\",\n            value: function update() {\n                var propsInTransition = {};\n                var _iterator = _createForOfIteratorHelper(this.transitions), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var _step$value = (0, _slicedToArrayDefault.default)(_step.value, 2), key = _step$value[0], transition = _step$value[1];\n                        transition.update();\n                        propsInTransition[key] = transition.value;\n                        if (!transition.inProgress) this.remove(key);\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return propsInTransition;\n            }\n        },\n        {\n            key: \"clear\",\n            value: function clear() {\n                var _iterator2 = _createForOfIteratorHelper(this.transitions.keys()), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var key = _step2.value;\n                        this.remove(key);\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n            }\n        },\n        {\n            key: \"active\",\n            get: function get() {\n                return this.transitions.size > 0;\n            }\n        }\n    ]);\n    return UniformTransitionManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./attribute/attribute-transition-utils\":\"GR4Rl\",\"../transitions/cpu-interpolation-transition\":\"2fqlQ\",\"../transitions/cpu-spring-transition\":\"eZ4j2\",\"../utils/log\":\"fg4UT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2fqlQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CPUInterpolationTransition);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _transition = require(\"./transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar CPUInterpolationTransition = function(_Transition) {\n    (0, _inheritsDefault.default)(CPUInterpolationTransition1, _Transition);\n    var _super = _createSuper(CPUInterpolationTransition1);\n    function CPUInterpolationTransition1() {\n        (0, _classCallCheckDefault.default)(this, CPUInterpolationTransition1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(CPUInterpolationTransition1, [\n        {\n            key: \"_onUpdate\",\n            value: function _onUpdate() {\n                var time = this.time, _this$settings = this.settings, fromValue = _this$settings.fromValue, toValue = _this$settings.toValue, duration = _this$settings.duration, easing = _this$settings.easing;\n                var t = easing(time / duration);\n                this._value = (0, _mathGl.lerp)(fromValue, toValue, t);\n            }\n        },\n        {\n            key: \"value\",\n            get: function get() {\n                return this._value;\n            }\n        }\n    ]);\n    return CPUInterpolationTransition1;\n}((0, _transitionDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"math.gl\":\"6aDAl\",\"./transition\":\"fGNeu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eZ4j2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CPUSpringTransition);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _transition = require(\"./transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar EPSILON = 1e-5;\nfunction updateSpringElement(prev, cur, dest, damping, stiffness) {\n    var velocity = cur - prev;\n    var delta = dest - cur;\n    var spring = delta * stiffness;\n    var damper = -velocity * damping;\n    return spring + damper + velocity + cur;\n}\nfunction updateSpring(prev, cur, dest, damping, stiffness) {\n    if (Array.isArray(dest)) {\n        var next = [];\n        for(var i = 0; i < dest.length; i++)next[i] = updateSpringElement(prev[i], cur[i], dest[i], damping, stiffness);\n        return next;\n    }\n    return updateSpringElement(prev, cur, dest, damping, stiffness);\n}\nfunction distance(value1, value2) {\n    if (Array.isArray(value1)) {\n        var distanceSquare = 0;\n        for(var i = 0; i < value1.length; i++){\n            var d = value1[i] - value2[i];\n            distanceSquare += d * d;\n        }\n        return Math.sqrt(distanceSquare);\n    }\n    return Math.abs(value1 - value2);\n}\nvar CPUSpringTransition = function(_Transition) {\n    (0, _inheritsDefault.default)(CPUSpringTransition1, _Transition);\n    var _super = _createSuper(CPUSpringTransition1);\n    function CPUSpringTransition1() {\n        (0, _classCallCheckDefault.default)(this, CPUSpringTransition1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(CPUSpringTransition1, [\n        {\n            key: \"_onUpdate\",\n            value: function _onUpdate() {\n                var _this$settings = this.settings, fromValue = _this$settings.fromValue, toValue = _this$settings.toValue, damping = _this$settings.damping, stiffness = _this$settings.stiffness;\n                var _this$_prevValue = this._prevValue, _prevValue = _this$_prevValue === void 0 ? fromValue : _this$_prevValue, _this$_currValue = this._currValue, _currValue = _this$_currValue === void 0 ? fromValue : _this$_currValue;\n                var nextValue = updateSpring(_prevValue, _currValue, toValue, damping, stiffness);\n                var delta = distance(nextValue, toValue);\n                var velocity = distance(nextValue, _currValue);\n                if (delta < EPSILON && velocity < EPSILON) {\n                    nextValue = toValue;\n                    this.end();\n                }\n                this._prevValue = _currValue;\n                this._currValue = nextValue;\n            }\n        },\n        {\n            key: \"value\",\n            get: function get() {\n                return this._currValue;\n            }\n        }\n    ]);\n    return CPUSpringTransition1;\n}((0, _transitionDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./transition\":\"fGNeu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2rTFu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"validateProps\", ()=>validateProps);\nparcelHelpers.export(exports, \"diffProps\", ()=>diffProps);\nparcelHelpers.export(exports, \"compareProps\", ()=>compareProps);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _constants = require(\"./constants\");\nvar COMPONENT = (0, _constants.PROP_SYMBOLS).COMPONENT;\nfunction validateProps(props) {\n    var propTypes = getPropTypes(props);\n    for(var propName in propTypes){\n        var propType = propTypes[propName];\n        var validate = propType.validate;\n        if (validate && !validate(props[propName], propType)) throw new Error(\"Invalid prop \".concat(propName, \": \").concat(props[propName]));\n    }\n}\nfunction diffProps(props, oldProps) {\n    var propsChangedReason = compareProps({\n        newProps: props,\n        oldProps: oldProps,\n        propTypes: getPropTypes(props),\n        ignoreProps: {\n            data: null,\n            updateTriggers: null,\n            extensions: null,\n            transitions: null\n        }\n    });\n    var dataChangedReason = diffDataProps(props, oldProps);\n    var updateTriggersChangedReason = false;\n    if (!dataChangedReason) updateTriggersChangedReason = diffUpdateTriggers(props, oldProps);\n    return {\n        dataChanged: dataChangedReason,\n        propsChanged: propsChangedReason,\n        updateTriggersChanged: updateTriggersChangedReason,\n        extensionsChanged: diffExtensions(props, oldProps),\n        transitionsChanged: diffTransitions(props, oldProps)\n    };\n}\nfunction diffTransitions(props, oldProps) {\n    if (!props.transitions) return null;\n    var result = {};\n    var propTypes = getPropTypes(props);\n    for(var key in props.transitions){\n        var propType = propTypes[key];\n        var type = propType && propType.type;\n        var isTransitionable = type === \"number\" || type === \"color\" || type === \"array\";\n        if (isTransitionable && comparePropValues(props[key], oldProps[key], propType)) result[key] = true;\n    }\n    return result;\n}\nfunction compareProps() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, newProps = _ref.newProps, oldProps = _ref.oldProps, _ref$ignoreProps = _ref.ignoreProps, ignoreProps = _ref$ignoreProps === void 0 ? {} : _ref$ignoreProps, _ref$propTypes = _ref.propTypes, propTypes = _ref$propTypes === void 0 ? {} : _ref$propTypes, _ref$triggerName = _ref.triggerName, triggerName = _ref$triggerName === void 0 ? \"props\" : _ref$triggerName;\n    if (oldProps === newProps) return null;\n    if ((0, _typeofDefault.default)(newProps) !== \"object\" || newProps === null) return \"\".concat(triggerName, \" changed shallowly\");\n    if ((0, _typeofDefault.default)(oldProps) !== \"object\" || oldProps === null) return \"\".concat(triggerName, \" changed shallowly\");\n    for(var _i = 0, _Object$keys = Object.keys(newProps); _i < _Object$keys.length; _i++){\n        var key = _Object$keys[_i];\n        if (!(key in ignoreProps)) {\n            if (!(key in oldProps)) return \"\".concat(triggerName, \".\").concat(key, \" added\");\n            var changed = comparePropValues(newProps[key], oldProps[key], propTypes[key]);\n            if (changed) return \"\".concat(triggerName, \".\").concat(key, \" \").concat(changed);\n        }\n    }\n    for(var _i2 = 0, _Object$keys2 = Object.keys(oldProps); _i2 < _Object$keys2.length; _i2++){\n        var _key = _Object$keys2[_i2];\n        if (!(_key in ignoreProps)) {\n            if (!(_key in newProps)) return \"\".concat(triggerName, \".\").concat(_key, \" dropped\");\n            if (!Object.hasOwnProperty.call(newProps, _key)) {\n                var _changed = comparePropValues(newProps[_key], oldProps[_key], propTypes[_key]);\n                if (_changed) return \"\".concat(triggerName, \".\").concat(_key, \" \").concat(_changed);\n            }\n        }\n    }\n    return null;\n}\nfunction comparePropValues(newProp, oldProp, propType) {\n    var equal = propType && propType.equal;\n    if (equal && !equal(newProp, oldProp, propType)) return \"changed deeply\";\n    if (!equal) {\n        equal = newProp && oldProp && newProp.equals;\n        if (equal && !equal.call(newProp, oldProp)) return \"changed deeply\";\n    }\n    if (!equal && oldProp !== newProp) return \"changed shallowly\";\n    return null;\n}\nfunction diffDataProps(props, oldProps) {\n    if (oldProps === null) return \"oldProps is null, initial diff\";\n    var dataChanged = null;\n    var dataComparator = props.dataComparator, _dataDiff = props._dataDiff;\n    if (dataComparator) {\n        if (!dataComparator(props.data, oldProps.data)) dataChanged = \"Data comparator detected a change\";\n    } else if (props.data !== oldProps.data) dataChanged = \"A new data container was supplied\";\n    if (dataChanged && _dataDiff) dataChanged = _dataDiff(props.data, oldProps.data) || dataChanged;\n    return dataChanged;\n}\nfunction diffUpdateTriggers(props, oldProps) {\n    if (oldProps === null) return \"oldProps is null, initial diff\";\n    if (\"all\" in props.updateTriggers) {\n        var diffReason = diffUpdateTrigger(props, oldProps, \"all\");\n        if (diffReason) return {\n            all: true\n        };\n    }\n    var triggerChanged = {};\n    var reason = false;\n    for(var triggerName in props.updateTriggers)if (triggerName !== \"all\") {\n        var _diffReason = diffUpdateTrigger(props, oldProps, triggerName);\n        if (_diffReason) {\n            triggerChanged[triggerName] = true;\n            reason = triggerChanged;\n        }\n    }\n    return reason;\n}\nfunction diffExtensions(props, oldProps) {\n    if (oldProps === null) return \"oldProps is null, initial diff\";\n    var oldExtensions = oldProps.extensions;\n    var extensions = props.extensions;\n    if (extensions === oldExtensions) return false;\n    if (extensions.length !== oldExtensions.length) return true;\n    for(var i = 0; i < extensions.length; i++){\n        if (!extensions[i].equals(oldExtensions[i])) return true;\n    }\n    return false;\n}\nfunction diffUpdateTrigger(props, oldProps, triggerName) {\n    var newTriggers = props.updateTriggers[triggerName];\n    newTriggers = newTriggers === undefined || newTriggers === null ? {} : newTriggers;\n    var oldTriggers = oldProps.updateTriggers[triggerName];\n    oldTriggers = oldTriggers === undefined || oldTriggers === null ? {} : oldTriggers;\n    var diffReason = compareProps({\n        oldProps: oldTriggers,\n        newProps: newTriggers,\n        triggerName: triggerName\n    });\n    return diffReason;\n}\nfunction getPropTypes(props) {\n    var layer = props[COMPONENT];\n    var LayerType = layer && layer.constructor;\n    return LayerType ? LayerType._propTypes : {};\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"./constants\":\"3Gl8a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Gl8a\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LIFECYCLE\", ()=>LIFECYCLE);\nparcelHelpers.export(exports, \"PROP_SYMBOLS\", ()=>PROP_SYMBOLS);\nvar LIFECYCLE = {\n    NO_STATE: \"Awaiting state\",\n    MATCHED: \"Matched. State transferred from previous layer\",\n    INITIALIZED: \"Initialized\",\n    AWAITING_GC: \"Discarded. Awaiting garbage collection\",\n    AWAITING_FINALIZATION: \"No longer matched. Awaiting garbage collection\",\n    FINALIZED: \"Finalized! Awaiting garbage collection\"\n};\nvar PROP_SYMBOLS = {\n    COMPONENT: Symbol[\"for\"](\"component\"),\n    ASYNC_DEFAULTS: Symbol[\"for\"](\"asyncPropDefaults\"),\n    ASYNC_ORIGINAL: Symbol[\"for\"](\"asyncPropOriginal\"),\n    ASYNC_RESOLVED: Symbol[\"for\"](\"asyncPropResolved\")\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9arx2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"count\", ()=>count);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar ERR_NOT_OBJECT = \"count(): argument not an object\";\nvar ERR_NOT_CONTAINER = \"count(): argument not a container\";\nfunction count(container) {\n    if (!isObject(container)) throw new Error(ERR_NOT_OBJECT);\n    if (typeof container.count === \"function\") return container.count();\n    if (Number.isFinite(container.size)) return container.size;\n    if (Number.isFinite(container.length)) return container.length;\n    if (isPlainObject(container)) return Object.keys(container).length;\n    throw new Error(ERR_NOT_CONTAINER);\n}\nfunction isPlainObject(value) {\n    return value !== null && (0, _typeofDefault.default)(value) === \"object\" && value.constructor === Object;\n}\nfunction isObject(value) {\n    return value !== null && (0, _typeofDefault.default)(value) === \"object\";\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j0UQD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mergeShaders\", ()=>mergeShaders);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction mergeShaders(target, source) {\n    if (!source) return target;\n    var result = Object.assign({}, target, source);\n    if (\"defines\" in source) result.defines = Object.assign({}, target.defines, source.defines);\n    if (\"modules\" in source) {\n        result.modules = (target.modules || []).concat(source.modules);\n        if (source.modules.some(function(module) {\n            return module.name === \"project64\";\n        })) {\n            var index = result.modules.findIndex(function(module) {\n                return module.name === \"project32\";\n            });\n            if (index >= 0) result.modules.splice(index, 1);\n        }\n    }\n    if (\"inject\" in source) {\n        if (!target.inject) result.inject = source.inject;\n        else {\n            var mergedInjection = _objectSpread({}, target.inject);\n            for(var key in source.inject)mergedInjection[key] = (mergedInjection[key] || \"\") + source.inject[key];\n            result.inject = mergedInjection;\n        }\n    }\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fwxt6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Component);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _constants = require(\"../lifecycle/constants\");\nvar _createProps = require(\"./create-props\");\nvar _constants1 = require(\"./constants\");\nvar _componentState = require(\"./component-state\");\nvar _componentStateDefault = parcelHelpers.interopDefault(_componentState);\nvar ASYNC_ORIGINAL = (0, _constants1.PROP_SYMBOLS).ASYNC_ORIGINAL, ASYNC_RESOLVED = (0, _constants1.PROP_SYMBOLS).ASYNC_RESOLVED, ASYNC_DEFAULTS = (0, _constants1.PROP_SYMBOLS).ASYNC_DEFAULTS;\nvar defaultProps = {};\nvar counter = 0;\nvar Component = function() {\n    function Component1() {\n        (0, _classCallCheckDefault.default)(this, Component1);\n        this.props = (0, _createProps.createProps).apply(this, arguments);\n        this.id = this.props.id;\n        this.count = counter++;\n        this.lifecycle = (0, _constants.LIFECYCLE).NO_STATE;\n        this.parent = null;\n        this.context = null;\n        this.state = null;\n        this.internalState = null;\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(Component1, [\n        {\n            key: \"clone\",\n            value: function clone(newProps) {\n                var props = this.props;\n                var asyncProps = {};\n                for(var key in props[ASYNC_DEFAULTS]){\n                    if (key in props[ASYNC_RESOLVED]) asyncProps[key] = props[ASYNC_RESOLVED][key];\n                    else if (key in props[ASYNC_ORIGINAL]) asyncProps[key] = props[ASYNC_ORIGINAL][key];\n                }\n                return new this.constructor(Object.assign({}, props, asyncProps, newProps));\n            }\n        },\n        {\n            key: \"_initState\",\n            value: function _initState() {\n                this.internalState = new (0, _componentStateDefault.default)({});\n            }\n        },\n        {\n            key: \"stats\",\n            get: function get() {\n                return this.internalState.stats;\n            }\n        }\n    ]);\n    return Component1;\n}();\nComponent.componentName = \"Component\";\nComponent.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../lifecycle/constants\":\"3Gl8a\",\"./create-props\":\"1tNb8\",\"./constants\":\"3Gl8a\",\"./component-state\":\"9tnht\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1tNb8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createProps\", ()=>createProps);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _iterableUtils = require(\"../utils/iterable-utils\");\nvar _propTypes = require(\"./prop-types\");\nvar _constants = require(\"./constants\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar COMPONENT = (0, _constants.PROP_SYMBOLS).COMPONENT, ASYNC_ORIGINAL = (0, _constants.PROP_SYMBOLS).ASYNC_ORIGINAL, ASYNC_RESOLVED = (0, _constants.PROP_SYMBOLS).ASYNC_RESOLVED, ASYNC_DEFAULTS = (0, _constants.PROP_SYMBOLS).ASYNC_DEFAULTS;\nfunction createProps() {\n    var component = this;\n    var propsPrototype = getPropsPrototype(component.constructor);\n    var propsInstance = Object.create(propsPrototype);\n    propsInstance[COMPONENT] = component;\n    propsInstance[ASYNC_ORIGINAL] = {};\n    propsInstance[ASYNC_RESOLVED] = {};\n    for(var i = 0; i < arguments.length; ++i){\n        var props = arguments[i];\n        for(var key in props)propsInstance[key] = props[key];\n    }\n    Object.freeze(propsInstance);\n    return propsInstance;\n}\nfunction getPropsPrototype(componentClass) {\n    var defaultProps = getOwnProperty(componentClass, \"_mergedDefaultProps\");\n    if (!defaultProps) {\n        createPropsPrototypeAndTypes(componentClass);\n        return componentClass._mergedDefaultProps;\n    }\n    return defaultProps;\n}\nfunction createPropsPrototypeAndTypes(componentClass) {\n    var parent = componentClass.prototype;\n    if (!parent) return;\n    var parentClass = Object.getPrototypeOf(componentClass);\n    var parentDefaultProps = getPropsPrototype(parentClass);\n    var componentDefaultProps = getOwnProperty(componentClass, \"defaultProps\") || {};\n    var componentPropDefs = (0, _propTypes.parsePropTypes)(componentDefaultProps);\n    var defaultProps = createPropsPrototype(componentPropDefs.defaultProps, parentDefaultProps, componentClass);\n    var propTypes = Object.assign({}, parentClass._propTypes, componentPropDefs.propTypes);\n    addAsyncPropsToPropPrototype(defaultProps, propTypes);\n    var deprecatedProps = Object.assign({}, parentClass._deprecatedProps, componentPropDefs.deprecatedProps);\n    addDeprecatedPropsToPropPrototype(defaultProps, deprecatedProps);\n    componentClass._mergedDefaultProps = defaultProps;\n    componentClass._propTypes = propTypes;\n    componentClass._deprecatedProps = deprecatedProps;\n}\nfunction createPropsPrototype(props, parentProps, componentClass) {\n    var defaultProps = Object.create(null);\n    Object.assign(defaultProps, parentProps, props);\n    var id = getComponentName(componentClass);\n    delete props.id;\n    Object.defineProperties(defaultProps, {\n        id: {\n            writable: true,\n            value: id\n        }\n    });\n    return defaultProps;\n}\nfunction addDeprecatedPropsToPropPrototype(defaultProps, deprecatedProps) {\n    var _loop = function _loop(propName) {\n        Object.defineProperty(defaultProps, propName, {\n            enumerable: false,\n            set: function set(newValue) {\n                var nameStr = \"\".concat(this.id, \": \").concat(propName);\n                var _iterator = _createForOfIteratorHelper(deprecatedProps[propName]), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var newPropName = _step.value;\n                        if (!hasOwnProperty(this, newPropName)) this[newPropName] = newValue;\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                (0, _logDefault.default).deprecated(nameStr, deprecatedProps[propName].join(\"/\"))();\n            }\n        });\n    };\n    for(var propName1 in deprecatedProps)_loop(propName1);\n}\nfunction addAsyncPropsToPropPrototype(defaultProps, propTypes) {\n    var defaultValues = {};\n    var descriptors = {};\n    for(var propName in propTypes){\n        var propType = propTypes[propName];\n        var name = propType.name, value = propType.value;\n        if (propType.async) {\n            defaultValues[name] = value;\n            descriptors[name] = getDescriptorForAsyncProp(name, value);\n        }\n    }\n    defaultProps[ASYNC_DEFAULTS] = defaultValues;\n    defaultProps[ASYNC_ORIGINAL] = {};\n    Object.defineProperties(defaultProps, descriptors);\n}\nfunction getDescriptorForAsyncProp(name) {\n    return {\n        enumerable: true,\n        set: function set(newValue) {\n            if (typeof newValue === \"string\" || newValue instanceof Promise || (0, _iterableUtils.isAsyncIterable)(newValue)) this[ASYNC_ORIGINAL][name] = newValue;\n            else this[ASYNC_RESOLVED][name] = newValue;\n        },\n        get: function get() {\n            if (this[ASYNC_RESOLVED]) {\n                if (name in this[ASYNC_RESOLVED]) {\n                    var value = this[ASYNC_RESOLVED][name];\n                    return value || this[ASYNC_DEFAULTS][name];\n                }\n                if (name in this[ASYNC_ORIGINAL]) {\n                    var state = this[COMPONENT] && this[COMPONENT].internalState;\n                    if (state && state.hasAsyncProp(name)) return state.getAsyncProp(name) || this[ASYNC_DEFAULTS][name];\n                }\n            }\n            return this[ASYNC_DEFAULTS][name];\n        }\n    };\n}\nfunction hasOwnProperty(object, prop) {\n    return Object.prototype.hasOwnProperty.call(object, prop);\n}\nfunction getOwnProperty(object, prop) {\n    return hasOwnProperty(object, prop) && object[prop];\n}\nfunction getComponentName(componentClass) {\n    var componentName = getOwnProperty(componentClass, \"layerName\") || getOwnProperty(componentClass, \"componentName\");\n    if (!componentName) (0, _logDefault.default).once(0, \"\".concat(componentClass.name, \".componentName not specified\"))();\n    return componentName || componentClass.name;\n}\n\n},{\"../utils/log\":\"fg4UT\",\"../utils/iterable-utils\":\"8gMuf\",\"./prop-types\":\"2o5ar\",\"./constants\":\"3Gl8a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2o5ar\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parsePropTypes\", ()=>parsePropTypes);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar TYPE_DEFINITIONS = {\n    \"boolean\": {\n        validate: function validate(value, propType) {\n            return true;\n        },\n        equal: function equal(value1, value2, propType) {\n            return Boolean(value1) === Boolean(value2);\n        }\n    },\n    number: {\n        validate: function validate(value, propType) {\n            return Number.isFinite(value) && (!(\"max\" in propType) || value <= propType.max) && (!(\"min\" in propType) || value >= propType.min);\n        }\n    },\n    color: {\n        validate: function validate(value, propType) {\n            return propType.optional && !value || isArray(value) && (value.length === 3 || value.length === 4);\n        },\n        equal: function equal(value1, value2, propType) {\n            return arrayEqual(value1, value2);\n        }\n    },\n    accessor: {\n        validate: function validate(value, propType) {\n            var valueType = getTypeOf(value);\n            return valueType === \"function\" || valueType === getTypeOf(propType.value);\n        },\n        equal: function equal(value1, value2, propType) {\n            if (typeof value2 === \"function\") return true;\n            return arrayEqual(value1, value2);\n        }\n    },\n    array: {\n        validate: function validate(value, propType) {\n            return propType.optional && !value || isArray(value);\n        },\n        equal: function equal(value1, value2, propType) {\n            return propType.compare ? arrayEqual(value1, value2) : value1 === value2;\n        }\n    },\n    \"function\": {\n        validate: function validate(value, propType) {\n            return propType.optional && !value || typeof value === \"function\";\n        },\n        equal: function equal(value1, value2, propType) {\n            return !propType.compare || value1 === value2;\n        }\n    }\n};\nfunction arrayEqual(array1, array2) {\n    if (array1 === array2) return true;\n    if (!isArray(array1) || !isArray(array2)) return false;\n    var len = array1.length;\n    if (len !== array2.length) return false;\n    for(var i = 0; i < len; i++){\n        if (array1[i] !== array2[i]) return false;\n    }\n    return true;\n}\nfunction parsePropTypes(propDefs) {\n    var propTypes = {};\n    var defaultProps = {};\n    var deprecatedProps = {};\n    for(var _i = 0, _Object$entries = Object.entries(propDefs); _i < _Object$entries.length; _i++){\n        var _Object$entries$_i = (0, _slicedToArrayDefault.default)(_Object$entries[_i], 2), propName = _Object$entries$_i[0], propDef = _Object$entries$_i[1];\n        if (propDef && propDef.deprecatedFor) deprecatedProps[propName] = Array.isArray(propDef.deprecatedFor) ? propDef.deprecatedFor : [\n            propDef.deprecatedFor\n        ];\n        else {\n            var propType = parsePropType(propName, propDef);\n            propTypes[propName] = propType;\n            defaultProps[propName] = propType.value;\n        }\n    }\n    return {\n        propTypes: propTypes,\n        defaultProps: defaultProps,\n        deprecatedProps: deprecatedProps\n    };\n}\nfunction parsePropType(name, propDef) {\n    switch(getTypeOf(propDef)){\n        case \"object\":\n            return normalizePropDefinition(name, propDef);\n        case \"array\":\n            return normalizePropDefinition(name, {\n                type: \"array\",\n                value: propDef,\n                compare: false\n            });\n        case \"boolean\":\n            return normalizePropDefinition(name, {\n                type: \"boolean\",\n                value: propDef\n            });\n        case \"number\":\n            return normalizePropDefinition(name, {\n                type: \"number\",\n                value: propDef\n            });\n        case \"function\":\n            return normalizePropDefinition(name, {\n                type: \"function\",\n                value: propDef,\n                compare: true\n            });\n        default:\n            return {\n                name: name,\n                type: \"unknown\",\n                value: propDef\n            };\n    }\n}\nfunction normalizePropDefinition(name, propDef) {\n    if (!(\"type\" in propDef)) {\n        if (!(\"value\" in propDef)) return {\n            name: name,\n            type: \"object\",\n            value: propDef\n        };\n        return Object.assign({\n            name: name,\n            type: getTypeOf(propDef.value)\n        }, propDef);\n    }\n    return Object.assign({\n        name: name\n    }, TYPE_DEFINITIONS[propDef.type], propDef);\n}\nfunction isArray(value) {\n    return Array.isArray(value) || ArrayBuffer.isView(value);\n}\nfunction getTypeOf(value) {\n    if (isArray(value)) return \"array\";\n    if (value === null) return \"null\";\n    return (0, _typeofDefault.default)(value);\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9tnht\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ComponentState);\nvar _regenerator = require(\"@babel/runtime/regenerator\");\nvar _regeneratorDefault = parcelHelpers.interopDefault(_regenerator);\nvar _asyncToGenerator = require(\"@babel/runtime/helpers/esm/asyncToGenerator\");\nvar _asyncToGeneratorDefault = parcelHelpers.interopDefault(_asyncToGenerator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _asyncIterator = require(\"@babel/runtime/helpers/esm/asyncIterator\");\nvar _asyncIteratorDefault = parcelHelpers.interopDefault(_asyncIterator);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _iterableUtils = require(\"../utils/iterable-utils\");\nvar _constants = require(\"./constants\");\nvar ASYNC_ORIGINAL = (0, _constants.PROP_SYMBOLS).ASYNC_ORIGINAL, ASYNC_RESOLVED = (0, _constants.PROP_SYMBOLS).ASYNC_RESOLVED, ASYNC_DEFAULTS = (0, _constants.PROP_SYMBOLS).ASYNC_DEFAULTS;\nvar EMPTY_PROPS = Object.freeze({});\nvar ComponentState = function() {\n    function ComponentState1() {\n        var component = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n        (0, _classCallCheckDefault.default)(this, ComponentState1);\n        this.component = component;\n        this.asyncProps = {};\n        this.onAsyncPropUpdated = function() {};\n        this.oldProps = EMPTY_PROPS;\n        this.oldAsyncProps = null;\n    }\n    (0, _createClassDefault.default)(ComponentState1, [\n        {\n            key: \"getOldProps\",\n            value: function getOldProps() {\n                return this.oldAsyncProps || this.oldProps;\n            }\n        },\n        {\n            key: \"resetOldProps\",\n            value: function resetOldProps() {\n                this.oldAsyncProps = null;\n                this.oldProps = this.component.props;\n            }\n        },\n        {\n            key: \"freezeAsyncOldProps\",\n            value: function freezeAsyncOldProps() {\n                if (!this.oldAsyncProps) {\n                    this.oldProps = this.oldProps || this.component.props;\n                    this.oldAsyncProps = Object.create(this.oldProps);\n                    for(var propName in this.asyncProps)Object.defineProperty(this.oldAsyncProps, propName, {\n                        enumerable: true,\n                        value: this.oldProps[propName]\n                    });\n                }\n            }\n        },\n        {\n            key: \"hasAsyncProp\",\n            value: function hasAsyncProp(propName) {\n                return propName in this.asyncProps;\n            }\n        },\n        {\n            key: \"getAsyncProp\",\n            value: function getAsyncProp(propName) {\n                var asyncProp = this.asyncProps[propName];\n                return asyncProp && asyncProp.resolvedValue;\n            }\n        },\n        {\n            key: \"isAsyncPropLoading\",\n            value: function isAsyncPropLoading(propName) {\n                if (propName) {\n                    var asyncProp = this.asyncProps[propName];\n                    return Boolean(asyncProp && asyncProp.pendingLoadCount > 0 && asyncProp.pendingLoadCount !== asyncProp.resolvedLoadCount);\n                }\n                for(var key in this.asyncProps){\n                    if (this.isAsyncPropLoading(key)) return true;\n                }\n                return false;\n            }\n        },\n        {\n            key: \"reloadAsyncProp\",\n            value: function reloadAsyncProp(propName, value) {\n                this._watchPromise(propName, Promise.resolve(value));\n            }\n        },\n        {\n            key: \"setAsyncProps\",\n            value: function setAsyncProps(props) {\n                var resolvedValues = props[ASYNC_RESOLVED] || {};\n                var originalValues = props[ASYNC_ORIGINAL] || props;\n                var defaultValues = props[ASYNC_DEFAULTS] || {};\n                for(var propName in resolvedValues){\n                    var value = resolvedValues[propName];\n                    this._createAsyncPropData(propName, value, defaultValues[propName]);\n                    this._updateAsyncProp(propName, value);\n                }\n                for(var _propName in originalValues){\n                    var _value2 = originalValues[_propName];\n                    this._createAsyncPropData(_propName, _value2, defaultValues[_propName]);\n                    this._updateAsyncProp(_propName, _value2);\n                }\n            }\n        },\n        {\n            key: \"_updateAsyncProp\",\n            value: function _updateAsyncProp(propName, value) {\n                if (!this._didAsyncInputValueChange(propName, value)) return;\n                if (typeof value === \"string\") {\n                    var fetch = this.layer && this.layer.props.fetch;\n                    var url = value;\n                    if (fetch) value = fetch(url, {\n                        propName: propName,\n                        layer: this.layer\n                    });\n                }\n                if (value instanceof Promise) {\n                    this._watchPromise(propName, value);\n                    return;\n                }\n                if ((0, _iterableUtils.isAsyncIterable)(value)) {\n                    this._resolveAsyncIterable(propName, value);\n                    return;\n                }\n                this._setPropValue(propName, value);\n            }\n        },\n        {\n            key: \"_didAsyncInputValueChange\",\n            value: function _didAsyncInputValueChange(propName, value) {\n                var asyncProp = this.asyncProps[propName];\n                if (value === asyncProp.lastValue) return false;\n                asyncProp.lastValue = value;\n                return true;\n            }\n        },\n        {\n            key: \"_setPropValue\",\n            value: function _setPropValue(propName, value) {\n                var asyncProp = this.asyncProps[propName];\n                asyncProp.value = value;\n                asyncProp.resolvedValue = value;\n                asyncProp.pendingLoadCount++;\n                asyncProp.resolvedLoadCount = asyncProp.pendingLoadCount;\n            }\n        },\n        {\n            key: \"_setAsyncPropValue\",\n            value: function _setAsyncPropValue(propName, value, loadCount) {\n                var asyncProp = this.asyncProps[propName];\n                if (asyncProp && loadCount >= asyncProp.resolvedLoadCount && value !== undefined) {\n                    this.freezeAsyncOldProps();\n                    asyncProp.resolvedValue = value;\n                    asyncProp.resolvedLoadCount = loadCount;\n                    this.onAsyncPropUpdated(propName, value);\n                }\n            }\n        },\n        {\n            key: \"_watchPromise\",\n            value: function _watchPromise(propName, promise) {\n                var _this = this;\n                var asyncProp = this.asyncProps[propName];\n                asyncProp.pendingLoadCount++;\n                var loadCount = asyncProp.pendingLoadCount;\n                promise.then(function(data) {\n                    data = _this._postProcessValue(propName, data);\n                    _this._setAsyncPropValue(propName, data, loadCount);\n                    var onDataLoad = _this.layer && _this.layer.props.onDataLoad;\n                    if (propName === \"data\" && onDataLoad) onDataLoad(data, {\n                        propName: propName,\n                        layer: _this.layer\n                    });\n                })[\"catch\"](function(error) {\n                    return (0, _logDefault.default).error(error)();\n                });\n            }\n        },\n        {\n            key: \"_resolveAsyncIterable\",\n            value: function() {\n                var _resolveAsyncIterable2 = (0, _asyncToGeneratorDefault.default)((0, _regeneratorDefault.default).mark(function _callee(propName, iterable) {\n                    var asyncProp, loadCount, data, count, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, chunk, onDataLoad;\n                    return (0, _regeneratorDefault.default).wrap(function _callee$(_context) {\n                        while(true)switch(_context.prev = _context.next){\n                            case 0:\n                                if (propName !== \"data\") this._setPropValue(propName, iterable);\n                                asyncProp = this.asyncProps[propName];\n                                asyncProp.pendingLoadCount++;\n                                loadCount = asyncProp.pendingLoadCount;\n                                data = [];\n                                count = 0;\n                                _iteratorNormalCompletion = true;\n                                _didIteratorError = false;\n                                _context.prev = 8;\n                                _iterator = (0, _asyncIteratorDefault.default)(iterable);\n                            case 10:\n                                _context.next = 12;\n                                return _iterator.next();\n                            case 12:\n                                _step = _context.sent;\n                                _iteratorNormalCompletion = _step.done;\n                                _context.next = 16;\n                                return _step.value;\n                            case 16:\n                                _value = _context.sent;\n                                if (_iteratorNormalCompletion) {\n                                    _context.next = 26;\n                                    break;\n                                }\n                                chunk = _value;\n                                data = this._postProcessValue(propName, chunk, data);\n                                Object.defineProperty(data, \"__diff\", {\n                                    enumerable: false,\n                                    value: [\n                                        {\n                                            startRow: count,\n                                            endRow: data.length\n                                        }\n                                    ]\n                                });\n                                count = data.length;\n                                this._setAsyncPropValue(propName, data, loadCount);\n                            case 23:\n                                _iteratorNormalCompletion = true;\n                                _context.next = 10;\n                                break;\n                            case 26:\n                                _context.next = 32;\n                                break;\n                            case 28:\n                                _context.prev = 28;\n                                _context.t0 = _context[\"catch\"](8);\n                                _didIteratorError = true;\n                                _iteratorError = _context.t0;\n                            case 32:\n                                _context.prev = 32;\n                                _context.prev = 33;\n                                if (!(!_iteratorNormalCompletion && _iterator[\"return\"] != null)) {\n                                    _context.next = 37;\n                                    break;\n                                }\n                                _context.next = 37;\n                                return _iterator[\"return\"]();\n                            case 37:\n                                _context.prev = 37;\n                                if (!_didIteratorError) {\n                                    _context.next = 40;\n                                    break;\n                                }\n                                throw _iteratorError;\n                            case 40:\n                                return _context.finish(37);\n                            case 41:\n                                return _context.finish(32);\n                            case 42:\n                                onDataLoad = this.layer && this.layer.props.onDataLoad;\n                                if (onDataLoad) onDataLoad(data, {\n                                    propName: propName,\n                                    layer: this.layer\n                                });\n                            case 44:\n                            case \"end\":\n                                return _context.stop();\n                        }\n                    }, _callee, this, [\n                        [\n                            8,\n                            28,\n                            32,\n                            42\n                        ],\n                        [\n                            33,\n                            ,\n                            37,\n                            41\n                        ]\n                    ]);\n                }));\n                function _resolveAsyncIterable(_x, _x2) {\n                    return _resolveAsyncIterable2.apply(this, arguments);\n                }\n                return _resolveAsyncIterable;\n            }()\n        },\n        {\n            key: \"_postProcessValue\",\n            value: function _postProcessValue(propName, value, previousValue) {\n                var _ref = this.component ? this.component.props : {}, dataTransform = _ref.dataTransform;\n                if (propName !== \"data\") return value;\n                if (dataTransform) return dataTransform(value, previousValue);\n                return previousValue ? previousValue.concat(value) : value;\n            }\n        },\n        {\n            key: \"_createAsyncPropData\",\n            value: function _createAsyncPropData(propName, value, defaultValue) {\n                var asyncProp = this.asyncProps[propName];\n                if (!asyncProp) this.asyncProps[propName] = {\n                    lastValue: null,\n                    resolvedValue: defaultValue,\n                    pendingLoadCount: 0,\n                    resolvedLoadCount: 0\n                };\n            }\n        }\n    ]);\n    return ComponentState1;\n}();\n\n},{\"@babel/runtime/regenerator\":\"eGRXL\",\"@babel/runtime/helpers/esm/asyncToGenerator\":\"cPT1v\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/asyncIterator\":\"hoXxr\",\"../utils/log\":\"fg4UT\",\"../utils/iterable-utils\":\"8gMuf\",\"./constants\":\"3Gl8a\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ftSh0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LayerState);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _componentState = require(\"../lifecycle/component-state\");\nvar _componentStateDefault = parcelHelpers.interopDefault(_componentState);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LayerState = function(_ComponentState) {\n    (0, _inheritsDefault.default)(LayerState1, _ComponentState);\n    var _super = _createSuper(LayerState1);\n    function LayerState1(_ref) {\n        var _this;\n        var attributeManager = _ref.attributeManager, layer = _ref.layer;\n        (0, _classCallCheckDefault.default)(this, LayerState1);\n        _this = _super.call(this, layer);\n        _this.attributeManager = attributeManager;\n        _this.model = null;\n        _this.needsRedraw = true;\n        _this.subLayers = null;\n        return _this;\n    }\n    (0, _createClassDefault.default)(LayerState1, [\n        {\n            key: \"layer\",\n            get: function get() {\n                return this.component;\n            },\n            set: function set(layer) {\n                this.component = layer;\n            }\n        }\n    ]);\n    return LayerState1;\n}((0, _componentStateDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"../lifecycle/component-state\":\"9tnht\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kZ5ua\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ResourceManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _resource = require(\"./resource\");\nvar _resourceDefault = parcelHelpers.interopDefault(_resource);\nvar ResourceManager = function() {\n    function ResourceManager1(_ref) {\n        var gl = _ref.gl, protocol = _ref.protocol;\n        (0, _classCallCheckDefault.default)(this, ResourceManager1);\n        this.protocol = protocol || \"resource://\";\n        this._context = {\n            gl: gl,\n            resourceManager: this\n        };\n        this._resources = {};\n        this._consumers = {};\n        this._pruneRequest = null;\n    }\n    (0, _createClassDefault.default)(ResourceManager1, [\n        {\n            key: \"contains\",\n            value: function contains(resourceId) {\n                if (resourceId.startsWith(this.protocol)) return true;\n                return resourceId in this._resources;\n            }\n        },\n        {\n            key: \"add\",\n            value: function add(_ref2) {\n                var resourceId = _ref2.resourceId, data = _ref2.data, _ref2$forceUpdate = _ref2.forceUpdate, forceUpdate = _ref2$forceUpdate === void 0 ? false : _ref2$forceUpdate, _ref2$persistent = _ref2.persistent, persistent = _ref2$persistent === void 0 ? true : _ref2$persistent;\n                var res = this._resources[resourceId];\n                if (res) res.setData(data, forceUpdate);\n                else {\n                    res = new (0, _resourceDefault.default)(resourceId, data, this._context);\n                    this._resources[resourceId] = res;\n                }\n                res.persistent = persistent;\n            }\n        },\n        {\n            key: \"remove\",\n            value: function remove(resourceId) {\n                var res = this._resources[resourceId];\n                if (res) {\n                    res[\"delete\"]();\n                    delete this._resources[resourceId];\n                }\n            }\n        },\n        {\n            key: \"unsubscribe\",\n            value: function unsubscribe(_ref3) {\n                var consumerId = _ref3.consumerId;\n                var consumer = this._consumers[consumerId];\n                if (consumer) {\n                    for(var requestId in consumer){\n                        var request = consumer[requestId];\n                        if (request.resource) request.resource.unsubscribe(request);\n                    }\n                    delete this._consumers[consumerId];\n                    this.prune();\n                }\n            }\n        },\n        {\n            key: \"subscribe\",\n            value: function subscribe(_ref4) {\n                var resourceId = _ref4.resourceId, onChange = _ref4.onChange, consumerId = _ref4.consumerId, _ref4$requestId = _ref4.requestId, requestId = _ref4$requestId === void 0 ? \"default\" : _ref4$requestId;\n                var resources = this._resources, protocol = this.protocol;\n                if (resourceId.startsWith(protocol)) {\n                    resourceId = resourceId.replace(protocol, \"\");\n                    if (!resources[resourceId]) this.add({\n                        resourceId: resourceId,\n                        data: null,\n                        persistent: false\n                    });\n                }\n                var res = resources[resourceId];\n                this._track(consumerId, requestId, res, onChange);\n                if (res) return res.getData();\n                return undefined;\n            }\n        },\n        {\n            key: \"prune\",\n            value: function prune() {\n                var _this = this;\n                if (!this._pruneRequest) this._pruneRequest = setTimeout(function() {\n                    return _this._prune();\n                }, 0);\n            }\n        },\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var key in this._resources)this._resources[key][\"delete\"]();\n            }\n        },\n        {\n            key: \"_track\",\n            value: function _track(consumerId, requestId, resource, onChange) {\n                var consumers = this._consumers;\n                var consumer = consumers[consumerId] = consumers[consumerId] || {};\n                var request = consumer[requestId] || {};\n                if (request.resource) {\n                    request.resource.unsubscribe(request);\n                    request.resource = null;\n                    this.prune();\n                }\n                if (resource) {\n                    consumer[requestId] = request;\n                    request.onChange = onChange;\n                    request.resource = resource;\n                    resource.subscribe(request);\n                }\n            }\n        },\n        {\n            key: \"_prune\",\n            value: function _prune() {\n                this._pruneRequest = null;\n                for(var _i = 0, _Object$keys = Object.keys(this._resources); _i < _Object$keys.length; _i++){\n                    var key = _Object$keys[_i];\n                    var res = this._resources[key];\n                    if (!res.persistent && !res.inUse()) {\n                        res[\"delete\"]();\n                        delete this._resources[key];\n                    }\n                }\n            }\n        }\n    ]);\n    return ResourceManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./resource\":\"1ifou\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1ifou\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Resource);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@loaders.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar Resource = function() {\n    function Resource1(id, data, context) {\n        (0, _classCallCheckDefault.default)(this, Resource1);\n        this.id = id;\n        this.context = context;\n        this._loadCount = 0;\n        this._subscribers = new Set();\n        this.setData(data);\n    }\n    (0, _createClassDefault.default)(Resource1, [\n        {\n            key: \"subscribe\",\n            value: function subscribe(consumer) {\n                this._subscribers.add(consumer);\n            }\n        },\n        {\n            key: \"unsubscribe\",\n            value: function unsubscribe(consumer) {\n                this._subscribers[\"delete\"](consumer);\n            }\n        },\n        {\n            key: \"inUse\",\n            value: function inUse() {\n                return this._subscribers.size > 0;\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {}\n        },\n        {\n            key: \"getData\",\n            value: function getData() {\n                var _this = this;\n                return this.isLoaded ? this._error ? Promise.reject(this._error) : this._content : this._loader.then(function() {\n                    return _this.getData();\n                });\n            }\n        },\n        {\n            key: \"setData\",\n            value: function setData(data, forceUpdate) {\n                var _this2 = this;\n                if (data === this._data && !forceUpdate) return;\n                this._data = data;\n                var loadCount = ++this._loadCount;\n                var loader = data;\n                if (typeof data === \"string\") loader = (0, _core.load)(data);\n                if (loader instanceof Promise) {\n                    this.isLoaded = false;\n                    this._loader = loader.then(function(result) {\n                        if (_this2._loadCount === loadCount) {\n                            _this2.isLoaded = true;\n                            _this2._error = null;\n                            _this2._content = result;\n                        }\n                    })[\"catch\"](function(error) {\n                        if (_this2._loadCount === loadCount) {\n                            _this2.isLoaded = true;\n                            _this2._error = error || true;\n                        }\n                    });\n                } else {\n                    this.isLoaded = true;\n                    this._error = null;\n                    this._content = data;\n                }\n                var _iterator = _createForOfIteratorHelper(this._subscribers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var subscriber = _step.value;\n                        subscriber.onChange(this.getData());\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n            }\n        }\n    ]);\n    return Resource1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@loaders.gl/core\":\"7dwvE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lLkpv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ViewManager);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _flatten = require(\"../utils/flatten\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar ViewManager = function() {\n    function ViewManager1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, ViewManager1);\n        this.views = [];\n        this.width = 100;\n        this.height = 100;\n        this.viewState = {};\n        this.controllers = {};\n        this.timeline = props.timeline;\n        this._viewports = [];\n        this._viewportMap = {};\n        this._isUpdating = false;\n        this._needsRedraw = \"Initial render\";\n        this._needsUpdate = true;\n        this._eventManager = props.eventManager;\n        this._eventCallbacks = {\n            onViewStateChange: props.onViewStateChange,\n            onInteractiveStateChange: props.onInteractiveStateChange\n        };\n        Object.seal(this);\n        this.setProps(props);\n    }\n    (0, _createClassDefault.default)(ViewManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var key in this.controllers)if (this.controllers[key]) this.controllers[key].finalize();\n                this.controllers = {};\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                return redraw;\n            }\n        },\n        {\n            key: \"setNeedsUpdate\",\n            value: function setNeedsUpdate(reason) {\n                this._needsUpdate = this._needsUpdate || reason;\n                this._needsRedraw = this._needsRedraw || reason;\n            }\n        },\n        {\n            key: \"updateViewStates\",\n            value: function updateViewStates() {\n                for(var viewId in this.controllers){\n                    var controller = this.controllers[viewId];\n                    if (controller) controller.updateTransition();\n                }\n            }\n        },\n        {\n            key: \"getViewports\",\n            value: function getViewports(rect) {\n                if (rect) return this._viewports.filter(function(viewport) {\n                    return viewport.containsPixel(rect);\n                });\n                return this._viewports;\n            }\n        },\n        {\n            key: \"getViews\",\n            value: function getViews() {\n                var viewMap = {};\n                this.views.forEach(function(view) {\n                    viewMap[view.id] = view;\n                });\n                return viewMap;\n            }\n        },\n        {\n            key: \"getView\",\n            value: function getView(viewOrViewId) {\n                return typeof viewOrViewId === \"string\" ? this.views.find(function(view) {\n                    return view.id === viewOrViewId;\n                }) : viewOrViewId;\n            }\n        },\n        {\n            key: \"getViewState\",\n            value: function getViewState(viewId) {\n                var view = this.getView(viewId);\n                var viewState = view && this.viewState[view.getViewStateId()] || this.viewState;\n                return view ? view.filterViewState(viewState) : viewState;\n            }\n        },\n        {\n            key: \"getViewport\",\n            value: function getViewport(viewId) {\n                return this._viewportMap[viewId];\n            }\n        },\n        {\n            key: \"unproject\",\n            value: function unproject(xyz, opts) {\n                var viewports = this.getViewports();\n                var pixel = {\n                    x: xyz[0],\n                    y: xyz[1]\n                };\n                for(var i = viewports.length - 1; i >= 0; --i){\n                    var viewport = viewports[i];\n                    if (viewport.containsPixel(pixel)) {\n                        var p = xyz.slice();\n                        p[0] -= viewport.x;\n                        p[1] -= viewport.y;\n                        return viewport.unproject(p, opts);\n                    }\n                }\n                return null;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"views\" in props) this._setViews(props.views);\n                if (\"viewState\" in props) this._setViewState(props.viewState);\n                if (\"width\" in props || \"height\" in props) this._setSize(props.width, props.height);\n                if (!this._isUpdating) this._update();\n            }\n        },\n        {\n            key: \"_update\",\n            value: function _update() {\n                this._isUpdating = true;\n                if (this._needsUpdate) {\n                    this._needsUpdate = false;\n                    this._rebuildViewports();\n                }\n                if (this._needsUpdate) {\n                    this._needsUpdate = false;\n                    this._rebuildViewports();\n                }\n                this._isUpdating = false;\n            }\n        },\n        {\n            key: \"_setSize\",\n            value: function _setSize(width, height) {\n                (0, _assertDefault.default)(Number.isFinite(width) && Number.isFinite(height));\n                if (width !== this.width || height !== this.height) {\n                    this.width = width;\n                    this.height = height;\n                    this.setNeedsUpdate(\"Size changed\");\n                }\n            }\n        },\n        {\n            key: \"_setViews\",\n            value: function _setViews(views) {\n                views = (0, _flatten.flatten)(views, Boolean);\n                var viewsChanged = this._diffViews(views, this.views);\n                if (viewsChanged) this.setNeedsUpdate(\"views changed\");\n                this.views = views;\n            }\n        },\n        {\n            key: \"_setViewState\",\n            value: function _setViewState(viewState) {\n                if (viewState) {\n                    var viewStateChanged = !(0, _deepEqual.deepEqual)(viewState, this.viewState);\n                    if (viewStateChanged) this.setNeedsUpdate(\"viewState changed\");\n                    this.viewState = viewState;\n                } else (0, _logDefault.default).warn(\"missing `viewState` or `initialViewState`\")();\n            }\n        },\n        {\n            key: \"_onViewStateChange\",\n            value: function _onViewStateChange(viewId, event) {\n                event.viewId = viewId;\n                this._eventCallbacks.onViewStateChange(event);\n            }\n        },\n        {\n            key: \"_createController\",\n            value: function _createController(view, props) {\n                var Controller = props.type;\n                var controller = new Controller(_objectSpread({\n                    timeline: this.timeline,\n                    eventManager: this._eventManager,\n                    onViewStateChange: this._onViewStateChange.bind(this, props.id),\n                    onStateChange: this._eventCallbacks.onInteractiveStateChange,\n                    makeViewport: view._getViewport.bind(view)\n                }, props));\n                return controller;\n            }\n        },\n        {\n            key: \"_updateController\",\n            value: function _updateController(view, viewState, viewport, controller) {\n                var controllerProps = view.controller;\n                if (controllerProps) {\n                    controllerProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, viewState), view.props), controllerProps), {}, {\n                        id: view.id,\n                        x: viewport.x,\n                        y: viewport.y,\n                        width: viewport.width,\n                        height: viewport.height\n                    });\n                    if (controller) controller.setProps(controllerProps);\n                    else controller = this._createController(view, controllerProps);\n                    return controller;\n                }\n                return null;\n            }\n        },\n        {\n            key: \"_rebuildViewports\",\n            value: function _rebuildViewports() {\n                var width = this.width, height = this.height, views = this.views;\n                var oldControllers = this.controllers;\n                this._viewports = [];\n                this.controllers = {};\n                for(var i = views.length; i--;){\n                    var view = views[i];\n                    var viewState = this.getViewState(view);\n                    var viewport = view.makeViewport({\n                        width: width,\n                        height: height,\n                        viewState: viewState\n                    });\n                    this.controllers[view.id] = this._updateController(view, viewState, viewport, oldControllers[view.id]);\n                    this._viewports.unshift(viewport);\n                }\n                for(var id in oldControllers)if (oldControllers[id] && !this.controllers[id]) oldControllers[id].finalize();\n                this._buildViewportMap();\n            }\n        },\n        {\n            key: \"_buildViewportMap\",\n            value: function _buildViewportMap() {\n                var _this = this;\n                this._viewportMap = {};\n                this._viewports.forEach(function(viewport) {\n                    if (viewport.id) _this._viewportMap[viewport.id] = _this._viewportMap[viewport.id] || viewport;\n                });\n            }\n        },\n        {\n            key: \"_diffViews\",\n            value: function _diffViews(newViews, oldViews) {\n                if (newViews.length !== oldViews.length) return true;\n                return newViews.some(function(_, i) {\n                    return !newViews[i].equals(oldViews[i]);\n                });\n            }\n        }\n    ]);\n    return ViewManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../utils/assert\":\"8goZO\",\"../utils/deep-equal\":\"kF0nW\",\"../utils/log\":\"fg4UT\",\"../utils/flatten\":\"1zGCw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kF0nW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"deepEqual\", ()=>deepEqual);\nfunction deepEqual(a, b) {\n    if (a === b) return true;\n    if (!a || !b) return false;\n    for(var key in a){\n        var aValue = a[key];\n        var bValue = b[key];\n        var equals = aValue === bValue || Array.isArray(aValue) && Array.isArray(bValue) && deepEqual(aValue, bValue);\n        if (!equals) return false;\n    }\n    return true;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c4mn5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>MapView);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _webMercatorViewport = require(\"../viewports/web-mercator-viewport\");\nvar _webMercatorViewportDefault = parcelHelpers.interopDefault(_webMercatorViewport);\nvar _mapController = require(\"../controllers/map-controller\");\nvar _mapControllerDefault = parcelHelpers.interopDefault(_mapController);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar MapView = function(_View) {\n    (0, _inheritsDefault.default)(MapView1, _View);\n    var _super = _createSuper(MapView1);\n    function MapView1(props) {\n        (0, _classCallCheckDefault.default)(this, MapView1);\n        return _super.call(this, Object.assign({}, props, {\n            type: (0, _webMercatorViewportDefault.default)\n        }));\n    }\n    (0, _createClassDefault.default)(MapView1, [\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _mapControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return MapView1;\n}((0, _viewDefault.default));\nMapView.displayName = \"MapView\";\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./view\":\"d0jsQ\",\"../viewports/web-mercator-viewport\":\"kRsWv\",\"../controllers/map-controller\":\"e5pb1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d0jsQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>View);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _positions = require(\"../utils/positions\");\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar View = function() {\n    function View1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, View1);\n        var _props$id = props.id, id = _props$id === void 0 ? null : _props$id, _props$x = props.x, x = _props$x === void 0 ? 0 : _props$x, _props$y = props.y, y = _props$y === void 0 ? 0 : _props$y, _props$width = props.width, width = _props$width === void 0 ? \"100%\" : _props$width, _props$height = props.height, height = _props$height === void 0 ? \"100%\" : _props$height, _props$projectionMatr = props.projectionMatrix, projectionMatrix = _props$projectionMatr === void 0 ? null : _props$projectionMatr, _props$fovy = props.fovy, fovy = _props$fovy === void 0 ? 50 : _props$fovy, _props$near = props.near, near = _props$near === void 0 ? 0.1 : _props$near, _props$far = props.far, far = _props$far === void 0 ? 1000 : _props$far, _props$modelMatrix = props.modelMatrix, modelMatrix = _props$modelMatrix === void 0 ? null : _props$modelMatrix, _props$viewportInstan = props.viewportInstance, viewportInstance = _props$viewportInstan === void 0 ? null : _props$viewportInstan, _props$type = props.type, type = _props$type === void 0 ? (0, _viewportDefault.default) : _props$type;\n        (0, _assertDefault.default)(!viewportInstance || viewportInstance instanceof (0, _viewportDefault.default));\n        this.viewportInstance = viewportInstance;\n        this.id = id || this.constructor.displayName || \"view\";\n        this.type = type;\n        this.props = Object.assign({}, props, {\n            id: this.id,\n            projectionMatrix: projectionMatrix,\n            fovy: fovy,\n            near: near,\n            far: far,\n            modelMatrix: modelMatrix\n        });\n        this._parseDimensions({\n            x: x,\n            y: y,\n            width: width,\n            height: height\n        });\n        this.equals = this.equals.bind(this);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(View1, [\n        {\n            key: \"equals\",\n            value: function equals(view) {\n                if (this === view) return true;\n                if (this.viewportInstance) return view.viewportInstance && this.viewportInstance.equals(view.viewportInstance);\n                var viewChanged = (0, _deepEqual.deepEqual)(this.props, view.props);\n                return viewChanged;\n            }\n        },\n        {\n            key: \"makeViewport\",\n            value: function makeViewport(_ref) {\n                var width = _ref.width, height = _ref.height, viewState = _ref.viewState;\n                if (this.viewportInstance) return this.viewportInstance;\n                viewState = this.filterViewState(viewState);\n                var viewportDimensions = this.getDimensions({\n                    width: width,\n                    height: height\n                });\n                var props = _objectSpread(_objectSpread(_objectSpread({}, viewState), this.props), viewportDimensions);\n                return this._getViewport(props);\n            }\n        },\n        {\n            key: \"getViewStateId\",\n            value: function getViewStateId() {\n                switch((0, _typeofDefault.default)(this.props.viewState)){\n                    case \"string\":\n                        return this.props.viewState;\n                    case \"object\":\n                        return this.props.viewState && this.props.viewState.id;\n                    default:\n                        return this.id;\n                }\n            }\n        },\n        {\n            key: \"filterViewState\",\n            value: function filterViewState(viewState) {\n                if (this.props.viewState && (0, _typeofDefault.default)(this.props.viewState) === \"object\") {\n                    if (!this.props.viewState.id) return this.props.viewState;\n                    var newViewState = Object.assign({}, viewState);\n                    for(var key in this.props.viewState)if (key !== \"id\") newViewState[key] = this.props.viewState[key];\n                    return newViewState;\n                }\n                return viewState;\n            }\n        },\n        {\n            key: \"getDimensions\",\n            value: function getDimensions(_ref2) {\n                var width = _ref2.width, height = _ref2.height;\n                return {\n                    x: (0, _positions.getPosition)(this._x, width),\n                    y: (0, _positions.getPosition)(this._y, height),\n                    width: (0, _positions.getPosition)(this._width, width),\n                    height: (0, _positions.getPosition)(this._height, height)\n                };\n            }\n        },\n        {\n            key: \"_getControllerProps\",\n            value: function _getControllerProps(defaultOpts) {\n                var opts = this.props.controller;\n                if (!opts) return null;\n                if (opts === true) return defaultOpts;\n                if (typeof opts === \"function\") opts = {\n                    type: opts\n                };\n                return Object.assign({}, defaultOpts, opts);\n            }\n        },\n        {\n            key: \"_getViewport\",\n            value: function _getViewport(props) {\n                var ViewportType = this.type;\n                return new ViewportType(props);\n            }\n        },\n        {\n            key: \"_parseDimensions\",\n            value: function _parseDimensions(_ref3) {\n                var x = _ref3.x, y = _ref3.y, width = _ref3.width, height = _ref3.height;\n                this._x = (0, _positions.parsePosition)(x);\n                this._y = (0, _positions.parsePosition)(y);\n                this._width = (0, _positions.parsePosition)(width);\n                this._height = (0, _positions.parsePosition)(height);\n            }\n        }\n    ]);\n    return View1;\n}();\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../viewports/viewport\":\"jETN1\",\"../utils/positions\":\"i6KCZ\",\"../utils/deep-equal\":\"kF0nW\",\"../utils/assert\":\"8goZO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i6KCZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parsePosition\", ()=>parsePosition);\nparcelHelpers.export(exports, \"getPosition\", ()=>getPosition);\nvar _typeof = require(\"@babel/runtime/helpers/esm/typeof\");\nvar _typeofDefault = parcelHelpers.interopDefault(_typeof);\nvar PERCENT_OR_PIXELS_REGEX = /([0-9]+\\.?[0-9]*)(%|px)/;\nfunction parsePosition(value) {\n    switch((0, _typeofDefault.default)(value)){\n        case \"number\":\n            return {\n                position: value,\n                relative: false\n            };\n        case \"string\":\n            var match = value.match(PERCENT_OR_PIXELS_REGEX);\n            if (match && match.length >= 3) {\n                var relative = match[2] === \"%\";\n                var position = parseFloat(match[1]);\n                return {\n                    position: relative ? position / 100 : position,\n                    relative: relative\n                };\n            }\n        default:\n            throw new Error(\"Could not parse position string \".concat(value));\n    }\n}\nfunction getPosition(position, extent) {\n    return position.relative ? Math.round(position.position * extent) : position.position;\n}\n\n},{\"@babel/runtime/helpers/esm/typeof\":\"1p2Zr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e5pb1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"MAPBOX_LIMITS\", ()=>MAPBOX_LIMITS);\nparcelHelpers.export(exports, \"MapState\", ()=>MapState);\nparcelHelpers.export(exports, \"default\", ()=>MapController);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _viewState = require(\"./view-state\");\nvar _viewStateDefault = parcelHelpers.interopDefault(_viewState);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transitionManager = require(\"./transition-manager\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar PITCH_MOUSE_THRESHOLD = 5;\nvar PITCH_ACCEL = 1.2;\nvar LINEAR_TRANSITION_PROPS = {\n    transitionDuration: 300,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)(),\n    transitionInterruption: (0, _transitionManager.TRANSITION_EVENTS).BREAK\n};\nvar NO_TRANSITION_PROPS = {\n    transitionDuration: 0\n};\nvar MAPBOX_LIMITS = {\n    minZoom: 0,\n    maxZoom: 20,\n    minPitch: 0,\n    maxPitch: 60\n};\nvar DEFAULT_STATE = {\n    pitch: 0,\n    bearing: 0,\n    altitude: 1.5\n};\nvar MapState = function(_ViewState) {\n    (0, _inheritsDefault.default)(MapState1, _ViewState);\n    var _super = _createSuper(MapState1);\n    function MapState1() {\n        var _this;\n        var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, makeViewport = _ref.makeViewport, width = _ref.width, height = _ref.height, latitude = _ref.latitude, longitude = _ref.longitude, zoom = _ref.zoom, _ref$bearing = _ref.bearing, bearing = _ref$bearing === void 0 ? DEFAULT_STATE.bearing : _ref$bearing, _ref$pitch = _ref.pitch, pitch = _ref$pitch === void 0 ? DEFAULT_STATE.pitch : _ref$pitch, _ref$altitude = _ref.altitude, altitude = _ref$altitude === void 0 ? DEFAULT_STATE.altitude : _ref$altitude, _ref$maxZoom = _ref.maxZoom, maxZoom = _ref$maxZoom === void 0 ? MAPBOX_LIMITS.maxZoom : _ref$maxZoom, _ref$minZoom = _ref.minZoom, minZoom = _ref$minZoom === void 0 ? MAPBOX_LIMITS.minZoom : _ref$minZoom, _ref$maxPitch = _ref.maxPitch, maxPitch = _ref$maxPitch === void 0 ? MAPBOX_LIMITS.maxPitch : _ref$maxPitch, _ref$minPitch = _ref.minPitch, minPitch = _ref$minPitch === void 0 ? MAPBOX_LIMITS.minPitch : _ref$minPitch, startPanLngLat = _ref.startPanLngLat, startZoomLngLat = _ref.startZoomLngLat, startBearing = _ref.startBearing, startPitch = _ref.startPitch, startZoom = _ref.startZoom;\n        (0, _classCallCheckDefault.default)(this, MapState1);\n        (0, _assertDefault.default)(Number.isFinite(longitude), \"`longitude` must be supplied\");\n        (0, _assertDefault.default)(Number.isFinite(latitude), \"`latitude` must be supplied\");\n        (0, _assertDefault.default)(Number.isFinite(zoom), \"`zoom` must be supplied\");\n        _this = _super.call(this, {\n            width: width,\n            height: height,\n            latitude: latitude,\n            longitude: longitude,\n            zoom: zoom,\n            bearing: bearing,\n            pitch: pitch,\n            altitude: altitude,\n            maxZoom: maxZoom,\n            minZoom: minZoom,\n            maxPitch: maxPitch,\n            minPitch: minPitch\n        });\n        _this._interactiveState = {\n            startPanLngLat: startPanLngLat,\n            startZoomLngLat: startZoomLngLat,\n            startBearing: startBearing,\n            startPitch: startPitch,\n            startZoom: startZoom\n        };\n        _this.makeViewport = makeViewport;\n        return _this;\n    }\n    (0, _createClassDefault.default)(MapState1, [\n        {\n            key: \"getViewportProps\",\n            value: function getViewportProps() {\n                return this._viewportProps;\n            }\n        },\n        {\n            key: \"getInteractiveState\",\n            value: function getInteractiveState() {\n                return this._interactiveState;\n            }\n        },\n        {\n            key: \"panStart\",\n            value: function panStart(_ref2) {\n                var pos = _ref2.pos;\n                return this._getUpdatedState({\n                    startPanLngLat: this._unproject(pos)\n                });\n            }\n        },\n        {\n            key: \"pan\",\n            value: function pan(_ref3) {\n                var pos = _ref3.pos, startPos = _ref3.startPos;\n                var startPanLngLat = this._interactiveState.startPanLngLat || this._unproject(startPos);\n                if (!startPanLngLat) return this;\n                var _this$_calculateNewLn = this._calculateNewLngLat({\n                    startPanLngLat: startPanLngLat,\n                    pos: pos\n                }), _this$_calculateNewLn2 = (0, _slicedToArrayDefault.default)(_this$_calculateNewLn, 2), longitude = _this$_calculateNewLn2[0], latitude = _this$_calculateNewLn2[1];\n                return this._getUpdatedState({\n                    longitude: longitude,\n                    latitude: latitude\n                });\n            }\n        },\n        {\n            key: \"panEnd\",\n            value: function panEnd() {\n                return this._getUpdatedState({\n                    startPanLngLat: null\n                });\n            }\n        },\n        {\n            key: \"rotateStart\",\n            value: function rotateStart(_ref4) {\n                var pos = _ref4.pos;\n                return this._getUpdatedState({\n                    startBearing: this._viewportProps.bearing,\n                    startPitch: this._viewportProps.pitch\n                });\n            }\n        },\n        {\n            key: \"rotate\",\n            value: function rotate(_ref5) {\n                var _ref5$deltaScaleX = _ref5.deltaScaleX, deltaScaleX = _ref5$deltaScaleX === void 0 ? 0 : _ref5$deltaScaleX, _ref5$deltaScaleY = _ref5.deltaScaleY, deltaScaleY = _ref5$deltaScaleY === void 0 ? 0 : _ref5$deltaScaleY;\n                var _this$_interactiveSta = this._interactiveState, startBearing = _this$_interactiveSta.startBearing, startPitch = _this$_interactiveSta.startPitch;\n                if (!Number.isFinite(startBearing) || !Number.isFinite(startPitch)) return this;\n                var _this$_calculateNewPi = this._calculateNewPitchAndBearing({\n                    deltaScaleX: deltaScaleX,\n                    deltaScaleY: deltaScaleY,\n                    startBearing: startBearing,\n                    startPitch: startPitch\n                }), pitch = _this$_calculateNewPi.pitch, bearing = _this$_calculateNewPi.bearing;\n                return this._getUpdatedState({\n                    bearing: bearing,\n                    pitch: pitch\n                });\n            }\n        },\n        {\n            key: \"rotateEnd\",\n            value: function rotateEnd() {\n                return this._getUpdatedState({\n                    startBearing: null,\n                    startPitch: null\n                });\n            }\n        },\n        {\n            key: \"zoomStart\",\n            value: function zoomStart(_ref6) {\n                var pos = _ref6.pos;\n                return this._getUpdatedState({\n                    startZoomLngLat: this._unproject(pos),\n                    startZoom: this._viewportProps.zoom\n                });\n            }\n        },\n        {\n            key: \"zoom\",\n            value: function zoom(_ref7) {\n                var pos = _ref7.pos, startPos = _ref7.startPos, scale = _ref7.scale;\n                var _this$_interactiveSta2 = this._interactiveState, startZoom = _this$_interactiveSta2.startZoom, startZoomLngLat = _this$_interactiveSta2.startZoomLngLat;\n                if (!Number.isFinite(startZoom)) {\n                    startZoom = this._viewportProps.zoom;\n                    startZoomLngLat = this._unproject(startPos) || this._unproject(pos);\n                }\n                var zoom = this._calculateNewZoom({\n                    scale: scale,\n                    startZoom: startZoom\n                });\n                var zoomedViewport = this.makeViewport(_objectSpread(_objectSpread({}, this._viewportProps), {}, {\n                    zoom: zoom\n                }));\n                var _zoomedViewport$getMa = zoomedViewport.getMapCenterByLngLatPosition({\n                    lngLat: startZoomLngLat,\n                    pos: pos\n                }), _zoomedViewport$getMa2 = (0, _slicedToArrayDefault.default)(_zoomedViewport$getMa, 2), longitude = _zoomedViewport$getMa2[0], latitude = _zoomedViewport$getMa2[1];\n                return this._getUpdatedState({\n                    zoom: zoom,\n                    longitude: longitude,\n                    latitude: latitude\n                });\n            }\n        },\n        {\n            key: \"zoomEnd\",\n            value: function zoomEnd() {\n                return this._getUpdatedState({\n                    startZoomLngLat: null,\n                    startZoom: null\n                });\n            }\n        },\n        {\n            key: \"zoomIn\",\n            value: function zoomIn() {\n                return this._zoomFromCenter(2);\n            }\n        },\n        {\n            key: \"zoomOut\",\n            value: function zoomOut() {\n                return this._zoomFromCenter(0.5);\n            }\n        },\n        {\n            key: \"moveLeft\",\n            value: function moveLeft() {\n                return this._panFromCenter([\n                    100,\n                    0\n                ]);\n            }\n        },\n        {\n            key: \"moveRight\",\n            value: function moveRight() {\n                return this._panFromCenter([\n                    -100,\n                    0\n                ]);\n            }\n        },\n        {\n            key: \"moveUp\",\n            value: function moveUp() {\n                return this._panFromCenter([\n                    0,\n                    100\n                ]);\n            }\n        },\n        {\n            key: \"moveDown\",\n            value: function moveDown() {\n                return this._panFromCenter([\n                    0,\n                    -100\n                ]);\n            }\n        },\n        {\n            key: \"rotateLeft\",\n            value: function rotateLeft() {\n                return this._getUpdatedState({\n                    bearing: this._viewportProps.bearing - 15\n                });\n            }\n        },\n        {\n            key: \"rotateRight\",\n            value: function rotateRight() {\n                return this._getUpdatedState({\n                    bearing: this._viewportProps.bearing + 15\n                });\n            }\n        },\n        {\n            key: \"rotateUp\",\n            value: function rotateUp() {\n                return this._getUpdatedState({\n                    pitch: this._viewportProps.pitch + 10\n                });\n            }\n        },\n        {\n            key: \"rotateDown\",\n            value: function rotateDown() {\n                return this._getUpdatedState({\n                    pitch: this._viewportProps.pitch - 10\n                });\n            }\n        },\n        {\n            key: \"shortestPathFrom\",\n            value: function shortestPathFrom(viewState) {\n                var fromProps = viewState.getViewportProps();\n                var props = Object.assign({}, this._viewportProps);\n                var bearing = props.bearing, longitude = props.longitude;\n                if (Math.abs(bearing - fromProps.bearing) > 180) props.bearing = bearing < 0 ? bearing + 360 : bearing - 360;\n                if (Math.abs(longitude - fromProps.longitude) > 180) props.longitude = longitude < 0 ? longitude + 360 : longitude - 360;\n                return props;\n            }\n        },\n        {\n            key: \"_zoomFromCenter\",\n            value: function _zoomFromCenter(scale) {\n                var _this$_viewportProps = this._viewportProps, width = _this$_viewportProps.width, height = _this$_viewportProps.height;\n                return this.zoom({\n                    pos: [\n                        width / 2,\n                        height / 2\n                    ],\n                    scale: scale\n                });\n            }\n        },\n        {\n            key: \"_panFromCenter\",\n            value: function _panFromCenter(offset) {\n                var _this$_viewportProps2 = this._viewportProps, width = _this$_viewportProps2.width, height = _this$_viewportProps2.height;\n                return this.pan({\n                    startPos: [\n                        width / 2,\n                        height / 2\n                    ],\n                    pos: [\n                        width / 2 + offset[0],\n                        height / 2 + offset[1]\n                    ]\n                });\n            }\n        },\n        {\n            key: \"_getUpdatedState\",\n            value: function _getUpdatedState(newProps) {\n                return new this.constructor(_objectSpread(_objectSpread(_objectSpread({\n                    makeViewport: this.makeViewport\n                }, this._viewportProps), this._interactiveState), newProps));\n            }\n        },\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                var maxZoom = props.maxZoom, minZoom = props.minZoom, zoom = props.zoom;\n                props.zoom = (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n                var maxPitch = props.maxPitch, minPitch = props.minPitch, pitch = props.pitch;\n                props.pitch = (0, _mathGl.clamp)(pitch, minPitch, maxPitch);\n                Object.assign(props, (0, _webMercator.normalizeViewportProps)(props));\n                return props;\n            }\n        },\n        {\n            key: \"_unproject\",\n            value: function _unproject(pos) {\n                var viewport = this.makeViewport(this._viewportProps);\n                return pos && viewport.unproject(pos);\n            }\n        },\n        {\n            key: \"_calculateNewLngLat\",\n            value: function _calculateNewLngLat(_ref8) {\n                var startPanLngLat = _ref8.startPanLngLat, pos = _ref8.pos;\n                var viewport = this.makeViewport(this._viewportProps);\n                return viewport.getMapCenterByLngLatPosition({\n                    lngLat: startPanLngLat,\n                    pos: pos\n                });\n            }\n        },\n        {\n            key: \"_calculateNewZoom\",\n            value: function _calculateNewZoom(_ref9) {\n                var scale = _ref9.scale, startZoom = _ref9.startZoom;\n                var _this$_viewportProps3 = this._viewportProps, maxZoom = _this$_viewportProps3.maxZoom, minZoom = _this$_viewportProps3.minZoom;\n                var zoom = startZoom + Math.log2(scale);\n                return (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n            }\n        },\n        {\n            key: \"_calculateNewPitchAndBearing\",\n            value: function _calculateNewPitchAndBearing(_ref10) {\n                var deltaScaleX = _ref10.deltaScaleX, deltaScaleY = _ref10.deltaScaleY, startBearing = _ref10.startBearing, startPitch = _ref10.startPitch;\n                deltaScaleY = (0, _mathGl.clamp)(deltaScaleY, -1, 1);\n                var _this$_viewportProps4 = this._viewportProps, minPitch = _this$_viewportProps4.minPitch, maxPitch = _this$_viewportProps4.maxPitch;\n                var bearing = startBearing + 180 * deltaScaleX;\n                var pitch = startPitch;\n                if (deltaScaleY > 0) pitch = startPitch + deltaScaleY * (maxPitch - startPitch);\n                else if (deltaScaleY < 0) pitch = startPitch - deltaScaleY * (minPitch - startPitch);\n                return {\n                    pitch: pitch,\n                    bearing: bearing\n                };\n            }\n        }\n    ]);\n    return MapState1;\n}((0, _viewStateDefault.default));\nvar MapController = function(_Controller) {\n    (0, _inheritsDefault.default)(MapController1, _Controller);\n    var _super2 = _createSuper(MapController1);\n    function MapController1(props) {\n        var _this2;\n        (0, _classCallCheckDefault.default)(this, MapController1);\n        _this2 = _super2.call(this, MapState, props);\n        _this2.invertPan = true;\n        return _this2;\n    }\n    (0, _createClassDefault.default)(MapController1, [\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return LINEAR_TRANSITION_PROPS;\n            }\n        },\n        {\n            key: \"_onPanRotate\",\n            value: function _onPanRotate(event) {\n                if (!this.dragRotate) return false;\n                var deltaX = event.deltaX, deltaY = event.deltaY;\n                var _this$getCenter = this.getCenter(event), _this$getCenter2 = (0, _slicedToArrayDefault.default)(_this$getCenter, 2), centerY = _this$getCenter2[1];\n                var startY = centerY - deltaY;\n                var _this$controllerState = this.controllerState.getViewportProps(), width = _this$controllerState.width, height = _this$controllerState.height;\n                var deltaScaleX = deltaX / width;\n                var deltaScaleY = 0;\n                if (deltaY > 0) {\n                    if (Math.abs(height - startY) > PITCH_MOUSE_THRESHOLD) deltaScaleY = deltaY / (startY - height) * PITCH_ACCEL;\n                } else if (deltaY < 0) {\n                    if (startY > PITCH_MOUSE_THRESHOLD) deltaScaleY = 1 - centerY / startY;\n                }\n                deltaScaleY = Math.min(1, Math.max(-1, deltaScaleY));\n                var newControllerState = this.controllerState.rotate({\n                    deltaScaleX: deltaScaleX,\n                    deltaScaleY: deltaScaleY\n                });\n                return this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true,\n                    isRotating: true\n                });\n            }\n        }\n    ]);\n    return MapController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"math.gl\":\"6aDAl\",\"./controller\":\"j3Tf5\",\"./view-state\":\"bvyJt\",\"@math.gl/web-mercator\":\"jS2l3\",\"../utils/assert\":\"8goZO\",\"../transitions/linear-interpolator\":\"8J7qW\",\"./transition-manager\":\"alxon\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j3Tf5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Controller);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _transitionManager = require(\"./transition-manager\");\nvar _transitionManagerDefault = parcelHelpers.interopDefault(_transitionManager);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar NO_TRANSITION_PROPS = {\n    transitionDuration: 0\n};\nvar ZOOM_ACCEL = 0.01;\nvar EVENT_TYPES = {\n    WHEEL: [\n        \"wheel\"\n    ],\n    PAN: [\n        \"panstart\",\n        \"panmove\",\n        \"panend\"\n    ],\n    PINCH: [\n        \"pinchstart\",\n        \"pinchmove\",\n        \"pinchend\"\n    ],\n    DOUBLE_TAP: [\n        \"doubletap\"\n    ],\n    KEYBOARD: [\n        \"keydown\"\n    ]\n};\nvar Controller = function() {\n    function Controller1(ControllerState) {\n        var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, Controller1);\n        (0, _assertDefault.default)(ControllerState);\n        this.ControllerState = ControllerState;\n        this.controllerState = null;\n        this.controllerStateProps = null;\n        this.eventManager = null;\n        this.transitionManager = new (0, _transitionManagerDefault.default)(ControllerState, options);\n        this._events = null;\n        this._state = {\n            isDragging: false\n        };\n        this._customEvents = [];\n        this.onViewStateChange = null;\n        this.onStateChange = null;\n        this.invertPan = false;\n        this.handleEvent = this.handleEvent.bind(this);\n        this.setProps(options);\n    }\n    (0, _createClassDefault.default)(Controller1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                for(var eventName in this._events)if (this._events[eventName]) this.eventManager.off(eventName, this.handleEvent);\n                this.transitionManager.finalize();\n            }\n        },\n        {\n            key: \"handleEvent\",\n            value: function handleEvent(event) {\n                var ControllerState = this.ControllerState;\n                this.controllerState = new ControllerState(_objectSpread(_objectSpread({\n                    makeViewport: this.makeViewport\n                }, this.controllerStateProps), this._state));\n                switch(event.type){\n                    case \"panstart\":\n                        return this._onPanStart(event);\n                    case \"panmove\":\n                        return this._onPan(event);\n                    case \"panend\":\n                        return this._onPanEnd(event);\n                    case \"pinchstart\":\n                        return this._onPinchStart(event);\n                    case \"pinchmove\":\n                        return this._onPinch(event);\n                    case \"pinchend\":\n                        return this._onPinchEnd(event);\n                    case \"doubletap\":\n                        return this._onDoubleTap(event);\n                    case \"wheel\":\n                        return this._onWheel(event);\n                    case \"keydown\":\n                        return this._onKeyDown(event);\n                    default:\n                        return false;\n                }\n            }\n        },\n        {\n            key: \"getCenter\",\n            value: function getCenter(event) {\n                var _this$controllerState = this.controllerStateProps, x = _this$controllerState.x, y = _this$controllerState.y;\n                var offsetCenter = event.offsetCenter;\n                return [\n                    offsetCenter.x - x,\n                    offsetCenter.y - y\n                ];\n            }\n        },\n        {\n            key: \"isPointInBounds\",\n            value: function isPointInBounds(pos, event) {\n                var _this$controllerState2 = this.controllerStateProps, width = _this$controllerState2.width, height = _this$controllerState2.height;\n                if (event && event.handled) return false;\n                var inside = pos[0] >= 0 && pos[0] <= width && pos[1] >= 0 && pos[1] <= height;\n                if (inside && event) event.stopPropagation();\n                return inside;\n            }\n        },\n        {\n            key: \"isFunctionKeyPressed\",\n            value: function isFunctionKeyPressed(event) {\n                var srcEvent = event.srcEvent;\n                return Boolean(srcEvent.metaKey || srcEvent.altKey || srcEvent.ctrlKey || srcEvent.shiftKey);\n            }\n        },\n        {\n            key: \"isDragging\",\n            value: function isDragging() {\n                return this._state.isDragging;\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"onViewStateChange\" in props) this.onViewStateChange = props.onViewStateChange;\n                if (\"onStateChange\" in props) this.onStateChange = props.onStateChange;\n                if (\"makeViewport\" in props) this.makeViewport = props.makeViewport;\n                this.controllerStateProps = props;\n                if (\"eventManager\" in props && this.eventManager !== props.eventManager) {\n                    this.eventManager = props.eventManager;\n                    this._events = {};\n                    this.toggleEvents(this._customEvents, true);\n                }\n                this.transitionManager.processViewStateChange(this.controllerStateProps);\n                var _props$scrollZoom = props.scrollZoom, scrollZoom = _props$scrollZoom === void 0 ? true : _props$scrollZoom, _props$dragPan = props.dragPan, dragPan = _props$dragPan === void 0 ? true : _props$dragPan, _props$dragRotate = props.dragRotate, dragRotate = _props$dragRotate === void 0 ? true : _props$dragRotate, _props$doubleClickZoo = props.doubleClickZoom, doubleClickZoom = _props$doubleClickZoo === void 0 ? true : _props$doubleClickZoo, _props$touchZoom = props.touchZoom, touchZoom = _props$touchZoom === void 0 ? true : _props$touchZoom, _props$touchRotate = props.touchRotate, touchRotate = _props$touchRotate === void 0 ? false : _props$touchRotate, _props$keyboard = props.keyboard, keyboard = _props$keyboard === void 0 ? true : _props$keyboard;\n                var isInteractive = Boolean(this.onViewStateChange);\n                this.toggleEvents(EVENT_TYPES.WHEEL, isInteractive && scrollZoom);\n                this.toggleEvents(EVENT_TYPES.PAN, isInteractive && (dragPan || dragRotate));\n                this.toggleEvents(EVENT_TYPES.PINCH, isInteractive && (touchZoom || touchRotate));\n                this.toggleEvents(EVENT_TYPES.DOUBLE_TAP, isInteractive && doubleClickZoom);\n                this.toggleEvents(EVENT_TYPES.KEYBOARD, isInteractive && keyboard);\n                this.scrollZoom = scrollZoom;\n                this.dragPan = dragPan;\n                this.dragRotate = dragRotate;\n                this.doubleClickZoom = doubleClickZoom;\n                this.touchZoom = touchZoom;\n                this.touchRotate = touchRotate;\n                this.keyboard = keyboard;\n            }\n        },\n        {\n            key: \"updateTransition\",\n            value: function updateTransition() {\n                this.transitionManager.updateTransition();\n            }\n        },\n        {\n            key: \"toggleEvents\",\n            value: function toggleEvents(eventNames, enabled) {\n                var _this = this;\n                if (this.eventManager) eventNames.forEach(function(eventName) {\n                    if (_this._events[eventName] !== enabled) {\n                        _this._events[eventName] = enabled;\n                        if (enabled) _this.eventManager.on(eventName, _this.handleEvent);\n                        else _this.eventManager.off(eventName, _this.handleEvent);\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateViewport\",\n            value: function updateViewport(newControllerState) {\n                var extraProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n                var interactionState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n                var viewState = Object.assign({}, newControllerState.getViewportProps(), extraProps);\n                var changed = this.controllerState !== newControllerState;\n                if (changed) {\n                    var oldViewState = this.controllerState ? this.controllerState.getViewportProps() : null;\n                    if (this.onViewStateChange) this.onViewStateChange({\n                        viewState: viewState,\n                        interactionState: interactionState,\n                        oldViewState: oldViewState\n                    });\n                }\n                Object.assign(this._state, newControllerState.getInteractiveState(), interactionState);\n                if (this.onStateChange) this.onStateChange(this._state);\n            }\n        },\n        {\n            key: \"_onPanStart\",\n            value: function _onPanStart(event) {\n                var pos = this.getCenter(event);\n                if (!this.isPointInBounds(pos, event)) return false;\n                var newControllerState = this.controllerState.panStart({\n                    pos: pos\n                }).rotateStart({\n                    pos: pos\n                });\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPan\",\n            value: function _onPan(event) {\n                if (!this.isDragging()) return false;\n                var alternateMode = this.isFunctionKeyPressed(event) || event.rightButton;\n                alternateMode = this.invertPan ? !alternateMode : alternateMode;\n                return alternateMode ? this._onPanMove(event) : this._onPanRotate(event);\n            }\n        },\n        {\n            key: \"_onPanEnd\",\n            value: function _onPanEnd(event) {\n                var newControllerState = this.controllerState.panEnd().rotateEnd();\n                this.updateViewport(newControllerState, null, {\n                    isDragging: false,\n                    isPanning: false,\n                    isRotating: false\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPanMove\",\n            value: function _onPanMove(event) {\n                if (!this.dragPan) return false;\n                var pos = this.getCenter(event);\n                var newControllerState = this.controllerState.pan({\n                    pos: pos\n                });\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true,\n                    isPanning: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPanRotate\",\n            value: function _onPanRotate(event) {\n                if (!this.dragRotate) return false;\n                var deltaX = event.deltaX, deltaY = event.deltaY;\n                var _this$controllerState3 = this.controllerState.getViewportProps(), width = _this$controllerState3.width, height = _this$controllerState3.height;\n                var deltaScaleX = deltaX / width;\n                var deltaScaleY = deltaY / height;\n                var newControllerState = this.controllerState.rotate({\n                    deltaScaleX: deltaScaleX,\n                    deltaScaleY: deltaScaleY\n                });\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true,\n                    isRotating: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onWheel\",\n            value: function _onWheel(event) {\n                if (!this.scrollZoom) return false;\n                event.preventDefault();\n                var pos = this.getCenter(event);\n                if (!this.isPointInBounds(pos, event)) return false;\n                var delta = event.delta;\n                var scale = 2 / (1 + Math.exp(-Math.abs(delta * ZOOM_ACCEL)));\n                if (delta < 0 && scale !== 0) scale = 1 / scale;\n                var newControllerState = this.controllerState.zoom({\n                    pos: pos,\n                    scale: scale\n                });\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isZooming: true,\n                    isPanning: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPinchStart\",\n            value: function _onPinchStart(event) {\n                var pos = this.getCenter(event);\n                if (!this.isPointInBounds(pos, event)) return false;\n                var newControllerState = this.controllerState.zoomStart({\n                    pos: pos\n                }).rotateStart({\n                    pos: pos\n                });\n                this._state.startPinchRotation = event.rotation;\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPinch\",\n            value: function _onPinch(event) {\n                if (!this.touchZoom && !this.touchRotate) return false;\n                if (!this.isDragging()) return false;\n                var newControllerState = this.controllerState;\n                if (this.touchZoom) {\n                    var scale = event.scale;\n                    var pos = this.getCenter(event);\n                    newControllerState = newControllerState.zoom({\n                        pos: pos,\n                        scale: scale\n                    });\n                }\n                if (this.touchRotate) {\n                    var rotation = event.rotation;\n                    var startPinchRotation = this._state.startPinchRotation;\n                    newControllerState = newControllerState.rotate({\n                        deltaScaleX: -(rotation - startPinchRotation) / 180\n                    });\n                }\n                this.updateViewport(newControllerState, NO_TRANSITION_PROPS, {\n                    isDragging: true,\n                    isPanning: this.touchZoom,\n                    isZooming: this.touchZoom,\n                    isRotating: this.touchRotate\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onPinchEnd\",\n            value: function _onPinchEnd(event) {\n                var newControllerState = this.controllerState.zoomEnd().rotateEnd();\n                this._state.startPinchRotation = 0;\n                this.updateViewport(newControllerState, null, {\n                    isDragging: false,\n                    isPanning: false,\n                    isZooming: false,\n                    isRotating: false\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onDoubleTap\",\n            value: function _onDoubleTap(event) {\n                if (!this.doubleClickZoom) return false;\n                var pos = this.getCenter(event);\n                if (!this.isPointInBounds(pos, event)) return false;\n                var isZoomOut = this.isFunctionKeyPressed(event);\n                var newControllerState = this.controllerState.zoom({\n                    pos: pos,\n                    scale: isZoomOut ? 0.5 : 2\n                });\n                this.updateViewport(newControllerState, this._getTransitionProps(), {\n                    isZooming: true,\n                    isPanning: true\n                });\n                return true;\n            }\n        },\n        {\n            key: \"_onKeyDown\",\n            value: function _onKeyDown(event) {\n                if (!this.keyboard) return false;\n                var funcKey = this.isFunctionKeyPressed(event);\n                var controllerState = this.controllerState;\n                var newControllerState;\n                var interactionState = {};\n                switch(event.srcEvent.code){\n                    case \"Minus\":\n                        newControllerState = funcKey ? controllerState.zoomOut().zoomOut() : controllerState.zoomOut();\n                        interactionState.isZooming = true;\n                        break;\n                    case \"Equal\":\n                        newControllerState = funcKey ? controllerState.zoomIn().zoomIn() : controllerState.zoomIn();\n                        interactionState.isZooming = true;\n                        break;\n                    case \"ArrowLeft\":\n                        if (funcKey) {\n                            newControllerState = controllerState.rotateLeft();\n                            interactionState.isRotating = true;\n                        } else {\n                            newControllerState = controllerState.moveLeft();\n                            interactionState.isPanning = true;\n                        }\n                        break;\n                    case \"ArrowRight\":\n                        if (funcKey) {\n                            newControllerState = controllerState.rotateRight();\n                            interactionState.isRotating = true;\n                        } else {\n                            newControllerState = controllerState.moveRight();\n                            interactionState.isPanning = true;\n                        }\n                        break;\n                    case \"ArrowUp\":\n                        if (funcKey) {\n                            newControllerState = controllerState.rotateUp();\n                            interactionState.isRotating = true;\n                        } else {\n                            newControllerState = controllerState.moveUp();\n                            interactionState.isPanning = true;\n                        }\n                        break;\n                    case \"ArrowDown\":\n                        if (funcKey) {\n                            newControllerState = controllerState.rotateDown();\n                            interactionState.isRotating = true;\n                        } else {\n                            newControllerState = controllerState.moveDown();\n                            interactionState.isPanning = true;\n                        }\n                        break;\n                    default:\n                        return false;\n                }\n                this.updateViewport(newControllerState, this._getTransitionProps(), interactionState);\n                return true;\n            }\n        },\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return NO_TRANSITION_PROPS;\n            }\n        },\n        {\n            key: \"events\",\n            set: function set(customEvents) {\n                this.toggleEvents(this._customEvents, false);\n                this.toggleEvents(customEvents, true);\n                this._customEvents = customEvents;\n                this.setProps(this.controllerStateProps);\n            }\n        }\n    ]);\n    return Controller1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./transition-manager\":\"alxon\",\"../utils/assert\":\"8goZO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"alxon\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"TRANSITION_EVENTS\", ()=>TRANSITION_EVENTS);\nparcelHelpers.export(exports, \"default\", ()=>TransitionManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transition = require(\"../transitions/transition\");\nvar _transitionDefault = parcelHelpers.interopDefault(_transition);\nvar noop = function noop() {};\nvar TRANSITION_EVENTS = {\n    BREAK: 1,\n    SNAP_TO_END: 2,\n    IGNORE: 3\n};\nvar DEFAULT_PROPS = {\n    transitionDuration: 0,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)(),\n    transitionInterruption: TRANSITION_EVENTS.BREAK,\n    onTransitionStart: noop,\n    onTransitionInterrupt: noop,\n    onTransitionEnd: noop\n};\nvar TransitionManager = function() {\n    function TransitionManager1(ControllerState) {\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, TransitionManager1);\n        this.ControllerState = ControllerState;\n        this.props = Object.assign({}, DEFAULT_PROPS, props);\n        this.propsInTransition = null;\n        this.transition = new (0, _transitionDefault.default)(props.timeline);\n        this.onViewStateChange = props.onViewStateChange;\n        this._onTransitionUpdate = this._onTransitionUpdate.bind(this);\n    }\n    (0, _createClassDefault.default)(TransitionManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this.transition.cancel();\n            }\n        },\n        {\n            key: \"getViewportInTransition\",\n            value: function getViewportInTransition() {\n                return this.propsInTransition;\n            }\n        },\n        {\n            key: \"processViewStateChange\",\n            value: function processViewStateChange(nextProps) {\n                var transitionTriggered = false;\n                var currentProps = this.props;\n                nextProps = Object.assign({}, DEFAULT_PROPS, nextProps);\n                this.props = nextProps;\n                if (this._shouldIgnoreViewportChange(currentProps, nextProps)) return transitionTriggered;\n                if (this._isTransitionEnabled(nextProps)) {\n                    var _this$transition$sett = this.transition.settings, interruption = _this$transition$sett.interruption, endProps = _this$transition$sett.endProps;\n                    var startProps = Object.assign({}, currentProps, interruption === TRANSITION_EVENTS.SNAP_TO_END ? endProps : this.propsInTransition || currentProps);\n                    this._triggerTransition(startProps, nextProps);\n                    transitionTriggered = true;\n                } else this.transition.cancel();\n                return transitionTriggered;\n            }\n        },\n        {\n            key: \"updateTransition\",\n            value: function updateTransition() {\n                this.transition.update();\n            }\n        },\n        {\n            key: \"_isTransitionEnabled\",\n            value: function _isTransitionEnabled(props) {\n                var transitionDuration = props.transitionDuration, transitionInterpolator = props.transitionInterpolator;\n                return (transitionDuration > 0 || transitionDuration === \"auto\") && Boolean(transitionInterpolator);\n            }\n        },\n        {\n            key: \"_isUpdateDueToCurrentTransition\",\n            value: function _isUpdateDueToCurrentTransition(props) {\n                if (this.transition.inProgress) return this.transition.settings.interpolator.arePropsEqual(props, this.propsInTransition);\n                return false;\n            }\n        },\n        {\n            key: \"_shouldIgnoreViewportChange\",\n            value: function _shouldIgnoreViewportChange(currentProps, nextProps) {\n                if (this.transition.inProgress) return this.transition.settings.interruption === TRANSITION_EVENTS.IGNORE || this._isUpdateDueToCurrentTransition(nextProps);\n                else if (this._isTransitionEnabled(nextProps)) return nextProps.transitionInterpolator.arePropsEqual(currentProps, nextProps);\n                return true;\n            }\n        },\n        {\n            key: \"_triggerTransition\",\n            value: function _triggerTransition(startProps, endProps) {\n                var startViewstate = new this.ControllerState(startProps);\n                var endViewStateProps = new this.ControllerState(endProps).shortestPathFrom(startViewstate);\n                var transitionInterpolator = endProps.transitionInterpolator;\n                var duration = transitionInterpolator.getDuration ? transitionInterpolator.getDuration(startProps, endProps) : endProps.transitionDuration;\n                if (duration === 0) return;\n                var initialProps = endProps.transitionInterpolator.initializeProps(startProps, endViewStateProps);\n                this.propsInTransition = {};\n                this.duration = duration;\n                this.transition.start({\n                    duration: duration,\n                    easing: endProps.transitionEasing,\n                    interpolator: endProps.transitionInterpolator,\n                    interruption: endProps.transitionInterruption,\n                    startProps: initialProps.start,\n                    endProps: initialProps.end,\n                    onStart: endProps.onTransitionStart,\n                    onUpdate: this._onTransitionUpdate,\n                    onInterrupt: this._onTransitionEnd(endProps.onTransitionInterrupt),\n                    onEnd: this._onTransitionEnd(endProps.onTransitionEnd)\n                });\n                this.updateTransition();\n            }\n        },\n        {\n            key: \"_onTransitionEnd\",\n            value: function _onTransitionEnd(callback) {\n                var _this = this;\n                return function(transition) {\n                    _this.propsInTransition = null;\n                    callback(transition);\n                };\n            }\n        },\n        {\n            key: \"_onTransitionUpdate\",\n            value: function _onTransitionUpdate(transition) {\n                var time = transition.time, _transition$settings = transition.settings, interpolator = _transition$settings.interpolator, startProps = _transition$settings.startProps, endProps = _transition$settings.endProps, duration = _transition$settings.duration, easing = _transition$settings.easing;\n                var t = easing(time / duration);\n                var viewport = interpolator.interpolateProps(startProps, endProps, t);\n                this.propsInTransition = new this.ControllerState(Object.assign({}, this.props, viewport)).getViewportProps();\n                if (this.onViewStateChange) this.onViewStateChange({\n                    viewState: this.propsInTransition,\n                    interactionState: {\n                        inTransition: true\n                    },\n                    oldViewState: this.props\n                });\n            }\n        }\n    ]);\n    return TransitionManager1;\n}();\nTransitionManager.defaultProps = DEFAULT_PROPS;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../transitions/linear-interpolator\":\"8J7qW\",\"../transitions/transition\":\"fGNeu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8J7qW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LinearInterpolator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _transitionInterpolator = require(\"./transition-interpolator\");\nvar _transitionInterpolatorDefault = parcelHelpers.interopDefault(_transitionInterpolator);\nvar _mathGl = require(\"math.gl\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_PROPS = [\n    \"longitude\",\n    \"latitude\",\n    \"zoom\",\n    \"bearing\",\n    \"pitch\"\n];\nvar DEFAULT_REQUIRED_PROPS = [\n    \"longitude\",\n    \"latitude\",\n    \"zoom\"\n];\nvar LinearInterpolator = function(_TransitionInterpolat) {\n    (0, _inheritsDefault.default)(LinearInterpolator1, _TransitionInterpolat);\n    var _super = _createSuper(LinearInterpolator1);\n    function LinearInterpolator1(transitionProps) {\n        (0, _classCallCheckDefault.default)(this, LinearInterpolator1);\n        return _super.call(this, transitionProps || {\n            compare: DEFAULT_PROPS,\n            extract: DEFAULT_PROPS,\n            required: DEFAULT_REQUIRED_PROPS\n        });\n    }\n    (0, _createClassDefault.default)(LinearInterpolator1, [\n        {\n            key: \"interpolateProps\",\n            value: function interpolateProps(startProps, endProps, t) {\n                var viewport = {};\n                for(var key in endProps)viewport[key] = (0, _mathGl.lerp)(startProps[key] || 0, endProps[key] || 0, t);\n                return viewport;\n            }\n        }\n    ]);\n    return LinearInterpolator1;\n}((0, _transitionInterpolatorDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./transition-interpolator\":\"6hSx4\",\"math.gl\":\"6aDAl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6hSx4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TransitionInterpolator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _mathGl = require(\"math.gl\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar TransitionInterpolator = function() {\n    function TransitionInterpolator1() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, TransitionInterpolator1);\n        if (Array.isArray(opts)) opts = {\n            compare: opts,\n            extract: opts,\n            required: opts\n        };\n        var _opts = opts, compare = _opts.compare, extract = _opts.extract, required = _opts.required;\n        this._propsToCompare = compare;\n        this._propsToExtract = extract;\n        this._requiredProps = required;\n    }\n    (0, _createClassDefault.default)(TransitionInterpolator1, [\n        {\n            key: \"arePropsEqual\",\n            value: function arePropsEqual(currentProps, nextProps) {\n                var _iterator = _createForOfIteratorHelper(this._propsToCompare || Object.keys(nextProps)), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var key = _step.value;\n                        if (!(key in currentProps) || !(key in nextProps) || !(0, _mathGl.equals)(currentProps[key], nextProps[key])) return false;\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return true;\n            }\n        },\n        {\n            key: \"initializeProps\",\n            value: function initializeProps(startProps, endProps) {\n                var result;\n                if (this._propsToExtract) {\n                    var startViewStateProps = {};\n                    var endViewStateProps = {};\n                    var _iterator2 = _createForOfIteratorHelper(this._propsToExtract), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var key = _step2.value;\n                            startViewStateProps[key] = startProps[key];\n                            endViewStateProps[key] = endProps[key];\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                    result = {\n                        start: startViewStateProps,\n                        end: endViewStateProps\n                    };\n                } else result = {\n                    start: startProps,\n                    end: endProps\n                };\n                this._checkRequiredProps(result.start);\n                this._checkRequiredProps(result.end);\n                return result;\n            }\n        },\n        {\n            key: \"interpolateProps\",\n            value: function interpolateProps(startProps, endProps, t) {\n                return endProps;\n            }\n        },\n        {\n            key: \"getDuration\",\n            value: function getDuration(startProps, endProps) {\n                return endProps.transitionDuration;\n            }\n        },\n        {\n            key: \"_checkRequiredProps\",\n            value: function _checkRequiredProps(props) {\n                if (!this._requiredProps) return;\n                this._requiredProps.forEach(function(propName) {\n                    var value = props[propName];\n                    (0, _assertDefault.default)(Number.isFinite(value) || Array.isArray(value), \"\".concat(propName, \" is required for transition\"));\n                });\n            }\n        }\n    ]);\n    return TransitionInterpolator1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"math.gl\":\"6aDAl\",\"../utils/assert\":\"8goZO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bvyJt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ViewState);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar ViewState = function() {\n    function ViewState1(opts) {\n        (0, _classCallCheckDefault.default)(this, ViewState1);\n        (0, _assertDefault.default)(Number.isFinite(opts.width), \"`width` must be supplied\");\n        (0, _assertDefault.default)(Number.isFinite(opts.height), \"`height` must be supplied\");\n        this._viewportProps = this._applyConstraints(opts);\n    }\n    (0, _createClassDefault.default)(ViewState1, [\n        {\n            key: \"getViewportProps\",\n            value: function getViewportProps() {\n                return this._viewportProps;\n            }\n        },\n        {\n            key: \"shortestPathFrom\",\n            value: function shortestPathFrom(viewState) {\n                return this._viewportProps;\n            }\n        },\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                return props;\n            }\n        }\n    ]);\n    return ViewState1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../utils/assert\":\"8goZO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2c6dD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>EffectManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar _lightingEffect = require(\"../effects/lighting/lighting-effect\");\nvar _lightingEffectDefault = parcelHelpers.interopDefault(_lightingEffect);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar DEFAULT_LIGHTING_EFFECT = new (0, _lightingEffectDefault.default)();\nvar EffectManager = function() {\n    function EffectManager1() {\n        (0, _classCallCheckDefault.default)(this, EffectManager1);\n        this.effects = [];\n        this._internalEffects = [];\n        this._needsRedraw = \"Initial render\";\n        this.setEffects();\n    }\n    (0, _createClassDefault.default)(EffectManager1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"effects\" in props) {\n                    if (props.effects.length !== this.effects.length || !(0, _deepEqual.deepEqual)(props.effects, this.effects)) {\n                        this.setEffects(props.effects);\n                        this._needsRedraw = \"effects changed\";\n                    }\n                }\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                return redraw;\n            }\n        },\n        {\n            key: \"getEffects\",\n            value: function getEffects() {\n                return this._internalEffects;\n            }\n        },\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this.cleanup();\n            }\n        },\n        {\n            key: \"setEffects\",\n            value: function setEffects() {\n                var effects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n                this.cleanup();\n                this.effects = effects;\n                this._createInternalEffects();\n            }\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {\n                var _iterator = _createForOfIteratorHelper(this.effects), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var effect = _step.value;\n                        effect.cleanup();\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                var _iterator2 = _createForOfIteratorHelper(this._internalEffects), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var _effect = _step2.value;\n                        _effect.cleanup();\n                    }\n                } catch (err1) {\n                    _iterator2.e(err1);\n                } finally{\n                    _iterator2.f();\n                }\n                this.effects.length = 0;\n                this._internalEffects.length = 0;\n            }\n        },\n        {\n            key: \"_createInternalEffects\",\n            value: function _createInternalEffects() {\n                this._internalEffects = this.effects.slice();\n                if (!this.effects.some(function(effect) {\n                    return effect instanceof (0, _lightingEffectDefault.default);\n                })) this._internalEffects.push(DEFAULT_LIGHTING_EFFECT);\n            }\n        }\n    ]);\n    return EffectManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../utils/deep-equal\":\"kF0nW\",\"../effects/lighting/lighting-effect\":\"dZgtU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"uwNC4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>DeckRenderer);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _debug = require(\"../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _drawLayersPass = require(\"../passes/draw-layers-pass\");\nvar _drawLayersPassDefault = parcelHelpers.interopDefault(_drawLayersPass);\nvar _pickLayersPass = require(\"../passes/pick-layers-pass\");\nvar _pickLayersPassDefault = parcelHelpers.interopDefault(_pickLayersPass);\nvar _core = require(\"@luma.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nvar TRACE_RENDER_LAYERS = \"deckRenderer.renderLayers\";\nvar DeckRenderer = function() {\n    function DeckRenderer1(gl) {\n        (0, _classCallCheckDefault.default)(this, DeckRenderer1);\n        this.gl = gl;\n        this.layerFilter = null;\n        this.drawPickingColors = false;\n        this.drawLayersPass = new (0, _drawLayersPassDefault.default)(gl);\n        this.pickLayersPass = new (0, _pickLayersPassDefault.default)(gl);\n        this.renderCount = 0;\n        this._needsRedraw = \"Initial render\";\n        this.renderBuffers = [];\n        this.lastPostProcessEffect = null;\n        this._onError = null;\n    }\n    (0, _createClassDefault.default)(DeckRenderer1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"layerFilter\" in props && this.layerFilter !== props.layerFilter) {\n                    this.layerFilter = props.layerFilter;\n                    this._needsRedraw = \"layerFilter changed\";\n                }\n                if (\"drawPickingColors\" in props && this.drawPickingColors !== props.drawPickingColors) {\n                    this.drawPickingColors = props.drawPickingColors;\n                    this._needsRedraw = \"drawPickingColors changed\";\n                }\n                if (\"onError\" in props) this._onError = props.onError;\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers(opts) {\n                var layerPass = this.drawPickingColors ? this.pickLayersPass : this.drawLayersPass;\n                opts.layerFilter = this.layerFilter;\n                opts.onError = this._onError;\n                opts.effects = opts.effects || [];\n                opts.target = opts.target || (0, _core.Framebuffer).getDefaultFramebuffer(this.gl);\n                this._preRender(opts.effects, opts);\n                var outputBuffer = this.lastPostProcessEffect ? this.renderBuffers[0] : opts.target;\n                var renderStats = layerPass.render(_objectSpread(_objectSpread({}, opts), {}, {\n                    target: outputBuffer\n                }));\n                this._postRender(opts.effects, opts);\n                this.renderCount++;\n                (0, _debugDefault.default)(TRACE_RENDER_LAYERS, this, renderStats, opts);\n            }\n        },\n        {\n            key: \"needsRedraw\",\n            value: function needsRedraw() {\n                var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n                    clearRedrawFlags: false\n                };\n                var redraw = this._needsRedraw;\n                if (opts.clearRedrawFlags) this._needsRedraw = false;\n                return redraw;\n            }\n        },\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                var renderBuffers = this.renderBuffers;\n                var _iterator = _createForOfIteratorHelper(renderBuffers), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var buffer = _step.value;\n                        buffer[\"delete\"]();\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                renderBuffers.length = 0;\n            }\n        },\n        {\n            key: \"_preRender\",\n            value: function _preRender(effects, opts) {\n                var lastPostProcessEffect = null;\n                var _iterator2 = _createForOfIteratorHelper(effects), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var effect = _step2.value;\n                        effect.preRender(this.gl, opts);\n                        if (effect.postRender) lastPostProcessEffect = effect;\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n                if (lastPostProcessEffect) this._resizeRenderBuffers();\n                this.lastPostProcessEffect = lastPostProcessEffect;\n            }\n        },\n        {\n            key: \"_resizeRenderBuffers\",\n            value: function _resizeRenderBuffers() {\n                var renderBuffers = this.renderBuffers;\n                if (renderBuffers.length === 0) renderBuffers.push(new (0, _core.Framebuffer)(this.gl), new (0, _core.Framebuffer)(this.gl));\n                var _iterator3 = _createForOfIteratorHelper(renderBuffers), _step3;\n                try {\n                    for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                        var buffer = _step3.value;\n                        buffer.resize();\n                    }\n                } catch (err) {\n                    _iterator3.e(err);\n                } finally{\n                    _iterator3.f();\n                }\n            }\n        },\n        {\n            key: \"_postRender\",\n            value: function _postRender(effects, opts) {\n                var renderBuffers = this.renderBuffers;\n                var params = {\n                    inputBuffer: renderBuffers[0],\n                    swapBuffer: renderBuffers[1],\n                    target: null\n                };\n                var _iterator4 = _createForOfIteratorHelper(effects), _step4;\n                try {\n                    for(_iterator4.s(); !(_step4 = _iterator4.n()).done;){\n                        var effect = _step4.value;\n                        if (effect.postRender) {\n                            if (effect === this.lastPostProcessEffect) {\n                                params.target = opts.target;\n                                effect.postRender(this.gl, params);\n                                break;\n                            }\n                            var buffer = effect.postRender(this.gl, params);\n                            params.inputBuffer = buffer;\n                            params.swapBuffer = buffer === renderBuffers[0] ? renderBuffers[1] : renderBuffers[0];\n                        }\n                    }\n                } catch (err) {\n                    _iterator4.e(err);\n                } finally{\n                    _iterator4.f();\n                }\n            }\n        }\n    ]);\n    return DeckRenderer1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../debug\":\"8AxDM\",\"../passes/draw-layers-pass\":\"cnsF3\",\"../passes/pick-layers-pass\":\"h2MVW\",\"@luma.gl/core\":\"bW3Qv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cnsF3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>DrawLayersPass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _layersPass = require(\"./layers-pass\");\nvar _layersPassDefault = parcelHelpers.interopDefault(_layersPass);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DrawLayersPass = function(_LayersPass) {\n    (0, _inheritsDefault.default)(DrawLayersPass1, _LayersPass);\n    var _super = _createSuper(DrawLayersPass1);\n    function DrawLayersPass1() {\n        (0, _classCallCheckDefault.default)(this, DrawLayersPass1);\n        return _super.apply(this, arguments);\n    }\n    return DrawLayersPass1;\n}((0, _layersPassDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./layers-pass\":\"hn8Gi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h2MVW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PickLayersPass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _layersPass = require(\"./layers-pass\");\nvar _layersPassDefault = parcelHelpers.interopDefault(_layersPass);\nvar _core = require(\"@luma.gl/core\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar PICKING_PARAMETERS = {\n    blendFunc: [\n        1,\n        0,\n        32771,\n        0\n    ],\n    blendEquation: 32774\n};\nvar PickLayersPass = function(_LayersPass) {\n    (0, _inheritsDefault.default)(PickLayersPass1, _LayersPass);\n    var _super = _createSuper(PickLayersPass1);\n    function PickLayersPass1() {\n        (0, _classCallCheckDefault.default)(this, PickLayersPass1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(PickLayersPass1, [\n        {\n            key: \"render\",\n            value: function render(props) {\n                if (props.pickingFBO) this._drawPickingBuffer(props);\n                else (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PickLayersPass1.prototype), \"render\", this).call(this, props);\n            }\n        },\n        {\n            key: \"_drawPickingBuffer\",\n            value: function _drawPickingBuffer(_ref) {\n                var _this = this;\n                var layers = _ref.layers, layerFilter = _ref.layerFilter, views = _ref.views, viewports = _ref.viewports, onViewportActive = _ref.onViewportActive, pickingFBO = _ref.pickingFBO, _ref$deviceRect = _ref.deviceRect, x = _ref$deviceRect.x, y = _ref$deviceRect.y, width = _ref$deviceRect.width, height = _ref$deviceRect.height, _ref$pass = _ref.pass, pass = _ref$pass === void 0 ? \"picking\" : _ref$pass, redrawReason = _ref.redrawReason, pickZ = _ref.pickZ;\n                var gl = this.gl;\n                this.pickZ = pickZ;\n                return (0, _core.withParameters)(gl, _objectSpread(_objectSpread({\n                    scissorTest: true,\n                    scissor: [\n                        x,\n                        y,\n                        width,\n                        height\n                    ],\n                    clearColor: [\n                        0,\n                        0,\n                        0,\n                        0\n                    ],\n                    depthMask: true,\n                    depthTest: true,\n                    depthRange: [\n                        0,\n                        1\n                    ],\n                    colorMask: [\n                        true,\n                        true,\n                        true,\n                        true\n                    ]\n                }, PICKING_PARAMETERS), {}, {\n                    blend: !pickZ\n                }), function() {\n                    (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PickLayersPass1.prototype), \"render\", _this).call(_this, {\n                        target: pickingFBO,\n                        layers: layers,\n                        layerFilter: layerFilter,\n                        views: views,\n                        viewports: viewports,\n                        onViewportActive: onViewportActive,\n                        pass: pass,\n                        redrawReason: redrawReason\n                    });\n                });\n            }\n        },\n        {\n            key: \"shouldDrawLayer\",\n            value: function shouldDrawLayer(layer) {\n                return layer.props.pickable;\n            }\n        },\n        {\n            key: \"getModuleParameters\",\n            value: function getModuleParameters() {\n                return {\n                    pickingActive: 1,\n                    pickingAttribute: this.pickZ,\n                    lightSources: {}\n                };\n            }\n        },\n        {\n            key: \"getLayerParameters\",\n            value: function getLayerParameters(layer, layerIndex) {\n                var pickParameters = this.pickZ ? {\n                    blend: false\n                } : _objectSpread(_objectSpread({}, PICKING_PARAMETERS), {}, {\n                    blend: true,\n                    blendColor: [\n                        0,\n                        0,\n                        0,\n                        (layerIndex + 1) / 255\n                    ]\n                });\n                return Object.assign({}, layer.props.parameters, pickParameters);\n            }\n        }\n    ]);\n    return PickLayersPass1;\n}((0, _layersPassDefault.default));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./layers-pass\":\"hn8Gi\",\"@luma.gl/core\":\"bW3Qv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7N62N\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>DeckPicker);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _assert = require(\"../utils/assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _log = require(\"../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar _pickLayersPass = require(\"../passes/pick-layers-pass\");\nvar _pickLayersPassDefault = parcelHelpers.interopDefault(_pickLayersPass);\nvar _queryObject = require(\"./picking/query-object\");\nvar _pickInfo = require(\"./picking/pick-info\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar DeckPicker = function() {\n    function DeckPicker1(gl) {\n        (0, _classCallCheckDefault.default)(this, DeckPicker1);\n        this.gl = gl;\n        this.pickingFBO = null;\n        this.pickLayersPass = new (0, _pickLayersPassDefault.default)(gl);\n        this.layerFilter = null;\n        this.lastPickedInfo = {\n            index: -1,\n            layerId: null,\n            info: null\n        };\n        this._onError = null;\n    }\n    (0, _createClassDefault.default)(DeckPicker1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                if (\"layerFilter\" in props) this.layerFilter = props.layerFilter;\n                if (\"onError\" in props) this._onError = props.onError;\n                if (\"_pickable\" in props) this._pickable = props._pickable;\n            }\n        },\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                if (this.pickingFBO) this.pickingFBO[\"delete\"]();\n                if (this.depthFBO) {\n                    this.depthFBO.color[\"delete\"]();\n                    this.depthFBO[\"delete\"]();\n                }\n            }\n        },\n        {\n            key: \"pickObject\",\n            value: function pickObject(opts) {\n                return this._pickClosestObject(opts);\n            }\n        },\n        {\n            key: \"pickObjects\",\n            value: function pickObjects(opts) {\n                return this._pickVisibleObjects(opts);\n            }\n        },\n        {\n            key: \"getLastPickedObject\",\n            value: function getLastPickedObject(_ref) {\n                var x = _ref.x, y = _ref.y, layers = _ref.layers, viewports = _ref.viewports;\n                var lastPickedInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.lastPickedInfo.info;\n                var lastPickedLayerId = lastPickedInfo && lastPickedInfo.layer && lastPickedInfo.layer.id;\n                var layer = lastPickedLayerId ? layers.find(function(l) {\n                    return l.id === lastPickedLayerId;\n                }) : null;\n                var coordinate = viewports[0] && viewports[0].unproject([\n                    x,\n                    y\n                ]);\n                var info = {\n                    x: x,\n                    y: y,\n                    coordinate: coordinate,\n                    lngLat: coordinate,\n                    layer: layer\n                };\n                if (layer) return Object.assign({}, lastPickedInfo, info);\n                return Object.assign(info, {\n                    color: null,\n                    object: null,\n                    index: -1\n                });\n            }\n        },\n        {\n            key: \"_resizeBuffer\",\n            value: function _resizeBuffer() {\n                var gl = this.gl;\n                if (!this.pickingFBO) {\n                    this.pickingFBO = new (0, _core.Framebuffer)(gl);\n                    if ((0, _core.Framebuffer).isSupported(gl, {\n                        colorBufferFloat: true\n                    })) {\n                        this.depthFBO = new (0, _core.Framebuffer)(gl);\n                        this.depthFBO.attach((0, _definePropertyDefault.default)({}, 36064, new (0, _core.Texture2D)(gl, {\n                            format: (0, _core.isWebGL2)(gl) ? 34836 : 6408,\n                            type: 5126\n                        })));\n                    }\n                }\n                this.pickingFBO.resize({\n                    width: gl.canvas.width,\n                    height: gl.canvas.height\n                });\n                if (this.depthFBO) this.depthFBO.resize({\n                    width: gl.canvas.width,\n                    height: gl.canvas.height\n                });\n                return this.pickingFBO;\n            }\n        },\n        {\n            key: \"_getPickable\",\n            value: function _getPickable(layers) {\n                if (this._pickable === false) return null;\n                var pickableLayers = layers.filter(function(layer) {\n                    return layer.isPickable() && !layer.isComposite;\n                });\n                if (pickableLayers.length > 255) {\n                    (0, _logDefault.default).warn(\"Too many pickable layers, only picking the first 255\")();\n                    return pickableLayers.slice(0, 255);\n                }\n                return pickableLayers.length ? pickableLayers : null;\n            }\n        },\n        {\n            key: \"_pickClosestObject\",\n            value: function _pickClosestObject(_ref2) {\n                var layers = _ref2.layers, views = _ref2.views, viewports = _ref2.viewports, x = _ref2.x, y = _ref2.y, _ref2$radius = _ref2.radius, radius = _ref2$radius === void 0 ? 0 : _ref2$radius, _ref2$depth = _ref2.depth, depth = _ref2$depth === void 0 ? 1 : _ref2$depth, _ref2$mode = _ref2.mode, mode = _ref2$mode === void 0 ? \"query\" : _ref2$mode, unproject3D = _ref2.unproject3D, onViewportActive = _ref2.onViewportActive;\n                layers = this._getPickable(layers);\n                if (!layers) return {\n                    result: [],\n                    emptyInfo: (0, _pickInfo.getEmptyPickingInfo)({\n                        viewports: viewports,\n                        x: x,\n                        y: y\n                    })\n                };\n                this._resizeBuffer();\n                var pixelRatio = (0, _core.cssToDeviceRatio)(this.gl);\n                var devicePixelRange = (0, _core.cssToDevicePixels)(this.gl, [\n                    x,\n                    y\n                ], true);\n                var devicePixel = [\n                    devicePixelRange.x + Math.floor(devicePixelRange.width / 2),\n                    devicePixelRange.y + Math.floor(devicePixelRange.height / 2)\n                ];\n                var deviceRadius = Math.round(radius * pixelRatio);\n                var _this$pickingFBO = this.pickingFBO, width = _this$pickingFBO.width, height = _this$pickingFBO.height;\n                var deviceRect = this._getPickingRect({\n                    deviceX: devicePixel[0],\n                    deviceY: devicePixel[1],\n                    deviceRadius: deviceRadius,\n                    deviceWidth: width,\n                    deviceHeight: height\n                });\n                var infos;\n                var result = [];\n                var affectedLayers = {};\n                for(var i = 0; i < depth; i++){\n                    var pickedColors = deviceRect && this._drawAndSample({\n                        layers: layers,\n                        views: views,\n                        viewports: viewports,\n                        onViewportActive: onViewportActive,\n                        deviceRect: deviceRect,\n                        pass: \"picking:\".concat(mode),\n                        redrawReason: mode\n                    });\n                    var pickInfo = (0, _queryObject.getClosestObject)({\n                        pickedColors: pickedColors,\n                        layers: layers,\n                        deviceX: devicePixel[0],\n                        deviceY: devicePixel[1],\n                        deviceRadius: deviceRadius,\n                        deviceRect: deviceRect\n                    });\n                    var z = void 0;\n                    if (pickInfo.pickedLayer && unproject3D && this.depthFBO) {\n                        var zValues = this._drawAndSample({\n                            layers: [\n                                pickInfo.pickedLayer\n                            ],\n                            views: views,\n                            viewports: viewports,\n                            onViewportActive: onViewportActive,\n                            deviceRect: {\n                                x: pickInfo.pickedX,\n                                y: pickInfo.pickedY,\n                                width: 1,\n                                height: 1\n                            },\n                            pass: \"picking:\".concat(mode),\n                            redrawReason: \"pick-z\",\n                            pickZ: true\n                        });\n                        z = zValues[0] * viewports[0].distanceScales.metersPerUnit[2] + viewports[0].position[2];\n                    }\n                    if (pickInfo.pickedColor && i + 1 < depth) {\n                        var layerId = pickInfo.pickedColor[3] - 1;\n                        affectedLayers[layerId] = true;\n                        layers[layerId].clearPickingColor(pickInfo.pickedColor);\n                    }\n                    infos = (0, _pickInfo.processPickInfo)({\n                        pickInfo: pickInfo,\n                        lastPickedInfo: this.lastPickedInfo,\n                        mode: mode,\n                        layers: layers,\n                        viewports: viewports,\n                        x: x,\n                        y: y,\n                        z: z,\n                        pixelRatio: pixelRatio\n                    });\n                    var _iterator = _createForOfIteratorHelper(infos.values()), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var info = _step.value;\n                            if (info.layer) result.push(info);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    if (!pickInfo.pickedColor) break;\n                }\n                for(var _layerId in affectedLayers)layers[_layerId].restorePickingColors();\n                return {\n                    result: result,\n                    emptyInfo: infos && infos.get(null)\n                };\n            }\n        },\n        {\n            key: \"_pickVisibleObjects\",\n            value: function _pickVisibleObjects(_ref3) {\n                var layers = _ref3.layers, views = _ref3.views, viewports = _ref3.viewports, x = _ref3.x, y = _ref3.y, _ref3$width = _ref3.width, width = _ref3$width === void 0 ? 1 : _ref3$width, _ref3$height = _ref3.height, height = _ref3$height === void 0 ? 1 : _ref3$height, _ref3$mode = _ref3.mode, mode = _ref3$mode === void 0 ? \"query\" : _ref3$mode, onViewportActive = _ref3.onViewportActive;\n                layers = this._getPickable(layers);\n                if (!layers) return [];\n                this._resizeBuffer();\n                var pixelRatio = (0, _core.cssToDeviceRatio)(this.gl);\n                var leftTop = (0, _core.cssToDevicePixels)(this.gl, [\n                    x,\n                    y\n                ], true);\n                var deviceLeft = leftTop.x;\n                var deviceTop = leftTop.y + leftTop.height;\n                var rightBottom = (0, _core.cssToDevicePixels)(this.gl, [\n                    x + width,\n                    y + height\n                ], true);\n                var deviceRight = rightBottom.x + rightBottom.width;\n                var deviceBottom = rightBottom.y;\n                var deviceRect = {\n                    x: deviceLeft,\n                    y: deviceBottom,\n                    width: deviceRight - deviceLeft,\n                    height: deviceTop - deviceBottom\n                };\n                var pickedColors = this._drawAndSample({\n                    layers: layers,\n                    views: views,\n                    viewports: viewports,\n                    onViewportActive: onViewportActive,\n                    deviceRect: deviceRect,\n                    pass: \"picking:\".concat(mode),\n                    redrawReason: mode\n                });\n                var pickInfos = (0, _queryObject.getUniqueObjects)({\n                    pickedColors: pickedColors,\n                    layers: layers\n                });\n                var uniqueInfos = new Map();\n                pickInfos.forEach(function(pickInfo) {\n                    var info = {\n                        color: pickInfo.pickedColor,\n                        layer: null,\n                        index: pickInfo.pickedObjectIndex,\n                        picked: true,\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height,\n                        pixelRatio: pixelRatio\n                    };\n                    info = (0, _pickInfo.getLayerPickingInfo)({\n                        layer: pickInfo.pickedLayer,\n                        info: info,\n                        mode: mode\n                    });\n                    if (!uniqueInfos.has(info.object)) uniqueInfos.set(info.object, info);\n                });\n                return Array.from(uniqueInfos.values());\n            }\n        },\n        {\n            key: \"_drawAndSample\",\n            value: function _drawAndSample(_ref4) {\n                var layers = _ref4.layers, views = _ref4.views, viewports = _ref4.viewports, onViewportActive = _ref4.onViewportActive, deviceRect = _ref4.deviceRect, pass = _ref4.pass, redrawReason = _ref4.redrawReason, pickZ = _ref4.pickZ;\n                (0, _assertDefault.default)(deviceRect.width > 0 && deviceRect.height > 0);\n                if (layers.length < 1) return null;\n                var pickingFBO = pickZ ? this.depthFBO : this.pickingFBO;\n                this.pickLayersPass.render({\n                    layers: layers,\n                    layerFilter: this.layerFilter,\n                    onError: this._onError,\n                    views: views,\n                    viewports: viewports,\n                    onViewportActive: onViewportActive,\n                    pickingFBO: pickingFBO,\n                    deviceRect: deviceRect,\n                    pass: pass,\n                    redrawReason: redrawReason,\n                    pickZ: pickZ\n                });\n                var x = deviceRect.x, y = deviceRect.y, width = deviceRect.width, height = deviceRect.height;\n                var pickedColors = new (pickZ ? Float32Array : Uint8Array)(width * height * 4);\n                (0, _core.readPixelsToArray)(pickingFBO, {\n                    sourceX: x,\n                    sourceY: y,\n                    sourceWidth: width,\n                    sourceHeight: height,\n                    target: pickedColors\n                });\n                return pickedColors;\n            }\n        },\n        {\n            key: \"_getPickingRect\",\n            value: function _getPickingRect(_ref5) {\n                var deviceX = _ref5.deviceX, deviceY = _ref5.deviceY, deviceRadius = _ref5.deviceRadius, deviceWidth = _ref5.deviceWidth, deviceHeight = _ref5.deviceHeight;\n                var x = Math.max(0, deviceX - deviceRadius);\n                var y = Math.max(0, deviceY - deviceRadius);\n                var width = Math.min(deviceWidth, deviceX + deviceRadius + 1) - x;\n                var height = Math.min(deviceHeight, deviceY + deviceRadius + 1) - y;\n                if (width <= 0 || height <= 0) return null;\n                return {\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height\n                };\n            }\n        }\n    ]);\n    return DeckPicker1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/core\":\"bW3Qv\",\"../utils/assert\":\"8goZO\",\"../utils/log\":\"fg4UT\",\"../passes/pick-layers-pass\":\"h2MVW\",\"./picking/query-object\":\"jhOgb\",\"./picking/pick-info\":\"gUQEa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jhOgb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getClosestObject\", ()=>getClosestObject);\nparcelHelpers.export(exports, \"getUniqueObjects\", ()=>getUniqueObjects);\nvar _log = require(\"../../utils/log\");\nvar _logDefault = parcelHelpers.interopDefault(_log);\nvar NO_PICKED_OBJECT = {\n    pickedColor: null,\n    pickedLayer: null,\n    pickedObjectIndex: -1\n};\nfunction getClosestObject(_ref) {\n    var pickedColors = _ref.pickedColors, layers = _ref.layers, deviceX = _ref.deviceX, deviceY = _ref.deviceY, deviceRadius = _ref.deviceRadius, deviceRect = _ref.deviceRect;\n    if (pickedColors) {\n        var x = deviceRect.x, y = deviceRect.y, width = deviceRect.width, height = deviceRect.height;\n        var minSquareDistanceToCenter = deviceRadius * deviceRadius;\n        var closestPixelIndex = -1;\n        var i = 0;\n        for(var row = 0; row < height; row++){\n            var dy = row + y - deviceY;\n            var dy2 = dy * dy;\n            if (dy2 > minSquareDistanceToCenter) i += 4 * width;\n            else for(var col = 0; col < width; col++){\n                var pickedLayerIndex = pickedColors[i + 3] - 1;\n                if (pickedLayerIndex >= 0) {\n                    var dx = col + x - deviceX;\n                    var d2 = dx * dx + dy2;\n                    if (d2 <= minSquareDistanceToCenter) {\n                        minSquareDistanceToCenter = d2;\n                        closestPixelIndex = i;\n                    }\n                }\n                i += 4;\n            }\n        }\n        if (closestPixelIndex >= 0) {\n            var _pickedLayerIndex = pickedColors[closestPixelIndex + 3] - 1;\n            var pickedColor = pickedColors.slice(closestPixelIndex, closestPixelIndex + 4);\n            var pickedLayer = layers[_pickedLayerIndex];\n            if (pickedLayer) {\n                var pickedObjectIndex = pickedLayer.decodePickingColor(pickedColor);\n                var _dy = Math.floor(closestPixelIndex / 4 / width);\n                var _dx = closestPixelIndex / 4 - _dy * width;\n                return {\n                    pickedColor: pickedColor,\n                    pickedLayer: pickedLayer,\n                    pickedObjectIndex: pickedObjectIndex,\n                    pickedX: x + _dx,\n                    pickedY: y + _dy\n                };\n            }\n            (0, _logDefault.default).error(\"Picked non-existent layer. Is picking buffer corrupt?\")();\n        }\n    }\n    return NO_PICKED_OBJECT;\n}\nfunction getUniqueObjects(_ref2) {\n    var pickedColors = _ref2.pickedColors, layers = _ref2.layers;\n    var uniqueColors = new Map();\n    if (pickedColors) for(var i = 0; i < pickedColors.length; i += 4){\n        var pickedLayerIndex = pickedColors[i + 3] - 1;\n        if (pickedLayerIndex >= 0) {\n            var pickedColor = pickedColors.slice(i, i + 4);\n            var colorKey = pickedColor.join(\",\");\n            if (!uniqueColors.has(colorKey)) {\n                var pickedLayer = layers[pickedLayerIndex];\n                if (pickedLayer) uniqueColors.set(colorKey, {\n                    pickedColor: pickedColor,\n                    pickedLayer: pickedLayer,\n                    pickedObjectIndex: pickedLayer.decodePickingColor(pickedColor)\n                });\n                else (0, _logDefault.default).error(\"Picked non-existent layer. Is picking buffer corrupt?\")();\n            }\n        }\n    }\n    return Array.from(uniqueColors.values());\n}\n\n},{\"../../utils/log\":\"fg4UT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gUQEa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getEmptyPickingInfo\", ()=>getEmptyPickingInfo);\nparcelHelpers.export(exports, \"processPickInfo\", ()=>processPickInfo);\nparcelHelpers.export(exports, \"getLayerPickingInfo\", ()=>getLayerPickingInfo);\nfunction getEmptyPickingInfo(_ref) {\n    var pickInfo = _ref.pickInfo, viewports = _ref.viewports, pixelRatio = _ref.pixelRatio, x = _ref.x, y = _ref.y, z = _ref.z;\n    var viewport = getViewportFromCoordinates({\n        viewports: viewports\n    });\n    var coordinate = viewport && viewport.unproject([\n        x - viewport.x,\n        y - viewport.y\n    ], {\n        targetZ: z\n    });\n    return {\n        color: null,\n        layer: null,\n        index: -1,\n        picked: false,\n        x: x,\n        y: y,\n        pixel: [\n            x,\n            y\n        ],\n        coordinate: coordinate,\n        lngLat: coordinate,\n        devicePixel: pickInfo && [\n            pickInfo.pickedX,\n            pickInfo.pickedY\n        ],\n        pixelRatio: pixelRatio\n    };\n}\nfunction processPickInfo(opts) {\n    var pickInfo = opts.pickInfo, lastPickedInfo = opts.lastPickedInfo, mode = opts.mode, layers = opts.layers;\n    var pickedColor = pickInfo.pickedColor, pickedLayer = pickInfo.pickedLayer, pickedObjectIndex = pickInfo.pickedObjectIndex;\n    var affectedLayers = pickedLayer ? [\n        pickedLayer\n    ] : [];\n    if (mode === \"hover\") {\n        var lastPickedObjectIndex = lastPickedInfo.index;\n        var lastPickedLayerId = lastPickedInfo.layerId;\n        var pickedLayerId = pickedLayer && pickedLayer.props.id;\n        if (pickedLayerId !== lastPickedLayerId || pickedObjectIndex !== lastPickedObjectIndex) {\n            if (pickedLayerId !== lastPickedLayerId) {\n                var lastPickedLayer = layers.find(function(layer) {\n                    return layer.props.id === lastPickedLayerId;\n                });\n                if (lastPickedLayer) affectedLayers.unshift(lastPickedLayer);\n            }\n            lastPickedInfo.layerId = pickedLayerId;\n            lastPickedInfo.index = pickedObjectIndex;\n            lastPickedInfo.info = null;\n        }\n    }\n    var baseInfo = getEmptyPickingInfo(opts);\n    var infos = new Map();\n    infos.set(null, baseInfo);\n    affectedLayers.forEach(function(layer) {\n        var info = Object.assign({}, baseInfo);\n        if (layer === pickedLayer) {\n            info.color = pickedColor;\n            info.index = pickedObjectIndex;\n            info.picked = true;\n        }\n        info = getLayerPickingInfo({\n            layer: layer,\n            info: info,\n            mode: mode\n        });\n        if (layer === pickedLayer && mode === \"hover\") lastPickedInfo.info = info;\n        if (info) infos.set(info.layer.id, info);\n        if (mode === \"hover\" && layer.props.autoHighlight) {\n            var pickingModuleParameters = {\n                pickingSelectedColor: pickedLayer === layer ? pickedColor : null\n            };\n            var highlightColor = layer.props.highlightColor;\n            if (pickedLayer === layer && typeof highlightColor === \"function\") pickingModuleParameters.pickingHighlightColor = highlightColor(info);\n            layer.setModuleParameters(pickingModuleParameters);\n            layer.setNeedsRedraw();\n        }\n    });\n    return infos;\n}\nfunction getLayerPickingInfo(_ref2) {\n    var layer = _ref2.layer, info = _ref2.info, mode = _ref2.mode;\n    while(layer && info){\n        var sourceLayer = info.layer || layer;\n        info.layer = layer;\n        info = layer.getPickingInfo({\n            info: info,\n            mode: mode,\n            sourceLayer: sourceLayer\n        });\n        layer = layer.parent;\n    }\n    return info;\n}\nfunction getViewportFromCoordinates(_ref3) {\n    var viewports = _ref3.viewports;\n    var viewport = viewports[0];\n    return viewport;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7cczt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Tooltip);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar defaultStyle = {\n    zIndex: 1,\n    position: \"absolute\",\n    pointerEvents: \"none\",\n    color: \"#a0a7b4\",\n    backgroundColor: \"#29323c\",\n    padding: \"10px\",\n    top: 0,\n    left: 0,\n    display: \"none\"\n};\nvar Tooltip = function() {\n    function Tooltip1(canvas) {\n        (0, _classCallCheckDefault.default)(this, Tooltip1);\n        var canvasParent = canvas.parentElement;\n        if (canvasParent) {\n            this.el = document.createElement(\"div\");\n            this.el.className = \"deck-tooltip\";\n            Object.assign(this.el.style, defaultStyle);\n            canvasParent.appendChild(this.el);\n        }\n    }\n    (0, _createClassDefault.default)(Tooltip1, [\n        {\n            key: \"setTooltip\",\n            value: function setTooltip(displayInfo, x, y) {\n                var el = this.el;\n                if (typeof displayInfo === \"string\") el.innerText = displayInfo;\n                else if (!displayInfo) {\n                    el.style.display = \"none\";\n                    return;\n                } else {\n                    if (\"text\" in displayInfo) el.innerText = displayInfo.text;\n                    if (\"html\" in displayInfo) el.innerHTML = displayInfo.html;\n                    if (\"className\" in displayInfo) el.className = displayInfo.className;\n                    Object.assign(el.style, displayInfo.style);\n                }\n                el.style.display = \"block\";\n                el.style.transform = \"translate(\".concat(x, \"px, \").concat(y, \"px)\");\n            }\n        },\n        {\n            key: \"remove\",\n            value: function remove() {\n                if (this.el) this.el.remove();\n            }\n        }\n    ]);\n    return Tooltip1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c947x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"EventManager\", ()=>(0, _eventManagerDefault.default));\nvar _eventManager = require(\"./event-manager\");\nvar _eventManagerDefault = parcelHelpers.interopDefault(_eventManager);\n\n},{\"./event-manager\":\"jRKVU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jRKVU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _hammer = require(\"./utils/hammer\");\nvar _wheelInput = require(\"./inputs/wheel-input\");\nvar _wheelInputDefault = parcelHelpers.interopDefault(_wheelInput);\nvar _moveInput = require(\"./inputs/move-input\");\nvar _moveInputDefault = parcelHelpers.interopDefault(_moveInput);\nvar _keyInput = require(\"./inputs/key-input\");\nvar _keyInputDefault = parcelHelpers.interopDefault(_keyInput);\nvar _contextmenuInput = require(\"./inputs/contextmenu-input\");\nvar _contextmenuInputDefault = parcelHelpers.interopDefault(_contextmenuInput);\nvar _eventRegistrar = require(\"./utils/event-registrar\");\nvar _eventRegistrarDefault = parcelHelpers.interopDefault(_eventRegistrar);\nvar _constants = require(\"./constants\");\nconst DEFAULT_OPTIONS = {\n    // event handlers\n    events: null,\n    // custom recognizers\n    recognizers: null,\n    recognizerOptions: {},\n    Manager: // Manager class\n    (0, _hammer.Manager),\n    // allow browser default touch action\n    // https://github.com/uber/react-map-gl/issues/506\n    touchAction: \"none\",\n    tabIndex: 0\n};\nclass EventManager {\n    constructor(element = null, options){\n        /**\n         * Handle basic events using the 'hammer.input' Hammer.js API:\n         * Before running Recognizers, Hammer emits a 'hammer.input' event\n         * with the basic event info. This function emits all basic events\n         * aliased to the \"class\" of event received.\n         * See constants.BASIC_EVENT_CLASSES basic event class definitions.\n         */ this._onBasicInput = (event)=>{\n            const { srcEvent  } = event;\n            const alias = (0, _constants.BASIC_EVENT_ALIASES)[srcEvent.type];\n            if (alias) // fire all events aliased to srcEvent.type\n            this.manager.emit(alias, event);\n        };\n        /**\n         * Handle events not supported by Hammer.js,\n         * and pipe back out through same (Hammer) channel used by other events.\n         */ this._onOtherEvent = (event)=>{\n            // console.log('onotherevent', event.type, event)\n            this.manager.emit(event.type, event);\n        };\n        this.options = {\n            ...DEFAULT_OPTIONS,\n            ...options\n        };\n        this.events = new Map();\n        this.setElement(element);\n        // Register all passed events.\n        const { events  } = this.options;\n        if (events) this.on(events);\n    }\n    getElement() {\n        return this.element;\n    }\n    setElement(element) {\n        if (this.element) // unregister all events\n        this.destroy();\n        this.element = element;\n        if (!element) return;\n        const { options  } = this;\n        const ManagerClass = options.Manager;\n        this.manager = new ManagerClass(element, {\n            touchAction: options.touchAction,\n            recognizers: options.recognizers || (0, _constants.RECOGNIZERS)\n        }).on(\"hammer.input\", this._onBasicInput);\n        if (!options.recognizers) // Set default recognize withs\n        // http://hammerjs.github.io/recognize-with/\n        Object.keys((0, _constants.RECOGNIZER_COMPATIBLE_MAP)).forEach((name)=>{\n            const recognizer = this.manager.get(name);\n            if (recognizer) (0, _constants.RECOGNIZER_COMPATIBLE_MAP)[name].forEach((otherName)=>{\n                recognizer.recognizeWith(otherName);\n            });\n        });\n        // Set recognizer options\n        for(const recognizerName in options.recognizerOptions){\n            const recognizer = this.manager.get(recognizerName);\n            if (recognizer) {\n                const recognizerOption = options.recognizerOptions[recognizerName];\n                // `enable` is managed by the event registrations\n                delete recognizerOption.enable;\n                recognizer.set(recognizerOption);\n            }\n        }\n        // Handle events not handled by Hammer.js:\n        // - mouse wheel\n        // - pointer/touch/mouse move\n        this.wheelInput = new (0, _wheelInputDefault.default)(element, this._onOtherEvent, {\n            enable: false\n        });\n        this.moveInput = new (0, _moveInputDefault.default)(element, this._onOtherEvent, {\n            enable: false\n        });\n        this.keyInput = new (0, _keyInputDefault.default)(element, this._onOtherEvent, {\n            enable: false,\n            tabIndex: options.tabIndex\n        });\n        this.contextmenuInput = new (0, _contextmenuInputDefault.default)(element, this._onOtherEvent, {\n            enable: false\n        });\n        // Register all existing events\n        for (const [eventAlias, eventRegistrar] of this.events)if (!eventRegistrar.isEmpty()) {\n            // Enable recognizer for this event.\n            this._toggleRecognizer(eventRegistrar.recognizerName, true);\n            this.manager.on(eventAlias, eventRegistrar.handleEvent);\n        }\n    }\n    // Tear down internal event management implementations.\n    destroy() {\n        if (this.element) {\n            // wheelInput etc. are created in setElement() and therefore\n            // cannot exist if there is no element\n            this.wheelInput.destroy();\n            this.moveInput.destroy();\n            this.keyInput.destroy();\n            this.contextmenuInput.destroy();\n            this.manager.destroy();\n            this.wheelInput = null;\n            this.moveInput = null;\n            this.keyInput = null;\n            this.contextmenuInput = null;\n            this.manager = null;\n            this.element = null;\n        }\n    }\n    /** Register an event handler function to be called on `event` */ on(event, handler, opts) {\n        this._addEventHandler(event, handler, opts, false);\n    }\n    once(event, handler, opts) {\n        this._addEventHandler(event, handler, opts, true);\n    }\n    watch(event, handler, opts) {\n        this._addEventHandler(event, handler, opts, false, true);\n    }\n    off(event, handler) {\n        this._removeEventHandler(event, handler);\n    }\n    /*\n     * Enable/disable recognizer for the given event\n     */ _toggleRecognizer(name, enabled) {\n        const { manager  } = this;\n        if (!manager) return;\n        const recognizer = manager.get(name);\n        // @ts-ignore\n        if (recognizer && recognizer.options.enable !== enabled) {\n            recognizer.set({\n                enable: enabled\n            });\n            const fallbackRecognizers = (0, _constants.RECOGNIZER_FALLBACK_MAP)[name];\n            if (fallbackRecognizers && !this.options.recognizers) // Set default require failures\n            // http://hammerjs.github.io/require-failure/\n            fallbackRecognizers.forEach((otherName)=>{\n                const otherRecognizer = manager.get(otherName);\n                if (enabled) {\n                    // Wait for this recognizer to fail\n                    otherRecognizer.requireFailure(name);\n                    /**\n                         * This seems to be a bug in hammerjs:\n                         * requireFailure() adds both ways\n                         * dropRequireFailure() only drops one way\n                         * https://github.com/hammerjs/hammer.js/blob/master/src/recognizerjs/\n                           recognizer-constructor.js#L136\n                         */ recognizer.dropRequireFailure(otherName);\n                } else // Do not wait for this recognizer to fail\n                otherRecognizer.dropRequireFailure(name);\n            });\n        }\n        this.wheelInput.enableEventType(name, enabled);\n        this.moveInput.enableEventType(name, enabled);\n        this.keyInput.enableEventType(name, enabled);\n        this.contextmenuInput.enableEventType(name, enabled);\n    }\n    /**\n     * Process the event registration for a single event + handler.\n     */ _addEventHandler(event, handler, opts, once, passive) {\n        if (typeof event !== \"string\") {\n            // @ts-ignore\n            opts = handler;\n            // If `event` is a map, call `on()` for each entry.\n            for(const eventName in event)this._addEventHandler(eventName, event[eventName], opts, once, passive);\n            return;\n        }\n        const { manager , events  } = this;\n        // Alias to a recognized gesture as necessary.\n        const eventAlias = (0, _constants.GESTURE_EVENT_ALIASES)[event] || event;\n        let eventRegistrar = events.get(eventAlias);\n        if (!eventRegistrar) {\n            eventRegistrar = new (0, _eventRegistrarDefault.default)(this);\n            events.set(eventAlias, eventRegistrar);\n            // Enable recognizer for this event.\n            eventRegistrar.recognizerName = (0, _constants.EVENT_RECOGNIZER_MAP)[eventAlias] || eventAlias;\n            // Listen to the event\n            if (manager) manager.on(eventAlias, eventRegistrar.handleEvent);\n        }\n        eventRegistrar.add(event, handler, opts, once, passive);\n        if (!eventRegistrar.isEmpty()) this._toggleRecognizer(eventRegistrar.recognizerName, true);\n    }\n    /**\n     * Process the event deregistration for a single event + handler.\n     */ _removeEventHandler(event, handler) {\n        if (typeof event !== \"string\") {\n            // If `event` is a map, call `off()` for each entry.\n            for(const eventName in event)this._removeEventHandler(eventName, event[eventName]);\n            return;\n        }\n        const { events  } = this;\n        // Alias to a recognized gesture as necessary.\n        const eventAlias = (0, _constants.GESTURE_EVENT_ALIASES)[event] || event;\n        const eventRegistrar = events.get(eventAlias);\n        if (!eventRegistrar) return;\n        eventRegistrar.remove(event, handler);\n        if (eventRegistrar.isEmpty()) {\n            const { recognizerName  } = eventRegistrar;\n            // Disable recognizer if no more handlers are attached to its events\n            let isRecognizerUsed = false;\n            for (const eh of events.values())if (eh.recognizerName === recognizerName && !eh.isEmpty()) {\n                isRecognizerUsed = true;\n                break;\n            }\n            if (!isRecognizerUsed) this._toggleRecognizer(recognizerName, false);\n        }\n    }\n}\nexports.default = EventManager;\n\n},{\"./utils/hammer\":\"jEgwB\",\"./inputs/wheel-input\":\"clqFe\",\"./inputs/move-input\":\"jnJ08\",\"./inputs/key-input\":\"7jf7y\",\"./inputs/contextmenu-input\":\"GuhV3\",\"./utils/event-registrar\":\"9gXr1\",\"./constants\":\"dWT9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jEgwB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Manager\", ()=>Manager);\nvar _hammerjs = require(\"hammerjs\");\nvar _hammerjsDefault = parcelHelpers.interopDefault(_hammerjs);\nvar _hammerOverrides = require(\"./hammer-overrides\");\n(0, _hammerOverrides.enhancePointerEventInput)((0, _hammerjsDefault.default).PointerEventInput);\n(0, _hammerOverrides.enhanceMouseInput)((0, _hammerjsDefault.default).MouseInput);\nconst Manager = (0, _hammerjsDefault.default).Manager;\nexports.default = (0, _hammerjsDefault.default);\n\n},{\"hammerjs\":\"1i5zq\",\"./hammer-overrides\":\"9FwZC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1i5zq\":[function(require,module,exports) {\n/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */ (function(window, document, exportName, undefined) {\n    \"use strict\";\n    var VENDOR_PREFIXES = [\n        \"\",\n        \"webkit\",\n        \"Moz\",\n        \"MS\",\n        \"ms\",\n        \"o\"\n    ];\n    var TEST_ELEMENT = document.createElement(\"div\");\n    var TYPE_FUNCTION = \"function\";\n    var round = Math.round;\n    var abs = Math.abs;\n    var now = Date.now;\n    /**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */ function setTimeoutContext(fn, timeout, context) {\n        return setTimeout(bindFn(fn, context), timeout);\n    }\n    /**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */ function invokeArrayArg(arg, fn, context) {\n        if (Array.isArray(arg)) {\n            each(arg, context[fn], context);\n            return true;\n        }\n        return false;\n    }\n    /**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */ function each(obj, iterator, context) {\n        var i;\n        if (!obj) return;\n        if (obj.forEach) obj.forEach(iterator, context);\n        else if (obj.length !== undefined) {\n            i = 0;\n            while(i < obj.length){\n                iterator.call(context, obj[i], i, obj);\n                i++;\n            }\n        } else for(i in obj)obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n    }\n    /**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */ function deprecate(method, name, message) {\n        var deprecationMessage = \"DEPRECATED METHOD: \" + name + \"\\n\" + message + \" AT \\n\";\n        return function() {\n            var e = new Error(\"get-stack-trace\");\n            var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, \"\").replace(/^\\s+at\\s+/gm, \"\").replace(/^Object.<anonymous>\\s*\\(/gm, \"{anonymous}()@\") : \"Unknown Stack Trace\";\n            var log = window.console && (window.console.warn || window.console.log);\n            if (log) log.call(window.console, deprecationMessage, stack);\n            return method.apply(this, arguments);\n        };\n    }\n    /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */ var assign;\n    if (typeof Object.assign !== \"function\") assign = function assign(target) {\n        if (target === undefined || target === null) throw new TypeError(\"Cannot convert undefined or null to object\");\n        var output = Object(target);\n        for(var index = 1; index < arguments.length; index++){\n            var source = arguments[index];\n            if (source !== undefined && source !== null) {\n                for(var nextKey in source)if (source.hasOwnProperty(nextKey)) output[nextKey] = source[nextKey];\n            }\n        }\n        return output;\n    };\n    else assign = Object.assign;\n    /**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */ var extend = deprecate(function extend(dest, src, merge) {\n        var keys = Object.keys(src);\n        var i = 0;\n        while(i < keys.length){\n            if (!merge || merge && dest[keys[i]] === undefined) dest[keys[i]] = src[keys[i]];\n            i++;\n        }\n        return dest;\n    }, \"extend\", \"Use `assign`.\");\n    /**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */ var merge1 = deprecate(function merge(dest, src) {\n        return extend(dest, src, true);\n    }, \"merge\", \"Use `assign`.\");\n    /**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */ function inherit(child, base, properties) {\n        var baseP = base.prototype, childP;\n        childP = child.prototype = Object.create(baseP);\n        childP.constructor = child;\n        childP._super = baseP;\n        if (properties) assign(childP, properties);\n    }\n    /**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */ function bindFn(fn, context) {\n        return function boundFn() {\n            return fn.apply(context, arguments);\n        };\n    }\n    /**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */ function boolOrFn(val, args) {\n        if (typeof val == TYPE_FUNCTION) return val.apply(args ? args[0] || undefined : undefined, args);\n        return val;\n    }\n    /**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */ function ifUndefined(val1, val2) {\n        return val1 === undefined ? val2 : val1;\n    }\n    /**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */ function addEventListeners(target, types, handler) {\n        each(splitStr(types), function(type) {\n            target.addEventListener(type, handler, false);\n        });\n    }\n    /**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */ function removeEventListeners(target, types, handler) {\n        each(splitStr(types), function(type) {\n            target.removeEventListener(type, handler, false);\n        });\n    }\n    /**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */ function hasParent(node, parent) {\n        while(node){\n            if (node == parent) return true;\n            node = node.parentNode;\n        }\n        return false;\n    }\n    /**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */ function inStr(str, find) {\n        return str.indexOf(find) > -1;\n    }\n    /**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */ function splitStr(str) {\n        return str.trim().split(/\\s+/g);\n    }\n    /**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */ function inArray(src, find, findByKey) {\n        if (src.indexOf && !findByKey) return src.indexOf(find);\n        else {\n            var i = 0;\n            while(i < src.length){\n                if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) return i;\n                i++;\n            }\n            return -1;\n        }\n    }\n    /**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */ function toArray(obj) {\n        return Array.prototype.slice.call(obj, 0);\n    }\n    /**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */ function uniqueArray(src, key, sort) {\n        var results = [];\n        var values = [];\n        var i = 0;\n        while(i < src.length){\n            var val = key ? src[i][key] : src[i];\n            if (inArray(values, val) < 0) results.push(src[i]);\n            values[i] = val;\n            i++;\n        }\n        if (sort) {\n            if (!key) results = results.sort();\n            else results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n        return results;\n    }\n    /**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */ function prefixed(obj, property) {\n        var prefix, prop;\n        var camelProp = property[0].toUpperCase() + property.slice(1);\n        var i = 0;\n        while(i < VENDOR_PREFIXES.length){\n            prefix = VENDOR_PREFIXES[i];\n            prop = prefix ? prefix + camelProp : property;\n            if (prop in obj) return prop;\n            i++;\n        }\n        return undefined;\n    }\n    /**\n * get a unique id\n * @returns {number} uniqueId\n */ var _uniqueId = 1;\n    function uniqueId() {\n        return _uniqueId++;\n    }\n    /**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */ function getWindowForElement(element) {\n        var doc = element.ownerDocument || element;\n        return doc.defaultView || doc.parentWindow || window;\n    }\n    var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n    var SUPPORT_TOUCH = \"ontouchstart\" in window;\n    var SUPPORT_POINTER_EVENTS = prefixed(window, \"PointerEvent\") !== undefined;\n    var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n    var INPUT_TYPE_TOUCH = \"touch\";\n    var INPUT_TYPE_PEN = \"pen\";\n    var INPUT_TYPE_MOUSE = \"mouse\";\n    var INPUT_TYPE_KINECT = \"kinect\";\n    var COMPUTE_INTERVAL = 25;\n    var INPUT_START = 1;\n    var INPUT_MOVE = 2;\n    var INPUT_END = 4;\n    var INPUT_CANCEL = 8;\n    var DIRECTION_NONE = 1;\n    var DIRECTION_LEFT = 2;\n    var DIRECTION_RIGHT = 4;\n    var DIRECTION_UP = 8;\n    var DIRECTION_DOWN = 16;\n    var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n    var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n    var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n    var PROPS_XY = [\n        \"x\",\n        \"y\"\n    ];\n    var PROPS_CLIENT_XY = [\n        \"clientX\",\n        \"clientY\"\n    ];\n    /**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */ function Input(manager, callback) {\n        var self = this;\n        this.manager = manager;\n        this.callback = callback;\n        this.element = manager.element;\n        this.target = manager.options.inputTarget;\n        // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n        // so when disabled the input events are completely bypassed.\n        this.domHandler = function(ev) {\n            if (boolOrFn(manager.options.enable, [\n                manager\n            ])) self.handler(ev);\n        };\n        this.init();\n    }\n    Input.prototype = {\n        /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */ handler: function() {},\n        /**\n     * bind the events\n     */ init: function() {\n            this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n            this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n            this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n        },\n        /**\n     * unbind the events\n     */ destroy: function() {\n            this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n            this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n            this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n        }\n    };\n    /**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */ function createInputInstance(manager) {\n        var Type;\n        var inputClass = manager.options.inputClass;\n        if (inputClass) Type = inputClass;\n        else if (SUPPORT_POINTER_EVENTS) Type = PointerEventInput;\n        else if (SUPPORT_ONLY_TOUCH) Type = TouchInput;\n        else if (!SUPPORT_TOUCH) Type = MouseInput;\n        else Type = TouchMouseInput;\n        return new Type(manager, inputHandler);\n    }\n    /**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */ function inputHandler(manager, eventType, input) {\n        var pointersLen = input.pointers.length;\n        var changedPointersLen = input.changedPointers.length;\n        var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;\n        var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;\n        input.isFirst = !!isFirst;\n        input.isFinal = !!isFinal;\n        if (isFirst) manager.session = {};\n        // source event is the normalized value of the domEvents\n        // like 'touchstart, mouseup, pointerdown'\n        input.eventType = eventType;\n        // compute scale, rotation etc\n        computeInputData(manager, input);\n        // emit secret event\n        manager.emit(\"hammer.input\", input);\n        manager.recognize(input);\n        manager.session.prevInput = input;\n    }\n    /**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */ function computeInputData(manager, input) {\n        var session = manager.session;\n        var pointers = input.pointers;\n        var pointersLength = pointers.length;\n        // store the first input to calculate the distance and direction\n        if (!session.firstInput) session.firstInput = simpleCloneInputData(input);\n        // to compute scale and rotation we need to store the multiple touches\n        if (pointersLength > 1 && !session.firstMultiple) session.firstMultiple = simpleCloneInputData(input);\n        else if (pointersLength === 1) session.firstMultiple = false;\n        var firstInput = session.firstInput;\n        var firstMultiple = session.firstMultiple;\n        var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n        var center = input.center = getCenter(pointers);\n        input.timeStamp = now();\n        input.deltaTime = input.timeStamp - firstInput.timeStamp;\n        input.angle = getAngle(offsetCenter, center);\n        input.distance = getDistance(offsetCenter, center);\n        computeDeltaXY(session, input);\n        input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n        var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n        input.overallVelocityX = overallVelocity.x;\n        input.overallVelocityY = overallVelocity.y;\n        input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;\n        input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n        input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n        input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;\n        computeIntervalInputData(session, input);\n        // find the correct target\n        var target = manager.element;\n        if (hasParent(input.srcEvent.target, target)) target = input.srcEvent.target;\n        input.target = target;\n    }\n    function computeDeltaXY(session, input) {\n        var center = input.center;\n        var offset = session.offsetDelta || {};\n        var prevDelta = session.prevDelta || {};\n        var prevInput = session.prevInput || {};\n        if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n            prevDelta = session.prevDelta = {\n                x: prevInput.deltaX || 0,\n                y: prevInput.deltaY || 0\n            };\n            offset = session.offsetDelta = {\n                x: center.x,\n                y: center.y\n            };\n        }\n        input.deltaX = prevDelta.x + (center.x - offset.x);\n        input.deltaY = prevDelta.y + (center.y - offset.y);\n    }\n    /**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */ function computeIntervalInputData(session, input) {\n        var last = session.lastInterval || input, deltaTime = input.timeStamp - last.timeStamp, velocity, velocityX, velocityY, direction;\n        if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n            var deltaX = input.deltaX - last.deltaX;\n            var deltaY = input.deltaY - last.deltaY;\n            var v = getVelocity(deltaTime, deltaX, deltaY);\n            velocityX = v.x;\n            velocityY = v.y;\n            velocity = abs(v.x) > abs(v.y) ? v.x : v.y;\n            direction = getDirection(deltaX, deltaY);\n            session.lastInterval = input;\n        } else {\n            // use latest velocity info if it doesn't overtake a minimum period\n            velocity = last.velocity;\n            velocityX = last.velocityX;\n            velocityY = last.velocityY;\n            direction = last.direction;\n        }\n        input.velocity = velocity;\n        input.velocityX = velocityX;\n        input.velocityY = velocityY;\n        input.direction = direction;\n    }\n    /**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */ function simpleCloneInputData(input) {\n        // make a simple copy of the pointers because we will get a reference if we don't\n        // we only need clientXY for the calculations\n        var pointers = [];\n        var i = 0;\n        while(i < input.pointers.length){\n            pointers[i] = {\n                clientX: round(input.pointers[i].clientX),\n                clientY: round(input.pointers[i].clientY)\n            };\n            i++;\n        }\n        return {\n            timeStamp: now(),\n            pointers: pointers,\n            center: getCenter(pointers),\n            deltaX: input.deltaX,\n            deltaY: input.deltaY\n        };\n    }\n    /**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */ function getCenter(pointers) {\n        var pointersLength = pointers.length;\n        // no need to loop when only one touch\n        if (pointersLength === 1) return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n        var x = 0, y = 0, i = 0;\n        while(i < pointersLength){\n            x += pointers[i].clientX;\n            y += pointers[i].clientY;\n            i++;\n        }\n        return {\n            x: round(x / pointersLength),\n            y: round(y / pointersLength)\n        };\n    }\n    /**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */ function getVelocity(deltaTime, x, y) {\n        return {\n            x: x / deltaTime || 0,\n            y: y / deltaTime || 0\n        };\n    }\n    /**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */ function getDirection(x, y) {\n        if (x === y) return DIRECTION_NONE;\n        if (abs(x) >= abs(y)) return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n        return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n    }\n    /**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */ function getDistance(p1, p2, props) {\n        if (!props) props = PROPS_XY;\n        var x = p2[props[0]] - p1[props[0]], y = p2[props[1]] - p1[props[1]];\n        return Math.sqrt(x * x + y * y);\n    }\n    /**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */ function getAngle(p1, p2, props) {\n        if (!props) props = PROPS_XY;\n        var x = p2[props[0]] - p1[props[0]], y = p2[props[1]] - p1[props[1]];\n        return Math.atan2(y, x) * 180 / Math.PI;\n    }\n    /**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */ function getRotation(start, end) {\n        return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n    }\n    /**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */ function getScale(start, end) {\n        return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n    }\n    var MOUSE_INPUT_MAP = {\n        mousedown: INPUT_START,\n        mousemove: INPUT_MOVE,\n        mouseup: INPUT_END\n    };\n    var MOUSE_ELEMENT_EVENTS = \"mousedown\";\n    var MOUSE_WINDOW_EVENTS = \"mousemove mouseup\";\n    /**\n * Mouse events input\n * @constructor\n * @extends Input\n */ function MouseInput() {\n        this.evEl = MOUSE_ELEMENT_EVENTS;\n        this.evWin = MOUSE_WINDOW_EVENTS;\n        this.pressed = false; // mousedown state\n        Input.apply(this, arguments);\n    }\n    inherit(MouseInput, Input, {\n        /**\n     * handle mouse events\n     * @param {Object} ev\n     */ handler: function MEhandler(ev) {\n            var eventType = MOUSE_INPUT_MAP[ev.type];\n            // on start we want to have the left mouse button down\n            if (eventType & INPUT_START && ev.button === 0) this.pressed = true;\n            if (eventType & INPUT_MOVE && ev.which !== 1) eventType = INPUT_END;\n            // mouse must be down\n            if (!this.pressed) return;\n            if (eventType & INPUT_END) this.pressed = false;\n            this.callback(this.manager, eventType, {\n                pointers: [\n                    ev\n                ],\n                changedPointers: [\n                    ev\n                ],\n                pointerType: INPUT_TYPE_MOUSE,\n                srcEvent: ev\n            });\n        }\n    });\n    var POINTER_INPUT_MAP = {\n        pointerdown: INPUT_START,\n        pointermove: INPUT_MOVE,\n        pointerup: INPUT_END,\n        pointercancel: INPUT_CANCEL,\n        pointerout: INPUT_CANCEL\n    };\n    // in IE10 the pointer types is defined as an enum\n    var IE10_POINTER_TYPE_ENUM = {\n        2: INPUT_TYPE_TOUCH,\n        3: INPUT_TYPE_PEN,\n        4: INPUT_TYPE_MOUSE,\n        5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n    };\n    var POINTER_ELEMENT_EVENTS = \"pointerdown\";\n    var POINTER_WINDOW_EVENTS = \"pointermove pointerup pointercancel\";\n    // IE10 has prefixed support, and case-sensitive\n    if (window.MSPointerEvent && !window.PointerEvent) {\n        POINTER_ELEMENT_EVENTS = \"MSPointerDown\";\n        POINTER_WINDOW_EVENTS = \"MSPointerMove MSPointerUp MSPointerCancel\";\n    }\n    /**\n * Pointer events input\n * @constructor\n * @extends Input\n */ function PointerEventInput() {\n        this.evEl = POINTER_ELEMENT_EVENTS;\n        this.evWin = POINTER_WINDOW_EVENTS;\n        Input.apply(this, arguments);\n        this.store = this.manager.session.pointerEvents = [];\n    }\n    inherit(PointerEventInput, Input, {\n        /**\n     * handle mouse events\n     * @param {Object} ev\n     */ handler: function PEhandler(ev) {\n            var store = this.store;\n            var removePointer = false;\n            var eventTypeNormalized = ev.type.toLowerCase().replace(\"ms\", \"\");\n            var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n            var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n            var isTouch = pointerType == INPUT_TYPE_TOUCH;\n            // get index of the event in the store\n            var storeIndex = inArray(store, ev.pointerId, \"pointerId\");\n            // start and mouse must be down\n            if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n                if (storeIndex < 0) {\n                    store.push(ev);\n                    storeIndex = store.length - 1;\n                }\n            } else if (eventType & (INPUT_END | INPUT_CANCEL)) removePointer = true;\n            // it not found, so the pointer hasn't been down (so it's probably a hover)\n            if (storeIndex < 0) return;\n            // update the event in the store\n            store[storeIndex] = ev;\n            this.callback(this.manager, eventType, {\n                pointers: store,\n                changedPointers: [\n                    ev\n                ],\n                pointerType: pointerType,\n                srcEvent: ev\n            });\n            if (removePointer) // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    });\n    var SINGLE_TOUCH_INPUT_MAP = {\n        touchstart: INPUT_START,\n        touchmove: INPUT_MOVE,\n        touchend: INPUT_END,\n        touchcancel: INPUT_CANCEL\n    };\n    var SINGLE_TOUCH_TARGET_EVENTS = \"touchstart\";\n    var SINGLE_TOUCH_WINDOW_EVENTS = \"touchstart touchmove touchend touchcancel\";\n    /**\n * Touch events input\n * @constructor\n * @extends Input\n */ function SingleTouchInput() {\n        this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n        this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n        this.started = false;\n        Input.apply(this, arguments);\n    }\n    inherit(SingleTouchInput, Input, {\n        handler: function TEhandler(ev) {\n            var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n            // should we handle the touch events?\n            if (type === INPUT_START) this.started = true;\n            if (!this.started) return;\n            var touches = normalizeSingleTouches.call(this, ev, type);\n            // when done, reset the started state\n            if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) this.started = false;\n            this.callback(this.manager, type, {\n                pointers: touches[0],\n                changedPointers: touches[1],\n                pointerType: INPUT_TYPE_TOUCH,\n                srcEvent: ev\n            });\n        }\n    });\n    /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */ function normalizeSingleTouches(ev, type) {\n        var all = toArray(ev.touches);\n        var changed = toArray(ev.changedTouches);\n        if (type & (INPUT_END | INPUT_CANCEL)) all = uniqueArray(all.concat(changed), \"identifier\", true);\n        return [\n            all,\n            changed\n        ];\n    }\n    var TOUCH_INPUT_MAP = {\n        touchstart: INPUT_START,\n        touchmove: INPUT_MOVE,\n        touchend: INPUT_END,\n        touchcancel: INPUT_CANCEL\n    };\n    var TOUCH_TARGET_EVENTS = \"touchstart touchmove touchend touchcancel\";\n    /**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */ function TouchInput() {\n        this.evTarget = TOUCH_TARGET_EVENTS;\n        this.targetIds = {};\n        Input.apply(this, arguments);\n    }\n    inherit(TouchInput, Input, {\n        handler: function MTEhandler(ev) {\n            var type = TOUCH_INPUT_MAP[ev.type];\n            var touches = getTouches.call(this, ev, type);\n            if (!touches) return;\n            this.callback(this.manager, type, {\n                pointers: touches[0],\n                changedPointers: touches[1],\n                pointerType: INPUT_TYPE_TOUCH,\n                srcEvent: ev\n            });\n        }\n    });\n    /**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */ function getTouches(ev, type) {\n        var allTouches = toArray(ev.touches);\n        var targetIds = this.targetIds;\n        // when there is only one touch, the process can be simplified\n        if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n            targetIds[allTouches[0].identifier] = true;\n            return [\n                allTouches,\n                allTouches\n            ];\n        }\n        var i, targetTouches, changedTouches = toArray(ev.changedTouches), changedTargetTouches = [], target = this.target;\n        // get target touches from touches\n        targetTouches = allTouches.filter(function(touch) {\n            return hasParent(touch.target, target);\n        });\n        // collect touches\n        if (type === INPUT_START) {\n            i = 0;\n            while(i < targetTouches.length){\n                targetIds[targetTouches[i].identifier] = true;\n                i++;\n            }\n        }\n        // filter changed touches to only contain touches that exist in the collected target ids\n        i = 0;\n        while(i < changedTouches.length){\n            if (targetIds[changedTouches[i].identifier]) changedTargetTouches.push(changedTouches[i]);\n            // cleanup removed touches\n            if (type & (INPUT_END | INPUT_CANCEL)) delete targetIds[changedTouches[i].identifier];\n            i++;\n        }\n        if (!changedTargetTouches.length) return;\n        return [\n            // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n            uniqueArray(targetTouches.concat(changedTargetTouches), \"identifier\", true),\n            changedTargetTouches\n        ];\n    }\n    /**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */ var DEDUP_TIMEOUT = 2500;\n    var DEDUP_DISTANCE = 25;\n    function TouchMouseInput() {\n        Input.apply(this, arguments);\n        var handler = bindFn(this.handler, this);\n        this.touch = new TouchInput(this.manager, handler);\n        this.mouse = new MouseInput(this.manager, handler);\n        this.primaryTouch = null;\n        this.lastTouches = [];\n    }\n    inherit(TouchMouseInput, Input, {\n        /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */ handler: function TMEhandler(manager, inputEvent, inputData) {\n            var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH, isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;\n            if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) return;\n            // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n            if (isTouch) recordTouches.call(this, inputEvent, inputData);\n            else if (isMouse && isSyntheticEvent.call(this, inputData)) return;\n            this.callback(manager, inputEvent, inputData);\n        },\n        /**\n     * remove the event listeners\n     */ destroy: function destroy() {\n            this.touch.destroy();\n            this.mouse.destroy();\n        }\n    });\n    function recordTouches(eventType, eventData) {\n        if (eventType & INPUT_START) {\n            this.primaryTouch = eventData.changedPointers[0].identifier;\n            setLastTouch.call(this, eventData);\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) setLastTouch.call(this, eventData);\n    }\n    function setLastTouch(eventData) {\n        var touch = eventData.changedPointers[0];\n        if (touch.identifier === this.primaryTouch) {\n            var lastTouch = {\n                x: touch.clientX,\n                y: touch.clientY\n            };\n            this.lastTouches.push(lastTouch);\n            var lts = this.lastTouches;\n            var removeLastTouch = function() {\n                var i = lts.indexOf(lastTouch);\n                if (i > -1) lts.splice(i, 1);\n            };\n            setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n        }\n    }\n    function isSyntheticEvent(eventData) {\n        var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n        for(var i = 0; i < this.lastTouches.length; i++){\n            var t = this.lastTouches[i];\n            var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n            if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) return true;\n        }\n        return false;\n    }\n    var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, \"touchAction\");\n    var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n    // magical touchAction value\n    var TOUCH_ACTION_COMPUTE = \"compute\";\n    var TOUCH_ACTION_AUTO = \"auto\";\n    var TOUCH_ACTION_MANIPULATION = \"manipulation\"; // not implemented\n    var TOUCH_ACTION_NONE = \"none\";\n    var TOUCH_ACTION_PAN_X = \"pan-x\";\n    var TOUCH_ACTION_PAN_Y = \"pan-y\";\n    var TOUCH_ACTION_MAP = getTouchActionProps();\n    /**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */ function TouchAction(manager, value) {\n        this.manager = manager;\n        this.set(value);\n    }\n    TouchAction.prototype = {\n        /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */ set: function(value) {\n            // find out the touch-action by the event handlers\n            if (value == TOUCH_ACTION_COMPUTE) value = this.compute();\n            if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n            this.actions = value.toLowerCase().trim();\n        },\n        /**\n     * just re-set the touchAction value\n     */ update: function() {\n            this.set(this.manager.options.touchAction);\n        },\n        /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */ compute: function() {\n            var actions = [];\n            each(this.manager.recognizers, function(recognizer) {\n                if (boolOrFn(recognizer.options.enable, [\n                    recognizer\n                ])) actions = actions.concat(recognizer.getTouchAction());\n            });\n            return cleanTouchActions(actions.join(\" \"));\n        },\n        /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */ preventDefaults: function(input) {\n            var srcEvent = input.srcEvent;\n            var direction = input.offsetDirection;\n            // if the touch action did prevented once this session\n            if (this.manager.session.prevented) {\n                srcEvent.preventDefault();\n                return;\n            }\n            var actions = this.actions;\n            var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n            var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n            var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n            if (hasNone) {\n                //do not prevent defaults if this is a tap gesture\n                var isTapPointer = input.pointers.length === 1;\n                var isTapMovement = input.distance < 2;\n                var isTapTouchTime = input.deltaTime < 250;\n                if (isTapPointer && isTapMovement && isTapTouchTime) return;\n            }\n            if (hasPanX && hasPanY) // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n            return;\n            if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) return this.preventSrc(srcEvent);\n        },\n        /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */ preventSrc: function(srcEvent) {\n            this.manager.session.prevented = true;\n            srcEvent.preventDefault();\n        }\n    };\n    /**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */ function cleanTouchActions(actions) {\n        // none\n        if (inStr(actions, TOUCH_ACTION_NONE)) return TOUCH_ACTION_NONE;\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n        // if both pan-x and pan-y are set (different recognizers\n        // for different directions, e.g. horizontal pan but vertical swipe?)\n        // we need none (as otherwise with pan-x pan-y combined none of these\n        // recognizers will work, since the browser would handle all panning\n        if (hasPanX && hasPanY) return TOUCH_ACTION_NONE;\n        // pan-x OR pan-y\n        if (hasPanX || hasPanY) return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n        // manipulation\n        if (inStr(actions, TOUCH_ACTION_MANIPULATION)) return TOUCH_ACTION_MANIPULATION;\n        return TOUCH_ACTION_AUTO;\n    }\n    function getTouchActionProps() {\n        if (!NATIVE_TOUCH_ACTION) return false;\n        var touchMap = {};\n        var cssSupports = window.CSS && window.CSS.supports;\n        [\n            \"auto\",\n            \"manipulation\",\n            \"pan-y\",\n            \"pan-x\",\n            \"pan-x pan-y\",\n            \"none\"\n        ].forEach(function(val) {\n            // If css.supports is not supported but there is native touch-action assume it supports\n            // all values. This is the case for IE 10 and 11.\n            touchMap[val] = cssSupports ? window.CSS.supports(\"touch-action\", val) : true;\n        });\n        return touchMap;\n    }\n    /**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */ var STATE_POSSIBLE = 1;\n    var STATE_BEGAN = 2;\n    var STATE_CHANGED = 4;\n    var STATE_ENDED = 8;\n    var STATE_RECOGNIZED = STATE_ENDED;\n    var STATE_CANCELLED = 16;\n    var STATE_FAILED = 32;\n    /**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */ function Recognizer(options) {\n        this.options = assign({}, this.defaults, options || {});\n        this.id = uniqueId();\n        this.manager = null;\n        // default is enable true\n        this.options.enable = ifUndefined(this.options.enable, true);\n        this.state = STATE_POSSIBLE;\n        this.simultaneous = {};\n        this.requireFail = [];\n    }\n    Recognizer.prototype = {\n        /**\n     * @virtual\n     * @type {Object}\n     */ defaults: {},\n        /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */ set: function(options) {\n            assign(this.options, options);\n            // also update the touchAction, in case something changed about the directions/enabled state\n            this.manager && this.manager.touchAction.update();\n            return this;\n        },\n        /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */ recognizeWith: function(otherRecognizer) {\n            if (invokeArrayArg(otherRecognizer, \"recognizeWith\", this)) return this;\n            var simultaneous = this.simultaneous;\n            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n            if (!simultaneous[otherRecognizer.id]) {\n                simultaneous[otherRecognizer.id] = otherRecognizer;\n                otherRecognizer.recognizeWith(this);\n            }\n            return this;\n        },\n        /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */ dropRecognizeWith: function(otherRecognizer) {\n            if (invokeArrayArg(otherRecognizer, \"dropRecognizeWith\", this)) return this;\n            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n            delete this.simultaneous[otherRecognizer.id];\n            return this;\n        },\n        /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */ requireFailure: function(otherRecognizer) {\n            if (invokeArrayArg(otherRecognizer, \"requireFailure\", this)) return this;\n            var requireFail = this.requireFail;\n            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n            if (inArray(requireFail, otherRecognizer) === -1) {\n                requireFail.push(otherRecognizer);\n                otherRecognizer.requireFailure(this);\n            }\n            return this;\n        },\n        /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */ dropRequireFailure: function(otherRecognizer) {\n            if (invokeArrayArg(otherRecognizer, \"dropRequireFailure\", this)) return this;\n            otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n            var index = inArray(this.requireFail, otherRecognizer);\n            if (index > -1) this.requireFail.splice(index, 1);\n            return this;\n        },\n        /**\n     * has require failures boolean\n     * @returns {boolean}\n     */ hasRequireFailures: function() {\n            return this.requireFail.length > 0;\n        },\n        /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */ canRecognizeWith: function(otherRecognizer) {\n            return !!this.simultaneous[otherRecognizer.id];\n        },\n        /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */ emit: function(input) {\n            var self = this;\n            var state = this.state;\n            function emit(event) {\n                self.manager.emit(event, input);\n            }\n            // 'panstart' and 'panmove'\n            if (state < STATE_ENDED) emit(self.options.event + stateStr(state));\n            emit(self.options.event); // simple 'eventName' events\n            if (input.additionalEvent) emit(input.additionalEvent);\n            // panend and pancancel\n            if (state >= STATE_ENDED) emit(self.options.event + stateStr(state));\n        },\n        /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */ tryEmit: function(input) {\n            if (this.canEmit()) return this.emit(input);\n            // it's failing anyway\n            this.state = STATE_FAILED;\n        },\n        /**\n     * can we emit?\n     * @returns {boolean}\n     */ canEmit: function() {\n            var i = 0;\n            while(i < this.requireFail.length){\n                if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) return false;\n                i++;\n            }\n            return true;\n        },\n        /**\n     * update the recognizer\n     * @param {Object} inputData\n     */ recognize: function(inputData) {\n            // make a new copy of the inputData\n            // so we can change the inputData without messing up the other recognizers\n            var inputDataClone = assign({}, inputData);\n            // is is enabled and allow recognizing?\n            if (!boolOrFn(this.options.enable, [\n                this,\n                inputDataClone\n            ])) {\n                this.reset();\n                this.state = STATE_FAILED;\n                return;\n            }\n            // reset when we've reached the end\n            if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) this.state = STATE_POSSIBLE;\n            this.state = this.process(inputDataClone);\n            // the recognizer has recognized a gesture\n            // so trigger an event\n            if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) this.tryEmit(inputDataClone);\n        },\n        /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */ process: function(inputData) {},\n        /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */ getTouchAction: function() {},\n        /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */ reset: function() {}\n    };\n    /**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */ function stateStr(state) {\n        if (state & STATE_CANCELLED) return \"cancel\";\n        else if (state & STATE_ENDED) return \"end\";\n        else if (state & STATE_CHANGED) return \"move\";\n        else if (state & STATE_BEGAN) return \"start\";\n        return \"\";\n    }\n    /**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */ function directionStr(direction) {\n        if (direction == DIRECTION_DOWN) return \"down\";\n        else if (direction == DIRECTION_UP) return \"up\";\n        else if (direction == DIRECTION_LEFT) return \"left\";\n        else if (direction == DIRECTION_RIGHT) return \"right\";\n        return \"\";\n    }\n    /**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */ function getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n        var manager = recognizer.manager;\n        if (manager) return manager.get(otherRecognizer);\n        return otherRecognizer;\n    }\n    /**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */ function AttrRecognizer() {\n        Recognizer.apply(this, arguments);\n    }\n    inherit(AttrRecognizer, Recognizer, {\n        /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */ defaults: {\n            /**\n         * @type {Number}\n         * @default 1\n         */ pointers: 1\n        },\n        /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */ attrTest: function(input) {\n            var optionPointers = this.options.pointers;\n            return optionPointers === 0 || input.pointers.length === optionPointers;\n        },\n        /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */ process: function(input) {\n            var state = this.state;\n            var eventType = input.eventType;\n            var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n            var isValid = this.attrTest(input);\n            // on cancel input and we've recognized before, return STATE_CANCELLED\n            if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) return state | STATE_CANCELLED;\n            else if (isRecognized || isValid) {\n                if (eventType & INPUT_END) return state | STATE_ENDED;\n                else if (!(state & STATE_BEGAN)) return STATE_BEGAN;\n                return state | STATE_CHANGED;\n            }\n            return STATE_FAILED;\n        }\n    });\n    /**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */ function PanRecognizer() {\n        AttrRecognizer.apply(this, arguments);\n        this.pX = null;\n        this.pY = null;\n    }\n    inherit(PanRecognizer, AttrRecognizer, {\n        /**\n     * @namespace\n     * @memberof PanRecognizer\n     */ defaults: {\n            event: \"pan\",\n            threshold: 10,\n            pointers: 1,\n            direction: DIRECTION_ALL\n        },\n        getTouchAction: function() {\n            var direction = this.options.direction;\n            var actions = [];\n            if (direction & DIRECTION_HORIZONTAL) actions.push(TOUCH_ACTION_PAN_Y);\n            if (direction & DIRECTION_VERTICAL) actions.push(TOUCH_ACTION_PAN_X);\n            return actions;\n        },\n        directionTest: function(input) {\n            var options = this.options;\n            var hasMoved = true;\n            var distance = input.distance;\n            var direction = input.direction;\n            var x = input.deltaX;\n            var y = input.deltaY;\n            // lock to axis?\n            if (!(direction & options.direction)) {\n                if (options.direction & DIRECTION_HORIZONTAL) {\n                    direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                    hasMoved = x != this.pX;\n                    distance = Math.abs(input.deltaX);\n                } else {\n                    direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n                    hasMoved = y != this.pY;\n                    distance = Math.abs(input.deltaY);\n                }\n            }\n            input.direction = direction;\n            return hasMoved && distance > options.threshold && direction & options.direction;\n        },\n        attrTest: function(input) {\n            return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));\n        },\n        emit: function(input) {\n            this.pX = input.deltaX;\n            this.pY = input.deltaY;\n            var direction = directionStr(input.direction);\n            if (direction) input.additionalEvent = this.options.event + direction;\n            this._super.emit.call(this, input);\n        }\n    });\n    /**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */ function PinchRecognizer() {\n        AttrRecognizer.apply(this, arguments);\n    }\n    inherit(PinchRecognizer, AttrRecognizer, {\n        /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */ defaults: {\n            event: \"pinch\",\n            threshold: 0,\n            pointers: 2\n        },\n        getTouchAction: function() {\n            return [\n                TOUCH_ACTION_NONE\n            ];\n        },\n        attrTest: function(input) {\n            return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n        },\n        emit: function(input) {\n            if (input.scale !== 1) {\n                var inOut = input.scale < 1 ? \"in\" : \"out\";\n                input.additionalEvent = this.options.event + inOut;\n            }\n            this._super.emit.call(this, input);\n        }\n    });\n    /**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */ function PressRecognizer() {\n        Recognizer.apply(this, arguments);\n        this._timer = null;\n        this._input = null;\n    }\n    inherit(PressRecognizer, Recognizer, {\n        /**\n     * @namespace\n     * @memberof PressRecognizer\n     */ defaults: {\n            event: \"press\",\n            pointers: 1,\n            time: 251,\n            threshold: 9 // a minimal movement is ok, but keep it low\n        },\n        getTouchAction: function() {\n            return [\n                TOUCH_ACTION_AUTO\n            ];\n        },\n        process: function(input) {\n            var options = this.options;\n            var validPointers = input.pointers.length === options.pointers;\n            var validMovement = input.distance < options.threshold;\n            var validTime = input.deltaTime > options.time;\n            this._input = input;\n            // we only allow little movement\n            // and we've reached an end event, so a tap is possible\n            if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) this.reset();\n            else if (input.eventType & INPUT_START) {\n                this.reset();\n                this._timer = setTimeoutContext(function() {\n                    this.state = STATE_RECOGNIZED;\n                    this.tryEmit();\n                }, options.time, this);\n            } else if (input.eventType & INPUT_END) return STATE_RECOGNIZED;\n            return STATE_FAILED;\n        },\n        reset: function() {\n            clearTimeout(this._timer);\n        },\n        emit: function(input) {\n            if (this.state !== STATE_RECOGNIZED) return;\n            if (input && input.eventType & INPUT_END) this.manager.emit(this.options.event + \"up\", input);\n            else {\n                this._input.timeStamp = now();\n                this.manager.emit(this.options.event, this._input);\n            }\n        }\n    });\n    /**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */ function RotateRecognizer() {\n        AttrRecognizer.apply(this, arguments);\n    }\n    inherit(RotateRecognizer, AttrRecognizer, {\n        /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */ defaults: {\n            event: \"rotate\",\n            threshold: 0,\n            pointers: 2\n        },\n        getTouchAction: function() {\n            return [\n                TOUCH_ACTION_NONE\n            ];\n        },\n        attrTest: function(input) {\n            return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n        }\n    });\n    /**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */ function SwipeRecognizer() {\n        AttrRecognizer.apply(this, arguments);\n    }\n    inherit(SwipeRecognizer, AttrRecognizer, {\n        /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */ defaults: {\n            event: \"swipe\",\n            threshold: 10,\n            velocity: 0.3,\n            direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n            pointers: 1\n        },\n        getTouchAction: function() {\n            return PanRecognizer.prototype.getTouchAction.call(this);\n        },\n        attrTest: function(input) {\n            var direction = this.options.direction;\n            var velocity;\n            if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) velocity = input.overallVelocity;\n            else if (direction & DIRECTION_HORIZONTAL) velocity = input.overallVelocityX;\n            else if (direction & DIRECTION_VERTICAL) velocity = input.overallVelocityY;\n            return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n        },\n        emit: function(input) {\n            var direction = directionStr(input.offsetDirection);\n            if (direction) this.manager.emit(this.options.event + direction, input);\n            this.manager.emit(this.options.event, input);\n        }\n    });\n    /**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */ function TapRecognizer() {\n        Recognizer.apply(this, arguments);\n        // previous time and center,\n        // used for tap counting\n        this.pTime = false;\n        this.pCenter = false;\n        this._timer = null;\n        this._input = null;\n        this.count = 0;\n    }\n    inherit(TapRecognizer, Recognizer, {\n        /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */ defaults: {\n            event: \"tap\",\n            pointers: 1,\n            taps: 1,\n            interval: 300,\n            time: 250,\n            threshold: 9,\n            posThreshold: 10 // a multi-tap can be a bit off the initial position\n        },\n        getTouchAction: function() {\n            return [\n                TOUCH_ACTION_MANIPULATION\n            ];\n        },\n        process: function(input) {\n            var options = this.options;\n            var validPointers = input.pointers.length === options.pointers;\n            var validMovement = input.distance < options.threshold;\n            var validTouchTime = input.deltaTime < options.time;\n            this.reset();\n            if (input.eventType & INPUT_START && this.count === 0) return this.failTimeout();\n            // we only allow little movement\n            // and we've reached an end event, so a tap is possible\n            if (validMovement && validTouchTime && validPointers) {\n                if (input.eventType != INPUT_END) return this.failTimeout();\n                var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;\n                var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n                this.pTime = input.timeStamp;\n                this.pCenter = input.center;\n                if (!validMultiTap || !validInterval) this.count = 1;\n                else this.count += 1;\n                this._input = input;\n                // if tap count matches we have recognized it,\n                // else it has began recognizing...\n                var tapCount = this.count % options.taps;\n                if (tapCount === 0) {\n                    // no failing requirements, immediately trigger the tap event\n                    // or wait as long as the multitap interval to trigger\n                    if (!this.hasRequireFailures()) return STATE_RECOGNIZED;\n                    else {\n                        this._timer = setTimeoutContext(function() {\n                            this.state = STATE_RECOGNIZED;\n                            this.tryEmit();\n                        }, options.interval, this);\n                        return STATE_BEGAN;\n                    }\n                }\n            }\n            return STATE_FAILED;\n        },\n        failTimeout: function() {\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_FAILED;\n            }, this.options.interval, this);\n            return STATE_FAILED;\n        },\n        reset: function() {\n            clearTimeout(this._timer);\n        },\n        emit: function() {\n            if (this.state == STATE_RECOGNIZED) {\n                this._input.tapCount = this.count;\n                this.manager.emit(this.options.event, this._input);\n            }\n        }\n    });\n    /**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */ function Hammer(element, options) {\n        options = options || {};\n        options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n        return new Manager(element, options);\n    }\n    /**\n * @const {string}\n */ Hammer.VERSION = \"2.0.7\";\n    /**\n * default settings\n * @namespace\n */ Hammer.defaults = {\n        /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */ domEvents: false,\n        /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */ touchAction: TOUCH_ACTION_COMPUTE,\n        /**\n     * @type {Boolean}\n     * @default true\n     */ enable: true,\n        /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */ inputTarget: null,\n        /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */ inputClass: null,\n        /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */ preset: [\n            // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n            [\n                RotateRecognizer,\n                {\n                    enable: false\n                }\n            ],\n            [\n                PinchRecognizer,\n                {\n                    enable: false\n                },\n                [\n                    \"rotate\"\n                ]\n            ],\n            [\n                SwipeRecognizer,\n                {\n                    direction: DIRECTION_HORIZONTAL\n                }\n            ],\n            [\n                PanRecognizer,\n                {\n                    direction: DIRECTION_HORIZONTAL\n                },\n                [\n                    \"swipe\"\n                ]\n            ],\n            [\n                TapRecognizer\n            ],\n            [\n                TapRecognizer,\n                {\n                    event: \"doubletap\",\n                    taps: 2\n                },\n                [\n                    \"tap\"\n                ]\n            ],\n            [\n                PressRecognizer\n            ]\n        ],\n        /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */ cssProps: {\n            /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */ userSelect: \"none\",\n            /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */ touchSelect: \"none\",\n            /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */ touchCallout: \"none\",\n            /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */ contentZooming: \"none\",\n            /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */ userDrag: \"none\",\n            /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */ tapHighlightColor: \"rgba(0,0,0,0)\"\n        }\n    };\n    var STOP = 1;\n    var FORCED_STOP = 2;\n    /**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */ function Manager(element, options) {\n        this.options = assign({}, Hammer.defaults, options || {});\n        this.options.inputTarget = this.options.inputTarget || element;\n        this.handlers = {};\n        this.session = {};\n        this.recognizers = [];\n        this.oldCssProps = {};\n        this.element = element;\n        this.input = createInputInstance(this);\n        this.touchAction = new TouchAction(this, this.options.touchAction);\n        toggleCssProps(this, true);\n        each(this.options.recognizers, function(item) {\n            var recognizer = this.add(new item[0](item[1]));\n            item[2] && recognizer.recognizeWith(item[2]);\n            item[3] && recognizer.requireFailure(item[3]);\n        }, this);\n    }\n    Manager.prototype = {\n        /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */ set: function(options) {\n            assign(this.options, options);\n            // Options that need a little more setup\n            if (options.touchAction) this.touchAction.update();\n            if (options.inputTarget) {\n                // Clean up existing event listeners and reinitialize\n                this.input.destroy();\n                this.input.target = options.inputTarget;\n                this.input.init();\n            }\n            return this;\n        },\n        /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */ stop: function(force) {\n            this.session.stopped = force ? FORCED_STOP : STOP;\n        },\n        /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */ recognize: function(inputData) {\n            var session = this.session;\n            if (session.stopped) return;\n            // run the touch-action polyfill\n            this.touchAction.preventDefaults(inputData);\n            var recognizer;\n            var recognizers = this.recognizers;\n            // this holds the recognizer that is being recognized.\n            // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n            // if no recognizer is detecting a thing, it is set to `null`\n            var curRecognizer = session.curRecognizer;\n            // reset when the last recognizer is recognized\n            // or when we're in a new session\n            if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) curRecognizer = session.curRecognizer = null;\n            var i = 0;\n            while(i < recognizers.length){\n                recognizer = recognizers[i];\n                // find out if we are allowed try to recognize the input for this one.\n                // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n                // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n                //      that is being recognized.\n                // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n                //      this can be setup with the `recognizeWith()` method on the recognizer.\n                if (session.stopped !== FORCED_STOP && (!curRecognizer || recognizer == curRecognizer || recognizer.canRecognizeWith(curRecognizer))) recognizer.recognize(inputData);\n                else recognizer.reset();\n                // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n                // current active recognizer. but only if we don't already have an active recognizer\n                if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) curRecognizer = session.curRecognizer = recognizer;\n                i++;\n            }\n        },\n        /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */ get: function(recognizer) {\n            if (recognizer instanceof Recognizer) return recognizer;\n            var recognizers = this.recognizers;\n            for(var i = 0; i < recognizers.length; i++){\n                if (recognizers[i].options.event == recognizer) return recognizers[i];\n            }\n            return null;\n        },\n        /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */ add: function(recognizer) {\n            if (invokeArrayArg(recognizer, \"add\", this)) return this;\n            // remove existing\n            var existing = this.get(recognizer.options.event);\n            if (existing) this.remove(existing);\n            this.recognizers.push(recognizer);\n            recognizer.manager = this;\n            this.touchAction.update();\n            return recognizer;\n        },\n        /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */ remove: function(recognizer) {\n            if (invokeArrayArg(recognizer, \"remove\", this)) return this;\n            recognizer = this.get(recognizer);\n            // let's make sure this recognizer exists\n            if (recognizer) {\n                var recognizers = this.recognizers;\n                var index = inArray(recognizers, recognizer);\n                if (index !== -1) {\n                    recognizers.splice(index, 1);\n                    this.touchAction.update();\n                }\n            }\n            return this;\n        },\n        /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */ on: function(events, handler) {\n            if (events === undefined) return;\n            if (handler === undefined) return;\n            var handlers = this.handlers;\n            each(splitStr(events), function(event) {\n                handlers[event] = handlers[event] || [];\n                handlers[event].push(handler);\n            });\n            return this;\n        },\n        /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */ off: function(events, handler) {\n            if (events === undefined) return;\n            var handlers = this.handlers;\n            each(splitStr(events), function(event) {\n                if (!handler) delete handlers[event];\n                else handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n            });\n            return this;\n        },\n        /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */ emit: function(event, data) {\n            // we also want to trigger dom events\n            if (this.options.domEvents) triggerDomEvent(event, data);\n            // no handlers, so skip it all\n            var handlers = this.handlers[event] && this.handlers[event].slice();\n            if (!handlers || !handlers.length) return;\n            data.type = event;\n            data.preventDefault = function() {\n                data.srcEvent.preventDefault();\n            };\n            var i = 0;\n            while(i < handlers.length){\n                handlers[i](data);\n                i++;\n            }\n        },\n        /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */ destroy: function() {\n            this.element && toggleCssProps(this, false);\n            this.handlers = {};\n            this.session = {};\n            this.input.destroy();\n            this.element = null;\n        }\n    };\n    /**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */ function toggleCssProps(manager, add) {\n        var element = manager.element;\n        if (!element.style) return;\n        var prop;\n        each(manager.options.cssProps, function(value, name) {\n            prop = prefixed(element.style, name);\n            if (add) {\n                manager.oldCssProps[prop] = element.style[prop];\n                element.style[prop] = value;\n            } else element.style[prop] = manager.oldCssProps[prop] || \"\";\n        });\n        if (!add) manager.oldCssProps = {};\n    }\n    /**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */ function triggerDomEvent(event, data) {\n        var gestureEvent = document.createEvent(\"Event\");\n        gestureEvent.initEvent(event, true, true);\n        gestureEvent.gesture = data;\n        data.target.dispatchEvent(gestureEvent);\n    }\n    assign(Hammer, {\n        INPUT_START: INPUT_START,\n        INPUT_MOVE: INPUT_MOVE,\n        INPUT_END: INPUT_END,\n        INPUT_CANCEL: INPUT_CANCEL,\n        STATE_POSSIBLE: STATE_POSSIBLE,\n        STATE_BEGAN: STATE_BEGAN,\n        STATE_CHANGED: STATE_CHANGED,\n        STATE_ENDED: STATE_ENDED,\n        STATE_RECOGNIZED: STATE_RECOGNIZED,\n        STATE_CANCELLED: STATE_CANCELLED,\n        STATE_FAILED: STATE_FAILED,\n        DIRECTION_NONE: DIRECTION_NONE,\n        DIRECTION_LEFT: DIRECTION_LEFT,\n        DIRECTION_RIGHT: DIRECTION_RIGHT,\n        DIRECTION_UP: DIRECTION_UP,\n        DIRECTION_DOWN: DIRECTION_DOWN,\n        DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n        DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n        DIRECTION_ALL: DIRECTION_ALL,\n        Manager: Manager,\n        Input: Input,\n        TouchAction: TouchAction,\n        TouchInput: TouchInput,\n        MouseInput: MouseInput,\n        PointerEventInput: PointerEventInput,\n        TouchMouseInput: TouchMouseInput,\n        SingleTouchInput: SingleTouchInput,\n        Recognizer: Recognizer,\n        AttrRecognizer: AttrRecognizer,\n        Tap: TapRecognizer,\n        Pan: PanRecognizer,\n        Swipe: SwipeRecognizer,\n        Pinch: PinchRecognizer,\n        Rotate: RotateRecognizer,\n        Press: PressRecognizer,\n        on: addEventListeners,\n        off: removeEventListeners,\n        each: each,\n        merge: merge1,\n        extend: extend,\n        assign: assign,\n        inherit: inherit,\n        bindFn: bindFn,\n        prefixed: prefixed\n    });\n    // this prevents errors when Hammer is loaded in the presence of an AMD\n    //  style loader but by script tag, not by the loader.\n    var freeGlobal = typeof window !== \"undefined\" ? window : typeof self !== \"undefined\" ? self : {}; // jshint ignore:line\n    freeGlobal.Hammer = Hammer;\n    if (typeof define === \"function\" && define.amd) define(function() {\n        return Hammer;\n    });\n    else if (module.exports) module.exports = Hammer;\n    else window[exportName] = Hammer;\n})(window, document, \"Hammer\");\n\n},{}],\"9FwZC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/* eslint-disable no-invalid-this */ parcelHelpers.export(exports, \"enhancePointerEventInput\", ()=>enhancePointerEventInput);\n// overrides MouseInput.handler to accept right mouse button\nparcelHelpers.export(exports, \"enhanceMouseInput\", ()=>enhanceMouseInput);\n/**\n * This file contains overrides the default\n * hammer.js functions to add our own utility\n */ /* eslint-disable */ /* Hammer.js constants */ const INPUT_START = 1;\nconst INPUT_MOVE = 2;\nconst INPUT_END = 4;\nconst MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n/**\n * Helper function that returns true if any element in an array meets given criteria.\n * Because older browsers do not support `Array.prototype.some`\n * @params array {Array}\n * @params predict {Function}\n */ function some(array, predict) {\n    for(let i = 0; i < array.length; i++){\n        if (predict(array[i])) return true;\n    }\n    return false;\n}\nfunction enhancePointerEventInput(PointerEventInput) {\n    const oldHandler = PointerEventInput.prototype.handler;\n    // overrides PointerEventInput.handler to accept right mouse button\n    PointerEventInput.prototype.handler = function handler(ev) {\n        const store = this.store;\n        // Allow non-left mouse buttons through\n        if (ev.button > 0 && ev.type === \"pointerdown\") {\n            if (!some(store, (e)=>e.pointerId === ev.pointerId)) store.push(ev);\n        }\n        oldHandler.call(this, ev);\n    };\n}\nfunction enhanceMouseInput(MouseInput) {\n    MouseInput.prototype.handler = function handler(ev) {\n        let eventType = MOUSE_INPUT_MAP[ev.type];\n        // on start we want to have the mouse button down\n        if (eventType & INPUT_START && ev.button >= 0) this.pressed = true;\n        if (eventType & INPUT_MOVE && ev.which === 0) eventType = INPUT_END;\n        // mouse must be down\n        if (!this.pressed) return;\n        if (eventType & INPUT_END) this.pressed = false;\n        this.callback(this.manager, eventType, {\n            pointers: [\n                ev\n            ],\n            changedPointers: [\n                ev\n            ],\n            pointerType: \"mouse\",\n            srcEvent: ev\n        });\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"clqFe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _input = require(\"./input\");\nvar _inputDefault = parcelHelpers.interopDefault(_input);\nvar _constants = require(\"../constants\");\nvar _globals = require(\"../utils/globals\");\nconst firefox = (0, _globals.userAgent).indexOf(\"firefox\") !== -1;\nconst { WHEEL_EVENTS  } = (0, _constants.INPUT_EVENT_TYPES);\nconst EVENT_TYPE = \"wheel\";\n// Constants for normalizing input delta\nconst WHEEL_DELTA_MAGIC_SCALER = 4.000244140625;\nconst WHEEL_DELTA_PER_LINE = 40;\n// Slow down zoom if shift key is held for more precise zooming\nconst SHIFT_MULTIPLIER = 0.25;\nclass WheelInput extends (0, _inputDefault.default) {\n    constructor(element, callback, options){\n        super(element, callback, options);\n        /* eslint-disable complexity, max-statements */ this.handleEvent = (event)=>{\n            if (!this.options.enable) return;\n            let value = event.deltaY;\n            if ((0, _globals.window).WheelEvent) {\n                // Firefox doubles the values on retina screens...\n                if (firefox && event.deltaMode === (0, _globals.window).WheelEvent.DOM_DELTA_PIXEL) value /= (0, _globals.window).devicePixelRatio;\n                if (event.deltaMode === (0, _globals.window).WheelEvent.DOM_DELTA_LINE) value *= WHEEL_DELTA_PER_LINE;\n            }\n            if (value !== 0 && value % WHEEL_DELTA_MAGIC_SCALER === 0) // This one is definitely a mouse wheel event.\n            // Normalize this value to match trackpad.\n            value = Math.floor(value / WHEEL_DELTA_MAGIC_SCALER);\n            if (event.shiftKey && value) value = value * SHIFT_MULTIPLIER;\n            this.callback({\n                type: EVENT_TYPE,\n                center: {\n                    x: event.clientX,\n                    y: event.clientY\n                },\n                delta: -value,\n                srcEvent: event,\n                pointerType: \"mouse\",\n                target: event.target\n            });\n        };\n        this.events = (this.options.events || []).concat(WHEEL_EVENTS);\n        this.events.forEach((event)=>element.addEventListener(event, this.handleEvent, (0, _globals.passiveSupported) ? {\n                passive: false\n            } : false));\n    }\n    destroy() {\n        this.events.forEach((event)=>this.element.removeEventListener(event, this.handleEvent));\n    }\n    /**\n     * Enable this input (begin processing events)\n     * if the specified event type is among those handled by this input.\n     */ enableEventType(eventType, enabled) {\n        if (eventType === EVENT_TYPE) this.options.enable = enabled;\n    }\n}\nexports.default = WheelInput;\n\n},{\"./input\":\"hlzRI\",\"../constants\":\"dWT9C\",\"../utils/globals\":\"ghAGa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hlzRI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nclass Input {\n    constructor(element, callback, options){\n        this.element = element;\n        this.callback = callback;\n        this.options = {\n            enable: true,\n            ...options\n        };\n    }\n}\nexports.default = Input;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dWT9C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"RECOGNIZERS\", ()=>RECOGNIZERS);\nparcelHelpers.export(exports, \"RECOGNIZER_COMPATIBLE_MAP\", ()=>RECOGNIZER_COMPATIBLE_MAP);\nparcelHelpers.export(exports, \"RECOGNIZER_FALLBACK_MAP\", ()=>RECOGNIZER_FALLBACK_MAP);\nparcelHelpers.export(exports, \"BASIC_EVENT_ALIASES\", ()=>BASIC_EVENT_ALIASES);\nparcelHelpers.export(exports, \"INPUT_EVENT_TYPES\", ()=>INPUT_EVENT_TYPES);\nparcelHelpers.export(exports, \"EVENT_RECOGNIZER_MAP\", ()=>EVENT_RECOGNIZER_MAP);\nparcelHelpers.export(exports, \"GESTURE_EVENT_ALIASES\", ()=>GESTURE_EVENT_ALIASES);\nvar _hammer = require(\"./utils/hammer\");\nvar _hammerDefault = parcelHelpers.interopDefault(_hammer);\nconst RECOGNIZERS = (0, _hammerDefault.default) ? [\n    [\n        (0, _hammerDefault.default).Pan,\n        {\n            event: \"tripan\",\n            pointers: 3,\n            threshold: 0,\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Rotate,\n        {\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Pinch,\n        {\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Swipe,\n        {\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Pan,\n        {\n            threshold: 0,\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Press,\n        {\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Tap,\n        {\n            event: \"doubletap\",\n            taps: 2,\n            enable: false\n        }\n    ],\n    // TODO - rename to 'tap' and 'singletap' in the next major release\n    [\n        (0, _hammerDefault.default).Tap,\n        {\n            event: \"anytap\",\n            enable: false\n        }\n    ],\n    [\n        (0, _hammerDefault.default).Tap,\n        {\n            enable: false\n        }\n    ]\n] : null;\nconst RECOGNIZER_COMPATIBLE_MAP = {\n    tripan: [\n        \"rotate\",\n        \"pinch\",\n        \"pan\"\n    ],\n    rotate: [\n        \"pinch\"\n    ],\n    pinch: [\n        \"pan\"\n    ],\n    pan: [\n        \"press\",\n        \"doubletap\",\n        \"anytap\",\n        \"tap\"\n    ],\n    doubletap: [\n        \"anytap\"\n    ],\n    anytap: [\n        \"tap\"\n    ]\n};\nconst RECOGNIZER_FALLBACK_MAP = {\n    doubletap: [\n        \"tap\"\n    ]\n};\nconst BASIC_EVENT_ALIASES = {\n    pointerdown: \"pointerdown\",\n    pointermove: \"pointermove\",\n    pointerup: \"pointerup\",\n    touchstart: \"pointerdown\",\n    touchmove: \"pointermove\",\n    touchend: \"pointerup\",\n    mousedown: \"pointerdown\",\n    mousemove: \"pointermove\",\n    mouseup: \"pointerup\"\n};\nconst INPUT_EVENT_TYPES = {\n    KEY_EVENTS: [\n        \"keydown\",\n        \"keyup\"\n    ],\n    MOUSE_EVENTS: [\n        \"mousedown\",\n        \"mousemove\",\n        \"mouseup\",\n        \"mouseover\",\n        \"mouseout\",\n        \"mouseleave\"\n    ],\n    WHEEL_EVENTS: [\n        // Chrome, Safari\n        \"wheel\",\n        // IE\n        \"mousewheel\"\n    ]\n};\nconst EVENT_RECOGNIZER_MAP = {\n    tap: \"tap\",\n    anytap: \"anytap\",\n    doubletap: \"doubletap\",\n    press: \"press\",\n    pinch: \"pinch\",\n    pinchin: \"pinch\",\n    pinchout: \"pinch\",\n    pinchstart: \"pinch\",\n    pinchmove: \"pinch\",\n    pinchend: \"pinch\",\n    pinchcancel: \"pinch\",\n    rotate: \"rotate\",\n    rotatestart: \"rotate\",\n    rotatemove: \"rotate\",\n    rotateend: \"rotate\",\n    rotatecancel: \"rotate\",\n    tripan: \"tripan\",\n    tripanstart: \"tripan\",\n    tripanmove: \"tripan\",\n    tripanup: \"tripan\",\n    tripandown: \"tripan\",\n    tripanleft: \"tripan\",\n    tripanright: \"tripan\",\n    tripanend: \"tripan\",\n    tripancancel: \"tripan\",\n    pan: \"pan\",\n    panstart: \"pan\",\n    panmove: \"pan\",\n    panup: \"pan\",\n    pandown: \"pan\",\n    panleft: \"pan\",\n    panright: \"pan\",\n    panend: \"pan\",\n    pancancel: \"pan\",\n    swipe: \"swipe\",\n    swipeleft: \"swipe\",\n    swiperight: \"swipe\",\n    swipeup: \"swipe\",\n    swipedown: \"swipe\"\n};\nconst GESTURE_EVENT_ALIASES = {\n    click: \"tap\",\n    anyclick: \"anytap\",\n    dblclick: \"doubletap\",\n    mousedown: \"pointerdown\",\n    mousemove: \"pointermove\",\n    mouseup: \"pointerup\",\n    mouseover: \"pointerover\",\n    mouseout: \"pointerout\",\n    mouseleave: \"pointerleave\"\n};\n\n},{\"./utils/hammer\":\"jEgwB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ghAGa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"userAgent\", ()=>userAgent);\nparcelHelpers.export(exports, \"window\", ()=>window_);\nparcelHelpers.export(exports, \"global\", ()=>global_);\nparcelHelpers.export(exports, \"document\", ()=>document_);\nparcelHelpers.export(exports, \"passiveSupported\", ()=>passiveSupported);\nvar global = arguments[3];\nconst userAgent = typeof navigator !== \"undefined\" && navigator.userAgent ? navigator.userAgent.toLowerCase() : \"\";\nconst window_ = typeof window !== \"undefined\" ? window : global;\nconst global_ = typeof global !== \"undefined\" ? global : window;\nconst document_ = typeof document !== \"undefined\" ? document : {};\n/*\n * Detect whether passive option is supported by the current browser.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n   #Safely_detecting_option_support\n */ let passiveSupported = false;\n/* eslint-disable accessor-pairs, no-empty */ try {\n    const options = {\n        // This function will be called when the browser\n        // attempts to access the passive property.\n        get passive () {\n            passiveSupported = true;\n            return true;\n        }\n    };\n    window_.addEventListener(\"test\", null, options);\n    window_.removeEventListener(\"test\", null);\n} catch (err) {\n    passiveSupported = false;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jnJ08\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _input = require(\"./input\");\nvar _inputDefault = parcelHelpers.interopDefault(_input);\nvar _constants = require(\"../constants\");\nconst { MOUSE_EVENTS  } = (0, _constants.INPUT_EVENT_TYPES);\nconst MOVE_EVENT_TYPE = \"pointermove\";\nconst OVER_EVENT_TYPE = \"pointerover\";\nconst OUT_EVENT_TYPE = \"pointerout\";\nconst ENTER_EVENT_TYPE = \"pointerenter\";\nconst LEAVE_EVENT_TYPE = \"pointerleave\";\nclass MoveInput extends (0, _inputDefault.default) {\n    constructor(element, callback, options){\n        super(element, callback, options);\n        this.handleEvent = (event)=>{\n            this.handleOverEvent(event);\n            this.handleOutEvent(event);\n            this.handleEnterEvent(event);\n            this.handleLeaveEvent(event);\n            this.handleMoveEvent(event);\n        };\n        this.pressed = false;\n        const { enable  } = this.options;\n        this.enableMoveEvent = enable;\n        this.enableLeaveEvent = enable;\n        this.enableEnterEvent = enable;\n        this.enableOutEvent = enable;\n        this.enableOverEvent = enable;\n        this.events = (this.options.events || []).concat(MOUSE_EVENTS);\n        this.events.forEach((event)=>element.addEventListener(event, this.handleEvent));\n    }\n    destroy() {\n        this.events.forEach((event)=>this.element.removeEventListener(event, this.handleEvent));\n    }\n    /**\n     * Enable this input (begin processing events)\n     * if the specified event type is among those handled by this input.\n     */ enableEventType(eventType, enabled) {\n        if (eventType === MOVE_EVENT_TYPE) this.enableMoveEvent = enabled;\n        if (eventType === OVER_EVENT_TYPE) this.enableOverEvent = enabled;\n        if (eventType === OUT_EVENT_TYPE) this.enableOutEvent = enabled;\n        if (eventType === ENTER_EVENT_TYPE) this.enableEnterEvent = enabled;\n        if (eventType === LEAVE_EVENT_TYPE) this.enableLeaveEvent = enabled;\n    }\n    handleOverEvent(event) {\n        if (this.enableOverEvent) {\n            if (event.type === \"mouseover\") this._emit(OVER_EVENT_TYPE, event);\n        }\n    }\n    handleOutEvent(event) {\n        if (this.enableOutEvent) {\n            if (event.type === \"mouseout\") this._emit(OUT_EVENT_TYPE, event);\n        }\n    }\n    handleEnterEvent(event) {\n        if (this.enableEnterEvent) {\n            if (event.type === \"mouseenter\") this._emit(ENTER_EVENT_TYPE, event);\n        }\n    }\n    handleLeaveEvent(event) {\n        if (this.enableLeaveEvent) {\n            if (event.type === \"mouseleave\") this._emit(LEAVE_EVENT_TYPE, event);\n        }\n    }\n    handleMoveEvent(event) {\n        if (this.enableMoveEvent) switch(event.type){\n            case \"mousedown\":\n                if (event.button >= 0) // Button is down\n                this.pressed = true;\n                break;\n            case \"mousemove\":\n                // Move events use `which` to track the button being pressed\n                if (event.which === 0) // Button is not down\n                this.pressed = false;\n                if (!this.pressed) // Drag events are emitted by hammer already\n                // we just need to emit the move event on hover\n                this._emit(MOVE_EVENT_TYPE, event);\n                break;\n            case \"mouseup\":\n                this.pressed = false;\n                break;\n            default:\n        }\n    }\n    _emit(type, event) {\n        this.callback({\n            type,\n            center: {\n                x: event.clientX,\n                y: event.clientY\n            },\n            srcEvent: event,\n            pointerType: \"mouse\",\n            target: event.target\n        });\n    }\n}\nexports.default = MoveInput;\n\n},{\"./input\":\"hlzRI\",\"../constants\":\"dWT9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7jf7y\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _input = require(\"./input\");\nvar _inputDefault = parcelHelpers.interopDefault(_input);\nvar _constants = require(\"../constants\");\nconst { KEY_EVENTS  } = (0, _constants.INPUT_EVENT_TYPES);\nconst DOWN_EVENT_TYPE = \"keydown\";\nconst UP_EVENT_TYPE = \"keyup\";\nclass KeyInput extends (0, _inputDefault.default) {\n    constructor(element, callback, options){\n        super(element, callback, options);\n        this.handleEvent = (event)=>{\n            // Ignore if focused on text input\n            const targetElement = event.target || event.srcElement;\n            if (targetElement.tagName === \"INPUT\" && targetElement.type === \"text\" || targetElement.tagName === \"TEXTAREA\") return;\n            if (this.enableDownEvent && event.type === \"keydown\") this.callback({\n                type: DOWN_EVENT_TYPE,\n                srcEvent: event,\n                key: event.key,\n                target: event.target\n            });\n            if (this.enableUpEvent && event.type === \"keyup\") this.callback({\n                type: UP_EVENT_TYPE,\n                srcEvent: event,\n                key: event.key,\n                target: event.target\n            });\n        };\n        this.enableDownEvent = this.options.enable;\n        this.enableUpEvent = this.options.enable;\n        this.events = (this.options.events || []).concat(KEY_EVENTS);\n        element.tabIndex = this.options.tabIndex || 0;\n        element.style.outline = \"none\";\n        this.events.forEach((event)=>element.addEventListener(event, this.handleEvent));\n    }\n    destroy() {\n        this.events.forEach((event)=>this.element.removeEventListener(event, this.handleEvent));\n    }\n    /**\n     * Enable this input (begin processing events)\n     * if the specified event type is among those handled by this input.\n     */ enableEventType(eventType, enabled) {\n        if (eventType === DOWN_EVENT_TYPE) this.enableDownEvent = enabled;\n        if (eventType === UP_EVENT_TYPE) this.enableUpEvent = enabled;\n    }\n}\nexports.default = KeyInput;\n\n},{\"./input\":\"hlzRI\",\"../constants\":\"dWT9C\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"GuhV3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _input = require(\"./input\");\nvar _inputDefault = parcelHelpers.interopDefault(_input);\nconst EVENT_TYPE = \"contextmenu\";\nclass ContextmenuInput extends (0, _inputDefault.default) {\n    constructor(element, callback, options){\n        super(element, callback, options);\n        this.handleEvent = (event)=>{\n            if (!this.options.enable) return;\n            this.callback({\n                type: EVENT_TYPE,\n                center: {\n                    x: event.clientX,\n                    y: event.clientY\n                },\n                srcEvent: event,\n                pointerType: \"mouse\",\n                target: event.target\n            });\n        };\n        element.addEventListener(\"contextmenu\", this.handleEvent);\n    }\n    destroy() {\n        this.element.removeEventListener(\"contextmenu\", this.handleEvent);\n    }\n    /**\n     * Enable this input (begin processing events)\n     * if the specified event type is among those handled by this input.\n     */ enableEventType(eventType, enabled) {\n        if (eventType === EVENT_TYPE) this.options.enable = enabled;\n    }\n}\nexports.default = ContextmenuInput;\n\n},{\"./input\":\"hlzRI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9gXr1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _eventUtils = require(\"./event-utils\");\nconst DEFAULT_OPTIONS = {\n    srcElement: \"root\",\n    priority: 0\n};\nclass EventRegistrar {\n    constructor(eventManager){\n        /**\n         * Handles hammerjs event\n         */ this.handleEvent = (event)=>{\n            if (this.isEmpty()) return;\n            const mjolnirEvent = this._normalizeEvent(event);\n            let target = event.srcEvent.target;\n            while(target && target !== mjolnirEvent.rootElement){\n                this._emit(mjolnirEvent, target);\n                if (mjolnirEvent.handled) return;\n                target = target.parentNode;\n            }\n            this._emit(mjolnirEvent, \"root\");\n        };\n        this.eventManager = eventManager;\n        this.handlers = [];\n        // Element -> handler map\n        this.handlersByElement = new Map();\n        this._active = false;\n    }\n    // Returns true if there are no non-passive handlers\n    isEmpty() {\n        return !this._active;\n    }\n    add(type, handler, options, once = false, passive = false) {\n        const { handlers , handlersByElement  } = this;\n        let opts = DEFAULT_OPTIONS;\n        if (typeof options === \"string\" || options && options.addEventListener) // is DOM element, backward compatibility\n        // @ts-ignore\n        opts = {\n            ...DEFAULT_OPTIONS,\n            srcElement: options\n        };\n        else if (options) opts = {\n            ...DEFAULT_OPTIONS,\n            ...options\n        };\n        let entries = handlersByElement.get(opts.srcElement);\n        if (!entries) {\n            entries = [];\n            handlersByElement.set(opts.srcElement, entries);\n        }\n        const entry = {\n            type,\n            handler,\n            srcElement: opts.srcElement,\n            priority: opts.priority\n        };\n        if (once) entry.once = true;\n        if (passive) entry.passive = true;\n        handlers.push(entry);\n        this._active = this._active || !entry.passive;\n        // Sort handlers by descending priority\n        // Handlers with the same priority are excuted in the order of registration\n        let insertPosition = entries.length - 1;\n        while(insertPosition >= 0){\n            if (entries[insertPosition].priority >= entry.priority) break;\n            insertPosition--;\n        }\n        entries.splice(insertPosition + 1, 0, entry);\n    }\n    remove(type, handler) {\n        const { handlers , handlersByElement  } = this;\n        for(let i = handlers.length - 1; i >= 0; i--){\n            const entry = handlers[i];\n            if (entry.type === type && entry.handler === handler) {\n                handlers.splice(i, 1);\n                const entries = handlersByElement.get(entry.srcElement);\n                entries.splice(entries.indexOf(entry), 1);\n                if (entries.length === 0) handlersByElement.delete(entry.srcElement);\n            }\n        }\n        this._active = handlers.some((entry)=>!entry.passive);\n    }\n    /**\n     * Invoke handlers on a particular element\n     */ _emit(event, srcElement) {\n        const entries = this.handlersByElement.get(srcElement);\n        if (entries) {\n            let immediatePropagationStopped = false;\n            // Prevents the current event from bubbling up\n            const stopPropagation = ()=>{\n                event.handled = true;\n            };\n            // Prevent any remaining listeners from being called\n            const stopImmediatePropagation = ()=>{\n                event.handled = true;\n                immediatePropagationStopped = true;\n            };\n            const entriesToRemove = [];\n            for(let i = 0; i < entries.length; i++){\n                const { type , handler , once  } = entries[i];\n                handler({\n                    ...event,\n                    // @ts-ignore\n                    type,\n                    stopPropagation,\n                    stopImmediatePropagation\n                });\n                if (once) entriesToRemove.push(entries[i]);\n                if (immediatePropagationStopped) break;\n            }\n            for(let i1 = 0; i1 < entriesToRemove.length; i1++){\n                const { type , handler  } = entriesToRemove[i1];\n                this.remove(type, handler);\n            }\n        }\n    }\n    /**\n     * Normalizes hammerjs and custom events to have predictable fields.\n     */ _normalizeEvent(event) {\n        const rootElement = this.eventManager.getElement();\n        return {\n            ...event,\n            ...(0, _eventUtils.whichButtons)(event),\n            ...(0, _eventUtils.getOffsetPosition)(event, rootElement),\n            preventDefault: ()=>{\n                event.srcEvent.preventDefault();\n            },\n            stopImmediatePropagation: null,\n            stopPropagation: null,\n            handled: false,\n            rootElement\n        };\n    }\n}\nexports.default = EventRegistrar;\n\n},{\"./event-utils\":\"jPGIw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jPGIw\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Extract the involved mouse button\n */ parcelHelpers.export(exports, \"whichButtons\", ()=>whichButtons);\n/**\n * Calculate event position relative to the root element\n */ parcelHelpers.export(exports, \"getOffsetPosition\", ()=>getOffsetPosition);\n/* Constants */ const DOWN_EVENT = 1;\nconst MOVE_EVENT = 2;\nconst UP_EVENT = 4;\nconst MOUSE_EVENTS = {\n    pointerdown: DOWN_EVENT,\n    pointermove: MOVE_EVENT,\n    pointerup: UP_EVENT,\n    mousedown: DOWN_EVENT,\n    mousemove: MOVE_EVENT,\n    mouseup: UP_EVENT\n};\n// MouseEvent.which https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which\nconst MOUSE_EVENT_WHICH_LEFT = 1;\nconst MOUSE_EVENT_WHICH_MIDDLE = 2;\nconst MOUSE_EVENT_WHICH_RIGHT = 3;\n// MouseEvent.button https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\nconst MOUSE_EVENT_BUTTON_LEFT = 0;\nconst MOUSE_EVENT_BUTTON_MIDDLE = 1;\nconst MOUSE_EVENT_BUTTON_RIGHT = 2;\n// MouseEvent.buttons https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\nconst MOUSE_EVENT_BUTTONS_LEFT_MASK = 1;\nconst MOUSE_EVENT_BUTTONS_RIGHT_MASK = 2;\nconst MOUSE_EVENT_BUTTONS_MIDDLE_MASK = 4;\nfunction whichButtons(event) {\n    const eventType = MOUSE_EVENTS[event.srcEvent.type];\n    if (!eventType) // Not a mouse evet\n    return null;\n    const { buttons , button , which  } = event.srcEvent;\n    let leftButton = false;\n    let middleButton = false;\n    let rightButton = false;\n    if (// button is up, need to find out which one was pressed before\n    eventType === UP_EVENT || eventType === MOVE_EVENT && !Number.isFinite(buttons)) {\n        leftButton = which === MOUSE_EVENT_WHICH_LEFT;\n        middleButton = which === MOUSE_EVENT_WHICH_MIDDLE;\n        rightButton = which === MOUSE_EVENT_WHICH_RIGHT;\n    } else if (eventType === MOVE_EVENT) {\n        leftButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_LEFT_MASK);\n        middleButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_MIDDLE_MASK);\n        rightButton = Boolean(buttons & MOUSE_EVENT_BUTTONS_RIGHT_MASK);\n    } else if (eventType === DOWN_EVENT) {\n        leftButton = button === MOUSE_EVENT_BUTTON_LEFT;\n        middleButton = button === MOUSE_EVENT_BUTTON_MIDDLE;\n        rightButton = button === MOUSE_EVENT_BUTTON_RIGHT;\n    }\n    return {\n        leftButton,\n        middleButton,\n        rightButton\n    };\n}\nfunction getOffsetPosition(event, rootElement) {\n    const center = event.center;\n    // `center` is a hammer.js event property\n    if (!center) // Not a gestural event\n    return null;\n    const rect = rootElement.getBoundingClientRect();\n    // Fix scale for map affected by a CSS transform.\n    // See https://stackoverflow.com/a/26893663/3528533\n    const scaleX = rect.width / rootElement.offsetWidth || 1;\n    const scaleY = rect.height / rootElement.offsetHeight || 1;\n    // Calculate center relative to the root element\n    const offsetCenter = {\n        x: (center.x - rect.left - rootElement.clientLeft) / scaleX,\n        y: (center.y - rect.top - rootElement.clientTop) / scaleY\n    };\n    return {\n        center,\n        offsetCenter\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9c4Ap\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CompositeLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _layer = require(\"./layer\");\nvar _layerDefault = parcelHelpers.interopDefault(_layer);\nvar _debug = require(\"../debug\");\nvar _debugDefault = parcelHelpers.interopDefault(_debug);\nvar _flatten = require(\"../utils/flatten\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar TRACE_RENDER_LAYERS = \"compositeLayer.renderLayers\";\nvar CompositeLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(CompositeLayer1, _Layer);\n    var _super = _createSuper(CompositeLayer1);\n    function CompositeLayer1() {\n        (0, _classCallCheckDefault.default)(this, CompositeLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(CompositeLayer1, [\n        {\n            key: \"getSubLayers\",\n            value: function getSubLayers() {\n                return this.internalState && this.internalState.subLayers || [];\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {}\n        },\n        {\n            key: \"setState\",\n            value: function setState(updateObject) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(CompositeLayer1.prototype), \"setState\", this).call(this, updateObject);\n                this.setNeedsUpdate();\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(_ref) {\n                var info = _ref.info;\n                var object = info.object;\n                var isDataWrapped = object && object.__source && object.__source.parent && object.__source.parent.id === this.id;\n                if (!isDataWrapped) return info;\n                return Object.assign(info, {\n                    object: object.__source.object,\n                    index: object.__source.index\n                });\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers() {\n                return null;\n            }\n        },\n        {\n            key: \"shouldRenderSubLayer\",\n            value: function shouldRenderSubLayer(id, data) {\n                var overridingProps = this.props._subLayerProps;\n                return data && data.length || overridingProps && overridingProps[id];\n            }\n        },\n        {\n            key: \"getSubLayerClass\",\n            value: function getSubLayerClass(id, DefaultLayerClass) {\n                var overridingProps = this.props._subLayerProps;\n                return overridingProps && overridingProps[id] && overridingProps[id].type || DefaultLayerClass;\n            }\n        },\n        {\n            key: \"getSubLayerRow\",\n            value: function getSubLayerRow(row, sourceObject, sourceObjectIndex) {\n                row.__source = {\n                    parent: this,\n                    object: sourceObject,\n                    index: sourceObjectIndex\n                };\n                return row;\n            }\n        },\n        {\n            key: \"getSubLayerAccessor\",\n            value: function getSubLayerAccessor(accessor) {\n                if (typeof accessor === \"function\") {\n                    var objectInfo = {\n                        data: this.props.data,\n                        target: []\n                    };\n                    return function(x, i) {\n                        if (x.__source) {\n                            objectInfo.index = x.__source.index;\n                            return accessor(x.__source.object, objectInfo);\n                        }\n                        return accessor(x, i);\n                    };\n                }\n                return accessor;\n            }\n        },\n        {\n            key: \"getSubLayerProps\",\n            value: function getSubLayerProps() {\n                var sublayerProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _this$props = this.props, opacity = _this$props.opacity, pickable = _this$props.pickable, visible = _this$props.visible, parameters = _this$props.parameters, getPolygonOffset = _this$props.getPolygonOffset, highlightedObjectIndex = _this$props.highlightedObjectIndex, autoHighlight = _this$props.autoHighlight, highlightColor = _this$props.highlightColor, coordinateSystem = _this$props.coordinateSystem, coordinateOrigin = _this$props.coordinateOrigin, wrapLongitude = _this$props.wrapLongitude, positionFormat = _this$props.positionFormat, modelMatrix = _this$props.modelMatrix, extensions = _this$props.extensions, overridingProps = _this$props._subLayerProps;\n                var newProps = {\n                    opacity: opacity,\n                    pickable: pickable,\n                    visible: visible,\n                    parameters: parameters,\n                    getPolygonOffset: getPolygonOffset,\n                    highlightedObjectIndex: highlightedObjectIndex,\n                    autoHighlight: autoHighlight,\n                    highlightColor: highlightColor,\n                    coordinateSystem: coordinateSystem,\n                    coordinateOrigin: coordinateOrigin,\n                    wrapLongitude: wrapLongitude,\n                    positionFormat: positionFormat,\n                    modelMatrix: modelMatrix,\n                    extensions: extensions\n                };\n                var overridingSublayerProps = overridingProps && overridingProps[sublayerProps.id];\n                var overridingSublayerTriggers = overridingSublayerProps && overridingSublayerProps.updateTriggers;\n                var sublayerId = sublayerProps.id || \"sublayer\";\n                if (overridingSublayerProps) {\n                    var propTypes = this.constructor._propTypes;\n                    for(var key in overridingSublayerProps){\n                        var propType = propTypes[key];\n                        if (propType && propType.type === \"accessor\") overridingSublayerProps[key] = this.getSubLayerAccessor(overridingSublayerProps[key]);\n                    }\n                }\n                Object.assign(newProps, sublayerProps, overridingSublayerProps, {\n                    id: \"\".concat(this.props.id, \"-\").concat(sublayerId),\n                    updateTriggers: Object.assign({\n                        all: this.props.updateTriggers.all\n                    }, sublayerProps.updateTriggers, overridingSublayerTriggers)\n                });\n                var _iterator = _createForOfIteratorHelper(extensions), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var extension = _step.value;\n                        var passThroughProps = extension.getSubLayerProps.call(this, extension);\n                        if (passThroughProps) Object.assign(newProps, passThroughProps, {\n                            updateTriggers: Object.assign(newProps.updateTriggers, passThroughProps.updateTriggers)\n                        });\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return newProps;\n            }\n        },\n        {\n            key: \"_getAttributeManager\",\n            value: function _getAttributeManager() {\n                return null;\n            }\n        },\n        {\n            key: \"_renderLayers\",\n            value: function _renderLayers() {\n                var subLayers = this.internalState.subLayers;\n                var shouldUpdate = !subLayers || this.needsUpdate();\n                if (shouldUpdate) {\n                    subLayers = this.renderLayers();\n                    subLayers = (0, _flatten.flatten)(subLayers, Boolean);\n                    this.internalState.subLayers = subLayers;\n                }\n                (0, _debugDefault.default)(TRACE_RENDER_LAYERS, this, shouldUpdate, subLayers);\n                var _iterator2 = _createForOfIteratorHelper(subLayers), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var layer = _step2.value;\n                        layer.parent = this;\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n            }\n        },\n        {\n            key: \"isComposite\",\n            get: function get() {\n                return true;\n            }\n        },\n        {\n            key: \"isLoaded\",\n            get: function get() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(CompositeLayer1.prototype), \"isLoaded\", this) && this.getSubLayers().every(function(layer) {\n                    return layer.isLoaded;\n                });\n            }\n        }\n    ]);\n    return CompositeLayer1;\n}((0, _layerDefault.default));\nCompositeLayer.layerName = \"CompositeLayer\";\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./layer\":\"jJOdt\",\"../debug\":\"8AxDM\",\"../utils/flatten\":\"1zGCw\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jly9m\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LayerExtension);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _deepEqual = require(\"../utils/deep-equal\");\nvar LayerExtension = function() {\n    function LayerExtension1() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, LayerExtension1);\n        this.opts = opts;\n    }\n    (0, _createClassDefault.default)(LayerExtension1, [\n        {\n            key: \"equals\",\n            value: function equals(extension) {\n                if (this === extension) return true;\n                return this.constructor === extension.constructor && (0, _deepEqual.deepEqual)(this.opts, extension.opts);\n            }\n        },\n        {\n            key: \"getShaders\",\n            value: function getShaders(extension) {\n                return null;\n            }\n        },\n        {\n            key: \"getSubLayerProps\",\n            value: function getSubLayerProps(extension) {\n                var _extension$constructo = extension.constructor.defaultProps, defaultProps = _extension$constructo === void 0 ? {} : _extension$constructo;\n                var newProps = {\n                    updateTriggers: {}\n                };\n                for(var key in defaultProps)if (key in this.props) {\n                    var propDef = defaultProps[key];\n                    var propValue = this.props[key];\n                    newProps[key] = propValue;\n                    if (propDef && propDef.type === \"accessor\") {\n                        newProps.updateTriggers[key] = this.props.updateTriggers[key];\n                        if (typeof propValue === \"function\") newProps[key] = this.getSubLayerAccessor(propValue, true);\n                    }\n                }\n                return newProps;\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState(context, extension) {}\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(params, extension) {}\n        },\n        {\n            key: \"draw\",\n            value: function draw(params, extension) {}\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState(extension) {}\n        }\n    ]);\n    return LayerExtension1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"../utils/deep-equal\":\"kF0nW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2DoRn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>CameraLight);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _pointLight = require(\"./point-light\");\nvar _viewportUniforms = require(\"../../shaderlib/project/viewport-uniforms\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar CameraLight = function(_PointLight) {\n    (0, _inheritsDefault.default)(CameraLight1, _PointLight);\n    var _super = _createSuper(CameraLight1);\n    function CameraLight1() {\n        (0, _classCallCheckDefault.default)(this, CameraLight1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(CameraLight1, [\n        {\n            key: \"getProjectedLight\",\n            value: function getProjectedLight(_ref) {\n                var layer = _ref.layer;\n                var projectedLight = this.projectedLight;\n                var viewport = layer.context.viewport;\n                var _layer$props = layer.props, coordinateSystem = _layer$props.coordinateSystem, coordinateOrigin = _layer$props.coordinateOrigin, modelMatrix = _layer$props.modelMatrix;\n                var _getUniformsFromViewp = (0, _viewportUniforms.getUniformsFromViewport)({\n                    viewport: viewport,\n                    modelMatrix: modelMatrix,\n                    coordinateSystem: coordinateSystem,\n                    coordinateOrigin: coordinateOrigin\n                }), project_uCameraPosition = _getUniformsFromViewp.project_uCameraPosition;\n                projectedLight.color = this.color;\n                projectedLight.intensity = this.intensity;\n                projectedLight.position = project_uCameraPosition;\n                return projectedLight;\n            }\n        }\n    ]);\n    return CameraLight1;\n}((0, _pointLight.PointLight));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./point-light\":\"fm0J3\",\"../../shaderlib/project/viewport-uniforms\":\"gQm6z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"knWP0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>SunLight);\nvar _objectWithoutProperties = require(\"@babel/runtime/helpers/esm/objectWithoutProperties\");\nvar _objectWithoutPropertiesDefault = parcelHelpers.interopDefault(_objectWithoutProperties);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _directionalLight = require(\"./directional-light\");\nvar _suncalc = require(\"./suncalc\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar SunLight = function(_DirectionalLight) {\n    (0, _inheritsDefault.default)(SunLight1, _DirectionalLight);\n    var _super = _createSuper(SunLight1);\n    function SunLight1(_ref) {\n        var _this;\n        var timestamp = _ref.timestamp, others = (0, _objectWithoutPropertiesDefault.default)(_ref, [\n            \"timestamp\"\n        ]);\n        (0, _classCallCheckDefault.default)(this, SunLight1);\n        _this = _super.call(this, others);\n        _this.timestamp = timestamp;\n        return _this;\n    }\n    (0, _createClassDefault.default)(SunLight1, [\n        {\n            key: \"getProjectedLight\",\n            value: function getProjectedLight(_ref2) {\n                var layer = _ref2.layer;\n                var _layer$context$viewpo = layer.context.viewport, latitude = _layer$context$viewpo.latitude, longitude = _layer$context$viewpo.longitude;\n                this.direction = (0, _suncalc.getSunlightDirection)(this.timestamp, latitude, longitude);\n                return this;\n            }\n        }\n    ]);\n    return SunLight1;\n}((0, _directionalLight.DirectionalLight));\n\n},{\"@babel/runtime/helpers/esm/objectWithoutProperties\":\"3hugH\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./directional-light\":\"fSFHG\",\"./suncalc\":\"1ZWCI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3hugH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _objectWithoutPropertiesLooseJs = require(\"./objectWithoutPropertiesLoose.js\");\nvar _objectWithoutPropertiesLooseJsDefault = parcelHelpers.interopDefault(_objectWithoutPropertiesLooseJs);\nfunction _objectWithoutProperties(source, excluded) {\n    if (source == null) return {};\n    var target = (0, _objectWithoutPropertiesLooseJsDefault.default)(source, excluded);\n    var key, i;\n    if (Object.getOwnPropertySymbols) {\n        var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n        for(i = 0; i < sourceSymbolKeys.length; i++){\n            key = sourceSymbolKeys[i];\n            if (excluded.indexOf(key) >= 0) continue;\n            if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n            target[key] = source[key];\n        }\n    }\n    return target;\n}\nexports.default = _objectWithoutProperties;\n\n},{\"./objectWithoutPropertiesLoose.js\":\"9WCu8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9WCu8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n    if (source == null) return {};\n    var target = {};\n    var sourceKeys = Object.keys(source);\n    var key, i;\n    for(i = 0; i < sourceKeys.length; i++){\n        key = sourceKeys[i];\n        if (excluded.indexOf(key) >= 0) continue;\n        target[key] = source[key];\n    }\n    return target;\n}\nexports.default = _objectWithoutPropertiesLoose;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1ZWCI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSolarPosition\", ()=>getSolarPosition);\nparcelHelpers.export(exports, \"getSunlightDirection\", ()=>getSunlightDirection);\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nvar DAY_IN_MS = 86400000;\nvar JD1970 = 2440588;\nvar JD2000 = 2451545;\nvar e = DEGREES_TO_RADIANS * 23.4397;\nvar M0 = 357.5291;\nvar M1 = 0.98560028;\nvar THETA0 = 280.147;\nvar THETA1 = 360.9856235;\nfunction getSolarPosition(timestamp, latitude, longitude) {\n    var longitudeWestInRadians = DEGREES_TO_RADIANS * -longitude;\n    var phi = DEGREES_TO_RADIANS * latitude;\n    var d = toDays(timestamp);\n    var c = getSunCoords(d);\n    var H = getSiderealTime(d, longitudeWestInRadians) - c.rightAscension;\n    return {\n        azimuth: getAzimuth(H, phi, c.declination),\n        altitude: getAltitude(H, phi, c.declination)\n    };\n}\nfunction getSunlightDirection(timestamp, latitude, longitude) {\n    var _getSolarPosition = getSolarPosition(timestamp, latitude, longitude), azimuth = _getSolarPosition.azimuth, altitude = _getSolarPosition.altitude;\n    var azimuthN = azimuth + Math.PI;\n    return [\n        -Math.sin(azimuthN),\n        -Math.cos(azimuthN),\n        -Math.sin(altitude)\n    ];\n}\nfunction toJulianDay(timestamp) {\n    return timestamp / DAY_IN_MS - 0.5 + JD1970;\n}\nfunction toDays(timestamp) {\n    return toJulianDay(timestamp) - JD2000;\n}\nfunction getRightAscension(eclipticLongitude, b) {\n    var lambda = eclipticLongitude;\n    return Math.atan2(Math.sin(lambda) * Math.cos(e) - Math.tan(b) * Math.sin(e), Math.cos(lambda));\n}\nfunction getDeclination(eclipticLongitude, b) {\n    var lambda = eclipticLongitude;\n    return Math.asin(Math.sin(b) * Math.cos(e) + Math.cos(b) * Math.sin(e) * Math.sin(lambda));\n}\nfunction getAzimuth(hourAngle, latitudeInRadians, declination) {\n    var H = hourAngle;\n    var phi = latitudeInRadians;\n    var delta = declination;\n    return Math.atan2(Math.sin(H), Math.cos(H) * Math.sin(phi) - Math.tan(delta) * Math.cos(phi));\n}\nfunction getAltitude(hourAngle, latitudeInRadians, declination) {\n    var H = hourAngle;\n    var phi = latitudeInRadians;\n    var delta = declination;\n    return Math.asin(Math.sin(phi) * Math.sin(delta) + Math.cos(phi) * Math.cos(delta) * Math.cos(H));\n}\nfunction getSiderealTime(dates, longitudeWestInRadians) {\n    return DEGREES_TO_RADIANS * (THETA0 + THETA1 * dates) - longitudeWestInRadians;\n}\nfunction getSolarMeanAnomaly(days) {\n    return DEGREES_TO_RADIANS * (M0 + M1 * days);\n}\nfunction getEclipticLongitude(meanAnomaly) {\n    var M = meanAnomaly;\n    var C = DEGREES_TO_RADIANS * (1.9148 * Math.sin(M) + 0.02 * Math.sin(2 * M) + 0.0003 * Math.sin(3 * M));\n    var P = DEGREES_TO_RADIANS * 102.9372;\n    return M + C + P + Math.PI;\n}\nfunction getSunCoords(dates) {\n    var M = getSolarMeanAnomaly(dates);\n    var L = getEclipticLongitude(M);\n    return {\n        declination: getDeclination(L, 0),\n        rightAscension: getRightAscension(L, 0)\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7ZbR5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PostProcessEffect);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _effect = require(\"../lib/effect\");\nvar _effectDefault = parcelHelpers.interopDefault(_effect);\nvar _screenPass = require(\"../passes/screen-pass\");\nvar _screenPassDefault = parcelHelpers.interopDefault(_screenPass);\nvar _core = require(\"@luma.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar PostProcessEffect = function(_Effect) {\n    (0, _inheritsDefault.default)(PostProcessEffect1, _Effect);\n    var _super = _createSuper(PostProcessEffect1);\n    function PostProcessEffect1(module) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, PostProcessEffect1);\n        _this = _super.call(this, props);\n        _this.id = \"\".concat(module.name, \"-pass\");\n        (0, _core.normalizeShaderModule)(module);\n        _this.module = module;\n        return _this;\n    }\n    (0, _createClassDefault.default)(PostProcessEffect1, [\n        {\n            key: \"postRender\",\n            value: function postRender(gl, params) {\n                if (!this.passes) this.passes = createPasses(gl, this.module, this.id, this.props);\n                var target = params.target;\n                var inputBuffer = params.inputBuffer;\n                var outputBuffer = params.swapBuffer;\n                for(var index = 0; index < this.passes.length; index++){\n                    if (target && index === this.passes.length - 1) outputBuffer = target;\n                    this.passes[index].render({\n                        inputBuffer: inputBuffer,\n                        outputBuffer: outputBuffer\n                    });\n                    var switchBuffer = outputBuffer;\n                    outputBuffer = inputBuffer;\n                    inputBuffer = switchBuffer;\n                }\n                return inputBuffer;\n            }\n        },\n        {\n            key: \"cleanup\",\n            value: function cleanup() {\n                if (this.passes) {\n                    var _iterator = _createForOfIteratorHelper(this.passes), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var pass = _step.value;\n                            pass[\"delete\"]();\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    this.passes = null;\n                }\n            }\n        }\n    ]);\n    return PostProcessEffect1;\n}((0, _effectDefault.default));\nfunction createPasses(gl, module, id, moduleSettings) {\n    if (module.filter || module.sampler) {\n        var fs = getFragmentShaderForRenderPass(module);\n        var pass = new (0, _screenPassDefault.default)(gl, {\n            id: id,\n            module: module,\n            fs: fs,\n            moduleSettings: moduleSettings\n        });\n        return [\n            pass\n        ];\n    }\n    var passes = module.passes || [];\n    return passes.map(function(pass, index) {\n        var fs = getFragmentShaderForRenderPass(module, pass);\n        var idn = \"\".concat(id, \"-\").concat(index);\n        return new (0, _screenPassDefault.default)(gl, {\n            id: idn,\n            module: module,\n            fs: fs,\n            moduleSettings: moduleSettings\n        });\n    });\n}\nvar FILTER_FS_TEMPLATE = function FILTER_FS_TEMPLATE(func) {\n    return \"uniform sampler2D texture;\\nuniform vec2 texSize;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main() {\\n  vec2 texCoord = coordinate;\\n\\n  gl_FragColor = texture2D(texture, texCoord);\\n  gl_FragColor = \".concat(func, \"(gl_FragColor, texSize, texCoord);\\n}\\n\");\n};\nvar SAMPLER_FS_TEMPLATE = function SAMPLER_FS_TEMPLATE(func) {\n    return \"uniform sampler2D texture;\\nuniform vec2 texSize;\\n\\nvarying vec2 position;\\nvarying vec2 coordinate;\\nvarying vec2 uv;\\n\\nvoid main() {\\n  vec2 texCoord = coordinate;\\n\\n  gl_FragColor = \".concat(func, \"(texture, texSize, texCoord);\\n}\\n\");\n};\nfunction getFragmentShaderForRenderPass(module) {\n    var pass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : module;\n    if (pass.filter) {\n        var func = typeof pass.filter === \"string\" ? pass.filter : \"\".concat(module.name, \"_filterColor\");\n        return FILTER_FS_TEMPLATE(func);\n    }\n    if (pass.sampler) {\n        var _func = typeof pass.sampler === \"string\" ? pass.sampler : \"\".concat(module.name, \"_sampleColor\");\n        return SAMPLER_FS_TEMPLATE(_func);\n    }\n    return null;\n}\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"../lib/effect\":\"hVnbQ\",\"../passes/screen-pass\":\"d8Fbx\",\"@luma.gl/core\":\"bW3Qv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d8Fbx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ScreenPass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@luma.gl/core\");\nvar _pass = require(\"./pass\");\nvar _passDefault = parcelHelpers.interopDefault(_pass);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar ScreenPass = function(_Pass) {\n    (0, _inheritsDefault.default)(ScreenPass1, _Pass);\n    var _super = _createSuper(ScreenPass1);\n    function ScreenPass1(gl) {\n        var _this;\n        var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        (0, _classCallCheckDefault.default)(this, ScreenPass1);\n        _this = _super.call(this, gl, props);\n        var module = props.module, fs = props.fs, id = props.id;\n        _this.model = new (0, _core.ClipSpace)(gl, {\n            id: id,\n            fs: fs,\n            modules: [\n                module\n            ]\n        });\n        return _this;\n    }\n    (0, _createClassDefault.default)(ScreenPass1, [\n        {\n            key: \"render\",\n            value: function render(params) {\n                var _this2 = this;\n                var gl = this.gl;\n                (0, _core.withParameters)(gl, {\n                    framebuffer: params.outputBuffer,\n                    clearColor: [\n                        0,\n                        0,\n                        0,\n                        0\n                    ]\n                }, function() {\n                    return _this2._renderPass(gl, params);\n                });\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete() {\n                this.model[\"delete\"]();\n                this.model = null;\n            }\n        },\n        {\n            key: \"_renderPass\",\n            value: function _renderPass(gl, _ref) {\n                var inputBuffer = _ref.inputBuffer, outputBuffer = _ref.outputBuffer;\n                (0, _core.clear)(gl, {\n                    color: true\n                });\n                this.model.draw({\n                    moduleSettings: this.props.moduleSettings,\n                    uniforms: {\n                        texture: inputBuffer,\n                        texSize: [\n                            inputBuffer.width,\n                            inputBuffer.height\n                        ]\n                    },\n                    parameters: {\n                        depthWrite: false,\n                        depthTest: false\n                    }\n                });\n            }\n        }\n    ]);\n    return ScreenPass1;\n}((0, _passDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@luma.gl/core\":\"bW3Qv\",\"./pass\":\"kEGgO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gqPD1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GlobeViewport);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _viewport = require(\"./viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _constants = require(\"../lib/constants\");\nvar _vec3 = require(\"gl-matrix/vec3\");\nvar _vec4 = require(\"gl-matrix/vec4\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nvar RADIANS_TO_DEGREES = 180 / Math.PI;\nvar EARTH_RADIUS = 6370972;\nvar GLOBE_RADIUS = 256;\nfunction getDistanceScales() {\n    var unitsPerMeter = GLOBE_RADIUS / EARTH_RADIUS;\n    var unitsPerDegree = Math.PI / 180 * GLOBE_RADIUS;\n    return {\n        unitsPerMeter: [\n            unitsPerMeter,\n            unitsPerMeter,\n            unitsPerMeter\n        ],\n        unitsPerMeter2: [\n            0,\n            0,\n            0\n        ],\n        metersPerUnit: [\n            1 / unitsPerMeter,\n            1 / unitsPerMeter,\n            1 / unitsPerMeter\n        ],\n        unitsPerDegree: [\n            unitsPerDegree,\n            unitsPerDegree,\n            unitsPerMeter\n        ],\n        unitsPerDegree2: [\n            0,\n            0,\n            0\n        ],\n        degreesPerUnit: [\n            1 / unitsPerDegree,\n            1 / unitsPerDegree,\n            1 / unitsPerMeter\n        ]\n    };\n}\nvar GlobeViewport = function(_Viewport) {\n    (0, _inheritsDefault.default)(GlobeViewport1, _Viewport);\n    var _super = _createSuper(GlobeViewport1);\n    function GlobeViewport1() {\n        var _this;\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, GlobeViewport1);\n        var _opts$latitude = opts.latitude, latitude = _opts$latitude === void 0 ? 0 : _opts$latitude, _opts$longitude = opts.longitude, longitude = _opts$longitude === void 0 ? 0 : _opts$longitude, _opts$zoom = opts.zoom, zoom = _opts$zoom === void 0 ? 11 : _opts$zoom, _opts$nearZMultiplier = opts.nearZMultiplier, nearZMultiplier = _opts$nearZMultiplier === void 0 ? 0.1 : _opts$nearZMultiplier, _opts$farZMultiplier = opts.farZMultiplier, farZMultiplier = _opts$farZMultiplier === void 0 ? 2 : _opts$farZMultiplier, _opts$resolution = opts.resolution, resolution = _opts$resolution === void 0 ? 10 : _opts$resolution;\n        var width = opts.width, height = opts.height, _opts$altitude = opts.altitude, altitude = _opts$altitude === void 0 ? 1.5 : _opts$altitude;\n        width = width || 1;\n        height = height || 1;\n        altitude = Math.max(0.75, altitude);\n        var viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n            eye: [\n                0,\n                -altitude,\n                0\n            ],\n            up: [\n                0,\n                0,\n                1\n            ]\n        });\n        var scale = Math.pow(2, zoom);\n        viewMatrix.rotateX(latitude * DEGREES_TO_RADIANS);\n        viewMatrix.rotateZ(-longitude * DEGREES_TO_RADIANS);\n        viewMatrix.scale(scale / height);\n        var halfFov = Math.atan(0.5 / altitude);\n        var relativeScale = GLOBE_RADIUS * 2 * scale / height;\n        var viewportOpts = Object.assign({}, opts, {\n            width: width,\n            height: height,\n            viewMatrix: viewMatrix,\n            longitude: longitude,\n            latitude: latitude,\n            zoom: zoom,\n            fovyRadians: halfFov * 2,\n            aspect: width / height,\n            focalDistance: altitude,\n            near: nearZMultiplier,\n            far: Math.min(2, 1 / relativeScale + 1) * altitude * farZMultiplier\n        });\n        _this = _super.call(this, viewportOpts);\n        _this.resolution = resolution;\n        _this.distanceScales = getDistanceScales();\n        return _this;\n    }\n    (0, _createClassDefault.default)(GlobeViewport1, [\n        {\n            key: \"getDistanceScales\",\n            value: function getDistanceScales() {\n                return this.distanceScales;\n            }\n        },\n        {\n            key: \"getBounds\",\n            value: function getBounds() {\n                var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var unprojectOption = {\n                    targetZ: options.z || 0\n                };\n                var left = this.unproject([\n                    0,\n                    this.height / 2\n                ], unprojectOption);\n                var top = this.unproject([\n                    this.width / 2,\n                    0\n                ], unprojectOption);\n                var right = this.unproject([\n                    this.width,\n                    this.height / 2\n                ], unprojectOption);\n                var bottom = this.unproject([\n                    this.width / 2,\n                    this.height\n                ], unprojectOption);\n                if (right[0] < this.longitude) right[0] += 360;\n                if (left[0] > this.longitude) left[0] -= 360;\n                return [\n                    Math.min(left[0], right[0], top[0], bottom[0]),\n                    Math.min(left[1], right[1], top[1], bottom[1]),\n                    Math.max(left[0], right[0], top[0], bottom[0]),\n                    Math.max(left[1], right[1], top[1], bottom[1])\n                ];\n            }\n        },\n        {\n            key: \"unproject\",\n            value: function unproject(xyz) {\n                var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$topLeft = _ref.topLeft, topLeft = _ref$topLeft === void 0 ? true : _ref$topLeft, targetZ = _ref.targetZ;\n                var _xyz = (0, _slicedToArrayDefault.default)(xyz, 3), x = _xyz[0], y = _xyz[1], z = _xyz[2];\n                var y2 = topLeft ? y : this.height - y;\n                var pixelUnprojectionMatrix = this.pixelUnprojectionMatrix;\n                var coord;\n                if (Number.isFinite(z)) coord = transformVector(pixelUnprojectionMatrix, [\n                    x,\n                    y2,\n                    z,\n                    1\n                ]);\n                else {\n                    var coord0 = transformVector(pixelUnprojectionMatrix, [\n                        x,\n                        y2,\n                        -1,\n                        1\n                    ]);\n                    var coord1 = transformVector(pixelUnprojectionMatrix, [\n                        x,\n                        y2,\n                        1,\n                        1\n                    ]);\n                    var lt = ((targetZ || 0) / EARTH_RADIUS + 1) * GLOBE_RADIUS;\n                    var lSqr = _vec3.sqrLen(_vec3.sub([], coord0, coord1));\n                    var l0Sqr = _vec3.sqrLen(coord0);\n                    var l1Sqr = _vec3.sqrLen(coord1);\n                    var sSqr = (4 * l0Sqr * l1Sqr - Math.pow(lSqr - l0Sqr - l1Sqr, 2)) / 16;\n                    var dSqr = 4 * sSqr / lSqr;\n                    var r0 = Math.sqrt(l0Sqr - dSqr);\n                    var dr = Math.sqrt(Math.max(0, lt * lt - dSqr));\n                    var t = (r0 - dr) / Math.sqrt(lSqr);\n                    coord = _vec3.lerp([], coord0, coord1, t);\n                }\n                var _this$unprojectPositi = this.unprojectPosition(coord), _this$unprojectPositi2 = (0, _slicedToArrayDefault.default)(_this$unprojectPositi, 3), X = _this$unprojectPositi2[0], Y = _this$unprojectPositi2[1], Z = _this$unprojectPositi2[2];\n                if (Number.isFinite(z)) return [\n                    X,\n                    Y,\n                    Z\n                ];\n                return Number.isFinite(targetZ) ? [\n                    X,\n                    Y,\n                    targetZ\n                ] : [\n                    X,\n                    Y\n                ];\n            }\n        },\n        {\n            key: \"projectPosition\",\n            value: function projectPosition(xyz) {\n                var _xyz2 = (0, _slicedToArrayDefault.default)(xyz, 3), lng = _xyz2[0], lat = _xyz2[1], _xyz2$ = _xyz2[2], Z = _xyz2$ === void 0 ? 0 : _xyz2$;\n                var lambda = lng * DEGREES_TO_RADIANS;\n                var phi = lat * DEGREES_TO_RADIANS;\n                var cosPhi = Math.cos(phi);\n                var D = (Z / EARTH_RADIUS + 1) * GLOBE_RADIUS;\n                return [\n                    Math.sin(lambda) * cosPhi * D,\n                    -Math.cos(lambda) * cosPhi * D,\n                    Math.sin(phi) * D\n                ];\n            }\n        },\n        {\n            key: \"unprojectPosition\",\n            value: function unprojectPosition(xyz) {\n                var _xyz3 = (0, _slicedToArrayDefault.default)(xyz, 3), x = _xyz3[0], y = _xyz3[1], z = _xyz3[2];\n                var D = _vec3.len(xyz);\n                var phi = Math.asin(z / D);\n                var lambda = Math.atan2(x, -y);\n                var lng = lambda * RADIANS_TO_DEGREES;\n                var lat = phi * RADIANS_TO_DEGREES;\n                var Z = (D / GLOBE_RADIUS - 1) * EARTH_RADIUS;\n                return [\n                    lng,\n                    lat,\n                    Z\n                ];\n            }\n        },\n        {\n            key: \"projectFlat\",\n            value: function projectFlat(xyz) {\n                return xyz;\n            }\n        },\n        {\n            key: \"unprojectFlat\",\n            value: function unprojectFlat(xyz) {\n                return xyz;\n            }\n        },\n        {\n            key: \"getMapCenterByLngLatPosition\",\n            value: function getMapCenterByLngLatPosition(_ref2) {\n                var lngLat = _ref2.lngLat, pos = _ref2.pos;\n                var fromPosition = this.unproject(pos);\n                return [\n                    lngLat[0] - fromPosition[0] + this.longitude,\n                    lngLat[1] - fromPosition[1] + this.latitude\n                ];\n            }\n        },\n        {\n            key: \"projectionMode\",\n            get: function get() {\n                return (0, _constants.PROJECTION_MODE).GLOBE;\n            }\n        }\n    ]);\n    return GlobeViewport1;\n}((0, _viewportDefault.default));\nfunction transformVector(matrix, vector) {\n    var result = _vec4.transformMat4([], vector, matrix);\n    _vec4.scale(result, result, 1 / result[3]);\n    return result;\n}\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"math.gl\":\"6aDAl\",\"./viewport\":\"jETN1\",\"../lib/constants\":\"4VZPz\",\"gl-matrix/vec3\":\"cAIcX\",\"gl-matrix/vec4\":\"czCsm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5FfGZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>FirstPersonView);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _webMercator = require(\"@math.gl/web-mercator\");\nvar _mathGl = require(\"math.gl\");\nvar _firstPersonController = require(\"../controllers/first-person-controller\");\nvar _firstPersonControllerDefault = parcelHelpers.interopDefault(_firstPersonController);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nfunction getDirectionFromBearingAndPitch(_ref) {\n    var bearing = _ref.bearing, pitch = _ref.pitch;\n    var spherical = new (0, _mathGl._SphericalCoordinates)({\n        bearing: bearing,\n        pitch: pitch\n    });\n    var direction = spherical.toVector3().normalize();\n    return direction;\n}\nvar FirstPersonView = function(_View) {\n    (0, _inheritsDefault.default)(FirstPersonView1, _View);\n    var _super = _createSuper(FirstPersonView1);\n    function FirstPersonView1() {\n        (0, _classCallCheckDefault.default)(this, FirstPersonView1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(FirstPersonView1, [\n        {\n            key: \"_getViewport\",\n            value: function _getViewport(props) {\n                var _props$modelMatrix = props.modelMatrix, modelMatrix = _props$modelMatrix === void 0 ? null : _props$modelMatrix, _props$bearing = props.bearing, bearing = _props$bearing === void 0 ? 0 : _props$bearing, _props$pitch = props.pitch, pitch = _props$pitch === void 0 ? 0 : _props$pitch, _props$up = props.up, up = _props$up === void 0 ? [\n                    0,\n                    0,\n                    1\n                ] : _props$up;\n                var dir = getDirectionFromBearingAndPitch({\n                    bearing: bearing,\n                    pitch: 90 + pitch\n                });\n                var center = modelMatrix ? modelMatrix.transformDirection(dir) : dir;\n                var zoom = (0, _webMercator.getMeterZoom)(props);\n                var scale = Math.pow(2, zoom);\n                var viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n                    eye: [\n                        0,\n                        0,\n                        0\n                    ],\n                    center: center,\n                    up: up\n                }).scale(scale);\n                return new (0, _viewportDefault.default)(Object.assign({}, props, {\n                    zoom: zoom,\n                    viewMatrix: viewMatrix\n                }));\n            }\n        },\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _firstPersonControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return FirstPersonView1;\n}((0, _viewDefault.default));\nFirstPersonView.displayName = \"FirstPersonView\";\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./view\":\"d0jsQ\",\"../viewports/viewport\":\"jETN1\",\"@math.gl/web-mercator\":\"jS2l3\",\"math.gl\":\"6aDAl\",\"../controllers/first-person-controller\":\"6ip9Y\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6ip9Y\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>FirstPersonController);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _viewState = require(\"./view-state\");\nvar _viewStateDefault = parcelHelpers.interopDefault(_viewState);\nvar _mathUtils = require(\"../utils/math-utils\");\nvar _mathGl = require(\"math.gl\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar MOVEMENT_SPEED = 20;\nvar DEFAULT_STATE = {\n    position: [\n        0,\n        0,\n        0\n    ],\n    pitch: 0,\n    bearing: 0,\n    maxPitch: 90,\n    minPitch: -90\n};\nvar FirstPersonState = function(_ViewState) {\n    (0, _inheritsDefault.default)(FirstPersonState1, _ViewState);\n    var _super = _createSuper(FirstPersonState1);\n    function FirstPersonState1(_ref) {\n        var _this;\n        var width = _ref.width, height = _ref.height, _ref$position = _ref.position, position = _ref$position === void 0 ? DEFAULT_STATE.position : _ref$position, _ref$bearing = _ref.bearing, bearing = _ref$bearing === void 0 ? DEFAULT_STATE.bearing : _ref$bearing, _ref$pitch = _ref.pitch, pitch = _ref$pitch === void 0 ? DEFAULT_STATE.pitch : _ref$pitch, longitude = _ref.longitude, latitude = _ref.latitude, _ref$maxPitch = _ref.maxPitch, maxPitch = _ref$maxPitch === void 0 ? DEFAULT_STATE.maxPitch : _ref$maxPitch, _ref$minPitch = _ref.minPitch, minPitch = _ref$minPitch === void 0 ? DEFAULT_STATE.minPitch : _ref$minPitch, startBearing = _ref.startBearing, startPitch = _ref.startPitch, startZoomPosition = _ref.startZoomPosition, startZoom = _ref.startZoom;\n        (0, _classCallCheckDefault.default)(this, FirstPersonState1);\n        _this = _super.call(this, {\n            width: width,\n            height: height,\n            position: position,\n            bearing: bearing,\n            pitch: pitch,\n            longitude: longitude,\n            latitude: latitude,\n            maxPitch: maxPitch,\n            minPitch: minPitch\n        });\n        _this._interactiveState = {\n            startBearing: startBearing,\n            startPitch: startPitch,\n            startZoomPosition: startZoomPosition,\n            startZoom: startZoom\n        };\n        return _this;\n    }\n    (0, _createClassDefault.default)(FirstPersonState1, [\n        {\n            key: \"getInteractiveState\",\n            value: function getInteractiveState() {\n                return this._interactiveState;\n            }\n        },\n        {\n            key: \"getDirection\",\n            value: function getDirection() {\n                var use2D = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n                var spherical = new (0, _mathGl._SphericalCoordinates)({\n                    bearing: this._viewportProps.bearing,\n                    pitch: use2D ? 90 : 90 + this._viewportProps.pitch\n                });\n                var direction = spherical.toVector3().normalize();\n                return direction;\n            }\n        },\n        {\n            key: \"panStart\",\n            value: function panStart() {\n                return this;\n            }\n        },\n        {\n            key: \"pan\",\n            value: function pan() {\n                return this;\n            }\n        },\n        {\n            key: \"panEnd\",\n            value: function panEnd() {\n                return this;\n            }\n        },\n        {\n            key: \"rotateStart\",\n            value: function rotateStart(_ref2) {\n                var pos = _ref2.pos;\n                return this._getUpdatedState({\n                    startBearing: this._viewportProps.bearing,\n                    startPitch: this._viewportProps.pitch\n                });\n            }\n        },\n        {\n            key: \"rotate\",\n            value: function rotate(_ref3) {\n                var deltaScaleX = _ref3.deltaScaleX, deltaScaleY = _ref3.deltaScaleY;\n                var _this$_interactiveSta = this._interactiveState, startBearing = _this$_interactiveSta.startBearing, startPitch = _this$_interactiveSta.startPitch;\n                if (!Number.isFinite(startBearing) || !Number.isFinite(startPitch)) return this;\n                return this._getUpdatedState({\n                    bearing: startBearing - deltaScaleX * 180,\n                    pitch: startPitch - deltaScaleY * 90\n                });\n            }\n        },\n        {\n            key: \"rotateEnd\",\n            value: function rotateEnd() {\n                return this._getUpdatedState({\n                    startBearing: null,\n                    startPitch: null\n                });\n            }\n        },\n        {\n            key: \"zoomStart\",\n            value: function zoomStart() {\n                return this._getUpdatedState({\n                    startZoomPosition: this._viewportProps.position,\n                    startZoom: this._viewportProps.zoom\n                });\n            }\n        },\n        {\n            key: \"zoom\",\n            value: function zoom(_ref4) {\n                var scale = _ref4.scale;\n                var startZoomPosition = this._interactiveState.startZoomPosition;\n                if (!startZoomPosition) startZoomPosition = this._viewportProps.position;\n                var direction = this.getDirection();\n                return this._move(direction, Math.log2(scale), startZoomPosition);\n            }\n        },\n        {\n            key: \"zoomEnd\",\n            value: function zoomEnd() {\n                return this._getUpdatedState({\n                    startZoomPosition: null,\n                    startZoom: null\n                });\n            }\n        },\n        {\n            key: \"moveLeft\",\n            value: function moveLeft() {\n                var direction = this.getDirection(true);\n                return this._move(direction.rotateZ({\n                    radians: Math.PI / 2\n                }));\n            }\n        },\n        {\n            key: \"moveRight\",\n            value: function moveRight() {\n                var direction = this.getDirection(true);\n                return this._move(direction.rotateZ({\n                    radians: -Math.PI / 2\n                }));\n            }\n        },\n        {\n            key: \"moveUp\",\n            value: function moveUp() {\n                var direction = this.getDirection(true);\n                return this._move(direction);\n            }\n        },\n        {\n            key: \"moveDown\",\n            value: function moveDown() {\n                var direction = this.getDirection(true);\n                return this._move(direction.negate());\n            }\n        },\n        {\n            key: \"rotateLeft\",\n            value: function rotateLeft() {\n                return this._getUpdatedState({\n                    bearing: this._viewportProps.bearing - 15\n                });\n            }\n        },\n        {\n            key: \"rotateRight\",\n            value: function rotateRight() {\n                return this._getUpdatedState({\n                    bearing: this._viewportProps.bearing + 15\n                });\n            }\n        },\n        {\n            key: \"rotateUp\",\n            value: function rotateUp() {\n                return this._getUpdatedState({\n                    pitch: this._viewportProps.pitch + 10\n                });\n            }\n        },\n        {\n            key: \"rotateDown\",\n            value: function rotateDown() {\n                return this._getUpdatedState({\n                    pitch: this._viewportProps.pitch - 10\n                });\n            }\n        },\n        {\n            key: \"zoomIn\",\n            value: function zoomIn() {\n                return this.zoom({\n                    scale: 2\n                });\n            }\n        },\n        {\n            key: \"zoomOut\",\n            value: function zoomOut() {\n                return this.zoom({\n                    scale: 0.5\n                });\n            }\n        },\n        {\n            key: \"shortestPathFrom\",\n            value: function shortestPathFrom(viewState) {\n                var fromProps = viewState.getViewportProps();\n                var props = Object.assign({}, this._viewportProps);\n                var bearing = props.bearing, longitude = props.longitude;\n                if (Math.abs(bearing - fromProps.bearing) > 180) props.bearing = bearing < 0 ? bearing + 360 : bearing - 360;\n                if (Math.abs(longitude - fromProps.longitude) > 180) props.longitude = longitude < 0 ? longitude + 360 : longitude - 360;\n                return props;\n            }\n        },\n        {\n            key: \"_move\",\n            value: function _move(direction) {\n                var speed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n                var fromPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._viewportProps.position;\n                var delta = direction.scale(speed * MOVEMENT_SPEED);\n                return this._getUpdatedState({\n                    position: new (0, _mathGl.Vector3)(fromPosition).add(delta)\n                });\n            }\n        },\n        {\n            key: \"_getUpdatedState\",\n            value: function _getUpdatedState(newProps) {\n                return new FirstPersonState1(Object.assign({}, this._viewportProps, this._interactiveState, newProps));\n            }\n        },\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                var pitch = props.pitch, maxPitch = props.maxPitch, minPitch = props.minPitch, longitude = props.longitude, bearing = props.bearing;\n                props.pitch = (0, _mathGl.clamp)(pitch, minPitch, maxPitch);\n                if (longitude < -180 || longitude > 180) props.longitude = (0, _mathUtils.mod)(longitude + 180, 360) - 180;\n                if (bearing < -180 || bearing > 180) props.bearing = (0, _mathUtils.mod)(bearing + 180, 360) - 180;\n                return props;\n            }\n        }\n    ]);\n    return FirstPersonState1;\n}((0, _viewStateDefault.default));\nvar FirstPersonController = function(_Controller) {\n    (0, _inheritsDefault.default)(FirstPersonController1, _Controller);\n    var _super2 = _createSuper(FirstPersonController1);\n    function FirstPersonController1(props) {\n        (0, _classCallCheckDefault.default)(this, FirstPersonController1);\n        return _super2.call(this, FirstPersonState, props);\n    }\n    return FirstPersonController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./controller\":\"j3Tf5\",\"./view-state\":\"bvyJt\",\"../utils/math-utils\":\"jmX3c\",\"math.gl\":\"6aDAl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5kdbb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>OrbitView);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _mathGl = require(\"math.gl\");\nvar _orbitController = require(\"../controllers/orbit-controller\");\nvar _orbitControllerDefault = parcelHelpers.interopDefault(_orbitController);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEGREES_TO_RADIANS = Math.PI / 180;\nfunction getViewMatrix(_ref) {\n    var height = _ref.height, fovy = _ref.fovy, orbitAxis = _ref.orbitAxis, rotationX = _ref.rotationX, rotationOrbit = _ref.rotationOrbit, zoom = _ref.zoom;\n    var distance = 0.5 / Math.tan(fovy * DEGREES_TO_RADIANS / 2);\n    var up = orbitAxis === \"Z\" ? [\n        0,\n        0,\n        1\n    ] : [\n        0,\n        1,\n        0\n    ];\n    var eye = orbitAxis === \"Z\" ? [\n        0,\n        -distance,\n        0\n    ] : [\n        0,\n        0,\n        distance\n    ];\n    var viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n        eye: eye,\n        up: up\n    });\n    viewMatrix.rotateX(rotationX * DEGREES_TO_RADIANS);\n    if (orbitAxis === \"Z\") viewMatrix.rotateZ(rotationOrbit * DEGREES_TO_RADIANS);\n    else viewMatrix.rotateY(rotationOrbit * DEGREES_TO_RADIANS);\n    var projectionScale = Math.pow(2, zoom) / (height || 1);\n    viewMatrix.scale(projectionScale);\n    return viewMatrix;\n}\nvar OrbitViewport = function(_Viewport) {\n    (0, _inheritsDefault.default)(OrbitViewport1, _Viewport);\n    var _super = _createSuper(OrbitViewport1);\n    function OrbitViewport1(props) {\n        (0, _classCallCheckDefault.default)(this, OrbitViewport1);\n        var id = props.id, x = props.x, y = props.y, width = props.width, height = props.height, _props$fovy = props.fovy, fovy = _props$fovy === void 0 ? 50 : _props$fovy, near = props.near, far = props.far, _props$orbitAxis = props.orbitAxis, orbitAxis = _props$orbitAxis === void 0 ? \"Z\" : _props$orbitAxis, _props$target = props.target, target = _props$target === void 0 ? [\n            0,\n            0,\n            0\n        ] : _props$target, _props$rotationX = props.rotationX, rotationX = _props$rotationX === void 0 ? 0 : _props$rotationX, _props$rotationOrbit = props.rotationOrbit, rotationOrbit = _props$rotationOrbit === void 0 ? 0 : _props$rotationOrbit, _props$zoom = props.zoom, zoom = _props$zoom === void 0 ? 0 : _props$zoom;\n        return _super.call(this, {\n            id: id,\n            viewMatrix: getViewMatrix({\n                height: height,\n                fovy: fovy,\n                orbitAxis: orbitAxis,\n                rotationX: rotationX,\n                rotationOrbit: rotationOrbit,\n                zoom: zoom\n            }),\n            fovy: fovy,\n            near: near,\n            far: far,\n            x: x,\n            y: y,\n            position: target,\n            width: width,\n            height: height,\n            zoom: zoom\n        });\n    }\n    return OrbitViewport1;\n}((0, _viewportDefault.default));\nvar OrbitView = function(_View) {\n    (0, _inheritsDefault.default)(OrbitView1, _View);\n    var _super2 = _createSuper(OrbitView1);\n    function OrbitView1(props) {\n        (0, _classCallCheckDefault.default)(this, OrbitView1);\n        return _super2.call(this, Object.assign({}, props, {\n            type: OrbitViewport\n        }));\n    }\n    (0, _createClassDefault.default)(OrbitView1, [\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _orbitControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return OrbitView1;\n}((0, _viewDefault.default));\nOrbitView.displayName = \"OrbitView\";\n\n},{\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./view\":\"d0jsQ\",\"../viewports/viewport\":\"jETN1\",\"math.gl\":\"6aDAl\",\"../controllers/orbit-controller\":\"4xiSq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4xiSq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"OrbitState\", ()=>OrbitState);\nparcelHelpers.export(exports, \"default\", ()=>OrbitController);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _viewState = require(\"./view-state\");\nvar _viewStateDefault = parcelHelpers.interopDefault(_viewState);\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transitionManager = require(\"./transition-manager\");\nvar _mathUtils = require(\"../utils/math-utils\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar MOVEMENT_SPEED = 50;\nvar DEFAULT_STATE = {\n    orbitAxis: \"Z\",\n    rotationX: 0,\n    rotationOrbit: 0,\n    zoom: 0,\n    target: [\n        0,\n        0,\n        0\n    ],\n    minRotationX: -90,\n    maxRotationX: 90,\n    minZoom: -Infinity,\n    maxZoom: Infinity\n};\nvar LINEAR_TRANSITION_PROPS = {\n    transitionDuration: 300,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)([\n        \"target\",\n        \"zoom\",\n        \"rotationX\",\n        \"rotationOrbit\"\n    ]),\n    transitionInterruption: (0, _transitionManager.TRANSITION_EVENTS).BREAK\n};\nvar zoom2Scale = function zoom2Scale(zoom) {\n    return Math.pow(2, zoom);\n};\nvar OrbitState = function(_ViewState) {\n    (0, _inheritsDefault.default)(OrbitState1, _ViewState);\n    var _super = _createSuper(OrbitState1);\n    function OrbitState1(_ref) {\n        var _this;\n        var makeViewport = _ref.makeViewport, width = _ref.width, height = _ref.height, _ref$orbitAxis = _ref.orbitAxis, orbitAxis = _ref$orbitAxis === void 0 ? DEFAULT_STATE.orbitAxis : _ref$orbitAxis, _ref$rotationX = _ref.rotationX, rotationX = _ref$rotationX === void 0 ? DEFAULT_STATE.rotationX : _ref$rotationX, _ref$rotationOrbit = _ref.rotationOrbit, rotationOrbit = _ref$rotationOrbit === void 0 ? DEFAULT_STATE.rotationOrbit : _ref$rotationOrbit, _ref$target = _ref.target, target = _ref$target === void 0 ? DEFAULT_STATE.target : _ref$target, _ref$zoom = _ref.zoom, zoom = _ref$zoom === void 0 ? DEFAULT_STATE.zoom : _ref$zoom, _ref$minRotationX = _ref.minRotationX, minRotationX = _ref$minRotationX === void 0 ? DEFAULT_STATE.minRotationX : _ref$minRotationX, _ref$maxRotationX = _ref.maxRotationX, maxRotationX = _ref$maxRotationX === void 0 ? DEFAULT_STATE.maxRotationX : _ref$maxRotationX, _ref$minZoom = _ref.minZoom, minZoom = _ref$minZoom === void 0 ? DEFAULT_STATE.minZoom : _ref$minZoom, _ref$maxZoom = _ref.maxZoom, maxZoom = _ref$maxZoom === void 0 ? DEFAULT_STATE.maxZoom : _ref$maxZoom, startPanPosition = _ref.startPanPosition, startTarget = _ref.startTarget, startRotationX = _ref.startRotationX, startRotationOrbit = _ref.startRotationOrbit, startZoomPosition = _ref.startZoomPosition, startZoom = _ref.startZoom;\n        (0, _classCallCheckDefault.default)(this, OrbitState1);\n        _this = _super.call(this, {\n            width: width,\n            height: height,\n            orbitAxis: orbitAxis,\n            rotationX: rotationX,\n            rotationOrbit: rotationOrbit,\n            target: target,\n            zoom: zoom,\n            minRotationX: minRotationX,\n            maxRotationX: maxRotationX,\n            minZoom: minZoom,\n            maxZoom: maxZoom\n        });\n        _this._interactiveState = {\n            startPanPosition: startPanPosition,\n            startTarget: startTarget,\n            startRotationX: startRotationX,\n            startRotationOrbit: startRotationOrbit,\n            startZoomPosition: startZoomPosition,\n            startZoom: startZoom\n        };\n        _this.makeViewport = makeViewport;\n        return _this;\n    }\n    (0, _createClassDefault.default)(OrbitState1, [\n        {\n            key: \"getViewportProps\",\n            value: function getViewportProps() {\n                return this._viewportProps;\n            }\n        },\n        {\n            key: \"getInteractiveState\",\n            value: function getInteractiveState() {\n                return this._interactiveState;\n            }\n        },\n        {\n            key: \"panStart\",\n            value: function panStart(_ref2) {\n                var pos = _ref2.pos;\n                var target = this._viewportProps.target;\n                return this._getUpdatedState({\n                    startPanPosition: pos,\n                    startTarget: target\n                });\n            }\n        },\n        {\n            key: \"pan\",\n            value: function pan(_ref3) {\n                var pos = _ref3.pos, startPos = _ref3.startPos;\n                var _this$_interactiveSta = this._interactiveState, startPanPosition = _this$_interactiveSta.startPanPosition, startTarget = _this$_interactiveSta.startTarget;\n                var delta = new (0, _mathGl.Vector2)(pos).subtract(startPanPosition);\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        startTarget: startTarget,\n                        pixelOffset: delta\n                    })\n                });\n            }\n        },\n        {\n            key: \"panEnd\",\n            value: function panEnd() {\n                return this._getUpdatedState({\n                    startPanPosition: null,\n                    startTarget: null\n                });\n            }\n        },\n        {\n            key: \"rotateStart\",\n            value: function rotateStart(_ref4) {\n                var pos = _ref4.pos;\n                return this._getUpdatedState({\n                    startRotationX: this._viewportProps.rotationX,\n                    startRotationOrbit: this._viewportProps.rotationOrbit\n                });\n            }\n        },\n        {\n            key: \"rotate\",\n            value: function rotate(_ref5) {\n                var deltaScaleX = _ref5.deltaScaleX, deltaScaleY = _ref5.deltaScaleY;\n                var _this$_interactiveSta2 = this._interactiveState, startRotationX = _this$_interactiveSta2.startRotationX, startRotationOrbit = _this$_interactiveSta2.startRotationOrbit;\n                if (!Number.isFinite(startRotationX) || !Number.isFinite(startRotationOrbit)) return this;\n                if (startRotationX < -90 || startRotationX > 90) deltaScaleX *= -1;\n                return this._getUpdatedState({\n                    rotationX: startRotationX + deltaScaleY * 180,\n                    rotationOrbit: startRotationOrbit + deltaScaleX * 180,\n                    isRotating: true\n                });\n            }\n        },\n        {\n            key: \"rotateEnd\",\n            value: function rotateEnd() {\n                return this._getUpdatedState({\n                    startRotationX: null,\n                    startRotationOrbit: null\n                });\n            }\n        },\n        {\n            key: \"shortestPathFrom\",\n            value: function shortestPathFrom(viewState) {\n                var fromProps = viewState.getViewportProps();\n                var props = Object.assign({}, this._viewportProps);\n                var rotationOrbit = props.rotationOrbit;\n                if (Math.abs(rotationOrbit - fromProps.rotationOrbit) > 180) props.rotationOrbit = rotationOrbit < 0 ? rotationOrbit + 360 : rotationOrbit - 360;\n                return props;\n            }\n        },\n        {\n            key: \"zoomStart\",\n            value: function zoomStart(_ref6) {\n                var pos = _ref6.pos;\n                return this._getUpdatedState({\n                    startZoomPosition: pos,\n                    startTarget: this._viewportProps.target,\n                    startZoom: this._viewportProps.zoom\n                });\n            }\n        },\n        {\n            key: \"zoom\",\n            value: function zoom(_ref7) {\n                var pos = _ref7.pos, startPos = _ref7.startPos, scale = _ref7.scale;\n                var _this$_viewportProps = this._viewportProps, zoom = _this$_viewportProps.zoom, width = _this$_viewportProps.width, height = _this$_viewportProps.height, target = _this$_viewportProps.target;\n                var _this$_interactiveSta3 = this._interactiveState, startZoom = _this$_interactiveSta3.startZoom, startZoomPosition = _this$_interactiveSta3.startZoomPosition, startTarget = _this$_interactiveSta3.startTarget;\n                if (!Number.isFinite(startZoom)) {\n                    startZoom = zoom;\n                    startTarget = target;\n                    startZoomPosition = startPos || pos;\n                }\n                var newZoom = this._calculateNewZoom({\n                    scale: scale,\n                    startZoom: startZoom\n                });\n                var startScale = zoom2Scale(startZoom);\n                var newScale = zoom2Scale(newZoom);\n                var dX = (width / 2 - startZoomPosition[0]) * (newScale / startScale - 1);\n                var dY = (height / 2 - startZoomPosition[1]) * (newScale / startScale - 1);\n                return this._getUpdatedState({\n                    zoom: newZoom,\n                    target: this._calculateNewTarget({\n                        startTarget: startTarget,\n                        zoom: newZoom,\n                        pixelOffset: [\n                            dX,\n                            dY\n                        ]\n                    })\n                });\n            }\n        },\n        {\n            key: \"zoomEnd\",\n            value: function zoomEnd() {\n                return this._getUpdatedState({\n                    startZoomPosition: null,\n                    startTarget: null,\n                    startZoom: null\n                });\n            }\n        },\n        {\n            key: \"zoomIn\",\n            value: function zoomIn() {\n                return this._getUpdatedState({\n                    zoom: this._calculateNewZoom({\n                        scale: 2\n                    })\n                });\n            }\n        },\n        {\n            key: \"zoomOut\",\n            value: function zoomOut() {\n                return this._getUpdatedState({\n                    zoom: this._calculateNewZoom({\n                        scale: 0.5\n                    })\n                });\n            }\n        },\n        {\n            key: \"moveLeft\",\n            value: function moveLeft() {\n                var pixelOffset = [\n                    -MOVEMENT_SPEED,\n                    0\n                ];\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        pixelOffset: pixelOffset\n                    })\n                });\n            }\n        },\n        {\n            key: \"moveRight\",\n            value: function moveRight() {\n                var pixelOffset = [\n                    MOVEMENT_SPEED,\n                    0\n                ];\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        pixelOffset: pixelOffset\n                    })\n                });\n            }\n        },\n        {\n            key: \"moveUp\",\n            value: function moveUp() {\n                var pixelOffset = [\n                    0,\n                    -MOVEMENT_SPEED\n                ];\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        pixelOffset: pixelOffset\n                    })\n                });\n            }\n        },\n        {\n            key: \"moveDown\",\n            value: function moveDown() {\n                var pixelOffset = [\n                    0,\n                    MOVEMENT_SPEED\n                ];\n                return this._getUpdatedState({\n                    target: this._calculateNewTarget({\n                        pixelOffset: pixelOffset\n                    })\n                });\n            }\n        },\n        {\n            key: \"rotateLeft\",\n            value: function rotateLeft() {\n                return this._getUpdatedState({\n                    rotationOrbit: this._viewportProps.rotationOrbit - 15\n                });\n            }\n        },\n        {\n            key: \"rotateRight\",\n            value: function rotateRight() {\n                return this._getUpdatedState({\n                    rotationOrbit: this._viewportProps.rotationOrbit + 15\n                });\n            }\n        },\n        {\n            key: \"rotateUp\",\n            value: function rotateUp() {\n                return this._getUpdatedState({\n                    rotationX: this._viewportProps.rotationX - 10\n                });\n            }\n        },\n        {\n            key: \"rotateDown\",\n            value: function rotateDown() {\n                return this._getUpdatedState({\n                    rotationX: this._viewportProps.rotationX + 10\n                });\n            }\n        },\n        {\n            key: \"_calculateNewZoom\",\n            value: function _calculateNewZoom(_ref8) {\n                var scale = _ref8.scale, startZoom = _ref8.startZoom;\n                var _this$_viewportProps2 = this._viewportProps, maxZoom = _this$_viewportProps2.maxZoom, minZoom = _this$_viewportProps2.minZoom;\n                if (!Number.isFinite(startZoom)) startZoom = this._viewportProps.zoom;\n                var zoom = startZoom + Math.log2(scale);\n                return (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n            }\n        },\n        {\n            key: \"_calculateNewTarget\",\n            value: function _calculateNewTarget(_ref9) {\n                var startTarget = _ref9.startTarget, zoom = _ref9.zoom, pixelOffset = _ref9.pixelOffset;\n                var viewportProps = Object.assign({}, this._viewportProps);\n                if (Number.isFinite(zoom)) viewportProps.zoom = zoom;\n                if (startTarget) viewportProps.target = startTarget;\n                var viewport = this.makeViewport(viewportProps);\n                var center = viewport.project(viewportProps.target);\n                return viewport.unproject([\n                    center[0] - pixelOffset[0],\n                    center[1] - pixelOffset[1],\n                    center[2]\n                ]);\n            }\n        },\n        {\n            key: \"_getUpdatedState\",\n            value: function _getUpdatedState(newProps) {\n                return new OrbitState1(Object.assign({}, this._viewportProps, this._interactiveState, newProps));\n            }\n        },\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                var maxZoom = props.maxZoom, minZoom = props.minZoom, zoom = props.zoom, maxRotationX = props.maxRotationX, minRotationX = props.minRotationX, rotationOrbit = props.rotationOrbit;\n                props.zoom = (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n                props.rotationX = (0, _mathGl.clamp)(props.rotationX, minRotationX, maxRotationX);\n                if (rotationOrbit < -180 || rotationOrbit > 180) props.rotationOrbit = (0, _mathUtils.mod)(rotationOrbit + 180, 360) - 180;\n                return props;\n            }\n        }\n    ]);\n    return OrbitState1;\n}((0, _viewStateDefault.default));\nvar OrbitController = function(_Controller) {\n    (0, _inheritsDefault.default)(OrbitController1, _Controller);\n    var _super2 = _createSuper(OrbitController1);\n    function OrbitController1(props) {\n        (0, _classCallCheckDefault.default)(this, OrbitController1);\n        return _super2.call(this, OrbitState, props);\n    }\n    (0, _createClassDefault.default)(OrbitController1, [\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return LINEAR_TRANSITION_PROPS;\n            }\n        }\n    ]);\n    return OrbitController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"math.gl\":\"6aDAl\",\"./controller\":\"j3Tf5\",\"./view-state\":\"bvyJt\",\"../transitions/linear-interpolator\":\"8J7qW\",\"./transition-manager\":\"alxon\",\"../utils/math-utils\":\"jmX3c\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4neKz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>OrthographicView);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _viewport = require(\"../viewports/viewport\");\nvar _viewportDefault = parcelHelpers.interopDefault(_viewport);\nvar _mathGl = require(\"math.gl\");\nvar _orthographicController = require(\"../controllers/orthographic-controller\");\nvar _orthographicControllerDefault = parcelHelpers.interopDefault(_orthographicController);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar viewMatrix = new (0, _mathGl.Matrix4)().lookAt({\n    eye: [\n        0,\n        0,\n        1\n    ]\n});\nfunction getProjectionMatrix(_ref) {\n    var width = _ref.width, height = _ref.height, near = _ref.near, far = _ref.far;\n    width = width || 1;\n    height = height || 1;\n    return new (0, _mathGl.Matrix4)().ortho({\n        left: -width / 2,\n        right: width / 2,\n        bottom: height / 2,\n        top: -height / 2,\n        near: near,\n        far: far\n    });\n}\nvar OrthographicViewport = function(_Viewport) {\n    (0, _inheritsDefault.default)(OrthographicViewport1, _Viewport);\n    var _super = _createSuper(OrthographicViewport1);\n    function OrthographicViewport1(_ref2) {\n        var _this;\n        var id = _ref2.id, x = _ref2.x, y = _ref2.y, width = _ref2.width, height = _ref2.height, _ref2$near = _ref2.near, near = _ref2$near === void 0 ? 0.1 : _ref2$near, _ref2$far = _ref2.far, far = _ref2$far === void 0 ? 1000 : _ref2$far, _ref2$zoom = _ref2.zoom, zoom = _ref2$zoom === void 0 ? 0 : _ref2$zoom, _ref2$target = _ref2.target, target = _ref2$target === void 0 ? [\n            0,\n            0,\n            0\n        ] : _ref2$target;\n        (0, _classCallCheckDefault.default)(this, OrthographicViewport1);\n        var scale = Math.pow(2, zoom);\n        return (0, _possibleConstructorReturnDefault.default)(_this, new (0, _viewportDefault.default)({\n            id: id,\n            x: x,\n            y: y,\n            width: width,\n            height: height,\n            position: target,\n            viewMatrix: viewMatrix.clone().scale(scale),\n            projectionMatrix: getProjectionMatrix({\n                width: width,\n                height: height,\n                near: near,\n                far: far\n            }),\n            zoom: zoom\n        }));\n    }\n    return OrthographicViewport1;\n}((0, _viewportDefault.default));\nvar OrthographicView = function(_View) {\n    (0, _inheritsDefault.default)(OrthographicView1, _View);\n    var _super2 = _createSuper(OrthographicView1);\n    function OrthographicView1(props) {\n        (0, _classCallCheckDefault.default)(this, OrthographicView1);\n        return _super2.call(this, Object.assign({}, props, {\n            type: OrthographicViewport\n        }));\n    }\n    (0, _createClassDefault.default)(OrthographicView1, [\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _orthographicControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return OrthographicView1;\n}((0, _viewDefault.default));\nOrthographicView.displayName = \"OrthographicView\";\n\n},{\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./view\":\"d0jsQ\",\"../viewports/viewport\":\"jETN1\",\"math.gl\":\"6aDAl\",\"../controllers/orthographic-controller\":\"hh26F\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hh26F\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>OrthographicController);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _orbitController = require(\"./orbit-controller\");\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transitionManager = require(\"./transition-manager\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LINEAR_TRANSITION_PROPS = {\n    transitionDuration: 300,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)([\n        \"target\",\n        \"zoom\"\n    ]),\n    transitionInterruption: (0, _transitionManager.TRANSITION_EVENTS).BREAK\n};\nvar OrthographicController = function(_Controller) {\n    (0, _inheritsDefault.default)(OrthographicController1, _Controller);\n    var _super = _createSuper(OrthographicController1);\n    function OrthographicController1(props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, OrthographicController1);\n        _this = _super.call(this, (0, _orbitController.OrbitState), props);\n        _this.invertPan = true;\n        return _this;\n    }\n    (0, _createClassDefault.default)(OrthographicController1, [\n        {\n            key: \"_onPanRotate\",\n            value: function _onPanRotate(event) {\n                return false;\n            }\n        },\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return LINEAR_TRANSITION_PROPS;\n            }\n        }\n    ]);\n    return OrthographicController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./controller\":\"j3Tf5\",\"./orbit-controller\":\"4xiSq\",\"../transitions/linear-interpolator\":\"8J7qW\",\"./transition-manager\":\"alxon\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9oBnn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GlobeView);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _view = require(\"./view\");\nvar _viewDefault = parcelHelpers.interopDefault(_view);\nvar _globeViewport = require(\"../viewports/globe-viewport\");\nvar _globeViewportDefault = parcelHelpers.interopDefault(_globeViewport);\nvar _globeController = require(\"../controllers/globe-controller\");\nvar _globeControllerDefault = parcelHelpers.interopDefault(_globeController);\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar GlobeView = function(_View) {\n    (0, _inheritsDefault.default)(GlobeView1, _View);\n    var _super = _createSuper(GlobeView1);\n    function GlobeView1(props) {\n        (0, _classCallCheckDefault.default)(this, GlobeView1);\n        return _super.call(this, _objectSpread(_objectSpread({}, props), {}, {\n            type: (0, _globeViewportDefault.default)\n        }));\n    }\n    (0, _createClassDefault.default)(GlobeView1, [\n        {\n            key: \"controller\",\n            get: function get() {\n                return this._getControllerProps({\n                    type: (0, _globeControllerDefault.default)\n                });\n            }\n        }\n    ]);\n    return GlobeView1;\n}((0, _viewDefault.default));\nGlobeView.displayName = \"GlobeView\";\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./view\":\"d0jsQ\",\"../viewports/globe-viewport\":\"gqPD1\",\"../controllers/globe-controller\":\"k6wKr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k6wKr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GlobeController);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _mathGl = require(\"math.gl\");\nvar _controller = require(\"./controller\");\nvar _controllerDefault = parcelHelpers.interopDefault(_controller);\nvar _mapController = require(\"./map-controller\");\nvar _mathUtils = require(\"../utils/math-utils\");\nvar _linearInterpolator = require(\"../transitions/linear-interpolator\");\nvar _linearInterpolatorDefault = parcelHelpers.interopDefault(_linearInterpolator);\nvar _transitionManager = require(\"./transition-manager\");\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LINEAR_TRANSITION_PROPS = {\n    transitionDuration: 300,\n    transitionEasing: function transitionEasing(t) {\n        return t;\n    },\n    transitionInterpolator: new (0, _linearInterpolatorDefault.default)([\n        \"longitude\",\n        \"latitude\",\n        \"zoom\"\n    ]),\n    transitionInterruption: (0, _transitionManager.TRANSITION_EVENTS).BREAK\n};\nvar GlobeState = function(_MapState) {\n    (0, _inheritsDefault.default)(GlobeState1, _MapState);\n    var _super = _createSuper(GlobeState1);\n    function GlobeState1() {\n        (0, _classCallCheckDefault.default)(this, GlobeState1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(GlobeState1, [\n        {\n            key: \"_applyConstraints\",\n            value: function _applyConstraints(props) {\n                var maxZoom = props.maxZoom, minZoom = props.minZoom, zoom = props.zoom;\n                props.zoom = (0, _mathGl.clamp)(zoom, minZoom, maxZoom);\n                var longitude = props.longitude, latitude = props.latitude;\n                if (longitude < -180 || longitude > 180) props.longitude = (0, _mathUtils.mod)(longitude + 180, 360) - 180;\n                props.latitude = (0, _mathGl.clamp)(latitude, -89, 89);\n                return props;\n            }\n        }\n    ]);\n    return GlobeState1;\n}((0, _mapController.MapState));\nvar GlobeController = function(_Controller) {\n    (0, _inheritsDefault.default)(GlobeController1, _Controller);\n    var _super2 = _createSuper(GlobeController1);\n    function GlobeController1(props) {\n        var _this;\n        (0, _classCallCheckDefault.default)(this, GlobeController1);\n        _this = _super2.call(this, GlobeState, props);\n        _this.invertPan = true;\n        return _this;\n    }\n    (0, _createClassDefault.default)(GlobeController1, [\n        {\n            key: \"setProps\",\n            value: function setProps(props) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(GlobeController1.prototype), \"setProps\", this).call(this, props);\n                this.dragRotate = false;\n                this.touchRotate = false;\n            }\n        },\n        {\n            key: \"_getTransitionProps\",\n            value: function _getTransitionProps() {\n                return LINEAR_TRANSITION_PROPS;\n            }\n        }\n    ]);\n    return GlobeController1;\n}((0, _controllerDefault.default));\n\n},{\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"math.gl\":\"6aDAl\",\"./controller\":\"j3Tf5\",\"./map-controller\":\"e5pb1\",\"../utils/math-utils\":\"jmX3c\",\"../transitions/linear-interpolator\":\"8J7qW\",\"./transition-manager\":\"alxon\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kbBRx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>FlyToInterpolator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _transitionInterpolator = require(\"./transition-interpolator\");\nvar _transitionInterpolatorDefault = parcelHelpers.interopDefault(_transitionInterpolator);\nvar _mathGl = require(\"math.gl\");\nvar _webMercator = require(\"@math.gl/web-mercator\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar LINEARLY_INTERPOLATED_PROPS = [\n    \"bearing\",\n    \"pitch\"\n];\nvar DEFAULT_OPTS = {\n    speed: 1.2,\n    curve: 1.414\n};\nvar FlyToInterpolator = function(_TransitionInterpolat) {\n    (0, _inheritsDefault.default)(FlyToInterpolator1, _TransitionInterpolat);\n    var _super = _createSuper(FlyToInterpolator1);\n    function FlyToInterpolator1() {\n        var _this;\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, FlyToInterpolator1);\n        _this = _super.call(this, {\n            compare: [\n                \"longitude\",\n                \"latitude\",\n                \"zoom\",\n                \"bearing\",\n                \"pitch\"\n            ],\n            extract: [\n                \"width\",\n                \"height\",\n                \"longitude\",\n                \"latitude\",\n                \"zoom\",\n                \"bearing\",\n                \"pitch\"\n            ],\n            required: [\n                \"width\",\n                \"height\",\n                \"latitude\",\n                \"longitude\",\n                \"zoom\"\n            ]\n        });\n        _this.props = Object.assign({}, DEFAULT_OPTS, props);\n        return _this;\n    }\n    (0, _createClassDefault.default)(FlyToInterpolator1, [\n        {\n            key: \"interpolateProps\",\n            value: function interpolateProps(startProps, endProps, t) {\n                var viewport = (0, _webMercator.flyToViewport)(startProps, endProps, t, this.props);\n                var _iterator = _createForOfIteratorHelper(LINEARLY_INTERPOLATED_PROPS), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var key = _step.value;\n                        viewport[key] = (0, _mathGl.lerp)(startProps[key] || 0, endProps[key] || 0, t);\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return viewport;\n            }\n        },\n        {\n            key: \"getDuration\",\n            value: function getDuration(startProps, endProps) {\n                var transitionDuration = endProps.transitionDuration;\n                if (transitionDuration === \"auto\") transitionDuration = (0, _webMercator.getFlyToDuration)(startProps, endProps, this.props);\n                return transitionDuration;\n            }\n        }\n    ]);\n    return FlyToInterpolator1;\n}((0, _transitionInterpolatorDefault.default));\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./transition-interpolator\":\"6hSx4\",\"math.gl\":\"6aDAl\",\"@math.gl/web-mercator\":\"jS2l3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"98d8C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>Tesselator);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _iterableUtils = require(\"./iterable-utils\");\nvar _typedArrayManager = require(\"./typed-array-manager\");\nvar _typedArrayManagerDefault = parcelHelpers.interopDefault(_typedArrayManager);\nvar _assert = require(\"./assert\");\nvar _assertDefault = parcelHelpers.interopDefault(_assert);\nvar _core = require(\"@luma.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar Tesselator = function() {\n    function Tesselator1() {\n        var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, Tesselator1);\n        var _opts$attributes = opts.attributes, attributes = _opts$attributes === void 0 ? {} : _opts$attributes;\n        this.typedArrayManager = (0, _typedArrayManagerDefault.default);\n        this.indexStarts = null;\n        this.vertexStarts = null;\n        this.vertexCount = 0;\n        this.instanceCount = 0;\n        this.attributes = {};\n        this._attributeDefs = attributes;\n        this.opts = opts;\n        this.updateGeometry(opts);\n        Object.seal(this);\n    }\n    (0, _createClassDefault.default)(Tesselator1, [\n        {\n            key: \"updateGeometry\",\n            value: function updateGeometry(opts) {\n                Object.assign(this.opts, opts);\n                var _this$opts = this.opts, data = _this$opts.data, _this$opts$buffers = _this$opts.buffers, buffers = _this$opts$buffers === void 0 ? {} : _this$opts$buffers, getGeometry = _this$opts.getGeometry, geometryBuffer = _this$opts.geometryBuffer, positionFormat = _this$opts.positionFormat, dataChanged = _this$opts.dataChanged, _this$opts$normalize = _this$opts.normalize, normalize = _this$opts$normalize === void 0 ? true : _this$opts$normalize;\n                this.data = data;\n                this.getGeometry = getGeometry;\n                this.positionSize = geometryBuffer && geometryBuffer.size || (positionFormat === \"XY\" ? 2 : 3);\n                this.buffers = buffers;\n                this.normalize = normalize;\n                if (geometryBuffer) {\n                    (0, _assertDefault.default)(data.startIndices, \"binary data missing startIndices\");\n                    this.getGeometry = this.getGeometryFromBuffer(geometryBuffer);\n                    if (!normalize) buffers.positions = geometryBuffer;\n                }\n                this.geometryBuffer = buffers.positions;\n                if (Array.isArray(dataChanged)) {\n                    var _iterator = _createForOfIteratorHelper(dataChanged), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var dataRange = _step.value;\n                            this._rebuildGeometry(dataRange);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                } else this._rebuildGeometry();\n            }\n        },\n        {\n            key: \"updatePartialGeometry\",\n            value: function updatePartialGeometry(_ref) {\n                var startRow = _ref.startRow, endRow = _ref.endRow;\n                this._rebuildGeometry({\n                    startRow: startRow,\n                    endRow: endRow\n                });\n            }\n        },\n        {\n            key: \"normalizeGeometry\",\n            value: function normalizeGeometry(geometry) {\n                return geometry;\n            }\n        },\n        {\n            key: \"updateGeometryAttributes\",\n            value: function updateGeometryAttributes(geometry, startIndex, size) {\n                throw new Error(\"Not implemented\");\n            }\n        },\n        {\n            key: \"getGeometrySize\",\n            value: function getGeometrySize(geometry) {\n                throw new Error(\"Not implemented\");\n            }\n        },\n        {\n            key: \"getGeometryFromBuffer\",\n            value: function getGeometryFromBuffer(geometryBuffer) {\n                var value = geometryBuffer.value || geometryBuffer;\n                (0, _assertDefault.default)(ArrayBuffer.isView(value), \"cannot read geometries\");\n                return (0, _iterableUtils.getAccessorFromBuffer)(value, {\n                    size: this.positionSize,\n                    offset: geometryBuffer.offset,\n                    stride: geometryBuffer.stride,\n                    startIndices: this.data.startIndices\n                });\n            }\n        },\n        {\n            key: \"_allocate\",\n            value: function _allocate(instanceCount, copy) {\n                var attributes = this.attributes, buffers = this.buffers, _attributeDefs = this._attributeDefs, typedArrayManager = this.typedArrayManager;\n                for(var name in _attributeDefs)if (name in buffers) {\n                    typedArrayManager.release(attributes[name]);\n                    attributes[name] = null;\n                } else {\n                    var def = _attributeDefs[name];\n                    def.copy = copy;\n                    attributes[name] = typedArrayManager.allocate(attributes[name], instanceCount, def);\n                }\n            }\n        },\n        {\n            key: \"_forEachGeometry\",\n            value: function _forEachGeometry(visitor, startRow, endRow) {\n                var data = this.data, getGeometry = this.getGeometry;\n                var _createIterable = (0, _iterableUtils.createIterable)(data, startRow, endRow), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n                var _iterator2 = _createForOfIteratorHelper(iterable), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var object = _step2.value;\n                        objectInfo.index++;\n                        var geometry = getGeometry(object, objectInfo);\n                        visitor(geometry, objectInfo.index);\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n            }\n        },\n        {\n            key: \"_rebuildGeometry\",\n            value: function _rebuildGeometry(dataRange) {\n                var _this = this;\n                if (!this.data || !this.getGeometry) return;\n                var indexStarts = this.indexStarts, vertexStarts = this.vertexStarts, instanceCount = this.instanceCount;\n                var data = this.data, geometryBuffer = this.geometryBuffer;\n                var _ref2 = dataRange || {}, _ref2$startRow = _ref2.startRow, startRow = _ref2$startRow === void 0 ? 0 : _ref2$startRow, _ref2$endRow = _ref2.endRow, endRow = _ref2$endRow === void 0 ? Infinity : _ref2$endRow;\n                var normalizedData = {};\n                if (!dataRange) {\n                    indexStarts = [\n                        0\n                    ];\n                    vertexStarts = [\n                        0\n                    ];\n                }\n                if (this.normalize || !geometryBuffer) {\n                    this._forEachGeometry(function(geometry, dataIndex) {\n                        geometry = _this.normalizeGeometry(geometry);\n                        normalizedData[dataIndex] = geometry;\n                        vertexStarts[dataIndex + 1] = vertexStarts[dataIndex] + _this.getGeometrySize(geometry);\n                    }, startRow, endRow);\n                    instanceCount = vertexStarts[vertexStarts.length - 1];\n                } else if (geometryBuffer.buffer instanceof (0, _core.Buffer)) {\n                    var byteStride = geometryBuffer.stride || this.positionSize * 4;\n                    vertexStarts = data.startIndices;\n                    instanceCount = vertexStarts[data.length] || geometryBuffer.buffer.byteLength / byteStride;\n                } else {\n                    var bufferValue = geometryBuffer.value || geometryBuffer;\n                    var elementStride = geometryBuffer.stride / bufferValue.BYTES_PER_ELEMENT || this.positionSize;\n                    vertexStarts = data.startIndices;\n                    instanceCount = vertexStarts[data.length] || bufferValue.length / elementStride;\n                }\n                this._allocate(instanceCount, Boolean(dataRange));\n                this.indexStarts = indexStarts;\n                this.vertexStarts = vertexStarts;\n                this.instanceCount = instanceCount;\n                var context = {};\n                this._forEachGeometry(function(geometry, dataIndex) {\n                    geometry = normalizedData[dataIndex] || geometry;\n                    context.vertexStart = vertexStarts[dataIndex];\n                    context.indexStart = indexStarts[dataIndex];\n                    var vertexEnd = dataIndex < vertexStarts.length - 1 ? vertexStarts[dataIndex + 1] : instanceCount;\n                    context.geometrySize = vertexEnd - vertexStarts[dataIndex];\n                    context.geometryIndex = dataIndex;\n                    _this.updateGeometryAttributes(geometry, context);\n                }, startRow, endRow);\n                this.vertexCount = indexStarts[indexStarts.length - 1];\n            }\n        }\n    ]);\n    return Tesselator1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"./iterable-utils\":\"8gMuf\",\"./typed-array-manager\":\"91rvg\",\"./assert\":\"8goZO\",\"@luma.gl/core\":\"bW3Qv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"286Y0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ArcLayer\", ()=>(0, _arcLayerDefault.default));\nparcelHelpers.export(exports, \"BitmapLayer\", ()=>(0, _bitmapLayerDefault.default));\nparcelHelpers.export(exports, \"IconLayer\", ()=>(0, _iconLayerDefault.default));\nparcelHelpers.export(exports, \"LineLayer\", ()=>(0, _lineLayerDefault.default));\nparcelHelpers.export(exports, \"PointCloudLayer\", ()=>(0, _pointCloudLayerDefault.default));\nparcelHelpers.export(exports, \"ScatterplotLayer\", ()=>(0, _scatterplotLayerDefault.default));\nparcelHelpers.export(exports, \"ColumnLayer\", ()=>(0, _columnLayerDefault.default));\nparcelHelpers.export(exports, \"GridCellLayer\", ()=>(0, _gridCellLayerDefault.default));\nparcelHelpers.export(exports, \"PathLayer\", ()=>(0, _pathLayerDefault.default));\nparcelHelpers.export(exports, \"PolygonLayer\", ()=>(0, _polygonLayerDefault.default));\nparcelHelpers.export(exports, \"GeoJsonLayer\", ()=>(0, _geojsonLayerDefault.default));\nparcelHelpers.export(exports, \"TextLayer\", ()=>(0, _textLayerDefault.default));\nparcelHelpers.export(exports, \"SolidPolygonLayer\", ()=>(0, _solidPolygonLayerDefault.default));\nparcelHelpers.export(exports, \"_MultiIconLayer\", ()=>(0, _multiIconLayerDefault.default));\nvar _arcLayer = require(\"./arc-layer/arc-layer\");\nvar _arcLayerDefault = parcelHelpers.interopDefault(_arcLayer);\nvar _bitmapLayer = require(\"./bitmap-layer/bitmap-layer\");\nvar _bitmapLayerDefault = parcelHelpers.interopDefault(_bitmapLayer);\nvar _iconLayer = require(\"./icon-layer/icon-layer\");\nvar _iconLayerDefault = parcelHelpers.interopDefault(_iconLayer);\nvar _lineLayer = require(\"./line-layer/line-layer\");\nvar _lineLayerDefault = parcelHelpers.interopDefault(_lineLayer);\nvar _pointCloudLayer = require(\"./point-cloud-layer/point-cloud-layer\");\nvar _pointCloudLayerDefault = parcelHelpers.interopDefault(_pointCloudLayer);\nvar _scatterplotLayer = require(\"./scatterplot-layer/scatterplot-layer\");\nvar _scatterplotLayerDefault = parcelHelpers.interopDefault(_scatterplotLayer);\nvar _columnLayer = require(\"./column-layer/column-layer\");\nvar _columnLayerDefault = parcelHelpers.interopDefault(_columnLayer);\nvar _gridCellLayer = require(\"./column-layer/grid-cell-layer\");\nvar _gridCellLayerDefault = parcelHelpers.interopDefault(_gridCellLayer);\nvar _pathLayer = require(\"./path-layer/path-layer\");\nvar _pathLayerDefault = parcelHelpers.interopDefault(_pathLayer);\nvar _polygonLayer = require(\"./polygon-layer/polygon-layer\");\nvar _polygonLayerDefault = parcelHelpers.interopDefault(_polygonLayer);\nvar _geojsonLayer = require(\"./geojson-layer/geojson-layer\");\nvar _geojsonLayerDefault = parcelHelpers.interopDefault(_geojsonLayer);\nvar _textLayer = require(\"./text-layer/text-layer\");\nvar _textLayerDefault = parcelHelpers.interopDefault(_textLayer);\nvar _solidPolygonLayer = require(\"./solid-polygon-layer/solid-polygon-layer\");\nvar _solidPolygonLayerDefault = parcelHelpers.interopDefault(_solidPolygonLayer);\nvar _multiIconLayer = require(\"./text-layer/multi-icon-layer/multi-icon-layer\");\nvar _multiIconLayerDefault = parcelHelpers.interopDefault(_multiIconLayer);\n\n},{\"./arc-layer/arc-layer\":\"j8uOn\",\"./bitmap-layer/bitmap-layer\":\"401oz\",\"./icon-layer/icon-layer\":\"ezXyS\",\"./line-layer/line-layer\":\"foBKL\",\"./point-cloud-layer/point-cloud-layer\":\"a7eCX\",\"./scatterplot-layer/scatterplot-layer\":\"6DigI\",\"./column-layer/column-layer\":\"f0jHB\",\"./column-layer/grid-cell-layer\":\"7GdRF\",\"./path-layer/path-layer\":\"2wFY0\",\"./polygon-layer/polygon-layer\":\"jexah\",\"./geojson-layer/geojson-layer\":\"81n7g\",\"./text-layer/text-layer\":\"3TOYQ\",\"./solid-polygon-layer/solid-polygon-layer\":\"89crq\",\"./text-layer/multi-icon-layer/multi-icon-layer\":\"8E73M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j8uOn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ArcLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _arcLayerVertexGlsl = require(\"./arc-layer-vertex.glsl\");\nvar _arcLayerVertexGlslDefault = parcelHelpers.interopDefault(_arcLayerVertexGlsl);\nvar _arcLayerFragmentGlsl = require(\"./arc-layer-fragment.glsl\");\nvar _arcLayerFragmentGlslDefault = parcelHelpers.interopDefault(_arcLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    getSourcePosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.sourcePosition;\n        }\n    },\n    getTargetPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.targetPosition;\n        }\n    },\n    getSourceColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getTargetColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    getHeight: {\n        type: \"accessor\",\n        value: 1\n    },\n    getTilt: {\n        type: \"accessor\",\n        value: 0\n    },\n    greatCircle: false,\n    widthUnits: \"pixels\",\n    widthScale: {\n        type: \"number\",\n        value: 1,\n        min: 0\n    },\n    widthMinPixels: {\n        type: \"number\",\n        value: 0,\n        min: 0\n    },\n    widthMaxPixels: {\n        type: \"number\",\n        value: Number.MAX_SAFE_INTEGER,\n        min: 0\n    }\n};\nvar ArcLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(ArcLayer1, _Layer);\n    var _super = _createSuper(ArcLayer1);\n    function ArcLayer1() {\n        (0, _classCallCheckDefault.default)(this, ArcLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(ArcLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ArcLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _arcLayerVertexGlslDefault.default),\n                    fs: (0, _arcLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instanceSourcePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getSourcePosition\"\n                    },\n                    instanceTargetPositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getTargetPosition\"\n                    },\n                    instanceSourceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getSourceColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceTargetColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getTargetColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceWidths: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getWidth\",\n                        defaultValue: 1\n                    },\n                    instanceHeights: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getHeight\",\n                        defaultValue: 1\n                    },\n                    instanceTilts: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getTilt\",\n                        defaultValue: 0\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ArcLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, widthUnits = _this$props.widthUnits, widthScale = _this$props.widthScale, widthMinPixels = _this$props.widthMinPixels, widthMaxPixels = _this$props.widthMaxPixels, greatCircle = _this$props.greatCircle;\n                var widthMultiplier = widthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(uniforms).setUniforms({\n                    greatCircle: greatCircle,\n                    widthScale: widthScale * widthMultiplier,\n                    widthMinPixels: widthMinPixels,\n                    widthMaxPixels: widthMaxPixels\n                }).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [];\n                var NUM_SEGMENTS = 50;\n                for(var i = 0; i < NUM_SEGMENTS; i++)positions = positions.concat([\n                    i,\n                    1,\n                    0,\n                    i,\n                    -1,\n                    0\n                ]);\n                var model = new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 5,\n                        attributes: {\n                            positions: new Float32Array(positions)\n                        }\n                    }),\n                    isInstanced: true\n                }));\n                model.setUniforms({\n                    numSegments: NUM_SEGMENTS\n                });\n                return model;\n            }\n        }\n    ]);\n    return ArcLayer1;\n}((0, _core.Layer));\nArcLayer.layerName = \"ArcLayer\";\nArcLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./arc-layer-vertex.glsl\":\"LLxQF\",\"./arc-layer-fragment.glsl\":\"bu7at\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"LLxQF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME arc-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec4 instanceSourceColors;\\nattribute vec4 instanceTargetColors;\\nattribute vec3 instanceSourcePositions;\\nattribute vec3 instanceSourcePositions64Low;\\nattribute vec3 instanceTargetPositions;\\nattribute vec3 instanceTargetPositions64Low;\\nattribute vec3 instancePickingColors;\\nattribute float instanceWidths;\\nattribute float instanceHeights;\\nattribute float instanceTilts;\\n\\nuniform bool greatCircle;\\nuniform float numSegments;\\nuniform float opacity;\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\n\\nvarying vec4 vColor;\\nvarying vec2 uv;\\nvarying float isValid;\\n\\nfloat paraboloid(float distance, float sourceZ, float targetZ, float ratio) {\\n\\n  float deltaZ = targetZ - sourceZ;\\n  float dh = distance * instanceHeights;\\n  float unitZ = dh == 0.0 ? 0.0 : deltaZ / dh;\\n  float p2 = unitZ * unitZ + 1.0;\\n  float dir = step(deltaZ, 0.0);\\n  float z0 = mix(sourceZ, targetZ, dir);\\n  float r = mix(ratio, 1.0 - ratio, dir);\\n  return sqrt(r * (p2 - r)) * dh + z0;\\n}\\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction, float width) {\\n  vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\\n  dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\\n\\n  return dir_screenspace * offset_direction * width / 2.0;\\n}\\n\\nfloat getSegmentRatio(float index) {\\n  return smoothstep(0.0, 1.0, index / (numSegments - 1.0));\\n}\\n\\nvec3 interpolateFlat(vec3 source, vec3 target, float segmentRatio) {\\n  float distance = length(source.xy - target.xy);\\n  float z = paraboloid(distance, source.z, target.z, segmentRatio);\\n\\n  float tiltAngle = radians(instanceTilts);\\n  vec2 tiltDirection = normalize(target.xy - source.xy);\\n  vec2 tilt = vec2(-tiltDirection.y, tiltDirection.x) * z * sin(tiltAngle);\\n\\n  return vec3(\\n    mix(source.xy, target.xy, segmentRatio) + tilt,\\n    z * cos(tiltAngle)\\n  );\\n}\\nfloat getAngularDist (vec2 source, vec2 target) {\\n  vec2 sourceRadians = radians(source);\\n  vec2 targetRadians = radians(target);\\n  vec2 sin_half_delta = sin((sourceRadians - targetRadians) / 2.0);\\n  vec2 shd_sq = sin_half_delta * sin_half_delta;\\n\\n  float a = shd_sq.y + cos(sourceRadians.y) * cos(targetRadians.y) * shd_sq.x;\\n  return 2.0 * asin(sqrt(a));\\n}\\n\\nvec3 interpolateGreatCircle(vec3 source, vec3 target, vec3 source3D, vec3 target3D, float angularDist, float t) {\\n  vec2 lngLat;\\n  if(abs(angularDist - PI) < 0.001) {\\n    lngLat = (1.0 - t) * source.xy + t * target.xy;\\n  } else {\\n    float a = sin((1.0 - t) * angularDist);\\n    float b = sin(t * angularDist);\\n    vec3 p = source3D.yxz * a + target3D.yxz * b;\\n    lngLat = degrees(vec2(atan(p.y, -p.x), atan(p.z, length(p.xy))));\\n  }\\n\\n  float z = paraboloid(angularDist * EARTH_RADIUS, source.z, target.z, t);\\n\\n  return vec3(lngLat, z);\\n}\\n\\nvoid main(void) {\\n  geometry.worldPosition = instanceSourcePositions;\\n  geometry.worldPositionAlt = instanceTargetPositions;\\n\\n  float segmentIndex = positions.x;\\n  float segmentRatio = getSegmentRatio(segmentIndex);\\n  float indexDir = mix(-1.0, 1.0, step(segmentIndex, 0.0));\\n  isValid = 1.0;\\n\\n  uv = vec2(segmentRatio, positions.y);\\n  geometry.uv = uv;\\n  geometry.pickingColor = instancePickingColors;\\n\\n  vec4 curr;\\n  vec4 next;\\n  vec3 source;\\n  vec3 target;\\n\\n  if ((greatCircle || project_uProjectionMode == PROJECTION_MODE_GLOBE) && project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT) {\\n    source = project_globe_(vec3(instanceSourcePositions.xy, 0.0));\\n    target = project_globe_(vec3(instanceTargetPositions.xy, 0.0));\\n    float angularDist = getAngularDist(instanceSourcePositions.xy, instanceTargetPositions.xy);\\n  \\n    float prevSegmentRatio = getSegmentRatio(max(0.0, segmentIndex - 1.0));\\n    float nextSegmentRatio = getSegmentRatio(min(numSegments, segmentIndex + 1.0));\\n\\n    vec3 prevPos = interpolateGreatCircle(instanceSourcePositions, instanceTargetPositions, source, target, angularDist, prevSegmentRatio);\\n    vec3 currPos = interpolateGreatCircle(instanceSourcePositions, instanceTargetPositions, source, target, angularDist, segmentRatio);\\n    vec3 nextPos = interpolateGreatCircle(instanceSourcePositions, instanceTargetPositions, source, target, angularDist, nextSegmentRatio);\\n\\n    if (abs(currPos.x - prevPos.x) > 180.0) {\\n      indexDir = -1.0;\\n      isValid = 0.0;\\n    } else if (abs(currPos.x - nextPos.x) > 180.0) {\\n      indexDir = 1.0;\\n      isValid = 0.0;\\n    }\\n    nextPos = indexDir < 0.0 ? prevPos : nextPos;\\n    nextSegmentRatio = indexDir < 0.0 ? prevSegmentRatio : nextSegmentRatio;\\n\\n    if (isValid == 0.0) {\\n      nextPos.x += nextPos.x > 0.0 ? -360.0 : 360.0;\\n      float t = ((currPos.x > 0.0 ? 180.0 : -180.0) - currPos.x) / (nextPos.x - currPos.x);\\n      currPos = mix(currPos, nextPos, t);\\n      segmentRatio = mix(segmentRatio, nextSegmentRatio, t);\\n    }\\n\\n    vec3 currPos64Low = mix(instanceSourcePositions64Low, instanceTargetPositions64Low, segmentRatio);\\n    vec3 nextPos64Low = mix(instanceSourcePositions64Low, instanceTargetPositions64Low, nextSegmentRatio);\\n  \\n    curr = project_position_to_clipspace(currPos, currPos64Low, vec3(0.0), geometry.position);\\n    next = project_position_to_clipspace(nextPos, nextPos64Low, vec3(0.0));\\n  \\n  } else {\\n    source = project_position(instanceSourcePositions, instanceSourcePositions64Low);\\n    target = project_position(instanceTargetPositions, instanceTargetPositions64Low);\\n\\n    float nextSegmentRatio = getSegmentRatio(segmentIndex + indexDir);\\n    vec3 currPos = interpolateFlat(source, target, segmentRatio);\\n    vec3 nextPos = interpolateFlat(source, target, nextSegmentRatio);\\n    curr = project_common_position_to_clipspace(vec4(currPos, 1.0));\\n    next = project_common_position_to_clipspace(vec4(nextPos, 1.0));\\n    geometry.position = vec4(currPos, 1.0);\\n  }\\n  float widthPixels = clamp(\\n    project_size_to_pixel(instanceWidths * widthScale),\\n    widthMinPixels, widthMaxPixels\\n  );\\n  vec3 offset = vec3(\\n    getExtrusionOffset((next.xy - curr.xy) * indexDir, positions.y, widthPixels),\\n    0.0);\\n  DECKGL_FILTER_SIZE(offset, geometry);\\n  gl_Position = curr + vec4(project_pixel_size_to_clipspace(offset.xy), 0.0, 0.0);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n\\n  vec4 color = mix(instanceSourceColors, instanceTargetColors, segmentRatio);\\n  vColor = vec4(color.rgb, color.a * opacity);\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bu7at\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME arc-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying vec2 uv;\\nvarying float isValid;\\n\\nvoid main(void) {\\n  if (isValid == 0.0) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vColor;\\n  geometry.uv = uv;\\n\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"401oz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>BitmapLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _createMesh = require(\"./create-mesh\");\nvar _createMeshDefault = parcelHelpers.interopDefault(_createMesh);\nvar _bitmapLayerVertex = require(\"./bitmap-layer-vertex\");\nvar _bitmapLayerVertexDefault = parcelHelpers.interopDefault(_bitmapLayerVertex);\nvar _bitmapLayerFragment = require(\"./bitmap-layer-fragment\");\nvar _bitmapLayerFragmentDefault = parcelHelpers.interopDefault(_bitmapLayerFragment);\nvar _DEFAULT_TEXTURE_PARA;\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_TEXTURE_PARAMETERS = (_DEFAULT_TEXTURE_PARA = {}, (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10241, 9987), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10240, 9729), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10242, 33071), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10243, 33071), _DEFAULT_TEXTURE_PARA);\nvar defaultProps = {\n    image: {\n        type: \"object\",\n        value: null,\n        async: true\n    },\n    bounds: {\n        type: \"array\",\n        value: [\n            1,\n            0,\n            0,\n            1\n        ],\n        compare: true\n    },\n    desaturate: {\n        type: \"number\",\n        min: 0,\n        max: 1,\n        value: 0\n    },\n    transparentColor: {\n        type: \"color\",\n        value: [\n            0,\n            0,\n            0,\n            0\n        ]\n    },\n    tintColor: {\n        type: \"color\",\n        value: [\n            255,\n            255,\n            255\n        ]\n    }\n};\nvar BitmapLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(BitmapLayer1, _Layer);\n    var _super = _createSuper(BitmapLayer1);\n    function BitmapLayer1() {\n        (0, _classCallCheckDefault.default)(this, BitmapLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(BitmapLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(BitmapLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _bitmapLayerVertexDefault.default),\n                    fs: (0, _bitmapLayerFragmentDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                var attributeManager = this.getAttributeManager();\n                attributeManager.remove([\n                    \"instancePickingColors\"\n                ]);\n                var noAlloc = true;\n                attributeManager.add({\n                    indices: {\n                        size: 1,\n                        isIndexed: true,\n                        update: function update(attribute) {\n                            return attribute.value = _this.state.mesh.indices;\n                        },\n                        noAlloc: noAlloc\n                    },\n                    positions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        update: function update(attribute) {\n                            return attribute.value = _this.state.mesh.positions;\n                        },\n                        noAlloc: noAlloc\n                    },\n                    texCoords: {\n                        size: 2,\n                        update: function update(attribute) {\n                            return attribute.value = _this.state.mesh.texCoords;\n                        },\n                        noAlloc: noAlloc\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n                if (props.image !== oldProps.image) this.loadTexture(props.image);\n                var attributeManager = this.getAttributeManager();\n                if (props.bounds !== oldProps.bounds) {\n                    var oldMesh = this.state.mesh;\n                    var mesh = this._createMesh();\n                    this.state.model.setVertexCount(mesh.vertexCount);\n                    for(var key in mesh)if (oldMesh && oldMesh[key] !== mesh[key]) attributeManager.invalidate(key);\n                    this.setState({\n                        mesh: mesh\n                    });\n                }\n            }\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState() {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(BitmapLayer1.prototype), \"finalizeState\", this).call(this);\n                if (this.state.bitmapTexture) this.state.bitmapTexture[\"delete\"]();\n            }\n        },\n        {\n            key: \"_createMesh\",\n            value: function _createMesh() {\n                var bounds = this.props.bounds;\n                var normalizedBounds = bounds;\n                if (Number.isFinite(bounds[0])) normalizedBounds = [\n                    [\n                        bounds[0],\n                        bounds[1]\n                    ],\n                    [\n                        bounds[0],\n                        bounds[3]\n                    ],\n                    [\n                        bounds[2],\n                        bounds[3]\n                    ],\n                    [\n                        bounds[2],\n                        bounds[1]\n                    ]\n                ];\n                return (0, _createMeshDefault.default)(normalizedBounds, this.context.viewport.resolution);\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                if (!gl) return null;\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 4,\n                        vertexCount: 6\n                    }),\n                    isInstanced: false\n                }));\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(opts) {\n                var uniforms = opts.uniforms;\n                var _this$state = this.state, bitmapTexture = _this$state.bitmapTexture, model = _this$state.model;\n                var _this$props = this.props, image = _this$props.image, desaturate = _this$props.desaturate, transparentColor = _this$props.transparentColor, tintColor = _this$props.tintColor;\n                if (bitmapTexture && image instanceof HTMLVideoElement && image.readyState > HTMLVideoElement.HAVE_METADATA) {\n                    var sizeChanged = bitmapTexture.width !== image.videoWidth || bitmapTexture.height !== image.videoHeight;\n                    if (sizeChanged) {\n                        bitmapTexture.resize({\n                            width: image.videoWidth,\n                            height: image.videoHeight,\n                            mipmaps: true\n                        });\n                        bitmapTexture.setSubImageData({\n                            data: image,\n                            parameters: DEFAULT_TEXTURE_PARAMETERS\n                        });\n                    } else bitmapTexture.setSubImageData({\n                        data: image\n                    });\n                    bitmapTexture.generateMipmap();\n                }\n                if (bitmapTexture && model) model.setUniforms(Object.assign({}, uniforms, {\n                    bitmapTexture: bitmapTexture,\n                    desaturate: desaturate,\n                    transparentColor: transparentColor.map(function(x) {\n                        return x / 255;\n                    }),\n                    tintColor: tintColor.slice(0, 3).map(function(x) {\n                        return x / 255;\n                    })\n                })).draw();\n            }\n        },\n        {\n            key: \"loadTexture\",\n            value: function loadTexture(image) {\n                var gl = this.context.gl;\n                if (this.state.bitmapTexture) this.state.bitmapTexture[\"delete\"]();\n                if (image instanceof (0, _core1.Texture2D)) this.setState({\n                    bitmapTexture: image\n                });\n                else if (image instanceof HTMLVideoElement) this.setState({\n                    bitmapTexture: new (0, _core1.Texture2D)(gl, {\n                        width: 1,\n                        height: 1,\n                        parameters: DEFAULT_TEXTURE_PARAMETERS,\n                        mipmaps: false\n                    })\n                });\n                else if (image) this.setState({\n                    bitmapTexture: new (0, _core1.Texture2D)(gl, {\n                        data: image,\n                        parameters: DEFAULT_TEXTURE_PARAMETERS\n                    })\n                });\n            }\n        }\n    ]);\n    return BitmapLayer1;\n}((0, _core.Layer));\nBitmapLayer.layerName = \"BitmapLayer\";\nBitmapLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./create-mesh\":\"c7Yjk\",\"./bitmap-layer-vertex\":\"k5zSo\",\"./bitmap-layer-fragment\":\"dbUlp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c7Yjk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathGl = require(\"math.gl\");\nvar DEFAULT_INDICES = new Uint16Array([\n    0,\n    2,\n    1,\n    0,\n    3,\n    2\n]);\nvar DEFAULT_TEX_COORDS = new Float32Array([\n    0,\n    1,\n    0,\n    0,\n    1,\n    0,\n    1,\n    1\n]);\nfunction createMesh(bounds, resolution) {\n    if (!resolution) return createQuad(bounds);\n    var maxXSpan = Math.max(Math.abs(bounds[0][0] - bounds[3][0]), Math.abs(bounds[1][0] - bounds[2][0]));\n    var maxYSpan = Math.max(Math.abs(bounds[1][1] - bounds[0][1]), Math.abs(bounds[2][1] - bounds[3][1]));\n    var uCount = Math.ceil(maxXSpan / resolution) + 1;\n    var vCount = Math.ceil(maxYSpan / resolution) + 1;\n    var vertexCount = (uCount - 1) * (vCount - 1) * 6;\n    var indices = new Uint32Array(vertexCount);\n    var texCoords = new Float32Array(uCount * vCount * 2);\n    var positions = new Float64Array(uCount * vCount * 3);\n    var vertex = 0;\n    var index = 0;\n    for(var u = 0; u < uCount; u++){\n        var ut = u / (uCount - 1);\n        for(var v = 0; v < vCount; v++){\n            var vt = v / (vCount - 1);\n            var p = interpolateQuad(bounds, ut, vt);\n            positions[vertex * 3 + 0] = p[0];\n            positions[vertex * 3 + 1] = p[1];\n            positions[vertex * 3 + 2] = p[2] || 0;\n            texCoords[vertex * 2 + 0] = ut;\n            texCoords[vertex * 2 + 1] = 1 - vt;\n            if (u > 0 && v > 0) {\n                indices[index++] = vertex - vCount;\n                indices[index++] = vertex - vCount - 1;\n                indices[index++] = vertex - 1;\n                indices[index++] = vertex - vCount;\n                indices[index++] = vertex - 1;\n                indices[index++] = vertex;\n            }\n            vertex++;\n        }\n    }\n    return {\n        vertexCount: vertexCount,\n        positions: positions,\n        indices: indices,\n        texCoords: texCoords\n    };\n}\nexports.default = createMesh;\nfunction createQuad(bounds) {\n    var positions = new Float64Array(12);\n    for(var i = 0; i < bounds.length; i++){\n        positions[i * 3 + 0] = bounds[i][0];\n        positions[i * 3 + 1] = bounds[i][1];\n        positions[i * 3 + 2] = bounds[i][2] || 0;\n    }\n    return {\n        vertexCount: 6,\n        positions: positions,\n        indices: DEFAULT_INDICES,\n        texCoords: DEFAULT_TEX_COORDS\n    };\n}\nfunction interpolateQuad(quad, ut, vt) {\n    return (0, _mathGl.lerp)((0, _mathGl.lerp)(quad[0], quad[1], vt), (0, _mathGl.lerp)(quad[3], quad[2], vt), ut);\n}\n\n},{\"math.gl\":\"6aDAl\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k5zSo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\n#define SHADER_NAME bitmap-layer-vertex-shader\\n\\nattribute vec2 texCoords;\\nattribute vec3 positions;\\nattribute vec3 positions64Low;\\n\\nvarying vec2 vTexCoord;\\n\\nconst vec3 pickingColor = vec3(1.0, 0.0, 0.0);\\n\\nvoid main(void) {\\n  geometry.worldPosition = positions;\\n  geometry.uv = texCoords;\\n  geometry.pickingColor = pickingColor;\\n\\n  gl_Position = project_position_to_clipspace(positions, positions64Low, vec3(0.0), geometry.position);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n\\n  vTexCoord = texCoords;\\n\\n  vec4 color = vec4(0.0);\\n  DECKGL_FILTER_COLOR(color, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dbUlp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\n#define SHADER_NAME bitmap-layer-fragment-shader\\n\\n#ifdef GL_ES\\nprecision highp float;\\n#endif\\n\\nuniform sampler2D bitmapTexture;\\n\\nvarying vec2 vTexCoord;\\n\\nuniform float desaturate;\\nuniform vec4 transparentColor;\\nuniform vec3 tintColor;\\nuniform float opacity;\\n\\n// apply desaturation\\nvec3 color_desaturate(vec3 color) {\\n  float luminance = (color.r + color.g + color.b) * 0.333333333;\\n  return mix(color, vec3(luminance), desaturate);\\n}\\n\\n// apply tint\\nvec3 color_tint(vec3 color) {\\n  return color * tintColor;\\n}\\n\\n// blend with background color\\nvec4 apply_opacity(vec3 color, float alpha) {\\n  return mix(transparentColor, vec4(color, 1.0), alpha);\\n}\\n\\nvoid main(void) {\\n  vec4 bitmapColor = texture2D(bitmapTexture, vTexCoord);\\n\\n  gl_FragColor = apply_opacity(color_tint(color_desaturate(bitmapColor.rgb)), bitmapColor.a * opacity);\\n\\n  geometry.uv = vTexCoord;\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ezXyS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>IconLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _iconLayerVertexGlsl = require(\"./icon-layer-vertex.glsl\");\nvar _iconLayerVertexGlslDefault = parcelHelpers.interopDefault(_iconLayerVertexGlsl);\nvar _iconLayerFragmentGlsl = require(\"./icon-layer-fragment.glsl\");\nvar _iconLayerFragmentGlslDefault = parcelHelpers.interopDefault(_iconLayerFragmentGlsl);\nvar _iconManager = require(\"./icon-manager\");\nvar _iconManagerDefault = parcelHelpers.interopDefault(_iconManager);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    iconAtlas: {\n        type: \"object\",\n        value: null,\n        async: true\n    },\n    iconMapping: {\n        type: \"object\",\n        value: {},\n        async: true\n    },\n    sizeScale: {\n        type: \"number\",\n        value: 1,\n        min: 0\n    },\n    billboard: true,\n    sizeUnits: \"pixels\",\n    sizeMinPixels: {\n        type: \"number\",\n        min: 0,\n        value: 0\n    },\n    sizeMaxPixels: {\n        type: \"number\",\n        min: 0,\n        value: Number.MAX_SAFE_INTEGER\n    },\n    alphaCutoff: {\n        type: \"number\",\n        value: 0.05,\n        min: 0,\n        max: 1\n    },\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getIcon: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.icon;\n        }\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getSize: {\n        type: \"accessor\",\n        value: 1\n    },\n    getAngle: {\n        type: \"accessor\",\n        value: 0\n    },\n    getPixelOffset: {\n        type: \"accessor\",\n        value: [\n            0,\n            0\n        ]\n    }\n};\nvar IconLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(IconLayer1, _Layer);\n    var _super = _createSuper(IconLayer1);\n    function IconLayer1() {\n        (0, _classCallCheckDefault.default)(this, IconLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(IconLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(IconLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _iconLayerVertexGlslDefault.default),\n                    fs: (0, _iconLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                this.state = {\n                    iconManager: new (0, _iconManagerDefault.default)(this.context.gl, {\n                        onUpdate: function onUpdate() {\n                            return _this._onUpdate();\n                        }\n                    })\n                };\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getPosition\"\n                    },\n                    instanceSizes: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getSize\",\n                        defaultValue: 1\n                    },\n                    instanceOffsets: {\n                        size: 2,\n                        accessor: \"getIcon\",\n                        transform: this.getInstanceOffset\n                    },\n                    instanceIconFrames: {\n                        size: 4,\n                        accessor: \"getIcon\",\n                        transform: this.getInstanceIconFrame\n                    },\n                    instanceColorModes: {\n                        size: 1,\n                        type: 5121,\n                        accessor: \"getIcon\",\n                        transform: this.getInstanceColorMode\n                    },\n                    instanceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceAngles: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getAngle\"\n                    },\n                    instancePixelOffset: {\n                        size: 2,\n                        transition: true,\n                        accessor: \"getPixelOffset\"\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var oldProps = _ref.oldProps, props = _ref.props, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(IconLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                var attributeManager = this.getAttributeManager();\n                var iconAtlas = props.iconAtlas, iconMapping = props.iconMapping, data = props.data, getIcon = props.getIcon;\n                var iconManager = this.state.iconManager;\n                iconManager.setProps({\n                    loadOptions: props.loadOptions\n                });\n                var iconMappingChanged = false;\n                var prePacked = iconAtlas || this.internalState.isAsyncPropLoading(\"iconAtlas\");\n                if (prePacked) {\n                    if (oldProps.iconAtlas !== props.iconAtlas) iconManager.setProps({\n                        iconAtlas: iconAtlas,\n                        autoPacking: false\n                    });\n                    if (oldProps.iconMapping !== props.iconMapping) {\n                        iconManager.setProps({\n                            iconMapping: iconMapping\n                        });\n                        iconMappingChanged = true;\n                    }\n                } else iconManager.setProps({\n                    autoPacking: true\n                });\n                if (changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getIcon)) iconManager.setProps({\n                    data: data,\n                    getIcon: getIcon\n                });\n                if (iconMappingChanged) {\n                    attributeManager.invalidate(\"instanceOffsets\");\n                    attributeManager.invalidate(\"instanceIconFrames\");\n                    attributeManager.invalidate(\"instanceColorModes\");\n                }\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    attributeManager.invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState() {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(IconLayer1.prototype), \"finalizeState\", this).call(this);\n                this.state.iconManager.finalize();\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var _this$props = this.props, sizeScale = _this$props.sizeScale, sizeMinPixels = _this$props.sizeMinPixels, sizeMaxPixels = _this$props.sizeMaxPixels, sizeUnits = _this$props.sizeUnits, billboard = _this$props.billboard, alphaCutoff = _this$props.alphaCutoff;\n                var iconManager = this.state.iconManager;\n                var viewport = this.context.viewport;\n                var iconsTexture = iconManager.getTexture();\n                if (iconsTexture && iconsTexture.loaded) this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    iconsTexture: iconsTexture,\n                    iconsTextureDim: [\n                        iconsTexture.width,\n                        iconsTexture.height\n                    ],\n                    sizeScale: sizeScale * (sizeUnits === \"pixels\" ? viewport.metersPerPixel : 1),\n                    sizeMinPixels: sizeMinPixels,\n                    sizeMaxPixels: sizeMaxPixels,\n                    billboard: billboard,\n                    alphaCutoff: alphaCutoff\n                })).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [\n                    -1,\n                    -1,\n                    -1,\n                    1,\n                    1,\n                    1,\n                    1,\n                    -1\n                ];\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 6,\n                        attributes: {\n                            positions: {\n                                size: 2,\n                                value: new Float32Array(positions)\n                            }\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        },\n        {\n            key: \"_onUpdate\",\n            value: function _onUpdate() {\n                this.setNeedsRedraw();\n            }\n        },\n        {\n            key: \"getInstanceOffset\",\n            value: function getInstanceOffset(icon) {\n                var rect = this.state.iconManager.getIconMapping(icon);\n                return [\n                    rect.width / 2 - rect.anchorX || 0,\n                    rect.height / 2 - rect.anchorY || 0\n                ];\n            }\n        },\n        {\n            key: \"getInstanceColorMode\",\n            value: function getInstanceColorMode(icon) {\n                var mapping = this.state.iconManager.getIconMapping(icon);\n                return mapping.mask ? 1 : 0;\n            }\n        },\n        {\n            key: \"getInstanceIconFrame\",\n            value: function getInstanceIconFrame(icon) {\n                var rect = this.state.iconManager.getIconMapping(icon);\n                return [\n                    rect.x || 0,\n                    rect.y || 0,\n                    rect.width || 0,\n                    rect.height || 0\n                ];\n            }\n        },\n        {\n            key: \"isLoaded\",\n            get: function get() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(IconLayer1.prototype), \"isLoaded\", this) && this.state.iconManager.isLoaded;\n            }\n        }\n    ]);\n    return IconLayer1;\n}((0, _core.Layer));\nIconLayer.layerName = \"IconLayer\";\nIconLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./icon-layer-vertex.glsl\":\"kSaIY\",\"./icon-layer-fragment.glsl\":\"3N79p\",\"./icon-manager\":\"5IKkK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kSaIY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME icon-layer-vertex-shader\\n\\nattribute vec2 positions;\\n\\nattribute vec3 instancePositions;\\nattribute vec3 instancePositions64Low;\\nattribute float instanceSizes;\\nattribute float instanceAngles;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute vec4 instanceIconFrames;\\nattribute float instanceColorModes;\\nattribute vec2 instanceOffsets;\\nattribute vec2 instancePixelOffset;\\n\\nuniform float sizeScale;\\nuniform vec2 iconsTextureDim;\\nuniform float sizeMinPixels;\\nuniform float sizeMaxPixels;\\nuniform bool billboard;\\n\\nvarying float vColorMode;\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\nvarying vec2 uv;\\n\\nvec2 rotate_by_angle(vec2 vertex, float angle) {\\n  float angle_radian = angle * PI / 180.0;\\n  float cos_angle = cos(angle_radian);\\n  float sin_angle = sin(angle_radian);\\n  mat2 rotationMatrix = mat2(cos_angle, -sin_angle, sin_angle, cos_angle);\\n  return rotationMatrix * vertex;\\n}\\n\\nvoid main(void) {\\n  geometry.worldPosition = instancePositions;\\n  geometry.uv = positions;\\n  geometry.pickingColor = instancePickingColors;\\n  uv = positions;\\n\\n  vec2 iconSize = instanceIconFrames.zw;\\n  float sizePixels = clamp(\\n    project_size_to_pixel(instanceSizes * sizeScale), \\n    sizeMinPixels, sizeMaxPixels\\n  );\\n  float instanceScale = iconSize.y == 0.0 ? 0.0 : sizePixels / iconSize.y;\\n  vec2 pixelOffset = positions / 2.0 * iconSize + instanceOffsets;\\n  pixelOffset = rotate_by_angle(pixelOffset, instanceAngles) * instanceScale;\\n  pixelOffset += instancePixelOffset;\\n  pixelOffset.y *= -1.0;\\n\\n  if (billboard)  {\\n    gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, vec3(0.0), geometry.position);\\n    vec3 offset = vec3(pixelOffset, 0.0);\\n    DECKGL_FILTER_SIZE(offset, geometry);\\n    gl_Position.xy += project_pixel_size_to_clipspace(offset.xy);\\n\\n  } else {\\n    vec3 offset_common = vec3(project_pixel_size(pixelOffset), 0.0);\\n    DECKGL_FILTER_SIZE(offset_common, geometry);\\n    gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset_common, geometry.position); \\n  }\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n\\n  vTextureCoords = mix(\\n    instanceIconFrames.xy,\\n    instanceIconFrames.xy + iconSize,\\n    (positions.xy + 1.0) / 2.0\\n  ) / iconsTextureDim;\\n\\n  vColor = instanceColors;\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n\\n  vColorMode = instanceColorModes;\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3N79p\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME icon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform float opacity;\\nuniform sampler2D iconsTexture;\\nuniform float alphaCutoff;\\n\\nvarying float vColorMode;\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  geometry.uv = uv;\\n\\n  vec4 texColor = texture2D(iconsTexture, vTextureCoords);\\n  vec3 color = mix(texColor.rgb, vColor.rgb, vColorMode);\\n  float a = texColor.a * opacity * vColor.a;\\n\\n  if (a < alphaCutoff) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vec4(color, a);\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5IKkK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"buildMapping\", ()=>buildMapping);\nparcelHelpers.export(exports, \"getDiffIcons\", ()=>getDiffIcons);\nparcelHelpers.export(exports, \"default\", ()=>IconManager);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _core = require(\"@luma.gl/core\");\nvar _images = require(\"@loaders.gl/images\");\nvar _core1 = require(\"@loaders.gl/core\");\nvar _core2 = require(\"@deck.gl/core\");\nvar _DEFAULT_TEXTURE_PARA;\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar DEFAULT_CANVAS_WIDTH = 1024;\nvar DEFAULT_BUFFER = 4;\nvar noop = function noop() {};\nvar DEFAULT_TEXTURE_PARAMETERS = (_DEFAULT_TEXTURE_PARA = {}, (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10241, 9987), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10240, 9729), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10242, 33071), (0, _definePropertyDefault.default)(_DEFAULT_TEXTURE_PARA, 10243, 33071), _DEFAULT_TEXTURE_PARA);\nfunction nextPowOfTwo(number) {\n    return Math.pow(2, Math.ceil(Math.log2(number)));\n}\nfunction resizeImage(ctx, imageData, width, height) {\n    if (width === imageData.width && height === imageData.height) return imageData;\n    ctx.canvas.height = height;\n    ctx.canvas.width = width;\n    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n    ctx.drawImage(imageData, 0, 0, imageData.width, imageData.height, 0, 0, width, height);\n    return ctx.canvas;\n}\nfunction getIconId(icon) {\n    return icon && (icon.id || icon.url);\n}\nfunction resizeTexture(gl, texture, width, height) {\n    var oldWidth = texture.width;\n    var oldHeight = texture.height;\n    var newTexture = (0, _core.cloneTextureFrom)(texture, {\n        width: width,\n        height: height\n    });\n    (0, _core.copyToTexture)(texture, newTexture, {\n        targetY: 0,\n        width: oldWidth,\n        height: oldHeight\n    });\n    texture[\"delete\"]();\n    return newTexture;\n}\nfunction buildRowMapping(mapping, columns, yOffset) {\n    for(var i = 0; i < columns.length; i++){\n        var _columns$i = columns[i], icon = _columns$i.icon, xOffset = _columns$i.xOffset;\n        var id = getIconId(icon);\n        mapping[id] = Object.assign({}, icon, {\n            x: xOffset,\n            y: yOffset\n        });\n    }\n}\nfunction buildMapping(_ref) {\n    var icons = _ref.icons, buffer = _ref.buffer, _ref$mapping = _ref.mapping, mapping = _ref$mapping === void 0 ? {} : _ref$mapping, _ref$xOffset = _ref.xOffset, xOffset = _ref$xOffset === void 0 ? 0 : _ref$xOffset, _ref$yOffset = _ref.yOffset, yOffset = _ref$yOffset === void 0 ? 0 : _ref$yOffset, _ref$rowHeight = _ref.rowHeight, rowHeight = _ref$rowHeight === void 0 ? 0 : _ref$rowHeight, canvasWidth = _ref.canvasWidth;\n    var columns = [];\n    for(var i = 0; i < icons.length; i++){\n        var icon = icons[i];\n        var id = getIconId(icon);\n        if (!mapping[id]) {\n            var height = icon.height, width = icon.width;\n            if (xOffset + width + buffer > canvasWidth) {\n                buildRowMapping(mapping, columns, yOffset);\n                xOffset = 0;\n                yOffset = rowHeight + yOffset + buffer;\n                rowHeight = 0;\n                columns = [];\n            }\n            columns.push({\n                icon: icon,\n                xOffset: xOffset\n            });\n            xOffset = xOffset + width + buffer;\n            rowHeight = Math.max(rowHeight, height);\n        }\n    }\n    if (columns.length > 0) buildRowMapping(mapping, columns, yOffset);\n    return {\n        mapping: mapping,\n        rowHeight: rowHeight,\n        xOffset: xOffset,\n        yOffset: yOffset,\n        canvasWidth: canvasWidth,\n        canvasHeight: nextPowOfTwo(rowHeight + yOffset + buffer)\n    };\n}\nfunction getDiffIcons(data, getIcon, cachedIcons) {\n    if (!data || !getIcon) return null;\n    cachedIcons = cachedIcons || {};\n    var icons = {};\n    var _createIterable = (0, _core2.createIterable)(data), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n    var _iterator = _createForOfIteratorHelper(iterable), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var object = _step.value;\n            objectInfo.index++;\n            var icon = getIcon(object, objectInfo);\n            var id = getIconId(icon);\n            if (!icon) throw new Error(\"Icon is missing.\");\n            if (!icon.url) throw new Error(\"Icon url is missing.\");\n            if (!icons[id] && (!cachedIcons[id] || icon.url !== cachedIcons[id].url)) icons[id] = icon;\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    return icons;\n}\nvar IconManager = function() {\n    function IconManager1(gl, _ref2) {\n        var _ref2$onUpdate = _ref2.onUpdate, onUpdate = _ref2$onUpdate === void 0 ? noop : _ref2$onUpdate;\n        (0, _classCallCheckDefault.default)(this, IconManager1);\n        this.gl = gl;\n        this.onUpdate = onUpdate;\n        this._loadOptions = null;\n        this._getIcon = null;\n        this._texture = null;\n        this._externalTexture = null;\n        this._mapping = {};\n        this._pendingCount = 0;\n        this._autoPacking = false;\n        this._xOffset = 0;\n        this._yOffset = 0;\n        this._rowHeight = 0;\n        this._buffer = DEFAULT_BUFFER;\n        this._canvasWidth = DEFAULT_CANVAS_WIDTH;\n        this._canvasHeight = 0;\n        this._canvas = null;\n    }\n    (0, _createClassDefault.default)(IconManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                if (this._texture) this._texture[\"delete\"]();\n            }\n        },\n        {\n            key: \"getTexture\",\n            value: function getTexture() {\n                return this._texture || this._externalTexture;\n            }\n        },\n        {\n            key: \"getIconMapping\",\n            value: function getIconMapping(icon) {\n                var id = this._autoPacking ? getIconId(icon) : icon;\n                return this._mapping[id] || {};\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps(_ref3) {\n                var loadOptions = _ref3.loadOptions, autoPacking = _ref3.autoPacking, iconAtlas = _ref3.iconAtlas, iconMapping = _ref3.iconMapping, data = _ref3.data, getIcon = _ref3.getIcon;\n                if (loadOptions) this._loadOptions = loadOptions;\n                if (autoPacking !== undefined) this._autoPacking = autoPacking;\n                if (getIcon) this._getIcon = getIcon;\n                if (iconMapping) this._mapping = iconMapping;\n                if (iconAtlas) this._updateIconAtlas(iconAtlas);\n                if (this._autoPacking && (data || getIcon) && typeof document !== \"undefined\") {\n                    this._canvas = this._canvas || document.createElement(\"canvas\");\n                    this._updateAutoPacking(data);\n                }\n            }\n        },\n        {\n            key: \"_updateIconAtlas\",\n            value: function _updateIconAtlas(iconAtlas) {\n                if (this._texture) {\n                    this._texture[\"delete\"]();\n                    this._texture = null;\n                }\n                if (iconAtlas instanceof (0, _core.Texture2D)) {\n                    iconAtlas.setParameters(DEFAULT_TEXTURE_PARAMETERS);\n                    this._externalTexture = iconAtlas;\n                    this.onUpdate();\n                } else if (iconAtlas) {\n                    this._texture = new (0, _core.Texture2D)(this.gl, {\n                        data: iconAtlas,\n                        parameters: DEFAULT_TEXTURE_PARAMETERS\n                    });\n                    this.onUpdate();\n                }\n            }\n        },\n        {\n            key: \"_updateAutoPacking\",\n            value: function _updateAutoPacking(data) {\n                var icons = Object.values(getDiffIcons(data, this._getIcon, this._mapping) || {});\n                if (icons.length > 0) {\n                    var _buildMapping = buildMapping({\n                        icons: icons,\n                        buffer: this._buffer,\n                        canvasWidth: this._canvasWidth,\n                        mapping: this._mapping,\n                        rowHeight: this._rowHeight,\n                        xOffset: this._xOffset,\n                        yOffset: this._yOffset\n                    }), mapping = _buildMapping.mapping, xOffset = _buildMapping.xOffset, yOffset = _buildMapping.yOffset, rowHeight = _buildMapping.rowHeight, canvasHeight = _buildMapping.canvasHeight;\n                    this._rowHeight = rowHeight;\n                    this._mapping = mapping;\n                    this._xOffset = xOffset;\n                    this._yOffset = yOffset;\n                    this._canvasHeight = canvasHeight;\n                    if (!this._texture) this._texture = new (0, _core.Texture2D)(this.gl, {\n                        width: this._canvasWidth,\n                        height: this._canvasHeight,\n                        parameters: DEFAULT_TEXTURE_PARAMETERS\n                    });\n                    if (this._texture.height !== this._canvasHeight) this._texture = resizeTexture(this.gl, this._texture, this._canvasWidth, this._canvasHeight);\n                    this.onUpdate();\n                    this._loadIcons(icons);\n                }\n            }\n        },\n        {\n            key: \"_loadIcons\",\n            value: function _loadIcons(icons) {\n                var _this = this;\n                var ctx = this._canvas.getContext(\"2d\");\n                var _iterator2 = _createForOfIteratorHelper(icons), _step2;\n                try {\n                    var _loop = function _loop() {\n                        var icon = _step2.value;\n                        _this._pendingCount++;\n                        (0, _core1.load)(icon.url, (0, _images.ImageLoader), _this._loadOptions).then(function(imageData) {\n                            var id = getIconId(icon);\n                            var _this$_mapping$id = _this._mapping[id], x = _this$_mapping$id.x, y = _this$_mapping$id.y, width = _this$_mapping$id.width, height = _this$_mapping$id.height;\n                            var data = resizeImage(ctx, imageData, width, height);\n                            _this._texture.setSubImageData({\n                                data: data,\n                                x: x,\n                                y: y,\n                                width: width,\n                                height: height\n                            });\n                            _this._texture.generateMipmap();\n                            _this.onUpdate();\n                        })[\"catch\"](function(error) {\n                            (0, _core2.log).error(error)();\n                        })[\"finally\"](function() {\n                            _this._pendingCount--;\n                        });\n                    };\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;)_loop();\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n            }\n        },\n        {\n            key: \"isLoaded\",\n            get: function get() {\n                return this._pendingCount === 0;\n            }\n        }\n    ]);\n    return IconManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@luma.gl/core\":\"bW3Qv\",\"@loaders.gl/images\":\"2TXhJ\",\"@loaders.gl/core\":\"7dwvE\",\"@deck.gl/core\":\"lTaaR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"foBKL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LineLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _lineLayerVertexGlsl = require(\"./line-layer-vertex.glsl\");\nvar _lineLayerVertexGlslDefault = parcelHelpers.interopDefault(_lineLayerVertexGlsl);\nvar _lineLayerFragmentGlsl = require(\"./line-layer-fragment.glsl\");\nvar _lineLayerFragmentGlslDefault = parcelHelpers.interopDefault(_lineLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    getSourcePosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.sourcePosition;\n        }\n    },\n    getTargetPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.targetPosition;\n        }\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    widthUnits: \"pixels\",\n    widthScale: {\n        type: \"number\",\n        value: 1,\n        min: 0\n    },\n    widthMinPixels: {\n        type: \"number\",\n        value: 0,\n        min: 0\n    },\n    widthMaxPixels: {\n        type: \"number\",\n        value: Number.MAX_SAFE_INTEGER,\n        min: 0\n    }\n};\nvar LineLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(LineLayer1, _Layer);\n    var _super = _createSuper(LineLayer1);\n    function LineLayer1() {\n        (0, _classCallCheckDefault.default)(this, LineLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(LineLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(LineLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _lineLayerVertexGlslDefault.default),\n                    fs: (0, _lineLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instanceSourcePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getSourcePosition\"\n                    },\n                    instanceTargetPositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getTargetPosition\"\n                    },\n                    instanceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getColor\",\n                        defaultValue: [\n                            0,\n                            0,\n                            0,\n                            255\n                        ]\n                    },\n                    instanceWidths: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getWidth\",\n                        defaultValue: 1\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(LineLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, widthUnits = _this$props.widthUnits, widthScale = _this$props.widthScale, widthMinPixels = _this$props.widthMinPixels, widthMaxPixels = _this$props.widthMaxPixels;\n                var widthMultiplier = widthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    widthScale: widthScale * widthMultiplier,\n                    widthMinPixels: widthMinPixels,\n                    widthMaxPixels: widthMaxPixels\n                })).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [\n                    0,\n                    -1,\n                    0,\n                    0,\n                    1,\n                    0,\n                    1,\n                    -1,\n                    0,\n                    1,\n                    1,\n                    0\n                ];\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 5,\n                        attributes: {\n                            positions: new Float32Array(positions)\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        }\n    ]);\n    return LineLayer1;\n}((0, _core.Layer));\nLineLayer.layerName = \"LineLayer\";\nLineLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./line-layer-vertex.glsl\":\"buFEJ\",\"./line-layer-fragment.glsl\":\"bgfM6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"buFEJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME line-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 instanceSourcePositions;\\nattribute vec3 instanceTargetPositions;\\nattribute vec3 instanceSourcePositions64Low;\\nattribute vec3 instanceTargetPositions64Low;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\nattribute float instanceWidths;\\n\\nuniform float opacity;\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\n\\nvarying vec4 vColor;\\nvarying vec2 uv;\\nvec2 getExtrusionOffset(vec2 line_clipspace, float offset_direction, float width) {\\n  vec2 dir_screenspace = normalize(line_clipspace * project_uViewportSize);\\n  dir_screenspace = vec2(-dir_screenspace.y, dir_screenspace.x);\\n\\n  return dir_screenspace * offset_direction * width / 2.0;\\n}\\n\\nvoid main(void) {\\n  geometry.worldPosition = instanceSourcePositions;\\n  geometry.worldPositionAlt = instanceTargetPositions;\\n  vec4 source_commonspace;\\n  vec4 target_commonspace;\\n  vec4 source = project_position_to_clipspace(instanceSourcePositions, instanceSourcePositions64Low, vec3(0.), source_commonspace);\\n  vec4 target = project_position_to_clipspace(instanceTargetPositions, instanceTargetPositions64Low, vec3(0.), target_commonspace);\\n  float widthPixels = clamp(\\n    project_size_to_pixel(instanceWidths * widthScale),\\n    widthMinPixels, widthMaxPixels\\n  );\\n  float segmentIndex = positions.x;\\n  vec4 p = mix(source, target, segmentIndex);\\n  geometry.position = mix(source_commonspace, target_commonspace, segmentIndex);\\n  uv = positions.xy;\\n  geometry.uv = uv;\\n  geometry.pickingColor = instancePickingColors;\\n  vec3 offset = vec3(\\n    getExtrusionOffset(target.xy - source.xy, positions.y, widthPixels),\\n    0.0);\\n  DECKGL_FILTER_SIZE(offset, geometry);\\n  gl_Position = p + vec4(project_pixel_size_to_clipspace(offset.xy), 0.0, 0.0);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity);\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bgfM6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME line-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  geometry.uv = uv;\\n\\n  gl_FragColor = vColor;\\n\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a7eCX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PointCloudLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _pointCloudLayerVertexGlsl = require(\"./point-cloud-layer-vertex.glsl\");\nvar _pointCloudLayerVertexGlslDefault = parcelHelpers.interopDefault(_pointCloudLayerVertexGlsl);\nvar _pointCloudLayerFragmentGlsl = require(\"./point-cloud-layer-fragment.glsl\");\nvar _pointCloudLayerFragmentGlslDefault = parcelHelpers.interopDefault(_pointCloudLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar DEFAULT_NORMAL = [\n    0,\n    0,\n    1\n];\nvar defaultProps = {\n    sizeUnits: \"pixels\",\n    pointSize: {\n        type: \"number\",\n        min: 0,\n        value: 10\n    },\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getNormal: {\n        type: \"accessor\",\n        value: DEFAULT_NORMAL\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    material: true,\n    radiusPixels: {\n        deprecatedFor: \"pointSize\"\n    }\n};\nfunction normalizeData(data) {\n    var header = data.header, attributes = data.attributes;\n    if (!header || !attributes) return;\n    data.length = header.vertexCount;\n    if (attributes.POSITION) attributes.instancePositions = attributes.POSITION;\n    if (attributes.NORMAL) attributes.instanceNormals = attributes.NORMAL;\n    if (attributes.COLOR_0) attributes.instanceColors = attributes.COLOR_0;\n}\nvar PointCloudLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(PointCloudLayer1, _Layer);\n    var _super = _createSuper(PointCloudLayer1);\n    function PointCloudLayer1() {\n        (0, _classCallCheckDefault.default)(this, PointCloudLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(PointCloudLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders(id) {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PointCloudLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _pointCloudLayerVertexGlslDefault.default),\n                    fs: (0, _pointCloudLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.gouraudLighting),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.getAttributeManager().addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getPosition\"\n                    },\n                    instanceNormals: {\n                        size: 3,\n                        transition: true,\n                        accessor: \"getNormal\",\n                        defaultValue: DEFAULT_NORMAL\n                    },\n                    instanceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getColor\",\n                        defaultValue: DEFAULT_COLOR\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PointCloudLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n                if (changeFlags.dataChanged) normalizeData(props.data);\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, pointSize = _this$props.pointSize, sizeUnits = _this$props.sizeUnits;\n                var sizeMultiplier = sizeUnits === \"meters\" ? 1 / viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    radiusPixels: pointSize * sizeMultiplier\n                })).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [];\n                for(var i = 0; i < 3; i++){\n                    var angle = i / 3 * Math.PI * 2;\n                    positions.push(Math.cos(angle) * 2, Math.sin(angle) * 2, 0);\n                }\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 4,\n                        attributes: {\n                            positions: new Float32Array(positions)\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        }\n    ]);\n    return PointCloudLayer1;\n}((0, _core.Layer));\nPointCloudLayer.layerName = \"PointCloudLayer\";\nPointCloudLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./point-cloud-layer-vertex.glsl\":\"eQppn\",\"./point-cloud-layer-fragment.glsl\":\"eLQTb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eQppn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME point-cloud-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 instanceNormals;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePositions;\\nattribute vec3 instancePositions64Low;\\nattribute vec3 instancePickingColors;\\n\\nuniform float opacity;\\nuniform float radiusPixels;\\n\\nvarying vec4 vColor;\\nvarying vec2 unitPosition;\\n\\nvoid main(void) {\\n  geometry.worldPosition = instancePositions;\\n  geometry.normal = project_normal(instanceNormals);\\n  unitPosition = positions.xy;\\n  geometry.uv = unitPosition;\\n  geometry.pickingColor = instancePickingColors;\\n  vec3 offset = vec3(positions.xy * radiusPixels, 0.0);\\n  DECKGL_FILTER_SIZE(offset, geometry);\\n\\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, vec3(0.), geometry.position);\\n  gl_Position.xy += project_pixel_size_to_clipspace(offset.xy);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  vec3 lightColor = lighting_getLightColor(instanceColors.rgb, project_uCameraPosition, geometry.position.xyz, geometry.normal);\\n  vColor = vec4(lightColor, instanceColors.a * opacity);\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eLQTb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME point-cloud-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying vec2 unitPosition;\\n\\nvoid main(void) {\\n  geometry.uv = unitPosition;\\n\\n  float distToCenter = length(unitPosition);\\n\\n  if (distToCenter > 1.0) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vColor;\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6DigI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ScatterplotLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _scatterplotLayerVertexGlsl = require(\"./scatterplot-layer-vertex.glsl\");\nvar _scatterplotLayerVertexGlslDefault = parcelHelpers.interopDefault(_scatterplotLayerVertexGlsl);\nvar _scatterplotLayerFragmentGlsl = require(\"./scatterplot-layer-fragment.glsl\");\nvar _scatterplotLayerFragmentGlslDefault = parcelHelpers.interopDefault(_scatterplotLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    radiusUnits: \"meters\",\n    radiusScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    radiusMinPixels: {\n        type: \"number\",\n        min: 0,\n        value: 0\n    },\n    radiusMaxPixels: {\n        type: \"number\",\n        min: 0,\n        value: Number.MAX_SAFE_INTEGER\n    },\n    lineWidthUnits: \"meters\",\n    lineWidthScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    lineWidthMinPixels: {\n        type: \"number\",\n        min: 0,\n        value: 0\n    },\n    lineWidthMaxPixels: {\n        type: \"number\",\n        min: 0,\n        value: Number.MAX_SAFE_INTEGER\n    },\n    stroked: false,\n    filled: true,\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getRadius: {\n        type: \"accessor\",\n        value: 1\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    strokeWidth: {\n        deprecatedFor: \"getLineWidth\"\n    },\n    outline: {\n        deprecatedFor: \"stroked\"\n    },\n    getColor: {\n        deprecatedFor: [\n            \"getFillColor\",\n            \"getLineColor\"\n        ]\n    }\n};\nvar ScatterplotLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(ScatterplotLayer1, _Layer);\n    var _super = _createSuper(ScatterplotLayer1);\n    function ScatterplotLayer1() {\n        (0, _classCallCheckDefault.default)(this, ScatterplotLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(ScatterplotLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders(id) {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ScatterplotLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _scatterplotLayerVertexGlslDefault.default),\n                    fs: (0, _scatterplotLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.getAttributeManager().addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getPosition\"\n                    },\n                    instanceRadius: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getRadius\",\n                        defaultValue: 1\n                    },\n                    instanceFillColors: {\n                        size: this.props.colorFormat.length,\n                        transition: true,\n                        normalized: true,\n                        type: 5121,\n                        accessor: \"getFillColor\",\n                        defaultValue: [\n                            0,\n                            0,\n                            0,\n                            255\n                        ]\n                    },\n                    instanceLineColors: {\n                        size: this.props.colorFormat.length,\n                        transition: true,\n                        normalized: true,\n                        type: 5121,\n                        accessor: \"getLineColor\",\n                        defaultValue: [\n                            0,\n                            0,\n                            0,\n                            255\n                        ]\n                    },\n                    instanceLineWidths: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getLineWidth\",\n                        defaultValue: 1\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ScatterplotLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, radiusUnits = _this$props.radiusUnits, radiusScale = _this$props.radiusScale, radiusMinPixels = _this$props.radiusMinPixels, radiusMaxPixels = _this$props.radiusMaxPixels, stroked = _this$props.stroked, filled = _this$props.filled, lineWidthUnits = _this$props.lineWidthUnits, lineWidthScale = _this$props.lineWidthScale, lineWidthMinPixels = _this$props.lineWidthMinPixels, lineWidthMaxPixels = _this$props.lineWidthMaxPixels;\n                var pointRadiusMultiplier = radiusUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                var lineWidthMultiplier = lineWidthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(uniforms).setUniforms({\n                    stroked: stroked ? 1 : 0,\n                    filled: filled,\n                    radiusScale: radiusScale * pointRadiusMultiplier,\n                    radiusMinPixels: radiusMinPixels,\n                    radiusMaxPixels: radiusMaxPixels,\n                    lineWidthScale: lineWidthScale * lineWidthMultiplier,\n                    lineWidthMinPixels: lineWidthMinPixels,\n                    lineWidthMaxPixels: lineWidthMaxPixels\n                }).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var positions = [\n                    -1,\n                    -1,\n                    0,\n                    1,\n                    -1,\n                    0,\n                    1,\n                    1,\n                    0,\n                    -1,\n                    1,\n                    0\n                ];\n                return new (0, _core1.Model)(gl, Object.assign(this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 6,\n                        vertexCount: 4,\n                        attributes: {\n                            positions: {\n                                size: 3,\n                                value: new Float32Array(positions)\n                            }\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        }\n    ]);\n    return ScatterplotLayer1;\n}((0, _core.Layer));\nScatterplotLayer.layerName = \"ScatterplotLayer\";\nScatterplotLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./scatterplot-layer-vertex.glsl\":\"gYUKa\",\"./scatterplot-layer-fragment.glsl\":\"7yd9w\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gYUKa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME scatterplot-layer-vertex-shader\\n\\nattribute vec3 positions;\\n\\nattribute vec3 instancePositions;\\nattribute vec3 instancePositions64Low;\\nattribute float instanceRadius;\\nattribute float instanceLineWidths;\\nattribute vec4 instanceFillColors;\\nattribute vec4 instanceLineColors;\\nattribute vec3 instancePickingColors;\\n\\nuniform float opacity;\\nuniform float radiusScale;\\nuniform float radiusMinPixels;\\nuniform float radiusMaxPixels;\\nuniform float lineWidthScale;\\nuniform float lineWidthMinPixels;\\nuniform float lineWidthMaxPixels;\\nuniform float stroked;\\nuniform bool filled;\\n\\nvarying vec4 vFillColor;\\nvarying vec4 vLineColor;\\nvarying vec2 unitPosition;\\nvarying float innerUnitRadius;\\nvarying float outerRadiusPixels;\\n\\nvoid main(void) {\\n  geometry.worldPosition = instancePositions;\\n  outerRadiusPixels = clamp(\\n    project_size_to_pixel(radiusScale * instanceRadius),\\n    radiusMinPixels, radiusMaxPixels\\n  );\\n  float lineWidthPixels = clamp(\\n    project_size_to_pixel(lineWidthScale * instanceLineWidths),\\n    lineWidthMinPixels, lineWidthMaxPixels\\n  );\\n  outerRadiusPixels += stroked * lineWidthPixels / 2.0;\\n  unitPosition = positions.xy;\\n  geometry.uv = unitPosition;\\n  geometry.pickingColor = instancePickingColors;\\n\\n  innerUnitRadius = 1.0 - stroked * lineWidthPixels / outerRadiusPixels;\\n  \\n  vec3 offset = positions * project_pixel_size(outerRadiusPixels);\\n  DECKGL_FILTER_SIZE(offset, geometry);\\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset, geometry.position);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  vFillColor = vec4(instanceFillColors.rgb, instanceFillColors.a * opacity);\\n  DECKGL_FILTER_COLOR(vFillColor, geometry);\\n  vLineColor = vec4(instanceLineColors.rgb, instanceLineColors.a * opacity);\\n  DECKGL_FILTER_COLOR(vLineColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7yd9w\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME scatterplot-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform bool filled;\\nuniform float stroked;\\n\\nvarying vec4 vFillColor;\\nvarying vec4 vLineColor;\\nvarying vec2 unitPosition;\\nvarying float innerUnitRadius;\\nvarying float outerRadiusPixels;\\n\\nvoid main(void) {\\n  geometry.uv = unitPosition;\\n\\n  float distToCenter = length(unitPosition) * outerRadiusPixels;\\n  float inCircle = smoothedge(distToCenter, outerRadiusPixels);\\n\\n  if (inCircle == 0.0) {\\n    discard;\\n  }\\n\\n  if (stroked > 0.5) {\\n    float isLine = smoothedge(innerUnitRadius * outerRadiusPixels, distToCenter);\\n    if (filled) {\\n      gl_FragColor = mix(vFillColor, vLineColor, isLine);\\n    } else {\\n      if (isLine == 0.0) {\\n        discard;\\n      }\\n      gl_FragColor = vec4(vLineColor.rgb, vLineColor.a * isLine);\\n    }\\n  } else if (filled) {\\n    gl_FragColor = vFillColor;\\n  } else {\\n    discard;\\n  }\\n\\n  gl_FragColor.a *= inCircle;\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f0jHB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ColumnLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _columnGeometry = require(\"./column-geometry\");\nvar _columnGeometryDefault = parcelHelpers.interopDefault(_columnGeometry);\nvar _columnLayerVertexGlsl = require(\"./column-layer-vertex.glsl\");\nvar _columnLayerVertexGlslDefault = parcelHelpers.interopDefault(_columnLayerVertexGlsl);\nvar _columnLayerFragmentGlsl = require(\"./column-layer-fragment.glsl\");\nvar _columnLayerFragmentGlslDefault = parcelHelpers.interopDefault(_columnLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    diskResolution: {\n        type: \"number\",\n        min: 4,\n        value: 20\n    },\n    vertices: null,\n    radius: {\n        type: \"number\",\n        min: 0,\n        value: 1000\n    },\n    angle: {\n        type: \"number\",\n        value: 0\n    },\n    offset: {\n        type: \"array\",\n        value: [\n            0,\n            0\n        ]\n    },\n    coverage: {\n        type: \"number\",\n        min: 0,\n        max: 1,\n        value: 1\n    },\n    elevationScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    lineWidthUnits: \"meters\",\n    lineWidthScale: 1,\n    lineWidthMinPixels: 0,\n    lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n    extruded: true,\n    wireframe: false,\n    filled: true,\n    stroked: false,\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    getElevation: {\n        type: \"accessor\",\n        value: 1000\n    },\n    material: true,\n    getColor: {\n        deprecatedFor: [\n            \"getFillColor\",\n            \"getLineColor\"\n        ]\n    }\n};\nvar ColumnLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(ColumnLayer1, _Layer);\n    var _super = _createSuper(ColumnLayer1);\n    function ColumnLayer1() {\n        (0, _classCallCheckDefault.default)(this, ColumnLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(ColumnLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ColumnLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _columnLayerVertexGlslDefault.default),\n                    fs: (0, _columnLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.gouraudLighting),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instancePositions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: true,\n                        accessor: \"getPosition\"\n                    },\n                    instanceElevations: {\n                        size: 1,\n                        transition: true,\n                        accessor: \"getElevation\"\n                    },\n                    instanceFillColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getFillColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceLineColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: true,\n                        accessor: \"getLineColor\",\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instanceStrokeWidths: {\n                        size: 1,\n                        accessor: \"getLineWidth\",\n                        transition: true\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(ColumnLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                var regenerateModels = changeFlags.extensionsChanged;\n                if (regenerateModels) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    this.getAttributeManager().invalidateAll();\n                }\n                if (regenerateModels || props.diskResolution !== oldProps.diskResolution || props.vertices !== oldProps.vertices) this._updateGeometry(props);\n            }\n        },\n        {\n            key: \"getGeometry\",\n            value: function getGeometry(diskResolution, vertices) {\n                var geometry = new (0, _columnGeometryDefault.default)({\n                    radius: 1,\n                    height: 2,\n                    vertices: vertices,\n                    nradial: diskResolution\n                });\n                var meanVertexDistance = 0;\n                if (vertices) for(var i = 0; i < diskResolution; i++){\n                    var p = vertices[i];\n                    var d = Math.sqrt(p[0] * p[0] + p[1] * p[1]);\n                    meanVertexDistance += d / diskResolution;\n                }\n                else meanVertexDistance = 1;\n                this.setState({\n                    edgeDistance: Math.cos(Math.PI / diskResolution) * meanVertexDistance\n                });\n                return geometry;\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    isInstanced: true\n                }));\n            }\n        },\n        {\n            key: \"_updateGeometry\",\n            value: function _updateGeometry(_ref2) {\n                var diskResolution = _ref2.diskResolution, vertices = _ref2.vertices;\n                var geometry = this.getGeometry(diskResolution, vertices);\n                this.setState({\n                    fillVertexCount: geometry.attributes.POSITION.value.length / 3,\n                    wireframeVertexCount: geometry.indices.value.length\n                });\n                this.state.model.setProps({\n                    geometry: geometry\n                });\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref3) {\n                var uniforms = _ref3.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, lineWidthUnits = _this$props.lineWidthUnits, lineWidthScale = _this$props.lineWidthScale, lineWidthMinPixels = _this$props.lineWidthMinPixels, lineWidthMaxPixels = _this$props.lineWidthMaxPixels, elevationScale = _this$props.elevationScale, extruded = _this$props.extruded, filled = _this$props.filled, stroked = _this$props.stroked, wireframe = _this$props.wireframe, offset = _this$props.offset, coverage = _this$props.coverage, radius = _this$props.radius, angle = _this$props.angle;\n                var _this$state = this.state, model = _this$state.model, fillVertexCount = _this$state.fillVertexCount, wireframeVertexCount = _this$state.wireframeVertexCount, edgeDistance = _this$state.edgeDistance;\n                var widthMultiplier = lineWidthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                model.setUniforms(Object.assign({}, uniforms, {\n                    radius: radius,\n                    angle: angle / 180 * Math.PI,\n                    offset: offset,\n                    extruded: extruded,\n                    coverage: coverage,\n                    elevationScale: elevationScale,\n                    edgeDistance: edgeDistance,\n                    widthScale: lineWidthScale * widthMultiplier,\n                    widthMinPixels: lineWidthMinPixels,\n                    widthMaxPixels: lineWidthMaxPixels\n                }));\n                if (extruded && wireframe) {\n                    model.setProps({\n                        isIndexed: true\n                    });\n                    model.setVertexCount(wireframeVertexCount).setDrawMode(1).setUniforms({\n                        isStroke: true\n                    }).draw();\n                }\n                if (filled) {\n                    model.setProps({\n                        isIndexed: false\n                    });\n                    model.setVertexCount(fillVertexCount).setDrawMode(5).setUniforms({\n                        isStroke: false\n                    }).draw();\n                }\n                if (!extruded && stroked) {\n                    model.setProps({\n                        isIndexed: false\n                    });\n                    model.setVertexCount(fillVertexCount * 2 / 3).setDrawMode(5).setUniforms({\n                        isStroke: true\n                    }).draw();\n                }\n            }\n        }\n    ]);\n    return ColumnLayer1;\n}((0, _core.Layer));\nColumnLayer.layerName = \"ColumnLayer\";\nColumnLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./column-geometry\":\"gJ0Ag\",\"./column-layer-vertex.glsl\":\"6vtkZ\",\"./column-layer-fragment.glsl\":\"6ALYp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gJ0Ag\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>ColumnGeometry);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar ColumnGeometry = function(_Geometry) {\n    (0, _inheritsDefault.default)(ColumnGeometry1, _Geometry);\n    var _super = _createSuper(ColumnGeometry1);\n    function ColumnGeometry1() {\n        var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n        (0, _classCallCheckDefault.default)(this, ColumnGeometry1);\n        var _props$id = props.id, id = _props$id === void 0 ? (0, _core1.uid)(\"column-geometry\") : _props$id;\n        var _tesselateColumn = tesselateColumn(props), indices = _tesselateColumn.indices, attributes = _tesselateColumn.attributes;\n        return _super.call(this, _objectSpread(_objectSpread({}, props), {}, {\n            id: id,\n            indices: indices,\n            attributes: attributes\n        }));\n    }\n    return ColumnGeometry1;\n}((0, _core1.Geometry));\nfunction tesselateColumn(props) {\n    var radius = props.radius, _props$height = props.height, height = _props$height === void 0 ? 1 : _props$height, _props$nradial = props.nradial, nradial = _props$nradial === void 0 ? 10 : _props$nradial, vertices = props.vertices;\n    (0, _core.log).assert(!vertices || vertices.length >= nradial);\n    var vertsAroundEdge = nradial + 1;\n    var numVertices = vertsAroundEdge * 3;\n    var stepAngle = Math.PI * 2 / nradial;\n    var indices = new Uint16Array(nradial * 6);\n    var positions = new Float32Array(numVertices * 3);\n    var normals = new Float32Array(numVertices * 3);\n    var i = 0;\n    for(var j = 0; j < vertsAroundEdge; j++){\n        var a = j * stepAngle;\n        var vertex = vertices && vertices[j % nradial];\n        var nextVertex = vertices && vertices[(j + 1) % nradial];\n        var sin = Math.sin(a);\n        var cos = Math.cos(a);\n        for(var k = 0; k < 2; k++){\n            positions[i + 0] = vertex ? vertex[0] : cos * radius;\n            positions[i + 1] = vertex ? vertex[1] : sin * radius;\n            positions[i + 2] = (0.5 - k) * height;\n            normals[i + 0] = vertex ? nextVertex[0] - vertex[0] : cos;\n            normals[i + 1] = vertex ? nextVertex[1] - vertex[1] : sin;\n            i += 3;\n        }\n    }\n    for(var _j = 0; _j < vertsAroundEdge; _j++){\n        var v = Math.floor(_j / 2) * Math.sign(_j % 2 - 0.5);\n        var _a = v * stepAngle;\n        var _vertex = vertices && vertices[(v + nradial) % nradial];\n        var _sin = Math.sin(_a);\n        var _cos = Math.cos(_a);\n        positions[i + 0] = _vertex ? _vertex[0] : _cos * radius;\n        positions[i + 1] = _vertex ? _vertex[1] : _sin * radius;\n        positions[i + 2] = height / 2;\n        normals[i + 2] = 1;\n        i += 3;\n    }\n    var index = 0;\n    for(var _j2 = 0; _j2 < nradial; _j2++){\n        indices[index++] = _j2 * 2 + 0;\n        indices[index++] = _j2 * 2 + 2;\n        indices[index++] = _j2 * 2 + 0;\n        indices[index++] = _j2 * 2 + 1;\n        indices[index++] = _j2 * 2 + 1;\n        indices[index++] = _j2 * 2 + 3;\n    }\n    return {\n        indices: indices,\n        attributes: {\n            POSITION: {\n                size: 3,\n                value: positions\n            },\n            NORMAL: {\n                size: 3,\n                value: normals\n            }\n        }\n    };\n}\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6vtkZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\n#define SHADER_NAME column-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 normals;\\n\\nattribute vec3 instancePositions;\\nattribute float instanceElevations;\\nattribute vec3 instancePositions64Low;\\nattribute vec4 instanceFillColors;\\nattribute vec4 instanceLineColors;\\nattribute float instanceStrokeWidths;\\n\\nattribute vec3 instancePickingColors;\\nuniform float opacity;\\nuniform float radius;\\nuniform float angle;\\nuniform vec2 offset;\\nuniform bool extruded;\\nuniform bool isStroke;\\nuniform float coverage;\\nuniform float elevationScale;\\nuniform float edgeDistance;\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n  geometry.worldPosition = instancePositions;\\n\\n  vec4 color = isStroke ? instanceLineColors : instanceFillColors;\\n  mat2 rotationMatrix = mat2(cos(angle), sin(angle), -sin(angle), cos(angle));\\n  float elevation = 0.0;\\n  float strokeOffsetRatio = 1.0;\\n\\n  if (extruded) {\\n    elevation = instanceElevations * (positions.z + 1.0) / 2.0 * elevationScale;\\n  } else if (isStroke) {\\n    float widthPixels = clamp(project_size_to_pixel(instanceStrokeWidths * widthScale),\\n      widthMinPixels, widthMaxPixels) / 2.0;\\n    strokeOffsetRatio += sign(positions.z) * project_pixel_size(widthPixels) / project_size(edgeDistance * coverage * radius);\\n  }\\n  float shouldRender = float(color.a > 0.0 && instanceElevations >= 0.0);\\n  float dotRadius = radius * coverage * shouldRender;\\n\\n  geometry.normal = project_normal(vec3(rotationMatrix * normals.xy, normals.z));\\n  geometry.pickingColor = instancePickingColors;\\n  vec3 centroidPosition = vec3(instancePositions.xy, instancePositions.z + elevation);\\n  vec3 centroidPosition64Low = instancePositions64Low;\\n  vec3 pos = vec3(project_size(rotationMatrix * positions.xy * strokeOffsetRatio + offset) * dotRadius, 0.);\\n  DECKGL_FILTER_SIZE(pos, geometry);\\n\\n  gl_Position = project_position_to_clipspace(centroidPosition, centroidPosition64Low, pos, geometry.position);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  if (extruded && !isStroke) {\\n    vec3 lightColor = lighting_getLightColor(color.rgb, project_uCameraPosition, geometry.position.xyz, geometry.normal);\\n    vColor = vec4(lightColor, color.a * opacity);\\n  } else {\\n    vColor = vec4(color.rgb, color.a * opacity);\\n  }\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6ALYp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME column-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\n\\nvoid main(void) {\\n  gl_FragColor = vColor;\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7GdRF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GridCellLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@luma.gl/core\");\nvar _columnLayer = require(\"./column-layer\");\nvar _columnLayerDefault = parcelHelpers.interopDefault(_columnLayer);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar defaultProps = {\n    cellSize: {\n        type: \"number\",\n        min: 0,\n        value: 1000\n    },\n    offset: {\n        type: \"array\",\n        min: 0,\n        value: [\n            1,\n            1\n        ]\n    }\n};\nvar GridCellLayer = function(_ColumnLayer) {\n    (0, _inheritsDefault.default)(GridCellLayer1, _ColumnLayer);\n    var _super = _createSuper(GridCellLayer1);\n    function GridCellLayer1() {\n        (0, _classCallCheckDefault.default)(this, GridCellLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(GridCellLayer1, [\n        {\n            key: \"getGeometry\",\n            value: function getGeometry(diskResolution) {\n                return new (0, _core.CubeGeometry)();\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref) {\n                var uniforms = _ref.uniforms;\n                var _this$props = this.props, elevationScale = _this$props.elevationScale, extruded = _this$props.extruded, offset = _this$props.offset, coverage = _this$props.coverage, cellSize = _this$props.cellSize, angle = _this$props.angle;\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    radius: cellSize / 2,\n                    angle: angle,\n                    offset: offset,\n                    extruded: extruded,\n                    coverage: coverage,\n                    elevationScale: elevationScale,\n                    edgeDistance: 1,\n                    isWireframe: false\n                })).draw();\n            }\n        }\n    ]);\n    return GridCellLayer1;\n}((0, _columnLayerDefault.default));\nGridCellLayer.layerName = \"GridCellLayer\";\nGridCellLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@luma.gl/core\":\"bW3Qv\",\"./column-layer\":\"f0jHB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2wFY0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PathLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _pathTesselator = require(\"./path-tesselator\");\nvar _pathTesselatorDefault = parcelHelpers.interopDefault(_pathTesselator);\nvar _pathLayerVertexGlsl = require(\"./path-layer-vertex.glsl\");\nvar _pathLayerVertexGlslDefault = parcelHelpers.interopDefault(_pathLayerVertexGlsl);\nvar _pathLayerFragmentGlsl = require(\"./path-layer-fragment.glsl\");\nvar _pathLayerFragmentGlslDefault = parcelHelpers.interopDefault(_pathLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    widthUnits: \"meters\",\n    widthScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    widthMinPixels: {\n        type: \"number\",\n        min: 0,\n        value: 0\n    },\n    widthMaxPixels: {\n        type: \"number\",\n        min: 0,\n        value: Number.MAX_SAFE_INTEGER\n    },\n    rounded: false,\n    miterLimit: {\n        type: \"number\",\n        min: 0,\n        value: 4\n    },\n    billboard: false,\n    _pathType: null,\n    getPath: {\n        type: \"accessor\",\n        value: function value(object) {\n            return object.path;\n        }\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getWidth: {\n        type: \"accessor\",\n        value: 1\n    }\n};\nvar ATTRIBUTE_TRANSITION = {\n    enter: function enter(value, chunk) {\n        return chunk.length ? chunk.subarray(chunk.length - value.length) : value;\n    }\n};\nvar PathLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(PathLayer1, _Layer);\n    var _super = _createSuper(PathLayer1);\n    function PathLayer1() {\n        (0, _classCallCheckDefault.default)(this, PathLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(PathLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PathLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: (0, _pathLayerVertexGlslDefault.default),\n                    fs: (0, _pathLayerFragmentGlslDefault.default),\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                var noAlloc = true;\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    positions: {\n                        size: 3,\n                        vertexOffset: 1,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getPath\",\n                        update: this.calculatePositions,\n                        noAlloc: noAlloc,\n                        shaderAttributes: {\n                            instanceLeftPositions: {\n                                vertexOffset: 0\n                            },\n                            instanceStartPositions: {\n                                vertexOffset: 1\n                            },\n                            instanceEndPositions: {\n                                vertexOffset: 2\n                            },\n                            instanceRightPositions: {\n                                vertexOffset: 3\n                            }\n                        }\n                    },\n                    instanceTypes: {\n                        size: 1,\n                        type: 5121,\n                        update: this.calculateSegmentTypes,\n                        noAlloc: noAlloc\n                    },\n                    instanceStrokeWidths: {\n                        size: 1,\n                        accessor: \"getWidth\",\n                        transition: ATTRIBUTE_TRANSITION,\n                        defaultValue: 1\n                    },\n                    instanceColors: {\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        accessor: \"getColor\",\n                        transition: ATTRIBUTE_TRANSITION,\n                        defaultValue: DEFAULT_COLOR\n                    },\n                    instancePickingColors: {\n                        size: 3,\n                        type: 5121,\n                        accessor: function accessor(object, _ref) {\n                            var index = _ref.index, value = _ref.target;\n                            return _this.encodePickingColor(object && object.__source ? object.__source.index : index, value);\n                        }\n                    }\n                });\n                this.setState({\n                    pathTesselator: new (0, _pathTesselatorDefault.default)({\n                        fp64: this.use64bitPositions()\n                    })\n                });\n                if (this.props.getDashArray && !this.props.extensions.length) (0, _core.log).removed(\"getDashArray\", \"PathStyleExtension\")();\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref2) {\n                var oldProps = _ref2.oldProps, props = _ref2.props, changeFlags = _ref2.changeFlags;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PathLayer1.prototype), \"updateState\", this).call(this, {\n                    props: props,\n                    oldProps: oldProps,\n                    changeFlags: changeFlags\n                });\n                var attributeManager = this.getAttributeManager();\n                var geometryChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPath);\n                if (geometryChanged) {\n                    var pathTesselator = this.state.pathTesselator;\n                    var buffers = props.data.attributes || {};\n                    pathTesselator.updateGeometry({\n                        data: props.data,\n                        geometryBuffer: buffers.getPath,\n                        buffers: buffers,\n                        normalize: !props._pathType,\n                        loop: props._pathType === \"loop\",\n                        getGeometry: props.getPath,\n                        positionFormat: props.positionFormat,\n                        wrapLongitude: props.wrapLongitude,\n                        resolution: this.context.viewport.resolution,\n                        dataChanged: changeFlags.dataChanged\n                    });\n                    this.setState({\n                        numInstances: pathTesselator.instanceCount,\n                        startIndices: pathTesselator.vertexStarts\n                    });\n                    if (!changeFlags.dataChanged) attributeManager.invalidateAll();\n                }\n                if (changeFlags.extensionsChanged) {\n                    var gl = this.context.gl;\n                    if (this.state.model) this.state.model[\"delete\"]();\n                    this.setState({\n                        model: this._getModel(gl)\n                    });\n                    attributeManager.invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(params) {\n                var info = (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PathLayer1.prototype), \"getPickingInfo\", this).call(this, params);\n                var index = info.index;\n                var data = this.props.data;\n                if (data[0] && data[0].__source) info.object = data.find(function(d) {\n                    return d.__source.index === index;\n                });\n                return info;\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref3) {\n                var uniforms = _ref3.uniforms;\n                var viewport = this.context.viewport;\n                var _this$props = this.props, rounded = _this$props.rounded, billboard = _this$props.billboard, miterLimit = _this$props.miterLimit, widthUnits = _this$props.widthUnits, widthScale = _this$props.widthScale, widthMinPixels = _this$props.widthMinPixels, widthMaxPixels = _this$props.widthMaxPixels;\n                var widthMultiplier = widthUnits === \"pixels\" ? viewport.metersPerPixel : 1;\n                this.state.model.setUniforms(Object.assign({}, uniforms, {\n                    jointType: Number(rounded),\n                    billboard: billboard,\n                    widthScale: widthScale * widthMultiplier,\n                    miterLimit: miterLimit,\n                    widthMinPixels: widthMinPixels,\n                    widthMaxPixels: widthMaxPixels\n                })).draw();\n            }\n        },\n        {\n            key: \"_getModel\",\n            value: function _getModel(gl) {\n                var SEGMENT_INDICES = [\n                    0,\n                    1,\n                    2,\n                    1,\n                    4,\n                    2,\n                    1,\n                    3,\n                    4,\n                    3,\n                    5,\n                    4\n                ];\n                var SEGMENT_POSITIONS = [\n                    0,\n                    0,\n                    0,\n                    -1,\n                    0,\n                    1,\n                    1,\n                    -1,\n                    1,\n                    1,\n                    1,\n                    0\n                ];\n                return new (0, _core1.Model)(gl, Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new (0, _core1.Geometry)({\n                        drawMode: 4,\n                        attributes: {\n                            indices: new Uint16Array(SEGMENT_INDICES),\n                            positions: {\n                                value: new Float32Array(SEGMENT_POSITIONS),\n                                size: 2\n                            }\n                        }\n                    }),\n                    isInstanced: true\n                }));\n            }\n        },\n        {\n            key: \"calculatePositions\",\n            value: function calculatePositions(attribute) {\n                var pathTesselator = this.state.pathTesselator;\n                attribute.startIndices = pathTesselator.vertexStarts;\n                attribute.value = pathTesselator.get(\"positions\");\n            }\n        },\n        {\n            key: \"calculateSegmentTypes\",\n            value: function calculateSegmentTypes(attribute) {\n                var pathTesselator = this.state.pathTesselator;\n                attribute.startIndices = pathTesselator.vertexStarts;\n                attribute.value = pathTesselator.get(\"segmentTypes\");\n            }\n        },\n        {\n            key: \"wrapLongitude\",\n            get: function get() {\n                return false;\n            }\n        }\n    ]);\n    return PathLayer1;\n}((0, _core.Layer));\nPathLayer.layerName = \"PathLayer\";\nPathLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./path-tesselator\":\"6d15u\",\"./path-layer-vertex.glsl\":\"3zZLI\",\"./path-layer-fragment.glsl\":\"caI1Q\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6d15u\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PathTesselator);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _path = require(\"./path\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar START_CAP = 1;\nvar END_CAP = 2;\nvar INVALID = 4;\nvar PathTesselator = function(_Tesselator) {\n    (0, _inheritsDefault.default)(PathTesselator1, _Tesselator);\n    var _super = _createSuper(PathTesselator1);\n    function PathTesselator1(opts) {\n        (0, _classCallCheckDefault.default)(this, PathTesselator1);\n        return _super.call(this, _objectSpread(_objectSpread({}, opts), {}, {\n            attributes: {\n                positions: {\n                    size: 3,\n                    padding: 18,\n                    initialize: true,\n                    type: opts.fp64 ? Float64Array : Float32Array\n                },\n                segmentTypes: {\n                    size: 1,\n                    type: Uint8ClampedArray\n                }\n            }\n        }));\n    }\n    (0, _createClassDefault.default)(PathTesselator1, [\n        {\n            key: \"getGeometryFromBuffer\",\n            value: function getGeometryFromBuffer(buffer) {\n                if (this.normalize) return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PathTesselator1.prototype), \"getGeometryFromBuffer\", this).call(this, buffer);\n                return function() {\n                    return null;\n                };\n            }\n        },\n        {\n            key: \"normalizeGeometry\",\n            value: function normalizeGeometry(path) {\n                if (this.normalize) return (0, _path.normalizePath)(path, this.positionSize, this.opts.resolution, this.opts.wrapLongitude);\n                return path;\n            }\n        },\n        {\n            key: \"get\",\n            value: function get(attributeName) {\n                return this.attributes[attributeName];\n            }\n        },\n        {\n            key: \"getGeometrySize\",\n            value: function getGeometrySize(path) {\n                if (Array.isArray(path[0])) {\n                    var size = 0;\n                    var _iterator = _createForOfIteratorHelper(path), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var subPath = _step.value;\n                            size += this.getGeometrySize(subPath);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    return size;\n                }\n                var numPoints = this.getPathLength(path);\n                if (numPoints < 2) return 0;\n                if (this.isClosed(path)) return numPoints < 3 ? 0 : numPoints + 2;\n                return numPoints;\n            }\n        },\n        {\n            key: \"updateGeometryAttributes\",\n            value: function updateGeometryAttributes(path, context) {\n                if (context.geometrySize === 0) return;\n                if (path && Array.isArray(path[0])) {\n                    var _iterator2 = _createForOfIteratorHelper(path), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var subPath = _step2.value;\n                            var geometrySize = this.getGeometrySize(subPath);\n                            context.geometrySize = geometrySize;\n                            this.updateGeometryAttributes(subPath, context);\n                            context.vertexStart += geometrySize;\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                } else {\n                    this._updateSegmentTypes(path, context);\n                    this._updatePositions(path, context);\n                }\n            }\n        },\n        {\n            key: \"_updateSegmentTypes\",\n            value: function _updateSegmentTypes(path, context) {\n                var segmentTypes = this.attributes.segmentTypes;\n                var isPathClosed = this.isClosed(path);\n                var vertexStart = context.vertexStart, geometrySize = context.geometrySize;\n                segmentTypes.fill(0, vertexStart, vertexStart + geometrySize);\n                if (isPathClosed) {\n                    segmentTypes[vertexStart] = INVALID;\n                    segmentTypes[vertexStart + geometrySize - 2] = INVALID;\n                } else {\n                    segmentTypes[vertexStart] += START_CAP;\n                    segmentTypes[vertexStart + geometrySize - 2] += END_CAP;\n                }\n                segmentTypes[vertexStart + geometrySize - 1] = INVALID;\n            }\n        },\n        {\n            key: \"_updatePositions\",\n            value: function _updatePositions(path, context) {\n                var positions = this.attributes.positions;\n                if (!positions) return;\n                var vertexStart = context.vertexStart, geometrySize = context.geometrySize;\n                var p = new Array(3);\n                for(var i = vertexStart, ptIndex = 0; ptIndex < geometrySize; i++, ptIndex++){\n                    this.getPointOnPath(path, ptIndex, p);\n                    positions[i * 3] = p[0];\n                    positions[i * 3 + 1] = p[1];\n                    positions[i * 3 + 2] = p[2];\n                }\n            }\n        },\n        {\n            key: \"getPathLength\",\n            value: function getPathLength(path) {\n                return path.length / this.positionSize;\n            }\n        },\n        {\n            key: \"getPointOnPath\",\n            value: function getPointOnPath(path, index) {\n                var target = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n                var positionSize = this.positionSize;\n                if (index * positionSize >= path.length) index += 1 - path.length / positionSize;\n                var i = index * positionSize;\n                target[0] = path[i];\n                target[1] = path[i + 1];\n                target[2] = positionSize === 3 && path[i + 2] || 0;\n                return target;\n            }\n        },\n        {\n            key: \"isClosed\",\n            value: function isClosed(path) {\n                if (!this.normalize) return this.opts.loop;\n                var positionSize = this.positionSize;\n                var lastPointIndex = path.length - positionSize;\n                return path[0] === path[lastPointIndex] && path[1] === path[lastPointIndex + 1] && (positionSize === 2 || path[2] === path[lastPointIndex + 2]);\n            }\n        }\n    ]);\n    return PathTesselator1;\n}((0, _core.Tesselator));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"./path\":\"19wQL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"19wQL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalizePath\", ()=>normalizePath);\nvar _polygon = require(\"@math.gl/polygon\");\nfunction normalizePath(path, size, gridResolution, wrapLongitude) {\n    var flatPath = path;\n    if (Array.isArray(path[0])) {\n        var length = path.length * size;\n        flatPath = new Array(length);\n        for(var i = 0; i < path.length; i++)for(var j = 0; j < size; j++)flatPath[i * size + j] = path[i][j] || 0;\n    }\n    if (gridResolution) return (0, _polygon.cutPolylineByGrid)(flatPath, {\n        size: size,\n        gridResolution: gridResolution\n    });\n    if (wrapLongitude) return (0, _polygon.cutPolylineByMercatorBounds)(flatPath, {\n        size: size\n    });\n    return flatPath;\n}\n\n},{\"@math.gl/polygon\":\"iIlOq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iIlOq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Polygon\", ()=>(0, _polygonDefault.default));\nparcelHelpers.export(exports, \"getPolygonSignedArea\", ()=>(0, _polygonUtils.getPolygonSignedArea));\nparcelHelpers.export(exports, \"getPolygonWindingDirection\", ()=>(0, _polygonUtils.getPolygonWindingDirection));\nparcelHelpers.export(exports, \"forEachSegmentInPolygon\", ()=>(0, _polygonUtils.forEachSegmentInPolygon));\nparcelHelpers.export(exports, \"modifyPolygonWindingDirection\", ()=>(0, _polygonUtils.modifyPolygonWindingDirection));\nparcelHelpers.export(exports, \"WINDING\", ()=>(0, _polygonUtils.WINDING));\nparcelHelpers.export(exports, \"earcut\", ()=>(0, _earcut.earcut));\nparcelHelpers.export(exports, \"clipPolygon\", ()=>(0, _lineclip.clipPolygon));\nparcelHelpers.export(exports, \"clipPolyline\", ()=>(0, _lineclip.clipPolyline));\nparcelHelpers.export(exports, \"cutPolygonByGrid\", ()=>(0, _cutByGrid.cutPolygonByGrid));\nparcelHelpers.export(exports, \"cutPolylineByGrid\", ()=>(0, _cutByGrid.cutPolylineByGrid));\nparcelHelpers.export(exports, \"cutPolylineByMercatorBounds\", ()=>(0, _cutByMercatorBounds.cutPolylineByMercatorBounds));\nparcelHelpers.export(exports, \"cutPolygonByMercatorBounds\", ()=>(0, _cutByMercatorBounds.cutPolygonByMercatorBounds));\nparcelHelpers.export(exports, \"_Polygon\", ()=>(0, _polygonDefault.default));\nvar _polygon = require(\"./polygon\");\nvar _polygonDefault = parcelHelpers.interopDefault(_polygon);\nvar _polygonUtils = require(\"./polygon-utils\");\nvar _earcut = require(\"./earcut\");\nvar _lineclip = require(\"./lineclip\");\nvar _cutByGrid = require(\"./cut-by-grid\");\nvar _cutByMercatorBounds = require(\"./cut-by-mercator-bounds\");\n\n},{\"./polygon\":\"xTeBZ\",\"./polygon-utils\":\"gcOjj\",\"./earcut\":\"5EezL\",\"./lineclip\":\"f7QGz\",\"./cut-by-grid\":\"kiDZD\",\"./cut-by-mercator-bounds\":\"3lVtH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"xTeBZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _core = require(\"@math.gl/core\");\nvar _polygonUtils = require(\"./polygon-utils\");\nclass Polygon {\n    constructor(points, options = {}){\n        (0, _definePropertyDefault.default)(this, \"points\", void 0);\n        (0, _definePropertyDefault.default)(this, \"isFlatArray\", void 0);\n        (0, _definePropertyDefault.default)(this, \"options\", void 0);\n        this.points = points;\n        this.isFlatArray = !(0, _core.isArray)(points[0]);\n        this.options = {\n            start: options.start || 0,\n            end: options.end || points.length,\n            size: options.size || 2,\n            isClosed: options.isClosed\n        };\n        Object.freeze(this);\n    }\n    getSignedArea() {\n        if (this.isFlatArray) return (0, _polygonUtils.getPolygonSignedArea)(this.points, this.options);\n        return (0, _polygonUtils.getPolygonSignedAreaPoints)(this.points, this.options);\n    }\n    getArea() {\n        return Math.abs(this.getSignedArea());\n    }\n    getWindingDirection() {\n        return Math.sign(this.getSignedArea());\n    }\n    forEachSegment(visitor) {\n        if (this.isFlatArray) (0, _polygonUtils.forEachSegmentInPolygon)(this.points, (x1, y1, x2, y2, i1, i2)=>{\n            visitor([\n                x1,\n                y1\n            ], [\n                x2,\n                y2\n            ], i1, i2);\n        }, this.options);\n        else (0, _polygonUtils.forEachSegmentInPolygonPoints)(this.points, visitor, this.options);\n    }\n    modifyWindingDirection(direction) {\n        if (this.isFlatArray) return (0, _polygonUtils.modifyPolygonWindingDirection)(this.points, direction, this.options);\n        return (0, _polygonUtils.modifyPolygonWindingDirectionPoints)(this.points, direction, this.options);\n    }\n}\nexports.default = Polygon;\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@math.gl/core\":\"itQSe\",\"./polygon-utils\":\"gcOjj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gcOjj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"WINDING\", ()=>WINDING);\nparcelHelpers.export(exports, \"modifyPolygonWindingDirection\", ()=>modifyPolygonWindingDirection);\nparcelHelpers.export(exports, \"getPolygonWindingDirection\", ()=>getPolygonWindingDirection);\nparcelHelpers.export(exports, \"getPolygonSignedArea\", ()=>getPolygonSignedArea);\nparcelHelpers.export(exports, \"forEachSegmentInPolygon\", ()=>forEachSegmentInPolygon);\nparcelHelpers.export(exports, \"modifyPolygonWindingDirectionPoints\", ()=>modifyPolygonWindingDirectionPoints);\nparcelHelpers.export(exports, \"getPolygonWindingDirectionPoints\", ()=>getPolygonWindingDirectionPoints);\nparcelHelpers.export(exports, \"getPolygonSignedAreaPoints\", ()=>getPolygonSignedAreaPoints);\nparcelHelpers.export(exports, \"forEachSegmentInPolygonPoints\", ()=>forEachSegmentInPolygonPoints);\nvar _core = require(\"@math.gl/core\");\nlet WINDING;\n(function(WINDING1) {\n    WINDING1[WINDING1[\"CLOCKWISE\"] = 1] = \"CLOCKWISE\";\n    WINDING1[WINDING1[\"COUNTER_CLOCKWISE\"] = -1] = \"COUNTER_CLOCKWISE\";\n})(WINDING || (WINDING = {}));\nfunction modifyPolygonWindingDirection(points, direction, options = {}) {\n    const windingDirection = getPolygonWindingDirection(points, options);\n    if (windingDirection !== direction) {\n        reversePolygon(points, options);\n        return true;\n    }\n    return false;\n}\nfunction getPolygonWindingDirection(points, options = {}) {\n    return Math.sign(getPolygonSignedArea(points, options));\n}\nfunction getPolygonSignedArea(points, options = {}) {\n    const { start =0 , end =points.length  } = options;\n    const dim = options.size || 2;\n    let area = 0;\n    for(let i = start, j = end - dim; i < end; i += dim){\n        area += (points[i] - points[j]) * (points[i + 1] + points[j + 1]);\n        j = i;\n    }\n    return area / 2;\n}\nfunction forEachSegmentInPolygon(points, visitor, options = {}) {\n    const { start =0 , end =points.length , size =2 , isClosed  } = options;\n    const numPoints = (end - start) / size;\n    for(let i = 0; i < numPoints - 1; ++i)visitor(points[start + i * size], points[start + i * size + 1], points[start + (i + 1) * size], points[start + (i + 1) * size + 1], i, i + 1);\n    const endPointIndex = start + (numPoints - 1) * size;\n    const isClosedEx = isClosed || (0, _core.equals)(points[start], points[endPointIndex]) && (0, _core.equals)(points[start + 1], points[endPointIndex + 1]);\n    if (!isClosedEx) visitor(points[endPointIndex], points[endPointIndex + 1], points[start], points[start + 1], numPoints - 1, 0);\n}\nfunction reversePolygon(points, options) {\n    const { start =0 , end =points.length , size =2  } = options;\n    const numPoints = (end - start) / size;\n    const numSwaps = Math.floor(numPoints / 2);\n    for(let i = 0; i < numSwaps; ++i){\n        const b1 = start + i * size;\n        const b2 = start + (numPoints - 1 - i) * size;\n        for(let j = 0; j < size; ++j){\n            const tmp = points[b1 + j];\n            points[b1 + j] = points[b2 + j];\n            points[b2 + j] = tmp;\n        }\n    }\n}\nfunction modifyPolygonWindingDirectionPoints(points, direction, options = {}) {\n    const currentDirection = getPolygonWindingDirectionPoints(points, options);\n    if (currentDirection !== direction) {\n        points.reverse();\n        return true;\n    }\n    return false;\n}\nfunction getPolygonWindingDirectionPoints(points, options = {}) {\n    return Math.sign(getPolygonSignedAreaPoints(points, options));\n}\nfunction getPolygonSignedAreaPoints(points, options = {}) {\n    const { start =0 , end =points.length  } = options;\n    let area = 0;\n    for(let i = start, j = end - 1; i < end; ++i){\n        area += (points[i][0] - points[j][0]) * (points[i][1] + points[j][1]);\n        j = i;\n    }\n    return area / 2;\n}\nfunction forEachSegmentInPolygonPoints(points, visitor, options = {}) {\n    const { start =0 , end =points.length , isClosed  } = options;\n    for(let i = start; i < end - 1; ++i)visitor(points[i], points[i + 1], i, i + 1);\n    const isClosedEx = isClosed || (0, _core.equals)(points[end - 1], points[0]);\n    if (!isClosedEx) visitor(points[end - 1], points[0], end - 1, 0);\n}\n\n},{\"@math.gl/core\":\"itQSe\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5EezL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"earcut\", ()=>earcut);\nvar _polygonUtils = require(\"./polygon-utils\");\nfunction earcut(positions, holeIndices, dim = 2, areas) {\n    const hasHoles = holeIndices && holeIndices.length;\n    const outerLen = hasHoles ? holeIndices[0] * dim : positions.length;\n    let outerNode = linkedList(positions, 0, outerLen, dim, true, areas && areas[0]);\n    const triangles = [];\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n    let invSize;\n    let maxX;\n    let maxY;\n    let minX;\n    let minY;\n    let x;\n    let y;\n    if (hasHoles) outerNode = eliminateHoles(positions, holeIndices, outerNode, dim, areas);\n    if (positions.length > 80 * dim) {\n        minX = maxX = positions[0];\n        minY = maxY = positions[1];\n        for(let i = dim; i < outerLen; i += dim){\n            x = positions[i];\n            y = positions[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 1 / invSize : 0;\n    }\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n    return triangles;\n}\nfunction linkedList(data, start, end, dim, clockwise, area1) {\n    let i;\n    let last;\n    if (area1 === undefined) area1 = (0, _polygonUtils.getPolygonSignedArea)(data, {\n        start,\n        end,\n        size: dim\n    });\n    if (clockwise === area1 < 0) for(i = start; i < end; i += dim)last = insertNode(i, data[i], data[i + 1], last);\n    else for(i = end - dim; i >= start; i -= dim)last = insertNode(i, data[i], data[i + 1], last);\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n    return last;\n}\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n    let p = start;\n    let again;\n    do {\n        again = false;\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n        } else p = p.next;\n    }while (again || p !== end);\n    return end;\n}\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n    let stop = ear;\n    let prev;\n    let next;\n    while(ear.prev !== ear.next){\n        prev = ear.prev;\n        next = ear.next;\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n            removeNode(ear);\n            ear = next.next;\n            stop = next.next;\n            continue;\n        }\n        ear = next;\n        if (ear === stop) {\n            if (!pass) earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n            else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n            } else if (pass === 2) splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            break;\n        }\n    }\n}\nfunction isEar(ear) {\n    const a = ear.prev;\n    const b = ear;\n    const c = ear.next;\n    if (area(a, b, c) >= 0) return false;\n    let p = ear.next.next;\n    while(p !== ear.prev){\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n    return true;\n}\nfunction isEarHashed(ear, minX, minY, invSize) {\n    const a = ear.prev;\n    const b = ear;\n    const c = ear.next;\n    if (area(a, b, c) >= 0) return false;\n    const minTX = a.x < b.x ? a.x < c.x ? a.x : c.x : b.x < c.x ? b.x : c.x;\n    const minTY = a.y < b.y ? a.y < c.y ? a.y : c.y : b.y < c.y ? b.y : c.y;\n    const maxTX = a.x > b.x ? a.x > c.x ? a.x : c.x : b.x > c.x ? b.x : c.x;\n    const maxTY = a.y > b.y ? a.y > c.y ? a.y : c.y : b.y > c.y ? b.y : c.y;\n    const minZ = zOrder(minTX, minTY, minX, minY, invSize);\n    const maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n    let p = ear.prevZ;\n    let n = ear.nextZ;\n    while(p && p.z >= minZ && n && n.z <= maxZ){\n        if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n        if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n    while(p && p.z >= minZ){\n        if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n    while(n && n.z <= maxZ){\n        if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n    return true;\n}\nfunction cureLocalIntersections(start, triangles, dim) {\n    let p = start;\n    do {\n        const a = p.prev;\n        const b = p.next.next;\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n            removeNode(p);\n            removeNode(p.next);\n            p = start = b;\n        }\n        p = p.next;\n    }while (p !== start);\n    return filterPoints(p);\n}\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    let a = start;\n    do {\n        let b = a.next.next;\n        while(b !== a.prev){\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                let c = splitPolygon(a, b);\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n                earcutLinked(a, triangles, dim, minX, minY, invSize);\n                earcutLinked(c, triangles, dim, minX, minY, invSize);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    }while (a !== start);\n}\nfunction eliminateHoles(data, holeIndices, outerNode, dim, areas) {\n    const queue = [];\n    let i;\n    let len;\n    let start;\n    let end;\n    let list;\n    for(i = 0, len = holeIndices.length; i < len; i++){\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false, areas && areas[i + 1]);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n    queue.sort(compareX);\n    for(i = 0; i < queue.length; i++){\n        eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n    return outerNode;\n}\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\nfunction eliminateHole(hole, outerNode) {\n    outerNode = findHoleBridge(hole, outerNode);\n    if (outerNode) {\n        const b = splitPolygon(outerNode, hole);\n        filterPoints(outerNode, outerNode.next);\n        filterPoints(b, b.next);\n    }\n}\nfunction findHoleBridge(hole, outerNode) {\n    let p = outerNode;\n    const hx = hole.x;\n    const hy = hole.y;\n    let qx = -Infinity;\n    let m;\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    }while (p !== outerNode);\n    if (!m) return null;\n    if (hx === qx) return m;\n    const stop = m;\n    const mx = m.x;\n    const my = m.y;\n    let tanMin = Infinity;\n    let tan;\n    p = m;\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n            tan = Math.abs(hy - p.y) / (hx - p.x);\n            if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n        p = p.next;\n    }while (p !== stop);\n    return m;\n}\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\nfunction indexCurve(start, minX, minY, invSize) {\n    let p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    }while (p !== start);\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n    sortLinked(p);\n}\nfunction sortLinked(list) {\n    let e;\n    let i;\n    let inSize = 1;\n    let numMerges;\n    let p;\n    let pSize;\n    let q;\n    let qSize;\n    let tail;\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n        while(p){\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for(i = 0; i < inSize; i++){\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n            while(pSize > 0 || qSize > 0 && q){\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n                if (tail) tail.nextZ = e;\n                else list = e;\n                e.prevZ = tail;\n                tail = e;\n            }\n            p = q;\n        }\n        tail.nextZ = null;\n        inSize *= 2;\n    }while (numMerges > 1);\n    return list;\n}\nfunction zOrder(x, y, minX, minY, invSize) {\n    x = 32767 * (x - minX) * invSize;\n    y = 32767 * (y - minY) * invSize;\n    x = (x | x << 8) & 0x00ff00ff;\n    x = (x | x << 4) & 0x0f0f0f0f;\n    x = (x | x << 2) & 0x33333333;\n    x = (x | x << 1) & 0x55555555;\n    y = (y | y << 8) & 0x00ff00ff;\n    y = (y | y << 4) & 0x0f0f0f0f;\n    y = (y | y << 2) & 0x33333333;\n    y = (y | y << 1) & 0x55555555;\n    return x | y << 1;\n}\nfunction getLeftmost(start) {\n    let p = start;\n    let leftmost = start;\n    do {\n        if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;\n        p = p.next;\n    }while (p !== start);\n    return leftmost;\n}\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && (area(a.prev, a, b.prev) || area(a, b.prev, b)) || equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0);\n}\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\nfunction intersects(p1, q1, p2, q2) {\n    const o1 = sign(area(p1, q1, p2));\n    const o2 = sign(area(p1, q1, q2));\n    const o3 = sign(area(p2, q2, p1));\n    const o4 = sign(area(p2, q2, q1));\n    if (o1 !== o2 && o3 !== o4) return true;\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true;\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true;\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true;\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true;\n    return false;\n}\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\nfunction intersectsPolygon(a, b) {\n    let p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    }while (p !== a);\n    return false;\n}\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\nfunction middleInside(a, b) {\n    let p = a;\n    let inside = false;\n    const px = (a.x + b.x) / 2;\n    const py = (a.y + b.y) / 2;\n    do {\n        if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside;\n        p = p.next;\n    }while (p !== a);\n    return inside;\n}\nfunction splitPolygon(a, b) {\n    const a2 = new Node(a.i, a.x, a.y);\n    const b2 = new Node(b.i, b.x, b.y);\n    const an = a.next;\n    const bp = b.prev;\n    a.next = b;\n    b.prev = a;\n    a2.next = an;\n    an.prev = a2;\n    b2.next = a2;\n    a2.prev = b2;\n    bp.next = b2;\n    b2.prev = bp;\n    return b2;\n}\nfunction insertNode(i, x, y, last) {\n    const p = new Node(i, x, y);\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\nfunction Node(i, x, y) {\n    this.i = i;\n    this.x = x;\n    this.y = y;\n    this.prev = null;\n    this.next = null;\n    this.z = null;\n    this.prevZ = null;\n    this.nextZ = null;\n    this.steiner = false;\n}\n\n},{\"./polygon-utils\":\"gcOjj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f7QGz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"clipPolyline\", ()=>clipPolyline);\nparcelHelpers.export(exports, \"clipPolygon\", ()=>clipPolygon);\nparcelHelpers.export(exports, \"intersect\", ()=>intersect);\nparcelHelpers.export(exports, \"bitCode\", ()=>bitCode);\nvar _utils = require(\"./utils\");\nfunction clipPolyline(positions, bbox, options) {\n    const { size =2 , startIndex =0 , endIndex =positions.length  } = options || {};\n    const numPoints = (endIndex - startIndex) / size;\n    const result = [];\n    let part = [];\n    let a;\n    let b;\n    let codeA = -1;\n    let codeB;\n    let lastCode;\n    for(let i = 1; i < numPoints; i++){\n        a = (0, _utils.getPointAtIndex)(positions, i - 1, size, startIndex, a);\n        b = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, b);\n        if (codeA < 0) codeA = bitCode(a, bbox);\n        codeB = lastCode = bitCode(b, bbox);\n        while(true){\n            if (!(codeA | codeB)) {\n                (0, _utils.push)(part, a);\n                if (codeB !== lastCode) {\n                    (0, _utils.push)(part, b);\n                    if (i < numPoints - 1) {\n                        result.push(part);\n                        part = [];\n                    }\n                } else if (i === numPoints - 1) (0, _utils.push)(part, b);\n                break;\n            } else if (codeA & codeB) break;\n            else if (codeA) {\n                intersect(a, b, codeA, bbox, a);\n                codeA = bitCode(a, bbox);\n            } else {\n                intersect(a, b, codeB, bbox, b);\n                codeB = bitCode(b, bbox);\n            }\n        }\n        codeA = lastCode;\n    }\n    if (part.length) result.push(part);\n    return result;\n}\nfunction clipPolygon(positions, bbox, options) {\n    const { size =2 , endIndex =positions.length  } = options || {};\n    let { startIndex =0  } = options || {};\n    let numPoints = (endIndex - startIndex) / size;\n    let result;\n    let p;\n    let prev;\n    let inside;\n    let prevInside;\n    for(let edge = 1; edge <= 8; edge *= 2){\n        result = [];\n        prev = (0, _utils.getPointAtIndex)(positions, numPoints - 1, size, startIndex, prev);\n        prevInside = !(bitCode(prev, bbox) & edge);\n        for(let i = 0; i < numPoints; i++){\n            p = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, p);\n            inside = !(bitCode(p, bbox) & edge);\n            if (inside !== prevInside) (0, _utils.push)(result, intersect(prev, p, edge, bbox));\n            if (inside) (0, _utils.push)(result, p);\n            (0, _utils.copy)(prev, p);\n            prevInside = inside;\n        }\n        positions = result;\n        startIndex = 0;\n        numPoints = result.length / size;\n        if (!numPoints) break;\n    }\n    return result;\n}\nfunction intersect(a, b, edge, bbox, out = []) {\n    let t;\n    let snap;\n    if (edge & 8) {\n        t = (bbox[3] - a[1]) / (b[1] - a[1]);\n        snap = 3;\n    } else if (edge & 4) {\n        t = (bbox[1] - a[1]) / (b[1] - a[1]);\n        snap = 1;\n    } else if (edge & 2) {\n        t = (bbox[2] - a[0]) / (b[0] - a[0]);\n        snap = 2;\n    } else if (edge & 1) {\n        t = (bbox[0] - a[0]) / (b[0] - a[0]);\n        snap = 0;\n    } else return null;\n    for(let i = 0; i < a.length; i++)out[i] = (snap & 1) === i ? bbox[snap] : t * (b[i] - a[i]) + a[i];\n    return out;\n}\nfunction bitCode(p, bbox) {\n    let code = 0;\n    if (p[0] < bbox[0]) code |= 1;\n    else if (p[0] > bbox[2]) code |= 2;\n    if (p[1] < bbox[1]) code |= 4;\n    else if (p[1] > bbox[3]) code |= 8;\n    return code;\n}\n\n},{\"./utils\":\"gSYB0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gSYB0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"push\", ()=>push);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"getPointAtIndex\", ()=>getPointAtIndex);\nfunction push(target, source) {\n    const size = source.length;\n    const startIndex = target.length;\n    if (startIndex > 0) {\n        let isDuplicate = true;\n        for(let i = 0; i < size; i++)if (target[startIndex - size + i] !== source[i]) {\n            isDuplicate = false;\n            break;\n        }\n        if (isDuplicate) return false;\n    }\n    for(let i = 0; i < size; i++)target[startIndex + i] = source[i];\n    return true;\n}\nfunction copy(target, source) {\n    const size = source.length;\n    for(let i = 0; i < size; i++)target[i] = source[i];\n}\nfunction getPointAtIndex(positions, index, size, offset, out = []) {\n    const startI = offset + index * size;\n    for(let i = 0; i < size; i++)out[i] = positions[startI + i];\n    return out;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kiDZD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cutPolylineByGrid\", ()=>cutPolylineByGrid);\nparcelHelpers.export(exports, \"cutPolygonByGrid\", ()=>cutPolygonByGrid);\nvar _lineclip = require(\"./lineclip\");\nvar _utils = require(\"./utils\");\nfunction cutPolylineByGrid(positions, options) {\n    const { size =2 , broken =false , gridResolution =10 , gridOffset =[\n        0,\n        0\n    ] , startIndex =0 , endIndex =positions.length  } = options || {};\n    const numPoints = (endIndex - startIndex) / size;\n    let part = [];\n    const result = [\n        part\n    ];\n    const a = (0, _utils.getPointAtIndex)(positions, 0, size, startIndex);\n    let b;\n    let codeB;\n    const cell = getGridCell(a, gridResolution, gridOffset, []);\n    const scratchPoint = [];\n    (0, _utils.push)(part, a);\n    for(let i = 1; i < numPoints; i++){\n        b = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, b);\n        codeB = (0, _lineclip.bitCode)(b, cell);\n        while(codeB){\n            (0, _lineclip.intersect)(a, b, codeB, cell, scratchPoint);\n            const codeAlt = (0, _lineclip.bitCode)(scratchPoint, cell);\n            if (codeAlt) {\n                (0, _lineclip.intersect)(a, scratchPoint, codeAlt, cell, scratchPoint);\n                codeB = codeAlt;\n            }\n            (0, _utils.push)(part, scratchPoint);\n            (0, _utils.copy)(a, scratchPoint);\n            moveToNeighborCell(cell, gridResolution, codeB);\n            if (broken && part.length > size) {\n                part = [];\n                result.push(part);\n                (0, _utils.push)(part, a);\n            }\n            codeB = (0, _lineclip.bitCode)(b, cell);\n        }\n        (0, _utils.push)(part, b);\n        (0, _utils.copy)(a, b);\n    }\n    return broken ? result : result[0];\n}\nconst TYPE_INSIDE = 0;\nconst TYPE_BORDER = 1;\nfunction concatInPlace(arr1, arr2) {\n    for(let i = 0; i < arr2.length; i++)arr1.push(arr2[i]);\n    return arr1;\n}\nfunction cutPolygonByGrid(positions, holeIndices = null, options) {\n    if (!positions.length) return [];\n    const { size =2 , gridResolution =10 , gridOffset =[\n        0,\n        0\n    ] , edgeTypes =false  } = options || {};\n    const result = [];\n    const queue = [\n        {\n            pos: positions,\n            types: edgeTypes ? new Array(positions.length / size).fill(TYPE_BORDER) : null,\n            holes: holeIndices || []\n        }\n    ];\n    const bbox = [\n        [],\n        []\n    ];\n    let cell = [];\n    while(queue.length){\n        const { pos , types , holes  } = queue.shift();\n        getBoundingBox(pos, size, holes[0] || pos.length, bbox);\n        cell = getGridCell(bbox[0], gridResolution, gridOffset, cell);\n        const code = (0, _lineclip.bitCode)(bbox[1], cell);\n        if (code) {\n            let parts = bisectPolygon(pos, types, size, 0, holes[0] || pos.length, cell, code);\n            const polygonLow = {\n                pos: parts[0].pos,\n                types: parts[0].types,\n                holes: []\n            };\n            const polygonHigh = {\n                pos: parts[1].pos,\n                types: parts[1].types,\n                holes: []\n            };\n            queue.push(polygonLow, polygonHigh);\n            for(let i = 0; i < holes.length; i++){\n                parts = bisectPolygon(pos, types, size, holes[i], holes[i + 1] || pos.length, cell, code);\n                if (parts[0]) {\n                    polygonLow.holes.push(polygonLow.pos.length);\n                    polygonLow.pos = concatInPlace(polygonLow.pos, parts[0].pos);\n                    if (edgeTypes) polygonLow.types = concatInPlace(polygonLow.types, parts[0].types);\n                }\n                if (parts[1]) {\n                    polygonHigh.holes.push(polygonHigh.pos.length);\n                    polygonHigh.pos = concatInPlace(polygonHigh.pos, parts[1].pos);\n                    if (edgeTypes) polygonHigh.types = concatInPlace(polygonHigh.types, parts[1].types);\n                }\n            }\n        } else {\n            const polygon = {\n                positions: pos\n            };\n            if (edgeTypes) polygon.edgeTypes = types;\n            if (holes.length) polygon.holeIndices = holes;\n            result.push(polygon);\n        }\n    }\n    return result;\n}\nfunction bisectPolygon(positions, edgeTypes, size, startIndex, endIndex, bbox, edge) {\n    const numPoints = (endIndex - startIndex) / size;\n    const resultLow = [];\n    const resultHigh = [];\n    const typesLow = [];\n    const typesHigh = [];\n    const scratchPoint = [];\n    let p;\n    let side;\n    let type;\n    const prev = (0, _utils.getPointAtIndex)(positions, numPoints - 1, size, startIndex);\n    let prevSide = Math.sign(edge & 8 ? prev[1] - bbox[3] : prev[0] - bbox[2]);\n    let prevType = edgeTypes && edgeTypes[numPoints - 1];\n    let lowPointCount = 0;\n    let highPointCount = 0;\n    for(let i = 0; i < numPoints; i++){\n        p = (0, _utils.getPointAtIndex)(positions, i, size, startIndex, p);\n        side = Math.sign(edge & 8 ? p[1] - bbox[3] : p[0] - bbox[2]);\n        type = edgeTypes && edgeTypes[startIndex / size + i];\n        if (side && prevSide && prevSide !== side) {\n            (0, _lineclip.intersect)(prev, p, edge, bbox, scratchPoint);\n            (0, _utils.push)(resultLow, scratchPoint) && typesLow.push(prevType);\n            (0, _utils.push)(resultHigh, scratchPoint) && typesHigh.push(prevType);\n        }\n        if (side <= 0) {\n            (0, _utils.push)(resultLow, p) && typesLow.push(type);\n            lowPointCount -= side;\n        } else if (typesLow.length) typesLow[typesLow.length - 1] = TYPE_INSIDE;\n        if (side >= 0) {\n            (0, _utils.push)(resultHigh, p) && typesHigh.push(type);\n            highPointCount += side;\n        } else if (typesHigh.length) typesHigh[typesHigh.length - 1] = TYPE_INSIDE;\n        (0, _utils.copy)(prev, p);\n        prevSide = side;\n        prevType = type;\n    }\n    return [\n        lowPointCount ? {\n            pos: resultLow,\n            types: edgeTypes && typesLow\n        } : null,\n        highPointCount ? {\n            pos: resultHigh,\n            types: edgeTypes && typesHigh\n        } : null\n    ];\n}\nfunction getGridCell(p, gridResolution, gridOffset, out) {\n    const left = Math.floor((p[0] - gridOffset[0]) / gridResolution) * gridResolution + gridOffset[0];\n    const bottom = Math.floor((p[1] - gridOffset[1]) / gridResolution) * gridResolution + gridOffset[1];\n    out[0] = left;\n    out[1] = bottom;\n    out[2] = left + gridResolution;\n    out[3] = bottom + gridResolution;\n    return out;\n}\nfunction moveToNeighborCell(cell, gridResolution, edge) {\n    if (edge & 8) {\n        cell[1] += gridResolution;\n        cell[3] += gridResolution;\n    } else if (edge & 4) {\n        cell[1] -= gridResolution;\n        cell[3] -= gridResolution;\n    } else if (edge & 2) {\n        cell[0] += gridResolution;\n        cell[2] += gridResolution;\n    } else if (edge & 1) {\n        cell[0] -= gridResolution;\n        cell[2] -= gridResolution;\n    }\n}\nfunction getBoundingBox(positions, size, endIndex, out) {\n    let minX = Infinity;\n    let maxX = -Infinity;\n    let minY = Infinity;\n    let maxY = -Infinity;\n    for(let i = 0; i < endIndex; i += size){\n        const x = positions[i];\n        const y = positions[i + 1];\n        minX = x < minX ? x : minX;\n        maxX = x > maxX ? x : maxX;\n        minY = y < minY ? y : minY;\n        maxY = y > maxY ? y : maxY;\n    }\n    out[0][0] = minX;\n    out[0][1] = minY;\n    out[1][0] = maxX;\n    out[1][1] = maxY;\n    return out;\n}\n\n},{\"./lineclip\":\"f7QGz\",\"./utils\":\"gSYB0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3lVtH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cutPolylineByMercatorBounds\", ()=>cutPolylineByMercatorBounds);\nparcelHelpers.export(exports, \"cutPolygonByMercatorBounds\", ()=>cutPolygonByMercatorBounds);\nvar _cutByGrid = require(\"./cut-by-grid\");\nvar _utils = require(\"./utils\");\nconst DEFAULT_MAX_LATITUDE = 85.051129;\nfunction cutPolylineByMercatorBounds(positions, options) {\n    const { size =2 , startIndex =0 , endIndex =positions.length , normalize =true  } = options || {};\n    const newPositions = positions.slice(startIndex, endIndex);\n    wrapLongitudesForShortestPath(newPositions, size, 0, endIndex - startIndex);\n    const parts = (0, _cutByGrid.cutPolylineByGrid)(newPositions, {\n        size,\n        broken: true,\n        gridResolution: 360,\n        gridOffset: [\n            -180,\n            -180\n        ]\n    });\n    if (normalize) for (const part of parts)shiftLongitudesIntoRange(part, size);\n    return parts;\n}\nfunction cutPolygonByMercatorBounds(positions, holeIndices = null, options) {\n    const { size =2 , normalize =true , edgeTypes =false  } = options || {};\n    holeIndices = holeIndices || [];\n    const newPositions = [];\n    const newHoleIndices = [];\n    let srcStartIndex = 0;\n    let targetIndex = 0;\n    for(let ringIndex = 0; ringIndex <= holeIndices.length; ringIndex++){\n        const srcEndIndex = holeIndices[ringIndex] || positions.length;\n        const targetStartIndex = targetIndex;\n        const splitIndex = findSplitIndex(positions, size, srcStartIndex, srcEndIndex);\n        for(let i = splitIndex; i < srcEndIndex; i++)newPositions[targetIndex++] = positions[i];\n        for(let i1 = srcStartIndex; i1 < splitIndex; i1++)newPositions[targetIndex++] = positions[i1];\n        wrapLongitudesForShortestPath(newPositions, size, targetStartIndex, targetIndex);\n        insertPoleVertices(newPositions, size, targetStartIndex, targetIndex, options === null || options === void 0 ? void 0 : options.maxLatitude);\n        srcStartIndex = srcEndIndex;\n        newHoleIndices[ringIndex] = targetIndex;\n    }\n    newHoleIndices.pop();\n    const parts = (0, _cutByGrid.cutPolygonByGrid)(newPositions, newHoleIndices, {\n        size,\n        gridResolution: 360,\n        gridOffset: [\n            -180,\n            -180\n        ],\n        edgeTypes\n    });\n    if (normalize) for (const part of parts)shiftLongitudesIntoRange(part.positions, size);\n    return parts;\n}\nfunction findSplitIndex(positions, size, startIndex, endIndex) {\n    let maxLat = -1;\n    let pointIndex = -1;\n    for(let i = startIndex + 1; i < endIndex; i += size){\n        const lat = Math.abs(positions[i]);\n        if (lat > maxLat) {\n            maxLat = lat;\n            pointIndex = i - 1;\n        }\n    }\n    return pointIndex;\n}\nfunction insertPoleVertices(positions, size, startIndex, endIndex, maxLatitude = DEFAULT_MAX_LATITUDE) {\n    const firstLng = positions[startIndex];\n    const lastLng = positions[endIndex - size];\n    if (Math.abs(firstLng - lastLng) > 180) {\n        const p = (0, _utils.getPointAtIndex)(positions, 0, size, startIndex);\n        p[0] += Math.round((lastLng - firstLng) / 360) * 360;\n        (0, _utils.push)(positions, p);\n        p[1] = Math.sign(p[1]) * maxLatitude;\n        (0, _utils.push)(positions, p);\n        p[0] = firstLng;\n        (0, _utils.push)(positions, p);\n    }\n}\nfunction wrapLongitudesForShortestPath(positions, size, startIndex, endIndex) {\n    let prevLng = positions[0];\n    let lng;\n    for(let i = startIndex; i < endIndex; i += size){\n        lng = positions[i];\n        const delta = lng - prevLng;\n        if (delta > 180 || delta < -180) lng -= Math.round(delta / 360) * 360;\n        positions[i] = prevLng = lng;\n    }\n}\nfunction shiftLongitudesIntoRange(positions, size) {\n    let refLng;\n    const pointCount = positions.length / size;\n    for(let i = 0; i < pointCount; i++){\n        refLng = positions[i * size];\n        if ((refLng + 180) % 360 !== 0) break;\n    }\n    const delta = -Math.round(refLng / 360) * 360;\n    if (delta === 0) return;\n    for(let i2 = 0; i2 < pointCount; i2++)positions[i2 * size] += delta;\n}\n\n},{\"./cut-by-grid\":\"kiDZD\",\"./utils\":\"gSYB0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3zZLI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME path-layer-vertex-shader\\n\\nattribute vec2 positions;\\n\\nattribute float instanceTypes;\\nattribute vec3 instanceStartPositions;\\nattribute vec3 instanceEndPositions;\\nattribute vec3 instanceLeftPositions;\\nattribute vec3 instanceRightPositions;\\nattribute vec3 instanceLeftPositions64Low;\\nattribute vec3 instanceStartPositions64Low;\\nattribute vec3 instanceEndPositions64Low;\\nattribute vec3 instanceRightPositions64Low;\\nattribute float instanceStrokeWidths;\\nattribute vec4 instanceColors;\\nattribute vec3 instancePickingColors;\\n\\nuniform float widthScale;\\nuniform float widthMinPixels;\\nuniform float widthMaxPixels;\\nuniform float jointType;\\nuniform float miterLimit;\\nuniform bool billboard;\\n\\nuniform float opacity;\\n\\nvarying vec4 vColor;\\nvarying vec2 vCornerOffset;\\nvarying float vMiterLength;\\nvarying vec2 vPathPosition;\\nvarying float vPathLength;\\n\\nconst float EPSILON = 0.001;\\nconst vec3 ZERO_OFFSET = vec3(0.0);\\n\\nfloat flipIfTrue(bool flag) {\\n  return -(float(flag) * 2. - 1.);\\n}\\nvec3 lineJoin(\\n  vec3 prevPoint, vec3 currPoint, vec3 nextPoint,\\n  vec2 width\\n) {\\n  bool isEnd = positions.x > 0.0;\\n  float sideOfPath = positions.y;\\n  float isJoint = float(sideOfPath == 0.0);\\n\\n  vec3 deltaA3 = (currPoint - prevPoint);\\n  vec3 deltaB3 = (nextPoint - currPoint);\\n\\n  mat3 rotationMatrix;\\n  bool needsRotation = !billboard && project_needs_rotation(currPoint, rotationMatrix);\\n  if (needsRotation) {\\n    deltaA3 = deltaA3 * rotationMatrix;\\n    deltaB3 = deltaB3 * rotationMatrix;\\n  }\\n  vec2 deltaA = deltaA3.xy / width;\\n  vec2 deltaB = deltaB3.xy / width;\\n\\n  float lenA = length(deltaA);\\n  float lenB = length(deltaB);\\n\\n  vec2 dirA = lenA > 0. ? normalize(deltaA) : vec2(0.0, 0.0);\\n  vec2 dirB = lenB > 0. ? normalize(deltaB) : vec2(0.0, 0.0);\\n\\n  vec2 perpA = vec2(-dirA.y, dirA.x);\\n  vec2 perpB = vec2(-dirB.y, dirB.x);\\n  vec2 tangent = dirA + dirB;\\n  tangent = length(tangent) > 0. ? normalize(tangent) : perpA;\\n  vec2 miterVec = vec2(-tangent.y, tangent.x);\\n  vec2 dir = isEnd ? dirA : dirB;\\n  vec2 perp = isEnd ? perpA : perpB;\\n  float L = isEnd ? lenA : lenB;\\n  float sinHalfA = abs(dot(miterVec, perp));\\n  float cosHalfA = abs(dot(dirA, miterVec));\\n  float turnDirection = flipIfTrue(dirA.x * dirB.y >= dirA.y * dirB.x);\\n  float cornerPosition = sideOfPath * turnDirection;\\n\\n  float miterSize = 1.0 / max(sinHalfA, EPSILON);\\n  miterSize = mix(\\n    min(miterSize, max(lenA, lenB) / max(cosHalfA, EPSILON)),\\n    miterSize,\\n    step(0.0, cornerPosition)\\n  );\\n\\n  vec2 offsetVec = mix(miterVec * miterSize, perp, step(0.5, cornerPosition))\\n    * (sideOfPath + isJoint * turnDirection);\\n  bool isStartCap = lenA == 0.0 || (!isEnd && (instanceTypes == 1.0 || instanceTypes == 3.0));\\n  bool isEndCap = lenB == 0.0 || (isEnd && (instanceTypes == 2.0 || instanceTypes == 3.0));\\n  bool isCap = isStartCap || isEndCap;\\n  if (isCap) {\\n    offsetVec = mix(perp * sideOfPath, dir * jointType * 4.0 * flipIfTrue(isStartCap), isJoint);\\n  }\\n  vPathLength = L;\\n  vCornerOffset = offsetVec;\\n  vMiterLength = dot(vCornerOffset, miterVec * turnDirection);\\n  vMiterLength = isCap ? isJoint : vMiterLength;\\n\\n  vec2 offsetFromStartOfPath = vCornerOffset + deltaA * float(isEnd);\\n  vPathPosition = vec2(\\n    dot(offsetFromStartOfPath, perp),\\n    dot(offsetFromStartOfPath, dir)\\n  );\\n  geometry.uv = vPathPosition;\\n\\n  float isValid = step(instanceTypes, 3.5);\\n  vec3 offset = vec3(offsetVec * width * isValid, 0.0);\\n\\n  if (needsRotation) {\\n    offset = rotationMatrix * offset;\\n  }\\n  return currPoint + offset;\\n}\\nvoid clipLine(inout vec4 position, vec4 refPosition) {\\n  if (position.w < EPSILON) {\\n    float r = (EPSILON - refPosition.w) / (position.w - refPosition.w);\\n    position = refPosition + (position - refPosition) * r;\\n  }\\n}\\n\\nvoid main() {\\n  geometry.worldPosition = instanceStartPositions;\\n  geometry.worldPositionAlt = instanceEndPositions;\\n  geometry.pickingColor = instancePickingColors;\\n\\n  vec2 widthPixels = vec2(clamp(project_size_to_pixel(instanceStrokeWidths * widthScale),\\n    widthMinPixels, widthMaxPixels) / 2.0);\\n  vec3 width;\\n\\n  vColor = vec4(instanceColors.rgb, instanceColors.a * opacity);\\n\\n  float isEnd = positions.x;\\n\\n  vec3 prevPosition = mix(instanceLeftPositions, instanceStartPositions, isEnd);\\n  vec3 prevPosition64Low = mix(instanceLeftPositions64Low, instanceStartPositions64Low, isEnd);\\n\\n  vec3 currPosition = mix(instanceStartPositions, instanceEndPositions, isEnd);\\n  vec3 currPosition64Low = mix(instanceStartPositions64Low, instanceEndPositions64Low, isEnd);\\n\\n  vec3 nextPosition = mix(instanceEndPositions, instanceRightPositions, isEnd);\\n  vec3 nextPosition64Low = mix(instanceEndPositions64Low, instanceRightPositions64Low, isEnd);\\n\\n  if (billboard) {\\n    vec4 prevPositionScreen = project_position_to_clipspace(prevPosition, prevPosition64Low, ZERO_OFFSET);\\n    vec4 currPositionScreen = project_position_to_clipspace(currPosition, currPosition64Low, ZERO_OFFSET, geometry.position);\\n    vec4 nextPositionScreen = project_position_to_clipspace(nextPosition, nextPosition64Low, ZERO_OFFSET);\\n\\n    clipLine(prevPositionScreen, currPositionScreen);\\n    clipLine(nextPositionScreen, currPositionScreen);\\n    clipLine(currPositionScreen, mix(nextPositionScreen, prevPositionScreen, isEnd));\\n\\n    width = vec3(widthPixels, 0.0);\\n    DECKGL_FILTER_SIZE(width, geometry);\\n\\n    vec3 pos = lineJoin(\\n      prevPositionScreen.xyz / prevPositionScreen.w,\\n      currPositionScreen.xyz / currPositionScreen.w,\\n      nextPositionScreen.xyz / nextPositionScreen.w,\\n      project_pixel_size_to_clipspace(width.xy)\\n    );\\n\\n    gl_Position = vec4(pos * currPositionScreen.w, currPositionScreen.w);\\n  } else {\\n    prevPosition = project_position(prevPosition, prevPosition64Low);\\n    currPosition = project_position(currPosition, currPosition64Low);\\n    nextPosition = project_position(nextPosition, nextPosition64Low);\\n\\n    width = vec3(project_pixel_size(widthPixels), 0.0);\\n    DECKGL_FILTER_SIZE(width, geometry);\\n\\n    vec4 pos = vec4(\\n      lineJoin(prevPosition, currPosition, nextPosition, width.xy),\\n      1.0);\\n    geometry.position = pos;\\n    gl_Position = project_common_position_to_clipspace(pos);\\n  }\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"caI1Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME path-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform float jointType;\\nuniform float miterLimit;\\n\\nvarying vec4 vColor;\\nvarying vec2 vCornerOffset;\\nvarying float vMiterLength;\\nvarying vec2 vPathPosition;\\nvarying float vPathLength;\\n\\nvoid main(void) {\\n  geometry.uv = vPathPosition;\\n\\n  if (vPathPosition.y < 0.0 || vPathPosition.y > vPathLength) {\\n    if (jointType > 0.0 && length(vCornerOffset) > 1.0) {\\n      discard;\\n    }\\n    if (jointType == 0.0 && vMiterLength > miterLimit + 1.0) {\\n      discard;\\n    }\\n  }\\n  gl_FragColor = vColor;\\n\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jexah\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PolygonLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _solidPolygonLayer = require(\"../solid-polygon-layer/solid-polygon-layer\");\nvar _solidPolygonLayerDefault = parcelHelpers.interopDefault(_solidPolygonLayer);\nvar _pathLayer = require(\"../path-layer/path-layer\");\nvar _pathLayerDefault = parcelHelpers.interopDefault(_pathLayer);\nvar _polygon = require(\"../solid-polygon-layer/polygon\");\nvar _utils = require(\"../utils\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar defaultLineColor = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultFillColor = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    stroked: true,\n    filled: true,\n    extruded: false,\n    elevationScale: 1,\n    wireframe: false,\n    _normalize: true,\n    lineWidthUnits: \"meters\",\n    lineWidthScale: 1,\n    lineWidthMinPixels: 0,\n    lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n    lineJointRounded: false,\n    lineMiterLimit: 4,\n    getPolygon: {\n        type: \"accessor\",\n        value: function value(f) {\n            return f.polygon;\n        }\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: defaultFillColor\n    },\n    getLineColor: {\n        type: \"accessor\",\n        value: defaultLineColor\n    },\n    getLineWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    getElevation: {\n        type: \"accessor\",\n        value: 1000\n    },\n    material: true\n};\nvar PolygonLayer = function(_CompositeLayer) {\n    (0, _inheritsDefault.default)(PolygonLayer1, _CompositeLayer);\n    var _super = _createSuper(PolygonLayer1);\n    function PolygonLayer1() {\n        (0, _classCallCheckDefault.default)(this, PolygonLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(PolygonLayer1, [\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.state = {\n                    paths: []\n                };\n                if (this.props.getLineDashArray) (0, _core.log).removed(\"getLineDashArray\", \"PathStyleExtension\")();\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var _this = this;\n                var oldProps = _ref.oldProps, props = _ref.props, changeFlags = _ref.changeFlags;\n                var geometryChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPolygon);\n                if (geometryChanged && Array.isArray(changeFlags.dataChanged)) {\n                    var paths = this.state.paths.slice();\n                    var pathsDiff = changeFlags.dataChanged.map(function(dataRange) {\n                        return (0, _utils.replaceInRange)({\n                            data: paths,\n                            getIndex: function getIndex(p) {\n                                return p.__source.index;\n                            },\n                            dataRange: dataRange,\n                            replace: _this._getPaths(dataRange)\n                        });\n                    });\n                    this.setState({\n                        paths: paths,\n                        pathsDiff: pathsDiff\n                    });\n                } else if (geometryChanged) this.setState({\n                    paths: this._getPaths(),\n                    pathsDiff: null\n                });\n            }\n        },\n        {\n            key: \"_getPaths\",\n            value: function _getPaths() {\n                var dataRange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                var _this$props = this.props, data = _this$props.data, getPolygon = _this$props.getPolygon, positionFormat = _this$props.positionFormat, _normalize = _this$props._normalize;\n                var paths = [];\n                var positionSize = positionFormat === \"XY\" ? 2 : 3;\n                var startRow = dataRange.startRow, endRow = dataRange.endRow;\n                var _createIterable = (0, _core.createIterable)(data, startRow, endRow), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n                var _iterator = _createForOfIteratorHelper(iterable), _step;\n                try {\n                    for(_iterator.s(); !(_step = _iterator.n()).done;){\n                        var object = _step.value;\n                        objectInfo.index++;\n                        var polygon = getPolygon(object, objectInfo);\n                        if (_normalize) polygon = _polygon.normalize(polygon, positionSize);\n                        var _polygon1 = polygon, holeIndices = _polygon1.holeIndices;\n                        var positions = polygon.positions || polygon;\n                        if (holeIndices) for(var i = 0; i <= holeIndices.length; i++){\n                            var path = positions.slice(holeIndices[i - 1] || 0, holeIndices[i] || positions.length);\n                            paths.push(this.getSubLayerRow({\n                                path: path\n                            }, object, objectInfo.index));\n                        }\n                        else paths.push(this.getSubLayerRow({\n                            path: positions\n                        }, object, objectInfo.index));\n                    }\n                } catch (err) {\n                    _iterator.e(err);\n                } finally{\n                    _iterator.f();\n                }\n                return paths;\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers() {\n                var _this$props2 = this.props, data = _this$props2.data, _dataDiff = _this$props2._dataDiff, stroked = _this$props2.stroked, filled = _this$props2.filled, extruded = _this$props2.extruded, wireframe = _this$props2.wireframe, _normalize = _this$props2._normalize, elevationScale = _this$props2.elevationScale, transitions = _this$props2.transitions, positionFormat = _this$props2.positionFormat;\n                var _this$props3 = this.props, lineWidthUnits = _this$props3.lineWidthUnits, lineWidthScale = _this$props3.lineWidthScale, lineWidthMinPixels = _this$props3.lineWidthMinPixels, lineWidthMaxPixels = _this$props3.lineWidthMaxPixels, lineJointRounded = _this$props3.lineJointRounded, lineMiterLimit = _this$props3.lineMiterLimit, lineDashJustified = _this$props3.lineDashJustified;\n                var _this$props4 = this.props, getFillColor = _this$props4.getFillColor, getLineColor = _this$props4.getLineColor, getLineWidth = _this$props4.getLineWidth, getLineDashArray = _this$props4.getLineDashArray, getElevation = _this$props4.getElevation, getPolygon = _this$props4.getPolygon, updateTriggers = _this$props4.updateTriggers, material = _this$props4.material;\n                var _this$state = this.state, paths = _this$state.paths, pathsDiff = _this$state.pathsDiff;\n                var FillLayer = this.getSubLayerClass(\"fill\", (0, _solidPolygonLayerDefault.default));\n                var StrokeLayer = this.getSubLayerClass(\"stroke\", (0, _pathLayerDefault.default));\n                var polygonLayer = this.shouldRenderSubLayer(\"fill\", paths) && new FillLayer({\n                    _dataDiff: _dataDiff,\n                    extruded: extruded,\n                    elevationScale: elevationScale,\n                    filled: filled,\n                    wireframe: wireframe,\n                    _normalize: _normalize,\n                    getElevation: getElevation,\n                    getFillColor: getFillColor,\n                    getLineColor: extruded && wireframe ? getLineColor : defaultLineColor,\n                    material: material,\n                    transitions: transitions\n                }, this.getSubLayerProps({\n                    id: \"fill\",\n                    updateTriggers: {\n                        getPolygon: updateTriggers.getPolygon,\n                        getElevation: updateTriggers.getElevation,\n                        getFillColor: updateTriggers.getFillColor,\n                        lineColors: extruded && wireframe,\n                        getLineColor: updateTriggers.getLineColor\n                    }\n                }), {\n                    data: data,\n                    positionFormat: positionFormat,\n                    getPolygon: getPolygon\n                });\n                var polygonLineLayer = !extruded && stroked && this.shouldRenderSubLayer(\"stroke\", paths) && new StrokeLayer({\n                    _dataDiff: pathsDiff && function() {\n                        return pathsDiff;\n                    },\n                    widthUnits: lineWidthUnits,\n                    widthScale: lineWidthScale,\n                    widthMinPixels: lineWidthMinPixels,\n                    widthMaxPixels: lineWidthMaxPixels,\n                    rounded: lineJointRounded,\n                    miterLimit: lineMiterLimit,\n                    dashJustified: lineDashJustified,\n                    _pathType: \"loop\",\n                    transitions: transitions && {\n                        getWidth: transitions.getLineWidth,\n                        getColor: transitions.getLineColor,\n                        getPath: transitions.getPolygon\n                    },\n                    getColor: this.getSubLayerAccessor(getLineColor),\n                    getWidth: this.getSubLayerAccessor(getLineWidth),\n                    getDashArray: this.getSubLayerAccessor(getLineDashArray)\n                }, this.getSubLayerProps({\n                    id: \"stroke\",\n                    updateTriggers: {\n                        getWidth: updateTriggers.getLineWidth,\n                        getColor: updateTriggers.getLineColor,\n                        getDashArray: updateTriggers.getLineDashArray\n                    }\n                }), {\n                    data: paths,\n                    positionFormat: positionFormat,\n                    getPath: function getPath(x) {\n                        return x.path;\n                    }\n                });\n                return [\n                    !extruded && polygonLayer,\n                    polygonLineLayer,\n                    extruded && polygonLayer\n                ];\n            }\n        }\n    ]);\n    return PolygonLayer1;\n}((0, _core.CompositeLayer));\nPolygonLayer.layerName = \"PolygonLayer\";\nPolygonLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"../solid-polygon-layer/solid-polygon-layer\":\"89crq\",\"../path-layer/path-layer\":\"2wFY0\",\"../solid-polygon-layer/polygon\":\"8vAJV\",\"../utils\":\"eIDxg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"89crq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>SolidPolygonLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _core1 = require(\"@luma.gl/core\");\nvar _polygonTesselator = require(\"./polygon-tesselator\");\nvar _polygonTesselatorDefault = parcelHelpers.interopDefault(_polygonTesselator);\nvar _solidPolygonLayerVertexTopGlsl = require(\"./solid-polygon-layer-vertex-top.glsl\");\nvar _solidPolygonLayerVertexTopGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerVertexTopGlsl);\nvar _solidPolygonLayerVertexSideGlsl = require(\"./solid-polygon-layer-vertex-side.glsl\");\nvar _solidPolygonLayerVertexSideGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerVertexSideGlsl);\nvar _solidPolygonLayerFragmentGlsl = require(\"./solid-polygon-layer-fragment.glsl\");\nvar _solidPolygonLayerFragmentGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    filled: true,\n    extruded: false,\n    wireframe: false,\n    _normalize: true,\n    elevationScale: {\n        type: \"number\",\n        min: 0,\n        value: 1\n    },\n    getPolygon: {\n        type: \"accessor\",\n        value: function value(f) {\n            return f.polygon;\n        }\n    },\n    getElevation: {\n        type: \"accessor\",\n        value: 1000\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getLineColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    material: true\n};\nvar ATTRIBUTE_TRANSITION = {\n    enter: function enter(value, chunk) {\n        return chunk.length ? chunk.subarray(chunk.length - value.length) : value;\n    }\n};\nvar SolidPolygonLayer = function(_Layer) {\n    (0, _inheritsDefault.default)(SolidPolygonLayer1, _Layer);\n    var _super = _createSuper(SolidPolygonLayer1);\n    function SolidPolygonLayer1() {\n        (0, _classCallCheckDefault.default)(this, SolidPolygonLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(SolidPolygonLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders(vs) {\n                return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(SolidPolygonLayer1.prototype), \"getShaders\", this).call(this, {\n                    vs: vs,\n                    fs: (0, _solidPolygonLayerFragmentGlslDefault.default),\n                    defines: {},\n                    modules: [\n                        (0, _core.project32),\n                        (0, _core.gouraudLighting),\n                        (0, _core.picking)\n                    ]\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                var _this$context = this.context, gl = _this$context.gl, viewport = _this$context.viewport;\n                var coordinateSystem = this.props.coordinateSystem;\n                if (viewport.isGeospatial && coordinateSystem === (0, _core.COORDINATE_SYSTEM).DEFAULT) coordinateSystem = (0, _core.COORDINATE_SYSTEM).LNGLAT;\n                this.setState({\n                    numInstances: 0,\n                    polygonTesselator: new (0, _polygonTesselatorDefault.default)({\n                        preproject: coordinateSystem === (0, _core.COORDINATE_SYSTEM).LNGLAT && viewport.projectFlat,\n                        fp64: this.use64bitPositions(),\n                        IndexType: !gl || (0, _core1.hasFeatures)(gl, (0, _core1.FEATURES).ELEMENT_INDEX_UINT32) ? Uint32Array : Uint16Array\n                    })\n                });\n                var attributeManager = this.getAttributeManager();\n                var noAlloc = true;\n                attributeManager.remove([\n                    \"instancePickingColors\"\n                ]);\n                attributeManager.add({\n                    indices: {\n                        size: 1,\n                        isIndexed: true,\n                        update: this.calculateIndices,\n                        noAlloc: noAlloc\n                    },\n                    positions: {\n                        size: 3,\n                        type: 5130,\n                        fp64: this.use64bitPositions(),\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getPolygon\",\n                        update: this.calculatePositions,\n                        noAlloc: noAlloc,\n                        shaderAttributes: {\n                            positions: {\n                                vertexOffset: 0,\n                                divisor: 0\n                            },\n                            instancePositions: {\n                                vertexOffset: 0,\n                                divisor: 1\n                            },\n                            nextPositions: {\n                                vertexOffset: 1,\n                                divisor: 1\n                            }\n                        }\n                    },\n                    vertexValid: {\n                        size: 1,\n                        divisor: 1,\n                        type: 5121,\n                        update: this.calculateVertexValid,\n                        noAlloc: noAlloc\n                    },\n                    elevations: {\n                        size: 1,\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getElevation\",\n                        shaderAttributes: {\n                            elevations: {\n                                divisor: 0\n                            },\n                            instanceElevations: {\n                                divisor: 1\n                            }\n                        }\n                    },\n                    fillColors: {\n                        alias: \"colors\",\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getFillColor\",\n                        defaultValue: DEFAULT_COLOR,\n                        shaderAttributes: {\n                            fillColors: {\n                                divisor: 0\n                            },\n                            instanceFillColors: {\n                                divisor: 1\n                            }\n                        }\n                    },\n                    lineColors: {\n                        alias: \"colors\",\n                        size: this.props.colorFormat.length,\n                        type: 5121,\n                        normalized: true,\n                        transition: ATTRIBUTE_TRANSITION,\n                        accessor: \"getLineColor\",\n                        defaultValue: DEFAULT_COLOR,\n                        shaderAttributes: {\n                            lineColors: {\n                                divisor: 0\n                            },\n                            instanceLineColors: {\n                                divisor: 1\n                            }\n                        }\n                    },\n                    pickingColors: {\n                        size: 3,\n                        type: 5121,\n                        accessor: function accessor(object, _ref) {\n                            var index = _ref.index, value = _ref.target;\n                            return _this.encodePickingColor(object && object.__source ? object.__source.index : index, value);\n                        },\n                        shaderAttributes: {\n                            pickingColors: {\n                                divisor: 0\n                            },\n                            instancePickingColors: {\n                                divisor: 1\n                            }\n                        }\n                    }\n                });\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(params) {\n                var info = (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(SolidPolygonLayer1.prototype), \"getPickingInfo\", this).call(this, params);\n                var index = info.index;\n                var data = this.props.data;\n                if (data[0] && data[0].__source) info.object = data.find(function(d) {\n                    return d.__source.index === index;\n                });\n                return info;\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var _this$props = this.props, extruded = _this$props.extruded, filled = _this$props.filled, wireframe = _this$props.wireframe, elevationScale = _this$props.elevationScale;\n                var _this$state = this.state, topModel = _this$state.topModel, sideModel = _this$state.sideModel, polygonTesselator = _this$state.polygonTesselator;\n                var renderUniforms = Object.assign({}, uniforms, {\n                    extruded: Boolean(extruded),\n                    elevationScale: elevationScale\n                });\n                if (sideModel) {\n                    sideModel.setInstanceCount(polygonTesselator.instanceCount - 1);\n                    sideModel.setUniforms(renderUniforms);\n                    if (wireframe) {\n                        sideModel.setDrawMode(3);\n                        sideModel.setUniforms({\n                            isWireframe: true\n                        }).draw();\n                    }\n                    if (filled) {\n                        sideModel.setDrawMode(6);\n                        sideModel.setUniforms({\n                            isWireframe: false\n                        }).draw();\n                    }\n                }\n                if (topModel) {\n                    topModel.setVertexCount(polygonTesselator.vertexCount);\n                    topModel.setUniforms(renderUniforms).draw();\n                }\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(updateParams) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(SolidPolygonLayer1.prototype), \"updateState\", this).call(this, updateParams);\n                this.updateGeometry(updateParams);\n                var props = updateParams.props, oldProps = updateParams.oldProps, changeFlags = updateParams.changeFlags;\n                var attributeManager = this.getAttributeManager();\n                var regenerateModels = changeFlags.extensionsChanged || props.filled !== oldProps.filled || props.extruded !== oldProps.extruded;\n                if (regenerateModels) {\n                    if (this.state.models) this.state.models.forEach(function(model) {\n                        return model[\"delete\"]();\n                    });\n                    this.setState(this._getModels(this.context.gl));\n                    attributeManager.invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"updateGeometry\",\n            value: function updateGeometry(_ref3) {\n                var props = _ref3.props, oldProps = _ref3.oldProps, changeFlags = _ref3.changeFlags;\n                var geometryConfigChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getPolygon);\n                if (geometryConfigChanged) {\n                    var polygonTesselator = this.state.polygonTesselator;\n                    var buffers = props.data.attributes || {};\n                    polygonTesselator.updateGeometry({\n                        data: props.data,\n                        normalize: props._normalize,\n                        geometryBuffer: buffers.getPolygon,\n                        buffers: buffers,\n                        getGeometry: props.getPolygon,\n                        positionFormat: props.positionFormat,\n                        wrapLongitude: props.wrapLongitude,\n                        resolution: this.context.viewport.resolution,\n                        fp64: this.use64bitPositions(),\n                        dataChanged: changeFlags.dataChanged\n                    });\n                    this.setState({\n                        numInstances: polygonTesselator.instanceCount,\n                        startIndices: polygonTesselator.vertexStarts\n                    });\n                    if (!changeFlags.dataChanged) this.getAttributeManager().invalidateAll();\n                }\n            }\n        },\n        {\n            key: \"_getModels\",\n            value: function _getModels(gl) {\n                var _this$props2 = this.props, id = _this$props2.id, filled = _this$props2.filled, extruded = _this$props2.extruded;\n                var topModel;\n                var sideModel;\n                if (filled) {\n                    var shaders = this.getShaders((0, _solidPolygonLayerVertexTopGlslDefault.default));\n                    shaders.defines.NON_INSTANCED_MODEL = 1;\n                    topModel = new (0, _core1.Model)(gl, Object.assign({}, shaders, {\n                        id: \"\".concat(id, \"-top\"),\n                        drawMode: 4,\n                        attributes: {\n                            vertexPositions: new Float32Array([\n                                0,\n                                1\n                            ])\n                        },\n                        uniforms: {\n                            isWireframe: false,\n                            isSideVertex: false\n                        },\n                        vertexCount: 0,\n                        isIndexed: true\n                    }));\n                }\n                if (extruded) {\n                    sideModel = new (0, _core1.Model)(gl, Object.assign({}, this.getShaders((0, _solidPolygonLayerVertexSideGlslDefault.default)), {\n                        id: \"\".concat(id, \"-side\"),\n                        geometry: new (0, _core1.Geometry)({\n                            drawMode: 1,\n                            vertexCount: 4,\n                            attributes: {\n                                vertexPositions: {\n                                    size: 2,\n                                    value: new Float32Array([\n                                        1,\n                                        0,\n                                        0,\n                                        0,\n                                        0,\n                                        1,\n                                        1,\n                                        1\n                                    ])\n                                }\n                            }\n                        }),\n                        instanceCount: 0,\n                        isInstanced: 1\n                    }));\n                    sideModel.userData.excludeAttributes = {\n                        indices: true\n                    };\n                }\n                return {\n                    models: [\n                        sideModel,\n                        topModel\n                    ].filter(Boolean),\n                    topModel: topModel,\n                    sideModel: sideModel\n                };\n            }\n        },\n        {\n            key: \"calculateIndices\",\n            value: function calculateIndices(attribute) {\n                var polygonTesselator = this.state.polygonTesselator;\n                attribute.startIndices = polygonTesselator.indexStarts;\n                attribute.value = polygonTesselator.get(\"indices\");\n            }\n        },\n        {\n            key: \"calculatePositions\",\n            value: function calculatePositions(attribute) {\n                var polygonTesselator = this.state.polygonTesselator;\n                attribute.startIndices = polygonTesselator.vertexStarts;\n                attribute.value = polygonTesselator.get(\"positions\");\n            }\n        },\n        {\n            key: \"calculateVertexValid\",\n            value: function calculateVertexValid(attribute) {\n                attribute.value = this.state.polygonTesselator.get(\"vertexValid\");\n            }\n        },\n        {\n            key: \"wrapLongitude\",\n            get: function get() {\n                return false;\n            }\n        }\n    ]);\n    return SolidPolygonLayer1;\n}((0, _core.Layer));\nSolidPolygonLayer.layerName = \"SolidPolygonLayer\";\nSolidPolygonLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"@luma.gl/core\":\"bW3Qv\",\"./polygon-tesselator\":\"7e14L\",\"./solid-polygon-layer-vertex-top.glsl\":\"hZzoH\",\"./solid-polygon-layer-vertex-side.glsl\":\"dlX9E\",\"./solid-polygon-layer-fragment.glsl\":\"8DlhB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7e14L\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>PolygonTesselator);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _polygon = require(\"./polygon\");\nvar _core = require(\"@deck.gl/core\");\nvar _polygon1 = require(\"@math.gl/polygon\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar PolygonTesselator = function(_Tesselator) {\n    (0, _inheritsDefault.default)(PolygonTesselator1, _Tesselator);\n    var _super = _createSuper(PolygonTesselator1);\n    function PolygonTesselator1(opts) {\n        (0, _classCallCheckDefault.default)(this, PolygonTesselator1);\n        var fp64 = opts.fp64, _opts$IndexType = opts.IndexType, IndexType = _opts$IndexType === void 0 ? Uint32Array : _opts$IndexType;\n        return _super.call(this, _objectSpread(_objectSpread({}, opts), {}, {\n            attributes: {\n                positions: {\n                    size: 3,\n                    type: fp64 ? Float64Array : Float32Array\n                },\n                vertexValid: {\n                    type: Uint8ClampedArray,\n                    size: 1\n                },\n                indices: {\n                    type: IndexType,\n                    size: 1\n                }\n            }\n        }));\n    }\n    (0, _createClassDefault.default)(PolygonTesselator1, [\n        {\n            key: \"get\",\n            value: function get(attributeName) {\n                var attributes = this.attributes;\n                if (attributeName === \"indices\") return attributes.indices && attributes.indices.subarray(0, this.vertexCount);\n                return attributes[attributeName];\n            }\n        },\n        {\n            key: \"updateGeometry\",\n            value: function updateGeometry(opts) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PolygonTesselator1.prototype), \"updateGeometry\", this).call(this, opts);\n                var externalIndices = this.buffers.indices;\n                if (externalIndices) this.vertexCount = (externalIndices.value || externalIndices).length;\n            }\n        },\n        {\n            key: \"normalizeGeometry\",\n            value: function normalizeGeometry(polygon) {\n                if (this.normalize) {\n                    polygon = _polygon.normalize(polygon, this.positionSize);\n                    if (this.opts.resolution) return (0, _polygon1.cutPolygonByGrid)(polygon.positions || polygon, polygon.holeIndices, {\n                        size: this.positionSize,\n                        gridResolution: this.opts.resolution,\n                        edgeTypes: true\n                    });\n                    if (this.opts.wrapLongitude) return (0, _polygon1.cutPolygonByMercatorBounds)(polygon.positions || polygon, polygon.holeIndices, {\n                        size: this.positionSize,\n                        maxLatitude: 86,\n                        edgeTypes: true\n                    });\n                }\n                return polygon;\n            }\n        },\n        {\n            key: \"getGeometrySize\",\n            value: function getGeometrySize(polygon) {\n                if (Array.isArray(polygon) && !Number.isFinite(polygon[0])) {\n                    var size = 0;\n                    var _iterator = _createForOfIteratorHelper(polygon), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var subPolygon = _step.value;\n                            size += this.getGeometrySize(subPolygon);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    return size;\n                }\n                return (polygon.positions || polygon).length / this.positionSize;\n            }\n        },\n        {\n            key: \"getGeometryFromBuffer\",\n            value: function getGeometryFromBuffer(buffer) {\n                if (this.normalize || !this.buffers.indices) return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(PolygonTesselator1.prototype), \"getGeometryFromBuffer\", this).call(this, buffer);\n                return function() {\n                    return null;\n                };\n            }\n        },\n        {\n            key: \"updateGeometryAttributes\",\n            value: function updateGeometryAttributes(polygon, context) {\n                if (Array.isArray(polygon) && !Number.isFinite(polygon[0])) {\n                    var _iterator2 = _createForOfIteratorHelper(polygon), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var subPolygon = _step2.value;\n                            var geometrySize = this.getGeometrySize(subPolygon);\n                            context.geometrySize = geometrySize;\n                            this.updateGeometryAttributes(subPolygon, context);\n                            context.vertexStart += geometrySize;\n                            context.indexStart = this.indexStarts[context.geometryIndex + 1];\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                } else {\n                    this._updateIndices(polygon, context);\n                    this._updatePositions(polygon, context);\n                    this._updateVertexValid(polygon, context);\n                }\n            }\n        },\n        {\n            key: \"_updateIndices\",\n            value: function _updateIndices(polygon, _ref) {\n                var geometryIndex = _ref.geometryIndex, offset = _ref.vertexStart, indexStart = _ref.indexStart;\n                var attributes = this.attributes, indexStarts = this.indexStarts, typedArrayManager = this.typedArrayManager;\n                var target = attributes.indices;\n                if (!target) return;\n                var i = indexStart;\n                var indices = _polygon.getSurfaceIndices(polygon, this.positionSize, this.opts.preproject);\n                target = typedArrayManager.allocate(target, indexStart + indices.length, {\n                    copy: true\n                });\n                for(var j = 0; j < indices.length; j++)target[i++] = indices[j] + offset;\n                indexStarts[geometryIndex + 1] = indexStart + indices.length;\n                attributes.indices = target;\n            }\n        },\n        {\n            key: \"_updatePositions\",\n            value: function _updatePositions(polygon, _ref2) {\n                var vertexStart = _ref2.vertexStart, geometrySize = _ref2.geometrySize;\n                var positions = this.attributes.positions, positionSize = this.positionSize;\n                if (!positions) return;\n                var polygonPositions = polygon.positions || polygon;\n                for(var i = vertexStart, j = 0; j < geometrySize; i++, j++){\n                    var x = polygonPositions[j * positionSize];\n                    var y = polygonPositions[j * positionSize + 1];\n                    var z = positionSize > 2 ? polygonPositions[j * positionSize + 2] : 0;\n                    positions[i * 3] = x;\n                    positions[i * 3 + 1] = y;\n                    positions[i * 3 + 2] = z;\n                }\n            }\n        },\n        {\n            key: \"_updateVertexValid\",\n            value: function _updateVertexValid(polygon, _ref3) {\n                var vertexStart = _ref3.vertexStart, geometrySize = _ref3.geometrySize;\n                var vertexValid = this.attributes.vertexValid, positionSize = this.positionSize;\n                var holeIndices = polygon && polygon.holeIndices;\n                if (polygon && polygon.edgeTypes) vertexValid.set(polygon.edgeTypes, vertexStart);\n                else vertexValid.fill(1, vertexStart, vertexStart + geometrySize);\n                if (holeIndices) for(var j = 0; j < holeIndices.length; j++)vertexValid[vertexStart + holeIndices[j] / positionSize - 1] = 0;\n                vertexValid[vertexStart + geometrySize - 1] = 0;\n            }\n        }\n    ]);\n    return PolygonTesselator1;\n}((0, _core.Tesselator));\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"./polygon\":\"8vAJV\",\"@deck.gl/core\":\"lTaaR\",\"@math.gl/polygon\":\"iIlOq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8vAJV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"normalize\", ()=>normalize);\nparcelHelpers.export(exports, \"getSurfaceIndices\", ()=>getSurfaceIndices);\nvar _earcut = require(\"earcut\");\nvar _earcutDefault = parcelHelpers.interopDefault(_earcut);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction validate(polygon) {\n    polygon = polygon && polygon.positions || polygon;\n    if (!Array.isArray(polygon) && !ArrayBuffer.isView(polygon)) throw new Error(\"invalid polygon\");\n}\nfunction isSimple(polygon) {\n    return polygon.length >= 1 && polygon[0].length >= 2 && Number.isFinite(polygon[0][0]);\n}\nfunction isNestedRingClosed(simplePolygon) {\n    var p0 = simplePolygon[0];\n    var p1 = simplePolygon[simplePolygon.length - 1];\n    return p0[0] === p1[0] && p0[1] === p1[1] && p0[2] === p1[2];\n}\nfunction isFlatRingClosed(positions, size, startIndex, endIndex) {\n    for(var i = 0; i < size; i++){\n        if (positions[startIndex + i] !== positions[endIndex - size + i]) return false;\n    }\n    return true;\n}\nfunction copyNestedRing(target, targetStartIndex, simplePolygon, size) {\n    var targetIndex = targetStartIndex;\n    var len = simplePolygon.length;\n    for(var i = 0; i < len; i++)for(var j = 0; j < size; j++)target[targetIndex++] = simplePolygon[i][j] || 0;\n    if (!isNestedRingClosed(simplePolygon)) for(var _j = 0; _j < size; _j++)target[targetIndex++] = simplePolygon[0][_j] || 0;\n    return targetIndex;\n}\nfunction copyFlatRing(target, targetStartIndex, positions, size) {\n    var srcStartIndex = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n    var srcEndIndex = arguments.length > 5 ? arguments[5] : undefined;\n    srcEndIndex = srcEndIndex || positions.length;\n    var srcLength = srcEndIndex - srcStartIndex;\n    if (srcLength <= 0) return targetStartIndex;\n    var targetIndex = targetStartIndex;\n    for(var i = 0; i < srcLength; i++)target[targetIndex++] = positions[srcStartIndex + i];\n    if (!isFlatRingClosed(positions, size, srcStartIndex, srcEndIndex)) for(var _i = 0; _i < size; _i++)target[targetIndex++] = positions[srcStartIndex + _i];\n    return targetIndex;\n}\nfunction normalize(polygon, positionSize) {\n    validate(polygon);\n    var positions = [];\n    var holeIndices = [];\n    if (polygon.positions) {\n        var _polygon = polygon, srcPositions = _polygon.positions, srcHoleIndices = _polygon.holeIndices;\n        if (srcHoleIndices) {\n            var targetIndex = 0;\n            for(var i = 0; i <= srcHoleIndices.length; i++){\n                targetIndex = copyFlatRing(positions, targetIndex, srcPositions, positionSize, srcHoleIndices[i - 1], srcHoleIndices[i]);\n                holeIndices.push(targetIndex);\n            }\n            holeIndices.pop();\n            return {\n                positions: positions,\n                holeIndices: holeIndices\n            };\n        }\n        polygon = srcPositions;\n    }\n    if (Number.isFinite(polygon[0])) {\n        copyFlatRing(positions, 0, polygon, positionSize);\n        return positions;\n    }\n    if (!isSimple(polygon)) {\n        var _targetIndex = 0;\n        var _iterator = _createForOfIteratorHelper(polygon), _step;\n        try {\n            for(_iterator.s(); !(_step = _iterator.n()).done;){\n                var simplePolygon = _step.value;\n                _targetIndex = copyNestedRing(positions, _targetIndex, simplePolygon, positionSize);\n                holeIndices.push(_targetIndex);\n            }\n        } catch (err) {\n            _iterator.e(err);\n        } finally{\n            _iterator.f();\n        }\n        holeIndices.pop();\n        return {\n            positions: positions,\n            holeIndices: holeIndices\n        };\n    }\n    copyNestedRing(positions, 0, polygon, positionSize);\n    return positions;\n}\nfunction getSurfaceIndices(normalizedPolygon, positionSize, preproject) {\n    var holeIndices = null;\n    if (normalizedPolygon.holeIndices) holeIndices = normalizedPolygon.holeIndices.map(function(positionIndex) {\n        return positionIndex / positionSize;\n    });\n    var positions = normalizedPolygon.positions || normalizedPolygon;\n    if (preproject) {\n        var n = positions.length;\n        positions = positions.slice();\n        var p = [];\n        for(var i = 0; i < n; i += positionSize){\n            p[0] = positions[i];\n            p[1] = positions[i + 1];\n            var xy = preproject(p);\n            positions[i] = xy[0];\n            positions[i + 1] = xy[1];\n        }\n    }\n    return (0, _earcutDefault.default)(positions, holeIndices, positionSize);\n}\n\n},{\"earcut\":\"9z9mr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9z9mr\":[function(require,module,exports) {\n\"use strict\";\nmodule.exports = earcut;\nmodule.exports.default = earcut;\nfunction earcut(data, holeIndices, dim) {\n    dim = dim || 2;\n    var hasHoles = holeIndices && holeIndices.length, outerLen = hasHoles ? holeIndices[0] * dim : data.length, outerNode = linkedList(data, 0, outerLen, dim, true), triangles = [];\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n    var minX, minY, maxX, maxY, x, y, invSize;\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n        for(var i = dim; i < outerLen; i += dim){\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 32767 / invSize : 0;\n    }\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n    return triangles;\n}\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n    if (clockwise === signedArea(data, start, end, dim) > 0) for(i = start; i < end; i += dim)last = insertNode(i, data[i], data[i + 1], last);\n    else for(i = end - dim; i >= start; i -= dim)last = insertNode(i, data[i], data[i + 1], last);\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n    return last;\n}\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n    var p = start, again;\n    do {\n        again = false;\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n        } else p = p.next;\n    }while (again || p !== end);\n    return end;\n}\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n    var stop = ear, prev, next;\n    // iterate through ears, slicing them one by one\n    while(ear.prev !== ear.next){\n        prev = ear.prev;\n        next = ear.next;\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim | 0);\n            triangles.push(ear.i / dim | 0);\n            triangles.push(next.i / dim | 0);\n            removeNode(ear);\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n            continue;\n        }\n        ear = next;\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n            else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            break;\n        }\n    }\n}\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    var a = ear.prev, b = ear, c = ear.next;\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n    // now make sure we don't have other points inside the potential ear\n    var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n    // triangle bbox; min & max are calculated like this for speed\n    var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx, y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy, x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx, y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy;\n    var p = c.next;\n    while(p !== a){\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n    return true;\n}\nfunction isEarHashed(ear, minX, minY, invSize) {\n    var a = ear.prev, b = ear, c = ear.next;\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n    var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n    // triangle bbox; min & max are calculated like this for speed\n    var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx, y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy, x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx, y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy;\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(x0, y0, minX, minY, invSize), maxZ = zOrder(x1, y1, minX, minY, invSize);\n    var p = ear.prevZ, n = ear.nextZ;\n    // look for points inside the triangle in both directions\n    while(p && p.z >= minZ && n && n.z <= maxZ){\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n    // look for remaining points in decreasing z-order\n    while(p && p.z >= minZ){\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n    // look for remaining points in increasing z-order\n    while(n && n.z <= maxZ){\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n    return true;\n}\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev, b = p.next.next;\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n            triangles.push(a.i / dim | 0);\n            triangles.push(p.i / dim | 0);\n            triangles.push(b.i / dim | 0);\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n            p = start = b;\n        }\n        p = p.next;\n    }while (p !== start);\n    return filterPoints(p);\n}\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while(b !== a.prev){\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n                earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    }while (a !== start);\n}\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [], i, len, start, end, list;\n    for(i = 0, len = holeIndices.length; i < len; i++){\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n    queue.sort(compareX);\n    // process holes from left to right\n    for(i = 0; i < queue.length; i++)outerNode = eliminateHole(queue[i], outerNode);\n    return outerNode;\n}\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    var bridge = findHoleBridge(hole, outerNode);\n    if (!bridge) return outerNode;\n    var bridgeReverse = splitPolygon(bridge, hole);\n    // filter collinear points around the cuts\n    filterPoints(bridgeReverse, bridgeReverse.next);\n    return filterPoints(bridge, bridge.next);\n}\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode, hx = hole.x, hy = hole.y, qx = -Infinity, m;\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                m = p.x < p.next.x ? p : p.next;\n                if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n            }\n        }\n        p = p.next;\n    }while (p !== outerNode);\n    if (!m) return null;\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n    var stop = m, mx = m.x, my = m.y, tanMin = Infinity, tan;\n    p = m;\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n            if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n        p = p.next;\n    }while (p !== stop);\n    return m;\n}\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    var p = start;\n    do {\n        if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    }while (p !== start);\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n    sortLinked(p);\n}\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize, inSize = 1;\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n        while(p){\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for(i = 0; i < inSize; i++){\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n            while(pSize > 0 || qSize > 0 && q){\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n                if (tail) tail.nextZ = e;\n                else list = e;\n                e.prevZ = tail;\n                tail = e;\n            }\n            p = q;\n        }\n        tail.nextZ = null;\n        inSize *= 2;\n    }while (numMerges > 1);\n    return list;\n}\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = (x - minX) * invSize | 0;\n    y = (y - minY) * invSize | 0;\n    x = (x | x << 8) & 0x00FF00FF;\n    x = (x | x << 4) & 0x0F0F0F0F;\n    x = (x | x << 2) & 0x33333333;\n    x = (x | x << 1) & 0x55555555;\n    y = (y | y << 8) & 0x00FF00FF;\n    y = (y | y << 4) & 0x0F0F0F0F;\n    y = (y | y << 2) & 0x33333333;\n    y = (y | y << 1) & 0x55555555;\n    return x | y << 1;\n}\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start, leftmost = start;\n    do {\n        if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;\n        p = p.next;\n    }while (p !== start);\n    return leftmost;\n}\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) >= (ax - px) * (cy - py) && (ax - px) * (by - py) >= (bx - px) * (ay - py) && (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && (area(a.prev, a, b.prev) || area(a, b.prev, b)) || equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    var o1 = sign(area(p1, q1, p2));\n    var o2 = sign(area(p1, q1, q2));\n    var o3 = sign(area(p2, q2, p1));\n    var o4 = sign(area(p2, q2, q1));\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n    return false;\n}\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    }while (p !== a);\n    return false;\n}\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a, inside = false, px = (a.x + b.x) / 2, py = (a.y + b.y) / 2;\n    do {\n        if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside;\n        p = p.next;\n    }while (p !== a);\n    return inside;\n}\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y), b2 = new Node(b.i, b.x, b.y), an = a.next, bp = b.prev;\n    a.next = b;\n    b.prev = a;\n    a2.next = an;\n    an.prev = a2;\n    b2.next = a2;\n    a2.prev = b2;\n    bp.next = b2;\n    b2.prev = bp;\n    return b2;\n}\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\nfunction Node(i, x, y) {\n    // vertex index in coordinates array\n    this.i = i;\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n    // previous and next vertex nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n    // z-order curve value\n    this.z = 0;\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function(data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) for(var i = 0, len = holeIndices.length; i < len; i++){\n        var start = holeIndices[i] * dim;\n        var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        polygonArea -= Math.abs(signedArea(data, start, end, dim));\n    }\n    var trianglesArea = 0;\n    for(i = 0; i < triangles.length; i += 3){\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs((data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n    return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for(var i = start, j = end - dim; i < end; i += dim){\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function(data) {\n    var dim = data[0][0].length, result = {\n        vertices: [],\n        holes: [],\n        dimensions: dim\n    }, holeIndex = 0;\n    for(var i = 0; i < data.length; i++){\n        for(var j = 0; j < data[i].length; j++)for(var d = 0; d < dim; d++)result.vertices.push(data[i][j][d]);\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n\n},{}],\"hZzoH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _solidPolygonLayerVertexMainGlsl = require(\"./solid-polygon-layer-vertex-main.glsl\");\nvar _solidPolygonLayerVertexMainGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerVertexMainGlsl);\nexports.default = \"#define SHADER_NAME solid-polygon-layer-vertex-shader\\n\\nattribute vec3 positions;\\nattribute vec3 positions64Low;\\nattribute float elevations;\\nattribute vec4 fillColors;\\nattribute vec4 lineColors;\\nattribute vec3 pickingColors;\\n\\n\".concat((0, _solidPolygonLayerVertexMainGlslDefault.default), \"\\n\\nvoid main(void) {\\n  PolygonProps props;\\n\\n  props.positions = positions;\\n  props.positions64Low = positions64Low;\\n  props.elevations = elevations;\\n  props.fillColors = fillColors;\\n  props.lineColors = lineColors;\\n  props.pickingColors = pickingColors;\\n\\n  calculatePosition(props);\\n}\\n\");\n\n},{\"./solid-polygon-layer-vertex-main.glsl\":\"bRDKQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bRDKQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"\\nattribute vec2 vertexPositions;\\nattribute float vertexValid;\\n\\nuniform bool extruded;\\nuniform bool isWireframe;\\nuniform float elevationScale;\\nuniform float opacity;\\n\\nvarying vec4 vColor;\\nvarying float isValid;\\n\\nstruct PolygonProps {\\n  vec4 fillColors;\\n  vec4 lineColors;\\n  vec3 positions;\\n  vec3 nextPositions;\\n  vec3 pickingColors;\\n  vec3 positions64Low;\\n  vec3 nextPositions64Low;\\n  float elevations;\\n};\\n\\nvec3 project_offset_normal(vec3 vector) {\\n  if (project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT ||\\n    project_uCoordinateSystem == COORDINATE_SYSTEM_LNGLAT_OFFSETS) {\\n    return normalize(vector * project_uCommonUnitsPerWorldUnit);\\n  }\\n  return project_normal(vector);\\n}\\n\\nvoid calculatePosition(PolygonProps props) {\\n  vec3 pos;\\n  vec3 pos64Low;\\n  vec3 normal;\\n  vec4 colors = isWireframe ? props.lineColors : props.fillColors;\\n\\n  geometry.worldPosition = props.positions;\\n  geometry.worldPositionAlt = props.nextPositions;\\n  geometry.pickingColor = props.pickingColors;\\n\\n#ifdef IS_SIDE_VERTEX\\n  pos = mix(props.positions, props.nextPositions, vertexPositions.x);\\n  pos64Low = mix(props.positions64Low, props.nextPositions64Low, vertexPositions.x);\\n  isValid = vertexValid;\\n#else\\n  pos = props.positions;\\n  pos64Low = props.positions64Low;\\n  isValid = 1.0;\\n#endif\\n\\n  if (extruded) {\\n    pos.z += props.elevations * vertexPositions.y * elevationScale;\\n\\n#ifdef IS_SIDE_VERTEX\\n    normal = vec3(\\n      props.positions.y - props.nextPositions.y + (props.positions64Low.y - props.nextPositions64Low.y),\\n      props.nextPositions.x - props.positions.x + (props.nextPositions64Low.x - props.positions64Low.x),\\n      0.0);\\n    normal = project_offset_normal(normal);\\n#else\\n    normal = vec3(0.0, 0.0, 1.0);\\n#endif\\n    geometry.normal = normal;\\n  }\\n\\n  gl_Position = project_position_to_clipspace(pos, pos64Low, vec3(0.), geometry.position);\\n  DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\\n\\n  if (extruded) {\\n    vec3 lightColor = lighting_getLightColor(colors.rgb, project_uCameraPosition, geometry.position.xyz, normal);\\n    vColor = vec4(lightColor, colors.a * opacity);\\n  } else {\\n    vColor = vec4(colors.rgb, colors.a * opacity);\\n  }\\n  DECKGL_FILTER_COLOR(vColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dlX9E\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _solidPolygonLayerVertexMainGlsl = require(\"./solid-polygon-layer-vertex-main.glsl\");\nvar _solidPolygonLayerVertexMainGlslDefault = parcelHelpers.interopDefault(_solidPolygonLayerVertexMainGlsl);\nexports.default = \"#define SHADER_NAME solid-polygon-layer-vertex-shader-side\\n#define IS_SIDE_VERTEX\\n\\n\\nattribute vec3 instancePositions;\\nattribute vec3 nextPositions;\\nattribute vec3 instancePositions64Low;\\nattribute vec3 nextPositions64Low;\\nattribute float instanceElevations;\\nattribute vec4 instanceFillColors;\\nattribute vec4 instanceLineColors;\\nattribute vec3 instancePickingColors;\\n\\n\".concat((0, _solidPolygonLayerVertexMainGlslDefault.default), \"\\n\\nvoid main(void) {\\n  PolygonProps props;\\n\\n  props.positions = instancePositions;\\n  props.positions64Low = instancePositions64Low;\\n  props.elevations = instanceElevations;\\n  props.fillColors = instanceFillColors;\\n  props.lineColors = instanceLineColors;\\n  props.pickingColors = instancePickingColors;\\n  props.nextPositions = nextPositions;\\n  props.nextPositions64Low = nextPositions64Low;\\n\\n  calculatePosition(props);\\n}\\n\");\n\n},{\"./solid-polygon-layer-vertex-main.glsl\":\"bRDKQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8DlhB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME solid-polygon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nvarying vec4 vColor;\\nvarying float isValid;\\n\\nvoid main(void) {\\n  if (isValid < 0.5) {\\n    discard;\\n  }\\n\\n  gl_FragColor = vColor;\\n\\n  DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eIDxg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"replaceInRange\", ()=>replaceInRange);\nfunction replaceInRange(_ref) {\n    var data = _ref.data, getIndex = _ref.getIndex, dataRange = _ref.dataRange, replace = _ref.replace;\n    var _dataRange$startRow = dataRange.startRow, startRow = _dataRange$startRow === void 0 ? 0 : _dataRange$startRow, _dataRange$endRow = dataRange.endRow, endRow = _dataRange$endRow === void 0 ? Infinity : _dataRange$endRow;\n    var count = data.length;\n    var replaceStart = count;\n    var replaceEnd = count;\n    for(var i = 0; i < count; i++){\n        var row = getIndex(data[i]);\n        if (replaceStart > i && row >= startRow) replaceStart = i;\n        if (row >= endRow) {\n            replaceEnd = i;\n            break;\n        }\n    }\n    var index = replaceStart;\n    var dataLengthChanged = replaceEnd - replaceStart !== replace.length;\n    var endChunk = dataLengthChanged && data.slice(replaceEnd);\n    for(var _i = 0; _i < replace.length; _i++)data[index++] = replace[_i];\n    if (dataLengthChanged) {\n        for(var _i2 = 0; _i2 < endChunk.length; _i2++)data[index++] = endChunk[_i2];\n        data.length = index;\n    }\n    return {\n        startRow: replaceStart,\n        endRow: replaceStart + replace.length\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"81n7g\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>GeoJsonLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _scatterplotLayer = require(\"../scatterplot-layer/scatterplot-layer\");\nvar _scatterplotLayerDefault = parcelHelpers.interopDefault(_scatterplotLayer);\nvar _pathLayer = require(\"../path-layer/path-layer\");\nvar _pathLayerDefault = parcelHelpers.interopDefault(_pathLayer);\nvar _solidPolygonLayer = require(\"../solid-polygon-layer/solid-polygon-layer\");\nvar _solidPolygonLayerDefault = parcelHelpers.interopDefault(_solidPolygonLayer);\nvar _utils = require(\"../utils\");\nvar _geojson = require(\"./geojson\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar defaultLineColor = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultFillColor = [\n    0,\n    0,\n    0,\n    255\n];\nvar defaultProps = {\n    stroked: true,\n    filled: true,\n    extruded: false,\n    wireframe: false,\n    lineWidthUnits: \"meters\",\n    lineWidthScale: 1,\n    lineWidthMinPixels: 0,\n    lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n    lineJointRounded: false,\n    lineMiterLimit: 4,\n    elevationScale: 1,\n    pointRadiusUnits: \"meters\",\n    pointRadiusScale: 1,\n    pointRadiusMinPixels: 0,\n    pointRadiusMaxPixels: Number.MAX_SAFE_INTEGER,\n    getLineColor: {\n        type: \"accessor\",\n        value: defaultLineColor\n    },\n    getFillColor: {\n        type: \"accessor\",\n        value: defaultFillColor\n    },\n    getRadius: {\n        type: \"accessor\",\n        value: 1\n    },\n    getLineWidth: {\n        type: \"accessor\",\n        value: 1\n    },\n    getElevation: {\n        type: \"accessor\",\n        value: 1000\n    },\n    material: true\n};\nfunction getCoordinates(f) {\n    return f.geometry.coordinates;\n}\nvar GeoJsonLayer = function(_CompositeLayer) {\n    (0, _inheritsDefault.default)(GeoJsonLayer1, _CompositeLayer);\n    var _super = _createSuper(GeoJsonLayer1);\n    function GeoJsonLayer1() {\n        (0, _classCallCheckDefault.default)(this, GeoJsonLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(GeoJsonLayer1, [\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.state = {\n                    features: {}\n                };\n                if (this.props.getLineDashArray) (0, _core.log).removed(\"getLineDashArray\", \"PathStyleExtension\")();\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, changeFlags = _ref.changeFlags;\n                if (!changeFlags.dataChanged) return;\n                var features = (0, _geojson.getGeojsonFeatures)(props.data);\n                var wrapFeature = this.getSubLayerRow.bind(this);\n                if (Array.isArray(changeFlags.dataChanged)) {\n                    var oldFeatures = this.state.features;\n                    var newFeatures = {};\n                    var featuresDiff = {};\n                    for(var key in oldFeatures){\n                        newFeatures[key] = oldFeatures[key].slice();\n                        featuresDiff[key] = [];\n                    }\n                    var _iterator = _createForOfIteratorHelper(changeFlags.dataChanged), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var dataRange = _step.value;\n                            var partialFeatures = (0, _geojson.separateGeojsonFeatures)(features, wrapFeature, dataRange);\n                            for(var _key in oldFeatures)featuresDiff[_key].push((0, _utils.replaceInRange)({\n                                data: newFeatures[_key],\n                                getIndex: function getIndex(f) {\n                                    return f.__source.index;\n                                },\n                                dataRange: dataRange,\n                                replace: partialFeatures[_key]\n                            }));\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                    this.setState({\n                        features: newFeatures,\n                        featuresDiff: featuresDiff\n                    });\n                } else this.setState({\n                    features: (0, _geojson.separateGeojsonFeatures)(features, wrapFeature),\n                    featuresDiff: {}\n                });\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers() {\n                var _this$state = this.state, features = _this$state.features, featuresDiff = _this$state.featuresDiff;\n                var pointFeatures = features.pointFeatures, lineFeatures = features.lineFeatures, polygonFeatures = features.polygonFeatures, polygonOutlineFeatures = features.polygonOutlineFeatures;\n                var _this$props = this.props, stroked = _this$props.stroked, filled = _this$props.filled, extruded = _this$props.extruded, wireframe = _this$props.wireframe, material = _this$props.material, transitions = _this$props.transitions;\n                var _this$props2 = this.props, lineWidthUnits = _this$props2.lineWidthUnits, lineWidthScale = _this$props2.lineWidthScale, lineWidthMinPixels = _this$props2.lineWidthMinPixels, lineWidthMaxPixels = _this$props2.lineWidthMaxPixels, lineJointRounded = _this$props2.lineJointRounded, lineMiterLimit = _this$props2.lineMiterLimit, pointRadiusUnits = _this$props2.pointRadiusUnits, pointRadiusScale = _this$props2.pointRadiusScale, pointRadiusMinPixels = _this$props2.pointRadiusMinPixels, pointRadiusMaxPixels = _this$props2.pointRadiusMaxPixels, elevationScale = _this$props2.elevationScale, lineDashJustified = _this$props2.lineDashJustified;\n                var _this$props3 = this.props, getLineColor = _this$props3.getLineColor, getFillColor = _this$props3.getFillColor, getRadius = _this$props3.getRadius, getLineWidth = _this$props3.getLineWidth, getLineDashArray = _this$props3.getLineDashArray, getElevation = _this$props3.getElevation, updateTriggers = _this$props3.updateTriggers;\n                var PolygonFillLayer = this.getSubLayerClass(\"polygons-fill\", (0, _solidPolygonLayerDefault.default));\n                var PolygonStrokeLayer = this.getSubLayerClass(\"polygons-stroke\", (0, _pathLayerDefault.default));\n                var LineStringsLayer = this.getSubLayerClass(\"line-strings\", (0, _pathLayerDefault.default));\n                var PointsLayer = this.getSubLayerClass(\"points\", (0, _scatterplotLayerDefault.default));\n                var polygonFillLayer = this.shouldRenderSubLayer(\"polygons-fill\", polygonFeatures) && new PolygonFillLayer({\n                    _dataDiff: featuresDiff.polygonFeatures && function() {\n                        return featuresDiff.polygonFeatures;\n                    },\n                    extruded: extruded,\n                    elevationScale: elevationScale,\n                    filled: filled,\n                    wireframe: wireframe,\n                    material: material,\n                    getElevation: this.getSubLayerAccessor(getElevation),\n                    getFillColor: this.getSubLayerAccessor(getFillColor),\n                    getLineColor: this.getSubLayerAccessor(extruded && wireframe ? getLineColor : defaultLineColor),\n                    transitions: transitions && {\n                        getPolygon: transitions.geometry,\n                        getElevation: transitions.getElevation,\n                        getFillColor: transitions.getFillColor,\n                        getLineColor: transitions.getLineColor\n                    }\n                }, this.getSubLayerProps({\n                    id: \"polygons-fill\",\n                    updateTriggers: {\n                        getElevation: updateTriggers.getElevation,\n                        getFillColor: updateTriggers.getFillColor,\n                        lineColors: extruded && wireframe,\n                        getLineColor: updateTriggers.getLineColor\n                    }\n                }), {\n                    data: polygonFeatures,\n                    getPolygon: getCoordinates\n                });\n                var polygonLineLayer = !extruded && stroked && this.shouldRenderSubLayer(\"polygons-stroke\", polygonOutlineFeatures) && new PolygonStrokeLayer({\n                    _dataDiff: featuresDiff.polygonOutlineFeatures && function() {\n                        return featuresDiff.polygonOutlineFeatures;\n                    },\n                    widthUnits: lineWidthUnits,\n                    widthScale: lineWidthScale,\n                    widthMinPixels: lineWidthMinPixels,\n                    widthMaxPixels: lineWidthMaxPixels,\n                    rounded: lineJointRounded,\n                    miterLimit: lineMiterLimit,\n                    dashJustified: lineDashJustified,\n                    getColor: this.getSubLayerAccessor(getLineColor),\n                    getWidth: this.getSubLayerAccessor(getLineWidth),\n                    getDashArray: this.getSubLayerAccessor(getLineDashArray),\n                    transitions: transitions && {\n                        getPath: transitions.geometry,\n                        getColor: transitions.getLineColor,\n                        getWidth: transitions.getLineWidth\n                    }\n                }, this.getSubLayerProps({\n                    id: \"polygons-stroke\",\n                    updateTriggers: {\n                        getColor: updateTriggers.getLineColor,\n                        getWidth: updateTriggers.getLineWidth,\n                        getDashArray: updateTriggers.getLineDashArray\n                    }\n                }), {\n                    data: polygonOutlineFeatures,\n                    getPath: getCoordinates\n                });\n                var pathLayer = this.shouldRenderSubLayer(\"linestrings\", lineFeatures) && new LineStringsLayer({\n                    _dataDiff: featuresDiff.lineFeatures && function() {\n                        return featuresDiff.lineFeatures;\n                    },\n                    widthUnits: lineWidthUnits,\n                    widthScale: lineWidthScale,\n                    widthMinPixels: lineWidthMinPixels,\n                    widthMaxPixels: lineWidthMaxPixels,\n                    rounded: lineJointRounded,\n                    miterLimit: lineMiterLimit,\n                    dashJustified: lineDashJustified,\n                    getColor: this.getSubLayerAccessor(getLineColor),\n                    getWidth: this.getSubLayerAccessor(getLineWidth),\n                    getDashArray: this.getSubLayerAccessor(getLineDashArray),\n                    transitions: transitions && {\n                        getPath: transitions.geometry,\n                        getColor: transitions.getLineColor,\n                        getWidth: transitions.getLineWidth\n                    }\n                }, this.getSubLayerProps({\n                    id: \"line-strings\",\n                    updateTriggers: {\n                        getColor: updateTriggers.getLineColor,\n                        getWidth: updateTriggers.getLineWidth,\n                        getDashArray: updateTriggers.getLineDashArray\n                    }\n                }), {\n                    data: lineFeatures,\n                    getPath: getCoordinates\n                });\n                var pointLayer = this.shouldRenderSubLayer(\"points\", pointFeatures) && new PointsLayer({\n                    _dataDiff: featuresDiff.pointFeatures && function() {\n                        return featuresDiff.pointFeatures;\n                    },\n                    stroked: stroked,\n                    filled: filled,\n                    radiusUnits: pointRadiusUnits,\n                    radiusScale: pointRadiusScale,\n                    radiusMinPixels: pointRadiusMinPixels,\n                    radiusMaxPixels: pointRadiusMaxPixels,\n                    lineWidthUnits: lineWidthUnits,\n                    lineWidthScale: lineWidthScale,\n                    lineWidthMinPixels: lineWidthMinPixels,\n                    lineWidthMaxPixels: lineWidthMaxPixels,\n                    getFillColor: this.getSubLayerAccessor(getFillColor),\n                    getLineColor: this.getSubLayerAccessor(getLineColor),\n                    getRadius: this.getSubLayerAccessor(getRadius),\n                    getLineWidth: this.getSubLayerAccessor(getLineWidth),\n                    transitions: transitions && {\n                        getPosition: transitions.geometry,\n                        getFillColor: transitions.getFillColor,\n                        getLineColor: transitions.getLineColor,\n                        getRadius: transitions.getRadius,\n                        getLineWidth: transitions.getLineWidth\n                    }\n                }, this.getSubLayerProps({\n                    id: \"points\",\n                    updateTriggers: {\n                        getFillColor: updateTriggers.getFillColor,\n                        getLineColor: updateTriggers.getLineColor,\n                        getRadius: updateTriggers.getRadius,\n                        getLineWidth: updateTriggers.getLineWidth\n                    }\n                }), {\n                    data: pointFeatures,\n                    getPosition: getCoordinates,\n                    highlightedObjectIndex: this._getHighlightedIndex(pointFeatures)\n                });\n                return [\n                    !extruded && polygonFillLayer,\n                    polygonLineLayer,\n                    pathLayer,\n                    pointLayer,\n                    extruded && polygonFillLayer\n                ];\n            }\n        },\n        {\n            key: \"_getHighlightedIndex\",\n            value: function _getHighlightedIndex(data) {\n                var highlightedObjectIndex = this.props.highlightedObjectIndex;\n                return Number.isFinite(highlightedObjectIndex) ? data.findIndex(function(d) {\n                    return d.__source.index === highlightedObjectIndex;\n                }) : null;\n            }\n        }\n    ]);\n    return GeoJsonLayer1;\n}((0, _core.CompositeLayer));\nGeoJsonLayer.layerName = \"GeoJsonLayer\";\nGeoJsonLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"../scatterplot-layer/scatterplot-layer\":\"6DigI\",\"../path-layer/path-layer\":\"2wFY0\",\"../solid-polygon-layer/solid-polygon-layer\":\"89crq\",\"../utils\":\"eIDxg\",\"./geojson\":\"gOcHa\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gOcHa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getGeojsonFeatures\", ()=>getGeojsonFeatures);\nparcelHelpers.export(exports, \"separateGeojsonFeatures\", ()=>separateGeojsonFeatures);\nparcelHelpers.export(exports, \"validateGeometry\", ()=>validateGeometry);\nvar _core = require(\"@deck.gl/core\");\nfunction getGeojsonFeatures(geojson) {\n    if (Array.isArray(geojson)) return geojson;\n    (0, _core.log).assert(geojson.type, \"GeoJSON does not have type\");\n    switch(geojson.type){\n        case \"Feature\":\n            return [\n                geojson\n            ];\n        case \"FeatureCollection\":\n            (0, _core.log).assert(Array.isArray(geojson.features), \"GeoJSON does not have features array\");\n            return geojson.features;\n        default:\n            return [\n                {\n                    geometry: geojson\n                }\n            ];\n    }\n}\nfunction separateGeojsonFeatures(features, wrapFeature) {\n    var dataRange = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var separated = {\n        pointFeatures: [],\n        lineFeatures: [],\n        polygonFeatures: [],\n        polygonOutlineFeatures: []\n    };\n    var _dataRange$startRow = dataRange.startRow, startRow = _dataRange$startRow === void 0 ? 0 : _dataRange$startRow, _dataRange$endRow = dataRange.endRow, endRow = _dataRange$endRow === void 0 ? features.length : _dataRange$endRow;\n    for(var featureIndex = startRow; featureIndex < endRow; featureIndex++){\n        var feature = features[featureIndex];\n        (0, _core.log).assert(feature && feature.geometry, \"GeoJSON does not have geometry\");\n        var geometry = feature.geometry;\n        if (geometry.type === \"GeometryCollection\") {\n            (0, _core.log).assert(Array.isArray(geometry.geometries), \"GeoJSON does not have geometries array\");\n            var geometries = geometry.geometries;\n            for(var i = 0; i < geometries.length; i++){\n                var subGeometry = geometries[i];\n                separateGeometry(subGeometry, separated, wrapFeature, feature, featureIndex);\n            }\n        } else separateGeometry(geometry, separated, wrapFeature, feature, featureIndex);\n    }\n    return separated;\n}\nfunction separateGeometry(geometry, separated, wrapFeature, sourceFeature, sourceFeatureIndex) {\n    var type = geometry.type, coordinates = geometry.coordinates;\n    var pointFeatures = separated.pointFeatures, lineFeatures = separated.lineFeatures, polygonFeatures = separated.polygonFeatures, polygonOutlineFeatures = separated.polygonOutlineFeatures;\n    if (!validateGeometry(type, coordinates)) {\n        (0, _core.log).warn(\"\".concat(type, \" coordinates are malformed\"))();\n        return;\n    }\n    switch(type){\n        case \"Point\":\n            pointFeatures.push(wrapFeature({\n                geometry: geometry\n            }, sourceFeature, sourceFeatureIndex));\n            break;\n        case \"MultiPoint\":\n            coordinates.forEach(function(point) {\n                pointFeatures.push(wrapFeature({\n                    geometry: {\n                        type: \"Point\",\n                        coordinates: point\n                    }\n                }, sourceFeature, sourceFeatureIndex));\n            });\n            break;\n        case \"LineString\":\n            lineFeatures.push(wrapFeature({\n                geometry: geometry\n            }, sourceFeature, sourceFeatureIndex));\n            break;\n        case \"MultiLineString\":\n            coordinates.forEach(function(path) {\n                lineFeatures.push(wrapFeature({\n                    geometry: {\n                        type: \"LineString\",\n                        coordinates: path\n                    }\n                }, sourceFeature, sourceFeatureIndex));\n            });\n            break;\n        case \"Polygon\":\n            polygonFeatures.push(wrapFeature({\n                geometry: geometry\n            }, sourceFeature, sourceFeatureIndex));\n            coordinates.forEach(function(path) {\n                polygonOutlineFeatures.push(wrapFeature({\n                    geometry: {\n                        type: \"LineString\",\n                        coordinates: path\n                    }\n                }, sourceFeature, sourceFeatureIndex));\n            });\n            break;\n        case \"MultiPolygon\":\n            coordinates.forEach(function(polygon) {\n                polygonFeatures.push(wrapFeature({\n                    geometry: {\n                        type: \"Polygon\",\n                        coordinates: polygon\n                    }\n                }, sourceFeature, sourceFeatureIndex));\n                polygon.forEach(function(path) {\n                    polygonOutlineFeatures.push(wrapFeature({\n                        geometry: {\n                            type: \"LineString\",\n                            coordinates: path\n                        }\n                    }, sourceFeature, sourceFeatureIndex));\n                });\n            });\n            break;\n        default:\n    }\n}\nvar COORDINATE_NEST_LEVEL = {\n    Point: 1,\n    MultiPoint: 2,\n    LineString: 2,\n    MultiLineString: 3,\n    Polygon: 3,\n    MultiPolygon: 4\n};\nfunction validateGeometry(type, coordinates) {\n    var nestLevel = COORDINATE_NEST_LEVEL[type];\n    (0, _core.log).assert(nestLevel, \"Unknown GeoJSON type \".concat(type));\n    while(coordinates && --nestLevel > 0)coordinates = coordinates[0];\n    return coordinates && Number.isFinite(coordinates[0]);\n}\n\n},{\"@deck.gl/core\":\"lTaaR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3TOYQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>TextLayer);\nvar _slicedToArray = require(\"@babel/runtime/helpers/esm/slicedToArray\");\nvar _slicedToArrayDefault = parcelHelpers.interopDefault(_slicedToArray);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _core = require(\"@deck.gl/core\");\nvar _multiIconLayer = require(\"./multi-icon-layer/multi-icon-layer\");\nvar _multiIconLayerDefault = parcelHelpers.interopDefault(_multiIconLayer);\nvar _fontAtlasManager = require(\"./font-atlas-manager\");\nvar _fontAtlasManagerDefault = parcelHelpers.interopDefault(_fontAtlasManager);\nvar _utils = require(\"./utils\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction ownKeys(object, enumerableOnly) {\n    var keys = Object.keys(object);\n    if (Object.getOwnPropertySymbols) {\n        var symbols = Object.getOwnPropertySymbols(object);\n        if (enumerableOnly) symbols = symbols.filter(function(sym) {\n            return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n        });\n        keys.push.apply(keys, symbols);\n    }\n    return keys;\n}\nfunction _objectSpread(target) {\n    for(var i = 1; i < arguments.length; i++){\n        var source = arguments[i] != null ? arguments[i] : {};\n        if (i % 2) ownKeys(Object(source), true).forEach(function(key) {\n            (0, _definePropertyDefault.default)(target, key, source[key]);\n        });\n        else if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n        else ownKeys(Object(source)).forEach(function(key) {\n            Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n        });\n    }\n    return target;\n}\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_FONT_SETTINGS = {\n    fontSize: (0, _fontAtlasManager.DEFAULT_FONT_SIZE),\n    buffer: (0, _fontAtlasManager.DEFAULT_BUFFER),\n    sdf: false,\n    radius: (0, _fontAtlasManager.DEFAULT_RADIUS),\n    cutoff: (0, _fontAtlasManager.DEFAULT_CUTOFF)\n};\nvar TEXT_ANCHOR = {\n    start: 1,\n    middle: 0,\n    end: -1\n};\nvar ALIGNMENT_BASELINE = {\n    top: 1,\n    center: 0,\n    bottom: -1\n};\nvar DEFAULT_COLOR = [\n    0,\n    0,\n    0,\n    255\n];\nvar DEFAULT_LINE_HEIGHT = 1.0;\nvar FONT_SETTINGS_PROPS = [\n    \"fontSize\",\n    \"buffer\",\n    \"sdf\",\n    \"radius\",\n    \"cutoff\"\n];\nvar defaultProps = {\n    billboard: true,\n    sizeScale: 1,\n    sizeUnits: \"pixels\",\n    sizeMinPixels: 0,\n    sizeMaxPixels: Number.MAX_SAFE_INTEGER,\n    backgroundColor: {\n        type: \"color\",\n        value: null,\n        optional: true\n    },\n    characterSet: (0, _fontAtlasManager.DEFAULT_CHAR_SET),\n    fontFamily: (0, _fontAtlasManager.DEFAULT_FONT_FAMILY),\n    fontWeight: (0, _fontAtlasManager.DEFAULT_FONT_WEIGHT),\n    lineHeight: DEFAULT_LINE_HEIGHT,\n    fontSettings: {},\n    wordBreak: \"word-break\",\n    maxWidth: {\n        type: \"number\",\n        value: -1\n    },\n    getText: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.text;\n        }\n    },\n    getPosition: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.position;\n        }\n    },\n    getColor: {\n        type: \"accessor\",\n        value: DEFAULT_COLOR\n    },\n    getSize: {\n        type: \"accessor\",\n        value: 32\n    },\n    getAngle: {\n        type: \"accessor\",\n        value: 0\n    },\n    getTextAnchor: {\n        type: \"accessor\",\n        value: \"middle\"\n    },\n    getAlignmentBaseline: {\n        type: \"accessor\",\n        value: \"center\"\n    },\n    getPixelOffset: {\n        type: \"accessor\",\n        value: [\n            0,\n            0\n        ]\n    }\n};\nvar TextLayer = function(_CompositeLayer) {\n    (0, _inheritsDefault.default)(TextLayer1, _CompositeLayer);\n    var _super = _createSuper(TextLayer1);\n    function TextLayer1() {\n        (0, _classCallCheckDefault.default)(this, TextLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(TextLayer1, [\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                this.state = {\n                    styleVersion: 0,\n                    fontAtlasManager: new (0, _fontAtlasManagerDefault.default)(this.context.gl)\n                };\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(_ref) {\n                var props = _ref.props, oldProps = _ref.oldProps, changeFlags = _ref.changeFlags;\n                var fontChanged = this._fontChanged(oldProps, props);\n                if (fontChanged) this._updateFontAtlas(oldProps, props);\n                var styleChanged = fontChanged || props.lineHeight !== oldProps.lineHeight || props.wordBreak !== oldProps.wordBreak || props.maxWidth !== oldProps.maxWidth;\n                var textChanged = changeFlags.dataChanged || changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getText);\n                if (textChanged) this._updateText();\n                if (styleChanged) this.setState({\n                    styleVersion: this.state.styleVersion + 1\n                });\n            }\n        },\n        {\n            key: \"finalizeState\",\n            value: function finalizeState() {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(TextLayer1.prototype), \"finalizeState\", this).call(this);\n                this.state.fontAtlasManager.finalize();\n            }\n        },\n        {\n            key: \"getPickingInfo\",\n            value: function getPickingInfo(_ref2) {\n                var info = _ref2.info;\n                return Object.assign(info, {\n                    object: info.index >= 0 ? this.props.data[info.index] : null\n                });\n            }\n        },\n        {\n            key: \"_updateFontAtlas\",\n            value: function _updateFontAtlas(oldProps, props) {\n                var characterSet = props.characterSet, fontSettings = props.fontSettings, fontFamily = props.fontFamily, fontWeight = props.fontWeight;\n                var fontAtlasManager = this.state.fontAtlasManager;\n                fontAtlasManager.setProps(Object.assign({}, DEFAULT_FONT_SETTINGS, fontSettings, {\n                    characterSet: characterSet,\n                    fontFamily: fontFamily,\n                    fontWeight: fontWeight\n                }));\n                this.setNeedsRedraw(true);\n            }\n        },\n        {\n            key: \"_fontChanged\",\n            value: function _fontChanged(oldProps, props) {\n                if (oldProps.fontFamily !== props.fontFamily || oldProps.characterSet !== props.characterSet || oldProps.fontWeight !== props.fontWeight) return true;\n                if (oldProps.fontSettings === props.fontSettings) return false;\n                var oldFontSettings = oldProps.fontSettings || {};\n                var fontSettings = props.fontSettings || {};\n                return FONT_SETTINGS_PROPS.some(function(prop) {\n                    return oldFontSettings[prop] !== fontSettings[prop];\n                });\n            }\n        },\n        {\n            key: \"_updateText\",\n            value: function _updateText() {\n                var data = this.props.data;\n                var textBuffer = data.attributes && data.attributes.getText;\n                var getText = this.props.getText;\n                var startIndices = data.startIndices;\n                var numInstances;\n                if (textBuffer && startIndices) {\n                    var _getTextFromBuffer = (0, _utils.getTextFromBuffer)(_objectSpread(_objectSpread({}, ArrayBuffer.isView(textBuffer) ? {\n                        value: textBuffer\n                    } : textBuffer), {}, {\n                        length: data.length,\n                        startIndices: startIndices\n                    })), texts = _getTextFromBuffer.texts, characterCount = _getTextFromBuffer.characterCount;\n                    numInstances = characterCount;\n                    getText = function getText(_, _ref3) {\n                        var index = _ref3.index;\n                        return texts[index];\n                    };\n                } else {\n                    var _createIterable = (0, _core.createIterable)(data), iterable = _createIterable.iterable, objectInfo = _createIterable.objectInfo;\n                    startIndices = [\n                        0\n                    ];\n                    numInstances = 0;\n                    var _iterator = _createForOfIteratorHelper(iterable), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var object = _step.value;\n                            objectInfo.index++;\n                            var text = getText(object, objectInfo) || \"\";\n                            numInstances += text.length;\n                            startIndices.push(numInstances);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                }\n                this.setState({\n                    getText: getText,\n                    startIndices: startIndices,\n                    numInstances: numInstances\n                });\n            }\n        },\n        {\n            key: \"getIconOffsets\",\n            value: function getIconOffsets(object, objectInfo) {\n                var iconMapping = this.state.fontAtlasManager.mapping;\n                var getText = this.state.getText;\n                var _this$props = this.props, wordBreak = _this$props.wordBreak, maxWidth = _this$props.maxWidth, lineHeight = _this$props.lineHeight, getTextAnchor = _this$props.getTextAnchor, getAlignmentBaseline = _this$props.getAlignmentBaseline;\n                var paragraph = getText(object, objectInfo) || \"\";\n                var _transformParagraph = (0, _utils.transformParagraph)(paragraph, lineHeight, wordBreak, maxWidth, iconMapping), characters = _transformParagraph.characters, _transformParagraph$s = (0, _slicedToArrayDefault.default)(_transformParagraph.size, 2), width = _transformParagraph$s[0], height = _transformParagraph$s[1];\n                var anchorX = TEXT_ANCHOR[typeof getTextAnchor === \"function\" ? getTextAnchor(object, objectInfo) : getTextAnchor];\n                var anchorY = ALIGNMENT_BASELINE[typeof getAlignmentBaseline === \"function\" ? getAlignmentBaseline(object, objectInfo) : getAlignmentBaseline];\n                var offsets = new Array(paragraph.length * 2);\n                var index = 0;\n                var _iterator2 = _createForOfIteratorHelper(characters), _step2;\n                try {\n                    for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                        var _step2$value = _step2.value, rowWidth = _step2$value.rowWidth, x = _step2$value.x, y = _step2$value.y;\n                        var rowOffset = (1 - anchorX) * (width - rowWidth) / 2;\n                        offsets[index++] = (anchorX - 1) * width / 2 + rowOffset + x;\n                        offsets[index++] = (anchorY - 1) * height / 2 + y;\n                    }\n                } catch (err) {\n                    _iterator2.e(err);\n                } finally{\n                    _iterator2.f();\n                }\n                return offsets;\n            }\n        },\n        {\n            key: \"renderLayers\",\n            value: function renderLayers() {\n                var _this$state = this.state, startIndices = _this$state.startIndices, numInstances = _this$state.numInstances, getText = _this$state.getText, _this$state$fontAtlas = _this$state.fontAtlasManager, scale = _this$state$fontAtlas.scale, texture = _this$state$fontAtlas.texture, mapping = _this$state$fontAtlas.mapping, styleVersion = _this$state.styleVersion;\n                var _this$props2 = this.props, data = _this$props2.data, _dataDiff = _this$props2._dataDiff, backgroundColor = _this$props2.backgroundColor, getPosition = _this$props2.getPosition, getColor = _this$props2.getColor, getSize = _this$props2.getSize, getAngle = _this$props2.getAngle, getPixelOffset = _this$props2.getPixelOffset, billboard = _this$props2.billboard, fontSettings = _this$props2.fontSettings, sizeScale = _this$props2.sizeScale, sizeUnits = _this$props2.sizeUnits, sizeMinPixels = _this$props2.sizeMinPixels, sizeMaxPixels = _this$props2.sizeMaxPixels, transitions = _this$props2.transitions, updateTriggers = _this$props2.updateTriggers;\n                var getIconOffsets = this.getIconOffsets.bind(this);\n                var SubLayerClass = this.getSubLayerClass(\"characters\", (0, _multiIconLayerDefault.default));\n                return new SubLayerClass({\n                    sdf: fontSettings.sdf,\n                    iconAtlas: texture,\n                    iconMapping: mapping,\n                    backgroundColor: backgroundColor,\n                    getPosition: getPosition,\n                    getColor: getColor,\n                    getSize: getSize,\n                    getAngle: getAngle,\n                    getPixelOffset: getPixelOffset,\n                    billboard: billboard,\n                    sizeScale: sizeScale * scale,\n                    sizeUnits: sizeUnits,\n                    sizeMinPixels: sizeMinPixels * scale,\n                    sizeMaxPixels: sizeMaxPixels * scale,\n                    transitions: transitions && {\n                        getPosition: transitions.getPosition,\n                        getAngle: transitions.getAngle,\n                        getColor: transitions.getColor,\n                        getSize: transitions.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset\n                    }\n                }, this.getSubLayerProps({\n                    id: \"characters\",\n                    updateTriggers: {\n                        getIcon: updateTriggers.getText,\n                        getPosition: updateTriggers.getPosition,\n                        getAngle: updateTriggers.getAngle,\n                        getColor: updateTriggers.getColor,\n                        getSize: updateTriggers.getSize,\n                        getPixelOffset: updateTriggers.getPixelOffset,\n                        getIconOffsets: {\n                            getText: updateTriggers.getText,\n                            getTextAnchor: updateTriggers.getTextAnchor,\n                            getAlignmentBaseline: updateTriggers.getAlignmentBaseline,\n                            styleVersion: styleVersion\n                        }\n                    }\n                }), {\n                    data: data,\n                    _dataDiff: _dataDiff,\n                    startIndices: startIndices,\n                    numInstances: numInstances,\n                    getIconOffsets: getIconOffsets,\n                    getIcon: getText\n                });\n            }\n        }\n    ]);\n    return TextLayer1;\n}((0, _core.CompositeLayer));\nTextLayer.layerName = \"TextLayer\";\nTextLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/slicedToArray\":\"iXlTc\",\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"@deck.gl/core\":\"lTaaR\",\"./multi-icon-layer/multi-icon-layer\":\"8E73M\",\"./font-atlas-manager\":\"7sr8L\",\"./utils\":\"7AY30\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8E73M\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>MultiIconLayer);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _get = require(\"@babel/runtime/helpers/esm/get\");\nvar _getDefault = parcelHelpers.interopDefault(_get);\nvar _inherits = require(\"@babel/runtime/helpers/esm/inherits\");\nvar _inheritsDefault = parcelHelpers.interopDefault(_inherits);\nvar _possibleConstructorReturn = require(\"@babel/runtime/helpers/esm/possibleConstructorReturn\");\nvar _possibleConstructorReturnDefault = parcelHelpers.interopDefault(_possibleConstructorReturn);\nvar _getPrototypeOf = require(\"@babel/runtime/helpers/esm/getPrototypeOf\");\nvar _getPrototypeOfDefault = parcelHelpers.interopDefault(_getPrototypeOf);\nvar _iconLayer = require(\"../../icon-layer/icon-layer\");\nvar _iconLayerDefault = parcelHelpers.interopDefault(_iconLayer);\nvar _multiIconLayerFragmentGlsl = require(\"./multi-icon-layer-fragment.glsl\");\nvar _multiIconLayerFragmentGlslDefault = parcelHelpers.interopDefault(_multiIconLayerFragmentGlsl);\nfunction _createSuper(Derived) {\n    var hasNativeReflectConstruct = _isNativeReflectConstruct();\n    return function _createSuperInternal() {\n        var Super = (0, _getPrototypeOfDefault.default)(Derived), result;\n        if (hasNativeReflectConstruct) {\n            var NewTarget = (0, _getPrototypeOfDefault.default)(this).constructor;\n            result = Reflect.construct(Super, arguments, NewTarget);\n        } else result = Super.apply(this, arguments);\n        return (0, _possibleConstructorReturnDefault.default)(this, result);\n    };\n}\nfunction _isNativeReflectConstruct() {\n    if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n    if (Reflect.construct.sham) return false;\n    if (typeof Proxy === \"function\") return true;\n    try {\n        Date.prototype.toString.call(Reflect.construct(Date, [], function() {}));\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\nvar DEFAULT_GAMMA = 0.2;\nvar DEFAULT_BUFFER = 0.75;\nvar EMPTY_ARRAY = [];\nvar defaultProps = {\n    backgroundColor: {\n        type: \"color\",\n        value: null,\n        optional: true\n    },\n    getIconOffsets: {\n        type: \"accessor\",\n        value: function value(x) {\n            return x.offsets;\n        }\n    },\n    alphaCutoff: 0\n};\nvar MultiIconLayer = function(_IconLayer) {\n    (0, _inheritsDefault.default)(MultiIconLayer1, _IconLayer);\n    var _super = _createSuper(MultiIconLayer1);\n    function MultiIconLayer1() {\n        (0, _classCallCheckDefault.default)(this, MultiIconLayer1);\n        return _super.apply(this, arguments);\n    }\n    (0, _createClassDefault.default)(MultiIconLayer1, [\n        {\n            key: \"getShaders\",\n            value: function getShaders() {\n                return Object.assign({}, (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"getShaders\", this).call(this), {\n                    inject: {\n                        \"vs:#decl\": \"\\n  uniform float gamma;\\n  varying float vGamma;\\n\",\n                        \"vs:#main-end\": \"\\n  vGamma = gamma / (sizeScale * iconSize.y);\\n\"\n                    },\n                    fs: (0, _multiIconLayerFragmentGlslDefault.default)\n                });\n            }\n        },\n        {\n            key: \"initializeState\",\n            value: function initializeState() {\n                var _this = this;\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"initializeState\", this).call(this);\n                var attributeManager = this.getAttributeManager();\n                attributeManager.addInstanced({\n                    instanceOffsets: {\n                        size: 2,\n                        accessor: \"getIconOffsets\"\n                    },\n                    instancePickingColors: {\n                        type: 5121,\n                        size: 3,\n                        accessor: function accessor(object, _ref) {\n                            var index = _ref.index, value = _ref.target;\n                            return _this.encodePickingColor(index, value);\n                        }\n                    }\n                });\n            }\n        },\n        {\n            key: \"updateState\",\n            value: function updateState(updateParams) {\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"updateState\", this).call(this, updateParams);\n                var oldProps = updateParams.oldProps, props = updateParams.props;\n                if (props.backgroundColor !== oldProps.backgroundColor) {\n                    var backgroundColor = Array.isArray(props.backgroundColor) ? props.backgroundColor.map(function(c) {\n                        return c / 255.0;\n                    }).slice(0, 3) : null;\n                    this.setState({\n                        backgroundColor: backgroundColor\n                    });\n                }\n            }\n        },\n        {\n            key: \"draw\",\n            value: function draw(_ref2) {\n                var uniforms = _ref2.uniforms;\n                var sdf = this.props.sdf;\n                var backgroundColor = this.state.backgroundColor;\n                var shouldDrawBackground = Array.isArray(backgroundColor);\n                (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"draw\", this).call(this, {\n                    uniforms: Object.assign({}, uniforms, {\n                        buffer: DEFAULT_BUFFER,\n                        gamma: DEFAULT_GAMMA,\n                        sdf: Boolean(sdf),\n                        backgroundColor: backgroundColor || [\n                            0,\n                            0,\n                            0\n                        ],\n                        shouldDrawBackground: shouldDrawBackground\n                    })\n                });\n            }\n        },\n        {\n            key: \"getInstanceOffset\",\n            value: function getInstanceOffset(icons) {\n                var _this2 = this;\n                return icons ? Array.from(icons).map(function(icon) {\n                    return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"getInstanceOffset\", _this2).call(_this2, icon);\n                }) : EMPTY_ARRAY;\n            }\n        },\n        {\n            key: \"getInstanceColorMode\",\n            value: function getInstanceColorMode(icons) {\n                return 1;\n            }\n        },\n        {\n            key: \"getInstanceIconFrame\",\n            value: function getInstanceIconFrame(icons) {\n                var _this3 = this;\n                return icons ? Array.from(icons).map(function(icon) {\n                    return (0, _getDefault.default)((0, _getPrototypeOfDefault.default)(MultiIconLayer1.prototype), \"getInstanceIconFrame\", _this3).call(_this3, icon);\n                }) : EMPTY_ARRAY;\n            }\n        }\n    ]);\n    return MultiIconLayer1;\n}((0, _iconLayerDefault.default));\nMultiIconLayer.layerName = \"MultiIconLayer\";\nMultiIconLayer.defaultProps = defaultProps;\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@babel/runtime/helpers/esm/get\":\"3LBf5\",\"@babel/runtime/helpers/esm/inherits\":\"jPqq4\",\"@babel/runtime/helpers/esm/possibleConstructorReturn\":\"6HRPt\",\"@babel/runtime/helpers/esm/getPrototypeOf\":\"3gKMG\",\"../../icon-layer/icon-layer\":\"ezXyS\",\"./multi-icon-layer-fragment.glsl\":\"5NqtC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5NqtC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = \"#define SHADER_NAME multi-icon-layer-fragment-shader\\n\\nprecision highp float;\\n\\nuniform float opacity;\\nuniform sampler2D iconsTexture;\\nuniform float buffer;\\nuniform bool sdf;\\nuniform float alphaCutoff;\\nuniform bool shouldDrawBackground;\\nuniform vec3 backgroundColor;\\n\\nvarying vec4 vColor;\\nvarying vec2 vTextureCoords;\\nvarying float vGamma;\\nvarying vec2 uv;\\n\\nvoid main(void) {\\n  geometry.uv = uv;\\n\\n  if (!picking_uActive) {\\n    float alpha = texture2D(iconsTexture, vTextureCoords).a;\\n    if (sdf) {\\n      alpha = smoothstep(buffer - vGamma, buffer + vGamma, alpha);\\n    }\\n    float a = alpha * vColor.a;\\n    \\n    if (a < alphaCutoff) {\\n      if (shouldDrawBackground) {\\n        gl_FragColor = vec4(backgroundColor, vColor.a);\\n      } else {\\n        discard;\\n      }\\n    } else {\\n      if (shouldDrawBackground) {\\n        gl_FragColor = vec4(mix(backgroundColor, vColor.rgb, alpha), vColor.a * opacity);\\n      } else {\\n        gl_FragColor = vec4(vColor.rgb, a * opacity);\\n      }\\n      DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n    }\\n  } else {\\n    DECKGL_FILTER_COLOR(gl_FragColor, geometry);\\n  }\\n}\\n\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7sr8L\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DEFAULT_CHAR_SET\", ()=>DEFAULT_CHAR_SET);\nparcelHelpers.export(exports, \"DEFAULT_FONT_FAMILY\", ()=>DEFAULT_FONT_FAMILY);\nparcelHelpers.export(exports, \"DEFAULT_FONT_WEIGHT\", ()=>DEFAULT_FONT_WEIGHT);\nparcelHelpers.export(exports, \"DEFAULT_FONT_SIZE\", ()=>DEFAULT_FONT_SIZE);\nparcelHelpers.export(exports, \"DEFAULT_BUFFER\", ()=>DEFAULT_BUFFER);\nparcelHelpers.export(exports, \"DEFAULT_CUTOFF\", ()=>DEFAULT_CUTOFF);\nparcelHelpers.export(exports, \"DEFAULT_RADIUS\", ()=>DEFAULT_RADIUS);\nparcelHelpers.export(exports, \"default\", ()=>FontAtlasManager);\nvar _defineProperty = require(\"@babel/runtime/helpers/esm/defineProperty\");\nvar _definePropertyDefault = parcelHelpers.interopDefault(_defineProperty);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar _core = require(\"@luma.gl/core\");\nvar _tinySdf = require(\"@mapbox/tiny-sdf\");\nvar _tinySdfDefault = parcelHelpers.interopDefault(_tinySdf);\nvar _utils = require(\"./utils\");\nvar _lruCache = require(\"./lru-cache\");\nvar _lruCacheDefault = parcelHelpers.interopDefault(_lruCache);\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nfunction getDefaultCharacterSet() {\n    var charSet = [];\n    for(var i = 32; i < 128; i++)charSet.push(String.fromCharCode(i));\n    return charSet;\n}\nvar DEFAULT_CHAR_SET = getDefaultCharacterSet();\nvar DEFAULT_FONT_FAMILY = \"Monaco, monospace\";\nvar DEFAULT_FONT_WEIGHT = \"normal\";\nvar DEFAULT_FONT_SIZE = 64;\nvar DEFAULT_BUFFER = 2;\nvar DEFAULT_CUTOFF = 0.25;\nvar DEFAULT_RADIUS = 3;\nvar GL_TEXTURE_WRAP_S = 0x2802;\nvar GL_TEXTURE_WRAP_T = 0x2803;\nvar GL_CLAMP_TO_EDGE = 0x812f;\nvar MAX_CANVAS_WIDTH = 1024;\nvar BASELINE_SCALE = 0.9;\nvar HEIGHT_SCALE = 1.2;\nvar CACHE_LIMIT = 3;\nvar cache = new (0, _lruCacheDefault.default)(CACHE_LIMIT);\nvar VALID_PROPS = [\n    \"fontFamily\",\n    \"fontWeight\",\n    \"characterSet\",\n    \"fontSize\",\n    \"sdf\",\n    \"buffer\",\n    \"cutoff\",\n    \"radius\"\n];\nfunction getNewChars(key, characterSet) {\n    var cachedFontAtlas = cache.get(key);\n    if (!cachedFontAtlas) return characterSet;\n    var newChars = [];\n    var cachedMapping = cachedFontAtlas.mapping;\n    var cachedCharSet = Object.keys(cachedMapping);\n    cachedCharSet = new Set(cachedCharSet);\n    var charSet = characterSet;\n    if (charSet instanceof Array) charSet = new Set(charSet);\n    charSet.forEach(function(_char) {\n        if (!cachedCharSet.has(_char)) newChars.push(_char);\n    });\n    return newChars;\n}\nfunction populateAlphaChannel(alphaChannel, imageData) {\n    for(var i = 0; i < alphaChannel.length; i++)imageData.data[4 * i + 3] = alphaChannel[i];\n}\nfunction setTextStyle(ctx, fontFamily, fontSize, fontWeight) {\n    ctx.font = \"\".concat(fontWeight, \" \").concat(fontSize, \"px \").concat(fontFamily);\n    ctx.fillStyle = \"#000\";\n    ctx.textBaseline = \"baseline\";\n    ctx.textAlign = \"left\";\n}\nvar FontAtlasManager = function() {\n    function FontAtlasManager1(gl) {\n        (0, _classCallCheckDefault.default)(this, FontAtlasManager1);\n        this.gl = gl;\n        this.props = {\n            fontFamily: DEFAULT_FONT_FAMILY,\n            fontWeight: DEFAULT_FONT_WEIGHT,\n            characterSet: DEFAULT_CHAR_SET,\n            fontSize: DEFAULT_FONT_SIZE,\n            buffer: DEFAULT_BUFFER,\n            sdf: false,\n            cutoff: DEFAULT_CUTOFF,\n            radius: DEFAULT_RADIUS\n        };\n        this._key = null;\n        this._texture = new (0, _core.Texture2D)(this.gl);\n    }\n    (0, _createClassDefault.default)(FontAtlasManager1, [\n        {\n            key: \"finalize\",\n            value: function finalize() {\n                this._texture[\"delete\"]();\n            }\n        },\n        {\n            key: \"setProps\",\n            value: function setProps() {\n                var _this = this;\n                var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n                VALID_PROPS.forEach(function(prop) {\n                    if (prop in props) _this.props[prop] = props[prop];\n                });\n                var oldKey = this._key;\n                this._key = this._getKey();\n                var charSet = getNewChars(this._key, this.props.characterSet);\n                var cachedFontAtlas = cache.get(this._key);\n                if (cachedFontAtlas && charSet.length === 0) {\n                    if (this._key !== oldKey) this._updateTexture(cachedFontAtlas);\n                    return;\n                }\n                var fontAtlas = this._generateFontAtlas(this._key, charSet, cachedFontAtlas);\n                this._updateTexture(fontAtlas);\n                cache.set(this._key, fontAtlas);\n            }\n        },\n        {\n            key: \"_updateTexture\",\n            value: function _updateTexture(_ref) {\n                var _parameters;\n                var canvas = _ref.data, width = _ref.width, height = _ref.height;\n                if (this._texture.width !== width || this._texture.height !== height) this._texture.resize({\n                    width: width,\n                    height: height\n                });\n                this._texture.setImageData({\n                    data: canvas,\n                    width: width,\n                    height: height,\n                    parameters: (_parameters = {}, (0, _definePropertyDefault.default)(_parameters, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE), (0, _definePropertyDefault.default)(_parameters, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE), _parameters)\n                });\n                this._texture.generateMipmap();\n            }\n        },\n        {\n            key: \"_generateFontAtlas\",\n            value: function _generateFontAtlas(key, characterSet, cachedFontAtlas) {\n                var _this$props = this.props, fontFamily = _this$props.fontFamily, fontWeight = _this$props.fontWeight, fontSize = _this$props.fontSize, buffer = _this$props.buffer, sdf = _this$props.sdf, radius = _this$props.radius, cutoff = _this$props.cutoff;\n                var canvas = cachedFontAtlas && cachedFontAtlas.data;\n                if (!canvas) {\n                    canvas = document.createElement(\"canvas\");\n                    canvas.width = MAX_CANVAS_WIDTH;\n                }\n                var ctx = canvas.getContext(\"2d\");\n                setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n                var _buildMapping = (0, _utils.buildMapping)(Object.assign({\n                    getFontWidth: function getFontWidth(_char2) {\n                        return ctx.measureText(_char2).width;\n                    },\n                    fontHeight: fontSize * HEIGHT_SCALE,\n                    buffer: buffer,\n                    characterSet: characterSet,\n                    maxCanvasWidth: MAX_CANVAS_WIDTH\n                }, cachedFontAtlas && {\n                    mapping: cachedFontAtlas.mapping,\n                    xOffset: cachedFontAtlas.xOffset,\n                    yOffset: cachedFontAtlas.yOffset\n                })), mapping = _buildMapping.mapping, canvasHeight = _buildMapping.canvasHeight, xOffset = _buildMapping.xOffset, yOffset = _buildMapping.yOffset;\n                if (canvas.height !== canvasHeight) {\n                    var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n                    canvas.height = canvasHeight;\n                    ctx.putImageData(imageData, 0, 0);\n                }\n                setTextStyle(ctx, fontFamily, fontSize, fontWeight);\n                if (sdf) {\n                    var tinySDF = new (0, _tinySdfDefault.default)(fontSize, buffer, radius, cutoff, fontFamily, fontWeight);\n                    var _imageData = ctx.getImageData(0, 0, tinySDF.size, tinySDF.size);\n                    var _iterator = _createForOfIteratorHelper(characterSet), _step;\n                    try {\n                        for(_iterator.s(); !(_step = _iterator.n()).done;){\n                            var _char3 = _step.value;\n                            populateAlphaChannel(tinySDF.draw(_char3), _imageData);\n                            ctx.putImageData(_imageData, mapping[_char3].x - buffer, mapping[_char3].y - buffer);\n                        }\n                    } catch (err) {\n                        _iterator.e(err);\n                    } finally{\n                        _iterator.f();\n                    }\n                } else {\n                    var _iterator2 = _createForOfIteratorHelper(characterSet), _step2;\n                    try {\n                        for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                            var _char4 = _step2.value;\n                            ctx.fillText(_char4, mapping[_char4].x, mapping[_char4].y + fontSize * BASELINE_SCALE);\n                        }\n                    } catch (err) {\n                        _iterator2.e(err);\n                    } finally{\n                        _iterator2.f();\n                    }\n                }\n                return {\n                    xOffset: xOffset,\n                    yOffset: yOffset,\n                    mapping: mapping,\n                    data: canvas,\n                    width: canvas.width,\n                    height: canvas.height\n                };\n            }\n        },\n        {\n            key: \"_getKey\",\n            value: function _getKey() {\n                var _this$props2 = this.props, gl = _this$props2.gl, fontFamily = _this$props2.fontFamily, fontWeight = _this$props2.fontWeight, fontSize = _this$props2.fontSize, buffer = _this$props2.buffer, sdf = _this$props2.sdf, radius = _this$props2.radius, cutoff = _this$props2.cutoff;\n                if (sdf) return \"\".concat(gl, \" \").concat(fontFamily, \" \").concat(fontWeight, \" \").concat(fontSize, \" \").concat(buffer, \" \").concat(radius, \" \").concat(cutoff);\n                return \"\".concat(gl, \" \").concat(fontFamily, \" \").concat(fontWeight, \" \").concat(fontSize, \" \").concat(buffer);\n            }\n        },\n        {\n            key: \"texture\",\n            get: function get() {\n                return this._texture;\n            }\n        },\n        {\n            key: \"mapping\",\n            get: function get() {\n                var data = cache.get(this._key);\n                return data && data.mapping;\n            }\n        },\n        {\n            key: \"scale\",\n            get: function get() {\n                return HEIGHT_SCALE;\n            }\n        }\n    ]);\n    return FontAtlasManager1;\n}();\n\n},{\"@babel/runtime/helpers/esm/defineProperty\":\"dlHSV\",\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@luma.gl/core\":\"bW3Qv\",\"@mapbox/tiny-sdf\":\"i8I1k\",\"./utils\":\"7AY30\",\"./lru-cache\":\"h5HMT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i8I1k\":[function(require,module,exports) {\n\"use strict\";\nmodule.exports = TinySDF;\nmodule.exports.default = TinySDF;\nvar INF = 1e20;\nfunction TinySDF(fontSize, buffer, radius, cutoff, fontFamily, fontWeight) {\n    this.fontSize = fontSize || 24;\n    this.buffer = buffer === undefined ? 3 : buffer;\n    this.cutoff = cutoff || 0.25;\n    this.fontFamily = fontFamily || \"sans-serif\";\n    this.fontWeight = fontWeight || \"normal\";\n    this.radius = radius || 8;\n    // For backwards compatibility, we honor the implicit contract that the\n    // size of the returned bitmap will be fontSize + buffer * 2\n    var size = this.size = this.fontSize + this.buffer * 2;\n    // Glyphs may be slightly larger than their fontSize. The canvas already\n    // has buffer space, but create extra buffer space in the output grid for the\n    // \"halo\" to extend into (if metric extraction is enabled)\n    var gridSize = size + this.buffer * 2;\n    this.canvas = document.createElement(\"canvas\");\n    this.canvas.width = this.canvas.height = size;\n    this.ctx = this.canvas.getContext(\"2d\");\n    this.ctx.font = this.fontWeight + \" \" + this.fontSize + \"px \" + this.fontFamily;\n    this.ctx.textAlign = \"left\"; // Necessary so that RTL text doesn't have different alignment\n    this.ctx.fillStyle = \"black\";\n    // temporary arrays for the distance transform\n    this.gridOuter = new Float64Array(gridSize * gridSize);\n    this.gridInner = new Float64Array(gridSize * gridSize);\n    this.f = new Float64Array(gridSize);\n    this.z = new Float64Array(gridSize + 1);\n    this.v = new Uint16Array(gridSize);\n    this.useMetrics = this.ctx.measureText(\"A\").actualBoundingBoxLeft !== undefined;\n    // hack around https://bugzilla.mozilla.org/show_bug.cgi?id=737852\n    this.middle = Math.round(size / 2 * (navigator.userAgent.indexOf(\"Gecko/\") >= 0 ? 1.2 : 1));\n}\nfunction prepareGrids(imgData, width, height, glyphWidth, glyphHeight, gridOuter, gridInner) {\n    // Initialize grids outside the glyph range to alpha 0\n    gridOuter.fill(INF, 0, width * height);\n    gridInner.fill(0, 0, width * height);\n    var offset = (width - glyphWidth) / 2; // This is zero if we're not extracting metrics\n    for(var y = 0; y < glyphHeight; y++)for(var x = 0; x < glyphWidth; x++){\n        var j = (y + offset) * width + x + offset;\n        var a = imgData.data[4 * (y * glyphWidth + x) + 3] / 255; // alpha value\n        if (a === 1) {\n            gridOuter[j] = 0;\n            gridInner[j] = INF;\n        } else if (a === 0) {\n            gridOuter[j] = INF;\n            gridInner[j] = 0;\n        } else {\n            var b = Math.max(0, 0.5 - a);\n            var c = Math.max(0, a - 0.5);\n            gridOuter[j] = b * b;\n            gridInner[j] = c * c;\n        }\n    }\n}\nfunction extractAlpha(alphaChannel, width, height, gridOuter, gridInner, radius, cutoff) {\n    for(var i = 0; i < width * height; i++){\n        var d = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]);\n        alphaChannel[i] = Math.round(255 - 255 * (d / radius + cutoff));\n    }\n}\nTinySDF.prototype._draw = function(char, getMetrics) {\n    var textMetrics = this.ctx.measureText(char);\n    // Older browsers only expose the glyph width\n    // This is enough for basic layout with all glyphs using the same fixed size\n    var advance = textMetrics.width;\n    var doubleBuffer = 2 * this.buffer;\n    var width, glyphWidth, height, glyphHeight, top;\n    var imgTop, imgLeft, baselinePosition;\n    // If the browser supports bounding box metrics, we can generate a smaller\n    // SDF. This is a significant performance win.\n    if (getMetrics && this.useMetrics) {\n        // The integer/pixel part of the top alignment is encoded in metrics.top\n        // The remainder is implicitly encoded in the rasterization\n        top = Math.floor(textMetrics.actualBoundingBoxAscent);\n        baselinePosition = this.buffer + Math.ceil(textMetrics.actualBoundingBoxAscent);\n        imgTop = this.buffer;\n        imgLeft = this.buffer;\n        // If the glyph overflows the canvas size, it will be clipped at the\n        // bottom/right\n        glyphWidth = Math.min(this.size, Math.ceil(textMetrics.actualBoundingBoxRight - textMetrics.actualBoundingBoxLeft));\n        glyphHeight = Math.min(this.size - imgTop, Math.ceil(textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent));\n        width = glyphWidth + doubleBuffer;\n        height = glyphHeight + doubleBuffer;\n        this.ctx.textBaseline = \"alphabetic\";\n    } else {\n        width = glyphWidth = this.size;\n        height = glyphHeight = this.size;\n        // 19 points is an approximation of the \"cap height\" ascent from alphabetic\n        // baseline (even though actual drawing is from middle baseline, we can\n        // use the approximation because every glyph fills the em box)\n        top = 19 * this.fontSize / 24;\n        imgTop = imgLeft = 0;\n        baselinePosition = this.middle;\n        this.ctx.textBaseline = \"middle\";\n    }\n    var imgData;\n    if (glyphWidth && glyphHeight) {\n        this.ctx.clearRect(imgLeft, imgTop, glyphWidth, glyphHeight);\n        this.ctx.fillText(char, this.buffer, baselinePosition);\n        imgData = this.ctx.getImageData(imgLeft, imgTop, glyphWidth, glyphHeight);\n    }\n    var alphaChannel = new Uint8ClampedArray(width * height);\n    prepareGrids(imgData, width, height, glyphWidth, glyphHeight, this.gridOuter, this.gridInner);\n    edt(this.gridOuter, width, height, this.f, this.v, this.z);\n    edt(this.gridInner, width, height, this.f, this.v, this.z);\n    extractAlpha(alphaChannel, width, height, this.gridOuter, this.gridInner, this.radius, this.cutoff);\n    return {\n        data: alphaChannel,\n        metrics: {\n            width: glyphWidth,\n            height: glyphHeight,\n            sdfWidth: width,\n            sdfHeight: height,\n            top: top,\n            left: 0,\n            advance: advance\n        }\n    };\n};\nTinySDF.prototype.draw = function(char) {\n    return this._draw(char, false).data;\n};\nTinySDF.prototype.drawWithMetrics = function(char) {\n    return this._draw(char, true);\n};\n// 2D Euclidean squared distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf\nfunction edt(data, width, height, f, v, z) {\n    for(var x = 0; x < width; x++)edt1d(data, x, width, height, f, v, z);\n    for(var y = 0; y < height; y++)edt1d(data, y * width, 1, width, f, v, z);\n}\n// 1D squared distance transform\nfunction edt1d(grid, offset, stride, length, f, v, z) {\n    var q, k, s, r;\n    v[0] = 0;\n    z[0] = -INF;\n    z[1] = INF;\n    for(q = 0; q < length; q++)f[q] = grid[offset + q * stride];\n    for(q = 1, k = 0, s = 0; q < length; q++){\n        do {\n            r = v[k];\n            s = (f[q] - f[r] + q * q - r * r) / (q - r) / 2;\n        }while (s <= z[k] && --k > -1);\n        k++;\n        v[k] = q;\n        z[k] = s;\n        z[k + 1] = INF;\n    }\n    for(q = 0, k = 0; q < length; q++){\n        while(z[k + 1] < q)k++;\n        r = v[k];\n        grid[offset + q * stride] = f[r] + (q - r) * (q - r);\n    }\n}\n\n},{}],\"7AY30\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"nextPowOfTwo\", ()=>nextPowOfTwo);\nparcelHelpers.export(exports, \"buildMapping\", ()=>buildMapping);\nparcelHelpers.export(exports, \"autoWrapping\", ()=>autoWrapping);\nparcelHelpers.export(exports, \"transformParagraph\", ()=>transformParagraph);\nparcelHelpers.export(exports, \"getTextFromBuffer\", ()=>getTextFromBuffer);\nvar _core = require(\"@deck.gl/core\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n    var it;\n    if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n        if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n            if (it) o = it;\n            var i = 0;\n            var F = function F() {};\n            return {\n                s: F,\n                n: function n() {\n                    if (i >= o.length) return {\n                        done: true\n                    };\n                    return {\n                        done: false,\n                        value: o[i++]\n                    };\n                },\n                e: function e(_e) {\n                    throw _e;\n                },\n                f: F\n            };\n        }\n        throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var normalCompletion = true, didErr = false, err;\n    return {\n        s: function s() {\n            it = o[Symbol.iterator]();\n        },\n        n: function n() {\n            var step = it.next();\n            normalCompletion = step.done;\n            return step;\n        },\n        e: function e(_e2) {\n            didErr = true;\n            err = _e2;\n        },\n        f: function f() {\n            try {\n                if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n            } finally{\n                if (didErr) throw err;\n            }\n        }\n    };\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n    if (!o) return;\n    if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n    var n = Object.prototype.toString.call(o).slice(8, -1);\n    if (n === \"Object\" && o.constructor) n = o.constructor.name;\n    if (n === \"Map\" || n === \"Set\") return Array.from(o);\n    if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n    if (len == null || len > arr.length) len = arr.length;\n    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];\n    return arr2;\n}\nvar MISSING_CHAR_WIDTH = 32;\nfunction nextPowOfTwo(number) {\n    return Math.pow(2, Math.ceil(Math.log2(number)));\n}\nfunction buildMapping(_ref) {\n    var characterSet = _ref.characterSet, getFontWidth = _ref.getFontWidth, fontHeight = _ref.fontHeight, buffer = _ref.buffer, maxCanvasWidth = _ref.maxCanvasWidth, _ref$mapping = _ref.mapping, mapping = _ref$mapping === void 0 ? {} : _ref$mapping, _ref$xOffset = _ref.xOffset, xOffset = _ref$xOffset === void 0 ? 0 : _ref$xOffset, _ref$yOffset = _ref.yOffset, yOffset = _ref$yOffset === void 0 ? 0 : _ref$yOffset;\n    var row = 0;\n    var x = xOffset;\n    var i = 0;\n    var _iterator = _createForOfIteratorHelper(characterSet), _step;\n    try {\n        for(_iterator.s(); !(_step = _iterator.n()).done;){\n            var _char = _step.value;\n            if (!mapping[_char]) {\n                var width = getFontWidth(_char, i++);\n                if (x + width + buffer * 2 > maxCanvasWidth) {\n                    x = 0;\n                    row++;\n                }\n                mapping[_char] = {\n                    x: x + buffer,\n                    y: yOffset + row * (fontHeight + buffer * 2) + buffer,\n                    width: width,\n                    height: fontHeight\n                };\n                x += width + buffer * 2;\n            }\n        }\n    } catch (err) {\n        _iterator.e(err);\n    } finally{\n        _iterator.f();\n    }\n    var rowHeight = fontHeight + buffer * 2;\n    return {\n        mapping: mapping,\n        xOffset: x,\n        yOffset: yOffset + row * rowHeight,\n        canvasHeight: nextPowOfTwo(yOffset + (row + 1) * rowHeight)\n    };\n}\nfunction getTextWidth(text, mapping) {\n    var width = 0;\n    for(var i = 0; i < text.length; i++){\n        var character = text[i];\n        var frameWidth = null;\n        var frame = mapping && mapping[character];\n        if (frame) frameWidth = frame.width;\n        width += frameWidth;\n    }\n    return width;\n}\nfunction breakAll(text, maxWidth, iconMapping) {\n    var rows = [];\n    var rowStartCharIndex = 0;\n    var rowOffsetLeft = 0;\n    for(var i = 0; i < text.length; i++){\n        var textWidth = getTextWidth(text[i], iconMapping);\n        if (rowOffsetLeft + textWidth > maxWidth) {\n            if (rowStartCharIndex < i) rows.push(text.substring(rowStartCharIndex, i));\n            rowStartCharIndex = i;\n            rowOffsetLeft = 0;\n        }\n        rowOffsetLeft += textWidth;\n    }\n    if (rowStartCharIndex < text.length) rows.push(text.substring(rowStartCharIndex));\n    return {\n        rows: rows,\n        lastRowStartCharIndex: rowStartCharIndex,\n        lastRowOffsetLeft: rowOffsetLeft\n    };\n}\nfunction breakWord(text, maxWidth, iconMapping) {\n    var rows = [];\n    var rowStartCharIndex = 0;\n    var groupStartCharIndex = 0;\n    var rowOffsetLeft = 0;\n    var group = null;\n    for(var i = 0; i < text.length; i++){\n        if (text[i] === \" \") {\n            group = text[i];\n            groupStartCharIndex = i + 1;\n        } else if (i + 1 < text.length && text[i + 1] === \" \" || i + 1 === text.length) {\n            group = text.substring(groupStartCharIndex, i + 1);\n            groupStartCharIndex = i + 1;\n        } else group = null;\n        if (group) {\n            var groupWidth = getTextWidth(group, iconMapping);\n            if (rowOffsetLeft + groupWidth > maxWidth) {\n                var lastGroupStartIndex = groupStartCharIndex - group.length;\n                if (rowStartCharIndex < lastGroupStartIndex) {\n                    rows.push(text.substring(rowStartCharIndex, lastGroupStartIndex));\n                    rowStartCharIndex = lastGroupStartIndex;\n                    rowOffsetLeft = 0;\n                }\n                if (groupWidth > maxWidth) {\n                    var subGroups = breakAll(group, maxWidth, iconMapping);\n                    if (subGroups.rows.length > 1) rows = rows.concat(subGroups.rows.slice(0, subGroups.rows.length - 1));\n                    rowStartCharIndex = rowStartCharIndex + subGroups.lastRowStartCharIndex;\n                    groupWidth = subGroups.lastRowOffsetLeft;\n                }\n            }\n            rowOffsetLeft += groupWidth;\n        }\n    }\n    if (rowStartCharIndex < text.length) rows.push(text.substring(rowStartCharIndex));\n    return {\n        rows: rows,\n        lastRowStartCharIndex: rowStartCharIndex,\n        lastRowOffsetLeft: rowOffsetLeft\n    };\n}\nfunction autoWrapping(text, wordBreak, maxWidth, iconMapping) {\n    if (wordBreak === \"break-all\") return breakAll(text, maxWidth, iconMapping);\n    return breakWord(text, maxWidth, iconMapping);\n}\nfunction transformRow(row, iconMapping) {\n    var x = 0;\n    var rowHeight = 0;\n    var leftOffsets = new Array(row.length);\n    for(var i = 0; i < row.length; i++){\n        var character = row[i];\n        var frame = iconMapping[character];\n        if (frame) {\n            if (!rowHeight) rowHeight = frame.height;\n            leftOffsets[i] = x + frame.width / 2;\n            x += frame.width;\n        } else {\n            (0, _core.log).warn(\"Missing character: \".concat(character))();\n            leftOffsets[i] = x;\n            x += MISSING_CHAR_WIDTH;\n        }\n    }\n    return {\n        leftOffsets: leftOffsets,\n        rowWidth: x,\n        rowHeight: rowHeight\n    };\n}\nfunction transformParagraph(paragraph, lineHeight, wordBreak, maxWidth, iconMapping) {\n    var result = new Array(paragraph.length);\n    var autoWrappingEnabled = (wordBreak === \"break-word\" || wordBreak === \"break-all\") && isFinite(maxWidth) && maxWidth > 0;\n    var size = [\n        0,\n        0\n    ];\n    var rowOffsetTop = 0;\n    var lineStartIndex = 0;\n    for(var i = 0; i <= paragraph.length; i++){\n        var _char2 = paragraph[i];\n        var line = void 0;\n        if (_char2 === \"\\n\" || _char2 === undefined) line = paragraph.slice(lineStartIndex, i);\n        if (line) {\n            var rows = autoWrappingEnabled ? autoWrapping(line, wordBreak, maxWidth, iconMapping).rows : [\n                line\n            ];\n            var _iterator2 = _createForOfIteratorHelper(rows), _step2;\n            try {\n                for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){\n                    var row = _step2.value;\n                    var _transformRow = transformRow(row, iconMapping, lineHeight), rowWidth = _transformRow.rowWidth, rowHeight = _transformRow.rowHeight, leftOffsets = _transformRow.leftOffsets;\n                    var _iterator3 = _createForOfIteratorHelper(leftOffsets), _step3;\n                    try {\n                        for(_iterator3.s(); !(_step3 = _iterator3.n()).done;){\n                            var x = _step3.value;\n                            result[lineStartIndex++] = {\n                                x: x,\n                                y: rowOffsetTop + rowHeight / 2,\n                                rowWidth: rowWidth\n                            };\n                        }\n                    } catch (err) {\n                        _iterator3.e(err);\n                    } finally{\n                        _iterator3.f();\n                    }\n                    rowOffsetTop = rowOffsetTop + rowHeight * lineHeight;\n                    size[0] = autoWrappingEnabled ? maxWidth : Math.max(size[0], rowWidth);\n                }\n            } catch (err) {\n                _iterator2.e(err);\n            } finally{\n                _iterator2.f();\n            }\n        }\n        if (_char2 === \"\\n\") result[lineStartIndex++] = {\n            x: 0,\n            y: 0,\n            rowWidth: 0\n        };\n    }\n    size[1] = rowOffsetTop;\n    return {\n        characters: result,\n        size: size\n    };\n}\nfunction getTextFromBuffer(_ref2) {\n    var value = _ref2.value, length = _ref2.length, stride = _ref2.stride, offset = _ref2.offset, startIndices = _ref2.startIndices;\n    var bytesPerElement = value.BYTES_PER_ELEMENT;\n    var elementStride = stride ? stride / bytesPerElement : 1;\n    var elementOffset = offset ? offset / bytesPerElement : 0;\n    var characterCount = startIndices[length] || Math.floor((value.length - elementOffset - bytesPerElement) / elementStride) + 1;\n    var texts = new Array(length);\n    var codes = value;\n    if (elementStride > 1 || elementOffset > 0) {\n        codes = new value.constructor(characterCount);\n        for(var i = 0; i < characterCount; i++)codes[i] = value[i * elementStride + elementOffset];\n    }\n    for(var index = 0; index < length; index++){\n        var startIndex = startIndices[index];\n        var endIndex = startIndices[index + 1] || characterCount;\n        texts[index] = String.fromCodePoint.apply(null, codes.subarray(startIndex, endIndex));\n    }\n    return {\n        texts: texts,\n        characterCount: characterCount\n    };\n}\n\n},{\"@deck.gl/core\":\"lTaaR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h5HMT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"default\", ()=>LRUCache);\nvar _classCallCheck = require(\"@babel/runtime/helpers/esm/classCallCheck\");\nvar _classCallCheckDefault = parcelHelpers.interopDefault(_classCallCheck);\nvar _createClass = require(\"@babel/runtime/helpers/esm/createClass\");\nvar _createClassDefault = parcelHelpers.interopDefault(_createClass);\nvar LRUCache = function() {\n    function LRUCache1() {\n        var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5;\n        (0, _classCallCheckDefault.default)(this, LRUCache1);\n        this.limit = limit;\n        this.clear();\n    }\n    (0, _createClassDefault.default)(LRUCache1, [\n        {\n            key: \"clear\",\n            value: function clear() {\n                this._cache = {};\n                this._order = [];\n            }\n        },\n        {\n            key: \"get\",\n            value: function get(key) {\n                var value = this._cache[key];\n                if (value) {\n                    this._deleteOrder(key);\n                    this._appendOrder(key);\n                }\n                return value;\n            }\n        },\n        {\n            key: \"set\",\n            value: function set(key, value) {\n                if (!this._cache[key]) {\n                    if (Object.keys(this._cache).length === this.limit) this[\"delete\"](this._order[0]);\n                    this._cache[key] = value;\n                    this._appendOrder(key);\n                } else {\n                    this[\"delete\"](key);\n                    this._cache[key] = value;\n                    this._appendOrder(key);\n                }\n            }\n        },\n        {\n            key: \"delete\",\n            value: function _delete(key) {\n                var value = this._cache[key];\n                if (value) {\n                    this._deleteCache(key);\n                    this._deleteOrder(key);\n                }\n            }\n        },\n        {\n            key: \"_deleteCache\",\n            value: function _deleteCache(key) {\n                delete this._cache[key];\n            }\n        },\n        {\n            key: \"_deleteOrder\",\n            value: function _deleteOrder(key) {\n                var index = this._order.findIndex(function(o) {\n                    return o === key;\n                });\n                if (index >= 0) this._order.splice(index, 1);\n            }\n        },\n        {\n            key: \"_appendOrder\",\n            value: function _appendOrder(key) {\n                this._order.push(key);\n            }\n        }\n    ]);\n    return LRUCache1;\n}();\n\n},{\"@babel/runtime/helpers/esm/classCallCheck\":\"cQI2E\",\"@babel/runtime/helpers/esm/createClass\":\"3n6fc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2BRQe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Dataflow\", ()=>(0, _vegaDataflow.Dataflow));\nparcelHelpers.export(exports, \"EventStream\", ()=>(0, _vegaDataflow.EventStream));\nparcelHelpers.export(exports, \"MultiPulse\", ()=>(0, _vegaDataflow.MultiPulse));\nparcelHelpers.export(exports, \"Operator\", ()=>(0, _vegaDataflow.Operator));\nparcelHelpers.export(exports, \"Parameters\", ()=>(0, _vegaDataflow.Parameters));\nparcelHelpers.export(exports, \"Pulse\", ()=>(0, _vegaDataflow.Pulse));\nparcelHelpers.export(exports, \"Transform\", ()=>(0, _vegaDataflow.Transform));\nparcelHelpers.export(exports, \"changeset\", ()=>(0, _vegaDataflow.changeset));\nparcelHelpers.export(exports, \"definition\", ()=>(0, _vegaDataflow.definition));\nparcelHelpers.export(exports, \"ingest\", ()=>(0, _vegaDataflow.ingest));\nparcelHelpers.export(exports, \"isTuple\", ()=>(0, _vegaDataflow.isTuple));\nparcelHelpers.export(exports, \"transform\", ()=>(0, _vegaDataflow.transform));\nparcelHelpers.export(exports, \"transforms\", ()=>(0, _vegaDataflow.transforms));\nparcelHelpers.export(exports, \"tupleid\", ()=>(0, _vegaDataflow.tupleid));\nparcelHelpers.export(exports, \"interpolate\", ()=>(0, _vegaScale.interpolate));\nparcelHelpers.export(exports, \"interpolateColors\", ()=>(0, _vegaScale.interpolateColors));\nparcelHelpers.export(exports, \"interpolateRange\", ()=>(0, _vegaScale.interpolateRange));\nparcelHelpers.export(exports, \"quantizeInterpolator\", ()=>(0, _vegaScale.quantizeInterpolator));\nparcelHelpers.export(exports, \"scale\", ()=>(0, _vegaScale.scale));\nparcelHelpers.export(exports, \"scheme\", ()=>(0, _vegaScale.scheme));\nparcelHelpers.export(exports, \"projection\", ()=>(0, _vegaProjection.projection));\nparcelHelpers.export(exports, \"View\", ()=>(0, _vegaView.View));\nparcelHelpers.export(exports, \"defaultLocale\", ()=>(0, _vegaFormat.defaultLocale));\nparcelHelpers.export(exports, \"formatLocale\", ()=>(0, _vegaFormat.numberFormatDefaultLocale));\nparcelHelpers.export(exports, \"locale\", ()=>(0, _vegaFormat.locale));\nparcelHelpers.export(exports, \"resetDefaultLocale\", ()=>(0, _vegaFormat.resetDefaultLocale));\nparcelHelpers.export(exports, \"timeFormatLocale\", ()=>(0, _vegaFormat.timeFormatDefaultLocale));\nparcelHelpers.export(exports, \"expressionFunction\", ()=>(0, _vegaFunctions.expressionFunction));\nparcelHelpers.export(exports, \"parse\", ()=>(0, _vegaParser.parse));\nparcelHelpers.export(exports, \"runtimeContext\", ()=>(0, _vegaRuntime.context));\nparcelHelpers.export(exports, \"codegenExpression\", ()=>(0, _vegaExpression.codegen));\nparcelHelpers.export(exports, \"parseExpression\", ()=>(0, _vegaExpression.parse));\nparcelHelpers.export(exports, \"parseSelector\", ()=>(0, _vegaEventSelector.selector));\nparcelHelpers.export(exports, \"version\", ()=>version);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaTransforms = require(\"vega-transforms\");\nvar _vegaViewTransforms = require(\"vega-view-transforms\");\nvar _vegaEncode = require(\"vega-encode\");\nvar _vegaGeo = require(\"vega-geo\");\nvar _vegaForce = require(\"vega-force\");\nvar _vegaHierarchy = require(\"vega-hierarchy\");\nvar _vegaLabel = require(\"vega-label\");\nvar _vegaRegression = require(\"vega-regression\");\nvar _vegaVoronoi = require(\"vega-voronoi\");\nvar _vegaWordcloud = require(\"vega-wordcloud\");\nvar _vegaCrossfilter = require(\"vega-crossfilter\");\nparcelHelpers.exportAll(_vegaUtil, exports);\nvar _vegaStatistics = require(\"vega-statistics\");\nparcelHelpers.exportAll(_vegaStatistics, exports);\nvar _vegaTime = require(\"vega-time\");\nparcelHelpers.exportAll(_vegaTime, exports);\nvar _vegaLoader = require(\"vega-loader\");\nparcelHelpers.exportAll(_vegaLoader, exports);\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nparcelHelpers.exportAll(_vegaScenegraph, exports);\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaProjection = require(\"vega-projection\");\nvar _vegaView = require(\"vega-view\");\nvar _vegaFormat = require(\"vega-format\");\nvar _vegaFunctions = require(\"vega-functions\");\nvar _vegaParser = require(\"vega-parser\");\nvar _vegaRuntime = require(\"vega-runtime\");\nvar _vegaExpression = require(\"vega-expression\");\nvar _vegaEventSelector = require(\"vega-event-selector\");\nvar name = \"vega\";\nvar version$1 = \"5.20.2\";\nvar description = \"The Vega visualization grammar.\";\nvar keywords = [\n    \"vega\",\n    \"visualization\",\n    \"interaction\",\n    \"dataflow\",\n    \"library\",\n    \"data\",\n    \"d3\"\n];\nvar license = \"BSD-3-Clause\";\nvar author = \"UW Interactive Data Lab (http://idl.cs.washington.edu)\";\nvar main = \"build/vega-node.js\";\nvar module = \"build/vega.module.js\";\nvar unpkg = \"build/vega.min.js\";\nvar jsdelivr = \"build/vega.min.js\";\nvar types = \"index.d.ts\";\nvar repository = \"vega/vega\";\nvar scripts = {\n    bundle: \"rollup -c --config-bundle\",\n    prebuild: \"rimraf build && rimraf build-es5\",\n    build: \"rollup -c --config-core --config-bundle --config-ie\",\n    postbuild: \"node schema-copy\",\n    pretest: \"yarn build --config-test\",\n    test: \"TZ=America/Los_Angeles tape 'test/**/*-test.js'\",\n    prepublishOnly: \"yarn test && yarn build\",\n    postpublish: \"./schema-deploy.sh\"\n};\nvar dependencies = {\n    \"vega-crossfilter\": \"~4.0.5\",\n    \"vega-dataflow\": \"~5.7.4\",\n    \"vega-encode\": \"~4.8.3\",\n    \"vega-event-selector\": \"~2.0.6\",\n    \"vega-expression\": \"~4.0.1\",\n    \"vega-force\": \"~4.0.7\",\n    \"vega-format\": \"~1.0.4\",\n    \"vega-functions\": \"~5.12.0\",\n    \"vega-geo\": \"~4.3.8\",\n    \"vega-hierarchy\": \"~4.0.9\",\n    \"vega-label\": \"~1.0.0\",\n    \"vega-loader\": \"~4.4.0\",\n    \"vega-parser\": \"~6.1.3\",\n    \"vega-projection\": \"~1.4.5\",\n    \"vega-regression\": \"~1.0.9\",\n    \"vega-runtime\": \"~6.1.3\",\n    \"vega-scale\": \"~7.1.1\",\n    \"vega-scenegraph\": \"~4.9.4\",\n    \"vega-statistics\": \"~1.7.9\",\n    \"vega-time\": \"~2.0.4\",\n    \"vega-transforms\": \"~4.9.4\",\n    \"vega-typings\": \"~0.21.0\",\n    \"vega-util\": \"~1.16.1\",\n    \"vega-view\": \"~5.10.1\",\n    \"vega-view-transforms\": \"~4.5.8\",\n    \"vega-voronoi\": \"~4.1.5\",\n    \"vega-wordcloud\": \"~4.1.3\"\n};\nvar devDependencies = {\n    \"vega-schema\": \"*\"\n};\nvar gitHead = \"e251dbc61ab6645689d9f349e7dd9d15ddb85bce\";\nvar pkg = {\n    name: name,\n    version: version$1,\n    description: description,\n    keywords: keywords,\n    license: license,\n    author: author,\n    main: main,\n    module: module,\n    unpkg: unpkg,\n    jsdelivr: jsdelivr,\n    types: types,\n    repository: repository,\n    scripts: scripts,\n    dependencies: dependencies,\n    devDependencies: devDependencies,\n    gitHead: gitHead\n};\n// -- Transforms -----\n(0, _vegaUtil.extend)((0, _vegaDataflow.transforms), _vegaTransforms, _vegaViewTransforms, _vegaEncode, _vegaGeo, _vegaForce, _vegaLabel, _vegaHierarchy, _vegaRegression, _vegaVoronoi, _vegaWordcloud, _vegaCrossfilter); // -- Exports -----\nconst version = pkg.version;\n\n},{\"vega-util\":\"bApja\",\"vega-dataflow\":\"3NitK\",\"vega-transforms\":\"gA9mK\",\"vega-view-transforms\":\"i63Ad\",\"vega-encode\":\"fpesP\",\"vega-geo\":\"3rF9B\",\"vega-force\":\"4JCry\",\"vega-hierarchy\":\"lserr\",\"vega-label\":\"lZyUZ\",\"vega-regression\":\"elv3U\",\"vega-voronoi\":\"96rkJ\",\"vega-wordcloud\":\"7Z7Aq\",\"vega-crossfilter\":\"8iEZv\",\"vega-statistics\":\"5ncfv\",\"vega-time\":\"27kpp\",\"vega-loader\":\"gmbOr\",\"vega-scenegraph\":\"jattk\",\"vega-scale\":\"bEydG\",\"vega-projection\":\"4wv4C\",\"vega-view\":\"cGC2i\",\"vega-format\":\"47kOt\",\"vega-functions\":\"iuqsd\",\"vega-parser\":\"hsy9Z\",\"vega-runtime\":\"k7ppL\",\"vega-expression\":\"2l1no\",\"vega-event-selector\":\"gXMNx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bApja\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Debug\", ()=>Debug);\nparcelHelpers.export(exports, \"Error\", ()=>Error$1);\nparcelHelpers.export(exports, \"Info\", ()=>Info);\nparcelHelpers.export(exports, \"None\", ()=>None);\nparcelHelpers.export(exports, \"Warn\", ()=>Warn);\nparcelHelpers.export(exports, \"accessor\", ()=>accessor);\nparcelHelpers.export(exports, \"accessorFields\", ()=>accessorFields);\nparcelHelpers.export(exports, \"accessorName\", ()=>accessorName);\nparcelHelpers.export(exports, \"array\", ()=>array);\nparcelHelpers.export(exports, \"ascending\", ()=>ascending);\nparcelHelpers.export(exports, \"clampRange\", ()=>clampRange);\nparcelHelpers.export(exports, \"compare\", ()=>compare);\nparcelHelpers.export(exports, \"constant\", ()=>constant);\nparcelHelpers.export(exports, \"debounce\", ()=>debounce);\nparcelHelpers.export(exports, \"error\", ()=>error);\nparcelHelpers.export(exports, \"extend\", ()=>extend);\nparcelHelpers.export(exports, \"extent\", ()=>extent);\nparcelHelpers.export(exports, \"extentIndex\", ()=>extentIndex);\nparcelHelpers.export(exports, \"falsy\", ()=>falsy);\nparcelHelpers.export(exports, \"fastmap\", ()=>fastmap);\nparcelHelpers.export(exports, \"field\", ()=>field);\nparcelHelpers.export(exports, \"flush\", ()=>flush);\nparcelHelpers.export(exports, \"hasOwnProperty\", ()=>has);\nparcelHelpers.export(exports, \"id\", ()=>id);\nparcelHelpers.export(exports, \"identity\", ()=>identity);\nparcelHelpers.export(exports, \"inherits\", ()=>inherits);\nparcelHelpers.export(exports, \"inrange\", ()=>inrange);\nparcelHelpers.export(exports, \"isArray\", ()=>isArray);\nparcelHelpers.export(exports, \"isBoolean\", ()=>isBoolean);\nparcelHelpers.export(exports, \"isDate\", ()=>isDate);\nparcelHelpers.export(exports, \"isFunction\", ()=>isFunction);\nparcelHelpers.export(exports, \"isIterable\", ()=>isIterable);\nparcelHelpers.export(exports, \"isNumber\", ()=>isNumber);\nparcelHelpers.export(exports, \"isObject\", ()=>isObject);\nparcelHelpers.export(exports, \"isRegExp\", ()=>isRegExp);\nparcelHelpers.export(exports, \"isString\", ()=>isString);\nparcelHelpers.export(exports, \"key\", ()=>key);\nparcelHelpers.export(exports, \"lerp\", ()=>lerp);\nparcelHelpers.export(exports, \"logger\", ()=>logger);\nparcelHelpers.export(exports, \"lruCache\", ()=>lruCache);\nparcelHelpers.export(exports, \"merge\", ()=>merge);\nparcelHelpers.export(exports, \"mergeConfig\", ()=>mergeConfig);\nparcelHelpers.export(exports, \"one\", ()=>one);\nparcelHelpers.export(exports, \"pad\", ()=>pad);\nparcelHelpers.export(exports, \"panLinear\", ()=>panLinear);\nparcelHelpers.export(exports, \"panLog\", ()=>panLog);\nparcelHelpers.export(exports, \"panPow\", ()=>panPow);\nparcelHelpers.export(exports, \"panSymlog\", ()=>panSymlog);\nparcelHelpers.export(exports, \"peek\", ()=>peek);\nparcelHelpers.export(exports, \"quarter\", ()=>quarter);\nparcelHelpers.export(exports, \"repeat\", ()=>repeat);\nparcelHelpers.export(exports, \"span\", ()=>span);\nparcelHelpers.export(exports, \"splitAccessPath\", ()=>splitAccessPath);\nparcelHelpers.export(exports, \"stringValue\", ()=>$);\nparcelHelpers.export(exports, \"toBoolean\", ()=>toBoolean);\nparcelHelpers.export(exports, \"toDate\", ()=>toDate);\nparcelHelpers.export(exports, \"toNumber\", ()=>toNumber);\nparcelHelpers.export(exports, \"toSet\", ()=>toSet);\nparcelHelpers.export(exports, \"toString\", ()=>toString);\nparcelHelpers.export(exports, \"truncate\", ()=>truncate);\nparcelHelpers.export(exports, \"truthy\", ()=>truthy);\nparcelHelpers.export(exports, \"utcquarter\", ()=>utcquarter);\nparcelHelpers.export(exports, \"visitArray\", ()=>visitArray);\nparcelHelpers.export(exports, \"writeConfig\", ()=>writeConfig);\nparcelHelpers.export(exports, \"zero\", ()=>zero);\nparcelHelpers.export(exports, \"zoomLinear\", ()=>zoomLinear);\nparcelHelpers.export(exports, \"zoomLog\", ()=>zoomLog);\nparcelHelpers.export(exports, \"zoomPow\", ()=>zoomPow);\nparcelHelpers.export(exports, \"zoomSymlog\", ()=>zoomSymlog);\nfunction accessor(fn, fields, name) {\n    fn.fields = fields || [];\n    fn.fname = name;\n    return fn;\n}\nfunction accessorName(fn) {\n    return fn == null ? null : fn.fname;\n}\nfunction accessorFields(fn) {\n    return fn == null ? null : fn.fields;\n}\nfunction getter(path) {\n    return path.length === 1 ? get1(path[0]) : getN(path);\n}\nconst get1 = (field1)=>function(obj) {\n        return obj[field1];\n    };\nconst getN = (path)=>{\n    const len = path.length;\n    return function(obj) {\n        for(let i = 0; i < len; ++i)obj = obj[path[i]];\n        return obj;\n    };\n};\nfunction error(message) {\n    throw Error(message);\n}\nfunction splitAccessPath(p) {\n    const path = [], n = p.length;\n    let q = null, b = 0, s = \"\", i, j, c;\n    p = p + \"\";\n    function push() {\n        path.push(s + p.substring(i, j));\n        s = \"\";\n        i = j + 1;\n    }\n    for(i = j = 0; j < n; ++j){\n        c = p[j];\n        if (c === \"\\\\\") {\n            s += p.substring(i, j);\n            s += p.substring(++j, ++j);\n            i = j;\n        } else if (c === q) {\n            push();\n            q = null;\n            b = -1;\n        } else if (q) continue;\n        else if (i === b && c === '\"') {\n            i = j + 1;\n            q = c;\n        } else if (i === b && c === \"'\") {\n            i = j + 1;\n            q = c;\n        } else if (c === \".\" && !b) {\n            if (j > i) push();\n            else i = j + 1;\n        } else if (c === \"[\") {\n            if (j > i) push();\n            b = i = j + 1;\n        } else if (c === \"]\") {\n            if (!b) error(\"Access path missing open bracket: \" + p);\n            if (b > 0) push();\n            b = 0;\n            i = j + 1;\n        }\n    }\n    if (b) error(\"Access path missing closing bracket: \" + p);\n    if (q) error(\"Access path missing closing quote: \" + p);\n    if (j > i) {\n        j++;\n        push();\n    }\n    return path;\n}\nfunction field(field2, name, opt) {\n    const path = splitAccessPath(field2);\n    field2 = path.length === 1 ? path[0] : field2;\n    return accessor((opt && opt.get || getter)(path), [\n        field2\n    ], name || field2);\n}\nconst id = field(\"id\");\nconst identity = accessor((_)=>_, [], \"identity\");\nconst zero = accessor(()=>0, [], \"zero\");\nconst one = accessor(()=>1, [], \"one\");\nconst truthy = accessor(()=>true, [], \"true\");\nconst falsy = accessor(()=>false, [], \"false\");\nfunction log$1(method, level, input) {\n    const args = [\n        level\n    ].concat([].slice.call(input));\n    console[method].apply(console, args); // eslint-disable-line no-console\n}\nconst None = 0;\nconst Error$1 = 1;\nconst Warn = 2;\nconst Info = 3;\nconst Debug = 4;\nfunction logger(_1, method) {\n    let level = _1 || None;\n    return {\n        level (_) {\n            if (arguments.length) {\n                level = +_;\n                return this;\n            } else return level;\n        },\n        error () {\n            if (level >= Error$1) log$1(method || \"error\", \"ERROR\", arguments);\n            return this;\n        },\n        warn () {\n            if (level >= Warn) log$1(method || \"warn\", \"WARN\", arguments);\n            return this;\n        },\n        info () {\n            if (level >= Info) log$1(method || \"log\", \"INFO\", arguments);\n            return this;\n        },\n        debug () {\n            if (level >= Debug) log$1(method || \"log\", \"DEBUG\", arguments);\n            return this;\n        }\n    };\n}\nvar isArray = Array.isArray;\nfunction isObject(_) {\n    return _ === Object(_);\n}\nconst isLegalKey = (key1)=>key1 !== \"__proto__\";\nfunction mergeConfig(...configs) {\n    return configs.reduce((out, source)=>{\n        for(const key2 in source)if (key2 === \"signals\") // for signals, we merge the signals arrays\n        // source signals take precedence over\n        // existing signals with the same name\n        out.signals = mergeNamed(out.signals, source.signals);\n        else {\n            // otherwise, merge objects subject to recursion constraints\n            // for legend block, recurse for the layout entry only\n            // for style block, recurse for all properties\n            // otherwise, no recursion: objects overwrite, no merging\n            const r = key2 === \"legend\" ? {\n                layout: 1\n            } : key2 === \"style\" ? true : null;\n            writeConfig(out, key2, source[key2], r);\n        }\n        return out;\n    }, {});\n}\nfunction writeConfig(output, key3, value, recurse) {\n    if (!isLegalKey(key3)) return;\n    let k, o;\n    if (isObject(value) && !isArray(value)) {\n        o = isObject(output[key3]) ? output[key3] : output[key3] = {};\n        for(k in value){\n            if (recurse && (recurse === true || recurse[k])) writeConfig(o, k, value[k]);\n            else if (isLegalKey(k)) o[k] = value[k];\n        }\n    } else output[key3] = value;\n}\nfunction mergeNamed(a, b) {\n    if (a == null) return b;\n    const map = {}, out = [];\n    function add(_) {\n        if (!map[_.name]) {\n            map[_.name] = 1;\n            out.push(_);\n        }\n    }\n    b.forEach(add);\n    a.forEach(add);\n    return out;\n}\nfunction peek(array1) {\n    return array1[array1.length - 1];\n}\nfunction toNumber(_) {\n    return _ == null || _ === \"\" ? null : +_;\n}\nconst exp = (sign)=>(x)=>sign * Math.exp(x);\nconst log = (sign)=>(x)=>Math.log(sign * x);\nconst symlog = (c)=>(x)=>Math.sign(x) * Math.log1p(Math.abs(x / c));\nconst symexp = (c)=>(x)=>Math.sign(x) * Math.expm1(Math.abs(x)) * c;\nconst pow = (exponent)=>(x)=>x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\nfunction pan(domain, delta, lift, ground) {\n    const d0 = lift(domain[0]), d1 = lift(peek(domain)), dd = (d1 - d0) * delta;\n    return [\n        ground(d0 - dd),\n        ground(d1 - dd)\n    ];\n}\nfunction panLinear(domain, delta) {\n    return pan(domain, delta, toNumber, identity);\n}\nfunction panLog(domain, delta) {\n    var sign = Math.sign(domain[0]);\n    return pan(domain, delta, log(sign), exp(sign));\n}\nfunction panPow(domain, delta, exponent) {\n    return pan(domain, delta, pow(exponent), pow(1 / exponent));\n}\nfunction panSymlog(domain, delta, constant1) {\n    return pan(domain, delta, symlog(constant1), symexp(constant1));\n}\nfunction zoom(domain, anchor, scale, lift, ground) {\n    const d0 = lift(domain[0]), d1 = lift(peek(domain)), da = anchor != null ? lift(anchor) : (d0 + d1) / 2;\n    return [\n        ground(da + (d0 - da) * scale),\n        ground(da + (d1 - da) * scale)\n    ];\n}\nfunction zoomLinear(domain, anchor, scale) {\n    return zoom(domain, anchor, scale, toNumber, identity);\n}\nfunction zoomLog(domain, anchor, scale) {\n    const sign = Math.sign(domain[0]);\n    return zoom(domain, anchor, scale, log(sign), exp(sign));\n}\nfunction zoomPow(domain, anchor, scale, exponent) {\n    return zoom(domain, anchor, scale, pow(exponent), pow(1 / exponent));\n}\nfunction zoomSymlog(domain, anchor, scale, constant2) {\n    return zoom(domain, anchor, scale, symlog(constant2), symexp(constant2));\n}\nfunction quarter(date) {\n    return 1 + ~~(new Date(date).getMonth() / 3);\n}\nfunction utcquarter(date) {\n    return 1 + ~~(new Date(date).getUTCMonth() / 3);\n}\nfunction array(_) {\n    return _ != null ? isArray(_) ? _ : [\n        _\n    ] : [];\n}\n/**\n * Span-preserving range clamp. If the span of the input range is less\n * than (max - min) and an endpoint exceeds either the min or max value,\n * the range is translated such that the span is preserved and one\n * endpoint touches the boundary of the min/max range.\n * If the span exceeds (max - min), the range [min, max] is returned.\n */ function clampRange(range, min, max) {\n    let lo = range[0], hi = range[1], span1;\n    if (hi < lo) {\n        span1 = hi;\n        hi = lo;\n        lo = span1;\n    }\n    span1 = hi - lo;\n    return span1 >= max - min ? [\n        min,\n        max\n    ] : [\n        lo = Math.min(Math.max(lo, min), max - span1),\n        lo + span1\n    ];\n}\nfunction isFunction(_) {\n    return typeof _ === \"function\";\n}\nconst DESCENDING = \"descending\";\nfunction compare(fields, orders, opt) {\n    opt = opt || {};\n    orders = array(orders) || [];\n    const ord = [], get = [], fmap = {}, gen = opt.comparator || comparator;\n    array(fields).forEach((f, i)=>{\n        if (f == null) return;\n        ord.push(orders[i] === DESCENDING ? -1 : 1);\n        get.push(f = isFunction(f) ? f : field(f, null, opt));\n        (accessorFields(f) || []).forEach((_)=>fmap[_] = 1);\n    });\n    return get.length === 0 ? null : accessor(gen(get, ord), Object.keys(fmap));\n}\nconst ascending = (u, v)=>(u < v || u == null) && v != null ? -1 : (u > v || v == null) && u != null ? 1 : (v = v instanceof Date ? +v : v, u = u instanceof Date ? +u : u) !== u && v === v ? -1 : v !== v && u === u ? 1 : 0;\nconst comparator = (fields, orders)=>fields.length === 1 ? compare1(fields[0], orders[0]) : compareN(fields, orders, fields.length);\nconst compare1 = (field3, order)=>function(a, b) {\n        return ascending(field3(a), field3(b)) * order;\n    };\nconst compareN = (fields, orders, n)=>{\n    orders.push(0); // pad zero for convenient lookup\n    return function(a, b) {\n        let f, c = 0, i = -1;\n        while(c === 0 && ++i < n){\n            f = fields[i];\n            c = ascending(f(a), f(b));\n        }\n        return c * orders[i];\n    };\n};\nfunction constant(_) {\n    return isFunction(_) ? _ : ()=>_;\n}\nfunction debounce(delay, handler) {\n    let tid;\n    return (e)=>{\n        if (tid) clearTimeout(tid);\n        tid = setTimeout(()=>(handler(e), tid = null), delay);\n    };\n}\nfunction extend(_) {\n    for(let x, k, i = 1, len = arguments.length; i < len; ++i){\n        x = arguments[i];\n        for(k in x)_[k] = x[k];\n    }\n    return _;\n}\n/**\n * Return an array with minimum and maximum values, in the\n * form [min, max]. Ignores null, undefined, and NaN values.\n */ function extent(array2, f) {\n    let i = 0, n, v, min, max;\n    if (array2 && (n = array2.length)) {\n        if (f == null) {\n            // find first valid value\n            for(v = array2[i]; i < n && (v == null || v !== v); v = array2[++i]);\n            min = max = v; // visit all other values\n            for(; i < n; ++i){\n                v = array2[i]; // skip null/undefined; NaN will fail all comparisons\n                if (v != null) {\n                    if (v < min) min = v;\n                    if (v > max) max = v;\n                }\n            }\n        } else {\n            // find first valid value\n            for(v = f(array2[i]); i < n && (v == null || v !== v); v = f(array2[++i]));\n            min = max = v; // visit all other values\n            for(; i < n; ++i){\n                v = f(array2[i]); // skip null/undefined; NaN will fail all comparisons\n                if (v != null) {\n                    if (v < min) min = v;\n                    if (v > max) max = v;\n                }\n            }\n        }\n    }\n    return [\n        min,\n        max\n    ];\n}\nfunction extentIndex(array3, f) {\n    const n = array3.length;\n    let i = -1, a, b, c, u, v;\n    if (f == null) {\n        while(++i < n){\n            b = array3[i];\n            if (b != null && b >= b) {\n                a = c = b;\n                break;\n            }\n        }\n        if (i === n) return [\n            -1,\n            -1\n        ];\n        u = v = i;\n        while(++i < n){\n            b = array3[i];\n            if (b != null) {\n                if (a > b) {\n                    a = b;\n                    u = i;\n                }\n                if (c < b) {\n                    c = b;\n                    v = i;\n                }\n            }\n        }\n    } else {\n        while(++i < n){\n            b = f(array3[i], i, array3);\n            if (b != null && b >= b) {\n                a = c = b;\n                break;\n            }\n        }\n        if (i === n) return [\n            -1,\n            -1\n        ];\n        u = v = i;\n        while(++i < n){\n            b = f(array3[i], i, array3);\n            if (b != null) {\n                if (a > b) {\n                    a = b;\n                    u = i;\n                }\n                if (c < b) {\n                    c = b;\n                    v = i;\n                }\n            }\n        }\n    }\n    return [\n        u,\n        v\n    ];\n}\nconst hop = Object.prototype.hasOwnProperty;\nfunction has(object, property) {\n    return hop.call(object, property);\n}\nconst NULL = {};\nfunction fastmap(input) {\n    let obj = {}, test;\n    function has$1(key4) {\n        return has(obj, key4) && obj[key4] !== NULL;\n    }\n    const map = {\n        size: 0,\n        empty: 0,\n        object: obj,\n        has: has$1,\n        get (key5) {\n            return has$1(key5) ? obj[key5] : undefined;\n        },\n        set (key6, value) {\n            if (!has$1(key6)) {\n                ++map.size;\n                if (obj[key6] === NULL) --map.empty;\n            }\n            obj[key6] = value;\n            return this;\n        },\n        delete (key7) {\n            if (has$1(key7)) {\n                --map.size;\n                ++map.empty;\n                obj[key7] = NULL;\n            }\n            return this;\n        },\n        clear () {\n            map.size = map.empty = 0;\n            map.object = obj = {};\n        },\n        test (_) {\n            if (arguments.length) {\n                test = _;\n                return map;\n            } else return test;\n        },\n        clean () {\n            const next = {};\n            let size = 0;\n            for(const key8 in obj){\n                const value = obj[key8];\n                if (value !== NULL && (!test || !test(value))) {\n                    next[key8] = value;\n                    ++size;\n                }\n            }\n            map.size = size;\n            map.empty = 0;\n            map.object = obj = next;\n        }\n    };\n    if (input) Object.keys(input).forEach((key9)=>{\n        map.set(key9, input[key9]);\n    });\n    return map;\n}\nfunction flush(range, value, threshold, left, right, center) {\n    if (!threshold && threshold !== 0) return center;\n    const t = +threshold;\n    let a = range[0], b = peek(range), l; // swap endpoints if range is reversed\n    if (b < a) {\n        l = a;\n        a = b;\n        b = l;\n    } // compare value to endpoints\n    l = Math.abs(value - a);\n    const r = Math.abs(b - value); // adjust if value is within threshold distance of endpoint\n    return l < r && l <= t ? left : r <= t ? right : center;\n}\nfunction inherits(child, parent, members) {\n    const proto = child.prototype = Object.create(parent.prototype);\n    Object.defineProperty(proto, \"constructor\", {\n        value: child,\n        writable: true,\n        enumerable: true,\n        configurable: true\n    });\n    return extend(proto, members);\n}\n/**\n * Predicate that returns true if the value lies within the span\n * of the given range. The left and right flags control the use\n * of inclusive (true) or exclusive (false) comparisons.\n */ function inrange(value, range, left, right) {\n    let r0 = range[0], r1 = range[range.length - 1], t;\n    if (r0 > r1) {\n        t = r0;\n        r0 = r1;\n        r1 = t;\n    }\n    left = left === undefined || left;\n    right = right === undefined || right;\n    return (left ? r0 <= value : r0 < value) && (right ? value <= r1 : value < r1);\n}\nfunction isBoolean(_) {\n    return typeof _ === \"boolean\";\n}\nfunction isDate(_) {\n    return Object.prototype.toString.call(_) === \"[object Date]\";\n}\nfunction isIterable(_) {\n    return _ && isFunction(_[Symbol.iterator]);\n}\nfunction isNumber(_) {\n    return typeof _ === \"number\";\n}\nfunction isRegExp(_) {\n    return Object.prototype.toString.call(_) === \"[object RegExp]\";\n}\nfunction isString(_) {\n    return typeof _ === \"string\";\n}\nfunction key(fields, flat, opt) {\n    if (fields) fields = flat ? array(fields).map((f)=>f.replace(/\\\\(.)/g, \"$1\")) : array(fields);\n    const len = fields && fields.length, gen = opt && opt.get || getter, map = (f)=>gen(flat ? [\n            f\n        ] : splitAccessPath(f));\n    let fn;\n    if (!len) fn = function() {\n        return \"\";\n    };\n    else if (len === 1) {\n        const get = map(fields[0]);\n        fn = function(_) {\n            return \"\" + get(_);\n        };\n    } else {\n        const get = fields.map(map);\n        fn = function(_) {\n            let s = \"\" + get[0](_), i = 0;\n            while(++i < len)s += \"|\" + get[i](_);\n            return s;\n        };\n    }\n    return accessor(fn, fields, \"key\");\n}\nfunction lerp(array4, frac) {\n    const lo = array4[0], hi = peek(array4), f = +frac;\n    return !f ? lo : f === 1 ? hi : lo + f * (hi - lo);\n}\nconst DEFAULT_MAX_SIZE = 10000; // adapted from https://github.com/dominictarr/hashlru/ (MIT License)\nfunction lruCache(maxsize) {\n    maxsize = +maxsize || DEFAULT_MAX_SIZE;\n    let curr, prev, size;\n    const clear = ()=>{\n        curr = {};\n        prev = {};\n        size = 0;\n    };\n    const update = (key10, value)=>{\n        if (++size > maxsize) {\n            prev = curr;\n            curr = {};\n            size = 1;\n        }\n        return curr[key10] = value;\n    };\n    clear();\n    return {\n        clear,\n        has: (key11)=>has(curr, key11) || has(prev, key11),\n        get: (key12)=>has(curr, key12) ? curr[key12] : has(prev, key12) ? update(key12, prev[key12]) : undefined,\n        set: (key13, value)=>has(curr, key13) ? curr[key13] = value : update(key13, value)\n    };\n}\nfunction merge(compare2, array0, array1, output) {\n    const n0 = array0.length, n1 = array1.length;\n    if (!n1) return array0;\n    if (!n0) return array1;\n    const merged = output || new array0.constructor(n0 + n1);\n    let i0 = 0, i1 = 0, i = 0;\n    for(; i0 < n0 && i1 < n1; ++i)merged[i] = compare2(array0[i0], array1[i1]) > 0 ? array1[i1++] : array0[i0++];\n    for(; i0 < n0; ++i0, ++i)merged[i] = array0[i0];\n    for(; i1 < n1; ++i1, ++i)merged[i] = array1[i1];\n    return merged;\n}\nfunction repeat(str, reps) {\n    let s = \"\";\n    while(--reps >= 0)s += str;\n    return s;\n}\nfunction pad(str, length, padchar, align) {\n    const c = padchar || \" \", s = str + \"\", n = length - s.length;\n    return n <= 0 ? s : align === \"left\" ? repeat(c, n) + s : align === \"center\" ? repeat(c, ~~(n / 2)) + s + repeat(c, Math.ceil(n / 2)) : s + repeat(c, n);\n}\n/**\n * Return the numerical span of an array: the difference between\n * the last and first values.\n */ function span(array5) {\n    return array5 && peek(array5) - array5[0] || 0;\n}\nfunction $(x) {\n    return isArray(x) ? \"[\" + x.map($) + \"]\" : isObject(x) || isString(x) ? // See http://timelessrepo.com/json-isnt-a-javascript-subset\n    JSON.stringify(x).replace(\"\\u2028\", \"\\\\u2028\").replace(\"\\u2029\", \"\\\\u2029\") : x;\n}\nfunction toBoolean(_) {\n    return _ == null || _ === \"\" ? null : !_ || _ === \"false\" || _ === \"0\" ? false : !!_;\n}\nconst defaultParser = (_)=>isNumber(_) ? _ : isDate(_) ? _ : Date.parse(_);\nfunction toDate(_, parser) {\n    parser = parser || defaultParser;\n    return _ == null || _ === \"\" ? null : parser(_);\n}\nfunction toString(_) {\n    return _ == null || _ === \"\" ? null : _ + \"\";\n}\nfunction toSet(_) {\n    const s = {}, n = _.length;\n    for(let i = 0; i < n; ++i)s[_[i]] = true;\n    return s;\n}\nfunction truncate(str, length, align, ellipsis) {\n    const e = ellipsis != null ? ellipsis : \"\\u2026\", s = str + \"\", n = s.length, l = Math.max(0, length - e.length);\n    return n <= length ? s : align === \"left\" ? e + s.slice(n - l) : align === \"center\" ? s.slice(0, Math.ceil(l / 2)) + e + s.slice(n - ~~(l / 2)) : s.slice(0, l) + e;\n}\nfunction visitArray(array6, filter, visitor) {\n    if (array6) {\n        if (filter) {\n            const n = array6.length;\n            for(let i = 0; i < n; ++i){\n                const t = filter(array6[i]);\n                if (t) visitor(t, i, array6);\n            }\n        } else array6.forEach(visitor);\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3NitK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Dataflow\", ()=>Dataflow);\nparcelHelpers.export(exports, \"EventStream\", ()=>EventStream);\nparcelHelpers.export(exports, \"MultiPulse\", ()=>MultiPulse);\nparcelHelpers.export(exports, \"Operator\", ()=>Operator);\nparcelHelpers.export(exports, \"Parameters\", ()=>Parameters);\nparcelHelpers.export(exports, \"Pulse\", ()=>Pulse);\nparcelHelpers.export(exports, \"Transform\", ()=>Transform);\nparcelHelpers.export(exports, \"UniqueList\", ()=>UniqueList);\nparcelHelpers.export(exports, \"asyncCallback\", ()=>asyncCallback);\nparcelHelpers.export(exports, \"changeset\", ()=>changeset);\nparcelHelpers.export(exports, \"definition\", ()=>definition);\nparcelHelpers.export(exports, \"derive\", ()=>derive);\nparcelHelpers.export(exports, \"ingest\", ()=>ingest$1);\nparcelHelpers.export(exports, \"isChangeSet\", ()=>isChangeSet);\nparcelHelpers.export(exports, \"isTuple\", ()=>isTuple);\nparcelHelpers.export(exports, \"rederive\", ()=>rederive);\nparcelHelpers.export(exports, \"replace\", ()=>replace);\nparcelHelpers.export(exports, \"stableCompare\", ()=>stableCompare);\nparcelHelpers.export(exports, \"transform\", ()=>transform);\nparcelHelpers.export(exports, \"transforms\", ()=>transforms);\nparcelHelpers.export(exports, \"tupleid\", ()=>tupleid);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaLoader = require(\"vega-loader\");\nvar _vegaFormat = require(\"vega-format\");\nfunction UniqueList(idFunc) {\n    const $ = idFunc || (0, _vegaUtil.identity), list = [], ids = {};\n    list.add = (_)=>{\n        const id = $(_);\n        if (!ids[id]) {\n            ids[id] = 1;\n            list.push(_);\n        }\n        return list;\n    };\n    list.remove = (_)=>{\n        const id = $(_);\n        if (ids[id]) {\n            ids[id] = 0;\n            const idx = list.indexOf(_);\n            if (idx >= 0) list.splice(idx, 1);\n        }\n        return list;\n    };\n    return list;\n}\n/**\n * Invoke and await a potentially async callback function. If\n * an error occurs, trap it and route to Dataflow.error.\n * @param {Dataflow} df - The dataflow instance\n * @param {function} callback - A callback function to invoke\n *   and then await. The dataflow will be passed as the single\n *   argument to the function.\n */ async function asyncCallback(df, callback) {\n    try {\n        await callback(df);\n    } catch (err) {\n        df.error(err);\n    }\n}\nconst TUPLE_ID_KEY = Symbol(\"vega_id\");\nlet TUPLE_ID = 1;\n/**\n * Checks if an input value is a registered tuple.\n * @param {*} t - The value to check.\n * @return {boolean} True if the input is a tuple, false otherwise.\n */ function isTuple(t) {\n    return !!(t && tupleid(t));\n}\n/**\n * Returns the id of a tuple.\n * @param {object} t - The input tuple.\n * @return {*} the tuple id.\n */ function tupleid(t) {\n    return t[TUPLE_ID_KEY];\n}\n/**\n * Sets the id of a tuple.\n * @param {object} t - The input tuple.\n * @param {*} id - The id value to set.\n * @return {object} the input tuple.\n */ function setid(t, id) {\n    t[TUPLE_ID_KEY] = id;\n    return t;\n}\n/**\n * Ingest an object or value as a data tuple.\n * If the input value is an object, an id field will be added to it. For\n * efficiency, the input object is modified directly. A copy is not made.\n * If the input value is a literal, it will be wrapped in a new object\n * instance, with the value accessible as the 'data' property.\n * @param datum - The value to ingest.\n * @return {object} The ingested data tuple.\n */ function ingest$1(datum) {\n    const t = datum === Object(datum) ? datum : {\n        data: datum\n    };\n    return tupleid(t) ? t : setid(t, TUPLE_ID++);\n}\n/**\n * Given a source tuple, return a derived copy.\n * @param {object} t - The source tuple.\n * @return {object} The derived tuple.\n */ function derive(t) {\n    return rederive(t, ingest$1({}));\n}\n/**\n * Rederive a derived tuple by copying values from the source tuple.\n * @param {object} t - The source tuple.\n * @param {object} d - The derived tuple.\n * @return {object} The derived tuple.\n */ function rederive(t, d) {\n    for(const k in t)d[k] = t[k];\n    return d;\n}\n/**\n * Replace an existing tuple with a new tuple.\n * @param {object} t - The existing data tuple.\n * @param {object} d - The new tuple that replaces the old.\n * @return {object} The new tuple.\n */ function replace(t, d) {\n    return setid(d, tupleid(t));\n}\n/**\n * Generate an augmented comparator function that provides stable\n * sorting by tuple id when the given comparator produces ties.\n * @param {function} cmp - The comparator to augment.\n * @param {function} [f] - Optional tuple accessor function.\n * @return {function} An augmented comparator function.\n */ function stableCompare(cmp, f) {\n    return !cmp ? null : f ? (a, b)=>cmp(a, b) || tupleid(f(a)) - tupleid(f(b)) : (a, b)=>cmp(a, b) || tupleid(a) - tupleid(b);\n}\nfunction isChangeSet(v) {\n    return v && v.constructor === changeset;\n}\nfunction changeset() {\n    const add1 = [], // insert tuples\n    rem = [], // remove tuples\n    mod = [], // modify tuples\n    remp = [], // remove by predicate\n    modp = []; // modify by predicate\n    let clean = null, reflow = false;\n    return {\n        constructor: changeset,\n        insert (t) {\n            const d = (0, _vegaUtil.array)(t), n = d.length;\n            for(let i = 0; i < n; ++i)add1.push(d[i]);\n            return this;\n        },\n        remove (t) {\n            const a = (0, _vegaUtil.isFunction)(t) ? remp : rem, d = (0, _vegaUtil.array)(t), n = d.length;\n            for(let i = 0; i < n; ++i)a.push(d[i]);\n            return this;\n        },\n        modify (t, field, value) {\n            const m = {\n                field: field,\n                value: (0, _vegaUtil.constant)(value)\n            };\n            if ((0, _vegaUtil.isFunction)(t)) {\n                m.filter = t;\n                modp.push(m);\n            } else {\n                m.tuple = t;\n                mod.push(m);\n            }\n            return this;\n        },\n        encode (t, set) {\n            if ((0, _vegaUtil.isFunction)(t)) modp.push({\n                filter: t,\n                field: set\n            });\n            else mod.push({\n                tuple: t,\n                field: set\n            });\n            return this;\n        },\n        clean (value) {\n            clean = value;\n            return this;\n        },\n        reflow () {\n            reflow = true;\n            return this;\n        },\n        pulse (pulse1, tuples) {\n            const cur = {}, out = {};\n            let i, n, m, f1, t1, id; // build lookup table of current tuples\n            for(i = 0, n = tuples.length; i < n; ++i)cur[tupleid(tuples[i])] = 1;\n             // process individual tuples to remove\n            for(i = 0, n = rem.length; i < n; ++i){\n                t1 = rem[i];\n                cur[tupleid(t1)] = -1;\n            } // process predicate-based removals\n            for(i = 0, n = remp.length; i < n; ++i){\n                f1 = remp[i];\n                tuples.forEach((t)=>{\n                    if (f1(t)) cur[tupleid(t)] = -1;\n                });\n            } // process all add tuples\n            for(i = 0, n = add1.length; i < n; ++i){\n                t1 = add1[i];\n                id = tupleid(t1);\n                if (cur[id]) // tuple already resides in dataset\n                // if flagged for both add and remove, cancel\n                cur[id] = 1;\n                else // tuple does not reside in dataset, add\n                pulse1.add.push(ingest$1(add1[i]));\n            } // populate pulse rem list\n            for(i = 0, n = tuples.length; i < n; ++i){\n                t1 = tuples[i];\n                if (cur[tupleid(t1)] < 0) pulse1.rem.push(t1);\n            } // modify helper method\n            function modify(t, f, v) {\n                if (v) t[f] = v(t);\n                else pulse1.encode = f;\n                if (!reflow) out[tupleid(t)] = t;\n            } // process individual tuples to modify\n            for(i = 0, n = mod.length; i < n; ++i){\n                m = mod[i];\n                t1 = m.tuple;\n                f1 = m.field;\n                id = cur[tupleid(t1)];\n                if (id > 0) {\n                    modify(t1, f1, m.value);\n                    pulse1.modifies(f1);\n                }\n            } // process predicate-based modifications\n            for(i = 0, n = modp.length; i < n; ++i){\n                m = modp[i];\n                f1 = m.filter;\n                tuples.forEach((t)=>{\n                    if (f1(t) && cur[tupleid(t)] > 0) modify(t, m.field, m.value);\n                });\n                pulse1.modifies(m.field);\n            } // upon reflow request, populate mod with all non-removed tuples\n            // otherwise, populate mod with modified tuples only\n            if (reflow) pulse1.mod = rem.length || remp.length ? tuples.filter((t)=>cur[tupleid(t)] > 0) : tuples.slice();\n            else for(id in out)pulse1.mod.push(out[id]);\n             // set pulse garbage collection request\n            if (clean || clean == null && (rem.length || remp.length)) pulse1.clean(true);\n            return pulse1;\n        }\n    };\n}\nconst CACHE = \"_:mod:_\";\n/**\n * Hash that tracks modifications to assigned values.\n * Callers *must* use the set method to update values.\n */ function Parameters() {\n    Object.defineProperty(this, CACHE, {\n        writable: true,\n        value: {}\n    });\n}\nParameters.prototype = {\n    /**\n   * Set a parameter value. If the parameter value changes, the parameter\n   * will be recorded as modified.\n   * @param {string} name - The parameter name.\n   * @param {number} index - The index into an array-value parameter. Ignored if\n   *   the argument is undefined, null or less than zero.\n   * @param {*} value - The parameter value to set.\n   * @param {boolean} [force=false] - If true, records the parameter as modified\n   *   even if the value is unchanged.\n   * @return {Parameters} - This parameter object.\n   */ set (name, index, value, force) {\n        const o = this, v = o[name], mod = o[CACHE];\n        if (index != null && index >= 0) {\n            if (v[index] !== value || force) {\n                v[index] = value;\n                mod[index + \":\" + name] = -1;\n                mod[name] = -1;\n            }\n        } else if (v !== value || force) {\n            o[name] = value;\n            mod[name] = (0, _vegaUtil.isArray)(value) ? 1 + value.length : -1;\n        }\n        return o;\n    },\n    /**\n   * Tests if one or more parameters has been modified. If invoked with no\n   * arguments, returns true if any parameter value has changed. If the first\n   * argument is array, returns trues if any parameter name in the array has\n   * changed. Otherwise, tests if the given name and optional array index has\n   * changed.\n   * @param {string} name - The parameter name to test.\n   * @param {number} [index=undefined] - The parameter array index to test.\n   * @return {boolean} - Returns true if a queried parameter was modified.\n   */ modified (name, index) {\n        const mod = this[CACHE];\n        if (!arguments.length) {\n            for(const k in mod){\n                if (mod[k]) return true;\n            }\n            return false;\n        } else if ((0, _vegaUtil.isArray)(name)) {\n            for(let k = 0; k < name.length; ++k){\n                if (mod[name[k]]) return true;\n            }\n            return false;\n        }\n        return index != null && index >= 0 ? index + 1 < mod[name] || !!mod[index + \":\" + name] : !!mod[name];\n    },\n    /**\n   * Clears the modification records. After calling this method,\n   * all parameters are considered unmodified.\n   */ clear () {\n        this[CACHE] = {};\n        return this;\n    }\n};\nlet OP_ID = 0;\nconst PULSE = \"pulse\", NO_PARAMS = new Parameters(); // Boolean Flags\nconst SKIP$1 = 1, MODIFIED = 2;\n/**\n * An Operator is a processing node in a dataflow graph.\n * Each operator stores a value and an optional value update function.\n * Operators can accept a hash of named parameters. Parameter values can\n * either be direct (JavaScript literals, arrays, objects) or indirect\n * (other operators whose values will be pulled dynamically). Operators\n * included as parameters will have this operator added as a dependency.\n * @constructor\n * @param {*} [init] - The initial value for this operator.\n * @param {function(object, Pulse)} [update] - An update function. Upon\n *   evaluation of this operator, the update function will be invoked and the\n *   return value will be used as the new value of this operator.\n * @param {object} [params] - The parameters for this operator.\n * @param {boolean} [react=true] - Flag indicating if this operator should\n *   listen for changes to upstream operators included as parameters.\n * @see parameters\n */ function Operator(init, update1, params, react) {\n    this.id = ++OP_ID;\n    this.value = init;\n    this.stamp = -1;\n    this.rank = -1;\n    this.qrank = -1;\n    this.flags = 0;\n    if (update1) this._update = update1;\n    if (params) this.parameters(params, react);\n}\nfunction flag(bit) {\n    return function(state) {\n        const f = this.flags;\n        if (arguments.length === 0) return !!(f & bit);\n        this.flags = state ? f | bit : f & ~bit;\n        return this;\n    };\n}\nOperator.prototype = {\n    /**\n   * Returns a list of target operators dependent on this operator.\n   * If this list does not exist, it is created and then returned.\n   * @return {UniqueList}\n   */ targets () {\n        return this._targets || (this._targets = UniqueList((0, _vegaUtil.id)));\n    },\n    /**\n   * Sets the value of this operator.\n   * @param {*} value - the value to set.\n   * @return {Number} Returns 1 if the operator value has changed\n   *   according to strict equality, returns 0 otherwise.\n   */ set (value) {\n        if (this.value !== value) {\n            this.value = value;\n            return 1;\n        } else return 0;\n    },\n    /**\n   * Indicates that operator evaluation should be skipped on the next pulse.\n   * This operator will still propagate incoming pulses, but its update function\n   * will not be invoked. The skip flag is reset after every pulse, so calling\n   * this method will affect processing of the next pulse only.\n   */ skip: flag(SKIP$1),\n    /**\n   * Indicates that this operator's value has been modified on its most recent\n   * pulse. Normally modification is checked via strict equality; however, in\n   * some cases it is more efficient to update the internal state of an object.\n   * In those cases, the modified flag can be used to trigger propagation. Once\n   * set, the modification flag persists across pulses until unset. The flag can\n   * be used with the last timestamp to test if a modification is recent.\n   */ modified: flag(MODIFIED),\n    /**\n   * Sets the parameters for this operator. The parameter values are analyzed for\n   * operator instances. If found, this operator will be added as a dependency\n   * of the parameterizing operator. Operator values are dynamically marshalled\n   * from each operator parameter prior to evaluation. If a parameter value is\n   * an array, the array will also be searched for Operator instances. However,\n   * the search does not recurse into sub-arrays or object properties.\n   * @param {object} params - A hash of operator parameters.\n   * @param {boolean} [react=true] - A flag indicating if this operator should\n   *   automatically update (react) when parameter values change. In other words,\n   *   this flag determines if the operator registers itself as a listener on\n   *   any upstream operators included in the parameters.\n   * @param {boolean} [initonly=false] - A flag indicating if this operator\n   *   should calculate an update only upon its initiatal evaluation, then\n   *   deregister dependencies and suppress all future update invocations.\n   * @return {Operator[]} - An array of upstream dependencies.\n   */ parameters (params, react, initonly) {\n        react = react !== false;\n        const argval = this._argval = this._argval || new Parameters(), argops = this._argops = this._argops || [], deps = [];\n        let name1, value1, n, i;\n        const add2 = (name, index, value)=>{\n            if (value instanceof Operator) {\n                if (value !== this) {\n                    if (react) value.targets().add(this);\n                    deps.push(value);\n                }\n                argops.push({\n                    op: value,\n                    name: name,\n                    index: index\n                });\n            } else argval.set(name, index, value);\n        };\n        for(name1 in params){\n            value1 = params[name1];\n            if (name1 === PULSE) {\n                (0, _vegaUtil.array)(value1).forEach((op)=>{\n                    if (!(op instanceof Operator)) (0, _vegaUtil.error)(\"Pulse parameters must be operator instances.\");\n                    else if (op !== this) {\n                        op.targets().add(this);\n                        deps.push(op);\n                    }\n                });\n                this.source = value1;\n            } else if ((0, _vegaUtil.isArray)(value1)) {\n                argval.set(name1, -1, Array(n = value1.length));\n                for(i = 0; i < n; ++i)add2(name1, i, value1[i]);\n            } else add2(name1, -1, value1);\n        }\n        this.marshall().clear(); // initialize values\n        if (initonly) argops.initonly = true;\n        return deps;\n    },\n    /**\n   * Internal method for marshalling parameter values.\n   * Visits each operator dependency to pull the latest value.\n   * @return {Parameters} A Parameters object to pass to the update function.\n   */ marshall (stamp) {\n        const argval = this._argval || NO_PARAMS, argops = this._argops;\n        let item, i, op, mod;\n        if (argops) {\n            const n = argops.length;\n            for(i = 0; i < n; ++i){\n                item = argops[i];\n                op = item.op;\n                mod = op.modified() && op.stamp === stamp;\n                argval.set(item.name, item.index, op.value, mod);\n            }\n            if (argops.initonly) {\n                for(i = 0; i < n; ++i){\n                    item = argops[i];\n                    item.op.targets().remove(this);\n                }\n                this._argops = null;\n                this._update = null;\n            }\n        }\n        return argval;\n    },\n    /**\n   * Detach this operator from the dataflow.\n   * Unregisters listeners on upstream dependencies.\n   */ detach () {\n        const argops = this._argops;\n        let i, n, item, op;\n        if (argops) for(i = 0, n = argops.length; i < n; ++i){\n            item = argops[i];\n            op = item.op;\n            if (op._targets) op._targets.remove(this);\n        }\n         // remove references to the source and pulse object,\n        // if present, to prevent memory leaks of old data.\n        this.pulse = null;\n        this.source = null;\n    },\n    /**\n   * Delegate method to perform operator processing.\n   * Subclasses can override this method to perform custom processing.\n   * By default, it marshalls parameters and calls the update function\n   * if that function is defined. If the update function does not\n   * change the operator value then StopPropagation is returned.\n   * If no update function is defined, this method does nothing.\n   * @param {Pulse} pulse - the current dataflow pulse.\n   * @return The output pulse or StopPropagation. A falsy return value\n   *   (including undefined) will let the input pulse pass through.\n   */ evaluate (pulse2) {\n        const update2 = this._update;\n        if (update2) {\n            const params = this.marshall(pulse2.stamp), v = update2.call(this, params, pulse2);\n            params.clear();\n            if (v !== this.value) this.value = v;\n            else if (!this.modified()) return pulse2.StopPropagation;\n        }\n    },\n    /**\n   * Run this operator for the current pulse. If this operator has already\n   * been run at (or after) the pulse timestamp, returns StopPropagation.\n   * Internally, this method calls {@link evaluate} to perform processing.\n   * If {@link evaluate} returns a falsy value, the input pulse is returned.\n   * This method should NOT be overridden, instead overrride {@link evaluate}.\n   * @param {Pulse} pulse - the current dataflow pulse.\n   * @return the output pulse for this operator (or StopPropagation)\n   */ run (pulse3) {\n        if (pulse3.stamp < this.stamp) return pulse3.StopPropagation;\n        let rv;\n        if (this.skip()) {\n            this.skip(false);\n            rv = 0;\n        } else rv = this.evaluate(pulse3);\n        return this.pulse = rv || pulse3;\n    }\n};\n/**\n * Add an operator to the dataflow graph. This function accepts a\n * variety of input argument types. The basic signature supports an\n * initial value, update function and parameters. If the first parameter\n * is an Operator instance, it will be added directly. If it is a\n * constructor for an Operator subclass, a new instance will be instantiated.\n * Otherwise, if the first parameter is a function instance, it will be used\n * as the update function and a null initial value is assumed.\n * @param {*} init - One of: the operator to add, the initial value of\n *   the operator, an operator class to instantiate, or an update function.\n * @param {function} [update] - The operator update function.\n * @param {object} [params] - The operator parameters.\n * @param {boolean} [react=true] - Flag indicating if this operator should\n *   listen for changes to upstream operators included as parameters.\n * @return {Operator} - The added operator.\n */ function add(init, update3, params, react) {\n    let shift = 1, op;\n    if (init instanceof Operator) op = init;\n    else if (init && init.prototype instanceof Operator) op = new init();\n    else if ((0, _vegaUtil.isFunction)(init)) op = new Operator(null, init);\n    else {\n        shift = 0;\n        op = new Operator(init, update3);\n    }\n    this.rank(op);\n    if (shift) {\n        react = params;\n        params = update3;\n    }\n    if (params) this.connect(op, op.parameters(params, react));\n    this.touch(op);\n    return op;\n}\n/**\n * Connect a target operator as a dependent of source operators.\n * If necessary, this method will rerank the target operator and its\n * dependents to ensure propagation proceeds in a topologically sorted order.\n * @param {Operator} target - The target operator.\n * @param {Array<Operator>} - The source operators that should propagate\n *   to the target operator.\n */ function connect(target, sources) {\n    const targetRank = target.rank, n = sources.length;\n    for(let i = 0; i < n; ++i)if (targetRank < sources[i].rank) {\n        this.rerank(target);\n        return;\n    }\n}\nlet STREAM_ID = 0;\n/**\n * Models an event stream.\n * @constructor\n * @param {function(Object, number): boolean} [filter] - Filter predicate.\n *   Events pass through when truthy, events are suppressed when falsy.\n * @param {function(Object): *} [apply] - Applied to input events to produce\n *   new event values.\n * @param {function(Object)} [receive] - Event callback function to invoke\n *   upon receipt of a new event. Use to override standard event processing.\n */ function EventStream(filter1, apply, receive) {\n    this.id = ++STREAM_ID;\n    this.value = null;\n    if (receive) this.receive = receive;\n    if (filter1) this._filter = filter1;\n    if (apply) this._apply = apply;\n}\n/**\n * Creates a new event stream instance with the provided\n * (optional) filter, apply and receive functions.\n * @param {function(Object, number): boolean} [filter] - Filter predicate.\n *   Events pass through when truthy, events are suppressed when falsy.\n * @param {function(Object): *} [apply] - Applied to input events to produce\n *   new event values.\n * @see EventStream\n */ function stream(filter2, apply, receive) {\n    return new EventStream(filter2, apply, receive);\n}\nEventStream.prototype = {\n    _filter: (0, _vegaUtil.truthy),\n    _apply: (0, _vegaUtil.identity),\n    targets () {\n        return this._targets || (this._targets = UniqueList((0, _vegaUtil.id)));\n    },\n    consume (_) {\n        if (!arguments.length) return !!this._consume;\n        this._consume = !!_;\n        return this;\n    },\n    receive (evt) {\n        if (this._filter(evt)) {\n            const val = this.value = this._apply(evt), trg = this._targets, n = trg ? trg.length : 0;\n            for(let i = 0; i < n; ++i)trg[i].receive(val);\n            if (this._consume) {\n                evt.preventDefault();\n                evt.stopPropagation();\n            }\n        }\n    },\n    filter (filter3) {\n        const s = stream(filter3);\n        this.targets().add(s);\n        return s;\n    },\n    apply (apply) {\n        const s = stream(null, apply);\n        this.targets().add(s);\n        return s;\n    },\n    merge () {\n        const s = stream();\n        this.targets().add(s);\n        for(let i = 0, n = arguments.length; i < n; ++i)arguments[i].targets().add(s);\n        return s;\n    },\n    throttle (pause) {\n        let t = -1;\n        return this.filter(()=>{\n            const now = Date.now();\n            if (now - t > pause) {\n                t = now;\n                return 1;\n            } else return 0;\n        });\n    },\n    debounce (delay) {\n        const s = stream();\n        this.targets().add(stream(null, null, (0, _vegaUtil.debounce)(delay, (e)=>{\n            const df = e.dataflow;\n            s.receive(e);\n            if (df && df.run) df.run();\n        })));\n        return s;\n    },\n    between (a, b) {\n        let active = false;\n        a.targets().add(stream(null, null, ()=>active = true));\n        b.targets().add(stream(null, null, ()=>active = false));\n        return this.filter(()=>active);\n    },\n    detach () {\n        // ensures compatibility with operators (#2753)\n        // remove references to other streams and filter functions that may\n        // be bound to subcontexts that need to be garbage collected.\n        this._filter = (0, _vegaUtil.truthy);\n        this._targets = null;\n    }\n};\n/**\n * Create a new event stream from an event source.\n * @param {object} source - The event source to monitor. The input must\n *  support the addEventListener method.\n * @param {string} type - The event type.\n * @param {function(object): boolean} [filter] - Event filter function.\n * @param {function(object): *} [apply] - Event application function.\n *   If provided, this function will be invoked and the result will be\n *   used as the downstream event value.\n * @return {EventStream}\n */ function events(source, type, filter4, apply) {\n    const df = this, s = stream(filter4, apply), send = function(e) {\n        e.dataflow = df;\n        try {\n            s.receive(e);\n        } catch (error) {\n            df.error(error);\n        } finally{\n            df.run();\n        }\n    };\n    let sources;\n    if (typeof source === \"string\" && typeof document !== \"undefined\") sources = document.querySelectorAll(source);\n    else sources = (0, _vegaUtil.array)(source);\n    const n = sources.length;\n    for(let i = 0; i < n; ++i)sources[i].addEventListener(type, send);\n    return s;\n}\nfunction parse(data, format) {\n    const locale = this.locale();\n    return (0, _vegaLoader.read)(data, format, locale.timeParse, locale.utcParse);\n}\n/**\n * Ingests new data into the dataflow. First parses the data using the\n * vega-loader read method, then pulses a changeset to the target operator.\n * @param {Operator} target - The Operator to target with ingested data,\n *   typically a Collect transform instance.\n * @param {*} data - The input data, prior to parsing. For JSON this may\n *   be a string or an object. For CSV, TSV, etc should be a string.\n * @param {object} format - The data format description for parsing\n *   loaded data. This object is passed to the vega-loader read method.\n * @returns {Dataflow}\n */ function ingest(target, data, format) {\n    data = this.parse(data, format);\n    return this.pulse(target, this.changeset().insert(data));\n}\n/**\n * Request data from an external source, parse it, and return a Promise.\n * @param {string} url - The URL from which to load the data. This string\n *   is passed to the vega-loader load method.\n * @param {object} [format] - The data format description for parsing\n *   loaded data. This object is passed to the vega-loader read method.\n * @return {Promise} A Promise that resolves upon completion of the request.\n *   The resolved object contains the following properties:\n *   - data: an array of parsed data (or null upon error)\n *   - status: a code for success (0), load fail (-1), or parse fail (-2)\n */ async function request(url, format) {\n    const df = this;\n    let status = 0, data;\n    try {\n        data = await df.loader().load(url, {\n            context: \"dataflow\",\n            response: (0, _vegaLoader.responseType)(format && format.type)\n        });\n        try {\n            data = df.parse(data, format);\n        } catch (err) {\n            status = -2;\n            df.warn(\"Data ingestion failed\", url, err);\n        }\n    } catch (err) {\n        status = -1;\n        df.warn(\"Loading failed\", url, err);\n    }\n    return {\n        data,\n        status\n    };\n}\nasync function preload(target, url, format) {\n    const df = this, pending = df._pending || loadPending(df);\n    pending.requests += 1;\n    const res = await df.request(url, format);\n    df.pulse(target, df.changeset().remove((0, _vegaUtil.truthy)).insert(res.data || []));\n    pending.done();\n    return res;\n}\nfunction loadPending(df) {\n    let accept;\n    const pending = new Promise((a)=>accept = a);\n    pending.requests = 0;\n    pending.done = ()=>{\n        if (--pending.requests === 0) {\n            df._pending = null;\n            accept(df);\n        }\n    };\n    return df._pending = pending;\n}\nconst SKIP = {\n    skip: true\n};\n/**\n * Perform operator updates in response to events. Applies an\n * update function to compute a new operator value. If the update function\n * returns a {@link ChangeSet}, the operator will be pulsed with those tuple\n * changes. Otherwise, the operator value will be updated to the return value.\n * @param {EventStream|Operator} source - The event source to react to.\n *   This argument can be either an EventStream or an Operator.\n * @param {Operator|function(object):Operator} target - The operator to update.\n *   This argument can either be an Operator instance or (if the source\n *   argument is an EventStream), a function that accepts an event object as\n *   input and returns an Operator to target.\n * @param {function(Parameters,Event): *} [update] - Optional update function\n *   to compute the new operator value, or a literal value to set. Update\n *   functions expect to receive a parameter object and event as arguments.\n *   This function can either return a new operator value or (if the source\n *   argument is an EventStream) a {@link ChangeSet} instance to pulse\n *   the target operator with tuple changes.\n * @param {object} [params] - The update function parameters.\n * @param {object} [options] - Additional options hash. If not overridden,\n *   updated operators will be skipped by default.\n * @param {boolean} [options.skip] - If true, the operator will\n *  be skipped: it will not be evaluated, but its dependents will be.\n * @param {boolean} [options.force] - If true, the operator will\n *   be re-evaluated even if its value has not changed.\n * @return {Dataflow}\n */ function on(source, target, update4, params, options) {\n    const fn = source instanceof Operator ? onOperator : onStream;\n    fn(this, source, target, update4, params, options);\n    return this;\n}\nfunction onStream(df, stream1, target, update5, params, options) {\n    const opt = (0, _vegaUtil.extend)({}, options, SKIP);\n    let func, op;\n    if (!(0, _vegaUtil.isFunction)(target)) target = (0, _vegaUtil.constant)(target);\n    if (update5 === undefined) func = (e)=>df.touch(target(e));\n    else if ((0, _vegaUtil.isFunction)(update5)) {\n        op = new Operator(null, update5, params, false);\n        func = (e)=>{\n            op.evaluate(e);\n            const t = target(e), v = op.value;\n            isChangeSet(v) ? df.pulse(t, v, options) : df.update(t, v, opt);\n        };\n    } else func = (e)=>df.update(target(e), update5, opt);\n    stream1.apply(func);\n}\nfunction onOperator(df, source, target, update6, params, options) {\n    if (update6 === undefined) source.targets().add(target);\n    else {\n        const opt = options || {}, op = new Operator(null, updater(target, update6), params, false);\n        op.modified(opt.force);\n        op.rank = source.rank; // immediately follow source\n        source.targets().add(op); // add dependency\n        if (target) {\n            op.skip(true); // skip first invocation\n            op.value = target.value; // initialize value\n            op.targets().add(target); // chain dependencies\n            df.connect(target, [\n                op\n            ]); // rerank as needed, #1672\n        }\n    }\n}\nfunction updater(target, update7) {\n    update7 = (0, _vegaUtil.isFunction)(update7) ? update7 : (0, _vegaUtil.constant)(update7);\n    return target ? function(_, pulse4) {\n        const value = update7(_, pulse4);\n        if (!target.skip()) target.skip(value !== this.value).value = value;\n        return value;\n    } : update7;\n}\n/**\n * Assigns a rank to an operator. Ranks are assigned in increasing order\n * by incrementing an internal rank counter.\n * @param {Operator} op - The operator to assign a rank.\n */ function rank(op) {\n    op.rank = ++this._rank;\n}\n/**\n * Re-ranks an operator and all downstream target dependencies. This\n * is necessary when upstream dependencies of higher rank are added to\n * a target operator.\n * @param {Operator} op - The operator to re-rank.\n */ function rerank(op) {\n    const queue = [\n        op\n    ];\n    let cur, list, i;\n    while(queue.length){\n        this.rank(cur = queue.pop());\n        if (list = cur._targets) for(i = list.length; --i >= 0;){\n            queue.push(cur = list[i]);\n            if (cur === op) (0, _vegaUtil.error)(\"Cycle detected in dataflow graph.\");\n        }\n    }\n}\n/**\n * Sentinel value indicating pulse propagation should stop.\n */ const StopPropagation = {}; // Pulse visit type flags\nconst ADD = 1, REM = 2, MOD = 4, ADD_REM = ADD | REM, ADD_MOD = ADD | MOD, ALL = ADD | REM | MOD, REFLOW = 8, SOURCE = 16, NO_SOURCE = 32, NO_FIELDS = 64;\n/**\n * A Pulse enables inter-operator communication during a run of the\n * dataflow graph. In addition to the current timestamp, a pulse may also\n * contain a change-set of added, removed or modified data tuples, as well as\n * a pointer to a full backing data source. Tuple change sets may not\n * be fully materialized; for example, to prevent needless array creation\n * a change set may include larger arrays and corresponding filter functions.\n * The pulse provides a {@link visit} method to enable proper and efficient\n * iteration over requested data tuples.\n *\n * In addition, each pulse can track modification flags for data tuple fields.\n * Responsible transform operators should call the {@link modifies} method to\n * indicate changes to data fields. The {@link modified} method enables\n * querying of this modification state.\n *\n * @constructor\n * @param {Dataflow} dataflow - The backing dataflow instance.\n * @param {number} stamp - The current propagation timestamp.\n * @param {string} [encode] - An optional encoding set name, which is then\n *   accessible as Pulse.encode. Operators can respond to (or ignore) this\n *   setting as appropriate. This parameter can be used in conjunction with\n *   the Encode transform in the vega-encode module.\n */ function Pulse(dataflow, stamp, encode) {\n    this.dataflow = dataflow;\n    this.stamp = stamp == null ? -1 : stamp;\n    this.add = [];\n    this.rem = [];\n    this.mod = [];\n    this.fields = null;\n    this.encode = encode || null;\n}\nfunction materialize(data, filter5) {\n    const out = [];\n    (0, _vegaUtil.visitArray)(data, filter5, (_)=>out.push(_));\n    return out;\n}\nfunction filter(pulse5, flags) {\n    const map = {};\n    pulse5.visit(flags, (t)=>{\n        map[tupleid(t)] = 1;\n    });\n    return (t)=>map[tupleid(t)] ? null : t;\n}\nfunction addFilter(a, b) {\n    return a ? (t, i)=>a(t, i) && b(t, i) : b;\n}\nPulse.prototype = {\n    /**\n   * Sentinel value indicating pulse propagation should stop.\n   */ StopPropagation,\n    /**\n   * Boolean flag indicating ADD (added) tuples.\n   */ ADD,\n    /**\n   * Boolean flag indicating REM (removed) tuples.\n   */ REM,\n    /**\n   * Boolean flag indicating MOD (modified) tuples.\n   */ MOD,\n    /**\n   * Boolean flag indicating ADD (added) and REM (removed) tuples.\n   */ ADD_REM,\n    /**\n   * Boolean flag indicating ADD (added) and MOD (modified) tuples.\n   */ ADD_MOD,\n    /**\n   * Boolean flag indicating ADD, REM and MOD tuples.\n   */ ALL,\n    /**\n   * Boolean flag indicating all tuples in a data source\n   * except for the ADD, REM and MOD tuples.\n   */ REFLOW,\n    /**\n   * Boolean flag indicating a 'pass-through' to a\n   * backing data source, ignoring ADD, REM and MOD tuples.\n   */ SOURCE,\n    /**\n   * Boolean flag indicating that source data should be\n   * suppressed when creating a forked pulse.\n   */ NO_SOURCE,\n    /**\n   * Boolean flag indicating that field modifications should be\n   * suppressed when creating a forked pulse.\n   */ NO_FIELDS,\n    /**\n   * Creates a new pulse based on the values of this pulse.\n   * The dataflow, time stamp and field modification values are copied over.\n   * By default, new empty ADD, REM and MOD arrays are created.\n   * @param {number} flags - Integer of boolean flags indicating which (if any)\n   *   tuple arrays should be copied to the new pulse. The supported flag values\n   *   are ADD, REM and MOD. Array references are copied directly: new array\n   *   instances are not created.\n   * @return {Pulse} - The forked pulse instance.\n   * @see init\n   */ fork (flags) {\n        return new Pulse(this.dataflow).init(this, flags);\n    },\n    /**\n   * Creates a copy of this pulse with new materialized array\n   * instances for the ADD, REM, MOD, and SOURCE arrays.\n   * The dataflow, time stamp and field modification values are copied over.\n   * @return {Pulse} - The cloned pulse instance.\n   * @see init\n   */ clone () {\n        const p = this.fork(ALL);\n        p.add = p.add.slice();\n        p.rem = p.rem.slice();\n        p.mod = p.mod.slice();\n        if (p.source) p.source = p.source.slice();\n        return p.materialize(ALL | SOURCE);\n    },\n    /**\n   * Returns a pulse that adds all tuples from a backing source. This is\n   * useful for cases where operators are added to a dataflow after an\n   * upstream data pipeline has already been processed, ensuring that\n   * new operators can observe all tuples within a stream.\n   * @return {Pulse} - A pulse instance with all source tuples included\n   *   in the add array. If the current pulse already has all source\n   *   tuples in its add array, it is returned directly. If the current\n   *   pulse does not have a backing source, it is returned directly.\n   */ addAll () {\n        let p = this;\n        const reuse = !p.source || p.add === p.rem // special case for indexed set (e.g., crossfilter)\n         || !p.rem.length && p.source.length === p.add.length;\n        if (reuse) return p;\n        else {\n            p = new Pulse(this.dataflow).init(this);\n            p.add = p.source;\n            p.rem = []; // new operators can ignore rem #2769\n            return p;\n        }\n    },\n    /**\n   * Initialize this pulse based on the values of another pulse. This method\n   * is used internally by {@link fork} to initialize a new forked tuple.\n   * The dataflow, time stamp and field modification values are copied over.\n   * By default, new empty ADD, REM and MOD arrays are created.\n   * @param {Pulse} src - The source pulse to copy from.\n   * @param {number} flags - Integer of boolean flags indicating which (if any)\n   *   tuple arrays should be copied to the new pulse. The supported flag values\n   *   are ADD, REM and MOD. Array references are copied directly: new array\n   *   instances are not created. By default, source data arrays are copied\n   *   to the new pulse. Use the NO_SOURCE flag to enforce a null source.\n   * @return {Pulse} - Returns this Pulse instance.\n   */ init (src, flags) {\n        const p = this;\n        p.stamp = src.stamp;\n        p.encode = src.encode;\n        if (src.fields && !(flags & NO_FIELDS)) p.fields = src.fields;\n        if (flags & ADD) {\n            p.addF = src.addF;\n            p.add = src.add;\n        } else {\n            p.addF = null;\n            p.add = [];\n        }\n        if (flags & REM) {\n            p.remF = src.remF;\n            p.rem = src.rem;\n        } else {\n            p.remF = null;\n            p.rem = [];\n        }\n        if (flags & MOD) {\n            p.modF = src.modF;\n            p.mod = src.mod;\n        } else {\n            p.modF = null;\n            p.mod = [];\n        }\n        if (flags & NO_SOURCE) {\n            p.srcF = null;\n            p.source = null;\n        } else {\n            p.srcF = src.srcF;\n            p.source = src.source;\n            if (src.cleans) p.cleans = src.cleans;\n        }\n        return p;\n    },\n    /**\n   * Schedules a function to run after pulse propagation completes.\n   * @param {function} func - The function to run.\n   */ runAfter (func) {\n        this.dataflow.runAfter(func);\n    },\n    /**\n   * Indicates if tuples have been added, removed or modified.\n   * @param {number} [flags] - The tuple types (ADD, REM or MOD) to query.\n   *   Defaults to ALL, returning true if any tuple type has changed.\n   * @return {boolean} - Returns true if one or more queried tuple types have\n   *   changed, false otherwise.\n   */ changed (flags) {\n        const f = flags || ALL;\n        return f & ADD && this.add.length || f & REM && this.rem.length || f & MOD && this.mod.length;\n    },\n    /**\n   * Forces a \"reflow\" of tuple values, such that all tuples in the backing\n   * source are added to the MOD set, unless already present in the ADD set.\n   * @param {boolean} [fork=false] - If true, returns a forked copy of this\n   *   pulse, and invokes reflow on that derived pulse.\n   * @return {Pulse} - The reflowed pulse instance.\n   */ reflow (fork) {\n        if (fork) return this.fork(ALL).reflow();\n        const len = this.add.length, src = this.source && this.source.length;\n        if (src && src !== len) {\n            this.mod = this.source;\n            if (len) this.filter(MOD, filter(this, ADD));\n        }\n        return this;\n    },\n    /**\n   * Get/set metadata to pulse requesting garbage collection\n   * to reclaim currently unused resources.\n   */ clean (value) {\n        if (arguments.length) {\n            this.cleans = !!value;\n            return this;\n        } else return this.cleans;\n    },\n    /**\n   * Marks one or more data field names as modified to assist dependency\n   * tracking and incremental processing by transform operators.\n   * @param {string|Array<string>} _ - The field(s) to mark as modified.\n   * @return {Pulse} - This pulse instance.\n   */ modifies (_) {\n        const hash = this.fields || (this.fields = {});\n        if ((0, _vegaUtil.isArray)(_)) _.forEach((f)=>hash[f] = true);\n        else hash[_] = true;\n        return this;\n    },\n    /**\n   * Checks if one or more data fields have been modified during this pulse\n   * propagation timestamp.\n   * @param {string|Array<string>} _ - The field(s) to check for modified.\n   * @param {boolean} nomod - If true, will check the modified flag even if\n   *   no mod tuples exist. If false (default), mod tuples must be present.\n   * @return {boolean} - Returns true if any of the provided fields has been\n   *   marked as modified, false otherwise.\n   */ modified (_, nomod) {\n        const fields = this.fields;\n        return !((nomod || this.mod.length) && fields) ? false : !arguments.length ? !!fields : (0, _vegaUtil.isArray)(_) ? _.some((f)=>fields[f]) : fields[_];\n    },\n    /**\n   * Adds a filter function to one more tuple sets. Filters are applied to\n   * backing tuple arrays, to determine the actual set of tuples considered\n   * added, removed or modified. They can be used to delay materialization of\n   * a tuple set in order to avoid expensive array copies. In addition, the\n   * filter functions can serve as value transformers: unlike standard predicate\n   * function (which return boolean values), Pulse filters should return the\n   * actual tuple value to process. If a tuple set is already filtered, the\n   * new filter function will be appended into a conjuntive ('and') query.\n   * @param {number} flags - Flags indicating the tuple set(s) to filter.\n   * @param {function(*):object} filter - Filter function that will be applied\n   *   to the tuple set array, and should return a data tuple if the value\n   *   should be included in the tuple set, and falsy (or null) otherwise.\n   * @return {Pulse} - Returns this pulse instance.\n   */ filter (flags, filter6) {\n        const p = this;\n        if (flags & ADD) p.addF = addFilter(p.addF, filter6);\n        if (flags & REM) p.remF = addFilter(p.remF, filter6);\n        if (flags & MOD) p.modF = addFilter(p.modF, filter6);\n        if (flags & SOURCE) p.srcF = addFilter(p.srcF, filter6);\n        return p;\n    },\n    /**\n   * Materialize one or more tuple sets in this pulse. If the tuple set(s) have\n   * a registered filter function, it will be applied and the tuple set(s) will\n   * be replaced with materialized tuple arrays.\n   * @param {number} flags - Flags indicating the tuple set(s) to materialize.\n   * @return {Pulse} - Returns this pulse instance.\n   */ materialize (flags) {\n        flags = flags || ALL;\n        const p = this;\n        if (flags & ADD && p.addF) {\n            p.add = materialize(p.add, p.addF);\n            p.addF = null;\n        }\n        if (flags & REM && p.remF) {\n            p.rem = materialize(p.rem, p.remF);\n            p.remF = null;\n        }\n        if (flags & MOD && p.modF) {\n            p.mod = materialize(p.mod, p.modF);\n            p.modF = null;\n        }\n        if (flags & SOURCE && p.srcF) {\n            p.source = p.source.filter(p.srcF);\n            p.srcF = null;\n        }\n        return p;\n    },\n    /**\n   * Visit one or more tuple sets in this pulse.\n   * @param {number} flags - Flags indicating the tuple set(s) to visit.\n   *   Legal values are ADD, REM, MOD and SOURCE (if a backing data source\n   *   has been set).\n   * @param {function(object):*} - Visitor function invoked per-tuple.\n   * @return {Pulse} - Returns this pulse instance.\n   */ visit (flags, visitor) {\n        const p = this, v = visitor;\n        if (flags & SOURCE) {\n            (0, _vegaUtil.visitArray)(p.source, p.srcF, v);\n            return p;\n        }\n        if (flags & ADD) (0, _vegaUtil.visitArray)(p.add, p.addF, v);\n        if (flags & REM) (0, _vegaUtil.visitArray)(p.rem, p.remF, v);\n        if (flags & MOD) (0, _vegaUtil.visitArray)(p.mod, p.modF, v);\n        const src = p.source;\n        if (flags & REFLOW && src) {\n            const sum = p.add.length + p.mod.length;\n            if (sum === src.length) ;\n            else if (sum) (0, _vegaUtil.visitArray)(src, filter(p, ADD_MOD), v);\n            else // if no add/rem/mod tuples, visit source\n            (0, _vegaUtil.visitArray)(src, p.srcF, v);\n        }\n        return p;\n    }\n};\n/**\n * Represents a set of multiple pulses. Used as input for operators\n * that accept multiple pulses at a time. Contained pulses are\n * accessible via the public \"pulses\" array property. This pulse doe\n * not carry added, removed or modified tuples directly. However,\n * the visit method can be used to traverse all such tuples contained\n * in sub-pulses with a timestamp matching this parent multi-pulse.\n * @constructor\n * @param {Dataflow} dataflow - The backing dataflow instance.\n * @param {number} stamp - The timestamp.\n * @param {Array<Pulse>} pulses - The sub-pulses for this multi-pulse.\n */ function MultiPulse(dataflow, stamp, pulses, encode) {\n    const p = this, n = pulses.length;\n    let c = 0;\n    this.dataflow = dataflow;\n    this.stamp = stamp;\n    this.fields = null;\n    this.encode = encode || null;\n    this.pulses = pulses;\n    for(let i = 0; i < n; ++i){\n        const pulse6 = pulses[i];\n        if (pulse6.stamp !== stamp) continue;\n        if (pulse6.fields) {\n            const hash = p.fields || (p.fields = {});\n            for(const f in pulse6.fields)hash[f] = 1;\n        }\n        if (pulse6.changed(p.ADD)) c |= p.ADD;\n        if (pulse6.changed(p.REM)) c |= p.REM;\n        if (pulse6.changed(p.MOD)) c |= p.MOD;\n    }\n    this.changes = c;\n}\n(0, _vegaUtil.inherits)(MultiPulse, Pulse, {\n    /**\n   * Creates a new pulse based on the values of this pulse.\n   * The dataflow, time stamp and field modification values are copied over.\n   * @return {Pulse}\n   */ fork (flags) {\n        const p = new Pulse(this.dataflow).init(this, flags & this.NO_FIELDS);\n        if (flags !== undefined) {\n            if (flags & p.ADD) this.visit(p.ADD, (t)=>p.add.push(t));\n            if (flags & p.REM) this.visit(p.REM, (t)=>p.rem.push(t));\n            if (flags & p.MOD) this.visit(p.MOD, (t)=>p.mod.push(t));\n        }\n        return p;\n    },\n    changed (flags) {\n        return this.changes & flags;\n    },\n    modified (_) {\n        const p = this, fields = p.fields;\n        return !(fields && p.changes & p.MOD) ? 0 : (0, _vegaUtil.isArray)(_) ? _.some((f)=>fields[f]) : fields[_];\n    },\n    filter () {\n        (0, _vegaUtil.error)(\"MultiPulse does not support filtering.\");\n    },\n    materialize () {\n        (0, _vegaUtil.error)(\"MultiPulse does not support materialization.\");\n    },\n    visit (flags, visitor) {\n        const p = this, pulses = p.pulses, n = pulses.length;\n        let i = 0;\n        if (flags & p.SOURCE) for(; i < n; ++i)pulses[i].visit(flags, visitor);\n        else {\n            for(; i < n; ++i)if (pulses[i].stamp === p.stamp) pulses[i].visit(flags, visitor);\n        }\n        return p;\n    }\n});\n/* eslint-disable require-atomic-updates */ /**\n * Evaluates the dataflow and returns a Promise that resolves when pulse\n * propagation completes. This method will increment the current timestamp\n * and process all updated, pulsed and touched operators. When invoked for\n * the first time, all registered operators will be processed. This method\n * should not be invoked by third-party clients, use {@link runAsync} or\n * {@link run} instead.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode package.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Promise} - A promise that resolves to this dataflow after\n *   evaluation completes.\n */ async function evaluate(encode, prerun, postrun) {\n    const df = this, async = []; // if the pulse value is set, this is a re-entrant call\n    if (df._pulse) return reentrant(df); // wait for pending datasets to load\n    if (df._pending) await df._pending; // invoke prerun function, if provided\n    if (prerun) await asyncCallback(df, prerun); // exit early if there are no updates\n    if (!df._touched.length) {\n        df.debug(\"Dataflow invoked, but nothing to do.\");\n        return df;\n    } // increment timestamp clock\n    const stamp = ++df._clock; // set the current pulse\n    df._pulse = new Pulse(df, stamp, encode); // initialize priority queue, reset touched operators\n    df._touched.forEach((op)=>df._enqueue(op, true));\n    df._touched = UniqueList((0, _vegaUtil.id));\n    let count = 0, op1, next, error;\n    try {\n        while(df._heap.size() > 0){\n            // dequeue operator with highest priority\n            op1 = df._heap.pop(); // re-queue if rank changed\n            if (op1.rank !== op1.qrank) {\n                df._enqueue(op1, true);\n                continue;\n            } // otherwise, evaluate the operator\n            next = op1.run(df._getPulse(op1, encode));\n            if (next.then) // await if operator returns a promise directly\n            next = await next;\n            else if (next.async) {\n                // queue parallel asynchronous execution\n                async.push(next.async);\n                next = StopPropagation;\n            } // propagate evaluation, enqueue dependent operators\n            if (next !== StopPropagation) {\n                if (op1._targets) op1._targets.forEach((op)=>df._enqueue(op));\n            } // increment visit counter\n            ++count;\n        }\n    } catch (err1) {\n        df._heap.clear();\n        error = err1;\n    } // reset pulse map\n    df._input = {};\n    df._pulse = null;\n    df.debug(`Pulse ${stamp}: ${count} operators`);\n    if (error) {\n        df._postrun = [];\n        df.error(error);\n    } // invoke callbacks queued via runAfter\n    if (df._postrun.length) {\n        const pr = df._postrun.sort((a, b)=>b.priority - a.priority);\n        df._postrun = [];\n        for(let i = 0; i < pr.length; ++i)await asyncCallback(df, pr[i].callback);\n    } // invoke postrun function, if provided\n    if (postrun) await asyncCallback(df, postrun); // handle non-blocking asynchronous callbacks\n    if (async.length) Promise.all(async).then((cb)=>df.runAsync(null, ()=>{\n            cb.forEach((f)=>{\n                try {\n                    f(df);\n                } catch (err) {\n                    df.error(err);\n                }\n            });\n        }));\n    return df;\n}\n/**\n * Queues dataflow evaluation to run once any other queued evaluations have\n * completed and returns a Promise that resolves when the queued pulse\n * propagation completes. If provided, a callback function will be invoked\n * immediately before evaluation commences. This method will ensure a\n * separate evaluation is invoked for each time it is called.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode package.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Promise} - A promise that resolves to this dataflow after\n *   evaluation completes.\n */ async function runAsync(encode, prerun, postrun) {\n    // await previously queued functions\n    while(this._running)await this._running; // run dataflow, manage running promise\n    const clear = ()=>this._running = null;\n    (this._running = this.evaluate(encode, prerun, postrun)).then(clear, clear);\n    return this._running;\n}\n/**\n * Requests dataflow evaluation and the immediately returns this dataflow\n * instance. If there are pending data loading or other asynchronous\n * operations, the dataflow will evaluate asynchronously after this method\n * has been invoked. To track when dataflow evaluation completes, use the\n * {@link runAsync} method instead. This method will raise an error if\n * invoked while the dataflow is already in the midst of evaluation.\n * @param {string} [encode] - The name of an encoding set to invoke during\n *   propagation. This value is added to generated Pulse instances;\n *   operators can then respond to (or ignore) this setting as appropriate.\n *   This parameter can be used in conjunction with the Encode transform in\n *   the vega-encode module.\n * @param {function} [prerun] - An optional callback function to invoke\n *   immediately before dataflow evaluation commences.\n * @param {function} [postrun] - An optional callback function to invoke\n *   after dataflow evaluation completes. The callback will be invoked\n *   after those registered via {@link runAfter}.\n * @return {Dataflow} - This dataflow instance.\n */ function run(encode, prerun, postrun) {\n    return this._pulse ? reentrant(this) : (this.evaluate(encode, prerun, postrun), this);\n}\n/**\n * Schedules a callback function to be invoked after the current pulse\n * propagation completes. If no propagation is currently occurring,\n * the function is invoked immediately. Callbacks scheduled via runAfter\n * are invoked immediately upon completion of the current cycle, before\n * any request queued via runAsync. This method is primarily intended for\n * internal use. Third-party callers using runAfter to schedule a callback\n * that invokes {@link run} or {@link runAsync} should not use this method,\n * but instead use {@link runAsync} with prerun or postrun arguments.\n * @param {function(Dataflow)} callback - The callback function to run.\n *   The callback will be invoked with this Dataflow instance as its\n *   sole argument.\n * @param {boolean} enqueue - A boolean flag indicating that the\n *   callback should be queued up to run after the next propagation\n *   cycle, suppressing immediate invocation when propagation is not\n *   currently occurring.\n * @param {number} [priority] - A priority value used to sort registered\n *   callbacks to determine execution order. This argument is intended\n *   for internal Vega use only.\n */ function runAfter(callback, enqueue1, priority) {\n    if (this._pulse || enqueue1) // pulse propagation is currently running, queue to run after\n    this._postrun.push({\n        priority: priority || 0,\n        callback: callback\n    });\n    else // pulse propagation already complete, invoke immediately\n    try {\n        callback(this);\n    } catch (err) {\n        this.error(err);\n    }\n}\n/**\n * Raise an error for re-entrant dataflow evaluation.\n */ function reentrant(df) {\n    df.error(\"Dataflow already running. Use runAsync() to chain invocations.\");\n    return df;\n}\n/**\n * Enqueue an operator into the priority queue for evaluation. The operator\n * will be enqueued if it has no registered pulse for the current cycle, or if\n * the force argument is true. Upon enqueue, this method also sets the\n * operator's qrank to the current rank value.\n * @param {Operator} op - The operator to enqueue.\n * @param {boolean} [force] - A flag indicating if the operator should be\n *   forceably added to the queue, even if it has already been previously\n *   enqueued during the current pulse propagation. This is useful when the\n *   dataflow graph is dynamically modified and the operator rank changes.\n */ function enqueue(op, force) {\n    const q = op.stamp < this._clock;\n    if (q) op.stamp = this._clock;\n    if (q || force) {\n        op.qrank = op.rank;\n        this._heap.push(op);\n    }\n}\n/**\n * Provide a correct pulse for evaluating an operator. If the operator has an\n * explicit source operator, we will try to pull the pulse(s) from it.\n * If there is an array of source operators, we build a multi-pulse.\n * Otherwise, we return a current pulse with correct source data.\n * If the pulse is the pulse map has an explicit target set, we use that.\n * Else if the pulse on the upstream source operator is current, we use that.\n * Else we use the pulse from the pulse map, but copy the source tuple array.\n * @param {Operator} op - The operator for which to get an input pulse.\n * @param {string} [encode] - An (optional) encoding set name with which to\n *   annotate the returned pulse. See {@link run} for more information.\n */ function getPulse(op, encode) {\n    const s = op.source, stamp = this._clock;\n    return s && (0, _vegaUtil.isArray)(s) ? new MultiPulse(this, stamp, s.map((_)=>_.pulse), encode) : this._input[op.id] || singlePulse(this._pulse, s && s.pulse);\n}\nfunction singlePulse(p, s) {\n    if (s && s.stamp === p.stamp) return s;\n    p = p.fork();\n    if (s && s !== StopPropagation) p.source = s.source;\n    return p;\n}\nconst NO_OPT = {\n    skip: false,\n    force: false\n};\n/**\n * Touches an operator, scheduling it to be evaluated. If invoked outside of\n * a pulse propagation, the operator will be evaluated the next time this\n * dataflow is run. If invoked in the midst of pulse propagation, the operator\n * will be queued for evaluation if and only if the operator has not yet been\n * evaluated on the current propagation timestamp.\n * @param {Operator} op - The operator to touch.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */ function touch(op, options) {\n    const opt = options || NO_OPT;\n    if (this._pulse) // if in midst of propagation, add to priority queue\n    this._enqueue(op);\n    else // otherwise, queue for next propagation\n    this._touched.add(op);\n    if (opt.skip) op.skip(true);\n    return this;\n}\n/**\n * Updates the value of the given operator.\n * @param {Operator} op - The operator to update.\n * @param {*} value - The value to set.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.force] - If true, the operator will\n *   be re-evaluated even if its value has not changed.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */ function update(op, value, options) {\n    const opt = options || NO_OPT;\n    if (op.set(value) || opt.force) this.touch(op, opt);\n    return this;\n}\n/**\n * Pulses an operator with a changeset of tuples. If invoked outside of\n * a pulse propagation, the pulse will be applied the next time this\n * dataflow is run. If invoked in the midst of pulse propagation, the pulse\n * will be added to the set of active pulses and will be applied if and\n * only if the target operator has not yet been evaluated on the current\n * propagation timestamp.\n * @param {Operator} op - The operator to pulse.\n * @param {ChangeSet} value - The tuple changeset to apply.\n * @param {object} [options] - Additional options hash.\n * @param {boolean} [options.skip] - If true, the operator will\n *   be skipped: it will not be evaluated, but its dependents will be.\n * @return {Dataflow}\n */ function pulse(op, changeset1, options) {\n    this.touch(op, options || NO_OPT);\n    const p = new Pulse(this, this._clock + (this._pulse ? 0 : 1)), t = op.pulse && op.pulse.source || [];\n    p.target = op;\n    this._input[op.id] = changeset1.pulse(p, t);\n    return this;\n}\nfunction Heap(cmp) {\n    let nodes = [];\n    return {\n        clear: ()=>nodes = [],\n        size: ()=>nodes.length,\n        peek: ()=>nodes[0],\n        push: (x)=>{\n            nodes.push(x);\n            return siftdown(nodes, 0, nodes.length - 1, cmp);\n        },\n        pop: ()=>{\n            const last = nodes.pop();\n            let item;\n            if (nodes.length) {\n                item = nodes[0];\n                nodes[0] = last;\n                siftup(nodes, 0, cmp);\n            } else item = last;\n            return item;\n        }\n    };\n}\nfunction siftdown(array, start, idx, cmp) {\n    let parent, pidx;\n    const item = array[idx];\n    while(idx > start){\n        pidx = idx - 1 >> 1;\n        parent = array[pidx];\n        if (cmp(item, parent) < 0) {\n            array[idx] = parent;\n            idx = pidx;\n            continue;\n        }\n        break;\n    }\n    return array[idx] = item;\n}\nfunction siftup(array, idx, cmp) {\n    const start = idx, end = array.length, item = array[idx];\n    let cidx = (idx << 1) + 1, ridx;\n    while(cidx < end){\n        ridx = cidx + 1;\n        if (ridx < end && cmp(array[cidx], array[ridx]) >= 0) cidx = ridx;\n        array[idx] = array[cidx];\n        idx = cidx;\n        cidx = (idx << 1) + 1;\n    }\n    array[idx] = item;\n    return siftdown(array, start, idx, cmp);\n}\n/**\n * A dataflow graph for reactive processing of data streams.\n * @constructor\n */ function Dataflow() {\n    this.logger((0, _vegaUtil.logger)());\n    this.logLevel((0, _vegaUtil.Error));\n    this._clock = 0;\n    this._rank = 0;\n    this._locale = (0, _vegaFormat.defaultLocale)();\n    try {\n        this._loader = (0, _vegaLoader.loader)();\n    } catch (e) {}\n    this._touched = UniqueList((0, _vegaUtil.id));\n    this._input = {};\n    this._pulse = null;\n    this._heap = Heap((a, b)=>a.qrank - b.qrank);\n    this._postrun = [];\n}\nfunction logMethod(method) {\n    return function() {\n        return this._log[method].apply(this, arguments);\n    };\n}\nDataflow.prototype = {\n    /**\n   * The current timestamp of this dataflow. This value reflects the\n   * timestamp of the previous dataflow run. The dataflow is initialized\n   * with a stamp value of 0. The initial run of the dataflow will have\n   * a timestap of 1, and so on. This value will match the\n   * {@link Pulse.stamp} property.\n   * @return {number} - The current timestamp value.\n   */ stamp () {\n        return this._clock;\n    },\n    /**\n   * Gets or sets the loader instance to use for data file loading. A\n   * loader object must provide a \"load\" method for loading files and a\n   * \"sanitize\" method for checking URL/filename validity. Both methods\n   * should accept a URI and options hash as arguments, and return a Promise\n   * that resolves to the loaded file contents (load) or a hash containing\n   * sanitized URI data with the sanitized url assigned to the \"href\" property\n   * (sanitize).\n   * @param {object} _ - The loader instance to use.\n   * @return {object|Dataflow} - If no arguments are provided, returns\n   *   the current loader instance. Otherwise returns this Dataflow instance.\n   */ loader (_) {\n        if (arguments.length) {\n            this._loader = _;\n            return this;\n        } else return this._loader;\n    },\n    /**\n   * Gets or sets the locale instance to use for formatting and parsing\n   * string values. The locale object should be provided by the\n   * vega-format library, and include methods such as format, timeFormat,\n   * utcFormat, timeParse, and utcParse.\n   * @param {object} _ - The locale instance to use.\n   * @return {object|Dataflow} - If no arguments are provided, returns\n   *   the current locale instance. Otherwise returns this Dataflow instance.\n   */ locale (_) {\n        if (arguments.length) {\n            this._locale = _;\n            return this;\n        } else return this._locale;\n    },\n    /**\n   * Get or set the logger instance used to log messages. If no arguments are\n   * provided, returns the current logger instance. Otherwise, sets the logger\n   * and return this Dataflow instance. Provided loggers must support the full\n   * API of logger objects generated by the vega-util logger method. Note that\n   * by default the log level of the new logger will be used; use the logLevel\n   * method to adjust the log level as needed.\n   */ logger (logger) {\n        if (arguments.length) {\n            this._log = logger;\n            return this;\n        } else return this._log;\n    },\n    /**\n   * Logs an error message. By default, logged messages are written to console\n   * output. The message will only be logged if the current log level is high\n   * enough to permit error messages.\n   */ error: logMethod(\"error\"),\n    /**\n   * Logs a warning message. By default, logged messages are written to console\n   * output. The message will only be logged if the current log level is high\n   * enough to permit warning messages.\n   */ warn: logMethod(\"warn\"),\n    /**\n   * Logs a information message. By default, logged messages are written to\n   * console output. The message will only be logged if the current log level is\n   * high enough to permit information messages.\n   */ info: logMethod(\"info\"),\n    /**\n   * Logs a debug message. By default, logged messages are written to console\n   * output. The message will only be logged if the current log level is high\n   * enough to permit debug messages.\n   */ debug: logMethod(\"debug\"),\n    /**\n   * Get or set the current log level. If an argument is provided, it\n   * will be used as the new log level.\n   * @param {number} [level] - Should be one of None, Warn, Info\n   * @return {number} - The current log level.\n   */ logLevel: logMethod(\"level\"),\n    /**\n   * Empty entry threshold for garbage cleaning. Map data structures will\n   * perform cleaning once the number of empty entries exceeds this value.\n   */ cleanThreshold: 1e4,\n    // OPERATOR REGISTRATION\n    add,\n    connect,\n    rank,\n    rerank,\n    // OPERATOR UPDATES\n    pulse,\n    touch,\n    update,\n    changeset,\n    // DATA LOADING\n    ingest,\n    parse,\n    preload,\n    request,\n    // EVENT HANDLING\n    events,\n    on,\n    // PULSE PROPAGATION\n    evaluate,\n    run,\n    runAsync,\n    runAfter,\n    _enqueue: enqueue,\n    _getPulse: getPulse\n};\n/**\n * Abstract class for operators that process data tuples.\n * Subclasses must provide a {@link transform} method for operator processing.\n * @constructor\n * @param {*} [init] - The initial value for this operator.\n * @param {object} [params] - The parameters for this operator.\n * @param {Operator} [source] - The operator from which to receive pulses.\n */ function Transform(init, params) {\n    Operator.call(this, init, null, params);\n}\n(0, _vegaUtil.inherits)(Transform, Operator, {\n    /**\n   * Overrides {@link Operator.evaluate} for transform operators.\n   * Internally, this method calls {@link evaluate} to perform processing.\n   * If {@link evaluate} returns a falsy value, the input pulse is returned.\n   * This method should NOT be overridden, instead overrride {@link evaluate}.\n   * @param {Pulse} pulse - the current dataflow pulse.\n   * @return the output pulse for this operator (or StopPropagation)\n   */ run (pulse7) {\n        if (pulse7.stamp < this.stamp) return pulse7.StopPropagation;\n        let rv;\n        if (this.skip()) this.skip(false);\n        else rv = this.evaluate(pulse7);\n        rv = rv || pulse7;\n        if (rv.then) rv = rv.then((_)=>this.pulse = _);\n        else if (rv !== pulse7.StopPropagation) this.pulse = rv;\n        return rv;\n    },\n    /**\n   * Overrides {@link Operator.evaluate} for transform operators.\n   * Marshalls parameter values and then invokes {@link transform}.\n   * @param {Pulse} pulse - the current dataflow pulse.\n   * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n       value (including undefined) will let the input pulse pass through.\n  */ evaluate (pulse8) {\n        const params = this.marshall(pulse8.stamp), out = this.transform(params, pulse8);\n        params.clear();\n        return out;\n    },\n    /**\n   * Process incoming pulses.\n   * Subclasses should override this method to implement transforms.\n   * @param {Parameters} _ - The operator parameter values.\n   * @param {Pulse} pulse - The current dataflow pulse.\n   * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n   *   value (including undefined) will let the input pulse pass through.\n   */ transform () {}\n});\nconst transforms = {};\nfunction definition(type) {\n    const t = transform(type);\n    return t && t.Definition || null;\n}\nfunction transform(type) {\n    type = type && type.toLowerCase();\n    return (0, _vegaUtil.hasOwnProperty)(transforms, type) ? transforms[type] : null;\n}\n\n},{\"vega-util\":\"bApja\",\"vega-loader\":\"gmbOr\",\"vega-format\":\"47kOt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gmbOr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"format\", ()=>format);\nparcelHelpers.export(exports, \"formats\", ()=>formats);\nparcelHelpers.export(exports, \"inferType\", ()=>inferType);\nparcelHelpers.export(exports, \"inferTypes\", ()=>inferTypes);\nparcelHelpers.export(exports, \"loader\", ()=>loader);\nparcelHelpers.export(exports, \"read\", ()=>read);\nparcelHelpers.export(exports, \"responseType\", ()=>responseType);\nparcelHelpers.export(exports, \"typeParsers\", ()=>typeParsers);\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Dsv = require(\"d3-dsv\");\nvar _topojsonClient = require(\"topojson-client\");\nvar _vegaFormat = require(\"vega-format\");\nvar Buffer = require(\"buffer\").Buffer;\n//   https://...    file://...    //...\nconst protocol_re = /^(data:|([A-Za-z]+:)?\\/\\/)/; // Matches allowed URIs. From https://github.com/cure53/DOMPurify/blob/master/src/regexp.js with added file://\nconst allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i; // eslint-disable-line no-useless-escape\nconst whitespace_re = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205f\\u3000]/g; // eslint-disable-line no-control-regex\n// Special treatment in node.js for the file: protocol\nconst fileProtocol = \"file://\";\n/**\n * Factory for a loader constructor that provides methods for requesting\n * files from either the network or disk, and for sanitizing request URIs.\n * @param {function} fetch - The Fetch API for HTTP network requests.\n *   If null or undefined, HTTP loading will be disabled.\n * @param {object} fs - The file system interface for file loading.\n *   If null or undefined, local file loading will be disabled.\n * @return {function} A loader constructor with the following signature:\n *   param {object} [options] - Optional default loading options to use.\n *   return {object} - A new loader instance.\n */ function loaderFactory(fetch, fs) {\n    return (options)=>({\n            options: options || {},\n            sanitize: sanitize,\n            load: load,\n            fileAccess: !!fs,\n            file: fileLoader(fs),\n            http: httpLoader(fetch)\n        });\n}\n/**\n * Load an external resource, typically either from the web or from the local\n * filesystem. This function uses {@link sanitize} to first sanitize the uri,\n * then calls either {@link http} (for web requests) or {@link file} (for\n * filesystem loading).\n * @param {string} uri - The resource indicator (e.g., URL or filename).\n * @param {object} [options] - Optional loading options. These options will\n *   override any existing default options.\n * @return {Promise} - A promise that resolves to the loaded content.\n */ async function load(uri, options) {\n    const opt = await this.sanitize(uri, options), url = opt.href;\n    return opt.localFile ? this.file(url) : this.http(url, options);\n}\n/**\n * URI sanitizer function.\n * @param {string} uri - The uri (url or filename) to check.\n * @param {object} options - An options hash.\n * @return {Promise} - A promise that resolves to an object containing\n *  sanitized uri data, or rejects it the input uri is deemed invalid.\n *  The properties of the resolved object are assumed to be\n *  valid attributes for an HTML 'a' tag. The sanitized uri *must* be\n *  provided by the 'href' property of the returned object.\n */ async function sanitize(uri, options) {\n    options = (0, _vegaUtil.extend)({}, this.options, options);\n    const fileAccess = this.fileAccess, result = {\n        href: null\n    };\n    let isFile, loadFile, base;\n    const isAllowed = allowed_re.test(uri.replace(whitespace_re, \"\"));\n    if (uri == null || typeof uri !== \"string\" || !isAllowed) (0, _vegaUtil.error)(\"Sanitize failure, invalid URI: \" + (0, _vegaUtil.stringValue)(uri));\n    const hasProtocol = protocol_re.test(uri); // if relative url (no protocol/host), prepend baseURL\n    if ((base = options.baseURL) && !hasProtocol) {\n        // Ensure that there is a slash between the baseURL (e.g. hostname) and url\n        if (!uri.startsWith(\"/\") && !base.endsWith(\"/\")) uri = \"/\" + uri;\n        uri = base + uri;\n    } // should we load from file system?\n    loadFile = (isFile = uri.startsWith(fileProtocol)) || options.mode === \"file\" || options.mode !== \"http\" && !hasProtocol && fileAccess;\n    if (isFile) // strip file protocol\n    uri = uri.slice(fileProtocol.length);\n    else if (uri.startsWith(\"//\")) {\n        if (options.defaultProtocol === \"file\") {\n            // if is file, strip protocol and set loadFile flag\n            uri = uri.slice(2);\n            loadFile = true;\n        } else // if relative protocol (starts with '//'), prepend default protocol\n        uri = (options.defaultProtocol || \"http\") + \":\" + uri;\n    } // set non-enumerable mode flag to indicate local file load\n    Object.defineProperty(result, \"localFile\", {\n        value: !!loadFile\n    }); // set uri\n    result.href = uri; // set default result target, if specified\n    if (options.target) result.target = options.target + \"\";\n     // set default result rel, if specified (#1542)\n    if (options.rel) result.rel = options.rel + \"\";\n     // provide control over cross-origin image handling (#2238)\n    // https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image\n    if (options.context === \"image\" && options.crossOrigin) result.crossOrigin = options.crossOrigin + \"\";\n     // return\n    return result;\n}\n/**\n * File system loader factory.\n * @param {object} fs - The file system interface.\n * @return {function} - A file loader with the following signature:\n *   param {string} filename - The file system path to load.\n *   param {string} filename - The file system path to load.\n *   return {Promise} A promise that resolves to the file contents.\n */ function fileLoader(fs) {\n    return fs ? (filename)=>new Promise((accept, reject)=>{\n            fs.readFile(filename, (error, data)=>{\n                if (error) reject(error);\n                else accept(data);\n            });\n        }) : fileReject;\n}\n/**\n * Default file system loader that simply rejects.\n */ async function fileReject() {\n    (0, _vegaUtil.error)(\"No file system access.\");\n}\n/**\n * HTTP request handler factory.\n * @param {function} fetch - The Fetch API method.\n * @return {function} - An http loader with the following signature:\n *   param {string} url - The url to request.\n *   param {object} options - An options hash.\n *   return {Promise} - A promise that resolves to the file contents.\n */ function httpLoader(fetch) {\n    return fetch ? async function(url, options) {\n        const opt = (0, _vegaUtil.extend)({}, this.options.http, options), type = options && options.response, response = await fetch(url, opt);\n        return !response.ok ? (0, _vegaUtil.error)(response.status + \"\" + response.statusText) : (0, _vegaUtil.isFunction)(response[type]) ? response[type]() : response.text();\n    } : httpReject;\n}\n/**\n * Default http request handler that simply rejects.\n */ async function httpReject() {\n    (0, _vegaUtil.error)(\"No HTTP fetch method available.\");\n}\nconst isValid = (_)=>_ != null && _ === _;\nconst isBoolean = (_)=>_ === \"true\" || _ === \"false\" || _ === true || _ === false;\nconst isDate = (_)=>!Number.isNaN(Date.parse(_));\nconst isNumber = (_)=>!Number.isNaN(+_) && !(_ instanceof Date);\nconst isInteger = (_)=>isNumber(_) && Number.isInteger(+_);\nconst typeParsers = {\n    boolean: (0, _vegaUtil.toBoolean),\n    integer: (0, _vegaUtil.toNumber),\n    number: (0, _vegaUtil.toNumber),\n    date: (0, _vegaUtil.toDate),\n    string: (0, _vegaUtil.toString),\n    unknown: (0, _vegaUtil.identity)\n};\nconst typeTests = [\n    isBoolean,\n    isInteger,\n    isNumber,\n    isDate\n];\nconst typeList = [\n    \"boolean\",\n    \"integer\",\n    \"number\",\n    \"date\"\n];\nfunction inferType(values, field) {\n    if (!values || !values.length) return \"unknown\";\n    const n = values.length, m = typeTests.length, a = typeTests.map((_, i)=>i + 1);\n    for(let i1 = 0, t = 0, j, value; i1 < n; ++i1){\n        value = field ? values[i1][field] : values[i1];\n        for(j = 0; j < m; ++j)if (a[j] && isValid(value) && !typeTests[j](value)) {\n            a[j] = 0;\n            ++t;\n            if (t === typeTests.length) return \"string\";\n        }\n    }\n    return typeList[a.reduce((u, v)=>u === 0 ? v : u, 0) - 1];\n}\nfunction inferTypes(data, fields) {\n    return fields.reduce((types, field)=>{\n        types[field] = inferType(data, field);\n        return types;\n    }, {});\n}\nfunction delimitedFormat(delimiter) {\n    const parse1 = function(data, format1) {\n        const delim = {\n            delimiter: delimiter\n        };\n        return dsv(data, format1 ? (0, _vegaUtil.extend)(format1, delim) : delim);\n    };\n    parse1.responseType = \"text\";\n    return parse1;\n}\nfunction dsv(data, format2) {\n    if (format2.header) data = format2.header.map((0, _vegaUtil.stringValue)).join(format2.delimiter) + \"\\n\" + data;\n    return (0, _d3Dsv.dsvFormat)(format2.delimiter).parse(data + \"\");\n}\ndsv.responseType = \"text\";\nfunction isBuffer(_) {\n    return typeof Buffer === \"function\" && (0, _vegaUtil.isFunction)(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;\n}\nfunction json(data, format3) {\n    const prop = format3 && format3.property ? (0, _vegaUtil.field)(format3.property) : (0, _vegaUtil.identity);\n    return (0, _vegaUtil.isObject)(data) && !isBuffer(data) ? parseJSON(prop(data), format3) : prop(JSON.parse(data));\n}\njson.responseType = \"json\";\nfunction parseJSON(data, format4) {\n    if (!(0, _vegaUtil.isArray)(data) && (0, _vegaUtil.isIterable)(data)) data = [\n        ...data\n    ];\n    return format4 && format4.copy ? JSON.parse(JSON.stringify(data)) : data;\n}\nconst filters = {\n    interior: (a, b)=>a !== b,\n    exterior: (a, b)=>a === b\n};\nfunction topojson(data, format5) {\n    let method, object, property, filter;\n    data = json(data, format5);\n    if (format5 && format5.feature) {\n        method = (0, _topojsonClient.feature);\n        property = format5.feature;\n    } else if (format5 && format5.mesh) {\n        method = (0, _topojsonClient.mesh);\n        property = format5.mesh;\n        filter = filters[format5.filter];\n    } else (0, _vegaUtil.error)(\"Missing TopoJSON feature or mesh parameter.\");\n    object = (object = data.objects[property]) ? method(data, object, filter) : (0, _vegaUtil.error)(\"Invalid TopoJSON object: \" + property);\n    return object && object.features || [\n        object\n    ];\n}\ntopojson.responseType = \"json\";\nconst format = {\n    dsv: dsv,\n    csv: delimitedFormat(\",\"),\n    tsv: delimitedFormat(\"\t\"),\n    json: json,\n    topojson: topojson\n};\nfunction formats(name, reader) {\n    if (arguments.length > 1) {\n        format[name] = reader;\n        return this;\n    } else return (0, _vegaUtil.hasOwnProperty)(format, name) ? format[name] : null;\n}\nfunction responseType(type) {\n    const f = formats(type);\n    return f && f.responseType || \"text\";\n}\nfunction read(data, schema, timeParser, utcParser) {\n    schema = schema || {};\n    const reader = formats(schema.type || \"json\");\n    if (!reader) (0, _vegaUtil.error)(\"Unknown data format type: \" + schema.type);\n    data = reader(data, schema);\n    if (schema.parse) parse(data, schema.parse, timeParser, utcParser);\n    if ((0, _vegaUtil.hasOwnProperty)(data, \"columns\")) delete data.columns;\n    return data;\n}\nfunction parse(data, types, timeParser, utcParser) {\n    if (!data.length) return; // early exit for empty data\n    const locale = (0, _vegaFormat.timeFormatDefaultLocale)();\n    timeParser = timeParser || locale.timeParse;\n    utcParser = utcParser || locale.utcParse;\n    let fields = data.columns || Object.keys(data[0]), datum, field1, i, j, n, m;\n    if (types === \"auto\") types = inferTypes(data, fields);\n    fields = Object.keys(types);\n    const parsers = fields.map((field)=>{\n        const type = types[field];\n        let parts, pattern;\n        if (type && (type.startsWith(\"date:\") || type.startsWith(\"utc:\"))) {\n            parts = type.split(/:(.+)?/, 2); // split on first :\n            pattern = parts[1];\n            if (pattern[0] === \"'\" && pattern[pattern.length - 1] === \"'\" || pattern[0] === '\"' && pattern[pattern.length - 1] === '\"') pattern = pattern.slice(1, -1);\n            const parse2 = parts[0] === \"utc\" ? utcParser : timeParser;\n            return parse2(pattern);\n        }\n        if (!typeParsers[type]) throw Error(\"Illegal format pattern: \" + field + \":\" + type);\n        return typeParsers[type];\n    });\n    for(i = 0, n = data.length, m = fields.length; i < n; ++i){\n        datum = data[i];\n        for(j = 0; j < m; ++j){\n            field1 = fields[j];\n            datum[field1] = parsers[j](datum[field1]);\n        }\n    }\n}\nconst loader = loaderFactory(typeof fetch !== \"undefined\" && fetch, null // no file system access\n);\n\n},{\"vega-util\":\"bApja\",\"d3-dsv\":\"70Sp2\",\"topojson-client\":\"aKIOa\",\"vega-format\":\"47kOt\",\"buffer\":\"2axoo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"70Sp2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dsvFormat\", ()=>(0, _dsvJsDefault.default));\nparcelHelpers.export(exports, \"csvParse\", ()=>(0, _csvJs.csvParse));\nparcelHelpers.export(exports, \"csvParseRows\", ()=>(0, _csvJs.csvParseRows));\nparcelHelpers.export(exports, \"csvFormat\", ()=>(0, _csvJs.csvFormat));\nparcelHelpers.export(exports, \"csvFormatBody\", ()=>(0, _csvJs.csvFormatBody));\nparcelHelpers.export(exports, \"csvFormatRows\", ()=>(0, _csvJs.csvFormatRows));\nparcelHelpers.export(exports, \"csvFormatRow\", ()=>(0, _csvJs.csvFormatRow));\nparcelHelpers.export(exports, \"csvFormatValue\", ()=>(0, _csvJs.csvFormatValue));\nparcelHelpers.export(exports, \"tsvParse\", ()=>(0, _tsvJs.tsvParse));\nparcelHelpers.export(exports, \"tsvParseRows\", ()=>(0, _tsvJs.tsvParseRows));\nparcelHelpers.export(exports, \"tsvFormat\", ()=>(0, _tsvJs.tsvFormat));\nparcelHelpers.export(exports, \"tsvFormatBody\", ()=>(0, _tsvJs.tsvFormatBody));\nparcelHelpers.export(exports, \"tsvFormatRows\", ()=>(0, _tsvJs.tsvFormatRows));\nparcelHelpers.export(exports, \"tsvFormatRow\", ()=>(0, _tsvJs.tsvFormatRow));\nparcelHelpers.export(exports, \"tsvFormatValue\", ()=>(0, _tsvJs.tsvFormatValue));\nparcelHelpers.export(exports, \"autoType\", ()=>(0, _autoTypeJsDefault.default));\nvar _dsvJs = require(\"./dsv.js\");\nvar _dsvJsDefault = parcelHelpers.interopDefault(_dsvJs);\nvar _csvJs = require(\"./csv.js\");\nvar _tsvJs = require(\"./tsv.js\");\nvar _autoTypeJs = require(\"./autoType.js\");\nvar _autoTypeJsDefault = parcelHelpers.interopDefault(_autoTypeJs);\n\n},{\"./dsv.js\":\"fRZim\",\"./csv.js\":false,\"./tsv.js\":false,\"./autoType.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fRZim\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar EOL = {}, EOF = {}, QUOTE = 34, NEWLINE = 10, RETURN = 13;\nfunction objectConverter(columns) {\n    return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n        return JSON.stringify(name) + \": d[\" + i + '] || \"\"';\n    }).join(\",\") + \"}\");\n}\nfunction customConverter(columns, f) {\n    var object = objectConverter(columns);\n    return function(row, i) {\n        return f(object(row), i, columns);\n    };\n}\n// Compute unique columns in order of discovery.\nfunction inferColumns(rows) {\n    var columnSet = Object.create(null), columns = [];\n    rows.forEach(function(row) {\n        for(var column in row)if (!(column in columnSet)) columns.push(columnSet[column] = column);\n    });\n    return columns;\n}\nfunction pad(value, width) {\n    var s = value + \"\", length = s.length;\n    return length < width ? new Array(width - length + 1).join(0) + s : s;\n}\nfunction formatYear(year) {\n    return year < 0 ? \"-\" + pad(-year, 6) : year > 9999 ? \"+\" + pad(year, 6) : pad(year, 4);\n}\nfunction formatDate(date) {\n    var hours = date.getUTCHours(), minutes = date.getUTCMinutes(), seconds = date.getUTCSeconds(), milliseconds = date.getUTCMilliseconds();\n    return isNaN(date) ? \"Invalid Date\" : formatYear(date.getUTCFullYear(), 4) + \"-\" + pad(date.getUTCMonth() + 1, 2) + \"-\" + pad(date.getUTCDate(), 2) + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\" : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\" : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\" : \"\");\n}\nexports.default = function(delimiter) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n\\r]\"), DELIMITER = delimiter.charCodeAt(0);\n    function parse(text, f) {\n        var convert, columns, rows = parseRows(text, function(row, i) {\n            if (convert) return convert(row, i - 1);\n            columns = row, convert = f ? customConverter(row, f) : objectConverter(row);\n        });\n        rows.columns = columns || [];\n        return rows;\n    }\n    function parseRows(text, f) {\n        var rows = [], N = text.length, I = 0, n = 0, t, eof = N <= 0, eol = false; // current token followed by EOL?\n        // Strip the trailing newline.\n        if (text.charCodeAt(N - 1) === NEWLINE) --N;\n        if (text.charCodeAt(N - 1) === RETURN) --N;\n        function token() {\n            if (eof) return EOF;\n            if (eol) return eol = false, EOL;\n            // Unescape quotes.\n            var i, j = I, c;\n            if (text.charCodeAt(j) === QUOTE) {\n                while((I++) < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);\n                if ((i = I) >= N) eof = true;\n                else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;\n                else if (c === RETURN) {\n                    eol = true;\n                    if (text.charCodeAt(I) === NEWLINE) ++I;\n                }\n                return text.slice(j + 1, i - 1).replace(/\"\"/g, '\"');\n            }\n            // Find next delimiter or newline.\n            while(I < N){\n                if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;\n                else if (c === RETURN) {\n                    eol = true;\n                    if (text.charCodeAt(I) === NEWLINE) ++I;\n                } else if (c !== DELIMITER) continue;\n                return text.slice(j, i);\n            }\n            // Return last token before EOF.\n            return eof = true, text.slice(j, N);\n        }\n        while((t = token()) !== EOF){\n            var row = [];\n            while(t !== EOL && t !== EOF)row.push(t), t = token();\n            if (f && (row = f(row, n++)) == null) continue;\n            rows.push(row);\n        }\n        return rows;\n    }\n    function preformatBody(rows, columns) {\n        return rows.map(function(row) {\n            return columns.map(function(column) {\n                return formatValue(row[column]);\n            }).join(delimiter);\n        });\n    }\n    function format(rows, columns) {\n        if (columns == null) columns = inferColumns(rows);\n        return [\n            columns.map(formatValue).join(delimiter)\n        ].concat(preformatBody(rows, columns)).join(\"\\n\");\n    }\n    function formatBody(rows, columns) {\n        if (columns == null) columns = inferColumns(rows);\n        return preformatBody(rows, columns).join(\"\\n\");\n    }\n    function formatRows(rows) {\n        return rows.map(formatRow).join(\"\\n\");\n    }\n    function formatRow(row) {\n        return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(value) {\n        return value == null ? \"\" : value instanceof Date ? formatDate(value) : reFormat.test(value += \"\") ? '\"' + value.replace(/\"/g, '\"\"') + '\"' : value;\n    }\n    return {\n        parse: parse,\n        parseRows: parseRows,\n        format: format,\n        formatBody: formatBody,\n        formatRows: formatRows,\n        formatRow: formatRow,\n        formatValue: formatValue\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aKIOa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bbox\", ()=>(0, _bboxJsDefault.default));\nparcelHelpers.export(exports, \"feature\", ()=>(0, _featureJsDefault.default));\nparcelHelpers.export(exports, \"mesh\", ()=>(0, _meshJsDefault.default));\nparcelHelpers.export(exports, \"meshArcs\", ()=>(0, _meshJs.meshArcs));\nparcelHelpers.export(exports, \"merge\", ()=>(0, _mergeJsDefault.default));\nparcelHelpers.export(exports, \"mergeArcs\", ()=>(0, _mergeJs.mergeArcs));\nparcelHelpers.export(exports, \"neighbors\", ()=>(0, _neighborsJsDefault.default));\nparcelHelpers.export(exports, \"quantize\", ()=>(0, _quantizeJsDefault.default));\nparcelHelpers.export(exports, \"transform\", ()=>(0, _transformJsDefault.default));\nparcelHelpers.export(exports, \"untransform\", ()=>(0, _untransformJsDefault.default));\nvar _bboxJs = require(\"./bbox.js\");\nvar _bboxJsDefault = parcelHelpers.interopDefault(_bboxJs);\nvar _featureJs = require(\"./feature.js\");\nvar _featureJsDefault = parcelHelpers.interopDefault(_featureJs);\nvar _meshJs = require(\"./mesh.js\");\nvar _meshJsDefault = parcelHelpers.interopDefault(_meshJs);\nvar _mergeJs = require(\"./merge.js\");\nvar _mergeJsDefault = parcelHelpers.interopDefault(_mergeJs);\nvar _neighborsJs = require(\"./neighbors.js\");\nvar _neighborsJsDefault = parcelHelpers.interopDefault(_neighborsJs);\nvar _quantizeJs = require(\"./quantize.js\");\nvar _quantizeJsDefault = parcelHelpers.interopDefault(_quantizeJs);\nvar _transformJs = require(\"./transform.js\");\nvar _transformJsDefault = parcelHelpers.interopDefault(_transformJs);\nvar _untransformJs = require(\"./untransform.js\");\nvar _untransformJsDefault = parcelHelpers.interopDefault(_untransformJs);\n\n},{\"./bbox.js\":\"e3LWp\",\"./feature.js\":\"6K0pm\",\"./mesh.js\":\"k2dDp\",\"./merge.js\":\"7l4hb\",\"./neighbors.js\":\"9d2MJ\",\"./quantize.js\":\"kXipT\",\"./transform.js\":\"ToH0M\",\"./untransform.js\":\"6T4yq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e3LWp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _transformJs = require(\"./transform.js\");\nvar _transformJsDefault = parcelHelpers.interopDefault(_transformJs);\nexports.default = function(topology) {\n    var t = (0, _transformJsDefault.default)(topology.transform), key, x0 = Infinity, y0 = x0, x1 = -x0, y1 = -x0;\n    function bboxPoint(p) {\n        p = t(p);\n        if (p[0] < x0) x0 = p[0];\n        if (p[0] > x1) x1 = p[0];\n        if (p[1] < y0) y0 = p[1];\n        if (p[1] > y1) y1 = p[1];\n    }\n    function bboxGeometry(o) {\n        switch(o.type){\n            case \"GeometryCollection\":\n                o.geometries.forEach(bboxGeometry);\n                break;\n            case \"Point\":\n                bboxPoint(o.coordinates);\n                break;\n            case \"MultiPoint\":\n                o.coordinates.forEach(bboxPoint);\n                break;\n        }\n    }\n    topology.arcs.forEach(function(arc) {\n        var i = -1, n = arc.length, p;\n        while(++i < n){\n            p = t(arc[i], i);\n            if (p[0] < x0) x0 = p[0];\n            if (p[0] > x1) x1 = p[0];\n            if (p[1] < y0) y0 = p[1];\n            if (p[1] > y1) y1 = p[1];\n        }\n    });\n    for(key in topology.objects)bboxGeometry(topology.objects[key]);\n    return [\n        x0,\n        y0,\n        x1,\n        y1\n    ];\n};\n\n},{\"./transform.js\":\"ToH0M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ToH0M\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nexports.default = function(transform) {\n    if (transform == null) return 0, _identityJsDefault.default;\n    var x0, y0, kx = transform.scale[0], ky = transform.scale[1], dx = transform.translate[0], dy = transform.translate[1];\n    return function(input, i) {\n        if (!i) x0 = y0 = 0;\n        var j = 2, n = input.length, output = new Array(n);\n        output[0] = (x0 += input[0]) * kx + dx;\n        output[1] = (y0 += input[1]) * ky + dy;\n        while(j < n)output[j] = input[j], ++j;\n        return output;\n    };\n};\n\n},{\"./identity.js\":\"dZ2Lk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dZ2Lk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return x;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6K0pm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"object\", ()=>object);\nvar _reverseJs = require(\"./reverse.js\");\nvar _reverseJsDefault = parcelHelpers.interopDefault(_reverseJs);\nvar _transformJs = require(\"./transform.js\");\nvar _transformJsDefault = parcelHelpers.interopDefault(_transformJs);\nexports.default = function(topology, o1) {\n    if (typeof o1 === \"string\") o1 = topology.objects[o1];\n    return o1.type === \"GeometryCollection\" ? {\n        type: \"FeatureCollection\",\n        features: o1.geometries.map(function(o) {\n            return feature(topology, o);\n        })\n    } : feature(topology, o1);\n};\nfunction feature(topology, o) {\n    var id = o.id, bbox = o.bbox, properties = o.properties == null ? {} : o.properties, geometry = object(topology, o);\n    return id == null && bbox == null ? {\n        type: \"Feature\",\n        properties: properties,\n        geometry: geometry\n    } : bbox == null ? {\n        type: \"Feature\",\n        id: id,\n        properties: properties,\n        geometry: geometry\n    } : {\n        type: \"Feature\",\n        id: id,\n        bbox: bbox,\n        properties: properties,\n        geometry: geometry\n    };\n}\nfunction object(topology, o2) {\n    var transformPoint = (0, _transformJsDefault.default)(topology.transform), arcs1 = topology.arcs;\n    function arc(i, points) {\n        if (points.length) points.pop();\n        for(var a = arcs1[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k)points.push(transformPoint(a[k], k));\n        if (i < 0) (0, _reverseJsDefault.default)(points, n);\n    }\n    function point(p) {\n        return transformPoint(p);\n    }\n    function line(arcs) {\n        var points = [];\n        for(var i = 0, n = arcs.length; i < n; ++i)arc(arcs[i], points);\n        if (points.length < 2) points.push(points[0]); // This should never happen per the specification.\n        return points;\n    }\n    function ring(arcs) {\n        var points = line(arcs);\n        while(points.length < 4)points.push(points[0]); // This may happen if an arc has only two points.\n        return points;\n    }\n    function polygon(arcs) {\n        return arcs.map(ring);\n    }\n    function geometry(o) {\n        var type = o.type, coordinates;\n        switch(type){\n            case \"GeometryCollection\":\n                return {\n                    type: type,\n                    geometries: o.geometries.map(geometry)\n                };\n            case \"Point\":\n                coordinates = point(o.coordinates);\n                break;\n            case \"MultiPoint\":\n                coordinates = o.coordinates.map(point);\n                break;\n            case \"LineString\":\n                coordinates = line(o.arcs);\n                break;\n            case \"MultiLineString\":\n                coordinates = o.arcs.map(line);\n                break;\n            case \"Polygon\":\n                coordinates = polygon(o.arcs);\n                break;\n            case \"MultiPolygon\":\n                coordinates = o.arcs.map(polygon);\n                break;\n            default:\n                return null;\n        }\n        return {\n            type: type,\n            coordinates: coordinates\n        };\n    }\n    return geometry(o2);\n}\n\n},{\"./reverse.js\":\"7nB9v\",\"./transform.js\":\"ToH0M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7nB9v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(array, n) {\n    var t, j = array.length, i = j - n;\n    while(i < --j)t = array[i], array[i++] = array[j], array[j] = t;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k2dDp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"meshArcs\", ()=>meshArcs);\nvar _featureJs = require(\"./feature.js\");\nvar _stitchJs = require(\"./stitch.js\");\nvar _stitchJsDefault = parcelHelpers.interopDefault(_stitchJs);\nexports.default = function(topology) {\n    return (0, _featureJs.object)(topology, meshArcs.apply(this, arguments));\n};\nfunction meshArcs(topology, object, filter) {\n    var arcs, i, n;\n    if (arguments.length > 1) arcs = extractArcs(topology, object, filter);\n    else for(i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i)arcs[i] = i;\n    return {\n        type: \"MultiLineString\",\n        arcs: (0, _stitchJsDefault.default)(topology, arcs)\n    };\n}\nfunction extractArcs(topology, object, filter) {\n    var arcs1 = [], geomsByArc = [], geom;\n    function extract0(i) {\n        var j = i < 0 ? ~i : i;\n        (geomsByArc[j] || (geomsByArc[j] = [])).push({\n            i: i,\n            g: geom\n        });\n    }\n    function extract1(arcs) {\n        arcs.forEach(extract0);\n    }\n    function extract2(arcs) {\n        arcs.forEach(extract1);\n    }\n    function extract3(arcs) {\n        arcs.forEach(extract2);\n    }\n    function geometry(o) {\n        switch(geom = o, o.type){\n            case \"GeometryCollection\":\n                o.geometries.forEach(geometry);\n                break;\n            case \"LineString\":\n                extract1(o.arcs);\n                break;\n            case \"MultiLineString\":\n            case \"Polygon\":\n                extract2(o.arcs);\n                break;\n            case \"MultiPolygon\":\n                extract3(o.arcs);\n                break;\n        }\n    }\n    geometry(object);\n    geomsByArc.forEach(filter == null ? function(geoms) {\n        arcs1.push(geoms[0].i);\n    } : function(geoms) {\n        if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs1.push(geoms[0].i);\n    });\n    return arcs1;\n}\n\n},{\"./feature.js\":\"6K0pm\",\"./stitch.js\":\"26mb3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"26mb3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(topology, arcs) {\n    var stitchedArcs = {}, fragmentByStart1 = {}, fragmentByEnd1 = {}, fragments = [], emptyIndex = -1;\n    // Stitch empty arcs first, since they may be subsumed by other arcs.\n    arcs.forEach(function(i, j) {\n        var arc = topology.arcs[i < 0 ? ~i : i], t;\n        if (arc.length < 3 && !arc[1][0] && !arc[1][1]) t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n    });\n    arcs.forEach(function(i) {\n        var e = ends(i), start = e[0], end = e[1], f, g;\n        if (f = fragmentByEnd1[start]) {\n            delete fragmentByEnd1[f.end];\n            f.push(i);\n            f.end = end;\n            if (g = fragmentByStart1[end]) {\n                delete fragmentByStart1[g.start];\n                var fg = g === f ? f : f.concat(g);\n                fragmentByStart1[fg.start = f.start] = fragmentByEnd1[fg.end = g.end] = fg;\n            } else fragmentByStart1[f.start] = fragmentByEnd1[f.end] = f;\n        } else if (f = fragmentByStart1[end]) {\n            delete fragmentByStart1[f.start];\n            f.unshift(i);\n            f.start = start;\n            if (g = fragmentByEnd1[start]) {\n                delete fragmentByEnd1[g.end];\n                var gf = g === f ? f : g.concat(f);\n                fragmentByStart1[gf.start = g.start] = fragmentByEnd1[gf.end = f.end] = gf;\n            } else fragmentByStart1[f.start] = fragmentByEnd1[f.end] = f;\n        } else {\n            f = [\n                i\n            ];\n            fragmentByStart1[f.start = start] = fragmentByEnd1[f.end = end] = f;\n        }\n    });\n    function ends(i) {\n        var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n        if (topology.transform) p1 = [\n            0,\n            0\n        ], arc.forEach(function(dp) {\n            p1[0] += dp[0], p1[1] += dp[1];\n        });\n        else p1 = arc[arc.length - 1];\n        return i < 0 ? [\n            p1,\n            p0\n        ] : [\n            p0,\n            p1\n        ];\n    }\n    function flush(fragmentByEnd, fragmentByStart) {\n        for(var k in fragmentByEnd){\n            var f = fragmentByEnd[k];\n            delete fragmentByStart[f.start];\n            delete f.start;\n            delete f.end;\n            f.forEach(function(i) {\n                stitchedArcs[i < 0 ? ~i : i] = 1;\n            });\n            fragments.push(f);\n        }\n    }\n    flush(fragmentByEnd1, fragmentByStart1);\n    flush(fragmentByStart1, fragmentByEnd1);\n    arcs.forEach(function(i) {\n        if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([\n            i\n        ]);\n    });\n    return fragments;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7l4hb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mergeArcs\", ()=>mergeArcs);\nvar _featureJs = require(\"./feature.js\");\nvar _stitchJs = require(\"./stitch.js\");\nvar _stitchJsDefault = parcelHelpers.interopDefault(_stitchJs);\nfunction planarRingArea(ring) {\n    var i = -1, n = ring.length, a, b = ring[n - 1], area = 0;\n    while(++i < n)a = b, b = ring[i], area += a[0] * b[1] - a[1] * b[0];\n    return Math.abs(area); // Note: doubled area!\n}\nexports.default = function(topology) {\n    return (0, _featureJs.object)(topology, mergeArcs.apply(this, arguments));\n};\nfunction mergeArcs(topology, objects) {\n    var polygonsByArc = {}, polygons1 = [], groups = [];\n    objects.forEach(geometry);\n    function geometry(o) {\n        switch(o.type){\n            case \"GeometryCollection\":\n                o.geometries.forEach(geometry);\n                break;\n            case \"Polygon\":\n                extract(o.arcs);\n                break;\n            case \"MultiPolygon\":\n                o.arcs.forEach(extract);\n                break;\n        }\n    }\n    function extract(polygon) {\n        polygon.forEach(function(ring) {\n            ring.forEach(function(arc) {\n                (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n            });\n        });\n        polygons1.push(polygon);\n    }\n    function area(ring) {\n        return planarRingArea((0, _featureJs.object)(topology, {\n            type: \"Polygon\",\n            arcs: [\n                ring\n            ]\n        }).coordinates[0]);\n    }\n    polygons1.forEach(function(polygon1) {\n        if (!polygon1._) {\n            var group = [], neighbors = [\n                polygon1\n            ];\n            polygon1._ = 1;\n            groups.push(group);\n            while(polygon1 = neighbors.pop()){\n                group.push(polygon1);\n                polygon1.forEach(function(ring) {\n                    ring.forEach(function(arc) {\n                        polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n                            if (!polygon._) {\n                                polygon._ = 1;\n                                neighbors.push(polygon);\n                            }\n                        });\n                    });\n                });\n            }\n        }\n    });\n    polygons1.forEach(function(polygon) {\n        delete polygon._;\n    });\n    return {\n        type: \"MultiPolygon\",\n        arcs: groups.map(function(polygons) {\n            var arcs = [], n;\n            // Extract the exterior (unique) arcs.\n            polygons.forEach(function(polygon) {\n                polygon.forEach(function(ring) {\n                    ring.forEach(function(arc) {\n                        if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) arcs.push(arc);\n                    });\n                });\n            });\n            // Stitch the arcs into one or more rings.\n            arcs = (0, _stitchJsDefault.default)(topology, arcs);\n            // If more than one ring is returned,\n            // at most one of these rings can be the exterior;\n            // choose the one with the greatest absolute area.\n            if ((n = arcs.length) > 1) {\n                for(var i = 1, k = area(arcs[0]), ki, t; i < n; ++i)if ((ki = area(arcs[i])) > k) t = arcs[0], arcs[0] = arcs[i], arcs[i] = t, k = ki;\n            }\n            return arcs;\n        }).filter(function(arcs) {\n            return arcs.length > 0;\n        })\n    };\n}\n\n},{\"./feature.js\":\"6K0pm\",\"./stitch.js\":\"26mb3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9d2MJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _bisectJs = require(\"./bisect.js\");\nvar _bisectJsDefault = parcelHelpers.interopDefault(_bisectJs);\nexports.default = function(objects) {\n    var indexesByArc = {}, neighbors = objects.map(function() {\n        return [];\n    });\n    function line(arcs, i) {\n        arcs.forEach(function(a) {\n            if (a < 0) a = ~a;\n            var o = indexesByArc[a];\n            if (o) o.push(i);\n            else indexesByArc[a] = [\n                i\n            ];\n        });\n    }\n    function polygon(arcs, i) {\n        arcs.forEach(function(arc) {\n            line(arc, i);\n        });\n    }\n    function geometry(o1, i) {\n        if (o1.type === \"GeometryCollection\") o1.geometries.forEach(function(o) {\n            geometry(o, i);\n        });\n        else if (o1.type in geometryType) geometryType[o1.type](o1.arcs, i);\n    }\n    var geometryType = {\n        LineString: line,\n        MultiLineString: polygon,\n        Polygon: polygon,\n        MultiPolygon: function(arcs, i) {\n            arcs.forEach(function(arc) {\n                polygon(arc, i);\n            });\n        }\n    };\n    objects.forEach(geometry);\n    for(var i1 in indexesByArc){\n        for(var indexes = indexesByArc[i1], m = indexes.length, j = 0; j < m; ++j)for(var k = j + 1; k < m; ++k){\n            var ij = indexes[j], ik = indexes[k], n;\n            if ((n = neighbors[ij])[i1 = (0, _bisectJsDefault.default)(n, ik)] !== ik) n.splice(i1, 0, ik);\n            if ((n = neighbors[ik])[i1 = (0, _bisectJsDefault.default)(n, ij)] !== ij) n.splice(i1, 0, ij);\n        }\n    }\n    return neighbors;\n};\n\n},{\"./bisect.js\":\"lbTH3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lbTH3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, x) {\n    var lo = 0, hi = a.length;\n    while(lo < hi){\n        var mid = lo + hi >>> 1;\n        if (a[mid] < x) lo = mid + 1;\n        else hi = mid;\n    }\n    return lo;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kXipT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _bboxJs = require(\"./bbox.js\");\nvar _bboxJsDefault = parcelHelpers.interopDefault(_bboxJs);\nvar _untransformJs = require(\"./untransform.js\");\nvar _untransformJsDefault = parcelHelpers.interopDefault(_untransformJs);\nexports.default = function(topology, transform) {\n    if (topology.transform) throw new Error(\"already quantized\");\n    if (!transform || !transform.scale) {\n        if (!((n = Math.floor(transform)) >= 2)) throw new Error(\"n must be \\u22652\");\n        box = topology.bbox || (0, _bboxJsDefault.default)(topology);\n        var x0 = box[0], y0 = box[1], x1 = box[2], y1 = box[3], n;\n        transform = {\n            scale: [\n                x1 - x0 ? (x1 - x0) / (n - 1) : 1,\n                y1 - y0 ? (y1 - y0) / (n - 1) : 1\n            ],\n            translate: [\n                x0,\n                y0\n            ]\n        };\n    } else box = topology.bbox;\n    var t = (0, _untransformJsDefault.default)(transform), box, key, inputs = topology.objects, outputs = {};\n    function quantizePoint(point) {\n        return t(point);\n    }\n    function quantizeGeometry(input) {\n        var output;\n        switch(input.type){\n            case \"GeometryCollection\":\n                output = {\n                    type: \"GeometryCollection\",\n                    geometries: input.geometries.map(quantizeGeometry)\n                };\n                break;\n            case \"Point\":\n                output = {\n                    type: \"Point\",\n                    coordinates: quantizePoint(input.coordinates)\n                };\n                break;\n            case \"MultiPoint\":\n                output = {\n                    type: \"MultiPoint\",\n                    coordinates: input.coordinates.map(quantizePoint)\n                };\n                break;\n            default:\n                return input;\n        }\n        if (input.id != null) output.id = input.id;\n        if (input.bbox != null) output.bbox = input.bbox;\n        if (input.properties != null) output.properties = input.properties;\n        return output;\n    }\n    function quantizeArc(input) {\n        var i = 0, j = 1, n = input.length, p, output = new Array(n); // pessimistic\n        output[0] = t(input[0], 0);\n        while(++i < n)if ((p = t(input[i], i))[0] || p[1]) output[j++] = p; // non-coincident points\n        if (j === 1) output[j++] = [\n            0,\n            0\n        ]; // an arc must have at least two points\n        output.length = j;\n        return output;\n    }\n    for(key in inputs)outputs[key] = quantizeGeometry(inputs[key]);\n    return {\n        type: \"Topology\",\n        bbox: box,\n        transform: transform,\n        objects: outputs,\n        arcs: topology.arcs.map(quantizeArc)\n    };\n};\n\n},{\"./bbox.js\":\"e3LWp\",\"./untransform.js\":\"6T4yq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6T4yq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nexports.default = function(transform) {\n    if (transform == null) return 0, _identityJsDefault.default;\n    var x0, y0, kx = transform.scale[0], ky = transform.scale[1], dx = transform.translate[0], dy = transform.translate[1];\n    return function(input, i) {\n        if (!i) x0 = y0 = 0;\n        var j = 2, n = input.length, output = new Array(n), x1 = Math.round((input[0] - dx) / kx), y1 = Math.round((input[1] - dy) / ky);\n        output[0] = x1 - x0, x0 = x1;\n        output[1] = y1 - y0, y0 = y1;\n        while(j < n)output[j] = input[j], ++j;\n        return output;\n    };\n};\n\n},{\"./identity.js\":\"dZ2Lk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"47kOt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultLocale\", ()=>defaultLocale);\nparcelHelpers.export(exports, \"locale\", ()=>locale);\nparcelHelpers.export(exports, \"numberFormatDefaultLocale\", ()=>numberFormatDefaultLocale);\nparcelHelpers.export(exports, \"numberFormatLocale\", ()=>numberFormatLocale);\nparcelHelpers.export(exports, \"resetDefaultLocale\", ()=>resetDefaultLocale);\nparcelHelpers.export(exports, \"resetNumberFormatDefaultLocale\", ()=>resetNumberFormatDefaultLocale);\nparcelHelpers.export(exports, \"resetTimeFormatDefaultLocale\", ()=>resetTimeFormatDefaultLocale);\nparcelHelpers.export(exports, \"timeFormatDefaultLocale\", ()=>timeFormatDefaultLocale);\nparcelHelpers.export(exports, \"timeFormatLocale\", ()=>timeFormatLocale);\nvar _d3Array = require(\"d3-array\");\nvar _d3Format = require(\"d3-format\");\nvar _vegaTime = require(\"vega-time\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3TimeFormat = require(\"d3-time-format\");\nfunction memoize(method) {\n    const cache = {};\n    return (spec)=>cache[spec] || (cache[spec] = method(spec));\n}\nfunction trimZeroes(numberFormat, decimalChar) {\n    return (x)=>{\n        const str = numberFormat(x), dec = str.indexOf(decimalChar);\n        if (dec < 0) return str;\n        let idx = rightmostDigit(str, dec);\n        const end = idx < str.length ? str.slice(idx) : \"\";\n        while(--idx > dec)if (str[idx] !== \"0\") {\n            ++idx;\n            break;\n        }\n        return str.slice(0, idx) + end;\n    };\n}\nfunction rightmostDigit(str, dec) {\n    let i = str.lastIndexOf(\"e\"), c;\n    if (i > 0) return i;\n    for(i = str.length; --i > dec;){\n        c = str.charCodeAt(i);\n        if (c >= 48 && c <= 57) return i + 1; // is digit\n    }\n}\nfunction numberLocale(locale1) {\n    const format = memoize(locale1.format), formatPrefix = locale1.formatPrefix;\n    return {\n        format,\n        formatPrefix,\n        formatFloat (spec) {\n            const s = (0, _d3Format.formatSpecifier)(spec || \",\");\n            if (s.precision == null) {\n                s.precision = 12;\n                switch(s.type){\n                    case \"%\":\n                        s.precision -= 2;\n                        break;\n                    case \"e\":\n                        s.precision -= 1;\n                        break;\n                }\n                return trimZeroes(format(s), format(\".1f\")(1)[1] // decimal point character\n                );\n            } else return format(s);\n        },\n        formatSpan (start, stop, count, specifier) {\n            specifier = (0, _d3Format.formatSpecifier)(specifier == null ? \",f\" : specifier);\n            const step = (0, _d3Array.tickStep)(start, stop, count), value = Math.max(Math.abs(start), Math.abs(stop));\n            let precision;\n            if (specifier.precision == null) switch(specifier.type){\n                case \"s\":\n                    if (!isNaN(precision = (0, _d3Format.precisionPrefix)(step, value))) specifier.precision = precision;\n                    return formatPrefix(specifier, value);\n                case \"\":\n                case \"e\":\n                case \"g\":\n                case \"p\":\n                case \"r\":\n                    if (!isNaN(precision = (0, _d3Format.precisionRound)(step, value))) specifier.precision = precision - (specifier.type === \"e\");\n                    break;\n                case \"f\":\n                case \"%\":\n                    if (!isNaN(precision = (0, _d3Format.precisionFixed)(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n                    break;\n            }\n            return format(specifier);\n        }\n    };\n}\nlet defaultNumberLocale;\nresetNumberFormatDefaultLocale();\nfunction resetNumberFormatDefaultLocale() {\n    return defaultNumberLocale = numberLocale({\n        format: (0, _d3Format.format),\n        formatPrefix: (0, _d3Format.formatPrefix)\n    });\n}\nfunction numberFormatLocale(definition) {\n    return numberLocale((0, _d3Format.formatLocale)(definition));\n}\nfunction numberFormatDefaultLocale(definition) {\n    return arguments.length ? defaultNumberLocale = numberFormatLocale(definition) : defaultNumberLocale;\n}\nfunction timeMultiFormat(format, interval, spec) {\n    spec = spec || {};\n    if (!(0, _vegaUtil.isObject)(spec)) (0, _vegaUtil.error)(\"Invalid time multi-format specifier: \".concat(spec));\n    const second = interval((0, _vegaTime.SECONDS)), minute = interval((0, _vegaTime.MINUTES)), hour = interval((0, _vegaTime.HOURS)), day = interval((0, _vegaTime.DATE)), week = interval((0, _vegaTime.WEEK)), month = interval((0, _vegaTime.MONTH)), quarter = interval((0, _vegaTime.QUARTER)), year = interval((0, _vegaTime.YEAR)), L = format(spec[0, _vegaTime.MILLISECONDS] || \".%L\"), S = format(spec[0, _vegaTime.SECONDS] || \":%S\"), M = format(spec[0, _vegaTime.MINUTES] || \"%I:%M\"), H = format(spec[0, _vegaTime.HOURS] || \"%I %p\"), d = format(spec[0, _vegaTime.DATE] || spec[0, _vegaTime.DAY] || \"%a %d\"), w = format(spec[0, _vegaTime.WEEK] || \"%b %d\"), m = format(spec[0, _vegaTime.MONTH] || \"%B\"), q = format(spec[0, _vegaTime.QUARTER] || \"%B\"), y = format(spec[0, _vegaTime.YEAR] || \"%Y\");\n    return (date)=>(second(date) < date ? L : minute(date) < date ? S : hour(date) < date ? M : day(date) < date ? H : month(date) < date ? week(date) < date ? d : w : year(date) < date ? quarter(date) < date ? m : q : y)(date);\n}\nfunction timeLocale(locale2) {\n    const timeFormat = memoize(locale2.format), utcFormat = memoize(locale2.utcFormat);\n    return {\n        timeFormat: (spec)=>(0, _vegaUtil.isString)(spec) ? timeFormat(spec) : timeMultiFormat(timeFormat, (0, _vegaTime.timeInterval), spec),\n        utcFormat: (spec)=>(0, _vegaUtil.isString)(spec) ? utcFormat(spec) : timeMultiFormat(utcFormat, (0, _vegaTime.utcInterval), spec),\n        timeParse: memoize(locale2.parse),\n        utcParse: memoize(locale2.utcParse)\n    };\n}\nlet defaultTimeLocale;\nresetTimeFormatDefaultLocale();\nfunction resetTimeFormatDefaultLocale() {\n    return defaultTimeLocale = timeLocale({\n        format: (0, _d3TimeFormat.timeFormat),\n        parse: (0, _d3TimeFormat.timeParse),\n        utcFormat: (0, _d3TimeFormat.utcFormat),\n        utcParse: (0, _d3TimeFormat.utcParse)\n    });\n}\nfunction timeFormatLocale(definition) {\n    return timeLocale((0, _d3TimeFormat.timeFormatLocale)(definition));\n}\nfunction timeFormatDefaultLocale(definition) {\n    return arguments.length ? defaultTimeLocale = timeFormatLocale(definition) : defaultTimeLocale;\n}\nconst createLocale = (number, time)=>(0, _vegaUtil.extend)({}, number, time);\nfunction locale(numberSpec, timeSpec) {\n    const number = numberSpec ? numberFormatLocale(numberSpec) : numberFormatDefaultLocale();\n    const time = timeSpec ? timeFormatLocale(timeSpec) : timeFormatDefaultLocale();\n    return createLocale(number, time);\n}\nfunction defaultLocale(numberSpec, timeSpec) {\n    const args = arguments.length;\n    if (args && args !== 2) (0, _vegaUtil.error)(\"defaultLocale expects either zero or two arguments.\");\n    return args ? createLocale(numberFormatDefaultLocale(numberSpec), timeFormatDefaultLocale(timeSpec)) : createLocale(numberFormatDefaultLocale(), timeFormatDefaultLocale());\n}\nfunction resetDefaultLocale() {\n    resetNumberFormatDefaultLocale();\n    resetTimeFormatDefaultLocale();\n    return defaultLocale();\n}\n\n},{\"d3-array\":\"6IwJG\",\"d3-format\":\"8dYFL\",\"vega-time\":\"27kpp\",\"vega-util\":\"bApja\",\"d3-time-format\":\"242jH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6IwJG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bisect\", ()=>(0, _bisectJsDefault.default));\nparcelHelpers.export(exports, \"bisectRight\", ()=>(0, _bisectJs.bisectRight));\nparcelHelpers.export(exports, \"bisectLeft\", ()=>(0, _bisectJs.bisectLeft));\nparcelHelpers.export(exports, \"bisectCenter\", ()=>(0, _bisectJs.bisectCenter));\nparcelHelpers.export(exports, \"ascending\", ()=>(0, _ascendingJsDefault.default));\nparcelHelpers.export(exports, \"bisector\", ()=>(0, _bisectorJsDefault.default));\nparcelHelpers.export(exports, \"count\", ()=>(0, _countJsDefault.default));\nparcelHelpers.export(exports, \"cross\", ()=>(0, _crossJsDefault.default));\nparcelHelpers.export(exports, \"cumsum\", ()=>(0, _cumsumJsDefault.default));\nparcelHelpers.export(exports, \"descending\", ()=>(0, _descendingJsDefault.default));\nparcelHelpers.export(exports, \"deviation\", ()=>(0, _deviationJsDefault.default));\nparcelHelpers.export(exports, \"extent\", ()=>(0, _extentJsDefault.default));\nparcelHelpers.export(exports, \"Adder\", ()=>(0, _fsumJs.Adder));\nparcelHelpers.export(exports, \"fsum\", ()=>(0, _fsumJs.fsum));\nparcelHelpers.export(exports, \"fcumsum\", ()=>(0, _fsumJs.fcumsum));\nparcelHelpers.export(exports, \"group\", ()=>(0, _groupJsDefault.default));\nparcelHelpers.export(exports, \"groups\", ()=>(0, _groupJs.groups));\nparcelHelpers.export(exports, \"index\", ()=>(0, _groupJs.index));\nparcelHelpers.export(exports, \"indexes\", ()=>(0, _groupJs.indexes));\nparcelHelpers.export(exports, \"rollup\", ()=>(0, _groupJs.rollup));\nparcelHelpers.export(exports, \"rollups\", ()=>(0, _groupJs.rollups));\nparcelHelpers.export(exports, \"groupSort\", ()=>(0, _groupSortJsDefault.default));\nparcelHelpers.export(exports, \"bin\", ()=>(0, _binJsDefault.default)) // Deprecated; use bin.\n;\nparcelHelpers.export(exports, \"histogram\", ()=>(0, _binJsDefault.default));\nparcelHelpers.export(exports, \"thresholdFreedmanDiaconis\", ()=>(0, _freedmanDiaconisJsDefault.default));\nparcelHelpers.export(exports, \"thresholdScott\", ()=>(0, _scottJsDefault.default));\nparcelHelpers.export(exports, \"thresholdSturges\", ()=>(0, _sturgesJsDefault.default));\nparcelHelpers.export(exports, \"max\", ()=>(0, _maxJsDefault.default));\nparcelHelpers.export(exports, \"maxIndex\", ()=>(0, _maxIndexJsDefault.default));\nparcelHelpers.export(exports, \"mean\", ()=>(0, _meanJsDefault.default));\nparcelHelpers.export(exports, \"median\", ()=>(0, _medianJsDefault.default));\nparcelHelpers.export(exports, \"merge\", ()=>(0, _mergeJsDefault.default));\nparcelHelpers.export(exports, \"min\", ()=>(0, _minJsDefault.default));\nparcelHelpers.export(exports, \"minIndex\", ()=>(0, _minIndexJsDefault.default));\nparcelHelpers.export(exports, \"nice\", ()=>(0, _niceJsDefault.default));\nparcelHelpers.export(exports, \"pairs\", ()=>(0, _pairsJsDefault.default));\nparcelHelpers.export(exports, \"permute\", ()=>(0, _permuteJsDefault.default));\nparcelHelpers.export(exports, \"quantile\", ()=>(0, _quantileJsDefault.default));\nparcelHelpers.export(exports, \"quantileSorted\", ()=>(0, _quantileJs.quantileSorted));\nparcelHelpers.export(exports, \"quickselect\", ()=>(0, _quickselectJsDefault.default));\nparcelHelpers.export(exports, \"range\", ()=>(0, _rangeJsDefault.default));\nparcelHelpers.export(exports, \"least\", ()=>(0, _leastJsDefault.default));\nparcelHelpers.export(exports, \"leastIndex\", ()=>(0, _leastIndexJsDefault.default));\nparcelHelpers.export(exports, \"greatest\", ()=>(0, _greatestJsDefault.default));\nparcelHelpers.export(exports, \"greatestIndex\", ()=>(0, _greatestIndexJsDefault.default));\nparcelHelpers.export(exports, \"scan\", ()=>(0, _scanJsDefault.default)) // Deprecated; use leastIndex.\n;\nparcelHelpers.export(exports, \"shuffle\", ()=>(0, _shuffleJsDefault.default));\nparcelHelpers.export(exports, \"shuffler\", ()=>(0, _shuffleJs.shuffler));\nparcelHelpers.export(exports, \"sum\", ()=>(0, _sumJsDefault.default));\nparcelHelpers.export(exports, \"ticks\", ()=>(0, _ticksJsDefault.default));\nparcelHelpers.export(exports, \"tickIncrement\", ()=>(0, _ticksJs.tickIncrement));\nparcelHelpers.export(exports, \"tickStep\", ()=>(0, _ticksJs.tickStep));\nparcelHelpers.export(exports, \"transpose\", ()=>(0, _transposeJsDefault.default));\nparcelHelpers.export(exports, \"variance\", ()=>(0, _varianceJsDefault.default));\nparcelHelpers.export(exports, \"zip\", ()=>(0, _zipJsDefault.default));\nparcelHelpers.export(exports, \"every\", ()=>(0, _everyJsDefault.default));\nparcelHelpers.export(exports, \"some\", ()=>(0, _someJsDefault.default));\nparcelHelpers.export(exports, \"filter\", ()=>(0, _filterJsDefault.default));\nparcelHelpers.export(exports, \"map\", ()=>(0, _mapJsDefault.default));\nparcelHelpers.export(exports, \"reduce\", ()=>(0, _reduceJsDefault.default));\nparcelHelpers.export(exports, \"reverse\", ()=>(0, _reverseJsDefault.default));\nparcelHelpers.export(exports, \"sort\", ()=>(0, _sortJsDefault.default));\nparcelHelpers.export(exports, \"difference\", ()=>(0, _differenceJsDefault.default));\nparcelHelpers.export(exports, \"disjoint\", ()=>(0, _disjointJsDefault.default));\nparcelHelpers.export(exports, \"intersection\", ()=>(0, _intersectionJsDefault.default));\nparcelHelpers.export(exports, \"subset\", ()=>(0, _subsetJsDefault.default));\nparcelHelpers.export(exports, \"superset\", ()=>(0, _supersetJsDefault.default));\nparcelHelpers.export(exports, \"union\", ()=>(0, _unionJsDefault.default));\nparcelHelpers.export(exports, \"InternMap\", ()=>(0, _internmap.InternMap));\nparcelHelpers.export(exports, \"InternSet\", ()=>(0, _internmap.InternSet));\nvar _bisectJs = require(\"./bisect.js\");\nvar _bisectJsDefault = parcelHelpers.interopDefault(_bisectJs);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nvar _bisectorJs = require(\"./bisector.js\");\nvar _bisectorJsDefault = parcelHelpers.interopDefault(_bisectorJs);\nvar _countJs = require(\"./count.js\");\nvar _countJsDefault = parcelHelpers.interopDefault(_countJs);\nvar _crossJs = require(\"./cross.js\");\nvar _crossJsDefault = parcelHelpers.interopDefault(_crossJs);\nvar _cumsumJs = require(\"./cumsum.js\");\nvar _cumsumJsDefault = parcelHelpers.interopDefault(_cumsumJs);\nvar _descendingJs = require(\"./descending.js\");\nvar _descendingJsDefault = parcelHelpers.interopDefault(_descendingJs);\nvar _deviationJs = require(\"./deviation.js\");\nvar _deviationJsDefault = parcelHelpers.interopDefault(_deviationJs);\nvar _extentJs = require(\"./extent.js\");\nvar _extentJsDefault = parcelHelpers.interopDefault(_extentJs);\nvar _fsumJs = require(\"./fsum.js\");\nvar _groupJs = require(\"./group.js\");\nvar _groupJsDefault = parcelHelpers.interopDefault(_groupJs);\nvar _groupSortJs = require(\"./groupSort.js\");\nvar _groupSortJsDefault = parcelHelpers.interopDefault(_groupSortJs);\nvar _binJs = require(\"./bin.js\");\nvar _binJsDefault = parcelHelpers.interopDefault(_binJs);\nvar _freedmanDiaconisJs = require(\"./threshold/freedmanDiaconis.js\");\nvar _freedmanDiaconisJsDefault = parcelHelpers.interopDefault(_freedmanDiaconisJs);\nvar _scottJs = require(\"./threshold/scott.js\");\nvar _scottJsDefault = parcelHelpers.interopDefault(_scottJs);\nvar _sturgesJs = require(\"./threshold/sturges.js\");\nvar _sturgesJsDefault = parcelHelpers.interopDefault(_sturgesJs);\nvar _maxJs = require(\"./max.js\");\nvar _maxJsDefault = parcelHelpers.interopDefault(_maxJs);\nvar _maxIndexJs = require(\"./maxIndex.js\");\nvar _maxIndexJsDefault = parcelHelpers.interopDefault(_maxIndexJs);\nvar _meanJs = require(\"./mean.js\");\nvar _meanJsDefault = parcelHelpers.interopDefault(_meanJs);\nvar _medianJs = require(\"./median.js\");\nvar _medianJsDefault = parcelHelpers.interopDefault(_medianJs);\nvar _mergeJs = require(\"./merge.js\");\nvar _mergeJsDefault = parcelHelpers.interopDefault(_mergeJs);\nvar _minJs = require(\"./min.js\");\nvar _minJsDefault = parcelHelpers.interopDefault(_minJs);\nvar _minIndexJs = require(\"./minIndex.js\");\nvar _minIndexJsDefault = parcelHelpers.interopDefault(_minIndexJs);\nvar _niceJs = require(\"./nice.js\");\nvar _niceJsDefault = parcelHelpers.interopDefault(_niceJs);\nvar _pairsJs = require(\"./pairs.js\");\nvar _pairsJsDefault = parcelHelpers.interopDefault(_pairsJs);\nvar _permuteJs = require(\"./permute.js\");\nvar _permuteJsDefault = parcelHelpers.interopDefault(_permuteJs);\nvar _quantileJs = require(\"./quantile.js\");\nvar _quantileJsDefault = parcelHelpers.interopDefault(_quantileJs);\nvar _quickselectJs = require(\"./quickselect.js\");\nvar _quickselectJsDefault = parcelHelpers.interopDefault(_quickselectJs);\nvar _rangeJs = require(\"./range.js\");\nvar _rangeJsDefault = parcelHelpers.interopDefault(_rangeJs);\nvar _leastJs = require(\"./least.js\");\nvar _leastJsDefault = parcelHelpers.interopDefault(_leastJs);\nvar _leastIndexJs = require(\"./leastIndex.js\");\nvar _leastIndexJsDefault = parcelHelpers.interopDefault(_leastIndexJs);\nvar _greatestJs = require(\"./greatest.js\");\nvar _greatestJsDefault = parcelHelpers.interopDefault(_greatestJs);\nvar _greatestIndexJs = require(\"./greatestIndex.js\");\nvar _greatestIndexJsDefault = parcelHelpers.interopDefault(_greatestIndexJs);\nvar _scanJs = require(\"./scan.js\");\nvar _scanJsDefault = parcelHelpers.interopDefault(_scanJs);\nvar _shuffleJs = require(\"./shuffle.js\");\nvar _shuffleJsDefault = parcelHelpers.interopDefault(_shuffleJs);\nvar _sumJs = require(\"./sum.js\");\nvar _sumJsDefault = parcelHelpers.interopDefault(_sumJs);\nvar _ticksJs = require(\"./ticks.js\");\nvar _ticksJsDefault = parcelHelpers.interopDefault(_ticksJs);\nvar _transposeJs = require(\"./transpose.js\");\nvar _transposeJsDefault = parcelHelpers.interopDefault(_transposeJs);\nvar _varianceJs = require(\"./variance.js\");\nvar _varianceJsDefault = parcelHelpers.interopDefault(_varianceJs);\nvar _zipJs = require(\"./zip.js\");\nvar _zipJsDefault = parcelHelpers.interopDefault(_zipJs);\nvar _everyJs = require(\"./every.js\");\nvar _everyJsDefault = parcelHelpers.interopDefault(_everyJs);\nvar _someJs = require(\"./some.js\");\nvar _someJsDefault = parcelHelpers.interopDefault(_someJs);\nvar _filterJs = require(\"./filter.js\");\nvar _filterJsDefault = parcelHelpers.interopDefault(_filterJs);\nvar _mapJs = require(\"./map.js\");\nvar _mapJsDefault = parcelHelpers.interopDefault(_mapJs);\nvar _reduceJs = require(\"./reduce.js\");\nvar _reduceJsDefault = parcelHelpers.interopDefault(_reduceJs);\nvar _reverseJs = require(\"./reverse.js\");\nvar _reverseJsDefault = parcelHelpers.interopDefault(_reverseJs);\nvar _sortJs = require(\"./sort.js\");\nvar _sortJsDefault = parcelHelpers.interopDefault(_sortJs);\nvar _differenceJs = require(\"./difference.js\");\nvar _differenceJsDefault = parcelHelpers.interopDefault(_differenceJs);\nvar _disjointJs = require(\"./disjoint.js\");\nvar _disjointJsDefault = parcelHelpers.interopDefault(_disjointJs);\nvar _intersectionJs = require(\"./intersection.js\");\nvar _intersectionJsDefault = parcelHelpers.interopDefault(_intersectionJs);\nvar _subsetJs = require(\"./subset.js\");\nvar _subsetJsDefault = parcelHelpers.interopDefault(_subsetJs);\nvar _supersetJs = require(\"./superset.js\");\nvar _supersetJsDefault = parcelHelpers.interopDefault(_supersetJs);\nvar _unionJs = require(\"./union.js\");\nvar _unionJsDefault = parcelHelpers.interopDefault(_unionJs);\nvar _internmap = require(\"internmap\");\n\n},{\"./bisect.js\":\"iJojn\",\"./ascending.js\":\"60o1Z\",\"./bisector.js\":\"k5JwJ\",\"./count.js\":false,\"./cross.js\":false,\"./cumsum.js\":false,\"./descending.js\":false,\"./deviation.js\":\"euifj\",\"./extent.js\":false,\"./fsum.js\":\"g7Aa0\",\"./group.js\":false,\"./groupSort.js\":false,\"./bin.js\":false,\"./threshold/freedmanDiaconis.js\":false,\"./threshold/scott.js\":false,\"./threshold/sturges.js\":false,\"./max.js\":\"5fCPh\",\"./maxIndex.js\":false,\"./mean.js\":\"8HbAa\",\"./median.js\":\"ai1Kc\",\"./merge.js\":\"d56l7\",\"./min.js\":\"h0RAg\",\"./minIndex.js\":false,\"./nice.js\":false,\"./pairs.js\":false,\"./permute.js\":\"3ydIg\",\"./quantile.js\":\"49cDh\",\"./quickselect.js\":\"doA4Q\",\"./range.js\":\"7QVPN\",\"./least.js\":false,\"./leastIndex.js\":false,\"./greatest.js\":false,\"./greatestIndex.js\":false,\"./scan.js\":false,\"./shuffle.js\":false,\"./sum.js\":\"hdZOC\",\"./ticks.js\":\"71MAh\",\"./transpose.js\":false,\"./variance.js\":\"gba1Y\",\"./zip.js\":false,\"./every.js\":false,\"./some.js\":false,\"./filter.js\":false,\"./map.js\":false,\"./reduce.js\":false,\"./reverse.js\":false,\"./sort.js\":false,\"./difference.js\":false,\"./disjoint.js\":false,\"./intersection.js\":false,\"./subset.js\":false,\"./superset.js\":false,\"./union.js\":false,\"internmap\":\"3ULAv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iJojn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bisectRight\", ()=>bisectRight);\nparcelHelpers.export(exports, \"bisectLeft\", ()=>bisectLeft);\nparcelHelpers.export(exports, \"bisectCenter\", ()=>bisectCenter);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nvar _bisectorJs = require(\"./bisector.js\");\nvar _bisectorJsDefault = parcelHelpers.interopDefault(_bisectorJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nconst ascendingBisect = (0, _bisectorJsDefault.default)((0, _ascendingJsDefault.default));\nconst bisectRight = ascendingBisect.right;\nconst bisectLeft = ascendingBisect.left;\nconst bisectCenter = (0, _bisectorJsDefault.default)((0, _numberJsDefault.default)).center;\nexports.default = bisectRight;\n\n},{\"./ascending.js\":\"60o1Z\",\"./bisector.js\":\"k5JwJ\",\"./number.js\":\"gcMRK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"60o1Z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k5JwJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nexports.default = function(f) {\n    let delta = f;\n    let compare = f;\n    if (f.length === 1) {\n        delta = (d, x)=>f(d) - x;\n        compare = ascendingComparator(f);\n    }\n    function left(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while(lo < hi){\n            const mid = lo + hi >>> 1;\n            if (compare(a[mid], x) < 0) lo = mid + 1;\n            else hi = mid;\n        }\n        return lo;\n    }\n    function right(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        while(lo < hi){\n            const mid = lo + hi >>> 1;\n            if (compare(a[mid], x) > 0) hi = mid;\n            else lo = mid + 1;\n        }\n        return lo;\n    }\n    function center(a, x, lo, hi) {\n        if (lo == null) lo = 0;\n        if (hi == null) hi = a.length;\n        const i = left(a, x, lo, hi - 1);\n        return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n    }\n    return {\n        left,\n        center,\n        right\n    };\n};\nfunction ascendingComparator(f) {\n    return (d, x)=>(0, _ascendingJsDefault.default)(f(d), x);\n}\n\n},{\"./ascending.js\":\"60o1Z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gcMRK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"numbers\", ()=>numbers);\nexports.default = function(x) {\n    return x === null ? NaN : +x;\n};\nfunction* numbers(values, valueof) {\n    if (valueof === undefined) {\n        for (let value of values)if (value != null && (value = +value) >= value) yield value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) yield value;\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"euifj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _varianceJs = require(\"./variance.js\");\nvar _varianceJsDefault = parcelHelpers.interopDefault(_varianceJs);\nfunction deviation(values, valueof) {\n    const v = (0, _varianceJsDefault.default)(values, valueof);\n    return v ? Math.sqrt(v) : v;\n}\nexports.default = deviation;\n\n},{\"./variance.js\":\"gba1Y\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gba1Y\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction variance(values, valueof) {\n    let count = 0;\n    let delta;\n    let mean = 0;\n    let sum = 0;\n    if (valueof === undefined) {\n        for (let value of values)if (value != null && (value = +value) >= value) {\n            delta = value - mean;\n            mean += delta / ++count;\n            sum += delta * (value - mean);\n        }\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n            delta = value - mean;\n            mean += delta / ++count;\n            sum += delta * (value - mean);\n        }\n    }\n    if (count > 1) return sum / (count - 1);\n}\nexports.default = variance;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g7Aa0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423\nparcelHelpers.export(exports, \"Adder\", ()=>Adder);\nparcelHelpers.export(exports, \"fsum\", ()=>fsum);\nparcelHelpers.export(exports, \"fcumsum\", ()=>fcumsum);\nclass Adder {\n    constructor(){\n        this._partials = new Float64Array(32);\n        this._n = 0;\n    }\n    add(x) {\n        const p = this._partials;\n        let i = 0;\n        for(let j = 0; j < this._n && j < 32; j++){\n            const y = p[j], hi = x + y, lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x);\n            if (lo) p[i++] = lo;\n            x = hi;\n        }\n        p[i] = x;\n        this._n = i + 1;\n        return this;\n    }\n    valueOf() {\n        const p = this._partials;\n        let n = this._n, x, y, lo, hi = 0;\n        if (n > 0) {\n            hi = p[--n];\n            while(n > 0){\n                x = hi;\n                y = p[--n];\n                hi = x + y;\n                lo = y - (hi - x);\n                if (lo) break;\n            }\n            if (n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0)) {\n                y = lo * 2;\n                x = hi + y;\n                if (y == x - hi) hi = x;\n            }\n        }\n        return hi;\n    }\n}\nfunction fsum(values, valueof) {\n    const adder = new Adder();\n    if (valueof === undefined) {\n        for (let value of values)if (value = +value) adder.add(value);\n    } else {\n        let index = -1;\n        for (let value of values)if (value = +valueof(value, ++index, values)) adder.add(value);\n    }\n    return +adder;\n}\nfunction fcumsum(values, valueof) {\n    const adder = new Adder();\n    let index = -1;\n    return Float64Array.from(values, valueof === undefined ? (v)=>adder.add(+v || 0) : (v)=>adder.add(+valueof(v, ++index, values) || 0));\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5fCPh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction max(values, valueof) {\n    let max1;\n    if (valueof === undefined) {\n        for (const value of values)if (value != null && (max1 < value || max1 === undefined && value >= value)) max1 = value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (max1 < value || max1 === undefined && value >= value)) max1 = value;\n    }\n    return max1;\n}\nexports.default = max;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8HbAa\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction mean(values, valueof) {\n    let count = 0;\n    let sum = 0;\n    if (valueof === undefined) {\n        for (let value of values)if (value != null && (value = +value) >= value) ++count, sum += value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) ++count, sum += value;\n    }\n    if (count) return sum / count;\n}\nexports.default = mean;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ai1Kc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _quantileJs = require(\"./quantile.js\");\nvar _quantileJsDefault = parcelHelpers.interopDefault(_quantileJs);\nexports.default = function(values, valueof) {\n    return (0, _quantileJsDefault.default)(values, 0.5, valueof);\n};\n\n},{\"./quantile.js\":\"49cDh\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"49cDh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"quantileSorted\", ()=>quantileSorted);\nvar _maxJs = require(\"./max.js\");\nvar _maxJsDefault = parcelHelpers.interopDefault(_maxJs);\nvar _minJs = require(\"./min.js\");\nvar _minJsDefault = parcelHelpers.interopDefault(_minJs);\nvar _quickselectJs = require(\"./quickselect.js\");\nvar _quickselectJsDefault = parcelHelpers.interopDefault(_quickselectJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nfunction quantile(values, p, valueof) {\n    values = Float64Array.from((0, _numberJs.numbers)(values, valueof));\n    if (!(n = values.length)) return;\n    if ((p = +p) <= 0 || n < 2) return (0, _minJsDefault.default)(values);\n    if (p >= 1) return (0, _maxJsDefault.default)(values);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = (0, _maxJsDefault.default)((0, _quickselectJsDefault.default)(values, i0).subarray(0, i0 + 1)), value1 = (0, _minJsDefault.default)(values.subarray(i0 + 1));\n    return value0 + (value1 - value0) * (i - i0);\n}\nexports.default = quantile;\nfunction quantileSorted(values, p, valueof = (0, _numberJsDefault.default)) {\n    if (!(n = values.length)) return;\n    if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n    if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values[i0], i0, values), value1 = +valueof(values[i0 + 1], i0 + 1, values);\n    return value0 + (value1 - value0) * (i - i0);\n}\n\n},{\"./max.js\":\"5fCPh\",\"./min.js\":\"h0RAg\",\"./quickselect.js\":\"doA4Q\",\"./number.js\":\"gcMRK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h0RAg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction min(values, valueof) {\n    let min1;\n    if (valueof === undefined) {\n        for (const value of values)if (value != null && (min1 > value || min1 === undefined && value >= value)) min1 = value;\n    } else {\n        let index = -1;\n        for (let value of values)if ((value = valueof(value, ++index, values)) != null && (min1 > value || min1 === undefined && value >= value)) min1 = value;\n    }\n    return min1;\n}\nexports.default = min;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"doA4Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nfunction quickselect(array, k, left = 0, right = array.length - 1, compare = (0, _ascendingJsDefault.default)) {\n    while(right > left){\n        if (right - left > 600) {\n            const n = right - left + 1;\n            const m = k - left + 1;\n            const z = Math.log(n);\n            const s = 0.5 * Math.exp(2 * z / 3);\n            const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n            const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n            const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n            quickselect(array, k, newLeft, newRight, compare);\n        }\n        const t = array[k];\n        let i = left;\n        let j = right;\n        swap(array, left, k);\n        if (compare(array[right], t) > 0) swap(array, left, right);\n        while(i < j){\n            swap(array, i, j), ++i, --j;\n            while(compare(array[i], t) < 0)++i;\n            while(compare(array[j], t) > 0)--j;\n        }\n        if (compare(array[left], t) === 0) swap(array, left, j);\n        else ++j, swap(array, j, right);\n        if (j <= k) left = j + 1;\n        if (k <= j) right = j - 1;\n    }\n    return array;\n}\nexports.default = quickselect;\nfunction swap(array, i, j) {\n    const t = array[i];\n    array[i] = array[j];\n    array[j] = t;\n}\n\n},{\"./ascending.js\":\"60o1Z\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d56l7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction* flatten(arrays) {\n    for (const array of arrays)yield* array;\n}\nfunction merge(arrays) {\n    return Array.from(flatten(arrays));\n}\nexports.default = merge;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3ydIg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(source, keys) {\n    return Array.from(keys, (key)=>source[key]);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7QVPN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(start, stop, step) {\n    start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;\n    var i = -1, n = Math.max(0, Math.ceil((stop - start) / step)) | 0, range = new Array(n);\n    while(++i < n)range[i] = start + i * step;\n    return range;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hdZOC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction sum(values, valueof) {\n    let sum1 = 0;\n    if (valueof === undefined) {\n        for (let value of values)if (value = +value) sum1 += value;\n    } else {\n        let index = -1;\n        for (let value of values)if (value = +valueof(value, ++index, values)) sum1 += value;\n    }\n    return sum1;\n}\nexports.default = sum;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"71MAh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"tickIncrement\", ()=>tickIncrement);\nparcelHelpers.export(exports, \"tickStep\", ()=>tickStep);\nvar e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);\nexports.default = function(start, stop, count) {\n    var reverse, i = -1, n, ticks, step;\n    stop = +stop, start = +start, count = +count;\n    if (start === stop && count > 0) return [\n        start\n    ];\n    if (reverse = stop < start) n = start, start = stop, stop = n;\n    if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n    if (step > 0) {\n        let r0 = Math.round(start / step), r1 = Math.round(stop / step);\n        if (r0 * step < start) ++r0;\n        if (r1 * step > stop) --r1;\n        ticks = new Array(n = r1 - r0 + 1);\n        while(++i < n)ticks[i] = (r0 + i) * step;\n    } else {\n        step = -step;\n        let r0 = Math.round(start * step), r1 = Math.round(stop * step);\n        if (r0 / step < start) ++r0;\n        if (r1 / step > stop) --r1;\n        ticks = new Array(n = r1 - r0 + 1);\n        while(++i < n)ticks[i] = (r0 + i) / step;\n    }\n    if (reverse) ticks.reverse();\n    return ticks;\n};\nfunction tickIncrement(start, stop, count) {\n    var step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power);\n    return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\nfunction tickStep(start, stop, count) {\n    var step0 = Math.abs(stop - start) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1;\n    if (error >= e10) step1 *= 10;\n    else if (error >= e5) step1 *= 5;\n    else if (error >= e2) step1 *= 2;\n    return stop < start ? -step1 : step1;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3ULAv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"InternMap\", ()=>InternMap);\nparcelHelpers.export(exports, \"InternSet\", ()=>InternSet);\nclass InternMap extends Map {\n    constructor(entries, key = keyof){\n        super();\n        Object.defineProperties(this, {\n            _intern: {\n                value: new Map()\n            },\n            _key: {\n                value: key\n            }\n        });\n        if (entries != null) for (const [key1, value] of entries)this.set(key1, value);\n    }\n    get(key) {\n        return super.get(intern_get(this, key));\n    }\n    has(key) {\n        return super.has(intern_get(this, key));\n    }\n    set(key, value) {\n        return super.set(intern_set(this, key), value);\n    }\n    delete(key) {\n        return super.delete(intern_delete(this, key));\n    }\n}\nclass InternSet extends Set {\n    constructor(values, key = keyof){\n        super();\n        Object.defineProperties(this, {\n            _intern: {\n                value: new Map()\n            },\n            _key: {\n                value: key\n            }\n        });\n        if (values != null) for (const value of values)this.add(value);\n    }\n    has(value) {\n        return super.has(intern_get(this, value));\n    }\n    add(value) {\n        return super.add(intern_set(this, value));\n    }\n    delete(value) {\n        return super.delete(intern_delete(this, value));\n    }\n}\nfunction intern_get({ _intern , _key  }, value) {\n    const key = _key(value);\n    return _intern.has(key) ? _intern.get(key) : value;\n}\nfunction intern_set({ _intern , _key  }, value) {\n    const key = _key(value);\n    if (_intern.has(key)) return _intern.get(key);\n    _intern.set(key, value);\n    return value;\n}\nfunction intern_delete({ _intern , _key  }, value) {\n    const key = _key(value);\n    if (_intern.has(key)) {\n        value = _intern.get(value);\n        _intern.delete(key);\n    }\n    return value;\n}\nfunction keyof(value) {\n    return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8dYFL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"formatDefaultLocale\", ()=>(0, _defaultLocaleJsDefault.default));\nparcelHelpers.export(exports, \"format\", ()=>(0, _defaultLocaleJs.format));\nparcelHelpers.export(exports, \"formatPrefix\", ()=>(0, _defaultLocaleJs.formatPrefix));\nparcelHelpers.export(exports, \"formatLocale\", ()=>(0, _localeJsDefault.default));\nparcelHelpers.export(exports, \"formatSpecifier\", ()=>(0, _formatSpecifierJsDefault.default));\nparcelHelpers.export(exports, \"FormatSpecifier\", ()=>(0, _formatSpecifierJs.FormatSpecifier));\nparcelHelpers.export(exports, \"precisionFixed\", ()=>(0, _precisionFixedJsDefault.default));\nparcelHelpers.export(exports, \"precisionPrefix\", ()=>(0, _precisionPrefixJsDefault.default));\nparcelHelpers.export(exports, \"precisionRound\", ()=>(0, _precisionRoundJsDefault.default));\nvar _defaultLocaleJs = require(\"./defaultLocale.js\");\nvar _defaultLocaleJsDefault = parcelHelpers.interopDefault(_defaultLocaleJs);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar _formatSpecifierJs = require(\"./formatSpecifier.js\");\nvar _formatSpecifierJsDefault = parcelHelpers.interopDefault(_formatSpecifierJs);\nvar _precisionFixedJs = require(\"./precisionFixed.js\");\nvar _precisionFixedJsDefault = parcelHelpers.interopDefault(_precisionFixedJs);\nvar _precisionPrefixJs = require(\"./precisionPrefix.js\");\nvar _precisionPrefixJsDefault = parcelHelpers.interopDefault(_precisionPrefixJs);\nvar _precisionRoundJs = require(\"./precisionRound.js\");\nvar _precisionRoundJsDefault = parcelHelpers.interopDefault(_precisionRoundJs);\n\n},{\"./defaultLocale.js\":\"1ffdx\",\"./locale.js\":\"dwvYJ\",\"./formatSpecifier.js\":\"bIdqX\",\"./precisionFixed.js\":\"8IQWL\",\"./precisionPrefix.js\":\"iTn3h\",\"./precisionRound.js\":\"kzQd5\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1ffdx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"format\", ()=>format);\nparcelHelpers.export(exports, \"formatPrefix\", ()=>formatPrefix);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar locale;\nvar format;\nvar formatPrefix;\ndefaultLocale({\n    thousands: \",\",\n    grouping: [\n        3\n    ],\n    currency: [\n        \"$\",\n        \"\"\n    ]\n});\nfunction defaultLocale(definition) {\n    locale = (0, _localeJsDefault.default)(definition);\n    format = locale.format;\n    formatPrefix = locale.formatPrefix;\n    return locale;\n}\nexports.default = defaultLocale;\n\n},{\"./locale.js\":\"dwvYJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dwvYJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nvar _formatGroupJs = require(\"./formatGroup.js\");\nvar _formatGroupJsDefault = parcelHelpers.interopDefault(_formatGroupJs);\nvar _formatNumeralsJs = require(\"./formatNumerals.js\");\nvar _formatNumeralsJsDefault = parcelHelpers.interopDefault(_formatNumeralsJs);\nvar _formatSpecifierJs = require(\"./formatSpecifier.js\");\nvar _formatSpecifierJsDefault = parcelHelpers.interopDefault(_formatSpecifierJs);\nvar _formatTrimJs = require(\"./formatTrim.js\");\nvar _formatTrimJsDefault = parcelHelpers.interopDefault(_formatTrimJs);\nvar _formatTypesJs = require(\"./formatTypes.js\");\nvar _formatTypesJsDefault = parcelHelpers.interopDefault(_formatTypesJs);\nvar _formatPrefixAutoJs = require(\"./formatPrefixAuto.js\");\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar map = Array.prototype.map, prefixes = [\n    \"y\",\n    \"z\",\n    \"a\",\n    \"f\",\n    \"p\",\n    \"n\",\n    \"\\xb5\",\n    \"m\",\n    \"\",\n    \"k\",\n    \"M\",\n    \"G\",\n    \"T\",\n    \"P\",\n    \"E\",\n    \"Z\",\n    \"Y\"\n];\nexports.default = function(locale) {\n    var group = locale.grouping === undefined || locale.thousands === undefined ? (0, _identityJsDefault.default) : (0, _formatGroupJsDefault.default)(map.call(locale.grouping, Number), locale.thousands + \"\"), currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\", currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\", decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\", numerals = locale.numerals === undefined ? (0, _identityJsDefault.default) : (0, _formatNumeralsJsDefault.default)(map.call(locale.numerals, String)), percent = locale.percent === undefined ? \"%\" : locale.percent + \"\", minus = locale.minus === undefined ? \"\\u2212\" : locale.minus + \"\", nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n    function newFormat(specifier) {\n        specifier = (0, _formatSpecifierJsDefault.default)(specifier);\n        var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type = specifier.type;\n        // The \"n\" type is an alias for \",g\".\n        if (type === \"n\") comma = true, type = \"g\";\n        else if (!(0, _formatTypesJsDefault.default)[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n        // If zero fill is specified, padding goes after sign and before digits.\n        if (zero || fill === \"0\" && align === \"=\") zero = true, fill = \"0\", align = \"=\";\n        // Compute the prefix and suffix.\n        // For SI-prefix, the suffix is lazily computed.\n        var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\", suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n        // What format function should we use?\n        // Is this an integer type?\n        // Can this type generate exponential notation?\n        var formatType = (0, _formatTypesJsDefault.default)[type], maybeSuffix = /[defgprs%]/.test(type);\n        // Set the default precision if not specified,\n        // or clamp the specified precision to the supported range.\n        // For significant precision, it must be in [1, 21].\n        // For fixed precision, it must be in [0, 20].\n        precision = precision === undefined ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n        function format(value) {\n            var valuePrefix = prefix, valueSuffix = suffix, i, n, c;\n            if (type === \"c\") {\n                valueSuffix = formatType(value) + valueSuffix;\n                value = \"\";\n            } else {\n                value = +value;\n                // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n                var valueNegative = value < 0 || 1 / value < 0;\n                // Perform the initial formatting.\n                value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n                // Trim insignificant zeros.\n                if (trim) value = (0, _formatTrimJsDefault.default)(value);\n                // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n                if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n                // Compute the prefix and suffix.\n                valuePrefix = (valueNegative ? sign === \"(\" ? sign : minus : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n                valueSuffix = (type === \"s\" ? prefixes[8 + (0, _formatPrefixAutoJs.prefixExponent) / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n                // Break the formatted value into the integer “value” part that can be\n                // grouped, and fractional or exponential “suffix” part that is not.\n                if (maybeSuffix) {\n                    i = -1, n = value.length;\n                    while(++i < n)if (c = value.charCodeAt(i), 48 > c || c > 57) {\n                        valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n                        value = value.slice(0, i);\n                        break;\n                    }\n                }\n            }\n            // If the fill character is not \"0\", grouping is applied before padding.\n            if (comma && !zero) value = group(value, Infinity);\n            // Compute the padding.\n            var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n            // If the fill character is \"0\", grouping is applied after padding.\n            if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n            // Reconstruct the final output based on the desired alignment.\n            switch(align){\n                case \"<\":\n                    value = valuePrefix + value + valueSuffix + padding;\n                    break;\n                case \"=\":\n                    value = valuePrefix + padding + value + valueSuffix;\n                    break;\n                case \"^\":\n                    value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n                    break;\n                default:\n                    value = padding + valuePrefix + value + valueSuffix;\n                    break;\n            }\n            return numerals(value);\n        }\n        format.toString = function() {\n            return specifier + \"\";\n        };\n        return format;\n    }\n    function formatPrefix(specifier, value1) {\n        var f = newFormat((specifier = (0, _formatSpecifierJsDefault.default)(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor((0, _exponentJsDefault.default)(value1) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];\n        return function(value) {\n            return f(k * value) + prefix;\n        };\n    }\n    return {\n        format: newFormat,\n        formatPrefix: formatPrefix\n    };\n};\n\n},{\"./exponent.js\":\"iqnEO\",\"./formatGroup.js\":\"d3NPN\",\"./formatNumerals.js\":\"32lVM\",\"./formatSpecifier.js\":\"bIdqX\",\"./formatTrim.js\":\"1v59S\",\"./formatTypes.js\":\"eJoM5\",\"./formatPrefixAuto.js\":\"5DQGQ\",\"./identity.js\":\"5utPE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iqnEO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nexports.default = function(x) {\n    return x = (0, _formatDecimalJs.formatDecimalParts)(Math.abs(x)), x ? x[1] : NaN;\n};\n\n},{\"./formatDecimal.js\":\"8WhgD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8WhgD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nparcelHelpers.export(exports, \"formatDecimalParts\", ()=>formatDecimalParts);\nexports.default = function(x) {\n    return Math.abs(x = Math.round(x)) >= 1e21 ? x.toLocaleString(\"en\").replace(/,/g, \"\") : x.toString(10);\n};\nfunction formatDecimalParts(x, p) {\n    if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n    var i, coefficient = x.slice(0, i);\n    // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n    // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n    return [\n        coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n        +x.slice(i + 1)\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d3NPN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(grouping, thousands) {\n    return function(value, width) {\n        var i = value.length, t = [], j = 0, g = grouping[0], length = 0;\n        while(i > 0 && g > 0){\n            if (length + g + 1 > width) g = Math.max(1, width - length);\n            t.push(value.substring(i -= g, i + g));\n            if ((length += g + 1) > width) break;\n            g = grouping[j = (j + 1) % grouping.length];\n        }\n        return t.reverse().join(thousands);\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"32lVM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(numerals) {\n    return function(value) {\n        return value.replace(/[0-9]/g, function(i) {\n            return numerals[+i];\n        });\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bIdqX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FormatSpecifier\", ()=>FormatSpecifier);\n// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\nfunction formatSpecifier(specifier) {\n    if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match;\n    return new FormatSpecifier({\n        fill: match[1],\n        align: match[2],\n        sign: match[3],\n        symbol: match[4],\n        zero: match[5],\n        width: match[6],\n        comma: match[7],\n        precision: match[8] && match[8].slice(1),\n        trim: match[9],\n        type: match[10]\n    });\n}\nexports.default = formatSpecifier;\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\nfunction FormatSpecifier(specifier) {\n    this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === undefined ? undefined : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\nFormatSpecifier.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === undefined ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1v59S\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexports.default = function(s) {\n    out: for(var n = s.length, i = 1, i0 = -1, i1; i < n; ++i)switch(s[i]){\n        case \".\":\n            i0 = i1 = i;\n            break;\n        case \"0\":\n            if (i0 === 0) i0 = i;\n            i1 = i;\n            break;\n        default:\n            if (!+s[i]) break out;\n            if (i0 > 0) i0 = 0;\n            break;\n    }\n    return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eJoM5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nvar _formatDecimalJsDefault = parcelHelpers.interopDefault(_formatDecimalJs);\nvar _formatPrefixAutoJs = require(\"./formatPrefixAuto.js\");\nvar _formatPrefixAutoJsDefault = parcelHelpers.interopDefault(_formatPrefixAutoJs);\nvar _formatRoundedJs = require(\"./formatRounded.js\");\nvar _formatRoundedJsDefault = parcelHelpers.interopDefault(_formatRoundedJs);\nexports.default = {\n    \"%\": (x, p)=>(x * 100).toFixed(p),\n    \"b\": (x)=>Math.round(x).toString(2),\n    \"c\": (x)=>x + \"\",\n    \"d\": (0, _formatDecimalJsDefault.default),\n    \"e\": (x, p)=>x.toExponential(p),\n    \"f\": (x, p)=>x.toFixed(p),\n    \"g\": (x, p)=>x.toPrecision(p),\n    \"o\": (x)=>Math.round(x).toString(8),\n    \"p\": (x, p)=>(0, _formatRoundedJsDefault.default)(x * 100, p),\n    \"r\": (0, _formatRoundedJsDefault.default),\n    \"s\": (0, _formatPrefixAutoJsDefault.default),\n    \"X\": (x)=>Math.round(x).toString(16).toUpperCase(),\n    \"x\": (x)=>Math.round(x).toString(16)\n};\n\n},{\"./formatDecimal.js\":\"8WhgD\",\"./formatPrefixAuto.js\":\"5DQGQ\",\"./formatRounded.js\":\"dJog3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5DQGQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"prefixExponent\", ()=>prefixExponent);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nvar prefixExponent;\nexports.default = function(x, p) {\n    var d = (0, _formatDecimalJs.formatDecimalParts)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + (0, _formatDecimalJs.formatDecimalParts)(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n};\n\n},{\"./formatDecimal.js\":\"8WhgD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dJog3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _formatDecimalJs = require(\"./formatDecimal.js\");\nexports.default = function(x, p) {\n    var d = (0, _formatDecimalJs.formatDecimalParts)(x, p);\n    if (!d) return x + \"\";\n    var coefficient = d[0], exponent = d[1];\n    return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n};\n\n},{\"./formatDecimal.js\":\"8WhgD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5utPE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return x;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8IQWL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nexports.default = function(step) {\n    return Math.max(0, -(0, _exponentJsDefault.default)(Math.abs(step)));\n};\n\n},{\"./exponent.js\":\"iqnEO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iTn3h\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nexports.default = function(step, value) {\n    return Math.max(0, Math.max(-8, Math.min(8, Math.floor((0, _exponentJsDefault.default)(value) / 3))) * 3 - (0, _exponentJsDefault.default)(Math.abs(step)));\n};\n\n},{\"./exponent.js\":\"iqnEO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kzQd5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _exponentJs = require(\"./exponent.js\");\nvar _exponentJsDefault = parcelHelpers.interopDefault(_exponentJs);\nexports.default = function(step, max) {\n    step = Math.abs(step), max = Math.abs(max) - step;\n    return Math.max(0, (0, _exponentJsDefault.default)(max) - (0, _exponentJsDefault.default)(step)) + 1;\n};\n\n},{\"./exponent.js\":\"iqnEO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"27kpp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DATE\", ()=>DATE);\nparcelHelpers.export(exports, \"DAY\", ()=>DAY);\nparcelHelpers.export(exports, \"DAYOFYEAR\", ()=>DAYOFYEAR);\nparcelHelpers.export(exports, \"HOURS\", ()=>HOURS);\nparcelHelpers.export(exports, \"MILLISECONDS\", ()=>MILLISECONDS);\nparcelHelpers.export(exports, \"MINUTES\", ()=>MINUTES);\nparcelHelpers.export(exports, \"MONTH\", ()=>MONTH);\nparcelHelpers.export(exports, \"QUARTER\", ()=>QUARTER);\nparcelHelpers.export(exports, \"SECONDS\", ()=>SECONDS);\nparcelHelpers.export(exports, \"TIME_UNITS\", ()=>TIME_UNITS);\nparcelHelpers.export(exports, \"WEEK\", ()=>WEEK);\nparcelHelpers.export(exports, \"YEAR\", ()=>YEAR);\nparcelHelpers.export(exports, \"dayofyear\", ()=>dayofyear);\nparcelHelpers.export(exports, \"timeBin\", ()=>bin);\nparcelHelpers.export(exports, \"timeFloor\", ()=>timeFloor);\nparcelHelpers.export(exports, \"timeInterval\", ()=>timeInterval);\nparcelHelpers.export(exports, \"timeOffset\", ()=>timeOffset);\nparcelHelpers.export(exports, \"timeSequence\", ()=>timeSequence);\nparcelHelpers.export(exports, \"timeUnitSpecifier\", ()=>timeUnitSpecifier);\nparcelHelpers.export(exports, \"timeUnits\", ()=>timeUnits);\nparcelHelpers.export(exports, \"utcFloor\", ()=>utcFloor);\nparcelHelpers.export(exports, \"utcInterval\", ()=>utcInterval);\nparcelHelpers.export(exports, \"utcOffset\", ()=>utcOffset);\nparcelHelpers.export(exports, \"utcSequence\", ()=>utcSequence);\nparcelHelpers.export(exports, \"utcdayofyear\", ()=>utcdayofyear);\nparcelHelpers.export(exports, \"utcweek\", ()=>utcweek);\nparcelHelpers.export(exports, \"week\", ()=>week);\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Time = require(\"d3-time\");\nvar _d3Array = require(\"d3-array\");\nconst YEAR = \"year\";\nconst QUARTER = \"quarter\";\nconst MONTH = \"month\";\nconst WEEK = \"week\";\nconst DATE = \"date\";\nconst DAY = \"day\";\nconst DAYOFYEAR = \"dayofyear\";\nconst HOURS = \"hours\";\nconst MINUTES = \"minutes\";\nconst SECONDS = \"seconds\";\nconst MILLISECONDS = \"milliseconds\";\nconst TIME_UNITS = [\n    YEAR,\n    QUARTER,\n    MONTH,\n    WEEK,\n    DATE,\n    DAY,\n    DAYOFYEAR,\n    HOURS,\n    MINUTES,\n    SECONDS,\n    MILLISECONDS\n];\nconst UNITS = TIME_UNITS.reduce((o, u, i)=>(o[u] = 1 + i, o), {});\nfunction timeUnits(units) {\n    const u = (0, _vegaUtil.array)(units).slice(), m = {}; // check validity\n    if (!u.length) (0, _vegaUtil.error)(\"Missing time unit.\");\n    u.forEach((unit)=>{\n        if ((0, _vegaUtil.hasOwnProperty)(UNITS, unit)) m[unit] = 1;\n        else (0, _vegaUtil.error)(\"Invalid time unit: \".concat(unit, \".\"));\n    });\n    const numTypes = (m[WEEK] || m[DAY] ? 1 : 0) + (m[QUARTER] || m[MONTH] || m[DATE] ? 1 : 0) + (m[DAYOFYEAR] ? 1 : 0);\n    if (numTypes > 1) (0, _vegaUtil.error)(\"Incompatible time units: \".concat(units));\n     // ensure proper sort order\n    u.sort((a, b)=>UNITS[a] - UNITS[b]);\n    return u;\n}\nconst defaultSpecifiers = {\n    [YEAR]: \"%Y \",\n    [QUARTER]: \"Q%q \",\n    [MONTH]: \"%b \",\n    [DATE]: \"%d \",\n    [WEEK]: \"W%U \",\n    [DAY]: \"%a \",\n    [DAYOFYEAR]: \"%j \",\n    [HOURS]: \"%H:00\",\n    [MINUTES]: \"00:%M\",\n    [SECONDS]: \":%S\",\n    [MILLISECONDS]: \".%L\",\n    [\"\".concat(YEAR, \"-\").concat(MONTH)]: \"%Y-%m \",\n    [\"\".concat(YEAR, \"-\").concat(MONTH, \"-\").concat(DATE)]: \"%Y-%m-%d \",\n    [\"\".concat(HOURS, \"-\").concat(MINUTES)]: \"%H:%M\"\n};\nfunction timeUnitSpecifier(units, specifiers) {\n    const s = (0, _vegaUtil.extend)({}, defaultSpecifiers, specifiers), u = timeUnits(units), n = u.length;\n    let fmt = \"\", start = 0, end, key;\n    for(start = 0; start < n;)for(end = u.length; end > start; --end){\n        key = u.slice(start, end).join(\"-\");\n        if (s[key] != null) {\n            fmt += s[key];\n            start = end;\n            break;\n        }\n    }\n    return fmt.trim();\n}\nconst t0 = new Date();\nfunction localYear(y) {\n    t0.setFullYear(y);\n    t0.setMonth(0);\n    t0.setDate(1);\n    t0.setHours(0, 0, 0, 0);\n    return t0;\n}\nfunction dayofyear(d) {\n    return localDayOfYear(new Date(d));\n}\nfunction week(d) {\n    return localWeekNum(new Date(d));\n}\nfunction localDayOfYear(d) {\n    return (0, _d3Time.timeDay).count(localYear(d.getFullYear()) - 1, d);\n}\nfunction localWeekNum(d) {\n    return (0, _d3Time.timeWeek).count(localYear(d.getFullYear()) - 1, d);\n}\nfunction localFirst(y) {\n    return localYear(y).getDay();\n}\nfunction localDate(y, m, d, H, M, S, L) {\n    if (0 <= y && y < 100) {\n        const date = new Date(-1, m, d, H, M, S, L);\n        date.setFullYear(y);\n        return date;\n    }\n    return new Date(y, m, d, H, M, S, L);\n}\nfunction utcdayofyear(d) {\n    return utcDayOfYear(new Date(d));\n}\nfunction utcweek(d) {\n    return utcWeekNum(new Date(d));\n}\nfunction utcDayOfYear(d) {\n    const y = Date.UTC(d.getUTCFullYear(), 0, 1);\n    return (0, _d3Time.utcDay).count(y - 1, d);\n}\nfunction utcWeekNum(d) {\n    const y = Date.UTC(d.getUTCFullYear(), 0, 1);\n    return (0, _d3Time.utcWeek).count(y - 1, d);\n}\nfunction utcFirst(y) {\n    t0.setTime(Date.UTC(y, 0, 1));\n    return t0.getUTCDay();\n}\nfunction utcDate(y, m, d, H, M, S, L) {\n    if (0 <= y && y < 100) {\n        const date = new Date(Date.UTC(-1, m, d, H, M, S, L));\n        date.setUTCFullYear(d.y);\n        return date;\n    }\n    return new Date(Date.UTC(y, m, d, H, M, S, L));\n}\nfunction floor(units, step, get, inv, newDate) {\n    const s = step || 1, b = (0, _vegaUtil.peek)(units), _ = (unit, p, key)=>{\n        key = key || unit;\n        return getUnit(get[key], inv[key], unit === b && s, p);\n    };\n    const t = new Date(), u = (0, _vegaUtil.toSet)(units), y = u[YEAR] ? _(YEAR) : (0, _vegaUtil.constant)(2012), m = u[MONTH] ? _(MONTH) : u[QUARTER] ? _(QUARTER) : (0, _vegaUtil.zero), d = u[WEEK] && u[DAY] ? _(DAY, 1, WEEK + DAY) : u[WEEK] ? _(WEEK, 1) : u[DAY] ? _(DAY, 1) : u[DATE] ? _(DATE, 1) : u[DAYOFYEAR] ? _(DAYOFYEAR, 1) : (0, _vegaUtil.one), H = u[HOURS] ? _(HOURS) : (0, _vegaUtil.zero), M = u[MINUTES] ? _(MINUTES) : (0, _vegaUtil.zero), S = u[SECONDS] ? _(SECONDS) : (0, _vegaUtil.zero), L = u[MILLISECONDS] ? _(MILLISECONDS) : (0, _vegaUtil.zero);\n    return function(v) {\n        t.setTime(+v);\n        const year = y(t);\n        return newDate(year, m(t), d(t, year), H(t), M(t), S(t), L(t));\n    };\n}\nfunction getUnit(f, inv, step, phase) {\n    const u = step <= 1 ? f : phase ? (d, y)=>phase + step * Math.floor((f(d, y) - phase) / step) : (d, y)=>step * Math.floor(f(d, y) / step);\n    return inv ? (d, y)=>inv(u(d, y), y) : u;\n} // returns the day of the year based on week number, day of week,\n// and the day of the week for the first day of the year\nfunction weekday(week1, day, firstDay) {\n    return day + week1 * 7 - (firstDay + 6) % 7;\n} // -- LOCAL TIME --\nconst localGet = {\n    [YEAR]: (d)=>d.getFullYear(),\n    [QUARTER]: (d)=>Math.floor(d.getMonth() / 3),\n    [MONTH]: (d)=>d.getMonth(),\n    [DATE]: (d)=>d.getDate(),\n    [HOURS]: (d)=>d.getHours(),\n    [MINUTES]: (d)=>d.getMinutes(),\n    [SECONDS]: (d)=>d.getSeconds(),\n    [MILLISECONDS]: (d)=>d.getMilliseconds(),\n    [DAYOFYEAR]: (d)=>localDayOfYear(d),\n    [WEEK]: (d)=>localWeekNum(d),\n    [WEEK + DAY]: (d, y)=>weekday(localWeekNum(d), d.getDay(), localFirst(y)),\n    [DAY]: (d, y)=>weekday(1, d.getDay(), localFirst(y))\n};\nconst localInv = {\n    [QUARTER]: (q)=>3 * q,\n    [WEEK]: (w, y)=>weekday(w, 0, localFirst(y))\n};\nfunction timeFloor(units, step) {\n    return floor(units, step || 1, localGet, localInv, localDate);\n} // -- UTC TIME --\nconst utcGet = {\n    [YEAR]: (d)=>d.getUTCFullYear(),\n    [QUARTER]: (d)=>Math.floor(d.getUTCMonth() / 3),\n    [MONTH]: (d)=>d.getUTCMonth(),\n    [DATE]: (d)=>d.getUTCDate(),\n    [HOURS]: (d)=>d.getUTCHours(),\n    [MINUTES]: (d)=>d.getUTCMinutes(),\n    [SECONDS]: (d)=>d.getUTCSeconds(),\n    [MILLISECONDS]: (d)=>d.getUTCMilliseconds(),\n    [DAYOFYEAR]: (d)=>utcDayOfYear(d),\n    [WEEK]: (d)=>utcWeekNum(d),\n    [DAY]: (d, y)=>weekday(1, d.getUTCDay(), utcFirst(y)),\n    [WEEK + DAY]: (d, y)=>weekday(utcWeekNum(d), d.getUTCDay(), utcFirst(y))\n};\nconst utcInv = {\n    [QUARTER]: (q)=>3 * q,\n    [WEEK]: (w, y)=>weekday(w, 0, utcFirst(y))\n};\nfunction utcFloor(units, step) {\n    return floor(units, step || 1, utcGet, utcInv, utcDate);\n}\nconst timeIntervals = {\n    [YEAR]: (0, _d3Time.timeYear),\n    [QUARTER]: (0, _d3Time.timeMonth).every(3),\n    [MONTH]: (0, _d3Time.timeMonth),\n    [WEEK]: (0, _d3Time.timeWeek),\n    [DATE]: (0, _d3Time.timeDay),\n    [DAY]: (0, _d3Time.timeDay),\n    [DAYOFYEAR]: (0, _d3Time.timeDay),\n    [HOURS]: (0, _d3Time.timeHour),\n    [MINUTES]: (0, _d3Time.timeMinute),\n    [SECONDS]: (0, _d3Time.timeSecond),\n    [MILLISECONDS]: (0, _d3Time.timeMillisecond)\n};\nconst utcIntervals = {\n    [YEAR]: (0, _d3Time.utcYear),\n    [QUARTER]: (0, _d3Time.utcMonth).every(3),\n    [MONTH]: (0, _d3Time.utcMonth),\n    [WEEK]: (0, _d3Time.utcWeek),\n    [DATE]: (0, _d3Time.utcDay),\n    [DAY]: (0, _d3Time.utcDay),\n    [DAYOFYEAR]: (0, _d3Time.utcDay),\n    [HOURS]: (0, _d3Time.utcHour),\n    [MINUTES]: (0, _d3Time.utcMinute),\n    [SECONDS]: (0, _d3Time.utcSecond),\n    [MILLISECONDS]: (0, _d3Time.utcMillisecond)\n};\nfunction timeInterval(unit) {\n    return timeIntervals[unit];\n}\nfunction utcInterval(unit) {\n    return utcIntervals[unit];\n}\nfunction offset(ival, date, step) {\n    return ival ? ival.offset(date, step) : undefined;\n}\nfunction timeOffset(unit, date, step) {\n    return offset(timeInterval(unit), date, step);\n}\nfunction utcOffset(unit, date, step) {\n    return offset(utcInterval(unit), date, step);\n}\nfunction sequence(ival, start, stop, step) {\n    return ival ? ival.range(start, stop, step) : undefined;\n}\nfunction timeSequence(unit, start, stop, step) {\n    return sequence(timeInterval(unit), start, stop, step);\n}\nfunction utcSequence(unit, start, stop, step) {\n    return sequence(utcInterval(unit), start, stop, step);\n}\nconst durationSecond = 1000, durationMinute = durationSecond * 60, durationHour = durationMinute * 60, durationDay = durationHour * 24, durationWeek = durationDay * 7, durationMonth = durationDay * 30, durationYear = durationDay * 365;\nconst Milli = [\n    YEAR,\n    MONTH,\n    DATE,\n    HOURS,\n    MINUTES,\n    SECONDS,\n    MILLISECONDS\n], Seconds = Milli.slice(0, -1), Minutes = Seconds.slice(0, -1), Hours = Minutes.slice(0, -1), Day = Hours.slice(0, -1), Week = [\n    YEAR,\n    WEEK\n], Month = [\n    YEAR,\n    MONTH\n], Year = [\n    YEAR\n];\nconst intervals = [\n    [\n        Seconds,\n        1,\n        durationSecond\n    ],\n    [\n        Seconds,\n        5,\n        5 * durationSecond\n    ],\n    [\n        Seconds,\n        15,\n        15 * durationSecond\n    ],\n    [\n        Seconds,\n        30,\n        30 * durationSecond\n    ],\n    [\n        Minutes,\n        1,\n        durationMinute\n    ],\n    [\n        Minutes,\n        5,\n        5 * durationMinute\n    ],\n    [\n        Minutes,\n        15,\n        15 * durationMinute\n    ],\n    [\n        Minutes,\n        30,\n        30 * durationMinute\n    ],\n    [\n        Hours,\n        1,\n        durationHour\n    ],\n    [\n        Hours,\n        3,\n        3 * durationHour\n    ],\n    [\n        Hours,\n        6,\n        6 * durationHour\n    ],\n    [\n        Hours,\n        12,\n        12 * durationHour\n    ],\n    [\n        Day,\n        1,\n        durationDay\n    ],\n    [\n        Week,\n        1,\n        durationWeek\n    ],\n    [\n        Month,\n        1,\n        durationMonth\n    ],\n    [\n        Month,\n        3,\n        3 * durationMonth\n    ],\n    [\n        Year,\n        1,\n        durationYear\n    ]\n];\nfunction bin(opt) {\n    const ext = opt.extent, max = opt.maxbins || 40, target = Math.abs((0, _vegaUtil.span)(ext)) / max;\n    let i1 = (0, _d3Array.bisector)((i)=>i[2]).right(intervals, target), units, step;\n    if (i1 === intervals.length) units = Year, step = (0, _d3Array.tickStep)(ext[0] / durationYear, ext[1] / durationYear, max);\n    else if (i1) {\n        i1 = intervals[target / intervals[i1 - 1][2] < intervals[i1][2] / target ? i1 - 1 : i1];\n        units = i1[0];\n        step = i1[1];\n    } else {\n        units = Milli;\n        step = Math.max((0, _d3Array.tickStep)(ext[0], ext[1], max), 1);\n    }\n    return {\n        units,\n        step\n    };\n}\n\n},{\"vega-util\":\"bApja\",\"d3-time\":\"8e7eR\",\"d3-array\":\"6IwJG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8e7eR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"timeInterval\", ()=>(0, _intervalJsDefault.default));\nparcelHelpers.export(exports, \"timeMillisecond\", ()=>(0, _millisecondJsDefault.default));\nparcelHelpers.export(exports, \"timeMilliseconds\", ()=>(0, _millisecondJs.milliseconds));\nparcelHelpers.export(exports, \"utcMillisecond\", ()=>(0, _millisecondJsDefault.default));\nparcelHelpers.export(exports, \"utcMilliseconds\", ()=>(0, _millisecondJs.milliseconds));\nparcelHelpers.export(exports, \"timeSecond\", ()=>(0, _secondJsDefault.default));\nparcelHelpers.export(exports, \"timeSeconds\", ()=>(0, _secondJs.seconds));\nparcelHelpers.export(exports, \"utcSecond\", ()=>(0, _secondJsDefault.default));\nparcelHelpers.export(exports, \"utcSeconds\", ()=>(0, _secondJs.seconds));\nparcelHelpers.export(exports, \"timeMinute\", ()=>(0, _minuteJsDefault.default));\nparcelHelpers.export(exports, \"timeMinutes\", ()=>(0, _minuteJs.minutes));\nparcelHelpers.export(exports, \"timeHour\", ()=>(0, _hourJsDefault.default));\nparcelHelpers.export(exports, \"timeHours\", ()=>(0, _hourJs.hours));\nparcelHelpers.export(exports, \"timeDay\", ()=>(0, _dayJsDefault.default));\nparcelHelpers.export(exports, \"timeDays\", ()=>(0, _dayJs.days));\nparcelHelpers.export(exports, \"timeWeek\", ()=>(0, _weekJs.sunday));\nparcelHelpers.export(exports, \"timeWeeks\", ()=>(0, _weekJs.sundays));\nparcelHelpers.export(exports, \"timeSunday\", ()=>(0, _weekJs.sunday));\nparcelHelpers.export(exports, \"timeSundays\", ()=>(0, _weekJs.sundays));\nparcelHelpers.export(exports, \"timeMonday\", ()=>(0, _weekJs.monday));\nparcelHelpers.export(exports, \"timeMondays\", ()=>(0, _weekJs.mondays));\nparcelHelpers.export(exports, \"timeTuesday\", ()=>(0, _weekJs.tuesday));\nparcelHelpers.export(exports, \"timeTuesdays\", ()=>(0, _weekJs.tuesdays));\nparcelHelpers.export(exports, \"timeWednesday\", ()=>(0, _weekJs.wednesday));\nparcelHelpers.export(exports, \"timeWednesdays\", ()=>(0, _weekJs.wednesdays));\nparcelHelpers.export(exports, \"timeThursday\", ()=>(0, _weekJs.thursday));\nparcelHelpers.export(exports, \"timeThursdays\", ()=>(0, _weekJs.thursdays));\nparcelHelpers.export(exports, \"timeFriday\", ()=>(0, _weekJs.friday));\nparcelHelpers.export(exports, \"timeFridays\", ()=>(0, _weekJs.fridays));\nparcelHelpers.export(exports, \"timeSaturday\", ()=>(0, _weekJs.saturday));\nparcelHelpers.export(exports, \"timeSaturdays\", ()=>(0, _weekJs.saturdays));\nparcelHelpers.export(exports, \"timeMonth\", ()=>(0, _monthJsDefault.default));\nparcelHelpers.export(exports, \"timeMonths\", ()=>(0, _monthJs.months));\nparcelHelpers.export(exports, \"timeYear\", ()=>(0, _yearJsDefault.default));\nparcelHelpers.export(exports, \"timeYears\", ()=>(0, _yearJs.years));\nparcelHelpers.export(exports, \"utcMinute\", ()=>(0, _utcMinuteJsDefault.default));\nparcelHelpers.export(exports, \"utcMinutes\", ()=>(0, _utcMinuteJs.utcMinutes));\nparcelHelpers.export(exports, \"utcHour\", ()=>(0, _utcHourJsDefault.default));\nparcelHelpers.export(exports, \"utcHours\", ()=>(0, _utcHourJs.utcHours));\nparcelHelpers.export(exports, \"utcDay\", ()=>(0, _utcDayJsDefault.default));\nparcelHelpers.export(exports, \"utcDays\", ()=>(0, _utcDayJs.utcDays));\nparcelHelpers.export(exports, \"utcWeek\", ()=>(0, _utcWeekJs.utcSunday));\nparcelHelpers.export(exports, \"utcWeeks\", ()=>(0, _utcWeekJs.utcSundays));\nparcelHelpers.export(exports, \"utcSunday\", ()=>(0, _utcWeekJs.utcSunday));\nparcelHelpers.export(exports, \"utcSundays\", ()=>(0, _utcWeekJs.utcSundays));\nparcelHelpers.export(exports, \"utcMonday\", ()=>(0, _utcWeekJs.utcMonday));\nparcelHelpers.export(exports, \"utcMondays\", ()=>(0, _utcWeekJs.utcMondays));\nparcelHelpers.export(exports, \"utcTuesday\", ()=>(0, _utcWeekJs.utcTuesday));\nparcelHelpers.export(exports, \"utcTuesdays\", ()=>(0, _utcWeekJs.utcTuesdays));\nparcelHelpers.export(exports, \"utcWednesday\", ()=>(0, _utcWeekJs.utcWednesday));\nparcelHelpers.export(exports, \"utcWednesdays\", ()=>(0, _utcWeekJs.utcWednesdays));\nparcelHelpers.export(exports, \"utcThursday\", ()=>(0, _utcWeekJs.utcThursday));\nparcelHelpers.export(exports, \"utcThursdays\", ()=>(0, _utcWeekJs.utcThursdays));\nparcelHelpers.export(exports, \"utcFriday\", ()=>(0, _utcWeekJs.utcFriday));\nparcelHelpers.export(exports, \"utcFridays\", ()=>(0, _utcWeekJs.utcFridays));\nparcelHelpers.export(exports, \"utcSaturday\", ()=>(0, _utcWeekJs.utcSaturday));\nparcelHelpers.export(exports, \"utcSaturdays\", ()=>(0, _utcWeekJs.utcSaturdays));\nparcelHelpers.export(exports, \"utcMonth\", ()=>(0, _utcMonthJsDefault.default));\nparcelHelpers.export(exports, \"utcMonths\", ()=>(0, _utcMonthJs.utcMonths));\nparcelHelpers.export(exports, \"utcYear\", ()=>(0, _utcYearJsDefault.default));\nparcelHelpers.export(exports, \"utcYears\", ()=>(0, _utcYearJs.utcYears));\nparcelHelpers.export(exports, \"utcTicks\", ()=>(0, _ticksJs.utcTicks));\nparcelHelpers.export(exports, \"utcTickInterval\", ()=>(0, _ticksJs.utcTickInterval));\nparcelHelpers.export(exports, \"timeTicks\", ()=>(0, _ticksJs.timeTicks));\nparcelHelpers.export(exports, \"timeTickInterval\", ()=>(0, _ticksJs.timeTickInterval));\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _millisecondJs = require(\"./millisecond.js\");\nvar _millisecondJsDefault = parcelHelpers.interopDefault(_millisecondJs);\nvar _secondJs = require(\"./second.js\");\nvar _secondJsDefault = parcelHelpers.interopDefault(_secondJs);\nvar _minuteJs = require(\"./minute.js\");\nvar _minuteJsDefault = parcelHelpers.interopDefault(_minuteJs);\nvar _hourJs = require(\"./hour.js\");\nvar _hourJsDefault = parcelHelpers.interopDefault(_hourJs);\nvar _dayJs = require(\"./day.js\");\nvar _dayJsDefault = parcelHelpers.interopDefault(_dayJs);\nvar _weekJs = require(\"./week.js\");\nvar _monthJs = require(\"./month.js\");\nvar _monthJsDefault = parcelHelpers.interopDefault(_monthJs);\nvar _yearJs = require(\"./year.js\");\nvar _yearJsDefault = parcelHelpers.interopDefault(_yearJs);\nvar _utcMinuteJs = require(\"./utcMinute.js\");\nvar _utcMinuteJsDefault = parcelHelpers.interopDefault(_utcMinuteJs);\nvar _utcHourJs = require(\"./utcHour.js\");\nvar _utcHourJsDefault = parcelHelpers.interopDefault(_utcHourJs);\nvar _utcDayJs = require(\"./utcDay.js\");\nvar _utcDayJsDefault = parcelHelpers.interopDefault(_utcDayJs);\nvar _utcWeekJs = require(\"./utcWeek.js\");\nvar _utcMonthJs = require(\"./utcMonth.js\");\nvar _utcMonthJsDefault = parcelHelpers.interopDefault(_utcMonthJs);\nvar _utcYearJs = require(\"./utcYear.js\");\nvar _utcYearJsDefault = parcelHelpers.interopDefault(_utcYearJs);\nvar _ticksJs = require(\"./ticks.js\");\n\n},{\"./interval.js\":\"l16eQ\",\"./millisecond.js\":\"1aEMD\",\"./second.js\":\"22XHb\",\"./minute.js\":\"6j7Ml\",\"./hour.js\":\"llDoC\",\"./day.js\":\"ewpwG\",\"./week.js\":\"gpqk4\",\"./month.js\":\"gnhQl\",\"./year.js\":\"flVyx\",\"./utcMinute.js\":\"eEHXX\",\"./utcHour.js\":\"3ujpd\",\"./utcDay.js\":\"8xXoA\",\"./utcWeek.js\":\"eQvmg\",\"./utcMonth.js\":\"8g1B9\",\"./utcYear.js\":\"hr08P\",\"./ticks.js\":\"hqlJr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l16eQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar t0 = new Date, t1 = new Date;\nfunction newInterval(floori, offseti, count, field) {\n    function interval(date) {\n        return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n    }\n    interval.floor = function(date) {\n        return floori(date = new Date(+date)), date;\n    };\n    interval.ceil = function(date) {\n        return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n    };\n    interval.round = function(date) {\n        var d0 = interval(date), d1 = interval.ceil(date);\n        return date - d0 < d1 - date ? d0 : d1;\n    };\n    interval.offset = function(date, step) {\n        return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n    };\n    interval.range = function(start, stop, step) {\n        var range = [], previous;\n        start = interval.ceil(start);\n        step = step == null ? 1 : Math.floor(step);\n        if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n        do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n        while (previous < start && start < stop);\n        return range;\n    };\n    interval.filter = function(test) {\n        return newInterval(function(date) {\n            if (date >= date) while(floori(date), !test(date))date.setTime(date - 1);\n        }, function(date, step) {\n            if (date >= date) {\n                if (step < 0) while(++step <= 0){\n                    while(offseti(date, -1), !test(date)); // eslint-disable-line no-empty\n                }\n                else while(--step >= 0){\n                    while(offseti(date, 1), !test(date)); // eslint-disable-line no-empty\n                }\n            }\n        });\n    };\n    if (count) {\n        interval.count = function(start, end) {\n            t0.setTime(+start), t1.setTime(+end);\n            floori(t0), floori(t1);\n            return Math.floor(count(t0, t1));\n        };\n        interval.every = function(step) {\n            step = Math.floor(step);\n            return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval : interval.filter(field ? function(d) {\n                return field(d) % step === 0;\n            } : function(d) {\n                return interval.count(0, d) % step === 0;\n            });\n        };\n    }\n    return interval;\n}\nexports.default = newInterval;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1aEMD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"milliseconds\", ()=>milliseconds);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar millisecond = (0, _intervalJsDefault.default)(function() {\n// noop\n}, function(date, step) {\n    date.setTime(+date + step);\n}, function(start, end) {\n    return end - start;\n});\n// An optimized implementation for this simple case.\nmillisecond.every = function(k) {\n    k = Math.floor(k);\n    if (!isFinite(k) || !(k > 0)) return null;\n    if (!(k > 1)) return millisecond;\n    return (0, _intervalJsDefault.default)(function(date) {\n        date.setTime(Math.floor(date / k) * k);\n    }, function(date, step) {\n        date.setTime(+date + step * k);\n    }, function(start, end) {\n        return (end - start) / k;\n    });\n};\nexports.default = millisecond;\nvar milliseconds = millisecond.range;\n\n},{\"./interval.js\":\"l16eQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"22XHb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"seconds\", ()=>seconds);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar second = (0, _intervalJsDefault.default)(function(date) {\n    date.setTime(date - date.getMilliseconds());\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationSecond));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationSecond);\n}, function(date) {\n    return date.getUTCSeconds();\n});\nexports.default = second;\nvar seconds = second.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1XXl6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"durationSecond\", ()=>durationSecond);\nparcelHelpers.export(exports, \"durationMinute\", ()=>durationMinute);\nparcelHelpers.export(exports, \"durationHour\", ()=>durationHour);\nparcelHelpers.export(exports, \"durationDay\", ()=>durationDay);\nparcelHelpers.export(exports, \"durationWeek\", ()=>durationWeek);\nparcelHelpers.export(exports, \"durationMonth\", ()=>durationMonth);\nparcelHelpers.export(exports, \"durationYear\", ()=>durationYear);\nconst durationSecond = 1000;\nconst durationMinute = durationSecond * 60;\nconst durationHour = durationMinute * 60;\nconst durationDay = durationHour * 24;\nconst durationWeek = durationDay * 7;\nconst durationMonth = durationDay * 30;\nconst durationYear = durationDay * 365;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6j7Ml\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"minutes\", ()=>minutes);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar minute = (0, _intervalJsDefault.default)(function(date) {\n    date.setTime(date - date.getMilliseconds() - date.getSeconds() * (0, _durationJs.durationSecond));\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationMinute));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationMinute);\n}, function(date) {\n    return date.getMinutes();\n});\nexports.default = minute;\nvar minutes = minute.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"llDoC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hours\", ()=>hours);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar hour = (0, _intervalJsDefault.default)(function(date) {\n    date.setTime(date - date.getMilliseconds() - date.getSeconds() * (0, _durationJs.durationSecond) - date.getMinutes() * (0, _durationJs.durationMinute));\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationHour));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationHour);\n}, function(date) {\n    return date.getHours();\n});\nexports.default = hour;\nvar hours = hour.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ewpwG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"days\", ()=>days);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar day = (0, _intervalJsDefault.default)((date)=>date.setHours(0, 0, 0, 0), (date, step)=>date.setDate(date.getDate() + step), (start, end)=>(end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * (0, _durationJs.durationMinute)) / (0, _durationJs.durationDay), (date)=>date.getDate() - 1);\nexports.default = day;\nvar days = day.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gpqk4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"sunday\", ()=>sunday);\nparcelHelpers.export(exports, \"monday\", ()=>monday);\nparcelHelpers.export(exports, \"tuesday\", ()=>tuesday);\nparcelHelpers.export(exports, \"wednesday\", ()=>wednesday);\nparcelHelpers.export(exports, \"thursday\", ()=>thursday);\nparcelHelpers.export(exports, \"friday\", ()=>friday);\nparcelHelpers.export(exports, \"saturday\", ()=>saturday);\nparcelHelpers.export(exports, \"sundays\", ()=>sundays);\nparcelHelpers.export(exports, \"mondays\", ()=>mondays);\nparcelHelpers.export(exports, \"tuesdays\", ()=>tuesdays);\nparcelHelpers.export(exports, \"wednesdays\", ()=>wednesdays);\nparcelHelpers.export(exports, \"thursdays\", ()=>thursdays);\nparcelHelpers.export(exports, \"fridays\", ()=>fridays);\nparcelHelpers.export(exports, \"saturdays\", ()=>saturdays);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nfunction weekday(i) {\n    return (0, _intervalJsDefault.default)(function(date) {\n        date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n        date.setHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setDate(date.getDate() + step * 7);\n    }, function(start, end) {\n        return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * (0, _durationJs.durationMinute)) / (0, _durationJs.durationWeek);\n    });\n}\nvar sunday = weekday(0);\nvar monday = weekday(1);\nvar tuesday = weekday(2);\nvar wednesday = weekday(3);\nvar thursday = weekday(4);\nvar friday = weekday(5);\nvar saturday = weekday(6);\nvar sundays = sunday.range;\nvar mondays = monday.range;\nvar tuesdays = tuesday.range;\nvar wednesdays = wednesday.range;\nvar thursdays = thursday.range;\nvar fridays = friday.range;\nvar saturdays = saturday.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gnhQl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"months\", ()=>months);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar month = (0, _intervalJsDefault.default)(function(date) {\n    date.setDate(1);\n    date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setMonth(date.getMonth() + step);\n}, function(start, end) {\n    return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, function(date) {\n    return date.getMonth();\n});\nexports.default = month;\nvar months = month.range;\n\n},{\"./interval.js\":\"l16eQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"flVyx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"years\", ()=>years);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar year = (0, _intervalJsDefault.default)(function(date) {\n    date.setMonth(0, 1);\n    date.setHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setFullYear(date.getFullYear() + step);\n}, function(start, end) {\n    return end.getFullYear() - start.getFullYear();\n}, function(date) {\n    return date.getFullYear();\n});\n// An optimized implementation for this simple case.\nyear.every = function(k) {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : (0, _intervalJsDefault.default)(function(date) {\n        date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n        date.setMonth(0, 1);\n        date.setHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setFullYear(date.getFullYear() + step * k);\n    });\n};\nexports.default = year;\nvar years = year.range;\n\n},{\"./interval.js\":\"l16eQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eEHXX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcMinutes\", ()=>utcMinutes);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar utcMinute = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCSeconds(0, 0);\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationMinute));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationMinute);\n}, function(date) {\n    return date.getUTCMinutes();\n});\nexports.default = utcMinute;\nvar utcMinutes = utcMinute.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3ujpd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcHours\", ()=>utcHours);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar utcHour = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCMinutes(0, 0, 0);\n}, function(date, step) {\n    date.setTime(+date + step * (0, _durationJs.durationHour));\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationHour);\n}, function(date) {\n    return date.getUTCHours();\n});\nexports.default = utcHour;\nvar utcHours = utcHour.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8xXoA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcDays\", ()=>utcDays);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nvar utcDay = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setUTCDate(date.getUTCDate() + step);\n}, function(start, end) {\n    return (end - start) / (0, _durationJs.durationDay);\n}, function(date) {\n    return date.getUTCDate() - 1;\n});\nexports.default = utcDay;\nvar utcDays = utcDay.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eQvmg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcSunday\", ()=>utcSunday);\nparcelHelpers.export(exports, \"utcMonday\", ()=>utcMonday);\nparcelHelpers.export(exports, \"utcTuesday\", ()=>utcTuesday);\nparcelHelpers.export(exports, \"utcWednesday\", ()=>utcWednesday);\nparcelHelpers.export(exports, \"utcThursday\", ()=>utcThursday);\nparcelHelpers.export(exports, \"utcFriday\", ()=>utcFriday);\nparcelHelpers.export(exports, \"utcSaturday\", ()=>utcSaturday);\nparcelHelpers.export(exports, \"utcSundays\", ()=>utcSundays);\nparcelHelpers.export(exports, \"utcMondays\", ()=>utcMondays);\nparcelHelpers.export(exports, \"utcTuesdays\", ()=>utcTuesdays);\nparcelHelpers.export(exports, \"utcWednesdays\", ()=>utcWednesdays);\nparcelHelpers.export(exports, \"utcThursdays\", ()=>utcThursdays);\nparcelHelpers.export(exports, \"utcFridays\", ()=>utcFridays);\nparcelHelpers.export(exports, \"utcSaturdays\", ()=>utcSaturdays);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar _durationJs = require(\"./duration.js\");\nfunction utcWeekday(i) {\n    return (0, _intervalJsDefault.default)(function(date) {\n        date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n        date.setUTCHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setUTCDate(date.getUTCDate() + step * 7);\n    }, function(start, end) {\n        return (end - start) / (0, _durationJs.durationWeek);\n    });\n}\nvar utcSunday = utcWeekday(0);\nvar utcMonday = utcWeekday(1);\nvar utcTuesday = utcWeekday(2);\nvar utcWednesday = utcWeekday(3);\nvar utcThursday = utcWeekday(4);\nvar utcFriday = utcWeekday(5);\nvar utcSaturday = utcWeekday(6);\nvar utcSundays = utcSunday.range;\nvar utcMondays = utcMonday.range;\nvar utcTuesdays = utcTuesday.range;\nvar utcWednesdays = utcWednesday.range;\nvar utcThursdays = utcThursday.range;\nvar utcFridays = utcFriday.range;\nvar utcSaturdays = utcSaturday.range;\n\n},{\"./interval.js\":\"l16eQ\",\"./duration.js\":\"1XXl6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8g1B9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcMonths\", ()=>utcMonths);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar utcMonth = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCDate(1);\n    date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setUTCMonth(date.getUTCMonth() + step);\n}, function(start, end) {\n    return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, function(date) {\n    return date.getUTCMonth();\n});\nexports.default = utcMonth;\nvar utcMonths = utcMonth.range;\n\n},{\"./interval.js\":\"l16eQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hr08P\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcYears\", ()=>utcYears);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\nvar utcYear = (0, _intervalJsDefault.default)(function(date) {\n    date.setUTCMonth(0, 1);\n    date.setUTCHours(0, 0, 0, 0);\n}, function(date, step) {\n    date.setUTCFullYear(date.getUTCFullYear() + step);\n}, function(start, end) {\n    return end.getUTCFullYear() - start.getUTCFullYear();\n}, function(date) {\n    return date.getUTCFullYear();\n});\n// An optimized implementation for this simple case.\nutcYear.every = function(k) {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : (0, _intervalJsDefault.default)(function(date) {\n        date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n        date.setUTCMonth(0, 1);\n        date.setUTCHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setUTCFullYear(date.getUTCFullYear() + step * k);\n    });\n};\nexports.default = utcYear;\nvar utcYears = utcYear.range;\n\n},{\"./interval.js\":\"l16eQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hqlJr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"utcTicks\", ()=>utcTicks);\nparcelHelpers.export(exports, \"utcTickInterval\", ()=>utcTickInterval);\nparcelHelpers.export(exports, \"timeTicks\", ()=>timeTicks);\nparcelHelpers.export(exports, \"timeTickInterval\", ()=>timeTickInterval);\nvar _d3Array = require(\"d3-array\");\nvar _durationJs = require(\"./duration.js\");\nvar _millisecondJs = require(\"./millisecond.js\");\nvar _millisecondJsDefault = parcelHelpers.interopDefault(_millisecondJs);\nvar _secondJs = require(\"./second.js\");\nvar _secondJsDefault = parcelHelpers.interopDefault(_secondJs);\nvar _minuteJs = require(\"./minute.js\");\nvar _minuteJsDefault = parcelHelpers.interopDefault(_minuteJs);\nvar _hourJs = require(\"./hour.js\");\nvar _hourJsDefault = parcelHelpers.interopDefault(_hourJs);\nvar _dayJs = require(\"./day.js\");\nvar _dayJsDefault = parcelHelpers.interopDefault(_dayJs);\nvar _weekJs = require(\"./week.js\");\nvar _monthJs = require(\"./month.js\");\nvar _monthJsDefault = parcelHelpers.interopDefault(_monthJs);\nvar _yearJs = require(\"./year.js\");\nvar _yearJsDefault = parcelHelpers.interopDefault(_yearJs);\nvar _utcMinuteJs = require(\"./utcMinute.js\");\nvar _utcMinuteJsDefault = parcelHelpers.interopDefault(_utcMinuteJs);\nvar _utcHourJs = require(\"./utcHour.js\");\nvar _utcHourJsDefault = parcelHelpers.interopDefault(_utcHourJs);\nvar _utcDayJs = require(\"./utcDay.js\");\nvar _utcDayJsDefault = parcelHelpers.interopDefault(_utcDayJs);\nvar _utcWeekJs = require(\"./utcWeek.js\");\nvar _utcMonthJs = require(\"./utcMonth.js\");\nvar _utcMonthJsDefault = parcelHelpers.interopDefault(_utcMonthJs);\nvar _utcYearJs = require(\"./utcYear.js\");\nvar _utcYearJsDefault = parcelHelpers.interopDefault(_utcYearJs);\nfunction ticker(year, month, week, day, hour, minute) {\n    const tickIntervals = [\n        [\n            (0, _secondJsDefault.default),\n            1,\n            (0, _durationJs.durationSecond)\n        ],\n        [\n            (0, _secondJsDefault.default),\n            5,\n            5 * (0, _durationJs.durationSecond)\n        ],\n        [\n            (0, _secondJsDefault.default),\n            15,\n            15 * (0, _durationJs.durationSecond)\n        ],\n        [\n            (0, _secondJsDefault.default),\n            30,\n            30 * (0, _durationJs.durationSecond)\n        ],\n        [\n            minute,\n            1,\n            (0, _durationJs.durationMinute)\n        ],\n        [\n            minute,\n            5,\n            5 * (0, _durationJs.durationMinute)\n        ],\n        [\n            minute,\n            15,\n            15 * (0, _durationJs.durationMinute)\n        ],\n        [\n            minute,\n            30,\n            30 * (0, _durationJs.durationMinute)\n        ],\n        [\n            hour,\n            1,\n            (0, _durationJs.durationHour)\n        ],\n        [\n            hour,\n            3,\n            3 * (0, _durationJs.durationHour)\n        ],\n        [\n            hour,\n            6,\n            6 * (0, _durationJs.durationHour)\n        ],\n        [\n            hour,\n            12,\n            12 * (0, _durationJs.durationHour)\n        ],\n        [\n            day,\n            1,\n            (0, _durationJs.durationDay)\n        ],\n        [\n            day,\n            2,\n            2 * (0, _durationJs.durationDay)\n        ],\n        [\n            week,\n            1,\n            (0, _durationJs.durationWeek)\n        ],\n        [\n            month,\n            1,\n            (0, _durationJs.durationMonth)\n        ],\n        [\n            month,\n            3,\n            3 * (0, _durationJs.durationMonth)\n        ],\n        [\n            year,\n            1,\n            (0, _durationJs.durationYear)\n        ]\n    ];\n    function ticks1(start, stop, count) {\n        const reverse = stop < start;\n        if (reverse) [start, stop] = [\n            stop,\n            start\n        ];\n        const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n        const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n        return reverse ? ticks.reverse() : ticks;\n    }\n    function tickInterval(start, stop, count) {\n        const target = Math.abs(stop - start) / count;\n        const i = (0, _d3Array.bisector)(([, , step])=>step).right(tickIntervals, target);\n        if (i === tickIntervals.length) return year.every((0, _d3Array.tickStep)(start / (0, _durationJs.durationYear), stop / (0, _durationJs.durationYear), count));\n        if (i === 0) return (0, _millisecondJsDefault.default).every(Math.max((0, _d3Array.tickStep)(start, stop, count), 1));\n        const [t, step1] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n        return t.every(step1);\n    }\n    return [\n        ticks1,\n        tickInterval\n    ];\n}\nconst [utcTicks, utcTickInterval] = ticker((0, _utcYearJsDefault.default), (0, _utcMonthJsDefault.default), (0, _utcWeekJs.utcSunday), (0, _utcDayJsDefault.default), (0, _utcHourJsDefault.default), (0, _utcMinuteJsDefault.default));\nconst [timeTicks, timeTickInterval] = ticker((0, _yearJsDefault.default), (0, _monthJsDefault.default), (0, _weekJs.sunday), (0, _dayJsDefault.default), (0, _hourJsDefault.default), (0, _minuteJsDefault.default));\n\n},{\"d3-array\":\"6IwJG\",\"./duration.js\":\"1XXl6\",\"./millisecond.js\":\"1aEMD\",\"./second.js\":\"22XHb\",\"./minute.js\":\"6j7Ml\",\"./hour.js\":\"llDoC\",\"./day.js\":\"ewpwG\",\"./week.js\":\"gpqk4\",\"./month.js\":\"gnhQl\",\"./year.js\":\"flVyx\",\"./utcMinute.js\":\"eEHXX\",\"./utcHour.js\":\"3ujpd\",\"./utcDay.js\":\"8xXoA\",\"./utcWeek.js\":\"eQvmg\",\"./utcMonth.js\":\"8g1B9\",\"./utcYear.js\":\"hr08P\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"242jH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"timeFormatDefaultLocale\", ()=>(0, _defaultLocaleJsDefault.default));\nparcelHelpers.export(exports, \"timeFormat\", ()=>(0, _defaultLocaleJs.timeFormat));\nparcelHelpers.export(exports, \"timeParse\", ()=>(0, _defaultLocaleJs.timeParse));\nparcelHelpers.export(exports, \"utcFormat\", ()=>(0, _defaultLocaleJs.utcFormat));\nparcelHelpers.export(exports, \"utcParse\", ()=>(0, _defaultLocaleJs.utcParse));\nparcelHelpers.export(exports, \"timeFormatLocale\", ()=>(0, _localeJsDefault.default));\nparcelHelpers.export(exports, \"isoFormat\", ()=>(0, _isoFormatJsDefault.default));\nparcelHelpers.export(exports, \"isoParse\", ()=>(0, _isoParseJsDefault.default));\nvar _defaultLocaleJs = require(\"./defaultLocale.js\");\nvar _defaultLocaleJsDefault = parcelHelpers.interopDefault(_defaultLocaleJs);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar _isoFormatJs = require(\"./isoFormat.js\");\nvar _isoFormatJsDefault = parcelHelpers.interopDefault(_isoFormatJs);\nvar _isoParseJs = require(\"./isoParse.js\");\nvar _isoParseJsDefault = parcelHelpers.interopDefault(_isoParseJs);\n\n},{\"./defaultLocale.js\":\"hRBbX\",\"./locale.js\":\"iUewg\",\"./isoFormat.js\":false,\"./isoParse.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hRBbX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"timeFormat\", ()=>timeFormat);\nparcelHelpers.export(exports, \"timeParse\", ()=>timeParse);\nparcelHelpers.export(exports, \"utcFormat\", ()=>utcFormat);\nparcelHelpers.export(exports, \"utcParse\", ()=>utcParse);\nvar _localeJs = require(\"./locale.js\");\nvar _localeJsDefault = parcelHelpers.interopDefault(_localeJs);\nvar locale;\nvar timeFormat;\nvar timeParse;\nvar utcFormat;\nvar utcParse;\ndefaultLocale({\n    dateTime: \"%x, %X\",\n    date: \"%-m/%-d/%Y\",\n    time: \"%-I:%M:%S %p\",\n    periods: [\n        \"AM\",\n        \"PM\"\n    ],\n    days: [\n        \"Sunday\",\n        \"Monday\",\n        \"Tuesday\",\n        \"Wednesday\",\n        \"Thursday\",\n        \"Friday\",\n        \"Saturday\"\n    ],\n    shortDays: [\n        \"Sun\",\n        \"Mon\",\n        \"Tue\",\n        \"Wed\",\n        \"Thu\",\n        \"Fri\",\n        \"Sat\"\n    ],\n    months: [\n        \"January\",\n        \"February\",\n        \"March\",\n        \"April\",\n        \"May\",\n        \"June\",\n        \"July\",\n        \"August\",\n        \"September\",\n        \"October\",\n        \"November\",\n        \"December\"\n    ],\n    shortMonths: [\n        \"Jan\",\n        \"Feb\",\n        \"Mar\",\n        \"Apr\",\n        \"May\",\n        \"Jun\",\n        \"Jul\",\n        \"Aug\",\n        \"Sep\",\n        \"Oct\",\n        \"Nov\",\n        \"Dec\"\n    ]\n});\nfunction defaultLocale(definition) {\n    locale = (0, _localeJsDefault.default)(definition);\n    timeFormat = locale.format;\n    timeParse = locale.parse;\n    utcFormat = locale.utcFormat;\n    utcParse = locale.utcParse;\n    return locale;\n}\nexports.default = defaultLocale;\n\n},{\"./locale.js\":\"iUewg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iUewg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Time = require(\"d3-time\");\nfunction localDate(d) {\n    if (0 <= d.y && d.y < 100) {\n        var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n        date.setFullYear(d.y);\n        return date;\n    }\n    return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\nfunction utcDate(d) {\n    if (0 <= d.y && d.y < 100) {\n        var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n        date.setUTCFullYear(d.y);\n        return date;\n    }\n    return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\nfunction newDate(y, m, d) {\n    return {\n        y: y,\n        m: m,\n        d: d,\n        H: 0,\n        M: 0,\n        S: 0,\n        L: 0\n    };\n}\nfunction formatLocale(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_weekdays = locale.days, locale_shortWeekdays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    var periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths);\n    var formats1 = {\n        \"a\": formatShortWeekday,\n        \"A\": formatWeekday,\n        \"b\": formatShortMonth,\n        \"B\": formatMonth,\n        \"c\": null,\n        \"d\": formatDayOfMonth,\n        \"e\": formatDayOfMonth,\n        \"f\": formatMicroseconds,\n        \"g\": formatYearISO,\n        \"G\": formatFullYearISO,\n        \"H\": formatHour24,\n        \"I\": formatHour12,\n        \"j\": formatDayOfYear,\n        \"L\": formatMilliseconds,\n        \"m\": formatMonthNumber,\n        \"M\": formatMinutes,\n        \"p\": formatPeriod,\n        \"q\": formatQuarter,\n        \"Q\": formatUnixTimestamp,\n        \"s\": formatUnixTimestampSeconds,\n        \"S\": formatSeconds,\n        \"u\": formatWeekdayNumberMonday,\n        \"U\": formatWeekNumberSunday,\n        \"V\": formatWeekNumberISO,\n        \"w\": formatWeekdayNumberSunday,\n        \"W\": formatWeekNumberMonday,\n        \"x\": null,\n        \"X\": null,\n        \"y\": formatYear,\n        \"Y\": formatFullYear,\n        \"Z\": formatZone,\n        \"%\": formatLiteralPercent\n    };\n    var utcFormats = {\n        \"a\": formatUTCShortWeekday,\n        \"A\": formatUTCWeekday,\n        \"b\": formatUTCShortMonth,\n        \"B\": formatUTCMonth,\n        \"c\": null,\n        \"d\": formatUTCDayOfMonth,\n        \"e\": formatUTCDayOfMonth,\n        \"f\": formatUTCMicroseconds,\n        \"g\": formatUTCYearISO,\n        \"G\": formatUTCFullYearISO,\n        \"H\": formatUTCHour24,\n        \"I\": formatUTCHour12,\n        \"j\": formatUTCDayOfYear,\n        \"L\": formatUTCMilliseconds,\n        \"m\": formatUTCMonthNumber,\n        \"M\": formatUTCMinutes,\n        \"p\": formatUTCPeriod,\n        \"q\": formatUTCQuarter,\n        \"Q\": formatUnixTimestamp,\n        \"s\": formatUnixTimestampSeconds,\n        \"S\": formatUTCSeconds,\n        \"u\": formatUTCWeekdayNumberMonday,\n        \"U\": formatUTCWeekNumberSunday,\n        \"V\": formatUTCWeekNumberISO,\n        \"w\": formatUTCWeekdayNumberSunday,\n        \"W\": formatUTCWeekNumberMonday,\n        \"x\": null,\n        \"X\": null,\n        \"y\": formatUTCYear,\n        \"Y\": formatUTCFullYear,\n        \"Z\": formatUTCZone,\n        \"%\": formatLiteralPercent\n    };\n    var parses = {\n        \"a\": parseShortWeekday,\n        \"A\": parseWeekday,\n        \"b\": parseShortMonth,\n        \"B\": parseMonth,\n        \"c\": parseLocaleDateTime,\n        \"d\": parseDayOfMonth,\n        \"e\": parseDayOfMonth,\n        \"f\": parseMicroseconds,\n        \"g\": parseYear,\n        \"G\": parseFullYear,\n        \"H\": parseHour24,\n        \"I\": parseHour24,\n        \"j\": parseDayOfYear,\n        \"L\": parseMilliseconds,\n        \"m\": parseMonthNumber,\n        \"M\": parseMinutes,\n        \"p\": parsePeriod,\n        \"q\": parseQuarter,\n        \"Q\": parseUnixTimestamp,\n        \"s\": parseUnixTimestampSeconds,\n        \"S\": parseSeconds,\n        \"u\": parseWeekdayNumberMonday,\n        \"U\": parseWeekNumberSunday,\n        \"V\": parseWeekNumberISO,\n        \"w\": parseWeekdayNumberSunday,\n        \"W\": parseWeekNumberMonday,\n        \"x\": parseLocaleDate,\n        \"X\": parseLocaleTime,\n        \"y\": parseYear,\n        \"Y\": parseFullYear,\n        \"Z\": parseZone,\n        \"%\": parseLiteralPercent\n    };\n    // These recursive directive definitions must be deferred.\n    formats1.x = newFormat(locale_date, formats1);\n    formats1.X = newFormat(locale_time, formats1);\n    formats1.c = newFormat(locale_dateTime, formats1);\n    utcFormats.x = newFormat(locale_date, utcFormats);\n    utcFormats.X = newFormat(locale_time, utcFormats);\n    utcFormats.c = newFormat(locale_dateTime, utcFormats);\n    function newFormat(specifier, formats) {\n        return function(date) {\n            var string = [], i = -1, j = 0, n = specifier.length, c, pad1, format;\n            if (!(date instanceof Date)) date = new Date(+date);\n            while(++i < n)if (specifier.charCodeAt(i) === 37) {\n                string.push(specifier.slice(j, i));\n                if ((pad1 = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n                else pad1 = c === \"e\" ? \" \" : \"0\";\n                if (format = formats[c]) c = format(date, pad1);\n                string.push(c);\n                j = i + 1;\n            }\n            string.push(specifier.slice(j, i));\n            return string.join(\"\");\n        };\n    }\n    function newParse(specifier, Z) {\n        return function(string) {\n            var d = newDate(1900, undefined, 1), i = parseSpecifier(d, specifier, string += \"\", 0), week, day;\n            if (i != string.length) return null;\n            // If a UNIX timestamp is specified, return it.\n            if (\"Q\" in d) return new Date(d.Q);\n            if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n            // If this is utcParse, never use the local timezone.\n            if (Z && !(\"Z\" in d)) d.Z = 0;\n            // The am-pm flag is 0 for AM, and 1 for PM.\n            if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n            // If the month was not specified, inherit from the quarter.\n            if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n            // Convert day-of-week and week-of-year to day-of-year.\n            if (\"V\" in d) {\n                if (d.V < 1 || d.V > 53) return null;\n                if (!(\"w\" in d)) d.w = 1;\n                if (\"Z\" in d) {\n                    week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n                    week = day > 4 || day === 0 ? (0, _d3Time.utcMonday).ceil(week) : (0, _d3Time.utcMonday)(week);\n                    week = (0, _d3Time.utcDay).offset(week, (d.V - 1) * 7);\n                    d.y = week.getUTCFullYear();\n                    d.m = week.getUTCMonth();\n                    d.d = week.getUTCDate() + (d.w + 6) % 7;\n                } else {\n                    week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n                    week = day > 4 || day === 0 ? (0, _d3Time.timeMonday).ceil(week) : (0, _d3Time.timeMonday)(week);\n                    week = (0, _d3Time.timeDay).offset(week, (d.V - 1) * 7);\n                    d.y = week.getFullYear();\n                    d.m = week.getMonth();\n                    d.d = week.getDate() + (d.w + 6) % 7;\n                }\n            } else if (\"W\" in d || \"U\" in d) {\n                if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n                day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n                d.m = 0;\n                d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n            }\n            // If a time zone is specified, all fields are interpreted as UTC and then\n            // offset according to the specified time zone.\n            if (\"Z\" in d) {\n                d.H += d.Z / 100 | 0;\n                d.M += d.Z % 100;\n                return utcDate(d);\n            }\n            // Otherwise, all fields are in local time.\n            return localDate(d);\n        };\n    }\n    function parseSpecifier(d, specifier, string, j) {\n        var i = 0, n = specifier.length, m = string.length, c, parse;\n        while(i < n){\n            if (j >= m) return -1;\n            c = specifier.charCodeAt(i++);\n            if (c === 37) {\n                c = specifier.charAt(i++);\n                parse = parses[c in pads ? specifier.charAt(i++) : c];\n                if (!parse || (j = parse(d, string, j)) < 0) return -1;\n            } else if (c != string.charCodeAt(j++)) return -1;\n        }\n        return j;\n    }\n    function parsePeriod(d, string, i) {\n        var n = periodRe.exec(string.slice(i));\n        return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortWeekday(d, string, i) {\n        var n = shortWeekdayRe.exec(string.slice(i));\n        return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseWeekday(d, string, i) {\n        var n = weekdayRe.exec(string.slice(i));\n        return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortMonth(d, string, i) {\n        var n = shortMonthRe.exec(string.slice(i));\n        return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseMonth(d, string, i) {\n        var n = monthRe.exec(string.slice(i));\n        return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseLocaleDateTime(d, string, i) {\n        return parseSpecifier(d, locale_dateTime, string, i);\n    }\n    function parseLocaleDate(d, string, i) {\n        return parseSpecifier(d, locale_date, string, i);\n    }\n    function parseLocaleTime(d, string, i) {\n        return parseSpecifier(d, locale_time, string, i);\n    }\n    function formatShortWeekday(d) {\n        return locale_shortWeekdays[d.getDay()];\n    }\n    function formatWeekday(d) {\n        return locale_weekdays[d.getDay()];\n    }\n    function formatShortMonth(d) {\n        return locale_shortMonths[d.getMonth()];\n    }\n    function formatMonth(d) {\n        return locale_months[d.getMonth()];\n    }\n    function formatPeriod(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n    }\n    function formatQuarter(d) {\n        return 1 + ~~(d.getMonth() / 3);\n    }\n    function formatUTCShortWeekday(d) {\n        return locale_shortWeekdays[d.getUTCDay()];\n    }\n    function formatUTCWeekday(d) {\n        return locale_weekdays[d.getUTCDay()];\n    }\n    function formatUTCShortMonth(d) {\n        return locale_shortMonths[d.getUTCMonth()];\n    }\n    function formatUTCMonth(d) {\n        return locale_months[d.getUTCMonth()];\n    }\n    function formatUTCPeriod(d) {\n        return locale_periods[+(d.getUTCHours() >= 12)];\n    }\n    function formatUTCQuarter(d) {\n        return 1 + ~~(d.getUTCMonth() / 3);\n    }\n    return {\n        format: function(specifier) {\n            var f = newFormat(specifier += \"\", formats1);\n            f.toString = function() {\n                return specifier;\n            };\n            return f;\n        },\n        parse: function(specifier) {\n            var p = newParse(specifier += \"\", false);\n            p.toString = function() {\n                return specifier;\n            };\n            return p;\n        },\n        utcFormat: function(specifier) {\n            var f = newFormat(specifier += \"\", utcFormats);\n            f.toString = function() {\n                return specifier;\n            };\n            return f;\n        },\n        utcParse: function(specifier) {\n            var p = newParse(specifier += \"\", true);\n            p.toString = function() {\n                return specifier;\n            };\n            return p;\n        }\n    };\n}\nexports.default = formatLocale;\nvar pads = {\n    \"-\": \"\",\n    \"_\": \" \",\n    \"0\": \"0\"\n}, numberRe = /^\\s*\\d+/, percentRe = /^%/, requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\nfunction pad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\nfunction requote(s) {\n    return s.replace(requoteRe, \"\\\\$&\");\n}\nfunction formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\nfunction formatLookup(names) {\n    return new Map(names.map((name, i)=>[\n            name.toLowerCase(),\n            i\n        ]));\n}\nfunction parseWeekdayNumberSunday(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 1));\n    return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekdayNumberMonday(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 1));\n    return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberSunday(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberISO(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\nfunction parseWeekNumberMonday(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\nfunction parseFullYear(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 4));\n    return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\nfunction parseYear(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\nfunction parseZone(d, string, i) {\n    var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n    return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\nfunction parseQuarter(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 1));\n    return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\nfunction parseMonthNumber(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\nfunction parseDayOfMonth(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\nfunction parseDayOfYear(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 3));\n    return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\nfunction parseHour24(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\nfunction parseMinutes(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\nfunction parseSeconds(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 2));\n    return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\nfunction parseMilliseconds(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 3));\n    return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\nfunction parseMicroseconds(d, string, i) {\n    var n = numberRe.exec(string.slice(i, i + 6));\n    return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\nfunction parseLiteralPercent(d, string, i) {\n    var n = percentRe.exec(string.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n}\nfunction parseUnixTimestamp(d, string, i) {\n    var n = numberRe.exec(string.slice(i));\n    return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\nfunction parseUnixTimestampSeconds(d, string, i) {\n    var n = numberRe.exec(string.slice(i));\n    return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\nfunction formatDayOfMonth(d, p) {\n    return pad(d.getDate(), p, 2);\n}\nfunction formatHour24(d, p) {\n    return pad(d.getHours(), p, 2);\n}\nfunction formatHour12(d, p) {\n    return pad(d.getHours() % 12 || 12, p, 2);\n}\nfunction formatDayOfYear(d, p) {\n    return pad(1 + (0, _d3Time.timeDay).count((0, _d3Time.timeYear)(d), d), p, 3);\n}\nfunction formatMilliseconds(d, p) {\n    return pad(d.getMilliseconds(), p, 3);\n}\nfunction formatMicroseconds(d, p) {\n    return formatMilliseconds(d, p) + \"000\";\n}\nfunction formatMonthNumber(d, p) {\n    return pad(d.getMonth() + 1, p, 2);\n}\nfunction formatMinutes(d, p) {\n    return pad(d.getMinutes(), p, 2);\n}\nfunction formatSeconds(d, p) {\n    return pad(d.getSeconds(), p, 2);\n}\nfunction formatWeekdayNumberMonday(d) {\n    var day = d.getDay();\n    return day === 0 ? 7 : day;\n}\nfunction formatWeekNumberSunday(d, p) {\n    return pad((0, _d3Time.timeSunday).count((0, _d3Time.timeYear)(d) - 1, d), p, 2);\n}\nfunction dISO(d) {\n    var day = d.getDay();\n    return day >= 4 || day === 0 ? (0, _d3Time.timeThursday)(d) : (0, _d3Time.timeThursday).ceil(d);\n}\nfunction formatWeekNumberISO(d, p) {\n    d = dISO(d);\n    return pad((0, _d3Time.timeThursday).count((0, _d3Time.timeYear)(d), d) + ((0, _d3Time.timeYear)(d).getDay() === 4), p, 2);\n}\nfunction formatWeekdayNumberSunday(d) {\n    return d.getDay();\n}\nfunction formatWeekNumberMonday(d, p) {\n    return pad((0, _d3Time.timeMonday).count((0, _d3Time.timeYear)(d) - 1, d), p, 2);\n}\nfunction formatYear(d, p) {\n    return pad(d.getFullYear() % 100, p, 2);\n}\nfunction formatYearISO(d, p) {\n    d = dISO(d);\n    return pad(d.getFullYear() % 100, p, 2);\n}\nfunction formatFullYear(d, p) {\n    return pad(d.getFullYear() % 10000, p, 4);\n}\nfunction formatFullYearISO(d, p) {\n    var day = d.getDay();\n    d = day >= 4 || day === 0 ? (0, _d3Time.timeThursday)(d) : (0, _d3Time.timeThursday).ceil(d);\n    return pad(d.getFullYear() % 10000, p, 4);\n}\nfunction formatZone(d) {\n    var z = d.getTimezoneOffset();\n    return (z > 0 ? \"-\" : (z *= -1, \"+\")) + pad(z / 60 | 0, \"0\", 2) + pad(z % 60, \"0\", 2);\n}\nfunction formatUTCDayOfMonth(d, p) {\n    return pad(d.getUTCDate(), p, 2);\n}\nfunction formatUTCHour24(d, p) {\n    return pad(d.getUTCHours(), p, 2);\n}\nfunction formatUTCHour12(d, p) {\n    return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\nfunction formatUTCDayOfYear(d, p) {\n    return pad(1 + (0, _d3Time.utcDay).count((0, _d3Time.utcYear)(d), d), p, 3);\n}\nfunction formatUTCMilliseconds(d, p) {\n    return pad(d.getUTCMilliseconds(), p, 3);\n}\nfunction formatUTCMicroseconds(d, p) {\n    return formatUTCMilliseconds(d, p) + \"000\";\n}\nfunction formatUTCMonthNumber(d, p) {\n    return pad(d.getUTCMonth() + 1, p, 2);\n}\nfunction formatUTCMinutes(d, p) {\n    return pad(d.getUTCMinutes(), p, 2);\n}\nfunction formatUTCSeconds(d, p) {\n    return pad(d.getUTCSeconds(), p, 2);\n}\nfunction formatUTCWeekdayNumberMonday(d) {\n    var dow = d.getUTCDay();\n    return dow === 0 ? 7 : dow;\n}\nfunction formatUTCWeekNumberSunday(d, p) {\n    return pad((0, _d3Time.utcSunday).count((0, _d3Time.utcYear)(d) - 1, d), p, 2);\n}\nfunction UTCdISO(d) {\n    var day = d.getUTCDay();\n    return day >= 4 || day === 0 ? (0, _d3Time.utcThursday)(d) : (0, _d3Time.utcThursday).ceil(d);\n}\nfunction formatUTCWeekNumberISO(d, p) {\n    d = UTCdISO(d);\n    return pad((0, _d3Time.utcThursday).count((0, _d3Time.utcYear)(d), d) + ((0, _d3Time.utcYear)(d).getUTCDay() === 4), p, 2);\n}\nfunction formatUTCWeekdayNumberSunday(d) {\n    return d.getUTCDay();\n}\nfunction formatUTCWeekNumberMonday(d, p) {\n    return pad((0, _d3Time.utcMonday).count((0, _d3Time.utcYear)(d) - 1, d), p, 2);\n}\nfunction formatUTCYear(d, p) {\n    return pad(d.getUTCFullYear() % 100, p, 2);\n}\nfunction formatUTCYearISO(d, p) {\n    d = UTCdISO(d);\n    return pad(d.getUTCFullYear() % 100, p, 2);\n}\nfunction formatUTCFullYear(d, p) {\n    return pad(d.getUTCFullYear() % 10000, p, 4);\n}\nfunction formatUTCFullYearISO(d, p) {\n    var day = d.getUTCDay();\n    d = day >= 4 || day === 0 ? (0, _d3Time.utcThursday)(d) : (0, _d3Time.utcThursday).ceil(d);\n    return pad(d.getUTCFullYear() % 10000, p, 4);\n}\nfunction formatUTCZone() {\n    return \"+0000\";\n}\nfunction formatLiteralPercent() {\n    return \"%\";\n}\nfunction formatUnixTimestamp(d) {\n    return +d;\n}\nfunction formatUnixTimestampSeconds(d) {\n    return Math.floor(+d / 1000);\n}\n\n},{\"d3-time\":\"8e7eR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kZBmL\":[function(require,module,exports) {\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */ /* eslint-disable no-proto */ \"use strict\";\nvar base64 = require(\"base64-js\");\nvar ieee754 = require(\"ieee754\");\nvar customInspectSymbol = typeof Symbol === \"function\" && typeof Symbol[\"for\"] === \"function\" // eslint-disable-line dot-notation\n ? Symbol[\"for\"](\"nodejs.util.inspect.custom\") // eslint-disable-line dot-notation\n : null;\nexports.Buffer = Buffer;\nexports.SlowBuffer = SlowBuffer;\nexports.INSPECT_MAX_BYTES = 50;\nvar K_MAX_LENGTH = 0x7fffffff;\nexports.kMaxLength = K_MAX_LENGTH;\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */ Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport();\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== \"undefined\" && typeof console.error === \"function\") console.error(\"This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.\");\nfunction typedArraySupport() {\n    // Can typed array instances can be augmented?\n    try {\n        var arr = new Uint8Array(1);\n        var proto = {\n            foo: function() {\n                return 42;\n            }\n        };\n        Object.setPrototypeOf(proto, Uint8Array.prototype);\n        Object.setPrototypeOf(arr, proto);\n        return arr.foo() === 42;\n    } catch (e) {\n        return false;\n    }\n}\nObject.defineProperty(Buffer.prototype, \"parent\", {\n    enumerable: true,\n    get: function() {\n        if (!Buffer.isBuffer(this)) return undefined;\n        return this.buffer;\n    }\n});\nObject.defineProperty(Buffer.prototype, \"offset\", {\n    enumerable: true,\n    get: function() {\n        if (!Buffer.isBuffer(this)) return undefined;\n        return this.byteOffset;\n    }\n});\nfunction createBuffer(length) {\n    if (length > K_MAX_LENGTH) throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"');\n    // Return an augmented `Uint8Array` instance\n    var buf = new Uint8Array(length);\n    Object.setPrototypeOf(buf, Buffer.prototype);\n    return buf;\n}\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */ function Buffer(arg, encodingOrOffset, length) {\n    // Common case.\n    if (typeof arg === \"number\") {\n        if (typeof encodingOrOffset === \"string\") throw new TypeError('The \"string\" argument must be of type string. Received type number');\n        return allocUnsafe(arg);\n    }\n    return from(arg, encodingOrOffset, length);\n}\nBuffer.poolSize = 8192 // not used by this implementation\n;\nfunction from(value, encodingOrOffset, length) {\n    if (typeof value === \"string\") return fromString(value, encodingOrOffset);\n    if (ArrayBuffer.isView(value)) return fromArrayView(value);\n    if (value == null) throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value);\n    if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) return fromArrayBuffer(value, encodingOrOffset, length);\n    if (typeof SharedArrayBuffer !== \"undefined\" && (isInstance(value, SharedArrayBuffer) || value && isInstance(value.buffer, SharedArrayBuffer))) return fromArrayBuffer(value, encodingOrOffset, length);\n    if (typeof value === \"number\") throw new TypeError('The \"value\" argument must not be of type number. Received type number');\n    var valueOf = value.valueOf && value.valueOf();\n    if (valueOf != null && valueOf !== value) return Buffer.from(valueOf, encodingOrOffset, length);\n    var b = fromObject(value);\n    if (b) return b;\n    if (typeof Symbol !== \"undefined\" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === \"function\") return Buffer.from(value[Symbol.toPrimitive](\"string\"), encodingOrOffset, length);\n    throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value);\n}\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/ Buffer.from = function(value, encodingOrOffset, length) {\n    return from(value, encodingOrOffset, length);\n};\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype);\nObject.setPrototypeOf(Buffer, Uint8Array);\nfunction assertSize(size) {\n    if (typeof size !== \"number\") throw new TypeError('\"size\" argument must be of type number');\n    else if (size < 0) throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"');\n}\nfunction alloc(size, fill, encoding) {\n    assertSize(size);\n    if (size <= 0) return createBuffer(size);\n    if (fill !== undefined) // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpreted as a start offset.\n    return typeof encoding === \"string\" ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill);\n    return createBuffer(size);\n}\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/ Buffer.alloc = function(size, fill, encoding) {\n    return alloc(size, fill, encoding);\n};\nfunction allocUnsafe(size) {\n    assertSize(size);\n    return createBuffer(size < 0 ? 0 : checked(size) | 0);\n}\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */ Buffer.allocUnsafe = function(size) {\n    return allocUnsafe(size);\n};\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */ Buffer.allocUnsafeSlow = function(size) {\n    return allocUnsafe(size);\n};\nfunction fromString(string, encoding) {\n    if (typeof encoding !== \"string\" || encoding === \"\") encoding = \"utf8\";\n    if (!Buffer.isEncoding(encoding)) throw new TypeError(\"Unknown encoding: \" + encoding);\n    var length = byteLength(string, encoding) | 0;\n    var buf = createBuffer(length);\n    var actual = buf.write(string, encoding);\n    if (actual !== length) // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual);\n    return buf;\n}\nfunction fromArrayLike(array) {\n    var length = array.length < 0 ? 0 : checked(array.length) | 0;\n    var buf = createBuffer(length);\n    for(var i = 0; i < length; i += 1)buf[i] = array[i] & 255;\n    return buf;\n}\nfunction fromArrayView(arrayView) {\n    if (isInstance(arrayView, Uint8Array)) {\n        var copy = new Uint8Array(arrayView);\n        return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength);\n    }\n    return fromArrayLike(arrayView);\n}\nfunction fromArrayBuffer(array, byteOffset, length) {\n    if (byteOffset < 0 || array.byteLength < byteOffset) throw new RangeError('\"offset\" is outside of buffer bounds');\n    if (array.byteLength < byteOffset + (length || 0)) throw new RangeError('\"length\" is outside of buffer bounds');\n    var buf;\n    if (byteOffset === undefined && length === undefined) buf = new Uint8Array(array);\n    else if (length === undefined) buf = new Uint8Array(array, byteOffset);\n    else buf = new Uint8Array(array, byteOffset, length);\n    // Return an augmented `Uint8Array` instance\n    Object.setPrototypeOf(buf, Buffer.prototype);\n    return buf;\n}\nfunction fromObject(obj) {\n    if (Buffer.isBuffer(obj)) {\n        var len = checked(obj.length) | 0;\n        var buf = createBuffer(len);\n        if (buf.length === 0) return buf;\n        obj.copy(buf, 0, 0, len);\n        return buf;\n    }\n    if (obj.length !== undefined) {\n        if (typeof obj.length !== \"number\" || numberIsNaN(obj.length)) return createBuffer(0);\n        return fromArrayLike(obj);\n    }\n    if (obj.type === \"Buffer\" && Array.isArray(obj.data)) return fromArrayLike(obj.data);\n}\nfunction checked(length) {\n    // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n    // length is NaN (which is otherwise coerced to zero.)\n    if (length >= K_MAX_LENGTH) throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\" + K_MAX_LENGTH.toString(16) + \" bytes\");\n    return length | 0;\n}\nfunction SlowBuffer(length) {\n    if (+length != length) length = 0;\n    return Buffer.alloc(+length);\n}\nBuffer.isBuffer = function isBuffer(b) {\n    return b != null && b._isBuffer === true && b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n    ;\n};\nBuffer.compare = function compare(a, b) {\n    if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength);\n    if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength);\n    if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) throw new TypeError('The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array');\n    if (a === b) return 0;\n    var x = a.length;\n    var y = b.length;\n    for(var i = 0, len = Math.min(x, y); i < len; ++i)if (a[i] !== b[i]) {\n        x = a[i];\n        y = b[i];\n        break;\n    }\n    if (x < y) return -1;\n    if (y < x) return 1;\n    return 0;\n};\nBuffer.isEncoding = function isEncoding(encoding) {\n    switch(String(encoding).toLowerCase()){\n        case \"hex\":\n        case \"utf8\":\n        case \"utf-8\":\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n        case \"base64\":\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return true;\n        default:\n            return false;\n    }\n};\nBuffer.concat = function concat(list, length) {\n    if (!Array.isArray(list)) throw new TypeError('\"list\" argument must be an Array of Buffers');\n    if (list.length === 0) return Buffer.alloc(0);\n    var i;\n    if (length === undefined) {\n        length = 0;\n        for(i = 0; i < list.length; ++i)length += list[i].length;\n    }\n    var buffer = Buffer.allocUnsafe(length);\n    var pos = 0;\n    for(i = 0; i < list.length; ++i){\n        var buf = list[i];\n        if (isInstance(buf, Uint8Array)) {\n            if (pos + buf.length > buffer.length) Buffer.from(buf).copy(buffer, pos);\n            else Uint8Array.prototype.set.call(buffer, buf, pos);\n        } else if (!Buffer.isBuffer(buf)) throw new TypeError('\"list\" argument must be an Array of Buffers');\n        else buf.copy(buffer, pos);\n        pos += buf.length;\n    }\n    return buffer;\n};\nfunction byteLength(string, encoding) {\n    if (Buffer.isBuffer(string)) return string.length;\n    if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) return string.byteLength;\n    if (typeof string !== \"string\") throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string);\n    var len = string.length;\n    var mustMatch = arguments.length > 2 && arguments[2] === true;\n    if (!mustMatch && len === 0) return 0;\n    // Use a for loop to avoid recursion\n    var loweredCase = false;\n    for(;;)switch(encoding){\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n            return len;\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8ToBytes(string).length;\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return len * 2;\n        case \"hex\":\n            return len >>> 1;\n        case \"base64\":\n            return base64ToBytes(string).length;\n        default:\n            if (loweredCase) return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n            ;\n            encoding = (\"\" + encoding).toLowerCase();\n            loweredCase = true;\n    }\n}\nBuffer.byteLength = byteLength;\nfunction slowToString(encoding, start, end) {\n    var loweredCase = false;\n    // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n    // property of a typed array.\n    // This behaves neither like String nor Uint8Array in that we set start/end\n    // to their upper/lower bounds if the value passed is out of range.\n    // undefined is handled specially as per ECMA-262 6th Edition,\n    // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n    if (start === undefined || start < 0) start = 0;\n    // Return early if start > this.length. Done here to prevent potential uint32\n    // coercion fail below.\n    if (start > this.length) return \"\";\n    if (end === undefined || end > this.length) end = this.length;\n    if (end <= 0) return \"\";\n    // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n    end >>>= 0;\n    start >>>= 0;\n    if (end <= start) return \"\";\n    if (!encoding) encoding = \"utf8\";\n    while(true)switch(encoding){\n        case \"hex\":\n            return hexSlice(this, start, end);\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8Slice(this, start, end);\n        case \"ascii\":\n            return asciiSlice(this, start, end);\n        case \"latin1\":\n        case \"binary\":\n            return latin1Slice(this, start, end);\n        case \"base64\":\n            return base64Slice(this, start, end);\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return utf16leSlice(this, start, end);\n        default:\n            if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n            encoding = (encoding + \"\").toLowerCase();\n            loweredCase = true;\n    }\n}\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true;\nfunction swap(b, n, m) {\n    var i = b[n];\n    b[n] = b[m];\n    b[m] = i;\n}\nBuffer.prototype.swap16 = function swap16() {\n    var len = this.length;\n    if (len % 2 !== 0) throw new RangeError(\"Buffer size must be a multiple of 16-bits\");\n    for(var i = 0; i < len; i += 2)swap(this, i, i + 1);\n    return this;\n};\nBuffer.prototype.swap32 = function swap32() {\n    var len = this.length;\n    if (len % 4 !== 0) throw new RangeError(\"Buffer size must be a multiple of 32-bits\");\n    for(var i = 0; i < len; i += 4){\n        swap(this, i, i + 3);\n        swap(this, i + 1, i + 2);\n    }\n    return this;\n};\nBuffer.prototype.swap64 = function swap64() {\n    var len = this.length;\n    if (len % 8 !== 0) throw new RangeError(\"Buffer size must be a multiple of 64-bits\");\n    for(var i = 0; i < len; i += 8){\n        swap(this, i, i + 7);\n        swap(this, i + 1, i + 6);\n        swap(this, i + 2, i + 5);\n        swap(this, i + 3, i + 4);\n    }\n    return this;\n};\nBuffer.prototype.toString = function toString() {\n    var length = this.length;\n    if (length === 0) return \"\";\n    if (arguments.length === 0) return utf8Slice(this, 0, length);\n    return slowToString.apply(this, arguments);\n};\nBuffer.prototype.toLocaleString = Buffer.prototype.toString;\nBuffer.prototype.equals = function equals(b) {\n    if (!Buffer.isBuffer(b)) throw new TypeError(\"Argument must be a Buffer\");\n    if (this === b) return true;\n    return Buffer.compare(this, b) === 0;\n};\nBuffer.prototype.inspect = function inspect() {\n    var str = \"\";\n    var max = exports.INSPECT_MAX_BYTES;\n    str = this.toString(\"hex\", 0, max).replace(/(.{2})/g, \"$1 \").trim();\n    if (this.length > max) str += \" ... \";\n    return \"<Buffer \" + str + \">\";\n};\nif (customInspectSymbol) Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect;\nBuffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {\n    if (isInstance(target, Uint8Array)) target = Buffer.from(target, target.offset, target.byteLength);\n    if (!Buffer.isBuffer(target)) throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target);\n    if (start === undefined) start = 0;\n    if (end === undefined) end = target ? target.length : 0;\n    if (thisStart === undefined) thisStart = 0;\n    if (thisEnd === undefined) thisEnd = this.length;\n    if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) throw new RangeError(\"out of range index\");\n    if (thisStart >= thisEnd && start >= end) return 0;\n    if (thisStart >= thisEnd) return -1;\n    if (start >= end) return 1;\n    start >>>= 0;\n    end >>>= 0;\n    thisStart >>>= 0;\n    thisEnd >>>= 0;\n    if (this === target) return 0;\n    var x = thisEnd - thisStart;\n    var y = end - start;\n    var len = Math.min(x, y);\n    var thisCopy = this.slice(thisStart, thisEnd);\n    var targetCopy = target.slice(start, end);\n    for(var i = 0; i < len; ++i)if (thisCopy[i] !== targetCopy[i]) {\n        x = thisCopy[i];\n        y = targetCopy[i];\n        break;\n    }\n    if (x < y) return -1;\n    if (y < x) return 1;\n    return 0;\n};\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {\n    // Empty buffer means no match\n    if (buffer.length === 0) return -1;\n    // Normalize byteOffset\n    if (typeof byteOffset === \"string\") {\n        encoding = byteOffset;\n        byteOffset = 0;\n    } else if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff;\n    else if (byteOffset < -2147483648) byteOffset = -2147483648;\n    byteOffset = +byteOffset // Coerce to Number.\n    ;\n    if (numberIsNaN(byteOffset)) // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : buffer.length - 1;\n    // Normalize byteOffset: negative offsets start from the end of the buffer\n    if (byteOffset < 0) byteOffset = buffer.length + byteOffset;\n    if (byteOffset >= buffer.length) {\n        if (dir) return -1;\n        else byteOffset = buffer.length - 1;\n    } else if (byteOffset < 0) {\n        if (dir) byteOffset = 0;\n        else return -1;\n    }\n    // Normalize val\n    if (typeof val === \"string\") val = Buffer.from(val, encoding);\n    // Finally, search either indexOf (if dir is true) or lastIndexOf\n    if (Buffer.isBuffer(val)) {\n        // Special case: looking for empty string/buffer always fails\n        if (val.length === 0) return -1;\n        return arrayIndexOf(buffer, val, byteOffset, encoding, dir);\n    } else if (typeof val === \"number\") {\n        val = val & 0xFF // Search for a byte value [0-255]\n        ;\n        if (typeof Uint8Array.prototype.indexOf === \"function\") {\n            if (dir) return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);\n            else return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);\n        }\n        return arrayIndexOf(buffer, [\n            val\n        ], byteOffset, encoding, dir);\n    }\n    throw new TypeError(\"val must be string, number or Buffer\");\n}\nfunction arrayIndexOf(arr, val, byteOffset, encoding, dir) {\n    var indexSize = 1;\n    var arrLength = arr.length;\n    var valLength = val.length;\n    if (encoding !== undefined) {\n        encoding = String(encoding).toLowerCase();\n        if (encoding === \"ucs2\" || encoding === \"ucs-2\" || encoding === \"utf16le\" || encoding === \"utf-16le\") {\n            if (arr.length < 2 || val.length < 2) return -1;\n            indexSize = 2;\n            arrLength /= 2;\n            valLength /= 2;\n            byteOffset /= 2;\n        }\n    }\n    function read(buf, i) {\n        if (indexSize === 1) return buf[i];\n        else return buf.readUInt16BE(i * indexSize);\n    }\n    var i1;\n    if (dir) {\n        var foundIndex = -1;\n        for(i1 = byteOffset; i1 < arrLength; i1++)if (read(arr, i1) === read(val, foundIndex === -1 ? 0 : i1 - foundIndex)) {\n            if (foundIndex === -1) foundIndex = i1;\n            if (i1 - foundIndex + 1 === valLength) return foundIndex * indexSize;\n        } else {\n            if (foundIndex !== -1) i1 -= i1 - foundIndex;\n            foundIndex = -1;\n        }\n    } else {\n        if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;\n        for(i1 = byteOffset; i1 >= 0; i1--){\n            var found = true;\n            for(var j = 0; j < valLength; j++)if (read(arr, i1 + j) !== read(val, j)) {\n                found = false;\n                break;\n            }\n            if (found) return i1;\n        }\n    }\n    return -1;\n}\nBuffer.prototype.includes = function includes(val, byteOffset, encoding) {\n    return this.indexOf(val, byteOffset, encoding) !== -1;\n};\nBuffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {\n    return bidirectionalIndexOf(this, val, byteOffset, encoding, true);\n};\nBuffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {\n    return bidirectionalIndexOf(this, val, byteOffset, encoding, false);\n};\nfunction hexWrite(buf, string, offset, length) {\n    offset = Number(offset) || 0;\n    var remaining = buf.length - offset;\n    if (!length) length = remaining;\n    else {\n        length = Number(length);\n        if (length > remaining) length = remaining;\n    }\n    var strLen = string.length;\n    if (length > strLen / 2) length = strLen / 2;\n    for(var i = 0; i < length; ++i){\n        var parsed = parseInt(string.substr(i * 2, 2), 16);\n        if (numberIsNaN(parsed)) return i;\n        buf[offset + i] = parsed;\n    }\n    return i;\n}\nfunction utf8Write(buf, string, offset, length) {\n    return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);\n}\nfunction asciiWrite(buf, string, offset, length) {\n    return blitBuffer(asciiToBytes(string), buf, offset, length);\n}\nfunction base64Write(buf, string, offset, length) {\n    return blitBuffer(base64ToBytes(string), buf, offset, length);\n}\nfunction ucs2Write(buf, string, offset, length) {\n    return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);\n}\nBuffer.prototype.write = function write(string, offset, length, encoding) {\n    // Buffer#write(string)\n    if (offset === undefined) {\n        encoding = \"utf8\";\n        length = this.length;\n        offset = 0;\n    // Buffer#write(string, encoding)\n    } else if (length === undefined && typeof offset === \"string\") {\n        encoding = offset;\n        length = this.length;\n        offset = 0;\n    // Buffer#write(string, offset[, length][, encoding])\n    } else if (isFinite(offset)) {\n        offset = offset >>> 0;\n        if (isFinite(length)) {\n            length = length >>> 0;\n            if (encoding === undefined) encoding = \"utf8\";\n        } else {\n            encoding = length;\n            length = undefined;\n        }\n    } else throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");\n    var remaining = this.length - offset;\n    if (length === undefined || length > remaining) length = remaining;\n    if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) throw new RangeError(\"Attempt to write outside buffer bounds\");\n    if (!encoding) encoding = \"utf8\";\n    var loweredCase = false;\n    for(;;)switch(encoding){\n        case \"hex\":\n            return hexWrite(this, string, offset, length);\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8Write(this, string, offset, length);\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n            return asciiWrite(this, string, offset, length);\n        case \"base64\":\n            // Warning: maxLength not taken into account in base64Write\n            return base64Write(this, string, offset, length);\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return ucs2Write(this, string, offset, length);\n        default:\n            if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n            encoding = (\"\" + encoding).toLowerCase();\n            loweredCase = true;\n    }\n};\nBuffer.prototype.toJSON = function toJSON() {\n    return {\n        type: \"Buffer\",\n        data: Array.prototype.slice.call(this._arr || this, 0)\n    };\n};\nfunction base64Slice(buf, start, end) {\n    if (start === 0 && end === buf.length) return base64.fromByteArray(buf);\n    else return base64.fromByteArray(buf.slice(start, end));\n}\nfunction utf8Slice(buf, start, end) {\n    end = Math.min(buf.length, end);\n    var res = [];\n    var i = start;\n    while(i < end){\n        var firstByte = buf[i];\n        var codePoint = null;\n        var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;\n        if (i + bytesPerSequence <= end) {\n            var secondByte, thirdByte, fourthByte, tempCodePoint;\n            switch(bytesPerSequence){\n                case 1:\n                    if (firstByte < 0x80) codePoint = firstByte;\n                    break;\n                case 2:\n                    secondByte = buf[i + 1];\n                    if ((secondByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;\n                        if (tempCodePoint > 0x7F) codePoint = tempCodePoint;\n                    }\n                    break;\n                case 3:\n                    secondByte = buf[i + 1];\n                    thirdByte = buf[i + 2];\n                    if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;\n                        if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) codePoint = tempCodePoint;\n                    }\n                    break;\n                case 4:\n                    secondByte = buf[i + 1];\n                    thirdByte = buf[i + 2];\n                    fourthByte = buf[i + 3];\n                    if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;\n                        if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) codePoint = tempCodePoint;\n                    }\n            }\n        }\n        if (codePoint === null) {\n            // we did not generate a valid codePoint so insert a\n            // replacement char (U+FFFD) and advance only 1 byte\n            codePoint = 0xFFFD;\n            bytesPerSequence = 1;\n        } else if (codePoint > 0xFFFF) {\n            // encode to utf16 (surrogate pair dance)\n            codePoint -= 0x10000;\n            res.push(codePoint >>> 10 & 0x3FF | 0xD800);\n            codePoint = 0xDC00 | codePoint & 0x3FF;\n        }\n        res.push(codePoint);\n        i += bytesPerSequence;\n    }\n    return decodeCodePointsArray(res);\n}\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000;\nfunction decodeCodePointsArray(codePoints) {\n    var len = codePoints.length;\n    if (len <= MAX_ARGUMENTS_LENGTH) return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n    ;\n    // Decode in chunks to avoid \"call stack size exceeded\".\n    var res = \"\";\n    var i = 0;\n    while(i < len)res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));\n    return res;\n}\nfunction asciiSlice(buf, start, end) {\n    var ret = \"\";\n    end = Math.min(buf.length, end);\n    for(var i = start; i < end; ++i)ret += String.fromCharCode(buf[i] & 0x7F);\n    return ret;\n}\nfunction latin1Slice(buf, start, end) {\n    var ret = \"\";\n    end = Math.min(buf.length, end);\n    for(var i = start; i < end; ++i)ret += String.fromCharCode(buf[i]);\n    return ret;\n}\nfunction hexSlice(buf, start, end) {\n    var len = buf.length;\n    if (!start || start < 0) start = 0;\n    if (!end || end < 0 || end > len) end = len;\n    var out = \"\";\n    for(var i = start; i < end; ++i)out += hexSliceLookupTable[buf[i]];\n    return out;\n}\nfunction utf16leSlice(buf, start, end) {\n    var bytes = buf.slice(start, end);\n    var res = \"\";\n    // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n    for(var i = 0; i < bytes.length - 1; i += 2)res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);\n    return res;\n}\nBuffer.prototype.slice = function slice(start, end) {\n    var len = this.length;\n    start = ~~start;\n    end = end === undefined ? len : ~~end;\n    if (start < 0) {\n        start += len;\n        if (start < 0) start = 0;\n    } else if (start > len) start = len;\n    if (end < 0) {\n        end += len;\n        if (end < 0) end = 0;\n    } else if (end > len) end = len;\n    if (end < start) end = start;\n    var newBuf = this.subarray(start, end);\n    // Return an augmented `Uint8Array` instance\n    Object.setPrototypeOf(newBuf, Buffer.prototype);\n    return newBuf;\n};\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */ function checkOffset(offset, ext, length) {\n    if (offset % 1 !== 0 || offset < 0) throw new RangeError(\"offset is not uint\");\n    if (offset + ext > length) throw new RangeError(\"Trying to access beyond buffer length\");\n}\nBuffer.prototype.readUintLE = Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength1, noAssert) {\n    offset = offset >>> 0;\n    byteLength1 = byteLength1 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength1, this.length);\n    var val = this[offset];\n    var mul = 1;\n    var i = 0;\n    while(++i < byteLength1 && (mul *= 0x100))val += this[offset + i] * mul;\n    return val;\n};\nBuffer.prototype.readUintBE = Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength2, noAssert) {\n    offset = offset >>> 0;\n    byteLength2 = byteLength2 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength2, this.length);\n    var val = this[offset + --byteLength2];\n    var mul = 1;\n    while(byteLength2 > 0 && (mul *= 0x100))val += this[offset + --byteLength2] * mul;\n    return val;\n};\nBuffer.prototype.readUint8 = Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 1, this.length);\n    return this[offset];\n};\nBuffer.prototype.readUint16LE = Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    return this[offset] | this[offset + 1] << 8;\n};\nBuffer.prototype.readUint16BE = Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    return this[offset] << 8 | this[offset + 1];\n};\nBuffer.prototype.readUint32LE = Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;\n};\nBuffer.prototype.readUint32BE = Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);\n};\nBuffer.prototype.readIntLE = function readIntLE(offset, byteLength3, noAssert) {\n    offset = offset >>> 0;\n    byteLength3 = byteLength3 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength3, this.length);\n    var val = this[offset];\n    var mul = 1;\n    var i = 0;\n    while(++i < byteLength3 && (mul *= 0x100))val += this[offset + i] * mul;\n    mul *= 0x80;\n    if (val >= mul) val -= Math.pow(2, 8 * byteLength3);\n    return val;\n};\nBuffer.prototype.readIntBE = function readIntBE(offset, byteLength4, noAssert) {\n    offset = offset >>> 0;\n    byteLength4 = byteLength4 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength4, this.length);\n    var i = byteLength4;\n    var mul = 1;\n    var val = this[offset + --i];\n    while(i > 0 && (mul *= 0x100))val += this[offset + --i] * mul;\n    mul *= 0x80;\n    if (val >= mul) val -= Math.pow(2, 8 * byteLength4);\n    return val;\n};\nBuffer.prototype.readInt8 = function readInt8(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 1, this.length);\n    if (!(this[offset] & 0x80)) return this[offset];\n    return (0xff - this[offset] + 1) * -1;\n};\nBuffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    var val = this[offset] | this[offset + 1] << 8;\n    return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\nBuffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    var val = this[offset + 1] | this[offset] << 8;\n    return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\nBuffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;\n};\nBuffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];\n};\nBuffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return ieee754.read(this, offset, true, 23, 4);\n};\nBuffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return ieee754.read(this, offset, false, 23, 4);\n};\nBuffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 8, this.length);\n    return ieee754.read(this, offset, true, 52, 8);\n};\nBuffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 8, this.length);\n    return ieee754.read(this, offset, false, 52, 8);\n};\nfunction checkInt(buf, value, offset, ext, max, min) {\n    if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n    if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds');\n    if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n}\nBuffer.prototype.writeUintLE = Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength5, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    byteLength5 = byteLength5 >>> 0;\n    if (!noAssert) {\n        var maxBytes = Math.pow(2, 8 * byteLength5) - 1;\n        checkInt(this, value, offset, byteLength5, maxBytes, 0);\n    }\n    var mul = 1;\n    var i = 0;\n    this[offset] = value & 0xFF;\n    while(++i < byteLength5 && (mul *= 0x100))this[offset + i] = value / mul & 0xFF;\n    return offset + byteLength5;\n};\nBuffer.prototype.writeUintBE = Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength6, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    byteLength6 = byteLength6 >>> 0;\n    if (!noAssert) {\n        var maxBytes = Math.pow(2, 8 * byteLength6) - 1;\n        checkInt(this, value, offset, byteLength6, maxBytes, 0);\n    }\n    var i = byteLength6 - 1;\n    var mul = 1;\n    this[offset + i] = value & 0xFF;\n    while(--i >= 0 && (mul *= 0x100))this[offset + i] = value / mul & 0xFF;\n    return offset + byteLength6;\n};\nBuffer.prototype.writeUint8 = Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);\n    this[offset] = value & 0xff;\n    return offset + 1;\n};\nBuffer.prototype.writeUint16LE = Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    return offset + 2;\n};\nBuffer.prototype.writeUint16BE = Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n    this[offset] = value >>> 8;\n    this[offset + 1] = value & 0xff;\n    return offset + 2;\n};\nBuffer.prototype.writeUint32LE = Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n    this[offset + 3] = value >>> 24;\n    this[offset + 2] = value >>> 16;\n    this[offset + 1] = value >>> 8;\n    this[offset] = value & 0xff;\n    return offset + 4;\n};\nBuffer.prototype.writeUint32BE = Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n    this[offset] = value >>> 24;\n    this[offset + 1] = value >>> 16;\n    this[offset + 2] = value >>> 8;\n    this[offset + 3] = value & 0xff;\n    return offset + 4;\n};\nBuffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength7, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) {\n        var limit = Math.pow(2, 8 * byteLength7 - 1);\n        checkInt(this, value, offset, byteLength7, limit - 1, -limit);\n    }\n    var i = 0;\n    var mul = 1;\n    var sub = 0;\n    this[offset] = value & 0xFF;\n    while(++i < byteLength7 && (mul *= 0x100)){\n        if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) sub = 1;\n        this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n    }\n    return offset + byteLength7;\n};\nBuffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength8, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) {\n        var limit = Math.pow(2, 8 * byteLength8 - 1);\n        checkInt(this, value, offset, byteLength8, limit - 1, -limit);\n    }\n    var i = byteLength8 - 1;\n    var mul = 1;\n    var sub = 0;\n    this[offset + i] = value & 0xFF;\n    while(--i >= 0 && (mul *= 0x100)){\n        if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) sub = 1;\n        this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n    }\n    return offset + byteLength8;\n};\nBuffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -128);\n    if (value < 0) value = 0xff + value + 1;\n    this[offset] = value & 0xff;\n    return offset + 1;\n};\nBuffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    return offset + 2;\n};\nBuffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);\n    this[offset] = value >>> 8;\n    this[offset + 1] = value & 0xff;\n    return offset + 2;\n};\nBuffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    this[offset + 2] = value >>> 16;\n    this[offset + 3] = value >>> 24;\n    return offset + 4;\n};\nBuffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);\n    if (value < 0) value = 0xffffffff + value + 1;\n    this[offset] = value >>> 24;\n    this[offset + 1] = value >>> 16;\n    this[offset + 2] = value >>> 8;\n    this[offset + 3] = value & 0xff;\n    return offset + 4;\n};\nfunction checkIEEE754(buf, value, offset, ext, max, min) {\n    if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n    if (offset < 0) throw new RangeError(\"Index out of range\");\n}\nfunction writeFloat(buf, value, offset, littleEndian, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -340282346638528860000000000000000000000);\n    ieee754.write(buf, value, offset, littleEndian, 23, 4);\n    return offset + 4;\n}\nBuffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {\n    return writeFloat(this, value, offset, true, noAssert);\n};\nBuffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {\n    return writeFloat(this, value, offset, false, noAssert);\n};\nfunction writeDouble(buf, value, offset, littleEndian, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);\n    ieee754.write(buf, value, offset, littleEndian, 52, 8);\n    return offset + 8;\n}\nBuffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {\n    return writeDouble(this, value, offset, true, noAssert);\n};\nBuffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {\n    return writeDouble(this, value, offset, false, noAssert);\n};\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy(target, targetStart, start, end) {\n    if (!Buffer.isBuffer(target)) throw new TypeError(\"argument should be a Buffer\");\n    if (!start) start = 0;\n    if (!end && end !== 0) end = this.length;\n    if (targetStart >= target.length) targetStart = target.length;\n    if (!targetStart) targetStart = 0;\n    if (end > 0 && end < start) end = start;\n    // Copy 0 bytes; we're done\n    if (end === start) return 0;\n    if (target.length === 0 || this.length === 0) return 0;\n    // Fatal error conditions\n    if (targetStart < 0) throw new RangeError(\"targetStart out of bounds\");\n    if (start < 0 || start >= this.length) throw new RangeError(\"Index out of range\");\n    if (end < 0) throw new RangeError(\"sourceEnd out of bounds\");\n    // Are we oob?\n    if (end > this.length) end = this.length;\n    if (target.length - targetStart < end - start) end = target.length - targetStart + start;\n    var len = end - start;\n    if (this === target && typeof Uint8Array.prototype.copyWithin === \"function\") // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end);\n    else Uint8Array.prototype.set.call(target, this.subarray(start, end), targetStart);\n    return len;\n};\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill(val, start, end, encoding) {\n    // Handle string cases:\n    if (typeof val === \"string\") {\n        if (typeof start === \"string\") {\n            encoding = start;\n            start = 0;\n            end = this.length;\n        } else if (typeof end === \"string\") {\n            encoding = end;\n            end = this.length;\n        }\n        if (encoding !== undefined && typeof encoding !== \"string\") throw new TypeError(\"encoding must be a string\");\n        if (typeof encoding === \"string\" && !Buffer.isEncoding(encoding)) throw new TypeError(\"Unknown encoding: \" + encoding);\n        if (val.length === 1) {\n            var code = val.charCodeAt(0);\n            if (encoding === \"utf8\" && code < 128 || encoding === \"latin1\") // Fast path: If `val` fits into a single byte, use that numeric value.\n            val = code;\n        }\n    } else if (typeof val === \"number\") val = val & 255;\n    else if (typeof val === \"boolean\") val = Number(val);\n    // Invalid ranges are not set to a default, so can range check early.\n    if (start < 0 || this.length < start || this.length < end) throw new RangeError(\"Out of range index\");\n    if (end <= start) return this;\n    start = start >>> 0;\n    end = end === undefined ? this.length : end >>> 0;\n    if (!val) val = 0;\n    var i;\n    if (typeof val === \"number\") for(i = start; i < end; ++i)this[i] = val;\n    else {\n        var bytes = Buffer.isBuffer(val) ? val : Buffer.from(val, encoding);\n        var len = bytes.length;\n        if (len === 0) throw new TypeError('The value \"' + val + '\" is invalid for argument \"value\"');\n        for(i = 0; i < end - start; ++i)this[i + start] = bytes[i % len];\n    }\n    return this;\n};\n// HELPER FUNCTIONS\n// ================\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g;\nfunction base64clean(str) {\n    // Node takes equal signs as end of the Base64 encoding\n    str = str.split(\"=\")[0];\n    // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n    str = str.trim().replace(INVALID_BASE64_RE, \"\");\n    // Node converts strings with length < 2 to ''\n    if (str.length < 2) return \"\";\n    // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n    while(str.length % 4 !== 0)str = str + \"=\";\n    return str;\n}\nfunction utf8ToBytes(string, units) {\n    units = units || Infinity;\n    var codePoint;\n    var length = string.length;\n    var leadSurrogate = null;\n    var bytes = [];\n    for(var i = 0; i < length; ++i){\n        codePoint = string.charCodeAt(i);\n        // is surrogate component\n        if (codePoint > 0xD7FF && codePoint < 0xE000) {\n            // last char was a lead\n            if (!leadSurrogate) {\n                // no lead yet\n                if (codePoint > 0xDBFF) {\n                    // unexpected trail\n                    if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                    continue;\n                } else if (i + 1 === length) {\n                    // unpaired lead\n                    if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                    continue;\n                }\n                // valid lead\n                leadSurrogate = codePoint;\n                continue;\n            }\n            // 2 leads in a row\n            if (codePoint < 0xDC00) {\n                if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                leadSurrogate = codePoint;\n                continue;\n            }\n            // valid surrogate pair\n            codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;\n        } else if (leadSurrogate) // valid bmp char, but last char was a lead\n        {\n            if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n        }\n        leadSurrogate = null;\n        // encode utf8\n        if (codePoint < 0x80) {\n            if ((units -= 1) < 0) break;\n            bytes.push(codePoint);\n        } else if (codePoint < 0x800) {\n            if ((units -= 2) < 0) break;\n            bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);\n        } else if (codePoint < 0x10000) {\n            if ((units -= 3) < 0) break;\n            bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n        } else if (codePoint < 0x110000) {\n            if ((units -= 4) < 0) break;\n            bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n        } else throw new Error(\"Invalid code point\");\n    }\n    return bytes;\n}\nfunction asciiToBytes(str) {\n    var byteArray = [];\n    for(var i = 0; i < str.length; ++i)// Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF);\n    return byteArray;\n}\nfunction utf16leToBytes(str, units) {\n    var c, hi, lo;\n    var byteArray = [];\n    for(var i = 0; i < str.length; ++i){\n        if ((units -= 2) < 0) break;\n        c = str.charCodeAt(i);\n        hi = c >> 8;\n        lo = c % 256;\n        byteArray.push(lo);\n        byteArray.push(hi);\n    }\n    return byteArray;\n}\nfunction base64ToBytes(str) {\n    return base64.toByteArray(base64clean(str));\n}\nfunction blitBuffer(src, dst, offset, length) {\n    for(var i = 0; i < length; ++i){\n        if (i + offset >= dst.length || i >= src.length) break;\n        dst[i + offset] = src[i];\n    }\n    return i;\n}\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance(obj, type) {\n    return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name;\n}\nfunction numberIsNaN(obj) {\n    // For IE11 support\n    return obj !== obj // eslint-disable-line no-self-compare\n    ;\n}\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nvar hexSliceLookupTable = function() {\n    var alphabet = \"0123456789abcdef\";\n    var table = new Array(256);\n    for(var i = 0; i < 16; ++i){\n        var i16 = i * 16;\n        for(var j = 0; j < 16; ++j)table[i16 + j] = alphabet[i] + alphabet[j];\n    }\n    return table;\n}();\n\n},{\"base64-js\":\"1lZue\",\"ieee754\":\"2wWVg\"}],\"1lZue\":[function(require,module,exports) {\n\"use strict\";\nexports.byteLength = byteLength;\nexports.toByteArray = toByteArray;\nexports.fromByteArray = fromByteArray;\nvar lookup = [];\nvar revLookup = [];\nvar Arr = typeof Uint8Array !== \"undefined\" ? Uint8Array : Array;\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfor(var i = 0, len = code.length; i < len; ++i){\n    lookup[i] = code[i];\n    revLookup[code.charCodeAt(i)] = i;\n}\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup[\"-\".charCodeAt(0)] = 62;\nrevLookup[\"_\".charCodeAt(0)] = 63;\nfunction getLens(b64) {\n    var len1 = b64.length;\n    if (len1 % 4 > 0) throw new Error(\"Invalid string. Length must be a multiple of 4\");\n    // Trim off extra bytes after placeholder bytes are found\n    // See: https://github.com/beatgammit/base64-js/issues/42\n    var validLen = b64.indexOf(\"=\");\n    if (validLen === -1) validLen = len1;\n    var placeHoldersLen = validLen === len1 ? 0 : 4 - validLen % 4;\n    return [\n        validLen,\n        placeHoldersLen\n    ];\n}\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength(b64) {\n    var lens = getLens(b64);\n    var validLen = lens[0];\n    var placeHoldersLen = lens[1];\n    return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction _byteLength(b64, validLen, placeHoldersLen) {\n    return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction toByteArray(b64) {\n    var tmp;\n    var lens = getLens(b64);\n    var validLen = lens[0];\n    var placeHoldersLen = lens[1];\n    var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n    var curByte = 0;\n    // if there are placeholders, only get up to the last complete 4 chars\n    var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen;\n    var i1;\n    for(i1 = 0; i1 < len2; i1 += 4){\n        tmp = revLookup[b64.charCodeAt(i1)] << 18 | revLookup[b64.charCodeAt(i1 + 1)] << 12 | revLookup[b64.charCodeAt(i1 + 2)] << 6 | revLookup[b64.charCodeAt(i1 + 3)];\n        arr[curByte++] = tmp >> 16 & 0xFF;\n        arr[curByte++] = tmp >> 8 & 0xFF;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    if (placeHoldersLen === 2) {\n        tmp = revLookup[b64.charCodeAt(i1)] << 2 | revLookup[b64.charCodeAt(i1 + 1)] >> 4;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    if (placeHoldersLen === 1) {\n        tmp = revLookup[b64.charCodeAt(i1)] << 10 | revLookup[b64.charCodeAt(i1 + 1)] << 4 | revLookup[b64.charCodeAt(i1 + 2)] >> 2;\n        arr[curByte++] = tmp >> 8 & 0xFF;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    return arr;\n}\nfunction tripletToBase64(num) {\n    return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];\n}\nfunction encodeChunk(uint8, start, end) {\n    var tmp;\n    var output = [];\n    for(var i2 = start; i2 < end; i2 += 3){\n        tmp = (uint8[i2] << 16 & 0xFF0000) + (uint8[i2 + 1] << 8 & 0xFF00) + (uint8[i2 + 2] & 0xFF);\n        output.push(tripletToBase64(tmp));\n    }\n    return output.join(\"\");\n}\nfunction fromByteArray(uint8) {\n    var tmp;\n    var len3 = uint8.length;\n    var extraBytes = len3 % 3 // if we have 1 byte left, pad 2 bytes\n    ;\n    var parts = [];\n    var maxChunkLength = 16383 // must be multiple of 3\n    ;\n    // go through the array every three bytes, we'll deal with trailing stuff later\n    for(var i3 = 0, len2 = len3 - extraBytes; i3 < len2; i3 += maxChunkLength)parts.push(encodeChunk(uint8, i3, i3 + maxChunkLength > len2 ? len2 : i3 + maxChunkLength));\n    // pad the end with zeros, but make sure to not forget the extra bytes\n    if (extraBytes === 1) {\n        tmp = uint8[len3 - 1];\n        parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + \"==\");\n    } else if (extraBytes === 2) {\n        tmp = (uint8[len3 - 2] << 8) + uint8[len3 - 1];\n        parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + \"=\");\n    }\n    return parts.join(\"\");\n}\n\n},{}],\"2wWVg\":[function(require,module,exports) {\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */ exports.read = function(buffer, offset, isLE, mLen, nBytes) {\n    var e, m;\n    var eLen = nBytes * 8 - mLen - 1;\n    var eMax = (1 << eLen) - 1;\n    var eBias = eMax >> 1;\n    var nBits = -7;\n    var i = isLE ? nBytes - 1 : 0;\n    var d = isLE ? -1 : 1;\n    var s = buffer[offset + i];\n    i += d;\n    e = s & (1 << -nBits) - 1;\n    s >>= -nBits;\n    nBits += eLen;\n    for(; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);\n    m = e & (1 << -nBits) - 1;\n    e >>= -nBits;\n    nBits += mLen;\n    for(; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);\n    if (e === 0) e = 1 - eBias;\n    else if (e === eMax) return m ? NaN : (s ? -1 : 1) * Infinity;\n    else {\n        m = m + Math.pow(2, mLen);\n        e = e - eBias;\n    }\n    return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\nexports.write = function(buffer, value, offset, isLE, mLen, nBytes) {\n    var e, m, c;\n    var eLen = nBytes * 8 - mLen - 1;\n    var eMax = (1 << eLen) - 1;\n    var eBias = eMax >> 1;\n    var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n    var i = isLE ? 0 : nBytes - 1;\n    var d = isLE ? 1 : -1;\n    var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n    value = Math.abs(value);\n    if (isNaN(value) || value === Infinity) {\n        m = isNaN(value) ? 1 : 0;\n        e = eMax;\n    } else {\n        e = Math.floor(Math.log(value) / Math.LN2);\n        if (value * (c = Math.pow(2, -e)) < 1) {\n            e--;\n            c *= 2;\n        }\n        if (e + eBias >= 1) value += rt / c;\n        else value += rt * Math.pow(2, 1 - eBias);\n        if (value * c >= 2) {\n            e++;\n            c /= 2;\n        }\n        if (e + eBias >= eMax) {\n            m = 0;\n            e = eMax;\n        } else if (e + eBias >= 1) {\n            m = (value * c - 1) * Math.pow(2, mLen);\n            e = e + eBias;\n        } else {\n            m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n            e = 0;\n        }\n    }\n    for(; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);\n    e = e << mLen | m;\n    eLen += mLen;\n    for(; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);\n    buffer[offset + i - d] |= s * 128;\n};\n\n},{}],\"2axoo\":[function(require,module,exports) {\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */ /* eslint-disable no-proto */ \"use strict\";\nvar base64 = require(\"base64-js\");\nvar ieee754 = require(\"ieee754\");\nvar customInspectSymbol = typeof Symbol === \"function\" && typeof Symbol[\"for\"] === \"function\" // eslint-disable-line dot-notation\n ? Symbol[\"for\"](\"nodejs.util.inspect.custom\") // eslint-disable-line dot-notation\n : null;\nexports.Buffer = Buffer;\nexports.SlowBuffer = SlowBuffer;\nexports.INSPECT_MAX_BYTES = 50;\nvar K_MAX_LENGTH = 0x7fffffff;\nexports.kMaxLength = K_MAX_LENGTH;\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */ Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport();\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== \"undefined\" && typeof console.error === \"function\") console.error(\"This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.\");\nfunction typedArraySupport() {\n    // Can typed array instances can be augmented?\n    try {\n        var arr = new Uint8Array(1);\n        var proto = {\n            foo: function() {\n                return 42;\n            }\n        };\n        Object.setPrototypeOf(proto, Uint8Array.prototype);\n        Object.setPrototypeOf(arr, proto);\n        return arr.foo() === 42;\n    } catch (e) {\n        return false;\n    }\n}\nObject.defineProperty(Buffer.prototype, \"parent\", {\n    enumerable: true,\n    get: function() {\n        if (!Buffer.isBuffer(this)) return undefined;\n        return this.buffer;\n    }\n});\nObject.defineProperty(Buffer.prototype, \"offset\", {\n    enumerable: true,\n    get: function() {\n        if (!Buffer.isBuffer(this)) return undefined;\n        return this.byteOffset;\n    }\n});\nfunction createBuffer(length) {\n    if (length > K_MAX_LENGTH) throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"');\n    // Return an augmented `Uint8Array` instance\n    var buf = new Uint8Array(length);\n    Object.setPrototypeOf(buf, Buffer.prototype);\n    return buf;\n}\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */ function Buffer(arg, encodingOrOffset, length) {\n    // Common case.\n    if (typeof arg === \"number\") {\n        if (typeof encodingOrOffset === \"string\") throw new TypeError('The \"string\" argument must be of type string. Received type number');\n        return allocUnsafe(arg);\n    }\n    return from(arg, encodingOrOffset, length);\n}\nBuffer.poolSize = 8192 // not used by this implementation\n;\nfunction from(value, encodingOrOffset, length) {\n    if (typeof value === \"string\") return fromString(value, encodingOrOffset);\n    if (ArrayBuffer.isView(value)) return fromArrayView(value);\n    if (value == null) throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value);\n    if (isInstance(value, ArrayBuffer) || value && isInstance(value.buffer, ArrayBuffer)) return fromArrayBuffer(value, encodingOrOffset, length);\n    if (typeof SharedArrayBuffer !== \"undefined\" && (isInstance(value, SharedArrayBuffer) || value && isInstance(value.buffer, SharedArrayBuffer))) return fromArrayBuffer(value, encodingOrOffset, length);\n    if (typeof value === \"number\") throw new TypeError('The \"value\" argument must not be of type number. Received type number');\n    var valueOf = value.valueOf && value.valueOf();\n    if (valueOf != null && valueOf !== value) return Buffer.from(valueOf, encodingOrOffset, length);\n    var b = fromObject(value);\n    if (b) return b;\n    if (typeof Symbol !== \"undefined\" && Symbol.toPrimitive != null && typeof value[Symbol.toPrimitive] === \"function\") return Buffer.from(value[Symbol.toPrimitive](\"string\"), encodingOrOffset, length);\n    throw new TypeError(\"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof value);\n}\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/ Buffer.from = function(value, encodingOrOffset, length) {\n    return from(value, encodingOrOffset, length);\n};\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype);\nObject.setPrototypeOf(Buffer, Uint8Array);\nfunction assertSize(size) {\n    if (typeof size !== \"number\") throw new TypeError('\"size\" argument must be of type number');\n    else if (size < 0) throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"');\n}\nfunction alloc(size, fill, encoding) {\n    assertSize(size);\n    if (size <= 0) return createBuffer(size);\n    if (fill !== undefined) // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpreted as a start offset.\n    return typeof encoding === \"string\" ? createBuffer(size).fill(fill, encoding) : createBuffer(size).fill(fill);\n    return createBuffer(size);\n}\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/ Buffer.alloc = function(size, fill, encoding) {\n    return alloc(size, fill, encoding);\n};\nfunction allocUnsafe(size) {\n    assertSize(size);\n    return createBuffer(size < 0 ? 0 : checked(size) | 0);\n}\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */ Buffer.allocUnsafe = function(size) {\n    return allocUnsafe(size);\n};\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */ Buffer.allocUnsafeSlow = function(size) {\n    return allocUnsafe(size);\n};\nfunction fromString(string, encoding) {\n    if (typeof encoding !== \"string\" || encoding === \"\") encoding = \"utf8\";\n    if (!Buffer.isEncoding(encoding)) throw new TypeError(\"Unknown encoding: \" + encoding);\n    var length = byteLength(string, encoding) | 0;\n    var buf = createBuffer(length);\n    var actual = buf.write(string, encoding);\n    if (actual !== length) // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual);\n    return buf;\n}\nfunction fromArrayLike(array) {\n    var length = array.length < 0 ? 0 : checked(array.length) | 0;\n    var buf = createBuffer(length);\n    for(var i = 0; i < length; i += 1)buf[i] = array[i] & 255;\n    return buf;\n}\nfunction fromArrayView(arrayView) {\n    if (isInstance(arrayView, Uint8Array)) {\n        var copy = new Uint8Array(arrayView);\n        return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength);\n    }\n    return fromArrayLike(arrayView);\n}\nfunction fromArrayBuffer(array, byteOffset, length) {\n    if (byteOffset < 0 || array.byteLength < byteOffset) throw new RangeError('\"offset\" is outside of buffer bounds');\n    if (array.byteLength < byteOffset + (length || 0)) throw new RangeError('\"length\" is outside of buffer bounds');\n    var buf;\n    if (byteOffset === undefined && length === undefined) buf = new Uint8Array(array);\n    else if (length === undefined) buf = new Uint8Array(array, byteOffset);\n    else buf = new Uint8Array(array, byteOffset, length);\n    // Return an augmented `Uint8Array` instance\n    Object.setPrototypeOf(buf, Buffer.prototype);\n    return buf;\n}\nfunction fromObject(obj) {\n    if (Buffer.isBuffer(obj)) {\n        var len = checked(obj.length) | 0;\n        var buf = createBuffer(len);\n        if (buf.length === 0) return buf;\n        obj.copy(buf, 0, 0, len);\n        return buf;\n    }\n    if (obj.length !== undefined) {\n        if (typeof obj.length !== \"number\" || numberIsNaN(obj.length)) return createBuffer(0);\n        return fromArrayLike(obj);\n    }\n    if (obj.type === \"Buffer\" && Array.isArray(obj.data)) return fromArrayLike(obj.data);\n}\nfunction checked(length) {\n    // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n    // length is NaN (which is otherwise coerced to zero.)\n    if (length >= K_MAX_LENGTH) throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\" + K_MAX_LENGTH.toString(16) + \" bytes\");\n    return length | 0;\n}\nfunction SlowBuffer(length) {\n    if (+length != length) length = 0;\n    return Buffer.alloc(+length);\n}\nBuffer.isBuffer = function isBuffer(b) {\n    return b != null && b._isBuffer === true && b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n    ;\n};\nBuffer.compare = function compare(a, b) {\n    if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength);\n    if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength);\n    if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) throw new TypeError('The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array');\n    if (a === b) return 0;\n    var x = a.length;\n    var y = b.length;\n    for(var i = 0, len = Math.min(x, y); i < len; ++i)if (a[i] !== b[i]) {\n        x = a[i];\n        y = b[i];\n        break;\n    }\n    if (x < y) return -1;\n    if (y < x) return 1;\n    return 0;\n};\nBuffer.isEncoding = function isEncoding(encoding) {\n    switch(String(encoding).toLowerCase()){\n        case \"hex\":\n        case \"utf8\":\n        case \"utf-8\":\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n        case \"base64\":\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return true;\n        default:\n            return false;\n    }\n};\nBuffer.concat = function concat(list, length) {\n    if (!Array.isArray(list)) throw new TypeError('\"list\" argument must be an Array of Buffers');\n    if (list.length === 0) return Buffer.alloc(0);\n    var i;\n    if (length === undefined) {\n        length = 0;\n        for(i = 0; i < list.length; ++i)length += list[i].length;\n    }\n    var buffer = Buffer.allocUnsafe(length);\n    var pos = 0;\n    for(i = 0; i < list.length; ++i){\n        var buf = list[i];\n        if (isInstance(buf, Uint8Array)) {\n            if (pos + buf.length > buffer.length) Buffer.from(buf).copy(buffer, pos);\n            else Uint8Array.prototype.set.call(buffer, buf, pos);\n        } else if (!Buffer.isBuffer(buf)) throw new TypeError('\"list\" argument must be an Array of Buffers');\n        else buf.copy(buffer, pos);\n        pos += buf.length;\n    }\n    return buffer;\n};\nfunction byteLength(string, encoding) {\n    if (Buffer.isBuffer(string)) return string.length;\n    if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) return string.byteLength;\n    if (typeof string !== \"string\") throw new TypeError('The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof string);\n    var len = string.length;\n    var mustMatch = arguments.length > 2 && arguments[2] === true;\n    if (!mustMatch && len === 0) return 0;\n    // Use a for loop to avoid recursion\n    var loweredCase = false;\n    for(;;)switch(encoding){\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n            return len;\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8ToBytes(string).length;\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return len * 2;\n        case \"hex\":\n            return len >>> 1;\n        case \"base64\":\n            return base64ToBytes(string).length;\n        default:\n            if (loweredCase) return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n            ;\n            encoding = (\"\" + encoding).toLowerCase();\n            loweredCase = true;\n    }\n}\nBuffer.byteLength = byteLength;\nfunction slowToString(encoding, start, end) {\n    var loweredCase = false;\n    // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n    // property of a typed array.\n    // This behaves neither like String nor Uint8Array in that we set start/end\n    // to their upper/lower bounds if the value passed is out of range.\n    // undefined is handled specially as per ECMA-262 6th Edition,\n    // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n    if (start === undefined || start < 0) start = 0;\n    // Return early if start > this.length. Done here to prevent potential uint32\n    // coercion fail below.\n    if (start > this.length) return \"\";\n    if (end === undefined || end > this.length) end = this.length;\n    if (end <= 0) return \"\";\n    // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n    end >>>= 0;\n    start >>>= 0;\n    if (end <= start) return \"\";\n    if (!encoding) encoding = \"utf8\";\n    while(true)switch(encoding){\n        case \"hex\":\n            return hexSlice(this, start, end);\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8Slice(this, start, end);\n        case \"ascii\":\n            return asciiSlice(this, start, end);\n        case \"latin1\":\n        case \"binary\":\n            return latin1Slice(this, start, end);\n        case \"base64\":\n            return base64Slice(this, start, end);\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return utf16leSlice(this, start, end);\n        default:\n            if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n            encoding = (encoding + \"\").toLowerCase();\n            loweredCase = true;\n    }\n}\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true;\nfunction swap(b, n, m) {\n    var i = b[n];\n    b[n] = b[m];\n    b[m] = i;\n}\nBuffer.prototype.swap16 = function swap16() {\n    var len = this.length;\n    if (len % 2 !== 0) throw new RangeError(\"Buffer size must be a multiple of 16-bits\");\n    for(var i = 0; i < len; i += 2)swap(this, i, i + 1);\n    return this;\n};\nBuffer.prototype.swap32 = function swap32() {\n    var len = this.length;\n    if (len % 4 !== 0) throw new RangeError(\"Buffer size must be a multiple of 32-bits\");\n    for(var i = 0; i < len; i += 4){\n        swap(this, i, i + 3);\n        swap(this, i + 1, i + 2);\n    }\n    return this;\n};\nBuffer.prototype.swap64 = function swap64() {\n    var len = this.length;\n    if (len % 8 !== 0) throw new RangeError(\"Buffer size must be a multiple of 64-bits\");\n    for(var i = 0; i < len; i += 8){\n        swap(this, i, i + 7);\n        swap(this, i + 1, i + 6);\n        swap(this, i + 2, i + 5);\n        swap(this, i + 3, i + 4);\n    }\n    return this;\n};\nBuffer.prototype.toString = function toString() {\n    var length = this.length;\n    if (length === 0) return \"\";\n    if (arguments.length === 0) return utf8Slice(this, 0, length);\n    return slowToString.apply(this, arguments);\n};\nBuffer.prototype.toLocaleString = Buffer.prototype.toString;\nBuffer.prototype.equals = function equals(b) {\n    if (!Buffer.isBuffer(b)) throw new TypeError(\"Argument must be a Buffer\");\n    if (this === b) return true;\n    return Buffer.compare(this, b) === 0;\n};\nBuffer.prototype.inspect = function inspect() {\n    var str = \"\";\n    var max = exports.INSPECT_MAX_BYTES;\n    str = this.toString(\"hex\", 0, max).replace(/(.{2})/g, \"$1 \").trim();\n    if (this.length > max) str += \" ... \";\n    return \"<Buffer \" + str + \">\";\n};\nif (customInspectSymbol) Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect;\nBuffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {\n    if (isInstance(target, Uint8Array)) target = Buffer.from(target, target.offset, target.byteLength);\n    if (!Buffer.isBuffer(target)) throw new TypeError('The \"target\" argument must be one of type Buffer or Uint8Array. Received type ' + typeof target);\n    if (start === undefined) start = 0;\n    if (end === undefined) end = target ? target.length : 0;\n    if (thisStart === undefined) thisStart = 0;\n    if (thisEnd === undefined) thisEnd = this.length;\n    if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) throw new RangeError(\"out of range index\");\n    if (thisStart >= thisEnd && start >= end) return 0;\n    if (thisStart >= thisEnd) return -1;\n    if (start >= end) return 1;\n    start >>>= 0;\n    end >>>= 0;\n    thisStart >>>= 0;\n    thisEnd >>>= 0;\n    if (this === target) return 0;\n    var x = thisEnd - thisStart;\n    var y = end - start;\n    var len = Math.min(x, y);\n    var thisCopy = this.slice(thisStart, thisEnd);\n    var targetCopy = target.slice(start, end);\n    for(var i = 0; i < len; ++i)if (thisCopy[i] !== targetCopy[i]) {\n        x = thisCopy[i];\n        y = targetCopy[i];\n        break;\n    }\n    if (x < y) return -1;\n    if (y < x) return 1;\n    return 0;\n};\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {\n    // Empty buffer means no match\n    if (buffer.length === 0) return -1;\n    // Normalize byteOffset\n    if (typeof byteOffset === \"string\") {\n        encoding = byteOffset;\n        byteOffset = 0;\n    } else if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff;\n    else if (byteOffset < -2147483648) byteOffset = -2147483648;\n    byteOffset = +byteOffset // Coerce to Number.\n    ;\n    if (numberIsNaN(byteOffset)) // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : buffer.length - 1;\n    // Normalize byteOffset: negative offsets start from the end of the buffer\n    if (byteOffset < 0) byteOffset = buffer.length + byteOffset;\n    if (byteOffset >= buffer.length) {\n        if (dir) return -1;\n        else byteOffset = buffer.length - 1;\n    } else if (byteOffset < 0) {\n        if (dir) byteOffset = 0;\n        else return -1;\n    }\n    // Normalize val\n    if (typeof val === \"string\") val = Buffer.from(val, encoding);\n    // Finally, search either indexOf (if dir is true) or lastIndexOf\n    if (Buffer.isBuffer(val)) {\n        // Special case: looking for empty string/buffer always fails\n        if (val.length === 0) return -1;\n        return arrayIndexOf(buffer, val, byteOffset, encoding, dir);\n    } else if (typeof val === \"number\") {\n        val = val & 0xFF // Search for a byte value [0-255]\n        ;\n        if (typeof Uint8Array.prototype.indexOf === \"function\") {\n            if (dir) return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);\n            else return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);\n        }\n        return arrayIndexOf(buffer, [\n            val\n        ], byteOffset, encoding, dir);\n    }\n    throw new TypeError(\"val must be string, number or Buffer\");\n}\nfunction arrayIndexOf(arr, val, byteOffset, encoding, dir) {\n    var indexSize = 1;\n    var arrLength = arr.length;\n    var valLength = val.length;\n    if (encoding !== undefined) {\n        encoding = String(encoding).toLowerCase();\n        if (encoding === \"ucs2\" || encoding === \"ucs-2\" || encoding === \"utf16le\" || encoding === \"utf-16le\") {\n            if (arr.length < 2 || val.length < 2) return -1;\n            indexSize = 2;\n            arrLength /= 2;\n            valLength /= 2;\n            byteOffset /= 2;\n        }\n    }\n    function read(buf, i) {\n        if (indexSize === 1) return buf[i];\n        else return buf.readUInt16BE(i * indexSize);\n    }\n    var i1;\n    if (dir) {\n        var foundIndex = -1;\n        for(i1 = byteOffset; i1 < arrLength; i1++)if (read(arr, i1) === read(val, foundIndex === -1 ? 0 : i1 - foundIndex)) {\n            if (foundIndex === -1) foundIndex = i1;\n            if (i1 - foundIndex + 1 === valLength) return foundIndex * indexSize;\n        } else {\n            if (foundIndex !== -1) i1 -= i1 - foundIndex;\n            foundIndex = -1;\n        }\n    } else {\n        if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;\n        for(i1 = byteOffset; i1 >= 0; i1--){\n            var found = true;\n            for(var j = 0; j < valLength; j++)if (read(arr, i1 + j) !== read(val, j)) {\n                found = false;\n                break;\n            }\n            if (found) return i1;\n        }\n    }\n    return -1;\n}\nBuffer.prototype.includes = function includes(val, byteOffset, encoding) {\n    return this.indexOf(val, byteOffset, encoding) !== -1;\n};\nBuffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {\n    return bidirectionalIndexOf(this, val, byteOffset, encoding, true);\n};\nBuffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {\n    return bidirectionalIndexOf(this, val, byteOffset, encoding, false);\n};\nfunction hexWrite(buf, string, offset, length) {\n    offset = Number(offset) || 0;\n    var remaining = buf.length - offset;\n    if (!length) length = remaining;\n    else {\n        length = Number(length);\n        if (length > remaining) length = remaining;\n    }\n    var strLen = string.length;\n    if (length > strLen / 2) length = strLen / 2;\n    for(var i = 0; i < length; ++i){\n        var parsed = parseInt(string.substr(i * 2, 2), 16);\n        if (numberIsNaN(parsed)) return i;\n        buf[offset + i] = parsed;\n    }\n    return i;\n}\nfunction utf8Write(buf, string, offset, length) {\n    return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);\n}\nfunction asciiWrite(buf, string, offset, length) {\n    return blitBuffer(asciiToBytes(string), buf, offset, length);\n}\nfunction base64Write(buf, string, offset, length) {\n    return blitBuffer(base64ToBytes(string), buf, offset, length);\n}\nfunction ucs2Write(buf, string, offset, length) {\n    return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);\n}\nBuffer.prototype.write = function write(string, offset, length, encoding) {\n    // Buffer#write(string)\n    if (offset === undefined) {\n        encoding = \"utf8\";\n        length = this.length;\n        offset = 0;\n    // Buffer#write(string, encoding)\n    } else if (length === undefined && typeof offset === \"string\") {\n        encoding = offset;\n        length = this.length;\n        offset = 0;\n    // Buffer#write(string, offset[, length][, encoding])\n    } else if (isFinite(offset)) {\n        offset = offset >>> 0;\n        if (isFinite(length)) {\n            length = length >>> 0;\n            if (encoding === undefined) encoding = \"utf8\";\n        } else {\n            encoding = length;\n            length = undefined;\n        }\n    } else throw new Error(\"Buffer.write(string, encoding, offset[, length]) is no longer supported\");\n    var remaining = this.length - offset;\n    if (length === undefined || length > remaining) length = remaining;\n    if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) throw new RangeError(\"Attempt to write outside buffer bounds\");\n    if (!encoding) encoding = \"utf8\";\n    var loweredCase = false;\n    for(;;)switch(encoding){\n        case \"hex\":\n            return hexWrite(this, string, offset, length);\n        case \"utf8\":\n        case \"utf-8\":\n            return utf8Write(this, string, offset, length);\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n            return asciiWrite(this, string, offset, length);\n        case \"base64\":\n            // Warning: maxLength not taken into account in base64Write\n            return base64Write(this, string, offset, length);\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n            return ucs2Write(this, string, offset, length);\n        default:\n            if (loweredCase) throw new TypeError(\"Unknown encoding: \" + encoding);\n            encoding = (\"\" + encoding).toLowerCase();\n            loweredCase = true;\n    }\n};\nBuffer.prototype.toJSON = function toJSON() {\n    return {\n        type: \"Buffer\",\n        data: Array.prototype.slice.call(this._arr || this, 0)\n    };\n};\nfunction base64Slice(buf, start, end) {\n    if (start === 0 && end === buf.length) return base64.fromByteArray(buf);\n    else return base64.fromByteArray(buf.slice(start, end));\n}\nfunction utf8Slice(buf, start, end) {\n    end = Math.min(buf.length, end);\n    var res = [];\n    var i = start;\n    while(i < end){\n        var firstByte = buf[i];\n        var codePoint = null;\n        var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;\n        if (i + bytesPerSequence <= end) {\n            var secondByte, thirdByte, fourthByte, tempCodePoint;\n            switch(bytesPerSequence){\n                case 1:\n                    if (firstByte < 0x80) codePoint = firstByte;\n                    break;\n                case 2:\n                    secondByte = buf[i + 1];\n                    if ((secondByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;\n                        if (tempCodePoint > 0x7F) codePoint = tempCodePoint;\n                    }\n                    break;\n                case 3:\n                    secondByte = buf[i + 1];\n                    thirdByte = buf[i + 2];\n                    if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;\n                        if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) codePoint = tempCodePoint;\n                    }\n                    break;\n                case 4:\n                    secondByte = buf[i + 1];\n                    thirdByte = buf[i + 2];\n                    fourthByte = buf[i + 3];\n                    if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n                        tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;\n                        if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) codePoint = tempCodePoint;\n                    }\n            }\n        }\n        if (codePoint === null) {\n            // we did not generate a valid codePoint so insert a\n            // replacement char (U+FFFD) and advance only 1 byte\n            codePoint = 0xFFFD;\n            bytesPerSequence = 1;\n        } else if (codePoint > 0xFFFF) {\n            // encode to utf16 (surrogate pair dance)\n            codePoint -= 0x10000;\n            res.push(codePoint >>> 10 & 0x3FF | 0xD800);\n            codePoint = 0xDC00 | codePoint & 0x3FF;\n        }\n        res.push(codePoint);\n        i += bytesPerSequence;\n    }\n    return decodeCodePointsArray(res);\n}\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000;\nfunction decodeCodePointsArray(codePoints) {\n    var len = codePoints.length;\n    if (len <= MAX_ARGUMENTS_LENGTH) return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n    ;\n    // Decode in chunks to avoid \"call stack size exceeded\".\n    var res = \"\";\n    var i = 0;\n    while(i < len)res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));\n    return res;\n}\nfunction asciiSlice(buf, start, end) {\n    var ret = \"\";\n    end = Math.min(buf.length, end);\n    for(var i = start; i < end; ++i)ret += String.fromCharCode(buf[i] & 0x7F);\n    return ret;\n}\nfunction latin1Slice(buf, start, end) {\n    var ret = \"\";\n    end = Math.min(buf.length, end);\n    for(var i = start; i < end; ++i)ret += String.fromCharCode(buf[i]);\n    return ret;\n}\nfunction hexSlice(buf, start, end) {\n    var len = buf.length;\n    if (!start || start < 0) start = 0;\n    if (!end || end < 0 || end > len) end = len;\n    var out = \"\";\n    for(var i = start; i < end; ++i)out += hexSliceLookupTable[buf[i]];\n    return out;\n}\nfunction utf16leSlice(buf, start, end) {\n    var bytes = buf.slice(start, end);\n    var res = \"\";\n    // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n    for(var i = 0; i < bytes.length - 1; i += 2)res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);\n    return res;\n}\nBuffer.prototype.slice = function slice(start, end) {\n    var len = this.length;\n    start = ~~start;\n    end = end === undefined ? len : ~~end;\n    if (start < 0) {\n        start += len;\n        if (start < 0) start = 0;\n    } else if (start > len) start = len;\n    if (end < 0) {\n        end += len;\n        if (end < 0) end = 0;\n    } else if (end > len) end = len;\n    if (end < start) end = start;\n    var newBuf = this.subarray(start, end);\n    // Return an augmented `Uint8Array` instance\n    Object.setPrototypeOf(newBuf, Buffer.prototype);\n    return newBuf;\n};\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */ function checkOffset(offset, ext, length) {\n    if (offset % 1 !== 0 || offset < 0) throw new RangeError(\"offset is not uint\");\n    if (offset + ext > length) throw new RangeError(\"Trying to access beyond buffer length\");\n}\nBuffer.prototype.readUintLE = Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength1, noAssert) {\n    offset = offset >>> 0;\n    byteLength1 = byteLength1 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength1, this.length);\n    var val = this[offset];\n    var mul = 1;\n    var i = 0;\n    while(++i < byteLength1 && (mul *= 0x100))val += this[offset + i] * mul;\n    return val;\n};\nBuffer.prototype.readUintBE = Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength2, noAssert) {\n    offset = offset >>> 0;\n    byteLength2 = byteLength2 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength2, this.length);\n    var val = this[offset + --byteLength2];\n    var mul = 1;\n    while(byteLength2 > 0 && (mul *= 0x100))val += this[offset + --byteLength2] * mul;\n    return val;\n};\nBuffer.prototype.readUint8 = Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 1, this.length);\n    return this[offset];\n};\nBuffer.prototype.readUint16LE = Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    return this[offset] | this[offset + 1] << 8;\n};\nBuffer.prototype.readUint16BE = Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    return this[offset] << 8 | this[offset + 1];\n};\nBuffer.prototype.readUint32LE = Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;\n};\nBuffer.prototype.readUint32BE = Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);\n};\nBuffer.prototype.readIntLE = function readIntLE(offset, byteLength3, noAssert) {\n    offset = offset >>> 0;\n    byteLength3 = byteLength3 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength3, this.length);\n    var val = this[offset];\n    var mul = 1;\n    var i = 0;\n    while(++i < byteLength3 && (mul *= 0x100))val += this[offset + i] * mul;\n    mul *= 0x80;\n    if (val >= mul) val -= Math.pow(2, 8 * byteLength3);\n    return val;\n};\nBuffer.prototype.readIntBE = function readIntBE(offset, byteLength4, noAssert) {\n    offset = offset >>> 0;\n    byteLength4 = byteLength4 >>> 0;\n    if (!noAssert) checkOffset(offset, byteLength4, this.length);\n    var i = byteLength4;\n    var mul = 1;\n    var val = this[offset + --i];\n    while(i > 0 && (mul *= 0x100))val += this[offset + --i] * mul;\n    mul *= 0x80;\n    if (val >= mul) val -= Math.pow(2, 8 * byteLength4);\n    return val;\n};\nBuffer.prototype.readInt8 = function readInt8(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 1, this.length);\n    if (!(this[offset] & 0x80)) return this[offset];\n    return (0xff - this[offset] + 1) * -1;\n};\nBuffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    var val = this[offset] | this[offset + 1] << 8;\n    return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\nBuffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 2, this.length);\n    var val = this[offset + 1] | this[offset] << 8;\n    return val & 0x8000 ? val | 0xFFFF0000 : val;\n};\nBuffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;\n};\nBuffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];\n};\nBuffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return ieee754.read(this, offset, true, 23, 4);\n};\nBuffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 4, this.length);\n    return ieee754.read(this, offset, false, 23, 4);\n};\nBuffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 8, this.length);\n    return ieee754.read(this, offset, true, 52, 8);\n};\nBuffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {\n    offset = offset >>> 0;\n    if (!noAssert) checkOffset(offset, 8, this.length);\n    return ieee754.read(this, offset, false, 52, 8);\n};\nfunction checkInt(buf, value, offset, ext, max, min) {\n    if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n    if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds');\n    if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n}\nBuffer.prototype.writeUintLE = Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength5, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    byteLength5 = byteLength5 >>> 0;\n    if (!noAssert) {\n        var maxBytes = Math.pow(2, 8 * byteLength5) - 1;\n        checkInt(this, value, offset, byteLength5, maxBytes, 0);\n    }\n    var mul = 1;\n    var i = 0;\n    this[offset] = value & 0xFF;\n    while(++i < byteLength5 && (mul *= 0x100))this[offset + i] = value / mul & 0xFF;\n    return offset + byteLength5;\n};\nBuffer.prototype.writeUintBE = Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength6, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    byteLength6 = byteLength6 >>> 0;\n    if (!noAssert) {\n        var maxBytes = Math.pow(2, 8 * byteLength6) - 1;\n        checkInt(this, value, offset, byteLength6, maxBytes, 0);\n    }\n    var i = byteLength6 - 1;\n    var mul = 1;\n    this[offset + i] = value & 0xFF;\n    while(--i >= 0 && (mul *= 0x100))this[offset + i] = value / mul & 0xFF;\n    return offset + byteLength6;\n};\nBuffer.prototype.writeUint8 = Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);\n    this[offset] = value & 0xff;\n    return offset + 1;\n};\nBuffer.prototype.writeUint16LE = Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    return offset + 2;\n};\nBuffer.prototype.writeUint16BE = Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);\n    this[offset] = value >>> 8;\n    this[offset + 1] = value & 0xff;\n    return offset + 2;\n};\nBuffer.prototype.writeUint32LE = Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n    this[offset + 3] = value >>> 24;\n    this[offset + 2] = value >>> 16;\n    this[offset + 1] = value >>> 8;\n    this[offset] = value & 0xff;\n    return offset + 4;\n};\nBuffer.prototype.writeUint32BE = Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);\n    this[offset] = value >>> 24;\n    this[offset + 1] = value >>> 16;\n    this[offset + 2] = value >>> 8;\n    this[offset + 3] = value & 0xff;\n    return offset + 4;\n};\nBuffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength7, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) {\n        var limit = Math.pow(2, 8 * byteLength7 - 1);\n        checkInt(this, value, offset, byteLength7, limit - 1, -limit);\n    }\n    var i = 0;\n    var mul = 1;\n    var sub = 0;\n    this[offset] = value & 0xFF;\n    while(++i < byteLength7 && (mul *= 0x100)){\n        if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) sub = 1;\n        this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n    }\n    return offset + byteLength7;\n};\nBuffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength8, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) {\n        var limit = Math.pow(2, 8 * byteLength8 - 1);\n        checkInt(this, value, offset, byteLength8, limit - 1, -limit);\n    }\n    var i = byteLength8 - 1;\n    var mul = 1;\n    var sub = 0;\n    this[offset + i] = value & 0xFF;\n    while(--i >= 0 && (mul *= 0x100)){\n        if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) sub = 1;\n        this[offset + i] = (value / mul >> 0) - sub & 0xFF;\n    }\n    return offset + byteLength8;\n};\nBuffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -128);\n    if (value < 0) value = 0xff + value + 1;\n    this[offset] = value & 0xff;\n    return offset + 1;\n};\nBuffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    return offset + 2;\n};\nBuffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -32768);\n    this[offset] = value >>> 8;\n    this[offset + 1] = value & 0xff;\n    return offset + 2;\n};\nBuffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);\n    this[offset] = value & 0xff;\n    this[offset + 1] = value >>> 8;\n    this[offset + 2] = value >>> 16;\n    this[offset + 3] = value >>> 24;\n    return offset + 4;\n};\nBuffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -2147483648);\n    if (value < 0) value = 0xffffffff + value + 1;\n    this[offset] = value >>> 24;\n    this[offset + 1] = value >>> 16;\n    this[offset + 2] = value >>> 8;\n    this[offset + 3] = value & 0xff;\n    return offset + 4;\n};\nfunction checkIEEE754(buf, value, offset, ext, max, min) {\n    if (offset + ext > buf.length) throw new RangeError(\"Index out of range\");\n    if (offset < 0) throw new RangeError(\"Index out of range\");\n}\nfunction writeFloat(buf, value, offset, littleEndian, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -340282346638528860000000000000000000000);\n    ieee754.write(buf, value, offset, littleEndian, 23, 4);\n    return offset + 4;\n}\nBuffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {\n    return writeFloat(this, value, offset, true, noAssert);\n};\nBuffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {\n    return writeFloat(this, value, offset, false, noAssert);\n};\nfunction writeDouble(buf, value, offset, littleEndian, noAssert) {\n    value = +value;\n    offset = offset >>> 0;\n    if (!noAssert) checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);\n    ieee754.write(buf, value, offset, littleEndian, 52, 8);\n    return offset + 8;\n}\nBuffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {\n    return writeDouble(this, value, offset, true, noAssert);\n};\nBuffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {\n    return writeDouble(this, value, offset, false, noAssert);\n};\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy(target, targetStart, start, end) {\n    if (!Buffer.isBuffer(target)) throw new TypeError(\"argument should be a Buffer\");\n    if (!start) start = 0;\n    if (!end && end !== 0) end = this.length;\n    if (targetStart >= target.length) targetStart = target.length;\n    if (!targetStart) targetStart = 0;\n    if (end > 0 && end < start) end = start;\n    // Copy 0 bytes; we're done\n    if (end === start) return 0;\n    if (target.length === 0 || this.length === 0) return 0;\n    // Fatal error conditions\n    if (targetStart < 0) throw new RangeError(\"targetStart out of bounds\");\n    if (start < 0 || start >= this.length) throw new RangeError(\"Index out of range\");\n    if (end < 0) throw new RangeError(\"sourceEnd out of bounds\");\n    // Are we oob?\n    if (end > this.length) end = this.length;\n    if (target.length - targetStart < end - start) end = target.length - targetStart + start;\n    var len = end - start;\n    if (this === target && typeof Uint8Array.prototype.copyWithin === \"function\") // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end);\n    else Uint8Array.prototype.set.call(target, this.subarray(start, end), targetStart);\n    return len;\n};\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill(val, start, end, encoding) {\n    // Handle string cases:\n    if (typeof val === \"string\") {\n        if (typeof start === \"string\") {\n            encoding = start;\n            start = 0;\n            end = this.length;\n        } else if (typeof end === \"string\") {\n            encoding = end;\n            end = this.length;\n        }\n        if (encoding !== undefined && typeof encoding !== \"string\") throw new TypeError(\"encoding must be a string\");\n        if (typeof encoding === \"string\" && !Buffer.isEncoding(encoding)) throw new TypeError(\"Unknown encoding: \" + encoding);\n        if (val.length === 1) {\n            var code = val.charCodeAt(0);\n            if (encoding === \"utf8\" && code < 128 || encoding === \"latin1\") // Fast path: If `val` fits into a single byte, use that numeric value.\n            val = code;\n        }\n    } else if (typeof val === \"number\") val = val & 255;\n    else if (typeof val === \"boolean\") val = Number(val);\n    // Invalid ranges are not set to a default, so can range check early.\n    if (start < 0 || this.length < start || this.length < end) throw new RangeError(\"Out of range index\");\n    if (end <= start) return this;\n    start = start >>> 0;\n    end = end === undefined ? this.length : end >>> 0;\n    if (!val) val = 0;\n    var i;\n    if (typeof val === \"number\") for(i = start; i < end; ++i)this[i] = val;\n    else {\n        var bytes = Buffer.isBuffer(val) ? val : Buffer.from(val, encoding);\n        var len = bytes.length;\n        if (len === 0) throw new TypeError('The value \"' + val + '\" is invalid for argument \"value\"');\n        for(i = 0; i < end - start; ++i)this[i + start] = bytes[i % len];\n    }\n    return this;\n};\n// HELPER FUNCTIONS\n// ================\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g;\nfunction base64clean(str) {\n    // Node takes equal signs as end of the Base64 encoding\n    str = str.split(\"=\")[0];\n    // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n    str = str.trim().replace(INVALID_BASE64_RE, \"\");\n    // Node converts strings with length < 2 to ''\n    if (str.length < 2) return \"\";\n    // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n    while(str.length % 4 !== 0)str = str + \"=\";\n    return str;\n}\nfunction utf8ToBytes(string, units) {\n    units = units || Infinity;\n    var codePoint;\n    var length = string.length;\n    var leadSurrogate = null;\n    var bytes = [];\n    for(var i = 0; i < length; ++i){\n        codePoint = string.charCodeAt(i);\n        // is surrogate component\n        if (codePoint > 0xD7FF && codePoint < 0xE000) {\n            // last char was a lead\n            if (!leadSurrogate) {\n                // no lead yet\n                if (codePoint > 0xDBFF) {\n                    // unexpected trail\n                    if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                    continue;\n                } else if (i + 1 === length) {\n                    // unpaired lead\n                    if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                    continue;\n                }\n                // valid lead\n                leadSurrogate = codePoint;\n                continue;\n            }\n            // 2 leads in a row\n            if (codePoint < 0xDC00) {\n                if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n                leadSurrogate = codePoint;\n                continue;\n            }\n            // valid surrogate pair\n            codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;\n        } else if (leadSurrogate) // valid bmp char, but last char was a lead\n        {\n            if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);\n        }\n        leadSurrogate = null;\n        // encode utf8\n        if (codePoint < 0x80) {\n            if ((units -= 1) < 0) break;\n            bytes.push(codePoint);\n        } else if (codePoint < 0x800) {\n            if ((units -= 2) < 0) break;\n            bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);\n        } else if (codePoint < 0x10000) {\n            if ((units -= 3) < 0) break;\n            bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n        } else if (codePoint < 0x110000) {\n            if ((units -= 4) < 0) break;\n            bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);\n        } else throw new Error(\"Invalid code point\");\n    }\n    return bytes;\n}\nfunction asciiToBytes(str) {\n    var byteArray = [];\n    for(var i = 0; i < str.length; ++i)// Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF);\n    return byteArray;\n}\nfunction utf16leToBytes(str, units) {\n    var c, hi, lo;\n    var byteArray = [];\n    for(var i = 0; i < str.length; ++i){\n        if ((units -= 2) < 0) break;\n        c = str.charCodeAt(i);\n        hi = c >> 8;\n        lo = c % 256;\n        byteArray.push(lo);\n        byteArray.push(hi);\n    }\n    return byteArray;\n}\nfunction base64ToBytes(str) {\n    return base64.toByteArray(base64clean(str));\n}\nfunction blitBuffer(src, dst, offset, length) {\n    for(var i = 0; i < length; ++i){\n        if (i + offset >= dst.length || i >= src.length) break;\n        dst[i + offset] = src[i];\n    }\n    return i;\n}\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance(obj, type) {\n    return obj instanceof type || obj != null && obj.constructor != null && obj.constructor.name != null && obj.constructor.name === type.name;\n}\nfunction numberIsNaN(obj) {\n    // For IE11 support\n    return obj !== obj // eslint-disable-line no-self-compare\n    ;\n}\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nvar hexSliceLookupTable = function() {\n    var alphabet = \"0123456789abcdef\";\n    var table = new Array(256);\n    for(var i = 0; i < 16; ++i){\n        var i16 = i * 16;\n        for(var j = 0; j < 16; ++j)table[i16 + j] = alphabet[i] + alphabet[j];\n    }\n    return table;\n}();\n\n},{\"base64-js\":\"32JyI\",\"ieee754\":\"7LzLb\"}],\"32JyI\":[function(require,module,exports) {\n\"use strict\";\nexports.byteLength = byteLength;\nexports.toByteArray = toByteArray;\nexports.fromByteArray = fromByteArray;\nvar lookup = [];\nvar revLookup = [];\nvar Arr = typeof Uint8Array !== \"undefined\" ? Uint8Array : Array;\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfor(var i = 0, len = code.length; i < len; ++i){\n    lookup[i] = code[i];\n    revLookup[code.charCodeAt(i)] = i;\n}\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup[\"-\".charCodeAt(0)] = 62;\nrevLookup[\"_\".charCodeAt(0)] = 63;\nfunction getLens(b64) {\n    var len1 = b64.length;\n    if (len1 % 4 > 0) throw new Error(\"Invalid string. Length must be a multiple of 4\");\n    // Trim off extra bytes after placeholder bytes are found\n    // See: https://github.com/beatgammit/base64-js/issues/42\n    var validLen = b64.indexOf(\"=\");\n    if (validLen === -1) validLen = len1;\n    var placeHoldersLen = validLen === len1 ? 0 : 4 - validLen % 4;\n    return [\n        validLen,\n        placeHoldersLen\n    ];\n}\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength(b64) {\n    var lens = getLens(b64);\n    var validLen = lens[0];\n    var placeHoldersLen = lens[1];\n    return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction _byteLength(b64, validLen, placeHoldersLen) {\n    return (validLen + placeHoldersLen) * 3 / 4 - placeHoldersLen;\n}\nfunction toByteArray(b64) {\n    var tmp;\n    var lens = getLens(b64);\n    var validLen = lens[0];\n    var placeHoldersLen = lens[1];\n    var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n    var curByte = 0;\n    // if there are placeholders, only get up to the last complete 4 chars\n    var len2 = placeHoldersLen > 0 ? validLen - 4 : validLen;\n    var i1;\n    for(i1 = 0; i1 < len2; i1 += 4){\n        tmp = revLookup[b64.charCodeAt(i1)] << 18 | revLookup[b64.charCodeAt(i1 + 1)] << 12 | revLookup[b64.charCodeAt(i1 + 2)] << 6 | revLookup[b64.charCodeAt(i1 + 3)];\n        arr[curByte++] = tmp >> 16 & 0xFF;\n        arr[curByte++] = tmp >> 8 & 0xFF;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    if (placeHoldersLen === 2) {\n        tmp = revLookup[b64.charCodeAt(i1)] << 2 | revLookup[b64.charCodeAt(i1 + 1)] >> 4;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    if (placeHoldersLen === 1) {\n        tmp = revLookup[b64.charCodeAt(i1)] << 10 | revLookup[b64.charCodeAt(i1 + 1)] << 4 | revLookup[b64.charCodeAt(i1 + 2)] >> 2;\n        arr[curByte++] = tmp >> 8 & 0xFF;\n        arr[curByte++] = tmp & 0xFF;\n    }\n    return arr;\n}\nfunction tripletToBase64(num) {\n    return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];\n}\nfunction encodeChunk(uint8, start, end) {\n    var tmp;\n    var output = [];\n    for(var i2 = start; i2 < end; i2 += 3){\n        tmp = (uint8[i2] << 16 & 0xFF0000) + (uint8[i2 + 1] << 8 & 0xFF00) + (uint8[i2 + 2] & 0xFF);\n        output.push(tripletToBase64(tmp));\n    }\n    return output.join(\"\");\n}\nfunction fromByteArray(uint8) {\n    var tmp;\n    var len3 = uint8.length;\n    var extraBytes = len3 % 3 // if we have 1 byte left, pad 2 bytes\n    ;\n    var parts = [];\n    var maxChunkLength = 16383 // must be multiple of 3\n    ;\n    // go through the array every three bytes, we'll deal with trailing stuff later\n    for(var i3 = 0, len2 = len3 - extraBytes; i3 < len2; i3 += maxChunkLength)parts.push(encodeChunk(uint8, i3, i3 + maxChunkLength > len2 ? len2 : i3 + maxChunkLength));\n    // pad the end with zeros, but make sure to not forget the extra bytes\n    if (extraBytes === 1) {\n        tmp = uint8[len3 - 1];\n        parts.push(lookup[tmp >> 2] + lookup[tmp << 4 & 0x3F] + \"==\");\n    } else if (extraBytes === 2) {\n        tmp = (uint8[len3 - 2] << 8) + uint8[len3 - 1];\n        parts.push(lookup[tmp >> 10] + lookup[tmp >> 4 & 0x3F] + lookup[tmp << 2 & 0x3F] + \"=\");\n    }\n    return parts.join(\"\");\n}\n\n},{}],\"7LzLb\":[function(require,module,exports) {\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */ exports.read = function(buffer, offset, isLE, mLen, nBytes) {\n    var e, m;\n    var eLen = nBytes * 8 - mLen - 1;\n    var eMax = (1 << eLen) - 1;\n    var eBias = eMax >> 1;\n    var nBits = -7;\n    var i = isLE ? nBytes - 1 : 0;\n    var d = isLE ? -1 : 1;\n    var s = buffer[offset + i];\n    i += d;\n    e = s & (1 << -nBits) - 1;\n    s >>= -nBits;\n    nBits += eLen;\n    for(; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);\n    m = e & (1 << -nBits) - 1;\n    e >>= -nBits;\n    nBits += mLen;\n    for(; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);\n    if (e === 0) e = 1 - eBias;\n    else if (e === eMax) return m ? NaN : (s ? -1 : 1) * Infinity;\n    else {\n        m = m + Math.pow(2, mLen);\n        e = e - eBias;\n    }\n    return (s ? -1 : 1) * m * Math.pow(2, e - mLen);\n};\nexports.write = function(buffer, value, offset, isLE, mLen, nBytes) {\n    var e, m, c;\n    var eLen = nBytes * 8 - mLen - 1;\n    var eMax = (1 << eLen) - 1;\n    var eBias = eMax >> 1;\n    var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;\n    var i = isLE ? 0 : nBytes - 1;\n    var d = isLE ? 1 : -1;\n    var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n    value = Math.abs(value);\n    if (isNaN(value) || value === Infinity) {\n        m = isNaN(value) ? 1 : 0;\n        e = eMax;\n    } else {\n        e = Math.floor(Math.log(value) / Math.LN2);\n        if (value * (c = Math.pow(2, -e)) < 1) {\n            e--;\n            c *= 2;\n        }\n        if (e + eBias >= 1) value += rt / c;\n        else value += rt * Math.pow(2, 1 - eBias);\n        if (value * c >= 2) {\n            e++;\n            c /= 2;\n        }\n        if (e + eBias >= eMax) {\n            m = 0;\n            e = eMax;\n        } else if (e + eBias >= 1) {\n            m = (value * c - 1) * Math.pow(2, mLen);\n            e = e + eBias;\n        } else {\n            m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);\n            e = 0;\n        }\n    }\n    for(; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);\n    e = e << mLen | m;\n    eLen += mLen;\n    for(; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);\n    buffer[offset + i - d] |= s * 128;\n};\n\n},{}],\"gA9mK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"aggregate\", ()=>Aggregate);\nparcelHelpers.export(exports, \"bin\", ()=>Bin);\nparcelHelpers.export(exports, \"collect\", ()=>Collect);\nparcelHelpers.export(exports, \"compare\", ()=>Compare);\nparcelHelpers.export(exports, \"countpattern\", ()=>CountPattern);\nparcelHelpers.export(exports, \"cross\", ()=>Cross);\nparcelHelpers.export(exports, \"density\", ()=>Density);\nparcelHelpers.export(exports, \"dotbin\", ()=>DotBin);\nparcelHelpers.export(exports, \"expression\", ()=>Expression);\nparcelHelpers.export(exports, \"extent\", ()=>Extent);\nparcelHelpers.export(exports, \"facet\", ()=>Facet);\nparcelHelpers.export(exports, \"field\", ()=>Field);\nparcelHelpers.export(exports, \"filter\", ()=>Filter);\nparcelHelpers.export(exports, \"flatten\", ()=>Flatten);\nparcelHelpers.export(exports, \"fold\", ()=>Fold);\nparcelHelpers.export(exports, \"formula\", ()=>Formula);\nparcelHelpers.export(exports, \"generate\", ()=>Generate);\nparcelHelpers.export(exports, \"impute\", ()=>Impute);\nparcelHelpers.export(exports, \"joinaggregate\", ()=>JoinAggregate);\nparcelHelpers.export(exports, \"kde\", ()=>KDE);\nparcelHelpers.export(exports, \"key\", ()=>Key);\nparcelHelpers.export(exports, \"load\", ()=>Load);\nparcelHelpers.export(exports, \"lookup\", ()=>Lookup);\nparcelHelpers.export(exports, \"multiextent\", ()=>MultiExtent);\nparcelHelpers.export(exports, \"multivalues\", ()=>MultiValues);\nparcelHelpers.export(exports, \"params\", ()=>Params);\nparcelHelpers.export(exports, \"pivot\", ()=>Pivot);\nparcelHelpers.export(exports, \"prefacet\", ()=>PreFacet);\nparcelHelpers.export(exports, \"project\", ()=>Project);\nparcelHelpers.export(exports, \"proxy\", ()=>Proxy);\nparcelHelpers.export(exports, \"quantile\", ()=>Quantile);\nparcelHelpers.export(exports, \"relay\", ()=>Relay);\nparcelHelpers.export(exports, \"sample\", ()=>Sample);\nparcelHelpers.export(exports, \"sequence\", ()=>Sequence);\nparcelHelpers.export(exports, \"sieve\", ()=>Sieve);\nparcelHelpers.export(exports, \"subflow\", ()=>Subflow);\nparcelHelpers.export(exports, \"timeunit\", ()=>TimeUnit);\nparcelHelpers.export(exports, \"tupleindex\", ()=>TupleIndex);\nparcelHelpers.export(exports, \"values\", ()=>Values);\nparcelHelpers.export(exports, \"window\", ()=>Window);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaStatistics = require(\"vega-statistics\");\nvar _d3Array = require(\"d3-array\");\nvar _vegaTime = require(\"vega-time\");\nfunction multikey(f) {\n    return (x)=>{\n        const n = f.length;\n        let i = 1, k = String(f[0](x));\n        for(; i < n; ++i)k += \"|\" + f[i](x);\n        return k;\n    };\n}\nfunction groupkey(fields) {\n    return !fields || !fields.length ? function() {\n        return \"\";\n    } : fields.length === 1 ? fields[0] : multikey(fields);\n}\nfunction measureName(op, field, as) {\n    return as || op + (!field ? \"\" : \"_\" + field);\n}\nconst noop = ()=>{};\nconst base_op = {\n    init: noop,\n    add: noop,\n    rem: noop,\n    idx: 0\n};\nconst AggregateOps = {\n    values: {\n        init: (m)=>m.cell.store = true,\n        value: (m)=>m.cell.data.values(),\n        idx: -1\n    },\n    count: {\n        value: (m)=>m.cell.num\n    },\n    __count__: {\n        value: (m)=>m.missing + m.valid\n    },\n    missing: {\n        value: (m)=>m.missing\n    },\n    valid: {\n        value: (m)=>m.valid\n    },\n    sum: {\n        init: (m)=>m.sum = 0,\n        value: (m)=>m.sum,\n        add: (m, v)=>m.sum += +v,\n        rem: (m, v)=>m.sum -= v\n    },\n    product: {\n        init: (m)=>m.product = 1,\n        value: (m)=>m.valid ? m.product : undefined,\n        add: (m, v)=>m.product *= v,\n        rem: (m, v)=>m.product /= v\n    },\n    mean: {\n        init: (m)=>m.mean = 0,\n        value: (m)=>m.valid ? m.mean : undefined,\n        add: (m, v)=>(m.mean_d = v - m.mean, m.mean += m.mean_d / m.valid),\n        rem: (m, v)=>(m.mean_d = v - m.mean, m.mean -= m.valid ? m.mean_d / m.valid : m.mean)\n    },\n    average: {\n        value: (m)=>m.valid ? m.mean : undefined,\n        req: [\n            \"mean\"\n        ],\n        idx: 1\n    },\n    variance: {\n        init: (m)=>m.dev = 0,\n        value: (m)=>m.valid > 1 ? m.dev / (m.valid - 1) : undefined,\n        add: (m, v)=>m.dev += m.mean_d * (v - m.mean),\n        rem: (m, v)=>m.dev -= m.mean_d * (v - m.mean),\n        req: [\n            \"mean\"\n        ],\n        idx: 1\n    },\n    variancep: {\n        value: (m)=>m.valid > 1 ? m.dev / m.valid : undefined,\n        req: [\n            \"variance\"\n        ],\n        idx: 2\n    },\n    stdev: {\n        value: (m)=>m.valid > 1 ? Math.sqrt(m.dev / (m.valid - 1)) : undefined,\n        req: [\n            \"variance\"\n        ],\n        idx: 2\n    },\n    stdevp: {\n        value: (m)=>m.valid > 1 ? Math.sqrt(m.dev / m.valid) : undefined,\n        req: [\n            \"variance\"\n        ],\n        idx: 2\n    },\n    stderr: {\n        value: (m)=>m.valid > 1 ? Math.sqrt(m.dev / (m.valid * (m.valid - 1))) : undefined,\n        req: [\n            \"variance\"\n        ],\n        idx: 2\n    },\n    distinct: {\n        value: (m)=>m.cell.data.distinct(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    ci0: {\n        value: (m)=>m.cell.data.ci0(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    ci1: {\n        value: (m)=>m.cell.data.ci1(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    median: {\n        value: (m)=>m.cell.data.q2(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    q1: {\n        value: (m)=>m.cell.data.q1(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    q3: {\n        value: (m)=>m.cell.data.q3(m.get),\n        req: [\n            \"values\"\n        ],\n        idx: 3\n    },\n    min: {\n        init: (m)=>m.min = undefined,\n        value: (m)=>m.min = Number.isNaN(m.min) ? m.cell.data.min(m.get) : m.min,\n        add: (m, v)=>{\n            if (v < m.min || m.min === undefined) m.min = v;\n        },\n        rem: (m, v)=>{\n            if (v <= m.min) m.min = NaN;\n        },\n        req: [\n            \"values\"\n        ],\n        idx: 4\n    },\n    max: {\n        init: (m)=>m.max = undefined,\n        value: (m)=>m.max = Number.isNaN(m.max) ? m.cell.data.max(m.get) : m.max,\n        add: (m, v)=>{\n            if (v > m.max || m.max === undefined) m.max = v;\n        },\n        rem: (m, v)=>{\n            if (v >= m.max) m.max = NaN;\n        },\n        req: [\n            \"values\"\n        ],\n        idx: 4\n    },\n    argmin: {\n        init: (m)=>m.argmin = undefined,\n        value: (m)=>m.argmin || m.cell.data.argmin(m.get),\n        add: (m, v, t)=>{\n            if (v < m.min) m.argmin = t;\n        },\n        rem: (m, v)=>{\n            if (v <= m.min) m.argmin = undefined;\n        },\n        req: [\n            \"min\",\n            \"values\"\n        ],\n        idx: 3\n    },\n    argmax: {\n        init: (m)=>m.argmax = undefined,\n        value: (m)=>m.argmax || m.cell.data.argmax(m.get),\n        add: (m, v, t)=>{\n            if (v > m.max) m.argmax = t;\n        },\n        rem: (m, v)=>{\n            if (v >= m.max) m.argmax = undefined;\n        },\n        req: [\n            \"max\",\n            \"values\"\n        ],\n        idx: 3\n    }\n};\nconst ValidAggregateOps = Object.keys(AggregateOps);\nfunction measure(key, value) {\n    return (out)=>(0, _vegaUtil.extend)({\n            name: key,\n            out: out || key\n        }, base_op, value);\n}\nValidAggregateOps.forEach((key)=>{\n    AggregateOps[key] = measure(key, AggregateOps[key]);\n});\nfunction createMeasure(op, name) {\n    return AggregateOps[op](name);\n}\nfunction compareIndex(a, b) {\n    return a.idx - b.idx;\n}\nfunction resolve(agg) {\n    const map = {};\n    agg.forEach((a)=>map[a.name] = a);\n    const getreqs = (a)=>{\n        if (!a.req) return;\n        a.req.forEach((key)=>{\n            if (!map[key]) getreqs(map[key] = AggregateOps[key]());\n        });\n    };\n    agg.forEach(getreqs);\n    return Object.values(map).sort(compareIndex);\n}\nfunction init() {\n    this.valid = 0;\n    this.missing = 0;\n    this._ops.forEach((op)=>op.init(this));\n}\nfunction add(v, t) {\n    if (v == null || v === \"\") {\n        ++this.missing;\n        return;\n    }\n    if (v !== v) return;\n    ++this.valid;\n    this._ops.forEach((op)=>op.add(this, v, t));\n}\nfunction rem(v, t) {\n    if (v == null || v === \"\") {\n        --this.missing;\n        return;\n    }\n    if (v !== v) return;\n    --this.valid;\n    this._ops.forEach((op)=>op.rem(this, v, t));\n}\nfunction set(t) {\n    this._out.forEach((op)=>t[op.out] = op.value(this));\n    return t;\n}\nfunction compileMeasures(agg, field) {\n    const get1 = field || (0, _vegaUtil.identity), ops = resolve(agg), out = agg.slice().sort(compareIndex);\n    function ctr(cell1) {\n        this._ops = ops;\n        this._out = out;\n        this.cell = cell1;\n        this.init();\n    }\n    ctr.prototype.init = init;\n    ctr.prototype.add = add;\n    ctr.prototype.rem = rem;\n    ctr.prototype.set = set;\n    ctr.prototype.get = get1;\n    ctr.fields = agg.map((op)=>op.out);\n    return ctr;\n}\nfunction TupleStore(key) {\n    this._key = key ? (0, _vegaUtil.field)(key) : (0, _vegaDataflow.tupleid);\n    this.reset();\n}\nconst prototype$1 = TupleStore.prototype;\nprototype$1.reset = function() {\n    this._add = [];\n    this._rem = [];\n    this._ext = null;\n    this._get = null;\n    this._q = null;\n};\nprototype$1.add = function(v) {\n    this._add.push(v);\n};\nprototype$1.rem = function(v) {\n    this._rem.push(v);\n};\nprototype$1.values = function() {\n    this._get = null;\n    if (this._rem.length === 0) return this._add;\n    const a = this._add, r = this._rem, k = this._key, n = a.length, m = r.length, x = Array(n - m), map = {};\n    let i, j, v; // use unique key field to clear removed values\n    for(i = 0; i < m; ++i)map[k(r[i])] = 1;\n    for(i = 0, j = 0; i < n; ++i)if (map[k(v = a[i])]) map[k(v)] = 0;\n    else x[j++] = v;\n    this._rem = [];\n    return this._add = x;\n}; // memoizing statistics methods\nprototype$1.distinct = function(get2) {\n    const v = this.values(), map = {};\n    let n = v.length, count = 0, s;\n    while(--n >= 0){\n        s = get2(v[n]) + \"\";\n        if (!(0, _vegaUtil.hasOwnProperty)(map, s)) {\n            map[s] = 1;\n            ++count;\n        }\n    }\n    return count;\n};\nprototype$1.extent = function(get3) {\n    if (this._get !== get3 || !this._ext) {\n        const v = this.values(), i = (0, _vegaUtil.extentIndex)(v, get3);\n        this._ext = [\n            v[i[0]],\n            v[i[1]]\n        ];\n        this._get = get3;\n    }\n    return this._ext;\n};\nprototype$1.argmin = function(get4) {\n    return this.extent(get4)[0] || {};\n};\nprototype$1.argmax = function(get5) {\n    return this.extent(get5)[1] || {};\n};\nprototype$1.min = function(get6) {\n    const m = this.extent(get6)[0];\n    return m != null ? get6(m) : undefined;\n};\nprototype$1.max = function(get7) {\n    const m = this.extent(get7)[1];\n    return m != null ? get7(m) : undefined;\n};\nprototype$1.quartile = function(get8) {\n    if (this._get !== get8 || !this._q) {\n        this._q = (0, _vegaStatistics.quartiles)(this.values(), get8);\n        this._get = get8;\n    }\n    return this._q;\n};\nprototype$1.q1 = function(get9) {\n    return this.quartile(get9)[0];\n};\nprototype$1.q2 = function(get10) {\n    return this.quartile(get10)[1];\n};\nprototype$1.q3 = function(get11) {\n    return this.quartile(get11)[2];\n};\nprototype$1.ci = function(get12) {\n    if (this._get !== get12 || !this._ci) {\n        this._ci = (0, _vegaStatistics.bootstrapCI)(this.values(), 1000, 0.05, get12);\n        this._get = get12;\n    }\n    return this._ci;\n};\nprototype$1.ci0 = function(get13) {\n    return this.ci(get13)[0];\n};\nprototype$1.ci1 = function(get14) {\n    return this.ci(get14)[1];\n};\n/**\n * Group-by aggregation operator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {Array<function(object): *>} [params.fields] - An array of accessors to aggregate.\n * @param {Array<string>} [params.ops] - An array of strings indicating aggregation operations.\n * @param {Array<string>} [params.as] - An array of output field names for aggregated values.\n * @param {boolean} [params.cross=false] - A flag indicating that the full\n *   cross-product of groupby values should be generated, including empty cells.\n *   If true, the drop parameter is ignored and empty cells are retained.\n * @param {boolean} [params.drop=true] - A flag indicating if empty cells should be removed.\n */ function Aggregate(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n    this._adds = []; // array of added output tuples\n    this._mods = []; // array of modified output tuples\n    this._alen = 0; // number of active added tuples\n    this._mlen = 0; // number of active modified tuples\n    this._drop = true; // should empty aggregation cells be removed\n    this._cross = false; // produce full cross-product of group-by values\n    this._dims = []; // group-by dimension accessors\n    this._dnames = []; // group-by dimension names\n    this._measures = []; // collection of aggregation monoids\n    this._countOnly = false; // flag indicating only count aggregation\n    this._counts = null; // collection of count fields\n    this._prev = null; // previous aggregation cells\n    this._inputs = null; // array of dependent input tuple field names\n    this._outputs = null; // array of output tuple field names\n}\nAggregate.Definition = {\n    \"type\": \"Aggregate\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"ops\",\n            \"type\": \"enum\",\n            \"array\": true,\n            \"values\": ValidAggregateOps\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"drop\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"cross\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"key\",\n            \"type\": \"field\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Aggregate, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const aggr = this, out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), mod = _.modified();\n        aggr.stamp = out.stamp;\n        if (aggr.value && (mod || pulse.modified(aggr._inputs, true))) {\n            aggr._prev = aggr.value;\n            aggr.value = mod ? aggr.init(_) : {};\n            pulse.visit(pulse.SOURCE, (t)=>aggr.add(t));\n        } else {\n            aggr.value = aggr.value || aggr.init(_);\n            pulse.visit(pulse.REM, (t)=>aggr.rem(t));\n            pulse.visit(pulse.ADD, (t)=>aggr.add(t));\n        } // Indicate output fields and return aggregate tuples.\n        out.modifies(aggr._outputs); // Should empty cells be dropped?\n        aggr._drop = _.drop !== false; // If domain cross-product requested, generate empty cells as needed\n        // and ensure that empty cells are not dropped\n        if (_.cross && aggr._dims.length > 1) {\n            aggr._drop = false;\n            aggr.cross();\n        }\n        if (pulse.clean() && aggr._drop) out.clean(true).runAfter(()=>this.clean());\n        return aggr.changes(out);\n    },\n    cross () {\n        const aggr = this, curr = aggr.value, dims = aggr._dnames, vals = dims.map(()=>({})), n = dims.length; // collect all group-by domain values\n        function collect(cells) {\n            let key, i, t, v;\n            for(key in cells){\n                t = cells[key].tuple;\n                for(i = 0; i < n; ++i)vals[i][v = t[dims[i]]] = v;\n            }\n        }\n        collect(aggr._prev);\n        collect(curr); // iterate over key cross-product, create cells as needed\n        function generate(base, tuple, index) {\n            const name = dims[index], v = vals[index++];\n            for(const k in v){\n                const key = base ? base + \"|\" + k : k;\n                tuple[name] = v[k];\n                if (index < n) generate(key, tuple, index);\n                else if (!curr[key]) aggr.cell(key, tuple);\n            }\n        }\n        generate(\"\", {}, 0);\n    },\n    init (_) {\n        // initialize input and output fields\n        const inputs = this._inputs = [], outputs = this._outputs = [], inputMap = {};\n        function inputVisit(get15) {\n            const fields = (0, _vegaUtil.array)((0, _vegaUtil.accessorFields)(get15)), n = fields.length;\n            let i = 0, f;\n            for(; i < n; ++i)if (!inputMap[f = fields[i]]) {\n                inputMap[f] = 1;\n                inputs.push(f);\n            }\n        } // initialize group-by dimensions\n        this._dims = (0, _vegaUtil.array)(_.groupby);\n        this._dnames = this._dims.map((d)=>{\n            const dname = (0, _vegaUtil.accessorName)(d);\n            inputVisit(d);\n            outputs.push(dname);\n            return dname;\n        });\n        this.cellkey = _.key ? _.key : groupkey(this._dims); // initialize aggregate measures\n        this._countOnly = true;\n        this._counts = [];\n        this._measures = [];\n        const fields1 = _.fields || [\n            null\n        ], ops = _.ops || [\n            \"count\"\n        ], as = _.as || [], n1 = fields1.length, map = {};\n        let field, op, m1, mname, outname, i1;\n        if (n1 !== ops.length) (0, _vegaUtil.error)(\"Unmatched number of fields and aggregate ops.\");\n        for(i1 = 0; i1 < n1; ++i1){\n            field = fields1[i1];\n            op = ops[i1];\n            if (field == null && op !== \"count\") (0, _vegaUtil.error)(\"Null aggregate field specified.\");\n            mname = (0, _vegaUtil.accessorName)(field);\n            outname = measureName(op, mname, as[i1]);\n            outputs.push(outname);\n            if (op === \"count\") {\n                this._counts.push(outname);\n                continue;\n            }\n            m1 = map[mname];\n            if (!m1) {\n                inputVisit(field);\n                m1 = map[mname] = [];\n                m1.field = field;\n                this._measures.push(m1);\n            }\n            if (op !== \"count\") this._countOnly = false;\n            m1.push(createMeasure(op, outname));\n        }\n        this._measures = this._measures.map((m)=>compileMeasures(m, m.field));\n        return {}; // aggregation cells (this.value)\n    },\n    // -- Cell Management -----\n    cellkey: groupkey(),\n    cell (key, t) {\n        let cell2 = this.value[key];\n        if (!cell2) {\n            cell2 = this.value[key] = this.newcell(key, t);\n            this._adds[this._alen++] = cell2;\n        } else if (cell2.num === 0 && this._drop && cell2.stamp < this.stamp) {\n            cell2.stamp = this.stamp;\n            this._adds[this._alen++] = cell2;\n        } else if (cell2.stamp < this.stamp) {\n            cell2.stamp = this.stamp;\n            this._mods[this._mlen++] = cell2;\n        }\n        return cell2;\n    },\n    newcell (key, t) {\n        const cell3 = {\n            key: key,\n            num: 0,\n            agg: null,\n            tuple: this.newtuple(t, this._prev && this._prev[key]),\n            stamp: this.stamp,\n            store: false\n        };\n        if (!this._countOnly) {\n            const measures = this._measures, n = measures.length;\n            cell3.agg = Array(n);\n            for(let i = 0; i < n; ++i)cell3.agg[i] = new measures[i](cell3);\n        }\n        if (cell3.store) cell3.data = new TupleStore();\n        return cell3;\n    },\n    newtuple (t, p) {\n        const names = this._dnames, dims = this._dims, n = dims.length, x = {};\n        for(let i = 0; i < n; ++i)x[names[i]] = dims[i](t);\n        return p ? (0, _vegaDataflow.replace)(p.tuple, x) : (0, _vegaDataflow.ingest)(x);\n    },\n    clean () {\n        const cells = this.value;\n        for(const key in cells)if (cells[key].num === 0) delete cells[key];\n    },\n    // -- Process Tuples -----\n    add (t) {\n        const key = this.cellkey(t), cell4 = this.cell(key, t);\n        cell4.num += 1;\n        if (this._countOnly) return;\n        if (cell4.store) cell4.data.add(t);\n        const agg = cell4.agg;\n        for(let i = 0, n = agg.length; i < n; ++i)agg[i].add(agg[i].get(t), t);\n    },\n    rem (t) {\n        const key = this.cellkey(t), cell5 = this.cell(key, t);\n        cell5.num -= 1;\n        if (this._countOnly) return;\n        if (cell5.store) cell5.data.rem(t);\n        const agg = cell5.agg;\n        for(let i = 0, n = agg.length; i < n; ++i)agg[i].rem(agg[i].get(t), t);\n    },\n    celltuple (cell6) {\n        const tuple = cell6.tuple, counts = this._counts; // consolidate stored values\n        if (cell6.store) cell6.data.values();\n         // update tuple properties\n        for(let i = 0, n = counts.length; i < n; ++i)tuple[counts[i]] = cell6.num;\n        if (!this._countOnly) {\n            const agg = cell6.agg;\n            for(let i = 0, n = agg.length; i < n; ++i)agg[i].set(tuple);\n        }\n        return tuple;\n    },\n    changes (out) {\n        const adds = this._adds, mods = this._mods, prev = this._prev, drop = this._drop, add1 = out.add, rem1 = out.rem, mod = out.mod;\n        let cell7, key, i, n;\n        if (prev) for(key in prev){\n            cell7 = prev[key];\n            if (!drop || cell7.num) rem1.push(cell7.tuple);\n        }\n        for(i = 0, n = this._alen; i < n; ++i){\n            add1.push(this.celltuple(adds[i]));\n            adds[i] = null; // for garbage collection\n        }\n        for(i = 0, n = this._mlen; i < n; ++i){\n            cell7 = mods[i];\n            (cell7.num === 0 && drop ? rem1 : mod).push(this.celltuple(cell7));\n            mods[i] = null; // for garbage collection\n        }\n        this._alen = this._mlen = 0; // reset list of active cells\n        this._prev = null;\n        return out;\n    }\n});\nconst EPSILON$1 = 1e-14;\n/**\n * Generates a binning function for discretizing data.\n * @constructor\n * @param {object} params - The parameters for this operator. The\n *   provided values should be valid options for the {@link bin} function.\n * @param {function(object): *} params.field - The data field to bin.\n */ function Bin(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nBin.Definition = {\n    \"type\": \"Bin\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"interval\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"anchor\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"maxbins\",\n            \"type\": \"number\",\n            \"default\": 20\n        },\n        {\n            \"name\": \"base\",\n            \"type\": \"number\",\n            \"default\": 10\n        },\n        {\n            \"name\": \"divide\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"default\": [\n                5,\n                2\n            ]\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"required\": true\n        },\n        {\n            \"name\": \"span\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"steps\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"minstep\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"nice\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"name\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"bin0\",\n                \"bin1\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Bin, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const band = _.interval !== false, bins = this._bins(_), start = bins.start, step = bins.step, as = _.as || [\n            \"bin0\",\n            \"bin1\"\n        ], b0 = as[0], b1 = as[1];\n        let flag;\n        if (_.modified()) {\n            pulse = pulse.reflow(true);\n            flag = pulse.SOURCE;\n        } else flag = pulse.modified((0, _vegaUtil.accessorFields)(_.field)) ? pulse.ADD_MOD : pulse.ADD;\n        pulse.visit(flag, band ? (t)=>{\n            const v = bins(t); // minimum bin value (inclusive)\n            t[b0] = v; // maximum bin value (exclusive)\n            // use convoluted math for better floating point agreement\n            // see https://github.com/vega/vega/issues/830\n            // infinite values propagate through this formula! #2227\n            t[b1] = v == null ? null : start + step * (1 + (v - start) / step);\n        } : (t)=>t[b0] = bins(t));\n        return pulse.modifies(band ? as : b0);\n    },\n    _bins (_) {\n        if (this.value && !_.modified()) return this.value;\n        const field = _.field, bins = (0, _vegaStatistics.bin)(_), step = bins.step;\n        let start = bins.start, stop1 = start + Math.ceil((bins.stop - start) / step) * step, a, d;\n        if ((a = _.anchor) != null) {\n            d = a - (start + step * Math.floor((a - start) / step));\n            start += d;\n            stop1 += d;\n        }\n        const f = function(t) {\n            let v = (0, _vegaUtil.toNumber)(field(t));\n            return v == null ? null : v < start ? -Infinity : v > stop1 ? Infinity : (v = Math.max(start, Math.min(v, stop1 - step)), start + step * Math.floor(EPSILON$1 + (v - start) / step));\n        };\n        f.start = start;\n        f.stop = bins.stop;\n        f.step = step;\n        return this.value = (0, _vegaUtil.accessor)(f, (0, _vegaUtil.accessorFields)(field), _.name || \"bin_\" + (0, _vegaUtil.accessorName)(field));\n    }\n});\nfunction SortedList(idFunc, source1, input) {\n    const $ = idFunc;\n    let data = source1 || [], add2 = input || [], rem2 = {}, cnt = 0;\n    return {\n        add: (t)=>add2.push(t),\n        remove: (t)=>rem2[$(t)] = ++cnt,\n        size: ()=>data.length,\n        data: (compare, resort)=>{\n            if (cnt) {\n                data = data.filter((t)=>!rem2[$(t)]);\n                rem2 = {};\n                cnt = 0;\n            }\n            if (resort && compare) data.sort(compare);\n            if (add2.length) {\n                data = compare ? (0, _vegaUtil.merge)(compare, data, add2.sort(compare)) : data.concat(add2);\n                add2 = [];\n            }\n            return data;\n        }\n    };\n}\n/**\n * Collects all data tuples that pass through this operator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - An optional\n *   comparator function for additionally sorting the collected tuples.\n */ function Collect(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nCollect.Definition = {\n    \"type\": \"Collect\",\n    \"metadata\": {\n        \"source\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Collect, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.ALL), list = SortedList((0, _vegaDataflow.tupleid), this.value, out.materialize(out.ADD).add), sort = _.sort, mod = pulse.changed() || sort && (_.modified(\"sort\") || pulse.modified(sort.fields));\n        out.visit(out.REM, list.remove);\n        this.modified(mod);\n        this.value = out.source = list.data((0, _vegaDataflow.stableCompare)(sort), mod); // propagate tree root if defined\n        if (pulse.source && pulse.source.root) this.value.root = pulse.source.root;\n        return out;\n    }\n});\n/**\n * Generates a comparator function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<string|function>} params.fields - The fields to compare.\n * @param {Array<string>} [params.orders] - The sort orders.\n *   Each entry should be one of \"ascending\" (default) or \"descending\".\n */ function Compare(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$5, params);\n}\n(0, _vegaUtil.inherits)(Compare, (0, _vegaDataflow.Operator));\nfunction update$5(_) {\n    return this.value && !_.modified() ? this.value : (0, _vegaUtil.compare)(_.fields, _.orders);\n}\n/**\n * Count regexp-defined pattern occurrences in a text field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - An accessor for the text field.\n * @param {string} [params.pattern] - RegExp string defining the text pattern.\n * @param {string} [params.case] - One of 'lower', 'upper' or null (mixed) case.\n * @param {string} [params.stopwords] - RegExp string of words to ignore.\n */ function CountPattern(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nCountPattern.Definition = {\n    \"type\": \"CountPattern\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"case\",\n            \"type\": \"enum\",\n            \"values\": [\n                \"upper\",\n                \"lower\",\n                \"mixed\"\n            ],\n            \"default\": \"mixed\"\n        },\n        {\n            \"name\": \"pattern\",\n            \"type\": \"string\",\n            \"default\": '[\\\\w\"]+'\n        },\n        {\n            \"name\": \"stopwords\",\n            \"type\": \"string\",\n            \"default\": \"\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"text\",\n                \"count\"\n            ]\n        }\n    ]\n};\nfunction tokenize(text, tcase, match) {\n    switch(tcase){\n        case \"upper\":\n            text = text.toUpperCase();\n            break;\n        case \"lower\":\n            text = text.toLowerCase();\n            break;\n    }\n    return text.match(match);\n}\n(0, _vegaUtil.inherits)(CountPattern, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const process = (update1)=>(tuple)=>{\n                var tokens = tokenize(get16(tuple), _.case, match) || [], t;\n                for(var i = 0, n = tokens.length; i < n; ++i)if (!stop2.test(t = tokens[i])) update1(t);\n            };\n        const init1 = this._parameterCheck(_, pulse), counts = this._counts, match = this._match, stop2 = this._stop, get16 = _.field, as = _.as || [\n            \"text\",\n            \"count\"\n        ], add3 = process((t)=>counts[t] = 1 + (counts[t] || 0)), rem3 = process((t)=>counts[t] -= 1);\n        if (init1) pulse.visit(pulse.SOURCE, add3);\n        else {\n            pulse.visit(pulse.ADD, add3);\n            pulse.visit(pulse.REM, rem3);\n        }\n        return this._finish(pulse, as); // generate output tuples\n    },\n    _parameterCheck (_, pulse) {\n        let init2 = false;\n        if (_.modified(\"stopwords\") || !this._stop) {\n            this._stop = new RegExp(\"^\" + (_.stopwords || \"\") + \"$\", \"i\");\n            init2 = true;\n        }\n        if (_.modified(\"pattern\") || !this._match) {\n            this._match = new RegExp(_.pattern || \"[\\\\w']+\", \"g\");\n            init2 = true;\n        }\n        if (_.modified(\"field\") || pulse.modified(_.field.fields)) init2 = true;\n        if (init2) this._counts = {};\n        return init2;\n    },\n    _finish (pulse, as) {\n        const counts = this._counts, tuples = this._tuples || (this._tuples = {}), text = as[0], count = as[1], out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        let w, t, c;\n        for(w in counts){\n            t = tuples[w];\n            c = counts[w] || 0;\n            if (!t && c) {\n                tuples[w] = t = (0, _vegaDataflow.ingest)({});\n                t[text] = w;\n                t[count] = c;\n                out.add.push(t);\n            } else if (c === 0) {\n                if (t) out.rem.push(t);\n                counts[w] = null;\n                tuples[w] = null;\n            } else if (t[count] !== c) {\n                t[count] = c;\n                out.mod.push(t);\n            }\n        }\n        return out.modifies(as);\n    }\n});\n/**\n * Perform a cross-product of a tuple stream with itself.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object):boolean} [params.filter] - An optional filter\n *   function for selectively including tuples in the cross product.\n * @param {Array<string>} [params.as] - The names of the output fields.\n */ function Cross(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nCross.Definition = {\n    \"type\": \"Cross\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"filter\",\n            \"type\": \"expr\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"a\",\n                \"b\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Cross, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), as = _.as || [\n            \"a\",\n            \"b\"\n        ], a = as[0], b = as[1], reset = !this.value || pulse.changed(pulse.ADD_REM) || _.modified(\"as\") || _.modified(\"filter\");\n        let data = this.value;\n        if (reset) {\n            if (data) out.rem = data;\n            data = pulse.materialize(pulse.SOURCE).source;\n            out.add = this.value = cross(data, a, b, _.filter || (0, _vegaUtil.truthy));\n        } else out.mod = data;\n        out.source = this.value;\n        return out.modifies(as);\n    }\n});\nfunction cross(input, a, b, filter) {\n    var data = [], t = {}, n = input.length, i = 0, j, left;\n    for(; i < n; ++i){\n        t[a] = left = input[i];\n        for(j = 0; j < n; ++j){\n            t[b] = input[j];\n            if (filter(t)) {\n                data.push((0, _vegaDataflow.ingest)(t));\n                t = {};\n                t[a] = left;\n            }\n        }\n    }\n    return data;\n}\nconst Distributions = {\n    kde: (0, _vegaStatistics.randomKDE),\n    mixture: (0, _vegaStatistics.randomMixture),\n    normal: (0, _vegaStatistics.randomNormal),\n    lognormal: (0, _vegaStatistics.randomLogNormal),\n    uniform: (0, _vegaStatistics.randomUniform)\n};\nconst DISTRIBUTIONS = \"distributions\", FUNCTION = \"function\", FIELD = \"field\";\n/**\n * Parse a parameter object for a probability distribution.\n * @param {object} def - The distribution parameter object.\n * @param {function():Array<object>} - A method for requesting\n *   source data. Used for distributions (such as KDE) that\n *   require sample data points. This method will only be\n *   invoked if the 'from' parameter for a target data source\n *   is not provided. Typically this method returns backing\n *   source data for a Pulse object.\n * @return {object} - The output distribution object.\n */ function parse(def, data) {\n    const func = def[FUNCTION];\n    if (!(0, _vegaUtil.hasOwnProperty)(Distributions, func)) (0, _vegaUtil.error)(\"Unknown distribution function: \" + func);\n    const d = Distributions[func]();\n    for(const name in def){\n        // if data field, extract values\n        if (name === FIELD) d.data((def.from || data()).map(def[name]));\n        else if (name === DISTRIBUTIONS) d[name](def[name].map((_)=>parse(_, data)));\n        else if (typeof d[name] === FUNCTION) d[name](def[name]);\n    }\n    return d;\n}\n/**\n * Grid sample points for a probability density. Given a distribution and\n * a sampling extent, will generate points suitable for plotting either\n * PDF (probability density function) or CDF (cumulative distribution\n * function) curves.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.distribution - The probability distribution. This\n *   is an object parameter dependent on the distribution type.\n * @param {string} [params.method='pdf'] - The distribution method to sample.\n *   One of 'pdf' or 'cdf'.\n * @param {Array<number>} [params.extent] - The [min, max] extent over which\n *   to sample the distribution. This argument is required in most cases, but\n *   can be omitted if the distribution (e.g., 'kde') supports a 'data' method\n *   that returns numerical sample points from which the extent can be deduced.\n * @param {number} [params.minsteps=25] - The minimum number of curve samples\n *   for plotting the density.\n * @param {number} [params.maxsteps=200] - The maximum number of curve samples\n *   for plotting the density.\n * @param {number} [params.steps] - The exact number of curve samples for\n *   plotting the density. If specified, overrides both minsteps and maxsteps\n *   to set an exact number of uniform samples. Useful in conjunction with\n *   a fixed extent to ensure consistent sample points for stacked densities.\n */ function Density(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nconst distributions = [\n    {\n        \"key\": {\n            \"function\": \"normal\"\n        },\n        \"params\": [\n            {\n                \"name\": \"mean\",\n                \"type\": \"number\",\n                \"default\": 0\n            },\n            {\n                \"name\": \"stdev\",\n                \"type\": \"number\",\n                \"default\": 1\n            }\n        ]\n    },\n    {\n        \"key\": {\n            \"function\": \"lognormal\"\n        },\n        \"params\": [\n            {\n                \"name\": \"mean\",\n                \"type\": \"number\",\n                \"default\": 0\n            },\n            {\n                \"name\": \"stdev\",\n                \"type\": \"number\",\n                \"default\": 1\n            }\n        ]\n    },\n    {\n        \"key\": {\n            \"function\": \"uniform\"\n        },\n        \"params\": [\n            {\n                \"name\": \"min\",\n                \"type\": \"number\",\n                \"default\": 0\n            },\n            {\n                \"name\": \"max\",\n                \"type\": \"number\",\n                \"default\": 1\n            }\n        ]\n    },\n    {\n        \"key\": {\n            \"function\": \"kde\"\n        },\n        \"params\": [\n            {\n                \"name\": \"field\",\n                \"type\": \"field\",\n                \"required\": true\n            },\n            {\n                \"name\": \"from\",\n                \"type\": \"data\"\n            },\n            {\n                \"name\": \"bandwidth\",\n                \"type\": \"number\",\n                \"default\": 0\n            }\n        ]\n    }\n];\nconst mixture = {\n    \"key\": {\n        \"function\": \"mixture\"\n    },\n    \"params\": [\n        {\n            \"name\": \"distributions\",\n            \"type\": \"param\",\n            \"array\": true,\n            \"params\": distributions\n        },\n        {\n            \"name\": \"weights\",\n            \"type\": \"number\",\n            \"array\": true\n        }\n    ]\n};\nDensity.Definition = {\n    \"type\": \"Density\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"extent\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"steps\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"minsteps\",\n            \"type\": \"number\",\n            \"default\": 25\n        },\n        {\n            \"name\": \"maxsteps\",\n            \"type\": \"number\",\n            \"default\": 200\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"string\",\n            \"default\": \"pdf\",\n            \"values\": [\n                \"pdf\",\n                \"cdf\"\n            ]\n        },\n        {\n            \"name\": \"distribution\",\n            \"type\": \"param\",\n            \"params\": distributions.concat(mixture)\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"default\": [\n                \"value\",\n                \"density\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Density, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        if (!this.value || pulse.changed() || _.modified()) {\n            const dist = parse(_.distribution, source(pulse)), minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n            let method = _.method || \"pdf\";\n            if (method !== \"pdf\" && method !== \"cdf\") (0, _vegaUtil.error)(\"Invalid density method: \" + method);\n            if (!_.extent && !dist.data) (0, _vegaUtil.error)(\"Missing density extent parameter.\");\n            method = dist[method];\n            const as = _.as || [\n                \"value\",\n                \"density\"\n            ], domain = _.extent || (0, _vegaUtil.extent)(dist.data()), values = (0, _vegaStatistics.sampleCurve)(method, domain, minsteps, maxsteps).map((v)=>{\n                const tuple = {};\n                tuple[as[0]] = v[0];\n                tuple[as[1]] = v[1];\n                return (0, _vegaDataflow.ingest)(tuple);\n            });\n            if (this.value) out.rem = this.value;\n            this.value = out.add = out.source = values;\n        }\n        return out;\n    }\n});\nfunction source(pulse) {\n    return ()=>pulse.materialize(pulse.SOURCE).source;\n}\nfunction fieldNames(fields, as) {\n    if (!fields) return null;\n    return fields.map((f, i)=>as[i] || (0, _vegaUtil.accessorName)(f));\n}\nfunction partition$1(data, groupby, field) {\n    const groups = [], get17 = (f)=>f(t);\n    let map, i, n, t, k, g; // partition data points into groups\n    if (groupby == null) groups.push(data.map(field));\n    else for(map = {}, i = 0, n = data.length; i < n; ++i){\n        t = data[i];\n        k = groupby.map(get17);\n        g = map[k];\n        if (!g) {\n            map[k] = g = [];\n            g.dims = k;\n            groups.push(g);\n        }\n        g.push(field(t));\n    }\n    return groups;\n}\nconst Output = \"bin\";\n/**\n * Dot density binning for dot plot construction.\n * Based on Leland Wilkinson, Dot Plots, The American Statistician, 1999.\n * https://www.cs.uic.edu/~wilkinson/Publications/dotplots.pdf\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to bin.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {number} [params.step] - The step size (bin width) within which dots should be\n *   stacked. Defaults to 1/30 of the extent of the data *field*.\n * @param {boolean} [params.smooth=false] - A boolean flag indicating if dot density\n *   stacks should be smoothed to reduce variance.\n */ function DotBin(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nDotBin.Definition = {\n    \"type\": \"DotBin\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"smooth\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": Output\n        }\n    ]\n};\nconst autostep = (data, field)=>(0, _vegaUtil.span)((0, _vegaUtil.extent)(data, field)) / 30;\n(0, _vegaUtil.inherits)(DotBin, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !(_.modified() || pulse.changed())) return pulse; // early exit\n        const source2 = pulse.materialize(pulse.SOURCE).source, groups = partition$1(pulse.source, _.groupby, (0, _vegaUtil.identity)), smooth = _.smooth || false, field = _.field, step = _.step || autostep(source2, field), sort = (0, _vegaDataflow.stableCompare)((a, b)=>field(a) - field(b)), as = _.as || Output, n = groups.length; // compute dotplot bins per group\n        let min = Infinity, max = -Infinity, i = 0, j;\n        for(; i < n; ++i){\n            const g = groups[i].sort(sort);\n            j = -1;\n            for (const v of (0, _vegaStatistics.dotbin)(g, step, smooth, field)){\n                if (v < min) min = v;\n                if (v > max) max = v;\n                g[++j][as] = v;\n            }\n        }\n        this.value = {\n            start: min,\n            stop: max,\n            step: step\n        };\n        return pulse.reflow(true).modifies(as);\n    }\n});\n/**\n * Wraps an expression function with access to external parameters.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function} params.expr - The expression function. The\n *  function should accept both a datum and a parameter object.\n *  This operator's value will be a new function that wraps the\n *  expression function with access to this operator's parameters.\n */ function Expression(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$4, params);\n    this.modified(true);\n}\n(0, _vegaUtil.inherits)(Expression, (0, _vegaDataflow.Operator));\nfunction update$4(_) {\n    const expr = _.expr;\n    return this.value && !_.modified(\"expr\") ? this.value : (0, _vegaUtil.accessor)((datum)=>expr(datum, _), (0, _vegaUtil.accessorFields)(expr), (0, _vegaUtil.accessorName)(expr));\n}\n/**\n * Computes extents (min/max) for a data field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The field over which to compute extends.\n */ function Extent(params) {\n    (0, _vegaDataflow.Transform).call(this, [\n        undefined,\n        undefined\n    ], params);\n}\nExtent.Definition = {\n    \"type\": \"Extent\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Extent, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const extent = this.value, field = _.field, mod = pulse.changed() || pulse.modified(field.fields) || _.modified(\"field\");\n        let min = extent[0], max = extent[1];\n        if (mod || min == null) {\n            min = Infinity;\n            max = -Infinity;\n        }\n        pulse.visit(mod ? pulse.SOURCE : pulse.ADD, (t)=>{\n            const v = (0, _vegaUtil.toNumber)(field(t));\n            if (v != null) {\n                // NaNs will fail all comparisons!\n                if (v < min) min = v;\n                if (v > max) max = v;\n            }\n        });\n        if (!Number.isFinite(min) || !Number.isFinite(max)) {\n            let name = (0, _vegaUtil.accessorName)(field);\n            if (name) name = ` for field \"${name}\"`;\n            pulse.dataflow.warn(`Infinite extent${name}: [${min}, ${max}]`);\n            min = max = undefined;\n        }\n        this.value = [\n            min,\n            max\n        ];\n    }\n});\n/**\n * Provides a bridge between a parent transform and a target subflow that\n * consumes only a subset of the tuples that pass through the parent.\n * @constructor\n * @param {Pulse} pulse - A pulse to use as the value of this operator.\n * @param {Transform} parent - The parent transform (typically a Facet instance).\n */ function Subflow(pulse, parent) {\n    (0, _vegaDataflow.Operator).call(this, pulse);\n    this.parent = parent;\n    this.count = 0;\n}\n(0, _vegaUtil.inherits)(Subflow, (0, _vegaDataflow.Operator), {\n    /**\n   * Routes pulses from this subflow to a target transform.\n   * @param {Transform} target - A transform that receives the subflow of tuples.\n   */ connect (target) {\n        this.detachSubflow = target.detachSubflow;\n        this.targets().add(target);\n        return target.source = this;\n    },\n    /**\n   * Add an 'add' tuple to the subflow pulse.\n   * @param {Tuple} t - The tuple being added.\n   */ add (t) {\n        this.count += 1;\n        this.value.add.push(t);\n    },\n    /**\n   * Add a 'rem' tuple to the subflow pulse.\n   * @param {Tuple} t - The tuple being removed.\n   */ rem (t) {\n        this.count -= 1;\n        this.value.rem.push(t);\n    },\n    /**\n   * Add a 'mod' tuple to the subflow pulse.\n   * @param {Tuple} t - The tuple being modified.\n   */ mod (t) {\n        this.value.mod.push(t);\n    },\n    /**\n   * Re-initialize this operator's pulse value.\n   * @param {Pulse} pulse - The pulse to copy from.\n   * @see Pulse.init\n   */ init (pulse) {\n        this.value.init(pulse, pulse.NO_SOURCE);\n    },\n    /**\n   * Evaluate this operator. This method overrides the\n   * default behavior to simply return the contained pulse value.\n   * @return {Pulse}\n   */ evaluate () {\n        // assert: this.value.stamp === pulse.stamp\n        return this.value;\n    }\n});\n/**\n * Facets a dataflow into a set of subflows based on a key.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Dataflow, string): Operator} params.subflow - A function\n *   that generates a subflow of operators and returns its root operator.\n * @param {function(object): *} params.key - The key field to facet by.\n */ function Facet(params) {\n    (0, _vegaDataflow.Transform).call(this, {}, params);\n    this._keys = (0, _vegaUtil.fastmap)(); // cache previously calculated key values\n    // keep track of active subflows, use as targets array for listeners\n    // this allows us to limit propagation to only updated subflows\n    const a = this._targets = [];\n    a.active = 0;\n    a.forEach = (f)=>{\n        for(let i = 0, n = a.active; i < n; ++i)f(a[i], i, a);\n    };\n}\n(0, _vegaUtil.inherits)(Facet, (0, _vegaDataflow.Transform), {\n    activate (flow) {\n        this._targets[this._targets.active++] = flow;\n    },\n    // parent argument provided by PreFacet subclass\n    subflow (key, flow, pulse, parent) {\n        const flows = this.value;\n        let sf = (0, _vegaUtil.hasOwnProperty)(flows, key) && flows[key], df, p;\n        if (!sf) {\n            p = parent || (p = this._group[key]) && p.tuple;\n            df = pulse.dataflow;\n            sf = new Subflow(pulse.fork(pulse.NO_SOURCE), this);\n            df.add(sf).connect(flow(df, key, p));\n            flows[key] = sf;\n            this.activate(sf);\n        } else if (sf.value.stamp < pulse.stamp) {\n            sf.init(pulse);\n            this.activate(sf);\n        }\n        return sf;\n    },\n    clean () {\n        const flows = this.value;\n        let detached = 0;\n        for(const key in flows)if (flows[key].count === 0) {\n            const detach = flows[key].detachSubflow;\n            if (detach) detach();\n            delete flows[key];\n            ++detached;\n        }\n         // remove inactive targets from the active targets array\n        if (detached) {\n            const active = this._targets.filter((sf)=>sf && sf.count > 0);\n            this.initTargets(active);\n        }\n    },\n    initTargets (act) {\n        const a = this._targets, n = a.length, m = act ? act.length : 0;\n        let i = 0;\n        for(; i < m; ++i)a[i] = act[i];\n        for(; i < n && a[i] != null; ++i)a[i] = null; // ensure old flows can be garbage collected\n        a.active = m;\n    },\n    transform (_, pulse) {\n        const df = pulse.dataflow, key1 = _.key, flow = _.subflow, cache = this._keys, rekey = _.modified(\"key\"), subflow = (key)=>this.subflow(key, flow, pulse);\n        this._group = _.group || {};\n        this.initTargets(); // reset list of active subflows\n        pulse.visit(pulse.REM, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t), k = cache.get(id);\n            if (k !== undefined) {\n                cache.delete(id);\n                subflow(k).rem(t);\n            }\n        });\n        pulse.visit(pulse.ADD, (t)=>{\n            const k = key1(t);\n            cache.set((0, _vegaDataflow.tupleid)(t), k);\n            subflow(k).add(t);\n        });\n        if (rekey || pulse.modified(key1.fields)) pulse.visit(pulse.MOD, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t), k0 = cache.get(id), k1 = key1(t);\n            if (k0 === k1) subflow(k1).mod(t);\n            else {\n                cache.set(id, k1);\n                subflow(k0).rem(t);\n                subflow(k1).add(t);\n            }\n        });\n        else if (pulse.changed(pulse.MOD)) pulse.visit(pulse.MOD, (t)=>{\n            subflow(cache.get((0, _vegaDataflow.tupleid)(t))).mod(t);\n        });\n        if (rekey) pulse.visit(pulse.REFLOW, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t), k0 = cache.get(id), k1 = key1(t);\n            if (k0 !== k1) {\n                cache.set(id, k1);\n                subflow(k0).rem(t);\n                subflow(k1).add(t);\n            }\n        });\n        if (pulse.clean()) df.runAfter(()=>{\n            this.clean();\n            cache.clean();\n        });\n        else if (cache.empty > df.cleanThreshold) df.runAfter(cache.clean);\n        return pulse;\n    }\n});\n/**\n * Generates one or more field accessor functions.\n * If the 'name' parameter is an array, an array of field accessors\n * will be created and the 'as' parameter will be ignored.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.name - The field name(s) to access.\n * @param {string} params.as - The accessor function name.\n */ function Field(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$3, params);\n}\n(0, _vegaUtil.inherits)(Field, (0, _vegaDataflow.Operator));\nfunction update$3(_) {\n    return this.value && !_.modified() ? this.value : (0, _vegaUtil.isArray)(_.name) ? (0, _vegaUtil.array)(_.name).map((f)=>(0, _vegaUtil.field)(f)) : (0, _vegaUtil.field)(_.name, _.as);\n}\n/**\n * Filters data tuples according to a predicate function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.expr - The predicate expression function\n *   that determines a tuple's filter status. Truthy values pass the filter.\n */ function Filter(params) {\n    (0, _vegaDataflow.Transform).call(this, (0, _vegaUtil.fastmap)(), params);\n}\nFilter.Definition = {\n    \"type\": \"Filter\",\n    \"metadata\": {\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"expr\",\n            \"type\": \"expr\",\n            \"required\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Filter, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const df = pulse.dataflow, cache = this.value, // cache ids of filtered tuples\n        output1 = pulse.fork(), add4 = output1.add, rem4 = output1.rem, mod = output1.mod, test = _.expr;\n        let isMod = true;\n        pulse.visit(pulse.REM, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t);\n            if (!cache.has(id)) rem4.push(t);\n            else cache.delete(id);\n        });\n        pulse.visit(pulse.ADD, (t)=>{\n            if (test(t, _)) add4.push(t);\n            else cache.set((0, _vegaDataflow.tupleid)(t), 1);\n        });\n        function revisit(t) {\n            const id = (0, _vegaDataflow.tupleid)(t), b = test(t, _), s = cache.get(id);\n            if (b && s) {\n                cache.delete(id);\n                add4.push(t);\n            } else if (!b && !s) {\n                cache.set(id, 1);\n                rem4.push(t);\n            } else if (isMod && b && !s) mod.push(t);\n        }\n        pulse.visit(pulse.MOD, revisit);\n        if (_.modified()) {\n            isMod = false;\n            pulse.visit(pulse.REFLOW, revisit);\n        }\n        if (cache.empty > df.cleanThreshold) df.runAfter(cache.clean);\n        return output1;\n    }\n});\n/**\n * Flattens array-typed field values into new data objects.\n * If multiple fields are specified, they are treated as parallel arrays,\n * with output values included for each matching index (or null if missing).\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.fields - An array of field\n *   accessors for the tuple fields that should be flattened.\n * @param {string} [params.index] - Optional output field name for index\n *   value. If unspecified, no index field is included in the output.\n * @param {Array<string>} [params.as] - Output field names for flattened\n *   array fields. Any unspecified fields will use the field name provided\n *   by the fields accessors.\n */ function Flatten(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nFlatten.Definition = {\n    \"type\": \"Flatten\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true\n        },\n        {\n            \"name\": \"index\",\n            \"type\": \"string\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Flatten, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), fields = _.fields, as = fieldNames(fields, _.as || []), index = _.index || null, m = as.length; // remove any previous results\n        out.rem = this.value; // generate flattened tuples\n        pulse.visit(pulse.SOURCE, (t)=>{\n            const arrays = fields.map((f)=>f(t)), maxlen = arrays.reduce((l, a)=>Math.max(l, a.length), 0);\n            let i = 0, j, d, v;\n            for(; i < maxlen; ++i){\n                d = (0, _vegaDataflow.derive)(t);\n                for(j = 0; j < m; ++j)d[as[j]] = (v = arrays[j][i]) == null ? null : v;\n                if (index) d[index] = i;\n                out.add.push(d);\n            }\n        });\n        this.value = out.source = out.add;\n        if (index) out.modifies(index);\n        return out.modifies(as);\n    }\n});\n/**\n * Folds one more tuple fields into multiple tuples in which the field\n * name and values are available under new 'key' and 'value' fields.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.fields - An array of field accessors\n *   for the tuple fields that should be folded.\n * @param {Array<string>} [params.as] - Output field names for folded key\n *   and value fields, defaults to ['key', 'value'].\n */ function Fold(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nFold.Definition = {\n    \"type\": \"Fold\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"key\",\n                \"value\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Fold, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), fields = _.fields, fnames = fields.map((0, _vegaUtil.accessorName)), as = _.as || [\n            \"key\",\n            \"value\"\n        ], k = as[0], v = as[1], n = fields.length;\n        out.rem = this.value;\n        pulse.visit(pulse.SOURCE, (t)=>{\n            for(let i = 0, d; i < n; ++i){\n                d = (0, _vegaDataflow.derive)(t);\n                d[k] = fnames[i];\n                d[v] = fields[i](t);\n                out.add.push(d);\n            }\n        });\n        this.value = out.source = out.add;\n        return out.modifies(as);\n    }\n});\n/**\n * Invokes a function for each data tuple and saves the results as a new field.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.expr - The formula function to invoke for each tuple.\n * @param {string} params.as - The field name under which to save the result.\n * @param {boolean} [params.initonly=false] - If true, the formula is applied to\n *   added tuples only, and does not update in response to modifications.\n */ function Formula(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nFormula.Definition = {\n    \"type\": \"Formula\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"expr\",\n            \"type\": \"expr\",\n            \"required\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"required\": true\n        },\n        {\n            \"name\": \"initonly\",\n            \"type\": \"boolean\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Formula, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const func = _.expr, as = _.as, mod = _.modified(), flag = _.initonly ? pulse.ADD : mod ? pulse.SOURCE : pulse.modified(func.fields) || pulse.modified(as) ? pulse.ADD_MOD : pulse.ADD;\n        if (mod) // parameters updated, need to reflow\n        pulse = pulse.materialize().reflow(true);\n        if (!_.initonly) pulse.modifies(as);\n        return pulse.visit(flag, (t)=>t[as] = func(t, _));\n    }\n});\n/**\n * Generates data tuples using a provided generator function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Parameters): object} params.generator - A tuple generator\n *   function. This function is given the operator parameters as input.\n *   Changes to any additional parameters will not trigger re-calculation\n *   of previously generated tuples. Only future tuples are affected.\n * @param {number} params.size - The number of tuples to produce.\n */ function Generate(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\n(0, _vegaUtil.inherits)(Generate, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.ALL), gen = _.generator;\n        let data = this.value, num = _.size - data.length, add5, rem5, t;\n        if (num > 0) {\n            // need more tuples, generate and add\n            for(add5 = []; --num >= 0;){\n                add5.push(t = (0, _vegaDataflow.ingest)(gen(_)));\n                data.push(t);\n            }\n            out.add = out.add.length ? out.materialize(out.ADD).add.concat(add5) : add5;\n        } else {\n            // need fewer tuples, remove\n            rem5 = data.slice(0, -num);\n            out.rem = out.rem.length ? out.materialize(out.REM).rem.concat(rem5) : rem5;\n            data = data.slice(-num);\n        }\n        out.source = this.value = data;\n        return out;\n    }\n});\nconst Methods = {\n    value: \"value\",\n    median: (0, _d3Array.median),\n    mean: (0, _d3Array.mean),\n    min: (0, _d3Array.min),\n    max: (0, _d3Array.max)\n};\nconst Empty = [];\n/**\n * Impute missing values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to impute.\n * @param {Array<function(object): *>} [params.groupby] - An array of\n *   accessors to determine series within which to perform imputation.\n * @param {function(object): *} params.key - An accessor for a key value.\n *   Each key value should be unique within a group. New tuples will be\n *   imputed for any key values that are not found within a group.\n * @param {Array<*>} [params.keyvals] - Optional array of required key\n *   values. New tuples will be imputed for any key values that are not\n *   found within a group. In addition, these values will be automatically\n *   augmented with the key values observed in the input data.\n * @param {string} [method='value'] - The imputation method to use. One of\n *   'value', 'mean', 'median', 'max', 'min'.\n * @param {*} [value=0] - The constant value to use for imputation\n *   when using method 'value'.\n */ function Impute(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nImpute.Definition = {\n    \"type\": \"Impute\",\n    \"metadata\": {\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"key\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"keyvals\",\n            \"array\": true\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"enum\",\n            \"default\": \"value\",\n            \"values\": [\n                \"value\",\n                \"mean\",\n                \"median\",\n                \"max\",\n                \"min\"\n            ]\n        },\n        {\n            \"name\": \"value\",\n            \"default\": 0\n        }\n    ]\n};\nfunction getValue(_) {\n    var m = _.method || Methods.value, v;\n    if (Methods[m] == null) (0, _vegaUtil.error)(\"Unrecognized imputation method: \" + m);\n    else if (m === Methods.value) {\n        v = _.value !== undefined ? _.value : 0;\n        return ()=>v;\n    } else return Methods[m];\n}\nfunction getField(_) {\n    const f = _.field;\n    return (t)=>t ? f(t) : NaN;\n}\n(0, _vegaUtil.inherits)(Impute, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var out = pulse.fork(pulse.ALL), impute = getValue(_), field = getField(_), fName = (0, _vegaUtil.accessorName)(_.field), kName = (0, _vegaUtil.accessorName)(_.key), gNames = (_.groupby || []).map((0, _vegaUtil.accessorName)), groups = partition(pulse.source, _.groupby, _.key, _.keyvals), curr = [], prev = this.value, m = groups.domain.length, group, value, gVals, kVal, g, i, j, l, n, t;\n        for(g = 0, l = groups.length; g < l; ++g){\n            group = groups[g];\n            gVals = group.values;\n            value = NaN; // add tuples for missing values\n            for(j = 0; j < m; ++j){\n                if (group[j] != null) continue;\n                kVal = groups.domain[j];\n                t = {\n                    _impute: true\n                };\n                for(i = 0, n = gVals.length; i < n; ++i)t[gNames[i]] = gVals[i];\n                t[kName] = kVal;\n                t[fName] = Number.isNaN(value) ? value = impute(group, field) : value;\n                curr.push((0, _vegaDataflow.ingest)(t));\n            }\n        } // update pulse with imputed tuples\n        if (curr.length) out.add = out.materialize(out.ADD).add.concat(curr);\n        if (prev.length) out.rem = out.materialize(out.REM).rem.concat(prev);\n        this.value = curr;\n        return out;\n    }\n});\nfunction partition(data, groupby, key, keyvals) {\n    var get18 = (f)=>f(t), groups = [], domain = keyvals ? keyvals.slice() : [], kMap = {}, gMap = {}, gVals, gKey, group, i2, j, k2, n, t;\n    domain.forEach((k, i)=>kMap[k] = i + 1);\n    for(i2 = 0, n = data.length; i2 < n; ++i2){\n        t = data[i2];\n        k2 = key(t);\n        j = kMap[k2] || (kMap[k2] = domain.push(k2));\n        gKey = (gVals = groupby ? groupby.map(get18) : Empty) + \"\";\n        if (!(group = gMap[gKey])) {\n            group = gMap[gKey] = [];\n            groups.push(group);\n            group.values = gVals;\n        }\n        group[j - 1] = t;\n    }\n    groups.domain = domain;\n    return groups;\n}\n/**\n * Extend input tuples with aggregate values.\n * Calcuates aggregate values and joins them with the input stream.\n * @constructor\n */ function JoinAggregate(params) {\n    Aggregate.call(this, params);\n}\nJoinAggregate.Definition = {\n    \"type\": \"JoinAggregate\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"ops\",\n            \"type\": \"enum\",\n            \"array\": true,\n            \"values\": ValidAggregateOps\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"key\",\n            \"type\": \"field\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(JoinAggregate, Aggregate, {\n    transform (_, pulse) {\n        const aggr = this, mod = _.modified();\n        let cells; // process all input tuples to calculate aggregates\n        if (aggr.value && (mod || pulse.modified(aggr._inputs, true))) {\n            cells = aggr.value = mod ? aggr.init(_) : {};\n            pulse.visit(pulse.SOURCE, (t)=>aggr.add(t));\n        } else {\n            cells = aggr.value = aggr.value || this.init(_);\n            pulse.visit(pulse.REM, (t)=>aggr.rem(t));\n            pulse.visit(pulse.ADD, (t)=>aggr.add(t));\n        } // update aggregation cells\n        aggr.changes(); // write aggregate values to input tuples\n        pulse.visit(pulse.SOURCE, (t)=>{\n            (0, _vegaUtil.extend)(t, cells[aggr.cellkey(t)].tuple);\n        });\n        return pulse.reflow(mod).modifies(this._outputs);\n    },\n    changes () {\n        const adds = this._adds, mods = this._mods;\n        let i, n;\n        for(i = 0, n = this._alen; i < n; ++i){\n            this.celltuple(adds[i]);\n            adds[i] = null; // for garbage collection\n        }\n        for(i = 0, n = this._mlen; i < n; ++i){\n            this.celltuple(mods[i]);\n            mods[i] = null; // for garbage collection\n        }\n        this._alen = this._mlen = 0; // reset list of active cells\n    }\n});\n/**\n * Compute kernel density estimates (KDE) for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {function(object): *} params.field - An accessor for the data field\n *   to estimate.\n * @param {number} [params.bandwidth=0] - The KDE kernel bandwidth.\n *   If zero or unspecified, the bandwidth is automatically determined.\n * @param {boolean} [params.counts=false] - A boolean flag indicating if the\n *   output values should be probability estimates (false, default) or\n *   smoothed counts (true).\n * @param {string} [params.cumulative=false] - A boolean flag indicating if a\n *   density (false) or cumulative distribution (true) should be generated.\n * @param {Array<number>} [params.extent] - The domain extent over which to\n *   plot the density. If unspecified, the [min, max] data extent is used.\n * @param {string} [params.resolve='independent'] - Indicates how parameters for\n *   multiple densities should be resolved. If \"independent\" (the default), each\n *   density may have its own domain extent and dynamic number of curve sample\n *   steps. If \"shared\", the KDE transform will ensure that all densities are\n *   defined over a shared domain and curve steps, enabling stacking.\n * @param {number} [params.minsteps=25] - The minimum number of curve samples\n *   for plotting the density.\n * @param {number} [params.maxsteps=200] - The maximum number of curve samples\n *   for plotting the density.\n * @param {number} [params.steps] - The exact number of curve samples for\n *   plotting the density. If specified, overrides both minsteps and maxsteps\n *   to set an exact number of uniform samples. Useful in conjunction with\n *   a fixed extent to ensure consistent sample points for stacked densities.\n */ function KDE(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nKDE.Definition = {\n    \"type\": \"KDE\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"cumulative\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"counts\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"bandwidth\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"resolve\",\n            \"type\": \"enum\",\n            \"values\": [\n                \"shared\",\n                \"independent\"\n            ],\n            \"default\": \"independent\"\n        },\n        {\n            \"name\": \"steps\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"minsteps\",\n            \"type\": \"number\",\n            \"default\": 25\n        },\n        {\n            \"name\": \"maxsteps\",\n            \"type\": \"number\",\n            \"default\": 200\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"default\": [\n                \"value\",\n                \"density\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(KDE, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        if (!this.value || pulse.changed() || _.modified()) {\n            const source3 = pulse.materialize(pulse.SOURCE).source, groups = partition$1(source3, _.groupby, _.field), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), bandwidth = _.bandwidth, method = _.cumulative ? \"cdf\" : \"pdf\", as = _.as || [\n                \"value\",\n                \"density\"\n            ], values = [];\n            let domain = _.extent, minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n            if (method !== \"pdf\" && method !== \"cdf\") (0, _vegaUtil.error)(\"Invalid density method: \" + method);\n            if (_.resolve === \"shared\") {\n                if (!domain) domain = (0, _vegaUtil.extent)(source3, _.field);\n                minsteps = maxsteps = _.steps || maxsteps;\n            }\n            groups.forEach((g)=>{\n                const density = (0, _vegaStatistics.randomKDE)(g, bandwidth)[method], scale = _.counts ? g.length : 1, local = domain || (0, _vegaUtil.extent)(g);\n                (0, _vegaStatistics.sampleCurve)(density, local, minsteps, maxsteps).forEach((v)=>{\n                    const t = {};\n                    for(let i = 0; i < names.length; ++i)t[names[i]] = g.dims[i];\n                    t[as[0]] = v[0];\n                    t[as[1]] = v[1] * scale;\n                    values.push((0, _vegaDataflow.ingest)(t));\n                });\n            });\n            if (this.value) out.rem = this.value;\n            this.value = out.add = out.source = values;\n        }\n        return out;\n    }\n});\n/**\n * Generates a key function.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<string>} params.fields - The field name(s) for the key function.\n * @param {boolean} params.flat - A boolean flag indicating if the field names\n *  should be treated as flat property names, side-stepping nested field\n *  lookups normally indicated by dot or bracket notation.\n */ function Key(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$2, params);\n}\n(0, _vegaUtil.inherits)(Key, (0, _vegaDataflow.Operator));\nfunction update$2(_) {\n    return this.value && !_.modified() ? this.value : (0, _vegaUtil.key)(_.fields, _.flat);\n}\n/**\n * Load and parse data from an external source. Marshalls parameter\n * values and then invokes the Dataflow request method.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.url - The URL to load from.\n * @param {object} params.format - The data format options.\n */ function Load(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n    this._pending = null;\n}\n(0, _vegaUtil.inherits)(Load, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const df1 = pulse.dataflow;\n        if (this._pending) // update state and return pulse\n        return output(this, pulse, this._pending);\n        if (stop(_)) return pulse.StopPropagation;\n        if (_.values) // parse and ingest values, return output pulse\n        return output(this, pulse, df1.parse(_.values, _.format));\n        else if (_.async) {\n            // return promise for non-blocking async loading\n            const p = df1.request(_.url, _.format).then((res)=>{\n                this._pending = (0, _vegaUtil.array)(res.data);\n                return (df)=>df.touch(this);\n            });\n            return {\n                async: p\n            };\n        } else // return promise for synchronous loading\n        return df1.request(_.url, _.format).then((res)=>output(this, pulse, (0, _vegaUtil.array)(res.data)));\n    }\n});\nfunction stop(_) {\n    return _.modified(\"async\") && !(_.modified(\"values\") || _.modified(\"url\") || _.modified(\"format\"));\n}\nfunction output(op, pulse, data) {\n    data.forEach((0, _vegaDataflow.ingest));\n    const out = pulse.fork(pulse.NO_FIELDS & pulse.NO_SOURCE);\n    out.rem = op.value;\n    op.value = out.source = out.add = data;\n    op._pending = null;\n    if (out.rem.length) out.clean(true);\n    return out;\n}\n/**\n * Extend tuples by joining them with values from a lookup table.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Map} params.index - The lookup table map.\n * @param {Array<function(object): *} params.fields - The fields to lookup.\n * @param {Array<string>} params.as - Output field names for each lookup value.\n * @param {*} [params.default] - A default value to use if lookup fails.\n */ function Lookup(params) {\n    (0, _vegaDataflow.Transform).call(this, {}, params);\n}\nLookup.Definition = {\n    \"type\": \"Lookup\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"index\",\n            \"type\": \"index\",\n            \"params\": [\n                {\n                    \"name\": \"from\",\n                    \"type\": \"data\",\n                    \"required\": true\n                },\n                {\n                    \"name\": \"key\",\n                    \"type\": \"field\",\n                    \"required\": true\n                }\n            ]\n        },\n        {\n            \"name\": \"values\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true\n        },\n        {\n            \"name\": \"default\",\n            \"default\": null\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Lookup, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const keys = _.fields, index = _.index, values = _.values, defaultValue = _.default == null ? null : _.default, reset = _.modified(), n = keys.length;\n        let flag = reset ? pulse.SOURCE : pulse.ADD, out = pulse, as = _.as, set1, m, mods;\n        if (values) {\n            m = values.length;\n            if (n > 1 && !as) (0, _vegaUtil.error)('Multi-field lookup requires explicit \"as\" parameter.');\n            if (as && as.length !== n * m) (0, _vegaUtil.error)('The \"as\" parameter has too few output field names.');\n            as = as || values.map((0, _vegaUtil.accessorName));\n            set1 = function(t) {\n                for(var i = 0, k = 0, j, v; i < n; ++i){\n                    v = index.get(keys[i](t));\n                    if (v == null) for(j = 0; j < m; ++j, ++k)t[as[k]] = defaultValue;\n                    else for(j = 0; j < m; ++j, ++k)t[as[k]] = values[j](v);\n                }\n            };\n        } else {\n            if (!as) (0, _vegaUtil.error)(\"Missing output field names.\");\n            set1 = function(t) {\n                for(var i = 0, v; i < n; ++i){\n                    v = index.get(keys[i](t));\n                    t[as[i]] = v == null ? defaultValue : v;\n                }\n            };\n        }\n        if (reset) out = pulse.reflow(true);\n        else {\n            mods = keys.some((k)=>pulse.modified(k.fields));\n            flag |= mods ? pulse.MOD : 0;\n        }\n        pulse.visit(flag, set1);\n        return out.modifies(as);\n    }\n});\n/**\n * Computes global min/max extents over a collection of extents.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<Array<number>>} params.extents - The input extents.\n */ function MultiExtent(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update$1, params);\n}\n(0, _vegaUtil.inherits)(MultiExtent, (0, _vegaDataflow.Operator));\nfunction update$1(_) {\n    if (this.value && !_.modified()) return this.value;\n    const ext = _.extents, n = ext.length;\n    let min = Infinity, max = -Infinity, i, e;\n    for(i = 0; i < n; ++i){\n        e = ext[i];\n        if (e[0] < min) min = e[0];\n        if (e[1] > max) max = e[1];\n    }\n    return [\n        min,\n        max\n    ];\n}\n/**\n * Merge a collection of value arrays.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<Array<*>>} params.values - The input value arrrays.\n */ function MultiValues(params) {\n    (0, _vegaDataflow.Operator).call(this, null, update, params);\n}\n(0, _vegaUtil.inherits)(MultiValues, (0, _vegaDataflow.Operator));\nfunction update(_1) {\n    return this.value && !_1.modified() ? this.value : _1.values.reduce((data, _)=>data.concat(_), []);\n}\n/**\n * Operator whose value is simply its parameter hash. This operator is\n * useful for enabling reactive updates to values of nested objects.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function Params(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Params, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        this.modified(_.modified());\n        this.value = _;\n        return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS); // do not pass tuples\n    }\n});\n/**\n * Aggregate and pivot selected field values to become new fields.\n * This operator is useful to construction cross-tabulations.\n * @constructor\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *  to groupby. These fields act just like groupby fields of an Aggregate transform.\n * @param {function(object): *} params.field - The field to pivot on. The unique\n *  values of this field become new field names in the output stream.\n * @param {function(object): *} params.value - The field to populate pivoted fields.\n *  The aggregate values of this field become the values of the new pivoted fields.\n * @param {string} [params.op] - The aggregation operation for the value field,\n *  applied per cell in the output stream. The default is \"sum\".\n * @param {number} [params.limit] - An optional parameter indicating the maximum\n *  number of pivoted fields to generate. The pivoted field names are sorted in\n *  ascending order prior to enforcing the limit.\n */ function Pivot(params) {\n    Aggregate.call(this, params);\n}\nPivot.Definition = {\n    \"type\": \"Pivot\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"value\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"op\",\n            \"type\": \"enum\",\n            \"values\": ValidAggregateOps,\n            \"default\": \"sum\"\n        },\n        {\n            \"name\": \"limit\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"key\",\n            \"type\": \"field\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Pivot, Aggregate, {\n    _transform: Aggregate.prototype.transform,\n    transform (_, pulse) {\n        return this._transform(aggregateParams(_, pulse), pulse);\n    }\n}); // Shoehorn a pivot transform into an aggregate transform!\n// First collect all unique pivot field values.\n// Then generate aggregate fields for each output pivot field.\nfunction aggregateParams(_, pulse) {\n    const key = _.field, value = _.value, op = (_.op === \"count\" ? \"__count__\" : _.op) || \"sum\", fields = (0, _vegaUtil.accessorFields)(key).concat((0, _vegaUtil.accessorFields)(value)), keys = pivotKeys(key, _.limit || 0, pulse); // if data stream content changes, pivot fields may change\n    // flag parameter modification to ensure re-initialization\n    if (pulse.changed()) _.set(\"__pivot__\", null, null, true);\n    return {\n        key: _.key,\n        groupby: _.groupby,\n        ops: keys.map(()=>op),\n        fields: keys.map((k)=>get(k, key, value, fields)),\n        as: keys.map((k)=>k + \"\"),\n        modified: _.modified.bind(_)\n    };\n} // Generate aggregate field accessor.\n// Output NaN for non-existent values; aggregator will ignore!\nfunction get(k, key, value, fields) {\n    return (0, _vegaUtil.accessor)((d)=>key(d) === k ? value(d) : NaN, fields, k + \"\");\n} // Collect (and optionally limit) all unique pivot values.\nfunction pivotKeys(key, limit, pulse) {\n    const map = {}, list = [];\n    pulse.visit(pulse.SOURCE, (t)=>{\n        const k = key(t);\n        if (!map[k]) {\n            map[k] = 1;\n            list.push(k);\n        }\n    });\n    list.sort((0, _vegaUtil.ascending));\n    return limit ? list.slice(0, limit) : list;\n}\n/**\n * Partitions pre-faceted data into tuple subflows.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(Dataflow, string): Operator} params.subflow - A function\n *   that generates a subflow of operators and returns its root operator.\n * @param {function(object): Array<object>} params.field - The field\n *   accessor for an array of subflow tuple objects.\n */ function PreFacet(params) {\n    Facet.call(this, params);\n}\n(0, _vegaUtil.inherits)(PreFacet, Facet, {\n    transform (_2, pulse) {\n        const flow = _2.subflow, field = _2.field, subflow = (t)=>this.subflow((0, _vegaDataflow.tupleid)(t), flow, pulse, t);\n        if (_2.modified(\"field\") || field && pulse.modified((0, _vegaUtil.accessorFields)(field))) (0, _vegaUtil.error)(\"PreFacet does not support field modification.\");\n        this.initTargets(); // reset list of active subflows\n        if (field) {\n            pulse.visit(pulse.MOD, (t)=>{\n                const sf = subflow(t);\n                field(t).forEach((_)=>sf.mod(_));\n            });\n            pulse.visit(pulse.ADD, (t)=>{\n                const sf = subflow(t);\n                field(t).forEach((_)=>sf.add((0, _vegaDataflow.ingest)(_)));\n            });\n            pulse.visit(pulse.REM, (t)=>{\n                const sf = subflow(t);\n                field(t).forEach((_)=>sf.rem(_));\n            });\n        } else {\n            pulse.visit(pulse.MOD, (t)=>subflow(t).mod(t));\n            pulse.visit(pulse.ADD, (t)=>subflow(t).add(t));\n            pulse.visit(pulse.REM, (t)=>subflow(t).rem(t));\n        }\n        if (pulse.clean()) pulse.runAfter(()=>this.clean());\n        return pulse;\n    }\n});\n/**\n * Performs a relational projection, copying selected fields from source\n * tuples to a new set of derived tuples.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *} params.fields - The fields to project,\n *   as an array of field accessors. If unspecified, all fields will be\n *   copied with names unchanged.\n * @param {Array<string>} [params.as] - Output field names for each projected\n *   field. Any unspecified fields will use the field name provided by\n *   the field accessor.\n */ function Project(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nProject.Definition = {\n    \"type\": \"Project\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"array\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Project, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), fields = _.fields, as = fieldNames(_.fields, _.as || []), derive = fields ? (s, t)=>project(s, t, fields, as) : (0, _vegaDataflow.rederive);\n        let lut;\n        if (this.value) lut = this.value;\n        else {\n            pulse = pulse.addAll();\n            lut = this.value = {};\n        }\n        pulse.visit(pulse.REM, (t)=>{\n            const id = (0, _vegaDataflow.tupleid)(t);\n            out.rem.push(lut[id]);\n            lut[id] = null;\n        });\n        pulse.visit(pulse.ADD, (t)=>{\n            const dt = derive(t, (0, _vegaDataflow.ingest)({}));\n            lut[(0, _vegaDataflow.tupleid)(t)] = dt;\n            out.add.push(dt);\n        });\n        pulse.visit(pulse.MOD, (t)=>{\n            out.mod.push(derive(t, lut[(0, _vegaDataflow.tupleid)(t)]));\n        });\n        return out;\n    }\n});\nfunction project(s, t, fields, as) {\n    for(let i = 0, n = fields.length; i < n; ++i)t[as[i]] = fields[i](s);\n    return t;\n}\n/**\n * Proxy the value of another operator as a pure signal value.\n * Ensures no tuples are propagated.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {*} params.value - The value to proxy, becomes the value of this operator.\n */ function Proxy(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Proxy, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        this.value = _.value;\n        return _.modified(\"value\") ? pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS) : pulse.StopPropagation;\n    }\n});\n/**\n * Generates sample quantile values from an input data stream.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - An accessor for the data field\n *   over which to calculate quantile values.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {Array<number>} [params.probs] - An array of probabilities in\n *   the range (0, 1) for which to compute quantile values. If not specified,\n *   the *step* parameter will be used.\n * @param {Array<number>} [params.step=0.01] - A probability step size for\n *   sampling quantile values. All values from one-half the step size up to\n *   1 (exclusive) will be sampled. This parameter is only used if the\n *   *quantiles* parameter is not provided.\n */ function Quantile(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nQuantile.Definition = {\n    \"type\": \"Quantile\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"probs\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\",\n            \"default\": 0.01\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"default\": [\n                \"prob\",\n                \"value\"\n            ]\n        }\n    ]\n};\nconst EPSILON = 1e-14;\n(0, _vegaUtil.inherits)(Quantile, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), as = _.as || [\n            \"prob\",\n            \"value\"\n        ];\n        if (this.value && !_.modified() && !pulse.changed()) {\n            out.source = this.value;\n            return out;\n        }\n        const source4 = pulse.materialize(pulse.SOURCE).source, groups = partition$1(source4, _.groupby, _.field), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), values = [], step = _.step || 0.01, p = _.probs || (0, _d3Array.range)(step / 2, 1 - EPSILON, step), n = p.length;\n        groups.forEach((g)=>{\n            const q = (0, _vegaStatistics.quantiles)(g, p);\n            for(let i = 0; i < n; ++i){\n                const t = {};\n                for(let i3 = 0; i3 < names.length; ++i3)t[names[i3]] = g.dims[i3];\n                t[as[0]] = p[i];\n                t[as[1]] = q[i];\n                values.push((0, _vegaDataflow.ingest)(t));\n            }\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values;\n        return out;\n    }\n});\n/**\n * Relays a data stream between data processing pipelines.\n * If the derive parameter is set, this transform will create derived\n * copies of observed tuples. This provides derived data streams in which\n * modifications to the tuples do not pollute an upstream data source.\n * @param {object} params - The parameters for this operator.\n * @param {number} [params.derive=false] - Boolean flag indicating if\n *   the transform should make derived copies of incoming tuples.\n * @constructor\n */ function Relay(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Relay, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        let out, lut;\n        if (this.value) lut = this.value;\n        else {\n            out = pulse = pulse.addAll();\n            lut = this.value = {};\n        }\n        if (_.derive) {\n            out = pulse.fork(pulse.NO_SOURCE);\n            pulse.visit(pulse.REM, (t)=>{\n                const id = (0, _vegaDataflow.tupleid)(t);\n                out.rem.push(lut[id]);\n                lut[id] = null;\n            });\n            pulse.visit(pulse.ADD, (t)=>{\n                const dt = (0, _vegaDataflow.derive)(t);\n                lut[(0, _vegaDataflow.tupleid)(t)] = dt;\n                out.add.push(dt);\n            });\n            pulse.visit(pulse.MOD, (t)=>{\n                const dt = lut[(0, _vegaDataflow.tupleid)(t)];\n                for(const k in t){\n                    dt[k] = t[k]; // down stream writes may overwrite re-derived tuples\n                    // conservatively mark all source fields as modified\n                    out.modifies(k);\n                }\n                out.mod.push(dt);\n            });\n        }\n        return out;\n    }\n});\n/**\n * Samples tuples passing through this operator.\n * Uses reservoir sampling to maintain a representative sample.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {number} [params.size=1000] - The maximum number of samples.\n */ function Sample(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n    this.count = 0;\n}\nSample.Definition = {\n    \"type\": \"Sample\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"default\": 1000\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Sample, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE), mod = _.modified(\"size\"), num = _.size, map = this.value.reduce((m, t)=>(m[(0, _vegaDataflow.tupleid)(t)] = 1, m), {});\n        let res = this.value, cnt = this.count, cap = 0; // sample reservoir update function\n        function update2(t) {\n            let p, idx;\n            if (res.length < num) res.push(t);\n            else {\n                idx = ~~((cnt + 1) * (0, _vegaStatistics.random)());\n                if (idx < res.length && idx >= cap) {\n                    p = res[idx];\n                    if (map[(0, _vegaDataflow.tupleid)(p)]) out.rem.push(p); // eviction\n                    res[idx] = t;\n                }\n            }\n            ++cnt;\n        }\n        if (pulse.rem.length) {\n            // find all tuples that should be removed, add to output\n            pulse.visit(pulse.REM, (t)=>{\n                const id = (0, _vegaDataflow.tupleid)(t);\n                if (map[id]) {\n                    map[id] = -1;\n                    out.rem.push(t);\n                }\n                --cnt;\n            }); // filter removed tuples out of the sample reservoir\n            res = res.filter((t)=>map[(0, _vegaDataflow.tupleid)(t)] !== -1);\n        }\n        if ((pulse.rem.length || mod) && res.length < num && pulse.source) {\n            // replenish sample if backing data source is available\n            cap = cnt = res.length;\n            pulse.visit(pulse.SOURCE, (t)=>{\n                // update, but skip previously sampled tuples\n                if (!map[(0, _vegaDataflow.tupleid)(t)]) update2(t);\n            });\n            cap = -1;\n        }\n        if (mod && res.length > num) {\n            const n = res.length - num;\n            for(let i = 0; i < n; ++i){\n                map[(0, _vegaDataflow.tupleid)(res[i])] = -1;\n                out.rem.push(res[i]);\n            }\n            res = res.slice(n);\n        }\n        if (pulse.mod.length) // propagate modified tuples in the sample reservoir\n        pulse.visit(pulse.MOD, (t)=>{\n            if (map[(0, _vegaDataflow.tupleid)(t)]) out.mod.push(t);\n        });\n        if (pulse.add.length) // update sample reservoir\n        pulse.visit(pulse.ADD, update2);\n        if (pulse.add.length || cap < 0) // output newly added tuples\n        out.add = res.filter((t)=>!map[(0, _vegaDataflow.tupleid)(t)]);\n        this.count = cnt;\n        this.value = out.source = res;\n        return out;\n    }\n});\n/**\n * Generates data tuples for a specified sequence range of numbers.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {number} params.start - The first number in the sequence.\n * @param {number} params.stop - The last number (exclusive) in the sequence.\n * @param {number} [params.step=1] - The step size between numbers in the sequence.\n */ function Sequence(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nSequence.Definition = {\n    \"type\": \"Sequence\",\n    \"metadata\": {\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"start\",\n            \"type\": \"number\",\n            \"required\": true\n        },\n        {\n            \"name\": \"stop\",\n            \"type\": \"number\",\n            \"required\": true\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\",\n            \"default\": 1\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"data\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Sequence, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !_.modified()) return;\n        const out = pulse.materialize().fork(pulse.MOD), as = _.as || \"data\";\n        out.rem = this.value ? pulse.rem.concat(this.value) : pulse.rem;\n        this.value = (0, _d3Array.range)(_.start, _.stop, _.step || 1).map((v)=>{\n            const t = {};\n            t[as] = v;\n            return (0, _vegaDataflow.ingest)(t);\n        });\n        out.add = pulse.add.concat(this.value);\n        return out;\n    }\n});\n/**\n * Propagates a new pulse without any tuples so long as the input\n * pulse contains some added, removed or modified tuples.\n * @param {object} params - The parameters for this operator.\n * @constructor\n */ function Sieve(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n    this.modified(true); // always treat as modified\n}\n(0, _vegaUtil.inherits)(Sieve, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        this.value = pulse.source;\n        return pulse.changed() ? pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS) : pulse.StopPropagation;\n    }\n});\n/**\n * Discretize dates to specific time units.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The data field containing date/time values.\n */ function TimeUnit(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nconst OUTPUT = [\n    \"unit0\",\n    \"unit1\"\n];\nTimeUnit.Definition = {\n    \"type\": \"TimeUnit\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"interval\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"units\",\n            \"type\": \"enum\",\n            \"values\": (0, _vegaTime.TIME_UNITS),\n            \"array\": true\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\",\n            \"default\": 1\n        },\n        {\n            \"name\": \"maxbins\",\n            \"type\": \"number\",\n            \"default\": 40\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"date\",\n            \"array\": true\n        },\n        {\n            \"name\": \"timezone\",\n            \"type\": \"enum\",\n            \"default\": \"local\",\n            \"values\": [\n                \"local\",\n                \"utc\"\n            ]\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": OUTPUT\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(TimeUnit, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const field = _.field, band = _.interval !== false, utc = _.timezone === \"utc\", floor = this._floor(_, pulse), offset = (utc ? (0, _vegaTime.utcInterval) : (0, _vegaTime.timeInterval))(floor.unit).offset, as = _.as || OUTPUT, u0 = as[0], u1 = as[1], step = floor.step;\n        let min = floor.start || Infinity, max = floor.stop || -Infinity, flag = pulse.ADD;\n        if (_.modified() || pulse.modified((0, _vegaUtil.accessorFields)(field))) {\n            pulse = pulse.reflow(true);\n            flag = pulse.SOURCE;\n            min = Infinity;\n            max = -Infinity;\n        }\n        pulse.visit(flag, (t)=>{\n            const v = field(t);\n            let a, b;\n            if (v == null) {\n                t[u0] = null;\n                if (band) t[u1] = null;\n            } else {\n                t[u0] = a = b = floor(v);\n                if (band) t[u1] = b = offset(a, step);\n                if (a < min) min = a;\n                if (b > max) max = b;\n            }\n        });\n        floor.start = min;\n        floor.stop = max;\n        return pulse.modifies(band ? as : u0);\n    },\n    _floor (_, pulse) {\n        const utc = _.timezone === \"utc\"; // get parameters\n        const { units , step  } = _.units ? {\n            units: _.units,\n            step: _.step || 1\n        } : (0, _vegaTime.timeBin)({\n            extent: _.extent || (0, _vegaUtil.extent)(pulse.materialize(pulse.SOURCE).source, _.field),\n            maxbins: _.maxbins\n        }); // check / standardize time units\n        const tunits = (0, _vegaTime.timeUnits)(units), prev = this.value || {}, floor = (utc ? (0, _vegaTime.utcFloor) : (0, _vegaTime.timeFloor))(tunits, step);\n        floor.unit = (0, _vegaUtil.peek)(tunits);\n        floor.units = tunits;\n        floor.step = step;\n        floor.start = prev.start;\n        floor.stop = prev.stop;\n        return this.value = floor;\n    }\n});\n/**\n * An index that maps from unique, string-coerced, field values to tuples.\n * Assumes that the field serves as a unique key with no duplicate values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The field accessor to index.\n */ function TupleIndex(params) {\n    (0, _vegaDataflow.Transform).call(this, (0, _vegaUtil.fastmap)(), params);\n}\n(0, _vegaUtil.inherits)(TupleIndex, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const df = pulse.dataflow, field = _.field, index = this.value, set2 = (t)=>index.set(field(t), t);\n        let mod = true;\n        if (_.modified(\"field\") || pulse.modified(field.fields)) {\n            index.clear();\n            pulse.visit(pulse.SOURCE, set2);\n        } else if (pulse.changed()) {\n            pulse.visit(pulse.REM, (t)=>index.delete(field(t)));\n            pulse.visit(pulse.ADD, set2);\n        } else mod = false;\n        this.modified(mod);\n        if (index.empty > df.cleanThreshold) df.runAfter(index.clean);\n        return pulse.fork();\n    }\n});\n/**\n * Extracts an array of values. Assumes the source data has already been\n * reduced as needed (e.g., by an upstream Aggregate transform).\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The domain field to extract.\n * @param {function(*,*): number} [params.sort] - An optional\n *   comparator function for sorting the values. The comparator will be\n *   applied to backing tuples prior to value extraction.\n */ function Values(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Values, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const run = !this.value || _.modified(\"field\") || _.modified(\"sort\") || pulse.changed() || _.sort && pulse.modified(_.sort.fields);\n        if (run) this.value = (_.sort ? pulse.source.slice().sort((0, _vegaDataflow.stableCompare)(_.sort)) : pulse.source).map(_.field);\n    }\n});\nfunction WindowOp(op, field, param, as) {\n    const fn = WindowOps[op](field, param);\n    return {\n        init: fn.init || (0, _vegaUtil.zero),\n        update: function(w, t) {\n            t[as] = fn.next(w);\n        }\n    };\n}\nconst WindowOps = {\n    row_number: function() {\n        return {\n            next: (w)=>w.index + 1\n        };\n    },\n    rank: function() {\n        let rank;\n        return {\n            init: ()=>rank = 1,\n            next: (w)=>{\n                const i = w.index, data = w.data;\n                return i && w.compare(data[i - 1], data[i]) ? rank = i + 1 : rank;\n            }\n        };\n    },\n    dense_rank: function() {\n        let drank;\n        return {\n            init: ()=>drank = 1,\n            next: (w)=>{\n                const i = w.index, d = w.data;\n                return i && w.compare(d[i - 1], d[i]) ? ++drank : drank;\n            }\n        };\n    },\n    percent_rank: function() {\n        const rank = WindowOps.rank(), next = rank.next;\n        return {\n            init: rank.init,\n            next: (w)=>(next(w) - 1) / (w.data.length - 1)\n        };\n    },\n    cume_dist: function() {\n        let cume;\n        return {\n            init: ()=>cume = 0,\n            next: (w)=>{\n                const d = w.data, c = w.compare;\n                let i = w.index;\n                if (cume < i) {\n                    while(i + 1 < d.length && !c(d[i], d[i + 1]))++i;\n                    cume = i;\n                }\n                return (1 + cume) / d.length;\n            }\n        };\n    },\n    ntile: function(field, num) {\n        num = +num;\n        if (!(num > 0)) (0, _vegaUtil.error)(\"ntile num must be greater than zero.\");\n        const cume = WindowOps.cume_dist(), next = cume.next;\n        return {\n            init: cume.init,\n            next: (w)=>Math.ceil(num * next(w))\n        };\n    },\n    lag: function(field, offset) {\n        offset = +offset || 1;\n        return {\n            next: (w)=>{\n                const i = w.index - offset;\n                return i >= 0 ? field(w.data[i]) : null;\n            }\n        };\n    },\n    lead: function(field, offset) {\n        offset = +offset || 1;\n        return {\n            next: (w)=>{\n                const i = w.index + offset, d = w.data;\n                return i < d.length ? field(d[i]) : null;\n            }\n        };\n    },\n    first_value: function(field) {\n        return {\n            next: (w)=>field(w.data[w.i0])\n        };\n    },\n    last_value: function(field) {\n        return {\n            next: (w)=>field(w.data[w.i1 - 1])\n        };\n    },\n    nth_value: function(field, nth) {\n        nth = +nth;\n        if (!(nth > 0)) (0, _vegaUtil.error)(\"nth_value nth must be greater than zero.\");\n        return {\n            next: (w)=>{\n                const i = w.i0 + (nth - 1);\n                return i < w.i1 ? field(w.data[i]) : null;\n            }\n        };\n    },\n    prev_value: function(field) {\n        let prev;\n        return {\n            init: ()=>prev = null,\n            next: (w)=>{\n                const v = field(w.data[w.index]);\n                return v != null ? prev = v : prev;\n            }\n        };\n    },\n    next_value: function(field) {\n        let v, i;\n        return {\n            init: ()=>(v = null, i = -1),\n            next: (w)=>{\n                const d = w.data;\n                return w.index <= i ? v : (i = find(field, d, w.index)) < 0 ? (i = d.length, v = null) : v = field(d[i]);\n            }\n        };\n    }\n};\nfunction find(field, data, index) {\n    for(let n = data.length; index < n; ++index){\n        const v = field(data[index]);\n        if (v != null) return index;\n    }\n    return -1;\n}\nconst ValidWindowOps = Object.keys(WindowOps);\nfunction WindowState(_3) {\n    const ops = (0, _vegaUtil.array)(_3.ops), fields = (0, _vegaUtil.array)(_3.fields), params = (0, _vegaUtil.array)(_3.params), as = (0, _vegaUtil.array)(_3.as), outputs = this.outputs = [], windows = this.windows = [], inputs = {}, map = {}, counts = [], measures = [];\n    let countOnly = true;\n    function visitInputs(f) {\n        (0, _vegaUtil.array)((0, _vegaUtil.accessorFields)(f)).forEach((_)=>inputs[_] = 1);\n    }\n    visitInputs(_3.sort);\n    ops.forEach((op, i)=>{\n        const field = fields[i], mname = (0, _vegaUtil.accessorName)(field), name = measureName(op, mname, as[i]);\n        visitInputs(field);\n        outputs.push(name); // Window operation\n        if ((0, _vegaUtil.hasOwnProperty)(WindowOps, op)) windows.push(WindowOp(op, fields[i], params[i], name));\n        else {\n            if (field == null && op !== \"count\") (0, _vegaUtil.error)(\"Null aggregate field specified.\");\n            if (op === \"count\") {\n                counts.push(name);\n                return;\n            }\n            countOnly = false;\n            let m = map[mname];\n            if (!m) {\n                m = map[mname] = [];\n                m.field = field;\n                measures.push(m);\n            }\n            m.push(createMeasure(op, name));\n        }\n    });\n    if (counts.length || measures.length) this.cell = cell(measures, counts, countOnly);\n    this.inputs = Object.keys(inputs);\n}\nconst prototype = WindowState.prototype;\nprototype.init = function() {\n    this.windows.forEach((_)=>_.init());\n    if (this.cell) this.cell.init();\n};\nprototype.update = function(w, t) {\n    const cell8 = this.cell, wind = this.windows, data = w.data, m = wind && wind.length;\n    let j;\n    if (cell8) {\n        for(j = w.p0; j < w.i0; ++j)cell8.rem(data[j]);\n        for(j = w.p1; j < w.i1; ++j)cell8.add(data[j]);\n        cell8.set(t);\n    }\n    for(j = 0; j < m; ++j)wind[j].update(w, t);\n};\nfunction cell(measures, counts, countOnly) {\n    measures = measures.map((m)=>compileMeasures(m, m.field));\n    const cell9 = {\n        num: 0,\n        agg: null,\n        store: false,\n        count: counts\n    };\n    if (!countOnly) {\n        var n = measures.length, a = cell9.agg = Array(n), i = 0;\n        for(; i < n; ++i)a[i] = new measures[i](cell9);\n    }\n    if (cell9.store) var store = cell9.data = new TupleStore();\n    cell9.add = function(t) {\n        cell9.num += 1;\n        if (countOnly) return;\n        if (store) store.add(t);\n        for(let i = 0; i < n; ++i)a[i].add(a[i].get(t), t);\n    };\n    cell9.rem = function(t) {\n        cell9.num -= 1;\n        if (countOnly) return;\n        if (store) store.rem(t);\n        for(let i = 0; i < n; ++i)a[i].rem(a[i].get(t), t);\n    };\n    cell9.set = function(t) {\n        let i, n; // consolidate stored values\n        if (store) store.values(); // update tuple properties\n        for(i = 0, n = counts.length; i < n; ++i)t[counts[i]] = cell9.num;\n        if (!countOnly) for(i = 0, n = a.length; i < n; ++i)a[i].set(t);\n    };\n    cell9.init = function() {\n        cell9.num = 0;\n        if (store) store.reset();\n        for(let i = 0; i < n; ++i)a[i].init();\n    };\n    return cell9;\n}\n/**\n * Perform window calculations and write results to the input stream.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator function for sorting tuples within a window.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors by which to partition tuples into separate windows.\n * @param {Array<string>} params.ops - An array of strings indicating window operations to perform.\n * @param {Array<function(object): *>} [params.fields] - An array of accessors\n *   for data fields to use as inputs to window operations.\n * @param {Array<*>} [params.params] - An array of parameter values for window operations.\n * @param {Array<string>} [params.as] - An array of output field names for window operations.\n * @param {Array<number>} [params.frame] - Window frame definition as two-element array.\n * @param {boolean} [params.ignorePeers=false] - If true, base window frame boundaries on row\n *   number alone, ignoring peers with identical sort values. If false (default),\n *   the window boundaries will be adjusted to include peer values.\n */ function Window(params) {\n    (0, _vegaDataflow.Transform).call(this, {}, params);\n    this._mlen = 0;\n    this._mods = [];\n}\nWindow.Definition = {\n    \"type\": \"Window\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"ops\",\n            \"type\": \"enum\",\n            \"array\": true,\n            \"values\": ValidWindowOps.concat(ValidAggregateOps)\n        },\n        {\n            \"name\": \"params\",\n            \"type\": \"number\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"array\": true\n        },\n        {\n            \"name\": \"frame\",\n            \"type\": \"number\",\n            \"null\": true,\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                null,\n                0\n            ]\n        },\n        {\n            \"name\": \"ignorePeers\",\n            \"type\": \"boolean\",\n            \"default\": false\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Window, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        this.stamp = pulse.stamp;\n        const mod = _.modified(), cmp = (0, _vegaDataflow.stableCompare)(_.sort), key = groupkey(_.groupby), group = (t)=>this.group(key(t)); // initialize window state\n        let state = this.state;\n        if (!state || mod) state = this.state = new WindowState(_);\n         // partition input tuples\n        if (mod || pulse.modified(state.inputs)) {\n            this.value = {};\n            pulse.visit(pulse.SOURCE, (t)=>group(t).add(t));\n        } else {\n            pulse.visit(pulse.REM, (t)=>group(t).remove(t));\n            pulse.visit(pulse.ADD, (t)=>group(t).add(t));\n        } // perform window calculations for each modified partition\n        for(let i = 0, n = this._mlen; i < n; ++i)processPartition(this._mods[i], state, cmp, _);\n        this._mlen = 0;\n        this._mods = []; // TODO don't reflow everything?\n        return pulse.reflow(mod).modifies(state.outputs);\n    },\n    group (key) {\n        let group = this.value[key];\n        if (!group) {\n            group = this.value[key] = SortedList((0, _vegaDataflow.tupleid));\n            group.stamp = -1;\n        }\n        if (group.stamp < this.stamp) {\n            group.stamp = this.stamp;\n            this._mods[this._mlen++] = group;\n        }\n        return group;\n    }\n});\nfunction processPartition(list, state, cmp, _) {\n    const sort = _.sort, range = sort && !_.ignorePeers, frame = _.frame || [\n        null,\n        0\n    ], data = list.data(cmp), // use cmp for stable sort\n    n = data.length, b = range ? (0, _d3Array.bisector)(sort) : null, w = {\n        i0: 0,\n        i1: 0,\n        p0: 0,\n        p1: 0,\n        index: 0,\n        data: data,\n        compare: sort || (0, _vegaUtil.constant)(-1)\n    };\n    state.init();\n    for(let i = 0; i < n; ++i){\n        setWindow(w, frame, i, n);\n        if (range) adjustRange(w, b);\n        state.update(w, data[i]);\n    }\n}\nfunction setWindow(w, f, i, n) {\n    w.p0 = w.i0;\n    w.p1 = w.i1;\n    w.i0 = f[0] == null ? 0 : Math.max(0, i - Math.abs(f[0]));\n    w.i1 = f[1] == null ? n : Math.min(n, i + Math.abs(f[1]) + 1);\n    w.index = i;\n} // if frame type is 'range', adjust window for peer values\nfunction adjustRange(w, bisect) {\n    const r0 = w.i0, r1 = w.i1 - 1, c = w.compare, d = w.data, n = d.length - 1;\n    if (r0 > 0 && !c(d[r0], d[r0 - 1])) w.i0 = bisect.left(d, d[r0]);\n    if (r1 < n && !c(d[r1], d[r1 + 1])) w.i1 = bisect.right(d, d[r1]);\n}\n\n},{\"vega-util\":\"bApja\",\"vega-dataflow\":\"3NitK\",\"vega-statistics\":\"5ncfv\",\"d3-array\":\"6IwJG\",\"vega-time\":\"27kpp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5ncfv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bandwidthNRD\", ()=>estimateBandwidth);\nparcelHelpers.export(exports, \"bin\", ()=>bin);\nparcelHelpers.export(exports, \"bootstrapCI\", ()=>bootstrapCI);\nparcelHelpers.export(exports, \"cumulativeLogNormal\", ()=>cumulativeLogNormal);\nparcelHelpers.export(exports, \"cumulativeNormal\", ()=>cumulativeNormal);\nparcelHelpers.export(exports, \"cumulativeUniform\", ()=>cumulativeUniform);\nparcelHelpers.export(exports, \"densityLogNormal\", ()=>densityLogNormal);\nparcelHelpers.export(exports, \"densityNormal\", ()=>densityNormal);\nparcelHelpers.export(exports, \"densityUniform\", ()=>densityUniform);\nparcelHelpers.export(exports, \"dotbin\", ()=>dotbin);\nparcelHelpers.export(exports, \"quantileLogNormal\", ()=>quantileLogNormal);\nparcelHelpers.export(exports, \"quantileNormal\", ()=>quantileNormal);\nparcelHelpers.export(exports, \"quantileUniform\", ()=>quantileUniform);\nparcelHelpers.export(exports, \"quantiles\", ()=>quantiles);\nparcelHelpers.export(exports, \"quartiles\", ()=>quartiles);\nparcelHelpers.export(exports, \"random\", ()=>random);\nparcelHelpers.export(exports, \"randomInteger\", ()=>integer);\nparcelHelpers.export(exports, \"randomKDE\", ()=>kde);\nparcelHelpers.export(exports, \"randomLCG\", ()=>lcg);\nparcelHelpers.export(exports, \"randomLogNormal\", ()=>lognormal);\nparcelHelpers.export(exports, \"randomMixture\", ()=>mixture);\nparcelHelpers.export(exports, \"randomNormal\", ()=>gaussian);\nparcelHelpers.export(exports, \"randomUniform\", ()=>uniform);\nparcelHelpers.export(exports, \"regressionExp\", ()=>exp);\nparcelHelpers.export(exports, \"regressionLinear\", ()=>linear);\nparcelHelpers.export(exports, \"regressionLoess\", ()=>loess);\nparcelHelpers.export(exports, \"regressionLog\", ()=>log);\nparcelHelpers.export(exports, \"regressionPoly\", ()=>poly);\nparcelHelpers.export(exports, \"regressionPow\", ()=>pow);\nparcelHelpers.export(exports, \"regressionQuad\", ()=>quad);\nparcelHelpers.export(exports, \"sampleCurve\", ()=>sampleCurve);\nparcelHelpers.export(exports, \"sampleLogNormal\", ()=>sampleLogNormal);\nparcelHelpers.export(exports, \"sampleNormal\", ()=>sampleNormal);\nparcelHelpers.export(exports, \"sampleUniform\", ()=>sampleUniform);\nparcelHelpers.export(exports, \"setRandom\", ()=>setRandom);\nvar _d3Array = require(\"d3-array\");\nfunction* numbers(values, valueof) {\n    if (valueof == null) {\n        for (let value of values)if (value != null && value !== \"\" && (value = +value) >= value) yield value;\n    } else {\n        let index = -1;\n        for (let value of values){\n            value = valueof(value, ++index, values);\n            if (value != null && value !== \"\" && (value = +value) >= value) yield value;\n        }\n    }\n}\nfunction quantiles(array, p, f) {\n    const values = Float64Array.from(numbers(array, f)); // don't depend on return value from typed array sort call\n    // protects against undefined sort results in Safari (vega/vega-lite#4964)\n    values.sort((0, _d3Array.ascending));\n    return p.map((_)=>(0, _d3Array.quantileSorted)(values, _));\n}\nfunction quartiles(array, f) {\n    return quantiles(array, [\n        0.25,\n        0.50,\n        0.75\n    ], f);\n}\n// Theory, Practice, and Visualization. Wiley.\nfunction estimateBandwidth(array, f) {\n    const n = array.length, d = (0, _d3Array.deviation)(array, f), q = quartiles(array, f), h = (q[2] - q[0]) / 1.34, v = Math.min(d, h) || d || Math.abs(q[0]) || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n}\nfunction bin(_) {\n    // determine range\n    const maxb = _.maxbins || 20, base = _.base || 10, logb = Math.log(base), div = _.divide || [\n        5,\n        2\n    ];\n    let min = _.extent[0], max = _.extent[1], step, level, minstep, v, i, n;\n    const span = _.span || max - min || Math.abs(min) || 1;\n    if (_.step) // if step size is explicitly given, use that\n    step = _.step;\n    else if (_.steps) {\n        // if provided, limit choice to acceptable step sizes\n        v = span / maxb;\n        for(i = 0, n = _.steps.length; i < n && _.steps[i] < v; ++i);\n        step = _.steps[Math.max(0, i - 1)];\n    } else {\n        // else use span to determine step size\n        level = Math.ceil(Math.log(maxb) / logb);\n        minstep = _.minstep || 0;\n        step = Math.max(minstep, Math.pow(base, Math.round(Math.log(span) / logb) - level)); // increase step size if too many bins\n        while(Math.ceil(span / step) > maxb)step *= base;\n         // decrease step size if allowed\n        for(i = 0, n = div.length; i < n; ++i){\n            v = step / div[i];\n            if (v >= minstep && span / v <= maxb) step = v;\n        }\n    } // update precision, min and max\n    v = Math.log(step);\n    const precision = v >= 0 ? 0 : ~~(-v / logb) + 1, eps = Math.pow(base, -precision - 1);\n    if (_.nice || _.nice === undefined) {\n        v = Math.floor(min / step + eps) * step;\n        min = min < v ? v - step : v;\n        max = Math.ceil(max / step) * step;\n    }\n    return {\n        start: min,\n        stop: max === min ? min + step : max,\n        step: step\n    };\n}\nvar random = Math.random;\nfunction setRandom(r) {\n    random = r;\n}\nfunction bootstrapCI(array, samples, alpha, f) {\n    if (!array.length) return [\n        undefined,\n        undefined\n    ];\n    const values = Float64Array.from(numbers(array, f)), n = values.length, m = samples;\n    let a, i, j, mu;\n    for(j = 0, mu = Array(m); j < m; ++j){\n        for(a = 0, i = 0; i < n; ++i)a += values[~~(random() * n)];\n        mu[j] = a / n;\n    }\n    mu.sort((0, _d3Array.ascending));\n    return [\n        (0, _d3Array.quantile)(mu, alpha / 2),\n        (0, _d3Array.quantile)(mu, 1 - alpha / 2)\n    ];\n}\n// Dot density binning for dot plot construction.\n// Based on Leland Wilkinson, Dot Plots, The American Statistician, 1999.\n// https://www.cs.uic.edu/~wilkinson/Publications/dotplots.pdf\nfunction dotbin(array, step, smooth, f) {\n    f = f || ((_)=>_);\n    const n = array.length, v = new Float64Array(n);\n    let i = 0, j = 1, a = f(array[0]), b = a, w = a + step, x;\n    for(; j < n; ++j){\n        x = f(array[j]);\n        if (x >= w) {\n            b = (a + b) / 2;\n            for(; i < j; ++i)v[i] = b;\n            w = x + step;\n            a = x;\n        }\n        b = x;\n    }\n    b = (a + b) / 2;\n    for(; i < j; ++i)v[i] = b;\n    return smooth ? smoothing(v, step + step / 4) : v;\n} // perform smoothing to reduce variance\n// swap points between \"adjacent\" stacks\n// Wilkinson defines adjacent as within step/4 units\nfunction smoothing(v, thresh) {\n    const n = v.length;\n    let a = 0, b = 1, c, d; // get left stack\n    while(v[a] === v[b])++b;\n    while(b < n){\n        // get right stack\n        c = b + 1;\n        while(v[b] === v[c])++c; // are stacks adjacent?\n        // if so, compare sizes and swap as needed\n        if (v[b] - v[b - 1] < thresh) {\n            d = b + (a + c - b - b >> 1);\n            while(d < b)v[d++] = v[b];\n            while(d > b)v[d--] = v[a];\n        } // update left stack indices\n        a = b;\n        b = c;\n    }\n    return v;\n}\nfunction lcg(seed) {\n    // Random numbers using a Linear Congruential Generator with seed value\n    // Uses glibc values from https://en.wikipedia.org/wiki/Linear_congruential_generator\n    return function() {\n        seed = (1103515245 * seed + 12345) % 2147483647;\n        return seed / 2147483647;\n    };\n}\nfunction integer(min, max) {\n    if (max == null) {\n        max = min;\n        min = 0;\n    }\n    let a, b, d;\n    const dist = {\n        min (_) {\n            if (arguments.length) {\n                a = _ || 0;\n                d = b - a;\n                return dist;\n            } else return a;\n        },\n        max (_) {\n            if (arguments.length) {\n                b = _ || 0;\n                d = b - a;\n                return dist;\n            } else return b;\n        },\n        sample () {\n            return a + Math.floor(d * random());\n        },\n        pdf (x) {\n            return x === Math.floor(x) && x >= a && x < b ? 1 / d : 0;\n        },\n        cdf (x) {\n            const v = Math.floor(x);\n            return v < a ? 0 : v >= b ? 1 : (v - a + 1) / d;\n        },\n        icdf (p) {\n            return p >= 0 && p <= 1 ? a - 1 + Math.floor(p * d) : NaN;\n        }\n    };\n    return dist.min(min).max(max);\n}\nconst SQRT2PI = Math.sqrt(2 * Math.PI);\nconst SQRT2 = Math.SQRT2;\nlet nextSample = NaN;\nfunction sampleNormal(mean, stdev) {\n    mean = mean || 0;\n    stdev = stdev == null ? 1 : stdev;\n    let x = 0, y = 0, rds, c;\n    if (nextSample === nextSample) {\n        x = nextSample;\n        nextSample = NaN;\n    } else {\n        do {\n            x = random() * 2 - 1;\n            y = random() * 2 - 1;\n            rds = x * x + y * y;\n        }while (rds === 0 || rds > 1);\n        c = Math.sqrt(-2 * Math.log(rds) / rds); // Box-Muller transform\n        x *= c;\n        nextSample = y * c;\n    }\n    return mean + x * stdev;\n}\nfunction densityNormal(value, mean, stdev) {\n    stdev = stdev == null ? 1 : stdev;\n    const z = (value - (mean || 0)) / stdev;\n    return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI);\n} // Approximation from West (2009)\n// Better Approximations to Cumulative Normal Functions\nfunction cumulativeNormal(value, mean, stdev) {\n    mean = mean || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z = (value - mean) / stdev, Z = Math.abs(z);\n    let cd;\n    if (Z > 37) cd = 0;\n    else {\n        const exp1 = Math.exp(-Z * Z / 2);\n        let sum;\n        if (Z < 7.07106781186547) {\n            sum = 3.52624965998911e-02 * Z + 0.700383064443688;\n            sum = sum * Z + 6.37396220353165;\n            sum = sum * Z + 33.912866078383;\n            sum = sum * Z + 112.079291497871;\n            sum = sum * Z + 221.213596169931;\n            sum = sum * Z + 220.206867912376;\n            cd = exp1 * sum;\n            sum = 8.83883476483184e-02 * Z + 1.75566716318264;\n            sum = sum * Z + 16.064177579207;\n            sum = sum * Z + 86.7807322029461;\n            sum = sum * Z + 296.564248779674;\n            sum = sum * Z + 637.333633378831;\n            sum = sum * Z + 793.826512519948;\n            sum = sum * Z + 440.413735824752;\n            cd = cd / sum;\n        } else {\n            sum = Z + 0.65;\n            sum = Z + 4 / sum;\n            sum = Z + 3 / sum;\n            sum = Z + 2 / sum;\n            sum = Z + 1 / sum;\n            cd = exp1 / sum / 2.506628274631;\n        }\n    }\n    return z > 0 ? 1 - cd : cd;\n} // Approximation of Probit function using inverse error function.\nfunction quantileNormal(p, mean, stdev) {\n    if (p < 0 || p > 1) return NaN;\n    return (mean || 0) + (stdev == null ? 1 : stdev) * SQRT2 * erfinv(2 * p - 1);\n} // Approximate inverse error function. Implementation from \"Approximating\n// the erfinv function\" by Mike Giles, GPU Computing Gems, volume 2, 2010.\n// Ported from Apache Commons Math, http://www.apache.org/licenses/LICENSE-2.0\nfunction erfinv(x) {\n    // beware that the logarithm argument must be\n    // commputed as (1.0 - x) * (1.0 + x),\n    // it must NOT be simplified as 1.0 - x * x as this\n    // would induce rounding errors near the boundaries +/-1\n    let w = -Math.log((1 - x) * (1 + x)), p;\n    if (w < 6.25) {\n        w -= 3.125;\n        p = -0.00000000000000000000364441206401782;\n        p = -0.00000000000000000016850591381820166 + p * w;\n        p = 1.2858480715256400167e-18 + p * w;\n        p = 1.115787767802518096e-17 + p * w;\n        p = -0.0000000000000001333171662854621 + p * w;\n        p = 2.0972767875968561637e-17 + p * w;\n        p = 6.6376381343583238325e-15 + p * w;\n        p = -0.00000000000004054566272975207 + p * w;\n        p = -0.00000000000008151934197605472 + p * w;\n        p = 2.6335093153082322977e-12 + p * w;\n        p = -0.000000000012975133253453532 + p * w;\n        p = -0.00000000005415412054294628 + p * w;\n        p = 1.051212273321532285e-09 + p * w;\n        p = -0.000000004112633980346984 + p * w;\n        p = -0.000000029070369957882005 + p * w;\n        p = 4.2347877827932403518e-07 + p * w;\n        p = -0.0000013654692000834679 + p * w;\n        p = -0.000013882523362786469 + p * w;\n        p = 0.0001867342080340571352 + p * w;\n        p = -0.000740702534166267 + p * w;\n        p = -0.006033670871430149 + p * w;\n        p = 0.24015818242558961693 + p * w;\n        p = 1.6536545626831027356 + p * w;\n    } else if (w < 16.0) {\n        w = Math.sqrt(w) - 3.25;\n        p = 2.2137376921775787049e-09;\n        p = 9.0756561938885390979e-08 + p * w;\n        p = -0.00000027517406297064545 + p * w;\n        p = 1.8239629214389227755e-08 + p * w;\n        p = 1.5027403968909827627e-06 + p * w;\n        p = -0.000004013867526981546 + p * w;\n        p = 2.9234449089955446044e-06 + p * w;\n        p = 1.2475304481671778723e-05 + p * w;\n        p = -0.000047318229009055734 + p * w;\n        p = 6.8284851459573175448e-05 + p * w;\n        p = 2.4031110387097893999e-05 + p * w;\n        p = -0.0003550375203628475 + p * w;\n        p = 0.00095328937973738049703 + p * w;\n        p = -0.0016882755560235047 + p * w;\n        p = 0.0024914420961078508066 + p * w;\n        p = -0.003751208507569241 + p * w;\n        p = 0.005370914553590063617 + p * w;\n        p = 1.0052589676941592334 + p * w;\n        p = 3.0838856104922207635 + p * w;\n    } else if (Number.isFinite(w)) {\n        w = Math.sqrt(w) - 5.0;\n        p = -0.000000000027109920616438573;\n        p = -0.0000000002555641816996525 + p * w;\n        p = 1.5076572693500548083e-09 + p * w;\n        p = -0.000000003789465440126737 + p * w;\n        p = 7.6157012080783393804e-09 + p * w;\n        p = -0.00000001496002662714924 + p * w;\n        p = 2.9147953450901080826e-08 + p * w;\n        p = -0.00000006771199775845234 + p * w;\n        p = 2.2900482228026654717e-07 + p * w;\n        p = -0.00000099298272942317 + p * w;\n        p = 4.5260625972231537039e-06 + p * w;\n        p = -0.00001968177810553167 + p * w;\n        p = 7.5995277030017761139e-05 + p * w;\n        p = -0.00021503011930044477 + p * w;\n        p = -0.00013871931833623122 + p * w;\n        p = 1.0103004648645343977 + p * w;\n        p = 4.8499064014085844221 + p * w;\n    } else p = Infinity;\n    return p * x;\n}\nfunction gaussian(mean, stdev) {\n    let mu, sigma;\n    const dist = {\n        mean (_) {\n            if (arguments.length) {\n                mu = _ || 0;\n                return dist;\n            } else return mu;\n        },\n        stdev (_) {\n            if (arguments.length) {\n                sigma = _ == null ? 1 : _;\n                return dist;\n            } else return sigma;\n        },\n        sample: ()=>sampleNormal(mu, sigma),\n        pdf: (value)=>densityNormal(value, mu, sigma),\n        cdf: (value)=>cumulativeNormal(value, mu, sigma),\n        icdf: (p)=>quantileNormal(p, mu, sigma)\n    };\n    return dist.mean(mean).stdev(stdev);\n}\nfunction kde(support, bandwidth) {\n    const kernel = gaussian();\n    let n = 0;\n    const dist = {\n        data (_) {\n            if (arguments.length) {\n                support = _;\n                n = _ ? _.length : 0;\n                return dist.bandwidth(bandwidth);\n            } else return support;\n        },\n        bandwidth (_) {\n            if (!arguments.length) return bandwidth;\n            bandwidth = _;\n            if (!bandwidth && support) bandwidth = estimateBandwidth(support);\n            return dist;\n        },\n        sample () {\n            return support[~~(random() * n)] + bandwidth * kernel.sample();\n        },\n        pdf (x) {\n            let y = 0, i = 0;\n            for(; i < n; ++i)y += kernel.pdf((x - support[i]) / bandwidth);\n            return y / bandwidth / n;\n        },\n        cdf (x) {\n            let y = 0, i = 0;\n            for(; i < n; ++i)y += kernel.cdf((x - support[i]) / bandwidth);\n            return y / n;\n        },\n        icdf () {\n            throw Error(\"KDE icdf not supported.\");\n        }\n    };\n    return dist.data(support);\n}\nfunction sampleLogNormal(mean, stdev) {\n    mean = mean || 0;\n    stdev = stdev == null ? 1 : stdev;\n    return Math.exp(mean + sampleNormal() * stdev);\n}\nfunction densityLogNormal(value, mean, stdev) {\n    if (value <= 0) return 0;\n    mean = mean || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z = (Math.log(value) - mean) / stdev;\n    return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI * value);\n}\nfunction cumulativeLogNormal(value, mean, stdev) {\n    return cumulativeNormal(Math.log(value), mean, stdev);\n}\nfunction quantileLogNormal(p, mean, stdev) {\n    return Math.exp(quantileNormal(p, mean, stdev));\n}\nfunction lognormal(mean, stdev) {\n    let mu, sigma;\n    const dist = {\n        mean (_) {\n            if (arguments.length) {\n                mu = _ || 0;\n                return dist;\n            } else return mu;\n        },\n        stdev (_) {\n            if (arguments.length) {\n                sigma = _ == null ? 1 : _;\n                return dist;\n            } else return sigma;\n        },\n        sample: ()=>sampleLogNormal(mu, sigma),\n        pdf: (value)=>densityLogNormal(value, mu, sigma),\n        cdf: (value)=>cumulativeLogNormal(value, mu, sigma),\n        icdf: (p)=>quantileLogNormal(p, mu, sigma)\n    };\n    return dist.mean(mean).stdev(stdev);\n}\nfunction mixture(dists, weights) {\n    let m = 0, w1;\n    function normalize(x) {\n        const w = [];\n        let sum = 0, i;\n        for(i = 0; i < m; ++i)sum += w[i] = x[i] == null ? 1 : +x[i];\n        for(i = 0; i < m; ++i)w[i] /= sum;\n        return w;\n    }\n    const dist = {\n        weights (_) {\n            if (arguments.length) {\n                w1 = normalize(weights = _ || []);\n                return dist;\n            }\n            return weights;\n        },\n        distributions (_) {\n            if (arguments.length) {\n                if (_) {\n                    m = _.length;\n                    dists = _;\n                } else {\n                    m = 0;\n                    dists = [];\n                }\n                return dist.weights(weights);\n            }\n            return dists;\n        },\n        sample () {\n            const r = random();\n            let d = dists[m - 1], v = w1[0], i = 0; // first select distribution\n            for(; i < m - 1; v += w1[++i])if (r < v) {\n                d = dists[i];\n                break;\n            }\n             // then sample from it\n            return d.sample();\n        },\n        pdf (x) {\n            let p = 0, i = 0;\n            for(; i < m; ++i)p += w1[i] * dists[i].pdf(x);\n            return p;\n        },\n        cdf (x) {\n            let p = 0, i = 0;\n            for(; i < m; ++i)p += w1[i] * dists[i].cdf(x);\n            return p;\n        },\n        icdf () {\n            throw Error(\"Mixture icdf not supported.\");\n        }\n    };\n    return dist.distributions(dists).weights(weights);\n}\nfunction sampleUniform(min, max) {\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return min + (max - min) * random();\n}\nfunction densityUniform(value, min, max) {\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return value >= min && value <= max ? 1 / (max - min) : 0;\n}\nfunction cumulativeUniform(value, min, max) {\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return value < min ? 0 : value > max ? 1 : (value - min) / (max - min);\n}\nfunction quantileUniform(p, min, max) {\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return p >= 0 && p <= 1 ? min + p * (max - min) : NaN;\n}\nfunction uniform(min, max) {\n    let a, b;\n    const dist = {\n        min (_) {\n            if (arguments.length) {\n                a = _ || 0;\n                return dist;\n            } else return a;\n        },\n        max (_) {\n            if (arguments.length) {\n                b = _ == null ? 1 : _;\n                return dist;\n            } else return b;\n        },\n        sample: ()=>sampleUniform(a, b),\n        pdf: (value)=>densityUniform(value, a, b),\n        cdf: (value)=>cumulativeUniform(value, a, b),\n        icdf: (p)=>quantileUniform(p, a, b)\n    };\n    if (max == null) {\n        max = min == null ? 1 : min;\n        min = 0;\n    }\n    return dist.min(min).max(max);\n}\n// Ordinary Least Squares\nfunction ols(uX, uY, uXY, uX2) {\n    const delta = uX2 - uX * uX, slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta, intercept = uY - slope * uX;\n    return [\n        intercept,\n        slope\n    ];\n}\nfunction points(data, x, y, sort) {\n    data = data.filter((d)=>{\n        let u = x(d), v = y(d);\n        return u != null && (u = +u) >= u && v != null && (v = +v) >= v;\n    });\n    if (sort) data.sort((a, b)=>x(a) - x(b));\n    const n = data.length, X = new Float64Array(n), Y = new Float64Array(n); // extract values, calculate means\n    let i = 0, ux = 0, uy = 0, xv, yv, d1;\n    for (d1 of data){\n        X[i] = xv = +x(d1);\n        Y[i] = yv = +y(d1);\n        ++i;\n        ux += (xv - ux) / i;\n        uy += (yv - uy) / i;\n    } // mean center the data\n    for(i = 0; i < n; ++i){\n        X[i] -= ux;\n        Y[i] -= uy;\n    }\n    return [\n        X,\n        Y,\n        ux,\n        uy\n    ];\n}\nfunction visitPoints(data, x, y, callback) {\n    let i = -1, u, v;\n    for (const d of data){\n        u = x(d);\n        v = y(d);\n        if (u != null && (u = +u) >= u && v != null && (v = +v) >= v) callback(u, v, ++i);\n    }\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction rSquared(data, x, y, uY, predict) {\n    let SSE = 0, SST = 0;\n    visitPoints(data, x, y, (dx, dy)=>{\n        const sse = dy - predict(dx), sst = dy - uY;\n        SSE += sse * sse;\n        SST += sst * sst;\n    });\n    return 1 - SSE / SST;\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction linear(data, x1, y) {\n    let X = 0, Y = 0, XY = 0, X2 = 0, n = 0;\n    visitPoints(data, x1, y, (dx, dy)=>{\n        ++n;\n        X += (dx - X) / n;\n        Y += (dy - Y) / n;\n        XY += (dx * dy - XY) / n;\n        X2 += (dx * dx - X2) / n;\n    });\n    const coef = ols(X, Y, XY, X2), predict = (x)=>coef[0] + coef[1] * x;\n    return {\n        coef: coef,\n        predict: predict,\n        rSquared: rSquared(data, x1, y, Y, predict)\n    };\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction log(data, x2, y) {\n    let X = 0, Y = 0, XY = 0, X2 = 0, n = 0;\n    visitPoints(data, x2, y, (dx, dy)=>{\n        ++n;\n        dx = Math.log(dx);\n        X += (dx - X) / n;\n        Y += (dy - Y) / n;\n        XY += (dx * dy - XY) / n;\n        X2 += (dx * dx - X2) / n;\n    });\n    const coef = ols(X, Y, XY, X2), predict = (x)=>coef[0] + coef[1] * Math.log(x);\n    return {\n        coef: coef,\n        predict: predict,\n        rSquared: rSquared(data, x2, y, Y, predict)\n    };\n}\nfunction exp(data, x3, y) {\n    // eslint-disable-next-line no-unused-vars\n    const [xv, yv, ux, uy] = points(data, x3, y);\n    let YL = 0, XY = 0, XYL = 0, X2Y = 0, n = 0, dx, ly, xy;\n    visitPoints(data, x3, y, (_, dy)=>{\n        dx = xv[n++];\n        ly = Math.log(dy);\n        xy = dx * dy;\n        YL += (dy * ly - YL) / n;\n        XY += (xy - XY) / n;\n        XYL += (xy * ly - XYL) / n;\n        X2Y += (dx * xy - X2Y) / n;\n    });\n    const [c0, c1] = ols(XY / uy, YL / uy, XYL / uy, X2Y / uy), predict = (x)=>Math.exp(c0 + c1 * (x - ux));\n    return {\n        coef: [\n            Math.exp(c0 - c1 * ux),\n            c1\n        ],\n        predict: predict,\n        rSquared: rSquared(data, x3, y, uy, predict)\n    };\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\nfunction pow(data, x4, y) {\n    let X = 0, Y = 0, XY = 0, X2 = 0, YS = 0, n = 0;\n    visitPoints(data, x4, y, (dx, dy)=>{\n        const lx = Math.log(dx), ly = Math.log(dy);\n        ++n;\n        X += (lx - X) / n;\n        Y += (ly - Y) / n;\n        XY += (lx * ly - XY) / n;\n        X2 += (lx * lx - X2) / n;\n        YS += (dy - YS) / n;\n    });\n    const coef = ols(X, Y, XY, X2), predict = (x)=>coef[0] * Math.pow(x, coef[1]);\n    coef[0] = Math.exp(coef[0]);\n    return {\n        coef: coef,\n        predict: predict,\n        rSquared: rSquared(data, x4, y, YS, predict)\n    };\n}\nfunction quad(data, x5, y) {\n    const [xv, yv, ux, uy] = points(data, x5, y), n = xv.length;\n    let X2 = 0, X3 = 0, X4 = 0, XY = 0, X2Y = 0, i, dx, dy, x2;\n    for(i = 0; i < n;){\n        dx = xv[i];\n        dy = yv[i++];\n        x2 = dx * dx;\n        X2 += (x2 - X2) / i;\n        X3 += (x2 * dx - X3) / i;\n        X4 += (x2 * x2 - X4) / i;\n        XY += (dx * dy - XY) / i;\n        X2Y += (x2 * dy - X2Y) / i;\n    }\n    const X2X2 = X4 - X2 * X2, d = X2 * X2X2 - X3 * X3, a = (X2Y * X2 - XY * X3) / d, b = (XY * X2X2 - X2Y * X3) / d, c = -a * X2, predict = (x)=>{\n        x = x - ux;\n        return a * x * x + b * x + c + uy;\n    }; // transform coefficients back from mean-centered space\n    return {\n        coef: [\n            c - b * ux + a * ux * ux + uy,\n            b - 2 * a * ux,\n            a\n        ],\n        predict: predict,\n        rSquared: rSquared(data, x5, y, uy, predict)\n    };\n}\n// License: https://github.com/HarryStevens/d3-regression/blob/master/LICENSE\n// ... which was adapted from regression-js by Tom Alexander\n// Source: https://github.com/Tom-Alexander/regression-js/blob/master/src/regression.js#L246\n// License: https://github.com/Tom-Alexander/regression-js/blob/master/LICENSE\nfunction poly(data, x6, y1, order) {\n    // use more efficient methods for lower orders\n    if (order === 1) return linear(data, x6, y1);\n    if (order === 2) return quad(data, x6, y1);\n    const [xv, yv, ux, uy] = points(data, x6, y1), n = xv.length, lhs = [], rhs = [], k = order + 1;\n    let i, j, l, v, c;\n    for(i = 0; i < k; ++i){\n        for(l = 0, v = 0; l < n; ++l)v += Math.pow(xv[l], i) * yv[l];\n        lhs.push(v);\n        c = new Float64Array(k);\n        for(j = 0; j < k; ++j){\n            for(l = 0, v = 0; l < n; ++l)v += Math.pow(xv[l], i + j);\n            c[j] = v;\n        }\n        rhs.push(c);\n    }\n    rhs.push(lhs);\n    const coef = gaussianElimination(rhs), predict = (x)=>{\n        x -= ux;\n        let y = uy + coef[0] + coef[1] * x + coef[2] * x * x;\n        for(i = 3; i < k; ++i)y += coef[i] * Math.pow(x, i);\n        return y;\n    };\n    return {\n        coef: uncenter(k, coef, -ux, uy),\n        predict: predict,\n        rSquared: rSquared(data, x6, y1, uy, predict)\n    };\n}\nfunction uncenter(k, a, x, y) {\n    const z = Array(k);\n    let i, j, v, c; // initialize to zero\n    for(i = 0; i < k; ++i)z[i] = 0; // polynomial expansion\n    for(i = k - 1; i >= 0; --i){\n        v = a[i];\n        c = 1;\n        z[i] += v;\n        for(j = 1; j <= i; ++j){\n            c *= (i + 1 - j) / j; // binomial coefficent\n            z[i - j] += v * Math.pow(x, j) * c;\n        }\n    } // bias term\n    z[0] += y;\n    return z;\n} // Given an array for a two-dimensional matrix and the polynomial order,\n// solve A * x = b using Gaussian elimination.\nfunction gaussianElimination(matrix) {\n    const n = matrix.length - 1, coef = [];\n    let i, j, k, r, t;\n    for(i = 0; i < n; ++i){\n        r = i; // max row\n        for(j = i + 1; j < n; ++j)if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) r = j;\n        for(k = i; k < n + 1; ++k){\n            t = matrix[k][i];\n            matrix[k][i] = matrix[k][r];\n            matrix[k][r] = t;\n        }\n        for(j = i + 1; j < n; ++j)for(k = n; k >= i; k--)matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i];\n    }\n    for(j = n - 1; j >= 0; --j){\n        t = 0;\n        for(k = j + 1; k < n; ++k)t += matrix[k][j] * coef[k];\n        coef[j] = (matrix[n][j] - t) / matrix[j][j];\n    }\n    return coef;\n}\nconst maxiters = 2, epsilon = 1e-12; // Adapted from science.js by Jason Davies\n// Source: https://github.com/jasondavies/science.js/blob/master/src/stats/loess.js\n// License: https://github.com/jasondavies/science.js/blob/master/LICENSE\nfunction loess(data, x, y, bandwidth) {\n    const [xv, yv, ux, uy] = points(data, x, y, true), n = xv.length, bw = Math.max(2, ~~(bandwidth * n)), // # nearest neighbors\n    yhat = new Float64Array(n), residuals = new Float64Array(n), robustWeights = new Float64Array(n).fill(1);\n    for(let iter = -1; ++iter <= maxiters;){\n        const interval = [\n            0,\n            bw - 1\n        ];\n        for(let i = 0; i < n; ++i){\n            const dx = xv[i], i0 = interval[0], i1 = interval[1], edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;\n            let W = 0, X = 0, Y = 0, XY = 0, X2 = 0;\n            const denom = 1 / Math.abs(xv[edge] - dx || 1); // avoid singularity!\n            for(let k = i0; k <= i1; ++k){\n                const xk = xv[k], yk = yv[k], w = tricube(Math.abs(dx - xk) * denom) * robustWeights[k], xkw = xk * w;\n                W += w;\n                X += xkw;\n                Y += yk * w;\n                XY += yk * xkw;\n                X2 += xk * xkw;\n            } // linear regression fit\n            const [a, b] = ols(X / W, Y / W, XY / W, X2 / W);\n            yhat[i] = a + b * dx;\n            residuals[i] = Math.abs(yv[i] - yhat[i]);\n            updateInterval(xv, i + 1, interval);\n        }\n        if (iter === maxiters) break;\n        const medianResidual = (0, _d3Array.median)(residuals);\n        if (Math.abs(medianResidual) < epsilon) break;\n        for(let i1 = 0, arg, w; i1 < n; ++i1){\n            arg = residuals[i1] / (6 * medianResidual); // default to epsilon (rather than zero) for large deviations\n            // keeping weights tiny but non-zero prevents singularites\n            robustWeights[i1] = arg >= 1 ? epsilon : (w = 1 - arg * arg) * w;\n        }\n    }\n    return output(xv, yhat, ux, uy);\n} // weighting kernel for local regression\nfunction tricube(x) {\n    return (x = 1 - x * x * x) * x * x;\n} // advance sliding window interval of nearest neighbors\nfunction updateInterval(xv, i, interval) {\n    const val = xv[i];\n    let left = interval[0], right = interval[1] + 1;\n    if (right >= xv.length) return; // step right if distance to new right edge is <= distance to old left edge\n    // step when distance is equal to ensure movement over duplicate x values\n    while(i > left && xv[right] - val <= val - xv[left]){\n        interval[0] = ++left;\n        interval[1] = right;\n        ++right;\n    }\n} // generate smoothed output points\n// average points with repeated x values\nfunction output(xv, yhat, ux, uy) {\n    const n = xv.length, out = [];\n    let i = 0, cnt = 0, prev = [], v;\n    for(; i < n; ++i){\n        v = xv[i] + ux;\n        if (prev[0] === v) // average output values via online update\n        prev[1] += (yhat[i] - prev[1]) / ++cnt;\n        else {\n            // add new output point\n            cnt = 0;\n            prev[1] += uy;\n            prev = [\n                v,\n                yhat[i]\n            ];\n            out.push(prev);\n        }\n    }\n    prev[1] += uy;\n    return out;\n}\n// subdivide up to accuracy of 0.5 degrees\nconst MIN_RADIANS = 0.5 * Math.PI / 180; // Adaptively sample an interpolated function over a domain extent\nfunction sampleCurve(f, extent, minSteps, maxSteps) {\n    minSteps = minSteps || 25;\n    maxSteps = Math.max(minSteps, maxSteps || 200);\n    const point = (x)=>[\n            x,\n            f(x)\n        ], minX = extent[0], maxX = extent[1], span = maxX - minX, stop = span / maxSteps, prev = [\n        point(minX)\n    ], next = [];\n    if (minSteps === maxSteps) {\n        // no adaptation, sample uniform grid directly and return\n        for(let i = 1; i < maxSteps; ++i)prev.push(point(minX + i / minSteps * span));\n        prev.push(point(maxX));\n        return prev;\n    } else {\n        // sample minimum points on uniform grid\n        // then move on to perform adaptive refinement\n        next.push(point(maxX));\n        for(let i = minSteps; --i > 0;)next.push(point(minX + i / minSteps * span));\n    }\n    let p0 = prev[0];\n    let p1 = next[next.length - 1];\n    const sx = 1 / span;\n    const sy = scaleY(p0[1], next);\n    while(p1){\n        // midpoint for potential curve subdivision\n        const pm = point((p0[0] + p1[0]) / 2);\n        const dx = pm[0] - p0[0] >= stop;\n        if (dx && angleDelta(p0, pm, p1, sx, sy) > MIN_RADIANS) // maximum resolution has not yet been met, and\n        // subdivision midpoint is sufficiently different from endpoint\n        // save subdivision, push midpoint onto the visitation stack\n        next.push(pm);\n        else {\n            // subdivision midpoint sufficiently similar to endpoint\n            // skip subdivision, store endpoint, move to next point on the stack\n            p0 = p1;\n            prev.push(p1);\n            next.pop();\n        }\n        p1 = next[next.length - 1];\n    }\n    return prev;\n}\nfunction scaleY(init, points1) {\n    let ymin = init;\n    let ymax = init;\n    const n = points1.length;\n    for(let i = 0; i < n; ++i){\n        const y = points1[i][1];\n        if (y < ymin) ymin = y;\n        if (y > ymax) ymax = y;\n    }\n    return 1 / (ymax - ymin);\n}\nfunction angleDelta(p, q, r, sx, sy) {\n    const a0 = Math.atan2(sy * (r[1] - p[1]), sx * (r[0] - p[0])), a1 = Math.atan2(sy * (q[1] - p[1]), sx * (q[0] - p[0]));\n    return Math.abs(a0 - a1);\n}\n\n},{\"d3-array\":\"6IwJG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i63Ad\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bound\", ()=>Bound);\nparcelHelpers.export(exports, \"identifier\", ()=>Identifier);\nparcelHelpers.export(exports, \"mark\", ()=>Mark);\nparcelHelpers.export(exports, \"overlap\", ()=>Overlap);\nparcelHelpers.export(exports, \"render\", ()=>Render);\nparcelHelpers.export(exports, \"viewlayout\", ()=>ViewLayout);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nvar _vegaUtil = require(\"vega-util\");\nconst Top = \"top\";\nconst Left = \"left\";\nconst Right = \"right\";\nconst Bottom = \"bottom\";\nconst TopLeft = \"top-left\";\nconst TopRight = \"top-right\";\nconst BottomLeft = \"bottom-left\";\nconst BottomRight = \"bottom-right\";\nconst Start = \"start\";\nconst Middle = \"middle\";\nconst End = \"end\";\nconst X = \"x\";\nconst Y = \"y\";\nconst Group = \"group\";\nconst AxisRole = \"axis\";\nconst TitleRole = \"title\";\nconst FrameRole = \"frame\";\nconst ScopeRole = \"scope\";\nconst LegendRole = \"legend\";\nconst RowHeader = \"row-header\";\nconst RowFooter = \"row-footer\";\nconst RowTitle = \"row-title\";\nconst ColHeader = \"column-header\";\nconst ColFooter = \"column-footer\";\nconst ColTitle = \"column-title\";\nconst Padding = \"padding\";\nconst Symbols = \"symbol\";\nconst Fit = \"fit\";\nconst FitX = \"fit-x\";\nconst FitY = \"fit-y\";\nconst Pad = \"pad\";\nconst None = \"none\";\nconst All = \"all\";\nconst Each = \"each\";\nconst Flush = \"flush\";\nconst Column = \"column\";\nconst Row = \"row\";\n/**\n * Calculate bounding boxes for scenegraph items.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.mark - The scenegraph mark instance to bound.\n */ function Bound(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Bound, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const view = pulse.dataflow, mark = _.mark, type = mark.marktype, entry = (0, _vegaScenegraph.Marks)[type], bound = entry.bound;\n        let markBounds = mark.bounds, rebound;\n        if (entry.nested) {\n            // multi-item marks have a single bounds instance\n            if (mark.items.length) view.dirty(mark.items[0]);\n            markBounds = boundItem(mark, bound);\n            mark.items.forEach((item)=>{\n                item.bounds.clear().union(markBounds);\n            });\n        } else if (type === Group || _.modified()) {\n            // operator parameters modified -> re-bound all items\n            // updates group bounds in response to modified group content\n            pulse.visit(pulse.MOD, (item)=>view.dirty(item));\n            markBounds.clear();\n            mark.items.forEach((item)=>markBounds.union(boundItem(item, bound))); // force reflow for axes/legends/titles to propagate any layout changes\n            switch(mark.role){\n                case AxisRole:\n                case LegendRole:\n                case TitleRole:\n                    pulse.reflow();\n            }\n        } else {\n            // incrementally update bounds, re-bound mark as needed\n            rebound = pulse.changed(pulse.REM);\n            pulse.visit(pulse.ADD, (item)=>{\n                markBounds.union(boundItem(item, bound));\n            });\n            pulse.visit(pulse.MOD, (item)=>{\n                rebound = rebound || markBounds.alignsWith(item.bounds);\n                view.dirty(item);\n                markBounds.union(boundItem(item, bound));\n            });\n            if (rebound) {\n                markBounds.clear();\n                mark.items.forEach((item)=>markBounds.union(item.bounds));\n            }\n        } // ensure mark bounds do not exceed any clipping region\n        (0, _vegaScenegraph.boundClip)(mark);\n        return pulse.modifies(\"bounds\");\n    }\n});\nfunction boundItem(item, bound, opt) {\n    return bound(item.bounds.clear(), item, opt);\n}\nconst COUNTER_NAME = \":vega_identifier:\";\n/**\n * Adds a unique identifier to all added tuples.\n * This transform creates a new signal that serves as an id counter.\n * As a result, the id counter is shared across all instances of this\n * transform, generating unique ids across multiple data streams. In\n * addition, this signal value can be included in a snapshot of the\n * dataflow state, enabling correct resumption of id allocation.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {string} params.as - The field name for the generated identifier.\n */ function Identifier(params) {\n    (0, _vegaDataflow.Transform).call(this, 0, params);\n}\nIdentifier.Definition = {\n    \"type\": \"Identifier\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"required\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Identifier, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const counter = getCounter(pulse.dataflow), as = _.as;\n        let id = counter.value;\n        pulse.visit(pulse.ADD, (t)=>t[as] = t[as] || ++id);\n        counter.set(this.value = id);\n        return pulse;\n    }\n});\nfunction getCounter(view) {\n    return view._signals[COUNTER_NAME] || (view._signals[COUNTER_NAME] = view.add(0));\n}\n/**\n * Bind scenegraph items to a scenegraph mark instance.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.markdef - The mark definition for creating the mark.\n *   This is an object of legal scenegraph mark properties which *must* include\n *   the 'marktype' property.\n */ function Mark(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Mark, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        let mark = this.value; // acquire mark on first invocation, bind context and group\n        if (!mark) {\n            mark = pulse.dataflow.scenegraph().mark(_.markdef, lookup(_), _.index);\n            mark.group.context = _.context;\n            if (!_.context.group) _.context.group = mark.group;\n            mark.source = this.source; // point to upstream collector\n            mark.clip = _.clip;\n            mark.interactive = _.interactive;\n            this.value = mark;\n        } // initialize entering items\n        const Init = mark.marktype === Group ? (0, _vegaScenegraph.GroupItem) : (0, _vegaScenegraph.Item);\n        pulse.visit(pulse.ADD, (item)=>Init.call(item, mark)); // update clipping and/or interactive status\n        if (_.modified(\"clip\") || _.modified(\"interactive\")) {\n            mark.clip = _.clip;\n            mark.interactive = !!_.interactive;\n            mark.zdirty = true; // force scenegraph re-eval\n            pulse.reflow();\n        } // bind items array to scenegraph mark\n        mark.items = pulse.source;\n        return pulse;\n    }\n});\nfunction lookup(_) {\n    const g = _.groups, p = _.parent;\n    return g && g.size === 1 ? g.get(Object.keys(g.object)[0]) : g && p ? g.lookup(p) : null;\n}\n/**\n * Analyze items for overlap, changing opacity to hide items with\n * overlapping bounding boxes. This transform will preserve at least\n * two items (e.g., first and last) even if overlap persists.\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator\n *   function for sorting items.\n * @param {object} [params.method] - The overlap removal method to apply.\n *   One of 'parity' (default, hide every other item until there is no\n *   more overlap) or 'greedy' (sequentially scan and hide and items that\n *   overlap with the last visible item).\n * @param {object} [params.boundScale] - A scale whose range should be used\n *   to bound the items. Items exceeding the bounds of the scale range\n *   will be treated as overlapping. If null or undefined, no bounds check\n *   will be applied.\n * @param {object} [params.boundOrient] - The orientation of the scale\n *   (top, bottom, left, or right) used to bound items. This parameter is\n *   ignored if boundScale is null or undefined.\n * @param {object} [params.boundTolerance] - The tolerance in pixels for\n *   bound inclusion testing (default 1). This specifies by how many pixels\n *   an item's bounds may exceed the scale range bounds and not be culled.\n * @constructor\n */ function Overlap(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nconst methods = {\n    parity: (items)=>items.filter((item, i)=>i % 2 ? item.opacity = 0 : 1),\n    greedy: (items, sep)=>{\n        let a;\n        return items.filter((b, i)=>!i || !intersect(a.bounds, b.bounds, sep) ? (a = b, 1) : b.opacity = 0);\n    }\n}; // compute bounding box intersection\n// including padding pixels of separation\nconst intersect = (a, b, sep)=>sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);\nconst hasOverlap = (items, pad)=>{\n    for(var i = 1, n = items.length, a = items[0].bounds, b; i < n; a = b, ++i){\n        if (intersect(a, b = items[i].bounds, pad)) return true;\n    }\n};\nconst hasBounds = (item)=>{\n    const b = item.bounds;\n    return b.width() > 1 && b.height() > 1;\n};\nconst boundTest = (scale, orient, tolerance)=>{\n    var range = scale.range(), b = new (0, _vegaScenegraph.Bounds)();\n    if (orient === Top || orient === Bottom) b.set(range[0], -Infinity, range[1], Infinity);\n    else b.set(-Infinity, range[0], Infinity, range[1]);\n    b.expand(tolerance || 1);\n    return (item)=>b.encloses(item.bounds);\n}; // reset all items to be fully opaque\nconst reset = (source)=>{\n    source.forEach((item)=>item.opacity = 1);\n    return source;\n}; // add all tuples to mod, fork pulse if parameters were modified\n// fork prevents cross-stream tuple pollution (e.g., pulse from scale)\nconst reflow = (pulse, _)=>pulse.reflow(_.modified()).modifies(\"opacity\");\n(0, _vegaUtil.inherits)(Overlap, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const reduce = methods[_.method] || methods.parity, sep = _.separation || 0;\n        let source = pulse.materialize(pulse.SOURCE).source, items, test;\n        if (!source || !source.length) return;\n        if (!_.method) {\n            // early exit if method is falsy\n            if (_.modified(\"method\")) {\n                reset(source);\n                pulse = reflow(pulse, _);\n            }\n            return pulse;\n        } // skip labels with no content\n        source = source.filter(hasBounds); // early exit, nothing to do\n        if (!source.length) return;\n        if (_.sort) source = source.slice().sort(_.sort);\n        items = reset(source);\n        pulse = reflow(pulse, _);\n        if (items.length >= 3 && hasOverlap(items, sep)) {\n            do items = reduce(items, sep);\n            while (items.length >= 3 && hasOverlap(items, sep));\n            if (items.length < 3 && !(0, _vegaUtil.peek)(source).opacity) {\n                if (items.length > 1) (0, _vegaUtil.peek)(items).opacity = 0;\n                (0, _vegaUtil.peek)(source).opacity = 1;\n            }\n        }\n        if (_.boundScale && _.boundTolerance >= 0) {\n            test = boundTest(_.boundScale, _.boundOrient, +_.boundTolerance);\n            source.forEach((item)=>{\n                if (!test(item)) item.opacity = 0;\n            });\n        } // re-calculate mark bounds\n        const bounds = items[0].mark.bounds.clear();\n        source.forEach((item)=>{\n            if (item.opacity) bounds.union(item.bounds);\n        });\n        return pulse;\n    }\n});\n/**\n * Queue modified scenegraph items for rendering.\n * @constructor\n */ function Render(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Render, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const view = pulse.dataflow;\n        pulse.visit(pulse.ALL, (item)=>view.dirty(item)); // set z-index dirty flag as needed\n        if (pulse.fields && pulse.fields[\"zindex\"]) {\n            const item = pulse.source && pulse.source[0];\n            if (item) item.mark.zdirty = true;\n        }\n    }\n});\nconst tempBounds = new (0, _vegaScenegraph.Bounds)();\nfunction set(item, property, value) {\n    return item[property] === value ? 0 : (item[property] = value, 1);\n}\nfunction isYAxis(mark) {\n    var orient = mark.items[0].orient;\n    return orient === Left || orient === Right;\n}\nfunction axisIndices(datum) {\n    let index = +datum.grid;\n    return [\n        datum.ticks ? index++ : -1,\n        datum.labels ? index++ : -1,\n        index + +datum.domain // title index\n    ];\n}\nfunction axisLayout(view, axis, width, height) {\n    var item = axis.items[0], datum = item.datum, delta = item.translate != null ? item.translate : 0.5, orient = item.orient, indices = axisIndices(datum), range = item.range, offset = item.offset, position = item.position, minExtent = item.minExtent, maxExtent = item.maxExtent, title = datum.title && item.items[indices[2]].items[0], titlePadding = item.titlePadding, bounds = item.bounds, dl = title && (0, _vegaScenegraph.multiLineOffset)(title), x = 0, y = 0, i, s;\n    tempBounds.clear().union(bounds);\n    bounds.clear();\n    if ((i = indices[0]) > -1) bounds.union(item.items[i].bounds);\n    if ((i = indices[1]) > -1) bounds.union(item.items[i].bounds); // position axis group and title\n    switch(orient){\n        case Top:\n            x = position || 0;\n            y = -offset;\n            s = Math.max(minExtent, Math.min(maxExtent, -bounds.y1));\n            bounds.add(0, -s).add(range, 0);\n            if (title) axisTitleLayout(view, title, s, titlePadding, dl, 0, -1, bounds);\n            break;\n        case Left:\n            x = -offset;\n            y = position || 0;\n            s = Math.max(minExtent, Math.min(maxExtent, -bounds.x1));\n            bounds.add(-s, 0).add(0, range);\n            if (title) axisTitleLayout(view, title, s, titlePadding, dl, 1, -1, bounds);\n            break;\n        case Right:\n            x = width + offset;\n            y = position || 0;\n            s = Math.max(minExtent, Math.min(maxExtent, bounds.x2));\n            bounds.add(0, 0).add(s, range);\n            if (title) axisTitleLayout(view, title, s, titlePadding, dl, 1, 1, bounds);\n            break;\n        case Bottom:\n            x = position || 0;\n            y = height + offset;\n            s = Math.max(minExtent, Math.min(maxExtent, bounds.y2));\n            bounds.add(0, 0).add(range, s);\n            if (title) axisTitleLayout(view, title, s, titlePadding, 0, 0, 1, bounds);\n            break;\n        default:\n            x = item.x;\n            y = item.y;\n    } // update bounds\n    (0, _vegaScenegraph.boundStroke)(bounds.translate(x, y), item);\n    if (set(item, \"x\", x + delta) | set(item, \"y\", y + delta)) {\n        item.bounds = tempBounds;\n        view.dirty(item);\n        item.bounds = bounds;\n        view.dirty(item);\n    }\n    return item.mark.bounds.clear().union(bounds);\n}\nfunction axisTitleLayout(view, title, offset, pad, dl, isYAxis1, sign, bounds) {\n    const b = title.bounds;\n    if (title.auto) {\n        const v = sign * (offset + dl + pad);\n        let dx = 0, dy = 0;\n        view.dirty(title);\n        isYAxis1 ? dx = (title.x || 0) - (title.x = v) : dy = (title.y || 0) - (title.y = v);\n        title.mark.bounds.clear().union(b.translate(-dx, -dy));\n        view.dirty(title);\n    }\n    bounds.union(b);\n}\nconst min = (a, b)=>Math.floor(Math.min(a, b));\nconst max = (a, b)=>Math.ceil(Math.max(a, b));\nfunction gridLayoutGroups(group) {\n    var groups = group.items, n = groups.length, i = 0, mark, items;\n    const views = {\n        marks: [],\n        rowheaders: [],\n        rowfooters: [],\n        colheaders: [],\n        colfooters: [],\n        rowtitle: null,\n        coltitle: null\n    }; // layout axes, gather legends, collect bounds\n    for(; i < n; ++i){\n        mark = groups[i];\n        items = mark.items;\n        if (mark.marktype === Group) switch(mark.role){\n            case AxisRole:\n            case LegendRole:\n            case TitleRole:\n                break;\n            case RowHeader:\n                views.rowheaders.push(...items);\n                break;\n            case RowFooter:\n                views.rowfooters.push(...items);\n                break;\n            case ColHeader:\n                views.colheaders.push(...items);\n                break;\n            case ColFooter:\n                views.colfooters.push(...items);\n                break;\n            case RowTitle:\n                views.rowtitle = items[0];\n                break;\n            case ColTitle:\n                views.coltitle = items[0];\n                break;\n            default:\n                views.marks.push(...items);\n        }\n    }\n    return views;\n}\nfunction bboxFlush(item) {\n    return new (0, _vegaScenegraph.Bounds)().set(0, 0, item.width || 0, item.height || 0);\n}\nfunction bboxFull(item) {\n    const b = item.bounds.clone();\n    return b.empty() ? b.set(0, 0, 0, 0) : b.translate(-(item.x || 0), -(item.y || 0));\n}\nfunction get(opt, key, d) {\n    const v = (0, _vegaUtil.isObject)(opt) ? opt[key] : opt;\n    return v != null ? v : d !== undefined ? d : 0;\n}\nfunction offsetValue(v) {\n    return v < 0 ? Math.ceil(-v) : 0;\n}\nfunction gridLayout(view, groups, opt) {\n    var dirty = !opt.nodirty, bbox = opt.bounds === Flush ? bboxFlush : bboxFull, bounds = tempBounds.set(0, 0, 0, 0), alignCol = get(opt.align, Column), alignRow = get(opt.align, Row), padCol = get(opt.padding, Column), padRow = get(opt.padding, Row), ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), n = groups.length, xOffset = Array(n), xExtent = Array(ncols), xMax = 0, yOffset = Array(n), yExtent = Array(nrows), yMax = 0, dx = Array(n), dy = Array(n), boxes = Array(n), m, i, c, r, b, g, px, py, x, y, offset;\n    for(i = 0; i < ncols; ++i)xExtent[i] = 0;\n    for(i = 0; i < nrows; ++i)yExtent[i] = 0; // determine offsets for each group\n    for(i = 0; i < n; ++i){\n        g = groups[i];\n        b = boxes[i] = bbox(g);\n        g.x = g.x || 0;\n        dx[i] = 0;\n        g.y = g.y || 0;\n        dy[i] = 0;\n        c = i % ncols;\n        r = ~~(i / ncols);\n        xMax = Math.max(xMax, px = Math.ceil(b.x2));\n        yMax = Math.max(yMax, py = Math.ceil(b.y2));\n        xExtent[c] = Math.max(xExtent[c], px);\n        yExtent[r] = Math.max(yExtent[r], py);\n        xOffset[i] = padCol + offsetValue(b.x1);\n        yOffset[i] = padRow + offsetValue(b.y1);\n        if (dirty) view.dirty(groups[i]);\n    } // set initial alignment offsets\n    for(i = 0; i < n; ++i){\n        if (i % ncols === 0) xOffset[i] = 0;\n        if (i < ncols) yOffset[i] = 0;\n    } // enforce column alignment constraints\n    if (alignCol === Each) for(c = 1; c < ncols; ++c){\n        for(offset = 0, i = c; i < n; i += ncols)if (offset < xOffset[i]) offset = xOffset[i];\n        for(i = c; i < n; i += ncols)xOffset[i] = offset + xExtent[c - 1];\n    }\n    else if (alignCol === All) {\n        for(offset = 0, i = 0; i < n; ++i)if (i % ncols && offset < xOffset[i]) offset = xOffset[i];\n        for(i = 0; i < n; ++i)if (i % ncols) xOffset[i] = offset + xMax;\n    } else {\n        for(alignCol = false, c = 1; c < ncols; ++c)for(i = c; i < n; i += ncols)xOffset[i] += xExtent[c - 1];\n    } // enforce row alignment constraints\n    if (alignRow === Each) for(r = 1; r < nrows; ++r){\n        for(offset = 0, i = r * ncols, m = i + ncols; i < m; ++i)if (offset < yOffset[i]) offset = yOffset[i];\n        for(i = r * ncols; i < m; ++i)yOffset[i] = offset + yExtent[r - 1];\n    }\n    else if (alignRow === All) {\n        for(offset = 0, i = ncols; i < n; ++i)if (offset < yOffset[i]) offset = yOffset[i];\n        for(i = ncols; i < n; ++i)yOffset[i] = offset + yMax;\n    } else {\n        for(alignRow = false, r = 1; r < nrows; ++r)for(i = r * ncols, m = i + ncols; i < m; ++i)yOffset[i] += yExtent[r - 1];\n    } // perform horizontal grid layout\n    for(x = 0, i = 0; i < n; ++i){\n        x = xOffset[i] + (i % ncols ? x : 0);\n        dx[i] += x - groups[i].x;\n    } // perform vertical grid layout\n    for(c = 0; c < ncols; ++c)for(y = 0, i = c; i < n; i += ncols){\n        y += yOffset[i];\n        dy[i] += y - groups[i].y;\n    }\n     // perform horizontal centering\n    if (alignCol && get(opt.center, Column) && nrows > 1) for(i = 0; i < n; ++i){\n        b = alignCol === All ? xMax : xExtent[i % ncols];\n        x = b - boxes[i].x2 - groups[i].x - dx[i];\n        if (x > 0) dx[i] += x / 2;\n    }\n     // perform vertical centering\n    if (alignRow && get(opt.center, Row) && ncols !== 1) for(i = 0; i < n; ++i){\n        b = alignRow === All ? yMax : yExtent[~~(i / ncols)];\n        y = b - boxes[i].y2 - groups[i].y - dy[i];\n        if (y > 0) dy[i] += y / 2;\n    }\n     // position grid relative to anchor\n    for(i = 0; i < n; ++i)bounds.union(boxes[i].translate(dx[i], dy[i]));\n    x = get(opt.anchor, X);\n    y = get(opt.anchor, Y);\n    switch(get(opt.anchor, Column)){\n        case End:\n            x -= bounds.width();\n            break;\n        case Middle:\n            x -= bounds.width() / 2;\n    }\n    switch(get(opt.anchor, Row)){\n        case End:\n            y -= bounds.height();\n            break;\n        case Middle:\n            y -= bounds.height() / 2;\n    }\n    x = Math.round(x);\n    y = Math.round(y); // update mark positions, bounds, dirty\n    bounds.clear();\n    for(i = 0; i < n; ++i)groups[i].mark.bounds.clear();\n    for(i = 0; i < n; ++i){\n        g = groups[i];\n        g.x += dx[i] += x;\n        g.y += dy[i] += y;\n        bounds.union(g.mark.bounds.union(g.bounds.translate(dx[i], dy[i])));\n        if (dirty) view.dirty(g);\n    }\n    return bounds;\n}\nfunction trellisLayout(view, group, opt) {\n    var views = gridLayoutGroups(group), groups = views.marks, bbox = opt.bounds === Flush ? boundFlush : boundFull, off = opt.offset, ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), cells = nrows * ncols, x, y, x2, y2, anchor, band, offset; // -- initial grid layout\n    const bounds = gridLayout(view, groups, opt);\n    if (bounds.empty()) bounds.set(0, 0, 0, 0); // empty grid\n    // -- layout grid headers and footers --\n    // perform row header layout\n    if (views.rowheaders) {\n        band = get(opt.headerBand, Row, null);\n        x = layoutHeaders(view, views.rowheaders, groups, ncols, nrows, -get(off, \"rowHeader\"), min, 0, bbox, \"x1\", 0, ncols, 1, band);\n    } // perform column header layout\n    if (views.colheaders) {\n        band = get(opt.headerBand, Column, null);\n        y = layoutHeaders(view, views.colheaders, groups, ncols, ncols, -get(off, \"columnHeader\"), min, 1, bbox, \"y1\", 0, 1, ncols, band);\n    } // perform row footer layout\n    if (views.rowfooters) {\n        band = get(opt.footerBand, Row, null);\n        x2 = layoutHeaders(view, views.rowfooters, groups, ncols, nrows, get(off, \"rowFooter\"), max, 0, bbox, \"x2\", ncols - 1, ncols, 1, band);\n    } // perform column footer layout\n    if (views.colfooters) {\n        band = get(opt.footerBand, Column, null);\n        y2 = layoutHeaders(view, views.colfooters, groups, ncols, ncols, get(off, \"columnFooter\"), max, 1, bbox, \"y2\", cells - ncols, 1, ncols, band);\n    } // perform row title layout\n    if (views.rowtitle) {\n        anchor = get(opt.titleAnchor, Row);\n        offset = get(off, \"rowTitle\");\n        offset = anchor === End ? x2 + offset : x - offset;\n        band = get(opt.titleBand, Row, 0.5);\n        layoutTitle(view, views.rowtitle, offset, 0, bounds, band);\n    } // perform column title layout\n    if (views.coltitle) {\n        anchor = get(opt.titleAnchor, Column);\n        offset = get(off, \"columnTitle\");\n        offset = anchor === End ? y2 + offset : y - offset;\n        band = get(opt.titleBand, Column, 0.5);\n        layoutTitle(view, views.coltitle, offset, 1, bounds, band);\n    }\n}\nfunction boundFlush(item, field) {\n    return field === \"x1\" ? item.x || 0 : field === \"y1\" ? item.y || 0 : field === \"x2\" ? (item.x || 0) + (item.width || 0) : field === \"y2\" ? (item.y || 0) + (item.height || 0) : undefined;\n}\nfunction boundFull(item, field) {\n    return item.bounds[field];\n}\nfunction layoutHeaders(view, headers, groups, ncols, limit, offset, agg, isX, bound, bf, start, stride, back, band) {\n    var n = groups.length, init = 0, edge = 0, i, j, k, m, b, h, g, x, y; // if no groups, early exit and return 0\n    if (!n) return init; // compute margin\n    for(i = start; i < n; i += stride)if (groups[i]) init = agg(init, bound(groups[i], bf));\n     // if no headers, return margin calculation\n    if (!headers.length) return init; // check if number of headers exceeds number of rows or columns\n    if (headers.length > limit) {\n        view.warn(\"Grid headers exceed limit: \" + limit);\n        headers = headers.slice(0, limit);\n    } // apply offset\n    init += offset; // clear mark bounds for all headers\n    for(j = 0, m = headers.length; j < m; ++j){\n        view.dirty(headers[j]);\n        headers[j].mark.bounds.clear();\n    } // layout each header\n    for(i = start, j = 0, m = headers.length; j < m; ++j, i += stride){\n        h = headers[j];\n        b = h.mark.bounds; // search for nearest group to align to\n        // necessary if table has empty cells\n        for(k = i; k >= 0 && (g = groups[k]) == null; k -= back); // assign coordinates and update bounds\n        if (isX) {\n            x = band == null ? g.x : Math.round(g.bounds.x1 + band * g.bounds.width());\n            y = init;\n        } else {\n            x = init;\n            y = band == null ? g.y : Math.round(g.bounds.y1 + band * g.bounds.height());\n        }\n        b.union(h.bounds.translate(x - (h.x || 0), y - (h.y || 0)));\n        h.x = x;\n        h.y = y;\n        view.dirty(h); // update current edge of layout bounds\n        edge = agg(edge, b[bf]);\n    }\n    return edge;\n}\nfunction layoutTitle(view, g, offset, isX, bounds, band) {\n    if (!g) return;\n    view.dirty(g); // compute title coordinates\n    var x = offset, y = offset;\n    isX ? x = Math.round(bounds.x1 + band * bounds.width()) : y = Math.round(bounds.y1 + band * bounds.height()); // assign coordinates and update bounds\n    g.bounds.translate(x - (g.x || 0), y - (g.y || 0));\n    g.mark.bounds.clear().union(g.bounds);\n    g.x = x;\n    g.y = y; // queue title for redraw\n    view.dirty(g);\n}\nfunction lookup$1(config, orient) {\n    const opt = config[orient] || {};\n    return (key, d)=>opt[key] != null ? opt[key] : config[key] != null ? config[key] : d;\n} // if legends specify offset directly, use the maximum specified value\nfunction offsets(legends, value) {\n    let max1 = -Infinity;\n    legends.forEach((item)=>{\n        if (item.offset != null) max1 = Math.max(max1, item.offset);\n    });\n    return max1 > -Infinity ? max1 : value;\n}\nfunction legendParams(g, orient, config, xb, yb, w, h) {\n    const _ = lookup$1(config, orient), offset = offsets(g, _(\"offset\", 0)), anchor = _(\"anchor\", Start), mult = anchor === End ? 1 : anchor === Middle ? 0.5 : 0;\n    const p = {\n        align: Each,\n        bounds: _(\"bounds\", Flush),\n        columns: _(\"direction\") === \"vertical\" ? 1 : g.length,\n        padding: _(\"margin\", 8),\n        center: _(\"center\"),\n        nodirty: true\n    };\n    switch(orient){\n        case Left:\n            p.anchor = {\n                x: Math.floor(xb.x1) - offset,\n                column: End,\n                y: mult * (h || xb.height() + 2 * xb.y1),\n                row: anchor\n            };\n            break;\n        case Right:\n            p.anchor = {\n                x: Math.ceil(xb.x2) + offset,\n                y: mult * (h || xb.height() + 2 * xb.y1),\n                row: anchor\n            };\n            break;\n        case Top:\n            p.anchor = {\n                y: Math.floor(yb.y1) - offset,\n                row: End,\n                x: mult * (w || yb.width() + 2 * yb.x1),\n                column: anchor\n            };\n            break;\n        case Bottom:\n            p.anchor = {\n                y: Math.ceil(yb.y2) + offset,\n                x: mult * (w || yb.width() + 2 * yb.x1),\n                column: anchor\n            };\n            break;\n        case TopLeft:\n            p.anchor = {\n                x: offset,\n                y: offset\n            };\n            break;\n        case TopRight:\n            p.anchor = {\n                x: w - offset,\n                y: offset,\n                column: End\n            };\n            break;\n        case BottomLeft:\n            p.anchor = {\n                x: offset,\n                y: h - offset,\n                row: End\n            };\n            break;\n        case BottomRight:\n            p.anchor = {\n                x: w - offset,\n                y: h - offset,\n                column: End,\n                row: End\n            };\n            break;\n    }\n    return p;\n}\nfunction legendLayout(view, legend) {\n    var item = legend.items[0], datum = item.datum, orient = item.orient, bounds = item.bounds, x = item.x, y = item.y, w, h; // cache current bounds for later comparison\n    item._bounds ? item._bounds.clear().union(bounds) : item._bounds = bounds.clone();\n    bounds.clear(); // adjust legend to accommodate padding and title\n    legendGroupLayout(view, item, item.items[0].items[0]); // aggregate bounds to determine size, and include origin\n    bounds = legendBounds(item, bounds);\n    w = 2 * item.padding;\n    h = 2 * item.padding;\n    if (!bounds.empty()) {\n        w = Math.ceil(bounds.width() + w);\n        h = Math.ceil(bounds.height() + h);\n    }\n    if (datum.type === Symbols) legendEntryLayout(item.items[0].items[0].items[0].items);\n    if (orient !== None) {\n        item.x = x = 0;\n        item.y = y = 0;\n    }\n    item.width = w;\n    item.height = h;\n    (0, _vegaScenegraph.boundStroke)(bounds.set(x, y, x + w, y + h), item);\n    item.mark.bounds.clear().union(bounds);\n    return item;\n}\nfunction legendBounds(item, b) {\n    // aggregate item bounds\n    item.items.forEach((_)=>b.union(_.bounds)); // anchor to legend origin\n    b.x1 = item.padding;\n    b.y1 = item.padding;\n    return b;\n}\nfunction legendGroupLayout(view, item, entry) {\n    var pad = item.padding, ex = pad - entry.x, ey = pad - entry.y;\n    if (!item.datum.title) {\n        if (ex || ey) translate(view, entry, ex, ey);\n    } else {\n        var title = item.items[1].items[0], anchor = title.anchor, tpad = item.titlePadding || 0, tx = pad - title.x, ty = pad - title.y;\n        switch(title.orient){\n            case Left:\n                ex += Math.ceil(title.bounds.width()) + tpad;\n                break;\n            case Right:\n            case Bottom:\n                break;\n            default:\n                ey += title.bounds.height() + tpad;\n        }\n        if (ex || ey) translate(view, entry, ex, ey);\n        switch(title.orient){\n            case Left:\n                ty += legendTitleOffset(item, entry, title, anchor, 1, 1);\n                break;\n            case Right:\n                tx += legendTitleOffset(item, entry, title, End, 0, 0) + tpad;\n                ty += legendTitleOffset(item, entry, title, anchor, 1, 1);\n                break;\n            case Bottom:\n                tx += legendTitleOffset(item, entry, title, anchor, 0, 0);\n                ty += legendTitleOffset(item, entry, title, End, -1, 0, 1) + tpad;\n                break;\n            default:\n                tx += legendTitleOffset(item, entry, title, anchor, 0, 0);\n        }\n        if (tx || ty) translate(view, title, tx, ty); // translate legend if title pushes into negative coordinates\n        if ((tx = Math.round(title.bounds.x1 - pad)) < 0) {\n            translate(view, entry, -tx, 0);\n            translate(view, title, -tx, 0);\n        }\n    }\n}\nfunction legendTitleOffset(item, entry, title, anchor, y, lr, noBar) {\n    const grad = item.datum.type !== \"symbol\", vgrad = title.datum.vgrad, e = grad && (lr || !vgrad) && !noBar ? entry.items[0] : entry, s = e.bounds[y ? \"y2\" : \"x2\"] - item.padding, u = vgrad && lr ? s : 0, v = vgrad && lr ? 0 : s, o = y <= 0 ? 0 : (0, _vegaScenegraph.multiLineOffset)(title);\n    return Math.round(anchor === Start ? u : anchor === End ? v - o : 0.5 * (s - o));\n}\nfunction translate(view, item, dx, dy) {\n    item.x += dx;\n    item.y += dy;\n    item.bounds.translate(dx, dy);\n    item.mark.bounds.translate(dx, dy);\n    view.dirty(item);\n}\nfunction legendEntryLayout(entries) {\n    // get max widths for each column\n    const widths = entries.reduce((w, g)=>{\n        w[g.column] = Math.max(g.bounds.x2 - g.x, w[g.column] || 0);\n        return w;\n    }, {}); // set dimensions of legend entry groups\n    entries.forEach((g)=>{\n        g.width = widths[g.column];\n        g.height = g.bounds.y2 - g.y;\n    });\n}\nfunction titleLayout(view, mark, width, height, viewBounds) {\n    var group = mark.items[0], frame = group.frame, orient = group.orient, anchor = group.anchor, offset = group.offset, padding = group.padding, title = group.items[0].items[0], subtitle = group.items[1] && group.items[1].items[0], end = orient === Left || orient === Right ? height : width, start = 0, x = 0, y = 0, sx = 0, sy = 0, pos;\n    if (frame !== Group) orient === Left ? (start = viewBounds.y2, end = viewBounds.y1) : orient === Right ? (start = viewBounds.y1, end = viewBounds.y2) : (start = viewBounds.x1, end = viewBounds.x2);\n    else if (orient === Left) start = height, end = 0;\n    pos = anchor === Start ? start : anchor === End ? end : (start + end) / 2;\n    if (subtitle && subtitle.text) {\n        // position subtitle\n        switch(orient){\n            case Top:\n            case Bottom:\n                sy = title.bounds.height() + padding;\n                break;\n            case Left:\n                sx = title.bounds.width() + padding;\n                break;\n            case Right:\n                sx = -title.bounds.width() - padding;\n                break;\n        }\n        tempBounds.clear().union(subtitle.bounds);\n        tempBounds.translate(sx - (subtitle.x || 0), sy - (subtitle.y || 0));\n        if (set(subtitle, \"x\", sx) | set(subtitle, \"y\", sy)) {\n            view.dirty(subtitle);\n            subtitle.bounds.clear().union(tempBounds);\n            subtitle.mark.bounds.clear().union(tempBounds);\n            view.dirty(subtitle);\n        }\n        tempBounds.clear().union(subtitle.bounds);\n    } else tempBounds.clear();\n    tempBounds.union(title.bounds); // position title group\n    switch(orient){\n        case Top:\n            x = pos;\n            y = viewBounds.y1 - tempBounds.height() - offset;\n            break;\n        case Left:\n            x = viewBounds.x1 - tempBounds.width() - offset;\n            y = pos;\n            break;\n        case Right:\n            x = viewBounds.x2 + tempBounds.width() + offset;\n            y = pos;\n            break;\n        case Bottom:\n            x = pos;\n            y = viewBounds.y2 + offset;\n            break;\n        default:\n            x = group.x;\n            y = group.y;\n    }\n    if (set(group, \"x\", x) | set(group, \"y\", y)) {\n        tempBounds.translate(x, y);\n        view.dirty(group);\n        group.bounds.clear().union(tempBounds);\n        mark.bounds.clear().union(tempBounds);\n        view.dirty(group);\n    }\n    return group.bounds;\n}\n/**\n * Layout view elements such as axes and legends.\n * Also performs size adjustments.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.mark - Scenegraph mark of groups to layout.\n */ function ViewLayout(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(ViewLayout, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const view = pulse.dataflow;\n        _.mark.items.forEach((group)=>{\n            if (_.layout) trellisLayout(view, group, _.layout);\n            layoutGroup(view, group, _);\n        });\n        return shouldReflow(_.mark.group) ? pulse.reflow() : pulse;\n    }\n});\nfunction shouldReflow(group) {\n    // We typically should reflow if layout is invoked (#2568), as child items\n    // may have resized and reflow ensures group bounds are re-calculated.\n    // However, legend entries have a special exception to avoid instability.\n    // For example, if a selected legend symbol gains a stroke on hover,\n    // we don't want to re-position subsequent elements in the legend.\n    return group && group.mark.role !== \"legend-entry\";\n}\nfunction layoutGroup(view, group, _) {\n    var items = group.items, width = Math.max(0, group.width || 0), height = Math.max(0, group.height || 0), viewBounds = new (0, _vegaScenegraph.Bounds)().set(0, 0, width, height), xBounds = viewBounds.clone(), yBounds = viewBounds.clone(), legends = [], title, mark, orient, b1, i, n; // layout axes, gather legends, collect bounds\n    for(i = 0, n = items.length; i < n; ++i){\n        mark = items[i];\n        switch(mark.role){\n            case AxisRole:\n                b1 = isYAxis(mark) ? xBounds : yBounds;\n                b1.union(axisLayout(view, mark, width, height));\n                break;\n            case TitleRole:\n                title = mark;\n                break;\n            case LegendRole:\n                legends.push(legendLayout(view, mark));\n                break;\n            case FrameRole:\n            case ScopeRole:\n            case RowHeader:\n            case RowFooter:\n            case RowTitle:\n            case ColHeader:\n            case ColFooter:\n            case ColTitle:\n                xBounds.union(mark.bounds);\n                yBounds.union(mark.bounds);\n                break;\n            default:\n                viewBounds.union(mark.bounds);\n        }\n    } // layout legends, adjust viewBounds\n    if (legends.length) {\n        // group legends by orient\n        const l = {};\n        legends.forEach((item)=>{\n            orient = item.orient || Right;\n            if (orient !== None) (l[orient] || (l[orient] = [])).push(item);\n        }); // perform grid layout for each orient group\n        for(const orient1 in l){\n            const g = l[orient1];\n            gridLayout(view, g, legendParams(g, orient1, _.legends, xBounds, yBounds, width, height));\n        } // update view bounds\n        legends.forEach((item)=>{\n            const b = item.bounds;\n            if (!b.equals(item._bounds)) {\n                item.bounds = item._bounds;\n                view.dirty(item); // dirty previous location\n                item.bounds = b;\n                view.dirty(item);\n            }\n            if (_.autosize && _.autosize.type === Fit) // For autosize fit, incorporate the orthogonal dimension only.\n            // Legends that overrun the chart area will then be clipped;\n            // otherwise the chart area gets reduced to nothing!\n            switch(item.orient){\n                case Left:\n                case Right:\n                    viewBounds.add(b.x1, 0).add(b.x2, 0);\n                    break;\n                case Top:\n                case Bottom:\n                    viewBounds.add(0, b.y1).add(0, b.y2);\n            }\n            else viewBounds.union(b);\n        });\n    } // combine bounding boxes\n    viewBounds.union(xBounds).union(yBounds); // layout title, adjust bounds\n    if (title) viewBounds.union(titleLayout(view, title, width, height, viewBounds));\n     // override aggregated view bounds if content is clipped\n    if (group.clip) viewBounds.set(0, 0, group.width || 0, group.height || 0);\n     // perform size adjustment\n    viewSizeLayout(view, group, viewBounds, _);\n}\nfunction viewSizeLayout(view, group, viewBounds, _) {\n    const auto = _.autosize || {}, type = auto.type;\n    if (view._autosize < 1 || !type) return;\n    let viewWidth = view._width, viewHeight = view._height, width = Math.max(0, group.width || 0), left = Math.max(0, Math.ceil(-viewBounds.x1)), height = Math.max(0, group.height || 0), top = Math.max(0, Math.ceil(-viewBounds.y1));\n    const right = Math.max(0, Math.ceil(viewBounds.x2 - width)), bottom = Math.max(0, Math.ceil(viewBounds.y2 - height));\n    if (auto.contains === Padding) {\n        const padding = view.padding();\n        viewWidth -= padding.left + padding.right;\n        viewHeight -= padding.top + padding.bottom;\n    }\n    if (type === None) {\n        left = 0;\n        top = 0;\n        width = viewWidth;\n        height = viewHeight;\n    } else if (type === Fit) {\n        width = Math.max(0, viewWidth - left - right);\n        height = Math.max(0, viewHeight - top - bottom);\n    } else if (type === FitX) {\n        width = Math.max(0, viewWidth - left - right);\n        viewHeight = height + top + bottom;\n    } else if (type === FitY) {\n        viewWidth = width + left + right;\n        height = Math.max(0, viewHeight - top - bottom);\n    } else if (type === Pad) {\n        viewWidth = width + left + right;\n        viewHeight = height + top + bottom;\n    }\n    view._resizeView(viewWidth, viewHeight, width, height, [\n        left,\n        top\n    ], auto.resize);\n}\n\n},{\"vega-dataflow\":\"3NitK\",\"vega-scenegraph\":\"jattk\",\"vega-util\":\"bApja\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jattk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Bounds\", ()=>Bounds);\nparcelHelpers.export(exports, \"CanvasHandler\", ()=>CanvasHandler);\nparcelHelpers.export(exports, \"CanvasRenderer\", ()=>CanvasRenderer);\nparcelHelpers.export(exports, \"Gradient\", ()=>Gradient);\nparcelHelpers.export(exports, \"GroupItem\", ()=>GroupItem);\nparcelHelpers.export(exports, \"Handler\", ()=>Handler);\nparcelHelpers.export(exports, \"Item\", ()=>Item);\nparcelHelpers.export(exports, \"Marks\", ()=>Marks);\nparcelHelpers.export(exports, \"RenderType\", ()=>RenderType);\nparcelHelpers.export(exports, \"Renderer\", ()=>Renderer);\nparcelHelpers.export(exports, \"ResourceLoader\", ()=>ResourceLoader);\nparcelHelpers.export(exports, \"SVGHandler\", ()=>SVGHandler);\nparcelHelpers.export(exports, \"SVGRenderer\", ()=>SVGRenderer);\nparcelHelpers.export(exports, \"SVGStringRenderer\", ()=>SVGStringRenderer);\nparcelHelpers.export(exports, \"Scenegraph\", ()=>Scenegraph);\nparcelHelpers.export(exports, \"boundClip\", ()=>boundClip);\nparcelHelpers.export(exports, \"boundContext\", ()=>boundContext);\nparcelHelpers.export(exports, \"boundItem\", ()=>boundItem);\nparcelHelpers.export(exports, \"boundMark\", ()=>boundMark);\nparcelHelpers.export(exports, \"boundStroke\", ()=>boundStroke);\nparcelHelpers.export(exports, \"domChild\", ()=>domChild);\nparcelHelpers.export(exports, \"domClear\", ()=>domClear);\nparcelHelpers.export(exports, \"domCreate\", ()=>domCreate);\nparcelHelpers.export(exports, \"domFind\", ()=>domFind);\nparcelHelpers.export(exports, \"font\", ()=>font);\nparcelHelpers.export(exports, \"fontFamily\", ()=>fontFamily);\nparcelHelpers.export(exports, \"fontSize\", ()=>fontSize);\nparcelHelpers.export(exports, \"intersect\", ()=>intersect);\nparcelHelpers.export(exports, \"intersectBoxLine\", ()=>intersectBoxLine);\nparcelHelpers.export(exports, \"intersectPath\", ()=>intersectPath);\nparcelHelpers.export(exports, \"intersectPoint\", ()=>intersectPoint);\nparcelHelpers.export(exports, \"intersectRule\", ()=>intersectRule);\nparcelHelpers.export(exports, \"lineHeight\", ()=>lineHeight);\nparcelHelpers.export(exports, \"markup\", ()=>markup);\nparcelHelpers.export(exports, \"multiLineOffset\", ()=>multiLineOffset);\nparcelHelpers.export(exports, \"pathCurves\", ()=>curves);\nparcelHelpers.export(exports, \"pathEqual\", ()=>pathEqual);\nparcelHelpers.export(exports, \"pathParse\", ()=>pathParse);\nparcelHelpers.export(exports, \"pathRectangle\", ()=>vg_rect);\nparcelHelpers.export(exports, \"pathRender\", ()=>pathRender);\nparcelHelpers.export(exports, \"pathSymbols\", ()=>symbols);\nparcelHelpers.export(exports, \"pathTrail\", ()=>vg_trail);\nparcelHelpers.export(exports, \"point\", ()=>point);\nparcelHelpers.export(exports, \"renderModule\", ()=>renderModule);\nparcelHelpers.export(exports, \"resetSVGClipId\", ()=>resetSVGClipId);\nparcelHelpers.export(exports, \"resetSVGDefIds\", ()=>resetSVGDefIds);\nparcelHelpers.export(exports, \"sceneEqual\", ()=>sceneEqual);\nparcelHelpers.export(exports, \"sceneFromJSON\", ()=>sceneFromJSON);\nparcelHelpers.export(exports, \"scenePickVisit\", ()=>pickVisit);\nparcelHelpers.export(exports, \"sceneToJSON\", ()=>sceneToJSON);\nparcelHelpers.export(exports, \"sceneVisit\", ()=>visit);\nparcelHelpers.export(exports, \"sceneZOrder\", ()=>zorder);\nparcelHelpers.export(exports, \"serializeXML\", ()=>serializeXML);\nparcelHelpers.export(exports, \"textMetrics\", ()=>textMetrics);\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Shape = require(\"d3-shape\");\nvar _d3Path = require(\"d3-path\");\nvar _vegaCanvas = require(\"vega-canvas\");\nvar _vegaLoader = require(\"vega-loader\");\nvar _vegaScale = require(\"vega-scale\");\nlet gradient_id = 0;\nfunction resetSVGGradientId() {\n    gradient_id = 0;\n}\nconst patternPrefix = \"p_\";\nfunction isGradient(value1) {\n    return value1 && value1.gradient;\n}\nfunction gradientRef(g, defs, base1) {\n    const type1 = g.gradient;\n    let id = g.id, prefix = type1 === \"radial\" ? patternPrefix : \"\"; // check id, assign default values as needed\n    if (!id) {\n        id = g.id = \"gradient_\" + gradient_id++;\n        if (type1 === \"radial\") {\n            g.x1 = get(g.x1, 0.5);\n            g.y1 = get(g.y1, 0.5);\n            g.r1 = get(g.r1, 0);\n            g.x2 = get(g.x2, 0.5);\n            g.y2 = get(g.y2, 0.5);\n            g.r2 = get(g.r2, 0.5);\n            prefix = patternPrefix;\n        } else {\n            g.x1 = get(g.x1, 0);\n            g.y1 = get(g.y1, 0);\n            g.x2 = get(g.x2, 1);\n            g.y2 = get(g.y2, 0);\n        }\n    } // register definition\n    defs[id] = g; // return url reference\n    return \"url(\" + (base1 || \"\") + \"#\" + prefix + id + \")\";\n}\nfunction get(val, def1) {\n    return val != null ? val : def1;\n}\nfunction Gradient(p0, p1) {\n    var stops = [], gradient1;\n    return gradient1 = {\n        gradient: \"linear\",\n        x1: p0 ? p0[0] : 0,\n        y1: p0 ? p0[1] : 0,\n        x2: p1 ? p1[0] : 1,\n        y2: p1 ? p1[1] : 0,\n        stops: stops,\n        stop: function(offset1, color1) {\n            stops.push({\n                offset: offset1,\n                color: color1\n            });\n            return gradient1;\n        }\n    };\n}\nconst lookup = {\n    \"basis\": {\n        curve: (0, _d3Shape.curveBasis)\n    },\n    \"basis-closed\": {\n        curve: (0, _d3Shape.curveBasisClosed)\n    },\n    \"basis-open\": {\n        curve: (0, _d3Shape.curveBasisOpen)\n    },\n    \"bundle\": {\n        curve: (0, _d3Shape.curveBundle),\n        tension: \"beta\",\n        value: 0.85\n    },\n    \"cardinal\": {\n        curve: (0, _d3Shape.curveCardinal),\n        tension: \"tension\",\n        value: 0\n    },\n    \"cardinal-open\": {\n        curve: (0, _d3Shape.curveCardinalOpen),\n        tension: \"tension\",\n        value: 0\n    },\n    \"cardinal-closed\": {\n        curve: (0, _d3Shape.curveCardinalClosed),\n        tension: \"tension\",\n        value: 0\n    },\n    \"catmull-rom\": {\n        curve: (0, _d3Shape.curveCatmullRom),\n        tension: \"alpha\",\n        value: 0.5\n    },\n    \"catmull-rom-closed\": {\n        curve: (0, _d3Shape.curveCatmullRomClosed),\n        tension: \"alpha\",\n        value: 0.5\n    },\n    \"catmull-rom-open\": {\n        curve: (0, _d3Shape.curveCatmullRomOpen),\n        tension: \"alpha\",\n        value: 0.5\n    },\n    \"linear\": {\n        curve: (0, _d3Shape.curveLinear)\n    },\n    \"linear-closed\": {\n        curve: (0, _d3Shape.curveLinearClosed)\n    },\n    \"monotone\": {\n        horizontal: (0, _d3Shape.curveMonotoneY),\n        vertical: (0, _d3Shape.curveMonotoneX)\n    },\n    \"natural\": {\n        curve: (0, _d3Shape.curveNatural)\n    },\n    \"step\": {\n        curve: (0, _d3Shape.curveStep)\n    },\n    \"step-after\": {\n        curve: (0, _d3Shape.curveStepAfter)\n    },\n    \"step-before\": {\n        curve: (0, _d3Shape.curveStepBefore)\n    }\n};\nfunction curves(type2, orientation, tension) {\n    var entry = (0, _vegaUtil.hasOwnProperty)(lookup, type2) && lookup[type2], curve = null;\n    if (entry) {\n        curve = entry.curve || entry[orientation || \"vertical\"];\n        if (entry.tension && tension != null) curve = curve[entry.tension](tension);\n    }\n    return curve;\n}\n// Path parsing and rendering code adapted from fabric.js -- Thanks!\nconst cmdlen = {\n    m: 2,\n    l: 2,\n    h: 1,\n    v: 1,\n    c: 6,\n    s: 4,\n    q: 4,\n    t: 2,\n    a: 7\n}, regexp = [\n    /([MLHVCSQTAZmlhvcsqtaz])/g,\n    /###/,\n    /(\\.\\d+)(\\.\\d)/g,\n    /(\\d)([-+])/g,\n    /\\s|,|###/\n];\nfunction pathParse(pathstr) {\n    const result = [];\n    let curr, chunks, parsed, param, cmd, len, i, j, n, m; // First, break path into command sequence\n    const path1 = pathstr.slice().replace(regexp[0], \"###$1\").split(regexp[1]).slice(1); // Next, parse each command in turn\n    for(i = 0, n = path1.length; i < n; ++i){\n        curr = path1[i];\n        chunks = curr.slice(1).trim().replace(regexp[2], \"$1###$2\").replace(regexp[3], \"$1###$2\").split(regexp[4]);\n        cmd = curr.charAt(0);\n        parsed = [\n            cmd\n        ];\n        for(j = 0, m = chunks.length; j < m; ++j)if ((param = +chunks[j]) === param) // not NaN\n        parsed.push(param);\n        len = cmdlen[cmd.toLowerCase()];\n        if (parsed.length - 1 > len) {\n            const m = parsed.length;\n            j = 1;\n            result.push([\n                cmd\n            ].concat(parsed.slice(j, j += len))); // handle implicit lineTo (#2803)\n            cmd = cmd === \"M\" ? \"L\" : cmd === \"m\" ? \"l\" : cmd;\n            for(; j < m; j += len)result.push([\n                cmd\n            ].concat(parsed.slice(j, j + len)));\n        } else result.push(parsed);\n    }\n    return result;\n}\nconst DegToRad = Math.PI / 180;\nconst Epsilon = 1e-14;\nconst HalfPi = Math.PI / 2;\nconst Tau = Math.PI * 2;\nconst HalfSqrt3 = Math.sqrt(3) / 2;\nvar segmentCache = {};\nvar bezierCache = {};\nvar join = [].join; // Copied from Inkscape svgtopdf, thanks!\nfunction segments(x2, y2, rx, ry, large, sweep, rotateX, ox, oy) {\n    const key = join.call(arguments);\n    if (segmentCache[key]) return segmentCache[key];\n    const th = rotateX * DegToRad;\n    const sin_th = Math.sin(th);\n    const cos_th = Math.cos(th);\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n    const px1 = cos_th * (ox - x2) * 0.5 + sin_th * (oy - y2) * 0.5;\n    const py1 = cos_th * (oy - y2) * 0.5 - sin_th * (ox - x2) * 0.5;\n    let pl = px1 * px1 / (rx * rx) + py1 * py1 / (ry * ry);\n    if (pl > 1) {\n        pl = Math.sqrt(pl);\n        rx *= pl;\n        ry *= pl;\n    }\n    const a00 = cos_th / rx;\n    const a01 = sin_th / rx;\n    const a10 = -sin_th / ry;\n    const a11 = cos_th / ry;\n    const x0 = a00 * ox + a01 * oy;\n    const y0 = a10 * ox + a11 * oy;\n    const x1 = a00 * x2 + a01 * y2;\n    const y1 = a10 * x2 + a11 * y2;\n    const d = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0);\n    let sfactor_sq = 1 / d - 0.25;\n    if (sfactor_sq < 0) sfactor_sq = 0;\n    let sfactor = Math.sqrt(sfactor_sq);\n    if (sweep == large) sfactor = -sfactor;\n    const xc = 0.5 * (x0 + x1) - sfactor * (y1 - y0);\n    const yc = 0.5 * (y0 + y1) + sfactor * (x1 - x0);\n    const th0 = Math.atan2(y0 - yc, x0 - xc);\n    const th1 = Math.atan2(y1 - yc, x1 - xc);\n    let th_arc = th1 - th0;\n    if (th_arc < 0 && sweep === 1) th_arc += Tau;\n    else if (th_arc > 0 && sweep === 0) th_arc -= Tau;\n    const segs = Math.ceil(Math.abs(th_arc / (HalfPi + 0.001)));\n    const result = [];\n    for(let i = 0; i < segs; ++i){\n        const th2 = th0 + i * th_arc / segs;\n        const th3 = th0 + (i + 1) * th_arc / segs;\n        result[i] = [\n            xc,\n            yc,\n            th2,\n            th3,\n            rx,\n            ry,\n            sin_th,\n            cos_th\n        ];\n    }\n    return segmentCache[key] = result;\n}\nfunction bezier(params) {\n    const key = join.call(params);\n    if (bezierCache[key]) return bezierCache[key];\n    var cx = params[0], cy = params[1], th0 = params[2], th1 = params[3], rx = params[4], ry = params[5], sin_th = params[6], cos_th = params[7];\n    const a00 = cos_th * rx;\n    const a01 = -sin_th * ry;\n    const a10 = sin_th * rx;\n    const a11 = cos_th * ry;\n    const cos_th0 = Math.cos(th0);\n    const sin_th0 = Math.sin(th0);\n    const cos_th1 = Math.cos(th1);\n    const sin_th1 = Math.sin(th1);\n    const th_half = 0.5 * (th1 - th0);\n    const sin_th_h2 = Math.sin(th_half * 0.5);\n    const t = 8 / 3 * sin_th_h2 * sin_th_h2 / Math.sin(th_half);\n    const x1 = cx + cos_th0 - t * sin_th0;\n    const y1 = cy + sin_th0 + t * cos_th0;\n    const x3 = cx + cos_th1;\n    const y3 = cy + sin_th1;\n    const x2 = x3 + t * sin_th1;\n    const y2 = y3 - t * cos_th1;\n    return bezierCache[key] = [\n        a00 * x1 + a01 * y1,\n        a10 * x1 + a11 * y1,\n        a00 * x2 + a01 * y2,\n        a10 * x2 + a11 * y2,\n        a00 * x3 + a01 * y3,\n        a10 * x3 + a11 * y3\n    ];\n}\nconst temp = [\n    \"l\",\n    0,\n    0,\n    0,\n    0,\n    0,\n    0,\n    0\n];\nfunction scale$1(current, sX, sY) {\n    const c = temp[0] = current[0];\n    if (c === \"a\" || c === \"A\") {\n        temp[1] = sX * current[1];\n        temp[2] = sY * current[2];\n        temp[3] = current[3];\n        temp[4] = current[4];\n        temp[5] = current[5];\n        temp[6] = sX * current[6];\n        temp[7] = sY * current[7];\n    } else if (c === \"h\" || c === \"H\") temp[1] = sX * current[1];\n    else if (c === \"v\" || c === \"V\") temp[1] = sY * current[1];\n    else for(var i = 1, n = current.length; i < n; ++i)temp[i] = (i % 2 == 1 ? sX : sY) * current[i];\n    return temp;\n}\nfunction pathRender(context1, path2, l, t, sX, sY) {\n    var current, // current instruction\n    previous = null, x4 = 0, // current x\n    y4 = 0, // current y\n    controlX = 0, // current control point x\n    controlY = 0, // current control point y\n    tempX, tempY, tempControlX, tempControlY;\n    if (l == null) l = 0;\n    if (t == null) t = 0;\n    if (sX == null) sX = 1;\n    if (sY == null) sY = sX;\n    if (context1.beginPath) context1.beginPath();\n    for(var i = 0, len = path2.length; i < len; ++i){\n        current = path2[i];\n        if (sX !== 1 || sY !== 1) current = scale$1(current, sX, sY);\n        switch(current[0]){\n            // first letter\n            case \"l\":\n                // lineto, relative\n                x4 += current[1];\n                y4 += current[2];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"L\":\n                // lineto, absolute\n                x4 = current[1];\n                y4 = current[2];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"h\":\n                // horizontal lineto, relative\n                x4 += current[1];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"H\":\n                // horizontal lineto, absolute\n                x4 = current[1];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"v\":\n                // vertical lineto, relative\n                y4 += current[1];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"V\":\n                // verical lineto, absolute\n                y4 = current[1];\n                context1.lineTo(x4 + l, y4 + t);\n                break;\n            case \"m\":\n                // moveTo, relative\n                x4 += current[1];\n                y4 += current[2];\n                context1.moveTo(x4 + l, y4 + t);\n                break;\n            case \"M\":\n                // moveTo, absolute\n                x4 = current[1];\n                y4 = current[2];\n                context1.moveTo(x4 + l, y4 + t);\n                break;\n            case \"c\":\n                // bezierCurveTo, relative\n                tempX = x4 + current[5];\n                tempY = y4 + current[6];\n                controlX = x4 + current[3];\n                controlY = y4 + current[4];\n                context1.bezierCurveTo(x4 + current[1] + l, y4 + current[2] + t, controlX + l, controlY + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                break;\n            case \"C\":\n                // bezierCurveTo, absolute\n                x4 = current[5];\n                y4 = current[6];\n                controlX = current[3];\n                controlY = current[4];\n                context1.bezierCurveTo(current[1] + l, current[2] + t, controlX + l, controlY + t, x4 + l, y4 + t);\n                break;\n            case \"s\":\n                // shorthand cubic bezierCurveTo, relative\n                // transform to absolute x,y\n                tempX = x4 + current[3];\n                tempY = y4 + current[4]; // calculate reflection of previous control points\n                controlX = 2 * x4 - controlX;\n                controlY = 2 * y4 - controlY;\n                context1.bezierCurveTo(controlX + l, controlY + t, x4 + current[1] + l, y4 + current[2] + t, tempX + l, tempY + t); // set control point to 2nd one of this command\n                // the first control point is assumed to be the reflection of\n                // the second control point on the previous command relative\n                // to the current point.\n                controlX = x4 + current[1];\n                controlY = y4 + current[2];\n                x4 = tempX;\n                y4 = tempY;\n                break;\n            case \"S\":\n                // shorthand cubic bezierCurveTo, absolute\n                tempX = current[3];\n                tempY = current[4]; // calculate reflection of previous control points\n                controlX = 2 * x4 - controlX;\n                controlY = 2 * y4 - controlY;\n                context1.bezierCurveTo(controlX + l, controlY + t, current[1] + l, current[2] + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY; // set control point to 2nd one of this command\n                // the first control point is assumed to be the reflection of\n                // the second control point on the previous command relative\n                // to the current point.\n                controlX = current[1];\n                controlY = current[2];\n                break;\n            case \"q\":\n                // quadraticCurveTo, relative\n                // transform to absolute x,y\n                tempX = x4 + current[3];\n                tempY = y4 + current[4];\n                controlX = x4 + current[1];\n                controlY = y4 + current[2];\n                context1.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                break;\n            case \"Q\":\n                // quadraticCurveTo, absolute\n                tempX = current[3];\n                tempY = current[4];\n                context1.quadraticCurveTo(current[1] + l, current[2] + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                controlX = current[1];\n                controlY = current[2];\n                break;\n            case \"t\":\n                // shorthand quadraticCurveTo, relative\n                // transform to absolute x,y\n                tempX = x4 + current[1];\n                tempY = y4 + current[2];\n                if (previous[0].match(/[QqTt]/) === null) {\n                    // If there is no previous command or if the previous command was not a Q, q, T or t,\n                    // assume the control point is coincident with the current point\n                    controlX = x4;\n                    controlY = y4;\n                } else if (previous[0] === \"t\") {\n                    // calculate reflection of previous control points for t\n                    controlX = 2 * x4 - tempControlX;\n                    controlY = 2 * y4 - tempControlY;\n                } else if (previous[0] === \"q\") {\n                    // calculate reflection of previous control points for q\n                    controlX = 2 * x4 - controlX;\n                    controlY = 2 * y4 - controlY;\n                }\n                tempControlX = controlX;\n                tempControlY = controlY;\n                context1.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                controlX = x4 + current[1];\n                controlY = y4 + current[2];\n                break;\n            case \"T\":\n                tempX = current[1];\n                tempY = current[2]; // calculate reflection of previous control points\n                controlX = 2 * x4 - controlX;\n                controlY = 2 * y4 - controlY;\n                context1.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n                x4 = tempX;\n                y4 = tempY;\n                break;\n            case \"a\":\n                drawArc(context1, x4 + l, y4 + t, [\n                    current[1],\n                    current[2],\n                    current[3],\n                    current[4],\n                    current[5],\n                    current[6] + x4 + l,\n                    current[7] + y4 + t\n                ]);\n                x4 += current[6];\n                y4 += current[7];\n                break;\n            case \"A\":\n                drawArc(context1, x4 + l, y4 + t, [\n                    current[1],\n                    current[2],\n                    current[3],\n                    current[4],\n                    current[5],\n                    current[6] + l,\n                    current[7] + t\n                ]);\n                x4 = current[6];\n                y4 = current[7];\n                break;\n            case \"z\":\n            case \"Z\":\n                context1.closePath();\n                break;\n        }\n        previous = current;\n    }\n}\nfunction drawArc(context2, x5, y5, coords) {\n    const seg = segments(coords[5], coords[6], coords[0], coords[1], coords[3], coords[4], coords[2], x5, y5);\n    for(let i = 0; i < seg.length; ++i){\n        const bez = bezier(seg[i]);\n        context2.bezierCurveTo(bez[0], bez[1], bez[2], bez[3], bez[4], bez[5]);\n    }\n}\nconst Tan30 = 0.5773502691896257;\nconst builtins = {\n    \"circle\": {\n        draw: function(context3, size) {\n            const r = Math.sqrt(size) / 2;\n            context3.moveTo(r, 0);\n            context3.arc(0, 0, r, 0, Tau);\n        }\n    },\n    \"cross\": {\n        draw: function(context4, size) {\n            var r = Math.sqrt(size) / 2, s = r / 2.5;\n            context4.moveTo(-r, -s);\n            context4.lineTo(-r, s);\n            context4.lineTo(-s, s);\n            context4.lineTo(-s, r);\n            context4.lineTo(s, r);\n            context4.lineTo(s, s);\n            context4.lineTo(r, s);\n            context4.lineTo(r, -s);\n            context4.lineTo(s, -s);\n            context4.lineTo(s, -r);\n            context4.lineTo(-s, -r);\n            context4.lineTo(-s, -s);\n            context4.closePath();\n        }\n    },\n    \"diamond\": {\n        draw: function(context5, size) {\n            const r = Math.sqrt(size) / 2;\n            context5.moveTo(-r, 0);\n            context5.lineTo(0, -r);\n            context5.lineTo(r, 0);\n            context5.lineTo(0, r);\n            context5.closePath();\n        }\n    },\n    \"square\": {\n        draw: function(context6, size) {\n            var w1 = Math.sqrt(size), x6 = -w1 / 2;\n            context6.rect(x6, x6, w1, w1);\n        }\n    },\n    \"arrow\": {\n        draw: function(context7, size) {\n            var r = Math.sqrt(size) / 2, s = r / 7, t = r / 2.5, v = r / 8;\n            context7.moveTo(-s, r);\n            context7.lineTo(s, r);\n            context7.lineTo(s, -v);\n            context7.lineTo(t, -v);\n            context7.lineTo(0, -r);\n            context7.lineTo(-t, -v);\n            context7.lineTo(-s, -v);\n            context7.closePath();\n        }\n    },\n    \"wedge\": {\n        draw: function(context8, size) {\n            var r = Math.sqrt(size) / 2, h1 = HalfSqrt3 * r, o = h1 - r * Tan30, b1 = r / 4;\n            context8.moveTo(0, -h1 - o);\n            context8.lineTo(-b1, h1 - o);\n            context8.lineTo(b1, h1 - o);\n            context8.closePath();\n        }\n    },\n    \"triangle\": {\n        draw: function(context9, size) {\n            var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30;\n            context9.moveTo(0, -h2 - o);\n            context9.lineTo(-r, h2 - o);\n            context9.lineTo(r, h2 - o);\n            context9.closePath();\n        }\n    },\n    \"triangle-up\": {\n        draw: function(context10, size) {\n            var r = Math.sqrt(size) / 2, h3 = HalfSqrt3 * r;\n            context10.moveTo(0, -h3);\n            context10.lineTo(-r, h3);\n            context10.lineTo(r, h3);\n            context10.closePath();\n        }\n    },\n    \"triangle-down\": {\n        draw: function(context11, size) {\n            var r = Math.sqrt(size) / 2, h4 = HalfSqrt3 * r;\n            context11.moveTo(0, h4);\n            context11.lineTo(-r, -h4);\n            context11.lineTo(r, -h4);\n            context11.closePath();\n        }\n    },\n    \"triangle-right\": {\n        draw: function(context12, size) {\n            var r = Math.sqrt(size) / 2, h5 = HalfSqrt3 * r;\n            context12.moveTo(h5, 0);\n            context12.lineTo(-h5, -r);\n            context12.lineTo(-h5, r);\n            context12.closePath();\n        }\n    },\n    \"triangle-left\": {\n        draw: function(context13, size) {\n            var r = Math.sqrt(size) / 2, h6 = HalfSqrt3 * r;\n            context13.moveTo(-h6, 0);\n            context13.lineTo(h6, -r);\n            context13.lineTo(h6, r);\n            context13.closePath();\n        }\n    },\n    \"stroke\": {\n        draw: function(context14, size) {\n            const r = Math.sqrt(size) / 2;\n            context14.moveTo(-r, 0);\n            context14.lineTo(r, 0);\n        }\n    }\n};\nfunction symbols(_) {\n    return (0, _vegaUtil.hasOwnProperty)(builtins, _) ? builtins[_] : customSymbol(_);\n}\nvar custom = {};\nfunction customSymbol(path3) {\n    if (!(0, _vegaUtil.hasOwnProperty)(custom, path3)) {\n        const parsed = pathParse(path3);\n        custom[path3] = {\n            draw: function(context15, size) {\n                pathRender(context15, parsed, 0, 0, Math.sqrt(size) / 2);\n            }\n        };\n    }\n    return custom[path3];\n}\nconst C = 0.448084975506; // C = 1 - c\nfunction rectangleX(d) {\n    return d.x;\n}\nfunction rectangleY(d) {\n    return d.y;\n}\nfunction rectangleWidth(d) {\n    return d.width;\n}\nfunction rectangleHeight(d) {\n    return d.height;\n}\nfunction number(_) {\n    return typeof _ === \"function\" ? _ : ()=>+_;\n}\nfunction clamp(value2, min, max) {\n    return Math.max(min, Math.min(value2, max));\n}\nfunction vg_rect() {\n    var x7 = rectangleX, y6 = rectangleY, width = rectangleWidth, height = rectangleHeight, crTL = number(0), crTR = crTL, crBL = crTL, crBR = crTL, context16 = null;\n    function rectangle1(_, x0, y0) {\n        var buffer, x1 = x0 != null ? x0 : +x7.call(this, _), y1 = y0 != null ? y0 : +y6.call(this, _), w2 = +width.call(this, _), h7 = +height.call(this, _), s = Math.min(w2, h7) / 2, tl1 = clamp(+crTL.call(this, _), 0, s), tr1 = clamp(+crTR.call(this, _), 0, s), bl1 = clamp(+crBL.call(this, _), 0, s), br1 = clamp(+crBR.call(this, _), 0, s);\n        if (!context16) context16 = buffer = (0, _d3Path.path)();\n        if (tl1 <= 0 && tr1 <= 0 && bl1 <= 0 && br1 <= 0) context16.rect(x1, y1, w2, h7);\n        else {\n            var x2 = x1 + w2, y2 = y1 + h7;\n            context16.moveTo(x1 + tl1, y1);\n            context16.lineTo(x2 - tr1, y1);\n            context16.bezierCurveTo(x2 - C * tr1, y1, x2, y1 + C * tr1, x2, y1 + tr1);\n            context16.lineTo(x2, y2 - br1);\n            context16.bezierCurveTo(x2, y2 - C * br1, x2 - C * br1, y2, x2 - br1, y2);\n            context16.lineTo(x1 + bl1, y2);\n            context16.bezierCurveTo(x1 + C * bl1, y2, x1, y2 - C * bl1, x1, y2 - bl1);\n            context16.lineTo(x1, y1 + tl1);\n            context16.bezierCurveTo(x1, y1 + C * tl1, x1 + C * tl1, y1, x1 + tl1, y1);\n            context16.closePath();\n        }\n        if (buffer) {\n            context16 = null;\n            return buffer + \"\" || null;\n        }\n    }\n    rectangle1.x = function(_) {\n        if (arguments.length) {\n            x7 = number(_);\n            return rectangle1;\n        } else return x7;\n    };\n    rectangle1.y = function(_) {\n        if (arguments.length) {\n            y6 = number(_);\n            return rectangle1;\n        } else return y6;\n    };\n    rectangle1.width = function(_) {\n        if (arguments.length) {\n            width = number(_);\n            return rectangle1;\n        } else return width;\n    };\n    rectangle1.height = function(_) {\n        if (arguments.length) {\n            height = number(_);\n            return rectangle1;\n        } else return height;\n    };\n    rectangle1.cornerRadius = function(tl2, tr2, br2, bl2) {\n        if (arguments.length) {\n            crTL = number(tl2);\n            crTR = tr2 != null ? number(tr2) : crTL;\n            crBR = br2 != null ? number(br2) : crTL;\n            crBL = bl2 != null ? number(bl2) : crTR;\n            return rectangle1;\n        } else return crTL;\n    };\n    rectangle1.context = function(_) {\n        if (arguments.length) {\n            context16 = _ == null ? null : _;\n            return rectangle1;\n        } else return context16;\n    };\n    return rectangle1;\n}\nfunction vg_trail() {\n    var x8, y7, size, defined, context17 = null, ready, x1, y1, r1;\n    function point1(x2, y2, w2) {\n        const r2 = w2 / 2;\n        if (ready) {\n            var ux = y1 - y2, uy = x2 - x1;\n            if (ux || uy) {\n                // get normal vector\n                var ud = Math.sqrt(ux * ux + uy * uy), rx = (ux /= ud) * r1, ry = (uy /= ud) * r1, t = Math.atan2(uy, ux); // draw segment\n                context17.moveTo(x1 - rx, y1 - ry);\n                context17.lineTo(x2 - ux * r2, y2 - uy * r2);\n                context17.arc(x2, y2, r2, t - Math.PI, t);\n                context17.lineTo(x1 + rx, y1 + ry);\n                context17.arc(x1, y1, r1, t, t + Math.PI);\n            } else context17.arc(x2, y2, r2, 0, Tau);\n            context17.closePath();\n        } else ready = 1;\n        x1 = x2;\n        y1 = y2;\n        r1 = r2;\n    }\n    function trail1(data) {\n        var i, n = data.length, d, defined0 = false, buffer;\n        if (context17 == null) context17 = buffer = (0, _d3Path.path)();\n        for(i = 0; i <= n; ++i){\n            if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n                if (defined0 = !defined0) ready = 0;\n            }\n            if (defined0) point1(+x8(d, i, data), +y7(d, i, data), +size(d, i, data));\n        }\n        if (buffer) {\n            context17 = null;\n            return buffer + \"\" || null;\n        }\n    }\n    trail1.x = function(_) {\n        if (arguments.length) {\n            x8 = _;\n            return trail1;\n        } else return x8;\n    };\n    trail1.y = function(_) {\n        if (arguments.length) {\n            y7 = _;\n            return trail1;\n        } else return y7;\n    };\n    trail1.size = function(_) {\n        if (arguments.length) {\n            size = _;\n            return trail1;\n        } else return size;\n    };\n    trail1.defined = function(_) {\n        if (arguments.length) {\n            defined = _;\n            return trail1;\n        } else return defined;\n    };\n    trail1.context = function(_) {\n        if (arguments.length) {\n            if (_ == null) context17 = null;\n            else context17 = _;\n            return trail1;\n        } else return context17;\n    };\n    return trail1;\n}\nfunction value$1(a, b2) {\n    return a != null ? a : b2;\n}\nconst x = (item)=>item.x || 0, y = (item)=>item.y || 0, w = (item)=>item.width || 0, h = (item)=>item.height || 0, xw = (item)=>(item.x || 0) + (item.width || 0), yh = (item)=>(item.y || 0) + (item.height || 0), sa = (item)=>item.startAngle || 0, ea = (item)=>item.endAngle || 0, pa = (item)=>item.padAngle || 0, ir = (item)=>item.innerRadius || 0, or = (item)=>item.outerRadius || 0, cr = (item)=>item.cornerRadius || 0, tl = (item)=>value$1(item.cornerRadiusTopLeft, item.cornerRadius) || 0, tr = (item)=>value$1(item.cornerRadiusTopRight, item.cornerRadius) || 0, br = (item)=>value$1(item.cornerRadiusBottomRight, item.cornerRadius) || 0, bl = (item)=>value$1(item.cornerRadiusBottomLeft, item.cornerRadius) || 0, sz = (item)=>value$1(item.size, 64), ts = (item)=>item.size || 1, def = (item)=>!(item.defined === false), type = (item)=>symbols(item.shape || \"circle\");\nconst arcShape = (0, _d3Shape.arc)().startAngle(sa).endAngle(ea).padAngle(pa).innerRadius(ir).outerRadius(or).cornerRadius(cr), areavShape = (0, _d3Shape.area)().x(x).y1(y).y0(yh).defined(def), areahShape = (0, _d3Shape.area)().y(y).x1(x).x0(xw).defined(def), lineShape = (0, _d3Shape.line)().x(x).y(y).defined(def), rectShape = vg_rect().x(x).y(y).width(w).height(h).cornerRadius(tl, tr, br, bl), symbolShape = (0, _d3Shape.symbol)().type(type).size(sz), trailShape = vg_trail().x(x).y(y).defined(def).size(ts);\nfunction hasCornerRadius(item) {\n    return item.cornerRadius || item.cornerRadiusTopLeft || item.cornerRadiusTopRight || item.cornerRadiusBottomRight || item.cornerRadiusBottomLeft;\n}\nfunction arc$1(context18, item) {\n    return arcShape.context(context18)(item);\n}\nfunction area$1(context19, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return (item.orient === \"horizontal\" ? areahShape : areavShape).curve(curves(interp, item.orient, item.tension)).context(context19)(items);\n}\nfunction line$1(context20, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return lineShape.curve(curves(interp, item.orient, item.tension)).context(context20)(items);\n}\nfunction rectangle(context21, item, x9, y8) {\n    return rectShape.context(context21)(item, x9, y8);\n}\nfunction shape$1(context22, item) {\n    return (item.mark.shape || item.shape).context(context22)(item);\n}\nfunction symbol$1(context23, item) {\n    return symbolShape.context(context23)(item);\n}\nfunction trail$1(context24, items) {\n    return trailShape.context(context24)(items);\n}\nvar clip_id = 1;\nfunction resetSVGClipId() {\n    clip_id = 1;\n}\nfunction clip$1(renderer, item, size) {\n    var clip1 = item.clip, defs = renderer._defs, id = item.clip_id || (item.clip_id = \"clip\" + clip_id++), c = defs.clipping[id] || (defs.clipping[id] = {\n        id: id\n    });\n    if ((0, _vegaUtil.isFunction)(clip1)) c.path = clip1(null);\n    else if (hasCornerRadius(size)) c.path = rectangle(null, size, 0, 0);\n    else {\n        c.width = size.width || 0;\n        c.height = size.height || 0;\n    }\n    return \"url(#\" + id + \")\";\n}\nfunction Bounds(b3) {\n    this.clear();\n    if (b3) this.union(b3);\n}\nBounds.prototype = {\n    clone () {\n        return new Bounds(this);\n    },\n    clear () {\n        this.x1 = +Number.MAX_VALUE;\n        this.y1 = +Number.MAX_VALUE;\n        this.x2 = -Number.MAX_VALUE;\n        this.y2 = -Number.MAX_VALUE;\n        return this;\n    },\n    empty () {\n        return this.x1 === +Number.MAX_VALUE && this.y1 === +Number.MAX_VALUE && this.x2 === -Number.MAX_VALUE && this.y2 === -Number.MAX_VALUE;\n    },\n    equals (b4) {\n        return this.x1 === b4.x1 && this.y1 === b4.y1 && this.x2 === b4.x2 && this.y2 === b4.y2;\n    },\n    set (x1, y1, x2, y2) {\n        if (x2 < x1) {\n            this.x2 = x1;\n            this.x1 = x2;\n        } else {\n            this.x1 = x1;\n            this.x2 = x2;\n        }\n        if (y2 < y1) {\n            this.y2 = y1;\n            this.y1 = y2;\n        } else {\n            this.y1 = y1;\n            this.y2 = y2;\n        }\n        return this;\n    },\n    add (x10, y9) {\n        if (x10 < this.x1) this.x1 = x10;\n        if (y9 < this.y1) this.y1 = y9;\n        if (x10 > this.x2) this.x2 = x10;\n        if (y9 > this.y2) this.y2 = y9;\n        return this;\n    },\n    expand (d) {\n        this.x1 -= d;\n        this.y1 -= d;\n        this.x2 += d;\n        this.y2 += d;\n        return this;\n    },\n    round () {\n        this.x1 = Math.floor(this.x1);\n        this.y1 = Math.floor(this.y1);\n        this.x2 = Math.ceil(this.x2);\n        this.y2 = Math.ceil(this.y2);\n        return this;\n    },\n    scale (s) {\n        this.x1 *= s;\n        this.y1 *= s;\n        this.x2 *= s;\n        this.y2 *= s;\n        return this;\n    },\n    translate (dx, dy) {\n        this.x1 += dx;\n        this.x2 += dx;\n        this.y1 += dy;\n        this.y2 += dy;\n        return this;\n    },\n    rotate (angle, x11, y10) {\n        const p = this.rotatedPoints(angle, x11, y10);\n        return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n    },\n    rotatedPoints (angle, x12, y11) {\n        var { x1 , y1 , x2 , y2  } = this, cos = Math.cos(angle), sin = Math.sin(angle), cx = x12 - x12 * cos + y11 * sin, cy = y11 - x12 * sin - y11 * cos;\n        return [\n            cos * x1 - sin * y1 + cx,\n            sin * x1 + cos * y1 + cy,\n            cos * x1 - sin * y2 + cx,\n            sin * x1 + cos * y2 + cy,\n            cos * x2 - sin * y1 + cx,\n            sin * x2 + cos * y1 + cy,\n            cos * x2 - sin * y2 + cx,\n            sin * x2 + cos * y2 + cy\n        ];\n    },\n    union (b5) {\n        if (b5.x1 < this.x1) this.x1 = b5.x1;\n        if (b5.y1 < this.y1) this.y1 = b5.y1;\n        if (b5.x2 > this.x2) this.x2 = b5.x2;\n        if (b5.y2 > this.y2) this.y2 = b5.y2;\n        return this;\n    },\n    intersect (b6) {\n        if (b6.x1 > this.x1) this.x1 = b6.x1;\n        if (b6.y1 > this.y1) this.y1 = b6.y1;\n        if (b6.x2 < this.x2) this.x2 = b6.x2;\n        if (b6.y2 < this.y2) this.y2 = b6.y2;\n        return this;\n    },\n    encloses (b7) {\n        return b7 && this.x1 <= b7.x1 && this.x2 >= b7.x2 && this.y1 <= b7.y1 && this.y2 >= b7.y2;\n    },\n    alignsWith (b8) {\n        return b8 && (this.x1 == b8.x1 || this.x2 == b8.x2 || this.y1 == b8.y1 || this.y2 == b8.y2);\n    },\n    intersects (b9) {\n        return b9 && !(this.x2 < b9.x1 || this.x1 > b9.x2 || this.y2 < b9.y1 || this.y1 > b9.y2);\n    },\n    contains (x13, y12) {\n        return !(x13 < this.x1 || x13 > this.x2 || y12 < this.y1 || y12 > this.y2);\n    },\n    width () {\n        return this.x2 - this.x1;\n    },\n    height () {\n        return this.y2 - this.y1;\n    }\n};\nfunction Item(mark) {\n    this.mark = mark;\n    this.bounds = this.bounds || new Bounds();\n}\nfunction GroupItem(mark) {\n    Item.call(this, mark);\n    this.items = this.items || [];\n}\n(0, _vegaUtil.inherits)(GroupItem, Item);\nfunction ResourceLoader(customLoader) {\n    this._pending = 0;\n    this._loader = customLoader || (0, _vegaLoader.loader)();\n}\nfunction increment(loader) {\n    loader._pending += 1;\n}\nfunction decrement(loader) {\n    loader._pending -= 1;\n}\nResourceLoader.prototype = {\n    pending () {\n        return this._pending;\n    },\n    sanitizeURL (uri) {\n        const loader = this;\n        increment(loader);\n        return loader._loader.sanitize(uri, {\n            context: \"href\"\n        }).then((opt)=>{\n            decrement(loader);\n            return opt;\n        }).catch(()=>{\n            decrement(loader);\n            return null;\n        });\n    },\n    loadImage (uri) {\n        const loader = this, Image = (0, _vegaCanvas.image)();\n        increment(loader);\n        return loader._loader.sanitize(uri, {\n            context: \"image\"\n        }).then((opt)=>{\n            const url = opt.href;\n            if (!url || !Image) throw {\n                url: url\n            };\n            const img = new Image(); // set crossOrigin only if cors is defined; empty string sets anonymous mode\n            // https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/crossOrigin\n            const cors = (0, _vegaUtil.hasOwnProperty)(opt, \"crossOrigin\") ? opt.crossOrigin : \"anonymous\";\n            if (cors != null) img.crossOrigin = cors; // attempt to load image resource\n            img.onload = ()=>decrement(loader);\n            img.onerror = ()=>decrement(loader);\n            img.src = url;\n            return img;\n        }).catch((e)=>{\n            decrement(loader);\n            return {\n                complete: false,\n                width: 0,\n                height: 0,\n                src: e && e.url || \"\"\n            };\n        });\n    },\n    ready () {\n        const loader = this;\n        return new Promise((accept)=>{\n            function poll(value3) {\n                if (!loader.pending()) accept(value3);\n                else setTimeout(()=>{\n                    poll(true);\n                }, 10);\n            }\n            poll(false);\n        });\n    }\n};\nfunction boundStroke(bounds1, item, miter) {\n    if (item.stroke && item.opacity !== 0 && item.strokeOpacity !== 0) {\n        const sw = item.strokeWidth != null ? +item.strokeWidth : 1;\n        bounds1.expand(sw + (miter ? miterAdjustment(item, sw) : 0));\n    }\n    return bounds1;\n}\nfunction miterAdjustment(item, strokeWidth) {\n    // TODO: more sophisticated adjustment? Or miter support in boundContext?\n    return item.strokeJoin && item.strokeJoin !== \"miter\" ? 0 : strokeWidth;\n}\nconst circleThreshold = Tau - 1e-8;\nlet bounds, lx, ly, rot, ma, mb, mc, md;\nconst add = (x14, y13)=>bounds.add(x14, y13);\nconst addL = (x15, y14)=>add(lx = x15, ly = y14);\nconst addX = (x16)=>add(x16, bounds.y1);\nconst addY = (y15)=>add(bounds.x1, y15);\nconst px = (x17, y16)=>ma * x17 + mc * y16;\nconst py = (x18, y17)=>mb * x18 + md * y17;\nconst addp = (x19, y18)=>add(px(x19, y18), py(x19, y18));\nconst addpL = (x20, y19)=>addL(px(x20, y19), py(x20, y19));\nfunction boundContext(_, deg) {\n    bounds = _;\n    if (deg) {\n        rot = deg * DegToRad;\n        ma = md = Math.cos(rot);\n        mb = Math.sin(rot);\n        mc = -mb;\n    } else {\n        ma = md = 1;\n        rot = mb = mc = 0;\n    }\n    return context$1;\n}\nconst context$1 = {\n    beginPath () {},\n    closePath () {},\n    moveTo: addpL,\n    lineTo: addpL,\n    rect (x21, y20, w3, h8) {\n        if (rot) {\n            addp(x21 + w3, y20);\n            addp(x21 + w3, y20 + h8);\n            addp(x21, y20 + h8);\n            addpL(x21, y20);\n        } else {\n            add(x21 + w3, y20 + h8);\n            addL(x21, y20);\n        }\n    },\n    quadraticCurveTo (x1, y1, x2, y2) {\n        const px1 = px(x1, y1), py1 = py(x1, y1), px2 = px(x2, y2), py2 = py(x2, y2);\n        quadExtrema(lx, px1, px2, addX);\n        quadExtrema(ly, py1, py2, addY);\n        addL(px2, py2);\n    },\n    bezierCurveTo (x1, y1, x2, y2, x3, y3) {\n        const px1 = px(x1, y1), py1 = py(x1, y1), px2 = px(x2, y2), py2 = py(x2, y2), px3 = px(x3, y3), py3 = py(x3, y3);\n        cubicExtrema(lx, px1, px2, px3, addX);\n        cubicExtrema(ly, py1, py2, py3, addY);\n        addL(px3, py3);\n    },\n    arc (cx, cy, r, sa1, ea1, ccw) {\n        sa1 += rot;\n        ea1 += rot; // store last point on path\n        lx = r * Math.cos(ea1) + cx;\n        ly = r * Math.sin(ea1) + cy;\n        if (Math.abs(ea1 - sa1) > circleThreshold) {\n            // treat as full circle\n            add(cx - r, cy - r);\n            add(cx + r, cy + r);\n        } else {\n            const update = (a)=>add(r * Math.cos(a) + cx, r * Math.sin(a) + cy);\n            let s, i; // sample end points\n            update(sa1);\n            update(ea1); // sample interior points aligned with 90 degrees\n            if (ea1 !== sa1) {\n                sa1 = sa1 % Tau;\n                if (sa1 < 0) sa1 += Tau;\n                ea1 = ea1 % Tau;\n                if (ea1 < 0) ea1 += Tau;\n                if (ea1 < sa1) {\n                    ccw = !ccw; // flip direction\n                    s = sa1;\n                    sa1 = ea1;\n                    ea1 = s; // swap end-points\n                }\n                if (ccw) {\n                    ea1 -= Tau;\n                    s = sa1 - sa1 % HalfPi;\n                    for(i = 0; i < 4 && s > ea1; ++i, s -= HalfPi)update(s);\n                } else {\n                    s = sa1 - sa1 % HalfPi + HalfPi;\n                    for(i = 0; i < 4 && s < ea1; ++i, s = s + HalfPi)update(s);\n                }\n            }\n        }\n    }\n};\nfunction quadExtrema(x0, x1, x2, cb) {\n    const t = (x0 - x1) / (x0 + x2 - 2 * x1);\n    if (0 < t && t < 1) cb(x0 + (x1 - x0) * t);\n}\nfunction cubicExtrema(x0, x1, x2, x3, cb) {\n    const a = x3 - x0 + 3 * x1 - 3 * x2, b10 = x0 + x2 - 2 * x1, c = x0 - x1;\n    let t0 = 0, t1 = 0, r; // solve for parameter t\n    if (Math.abs(a) > Epsilon) {\n        // quadratic equation\n        r = b10 * b10 + c * a;\n        if (r >= 0) {\n            r = Math.sqrt(r);\n            t0 = (-b10 + r) / a;\n            t1 = (-b10 - r) / a;\n        }\n    } else // linear equation\n    t0 = 0.5 * c / b10;\n     // calculate position\n    if (0 < t0 && t0 < 1) cb(cubic(t0, x0, x1, x2, x3));\n    if (0 < t1 && t1 < 1) cb(cubic(t1, x0, x1, x2, x3));\n}\nfunction cubic(t, x0, x1, x2, x3) {\n    const s = 1 - t, s2 = s * s, t2 = t * t;\n    return s2 * s * x0 + 3 * s2 * t * x1 + 3 * s * t2 * x2 + t2 * t * x3;\n}\nvar context = (context = (0, _vegaCanvas.canvas)(1, 1)) ? context.getContext(\"2d\") : null;\nconst b = new Bounds();\nfunction intersectPath(draw1) {\n    return function(item, brush) {\n        // rely on (inaccurate) bounds intersection if no context\n        if (!context) return true; // add path to offscreen graphics context\n        draw1(context, item); // get bounds intersection region\n        b.clear().union(item.bounds).intersect(brush).round();\n        const { x1 , y1 , x2 , y2  } = b; // iterate over intersection region\n        // perform fine grained inclusion test\n        for(let y21 = y1; y21 <= y2; ++y21)for(let x22 = x1; x22 <= x2; ++x22){\n            if (context.isPointInPath(x22, y21)) return true;\n        }\n         // false if no hits in intersection region\n        return false;\n    };\n}\nfunction intersectPoint(item, box) {\n    return box.contains(item.x || 0, item.y || 0);\n}\nfunction intersectRect(item, box) {\n    const x23 = item.x || 0, y22 = item.y || 0, w4 = item.width || 0, h9 = item.height || 0;\n    return box.intersects(b.set(x23, y22, x23 + w4, y22 + h9));\n}\nfunction intersectRule(item, box) {\n    const x24 = item.x || 0, y23 = item.y || 0, x2 = item.x2 != null ? item.x2 : x24, y2 = item.y2 != null ? item.y2 : y23;\n    return intersectBoxLine(box, x24, y23, x2, y2);\n}\nfunction intersectBoxLine(box, x25, y24, u, v) {\n    const { x1 , y1 , x2 , y2  } = box, dx = u - x25, dy = v - y24;\n    let t0 = 0, t1 = 1, p, q, r, e;\n    for(e = 0; e < 4; ++e){\n        if (e === 0) {\n            p = -dx;\n            q = -(x1 - x25);\n        }\n        if (e === 1) {\n            p = dx;\n            q = x2 - x25;\n        }\n        if (e === 2) {\n            p = -dy;\n            q = -(y1 - y24);\n        }\n        if (e === 3) {\n            p = dy;\n            q = y2 - y24;\n        }\n        if (Math.abs(p) < 1e-10 && q < 0) return false;\n        r = q / p;\n        if (p < 0) {\n            if (r > t1) return false;\n            else if (r > t0) t0 = r;\n        } else if (p > 0) {\n            if (r < t0) return false;\n            else if (r < t1) t1 = r;\n        }\n    }\n    return true;\n}\nfunction blend(context25, item) {\n    context25.globalCompositeOperation = item.blend || \"source-over\";\n}\nfunction value(value4, dflt) {\n    return value4 == null ? dflt : value4;\n}\nfunction addStops(gradient2, stops) {\n    const n = stops.length;\n    for(let i = 0; i < n; ++i)gradient2.addColorStop(stops[i].offset, stops[i].color);\n    return gradient2;\n}\nfunction gradient(context26, spec, bounds2) {\n    const w5 = bounds2.width(), h10 = bounds2.height();\n    let gradient3;\n    if (spec.gradient === \"radial\") gradient3 = context26.createRadialGradient(bounds2.x1 + value(spec.x1, 0.5) * w5, bounds2.y1 + value(spec.y1, 0.5) * h10, Math.max(w5, h10) * value(spec.r1, 0), bounds2.x1 + value(spec.x2, 0.5) * w5, bounds2.y1 + value(spec.y2, 0.5) * h10, Math.max(w5, h10) * value(spec.r2, 0.5));\n    else {\n        // linear gradient\n        const x1 = value(spec.x1, 0), y1 = value(spec.y1, 0), x2 = value(spec.x2, 1), y2 = value(spec.y2, 0);\n        if (x1 === x2 || y1 === y2 || w5 === h10) // axis aligned: use normal gradient\n        gradient3 = context26.createLinearGradient(bounds2.x1 + x1 * w5, bounds2.y1 + y1 * h10, bounds2.x1 + x2 * w5, bounds2.y1 + y2 * h10);\n        else {\n            // not axis aligned: render gradient into a pattern (#2365)\n            // this allows us to use normalized bounding box coordinates\n            const image1 = (0, _vegaCanvas.canvas)(Math.ceil(w5), Math.ceil(h10)), ictx = image1.getContext(\"2d\");\n            ictx.scale(w5, h10);\n            ictx.fillStyle = addStops(ictx.createLinearGradient(x1, y1, x2, y2), spec.stops);\n            ictx.fillRect(0, 0, w5, h10);\n            return context26.createPattern(image1, \"no-repeat\");\n        }\n    }\n    return addStops(gradient3, spec.stops);\n}\nfunction color(context27, item, value5) {\n    return isGradient(value5) ? gradient(context27, value5, item.bounds) : value5;\n}\nfunction fill(context28, item, opacity) {\n    opacity *= item.fillOpacity == null ? 1 : item.fillOpacity;\n    if (opacity > 0) {\n        context28.globalAlpha = opacity;\n        context28.fillStyle = color(context28, item, item.fill);\n        return true;\n    } else return false;\n}\nvar Empty = [];\nfunction stroke(context29, item, opacity) {\n    var lw = (lw = item.strokeWidth) != null ? lw : 1;\n    if (lw <= 0) return false;\n    opacity *= item.strokeOpacity == null ? 1 : item.strokeOpacity;\n    if (opacity > 0) {\n        context29.globalAlpha = opacity;\n        context29.strokeStyle = color(context29, item, item.stroke);\n        context29.lineWidth = lw;\n        context29.lineCap = item.strokeCap || \"butt\";\n        context29.lineJoin = item.strokeJoin || \"miter\";\n        context29.miterLimit = item.strokeMiterLimit || 10;\n        if (context29.setLineDash) {\n            context29.setLineDash(item.strokeDash || Empty);\n            context29.lineDashOffset = item.strokeDashOffset || 0;\n        }\n        return true;\n    } else return false;\n}\nfunction compare(a, b11) {\n    return a.zindex - b11.zindex || a.index - b11.index;\n}\nfunction zorder(scene) {\n    if (!scene.zdirty) return scene.zitems;\n    var items = scene.items, output = [], item, i, n;\n    for(i = 0, n = items.length; i < n; ++i){\n        item = items[i];\n        item.index = i;\n        if (item.zindex) output.push(item);\n    }\n    scene.zdirty = false;\n    return scene.zitems = output.sort(compare);\n}\nfunction visit(scene, visitor) {\n    var items = scene.items, i, n;\n    if (!items || !items.length) return;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) {\n        for(i = 0, n = items.length; i < n; ++i)if (!items[i].zindex) visitor(items[i]);\n        items = zitems;\n    }\n    for(i = 0, n = items.length; i < n; ++i)visitor(items[i]);\n}\nfunction pickVisit(scene, visitor) {\n    var items = scene.items, hit1, i;\n    if (!items || !items.length) return null;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) items = zitems;\n    for(i = items.length; --i >= 0;){\n        if (hit1 = visitor(items[i])) return hit1;\n    }\n    if (items === zitems) {\n        for(items = scene.items, i = items.length; --i >= 0;)if (!items[i].zindex) {\n            if (hit1 = visitor(items[i])) return hit1;\n        }\n    }\n    return null;\n}\nfunction drawAll(path4) {\n    return function(context30, scene, bounds3) {\n        visit(scene, (item)=>{\n            if (!bounds3 || bounds3.intersects(item.bounds)) drawPath(path4, context30, item, item);\n        });\n    };\n}\nfunction drawOne(path5) {\n    return function(context31, scene, bounds4) {\n        if (scene.items.length && (!bounds4 || bounds4.intersects(scene.bounds))) drawPath(path5, context31, scene.items[0], scene.items);\n    };\n}\nfunction drawPath(path6, context32, item, items) {\n    var opacity = item.opacity == null ? 1 : item.opacity;\n    if (opacity === 0) return;\n    if (path6(context32, items)) return;\n    blend(context32, item);\n    if (item.fill && fill(context32, item, opacity)) context32.fill();\n    if (item.stroke && stroke(context32, item, opacity)) context32.stroke();\n}\nfunction pick$1(test) {\n    test = test || (0, _vegaUtil.truthy);\n    return function(context33, scene, x26, y25, gx, gy) {\n        x26 *= context33.pixelRatio;\n        y25 *= context33.pixelRatio;\n        return pickVisit(scene, (item)=>{\n            const b12 = item.bounds; // first hit test against bounding box\n            if (b12 && !b12.contains(gx, gy) || !b12) return; // if in bounding box, perform more careful test\n            if (test(context33, item, x26, y25, gx, gy)) return item;\n        });\n    };\n}\nfunction hitPath(path7, filled) {\n    return function(context34, o, x27, y26) {\n        var item = Array.isArray(o) ? o[0] : o, fill1 = filled == null ? item.fill : filled, stroke1 = item.stroke && context34.isPointInStroke, lw, lc;\n        if (stroke1) {\n            lw = item.strokeWidth;\n            lc = item.strokeCap;\n            context34.lineWidth = lw != null ? lw : 1;\n            context34.lineCap = lc != null ? lc : \"butt\";\n        }\n        return path7(context34, o) ? false : fill1 && context34.isPointInPath(x27, y26) || stroke1 && context34.isPointInStroke(x27, y26);\n    };\n}\nfunction pickPath(path8) {\n    return pick$1(hitPath(path8));\n}\nfunction translate(x28, y27) {\n    return \"translate(\" + x28 + \",\" + y27 + \")\";\n}\nfunction rotate(a) {\n    return \"rotate(\" + a + \")\";\n}\nfunction scale(scaleX, scaleY) {\n    return \"scale(\" + scaleX + \",\" + scaleY + \")\";\n}\nfunction translateItem(item) {\n    return translate(item.x || 0, item.y || 0);\n}\nfunction rotateItem(item) {\n    return translate(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\");\n}\nfunction transformItem(item) {\n    return translate(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\") + (item.scaleX || item.scaleY ? \" \" + scale(item.scaleX || 1, item.scaleY || 1) : \"\");\n}\nfunction markItemPath(type3, shape1, isect) {\n    function attr1(emit1, item) {\n        emit1(\"transform\", rotateItem(item));\n        emit1(\"d\", shape1(null, item));\n    }\n    function bound1(bounds5, item) {\n        shape1(boundContext(bounds5, item.angle), item);\n        return boundStroke(bounds5, item).translate(item.x || 0, item.y || 0);\n    }\n    function draw2(context35, item) {\n        var x29 = item.x || 0, y28 = item.y || 0, a = item.angle || 0;\n        context35.translate(x29, y28);\n        if (a) context35.rotate(a *= DegToRad);\n        context35.beginPath();\n        shape1(context35, item);\n        if (a) context35.rotate(-a);\n        context35.translate(-x29, -y28);\n    }\n    return {\n        type: type3,\n        tag: \"path\",\n        nested: false,\n        attr: attr1,\n        bound: bound1,\n        draw: drawAll(draw2),\n        pick: pickPath(draw2),\n        isect: isect || intersectPath(draw2)\n    };\n}\nvar arc = markItemPath(\"arc\", arc$1);\nfunction pickArea(a, p) {\n    var v = a[0].orient === \"horizontal\" ? p[1] : p[0], z = a[0].orient === \"horizontal\" ? \"y\" : \"x\", i = a.length, min = Infinity, hit2, d;\n    while(--i >= 0){\n        if (a[i].defined === false) continue;\n        d = Math.abs(a[i][z] - v);\n        if (d < min) {\n            min = d;\n            hit2 = a[i];\n        }\n    }\n    return hit2;\n}\nfunction pickLine(a, p) {\n    var t = Math.pow(a[0].strokeWidth || 1, 2), i = a.length, dx, dy, dd;\n    while(--i >= 0){\n        if (a[i].defined === false) continue;\n        dx = a[i].x - p[0];\n        dy = a[i].y - p[1];\n        dd = dx * dx + dy * dy;\n        if (dd < t) return a[i];\n    }\n    return null;\n}\nfunction pickTrail(a, p) {\n    var i = a.length, dx, dy, dd;\n    while(--i >= 0){\n        if (a[i].defined === false) continue;\n        dx = a[i].x - p[0];\n        dy = a[i].y - p[1];\n        dd = dx * dx + dy * dy;\n        dx = a[i].size || 1;\n        if (dd < dx * dx) return a[i];\n    }\n    return null;\n}\nfunction markMultiItemPath(type4, shape2, tip) {\n    function attr2(emit2, item) {\n        var items = item.mark.items;\n        if (items.length) emit2(\"d\", shape2(null, items));\n    }\n    function bound2(bounds6, mark) {\n        var items = mark.items;\n        if (items.length === 0) return bounds6;\n        else {\n            shape2(boundContext(bounds6), items);\n            return boundStroke(bounds6, items[0]);\n        }\n    }\n    function draw3(context36, items) {\n        context36.beginPath();\n        shape2(context36, items);\n    }\n    const hit3 = hitPath(draw3);\n    function pick1(context37, scene, x30, y29, gx, gy) {\n        var items = scene.items, b13 = scene.bounds;\n        if (!items || !items.length || b13 && !b13.contains(gx, gy)) return null;\n        x30 *= context37.pixelRatio;\n        y29 *= context37.pixelRatio;\n        return hit3(context37, items, x30, y29) ? items[0] : null;\n    }\n    return {\n        type: type4,\n        tag: \"path\",\n        nested: true,\n        attr: attr2,\n        bound: bound2,\n        draw: drawOne(draw3),\n        pick: pick1,\n        isect: intersectPoint,\n        tip: tip\n    };\n}\nvar area = markMultiItemPath(\"area\", area$1, pickArea);\nfunction clip(context38, scene) {\n    var clip2 = scene.clip;\n    context38.save();\n    if ((0, _vegaUtil.isFunction)(clip2)) {\n        context38.beginPath();\n        clip2(context38);\n        context38.clip();\n    } else clipGroup(context38, scene.group);\n}\nfunction clipGroup(context39, group1) {\n    context39.beginPath();\n    hasCornerRadius(group1) ? rectangle(context39, group1, 0, 0) : context39.rect(0, 0, group1.width || 0, group1.height || 0);\n    context39.clip();\n}\nfunction offset$1(item) {\n    const sw = value(item.strokeWidth, 1);\n    return item.strokeOffset != null ? item.strokeOffset : item.stroke && sw > 0.5 && sw < 1.5 ? 0.5 - Math.abs(sw - 1) : 0;\n}\nfunction attr$5(emit3, item) {\n    emit3(\"transform\", translateItem(item));\n}\nfunction emitRectangle(emit4, item) {\n    const off = offset$1(item);\n    emit4(\"d\", rectangle(null, item, off, off));\n}\nfunction background(emit5, item) {\n    emit5(\"class\", \"background\");\n    emit5(\"aria-hidden\", true);\n    emitRectangle(emit5, item);\n}\nfunction foreground(emit6, item) {\n    emit6(\"class\", \"foreground\");\n    emit6(\"aria-hidden\", true);\n    if (item.strokeForeground) emitRectangle(emit6, item);\n    else emit6(\"d\", \"\");\n}\nfunction content(emit7, item, renderer) {\n    const url = item.clip ? clip$1(renderer, item, item) : null;\n    emit7(\"clip-path\", url);\n}\nfunction bound$5(bounds7, group2) {\n    if (!group2.clip && group2.items) {\n        const items = group2.items, m = items.length;\n        for(let j = 0; j < m; ++j)bounds7.union(items[j].bounds);\n    }\n    if ((group2.clip || group2.width || group2.height) && !group2.noBound) bounds7.add(0, 0).add(group2.width || 0, group2.height || 0);\n    boundStroke(bounds7, group2);\n    return bounds7.translate(group2.x || 0, group2.y || 0);\n}\nfunction rectanglePath(context40, group3, x31, y30) {\n    const off = offset$1(group3);\n    context40.beginPath();\n    rectangle(context40, group3, (x31 || 0) + off, (y30 || 0) + off);\n}\nconst hitBackground = hitPath(rectanglePath);\nconst hitForeground = hitPath(rectanglePath, false);\nconst hitCorner = hitPath(rectanglePath, true);\nfunction draw$4(context41, scene, bounds8) {\n    visit(scene, (group4)=>{\n        const gx = group4.x || 0, gy = group4.y || 0, fore = group4.strokeForeground, opacity = group4.opacity == null ? 1 : group4.opacity; // draw group background\n        if ((group4.stroke || group4.fill) && opacity) {\n            rectanglePath(context41, group4, gx, gy);\n            blend(context41, group4);\n            if (group4.fill && fill(context41, group4, opacity)) context41.fill();\n            if (group4.stroke && !fore && stroke(context41, group4, opacity)) context41.stroke();\n        } // setup graphics context, set clip and bounds\n        context41.save();\n        context41.translate(gx, gy);\n        if (group4.clip) clipGroup(context41, group4);\n        if (bounds8) bounds8.translate(-gx, -gy); // draw group contents\n        visit(group4, (item)=>{\n            this.draw(context41, item, bounds8);\n        }); // restore graphics context\n        if (bounds8) bounds8.translate(gx, gy);\n        context41.restore(); // draw group foreground\n        if (fore && group4.stroke && opacity) {\n            rectanglePath(context41, group4, gx, gy);\n            blend(context41, group4);\n            if (stroke(context41, group4, opacity)) context41.stroke();\n        }\n    });\n}\nfunction pick(context42, scene, x32, y31, gx, gy) {\n    if (scene.bounds && !scene.bounds.contains(gx, gy) || !scene.items) return null;\n    const cx = x32 * context42.pixelRatio, cy = y31 * context42.pixelRatio;\n    return pickVisit(scene, (group5)=>{\n        let hit4, dx, dy; // first hit test bounding box\n        const b14 = group5.bounds;\n        if (b14 && !b14.contains(gx, gy)) return; // passed bounds check, test rectangular clip\n        dx = group5.x || 0;\n        dy = group5.y || 0;\n        const dw = dx + (group5.width || 0), dh = dy + (group5.height || 0), c = group5.clip;\n        if (c && (gx < dx || gx > dw || gy < dy || gy > dh)) return; // adjust coordinate system\n        context42.save();\n        context42.translate(dx, dy);\n        dx = gx - dx;\n        dy = gy - dy; // test background for rounded corner clip\n        if (c && hasCornerRadius(group5) && !hitCorner(context42, group5, cx, cy)) {\n            context42.restore();\n            return null;\n        }\n        const fore = group5.strokeForeground, ix = scene.interactive !== false; // hit test against group foreground\n        if (ix && fore && group5.stroke && hitForeground(context42, group5, cx, cy)) {\n            context42.restore();\n            return group5;\n        } // hit test against contained marks\n        hit4 = pickVisit(group5, (mark)=>pickMark(mark, dx, dy) ? this.pick(mark, x32, y31, dx, dy) : null); // hit test against group background\n        if (!hit4 && ix && (group5.fill || !fore && group5.stroke) && hitBackground(context42, group5, cx, cy)) hit4 = group5;\n         // restore state and return\n        context42.restore();\n        return hit4 || null;\n    });\n}\nfunction pickMark(mark, x33, y32) {\n    return (mark.interactive !== false || mark.marktype === \"group\") && mark.bounds && mark.bounds.contains(x33, y32);\n}\nvar group = {\n    type: \"group\",\n    tag: \"g\",\n    nested: false,\n    attr: attr$5,\n    bound: bound$5,\n    draw: draw$4,\n    pick: pick,\n    isect: intersectRect,\n    content: content,\n    background: background,\n    foreground: foreground\n};\nvar metadata = {\n    \"xmlns\": \"http://www.w3.org/2000/svg\",\n    \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n    \"version\": \"1.1\"\n};\nfunction getImage(item, renderer) {\n    var image2 = item.image;\n    if (!image2 || item.url && item.url !== image2.url) {\n        image2 = {\n            complete: false,\n            width: 0,\n            height: 0\n        };\n        renderer.loadImage(item.url).then((image3)=>{\n            item.image = image3;\n            item.image.url = item.url;\n        });\n    }\n    return image2;\n}\nfunction imageWidth(item, image4) {\n    return item.width != null ? item.width : !image4 || !image4.width ? 0 : item.aspect !== false && item.height ? item.height * image4.width / image4.height : image4.width;\n}\nfunction imageHeight(item, image5) {\n    return item.height != null ? item.height : !image5 || !image5.height ? 0 : item.aspect !== false && item.width ? item.width * image5.height / image5.width : image5.height;\n}\nfunction imageXOffset(align, w6) {\n    return align === \"center\" ? w6 / 2 : align === \"right\" ? w6 : 0;\n}\nfunction imageYOffset(baseline, h11) {\n    return baseline === \"middle\" ? h11 / 2 : baseline === \"bottom\" ? h11 : 0;\n}\nfunction attr$4(emit8, item, renderer) {\n    const img = getImage(item, renderer), w7 = imageWidth(item, img), h12 = imageHeight(item, img), x34 = (item.x || 0) - imageXOffset(item.align, w7), y33 = (item.y || 0) - imageYOffset(item.baseline, h12), i = !img.src && img.toDataURL ? img.toDataURL() : img.src || \"\";\n    emit8(\"href\", i, metadata[\"xmlns:xlink\"], \"xlink:href\");\n    emit8(\"transform\", translate(x34, y33));\n    emit8(\"width\", w7);\n    emit8(\"height\", h12);\n    emit8(\"preserveAspectRatio\", item.aspect === false ? \"none\" : \"xMidYMid\");\n}\nfunction bound$4(bounds9, item) {\n    const img = item.image, w8 = imageWidth(item, img), h13 = imageHeight(item, img), x35 = (item.x || 0) - imageXOffset(item.align, w8), y34 = (item.y || 0) - imageYOffset(item.baseline, h13);\n    return bounds9.set(x35, y34, x35 + w8, y34 + h13);\n}\nfunction draw$3(context43, scene, bounds10) {\n    visit(scene, (item)=>{\n        if (bounds10 && !bounds10.intersects(item.bounds)) return; // bounds check\n        const img = getImage(item, this);\n        let w9 = imageWidth(item, img);\n        let h14 = imageHeight(item, img);\n        if (w9 === 0 || h14 === 0) return; // early exit\n        let x36 = (item.x || 0) - imageXOffset(item.align, w9), y35 = (item.y || 0) - imageYOffset(item.baseline, h14), opacity, ar0, ar1, t;\n        if (item.aspect !== false) {\n            ar0 = img.width / img.height;\n            ar1 = item.width / item.height;\n            if (ar0 === ar0 && ar1 === ar1 && ar0 !== ar1) {\n                if (ar1 < ar0) {\n                    t = w9 / ar0;\n                    y35 += (h14 - t) / 2;\n                    h14 = t;\n                } else {\n                    t = h14 * ar0;\n                    x36 += (w9 - t) / 2;\n                    w9 = t;\n                }\n            }\n        }\n        if (img.complete || img.toDataURL) {\n            blend(context43, item);\n            context43.globalAlpha = (opacity = item.opacity) != null ? opacity : 1;\n            context43.imageSmoothingEnabled = item.smooth !== false;\n            context43.drawImage(img, x36, y35, w9, h14);\n        }\n    });\n}\nvar image = {\n    type: \"image\",\n    tag: \"image\",\n    nested: false,\n    attr: attr$4,\n    bound: bound$4,\n    draw: draw$3,\n    pick: pick$1(),\n    isect: (0, _vegaUtil.truthy),\n    // bounds check is sufficient\n    get: getImage,\n    xOffset: imageXOffset,\n    yOffset: imageYOffset\n};\nvar line = markMultiItemPath(\"line\", line$1, pickLine);\nfunction attr$3(emit9, item) {\n    var sx = item.scaleX || 1, sy = item.scaleY || 1;\n    if (sx !== 1 || sy !== 1) emit9(\"vector-effect\", \"non-scaling-stroke\");\n    emit9(\"transform\", transformItem(item));\n    emit9(\"d\", item.path);\n}\nfunction path$1(context44, item) {\n    var path9 = item.path;\n    if (path9 == null) return true;\n    var x37 = item.x || 0, y36 = item.y || 0, sx = item.scaleX || 1, sy = item.scaleY || 1, a = (item.angle || 0) * DegToRad, cache = item.pathCache;\n    if (!cache || cache.path !== path9) (item.pathCache = cache = pathParse(path9)).path = path9;\n    if (a && context44.rotate && context44.translate) {\n        context44.translate(x37, y36);\n        context44.rotate(a);\n        pathRender(context44, cache, 0, 0, sx, sy);\n        context44.rotate(-a);\n        context44.translate(-x37, -y36);\n    } else pathRender(context44, cache, x37, y36, sx, sy);\n}\nfunction bound$3(bounds11, item) {\n    return path$1(boundContext(bounds11, item.angle), item) ? bounds11.set(0, 0, 0, 0) : boundStroke(bounds11, item, true);\n}\nvar path$2 = {\n    type: \"path\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$3,\n    bound: bound$3,\n    draw: drawAll(path$1),\n    pick: pickPath(path$1),\n    isect: intersectPath(path$1)\n};\nfunction attr$2(emit10, item) {\n    emit10(\"d\", rectangle(null, item));\n}\nfunction bound$2(bounds12, item) {\n    var x38, y37;\n    return boundStroke(bounds12.set(x38 = item.x || 0, y37 = item.y || 0, x38 + item.width || 0, y37 + item.height || 0), item);\n}\nfunction draw$2(context45, item) {\n    context45.beginPath();\n    rectangle(context45, item);\n}\nvar rect = {\n    type: \"rect\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$2,\n    bound: bound$2,\n    draw: drawAll(draw$2),\n    pick: pickPath(draw$2),\n    isect: intersectRect\n};\nfunction attr$1(emit11, item) {\n    emit11(\"transform\", translateItem(item));\n    emit11(\"x2\", item.x2 != null ? item.x2 - (item.x || 0) : 0);\n    emit11(\"y2\", item.y2 != null ? item.y2 - (item.y || 0) : 0);\n}\nfunction bound$1(bounds13, item) {\n    var x1, y1;\n    return boundStroke(bounds13.set(x1 = item.x || 0, y1 = item.y || 0, item.x2 != null ? item.x2 : x1, item.y2 != null ? item.y2 : y1), item);\n}\nfunction path(context46, item, opacity) {\n    var x1, y1, x2, y2;\n    if (item.stroke && stroke(context46, item, opacity)) {\n        x1 = item.x || 0;\n        y1 = item.y || 0;\n        x2 = item.x2 != null ? item.x2 : x1;\n        y2 = item.y2 != null ? item.y2 : y1;\n        context46.beginPath();\n        context46.moveTo(x1, y1);\n        context46.lineTo(x2, y2);\n        return true;\n    }\n    return false;\n}\nfunction draw$1(context47, scene, bounds14) {\n    visit(scene, (item)=>{\n        if (bounds14 && !bounds14.intersects(item.bounds)) return; // bounds check\n        var opacity = item.opacity == null ? 1 : item.opacity;\n        if (opacity && path(context47, item, opacity)) {\n            blend(context47, item);\n            context47.stroke();\n        }\n    });\n}\nfunction hit$1(context48, item, x39, y38) {\n    if (!context48.isPointInStroke) return false;\n    return path(context48, item, 1) && context48.isPointInStroke(x39, y38);\n}\nvar rule = {\n    type: \"rule\",\n    tag: \"line\",\n    nested: false,\n    attr: attr$1,\n    bound: bound$1,\n    draw: draw$1,\n    pick: pick$1(hit$1),\n    isect: intersectRule\n};\nvar shape = markItemPath(\"shape\", shape$1);\nvar symbol = markItemPath(\"symbol\", symbol$1, intersectPoint);\nconst widthCache = (0, _vegaUtil.lruCache)();\nvar textMetrics = {\n    height: fontSize,\n    measureWidth: measureWidth,\n    estimateWidth: estimateWidth,\n    width: estimateWidth,\n    canvas: useCanvas\n};\nuseCanvas(true);\nfunction useCanvas(use) {\n    textMetrics.width = use && context ? measureWidth : estimateWidth;\n} // make simple estimate if no canvas is available\nfunction estimateWidth(item, text1) {\n    return _estimateWidth(textValue(item, text1), fontSize(item));\n}\nfunction _estimateWidth(text2, currentFontHeight) {\n    return ~~(0.8 * text2.length * currentFontHeight);\n} // measure text width if canvas is available\nfunction measureWidth(item, text3) {\n    return fontSize(item) <= 0 || !(text3 = textValue(item, text3)) ? 0 : _measureWidth(text3, font(item));\n}\nfunction _measureWidth(text4, currentFont) {\n    const key = `(${currentFont}) ${text4}`;\n    let width = widthCache.get(key);\n    if (width === undefined) {\n        context.font = currentFont;\n        width = context.measureText(text4).width;\n        widthCache.set(key, width);\n    }\n    return width;\n}\nfunction fontSize(item) {\n    return item.fontSize != null ? +item.fontSize || 0 : 11;\n}\nfunction lineHeight(item) {\n    return item.lineHeight != null ? item.lineHeight : fontSize(item) + 2;\n}\nfunction lineArray(_) {\n    return (0, _vegaUtil.isArray)(_) ? _.length > 1 ? _ : _[0] : _;\n}\nfunction textLines(item) {\n    return lineArray(item.lineBreak && item.text && !(0, _vegaUtil.isArray)(item.text) ? item.text.split(item.lineBreak) : item.text);\n}\nfunction multiLineOffset(item) {\n    const tl3 = textLines(item);\n    return ((0, _vegaUtil.isArray)(tl3) ? tl3.length - 1 : 0) * lineHeight(item);\n}\nfunction textValue(item, line1) {\n    const text5 = line1 == null ? \"\" : (line1 + \"\").trim();\n    return item.limit > 0 && text5.length ? truncate(item, text5) : text5;\n}\nfunction widthGetter(item) {\n    if (textMetrics.width === measureWidth) {\n        // we are using canvas\n        const currentFont = font(item);\n        return (text6)=>_measureWidth(text6, currentFont);\n    } else {\n        // we are relying on estimates\n        const currentFontHeight = fontSize(item);\n        return (text7)=>_estimateWidth(text7, currentFontHeight);\n    }\n}\nfunction truncate(item, text8) {\n    var limit = +item.limit, width = widthGetter(item);\n    if (width(text8) < limit) return text8;\n    var ellipsis = item.ellipsis || \"\\u2026\", rtl = item.dir === \"rtl\", lo = 0, hi = text8.length, mid;\n    limit -= width(ellipsis);\n    if (rtl) {\n        while(lo < hi){\n            mid = lo + hi >>> 1;\n            if (width(text8.slice(mid)) > limit) lo = mid + 1;\n            else hi = mid;\n        }\n        return ellipsis + text8.slice(lo);\n    } else {\n        while(lo < hi){\n            mid = 1 + (lo + hi >>> 1);\n            if (width(text8.slice(0, mid)) < limit) lo = mid;\n            else hi = mid - 1;\n        }\n        return text8.slice(0, lo) + ellipsis;\n    }\n}\nfunction fontFamily(item, quote) {\n    var font1 = item.font;\n    return (quote && font1 ? String(font1).replace(/\"/g, \"'\") : font1) || \"sans-serif\";\n}\nfunction font(item, quote) {\n    return \"\" + (item.fontStyle ? item.fontStyle + \" \" : \"\") + (item.fontVariant ? item.fontVariant + \" \" : \"\") + (item.fontWeight ? item.fontWeight + \" \" : \"\") + fontSize(item) + \"px \" + fontFamily(item, quote);\n}\nfunction offset(item) {\n    // perform our own font baseline calculation\n    // why? not all browsers support SVG 1.1 'alignment-baseline' :(\n    // this also ensures consistent layout across renderers\n    var baseline = item.baseline, h15 = fontSize(item);\n    return Math.round(baseline === \"top\" ? 0.79 * h15 : baseline === \"middle\" ? 0.30 * h15 : baseline === \"bottom\" ? -0.21 * h15 : baseline === \"line-top\" ? 0.29 * h15 + 0.5 * lineHeight(item) : baseline === \"line-bottom\" ? 0.29 * h15 - 0.5 * lineHeight(item) : 0);\n}\nconst textAlign = {\n    \"left\": \"start\",\n    \"center\": \"middle\",\n    \"right\": \"end\"\n};\nconst tempBounds = new Bounds();\nfunction anchorPoint(item) {\n    var x40 = item.x || 0, y39 = item.y || 0, r = item.radius || 0, t;\n    if (r) {\n        t = (item.theta || 0) - HalfPi;\n        x40 += r * Math.cos(t);\n        y39 += r * Math.sin(t);\n    }\n    tempBounds.x1 = x40;\n    tempBounds.y1 = y39;\n    return tempBounds;\n}\nfunction attr(emit12, item) {\n    var dx = item.dx || 0, dy = (item.dy || 0) + offset(item), p = anchorPoint(item), x41 = p.x1, y40 = p.y1, a = item.angle || 0, t;\n    emit12(\"text-anchor\", textAlign[item.align] || \"start\");\n    if (a) {\n        t = translate(x41, y40) + \" \" + rotate(a);\n        if (dx || dy) t += \" \" + translate(dx, dy);\n    } else t = translate(x41 + dx, y40 + dy);\n    emit12(\"transform\", t);\n}\nfunction bound(bounds15, item, mode) {\n    var h16 = textMetrics.height(item), a = item.align, p = anchorPoint(item), x42 = p.x1, y41 = p.y1, dx = item.dx || 0, dy = (item.dy || 0) + offset(item) - Math.round(0.8 * h16), // use 4/5 offset\n    tl4 = textLines(item), w10; // get dimensions\n    if ((0, _vegaUtil.isArray)(tl4)) {\n        // multi-line text\n        h16 += lineHeight(item) * (tl4.length - 1);\n        w10 = tl4.reduce((w11, t)=>Math.max(w11, textMetrics.width(item, t)), 0);\n    } else // single-line text\n    w10 = textMetrics.width(item, tl4);\n     // horizontal alignment\n    if (a === \"center\") dx -= w10 / 2;\n    else if (a === \"right\") dx -= w10;\n    bounds15.set(dx += x42, dy += y41, dx + w10, dy + h16);\n    if (item.angle && !mode) bounds15.rotate(item.angle * DegToRad, x42, y41);\n    else if (mode === 2) return bounds15.rotatedPoints(item.angle * DegToRad, x42, y41);\n    return bounds15;\n}\nfunction draw(context49, scene, bounds16) {\n    visit(scene, (item)=>{\n        var opacity = item.opacity == null ? 1 : item.opacity, p, x43, y42, i, lh, tl5, str;\n        if (bounds16 && !bounds16.intersects(item.bounds) || opacity === 0 || item.fontSize <= 0 || item.text == null || item.text.length === 0) return;\n        context49.font = font(item);\n        context49.textAlign = item.align || \"left\";\n        p = anchorPoint(item);\n        x43 = p.x1, y42 = p.y1;\n        if (item.angle) {\n            context49.save();\n            context49.translate(x43, y42);\n            context49.rotate(item.angle * DegToRad);\n            x43 = y42 = 0; // reset x, y\n        }\n        x43 += item.dx || 0;\n        y42 += (item.dy || 0) + offset(item);\n        tl5 = textLines(item);\n        blend(context49, item);\n        if ((0, _vegaUtil.isArray)(tl5)) {\n            lh = lineHeight(item);\n            for(i = 0; i < tl5.length; ++i){\n                str = textValue(item, tl5[i]);\n                if (item.fill && fill(context49, item, opacity)) context49.fillText(str, x43, y42);\n                if (item.stroke && stroke(context49, item, opacity)) context49.strokeText(str, x43, y42);\n                y42 += lh;\n            }\n        } else {\n            str = textValue(item, tl5);\n            if (item.fill && fill(context49, item, opacity)) context49.fillText(str, x43, y42);\n            if (item.stroke && stroke(context49, item, opacity)) context49.strokeText(str, x43, y42);\n        }\n        if (item.angle) context49.restore();\n    });\n}\nfunction hit(context, item, x, y, gx, gy) {\n    if (item.fontSize <= 0) return false;\n    if (!item.angle) return true; // bounds sufficient if no rotation\n    // project point into space of unrotated bounds\n    var p = anchorPoint(item), ax = p.x1, ay = p.y1, b15 = bound(tempBounds, item, 1), a = -item.angle * DegToRad, cos = Math.cos(a), sin = Math.sin(a), px4 = cos * gx - sin * gy + (ax - cos * ax + sin * ay), py4 = sin * gx + cos * gy + (ay - sin * ax - cos * ay);\n    return b15.contains(px4, py4);\n}\nfunction intersectText(item, box) {\n    const p = bound(tempBounds, item, 2);\n    return intersectBoxLine(box, p[0], p[1], p[2], p[3]) || intersectBoxLine(box, p[0], p[1], p[4], p[5]) || intersectBoxLine(box, p[4], p[5], p[6], p[7]) || intersectBoxLine(box, p[2], p[3], p[6], p[7]);\n}\nvar text = {\n    type: \"text\",\n    tag: \"text\",\n    nested: false,\n    attr: attr,\n    bound: bound,\n    draw: draw,\n    pick: pick$1(hit),\n    isect: intersectText\n};\nvar trail = markMultiItemPath(\"trail\", trail$1, pickTrail);\nvar Marks = {\n    arc: arc,\n    area: area,\n    group: group,\n    image: image,\n    line: line,\n    path: path$2,\n    rect: rect,\n    rule: rule,\n    shape: shape,\n    symbol: symbol,\n    text: text,\n    trail: trail\n};\nfunction boundItem(item, func, opt) {\n    var type5 = Marks[item.mark.marktype], bound3 = func || type5.bound;\n    if (type5.nested) item = item.mark;\n    return bound3(item.bounds || (item.bounds = new Bounds()), item, opt);\n}\nvar DUMMY = {\n    mark: null\n};\nfunction boundMark(mark, bounds17, opt) {\n    var type6 = Marks[mark.marktype], bound4 = type6.bound, items = mark.items, hasItems = items && items.length, i, n, item, b16;\n    if (type6.nested) {\n        if (hasItems) item = items[0];\n        else {\n            // no items, fake it\n            DUMMY.mark = mark;\n            item = DUMMY;\n        }\n        b16 = boundItem(item, bound4, opt);\n        bounds17 = bounds17 && bounds17.union(b16) || b16;\n        return bounds17;\n    }\n    bounds17 = bounds17 || mark.bounds && mark.bounds.clear() || new Bounds();\n    if (hasItems) for(i = 0, n = items.length; i < n; ++i)bounds17.union(boundItem(items[i], bound4, opt));\n    return mark.bounds = bounds17;\n}\nconst keys = [\n    \"marktype\",\n    \"name\",\n    \"role\",\n    \"interactive\",\n    \"clip\",\n    \"items\",\n    \"zindex\",\n    \"x\",\n    \"y\",\n    \"width\",\n    \"height\",\n    \"align\",\n    \"baseline\",\n    \"fill\",\n    \"fillOpacity\",\n    \"opacity\",\n    \"blend\",\n    \"stroke\",\n    \"strokeOpacity\",\n    \"strokeWidth\",\n    \"strokeCap\",\n    \"strokeDash\",\n    \"strokeDashOffset\",\n    \"strokeForeground\",\n    \"strokeOffset\",\n    \"startAngle\",\n    \"endAngle\",\n    \"innerRadius\",\n    \"outerRadius\",\n    \"cornerRadius\",\n    \"padAngle\",\n    \"cornerRadiusTopLeft\",\n    \"cornerRadiusTopRight\",\n    \"cornerRadiusBottomLeft\",\n    \"cornerRadiusBottomRight\",\n    \"interpolate\",\n    \"tension\",\n    \"orient\",\n    \"defined\",\n    \"url\",\n    \"aspect\",\n    \"smooth\",\n    \"path\",\n    \"scaleX\",\n    \"scaleY\",\n    \"x2\",\n    \"y2\",\n    \"size\",\n    \"shape\",\n    \"text\",\n    \"angle\",\n    \"theta\",\n    \"radius\",\n    \"dir\",\n    \"dx\",\n    \"dy\",\n    \"ellipsis\",\n    \"limit\",\n    \"lineBreak\",\n    \"lineHeight\",\n    \"font\",\n    \"fontSize\",\n    \"fontWeight\",\n    \"fontStyle\",\n    \"fontVariant\",\n    \"description\",\n    \"aria\",\n    \"ariaRole\",\n    \"ariaRoleDescription\" // aria\n];\nfunction sceneToJSON(scene, indent) {\n    return JSON.stringify(scene, keys, indent);\n}\nfunction sceneFromJSON(json) {\n    const scene = typeof json === \"string\" ? JSON.parse(json) : json;\n    return initialize(scene);\n}\nfunction initialize(scene) {\n    var type7 = scene.marktype, items = scene.items, parent, i, n;\n    if (items) for(i = 0, n = items.length; i < n; ++i){\n        parent = type7 ? \"mark\" : \"group\";\n        items[i][parent] = scene;\n        if (items[i].zindex) items[i][parent].zdirty = true;\n        if (\"group\" === (type7 || parent)) initialize(items[i]);\n    }\n    if (type7) boundMark(scene);\n    return scene;\n}\nfunction Scenegraph(scene) {\n    if (arguments.length) this.root = sceneFromJSON(scene);\n    else {\n        this.root = createMark({\n            marktype: \"group\",\n            name: \"root\",\n            role: \"frame\"\n        });\n        this.root.items = [\n            new GroupItem(this.root)\n        ];\n    }\n}\nScenegraph.prototype = {\n    toJSON (indent) {\n        return sceneToJSON(this.root, indent || 0);\n    },\n    mark (markdef, group6, index) {\n        group6 = group6 || this.root.items[0];\n        const mark = createMark(markdef, group6);\n        group6.items[index] = mark;\n        if (mark.zindex) mark.group.zdirty = true;\n        return mark;\n    }\n};\nfunction createMark(def2, group7) {\n    const mark = {\n        bounds: new Bounds(),\n        clip: !!def2.clip,\n        group: group7,\n        interactive: def2.interactive === false ? false : true,\n        items: [],\n        marktype: def2.marktype,\n        name: def2.name || undefined,\n        role: def2.role || undefined,\n        zindex: def2.zindex || 0\n    }; // add accessibility properties if defined\n    if (def2.aria != null) mark.aria = def2.aria;\n    if (def2.description) mark.description = def2.description;\n    return mark;\n}\n// create a new DOM element\nfunction domCreate(doc, tag, ns) {\n    if (!doc && typeof document !== \"undefined\" && document.createElement) doc = document;\n    return doc ? ns ? doc.createElementNS(ns, tag) : doc.createElement(tag) : null;\n} // find first child element with matching tag\nfunction domFind(el, tag) {\n    tag = tag.toLowerCase();\n    var nodes = el.childNodes, i = 0, n = nodes.length;\n    for(; i < n; ++i)if (nodes[i].tagName.toLowerCase() === tag) return nodes[i];\n} // retrieve child element at given index\n// create & insert if doesn't exist or if tags do not match\nfunction domChild(el, index, tag, ns) {\n    var a = el.childNodes[index], b17;\n    if (!a || a.tagName.toLowerCase() !== tag.toLowerCase()) {\n        b17 = a || null;\n        a = domCreate(el.ownerDocument, tag, ns);\n        el.insertBefore(a, b17);\n    }\n    return a;\n} // remove all child elements at or above the given index\nfunction domClear(el, index) {\n    var nodes = el.childNodes, curr = nodes.length;\n    while(curr > index)el.removeChild(nodes[--curr]);\n    return el;\n} // generate css class name for mark\nfunction cssClass(mark) {\n    return \"mark-\" + mark.marktype + (mark.role ? \" role-\" + mark.role : \"\") + (mark.name ? \" \" + mark.name : \"\");\n}\nfunction point(event, el) {\n    const rect1 = el.getBoundingClientRect();\n    return [\n        event.clientX - rect1.left - (el.clientLeft || 0),\n        event.clientY - rect1.top - (el.clientTop || 0)\n    ];\n}\nfunction resolveItem(item, event, el, origin) {\n    var mark = item && item.mark, mdef, p;\n    if (mark && (mdef = Marks[mark.marktype]).tip) {\n        p = point(event, el);\n        p[0] -= origin[0];\n        p[1] -= origin[1];\n        while(item = item.mark.group){\n            p[0] -= item.x || 0;\n            p[1] -= item.y || 0;\n        }\n        item = mdef.tip(mark.items, p);\n    }\n    return item;\n}\n/**\n * Create a new Handler instance.\n * @param {object} [customLoader] - Optional loader instance for\n *   href URL sanitization. If not specified, a standard loader\n *   instance will be generated.\n * @param {function} [customTooltip] - Optional tooltip handler\n *   function for custom tooltip display.\n * @constructor\n */ function Handler(customLoader, customTooltip) {\n    this._active = null;\n    this._handlers = {};\n    this._loader = customLoader || (0, _vegaLoader.loader)();\n    this._tooltip = customTooltip || defaultTooltip;\n} // The default tooltip display handler.\n// Sets the HTML title attribute on the visualization container.\nfunction defaultTooltip(handler, event, item, value6) {\n    handler.element().setAttribute(\"title\", value6 || \"\");\n}\nHandler.prototype = {\n    /**\n   * Initialize a new Handler instance.\n   * @param {DOMElement} el - The containing DOM element for the display.\n   * @param {Array<number>} origin - The origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {object} [obj] - Optional context object that should serve as\n   *   the \"this\" context for event callbacks.\n   * @return {Handler} - This handler instance.\n   */ initialize (el, origin, obj) {\n        this._el = el;\n        this._obj = obj || null;\n        return this.origin(origin);\n    },\n    /**\n   * Returns the parent container element for a visualization.\n   * @return {DOMElement} - The containing DOM element.\n   */ element () {\n        return this._el;\n    },\n    /**\n   * Returns the scene element (e.g., canvas or SVG) of the visualization\n   * Subclasses must override if the first child is not the scene element.\n   * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n   */ canvas () {\n        return this._el && this._el.firstChild;\n    },\n    /**\n   * Get / set the origin coordinates of the visualization.\n   */ origin (origin) {\n        if (arguments.length) {\n            this._origin = origin || [\n                0,\n                0\n            ];\n            return this;\n        } else return this._origin.slice();\n    },\n    /**\n   * Get / set the scenegraph root.\n   */ scene (scene) {\n        if (!arguments.length) return this._scene;\n        this._scene = scene;\n        return this;\n    },\n    /**\n   * Add an event handler. Subclasses should override this method.\n   */ on () /*type, handler*/ {},\n    /**\n   * Remove an event handler. Subclasses should override this method.\n   */ off () /*type, handler*/ {},\n    /**\n   * Utility method for finding the array index of an event handler.\n   * @param {Array} h - An array of registered event handlers.\n   * @param {string} type - The event type.\n   * @param {function} handler - The event handler instance to find.\n   * @return {number} - The handler's array index or -1 if not registered.\n   */ _handlerIndex (h17, type8, handler) {\n        for(let i = h17 ? h17.length : 0; --i >= 0;){\n            if (h17[i].type === type8 && (!handler || h17[i].handler === handler)) return i;\n        }\n        return -1;\n    },\n    /**\n   * Returns an array with registered event handlers.\n   * @param {string} [type] - The event type to query. Any annotations\n   *   are ignored; for example, for the argument \"click.foo\", \".foo\" will\n   *   be ignored and the method returns all \"click\" handlers. If type is\n   *   null or unspecified, this method returns handlers for all types.\n   * @return {Array} - A new array containing all registered event handlers.\n   */ handlers (type9) {\n        const h18 = this._handlers, a = [];\n        if (type9) a.push(...h18[this.eventName(type9)]);\n        else for(const k in h18)a.push(...h18[k]);\n        return a;\n    },\n    /**\n   * Parses an event name string to return the specific event type.\n   * For example, given \"click.foo\" returns \"click\"\n   * @param {string} name - The input event type string.\n   * @return {string} - A string with the event type only.\n   */ eventName (name) {\n        const i = name.indexOf(\".\");\n        return i < 0 ? name : name.slice(0, i);\n    },\n    /**\n   * Handle hyperlink navigation in response to an item.href value.\n   * @param {Event} event - The event triggering hyperlink navigation.\n   * @param {Item} item - The scenegraph item.\n   * @param {string} href - The URL to navigate to.\n   */ handleHref (event, item, href1) {\n        this._loader.sanitize(href1, {\n            context: \"href\"\n        }).then((opt)=>{\n            const e = new MouseEvent(event.type, event), a = domCreate(null, \"a\");\n            for(const name in opt)a.setAttribute(name, opt[name]);\n            a.dispatchEvent(e);\n        }).catch(()=>{\n        /* do nothing */ });\n    },\n    /**\n   * Handle tooltip display in response to an item.tooltip value.\n   * @param {Event} event - The event triggering tooltip display.\n   * @param {Item} item - The scenegraph item.\n   * @param {boolean} show - A boolean flag indicating whether\n   *   to show or hide a tooltip for the given item.\n   */ handleTooltip (event, item, show) {\n        if (item && item.tooltip != null) {\n            item = resolveItem(item, event, this.canvas(), this._origin);\n            const value7 = show && item && item.tooltip || null;\n            this._tooltip.call(this._obj, this, event, item, value7);\n        }\n    },\n    /**\n   * Returns the size of a scenegraph item and its position relative\n   * to the viewport.\n   * @param {Item} item - The scenegraph item.\n   * @return {object} - A bounding box object (compatible with the\n   *   DOMRect type) consisting of x, y, width, heigh, top, left,\n   *   right, and bottom properties.\n   */ getItemBoundingClientRect (item) {\n        const el = this.canvas();\n        if (!el) return;\n        const rect2 = el.getBoundingClientRect(), origin = this._origin, bounds18 = item.bounds, width = bounds18.width(), height = bounds18.height();\n        let x44 = bounds18.x1 + origin[0] + rect2.left, y43 = bounds18.y1 + origin[1] + rect2.top; // translate coordinate for each parent group\n        while(item.mark && (item = item.mark.group)){\n            x44 += item.x || 0;\n            y43 += item.y || 0;\n        } // return DOMRect-compatible bounding box\n        return {\n            x: x44,\n            y: y43,\n            width,\n            height,\n            left: x44,\n            top: y43,\n            right: x44 + width,\n            bottom: y43 + height\n        };\n    }\n};\n/**\n * Create a new Renderer instance.\n * @param {object} [loader] - Optional loader instance for\n *   image and href URL sanitization. If not specified, a\n *   standard loader instance will be generated.\n * @constructor\n */ function Renderer(loader) {\n    this._el = null;\n    this._bgcolor = null;\n    this._loader = new ResourceLoader(loader);\n}\nRenderer.prototype = {\n    /**\n   * Initialize a new Renderer instance.\n   * @param {DOMElement} el - The containing DOM element for the display.\n   * @param {number} width - The coordinate width of the display, in pixels.\n   * @param {number} height - The coordinate height of the display, in pixels.\n   * @param {Array<number>} origin - The origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n   *   the width and height to determine the final pixel size.\n   * @return {Renderer} - This renderer instance.\n   */ initialize (el, width, height, origin, scaleFactor) {\n        this._el = el;\n        return this.resize(width, height, origin, scaleFactor);\n    },\n    /**\n   * Returns the parent container element for a visualization.\n   * @return {DOMElement} - The containing DOM element.\n   */ element () {\n        return this._el;\n    },\n    /**\n   * Returns the scene element (e.g., canvas or SVG) of the visualization\n   * Subclasses must override if the first child is not the scene element.\n   * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n   */ canvas () {\n        return this._el && this._el.firstChild;\n    },\n    /**\n   * Get / set the background color.\n   */ background (bgcolor) {\n        if (arguments.length === 0) return this._bgcolor;\n        this._bgcolor = bgcolor;\n        return this;\n    },\n    /**\n   * Resize the display.\n   * @param {number} width - The new coordinate width of the display, in pixels.\n   * @param {number} height - The new coordinate height of the display, in pixels.\n   * @param {Array<number>} origin - The new origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n   *   the width and height to determine the final pixel size.\n   * @return {Renderer} - This renderer instance;\n   */ resize (width, height, origin, scaleFactor) {\n        this._width = width;\n        this._height = height;\n        this._origin = origin || [\n            0,\n            0\n        ];\n        this._scale = scaleFactor || 1;\n        return this;\n    },\n    /**\n   * Report a dirty item whose bounds should be redrawn.\n   * This base class method does nothing. Subclasses that perform\n   * incremental should implement this method.\n   * @param {Item} item - The dirty item whose bounds should be redrawn.\n   */ dirty () /*item*/ {},\n    /**\n   * Render an input scenegraph, potentially with a set of dirty items.\n   * This method will perform an immediate rendering with available resources.\n   * The renderer may also need to perform image loading to perform a complete\n   * render. This process can lead to asynchronous re-rendering of the scene\n   * after this method returns. To receive notification when rendering is\n   * complete, use the renderAsync method instead.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   * @return {Renderer} - This renderer instance.\n   */ render (scene) {\n        const r = this; // bind arguments into a render call, and cache it\n        // this function may be subsequently called for async redraw\n        r._call = function() {\n            r._render(scene);\n        }; // invoke the renderer\n        r._call(); // clear the cached call for garbage collection\n        // async redraws will stash their own copy\n        r._call = null;\n        return r;\n    },\n    /**\n   * Internal rendering method. Renderer subclasses should override this\n   * method to actually perform rendering.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   */ _render () /*scene*/ {},\n    /**\n   * Asynchronous rendering method. Similar to render, but returns a Promise\n   * that resolves when all rendering is completed. Sometimes a renderer must\n   * perform image loading to get a complete rendering. The returned\n   * Promise will not resolve until this process completes.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   * @return {Promise} - A Promise that resolves when rendering is complete.\n   */ renderAsync (scene) {\n        const r = this.render(scene);\n        return this._ready ? this._ready.then(()=>r) : Promise.resolve(r);\n    },\n    /**\n   * Internal method for asynchronous resource loading.\n   * Proxies method calls to the ImageLoader, and tracks loading\n   * progress to invoke a re-render once complete.\n   * @param {string} method - The method name to invoke on the ImageLoader.\n   * @param {string} uri - The URI for the requested resource.\n   * @return {Promise} - A Promise that resolves to the requested resource.\n   */ _load (method, uri) {\n        var r = this, p = r._loader[method](uri);\n        if (!r._ready) {\n            // re-render the scene when loading completes\n            const call = r._call;\n            r._ready = r._loader.ready().then((redraw)=>{\n                if (redraw) call();\n                r._ready = null;\n            });\n        }\n        return p;\n    },\n    /**\n   * Sanitize a URL to include as a hyperlink in the rendered scene.\n   * This method proxies a call to ImageLoader.sanitizeURL, but also tracks\n   * image loading progress and invokes a re-render once complete.\n   * @param {string} uri - The URI string to sanitize.\n   * @return {Promise} - A Promise that resolves to the sanitized URL.\n   */ sanitizeURL (uri) {\n        return this._load(\"sanitizeURL\", uri);\n    },\n    /**\n   * Requests an image to include in the rendered scene.\n   * This method proxies a call to ImageLoader.loadImage, but also tracks\n   * image loading progress and invokes a re-render once complete.\n   * @param {string} uri - The URI string of the image.\n   * @return {Promise} - A Promise that resolves to the loaded Image.\n   */ loadImage (uri) {\n        return this._load(\"loadImage\", uri);\n    }\n};\nconst KeyDownEvent = \"keydown\";\nconst KeyPressEvent = \"keypress\";\nconst KeyUpEvent = \"keyup\";\nconst DragEnterEvent = \"dragenter\";\nconst DragLeaveEvent = \"dragleave\";\nconst DragOverEvent = \"dragover\";\nconst MouseDownEvent = \"mousedown\";\nconst MouseUpEvent = \"mouseup\";\nconst MouseMoveEvent = \"mousemove\";\nconst MouseOutEvent = \"mouseout\";\nconst MouseOverEvent = \"mouseover\";\nconst ClickEvent = \"click\";\nconst DoubleClickEvent = \"dblclick\";\nconst WheelEvent = \"wheel\";\nconst MouseWheelEvent = \"mousewheel\";\nconst TouchStartEvent = \"touchstart\";\nconst TouchMoveEvent = \"touchmove\";\nconst TouchEndEvent = \"touchend\";\nconst Events = [\n    KeyDownEvent,\n    KeyPressEvent,\n    KeyUpEvent,\n    DragEnterEvent,\n    DragLeaveEvent,\n    DragOverEvent,\n    MouseDownEvent,\n    MouseUpEvent,\n    MouseMoveEvent,\n    MouseOutEvent,\n    MouseOverEvent,\n    ClickEvent,\n    DoubleClickEvent,\n    WheelEvent,\n    MouseWheelEvent,\n    TouchStartEvent,\n    TouchMoveEvent,\n    TouchEndEvent\n];\nconst TooltipShowEvent = MouseMoveEvent;\nconst TooltipHideEvent = MouseOutEvent;\nconst HrefEvent = ClickEvent;\nfunction CanvasHandler(loader, tooltip) {\n    Handler.call(this, loader, tooltip);\n    this._down = null;\n    this._touch = null;\n    this._first = true;\n    this._events = {};\n}\nconst eventBundle = (type10)=>type10 === TouchStartEvent || type10 === TouchMoveEvent || type10 === TouchEndEvent ? [\n        TouchStartEvent,\n        TouchMoveEvent,\n        TouchEndEvent\n    ] : [\n        type10\n    ]; // lazily add listeners to the canvas as needed\nfunction eventListenerCheck(handler, type11) {\n    eventBundle(type11).forEach((_)=>addEventListener(handler, _));\n}\nfunction addEventListener(handler, type12) {\n    const canvas = handler.canvas();\n    if (canvas && !handler._events[type12]) {\n        handler._events[type12] = 1;\n        canvas.addEventListener(type12, handler[type12] ? (evt)=>handler[type12](evt) : (evt)=>handler.fire(type12, evt));\n    }\n}\nfunction move(moveEvent, overEvent, outEvent) {\n    return function(evt) {\n        const a = this._active, p = this.pickEvent(evt);\n        if (p === a) // active item and picked item are the same\n        this.fire(moveEvent, evt); // fire move\n        else {\n            // active item and picked item are different\n            if (!a || !a.exit) // fire out for prior active item\n            // suppress if active item was removed from scene\n            this.fire(outEvent, evt);\n            this._active = p; // set new active item\n            this.fire(overEvent, evt); // fire over for new active item\n            this.fire(moveEvent, evt); // fire move for new active item\n        }\n    };\n}\nfunction inactive(type13) {\n    return function(evt) {\n        this.fire(type13, evt);\n        this._active = null;\n    };\n}\n(0, _vegaUtil.inherits)(CanvasHandler, Handler, {\n    initialize (el, origin, obj) {\n        this._canvas = el && domFind(el, \"canvas\"); // add minimal events required for proper state management\n        [\n            ClickEvent,\n            MouseDownEvent,\n            MouseMoveEvent,\n            MouseOutEvent,\n            DragLeaveEvent\n        ].forEach((type14)=>eventListenerCheck(this, type14));\n        return Handler.prototype.initialize.call(this, el, origin, obj);\n    },\n    // return the backing canvas instance\n    canvas () {\n        return this._canvas;\n    },\n    // retrieve the current canvas context\n    context () {\n        return this._canvas.getContext(\"2d\");\n    },\n    // supported events\n    events: Events,\n    // to keep old versions of firefox happy\n    DOMMouseScroll (evt) {\n        this.fire(MouseWheelEvent, evt);\n    },\n    mousemove: move(MouseMoveEvent, MouseOverEvent, MouseOutEvent),\n    dragover: move(DragOverEvent, DragEnterEvent, DragLeaveEvent),\n    mouseout: inactive(MouseOutEvent),\n    dragleave: inactive(DragLeaveEvent),\n    mousedown (evt) {\n        this._down = this._active;\n        this.fire(MouseDownEvent, evt);\n    },\n    click (evt) {\n        if (this._down === this._active) {\n            this.fire(ClickEvent, evt);\n            this._down = null;\n        }\n    },\n    touchstart (evt) {\n        this._touch = this.pickEvent(evt.changedTouches[0]);\n        if (this._first) {\n            this._active = this._touch;\n            this._first = false;\n        }\n        this.fire(TouchStartEvent, evt, true);\n    },\n    touchmove (evt) {\n        this.fire(TouchMoveEvent, evt, true);\n    },\n    touchend (evt) {\n        this.fire(TouchEndEvent, evt, true);\n        this._touch = null;\n    },\n    // fire an event\n    fire (type15, evt, touch) {\n        const a = touch ? this._touch : this._active, h19 = this._handlers[type15]; // set event type relative to scenegraph items\n        evt.vegaType = type15; // handle hyperlinks and tooltips first\n        if (type15 === HrefEvent && a && a.href) this.handleHref(evt, a, a.href);\n        else if (type15 === TooltipShowEvent || type15 === TooltipHideEvent) this.handleTooltip(evt, a, type15 !== TooltipHideEvent);\n         // invoke all registered handlers\n        if (h19) for(let i = 0, len = h19.length; i < len; ++i)h19[i].handler.call(this._obj, evt, a);\n    },\n    // add an event handler\n    on (type16, handler) {\n        const name = this.eventName(type16), h20 = this._handlers, i = this._handlerIndex(h20[name], type16, handler);\n        if (i < 0) {\n            eventListenerCheck(this, type16);\n            (h20[name] || (h20[name] = [])).push({\n                type: type16,\n                handler: handler\n            });\n        }\n        return this;\n    },\n    // remove an event handler\n    off (type17, handler) {\n        const name = this.eventName(type17), h21 = this._handlers[name], i = this._handlerIndex(h21, type17, handler);\n        if (i >= 0) h21.splice(i, 1);\n        return this;\n    },\n    pickEvent (evt) {\n        const p = point(evt, this._canvas), o = this._origin;\n        return this.pick(this._scene, p[0], p[1], p[0] - o[0], p[1] - o[1]);\n    },\n    // find the scenegraph item at the current mouse position\n    // x, y -- the absolute x, y mouse coordinates on the canvas element\n    // gx, gy -- the relative coordinates within the current group\n    pick (scene, x45, y44, gx, gy) {\n        const g = this.context(), mark = Marks[scene.marktype];\n        return mark.pick.call(this, g, scene, x45, y44, gx, gy);\n    }\n});\nfunction devicePixelRatio() {\n    return typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1;\n}\nvar pixelRatio = devicePixelRatio();\nfunction resize(canvas, width, height, origin, scaleFactor, opt) {\n    const inDOM = typeof HTMLElement !== \"undefined\" && canvas instanceof HTMLElement && canvas.parentNode != null, context50 = canvas.getContext(\"2d\"), ratio = inDOM ? pixelRatio : scaleFactor;\n    canvas.width = width * ratio;\n    canvas.height = height * ratio;\n    for(const key in opt)context50[key] = opt[key];\n    if (inDOM && ratio !== 1) {\n        canvas.style.width = width + \"px\";\n        canvas.style.height = height + \"px\";\n    }\n    context50.pixelRatio = ratio;\n    context50.setTransform(ratio, 0, 0, ratio, ratio * origin[0], ratio * origin[1]);\n    return canvas;\n}\nfunction CanvasRenderer(loader) {\n    Renderer.call(this, loader);\n    this._options = {};\n    this._redraw = false;\n    this._dirty = new Bounds();\n    this._tempb = new Bounds();\n}\nconst base$1 = Renderer.prototype;\nconst viewBounds = (origin, width, height)=>new Bounds().set(0, 0, width, height).translate(-origin[0], -origin[1]);\nfunction clipToBounds(g, b18, origin) {\n    // expand bounds by 1 pixel, then round to pixel boundaries\n    b18.expand(1).round(); // align to base pixel grid in case of non-integer scaling (#2425)\n    if (g.pixelRatio % 1) b18.scale(g.pixelRatio).round().scale(1 / g.pixelRatio);\n     // to avoid artifacts translate if origin has fractional pixels\n    b18.translate(-(origin[0] % 1), -(origin[1] % 1)); // set clip path\n    g.beginPath();\n    g.rect(b18.x1, b18.y1, b18.width(), b18.height());\n    g.clip();\n    return b18;\n}\n(0, _vegaUtil.inherits)(CanvasRenderer, Renderer, {\n    initialize (el, width, height, origin, scaleFactor, options) {\n        this._options = options || {};\n        this._canvas = this._options.externalContext ? null : (0, _vegaCanvas.canvas)(1, 1, this._options.type); // instantiate a small canvas\n        if (el && this._canvas) {\n            domClear(el, 0).appendChild(this._canvas);\n            this._canvas.setAttribute(\"class\", \"marks\");\n        } // this method will invoke resize to size the canvas appropriately\n        return base$1.initialize.call(this, el, width, height, origin, scaleFactor);\n    },\n    resize (width, height, origin, scaleFactor) {\n        base$1.resize.call(this, width, height, origin, scaleFactor);\n        if (this._canvas) // configure canvas size and transform\n        resize(this._canvas, this._width, this._height, this._origin, this._scale, this._options.context);\n        else {\n            // external context needs to be scaled and positioned to origin\n            const ctx = this._options.externalContext;\n            if (!ctx) (0, _vegaUtil.error)(\"CanvasRenderer is missing a valid canvas or context\");\n            ctx.scale(this._scale, this._scale);\n            ctx.translate(this._origin[0], this._origin[1]);\n        }\n        this._redraw = true;\n        return this;\n    },\n    canvas () {\n        return this._canvas;\n    },\n    context () {\n        return this._options.externalContext || (this._canvas ? this._canvas.getContext(\"2d\") : null);\n    },\n    dirty (item) {\n        const b19 = this._tempb.clear().union(item.bounds);\n        let g = item.mark.group;\n        while(g){\n            b19.translate(g.x || 0, g.y || 0);\n            g = g.mark.group;\n        }\n        this._dirty.union(b19);\n    },\n    _render (scene) {\n        const g = this.context(), o = this._origin, w12 = this._width, h22 = this._height, db = this._dirty, vb = viewBounds(o, w12, h22); // setup\n        g.save();\n        const b20 = this._redraw || db.empty() ? (this._redraw = false, vb.expand(1)) : clipToBounds(g, vb.intersect(db), o);\n        this.clear(-o[0], -o[1], w12, h22); // render\n        this.draw(g, scene, b20); // takedown\n        g.restore();\n        db.clear();\n        return this;\n    },\n    draw (ctx, scene, bounds19) {\n        const mark = Marks[scene.marktype];\n        if (scene.clip) clip(ctx, scene);\n        mark.draw.call(this, ctx, scene, bounds19);\n        if (scene.clip) ctx.restore();\n    },\n    clear (x46, y45, w13, h23) {\n        const opt = this._options, g = this.context();\n        if (opt.type !== \"pdf\" && !opt.externalContext) // calling clear rect voids vector output in pdf mode\n        // and could remove external context content (#2615)\n        g.clearRect(x46, y45, w13, h23);\n        if (this._bgcolor != null) {\n            g.fillStyle = this._bgcolor;\n            g.fillRect(x46, y45, w13, h23);\n        }\n    }\n});\nfunction SVGHandler(loader, tooltip) {\n    Handler.call(this, loader, tooltip);\n    const h24 = this;\n    h24._hrefHandler = listener(h24, (evt, item)=>{\n        if (item && item.href) h24.handleHref(evt, item, item.href);\n    });\n    h24._tooltipHandler = listener(h24, (evt, item)=>{\n        h24.handleTooltip(evt, item, evt.type !== TooltipHideEvent);\n    });\n} // wrap an event listener for the SVG DOM\nconst listener = (context51, handler)=>(evt)=>{\n        let item = evt.target.__data__;\n        item = Array.isArray(item) ? item[0] : item;\n        evt.vegaType = evt.type;\n        handler.call(context51._obj, evt, item);\n    };\n(0, _vegaUtil.inherits)(SVGHandler, Handler, {\n    initialize (el, origin, obj) {\n        let svg = this._svg;\n        if (svg) {\n            svg.removeEventListener(HrefEvent, this._hrefHandler);\n            svg.removeEventListener(TooltipShowEvent, this._tooltipHandler);\n            svg.removeEventListener(TooltipHideEvent, this._tooltipHandler);\n        }\n        this._svg = svg = el && domFind(el, \"svg\");\n        if (svg) {\n            svg.addEventListener(HrefEvent, this._hrefHandler);\n            svg.addEventListener(TooltipShowEvent, this._tooltipHandler);\n            svg.addEventListener(TooltipHideEvent, this._tooltipHandler);\n        }\n        return Handler.prototype.initialize.call(this, el, origin, obj);\n    },\n    canvas () {\n        return this._svg;\n    },\n    // add an event handler\n    on (type18, handler) {\n        const name = this.eventName(type18), h25 = this._handlers, i = this._handlerIndex(h25[name], type18, handler);\n        if (i < 0) {\n            const x47 = {\n                type: type18,\n                handler,\n                listener: listener(this, handler)\n            };\n            (h25[name] || (h25[name] = [])).push(x47);\n            if (this._svg) this._svg.addEventListener(name, x47.listener);\n        }\n        return this;\n    },\n    // remove an event handler\n    off (type19, handler) {\n        const name = this.eventName(type19), h26 = this._handlers[name], i = this._handlerIndex(h26, type19, handler);\n        if (i >= 0) {\n            if (this._svg) this._svg.removeEventListener(name, h26[i].listener);\n            h26.splice(i, 1);\n        }\n        return this;\n    }\n});\nconst ARIA_HIDDEN = \"aria-hidden\";\nconst ARIA_LABEL = \"aria-label\";\nconst ARIA_ROLE = \"role\";\nconst ARIA_ROLEDESCRIPTION = \"aria-roledescription\";\nconst GRAPHICS_OBJECT = \"graphics-object\";\nconst GRAPHICS_SYMBOL = \"graphics-symbol\";\nconst bundle = (role, roledesc, label)=>({\n        [ARIA_ROLE]: role,\n        [ARIA_ROLEDESCRIPTION]: roledesc,\n        [ARIA_LABEL]: label || undefined\n    }); // these roles are covered by related roles\n// we can ignore them, no need to generate attributes\nconst AriaIgnore = (0, _vegaUtil.toSet)([\n    \"axis-domain\",\n    \"axis-grid\",\n    \"axis-label\",\n    \"axis-tick\",\n    \"axis-title\",\n    \"legend-band\",\n    \"legend-entry\",\n    \"legend-gradient\",\n    \"legend-label\",\n    \"legend-title\",\n    \"legend-symbol\",\n    \"title\"\n]); // aria attribute generators for guide roles\nconst AriaGuides = {\n    \"axis\": {\n        desc: \"axis\",\n        caption: axisCaption\n    },\n    \"legend\": {\n        desc: \"legend\",\n        caption: legendCaption\n    },\n    \"title-text\": {\n        desc: \"title\",\n        caption: (item)=>`Title text '${titleCaption(item)}'`\n    },\n    \"title-subtitle\": {\n        desc: \"subtitle\",\n        caption: (item)=>`Subtitle text '${titleCaption(item)}'`\n    }\n}; // aria properties generated for mark item encoding channels\nconst AriaEncode = {\n    ariaRole: ARIA_ROLE,\n    ariaRoleDescription: ARIA_ROLEDESCRIPTION,\n    description: ARIA_LABEL\n};\nfunction ariaItemAttributes(emit13, item) {\n    const hide = item.aria === false;\n    emit13(ARIA_HIDDEN, hide || undefined);\n    if (hide || item.description == null) for(const prop in AriaEncode)emit13(AriaEncode[prop], undefined);\n    else {\n        const type20 = item.mark.marktype;\n        emit13(ARIA_LABEL, item.description);\n        emit13(ARIA_ROLE, item.ariaRole || (type20 === \"group\" ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL));\n        emit13(ARIA_ROLEDESCRIPTION, item.ariaRoleDescription || `${type20} mark`);\n    }\n}\nfunction ariaMarkAttributes(mark) {\n    return mark.aria === false ? {\n        [ARIA_HIDDEN]: true\n    } : AriaIgnore[mark.role] ? null : AriaGuides[mark.role] ? ariaGuide(mark, AriaGuides[mark.role]) : ariaMark(mark);\n}\nfunction ariaMark(mark) {\n    const type21 = mark.marktype;\n    const recurse1 = type21 === \"group\" || type21 === \"text\" || mark.items.some((_)=>_.description != null && _.aria !== false);\n    return bundle(recurse1 ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL, `${type21} mark container`, mark.description);\n}\nfunction ariaGuide(mark, opt) {\n    try {\n        const item = mark.items[0], caption = opt.caption || (()=>\"\");\n        return bundle(opt.role || GRAPHICS_SYMBOL, opt.desc, item.description || caption(item));\n    } catch (err) {\n        return null;\n    }\n}\nfunction titleCaption(item) {\n    return (0, _vegaUtil.array)(item.text).join(\" \");\n}\nfunction axisCaption(item) {\n    const datum = item.datum, orient = item.orient, title = datum.title ? extractTitle(item) : null, ctx = item.context, scale1 = ctx.scales[datum.scale].value, locale = ctx.dataflow.locale(), type22 = scale1.type, xy = orient === \"left\" || orient === \"right\" ? \"Y\" : \"X\";\n    return `${xy}-axis` + (title ? ` titled '${title}'` : \"\") + ` for a ${(0, _vegaScale.isDiscrete)(type22) ? \"discrete\" : type22} scale` + ` with ${(0, _vegaScale.domainCaption)(locale, scale1, item)}`;\n}\nfunction legendCaption(item) {\n    const datum = item.datum, title = datum.title ? extractTitle(item) : null, type23 = `${datum.type || \"\"} legend`.trim(), scales = datum.scales, props = Object.keys(scales), ctx = item.context, scale2 = ctx.scales[scales[props[0]]].value, locale = ctx.dataflow.locale();\n    return capitalize(type23) + (title ? ` titled '${title}'` : \"\") + ` for ${channelCaption(props)}` + ` with ${(0, _vegaScale.domainCaption)(locale, scale2, item)}`;\n}\nfunction extractTitle(item) {\n    try {\n        return (0, _vegaUtil.array)((0, _vegaUtil.peek)(item.items).items[0].text).join(\" \");\n    } catch (err) {\n        return null;\n    }\n}\nfunction channelCaption(props) {\n    props = props.map((p)=>p + (p === \"fill\" || p === \"stroke\" ? \" color\" : \"\"));\n    return props.length < 2 ? props[0] : props.slice(0, -1).join(\", \") + \" and \" + (0, _vegaUtil.peek)(props);\n}\nfunction capitalize(s) {\n    return s.length ? s[0].toUpperCase() + s.slice(1) : s;\n}\nconst innerText = (val)=>(val + \"\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\nconst attrText = (val)=>innerText(val).replace(/\"/g, \"&quot;\").replace(/\\t/g, \"&#x9;\").replace(/\\n/g, \"&#xA;\").replace(/\\r/g, \"&#xD;\");\nfunction markup() {\n    let buf = \"\", outer = \"\", inner = \"\";\n    const stack = [], clear = ()=>outer = inner = \"\", push = (tag)=>{\n        if (outer) {\n            buf += `${outer}>${inner}`;\n            clear();\n        }\n        stack.push(tag);\n    }, attr3 = (name, value8)=>{\n        if (value8 != null) outer += ` ${name}=\"${attrText(value8)}\"`;\n        return m;\n    }, m = {\n        open (tag, ...attrs) {\n            push(tag);\n            outer = \"<\" + tag;\n            for (const set of attrs)for(const key in set)attr3(key, set[key]);\n            return m;\n        },\n        close () {\n            const tag = stack.pop();\n            if (outer) buf += outer + (inner ? `>${inner}</${tag}>` : \"/>\");\n            else buf += `</${tag}>`;\n            clear();\n            return m;\n        },\n        attr: attr3,\n        text: (t)=>(inner += innerText(t), m),\n        toString: ()=>buf\n    };\n    return m;\n}\nconst serializeXML = (node)=>_serialize(markup(), node) + \"\";\nfunction _serialize(m, node) {\n    m.open(node.tagName);\n    if (node.hasAttributes()) {\n        const attrs = node.attributes, n = attrs.length;\n        for(let i = 0; i < n; ++i)m.attr(attrs[i].name, attrs[i].value);\n    }\n    if (node.hasChildNodes()) {\n        const children = node.childNodes, n = children.length;\n        for(let i = 0; i < n; i++){\n            const child = children[i];\n            child.nodeType === 3 // text node\n             ? m.text(child.nodeValue) : _serialize(m, child);\n        }\n    }\n    return m.close();\n}\nconst styles = {\n    fill: \"fill\",\n    fillOpacity: \"fill-opacity\",\n    stroke: \"stroke\",\n    strokeOpacity: \"stroke-opacity\",\n    strokeWidth: \"stroke-width\",\n    strokeCap: \"stroke-linecap\",\n    strokeJoin: \"stroke-linejoin\",\n    strokeDash: \"stroke-dasharray\",\n    strokeDashOffset: \"stroke-dashoffset\",\n    strokeMiterLimit: \"stroke-miterlimit\",\n    opacity: \"opacity\",\n    blend: \"mix-blend-mode\"\n}; // ensure miter limit default is consistent with canvas (#2498)\nconst rootAttributes = {\n    \"fill\": \"none\",\n    \"stroke-miterlimit\": 10\n};\nconst RootIndex = 0, xmlns = \"http://www.w3.org/2000/xmlns/\", svgns = metadata.xmlns;\nfunction SVGRenderer(loader) {\n    Renderer.call(this, loader);\n    this._dirtyID = 0;\n    this._dirty = [];\n    this._svg = null;\n    this._root = null;\n    this._defs = null;\n}\nconst base = Renderer.prototype;\n(0, _vegaUtil.inherits)(SVGRenderer, Renderer, {\n    /**\n   * Initialize a new SVGRenderer instance.\n   * @param {DOMElement} el - The containing DOM element for the display.\n   * @param {number} width - The coordinate width of the display, in pixels.\n   * @param {number} height - The coordinate height of the display, in pixels.\n   * @param {Array<number>} origin - The origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n   *   the width and height to determine the final pixel size.\n   * @return {SVGRenderer} - This renderer instance.\n   */ initialize (el, width, height, origin, scaleFactor) {\n        // create the svg definitions cache\n        this._defs = {};\n        this._clearDefs();\n        if (el) {\n            this._svg = domChild(el, 0, \"svg\", svgns);\n            this._svg.setAttributeNS(xmlns, \"xmlns\", svgns);\n            this._svg.setAttributeNS(xmlns, \"xmlns:xlink\", metadata[\"xmlns:xlink\"]);\n            this._svg.setAttribute(\"version\", metadata[\"version\"]);\n            this._svg.setAttribute(\"class\", \"marks\");\n            domClear(el, 1); // set the svg root group\n            this._root = domChild(this._svg, RootIndex, \"g\", svgns);\n            setAttributes(this._root, rootAttributes); // ensure no additional child elements\n            domClear(this._svg, RootIndex + 1);\n        } // set background color if defined\n        this.background(this._bgcolor);\n        return base.initialize.call(this, el, width, height, origin, scaleFactor);\n    },\n    /**\n   * Get / set the background color.\n   */ background (bgcolor) {\n        if (arguments.length && this._svg) this._svg.style.setProperty(\"background-color\", bgcolor);\n        return base.background.apply(this, arguments);\n    },\n    /**\n   * Resize the display.\n   * @param {number} width - The new coordinate width of the display, in pixels.\n   * @param {number} height - The new coordinate height of the display, in pixels.\n   * @param {Array<number>} origin - The new origin of the display, in pixels.\n   *   The coordinate system will be translated to this point.\n   * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n   *   the width and height to determine the final pixel size.\n   * @return {SVGRenderer} - This renderer instance;\n   */ resize (width, height, origin, scaleFactor) {\n        base.resize.call(this, width, height, origin, scaleFactor);\n        if (this._svg) {\n            setAttributes(this._svg, {\n                width: this._width * this._scale,\n                height: this._height * this._scale,\n                viewBox: `0 0 ${this._width} ${this._height}`\n            });\n            this._root.setAttribute(\"transform\", `translate(${this._origin})`);\n        }\n        this._dirty = [];\n        return this;\n    },\n    /**\n   * Returns the SVG element of the visualization.\n   * @return {DOMElement} - The SVG element.\n   */ canvas () {\n        return this._svg;\n    },\n    /**\n   * Returns an SVG text string for the rendered content,\n   * or null if this renderer is currently headless.\n   */ svg () {\n        const svg = this._svg, bg = this._bgcolor;\n        if (!svg) return null;\n        let node;\n        if (bg) {\n            svg.removeAttribute(\"style\");\n            node = domChild(svg, RootIndex, \"rect\", svgns);\n            setAttributes(node, {\n                width: this._width,\n                height: this._height,\n                fill: bg\n            });\n        }\n        const text9 = serializeXML(svg);\n        if (bg) {\n            svg.removeChild(node);\n            this._svg.style.setProperty(\"background-color\", bg);\n        }\n        return text9;\n    },\n    /**\n   * Internal rendering method.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   */ _render (scene) {\n        // perform spot updates and re-render markup\n        if (this._dirtyCheck()) {\n            if (this._dirtyAll) this._clearDefs();\n            this.mark(this._root, scene);\n            domClear(this._root, 1);\n        }\n        this.defs();\n        this._dirty = [];\n        ++this._dirtyID;\n        return this;\n    },\n    // -- Manage rendering of items marked as dirty --\n    /**\n   * Flag a mark item as dirty.\n   * @param {Item} item - The mark item.\n   */ dirty (item) {\n        if (item.dirty !== this._dirtyID) {\n            item.dirty = this._dirtyID;\n            this._dirty.push(item);\n        }\n    },\n    /**\n   * Check if a mark item is considered dirty.\n   * @param {Item} item - The mark item.\n   */ isDirty (item) {\n        return this._dirtyAll || !item._svg || item.dirty === this._dirtyID;\n    },\n    /**\n   * Internal method to check dirty status and, if possible,\n   * make targetted updates without a full rendering pass.\n   */ _dirtyCheck () {\n        this._dirtyAll = true;\n        const items = this._dirty;\n        if (!items.length || !this._dirtyID) return true;\n        const id = ++this._dirtyID;\n        let item, mark, type24, mdef, i1, n, o;\n        for(i1 = 0, n = items.length; i1 < n; ++i1){\n            item = items[i1];\n            mark = item.mark;\n            if (mark.marktype !== type24) {\n                // memoize mark instance lookup\n                type24 = mark.marktype;\n                mdef = Marks[type24];\n            }\n            if (mark.zdirty && mark.dirty !== id) {\n                this._dirtyAll = false;\n                dirtyParents(item, id);\n                mark.items.forEach((i)=>{\n                    i.dirty = id;\n                });\n            }\n            if (mark.zdirty) continue; // handle in standard drawing pass\n            if (item.exit) {\n                // EXIT\n                if (mdef.nested && mark.items.length) {\n                    // if nested mark with remaining points, update instead\n                    o = mark.items[0];\n                    if (o._svg) this._update(mdef, o._svg, o);\n                } else if (item._svg) {\n                    // otherwise remove from DOM\n                    o = item._svg.parentNode;\n                    if (o) o.removeChild(item._svg);\n                }\n                item._svg = null;\n                continue;\n            }\n            item = mdef.nested ? mark.items[0] : item;\n            if (item._update === id) continue; // already visited\n            if (!item._svg || !item._svg.ownerSVGElement) {\n                // ENTER\n                this._dirtyAll = false;\n                dirtyParents(item, id);\n            } else // IN-PLACE UPDATE\n            this._update(mdef, item._svg, item);\n            item._update = id;\n        }\n        return !this._dirtyAll;\n    },\n    // -- Construct & maintain scenegraph to SVG mapping ---\n    /**\n   * Render a set of mark items.\n   * @param {SVGElement} el - The parent element in the SVG tree.\n   * @param {object} scene - The mark parent to render.\n   * @param {SVGElement} prev - The previous sibling in the SVG tree.\n   */ mark (el, scene, prev) {\n        if (!this.isDirty(scene)) return scene._svg;\n        const svg = this._svg, mdef = Marks[scene.marktype], events = scene.interactive === false ? \"none\" : null, isGroup = mdef.tag === \"g\";\n        let sibling = null, i = 0;\n        const parent = bind(scene, el, prev, \"g\", svg);\n        parent.setAttribute(\"class\", cssClass(scene)); // apply aria attributes to parent container element\n        const aria = ariaMarkAttributes(scene);\n        for(const key in aria)setAttribute(parent, key, aria[key]);\n        if (!isGroup) setAttribute(parent, \"pointer-events\", events);\n        setAttribute(parent, \"clip-path\", scene.clip ? clip$1(this, scene, scene.group) : null);\n        const process = (item)=>{\n            const dirty = this.isDirty(item), node = bind(item, parent, sibling, mdef.tag, svg);\n            if (dirty) {\n                this._update(mdef, node, item);\n                if (isGroup) recurse(this, node, item);\n            }\n            sibling = node;\n            ++i;\n        };\n        if (mdef.nested) {\n            if (scene.items.length) process(scene.items[0]);\n        } else visit(scene, process);\n        domClear(parent, i);\n        return parent;\n    },\n    /**\n   * Update the attributes of an SVG element for a mark item.\n   * @param {object} mdef - The mark definition object\n   * @param {SVGElement} el - The SVG element.\n   * @param {Item} item - The mark item.\n   */ _update (mdef, el, item) {\n        // set dom element and values cache\n        // provides access to emit method\n        element = el;\n        values = el.__values__; // apply aria-specific properties\n        ariaItemAttributes(emit, item); // apply svg attributes\n        mdef.attr(emit, item, this); // some marks need special treatment\n        const extra = mark_extras[mdef.type];\n        if (extra) extra.call(this, mdef, el, item); // apply svg style attributes\n        // note: element state may have been modified by 'extra' method\n        if (element) this.style(element, item);\n    },\n    /**\n   * Update the presentation attributes of an SVG element for a mark item.\n   * @param {SVGElement} el - The SVG element.\n   * @param {Item} item - The mark item.\n   */ style (el, item) {\n        if (item == null) return;\n        for(const prop in styles){\n            let value9 = prop === \"font\" ? fontFamily(item) : item[prop];\n            if (value9 === values[prop]) continue;\n            const name = styles[prop];\n            if (value9 == null) el.removeAttribute(name);\n            else {\n                if (isGradient(value9)) value9 = gradientRef(value9, this._defs.gradient, href());\n                el.setAttribute(name, value9 + \"\");\n            }\n            values[prop] = value9;\n        }\n    },\n    /**\n   * Render SVG defs, as needed.\n   * Must be called *after* marks have been processed to ensure the\n   * collected state is current and accurate.\n   */ defs () {\n        const svg = this._svg, defs = this._defs;\n        let el = defs.el, index = 0;\n        for(const id in defs.gradient){\n            if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n            index = updateGradient(el, defs.gradient[id], index);\n        }\n        for(const id1 in defs.clipping){\n            if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n            index = updateClipping(el, defs.clipping[id1], index);\n        } // clean-up\n        if (el) index === 0 ? (svg.removeChild(el), defs.el = null) : domClear(el, index);\n    },\n    /**\n   * Clear defs caches.\n   */ _clearDefs () {\n        const def3 = this._defs;\n        def3.gradient = {};\n        def3.clipping = {};\n    }\n}); // mark ancestor chain with a dirty id\nfunction dirtyParents(item, id) {\n    for(; item && item.dirty !== id; item = item.mark.group){\n        item.dirty = id;\n        if (item.mark && item.mark.dirty !== id) item.mark.dirty = id;\n        else return;\n    }\n} // update gradient definitions\nfunction updateGradient(el, grad, index) {\n    let i, n, stop;\n    if (grad.gradient === \"radial\") {\n        // SVG radial gradients automatically transform to normalized bbox\n        // coordinates, in a way that is cumbersome to replicate in canvas.\n        // We wrap the radial gradient in a pattern element, allowing us to\n        // maintain a circular gradient that matches what canvas provides.\n        let pt = domChild(el, index++, \"pattern\", svgns);\n        setAttributes(pt, {\n            id: patternPrefix + grad.id,\n            viewBox: \"0,0,1,1\",\n            width: \"100%\",\n            height: \"100%\",\n            preserveAspectRatio: \"xMidYMid slice\"\n        });\n        pt = domChild(pt, 0, \"rect\", svgns);\n        setAttributes(pt, {\n            width: 1,\n            height: 1,\n            fill: `url(${href()}#${grad.id})`\n        });\n        el = domChild(el, index++, \"radialGradient\", svgns);\n        setAttributes(el, {\n            id: grad.id,\n            fx: grad.x1,\n            fy: grad.y1,\n            fr: grad.r1,\n            cx: grad.x2,\n            cy: grad.y2,\n            r: grad.r2\n        });\n    } else {\n        el = domChild(el, index++, \"linearGradient\", svgns);\n        setAttributes(el, {\n            id: grad.id,\n            x1: grad.x1,\n            x2: grad.x2,\n            y1: grad.y1,\n            y2: grad.y2\n        });\n    }\n    for(i = 0, n = grad.stops.length; i < n; ++i){\n        stop = domChild(el, i, \"stop\", svgns);\n        stop.setAttribute(\"offset\", grad.stops[i].offset);\n        stop.setAttribute(\"stop-color\", grad.stops[i].color);\n    }\n    domClear(el, i);\n    return index;\n} // update clipping path definitions\nfunction updateClipping(el, clip3, index) {\n    let mask;\n    el = domChild(el, index, \"clipPath\", svgns);\n    el.setAttribute(\"id\", clip3.id);\n    if (clip3.path) {\n        mask = domChild(el, 0, \"path\", svgns);\n        mask.setAttribute(\"d\", clip3.path);\n    } else {\n        mask = domChild(el, 0, \"rect\", svgns);\n        setAttributes(mask, {\n            x: 0,\n            y: 0,\n            width: clip3.width,\n            height: clip3.height\n        });\n    }\n    domClear(el, 1);\n    return index + 1;\n} // Recursively process group contents.\nfunction recurse(renderer, el, group8) {\n    el = el.lastChild.previousSibling;\n    let prev, idx = 0;\n    visit(group8, (item)=>{\n        prev = renderer.mark(el, item, prev);\n        ++idx;\n    }); // remove any extraneous DOM elements\n    domClear(el, 1 + idx);\n} // Bind a scenegraph item to an SVG DOM element.\n// Create new SVG elements as needed.\nfunction bind(item, el, sibling, tag, svg) {\n    let node = item._svg, doc; // create a new dom node if needed\n    if (!node) {\n        doc = el.ownerDocument;\n        node = domCreate(doc, tag, svgns);\n        item._svg = node;\n        if (item.mark) {\n            node.__data__ = item;\n            node.__values__ = {\n                fill: \"default\"\n            }; // if group, create background, content, and foreground elements\n            if (tag === \"g\") {\n                const bg = domCreate(doc, \"path\", svgns);\n                node.appendChild(bg);\n                bg.__data__ = item;\n                const cg = domCreate(doc, \"g\", svgns);\n                node.appendChild(cg);\n                cg.__data__ = item;\n                const fg = domCreate(doc, \"path\", svgns);\n                node.appendChild(fg);\n                fg.__data__ = item;\n                fg.__values__ = {\n                    fill: \"default\"\n                };\n            }\n        }\n    } // (re-)insert if (a) not contained in SVG or (b) sibling order has changed\n    if (node.ownerSVGElement !== svg || siblingCheck(node, sibling)) el.insertBefore(node, sibling ? sibling.nextSibling : el.firstChild);\n    return node;\n} // check if two nodes are ordered siblings\nfunction siblingCheck(node, sibling) {\n    return node.parentNode && node.parentNode.childNodes.length > 1 && node.previousSibling != sibling; // treat null/undefined the same\n} // -- Set attributes & styles on SVG elements ---\nlet element = null, // temp var for current SVG element\nvalues = null; // temp var for current values hash\n// Extra configuration for certain mark types\nconst mark_extras = {\n    group (mdef, el, item) {\n        const fg = element = el.childNodes[2];\n        values = fg.__values__;\n        mdef.foreground(emit, item, this);\n        values = el.__values__; // use parent's values hash\n        element = el.childNodes[1];\n        mdef.content(emit, item, this);\n        const bg = element = el.childNodes[0];\n        mdef.background(emit, item, this);\n        const value10 = item.mark.interactive === false ? \"none\" : null;\n        if (value10 !== values.events) {\n            setAttribute(fg, \"pointer-events\", value10);\n            setAttribute(bg, \"pointer-events\", value10);\n            values.events = value10;\n        }\n        if (item.strokeForeground && item.stroke) {\n            const fill2 = item.fill;\n            setAttribute(fg, \"display\", null); // set style of background\n            this.style(bg, item);\n            setAttribute(bg, \"stroke\", null); // set style of foreground\n            if (fill2) item.fill = null;\n            values = fg.__values__;\n            this.style(fg, item);\n            if (fill2) item.fill = fill2; // leave element null to prevent downstream styling\n            element = null;\n        } else // ensure foreground is ignored\n        setAttribute(fg, \"display\", \"none\");\n    },\n    image (mdef, el, item) {\n        if (item.smooth === false) {\n            setStyle(el, \"image-rendering\", \"optimizeSpeed\");\n            setStyle(el, \"image-rendering\", \"pixelated\");\n        } else setStyle(el, \"image-rendering\", null);\n    },\n    text (mdef, el, item) {\n        const tl6 = textLines(item);\n        let key, value11, doc, lh;\n        if ((0, _vegaUtil.isArray)(tl6)) {\n            // multi-line text\n            value11 = tl6.map((_)=>textValue(item, _));\n            key = value11.join(\"\\n\"); // content cache key\n            if (key !== values.text) {\n                domClear(el, 0);\n                doc = el.ownerDocument;\n                lh = lineHeight(item);\n                value11.forEach((t, i)=>{\n                    const ts1 = domCreate(doc, \"tspan\", svgns);\n                    ts1.__data__ = item; // data binding\n                    ts1.textContent = t;\n                    if (i) {\n                        ts1.setAttribute(\"x\", 0);\n                        ts1.setAttribute(\"dy\", lh);\n                    }\n                    el.appendChild(ts1);\n                });\n                values.text = key;\n            }\n        } else {\n            // single-line text\n            value11 = textValue(item, tl6);\n            if (value11 !== values.text) {\n                el.textContent = value11;\n                values.text = value11;\n            }\n        }\n        setAttribute(el, \"font-family\", fontFamily(item));\n        setAttribute(el, \"font-size\", fontSize(item) + \"px\");\n        setAttribute(el, \"font-style\", item.fontStyle);\n        setAttribute(el, \"font-variant\", item.fontVariant);\n        setAttribute(el, \"font-weight\", item.fontWeight);\n    }\n};\nfunction emit(name, value12, ns) {\n    // early exit if value is unchanged\n    if (value12 === values[name]) return; // use appropriate method given namespace (ns)\n    if (ns) setAttributeNS(element, name, value12, ns);\n    else setAttribute(element, name, value12);\n     // note current value for future comparison\n    values[name] = value12;\n}\nfunction setStyle(el, name, value13) {\n    if (value13 !== values[name]) {\n        if (value13 == null) el.style.removeProperty(name);\n        else el.style.setProperty(name, value13 + \"\");\n        values[name] = value13;\n    }\n}\nfunction setAttributes(el, attrs) {\n    for(const key in attrs)setAttribute(el, key, attrs[key]);\n}\nfunction setAttribute(el, name, value14) {\n    if (value14 != null) // if value is provided, update DOM attribute\n    el.setAttribute(name, value14);\n    else // else remove DOM attribute\n    el.removeAttribute(name);\n}\nfunction setAttributeNS(el, name, value15, ns) {\n    if (value15 != null) // if value is provided, update DOM attribute\n    el.setAttributeNS(ns, name, value15);\n    else // else remove DOM attribute\n    el.removeAttributeNS(ns, name);\n}\nfunction href() {\n    let loc;\n    return typeof window === \"undefined\" ? \"\" : (loc = window.location).hash ? loc.href.slice(0, -loc.hash.length) : loc.href;\n}\nfunction SVGStringRenderer(loader) {\n    Renderer.call(this, loader);\n    this._text = null;\n    this._defs = {\n        gradient: {},\n        clipping: {}\n    };\n}\n(0, _vegaUtil.inherits)(SVGStringRenderer, Renderer, {\n    /**\n   * Returns the rendered SVG text string,\n   * or null if rendering has not yet occurred.\n   */ svg () {\n        return this._text;\n    },\n    /**\n   * Internal rendering method.\n   * @param {object} scene - The root mark of a scenegraph to render.\n   */ _render (scene) {\n        const m = markup(); // svg tag\n        m.open(\"svg\", (0, _vegaUtil.extend)({}, metadata, {\n            class: \"marks\",\n            width: this._width * this._scale,\n            height: this._height * this._scale,\n            viewBox: `0 0 ${this._width} ${this._height}`\n        })); // background, if defined\n        const bg = this._bgcolor;\n        if (bg && bg !== \"transparent\" && bg !== \"none\") m.open(\"rect\", {\n            width: this._width,\n            height: this._height,\n            fill: bg\n        }).close();\n         // root content group\n        m.open(\"g\", rootAttributes, {\n            transform: \"translate(\" + this._origin + \")\"\n        });\n        this.mark(m, scene);\n        m.close(); // </g>\n        // defs\n        this.defs(m); // get SVG text string\n        this._text = m.close() + \"\";\n        return this;\n    },\n    /**\n   * Render a set of mark items.\n   * @param {object} m - The markup context.\n   * @param {object} scene - The mark parent to render.\n   */ mark (m, scene1) {\n        const mdef = Marks[scene1.marktype], tag = mdef.tag, attrList = [\n            ariaItemAttributes,\n            mdef.attr\n        ]; // render opening group tag\n        m.open(\"g\", {\n            \"class\": cssClass(scene1),\n            \"clip-path\": scene1.clip ? clip$1(this, scene1, scene1.group) : null\n        }, ariaMarkAttributes(scene1), {\n            \"pointer-events\": tag !== \"g\" && scene1.interactive === false ? \"none\" : null\n        }); // render contained elements\n        const process = (item)=>{\n            const href2 = this.href(item);\n            if (href2) m.open(\"a\", href2);\n            m.open(tag, this.attr(scene1, item, attrList, tag !== \"g\" ? tag : null));\n            if (tag === \"text\") {\n                const tl7 = textLines(item);\n                if ((0, _vegaUtil.isArray)(tl7)) {\n                    // multi-line text\n                    const attrs = {\n                        x: 0,\n                        dy: lineHeight(item)\n                    };\n                    for(let i = 0; i < tl7.length; ++i)m.open(\"tspan\", i ? attrs : null).text(textValue(item, tl7[i])).close();\n                } else // single-line text\n                m.text(textValue(item, tl7));\n            } else if (tag === \"g\") {\n                const fore = item.strokeForeground, fill3 = item.fill, stroke2 = item.stroke;\n                if (fore && stroke2) item.stroke = null;\n                m.open(\"path\", this.attr(scene1, item, mdef.background, \"bgrect\")).close(); // recurse for group content\n                m.open(\"g\", this.attr(scene1, item, mdef.content));\n                visit(item, (scene)=>this.mark(m, scene));\n                m.close();\n                if (fore && stroke2) {\n                    if (fill3) item.fill = null;\n                    item.stroke = stroke2;\n                    m.open(\"path\", this.attr(scene1, item, mdef.foreground, \"bgrect\")).close();\n                    if (fill3) item.fill = fill3;\n                } else m.open(\"path\", this.attr(scene1, item, mdef.foreground, \"bgfore\")).close();\n            }\n            m.close(); // </tag>\n            if (href2) m.close(); // </a>\n        };\n        if (mdef.nested) {\n            if (scene1.items && scene1.items.length) process(scene1.items[0]);\n        } else visit(scene1, process);\n         // render closing group tag\n        return m.close(); // </g>\n    },\n    /**\n   * Get href attributes for a hyperlinked mark item.\n   * @param {Item} item - The mark item.\n   */ href (item) {\n        const href3 = item.href;\n        let attr4;\n        if (href3) {\n            if (attr4 = this._hrefs && this._hrefs[href3]) return attr4;\n            else this.sanitizeURL(href3).then((attr5)=>{\n                // rewrite to use xlink namespace\n                attr5[\"xlink:href\"] = attr5.href;\n                attr5.href = null;\n                (this._hrefs || (this._hrefs = {}))[href3] = attr5;\n            });\n        }\n        return null;\n    },\n    /**\n   * Get an object of SVG attributes for a mark item.\n   * @param {object} scene - The mark parent.\n   * @param {Item} item - The mark item.\n   * @param {array|function} attrs - One or more attribute emitters.\n   * @param {string} tag - The tag being rendered.\n   */ attr (scene, item, attrs, tag) {\n        const object = {}, emit14 = (name, value16, ns, prefixed)=>{\n            object[prefixed || name] = value16;\n        }; // apply mark specific attributes\n        if (Array.isArray(attrs)) attrs.forEach((fn)=>fn(emit14, item, this));\n        else attrs(emit14, item, this);\n         // apply style attributes\n        if (tag) style(object, item, scene, tag, this._defs);\n        return object;\n    },\n    /**\n   * Render SVG defs, as needed.\n   * Must be called *after* marks have been processed to ensure the\n   * collected state is current and accurate.\n   * @param {object} m - The markup context.\n   */ defs (m) {\n        const gradient4 = this._defs.gradient, clipping = this._defs.clipping, count = Object.keys(gradient4).length + Object.keys(clipping).length;\n        if (count === 0) return; // nothing to do\n        m.open(\"defs\");\n        for(const id in gradient4){\n            const def4 = gradient4[id], stops = def4.stops;\n            if (def4.gradient === \"radial\") {\n                // SVG radial gradients automatically transform to normalized bbox\n                // coordinates, in a way that is cumbersome to replicate in canvas.\n                // We wrap the radial gradient in a pattern element, allowing us to\n                // maintain a circular gradient that matches what canvas provides.\n                m.open(\"pattern\", {\n                    id: patternPrefix + id,\n                    viewBox: \"0,0,1,1\",\n                    width: \"100%\",\n                    height: \"100%\",\n                    preserveAspectRatio: \"xMidYMid slice\"\n                });\n                m.open(\"rect\", {\n                    width: \"1\",\n                    height: \"1\",\n                    fill: \"url(#\" + id + \")\"\n                }).close();\n                m.close(); // </pattern>\n                m.open(\"radialGradient\", {\n                    id: id,\n                    fx: def4.x1,\n                    fy: def4.y1,\n                    fr: def4.r1,\n                    cx: def4.x2,\n                    cy: def4.y2,\n                    r: def4.r2\n                });\n            } else m.open(\"linearGradient\", {\n                id: id,\n                x1: def4.x1,\n                x2: def4.x2,\n                y1: def4.y1,\n                y2: def4.y2\n            });\n            for(let i = 0; i < stops.length; ++i)m.open(\"stop\", {\n                offset: stops[i].offset,\n                \"stop-color\": stops[i].color\n            }).close();\n            m.close();\n        }\n        for(const id2 in clipping){\n            const def5 = clipping[id2];\n            m.open(\"clipPath\", {\n                id: id2\n            });\n            if (def5.path) m.open(\"path\", {\n                d: def5.path\n            }).close();\n            else m.open(\"rect\", {\n                x: 0,\n                y: 0,\n                width: def5.width,\n                height: def5.height\n            }).close();\n            m.close();\n        }\n        m.close();\n    }\n}); // Helper function for attr for style presentation attributes\nfunction style(s, item, scene, tag, defs) {\n    if (item == null) return s;\n    if (tag === \"bgrect\" && scene.interactive === false) s[\"pointer-events\"] = \"none\";\n    if (tag === \"bgfore\") {\n        if (scene.interactive === false) s[\"pointer-events\"] = \"none\";\n        s.display = \"none\";\n        if (item.fill !== null) return s;\n    }\n    if (tag === \"image\" && item.smooth === false) s.style = \"image-rendering: optimizeSpeed; image-rendering: pixelated;\";\n    if (tag === \"text\") {\n        s[\"font-family\"] = fontFamily(item);\n        s[\"font-size\"] = fontSize(item) + \"px\";\n        s[\"font-style\"] = item.fontStyle;\n        s[\"font-variant\"] = item.fontVariant;\n        s[\"font-weight\"] = item.fontWeight;\n    }\n    for(const prop in styles){\n        let value17 = item[prop];\n        const name = styles[prop];\n        if (value17 === \"transparent\" && (name === \"fill\" || name === \"stroke\")) ;\n        else if (value17 != null) {\n            if (isGradient(value17)) value17 = gradientRef(value17, defs.gradient, \"\");\n            s[name] = value17;\n        }\n    }\n    return s;\n}\nconst Canvas = \"canvas\";\nconst PNG = \"png\";\nconst SVG = \"svg\";\nconst None = \"none\";\nconst RenderType = {\n    Canvas: Canvas,\n    PNG: PNG,\n    SVG: SVG,\n    None: None\n};\nconst modules = {};\nmodules[Canvas] = modules[PNG] = {\n    renderer: CanvasRenderer,\n    headless: CanvasRenderer,\n    handler: CanvasHandler\n};\nmodules[SVG] = {\n    renderer: SVGRenderer,\n    headless: SVGStringRenderer,\n    handler: SVGHandler\n};\nmodules[None] = {};\nfunction renderModule(name, _) {\n    name = String(name || \"\").toLowerCase();\n    if (arguments.length > 1) {\n        modules[name] = _;\n        return this;\n    } else return modules[name];\n}\nfunction intersect(scene, bounds20, filter) {\n    const hits = [], // intersection results\n    box = new Bounds().union(bounds20), // defensive copy\n    type25 = scene.marktype;\n    return type25 ? intersectMark(scene, box, filter, hits) : type25 === \"group\" ? intersectGroup(scene, box, filter, hits) : (0, _vegaUtil.error)(\"Intersect scene must be mark node or group item.\");\n}\nfunction intersectMark(mark, box, filter, hits) {\n    if (visitMark(mark, box, filter)) {\n        const items = mark.items, type26 = mark.marktype, n = items.length;\n        let i = 0;\n        if (type26 === \"group\") for(; i < n; ++i)intersectGroup(items[i], box, filter, hits);\n        else for(const test = Marks[type26].isect; i < n; ++i){\n            const item = items[i];\n            if (intersectItem(item, box, test)) hits.push(item);\n        }\n    }\n    return hits;\n}\nfunction visitMark(mark, box, filter) {\n    // process if bounds intersect and if\n    // (1) mark is a group mark (so we must recurse), or\n    // (2) mark is interactive and passes filter\n    return mark.bounds && box.intersects(mark.bounds) && (mark.marktype === \"group\" || mark.interactive !== false && (!filter || filter(mark)));\n}\nfunction intersectGroup(group9, box, filter, hits) {\n    // test intersect against group\n    // skip groups by default unless filter says otherwise\n    if (filter && filter(group9.mark) && intersectItem(group9, box, Marks.group.isect)) hits.push(group9);\n     // recursively test children marks\n    // translate box to group coordinate space\n    const marks = group9.items, n = marks && marks.length;\n    if (n) {\n        const x48 = group9.x || 0, y46 = group9.y || 0;\n        box.translate(-x48, -y46);\n        for(let i = 0; i < n; ++i)intersectMark(marks[i], box, filter, hits);\n        box.translate(x48, y46);\n    }\n    return hits;\n}\nfunction intersectItem(item, box, test) {\n    // test bounds enclosure, bounds intersection, then detailed test\n    const bounds21 = item.bounds;\n    return box.encloses(bounds21) || box.intersects(bounds21) && test(item, box);\n}\nconst clipBounds = new Bounds();\nfunction boundClip(mark) {\n    const clip4 = mark.clip;\n    if ((0, _vegaUtil.isFunction)(clip4)) clip4(boundContext(clipBounds.clear()));\n    else if (clip4) clipBounds.set(0, 0, mark.group.width, mark.group.height);\n    else return;\n    mark.bounds.intersect(clipBounds);\n}\nconst TOLERANCE = 1e-9;\nfunction sceneEqual(a, b21, key) {\n    return a === b21 ? true : key === \"path\" ? pathEqual(a, b21) : a instanceof Date && b21 instanceof Date ? +a === +b21 : (0, _vegaUtil.isNumber)(a) && (0, _vegaUtil.isNumber)(b21) ? Math.abs(a - b21) <= TOLERANCE : !a || !b21 || !(0, _vegaUtil.isObject)(a) && !(0, _vegaUtil.isObject)(b21) ? a == b21 : objectEqual(a, b21);\n}\nfunction pathEqual(a, b22) {\n    return sceneEqual(pathParse(a), pathParse(b22));\n}\nfunction objectEqual(a, b23) {\n    var ka = Object.keys(a), kb = Object.keys(b23), key, i;\n    if (ka.length !== kb.length) return false;\n    ka.sort();\n    kb.sort();\n    for(i = ka.length - 1; i >= 0; i--){\n        if (ka[i] != kb[i]) return false;\n    }\n    for(i = ka.length - 1; i >= 0; i--){\n        key = ka[i];\n        if (!sceneEqual(a[key], b23[key], key)) return false;\n    }\n    return typeof a === typeof b23;\n}\nfunction resetSVGDefIds() {\n    resetSVGClipId();\n    resetSVGGradientId();\n}\n\n},{\"vega-util\":\"bApja\",\"d3-shape\":\"8QPYO\",\"d3-path\":\"cRa94\",\"vega-canvas\":\"f0yaA\",\"vega-loader\":\"gmbOr\",\"vega-scale\":\"bEydG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8QPYO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"arc\", ()=>(0, _arcJsDefault.default));\nparcelHelpers.export(exports, \"area\", ()=>(0, _areaJsDefault.default));\nparcelHelpers.export(exports, \"line\", ()=>(0, _lineJsDefault.default));\nparcelHelpers.export(exports, \"pie\", ()=>(0, _pieJsDefault.default));\nparcelHelpers.export(exports, \"areaRadial\", ()=>(0, _areaRadialJsDefault.default)) // Note: radialArea is deprecated!\n;\nparcelHelpers.export(exports, \"radialArea\", ()=>(0, _areaRadialJsDefault.default));\nparcelHelpers.export(exports, \"lineRadial\", ()=>(0, _lineRadialJsDefault.default)) // Note: radialLine is deprecated!\n;\nparcelHelpers.export(exports, \"radialLine\", ()=>(0, _lineRadialJsDefault.default));\nparcelHelpers.export(exports, \"pointRadial\", ()=>(0, _pointRadialJsDefault.default));\nparcelHelpers.export(exports, \"linkHorizontal\", ()=>(0, _indexJs.linkHorizontal));\nparcelHelpers.export(exports, \"linkVertical\", ()=>(0, _indexJs.linkVertical));\nparcelHelpers.export(exports, \"linkRadial\", ()=>(0, _indexJs.linkRadial));\nparcelHelpers.export(exports, \"symbol\", ()=>(0, _symbolJsDefault.default));\nparcelHelpers.export(exports, \"symbols\", ()=>(0, _symbolJs.symbols));\nparcelHelpers.export(exports, \"symbolCircle\", ()=>(0, _circleJsDefault.default));\nparcelHelpers.export(exports, \"symbolCross\", ()=>(0, _crossJsDefault.default));\nparcelHelpers.export(exports, \"symbolDiamond\", ()=>(0, _diamondJsDefault.default));\nparcelHelpers.export(exports, \"symbolSquare\", ()=>(0, _squareJsDefault.default));\nparcelHelpers.export(exports, \"symbolStar\", ()=>(0, _starJsDefault.default));\nparcelHelpers.export(exports, \"symbolTriangle\", ()=>(0, _triangleJsDefault.default));\nparcelHelpers.export(exports, \"symbolWye\", ()=>(0, _wyeJsDefault.default));\nparcelHelpers.export(exports, \"curveBasisClosed\", ()=>(0, _basisClosedJsDefault.default));\nparcelHelpers.export(exports, \"curveBasisOpen\", ()=>(0, _basisOpenJsDefault.default));\nparcelHelpers.export(exports, \"curveBasis\", ()=>(0, _basisJsDefault.default));\nparcelHelpers.export(exports, \"curveBumpX\", ()=>(0, _bumpJs.bumpX));\nparcelHelpers.export(exports, \"curveBumpY\", ()=>(0, _bumpJs.bumpY));\nparcelHelpers.export(exports, \"curveBundle\", ()=>(0, _bundleJsDefault.default));\nparcelHelpers.export(exports, \"curveCardinalClosed\", ()=>(0, _cardinalClosedJsDefault.default));\nparcelHelpers.export(exports, \"curveCardinalOpen\", ()=>(0, _cardinalOpenJsDefault.default));\nparcelHelpers.export(exports, \"curveCardinal\", ()=>(0, _cardinalJsDefault.default));\nparcelHelpers.export(exports, \"curveCatmullRomClosed\", ()=>(0, _catmullRomClosedJsDefault.default));\nparcelHelpers.export(exports, \"curveCatmullRomOpen\", ()=>(0, _catmullRomOpenJsDefault.default));\nparcelHelpers.export(exports, \"curveCatmullRom\", ()=>(0, _catmullRomJsDefault.default));\nparcelHelpers.export(exports, \"curveLinearClosed\", ()=>(0, _linearClosedJsDefault.default));\nparcelHelpers.export(exports, \"curveLinear\", ()=>(0, _linearJsDefault.default));\nparcelHelpers.export(exports, \"curveMonotoneX\", ()=>(0, _monotoneJs.monotoneX));\nparcelHelpers.export(exports, \"curveMonotoneY\", ()=>(0, _monotoneJs.monotoneY));\nparcelHelpers.export(exports, \"curveNatural\", ()=>(0, _naturalJsDefault.default));\nparcelHelpers.export(exports, \"curveStep\", ()=>(0, _stepJsDefault.default));\nparcelHelpers.export(exports, \"curveStepAfter\", ()=>(0, _stepJs.stepAfter));\nparcelHelpers.export(exports, \"curveStepBefore\", ()=>(0, _stepJs.stepBefore));\nparcelHelpers.export(exports, \"stack\", ()=>(0, _stackJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetExpand\", ()=>(0, _expandJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetDiverging\", ()=>(0, _divergingJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetNone\", ()=>(0, _noneJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetSilhouette\", ()=>(0, _silhouetteJsDefault.default));\nparcelHelpers.export(exports, \"stackOffsetWiggle\", ()=>(0, _wiggleJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderAppearance\", ()=>(0, _appearanceJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderAscending\", ()=>(0, _ascendingJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderDescending\", ()=>(0, _descendingJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderInsideOut\", ()=>(0, _insideOutJsDefault.default));\nparcelHelpers.export(exports, \"stackOrderNone\", ()=>(0, _noneJsDefault1.default));\nparcelHelpers.export(exports, \"stackOrderReverse\", ()=>(0, _reverseJsDefault.default));\nvar _arcJs = require(\"./arc.js\");\nvar _arcJsDefault = parcelHelpers.interopDefault(_arcJs);\nvar _areaJs = require(\"./area.js\");\nvar _areaJsDefault = parcelHelpers.interopDefault(_areaJs);\nvar _lineJs = require(\"./line.js\");\nvar _lineJsDefault = parcelHelpers.interopDefault(_lineJs);\nvar _pieJs = require(\"./pie.js\");\nvar _pieJsDefault = parcelHelpers.interopDefault(_pieJs);\nvar _areaRadialJs = require(\"./areaRadial.js\");\nvar _areaRadialJsDefault = parcelHelpers.interopDefault(_areaRadialJs);\nvar _lineRadialJs = require(\"./lineRadial.js\");\nvar _lineRadialJsDefault = parcelHelpers.interopDefault(_lineRadialJs);\nvar _pointRadialJs = require(\"./pointRadial.js\");\nvar _pointRadialJsDefault = parcelHelpers.interopDefault(_pointRadialJs);\nvar _indexJs = require(\"./link/index.js\");\nvar _symbolJs = require(\"./symbol.js\");\nvar _symbolJsDefault = parcelHelpers.interopDefault(_symbolJs);\nvar _circleJs = require(\"./symbol/circle.js\");\nvar _circleJsDefault = parcelHelpers.interopDefault(_circleJs);\nvar _crossJs = require(\"./symbol/cross.js\");\nvar _crossJsDefault = parcelHelpers.interopDefault(_crossJs);\nvar _diamondJs = require(\"./symbol/diamond.js\");\nvar _diamondJsDefault = parcelHelpers.interopDefault(_diamondJs);\nvar _squareJs = require(\"./symbol/square.js\");\nvar _squareJsDefault = parcelHelpers.interopDefault(_squareJs);\nvar _starJs = require(\"./symbol/star.js\");\nvar _starJsDefault = parcelHelpers.interopDefault(_starJs);\nvar _triangleJs = require(\"./symbol/triangle.js\");\nvar _triangleJsDefault = parcelHelpers.interopDefault(_triangleJs);\nvar _wyeJs = require(\"./symbol/wye.js\");\nvar _wyeJsDefault = parcelHelpers.interopDefault(_wyeJs);\nvar _basisClosedJs = require(\"./curve/basisClosed.js\");\nvar _basisClosedJsDefault = parcelHelpers.interopDefault(_basisClosedJs);\nvar _basisOpenJs = require(\"./curve/basisOpen.js\");\nvar _basisOpenJsDefault = parcelHelpers.interopDefault(_basisOpenJs);\nvar _basisJs = require(\"./curve/basis.js\");\nvar _basisJsDefault = parcelHelpers.interopDefault(_basisJs);\nvar _bumpJs = require(\"./curve/bump.js\");\nvar _bundleJs = require(\"./curve/bundle.js\");\nvar _bundleJsDefault = parcelHelpers.interopDefault(_bundleJs);\nvar _cardinalClosedJs = require(\"./curve/cardinalClosed.js\");\nvar _cardinalClosedJsDefault = parcelHelpers.interopDefault(_cardinalClosedJs);\nvar _cardinalOpenJs = require(\"./curve/cardinalOpen.js\");\nvar _cardinalOpenJsDefault = parcelHelpers.interopDefault(_cardinalOpenJs);\nvar _cardinalJs = require(\"./curve/cardinal.js\");\nvar _cardinalJsDefault = parcelHelpers.interopDefault(_cardinalJs);\nvar _catmullRomClosedJs = require(\"./curve/catmullRomClosed.js\");\nvar _catmullRomClosedJsDefault = parcelHelpers.interopDefault(_catmullRomClosedJs);\nvar _catmullRomOpenJs = require(\"./curve/catmullRomOpen.js\");\nvar _catmullRomOpenJsDefault = parcelHelpers.interopDefault(_catmullRomOpenJs);\nvar _catmullRomJs = require(\"./curve/catmullRom.js\");\nvar _catmullRomJsDefault = parcelHelpers.interopDefault(_catmullRomJs);\nvar _linearClosedJs = require(\"./curve/linearClosed.js\");\nvar _linearClosedJsDefault = parcelHelpers.interopDefault(_linearClosedJs);\nvar _linearJs = require(\"./curve/linear.js\");\nvar _linearJsDefault = parcelHelpers.interopDefault(_linearJs);\nvar _monotoneJs = require(\"./curve/monotone.js\");\nvar _naturalJs = require(\"./curve/natural.js\");\nvar _naturalJsDefault = parcelHelpers.interopDefault(_naturalJs);\nvar _stepJs = require(\"./curve/step.js\");\nvar _stepJsDefault = parcelHelpers.interopDefault(_stepJs);\nvar _stackJs = require(\"./stack.js\");\nvar _stackJsDefault = parcelHelpers.interopDefault(_stackJs);\nvar _expandJs = require(\"./offset/expand.js\");\nvar _expandJsDefault = parcelHelpers.interopDefault(_expandJs);\nvar _divergingJs = require(\"./offset/diverging.js\");\nvar _divergingJsDefault = parcelHelpers.interopDefault(_divergingJs);\nvar _noneJs = require(\"./offset/none.js\");\nvar _noneJsDefault = parcelHelpers.interopDefault(_noneJs);\nvar _silhouetteJs = require(\"./offset/silhouette.js\");\nvar _silhouetteJsDefault = parcelHelpers.interopDefault(_silhouetteJs);\nvar _wiggleJs = require(\"./offset/wiggle.js\");\nvar _wiggleJsDefault = parcelHelpers.interopDefault(_wiggleJs);\nvar _appearanceJs = require(\"./order/appearance.js\");\nvar _appearanceJsDefault = parcelHelpers.interopDefault(_appearanceJs);\nvar _ascendingJs = require(\"./order/ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nvar _descendingJs = require(\"./order/descending.js\");\nvar _descendingJsDefault = parcelHelpers.interopDefault(_descendingJs);\nvar _insideOutJs = require(\"./order/insideOut.js\");\nvar _insideOutJsDefault = parcelHelpers.interopDefault(_insideOutJs);\nvar _noneJs1 = require(\"./order/none.js\");\nvar _noneJsDefault1 = parcelHelpers.interopDefault(_noneJs1);\nvar _reverseJs = require(\"./order/reverse.js\");\nvar _reverseJsDefault = parcelHelpers.interopDefault(_reverseJs);\n\n},{\"./arc.js\":\"c3ptb\",\"./area.js\":\"lblzF\",\"./line.js\":\"jVTJi\",\"./pie.js\":false,\"./areaRadial.js\":false,\"./lineRadial.js\":false,\"./pointRadial.js\":false,\"./link/index.js\":false,\"./symbol.js\":\"bcejp\",\"./symbol/circle.js\":\"7RXTA\",\"./symbol/cross.js\":\"4cmA2\",\"./symbol/diamond.js\":\"1gK3j\",\"./symbol/square.js\":\"fXRAH\",\"./symbol/star.js\":\"8nJiq\",\"./symbol/triangle.js\":\"bClaq\",\"./symbol/wye.js\":\"2D9bg\",\"./curve/basisClosed.js\":\"3uf9r\",\"./curve/basisOpen.js\":\"4LPKP\",\"./curve/basis.js\":\"gNfFM\",\"./curve/bump.js\":false,\"./curve/bundle.js\":\"7Gw48\",\"./curve/cardinalClosed.js\":\"e0Ty2\",\"./curve/cardinalOpen.js\":\"4cTvH\",\"./curve/cardinal.js\":\"i0afA\",\"./curve/catmullRomClosed.js\":\"kfNnJ\",\"./curve/catmullRomOpen.js\":\"amodp\",\"./curve/catmullRom.js\":\"8d6GP\",\"./curve/linearClosed.js\":\"gpcM0\",\"./curve/linear.js\":\"huz8f\",\"./curve/monotone.js\":\"kghkb\",\"./curve/natural.js\":\"4f94Q\",\"./curve/step.js\":\"l5kmS\",\"./stack.js\":false,\"./offset/expand.js\":false,\"./offset/diverging.js\":false,\"./offset/none.js\":false,\"./offset/silhouette.js\":false,\"./offset/wiggle.js\":false,\"./order/appearance.js\":false,\"./order/ascending.js\":false,\"./order/descending.js\":false,\"./order/insideOut.js\":false,\"./order/none.js\":false,\"./order/reverse.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c3ptb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Path = require(\"d3-path\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _mathJs = require(\"./math.js\");\nfunction arcInnerRadius(d) {\n    return d.innerRadius;\n}\nfunction arcOuterRadius(d) {\n    return d.outerRadius;\n}\nfunction arcStartAngle(d) {\n    return d.startAngle;\n}\nfunction arcEndAngle(d) {\n    return d.endAngle;\n}\nfunction arcPadAngle(d) {\n    return d && d.padAngle; // Note: optional!\n}\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n    var x10 = x1 - x0, y10 = y1 - y0, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10;\n    if (t * t < (0, _mathJs.epsilon)) return;\n    t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n    return [\n        x0 + t * x10,\n        y0 + t * y10\n    ];\n}\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n    var x01 = x0 - x1, y01 = y0 - y1, lo = (cw ? rc : -rc) / (0, _mathJs.sqrt)(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x0 + ox, y11 = y0 + oy, x10 = x1 + ox, y10 = y1 + oy, x00 = (x11 + x10) / 2, y00 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * (0, _mathJs.sqrt)((0, _mathJs.max)(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x00, dy0 = cy0 - y00, dx1 = cx1 - x00, dy1 = cy1 - y00;\n    // Pick the closer of the two intersection points.\n    // TODO Is there a faster way to determine which intersection to use?\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return {\n        cx: cx0,\n        cy: cy0,\n        x01: -ox,\n        y01: -oy,\n        x11: cx0 * (r1 / r - 1),\n        y11: cy0 * (r1 / r - 1)\n    };\n}\nexports.default = function() {\n    var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = (0, _constantJsDefault.default)(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context = null;\n    function arc() {\n        var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - (0, _mathJs.halfPi), a1 = endAngle.apply(this, arguments) - (0, _mathJs.halfPi), da = (0, _mathJs.abs)(a1 - a0), cw = a1 > a0;\n        if (!context) context = buffer = (0, _d3Path.path)();\n        // Ensure that the outer radius is always larger than the inner radius.\n        if (r1 < r0) r = r1, r1 = r0, r0 = r;\n        // Is it a point?\n        if (!(r1 > (0, _mathJs.epsilon))) context.moveTo(0, 0);\n        else if (da > (0, _mathJs.tau) - (0, _mathJs.epsilon)) {\n            context.moveTo(r1 * (0, _mathJs.cos)(a0), r1 * (0, _mathJs.sin)(a0));\n            context.arc(0, 0, r1, a0, a1, !cw);\n            if (r0 > (0, _mathJs.epsilon)) {\n                context.moveTo(r0 * (0, _mathJs.cos)(a1), r0 * (0, _mathJs.sin)(a1));\n                context.arc(0, 0, r0, a1, a0, cw);\n            }\n        } else {\n            var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > (0, _mathJs.epsilon) && (padRadius ? +padRadius.apply(this, arguments) : (0, _mathJs.sqrt)(r0 * r0 + r1 * r1)), rc = (0, _mathJs.min)((0, _mathJs.abs)(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t0, t1;\n            // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n            if (rp > (0, _mathJs.epsilon)) {\n                var p0 = (0, _mathJs.asin)(rp / r0 * (0, _mathJs.sin)(ap)), p1 = (0, _mathJs.asin)(rp / r1 * (0, _mathJs.sin)(ap));\n                if ((da0 -= p0 * 2) > (0, _mathJs.epsilon)) p0 *= cw ? 1 : -1, a00 += p0, a10 -= p0;\n                else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n                if ((da1 -= p1 * 2) > (0, _mathJs.epsilon)) p1 *= cw ? 1 : -1, a01 += p1, a11 -= p1;\n                else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n            }\n            var x01 = r1 * (0, _mathJs.cos)(a01), y01 = r1 * (0, _mathJs.sin)(a01), x10 = r0 * (0, _mathJs.cos)(a10), y10 = r0 * (0, _mathJs.sin)(a10);\n            // Apply rounded corners?\n            if (rc > (0, _mathJs.epsilon)) {\n                var x11 = r1 * (0, _mathJs.cos)(a11), y11 = r1 * (0, _mathJs.sin)(a11), x00 = r0 * (0, _mathJs.cos)(a00), y00 = r0 * (0, _mathJs.sin)(a00), oc;\n                // Restrict the corner radius according to the sector angle.\n                if (da < (0, _mathJs.pi) && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n                    var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / (0, _mathJs.sin)((0, _mathJs.acos)((ax * bx + ay * by) / ((0, _mathJs.sqrt)(ax * ax + ay * ay) * (0, _mathJs.sqrt)(bx * bx + by * by))) / 2), lc = (0, _mathJs.sqrt)(oc[0] * oc[0] + oc[1] * oc[1]);\n                    rc0 = (0, _mathJs.min)(rc, (r0 - lc) / (kc - 1));\n                    rc1 = (0, _mathJs.min)(rc, (r1 - lc) / (kc + 1));\n                }\n            }\n            // Is the sector collapsed to a line?\n            if (!(da1 > (0, _mathJs.epsilon))) context.moveTo(x01, y01);\n            else if (rc1 > (0, _mathJs.epsilon)) {\n                t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n                t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n                context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n                // Have the corners merged?\n                if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, (0, _mathJs.atan2)(t0.y01, t0.x01), (0, _mathJs.atan2)(t1.y01, t1.x01), !cw);\n                else {\n                    context.arc(t0.cx, t0.cy, rc1, (0, _mathJs.atan2)(t0.y01, t0.x01), (0, _mathJs.atan2)(t0.y11, t0.x11), !cw);\n                    context.arc(0, 0, r1, (0, _mathJs.atan2)(t0.cy + t0.y11, t0.cx + t0.x11), (0, _mathJs.atan2)(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n                    context.arc(t1.cx, t1.cy, rc1, (0, _mathJs.atan2)(t1.y11, t1.x11), (0, _mathJs.atan2)(t1.y01, t1.x01), !cw);\n                }\n            } else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n            // Is there no inner ring, and it’s a circular sector?\n            // Or perhaps it’s an annular sector collapsed due to padding?\n            if (!(r0 > (0, _mathJs.epsilon)) || !(da0 > (0, _mathJs.epsilon))) context.lineTo(x10, y10);\n            else if (rc0 > (0, _mathJs.epsilon)) {\n                t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n                t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n                context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n                // Have the corners merged?\n                if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, (0, _mathJs.atan2)(t0.y01, t0.x01), (0, _mathJs.atan2)(t1.y01, t1.x01), !cw);\n                else {\n                    context.arc(t0.cx, t0.cy, rc0, (0, _mathJs.atan2)(t0.y01, t0.x01), (0, _mathJs.atan2)(t0.y11, t0.x11), !cw);\n                    context.arc(0, 0, r0, (0, _mathJs.atan2)(t0.cy + t0.y11, t0.cx + t0.x11), (0, _mathJs.atan2)(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n                    context.arc(t1.cx, t1.cy, rc0, (0, _mathJs.atan2)(t1.y11, t1.x11), (0, _mathJs.atan2)(t1.y01, t1.x01), !cw);\n                }\n            } else context.arc(0, 0, r0, a10, a00, cw);\n        }\n        context.closePath();\n        if (buffer) return context = null, buffer + \"\" || null;\n    }\n    arc.centroid = function() {\n        var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - (0, _mathJs.pi) / 2;\n        return [\n            (0, _mathJs.cos)(a) * r,\n            (0, _mathJs.sin)(a) * r\n        ];\n    };\n    arc.innerRadius = function(_) {\n        return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : innerRadius;\n    };\n    arc.outerRadius = function(_) {\n        return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : outerRadius;\n    };\n    arc.cornerRadius = function(_) {\n        return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : cornerRadius;\n    };\n    arc.padRadius = function(_) {\n        return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : padRadius;\n    };\n    arc.startAngle = function(_) {\n        return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : startAngle;\n    };\n    arc.endAngle = function(_) {\n        return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : endAngle;\n    };\n    arc.padAngle = function(_) {\n        return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), arc) : padAngle;\n    };\n    arc.context = function(_) {\n        return arguments.length ? (context = _ == null ? null : _, arc) : context;\n    };\n    return arc;\n};\n\n},{\"d3-path\":\"cRa94\",\"./constant.js\":\"12DQf\",\"./math.js\":\"OHDSf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cRa94\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"path\", ()=>(0, _pathJsDefault.default));\nvar _pathJs = require(\"./path.js\");\nvar _pathJsDefault = parcelHelpers.interopDefault(_pathJs);\n\n},{\"./path.js\":\"6vvkL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6vvkL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nconst pi = Math.PI, tau = 2 * pi, epsilon = 1e-6, tauEpsilon = tau - epsilon;\nfunction Path() {\n    this._x0 = this._y0 = this._x1 = this._y1 = null; // end of current subpath\n    this._ = \"\";\n}\nfunction path() {\n    return new Path;\n}\nPath.prototype = path.prototype = {\n    constructor: Path,\n    moveTo: function(x, y) {\n        this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n    },\n    closePath: function() {\n        if (this._x1 !== null) {\n            this._x1 = this._x0, this._y1 = this._y0;\n            this._ += \"Z\";\n        }\n    },\n    lineTo: function(x, y) {\n        this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n    },\n    quadraticCurveTo: function(x1, y1, x, y) {\n        this._ += \"Q\" + +x1 + \",\" + +y1 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n    },\n    bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n        this._ += \"C\" + +x1 + \",\" + +y1 + \",\" + +x2 + \",\" + +y2 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n    },\n    arcTo: function(x1, y1, x2, y2, r) {\n        x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n        var x0 = this._x1, y0 = this._y1, x21 = x2 - x1, y21 = y2 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;\n        // Is the radius negative? Error.\n        if (r < 0) throw new Error(\"negative radius: \" + r);\n        // Is this path empty? Move to (x1,y1).\n        if (this._x1 === null) this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n        else if (!(l01_2 > epsilon)) ;\n        else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n        else {\n            var x20 = x2 - x0, y20 = y2 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;\n            // If the start tangent is not coincident with (x0,y0), line to.\n            if (Math.abs(t01 - 1) > epsilon) this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n            this._ += \"A\" + r + \",\" + r + \",0,0,\" + +(y01 * x20 > x01 * y20) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n        }\n    },\n    arc: function(x, y, r, a0, a1, ccw) {\n        x = +x, y = +y, r = +r, ccw = !!ccw;\n        var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x + dx, y0 = y + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;\n        // Is the radius negative? Error.\n        if (r < 0) throw new Error(\"negative radius: \" + r);\n        // Is this path empty? Move to (x0,y0).\n        if (this._x1 === null) this._ += \"M\" + x0 + \",\" + y0;\n        else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += \"L\" + x0 + \",\" + y0;\n        // Is this arc empty? We’re done.\n        if (!r) return;\n        // Does the angle go the wrong way? Flip the direction.\n        if (da < 0) da = da % tau + tau;\n        // Is this a complete circle? Draw two arcs to complete the circle.\n        if (da > tauEpsilon) this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n        else if (da > epsilon) this._ += \"A\" + r + \",\" + r + \",0,\" + +(da >= pi) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n    },\n    rect: function(x, y, w, h) {\n        this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + +w + \"v\" + +h + \"h\" + -w + \"Z\";\n    },\n    toString: function() {\n        return this._;\n    }\n};\nexports.default = path;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"12DQf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return function constant() {\n        return x;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"OHDSf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"abs\", ()=>abs);\nparcelHelpers.export(exports, \"atan2\", ()=>atan2);\nparcelHelpers.export(exports, \"cos\", ()=>cos);\nparcelHelpers.export(exports, \"max\", ()=>max);\nparcelHelpers.export(exports, \"min\", ()=>min);\nparcelHelpers.export(exports, \"sin\", ()=>sin);\nparcelHelpers.export(exports, \"sqrt\", ()=>sqrt);\nparcelHelpers.export(exports, \"epsilon\", ()=>epsilon);\nparcelHelpers.export(exports, \"pi\", ()=>pi);\nparcelHelpers.export(exports, \"halfPi\", ()=>halfPi);\nparcelHelpers.export(exports, \"tau\", ()=>tau);\nparcelHelpers.export(exports, \"acos\", ()=>acos);\nparcelHelpers.export(exports, \"asin\", ()=>asin);\nvar abs = Math.abs;\nvar atan2 = Math.atan2;\nvar cos = Math.cos;\nvar max = Math.max;\nvar min = Math.min;\nvar sin = Math.sin;\nvar sqrt = Math.sqrt;\nvar epsilon = 1e-12;\nvar pi = Math.PI;\nvar halfPi = pi / 2;\nvar tau = 2 * pi;\nfunction acos(x) {\n    return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\nfunction asin(x) {\n    return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lblzF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Path = require(\"d3-path\");\nvar _arrayJs = require(\"./array.js\");\nvar _arrayJsDefault = parcelHelpers.interopDefault(_arrayJs);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _linearJs = require(\"./curve/linear.js\");\nvar _linearJsDefault = parcelHelpers.interopDefault(_linearJs);\nvar _lineJs = require(\"./line.js\");\nvar _lineJsDefault = parcelHelpers.interopDefault(_lineJs);\nvar _pointJs = require(\"./point.js\");\nexports.default = function(x0, y0, y1) {\n    var x1 = null, defined = (0, _constantJsDefault.default)(true), context = null, curve = (0, _linearJsDefault.default), output = null;\n    x0 = typeof x0 === \"function\" ? x0 : x0 === undefined ? (0, _pointJs.x) : (0, _constantJsDefault.default)(+x0);\n    y0 = typeof y0 === \"function\" ? y0 : y0 === undefined ? (0, _constantJsDefault.default)(0) : (0, _constantJsDefault.default)(+y0);\n    y1 = typeof y1 === \"function\" ? y1 : y1 === undefined ? (0, _pointJs.y) : (0, _constantJsDefault.default)(+y1);\n    function area(data) {\n        var i, j, k, n = (data = (0, _arrayJsDefault.default)(data)).length, d, defined0 = false, buffer, x0z = new Array(n), y0z = new Array(n);\n        if (context == null) output = curve(buffer = (0, _d3Path.path)());\n        for(i = 0; i <= n; ++i){\n            if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n                if (defined0 = !defined0) {\n                    j = i;\n                    output.areaStart();\n                    output.lineStart();\n                } else {\n                    output.lineEnd();\n                    output.lineStart();\n                    for(k = i - 1; k >= j; --k)output.point(x0z[k], y0z[k]);\n                    output.lineEnd();\n                    output.areaEnd();\n                }\n            }\n            if (defined0) {\n                x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);\n                output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);\n            }\n        }\n        if (buffer) return output = null, buffer + \"\" || null;\n    }\n    function arealine() {\n        return (0, _lineJsDefault.default)().defined(defined).curve(curve).context(context);\n    }\n    area.x = function(_) {\n        return arguments.length ? (x0 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), x1 = null, area) : x0;\n    };\n    area.x0 = function(_) {\n        return arguments.length ? (x0 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), area) : x0;\n    };\n    area.x1 = function(_) {\n        return arguments.length ? (x1 = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), area) : x1;\n    };\n    area.y = function(_) {\n        return arguments.length ? (y0 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), y1 = null, area) : y0;\n    };\n    area.y0 = function(_) {\n        return arguments.length ? (y0 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), area) : y0;\n    };\n    area.y1 = function(_) {\n        return arguments.length ? (y1 = _ == null ? null : typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), area) : y1;\n    };\n    area.lineX0 = area.lineY0 = function() {\n        return arealine().x(x0).y(y0);\n    };\n    area.lineY1 = function() {\n        return arealine().x(x0).y(y1);\n    };\n    area.lineX1 = function() {\n        return arealine().x(x1).y(y0);\n    };\n    area.defined = function(_) {\n        return arguments.length ? (defined = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(!!_), area) : defined;\n    };\n    area.curve = function(_) {\n        return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;\n    };\n    area.context = function(_) {\n        return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;\n    };\n    return area;\n};\n\n},{\"d3-path\":\"cRa94\",\"./array.js\":\"gwBAX\",\"./constant.js\":\"12DQf\",\"./curve/linear.js\":\"huz8f\",\"./line.js\":\"jVTJi\",\"./point.js\":\"1IQGj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gwBAX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"slice\", ()=>slice);\nvar slice = Array.prototype.slice;\nexports.default = function(x) {\n    return typeof x === \"object\" && \"length\" in x ? x // Array, TypedArray, NodeList, array-like\n     : Array.from(x); // Map, Set, iterable, string, or anything else\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"huz8f\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction Linear(context) {\n    this._context = context;\n}\nLinear.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2; // proceed\n            default:\n                this._context.lineTo(x, y);\n                break;\n        }\n    }\n};\nexports.default = function(context) {\n    return new Linear(context);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jVTJi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Path = require(\"d3-path\");\nvar _arrayJs = require(\"./array.js\");\nvar _arrayJsDefault = parcelHelpers.interopDefault(_arrayJs);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _linearJs = require(\"./curve/linear.js\");\nvar _linearJsDefault = parcelHelpers.interopDefault(_linearJs);\nvar _pointJs = require(\"./point.js\");\nexports.default = function(x, y) {\n    var defined = (0, _constantJsDefault.default)(true), context = null, curve = (0, _linearJsDefault.default), output = null;\n    x = typeof x === \"function\" ? x : x === undefined ? (0, _pointJs.x) : (0, _constantJsDefault.default)(x);\n    y = typeof y === \"function\" ? y : y === undefined ? (0, _pointJs.y) : (0, _constantJsDefault.default)(y);\n    function line(data) {\n        var i, n = (data = (0, _arrayJsDefault.default)(data)).length, d, defined0 = false, buffer;\n        if (context == null) output = curve(buffer = (0, _d3Path.path)());\n        for(i = 0; i <= n; ++i){\n            if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n                if (defined0 = !defined0) output.lineStart();\n                else output.lineEnd();\n            }\n            if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n        }\n        if (buffer) return output = null, buffer + \"\" || null;\n    }\n    line.x = function(_) {\n        return arguments.length ? (x = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), line) : x;\n    };\n    line.y = function(_) {\n        return arguments.length ? (y = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), line) : y;\n    };\n    line.defined = function(_) {\n        return arguments.length ? (defined = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(!!_), line) : defined;\n    };\n    line.curve = function(_) {\n        return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n    };\n    line.context = function(_) {\n        return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n    };\n    return line;\n};\n\n},{\"d3-path\":\"cRa94\",\"./array.js\":\"gwBAX\",\"./constant.js\":\"12DQf\",\"./curve/linear.js\":\"huz8f\",\"./point.js\":\"1IQGj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1IQGj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"x\", ()=>x);\nparcelHelpers.export(exports, \"y\", ()=>y);\nfunction x(p) {\n    return p[0];\n}\nfunction y(p) {\n    return p[1];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bcejp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"symbols\", ()=>symbols);\nvar _d3Path = require(\"d3-path\");\nvar _circleJs = require(\"./symbol/circle.js\");\nvar _circleJsDefault = parcelHelpers.interopDefault(_circleJs);\nvar _crossJs = require(\"./symbol/cross.js\");\nvar _crossJsDefault = parcelHelpers.interopDefault(_crossJs);\nvar _diamondJs = require(\"./symbol/diamond.js\");\nvar _diamondJsDefault = parcelHelpers.interopDefault(_diamondJs);\nvar _starJs = require(\"./symbol/star.js\");\nvar _starJsDefault = parcelHelpers.interopDefault(_starJs);\nvar _squareJs = require(\"./symbol/square.js\");\nvar _squareJsDefault = parcelHelpers.interopDefault(_squareJs);\nvar _triangleJs = require(\"./symbol/triangle.js\");\nvar _triangleJsDefault = parcelHelpers.interopDefault(_triangleJs);\nvar _wyeJs = require(\"./symbol/wye.js\");\nvar _wyeJsDefault = parcelHelpers.interopDefault(_wyeJs);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar symbols = [\n    (0, _circleJsDefault.default),\n    (0, _crossJsDefault.default),\n    (0, _diamondJsDefault.default),\n    (0, _squareJsDefault.default),\n    (0, _starJsDefault.default),\n    (0, _triangleJsDefault.default),\n    (0, _wyeJsDefault.default)\n];\nexports.default = function(type, size) {\n    var context = null;\n    type = typeof type === \"function\" ? type : (0, _constantJsDefault.default)(type || (0, _circleJsDefault.default));\n    size = typeof size === \"function\" ? size : (0, _constantJsDefault.default)(size === undefined ? 64 : +size);\n    function symbol() {\n        var buffer;\n        if (!context) context = buffer = (0, _d3Path.path)();\n        type.apply(this, arguments).draw(context, +size.apply(this, arguments));\n        if (buffer) return context = null, buffer + \"\" || null;\n    }\n    symbol.type = function(_) {\n        return arguments.length ? (type = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(_), symbol) : type;\n    };\n    symbol.size = function(_) {\n        return arguments.length ? (size = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), symbol) : size;\n    };\n    symbol.context = function(_) {\n        return arguments.length ? (context = _ == null ? null : _, symbol) : context;\n    };\n    return symbol;\n};\n\n},{\"d3-path\":\"cRa94\",\"./symbol/circle.js\":\"7RXTA\",\"./symbol/cross.js\":\"4cmA2\",\"./symbol/diamond.js\":\"1gK3j\",\"./symbol/star.js\":\"8nJiq\",\"./symbol/square.js\":\"fXRAH\",\"./symbol/triangle.js\":\"bClaq\",\"./symbol/wye.js\":\"2D9bg\",\"./constant.js\":\"12DQf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7RXTA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nexports.default = {\n    draw: function(context, size) {\n        var r = Math.sqrt(size / (0, _mathJs.pi));\n        context.moveTo(r, 0);\n        context.arc(0, 0, r, 0, (0, _mathJs.tau));\n    }\n};\n\n},{\"../math.js\":\"OHDSf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4cmA2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = {\n    draw: function(context, size) {\n        var r = Math.sqrt(size / 5) / 2;\n        context.moveTo(-3 * r, -r);\n        context.lineTo(-r, -r);\n        context.lineTo(-r, -3 * r);\n        context.lineTo(r, -3 * r);\n        context.lineTo(r, -r);\n        context.lineTo(3 * r, -r);\n        context.lineTo(3 * r, r);\n        context.lineTo(r, r);\n        context.lineTo(r, 3 * r);\n        context.lineTo(-r, 3 * r);\n        context.lineTo(-r, r);\n        context.lineTo(-3 * r, r);\n        context.closePath();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1gK3j\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar tan30 = Math.sqrt(1 / 3), tan30_2 = tan30 * 2;\nexports.default = {\n    draw: function(context, size) {\n        var y = Math.sqrt(size / tan30_2), x = y * tan30;\n        context.moveTo(0, -y);\n        context.lineTo(x, 0);\n        context.lineTo(0, y);\n        context.lineTo(-x, 0);\n        context.closePath();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8nJiq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nvar ka = 0.89081309152928522810, kr = Math.sin((0, _mathJs.pi) / 10) / Math.sin(7 * (0, _mathJs.pi) / 10), kx = Math.sin((0, _mathJs.tau) / 10) * kr, ky = -Math.cos((0, _mathJs.tau) / 10) * kr;\nexports.default = {\n    draw: function(context, size) {\n        var r = Math.sqrt(size * ka), x = kx * r, y = ky * r;\n        context.moveTo(0, -r);\n        context.lineTo(x, y);\n        for(var i = 1; i < 5; ++i){\n            var a = (0, _mathJs.tau) * i / 5, c = Math.cos(a), s = Math.sin(a);\n            context.lineTo(s * r, -c * r);\n            context.lineTo(c * x - s * y, s * x + c * y);\n        }\n        context.closePath();\n    }\n};\n\n},{\"../math.js\":\"OHDSf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fXRAH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = {\n    draw: function(context, size) {\n        var w = Math.sqrt(size), x = -w / 2;\n        context.rect(x, x, w, w);\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bClaq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar sqrt3 = Math.sqrt(3);\nexports.default = {\n    draw: function(context, size) {\n        var y = -Math.sqrt(size / (sqrt3 * 3));\n        context.moveTo(0, y * 2);\n        context.lineTo(-sqrt3 * y, -y);\n        context.lineTo(sqrt3 * y, -y);\n        context.closePath();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2D9bg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar c = -0.5, s = Math.sqrt(3) / 2, k = 1 / Math.sqrt(12), a = (k / 2 + 1) * 3;\nexports.default = {\n    draw: function(context, size) {\n        var r = Math.sqrt(size / a), x0 = r / 2, y0 = r * k, x1 = x0, y1 = r * k + r, x2 = -x1, y2 = y1;\n        context.moveTo(x0, y0);\n        context.lineTo(x1, y1);\n        context.lineTo(x2, y2);\n        context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n        context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n        context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n        context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n        context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n        context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n        context.closePath();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3uf9r\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _basisJs = require(\"./basis.js\");\nfunction BasisClosed(context) {\n    this._context = context;\n}\nBasisClosed.prototype = {\n    areaStart: (0, _noopJsDefault.default),\n    areaEnd: (0, _noopJsDefault.default),\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 1:\n                this._context.moveTo(this._x2, this._y2);\n                this._context.closePath();\n                break;\n            case 2:\n                this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n                this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n                this._context.closePath();\n                break;\n            case 3:\n                this.point(this._x2, this._y2);\n                this.point(this._x3, this._y3);\n                this.point(this._x4, this._y4);\n                break;\n        }\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._x2 = x, this._y2 = y;\n                break;\n            case 1:\n                this._point = 2;\n                this._x3 = x, this._y3 = y;\n                break;\n            case 2:\n                this._point = 3;\n                this._x4 = x, this._y4 = y;\n                this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6);\n                break;\n            default:\n                (0, _basisJs.point)(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = x;\n        this._y0 = this._y1, this._y1 = y;\n    }\n};\nexports.default = function(context) {\n    return new BasisClosed(context);\n};\n\n},{\"../noop.js\":\"9n7oj\",\"./basis.js\":\"gNfFM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9n7oj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gNfFM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"point\", ()=>point);\nparcelHelpers.export(exports, \"Basis\", ()=>Basis);\nfunction point(that, x, y) {\n    that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x) / 6, (that._y0 + 4 * that._y1 + y) / 6);\n}\nfunction Basis(context) {\n    this._context = context;\n}\nBasis.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 3:\n                point(this, this._x1, this._y1); // proceed\n            case 2:\n                this._context.lineTo(this._x1, this._y1);\n                break;\n        }\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n            default:\n                point(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = x;\n        this._y0 = this._y1, this._y1 = y;\n    }\n};\nexports.default = function(context) {\n    return new Basis(context);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4LPKP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _basisJs = require(\"./basis.js\");\nfunction BasisOpen(context) {\n    this._context = context;\n}\nBasisOpen.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6;\n                this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0);\n                break;\n            case 3:\n                this._point = 4; // proceed\n            default:\n                (0, _basisJs.point)(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = x;\n        this._y0 = this._y1, this._y1 = y;\n    }\n};\nexports.default = function(context) {\n    return new BasisOpen(context);\n};\n\n},{\"./basis.js\":\"gNfFM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Gw48\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _basisJs = require(\"./basis.js\");\nfunction Bundle(context, beta) {\n    this._basis = new (0, _basisJs.Basis)(context);\n    this._beta = beta;\n}\nBundle.prototype = {\n    lineStart: function() {\n        this._x = [];\n        this._y = [];\n        this._basis.lineStart();\n    },\n    lineEnd: function() {\n        var x = this._x, y = this._y, j = x.length - 1;\n        if (j > 0) {\n            var x0 = x[0], y0 = y[0], dx = x[j] - x0, dy = y[j] - y0, i = -1, t;\n            while(++i <= j){\n                t = i / j;\n                this._basis.point(this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y[i] + (1 - this._beta) * (y0 + t * dy));\n            }\n        }\n        this._x = this._y = null;\n        this._basis.lineEnd();\n    },\n    point: function(x, y) {\n        this._x.push(+x);\n        this._y.push(+y);\n    }\n};\nexports.default = function custom(beta1) {\n    function bundle(context) {\n        return beta1 === 1 ? new (0, _basisJs.Basis)(context) : new Bundle(context, beta1);\n    }\n    bundle.beta = function(beta) {\n        return custom(+beta);\n    };\n    return bundle;\n}(0.85);\n\n},{\"./basis.js\":\"gNfFM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e0Ty2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CardinalClosed\", ()=>CardinalClosed);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _cardinalJs = require(\"./cardinal.js\");\nfunction CardinalClosed(context, tension) {\n    this._context = context;\n    this._k = (1 - tension) / 6;\n}\nCardinalClosed.prototype = {\n    areaStart: (0, _noopJsDefault.default),\n    areaEnd: (0, _noopJsDefault.default),\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 1:\n                this._context.moveTo(this._x3, this._y3);\n                this._context.closePath();\n                break;\n            case 2:\n                this._context.lineTo(this._x3, this._y3);\n                this._context.closePath();\n                break;\n            case 3:\n                this.point(this._x3, this._y3);\n                this.point(this._x4, this._y4);\n                this.point(this._x5, this._y5);\n                break;\n        }\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._x3 = x, this._y3 = y;\n                break;\n            case 1:\n                this._point = 2;\n                this._context.moveTo(this._x4 = x, this._y4 = y);\n                break;\n            case 2:\n                this._point = 3;\n                this._x5 = x, this._y5 = y;\n                break;\n            default:\n                (0, _cardinalJs.point)(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(tension1) {\n    function cardinal(context) {\n        return new CardinalClosed(context, tension1);\n    }\n    cardinal.tension = function(tension) {\n        return custom(+tension);\n    };\n    return cardinal;\n}(0);\n\n},{\"../noop.js\":\"9n7oj\",\"./cardinal.js\":\"i0afA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i0afA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"point\", ()=>point);\nparcelHelpers.export(exports, \"Cardinal\", ()=>Cardinal);\nfunction point(that, x, y) {\n    that._context.bezierCurveTo(that._x1 + that._k * (that._x2 - that._x0), that._y1 + that._k * (that._y2 - that._y0), that._x2 + that._k * (that._x1 - x), that._y2 + that._k * (that._y1 - y), that._x2, that._y2);\n}\nfunction Cardinal(context, tension) {\n    this._context = context;\n    this._k = (1 - tension) / 6;\n}\nCardinal.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 2:\n                this._context.lineTo(this._x2, this._y2);\n                break;\n            case 3:\n                point(this, this._x1, this._y1);\n                break;\n        }\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2;\n                this._x1 = x, this._y1 = y;\n                break;\n            case 2:\n                this._point = 3; // proceed\n            default:\n                point(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(tension1) {\n    function cardinal(context) {\n        return new Cardinal(context, tension1);\n    }\n    cardinal.tension = function(tension) {\n        return custom(+tension);\n    };\n    return cardinal;\n}(0);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4cTvH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CardinalOpen\", ()=>CardinalOpen);\nvar _cardinalJs = require(\"./cardinal.js\");\nfunction CardinalOpen(context, tension) {\n    this._context = context;\n    this._k = (1 - tension) / 6;\n}\nCardinalOpen.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n                break;\n            case 3:\n                this._point = 4; // proceed\n            default:\n                (0, _cardinalJs.point)(this, x, y);\n                break;\n        }\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(tension1) {\n    function cardinal(context) {\n        return new CardinalOpen(context, tension1);\n    }\n    cardinal.tension = function(tension) {\n        return custom(+tension);\n    };\n    return cardinal;\n}(0);\n\n},{\"./cardinal.js\":\"i0afA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kfNnJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _cardinalClosedJs = require(\"./cardinalClosed.js\");\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _catmullRomJs = require(\"./catmullRom.js\");\nfunction CatmullRomClosed(context, alpha) {\n    this._context = context;\n    this._alpha = alpha;\n}\nCatmullRomClosed.prototype = {\n    areaStart: (0, _noopJsDefault.default),\n    areaEnd: (0, _noopJsDefault.default),\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n        this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 1:\n                this._context.moveTo(this._x3, this._y3);\n                this._context.closePath();\n                break;\n            case 2:\n                this._context.lineTo(this._x3, this._y3);\n                this._context.closePath();\n                break;\n            case 3:\n                this.point(this._x3, this._y3);\n                this.point(this._x4, this._y4);\n                this.point(this._x5, this._y5);\n                break;\n        }\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        if (this._point) {\n            var x23 = this._x2 - x, y23 = this._y2 - y;\n            this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n        }\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._x3 = x, this._y3 = y;\n                break;\n            case 1:\n                this._point = 2;\n                this._context.moveTo(this._x4 = x, this._y4 = y);\n                break;\n            case 2:\n                this._point = 3;\n                this._x5 = x, this._y5 = y;\n                break;\n            default:\n                (0, _catmullRomJs.point)(this, x, y);\n                break;\n        }\n        this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n        this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(alpha1) {\n    function catmullRom(context) {\n        return alpha1 ? new CatmullRomClosed(context, alpha1) : new (0, _cardinalClosedJs.CardinalClosed)(context, 0);\n    }\n    catmullRom.alpha = function(alpha) {\n        return custom(+alpha);\n    };\n    return catmullRom;\n}(0.5);\n\n},{\"./cardinalClosed.js\":\"e0Ty2\",\"../noop.js\":\"9n7oj\",\"./catmullRom.js\":\"8d6GP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8d6GP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"point\", ()=>point);\nvar _mathJs = require(\"../math.js\");\nvar _cardinalJs = require(\"./cardinal.js\");\nfunction point(that, x, y) {\n    var x1 = that._x1, y1 = that._y1, x2 = that._x2, y2 = that._y2;\n    if (that._l01_a > (0, _mathJs.epsilon)) {\n        var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n        x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n        y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n    }\n    if (that._l23_a > (0, _mathJs.epsilon)) {\n        var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n        x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n        y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n    }\n    that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\nfunction CatmullRom(context, alpha) {\n    this._context = context;\n    this._alpha = alpha;\n}\nCatmullRom.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n        this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 2:\n                this._context.lineTo(this._x2, this._y2);\n                break;\n            case 3:\n                this.point(this._x2, this._y2);\n                break;\n        }\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        if (this._point) {\n            var x23 = this._x2 - x, y23 = this._y2 - y;\n            this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n        }\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3; // proceed\n            default:\n                point(this, x, y);\n                break;\n        }\n        this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n        this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(alpha1) {\n    function catmullRom(context) {\n        return alpha1 ? new CatmullRom(context, alpha1) : new (0, _cardinalJs.Cardinal)(context, 0);\n    }\n    catmullRom.alpha = function(alpha) {\n        return custom(+alpha);\n    };\n    return catmullRom;\n}(0.5);\n\n},{\"../math.js\":\"OHDSf\",\"./cardinal.js\":\"i0afA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"amodp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _cardinalOpenJs = require(\"./cardinalOpen.js\");\nvar _catmullRomJs = require(\"./catmullRom.js\");\nfunction CatmullRomOpen(context, alpha) {\n    this._context = context;\n    this._alpha = alpha;\n}\nCatmullRomOpen.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n        this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        if (this._point) {\n            var x23 = this._x2 - x, y23 = this._y2 - y;\n            this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n        }\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n                break;\n            case 3:\n                this._point = 4; // proceed\n            default:\n                (0, _catmullRomJs.point)(this, x, y);\n                break;\n        }\n        this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n        this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n        this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n        this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n    }\n};\nexports.default = function custom(alpha1) {\n    function catmullRom(context) {\n        return alpha1 ? new CatmullRomOpen(context, alpha1) : new (0, _cardinalOpenJs.CardinalOpen)(context, 0);\n    }\n    catmullRom.alpha = function(alpha) {\n        return custom(+alpha);\n    };\n    return catmullRom;\n}(0.5);\n\n},{\"./cardinalOpen.js\":\"4cTvH\",\"./catmullRom.js\":\"8d6GP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gpcM0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nfunction LinearClosed(context) {\n    this._context = context;\n}\nLinearClosed.prototype = {\n    areaStart: (0, _noopJsDefault.default),\n    areaEnd: (0, _noopJsDefault.default),\n    lineStart: function() {\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._point) this._context.closePath();\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        if (this._point) this._context.lineTo(x, y);\n        else this._point = 1, this._context.moveTo(x, y);\n    }\n};\nexports.default = function(context) {\n    return new LinearClosed(context);\n};\n\n},{\"../noop.js\":\"9n7oj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kghkb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"monotoneX\", ()=>monotoneX);\nparcelHelpers.export(exports, \"monotoneY\", ()=>monotoneY);\nfunction sign(x) {\n    return x < 0 ? -1 : 1;\n}\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n    var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);\n    return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n    var h = that._x1 - that._x0;\n    return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n    var x0 = that._x0, y0 = that._y0, x1 = that._x1, y1 = that._y1, dx = (x1 - x0) / 3;\n    that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\nfunction MonotoneX(context) {\n    this._context = context;\n}\nMonotoneX.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        switch(this._point){\n            case 2:\n                this._context.lineTo(this._x1, this._y1);\n                break;\n            case 3:\n                point(this, this._t0, slope2(this, this._t0));\n                break;\n        }\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        var t1 = NaN;\n        x = +x, y = +y;\n        if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2;\n                break;\n            case 2:\n                this._point = 3;\n                point(this, slope2(this, t1 = slope3(this, x, y)), t1);\n                break;\n            default:\n                point(this, this._t0, t1 = slope3(this, x, y));\n                break;\n        }\n        this._x0 = this._x1, this._x1 = x;\n        this._y0 = this._y1, this._y1 = y;\n        this._t0 = t1;\n    }\n};\nfunction MonotoneY(context) {\n    this._context = new ReflectContext(context);\n}\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n    MonotoneX.prototype.point.call(this, y, x);\n};\nfunction ReflectContext(context) {\n    this._context = context;\n}\nReflectContext.prototype = {\n    moveTo: function(x, y) {\n        this._context.moveTo(y, x);\n    },\n    closePath: function() {\n        this._context.closePath();\n    },\n    lineTo: function(x, y) {\n        this._context.lineTo(y, x);\n    },\n    bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n        this._context.bezierCurveTo(y1, x1, y2, x2, y, x);\n    }\n};\nfunction monotoneX(context) {\n    return new MonotoneX(context);\n}\nfunction monotoneY(context) {\n    return new MonotoneY(context);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4f94Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction Natural(context) {\n    this._context = context;\n}\nNatural.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x = [];\n        this._y = [];\n    },\n    lineEnd: function() {\n        var x = this._x, y = this._y, n = x.length;\n        if (n) {\n            this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n            if (n === 2) this._context.lineTo(x[1], y[1]);\n            else {\n                var px = controlPoints(x), py = controlPoints(y);\n                for(var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1)this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n            }\n        }\n        if (this._line || this._line !== 0 && n === 1) this._context.closePath();\n        this._line = 1 - this._line;\n        this._x = this._y = null;\n    },\n    point: function(x, y) {\n        this._x.push(+x);\n        this._y.push(+y);\n    }\n};\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n    var i, n = x.length - 1, m, a = new Array(n), b = new Array(n), r = new Array(n);\n    a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n    for(i = 1; i < n - 1; ++i)a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n    a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n    for(i = 1; i < n; ++i)m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n    a[n - 1] = r[n - 1] / b[n - 1];\n    for(i = n - 2; i >= 0; --i)a[i] = (r[i] - a[i + 1]) / b[i];\n    b[n - 1] = (x[n] + a[n - 1]) / 2;\n    for(i = 0; i < n - 1; ++i)b[i] = 2 * x[i + 1] - a[i + 1];\n    return [\n        a,\n        b\n    ];\n}\nexports.default = function(context) {\n    return new Natural(context);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l5kmS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"stepBefore\", ()=>stepBefore);\nparcelHelpers.export(exports, \"stepAfter\", ()=>stepAfter);\nfunction Step(context, t) {\n    this._context = context;\n    this._t = t;\n}\nStep.prototype = {\n    areaStart: function() {\n        this._line = 0;\n    },\n    areaEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._x = this._y = NaN;\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n        if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n        if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n    },\n    point: function(x, y) {\n        x = +x, y = +y;\n        switch(this._point){\n            case 0:\n                this._point = 1;\n                this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n            case 1:\n                this._point = 2; // proceed\n            default:\n                if (this._t <= 0) {\n                    this._context.lineTo(this._x, y);\n                    this._context.lineTo(x, y);\n                } else {\n                    var x1 = this._x * (1 - this._t) + x * this._t;\n                    this._context.lineTo(x1, this._y);\n                    this._context.lineTo(x1, y);\n                }\n                break;\n        }\n        this._x = x, this._y = y;\n    }\n};\nexports.default = function(context) {\n    return new Step(context, 0.5);\n};\nfunction stepBefore(context) {\n    return new Step(context, 0);\n}\nfunction stepAfter(context) {\n    return new Step(context, 1);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f0yaA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"domCanvas\", ()=>(0, _domCanvas.domCanvas));\nparcelHelpers.export(exports, \"canvas\", ()=>(0, _domCanvas.domCanvas));\nparcelHelpers.export(exports, \"image\", ()=>(0, _domCanvas.domImage));\nvar _domCanvas = require(\"./src/domCanvas\");\n\n},{\"./src/domCanvas\":\"druMr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"druMr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"domCanvas\", ()=>domCanvas);\nparcelHelpers.export(exports, \"domImage\", ()=>domImage);\nfunction domCanvas(w, h) {\n    if (typeof document !== \"undefined\" && document.createElement) {\n        const c = document.createElement(\"canvas\");\n        if (c && c.getContext) {\n            c.width = w;\n            c.height = h;\n            return c;\n        }\n    }\n    return null;\n}\nconst domImage = ()=>typeof Image !== \"undefined\" ? Image : null;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bEydG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"scaleImplicit\", ()=>(0, _d3Scale.scaleImplicit));\nparcelHelpers.export(exports, \"Band\", ()=>Band);\nparcelHelpers.export(exports, \"BinOrdinal\", ()=>BinOrdinal);\nparcelHelpers.export(exports, \"DiscreteLegend\", ()=>DiscreteLegend);\nparcelHelpers.export(exports, \"Diverging\", ()=>Diverging);\nparcelHelpers.export(exports, \"GradientLegend\", ()=>GradientLegend);\nparcelHelpers.export(exports, \"Identity\", ()=>Identity);\nparcelHelpers.export(exports, \"Linear\", ()=>Linear);\nparcelHelpers.export(exports, \"Log\", ()=>Log);\nparcelHelpers.export(exports, \"Ordinal\", ()=>Ordinal);\nparcelHelpers.export(exports, \"Point\", ()=>Point);\nparcelHelpers.export(exports, \"Pow\", ()=>Pow);\nparcelHelpers.export(exports, \"Quantile\", ()=>Quantile);\nparcelHelpers.export(exports, \"Quantize\", ()=>Quantize);\nparcelHelpers.export(exports, \"Sequential\", ()=>Sequential);\nparcelHelpers.export(exports, \"Sqrt\", ()=>Sqrt);\nparcelHelpers.export(exports, \"SymbolLegend\", ()=>SymbolLegend);\nparcelHelpers.export(exports, \"Symlog\", ()=>Symlog);\nparcelHelpers.export(exports, \"Threshold\", ()=>Threshold);\nparcelHelpers.export(exports, \"Time\", ()=>Time);\nparcelHelpers.export(exports, \"UTC\", ()=>UTC);\nparcelHelpers.export(exports, \"bandSpace\", ()=>bandSpace);\nparcelHelpers.export(exports, \"domainCaption\", ()=>domainCaption);\nparcelHelpers.export(exports, \"interpolate\", ()=>interpolate);\nparcelHelpers.export(exports, \"interpolateColors\", ()=>interpolateColors);\nparcelHelpers.export(exports, \"interpolateRange\", ()=>interpolateRange);\nparcelHelpers.export(exports, \"isContinuous\", ()=>isContinuous);\nparcelHelpers.export(exports, \"isDiscrete\", ()=>isDiscrete);\nparcelHelpers.export(exports, \"isDiscretizing\", ()=>isDiscretizing);\nparcelHelpers.export(exports, \"isInterpolating\", ()=>isInterpolating);\nparcelHelpers.export(exports, \"isLogarithmic\", ()=>isLogarithmic);\nparcelHelpers.export(exports, \"isQuantile\", ()=>isQuantile);\nparcelHelpers.export(exports, \"isTemporal\", ()=>isTemporal);\nparcelHelpers.export(exports, \"isValidScaleType\", ()=>isValidScaleType);\nparcelHelpers.export(exports, \"labelFormat\", ()=>labelFormat);\nparcelHelpers.export(exports, \"labelFraction\", ()=>labelFraction);\nparcelHelpers.export(exports, \"labelValues\", ()=>labelValues);\nparcelHelpers.export(exports, \"quantizeInterpolator\", ()=>quantizeInterpolator);\nparcelHelpers.export(exports, \"scale\", ()=>scale);\nparcelHelpers.export(exports, \"scaleCopy\", ()=>scaleCopy);\nparcelHelpers.export(exports, \"scaleFraction\", ()=>scaleFraction);\nparcelHelpers.export(exports, \"scheme\", ()=>scheme);\nparcelHelpers.export(exports, \"tickCount\", ()=>tickCount);\nparcelHelpers.export(exports, \"tickFormat\", ()=>tickFormat);\nparcelHelpers.export(exports, \"tickValues\", ()=>tickValues);\nparcelHelpers.export(exports, \"validTicks\", ()=>validTicks);\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Array = require(\"d3-array\");\nvar _d3Scale = require(\"d3-scale\");\nvar _d3Interpolate = require(\"d3-interpolate\");\nvar _vegaTime = require(\"vega-time\");\nfunction bandSpace(count, paddingInner, paddingOuter) {\n    const space = count - paddingInner + paddingOuter * 2;\n    return count ? space > 0 ? space : 1 : 0;\n}\nconst Identity = \"identity\";\nconst Linear = \"linear\";\nconst Log = \"log\";\nconst Pow = \"pow\";\nconst Sqrt = \"sqrt\";\nconst Symlog = \"symlog\";\nconst Time = \"time\";\nconst UTC = \"utc\";\nconst Sequential = \"sequential\";\nconst Diverging = \"diverging\";\nconst Quantile = \"quantile\";\nconst Quantize = \"quantize\";\nconst Threshold = \"threshold\";\nconst Ordinal = \"ordinal\";\nconst Point = \"point\";\nconst Band = \"band\";\nconst BinOrdinal = \"bin-ordinal\"; // categories\nconst Continuous = \"continuous\";\nconst Discrete = \"discrete\";\nconst Discretizing = \"discretizing\";\nconst Interpolating = \"interpolating\";\nconst Temporal = \"temporal\";\nfunction invertRange(scale1) {\n    return function(_) {\n        let lo = _[0], hi = _[1], t;\n        if (hi < lo) {\n            t = lo;\n            lo = hi;\n            hi = t;\n        }\n        return [\n            scale1.invert(lo),\n            scale1.invert(hi)\n        ];\n    };\n}\nfunction invertRangeExtent(scale2) {\n    return function(_) {\n        const range = scale2.range();\n        let lo = _[0], hi = _[1], min = -1, max, t, i, n;\n        if (hi < lo) {\n            t = lo;\n            lo = hi;\n            hi = t;\n        }\n        for(i = 0, n = range.length; i < n; ++i)if (range[i] >= lo && range[i] <= hi) {\n            if (min < 0) min = i;\n            max = i;\n        }\n        if (min < 0) return undefined;\n        lo = scale2.invertExtent(range[min]);\n        hi = scale2.invertExtent(range[max]);\n        return [\n            lo[0] === undefined ? lo[1] : lo[0],\n            hi[1] === undefined ? hi[0] : hi[1]\n        ];\n    };\n}\nfunction band() {\n    const scale3 = (0, _d3Scale.scaleOrdinal)().unknown(undefined), domain = scale3.domain, ordinalRange = scale3.range;\n    let range$1 = [\n        0,\n        1\n    ], step, bandwidth, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5;\n    delete scale3.unknown;\n    function rescale() {\n        const n = domain().length, reverse = range$1[1] < range$1[0], stop = range$1[1 - reverse], space = bandSpace(n, paddingInner, paddingOuter);\n        let start = range$1[reverse - 0];\n        step = (stop - start) / (space || 1);\n        if (round) step = Math.floor(step);\n        start += (stop - start - step * (n - paddingInner)) * align;\n        bandwidth = step * (1 - paddingInner);\n        if (round) {\n            start = Math.round(start);\n            bandwidth = Math.round(bandwidth);\n        }\n        const values = (0, _d3Array.range)(n).map((i)=>start + step * i);\n        return ordinalRange(reverse ? values.reverse() : values);\n    }\n    scale3.domain = function(_) {\n        if (arguments.length) {\n            domain(_);\n            return rescale();\n        } else return domain();\n    };\n    scale3.range = function(_) {\n        if (arguments.length) {\n            range$1 = [\n                +_[0],\n                +_[1]\n            ];\n            return rescale();\n        } else return range$1.slice();\n    };\n    scale3.rangeRound = function(_) {\n        range$1 = [\n            +_[0],\n            +_[1]\n        ];\n        round = true;\n        return rescale();\n    };\n    scale3.bandwidth = function() {\n        return bandwidth;\n    };\n    scale3.step = function() {\n        return step;\n    };\n    scale3.round = function(_) {\n        if (arguments.length) {\n            round = !!_;\n            return rescale();\n        } else return round;\n    };\n    scale3.padding = function(_) {\n        if (arguments.length) {\n            paddingOuter = Math.max(0, Math.min(1, _));\n            paddingInner = paddingOuter;\n            return rescale();\n        } else return paddingInner;\n    };\n    scale3.paddingInner = function(_) {\n        if (arguments.length) {\n            paddingInner = Math.max(0, Math.min(1, _));\n            return rescale();\n        } else return paddingInner;\n    };\n    scale3.paddingOuter = function(_) {\n        if (arguments.length) {\n            paddingOuter = Math.max(0, Math.min(1, _));\n            return rescale();\n        } else return paddingOuter;\n    };\n    scale3.align = function(_) {\n        if (arguments.length) {\n            align = Math.max(0, Math.min(1, _));\n            return rescale();\n        } else return align;\n    };\n    scale3.invertRange = function(_) {\n        // bail if range has null or undefined values\n        if (_[0] == null || _[1] == null) return;\n        const reverse = range$1[1] < range$1[0], values = reverse ? ordinalRange().reverse() : ordinalRange(), n = values.length - 1;\n        let lo = +_[0], hi = +_[1], a, b, t; // bail if either range endpoint is invalid\n        if (lo !== lo || hi !== hi) return; // order range inputs, bail if outside of scale range\n        if (hi < lo) {\n            t = lo;\n            lo = hi;\n            hi = t;\n        }\n        if (hi < values[0] || lo > range$1[1 - reverse]) return; // binary search to index into scale range\n        a = Math.max(0, (0, _d3Array.bisectRight)(values, lo) - 1);\n        b = lo === hi ? a : (0, _d3Array.bisectRight)(values, hi) - 1; // increment index a if lo is within padding gap\n        if (lo - values[a] > bandwidth + 1e-10) ++a;\n        if (reverse) {\n            // map + swap\n            t = a;\n            a = n - b;\n            b = n - t;\n        }\n        return a > b ? undefined : domain().slice(a, b + 1);\n    };\n    scale3.invert = function(_) {\n        const value = scale3.invertRange([\n            _,\n            _\n        ]);\n        return value ? value[0] : value;\n    };\n    scale3.copy = function() {\n        return band().domain(domain()).range(range$1).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n    };\n    return rescale();\n}\nfunction pointish(scale4) {\n    const copy = scale4.copy;\n    scale4.padding = scale4.paddingOuter;\n    delete scale4.paddingInner;\n    scale4.copy = function() {\n        return pointish(copy());\n    };\n    return scale4;\n}\nfunction point() {\n    return pointish(band().paddingInner(1));\n}\nvar map = Array.prototype.map;\nfunction numbers(_) {\n    return map.call(_, (0, _vegaUtil.toNumber));\n}\nconst slice = Array.prototype.slice;\nfunction scaleBinOrdinal() {\n    let domain = [], range = [];\n    function scale5(x) {\n        return x == null || x !== x ? undefined : range[((0, _d3Array.bisect)(domain, x) - 1) % range.length];\n    }\n    scale5.domain = function(_) {\n        if (arguments.length) {\n            domain = numbers(_);\n            return scale5;\n        } else return domain.slice();\n    };\n    scale5.range = function(_) {\n        if (arguments.length) {\n            range = slice.call(_);\n            return scale5;\n        } else return range.slice();\n    };\n    scale5.tickFormat = function(count, specifier) {\n        return (0, _d3Scale.tickFormat)(domain[0], (0, _vegaUtil.peek)(domain), count == null ? 10 : count, specifier);\n    };\n    scale5.copy = function() {\n        return scaleBinOrdinal().domain(scale5.domain()).range(scale5.range());\n    };\n    return scale5;\n}\nconst scales = {};\n/**\n * Augment scales with their type and needed inverse methods.\n */ function create(type, constructor, metadata) {\n    const ctr = function scale() {\n        const s = constructor();\n        if (!s.invertRange) s.invertRange = s.invert ? invertRange(s) : s.invertExtent ? invertRangeExtent(s) : undefined;\n        s.type = type;\n        return s;\n    };\n    ctr.metadata = (0, _vegaUtil.toSet)((0, _vegaUtil.array)(metadata));\n    return ctr;\n}\nfunction scale(type, scale6, metadata) {\n    if (arguments.length > 1) {\n        scales[type] = create(type, scale6, metadata);\n        return this;\n    } else return isValidScaleType(type) ? scales[type] : undefined;\n} // identity scale\nscale(Identity, (0, _d3Scale.scaleIdentity)); // continuous scales\nscale(Linear, (0, _d3Scale.scaleLinear), Continuous);\nscale(Log, (0, _d3Scale.scaleLog), [\n    Continuous,\n    Log\n]);\nscale(Pow, (0, _d3Scale.scalePow), Continuous);\nscale(Sqrt, (0, _d3Scale.scaleSqrt), Continuous);\nscale(Symlog, (0, _d3Scale.scaleSymlog), Continuous);\nscale(Time, (0, _d3Scale.scaleTime), [\n    Continuous,\n    Temporal\n]);\nscale(UTC, (0, _d3Scale.scaleUtc), [\n    Continuous,\n    Temporal\n]); // sequential scales\nscale(Sequential, (0, _d3Scale.scaleSequential), [\n    Continuous,\n    Interpolating\n]); // backwards compat\nscale(\"\".concat(Sequential, \"-\").concat(Linear), (0, _d3Scale.scaleSequential), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Sequential, \"-\").concat(Log), (0, _d3Scale.scaleSequentialLog), [\n    Continuous,\n    Interpolating,\n    Log\n]);\nscale(\"\".concat(Sequential, \"-\").concat(Pow), (0, _d3Scale.scaleSequentialPow), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Sequential, \"-\").concat(Sqrt), (0, _d3Scale.scaleSequentialSqrt), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Sequential, \"-\").concat(Symlog), (0, _d3Scale.scaleSequentialSymlog), [\n    Continuous,\n    Interpolating\n]); // diverging scales\nscale(\"\".concat(Diverging, \"-\").concat(Linear), (0, _d3Scale.scaleDiverging), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Diverging, \"-\").concat(Log), (0, _d3Scale.scaleDivergingLog), [\n    Continuous,\n    Interpolating,\n    Log\n]);\nscale(\"\".concat(Diverging, \"-\").concat(Pow), (0, _d3Scale.scaleDivergingPow), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Diverging, \"-\").concat(Sqrt), (0, _d3Scale.scaleDivergingSqrt), [\n    Continuous,\n    Interpolating\n]);\nscale(\"\".concat(Diverging, \"-\").concat(Symlog), (0, _d3Scale.scaleDivergingSymlog), [\n    Continuous,\n    Interpolating\n]); // discretizing scales\nscale(Quantile, (0, _d3Scale.scaleQuantile), [\n    Discretizing,\n    Quantile\n]);\nscale(Quantize, (0, _d3Scale.scaleQuantize), Discretizing);\nscale(Threshold, (0, _d3Scale.scaleThreshold), Discretizing); // discrete scales\nscale(BinOrdinal, scaleBinOrdinal, [\n    Discrete,\n    Discretizing\n]);\nscale(Ordinal, (0, _d3Scale.scaleOrdinal), Discrete);\nscale(Band, band, Discrete);\nscale(Point, point, Discrete);\nfunction isValidScaleType(type) {\n    return (0, _vegaUtil.hasOwnProperty)(scales, type);\n}\nfunction hasType(key, type) {\n    const s = scales[key];\n    return s && s.metadata[type];\n}\nfunction isContinuous(key) {\n    return hasType(key, Continuous);\n}\nfunction isDiscrete(key) {\n    return hasType(key, Discrete);\n}\nfunction isDiscretizing(key) {\n    return hasType(key, Discretizing);\n}\nfunction isLogarithmic(key) {\n    return hasType(key, Log);\n}\nfunction isTemporal(key) {\n    return hasType(key, Temporal);\n}\nfunction isInterpolating(key) {\n    return hasType(key, Interpolating);\n}\nfunction isQuantile(key) {\n    return hasType(key, Quantile);\n}\nconst scaleProps = [\n    \"clamp\",\n    \"base\",\n    \"constant\",\n    \"exponent\"\n];\nfunction interpolateRange(interpolator, range) {\n    const start = range[0], span = (0, _vegaUtil.peek)(range) - start;\n    return function(i) {\n        return interpolator(start + i * span);\n    };\n}\nfunction interpolateColors(colors1, type, gamma) {\n    return (0, _d3Interpolate.piecewise)(interpolate(type || \"rgb\", gamma), colors1);\n}\nfunction quantizeInterpolator(interpolator, count) {\n    const samples = new Array(count), n = count + 1;\n    for(let i = 0; i < count;)samples[i] = interpolator(++i / n);\n    return samples;\n}\nfunction scaleCopy(scale7) {\n    const t = scale7.type, s = scale7.copy();\n    s.type = t;\n    return s;\n}\nfunction scaleFraction(scale$1, min, max) {\n    const delta = max - min;\n    let i, t, s;\n    if (!delta || !Number.isFinite(delta)) return (0, _vegaUtil.constant)(0.5);\n    else {\n        i = (t = scale$1.type).indexOf(\"-\");\n        t = i < 0 ? t : t.slice(i + 1);\n        s = scale(t)().domain([\n            min,\n            max\n        ]).range([\n            0,\n            1\n        ]);\n        scaleProps.forEach((m)=>scale$1[m] ? s[m](scale$1[m]()) : 0);\n        return s;\n    }\n}\nfunction interpolate(type, gamma) {\n    const interp = _d3Interpolate[method(type)];\n    return gamma != null && interp && interp.gamma ? interp.gamma(gamma) : interp;\n}\nfunction method(type) {\n    return \"interpolate\" + type.toLowerCase().split(\"-\").map((s)=>s[0].toUpperCase() + s.slice(1)).join(\"\");\n}\nconst continuous = {\n    blues: \"cfe1f2bed8eca8cee58fc1de74b2d75ba3cf4592c63181bd206fb2125ca40a4a90\",\n    greens: \"d3eecdc0e6baabdda594d3917bc77d60ba6c46ab5e329a512089430e7735036429\",\n    greys: \"e2e2e2d4d4d4c4c4c4b1b1b19d9d9d8888887575756262624d4d4d3535351e1e1e\",\n    oranges: \"fdd8b3fdc998fdb87bfda55efc9244f87f2cf06b18e4580bd14904b93d029f3303\",\n    purples: \"e2e1efd4d4e8c4c5e0b4b3d6a3a0cc928ec3827cb97566ae684ea25c3696501f8c\",\n    reds: \"fdc9b4fcb49afc9e80fc8767fa7051f6573fec3f2fdc2a25c81b1db21218970b13\",\n    blueGreen: \"d5efedc1e8e0a7ddd18bd2be70c6a958ba9144ad77319c5d2089460e7736036429\",\n    bluePurple: \"ccddecbad0e4a8c2dd9ab0d4919cc98d85be8b6db28a55a6873c99822287730f71\",\n    greenBlue: \"d3eecec5e8c3b1e1bb9bd8bb82cec269c2ca51b2cd3c9fc7288abd1675b10b60a1\",\n    orangeRed: \"fddcaffdcf9bfdc18afdad77fb9562f67d53ee6545e24932d32d1ebf130da70403\",\n    purpleBlue: \"dbdaebc8cee4b1c3de97b7d87bacd15b9fc93a90c01e7fb70b70ab056199045281\",\n    purpleBlueGreen: \"dbd8eac8cee4b0c3de93b7d872acd1549fc83892bb1c88a3097f8702736b016353\",\n    purpleRed: \"dcc9e2d3b3d7ce9eccd186c0da6bb2e14da0e23189d91e6fc61159ab07498f023a\",\n    redPurple: \"fccfccfcbec0faa9b8f98faff571a5ec539ddb3695c41b8aa908808d0179700174\",\n    yellowGreen: \"e4f4acd1eca0b9e2949ed68880c97c62bb6e47aa5e3297502083440e723b036034\",\n    yellowOrangeBrown: \"feeaa1fedd84fecc63feb746fca031f68921eb7215db5e0bc54c05ab3d038f3204\",\n    yellowOrangeRed: \"fee087fed16ffebd59fea849fd903efc7335f9522bee3423de1b20ca0b22af0225\",\n    blueOrange: \"134b852f78b35da2cb9dcae1d2e5eff2f0ebfce0bafbbf74e8932fc5690d994a07\",\n    brownBlueGreen: \"704108a0651ac79548e3c78af3e6c6eef1eac9e9e48ed1c74da79e187a72025147\",\n    purpleGreen: \"5b1667834792a67fb6c9aed3e6d6e8eff0efd9efd5aedda971bb75368e490e5e29\",\n    purpleOrange: \"4114696647968f83b7b9b4d6dadbebf3eeeafce0bafbbf74e8932fc5690d994a07\",\n    redBlue: \"8c0d25bf363adf745ef4ae91fbdbc9f2efeed2e5ef9dcae15da2cb2f78b3134b85\",\n    redGrey: \"8c0d25bf363adf745ef4ae91fcdccbfaf4f1e2e2e2c0c0c0969696646464343434\",\n    yellowGreenBlue: \"eff9bddbf1b4bde5b594d5b969c5be45b4c22c9ec02182b82163aa23479c1c3185\",\n    redYellowBlue: \"a50026d4322cf16e43fcac64fedd90faf8c1dcf1ecabd6e875abd04a74b4313695\",\n    redYellowGreen: \"a50026d4322cf16e43fcac63fedd8df9f7aed7ee8ea4d86e64bc6122964f006837\",\n    pinkYellowGreen: \"8e0152c0267edd72adf0b3d6faddedf5f3efe1f2cab6de8780bb474f9125276419\",\n    spectral: \"9e0142d13c4bf0704afcac63fedd8dfbf8b0e0f3a1a9dda269bda94288b55e4fa2\",\n    viridis: \"440154470e61481a6c482575472f7d443a834144873d4e8a39568c35608d31688e2d708e2a788e27818e23888e21918d1f988b1fa08822a8842ab07f35b77943bf7154c56866cc5d7ad1518fd744a5db36bcdf27d2e21be9e51afde725\",\n    magma: \"0000040404130b0924150e3720114b2c11603b0f704a107957157e651a80721f817f24828c29819a2e80a8327db6377ac43c75d1426fde4968e95462f1605df76f5cfa7f5efc8f65fe9f6dfeaf78febf84fece91fddea0fcedaffcfdbf\",\n    inferno: \"0000040403130c0826170c3b240c4f330a5f420a68500d6c5d126e6b176e781c6d86216b932667a12b62ae305cbb3755c73e4cd24644dd513ae65c30ed6925f3771af8850ffb9506fca50afcb519fac62df6d645f2e661f3f484fcffa4\",\n    plasma: \"0d088723069033059742039d5002a25d01a66a00a87801a88405a7900da49c179ea72198b12a90ba3488c33d80cb4779d35171da5a69e16462e76e5bed7953f2834cf68f44fa9a3dfca636fdb32ffec029fcce25f9dc24f5ea27f0f921\",\n    cividis: \"00205100235800265d002961012b65042e670831690d346b11366c16396d1c3c6e213f6e26426e2c456e31476e374a6e3c4d6e42506e47536d4c566d51586e555b6e5a5e6e5e616e62646f66676f6a6a706e6d717270717573727976737c79747f7c75827f758682768985778c8877908b78938e789691789a94789e9778a19b78a59e77a9a177aea575b2a874b6ab73bbaf71c0b26fc5b66dc9b96acebd68d3c065d8c462ddc85fe2cb5ce7cf58ebd355f0d652f3da4ff7de4cfae249fce647\",\n    rainbow: \"6e40aa883eb1a43db3bf3cafd83fa4ee4395fe4b83ff576eff6659ff7847ff8c38f3a130e2b72fcfcc36bee044aff05b8ff4576ff65b52f6673af27828ea8d1ddfa319d0b81cbecb23abd82f96e03d82e14c6edb5a5dd0664dbf6e40aa\",\n    sinebow: \"ff4040fc582af47218e78d0bd5a703bfbf00a7d5038de70b72f41858fc2a40ff402afc5818f4720be78d03d5a700bfbf03a7d50b8de71872f42a58fc4040ff582afc7218f48d0be7a703d5bf00bfd503a7e70b8df41872fc2a58ff4040\",\n    turbo: \"23171b32204a3e2a71453493493eae4b49c54a53d7485ee44569ee4074f53c7ff8378af93295f72e9ff42ba9ef28b3e926bce125c5d925cdcf27d5c629dcbc2de3b232e9a738ee9d3ff39347f68950f9805afc7765fd6e70fe667cfd5e88fc5795fb51a1f84badf545b9f140c5ec3cd0e637dae034e4d931ecd12ef4c92bfac029ffb626ffad24ffa223ff9821ff8d1fff821dff771cfd6c1af76118f05616e84b14df4111d5380fcb2f0dc0260ab61f07ac1805a313029b0f00950c00910b00\",\n    browns: \"eedbbdecca96e9b97ae4a865dc9856d18954c7784cc0673fb85536ad44339f3632\",\n    tealBlues: \"bce4d89dd3d181c3cb65b3c245a2b9368fae347da0306a932c5985\",\n    teals: \"bbdfdfa2d4d58ac9c975bcbb61b0af4da5a43799982b8b8c1e7f7f127273006667\",\n    warmGreys: \"dcd4d0cec5c1c0b8b4b3aaa7a59c9998908c8b827f7e7673726866665c5a59504e\",\n    goldGreen: \"f4d166d5ca60b6c35c98bb597cb25760a6564b9c533f8f4f33834a257740146c36\",\n    goldOrange: \"f4d166f8be5cf8aa4cf5983bf3852aef701be2621fd65322c54923b142239e3a26\",\n    goldRed: \"f4d166f6be59f9aa51fc964ef6834bee734ae56249db5247cf4244c43141b71d3e\",\n    lightGreyRed: \"efe9e6e1dad7d5cbc8c8bdb9bbaea9cd967ddc7b43e15f19df4011dc000b\",\n    lightGreyTeal: \"e4eaead6dcddc8ced2b7c2c7a6b4bc64b0bf22a6c32295c11f85be1876bc\",\n    lightMulti: \"e0f1f2c4e9d0b0de9fd0e181f6e072f6c053f3993ef77440ef4a3c\",\n    lightOrange: \"f2e7daf7d5baf9c499fab184fa9c73f68967ef7860e8645bde515bd43d5b\",\n    lightTealBlue: \"e3e9e0c0dccf9aceca7abfc859afc0389fb9328dad2f7ca0276b95255988\",\n    darkBlue: \"3232322d46681a5c930074af008cbf05a7ce25c0dd38daed50f3faffffff\",\n    darkGold: \"3c3c3c584b37725e348c7631ae8b2bcfa424ecc31ef9de30fff184ffffff\",\n    darkGreen: \"3a3a3a215748006f4d048942489e4276b340a6c63dd2d836ffeb2cffffaa\",\n    darkMulti: \"3737371f5287197d8c29a86995ce3fffe800ffffff\",\n    darkRed: \"3434347036339e3c38cc4037e75d1eec8620eeab29f0ce32ffeb2c\"\n};\nconst discrete = {\n    category10: \"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\",\n    category20: \"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\",\n    category20b: \"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\",\n    category20c: \"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\",\n    tableau10: \"4c78a8f58518e4575672b7b254a24beeca3bb279a2ff9da69d755dbab0ac\",\n    tableau20: \"4c78a89ecae9f58518ffbf7954a24b88d27ab79a20f2cf5b43989483bcb6e45756ff9d9879706ebab0acd67195fcbfd2b279a2d6a5c99e765fd8b5a5\",\n    accent: \"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\",\n    dark2: \"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\",\n    paired: \"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\",\n    pastel1: \"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\",\n    pastel2: \"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\",\n    set1: \"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\",\n    set2: \"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\",\n    set3: \"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\"\n};\nfunction colors(palette) {\n    const n = palette.length / 6 | 0, c = new Array(n);\n    for(let i = 0; i < n;)c[i] = \"#\" + palette.slice(i * 6, ++i * 6);\n    return c;\n}\nfunction apply(_, f) {\n    for(const k in _)scheme(k, f(_[k]));\n}\nconst schemes = {};\napply(discrete, colors);\napply(continuous, (_)=>interpolateColors(colors(_)));\nfunction scheme(name, scheme1) {\n    name = name && name.toLowerCase();\n    if (arguments.length > 1) {\n        schemes[name] = scheme1;\n        return this;\n    } else return schemes[name];\n}\nconst SymbolLegend = \"symbol\";\nconst DiscreteLegend = \"discrete\";\nconst GradientLegend = \"gradient\";\nconst defaultFormatter = (value)=>(0, _vegaUtil.isArray)(value) ? value.map((v)=>String(v)) : String(value);\nconst ascending = (a, b)=>a[1] - b[1];\nconst descending = (a, b)=>b[1] - a[1];\n/**\n * Determine the tick count or interval function.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {*} count - The desired tick count or interval specifier.\n * @param {number} minStep - The desired minimum step between tick values.\n * @return {*} - The tick count or interval function.\n */ function tickCount(scale8, count, minStep) {\n    let step;\n    if ((0, _vegaUtil.isNumber)(count)) {\n        if (scale8.bins) count = Math.max(count, scale8.bins.length);\n        if (minStep != null) count = Math.min(count, Math.floor((0, _vegaUtil.span)(scale8.domain()) / minStep || 1));\n    }\n    if ((0, _vegaUtil.isObject)(count)) {\n        step = count.step;\n        count = count.interval;\n    }\n    if ((0, _vegaUtil.isString)(count)) {\n        count = scale8.type === Time ? (0, _vegaTime.timeInterval)(count) : scale8.type == UTC ? (0, _vegaTime.utcInterval)(count) : (0, _vegaUtil.error)(\"Only time and utc scales accept interval strings.\");\n        if (step) count = count.every(step);\n    }\n    return count;\n}\n/**\n * Filter a set of candidate tick values, ensuring that only tick values\n * that lie within the scale range are included.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {Array<*>} ticks - The candidate tick values.\n * @param {*} count - The tick count or interval function.\n * @return {Array<*>} - The filtered tick values.\n */ function validTicks(scale9, ticks, count) {\n    let range = scale9.range(), lo = range[0], hi = (0, _vegaUtil.peek)(range), cmp = ascending;\n    if (lo > hi) {\n        range = hi;\n        hi = lo;\n        lo = range;\n        cmp = descending;\n    }\n    lo = Math.floor(lo);\n    hi = Math.ceil(hi); // filter ticks to valid values within the range\n    // additionally sort ticks in range order (#2579)\n    ticks = ticks.map((v)=>[\n            v,\n            scale9(v)\n        ]).filter((_)=>lo <= _[1] && _[1] <= hi).sort(cmp).map((_)=>_[0]);\n    if (count > 0 && ticks.length > 1) {\n        const endpoints = [\n            ticks[0],\n            (0, _vegaUtil.peek)(ticks)\n        ];\n        while(ticks.length > count && ticks.length >= 3)ticks = ticks.filter((_, i)=>!(i % 2));\n        if (ticks.length < 3) ticks = endpoints;\n    }\n    return ticks;\n}\n/**\n * Generate tick values for the given scale and approximate tick count or\n * interval value. If the scale has a 'ticks' method, it will be used to\n * generate the ticks, with the count argument passed as a parameter. If the\n * scale lacks a 'ticks' method, the full scale domain will be returned.\n * @param {Scale} scale - The scale for which to generate tick values.\n * @param {*} [count] - The approximate number of desired ticks.\n * @return {Array<*>} - The generated tick values.\n */ function tickValues(scale10, count) {\n    return scale10.bins ? validTicks(scale10, scale10.bins) : scale10.ticks ? scale10.ticks(count) : scale10.domain();\n}\n/**\n * Generate a label format function for a scale. If the scale has a\n * 'tickFormat' method, it will be used to generate the formatter, with the\n * count and specifier arguments passed as parameters. If the scale lacks a\n * 'tickFormat' method, the returned formatter performs simple string coercion.\n * If the input scale is a logarithmic scale and the format specifier does not\n * indicate a desired decimal precision, a special variable precision formatter\n * that automatically trims trailing zeroes will be generated.\n * @param {Scale} scale - The scale for which to generate the label formatter.\n * @param {*} [count] - The approximate number of desired ticks.\n * @param {string} [specifier] - The format specifier. Must be a legal d3\n *   specifier string (see https://github.com/d3/d3-format#formatSpecifier) or\n *   time multi-format specifier object.\n * @return {function(*):string} - The generated label formatter.\n */ function tickFormat(locale, scale11, count, specifier, formatType, noSkip) {\n    const type = scale11.type;\n    let format1 = defaultFormatter;\n    if (type === Time || formatType === Time) format1 = locale.timeFormat(specifier);\n    else if (type === UTC || formatType === UTC) format1 = locale.utcFormat(specifier);\n    else if (isLogarithmic(type)) {\n        const varfmt = locale.formatFloat(specifier);\n        if (noSkip || scale11.bins) format1 = varfmt;\n        else {\n            const test = tickLog(scale11, count, false);\n            format1 = (_)=>test(_) ? varfmt(_) : \"\";\n        }\n    } else if (scale11.tickFormat) {\n        // if d3 scale has tickFormat, it must be continuous\n        const d = scale11.domain();\n        format1 = locale.formatSpan(d[0], d[d.length - 1], count, specifier);\n    } else if (specifier) format1 = locale.format(specifier);\n    return format1;\n}\nfunction tickLog(scale12, count, values) {\n    const ticks = tickValues(scale12, count), base = scale12.base(), logb = Math.log(base), k = Math.max(1, base * count / ticks.length); // apply d3-scale's log format filter criteria\n    const test = (d)=>{\n        let i = d / Math.pow(base, Math.round(Math.log(d) / logb));\n        if (i * base < base - 0.5) i *= base;\n        return i <= k;\n    };\n    return values ? ticks.filter(test) : test;\n}\nconst symbols = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"thresholds\",\n    [Threshold]: \"domain\"\n};\nconst formats = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"domain\"\n};\nfunction labelValues(scale13, count) {\n    return scale13.bins ? binValues(scale13.bins) : scale13.type === Log ? tickLog(scale13, count, true) : symbols[scale13.type] ? thresholdValues(scale13[symbols[scale13.type]]()) : tickValues(scale13, count);\n}\nfunction thresholdFormat(locale, scale14, specifier) {\n    const _ = scale14[formats[scale14.type]](), n = _.length;\n    let d = n > 1 ? _[1] - _[0] : _[0], i;\n    for(i = 1; i < n; ++i)d = Math.min(d, _[i] - _[i - 1]);\n     // tickCount = 3 ticks times 10 for increased resolution\n    return locale.formatSpan(0, d, 30, specifier);\n}\nfunction thresholdValues(thresholds) {\n    const values = [\n        -Infinity\n    ].concat(thresholds);\n    values.max = Infinity;\n    return values;\n}\nfunction binValues(bins) {\n    const values = bins.slice(0, -1);\n    values.max = (0, _vegaUtil.peek)(bins);\n    return values;\n}\nconst isDiscreteRange = (scale15)=>symbols[scale15.type] || scale15.bins;\nfunction labelFormat(locale, scale16, count, type, specifier, formatType, noSkip) {\n    const format2 = formats[scale16.type] && formatType !== Time && formatType !== UTC ? thresholdFormat(locale, scale16, specifier) : tickFormat(locale, scale16, count, specifier, formatType, noSkip);\n    return type === SymbolLegend && isDiscreteRange(scale16) ? formatRange(format2) : type === DiscreteLegend ? formatDiscrete(format2) : formatPoint(format2);\n}\nconst formatRange = (format3)=>(value, index, array)=>{\n        const limit = get(array[index + 1], get(array.max, Infinity)), lo = formatValue(value, format3), hi = formatValue(limit, format3);\n        return lo && hi ? lo + \" \\u2013 \" + hi : hi ? \"< \" + hi : \"\\u2265 \" + lo;\n    };\nconst get = (value, dflt)=>value != null ? value : dflt;\nconst formatDiscrete = (format4)=>(value, index)=>index ? format4(value) : null;\nconst formatPoint = (format5)=>(value)=>format5(value);\nconst formatValue = (value, format6)=>Number.isFinite(value) ? format6(value) : null;\nfunction labelFraction(scale17) {\n    const domain = scale17.domain(), count = domain.length - 1;\n    let lo = +domain[0], hi = +(0, _vegaUtil.peek)(domain), span = hi - lo;\n    if (scale17.type === Threshold) {\n        const adjust = count ? span / count : 0.1;\n        lo -= adjust;\n        hi += adjust;\n        span = hi - lo;\n    }\n    return (value)=>(value - lo) / span;\n}\nfunction format(locale, scale18, specifier, formatType) {\n    const type = formatType || scale18.type; // replace abbreviated time specifiers to improve screen reader experience\n    if ((0, _vegaUtil.isString)(specifier) && isTemporal(type)) specifier = specifier.replace(/%a/g, \"%A\").replace(/%b/g, \"%B\");\n    return !specifier && type === Time ? locale.timeFormat(\"%A, %d %B %Y, %X\") : !specifier && type === UTC ? locale.utcFormat(\"%A, %d %B %Y, %X UTC\") : labelFormat(locale, scale18, 5, null, specifier, formatType, true);\n}\nfunction domainCaption(locale, scale19, opt) {\n    opt = opt || {};\n    const max = Math.max(3, opt.maxlen || 7), fmt = format(locale, scale19, opt.format, opt.formatType); // if scale breaks domain into bins, describe boundaries\n    if (isDiscretizing(scale19.type)) {\n        const v = labelValues(scale19).slice(1).map(fmt), n = v.length;\n        return \"\".concat(n, \" boundar\").concat(n === 1 ? \"y\" : \"ies\", \": \").concat(v.join(\", \"));\n    } else if (isDiscrete(scale19.type)) {\n        const d = scale19.domain(), n = d.length, v = n > max ? d.slice(0, max - 2).map(fmt).join(\", \") + \", ending with \" + d.slice(-1).map(fmt) : d.map(fmt).join(\", \");\n        return \"\".concat(n, \" value\").concat(n === 1 ? \"\" : \"s\", \": \").concat(v);\n    } else {\n        const d = scale19.domain();\n        return \"values from \".concat(fmt(d[0]), \" to \").concat(fmt((0, _vegaUtil.peek)(d)));\n    }\n}\n\n},{\"vega-util\":\"bApja\",\"d3-array\":\"6IwJG\",\"d3-scale\":\"9G9pz\",\"d3-interpolate\":\"6gbPP\",\"vega-time\":\"27kpp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9G9pz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"scaleBand\", ()=>(0, _bandJsDefault.default));\nparcelHelpers.export(exports, \"scalePoint\", ()=>(0, _bandJs.point));\nparcelHelpers.export(exports, \"scaleIdentity\", ()=>(0, _identityJsDefault.default));\nparcelHelpers.export(exports, \"scaleLinear\", ()=>(0, _linearJsDefault.default));\nparcelHelpers.export(exports, \"scaleLog\", ()=>(0, _logJsDefault.default));\nparcelHelpers.export(exports, \"scaleSymlog\", ()=>(0, _symlogJsDefault.default));\nparcelHelpers.export(exports, \"scaleOrdinal\", ()=>(0, _ordinalJsDefault.default));\nparcelHelpers.export(exports, \"scaleImplicit\", ()=>(0, _ordinalJs.implicit));\nparcelHelpers.export(exports, \"scalePow\", ()=>(0, _powJsDefault.default));\nparcelHelpers.export(exports, \"scaleSqrt\", ()=>(0, _powJs.sqrt));\nparcelHelpers.export(exports, \"scaleRadial\", ()=>(0, _radialJsDefault.default));\nparcelHelpers.export(exports, \"scaleQuantile\", ()=>(0, _quantileJsDefault.default));\nparcelHelpers.export(exports, \"scaleQuantize\", ()=>(0, _quantizeJsDefault.default));\nparcelHelpers.export(exports, \"scaleThreshold\", ()=>(0, _thresholdJsDefault.default));\nparcelHelpers.export(exports, \"scaleTime\", ()=>(0, _timeJsDefault.default));\nparcelHelpers.export(exports, \"scaleUtc\", ()=>(0, _utcTimeJsDefault.default));\nparcelHelpers.export(exports, \"scaleSequential\", ()=>(0, _sequentialJsDefault.default));\nparcelHelpers.export(exports, \"scaleSequentialLog\", ()=>(0, _sequentialJs.sequentialLog));\nparcelHelpers.export(exports, \"scaleSequentialPow\", ()=>(0, _sequentialJs.sequentialPow));\nparcelHelpers.export(exports, \"scaleSequentialSqrt\", ()=>(0, _sequentialJs.sequentialSqrt));\nparcelHelpers.export(exports, \"scaleSequentialSymlog\", ()=>(0, _sequentialJs.sequentialSymlog));\nparcelHelpers.export(exports, \"scaleSequentialQuantile\", ()=>(0, _sequentialQuantileJsDefault.default));\nparcelHelpers.export(exports, \"scaleDiverging\", ()=>(0, _divergingJsDefault.default));\nparcelHelpers.export(exports, \"scaleDivergingLog\", ()=>(0, _divergingJs.divergingLog));\nparcelHelpers.export(exports, \"scaleDivergingPow\", ()=>(0, _divergingJs.divergingPow));\nparcelHelpers.export(exports, \"scaleDivergingSqrt\", ()=>(0, _divergingJs.divergingSqrt));\nparcelHelpers.export(exports, \"scaleDivergingSymlog\", ()=>(0, _divergingJs.divergingSymlog));\nparcelHelpers.export(exports, \"tickFormat\", ()=>(0, _tickFormatJsDefault.default));\nvar _bandJs = require(\"./band.js\");\nvar _bandJsDefault = parcelHelpers.interopDefault(_bandJs);\nvar _identityJs = require(\"./identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _linearJs = require(\"./linear.js\");\nvar _linearJsDefault = parcelHelpers.interopDefault(_linearJs);\nvar _logJs = require(\"./log.js\");\nvar _logJsDefault = parcelHelpers.interopDefault(_logJs);\nvar _symlogJs = require(\"./symlog.js\");\nvar _symlogJsDefault = parcelHelpers.interopDefault(_symlogJs);\nvar _ordinalJs = require(\"./ordinal.js\");\nvar _ordinalJsDefault = parcelHelpers.interopDefault(_ordinalJs);\nvar _powJs = require(\"./pow.js\");\nvar _powJsDefault = parcelHelpers.interopDefault(_powJs);\nvar _radialJs = require(\"./radial.js\");\nvar _radialJsDefault = parcelHelpers.interopDefault(_radialJs);\nvar _quantileJs = require(\"./quantile.js\");\nvar _quantileJsDefault = parcelHelpers.interopDefault(_quantileJs);\nvar _quantizeJs = require(\"./quantize.js\");\nvar _quantizeJsDefault = parcelHelpers.interopDefault(_quantizeJs);\nvar _thresholdJs = require(\"./threshold.js\");\nvar _thresholdJsDefault = parcelHelpers.interopDefault(_thresholdJs);\nvar _timeJs = require(\"./time.js\");\nvar _timeJsDefault = parcelHelpers.interopDefault(_timeJs);\nvar _utcTimeJs = require(\"./utcTime.js\");\nvar _utcTimeJsDefault = parcelHelpers.interopDefault(_utcTimeJs);\nvar _sequentialJs = require(\"./sequential.js\");\nvar _sequentialJsDefault = parcelHelpers.interopDefault(_sequentialJs);\nvar _sequentialQuantileJs = require(\"./sequentialQuantile.js\");\nvar _sequentialQuantileJsDefault = parcelHelpers.interopDefault(_sequentialQuantileJs);\nvar _divergingJs = require(\"./diverging.js\");\nvar _divergingJsDefault = parcelHelpers.interopDefault(_divergingJs);\nvar _tickFormatJs = require(\"./tickFormat.js\");\nvar _tickFormatJsDefault = parcelHelpers.interopDefault(_tickFormatJs);\n\n},{\"./band.js\":false,\"./identity.js\":\"le9d2\",\"./linear.js\":\"5CETT\",\"./log.js\":\"2gcSE\",\"./symlog.js\":\"iUUr7\",\"./ordinal.js\":\"1j3zZ\",\"./pow.js\":\"i4lyo\",\"./radial.js\":false,\"./quantile.js\":\"aAURo\",\"./quantize.js\":\"jjcn6\",\"./threshold.js\":\"8ndX3\",\"./time.js\":\"cjAqm\",\"./utcTime.js\":\"cM5gE\",\"./sequential.js\":\"f1sM1\",\"./sequentialQuantile.js\":false,\"./diverging.js\":\"9Qcq3\",\"./tickFormat.js\":\"dksn9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"le9d2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _linearJs = require(\"./linear.js\");\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nfunction identity(domain) {\n    var unknown;\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : x;\n    }\n    scale.invert = scale;\n    scale.domain = scale.range = function(_) {\n        return arguments.length ? (domain = Array.from(_, (0, _numberJsDefault.default)), scale) : domain.slice();\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    scale.copy = function() {\n        return identity(domain).unknown(unknown);\n    };\n    domain = arguments.length ? Array.from(domain, (0, _numberJsDefault.default)) : [\n        0,\n        1\n    ];\n    return (0, _linearJs.linearish)(scale);\n}\nexports.default = identity;\n\n},{\"./linear.js\":\"5CETT\",\"./number.js\":\"bOzsY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5CETT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"linearish\", ()=>linearish);\nvar _d3Array = require(\"d3-array\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _continuousJsDefault = parcelHelpers.interopDefault(_continuousJs);\nvar _initJs = require(\"./init.js\");\nvar _tickFormatJs = require(\"./tickFormat.js\");\nvar _tickFormatJsDefault = parcelHelpers.interopDefault(_tickFormatJs);\nfunction linearish(scale) {\n    var domain = scale.domain;\n    scale.ticks = function(count) {\n        var d = domain();\n        return (0, _d3Array.ticks)(d[0], d[d.length - 1], count == null ? 10 : count);\n    };\n    scale.tickFormat = function(count, specifier) {\n        var d = domain();\n        return (0, _tickFormatJsDefault.default)(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n    };\n    scale.nice = function(count) {\n        if (count == null) count = 10;\n        var d = domain();\n        var i0 = 0;\n        var i1 = d.length - 1;\n        var start = d[i0];\n        var stop = d[i1];\n        var prestep;\n        var step;\n        var maxIter = 10;\n        if (stop < start) {\n            step = start, start = stop, stop = step;\n            step = i0, i0 = i1, i1 = step;\n        }\n        while(maxIter-- > 0){\n            step = (0, _d3Array.tickIncrement)(start, stop, count);\n            if (step === prestep) {\n                d[i0] = start;\n                d[i1] = stop;\n                return domain(d);\n            } else if (step > 0) {\n                start = Math.floor(start / step) * step;\n                stop = Math.ceil(stop / step) * step;\n            } else if (step < 0) {\n                start = Math.ceil(start * step) / step;\n                stop = Math.floor(stop * step) / step;\n            } else break;\n            prestep = step;\n        }\n        return scale;\n    };\n    return scale;\n}\nfunction linear() {\n    var scale = (0, _continuousJsDefault.default)();\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, linear());\n    };\n    (0, _initJs.initRange).apply(scale, arguments);\n    return linearish(scale);\n}\nexports.default = linear;\n\n},{\"d3-array\":\"6IwJG\",\"./continuous.js\":\"it8xE\",\"./init.js\":\"kLKEv\",\"./tickFormat.js\":\"dksn9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"it8xE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"identity\", ()=>identity);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"transformer\", ()=>transformer);\nvar _d3Array = require(\"d3-array\");\nvar _d3Interpolate = require(\"d3-interpolate\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar unit = [\n    0,\n    1\n];\nfunction identity(x) {\n    return x;\n}\nfunction normalize(a, b) {\n    return (b -= a = +a) ? function(x) {\n        return (x - a) / b;\n    } : (0, _constantJsDefault.default)(isNaN(b) ? NaN : 0.5);\n}\nfunction clamper(a, b) {\n    var t;\n    if (a > b) t = a, a = b, b = t;\n    return function(x) {\n        return Math.max(a, Math.min(b, x));\n    };\n}\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n    var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n    if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n    else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n    return function(x) {\n        return r0(d0(x));\n    };\n}\nfunction polymap(domain, range, interpolate) {\n    var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i1 = -1;\n    // Reverse descending domains.\n    if (domain[j] < domain[0]) {\n        domain = domain.slice().reverse();\n        range = range.slice().reverse();\n    }\n    while(++i1 < j){\n        d[i1] = normalize(domain[i1], domain[i1 + 1]);\n        r[i1] = interpolate(range[i1], range[i1 + 1]);\n    }\n    return function(x) {\n        var i = (0, _d3Array.bisect)(domain, x, 1, j) - 1;\n        return r[i](d[i](x));\n    };\n}\nfunction copy(source, target) {\n    return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp()).unknown(source.unknown());\n}\nfunction transformer() {\n    var domain = unit, range = unit, interpolate = (0, _d3Interpolate.interpolate), transform, untransform, unknown, clamp = identity, piecewise, output, input;\n    function rescale() {\n        var n = Math.min(domain.length, range.length);\n        if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n        piecewise = n > 2 ? polymap : bimap;\n        output = input = null;\n        return scale;\n    }\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n    }\n    scale.invert = function(y) {\n        return clamp(untransform((input || (input = piecewise(range, domain.map(transform), (0, _d3Interpolate.interpolateNumber))))(y)));\n    };\n    scale.domain = function(_) {\n        return arguments.length ? (domain = Array.from(_, (0, _numberJsDefault.default)), rescale()) : domain.slice();\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n    };\n    scale.rangeRound = function(_) {\n        return range = Array.from(_), interpolate = (0, _d3Interpolate.interpolateRound), rescale();\n    };\n    scale.clamp = function(_) {\n        return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n    };\n    scale.interpolate = function(_) {\n        return arguments.length ? (interpolate = _, rescale()) : interpolate;\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    return function(t, u) {\n        transform = t, untransform = u;\n        return rescale();\n    };\n}\nfunction continuous() {\n    return transformer()(identity, identity);\n}\nexports.default = continuous;\n\n},{\"d3-array\":\"6IwJG\",\"d3-interpolate\":\"6gbPP\",\"./constant.js\":\"9JgB5\",\"./number.js\":\"bOzsY\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6gbPP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"interpolate\", ()=>(0, _valueJsDefault.default));\nparcelHelpers.export(exports, \"interpolateArray\", ()=>(0, _arrayJsDefault.default));\nparcelHelpers.export(exports, \"interpolateBasis\", ()=>(0, _basisJsDefault.default));\nparcelHelpers.export(exports, \"interpolateBasisClosed\", ()=>(0, _basisClosedJsDefault.default));\nparcelHelpers.export(exports, \"interpolateDate\", ()=>(0, _dateJsDefault.default));\nparcelHelpers.export(exports, \"interpolateDiscrete\", ()=>(0, _discreteJsDefault.default));\nparcelHelpers.export(exports, \"interpolateHue\", ()=>(0, _hueJsDefault.default));\nparcelHelpers.export(exports, \"interpolateNumber\", ()=>(0, _numberJsDefault.default));\nparcelHelpers.export(exports, \"interpolateNumberArray\", ()=>(0, _numberArrayJsDefault.default));\nparcelHelpers.export(exports, \"interpolateObject\", ()=>(0, _objectJsDefault.default));\nparcelHelpers.export(exports, \"interpolateRound\", ()=>(0, _roundJsDefault.default));\nparcelHelpers.export(exports, \"interpolateString\", ()=>(0, _stringJsDefault.default));\nparcelHelpers.export(exports, \"interpolateTransformCss\", ()=>(0, _indexJs.interpolateTransformCss));\nparcelHelpers.export(exports, \"interpolateTransformSvg\", ()=>(0, _indexJs.interpolateTransformSvg));\nparcelHelpers.export(exports, \"interpolateZoom\", ()=>(0, _zoomJsDefault.default));\nparcelHelpers.export(exports, \"interpolateRgb\", ()=>(0, _rgbJsDefault.default));\nparcelHelpers.export(exports, \"interpolateRgbBasis\", ()=>(0, _rgbJs.rgbBasis));\nparcelHelpers.export(exports, \"interpolateRgbBasisClosed\", ()=>(0, _rgbJs.rgbBasisClosed));\nparcelHelpers.export(exports, \"interpolateHsl\", ()=>(0, _hslJsDefault.default));\nparcelHelpers.export(exports, \"interpolateHslLong\", ()=>(0, _hslJs.hslLong));\nparcelHelpers.export(exports, \"interpolateLab\", ()=>(0, _labJsDefault.default));\nparcelHelpers.export(exports, \"interpolateHcl\", ()=>(0, _hclJsDefault.default));\nparcelHelpers.export(exports, \"interpolateHclLong\", ()=>(0, _hclJs.hclLong));\nparcelHelpers.export(exports, \"interpolateCubehelix\", ()=>(0, _cubehelixJsDefault.default));\nparcelHelpers.export(exports, \"interpolateCubehelixLong\", ()=>(0, _cubehelixJs.cubehelixLong));\nparcelHelpers.export(exports, \"piecewise\", ()=>(0, _piecewiseJsDefault.default));\nparcelHelpers.export(exports, \"quantize\", ()=>(0, _quantizeJsDefault.default));\nvar _valueJs = require(\"./value.js\");\nvar _valueJsDefault = parcelHelpers.interopDefault(_valueJs);\nvar _arrayJs = require(\"./array.js\");\nvar _arrayJsDefault = parcelHelpers.interopDefault(_arrayJs);\nvar _basisJs = require(\"./basis.js\");\nvar _basisJsDefault = parcelHelpers.interopDefault(_basisJs);\nvar _basisClosedJs = require(\"./basisClosed.js\");\nvar _basisClosedJsDefault = parcelHelpers.interopDefault(_basisClosedJs);\nvar _dateJs = require(\"./date.js\");\nvar _dateJsDefault = parcelHelpers.interopDefault(_dateJs);\nvar _discreteJs = require(\"./discrete.js\");\nvar _discreteJsDefault = parcelHelpers.interopDefault(_discreteJs);\nvar _hueJs = require(\"./hue.js\");\nvar _hueJsDefault = parcelHelpers.interopDefault(_hueJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar _numberArrayJs = require(\"./numberArray.js\");\nvar _numberArrayJsDefault = parcelHelpers.interopDefault(_numberArrayJs);\nvar _objectJs = require(\"./object.js\");\nvar _objectJsDefault = parcelHelpers.interopDefault(_objectJs);\nvar _roundJs = require(\"./round.js\");\nvar _roundJsDefault = parcelHelpers.interopDefault(_roundJs);\nvar _stringJs = require(\"./string.js\");\nvar _stringJsDefault = parcelHelpers.interopDefault(_stringJs);\nvar _indexJs = require(\"./transform/index.js\");\nvar _zoomJs = require(\"./zoom.js\");\nvar _zoomJsDefault = parcelHelpers.interopDefault(_zoomJs);\nvar _rgbJs = require(\"./rgb.js\");\nvar _rgbJsDefault = parcelHelpers.interopDefault(_rgbJs);\nvar _hslJs = require(\"./hsl.js\");\nvar _hslJsDefault = parcelHelpers.interopDefault(_hslJs);\nvar _labJs = require(\"./lab.js\");\nvar _labJsDefault = parcelHelpers.interopDefault(_labJs);\nvar _hclJs = require(\"./hcl.js\");\nvar _hclJsDefault = parcelHelpers.interopDefault(_hclJs);\nvar _cubehelixJs = require(\"./cubehelix.js\");\nvar _cubehelixJsDefault = parcelHelpers.interopDefault(_cubehelixJs);\nvar _piecewiseJs = require(\"./piecewise.js\");\nvar _piecewiseJsDefault = parcelHelpers.interopDefault(_piecewiseJs);\nvar _quantizeJs = require(\"./quantize.js\");\nvar _quantizeJsDefault = parcelHelpers.interopDefault(_quantizeJs);\n\n},{\"./value.js\":\"j390F\",\"./array.js\":\"ak2mg\",\"./basis.js\":\"aODfz\",\"./basisClosed.js\":\"iMwsl\",\"./date.js\":\"5kKci\",\"./discrete.js\":\"kwucC\",\"./hue.js\":\"l0WHx\",\"./number.js\":\"e4PyF\",\"./numberArray.js\":\"erlaq\",\"./object.js\":\"4rZkd\",\"./round.js\":\"l8dm5\",\"./string.js\":\"5Q7tf\",\"./transform/index.js\":\"ccQ0p\",\"./zoom.js\":\"hXWwx\",\"./rgb.js\":\"bXjD7\",\"./hsl.js\":\"2r5a3\",\"./lab.js\":\"4EvaS\",\"./hcl.js\":\"CZyDl\",\"./cubehelix.js\":\"1wxKY\",\"./piecewise.js\":\"dHOj6\",\"./quantize.js\":\"7aRYJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j390F\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Color = require(\"d3-color\");\nvar _rgbJs = require(\"./rgb.js\");\nvar _rgbJsDefault = parcelHelpers.interopDefault(_rgbJs);\nvar _arrayJs = require(\"./array.js\");\nvar _dateJs = require(\"./date.js\");\nvar _dateJsDefault = parcelHelpers.interopDefault(_dateJs);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar _objectJs = require(\"./object.js\");\nvar _objectJsDefault = parcelHelpers.interopDefault(_objectJs);\nvar _stringJs = require(\"./string.js\");\nvar _stringJsDefault = parcelHelpers.interopDefault(_stringJs);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _numberArrayJs = require(\"./numberArray.js\");\nvar _numberArrayJsDefault = parcelHelpers.interopDefault(_numberArrayJs);\nexports.default = function(a, b) {\n    var t = typeof b, c;\n    return b == null || t === \"boolean\" ? (0, _constantJsDefault.default)(b) : (t === \"number\" ? (0, _numberJsDefault.default) : t === \"string\" ? (c = (0, _d3Color.color)(b)) ? (b = c, _rgbJsDefault.default) : (0, _stringJsDefault.default) : b instanceof (0, _d3Color.color) ? (0, _rgbJsDefault.default) : b instanceof Date ? (0, _dateJsDefault.default) : (0, _numberArrayJs.isNumberArray)(b) ? (0, _numberArrayJsDefault.default) : Array.isArray(b) ? (0, _arrayJs.genericArray) : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? (0, _objectJsDefault.default) : (0, _numberJsDefault.default))(a, b);\n};\n\n},{\"d3-color\":\"7SCp9\",\"./rgb.js\":\"bXjD7\",\"./array.js\":\"ak2mg\",\"./date.js\":\"5kKci\",\"./number.js\":\"e4PyF\",\"./object.js\":\"4rZkd\",\"./string.js\":\"5Q7tf\",\"./constant.js\":\"3lDJx\",\"./numberArray.js\":\"erlaq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7SCp9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"color\", ()=>(0, _colorJsDefault.default));\nparcelHelpers.export(exports, \"rgb\", ()=>(0, _colorJs.rgb));\nparcelHelpers.export(exports, \"hsl\", ()=>(0, _colorJs.hsl));\nparcelHelpers.export(exports, \"lab\", ()=>(0, _labJsDefault.default));\nparcelHelpers.export(exports, \"hcl\", ()=>(0, _labJs.hcl));\nparcelHelpers.export(exports, \"lch\", ()=>(0, _labJs.lch));\nparcelHelpers.export(exports, \"gray\", ()=>(0, _labJs.gray));\nparcelHelpers.export(exports, \"cubehelix\", ()=>(0, _cubehelixJsDefault.default));\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nvar _labJs = require(\"./lab.js\");\nvar _labJsDefault = parcelHelpers.interopDefault(_labJs);\nvar _cubehelixJs = require(\"./cubehelix.js\");\nvar _cubehelixJsDefault = parcelHelpers.interopDefault(_cubehelixJs);\n\n},{\"./color.js\":\"cJlE6\",\"./lab.js\":\"3FaCQ\",\"./cubehelix.js\":\"6YqvJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cJlE6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Color\", ()=>Color);\nparcelHelpers.export(exports, \"darker\", ()=>darker);\nparcelHelpers.export(exports, \"brighter\", ()=>brighter);\nparcelHelpers.export(exports, \"rgbConvert\", ()=>rgbConvert);\nparcelHelpers.export(exports, \"rgb\", ()=>rgb);\nparcelHelpers.export(exports, \"Rgb\", ()=>Rgb);\nparcelHelpers.export(exports, \"hslConvert\", ()=>hslConvert);\nparcelHelpers.export(exports, \"hsl\", ()=>hsl);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nfunction Color() {}\nvar darker = 0.7;\nvar brighter = 1 / darker;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(\"^rgb\\\\(\" + [\n    reI,\n    reI,\n    reI\n] + \"\\\\)$\"), reRgbPercent = new RegExp(\"^rgb\\\\(\" + [\n    reP,\n    reP,\n    reP\n] + \"\\\\)$\"), reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [\n    reI,\n    reI,\n    reI,\n    reN\n] + \"\\\\)$\"), reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [\n    reP,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\"), reHslPercent = new RegExp(\"^hsl\\\\(\" + [\n    reN,\n    reP,\n    reP\n] + \"\\\\)$\"), reHslaPercent = new RegExp(\"^hsla\\\\(\" + [\n    reN,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\");\nvar named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, _defineJsDefault.default)(Color, color, {\n    copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable: function() {\n        return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    formatHex: color_formatHex,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n});\nfunction color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction color_formatHsl() {\n    return hslConvert(this).formatHsl();\n}\nfunction color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n     : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\nexports.default = color;\nfunction rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n}\nfunction rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n}\nfunction rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Rgb, rgb, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb: function() {\n        return this;\n    },\n    displayable: function() {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: rgb_formatHex,\n    formatHex: rgb_formatHex,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n}));\nfunction rgb_formatHex() {\n    return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\nfunction rgb_formatRgb() {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction hex(value) {\n    value = Math.max(0, Math.min(255, Math.round(value) || 0));\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n}\nfunction hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new Hsl(h, s, l, o.opacity);\n}\nfunction hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Hsl, hsl, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl: function() {\n        var a = this.opacity;\n        a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n},{\"./define.js\":\"fa5me\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fa5me\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"extend\", ()=>extend);\nexports.default = function(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n};\nfunction extend(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3FaCQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"gray\", ()=>gray);\nparcelHelpers.export(exports, \"Lab\", ()=>Lab);\nparcelHelpers.export(exports, \"lch\", ()=>lch);\nparcelHelpers.export(exports, \"hcl\", ()=>hcl);\nparcelHelpers.export(exports, \"Hcl\", ()=>Hcl);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nvar _colorJs = require(\"./color.js\");\nvar _mathJs = require(\"./math.js\");\n// https://observablehq.com/@mbostock/lab-and-rgb\nconst K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1;\nfunction labConvert(o) {\n    if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n    if (o instanceof Hcl) return hcl2lab(o);\n    if (!(o instanceof (0, _colorJs.Rgb))) o = (0, _colorJs.rgbConvert)(o);\n    var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b = rgb2lrgb(o.b), y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n    if (r === g && g === b) x = z = y;\n    else {\n        x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n        z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n    }\n    return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\nfunction gray(l, opacity) {\n    return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\nfunction lab(l, a, b, opacity) {\n    return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\nexports.default = lab;\nfunction Lab(l, a, b, opacity) {\n    this.l = +l;\n    this.a = +a;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Lab, lab, (0, _defineJs.extend)((0, _colorJs.Color), {\n    brighter: function(k) {\n        return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    darker: function(k) {\n        return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    rgb: function() {\n        var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200;\n        x = Xn * lab2xyz(x);\n        y = Yn * lab2xyz(y);\n        z = Zn * lab2xyz(z);\n        return new (0, _colorJs.Rgb)(lrgb2rgb(3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb(0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity);\n    }\n}));\nfunction xyz2lab(t) {\n    return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\nfunction lab2xyz(t) {\n    return t > t1 ? t * t * t : t2 * (t - t0);\n}\nfunction lrgb2rgb(x) {\n    return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\nfunction rgb2lrgb(x) {\n    return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\nfunction hclConvert(o) {\n    if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n    if (!(o instanceof Lab)) o = labConvert(o);\n    if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n    var h = Math.atan2(o.b, o.a) * (0, _mathJs.degrees);\n    return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\nfunction lch(l, c, h, opacity) {\n    return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\nfunction hcl(h, c, l, opacity) {\n    return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\nfunction Hcl(h, c, l, opacity) {\n    this.h = +h;\n    this.c = +c;\n    this.l = +l;\n    this.opacity = +opacity;\n}\nfunction hcl2lab(o) {\n    if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n    var h = o.h * (0, _mathJs.radians);\n    return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n(0, _defineJsDefault.default)(Hcl, hcl, (0, _defineJs.extend)((0, _colorJs.Color), {\n    brighter: function(k) {\n        return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n    },\n    darker: function(k) {\n        return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n    },\n    rgb: function() {\n        return hcl2lab(this).rgb();\n    }\n}));\n\n},{\"./define.js\":\"fa5me\",\"./color.js\":\"cJlE6\",\"./math.js\":\"2h5K4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2h5K4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"radians\", ()=>radians);\nparcelHelpers.export(exports, \"degrees\", ()=>degrees);\nconst radians = Math.PI / 180;\nconst degrees = 180 / Math.PI;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6YqvJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Cubehelix\", ()=>Cubehelix);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nvar _colorJs = require(\"./color.js\");\nvar _mathJs = require(\"./math.js\");\nvar A = -0.14861, B = 1.78277, C = -0.29227, D = -0.90649, E = 1.97294, ED = E * D, EB = E * B, BC_DA = B * C - D * A;\nfunction cubehelixConvert(o) {\n    if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof (0, _colorJs.Rgb))) o = (0, _colorJs.rgbConvert)(o);\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), h = s ? Math.atan2(k, bl) * (0, _mathJs.degrees) - 120 : NaN;\n    return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\nfunction cubehelix(h, s, l, opacity) {\n    return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\nexports.default = cubehelix;\nfunction Cubehelix(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Cubehelix, cubehelix, (0, _defineJs.extend)((0, _colorJs.Color), {\n    brighter: function(k) {\n        k = k == null ? (0, _colorJs.brighter) : Math.pow((0, _colorJs.brighter), k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? (0, _colorJs.darker) : Math.pow((0, _colorJs.darker), k);\n        return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = isNaN(this.h) ? 0 : (this.h + 120) * (0, _mathJs.radians), l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh = Math.cos(h), sinh = Math.sin(h);\n        return new (0, _colorJs.Rgb)(255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity);\n    }\n}));\n\n},{\"./define.js\":\"fa5me\",\"./color.js\":\"cJlE6\",\"./math.js\":\"2h5K4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bXjD7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"rgbBasis\", ()=>rgbBasis);\nparcelHelpers.export(exports, \"rgbBasisClosed\", ()=>rgbBasisClosed);\nvar _d3Color = require(\"d3-color\");\nvar _basisJs = require(\"./basis.js\");\nvar _basisJsDefault = parcelHelpers.interopDefault(_basisJs);\nvar _basisClosedJs = require(\"./basisClosed.js\");\nvar _basisClosedJsDefault = parcelHelpers.interopDefault(_basisClosedJs);\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nexports.default = function rgbGamma(y) {\n    var color = (0, _colorJs.gamma)(y);\n    function rgb(start, end) {\n        var r = color((start = (0, _d3Color.rgb)(start)).r, (end = (0, _d3Color.rgb)(end)).r), g = color(start.g, end.g), b = color(start.b, end.b), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n        return function(t) {\n            start.r = r(t);\n            start.g = g(t);\n            start.b = b(t);\n            start.opacity = opacity(t);\n            return start + \"\";\n        };\n    }\n    rgb.gamma = rgbGamma;\n    return rgb;\n}(1);\nfunction rgbSpline(spline) {\n    return function(colors) {\n        var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color;\n        for(i = 0; i < n; ++i){\n            color = (0, _d3Color.rgb)(colors[i]);\n            r[i] = color.r || 0;\n            g[i] = color.g || 0;\n            b[i] = color.b || 0;\n        }\n        r = spline(r);\n        g = spline(g);\n        b = spline(b);\n        color.opacity = 1;\n        return function(t) {\n            color.r = r(t);\n            color.g = g(t);\n            color.b = b(t);\n            return color + \"\";\n        };\n    };\n}\nvar rgbBasis = rgbSpline((0, _basisJsDefault.default));\nvar rgbBasisClosed = rgbSpline((0, _basisClosedJsDefault.default));\n\n},{\"d3-color\":\"7SCp9\",\"./basis.js\":\"aODfz\",\"./basisClosed.js\":\"iMwsl\",\"./color.js\":\"9VtCQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aODfz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"basis\", ()=>basis);\nfunction basis(t1, v0, v1, v2, v3) {\n    var t2 = t1 * t1, t3 = t2 * t1;\n    return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;\n}\nexports.default = function(values) {\n    var n = values.length - 1;\n    return function(t) {\n        var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n        return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iMwsl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _basisJs = require(\"./basis.js\");\nexports.default = function(values) {\n    var n = values.length;\n    return function(t) {\n        var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];\n        return (0, _basisJs.basis)((t - i / n) * n, v0, v1, v2, v3);\n    };\n};\n\n},{\"./basis.js\":\"aODfz\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9VtCQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hue\", ()=>hue);\nparcelHelpers.export(exports, \"gamma\", ()=>gamma);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nfunction linear(a, d) {\n    return function(t) {\n        return a + t * d;\n    };\n}\nfunction exponential(a, b, y) {\n    return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n        return Math.pow(a + t * b, y);\n    };\n}\nfunction hue(a, b) {\n    var d = b - a;\n    return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : (0, _constantJsDefault.default)(isNaN(a) ? b : a);\n}\nfunction gamma(y) {\n    return (y = +y) === 1 ? nogamma : function(a, b) {\n        return b - a ? exponential(a, b, y) : (0, _constantJsDefault.default)(isNaN(a) ? b : a);\n    };\n}\nfunction nogamma(a, b) {\n    var d = b - a;\n    return d ? linear(a, d) : (0, _constantJsDefault.default)(isNaN(a) ? b : a);\n}\nexports.default = nogamma;\n\n},{\"./constant.js\":\"3lDJx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3lDJx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = (x)=>()=>x;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ak2mg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"genericArray\", ()=>genericArray);\nvar _valueJs = require(\"./value.js\");\nvar _valueJsDefault = parcelHelpers.interopDefault(_valueJs);\nvar _numberArrayJs = require(\"./numberArray.js\");\nvar _numberArrayJsDefault = parcelHelpers.interopDefault(_numberArrayJs);\nexports.default = function(a, b) {\n    return ((0, _numberArrayJs.isNumberArray)(b) ? (0, _numberArrayJsDefault.default) : genericArray)(a, b);\n};\nfunction genericArray(a, b) {\n    var nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb), i;\n    for(i = 0; i < na; ++i)x[i] = (0, _valueJsDefault.default)(a[i], b[i]);\n    for(; i < nb; ++i)c[i] = b[i];\n    return function(t) {\n        for(i = 0; i < na; ++i)c[i] = x[i](t);\n        return c;\n    };\n}\n\n},{\"./value.js\":\"j390F\",\"./numberArray.js\":\"erlaq\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"erlaq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"isNumberArray\", ()=>isNumberArray);\nexports.default = function(a, b) {\n    if (!b) b = [];\n    var n = a ? Math.min(b.length, a.length) : 0, c = b.slice(), i;\n    return function(t) {\n        for(i = 0; i < n; ++i)c[i] = a[i] * (1 - t) + b[i] * t;\n        return c;\n    };\n};\nfunction isNumberArray(x) {\n    return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5kKci\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    var d = new Date;\n    return a = +a, b = +b, function(t) {\n        return d.setTime(a * (1 - t) + b * t), d;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e4PyF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    return a = +a, b = +b, function(t) {\n        return a * (1 - t) + b * t;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4rZkd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _valueJs = require(\"./value.js\");\nvar _valueJsDefault = parcelHelpers.interopDefault(_valueJs);\nexports.default = function(a, b) {\n    var i = {}, c = {}, k;\n    if (a === null || typeof a !== \"object\") a = {};\n    if (b === null || typeof b !== \"object\") b = {};\n    for(k in b)if (k in a) i[k] = (0, _valueJsDefault.default)(a[k], b[k]);\n    else c[k] = b[k];\n    return function(t) {\n        for(k in i)c[k] = i[k](t);\n        return c;\n    };\n};\n\n},{\"./value.js\":\"j390F\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Q7tf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _numberJs = require(\"./number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, reB = new RegExp(reA.source, \"g\");\nfunction zero(b) {\n    return function() {\n        return b;\n    };\n}\nfunction one(b) {\n    return function(t) {\n        return b(t) + \"\";\n    };\n}\nexports.default = function(a, b) {\n    var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i1 = -1, s = [], q = []; // number interpolators\n    // Coerce inputs to strings.\n    a = a + \"\", b = b + \"\";\n    // Interpolate pairs of numbers in a & b.\n    while((am = reA.exec(a)) && (bm = reB.exec(b))){\n        if ((bs = bm.index) > bi) {\n            bs = b.slice(bi, bs);\n            if (s[i1]) s[i1] += bs; // coalesce with previous string\n            else s[++i1] = bs;\n        }\n        if ((am = am[0]) === (bm = bm[0])) {\n            if (s[i1]) s[i1] += bm; // coalesce with previous string\n            else s[++i1] = bm;\n        } else {\n            s[++i1] = null;\n            q.push({\n                i: i1,\n                x: (0, _numberJsDefault.default)(am, bm)\n            });\n        }\n        bi = reB.lastIndex;\n    }\n    // Add remains of b.\n    if (bi < b.length) {\n        bs = b.slice(bi);\n        if (s[i1]) s[i1] += bs; // coalesce with previous string\n        else s[++i1] = bs;\n    }\n    // Special optimization for only a single match.\n    // Otherwise, interpolate each of the numbers and rejoin the string.\n    return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function(t) {\n        for(var i = 0, o; i < b; ++i)s[(o = q[i]).i] = o.x(t);\n        return s.join(\"\");\n    });\n};\n\n},{\"./number.js\":\"e4PyF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kwucC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(range) {\n    var n = range.length;\n    return function(t) {\n        return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l0WHx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _colorJs = require(\"./color.js\");\nexports.default = function(a, b) {\n    var i = (0, _colorJs.hue)(+a, +b);\n    return function(t) {\n        var x = i(t);\n        return x - 360 * Math.floor(x / 360);\n    };\n};\n\n},{\"./color.js\":\"9VtCQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l8dm5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    return a = +a, b = +b, function(t) {\n        return Math.round(a * (1 - t) + b * t);\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ccQ0p\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"interpolateTransformCss\", ()=>interpolateTransformCss);\nparcelHelpers.export(exports, \"interpolateTransformSvg\", ()=>interpolateTransformSvg);\nvar _numberJs = require(\"../number.js\");\nvar _numberJsDefault = parcelHelpers.interopDefault(_numberJs);\nvar _parseJs = require(\"./parse.js\");\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n    function pop(s) {\n        return s.length ? s.pop() + \" \" : \"\";\n    }\n    function translate(xa, ya, xb, yb, s, q) {\n        if (xa !== xb || ya !== yb) {\n            var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n            q.push({\n                i: i - 4,\n                x: (0, _numberJsDefault.default)(xa, xb)\n            }, {\n                i: i - 2,\n                x: (0, _numberJsDefault.default)(ya, yb)\n            });\n        } else if (xb || yb) s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n    }\n    function rotate(a, b, s, q) {\n        if (a !== b) {\n            if (a - b > 180) b += 360;\n            else if (b - a > 180) a += 360; // shortest path\n            q.push({\n                i: s.push(pop(s) + \"rotate(\", null, degParen) - 2,\n                x: (0, _numberJsDefault.default)(a, b)\n            });\n        } else if (b) s.push(pop(s) + \"rotate(\" + b + degParen);\n    }\n    function skewX(a, b, s, q) {\n        if (a !== b) q.push({\n            i: s.push(pop(s) + \"skewX(\", null, degParen) - 2,\n            x: (0, _numberJsDefault.default)(a, b)\n        });\n        else if (b) s.push(pop(s) + \"skewX(\" + b + degParen);\n    }\n    function scale(xa, ya, xb, yb, s, q) {\n        if (xa !== xb || ya !== yb) {\n            var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n            q.push({\n                i: i - 4,\n                x: (0, _numberJsDefault.default)(xa, xb)\n            }, {\n                i: i - 2,\n                x: (0, _numberJsDefault.default)(ya, yb)\n            });\n        } else if (xb !== 1 || yb !== 1) s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n    }\n    return function(a, b) {\n        var s = [], q = []; // number interpolators\n        a = parse(a), b = parse(b);\n        translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n        rotate(a.rotate, b.rotate, s, q);\n        skewX(a.skewX, b.skewX, s, q);\n        scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n        a = b = null; // gc\n        return function(t) {\n            var i = -1, n = q.length, o;\n            while(++i < n)s[(o = q[i]).i] = o.x(t);\n            return s.join(\"\");\n        };\n    };\n}\nvar interpolateTransformCss = interpolateTransform((0, _parseJs.parseCss), \"px, \", \"px)\", \"deg)\");\nvar interpolateTransformSvg = interpolateTransform((0, _parseJs.parseSvg), \", \", \")\", \")\");\n\n},{\"../number.js\":\"e4PyF\",\"./parse.js\":\"fyjJk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fyjJk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/* eslint-disable no-undef */ parcelHelpers.export(exports, \"parseCss\", ()=>parseCss);\nparcelHelpers.export(exports, \"parseSvg\", ()=>parseSvg);\nvar _decomposeJs = require(\"./decompose.js\");\nvar _decomposeJsDefault = parcelHelpers.interopDefault(_decomposeJs);\nvar svgNode;\nfunction parseCss(value) {\n    const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n    return m.isIdentity ? (0, _decomposeJs.identity) : (0, _decomposeJsDefault.default)(m.a, m.b, m.c, m.d, m.e, m.f);\n}\nfunction parseSvg(value) {\n    if (value == null) return 0, _decomposeJs.identity;\n    if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n    svgNode.setAttribute(\"transform\", value);\n    if (!(value = svgNode.transform.baseVal.consolidate())) return 0, _decomposeJs.identity;\n    value = value.matrix;\n    return (0, _decomposeJsDefault.default)(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n\n},{\"./decompose.js\":\"kD3Jv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kD3Jv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"identity\", ()=>identity);\nvar degrees = 180 / Math.PI;\nvar identity = {\n    translateX: 0,\n    translateY: 0,\n    rotate: 0,\n    skewX: 0,\n    scaleX: 1,\n    scaleY: 1\n};\nexports.default = function(a, b, c, d, e, f) {\n    var scaleX, scaleY, skewX;\n    if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n    if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n    if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n    if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n    return {\n        translateX: e,\n        translateY: f,\n        rotate: Math.atan2(b, a) * degrees,\n        skewX: Math.atan(skewX) * degrees,\n        scaleX: scaleX,\n        scaleY: scaleY\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hXWwx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar epsilon2 = 1e-12;\nfunction cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n}\nfunction sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n}\nfunction tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\nexports.default = function zoomRho(rho, rho2, rho4) {\n    // p0 = [ux0, uy0, w0]\n    // p1 = [ux1, uy1, w1]\n    function zoom(p0, p1) {\n        var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n        // Special case for u0 ≅ u1.\n        if (d2 < epsilon2) {\n            S = Math.log(w1 / w0) / rho;\n            i = function(t) {\n                return [\n                    ux0 + t * dx,\n                    uy0 + t * dy,\n                    w0 * Math.exp(rho * t * S)\n                ];\n            };\n        } else {\n            var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n            S = (r1 - r0) / rho;\n            i = function(t) {\n                var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n                return [\n                    ux0 + u * dx,\n                    uy0 + u * dy,\n                    w0 * coshr0 / cosh(rho * s + r0)\n                ];\n            };\n        }\n        i.duration = S * 1000 * rho / Math.SQRT2;\n        return i;\n    }\n    zoom.rho = function(_) {\n        var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n        return zoomRho(_1, _2, _4);\n    };\n    return zoom;\n}(Math.SQRT2, 2, 4);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2r5a3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hslLong\", ()=>hslLong);\nvar _d3Color = require(\"d3-color\");\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nfunction hsl(hue) {\n    return function(start, end) {\n        var h = hue((start = (0, _d3Color.hsl)(start)).h, (end = (0, _d3Color.hsl)(end)).h), s = (0, _colorJsDefault.default)(start.s, end.s), l = (0, _colorJsDefault.default)(start.l, end.l), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n        return function(t) {\n            start.h = h(t);\n            start.s = s(t);\n            start.l = l(t);\n            start.opacity = opacity(t);\n            return start + \"\";\n        };\n    };\n}\nexports.default = hsl((0, _colorJs.hue));\nvar hslLong = hsl((0, _colorJsDefault.default));\n\n},{\"d3-color\":\"7SCp9\",\"./color.js\":\"9VtCQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4EvaS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Color = require(\"d3-color\");\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nfunction lab(start, end) {\n    var l = (0, _colorJsDefault.default)((start = (0, _d3Color.lab)(start)).l, (end = (0, _d3Color.lab)(end)).l), a = (0, _colorJsDefault.default)(start.a, end.a), b = (0, _colorJsDefault.default)(start.b, end.b), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n    return function(t) {\n        start.l = l(t);\n        start.a = a(t);\n        start.b = b(t);\n        start.opacity = opacity(t);\n        return start + \"\";\n    };\n}\nexports.default = lab;\n\n},{\"d3-color\":\"7SCp9\",\"./color.js\":\"9VtCQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"CZyDl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"hclLong\", ()=>hclLong);\nvar _d3Color = require(\"d3-color\");\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nfunction hcl(hue) {\n    return function(start, end) {\n        var h = hue((start = (0, _d3Color.hcl)(start)).h, (end = (0, _d3Color.hcl)(end)).h), c = (0, _colorJsDefault.default)(start.c, end.c), l = (0, _colorJsDefault.default)(start.l, end.l), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n        return function(t) {\n            start.h = h(t);\n            start.c = c(t);\n            start.l = l(t);\n            start.opacity = opacity(t);\n            return start + \"\";\n        };\n    };\n}\nexports.default = hcl((0, _colorJs.hue));\nvar hclLong = hcl((0, _colorJsDefault.default));\n\n},{\"d3-color\":\"7SCp9\",\"./color.js\":\"9VtCQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1wxKY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cubehelixLong\", ()=>cubehelixLong);\nvar _d3Color = require(\"d3-color\");\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nfunction cubehelix(hue) {\n    return function cubehelixGamma(y) {\n        y = +y;\n        function cubehelix1(start, end) {\n            var h = hue((start = (0, _d3Color.cubehelix)(start)).h, (end = (0, _d3Color.cubehelix)(end)).h), s = (0, _colorJsDefault.default)(start.s, end.s), l = (0, _colorJsDefault.default)(start.l, end.l), opacity = (0, _colorJsDefault.default)(start.opacity, end.opacity);\n            return function(t) {\n                start.h = h(t);\n                start.s = s(t);\n                start.l = l(Math.pow(t, y));\n                start.opacity = opacity(t);\n                return start + \"\";\n            };\n        }\n        cubehelix1.gamma = cubehelixGamma;\n        return cubehelix1;\n    }(1);\n}\nexports.default = cubehelix((0, _colorJs.hue));\nvar cubehelixLong = cubehelix((0, _colorJsDefault.default));\n\n},{\"d3-color\":\"7SCp9\",\"./color.js\":\"9VtCQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dHOj6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _valueJs = require(\"./value.js\");\nvar _valueJsDefault = parcelHelpers.interopDefault(_valueJs);\nfunction piecewise(interpolate, values) {\n    if (values === undefined) values = interpolate, interpolate = (0, _valueJsDefault.default);\n    var i1 = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);\n    while(i1 < n)I[i1] = interpolate(v, v = values[++i1]);\n    return function(t) {\n        var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n        return I[i](t - i);\n    };\n}\nexports.default = piecewise;\n\n},{\"./value.js\":\"j390F\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7aRYJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(interpolator, n) {\n    var samples = new Array(n);\n    for(var i = 0; i < n; ++i)samples[i] = interpolator(i / (n - 1));\n    return samples;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9JgB5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction constants(x) {\n    return function() {\n        return x;\n    };\n}\nexports.default = constants;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bOzsY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction number(x) {\n    return +x;\n}\nexports.default = number;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kLKEv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initRange\", ()=>initRange);\nparcelHelpers.export(exports, \"initInterpolator\", ()=>initInterpolator);\nfunction initRange(domain, range) {\n    switch(arguments.length){\n        case 0:\n            break;\n        case 1:\n            this.range(domain);\n            break;\n        default:\n            this.range(range).domain(domain);\n            break;\n    }\n    return this;\n}\nfunction initInterpolator(domain, interpolator) {\n    switch(arguments.length){\n        case 0:\n            break;\n        case 1:\n            if (typeof domain === \"function\") this.interpolator(domain);\n            else this.range(domain);\n            break;\n        default:\n            this.domain(domain);\n            if (typeof interpolator === \"function\") this.interpolator(interpolator);\n            else this.range(interpolator);\n            break;\n    }\n    return this;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dksn9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _d3Format = require(\"d3-format\");\nfunction tickFormat(start, stop, count, specifier) {\n    var step = (0, _d3Array.tickStep)(start, stop, count), precision;\n    specifier = (0, _d3Format.formatSpecifier)(specifier == null ? \",f\" : specifier);\n    switch(specifier.type){\n        case \"s\":\n            var value = Math.max(Math.abs(start), Math.abs(stop));\n            if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionPrefix)(step, value))) specifier.precision = precision;\n            return (0, _d3Format.formatPrefix)(specifier, value);\n        case \"\":\n        case \"e\":\n        case \"g\":\n        case \"p\":\n        case \"r\":\n            if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionRound)(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n            break;\n        case \"f\":\n        case \"%\":\n            if (specifier.precision == null && !isNaN(precision = (0, _d3Format.precisionFixed)(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n            break;\n    }\n    return (0, _d3Format.format)(specifier);\n}\nexports.default = tickFormat;\n\n},{\"d3-array\":\"6IwJG\",\"d3-format\":\"8dYFL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2gcSE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"loggish\", ()=>loggish);\nvar _d3Array = require(\"d3-array\");\nvar _d3Format = require(\"d3-format\");\nvar _niceJs = require(\"./nice.js\");\nvar _niceJsDefault = parcelHelpers.interopDefault(_niceJs);\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nfunction transformLog(x) {\n    return Math.log(x);\n}\nfunction transformExp(x) {\n    return Math.exp(x);\n}\nfunction transformLogn(x) {\n    return -Math.log(-x);\n}\nfunction transformExpn(x) {\n    return -Math.exp(-x);\n}\nfunction pow10(x) {\n    return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n}\nfunction powp(base) {\n    return base === 10 ? pow10 : base === Math.E ? Math.exp : function(x) {\n        return Math.pow(base, x);\n    };\n}\nfunction logp(base) {\n    return base === Math.E ? Math.log : base === 10 && Math.log10 || base === 2 && Math.log2 || (base = Math.log(base), function(x) {\n        return Math.log(x) / base;\n    });\n}\nfunction reflect(f) {\n    return function(x) {\n        return -f(-x);\n    };\n}\nfunction loggish(transform) {\n    var scale = transform(transformLog, transformExp), domain = scale.domain, base = 10, logs, pows;\n    function rescale() {\n        logs = logp(base), pows = powp(base);\n        if (domain()[0] < 0) {\n            logs = reflect(logs), pows = reflect(pows);\n            transform(transformLogn, transformExpn);\n        } else transform(transformLog, transformExp);\n        return scale;\n    }\n    scale.base = function(_) {\n        return arguments.length ? (base = +_, rescale()) : base;\n    };\n    scale.domain = function(_) {\n        return arguments.length ? (domain(_), rescale()) : domain();\n    };\n    scale.ticks = function(count) {\n        var d = domain(), u = d[0], v = d[d.length - 1], r;\n        if (r = v < u) i = u, u = v, v = i;\n        var i = logs(u), j = logs(v), p, k, t, n = count == null ? 10 : +count, z = [];\n        if (!(base % 1) && j - i < n) {\n            i = Math.floor(i), j = Math.ceil(j);\n            if (u > 0) for(; i <= j; ++i)for(k = 1, p = pows(i); k < base; ++k){\n                t = p * k;\n                if (t < u) continue;\n                if (t > v) break;\n                z.push(t);\n            }\n            else for(; i <= j; ++i)for(k = base - 1, p = pows(i); k >= 1; --k){\n                t = p * k;\n                if (t < u) continue;\n                if (t > v) break;\n                z.push(t);\n            }\n            if (z.length * 2 < n) z = (0, _d3Array.ticks)(u, v, n);\n        } else z = (0, _d3Array.ticks)(i, j, Math.min(j - i, n)).map(pows);\n        return r ? z.reverse() : z;\n    };\n    scale.tickFormat = function(count, specifier) {\n        if (specifier == null) specifier = base === 10 ? \".0e\" : \",\";\n        if (typeof specifier !== \"function\") specifier = (0, _d3Format.format)(specifier);\n        if (count === Infinity) return specifier;\n        if (count == null) count = 10;\n        var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?\n        return function(d) {\n            var i = d / pows(Math.round(logs(d)));\n            if (i * base < base - 0.5) i *= base;\n            return i <= k ? specifier(d) : \"\";\n        };\n    };\n    scale.nice = function() {\n        return domain((0, _niceJsDefault.default)(domain(), {\n            floor: function(x) {\n                return pows(Math.floor(logs(x)));\n            },\n            ceil: function(x) {\n                return pows(Math.ceil(logs(x)));\n            }\n        }));\n    };\n    return scale;\n}\nfunction log() {\n    var scale = loggish((0, _continuousJs.transformer)()).domain([\n        1,\n        10\n    ]);\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, log()).base(scale.base());\n    };\n    (0, _initJs.initRange).apply(scale, arguments);\n    return scale;\n}\nexports.default = log;\n\n},{\"d3-array\":\"6IwJG\",\"d3-format\":\"8dYFL\",\"./nice.js\":\"dC4tu\",\"./continuous.js\":\"it8xE\",\"./init.js\":\"kLKEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dC4tu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction nice(domain, interval) {\n    domain = domain.slice();\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], t;\n    if (x1 < x0) {\n        t = i0, i0 = i1, i1 = t;\n        t = x0, x0 = x1, x1 = t;\n    }\n    domain[i0] = interval.floor(x0);\n    domain[i1] = interval.ceil(x1);\n    return domain;\n}\nexports.default = nice;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iUUr7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"symlogish\", ()=>symlogish);\nvar _linearJs = require(\"./linear.js\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nfunction transformSymlog(c) {\n    return function(x) {\n        return Math.sign(x) * Math.log1p(Math.abs(x / c));\n    };\n}\nfunction transformSymexp(c) {\n    return function(x) {\n        return Math.sign(x) * Math.expm1(Math.abs(x)) * c;\n    };\n}\nfunction symlogish(transform) {\n    var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));\n    scale.constant = function(_) {\n        return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;\n    };\n    return (0, _linearJs.linearish)(scale);\n}\nfunction symlog() {\n    var scale = symlogish((0, _continuousJs.transformer)());\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, symlog()).constant(scale.constant());\n    };\n    return (0, _initJs.initRange).apply(scale, arguments);\n}\nexports.default = symlog;\n\n},{\"./linear.js\":\"5CETT\",\"./continuous.js\":\"it8xE\",\"./init.js\":\"kLKEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1j3zZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"implicit\", ()=>implicit);\nvar _initJs = require(\"./init.js\");\nconst implicit = Symbol(\"implicit\");\nfunction ordinal() {\n    var index = new Map(), domain = [], range = [], unknown = implicit;\n    function scale(d) {\n        var key = d + \"\", i = index.get(key);\n        if (!i) {\n            if (unknown !== implicit) return unknown;\n            index.set(key, i = domain.push(d));\n        }\n        return range[(i - 1) % range.length];\n    }\n    scale.domain = function(_) {\n        if (!arguments.length) return domain.slice();\n        domain = [], index = new Map();\n        for (const value of _){\n            const key = value + \"\";\n            if (index.has(key)) continue;\n            index.set(key, domain.push(value));\n        }\n        return scale;\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), scale) : range.slice();\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    scale.copy = function() {\n        return ordinal(domain, range).unknown(unknown);\n    };\n    (0, _initJs.initRange).apply(scale, arguments);\n    return scale;\n}\nexports.default = ordinal;\n\n},{\"./init.js\":\"kLKEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i4lyo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"powish\", ()=>powish);\nparcelHelpers.export(exports, \"sqrt\", ()=>sqrt);\nvar _linearJs = require(\"./linear.js\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nfunction transformPow(exponent) {\n    return function(x) {\n        return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n    };\n}\nfunction transformSqrt(x) {\n    return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\nfunction transformSquare(x) {\n    return x < 0 ? -x * x : x * x;\n}\nfunction powish(transform) {\n    var scale = transform((0, _continuousJs.identity), (0, _continuousJs.identity)), exponent = 1;\n    function rescale() {\n        return exponent === 1 ? transform((0, _continuousJs.identity), (0, _continuousJs.identity)) : exponent === 0.5 ? transform(transformSqrt, transformSquare) : transform(transformPow(exponent), transformPow(1 / exponent));\n    }\n    scale.exponent = function(_) {\n        return arguments.length ? (exponent = +_, rescale()) : exponent;\n    };\n    return (0, _linearJs.linearish)(scale);\n}\nfunction pow() {\n    var scale = powish((0, _continuousJs.transformer)());\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, pow()).exponent(scale.exponent());\n    };\n    (0, _initJs.initRange).apply(scale, arguments);\n    return scale;\n}\nexports.default = pow;\nfunction sqrt() {\n    return pow.apply(null, arguments).exponent(0.5);\n}\n\n},{\"./linear.js\":\"5CETT\",\"./continuous.js\":\"it8xE\",\"./init.js\":\"kLKEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aAURo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _initJs = require(\"./init.js\");\nfunction quantile() {\n    var domain = [], range = [], thresholds = [], unknown;\n    function rescale() {\n        var i = 0, n = Math.max(1, range.length);\n        thresholds = new Array(n - 1);\n        while(++i < n)thresholds[i - 1] = (0, _d3Array.quantileSorted)(domain, i / n);\n        return scale;\n    }\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : range[(0, _d3Array.bisect)(thresholds, x)];\n    }\n    scale.invertExtent = function(y) {\n        var i = range.indexOf(y);\n        return i < 0 ? [\n            NaN,\n            NaN\n        ] : [\n            i > 0 ? thresholds[i - 1] : domain[0],\n            i < thresholds.length ? thresholds[i] : domain[domain.length - 1]\n        ];\n    };\n    scale.domain = function(_) {\n        if (!arguments.length) return domain.slice();\n        domain = [];\n        for (let d of _)if (d != null && !isNaN(d = +d)) domain.push(d);\n        domain.sort((0, _d3Array.ascending));\n        return rescale();\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    scale.quantiles = function() {\n        return thresholds.slice();\n    };\n    scale.copy = function() {\n        return quantile().domain(domain).range(range).unknown(unknown);\n    };\n    return (0, _initJs.initRange).apply(scale, arguments);\n}\nexports.default = quantile;\n\n},{\"d3-array\":\"6IwJG\",\"./init.js\":\"kLKEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jjcn6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _linearJs = require(\"./linear.js\");\nvar _initJs = require(\"./init.js\");\nfunction quantize() {\n    var x0 = 0, x1 = 1, n = 1, domain = [\n        0.5\n    ], range = [\n        0,\n        1\n    ], unknown;\n    function scale(x) {\n        return x != null && x <= x ? range[(0, _d3Array.bisect)(domain, x, 0, n)] : unknown;\n    }\n    function rescale() {\n        var i = -1;\n        domain = new Array(n);\n        while(++i < n)domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n        return scale;\n    }\n    scale.domain = function(_) {\n        return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [\n            x0,\n            x1\n        ];\n    };\n    scale.range = function(_) {\n        return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();\n    };\n    scale.invertExtent = function(y) {\n        var i = range.indexOf(y);\n        return i < 0 ? [\n            NaN,\n            NaN\n        ] : i < 1 ? [\n            x0,\n            domain[0]\n        ] : i >= n ? [\n            domain[n - 1],\n            x1\n        ] : [\n            domain[i - 1],\n            domain[i]\n        ];\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : scale;\n    };\n    scale.thresholds = function() {\n        return domain.slice();\n    };\n    scale.copy = function() {\n        return quantize().domain([\n            x0,\n            x1\n        ]).range(range).unknown(unknown);\n    };\n    return (0, _initJs.initRange).apply((0, _linearJs.linearish)(scale), arguments);\n}\nexports.default = quantize;\n\n},{\"d3-array\":\"6IwJG\",\"./linear.js\":\"5CETT\",\"./init.js\":\"kLKEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8ndX3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _initJs = require(\"./init.js\");\nfunction threshold() {\n    var domain = [\n        0.5\n    ], range = [\n        0,\n        1\n    ], unknown, n = 1;\n    function scale(x) {\n        return x != null && x <= x ? range[(0, _d3Array.bisect)(domain, x, 0, n)] : unknown;\n    }\n    scale.domain = function(_) {\n        return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n    };\n    scale.range = function(_) {\n        return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n    };\n    scale.invertExtent = function(y) {\n        var i = range.indexOf(y);\n        return [\n            domain[i - 1],\n            domain[i]\n        ];\n    };\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    scale.copy = function() {\n        return threshold().domain(domain).range(range).unknown(unknown);\n    };\n    return (0, _initJs.initRange).apply(scale, arguments);\n}\nexports.default = threshold;\n\n},{\"d3-array\":\"6IwJG\",\"./init.js\":\"kLKEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cjAqm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"calendar\", ()=>calendar);\nvar _d3Time = require(\"d3-time\");\nvar _d3TimeFormat = require(\"d3-time-format\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _continuousJsDefault = parcelHelpers.interopDefault(_continuousJs);\nvar _initJs = require(\"./init.js\");\nvar _niceJs = require(\"./nice.js\");\nvar _niceJsDefault = parcelHelpers.interopDefault(_niceJs);\nfunction date(t) {\n    return new Date(t);\n}\nfunction number(t) {\n    return t instanceof Date ? +t : +new Date(+t);\n}\nfunction calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) {\n    var scale = (0, _continuousJsDefault.default)(), invert = scale.invert, domain = scale.domain;\n    var formatMillisecond = format(\".%L\"), formatSecond = format(\":%S\"), formatMinute = format(\"%I:%M\"), formatHour = format(\"%I %p\"), formatDay = format(\"%a %d\"), formatWeek = format(\"%b %d\"), formatMonth = format(\"%B\"), formatYear = format(\"%Y\");\n    function tickFormat(date1) {\n        return (second(date1) < date1 ? formatMillisecond : minute(date1) < date1 ? formatSecond : hour(date1) < date1 ? formatMinute : day(date1) < date1 ? formatHour : month(date1) < date1 ? week(date1) < date1 ? formatDay : formatWeek : year(date1) < date1 ? formatMonth : formatYear)(date1);\n    }\n    scale.invert = function(y) {\n        return new Date(invert(y));\n    };\n    scale.domain = function(_) {\n        return arguments.length ? domain(Array.from(_, number)) : domain().map(date);\n    };\n    scale.ticks = function(interval) {\n        var d = domain();\n        return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval);\n    };\n    scale.tickFormat = function(count, specifier) {\n        return specifier == null ? tickFormat : format(specifier);\n    };\n    scale.nice = function(interval) {\n        var d = domain();\n        if (!interval || typeof interval.range !== \"function\") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval);\n        return interval ? domain((0, _niceJsDefault.default)(d, interval)) : scale;\n    };\n    scale.copy = function() {\n        return (0, _continuousJs.copy)(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format));\n    };\n    return scale;\n}\nfunction time() {\n    return (0, _initJs.initRange).apply(calendar((0, _d3Time.timeTicks), (0, _d3Time.timeTickInterval), (0, _d3Time.timeYear), (0, _d3Time.timeMonth), (0, _d3Time.timeWeek), (0, _d3Time.timeDay), (0, _d3Time.timeHour), (0, _d3Time.timeMinute), (0, _d3Time.timeSecond), (0, _d3TimeFormat.timeFormat)).domain([\n        new Date(2000, 0, 1),\n        new Date(2000, 0, 2)\n    ]), arguments);\n}\nexports.default = time;\n\n},{\"d3-time\":\"8e7eR\",\"d3-time-format\":\"242jH\",\"./continuous.js\":\"it8xE\",\"./init.js\":\"kLKEv\",\"./nice.js\":\"dC4tu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cM5gE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Time = require(\"d3-time\");\nvar _d3TimeFormat = require(\"d3-time-format\");\nvar _timeJs = require(\"./time.js\");\nvar _initJs = require(\"./init.js\");\nfunction utcTime() {\n    return (0, _initJs.initRange).apply((0, _timeJs.calendar)((0, _d3Time.utcTicks), (0, _d3Time.utcTickInterval), (0, _d3Time.utcYear), (0, _d3Time.utcMonth), (0, _d3Time.utcWeek), (0, _d3Time.utcDay), (0, _d3Time.utcHour), (0, _d3Time.utcMinute), (0, _d3Time.utcSecond), (0, _d3TimeFormat.utcFormat)).domain([\n        Date.UTC(2000, 0, 1),\n        Date.UTC(2000, 0, 2)\n    ]), arguments);\n}\nexports.default = utcTime;\n\n},{\"d3-time\":\"8e7eR\",\"d3-time-format\":\"242jH\",\"./time.js\":\"cjAqm\",\"./init.js\":\"kLKEv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f1sM1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"sequentialLog\", ()=>sequentialLog);\nparcelHelpers.export(exports, \"sequentialSymlog\", ()=>sequentialSymlog);\nparcelHelpers.export(exports, \"sequentialPow\", ()=>sequentialPow);\nparcelHelpers.export(exports, \"sequentialSqrt\", ()=>sequentialSqrt);\nvar _d3Interpolate = require(\"d3-interpolate\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nvar _linearJs = require(\"./linear.js\");\nvar _logJs = require(\"./log.js\");\nvar _symlogJs = require(\"./symlog.js\");\nvar _powJs = require(\"./pow.js\");\nfunction transformer() {\n    var x0 = 0, x1 = 1, t0, t1, k10, transform, interpolator = (0, _continuousJs.identity), clamp = false, unknown;\n    function scale(x) {\n        return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));\n    }\n    scale.domain = function(_) {\n        return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [\n            x0,\n            x1\n        ];\n    };\n    scale.clamp = function(_) {\n        return arguments.length ? (clamp = !!_, scale) : clamp;\n    };\n    scale.interpolator = function(_) {\n        return arguments.length ? (interpolator = _, scale) : interpolator;\n    };\n    function range(interpolate) {\n        return function(_) {\n            var r0, r1;\n            return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [\n                interpolator(0),\n                interpolator(1)\n            ];\n        };\n    }\n    scale.range = range((0, _d3Interpolate.interpolate));\n    scale.rangeRound = range((0, _d3Interpolate.interpolateRound));\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    return function(t) {\n        transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);\n        return scale;\n    };\n}\nfunction copy(source, target) {\n    return target.domain(source.domain()).interpolator(source.interpolator()).clamp(source.clamp()).unknown(source.unknown());\n}\nfunction sequential() {\n    var scale = (0, _linearJs.linearish)(transformer()((0, _continuousJs.identity)));\n    scale.copy = function() {\n        return copy(scale, sequential());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nexports.default = sequential;\nfunction sequentialLog() {\n    var scale = (0, _logJs.loggish)(transformer()).domain([\n        1,\n        10\n    ]);\n    scale.copy = function() {\n        return copy(scale, sequentialLog()).base(scale.base());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction sequentialSymlog() {\n    var scale = (0, _symlogJs.symlogish)(transformer());\n    scale.copy = function() {\n        return copy(scale, sequentialSymlog()).constant(scale.constant());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction sequentialPow() {\n    var scale = (0, _powJs.powish)(transformer());\n    scale.copy = function() {\n        return copy(scale, sequentialPow()).exponent(scale.exponent());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction sequentialSqrt() {\n    return sequentialPow.apply(null, arguments).exponent(0.5);\n}\n\n},{\"d3-interpolate\":\"6gbPP\",\"./continuous.js\":\"it8xE\",\"./init.js\":\"kLKEv\",\"./linear.js\":\"5CETT\",\"./log.js\":\"2gcSE\",\"./symlog.js\":\"iUUr7\",\"./pow.js\":\"i4lyo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Qcq3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"divergingLog\", ()=>divergingLog);\nparcelHelpers.export(exports, \"divergingSymlog\", ()=>divergingSymlog);\nparcelHelpers.export(exports, \"divergingPow\", ()=>divergingPow);\nparcelHelpers.export(exports, \"divergingSqrt\", ()=>divergingSqrt);\nvar _d3Interpolate = require(\"d3-interpolate\");\nvar _continuousJs = require(\"./continuous.js\");\nvar _initJs = require(\"./init.js\");\nvar _linearJs = require(\"./linear.js\");\nvar _logJs = require(\"./log.js\");\nvar _sequentialJs = require(\"./sequential.js\");\nvar _symlogJs = require(\"./symlog.js\");\nvar _powJs = require(\"./pow.js\");\nfunction transformer() {\n    var x0 = 0, x1 = 0.5, x2 = 1, s = 1, t0, t1, t2, k10, k21, interpolator = (0, _continuousJs.identity), transform, clamp = false, unknown;\n    function scale(x) {\n        return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));\n    }\n    scale.domain = function(_) {\n        return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [\n            x0,\n            x1,\n            x2\n        ];\n    };\n    scale.clamp = function(_) {\n        return arguments.length ? (clamp = !!_, scale) : clamp;\n    };\n    scale.interpolator = function(_) {\n        return arguments.length ? (interpolator = _, scale) : interpolator;\n    };\n    function range(interpolate) {\n        return function(_) {\n            var r0, r1, r2;\n            return arguments.length ? ([r0, r1, r2] = _, interpolator = (0, _d3Interpolate.piecewise)(interpolate, [\n                r0,\n                r1,\n                r2\n            ]), scale) : [\n                interpolator(0),\n                interpolator(0.5),\n                interpolator(1)\n            ];\n        };\n    }\n    scale.range = range((0, _d3Interpolate.interpolate));\n    scale.rangeRound = range((0, _d3Interpolate.interpolateRound));\n    scale.unknown = function(_) {\n        return arguments.length ? (unknown = _, scale) : unknown;\n    };\n    return function(t) {\n        transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1;\n        return scale;\n    };\n}\nfunction diverging() {\n    var scale = (0, _linearJs.linearish)(transformer()((0, _continuousJs.identity)));\n    scale.copy = function() {\n        return (0, _sequentialJs.copy)(scale, diverging());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nexports.default = diverging;\nfunction divergingLog() {\n    var scale = (0, _logJs.loggish)(transformer()).domain([\n        0.1,\n        1,\n        10\n    ]);\n    scale.copy = function() {\n        return (0, _sequentialJs.copy)(scale, divergingLog()).base(scale.base());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction divergingSymlog() {\n    var scale = (0, _symlogJs.symlogish)(transformer());\n    scale.copy = function() {\n        return (0, _sequentialJs.copy)(scale, divergingSymlog()).constant(scale.constant());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction divergingPow() {\n    var scale = (0, _powJs.powish)(transformer());\n    scale.copy = function() {\n        return (0, _sequentialJs.copy)(scale, divergingPow()).exponent(scale.exponent());\n    };\n    return (0, _initJs.initInterpolator).apply(scale, arguments);\n}\nfunction divergingSqrt() {\n    return divergingPow.apply(null, arguments).exponent(0.5);\n}\n\n},{\"d3-interpolate\":\"6gbPP\",\"./continuous.js\":\"it8xE\",\"./init.js\":\"kLKEv\",\"./linear.js\":\"5CETT\",\"./log.js\":\"2gcSE\",\"./sequential.js\":\"f1sM1\",\"./symlog.js\":\"iUUr7\",\"./pow.js\":\"i4lyo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fpesP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"axisticks\", ()=>AxisTicks);\nparcelHelpers.export(exports, \"datajoin\", ()=>DataJoin);\nparcelHelpers.export(exports, \"encode\", ()=>Encode);\nparcelHelpers.export(exports, \"legendentries\", ()=>LegendEntries);\nparcelHelpers.export(exports, \"linkpath\", ()=>LinkPath);\nparcelHelpers.export(exports, \"pie\", ()=>Pie);\nparcelHelpers.export(exports, \"scale\", ()=>Scale);\nparcelHelpers.export(exports, \"sortitems\", ()=>SortItems);\nparcelHelpers.export(exports, \"stack\", ()=>Stack);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Array = require(\"d3-array\");\nvar _d3Interpolate = require(\"d3-interpolate\");\n/**\n * Generates axis ticks for visualizing a spatial scale.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Scale} params.scale - The scale to generate ticks for.\n * @param {*} [params.count=10] - The approximate number of ticks, or\n *   desired tick interval, to use.\n * @param {Array<*>} [params.values] - The exact tick values to use.\n *   These must be legal domain values for the provided scale.\n *   If provided, the count argument is ignored.\n * @param {function(*):string} [params.formatSpecifier] - A format specifier\n *   to use in conjunction with scale.tickFormat. Legal values are\n *   any valid d3 4.0 format specifier.\n * @param {function(*):string} [params.format] - The format function to use.\n *   If provided, the formatSpecifier argument is ignored.\n */ function AxisTicks(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(AxisTicks, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !_.modified()) return pulse.StopPropagation;\n        var locale = pulse.dataflow.locale(), out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), ticks = this.value, scale = _.scale, tally = _.count == null ? _.values ? _.values.length : 10 : _.count, count = (0, _vegaScale.tickCount)(scale, tally, _.minstep), format = _.format || (0, _vegaScale.tickFormat)(locale, scale, count, _.formatSpecifier, _.formatType, !!_.values), values = _.values ? (0, _vegaScale.validTicks)(scale, _.values, count) : (0, _vegaScale.tickValues)(scale, count);\n        if (ticks) out.rem = ticks;\n        ticks = values.map((value, i)=>(0, _vegaDataflow.ingest)({\n                index: i / (values.length - 1 || 1),\n                value: value,\n                label: format(value)\n            }));\n        if (_.extra && ticks.length) // add an extra tick pegged to the initial domain value\n        // this is used to generate axes with 'binned' domains\n        ticks.push((0, _vegaDataflow.ingest)({\n            index: -1,\n            extra: {\n                value: ticks[0].value\n            },\n            label: \"\"\n        }));\n        out.source = ticks;\n        out.add = ticks;\n        this.value = ticks;\n        return out;\n    }\n});\n/**\n * Joins a set of data elements against a set of visual items.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): object} [params.item] - An item generator function.\n * @param {function(object): *} [params.key] - The key field associating data and visual items.\n */ function DataJoin(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nfunction defaultItemCreate() {\n    return (0, _vegaDataflow.ingest)({});\n}\nfunction newMap(key) {\n    const map = (0, _vegaUtil.fastmap)().test((t)=>t.exit);\n    map.lookup = (t)=>map.get(key(t));\n    return map;\n}\n(0, _vegaUtil.inherits)(DataJoin, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var df = pulse.dataflow, out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), item = _.item || defaultItemCreate, key = _.key || (0, _vegaDataflow.tupleid), map = this.value; // prevent transient (e.g., hover) requests from\n        // cascading across marks derived from marks\n        if ((0, _vegaUtil.isArray)(out.encode)) out.encode = null;\n        if (map && (_.modified(\"key\") || pulse.modified(key))) (0, _vegaUtil.error)(\"DataJoin does not support modified key function or fields.\");\n        if (!map) {\n            pulse = pulse.addAll();\n            this.value = map = newMap(key);\n        }\n        pulse.visit(pulse.ADD, (t)=>{\n            const k = key(t);\n            let x = map.get(k);\n            if (x) {\n                if (x.exit) {\n                    map.empty--;\n                    out.add.push(x);\n                } else out.mod.push(x);\n            } else {\n                x = item(t);\n                map.set(k, x);\n                out.add.push(x);\n            }\n            x.datum = t;\n            x.exit = false;\n        });\n        pulse.visit(pulse.MOD, (t)=>{\n            const k = key(t), x = map.get(k);\n            if (x) {\n                x.datum = t;\n                out.mod.push(x);\n            }\n        });\n        pulse.visit(pulse.REM, (t)=>{\n            const k = key(t), x = map.get(k);\n            if (t === x.datum && !x.exit) {\n                out.rem.push(x);\n                x.exit = true;\n                ++map.empty;\n            }\n        });\n        if (pulse.changed(pulse.ADD_MOD)) out.modifies(\"datum\");\n        if (pulse.clean() || _.clean && map.empty > df.cleanThreshold) df.runAfter(map.clean);\n        return out;\n    }\n});\n/**\n * Invokes encoding functions for visual items.\n * @constructor\n * @param {object} params - The parameters to the encoding functions. This\n *   parameter object will be passed through to all invoked encoding functions.\n * @param {object} [params.mod=false] - Flag indicating if tuples in the input\n *   mod set that are unmodified by encoders should be included in the output.\n * @param {object} param.encoders - The encoding functions\n * @param {function(object, object): boolean} [param.encoders.update] - Update encoding set\n * @param {function(object, object): boolean} [param.encoders.enter] - Enter encoding set\n * @param {function(object, object): boolean} [param.encoders.exit] - Exit encoding set\n */ function Encode(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(Encode, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var out = pulse.fork(pulse.ADD_REM), fmod = _.mod || false, encoders = _.encoders, encode = pulse.encode; // if an array, the encode directive includes additional sets\n        // that must be defined in order for the primary set to be invoked\n        // e.g., only run the update set if the hover set is defined\n        if ((0, _vegaUtil.isArray)(encode)) {\n            if (out.changed() || encode.every((e)=>encoders[e])) {\n                encode = encode[0];\n                out.encode = null; // consume targeted encode directive\n            } else return pulse.StopPropagation;\n        } // marshall encoder functions\n        var reenter = encode === \"enter\", update = encoders.update || (0, _vegaUtil.falsy), enter = encoders.enter || (0, _vegaUtil.falsy), exit = encoders.exit || (0, _vegaUtil.falsy), set = (encode && !reenter ? encoders[encode] : update) || (0, _vegaUtil.falsy);\n        if (pulse.changed(pulse.ADD)) {\n            pulse.visit(pulse.ADD, (t)=>{\n                enter(t, _);\n                update(t, _);\n            });\n            out.modifies(enter.output);\n            out.modifies(update.output);\n            if (set !== (0, _vegaUtil.falsy) && set !== update) {\n                pulse.visit(pulse.ADD, (t)=>{\n                    set(t, _);\n                });\n                out.modifies(set.output);\n            }\n        }\n        if (pulse.changed(pulse.REM) && exit !== (0, _vegaUtil.falsy)) {\n            pulse.visit(pulse.REM, (t)=>{\n                exit(t, _);\n            });\n            out.modifies(exit.output);\n        }\n        if (reenter || set !== (0, _vegaUtil.falsy)) {\n            const flag = pulse.MOD | (_.modified() ? pulse.REFLOW : 0);\n            if (reenter) {\n                pulse.visit(flag, (t)=>{\n                    const mod = enter(t, _) || fmod;\n                    if (set(t, _) || mod) out.mod.push(t);\n                });\n                if (out.mod.length) out.modifies(enter.output);\n            } else pulse.visit(flag, (t)=>{\n                if (set(t, _) || fmod) out.mod.push(t);\n            });\n            if (out.mod.length) out.modifies(set.output);\n        }\n        return out.changed() ? out : pulse.StopPropagation;\n    }\n});\n/**\n * Generates legend entries for visualizing a scale.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Scale} params.scale - The scale to generate items for.\n * @param {*} [params.count=5] - The approximate number of items, or\n *   desired tick interval, to use.\n * @param {*} [params.limit] - The maximum number of entries to\n *   include in a symbol legend.\n * @param {Array<*>} [params.values] - The exact tick values to use.\n *   These must be legal domain values for the provided scale.\n *   If provided, the count argument is ignored.\n * @param {string} [params.formatSpecifier] - A format specifier\n *   to use in conjunction with scale.tickFormat. Legal values are\n *   any valid D3 format specifier string.\n * @param {function(*):string} [params.format] - The format function to use.\n *   If provided, the formatSpecifier argument is ignored.\n */ function LegendEntries(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\n(0, _vegaUtil.inherits)(LegendEntries, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value != null && !_.modified()) return pulse.StopPropagation;\n        var locale = pulse.dataflow.locale(), out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), items = this.value, type = _.type || (0, _vegaScale.SymbolLegend), scale = _.scale, limit = +_.limit, count = (0, _vegaScale.tickCount)(scale, _.count == null ? 5 : _.count, _.minstep), lskip = !!_.values || type === (0, _vegaScale.SymbolLegend), format = _.format || (0, _vegaScale.labelFormat)(locale, scale, count, type, _.formatSpecifier, _.formatType, lskip), values = _.values || (0, _vegaScale.labelValues)(scale, count), domain, fraction, size, offset, ellipsis;\n        if (items) out.rem = items;\n        if (type === (0, _vegaScale.SymbolLegend)) {\n            if (limit && values.length > limit) {\n                pulse.dataflow.warn(\"Symbol legend count exceeds limit, filtering items.\");\n                items = values.slice(0, limit - 1);\n                ellipsis = true;\n            } else items = values;\n            if ((0, _vegaUtil.isFunction)(size = _.size)) {\n                // if first value maps to size zero, remove from list (vega#717)\n                if (!_.values && scale(items[0]) === 0) items = items.slice(1);\n                 // compute size offset for legend entries\n                offset = items.reduce((max, value)=>Math.max(max, size(value, _)), 0);\n            } else size = (0, _vegaUtil.constant)(offset = size || 8);\n            items = items.map((value, index)=>(0, _vegaDataflow.ingest)({\n                    index: index,\n                    label: format(value, index, items),\n                    value: value,\n                    offset: offset,\n                    size: size(value, _)\n                }));\n            if (ellipsis) {\n                ellipsis = values[items.length];\n                items.push((0, _vegaDataflow.ingest)({\n                    index: items.length,\n                    label: \"\\u2026\".concat(values.length - items.length, \" entries\"),\n                    value: ellipsis,\n                    offset: offset,\n                    size: size(ellipsis, _)\n                }));\n            }\n        } else if (type === (0, _vegaScale.GradientLegend)) {\n            domain = scale.domain(), fraction = (0, _vegaScale.scaleFraction)(scale, domain[0], (0, _vegaUtil.peek)(domain)); // if automatic label generation produces 2 or fewer values,\n            // use the domain end points instead (fixes vega/vega#1364)\n            if (values.length < 3 && !_.values && domain[0] !== (0, _vegaUtil.peek)(domain)) values = [\n                domain[0],\n                (0, _vegaUtil.peek)(domain)\n            ];\n            items = values.map((value, index)=>(0, _vegaDataflow.ingest)({\n                    index: index,\n                    label: format(value, index, values),\n                    value: value,\n                    perc: fraction(value)\n                }));\n        } else {\n            size = values.length - 1;\n            fraction = (0, _vegaScale.labelFraction)(scale);\n            items = values.map((value, index)=>(0, _vegaDataflow.ingest)({\n                    index: index,\n                    label: format(value, index, values),\n                    value: value,\n                    perc: index ? fraction(value) : 0,\n                    perc2: index === size ? 1 : fraction(values[index + 1])\n                }));\n        }\n        out.source = items;\n        out.add = items;\n        this.value = items;\n        return out;\n    }\n});\nconst sourceX = (t)=>t.source.x;\nconst sourceY = (t)=>t.source.y;\nconst targetX = (t)=>t.target.x;\nconst targetY = (t)=>t.target.y;\n/**\n * Layout paths linking source and target elements.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function LinkPath(params) {\n    (0, _vegaDataflow.Transform).call(this, {}, params);\n}\nLinkPath.Definition = {\n    \"type\": \"LinkPath\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"sourceX\",\n            \"type\": \"field\",\n            \"default\": \"source.x\"\n        },\n        {\n            \"name\": \"sourceY\",\n            \"type\": \"field\",\n            \"default\": \"source.y\"\n        },\n        {\n            \"name\": \"targetX\",\n            \"type\": \"field\",\n            \"default\": \"target.x\"\n        },\n        {\n            \"name\": \"targetY\",\n            \"type\": \"field\",\n            \"default\": \"target.y\"\n        },\n        {\n            \"name\": \"orient\",\n            \"type\": \"enum\",\n            \"default\": \"vertical\",\n            \"values\": [\n                \"horizontal\",\n                \"vertical\",\n                \"radial\"\n            ]\n        },\n        {\n            \"name\": \"shape\",\n            \"type\": \"enum\",\n            \"default\": \"line\",\n            \"values\": [\n                \"line\",\n                \"arc\",\n                \"curve\",\n                \"diagonal\",\n                \"orthogonal\"\n            ]\n        },\n        {\n            \"name\": \"require\",\n            \"type\": \"signal\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"path\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(LinkPath, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var sx = _.sourceX || sourceX, sy = _.sourceY || sourceY, tx = _.targetX || targetX, ty = _.targetY || targetY, as = _.as || \"path\", orient = _.orient || \"vertical\", shape = _.shape || \"line\", path = Paths.get(shape + \"-\" + orient) || Paths.get(shape);\n        if (!path) (0, _vegaUtil.error)(\"LinkPath unsupported type: \" + _.shape + (_.orient ? \"-\" + _.orient : \"\"));\n        pulse.visit(pulse.SOURCE, (t)=>{\n            t[as] = path(sx(t), sy(t), tx(t), ty(t));\n        });\n        return pulse.reflow(_.modified()).modifies(as);\n    }\n});\nconst line = (sx, sy, tx, ty)=>\"M\" + sx + \",\" + sy + \"L\" + tx + \",\" + ty;\nconst lineR = (sa, sr, ta, tr)=>line(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\nconst arc = (sx, sy, tx, ty)=>{\n    var dx = tx - sx, dy = ty - sy, rr = Math.sqrt(dx * dx + dy * dy) / 2, ra = 180 * Math.atan2(dy, dx) / Math.PI;\n    return \"M\" + sx + \",\" + sy + \"A\" + rr + \",\" + rr + \" \" + ra + \" 0 1\" + \" \" + tx + \",\" + ty;\n};\nconst arcR = (sa, sr, ta, tr)=>arc(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\nconst curve = (sx, sy, tx, ty)=>{\n    const dx = tx - sx, dy = ty - sy, ix = 0.2 * (dx + dy), iy = 0.2 * (dy - dx);\n    return \"M\" + sx + \",\" + sy + \"C\" + (sx + ix) + \",\" + (sy + iy) + \" \" + (tx + iy) + \",\" + (ty - ix) + \" \" + tx + \",\" + ty;\n};\nconst curveR = (sa, sr, ta, tr)=>curve(sr * Math.cos(sa), sr * Math.sin(sa), tr * Math.cos(ta), tr * Math.sin(ta));\nconst orthoX = (sx, sy, tx, ty)=>\"M\" + sx + \",\" + sy + \"V\" + ty + \"H\" + tx;\nconst orthoY = (sx, sy, tx, ty)=>\"M\" + sx + \",\" + sy + \"H\" + tx + \"V\" + ty;\nconst orthoR = (sa, sr, ta, tr)=>{\n    const sc = Math.cos(sa), ss = Math.sin(sa), tc = Math.cos(ta), ts = Math.sin(ta), sf = Math.abs(ta - sa) > Math.PI ? ta <= sa : ta > sa;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"A\" + sr + \",\" + sr + \" 0 0,\" + (sf ? 1 : 0) + \" \" + sr * tc + \",\" + sr * ts + \"L\" + tr * tc + \",\" + tr * ts;\n};\nconst diagonalX = (sx, sy, tx, ty)=>{\n    const m = (sx + tx) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + m + \",\" + sy + \" \" + m + \",\" + ty + \" \" + tx + \",\" + ty;\n};\nconst diagonalY = (sx, sy, tx, ty)=>{\n    const m = (sy + ty) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + sx + \",\" + m + \" \" + tx + \",\" + m + \" \" + tx + \",\" + ty;\n};\nconst diagonalR = (sa, sr, ta, tr)=>{\n    const sc = Math.cos(sa), ss = Math.sin(sa), tc = Math.cos(ta), ts = Math.sin(ta), mr = (sr + tr) / 2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"C\" + mr * sc + \",\" + mr * ss + \" \" + mr * tc + \",\" + mr * ts + \" \" + tr * tc + \",\" + tr * ts;\n};\nconst Paths = (0, _vegaUtil.fastmap)({\n    \"line\": line,\n    \"line-radial\": lineR,\n    \"arc\": arc,\n    \"arc-radial\": arcR,\n    \"curve\": curve,\n    \"curve-radial\": curveR,\n    \"orthogonal-horizontal\": orthoX,\n    \"orthogonal-vertical\": orthoY,\n    \"orthogonal-radial\": orthoR,\n    \"diagonal-horizontal\": diagonalX,\n    \"diagonal-vertical\": diagonalY,\n    \"diagonal-radial\": diagonalR\n});\n/**\n * Pie and donut chart layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size pie segments.\n * @param {number} [params.startAngle=0] - The start angle (in radians) of the layout.\n * @param {number} [params.endAngle=2π] - The end angle (in radians) of the layout.\n * @param {boolean} [params.sort] - Boolean flag for sorting sectors by value.\n */ function Pie(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nPie.Definition = {\n    \"type\": \"Pie\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"startAngle\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"endAngle\",\n            \"type\": \"number\",\n            \"default\": 6.283185307179586\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"startAngle\",\n                \"endAngle\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Pie, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var as = _.as || [\n            \"startAngle\",\n            \"endAngle\"\n        ], startAngle = as[0], endAngle = as[1], field = _.field || (0, _vegaUtil.one), start = _.startAngle || 0, stop = _.endAngle != null ? _.endAngle : 2 * Math.PI, data = pulse.source, values = data.map(field), n = values.length, a1 = start, k = (stop - start) / (0, _d3Array.sum)(values), index = (0, _d3Array.range)(n), i, t, v;\n        if (_.sort) index.sort((a, b)=>values[a] - values[b]);\n        for(i = 0; i < n; ++i){\n            v = values[index[i]];\n            t = data[index[i]];\n            t[startAngle] = a1;\n            t[endAngle] = a1 += v * k;\n        }\n        this.value = values;\n        return pulse.reflow(_.modified()).modifies(as);\n    }\n});\nconst DEFAULT_COUNT = 5;\nfunction includeZero(scale) {\n    const type = scale.type;\n    return !scale.bins && (type === (0, _vegaScale.Linear) || type === (0, _vegaScale.Pow) || type === (0, _vegaScale.Sqrt));\n}\nfunction includePad(type) {\n    return (0, _vegaScale.isContinuous)(type) && type !== (0, _vegaScale.Sequential);\n}\nconst SKIP = (0, _vegaUtil.toSet)([\n    \"set\",\n    \"modified\",\n    \"clear\",\n    \"type\",\n    \"scheme\",\n    \"schemeExtent\",\n    \"schemeCount\",\n    \"domain\",\n    \"domainMin\",\n    \"domainMid\",\n    \"domainMax\",\n    \"domainRaw\",\n    \"domainImplicit\",\n    \"nice\",\n    \"zero\",\n    \"bins\",\n    \"range\",\n    \"rangeStep\",\n    \"round\",\n    \"reverse\",\n    \"interpolate\",\n    \"interpolateGamma\"\n]);\n/**\n * Maintains a scale function mapping data values to visual channels.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function Scale(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n    this.modified(true); // always treat as modified\n}\n(0, _vegaUtil.inherits)(Scale, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var df = pulse.dataflow, scale$1 = this.value, key = scaleKey(_);\n        if (!scale$1 || key !== scale$1.type) this.value = scale$1 = (0, _vegaScale.scale)(key)();\n        for(key in _)if (!SKIP[key]) {\n            // padding is a scale property for band/point but not others\n            if (key === \"padding\" && includePad(scale$1.type)) continue; // invoke scale property setter, raise warning if not found\n            (0, _vegaUtil.isFunction)(scale$1[key]) ? scale$1[key](_[key]) : df.warn(\"Unsupported scale property: \" + key);\n        }\n        configureRange(scale$1, _, configureBins(scale$1, _, configureDomain(scale$1, _, df)));\n        return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n    }\n});\nfunction scaleKey(_) {\n    var t = _.type, d = \"\", n; // backwards compatibility pre Vega 5.\n    if (t === (0, _vegaScale.Sequential)) return (0, _vegaScale.Sequential) + \"-\" + (0, _vegaScale.Linear);\n    if (isContinuousColor(_)) {\n        n = _.rawDomain ? _.rawDomain.length : _.domain ? _.domain.length + +(_.domainMid != null) : 0;\n        d = n === 2 ? (0, _vegaScale.Sequential) + \"-\" : n === 3 ? (0, _vegaScale.Diverging) + \"-\" : \"\";\n    }\n    return (d + t || (0, _vegaScale.Linear)).toLowerCase();\n}\nfunction isContinuousColor(_) {\n    const t = _.type;\n    return (0, _vegaScale.isContinuous)(t) && t !== (0, _vegaScale.Time) && t !== (0, _vegaScale.UTC) && (_.scheme || _.range && _.range.length && _.range.every((0, _vegaUtil.isString)));\n}\nfunction configureDomain(scale, _, df) {\n    // check raw domain, if provided use that and exit early\n    const raw = rawDomain(scale, _.domainRaw, df);\n    if (raw > -1) return raw;\n    var domain = _.domain, type = scale.type, zero = _.zero || _.zero === undefined && includeZero(scale), n, mid;\n    if (!domain) return 0; // adjust continuous domain for minimum pixel padding\n    if (includePad(type) && _.padding && domain[0] !== (0, _vegaUtil.peek)(domain)) domain = padDomain(type, domain, _.range, _.padding, _.exponent, _.constant);\n     // adjust domain based on zero, min, max settings\n    if (zero || _.domainMin != null || _.domainMax != null || _.domainMid != null) {\n        n = (domain = domain.slice()).length - 1 || 1;\n        if (zero) {\n            if (domain[0] > 0) domain[0] = 0;\n            if (domain[n] < 0) domain[n] = 0;\n        }\n        if (_.domainMin != null) domain[0] = _.domainMin;\n        if (_.domainMax != null) domain[n] = _.domainMax;\n        if (_.domainMid != null) {\n            mid = _.domainMid;\n            const i = mid > domain[n] ? n + 1 : mid < domain[0] ? 0 : n;\n            if (i !== n) df.warn(\"Scale domainMid exceeds domain min or max.\", mid);\n            domain.splice(i, 0, mid);\n        }\n    } // set the scale domain\n    scale.domain(domainCheck(type, domain, df)); // if ordinal scale domain is defined, prevent implicit\n    // domain construction as side-effect of scale lookup\n    if (type === (0, _vegaScale.Ordinal)) scale.unknown(_.domainImplicit ? (0, _vegaScale.scaleImplicit) : undefined);\n     // perform 'nice' adjustment as requested\n    if (_.nice && scale.nice) scale.nice(_.nice !== true && (0, _vegaScale.tickCount)(scale, _.nice) || null);\n     // return the cardinality of the domain\n    return domain.length;\n}\nfunction rawDomain(scale, raw, df) {\n    if (raw) {\n        scale.domain(domainCheck(scale.type, raw, df));\n        return raw.length;\n    } else return -1;\n}\nfunction padDomain(type, domain, range, pad, exponent, constant) {\n    var span = Math.abs((0, _vegaUtil.peek)(range) - range[0]), frac = span / (span - 2 * pad), d = type === (0, _vegaScale.Log) ? (0, _vegaUtil.zoomLog)(domain, null, frac) : type === (0, _vegaScale.Sqrt) ? (0, _vegaUtil.zoomPow)(domain, null, frac, 0.5) : type === (0, _vegaScale.Pow) ? (0, _vegaUtil.zoomPow)(domain, null, frac, exponent || 1) : type === (0, _vegaScale.Symlog) ? (0, _vegaUtil.zoomSymlog)(domain, null, frac, constant || 1) : (0, _vegaUtil.zoomLinear)(domain, null, frac);\n    domain = domain.slice();\n    domain[0] = d[0];\n    domain[domain.length - 1] = d[1];\n    return domain;\n}\nfunction domainCheck(type, domain, df) {\n    if ((0, _vegaScale.isLogarithmic)(type)) {\n        // sum signs of domain values\n        // if all pos or all neg, abs(sum) === domain.length\n        var s1 = Math.abs(domain.reduce((s, v)=>s + (v < 0 ? -1 : v > 0 ? 1 : 0), 0));\n        if (s1 !== domain.length) df.warn(\"Log scale domain includes zero: \" + (0, _vegaUtil.stringValue)(domain));\n    }\n    return domain;\n}\nfunction configureBins(scale, _, count) {\n    let bins = _.bins;\n    if (bins && !(0, _vegaUtil.isArray)(bins)) {\n        // generate bin boundary array\n        const domain = scale.domain(), lo = domain[0], hi = (0, _vegaUtil.peek)(domain), step = bins.step;\n        let start = bins.start == null ? lo : bins.start, stop = bins.stop == null ? hi : bins.stop;\n        if (!step) (0, _vegaUtil.error)(\"Scale bins parameter missing step property.\");\n        if (start < lo) start = step * Math.ceil(lo / step);\n        if (stop > hi) stop = step * Math.floor(hi / step);\n        bins = (0, _d3Array.range)(start, stop + step / 2, step);\n    }\n    if (bins) // assign bin boundaries to scale instance\n    scale.bins = bins;\n    else if (scale.bins) // no current bins, remove bins if previously set\n    delete scale.bins;\n     // special handling for bin-ordinal scales\n    if (scale.type === (0, _vegaScale.BinOrdinal)) {\n        if (!bins) // the domain specifies the bins\n        scale.bins = scale.domain();\n        else if (!_.domain && !_.domainRaw) {\n            // the bins specify the domain\n            scale.domain(bins);\n            count = bins.length;\n        }\n    } // return domain cardinality\n    return count;\n}\nfunction configureRange(scale, _, count) {\n    var type = scale.type, round = _.round || false, range = _.range; // if range step specified, calculate full range extent\n    if (_.rangeStep != null) range = configureRangeStep(type, _, count);\n    else if (_.scheme) {\n        range = configureScheme(type, _, count);\n        if ((0, _vegaUtil.isFunction)(range)) {\n            if (scale.interpolator) return scale.interpolator(range);\n            else (0, _vegaUtil.error)(\"Scale type \".concat(type, \" does not support interpolating color schemes.\"));\n        }\n    } // given a range array for an interpolating scale, convert to interpolator\n    if (range && (0, _vegaScale.isInterpolating)(type)) return scale.interpolator((0, _vegaScale.interpolateColors)(flip(range, _.reverse), _.interpolate, _.interpolateGamma));\n     // configure rounding / interpolation\n    if (range && _.interpolate && scale.interpolate) scale.interpolate((0, _vegaScale.interpolate)(_.interpolate, _.interpolateGamma));\n    else if ((0, _vegaUtil.isFunction)(scale.round)) scale.round(round);\n    else if ((0, _vegaUtil.isFunction)(scale.rangeRound)) scale.interpolate(round ? (0, _d3Interpolate.interpolateRound) : (0, _d3Interpolate.interpolate));\n    if (range) scale.range(flip(range, _.reverse));\n}\nfunction configureRangeStep(type, _, count) {\n    if (type !== (0, _vegaScale.Band) && type !== (0, _vegaScale.Point)) (0, _vegaUtil.error)(\"Only band and point scales support rangeStep.\");\n     // calculate full range based on requested step size and padding\n    var outer = (_.paddingOuter != null ? _.paddingOuter : _.padding) || 0, inner = type === (0, _vegaScale.Point) ? 1 : (_.paddingInner != null ? _.paddingInner : _.padding) || 0;\n    return [\n        0,\n        _.rangeStep * (0, _vegaScale.bandSpace)(count, inner, outer)\n    ];\n}\nfunction configureScheme(type, _, count) {\n    var extent = _.schemeExtent, name, scheme$1;\n    if ((0, _vegaUtil.isArray)(_.scheme)) scheme$1 = (0, _vegaScale.interpolateColors)(_.scheme, _.interpolate, _.interpolateGamma);\n    else {\n        name = _.scheme.toLowerCase();\n        scheme$1 = (0, _vegaScale.scheme)(name);\n        if (!scheme$1) (0, _vegaUtil.error)(\"Unrecognized scheme name: \".concat(_.scheme));\n    } // determine size for potential discrete range\n    count = type === (0, _vegaScale.Threshold) ? count + 1 : type === (0, _vegaScale.BinOrdinal) ? count - 1 : type === (0, _vegaScale.Quantile) || type === (0, _vegaScale.Quantize) ? +_.schemeCount || DEFAULT_COUNT : count; // adjust and/or quantize scheme as appropriate\n    return (0, _vegaScale.isInterpolating)(type) ? adjustScheme(scheme$1, extent, _.reverse) : (0, _vegaUtil.isFunction)(scheme$1) ? (0, _vegaScale.quantizeInterpolator)(adjustScheme(scheme$1, extent), count) : type === (0, _vegaScale.Ordinal) ? scheme$1 : scheme$1.slice(0, count);\n}\nfunction adjustScheme(scheme, extent, reverse) {\n    return (0, _vegaUtil.isFunction)(scheme) && (extent || reverse) ? (0, _vegaScale.interpolateRange)(scheme, flip(extent || [\n        0,\n        1\n    ], reverse)) : scheme;\n}\nfunction flip(array, reverse) {\n    return reverse ? array.slice().reverse() : array;\n}\n/**\n * Sorts scenegraph items in the pulse source array.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(*,*): number} [params.sort] - A comparator\n *   function for sorting tuples.\n */ function SortItems(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\n(0, _vegaUtil.inherits)(SortItems, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const mod = _.modified(\"sort\") || pulse.changed(pulse.ADD) || pulse.modified(_.sort.fields) || pulse.modified(\"datum\");\n        if (mod) pulse.source.sort((0, _vegaDataflow.stableCompare)(_.sort));\n        this.modified(mod);\n        return pulse;\n    }\n});\nconst Zero = \"zero\", Center = \"center\", Normalize = \"normalize\", DefOutput = [\n    \"y0\",\n    \"y1\"\n];\n/**\n * Stack layout for visualization elements.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to stack.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {function(object,object): number} [params.sort] - A comparator for stack sorting.\n * @param {string} [offset='zero'] - Stack baseline offset. One of 'zero', 'center', 'normalize'.\n */ function Stack(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nStack.Definition = {\n    \"type\": \"Stack\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"offset\",\n            \"type\": \"enum\",\n            \"default\": Zero,\n            \"values\": [\n                Zero,\n                Center,\n                Normalize\n            ]\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": DefOutput\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Stack, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var as = _.as || DefOutput, y0 = as[0], y1 = as[1], sort = (0, _vegaDataflow.stableCompare)(_.sort), field = _.field || (0, _vegaUtil.one), stack = _.offset === Center ? stackCenter : _.offset === Normalize ? stackNormalize : stackZero, groups, i, n, max; // partition, sum, and sort the stack groups\n        groups = partition(pulse.source, _.groupby, sort, field); // compute stack layouts per group\n        for(i = 0, n = groups.length, max = groups.max; i < n; ++i)stack(groups[i], max, field, y0, y1);\n        return pulse.reflow(_.modified()).modifies(as);\n    }\n});\nfunction stackCenter(group, max, field, y0, y1) {\n    var last = (max - group.sum) / 2, m = group.length, j = 0, t;\n    for(; j < m; ++j){\n        t = group[j];\n        t[y0] = last;\n        t[y1] = last += Math.abs(field(t));\n    }\n}\nfunction stackNormalize(group, max, field, y0, y1) {\n    var scale = 1 / group.sum, last = 0, m = group.length, j = 0, v = 0, t;\n    for(; j < m; ++j){\n        t = group[j];\n        t[y0] = last;\n        t[y1] = last = scale * (v += Math.abs(field(t)));\n    }\n}\nfunction stackZero(group, max, field, y0, y1) {\n    var lastPos = 0, lastNeg = 0, m = group.length, j = 0, v, t;\n    for(; j < m; ++j){\n        t = group[j];\n        v = +field(t);\n        if (v < 0) {\n            t[y0] = lastNeg;\n            t[y1] = lastNeg += v;\n        } else {\n            t[y0] = lastPos;\n            t[y1] = lastPos += v;\n        }\n    }\n}\nfunction partition(data, groupby, sort, field) {\n    var groups = [], get = (f)=>f(t), map, i, n, m, t, k, g, s, max; // partition data points into stack groups\n    if (groupby == null) groups.push(data.slice());\n    else for(map = {}, i = 0, n = data.length; i < n; ++i){\n        t = data[i];\n        k = groupby.map(get);\n        g = map[k];\n        if (!g) {\n            map[k] = g = [];\n            groups.push(g);\n        }\n        g.push(t);\n    }\n     // compute sums of groups, sort groups as needed\n    for(k = 0, max = 0, m = groups.length; k < m; ++k){\n        g = groups[k];\n        for(i = 0, s = 0, n = g.length; i < n; ++i)s += Math.abs(field(g[i]));\n        g.sum = s;\n        if (s > max) max = s;\n        if (sort) g.sort(sort);\n    }\n    groups.max = max;\n    return groups;\n}\n\n},{\"vega-dataflow\":\"3NitK\",\"vega-scale\":\"bEydG\",\"vega-util\":\"bApja\",\"d3-array\":\"6IwJG\",\"d3-interpolate\":\"6gbPP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3rF9B\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"contour\", ()=>Contour);\nparcelHelpers.export(exports, \"geojson\", ()=>GeoJSON);\nparcelHelpers.export(exports, \"geopath\", ()=>GeoPath);\nparcelHelpers.export(exports, \"geopoint\", ()=>GeoPoint);\nparcelHelpers.export(exports, \"geoshape\", ()=>GeoShape);\nparcelHelpers.export(exports, \"graticule\", ()=>Graticule);\nparcelHelpers.export(exports, \"heatmap\", ()=>Heatmap);\nparcelHelpers.export(exports, \"isocontour\", ()=>Isocontour);\nparcelHelpers.export(exports, \"kde2d\", ()=>KDE2D);\nparcelHelpers.export(exports, \"projection\", ()=>Projection);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Array = require(\"d3-array\");\nvar _vegaStatistics = require(\"vega-statistics\");\nvar _vegaProjection = require(\"vega-projection\");\nvar _d3Geo = require(\"d3-geo\");\nvar _d3Color = require(\"d3-color\");\nvar _vegaCanvas = require(\"vega-canvas\");\nfunction noop() {}\nconst cases = [\n    [],\n    [\n        [\n            [\n                1.0,\n                1.5\n            ],\n            [\n                0.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.5,\n                1.0\n            ],\n            [\n                1.0,\n                1.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.5,\n                1.0\n            ],\n            [\n                0.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                0.5\n            ],\n            [\n                1.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                1.5\n            ],\n            [\n                0.5,\n                1.0\n            ]\n        ],\n        [\n            [\n                1.0,\n                0.5\n            ],\n            [\n                1.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                0.5\n            ],\n            [\n                1.0,\n                1.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                0.5\n            ],\n            [\n                0.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                0.5,\n                1.0\n            ],\n            [\n                1.0,\n                0.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                1.5\n            ],\n            [\n                1.0,\n                0.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                0.5,\n                1.0\n            ],\n            [\n                1.0,\n                0.5\n            ]\n        ],\n        [\n            [\n                1.5,\n                1.0\n            ],\n            [\n                1.0,\n                1.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.5,\n                1.0\n            ],\n            [\n                1.0,\n                0.5\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                0.5,\n                1.0\n            ],\n            [\n                1.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                1.0,\n                1.5\n            ],\n            [\n                1.5,\n                1.0\n            ]\n        ]\n    ],\n    [\n        [\n            [\n                0.5,\n                1.0\n            ],\n            [\n                1.0,\n                1.5\n            ]\n        ]\n    ],\n    []\n]; // Implementation adapted from d3/d3-contour. Thanks!\nfunction contours() {\n    var dx = 1, dy = 1, smooth = smoothLinear;\n    function contours1(values, tz) {\n        return tz.map((value)=>contour(values, value));\n    } // Accumulate, smooth contour rings, assign holes to exterior rings.\n    // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js\n    function contour(values, value) {\n        var polygons = [], holes = [];\n        isorings(values, value, (ring)=>{\n            smooth(ring, values, value);\n            if (area(ring) > 0) polygons.push([\n                ring\n            ]);\n            else holes.push(ring);\n        });\n        holes.forEach((hole)=>{\n            for(var i = 0, n = polygons.length, polygon; i < n; ++i)if (contains((polygon = polygons[i])[0], hole) !== -1) {\n                polygon.push(hole);\n                return;\n            }\n        });\n        return {\n            type: \"MultiPolygon\",\n            value: value,\n            coordinates: polygons\n        };\n    } // Marching squares with isolines stitched into rings.\n    // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js\n    function isorings(values, value, callback) {\n        var fragmentByStart = new Array(), fragmentByEnd = new Array(), x, y, t0, t1, t2, t3; // Special case for the first row (y = -1, t2 = t3 = 0).\n        x = y = -1;\n        t1 = values[0] >= value;\n        cases[t1 << 1].forEach(stitch);\n        while(++x < dx - 1){\n            t0 = t1, t1 = values[x + 1] >= value;\n            cases[t0 | t1 << 1].forEach(stitch);\n        }\n        cases[t1 << 0].forEach(stitch); // General case for the intermediate rows.\n        while(++y < dy - 1){\n            x = -1;\n            t1 = values[y * dx + dx] >= value;\n            t2 = values[y * dx] >= value;\n            cases[t1 << 1 | t2 << 2].forEach(stitch);\n            while(++x < dx - 1){\n                t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;\n                t3 = t2, t2 = values[y * dx + x + 1] >= value;\n                cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);\n            }\n            cases[t1 | t2 << 3].forEach(stitch);\n        } // Special case for the last row (y = dy - 1, t0 = t1 = 0).\n        x = -1;\n        t2 = values[y * dx] >= value;\n        cases[t2 << 2].forEach(stitch);\n        while(++x < dx - 1){\n            t3 = t2, t2 = values[y * dx + x + 1] >= value;\n            cases[t2 << 2 | t3 << 3].forEach(stitch);\n        }\n        cases[t2 << 3].forEach(stitch);\n        function stitch(line) {\n            var start = [\n                line[0][0] + x,\n                line[0][1] + y\n            ], end = [\n                line[1][0] + x,\n                line[1][1] + y\n            ], startIndex = index(start), endIndex = index(end), f, g;\n            if (f = fragmentByEnd[startIndex]) {\n                if (g = fragmentByStart[endIndex]) {\n                    delete fragmentByEnd[f.end];\n                    delete fragmentByStart[g.start];\n                    if (f === g) {\n                        f.ring.push(end);\n                        callback(f.ring);\n                    } else fragmentByStart[f.start] = fragmentByEnd[g.end] = {\n                        start: f.start,\n                        end: g.end,\n                        ring: f.ring.concat(g.ring)\n                    };\n                } else {\n                    delete fragmentByEnd[f.end];\n                    f.ring.push(end);\n                    fragmentByEnd[f.end = endIndex] = f;\n                }\n            } else if (f = fragmentByStart[endIndex]) {\n                if (g = fragmentByEnd[startIndex]) {\n                    delete fragmentByStart[f.start];\n                    delete fragmentByEnd[g.end];\n                    if (f === g) {\n                        f.ring.push(end);\n                        callback(f.ring);\n                    } else fragmentByStart[g.start] = fragmentByEnd[f.end] = {\n                        start: g.start,\n                        end: f.end,\n                        ring: g.ring.concat(f.ring)\n                    };\n                } else {\n                    delete fragmentByStart[f.start];\n                    f.ring.unshift(start);\n                    fragmentByStart[f.start = startIndex] = f;\n                }\n            } else fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {\n                start: startIndex,\n                end: endIndex,\n                ring: [\n                    start,\n                    end\n                ]\n            };\n        }\n    }\n    function index(point) {\n        return point[0] * 2 + point[1] * (dx + 1) * 4;\n    }\n    function smoothLinear(ring, values, value) {\n        ring.forEach((point)=>{\n            var x = point[0], y = point[1], xt = x | 0, yt = y | 0, v0, v1 = values[yt * dx + xt];\n            if (x > 0 && x < dx && xt === x) {\n                v0 = values[yt * dx + xt - 1];\n                point[0] = x + (value - v0) / (v1 - v0) - 0.5;\n            }\n            if (y > 0 && y < dy && yt === y) {\n                v0 = values[(yt - 1) * dx + xt];\n                point[1] = y + (value - v0) / (v1 - v0) - 0.5;\n            }\n        });\n    }\n    contours1.contour = contour;\n    contours1.size = function(_) {\n        if (!arguments.length) return [\n            dx,\n            dy\n        ];\n        var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]);\n        if (!(_0 >= 0 && _1 >= 0)) (0, _vegaUtil.error)(\"invalid size\");\n        return dx = _0, dy = _1, contours1;\n    };\n    contours1.smooth = function(_) {\n        return arguments.length ? (smooth = _ ? smoothLinear : noop, contours1) : smooth === smoothLinear;\n    };\n    return contours1;\n}\nfunction area(ring) {\n    var i = 0, n = ring.length, area1 = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n    while(++i < n)area1 += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n    return area1;\n}\nfunction contains(ring, hole) {\n    var i = -1, n = hole.length, c;\n    while(++i < n)if (c = ringContains(ring, hole[i])) return c;\n    return 0;\n}\nfunction ringContains(ring, point) {\n    var x = point[0], y = point[1], contains1 = -1;\n    for(var i = 0, n = ring.length, j = n - 1; i < n; j = i++){\n        var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];\n        if (segmentContains(pi, pj, point)) return 0;\n        if (yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi) contains1 = -contains1;\n    }\n    return contains1;\n}\nfunction segmentContains(a, b, c) {\n    var i;\n    return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);\n}\nfunction collinear(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);\n}\nfunction within(p, q, r) {\n    return p <= q && q <= r || r <= q && q <= p;\n}\nfunction quantize(k, nice, zero) {\n    return function(values) {\n        var ex = (0, _vegaUtil.extent)(values), start = zero ? Math.min(ex[0], 0) : ex[0], stop = ex[1], span = stop - start, step = nice ? (0, _d3Array.tickStep)(start, stop, k) : span / (k + 1);\n        return (0, _d3Array.range)(start + step, stop, step);\n    };\n}\n/**\n * Generate isocontours (level sets) based on input raster grid data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} [params.field] - The field with raster grid\n *   data. If unspecified, the tuple itself is interpreted as a raster grid.\n * @param {Array<number>} [params.thresholds] - Contour threshold array. If\n *   specified, the levels, nice, resolve, and zero parameters are ignored.\n * @param {number} [params.levels] - The desired number of contour levels.\n * @param {boolean} [params.nice] - Boolean flag indicating if the contour\n *   threshold values should be automatically aligned to \"nice\"\n *   human-friendly values. Setting this flag may cause the number of\n *   thresholds to deviate from the specified levels.\n * @param {string} [params.resolve] - The method for resolving thresholds\n *   across multiple input grids. If 'independent' (the default), threshold\n *   calculation will be performed separately for each grid. If 'shared', a\n *   single set of threshold values will be used for all input grids.\n * @param {boolean} [params.zero] - Boolean flag indicating if the contour\n *   threshold values should include zero.\n * @param {boolean} [params.smooth] - Boolean flag indicating if the contour\n *   polygons should be smoothed using linear interpolation. The default is\n *   true. The parameter is ignored when using density estimation.\n * @param {boolean} [params.scale] - Optional numerical value by which to\n *   scale the output isocontour coordinates. This parameter can be useful\n *   to scale the contours to match a desired output resolution.\n * @param {string} [params.as='contour'] - The output field in which to store\n *   the generated isocontour data (default 'contour').\n */ function Isocontour(params1) {\n    (0, _vegaDataflow.Transform).call(this, null, params1);\n}\nIsocontour.Definition = {\n    \"type\": \"Isocontour\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"thresholds\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"levels\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"nice\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"resolve\",\n            \"type\": \"enum\",\n            \"values\": [\n                \"shared\",\n                \"independent\"\n            ],\n            \"default\": \"independent\"\n        },\n        {\n            \"name\": \"zero\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"smooth\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"scale\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"translate\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"expr\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"null\": true,\n            \"default\": \"contour\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Isocontour, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !pulse.changed() && !_.modified()) return pulse.StopPropagation;\n        var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), source = pulse.materialize(pulse.SOURCE).source, field = _.field || (0, _vegaUtil.identity), contour = contours().smooth(_.smooth !== false), tz = _.thresholds || levels(source, field, _), as = _.as === null ? null : _.as || \"contour\", values = [];\n        source.forEach((t)=>{\n            const grid = field(t); // generate contour paths in GeoJSON format\n            const paths = contour.size([\n                grid.width,\n                grid.height\n            ])(grid.values, (0, _vegaUtil.isArray)(tz) ? tz : tz(grid.values)); // adjust contour path coordinates as needed\n            transformPaths(paths, grid, t, _); // ingest; copy source data properties to output\n            paths.forEach((p)=>{\n                values.push((0, _vegaDataflow.rederive)(t, (0, _vegaDataflow.ingest)(as != null ? {\n                    [as]: p\n                } : p)));\n            });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.source = out.add = values;\n        return out;\n    }\n});\nfunction levels(values, f, _) {\n    const q = quantize(_.levels || 10, _.nice, _.zero !== false);\n    return _.resolve !== \"shared\" ? q : q(values.map((t)=>(0, _d3Array.max)(f(t).values)));\n}\nfunction transformPaths(paths, grid, datum, _) {\n    let s = _.scale || grid.scale, t = _.translate || grid.translate;\n    if ((0, _vegaUtil.isFunction)(s)) s = s(datum, _);\n    if ((0, _vegaUtil.isFunction)(t)) t = t(datum, _);\n    if ((s === 1 || s == null) && !t) return;\n    const sx = ((0, _vegaUtil.isNumber)(s) ? s : s[0]) || 1, sy = ((0, _vegaUtil.isNumber)(s) ? s : s[1]) || 1, tx = t && t[0] || 0, ty = t && t[1] || 0;\n    paths.forEach(transform(grid, sx, sy, tx, ty));\n}\nfunction transform(grid, sx, sy, tx, ty) {\n    const x1 = grid.x1 || 0, y1 = grid.y1 || 0, flip = sx * sy < 0;\n    function transformPolygon(coordinates) {\n        coordinates.forEach(transformRing);\n    }\n    function transformRing(coordinates) {\n        if (flip) coordinates.reverse(); // maintain winding order\n        coordinates.forEach(transformPoint);\n    }\n    function transformPoint(coordinates) {\n        coordinates[0] = (coordinates[0] - x1) * sx + tx;\n        coordinates[1] = (coordinates[1] - y1) * sy + ty;\n    }\n    return function(geometry) {\n        geometry.coordinates.forEach(transformPolygon);\n        return geometry;\n    };\n}\nfunction radius(bw, data, f) {\n    const v = bw >= 0 ? bw : (0, _vegaStatistics.bandwidthNRD)(data, f);\n    return Math.round((Math.sqrt(4 * v * v + 1) - 1) / 2);\n}\nfunction number(_) {\n    return (0, _vegaUtil.isFunction)(_) ? _ : (0, _vegaUtil.constant)(+_);\n} // Implementation adapted from d3/d3-contour. Thanks!\nfunction density2D() {\n    var x = (d)=>d[0], y = (d)=>d[1], weight = (0, _vegaUtil.one), bandwidth = [\n        -1,\n        -1\n    ], dx = 960, dy = 500, k = 2; // log2(cellSize)\n    function density(data, counts) {\n        const rx = radius(bandwidth[0], data, x) >> k, // blur x-radius\n        ry = radius(bandwidth[1], data, y) >> k, // blur y-radius\n        ox = rx ? rx + 2 : 0, // x-offset padding for blur\n        oy = ry ? ry + 2 : 0, // y-offset padding for blur\n        n = 2 * ox + (dx >> k), // grid width\n        m = 2 * oy + (dy >> k), // grid height\n        values0 = new Float32Array(n * m), values1 = new Float32Array(n * m);\n        let values = values0;\n        data.forEach((d)=>{\n            const xi = ox + (+x(d) >> k), yi = oy + (+y(d) >> k);\n            if (xi >= 0 && xi < n && yi >= 0 && yi < m) values0[xi + yi * n] += +weight(d);\n        });\n        if (rx > 0 && ry > 0) {\n            blurX(n, m, values0, values1, rx);\n            blurY(n, m, values1, values0, ry);\n            blurX(n, m, values0, values1, rx);\n            blurY(n, m, values1, values0, ry);\n            blurX(n, m, values0, values1, rx);\n            blurY(n, m, values1, values0, ry);\n        } else if (rx > 0) {\n            blurX(n, m, values0, values1, rx);\n            blurX(n, m, values1, values0, rx);\n            blurX(n, m, values0, values1, rx);\n            values = values1;\n        } else if (ry > 0) {\n            blurY(n, m, values0, values1, ry);\n            blurY(n, m, values1, values0, ry);\n            blurY(n, m, values0, values1, ry);\n            values = values1;\n        } // scale density estimates\n        // density in points per square pixel or probability density\n        const s = counts ? Math.pow(2, -2 * k) : 1 / (0, _d3Array.sum)(values);\n        for(let i = 0, sz = n * m; i < sz; ++i)values[i] *= s;\n        return {\n            values: values,\n            scale: 1 << k,\n            width: n,\n            height: m,\n            x1: ox,\n            y1: oy,\n            x2: ox + (dx >> k),\n            y2: oy + (dy >> k)\n        };\n    }\n    density.x = function(_) {\n        return arguments.length ? (x = number(_), density) : x;\n    };\n    density.y = function(_) {\n        return arguments.length ? (y = number(_), density) : y;\n    };\n    density.weight = function(_) {\n        return arguments.length ? (weight = number(_), density) : weight;\n    };\n    density.size = function(_) {\n        if (!arguments.length) return [\n            dx,\n            dy\n        ];\n        var _0 = +_[0], _1 = +_[1];\n        if (!(_0 >= 0 && _1 >= 0)) (0, _vegaUtil.error)(\"invalid size\");\n        return dx = _0, dy = _1, density;\n    };\n    density.cellSize = function(_) {\n        if (!arguments.length) return 1 << k;\n        if (!((_ = +_) >= 1)) (0, _vegaUtil.error)(\"invalid cell size\");\n        k = Math.floor(Math.log(_) / Math.LN2);\n        return density;\n    };\n    density.bandwidth = function(_) {\n        if (!arguments.length) return bandwidth;\n        _ = (0, _vegaUtil.array)(_);\n        if (_.length === 1) _ = [\n            +_[0],\n            +_[0]\n        ];\n        if (_.length !== 2) (0, _vegaUtil.error)(\"invalid bandwidth\");\n        return bandwidth = _, density;\n    };\n    return density;\n}\nfunction blurX(n, m, source, target, r) {\n    const w = (r << 1) + 1;\n    for(let j = 0; j < m; ++j)for(let i = 0, sr = 0; i < n + r; ++i){\n        if (i < n) sr += source[i + j * n];\n        if (i >= r) {\n            if (i >= w) sr -= source[i - w + j * n];\n            target[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);\n        }\n    }\n}\nfunction blurY(n, m, source, target, r) {\n    const w = (r << 1) + 1;\n    for(let i = 0; i < n; ++i)for(let j = 0, sr = 0; j < m + r; ++j){\n        if (j < m) sr += source[i + j * n];\n        if (j >= r) {\n            if (j >= w) sr -= source[i + (j - w) * n];\n            target[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);\n        }\n    }\n}\n/**\n * Perform 2D kernel-density estimation of point data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<number>} params.size - The [width, height] extent (in\n *   units of input pixels) over which to perform density estimation.\n * @param {function(object): number} params.x - The x-coordinate accessor.\n * @param {function(object): number} params.y - The y-coordinate accessor.\n * @param {function(object): number} [params.weight] - The weight accessor.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors\n *   to groupby.\n * @param {number} [params.cellSize] - Contour density calculation cell size.\n *   This parameter determines the level of spatial approximation. For example,\n *   the default value of 4 maps to 2x reductions in both x- and y- dimensions.\n *   A value of 1 will result in an output raster grid whose dimensions exactly\n *   matches the size parameter.\n * @param {Array<number>} [params.bandwidth] - The KDE kernel bandwidths,\n *   in pixels. The input can be a two-element array specifying separate\n *   x and y bandwidths, or a single-element array specifying both. If the\n *   bandwidth is unspecified or less than zero, the bandwidth will be\n *   automatically determined.\n * @param {boolean} [params.counts=false] - A boolean flag indicating if the\n *   output values should be probability estimates (false, default) or\n *   smoothed counts (true).\n * @param {string} [params.as='grid'] - The output field in which to store\n *   the generated raster grid (default 'grid').\n */ function KDE2D(params2) {\n    (0, _vegaDataflow.Transform).call(this, null, params2);\n}\nKDE2D.Definition = {\n    \"type\": \"KDE2D\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"required\": true\n        },\n        {\n            \"name\": \"x\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"weight\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"cellSize\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"bandwidth\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"counts\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"grid\"\n        }\n    ]\n};\nconst PARAMS = [\n    \"x\",\n    \"y\",\n    \"weight\",\n    \"size\",\n    \"cellSize\",\n    \"bandwidth\"\n];\nfunction params(obj, _) {\n    PARAMS.forEach((param)=>_[param] != null ? obj[param](_[param]) : 0);\n    return obj;\n}\n(0, _vegaUtil.inherits)(KDE2D, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !pulse.changed() && !_.modified()) return pulse.StopPropagation;\n        var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), source = pulse.materialize(pulse.SOURCE).source, groups = partition(source, _.groupby), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), kde = params(density2D(), _), as = _.as || \"grid\", values = [];\n        function set1(t, vals) {\n            for(let i = 0; i < names.length; ++i)t[names[i]] = vals[i];\n            return t;\n        } // generate density raster grids\n        values = groups.map((g)=>(0, _vegaDataflow.ingest)(set1({\n                [as]: kde(g, _.counts)\n            }, g.dims)));\n        if (this.value) out.rem = this.value;\n        this.value = out.source = out.add = values;\n        return out;\n    }\n});\nfunction partition(data, groupby) {\n    var groups = [], get = (f)=>f(t), map, i, n, t, k, g; // partition data points into groups\n    if (groupby == null) groups.push(data);\n    else for(map = {}, i = 0, n = data.length; i < n; ++i){\n        t = data[i];\n        k = groupby.map(get);\n        g = map[k];\n        if (!g) {\n            map[k] = g = [];\n            g.dims = k;\n            groups.push(g);\n        }\n        g.push(t);\n    }\n    return groups;\n}\n/**\n * Generate contours based on kernel-density estimation of point data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<number>} params.size - The dimensions [width, height] over which to compute contours.\n *  If the values parameter is provided, this must be the dimensions of the input data.\n *  If density estimation is performed, this is the output view dimensions in pixels.\n * @param {Array<number>} [params.values] - An array of numeric values representing an\n *  width x height grid of values over which to compute contours. If unspecified, this\n *  transform will instead attempt to compute contours for the kernel density estimate\n *  using values drawn from data tuples in the input pulse.\n * @param {function(object): number} [params.x] - The pixel x-coordinate accessor for density estimation.\n * @param {function(object): number} [params.y] - The pixel y-coordinate accessor for density estimation.\n * @param {function(object): number} [params.weight] - The data point weight accessor for density estimation.\n * @param {number} [params.cellSize] - Contour density calculation cell size.\n * @param {number} [params.bandwidth] - Kernel density estimation bandwidth.\n * @param {Array<number>} [params.thresholds] - Contour threshold array. If\n *   this parameter is set, the count and nice parameters will be ignored.\n * @param {number} [params.count] - The desired number of contours.\n * @param {boolean} [params.nice] - Boolean flag indicating if the contour\n *   threshold values should be automatically aligned to \"nice\"\n *   human-friendly values. Setting this flag may cause the number of\n *   thresholds to deviate from the specified count.\n * @param {boolean} [params.smooth] - Boolean flag indicating if the contour\n *   polygons should be smoothed using linear interpolation. The default is\n *   true. The parameter is ignored when using density estimation.\n */ function Contour(params3) {\n    (0, _vegaDataflow.Transform).call(this, null, params3);\n}\nContour.Definition = {\n    \"type\": \"Contour\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"required\": true\n        },\n        {\n            \"name\": \"values\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"x\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"weight\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"cellSize\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"bandwidth\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"count\",\n            \"type\": \"number\"\n        },\n        {\n            \"name\": \"nice\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"thresholds\",\n            \"type\": \"number\",\n            \"array\": true\n        },\n        {\n            \"name\": \"smooth\",\n            \"type\": \"boolean\",\n            \"default\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Contour, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (this.value && !pulse.changed() && !_.modified()) return pulse.StopPropagation;\n        var out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS), contour = contours().smooth(_.smooth !== false), values = _.values, thresh = _.thresholds || quantize(_.count || 10, _.nice, !!values), size = _.size, grid, post;\n        if (!values) {\n            values = pulse.materialize(pulse.SOURCE).source;\n            grid = params(density2D(), _)(values, true);\n            post = transform(grid, grid.scale || 1, grid.scale || 1, 0, 0);\n            size = [\n                grid.width,\n                grid.height\n            ];\n            values = grid.values;\n        }\n        thresh = (0, _vegaUtil.isArray)(thresh) ? thresh : thresh(values);\n        values = contour.size(size)(values, thresh);\n        if (post) values.forEach(post);\n        if (this.value) out.rem = this.value;\n        this.value = out.source = out.add = (values || []).map((0, _vegaDataflow.ingest));\n        return out;\n    }\n});\nconst Feature = \"Feature\";\nconst FeatureCollection = \"FeatureCollection\";\nconst MultiPoint = \"MultiPoint\";\n/**\n * Consolidate an array of [longitude, latitude] points or GeoJSON features\n * into a combined GeoJSON object. This transform is particularly useful for\n * combining geo data for a Projection's fit argument. The resulting GeoJSON\n * data is available as this transform's value. Input pulses are unchanged.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} [params.fields] - A two-element array\n *   of field accessors for the longitude and latitude values.\n * @param {function(object): *} params.geojson - A field accessor for\n *   retrieving GeoJSON feature data.\n */ function GeoJSON(params4) {\n    (0, _vegaDataflow.Transform).call(this, null, params4);\n}\nGeoJSON.Definition = {\n    \"type\": \"GeoJSON\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"geojson\",\n            \"type\": \"field\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(GeoJSON, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var features = this._features, points = this._points, fields = _.fields, lon = fields && fields[0], lat = fields && fields[1], geojson = _.geojson || !fields && (0, _vegaUtil.identity), flag = pulse.ADD, mod;\n        mod = _.modified() || pulse.changed(pulse.REM) || pulse.modified((0, _vegaUtil.accessorFields)(geojson)) || lon && pulse.modified((0, _vegaUtil.accessorFields)(lon)) || lat && pulse.modified((0, _vegaUtil.accessorFields)(lat));\n        if (!this.value || mod) {\n            flag = pulse.SOURCE;\n            this._features = features = [];\n            this._points = points = [];\n        }\n        if (geojson) pulse.visit(flag, (t)=>features.push(geojson(t)));\n        if (lon && lat) {\n            pulse.visit(flag, (t)=>{\n                var x = lon(t), y = lat(t);\n                if (x != null && y != null && (x = +x) === x && (y = +y) === y) points.push([\n                    x,\n                    y\n                ]);\n            });\n            features = features.concat({\n                type: Feature,\n                geometry: {\n                    type: MultiPoint,\n                    coordinates: points\n                }\n            });\n        }\n        this.value = {\n            type: FeatureCollection,\n            features: features\n        };\n    }\n});\n/**\n * Map GeoJSON data to an SVG path string.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {function(object): *} [params.field] - The field with GeoJSON data,\n *   or null if the tuple itself is a GeoJSON feature.\n * @param {string} [params.as='path'] - The output field in which to store\n *   the generated path data (default 'path').\n */ function GeoPath(params5) {\n    (0, _vegaDataflow.Transform).call(this, null, params5);\n}\nGeoPath.Definition = {\n    \"type\": \"GeoPath\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"projection\"\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"pointRadius\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"path\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(GeoPath, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var out = pulse.fork(pulse.ALL), path = this.value, field = _.field || (0, _vegaUtil.identity), as = _.as || \"path\", flag = out.SOURCE;\n        if (!path || _.modified()) {\n            // parameters updated, reset and reflow\n            this.value = path = (0, _vegaProjection.getProjectionPath)(_.projection);\n            out.materialize().reflow();\n        } else flag = field === (0, _vegaUtil.identity) || pulse.modified(field.fields) ? out.ADD_MOD : out.ADD;\n        const prev = initPath(path, _.pointRadius);\n        out.visit(flag, (t)=>t[as] = path(field(t)));\n        path.pointRadius(prev);\n        return out.modifies(as);\n    }\n});\nfunction initPath(path, pointRadius) {\n    const prev = path.pointRadius();\n    path.context(null);\n    if (pointRadius != null) path.pointRadius(pointRadius);\n    return prev;\n}\n/**\n * Geo-code a longitude/latitude point to an x/y coordinate.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {Array<function(object): *>} params.fields - A two-element array of\n *   field accessors for the longitude and latitude values.\n * @param {Array<string>} [params.as] - A two-element array of field names\n *   under which to store the result. Defaults to ['x','y'].\n */ function GeoPoint(params6) {\n    (0, _vegaDataflow.Transform).call(this, null, params6);\n}\nGeoPoint.Definition = {\n    \"type\": \"GeoPoint\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"projection\",\n            \"required\": true\n        },\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                \"x\",\n                \"y\"\n            ]\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(GeoPoint, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var proj = _.projection, lon = _.fields[0], lat = _.fields[1], as = _.as || [\n            \"x\",\n            \"y\"\n        ], x = as[0], y = as[1], mod;\n        function set2(t) {\n            const xy = proj([\n                lon(t),\n                lat(t)\n            ]);\n            if (xy) {\n                t[x] = xy[0];\n                t[y] = xy[1];\n            } else {\n                t[x] = undefined;\n                t[y] = undefined;\n            }\n        }\n        if (_.modified()) // parameters updated, reflow\n        pulse = pulse.materialize().reflow(true).visit(pulse.SOURCE, set2);\n        else {\n            mod = pulse.modified(lon.fields) || pulse.modified(lat.fields);\n            pulse.visit(mod ? pulse.ADD_MOD : pulse.ADD, set2);\n        }\n        return pulse.modifies(as);\n    }\n});\n/**\n * Annotate items with a geopath shape generator.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(number, number): *} params.projection - The cartographic\n *   projection to apply.\n * @param {function(object): *} [params.field] - The field with GeoJSON data,\n *   or null if the tuple itself is a GeoJSON feature.\n * @param {string} [params.as='shape'] - The output field in which to store\n *   the generated path data (default 'shape').\n */ function GeoShape(params7) {\n    (0, _vegaDataflow.Transform).call(this, null, params7);\n}\nGeoShape.Definition = {\n    \"type\": \"GeoShape\",\n    \"metadata\": {\n        \"modifies\": true,\n        \"nomod\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"projection\"\n        },\n        {\n            \"name\": \"field\",\n            \"type\": \"field\",\n            \"default\": \"datum\"\n        },\n        {\n            \"name\": \"pointRadius\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"shape\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(GeoShape, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var out = pulse.fork(pulse.ALL), shape = this.value, as = _.as || \"shape\", flag = out.ADD;\n        if (!shape || _.modified()) {\n            // parameters updated, reset and reflow\n            this.value = shape = shapeGenerator((0, _vegaProjection.getProjectionPath)(_.projection), _.field || (0, _vegaUtil.field)(\"datum\"), _.pointRadius);\n            out.materialize().reflow();\n            flag = out.SOURCE;\n        }\n        out.visit(flag, (t)=>t[as] = shape);\n        return out.modifies(as);\n    }\n});\nfunction shapeGenerator(path, field, pointRadius) {\n    const shape = pointRadius == null ? (_)=>path(field(_)) : (_)=>{\n        var prev = path.pointRadius(), value = path.pointRadius(pointRadius)(field(_));\n        path.pointRadius(prev);\n        return value;\n    };\n    shape.context = (_)=>{\n        path.context(_);\n        return shape;\n    };\n    return shape;\n}\n/**\n * GeoJSON feature generator for creating graticules.\n * @constructor\n */ function Graticule(params8) {\n    (0, _vegaDataflow.Transform).call(this, [], params8);\n    this.generator = (0, _d3Geo.geoGraticule)();\n}\nGraticule.Definition = {\n    \"type\": \"Graticule\",\n    \"metadata\": {\n        \"changes\": true,\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"extent\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"length\": 2,\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        },\n        {\n            \"name\": \"extentMajor\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"length\": 2,\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        },\n        {\n            \"name\": \"extentMinor\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"length\": 2,\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        },\n        {\n            \"name\": \"step\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"stepMajor\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                90,\n                360\n            ]\n        },\n        {\n            \"name\": \"stepMinor\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                10,\n                10\n            ]\n        },\n        {\n            \"name\": \"precision\",\n            \"type\": \"number\",\n            \"default\": 2.5\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Graticule, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var src = this.value, gen = this.generator, t;\n        if (!src.length || _.modified()) {\n            for(const prop in _)if ((0, _vegaUtil.isFunction)(gen[prop])) gen[prop](_[prop]);\n        }\n        t = gen();\n        if (src.length) pulse.mod.push((0, _vegaDataflow.replace)(src[0], t));\n        else pulse.add.push((0, _vegaDataflow.ingest)(t));\n        src[0] = t;\n        return pulse;\n    }\n});\n/**\n * Render a heatmap image for input raster grid data.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} [params.field] - The field with raster grid\n *   data. If unspecified, the tuple itself is interpreted as a raster grid.\n * @param {string} [params.color] - A constant color value or function for\n *   individual pixel color. If a function, it will be invoked with an input\n *   object that includes $x, $y, $value, and $max fields for the grid.\n * @param {number} [params.opacity] - A constant opacity value or function for\n *   individual pixel opacity. If a function, it will be invoked with an input\n *   object that includes $x, $y, $value, and $max fields for the grid.\n * @param {string} [params.resolve] - The method for resolving maximum values\n *   across multiple input grids. If 'independent' (the default), maximum\n *   calculation will be performed separately for each grid. If 'shared',\n *   a single global maximum will be used for all input grids.\n * @param {string} [params.as='image'] - The output field in which to store\n *   the generated bitmap canvas images (default 'image').\n */ function Heatmap(params9) {\n    (0, _vegaDataflow.Transform).call(this, null, params9);\n}\nHeatmap.Definition = {\n    \"type\": \"heatmap\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"color\",\n            \"type\": \"string\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"opacity\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"resolve\",\n            \"type\": \"enum\",\n            \"values\": [\n                \"shared\",\n                \"independent\"\n            ],\n            \"default\": \"independent\"\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"image\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Heatmap, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!pulse.changed() && !_.modified()) return pulse.StopPropagation;\n        var source = pulse.materialize(pulse.SOURCE).source, shared = _.resolve === \"shared\", field = _.field || (0, _vegaUtil.identity), opacity = opacity_(_.opacity, _), color = color_(_.color, _), as = _.as || \"image\", obj = {\n            $x: 0,\n            $y: 0,\n            $value: 0,\n            $max: shared ? (0, _d3Array.max)(source.map((t)=>(0, _d3Array.max)(field(t).values))) : 0\n        };\n        source.forEach((t)=>{\n            const v = field(t); // build proxy data object\n            const o = (0, _vegaUtil.extend)({}, t, obj); // set maximum value if not globally shared\n            if (!shared) o.$max = (0, _d3Array.max)(v.values || []); // generate canvas image\n            // optimize color/opacity if not pixel-dependent\n            t[as] = toCanvas(v, o, color.dep ? color : (0, _vegaUtil.constant)(color(o)), opacity.dep ? opacity : (0, _vegaUtil.constant)(opacity(o)));\n        });\n        return pulse.reflow(true).modifies(as);\n    }\n}); // get image color function\nfunction color_(color, _) {\n    let f;\n    if ((0, _vegaUtil.isFunction)(color)) {\n        f = (obj)=>(0, _d3Color.rgb)(color(obj, _));\n        f.dep = dependency(color);\n    } else // default to mid-grey\n    f = (0, _vegaUtil.constant)((0, _d3Color.rgb)(color || \"#888\"));\n    return f;\n} // get image opacity function\nfunction opacity_(opacity, _) {\n    let f;\n    if ((0, _vegaUtil.isFunction)(opacity)) {\n        f = (obj)=>opacity(obj, _);\n        f.dep = dependency(opacity);\n    } else if (opacity) f = (0, _vegaUtil.constant)(opacity);\n    else {\n        // default to [0, max] opacity gradient\n        f = (obj)=>obj.$value / obj.$max || 0;\n        f.dep = true;\n    }\n    return f;\n} // check if function depends on individual pixel data\nfunction dependency(f) {\n    if (!(0, _vegaUtil.isFunction)(f)) return false;\n    const set3 = (0, _vegaUtil.toSet)((0, _vegaUtil.accessorFields)(f));\n    return set3.$x || set3.$y || set3.$value || set3.$max;\n} // render raster grid to canvas\nfunction toCanvas(grid, obj, color, opacity) {\n    const n = grid.width, m = grid.height, x1 = grid.x1 || 0, y1 = grid.y1 || 0, x2 = grid.x2 || n, y2 = grid.y2 || m, val = grid.values, value = val ? (i)=>val[i] : (0, _vegaUtil.zero), can = (0, _vegaCanvas.canvas)(x2 - x1, y2 - y1), ctx = can.getContext(\"2d\"), img = ctx.getImageData(0, 0, x2 - x1, y2 - y1), pix = img.data;\n    for(let j = y1, k = 0; j < y2; ++j){\n        obj.$y = j - y1;\n        for(let i = x1, r = j * n; i < x2; ++i, k += 4){\n            obj.$x = i - x1;\n            obj.$value = value(i + r);\n            const v = color(obj);\n            pix[k + 0] = v.r;\n            pix[k + 1] = v.g;\n            pix[k + 2] = v.b;\n            pix[k + 3] = ~~(255 * opacity(obj));\n        }\n    }\n    ctx.putImageData(img, 0, 0);\n    return can;\n}\n/**\n * Maintains a cartographic projection.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function Projection(params10) {\n    (0, _vegaDataflow.Transform).call(this, null, params10);\n    this.modified(true); // always treat as modified\n}\n(0, _vegaUtil.inherits)(Projection, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        let proj = this.value;\n        if (!proj || _.modified(\"type\")) {\n            this.value = proj = create(_.type);\n            (0, _vegaProjection.projectionProperties).forEach((prop)=>{\n                if (_[prop] != null) set(proj, prop, _[prop]);\n            });\n        } else (0, _vegaProjection.projectionProperties).forEach((prop)=>{\n            if (_.modified(prop)) set(proj, prop, _[prop]);\n        });\n        if (_.pointRadius != null) proj.path.pointRadius(_.pointRadius);\n        if (_.fit) fit(proj, _);\n        return pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n    }\n});\nfunction fit(proj, _) {\n    const data = collectGeoJSON(_.fit);\n    _.extent ? proj.fitExtent(_.extent, data) : _.size && proj.fitSize(_.size, data);\n}\nfunction create(type) {\n    const constructor = (0, _vegaProjection.projection)((type || \"mercator\").toLowerCase());\n    if (!constructor) (0, _vegaUtil.error)(\"Unrecognized projection type: \" + type);\n    return constructor();\n}\nfunction set(proj, key, value) {\n    if ((0, _vegaUtil.isFunction)(proj[key])) proj[key](value);\n}\nfunction collectGeoJSON(data) {\n    data = (0, _vegaUtil.array)(data);\n    return data.length === 1 ? data[0] : {\n        type: FeatureCollection,\n        features: data.reduce((a, f)=>a.concat(featurize(f)), [])\n    };\n}\nfunction featurize(f) {\n    return f.type === FeatureCollection ? f.features : (0, _vegaUtil.array)(f).filter((d)=>d != null).map((d)=>d.type === Feature ? d : {\n            type: Feature,\n            geometry: d\n        });\n}\n\n},{\"vega-dataflow\":\"3NitK\",\"vega-util\":\"bApja\",\"d3-array\":\"6IwJG\",\"vega-statistics\":\"5ncfv\",\"vega-projection\":\"4wv4C\",\"d3-geo\":\"lY61T\",\"d3-color\":\"7SCp9\",\"vega-canvas\":\"f0yaA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4wv4C\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getProjectionPath\", ()=>getProjectionPath);\nparcelHelpers.export(exports, \"projection\", ()=>projection);\nparcelHelpers.export(exports, \"projectionProperties\", ()=>projectionProperties);\nvar _d3Geo = require(\"d3-geo\");\nvar _d3GeoProjection = require(\"d3-geo-projection\");\nconst defaultPath = (0, _d3Geo.geoPath)();\nconst projectionProperties = [\n    \"clipAngle\",\n    \"clipExtent\",\n    \"scale\",\n    \"translate\",\n    \"center\",\n    \"rotate\",\n    \"parallels\",\n    \"precision\",\n    \"reflectX\",\n    \"reflectY\",\n    \"coefficient\",\n    \"distance\",\n    \"fraction\",\n    \"lobes\",\n    \"parallel\",\n    \"radius\",\n    \"ratio\",\n    \"spacing\",\n    \"tilt\"\n];\n/**\n * Augment projections with their type and a copy method.\n */ function create(type, constructor) {\n    return function projection1() {\n        const p = constructor();\n        p.type = type;\n        p.path = (0, _d3Geo.geoPath)().projection(p);\n        p.copy = p.copy || function() {\n            const c = projection1();\n            projectionProperties.forEach((prop)=>{\n                if (p[prop]) c[prop](p[prop]());\n            });\n            c.path.pointRadius(p.path.pointRadius());\n            return c;\n        };\n        return p;\n    };\n}\nfunction projection(type, proj) {\n    if (!type || typeof type !== \"string\") throw new Error(\"Projection type must be a name string.\");\n    type = type.toLowerCase();\n    if (arguments.length > 1) {\n        projections[type] = create(type, proj);\n        return this;\n    } else return projections[type] || null;\n}\nfunction getProjectionPath(proj) {\n    return proj && proj.path || defaultPath;\n}\nconst projections = {\n    // base d3-geo projection types\n    albers: (0, _d3Geo.geoAlbers),\n    albersusa: (0, _d3Geo.geoAlbersUsa),\n    azimuthalequalarea: (0, _d3Geo.geoAzimuthalEqualArea),\n    azimuthalequidistant: (0, _d3Geo.geoAzimuthalEquidistant),\n    conicconformal: (0, _d3Geo.geoConicConformal),\n    conicequalarea: (0, _d3Geo.geoConicEqualArea),\n    conicequidistant: (0, _d3Geo.geoConicEquidistant),\n    equalEarth: (0, _d3Geo.geoEqualEarth),\n    equirectangular: (0, _d3Geo.geoEquirectangular),\n    gnomonic: (0, _d3Geo.geoGnomonic),\n    identity: (0, _d3Geo.geoIdentity),\n    mercator: (0, _d3Geo.geoMercator),\n    mollweide: (0, _d3GeoProjection.geoMollweide),\n    naturalEarth1: (0, _d3Geo.geoNaturalEarth1),\n    orthographic: (0, _d3Geo.geoOrthographic),\n    stereographic: (0, _d3Geo.geoStereographic),\n    transversemercator: (0, _d3Geo.geoTransverseMercator)\n};\nfor(const key in projections)projection(key, projections[key]);\n\n},{\"d3-geo\":\"lY61T\",\"d3-geo-projection\":\"ixW8K\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lY61T\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"geoArea\", ()=>(0, _areaJsDefault.default));\nparcelHelpers.export(exports, \"geoBounds\", ()=>(0, _boundsJsDefault.default));\nparcelHelpers.export(exports, \"geoCentroid\", ()=>(0, _centroidJsDefault.default));\nparcelHelpers.export(exports, \"geoCircle\", ()=>(0, _circleJsDefault.default));\nparcelHelpers.export(exports, \"geoClipAntimeridian\", ()=>(0, _antimeridianJsDefault.default));\nparcelHelpers.export(exports, \"geoClipCircle\", ()=>(0, _circleJsDefault1.default));\nparcelHelpers.export(exports, \"geoClipExtent\", ()=>(0, _extentJsDefault.default)) // DEPRECATED! Use d3.geoIdentity().clipExtent(…).\n;\nparcelHelpers.export(exports, \"geoClipRectangle\", ()=>(0, _rectangleJsDefault.default));\nparcelHelpers.export(exports, \"geoContains\", ()=>(0, _containsJsDefault.default));\nparcelHelpers.export(exports, \"geoDistance\", ()=>(0, _distanceJsDefault.default));\nparcelHelpers.export(exports, \"geoGraticule\", ()=>(0, _graticuleJsDefault.default));\nparcelHelpers.export(exports, \"geoGraticule10\", ()=>(0, _graticuleJs.graticule10));\nparcelHelpers.export(exports, \"geoInterpolate\", ()=>(0, _interpolateJsDefault.default));\nparcelHelpers.export(exports, \"geoLength\", ()=>(0, _lengthJsDefault.default));\nparcelHelpers.export(exports, \"geoPath\", ()=>(0, _indexJsDefault.default));\nparcelHelpers.export(exports, \"geoAlbers\", ()=>(0, _albersJsDefault.default));\nparcelHelpers.export(exports, \"geoAlbersUsa\", ()=>(0, _albersUsaJsDefault.default));\nparcelHelpers.export(exports, \"geoAzimuthalEqualArea\", ()=>(0, _azimuthalEqualAreaJsDefault.default));\nparcelHelpers.export(exports, \"geoAzimuthalEqualAreaRaw\", ()=>(0, _azimuthalEqualAreaJs.azimuthalEqualAreaRaw));\nparcelHelpers.export(exports, \"geoAzimuthalEquidistant\", ()=>(0, _azimuthalEquidistantJsDefault.default));\nparcelHelpers.export(exports, \"geoAzimuthalEquidistantRaw\", ()=>(0, _azimuthalEquidistantJs.azimuthalEquidistantRaw));\nparcelHelpers.export(exports, \"geoConicConformal\", ()=>(0, _conicConformalJsDefault.default));\nparcelHelpers.export(exports, \"geoConicConformalRaw\", ()=>(0, _conicConformalJs.conicConformalRaw));\nparcelHelpers.export(exports, \"geoConicEqualArea\", ()=>(0, _conicEqualAreaJsDefault.default));\nparcelHelpers.export(exports, \"geoConicEqualAreaRaw\", ()=>(0, _conicEqualAreaJs.conicEqualAreaRaw));\nparcelHelpers.export(exports, \"geoConicEquidistant\", ()=>(0, _conicEquidistantJsDefault.default));\nparcelHelpers.export(exports, \"geoConicEquidistantRaw\", ()=>(0, _conicEquidistantJs.conicEquidistantRaw));\nparcelHelpers.export(exports, \"geoEqualEarth\", ()=>(0, _equalEarthJsDefault.default));\nparcelHelpers.export(exports, \"geoEqualEarthRaw\", ()=>(0, _equalEarthJs.equalEarthRaw));\nparcelHelpers.export(exports, \"geoEquirectangular\", ()=>(0, _equirectangularJsDefault.default));\nparcelHelpers.export(exports, \"geoEquirectangularRaw\", ()=>(0, _equirectangularJs.equirectangularRaw));\nparcelHelpers.export(exports, \"geoGnomonic\", ()=>(0, _gnomonicJsDefault.default));\nparcelHelpers.export(exports, \"geoGnomonicRaw\", ()=>(0, _gnomonicJs.gnomonicRaw));\nparcelHelpers.export(exports, \"geoIdentity\", ()=>(0, _identityJsDefault.default));\nparcelHelpers.export(exports, \"geoProjection\", ()=>(0, _indexJsDefault1.default));\nparcelHelpers.export(exports, \"geoProjectionMutator\", ()=>(0, _indexJs1.projectionMutator));\nparcelHelpers.export(exports, \"geoMercator\", ()=>(0, _mercatorJsDefault.default));\nparcelHelpers.export(exports, \"geoMercatorRaw\", ()=>(0, _mercatorJs.mercatorRaw));\nparcelHelpers.export(exports, \"geoNaturalEarth1\", ()=>(0, _naturalEarth1JsDefault.default));\nparcelHelpers.export(exports, \"geoNaturalEarth1Raw\", ()=>(0, _naturalEarth1Js.naturalEarth1Raw));\nparcelHelpers.export(exports, \"geoOrthographic\", ()=>(0, _orthographicJsDefault.default));\nparcelHelpers.export(exports, \"geoOrthographicRaw\", ()=>(0, _orthographicJs.orthographicRaw));\nparcelHelpers.export(exports, \"geoStereographic\", ()=>(0, _stereographicJsDefault.default));\nparcelHelpers.export(exports, \"geoStereographicRaw\", ()=>(0, _stereographicJs.stereographicRaw));\nparcelHelpers.export(exports, \"geoTransverseMercator\", ()=>(0, _transverseMercatorJsDefault.default));\nparcelHelpers.export(exports, \"geoTransverseMercatorRaw\", ()=>(0, _transverseMercatorJs.transverseMercatorRaw));\nparcelHelpers.export(exports, \"geoRotation\", ()=>(0, _rotationJsDefault.default));\nparcelHelpers.export(exports, \"geoStream\", ()=>(0, _streamJsDefault.default));\nparcelHelpers.export(exports, \"geoTransform\", ()=>(0, _transformJsDefault.default));\nvar _areaJs = require(\"./area.js\");\nvar _areaJsDefault = parcelHelpers.interopDefault(_areaJs);\nvar _boundsJs = require(\"./bounds.js\");\nvar _boundsJsDefault = parcelHelpers.interopDefault(_boundsJs);\nvar _centroidJs = require(\"./centroid.js\");\nvar _centroidJsDefault = parcelHelpers.interopDefault(_centroidJs);\nvar _circleJs = require(\"./circle.js\");\nvar _circleJsDefault = parcelHelpers.interopDefault(_circleJs);\nvar _antimeridianJs = require(\"./clip/antimeridian.js\");\nvar _antimeridianJsDefault = parcelHelpers.interopDefault(_antimeridianJs);\nvar _circleJs1 = require(\"./clip/circle.js\");\nvar _circleJsDefault1 = parcelHelpers.interopDefault(_circleJs1);\nvar _extentJs = require(\"./clip/extent.js\");\nvar _extentJsDefault = parcelHelpers.interopDefault(_extentJs);\nvar _rectangleJs = require(\"./clip/rectangle.js\");\nvar _rectangleJsDefault = parcelHelpers.interopDefault(_rectangleJs);\nvar _containsJs = require(\"./contains.js\");\nvar _containsJsDefault = parcelHelpers.interopDefault(_containsJs);\nvar _distanceJs = require(\"./distance.js\");\nvar _distanceJsDefault = parcelHelpers.interopDefault(_distanceJs);\nvar _graticuleJs = require(\"./graticule.js\");\nvar _graticuleJsDefault = parcelHelpers.interopDefault(_graticuleJs);\nvar _interpolateJs = require(\"./interpolate.js\");\nvar _interpolateJsDefault = parcelHelpers.interopDefault(_interpolateJs);\nvar _lengthJs = require(\"./length.js\");\nvar _lengthJsDefault = parcelHelpers.interopDefault(_lengthJs);\nvar _indexJs = require(\"./path/index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _albersJs = require(\"./projection/albers.js\");\nvar _albersJsDefault = parcelHelpers.interopDefault(_albersJs);\nvar _albersUsaJs = require(\"./projection/albersUsa.js\");\nvar _albersUsaJsDefault = parcelHelpers.interopDefault(_albersUsaJs);\nvar _azimuthalEqualAreaJs = require(\"./projection/azimuthalEqualArea.js\");\nvar _azimuthalEqualAreaJsDefault = parcelHelpers.interopDefault(_azimuthalEqualAreaJs);\nvar _azimuthalEquidistantJs = require(\"./projection/azimuthalEquidistant.js\");\nvar _azimuthalEquidistantJsDefault = parcelHelpers.interopDefault(_azimuthalEquidistantJs);\nvar _conicConformalJs = require(\"./projection/conicConformal.js\");\nvar _conicConformalJsDefault = parcelHelpers.interopDefault(_conicConformalJs);\nvar _conicEqualAreaJs = require(\"./projection/conicEqualArea.js\");\nvar _conicEqualAreaJsDefault = parcelHelpers.interopDefault(_conicEqualAreaJs);\nvar _conicEquidistantJs = require(\"./projection/conicEquidistant.js\");\nvar _conicEquidistantJsDefault = parcelHelpers.interopDefault(_conicEquidistantJs);\nvar _equalEarthJs = require(\"./projection/equalEarth.js\");\nvar _equalEarthJsDefault = parcelHelpers.interopDefault(_equalEarthJs);\nvar _equirectangularJs = require(\"./projection/equirectangular.js\");\nvar _equirectangularJsDefault = parcelHelpers.interopDefault(_equirectangularJs);\nvar _gnomonicJs = require(\"./projection/gnomonic.js\");\nvar _gnomonicJsDefault = parcelHelpers.interopDefault(_gnomonicJs);\nvar _identityJs = require(\"./projection/identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _indexJs1 = require(\"./projection/index.js\");\nvar _indexJsDefault1 = parcelHelpers.interopDefault(_indexJs1);\nvar _mercatorJs = require(\"./projection/mercator.js\");\nvar _mercatorJsDefault = parcelHelpers.interopDefault(_mercatorJs);\nvar _naturalEarth1Js = require(\"./projection/naturalEarth1.js\");\nvar _naturalEarth1JsDefault = parcelHelpers.interopDefault(_naturalEarth1Js);\nvar _orthographicJs = require(\"./projection/orthographic.js\");\nvar _orthographicJsDefault = parcelHelpers.interopDefault(_orthographicJs);\nvar _stereographicJs = require(\"./projection/stereographic.js\");\nvar _stereographicJsDefault = parcelHelpers.interopDefault(_stereographicJs);\nvar _transverseMercatorJs = require(\"./projection/transverseMercator.js\");\nvar _transverseMercatorJsDefault = parcelHelpers.interopDefault(_transverseMercatorJs);\nvar _rotationJs = require(\"./rotation.js\");\nvar _rotationJsDefault = parcelHelpers.interopDefault(_rotationJs);\nvar _streamJs = require(\"./stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar _transformJs = require(\"./transform.js\");\nvar _transformJsDefault = parcelHelpers.interopDefault(_transformJs);\n\n},{\"./area.js\":\"iajNA\",\"./bounds.js\":\"9Dbky\",\"./centroid.js\":\"kO6wx\",\"./circle.js\":\"lPX3u\",\"./clip/antimeridian.js\":\"kvVxQ\",\"./clip/circle.js\":\"2PJ3I\",\"./clip/extent.js\":false,\"./clip/rectangle.js\":\"9kmAt\",\"./contains.js\":false,\"./distance.js\":false,\"./graticule.js\":\"arQrO\",\"./interpolate.js\":false,\"./length.js\":false,\"./path/index.js\":\"gBtNJ\",\"./projection/albers.js\":\"dSks5\",\"./projection/albersUsa.js\":\"4lZJF\",\"./projection/azimuthalEqualArea.js\":\"jbLs0\",\"./projection/azimuthalEquidistant.js\":\"eAR2Q\",\"./projection/conicConformal.js\":\"dhBsj\",\"./projection/conicEqualArea.js\":\"17j9x\",\"./projection/conicEquidistant.js\":\"6B358\",\"./projection/equalEarth.js\":\"bMVhy\",\"./projection/equirectangular.js\":\"4kEjS\",\"./projection/gnomonic.js\":\"6bdgO\",\"./projection/identity.js\":\"huYSV\",\"./projection/index.js\":\"cd9OX\",\"./projection/mercator.js\":\"iIGjZ\",\"./projection/naturalEarth1.js\":\"4AzsZ\",\"./projection/orthographic.js\":\"kjinQ\",\"./projection/stereographic.js\":\"6ko7r\",\"./projection/transverseMercator.js\":\"i6NVd\",\"./rotation.js\":\"8C7qH\",\"./stream.js\":\"9nFXd\",\"./transform.js\":\"9MXXE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iajNA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"areaRingSum\", ()=>areaRingSum);\nparcelHelpers.export(exports, \"areaStream\", ()=>areaStream);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"./math.js\");\nvar _noopJs = require(\"./noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _streamJs = require(\"./stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar areaRingSum = new (0, _d3Array.Adder)();\n// hello?\nvar areaSum = new (0, _d3Array.Adder)(), lambda00, phi00, lambda0, cosPhi0, sinPhi0;\nvar areaStream = {\n    point: (0, _noopJsDefault.default),\n    lineStart: (0, _noopJsDefault.default),\n    lineEnd: (0, _noopJsDefault.default),\n    polygonStart: function() {\n        areaRingSum = new (0, _d3Array.Adder)();\n        areaStream.lineStart = areaRingStart;\n        areaStream.lineEnd = areaRingEnd;\n    },\n    polygonEnd: function() {\n        var areaRing = +areaRingSum;\n        areaSum.add(areaRing < 0 ? (0, _mathJs.tau) + areaRing : areaRing);\n        this.lineStart = this.lineEnd = this.point = (0, _noopJsDefault.default);\n    },\n    sphere: function() {\n        areaSum.add((0, _mathJs.tau));\n    }\n};\nfunction areaRingStart() {\n    areaStream.point = areaPointFirst;\n}\nfunction areaRingEnd() {\n    areaPoint(lambda00, phi00);\n}\nfunction areaPointFirst(lambda, phi) {\n    areaStream.point = areaPoint;\n    lambda00 = lambda, phi00 = phi;\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    lambda0 = lambda, cosPhi0 = (0, _mathJs.cos)(phi = phi / 2 + (0, _mathJs.quarterPi)), sinPhi0 = (0, _mathJs.sin)(phi);\n}\nfunction areaPoint(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    phi = phi / 2 + (0, _mathJs.quarterPi); // half the angular distance from south pole\n    // Spherical excess E for a spherical triangle with vertices: south pole,\n    // previous point, current point.  Uses a formula derived from Cagnoli’s\n    // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).\n    var dLambda = lambda - lambda0, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = (0, _mathJs.cos)(phi), sinPhi = (0, _mathJs.sin)(phi), k = sinPhi0 * sinPhi, u = cosPhi0 * cosPhi + k * (0, _mathJs.cos)(adLambda), v = k * sdLambda * (0, _mathJs.sin)(adLambda);\n    areaRingSum.add((0, _mathJs.atan2)(v, u));\n    // Advance the previous points.\n    lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n}\nexports.default = function(object) {\n    areaSum = new (0, _d3Array.Adder)();\n    (0, _streamJsDefault.default)(object, areaStream);\n    return areaSum * 2;\n};\n\n},{\"d3-array\":\"6IwJG\",\"./math.js\":\"74X19\",\"./noop.js\":\"aXmaS\",\"./stream.js\":\"9nFXd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"74X19\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"epsilon\", ()=>epsilon);\nparcelHelpers.export(exports, \"epsilon2\", ()=>epsilon2);\nparcelHelpers.export(exports, \"pi\", ()=>pi);\nparcelHelpers.export(exports, \"halfPi\", ()=>halfPi);\nparcelHelpers.export(exports, \"quarterPi\", ()=>quarterPi);\nparcelHelpers.export(exports, \"tau\", ()=>tau);\nparcelHelpers.export(exports, \"degrees\", ()=>degrees);\nparcelHelpers.export(exports, \"radians\", ()=>radians);\nparcelHelpers.export(exports, \"abs\", ()=>abs);\nparcelHelpers.export(exports, \"atan\", ()=>atan);\nparcelHelpers.export(exports, \"atan2\", ()=>atan2);\nparcelHelpers.export(exports, \"cos\", ()=>cos);\nparcelHelpers.export(exports, \"ceil\", ()=>ceil);\nparcelHelpers.export(exports, \"exp\", ()=>exp);\nparcelHelpers.export(exports, \"floor\", ()=>floor);\nparcelHelpers.export(exports, \"hypot\", ()=>hypot);\nparcelHelpers.export(exports, \"log\", ()=>log);\nparcelHelpers.export(exports, \"pow\", ()=>pow);\nparcelHelpers.export(exports, \"sin\", ()=>sin);\nparcelHelpers.export(exports, \"sign\", ()=>sign);\nparcelHelpers.export(exports, \"sqrt\", ()=>sqrt);\nparcelHelpers.export(exports, \"tan\", ()=>tan);\nparcelHelpers.export(exports, \"acos\", ()=>acos);\nparcelHelpers.export(exports, \"asin\", ()=>asin);\nparcelHelpers.export(exports, \"haversin\", ()=>haversin);\nvar epsilon = 1e-6;\nvar epsilon2 = 1e-12;\nvar pi = Math.PI;\nvar halfPi = pi / 2;\nvar quarterPi = pi / 4;\nvar tau = pi * 2;\nvar degrees = 180 / pi;\nvar radians = pi / 180;\nvar abs = Math.abs;\nvar atan = Math.atan;\nvar atan2 = Math.atan2;\nvar cos = Math.cos;\nvar ceil = Math.ceil;\nvar exp = Math.exp;\nvar floor = Math.floor;\nvar hypot = Math.hypot;\nvar log = Math.log;\nvar pow = Math.pow;\nvar sin = Math.sin;\nvar sign = Math.sign || function(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n};\nvar sqrt = Math.sqrt;\nvar tan = Math.tan;\nfunction acos(x) {\n    return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\nfunction asin(x) {\n    return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\nfunction haversin(x) {\n    return (x = sin(x / 2)) * x;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aXmaS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction noop() {}\nexports.default = noop;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9nFXd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction streamGeometry(geometry, stream) {\n    if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) streamGeometryType[geometry.type](geometry, stream);\n}\nvar streamObjectType = {\n    Feature: function(object, stream) {\n        streamGeometry(object.geometry, stream);\n    },\n    FeatureCollection: function(object, stream) {\n        var features = object.features, i = -1, n = features.length;\n        while(++i < n)streamGeometry(features[i].geometry, stream);\n    }\n};\nvar streamGeometryType = {\n    Sphere: function(object, stream) {\n        stream.sphere();\n    },\n    Point: function(object, stream) {\n        object = object.coordinates;\n        stream.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, stream) {\n        var coordinates = object.coordinates, i = -1, n = coordinates.length;\n        while(++i < n)object = coordinates[i], stream.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, stream) {\n        streamLine(object.coordinates, stream, 0);\n    },\n    MultiLineString: function(object, stream) {\n        var coordinates = object.coordinates, i = -1, n = coordinates.length;\n        while(++i < n)streamLine(coordinates[i], stream, 0);\n    },\n    Polygon: function(object, stream) {\n        streamPolygon(object.coordinates, stream);\n    },\n    MultiPolygon: function(object, stream) {\n        var coordinates = object.coordinates, i = -1, n = coordinates.length;\n        while(++i < n)streamPolygon(coordinates[i], stream);\n    },\n    GeometryCollection: function(object, stream) {\n        var geometries = object.geometries, i = -1, n = geometries.length;\n        while(++i < n)streamGeometry(geometries[i], stream);\n    }\n};\nfunction streamLine(coordinates, stream, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    stream.lineStart();\n    while(++i < n)coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);\n    stream.lineEnd();\n}\nfunction streamPolygon(coordinates, stream) {\n    var i = -1, n = coordinates.length;\n    stream.polygonStart();\n    while(++i < n)streamLine(coordinates[i], stream, 1);\n    stream.polygonEnd();\n}\nexports.default = function(object, stream) {\n    if (object && streamObjectType.hasOwnProperty(object.type)) streamObjectType[object.type](object, stream);\n    else streamGeometry(object, stream);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Dbky\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _areaJs = require(\"./area.js\");\nvar _cartesianJs = require(\"./cartesian.js\");\nvar _mathJs = require(\"./math.js\");\nvar _streamJs = require(\"./stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar lambda0, phi0, lambda1, phi1, lambda2, lambda00, phi00, p0, deltaSum, ranges, range;\nvar boundsStream = {\n    point: boundsPoint,\n    lineStart: boundsLineStart,\n    lineEnd: boundsLineEnd,\n    polygonStart: function() {\n        boundsStream.point = boundsRingPoint;\n        boundsStream.lineStart = boundsRingStart;\n        boundsStream.lineEnd = boundsRingEnd;\n        deltaSum = new (0, _d3Array.Adder)();\n        (0, _areaJs.areaStream).polygonStart();\n    },\n    polygonEnd: function() {\n        (0, _areaJs.areaStream).polygonEnd();\n        boundsStream.point = boundsPoint;\n        boundsStream.lineStart = boundsLineStart;\n        boundsStream.lineEnd = boundsLineEnd;\n        if ((0, _areaJs.areaRingSum) < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n        else if (deltaSum > (0, _mathJs.epsilon)) phi1 = 90;\n        else if (deltaSum < -(0, _mathJs.epsilon)) phi0 = -90;\n        range[0] = lambda0, range[1] = lambda1;\n    },\n    sphere: function() {\n        lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n    }\n};\nfunction boundsPoint(lambda, phi) {\n    ranges.push(range = [\n        lambda0 = lambda,\n        lambda1 = lambda\n    ]);\n    if (phi < phi0) phi0 = phi;\n    if (phi > phi1) phi1 = phi;\n}\nfunction linePoint(lambda, phi) {\n    var p = (0, _cartesianJs.cartesian)([\n        lambda * (0, _mathJs.radians),\n        phi * (0, _mathJs.radians)\n    ]);\n    if (p0) {\n        var normal = (0, _cartesianJs.cartesianCross)(p0, p), equatorial = [\n            normal[1],\n            -normal[0],\n            0\n        ], inflection = (0, _cartesianJs.cartesianCross)(equatorial, normal);\n        (0, _cartesianJs.cartesianNormalizeInPlace)(inflection);\n        inflection = (0, _cartesianJs.spherical)(inflection);\n        var delta = lambda - lambda2, sign = delta > 0 ? 1 : -1, lambdai = inflection[0] * (0, _mathJs.degrees) * sign, phii, antimeridian = (0, _mathJs.abs)(delta) > 180;\n        if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n            phii = inflection[1] * (0, _mathJs.degrees);\n            if (phii > phi1) phi1 = phii;\n        } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {\n            phii = -inflection[1] * (0, _mathJs.degrees);\n            if (phii < phi0) phi0 = phii;\n        } else {\n            if (phi < phi0) phi0 = phi;\n            if (phi > phi1) phi1 = phi;\n        }\n        if (antimeridian) {\n            if (lambda < lambda2) {\n                if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n            } else if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        } else if (lambda1 >= lambda0) {\n            if (lambda < lambda0) lambda0 = lambda;\n            if (lambda > lambda1) lambda1 = lambda;\n        } else {\n            if (lambda > lambda2) {\n                if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n            } else if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        }\n    } else ranges.push(range = [\n        lambda0 = lambda,\n        lambda1 = lambda\n    ]);\n    if (phi < phi0) phi0 = phi;\n    if (phi > phi1) phi1 = phi;\n    p0 = p, lambda2 = lambda;\n}\nfunction boundsLineStart() {\n    boundsStream.point = linePoint;\n}\nfunction boundsLineEnd() {\n    range[0] = lambda0, range[1] = lambda1;\n    boundsStream.point = boundsPoint;\n    p0 = null;\n}\nfunction boundsRingPoint(lambda, phi) {\n    if (p0) {\n        var delta = lambda - lambda2;\n        deltaSum.add((0, _mathJs.abs)(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n    } else lambda00 = lambda, phi00 = phi;\n    (0, _areaJs.areaStream).point(lambda, phi);\n    linePoint(lambda, phi);\n}\nfunction boundsRingStart() {\n    (0, _areaJs.areaStream).lineStart();\n}\nfunction boundsRingEnd() {\n    boundsRingPoint(lambda00, phi00);\n    (0, _areaJs.areaStream).lineEnd();\n    if ((0, _mathJs.abs)(deltaSum) > (0, _mathJs.epsilon)) lambda0 = -(lambda1 = 180);\n    range[0] = lambda0, range[1] = lambda1;\n    p0 = null;\n}\n// Finds the left-right distance between two longitudes.\n// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want\n// the distance between ±180° to be 360°.\nfunction angle(lambda01, lambda11) {\n    return (lambda11 -= lambda01) < 0 ? lambda11 + 360 : lambda11;\n}\nfunction rangeCompare(a, b) {\n    return a[0] - b[0];\n}\nfunction rangeContains(range1, x) {\n    return range1[0] <= range1[1] ? range1[0] <= x && x <= range1[1] : x < range1[0] || range1[1] < x;\n}\nexports.default = function(feature) {\n    var i, n, a, b, merged, deltaMax, delta;\n    phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n    ranges = [];\n    (0, _streamJsDefault.default)(feature, boundsStream);\n    // First, sort ranges by their minimum longitudes.\n    if (n = ranges.length) {\n        ranges.sort(rangeCompare);\n        // Then, merge any ranges that overlap.\n        for(i = 1, a = ranges[0], merged = [\n            a\n        ]; i < n; ++i){\n            b = ranges[i];\n            if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {\n                if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n                if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n            } else merged.push(a = b);\n        }\n        // Finally, find the largest gap between the merged ranges.\n        // The final bounding box will be the inverse of this gap.\n        for(deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i){\n            b = merged[i];\n            if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];\n        }\n    }\n    ranges = range = null;\n    return lambda0 === Infinity || phi0 === Infinity ? [\n        [\n            NaN,\n            NaN\n        ],\n        [\n            NaN,\n            NaN\n        ]\n    ] : [\n        [\n            lambda0,\n            phi0\n        ],\n        [\n            lambda1,\n            phi1\n        ]\n    ];\n};\n\n},{\"d3-array\":\"6IwJG\",\"./area.js\":\"iajNA\",\"./cartesian.js\":\"i2DwM\",\"./math.js\":\"74X19\",\"./stream.js\":\"9nFXd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i2DwM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"spherical\", ()=>spherical);\nparcelHelpers.export(exports, \"cartesian\", ()=>cartesian);\nparcelHelpers.export(exports, \"cartesianDot\", ()=>cartesianDot);\nparcelHelpers.export(exports, \"cartesianCross\", ()=>cartesianCross);\n// TODO return a\nparcelHelpers.export(exports, \"cartesianAddInPlace\", ()=>cartesianAddInPlace);\nparcelHelpers.export(exports, \"cartesianScale\", ()=>cartesianScale);\n// TODO return d\nparcelHelpers.export(exports, \"cartesianNormalizeInPlace\", ()=>cartesianNormalizeInPlace);\nvar _mathJs = require(\"./math.js\");\nfunction spherical(cartesian1) {\n    return [\n        (0, _mathJs.atan2)(cartesian1[1], cartesian1[0]),\n        (0, _mathJs.asin)(cartesian1[2])\n    ];\n}\nfunction cartesian(spherical1) {\n    var lambda = spherical1[0], phi = spherical1[1], cosPhi = (0, _mathJs.cos)(phi);\n    return [\n        cosPhi * (0, _mathJs.cos)(lambda),\n        cosPhi * (0, _mathJs.sin)(lambda),\n        (0, _mathJs.sin)(phi)\n    ];\n}\nfunction cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\nfunction cartesianCross(a, b) {\n    return [\n        a[1] * b[2] - a[2] * b[1],\n        a[2] * b[0] - a[0] * b[2],\n        a[0] * b[1] - a[1] * b[0]\n    ];\n}\nfunction cartesianAddInPlace(a, b) {\n    a[0] += b[0], a[1] += b[1], a[2] += b[2];\n}\nfunction cartesianScale(vector, k) {\n    return [\n        vector[0] * k,\n        vector[1] * k,\n        vector[2] * k\n    ];\n}\nfunction cartesianNormalizeInPlace(d) {\n    var l = (0, _mathJs.sqrt)(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l, d[1] /= l, d[2] /= l;\n}\n\n},{\"./math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kO6wx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"./math.js\");\nvar _noopJs = require(\"./noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar _streamJs = require(\"./stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar W0, W1, X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, lambda00, phi00, x0, y0, z0; // previous point\nvar centroidStream = {\n    sphere: (0, _noopJsDefault.default),\n    point: centroidPoint,\n    lineStart: centroidLineStart,\n    lineEnd: centroidLineEnd,\n    polygonStart: function() {\n        centroidStream.lineStart = centroidRingStart;\n        centroidStream.lineEnd = centroidRingEnd;\n    },\n    polygonEnd: function() {\n        centroidStream.lineStart = centroidLineStart;\n        centroidStream.lineEnd = centroidLineEnd;\n    }\n};\n// Arithmetic mean of Cartesian vectors.\nfunction centroidPoint(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    var cosPhi = (0, _mathJs.cos)(phi);\n    centroidPointCartesian(cosPhi * (0, _mathJs.cos)(lambda), cosPhi * (0, _mathJs.sin)(lambda), (0, _mathJs.sin)(phi));\n}\nfunction centroidPointCartesian(x, y, z) {\n    ++W0;\n    X0 += (x - X0) / W0;\n    Y0 += (y - Y0) / W0;\n    Z0 += (z - Z0) / W0;\n}\nfunction centroidLineStart() {\n    centroidStream.point = centroidLinePointFirst;\n}\nfunction centroidLinePointFirst(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    var cosPhi = (0, _mathJs.cos)(phi);\n    x0 = cosPhi * (0, _mathJs.cos)(lambda);\n    y0 = cosPhi * (0, _mathJs.sin)(lambda);\n    z0 = (0, _mathJs.sin)(phi);\n    centroidStream.point = centroidLinePoint;\n    centroidPointCartesian(x0, y0, z0);\n}\nfunction centroidLinePoint(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    var cosPhi = (0, _mathJs.cos)(phi), x = cosPhi * (0, _mathJs.cos)(lambda), y = cosPhi * (0, _mathJs.sin)(lambda), z = (0, _mathJs.sin)(phi), w = (0, _mathJs.atan2)((0, _mathJs.sqrt)((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n    W1 += w;\n    X1 += w * (x0 + (x0 = x));\n    Y1 += w * (y0 + (y0 = y));\n    Z1 += w * (z0 + (z0 = z));\n    centroidPointCartesian(x0, y0, z0);\n}\nfunction centroidLineEnd() {\n    centroidStream.point = centroidPoint;\n}\n// See J. E. Brock, The Inertia Tensor for a Spherical Triangle,\n// J. Applied Mechanics 42, 239 (1975).\nfunction centroidRingStart() {\n    centroidStream.point = centroidRingPointFirst;\n}\nfunction centroidRingEnd() {\n    centroidRingPoint(lambda00, phi00);\n    centroidStream.point = centroidPoint;\n}\nfunction centroidRingPointFirst(lambda, phi) {\n    lambda00 = lambda, phi00 = phi;\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    centroidStream.point = centroidRingPoint;\n    var cosPhi = (0, _mathJs.cos)(phi);\n    x0 = cosPhi * (0, _mathJs.cos)(lambda);\n    y0 = cosPhi * (0, _mathJs.sin)(lambda);\n    z0 = (0, _mathJs.sin)(phi);\n    centroidPointCartesian(x0, y0, z0);\n}\nfunction centroidRingPoint(lambda, phi) {\n    lambda *= (0, _mathJs.radians), phi *= (0, _mathJs.radians);\n    var cosPhi = (0, _mathJs.cos)(phi), x = cosPhi * (0, _mathJs.cos)(lambda), y = cosPhi * (0, _mathJs.sin)(lambda), z = (0, _mathJs.sin)(phi), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = (0, _mathJs.hypot)(cx, cy, cz), w = (0, _mathJs.asin)(m), v = m && -w / m; // area weight multiplier\n    X2.add(v * cx);\n    Y2.add(v * cy);\n    Z2.add(v * cz);\n    W1 += w;\n    X1 += w * (x0 + (x0 = x));\n    Y1 += w * (y0 + (y0 = y));\n    Z1 += w * (z0 + (z0 = z));\n    centroidPointCartesian(x0, y0, z0);\n}\nexports.default = function(object) {\n    W0 = W1 = X0 = Y0 = Z0 = X1 = Y1 = Z1 = 0;\n    X2 = new (0, _d3Array.Adder)();\n    Y2 = new (0, _d3Array.Adder)();\n    Z2 = new (0, _d3Array.Adder)();\n    (0, _streamJsDefault.default)(object, centroidStream);\n    var x = +X2, y = +Y2, z = +Z2, m = (0, _mathJs.hypot)(x, y, z);\n    // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.\n    if (m < (0, _mathJs.epsilon2)) {\n        x = X1, y = Y1, z = Z1;\n        // If the feature has zero length, fall back to arithmetic mean of point vectors.\n        if (W1 < (0, _mathJs.epsilon)) x = X0, y = Y0, z = Z0;\n        m = (0, _mathJs.hypot)(x, y, z);\n        // If the feature still has an undefined ccentroid, then return.\n        if (m < (0, _mathJs.epsilon2)) return [\n            NaN,\n            NaN\n        ];\n    }\n    return [\n        (0, _mathJs.atan2)(y, x) * (0, _mathJs.degrees),\n        (0, _mathJs.asin)(z / m) * (0, _mathJs.degrees)\n    ];\n};\n\n},{\"d3-array\":\"6IwJG\",\"./math.js\":\"74X19\",\"./noop.js\":\"aXmaS\",\"./stream.js\":\"9nFXd\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lPX3u\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Generates a circle centered at [0°, 0°], with a given radius and precision.\nparcelHelpers.export(exports, \"circleStream\", ()=>circleStream);\nvar _cartesianJs = require(\"./cartesian.js\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _mathJs = require(\"./math.js\");\nvar _rotationJs = require(\"./rotation.js\");\nfunction circleStream(stream, radius, delta, direction, t0, t1) {\n    if (!delta) return;\n    var cosRadius = (0, _mathJs.cos)(radius), sinRadius = (0, _mathJs.sin)(radius), step = direction * delta;\n    if (t0 == null) {\n        t0 = radius + direction * (0, _mathJs.tau);\n        t1 = radius - step / 2;\n    } else {\n        t0 = circleRadius(cosRadius, t0);\n        t1 = circleRadius(cosRadius, t1);\n        if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * (0, _mathJs.tau);\n    }\n    for(var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step){\n        point = (0, _cartesianJs.spherical)([\n            cosRadius,\n            -sinRadius * (0, _mathJs.cos)(t),\n            -sinRadius * (0, _mathJs.sin)(t)\n        ]);\n        stream.point(point[0], point[1]);\n    }\n}\n// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].\nfunction circleRadius(cosRadius, point) {\n    point = (0, _cartesianJs.cartesian)(point), point[0] -= cosRadius;\n    (0, _cartesianJs.cartesianNormalizeInPlace)(point);\n    var radius = (0, _mathJs.acos)(-point[1]);\n    return ((-point[2] < 0 ? -radius : radius) + (0, _mathJs.tau) - (0, _mathJs.epsilon)) % (0, _mathJs.tau);\n}\nexports.default = function() {\n    var center = (0, _constantJsDefault.default)([\n        0,\n        0\n    ]), radius = (0, _constantJsDefault.default)(90), precision = (0, _constantJsDefault.default)(6), ring, rotate, stream = {\n        point: point\n    };\n    function point(x, y) {\n        ring.push(x = rotate(x, y));\n        x[0] *= (0, _mathJs.degrees), x[1] *= (0, _mathJs.degrees);\n    }\n    function circle() {\n        var c = center.apply(this, arguments), r = radius.apply(this, arguments) * (0, _mathJs.radians), p = precision.apply(this, arguments) * (0, _mathJs.radians);\n        ring = [];\n        rotate = (0, _rotationJs.rotateRadians)(-c[0] * (0, _mathJs.radians), -c[1] * (0, _mathJs.radians), 0).invert;\n        circleStream(stream, r, p, 1);\n        c = {\n            type: \"Polygon\",\n            coordinates: [\n                ring\n            ]\n        };\n        ring = rotate = null;\n        return c;\n    }\n    circle.center = function(_) {\n        return arguments.length ? (center = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)([\n            +_[0],\n            +_[1]\n        ]), circle) : center;\n    };\n    circle.radius = function(_) {\n        return arguments.length ? (radius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), circle) : radius;\n    };\n    circle.precision = function(_) {\n        return arguments.length ? (precision = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), circle) : precision;\n    };\n    return circle;\n};\n\n},{\"./cartesian.js\":\"i2DwM\",\"./constant.js\":\"en6KO\",\"./math.js\":\"74X19\",\"./rotation.js\":\"8C7qH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"en6KO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return function() {\n        return x;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8C7qH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"rotateRadians\", ()=>rotateRadians);\nvar _composeJs = require(\"./compose.js\");\nvar _composeJsDefault = parcelHelpers.interopDefault(_composeJs);\nvar _mathJs = require(\"./math.js\");\nfunction rotationIdentity(lambda, phi) {\n    return [\n        (0, _mathJs.abs)(lambda) > (0, _mathJs.pi) ? lambda + Math.round(-lambda / (0, _mathJs.tau)) * (0, _mathJs.tau) : lambda,\n        phi\n    ];\n}\nrotationIdentity.invert = rotationIdentity;\nfunction rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n    return (deltaLambda %= (0, _mathJs.tau)) ? deltaPhi || deltaGamma ? (0, _composeJsDefault.default)(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;\n}\nfunction forwardRotationLambda(deltaLambda) {\n    return function(lambda, phi) {\n        return lambda += deltaLambda, [\n            lambda > (0, _mathJs.pi) ? lambda - (0, _mathJs.tau) : lambda < -(0, _mathJs.pi) ? lambda + (0, _mathJs.tau) : lambda,\n            phi\n        ];\n    };\n}\nfunction rotationLambda(deltaLambda) {\n    var rotation = forwardRotationLambda(deltaLambda);\n    rotation.invert = forwardRotationLambda(-deltaLambda);\n    return rotation;\n}\nfunction rotationPhiGamma(deltaPhi, deltaGamma) {\n    var cosDeltaPhi = (0, _mathJs.cos)(deltaPhi), sinDeltaPhi = (0, _mathJs.sin)(deltaPhi), cosDeltaGamma = (0, _mathJs.cos)(deltaGamma), sinDeltaGamma = (0, _mathJs.sin)(deltaGamma);\n    function rotation(lambda, phi) {\n        var cosPhi = (0, _mathJs.cos)(phi), x = (0, _mathJs.cos)(lambda) * cosPhi, y = (0, _mathJs.sin)(lambda) * cosPhi, z = (0, _mathJs.sin)(phi), k = z * cosDeltaPhi + x * sinDeltaPhi;\n        return [\n            (0, _mathJs.atan2)(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),\n            (0, _mathJs.asin)(k * cosDeltaGamma + y * sinDeltaGamma)\n        ];\n    }\n    rotation.invert = function(lambda, phi) {\n        var cosPhi = (0, _mathJs.cos)(phi), x = (0, _mathJs.cos)(lambda) * cosPhi, y = (0, _mathJs.sin)(lambda) * cosPhi, z = (0, _mathJs.sin)(phi), k = z * cosDeltaGamma - y * sinDeltaGamma;\n        return [\n            (0, _mathJs.atan2)(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),\n            (0, _mathJs.asin)(k * cosDeltaPhi - x * sinDeltaPhi)\n        ];\n    };\n    return rotation;\n}\nexports.default = function(rotate) {\n    rotate = rotateRadians(rotate[0] * (0, _mathJs.radians), rotate[1] * (0, _mathJs.radians), rotate.length > 2 ? rotate[2] * (0, _mathJs.radians) : 0);\n    function forward(coordinates) {\n        coordinates = rotate(coordinates[0] * (0, _mathJs.radians), coordinates[1] * (0, _mathJs.radians));\n        return coordinates[0] *= (0, _mathJs.degrees), coordinates[1] *= (0, _mathJs.degrees), coordinates;\n    }\n    forward.invert = function(coordinates) {\n        coordinates = rotate.invert(coordinates[0] * (0, _mathJs.radians), coordinates[1] * (0, _mathJs.radians));\n        return coordinates[0] *= (0, _mathJs.degrees), coordinates[1] *= (0, _mathJs.degrees), coordinates;\n    };\n    return forward;\n};\n\n},{\"./compose.js\":\"hmaf3\",\"./math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hmaf3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b) {\n    function compose(x, y) {\n        return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n        return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kvVxQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _mathJs = require(\"../math.js\");\nexports.default = (0, _indexJsDefault.default)(function() {\n    return true;\n}, clipAntimeridianLine, clipAntimeridianInterpolate, [\n    -(0, _mathJs.pi),\n    -(0, _mathJs.halfPi)\n]);\n// Takes a line and cuts into visible segments. Return values: 0 - there were\n// intersections or the line was empty; 1 - no intersections; 2 - there were\n// intersections, and the first and last segments should be rejoined.\nfunction clipAntimeridianLine(stream) {\n    var lambda0 = NaN, phi0 = NaN, sign0 = NaN, clean; // no intersections\n    return {\n        lineStart: function() {\n            stream.lineStart();\n            clean = 1;\n        },\n        point: function(lambda1, phi1) {\n            var sign1 = lambda1 > 0 ? (0, _mathJs.pi) : -(0, _mathJs.pi), delta = (0, _mathJs.abs)(lambda1 - lambda0);\n            if ((0, _mathJs.abs)(delta - (0, _mathJs.pi)) < (0, _mathJs.epsilon)) {\n                stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? (0, _mathJs.halfPi) : -(0, _mathJs.halfPi));\n                stream.point(sign0, phi0);\n                stream.lineEnd();\n                stream.lineStart();\n                stream.point(sign1, phi0);\n                stream.point(lambda1, phi0);\n                clean = 0;\n            } else if (sign0 !== sign1 && delta >= (0, _mathJs.pi)) {\n                if ((0, _mathJs.abs)(lambda0 - sign0) < (0, _mathJs.epsilon)) lambda0 -= sign0 * (0, _mathJs.epsilon); // handle degeneracies\n                if ((0, _mathJs.abs)(lambda1 - sign1) < (0, _mathJs.epsilon)) lambda1 -= sign1 * (0, _mathJs.epsilon);\n                phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);\n                stream.point(sign0, phi0);\n                stream.lineEnd();\n                stream.lineStart();\n                stream.point(sign1, phi0);\n                clean = 0;\n            }\n            stream.point(lambda0 = lambda1, phi0 = phi1);\n            sign0 = sign1;\n        },\n        lineEnd: function() {\n            stream.lineEnd();\n            lambda0 = phi0 = NaN;\n        },\n        clean: function() {\n            return 2 - clean; // if intersections, rejoin first and last segments\n        }\n    };\n}\nfunction clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {\n    var cosPhi0, cosPhi1, sinLambda0Lambda1 = (0, _mathJs.sin)(lambda0 - lambda1);\n    return (0, _mathJs.abs)(sinLambda0Lambda1) > (0, _mathJs.epsilon) ? (0, _mathJs.atan)(((0, _mathJs.sin)(phi0) * (cosPhi1 = (0, _mathJs.cos)(phi1)) * (0, _mathJs.sin)(lambda1) - (0, _mathJs.sin)(phi1) * (cosPhi0 = (0, _mathJs.cos)(phi0)) * (0, _mathJs.sin)(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi0 + phi1) / 2;\n}\nfunction clipAntimeridianInterpolate(from, to, direction, stream) {\n    var phi;\n    if (from == null) {\n        phi = direction * (0, _mathJs.halfPi);\n        stream.point(-(0, _mathJs.pi), phi);\n        stream.point(0, phi);\n        stream.point((0, _mathJs.pi), phi);\n        stream.point((0, _mathJs.pi), 0);\n        stream.point((0, _mathJs.pi), -phi);\n        stream.point(0, -phi);\n        stream.point(-(0, _mathJs.pi), -phi);\n        stream.point(-(0, _mathJs.pi), 0);\n        stream.point(-(0, _mathJs.pi), phi);\n    } else if ((0, _mathJs.abs)(from[0] - to[0]) > (0, _mathJs.epsilon)) {\n        var lambda = from[0] < to[0] ? (0, _mathJs.pi) : -(0, _mathJs.pi);\n        phi = direction * lambda / 2;\n        stream.point(-lambda, phi);\n        stream.point(0, phi);\n        stream.point(lambda, phi);\n    } else stream.point(to[0], to[1]);\n}\n\n},{\"./index.js\":\"gHqWc\",\"../math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gHqWc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _bufferJs = require(\"./buffer.js\");\nvar _bufferJsDefault = parcelHelpers.interopDefault(_bufferJs);\nvar _rejoinJs = require(\"./rejoin.js\");\nvar _rejoinJsDefault = parcelHelpers.interopDefault(_rejoinJs);\nvar _mathJs = require(\"../math.js\");\nvar _polygonContainsJs = require(\"../polygonContains.js\");\nvar _polygonContainsJsDefault = parcelHelpers.interopDefault(_polygonContainsJs);\nvar _d3Array = require(\"d3-array\");\nexports.default = function(pointVisible, clipLine, interpolate, start) {\n    return function(sink) {\n        var line = clipLine(sink), ringBuffer = (0, _bufferJsDefault.default)(), ringSink = clipLine(ringBuffer), polygonStarted = false, polygon, segments, ring;\n        var clip = {\n            point: point1,\n            lineStart: lineStart,\n            lineEnd: lineEnd,\n            polygonStart: function() {\n                clip.point = pointRing;\n                clip.lineStart = ringStart;\n                clip.lineEnd = ringEnd;\n                segments = [];\n                polygon = [];\n            },\n            polygonEnd: function() {\n                clip.point = point1;\n                clip.lineStart = lineStart;\n                clip.lineEnd = lineEnd;\n                segments = (0, _d3Array.merge)(segments);\n                var startInside = (0, _polygonContainsJsDefault.default)(polygon, start);\n                if (segments.length) {\n                    if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n                    (0, _rejoinJsDefault.default)(segments, compareIntersection, startInside, interpolate, sink);\n                } else if (startInside) {\n                    if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n                    sink.lineStart();\n                    interpolate(null, null, 1, sink);\n                    sink.lineEnd();\n                }\n                if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n                segments = polygon = null;\n            },\n            sphere: function() {\n                sink.polygonStart();\n                sink.lineStart();\n                interpolate(null, null, 1, sink);\n                sink.lineEnd();\n                sink.polygonEnd();\n            }\n        };\n        function point1(lambda, phi) {\n            if (pointVisible(lambda, phi)) sink.point(lambda, phi);\n        }\n        function pointLine(lambda, phi) {\n            line.point(lambda, phi);\n        }\n        function lineStart() {\n            clip.point = pointLine;\n            line.lineStart();\n        }\n        function lineEnd() {\n            clip.point = point1;\n            line.lineEnd();\n        }\n        function pointRing(lambda, phi) {\n            ring.push([\n                lambda,\n                phi\n            ]);\n            ringSink.point(lambda, phi);\n        }\n        function ringStart() {\n            ringSink.lineStart();\n            ring = [];\n        }\n        function ringEnd() {\n            pointRing(ring[0][0], ring[0][1]);\n            ringSink.lineEnd();\n            var clean = ringSink.clean(), ringSegments = ringBuffer.result(), i, n = ringSegments.length, m, segment, point;\n            ring.pop();\n            polygon.push(ring);\n            ring = null;\n            if (!n) return;\n            // No intersections.\n            if (clean & 1) {\n                segment = ringSegments[0];\n                if ((m = segment.length - 1) > 0) {\n                    if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n                    sink.lineStart();\n                    for(i = 0; i < m; ++i)sink.point((point = segment[i])[0], point[1]);\n                    sink.lineEnd();\n                }\n                return;\n            }\n            // Rejoin connected segments.\n            // TODO reuse ringBuffer.rejoin()?\n            if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n            segments.push(ringSegments.filter(validSegment));\n        }\n        return clip;\n    };\n};\nfunction validSegment(segment) {\n    return segment.length > 1;\n}\n// Intersections are sorted along the clip edge. For both antimeridian cutting\n// and circle clipping, the same comparison is used.\nfunction compareIntersection(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - (0, _mathJs.halfPi) - (0, _mathJs.epsilon) : (0, _mathJs.halfPi) - a[1]) - ((b = b.x)[0] < 0 ? b[1] - (0, _mathJs.halfPi) - (0, _mathJs.epsilon) : (0, _mathJs.halfPi) - b[1]);\n}\n\n},{\"./buffer.js\":\"6d6VN\",\"./rejoin.js\":\"6J55y\",\"../math.js\":\"74X19\",\"../polygonContains.js\":\"13VDK\",\"d3-array\":\"6IwJG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6d6VN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nexports.default = function() {\n    var lines = [], line;\n    return {\n        point: function(x, y, m) {\n            line.push([\n                x,\n                y,\n                m\n            ]);\n        },\n        lineStart: function() {\n            lines.push(line = []);\n        },\n        lineEnd: (0, _noopJsDefault.default),\n        rejoin: function() {\n            if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n        },\n        result: function() {\n            var result = lines;\n            lines = [];\n            line = null;\n            return result;\n        }\n    };\n};\n\n},{\"../noop.js\":\"aXmaS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6J55y\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _pointEqualJs = require(\"../pointEqual.js\");\nvar _pointEqualJsDefault = parcelHelpers.interopDefault(_pointEqualJs);\nvar _mathJs = require(\"../math.js\");\nfunction Intersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other; // another intersection\n    this.e = entry; // is an entry?\n    this.v = false; // visited\n    this.n = this.p = null; // next & previous\n}\n// A generalized polygon clipping algorithm: given a polygon that has been cut\n// into its visible line segments, and rejoins the segments by interpolating\n// along the clip edge.\nexports.default = function(segments, compareIntersection, startInside, interpolate, stream) {\n    var subject = [], clip = [], i, n1;\n    segments.forEach(function(segment) {\n        if ((n = segment.length - 1) <= 0) return;\n        var n, p0 = segment[0], p1 = segment[n], x;\n        if ((0, _pointEqualJsDefault.default)(p0, p1)) {\n            if (!p0[2] && !p1[2]) {\n                stream.lineStart();\n                for(i = 0; i < n; ++i)stream.point((p0 = segment[i])[0], p0[1]);\n                stream.lineEnd();\n                return;\n            }\n            // handle degenerate cases by moving the point\n            p1[0] += 2 * (0, _mathJs.epsilon);\n        }\n        subject.push(x = new Intersection(p0, segment, null, true));\n        clip.push(x.o = new Intersection(p0, null, x, false));\n        subject.push(x = new Intersection(p1, segment, null, false));\n        clip.push(x.o = new Intersection(p1, null, x, true));\n    });\n    if (!subject.length) return;\n    clip.sort(compareIntersection);\n    link(subject);\n    link(clip);\n    for(i = 0, n1 = clip.length; i < n1; ++i)clip[i].e = startInside = !startInside;\n    var start = subject[0], points, point;\n    while(true){\n        // Find first unvisited intersection.\n        var current = start, isSubject = true;\n        while(current.v)if ((current = current.n) === start) return;\n        points = current.z;\n        stream.lineStart();\n        do {\n            current.v = current.o.v = true;\n            if (current.e) {\n                if (isSubject) for(i = 0, n1 = points.length; i < n1; ++i)stream.point((point = points[i])[0], point[1]);\n                else interpolate(current.x, current.n.x, 1, stream);\n                current = current.n;\n            } else {\n                if (isSubject) {\n                    points = current.p.z;\n                    for(i = points.length - 1; i >= 0; --i)stream.point((point = points[i])[0], point[1]);\n                } else interpolate(current.x, current.p.x, -1, stream);\n                current = current.p;\n            }\n            current = current.o;\n            points = current.z;\n            isSubject = !isSubject;\n        }while (!current.v);\n        stream.lineEnd();\n    }\n};\nfunction link(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while(++i < n){\n        a.n = b = array[i];\n        b.p = a;\n        a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n}\n\n},{\"../pointEqual.js\":\"f0mBF\",\"../math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"f0mBF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"./math.js\");\nexports.default = function(a, b) {\n    return (0, _mathJs.abs)(a[0] - b[0]) < (0, _mathJs.epsilon) && (0, _mathJs.abs)(a[1] - b[1]) < (0, _mathJs.epsilon);\n};\n\n},{\"./math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"13VDK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _cartesianJs = require(\"./cartesian.js\");\nvar _mathJs = require(\"./math.js\");\nfunction longitude(point) {\n    if ((0, _mathJs.abs)(point[0]) <= (0, _mathJs.pi)) return point[0];\n    else return (0, _mathJs.sign)(point[0]) * (((0, _mathJs.abs)(point[0]) + (0, _mathJs.pi)) % (0, _mathJs.tau) - (0, _mathJs.pi));\n}\nexports.default = function(polygon, point) {\n    var lambda = longitude(point), phi = point[1], sinPhi = (0, _mathJs.sin)(phi), normal = [\n        (0, _mathJs.sin)(lambda),\n        -(0, _mathJs.cos)(lambda),\n        0\n    ], angle = 0, winding = 0;\n    var sum = new (0, _d3Array.Adder)();\n    if (sinPhi === 1) phi = (0, _mathJs.halfPi) + (0, _mathJs.epsilon);\n    else if (sinPhi === -1) phi = -(0, _mathJs.halfPi) - (0, _mathJs.epsilon);\n    for(var i = 0, n = polygon.length; i < n; ++i){\n        if (!(m = (ring = polygon[i]).length)) continue;\n        var ring, m, point0 = ring[m - 1], lambda0 = longitude(point0), phi0 = point0[1] / 2 + (0, _mathJs.quarterPi), sinPhi0 = (0, _mathJs.sin)(phi0), cosPhi0 = (0, _mathJs.cos)(phi0);\n        for(var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1){\n            var point1 = ring[j], lambda1 = longitude(point1), phi1 = point1[1] / 2 + (0, _mathJs.quarterPi), sinPhi1 = (0, _mathJs.sin)(phi1), cosPhi1 = (0, _mathJs.cos)(phi1), delta = lambda1 - lambda0, sign = delta >= 0 ? 1 : -1, absDelta = sign * delta, antimeridian = absDelta > (0, _mathJs.pi), k = sinPhi0 * sinPhi1;\n            sum.add((0, _mathJs.atan2)(k * sign * (0, _mathJs.sin)(absDelta), cosPhi0 * cosPhi1 + k * (0, _mathJs.cos)(absDelta)));\n            angle += antimeridian ? delta + sign * (0, _mathJs.tau) : delta;\n            // Are the longitudes either side of the point’s meridian (lambda),\n            // and are the latitudes smaller than the parallel (phi)?\n            if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {\n                var arc = (0, _cartesianJs.cartesianCross)((0, _cartesianJs.cartesian)(point0), (0, _cartesianJs.cartesian)(point1));\n                (0, _cartesianJs.cartesianNormalizeInPlace)(arc);\n                var intersection = (0, _cartesianJs.cartesianCross)(normal, arc);\n                (0, _cartesianJs.cartesianNormalizeInPlace)(intersection);\n                var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * (0, _mathJs.asin)(intersection[2]);\n                if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) winding += antimeridian ^ delta >= 0 ? 1 : -1;\n            }\n        }\n    }\n    // First, determine whether the South pole is inside or outside:\n    //\n    // It is inside if:\n    // * the polygon winds around it in a clockwise direction.\n    // * the polygon does not (cumulatively) wind around it, but has a negative\n    //   (counter-clockwise) area.\n    //\n    // Second, count the (signed) number of times a segment crosses a lambda\n    // from the point to the South pole.  If it is zero, then the point is the\n    // same side as the South pole.\n    return (angle < -(0, _mathJs.epsilon) || angle < (0, _mathJs.epsilon) && sum < -(0, _mathJs.epsilon2)) ^ winding & 1;\n};\n\n},{\"d3-array\":\"6IwJG\",\"./cartesian.js\":\"i2DwM\",\"./math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2PJ3I\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _cartesianJs = require(\"../cartesian.js\");\nvar _circleJs = require(\"../circle.js\");\nvar _mathJs = require(\"../math.js\");\nvar _pointEqualJs = require(\"../pointEqual.js\");\nvar _pointEqualJsDefault = parcelHelpers.interopDefault(_pointEqualJs);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nexports.default = function(radius) {\n    var cr = (0, _mathJs.cos)(radius), delta1 = 6 * (0, _mathJs.radians), smallRadius = cr > 0, notHemisphere = (0, _mathJs.abs)(cr) > (0, _mathJs.epsilon); // TODO optimise for this common case\n    function interpolate(from, to, direction, stream) {\n        (0, _circleJs.circleStream)(stream, radius, delta1, direction, from, to);\n    }\n    function visible(lambda, phi) {\n        return (0, _mathJs.cos)(lambda) * (0, _mathJs.cos)(phi) > cr;\n    }\n    // Takes a line and cuts into visible segments. Return values used for polygon\n    // clipping: 0 - there were intersections or the line was empty; 1 - no\n    // intersections 2 - there were intersections, and the first and last segments\n    // should be rejoined.\n    function clipLine(stream) {\n        var point0, c0, v0, v00, clean; // no intersections\n        return {\n            lineStart: function() {\n                v00 = v0 = false;\n                clean = 1;\n            },\n            point: function(lambda, phi) {\n                var point1 = [\n                    lambda,\n                    phi\n                ], point2, v = visible(lambda, phi), c = smallRadius ? v ? 0 : code1(lambda, phi) : v ? code1(lambda + (lambda < 0 ? (0, _mathJs.pi) : -(0, _mathJs.pi)), phi) : 0;\n                if (!point0 && (v00 = v0 = v)) stream.lineStart();\n                if (v !== v0) {\n                    point2 = intersect(point0, point1);\n                    if (!point2 || (0, _pointEqualJsDefault.default)(point0, point2) || (0, _pointEqualJsDefault.default)(point1, point2)) point1[2] = 1;\n                }\n                if (v !== v0) {\n                    clean = 0;\n                    if (v) {\n                        // outside going in\n                        stream.lineStart();\n                        point2 = intersect(point1, point0);\n                        stream.point(point2[0], point2[1]);\n                    } else {\n                        // inside going out\n                        point2 = intersect(point0, point1);\n                        stream.point(point2[0], point2[1], 2);\n                        stream.lineEnd();\n                    }\n                    point0 = point2;\n                } else if (notHemisphere && point0 && smallRadius ^ v) {\n                    var t;\n                    // If the codes for two points are different, or are both zero,\n                    // and there this segment intersects with the small circle.\n                    if (!(c & c0) && (t = intersect(point1, point0, true))) {\n                        clean = 0;\n                        if (smallRadius) {\n                            stream.lineStart();\n                            stream.point(t[0][0], t[0][1]);\n                            stream.point(t[1][0], t[1][1]);\n                            stream.lineEnd();\n                        } else {\n                            stream.point(t[1][0], t[1][1]);\n                            stream.lineEnd();\n                            stream.lineStart();\n                            stream.point(t[0][0], t[0][1], 3);\n                        }\n                    }\n                }\n                if (v && (!point0 || !(0, _pointEqualJsDefault.default)(point0, point1))) stream.point(point1[0], point1[1]);\n                point0 = point1, v0 = v, c0 = c;\n            },\n            lineEnd: function() {\n                if (v0) stream.lineEnd();\n                point0 = null;\n            },\n            // Rejoin first and last segments if there were intersections and the first\n            // and last points were visible.\n            clean: function() {\n                return clean | (v00 && v0) << 1;\n            }\n        };\n    }\n    // Intersects the great circle between a and b with the clip circle.\n    function intersect(a, b, two) {\n        var pa = (0, _cartesianJs.cartesian)(a), pb = (0, _cartesianJs.cartesian)(b);\n        // We have two planes, n1.p = d1 and n2.p = d2.\n        // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).\n        var n1 = [\n            1,\n            0,\n            0\n        ], n2 = (0, _cartesianJs.cartesianCross)(pa, pb), n2n2 = (0, _cartesianJs.cartesianDot)(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n        // Two polar points.\n        if (!determinant) return !two && a;\n        var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = (0, _cartesianJs.cartesianCross)(n1, n2), A = (0, _cartesianJs.cartesianScale)(n1, c1), B = (0, _cartesianJs.cartesianScale)(n2, c2);\n        (0, _cartesianJs.cartesianAddInPlace)(A, B);\n        // Solve |p(t)|^2 = 1.\n        var u = n1xn2, w = (0, _cartesianJs.cartesianDot)(A, u), uu = (0, _cartesianJs.cartesianDot)(u, u), t2 = w * w - uu * ((0, _cartesianJs.cartesianDot)(A, A) - 1);\n        if (t2 < 0) return;\n        var t = (0, _mathJs.sqrt)(t2), q = (0, _cartesianJs.cartesianScale)(u, (-w - t) / uu);\n        (0, _cartesianJs.cartesianAddInPlace)(q, A);\n        q = (0, _cartesianJs.spherical)(q);\n        if (!two) return q;\n        // Two intersection points.\n        var lambda0 = a[0], lambda1 = b[0], phi0 = a[1], phi1 = b[1], z;\n        if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;\n        var delta = lambda1 - lambda0, polar = (0, _mathJs.abs)(delta - (0, _mathJs.pi)) < (0, _mathJs.epsilon), meridian = polar || delta < (0, _mathJs.epsilon);\n        if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;\n        // Check that the first point is between a and b.\n        if (meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < ((0, _mathJs.abs)(q[0] - lambda0) < (0, _mathJs.epsilon) ? phi0 : phi1) : phi0 <= q[1] && q[1] <= phi1 : delta > (0, _mathJs.pi) ^ (lambda0 <= q[0] && q[0] <= lambda1)) {\n            var q1 = (0, _cartesianJs.cartesianScale)(u, (-w + t) / uu);\n            (0, _cartesianJs.cartesianAddInPlace)(q1, A);\n            return [\n                q,\n                (0, _cartesianJs.spherical)(q1)\n            ];\n        }\n    }\n    // Generates a 4-bit vector representing the location of a point relative to\n    // the small circle's bounding box.\n    function code1(lambda, phi) {\n        var r = smallRadius ? radius : (0, _mathJs.pi) - radius, code = 0;\n        if (lambda < -r) code |= 1; // left\n        else if (lambda > r) code |= 2; // right\n        if (phi < -r) code |= 4; // below\n        else if (phi > r) code |= 8; // above\n        return code;\n    }\n    return (0, _indexJsDefault.default)(visible, clipLine, interpolate, smallRadius ? [\n        0,\n        -radius\n    ] : [\n        -(0, _mathJs.pi),\n        radius - (0, _mathJs.pi)\n    ]);\n};\n\n},{\"../cartesian.js\":\"i2DwM\",\"../circle.js\":\"lPX3u\",\"../math.js\":\"74X19\",\"../pointEqual.js\":\"f0mBF\",\"./index.js\":\"gHqWc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9kmAt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nvar _bufferJs = require(\"./buffer.js\");\nvar _bufferJsDefault = parcelHelpers.interopDefault(_bufferJs);\nvar _lineJs = require(\"./line.js\");\nvar _lineJsDefault = parcelHelpers.interopDefault(_lineJs);\nvar _rejoinJs = require(\"./rejoin.js\");\nvar _rejoinJsDefault = parcelHelpers.interopDefault(_rejoinJs);\nvar _d3Array = require(\"d3-array\");\nvar clipMax = 1e9, clipMin = -clipMax;\nfunction clipRectangle(x0, y0, x1, y1) {\n    function visible1(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n    }\n    function interpolate(from, to, direction, stream) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n        while ((a = (a + direction + 4) % 4) !== a1);\n        else stream.point(to[0], to[1]);\n    }\n    function corner(p, direction) {\n        return (0, _mathJs.abs)(p[0] - x0) < (0, _mathJs.epsilon) ? direction > 0 ? 0 : 3 : (0, _mathJs.abs)(p[0] - x1) < (0, _mathJs.epsilon) ? direction > 0 ? 2 : 1 : (0, _mathJs.abs)(p[1] - y0) < (0, _mathJs.epsilon) ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon\n    }\n    function compareIntersection(a, b) {\n        return comparePoint(a.x, b.x);\n    }\n    function comparePoint(a, b) {\n        var ca = corner(a, 1), cb = corner(b, 1);\n        return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n    return function(stream) {\n        var activeStream = stream, bufferStream = (0, _bufferJsDefault.default)(), segments, polygon, ring1, x__, y__, v__, x_, y_, v_, first, clean;\n        var clipStream = {\n            point: point1,\n            lineStart: lineStart,\n            lineEnd: lineEnd,\n            polygonStart: polygonStart,\n            polygonEnd: polygonEnd\n        };\n        function point1(x, y) {\n            if (visible1(x, y)) activeStream.point(x, y);\n        }\n        function polygonInside() {\n            var winding = 0;\n            for(var i = 0, n = polygon.length; i < n; ++i)for(var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j){\n                a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];\n                if (a1 <= y1) {\n                    if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding;\n                } else if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding;\n            }\n            return winding;\n        }\n        // Buffer geometry within a polygon and then clip it en masse.\n        function polygonStart() {\n            activeStream = bufferStream, segments = [], polygon = [], clean = true;\n        }\n        function polygonEnd() {\n            var startInside = polygonInside(), cleanInside = clean && startInside, visible = (segments = (0, _d3Array.merge)(segments)).length;\n            if (cleanInside || visible) {\n                stream.polygonStart();\n                if (cleanInside) {\n                    stream.lineStart();\n                    interpolate(null, null, 1, stream);\n                    stream.lineEnd();\n                }\n                if (visible) (0, _rejoinJsDefault.default)(segments, compareIntersection, startInside, interpolate, stream);\n                stream.polygonEnd();\n            }\n            activeStream = stream, segments = polygon = ring1 = null;\n        }\n        function lineStart() {\n            clipStream.point = linePoint;\n            if (polygon) polygon.push(ring1 = []);\n            first = true;\n            v_ = false;\n            x_ = y_ = NaN;\n        }\n        // TODO rather than special-case polygons, simply handle them separately.\n        // Ideally, coincident intersection points should be jittered to avoid\n        // clipping issues.\n        function lineEnd() {\n            if (segments) {\n                linePoint(x__, y__);\n                if (v__ && v_) bufferStream.rejoin();\n                segments.push(bufferStream.result());\n            }\n            clipStream.point = point1;\n            if (v_) activeStream.lineEnd();\n        }\n        function linePoint(x, y) {\n            var v = visible1(x, y);\n            if (polygon) ring1.push([\n                x,\n                y\n            ]);\n            if (first) {\n                x__ = x, y__ = y, v__ = v;\n                first = false;\n                if (v) {\n                    activeStream.lineStart();\n                    activeStream.point(x, y);\n                }\n            } else if (v && v_) activeStream.point(x, y);\n            else {\n                var a = [\n                    x_ = Math.max(clipMin, Math.min(clipMax, x_)),\n                    y_ = Math.max(clipMin, Math.min(clipMax, y_))\n                ], b = [\n                    x = Math.max(clipMin, Math.min(clipMax, x)),\n                    y = Math.max(clipMin, Math.min(clipMax, y))\n                ];\n                if ((0, _lineJsDefault.default)(a, b, x0, y0, x1, y1)) {\n                    if (!v_) {\n                        activeStream.lineStart();\n                        activeStream.point(a[0], a[1]);\n                    }\n                    activeStream.point(b[0], b[1]);\n                    if (!v) activeStream.lineEnd();\n                    clean = false;\n                } else if (v) {\n                    activeStream.lineStart();\n                    activeStream.point(x, y);\n                    clean = false;\n                }\n            }\n            x_ = x, y_ = y, v_ = v;\n        }\n        return clipStream;\n    };\n}\nexports.default = clipRectangle;\n\n},{\"../math.js\":\"74X19\",\"./buffer.js\":\"6d6VN\",\"./line.js\":\"eNqzi\",\"./rejoin.js\":\"6J55y\",\"d3-array\":\"6IwJG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eNqzi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(a, b, x0, y0, x1, y1) {\n    var ax = a[0], ay = a[1], bx = b[0], by = b[1], t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n    r = x0 - ax;\n    if (!dx && r > 0) return;\n    r /= dx;\n    if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n    } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n    }\n    r = x1 - ax;\n    if (!dx && r < 0) return;\n    r /= dx;\n    if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n    } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n    }\n    r = y0 - ay;\n    if (!dy && r > 0) return;\n    r /= dy;\n    if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n    } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n    }\n    r = y1 - ay;\n    if (!dy && r < 0) return;\n    r /= dy;\n    if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n    } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n    }\n    if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;\n    if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;\n    return true;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"arQrO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"graticule10\", ()=>graticule10);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"./math.js\");\nfunction graticuleX(y0, y1, dy) {\n    var y2 = (0, _d3Array.range)(y0, y1 - (0, _mathJs.epsilon), dy).concat(y1);\n    return function(x) {\n        return y2.map(function(y) {\n            return [\n                x,\n                y\n            ];\n        });\n    };\n}\nfunction graticuleY(x0, x1, dx) {\n    var x2 = (0, _d3Array.range)(x0, x1 - (0, _mathJs.epsilon), dx).concat(x1);\n    return function(y) {\n        return x2.map(function(x) {\n            return [\n                x,\n                y\n            ];\n        });\n    };\n}\nfunction graticule() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x3, y3, X, Y, precision = 2.5;\n    function graticule1() {\n        return {\n            type: \"MultiLineString\",\n            coordinates: lines()\n        };\n    }\n    function lines() {\n        return (0, _d3Array.range)((0, _mathJs.ceil)(X0 / DX) * DX, X1, DX).map(X).concat((0, _d3Array.range)((0, _mathJs.ceil)(Y0 / DY) * DY, Y1, DY).map(Y)).concat((0, _d3Array.range)((0, _mathJs.ceil)(x0 / dx) * dx, x1, dx).filter(function(x) {\n            return (0, _mathJs.abs)(x % DX) > (0, _mathJs.epsilon);\n        }).map(x3)).concat((0, _d3Array.range)((0, _mathJs.ceil)(y0 / dy) * dy, y1, dy).filter(function(y) {\n            return (0, _mathJs.abs)(y % DY) > (0, _mathJs.epsilon);\n        }).map(y3));\n    }\n    graticule1.lines = function() {\n        return lines().map(function(coordinates) {\n            return {\n                type: \"LineString\",\n                coordinates: coordinates\n            };\n        });\n    };\n    graticule1.outline = function() {\n        return {\n            type: \"Polygon\",\n            coordinates: [\n                X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1))\n            ]\n        };\n    };\n    graticule1.extent = function(_) {\n        if (!arguments.length) return graticule1.extentMinor();\n        return graticule1.extentMajor(_).extentMinor(_);\n    };\n    graticule1.extentMajor = function(_) {\n        if (!arguments.length) return [\n            [\n                X0,\n                Y0\n            ],\n            [\n                X1,\n                Y1\n            ]\n        ];\n        X0 = +_[0][0], X1 = +_[1][0];\n        Y0 = +_[0][1], Y1 = +_[1][1];\n        if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n        if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n        return graticule1.precision(precision);\n    };\n    graticule1.extentMinor = function(_) {\n        if (!arguments.length) return [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n        x0 = +_[0][0], x1 = +_[1][0];\n        y0 = +_[0][1], y1 = +_[1][1];\n        if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n        if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n        return graticule1.precision(precision);\n    };\n    graticule1.step = function(_) {\n        if (!arguments.length) return graticule1.stepMinor();\n        return graticule1.stepMajor(_).stepMinor(_);\n    };\n    graticule1.stepMajor = function(_) {\n        if (!arguments.length) return [\n            DX,\n            DY\n        ];\n        DX = +_[0], DY = +_[1];\n        return graticule1;\n    };\n    graticule1.stepMinor = function(_) {\n        if (!arguments.length) return [\n            dx,\n            dy\n        ];\n        dx = +_[0], dy = +_[1];\n        return graticule1;\n    };\n    graticule1.precision = function(_) {\n        if (!arguments.length) return precision;\n        precision = +_;\n        x3 = graticuleX(y0, y1, 90);\n        y3 = graticuleY(x0, x1, precision);\n        X = graticuleX(Y0, Y1, 90);\n        Y = graticuleY(X0, X1, precision);\n        return graticule1;\n    };\n    return graticule1.extentMajor([\n        [\n            -180,\n            -90 + (0, _mathJs.epsilon)\n        ],\n        [\n            180,\n            90 - (0, _mathJs.epsilon)\n        ]\n    ]).extentMinor([\n        [\n            -180,\n            -80 - (0, _mathJs.epsilon)\n        ],\n        [\n            180,\n            80 + (0, _mathJs.epsilon)\n        ]\n    ]);\n}\nexports.default = graticule;\nfunction graticule10() {\n    return graticule()();\n}\n\n},{\"d3-array\":\"6IwJG\",\"./math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gBtNJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _identityJs = require(\"../identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _streamJs = require(\"../stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar _areaJs = require(\"./area.js\");\nvar _areaJsDefault = parcelHelpers.interopDefault(_areaJs);\nvar _boundsJs = require(\"./bounds.js\");\nvar _boundsJsDefault = parcelHelpers.interopDefault(_boundsJs);\nvar _centroidJs = require(\"./centroid.js\");\nvar _centroidJsDefault = parcelHelpers.interopDefault(_centroidJs);\nvar _contextJs = require(\"./context.js\");\nvar _contextJsDefault = parcelHelpers.interopDefault(_contextJs);\nvar _measureJs = require(\"./measure.js\");\nvar _measureJsDefault = parcelHelpers.interopDefault(_measureJs);\nvar _stringJs = require(\"./string.js\");\nvar _stringJsDefault = parcelHelpers.interopDefault(_stringJs);\nexports.default = function(projection, context) {\n    var pointRadius = 4.5, projectionStream, contextStream;\n    function path(object) {\n        if (object) {\n            if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n            (0, _streamJsDefault.default)(object, projectionStream(contextStream));\n        }\n        return contextStream.result();\n    }\n    path.area = function(object) {\n        (0, _streamJsDefault.default)(object, projectionStream((0, _areaJsDefault.default)));\n        return (0, _areaJsDefault.default).result();\n    };\n    path.measure = function(object) {\n        (0, _streamJsDefault.default)(object, projectionStream((0, _measureJsDefault.default)));\n        return (0, _measureJsDefault.default).result();\n    };\n    path.bounds = function(object) {\n        (0, _streamJsDefault.default)(object, projectionStream((0, _boundsJsDefault.default)));\n        return (0, _boundsJsDefault.default).result();\n    };\n    path.centroid = function(object) {\n        (0, _streamJsDefault.default)(object, projectionStream((0, _centroidJsDefault.default)));\n        return (0, _centroidJsDefault.default).result();\n    };\n    path.projection = function(_) {\n        return arguments.length ? (projectionStream = _ == null ? (projection = null, _identityJsDefault.default) : (projection = _).stream, path) : projection;\n    };\n    path.context = function(_) {\n        if (!arguments.length) return context;\n        contextStream = _ == null ? (context = null, new (0, _stringJsDefault.default)) : new (0, _contextJsDefault.default)(context = _);\n        if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n        return path;\n    };\n    path.pointRadius = function(_) {\n        if (!arguments.length) return pointRadius;\n        pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n        return path;\n    };\n    return path.projection(projection).context(context);\n};\n\n},{\"../identity.js\":\"kub29\",\"../stream.js\":\"9nFXd\",\"./area.js\":\"5SF2U\",\"./bounds.js\":\"bhNL9\",\"./centroid.js\":\"lPOtc\",\"./context.js\":\"fIlZ0\",\"./measure.js\":\"iTRFv\",\"./string.js\":\"gD9Wt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kub29\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = (x)=>x;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5SF2U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"../math.js\");\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar areaSum = new (0, _d3Array.Adder)(), areaRingSum = new (0, _d3Array.Adder)(), x00, y00, x0, y0;\nvar areaStream = {\n    point: (0, _noopJsDefault.default),\n    lineStart: (0, _noopJsDefault.default),\n    lineEnd: (0, _noopJsDefault.default),\n    polygonStart: function() {\n        areaStream.lineStart = areaRingStart;\n        areaStream.lineEnd = areaRingEnd;\n    },\n    polygonEnd: function() {\n        areaStream.lineStart = areaStream.lineEnd = areaStream.point = (0, _noopJsDefault.default);\n        areaSum.add((0, _mathJs.abs)(areaRingSum));\n        areaRingSum = new (0, _d3Array.Adder)();\n    },\n    result: function() {\n        var area = areaSum / 2;\n        areaSum = new (0, _d3Array.Adder)();\n        return area;\n    }\n};\nfunction areaRingStart() {\n    areaStream.point = areaPointFirst;\n}\nfunction areaPointFirst(x, y) {\n    areaStream.point = areaPoint;\n    x00 = x0 = x, y00 = y0 = y;\n}\nfunction areaPoint(x, y) {\n    areaRingSum.add(y0 * x - x0 * y);\n    x0 = x, y0 = y;\n}\nfunction areaRingEnd() {\n    areaPoint(x00, y00);\n}\nexports.default = areaStream;\n\n},{\"d3-array\":\"6IwJG\",\"../math.js\":\"74X19\",\"../noop.js\":\"aXmaS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bhNL9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar x0 = Infinity, y0 = x0, x1 = -x0, y1 = x1;\nvar boundsStream = {\n    point: boundsPoint,\n    lineStart: (0, _noopJsDefault.default),\n    lineEnd: (0, _noopJsDefault.default),\n    polygonStart: (0, _noopJsDefault.default),\n    polygonEnd: (0, _noopJsDefault.default),\n    result: function() {\n        var bounds = [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n        x1 = y1 = -(y0 = x0 = Infinity);\n        return bounds;\n    }\n};\nfunction boundsPoint(x, y) {\n    if (x < x0) x0 = x;\n    if (x > x1) x1 = x;\n    if (y < y0) y0 = y;\n    if (y > y1) y1 = y;\n}\nexports.default = boundsStream;\n\n},{\"../noop.js\":\"aXmaS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lPOtc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\n// TODO Enforce positive area for exterior, negative area for interior?\nvar X0 = 0, Y0 = 0, Z0 = 0, X1 = 0, Y1 = 0, Z1 = 0, X2 = 0, Y2 = 0, Z2 = 0, x00, y00, x0, y0;\nvar centroidStream = {\n    point: centroidPoint,\n    lineStart: centroidLineStart,\n    lineEnd: centroidLineEnd,\n    polygonStart: function() {\n        centroidStream.lineStart = centroidRingStart;\n        centroidStream.lineEnd = centroidRingEnd;\n    },\n    polygonEnd: function() {\n        centroidStream.point = centroidPoint;\n        centroidStream.lineStart = centroidLineStart;\n        centroidStream.lineEnd = centroidLineEnd;\n    },\n    result: function() {\n        var centroid = Z2 ? [\n            X2 / Z2,\n            Y2 / Z2\n        ] : Z1 ? [\n            X1 / Z1,\n            Y1 / Z1\n        ] : Z0 ? [\n            X0 / Z0,\n            Y0 / Z0\n        ] : [\n            NaN,\n            NaN\n        ];\n        X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;\n        return centroid;\n    }\n};\nfunction centroidPoint(x, y) {\n    X0 += x;\n    Y0 += y;\n    ++Z0;\n}\nfunction centroidLineStart() {\n    centroidStream.point = centroidPointFirstLine;\n}\nfunction centroidPointFirstLine(x, y) {\n    centroidStream.point = centroidPointLine;\n    centroidPoint(x0 = x, y0 = y);\n}\nfunction centroidPointLine(x, y) {\n    var dx = x - x0, dy = y - y0, z = (0, _mathJs.sqrt)(dx * dx + dy * dy);\n    X1 += z * (x0 + x) / 2;\n    Y1 += z * (y0 + y) / 2;\n    Z1 += z;\n    centroidPoint(x0 = x, y0 = y);\n}\nfunction centroidLineEnd() {\n    centroidStream.point = centroidPoint;\n}\nfunction centroidRingStart() {\n    centroidStream.point = centroidPointFirstRing;\n}\nfunction centroidRingEnd() {\n    centroidPointRing(x00, y00);\n}\nfunction centroidPointFirstRing(x, y) {\n    centroidStream.point = centroidPointRing;\n    centroidPoint(x00 = x0 = x, y00 = y0 = y);\n}\nfunction centroidPointRing(x, y) {\n    var dx = x - x0, dy = y - y0, z = (0, _mathJs.sqrt)(dx * dx + dy * dy);\n    X1 += z * (x0 + x) / 2;\n    Y1 += z * (y0 + y) / 2;\n    Z1 += z;\n    z = y0 * x - x0 * y;\n    X2 += z * (x0 + x);\n    Y2 += z * (y0 + y);\n    Z2 += z * 3;\n    centroidPoint(x0 = x, y0 = y);\n}\nexports.default = centroidStream;\n\n},{\"../math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fIlZ0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nfunction PathContext(context) {\n    this._context = context;\n}\nexports.default = PathContext;\nPathContext.prototype = {\n    _radius: 4.5,\n    pointRadius: function(_) {\n        return this._radius = _, this;\n    },\n    polygonStart: function() {\n        this._line = 0;\n    },\n    polygonEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line === 0) this._context.closePath();\n        this._point = NaN;\n    },\n    point: function(x, y) {\n        switch(this._point){\n            case 0:\n                this._context.moveTo(x, y);\n                this._point = 1;\n                break;\n            case 1:\n                this._context.lineTo(x, y);\n                break;\n            default:\n                this._context.moveTo(x + this._radius, y);\n                this._context.arc(x, y, this._radius, 0, (0, _mathJs.tau));\n                break;\n        }\n    },\n    result: (0, _noopJsDefault.default)\n};\n\n},{\"../math.js\":\"74X19\",\"../noop.js\":\"aXmaS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iTRFv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Array = require(\"d3-array\");\nvar _mathJs = require(\"../math.js\");\nvar _noopJs = require(\"../noop.js\");\nvar _noopJsDefault = parcelHelpers.interopDefault(_noopJs);\nvar lengthSum = new (0, _d3Array.Adder)(), lengthRing, x00, y00, x0, y0;\nvar lengthStream = {\n    point: (0, _noopJsDefault.default),\n    lineStart: function() {\n        lengthStream.point = lengthPointFirst;\n    },\n    lineEnd: function() {\n        if (lengthRing) lengthPoint(x00, y00);\n        lengthStream.point = (0, _noopJsDefault.default);\n    },\n    polygonStart: function() {\n        lengthRing = true;\n    },\n    polygonEnd: function() {\n        lengthRing = null;\n    },\n    result: function() {\n        var length = +lengthSum;\n        lengthSum = new (0, _d3Array.Adder)();\n        return length;\n    }\n};\nfunction lengthPointFirst(x, y) {\n    lengthStream.point = lengthPoint;\n    x00 = x0 = x, y00 = y0 = y;\n}\nfunction lengthPoint(x, y) {\n    x0 -= x, y0 -= y;\n    lengthSum.add((0, _mathJs.sqrt)(x0 * x0 + y0 * y0));\n    x0 = x, y0 = y;\n}\nexports.default = lengthStream;\n\n},{\"d3-array\":\"6IwJG\",\"../math.js\":\"74X19\",\"../noop.js\":\"aXmaS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gD9Wt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction PathString() {\n    this._string = [];\n}\nexports.default = PathString;\nPathString.prototype = {\n    _radius: 4.5,\n    _circle: circle(4.5),\n    pointRadius: function(_) {\n        if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;\n        return this;\n    },\n    polygonStart: function() {\n        this._line = 0;\n    },\n    polygonEnd: function() {\n        this._line = NaN;\n    },\n    lineStart: function() {\n        this._point = 0;\n    },\n    lineEnd: function() {\n        if (this._line === 0) this._string.push(\"Z\");\n        this._point = NaN;\n    },\n    point: function(x, y) {\n        switch(this._point){\n            case 0:\n                this._string.push(\"M\", x, \",\", y);\n                this._point = 1;\n                break;\n            case 1:\n                this._string.push(\"L\", x, \",\", y);\n                break;\n            default:\n                if (this._circle == null) this._circle = circle(this._radius);\n                this._string.push(\"M\", x, \",\", y, this._circle);\n                break;\n        }\n    },\n    result: function() {\n        if (this._string.length) {\n            var result = this._string.join(\"\");\n            this._string = [];\n            return result;\n        } else return null;\n    }\n};\nfunction circle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dSks5\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _conicEqualAreaJs = require(\"./conicEqualArea.js\");\nvar _conicEqualAreaJsDefault = parcelHelpers.interopDefault(_conicEqualAreaJs);\nexports.default = function() {\n    return (0, _conicEqualAreaJsDefault.default)().parallels([\n        29.5,\n        45.5\n    ]).scale(1070).translate([\n        480,\n        250\n    ]).rotate([\n        96,\n        0\n    ]).center([\n        -0.6,\n        38.7\n    ]);\n};\n\n},{\"./conicEqualArea.js\":\"17j9x\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"17j9x\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"conicEqualAreaRaw\", ()=>conicEqualAreaRaw);\nvar _mathJs = require(\"../math.js\");\nvar _conicJs = require(\"./conic.js\");\nvar _cylindricalEqualAreaJs = require(\"./cylindricalEqualArea.js\");\nfunction conicEqualAreaRaw(y0, y1) {\n    var sy0 = (0, _mathJs.sin)(y0), n = (sy0 + (0, _mathJs.sin)(y1)) / 2;\n    // Are the parallels symmetrical around the Equator?\n    if ((0, _mathJs.abs)(n) < (0, _mathJs.epsilon)) return (0, _cylindricalEqualAreaJs.cylindricalEqualAreaRaw)(y0);\n    var c = 1 + sy0 * (2 * n - sy0), r0 = (0, _mathJs.sqrt)(c) / n;\n    function project(x, y) {\n        var r = (0, _mathJs.sqrt)(c - 2 * n * (0, _mathJs.sin)(y)) / n;\n        return [\n            r * (0, _mathJs.sin)(x *= n),\n            r0 - r * (0, _mathJs.cos)(x)\n        ];\n    }\n    project.invert = function(x, y) {\n        var r0y = r0 - y, l = (0, _mathJs.atan2)(x, (0, _mathJs.abs)(r0y)) * (0, _mathJs.sign)(r0y);\n        if (r0y * n < 0) l -= (0, _mathJs.pi) * (0, _mathJs.sign)(x) * (0, _mathJs.sign)(r0y);\n        return [\n            l / n,\n            (0, _mathJs.asin)((c - (x * x + r0y * r0y) * n * n) / (2 * n))\n        ];\n    };\n    return project;\n}\nexports.default = function() {\n    return (0, _conicJs.conicProjection)(conicEqualAreaRaw).scale(155.424).center([\n        0,\n        33.6442\n    ]);\n};\n\n},{\"../math.js\":\"74X19\",\"./conic.js\":\"15g8N\",\"./cylindricalEqualArea.js\":\"j13Gc\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"15g8N\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"conicProjection\", ()=>conicProjection);\nvar _mathJs = require(\"../math.js\");\nvar _indexJs = require(\"./index.js\");\nfunction conicProjection(projectAt) {\n    var phi0 = 0, phi1 = (0, _mathJs.pi) / 3, m = (0, _indexJs.projectionMutator)(projectAt), p = m(phi0, phi1);\n    p.parallels = function(_) {\n        return arguments.length ? m(phi0 = _[0] * (0, _mathJs.radians), phi1 = _[1] * (0, _mathJs.radians)) : [\n            phi0 * (0, _mathJs.degrees),\n            phi1 * (0, _mathJs.degrees)\n        ];\n    };\n    return p;\n}\n\n},{\"../math.js\":\"74X19\",\"./index.js\":\"cd9OX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cd9OX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"projectionMutator\", ()=>projectionMutator);\nvar _antimeridianJs = require(\"../clip/antimeridian.js\");\nvar _antimeridianJsDefault = parcelHelpers.interopDefault(_antimeridianJs);\nvar _circleJs = require(\"../clip/circle.js\");\nvar _circleJsDefault = parcelHelpers.interopDefault(_circleJs);\nvar _rectangleJs = require(\"../clip/rectangle.js\");\nvar _rectangleJsDefault = parcelHelpers.interopDefault(_rectangleJs);\nvar _composeJs = require(\"../compose.js\");\nvar _composeJsDefault = parcelHelpers.interopDefault(_composeJs);\nvar _identityJs = require(\"../identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _mathJs = require(\"../math.js\");\nvar _rotationJs = require(\"../rotation.js\");\nvar _transformJs = require(\"../transform.js\");\nvar _fitJs = require(\"./fit.js\");\nvar _resampleJs = require(\"./resample.js\");\nvar _resampleJsDefault = parcelHelpers.interopDefault(_resampleJs);\nvar transformRadians = (0, _transformJs.transformer)({\n    point: function(x, y) {\n        this.stream.point(x * (0, _mathJs.radians), y * (0, _mathJs.radians));\n    }\n});\nfunction transformRotate(rotate) {\n    return (0, _transformJs.transformer)({\n        point: function(x, y) {\n            var r = rotate(x, y);\n            return this.stream.point(r[0], r[1]);\n        }\n    });\n}\nfunction scaleTranslate(k, dx, dy, sx, sy) {\n    function transform(x, y) {\n        x *= sx;\n        y *= sy;\n        return [\n            dx + k * x,\n            dy - k * y\n        ];\n    }\n    transform.invert = function(x, y) {\n        return [\n            (x - dx) / k * sx,\n            (dy - y) / k * sy\n        ];\n    };\n    return transform;\n}\nfunction scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n    if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n    var cosAlpha = (0, _mathJs.cos)(alpha), sinAlpha = (0, _mathJs.sin)(alpha), a = cosAlpha * k, b = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;\n    function transform(x, y) {\n        x *= sx;\n        y *= sy;\n        return [\n            a * x - b * y + dx,\n            dy - b * x - a * y\n        ];\n    }\n    transform.invert = function(x, y) {\n        return [\n            sx * (ai * x - bi * y + ci),\n            sy * (fi - bi * x - ai * y)\n        ];\n    };\n    return transform;\n}\nfunction projection(project) {\n    return projectionMutator(function() {\n        return project;\n    })();\n}\nexports.default = projection;\nfunction projectionMutator(projectAt) {\n    var project, k = 150, x = 480, y = 250, lambda = 0, phi = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, alpha = 0, sx = 1, sy = 1, theta = null, preclip = (0, _antimeridianJsDefault.default), x0 = null, y0, x1, y1, postclip = (0, _identityJsDefault.default), delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache, cacheStream;\n    function projection1(point) {\n        return projectRotateTransform(point[0] * (0, _mathJs.radians), point[1] * (0, _mathJs.radians));\n    }\n    function invert(point) {\n        point = projectRotateTransform.invert(point[0], point[1]);\n        return point && [\n            point[0] * (0, _mathJs.degrees),\n            point[1] * (0, _mathJs.degrees)\n        ];\n    }\n    projection1.stream = function(stream) {\n        return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));\n    };\n    projection1.preclip = function(_) {\n        return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;\n    };\n    projection1.postclip = function(_) {\n        return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n    };\n    projection1.clipAngle = function(_) {\n        return arguments.length ? (preclip = +_ ? (0, _circleJsDefault.default)(theta = _ * (0, _mathJs.radians)) : (theta = null, _antimeridianJsDefault.default), reset()) : theta * (0, _mathJs.degrees);\n    };\n    projection1.clipExtent = function(_) {\n        return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, _identityJsDefault.default) : (0, _rectangleJsDefault.default)(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n    };\n    projection1.scale = function(_) {\n        return arguments.length ? (k = +_, recenter()) : k;\n    };\n    projection1.translate = function(_) {\n        return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [\n            x,\n            y\n        ];\n    };\n    projection1.center = function(_) {\n        return arguments.length ? (lambda = _[0] % 360 * (0, _mathJs.radians), phi = _[1] % 360 * (0, _mathJs.radians), recenter()) : [\n            lambda * (0, _mathJs.degrees),\n            phi * (0, _mathJs.degrees)\n        ];\n    };\n    projection1.rotate = function(_) {\n        return arguments.length ? (deltaLambda = _[0] % 360 * (0, _mathJs.radians), deltaPhi = _[1] % 360 * (0, _mathJs.radians), deltaGamma = _.length > 2 ? _[2] % 360 * (0, _mathJs.radians) : 0, recenter()) : [\n            deltaLambda * (0, _mathJs.degrees),\n            deltaPhi * (0, _mathJs.degrees),\n            deltaGamma * (0, _mathJs.degrees)\n        ];\n    };\n    projection1.angle = function(_) {\n        return arguments.length ? (alpha = _ % 360 * (0, _mathJs.radians), recenter()) : alpha * (0, _mathJs.degrees);\n    };\n    projection1.reflectX = function(_) {\n        return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n    };\n    projection1.reflectY = function(_) {\n        return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n    };\n    projection1.precision = function(_) {\n        return arguments.length ? (projectResample = (0, _resampleJsDefault.default)(projectTransform, delta2 = _ * _), reset()) : (0, _mathJs.sqrt)(delta2);\n    };\n    projection1.fitExtent = function(extent, object) {\n        return (0, _fitJs.fitExtent)(projection1, extent, object);\n    };\n    projection1.fitSize = function(size, object) {\n        return (0, _fitJs.fitSize)(projection1, size, object);\n    };\n    projection1.fitWidth = function(width, object) {\n        return (0, _fitJs.fitWidth)(projection1, width, object);\n    };\n    projection1.fitHeight = function(height, object) {\n        return (0, _fitJs.fitHeight)(projection1, height, object);\n    };\n    function recenter() {\n        var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha);\n        rotate = (0, _rotationJs.rotateRadians)(deltaLambda, deltaPhi, deltaGamma);\n        projectTransform = (0, _composeJsDefault.default)(project, transform);\n        projectRotateTransform = (0, _composeJsDefault.default)(rotate, projectTransform);\n        projectResample = (0, _resampleJsDefault.default)(projectTransform, delta2);\n        return reset();\n    }\n    function reset() {\n        cache = cacheStream = null;\n        return projection1;\n    }\n    return function() {\n        project = projectAt.apply(this, arguments);\n        projection1.invert = project.invert && invert;\n        return recenter();\n    };\n}\n\n},{\"../clip/antimeridian.js\":\"kvVxQ\",\"../clip/circle.js\":\"2PJ3I\",\"../clip/rectangle.js\":\"9kmAt\",\"../compose.js\":\"hmaf3\",\"../identity.js\":\"kub29\",\"../math.js\":\"74X19\",\"../rotation.js\":\"8C7qH\",\"../transform.js\":\"9MXXE\",\"./fit.js\":\"49j0j\",\"./resample.js\":\"gWNAn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9MXXE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"transformer\", ()=>transformer);\nexports.default = function(methods) {\n    return {\n        stream: transformer(methods)\n    };\n};\nfunction transformer(methods) {\n    return function(stream) {\n        var s = new TransformStream;\n        for(var key in methods)s[key] = methods[key];\n        s.stream = stream;\n        return s;\n    };\n}\nfunction TransformStream() {}\nTransformStream.prototype = {\n    constructor: TransformStream,\n    point: function(x, y) {\n        this.stream.point(x, y);\n    },\n    sphere: function() {\n        this.stream.sphere();\n    },\n    lineStart: function() {\n        this.stream.lineStart();\n    },\n    lineEnd: function() {\n        this.stream.lineEnd();\n    },\n    polygonStart: function() {\n        this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n        this.stream.polygonEnd();\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"49j0j\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fitExtent\", ()=>fitExtent);\nparcelHelpers.export(exports, \"fitSize\", ()=>fitSize);\nparcelHelpers.export(exports, \"fitWidth\", ()=>fitWidth);\nparcelHelpers.export(exports, \"fitHeight\", ()=>fitHeight);\nvar _streamJs = require(\"../stream.js\");\nvar _streamJsDefault = parcelHelpers.interopDefault(_streamJs);\nvar _boundsJs = require(\"../path/bounds.js\");\nvar _boundsJsDefault = parcelHelpers.interopDefault(_boundsJs);\nfunction fit(projection, fitBounds, object) {\n    var clip = projection.clipExtent && projection.clipExtent();\n    projection.scale(150).translate([\n        0,\n        0\n    ]);\n    if (clip != null) projection.clipExtent(null);\n    (0, _streamJsDefault.default)(object, projection.stream((0, _boundsJsDefault.default)));\n    fitBounds((0, _boundsJsDefault.default).result());\n    if (clip != null) projection.clipExtent(clip);\n    return projection;\n}\nfunction fitExtent(projection, extent, object) {\n    return fit(projection, function(b) {\n        var w = extent[1][0] - extent[0][0], h = extent[1][1] - extent[0][1], k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;\n        projection.scale(150 * k).translate([\n            x,\n            y\n        ]);\n    }, object);\n}\nfunction fitSize(projection, size, object) {\n    return fitExtent(projection, [\n        [\n            0,\n            0\n        ],\n        size\n    ], object);\n}\nfunction fitWidth(projection, width, object) {\n    return fit(projection, function(b) {\n        var w = +width, k = w / (b[1][0] - b[0][0]), x = (w - k * (b[1][0] + b[0][0])) / 2, y = -k * b[0][1];\n        projection.scale(150 * k).translate([\n            x,\n            y\n        ]);\n    }, object);\n}\nfunction fitHeight(projection, height, object) {\n    return fit(projection, function(b) {\n        var h = +height, k = h / (b[1][1] - b[0][1]), x = -k * b[0][0], y = (h - k * (b[1][1] + b[0][1])) / 2;\n        projection.scale(150 * k).translate([\n            x,\n            y\n        ]);\n    }, object);\n}\n\n},{\"../stream.js\":\"9nFXd\",\"../path/bounds.js\":\"bhNL9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gWNAn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _cartesianJs = require(\"../cartesian.js\");\nvar _mathJs = require(\"../math.js\");\nvar _transformJs = require(\"../transform.js\");\nvar maxDepth = 16, cosMinDistance = (0, _mathJs.cos)(30 * (0, _mathJs.radians)); // cos(minimum angular distance)\nexports.default = function(project, delta2) {\n    return +delta2 ? resample(project, delta2) : resampleNone(project);\n};\nfunction resampleNone(project) {\n    return (0, _transformJs.transformer)({\n        point: function(x, y) {\n            x = project(x, y);\n            this.stream.point(x[0], x[1]);\n        }\n    });\n}\nfunction resample(project, delta2) {\n    function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {\n        var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n        if (d2 > 4 * delta2 && depth--) {\n            var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = (0, _mathJs.sqrt)(a * a + b * b + c * c), phi2 = (0, _mathJs.asin)(c /= m), lambda2 = (0, _mathJs.abs)((0, _mathJs.abs)(c) - 1) < (0, _mathJs.epsilon) || (0, _mathJs.abs)(lambda0 - lambda1) < (0, _mathJs.epsilon) ? (lambda0 + lambda1) / 2 : (0, _mathJs.atan2)(b, a), p = project(lambda2, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n            if (dz * dz / d2 > delta2 // perpendicular projected distance\n             || (0, _mathJs.abs)((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end\n             || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n                resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);\n                stream.point(x2, y2);\n                resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);\n            }\n        }\n    }\n    return function(stream) {\n        var lambda00, x00, y00, a00, b00, c00, lambda0, x0, y0, a0, b0, c0; // previous point\n        var resampleStream = {\n            point: point,\n            lineStart: lineStart,\n            lineEnd: lineEnd,\n            polygonStart: function() {\n                stream.polygonStart();\n                resampleStream.lineStart = ringStart;\n            },\n            polygonEnd: function() {\n                stream.polygonEnd();\n                resampleStream.lineStart = lineStart;\n            }\n        };\n        function point(x, y) {\n            x = project(x, y);\n            stream.point(x[0], x[1]);\n        }\n        function lineStart() {\n            x0 = NaN;\n            resampleStream.point = linePoint;\n            stream.lineStart();\n        }\n        function linePoint(lambda, phi) {\n            var c = (0, _cartesianJs.cartesian)([\n                lambda,\n                phi\n            ]), p = project(lambda, phi);\n            resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n            stream.point(x0, y0);\n        }\n        function lineEnd() {\n            resampleStream.point = point;\n            stream.lineEnd();\n        }\n        function ringStart() {\n            lineStart();\n            resampleStream.point = ringPoint;\n            resampleStream.lineEnd = ringEnd;\n        }\n        function ringPoint(lambda, phi) {\n            linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n            resampleStream.point = linePoint;\n        }\n        function ringEnd() {\n            resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);\n            resampleStream.lineEnd = lineEnd;\n            lineEnd();\n        }\n        return resampleStream;\n    };\n}\n\n},{\"../cartesian.js\":\"i2DwM\",\"../math.js\":\"74X19\",\"../transform.js\":\"9MXXE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j13Gc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cylindricalEqualAreaRaw\", ()=>cylindricalEqualAreaRaw);\nvar _mathJs = require(\"../math.js\");\nfunction cylindricalEqualAreaRaw(phi0) {\n    var cosPhi0 = (0, _mathJs.cos)(phi0);\n    function forward(lambda, phi) {\n        return [\n            lambda * cosPhi0,\n            (0, _mathJs.sin)(phi) / cosPhi0\n        ];\n    }\n    forward.invert = function(x, y) {\n        return [\n            x / cosPhi0,\n            (0, _mathJs.asin)(y * cosPhi0)\n        ];\n    };\n    return forward;\n}\n\n},{\"../math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4lZJF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _mathJs = require(\"../math.js\");\nvar _albersJs = require(\"./albers.js\");\nvar _albersJsDefault = parcelHelpers.interopDefault(_albersJs);\nvar _conicEqualAreaJs = require(\"./conicEqualArea.js\");\nvar _conicEqualAreaJsDefault = parcelHelpers.interopDefault(_conicEqualAreaJs);\nvar _fitJs = require(\"./fit.js\");\n// The projections must have mutually exclusive clip regions on the sphere,\n// as this will avoid emitting interleaving lines and polygons.\nfunction multiplex(streams) {\n    var n = streams.length;\n    return {\n        point: function(x, y) {\n            var i = -1;\n            while(++i < n)streams[i].point(x, y);\n        },\n        sphere: function() {\n            var i = -1;\n            while(++i < n)streams[i].sphere();\n        },\n        lineStart: function() {\n            var i = -1;\n            while(++i < n)streams[i].lineStart();\n        },\n        lineEnd: function() {\n            var i = -1;\n            while(++i < n)streams[i].lineEnd();\n        },\n        polygonStart: function() {\n            var i = -1;\n            while(++i < n)streams[i].polygonStart();\n        },\n        polygonEnd: function() {\n            var i = -1;\n            while(++i < n)streams[i].polygonEnd();\n        }\n    };\n}\n// A composite projection for the United States, configured by default for\n// 960×500. The projection also works quite well at 960×600 if you change the\n// scale to 1285 and adjust the translate accordingly. The set of standard\n// parallels for each region comes from USGS, which is published here:\n// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers\nexports.default = function() {\n    var cache, cacheStream, lower48 = (0, _albersJsDefault.default)(), lower48Point, alaska = (0, _conicEqualAreaJsDefault.default)().rotate([\n        154,\n        0\n    ]).center([\n        -2,\n        58.5\n    ]).parallels([\n        55,\n        65\n    ]), alaskaPoint, hawaii = (0, _conicEqualAreaJsDefault.default)().rotate([\n        157,\n        0\n    ]).center([\n        -3,\n        19.9\n    ]).parallels([\n        8,\n        18\n    ]), hawaiiPoint, point, pointStream = {\n        point: function(x, y) {\n            point = [\n                x,\n                y\n            ];\n        }\n    };\n    function albersUsa(coordinates) {\n        var x = coordinates[0], y = coordinates[1];\n        return point = null, (lower48Point.point(x, y), point) || (alaskaPoint.point(x, y), point) || (hawaiiPoint.point(x, y), point);\n    }\n    albersUsa.invert = function(coordinates) {\n        var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n        return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n        return cache && cacheStream === stream ? cache : cache = multiplex([\n            lower48.stream(cacheStream = stream),\n            alaska.stream(stream),\n            hawaii.stream(stream)\n        ]);\n    };\n    albersUsa.precision = function(_) {\n        if (!arguments.length) return lower48.precision();\n        lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n        return reset();\n    };\n    albersUsa.scale = function(_) {\n        if (!arguments.length) return lower48.scale();\n        lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n        return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n        if (!arguments.length) return lower48.translate();\n        var k = lower48.scale(), x = +_[0], y = +_[1];\n        lower48Point = lower48.translate(_).clipExtent([\n            [\n                x - 0.455 * k,\n                y - 0.238 * k\n            ],\n            [\n                x + 0.455 * k,\n                y + 0.238 * k\n            ]\n        ]).stream(pointStream);\n        alaskaPoint = alaska.translate([\n            x - 0.307 * k,\n            y + 0.201 * k\n        ]).clipExtent([\n            [\n                x - 0.425 * k + (0, _mathJs.epsilon),\n                y + 0.120 * k + (0, _mathJs.epsilon)\n            ],\n            [\n                x - 0.214 * k - (0, _mathJs.epsilon),\n                y + 0.234 * k - (0, _mathJs.epsilon)\n            ]\n        ]).stream(pointStream);\n        hawaiiPoint = hawaii.translate([\n            x - 0.205 * k,\n            y + 0.212 * k\n        ]).clipExtent([\n            [\n                x - 0.214 * k + (0, _mathJs.epsilon),\n                y + 0.166 * k + (0, _mathJs.epsilon)\n            ],\n            [\n                x - 0.115 * k - (0, _mathJs.epsilon),\n                y + 0.234 * k - (0, _mathJs.epsilon)\n            ]\n        ]).stream(pointStream);\n        return reset();\n    };\n    albersUsa.fitExtent = function(extent, object) {\n        return (0, _fitJs.fitExtent)(albersUsa, extent, object);\n    };\n    albersUsa.fitSize = function(size, object) {\n        return (0, _fitJs.fitSize)(albersUsa, size, object);\n    };\n    albersUsa.fitWidth = function(width, object) {\n        return (0, _fitJs.fitWidth)(albersUsa, width, object);\n    };\n    albersUsa.fitHeight = function(height, object) {\n        return (0, _fitJs.fitHeight)(albersUsa, height, object);\n    };\n    function reset() {\n        cache = cacheStream = null;\n        return albersUsa;\n    }\n    return albersUsa.scale(1070);\n};\n\n},{\"../math.js\":\"74X19\",\"./albers.js\":\"dSks5\",\"./conicEqualArea.js\":\"17j9x\",\"./fit.js\":\"49j0j\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jbLs0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"azimuthalEqualAreaRaw\", ()=>azimuthalEqualAreaRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar azimuthalEqualAreaRaw = (0, _azimuthalJs.azimuthalRaw)(function(cxcy) {\n    return (0, _mathJs.sqrt)(2 / (1 + cxcy));\n});\nazimuthalEqualAreaRaw.invert = (0, _azimuthalJs.azimuthalInvert)(function(z) {\n    return 2 * (0, _mathJs.asin)(z / 2);\n});\nexports.default = function() {\n    return (0, _indexJsDefault.default)(azimuthalEqualAreaRaw).scale(124.75).clipAngle(179.999);\n};\n\n},{\"../math.js\":\"74X19\",\"./azimuthal.js\":\"boRUu\",\"./index.js\":\"cd9OX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"boRUu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"azimuthalRaw\", ()=>azimuthalRaw);\nparcelHelpers.export(exports, \"azimuthalInvert\", ()=>azimuthalInvert);\nvar _mathJs = require(\"../math.js\");\nfunction azimuthalRaw(scale) {\n    return function(x, y) {\n        var cx = (0, _mathJs.cos)(x), cy = (0, _mathJs.cos)(y), k = scale(cx * cy);\n        if (k === Infinity) return [\n            2,\n            0\n        ];\n        return [\n            k * cy * (0, _mathJs.sin)(x),\n            k * (0, _mathJs.sin)(y)\n        ];\n    };\n}\nfunction azimuthalInvert(angle) {\n    return function(x, y) {\n        var z = (0, _mathJs.sqrt)(x * x + y * y), c = angle(z), sc = (0, _mathJs.sin)(c), cc = (0, _mathJs.cos)(c);\n        return [\n            (0, _mathJs.atan2)(x * sc, z * cc),\n            (0, _mathJs.asin)(z && y * sc / z)\n        ];\n    };\n}\n\n},{\"../math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eAR2Q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"azimuthalEquidistantRaw\", ()=>azimuthalEquidistantRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar azimuthalEquidistantRaw = (0, _azimuthalJs.azimuthalRaw)(function(c) {\n    return (c = (0, _mathJs.acos)(c)) && c / (0, _mathJs.sin)(c);\n});\nazimuthalEquidistantRaw.invert = (0, _azimuthalJs.azimuthalInvert)(function(z) {\n    return z;\n});\nexports.default = function() {\n    return (0, _indexJsDefault.default)(azimuthalEquidistantRaw).scale(79.4188).clipAngle(179.999);\n};\n\n},{\"../math.js\":\"74X19\",\"./azimuthal.js\":\"boRUu\",\"./index.js\":\"cd9OX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dhBsj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"conicConformalRaw\", ()=>conicConformalRaw);\nvar _mathJs = require(\"../math.js\");\nvar _conicJs = require(\"./conic.js\");\nvar _mercatorJs = require(\"./mercator.js\");\nfunction tany(y) {\n    return (0, _mathJs.tan)(((0, _mathJs.halfPi) + y) / 2);\n}\nfunction conicConformalRaw(y0, y1) {\n    var cy0 = (0, _mathJs.cos)(y0), n = y0 === y1 ? (0, _mathJs.sin)(y0) : (0, _mathJs.log)(cy0 / (0, _mathJs.cos)(y1)) / (0, _mathJs.log)(tany(y1) / tany(y0)), f = cy0 * (0, _mathJs.pow)(tany(y0), n) / n;\n    if (!n) return 0, _mercatorJs.mercatorRaw;\n    function project(x, y) {\n        if (f > 0) {\n            if (y < -(0, _mathJs.halfPi) + (0, _mathJs.epsilon)) y = -(0, _mathJs.halfPi) + (0, _mathJs.epsilon);\n        } else if (y > (0, _mathJs.halfPi) - (0, _mathJs.epsilon)) y = (0, _mathJs.halfPi) - (0, _mathJs.epsilon);\n        var r = f / (0, _mathJs.pow)(tany(y), n);\n        return [\n            r * (0, _mathJs.sin)(n * x),\n            f - r * (0, _mathJs.cos)(n * x)\n        ];\n    }\n    project.invert = function(x, y) {\n        var fy = f - y, r = (0, _mathJs.sign)(n) * (0, _mathJs.sqrt)(x * x + fy * fy), l = (0, _mathJs.atan2)(x, (0, _mathJs.abs)(fy)) * (0, _mathJs.sign)(fy);\n        if (fy * n < 0) l -= (0, _mathJs.pi) * (0, _mathJs.sign)(x) * (0, _mathJs.sign)(fy);\n        return [\n            l / n,\n            2 * (0, _mathJs.atan)((0, _mathJs.pow)(f / r, 1 / n)) - (0, _mathJs.halfPi)\n        ];\n    };\n    return project;\n}\nexports.default = function() {\n    return (0, _conicJs.conicProjection)(conicConformalRaw).scale(109.5).parallels([\n        30,\n        30\n    ]);\n};\n\n},{\"../math.js\":\"74X19\",\"./conic.js\":\"15g8N\",\"./mercator.js\":\"iIGjZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iIGjZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mercatorRaw\", ()=>mercatorRaw);\nparcelHelpers.export(exports, \"mercatorProjection\", ()=>mercatorProjection);\nvar _mathJs = require(\"../math.js\");\nvar _rotationJs = require(\"../rotation.js\");\nvar _rotationJsDefault = parcelHelpers.interopDefault(_rotationJs);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction mercatorRaw(lambda, phi) {\n    return [\n        lambda,\n        (0, _mathJs.log)((0, _mathJs.tan)(((0, _mathJs.halfPi) + phi) / 2))\n    ];\n}\nmercatorRaw.invert = function(x, y) {\n    return [\n        x,\n        2 * (0, _mathJs.atan)((0, _mathJs.exp)(y)) - (0, _mathJs.halfPi)\n    ];\n};\nexports.default = function() {\n    return mercatorProjection(mercatorRaw).scale(961 / (0, _mathJs.tau));\n};\nfunction mercatorProjection(project) {\n    var m = (0, _indexJsDefault.default)(project), center = m.center, scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, x0 = null, y0, x1, y1; // clip extent\n    m.scale = function(_) {\n        return arguments.length ? (scale(_), reclip()) : scale();\n    };\n    m.translate = function(_) {\n        return arguments.length ? (translate(_), reclip()) : translate();\n    };\n    m.center = function(_) {\n        return arguments.length ? (center(_), reclip()) : center();\n    };\n    m.clipExtent = function(_) {\n        return arguments.length ? (_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reclip()) : x0 == null ? null : [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n    };\n    function reclip() {\n        var k = (0, _mathJs.pi) * scale(), t = m((0, _rotationJsDefault.default)(m.rotate()).invert([\n            0,\n            0\n        ]));\n        return clipExtent(x0 == null ? [\n            [\n                t[0] - k,\n                t[1] - k\n            ],\n            [\n                t[0] + k,\n                t[1] + k\n            ]\n        ] : project === mercatorRaw ? [\n            [\n                Math.max(t[0] - k, x0),\n                y0\n            ],\n            [\n                Math.min(t[0] + k, x1),\n                y1\n            ]\n        ] : [\n            [\n                x0,\n                Math.max(t[1] - k, y0)\n            ],\n            [\n                x1,\n                Math.min(t[1] + k, y1)\n            ]\n        ]);\n    }\n    return reclip();\n}\n\n},{\"../math.js\":\"74X19\",\"../rotation.js\":\"8C7qH\",\"./index.js\":\"cd9OX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6B358\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"conicEquidistantRaw\", ()=>conicEquidistantRaw);\nvar _mathJs = require(\"../math.js\");\nvar _conicJs = require(\"./conic.js\");\nvar _equirectangularJs = require(\"./equirectangular.js\");\nfunction conicEquidistantRaw(y0, y1) {\n    var cy0 = (0, _mathJs.cos)(y0), n = y0 === y1 ? (0, _mathJs.sin)(y0) : (cy0 - (0, _mathJs.cos)(y1)) / (y1 - y0), g = cy0 / n + y0;\n    if ((0, _mathJs.abs)(n) < (0, _mathJs.epsilon)) return 0, _equirectangularJs.equirectangularRaw;\n    function project(x, y) {\n        var gy = g - y, nx = n * x;\n        return [\n            gy * (0, _mathJs.sin)(nx),\n            g - gy * (0, _mathJs.cos)(nx)\n        ];\n    }\n    project.invert = function(x, y) {\n        var gy = g - y, l = (0, _mathJs.atan2)(x, (0, _mathJs.abs)(gy)) * (0, _mathJs.sign)(gy);\n        if (gy * n < 0) l -= (0, _mathJs.pi) * (0, _mathJs.sign)(x) * (0, _mathJs.sign)(gy);\n        return [\n            l / n,\n            g - (0, _mathJs.sign)(n) * (0, _mathJs.sqrt)(x * x + gy * gy)\n        ];\n    };\n    return project;\n}\nexports.default = function() {\n    return (0, _conicJs.conicProjection)(conicEquidistantRaw).scale(131.154).center([\n        0,\n        13.9389\n    ]);\n};\n\n},{\"../math.js\":\"74X19\",\"./conic.js\":\"15g8N\",\"./equirectangular.js\":\"4kEjS\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4kEjS\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"equirectangularRaw\", ()=>equirectangularRaw);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction equirectangularRaw(lambda, phi) {\n    return [\n        lambda,\n        phi\n    ];\n}\nequirectangularRaw.invert = equirectangularRaw;\nexports.default = function() {\n    return (0, _indexJsDefault.default)(equirectangularRaw).scale(152.63);\n};\n\n},{\"./index.js\":\"cd9OX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bMVhy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"equalEarthRaw\", ()=>equalEarthRaw);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _mathJs = require(\"../math.js\");\nvar A1 = 1.340264, A2 = -0.081106, A3 = 0.000893, A4 = 0.003796, M = (0, _mathJs.sqrt)(3) / 2, iterations = 12;\nfunction equalEarthRaw(lambda, phi) {\n    var l = (0, _mathJs.asin)(M * (0, _mathJs.sin)(phi)), l2 = l * l, l6 = l2 * l2 * l2;\n    return [\n        lambda * (0, _mathJs.cos)(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n        l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n    ];\n}\nequalEarthRaw.invert = function(x, y) {\n    var l = y, l2 = l * l, l6 = l2 * l2 * l2;\n    for(var i = 0, delta, fy, fpy; i < iterations; ++i){\n        fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;\n        fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n        l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n        if ((0, _mathJs.abs)(delta) < (0, _mathJs.epsilon2)) break;\n    }\n    return [\n        M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / (0, _mathJs.cos)(l),\n        (0, _mathJs.asin)((0, _mathJs.sin)(l) / M)\n    ];\n};\nexports.default = function() {\n    return (0, _indexJsDefault.default)(equalEarthRaw).scale(177.158);\n};\n\n},{\"./index.js\":\"cd9OX\",\"../math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6bdgO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"gnomonicRaw\", ()=>gnomonicRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction gnomonicRaw(x, y) {\n    var cy = (0, _mathJs.cos)(y), k = (0, _mathJs.cos)(x) * cy;\n    return [\n        cy * (0, _mathJs.sin)(x) / k,\n        (0, _mathJs.sin)(y) / k\n    ];\n}\ngnomonicRaw.invert = (0, _azimuthalJs.azimuthalInvert)((0, _mathJs.atan));\nexports.default = function() {\n    return (0, _indexJsDefault.default)(gnomonicRaw).scale(144.049).clipAngle(60);\n};\n\n},{\"../math.js\":\"74X19\",\"./azimuthal.js\":\"boRUu\",\"./index.js\":\"cd9OX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"huYSV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _rectangleJs = require(\"../clip/rectangle.js\");\nvar _rectangleJsDefault = parcelHelpers.interopDefault(_rectangleJs);\nvar _identityJs = require(\"../identity.js\");\nvar _identityJsDefault = parcelHelpers.interopDefault(_identityJs);\nvar _transformJs = require(\"../transform.js\");\nvar _fitJs = require(\"./fit.js\");\nvar _mathJs = require(\"../math.js\");\nexports.default = function() {\n    var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, alpha = 0, ca, sa, x0 = null, y0, x1, y1, kx = 1, ky = 1, transform = (0, _transformJs.transformer)({\n        point: function(x, y) {\n            var p = projection([\n                x,\n                y\n            ]);\n            this.stream.point(p[0], p[1]);\n        }\n    }), postclip = (0, _identityJsDefault.default), cache, cacheStream;\n    function reset() {\n        kx = k * sx;\n        ky = k * sy;\n        cache = cacheStream = null;\n        return projection;\n    }\n    function projection(p) {\n        var x = p[0] * kx, y = p[1] * ky;\n        if (alpha) {\n            var t = y * ca - x * sa;\n            x = x * ca + y * sa;\n            y = t;\n        }\n        return [\n            x + tx,\n            y + ty\n        ];\n    }\n    projection.invert = function(p) {\n        var x = p[0] - tx, y = p[1] - ty;\n        if (alpha) {\n            var t = y * ca + x * sa;\n            x = x * ca - y * sa;\n            y = t;\n        }\n        return [\n            x / kx,\n            y / ky\n        ];\n    };\n    projection.stream = function(stream) {\n        return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));\n    };\n    projection.postclip = function(_) {\n        return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;\n    };\n    projection.clipExtent = function(_) {\n        return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, _identityJsDefault.default) : (0, _rectangleJsDefault.default)(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [\n            [\n                x0,\n                y0\n            ],\n            [\n                x1,\n                y1\n            ]\n        ];\n    };\n    projection.scale = function(_) {\n        return arguments.length ? (k = +_, reset()) : k;\n    };\n    projection.translate = function(_) {\n        return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [\n            tx,\n            ty\n        ];\n    };\n    projection.angle = function(_) {\n        return arguments.length ? (alpha = _ % 360 * (0, _mathJs.radians), sa = (0, _mathJs.sin)(alpha), ca = (0, _mathJs.cos)(alpha), reset()) : alpha * (0, _mathJs.degrees);\n    };\n    projection.reflectX = function(_) {\n        return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0;\n    };\n    projection.reflectY = function(_) {\n        return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0;\n    };\n    projection.fitExtent = function(extent, object) {\n        return (0, _fitJs.fitExtent)(projection, extent, object);\n    };\n    projection.fitSize = function(size, object) {\n        return (0, _fitJs.fitSize)(projection, size, object);\n    };\n    projection.fitWidth = function(width, object) {\n        return (0, _fitJs.fitWidth)(projection, width, object);\n    };\n    projection.fitHeight = function(height, object) {\n        return (0, _fitJs.fitHeight)(projection, height, object);\n    };\n    return projection;\n};\n\n},{\"../clip/rectangle.js\":\"9kmAt\",\"../identity.js\":\"kub29\",\"../transform.js\":\"9MXXE\",\"./fit.js\":\"49j0j\",\"../math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4AzsZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"naturalEarth1Raw\", ()=>naturalEarth1Raw);\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _mathJs = require(\"../math.js\");\nfunction naturalEarth1Raw(lambda, phi) {\n    var phi2 = phi * phi, phi4 = phi2 * phi2;\n    return [\n        lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),\n        phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))\n    ];\n}\nnaturalEarth1Raw.invert = function(x, y) {\n    var phi = y, i = 25, delta;\n    do {\n        var phi2 = phi * phi, phi4 = phi2 * phi2;\n        phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / (1.007226 + phi2 * (0.045255 + phi4 * (-0.311325 + 0.259866 * phi2 - 0.005916 * 11 * phi4)));\n    }while ((0, _mathJs.abs)(delta) > (0, _mathJs.epsilon) && --i > 0);\n    return [\n        x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),\n        phi\n    ];\n};\nexports.default = function() {\n    return (0, _indexJsDefault.default)(naturalEarth1Raw).scale(175.295);\n};\n\n},{\"./index.js\":\"cd9OX\",\"../math.js\":\"74X19\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kjinQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"orthographicRaw\", ()=>orthographicRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction orthographicRaw(x, y) {\n    return [\n        (0, _mathJs.cos)(y) * (0, _mathJs.sin)(x),\n        (0, _mathJs.sin)(y)\n    ];\n}\northographicRaw.invert = (0, _azimuthalJs.azimuthalInvert)((0, _mathJs.asin));\nexports.default = function() {\n    return (0, _indexJsDefault.default)(orthographicRaw).scale(249.5).clipAngle(90 + (0, _mathJs.epsilon));\n};\n\n},{\"../math.js\":\"74X19\",\"./azimuthal.js\":\"boRUu\",\"./index.js\":\"cd9OX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6ko7r\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"stereographicRaw\", ()=>stereographicRaw);\nvar _mathJs = require(\"../math.js\");\nvar _azimuthalJs = require(\"./azimuthal.js\");\nvar _indexJs = require(\"./index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nfunction stereographicRaw(x, y) {\n    var cy = (0, _mathJs.cos)(y), k = 1 + (0, _mathJs.cos)(x) * cy;\n    return [\n        cy * (0, _mathJs.sin)(x) / k,\n        (0, _mathJs.sin)(y) / k\n    ];\n}\nstereographicRaw.invert = (0, _azimuthalJs.azimuthalInvert)(function(z) {\n    return 2 * (0, _mathJs.atan)(z);\n});\nexports.default = function() {\n    return (0, _indexJsDefault.default)(stereographicRaw).scale(250).clipAngle(142);\n};\n\n},{\"../math.js\":\"74X19\",\"./azimuthal.js\":\"boRUu\",\"./index.js\":\"cd9OX\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i6NVd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"transverseMercatorRaw\", ()=>transverseMercatorRaw);\nvar _mathJs = require(\"../math.js\");\nvar _mercatorJs = require(\"./mercator.js\");\nfunction transverseMercatorRaw(lambda, phi) {\n    return [\n        (0, _mathJs.log)((0, _mathJs.tan)(((0, _mathJs.halfPi) + phi) / 2)),\n        -lambda\n    ];\n}\ntransverseMercatorRaw.invert = function(x, y) {\n    return [\n        -y,\n        2 * (0, _mathJs.atan)((0, _mathJs.exp)(x)) - (0, _mathJs.halfPi)\n    ];\n};\nexports.default = function() {\n    var m = (0, _mercatorJs.mercatorProjection)(transverseMercatorRaw), center = m.center, rotate = m.rotate;\n    m.center = function(_) {\n        return arguments.length ? center([\n            -_[1],\n            _[0]\n        ]) : (_ = center(), [\n            _[1],\n            -_[0]\n        ]);\n    };\n    m.rotate = function(_) {\n        return arguments.length ? rotate([\n            _[0],\n            _[1],\n            _.length > 2 ? _[2] + 90 : 90\n        ]) : (_ = rotate(), [\n            _[0],\n            _[1],\n            _[2] - 90\n        ]);\n    };\n    return rotate([\n        0,\n        0,\n        90\n    ]).scale(159.155);\n};\n\n},{\"../math.js\":\"74X19\",\"./mercator.js\":\"iIGjZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ixW8K\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"geoAiry\", ()=>(0, _airyDefault.default));\nparcelHelpers.export(exports, \"geoAiryRaw\", ()=>(0, _airy.airyRaw));\nparcelHelpers.export(exports, \"geoAitoff\", ()=>(0, _aitoffDefault.default));\nparcelHelpers.export(exports, \"geoAitoffRaw\", ()=>(0, _aitoff.aitoffRaw));\nparcelHelpers.export(exports, \"geoArmadillo\", ()=>(0, _armadilloDefault.default));\nparcelHelpers.export(exports, \"geoArmadilloRaw\", ()=>(0, _armadillo.armadilloRaw));\nparcelHelpers.export(exports, \"geoAugust\", ()=>(0, _augustDefault.default));\nparcelHelpers.export(exports, \"geoAugustRaw\", ()=>(0, _august.augustRaw));\nparcelHelpers.export(exports, \"geoBaker\", ()=>(0, _bakerDefault.default));\nparcelHelpers.export(exports, \"geoBakerRaw\", ()=>(0, _baker.bakerRaw));\nparcelHelpers.export(exports, \"geoBerghaus\", ()=>(0, _berghausDefault.default));\nparcelHelpers.export(exports, \"geoBerghausRaw\", ()=>(0, _berghaus.berghausRaw));\nparcelHelpers.export(exports, \"geoBertin1953\", ()=>(0, _bertinDefault.default));\nparcelHelpers.export(exports, \"geoBertin1953Raw\", ()=>(0, _bertin.bertin1953Raw));\nparcelHelpers.export(exports, \"geoBoggs\", ()=>(0, _boggsDefault.default));\nparcelHelpers.export(exports, \"geoBoggsRaw\", ()=>(0, _boggs.boggsRaw));\nparcelHelpers.export(exports, \"geoBonne\", ()=>(0, _bonneDefault.default));\nparcelHelpers.export(exports, \"geoBonneRaw\", ()=>(0, _bonne.bonneRaw));\nparcelHelpers.export(exports, \"geoBottomley\", ()=>(0, _bottomleyDefault.default));\nparcelHelpers.export(exports, \"geoBottomleyRaw\", ()=>(0, _bottomley.bottomleyRaw));\nparcelHelpers.export(exports, \"geoBromley\", ()=>(0, _bromleyDefault.default));\nparcelHelpers.export(exports, \"geoBromleyRaw\", ()=>(0, _bromley.bromleyRaw));\nparcelHelpers.export(exports, \"geoChamberlin\", ()=>(0, _chamberlinDefault.default));\nparcelHelpers.export(exports, \"geoChamberlinRaw\", ()=>(0, _chamberlin.chamberlinRaw));\nparcelHelpers.export(exports, \"geoChamberlinAfrica\", ()=>(0, _chamberlin.chamberlinAfrica));\nparcelHelpers.export(exports, \"geoCollignon\", ()=>(0, _collignonDefault.default));\nparcelHelpers.export(exports, \"geoCollignonRaw\", ()=>(0, _collignon.collignonRaw));\nparcelHelpers.export(exports, \"geoCraig\", ()=>(0, _craigDefault.default));\nparcelHelpers.export(exports, \"geoCraigRaw\", ()=>(0, _craig.craigRaw));\nparcelHelpers.export(exports, \"geoCraster\", ()=>(0, _crasterDefault.default));\nparcelHelpers.export(exports, \"geoCrasterRaw\", ()=>(0, _craster.crasterRaw));\nparcelHelpers.export(exports, \"geoCylindricalEqualArea\", ()=>(0, _cylindricalEqualAreaDefault.default));\nparcelHelpers.export(exports, \"geoCylindricalEqualAreaRaw\", ()=>(0, _cylindricalEqualArea.cylindricalEqualAreaRaw));\nparcelHelpers.export(exports, \"geoCylindricalStereographic\", ()=>(0, _cylindricalStereographicDefault.default));\nparcelHelpers.export(exports, \"geoCylindricalStereographicRaw\", ()=>(0, _cylindricalStereographic.cylindricalStereographicRaw));\nparcelHelpers.export(exports, \"geoEckert1\", ()=>(0, _eckert1JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert1Raw\", ()=>(0, _eckert1Js.eckert1Raw));\nparcelHelpers.export(exports, \"geoEckert2\", ()=>(0, _eckert2JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert2Raw\", ()=>(0, _eckert2Js.eckert2Raw));\nparcelHelpers.export(exports, \"geoEckert3\", ()=>(0, _eckert3JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert3Raw\", ()=>(0, _eckert3Js.eckert3Raw));\nparcelHelpers.export(exports, \"geoEckert4\", ()=>(0, _eckert4JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert4Raw\", ()=>(0, _eckert4Js.eckert4Raw));\nparcelHelpers.export(exports, \"geoEckert5\", ()=>(0, _eckert5JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert5Raw\", ()=>(0, _eckert5Js.eckert5Raw));\nparcelHelpers.export(exports, \"geoEckert6\", ()=>(0, _eckert6JsDefault.default));\nparcelHelpers.export(exports, \"geoEckert6Raw\", ()=>(0, _eckert6Js.eckert6Raw));\nparcelHelpers.export(exports, \"geoEisenlohr\", ()=>(0, _eisenlohrJsDefault.default));\nparcelHelpers.export(exports, \"geoEisenlohrRaw\", ()=>(0, _eisenlohrJs.eisenlohrRaw));\nparcelHelpers.export(exports, \"geoFahey\", ()=>(0, _faheyJsDefault.default));\nparcelHelpers.export(exports, \"geoFaheyRaw\", ()=>(0, _faheyJs.faheyRaw));\nparcelHelpers.export(exports, \"geoFoucaut\", ()=>(0, _foucautJsDefault.default));\nparcelHelpers.export(exports, \"geoFoucautRaw\", ()=>(0, _foucautJs.foucautRaw));\nparcelHelpers.export(exports, \"geoFoucautSinusoidal\", ()=>(0, _foucautSinusoidalJsDefault.default));\nparcelHelpers.export(exports, \"geoFoucautSinusoidalRaw\", ()=>(0, _foucautSinusoidalJs.foucautSinusoidalRaw));\nparcelHelpers.export(exports, \"geoGilbert\", ()=>(0, _gilbertJsDefault.default));\nparcelHelpers.export(exports, \"geoGingery\", ()=>(0, _gingeryJsDefault.default));\nparcelHelpers.export(exports, \"geoGingeryRaw\", ()=>(0, _gingeryJs.gingeryRaw));\nparcelHelpers.export(exports, \"geoGinzburg4\", ()=>(0, _ginzburg4JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg4Raw\", ()=>(0, _ginzburg4Js.ginzburg4Raw));\nparcelHelpers.export(exports, \"geoGinzburg5\", ()=>(0, _ginzburg5JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg5Raw\", ()=>(0, _ginzburg5Js.ginzburg5Raw));\nparcelHelpers.export(exports, \"geoGinzburg6\", ()=>(0, _ginzburg6JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg6Raw\", ()=>(0, _ginzburg6Js.ginzburg6Raw));\nparcelHelpers.export(exports, \"geoGinzburg8\", ()=>(0, _ginzburg8JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg8Raw\", ()=>(0, _ginzburg8Js.ginzburg8Raw));\nparcelHelpers.export(exports, \"geoGinzburg9\", ()=>(0, _ginzburg9JsDefault.default));\nparcelHelpers.export(exports, \"geoGinzburg9Raw\", ()=>(0, _ginzburg9Js.ginzburg9Raw));\nparcelHelpers.export(exports, \"geoGringorten\", ()=>(0, _gringortenJsDefault.default));\nparcelHelpers.export(exports, \"geoGringortenRaw\", ()=>(0, _gringortenJs.gringortenRaw));\nparcelHelpers.export(exports, \"geoGuyou\", ()=>(0, _guyouJsDefault.default));\nparcelHelpers.export(exports, \"geoGuyouRaw\", ()=>(0, _guyouJs.guyouRaw));\nparcelHelpers.export(exports, \"geoHammer\", ()=>(0, _hammerJsDefault.default));\nparcelHelpers.export(exports, \"geoHammerRaw\", ()=>(0, _hammerJs.hammerRaw));\nparcelHelpers.export(exports, \"geoHammerRetroazimuthal\", ()=>(0, _hammerRetroazimuthalJsDefault.default));\nparcelHelpers.export(exports, \"geoHammerRetroazimuthalRaw\", ()=>(0, _hammerRetroazimuthalJs.hammerRetroazimuthalRaw));\nparcelHelpers.export(exports, \"geoHealpix\", ()=>(0, _healpixJsDefault.default));\nparcelHelpers.export(exports, \"geoHealpixRaw\", ()=>(0, _healpixJs.healpixRaw));\nparcelHelpers.export(exports, \"geoHill\", ()=>(0, _hillJsDefault.default));\nparcelHelpers.export(exports, \"geoHillRaw\", ()=>(0, _hillJs.hillRaw));\nparcelHelpers.export(exports, \"geoHomolosine\", ()=>(0, _homolosineJsDefault.default));\nparcelHelpers.export(exports, \"geoHomolosineRaw\", ()=>(0, _homolosineJs.homolosineRaw));\nparcelHelpers.export(exports, \"geoHufnagel\", ()=>(0, _hufnagelJsDefault.default));\nparcelHelpers.export(exports, \"geoHufnagelRaw\", ()=>(0, _hufnagelJs.hufnagelRaw));\nparcelHelpers.export(exports, \"geoHyperelliptical\", ()=>(0, _hyperellipticalDefault.default));\nparcelHelpers.export(exports, \"geoHyperellipticalRaw\", ()=>(0, _hyperelliptical.hyperellipticalRaw));\nparcelHelpers.export(exports, \"geoInterrupt\", ()=>(0, _indexDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedBoggs\", ()=>(0, _boggsDefault1.default));\nparcelHelpers.export(exports, \"geoInterruptedHomolosine\", ()=>(0, _homolosineDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedMollweide\", ()=>(0, _mollweideDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedMollweideHemispheres\", ()=>(0, _mollweideHemispheresDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedSinuMollweide\", ()=>(0, _sinuMollweideDefault.default));\nparcelHelpers.export(exports, \"geoInterruptedSinusoidal\", ()=>(0, _sinusoidalDefault.default));\nparcelHelpers.export(exports, \"geoKavrayskiy7\", ()=>(0, _kavrayskiy7JsDefault.default));\nparcelHelpers.export(exports, \"geoKavrayskiy7Raw\", ()=>(0, _kavrayskiy7Js.kavrayskiy7Raw));\nparcelHelpers.export(exports, \"geoLagrange\", ()=>(0, _lagrangeJsDefault.default));\nparcelHelpers.export(exports, \"geoLagrangeRaw\", ()=>(0, _lagrangeJs.lagrangeRaw));\nparcelHelpers.export(exports, \"geoLarrivee\", ()=>(0, _larriveeDefault.default));\nparcelHelpers.export(exports, \"geoLarriveeRaw\", ()=>(0, _larrivee.larriveeRaw));\nparcelHelpers.export(exports, \"geoLaskowski\", ()=>(0, _laskowskiDefault.default));\nparcelHelpers.export(exports, \"geoLaskowskiRaw\", ()=>(0, _laskowski.laskowskiRaw));\nparcelHelpers.export(exports, \"geoLittrow\", ()=>(0, _littrowJsDefault.default));\nparcelHelpers.export(exports, \"geoLittrowRaw\", ()=>(0, _littrowJs.littrowRaw));\nparcelHelpers.export(exports, \"geoLoximuthal\", ()=>(0, _loximuthalJsDefault.default));\nparcelHelpers.export(exports, \"geoLoximuthalRaw\", ()=>(0, _loximuthalJs.loximuthalRaw));\nparcelHelpers.export(exports, \"geoMiller\", ()=>(0, _millerDefault.default));\nparcelHelpers.export(exports, \"geoMillerRaw\", ()=>(0, _miller.millerRaw));\nparcelHelpers.export(exports, \"geoModifiedStereographic\", ()=>(0, _modifiedStereographicDefault.default));\nparcelHelpers.export(exports, \"geoModifiedStereographicRaw\", ()=>(0, _modifiedStereographic.modifiedStereographicRaw));\nparcelHelpers.export(exports, \"geoModifiedStereographicAlaska\", ()=>(0, _modifiedStereographic.modifiedStereographicAlaska));\nparcelHelpers.export(exports, \"geoModifiedStereographicGs48\", ()=>(0, _modifiedStereographic.modifiedStereographicGs48));\nparcelHelpers.export(exports, \"geoModifiedStereographicGs50\", ()=>(0, _modifiedStereographic.modifiedStereographicGs50));\nparcelHelpers.export(exports, \"geoModifiedStereographicMiller\", ()=>(0, _modifiedStereographic.modifiedStereographicMiller));\nparcelHelpers.export(exports, \"geoModifiedStereographicLee\", ()=>(0, _modifiedStereographic.modifiedStereographicLee));\nparcelHelpers.export(exports, \"geoMollweide\", ()=>(0, _mollweideDefault1.default));\nparcelHelpers.export(exports, \"geoMollweideRaw\", ()=>(0, _mollweide1.mollweideRaw));\nparcelHelpers.export(exports, \"geoMtFlatPolarParabolic\", ()=>(0, _mtFlatPolarParabolicDefault.default));\nparcelHelpers.export(exports, \"geoMtFlatPolarParabolicRaw\", ()=>(0, _mtFlatPolarParabolic.mtFlatPolarParabolicRaw));\nparcelHelpers.export(exports, \"geoMtFlatPolarQuartic\", ()=>(0, _mtFlatPolarQuarticDefault.default));\nparcelHelpers.export(exports, \"geoMtFlatPolarQuarticRaw\", ()=>(0, _mtFlatPolarQuartic.mtFlatPolarQuarticRaw));\nparcelHelpers.export(exports, \"geoMtFlatPolarSinusoidal\", ()=>(0, _mtFlatPolarSinusoidalDefault.default));\nparcelHelpers.export(exports, \"geoMtFlatPolarSinusoidalRaw\", ()=>(0, _mtFlatPolarSinusoidal.mtFlatPolarSinusoidalRaw));\nparcelHelpers.export(exports, \"geoNaturalEarth2\", ()=>(0, _naturalEarth2Default.default));\nparcelHelpers.export(exports, \"geoNaturalEarth2Raw\", ()=>(0, _naturalEarth2.naturalEarth2Raw));\nparcelHelpers.export(exports, \"geoNellHammer\", ()=>(0, _nellHammerDefault.default));\nparcelHelpers.export(exports, \"geoNellHammerRaw\", ()=>(0, _nellHammer.nellHammerRaw));\nparcelHelpers.export(exports, \"geoInterruptedQuarticAuthalic\", ()=>(0, _quarticAuthalicDefault.default));\nparcelHelpers.export(exports, \"geoNicolosi\", ()=>(0, _nicolosiDefault.default));\nparcelHelpers.export(exports, \"geoNicolosiRaw\", ()=>(0, _nicolosi.nicolosiRaw));\nparcelHelpers.export(exports, \"geoPatterson\", ()=>(0, _pattersonDefault.default));\nparcelHelpers.export(exports, \"geoPattersonRaw\", ()=>(0, _patterson.pattersonRaw));\nparcelHelpers.export(exports, \"geoPolyconic\", ()=>(0, _polyconicDefault.default));\nparcelHelpers.export(exports, \"geoPolyconicRaw\", ()=>(0, _polyconic.polyconicRaw));\nparcelHelpers.export(exports, \"geoPolyhedral\", ()=>(0, _indexJsDefault.default));\nparcelHelpers.export(exports, \"geoPolyhedralButterfly\", ()=>(0, _butterflyJsDefault.default));\nparcelHelpers.export(exports, \"geoPolyhedralCollignon\", ()=>(0, _collignonJsDefault.default));\nparcelHelpers.export(exports, \"geoPolyhedralWaterman\", ()=>(0, _watermanJsDefault.default));\nparcelHelpers.export(exports, \"geoProject\", ()=>(0, _indexDefault1.default));\nparcelHelpers.export(exports, \"geoGringortenQuincuncial\", ()=>(0, _gringortenJsDefault1.default));\nparcelHelpers.export(exports, \"geoPeirceQuincuncial\", ()=>(0, _peirceJsDefault.default));\nparcelHelpers.export(exports, \"geoQuantize\", ()=>(0, _quantizeDefault.default));\nparcelHelpers.export(exports, \"geoQuincuncial\", ()=>(0, _indexJsDefault1.default));\nparcelHelpers.export(exports, \"geoRectangularPolyconic\", ()=>(0, _rectangularPolyconicDefault.default));\nparcelHelpers.export(exports, \"geoRectangularPolyconicRaw\", ()=>(0, _rectangularPolyconic.rectangularPolyconicRaw));\nparcelHelpers.export(exports, \"geoRobinson\", ()=>(0, _robinsonDefault.default));\nparcelHelpers.export(exports, \"geoRobinsonRaw\", ()=>(0, _robinson.robinsonRaw));\nparcelHelpers.export(exports, \"geoSatellite\", ()=>(0, _satelliteDefault.default));\nparcelHelpers.export(exports, \"geoSatelliteRaw\", ()=>(0, _satellite.satelliteRaw));\nparcelHelpers.export(exports, \"geoSinuMollweide\", ()=>(0, _sinuMollweideDefault1.default));\nparcelHelpers.export(exports, \"geoSinuMollweideRaw\", ()=>(0, _sinuMollweide1.sinuMollweideRaw));\nparcelHelpers.export(exports, \"geoSinusoidal\", ()=>(0, _sinusoidalDefault1.default));\nparcelHelpers.export(exports, \"geoSinusoidalRaw\", ()=>(0, _sinusoidal1.sinusoidalRaw));\nparcelHelpers.export(exports, \"geoStitch\", ()=>(0, _stitchDefault.default));\nparcelHelpers.export(exports, \"geoTimes\", ()=>(0, _timesDefault.default));\nparcelHelpers.export(exports, \"geoTimesRaw\", ()=>(0, _times.timesRaw));\nparcelHelpers.export(exports, \"geoTwoPointAzimuthal\", ()=>(0, _twoPointAzimuthalDefault.default));\nparcelHelpers.export(exports, \"geoTwoPointAzimuthalRaw\", ()=>(0, _twoPointAzimuthal.twoPointAzimuthalRaw));\nparcelHelpers.export(exports, \"geoTwoPointAzimuthalUsa\", ()=>(0, _twoPointAzimuthal.twoPointAzimuthalUsa));\nparcelHelpers.export(exports, \"geoTwoPointEquidistant\", ()=>(0, _twoPointEquidistantDefault.default));\nparcelHelpers.export(exports, \"geoTwoPointEquidistantRaw\", ()=>(0, _twoPointEquidistant.twoPointEquidistantRaw));\nparcelHelpers.export(exports, \"geoTwoPointEquidistantUsa\", ()=>(0, _twoPointEquidistant.twoPointEquidistantUsa));\nparcelHelpers.export(exports, \"geoVanDerGrinten\", ()=>(0, _vanDerGrintenDefault.default));\nparcelHelpers.export(exports, \"geoVanDerGrintenRaw\", ()=>(0, _vanDerGrinten.vanDerGrintenRaw));\nparcelHelpers.export(exports, \"geoVanDerGrinten2\", ()=>(0, _vanDerGrinten2Default.default));\nparcelHelpers.export(exports, \"geoVanDerGrinten2Raw\", ()=>(0, _vanDerGrinten2.vanDerGrinten2Raw));\nparcelHelpers.export(exports, \"geoVanDerGrinten3\", ()=>(0, _vanDerGrinten3Default.default));\nparcelHelpers.export(exports, \"geoVanDerGrinten3Raw\", ()=>(0, _vanDerGrinten3.vanDerGrinten3Raw));\nparcelHelpers.export(exports, \"geoVanDerGrinten4\", ()=>(0, _vanDerGrinten4Default.default));\nparcelHelpers.export(exports, \"geoVanDerGrinten4Raw\", ()=>(0, _vanDerGrinten4.vanDerGrinten4Raw));\nparcelHelpers.export(exports, \"geoWagner\", ()=>(0, _wagnerJsDefault.default));\nparcelHelpers.export(exports, \"geoWagner7\", ()=>(0, _wagnerJs.wagner7));\nparcelHelpers.export(exports, \"geoWagnerRaw\", ()=>(0, _wagnerJs.wagnerRaw));\nparcelHelpers.export(exports, \"geoWagner4\", ()=>(0, _wagner4JsDefault.default));\nparcelHelpers.export(exports, \"geoWagner4Raw\", ()=>(0, _wagner4Js.wagner4Raw));\nparcelHelpers.export(exports, \"geoWagner6\", ()=>(0, _wagner6JsDefault.default));\nparcelHelpers.export(exports, \"geoWagner6Raw\", ()=>(0, _wagner6Js.wagner6Raw));\nparcelHelpers.export(exports, \"geoWiechel\", ()=>(0, _wiechelJsDefault.default));\nparcelHelpers.export(exports, \"geoWiechelRaw\", ()=>(0, _wiechelJs.wiechelRaw));\nparcelHelpers.export(exports, \"geoWinkel3\", ()=>(0, _winkel3Default.default));\nparcelHelpers.export(exports, \"geoWinkel3Raw\", ()=>(0, _winkel3.winkel3Raw));\nvar _airy = require(\"./airy\");\nvar _airyDefault = parcelHelpers.interopDefault(_airy);\nvar _aitoff = require(\"./aitoff\");\nvar _aitoffDefault = parcelHelpers.interopDefault(_aitoff);\nvar _armadillo = require(\"./armadillo\");\nvar _armadilloDefault = parcelHelpers.interopDefault(_armadillo);\nvar _august = require(\"./august\");\nvar _augustDefault = parcelHelpers.interopDefault(_august);\nvar _baker = require(\"./baker\");\nvar _bakerDefault = parcelHelpers.interopDefault(_baker);\nvar _berghaus = require(\"./berghaus\");\nvar _berghausDefault = parcelHelpers.interopDefault(_berghaus);\nvar _bertin = require(\"./bertin\");\nvar _bertinDefault = parcelHelpers.interopDefault(_bertin);\nvar _boggs = require(\"./boggs\");\nvar _boggsDefault = parcelHelpers.interopDefault(_boggs);\nvar _bonne = require(\"./bonne\");\nvar _bonneDefault = parcelHelpers.interopDefault(_bonne);\nvar _bottomley = require(\"./bottomley\");\nvar _bottomleyDefault = parcelHelpers.interopDefault(_bottomley);\nvar _bromley = require(\"./bromley\");\nvar _bromleyDefault = parcelHelpers.interopDefault(_bromley);\nvar _chamberlin = require(\"./chamberlin\");\nvar _chamberlinDefault = parcelHelpers.interopDefault(_chamberlin);\nvar _collignon = require(\"./collignon\");\nvar _collignonDefault = parcelHelpers.interopDefault(_collignon);\nvar _craig = require(\"./craig\");\nvar _craigDefault = parcelHelpers.interopDefault(_craig);\nvar _craster = require(\"./craster\");\nvar _crasterDefault = parcelHelpers.interopDefault(_craster);\nvar _cylindricalEqualArea = require(\"./cylindricalEqualArea\");\nvar _cylindricalEqualAreaDefault = parcelHelpers.interopDefault(_cylindricalEqualArea);\nvar _cylindricalStereographic = require(\"./cylindricalStereographic\");\nvar _cylindricalStereographicDefault = parcelHelpers.interopDefault(_cylindricalStereographic);\nvar _eckert1Js = require(\"./eckert1.js\");\nvar _eckert1JsDefault = parcelHelpers.interopDefault(_eckert1Js);\nvar _eckert2Js = require(\"./eckert2.js\");\nvar _eckert2JsDefault = parcelHelpers.interopDefault(_eckert2Js);\nvar _eckert3Js = require(\"./eckert3.js\");\nvar _eckert3JsDefault = parcelHelpers.interopDefault(_eckert3Js);\nvar _eckert4Js = require(\"./eckert4.js\");\nvar _eckert4JsDefault = parcelHelpers.interopDefault(_eckert4Js);\nvar _eckert5Js = require(\"./eckert5.js\");\nvar _eckert5JsDefault = parcelHelpers.interopDefault(_eckert5Js);\nvar _eckert6Js = require(\"./eckert6.js\");\nvar _eckert6JsDefault = parcelHelpers.interopDefault(_eckert6Js);\nvar _eisenlohrJs = require(\"./eisenlohr.js\");\nvar _eisenlohrJsDefault = parcelHelpers.interopDefault(_eisenlohrJs);\nvar _faheyJs = require(\"./fahey.js\");\nvar _faheyJsDefault = parcelHelpers.interopDefault(_faheyJs);\nvar _foucautJs = require(\"./foucaut.js\");\nvar _foucautJsDefault = parcelHelpers.interopDefault(_foucautJs);\nvar _foucautSinusoidalJs = require(\"./foucautSinusoidal.js\");\nvar _foucautSinusoidalJsDefault = parcelHelpers.interopDefault(_foucautSinusoidalJs);\nvar _gilbertJs = require(\"./gilbert.js\");\nvar _gilbertJsDefault = parcelHelpers.interopDefault(_gilbertJs);\nvar _gingeryJs = require(\"./gingery.js\");\nvar _gingeryJsDefault = parcelHelpers.interopDefault(_gingeryJs);\nvar _ginzburg4Js = require(\"./ginzburg4.js\");\nvar _ginzburg4JsDefault = parcelHelpers.interopDefault(_ginzburg4Js);\nvar _ginzburg5Js = require(\"./ginzburg5.js\");\nvar _ginzburg5JsDefault = parcelHelpers.interopDefault(_ginzburg5Js);\nvar _ginzburg6Js = require(\"./ginzburg6.js\");\nvar _ginzburg6JsDefault = parcelHelpers.interopDefault(_ginzburg6Js);\nvar _ginzburg8Js = require(\"./ginzburg8.js\");\nvar _ginzburg8JsDefault = parcelHelpers.interopDefault(_ginzburg8Js);\nvar _ginzburg9Js = require(\"./ginzburg9.js\");\nvar _ginzburg9JsDefault = parcelHelpers.interopDefault(_ginzburg9Js);\nvar _gringortenJs = require(\"./gringorten.js\");\nvar _gringortenJsDefault = parcelHelpers.interopDefault(_gringortenJs);\nvar _guyouJs = require(\"./guyou.js\");\nvar _guyouJsDefault = parcelHelpers.interopDefault(_guyouJs);\nvar _hammerJs = require(\"./hammer.js\");\nvar _hammerJsDefault = parcelHelpers.interopDefault(_hammerJs);\nvar _hammerRetroazimuthalJs = require(\"./hammerRetroazimuthal.js\");\nvar _hammerRetroazimuthalJsDefault = parcelHelpers.interopDefault(_hammerRetroazimuthalJs);\nvar _healpixJs = require(\"./healpix.js\");\nvar _healpixJsDefault = parcelHelpers.interopDefault(_healpixJs);\nvar _hillJs = require(\"./hill.js\");\nvar _hillJsDefault = parcelHelpers.interopDefault(_hillJs);\nvar _homolosineJs = require(\"./homolosine.js\");\nvar _homolosineJsDefault = parcelHelpers.interopDefault(_homolosineJs);\nvar _hufnagelJs = require(\"./hufnagel.js\");\nvar _hufnagelJsDefault = parcelHelpers.interopDefault(_hufnagelJs);\nvar _hyperelliptical = require(\"./hyperelliptical\");\nvar _hyperellipticalDefault = parcelHelpers.interopDefault(_hyperelliptical);\nvar _index = require(\"./interrupted/index\");\nvar _indexDefault = parcelHelpers.interopDefault(_index);\nvar _boggs1 = require(\"./interrupted/boggs\");\nvar _boggsDefault1 = parcelHelpers.interopDefault(_boggs1);\nvar _homolosine = require(\"./interrupted/homolosine\");\nvar _homolosineDefault = parcelHelpers.interopDefault(_homolosine);\nvar _mollweide = require(\"./interrupted/mollweide\");\nvar _mollweideDefault = parcelHelpers.interopDefault(_mollweide);\nvar _mollweideHemispheres = require(\"./interrupted/mollweideHemispheres\");\nvar _mollweideHemispheresDefault = parcelHelpers.interopDefault(_mollweideHemispheres);\nvar _sinuMollweide = require(\"./interrupted/sinuMollweide\");\nvar _sinuMollweideDefault = parcelHelpers.interopDefault(_sinuMollweide);\nvar _sinusoidal = require(\"./interrupted/sinusoidal\");\nvar _sinusoidalDefault = parcelHelpers.interopDefault(_sinusoidal);\nvar _kavrayskiy7Js = require(\"./kavrayskiy7.js\");\nvar _kavrayskiy7JsDefault = parcelHelpers.interopDefault(_kavrayskiy7Js);\nvar _lagrangeJs = require(\"./lagrange.js\");\nvar _lagrangeJsDefault = parcelHelpers.interopDefault(_lagrangeJs);\nvar _larrivee = require(\"./larrivee\");\nvar _larriveeDefault = parcelHelpers.interopDefault(_larrivee);\nvar _laskowski = require(\"./laskowski\");\nvar _laskowskiDefault = parcelHelpers.interopDefault(_laskowski);\nvar _littrowJs = require(\"./littrow.js\");\nvar _littrowJsDefault = parcelHelpers.interopDefault(_littrowJs);\nvar _loximuthalJs = require(\"./loximuthal.js\");\nvar _loximuthalJsDefault = parcelHelpers.interopDefault(_loximuthalJs);\nvar _miller = require(\"./miller\");\nvar _millerDefault = parcelHelpers.interopDefault(_miller);\nvar _modifiedStereographic = require(\"./modifiedStereographic\");\nvar _modifiedStereographicDefault = parcelHelpers.interopDefault(_modifiedStereographic);\nvar _mollweide1 = require(\"./mollweide\");\nvar _mollweideDefault1 = parcelHelpers.interopDefault(_mollweide1);\nvar _mtFlatPolarParabolic = require(\"./mtFlatPolarParabolic\");\nvar _mtFlatPolarParabolicDefault = parcelHelpers.interopDefault(_mtFlatPolarParabolic);\nvar _mtFlatPolarQuartic = require(\"./mtFlatPolarQuartic\");\nvar _mtFlatPolarQuarticDefault = parcelHelpers.interopDefault(_mtFlatPolarQuartic);\nvar _mtFlatPolarSinusoidal = require(\"./mtFlatPolarSinusoidal\");\nvar _mtFlatPolarSinusoidalDefault = parcelHelpers.interopDefault(_mtFlatPolarSinusoidal);\nvar _naturalEarth2 = require(\"./naturalEarth2\");\nvar _naturalEarth2Default = parcelHelpers.interopDefault(_naturalEarth2);\nvar _nellHammer = require(\"./nellHammer\");\nvar _nellHammerDefault = parcelHelpers.interopDefault(_nellHammer);\nvar _quarticAuthalic = require(\"./interrupted/quarticAuthalic\");\nvar _quarticAuthalicDefault = parcelHelpers.interopDefault(_quarticAuthalic);\nvar _nicolosi = require(\"./nicolosi\");\nvar _nicolosiDefault = parcelHelpers.interopDefault(_nicolosi);\nvar _patterson = require(\"./patterson\");\nvar _pattersonDefault = parcelHelpers.interopDefault(_patterson);\nvar _polyconic = require(\"./polyconic\");\nvar _polyconicDefault = parcelHelpers.interopDefault(_polyconic);\nvar _indexJs = require(\"./polyhedral/index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _butterflyJs = require(\"./polyhedral/butterfly.js\");\nvar _butterflyJsDefault = parcelHelpers.interopDefault(_butterflyJs);\nvar _collignonJs = require(\"./polyhedral/collignon.js\");\nvar _collignonJsDefault = parcelHelpers.interopDefault(_collignonJs);\nvar _watermanJs = require(\"./polyhedral/waterman.js\");\nvar _watermanJsDefault = parcelHelpers.interopDefault(_watermanJs);\nvar _index1 = require(\"./project/index\");\nvar _indexDefault1 = parcelHelpers.interopDefault(_index1);\nvar _gringortenJs1 = require(\"./quincuncial/gringorten.js\");\nvar _gringortenJsDefault1 = parcelHelpers.interopDefault(_gringortenJs1);\nvar _peirceJs = require(\"./quincuncial/peirce.js\");\nvar _peirceJsDefault = parcelHelpers.interopDefault(_peirceJs);\nvar _quantize = require(\"./quantize\");\nvar _quantizeDefault = parcelHelpers.interopDefault(_quantize);\nvar _indexJs1 = require(\"./quincuncial/index.js\");\nvar _indexJsDefault1 = parcelHelpers.interopDefault(_indexJs1);\nvar _rectangularPolyconic = require(\"./rectangularPolyconic\");\nvar _rectangularPolyconicDefault = parcelHelpers.interopDefault(_rectangularPolyconic);\nvar _robinson = require(\"./robinson\");\nvar _robinsonDefault = parcelHelpers.interopDefault(_robinson);\nvar _satellite = require(\"./satellite\");\nvar _satelliteDefault = parcelHelpers.interopDefault(_satellite);\nvar _sinuMollweide1 = require(\"./sinuMollweide\");\nvar _sinuMollweideDefault1 = parcelHelpers.interopDefault(_sinuMollweide1);\nvar _sinusoidal1 = require(\"./sinusoidal\");\nvar _sinusoidalDefault1 = parcelHelpers.interopDefault(_sinusoidal1);\nvar _stitch = require(\"./stitch\");\nvar _stitchDefault = parcelHelpers.interopDefault(_stitch);\nvar _times = require(\"./times\");\nvar _timesDefault = parcelHelpers.interopDefault(_times);\nvar _twoPointAzimuthal = require(\"./twoPointAzimuthal\");\nvar _twoPointAzimuthalDefault = parcelHelpers.interopDefault(_twoPointAzimuthal);\nvar _twoPointEquidistant = require(\"./twoPointEquidistant\");\nvar _twoPointEquidistantDefault = parcelHelpers.interopDefault(_twoPointEquidistant);\nvar _vanDerGrinten = require(\"./vanDerGrinten\");\nvar _vanDerGrintenDefault = parcelHelpers.interopDefault(_vanDerGrinten);\nvar _vanDerGrinten2 = require(\"./vanDerGrinten2\");\nvar _vanDerGrinten2Default = parcelHelpers.interopDefault(_vanDerGrinten2);\nvar _vanDerGrinten3 = require(\"./vanDerGrinten3\");\nvar _vanDerGrinten3Default = parcelHelpers.interopDefault(_vanDerGrinten3);\nvar _vanDerGrinten4 = require(\"./vanDerGrinten4\");\nvar _vanDerGrinten4Default = parcelHelpers.interopDefault(_vanDerGrinten4);\nvar _wagnerJs = require(\"./wagner.js\");\nvar _wagnerJsDefault = parcelHelpers.interopDefault(_wagnerJs);\nvar _wagner4Js = require(\"./wagner4.js\");\nvar _wagner4JsDefault = parcelHelpers.interopDefault(_wagner4Js);\nvar _wagner6Js = require(\"./wagner6.js\");\nvar _wagner6JsDefault = parcelHelpers.interopDefault(_wagner6Js);\nvar _wiechelJs = require(\"./wiechel.js\");\nvar _wiechelJsDefault = parcelHelpers.interopDefault(_wiechelJs);\nvar _winkel3 = require(\"./winkel3\");\nvar _winkel3Default = parcelHelpers.interopDefault(_winkel3);\n\n},{\"./airy\":false,\"./aitoff\":false,\"./armadillo\":false,\"./august\":false,\"./baker\":false,\"./berghaus\":false,\"./bertin\":false,\"./boggs\":false,\"./bonne\":false,\"./bottomley\":false,\"./bromley\":false,\"./chamberlin\":false,\"./collignon\":false,\"./craig\":false,\"./craster\":false,\"./cylindricalEqualArea\":false,\"./cylindricalStereographic\":false,\"./eckert1.js\":false,\"./eckert2.js\":false,\"./eckert3.js\":false,\"./eckert4.js\":false,\"./eckert5.js\":false,\"./eckert6.js\":false,\"./eisenlohr.js\":false,\"./fahey.js\":false,\"./foucaut.js\":false,\"./foucautSinusoidal.js\":false,\"./gilbert.js\":false,\"./gingery.js\":false,\"./ginzburg4.js\":false,\"./ginzburg5.js\":false,\"./ginzburg6.js\":false,\"./ginzburg8.js\":false,\"./ginzburg9.js\":false,\"./gringorten.js\":false,\"./guyou.js\":false,\"./hammer.js\":false,\"./hammerRetroazimuthal.js\":false,\"./healpix.js\":false,\"./hill.js\":false,\"./homolosine.js\":false,\"./hufnagel.js\":false,\"./hyperelliptical\":false,\"./interrupted/index\":false,\"./interrupted/boggs\":false,\"./interrupted/homolosine\":false,\"./interrupted/mollweide\":false,\"./interrupted/mollweideHemispheres\":false,\"./interrupted/sinuMollweide\":false,\"./interrupted/sinusoidal\":false,\"./kavrayskiy7.js\":false,\"./lagrange.js\":false,\"./larrivee\":false,\"./laskowski\":false,\"./littrow.js\":false,\"./loximuthal.js\":false,\"./miller\":false,\"./modifiedStereographic\":false,\"./mollweide\":\"dkpmT\",\"./mtFlatPolarParabolic\":false,\"./mtFlatPolarQuartic\":false,\"./mtFlatPolarSinusoidal\":false,\"./naturalEarth2\":false,\"./nellHammer\":false,\"./interrupted/quarticAuthalic\":false,\"./nicolosi\":false,\"./patterson\":false,\"./polyconic\":false,\"./polyhedral/index.js\":false,\"./polyhedral/butterfly.js\":false,\"./polyhedral/collignon.js\":false,\"./polyhedral/waterman.js\":false,\"./project/index\":false,\"./quincuncial/gringorten.js\":false,\"./quincuncial/peirce.js\":false,\"./quantize\":false,\"./quincuncial/index.js\":false,\"./rectangularPolyconic\":false,\"./robinson\":false,\"./satellite\":false,\"./sinuMollweide\":false,\"./sinusoidal\":false,\"./stitch\":false,\"./times\":false,\"./twoPointAzimuthal\":false,\"./twoPointEquidistant\":false,\"./vanDerGrinten\":false,\"./vanDerGrinten2\":false,\"./vanDerGrinten3\":false,\"./vanDerGrinten4\":false,\"./wagner.js\":false,\"./wagner4.js\":false,\"./wagner6.js\":false,\"./wiechel.js\":false,\"./winkel3\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dkpmT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"mollweideBromleyTheta\", ()=>mollweideBromleyTheta);\nparcelHelpers.export(exports, \"mollweideBromleyRaw\", ()=>mollweideBromleyRaw);\nparcelHelpers.export(exports, \"mollweideRaw\", ()=>mollweideRaw);\nvar _d3Geo = require(\"d3-geo\");\nvar _mathJs = require(\"./math.js\");\nfunction mollweideBromleyTheta(cp, phi) {\n    var cpsinPhi = cp * (0, _mathJs.sin)(phi), i = 30, delta;\n    do phi -= delta = (phi + (0, _mathJs.sin)(phi) - cpsinPhi) / (1 + (0, _mathJs.cos)(phi));\n    while ((0, _mathJs.abs)(delta) > (0, _mathJs.epsilon) && --i > 0);\n    return phi / 2;\n}\nfunction mollweideBromleyRaw(cx, cy, cp) {\n    function forward(lambda, phi) {\n        return [\n            cx * lambda * (0, _mathJs.cos)(phi = mollweideBromleyTheta(cp, phi)),\n            cy * (0, _mathJs.sin)(phi)\n        ];\n    }\n    forward.invert = function(x, y) {\n        return y = (0, _mathJs.asin)(y / cy), [\n            x / (cx * (0, _mathJs.cos)(y)),\n            (0, _mathJs.asin)((2 * y + (0, _mathJs.sin)(2 * y)) / cp)\n        ];\n    };\n    return forward;\n}\nvar mollweideRaw = mollweideBromleyRaw((0, _mathJs.sqrt2) / (0, _mathJs.halfPi), (0, _mathJs.sqrt2), (0, _mathJs.pi));\nexports.default = function() {\n    return (0, _d3Geo.geoProjection)(mollweideRaw).scale(169.529);\n};\n\n},{\"d3-geo\":\"lY61T\",\"./math.js\":\"lq3g8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lq3g8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"abs\", ()=>abs);\nparcelHelpers.export(exports, \"atan\", ()=>atan);\nparcelHelpers.export(exports, \"atan2\", ()=>atan2);\nparcelHelpers.export(exports, \"ceil\", ()=>ceil);\nparcelHelpers.export(exports, \"cos\", ()=>cos);\nparcelHelpers.export(exports, \"exp\", ()=>exp);\nparcelHelpers.export(exports, \"floor\", ()=>floor);\nparcelHelpers.export(exports, \"log\", ()=>log);\nparcelHelpers.export(exports, \"max\", ()=>max);\nparcelHelpers.export(exports, \"min\", ()=>min);\nparcelHelpers.export(exports, \"pow\", ()=>pow);\nparcelHelpers.export(exports, \"round\", ()=>round);\nparcelHelpers.export(exports, \"sign\", ()=>sign);\nparcelHelpers.export(exports, \"sin\", ()=>sin);\nparcelHelpers.export(exports, \"tan\", ()=>tan);\nparcelHelpers.export(exports, \"epsilon\", ()=>epsilon);\nparcelHelpers.export(exports, \"epsilon2\", ()=>epsilon2);\nparcelHelpers.export(exports, \"pi\", ()=>pi);\nparcelHelpers.export(exports, \"halfPi\", ()=>halfPi);\nparcelHelpers.export(exports, \"quarterPi\", ()=>quarterPi);\nparcelHelpers.export(exports, \"sqrt1_2\", ()=>sqrt1_2);\nparcelHelpers.export(exports, \"sqrt2\", ()=>sqrt2);\nparcelHelpers.export(exports, \"sqrtPi\", ()=>sqrtPi);\nparcelHelpers.export(exports, \"tau\", ()=>tau);\nparcelHelpers.export(exports, \"degrees\", ()=>degrees);\nparcelHelpers.export(exports, \"radians\", ()=>radians);\nparcelHelpers.export(exports, \"sinci\", ()=>sinci);\nparcelHelpers.export(exports, \"asin\", ()=>asin);\nparcelHelpers.export(exports, \"acos\", ()=>acos);\nparcelHelpers.export(exports, \"sqrt\", ()=>sqrt);\nparcelHelpers.export(exports, \"tanh\", ()=>tanh);\nparcelHelpers.export(exports, \"sinh\", ()=>sinh);\nparcelHelpers.export(exports, \"cosh\", ()=>cosh);\nparcelHelpers.export(exports, \"arsinh\", ()=>arsinh);\nparcelHelpers.export(exports, \"arcosh\", ()=>arcosh);\nvar abs = Math.abs;\nvar atan = Math.atan;\nvar atan2 = Math.atan2;\nvar ceil = Math.ceil;\nvar cos = Math.cos;\nvar exp = Math.exp;\nvar floor = Math.floor;\nvar log = Math.log;\nvar max = Math.max;\nvar min = Math.min;\nvar pow = Math.pow;\nvar round = Math.round;\nvar sign = Math.sign || function(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n};\nvar sin = Math.sin;\nvar tan = Math.tan;\nvar epsilon = 1e-6;\nvar epsilon2 = 1e-12;\nvar pi = Math.PI;\nvar halfPi = pi / 2;\nvar quarterPi = pi / 4;\nvar sqrt1_2 = Math.SQRT1_2;\nvar sqrt2 = sqrt(2);\nvar sqrtPi = sqrt(pi);\nvar tau = pi * 2;\nvar degrees = 180 / pi;\nvar radians = pi / 180;\nfunction sinci(x) {\n    return x ? x / Math.sin(x) : 1;\n}\nfunction asin(x) {\n    return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);\n}\nfunction acos(x) {\n    return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\nfunction sqrt(x) {\n    return x > 0 ? Math.sqrt(x) : 0;\n}\nfunction tanh(x) {\n    x = exp(2 * x);\n    return (x - 1) / (x + 1);\n}\nfunction sinh(x) {\n    return (exp(x) - exp(-x)) / 2;\n}\nfunction cosh(x) {\n    return (exp(x) + exp(-x)) / 2;\n}\nfunction arsinh(x) {\n    return log(x + sqrt(x * x + 1));\n}\nfunction arcosh(x) {\n    return log(x + sqrt(x * x - 1));\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4JCry\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"force\", ()=>Force);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Force = require(\"d3-force\");\nconst ForceMap = {\n    center: (0, _d3Force.forceCenter),\n    collide: (0, _d3Force.forceCollide),\n    nbody: (0, _d3Force.forceManyBody),\n    link: (0, _d3Force.forceLink),\n    x: (0, _d3Force.forceX),\n    y: (0, _d3Force.forceY)\n};\nconst Forces = \"forces\", ForceParams = [\n    \"alpha\",\n    \"alphaMin\",\n    \"alphaTarget\",\n    \"velocityDecay\",\n    \"forces\"\n], ForceConfig = [\n    \"static\",\n    \"iterations\"\n], ForceOutput = [\n    \"x\",\n    \"y\",\n    \"vx\",\n    \"vy\"\n];\n/**\n * Force simulation layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<object>} params.forces - The forces to apply.\n */ function Force(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nForce.Definition = {\n    \"type\": \"Force\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"static\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"restart\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"iterations\",\n            \"type\": \"number\",\n            \"default\": 300\n        },\n        {\n            \"name\": \"alpha\",\n            \"type\": \"number\",\n            \"default\": 1\n        },\n        {\n            \"name\": \"alphaMin\",\n            \"type\": \"number\",\n            \"default\": 0.001\n        },\n        {\n            \"name\": \"alphaTarget\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"velocityDecay\",\n            \"type\": \"number\",\n            \"default\": 0.4\n        },\n        {\n            \"name\": \"forces\",\n            \"type\": \"param\",\n            \"array\": true,\n            \"params\": [\n                {\n                    \"key\": {\n                        \"force\": \"center\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"x\",\n                            \"type\": \"number\",\n                            \"default\": 0\n                        },\n                        {\n                            \"name\": \"y\",\n                            \"type\": \"number\",\n                            \"default\": 0\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"collide\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"radius\",\n                            \"type\": \"number\",\n                            \"expr\": true\n                        },\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"default\": 0.7\n                        },\n                        {\n                            \"name\": \"iterations\",\n                            \"type\": \"number\",\n                            \"default\": 1\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"nbody\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"default\": -30\n                        },\n                        {\n                            \"name\": \"theta\",\n                            \"type\": \"number\",\n                            \"default\": 0.9\n                        },\n                        {\n                            \"name\": \"distanceMin\",\n                            \"type\": \"number\",\n                            \"default\": 1\n                        },\n                        {\n                            \"name\": \"distanceMax\",\n                            \"type\": \"number\"\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"link\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"links\",\n                            \"type\": \"data\"\n                        },\n                        {\n                            \"name\": \"id\",\n                            \"type\": \"field\"\n                        },\n                        {\n                            \"name\": \"distance\",\n                            \"type\": \"number\",\n                            \"default\": 30,\n                            \"expr\": true\n                        },\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"expr\": true\n                        },\n                        {\n                            \"name\": \"iterations\",\n                            \"type\": \"number\",\n                            \"default\": 1\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"x\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"default\": 0.1\n                        },\n                        {\n                            \"name\": \"x\",\n                            \"type\": \"field\"\n                        }\n                    ]\n                },\n                {\n                    \"key\": {\n                        \"force\": \"y\"\n                    },\n                    \"params\": [\n                        {\n                            \"name\": \"strength\",\n                            \"type\": \"number\",\n                            \"default\": 0.1\n                        },\n                        {\n                            \"name\": \"y\",\n                            \"type\": \"field\"\n                        }\n                    ]\n                }\n            ]\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"modify\": false,\n            \"default\": ForceOutput\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Force, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        var sim = this.value, change = pulse.changed(pulse.ADD_REM), params = _.modified(ForceParams), iters = _.iterations || 300; // configure simulation\n        if (!sim) {\n            this.value = sim = simulation(pulse.source, _);\n            sim.on(\"tick\", rerun(pulse.dataflow, this));\n            if (!_.static) {\n                change = true;\n                sim.tick(); // ensure we run on init\n            }\n            pulse.modifies(\"index\");\n        } else {\n            if (change) {\n                pulse.modifies(\"index\");\n                sim.nodes(pulse.source);\n            }\n            if (params || pulse.changed(pulse.MOD)) setup(sim, _, 0, pulse);\n        } // run simulation\n        if (params || change || _.modified(ForceConfig) || pulse.changed() && _.restart) {\n            sim.alpha(Math.max(sim.alpha(), _.alpha || 1)).alphaDecay(1 - Math.pow(sim.alphaMin(), 1 / iters));\n            if (_.static) for(sim.stop(); --iters >= 0;)sim.tick();\n            else {\n                if (sim.stopped()) sim.restart();\n                if (!change) return pulse.StopPropagation; // defer to sim ticks\n            }\n        }\n        return this.finish(_, pulse);\n    },\n    finish (_, pulse) {\n        const dataflow = pulse.dataflow; // inspect dependencies, touch link source data\n        for(let args = this._argops, j = 0, m = args.length, arg; j < m; ++j){\n            arg = args[j];\n            if (arg.name !== Forces || arg.op._argval.force !== \"link\") continue;\n            for(var ops = arg.op._argops, i = 0, n = ops.length, op; i < n; ++i)if (ops[i].name === \"links\" && (op = ops[i].op.source)) {\n                dataflow.pulse(op, dataflow.changeset().reflow());\n                break;\n            }\n        } // reflow all nodes\n        return pulse.reflow(_.modified()).modifies(ForceOutput);\n    }\n});\nfunction rerun(df, op) {\n    return ()=>df.touch(op).run();\n}\nfunction simulation(nodes, _) {\n    const sim = (0, _d3Force.forceSimulation)(nodes), stop = sim.stop, restart = sim.restart;\n    let stopped = false;\n    sim.stopped = ()=>stopped;\n    sim.restart = ()=>(stopped = false, restart());\n    sim.stop = ()=>(stopped = true, stop());\n    return setup(sim, _, true).on(\"end\", ()=>stopped = true);\n}\nfunction setup(sim, _, init, pulse) {\n    var f = (0, _vegaUtil.array)(_.forces), i, n, p, name;\n    for(i = 0, n = ForceParams.length; i < n; ++i){\n        p = ForceParams[i];\n        if (p !== Forces && _.modified(p)) sim[p](_[p]);\n    }\n    for(i = 0, n = f.length; i < n; ++i){\n        name = Forces + i;\n        p = init || _.modified(Forces, i) ? getForce(f[i]) : pulse && modified(f[i], pulse) ? sim.force(name) : null;\n        if (p) sim.force(name, p);\n    }\n    for(n = sim.numForces || 0; i < n; ++i)sim.force(Forces + i, null); // remove\n    sim.numForces = f.length;\n    return sim;\n}\nfunction modified(f, pulse) {\n    var k, v;\n    for(k in f){\n        if ((0, _vegaUtil.isFunction)(v = f[k]) && pulse.modified((0, _vegaUtil.accessorFields)(v))) return 1;\n    }\n    return 0;\n}\nfunction getForce(_) {\n    var f, p;\n    if (!(0, _vegaUtil.hasOwnProperty)(ForceMap, _.force)) (0, _vegaUtil.error)(\"Unrecognized force: \" + _.force);\n    f = ForceMap[_.force]();\n    for(p in _)if ((0, _vegaUtil.isFunction)(f[p])) setForceParam(f[p], _[p], _);\n    return f;\n}\nfunction setForceParam(f, v, _) {\n    f((0, _vegaUtil.isFunction)(v) ? (d)=>v(d, _) : v);\n}\n\n},{\"vega-dataflow\":\"3NitK\",\"vega-util\":\"bApja\",\"d3-force\":\"kTqQn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kTqQn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"forceCenter\", ()=>(0, _centerJsDefault.default));\nparcelHelpers.export(exports, \"forceCollide\", ()=>(0, _collideJsDefault.default));\nparcelHelpers.export(exports, \"forceLink\", ()=>(0, _linkJsDefault.default));\nparcelHelpers.export(exports, \"forceManyBody\", ()=>(0, _manyBodyJsDefault.default));\nparcelHelpers.export(exports, \"forceRadial\", ()=>(0, _radialJsDefault.default));\nparcelHelpers.export(exports, \"forceSimulation\", ()=>(0, _simulationJsDefault.default));\nparcelHelpers.export(exports, \"forceX\", ()=>(0, _xJsDefault.default));\nparcelHelpers.export(exports, \"forceY\", ()=>(0, _yJsDefault.default));\nvar _centerJs = require(\"./center.js\");\nvar _centerJsDefault = parcelHelpers.interopDefault(_centerJs);\nvar _collideJs = require(\"./collide.js\");\nvar _collideJsDefault = parcelHelpers.interopDefault(_collideJs);\nvar _linkJs = require(\"./link.js\");\nvar _linkJsDefault = parcelHelpers.interopDefault(_linkJs);\nvar _manyBodyJs = require(\"./manyBody.js\");\nvar _manyBodyJsDefault = parcelHelpers.interopDefault(_manyBodyJs);\nvar _radialJs = require(\"./radial.js\");\nvar _radialJsDefault = parcelHelpers.interopDefault(_radialJs);\nvar _simulationJs = require(\"./simulation.js\");\nvar _simulationJsDefault = parcelHelpers.interopDefault(_simulationJs);\nvar _xJs = require(\"./x.js\");\nvar _xJsDefault = parcelHelpers.interopDefault(_xJs);\nvar _yJs = require(\"./y.js\");\nvar _yJsDefault = parcelHelpers.interopDefault(_yJs);\n\n},{\"./center.js\":\"cmuXj\",\"./collide.js\":\"kAxiK\",\"./link.js\":\"dpYez\",\"./manyBody.js\":\"1XMYH\",\"./radial.js\":false,\"./simulation.js\":\"k5O0L\",\"./x.js\":\"byekK\",\"./y.js\":\"eIzZp\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cmuXj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x, y) {\n    var nodes, strength = 1;\n    if (x == null) x = 0;\n    if (y == null) y = 0;\n    function force() {\n        var i, n = nodes.length, node, sx = 0, sy = 0;\n        for(i = 0; i < n; ++i)node = nodes[i], sx += node.x, sy += node.y;\n        for(sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i)node = nodes[i], node.x -= sx, node.y -= sy;\n    }\n    force.initialize = function(_) {\n        nodes = _;\n    };\n    force.x = function(_) {\n        return arguments.length ? (x = +_, force) : x;\n    };\n    force.y = function(_) {\n        return arguments.length ? (y = +_, force) : y;\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = +_, force) : strength;\n    };\n    return force;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kAxiK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Quadtree = require(\"d3-quadtree\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _jiggleJs = require(\"./jiggle.js\");\nvar _jiggleJsDefault = parcelHelpers.interopDefault(_jiggleJs);\nfunction x(d) {\n    return d.x + d.vx;\n}\nfunction y(d) {\n    return d.y + d.vy;\n}\nexports.default = function(radius) {\n    var nodes, radii, random, strength = 1, iterations = 1;\n    if (typeof radius !== \"function\") radius = (0, _constantJsDefault.default)(radius == null ? 1 : +radius);\n    function force() {\n        var i, n = nodes.length, tree, node, xi, yi, ri, ri2;\n        for(var k = 0; k < iterations; ++k){\n            tree = (0, _d3Quadtree.quadtree)(nodes, x, y).visitAfter(prepare);\n            for(i = 0; i < n; ++i){\n                node = nodes[i];\n                ri = radii[node.index], ri2 = ri * ri;\n                xi = node.x + node.vx;\n                yi = node.y + node.vy;\n                tree.visit(apply);\n            }\n        }\n        function apply(quad, x0, y0, x1, y1) {\n            var data = quad.data, rj = quad.r, r = ri + rj;\n            if (data) {\n                if (data.index > node.index) {\n                    var x2 = xi - data.x - data.vx, y2 = yi - data.y - data.vy, l = x2 * x2 + y2 * y2;\n                    if (l < r * r) {\n                        if (x2 === 0) x2 = (0, _jiggleJsDefault.default)(random), l += x2 * x2;\n                        if (y2 === 0) y2 = (0, _jiggleJsDefault.default)(random), l += y2 * y2;\n                        l = (r - (l = Math.sqrt(l))) / l * strength;\n                        node.vx += (x2 *= l) * (r = (rj *= rj) / (ri2 + rj));\n                        node.vy += (y2 *= l) * r;\n                        data.vx -= x2 * (r = 1 - r);\n                        data.vy -= y2 * r;\n                    }\n                }\n                return;\n            }\n            return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;\n        }\n    }\n    function prepare(quad) {\n        if (quad.data) return quad.r = radii[quad.data.index];\n        for(var i = quad.r = 0; i < 4; ++i)if (quad[i] && quad[i].r > quad.r) quad.r = quad[i].r;\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i, n = nodes.length, node;\n        radii = new Array(n);\n        for(i = 0; i < n; ++i)node = nodes[i], radii[node.index] = +radius(node, i, nodes);\n    }\n    force.initialize = function(_nodes, _random) {\n        nodes = _nodes;\n        random = _random;\n        initialize();\n    };\n    force.iterations = function(_) {\n        return arguments.length ? (iterations = +_, force) : iterations;\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = +_, force) : strength;\n    };\n    force.radius = function(_) {\n        return arguments.length ? (radius = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : radius;\n    };\n    return force;\n};\n\n},{\"d3-quadtree\":\"37u8M\",\"./constant.js\":\"gq4mo\",\"./jiggle.js\":\"2qIlb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"37u8M\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"quadtree\", ()=>(0, _quadtreeJsDefault.default));\nvar _quadtreeJs = require(\"./quadtree.js\");\nvar _quadtreeJsDefault = parcelHelpers.interopDefault(_quadtreeJs);\n\n},{\"./quadtree.js\":\"3kHO8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3kHO8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _addJs = require(\"./add.js\");\nvar _addJsDefault = parcelHelpers.interopDefault(_addJs);\nvar _coverJs = require(\"./cover.js\");\nvar _coverJsDefault = parcelHelpers.interopDefault(_coverJs);\nvar _dataJs = require(\"./data.js\");\nvar _dataJsDefault = parcelHelpers.interopDefault(_dataJs);\nvar _extentJs = require(\"./extent.js\");\nvar _extentJsDefault = parcelHelpers.interopDefault(_extentJs);\nvar _findJs = require(\"./find.js\");\nvar _findJsDefault = parcelHelpers.interopDefault(_findJs);\nvar _removeJs = require(\"./remove.js\");\nvar _removeJsDefault = parcelHelpers.interopDefault(_removeJs);\nvar _rootJs = require(\"./root.js\");\nvar _rootJsDefault = parcelHelpers.interopDefault(_rootJs);\nvar _sizeJs = require(\"./size.js\");\nvar _sizeJsDefault = parcelHelpers.interopDefault(_sizeJs);\nvar _visitJs = require(\"./visit.js\");\nvar _visitJsDefault = parcelHelpers.interopDefault(_visitJs);\nvar _visitAfterJs = require(\"./visitAfter.js\");\nvar _visitAfterJsDefault = parcelHelpers.interopDefault(_visitAfterJs);\nvar _xJs = require(\"./x.js\");\nvar _xJsDefault = parcelHelpers.interopDefault(_xJs);\nvar _yJs = require(\"./y.js\");\nvar _yJsDefault = parcelHelpers.interopDefault(_yJs);\nfunction quadtree(nodes, x, y) {\n    var tree = new Quadtree(x == null ? (0, _xJs.defaultX) : x, y == null ? (0, _yJs.defaultY) : y, NaN, NaN, NaN, NaN);\n    return nodes == null ? tree : tree.addAll(nodes);\n}\nexports.default = quadtree;\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n    this._x = x;\n    this._y = y;\n    this._x0 = x0;\n    this._y0 = y0;\n    this._x1 = x1;\n    this._y1 = y1;\n    this._root = undefined;\n}\nfunction leaf_copy(leaf) {\n    var copy = {\n        data: leaf.data\n    }, next = copy;\n    while(leaf = leaf.next)next = next.next = {\n        data: leaf.data\n    };\n    return copy;\n}\nvar treeProto = quadtree.prototype = Quadtree.prototype;\ntreeProto.copy = function() {\n    var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child;\n    if (!node) return copy;\n    if (!node.length) return copy._root = leaf_copy(node), copy;\n    nodes = [\n        {\n            source: node,\n            target: copy._root = new Array(4)\n        }\n    ];\n    while(node = nodes.pop()){\n        for(var i = 0; i < 4; ++i)if (child = node.source[i]) {\n            if (child.length) nodes.push({\n                source: child,\n                target: node.target[i] = new Array(4)\n            });\n            else node.target[i] = leaf_copy(child);\n        }\n    }\n    return copy;\n};\ntreeProto.add = (0, _addJsDefault.default);\ntreeProto.addAll = (0, _addJs.addAll);\ntreeProto.cover = (0, _coverJsDefault.default);\ntreeProto.data = (0, _dataJsDefault.default);\ntreeProto.extent = (0, _extentJsDefault.default);\ntreeProto.find = (0, _findJsDefault.default);\ntreeProto.remove = (0, _removeJsDefault.default);\ntreeProto.removeAll = (0, _removeJs.removeAll);\ntreeProto.root = (0, _rootJsDefault.default);\ntreeProto.size = (0, _sizeJsDefault.default);\ntreeProto.visit = (0, _visitJsDefault.default);\ntreeProto.visitAfter = (0, _visitAfterJsDefault.default);\ntreeProto.x = (0, _xJsDefault.default);\ntreeProto.y = (0, _yJsDefault.default);\n\n},{\"./add.js\":\"5Rd7q\",\"./cover.js\":\"bMVUj\",\"./data.js\":\"8gCAF\",\"./extent.js\":\"55OBQ\",\"./find.js\":\"7wO3V\",\"./remove.js\":\"aDV7k\",\"./root.js\":\"i8Ybu\",\"./size.js\":\"9DeOu\",\"./visit.js\":\"4YvSz\",\"./visitAfter.js\":\"fin30\",\"./x.js\":\"39OFs\",\"./y.js\":\"9VKON\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5Rd7q\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addAll\", ()=>addAll);\nexports.default = function(d) {\n    const x = +this._x.call(null, d), y = +this._y.call(null, d);\n    return add(this.cover(x, y), x, y, d);\n};\nfunction add(tree, x, y, d) {\n    if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n    var parent, node = tree._root, leaf = {\n        data: d\n    }, x0 = tree._x0, y0 = tree._y0, x1 = tree._x1, y1 = tree._y1, xm, ym, xp, yp, right, bottom, i, j;\n    // If the tree is empty, initialize the root as a leaf.\n    if (!node) return tree._root = leaf, tree;\n    // Find the existing leaf for the new point, or add it.\n    while(node.length){\n        if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;\n        else x1 = xm;\n        if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;\n        else y1 = ym;\n        if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n    }\n    // Is the new point is exactly coincident with the existing point?\n    xp = +tree._x.call(null, node.data);\n    yp = +tree._y.call(null, node.data);\n    if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n    // Otherwise, split the leaf node until the old and new point are separated.\n    do {\n        parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n        if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;\n        else x1 = xm;\n        if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;\n        else y1 = ym;\n    }while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));\n    return parent[j] = node, parent[i] = leaf, tree;\n}\nfunction addAll(data) {\n    var d, i, n = data.length, x, y, xz = new Array(n), yz = new Array(n), x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n    // Compute the points and their extent.\n    for(i = 0; i < n; ++i){\n        if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n        xz[i] = x;\n        yz[i] = y;\n        if (x < x0) x0 = x;\n        if (x > x1) x1 = x;\n        if (y < y0) y0 = y;\n        if (y > y1) y1 = y;\n    }\n    // If there were no (valid) points, abort.\n    if (x0 > x1 || y0 > y1) return this;\n    // Expand the tree to cover the new points.\n    this.cover(x0, y0).cover(x1, y1);\n    // Add the new points.\n    for(i = 0; i < n; ++i)add(this, xz[i], yz[i], data[i]);\n    return this;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bMVUj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x, y) {\n    if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n    var x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1;\n    // If the quadtree has no extent, initialize them.\n    // Integer extent are necessary so that if we later double the extent,\n    // the existing quadrant boundaries don’t change due to floating point error!\n    if (isNaN(x0)) {\n        x1 = (x0 = Math.floor(x)) + 1;\n        y1 = (y0 = Math.floor(y)) + 1;\n    } else {\n        var z = x1 - x0 || 1, node = this._root, parent, i;\n        while(x0 > x || x >= x1 || y0 > y || y >= y1){\n            i = (y < y0) << 1 | x < x0;\n            parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n            switch(i){\n                case 0:\n                    x1 = x0 + z, y1 = y0 + z;\n                    break;\n                case 1:\n                    x0 = x1 - z, y1 = y0 + z;\n                    break;\n                case 2:\n                    x1 = x0 + z, y0 = y1 - z;\n                    break;\n                case 3:\n                    x0 = x1 - z, y0 = y1 - z;\n                    break;\n            }\n        }\n        if (this._root && this._root.length) this._root = node;\n    }\n    this._x0 = x0;\n    this._y0 = y0;\n    this._x1 = x1;\n    this._y1 = y1;\n    return this;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8gCAF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var data = [];\n    this.visit(function(node) {\n        if (!node.length) do data.push(node.data);\n        while (node = node.next);\n    });\n    return data;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"55OBQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(_) {\n    return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? undefined : [\n        [\n            this._x0,\n            this._y0\n        ],\n        [\n            this._x1,\n            this._y1\n        ]\n    ];\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7wO3V\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _quadJs = require(\"./quad.js\");\nvar _quadJsDefault = parcelHelpers.interopDefault(_quadJs);\nexports.default = function(x, y, radius) {\n    var data, x0 = this._x0, y0 = this._y0, x1, y1, x2, y2, x3 = this._x1, y3 = this._y1, quads = [], node = this._root, q, i;\n    if (node) quads.push(new (0, _quadJsDefault.default)(node, x0, y0, x3, y3));\n    if (radius == null) radius = Infinity;\n    else {\n        x0 = x - radius, y0 = y - radius;\n        x3 = x + radius, y3 = y + radius;\n        radius *= radius;\n    }\n    while(q = quads.pop()){\n        // Stop searching if this quadrant can’t contain a closer node.\n        if (!(node = q.node) || (x1 = q.x0) > x3 || (y1 = q.y0) > y3 || (x2 = q.x1) < x0 || (y2 = q.y1) < y0) continue;\n        // Bisect the current quadrant.\n        if (node.length) {\n            var xm = (x1 + x2) / 2, ym = (y1 + y2) / 2;\n            quads.push(new (0, _quadJsDefault.default)(node[3], xm, ym, x2, y2), new (0, _quadJsDefault.default)(node[2], x1, ym, xm, y2), new (0, _quadJsDefault.default)(node[1], xm, y1, x2, ym), new (0, _quadJsDefault.default)(node[0], x1, y1, xm, ym));\n            // Visit the closest quadrant first.\n            if (i = (y >= ym) << 1 | x >= xm) {\n                q = quads[quads.length - 1];\n                quads[quads.length - 1] = quads[quads.length - 1 - i];\n                quads[quads.length - 1 - i] = q;\n            }\n        } else {\n            var dx = x - +this._x.call(null, node.data), dy = y - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;\n            if (d2 < radius) {\n                var d = Math.sqrt(radius = d2);\n                x0 = x - d, y0 = y - d;\n                x3 = x + d, y3 = y + d;\n                data = node.data;\n            }\n        }\n    }\n    return data;\n};\n\n},{\"./quad.js\":\"ij3wf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ij3wf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(node, x0, y0, x1, y1) {\n    this.node = node;\n    this.x0 = x0;\n    this.y0 = y0;\n    this.x1 = x1;\n    this.y1 = y1;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aDV7k\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"removeAll\", ()=>removeAll);\nexports.default = function(d) {\n    if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n    var parent, node = this._root, retainer, previous, next, x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1, x, y, xm, ym, right, bottom, i, j;\n    // If the tree is empty, initialize the root as a leaf.\n    if (!node) return this;\n    // Find the leaf node for the point.\n    // While descending, also retain the deepest parent with a non-removed sibling.\n    if (node.length) while(true){\n        if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm;\n        else x1 = xm;\n        if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym;\n        else y1 = ym;\n        if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n        if (!node.length) break;\n        if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) retainer = parent, j = i;\n    }\n    // Find the point to remove.\n    while(node.data !== d)if (!(previous = node, node = node.next)) return this;\n    if (next = node.next) delete node.next;\n    // If there are multiple coincident points, remove just the point.\n    if (previous) return next ? previous.next = next : delete previous.next, this;\n    // If this is the root point, remove it.\n    if (!parent) return this._root = next, this;\n    // Remove this leaf.\n    next ? parent[i] = next : delete parent[i];\n    // If the parent now contains exactly one leaf, collapse superfluous parents.\n    if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {\n        if (retainer) retainer[j] = node;\n        else this._root = node;\n    }\n    return this;\n};\nfunction removeAll(data) {\n    for(var i = 0, n = data.length; i < n; ++i)this.remove(data[i]);\n    return this;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i8Ybu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    return this._root;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9DeOu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var size = 0;\n    this.visit(function(node) {\n        if (!node.length) do ++size;\n        while (node = node.next);\n    });\n    return size;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4YvSz\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _quadJs = require(\"./quad.js\");\nvar _quadJsDefault = parcelHelpers.interopDefault(_quadJs);\nexports.default = function(callback) {\n    var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n    if (node) quads.push(new (0, _quadJsDefault.default)(node, this._x0, this._y0, this._x1, this._y1));\n    while(q = quads.pop())if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n        var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n        if (child = node[3]) quads.push(new (0, _quadJsDefault.default)(child, xm, ym, x1, y1));\n        if (child = node[2]) quads.push(new (0, _quadJsDefault.default)(child, x0, ym, xm, y1));\n        if (child = node[1]) quads.push(new (0, _quadJsDefault.default)(child, xm, y0, x1, ym));\n        if (child = node[0]) quads.push(new (0, _quadJsDefault.default)(child, x0, y0, xm, ym));\n    }\n    return this;\n};\n\n},{\"./quad.js\":\"ij3wf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fin30\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _quadJs = require(\"./quad.js\");\nvar _quadJsDefault = parcelHelpers.interopDefault(_quadJs);\nexports.default = function(callback) {\n    var quads = [], next = [], q;\n    if (this._root) quads.push(new (0, _quadJsDefault.default)(this._root, this._x0, this._y0, this._x1, this._y1));\n    while(q = quads.pop()){\n        var node = q.node;\n        if (node.length) {\n            var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n            if (child = node[0]) quads.push(new (0, _quadJsDefault.default)(child, x0, y0, xm, ym));\n            if (child = node[1]) quads.push(new (0, _quadJsDefault.default)(child, xm, y0, x1, ym));\n            if (child = node[2]) quads.push(new (0, _quadJsDefault.default)(child, x0, ym, xm, y1));\n            if (child = node[3]) quads.push(new (0, _quadJsDefault.default)(child, xm, ym, x1, y1));\n        }\n        next.push(q);\n    }\n    while(q = next.pop())callback(q.node, q.x0, q.y0, q.x1, q.y1);\n    return this;\n};\n\n},{\"./quad.js\":\"ij3wf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"39OFs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultX\", ()=>defaultX);\nfunction defaultX(d) {\n    return d[0];\n}\nexports.default = function(_) {\n    return arguments.length ? (this._x = _, this) : this._x;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9VKON\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultY\", ()=>defaultY);\nfunction defaultY(d) {\n    return d[1];\n}\nexports.default = function(_) {\n    return arguments.length ? (this._y = _, this) : this._y;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gq4mo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(x) {\n    return function() {\n        return x;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2qIlb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(random) {\n    return (random() - 0.5) * 1e-6;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dpYez\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _jiggleJs = require(\"./jiggle.js\");\nvar _jiggleJsDefault = parcelHelpers.interopDefault(_jiggleJs);\nfunction index(d) {\n    return d.index;\n}\nfunction find(nodeById, nodeId) {\n    var node = nodeById.get(nodeId);\n    if (!node) throw new Error(\"node not found: \" + nodeId);\n    return node;\n}\nexports.default = function(links) {\n    var id = index, strength = defaultStrength, strengths, distance = (0, _constantJsDefault.default)(30), distances, nodes, count, bias, random, iterations = 1;\n    if (links == null) links = [];\n    function defaultStrength(link) {\n        return 1 / Math.min(count[link.source.index], count[link.target.index]);\n    }\n    function force(alpha) {\n        for(var k = 0, n = links.length; k < iterations; ++k)for(var i = 0, link, source, target, x, y, l, b; i < n; ++i){\n            link = links[i], source = link.source, target = link.target;\n            x = target.x + target.vx - source.x - source.vx || (0, _jiggleJsDefault.default)(random);\n            y = target.y + target.vy - source.y - source.vy || (0, _jiggleJsDefault.default)(random);\n            l = Math.sqrt(x * x + y * y);\n            l = (l - distances[i]) / l * alpha * strengths[i];\n            x *= l, y *= l;\n            target.vx -= x * (b = bias[i]);\n            target.vy -= y * b;\n            source.vx += x * (b = 1 - b);\n            source.vy += y * b;\n        }\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i1, n = nodes.length, m = links.length, nodeById = new Map(nodes.map((d, i)=>[\n                id(d, i, nodes),\n                d\n            ])), link;\n        for(i1 = 0, count = new Array(n); i1 < m; ++i1){\n            link = links[i1], link.index = i1;\n            if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n            if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n            count[link.source.index] = (count[link.source.index] || 0) + 1;\n            count[link.target.index] = (count[link.target.index] || 0) + 1;\n        }\n        for(i1 = 0, bias = new Array(m); i1 < m; ++i1)link = links[i1], bias[i1] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n        strengths = new Array(m), initializeStrength();\n        distances = new Array(m), initializeDistance();\n    }\n    function initializeStrength() {\n        if (!nodes) return;\n        for(var i = 0, n = links.length; i < n; ++i)strengths[i] = +strength(links[i], i, links);\n    }\n    function initializeDistance() {\n        if (!nodes) return;\n        for(var i = 0, n = links.length; i < n; ++i)distances[i] = +distance(links[i], i, links);\n    }\n    force.initialize = function(_nodes, _random) {\n        nodes = _nodes;\n        random = _random;\n        initialize();\n    };\n    force.links = function(_) {\n        return arguments.length ? (links = _, initialize(), force) : links;\n    };\n    force.id = function(_) {\n        return arguments.length ? (id = _, force) : id;\n    };\n    force.iterations = function(_) {\n        return arguments.length ? (iterations = +_, force) : iterations;\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initializeStrength(), force) : strength;\n    };\n    force.distance = function(_) {\n        return arguments.length ? (distance = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initializeDistance(), force) : distance;\n    };\n    return force;\n};\n\n},{\"./constant.js\":\"gq4mo\",\"./jiggle.js\":\"2qIlb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1XMYH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _d3Quadtree = require(\"d3-quadtree\");\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nvar _jiggleJs = require(\"./jiggle.js\");\nvar _jiggleJsDefault = parcelHelpers.interopDefault(_jiggleJs);\nvar _simulationJs = require(\"./simulation.js\");\nexports.default = function() {\n    var nodes, node1, random, alpha, strength1 = (0, _constantJsDefault.default)(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81;\n    function force(_) {\n        var i, n = nodes.length, tree = (0, _d3Quadtree.quadtree)(nodes, (0, _simulationJs.x), (0, _simulationJs.y)).visitAfter(accumulate);\n        for(alpha = _, i = 0; i < n; ++i)node1 = nodes[i], tree.visit(apply);\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i, n = nodes.length, node;\n        strengths = new Array(n);\n        for(i = 0; i < n; ++i)node = nodes[i], strengths[node.index] = +strength1(node, i, nodes);\n    }\n    function accumulate(quad) {\n        var strength = 0, q, c, weight = 0, x, y, i;\n        // For internal nodes, accumulate forces from child quadrants.\n        if (quad.length) {\n            for(x = y = i = 0; i < 4; ++i)if ((q = quad[i]) && (c = Math.abs(q.value))) strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n            quad.x = x / weight;\n            quad.y = y / weight;\n        } else {\n            q = quad;\n            q.x = q.data.x;\n            q.y = q.data.y;\n            do strength += strengths[q.data.index];\n            while (q = q.next);\n        }\n        quad.value = strength;\n    }\n    function apply(quad, x1, _, x2) {\n        if (!quad.value) return true;\n        var x = quad.x - node1.x, y = quad.y - node1.y, w = x2 - x1, l = x * x + y * y;\n        // Apply the Barnes-Hut approximation if possible.\n        // Limit forces for very close nodes; randomize direction if coincident.\n        if (w * w / theta2 < l) {\n            if (l < distanceMax2) {\n                if (x === 0) x = (0, _jiggleJsDefault.default)(random), l += x * x;\n                if (y === 0) y = (0, _jiggleJsDefault.default)(random), l += y * y;\n                if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n                node1.vx += x * quad.value * alpha / l;\n                node1.vy += y * quad.value * alpha / l;\n            }\n            return true;\n        } else if (quad.length || l >= distanceMax2) return;\n        // Limit forces for very close nodes; randomize direction if coincident.\n        if (quad.data !== node1 || quad.next) {\n            if (x === 0) x = (0, _jiggleJsDefault.default)(random), l += x * x;\n            if (y === 0) y = (0, _jiggleJsDefault.default)(random), l += y * y;\n            if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n        }\n        do if (quad.data !== node1) {\n            w = strengths[quad.data.index] * alpha / l;\n            node1.vx += x * w;\n            node1.vy += y * w;\n        }\n        while (quad = quad.next);\n    }\n    force.initialize = function(_nodes, _random) {\n        nodes = _nodes;\n        random = _random;\n        initialize();\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength1 = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : strength1;\n    };\n    force.distanceMin = function(_) {\n        return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n    };\n    force.distanceMax = function(_) {\n        return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n    };\n    force.theta = function(_) {\n        return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n    };\n    return force;\n};\n\n},{\"d3-quadtree\":\"37u8M\",\"./constant.js\":\"gq4mo\",\"./jiggle.js\":\"2qIlb\",\"./simulation.js\":\"k5O0L\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k5O0L\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"x\", ()=>x);\nparcelHelpers.export(exports, \"y\", ()=>y);\nvar _d3Dispatch = require(\"d3-dispatch\");\nvar _d3Timer = require(\"d3-timer\");\nvar _lcgJs = require(\"./lcg.js\");\nvar _lcgJsDefault = parcelHelpers.interopDefault(_lcgJs);\nfunction x(d) {\n    return d.x;\n}\nfunction y(d) {\n    return d.y;\n}\nvar initialRadius = 10, initialAngle = Math.PI * (3 - Math.sqrt(5));\nexports.default = function(nodes) {\n    var simulation, alpha = 1, alphaMin = 0.001, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = new Map(), stepper = (0, _d3Timer.timer)(step), event = (0, _d3Dispatch.dispatch)(\"tick\", \"end\"), random = (0, _lcgJsDefault.default)();\n    if (nodes == null) nodes = [];\n    function step() {\n        tick();\n        event.call(\"tick\", simulation);\n        if (alpha < alphaMin) {\n            stepper.stop();\n            event.call(\"end\", simulation);\n        }\n    }\n    function tick(iterations) {\n        var i, n = nodes.length, node;\n        if (iterations === undefined) iterations = 1;\n        for(var k = 0; k < iterations; ++k){\n            alpha += (alphaTarget - alpha) * alphaDecay;\n            forces.forEach(function(force) {\n                force(alpha);\n            });\n            for(i = 0; i < n; ++i){\n                node = nodes[i];\n                if (node.fx == null) node.x += node.vx *= velocityDecay;\n                else node.x = node.fx, node.vx = 0;\n                if (node.fy == null) node.y += node.vy *= velocityDecay;\n                else node.y = node.fy, node.vy = 0;\n            }\n        }\n        return simulation;\n    }\n    function initializeNodes() {\n        for(var i = 0, n = nodes.length, node; i < n; ++i){\n            node = nodes[i], node.index = i;\n            if (node.fx != null) node.x = node.fx;\n            if (node.fy != null) node.y = node.fy;\n            if (isNaN(node.x) || isNaN(node.y)) {\n                var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle;\n                node.x = radius * Math.cos(angle);\n                node.y = radius * Math.sin(angle);\n            }\n            if (isNaN(node.vx) || isNaN(node.vy)) node.vx = node.vy = 0;\n        }\n    }\n    function initializeForce(force) {\n        if (force.initialize) force.initialize(nodes, random);\n        return force;\n    }\n    initializeNodes();\n    return simulation = {\n        tick: tick,\n        restart: function() {\n            return stepper.restart(step), simulation;\n        },\n        stop: function() {\n            return stepper.stop(), simulation;\n        },\n        nodes: function(_) {\n            return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n        },\n        alpha: function(_) {\n            return arguments.length ? (alpha = +_, simulation) : alpha;\n        },\n        alphaMin: function(_) {\n            return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n        },\n        alphaDecay: function(_) {\n            return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n        },\n        alphaTarget: function(_) {\n            return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n        },\n        velocityDecay: function(_) {\n            return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n        },\n        randomSource: function(_) {\n            return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n        },\n        force: function(name, _) {\n            return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name);\n        },\n        find: function(x1, y1, radius) {\n            var i = 0, n = nodes.length, dx, dy, d2, node, closest;\n            if (radius == null) radius = Infinity;\n            else radius *= radius;\n            for(i = 0; i < n; ++i){\n                node = nodes[i];\n                dx = x1 - node.x;\n                dy = y1 - node.y;\n                d2 = dx * dx + dy * dy;\n                if (d2 < radius) closest = node, radius = d2;\n            }\n            return closest;\n        },\n        on: function(name, _) {\n            return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n        }\n    };\n};\n\n},{\"d3-dispatch\":\"i7nsc\",\"d3-timer\":\"d15bJ\",\"./lcg.js\":\"3KZNV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i7nsc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dispatch\", ()=>(0, _dispatchJsDefault.default));\nvar _dispatchJs = require(\"./dispatch.js\");\nvar _dispatchJsDefault = parcelHelpers.interopDefault(_dispatchJs);\n\n},{\"./dispatch.js\":\"6iBKi\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6iBKi\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar noop = {\n    value: ()=>{}\n};\nfunction dispatch() {\n    for(var i = 0, n = arguments.length, _ = {}, t; i < n; ++i){\n        if (!(t = arguments[i] + \"\") || t in _ || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n        _[t] = [];\n    }\n    return new Dispatch(_);\n}\nfunction Dispatch(_) {\n    this._ = _;\n}\nfunction parseTypenames(typenames, types) {\n    return typenames.trim().split(/^|\\s+/).map(function(t) {\n        var name = \"\", i = t.indexOf(\".\");\n        if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n        if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n        return {\n            type: t,\n            name: name\n        };\n    });\n}\nDispatch.prototype = dispatch.prototype = {\n    constructor: Dispatch,\n    on: function(typename, callback) {\n        var _ = this._, T = parseTypenames(typename + \"\", _), t, i = -1, n = T.length;\n        // If no callback was specified, return the callback of the given type and name.\n        if (arguments.length < 2) {\n            while(++i < n)if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n            return;\n        }\n        // If a type was specified, set the callback for the given type and name.\n        // Otherwise, if a null callback was specified, remove callbacks of the given name.\n        if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n        while(++i < n){\n            if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n            else if (callback == null) for(t in _)_[t] = set(_[t], typename.name, null);\n        }\n        return this;\n    },\n    copy: function() {\n        var copy = {}, _ = this._;\n        for(var t in _)copy[t] = _[t].slice();\n        return new Dispatch(copy);\n    },\n    call: function(type, that) {\n        if ((n = arguments.length - 2) > 0) for(var args = new Array(n), i = 0, n, t; i < n; ++i)args[i] = arguments[i + 2];\n        if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n        for(t = this._[type], i = 0, n = t.length; i < n; ++i)t[i].value.apply(that, args);\n    },\n    apply: function(type, that, args) {\n        if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n        for(var t = this._[type], i = 0, n = t.length; i < n; ++i)t[i].value.apply(that, args);\n    }\n};\nfunction get(type, name) {\n    for(var i = 0, n = type.length, c; i < n; ++i){\n        if ((c = type[i]).name === name) return c.value;\n    }\n}\nfunction set(type, name, callback) {\n    for(var i = 0, n = type.length; i < n; ++i)if (type[i].name === name) {\n        type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n        break;\n    }\n    if (callback != null) type.push({\n        name: name,\n        value: callback\n    });\n    return type;\n}\nexports.default = dispatch;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d15bJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"now\", ()=>(0, _timerJs.now));\nparcelHelpers.export(exports, \"timer\", ()=>(0, _timerJs.timer));\nparcelHelpers.export(exports, \"timerFlush\", ()=>(0, _timerJs.timerFlush));\nparcelHelpers.export(exports, \"timeout\", ()=>(0, _timeoutJsDefault.default));\nparcelHelpers.export(exports, \"interval\", ()=>(0, _intervalJsDefault.default));\nvar _timerJs = require(\"./timer.js\");\nvar _timeoutJs = require(\"./timeout.js\");\nvar _timeoutJsDefault = parcelHelpers.interopDefault(_timeoutJs);\nvar _intervalJs = require(\"./interval.js\");\nvar _intervalJsDefault = parcelHelpers.interopDefault(_intervalJs);\n\n},{\"./timer.js\":\"1Lfpo\",\"./timeout.js\":false,\"./interval.js\":\"dgSlx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1Lfpo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"now\", ()=>now);\nparcelHelpers.export(exports, \"Timer\", ()=>Timer);\nparcelHelpers.export(exports, \"timer\", ()=>timer);\nparcelHelpers.export(exports, \"timerFlush\", ()=>timerFlush);\nvar frame = 0, timeout = 0, interval = 0, pokeDelay = 1000, taskHead, taskTail, clockLast = 0, clockNow = 0, clockSkew = 0, clock = typeof performance === \"object\" && performance.now ? performance : Date, setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {\n    setTimeout(f, 17);\n};\nfunction now() {\n    return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\nfunction clearNow() {\n    clockNow = 0;\n}\nfunction Timer() {\n    this._call = this._time = this._next = null;\n}\nTimer.prototype = timer.prototype = {\n    constructor: Timer,\n    restart: function(callback, delay, time) {\n        if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n        time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n        if (!this._next && taskTail !== this) {\n            if (taskTail) taskTail._next = this;\n            else taskHead = this;\n            taskTail = this;\n        }\n        this._call = callback;\n        this._time = time;\n        sleep();\n    },\n    stop: function() {\n        if (this._call) {\n            this._call = null;\n            this._time = Infinity;\n            sleep();\n        }\n    }\n};\nfunction timer(callback, delay, time) {\n    var t = new Timer;\n    t.restart(callback, delay, time);\n    return t;\n}\nfunction timerFlush() {\n    now(); // Get the current time, if not already set.\n    ++frame; // Pretend we’ve set an alarm, if we haven’t already.\n    var t = taskHead, e;\n    while(t){\n        if ((e = clockNow - t._time) >= 0) t._call.call(null, e);\n        t = t._next;\n    }\n    --frame;\n}\nfunction wake() {\n    clockNow = (clockLast = clock.now()) + clockSkew;\n    frame = timeout = 0;\n    try {\n        timerFlush();\n    } finally{\n        frame = 0;\n        nap();\n        clockNow = 0;\n    }\n}\nfunction poke() {\n    var now1 = clock.now(), delay = now1 - clockLast;\n    if (delay > pokeDelay) clockSkew -= delay, clockLast = now1;\n}\nfunction nap() {\n    var t0, t1 = taskHead, t2, time = Infinity;\n    while(t1)if (t1._call) {\n        if (time > t1._time) time = t1._time;\n        t0 = t1, t1 = t1._next;\n    } else {\n        t2 = t1._next, t1._next = null;\n        t1 = t0 ? t0._next = t2 : taskHead = t2;\n    }\n    taskTail = t0;\n    sleep(time);\n}\nfunction sleep(time) {\n    if (frame) return; // Soonest alarm already set, or will be.\n    if (timeout) timeout = clearTimeout(timeout);\n    var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n    if (delay > 24) {\n        if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n        if (interval) interval = clearInterval(interval);\n    } else {\n        if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n        frame = 1, setFrame(wake);\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dgSlx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _timerJs = require(\"./timer.js\");\nexports.default = function(callback1, delay1, time1) {\n    var t = new (0, _timerJs.Timer), total = delay1;\n    if (delay1 == null) return t.restart(callback1, delay1, time1), t;\n    t._restart = t.restart;\n    t.restart = function(callback, delay, time) {\n        delay = +delay, time = time == null ? (0, _timerJs.now)() : +time;\n        t._restart(function tick(elapsed) {\n            elapsed += total;\n            t._restart(tick, total += delay, time);\n            callback(elapsed);\n        }, delay, time);\n    };\n    t.restart(callback1, delay1, time1);\n    return t;\n};\n\n},{\"./timer.js\":\"1Lfpo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3KZNV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\nexports.default = function() {\n    let s = 1;\n    return ()=>(s = (a * s + c) % m) / m;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"byekK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nexports.default = function(x) {\n    var strength = (0, _constantJsDefault.default)(0.1), nodes, strengths, xz;\n    if (typeof x !== \"function\") x = (0, _constantJsDefault.default)(x == null ? 0 : +x);\n    function force(alpha) {\n        for(var i = 0, n = nodes.length, node; i < n; ++i)node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i, n = nodes.length;\n        strengths = new Array(n);\n        xz = new Array(n);\n        for(i = 0; i < n; ++i)strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n    }\n    force.initialize = function(_) {\n        nodes = _;\n        initialize();\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : strength;\n    };\n    force.x = function(_) {\n        return arguments.length ? (x = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : x;\n    };\n    return force;\n};\n\n},{\"./constant.js\":\"gq4mo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eIzZp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _constantJs = require(\"./constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nexports.default = function(y) {\n    var strength = (0, _constantJsDefault.default)(0.1), nodes, strengths, yz;\n    if (typeof y !== \"function\") y = (0, _constantJsDefault.default)(y == null ? 0 : +y);\n    function force(alpha) {\n        for(var i = 0, n = nodes.length, node; i < n; ++i)node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n    }\n    function initialize() {\n        if (!nodes) return;\n        var i, n = nodes.length;\n        strengths = new Array(n);\n        yz = new Array(n);\n        for(i = 0; i < n; ++i)strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n    }\n    force.initialize = function(_) {\n        nodes = _;\n        initialize();\n    };\n    force.strength = function(_) {\n        return arguments.length ? (strength = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : strength;\n    };\n    force.y = function(_) {\n        return arguments.length ? (y = typeof _ === \"function\" ? _ : (0, _constantJsDefault.default)(+_), initialize(), force) : y;\n    };\n    return force;\n};\n\n},{\"./constant.js\":\"gq4mo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lserr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"nest\", ()=>Nest);\nparcelHelpers.export(exports, \"pack\", ()=>Pack);\nparcelHelpers.export(exports, \"partition\", ()=>Partition);\nparcelHelpers.export(exports, \"stratify\", ()=>Stratify);\nparcelHelpers.export(exports, \"tree\", ()=>Tree);\nparcelHelpers.export(exports, \"treelinks\", ()=>TreeLinks);\nparcelHelpers.export(exports, \"treemap\", ()=>Treemap);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Hierarchy = require(\"d3-hierarchy\");\n// Build lookup table mapping tuple keys to tree node instances\nfunction lookup(tree, key, filter) {\n    const map = {};\n    tree.each((node)=>{\n        const t = node.data;\n        if (filter(t)) map[key(t)] = node;\n    });\n    tree.lookup = map;\n    return tree;\n}\n/**\n * Nest tuples into a tree structure, grouped by key values.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.keys - The key fields to nest by, in order.\n * @param {boolean} [params.generate=false] - A boolean flag indicating if\n *   non-leaf nodes generated by this transform should be included in the\n *   output. The default (false) includes only the input data (leaf nodes)\n *   in the data stream.\n */ function Nest(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nNest.Definition = {\n    \"type\": \"Nest\",\n    \"metadata\": {\n        \"treesource\": true,\n        \"changes\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"keys\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"generate\",\n            \"type\": \"boolean\"\n        }\n    ]\n};\nconst children = (n)=>n.values;\n(0, _vegaUtil.inherits)(Nest, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!pulse.source) (0, _vegaUtil.error)(\"Nest transform requires an upstream data source.\");\n        var gen = _.generate, mod = _.modified(), out = pulse.clone(), tree = this.value;\n        if (!tree || mod || pulse.changed()) {\n            // collect nodes to remove\n            if (tree) tree.each((node)=>{\n                if (node.children && (0, _vegaDataflow.isTuple)(node.data)) out.rem.push(node.data);\n            });\n             // generate new tree structure\n            this.value = tree = (0, _d3Hierarchy.hierarchy)({\n                values: (0, _vegaUtil.array)(_.keys).reduce((n, k)=>{\n                    n.key(k);\n                    return n;\n                }, nest()).entries(out.source)\n            }, children); // collect nodes to add\n            if (gen) tree.each((node)=>{\n                if (node.children) {\n                    node = (0, _vegaDataflow.ingest)(node.data);\n                    out.add.push(node);\n                    out.source.push(node);\n                }\n            });\n             // build lookup table\n            lookup(tree, (0, _vegaDataflow.tupleid), (0, _vegaDataflow.tupleid));\n        }\n        out.source.root = tree;\n        return out;\n    }\n});\nfunction nest() {\n    const keys = [], nest1 = {\n        entries: (array)=>entries(apply(array, 0), 0),\n        key: (d)=>(keys.push(d), nest1)\n    };\n    function apply(array, depth) {\n        if (depth >= keys.length) return array;\n        const n = array.length, key = keys[depth++], valuesByKey = {}, result = {};\n        let i = -1, keyValue, value, values;\n        while(++i < n){\n            keyValue = key(value = array[i]) + \"\";\n            if (values = valuesByKey[keyValue]) values.push(value);\n            else valuesByKey[keyValue] = [\n                value\n            ];\n        }\n        for(keyValue in valuesByKey)result[keyValue] = apply(valuesByKey[keyValue], depth);\n        return result;\n    }\n    function entries(map, depth) {\n        if (++depth > keys.length) return map;\n        const array = [];\n        for(const key in map)array.push({\n            key,\n            values: entries(map[key], depth)\n        });\n        return array;\n    }\n    return nest1;\n}\n/**\n * Abstract class for tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function HierarchyLayout(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nconst defaultSeparation = (a, b)=>a.parent === b.parent ? 1 : 2;\n(0, _vegaUtil.inherits)(HierarchyLayout, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!pulse.source || !pulse.source.root) (0, _vegaUtil.error)(this.constructor.name + \" transform requires a backing tree data source.\");\n        const layout = this.layout(_.method), fields = this.fields, root = pulse.source.root, as = _.as || fields;\n        if (_.field) root.sum(_.field);\n        else root.count();\n        if (_.sort) root.sort((0, _vegaDataflow.stableCompare)(_.sort, (d)=>d.data));\n        setParams(layout, this.params, _);\n        if (layout.separation) layout.separation(_.separation !== false ? defaultSeparation : (0, _vegaUtil.one));\n        try {\n            this.value = layout(root);\n        } catch (err) {\n            (0, _vegaUtil.error)(err);\n        }\n        root.each((node)=>setFields(node, fields, as));\n        return pulse.reflow(_.modified()).modifies(as).modifies(\"leaf\");\n    }\n});\nfunction setParams(layout, params, _) {\n    for(let p, i = 0, n = params.length; i < n; ++i){\n        p = params[i];\n        if (p in _) layout[p](_[p]);\n    }\n}\nfunction setFields(node, fields, as) {\n    const t = node.data, n = fields.length - 1;\n    for(let i = 0; i < n; ++i)t[as[i]] = node[fields[i]];\n    t[as[n]] = node.children ? node.children.length : 0;\n}\nconst Output = [\n    \"x\",\n    \"y\",\n    \"r\",\n    \"depth\",\n    \"children\"\n];\n/**\n * Packed circle tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */ function Pack(params) {\n    HierarchyLayout.call(this, params);\n}\nPack.Definition = {\n    \"type\": \"Pack\",\n    \"metadata\": {\n        \"tree\": true,\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"padding\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"radius\",\n            \"type\": \"field\",\n            \"default\": null\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": Output.length,\n            \"default\": Output\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Pack, HierarchyLayout, {\n    layout: (0, _d3Hierarchy.pack),\n    params: [\n        \"radius\",\n        \"size\",\n        \"padding\"\n    ],\n    fields: Output\n});\nconst Output$1 = [\n    \"x0\",\n    \"y0\",\n    \"x1\",\n    \"y1\",\n    \"depth\",\n    \"children\"\n];\n/**\n * Partition tree layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */ function Partition(params) {\n    HierarchyLayout.call(this, params);\n}\nPartition.Definition = {\n    \"type\": \"Partition\",\n    \"metadata\": {\n        \"tree\": true,\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"padding\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"round\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": Output$1.length,\n            \"default\": Output$1\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Partition, HierarchyLayout, {\n    layout: (0, _d3Hierarchy.partition),\n    params: [\n        \"size\",\n        \"round\",\n        \"padding\"\n    ],\n    fields: Output$1\n});\n/**\n * Stratify a collection of tuples into a tree structure based on\n * id and parent id fields.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.key - Unique key field for each tuple.\n * @param {function(object): *} params.parentKey - Field with key for parent tuple.\n */ function Stratify(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nStratify.Definition = {\n    \"type\": \"Stratify\",\n    \"metadata\": {\n        \"treesource\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"key\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"parentKey\",\n            \"type\": \"field\",\n            \"required\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Stratify, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!pulse.source) (0, _vegaUtil.error)(\"Stratify transform requires an upstream data source.\");\n        let tree = this.value;\n        const mod = _.modified(), out = pulse.fork(pulse.ALL).materialize(pulse.SOURCE), run = !tree || mod || pulse.changed(pulse.ADD_REM) || pulse.modified(_.key.fields) || pulse.modified(_.parentKey.fields); // prevent upstream source pollution\n        out.source = out.source.slice();\n        if (run) tree = out.source.length ? lookup((0, _d3Hierarchy.stratify)().id(_.key).parentId(_.parentKey)(out.source), _.key, (0, _vegaUtil.truthy)) : lookup((0, _d3Hierarchy.stratify)()([\n            {}\n        ]), _.key, _.key);\n        out.source.root = this.value = tree;\n        return out;\n    }\n});\nconst Layouts = {\n    tidy: (0, _d3Hierarchy.tree),\n    cluster: (0, _d3Hierarchy.cluster)\n};\nconst Output$2 = [\n    \"x\",\n    \"y\",\n    \"depth\",\n    \"children\"\n];\n/**\n * Tree layout. Depending on the method parameter, performs either\n * Reingold-Tilford 'tidy' layout or dendrogram 'cluster' layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function Tree(params) {\n    HierarchyLayout.call(this, params);\n}\nTree.Definition = {\n    \"type\": \"Tree\",\n    \"metadata\": {\n        \"tree\": true,\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"enum\",\n            \"default\": \"tidy\",\n            \"values\": [\n                \"tidy\",\n                \"cluster\"\n            ]\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"nodeSize\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"separation\",\n            \"type\": \"boolean\",\n            \"default\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": Output$2.length,\n            \"default\": Output$2\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Tree, HierarchyLayout, {\n    /**\n   * Tree layout generator. Supports both 'tidy' and 'cluster' layouts.\n   */ layout (method) {\n        const m = method || \"tidy\";\n        if ((0, _vegaUtil.hasOwnProperty)(Layouts, m)) return Layouts[m]();\n        else (0, _vegaUtil.error)(\"Unrecognized Tree layout method: \" + m);\n    },\n    params: [\n        \"size\",\n        \"nodeSize\"\n    ],\n    fields: Output$2\n});\n/**\n * Generate tuples representing links between tree nodes.\n * The resulting tuples will contain 'source' and 'target' fields,\n * which point to parent and child node tuples, respectively.\n * @constructor\n * @param {object} params - The parameters for this operator.\n */ function TreeLinks(params) {\n    (0, _vegaDataflow.Transform).call(this, [], params);\n}\nTreeLinks.Definition = {\n    \"type\": \"TreeLinks\",\n    \"metadata\": {\n        \"tree\": true,\n        \"generates\": true,\n        \"changes\": true\n    },\n    \"params\": []\n};\n(0, _vegaUtil.inherits)(TreeLinks, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const links = this.value, tree = pulse.source && pulse.source.root, out = pulse.fork(pulse.NO_SOURCE), lut = {};\n        if (!tree) (0, _vegaUtil.error)(\"TreeLinks transform requires a tree data source.\");\n        if (pulse.changed(pulse.ADD_REM)) {\n            // remove previous links\n            out.rem = links; // build lookup table of valid tuples\n            pulse.visit(pulse.SOURCE, (t)=>lut[(0, _vegaDataflow.tupleid)(t)] = 1); // generate links for all edges incident on valid tuples\n            tree.each((node)=>{\n                const t = node.data, p = node.parent && node.parent.data;\n                if (p && lut[(0, _vegaDataflow.tupleid)(t)] && lut[(0, _vegaDataflow.tupleid)(p)]) out.add.push((0, _vegaDataflow.ingest)({\n                    source: p,\n                    target: t\n                }));\n            });\n            this.value = out.add;\n        } else if (pulse.changed(pulse.MOD)) {\n            // build lookup table of modified tuples\n            pulse.visit(pulse.MOD, (t)=>lut[(0, _vegaDataflow.tupleid)(t)] = 1); // gather links incident on modified tuples\n            links.forEach((link)=>{\n                if (lut[(0, _vegaDataflow.tupleid)(link.source)] || lut[(0, _vegaDataflow.tupleid)(link.target)]) out.mod.push(link);\n            });\n        }\n        return out;\n    }\n});\nconst Tiles = {\n    binary: (0, _d3Hierarchy.treemapBinary),\n    dice: (0, _d3Hierarchy.treemapDice),\n    slice: (0, _d3Hierarchy.treemapSlice),\n    slicedice: (0, _d3Hierarchy.treemapSliceDice),\n    squarify: (0, _d3Hierarchy.treemapSquarify),\n    resquarify: (0, _d3Hierarchy.treemapResquarify)\n};\nconst Output$3 = [\n    \"x0\",\n    \"y0\",\n    \"x1\",\n    \"y1\",\n    \"depth\",\n    \"children\"\n];\n/**\n * Treemap layout.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.field - The value field to size nodes.\n */ function Treemap(params) {\n    HierarchyLayout.call(this, params);\n}\nTreemap.Definition = {\n    \"type\": \"Treemap\",\n    \"metadata\": {\n        \"tree\": true,\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"field\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"sort\",\n            \"type\": \"compare\"\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"enum\",\n            \"default\": \"squarify\",\n            \"values\": [\n                \"squarify\",\n                \"resquarify\",\n                \"binary\",\n                \"dice\",\n                \"slice\",\n                \"slicedice\"\n            ]\n        },\n        {\n            \"name\": \"padding\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingInner\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingOuter\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingTop\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingRight\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingBottom\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"paddingLeft\",\n            \"type\": \"number\",\n            \"default\": 0\n        },\n        {\n            \"name\": \"ratio\",\n            \"type\": \"number\",\n            \"default\": 1.618033988749895\n        },\n        {\n            \"name\": \"round\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": Output$3.length,\n            \"default\": Output$3\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Treemap, HierarchyLayout, {\n    /**\n   * Treemap layout generator. Adds 'method' and 'ratio' parameters\n   * to configure the underlying tile method.\n   */ layout () {\n        const x = (0, _d3Hierarchy.treemap)();\n        x.ratio = (_)=>{\n            const t = x.tile();\n            if (t.ratio) x.tile(t.ratio(_));\n        };\n        x.method = (_)=>{\n            if ((0, _vegaUtil.hasOwnProperty)(Tiles, _)) x.tile(Tiles[_]);\n            else (0, _vegaUtil.error)(\"Unrecognized Treemap layout method: \" + _);\n        };\n        return x;\n    },\n    params: [\n        \"method\",\n        \"ratio\",\n        \"size\",\n        \"round\",\n        \"padding\",\n        \"paddingInner\",\n        \"paddingOuter\",\n        \"paddingTop\",\n        \"paddingRight\",\n        \"paddingBottom\",\n        \"paddingLeft\"\n    ],\n    fields: Output$3\n});\n\n},{\"vega-dataflow\":\"3NitK\",\"vega-util\":\"bApja\",\"d3-hierarchy\":\"4fr5p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4fr5p\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"cluster\", ()=>(0, _clusterJsDefault.default));\nparcelHelpers.export(exports, \"hierarchy\", ()=>(0, _indexJsDefault.default));\nparcelHelpers.export(exports, \"pack\", ()=>(0, _indexJsDefault1.default));\nparcelHelpers.export(exports, \"packSiblings\", ()=>(0, _siblingsJsDefault.default));\nparcelHelpers.export(exports, \"packEnclose\", ()=>(0, _encloseJsDefault.default));\nparcelHelpers.export(exports, \"partition\", ()=>(0, _partitionJsDefault.default));\nparcelHelpers.export(exports, \"stratify\", ()=>(0, _stratifyJsDefault.default));\nparcelHelpers.export(exports, \"tree\", ()=>(0, _treeJsDefault.default));\nparcelHelpers.export(exports, \"treemap\", ()=>(0, _indexJsDefault2.default));\nparcelHelpers.export(exports, \"treemapBinary\", ()=>(0, _binaryJsDefault.default));\nparcelHelpers.export(exports, \"treemapDice\", ()=>(0, _diceJsDefault.default));\nparcelHelpers.export(exports, \"treemapSlice\", ()=>(0, _sliceJsDefault.default));\nparcelHelpers.export(exports, \"treemapSliceDice\", ()=>(0, _sliceDiceJsDefault.default));\nparcelHelpers.export(exports, \"treemapSquarify\", ()=>(0, _squarifyJsDefault.default));\nparcelHelpers.export(exports, \"treemapResquarify\", ()=>(0, _resquarifyJsDefault.default));\nvar _clusterJs = require(\"./cluster.js\");\nvar _clusterJsDefault = parcelHelpers.interopDefault(_clusterJs);\nvar _indexJs = require(\"./hierarchy/index.js\");\nvar _indexJsDefault = parcelHelpers.interopDefault(_indexJs);\nvar _indexJs1 = require(\"./pack/index.js\");\nvar _indexJsDefault1 = parcelHelpers.interopDefault(_indexJs1);\nvar _siblingsJs = require(\"./pack/siblings.js\");\nvar _siblingsJsDefault = parcelHelpers.interopDefault(_siblingsJs);\nvar _encloseJs = require(\"./pack/enclose.js\");\nvar _encloseJsDefault = parcelHelpers.interopDefault(_encloseJs);\nvar _partitionJs = require(\"./partition.js\");\nvar _partitionJsDefault = parcelHelpers.interopDefault(_partitionJs);\nvar _stratifyJs = require(\"./stratify.js\");\nvar _stratifyJsDefault = parcelHelpers.interopDefault(_stratifyJs);\nvar _treeJs = require(\"./tree.js\");\nvar _treeJsDefault = parcelHelpers.interopDefault(_treeJs);\nvar _indexJs2 = require(\"./treemap/index.js\");\nvar _indexJsDefault2 = parcelHelpers.interopDefault(_indexJs2);\nvar _binaryJs = require(\"./treemap/binary.js\");\nvar _binaryJsDefault = parcelHelpers.interopDefault(_binaryJs);\nvar _diceJs = require(\"./treemap/dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nvar _sliceJs = require(\"./treemap/slice.js\");\nvar _sliceJsDefault = parcelHelpers.interopDefault(_sliceJs);\nvar _sliceDiceJs = require(\"./treemap/sliceDice.js\");\nvar _sliceDiceJsDefault = parcelHelpers.interopDefault(_sliceDiceJs);\nvar _squarifyJs = require(\"./treemap/squarify.js\");\nvar _squarifyJsDefault = parcelHelpers.interopDefault(_squarifyJs);\nvar _resquarifyJs = require(\"./treemap/resquarify.js\");\nvar _resquarifyJsDefault = parcelHelpers.interopDefault(_resquarifyJs);\n\n},{\"./cluster.js\":\"fviPU\",\"./hierarchy/index.js\":\"jtgBj\",\"./pack/index.js\":\"eQFOB\",\"./pack/siblings.js\":\"8RhM7\",\"./pack/enclose.js\":\"gBh5f\",\"./partition.js\":\"hfHoW\",\"./stratify.js\":\"1euRH\",\"./tree.js\":\"5MDZW\",\"./treemap/index.js\":\"ew6JB\",\"./treemap/binary.js\":\"8vqlk\",\"./treemap/dice.js\":\"c7pGx\",\"./treemap/slice.js\":\"c9bya\",\"./treemap/sliceDice.js\":\"fbNXv\",\"./treemap/squarify.js\":\"dnoy6\",\"./treemap/resquarify.js\":\"12ScZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fviPU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction defaultSeparation(a, b) {\n    return a.parent === b.parent ? 1 : 2;\n}\nfunction meanX(children) {\n    return children.reduce(meanXReduce, 0) / children.length;\n}\nfunction meanXReduce(x, c) {\n    return x + c.x;\n}\nfunction maxY(children) {\n    return 1 + children.reduce(maxYReduce, 0);\n}\nfunction maxYReduce(y, c) {\n    return Math.max(y, c.y);\n}\nfunction leafLeft(node) {\n    var children;\n    while(children = node.children)node = children[0];\n    return node;\n}\nfunction leafRight(node) {\n    var children;\n    while(children = node.children)node = children[children.length - 1];\n    return node;\n}\nexports.default = function() {\n    var separation = defaultSeparation, dx = 1, dy = 1, nodeSize = false;\n    function cluster(root) {\n        var previousNode, x = 0;\n        // First walk, computing the initial x & y values.\n        root.eachAfter(function(node) {\n            var children = node.children;\n            if (children) {\n                node.x = meanX(children);\n                node.y = maxY(children);\n            } else {\n                node.x = previousNode ? x += separation(node, previousNode) : 0;\n                node.y = 0;\n                previousNode = node;\n            }\n        });\n        var left = leafLeft(root), right = leafRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n        // Second walk, normalizing x & y to the desired size.\n        return root.eachAfter(nodeSize ? function(node) {\n            node.x = (node.x - root.x) * dx;\n            node.y = (root.y - node.y) * dy;\n        } : function(node) {\n            node.x = (node.x - x0) / (x1 - x0) * dx;\n            node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n        });\n    }\n    cluster.separation = function(x) {\n        return arguments.length ? (separation = x, cluster) : separation;\n    };\n    cluster.size = function(x) {\n        return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : nodeSize ? null : [\n            dx,\n            dy\n        ];\n    };\n    cluster.nodeSize = function(x) {\n        return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : nodeSize ? [\n            dx,\n            dy\n        ] : null;\n    };\n    return cluster;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jtgBj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"computeHeight\", ()=>computeHeight);\nparcelHelpers.export(exports, \"Node\", ()=>Node);\nvar _countJs = require(\"./count.js\");\nvar _countJsDefault = parcelHelpers.interopDefault(_countJs);\nvar _eachJs = require(\"./each.js\");\nvar _eachJsDefault = parcelHelpers.interopDefault(_eachJs);\nvar _eachBeforeJs = require(\"./eachBefore.js\");\nvar _eachBeforeJsDefault = parcelHelpers.interopDefault(_eachBeforeJs);\nvar _eachAfterJs = require(\"./eachAfter.js\");\nvar _eachAfterJsDefault = parcelHelpers.interopDefault(_eachAfterJs);\nvar _findJs = require(\"./find.js\");\nvar _findJsDefault = parcelHelpers.interopDefault(_findJs);\nvar _sumJs = require(\"./sum.js\");\nvar _sumJsDefault = parcelHelpers.interopDefault(_sumJs);\nvar _sortJs = require(\"./sort.js\");\nvar _sortJsDefault = parcelHelpers.interopDefault(_sortJs);\nvar _pathJs = require(\"./path.js\");\nvar _pathJsDefault = parcelHelpers.interopDefault(_pathJs);\nvar _ancestorsJs = require(\"./ancestors.js\");\nvar _ancestorsJsDefault = parcelHelpers.interopDefault(_ancestorsJs);\nvar _descendantsJs = require(\"./descendants.js\");\nvar _descendantsJsDefault = parcelHelpers.interopDefault(_descendantsJs);\nvar _leavesJs = require(\"./leaves.js\");\nvar _leavesJsDefault = parcelHelpers.interopDefault(_leavesJs);\nvar _linksJs = require(\"./links.js\");\nvar _linksJsDefault = parcelHelpers.interopDefault(_linksJs);\nvar _iteratorJs = require(\"./iterator.js\");\nvar _iteratorJsDefault = parcelHelpers.interopDefault(_iteratorJs);\nfunction hierarchy(data, children) {\n    if (data instanceof Map) {\n        data = [\n            undefined,\n            data\n        ];\n        if (children === undefined) children = mapChildren;\n    } else if (children === undefined) children = objectChildren;\n    var root = new Node(data), node, nodes = [\n        root\n    ], child, childs, i, n;\n    while(node = nodes.pop())if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) {\n        node.children = childs;\n        for(i = n - 1; i >= 0; --i){\n            nodes.push(child = childs[i] = new Node(childs[i]));\n            child.parent = node;\n            child.depth = node.depth + 1;\n        }\n    }\n    return root.eachBefore(computeHeight);\n}\nexports.default = hierarchy;\nfunction node_copy() {\n    return hierarchy(this).eachBefore(copyData);\n}\nfunction objectChildren(d) {\n    return d.children;\n}\nfunction mapChildren(d) {\n    return Array.isArray(d) ? d[1] : null;\n}\nfunction copyData(node) {\n    if (node.data.value !== undefined) node.value = node.data.value;\n    node.data = node.data.data;\n}\nfunction computeHeight(node) {\n    var height = 0;\n    do node.height = height;\n    while ((node = node.parent) && node.height < ++height);\n}\nfunction Node(data) {\n    this.data = data;\n    this.depth = this.height = 0;\n    this.parent = null;\n}\nNode.prototype = hierarchy.prototype = {\n    constructor: Node,\n    count: (0, _countJsDefault.default),\n    each: (0, _eachJsDefault.default),\n    eachAfter: (0, _eachAfterJsDefault.default),\n    eachBefore: (0, _eachBeforeJsDefault.default),\n    find: (0, _findJsDefault.default),\n    sum: (0, _sumJsDefault.default),\n    sort: (0, _sortJsDefault.default),\n    path: (0, _pathJsDefault.default),\n    ancestors: (0, _ancestorsJsDefault.default),\n    descendants: (0, _descendantsJsDefault.default),\n    leaves: (0, _leavesJsDefault.default),\n    links: (0, _linksJsDefault.default),\n    copy: node_copy,\n    [Symbol.iterator]: (0, _iteratorJsDefault.default)\n};\n\n},{\"./count.js\":\"jNzMu\",\"./each.js\":\"8q3O0\",\"./eachBefore.js\":\"kBI99\",\"./eachAfter.js\":\"goYvF\",\"./find.js\":\"dotdr\",\"./sum.js\":\"6wYAA\",\"./sort.js\":\"ljhs0\",\"./path.js\":\"ecIKT\",\"./ancestors.js\":\"9BIjB\",\"./descendants.js\":\"6MhHV\",\"./leaves.js\":\"jpVT1\",\"./links.js\":\"eJseT\",\"./iterator.js\":\"aGwDK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jNzMu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction count(node) {\n    var sum = 0, children = node.children, i = children && children.length;\n    if (!i) sum = 1;\n    else while(--i >= 0)sum += children[i].value;\n    node.value = sum;\n}\nexports.default = function() {\n    return this.eachAfter(count);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8q3O0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(callback, that) {\n    let index = -1;\n    for (const node of this)callback.call(that, node, ++index, this);\n    return this;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kBI99\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(callback, that) {\n    var node = this, nodes = [\n        node\n    ], children, i, index = -1;\n    while(node = nodes.pop()){\n        callback.call(that, node, ++index, this);\n        if (children = node.children) for(i = children.length - 1; i >= 0; --i)nodes.push(children[i]);\n    }\n    return this;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"goYvF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(callback, that) {\n    var node = this, nodes = [\n        node\n    ], next = [], children, i, n, index = -1;\n    while(node = nodes.pop()){\n        next.push(node);\n        if (children = node.children) for(i = 0, n = children.length; i < n; ++i)nodes.push(children[i]);\n    }\n    while(node = next.pop())callback.call(that, node, ++index, this);\n    return this;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dotdr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(callback, that) {\n    let index = -1;\n    for (const node of this){\n        if (callback.call(that, node, ++index, this)) return node;\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6wYAA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(value) {\n    return this.eachAfter(function(node) {\n        var sum = +value(node.data) || 0, children = node.children, i = children && children.length;\n        while(--i >= 0)sum += children[i].value;\n        node.value = sum;\n    });\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ljhs0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(compare) {\n    return this.eachBefore(function(node) {\n        if (node.children) node.children.sort(compare);\n    });\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ecIKT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(end) {\n    var start = this, ancestor = leastCommonAncestor(start, end), nodes = [\n        start\n    ];\n    while(start !== ancestor){\n        start = start.parent;\n        nodes.push(start);\n    }\n    var k = nodes.length;\n    while(end !== ancestor){\n        nodes.splice(k, 0, end);\n        end = end.parent;\n    }\n    return nodes;\n};\nfunction leastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = a.ancestors(), bNodes = b.ancestors(), c = null;\n    a = aNodes.pop();\n    b = bNodes.pop();\n    while(a === b){\n        c = a;\n        a = aNodes.pop();\n        b = bNodes.pop();\n    }\n    return c;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9BIjB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var node = this, nodes = [\n        node\n    ];\n    while(node = node.parent)nodes.push(node);\n    return nodes;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6MhHV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    return Array.from(this);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jpVT1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var leaves = [];\n    this.eachBefore(function(node) {\n        if (!node.children) leaves.push(node);\n    });\n    return leaves;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eJseT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function() {\n    var root = this, links = [];\n    root.each(function(node) {\n        if (node !== root) links.push({\n            source: node.parent,\n            target: node\n        });\n    });\n    return links;\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aGwDK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function*() {\n    var node = this, current, next = [\n        node\n    ], children, i, n;\n    do {\n        current = next.reverse(), next = [];\n        while(node = current.pop()){\n            yield node;\n            if (children = node.children) for(i = 0, n = children.length; i < n; ++i)next.push(children[i]);\n        }\n    }while (next.length);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eQFOB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _siblingsJs = require(\"./siblings.js\");\nvar _accessorsJs = require(\"../accessors.js\");\nvar _constantJs = require(\"../constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nfunction defaultRadius(d) {\n    return Math.sqrt(d.value);\n}\nexports.default = function() {\n    var radius = null, dx = 1, dy = 1, padding = (0, _constantJs.constantZero);\n    function pack(root) {\n        root.x = dx / 2, root.y = dy / 2;\n        if (radius) root.eachBefore(radiusLeaf(radius)).eachAfter(packChildren(padding, 0.5)).eachBefore(translateChild(1));\n        else root.eachBefore(radiusLeaf(defaultRadius)).eachAfter(packChildren((0, _constantJs.constantZero), 1)).eachAfter(packChildren(padding, root.r / Math.min(dx, dy))).eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n        return root;\n    }\n    pack.radius = function(x) {\n        return arguments.length ? (radius = (0, _accessorsJs.optional)(x), pack) : radius;\n    };\n    pack.size = function(x) {\n        return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [\n            dx,\n            dy\n        ];\n    };\n    pack.padding = function(x) {\n        return arguments.length ? (padding = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), pack) : padding;\n    };\n    return pack;\n};\nfunction radiusLeaf(radius) {\n    return function(node) {\n        if (!node.children) node.r = Math.max(0, +radius(node) || 0);\n    };\n}\nfunction packChildren(padding, k) {\n    return function(node) {\n        if (children = node.children) {\n            var children, i, n = children.length, r = padding(node) * k || 0, e;\n            if (r) for(i = 0; i < n; ++i)children[i].r += r;\n            e = (0, _siblingsJs.packEnclose)(children);\n            if (r) for(i = 0; i < n; ++i)children[i].r -= r;\n            node.r = e + r;\n        }\n    };\n}\nfunction translateChild(k) {\n    return function(node) {\n        var parent = node.parent;\n        node.r *= k;\n        if (parent) {\n            node.x = parent.x + k * node.x;\n            node.y = parent.y + k * node.y;\n        }\n    };\n}\n\n},{\"./siblings.js\":\"8RhM7\",\"../accessors.js\":\"i242w\",\"../constant.js\":\"i6Ely\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8RhM7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"packEnclose\", ()=>packEnclose);\nvar _arrayJs = require(\"../array.js\");\nvar _arrayJsDefault = parcelHelpers.interopDefault(_arrayJs);\nvar _encloseJs = require(\"./enclose.js\");\nvar _encloseJsDefault = parcelHelpers.interopDefault(_encloseJs);\nfunction place(b, a, c) {\n    var dx = b.x - a.x, x, a2, dy = b.y - a.y, y, b2, d2 = dx * dx + dy * dy;\n    if (d2) {\n        a2 = a.r + c.r, a2 *= a2;\n        b2 = b.r + c.r, b2 *= b2;\n        if (a2 > b2) {\n            x = (d2 + b2 - a2) / (2 * d2);\n            y = Math.sqrt(Math.max(0, b2 / d2 - x * x));\n            c.x = b.x - x * dx - y * dy;\n            c.y = b.y - x * dy + y * dx;\n        } else {\n            x = (d2 + a2 - b2) / (2 * d2);\n            y = Math.sqrt(Math.max(0, a2 / d2 - x * x));\n            c.x = a.x + x * dx - y * dy;\n            c.y = a.y + x * dy + y * dx;\n        }\n    } else {\n        c.x = a.x + c.r;\n        c.y = a.y;\n    }\n}\nfunction intersects(a, b) {\n    var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\nfunction score(node) {\n    var a = node._, b = node.next._, ab = a.r + b.r, dx = (a.x * b.r + b.x * a.r) / ab, dy = (a.y * b.r + b.y * a.r) / ab;\n    return dx * dx + dy * dy;\n}\nfunction Node(circle) {\n    this._ = circle;\n    this.next = null;\n    this.previous = null;\n}\nfunction packEnclose(circles) {\n    if (!(n = (circles = (0, _arrayJsDefault.default)(circles)).length)) return 0;\n    var a, b, c, n, aa, ca, i, j, k, sj, sk;\n    // Place the first circle.\n    a = circles[0], a.x = 0, a.y = 0;\n    if (!(n > 1)) return a.r;\n    // Place the second circle.\n    b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;\n    if (!(n > 2)) return a.r + b.r;\n    // Place the third circle.\n    place(b, a, c = circles[2]);\n    // Initialize the front-chain using the first three circles a, b and c.\n    a = new Node(a), b = new Node(b), c = new Node(c);\n    a.next = c.previous = b;\n    b.next = a.previous = c;\n    c.next = b.previous = a;\n    // Attempt to place each remaining circle…\n    pack: for(i = 3; i < n; ++i){\n        place(a._, b._, c = circles[i]), c = new Node(c);\n        // Find the closest intersecting circle on the front-chain, if any.\n        // “Closeness” is determined by linear distance along the front-chain.\n        // “Ahead” or “behind” is likewise determined by linear distance.\n        j = b.next, k = a.previous, sj = b._.r, sk = a._.r;\n        do if (sj <= sk) {\n            if (intersects(j._, c._)) {\n                b = j, a.next = b, b.previous = a, --i;\n                continue pack;\n            }\n            sj += j._.r, j = j.next;\n        } else {\n            if (intersects(k._, c._)) {\n                a = k, a.next = b, b.previous = a, --i;\n                continue pack;\n            }\n            sk += k._.r, k = k.previous;\n        }\n        while (j !== k.next);\n        // Success! Insert the new circle c between a and b.\n        c.previous = a, c.next = b, a.next = b.previous = b = c;\n        // Compute the new closest circle pair to the centroid.\n        aa = score(a);\n        while((c = c.next) !== b)if ((ca = score(c)) < aa) a = c, aa = ca;\n        b = a.next;\n    }\n    // Compute the enclosing circle of the front chain.\n    a = [\n        b._\n    ], c = b;\n    while((c = c.next) !== b)a.push(c._);\n    c = (0, _encloseJsDefault.default)(a);\n    // Translate the circles to put the enclosing circle around the origin.\n    for(i = 0; i < n; ++i)a = circles[i], a.x -= c.x, a.y -= c.y;\n    return c.r;\n}\nexports.default = function(circles) {\n    packEnclose(circles);\n    return circles;\n};\n\n},{\"../array.js\":\"4vcaT\",\"./enclose.js\":\"gBh5f\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4vcaT\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"shuffle\", ()=>shuffle);\nexports.default = function(x) {\n    return typeof x === \"object\" && \"length\" in x ? x // Array, TypedArray, NodeList, array-like\n     : Array.from(x); // Map, Set, iterable, string, or anything else\n};\nfunction shuffle(array) {\n    var m = array.length, t, i;\n    while(m){\n        i = Math.random() * m-- | 0;\n        t = array[m];\n        array[m] = array[i];\n        array[i] = t;\n    }\n    return array;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gBh5f\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _arrayJs = require(\"../array.js\");\nexports.default = function(circles) {\n    var i = 0, n = (circles = (0, _arrayJs.shuffle)(Array.from(circles))).length, B = [], p, e;\n    while(i < n){\n        p = circles[i];\n        if (e && enclosesWeak(e, p)) ++i;\n        else e = encloseBasis(B = extendBasis(B, p)), i = 0;\n    }\n    return e;\n};\nfunction extendBasis(B, p) {\n    var i, j;\n    if (enclosesWeakAll(p, B)) return [\n        p\n    ];\n    // If we get here then B must have at least one element.\n    for(i = 0; i < B.length; ++i){\n        if (enclosesNot(p, B[i]) && enclosesWeakAll(encloseBasis2(B[i], p), B)) return [\n            B[i],\n            p\n        ];\n    }\n    // If we get here then B must have at least two elements.\n    for(i = 0; i < B.length - 1; ++i)for(j = i + 1; j < B.length; ++j){\n        if (enclosesNot(encloseBasis2(B[i], B[j]), p) && enclosesNot(encloseBasis2(B[i], p), B[j]) && enclosesNot(encloseBasis2(B[j], p), B[i]) && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) return [\n            B[i],\n            B[j],\n            p\n        ];\n    }\n    // If we get here then something is very wrong.\n    throw new Error;\n}\nfunction enclosesNot(a, b) {\n    var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;\n    return dr < 0 || dr * dr < dx * dx + dy * dy;\n}\nfunction enclosesWeak(a, b) {\n    var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n}\nfunction enclosesWeakAll(a, B) {\n    for(var i = 0; i < B.length; ++i){\n        if (!enclosesWeak(a, B[i])) return false;\n    }\n    return true;\n}\nfunction encloseBasis(B) {\n    switch(B.length){\n        case 1:\n            return encloseBasis1(B[0]);\n        case 2:\n            return encloseBasis2(B[0], B[1]);\n        case 3:\n            return encloseBasis3(B[0], B[1], B[2]);\n    }\n}\nfunction encloseBasis1(a) {\n    return {\n        x: a.x,\n        y: a.y,\n        r: a.r\n    };\n}\nfunction encloseBasis2(a, b) {\n    var x1 = a.x, y1 = a.y, r1 = a.r, x2 = b.x, y2 = b.y, r2 = b.r, x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, l = Math.sqrt(x21 * x21 + y21 * y21);\n    return {\n        x: (x1 + x2 + x21 / l * r21) / 2,\n        y: (y1 + y2 + y21 / l * r21) / 2,\n        r: (l + r1 + r2) / 2\n    };\n}\nfunction encloseBasis3(a, b, c) {\n    var x1 = a.x, y1 = a.y, r1 = a.r, x2 = b.x, y2 = b.y, r2 = b.r, x3 = c.x, y3 = c.y, r3 = c.r, a2 = x1 - x2, a3 = x1 - x3, b2 = y1 - y2, b3 = y1 - y3, c2 = r2 - r1, c3 = r3 - r1, d1 = x1 * x1 + y1 * y1 - r1 * r1, d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, ab = a3 * b2 - a2 * b3, xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, xb = (b3 * c2 - b2 * c3) / ab, ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, yb = (a2 * c3 - a3 * c2) / ab, A = xb * xb + yb * yb - 1, B = 2 * (r1 + xa * xb + ya * yb), C = xa * xa + ya * ya - r1 * r1, r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);\n    return {\n        x: x1 + xa + xb * r,\n        y: y1 + ya + yb * r,\n        r: r\n    };\n}\n\n},{\"../array.js\":\"4vcaT\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i242w\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"optional\", ()=>optional);\nparcelHelpers.export(exports, \"required\", ()=>required);\nfunction optional(f) {\n    return f == null ? null : required(f);\n}\nfunction required(f) {\n    if (typeof f !== \"function\") throw new Error;\n    return f;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i6Ely\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"constantZero\", ()=>constantZero);\nfunction constantZero() {\n    return 0;\n}\nexports.default = function(x) {\n    return function() {\n        return x;\n    };\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hfHoW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _roundJs = require(\"./treemap/round.js\");\nvar _roundJsDefault = parcelHelpers.interopDefault(_roundJs);\nvar _diceJs = require(\"./treemap/dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nexports.default = function() {\n    var dx = 1, dy1 = 1, padding = 0, round = false;\n    function partition(root) {\n        var n = root.height + 1;\n        root.x0 = root.y0 = padding;\n        root.x1 = dx;\n        root.y1 = dy1 / n;\n        root.eachBefore(positionNode(dy1, n));\n        if (round) root.eachBefore((0, _roundJsDefault.default));\n        return root;\n    }\n    function positionNode(dy, n) {\n        return function(node) {\n            if (node.children) (0, _diceJsDefault.default)(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);\n            var x0 = node.x0, y0 = node.y0, x1 = node.x1 - padding, y1 = node.y1 - padding;\n            if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n            if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n            node.x0 = x0;\n            node.y0 = y0;\n            node.x1 = x1;\n            node.y1 = y1;\n        };\n    }\n    partition.round = function(x) {\n        return arguments.length ? (round = !!x, partition) : round;\n    };\n    partition.size = function(x) {\n        return arguments.length ? (dx = +x[0], dy1 = +x[1], partition) : [\n            dx,\n            dy1\n        ];\n    };\n    partition.padding = function(x) {\n        return arguments.length ? (padding = +x, partition) : padding;\n    };\n    return partition;\n};\n\n},{\"./treemap/round.js\":\"9PNun\",\"./treemap/dice.js\":\"c7pGx\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9PNun\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(node) {\n    node.x0 = Math.round(node.x0);\n    node.y0 = Math.round(node.y0);\n    node.x1 = Math.round(node.x1);\n    node.y1 = Math.round(node.y1);\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c7pGx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(parent, x0, y0, x1, y1) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (x1 - x0) / parent.value;\n    while(++i < n){\n        node = nodes[i], node.y0 = y0, node.y1 = y1;\n        node.x0 = x0, node.x1 = x0 += node.value * k;\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1euRH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _accessorsJs = require(\"./accessors.js\");\nvar _indexJs = require(\"./hierarchy/index.js\");\nvar preroot = {\n    depth: -1\n}, ambiguous = {};\nfunction defaultId(d) {\n    return d.id;\n}\nfunction defaultParentId(d) {\n    return d.parentId;\n}\nexports.default = function() {\n    var id = defaultId, parentId = defaultParentId;\n    function stratify(data) {\n        var nodes = Array.from(data), n = nodes.length, d, i, root, parent, node1, nodeId, nodeKey, nodeByKey = new Map;\n        for(i = 0; i < n; ++i){\n            d = nodes[i], node1 = nodes[i] = new (0, _indexJs.Node)(d);\n            if ((nodeId = id(d, i, data)) != null && (nodeId += \"\")) {\n                nodeKey = node1.id = nodeId;\n                nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node1);\n            }\n            if ((nodeId = parentId(d, i, data)) != null && (nodeId += \"\")) node1.parent = nodeId;\n        }\n        for(i = 0; i < n; ++i){\n            node1 = nodes[i];\n            if (nodeId = node1.parent) {\n                parent = nodeByKey.get(nodeId);\n                if (!parent) throw new Error(\"missing: \" + nodeId);\n                if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n                if (parent.children) parent.children.push(node1);\n                else parent.children = [\n                    node1\n                ];\n                node1.parent = parent;\n            } else {\n                if (root) throw new Error(\"multiple roots\");\n                root = node1;\n            }\n        }\n        if (!root) throw new Error(\"no root\");\n        root.parent = preroot;\n        root.eachBefore(function(node) {\n            node.depth = node.parent.depth + 1;\n            --n;\n        }).eachBefore((0, _indexJs.computeHeight));\n        root.parent = null;\n        if (n > 0) throw new Error(\"cycle\");\n        return root;\n    }\n    stratify.id = function(x) {\n        return arguments.length ? (id = (0, _accessorsJs.required)(x), stratify) : id;\n    };\n    stratify.parentId = function(x) {\n        return arguments.length ? (parentId = (0, _accessorsJs.required)(x), stratify) : parentId;\n    };\n    return stratify;\n};\n\n},{\"./accessors.js\":\"i242w\",\"./hierarchy/index.js\":\"jtgBj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5MDZW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _indexJs = require(\"./hierarchy/index.js\");\nfunction defaultSeparation(a, b) {\n    return a.parent === b.parent ? 1 : 2;\n}\n// function radialSeparation(a, b) {\n//   return (a.parent === b.parent ? 1 : 2) / a.depth;\n// }\n// This function is used to traverse the left contour of a subtree (or\n// subforest). It returns the successor of v on this contour. This successor is\n// either given by the leftmost child of v or by the thread of v. The function\n// returns null if and only if v is on the highest level of its subtree.\nfunction nextLeft(v) {\n    var children = v.children;\n    return children ? children[0] : v.t;\n}\n// This function works analogously to nextLeft.\nfunction nextRight(v) {\n    var children = v.children;\n    return children ? children[children.length - 1] : v.t;\n}\n// Shifts the current subtree rooted at w+. This is done by increasing\n// prelim(w+) and mod(w+) by shift.\nfunction moveSubtree(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n}\n// All other shifts, applied to the smaller subtrees between w- and w+, are\n// performed by this function. To prepare the shifts, we have to adjust\n// change(w+), shift(w+), and change(w-).\nfunction executeShifts(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while(--i >= 0){\n        w = children[i];\n        w.z += shift;\n        w.m += shift;\n        shift += w.s + (change += w.c);\n    }\n}\n// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,\n// returns the specified (default) ancestor.\nfunction nextAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n}\nfunction TreeNode(node, i) {\n    this._ = node;\n    this.parent = null;\n    this.children = null;\n    this.A = null; // default ancestor\n    this.a = this; // ancestor\n    this.z = 0; // prelim\n    this.m = 0; // mod\n    this.c = 0; // change\n    this.s = 0; // shift\n    this.t = null; // thread\n    this.i = i; // number\n}\nTreeNode.prototype = Object.create((0, _indexJs.Node).prototype);\nfunction treeRoot(root) {\n    var tree = new TreeNode(root, 0), node, nodes = [\n        tree\n    ], child, children, i, n;\n    while(node = nodes.pop())if (children = node._.children) {\n        node.children = new Array(n = children.length);\n        for(i = n - 1; i >= 0; --i){\n            nodes.push(child = node.children[i] = new TreeNode(children[i], i));\n            child.parent = node;\n        }\n    }\n    (tree.parent = new TreeNode(null, 0)).children = [\n        tree\n    ];\n    return tree;\n}\n// Node-link tree diagram using the Reingold-Tilford \"tidy\" algorithm\nexports.default = function() {\n    var separation = defaultSeparation, dx = 1, dy = 1, nodeSize = null;\n    function tree(root) {\n        var t = treeRoot(root);\n        // Compute the layout using Buchheim et al.’s algorithm.\n        t.eachAfter(firstWalk), t.parent.m = -t.z;\n        t.eachBefore(secondWalk);\n        // If a fixed node size is specified, scale x and y.\n        if (nodeSize) root.eachBefore(sizeNode);\n        else {\n            var left = root, right = root, bottom = root;\n            root.eachBefore(function(node) {\n                if (node.x < left.x) left = node;\n                if (node.x > right.x) right = node;\n                if (node.depth > bottom.depth) bottom = node;\n            });\n            var s = left === right ? 1 : separation(left, right) / 2, tx = s - left.x, kx = dx / (right.x + s + tx), ky = dy / (bottom.depth || 1);\n            root.eachBefore(function(node) {\n                node.x = (node.x + tx) * kx;\n                node.y = node.depth * ky;\n            });\n        }\n        return root;\n    }\n    // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is\n    // applied recursively to the children of v, as well as the function\n    // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the\n    // node v is placed to the midpoint of its outermost children.\n    function firstWalk(v) {\n        var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n        if (children) {\n            executeShifts(v);\n            var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n            if (w) {\n                v.z = w.z + separation(v._, w._);\n                v.m = v.z - midpoint;\n            } else v.z = midpoint;\n        } else if (w) v.z = w.z + separation(v._, w._);\n        v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    // Computes all real x-coordinates by summing up the modifiers recursively.\n    function secondWalk(v) {\n        v._.x = v.z + v.parent.m;\n        v.m += v.parent.m;\n    }\n    // The core of the algorithm. Here, a new subtree is combined with the\n    // previous subtrees. Threads are used to traverse the inside and outside\n    // contours of the left and right subtree up to the highest common level. The\n    // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the\n    // superscript o means outside and i means inside, the subscript - means left\n    // subtree and + means right subtree. For summing up the modifiers along the\n    // contour, we use respective variables si+, si-, so-, and so+. Whenever two\n    // nodes of the inside contours conflict, we compute the left one of the\n    // greatest uncommon ancestors using the function ANCESTOR and call MOVE\n    // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.\n    // Finally, we add a new thread (if necessary).\n    function apportion(v, w, ancestor) {\n        if (w) {\n            var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n            while(vim = nextRight(vim), vip = nextLeft(vip), vim && vip){\n                vom = nextLeft(vom);\n                vop = nextRight(vop);\n                vop.a = v;\n                shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n                if (shift > 0) {\n                    moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n                    sip += shift;\n                    sop += shift;\n                }\n                sim += vim.m;\n                sip += vip.m;\n                som += vom.m;\n                sop += vop.m;\n            }\n            if (vim && !nextRight(vop)) {\n                vop.t = vim;\n                vop.m += sim - sop;\n            }\n            if (vip && !nextLeft(vom)) {\n                vom.t = vip;\n                vom.m += sip - som;\n                ancestor = v;\n            }\n        }\n        return ancestor;\n    }\n    function sizeNode(node) {\n        node.x *= dx;\n        node.y = node.depth * dy;\n    }\n    tree.separation = function(x) {\n        return arguments.length ? (separation = x, tree) : separation;\n    };\n    tree.size = function(x) {\n        return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : nodeSize ? null : [\n            dx,\n            dy\n        ];\n    };\n    tree.nodeSize = function(x) {\n        return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : nodeSize ? [\n            dx,\n            dy\n        ] : null;\n    };\n    return tree;\n};\n\n},{\"./hierarchy/index.js\":\"jtgBj\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ew6JB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _roundJs = require(\"./round.js\");\nvar _roundJsDefault = parcelHelpers.interopDefault(_roundJs);\nvar _squarifyJs = require(\"./squarify.js\");\nvar _squarifyJsDefault = parcelHelpers.interopDefault(_squarifyJs);\nvar _accessorsJs = require(\"../accessors.js\");\nvar _constantJs = require(\"../constant.js\");\nvar _constantJsDefault = parcelHelpers.interopDefault(_constantJs);\nexports.default = function() {\n    var tile = (0, _squarifyJsDefault.default), round = false, dx = 1, dy = 1, paddingStack = [\n        0\n    ], paddingInner = (0, _constantJs.constantZero), paddingTop = (0, _constantJs.constantZero), paddingRight = (0, _constantJs.constantZero), paddingBottom = (0, _constantJs.constantZero), paddingLeft = (0, _constantJs.constantZero);\n    function treemap(root) {\n        root.x0 = root.y0 = 0;\n        root.x1 = dx;\n        root.y1 = dy;\n        root.eachBefore(positionNode);\n        paddingStack = [\n            0\n        ];\n        if (round) root.eachBefore((0, _roundJsDefault.default));\n        return root;\n    }\n    function positionNode(node) {\n        var p = paddingStack[node.depth], x0 = node.x0 + p, y0 = node.y0 + p, x1 = node.x1 - p, y1 = node.y1 - p;\n        if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n        if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n        node.x0 = x0;\n        node.y0 = y0;\n        node.x1 = x1;\n        node.y1 = y1;\n        if (node.children) {\n            p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n            x0 += paddingLeft(node) - p;\n            y0 += paddingTop(node) - p;\n            x1 -= paddingRight(node) - p;\n            y1 -= paddingBottom(node) - p;\n            if (x1 < x0) x0 = x1 = (x0 + x1) / 2;\n            if (y1 < y0) y0 = y1 = (y0 + y1) / 2;\n            tile(node, x0, y0, x1, y1);\n        }\n    }\n    treemap.round = function(x) {\n        return arguments.length ? (round = !!x, treemap) : round;\n    };\n    treemap.size = function(x) {\n        return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [\n            dx,\n            dy\n        ];\n    };\n    treemap.tile = function(x) {\n        return arguments.length ? (tile = (0, _accessorsJs.required)(x), treemap) : tile;\n    };\n    treemap.padding = function(x) {\n        return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();\n    };\n    treemap.paddingInner = function(x) {\n        return arguments.length ? (paddingInner = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingInner;\n    };\n    treemap.paddingOuter = function(x) {\n        return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();\n    };\n    treemap.paddingTop = function(x) {\n        return arguments.length ? (paddingTop = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingTop;\n    };\n    treemap.paddingRight = function(x) {\n        return arguments.length ? (paddingRight = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingRight;\n    };\n    treemap.paddingBottom = function(x) {\n        return arguments.length ? (paddingBottom = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingBottom;\n    };\n    treemap.paddingLeft = function(x) {\n        return arguments.length ? (paddingLeft = typeof x === \"function\" ? x : (0, _constantJsDefault.default)(+x), treemap) : paddingLeft;\n    };\n    return treemap;\n};\n\n},{\"./round.js\":\"9PNun\",\"./squarify.js\":\"dnoy6\",\"../accessors.js\":\"i242w\",\"../constant.js\":\"i6Ely\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dnoy6\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"phi\", ()=>phi);\nparcelHelpers.export(exports, \"squarifyRatio\", ()=>squarifyRatio);\nvar _diceJs = require(\"./dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nvar _sliceJs = require(\"./slice.js\");\nvar _sliceJsDefault = parcelHelpers.interopDefault(_sliceJs);\nvar phi = (1 + Math.sqrt(5)) / 2;\nfunction squarifyRatio(ratio, parent, x0, y0, x1, y1) {\n    var rows = [], nodes = parent.children, row, nodeValue, i0 = 0, i1 = 0, n = nodes.length, dx, dy, value = parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta;\n    while(i0 < n){\n        dx = x1 - x0, dy = y1 - y0;\n        // Find the next non-empty node.\n        do sumValue = nodes[i1++].value;\n        while (!sumValue && i1 < n);\n        minValue = maxValue = sumValue;\n        alpha = Math.max(dy / dx, dx / dy) / (value * ratio);\n        beta = sumValue * sumValue * alpha;\n        minRatio = Math.max(maxValue / beta, beta / minValue);\n        // Keep adding nodes while the aspect ratio maintains or improves.\n        for(; i1 < n; ++i1){\n            sumValue += nodeValue = nodes[i1].value;\n            if (nodeValue < minValue) minValue = nodeValue;\n            if (nodeValue > maxValue) maxValue = nodeValue;\n            beta = sumValue * sumValue * alpha;\n            newRatio = Math.max(maxValue / beta, beta / minValue);\n            if (newRatio > minRatio) {\n                sumValue -= nodeValue;\n                break;\n            }\n            minRatio = newRatio;\n        }\n        // Position and record the row orientation.\n        rows.push(row = {\n            value: sumValue,\n            dice: dx < dy,\n            children: nodes.slice(i0, i1)\n        });\n        if (row.dice) (0, _diceJsDefault.default)(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);\n        else (0, _sliceJsDefault.default)(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);\n        value -= sumValue, i0 = i1;\n    }\n    return rows;\n}\nexports.default = function custom(ratio) {\n    function squarify(parent, x0, y0, x1, y1) {\n        squarifyRatio(ratio, parent, x0, y0, x1, y1);\n    }\n    squarify.ratio = function(x) {\n        return custom((x = +x) > 1 ? x : 1);\n    };\n    return squarify;\n}(phi);\n\n},{\"./dice.js\":\"c7pGx\",\"./slice.js\":\"c9bya\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"c9bya\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(parent, x0, y0, x1, y1) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (y1 - y0) / parent.value;\n    while(++i < n){\n        node = nodes[i], node.x0 = x0, node.x1 = x1;\n        node.y0 = y0, node.y1 = y0 += node.value * k;\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8vqlk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nexports.default = function(parent, x01, y01, x11, y11) {\n    var nodes = parent.children, i1, n = nodes.length, sum, sums = new Array(n + 1);\n    for(sums[0] = sum = i1 = 0; i1 < n; ++i1)sums[i1 + 1] = sum += nodes[i1].value;\n    partition(0, n, parent.value, x01, y01, x11, y11);\n    function partition(i, j, value, x0, y0, x1, y1) {\n        if (i >= j - 1) {\n            var node = nodes[i];\n            node.x0 = x0, node.y0 = y0;\n            node.x1 = x1, node.y1 = y1;\n            return;\n        }\n        var valueOffset = sums[i], valueTarget = value / 2 + valueOffset, k = i + 1, hi = j - 1;\n        while(k < hi){\n            var mid = k + hi >>> 1;\n            if (sums[mid] < valueTarget) k = mid + 1;\n            else hi = mid;\n        }\n        if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i + 1 < k) --k;\n        var valueLeft = sums[k] - valueOffset, valueRight = value - valueLeft;\n        if (x1 - x0 > y1 - y0) {\n            var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1;\n            partition(i, k, valueLeft, x0, y0, xk, y1);\n            partition(k, j, valueRight, xk, y0, x1, y1);\n        } else {\n            var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1;\n            partition(i, k, valueLeft, x0, y0, x1, yk);\n            partition(k, j, valueRight, x0, yk, x1, y1);\n        }\n    }\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fbNXv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _diceJs = require(\"./dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nvar _sliceJs = require(\"./slice.js\");\nvar _sliceJsDefault = parcelHelpers.interopDefault(_sliceJs);\nexports.default = function(parent, x0, y0, x1, y1) {\n    (parent.depth & 1 ? (0, _sliceJsDefault.default) : (0, _diceJsDefault.default))(parent, x0, y0, x1, y1);\n};\n\n},{\"./dice.js\":\"c7pGx\",\"./slice.js\":\"c9bya\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"12ScZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _diceJs = require(\"./dice.js\");\nvar _diceJsDefault = parcelHelpers.interopDefault(_diceJs);\nvar _sliceJs = require(\"./slice.js\");\nvar _sliceJsDefault = parcelHelpers.interopDefault(_sliceJs);\nvar _squarifyJs = require(\"./squarify.js\");\nexports.default = function custom(ratio) {\n    function resquarify(parent, x0, y0, x1, y1) {\n        if ((rows = parent._squarify) && rows.ratio === ratio) {\n            var rows, row, nodes, i, j = -1, n, m = rows.length, value = parent.value;\n            while(++j < m){\n                row = rows[j], nodes = row.children;\n                for(i = row.value = 0, n = nodes.length; i < n; ++i)row.value += nodes[i].value;\n                if (row.dice) (0, _diceJsDefault.default)(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1);\n                else (0, _sliceJsDefault.default)(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1);\n                value -= row.value;\n            }\n        } else {\n            parent._squarify = rows = (0, _squarifyJs.squarifyRatio)(ratio, parent, x0, y0, x1, y1);\n            rows.ratio = ratio;\n        }\n    }\n    resquarify.ratio = function(x) {\n        return custom((x = +x) > 1 ? x : 1);\n    };\n    return resquarify;\n}((0, _squarifyJs.phi));\n\n},{\"./dice.js\":\"c7pGx\",\"./slice.js\":\"c9bya\",\"./squarify.js\":\"dnoy6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lZyUZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"label\", ()=>Label);\nvar _vegaCanvas = require(\"vega-canvas\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nvar _vegaUtil = require(\"vega-util\");\nconst ALPHA_MASK = 0xff000000; // alpha value equivalent to opacity 0.0625\nconst INSIDE_OPACITY_IN_ALPHA = 0x10000000;\nconst INSIDE_OPACITY = 0.0625;\nfunction baseBitmaps($, data) {\n    const bitmap = $.bitmap(); // when there is no base mark but data points are to be avoided\n    (data || []).forEach((d)=>bitmap.set($(d.boundary[0]), $(d.boundary[3])));\n    return [\n        bitmap,\n        undefined\n    ];\n}\nfunction markBitmaps($, avoidMarks, labelInside, isGroupArea) {\n    // create canvas\n    const width = $.width, height = $.height, border = labelInside || isGroupArea, context = (0, _vegaCanvas.canvas)(width, height).getContext(\"2d\"); // render all marks to be avoided into canvas\n    avoidMarks.forEach((items)=>draw(context, items, border)); // get canvas buffer, create bitmaps\n    const buffer = new Uint32Array(context.getImageData(0, 0, width, height).data.buffer), layer1 = $.bitmap(), layer2 = border && $.bitmap(); // populate bitmap layers\n    let x, y, u, v, alpha;\n    for(y = 0; y < height; ++y)for(x = 0; x < width; ++x){\n        alpha = buffer[y * width + x] & ALPHA_MASK;\n        if (alpha) {\n            u = $(x);\n            v = $(y);\n            if (!isGroupArea) layer1.set(u, v); // update interior bitmap\n            if (border && alpha ^ INSIDE_OPACITY_IN_ALPHA) layer2.set(u, v); // update border bitmap\n        }\n    }\n    return [\n        layer1,\n        layer2\n    ];\n}\nfunction draw(context, items, interior) {\n    if (!items.length) return;\n    const type = items[0].mark.marktype;\n    if (type === \"group\") items.forEach((group)=>{\n        group.items.forEach((mark)=>draw(context, mark.items, interior));\n    });\n    else (0, _vegaScenegraph.Marks)[type].draw(context, {\n        items: interior ? items.map(prepare) : items\n    });\n}\n/**\n * Prepare item before drawing into canvas (setting stroke and opacity)\n * @param {object} source item to be prepared\n * @returns prepared item\n */ function prepare(source) {\n    const item = (0, _vegaDataflow.rederive)(source, {});\n    if (item.stroke) item.strokeOpacity = 1;\n    if (item.fill) {\n        item.fillOpacity = INSIDE_OPACITY;\n        item.stroke = \"#000\";\n        item.strokeOpacity = 1;\n        item.strokeWidth = 2;\n    }\n    return item;\n}\nconst DIV = 5, // bit shift from x, y index to bit vector array index\nMOD = 31, // bit mask for index lookup within a bit vector\nSIZE = 32, // individual bit vector size\nRIGHT0 = new Uint32Array(SIZE + 1), // left-anchored bit vectors, full -> 0\nRIGHT1 = new Uint32Array(SIZE + 1); // right-anchored bit vectors, 0 -> full\nRIGHT1[0] = 0;\nRIGHT0[0] = ~RIGHT1[0];\nfor(let i = 1; i <= SIZE; ++i){\n    RIGHT1[i] = RIGHT1[i - 1] << 1 | 1;\n    RIGHT0[i] = ~RIGHT1[i];\n}\nfunction Bitmap(w, h) {\n    const array = new Uint32Array(~~((w * h + SIZE) / SIZE));\n    function _set(index, mask) {\n        array[index] |= mask;\n    }\n    function _clear(index, mask) {\n        array[index] &= mask;\n    }\n    return {\n        array: array,\n        get: (x, y)=>{\n            const index = y * w + x;\n            return array[index >>> DIV] & 1 << (index & MOD);\n        },\n        set: (x, y)=>{\n            const index = y * w + x;\n            _set(index >>> DIV, 1 << (index & MOD));\n        },\n        clear: (x, y)=>{\n            const index = y * w + x;\n            _clear(index >>> DIV, ~(1 << (index & MOD)));\n        },\n        getRange: (x, y, x2, y2)=>{\n            let r = y2, start, end, indexStart, indexEnd;\n            for(; r >= y; --r){\n                start = r * w + x;\n                end = r * w + x2;\n                indexStart = start >>> DIV;\n                indexEnd = end >>> DIV;\n                if (indexStart === indexEnd) {\n                    if (array[indexStart] & RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]) return true;\n                } else {\n                    if (array[indexStart] & RIGHT0[start & MOD]) return true;\n                    if (array[indexEnd] & RIGHT1[(end & MOD) + 1]) return true;\n                    for(let i1 = indexStart + 1; i1 < indexEnd; ++i1){\n                        if (array[i1]) return true;\n                    }\n                }\n            }\n            return false;\n        },\n        setRange: (x, y, x2, y2)=>{\n            let start, end, indexStart, indexEnd, i2;\n            for(; y <= y2; ++y){\n                start = y * w + x;\n                end = y * w + x2;\n                indexStart = start >>> DIV;\n                indexEnd = end >>> DIV;\n                if (indexStart === indexEnd) _set(indexStart, RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]);\n                else {\n                    _set(indexStart, RIGHT0[start & MOD]);\n                    _set(indexEnd, RIGHT1[(end & MOD) + 1]);\n                    for(i2 = indexStart + 1; i2 < indexEnd; ++i2)_set(i2, 0xffffffff);\n                }\n            }\n        },\n        clearRange: (x, y, x2, y2)=>{\n            let start, end, indexStart, indexEnd, i3;\n            for(; y <= y2; ++y){\n                start = y * w + x;\n                end = y * w + x2;\n                indexStart = start >>> DIV;\n                indexEnd = end >>> DIV;\n                if (indexStart === indexEnd) _clear(indexStart, RIGHT1[start & MOD] | RIGHT0[(end & MOD) + 1]);\n                else {\n                    _clear(indexStart, RIGHT1[start & MOD]);\n                    _clear(indexEnd, RIGHT0[(end & MOD) + 1]);\n                    for(i3 = indexStart + 1; i3 < indexEnd; ++i3)_clear(i3, 0);\n                }\n            }\n        },\n        outOfBounds: (x, y, x2, y2)=>x < 0 || y < 0 || y2 >= h || x2 >= w\n    };\n}\nfunction scaler(width, height, padding) {\n    const ratio = Math.max(1, Math.sqrt(width * height / 1e6)), w = ~~((width + 2 * padding + ratio) / ratio), h = ~~((height + 2 * padding + ratio) / ratio), scale = (_)=>~~((_ + padding) / ratio);\n    scale.invert = (_)=>_ * ratio - padding;\n    scale.bitmap = ()=>Bitmap(w, h);\n    scale.ratio = ratio;\n    scale.padding = padding;\n    scale.width = width;\n    scale.height = height;\n    return scale;\n}\nfunction placeAreaLabelNaive($, bitmaps, avoidBaseMark, markIndex) {\n    const width = $.width, height = $.height; // try to place a label within an input area mark\n    return function(d) {\n        const items = d.datum.datum.items[markIndex].items, // area points\n        n = items.length, // number of points\n        textHeight = d.datum.fontSize, // label width\n        textWidth = (0, _vegaScenegraph.textMetrics).width(d.datum, d.datum.text); // label height\n        let maxAreaWidth = 0, x1, x2, y1, y2, x, y, areaWidth; // for each area sample point\n        for(let i4 = 0; i4 < n; ++i4){\n            x1 = items[i4].x;\n            y1 = items[i4].y;\n            x2 = items[i4].x2 === undefined ? x1 : items[i4].x2;\n            y2 = items[i4].y2 === undefined ? y1 : items[i4].y2;\n            x = (x1 + x2) / 2;\n            y = (y1 + y2) / 2;\n            areaWidth = Math.abs(x2 - x1 + y2 - y1);\n            if (areaWidth >= maxAreaWidth) {\n                maxAreaWidth = areaWidth;\n                d.x = x;\n                d.y = y;\n            }\n        }\n        x = textWidth / 2;\n        y = textHeight / 2;\n        x1 = d.x - x;\n        x2 = d.x + x;\n        y1 = d.y - y;\n        y2 = d.y + y;\n        d.align = \"center\";\n        if (x1 < 0 && x2 <= width) d.align = \"left\";\n        else if (0 <= x1 && width < x2) d.align = \"right\";\n        d.baseline = \"middle\";\n        if (y1 < 0 && y2 <= height) d.baseline = \"top\";\n        else if (0 <= y1 && height < y2) d.baseline = \"bottom\";\n        return true;\n    };\n}\nfunction outOfBounds(x, y, textWidth, textHeight, width, height) {\n    let r = textWidth / 2;\n    return x - r < 0 || x + r > width || y - (r = textHeight / 2) < 0 || y + r > height;\n}\nfunction collision($, x, y, textHeight, textWidth, h, bm0, bm1) {\n    const w = textWidth * h / (textHeight * 2), x1 = $(x - w), x2 = $(x + w), y1 = $(y - (h = h / 2)), y2 = $(y + h);\n    return bm0.outOfBounds(x1, y1, x2, y2) || bm0.getRange(x1, y1, x2, y2) || bm1 && bm1.getRange(x1, y1, x2, y2);\n}\nfunction placeAreaLabelReducedSearch($, bitmaps, avoidBaseMark, markIndex) {\n    const width = $.width, height = $.height, bm0 = bitmaps[0], // where labels have been placed\n    bm1 = bitmaps[1]; // area outlines\n    function tryLabel(_x, _y, maxSize, textWidth, textHeight) {\n        const x = $.invert(_x), y = $.invert(_y);\n        let lo = maxSize, hi = height, mid;\n        if (!outOfBounds(x, y, textWidth, textHeight, width, height) && !collision($, x, y, textHeight, textWidth, lo, bm0, bm1) && !collision($, x, y, textHeight, textWidth, textHeight, bm0, null)) {\n            // if the label fits at the current sample point,\n            // perform binary search to find the largest font size that fits\n            while(hi - lo >= 1){\n                mid = (lo + hi) / 2;\n                if (collision($, x, y, textHeight, textWidth, mid, bm0, bm1)) hi = mid;\n                else lo = mid;\n            } // place label if current lower bound exceeds prior max font size\n            if (lo > maxSize) return [\n                x,\n                y,\n                lo,\n                true\n            ];\n        }\n    } // try to place a label within an input area mark\n    return function(d) {\n        const items = d.datum.datum.items[markIndex].items, // area points\n        n = items.length, // number of points\n        textHeight = d.datum.fontSize, // label width\n        textWidth = (0, _vegaScenegraph.textMetrics).width(d.datum, d.datum.text); // label height\n        let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x1, x2, y1, y2, x, y, _x, _y, _x1, _xMid, _x2, _y1, _yMid, _y2, areaWidth, result, swapTmp; // for each area sample point\n        for(let i5 = 0; i5 < n; ++i5){\n            x1 = items[i5].x;\n            y1 = items[i5].y;\n            x2 = items[i5].x2 === undefined ? x1 : items[i5].x2;\n            y2 = items[i5].y2 === undefined ? y1 : items[i5].y2;\n            if (x1 > x2) {\n                swapTmp = x1;\n                x1 = x2;\n                x2 = swapTmp;\n            }\n            if (y1 > y2) {\n                swapTmp = y1;\n                y1 = y2;\n                y2 = swapTmp;\n            }\n            _x1 = $(x1);\n            _x2 = $(x2);\n            _xMid = ~~((_x1 + _x2) / 2);\n            _y1 = $(y1);\n            _y2 = $(y2);\n            _yMid = ~~((_y1 + _y2) / 2); // search along the line from mid point between the 2 border to lower border\n            for(_x = _xMid; _x >= _x1; --_x)for(_y = _yMid; _y >= _y1; --_y){\n                result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n                if (result) [d.x, d.y, maxSize, labelPlaced] = result;\n            }\n             // search along the line from mid point between the 2 border to upper border\n            for(_x = _xMid; _x <= _x2; ++_x)for(_y = _yMid; _y <= _y2; ++_y){\n                result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n                if (result) [d.x, d.y, maxSize, labelPlaced] = result;\n            }\n             // place label at slice center if not placed through other means\n            // and if we're not avoiding overlap with other areas\n            if (!labelPlaced && !avoidBaseMark) {\n                // one span is zero, hence we can add\n                areaWidth = Math.abs(x2 - x1 + y2 - y1);\n                x = (x1 + x2) / 2;\n                y = (y1 + y2) / 2; // place label if it fits and improves the max area width\n                if (areaWidth >= maxAreaWidth && !outOfBounds(x, y, textWidth, textHeight, width, height) && !collision($, x, y, textHeight, textWidth, textHeight, bm0, null)) {\n                    maxAreaWidth = areaWidth;\n                    d.x = x;\n                    d.y = y;\n                    labelPlaced2 = true;\n                }\n            }\n        } // record current label placement information, update label bitmap\n        if (labelPlaced || labelPlaced2) {\n            x = textWidth / 2;\n            y = textHeight / 2;\n            bm0.setRange($(d.x - x), $(d.y - y), $(d.x + x), $(d.y + y));\n            d.align = \"center\";\n            d.baseline = \"middle\";\n            return true;\n        } else return false;\n    };\n}\nconst X_DIR = [\n    -1,\n    -1,\n    1,\n    1\n];\nconst Y_DIR = [\n    -1,\n    1,\n    -1,\n    1\n];\nfunction placeAreaLabelFloodFill($, bitmaps, avoidBaseMark, markIndex) {\n    const width = $.width, height = $.height, bm0 = bitmaps[0], // where labels have been placed\n    bm1 = bitmaps[1], // area outlines\n    bm2 = $.bitmap(); // flood-fill visitations\n    // try to place a label within an input area mark\n    return function(d) {\n        const items = d.datum.datum.items[markIndex].items, // area points\n        n = items.length, // number of points\n        textHeight = d.datum.fontSize, // label width\n        textWidth = (0, _vegaScenegraph.textMetrics).width(d.datum, d.datum.text), // label height\n        stack = []; // flood fill stack\n        let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x1, x2, y1, y2, x, y, _x, _y, lo, hi, mid, areaWidth; // for each area sample point\n        for(let i6 = 0; i6 < n; ++i6){\n            x1 = items[i6].x;\n            y1 = items[i6].y;\n            x2 = items[i6].x2 === undefined ? x1 : items[i6].x2;\n            y2 = items[i6].y2 === undefined ? y1 : items[i6].y2; // add scaled center point to stack\n            stack.push([\n                $((x1 + x2) / 2),\n                $((y1 + y2) / 2)\n            ]); // perform flood fill, visit points\n            while(stack.length){\n                [_x, _y] = stack.pop(); // exit if point already marked\n                if (bm0.get(_x, _y) || bm1.get(_x, _y) || bm2.get(_x, _y)) continue; // mark point in flood fill bitmap\n                // add search points for all (in bound) directions\n                bm2.set(_x, _y);\n                for(let j = 0; j < 4; ++j){\n                    x = _x + X_DIR[j];\n                    y = _y + Y_DIR[j];\n                    if (!bm2.outOfBounds(x, y, x, y)) stack.push([\n                        x,\n                        y\n                    ]);\n                } // unscale point back to x, y space\n                x = $.invert(_x);\n                y = $.invert(_y);\n                lo = maxSize;\n                hi = height; // TODO: make this bound smaller\n                if (!outOfBounds(x, y, textWidth, textHeight, width, height) && !collision($, x, y, textHeight, textWidth, lo, bm0, bm1) && !collision($, x, y, textHeight, textWidth, textHeight, bm0, null)) {\n                    // if the label fits at the current sample point,\n                    // perform binary search to find the largest font size that fits\n                    while(hi - lo >= 1){\n                        mid = (lo + hi) / 2;\n                        if (collision($, x, y, textHeight, textWidth, mid, bm0, bm1)) hi = mid;\n                        else lo = mid;\n                    } // place label if current lower bound exceeds prior max font size\n                    if (lo > maxSize) {\n                        d.x = x;\n                        d.y = y;\n                        maxSize = lo;\n                        labelPlaced = true;\n                    }\n                }\n            } // place label at slice center if not placed through other means\n            // and if we're not avoiding overlap with other areas\n            if (!labelPlaced && !avoidBaseMark) {\n                // one span is zero, hence we can add\n                areaWidth = Math.abs(x2 - x1 + y2 - y1);\n                x = (x1 + x2) / 2;\n                y = (y1 + y2) / 2; // place label if it fits and improves the max area width\n                if (areaWidth >= maxAreaWidth && !outOfBounds(x, y, textWidth, textHeight, width, height) && !collision($, x, y, textHeight, textWidth, textHeight, bm0, null)) {\n                    maxAreaWidth = areaWidth;\n                    d.x = x;\n                    d.y = y;\n                    labelPlaced2 = true;\n                }\n            }\n        } // record current label placement information, update label bitmap\n        if (labelPlaced || labelPlaced2) {\n            x = textWidth / 2;\n            y = textHeight / 2;\n            bm0.setRange($(d.x - x), $(d.y - y), $(d.x + x), $(d.y + y));\n            d.align = \"center\";\n            d.baseline = \"middle\";\n            return true;\n        } else return false;\n    };\n}\nconst Aligns = [\n    \"right\",\n    \"center\",\n    \"left\"\n], Baselines = [\n    \"bottom\",\n    \"middle\",\n    \"top\"\n];\nfunction placeMarkLabel($, bitmaps, anchors, offsets) {\n    const width = $.width, height = $.height, bm0 = bitmaps[0], bm1 = bitmaps[1], n = offsets.length;\n    return function(d) {\n        const boundary = d.boundary, textHeight = d.datum.fontSize; // can not be placed if the mark is not visible in the graph bound\n        if (boundary[2] < 0 || boundary[5] < 0 || boundary[0] > width || boundary[3] > height) return false;\n        let textWidth = 0, dx, dy, isInside, sizeFactor, insideFactor, x1, x2, y1, y2, xc, yc, _x1, _x2, _y1, _y2; // for each anchor and offset\n        for(let i7 = 0; i7 < n; ++i7){\n            dx = (anchors[i7] & 0x3) - 1;\n            dy = (anchors[i7] >>> 0x2 & 0x3) - 1;\n            isInside = dx === 0 && dy === 0 || offsets[i7] < 0;\n            sizeFactor = dx && dy ? Math.SQRT1_2 : 1;\n            insideFactor = offsets[i7] < 0 ? -1 : 1;\n            x1 = boundary[1 + dx] + offsets[i7] * dx * sizeFactor;\n            yc = boundary[4 + dy] + insideFactor * textHeight * dy / 2 + offsets[i7] * dy * sizeFactor;\n            y1 = yc - textHeight / 2;\n            y2 = yc + textHeight / 2;\n            _x1 = $(x1);\n            _y1 = $(y1);\n            _y2 = $(y2);\n            if (!textWidth) {\n                // to avoid finding width of text label,\n                if (!test(_x1, _x1, _y1, _y2, bm0, bm1, x1, x1, y1, y2, boundary, isInside)) continue;\n                else // Otherwise, find the label width\n                textWidth = (0, _vegaScenegraph.textMetrics).width(d.datum, d.datum.text);\n            }\n            xc = x1 + insideFactor * textWidth * dx / 2;\n            x1 = xc - textWidth / 2;\n            x2 = xc + textWidth / 2;\n            _x1 = $(x1);\n            _x2 = $(x2);\n            if (test(_x1, _x2, _y1, _y2, bm0, bm1, x1, x2, y1, y2, boundary, isInside)) {\n                // place label if the position is placeable\n                d.x = !dx ? xc : dx * insideFactor < 0 ? x2 : x1;\n                d.y = !dy ? yc : dy * insideFactor < 0 ? y2 : y1;\n                d.align = Aligns[dx * insideFactor + 1];\n                d.baseline = Baselines[dy * insideFactor + 1];\n                bm0.setRange(_x1, _y1, _x2, _y2);\n                return true;\n            }\n        }\n        return false;\n    };\n} // Test if a label with the given dimensions can be added without overlap\nfunction test(_x1, _x2, _y1, _y2, bm0, bm1, x1, x2, y1, y2, boundary, isInside) {\n    return !(bm0.outOfBounds(_x1, _y1, _x2, _y2) || (isInside && bm1 ? bm1.getRange(_x1, _y1, _x2, _y2) || !isInMarkBound(x1, y1, x2, y2, boundary) : bm0.getRange(_x1, _y1, _x2, _y2)));\n}\nfunction isInMarkBound(x1, y1, x2, y2, boundary) {\n    return boundary[0] <= x1 && x2 <= boundary[2] && boundary[3] <= y1 && y2 <= boundary[5];\n}\nconst TOP = 0x0, MIDDLE = 0x4, BOTTOM = 0x8, LEFT = 0x0, CENTER = 0x1, RIGHT = 0x2; // Mapping from text anchor to number representation\nconst anchorCode = {\n    \"top-left\": TOP + LEFT,\n    \"top\": TOP + CENTER,\n    \"top-right\": TOP + RIGHT,\n    \"left\": MIDDLE + LEFT,\n    \"middle\": MIDDLE + CENTER,\n    \"right\": MIDDLE + RIGHT,\n    \"bottom-left\": BOTTOM + LEFT,\n    \"bottom\": BOTTOM + CENTER,\n    \"bottom-right\": BOTTOM + RIGHT\n};\nconst placeAreaLabel = {\n    \"naive\": placeAreaLabelNaive,\n    \"reduced-search\": placeAreaLabelReducedSearch,\n    \"floodfill\": placeAreaLabelFloodFill\n};\nfunction labelLayout(texts, size, compare, offset, anchor, avoidMarks, avoidBaseMark, lineAnchor, markIndex, padding, method) {\n    // early exit for empty data\n    if (!texts.length) return texts;\n    const positions = Math.max(offset.length, anchor.length), offsets = getOffsets(offset, positions), anchors = getAnchors(anchor, positions), marktype = markType(texts[0].datum), grouptype = marktype === \"group\" && texts[0].datum.items[markIndex].marktype, isGroupArea = grouptype === \"area\", boundary = markBoundary(marktype, grouptype, lineAnchor, markIndex), $ = scaler(size[0], size[1], padding), isNaiveGroupArea = isGroupArea && method === \"naive\"; // prepare text mark data for placing\n    const data = texts.map((d)=>({\n            datum: d,\n            opacity: 0,\n            x: undefined,\n            y: undefined,\n            align: undefined,\n            baseline: undefined,\n            boundary: boundary(d)\n        }));\n    let bitmaps;\n    if (!isNaiveGroupArea) {\n        // sort labels in priority order, if comparator is provided\n        if (compare) data.sort((a, b)=>compare(a.datum, b.datum));\n         // flag indicating if label can be placed inside its base mark\n        let labelInside = false;\n        for(let i8 = 0; i8 < anchors.length && !labelInside; ++i8)// label inside if anchor is at center\n        // label inside if offset to be inside the mark bound\n        labelInside = anchors[i8] === 0x5 || offsets[i8] < 0;\n         // extract data information from base mark when base mark is to be avoided\n        // base mark is implicitly avoided if it is a group area\n        if (marktype && (avoidBaseMark || isGroupArea)) avoidMarks = [\n            texts.map((d)=>d.datum)\n        ].concat(avoidMarks);\n         // generate bitmaps for layout calculation\n        bitmaps = avoidMarks.length ? markBitmaps($, avoidMarks, labelInside, isGroupArea) : baseBitmaps($, avoidBaseMark && data);\n    } // generate label placement function\n    const place = isGroupArea ? placeAreaLabel[method]($, bitmaps, avoidBaseMark, markIndex) : placeMarkLabel($, bitmaps, anchors, offsets); // place all labels\n    data.forEach((d)=>d.opacity = +place(d));\n    return data;\n}\nfunction getOffsets(_, count) {\n    const offsets = new Float64Array(count), n = _.length;\n    for(let i10 = 0; i10 < n; ++i10)offsets[i10] = _[i10] || 0;\n    for(let i9 = n; i9 < count; ++i9)offsets[i9] = offsets[n - 1];\n    return offsets;\n}\nfunction getAnchors(_, count) {\n    const anchors = new Int8Array(count), n = _.length;\n    for(let i12 = 0; i12 < n; ++i12)anchors[i12] |= anchorCode[_[i12]];\n    for(let i11 = n; i11 < count; ++i11)anchors[i11] = anchors[n - 1];\n    return anchors;\n}\nfunction markType(item) {\n    return item && item.mark && item.mark.marktype;\n}\n/**\n * Factory function for function for getting base mark boundary, depending\n * on mark and group type. When mark type is undefined, line or area: boundary\n * is the coordinate of each data point. When base mark is grouped line,\n * boundary is either at the beginning or end of the line depending on the\n * value of lineAnchor. Otherwise, use bounds of base mark.\n */ function markBoundary(marktype, grouptype, lineAnchor, markIndex) {\n    const xy = (d)=>[\n            d.x,\n            d.x,\n            d.x,\n            d.y,\n            d.y,\n            d.y\n        ];\n    if (!marktype) return xy; // no reactive geometry\n    else if (marktype === \"line\" || marktype === \"area\") return (d)=>xy(d.datum);\n    else if (grouptype === \"line\") return (d)=>{\n        const items = d.datum.items[markIndex].items;\n        return xy(items.length ? items[lineAnchor === \"start\" ? 0 : items.length - 1] : {\n            x: NaN,\n            y: NaN\n        });\n    };\n    else return (d)=>{\n        const b = d.datum.bounds;\n        return [\n            b.x1,\n            (b.x1 + b.x2) / 2,\n            b.x2,\n            b.y1,\n            (b.y1 + b.y2) / 2,\n            b.y2\n        ];\n    };\n}\nconst Output = [\n    \"x\",\n    \"y\",\n    \"opacity\",\n    \"align\",\n    \"baseline\"\n];\nconst Anchors = [\n    \"top-left\",\n    \"left\",\n    \"bottom-left\",\n    \"top\",\n    \"bottom\",\n    \"top-right\",\n    \"right\",\n    \"bottom-right\"\n];\n/**\n * Compute text label layout to annotate marks.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<number>} params.size - The size of the layout, provided as a [width, height] array.\n * @param {function(*,*): number} [params.sort] - An optional\n *   comparator function for sorting label data in priority order.\n * @param {Array<string>} [params.anchor] - Label anchor points relative to the base mark bounding box.\n *   The available options are 'top-left', 'left', 'bottom-left', 'top',\n *   'bottom', 'top-right', 'right', 'bottom-right', 'middle'.\n * @param {Array<number>} [params.offset] - Label offsets (in pixels) from the base mark bounding box.\n *   This parameter  is parallel to the list of anchor points.\n * @param {number} [params.padding=0] - The amount (in pixels) that a label may exceed the layout size.\n * @param {string} [params.lineAnchor='end'] - For group line mark labels only, indicates the anchor\n *   position for labels. One of 'start' or 'end'.\n * @param {string} [params.markIndex=0] - For group mark labels only, an index indicating\n *   which mark within the group should be labeled.\n * @param {Array<number>} [params.avoidMarks] - A list of additional mark names for which the label\n *   layout should avoid overlap.\n * @param {boolean} [params.avoidBaseMark=true] - Boolean flag indicating if labels should avoid\n *   overlap with the underlying base mark being labeled.\n * @param {string} [params.method='naive'] - For area make labels only, a method for\n *   place labels. One of 'naive', 'reduced-search', or 'floodfill'.\n * @param {Array<string>} [params.as] - The output fields written by the transform.\n *   The default is ['x', 'y', 'opacity', 'align', 'baseline'].\n */ function Label(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nLabel.Definition = {\n    type: \"Label\",\n    metadata: {\n        modifies: true\n    },\n    params: [\n        {\n            name: \"size\",\n            type: \"number\",\n            array: true,\n            length: 2,\n            required: true\n        },\n        {\n            name: \"sort\",\n            type: \"compare\"\n        },\n        {\n            name: \"anchor\",\n            type: \"string\",\n            array: true,\n            default: Anchors\n        },\n        {\n            name: \"offset\",\n            type: \"number\",\n            array: true,\n            default: [\n                1\n            ]\n        },\n        {\n            name: \"padding\",\n            type: \"number\",\n            default: 0\n        },\n        {\n            name: \"lineAnchor\",\n            type: \"string\",\n            values: [\n                \"start\",\n                \"end\"\n            ],\n            default: \"end\"\n        },\n        {\n            name: \"markIndex\",\n            type: \"number\",\n            default: 0\n        },\n        {\n            name: \"avoidBaseMark\",\n            type: \"boolean\",\n            default: true\n        },\n        {\n            name: \"avoidMarks\",\n            type: \"data\",\n            array: true\n        },\n        {\n            name: \"method\",\n            type: \"string\",\n            default: \"naive\"\n        },\n        {\n            name: \"as\",\n            type: \"string\",\n            array: true,\n            length: Output.length,\n            default: Output\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Label, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        function modp(param) {\n            const p = _[param];\n            return (0, _vegaUtil.isFunction)(p) && pulse.modified(p.fields);\n        }\n        const mod = _.modified();\n        if (!(mod || pulse.changed(pulse.ADD_REM) || modp(\"sort\"))) return;\n        if (!_.size || _.size.length !== 2) (0, _vegaUtil.error)(\"Size parameter should be specified as a [width, height] array.\");\n        const as = _.as || Output; // run label layout\n        labelLayout(pulse.materialize(pulse.SOURCE).source, _.size, _.sort, (0, _vegaUtil.array)(_.offset || 1), (0, _vegaUtil.array)(_.anchor || Anchors), _.avoidMarks || [], _.avoidBaseMark === false ? false : true, _.lineAnchor || \"end\", _.markIndex || 0, _.padding || 0, _.method || \"naive\").forEach((l)=>{\n            // write layout results to data stream\n            const t = l.datum;\n            t[as[0]] = l.x;\n            t[as[1]] = l.y;\n            t[as[2]] = l.opacity;\n            t[as[3]] = l.align;\n            t[as[4]] = l.baseline;\n        });\n        return pulse.reflow(mod).modifies(as);\n    }\n});\n\n},{\"vega-canvas\":\"f0yaA\",\"vega-dataflow\":\"3NitK\",\"vega-scenegraph\":\"jattk\",\"vega-util\":\"bApja\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"elv3U\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"loess\", ()=>Loess);\nparcelHelpers.export(exports, \"regression\", ()=>Regression);\nvar _vegaStatistics = require(\"vega-statistics\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nfunction partition(data, groupby) {\n    var groups = [], get = function(f) {\n        return f(t);\n    }, map, i, n, t, k, g; // partition data points into stack groups\n    if (groupby == null) groups.push(data);\n    else for(map = {}, i = 0, n = data.length; i < n; ++i){\n        t = data[i];\n        k = groupby.map(get);\n        g = map[k];\n        if (!g) {\n            map[k] = g = [];\n            g.dims = k;\n            groups.push(g);\n        }\n        g.push(t);\n    }\n    return groups;\n}\n/**\n * Compute locally-weighted regression fits for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.x - An accessor for the predictor data field.\n * @param {function(object): *} params.y - An accessor for the predicted data field.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {number} [params.bandwidth=0.3] - The loess bandwidth.\n */ function Loess(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nLoess.Definition = {\n    \"type\": \"Loess\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"bandwidth\",\n            \"type\": \"number\",\n            \"default\": 0.3\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Loess, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        if (!this.value || pulse.changed() || _.modified()) {\n            const source = pulse.materialize(pulse.SOURCE).source, groups = partition(source, _.groupby), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), m = names.length, as = _.as || [\n                (0, _vegaUtil.accessorName)(_.x),\n                (0, _vegaUtil.accessorName)(_.y)\n            ], values = [];\n            groups.forEach((g)=>{\n                (0, _vegaStatistics.regressionLoess)(g, _.x, _.y, _.bandwidth || 0.3).forEach((p)=>{\n                    const t = {};\n                    for(let i = 0; i < m; ++i)t[names[i]] = g.dims[i];\n                    t[as[0]] = p[0];\n                    t[as[1]] = p[1];\n                    values.push((0, _vegaDataflow.ingest)(t));\n                });\n            });\n            if (this.value) out.rem = this.value;\n            this.value = out.add = out.source = values;\n        }\n        return out;\n    }\n});\nconst Methods = {\n    linear: (0, _vegaStatistics.regressionLinear),\n    log: (0, _vegaStatistics.regressionLog),\n    exp: (0, _vegaStatistics.regressionExp),\n    pow: (0, _vegaStatistics.regressionPow),\n    quad: (0, _vegaStatistics.regressionQuad),\n    poly: (0, _vegaStatistics.regressionPoly)\n};\nconst degreesOfFreedom = (method, order)=>method === \"poly\" ? order : method === \"quad\" ? 2 : 1;\n/**\n * Compute regression fits for one or more data groups.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {function(object): *} params.x - An accessor for the predictor data field.\n * @param {function(object): *} params.y - An accessor for the predicted data field.\n * @param {string} [params.method='linear'] - The regression method to apply.\n * @param {Array<function(object): *>} [params.groupby] - An array of accessors to groupby.\n * @param {Array<number>} [params.extent] - The domain extent over which to plot the regression line.\n * @param {number} [params.order=3] - The polynomial order. Only applies to the 'poly' method.\n */ function Regression(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nRegression.Definition = {\n    \"type\": \"Regression\",\n    \"metadata\": {\n        \"generates\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"groupby\",\n            \"type\": \"field\",\n            \"array\": true\n        },\n        {\n            \"name\": \"method\",\n            \"type\": \"string\",\n            \"default\": \"linear\",\n            \"values\": Object.keys(Methods)\n        },\n        {\n            \"name\": \"order\",\n            \"type\": \"number\",\n            \"default\": 3\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"params\",\n            \"type\": \"boolean\",\n            \"default\": false\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Regression, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const out = pulse.fork(pulse.NO_SOURCE | pulse.NO_FIELDS);\n        if (!this.value || pulse.changed() || _.modified()) {\n            const source = pulse.materialize(pulse.SOURCE).source, groups = partition(source, _.groupby), names = (_.groupby || []).map((0, _vegaUtil.accessorName)), method = _.method || \"linear\", order = _.order || 3, dof = degreesOfFreedom(method, order), as = _.as || [\n                (0, _vegaUtil.accessorName)(_.x),\n                (0, _vegaUtil.accessorName)(_.y)\n            ], fit = Methods[method], values = [];\n            let domain = _.extent;\n            if (!(0, _vegaUtil.hasOwnProperty)(Methods, method)) (0, _vegaUtil.error)(\"Invalid regression method: \" + method);\n            if (domain != null) {\n                if (method === \"log\" && domain[0] <= 0) {\n                    pulse.dataflow.warn(\"Ignoring extent with values <= 0 for log regression.\");\n                    domain = null;\n                }\n            }\n            groups.forEach((g)=>{\n                const n = g.length;\n                if (n <= dof) {\n                    pulse.dataflow.warn(\"Skipping regression with more parameters than data points.\");\n                    return;\n                }\n                const model = fit(g, _.x, _.y, order);\n                if (_.params) {\n                    // if parameter vectors requested return those\n                    values.push((0, _vegaDataflow.ingest)({\n                        keys: g.dims,\n                        coef: model.coef,\n                        rSquared: model.rSquared\n                    }));\n                    return;\n                }\n                const dom = domain || (0, _vegaUtil.extent)(g, _.x), add = (p)=>{\n                    const t = {};\n                    for(let i = 0; i < names.length; ++i)t[names[i]] = g.dims[i];\n                    t[as[0]] = p[0];\n                    t[as[1]] = p[1];\n                    values.push((0, _vegaDataflow.ingest)(t));\n                };\n                if (method === \"linear\") // for linear regression we only need the end points\n                dom.forEach((x)=>add([\n                        x,\n                        model.predict(x)\n                    ]));\n                else // otherwise return trend line sample points\n                (0, _vegaStatistics.sampleCurve)(model.predict, dom, 25, 200).forEach(add);\n            });\n            if (this.value) out.rem = this.value;\n            this.value = out.add = out.source = values;\n        }\n        return out;\n    }\n});\n\n},{\"vega-statistics\":\"5ncfv\",\"vega-dataflow\":\"3NitK\",\"vega-util\":\"bApja\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"96rkJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"voronoi\", ()=>Voronoi);\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _d3Delaunay = require(\"d3-delaunay\");\nfunction Voronoi(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nVoronoi.Definition = {\n    \"type\": \"Voronoi\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"field\",\n            \"required\": true\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"extent\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"length\": 2,\n            \"default\": [\n                [\n                    -100000,\n                    -100000\n                ],\n                [\n                    1e5,\n                    1e5\n                ]\n            ],\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"default\": \"path\"\n        }\n    ]\n};\nconst defaultExtent = [\n    -100000,\n    -100000,\n    1e5,\n    1e5\n];\n(0, _vegaUtil.inherits)(Voronoi, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const as = _.as || \"path\", data = pulse.source; // nothing to do if no data\n        if (!data || !data.length) return pulse; // configure and construct voronoi diagram\n        let s = _.size;\n        s = s ? [\n            0,\n            0,\n            s[0],\n            s[1]\n        ] : (s = _.extent) ? [\n            s[0][0],\n            s[0][1],\n            s[1][0],\n            s[1][1]\n        ] : defaultExtent;\n        const voronoi = this.value = (0, _d3Delaunay.Delaunay).from(data, _.x, _.y).voronoi(s); // map polygons to paths\n        for(let i = 0, n = data.length; i < n; ++i){\n            const polygon = voronoi.cellPolygon(i);\n            data[i][as] = polygon ? toPathString(polygon) : null;\n        }\n        return pulse.reflow(_.modified()).modifies(as);\n    }\n}); // suppress duplicated end point vertices\nfunction toPathString(p) {\n    const x = p[0][0], y = p[0][1];\n    let n = p.length - 1;\n    for(; p[n][0] === x && p[n][1] === y; --n);\n    return \"M\" + p.slice(0, n + 1).join(\"L\") + \"Z\";\n}\n\n},{\"vega-dataflow\":\"3NitK\",\"vega-util\":\"bApja\",\"d3-delaunay\":\"9qKHu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9qKHu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Delaunay\", ()=>(0, _delaunayJsDefault.default));\nparcelHelpers.export(exports, \"Voronoi\", ()=>(0, _voronoiJsDefault.default));\nvar _delaunayJs = require(\"./delaunay.js\");\nvar _delaunayJsDefault = parcelHelpers.interopDefault(_delaunayJs);\nvar _voronoiJs = require(\"./voronoi.js\");\nvar _voronoiJsDefault = parcelHelpers.interopDefault(_voronoiJs);\n\n},{\"./delaunay.js\":\"1eiyj\",\"./voronoi.js\":\"a33Bo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1eiyj\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _delaunator = require(\"delaunator\");\nvar _delaunatorDefault = parcelHelpers.interopDefault(_delaunator);\nvar _pathJs = require(\"./path.js\");\nvar _pathJsDefault = parcelHelpers.interopDefault(_pathJs);\nvar _polygonJs = require(\"./polygon.js\");\nvar _polygonJsDefault = parcelHelpers.interopDefault(_polygonJs);\nvar _voronoiJs = require(\"./voronoi.js\");\nvar _voronoiJsDefault = parcelHelpers.interopDefault(_voronoiJs);\nconst tau = 2 * Math.PI, pow = Math.pow;\nfunction pointX(p) {\n    return p[0];\n}\nfunction pointY(p) {\n    return p[1];\n}\n// A triangulation is collinear if all its triangles have a non-null area\nfunction collinear(d) {\n    const { triangles , coords  } = d;\n    for(let i = 0; i < triangles.length; i += 3){\n        const a = 2 * triangles[i], b = 2 * triangles[i + 1], c = 2 * triangles[i + 2], cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]);\n        if (cross > 1e-10) return false;\n    }\n    return true;\n}\nfunction jitter(x, y, r) {\n    return [\n        x + Math.sin(x + y) * r,\n        y + Math.cos(x - y) * r\n    ];\n}\nclass Delaunay {\n    static from(points, fx = pointX, fy = pointY, that) {\n        return new Delaunay(\"length\" in points ? flatArray(points, fx, fy, that) : Float64Array.from(flatIterable(points, fx, fy, that)));\n    }\n    constructor(points){\n        this._delaunator = new (0, _delaunatorDefault.default)(points);\n        this.inedges = new Int32Array(points.length / 2);\n        this._hullIndex = new Int32Array(points.length / 2);\n        this.points = this._delaunator.coords;\n        this._init();\n    }\n    update() {\n        this._delaunator.update();\n        this._init();\n        return this;\n    }\n    _init() {\n        const d = this._delaunator, points = this.points;\n        // check for collinear\n        if (d.hull && d.hull.length > 2 && collinear(d)) {\n            this.collinear = Int32Array.from({\n                length: points.length / 2\n            }, (_, i)=>i).sort((i, j)=>points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors\n            const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds = [\n                points[2 * e],\n                points[2 * e + 1],\n                points[2 * f],\n                points[2 * f + 1]\n            ], r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]);\n            for(let i1 = 0, n = points.length / 2; i1 < n; ++i1){\n                const p = jitter(points[2 * i1], points[2 * i1 + 1], r);\n                points[2 * i1] = p[0];\n                points[2 * i1 + 1] = p[1];\n            }\n            this._delaunator = new (0, _delaunatorDefault.default)(points);\n        } else delete this.collinear;\n        const halfedges = this.halfedges = this._delaunator.halfedges;\n        const hull = this.hull = this._delaunator.hull;\n        const triangles = this.triangles = this._delaunator.triangles;\n        const inedges = this.inedges.fill(-1);\n        const hullIndex = this._hullIndex.fill(-1);\n        // Compute an index from each point to an (arbitrary) incoming halfedge\n        // Used to give the first neighbor of each point; for this reason,\n        // on the hull we give priority to exterior halfedges\n        for(let e = 0, n = halfedges.length; e < n; ++e){\n            const p = triangles[e % 3 === 2 ? e - 2 : e + 1];\n            if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e;\n        }\n        for(let i2 = 0, n1 = hull.length; i2 < n1; ++i2)hullIndex[hull[i2]] = i2;\n        // degenerate case: 1 or 2 (distinct) points\n        if (hull.length <= 2 && hull.length > 0) {\n            this.triangles = new Int32Array(3).fill(-1);\n            this.halfedges = new Int32Array(3).fill(-1);\n            this.triangles[0] = hull[0];\n            this.triangles[1] = hull[1];\n            this.triangles[2] = hull[1];\n            inedges[hull[0]] = 1;\n            if (hull.length === 2) inedges[hull[1]] = 0;\n        }\n    }\n    voronoi(bounds) {\n        return new (0, _voronoiJsDefault.default)(this, bounds);\n    }\n    *neighbors(i) {\n        const { inedges , hull , _hullIndex , halfedges , triangles , collinear: collinear1  } = this;\n        // degenerate case with several collinear points\n        if (collinear1) {\n            const l = collinear1.indexOf(i);\n            if (l > 0) yield collinear1[l - 1];\n            if (l < collinear1.length - 1) yield collinear1[l + 1];\n            return;\n        }\n        const e0 = inedges[i];\n        if (e0 === -1) return; // coincident point\n        let e = e0, p0 = -1;\n        do {\n            yield p0 = triangles[e];\n            e = e % 3 === 2 ? e - 2 : e + 1;\n            if (triangles[e] !== i) return; // bad triangulation\n            e = halfedges[e];\n            if (e === -1) {\n                const p = hull[(_hullIndex[i] + 1) % hull.length];\n                if (p !== p0) yield p;\n                return;\n            }\n        }while (e !== e0);\n    }\n    find(x, y, i = 0) {\n        if ((x = +x, x !== x) || (y = +y, y !== y)) return -1;\n        const i0 = i;\n        let c;\n        while((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0)i = c;\n        return c;\n    }\n    _step(i, x, y) {\n        const { inedges , hull , _hullIndex , halfedges , triangles , points  } = this;\n        if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1);\n        let c = i;\n        let dc = pow(x - points[i * 2], 2) + pow(y - points[i * 2 + 1], 2);\n        const e0 = inedges[i];\n        let e = e0;\n        do {\n            let t = triangles[e];\n            const dt = pow(x - points[t * 2], 2) + pow(y - points[t * 2 + 1], 2);\n            if (dt < dc) dc = dt, c = t;\n            e = e % 3 === 2 ? e - 2 : e + 1;\n            if (triangles[e] !== i) break; // bad triangulation\n            e = halfedges[e];\n            if (e === -1) {\n                e = hull[(_hullIndex[i] + 1) % hull.length];\n                if (e !== t) {\n                    if (pow(x - points[e * 2], 2) + pow(y - points[e * 2 + 1], 2) < dc) return e;\n                }\n                break;\n            }\n        }while (e !== e0);\n        return c;\n    }\n    render(context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { points , halfedges , triangles  } = this;\n        for(let i = 0, n = halfedges.length; i < n; ++i){\n            const j = halfedges[i];\n            if (j < i) continue;\n            const ti = triangles[i] * 2;\n            const tj = triangles[j] * 2;\n            context.moveTo(points[ti], points[ti + 1]);\n            context.lineTo(points[tj], points[tj + 1]);\n        }\n        this.renderHull(context);\n        return buffer && buffer.value();\n    }\n    renderPoints(context, r = 2) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { points  } = this;\n        for(let i = 0, n = points.length; i < n; i += 2){\n            const x = points[i], y = points[i + 1];\n            context.moveTo(x + r, y);\n            context.arc(x, y, r, 0, tau);\n        }\n        return buffer && buffer.value();\n    }\n    renderHull(context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { hull , points  } = this;\n        const h = hull[0] * 2, n = hull.length;\n        context.moveTo(points[h], points[h + 1]);\n        for(let i = 1; i < n; ++i){\n            const h = 2 * hull[i];\n            context.lineTo(points[h], points[h + 1]);\n        }\n        context.closePath();\n        return buffer && buffer.value();\n    }\n    hullPolygon() {\n        const polygon = new (0, _polygonJsDefault.default);\n        this.renderHull(polygon);\n        return polygon.value();\n    }\n    renderTriangle(i, context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { points , triangles  } = this;\n        const t0 = triangles[i *= 3] * 2;\n        const t1 = triangles[i + 1] * 2;\n        const t2 = triangles[i + 2] * 2;\n        context.moveTo(points[t0], points[t0 + 1]);\n        context.lineTo(points[t1], points[t1 + 1]);\n        context.lineTo(points[t2], points[t2 + 1]);\n        context.closePath();\n        return buffer && buffer.value();\n    }\n    *trianglePolygons() {\n        const { triangles  } = this;\n        for(let i = 0, n = triangles.length / 3; i < n; ++i)yield this.trianglePolygon(i);\n    }\n    trianglePolygon(i) {\n        const polygon = new (0, _polygonJsDefault.default);\n        this.renderTriangle(i, polygon);\n        return polygon.value();\n    }\n}\nexports.default = Delaunay;\nfunction flatArray(points, fx, fy, that) {\n    const n = points.length;\n    const array = new Float64Array(n * 2);\n    for(let i = 0; i < n; ++i){\n        const p = points[i];\n        array[i * 2] = fx.call(that, p, i, points);\n        array[i * 2 + 1] = fy.call(that, p, i, points);\n    }\n    return array;\n}\nfunction* flatIterable(points, fx, fy, that) {\n    let i = 0;\n    for (const p of points){\n        yield fx.call(that, p, i, points);\n        yield fy.call(that, p, i, points);\n        ++i;\n    }\n}\n\n},{\"delaunator\":\"auyGo\",\"./path.js\":\"60Yfe\",\"./polygon.js\":\"5nsXD\",\"./voronoi.js\":\"a33Bo\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"auyGo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nconst EPSILON = Math.pow(2, -52);\nconst EDGE_STACK = new Uint32Array(512);\nclass Delaunator {\n    static from(points, getX = defaultGetX, getY = defaultGetY) {\n        const n = points.length;\n        const coords = new Float64Array(n * 2);\n        for(let i = 0; i < n; i++){\n            const p = points[i];\n            coords[2 * i] = getX(p);\n            coords[2 * i + 1] = getY(p);\n        }\n        return new Delaunator(coords);\n    }\n    constructor(coords){\n        const n = coords.length >> 1;\n        if (n > 0 && typeof coords[0] !== \"number\") throw new Error(\"Expected coords to contain numbers.\");\n        this.coords = coords;\n        // arrays that will store the triangulation graph\n        const maxTriangles = Math.max(2 * n - 5, 0);\n        this._triangles = new Uint32Array(maxTriangles * 3);\n        this._halfedges = new Int32Array(maxTriangles * 3);\n        // temporary arrays for tracking the edges of the advancing convex hull\n        this._hashSize = Math.ceil(Math.sqrt(n));\n        this._hullPrev = new Uint32Array(n); // edge to prev edge\n        this._hullNext = new Uint32Array(n); // edge to next edge\n        this._hullTri = new Uint32Array(n); // edge to adjacent triangle\n        this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash\n        // temporary arrays for sorting points\n        this._ids = new Uint32Array(n);\n        this._dists = new Float64Array(n);\n        this.update();\n    }\n    update() {\n        const { coords , _hullPrev: hullPrev , _hullNext: hullNext , _hullTri: hullTri , _hullHash: hullHash  } = this;\n        const n = coords.length >> 1;\n        // populate an array of point indices; calculate input data bbox\n        let minX = Infinity;\n        let minY = Infinity;\n        let maxX = -Infinity;\n        let maxY = -Infinity;\n        for(let i = 0; i < n; i++){\n            const x = coords[2 * i];\n            const y = coords[2 * i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n            this._ids[i] = i;\n        }\n        const cx = (minX + maxX) / 2;\n        const cy = (minY + maxY) / 2;\n        let minDist = Infinity;\n        let i0, i1, i2;\n        // pick a seed point close to the center\n        for(let i3 = 0; i3 < n; i3++){\n            const d = dist(cx, cy, coords[2 * i3], coords[2 * i3 + 1]);\n            if (d < minDist) {\n                i0 = i3;\n                minDist = d;\n            }\n        }\n        const i0x = coords[2 * i0];\n        const i0y = coords[2 * i0 + 1];\n        minDist = Infinity;\n        // find the point closest to the seed\n        for(let i4 = 0; i4 < n; i4++){\n            if (i4 === i0) continue;\n            const d = dist(i0x, i0y, coords[2 * i4], coords[2 * i4 + 1]);\n            if (d < minDist && d > 0) {\n                i1 = i4;\n                minDist = d;\n            }\n        }\n        let i1x = coords[2 * i1];\n        let i1y = coords[2 * i1 + 1];\n        let minRadius = Infinity;\n        // find the third point which forms the smallest circumcircle with the first two\n        for(let i5 = 0; i5 < n; i5++){\n            if (i5 === i0 || i5 === i1) continue;\n            const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i5], coords[2 * i5 + 1]);\n            if (r < minRadius) {\n                i2 = i5;\n                minRadius = r;\n            }\n        }\n        let i2x = coords[2 * i2];\n        let i2y = coords[2 * i2 + 1];\n        if (minRadius === Infinity) {\n            // order collinear points by dx (or dy if all x are identical)\n            // and return the list as a hull\n            for(let i = 0; i < n; i++)this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];\n            quicksort(this._ids, this._dists, 0, n - 1);\n            const hull = new Uint32Array(n);\n            let j = 0;\n            for(let i8 = 0, d0 = -Infinity; i8 < n; i8++){\n                const id = this._ids[i8];\n                if (this._dists[id] > d0) {\n                    hull[j++] = id;\n                    d0 = this._dists[id];\n                }\n            }\n            this.hull = hull.subarray(0, j);\n            this.triangles = new Uint32Array(0);\n            this.halfedges = new Uint32Array(0);\n            return;\n        }\n        // swap the order of the seed points for counter-clockwise orientation\n        if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) {\n            const i = i1;\n            const x = i1x;\n            const y = i1y;\n            i1 = i2;\n            i1x = i2x;\n            i1y = i2y;\n            i2 = i;\n            i2x = x;\n            i2y = y;\n        }\n        const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n        this._cx = center.x;\n        this._cy = center.y;\n        for(let i6 = 0; i6 < n; i6++)this._dists[i6] = dist(coords[2 * i6], coords[2 * i6 + 1], center.x, center.y);\n        // sort the points by distance from the seed triangle circumcenter\n        quicksort(this._ids, this._dists, 0, n - 1);\n        // set up the seed triangle as the starting hull\n        this._hullStart = i0;\n        let hullSize = 3;\n        hullNext[i0] = hullPrev[i2] = i1;\n        hullNext[i1] = hullPrev[i0] = i2;\n        hullNext[i2] = hullPrev[i1] = i0;\n        hullTri[i0] = 0;\n        hullTri[i1] = 1;\n        hullTri[i2] = 2;\n        hullHash.fill(-1);\n        hullHash[this._hashKey(i0x, i0y)] = i0;\n        hullHash[this._hashKey(i1x, i1y)] = i1;\n        hullHash[this._hashKey(i2x, i2y)] = i2;\n        this.trianglesLen = 0;\n        this._addTriangle(i0, i1, i2, -1, -1, -1);\n        for(let k = 0, xp, yp; k < this._ids.length; k++){\n            const i = this._ids[k];\n            const x = coords[2 * i];\n            const y = coords[2 * i + 1];\n            // skip near-duplicate points\n            if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue;\n            xp = x;\n            yp = y;\n            // skip seed triangle points\n            if (i === i0 || i === i1 || i === i2) continue;\n            // find a visible edge on the convex hull using edge hash\n            let start = 0;\n            for(let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++){\n                start = hullHash[(key + j) % this._hashSize];\n                if (start !== -1 && start !== hullNext[start]) break;\n            }\n            start = hullPrev[start];\n            let e = start, q;\n            while(q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])){\n                e = q;\n                if (e === start) {\n                    e = -1;\n                    break;\n                }\n            }\n            if (e === -1) continue; // likely a near-duplicate point; skip it\n            // add the first triangle from the point\n            let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n            // recursively flip triangles from the point until they satisfy the Delaunay condition\n            hullTri[i] = this._legalize(t + 2);\n            hullTri[e] = t; // keep track of boundary triangles on the hull\n            hullSize++;\n            // walk forward through the hull, adding more triangles and flipping recursively\n            let n = hullNext[e];\n            while(q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])){\n                t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]);\n                hullTri[i] = this._legalize(t + 2);\n                hullNext[n] = n; // mark as removed\n                hullSize--;\n                n = q;\n            }\n            // walk backward from the other side, adding more triangles and flipping\n            if (e === start) while(q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])){\n                t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n                this._legalize(t + 2);\n                hullTri[q] = t;\n                hullNext[e] = e; // mark as removed\n                hullSize--;\n                e = q;\n            }\n            // update the hull indices\n            this._hullStart = hullPrev[i] = e;\n            hullNext[e] = hullPrev[n] = i;\n            hullNext[i] = n;\n            // save the two new edges in the hash table\n            hullHash[this._hashKey(x, y)] = i;\n            hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n        }\n        this.hull = new Uint32Array(hullSize);\n        for(let i7 = 0, e = this._hullStart; i7 < hullSize; i7++){\n            this.hull[i7] = e;\n            e = hullNext[e];\n        }\n        // trim typed triangle mesh arrays\n        this.triangles = this._triangles.subarray(0, this.trianglesLen);\n        this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n    }\n    _hashKey(x, y) {\n        return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize;\n    }\n    _legalize(a) {\n        const { _triangles: triangles , _halfedges: halfedges , coords  } = this;\n        let i = 0;\n        let ar = 0;\n        // recursion eliminated with a fixed-size stack\n        while(true){\n            const b = halfedges[a];\n            /* if the pair of triangles doesn't satisfy the Delaunay condition\n             * (p1 is inside the circumcircle of [p0, pl, pr]), flip them,\n             * then do the same check/flip recursively for the new pair of triangles\n             *\n             *           pl                    pl\n             *          /||\\                  /  \\\n             *       al/ || \\bl            al/    \\a\n             *        /  ||  \\              /      \\\n             *       /  a||b  \\    flip    /___ar___\\\n             *     p0\\   ||   /p1   =>   p0\\---bl---/p1\n             *        \\  ||  /              \\      /\n             *       ar\\ || /br             b\\    /br\n             *          \\||/                  \\  /\n             *           pr                    pr\n             */ const a0 = a - a % 3;\n            ar = a0 + (a + 2) % 3;\n            if (b === -1) {\n                if (i === 0) break;\n                a = EDGE_STACK[--i];\n                continue;\n            }\n            const b0 = b - b % 3;\n            const al = a0 + (a + 1) % 3;\n            const bl = b0 + (b + 2) % 3;\n            const p0 = triangles[ar];\n            const pr = triangles[a];\n            const pl = triangles[al];\n            const p1 = triangles[bl];\n            const illegal = inCircle(coords[2 * p0], coords[2 * p0 + 1], coords[2 * pr], coords[2 * pr + 1], coords[2 * pl], coords[2 * pl + 1], coords[2 * p1], coords[2 * p1 + 1]);\n            if (illegal) {\n                triangles[a] = p1;\n                triangles[b] = p0;\n                const hbl = halfedges[bl];\n                // edge swapped on the other side of the hull (rare); fix the halfedge reference\n                if (hbl === -1) {\n                    let e = this._hullStart;\n                    do {\n                        if (this._hullTri[e] === bl) {\n                            this._hullTri[e] = a;\n                            break;\n                        }\n                        e = this._hullPrev[e];\n                    }while (e !== this._hullStart);\n                }\n                this._link(a, hbl);\n                this._link(b, halfedges[ar]);\n                this._link(ar, bl);\n                const br = b0 + (b + 1) % 3;\n                // don't worry about hitting the cap: it can only happen on extremely degenerate input\n                if (i < EDGE_STACK.length) EDGE_STACK[i++] = br;\n            } else {\n                if (i === 0) break;\n                a = EDGE_STACK[--i];\n            }\n        }\n        return ar;\n    }\n    _link(a, b) {\n        this._halfedges[a] = b;\n        if (b !== -1) this._halfedges[b] = a;\n    }\n    // add a new triangle given vertex indices and adjacent half-edge ids\n    _addTriangle(i0, i1, i2, a, b, c) {\n        const t = this.trianglesLen;\n        this._triangles[t] = i0;\n        this._triangles[t + 1] = i1;\n        this._triangles[t + 2] = i2;\n        this._link(t, a);\n        this._link(t + 1, b);\n        this._link(t + 2, c);\n        this.trianglesLen += 3;\n        return t;\n    }\n}\nexports.default = Delaunator;\n// monotonically increases with real angle, but doesn't need expensive trigonometry\nfunction pseudoAngle(dx, dy) {\n    const p = dx / (Math.abs(dx) + Math.abs(dy));\n    return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1]\n}\nfunction dist(ax, ay, bx, by) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return dx * dx + dy * dy;\n}\n// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check\nfunction orientIfSure(px, py, rx, ry, qx, qy) {\n    const l = (ry - py) * (qx - px);\n    const r = (rx - px) * (qy - py);\n    return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0;\n}\n// a more robust orientation test that's stable in a given triangle (to fix robustness issues)\nfunction orient(rx, ry, qx, qy, px, py) {\n    const sign = orientIfSure(px, py, rx, ry, qx, qy) || orientIfSure(rx, ry, qx, qy, px, py) || orientIfSure(qx, qy, px, py, rx, ry);\n    return sign < 0;\n}\nfunction inCircle(ax, ay, bx, by, cx, cy, px, py) {\n    const dx = ax - px;\n    const dy = ay - py;\n    const ex = bx - px;\n    const ey = by - py;\n    const fx = cx - px;\n    const fy = cy - py;\n    const ap = dx * dx + dy * dy;\n    const bp = ex * ex + ey * ey;\n    const cp = fx * fx + fy * fy;\n    return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n}\nfunction circumradius(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n    const x = (ey * bl - dy * cl) * d;\n    const y = (dx * cl - ex * bl) * d;\n    return x * x + y * y;\n}\nfunction circumcenter(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n    const x = ax + (ey * bl - dy * cl) * d;\n    const y = ay + (dx * cl - ex * bl) * d;\n    return {\n        x,\n        y\n    };\n}\nfunction quicksort(ids, dists, left, right) {\n    if (right - left <= 20) for(let i = left + 1; i <= right; i++){\n        const temp = ids[i];\n        const tempDist = dists[temp];\n        let j = i - 1;\n        while(j >= left && dists[ids[j]] > tempDist)ids[j + 1] = ids[j--];\n        ids[j + 1] = temp;\n    }\n    else {\n        const median = left + right >> 1;\n        let i = left + 1;\n        let j = right;\n        swap(ids, median, i);\n        if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n        if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n        if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n        const temp = ids[i];\n        const tempDist = dists[temp];\n        while(true){\n            do i++;\n            while (dists[ids[i]] < tempDist);\n            do j--;\n            while (dists[ids[j]] > tempDist);\n            if (j < i) break;\n            swap(ids, i, j);\n        }\n        ids[left + 1] = ids[j];\n        ids[j] = temp;\n        if (right - i + 1 >= j - left) {\n            quicksort(ids, dists, i, right);\n            quicksort(ids, dists, left, j - 1);\n        } else {\n            quicksort(ids, dists, left, j - 1);\n            quicksort(ids, dists, i, right);\n        }\n    }\n}\nfunction swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n}\nfunction defaultGetX(p) {\n    return p[0];\n}\nfunction defaultGetY(p) {\n    return p[1];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"60Yfe\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nconst epsilon = 1e-6;\nclass Path {\n    constructor(){\n        this._x0 = this._y0 = this._x1 = this._y1 = null; // end of current subpath\n        this._ = \"\";\n    }\n    moveTo(x, y) {\n        this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n    }\n    closePath() {\n        if (this._x1 !== null) {\n            this._x1 = this._x0, this._y1 = this._y0;\n            this._ += \"Z\";\n        }\n    }\n    lineTo(x, y) {\n        this._ += `L${this._x1 = +x},${this._y1 = +y}`;\n    }\n    arc(x, y, r) {\n        x = +x, y = +y, r = +r;\n        const x0 = x + r;\n        const y0 = y;\n        if (r < 0) throw new Error(\"negative radius\");\n        if (this._x1 === null) this._ += `M${x0},${y0}`;\n        else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += \"L\" + x0 + \",\" + y0;\n        if (!r) return;\n        this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`;\n    }\n    rect(x, y, w, h) {\n        this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`;\n    }\n    value() {\n        return this._ || null;\n    }\n}\nexports.default = Path;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5nsXD\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nclass Polygon {\n    constructor(){\n        this._ = [];\n    }\n    moveTo(x, y) {\n        this._.push([\n            x,\n            y\n        ]);\n    }\n    closePath() {\n        this._.push(this._[0].slice());\n    }\n    lineTo(x, y) {\n        this._.push([\n            x,\n            y\n        ]);\n    }\n    value() {\n        return this._.length ? this._ : null;\n    }\n}\nexports.default = Polygon;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a33Bo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _pathJs = require(\"./path.js\");\nvar _pathJsDefault = parcelHelpers.interopDefault(_pathJs);\nvar _polygonJs = require(\"./polygon.js\");\nvar _polygonJsDefault = parcelHelpers.interopDefault(_polygonJs);\nclass Voronoi {\n    constructor(delaunay, [xmin, ymin, xmax, ymax] = [\n        0,\n        0,\n        960,\n        500\n    ]){\n        if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error(\"invalid bounds\");\n        this.delaunay = delaunay;\n        this._circumcenters = new Float64Array(delaunay.points.length * 2);\n        this.vectors = new Float64Array(delaunay.points.length * 2);\n        this.xmax = xmax, this.xmin = xmin;\n        this.ymax = ymax, this.ymin = ymin;\n        this._init();\n    }\n    update() {\n        this.delaunay.update();\n        this._init();\n        return this;\n    }\n    _init() {\n        const { delaunay: { points , hull , triangles  } , vectors  } = this;\n        // Compute circumcenters.\n        const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);\n        for(let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2){\n            const t1 = triangles[i] * 2;\n            const t2 = triangles[i + 1] * 2;\n            const t3 = triangles[i + 2] * 2;\n            const x1 = points[t1];\n            const y1 = points[t1 + 1];\n            const x2 = points[t2];\n            const y2 = points[t2 + 1];\n            const x3 = points[t3];\n            const y3 = points[t3 + 1];\n            const dx = x2 - x1;\n            const dy = y2 - y1;\n            const ex = x3 - x1;\n            const ey = y3 - y1;\n            const bl = dx * dx + dy * dy;\n            const cl = ex * ex + ey * ey;\n            const ab = (dx * ey - dy * ex) * 2;\n            if (!ab) {\n                // degenerate case (collinear diagram)\n                x = (x1 + x3) / 2 - 1e8 * ey;\n                y = (y1 + y3) / 2 + 1e8 * ex;\n            } else if (Math.abs(ab) < 1e-8) {\n                // almost equal points (degenerate triangle)\n                x = (x1 + x3) / 2;\n                y = (y1 + y3) / 2;\n            } else {\n                const d = 1 / ab;\n                x = x1 + (ey * bl - dy * cl) * d;\n                y = y1 + (dx * cl - ex * bl) * d;\n            }\n            circumcenters[j] = x;\n            circumcenters[j + 1] = y;\n        }\n        // Compute exterior cell rays.\n        let h = hull[hull.length - 1];\n        let p0, p1 = h * 4;\n        let x0, x1 = points[2 * h];\n        let y0, y1 = points[2 * h + 1];\n        vectors.fill(0);\n        for(let i1 = 0; i1 < hull.length; ++i1){\n            h = hull[i1];\n            p0 = p1, x0 = x1, y0 = y1;\n            p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1];\n            vectors[p0 + 2] = vectors[p1] = y0 - y1;\n            vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0;\n        }\n    }\n    render(context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const { delaunay: { halfedges , inedges , hull  } , circumcenters , vectors  } = this;\n        if (hull.length <= 1) return null;\n        for(let i = 0, n = halfedges.length; i < n; ++i){\n            const j = halfedges[i];\n            if (j < i) continue;\n            const ti = Math.floor(i / 3) * 2;\n            const tj = Math.floor(j / 3) * 2;\n            const xi = circumcenters[ti];\n            const yi = circumcenters[ti + 1];\n            const xj = circumcenters[tj];\n            const yj = circumcenters[tj + 1];\n            this._renderSegment(xi, yi, xj, yj, context);\n        }\n        let h0, h1 = hull[hull.length - 1];\n        for(let i2 = 0; i2 < hull.length; ++i2){\n            h0 = h1, h1 = hull[i2];\n            const t = Math.floor(inedges[h1] / 3) * 2;\n            const x = circumcenters[t];\n            const y = circumcenters[t + 1];\n            const v = h0 * 4;\n            const p = this._project(x, y, vectors[v + 2], vectors[v + 3]);\n            if (p) this._renderSegment(x, y, p[0], p[1], context);\n        }\n        return buffer && buffer.value();\n    }\n    renderBounds(context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin);\n        return buffer && buffer.value();\n    }\n    renderCell(i, context) {\n        const buffer = context == null ? context = new (0, _pathJsDefault.default) : undefined;\n        const points = this._clip(i);\n        if (points === null || !points.length) return;\n        context.moveTo(points[0], points[1]);\n        let n = points.length;\n        while(points[0] === points[n - 2] && points[1] === points[n - 1] && n > 1)n -= 2;\n        for(let i3 = 2; i3 < n; i3 += 2)if (points[i3] !== points[i3 - 2] || points[i3 + 1] !== points[i3 - 1]) context.lineTo(points[i3], points[i3 + 1]);\n        context.closePath();\n        return buffer && buffer.value();\n    }\n    *cellPolygons() {\n        const { delaunay: { points  }  } = this;\n        for(let i = 0, n = points.length / 2; i < n; ++i){\n            const cell = this.cellPolygon(i);\n            if (cell) cell.index = i, yield cell;\n        }\n    }\n    cellPolygon(i) {\n        const polygon = new (0, _polygonJsDefault.default);\n        this.renderCell(i, polygon);\n        return polygon.value();\n    }\n    _renderSegment(x0, y0, x1, y1, context) {\n        let S;\n        const c0 = this._regioncode(x0, y0);\n        const c1 = this._regioncode(x1, y1);\n        if (c0 === 0 && c1 === 0) {\n            context.moveTo(x0, y0);\n            context.lineTo(x1, y1);\n        } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) {\n            context.moveTo(S[0], S[1]);\n            context.lineTo(S[2], S[3]);\n        }\n    }\n    contains(i, x, y) {\n        if ((x = +x, x !== x) || (y = +y, y !== y)) return false;\n        return this.delaunay._step(i, x, y) === i;\n    }\n    *neighbors(i) {\n        const ci = this._clip(i);\n        if (ci) for (const j of this.delaunay.neighbors(i)){\n            const cj = this._clip(j);\n            // find the common edge\n            if (cj) loop: for(let ai = 0, li = ci.length; ai < li; ai += 2){\n                for(let aj = 0, lj = cj.length; aj < lj; aj += 2)if (ci[ai] == cj[aj] && ci[ai + 1] == cj[aj + 1] && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj]) {\n                    yield j;\n                    break loop;\n                }\n            }\n        }\n    }\n    _cell(i) {\n        const { circumcenters , delaunay: { inedges , halfedges , triangles  }  } = this;\n        const e0 = inedges[i];\n        if (e0 === -1) return null; // coincident point\n        const points = [];\n        let e = e0;\n        do {\n            const t = Math.floor(e / 3);\n            points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]);\n            e = e % 3 === 2 ? e - 2 : e + 1;\n            if (triangles[e] !== i) break; // bad triangulation\n            e = halfedges[e];\n        }while (e !== e0 && e !== -1);\n        return points;\n    }\n    _clip(i) {\n        // degenerate case (1 valid point: return the box)\n        if (i === 0 && this.delaunay.hull.length === 1) return [\n            this.xmax,\n            this.ymin,\n            this.xmax,\n            this.ymax,\n            this.xmin,\n            this.ymax,\n            this.xmin,\n            this.ymin\n        ];\n        const points = this._cell(i);\n        if (points === null) return null;\n        const { vectors: V  } = this;\n        const v = i * 4;\n        return V[v] || V[v + 1] ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) : this._clipFinite(i, points);\n    }\n    _clipFinite(i, points) {\n        const n = points.length;\n        let P = null;\n        let x0, y0, x1 = points[n - 2], y1 = points[n - 1];\n        let c0, c1 = this._regioncode(x1, y1);\n        let e0, e1;\n        for(let j = 0; j < n; j += 2){\n            x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1];\n            c0 = c1, c1 = this._regioncode(x1, y1);\n            if (c0 === 0 && c1 === 0) {\n                e0 = e1, e1 = 0;\n                if (P) P.push(x1, y1);\n                else P = [\n                    x1,\n                    y1\n                ];\n            } else {\n                let S, sx0, sy0, sx1, sy1;\n                if (c0 === 0) {\n                    if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue;\n                    [sx0, sy0, sx1, sy1] = S;\n                } else {\n                    if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue;\n                    [sx1, sy1, sx0, sy0] = S;\n                    e0 = e1, e1 = this._edgecode(sx0, sy0);\n                    if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n                    if (P) P.push(sx0, sy0);\n                    else P = [\n                        sx0,\n                        sy0\n                    ];\n                }\n                e0 = e1, e1 = this._edgecode(sx1, sy1);\n                if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n                if (P) P.push(sx1, sy1);\n                else P = [\n                    sx1,\n                    sy1\n                ];\n            }\n        }\n        if (P) {\n            e0 = e1, e1 = this._edgecode(P[0], P[1]);\n            if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n        } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) return [\n            this.xmax,\n            this.ymin,\n            this.xmax,\n            this.ymax,\n            this.xmin,\n            this.ymax,\n            this.xmin,\n            this.ymin\n        ];\n        return P;\n    }\n    _clipSegment(x0, y0, x1, y1, c0, c1) {\n        while(true){\n            if (c0 === 0 && c1 === 0) return [\n                x0,\n                y0,\n                x1,\n                y1\n            ];\n            if (c0 & c1) return null;\n            let x, y, c = c0 || c1;\n            if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax;\n            else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin;\n            else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax;\n            else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin;\n            if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0);\n            else x1 = x, y1 = y, c1 = this._regioncode(x1, y1);\n        }\n    }\n    _clipInfinite(i, points, vx0, vy0, vxn, vyn) {\n        let P = Array.from(points), p;\n        if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]);\n        if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]);\n        if (P = this._clipFinite(i, P)) for(let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2){\n            c0 = c1, c1 = this._edgecode(P[j], P[j + 1]);\n            if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length;\n        }\n        else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) P = [\n            this.xmin,\n            this.ymin,\n            this.xmax,\n            this.ymin,\n            this.xmax,\n            this.ymax,\n            this.xmin,\n            this.ymax\n        ];\n        return P;\n    }\n    _edge(i, e0, e1, P, j) {\n        while(e0 !== e1){\n            let x, y;\n            switch(e0){\n                case 0b0101:\n                    e0 = 0b0100;\n                    continue; // top-left\n                case 0b0100:\n                    e0 = 0b0110, x = this.xmax, y = this.ymin;\n                    break; // top\n                case 0b0110:\n                    e0 = 0b0010;\n                    continue; // top-right\n                case 0b0010:\n                    e0 = 0b1010, x = this.xmax, y = this.ymax;\n                    break; // right\n                case 0b1010:\n                    e0 = 0b1000;\n                    continue; // bottom-right\n                case 0b1000:\n                    e0 = 0b1001, x = this.xmin, y = this.ymax;\n                    break; // bottom\n                case 0b1001:\n                    e0 = 0b0001;\n                    continue; // bottom-left\n                case 0b0001:\n                    e0 = 0b0101, x = this.xmin, y = this.ymin;\n                    break; // left\n            }\n            if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) P.splice(j, 0, x, y), j += 2;\n        }\n        if (P.length > 4) for(let i4 = 0; i4 < P.length; i4 += 2){\n            const j = (i4 + 2) % P.length, k = (i4 + 4) % P.length;\n            if (P[i4] === P[j] && P[j] === P[k] || P[i4 + 1] === P[j + 1] && P[j + 1] === P[k + 1]) P.splice(j, 2), i4 -= 2;\n        }\n        return j;\n    }\n    _project(x0, y0, vx, vy) {\n        let t = Infinity, c, x, y;\n        if (vy < 0) {\n            if (y0 <= this.ymin) return null;\n            if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx;\n        } else if (vy > 0) {\n            if (y0 >= this.ymax) return null;\n            if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx;\n        }\n        if (vx > 0) {\n            if (x0 >= this.xmax) return null;\n            if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy;\n        } else if (vx < 0) {\n            if (x0 <= this.xmin) return null;\n            if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy;\n        }\n        return [\n            x,\n            y\n        ];\n    }\n    _edgecode(x, y) {\n        return (x === this.xmin ? 0b0001 : x === this.xmax ? 0b0010 : 0b0000) | (y === this.ymin ? 0b0100 : y === this.ymax ? 0b1000 : 0b0000);\n    }\n    _regioncode(x, y) {\n        return (x < this.xmin ? 0b0001 : x > this.xmax ? 0b0010 : 0b0000) | (y < this.ymin ? 0b0100 : y > this.ymax ? 0b1000 : 0b0000);\n    }\n}\nexports.default = Voronoi;\n\n},{\"./path.js\":\"60Yfe\",\"./polygon.js\":\"5nsXD\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Z7Aq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"wordcloud\", ()=>Wordcloud);\nvar _vegaCanvas = require(\"vega-canvas\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaStatistics = require(\"vega-statistics\");\n/*\nCopyright (c) 2013, Jason Davies.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n  * Redistributions of source code must retain the above copyright notice, this\n    list of conditions and the following disclaimer.\n\n  * Redistributions in binary form must reproduce the above copyright notice,\n    this list of conditions and the following disclaimer in the documentation\n    and/or other materials provided with the distribution.\n\n  * The name Jason Davies may not be used to endorse or promote products\n    derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL JASON DAVIES BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\nOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\nADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/ // Word cloud layout by Jason Davies, https://www.jasondavies.com/wordcloud/\n// Algorithm due to Jonathan Feinberg, http://static.mrfeinberg.com/bv_ch03.pdf\nvar cloudRadians = Math.PI / 180, cw = 64, ch = 2048;\nfunction cloud() {\n    var size = [\n        256,\n        256\n    ], text, font, fontSize, fontStyle, fontWeight, rotate, padding, spiral = archimedeanSpiral, words = [], random = Math.random, cloud1 = {};\n    cloud1.layout = function() {\n        var contextAndRatio = getContext((0, _vegaCanvas.canvas)()), board = zeroArray((size[0] >> 5) * size[1]), bounds = null, n = words.length, i = -1, tags = [], data = words.map((d)=>({\n                text: text(d),\n                font: font(d),\n                style: fontStyle(d),\n                weight: fontWeight(d),\n                rotate: rotate(d),\n                size: ~~(fontSize(d) + 1e-14),\n                padding: padding(d),\n                xoff: 0,\n                yoff: 0,\n                x1: 0,\n                y1: 0,\n                x0: 0,\n                y0: 0,\n                hasText: false,\n                sprite: null,\n                datum: d\n            })).sort((a, b)=>b.size - a.size);\n        while(++i < n){\n            var d1 = data[i];\n            d1.x = size[0] * (random() + .5) >> 1;\n            d1.y = size[1] * (random() + .5) >> 1;\n            cloudSprite(contextAndRatio, d1, data, i);\n            if (d1.hasText && place(board, d1, bounds)) {\n                tags.push(d1);\n                if (bounds) cloudBounds(bounds, d1);\n                else bounds = [\n                    {\n                        x: d1.x + d1.x0,\n                        y: d1.y + d1.y0\n                    },\n                    {\n                        x: d1.x + d1.x1,\n                        y: d1.y + d1.y1\n                    }\n                ]; // Temporary hack\n                d1.x -= size[0] >> 1;\n                d1.y -= size[1] >> 1;\n            }\n        }\n        return tags;\n    };\n    function getContext(canvas) {\n        canvas.width = canvas.height = 1;\n        var ratio = Math.sqrt(canvas.getContext(\"2d\").getImageData(0, 0, 1, 1).data.length >> 2);\n        canvas.width = (cw << 5) / ratio;\n        canvas.height = ch / ratio;\n        var context = canvas.getContext(\"2d\");\n        context.fillStyle = context.strokeStyle = \"red\";\n        context.textAlign = \"center\";\n        return {\n            context: context,\n            ratio: ratio\n        };\n    }\n    function place(board, tag, bounds) {\n        var startX = tag.x, startY = tag.y, maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]), s = spiral(size), dt = random() < .5 ? 1 : -1, t = -dt, dxdy, dx, dy;\n        while(dxdy = s(t += dt)){\n            dx = ~~dxdy[0];\n            dy = ~~dxdy[1];\n            if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break;\n            tag.x = startX + dx;\n            tag.y = startY + dy;\n            if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue; // TODO only check for collisions within current bounds.\n            if (!bounds || !cloudCollide(tag, board, size[0])) {\n                if (!bounds || collideRects(tag, bounds)) {\n                    var sprite = tag.sprite, w = tag.width >> 5, sw = size[0] >> 5, lx = tag.x - (w << 4), sx = lx & 0x7f, msx = 32 - sx, h = tag.y1 - tag.y0, x = (tag.y + tag.y0) * sw + (lx >> 5), last;\n                    for(var j = 0; j < h; j++){\n                        last = 0;\n                        for(var i = 0; i <= w; i++)board[x + i] |= last << msx | (i < w ? (last = sprite[j * w + i]) >>> sx : 0);\n                        x += sw;\n                    }\n                    tag.sprite = null;\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    cloud1.words = function(_) {\n        if (arguments.length) {\n            words = _;\n            return cloud1;\n        } else return words;\n    };\n    cloud1.size = function(_) {\n        if (arguments.length) {\n            size = [\n                +_[0],\n                +_[1]\n            ];\n            return cloud1;\n        } else return size;\n    };\n    cloud1.font = function(_) {\n        if (arguments.length) {\n            font = functor(_);\n            return cloud1;\n        } else return font;\n    };\n    cloud1.fontStyle = function(_) {\n        if (arguments.length) {\n            fontStyle = functor(_);\n            return cloud1;\n        } else return fontStyle;\n    };\n    cloud1.fontWeight = function(_) {\n        if (arguments.length) {\n            fontWeight = functor(_);\n            return cloud1;\n        } else return fontWeight;\n    };\n    cloud1.rotate = function(_) {\n        if (arguments.length) {\n            rotate = functor(_);\n            return cloud1;\n        } else return rotate;\n    };\n    cloud1.text = function(_) {\n        if (arguments.length) {\n            text = functor(_);\n            return cloud1;\n        } else return text;\n    };\n    cloud1.spiral = function(_) {\n        if (arguments.length) {\n            spiral = spirals[_] || _;\n            return cloud1;\n        } else return spiral;\n    };\n    cloud1.fontSize = function(_) {\n        if (arguments.length) {\n            fontSize = functor(_);\n            return cloud1;\n        } else return fontSize;\n    };\n    cloud1.padding = function(_) {\n        if (arguments.length) {\n            padding = functor(_);\n            return cloud1;\n        } else return padding;\n    };\n    cloud1.random = function(_) {\n        if (arguments.length) {\n            random = _;\n            return cloud1;\n        } else return random;\n    };\n    return cloud1;\n} // Fetches a monochrome sprite bitmap for the specified text.\n// Load in batches for speed.\nfunction cloudSprite(contextAndRatio, d, data, di) {\n    if (d.sprite) return;\n    var c = contextAndRatio.context, ratio = contextAndRatio.ratio;\n    c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);\n    var x = 0, y = 0, maxh = 0, n = data.length, w, w32, h, i, j;\n    --di;\n    while(++di < n){\n        d = data[di];\n        c.save();\n        c.font = d.style + \" \" + d.weight + \" \" + ~~((d.size + 1) / ratio) + \"px \" + d.font;\n        w = c.measureText(d.text + \"m\").width * ratio;\n        h = d.size << 1;\n        if (d.rotate) {\n            var sr = Math.sin(d.rotate * cloudRadians), cr = Math.cos(d.rotate * cloudRadians), wcr = w * cr, wsr = w * sr, hcr = h * cr, hsr = h * sr;\n            w = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f >> 5 << 5;\n            h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));\n        } else w = w + 0x1f >> 5 << 5;\n        if (h > maxh) maxh = h;\n        if (x + w >= cw << 5) {\n            x = 0;\n            y += maxh;\n            maxh = 0;\n        }\n        if (y + h >= ch) break;\n        c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio);\n        if (d.rotate) c.rotate(d.rotate * cloudRadians);\n        c.fillText(d.text, 0, 0);\n        if (d.padding) {\n            c.lineWidth = 2 * d.padding;\n            c.strokeText(d.text, 0, 0);\n        }\n        c.restore();\n        d.width = w;\n        d.height = h;\n        d.xoff = x;\n        d.yoff = y;\n        d.x1 = w >> 1;\n        d.y1 = h >> 1;\n        d.x0 = -d.x1;\n        d.y0 = -d.y1;\n        d.hasText = true;\n        x += w;\n    }\n    var pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, sprite = [];\n    while(--di >= 0){\n        d = data[di];\n        if (!d.hasText) continue;\n        w = d.width;\n        w32 = w >> 5;\n        h = d.y1 - d.y0; // Zero the buffer\n        for(i = 0; i < h * w32; i++)sprite[i] = 0;\n        x = d.xoff;\n        if (x == null) return;\n        y = d.yoff;\n        var seen = 0, seenRow = -1;\n        for(j = 0; j < h; j++){\n            for(i = 0; i < w; i++){\n                var k = w32 * j + (i >> 5), m = pixels[(y + j) * (cw << 5) + (x + i) << 2] ? 1 << 31 - i % 32 : 0;\n                sprite[k] |= m;\n                seen |= m;\n            }\n            if (seen) seenRow = j;\n            else {\n                d.y0++;\n                h--;\n                j--;\n                y++;\n            }\n        }\n        d.y1 = d.y0 + seenRow;\n        d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32);\n    }\n} // Use mask-based collision detection.\nfunction cloudCollide(tag, board, sw) {\n    sw >>= 5;\n    var sprite = tag.sprite, w = tag.width >> 5, lx = tag.x - (w << 4), sx = lx & 0x7f, msx = 32 - sx, h = tag.y1 - tag.y0, x = (tag.y + tag.y0) * sw + (lx >> 5), last;\n    for(var j = 0; j < h; j++){\n        last = 0;\n        for(var i = 0; i <= w; i++){\n            if ((last << msx | (i < w ? (last = sprite[j * w + i]) >>> sx : 0)) & board[x + i]) return true;\n        }\n        x += sw;\n    }\n    return false;\n}\nfunction cloudBounds(bounds, d) {\n    var b0 = bounds[0], b1 = bounds[1];\n    if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0;\n    if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0;\n    if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1;\n    if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1;\n}\nfunction collideRects(a, b) {\n    return a.x + a.x1 > b[0].x && a.x + a.x0 < b[1].x && a.y + a.y1 > b[0].y && a.y + a.y0 < b[1].y;\n}\nfunction archimedeanSpiral(size) {\n    var e = size[0] / size[1];\n    return function(t) {\n        return [\n            e * (t *= .1) * Math.cos(t),\n            t * Math.sin(t)\n        ];\n    };\n}\nfunction rectangularSpiral(size) {\n    var dy = 4, dx = dy * size[0] / size[1], x = 0, y = 0;\n    return function(t) {\n        var sign = t < 0 ? -1 : 1; // See triangular numbers: T_n = n * (n + 1) / 2.\n        switch(Math.sqrt(1 + 4 * sign * t) - sign & 3){\n            case 0:\n                x += dx;\n                break;\n            case 1:\n                y += dy;\n                break;\n            case 2:\n                x -= dx;\n                break;\n            default:\n                y -= dy;\n                break;\n        }\n        return [\n            x,\n            y\n        ];\n    };\n} // TODO reuse arrays?\nfunction zeroArray(n) {\n    var a = [], i = -1;\n    while(++i < n)a[i] = 0;\n    return a;\n}\nfunction functor(d) {\n    return typeof d === \"function\" ? d : function() {\n        return d;\n    };\n}\nvar spirals = {\n    archimedean: archimedeanSpiral,\n    rectangular: rectangularSpiral\n};\nconst Output = [\n    \"x\",\n    \"y\",\n    \"font\",\n    \"fontSize\",\n    \"fontStyle\",\n    \"fontWeight\",\n    \"angle\"\n];\nconst Params = [\n    \"text\",\n    \"font\",\n    \"rotate\",\n    \"fontSize\",\n    \"fontStyle\",\n    \"fontWeight\"\n];\nfunction Wordcloud(params) {\n    (0, _vegaDataflow.Transform).call(this, cloud(), params);\n}\nWordcloud.Definition = {\n    \"type\": \"Wordcloud\",\n    \"metadata\": {\n        \"modifies\": true\n    },\n    \"params\": [\n        {\n            \"name\": \"size\",\n            \"type\": \"number\",\n            \"array\": true,\n            \"length\": 2\n        },\n        {\n            \"name\": \"font\",\n            \"type\": \"string\",\n            \"expr\": true,\n            \"default\": \"sans-serif\"\n        },\n        {\n            \"name\": \"fontStyle\",\n            \"type\": \"string\",\n            \"expr\": true,\n            \"default\": \"normal\"\n        },\n        {\n            \"name\": \"fontWeight\",\n            \"type\": \"string\",\n            \"expr\": true,\n            \"default\": \"normal\"\n        },\n        {\n            \"name\": \"fontSize\",\n            \"type\": \"number\",\n            \"expr\": true,\n            \"default\": 14\n        },\n        {\n            \"name\": \"fontSizeRange\",\n            \"type\": \"number\",\n            \"array\": \"nullable\",\n            \"default\": [\n                10,\n                50\n            ]\n        },\n        {\n            \"name\": \"rotate\",\n            \"type\": \"number\",\n            \"expr\": true,\n            \"default\": 0\n        },\n        {\n            \"name\": \"text\",\n            \"type\": \"field\"\n        },\n        {\n            \"name\": \"spiral\",\n            \"type\": \"string\",\n            \"values\": [\n                \"archimedean\",\n                \"rectangular\"\n            ]\n        },\n        {\n            \"name\": \"padding\",\n            \"type\": \"number\",\n            \"expr\": true\n        },\n        {\n            \"name\": \"as\",\n            \"type\": \"string\",\n            \"array\": true,\n            \"length\": 7,\n            \"default\": Output\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(Wordcloud, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (_.size && !(_.size[0] && _.size[1])) (0, _vegaUtil.error)(\"Wordcloud size dimensions must be non-zero.\");\n        function modp(param) {\n            const p = _[param];\n            return (0, _vegaUtil.isFunction)(p) && pulse.modified(p.fields);\n        }\n        const mod = _.modified();\n        if (!(mod || pulse.changed(pulse.ADD_REM) || Params.some(modp))) return;\n        const data = pulse.materialize(pulse.SOURCE).source, layout = this.value, as = _.as || Output;\n        let fontSize = _.fontSize || 14, range;\n        (0, _vegaUtil.isFunction)(fontSize) ? range = _.fontSizeRange : fontSize = (0, _vegaUtil.constant)(fontSize); // create font size scaling function as needed\n        if (range) {\n            const fsize = fontSize, sizeScale = (0, _vegaScale.scale)(\"sqrt\")().domain((0, _vegaUtil.extent)(data, fsize)).range(range);\n            fontSize = (x)=>sizeScale(fsize(x));\n        }\n        data.forEach((t)=>{\n            t[as[0]] = NaN;\n            t[as[1]] = NaN;\n            t[as[3]] = 0;\n        }); // configure layout\n        const words = layout.words(data).text(_.text).size(_.size || [\n            500,\n            500\n        ]).padding(_.padding || 1).spiral(_.spiral || \"archimedean\").rotate(_.rotate || 0).font(_.font || \"sans-serif\").fontStyle(_.fontStyle || \"normal\").fontWeight(_.fontWeight || \"normal\").fontSize(fontSize).random((0, _vegaStatistics.random)).layout();\n        const size = layout.size(), dx = size[0] >> 1, dy = size[1] >> 1, n = words.length;\n        for(let i = 0, w, t1; i < n; ++i){\n            w = words[i];\n            t1 = w.datum;\n            t1[as[0]] = w.x + dx;\n            t1[as[1]] = w.y + dy;\n            t1[as[2]] = w.font;\n            t1[as[3]] = w.size;\n            t1[as[4]] = w.style;\n            t1[as[5]] = w.weight;\n            t1[as[6]] = w.rotate;\n        }\n        return pulse.reflow(mod).modifies(as);\n    }\n});\n\n},{\"vega-canvas\":\"f0yaA\",\"vega-dataflow\":\"3NitK\",\"vega-util\":\"bApja\",\"vega-scale\":\"bEydG\",\"vega-statistics\":\"5ncfv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8iEZv\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"crossfilter\", ()=>CrossFilter);\nparcelHelpers.export(exports, \"resolvefilter\", ()=>ResolveFilter);\nvar _d3Array = require(\"d3-array\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaUtil = require(\"vega-util\");\nconst array8 = (n)=>new Uint8Array(n);\nconst array16 = (n)=>new Uint16Array(n);\nconst array32 = (n)=>new Uint32Array(n);\n/**\n * Maintains CrossFilter state.\n */ function Bitmaps() {\n    let width = 8, data = [], seen = array32(0), curr = array(0, width), prev = array(0, width);\n    return {\n        data: ()=>data,\n        seen: ()=>seen = lengthen(seen, data.length),\n        add (array1) {\n            for(let i = 0, j = data.length, n = array1.length, t; i < n; ++i){\n                t = array1[i];\n                t._index = j++;\n                data.push(t);\n            }\n        },\n        remove (num, map) {\n            // map: index -> boolean (true => remove)\n            const n = data.length, copy = Array(n - num), reindex = data; // reuse old data array for index map\n            let t, i, j; // seek forward to first removal\n            for(i = 0; !map[i] && i < n; ++i){\n                copy[i] = data[i];\n                reindex[i] = i;\n            } // condense arrays\n            for(j = i; i < n; ++i){\n                t = data[i];\n                if (!map[i]) {\n                    reindex[i] = j;\n                    curr[j] = curr[i];\n                    prev[j] = prev[i];\n                    copy[j] = t;\n                    t._index = j++;\n                } else reindex[i] = -1;\n                curr[i] = 0; // clear unused bits\n            }\n            data = copy;\n            return reindex;\n        },\n        size: ()=>data.length,\n        curr: ()=>curr,\n        prev: ()=>prev,\n        reset: (k)=>prev[k] = curr[k],\n        all: ()=>width < 0x101 ? 0xff : width < 0x10001 ? 0xffff : 0xffffffff,\n        set (k, one) {\n            curr[k] |= one;\n        },\n        clear (k, one) {\n            curr[k] &= ~one;\n        },\n        resize (n, m) {\n            const k = curr.length;\n            if (n > k || m > width) {\n                width = Math.max(m, width);\n                curr = array(n, width, curr);\n                prev = array(n, width);\n            }\n        }\n    };\n}\nfunction lengthen(array2, length, copy) {\n    if (array2.length >= length) return array2;\n    copy = copy || new array2.constructor(length);\n    copy.set(array2);\n    return copy;\n}\nfunction array(n, m, array3) {\n    const copy = (m < 0x101 ? array8 : m < 0x10001 ? array16 : array32)(n);\n    if (array3) copy.set(array3);\n    return copy;\n}\nfunction Dimension(index, i1, query) {\n    const bit = 1 << i1;\n    return {\n        one: bit,\n        zero: ~bit,\n        range: query.slice(),\n        bisect: index.bisect,\n        index: index.index,\n        size: index.size,\n        onAdd (added, curr) {\n            const dim = this, range = dim.bisect(dim.range, added.value), idx = added.index, lo = range[0], hi = range[1], n1 = idx.length;\n            let i;\n            for(i = 0; i < lo; ++i)curr[idx[i]] |= bit;\n            for(i = hi; i < n1; ++i)curr[idx[i]] |= bit;\n            return dim;\n        }\n    };\n}\n/**\n * Maintains a list of values, sorted by key.\n */ function SortedIndex() {\n    let index = array32(0), value = [], size = 0;\n    function insert(key, data, base) {\n        if (!data.length) return [];\n        const n0 = size, n1 = data.length, addi = array32(n1);\n        let addv = Array(n1), oldv, oldi, i;\n        for(i = 0; i < n1; ++i){\n            addv[i] = key(data[i]);\n            addi[i] = i;\n        }\n        addv = sort(addv, addi);\n        if (n0) {\n            oldv = value;\n            oldi = index;\n            value = Array(n0 + n1);\n            index = array32(n0 + n1);\n            merge(base, oldv, oldi, n0, addv, addi, n1, value, index);\n        } else {\n            if (base > 0) for(i = 0; i < n1; ++i)addi[i] += base;\n            value = addv;\n            index = addi;\n        }\n        size = n0 + n1;\n        return {\n            index: addi,\n            value: addv\n        };\n    }\n    function remove(num, map) {\n        // map: index -> remove\n        const n = size;\n        let idx, i, j; // seek forward to first removal\n        for(i = 0; !map[index[i]] && i < n; ++i); // condense index and value arrays\n        for(j = i; i < n; ++i)if (!map[idx = index[i]]) {\n            index[j] = idx;\n            value[j] = value[i];\n            ++j;\n        }\n        size = n - num;\n    }\n    function reindex(map) {\n        for(let i = 0, n = size; i < n; ++i)index[i] = map[index[i]];\n    }\n    function bisect(range, array4) {\n        let n;\n        if (array4) n = array4.length;\n        else {\n            array4 = value;\n            n = size;\n        }\n        return [\n            (0, _d3Array.bisectLeft)(array4, range[0], 0, n),\n            (0, _d3Array.bisectRight)(array4, range[1], 0, n)\n        ];\n    }\n    return {\n        insert: insert,\n        remove: remove,\n        bisect: bisect,\n        reindex: reindex,\n        index: ()=>index,\n        size: ()=>size\n    };\n}\nfunction sort(values, index) {\n    values.sort.call(index, (a, b)=>{\n        const x = values[a], y = values[b];\n        return x < y ? -1 : x > y ? 1 : 0;\n    });\n    return (0, _d3Array.permute)(values, index);\n}\nfunction merge(base, value0, index0, n0, value1, index1, n1, value, index) {\n    let i0 = 0, i1 = 0, i;\n    for(i = 0; i0 < n0 && i1 < n1; ++i)if (value0[i0] < value1[i1]) {\n        value[i] = value0[i0];\n        index[i] = index0[i0++];\n    } else {\n        value[i] = value1[i1];\n        index[i] = index1[i1++] + base;\n    }\n    for(; i0 < n0; ++i0, ++i){\n        value[i] = value0[i0];\n        index[i] = index0[i0];\n    }\n    for(; i1 < n1; ++i1, ++i){\n        value[i] = value1[i1];\n        index[i] = index1[i1] + base;\n    }\n}\n/**\n * An indexed multi-dimensional filter.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {Array<function(object): *>} params.fields - An array of dimension accessors to filter.\n * @param {Array} params.query - An array of per-dimension range queries.\n */ function CrossFilter(params) {\n    (0, _vegaDataflow.Transform).call(this, Bitmaps(), params);\n    this._indices = null;\n    this._dims = null;\n}\nCrossFilter.Definition = {\n    \"type\": \"CrossFilter\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"fields\",\n            \"type\": \"field\",\n            \"array\": true,\n            \"required\": true\n        },\n        {\n            \"name\": \"query\",\n            \"type\": \"array\",\n            \"array\": true,\n            \"required\": true,\n            \"content\": {\n                \"type\": \"number\",\n                \"array\": true,\n                \"length\": 2\n            }\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(CrossFilter, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        if (!this._dims) return this.init(_, pulse);\n        else {\n            var init = _.modified(\"fields\") || _.fields.some((f)=>pulse.modified(f.fields));\n            return init ? this.reinit(_, pulse) : this.eval(_, pulse);\n        }\n    },\n    init (_, pulse) {\n        const fields = _.fields, query = _.query, indices = this._indices = {}, dims = this._dims = [], m = query.length;\n        let i = 0, key, index; // instantiate indices and dimensions\n        for(; i < m; ++i){\n            key = fields[i].fname;\n            index = indices[key] || (indices[key] = SortedIndex());\n            dims.push(Dimension(index, i, query[i]));\n        }\n        return this.eval(_, pulse);\n    },\n    reinit (_, pulse) {\n        const output = pulse.materialize().fork(), fields = _.fields, query = _.query, indices = this._indices, dims = this._dims, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), out = output.rem = output.add, mod = output.mod, m = query.length, adds = {};\n        let add, index, key, mods, remMap, modMap, i, n, f; // set prev to current state\n        prev.set(curr); // if pulse has remove tuples, process them first\n        if (pulse.rem.length) remMap = this.remove(_, pulse, output);\n         // if pulse has added tuples, add them to state\n        if (pulse.add.length) bits.add(pulse.add);\n         // if pulse has modified tuples, create an index map\n        if (pulse.mod.length) {\n            modMap = {};\n            for(mods = pulse.mod, i = 0, n = mods.length; i < n; ++i)modMap[mods[i]._index] = 1;\n        } // re-initialize indices as needed, update curr bitmap\n        for(i = 0; i < m; ++i){\n            f = fields[i];\n            if (!dims[i] || _.modified(\"fields\", i) || pulse.modified(f.fields)) {\n                key = f.fname;\n                if (!(add = adds[key])) {\n                    indices[key] = index = SortedIndex();\n                    adds[key] = add = index.insert(f, pulse.source, 0);\n                }\n                dims[i] = Dimension(index, i, query[i]).onAdd(add, curr);\n            }\n        } // visit each tuple\n        // if filter state changed, push index to add/rem\n        // else if in mod and passes a filter, push index to mod\n        for(i = 0, n = bits.data().length; i < n; ++i){\n            if (remMap[i]) continue;\n            else if (prev[i] !== curr[i]) // add if state changed\n            out.push(i);\n            else if (modMap[i] && curr[i] !== all) // otherwise, pass mods through\n            mod.push(i);\n        }\n        bits.mask = (1 << m) - 1;\n        return output;\n    },\n    eval (_, pulse) {\n        const output = pulse.materialize().fork(), m = this._dims.length;\n        let mask = 0;\n        if (pulse.rem.length) {\n            this.remove(_, pulse, output);\n            mask |= (1 << m) - 1;\n        }\n        if (_.modified(\"query\") && !_.modified(\"fields\")) mask |= this.update(_, pulse, output);\n        if (pulse.add.length) {\n            this.insert(_, pulse, output);\n            mask |= (1 << m) - 1;\n        }\n        if (pulse.mod.length) {\n            this.modify(pulse, output);\n            mask |= (1 << m) - 1;\n        }\n        this.value.mask = mask;\n        return output;\n    },\n    insert (_, pulse, output) {\n        const tuples = pulse.add, bits = this.value, dims = this._dims, indices = this._indices, fields = _.fields, adds = {}, out = output.add, n = bits.size() + tuples.length, m = dims.length;\n        let k = bits.size(), j, key, add; // resize bitmaps and add tuples as needed\n        bits.resize(n, m);\n        bits.add(tuples);\n        const curr = bits.curr(), prev = bits.prev(), all = bits.all(); // add to dimensional indices\n        for(j = 0; j < m; ++j){\n            key = fields[j].fname;\n            add = adds[key] || (adds[key] = indices[key].insert(fields[j], tuples, k));\n            dims[j].onAdd(add, curr);\n        } // set previous filters, output if passes at least one filter\n        for(; k < n; ++k){\n            prev[k] = all;\n            if (curr[k] !== all) out.push(k);\n        }\n    },\n    modify (pulse, output) {\n        const out = output.mod, bits = this.value, curr = bits.curr(), all = bits.all(), tuples = pulse.mod;\n        let i, n, k;\n        for(i = 0, n = tuples.length; i < n; ++i){\n            k = tuples[i]._index;\n            if (curr[k] !== all) out.push(k);\n        }\n    },\n    remove (_, pulse, output) {\n        const indices = this._indices, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), map = {}, out = output.rem, tuples = pulse.rem;\n        let i, n, k, f; // process tuples, output if passes at least one filter\n        for(i = 0, n = tuples.length; i < n; ++i){\n            k = tuples[i]._index;\n            map[k] = 1; // build index map\n            prev[k] = f = curr[k];\n            curr[k] = all;\n            if (f !== all) out.push(k);\n        } // remove from dimensional indices\n        for(k in indices)indices[k].remove(n, map);\n        this.reindex(pulse, n, map);\n        return map;\n    },\n    // reindex filters and indices after propagation completes\n    reindex (pulse, num, map) {\n        const indices = this._indices, bits = this.value;\n        pulse.runAfter(()=>{\n            const indexMap = bits.remove(num, map);\n            for(const key in indices)indices[key].reindex(indexMap);\n        });\n    },\n    update (_, pulse, output) {\n        const dims = this._dims, query = _.query, stamp = pulse.stamp, m = dims.length;\n        let mask = 0, i, q; // survey how many queries have changed\n        output.filters = 0;\n        for(q = 0; q < m; ++q)if (_.modified(\"query\", q)) {\n            i = q;\n            ++mask;\n        }\n        if (mask === 1) {\n            // only one query changed, use more efficient update\n            mask = dims[i].one;\n            this.incrementOne(dims[i], query[i], output.add, output.rem);\n        } else // multiple queries changed, perform full record keeping\n        for(q = 0, mask = 0; q < m; ++q){\n            if (!_.modified(\"query\", q)) continue;\n            mask |= dims[q].one;\n            this.incrementAll(dims[q], query[q], stamp, output.add);\n            output.rem = output.add; // duplicate add/rem for downstream resolve\n        }\n        return mask;\n    },\n    incrementAll (dim, query, stamp, out) {\n        const bits = this.value, seen = bits.seen(), curr = bits.curr(), prev = bits.prev(), index = dim.index(), old = dim.bisect(dim.range), range = dim.bisect(query), lo1 = range[0], hi1 = range[1], lo0 = old[0], hi0 = old[1], one = dim.one;\n        let i, j, k; // Fast incremental update based on previous lo index.\n        if (lo1 < lo0) for(i = lo1, j = Math.min(lo0, hi1); i < j; ++i){\n            k = index[i];\n            if (seen[k] !== stamp) {\n                prev[k] = curr[k];\n                seen[k] = stamp;\n                out.push(k);\n            }\n            curr[k] ^= one;\n        }\n        else if (lo1 > lo0) for(i = lo0, j = Math.min(lo1, hi0); i < j; ++i){\n            k = index[i];\n            if (seen[k] !== stamp) {\n                prev[k] = curr[k];\n                seen[k] = stamp;\n                out.push(k);\n            }\n            curr[k] ^= one;\n        }\n         // Fast incremental update based on previous hi index.\n        if (hi1 > hi0) for(i = Math.max(lo1, hi0), j = hi1; i < j; ++i){\n            k = index[i];\n            if (seen[k] !== stamp) {\n                prev[k] = curr[k];\n                seen[k] = stamp;\n                out.push(k);\n            }\n            curr[k] ^= one;\n        }\n        else if (hi1 < hi0) for(i = Math.max(lo0, hi1), j = hi0; i < j; ++i){\n            k = index[i];\n            if (seen[k] !== stamp) {\n                prev[k] = curr[k];\n                seen[k] = stamp;\n                out.push(k);\n            }\n            curr[k] ^= one;\n        }\n        dim.range = query.slice();\n    },\n    incrementOne (dim, query, add, rem) {\n        const bits = this.value, curr = bits.curr(), index = dim.index(), old = dim.bisect(dim.range), range = dim.bisect(query), lo1 = range[0], hi1 = range[1], lo0 = old[0], hi0 = old[1], one = dim.one;\n        let i, j, k; // Fast incremental update based on previous lo index.\n        if (lo1 < lo0) for(i = lo1, j = Math.min(lo0, hi1); i < j; ++i){\n            k = index[i];\n            curr[k] ^= one;\n            add.push(k);\n        }\n        else if (lo1 > lo0) for(i = lo0, j = Math.min(lo1, hi0); i < j; ++i){\n            k = index[i];\n            curr[k] ^= one;\n            rem.push(k);\n        }\n         // Fast incremental update based on previous hi index.\n        if (hi1 > hi0) for(i = Math.max(lo1, hi0), j = hi1; i < j; ++i){\n            k = index[i];\n            curr[k] ^= one;\n            add.push(k);\n        }\n        else if (hi1 < hi0) for(i = Math.max(lo0, hi1), j = hi0; i < j; ++i){\n            k = index[i];\n            curr[k] ^= one;\n            rem.push(k);\n        }\n        dim.range = query.slice();\n    }\n});\n/**\n * Selectively filters tuples by resolving against a filter bitmap.\n * Useful for processing the output of a cross-filter transform.\n * @constructor\n * @param {object} params - The parameters for this operator.\n * @param {object} params.ignore - A bit mask indicating which filters to ignore.\n * @param {object} params.filter - The per-tuple filter bitmaps. Typically this\n *   parameter value is a reference to a {@link CrossFilter} transform.\n */ function ResolveFilter(params) {\n    (0, _vegaDataflow.Transform).call(this, null, params);\n}\nResolveFilter.Definition = {\n    \"type\": \"ResolveFilter\",\n    \"metadata\": {},\n    \"params\": [\n        {\n            \"name\": \"ignore\",\n            \"type\": \"number\",\n            \"required\": true,\n            \"description\": \"A bit mask indicating which filters to ignore.\"\n        },\n        {\n            \"name\": \"filter\",\n            \"type\": \"object\",\n            \"required\": true,\n            \"description\": \"Per-tuple filter bitmaps from a CrossFilter transform.\"\n        }\n    ]\n};\n(0, _vegaUtil.inherits)(ResolveFilter, (0, _vegaDataflow.Transform), {\n    transform (_, pulse) {\n        const ignore = ~(_.ignore || 0), // bit mask where zeros -> dims to ignore\n        bitmap = _.filter, mask = bitmap.mask; // exit early if no relevant filter changes\n        if ((mask & ignore) === 0) return pulse.StopPropagation;\n        const output = pulse.fork(pulse.ALL), data = bitmap.data(), curr = bitmap.curr(), prev = bitmap.prev(), pass = (k)=>!(curr[k] & ignore) ? data[k] : null; // propagate all mod tuples that pass the filter\n        output.filter(output.MOD, pass); // determine add & rem tuples via filter functions\n        // for efficiency, we do *not* populate new arrays,\n        // instead we add filter functions applied downstream\n        if (!(mask & mask - 1)) {\n            // only one filter changed\n            output.filter(output.ADD, pass);\n            output.filter(output.REM, (k)=>(curr[k] & ignore) === mask ? data[k] : null);\n        } else {\n            // multiple filters changed\n            output.filter(output.ADD, (k)=>{\n                const c = curr[k] & ignore, f = !c && c ^ prev[k] & ignore;\n                return f ? data[k] : null;\n            });\n            output.filter(output.REM, (k)=>{\n                const c = curr[k] & ignore, f = c && !(c ^ (c ^ prev[k] & ignore));\n                return f ? data[k] : null;\n            });\n        } // add filter to source data in case of reflow...\n        return output.filter(output.SOURCE, (t)=>pass(t._index));\n    }\n});\n\n},{\"d3-array\":\"6IwJG\",\"vega-dataflow\":\"3NitK\",\"vega-util\":\"bApja\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cGC2i\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"View\", ()=>View);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nvar _d3Array = require(\"d3-array\");\nvar _vegaFunctions = require(\"vega-functions\");\nvar _vegaRuntime = require(\"vega-runtime\");\nvar _d3Timer = require(\"d3-timer\");\nvar _vegaFormat = require(\"vega-format\");\n// initialize aria role and label attributes\nfunction initializeAria(view) {\n    const el = view.container();\n    if (el) {\n        el.setAttribute(\"role\", \"graphics-document\");\n        el.setAttribute(\"aria-roleDescription\", \"visualization\");\n        ariaLabel(el, view.description());\n    }\n} // update aria-label if we have a DOM container element\nfunction ariaLabel(el, desc) {\n    if (el) desc == null ? el.removeAttribute(\"aria-label\") : el.setAttribute(\"aria-label\", desc);\n}\nfunction background(view) {\n    // respond to background signal\n    view.add(null, (_)=>{\n        view._background = _.bg;\n        view._resize = 1;\n        return _.bg;\n    }, {\n        bg: view._signals.background\n    });\n}\nconst Default = \"default\";\nfunction cursor(view) {\n    // get cursor signal, add to dataflow if needed\n    const cursor1 = view._signals.cursor || (view._signals.cursor = view.add({\n        user: Default,\n        item: null\n    })); // evaluate cursor on each mousemove event\n    view.on(view.events(\"view\", \"mousemove\"), cursor1, (_, event1)=>{\n        const value = cursor1.value, user = value ? (0, _vegaUtil.isString)(value) ? value : value.user : Default, item = event1.item && event1.item.cursor || null;\n        return value && user === value.user && item == value.item ? value : {\n            user: user,\n            item: item\n        };\n    }); // when cursor signal updates, set visible cursor\n    view.add(null, function(_) {\n        let user = _.cursor, item = this.value;\n        if (!(0, _vegaUtil.isString)(user)) {\n            item = user.item;\n            user = user.user;\n        }\n        setCursor(view, user && user !== Default ? user : item || user);\n        return item;\n    }, {\n        cursor: cursor1\n    });\n}\nfunction setCursor(view, cursor2) {\n    const el = view.globalCursor() ? typeof document !== \"undefined\" && document.body : view.container();\n    if (el) return cursor2 == null ? el.style.removeProperty(\"cursor\") : el.style.cursor = cursor2;\n}\nfunction dataref(view, name) {\n    var data1 = view._runtime.data;\n    if (!(0, _vegaUtil.hasOwnProperty)(data1, name)) (0, _vegaUtil.error)(\"Unrecognized data set: \" + name);\n    return data1[name];\n}\nfunction data(name, values) {\n    return arguments.length < 2 ? dataref(this, name).values.value : change.call(this, name, (0, _vegaDataflow.changeset)().remove((0, _vegaUtil.truthy)).insert(values));\n}\nfunction change(name, changes) {\n    if (!(0, _vegaDataflow.isChangeSet)(changes)) (0, _vegaUtil.error)(\"Second argument to changes must be a changeset.\");\n    const dataset = dataref(this, name);\n    dataset.modified = true;\n    return this.pulse(dataset.input, changes);\n}\nfunction insert(name, _) {\n    return change.call(this, name, (0, _vegaDataflow.changeset)().insert(_));\n}\nfunction remove(name, _) {\n    return change.call(this, name, (0, _vegaDataflow.changeset)().remove(_));\n}\nfunction width(view) {\n    var padding1 = view.padding();\n    return Math.max(0, view._viewWidth + padding1.left + padding1.right);\n}\nfunction height(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewHeight + padding2.top + padding2.bottom);\n}\nfunction offset(view) {\n    var padding3 = view.padding(), origin = view._origin;\n    return [\n        padding3.left + origin[0],\n        padding3.top + origin[1]\n    ];\n}\nfunction resizeRenderer(view) {\n    var origin = offset(view), w = width(view), h = height(view);\n    view._renderer.background(view.background());\n    view._renderer.resize(w, h, origin);\n    view._handler.origin(origin);\n    view._resizeListeners.forEach((handler)=>{\n        try {\n            handler(w, h);\n        } catch (error) {\n            view.error(error);\n        }\n    });\n}\n/**\n * Extend an event with additional view-specific methods.\n * Adds a new property ('vega') to an event that provides a number\n * of methods for querying information about the current interaction.\n * The vega object provides the following methods:\n *   view - Returns the backing View instance.\n *   item - Returns the currently active scenegraph item (if any).\n *   group - Returns the currently active scenegraph group (if any).\n *     This method accepts a single string-typed argument indicating the name\n *     of the desired parent group. The scenegraph will be traversed from\n *     the item up towards the root to search for a matching group. If no\n *     argument is provided the enclosing group for the active item is\n *     returned, unless the item it itself a group, in which case it is\n *     returned directly.\n *   xy - Returns a two-element array containing the x and y coordinates for\n *     mouse or touch events. For touch events, this is based on the first\n *     elements in the changedTouches array. This method accepts a single\n *     argument: either an item instance or mark name that should serve as\n *     the reference coordinate system. If no argument is provided the\n *     top-level view coordinate system is assumed.\n *   x - Returns the current x-coordinate, accepts the same arguments as xy.\n *   y - Returns the current y-coordinate, accepts the same arguments as xy.\n * @param {Event} event - The input event to extend.\n * @param {Item} item - The currently active scenegraph item (if any).\n * @return {Event} - The extended input event.\n */ function eventExtend(view, event2, item) {\n    var r = view._renderer, el = r && r.canvas(), p, e, translate;\n    if (el) {\n        translate = offset(view);\n        e = event2.changedTouches ? event2.changedTouches[0] : event2;\n        p = (0, _vegaScenegraph.point)(e, el);\n        p[0] -= translate[0];\n        p[1] -= translate[1];\n    }\n    event2.dataflow = view;\n    event2.item = item;\n    event2.vega = extension(view, item, p);\n    return event2;\n}\nfunction extension(view, item1, point) {\n    const itemGroup = item1 ? item1.mark.marktype === \"group\" ? item1 : item1.mark.group : null;\n    function group(name) {\n        var g = itemGroup, i;\n        if (name) {\n            for(i = item1; i; i = i.mark.group)if (i.mark.name === name) {\n                g = i;\n                break;\n            }\n        }\n        return g && g.mark && g.mark.interactive ? g : {};\n    }\n    function xy(item) {\n        if (!item) return point;\n        if ((0, _vegaUtil.isString)(item)) item = group(item);\n        const p = point.slice();\n        while(item){\n            p[0] -= item.x || 0;\n            p[1] -= item.y || 0;\n            item = item.mark && item.mark.group;\n        }\n        return p;\n    }\n    return {\n        view: (0, _vegaUtil.constant)(view),\n        item: (0, _vegaUtil.constant)(item1 || {}),\n        group: group,\n        xy: xy,\n        x: (item)=>xy(item)[0],\n        y: (item)=>xy(item)[1]\n    };\n}\nconst VIEW = \"view\", TIMER = \"timer\", WINDOW = \"window\", NO_TRAP = {\n    trap: false\n};\n/**\n * Initialize event handling configuration.\n * @param {object} config - The configuration settings.\n * @return {object}\n */ function initializeEventConfig(config) {\n    const events1 = (0, _vegaUtil.extend)({\n        defaults: {}\n    }, config);\n    const unpack = (obj, keys)=>{\n        keys.forEach((k)=>{\n            if ((0, _vegaUtil.isArray)(obj[k])) obj[k] = (0, _vegaUtil.toSet)(obj[k]);\n        });\n    };\n    unpack(events1.defaults, [\n        \"prevent\",\n        \"allow\"\n    ]);\n    unpack(events1, [\n        \"view\",\n        \"window\",\n        \"selector\"\n    ]);\n    return events1;\n}\nfunction trackEventListener(view, sources, type, handler) {\n    view._eventListeners.push({\n        type: type,\n        sources: (0, _vegaUtil.array)(sources),\n        handler: handler\n    });\n}\nfunction prevent(view, type) {\n    var def = view._eventConfig.defaults, prevent1 = def.prevent, allow = def.allow;\n    return prevent1 === false || allow === true ? false : prevent1 === true || allow === false ? true : prevent1 ? prevent1[type] : allow ? !allow[type] : view.preventDefault();\n}\nfunction permit(view, key, type) {\n    const rule = view._eventConfig && view._eventConfig[key];\n    if (rule === false || (0, _vegaUtil.isObject)(rule) && !rule[type]) {\n        view.warn(`Blocked ${key} ${type} event listener.`);\n        return false;\n    }\n    return true;\n}\n/**\n * Create a new event stream from an event source.\n * @param {object} source - The event source to monitor.\n * @param {string} type - The event type.\n * @param {function(object): boolean} [filter] - Event filter function.\n * @return {EventStream}\n */ function events(source, type, filter) {\n    var view = this, s = new (0, _vegaDataflow.EventStream)(filter), send = function(e, item) {\n        view.runAsync(null, ()=>{\n            if (source === VIEW && prevent(view, type)) e.preventDefault();\n            s.receive(eventExtend(view, e, item));\n        });\n    }, sources;\n    if (source === TIMER) {\n        if (permit(view, \"timer\", type)) view.timer(send, type);\n    } else if (source === VIEW) {\n        if (permit(view, \"view\", type)) // send traps errors, so use {trap: false} option\n        view.addEventListener(type, send, NO_TRAP);\n    } else {\n        if (source === WINDOW) {\n            if (permit(view, \"window\", type) && typeof window !== \"undefined\") sources = [\n                window\n            ];\n        } else if (typeof document !== \"undefined\") {\n            if (permit(view, \"selector\", type)) sources = document.querySelectorAll(source);\n        }\n        if (!sources) view.warn(\"Can not resolve event source: \" + source);\n        else {\n            for(var i = 0, n = sources.length; i < n; ++i)sources[i].addEventListener(type, send);\n            trackEventListener(view, sources, type, send);\n        }\n    }\n    return s;\n}\nfunction itemFilter(event3) {\n    return event3.item;\n}\nfunction markTarget(event4) {\n    // grab upstream collector feeding the mark operator\n    return event4.item.mark.source;\n}\nfunction invoke(name) {\n    return function(_, event5) {\n        return event5.vega.view().changeset().encode(event5.item, name);\n    };\n}\nfunction hover(hoverSet, leaveSet) {\n    hoverSet = [\n        hoverSet || \"hover\"\n    ];\n    leaveSet = [\n        leaveSet || \"update\",\n        hoverSet[0]\n    ]; // invoke hover set upon mouseover\n    this.on(this.events(\"view\", \"mouseover\", itemFilter), markTarget, invoke(hoverSet)); // invoke leave set upon mouseout\n    this.on(this.events(\"view\", \"mouseout\", itemFilter), markTarget, invoke(leaveSet));\n    return this;\n}\n/**\n * Finalize a View instance that is being removed.\n * Cancel any running timers.\n * Remove all external event listeners.\n * Remove any currently displayed tooltip.\n */ function finalize() {\n    var tooltip = this._tooltip, timers = this._timers, listeners = this._eventListeners, n, m, e;\n    n = timers.length;\n    while(--n >= 0)timers[n].stop();\n    n = listeners.length;\n    while(--n >= 0){\n        e = listeners[n];\n        m = e.sources.length;\n        while(--m >= 0)e.sources[m].removeEventListener(e.type, e.handler);\n    }\n    if (tooltip) tooltip.call(this, this._handler, null, null, null);\n    return this;\n}\nfunction element(tag, attr, text) {\n    const el = document.createElement(tag);\n    for(const key in attr)el.setAttribute(key, attr[key]);\n    if (text != null) el.textContent = text;\n    return el;\n}\nconst BindClass = \"vega-bind\", NameClass = \"vega-bind-name\", RadioClass = \"vega-bind-radio\";\n/**\n * Bind a signal to an external HTML input element. The resulting two-way\n * binding will propagate input changes to signals, and propagate signal\n * changes to the input element state. If this view instance has no parent\n * element, we assume the view is headless and no bindings are created.\n * @param {Element|string} el - The parent DOM element to which the input\n *   element should be appended as a child. If string-valued, this argument\n *   will be treated as a CSS selector. If null or undefined, the parent\n *   element of this view will be used as the element.\n * @param {object} param - The binding parameters which specify the signal\n *   to bind to, the input element type, and type-specific configuration.\n * @return {View} - This view instance.\n */ function bind(view, el, binding) {\n    if (!el) return;\n    const param = binding.param;\n    let bind1 = binding.state;\n    if (!bind1) {\n        bind1 = binding.state = {\n            elements: null,\n            active: false,\n            set: null,\n            update: (value)=>{\n                if (value != view.signal(param.signal)) view.runAsync(null, ()=>{\n                    bind1.source = true;\n                    view.signal(param.signal, value);\n                });\n            }\n        };\n        if (param.debounce) bind1.update = (0, _vegaUtil.debounce)(param.debounce, bind1.update);\n    }\n    const create = param.input == null && param.element ? target : generate;\n    create(bind1, el, param, view);\n    if (!bind1.active) {\n        view.on(view._signals[param.signal], null, ()=>{\n            bind1.source ? bind1.source = false : bind1.set(view.signal(param.signal));\n        });\n        bind1.active = true;\n    }\n    return bind1;\n}\n/**\n * Bind the signal to an external EventTarget.\n */ function target(bind2, node, param, view) {\n    const type = param.event || \"input\";\n    const handler = ()=>bind2.update(node.value); // initialize signal value to external input value\n    view.signal(param.signal, node.value); // listen for changes on the element\n    node.addEventListener(type, handler); // register with view, so we can remove it upon finalization\n    trackEventListener(view, node, type, handler); // propagate change to element\n    bind2.set = (value)=>{\n        node.value = value;\n        node.dispatchEvent(event(type));\n    };\n}\nfunction event(type) {\n    return typeof Event !== \"undefined\" ? new Event(type) : {\n        type\n    };\n}\n/**\n * Generate an HTML input form element and bind it to a signal.\n */ function generate(bind3, el, param, view) {\n    const value = view.signal(param.signal);\n    const div = element(\"div\", {\n        \"class\": BindClass\n    });\n    const wrapper = param.input === \"radio\" ? div : div.appendChild(element(\"label\"));\n    wrapper.appendChild(element(\"span\", {\n        \"class\": NameClass\n    }, param.name || param.signal));\n    el.appendChild(div);\n    let input = form;\n    switch(param.input){\n        case \"checkbox\":\n            input = checkbox;\n            break;\n        case \"select\":\n            input = select;\n            break;\n        case \"radio\":\n            input = radio;\n            break;\n        case \"range\":\n            input = range;\n            break;\n    }\n    input(bind3, wrapper, param, value);\n}\n/**\n * Generates an arbitrary input form element.\n * The input type is controlled via user-provided parameters.\n */ function form(bind4, el, param, value1) {\n    const node = element(\"input\");\n    for(const key in param)if (key !== \"signal\" && key !== \"element\") node.setAttribute(key === \"input\" ? \"type\" : key, param[key]);\n    node.setAttribute(\"name\", param.signal);\n    node.value = value1;\n    el.appendChild(node);\n    node.addEventListener(\"input\", ()=>bind4.update(node.value));\n    bind4.elements = [\n        node\n    ];\n    bind4.set = (value)=>node.value = value;\n}\n/**\n * Generates a checkbox input element.\n */ function checkbox(bind5, el, param, value2) {\n    const attr = {\n        type: \"checkbox\",\n        name: param.signal\n    };\n    if (value2) attr.checked = true;\n    const node = element(\"input\", attr);\n    el.appendChild(node);\n    node.addEventListener(\"change\", ()=>bind5.update(node.checked));\n    bind5.elements = [\n        node\n    ];\n    bind5.set = (value)=>node.checked = !!value || null;\n}\n/**\n * Generates a selection list input element.\n */ function select(bind6, el, param, value3) {\n    const node = element(\"select\", {\n        name: param.signal\n    }), labels = param.labels || [];\n    param.options.forEach((option, i)=>{\n        const attr = {\n            value: option\n        };\n        if (valuesEqual(option, value3)) attr.selected = true;\n        node.appendChild(element(\"option\", attr, (labels[i] || option) + \"\"));\n    });\n    el.appendChild(node);\n    node.addEventListener(\"change\", ()=>{\n        bind6.update(param.options[node.selectedIndex]);\n    });\n    bind6.elements = [\n        node\n    ];\n    bind6.set = (value)=>{\n        for(let i = 0, n = param.options.length; i < n; ++i)if (valuesEqual(param.options[i], value)) {\n            node.selectedIndex = i;\n            return;\n        }\n    };\n}\n/**\n * Generates a radio button group.\n */ function radio(bind7, el, param, value4) {\n    const group = element(\"span\", {\n        \"class\": RadioClass\n    }), labels = param.labels || [];\n    el.appendChild(group);\n    bind7.elements = param.options.map((option, i)=>{\n        const attr = {\n            type: \"radio\",\n            name: param.signal,\n            value: option\n        };\n        if (valuesEqual(option, value4)) attr.checked = true;\n        const input = element(\"input\", attr);\n        input.addEventListener(\"change\", ()=>bind7.update(option));\n        const label = element(\"label\", {}, (labels[i] || option) + \"\");\n        label.prepend(input);\n        group.appendChild(label);\n        return input;\n    });\n    bind7.set = (value)=>{\n        const nodes = bind7.elements, n = nodes.length;\n        for(let i = 0; i < n; ++i)if (valuesEqual(nodes[i].value, value)) nodes[i].checked = true;\n    };\n}\n/**\n * Generates a slider input element.\n */ function range(bind8, el, param, value5) {\n    value5 = value5 !== undefined ? value5 : (+param.max + +param.min) / 2;\n    const max = param.max != null ? param.max : Math.max(100, +value5) || 100, min = param.min || Math.min(0, max, +value5) || 0, step = param.step || (0, _d3Array.tickStep)(min, max, 100);\n    const node = element(\"input\", {\n        type: \"range\",\n        name: param.signal,\n        min: min,\n        max: max,\n        step: step\n    });\n    node.value = value5;\n    const span = element(\"span\", {}, +value5);\n    el.appendChild(node);\n    el.appendChild(span);\n    const update = ()=>{\n        span.textContent = node.value;\n        bind8.update(+node.value);\n    }; // subscribe to both input and change\n    node.addEventListener(\"input\", update);\n    node.addEventListener(\"change\", update);\n    bind8.elements = [\n        node\n    ];\n    bind8.set = (value)=>{\n        node.value = value;\n        span.textContent = value;\n    };\n}\nfunction valuesEqual(a, b) {\n    return a === b || a + \"\" === b + \"\";\n}\nfunction initializeRenderer(view, r, el, constructor, scaleFactor, opt) {\n    r = r || new constructor(view.loader());\n    return r.initialize(el, width(view), height(view), offset(view), scaleFactor, opt).background(view.background());\n}\nfunction trap(view, fn) {\n    return !fn ? null : function() {\n        try {\n            fn.apply(this, arguments);\n        } catch (error) {\n            view.error(error);\n        }\n    };\n}\nfunction initializeHandler(view, prevHandler, el, constructor) {\n    // instantiate scenegraph handler\n    const handler = new constructor(view.loader(), trap(view, view.tooltip())).scene(view.scenegraph().root).initialize(el, offset(view), view); // transfer event handlers\n    if (prevHandler) prevHandler.handlers().forEach((h)=>{\n        handler.on(h.type, h.handler);\n    });\n    return handler;\n}\nfunction initialize(el, elBind) {\n    const view = this, type = view._renderType, config = view._eventConfig.bind, module = (0, _vegaScenegraph.renderModule)(type); // containing dom element\n    el = view._el = el ? lookup(view, el, true) : null; // initialize aria attributes\n    initializeAria(view); // select appropriate renderer & handler\n    if (!module) view.error(\"Unrecognized renderer type: \" + type);\n    const Handler = module.handler || (0, _vegaScenegraph.CanvasHandler), Renderer = el ? module.renderer : module.headless; // initialize renderer and input handler\n    view._renderer = !Renderer ? null : initializeRenderer(view, view._renderer, el, Renderer);\n    view._handler = initializeHandler(view, view._handler, el, Handler);\n    view._redraw = true; // initialize signal bindings\n    if (el && config !== \"none\") {\n        elBind = elBind ? view._elBind = lookup(view, elBind, true) : el.appendChild(element(\"form\", {\n            \"class\": \"vega-bindings\"\n        }));\n        view._bind.forEach((_)=>{\n            if (_.param.element && config !== \"container\") _.element = lookup(view, _.param.element, !!_.param.input);\n        });\n        view._bind.forEach((_)=>{\n            bind(view, _.element || elBind, _);\n        });\n    }\n    return view;\n}\nfunction lookup(view, el, clear) {\n    if (typeof el === \"string\") {\n        if (typeof document !== \"undefined\") {\n            el = document.querySelector(el);\n            if (!el) {\n                view.error(\"Signal bind element not found: \" + el);\n                return null;\n            }\n        } else {\n            view.error(\"DOM document instance not found.\");\n            return null;\n        }\n    }\n    if (el && clear) try {\n        el.innerHTML = \"\";\n    } catch (e) {\n        el = null;\n        view.error(e);\n    }\n    return el;\n}\nconst number = (_)=>+_ || 0;\nconst paddingObject = (_)=>({\n        top: _,\n        bottom: _,\n        left: _,\n        right: _\n    });\nfunction padding(_) {\n    return (0, _vegaUtil.isObject)(_) ? {\n        top: number(_.top),\n        bottom: number(_.bottom),\n        left: number(_.left),\n        right: number(_.right)\n    } : paddingObject(number(_));\n}\n/**\n * Render the current scene in a headless fashion.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A Promise that resolves to a renderer.\n */ async function renderHeadless(view, type, scaleFactor, opt) {\n    const module = (0, _vegaScenegraph.renderModule)(type), ctr = module && module.headless;\n    if (!ctr) (0, _vegaUtil.error)(\"Unrecognized renderer type: \" + type);\n    await view.runAsync();\n    return initializeRenderer(view, null, null, ctr, scaleFactor, opt).renderAsync(view._scenegraph.root);\n}\n/**\n * Produce an image URL for the visualization. Depending on the type\n * parameter, the generated URL contains data for either a PNG or SVG image.\n * The URL can be used (for example) to download images of the visualization.\n * This method is asynchronous, returning a Promise instance.\n * @param {string} type - The image type. One of 'svg', 'png' or 'canvas'.\n *   The 'canvas' and 'png' types are synonyms for a PNG image.\n * @return {Promise} - A promise that resolves to an image URL.\n */ async function renderToImageURL(type, scaleFactor) {\n    if (type !== (0, _vegaScenegraph.RenderType).Canvas && type !== (0, _vegaScenegraph.RenderType).SVG && type !== (0, _vegaScenegraph.RenderType).PNG) (0, _vegaUtil.error)(\"Unrecognized image type: \" + type);\n    const r = await renderHeadless(this, type, scaleFactor);\n    return type === (0, _vegaScenegraph.RenderType).SVG ? toBlobURL(r.svg(), \"image/svg+xml\") : r.canvas().toDataURL(\"image/png\");\n}\nfunction toBlobURL(data2, mime) {\n    const blob = new Blob([\n        data2\n    ], {\n        type: mime\n    });\n    return window.URL.createObjectURL(blob);\n}\n/**\n * Produce a Canvas instance containing a rendered visualization.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A promise that resolves to a Canvas instance.\n */ async function renderToCanvas(scaleFactor, opt) {\n    const r = await renderHeadless(this, (0, _vegaScenegraph.RenderType).Canvas, scaleFactor, opt);\n    return r.canvas();\n}\n/**\n * Produce a rendered SVG string of the visualization.\n * This method is asynchronous, returning a Promise instance.\n * @return {Promise} - A promise that resolves to an SVG string.\n */ async function renderToSVG(scaleFactor) {\n    const r = await renderHeadless(this, (0, _vegaScenegraph.RenderType).SVG, scaleFactor);\n    return r.svg();\n}\nfunction runtime(view, spec, expr) {\n    return (0, _vegaRuntime.context)(view, (0, _vegaDataflow.transforms), (0, _vegaFunctions.functionContext), expr).parse(spec);\n}\nfunction scale(name) {\n    var scales = this._runtime.scales;\n    if (!(0, _vegaUtil.hasOwnProperty)(scales, name)) (0, _vegaUtil.error)(\"Unrecognized scale or projection: \" + name);\n    return scales[name].value;\n}\nvar Width = \"width\", Height = \"height\", Padding = \"padding\", Skip = {\n    skip: true\n};\nfunction viewWidth(view, width1) {\n    var a = view.autosize(), p = view.padding();\n    return width1 - (a && a.contains === Padding ? p.left + p.right : 0);\n}\nfunction viewHeight(view, height1) {\n    var a = view.autosize(), p = view.padding();\n    return height1 - (a && a.contains === Padding ? p.top + p.bottom : 0);\n}\nfunction initializeResize(view) {\n    var s = view._signals, w = s[Width], h = s[Height], p = s[Padding];\n    function resetSize() {\n        view._autosize = view._resize = 1;\n    } // respond to width signal\n    view._resizeWidth = view.add(null, (_)=>{\n        view._width = _.size;\n        view._viewWidth = viewWidth(view, _.size);\n        resetSize();\n    }, {\n        size: w\n    }); // respond to height signal\n    view._resizeHeight = view.add(null, (_)=>{\n        view._height = _.size;\n        view._viewHeight = viewHeight(view, _.size);\n        resetSize();\n    }, {\n        size: h\n    }); // respond to padding signal\n    const resizePadding = view.add(null, resetSize, {\n        pad: p\n    }); // set rank to run immediately after source signal\n    view._resizeWidth.rank = w.rank + 1;\n    view._resizeHeight.rank = h.rank + 1;\n    resizePadding.rank = p.rank + 1;\n}\nfunction resizeView(viewWidth1, viewHeight1, width2, height2, origin, auto) {\n    this.runAfter((view)=>{\n        let rerun = 0; // reset autosize flag\n        view._autosize = 0; // width value changed: update signal, skip resize op\n        if (view.width() !== width2) {\n            rerun = 1;\n            view.signal(Width, width2, Skip); // set width, skip update calc\n            view._resizeWidth.skip(true); // skip width resize handler\n        } // height value changed: update signal, skip resize op\n        if (view.height() !== height2) {\n            rerun = 1;\n            view.signal(Height, height2, Skip); // set height, skip update calc\n            view._resizeHeight.skip(true); // skip height resize handler\n        } // view width changed: update view property, set resize flag\n        if (view._viewWidth !== viewWidth1) {\n            view._resize = 1;\n            view._viewWidth = viewWidth1;\n        } // view height changed: update view property, set resize flag\n        if (view._viewHeight !== viewHeight1) {\n            view._resize = 1;\n            view._viewHeight = viewHeight1;\n        } // origin changed: update view property, set resize flag\n        if (view._origin[0] !== origin[0] || view._origin[1] !== origin[1]) {\n            view._resize = 1;\n            view._origin = origin;\n        } // run dataflow on width/height signal change\n        if (rerun) view.run(\"enter\");\n        if (auto) view.runAfter((v)=>v.resize());\n    }, false, 1);\n}\n/**\n * Get the current view state, consisting of signal values and/or data sets.\n * @param {object} [options] - Options flags indicating which state to export.\n *   If unspecified, all signals and data sets will be exported.\n * @param {function(string, Operator):boolean} [options.signals] - Optional\n *   predicate function for testing if a signal should be included in the\n *   exported state. If unspecified, all signals will be included, except for\n *   those named 'parent' or those which refer to a Transform value.\n * @param {function(string, object):boolean} [options.data] - Optional\n *   predicate function for testing if a data set's input should be included\n *   in the exported state. If unspecified, all data sets that have been\n *   explicitly modified will be included.\n * @param {boolean} [options.recurse=true] - Flag indicating if the exported\n *   state should recursively include state from group mark sub-contexts.\n * @return {object} - An object containing the exported state values.\n */ function getState(options) {\n    return this._runtime.getState(options || {\n        data: dataTest,\n        signals: signalTest,\n        recurse: true\n    });\n}\nfunction dataTest(name, data3) {\n    return data3.modified && (0, _vegaUtil.isArray)(data3.input.value) && name.indexOf(\"_:vega:_\");\n}\nfunction signalTest(name, op) {\n    return !(name === \"parent\" || op instanceof (0, _vegaDataflow.transforms).proxy);\n}\n/**\n * Sets the current view state and updates the view by invoking run.\n * @param {object} state - A state object containing signal and/or\n *   data set values, following the format used by the getState method.\n * @return {View} - This view instance.\n */ function setState(state) {\n    this.runAsync(null, (v)=>{\n        v._trigger = false;\n        v._runtime.setState(state);\n    }, (v)=>{\n        v._trigger = true;\n    });\n    return this;\n}\nfunction timer(callback, delay) {\n    function tick(elapsed) {\n        callback({\n            timestamp: Date.now(),\n            elapsed: elapsed\n        });\n    }\n    this._timers.push((0, _d3Timer.interval)(tick, delay));\n}\nfunction defaultTooltip(handler, event, item, value) {\n    const el = handler.element();\n    if (el) el.setAttribute(\"title\", formatTooltip(value));\n}\nfunction formatTooltip(value) {\n    return value == null ? \"\" : (0, _vegaUtil.isArray)(value) ? formatArray(value) : (0, _vegaUtil.isObject)(value) && !(0, _vegaUtil.isDate)(value) ? formatObject(value) : value + \"\";\n}\nfunction formatObject(obj) {\n    return Object.keys(obj).map((key)=>{\n        const v = obj[key];\n        return key + \": \" + ((0, _vegaUtil.isArray)(v) ? formatArray(v) : formatValue(v));\n    }).join(\"\\n\");\n}\nfunction formatArray(value) {\n    return \"[\" + value.map(formatValue).join(\", \") + \"]\";\n}\nfunction formatValue(value) {\n    return (0, _vegaUtil.isArray)(value) ? \"[\\u2026]\" : (0, _vegaUtil.isObject)(value) && !(0, _vegaUtil.isDate)(value) ? \"{\\u2026}\" : value;\n}\n/**\n * Create a new View instance from a Vega dataflow runtime specification.\n * The generated View will not immediately be ready for display. Callers\n * should also invoke the initialize method (e.g., to set the parent\n * DOM element in browser-based deployment) and then invoke the run\n * method to evaluate the dataflow graph. Rendering will automatically\n * be performed upon dataflow runs.\n * @constructor\n * @param {object} spec - The Vega dataflow runtime specification.\n */ function View(spec, options) {\n    const view = this;\n    options = options || {};\n    (0, _vegaDataflow.Dataflow).call(view);\n    if (options.loader) view.loader(options.loader);\n    if (options.logger) view.logger(options.logger);\n    if (options.logLevel != null) view.logLevel(options.logLevel);\n    if (options.locale || spec.locale) {\n        const loc = (0, _vegaUtil.extend)({}, spec.locale, options.locale);\n        view.locale((0, _vegaFormat.locale)(loc.number, loc.time));\n    }\n    view._el = null;\n    view._elBind = null;\n    view._renderType = options.renderer || (0, _vegaScenegraph.RenderType).Canvas;\n    view._scenegraph = new (0, _vegaScenegraph.Scenegraph)();\n    const root = view._scenegraph.root; // initialize renderer, handler and event management\n    view._renderer = null;\n    view._tooltip = options.tooltip || defaultTooltip, view._redraw = true;\n    view._handler = new (0, _vegaScenegraph.CanvasHandler)().scene(root);\n    view._globalCursor = false;\n    view._preventDefault = false;\n    view._timers = [];\n    view._eventListeners = [];\n    view._resizeListeners = []; // initialize event configuration\n    view._eventConfig = initializeEventConfig(spec.eventConfig);\n    view.globalCursor(view._eventConfig.globalCursor); // initialize dataflow graph\n    const ctx = runtime(view, spec, options.expr);\n    view._runtime = ctx;\n    view._signals = ctx.signals;\n    view._bind = (spec.bindings || []).map((_)=>({\n            state: null,\n            param: (0, _vegaUtil.extend)({}, _)\n        })); // initialize scenegraph\n    if (ctx.root) ctx.root.set(root);\n    root.source = ctx.data.root.input;\n    view.pulse(ctx.data.root.input, view.changeset().insert(root.items)); // initialize view size\n    view._width = view.width();\n    view._height = view.height();\n    view._viewWidth = viewWidth(view, view._width);\n    view._viewHeight = viewHeight(view, view._height);\n    view._origin = [\n        0,\n        0\n    ];\n    view._resize = 0;\n    view._autosize = 1;\n    initializeResize(view); // initialize background color\n    background(view); // initialize cursor\n    cursor(view); // initialize view description\n    view.description(spec.description); // initialize hover proessing, if requested\n    if (options.hover) view.hover(); // initialize DOM container(s) and renderer\n    if (options.container) view.initialize(options.container, options.bind);\n}\nfunction lookupSignal(view, name) {\n    return (0, _vegaUtil.hasOwnProperty)(view._signals, name) ? view._signals[name] : (0, _vegaUtil.error)(\"Unrecognized signal name: \" + (0, _vegaUtil.stringValue)(name));\n}\nfunction findOperatorHandler(op1, handler) {\n    const h = (op1._targets || []).filter((op)=>op._update && op._update.handler === handler);\n    return h.length ? h[0] : null;\n}\nfunction addOperatorListener(view, name, op, handler) {\n    let h = findOperatorHandler(op, handler);\n    if (!h) {\n        h = trap(view, ()=>handler(name, op.value));\n        h.handler = handler;\n        view.on(op, null, h);\n    }\n    return view;\n}\nfunction removeOperatorListener(view, op, handler) {\n    const h = findOperatorHandler(op, handler);\n    if (h) op._targets.remove(h);\n    return view;\n}\n(0, _vegaUtil.inherits)(View, (0, _vegaDataflow.Dataflow), {\n    // -- DATAFLOW / RENDERING ----\n    async evaluate (encode, prerun, postrun) {\n        // evaluate dataflow and prerun\n        await (0, _vegaDataflow.Dataflow).prototype.evaluate.call(this, encode, prerun); // render as needed\n        if (this._redraw || this._resize) try {\n            if (this._renderer) {\n                if (this._resize) {\n                    this._resize = 0;\n                    resizeRenderer(this);\n                }\n                await this._renderer.renderAsync(this._scenegraph.root);\n            }\n            this._redraw = false;\n        } catch (e) {\n            this.error(e);\n        }\n         // evaluate postrun\n        if (postrun) (0, _vegaDataflow.asyncCallback)(this, postrun);\n        return this;\n    },\n    dirty (item) {\n        this._redraw = true;\n        this._renderer && this._renderer.dirty(item);\n    },\n    // -- GET / SET ----\n    description (text) {\n        if (arguments.length) {\n            const desc = text != null ? text + \"\" : null;\n            if (desc !== this._desc) ariaLabel(this._el, this._desc = desc);\n            return this;\n        }\n        return this._desc;\n    },\n    container () {\n        return this._el;\n    },\n    scenegraph () {\n        return this._scenegraph;\n    },\n    origin () {\n        return this._origin.slice();\n    },\n    signal (name, value, options) {\n        const op = lookupSignal(this, name);\n        return arguments.length === 1 ? op.value : this.update(op, value, options);\n    },\n    width (_) {\n        return arguments.length ? this.signal(\"width\", _) : this.signal(\"width\");\n    },\n    height (_) {\n        return arguments.length ? this.signal(\"height\", _) : this.signal(\"height\");\n    },\n    padding (_) {\n        return arguments.length ? this.signal(\"padding\", padding(_)) : padding(this.signal(\"padding\"));\n    },\n    autosize (_) {\n        return arguments.length ? this.signal(\"autosize\", _) : this.signal(\"autosize\");\n    },\n    background (_) {\n        return arguments.length ? this.signal(\"background\", _) : this.signal(\"background\");\n    },\n    renderer (type) {\n        if (!arguments.length) return this._renderType;\n        if (!(0, _vegaScenegraph.renderModule)(type)) (0, _vegaUtil.error)(\"Unrecognized renderer type: \" + type);\n        if (type !== this._renderType) {\n            this._renderType = type;\n            this._resetRenderer();\n        }\n        return this;\n    },\n    tooltip (handler) {\n        if (!arguments.length) return this._tooltip;\n        if (handler !== this._tooltip) {\n            this._tooltip = handler;\n            this._resetRenderer();\n        }\n        return this;\n    },\n    loader (loader) {\n        if (!arguments.length) return this._loader;\n        if (loader !== this._loader) {\n            (0, _vegaDataflow.Dataflow).prototype.loader.call(this, loader);\n            this._resetRenderer();\n        }\n        return this;\n    },\n    resize () {\n        // set flag to perform autosize\n        this._autosize = 1; // touch autosize signal to ensure top-level ViewLayout runs\n        return this.touch(lookupSignal(this, \"autosize\"));\n    },\n    _resetRenderer () {\n        if (this._renderer) {\n            this._renderer = null;\n            this.initialize(this._el, this._elBind);\n        }\n    },\n    // -- SIZING ----\n    _resizeView: resizeView,\n    // -- EVENT HANDLING ----\n    addEventListener (type, handler, options) {\n        let callback = handler;\n        if (!(options && options.trap === false)) {\n            // wrap callback in error handler\n            callback = trap(this, handler);\n            callback.raw = handler;\n        }\n        this._handler.on(type, callback);\n        return this;\n    },\n    removeEventListener (type, handler) {\n        var handlers = this._handler.handlers(type), i = handlers.length, h, t; // search registered handlers, remove if match found\n        while(--i >= 0){\n            t = handlers[i].type;\n            h = handlers[i].handler;\n            if (type === t && (handler === h || handler === h.raw)) {\n                this._handler.off(t, h);\n                break;\n            }\n        }\n        return this;\n    },\n    addResizeListener (handler) {\n        const l = this._resizeListeners;\n        if (l.indexOf(handler) < 0) // add handler if it isn't already registered\n        // note: error trapping handled elsewhere, so\n        // no need to wrap handlers here\n        l.push(handler);\n        return this;\n    },\n    removeResizeListener (handler) {\n        var l = this._resizeListeners, i = l.indexOf(handler);\n        if (i >= 0) l.splice(i, 1);\n        return this;\n    },\n    addSignalListener (name, handler) {\n        return addOperatorListener(this, name, lookupSignal(this, name), handler);\n    },\n    removeSignalListener (name, handler) {\n        return removeOperatorListener(this, lookupSignal(this, name), handler);\n    },\n    addDataListener (name, handler) {\n        return addOperatorListener(this, name, dataref(this, name).values, handler);\n    },\n    removeDataListener (name, handler) {\n        return removeOperatorListener(this, dataref(this, name).values, handler);\n    },\n    globalCursor (_) {\n        if (arguments.length) {\n            if (this._globalCursor !== !!_) {\n                const prev = setCursor(this, null); // clear previous cursor\n                this._globalCursor = !!_;\n                if (prev) setCursor(this, prev); // swap cursor\n            }\n            return this;\n        } else return this._globalCursor;\n    },\n    preventDefault (_) {\n        if (arguments.length) {\n            this._preventDefault = _;\n            return this;\n        } else return this._preventDefault;\n    },\n    timer,\n    events,\n    finalize,\n    hover,\n    // -- DATA ----\n    data,\n    change,\n    insert,\n    remove,\n    // -- SCALES --\n    scale,\n    // -- INITIALIZATION ----\n    initialize,\n    // -- HEADLESS RENDERING ----\n    toImageURL: renderToImageURL,\n    toCanvas: renderToCanvas,\n    toSVG: renderToSVG,\n    // -- SAVE / RESTORE STATE ----\n    getState,\n    setState\n});\n\n},{\"vega-util\":\"bApja\",\"vega-dataflow\":\"3NitK\",\"vega-scenegraph\":\"jattk\",\"d3-array\":\"6IwJG\",\"vega-functions\":\"iuqsd\",\"vega-runtime\":\"k7ppL\",\"d3-timer\":\"d15bJ\",\"vega-format\":\"47kOt\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iuqsd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataPrefix\", ()=>DataPrefix);\nparcelHelpers.export(exports, \"IndexPrefix\", ()=>IndexPrefix);\nparcelHelpers.export(exports, \"ScalePrefix\", ()=>ScalePrefix);\nparcelHelpers.export(exports, \"SignalPrefix\", ()=>SignalPrefix);\nparcelHelpers.export(exports, \"bandspace\", ()=>bandspace);\nparcelHelpers.export(exports, \"bandwidth\", ()=>bandwidth);\nparcelHelpers.export(exports, \"codeGenerator\", ()=>codeGenerator);\nparcelHelpers.export(exports, \"codegenParams\", ()=>codegenParams);\nparcelHelpers.export(exports, \"containerSize\", ()=>containerSize);\nparcelHelpers.export(exports, \"contrast\", ()=>contrast);\nparcelHelpers.export(exports, \"copy\", ()=>copy);\nparcelHelpers.export(exports, \"data\", ()=>data);\nparcelHelpers.export(exports, \"dataVisitor\", ()=>dataVisitor);\nparcelHelpers.export(exports, \"dayAbbrevFormat\", ()=>dayAbbrevFormat);\nparcelHelpers.export(exports, \"dayFormat\", ()=>dayFormat);\nparcelHelpers.export(exports, \"debug\", ()=>debug);\nparcelHelpers.export(exports, \"domain\", ()=>domain);\nparcelHelpers.export(exports, \"encode\", ()=>encode);\nparcelHelpers.export(exports, \"expressionFunction\", ()=>expressionFunction);\nparcelHelpers.export(exports, \"format\", ()=>format);\nparcelHelpers.export(exports, \"functionContext\", ()=>functionContext);\nparcelHelpers.export(exports, \"geoArea\", ()=>geoArea);\nparcelHelpers.export(exports, \"geoBounds\", ()=>geoBounds);\nparcelHelpers.export(exports, \"geoCentroid\", ()=>geoCentroid);\nparcelHelpers.export(exports, \"geoShape\", ()=>geoShape);\nparcelHelpers.export(exports, \"inScope\", ()=>inScope);\nparcelHelpers.export(exports, \"indata\", ()=>indata);\nparcelHelpers.export(exports, \"indataVisitor\", ()=>indataVisitor);\nparcelHelpers.export(exports, \"indexof\", ()=>indexof);\nparcelHelpers.export(exports, \"info\", ()=>info);\nparcelHelpers.export(exports, \"invert\", ()=>invert);\nparcelHelpers.export(exports, \"join\", ()=>join);\nparcelHelpers.export(exports, \"lastindexof\", ()=>lastindexof);\nparcelHelpers.export(exports, \"luminance\", ()=>luminance);\nparcelHelpers.export(exports, \"merge\", ()=>merge);\nparcelHelpers.export(exports, \"modify\", ()=>modify);\nparcelHelpers.export(exports, \"monthAbbrevFormat\", ()=>monthAbbrevFormat);\nparcelHelpers.export(exports, \"monthFormat\", ()=>monthFormat);\nparcelHelpers.export(exports, \"parseExpression\", ()=>parser);\nparcelHelpers.export(exports, \"pathShape\", ()=>pathShape);\nparcelHelpers.export(exports, \"pinchAngle\", ()=>pinchAngle);\nparcelHelpers.export(exports, \"pinchDistance\", ()=>pinchDistance);\nparcelHelpers.export(exports, \"pluck\", ()=>pluck);\nparcelHelpers.export(exports, \"range\", ()=>range);\nparcelHelpers.export(exports, \"replace\", ()=>replace);\nparcelHelpers.export(exports, \"reverse\", ()=>reverse);\nparcelHelpers.export(exports, \"scale\", ()=>scale);\nparcelHelpers.export(exports, \"scaleGradient\", ()=>scaleGradient);\nparcelHelpers.export(exports, \"scaleVisitor\", ()=>scaleVisitor);\nparcelHelpers.export(exports, \"screen\", ()=>screen);\nparcelHelpers.export(exports, \"setdata\", ()=>setdata);\nparcelHelpers.export(exports, \"slice\", ()=>slice);\nparcelHelpers.export(exports, \"timeFormat\", ()=>timeFormat);\nparcelHelpers.export(exports, \"timeParse\", ()=>timeParse);\nparcelHelpers.export(exports, \"treeAncestors\", ()=>treeAncestors);\nparcelHelpers.export(exports, \"treePath\", ()=>treePath);\nparcelHelpers.export(exports, \"utcFormat\", ()=>utcFormat);\nparcelHelpers.export(exports, \"utcParse\", ()=>utcParse);\nparcelHelpers.export(exports, \"warn\", ()=>warn);\nparcelHelpers.export(exports, \"windowSize\", ()=>windowSize);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaExpression = require(\"vega-expression\");\nvar _d3Geo = require(\"d3-geo\");\nvar _d3Color = require(\"d3-color\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaScenegraph = require(\"vega-scenegraph\");\nvar _vegaSelections = require(\"vega-selections\");\nvar _vegaStatistics = require(\"vega-statistics\");\nvar _vegaTime = require(\"vega-time\");\nvar _d3Array = require(\"d3-array\");\nfunction data(name) {\n    const data1 = this.context.data[name];\n    return data1 ? data1.values.value : [];\n}\nfunction indata(name, field, value) {\n    const index = this.context.data[name][\"index:\" + field], entry = index ? index.value.get(value) : undefined;\n    return entry ? entry.count : entry;\n}\nfunction setdata(name, tuples) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input;\n    df.pulse(input, df.changeset().remove((0, _vegaUtil.truthy)).insert(tuples));\n    return 1;\n}\nfunction encode(item, name, retval) {\n    if (item) {\n        const df = this.context.dataflow, target = item.mark.source;\n        df.pulse(target, df.changeset().encode(item, name));\n    }\n    return retval !== undefined ? retval : item;\n}\nconst wrap = (method)=>function(value, spec) {\n        const locale = this.context.dataflow.locale();\n        return locale[method](spec)(value);\n    };\nconst format = wrap(\"format\");\nconst timeFormat = wrap(\"timeFormat\");\nconst utcFormat = wrap(\"utcFormat\");\nconst timeParse = wrap(\"timeParse\");\nconst utcParse = wrap(\"utcParse\");\nconst dateObj = new Date(2000, 0, 1);\nfunction time(month, day, specifier) {\n    if (!Number.isInteger(month) || !Number.isInteger(day)) return \"\";\n    dateObj.setYear(2000);\n    dateObj.setMonth(month);\n    dateObj.setDate(day);\n    return timeFormat.call(this, dateObj, specifier);\n}\nfunction monthFormat(month) {\n    return time.call(this, month, 1, \"%B\");\n}\nfunction monthAbbrevFormat(month) {\n    return time.call(this, month, 1, \"%b\");\n}\nfunction dayFormat(day) {\n    return time.call(this, 0, 2 + day, \"%A\");\n}\nfunction dayAbbrevFormat(day) {\n    return time.call(this, 0, 2 + day, \"%a\");\n}\nconst DataPrefix = \":\";\nconst IndexPrefix = \"@\";\nconst ScalePrefix = \"%\";\nconst SignalPrefix = \"$\";\nfunction dataVisitor(name, args, scope, params) {\n    if (args[0].type !== (0, _vegaExpression.Literal)) (0, _vegaUtil.error)(\"First argument to data functions must be a string literal.\");\n    const data3 = args[0].value, dataName = DataPrefix + data3;\n    if (!(0, _vegaUtil.hasOwnProperty)(dataName, params)) try {\n        params[dataName] = scope.getData(data3).tuplesRef();\n    } catch (err) {}\n}\nfunction indataVisitor(name, args, scope, params) {\n    if (args[0].type !== (0, _vegaExpression.Literal)) (0, _vegaUtil.error)(\"First argument to indata must be a string literal.\");\n    if (args[1].type !== (0, _vegaExpression.Literal)) (0, _vegaUtil.error)(\"Second argument to indata must be a string literal.\");\n    const data4 = args[0].value, field = args[1].value, indexName = IndexPrefix + field;\n    if (!(0, _vegaUtil.hasOwnProperty)(indexName, params)) params[indexName] = scope.getData(data4).indataRef(scope, field);\n}\nfunction scaleVisitor(name, args, scope, params) {\n    if (args[0].type === (0, _vegaExpression.Literal)) // add scale dependency\n    addScaleDependency(scope, params, args[0].value);\n    else // indirect scale lookup; add all scales as parameters\n    for(name in scope.scales)addScaleDependency(scope, params, name);\n}\nfunction addScaleDependency(scope, params, name) {\n    const scaleName = ScalePrefix + name;\n    if (!(0, _vegaUtil.hasOwnProperty)(params, scaleName)) try {\n        params[scaleName] = scope.scaleRef(name);\n    } catch (err) {}\n}\nfunction getScale(name, ctx) {\n    let s;\n    return (0, _vegaUtil.isFunction)(name) ? name : (0, _vegaUtil.isString)(name) ? (s = ctx.scales[name]) && s.value : undefined;\n}\nfunction internalScaleFunctions(codegen, fnctx, visitors) {\n    // add helper method to the 'this' expression function context\n    fnctx.__bandwidth = (s)=>s && s.bandwidth ? s.bandwidth() : 0; // register AST visitors for internal scale functions\n    visitors._bandwidth = scaleVisitor;\n    visitors._range = scaleVisitor;\n    visitors._scale = scaleVisitor; // resolve scale reference directly to the signal hash argument\n    const ref = (arg)=>\"_[\" + (arg.type === (0, _vegaExpression.Literal) ? (0, _vegaUtil.stringValue)(ScalePrefix + arg.value) : (0, _vegaUtil.stringValue)(ScalePrefix) + \"+\" + codegen(arg)) + \"]\"; // define and return internal scale function code generators\n    // these internal functions are called by mark encoders\n    return {\n        _bandwidth: (args)=>`this.__bandwidth(${ref(args[0])})`,\n        _range: (args)=>`${ref(args[0])}.range()`,\n        _scale: (args)=>`${ref(args[0])}(${codegen(args[1])})`\n    };\n}\nfunction geoMethod(methodName, globalMethod) {\n    return function(projection, geojson, group) {\n        if (projection) {\n            // projection defined, use it\n            const p = getScale(projection, (group || this).context);\n            return p && p.path[methodName](geojson);\n        } else // projection undefined, use global method\n        return globalMethod(geojson);\n    };\n}\nconst geoArea = geoMethod(\"area\", (0, _d3Geo.geoArea));\nconst geoBounds = geoMethod(\"bounds\", (0, _d3Geo.geoBounds));\nconst geoCentroid = geoMethod(\"centroid\", (0, _d3Geo.geoCentroid));\nfunction inScope(item) {\n    const group = this.context.group;\n    let value = false;\n    if (group) while(item){\n        if (item === group) {\n            value = true;\n            break;\n        }\n        item = item.mark.group;\n    }\n    return value;\n}\nfunction log(df, method, args) {\n    try {\n        df[method].apply(df, [\n            \"EXPRESSION\"\n        ].concat([].slice.call(args)));\n    } catch (err) {\n        df.warn(err);\n    }\n    return args[args.length - 1];\n}\nfunction warn() {\n    return log(this.context.dataflow, \"warn\", arguments);\n}\nfunction info() {\n    return log(this.context.dataflow, \"info\", arguments);\n}\nfunction debug() {\n    return log(this.context.dataflow, \"debug\", arguments);\n}\nfunction channel_luminance_value(channelValue) {\n    const val = channelValue / 255;\n    if (val <= 0.03928) return val / 12.92;\n    return Math.pow((val + 0.055) / 1.055, 2.4);\n}\nfunction luminance(color) {\n    const c = (0, _d3Color.rgb)(color), r = channel_luminance_value(c.r), g = channel_luminance_value(c.g), b = channel_luminance_value(c.b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n} // https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\nfunction contrast(color1, color2) {\n    const lum1 = luminance(color1), lum2 = luminance(color2), lumL = Math.max(lum1, lum2), lumD = Math.min(lum1, lum2);\n    return (lumL + 0.05) / (lumD + 0.05);\n}\nfunction merge() {\n    const args = [].slice.call(arguments);\n    args.unshift({});\n    return (0, _vegaUtil.extend)(...args);\n}\nfunction equal(a, b) {\n    return a === b || a !== a && b !== b ? true : (0, _vegaUtil.isArray)(a) ? (0, _vegaUtil.isArray)(b) && a.length === b.length ? equalArray(a, b) : false : (0, _vegaUtil.isObject)(a) && (0, _vegaUtil.isObject)(b) ? equalObject(a, b) : false;\n}\nfunction equalArray(a, b) {\n    for(let i = 0, n = a.length; i < n; ++i){\n        if (!equal(a[i], b[i])) return false;\n    }\n    return true;\n}\nfunction equalObject(a, b) {\n    for(const key in a){\n        if (!equal(a[key], b[key])) return false;\n    }\n    return true;\n}\nfunction removePredicate(props) {\n    return (_)=>equalObject(props, _);\n}\nfunction modify(name, insert, remove, toggle, modify1, values) {\n    const df = this.context.dataflow, data5 = this.context.data[name], input = data5.input, stamp = df.stamp();\n    let changes = data5.changes, predicate, key;\n    if (df._trigger === false || !(input.value.length || insert || toggle)) // nothing to do!\n    return 0;\n    if (!changes || changes.stamp < stamp) {\n        data5.changes = changes = df.changeset();\n        changes.stamp = stamp;\n        df.runAfter(()=>{\n            data5.modified = true;\n            df.pulse(input, changes).run();\n        }, true, 1);\n    }\n    if (remove) {\n        predicate = remove === true ? (0, _vegaUtil.truthy) : (0, _vegaUtil.isArray)(remove) || (0, _vegaDataflow.isTuple)(remove) ? remove : removePredicate(remove);\n        changes.remove(predicate);\n    }\n    if (insert) changes.insert(insert);\n    if (toggle) {\n        predicate = removePredicate(toggle);\n        if (input.value.some(predicate)) changes.remove(predicate);\n        else changes.insert(toggle);\n    }\n    if (modify1) for(key in values)changes.modify(modify1, key, values[key]);\n    return 1;\n}\nfunction pinchDistance(event) {\n    const t = event.touches, dx = t[0].clientX - t[1].clientX, dy = t[0].clientY - t[1].clientY;\n    return Math.sqrt(dx * dx + dy * dy);\n}\nfunction pinchAngle(event) {\n    const t = event.touches;\n    return Math.atan2(t[0].clientY - t[1].clientY, t[0].clientX - t[1].clientX);\n}\nconst accessors = {};\nfunction pluck(data6, name) {\n    const accessor = accessors[name] || (accessors[name] = (0, _vegaUtil.field)(name));\n    return (0, _vegaUtil.isArray)(data6) ? data6.map(accessor) : accessor(data6);\n}\nfunction array(seq) {\n    return (0, _vegaUtil.isArray)(seq) || ArrayBuffer.isView(seq) ? seq : null;\n}\nfunction sequence(seq) {\n    return array(seq) || ((0, _vegaUtil.isString)(seq) ? seq : null);\n}\nfunction join(seq, ...args) {\n    return array(seq).join(...args);\n}\nfunction indexof(seq, ...args) {\n    return sequence(seq).indexOf(...args);\n}\nfunction lastindexof(seq, ...args) {\n    return sequence(seq).lastIndexOf(...args);\n}\nfunction slice(seq, ...args) {\n    return sequence(seq).slice(...args);\n}\nfunction replace(str, pattern, repl) {\n    if ((0, _vegaUtil.isFunction)(repl)) (0, _vegaUtil.error)(\"Function argument passed to replace.\");\n    return String(str).replace(pattern, repl);\n}\nfunction reverse(seq) {\n    return array(seq).slice().reverse();\n}\nfunction bandspace(count, paddingInner, paddingOuter) {\n    return (0, _vegaScale.bandSpace)(count || 0, paddingInner || 0, paddingOuter || 0);\n}\nfunction bandwidth(name, group) {\n    const s = getScale(name, (group || this).context);\n    return s && s.bandwidth ? s.bandwidth() : 0;\n}\nfunction copy(name, group) {\n    const s = getScale(name, (group || this).context);\n    return s ? s.copy() : undefined;\n}\nfunction domain(name, group) {\n    const s = getScale(name, (group || this).context);\n    return s ? s.domain() : [];\n}\nfunction invert(name, range1, group) {\n    const s = getScale(name, (group || this).context);\n    return !s ? undefined : (0, _vegaUtil.isArray)(range1) ? (s.invertRange || s.invert)(range1) : (s.invert || s.invertExtent)(range1);\n}\nfunction range(name, group) {\n    const s = getScale(name, (group || this).context);\n    return s && s.range ? s.range() : [];\n}\nfunction scale(name, value, group) {\n    const s = getScale(name, (group || this).context);\n    return s ? s(value) : undefined;\n}\nfunction scaleGradient(scale1, p0, p1, count, group) {\n    scale1 = getScale(scale1, (group || this).context);\n    const gradient = (0, _vegaScenegraph.Gradient)(p0, p1);\n    let stops = scale1.domain(), min = stops[0], max = (0, _vegaUtil.peek)(stops), fraction = (0, _vegaUtil.identity);\n    if (!(max - min)) // expand scale if domain has zero span, fix #1479\n    scale1 = (scale1.interpolator ? (0, _vegaScale.scale)(\"sequential\")().interpolator(scale1.interpolator()) : (0, _vegaScale.scale)(\"linear\")().interpolate(scale1.interpolate()).range(scale1.range())).domain([\n        min = 0,\n        max = 1\n    ]);\n    else fraction = (0, _vegaScale.scaleFraction)(scale1, min, max);\n    if (scale1.ticks) {\n        stops = scale1.ticks(+count || 15);\n        if (min !== stops[0]) stops.unshift(min);\n        if (max !== (0, _vegaUtil.peek)(stops)) stops.push(max);\n    }\n    stops.forEach((_)=>gradient.stop(fraction(_), scale1(_)));\n    return gradient;\n}\nfunction geoShape(projection, geojson, group) {\n    const p = getScale(projection, (group || this).context);\n    return function(context) {\n        return p ? p.path.context(context)(geojson) : \"\";\n    };\n}\nfunction pathShape(path) {\n    let p = null;\n    return function(context) {\n        return context ? (0, _vegaScenegraph.pathRender)(context, p = p || (0, _vegaScenegraph.pathParse)(path)) : path;\n    };\n}\nconst datum = (d)=>d.data;\nfunction treeNodes(name, context) {\n    const tree = data.call(context, name);\n    return tree.root && tree.root.lookup || {};\n}\nfunction treePath(name, source, target) {\n    const nodes = treeNodes(name, this), s = nodes[source], t = nodes[target];\n    return s && t ? s.path(t).map(datum) : undefined;\n}\nfunction treeAncestors(name, node) {\n    const n = treeNodes(name, this)[node];\n    return n ? n.ancestors().map(datum) : undefined;\n}\nconst _window = ()=>typeof window !== \"undefined\" && window || null;\nfunction screen() {\n    const w = _window();\n    return w ? w.screen : {};\n}\nfunction windowSize() {\n    const w = _window();\n    return w ? [\n        w.innerWidth,\n        w.innerHeight\n    ] : [\n        undefined,\n        undefined\n    ];\n}\nfunction containerSize() {\n    const view = this.context.dataflow, el = view.container && view.container();\n    return el ? [\n        el.clientWidth,\n        el.clientHeight\n    ] : [\n        undefined,\n        undefined\n    ];\n}\nfunction intersect(b, opt, group) {\n    if (!b) return [];\n    const [u, v] = b, box = new (0, _vegaScenegraph.Bounds)().set(u[0], u[1], v[0], v[1]), scene = group || this.context.dataflow.scenegraph().root;\n    return (0, _vegaScenegraph.intersect)(scene, box, filter(opt));\n}\nfunction filter(opt) {\n    let p = null;\n    if (opt) {\n        const types = (0, _vegaUtil.array)(opt.marktype), names = (0, _vegaUtil.array)(opt.markname);\n        p = (_)=>(!types.length || types.some((t)=>_.marktype === t)) && (!names.length || names.some((s)=>_.name === s));\n    }\n    return p;\n}\nconst functionContext = {\n    random () {\n        return (0, _vegaStatistics.random)();\n    },\n    cumulativeNormal: // override default\n    (0, _vegaStatistics.cumulativeNormal),\n    cumulativeLogNormal: (0, _vegaStatistics.cumulativeLogNormal),\n    cumulativeUniform: (0, _vegaStatistics.cumulativeUniform),\n    densityNormal: (0, _vegaStatistics.densityNormal),\n    densityLogNormal: (0, _vegaStatistics.densityLogNormal),\n    densityUniform: (0, _vegaStatistics.densityUniform),\n    quantileNormal: (0, _vegaStatistics.quantileNormal),\n    quantileLogNormal: (0, _vegaStatistics.quantileLogNormal),\n    quantileUniform: (0, _vegaStatistics.quantileUniform),\n    sampleNormal: (0, _vegaStatistics.sampleNormal),\n    sampleLogNormal: (0, _vegaStatistics.sampleLogNormal),\n    sampleUniform: (0, _vegaStatistics.sampleUniform),\n    isArray: (0, _vegaUtil.isArray),\n    isBoolean: (0, _vegaUtil.isBoolean),\n    isDate: (0, _vegaUtil.isDate),\n    isDefined (_) {\n        return _ !== undefined;\n    },\n    isNumber: (0, _vegaUtil.isNumber),\n    isObject: (0, _vegaUtil.isObject),\n    isRegExp: (0, _vegaUtil.isRegExp),\n    isString: (0, _vegaUtil.isString),\n    isTuple: (0, _vegaDataflow.isTuple),\n    isValid (_) {\n        return _ != null && _ === _;\n    },\n    toBoolean: (0, _vegaUtil.toBoolean),\n    toDate: (0, _vegaUtil.toDate),\n    toNumber: (0, _vegaUtil.toNumber),\n    toString: (0, _vegaUtil.toString),\n    indexof,\n    join,\n    lastindexof,\n    replace,\n    reverse,\n    slice,\n    flush: (0, _vegaUtil.flush),\n    lerp: (0, _vegaUtil.lerp),\n    merge,\n    pad: (0, _vegaUtil.pad),\n    peek: (0, _vegaUtil.peek),\n    pluck,\n    span: (0, _vegaUtil.span),\n    inrange: (0, _vegaUtil.inrange),\n    truncate: (0, _vegaUtil.truncate),\n    rgb: (0, _d3Color.rgb),\n    lab: (0, _d3Color.lab),\n    hcl: (0, _d3Color.hcl),\n    hsl: (0, _d3Color.hsl),\n    luminance,\n    contrast,\n    sequence: (0, _d3Array.range),\n    format,\n    utcFormat,\n    utcParse,\n    utcOffset: (0, _vegaTime.utcOffset),\n    utcSequence: (0, _vegaTime.utcSequence),\n    timeFormat,\n    timeParse,\n    timeOffset: (0, _vegaTime.timeOffset),\n    timeSequence: (0, _vegaTime.timeSequence),\n    timeUnitSpecifier: (0, _vegaTime.timeUnitSpecifier),\n    monthFormat,\n    monthAbbrevFormat,\n    dayFormat,\n    dayAbbrevFormat,\n    quarter: (0, _vegaUtil.quarter),\n    utcquarter: (0, _vegaUtil.utcquarter),\n    week: (0, _vegaTime.week),\n    utcweek: (0, _vegaTime.utcweek),\n    dayofyear: (0, _vegaTime.dayofyear),\n    utcdayofyear: (0, _vegaTime.utcdayofyear),\n    warn,\n    info,\n    debug,\n    extent: (0, _vegaUtil.extent),\n    inScope,\n    intersect,\n    clampRange: (0, _vegaUtil.clampRange),\n    pinchDistance,\n    pinchAngle,\n    screen,\n    containerSize,\n    windowSize,\n    bandspace,\n    setdata,\n    pathShape,\n    panLinear: (0, _vegaUtil.panLinear),\n    panLog: (0, _vegaUtil.panLog),\n    panPow: (0, _vegaUtil.panPow),\n    panSymlog: (0, _vegaUtil.panSymlog),\n    zoomLinear: (0, _vegaUtil.zoomLinear),\n    zoomLog: (0, _vegaUtil.zoomLog),\n    zoomPow: (0, _vegaUtil.zoomPow),\n    zoomSymlog: (0, _vegaUtil.zoomSymlog),\n    encode,\n    modify\n};\nconst eventFunctions = [\n    \"view\",\n    \"item\",\n    \"group\",\n    \"xy\",\n    \"x\",\n    \"y\"\n], // event functions\neventPrefix = \"event.vega.\", // event function prefix\nthisPrefix = \"this.\", // function context prefix\nastVisitors = {}; // AST visitors for dependency analysis\n// export code generator parameters\nconst codegenParams = {\n    forbidden: [\n        \"_\"\n    ],\n    allowed: [\n        \"datum\",\n        \"event\",\n        \"item\"\n    ],\n    fieldvar: \"datum\",\n    globalvar: (id)=>`_[${(0, _vegaUtil.stringValue)(SignalPrefix + id)}]`,\n    functions: buildFunctions,\n    constants: (0, _vegaExpression.constants),\n    visitors: astVisitors\n}; // export code generator\nconst codeGenerator = (0, _vegaExpression.codegenExpression)(codegenParams); // Build expression function registry\nfunction buildFunctions(codegen) {\n    const fn = (0, _vegaExpression.functions)(codegen);\n    eventFunctions.forEach((name)=>fn[name] = eventPrefix + name);\n    for(const name1 in functionContext)fn[name1] = thisPrefix + name1;\n    (0, _vegaUtil.extend)(fn, internalScaleFunctions(codegen, functionContext, astVisitors));\n    return fn;\n} // Register an expression function\nfunction expressionFunction(name, fn, visitor) {\n    if (arguments.length === 1) return functionContext[name];\n     // register with the functionContext\n    functionContext[name] = fn; // if there is an astVisitor register that, too\n    if (visitor) astVisitors[name] = visitor; // if the code generator has already been initialized,\n    // we need to also register the function with it\n    if (codeGenerator) codeGenerator.functions[name] = thisPrefix + name;\n    return this;\n} // register expression functions with ast visitors\nexpressionFunction(\"bandwidth\", bandwidth, scaleVisitor);\nexpressionFunction(\"copy\", copy, scaleVisitor);\nexpressionFunction(\"domain\", domain, scaleVisitor);\nexpressionFunction(\"range\", range, scaleVisitor);\nexpressionFunction(\"invert\", invert, scaleVisitor);\nexpressionFunction(\"scale\", scale, scaleVisitor);\nexpressionFunction(\"gradient\", scaleGradient, scaleVisitor);\nexpressionFunction(\"geoArea\", geoArea, scaleVisitor);\nexpressionFunction(\"geoBounds\", geoBounds, scaleVisitor);\nexpressionFunction(\"geoCentroid\", geoCentroid, scaleVisitor);\nexpressionFunction(\"geoShape\", geoShape, scaleVisitor);\nexpressionFunction(\"indata\", indata, indataVisitor);\nexpressionFunction(\"data\", data, dataVisitor);\nexpressionFunction(\"treePath\", treePath, dataVisitor);\nexpressionFunction(\"treeAncestors\", treeAncestors, dataVisitor); // register Vega-Lite selection functions\nexpressionFunction(\"vlSelectionTest\", (0, _vegaSelections.selectionTest), (0, _vegaSelections.selectionVisitor));\nexpressionFunction(\"vlSelectionIdTest\", (0, _vegaSelections.selectionIdTest), (0, _vegaSelections.selectionVisitor));\nexpressionFunction(\"vlSelectionResolve\", (0, _vegaSelections.selectionResolve), (0, _vegaSelections.selectionVisitor));\nexpressionFunction(\"vlSelectionTuples\", (0, _vegaSelections.selectionTuples));\nfunction parser(expr, scope) {\n    const params = {}; // parse the expression to an abstract syntax tree (ast)\n    let ast;\n    try {\n        expr = (0, _vegaUtil.isString)(expr) ? expr : (0, _vegaUtil.stringValue)(expr) + \"\";\n        ast = (0, _vegaExpression.parseExpression)(expr);\n    } catch (err) {\n        (0, _vegaUtil.error)(\"Expression parse error: \" + expr);\n    } // analyze ast function calls for dependencies\n    ast.visit((node)=>{\n        if (node.type !== (0, _vegaExpression.CallExpression)) return;\n        const name = node.callee.name, visit = codegenParams.visitors[name];\n        if (visit) visit(name, node.arguments, scope, params);\n    }); // perform code generation\n    const gen = codeGenerator(ast); // collect signal dependencies\n    gen.globals.forEach((name)=>{\n        const signalName = SignalPrefix + name;\n        if (!(0, _vegaUtil.hasOwnProperty)(params, signalName) && scope.getSignal(name)) params[signalName] = scope.signalRef(name);\n    }); // return generated expression code and dependencies\n    return {\n        $expr: (0, _vegaUtil.extend)({\n            code: gen.code\n        }, scope.options.ast ? {\n            ast\n        } : null),\n        $fields: gen.fields,\n        $params: params\n    };\n}\n\n},{\"vega-util\":\"bApja\",\"vega-expression\":\"53Uxk\",\"d3-geo\":\"lY61T\",\"d3-color\":\"7SCp9\",\"vega-dataflow\":\"3NitK\",\"vega-scale\":\"bEydG\",\"vega-scenegraph\":\"jattk\",\"vega-selections\":\"674qo\",\"vega-statistics\":\"5ncfv\",\"vega-time\":\"27kpp\",\"d3-array\":\"6IwJG\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"53Uxk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ASTNode\", ()=>ASTNode);\nparcelHelpers.export(exports, \"ArrayExpression\", ()=>ArrayExpression);\nparcelHelpers.export(exports, \"BinaryExpression\", ()=>BinaryExpression);\nparcelHelpers.export(exports, \"CallExpression\", ()=>CallExpression);\nparcelHelpers.export(exports, \"ConditionalExpression\", ()=>ConditionalExpression);\nparcelHelpers.export(exports, \"Identifier\", ()=>Identifier);\nparcelHelpers.export(exports, \"Literal\", ()=>Literal);\nparcelHelpers.export(exports, \"LogicalExpression\", ()=>LogicalExpression);\nparcelHelpers.export(exports, \"MemberExpression\", ()=>MemberExpression);\nparcelHelpers.export(exports, \"ObjectExpression\", ()=>ObjectExpression);\nparcelHelpers.export(exports, \"Property\", ()=>Property);\nparcelHelpers.export(exports, \"RawCode\", ()=>RawCode);\nparcelHelpers.export(exports, \"UnaryExpression\", ()=>UnaryExpression);\nparcelHelpers.export(exports, \"codegenExpression\", ()=>codegen);\nparcelHelpers.export(exports, \"constants\", ()=>Constants);\nparcelHelpers.export(exports, \"functions\", ()=>Functions);\nparcelHelpers.export(exports, \"parseExpression\", ()=>parser);\nvar _vegaUtil = require(\"vega-util\");\nconst RawCode = \"RawCode\";\nconst Literal = \"Literal\";\nconst Property = \"Property\";\nconst Identifier = \"Identifier\";\nconst ArrayExpression = \"ArrayExpression\";\nconst BinaryExpression = \"BinaryExpression\";\nconst CallExpression = \"CallExpression\";\nconst ConditionalExpression = \"ConditionalExpression\";\nconst LogicalExpression = \"LogicalExpression\";\nconst MemberExpression = \"MemberExpression\";\nconst ObjectExpression = \"ObjectExpression\";\nconst UnaryExpression = \"UnaryExpression\";\nfunction ASTNode(type) {\n    this.type = type;\n}\nASTNode.prototype.visit = function(visitor) {\n    let c, i, n;\n    if (visitor(this)) return 1;\n    for(c = children(this), i = 0, n = c.length; i < n; ++i){\n        if (c[i].visit(visitor)) return 1;\n    }\n};\nfunction children(node) {\n    switch(node.type){\n        case ArrayExpression:\n            return node.elements;\n        case BinaryExpression:\n        case LogicalExpression:\n            return [\n                node.left,\n                node.right\n            ];\n        case CallExpression:\n            return [\n                node.callee\n            ].concat(node.arguments);\n        case ConditionalExpression:\n            return [\n                node.test,\n                node.consequent,\n                node.alternate\n            ];\n        case MemberExpression:\n            return [\n                node.object,\n                node.property\n            ];\n        case ObjectExpression:\n            return node.properties;\n        case Property:\n            return [\n                node.key,\n                node.value\n            ];\n        case UnaryExpression:\n            return [\n                node.argument\n            ];\n        case Identifier:\n        case Literal:\n        case RawCode:\n        default:\n            return [];\n    }\n}\n/*\n  The following expression parser is based on Esprima (http://esprima.org/).\n  Original header comment and license for Esprima is included here:\n\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/ var TokenName, source, index, length, lookahead;\nvar TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\nTokenName = {};\nTokenName[TokenBooleanLiteral] = \"Boolean\";\nTokenName[TokenEOF] = \"<end>\";\nTokenName[TokenIdentifier] = \"Identifier\";\nTokenName[TokenKeyword] = \"Keyword\";\nTokenName[TokenNullLiteral] = \"Null\";\nTokenName[TokenNumericLiteral] = \"Numeric\";\nTokenName[TokenPunctuator] = \"Punctuator\";\nTokenName[TokenStringLiteral] = \"String\";\nTokenName[TokenRegularExpression] = \"RegularExpression\";\nvar SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\"; // Error messages should be identical to V8.\nvar MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\nvar ILLEGAL = \"ILLEGAL\", DISABLED = \"Disabled.\"; // See also tools/generate-unicode-regex.py.\nvar RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), // eslint-disable-next-line no-misleading-character-class\nRegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"); // Ensure the condition is true, otherwise throw an error.\n// This is only to have a better contract semantic, i.e. another safety net\n// to catch a logic error. The condition shall be fulfilled in normal case.\n// Do NOT use this to enforce a certain condition on any user input.\nfunction assert(condition, message) {\n    /* istanbul ignore next */ if (!condition) throw new Error(\"ASSERT: \" + message);\n}\nfunction isDecimalDigit(ch) {\n    return ch >= 0x30 && ch <= 0x39; // 0..9\n}\nfunction isHexDigit(ch) {\n    return \"0123456789abcdefABCDEF\".indexOf(ch) >= 0;\n}\nfunction isOctalDigit(ch) {\n    return \"01234567\".indexOf(ch) >= 0;\n} // 7.2 White Space\nfunction isWhiteSpace(ch) {\n    return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && [\n        0x1680,\n        0x180E,\n        0x2000,\n        0x2001,\n        0x2002,\n        0x2003,\n        0x2004,\n        0x2005,\n        0x2006,\n        0x2007,\n        0x2008,\n        0x2009,\n        0x200A,\n        0x202F,\n        0x205F,\n        0x3000,\n        0xFEFF\n    ].indexOf(ch) >= 0;\n} // 7.3 Line Terminators\nfunction isLineTerminator(ch) {\n    return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;\n} // 7.6 Identifier Names and Identifiers\nfunction isIdentifierStart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch));\n}\nfunction isIdentifierPart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch >= 0x30 && ch <= 0x39 || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch));\n} // 7.6.1.1 Keywords\nconst keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n};\nfunction skipComment() {\n    while(index < length){\n        const ch = source.charCodeAt(index);\n        if (isWhiteSpace(ch) || isLineTerminator(ch)) ++index;\n        else break;\n    }\n}\nfunction scanHexEscape(prefix) {\n    var i, len, ch, code = 0;\n    len = prefix === \"u\" ? 4 : 2;\n    for(i = 0; i < len; ++i)if (index < length && isHexDigit(source[index])) {\n        ch = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    } else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return String.fromCharCode(code);\n}\nfunction scanUnicodeCodePointEscape() {\n    var ch, code, cu1, cu2;\n    ch = source[index];\n    code = 0; // At least, one hex digit is required.\n    if (ch === \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    while(index < length){\n        ch = source[index++];\n        if (!isHexDigit(ch)) break;\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    }\n    if (code > 0x10FFFF || ch !== \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // UTF-16 Encoding\n    if (code <= 0xFFFF) return String.fromCharCode(code);\n    cu1 = (code - 0x10000 >> 10) + 0xD800;\n    cu2 = (code - 0x10000 & 1023) + 0xDC00;\n    return String.fromCharCode(cu1, cu2);\n}\nfunction getEscapedIdentifier() {\n    var ch, id;\n    ch = source.charCodeAt(index++);\n    id = String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n    if (ch === 0x5C) {\n        if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        ++index;\n        ch = scanHexEscape(\"u\");\n        if (!ch || ch === \"\\\\\" || !isIdentifierStart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        id = ch;\n    }\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (!isIdentifierPart(ch)) break;\n        ++index;\n        id += String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n        if (ch === 0x5C) {\n            id = id.substr(0, id.length - 1);\n            if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            ++index;\n            ch = scanHexEscape(\"u\");\n            if (!ch || ch === \"\\\\\" || !isIdentifierPart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            id += ch;\n        }\n    }\n    return id;\n}\nfunction getIdentifier() {\n    var start, ch;\n    start = index++;\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (ch === 0x5C) {\n            // Blackslash (U+005C) marks Unicode escape sequence.\n            index = start;\n            return getEscapedIdentifier();\n        }\n        if (isIdentifierPart(ch)) ++index;\n        else break;\n    }\n    return source.slice(start, index);\n}\nfunction scanIdentifier() {\n    var start, id, type;\n    start = index; // Backslash (U+005C) starts an escaped character.\n    id = source.charCodeAt(index) === 0x5C ? getEscapedIdentifier() : getIdentifier(); // There is no keyword or literal with only one character.\n    // Thus, it must be an identifier.\n    if (id.length === 1) type = TokenIdentifier;\n    else if (keywords.hasOwnProperty(id)) // eslint-disable-line no-prototype-builtins\n    type = TokenKeyword;\n    else if (id === \"null\") type = TokenNullLiteral;\n    else if (id === \"true\" || id === \"false\") type = TokenBooleanLiteral;\n    else type = TokenIdentifier;\n    return {\n        type: type,\n        value: id,\n        start: start,\n        end: index\n    };\n} // 7.7 Punctuators\nfunction scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch(code){\n        // Check for most common single-character punctuators.\n        case 0x2E:\n        case 0x28:\n        case 0x29:\n        case 0x3B:\n        case 0x2C:\n        case 0x7B:\n        case 0x7D:\n        case 0x5B:\n        case 0x5D:\n        case 0x3A:\n        case 0x3F:\n        case 0x7E:\n            // ~\n            ++index;\n            return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code),\n                start: start,\n                end: index\n            };\n        default:\n            code2 = source.charCodeAt(index + 1); // '=' (U+003D) marks an assignment or comparison operator.\n            if (code2 === 0x3D) switch(code){\n                case 0x2B:\n                case 0x2D:\n                case 0x2F:\n                case 0x3C:\n                case 0x3E:\n                case 0x5E:\n                case 0x7C:\n                case 0x25:\n                case 0x26:\n                case 0x2A:\n                    // *\n                    index += 2;\n                    return {\n                        type: TokenPunctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        start: start,\n                        end: index\n                    };\n                case 0x21:\n                case 0x3D:\n                    // =\n                    index += 2; // !== and ===\n                    if (source.charCodeAt(index) === 0x3D) ++index;\n                    return {\n                        type: TokenPunctuator,\n                        value: source.slice(start, index),\n                        start: start,\n                        end: index\n                    };\n            }\n    } // 4-character punctuator: >>>=\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n        index += 4;\n        return {\n            type: TokenPunctuator,\n            value: ch4,\n            start: start,\n            end: index\n        };\n    } // 3-character punctuators: === !== >>> <<= >>=\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n        index += 3;\n        return {\n            type: TokenPunctuator,\n            value: ch3,\n            start: start,\n            end: index\n        };\n    } // Other 2-character punctuators: ++ -- << >> && ||\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".indexOf(ch1) >= 0 || ch2 === \"=>\") {\n        index += 2;\n        return {\n            type: TokenPunctuator,\n            value: ch2,\n            start: start,\n            end: index\n        };\n    }\n    if (ch2 === \"//\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // 1-character punctuators: < > = ! + - * % & | ^ /\n    if (\"<>=!+-*%&|^/\".indexOf(ch1) >= 0) {\n        ++index;\n        return {\n            type: TokenPunctuator,\n            value: ch1,\n            start: start,\n            end: index\n        };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n} // 7.8.3 Numeric Literals\nfunction scanHexLiteral(start) {\n    let number = \"\";\n    while(index < length){\n        if (!isHexDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (number.length === 0) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(\"0x\" + number, 16),\n        start: start,\n        end: index\n    };\n}\nfunction scanOctalLiteral(start) {\n    let number = \"0\" + source[index++];\n    while(index < length){\n        if (!isOctalDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(number, 8),\n        octal: true,\n        start: start,\n        end: index\n    };\n}\nfunction scanNumericLiteral() {\n    var number, start, ch;\n    ch = source[index];\n    assert(isDecimalDigit(ch.charCodeAt(0)) || ch === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number = \"\";\n    if (ch !== \".\") {\n        number = source[index++];\n        ch = source[index]; // Hex number starts with '0x'.\n        // Octal number starts with '0'.\n        if (number === \"0\") {\n            if (ch === \"x\" || ch === \"X\") {\n                ++index;\n                return scanHexLiteral(start);\n            }\n            if (isOctalDigit(ch)) return scanOctalLiteral(start);\n             // decimal number starts with '0' such as '09' is illegal.\n            if (ch && isDecimalDigit(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        }\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \".\") {\n        number += source[index++];\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \"e\" || ch === \"E\") {\n        number += source[index++];\n        ch = source[index];\n        if (ch === \"+\" || ch === \"-\") number += source[index++];\n        if (isDecimalDigit(source.charCodeAt(index))) while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseFloat(number),\n        start: start,\n        end: index\n    };\n} // 7.8.4 String Literals\nfunction scanStringLiteral() {\n    var str = \"\", quote, start, ch, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while(index < length){\n        ch = source[index++];\n        if (ch === quote) {\n            quote = \"\";\n            break;\n        } else if (ch === \"\\\\\") {\n            ch = source[index++];\n            if (!ch || !isLineTerminator(ch.charCodeAt(0))) switch(ch){\n                case \"u\":\n                case \"x\":\n                    if (source[index] === \"{\") {\n                        ++index;\n                        str += scanUnicodeCodePointEscape();\n                    } else str += scanHexEscape(ch);\n                    break;\n                case \"n\":\n                    str += \"\\n\";\n                    break;\n                case \"r\":\n                    str += \"\\r\";\n                    break;\n                case \"t\":\n                    str += \"\t\";\n                    break;\n                case \"b\":\n                    str += \"\\b\";\n                    break;\n                case \"f\":\n                    str += \"\\f\";\n                    break;\n                case \"v\":\n                    str += \"\\v\";\n                    break;\n                default:\n                    if (isOctalDigit(ch)) {\n                        code = \"01234567\".indexOf(ch); // \\0 is not octal escape sequence\n                        if (code !== 0) octal = true;\n                        if (index < length && isOctalDigit(source[index])) {\n                            octal = true;\n                            code = code * 8 + \"01234567\".indexOf(source[index++]); // 3 digits are only allowed when string starts\n                            // with 0, 1, 2, 3\n                            if (\"0123\".indexOf(ch) >= 0 && index < length && isOctalDigit(source[index])) code = code * 8 + \"01234567\".indexOf(source[index++]);\n                        }\n                        str += String.fromCharCode(code);\n                    } else str += ch;\n                    break;\n            }\n            else if (ch === \"\\r\" && source[index] === \"\\n\") ++index;\n        } else if (isLineTerminator(ch.charCodeAt(0))) break;\n        else str += ch;\n    }\n    if (quote !== \"\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenStringLiteral,\n        value: str,\n        octal: octal,\n        start: start,\n        end: index\n    };\n}\nfunction testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.indexOf(\"u\") >= 0) // Replace each astral symbol and every Unicode code point\n    // escape sequence with a single ASCII symbol to avoid throwing on\n    // regular expressions that are only valid in combination with the\n    // `/u` flag.\n    // Note: replacing with the ASCII symbol `x` might cause false\n    // negatives in unlikely scenarios. For example, `[\\u{61}-b]` is a\n    // perfectly valid pattern that is equivalent to `[a-b]`, but it\n    // would be replaced by `[x-b]` which throws an error.\n    tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1)=>{\n        if (parseInt($1, 16) <= 0x10FFFF) return \"x\";\n        throwError({}, MessageInvalidRegExp);\n    }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n     // First, detect invalid regular expressions.\n    try {\n        new RegExp(tmp);\n    } catch (e) {\n        throwError({}, MessageInvalidRegExp);\n    } // Return a regular expression object for this pattern-flag pair, or\n    // `null` in case the current environment doesn't support the flags it\n    // uses.\n    try {\n        return new RegExp(pattern, flags);\n    } catch (exception) {\n        return null;\n    }\n}\nfunction scanRegExpBody() {\n    var ch, str, classMarker, terminated, body;\n    ch = source[index];\n    assert(ch === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while(index < length){\n        ch = source[index++];\n        str += ch;\n        if (ch === \"\\\\\") {\n            ch = source[index++]; // ECMA-262 7.8.5\n            if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n            str += ch;\n        } else if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n        else if (classMarker) {\n            if (ch === \"]\") classMarker = false;\n        } else {\n            if (ch === \"/\") {\n                terminated = true;\n                break;\n            } else if (ch === \"[\") classMarker = true;\n        }\n    }\n    if (!terminated) throwError({}, MessageUnterminatedRegExp);\n     // Exclude leading and trailing slash.\n    body = str.substr(1, str.length - 2);\n    return {\n        value: body,\n        literal: str\n    };\n}\nfunction scanRegExpFlags() {\n    var ch, str, flags;\n    str = \"\";\n    flags = \"\";\n    while(index < length){\n        ch = source[index];\n        if (!isIdentifierPart(ch.charCodeAt(0))) break;\n        ++index;\n        if (ch === \"\\\\\" && index < length) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        else {\n            flags += ch;\n            str += ch;\n        }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) throwError({}, MessageInvalidRegExp, flags);\n    return {\n        value: flags,\n        literal: str\n    };\n}\nfunction scanRegExp() {\n    var start, body, flags, value;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value = testRegExp(body.value, flags.value);\n    return {\n        literal: body.literal + flags.literal,\n        value: value,\n        regex: {\n            pattern: body.value,\n            flags: flags.value\n        },\n        start: start,\n        end: index\n    };\n}\nfunction isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n}\nfunction advance() {\n    skipComment();\n    if (index >= length) return {\n        type: TokenEOF,\n        start: index,\n        end: index\n    };\n    const ch = source.charCodeAt(index);\n    if (isIdentifierStart(ch)) return scanIdentifier();\n     // Very common: ( and ) and ;\n    if (ch === 0x28 || ch === 0x29 || ch === 0x3B) return scanPunctuator();\n     // String literal starts with single quote (U+0027) or double quote (U+0022).\n    if (ch === 0x27 || ch === 0x22) return scanStringLiteral();\n     // Dot (.) U+002E can also start a floating-point number, hence the need\n    // to check the next character.\n    if (ch === 0x2E) {\n        if (isDecimalDigit(source.charCodeAt(index + 1))) return scanNumericLiteral();\n        return scanPunctuator();\n    }\n    if (isDecimalDigit(ch)) return scanNumericLiteral();\n    return scanPunctuator();\n}\nfunction lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n}\nfunction peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n}\nfunction finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n}\nfunction finishBinaryExpression(operator, left, right) {\n    const node = new ASTNode(operator === \"||\" || operator === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator;\n    node.left = left;\n    node.right = right;\n    return node;\n}\nfunction finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n}\nfunction finishConditionalExpression(test, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n}\nfunction finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n}\nfunction finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n        if (node.raw === \"//\") node.raw = \"/(?:)/\";\n        node.regex = token.regex;\n    }\n    return node;\n}\nfunction finishMemberExpression(accessor, object, property) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor === \"[\";\n    node.object = object;\n    node.property = property;\n    if (!node.computed) property.member = true;\n    return node;\n}\nfunction finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n}\nfunction finishProperty(kind, key, value) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key;\n    node.value = value;\n    node.kind = kind;\n    return node;\n}\nfunction finishUnaryExpression(operator, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n} // Throw an exception\nfunction throwError(token, messageFormat) {\n    var error, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index1)=>{\n        assert(index1 < args.length, \"Message reference must be in range\");\n        return args[index1];\n    });\n    error = new Error(msg);\n    error.index = index;\n    error.description = msg;\n    throw error;\n} // Throw an exception because of the token.\nfunction throwUnexpected(token) {\n    if (token.type === TokenEOF) throwError(token, MessageUnexpectedEOS);\n    if (token.type === TokenNumericLiteral) throwError(token, MessageUnexpectedNumber);\n    if (token.type === TokenStringLiteral) throwError(token, MessageUnexpectedString);\n    if (token.type === TokenIdentifier) throwError(token, MessageUnexpectedIdentifier);\n    if (token.type === TokenKeyword) throwError(token, MessageUnexpectedReserved);\n     // BooleanLiteral, NullLiteral, or Punctuator.\n    throwError(token, MessageUnexpectedToken, token.value);\n} // Expect the next token to match the specified punctuator.\n// If not, an exception will be thrown.\nfunction expect(value) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value) throwUnexpected(token);\n} // Return true if the next token matches the specified punctuator.\nfunction match(value) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value;\n} // Return true if the next token matches the specified keyword\nfunction matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n} // 11.1.4 Array Initialiser\nfunction parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while(!match(\"]\"))if (match(\",\")) {\n        lex();\n        elements.push(null);\n    } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) expect(\",\");\n    }\n    lex();\n    return finishArrayExpression(elements);\n} // 11.1.5 Object Initialiser\nfunction parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex(); // Note: This function is called only from parseObjectProperty(), where\n    // EOF and Punctuator tokens are already filtered out.\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n        if (token.octal) throwError(token, MessageStrictOctalLiteral);\n        return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n}\nfunction parseObjectProperty() {\n    var token, key, id, value;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n        id = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", id, value);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) throwUnexpected(token);\n    else {\n        key = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", key, value);\n    }\n}\nfunction parseObjectInitialiser() {\n    var properties = [], property, name, key, map = {}, toString = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while(!match(\"}\")){\n        property = parseObjectProperty();\n        if (property.key.type === SyntaxIdentifier) name = property.key.name;\n        else name = toString(property.key.value);\n        key = \"$\" + name;\n        if (Object.prototype.hasOwnProperty.call(map, key)) throwError({}, MessageStrictDuplicateProperty);\n        else map[key] = true;\n        properties.push(property);\n        if (!match(\"}\")) expect(\",\");\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n} // 11.1.6 The Grouping Operator\nfunction parseGroupExpression() {\n    expect(\"(\");\n    const expr = parseExpression();\n    expect(\")\");\n    return expr;\n} // 11.1 Primary Expressions\nconst legalKeywords = {\n    \"if\": 1\n};\nfunction parsePrimaryExpression() {\n    var type, token, expr;\n    if (match(\"(\")) return parseGroupExpression();\n    if (match(\"[\")) return parseArrayInitialiser();\n    if (match(\"{\")) return parseObjectInitialiser();\n    type = lookahead.type;\n    index = lookahead.start;\n    if (type === TokenIdentifier || legalKeywords[lookahead.value]) expr = finishIdentifier(lex().value);\n    else if (type === TokenStringLiteral || type === TokenNumericLiteral) {\n        if (lookahead.octal) throwError(lookahead, MessageStrictOctalLiteral);\n        expr = finishLiteral(lex());\n    } else if (type === TokenKeyword) throw new Error(DISABLED);\n    else if (type === TokenBooleanLiteral) {\n        token = lex();\n        token.value = token.value === \"true\";\n        expr = finishLiteral(token);\n    } else if (type === TokenNullLiteral) {\n        token = lex();\n        token.value = null;\n        expr = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n        expr = finishLiteral(scanRegExp());\n        peek();\n    } else throwUnexpected(lex());\n    return expr;\n} // 11.2 Left-Hand-Side Expressions\nfunction parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) while(index < length){\n        args.push(parseConditionalExpression());\n        if (match(\")\")) break;\n        expect(\",\");\n    }\n    expect(\")\");\n    return args;\n}\nfunction parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) throwUnexpected(token);\n    return finishIdentifier(token.value);\n}\nfunction parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n}\nfunction parseComputedMember() {\n    expect(\"[\");\n    const expr = parseExpression();\n    expect(\"]\");\n    return expr;\n}\nfunction parseLeftHandSideExpressionAllowCall() {\n    var expr, args, property;\n    expr = parsePrimaryExpression();\n    for(;;){\n        if (match(\".\")) {\n            property = parseNonComputedMember();\n            expr = finishMemberExpression(\".\", expr, property);\n        } else if (match(\"(\")) {\n            args = parseArguments();\n            expr = finishCallExpression(expr, args);\n        } else if (match(\"[\")) {\n            property = parseComputedMember();\n            expr = finishMemberExpression(\"[\", expr, property);\n        } else break;\n    }\n    return expr;\n} // 11.3 Postfix Expressions\nfunction parsePostfixExpression() {\n    const expr = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n        if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    }\n    return expr;\n} // 11.4 Unary Operators\nfunction parseUnaryExpression() {\n    var token, expr;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) expr = parsePostfixExpression();\n    else if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n        token = lex();\n        expr = parseUnaryExpression();\n        expr = finishUnaryExpression(token.value, expr);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) throw new Error(DISABLED);\n    else expr = parsePostfixExpression();\n    return expr;\n}\nfunction binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) return 0;\n    switch(token.value){\n        case \"||\":\n            prec = 1;\n            break;\n        case \"&&\":\n            prec = 2;\n            break;\n        case \"|\":\n            prec = 3;\n            break;\n        case \"^\":\n            prec = 4;\n            break;\n        case \"&\":\n            prec = 5;\n            break;\n        case \"==\":\n        case \"!=\":\n        case \"===\":\n        case \"!==\":\n            prec = 6;\n            break;\n        case \"<\":\n        case \">\":\n        case \"<=\":\n        case \">=\":\n        case \"instanceof\":\n        case \"in\":\n            prec = 7;\n            break;\n        case \"<<\":\n        case \">>\":\n        case \">>>\":\n            prec = 8;\n            break;\n        case \"+\":\n        case \"-\":\n            prec = 9;\n            break;\n        case \"*\":\n        case \"/\":\n        case \"%\":\n            prec = 11;\n            break;\n    }\n    return prec;\n} // 11.5 Multiplicative Operators\n// 11.6 Additive Operators\n// 11.7 Bitwise Shift Operators\n// 11.8 Relational Operators\n// 11.9 Equality Operators\n// 11.10 Binary Bitwise Operators\n// 11.11 Binary Logical Operators\nfunction parseBinaryExpression() {\n    var marker, markers, expr, token, prec, stack, right, operator, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) return left;\n    token.prec = prec;\n    lex();\n    markers = [\n        marker,\n        lookahead\n    ];\n    right = parseUnaryExpression();\n    stack = [\n        left,\n        token,\n        right\n    ];\n    while((prec = binaryPrecedence(lookahead)) > 0){\n        // Reduce: make a binary expression from the three topmost entries.\n        while(stack.length > 2 && prec <= stack[stack.length - 2].prec){\n            right = stack.pop();\n            operator = stack.pop().value;\n            left = stack.pop();\n            markers.pop();\n            expr = finishBinaryExpression(operator, left, right);\n            stack.push(expr);\n        } // Shift.\n        token = lex();\n        token.prec = prec;\n        stack.push(token);\n        markers.push(lookahead);\n        expr = parseUnaryExpression();\n        stack.push(expr);\n    } // Final reduce to clean-up the stack.\n    i = stack.length - 1;\n    expr = stack[i];\n    markers.pop();\n    while(i > 1){\n        markers.pop();\n        expr = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n        i -= 2;\n    }\n    return expr;\n} // 11.12 Conditional Operator\nfunction parseConditionalExpression() {\n    var expr, consequent, alternate;\n    expr = parseBinaryExpression();\n    if (match(\"?\")) {\n        lex();\n        consequent = parseConditionalExpression();\n        expect(\":\");\n        alternate = parseConditionalExpression();\n        expr = finishConditionalExpression(expr, consequent, alternate);\n    }\n    return expr;\n} // 11.14 Comma Operator\nfunction parseExpression() {\n    const expr = parseConditionalExpression();\n    if (match(\",\")) throw new Error(DISABLED); // no sequence expressions\n    return expr;\n}\nfunction parser(code) {\n    source = code;\n    index = 0;\n    length = source.length;\n    lookahead = null;\n    peek();\n    const expr = parseExpression();\n    if (lookahead.type !== TokenEOF) throw new Error(\"Unexpect token after expression.\");\n    return expr;\n}\nvar Constants = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n};\nfunction Functions(codegen1) {\n    function fncall(name, args, cast, type) {\n        let obj = codegen1(args[0]);\n        if (cast) {\n            obj = cast + \"(\" + obj + \")\";\n            if (cast.lastIndexOf(\"new \", 0) === 0) obj = \"(\" + obj + \")\";\n        }\n        return obj + \".\" + name + (type < 0 ? \"\" : type === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen1).join(\",\") + \")\");\n    }\n    function fn(name, cast, type) {\n        return (args)=>fncall(name, args, cast, type);\n    }\n    const DATE = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n        // MATH functions\n        isNaN: \"Number.isNaN\",\n        isFinite: \"Number.isFinite\",\n        abs: \"Math.abs\",\n        acos: \"Math.acos\",\n        asin: \"Math.asin\",\n        atan: \"Math.atan\",\n        atan2: \"Math.atan2\",\n        ceil: \"Math.ceil\",\n        cos: \"Math.cos\",\n        exp: \"Math.exp\",\n        floor: \"Math.floor\",\n        log: \"Math.log\",\n        max: \"Math.max\",\n        min: \"Math.min\",\n        pow: \"Math.pow\",\n        random: \"Math.random\",\n        round: \"Math.round\",\n        sin: \"Math.sin\",\n        sqrt: \"Math.sqrt\",\n        tan: \"Math.tan\",\n        clamp: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to clamp function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to clamp function.\");\n            const a = args.map(codegen1);\n            return \"Math.max(\" + a[1] + \", Math.min(\" + a[2] + \",\" + a[0] + \"))\";\n        },\n        // DATE functions\n        now: \"Date.now\",\n        utc: \"Date.UTC\",\n        datetime: DATE,\n        date: fn(\"getDate\", DATE, 0),\n        day: fn(\"getDay\", DATE, 0),\n        year: fn(\"getFullYear\", DATE, 0),\n        month: fn(\"getMonth\", DATE, 0),\n        hours: fn(\"getHours\", DATE, 0),\n        minutes: fn(\"getMinutes\", DATE, 0),\n        seconds: fn(\"getSeconds\", DATE, 0),\n        milliseconds: fn(\"getMilliseconds\", DATE, 0),\n        time: fn(\"getTime\", DATE, 0),\n        timezoneoffset: fn(\"getTimezoneOffset\", DATE, 0),\n        utcdate: fn(\"getUTCDate\", DATE, 0),\n        utcday: fn(\"getUTCDay\", DATE, 0),\n        utcyear: fn(\"getUTCFullYear\", DATE, 0),\n        utcmonth: fn(\"getUTCMonth\", DATE, 0),\n        utchours: fn(\"getUTCHours\", DATE, 0),\n        utcminutes: fn(\"getUTCMinutes\", DATE, 0),\n        utcseconds: fn(\"getUTCSeconds\", DATE, 0),\n        utcmilliseconds: fn(\"getUTCMilliseconds\", DATE, 0),\n        // sequence functions\n        length: fn(\"length\", null, -1),\n        // STRING functions\n        parseFloat: \"parseFloat\",\n        parseInt: \"parseInt\",\n        upper: fn(\"toUpperCase\", STRING, 0),\n        lower: fn(\"toLowerCase\", STRING, 0),\n        substring: fn(\"substring\", STRING),\n        split: fn(\"split\", STRING),\n        trim: fn(\"trim\", STRING, 0),\n        // REGEXP functions\n        regexp: REGEXP,\n        test: fn(\"test\", REGEXP),\n        // Control Flow functions\n        if: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to if function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to if function.\");\n            const a = args.map(codegen1);\n            return \"(\" + a[0] + \"?\" + a[1] + \":\" + a[2] + \")\";\n        }\n    };\n}\nfunction stripQuotes(s) {\n    const n = s && s.length - 1;\n    return n && (s[0] === '\"' && s[n] === '\"' || s[0] === \"'\" && s[n] === \"'\") ? s.slice(1, -1) : s;\n}\nfunction codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? (0, _vegaUtil.toSet)(opt.allowed) : {}, forbidden = opt.forbidden ? (0, _vegaUtil.toSet)(opt.forbidden) : {}, constants = opt.constants || Constants, functions = (opt.functions || Functions)(visit), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = (0, _vegaUtil.isFunction)(globalvar) ? globalvar : (id)=>`${globalvar}[\"${id}\"]`;\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit(ast) {\n        if ((0, _vegaUtil.isString)(ast)) return ast;\n        const generator = Generators[ast.type];\n        if (generator == null) (0, _vegaUtil.error)(\"Unsupported type: \" + ast.type);\n        return generator(ast);\n    }\n    const Generators = {\n        Literal: (n)=>n.raw,\n        Identifier: (n)=>{\n            const id = n.name;\n            if (memberDepth > 0) return id;\n            else if ((0, _vegaUtil.hasOwnProperty)(forbidden, id)) return (0, _vegaUtil.error)(\"Illegal identifier: \" + id);\n            else if ((0, _vegaUtil.hasOwnProperty)(constants, id)) return constants[id];\n            else if ((0, _vegaUtil.hasOwnProperty)(allowed, id)) return id;\n            else {\n                globals[id] = 1;\n                return outputGlobal(id);\n            }\n        },\n        MemberExpression: (n)=>{\n            const d = !n.computed, o = visit(n.object);\n            if (d) memberDepth += 1;\n            const p = visit(n.property);\n            if (o === fieldvar) // strip quotes to sanitize field name (#1653)\n            fields[stripQuotes(p)] = 1;\n            if (d) memberDepth -= 1;\n            return o + (d ? \".\" + p : \"[\" + p + \"]\");\n        },\n        CallExpression: (n)=>{\n            if (n.callee.type !== \"Identifier\") (0, _vegaUtil.error)(\"Illegal callee type: \" + n.callee.type);\n            const callee = n.callee.name, args = n.arguments, fn = (0, _vegaUtil.hasOwnProperty)(functions, callee) && functions[callee];\n            if (!fn) (0, _vegaUtil.error)(\"Unrecognized function: \" + callee);\n            return (0, _vegaUtil.isFunction)(fn) ? fn(args) : fn + \"(\" + args.map(visit).join(\",\") + \")\";\n        },\n        ArrayExpression: (n)=>\"[\" + n.elements.map(visit).join(\",\") + \"]\",\n        BinaryExpression: (n)=>\"(\" + visit(n.left) + \" \" + n.operator + \" \" + visit(n.right) + \")\",\n        UnaryExpression: (n)=>\"(\" + n.operator + visit(n.argument) + \")\",\n        ConditionalExpression: (n)=>\"(\" + visit(n.test) + \"?\" + visit(n.consequent) + \":\" + visit(n.alternate) + \")\",\n        LogicalExpression: (n)=>\"(\" + visit(n.left) + n.operator + visit(n.right) + \")\",\n        ObjectExpression: (n)=>\"{\" + n.properties.map(visit).join(\",\") + \"}\",\n        Property: (n)=>{\n            memberDepth += 1;\n            const k = visit(n.key);\n            memberDepth -= 1;\n            return k + \":\" + visit(n.value);\n        }\n    };\n    function codegen2(ast) {\n        const result = {\n            code: visit(ast),\n            globals: Object.keys(globals),\n            fields: Object.keys(fields)\n        };\n        globals = {};\n        fields = {};\n        return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants;\n    return codegen2;\n}\n\n},{\"vega-util\":\"bApja\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"674qo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"selectionIdTest\", ()=>selectionIdTest);\nparcelHelpers.export(exports, \"selectionResolve\", ()=>selectionResolve);\nparcelHelpers.export(exports, \"selectionTest\", ()=>selectionTest);\nparcelHelpers.export(exports, \"selectionTuples\", ()=>selectionTuples);\nparcelHelpers.export(exports, \"selectionVisitor\", ()=>selectionVisitor);\nvar _d3Array = require(\"d3-array\");\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaExpression = require(\"vega-expression\");\nconst Intersect = \"intersect\";\nconst Union = \"union\";\nconst VlMulti = \"vlMulti\";\nconst VlPoint = \"vlPoint\";\nconst Or = \"or\";\nconst And = \"and\";\nconst SelectionId = \"_vgsid_\";\nconst $selectionId = (0, _vegaUtil.field)(SelectionId);\nconst TYPE_ENUM = \"E\", TYPE_RANGE_INC = \"R\", TYPE_RANGE_EXC = \"R-E\", TYPE_RANGE_LE = \"R-LE\", TYPE_RANGE_RE = \"R-RE\", UNIT_INDEX = \"index:unit\"; // TODO: revisit date coercion?\nfunction testPoint(datum, entry) {\n    var fields = entry.fields, values = entry.values, n = fields.length, i = 0, dval, f;\n    for(; i < n; ++i){\n        f = fields[i];\n        f.getter = (0, _vegaUtil.field).getter || (0, _vegaUtil.field)(f.field);\n        dval = f.getter(datum);\n        if ((0, _vegaUtil.isDate)(dval)) dval = (0, _vegaUtil.toNumber)(dval);\n        if ((0, _vegaUtil.isDate)(values[i])) values[i] = (0, _vegaUtil.toNumber)(values[i]);\n        if ((0, _vegaUtil.isDate)(values[i][0])) values[i] = values[i].map((0, _vegaUtil.toNumber));\n        if (f.type === TYPE_ENUM) {\n            // Enumerated fields can either specify individual values (single/multi selections)\n            // or an array of values (interval selections).\n            if ((0, _vegaUtil.isArray)(values[i]) ? values[i].indexOf(dval) < 0 : dval !== values[i]) return false;\n        } else {\n            if (f.type === TYPE_RANGE_INC) {\n                if (!(0, _vegaUtil.inrange)(dval, values[i])) return false;\n            } else if (f.type === TYPE_RANGE_RE) {\n                // Discrete selection of bins test within the range [bin_start, bin_end).\n                if (!(0, _vegaUtil.inrange)(dval, values[i], true, false)) return false;\n            } else if (f.type === TYPE_RANGE_EXC) {\n                // 'R-E'/'R-LE' included for completeness.\n                if (!(0, _vegaUtil.inrange)(dval, values[i], false, false)) return false;\n            } else if (f.type === TYPE_RANGE_LE) {\n                if (!(0, _vegaUtil.inrange)(dval, values[i], false, true)) return false;\n            }\n        }\n    }\n    return true;\n}\n/**\n * Tests if a tuple is contained within an interactive selection.\n * @param {string} name - The name of the data set representing the selection.\n *  Tuples in the dataset are of the form\n *  {unit: string, fields: array<fielddef>, values: array<*>}.\n *  Fielddef is of the form\n *  {field: string, channel: string, type: 'E' | 'R'} where\n *  'type' identifies whether tuples in the dataset enumerate\n *  values for the field, or specify a continuous range.\n * @param {object} datum - The tuple to test for inclusion.\n * @param {string} op - The set operation for combining selections.\n *   One of 'intersect' or 'union' (default).\n * @return {boolean} - True if the datum is in the selection, false otherwise.\n */ function selectionTest(name, datum, op) {\n    var data = this.context.data[name], entries = data ? data.values.value : [], unitIdx = data ? data[UNIT_INDEX] && data[UNIT_INDEX].value : undefined, intersect = op === Intersect, n = entries.length, i = 0, entry, miss, count, unit, b;\n    for(; i < n; ++i){\n        entry = entries[i];\n        if (unitIdx && intersect) {\n            // multi selections union within the same unit and intersect across units.\n            miss = miss || {};\n            count = miss[unit = entry.unit] || 0; // if we've already matched this unit, skip.\n            if (count === -1) continue;\n            b = testPoint(datum, entry);\n            miss[unit] = b ? -1 : ++count; // if we match and there are no other units return true\n            // if we've missed against all tuples in this unit return false\n            if (b && unitIdx.size === 1) return true;\n            if (!b && count === unitIdx.get(unit).count) return false;\n        } else {\n            b = testPoint(datum, entry); // if we find a miss and we do require intersection return false\n            // if we find a match and we don't require intersection return true\n            if (intersect ^ b) return b;\n        }\n    } // if intersecting and we made it here, then we saw no misses\n    // if not intersecting, then we saw no matches\n    // if no active selections, return false\n    return n && intersect;\n}\nconst bisect = (0, _d3Array.bisector)($selectionId), bisectLeft = bisect.left, bisectRight = bisect.right;\nfunction selectionIdTest(name, datum, op) {\n    const data = this.context.data[name], entries = data ? data.values.value : [], unitIdx = data ? data[UNIT_INDEX] && data[UNIT_INDEX].value : undefined, intersect = op === Intersect, value = $selectionId(datum), index = bisectLeft(entries, value);\n    if (index === entries.length) return false;\n    if ($selectionId(entries[index]) !== value) return false;\n    if (unitIdx && intersect) {\n        if (unitIdx.size === 1) return true;\n        if (bisectRight(entries, value) - index < unitIdx.size) return false;\n    }\n    return true;\n}\n/**\n * Maps an array of scene graph items to an array of selection tuples.\n * @param {string} name  - The name of the dataset representing the selection.\n * @param {string} base  - The base object that generated tuples extend.\n *\n * @returns {array} An array of selection entries for the given unit.\n */ function selectionTuples(array, base) {\n    return array.map((x)=>(0, _vegaUtil.extend)(base.fields ? {\n            values: base.fields.map((f)=>(f.getter || (f.getter = (0, _vegaUtil.field)(f.field)))(x.datum))\n        } : {\n            [SelectionId]: $selectionId(x.datum)\n        }, base));\n}\n/**\n * Resolves selection for use as a scale domain or reads via the API.\n * @param {string} name - The name of the dataset representing the selection\n * @param {string} [op='union'] - The set operation for combining selections.\n *                 One of 'intersect' or 'union' (default).\n * @param {boolean} isMulti - Identifies a \"multi\" selection to perform more\n *                 expensive resolution computation.\n * @param {boolean} vl5 - With Vega-Lite v5, \"multi\" selections are now called \"point\"\n *                 selections, and thus the resolved tuple should reflect this name.\n *                 This parameter allows us to reflect this change without triggering\n *                 a major version bump for Vega.\n * @returns {object} An object of selected fields and values.\n */ function selectionResolve(name, op, isMulti, vl5) {\n    var data = this.context.data[name], entries = data ? data.values.value : [], resolved = {}, multiRes = {}, types = {}, entry, fields, values, unit1, field1, value, res, resUnit, type, union, n = entries.length, i = 0, j1, m; // First union all entries within the same unit.\n    for(; i < n; ++i){\n        entry = entries[i];\n        unit1 = entry.unit;\n        fields = entry.fields;\n        values = entry.values;\n        if (fields && values) {\n            // Intentional selection stores\n            for(j1 = 0, m = fields.length; j1 < m; ++j1){\n                field1 = fields[j1];\n                res = resolved[field1.field] || (resolved[field1.field] = {});\n                resUnit = res[unit1] || (res[unit1] = []);\n                types[field1.field] = type = field1.type.charAt(0);\n                union = ops[\"\".concat(type, \"_union\")];\n                res[unit1] = union(resUnit, (0, _vegaUtil.array)(values[j1]));\n            } // If the same multi-selection is repeated over views and projected over\n            // an encoding, it may operate over different fields making it especially\n            // tricky to reliably resolve it. At best, we can de-dupe identical entries\n            // but doing so may be more computationally expensive than it is worth.\n            // Instead, for now, we simply transform our store representation into\n            // a more human-friendly one.\n            if (isMulti) {\n                resUnit = multiRes[unit1] || (multiRes[unit1] = []);\n                resUnit.push((0, _vegaUtil.array)(values).reduce((obj, curr, j)=>(obj[fields[j].field] = curr, obj), {}));\n            }\n        } else {\n            // Short circuit extensional selectionId stores which hold sorted IDs unique to each unit.\n            field1 = SelectionId;\n            value = $selectionId(entry);\n            res = resolved[field1] || (resolved[field1] = {});\n            resUnit = res[unit1] || (res[unit1] = []);\n            resUnit.push(value);\n            if (isMulti) {\n                resUnit = multiRes[unit1] || (multiRes[unit1] = []);\n                resUnit.push({\n                    [SelectionId]: value\n                });\n            }\n        }\n    } // Then resolve fields across units as per the op.\n    op = op || Union;\n    if (resolved[SelectionId]) resolved[SelectionId] = ops[\"\".concat(SelectionId, \"_\").concat(op)](...Object.values(resolved[SelectionId]));\n    else Object.keys(resolved).forEach((field)=>{\n        resolved[field] = Object.keys(resolved[field]).map((unit)=>resolved[field][unit]).reduce((acc, curr)=>acc === undefined ? curr : ops[\"\".concat(types[field], \"_\").concat(op)](acc, curr));\n    });\n    entries = Object.keys(multiRes);\n    if (isMulti && entries.length) {\n        const key = vl5 ? VlPoint : VlMulti;\n        resolved[key] = op === Union ? {\n            [Or]: entries.reduce((acc, k)=>(acc.push(...multiRes[k]), acc), [])\n        } : {\n            [And]: entries.map((k)=>({\n                    [Or]: multiRes[k]\n                }))\n        };\n    }\n    return resolved;\n}\nvar ops = {\n    [\"\".concat(SelectionId, \"_union\")]: (0, _d3Array.union),\n    [\"\".concat(SelectionId, \"_intersect\")]: (0, _d3Array.intersection),\n    E_union: function(base, value) {\n        if (!base.length) return value;\n        var i = 0, n = value.length;\n        for(; i < n; ++i)if (base.indexOf(value[i]) < 0) base.push(value[i]);\n        return base;\n    },\n    E_intersect: function(base, value) {\n        return !base.length ? value : base.filter((v)=>value.indexOf(v) >= 0);\n    },\n    R_union: function(base, value) {\n        var lo = (0, _vegaUtil.toNumber)(value[0]), hi = (0, _vegaUtil.toNumber)(value[1]);\n        if (lo > hi) {\n            lo = value[1];\n            hi = value[0];\n        }\n        if (!base.length) return [\n            lo,\n            hi\n        ];\n        if (base[0] > lo) base[0] = lo;\n        if (base[1] < hi) base[1] = hi;\n        return base;\n    },\n    R_intersect: function(base, value) {\n        var lo = (0, _vegaUtil.toNumber)(value[0]), hi = (0, _vegaUtil.toNumber)(value[1]);\n        if (lo > hi) {\n            lo = value[1];\n            hi = value[0];\n        }\n        if (!base.length) return [\n            lo,\n            hi\n        ];\n        if (hi < base[0] || base[1] < lo) return [];\n        else {\n            if (base[0] < lo) base[0] = lo;\n            if (base[1] > hi) base[1] = hi;\n        }\n        return base;\n    }\n};\nconst DataPrefix = \":\", IndexPrefix = \"@\";\nfunction selectionVisitor(name, args, scope, params) {\n    if (args[0].type !== (0, _vegaExpression.Literal)) (0, _vegaUtil.error)(\"First argument to selection functions must be a string literal.\");\n    const data = args[0].value, op = args.length >= 2 && (0, _vegaUtil.peek)(args).value, field = \"unit\", indexName = IndexPrefix + field, dataName = DataPrefix + data; // eslint-disable-next-line no-prototype-builtins\n    if (op === Intersect && !(0, _vegaUtil.hasOwnProperty)(params, indexName)) params[indexName] = scope.getData(data).indataRef(scope, field);\n     // eslint-disable-next-line no-prototype-builtins\n    if (!(0, _vegaUtil.hasOwnProperty)(params, dataName)) params[dataName] = scope.getData(data).tuplesRef();\n}\n\n},{\"d3-array\":\"lLsmU\",\"vega-util\":\"bApja\",\"vega-expression\":\"9KcWf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lLsmU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bisect\", ()=>(0, _bisectJsDefault.default));\nparcelHelpers.export(exports, \"bisectRight\", ()=>(0, _bisectJs.bisectRight));\nparcelHelpers.export(exports, \"bisectLeft\", ()=>(0, _bisectJs.bisectLeft));\nparcelHelpers.export(exports, \"bisectCenter\", ()=>(0, _bisectJs.bisectCenter));\nparcelHelpers.export(exports, \"ascending\", ()=>(0, _ascendingJsDefault.default));\nparcelHelpers.export(exports, \"bisector\", ()=>(0, _bisectorJsDefault.default));\nparcelHelpers.export(exports, \"count\", ()=>(0, _countJsDefault.default));\nparcelHelpers.export(exports, \"cross\", ()=>(0, _crossJsDefault.default));\nparcelHelpers.export(exports, \"cumsum\", ()=>(0, _cumsumJsDefault.default));\nparcelHelpers.export(exports, \"descending\", ()=>(0, _descendingJsDefault.default));\nparcelHelpers.export(exports, \"deviation\", ()=>(0, _deviationJsDefault.default));\nparcelHelpers.export(exports, \"extent\", ()=>(0, _extentJsDefault.default));\nparcelHelpers.export(exports, \"Adder\", ()=>(0, _fsumJs.Adder));\nparcelHelpers.export(exports, \"fsum\", ()=>(0, _fsumJs.fsum));\nparcelHelpers.export(exports, \"fcumsum\", ()=>(0, _fsumJs.fcumsum));\nparcelHelpers.export(exports, \"group\", ()=>(0, _groupJsDefault.default));\nparcelHelpers.export(exports, \"flatGroup\", ()=>(0, _groupJs.flatGroup));\nparcelHelpers.export(exports, \"flatRollup\", ()=>(0, _groupJs.flatRollup));\nparcelHelpers.export(exports, \"groups\", ()=>(0, _groupJs.groups));\nparcelHelpers.export(exports, \"index\", ()=>(0, _groupJs.index));\nparcelHelpers.export(exports, \"indexes\", ()=>(0, _groupJs.indexes));\nparcelHelpers.export(exports, \"rollup\", ()=>(0, _groupJs.rollup));\nparcelHelpers.export(exports, \"rollups\", ()=>(0, _groupJs.rollups));\nparcelHelpers.export(exports, \"groupSort\", ()=>(0, _groupSortJsDefault.default));\nparcelHelpers.export(exports, \"bin\", ()=>(0, _binJsDefault.default)) // Deprecated; use bin.\n;\nparcelHelpers.export(exports, \"histogram\", ()=>(0, _binJsDefault.default));\nparcelHelpers.export(exports, \"thresholdFreedmanDiaconis\", ()=>(0, _freedmanDiaconisJsDefault.default));\nparcelHelpers.export(exports, \"thresholdScott\", ()=>(0, _scottJsDefault.default));\nparcelHelpers.export(exports, \"thresholdSturges\", ()=>(0, _sturgesJsDefault.default));\nparcelHelpers.export(exports, \"max\", ()=>(0, _maxJsDefault.default));\nparcelHelpers.export(exports, \"maxIndex\", ()=>(0, _maxIndexJsDefault.default));\nparcelHelpers.export(exports, \"mean\", ()=>(0, _meanJsDefault.default));\nparcelHelpers.export(exports, \"median\", ()=>(0, _medianJsDefault.default));\nparcelHelpers.export(exports, \"merge\", ()=>(0, _mergeJsDefault.default));\nparcelHelpers.export(exports, \"min\", ()=>(0, _minJsDefault.default));\nparcelHelpers.export(exports, \"minIndex\", ()=>(0, _minIndexJsDefault.default));\nparcelHelpers.export(exports, \"mode\", ()=>(0, _modeJsDefault.default));\nparcelHelpers.export(exports, \"nice\", ()=>(0, _niceJsDefault.default));\nparcelHelpers.export(exports, \"pairs\", ()=>(0, _pairsJsDefault.default));\nparcelHelpers.export(exports, \"permute\", ()=>(0, _permuteJsDefault.default));\nparcelHelpers.export(exports, \"quantile\", ()=>(0, _quantileJsDefault.default));\nparcelHelpers.export(exports, \"quantileSorted\", ()=>(0, _quantileJs.quantileSorted));\nparcelHelpers.export(exports, \"quickselect\", ()=>(0, _quickselectJsDefault.default));\nparcelHelpers.export(exports, \"range\", ()=>(0, _rangeJsDefault.default));\nparcelHelpers.export(exports, \"rank\", ()=>(0, _rankJsDefault.default));\nparcelHelpers.export(exports, \"least\", ()=>(0, _leastJsDefault.default));\nparcelHelpers.export(exports, \"leastIndex\", ()=>(0, _leastIndexJsDefault.default));\nparcelHelpers.export(exports, \"greatest\", ()=>(0, _greatestJsDefault.default));\nparcelHelpers.export(exports, \"greatestIndex\", ()=>(0, _greatestIndexJsDefault.default));\nparcelHelpers.export(exports, \"scan\", ()=>(0, _scanJsDefault.default)) // Deprecated; use leastIndex.\n;\nparcelHelpers.export(exports, \"shuffle\", ()=>(0, _shuffleJsDefault.default));\nparcelHelpers.export(exports, \"shuffler\", ()=>(0, _shuffleJs.shuffler));\nparcelHelpers.export(exports, \"sum\", ()=>(0, _sumJsDefault.default));\nparcelHelpers.export(exports, \"ticks\", ()=>(0, _ticksJsDefault.default));\nparcelHelpers.export(exports, \"tickIncrement\", ()=>(0, _ticksJs.tickIncrement));\nparcelHelpers.export(exports, \"tickStep\", ()=>(0, _ticksJs.tickStep));\nparcelHelpers.export(exports, \"transpose\", ()=>(0, _transposeJsDefault.default));\nparcelHelpers.export(exports, \"variance\", ()=>(0, _varianceJsDefault.default));\nparcelHelpers.export(exports, \"zip\", ()=>(0, _zipJsDefault.default));\nparcelHelpers.export(exports, \"every\", ()=>(0, _everyJsDefault.default));\nparcelHelpers.export(exports, \"some\", ()=>(0, _someJsDefault.default));\nparcelHelpers.export(exports, \"filter\", ()=>(0, _filterJsDefault.default));\nparcelHelpers.export(exports, \"map\", ()=>(0, _mapJsDefault.default));\nparcelHelpers.export(exports, \"reduce\", ()=>(0, _reduceJsDefault.default));\nparcelHelpers.export(exports, \"reverse\", ()=>(0, _reverseJsDefault.default));\nparcelHelpers.export(exports, \"sort\", ()=>(0, _sortJsDefault.default));\nparcelHelpers.export(exports, \"difference\", ()=>(0, _differenceJsDefault.default));\nparcelHelpers.export(exports, \"disjoint\", ()=>(0, _disjointJsDefault.default));\nparcelHelpers.export(exports, \"intersection\", ()=>(0, _intersectionJsDefault.default));\nparcelHelpers.export(exports, \"subset\", ()=>(0, _subsetJsDefault.default));\nparcelHelpers.export(exports, \"superset\", ()=>(0, _supersetJsDefault.default));\nparcelHelpers.export(exports, \"union\", ()=>(0, _unionJsDefault.default));\nparcelHelpers.export(exports, \"InternMap\", ()=>(0, _internmap.InternMap));\nparcelHelpers.export(exports, \"InternSet\", ()=>(0, _internmap.InternSet));\nvar _bisectJs = require(\"./bisect.js\");\nvar _bisectJsDefault = parcelHelpers.interopDefault(_bisectJs);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nvar _bisectorJs = require(\"./bisector.js\");\nvar _bisectorJsDefault = parcelHelpers.interopDefault(_bisectorJs);\nvar _countJs = require(\"./count.js\");\nvar _countJsDefault = parcelHelpers.interopDefault(_countJs);\nvar _crossJs = require(\"./cross.js\");\nvar _crossJsDefault = parcelHelpers.interopDefault(_crossJs);\nvar _cumsumJs = require(\"./cumsum.js\");\nvar _cumsumJsDefault = parcelHelpers.interopDefault(_cumsumJs);\nvar _descendingJs = require(\"./descending.js\");\nvar _descendingJsDefault = parcelHelpers.interopDefault(_descendingJs);\nvar _deviationJs = require(\"./deviation.js\");\nvar _deviationJsDefault = parcelHelpers.interopDefault(_deviationJs);\nvar _extentJs = require(\"./extent.js\");\nvar _extentJsDefault = parcelHelpers.interopDefault(_extentJs);\nvar _fsumJs = require(\"./fsum.js\");\nvar _groupJs = require(\"./group.js\");\nvar _groupJsDefault = parcelHelpers.interopDefault(_groupJs);\nvar _groupSortJs = require(\"./groupSort.js\");\nvar _groupSortJsDefault = parcelHelpers.interopDefault(_groupSortJs);\nvar _binJs = require(\"./bin.js\");\nvar _binJsDefault = parcelHelpers.interopDefault(_binJs);\nvar _freedmanDiaconisJs = require(\"./threshold/freedmanDiaconis.js\");\nvar _freedmanDiaconisJsDefault = parcelHelpers.interopDefault(_freedmanDiaconisJs);\nvar _scottJs = require(\"./threshold/scott.js\");\nvar _scottJsDefault = parcelHelpers.interopDefault(_scottJs);\nvar _sturgesJs = require(\"./threshold/sturges.js\");\nvar _sturgesJsDefault = parcelHelpers.interopDefault(_sturgesJs);\nvar _maxJs = require(\"./max.js\");\nvar _maxJsDefault = parcelHelpers.interopDefault(_maxJs);\nvar _maxIndexJs = require(\"./maxIndex.js\");\nvar _maxIndexJsDefault = parcelHelpers.interopDefault(_maxIndexJs);\nvar _meanJs = require(\"./mean.js\");\nvar _meanJsDefault = parcelHelpers.interopDefault(_meanJs);\nvar _medianJs = require(\"./median.js\");\nvar _medianJsDefault = parcelHelpers.interopDefault(_medianJs);\nvar _mergeJs = require(\"./merge.js\");\nvar _mergeJsDefault = parcelHelpers.interopDefault(_mergeJs);\nvar _minJs = require(\"./min.js\");\nvar _minJsDefault = parcelHelpers.interopDefault(_minJs);\nvar _minIndexJs = require(\"./minIndex.js\");\nvar _minIndexJsDefault = parcelHelpers.interopDefault(_minIndexJs);\nvar _modeJs = require(\"./mode.js\");\nvar _modeJsDefault = parcelHelpers.interopDefault(_modeJs);\nvar _niceJs = require(\"./nice.js\");\nvar _niceJsDefault = parcelHelpers.interopDefault(_niceJs);\nvar _pairsJs = require(\"./pairs.js\");\nvar _pairsJsDefault = parcelHelpers.interopDefault(_pairsJs);\nvar _permuteJs = require(\"./permute.js\");\nvar _permuteJsDefault = parcelHelpers.interopDefault(_permuteJs);\nvar _quantileJs = require(\"./quantile.js\");\nvar _quantileJsDefault = parcelHelpers.interopDefault(_quantileJs);\nvar _quickselectJs = require(\"./quickselect.js\");\nvar _quickselectJsDefault = parcelHelpers.interopDefault(_quickselectJs);\nvar _rangeJs = require(\"./range.js\");\nvar _rangeJsDefault = parcelHelpers.interopDefault(_rangeJs);\nvar _rankJs = require(\"./rank.js\");\nvar _rankJsDefault = parcelHelpers.interopDefault(_rankJs);\nvar _leastJs = require(\"./least.js\");\nvar _leastJsDefault = parcelHelpers.interopDefault(_leastJs);\nvar _leastIndexJs = require(\"./leastIndex.js\");\nvar _leastIndexJsDefault = parcelHelpers.interopDefault(_leastIndexJs);\nvar _greatestJs = require(\"./greatest.js\");\nvar _greatestJsDefault = parcelHelpers.interopDefault(_greatestJs);\nvar _greatestIndexJs = require(\"./greatestIndex.js\");\nvar _greatestIndexJsDefault = parcelHelpers.interopDefault(_greatestIndexJs);\nvar _scanJs = require(\"./scan.js\");\nvar _scanJsDefault = parcelHelpers.interopDefault(_scanJs);\nvar _shuffleJs = require(\"./shuffle.js\");\nvar _shuffleJsDefault = parcelHelpers.interopDefault(_shuffleJs);\nvar _sumJs = require(\"./sum.js\");\nvar _sumJsDefault = parcelHelpers.interopDefault(_sumJs);\nvar _ticksJs = require(\"./ticks.js\");\nvar _ticksJsDefault = parcelHelpers.interopDefault(_ticksJs);\nvar _transposeJs = require(\"./transpose.js\");\nvar _transposeJsDefault = parcelHelpers.interopDefault(_transposeJs);\nvar _varianceJs = require(\"./variance.js\");\nvar _varianceJsDefault = parcelHelpers.interopDefault(_varianceJs);\nvar _zipJs = require(\"./zip.js\");\nvar _zipJsDefault = parcelHelpers.interopDefault(_zipJs);\nvar _everyJs = require(\"./every.js\");\nvar _everyJsDefault = parcelHelpers.interopDefault(_everyJs);\nvar _someJs = require(\"./some.js\");\nvar _someJsDefault = parcelHelpers.interopDefault(_someJs);\nvar _filterJs = require(\"./filter.js\");\nvar _filterJsDefault = parcelHelpers.interopDefault(_filterJs);\nvar _mapJs = require(\"./map.js\");\nvar _mapJsDefault = parcelHelpers.interopDefault(_mapJs);\nvar _reduceJs = require(\"./reduce.js\");\nvar _reduceJsDefault = parcelHelpers.interopDefault(_reduceJs);\nvar _reverseJs = require(\"./reverse.js\");\nvar _reverseJsDefault = parcelHelpers.interopDefault(_reverseJs);\nvar _sortJs = require(\"./sort.js\");\nvar _sortJsDefault = parcelHelpers.interopDefault(_sortJs);\nvar _differenceJs = require(\"./difference.js\");\nvar _differenceJsDefault = parcelHelpers.interopDefault(_differenceJs);\nvar _disjointJs = require(\"./disjoint.js\");\nvar _disjointJsDefault = parcelHelpers.interopDefault(_disjointJs);\nvar _intersectionJs = require(\"./intersection.js\");\nvar _intersectionJsDefault = parcelHelpers.interopDefault(_intersectionJs);\nvar _subsetJs = require(\"./subset.js\");\nvar _subsetJsDefault = parcelHelpers.interopDefault(_subsetJs);\nvar _supersetJs = require(\"./superset.js\");\nvar _supersetJsDefault = parcelHelpers.interopDefault(_supersetJs);\nvar _unionJs = require(\"./union.js\");\nvar _unionJsDefault = parcelHelpers.interopDefault(_unionJs);\nvar _internmap = require(\"internmap\");\n\n},{\"./bisect.js\":false,\"./ascending.js\":\"iBXNJ\",\"./bisector.js\":\"7xgyC\",\"./count.js\":false,\"./cross.js\":false,\"./cumsum.js\":false,\"./descending.js\":false,\"./deviation.js\":false,\"./extent.js\":false,\"./fsum.js\":false,\"./group.js\":false,\"./groupSort.js\":false,\"./bin.js\":false,\"./threshold/freedmanDiaconis.js\":false,\"./threshold/scott.js\":false,\"./threshold/sturges.js\":false,\"./max.js\":false,\"./maxIndex.js\":false,\"./mean.js\":false,\"./median.js\":false,\"./merge.js\":false,\"./min.js\":false,\"./minIndex.js\":false,\"./mode.js\":false,\"./nice.js\":false,\"./pairs.js\":false,\"./permute.js\":false,\"./quantile.js\":false,\"./quickselect.js\":false,\"./range.js\":false,\"./rank.js\":false,\"./least.js\":false,\"./leastIndex.js\":false,\"./greatest.js\":false,\"./greatestIndex.js\":false,\"./scan.js\":false,\"./shuffle.js\":false,\"./sum.js\":false,\"./ticks.js\":false,\"./transpose.js\":false,\"./variance.js\":false,\"./zip.js\":false,\"./every.js\":false,\"./some.js\":false,\"./filter.js\":false,\"./map.js\":false,\"./reduce.js\":false,\"./reverse.js\":false,\"./sort.js\":false,\"./difference.js\":false,\"./disjoint.js\":false,\"./intersection.js\":\"7k2Rl\",\"./subset.js\":false,\"./superset.js\":false,\"./union.js\":\"9JG19\",\"internmap\":\"3ULAv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iBXNJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nfunction ascending(a, b) {\n    return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\nexports.default = ascending;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7xgyC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _ascendingJs = require(\"./ascending.js\");\nvar _ascendingJsDefault = parcelHelpers.interopDefault(_ascendingJs);\nfunction bisector(f) {\n    let delta = f;\n    let compare1 = f;\n    let compare2 = f;\n    if (f.length !== 2) {\n        delta = (d, x)=>f(d) - x;\n        compare1 = (0, _ascendingJsDefault.default);\n        compare2 = (d, x)=>(0, _ascendingJsDefault.default)(f(d), x);\n    }\n    function left(a, x, lo = 0, hi = a.length) {\n        if (lo < hi) {\n            if (compare1(x, x) !== 0) return hi;\n            do {\n                const mid = lo + hi >>> 1;\n                if (compare2(a[mid], x) < 0) lo = mid + 1;\n                else hi = mid;\n            }while (lo < hi);\n        }\n        return lo;\n    }\n    function right(a, x, lo = 0, hi = a.length) {\n        if (lo < hi) {\n            if (compare1(x, x) !== 0) return hi;\n            do {\n                const mid = lo + hi >>> 1;\n                if (compare2(a[mid], x) <= 0) lo = mid + 1;\n                else hi = mid;\n            }while (lo < hi);\n        }\n        return lo;\n    }\n    function center(a, x, lo = 0, hi = a.length) {\n        const i = left(a, x, lo, hi - 1);\n        return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n    }\n    return {\n        left,\n        center,\n        right\n    };\n}\nexports.default = bisector;\n\n},{\"./ascending.js\":\"iBXNJ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7k2Rl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _internmap = require(\"internmap\");\nfunction intersection(values, ...others) {\n    values = new (0, _internmap.InternSet)(values);\n    others = others.map(set);\n    out: for (const value of values){\n        for (const other of others)if (!other.has(value)) {\n            values.delete(value);\n            continue out;\n        }\n    }\n    return values;\n}\nexports.default = intersection;\nfunction set(values) {\n    return values instanceof (0, _internmap.InternSet) ? values : new (0, _internmap.InternSet)(values);\n}\n\n},{\"internmap\":\"3ULAv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9JG19\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar _internmap = require(\"internmap\");\nfunction union(...others) {\n    const set = new (0, _internmap.InternSet)();\n    for (const other of others)for (const o of other)set.add(o);\n    return set;\n}\nexports.default = union;\n\n},{\"internmap\":\"3ULAv\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9KcWf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ASTNode\", ()=>ASTNode);\nparcelHelpers.export(exports, \"ArrayExpression\", ()=>ArrayExpression);\nparcelHelpers.export(exports, \"BinaryExpression\", ()=>BinaryExpression);\nparcelHelpers.export(exports, \"CallExpression\", ()=>CallExpression);\nparcelHelpers.export(exports, \"ConditionalExpression\", ()=>ConditionalExpression);\nparcelHelpers.export(exports, \"Identifier\", ()=>Identifier);\nparcelHelpers.export(exports, \"Literal\", ()=>Literal);\nparcelHelpers.export(exports, \"LogicalExpression\", ()=>LogicalExpression);\nparcelHelpers.export(exports, \"MemberExpression\", ()=>MemberExpression);\nparcelHelpers.export(exports, \"ObjectExpression\", ()=>ObjectExpression);\nparcelHelpers.export(exports, \"Property\", ()=>Property);\nparcelHelpers.export(exports, \"RawCode\", ()=>RawCode);\nparcelHelpers.export(exports, \"UnaryExpression\", ()=>UnaryExpression);\nparcelHelpers.export(exports, \"codegenExpression\", ()=>codegen);\nparcelHelpers.export(exports, \"constants\", ()=>Constants);\nparcelHelpers.export(exports, \"functions\", ()=>Functions);\nparcelHelpers.export(exports, \"parseExpression\", ()=>parser);\nvar _vegaUtil = require(\"vega-util\");\nconst RawCode = \"RawCode\";\nconst Literal = \"Literal\";\nconst Property = \"Property\";\nconst Identifier = \"Identifier\";\nconst ArrayExpression = \"ArrayExpression\";\nconst BinaryExpression = \"BinaryExpression\";\nconst CallExpression = \"CallExpression\";\nconst ConditionalExpression = \"ConditionalExpression\";\nconst LogicalExpression = \"LogicalExpression\";\nconst MemberExpression = \"MemberExpression\";\nconst ObjectExpression = \"ObjectExpression\";\nconst UnaryExpression = \"UnaryExpression\";\nfunction ASTNode(type) {\n    this.type = type;\n}\nASTNode.prototype.visit = function(visitor) {\n    let c, i, n;\n    if (visitor(this)) return 1;\n    for(c = children(this), i = 0, n = c.length; i < n; ++i){\n        if (c[i].visit(visitor)) return 1;\n    }\n};\nfunction children(node) {\n    switch(node.type){\n        case ArrayExpression:\n            return node.elements;\n        case BinaryExpression:\n        case LogicalExpression:\n            return [\n                node.left,\n                node.right\n            ];\n        case CallExpression:\n            return [\n                node.callee\n            ].concat(node.arguments);\n        case ConditionalExpression:\n            return [\n                node.test,\n                node.consequent,\n                node.alternate\n            ];\n        case MemberExpression:\n            return [\n                node.object,\n                node.property\n            ];\n        case ObjectExpression:\n            return node.properties;\n        case Property:\n            return [\n                node.key,\n                node.value\n            ];\n        case UnaryExpression:\n            return [\n                node.argument\n            ];\n        case Identifier:\n        case Literal:\n        case RawCode:\n        default:\n            return [];\n    }\n}\n/*\n  The following expression parser is based on Esprima (http://esprima.org/).\n  Original header comment and license for Esprima is included here:\n\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/ var TokenName, source, index, length, lookahead;\nvar TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\nTokenName = {};\nTokenName[TokenBooleanLiteral] = \"Boolean\";\nTokenName[TokenEOF] = \"<end>\";\nTokenName[TokenIdentifier] = \"Identifier\";\nTokenName[TokenKeyword] = \"Keyword\";\nTokenName[TokenNullLiteral] = \"Null\";\nTokenName[TokenNumericLiteral] = \"Numeric\";\nTokenName[TokenPunctuator] = \"Punctuator\";\nTokenName[TokenStringLiteral] = \"String\";\nTokenName[TokenRegularExpression] = \"RegularExpression\";\nvar SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\"; // Error messages should be identical to V8.\nvar MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\nvar ILLEGAL = \"ILLEGAL\", DISABLED = \"Disabled.\"; // See also tools/generate-unicode-regex.py.\nvar RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), // eslint-disable-next-line no-misleading-character-class\nRegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"); // Ensure the condition is true, otherwise throw an error.\n// This is only to have a better contract semantic, i.e. another safety net\n// to catch a logic error. The condition shall be fulfilled in normal case.\n// Do NOT use this to enforce a certain condition on any user input.\nfunction assert(condition, message) {\n    /* istanbul ignore next */ if (!condition) throw new Error(\"ASSERT: \" + message);\n}\nfunction isDecimalDigit(ch) {\n    return ch >= 0x30 && ch <= 0x39; // 0..9\n}\nfunction isHexDigit(ch) {\n    return \"0123456789abcdefABCDEF\".indexOf(ch) >= 0;\n}\nfunction isOctalDigit(ch) {\n    return \"01234567\".indexOf(ch) >= 0;\n} // 7.2 White Space\nfunction isWhiteSpace(ch) {\n    return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && [\n        0x1680,\n        0x180E,\n        0x2000,\n        0x2001,\n        0x2002,\n        0x2003,\n        0x2004,\n        0x2005,\n        0x2006,\n        0x2007,\n        0x2008,\n        0x2009,\n        0x200A,\n        0x202F,\n        0x205F,\n        0x3000,\n        0xFEFF\n    ].indexOf(ch) >= 0;\n} // 7.3 Line Terminators\nfunction isLineTerminator(ch) {\n    return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;\n} // 7.6 Identifier Names and Identifiers\nfunction isIdentifierStart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch));\n}\nfunction isIdentifierPart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch >= 0x30 && ch <= 0x39 || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch));\n} // 7.6.1.1 Keywords\nconst keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n};\nfunction skipComment() {\n    while(index < length){\n        const ch = source.charCodeAt(index);\n        if (isWhiteSpace(ch) || isLineTerminator(ch)) ++index;\n        else break;\n    }\n}\nfunction scanHexEscape(prefix) {\n    var i, len, ch, code = 0;\n    len = prefix === \"u\" ? 4 : 2;\n    for(i = 0; i < len; ++i)if (index < length && isHexDigit(source[index])) {\n        ch = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    } else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return String.fromCharCode(code);\n}\nfunction scanUnicodeCodePointEscape() {\n    var ch, code, cu1, cu2;\n    ch = source[index];\n    code = 0; // At least, one hex digit is required.\n    if (ch === \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    while(index < length){\n        ch = source[index++];\n        if (!isHexDigit(ch)) break;\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    }\n    if (code > 0x10FFFF || ch !== \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // UTF-16 Encoding\n    if (code <= 0xFFFF) return String.fromCharCode(code);\n    cu1 = (code - 0x10000 >> 10) + 0xD800;\n    cu2 = (code - 0x10000 & 1023) + 0xDC00;\n    return String.fromCharCode(cu1, cu2);\n}\nfunction getEscapedIdentifier() {\n    var ch, id;\n    ch = source.charCodeAt(index++);\n    id = String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n    if (ch === 0x5C) {\n        if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        ++index;\n        ch = scanHexEscape(\"u\");\n        if (!ch || ch === \"\\\\\" || !isIdentifierStart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        id = ch;\n    }\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (!isIdentifierPart(ch)) break;\n        ++index;\n        id += String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n        if (ch === 0x5C) {\n            id = id.substr(0, id.length - 1);\n            if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            ++index;\n            ch = scanHexEscape(\"u\");\n            if (!ch || ch === \"\\\\\" || !isIdentifierPart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            id += ch;\n        }\n    }\n    return id;\n}\nfunction getIdentifier() {\n    var start, ch;\n    start = index++;\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (ch === 0x5C) {\n            // Blackslash (U+005C) marks Unicode escape sequence.\n            index = start;\n            return getEscapedIdentifier();\n        }\n        if (isIdentifierPart(ch)) ++index;\n        else break;\n    }\n    return source.slice(start, index);\n}\nfunction scanIdentifier() {\n    var start, id, type;\n    start = index; // Backslash (U+005C) starts an escaped character.\n    id = source.charCodeAt(index) === 0x5C ? getEscapedIdentifier() : getIdentifier(); // There is no keyword or literal with only one character.\n    // Thus, it must be an identifier.\n    if (id.length === 1) type = TokenIdentifier;\n    else if (keywords.hasOwnProperty(id)) // eslint-disable-line no-prototype-builtins\n    type = TokenKeyword;\n    else if (id === \"null\") type = TokenNullLiteral;\n    else if (id === \"true\" || id === \"false\") type = TokenBooleanLiteral;\n    else type = TokenIdentifier;\n    return {\n        type: type,\n        value: id,\n        start: start,\n        end: index\n    };\n} // 7.7 Punctuators\nfunction scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch(code){\n        // Check for most common single-character punctuators.\n        case 0x2E:\n        case 0x28:\n        case 0x29:\n        case 0x3B:\n        case 0x2C:\n        case 0x7B:\n        case 0x7D:\n        case 0x5B:\n        case 0x5D:\n        case 0x3A:\n        case 0x3F:\n        case 0x7E:\n            // ~\n            ++index;\n            return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code),\n                start: start,\n                end: index\n            };\n        default:\n            code2 = source.charCodeAt(index + 1); // '=' (U+003D) marks an assignment or comparison operator.\n            if (code2 === 0x3D) switch(code){\n                case 0x2B:\n                case 0x2D:\n                case 0x2F:\n                case 0x3C:\n                case 0x3E:\n                case 0x5E:\n                case 0x7C:\n                case 0x25:\n                case 0x26:\n                case 0x2A:\n                    // *\n                    index += 2;\n                    return {\n                        type: TokenPunctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        start: start,\n                        end: index\n                    };\n                case 0x21:\n                case 0x3D:\n                    // =\n                    index += 2; // !== and ===\n                    if (source.charCodeAt(index) === 0x3D) ++index;\n                    return {\n                        type: TokenPunctuator,\n                        value: source.slice(start, index),\n                        start: start,\n                        end: index\n                    };\n            }\n    } // 4-character punctuator: >>>=\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n        index += 4;\n        return {\n            type: TokenPunctuator,\n            value: ch4,\n            start: start,\n            end: index\n        };\n    } // 3-character punctuators: === !== >>> <<= >>=\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n        index += 3;\n        return {\n            type: TokenPunctuator,\n            value: ch3,\n            start: start,\n            end: index\n        };\n    } // Other 2-character punctuators: ++ -- << >> && ||\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".indexOf(ch1) >= 0 || ch2 === \"=>\") {\n        index += 2;\n        return {\n            type: TokenPunctuator,\n            value: ch2,\n            start: start,\n            end: index\n        };\n    }\n    if (ch2 === \"//\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // 1-character punctuators: < > = ! + - * % & | ^ /\n    if (\"<>=!+-*%&|^/\".indexOf(ch1) >= 0) {\n        ++index;\n        return {\n            type: TokenPunctuator,\n            value: ch1,\n            start: start,\n            end: index\n        };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n} // 7.8.3 Numeric Literals\nfunction scanHexLiteral(start) {\n    let number = \"\";\n    while(index < length){\n        if (!isHexDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (number.length === 0) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(\"0x\" + number, 16),\n        start: start,\n        end: index\n    };\n}\nfunction scanOctalLiteral(start) {\n    let number = \"0\" + source[index++];\n    while(index < length){\n        if (!isOctalDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(number, 8),\n        octal: true,\n        start: start,\n        end: index\n    };\n}\nfunction scanNumericLiteral() {\n    var number, start, ch;\n    ch = source[index];\n    assert(isDecimalDigit(ch.charCodeAt(0)) || ch === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number = \"\";\n    if (ch !== \".\") {\n        number = source[index++];\n        ch = source[index]; // Hex number starts with '0x'.\n        // Octal number starts with '0'.\n        if (number === \"0\") {\n            if (ch === \"x\" || ch === \"X\") {\n                ++index;\n                return scanHexLiteral(start);\n            }\n            if (isOctalDigit(ch)) return scanOctalLiteral(start);\n             // decimal number starts with '0' such as '09' is illegal.\n            if (ch && isDecimalDigit(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        }\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \".\") {\n        number += source[index++];\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \"e\" || ch === \"E\") {\n        number += source[index++];\n        ch = source[index];\n        if (ch === \"+\" || ch === \"-\") number += source[index++];\n        if (isDecimalDigit(source.charCodeAt(index))) while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseFloat(number),\n        start: start,\n        end: index\n    };\n} // 7.8.4 String Literals\nfunction scanStringLiteral() {\n    var str = \"\", quote, start, ch, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while(index < length){\n        ch = source[index++];\n        if (ch === quote) {\n            quote = \"\";\n            break;\n        } else if (ch === \"\\\\\") {\n            ch = source[index++];\n            if (!ch || !isLineTerminator(ch.charCodeAt(0))) switch(ch){\n                case \"u\":\n                case \"x\":\n                    if (source[index] === \"{\") {\n                        ++index;\n                        str += scanUnicodeCodePointEscape();\n                    } else str += scanHexEscape(ch);\n                    break;\n                case \"n\":\n                    str += \"\\n\";\n                    break;\n                case \"r\":\n                    str += \"\\r\";\n                    break;\n                case \"t\":\n                    str += \"\t\";\n                    break;\n                case \"b\":\n                    str += \"\\b\";\n                    break;\n                case \"f\":\n                    str += \"\\f\";\n                    break;\n                case \"v\":\n                    str += \"\\v\";\n                    break;\n                default:\n                    if (isOctalDigit(ch)) {\n                        code = \"01234567\".indexOf(ch); // \\0 is not octal escape sequence\n                        if (code !== 0) octal = true;\n                        if (index < length && isOctalDigit(source[index])) {\n                            octal = true;\n                            code = code * 8 + \"01234567\".indexOf(source[index++]); // 3 digits are only allowed when string starts\n                            // with 0, 1, 2, 3\n                            if (\"0123\".indexOf(ch) >= 0 && index < length && isOctalDigit(source[index])) code = code * 8 + \"01234567\".indexOf(source[index++]);\n                        }\n                        str += String.fromCharCode(code);\n                    } else str += ch;\n                    break;\n            }\n            else if (ch === \"\\r\" && source[index] === \"\\n\") ++index;\n        } else if (isLineTerminator(ch.charCodeAt(0))) break;\n        else str += ch;\n    }\n    if (quote !== \"\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenStringLiteral,\n        value: str,\n        octal: octal,\n        start: start,\n        end: index\n    };\n}\nfunction testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.indexOf(\"u\") >= 0) // Replace each astral symbol and every Unicode code point\n    // escape sequence with a single ASCII symbol to avoid throwing on\n    // regular expressions that are only valid in combination with the\n    // `/u` flag.\n    // Note: replacing with the ASCII symbol `x` might cause false\n    // negatives in unlikely scenarios. For example, `[\\u{61}-b]` is a\n    // perfectly valid pattern that is equivalent to `[a-b]`, but it\n    // would be replaced by `[x-b]` which throws an error.\n    tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1)=>{\n        if (parseInt($1, 16) <= 0x10FFFF) return \"x\";\n        throwError({}, MessageInvalidRegExp);\n    }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n     // First, detect invalid regular expressions.\n    try {\n        new RegExp(tmp);\n    } catch (e) {\n        throwError({}, MessageInvalidRegExp);\n    } // Return a regular expression object for this pattern-flag pair, or\n    // `null` in case the current environment doesn't support the flags it\n    // uses.\n    try {\n        return new RegExp(pattern, flags);\n    } catch (exception) {\n        return null;\n    }\n}\nfunction scanRegExpBody() {\n    var ch, str, classMarker, terminated, body;\n    ch = source[index];\n    assert(ch === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while(index < length){\n        ch = source[index++];\n        str += ch;\n        if (ch === \"\\\\\") {\n            ch = source[index++]; // ECMA-262 7.8.5\n            if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n            str += ch;\n        } else if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n        else if (classMarker) {\n            if (ch === \"]\") classMarker = false;\n        } else {\n            if (ch === \"/\") {\n                terminated = true;\n                break;\n            } else if (ch === \"[\") classMarker = true;\n        }\n    }\n    if (!terminated) throwError({}, MessageUnterminatedRegExp);\n     // Exclude leading and trailing slash.\n    body = str.substr(1, str.length - 2);\n    return {\n        value: body,\n        literal: str\n    };\n}\nfunction scanRegExpFlags() {\n    var ch, str, flags;\n    str = \"\";\n    flags = \"\";\n    while(index < length){\n        ch = source[index];\n        if (!isIdentifierPart(ch.charCodeAt(0))) break;\n        ++index;\n        if (ch === \"\\\\\" && index < length) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        else {\n            flags += ch;\n            str += ch;\n        }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) throwError({}, MessageInvalidRegExp, flags);\n    return {\n        value: flags,\n        literal: str\n    };\n}\nfunction scanRegExp() {\n    var start, body, flags, value;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value = testRegExp(body.value, flags.value);\n    return {\n        literal: body.literal + flags.literal,\n        value: value,\n        regex: {\n            pattern: body.value,\n            flags: flags.value\n        },\n        start: start,\n        end: index\n    };\n}\nfunction isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n}\nfunction advance() {\n    skipComment();\n    if (index >= length) return {\n        type: TokenEOF,\n        start: index,\n        end: index\n    };\n    const ch = source.charCodeAt(index);\n    if (isIdentifierStart(ch)) return scanIdentifier();\n     // Very common: ( and ) and ;\n    if (ch === 0x28 || ch === 0x29 || ch === 0x3B) return scanPunctuator();\n     // String literal starts with single quote (U+0027) or double quote (U+0022).\n    if (ch === 0x27 || ch === 0x22) return scanStringLiteral();\n     // Dot (.) U+002E can also start a floating-point number, hence the need\n    // to check the next character.\n    if (ch === 0x2E) {\n        if (isDecimalDigit(source.charCodeAt(index + 1))) return scanNumericLiteral();\n        return scanPunctuator();\n    }\n    if (isDecimalDigit(ch)) return scanNumericLiteral();\n    return scanPunctuator();\n}\nfunction lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n}\nfunction peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n}\nfunction finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n}\nfunction finishBinaryExpression(operator, left, right) {\n    const node = new ASTNode(operator === \"||\" || operator === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator;\n    node.left = left;\n    node.right = right;\n    return node;\n}\nfunction finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n}\nfunction finishConditionalExpression(test, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n}\nfunction finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n}\nfunction finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n        if (node.raw === \"//\") node.raw = \"/(?:)/\";\n        node.regex = token.regex;\n    }\n    return node;\n}\nfunction finishMemberExpression(accessor, object, property) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor === \"[\";\n    node.object = object;\n    node.property = property;\n    if (!node.computed) property.member = true;\n    return node;\n}\nfunction finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n}\nfunction finishProperty(kind, key, value) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key;\n    node.value = value;\n    node.kind = kind;\n    return node;\n}\nfunction finishUnaryExpression(operator, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n} // Throw an exception\nfunction throwError(token, messageFormat) {\n    var error, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index1)=>{\n        assert(index1 < args.length, \"Message reference must be in range\");\n        return args[index1];\n    });\n    error = new Error(msg);\n    error.index = index;\n    error.description = msg;\n    throw error;\n} // Throw an exception because of the token.\nfunction throwUnexpected(token) {\n    if (token.type === TokenEOF) throwError(token, MessageUnexpectedEOS);\n    if (token.type === TokenNumericLiteral) throwError(token, MessageUnexpectedNumber);\n    if (token.type === TokenStringLiteral) throwError(token, MessageUnexpectedString);\n    if (token.type === TokenIdentifier) throwError(token, MessageUnexpectedIdentifier);\n    if (token.type === TokenKeyword) throwError(token, MessageUnexpectedReserved);\n     // BooleanLiteral, NullLiteral, or Punctuator.\n    throwError(token, MessageUnexpectedToken, token.value);\n} // Expect the next token to match the specified punctuator.\n// If not, an exception will be thrown.\nfunction expect(value) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value) throwUnexpected(token);\n} // Return true if the next token matches the specified punctuator.\nfunction match(value) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value;\n} // Return true if the next token matches the specified keyword\nfunction matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n} // 11.1.4 Array Initialiser\nfunction parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while(!match(\"]\"))if (match(\",\")) {\n        lex();\n        elements.push(null);\n    } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) expect(\",\");\n    }\n    lex();\n    return finishArrayExpression(elements);\n} // 11.1.5 Object Initialiser\nfunction parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex(); // Note: This function is called only from parseObjectProperty(), where\n    // EOF and Punctuator tokens are already filtered out.\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n        if (token.octal) throwError(token, MessageStrictOctalLiteral);\n        return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n}\nfunction parseObjectProperty() {\n    var token, key, id, value;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n        id = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", id, value);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) throwUnexpected(token);\n    else {\n        key = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", key, value);\n    }\n}\nfunction parseObjectInitialiser() {\n    var properties = [], property, name, key, map = {}, toString = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while(!match(\"}\")){\n        property = parseObjectProperty();\n        if (property.key.type === SyntaxIdentifier) name = property.key.name;\n        else name = toString(property.key.value);\n        key = \"$\" + name;\n        if (Object.prototype.hasOwnProperty.call(map, key)) throwError({}, MessageStrictDuplicateProperty);\n        else map[key] = true;\n        properties.push(property);\n        if (!match(\"}\")) expect(\",\");\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n} // 11.1.6 The Grouping Operator\nfunction parseGroupExpression() {\n    expect(\"(\");\n    const expr = parseExpression();\n    expect(\")\");\n    return expr;\n} // 11.1 Primary Expressions\nconst legalKeywords = {\n    \"if\": 1\n};\nfunction parsePrimaryExpression() {\n    var type, token, expr;\n    if (match(\"(\")) return parseGroupExpression();\n    if (match(\"[\")) return parseArrayInitialiser();\n    if (match(\"{\")) return parseObjectInitialiser();\n    type = lookahead.type;\n    index = lookahead.start;\n    if (type === TokenIdentifier || legalKeywords[lookahead.value]) expr = finishIdentifier(lex().value);\n    else if (type === TokenStringLiteral || type === TokenNumericLiteral) {\n        if (lookahead.octal) throwError(lookahead, MessageStrictOctalLiteral);\n        expr = finishLiteral(lex());\n    } else if (type === TokenKeyword) throw new Error(DISABLED);\n    else if (type === TokenBooleanLiteral) {\n        token = lex();\n        token.value = token.value === \"true\";\n        expr = finishLiteral(token);\n    } else if (type === TokenNullLiteral) {\n        token = lex();\n        token.value = null;\n        expr = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n        expr = finishLiteral(scanRegExp());\n        peek();\n    } else throwUnexpected(lex());\n    return expr;\n} // 11.2 Left-Hand-Side Expressions\nfunction parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) while(index < length){\n        args.push(parseConditionalExpression());\n        if (match(\")\")) break;\n        expect(\",\");\n    }\n    expect(\")\");\n    return args;\n}\nfunction parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) throwUnexpected(token);\n    return finishIdentifier(token.value);\n}\nfunction parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n}\nfunction parseComputedMember() {\n    expect(\"[\");\n    const expr = parseExpression();\n    expect(\"]\");\n    return expr;\n}\nfunction parseLeftHandSideExpressionAllowCall() {\n    var expr, args, property;\n    expr = parsePrimaryExpression();\n    for(;;){\n        if (match(\".\")) {\n            property = parseNonComputedMember();\n            expr = finishMemberExpression(\".\", expr, property);\n        } else if (match(\"(\")) {\n            args = parseArguments();\n            expr = finishCallExpression(expr, args);\n        } else if (match(\"[\")) {\n            property = parseComputedMember();\n            expr = finishMemberExpression(\"[\", expr, property);\n        } else break;\n    }\n    return expr;\n} // 11.3 Postfix Expressions\nfunction parsePostfixExpression() {\n    const expr = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n        if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    }\n    return expr;\n} // 11.4 Unary Operators\nfunction parseUnaryExpression() {\n    var token, expr;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) expr = parsePostfixExpression();\n    else if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n        token = lex();\n        expr = parseUnaryExpression();\n        expr = finishUnaryExpression(token.value, expr);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) throw new Error(DISABLED);\n    else expr = parsePostfixExpression();\n    return expr;\n}\nfunction binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) return 0;\n    switch(token.value){\n        case \"||\":\n            prec = 1;\n            break;\n        case \"&&\":\n            prec = 2;\n            break;\n        case \"|\":\n            prec = 3;\n            break;\n        case \"^\":\n            prec = 4;\n            break;\n        case \"&\":\n            prec = 5;\n            break;\n        case \"==\":\n        case \"!=\":\n        case \"===\":\n        case \"!==\":\n            prec = 6;\n            break;\n        case \"<\":\n        case \">\":\n        case \"<=\":\n        case \">=\":\n        case \"instanceof\":\n        case \"in\":\n            prec = 7;\n            break;\n        case \"<<\":\n        case \">>\":\n        case \">>>\":\n            prec = 8;\n            break;\n        case \"+\":\n        case \"-\":\n            prec = 9;\n            break;\n        case \"*\":\n        case \"/\":\n        case \"%\":\n            prec = 11;\n            break;\n    }\n    return prec;\n} // 11.5 Multiplicative Operators\n// 11.6 Additive Operators\n// 11.7 Bitwise Shift Operators\n// 11.8 Relational Operators\n// 11.9 Equality Operators\n// 11.10 Binary Bitwise Operators\n// 11.11 Binary Logical Operators\nfunction parseBinaryExpression() {\n    var marker, markers, expr, token, prec, stack, right, operator, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) return left;\n    token.prec = prec;\n    lex();\n    markers = [\n        marker,\n        lookahead\n    ];\n    right = parseUnaryExpression();\n    stack = [\n        left,\n        token,\n        right\n    ];\n    while((prec = binaryPrecedence(lookahead)) > 0){\n        // Reduce: make a binary expression from the three topmost entries.\n        while(stack.length > 2 && prec <= stack[stack.length - 2].prec){\n            right = stack.pop();\n            operator = stack.pop().value;\n            left = stack.pop();\n            markers.pop();\n            expr = finishBinaryExpression(operator, left, right);\n            stack.push(expr);\n        } // Shift.\n        token = lex();\n        token.prec = prec;\n        stack.push(token);\n        markers.push(lookahead);\n        expr = parseUnaryExpression();\n        stack.push(expr);\n    } // Final reduce to clean-up the stack.\n    i = stack.length - 1;\n    expr = stack[i];\n    markers.pop();\n    while(i > 1){\n        markers.pop();\n        expr = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n        i -= 2;\n    }\n    return expr;\n} // 11.12 Conditional Operator\nfunction parseConditionalExpression() {\n    var expr, consequent, alternate;\n    expr = parseBinaryExpression();\n    if (match(\"?\")) {\n        lex();\n        consequent = parseConditionalExpression();\n        expect(\":\");\n        alternate = parseConditionalExpression();\n        expr = finishConditionalExpression(expr, consequent, alternate);\n    }\n    return expr;\n} // 11.14 Comma Operator\nfunction parseExpression() {\n    const expr = parseConditionalExpression();\n    if (match(\",\")) throw new Error(DISABLED); // no sequence expressions\n    return expr;\n}\nfunction parser(code) {\n    source = code;\n    index = 0;\n    length = source.length;\n    lookahead = null;\n    peek();\n    const expr = parseExpression();\n    if (lookahead.type !== TokenEOF) throw new Error(\"Unexpect token after expression.\");\n    return expr;\n}\nvar Constants = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n};\nfunction Functions(codegen1) {\n    function fncall(name, args, cast, type) {\n        let obj = codegen1(args[0]);\n        if (cast) {\n            obj = cast + \"(\" + obj + \")\";\n            if (cast.lastIndexOf(\"new \", 0) === 0) obj = \"(\" + obj + \")\";\n        }\n        return obj + \".\" + name + (type < 0 ? \"\" : type === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen1).join(\",\") + \")\");\n    }\n    function fn(name, cast, type) {\n        return (args)=>fncall(name, args, cast, type);\n    }\n    const DATE = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n        // MATH functions\n        isNaN: \"Number.isNaN\",\n        isFinite: \"Number.isFinite\",\n        abs: \"Math.abs\",\n        acos: \"Math.acos\",\n        asin: \"Math.asin\",\n        atan: \"Math.atan\",\n        atan2: \"Math.atan2\",\n        ceil: \"Math.ceil\",\n        cos: \"Math.cos\",\n        exp: \"Math.exp\",\n        floor: \"Math.floor\",\n        log: \"Math.log\",\n        max: \"Math.max\",\n        min: \"Math.min\",\n        pow: \"Math.pow\",\n        random: \"Math.random\",\n        round: \"Math.round\",\n        sin: \"Math.sin\",\n        sqrt: \"Math.sqrt\",\n        tan: \"Math.tan\",\n        clamp: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to clamp function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to clamp function.\");\n            const a = args.map(codegen1);\n            return \"Math.max(\" + a[1] + \", Math.min(\" + a[2] + \",\" + a[0] + \"))\";\n        },\n        // DATE functions\n        now: \"Date.now\",\n        utc: \"Date.UTC\",\n        datetime: DATE,\n        date: fn(\"getDate\", DATE, 0),\n        day: fn(\"getDay\", DATE, 0),\n        year: fn(\"getFullYear\", DATE, 0),\n        month: fn(\"getMonth\", DATE, 0),\n        hours: fn(\"getHours\", DATE, 0),\n        minutes: fn(\"getMinutes\", DATE, 0),\n        seconds: fn(\"getSeconds\", DATE, 0),\n        milliseconds: fn(\"getMilliseconds\", DATE, 0),\n        time: fn(\"getTime\", DATE, 0),\n        timezoneoffset: fn(\"getTimezoneOffset\", DATE, 0),\n        utcdate: fn(\"getUTCDate\", DATE, 0),\n        utcday: fn(\"getUTCDay\", DATE, 0),\n        utcyear: fn(\"getUTCFullYear\", DATE, 0),\n        utcmonth: fn(\"getUTCMonth\", DATE, 0),\n        utchours: fn(\"getUTCHours\", DATE, 0),\n        utcminutes: fn(\"getUTCMinutes\", DATE, 0),\n        utcseconds: fn(\"getUTCSeconds\", DATE, 0),\n        utcmilliseconds: fn(\"getUTCMilliseconds\", DATE, 0),\n        // sequence functions\n        length: fn(\"length\", null, -1),\n        // STRING functions\n        parseFloat: \"parseFloat\",\n        parseInt: \"parseInt\",\n        upper: fn(\"toUpperCase\", STRING, 0),\n        lower: fn(\"toLowerCase\", STRING, 0),\n        substring: fn(\"substring\", STRING),\n        split: fn(\"split\", STRING),\n        trim: fn(\"trim\", STRING, 0),\n        // REGEXP functions\n        regexp: REGEXP,\n        test: fn(\"test\", REGEXP),\n        // Control Flow functions\n        if: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to if function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to if function.\");\n            const a = args.map(codegen1);\n            return \"(\" + a[0] + \"?\" + a[1] + \":\" + a[2] + \")\";\n        }\n    };\n}\nfunction stripQuotes(s) {\n    const n = s && s.length - 1;\n    return n && (s[0] === '\"' && s[n] === '\"' || s[0] === \"'\" && s[n] === \"'\") ? s.slice(1, -1) : s;\n}\nfunction codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? (0, _vegaUtil.toSet)(opt.allowed) : {}, forbidden = opt.forbidden ? (0, _vegaUtil.toSet)(opt.forbidden) : {}, constants = opt.constants || Constants, functions = (opt.functions || Functions)(visit), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = (0, _vegaUtil.isFunction)(globalvar) ? globalvar : (id)=>`${globalvar}[\"${id}\"]`;\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit(ast) {\n        if ((0, _vegaUtil.isString)(ast)) return ast;\n        const generator = Generators[ast.type];\n        if (generator == null) (0, _vegaUtil.error)(\"Unsupported type: \" + ast.type);\n        return generator(ast);\n    }\n    const Generators = {\n        Literal: (n)=>n.raw,\n        Identifier: (n)=>{\n            const id = n.name;\n            if (memberDepth > 0) return id;\n            else if ((0, _vegaUtil.hasOwnProperty)(forbidden, id)) return (0, _vegaUtil.error)(\"Illegal identifier: \" + id);\n            else if ((0, _vegaUtil.hasOwnProperty)(constants, id)) return constants[id];\n            else if ((0, _vegaUtil.hasOwnProperty)(allowed, id)) return id;\n            else {\n                globals[id] = 1;\n                return outputGlobal(id);\n            }\n        },\n        MemberExpression: (n)=>{\n            const d = !n.computed, o = visit(n.object);\n            if (d) memberDepth += 1;\n            const p = visit(n.property);\n            if (o === fieldvar) // strip quotes to sanitize field name (#1653)\n            fields[stripQuotes(p)] = 1;\n            if (d) memberDepth -= 1;\n            return o + (d ? \".\" + p : \"[\" + p + \"]\");\n        },\n        CallExpression: (n)=>{\n            if (n.callee.type !== \"Identifier\") (0, _vegaUtil.error)(\"Illegal callee type: \" + n.callee.type);\n            const callee = n.callee.name, args = n.arguments, fn = (0, _vegaUtil.hasOwnProperty)(functions, callee) && functions[callee];\n            if (!fn) (0, _vegaUtil.error)(\"Unrecognized function: \" + callee);\n            return (0, _vegaUtil.isFunction)(fn) ? fn(args) : fn + \"(\" + args.map(visit).join(\",\") + \")\";\n        },\n        ArrayExpression: (n)=>\"[\" + n.elements.map(visit).join(\",\") + \"]\",\n        BinaryExpression: (n)=>\"(\" + visit(n.left) + \" \" + n.operator + \" \" + visit(n.right) + \")\",\n        UnaryExpression: (n)=>\"(\" + n.operator + visit(n.argument) + \")\",\n        ConditionalExpression: (n)=>\"(\" + visit(n.test) + \"?\" + visit(n.consequent) + \":\" + visit(n.alternate) + \")\",\n        LogicalExpression: (n)=>\"(\" + visit(n.left) + n.operator + visit(n.right) + \")\",\n        ObjectExpression: (n)=>\"{\" + n.properties.map(visit).join(\",\") + \"}\",\n        Property: (n)=>{\n            memberDepth += 1;\n            const k = visit(n.key);\n            memberDepth -= 1;\n            return k + \":\" + visit(n.value);\n        }\n    };\n    function codegen2(ast) {\n        const result = {\n            code: visit(ast),\n            globals: Object.keys(globals),\n            fields: Object.keys(fields)\n        };\n        globals = {};\n        fields = {};\n        return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants;\n    return codegen2;\n}\n\n},{\"vega-util\":\"bApja\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k7ppL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"context\", ()=>context);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaDataflow = require(\"vega-dataflow\");\n/**\n * Parse a serialized dataflow specification.\n */ function parse(spec) {\n    const ctx = this, operators = spec.operators || []; // parse background\n    if (spec.background) ctx.background = spec.background;\n     // parse event configuration\n    if (spec.eventConfig) ctx.eventConfig = spec.eventConfig;\n     // parse locale configuration\n    if (spec.locale) ctx.locale = spec.locale;\n     // parse operators\n    operators.forEach((entry)=>ctx.parseOperator(entry)); // parse operator parameters\n    operators.forEach((entry)=>ctx.parseOperatorParameters(entry)); // parse streams\n    (spec.streams || []).forEach((entry)=>ctx.parseStream(entry)); // parse updates\n    (spec.updates || []).forEach((entry)=>ctx.parseUpdate(entry));\n    return ctx.resolve();\n}\nconst Skip = (0, _vegaUtil.toSet)([\n    \"rule\"\n]), Swap = (0, _vegaUtil.toSet)([\n    \"group\",\n    \"image\",\n    \"rect\"\n]);\nfunction adjustSpatial(encode, marktype) {\n    let code = \"\";\n    if (Skip[marktype]) return code;\n    if (encode.x2) {\n        if (encode.x) {\n            if (Swap[marktype]) code += \"if(o.x>o.x2)$=o.x,o.x=o.x2,o.x2=$;\";\n            code += \"o.width=o.x2-o.x;\";\n        } else code += \"o.x=o.x2-(o.width||0);\";\n    }\n    if (encode.xc) code += \"o.x=o.xc-(o.width||0)/2;\";\n    if (encode.y2) {\n        if (encode.y) {\n            if (Swap[marktype]) code += \"if(o.y>o.y2)$=o.y,o.y=o.y2,o.y2=$;\";\n            code += \"o.height=o.y2-o.y;\";\n        } else code += \"o.y=o.y2-(o.height||0);\";\n    }\n    if (encode.yc) code += \"o.y=o.yc-(o.height||0)/2;\";\n    return code;\n}\nfunction canonicalType(type) {\n    return (type + \"\").toLowerCase();\n}\nfunction isOperator(type) {\n    return canonicalType(type) === \"operator\";\n}\nfunction isCollect(type) {\n    return canonicalType(type) === \"collect\";\n}\nfunction expression(ctx, args, code) {\n    // wrap code in return statement if expression does not terminate\n    if (code[code.length - 1] !== \";\") code = \"return(\" + code + \");\";\n    const fn = Function(...args.concat(code));\n    return ctx && ctx.functions ? fn.bind(ctx.functions) : fn;\n} // generate code for comparing a single field\nfunction _compare(u, v, lt, gt) {\n    return \"((u = \".concat(u, \") < (v = \").concat(v, \") || u == null) && v != null ? \").concat(lt, \"\\n  : (u > v || v == null) && u != null ? \").concat(gt, \"\\n  : ((v = v instanceof Date ? +v : v), (u = u instanceof Date ? +u : u)) !== u && v === v ? \").concat(lt, \"\\n  : v !== v && u === u ? \").concat(gt, \" : \");\n}\nvar expressionCodegen = {\n    /**\n   * Parse an expression used to update an operator value.\n   */ operator: (ctx, expr)=>expression(ctx, [\n            \"_\"\n        ], expr.code),\n    /**\n   * Parse an expression provided as an operator parameter value.\n   */ parameter: (ctx, expr)=>expression(ctx, [\n            \"datum\",\n            \"_\"\n        ], expr.code),\n    /**\n   * Parse an expression applied to an event stream.\n   */ event: (ctx, expr)=>expression(ctx, [\n            \"event\"\n        ], expr.code),\n    /**\n   * Parse an expression used to handle an event-driven operator update.\n   */ handler: (ctx, expr)=>{\n        const code = \"var datum=event.item&&event.item.datum;return \".concat(expr.code, \";\");\n        return expression(ctx, [\n            \"_\",\n            \"event\"\n        ], code);\n    },\n    /**\n   * Parse an expression that performs visual encoding.\n   */ encode: (ctx, encode)=>{\n        const { marktype , channels  } = encode;\n        let code = \"var o=item,datum=o.datum,m=0,$;\";\n        for(const name in channels){\n            const o = \"o[\" + (0, _vegaUtil.stringValue)(name) + \"]\";\n            code += \"$=\".concat(channels[name].code, \";if(\").concat(o, \"!==$)\").concat(o, \"=$,m=1;\");\n        }\n        code += adjustSpatial(channels, marktype);\n        code += \"return m;\";\n        return expression(ctx, [\n            \"item\",\n            \"_\"\n        ], code);\n    },\n    /**\n   * Optimized code generators for access and comparison.\n   */ codegen: {\n        get (path) {\n            const ref = \"[\".concat(path.map((0, _vegaUtil.stringValue)).join(\"][\"), \"]\");\n            const get = Function(\"_\", \"return _\".concat(ref, \";\"));\n            get.path = ref;\n            return get;\n        },\n        comparator (fields, orders) {\n            let t;\n            const map = (f, i)=>{\n                const o = orders[i];\n                let u, v;\n                if (f.path) {\n                    u = \"a\".concat(f.path);\n                    v = \"b\".concat(f.path);\n                } else {\n                    (t = t || {})[\"f\" + i] = f;\n                    u = \"this.f\".concat(i, \"(a)\");\n                    v = \"this.f\".concat(i, \"(b)\");\n                }\n                return _compare(u, v, -o, o);\n            };\n            const fn = Function(\"a\", \"b\", \"var u, v; return \" + fields.map(map).join(\"\") + \"0;\");\n            return t ? fn.bind(t) : fn;\n        }\n    }\n};\n/**\n * Parse a dataflow operator.\n */ function parseOperator(spec) {\n    const ctx = this;\n    if (isOperator(spec.type) || !spec.type) ctx.operator(spec, spec.update ? ctx.operatorExpression(spec.update) : null);\n    else ctx.transform(spec, spec.type);\n}\n/**\n * Parse and assign operator parameters.\n */ function parseOperatorParameters(spec) {\n    const ctx = this;\n    if (spec.params) {\n        const op = ctx.get(spec.id);\n        if (!op) (0, _vegaUtil.error)(\"Invalid operator id: \" + spec.id);\n        ctx.dataflow.connect(op, op.parameters(ctx.parseParameters(spec.params), spec.react, spec.initonly));\n    }\n}\n/**\n * Parse a set of operator parameters.\n */ function parseParameters(spec, params) {\n    params = params || {};\n    const ctx = this;\n    for(const key in spec){\n        const value = spec[key];\n        params[key] = (0, _vegaUtil.isArray)(value) ? value.map((v)=>parseParameter(v, ctx, params)) : parseParameter(value, ctx, params);\n    }\n    return params;\n}\n/**\n * Parse a single parameter.\n */ function parseParameter(spec, ctx, params) {\n    if (!spec || !(0, _vegaUtil.isObject)(spec)) return spec;\n    for(let i = 0, n = PARSERS.length, p; i < n; ++i){\n        p = PARSERS[i];\n        if ((0, _vegaUtil.hasOwnProperty)(spec, p.key)) return p.parse(spec, ctx, params);\n    }\n    return spec;\n}\n/** Reference parsers. */ var PARSERS = [\n    {\n        key: \"$ref\",\n        parse: getOperator\n    },\n    {\n        key: \"$key\",\n        parse: getKey\n    },\n    {\n        key: \"$expr\",\n        parse: getExpression\n    },\n    {\n        key: \"$field\",\n        parse: getField\n    },\n    {\n        key: \"$encode\",\n        parse: getEncode\n    },\n    {\n        key: \"$compare\",\n        parse: getCompare\n    },\n    {\n        key: \"$context\",\n        parse: getContext\n    },\n    {\n        key: \"$subflow\",\n        parse: getSubflow\n    },\n    {\n        key: \"$tupleid\",\n        parse: getTupleId\n    }\n];\n/**\n * Resolve an operator reference.\n */ function getOperator(_, ctx) {\n    return ctx.get(_.$ref) || (0, _vegaUtil.error)(\"Operator not defined: \" + _.$ref);\n}\n/**\n * Resolve an expression reference.\n */ function getExpression(_, ctx, params) {\n    if (_.$params) // parse expression parameters\n    ctx.parseParameters(_.$params, params);\n    const k = \"e:\" + _.$expr.code + \"_\" + _.$name;\n    return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.accessor)(ctx.parameterExpression(_.$expr), _.$fields, _.$name));\n}\n/**\n * Resolve a key accessor reference.\n */ function getKey(_, ctx) {\n    const k = \"k:\" + _.$key + \"_\" + !!_.$flat;\n    return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.key)(_.$key, _.$flat, ctx.expr.codegen));\n}\n/**\n * Resolve a field accessor reference.\n */ function getField(_, ctx) {\n    if (!_.$field) return null;\n    const k = \"f:\" + _.$field + \"_\" + _.$name;\n    return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.field)(_.$field, _.$name, ctx.expr.codegen));\n}\n/**\n * Resolve a comparator function reference.\n */ function getCompare(_1, ctx) {\n    // As of Vega 5.5.3, $tupleid sort is no longer used.\n    // Keep here for now for backwards compatibility.\n    const k = \"c:\" + _1.$compare + \"_\" + _1.$order, c = (0, _vegaUtil.array)(_1.$compare).map((_)=>_ && _.$tupleid ? (0, _vegaDataflow.tupleid) : _);\n    return ctx.fn[k] || (ctx.fn[k] = (0, _vegaUtil.compare)(c, _1.$order, ctx.expr.codegen));\n}\n/**\n * Resolve an encode operator reference.\n */ function getEncode(_, ctx) {\n    const spec = _.$encode, encode = {};\n    for(const name in spec){\n        const enc = spec[name];\n        encode[name] = (0, _vegaUtil.accessor)(ctx.encodeExpression(enc.$expr), enc.$fields);\n        encode[name].output = enc.$output;\n    }\n    return encode;\n}\n/**\n * Resolve a context reference.\n */ function getContext(_, ctx) {\n    return ctx;\n}\n/**\n * Resolve a recursive subflow specification.\n */ function getSubflow(_, ctx) {\n    const spec = _.$subflow;\n    return function(dataflow, key, parent) {\n        const subctx = ctx.fork().parse(spec), op = subctx.get(spec.operators[0].id), p = subctx.signals.parent;\n        if (p) p.set(parent);\n        op.detachSubflow = ()=>ctx.detach(subctx);\n        return op;\n    };\n}\n/**\n * Resolve a tuple id reference.\n */ function getTupleId() {\n    return 0, _vegaDataflow.tupleid;\n}\n/**\n * Parse an event stream specification.\n */ function parseStream(spec) {\n    var ctx = this, filter = spec.filter != null ? ctx.eventExpression(spec.filter) : undefined, stream = spec.stream != null ? ctx.get(spec.stream) : undefined, args;\n    if (spec.source) stream = ctx.events(spec.source, spec.type, filter);\n    else if (spec.merge) {\n        args = spec.merge.map((_)=>ctx.get(_));\n        stream = args[0].merge.apply(args[0], args.slice(1));\n    }\n    if (spec.between) {\n        args = spec.between.map((_)=>ctx.get(_));\n        stream = stream.between(args[0], args[1]);\n    }\n    if (spec.filter) stream = stream.filter(filter);\n    if (spec.throttle != null) stream = stream.throttle(+spec.throttle);\n    if (spec.debounce != null) stream = stream.debounce(+spec.debounce);\n    if (stream == null) (0, _vegaUtil.error)(\"Invalid stream definition: \" + JSON.stringify(spec));\n    if (spec.consume) stream.consume(true);\n    ctx.stream(spec, stream);\n}\n/**\n * Parse an event-driven operator update.\n */ function parseUpdate(spec) {\n    var ctx = this, srcid = (0, _vegaUtil.isObject)(srcid = spec.source) ? srcid.$ref : srcid, source = ctx.get(srcid), target = null, update = spec.update, params = undefined;\n    if (!source) (0, _vegaUtil.error)(\"Source not defined: \" + spec.source);\n    target = spec.target && spec.target.$expr ? ctx.eventExpression(spec.target.$expr) : ctx.get(spec.target);\n    if (update && update.$expr) {\n        if (update.$params) params = ctx.parseParameters(update.$params);\n        update = ctx.handlerExpression(update.$expr);\n    }\n    ctx.update(spec, source, target, update, params);\n}\nconst SKIP = {\n    skip: true\n};\nfunction getState(options) {\n    var ctx1 = this, state = {};\n    if (options.signals) {\n        var signals = state.signals = {};\n        Object.keys(ctx1.signals).forEach((key)=>{\n            const op = ctx1.signals[key];\n            if (options.signals(key, op)) signals[key] = op.value;\n        });\n    }\n    if (options.data) {\n        var data = state.data = {};\n        Object.keys(ctx1.data).forEach((key)=>{\n            const dataset = ctx1.data[key];\n            if (options.data(key, dataset)) data[key] = dataset.input.value;\n        });\n    }\n    if (ctx1.subcontext && options.recurse !== false) state.subcontext = ctx1.subcontext.map((ctx)=>ctx.getState(options));\n    return state;\n}\nfunction setState(state) {\n    var ctx = this, df = ctx.dataflow, data = state.data, signals = state.signals;\n    Object.keys(signals || {}).forEach((key)=>{\n        df.update(ctx.signals[key], signals[key], SKIP);\n    });\n    Object.keys(data || {}).forEach((key)=>{\n        df.pulse(ctx.data[key].input, df.changeset().remove((0, _vegaUtil.truthy)).insert(data[key]));\n    });\n    (state.subcontext || []).forEach((substate, i)=>{\n        const subctx = ctx.subcontext[i];\n        if (subctx) subctx.setState(substate);\n    });\n}\n/**\n * Context objects store the current parse state.\n * Enables lookup of parsed operators, event streams, accessors, etc.\n * Provides a 'fork' method for creating child contexts for subflows.\n */ function context(df, transforms, functions, expr) {\n    return new Context(df, transforms, functions, expr);\n}\nfunction Context(df, transforms, functions, expr) {\n    this.dataflow = df;\n    this.transforms = transforms;\n    this.events = df.events.bind(df);\n    this.expr = expr || expressionCodegen, this.signals = {};\n    this.scales = {};\n    this.nodes = {};\n    this.data = {};\n    this.fn = {};\n    if (functions) {\n        this.functions = Object.create(functions);\n        this.functions.context = this;\n    }\n}\nfunction Subcontext(ctx) {\n    this.dataflow = ctx.dataflow;\n    this.transforms = ctx.transforms;\n    this.events = ctx.events;\n    this.expr = ctx.expr;\n    this.signals = Object.create(ctx.signals);\n    this.scales = Object.create(ctx.scales);\n    this.nodes = Object.create(ctx.nodes);\n    this.data = Object.create(ctx.data);\n    this.fn = Object.create(ctx.fn);\n    if (ctx.functions) {\n        this.functions = Object.create(ctx.functions);\n        this.functions.context = this;\n    }\n}\nContext.prototype = Subcontext.prototype = {\n    fork () {\n        const ctx = new Subcontext(this);\n        (this.subcontext || (this.subcontext = [])).push(ctx);\n        return ctx;\n    },\n    detach (ctx) {\n        this.subcontext = this.subcontext.filter((c)=>c !== ctx); // disconnect all nodes in the subcontext\n        // wipe out targets first for better efficiency\n        const keys = Object.keys(ctx.nodes);\n        for (const key of keys)ctx.nodes[key]._targets = null;\n        for (const key1 of keys)ctx.nodes[key1].detach();\n        ctx.nodes = null;\n    },\n    get (id) {\n        return this.nodes[id];\n    },\n    set (id, node) {\n        return this.nodes[id] = node;\n    },\n    add (spec, op) {\n        const ctx = this, df = ctx.dataflow, data = spec.value;\n        ctx.set(spec.id, op);\n        if (isCollect(spec.type) && data) {\n            if (data.$ingest) df.ingest(op, data.$ingest, data.$format);\n            else if (data.$request) df.preload(op, data.$request, data.$format);\n            else df.pulse(op, df.changeset().insert(data));\n        }\n        if (spec.root) ctx.root = op;\n        if (spec.parent) {\n            let p = ctx.get(spec.parent.$ref);\n            if (p) {\n                df.connect(p, [\n                    op\n                ]);\n                op.targets().add(p);\n            } else (ctx.unresolved = ctx.unresolved || []).push(()=>{\n                p = ctx.get(spec.parent.$ref);\n                df.connect(p, [\n                    op\n                ]);\n                op.targets().add(p);\n            });\n        }\n        if (spec.signal) ctx.signals[spec.signal] = op;\n        if (spec.scale) ctx.scales[spec.scale] = op;\n        if (spec.data) for(const name in spec.data){\n            const data = ctx.data[name] || (ctx.data[name] = {});\n            spec.data[name].forEach((role)=>data[role] = op);\n        }\n    },\n    resolve () {\n        (this.unresolved || []).forEach((fn)=>fn());\n        delete this.unresolved;\n        return this;\n    },\n    operator (spec, update) {\n        this.add(spec, this.dataflow.add(spec.value, update));\n    },\n    transform (spec, type) {\n        this.add(spec, this.dataflow.add(this.transforms[canonicalType(type)]));\n    },\n    stream (spec, stream) {\n        this.set(spec.id, stream);\n    },\n    update (spec, stream, target, update, params) {\n        this.dataflow.on(stream, target, update, params, spec.options);\n    },\n    // expression parsing\n    operatorExpression (expr) {\n        return this.expr.operator(this, expr);\n    },\n    parameterExpression (expr) {\n        return this.expr.parameter(this, expr);\n    },\n    eventExpression (expr) {\n        return this.expr.event(this, expr);\n    },\n    handlerExpression (expr) {\n        return this.expr.handler(this, expr);\n    },\n    encodeExpression (encode) {\n        return this.expr.encode(this, encode);\n    },\n    // parse methods\n    parse,\n    parseOperator,\n    parseOperatorParameters,\n    parseParameters,\n    parseStream,\n    parseUpdate,\n    // state methods\n    getState,\n    setState\n};\n\n},{\"vega-util\":\"bApja\",\"vega-dataflow\":\"3NitK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hsy9Z\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AxisDomainRole\", ()=>AxisDomainRole);\nparcelHelpers.export(exports, \"AxisGridRole\", ()=>AxisGridRole);\nparcelHelpers.export(exports, \"AxisLabelRole\", ()=>AxisLabelRole);\nparcelHelpers.export(exports, \"AxisRole\", ()=>AxisRole);\nparcelHelpers.export(exports, \"AxisTickRole\", ()=>AxisTickRole);\nparcelHelpers.export(exports, \"AxisTitleRole\", ()=>AxisTitleRole);\nparcelHelpers.export(exports, \"DataScope\", ()=>DataScope);\nparcelHelpers.export(exports, \"FrameRole\", ()=>FrameRole);\nparcelHelpers.export(exports, \"LegendEntryRole\", ()=>LegendEntryRole);\nparcelHelpers.export(exports, \"LegendLabelRole\", ()=>LegendLabelRole);\nparcelHelpers.export(exports, \"LegendRole\", ()=>LegendRole);\nparcelHelpers.export(exports, \"LegendSymbolRole\", ()=>LegendSymbolRole);\nparcelHelpers.export(exports, \"LegendTitleRole\", ()=>LegendTitleRole);\nparcelHelpers.export(exports, \"MarkRole\", ()=>MarkRole);\nparcelHelpers.export(exports, \"Scope\", ()=>Scope);\nparcelHelpers.export(exports, \"ScopeRole\", ()=>ScopeRole);\nparcelHelpers.export(exports, \"config\", ()=>defaults);\nparcelHelpers.export(exports, \"parse\", ()=>parse);\nparcelHelpers.export(exports, \"signal\", ()=>parseSignal);\nparcelHelpers.export(exports, \"signalUpdates\", ()=>parseSignalUpdates);\nparcelHelpers.export(exports, \"stream\", ()=>parseStream);\nvar _vegaUtil = require(\"vega-util\");\nvar _vegaFunctions = require(\"vega-functions\");\nvar _vegaEventSelector = require(\"vega-event-selector\");\nvar _vegaScale = require(\"vega-scale\");\nvar _vegaDataflow = require(\"vega-dataflow\");\nfunction parseAutosize(spec) {\n    return (0, _vegaUtil.isObject)(spec) ? spec : {\n        type: spec || \"pad\"\n    };\n}\nconst number = (_)=>+_ || 0;\nconst paddingObject = (_)=>({\n        top: _,\n        bottom: _,\n        left: _,\n        right: _\n    });\nfunction parsePadding(spec) {\n    return !(0, _vegaUtil.isObject)(spec) ? paddingObject(number(spec)) : spec.signal ? spec : {\n        top: number(spec.top),\n        bottom: number(spec.bottom),\n        left: number(spec.left),\n        right: number(spec.right)\n    };\n}\nconst encoder = (_)=>(0, _vegaUtil.isObject)(_) && !(0, _vegaUtil.isArray)(_) ? (0, _vegaUtil.extend)({}, _) : {\n        value: _\n    };\nfunction addEncode(object, name, value1, set) {\n    if (value1 != null) {\n        const isEncoder = (0, _vegaUtil.isObject)(value1) && !(0, _vegaUtil.isArray)(value1) || (0, _vegaUtil.isArray)(value1) && value1.length && (0, _vegaUtil.isObject)(value1[0]); // Always assign signal to update, even if the signal is from the enter block\n        if (isEncoder) object.update[name] = value1;\n        else object[set || \"enter\"][name] = {\n            value: value1\n        };\n        return 1;\n    } else return 0;\n}\nfunction addEncoders(object, enter, update) {\n    for(const name in enter)addEncode(object, name, enter[name]);\n    for(const name1 in update)addEncode(object, name1, update[name1], \"update\");\n}\nfunction extendEncode(encode, extra, skip) {\n    for(const name in extra){\n        if (skip && (0, _vegaUtil.hasOwnProperty)(skip, name)) continue;\n        encode[name] = (0, _vegaUtil.extend)(encode[name] || {}, extra[name]);\n    }\n    return encode;\n}\nfunction has(key, encode) {\n    return encode && (encode.enter && encode.enter[key] || encode.update && encode.update[key]);\n}\nconst MarkRole = \"mark\";\nconst FrameRole = \"frame\";\nconst ScopeRole = \"scope\";\nconst AxisRole = \"axis\";\nconst AxisDomainRole = \"axis-domain\";\nconst AxisGridRole = \"axis-grid\";\nconst AxisLabelRole = \"axis-label\";\nconst AxisTickRole = \"axis-tick\";\nconst AxisTitleRole = \"axis-title\";\nconst LegendRole = \"legend\";\nconst LegendBandRole = \"legend-band\";\nconst LegendEntryRole = \"legend-entry\";\nconst LegendGradientRole = \"legend-gradient\";\nconst LegendLabelRole = \"legend-label\";\nconst LegendSymbolRole = \"legend-symbol\";\nconst LegendTitleRole = \"legend-title\";\nconst TitleRole = \"title\";\nconst TitleTextRole = \"title-text\";\nconst TitleSubtitleRole = \"title-subtitle\";\nfunction applyDefaults(encode, type, role, style, config) {\n    const defaults1 = {}, enter = {};\n    let update, key1, skip, props1; // if text mark, apply global lineBreak settings (#2370)\n    key1 = \"lineBreak\";\n    if (type === \"text\" && config[key1] != null && !has(key1, encode)) applyDefault(defaults1, key1, config[key1]);\n     // ignore legend and axis roles\n    if (role == \"legend\" || String(role).startsWith(\"axis\")) role = null;\n     // resolve mark config\n    props1 = role === FrameRole ? config.group : role === MarkRole ? (0, _vegaUtil.extend)({}, config.mark, config[type]) : null;\n    for(key1 in props1){\n        // do not apply defaults if relevant fields are defined\n        skip = has(key1, encode) || (key1 === \"fill\" || key1 === \"stroke\") && (has(\"fill\", encode) || has(\"stroke\", encode));\n        if (!skip) applyDefault(defaults1, key1, props1[key1]);\n    } // resolve styles, apply with increasing precedence\n    (0, _vegaUtil.array)(style).forEach((name)=>{\n        const props = config.style && config.style[name];\n        for(const key in props)if (!has(key, encode)) applyDefault(defaults1, key, props[key]);\n    });\n    encode = (0, _vegaUtil.extend)({}, encode); // defensive copy\n    for(key1 in defaults1){\n        props1 = defaults1[key1];\n        if (props1.signal) (update = update || {})[key1] = props1;\n        else enter[key1] = props1;\n    }\n    encode.enter = (0, _vegaUtil.extend)(enter, encode.enter);\n    if (update) encode.update = (0, _vegaUtil.extend)(update, encode.update);\n    return encode;\n}\nfunction applyDefault(defaults2, key, value2) {\n    defaults2[key] = value2 && value2.signal ? {\n        signal: value2.signal\n    } : {\n        value: value2\n    };\n}\nconst scaleRef = (scale1)=>(0, _vegaUtil.isString)(scale1) ? (0, _vegaUtil.stringValue)(scale1) : scale1.signal ? `(${scale1.signal})` : field(scale1);\nfunction entry$1(enc) {\n    if (enc.gradient != null) return gradient(enc);\n    let value3 = enc.signal ? `(${enc.signal})` : enc.color ? color(enc.color) : enc.field != null ? field(enc.field) : enc.value !== undefined ? (0, _vegaUtil.stringValue)(enc.value) : undefined;\n    if (enc.scale != null) value3 = scale(enc, value3);\n    if (value3 === undefined) value3 = null;\n    if (enc.exponent != null) value3 = `pow(${value3},${property(enc.exponent)})`;\n    if (enc.mult != null) value3 += `*${property(enc.mult)}`;\n    if (enc.offset != null) value3 += `+${property(enc.offset)}`;\n    if (enc.round) value3 = `round(${value3})`;\n    return value3;\n}\nconst _color = (type, x, y, z)=>`(${type}(${[\n        x,\n        y,\n        z\n    ].map(entry$1).join(\",\")})+'')`;\nfunction color(enc) {\n    return enc.c ? _color(\"hcl\", enc.h, enc.c, enc.l) : enc.h || enc.s ? _color(\"hsl\", enc.h, enc.s, enc.l) : enc.l || enc.a ? _color(\"lab\", enc.l, enc.a, enc.b) : enc.r || enc.g || enc.b ? _color(\"rgb\", enc.r, enc.g, enc.b) : null;\n}\nfunction gradient(enc) {\n    // map undefined to null; expression lang does not allow undefined\n    const args = [\n        enc.start,\n        enc.stop,\n        enc.count\n    ].map((_)=>_ == null ? null : (0, _vegaUtil.stringValue)(_)); // trim null inputs from the end\n    while(args.length && (0, _vegaUtil.peek)(args) == null)args.pop();\n    args.unshift(scaleRef(enc.gradient));\n    return `gradient(${args.join(\",\")})`;\n}\nfunction property(property1) {\n    return (0, _vegaUtil.isObject)(property1) ? \"(\" + entry$1(property1) + \")\" : property1;\n}\nfunction field(ref1) {\n    return resolveField((0, _vegaUtil.isObject)(ref1) ? ref1 : {\n        datum: ref1\n    });\n}\nfunction resolveField(ref2) {\n    let object, level, field1;\n    if (ref2.signal) {\n        object = \"datum\";\n        field1 = ref2.signal;\n    } else if (ref2.group || ref2.parent) {\n        level = Math.max(1, ref2.level || 1);\n        object = \"item\";\n        while(level-- > 0)object += \".mark.group\";\n        if (ref2.parent) {\n            field1 = ref2.parent;\n            object += \".datum\";\n        } else field1 = ref2.group;\n    } else if (ref2.datum) {\n        object = \"datum\";\n        field1 = ref2.datum;\n    } else (0, _vegaUtil.error)(\"Invalid field reference: \" + (0, _vegaUtil.stringValue)(ref2));\n    if (!ref2.signal) field1 = (0, _vegaUtil.isString)(field1) ? (0, _vegaUtil.splitAccessPath)(field1).map((0, _vegaUtil.stringValue)).join(\"][\") : resolveField(field1);\n    return object + \"[\" + field1 + \"]\";\n}\nfunction scale(enc, value4) {\n    const scale2 = scaleRef(enc.scale);\n    if (enc.range != null) // pull value from scale range\n    value4 = `lerp(_range(${scale2}), ${+enc.range})`;\n    else {\n        // run value through scale and/or pull scale bandwidth\n        if (value4 !== undefined) value4 = `_scale(${scale2}, ${value4})`;\n        if (enc.band) {\n            value4 = (value4 ? value4 + \"+\" : \"\") + `_bandwidth(${scale2})` + (+enc.band === 1 ? \"\" : \"*\" + property(enc.band));\n            if (enc.extra) // include logic to handle extraneous elements\n            value4 = `(datum.extra ? _scale(${scale2}, datum.extra.value) : ${value4})`;\n        }\n        if (value4 == null) value4 = \"0\";\n    }\n    return value4;\n}\nfunction rule(enc) {\n    let code = \"\";\n    enc.forEach((rule1)=>{\n        const value5 = entry$1(rule1);\n        code += rule1.test ? `(${rule1.test})?${value5}:` : value5;\n    }); // if no else clause, terminate with null (#1366)\n    if ((0, _vegaUtil.peek)(code) === \":\") code += \"null\";\n    return code;\n}\nfunction parseEncode(encode, type, role, style, scope, params) {\n    const enc = {};\n    params = params || {};\n    params.encoders = {\n        $encode: enc\n    };\n    encode = applyDefaults(encode, type, role, style, scope.config);\n    for(const key in encode)enc[key] = parseBlock(encode[key], type, params, scope);\n    return params;\n}\nfunction parseBlock(block, marktype, params, scope) {\n    const channels = {}, fields = {};\n    for(const name in block)if (block[name] != null) // skip any null entries\n    channels[name] = parse$1(expr(block[name]), scope, params, fields);\n    return {\n        $expr: {\n            marktype,\n            channels\n        },\n        $fields: Object.keys(fields),\n        $output: Object.keys(block)\n    };\n}\nfunction expr(enc) {\n    return (0, _vegaUtil.isArray)(enc) ? rule(enc) : entry$1(enc);\n}\nfunction parse$1(code, scope, params, fields) {\n    const expr1 = (0, _vegaFunctions.parseExpression)(code, scope);\n    expr1.$fields.forEach((name)=>fields[name] = 1);\n    (0, _vegaUtil.extend)(params, expr1.$params);\n    return expr1.$expr;\n}\nconst OUTER = \"outer\", OUTER_INVALID = [\n    \"value\",\n    \"update\",\n    \"init\",\n    \"react\",\n    \"bind\"\n];\nfunction outerError(prefix, name) {\n    (0, _vegaUtil.error)(prefix + ' for \"outer\" push: ' + (0, _vegaUtil.stringValue)(name));\n}\nfunction parseSignal(signal, scope) {\n    const name = signal.name;\n    if (signal.push === OUTER) {\n        // signal must already be defined, raise error if not\n        if (!scope.signals[name]) outerError(\"No prior signal definition\", name); // signal push must not use properties reserved for standard definition\n        OUTER_INVALID.forEach((prop)=>{\n            if (signal[prop] !== undefined) outerError(\"Invalid property \", prop);\n        });\n    } else {\n        // define a new signal in the current scope\n        const op = scope.addSignal(name, signal.value);\n        if (signal.react === false) op.react = false;\n        if (signal.bind) scope.addBinding(name, signal.bind);\n    }\n}\nfunction Entry(type, value6, params, parent) {\n    this.id = -1;\n    this.type = type;\n    this.value = value6;\n    this.params = params;\n    if (parent) this.parent = parent;\n}\nfunction entry(type, value7, params, parent) {\n    return new Entry(type, value7, params, parent);\n}\nfunction operator(value8, params) {\n    return entry(\"operator\", value8, params);\n} // -----\nfunction ref(op) {\n    const ref3 = {\n        $ref: op.id\n    }; // if operator not yet registered, cache ref to resolve later\n    if (op.id < 0) (op.refs = op.refs || []).push(ref3);\n    return ref3;\n}\nfunction fieldRef$1(field2, name) {\n    return name ? {\n        $field: field2,\n        $name: name\n    } : {\n        $field: field2\n    };\n}\nconst keyFieldRef = fieldRef$1(\"key\");\nfunction compareRef(fields, orders) {\n    return {\n        $compare: fields,\n        $order: orders\n    };\n}\nfunction keyRef(fields, flat) {\n    const ref4 = {\n        $key: fields\n    };\n    if (flat) ref4.$flat = true;\n    return ref4;\n} // -----\nconst Ascending = \"ascending\";\nconst Descending = \"descending\";\nfunction sortKey(sort) {\n    return !(0, _vegaUtil.isObject)(sort) ? \"\" : (sort.order === Descending ? \"-\" : \"+\") + aggrField(sort.op, sort.field);\n}\nfunction aggrField(op, field3) {\n    return (op && op.signal ? \"$\" + op.signal : op || \"\") + (op && field3 ? \"_\" : \"\") + (field3 && field3.signal ? \"$\" + field3.signal : field3 || \"\");\n} // -----\nconst Scope$1 = \"scope\";\nconst View = \"view\";\nfunction isSignal(_) {\n    return _ && _.signal;\n}\nfunction isExpr$1(_) {\n    return _ && _.expr;\n}\nfunction hasSignal(_) {\n    if (isSignal(_)) return true;\n    if ((0, _vegaUtil.isObject)(_)) for(const key in _){\n        if (hasSignal(_[key])) return true;\n    }\n    return false;\n}\nfunction value(specValue, defaultValue) {\n    return specValue != null ? specValue : defaultValue;\n}\nfunction deref(v) {\n    return v && v.signal || v;\n}\nconst Timer = \"timer\";\nfunction parseStream(stream, scope) {\n    const method = stream.merge ? mergeStream : stream.stream ? nestedStream : stream.type ? eventStream : (0, _vegaUtil.error)(\"Invalid stream specification: \" + (0, _vegaUtil.stringValue)(stream));\n    return method(stream, scope);\n}\nfunction eventSource(source) {\n    return source === Scope$1 ? View : source || View;\n}\nfunction mergeStream(stream, scope) {\n    const list = stream.merge.map((s)=>parseStream(s, scope)), entry1 = streamParameters({\n        merge: list\n    }, stream, scope);\n    return scope.addStream(entry1).id;\n}\nfunction nestedStream(stream, scope) {\n    const id = parseStream(stream.stream, scope), entry2 = streamParameters({\n        stream: id\n    }, stream, scope);\n    return scope.addStream(entry2).id;\n}\nfunction eventStream(stream, scope) {\n    let id;\n    if (stream.type === Timer) {\n        id = scope.event(Timer, stream.throttle);\n        stream = {\n            between: stream.between,\n            filter: stream.filter\n        };\n    } else id = scope.event(eventSource(stream.source), stream.type);\n    const entry3 = streamParameters({\n        stream: id\n    }, stream, scope);\n    return Object.keys(entry3).length === 1 ? id : scope.addStream(entry3).id;\n}\nfunction streamParameters(entry4, stream, scope) {\n    let param1 = stream.between;\n    if (param1) {\n        if (param1.length !== 2) (0, _vegaUtil.error)('Stream \"between\" parameter must have 2 entries: ' + (0, _vegaUtil.stringValue)(stream));\n        entry4.between = [\n            parseStream(param1[0], scope),\n            parseStream(param1[1], scope)\n        ];\n    }\n    param1 = stream.filter ? [].concat(stream.filter) : [];\n    if (stream.marktype || stream.markname || stream.markrole) // add filter for mark type, name and/or role\n    param1.push(filterMark(stream.marktype, stream.markname, stream.markrole));\n    if (stream.source === Scope$1) // add filter to limit events from sub-scope only\n    param1.push(\"inScope(event.item)\");\n    if (param1.length) entry4.filter = (0, _vegaFunctions.parseExpression)(\"(\" + param1.join(\")&&(\") + \")\", scope).$expr;\n    if ((param1 = stream.throttle) != null) entry4.throttle = +param1;\n    if ((param1 = stream.debounce) != null) entry4.debounce = +param1;\n    if (stream.consume) entry4.consume = true;\n    return entry4;\n}\nfunction filterMark(type, name, role) {\n    const item = \"event.item\";\n    return item + (type && type !== \"*\" ? \"&&\" + item + \".mark.marktype==='\" + type + \"'\" : \"\") + (role ? \"&&\" + item + \".mark.role==='\" + role + \"'\" : \"\") + (name ? \"&&\" + item + \".mark.name==='\" + name + \"'\" : \"\");\n}\nconst OP_VALUE_EXPR = {\n    code: \"_.$value\",\n    ast: {\n        type: \"Identifier\",\n        value: \"value\"\n    }\n};\nfunction parseUpdate(spec, scope, target) {\n    const encode = spec.encode, entry5 = {\n        target: target\n    };\n    let events = spec.events, update = spec.update, sources = [];\n    if (!events) (0, _vegaUtil.error)(\"Signal update missing events specification.\");\n     // interpret as an event selector string\n    if ((0, _vegaUtil.isString)(events)) events = (0, _vegaEventSelector.parseSelector)(events, scope.isSubscope() ? Scope$1 : View);\n     // separate event streams from signal updates\n    events = (0, _vegaUtil.array)(events).filter((s)=>s.signal || s.scale ? (sources.push(s), 0) : 1); // merge internal operator listeners\n    if (sources.length > 1) sources = [\n        mergeSources(sources)\n    ];\n     // merge event streams, include as source\n    if (events.length) sources.push(events.length > 1 ? {\n        merge: events\n    } : events[0]);\n    if (encode != null) {\n        if (update) (0, _vegaUtil.error)(\"Signal encode and update are mutually exclusive.\");\n        update = \"encode(item(),\" + (0, _vegaUtil.stringValue)(encode) + \")\";\n    } // resolve update value\n    entry5.update = (0, _vegaUtil.isString)(update) ? (0, _vegaFunctions.parseExpression)(update, scope) : update.expr != null ? (0, _vegaFunctions.parseExpression)(update.expr, scope) : update.value != null ? update.value : update.signal != null ? {\n        $expr: OP_VALUE_EXPR,\n        $params: {\n            $value: scope.signalRef(update.signal)\n        }\n    } : (0, _vegaUtil.error)(\"Invalid signal update specification.\");\n    if (spec.force) entry5.options = {\n        force: true\n    };\n    sources.forEach((source)=>scope.addUpdate((0, _vegaUtil.extend)(streamSource(source, scope), entry5)));\n}\nfunction streamSource(stream, scope) {\n    return {\n        source: stream.signal ? scope.signalRef(stream.signal) : stream.scale ? scope.scaleRef(stream.scale) : parseStream(stream, scope)\n    };\n}\nfunction mergeSources(sources) {\n    return {\n        signal: \"[\" + sources.map((s)=>s.scale ? 'scale(\"' + s.scale + '\")' : s.signal) + \"]\"\n    };\n}\nfunction parseSignalUpdates(signal, scope) {\n    const op = scope.getSignal(signal.name);\n    let expr2 = signal.update;\n    if (signal.init) {\n        if (expr2) (0, _vegaUtil.error)(\"Signals can not include both init and update expressions.\");\n        else {\n            expr2 = signal.init;\n            op.initonly = true;\n        }\n    }\n    if (expr2) {\n        expr2 = (0, _vegaFunctions.parseExpression)(expr2, scope);\n        op.update = expr2.$expr;\n        op.params = expr2.$params;\n    }\n    if (signal.on) signal.on.forEach((_)=>parseUpdate(_, scope, op.id));\n}\nconst transform = (name)=>(params, value9, parent)=>entry(name, value9, params || undefined, parent);\nconst Aggregate = transform(\"aggregate\");\nconst AxisTicks = transform(\"axisticks\");\nconst Bound = transform(\"bound\");\nconst Collect = transform(\"collect\");\nconst Compare = transform(\"compare\");\nconst DataJoin = transform(\"datajoin\");\nconst Encode = transform(\"encode\");\nconst Expression = transform(\"expression\");\nconst Facet = transform(\"facet\");\nconst Field = transform(\"field\");\nconst Key = transform(\"key\");\nconst LegendEntries = transform(\"legendentries\");\nconst Load = transform(\"load\");\nconst Mark = transform(\"mark\");\nconst MultiExtent = transform(\"multiextent\");\nconst MultiValues = transform(\"multivalues\");\nconst Overlap = transform(\"overlap\");\nconst Params = transform(\"params\");\nconst PreFacet = transform(\"prefacet\");\nconst Projection = transform(\"projection\");\nconst Proxy = transform(\"proxy\");\nconst Relay = transform(\"relay\");\nconst Render = transform(\"render\");\nconst Scale = transform(\"scale\");\nconst Sieve = transform(\"sieve\");\nconst SortItems = transform(\"sortitems\");\nconst ViewLayout = transform(\"viewlayout\");\nconst Values = transform(\"values\");\nlet FIELD_REF_ID = 0;\nconst MULTIDOMAIN_SORT_OPS = {\n    min: \"min\",\n    max: \"max\",\n    count: \"sum\"\n};\nfunction initScale(spec, scope) {\n    const type = spec.type || \"linear\";\n    if (!(0, _vegaScale.isValidScaleType)(type)) (0, _vegaUtil.error)(\"Unrecognized scale type: \" + (0, _vegaUtil.stringValue)(type));\n    scope.addScale(spec.name, {\n        type,\n        domain: undefined\n    });\n}\nfunction parseScale(spec, scope) {\n    const params = scope.getScale(spec.name).params;\n    let key;\n    params.domain = parseScaleDomain(spec.domain, spec, scope);\n    if (spec.range != null) params.range = parseScaleRange(spec, scope, params);\n    if (spec.interpolate != null) parseScaleInterpolate(spec.interpolate, params);\n    if (spec.nice != null) params.nice = parseScaleNice(spec.nice);\n    if (spec.bins != null) params.bins = parseScaleBins(spec.bins, scope);\n    for(key in spec){\n        if ((0, _vegaUtil.hasOwnProperty)(params, key) || key === \"name\") continue;\n        params[key] = parseLiteral(spec[key], scope);\n    }\n}\nfunction parseLiteral(v, scope) {\n    return !(0, _vegaUtil.isObject)(v) ? v : v.signal ? scope.signalRef(v.signal) : (0, _vegaUtil.error)(\"Unsupported object: \" + (0, _vegaUtil.stringValue)(v));\n}\nfunction parseArray(v1, scope) {\n    return v1.signal ? scope.signalRef(v1.signal) : v1.map((v)=>parseLiteral(v, scope));\n}\nfunction dataLookupError(name) {\n    (0, _vegaUtil.error)(\"Can not find data set: \" + (0, _vegaUtil.stringValue)(name));\n} // -- SCALE DOMAIN ----\nfunction parseScaleDomain(domain, spec, scope) {\n    if (!domain) {\n        if (spec.domainMin != null || spec.domainMax != null) (0, _vegaUtil.error)(\"No scale domain defined for domainMin/domainMax to override.\");\n        return; // default domain\n    }\n    return domain.signal ? scope.signalRef(domain.signal) : ((0, _vegaUtil.isArray)(domain) ? explicitDomain : domain.fields ? multipleDomain : singularDomain)(domain, spec, scope);\n}\nfunction explicitDomain(domain, spec, scope) {\n    return domain.map((v)=>parseLiteral(v, scope));\n}\nfunction singularDomain(domain, spec, scope) {\n    const data = scope.getData(domain.data);\n    if (!data) dataLookupError(domain.data);\n    return (0, _vegaScale.isDiscrete)(spec.type) ? data.valuesRef(scope, domain.field, parseSort(domain.sort, false)) : (0, _vegaScale.isQuantile)(spec.type) ? data.domainRef(scope, domain.field) : data.extentRef(scope, domain.field);\n}\nfunction multipleDomain(domain, spec, scope) {\n    const data = domain.data, fields = domain.fields.reduce((dom, d)=>{\n        d = (0, _vegaUtil.isString)(d) ? {\n            data: data,\n            field: d\n        } : (0, _vegaUtil.isArray)(d) || d.signal ? fieldRef(d, scope) : d;\n        dom.push(d);\n        return dom;\n    }, []);\n    return ((0, _vegaScale.isDiscrete)(spec.type) ? ordinalMultipleDomain : (0, _vegaScale.isQuantile)(spec.type) ? quantileMultipleDomain : numericMultipleDomain)(domain, scope, fields);\n}\nfunction fieldRef(data, scope) {\n    const name = \"_:vega:_\" + FIELD_REF_ID++, coll = Collect({});\n    if ((0, _vegaUtil.isArray)(data)) coll.value = {\n        $ingest: data\n    };\n    else if (data.signal) {\n        const code = \"setdata(\" + (0, _vegaUtil.stringValue)(name) + \",\" + data.signal + \")\";\n        coll.params.input = scope.signalRef(code);\n    }\n    scope.addDataPipeline(name, [\n        coll,\n        Sieve({})\n    ]);\n    return {\n        data: name,\n        field: \"data\"\n    };\n}\nfunction ordinalMultipleDomain(domain, scope, fields) {\n    const sort = parseSort(domain.sort, true);\n    let a, v; // get value counts for each domain field\n    const counts = fields.map((f)=>{\n        const data = scope.getData(f.data);\n        if (!data) dataLookupError(f.data);\n        return data.countsRef(scope, f.field, sort);\n    }); // aggregate the results from each domain field\n    const p = {\n        groupby: keyFieldRef,\n        pulse: counts\n    };\n    if (sort) {\n        a = sort.op || \"count\";\n        v = sort.field ? aggrField(a, sort.field) : \"count\";\n        p.ops = [\n            MULTIDOMAIN_SORT_OPS[a]\n        ];\n        p.fields = [\n            scope.fieldRef(v)\n        ];\n        p.as = [\n            v\n        ];\n    }\n    a = scope.add(Aggregate(p)); // collect aggregate output\n    const c = scope.add(Collect({\n        pulse: ref(a)\n    })); // extract values for combined domain\n    v = scope.add(Values({\n        field: keyFieldRef,\n        sort: scope.sortRef(sort),\n        pulse: ref(c)\n    }));\n    return ref(v);\n}\nfunction parseSort(sort, multidomain) {\n    if (sort) {\n        if (!sort.field && !sort.op) {\n            if ((0, _vegaUtil.isObject)(sort)) sort.field = \"key\";\n            else sort = {\n                field: \"key\"\n            };\n        } else if (!sort.field && sort.op !== \"count\") (0, _vegaUtil.error)(\"No field provided for sort aggregate op: \" + sort.op);\n        else if (multidomain && sort.field) {\n            if (sort.op && !MULTIDOMAIN_SORT_OPS[sort.op]) (0, _vegaUtil.error)(\"Multiple domain scales can not be sorted using \" + sort.op);\n        }\n    }\n    return sort;\n}\nfunction quantileMultipleDomain(domain, scope, fields) {\n    // get value arrays for each domain field\n    const values = fields.map((f)=>{\n        const data = scope.getData(f.data);\n        if (!data) dataLookupError(f.data);\n        return data.domainRef(scope, f.field);\n    }); // combine value arrays\n    return ref(scope.add(MultiValues({\n        values: values\n    })));\n}\nfunction numericMultipleDomain(domain, scope, fields) {\n    // get extents for each domain field\n    const extents = fields.map((f)=>{\n        const data = scope.getData(f.data);\n        if (!data) dataLookupError(f.data);\n        return data.extentRef(scope, f.field);\n    }); // combine extents\n    return ref(scope.add(MultiExtent({\n        extents: extents\n    })));\n} // -- SCALE BINS -----\nfunction parseScaleBins(v, scope) {\n    return v.signal || (0, _vegaUtil.isArray)(v) ? parseArray(v, scope) : scope.objectProperty(v);\n} // -- SCALE NICE -----\nfunction parseScaleNice(nice) {\n    return (0, _vegaUtil.isObject)(nice) ? {\n        interval: parseLiteral(nice.interval),\n        step: parseLiteral(nice.step)\n    } : parseLiteral(nice);\n} // -- SCALE INTERPOLATION -----\nfunction parseScaleInterpolate(interpolate, params) {\n    params.interpolate = parseLiteral(interpolate.type || interpolate);\n    if (interpolate.gamma != null) params.interpolateGamma = parseLiteral(interpolate.gamma);\n} // -- SCALE RANGE -----\nfunction parseScaleRange(spec, scope, params) {\n    const config = scope.config.range;\n    let range = spec.range;\n    if (range.signal) return scope.signalRef(range.signal);\n    else if ((0, _vegaUtil.isString)(range)) {\n        if (config && (0, _vegaUtil.hasOwnProperty)(config, range)) {\n            spec = (0, _vegaUtil.extend)({}, spec, {\n                range: config[range]\n            });\n            return parseScaleRange(spec, scope, params);\n        } else if (range === \"width\") range = [\n            0,\n            {\n                signal: \"width\"\n            }\n        ];\n        else if (range === \"height\") range = (0, _vegaScale.isDiscrete)(spec.type) ? [\n            0,\n            {\n                signal: \"height\"\n            }\n        ] : [\n            {\n                signal: \"height\"\n            },\n            0\n        ];\n        else (0, _vegaUtil.error)(\"Unrecognized scale range value: \" + (0, _vegaUtil.stringValue)(range));\n    } else if (range.scheme) {\n        params.scheme = (0, _vegaUtil.isArray)(range.scheme) ? parseArray(range.scheme, scope) : parseLiteral(range.scheme, scope);\n        if (range.extent) params.schemeExtent = parseArray(range.extent, scope);\n        if (range.count) params.schemeCount = parseLiteral(range.count, scope);\n        return;\n    } else if (range.step) {\n        params.rangeStep = parseLiteral(range.step, scope);\n        return;\n    } else if ((0, _vegaScale.isDiscrete)(spec.type) && !(0, _vegaUtil.isArray)(range)) return parseScaleDomain(range, spec, scope);\n    else if (!(0, _vegaUtil.isArray)(range)) (0, _vegaUtil.error)(\"Unsupported range type: \" + (0, _vegaUtil.stringValue)(range));\n    return range.map((v)=>((0, _vegaUtil.isArray)(v) ? parseArray : parseLiteral)(v, scope));\n}\nfunction parseProjection(proj, scope) {\n    const config = scope.config.projection || {}, params = {};\n    for(const name in proj){\n        if (name === \"name\") continue;\n        params[name] = parseParameter$1(proj[name], name, scope);\n    } // apply projection defaults from config\n    for(const name2 in config)if (params[name2] == null) params[name2] = parseParameter$1(config[name2], name2, scope);\n    scope.addProjection(proj.name, params);\n}\nfunction parseParameter$1(_1, name, scope) {\n    return (0, _vegaUtil.isArray)(_1) ? _1.map((_)=>parseParameter$1(_, name, scope)) : !(0, _vegaUtil.isObject)(_1) ? _1 : _1.signal ? scope.signalRef(_1.signal) : name === \"fit\" ? _1 : (0, _vegaUtil.error)(\"Unsupported parameter object: \" + (0, _vegaUtil.stringValue)(_1));\n}\nconst Top = \"top\";\nconst Left = \"left\";\nconst Right = \"right\";\nconst Bottom = \"bottom\";\nconst Center = \"center\";\nconst Vertical = \"vertical\";\nconst Start = \"start\";\nconst Middle = \"middle\";\nconst End = \"end\";\nconst Index = \"index\";\nconst Label = \"label\";\nconst Offset = \"offset\";\nconst Perc = \"perc\";\nconst Perc2 = \"perc2\";\nconst Value = \"value\";\nconst GuideLabelStyle = \"guide-label\";\nconst GuideTitleStyle = \"guide-title\";\nconst GroupTitleStyle = \"group-title\";\nconst GroupSubtitleStyle = \"group-subtitle\";\nconst Symbols = \"symbol\";\nconst Gradient = \"gradient\";\nconst Discrete = \"discrete\";\nconst Size = \"size\";\nconst Shape = \"shape\";\nconst Fill = \"fill\";\nconst Stroke = \"stroke\";\nconst StrokeWidth = \"strokeWidth\";\nconst StrokeDash = \"strokeDash\";\nconst Opacity = \"opacity\"; // Encoding channels supported by legends\n// In priority order of 'canonical' scale\nconst LegendScales = [\n    Size,\n    Shape,\n    Fill,\n    Stroke,\n    StrokeWidth,\n    StrokeDash,\n    Opacity\n];\nconst Skip = {\n    name: 1,\n    style: 1,\n    interactive: 1\n};\nconst zero = {\n    value: 0\n};\nconst one = {\n    value: 1\n};\nconst GroupMark = \"group\";\nconst RectMark = \"rect\";\nconst RuleMark = \"rule\";\nconst SymbolMark = \"symbol\";\nconst TextMark = \"text\";\nfunction guideGroup(mark) {\n    mark.type = GroupMark;\n    mark.interactive = mark.interactive || false;\n    return mark;\n}\nfunction lookup(spec, config) {\n    const _ = (name, dflt)=>value(spec[name], value(config[name], dflt));\n    _.isVertical = (s)=>Vertical === value(spec.direction, config.direction || (s ? config.symbolDirection : config.gradientDirection));\n    _.gradientLength = ()=>value(spec.gradientLength, config.gradientLength || config.gradientWidth);\n    _.gradientThickness = ()=>value(spec.gradientThickness, config.gradientThickness || config.gradientHeight);\n    _.entryColumns = ()=>value(spec.columns, value(config.columns, +_.isVertical(true)));\n    return _;\n}\nfunction getEncoding(name, encode) {\n    const v = encode && (encode.update && encode.update[name] || encode.enter && encode.enter[name]);\n    return v && v.signal ? v : v ? v.value : null;\n}\nfunction getStyle(name, scope, style) {\n    const s = scope.config.style[style];\n    return s && s[name];\n}\nfunction anchorExpr(s, e, m) {\n    return `item.anchor === '${Start}' ? ${s} : item.anchor === '${End}' ? ${e} : ${m}`;\n}\nconst alignExpr$1 = anchorExpr((0, _vegaUtil.stringValue)(Left), (0, _vegaUtil.stringValue)(Right), (0, _vegaUtil.stringValue)(Center));\nfunction tickBand(_) {\n    const v = _(\"tickBand\");\n    let offset = _(\"tickOffset\"), band, extra;\n    if (!v) {\n        // if no tick band entry, fall back on other properties\n        band = _(\"bandPosition\");\n        extra = _(\"tickExtra\");\n    } else if (v.signal) {\n        // if signal, augment code to interpret values\n        band = {\n            signal: `(${v.signal}) === 'extent' ? 1 : 0.5`\n        };\n        extra = {\n            signal: `(${v.signal}) === 'extent'`\n        };\n        if (!(0, _vegaUtil.isObject)(offset)) offset = {\n            signal: `(${v.signal}) === 'extent' ? 0 : ${offset}`\n        };\n    } else if (v === \"extent\") {\n        // if constant, simply set values\n        band = 1;\n        extra = true;\n        offset = 0;\n    } else {\n        band = 0.5;\n        extra = false;\n    }\n    return {\n        extra,\n        band,\n        offset\n    };\n}\nfunction extendOffset(value10, offset) {\n    return !offset ? value10 : !value10 ? offset : !(0, _vegaUtil.isObject)(value10) ? {\n        value: value10,\n        offset\n    } : Object.assign({}, value10, {\n        offset: extendOffset(value10.offset, offset)\n    });\n}\nfunction guideMark(mark, extras) {\n    if (extras) {\n        mark.name = extras.name;\n        mark.style = extras.style || mark.style;\n        mark.interactive = !!extras.interactive;\n        mark.encode = extendEncode(mark.encode, extras, Skip);\n    } else mark.interactive = false;\n    return mark;\n}\nfunction legendGradient(spec, scale3, config, userEncode) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length = _.gradientLength();\n    let enter, start, stop, width, height;\n    if (vertical) {\n        start = [\n            0,\n            1\n        ];\n        stop = [\n            0,\n            0\n        ];\n        width = thickness;\n        height = length;\n    } else {\n        start = [\n            0,\n            0\n        ];\n        stop = [\n            1,\n            0\n        ];\n        width = length;\n        height = thickness;\n    }\n    const encode = {\n        enter: enter = {\n            opacity: zero,\n            x: zero,\n            y: zero,\n            width: encoder(width),\n            height: encoder(height)\n        },\n        update: (0, _vegaUtil.extend)({}, enter, {\n            opacity: one,\n            fill: {\n                gradient: scale3,\n                start: start,\n                stop: stop\n            }\n        }),\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"gradientStrokeColor\"),\n        strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n        // update\n        opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n        type: RectMark,\n        role: LegendGradientRole,\n        encode\n    }, userEncode);\n}\nfunction legendGradientDiscrete(spec, scale4, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length = _.gradientLength();\n    let u, v, uu, vv, adjust = \"\";\n    vertical ? (u = \"y\", uu = \"y2\", v = \"x\", vv = \"width\", adjust = \"1-\") : (u = \"x\", uu = \"x2\", v = \"y\", vv = \"height\");\n    const enter = {\n        opacity: zero,\n        fill: {\n            scale: scale4,\n            field: Value\n        }\n    };\n    enter[u] = {\n        signal: adjust + \"datum.\" + Perc,\n        mult: length\n    };\n    enter[v] = zero;\n    enter[uu] = {\n        signal: adjust + \"datum.\" + Perc2,\n        mult: length\n    };\n    enter[vv] = encoder(thickness);\n    const encode = {\n        enter: enter,\n        update: (0, _vegaUtil.extend)({}, enter, {\n            opacity: one\n        }),\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"gradientStrokeColor\"),\n        strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n        // update\n        opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n        type: RectMark,\n        role: LegendBandRole,\n        key: Value,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nconst alignExpr = `datum.${Perc}<=0?\"${Left}\":datum.${Perc}>=1?\"${Right}\":\"${Center}\"`, baselineExpr = `datum.${Perc}<=0?\"${Bottom}\":datum.${Perc}>=1?\"${Top}\":\"${Middle}\"`;\nfunction legendGradientLabels(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = encoder(_.gradientThickness()), length = _.gradientLength();\n    let overlap = _(\"labelOverlap\"), enter, update, u, v, adjust = \"\";\n    const encode = {\n        enter: enter = {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one,\n            text: {\n                field: Label\n            }\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        fill: _(\"labelColor\"),\n        fillOpacity: _(\"labelOpacity\"),\n        font: _(\"labelFont\"),\n        fontSize: _(\"labelFontSize\"),\n        fontStyle: _(\"labelFontStyle\"),\n        fontWeight: _(\"labelFontWeight\"),\n        limit: value(spec.labelLimit, config.gradientLabelLimit)\n    });\n    if (vertical) {\n        enter.align = {\n            value: \"left\"\n        };\n        enter.baseline = update.baseline = {\n            signal: baselineExpr\n        };\n        u = \"y\";\n        v = \"x\";\n        adjust = \"1-\";\n    } else {\n        enter.align = update.align = {\n            signal: alignExpr\n        };\n        enter.baseline = {\n            value: \"top\"\n        };\n        u = \"x\";\n        v = \"y\";\n    }\n    enter[u] = update[u] = {\n        signal: adjust + \"datum.\" + Perc,\n        mult: length\n    };\n    enter[v] = update[v] = thickness;\n    thickness.offset = value(spec.labelOffset, config.gradientLabelOffset) || 0;\n    overlap = overlap ? {\n        separation: _(\"labelSeparation\"),\n        method: overlap,\n        order: \"datum.\" + Index\n    } : undefined; // type, role, style, key, dataRef, encode, extras\n    return guideMark({\n        type: TextMark,\n        role: LegendLabelRole,\n        style: GuideLabelStyle,\n        key: Value,\n        from: dataRef,\n        encode,\n        overlap\n    }, userEncode);\n}\nfunction legendSymbolGroups(spec, config, userEncode, dataRef, columns) {\n    const _ = lookup(spec, config), entries = userEncode.entries, interactive1 = !!(entries && entries.interactive), name = entries ? entries.name : undefined, height = _(\"clipHeight\"), symbolOffset = _(\"symbolOffset\"), valueRef = {\n        data: \"value\"\n    }, xSignal = `(${columns}) ? datum.${Offset} : datum.${Size}`, yEncode = height ? encoder(height) : {\n        field: Size\n    }, index = `datum.${Index}`, ncols = `max(1, ${columns})`;\n    let encode, enter, update, nrows, sort;\n    yEncode.mult = 0.5; // -- LEGEND SYMBOLS --\n    encode = {\n        enter: enter = {\n            opacity: zero,\n            x: {\n                signal: xSignal,\n                mult: 0.5,\n                offset: symbolOffset\n            },\n            y: yEncode\n        },\n        update: update = {\n            opacity: one,\n            x: enter.x,\n            y: enter.y\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    let baseFill = null, baseStroke = null;\n    if (!spec.fill) {\n        baseFill = config.symbolBaseFillColor;\n        baseStroke = config.symbolBaseStrokeColor;\n    }\n    addEncoders(encode, {\n        fill: _(\"symbolFillColor\", baseFill),\n        shape: _(\"symbolType\"),\n        size: _(\"symbolSize\"),\n        stroke: _(\"symbolStrokeColor\", baseStroke),\n        strokeDash: _(\"symbolDash\"),\n        strokeDashOffset: _(\"symbolDashOffset\"),\n        strokeWidth: _(\"symbolStrokeWidth\")\n    }, {\n        // update\n        opacity: _(\"symbolOpacity\")\n    });\n    LegendScales.forEach((scale5)=>{\n        if (spec[scale5]) update[scale5] = enter[scale5] = {\n            scale: spec[scale5],\n            field: Value\n        };\n    });\n    const symbols = guideMark({\n        type: SymbolMark,\n        role: LegendSymbolRole,\n        key: Value,\n        from: valueRef,\n        clip: height ? true : undefined,\n        encode\n    }, userEncode.symbols); // -- LEGEND LABELS --\n    const labelOffset = encoder(symbolOffset);\n    labelOffset.offset = _(\"labelOffset\");\n    encode = {\n        enter: enter = {\n            opacity: zero,\n            x: {\n                signal: xSignal,\n                offset: labelOffset\n            },\n            y: yEncode\n        },\n        update: update = {\n            opacity: one,\n            text: {\n                field: Label\n            },\n            x: enter.x,\n            y: enter.y\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        align: _(\"labelAlign\"),\n        baseline: _(\"labelBaseline\"),\n        fill: _(\"labelColor\"),\n        fillOpacity: _(\"labelOpacity\"),\n        font: _(\"labelFont\"),\n        fontSize: _(\"labelFontSize\"),\n        fontStyle: _(\"labelFontStyle\"),\n        fontWeight: _(\"labelFontWeight\"),\n        limit: _(\"labelLimit\")\n    });\n    const labels = guideMark({\n        type: TextMark,\n        role: LegendLabelRole,\n        style: GuideLabelStyle,\n        key: Value,\n        from: valueRef,\n        encode\n    }, userEncode.labels); // -- LEGEND ENTRY GROUPS --\n    encode = {\n        enter: {\n            noBound: {\n                value: !height\n            },\n            // ignore width/height in bounds calc\n            width: zero,\n            height: height ? encoder(height) : zero,\n            opacity: zero\n        },\n        exit: {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one,\n            row: {\n                signal: null\n            },\n            column: {\n                signal: null\n            }\n        }\n    }; // annotate and sort groups to ensure correct ordering\n    if (_.isVertical(true)) {\n        nrows = `ceil(item.mark.items.length / ${ncols})`;\n        update.row.signal = `${index}%${nrows}`;\n        update.column.signal = `floor(${index} / ${nrows})`;\n        sort = {\n            field: [\n                \"row\",\n                index\n            ]\n        };\n    } else {\n        update.row.signal = `floor(${index} / ${ncols})`;\n        update.column.signal = `${index} % ${ncols}`;\n        sort = {\n            field: index\n        };\n    } // handle zero column case (implies infinite columns)\n    update.column.signal = `(${columns})?${update.column.signal}:${index}`; // facet legend entries into sub-groups\n    dataRef = {\n        facet: {\n            data: dataRef,\n            name: \"value\",\n            groupby: Index\n        }\n    };\n    return guideGroup({\n        role: ScopeRole,\n        from: dataRef,\n        encode: extendEncode(encode, entries, Skip),\n        marks: [\n            symbols,\n            labels\n        ],\n        name,\n        interactive: interactive1,\n        sort\n    });\n}\nfunction legendSymbolLayout(spec, config) {\n    const _ = lookup(spec, config); // layout parameters for legend entries\n    return {\n        align: _(\"gridAlign\"),\n        columns: _.entryColumns(),\n        center: {\n            row: true,\n            column: false\n        },\n        padding: {\n            row: _(\"rowPadding\"),\n            column: _(\"columnPadding\")\n        }\n    };\n}\nconst isL = 'item.orient === \"left\"', isR = 'item.orient === \"right\"', isLR = `(${isL} || ${isR})`, isVG = `datum.vgrad && ${isLR}`, baseline = anchorExpr('\"top\"', '\"bottom\"', '\"middle\"'), alignFlip = anchorExpr('\"right\"', '\"left\"', '\"center\"'), exprAlign = `datum.vgrad && ${isR} ? (${alignFlip}) : (${isLR} && !(datum.vgrad && ${isL})) ? \"left\" : ${alignExpr$1}`, exprAnchor = `item._anchor || (${isLR} ? \"middle\" : \"start\")`, exprAngle = `${isVG} ? (${isL} ? -90 : 90) : 0`, exprBaseline = `${isLR} ? (datum.vgrad ? (${isR} ? \"bottom\" : \"top\") : ${baseline}) : \"top\"`;\nfunction legendTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config);\n    const encode = {\n        enter: {\n            opacity: zero\n        },\n        update: {\n            opacity: one,\n            x: {\n                field: {\n                    group: \"padding\"\n                }\n            },\n            y: {\n                field: {\n                    group: \"padding\"\n                }\n            }\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        orient: _(\"titleOrient\"),\n        _anchor: _(\"titleAnchor\"),\n        anchor: {\n            signal: exprAnchor\n        },\n        angle: {\n            signal: exprAngle\n        },\n        align: {\n            signal: exprAlign\n        },\n        baseline: {\n            signal: exprBaseline\n        },\n        text: spec.title,\n        fill: _(\"titleColor\"),\n        fillOpacity: _(\"titleOpacity\"),\n        font: _(\"titleFont\"),\n        fontSize: _(\"titleFontSize\"),\n        fontStyle: _(\"titleFontStyle\"),\n        fontWeight: _(\"titleFontWeight\"),\n        limit: _(\"titleLimit\"),\n        lineHeight: _(\"titleLineHeight\")\n    }, {\n        // require update\n        align: _(\"titleAlign\"),\n        baseline: _(\"titleBaseline\")\n    });\n    return guideMark({\n        type: TextMark,\n        role: LegendTitleRole,\n        style: GuideTitleStyle,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction clip(clip1, scope) {\n    let expr3;\n    if ((0, _vegaUtil.isObject)(clip1)) {\n        if (clip1.signal) expr3 = clip1.signal;\n        else if (clip1.path) expr3 = \"pathShape(\" + param(clip1.path) + \")\";\n        else if (clip1.sphere) expr3 = \"geoShape(\" + param(clip1.sphere) + ', {type: \"Sphere\"})';\n    }\n    return expr3 ? scope.signalRef(expr3) : !!clip1;\n}\nfunction param(value11) {\n    return (0, _vegaUtil.isObject)(value11) && value11.signal ? value11.signal : (0, _vegaUtil.stringValue)(value11);\n}\nfunction getRole(spec) {\n    const role = spec.role || \"\";\n    return !role.indexOf(\"axis\") || !role.indexOf(\"legend\") || !role.indexOf(\"title\") ? role : spec.type === GroupMark ? ScopeRole : role || MarkRole;\n}\nfunction definition(spec) {\n    return {\n        marktype: spec.type,\n        name: spec.name || undefined,\n        role: spec.role || getRole(spec),\n        zindex: +spec.zindex || undefined,\n        aria: spec.aria,\n        description: spec.description\n    };\n}\nfunction interactive(spec, scope) {\n    return spec && spec.signal ? scope.signalRef(spec.signal) : spec === false ? false : true;\n}\n/**\n * Parse a data transform specification.\n */ function parseTransform(spec, scope) {\n    const def = (0, _vegaDataflow.definition)(spec.type);\n    if (!def) (0, _vegaUtil.error)(\"Unrecognized transform type: \" + (0, _vegaUtil.stringValue)(spec.type));\n    const t = entry(def.type.toLowerCase(), null, parseParameters(def, spec, scope));\n    if (spec.signal) scope.addSignal(spec.signal, scope.proxy(t));\n    t.metadata = def.metadata || {};\n    return t;\n}\n/**\n * Parse all parameters of a data transform.\n */ function parseParameters(def, spec, scope) {\n    const params = {}, n = def.params.length;\n    for(let i = 0; i < n; ++i){\n        const pdef = def.params[i];\n        params[pdef.name] = parseParameter(pdef, spec, scope);\n    }\n    return params;\n}\n/**\n * Parse a data transform parameter.\n */ function parseParameter(def, spec, scope) {\n    const type = def.type, value12 = spec[def.name];\n    if (type === \"index\") return parseIndexParameter(def, spec, scope);\n    else if (value12 === undefined) {\n        if (def.required) (0, _vegaUtil.error)(\"Missing required \" + (0, _vegaUtil.stringValue)(spec.type) + \" parameter: \" + (0, _vegaUtil.stringValue)(def.name));\n        return;\n    } else if (type === \"param\") return parseSubParameters(def, spec, scope);\n    else if (type === \"projection\") return scope.projectionRef(spec[def.name]);\n    return def.array && !isSignal(value12) ? value12.map((v)=>parameterValue(def, v, scope)) : parameterValue(def, value12, scope);\n}\n/**\n * Parse a single parameter value.\n */ function parameterValue(def, value13, scope) {\n    const type = def.type;\n    if (isSignal(value13)) return isExpr(type) ? (0, _vegaUtil.error)(\"Expression references can not be signals.\") : isField(type) ? scope.fieldRef(value13) : isCompare(type) ? scope.compareRef(value13) : scope.signalRef(value13.signal);\n    else {\n        const expr4 = def.expr || isField(type);\n        return expr4 && outerExpr(value13) ? scope.exprRef(value13.expr, value13.as) : expr4 && outerField(value13) ? fieldRef$1(value13.field, value13.as) : isExpr(type) ? (0, _vegaFunctions.parseExpression)(value13, scope) : isData(type) ? ref(scope.getData(value13).values) : isField(type) ? fieldRef$1(value13) : isCompare(type) ? scope.compareRef(value13) : value13;\n    }\n}\n/**\n * Parse parameter for accessing an index of another data set.\n */ function parseIndexParameter(def, spec, scope) {\n    if (!(0, _vegaUtil.isString)(spec.from)) (0, _vegaUtil.error)('Lookup \"from\" parameter must be a string literal.');\n    return scope.getData(spec.from).lookupRef(scope, spec.key);\n}\n/**\n * Parse a parameter that contains one or more sub-parameter objects.\n */ function parseSubParameters(def, spec, scope) {\n    const value14 = spec[def.name];\n    if (def.array) {\n        if (!(0, _vegaUtil.isArray)(value14)) // signals not allowed!\n        (0, _vegaUtil.error)(\"Expected an array of sub-parameters. Instead: \" + (0, _vegaUtil.stringValue)(value14));\n        return value14.map((v)=>parseSubParameter(def, v, scope));\n    } else return parseSubParameter(def, value14, scope);\n}\n/**\n * Parse a sub-parameter object.\n */ function parseSubParameter(def, value15, scope) {\n    const n = def.params.length;\n    let pdef; // loop over defs to find matching key\n    for(let i = 0; i < n; ++i){\n        pdef = def.params[i];\n        for(const k in pdef.key)if (pdef.key[k] !== value15[k]) {\n            pdef = null;\n            break;\n        }\n        if (pdef) break;\n    } // raise error if matching key not found\n    if (!pdef) (0, _vegaUtil.error)(\"Unsupported parameter: \" + (0, _vegaUtil.stringValue)(value15)); // parse params, create Params transform, return ref\n    const params = (0, _vegaUtil.extend)(parseParameters(pdef, value15, scope), pdef.key);\n    return ref(scope.add(Params(params)));\n} // -- Utilities -----\nconst outerExpr = (_)=>_ && _.expr;\nconst outerField = (_)=>_ && _.field;\nconst isData = (_)=>_ === \"data\";\nconst isExpr = (_)=>_ === \"expr\";\nconst isField = (_)=>_ === \"field\";\nconst isCompare = (_)=>_ === \"compare\";\nfunction parseData$1(from, group, scope) {\n    let facet, key, op, dataRef, parent; // if no source data, generate singleton datum\n    if (!from) dataRef = ref(scope.add(Collect(null, [\n        {}\n    ])));\n    else if (facet = from.facet) {\n        if (!group) (0, _vegaUtil.error)(\"Only group marks can be faceted.\"); // use pre-faceted source data, if available\n        if (facet.field != null) dataRef = parent = getDataRef(facet, scope);\n        else {\n            // generate facet aggregates if no direct data specification\n            if (!from.data) {\n                op = parseTransform((0, _vegaUtil.extend)({\n                    type: \"aggregate\",\n                    groupby: (0, _vegaUtil.array)(facet.groupby)\n                }, facet.aggregate), scope);\n                op.params.key = scope.keyRef(facet.groupby);\n                op.params.pulse = getDataRef(facet, scope);\n                dataRef = parent = ref(scope.add(op));\n            } else parent = ref(scope.getData(from.data).aggregate);\n            key = scope.keyRef(facet.groupby, true);\n        }\n    } // if not yet defined, get source data reference\n    if (!dataRef) dataRef = getDataRef(from, scope);\n    return {\n        key: key,\n        pulse: dataRef,\n        parent: parent\n    };\n}\nfunction getDataRef(from, scope) {\n    return from.$ref ? from : from.data && from.data.$ref ? from.data : ref(scope.getData(from.data).output);\n}\nfunction DataScope(scope, input, output, values, aggr) {\n    this.scope = scope; // parent scope object\n    this.input = input; // first operator in pipeline (tuple input)\n    this.output = output; // last operator in pipeline (tuple output)\n    this.values = values; // operator for accessing tuples (but not tuple flow)\n    // last aggregate in transform pipeline\n    this.aggregate = aggr; // lookup table of field indices\n    this.index = {};\n}\nDataScope.fromEntries = function(scope, entries) {\n    const n = entries.length, values = entries[n - 1], output = entries[n - 2];\n    let input = entries[0], aggr = null, i = 1;\n    if (input && input.type === \"load\") input = entries[1];\n     // add operator entries to this scope, wire up pulse chain\n    scope.add(entries[0]);\n    for(; i < n; ++i){\n        entries[i].params.pulse = ref(entries[i - 1]);\n        scope.add(entries[i]);\n        if (entries[i].type === \"aggregate\") aggr = entries[i];\n    }\n    return new DataScope(scope, input, output, values, aggr);\n};\nfunction fieldKey(field4) {\n    return (0, _vegaUtil.isString)(field4) ? field4 : null;\n}\nfunction addSortField(scope, p, sort) {\n    const as = aggrField(sort.op, sort.field);\n    let s;\n    if (p.ops) for(let i = 0, n = p.as.length; i < n; ++i){\n        if (p.as[i] === as) return;\n    }\n    else {\n        p.ops = [\n            \"count\"\n        ];\n        p.fields = [\n            null\n        ];\n        p.as = [\n            \"count\"\n        ];\n    }\n    if (sort.op) {\n        p.ops.push((s = sort.op.signal) ? scope.signalRef(s) : sort.op);\n        p.fields.push(scope.fieldRef(sort.field));\n        p.as.push(as);\n    }\n}\nfunction cache(scope, ds, name, optype, field5, counts, index) {\n    const cache1 = ds[name] || (ds[name] = {}), sort = sortKey(counts);\n    let k = fieldKey(field5), v, op;\n    if (k != null) {\n        scope = ds.scope;\n        k = k + (sort ? \"|\" + sort : \"\");\n        v = cache1[k];\n    }\n    if (!v) {\n        const params = counts ? {\n            field: keyFieldRef,\n            pulse: ds.countsRef(scope, field5, counts)\n        } : {\n            field: scope.fieldRef(field5),\n            pulse: ref(ds.output)\n        };\n        if (sort) params.sort = scope.sortRef(counts);\n        op = scope.add(entry(optype, undefined, params));\n        if (index) ds.index[field5] = op;\n        v = ref(op);\n        if (k != null) cache1[k] = v;\n    }\n    return v;\n}\nDataScope.prototype = {\n    countsRef (scope, field6, sort) {\n        const ds = this, cache2 = ds.counts || (ds.counts = {}), k = fieldKey(field6);\n        let v, a, p;\n        if (k != null) {\n            scope = ds.scope;\n            v = cache2[k];\n        }\n        if (!v) {\n            p = {\n                groupby: scope.fieldRef(field6, \"key\"),\n                pulse: ref(ds.output)\n            };\n            if (sort && sort.field) addSortField(scope, p, sort);\n            a = scope.add(Aggregate(p));\n            v = scope.add(Collect({\n                pulse: ref(a)\n            }));\n            v = {\n                agg: a,\n                ref: ref(v)\n            };\n            if (k != null) cache2[k] = v;\n        } else if (sort && sort.field) addSortField(scope, v.agg.params, sort);\n        return v.ref;\n    },\n    tuplesRef () {\n        return ref(this.values);\n    },\n    extentRef (scope, field7) {\n        return cache(scope, this, \"extent\", \"extent\", field7, false);\n    },\n    domainRef (scope, field8) {\n        return cache(scope, this, \"domain\", \"values\", field8, false);\n    },\n    valuesRef (scope, field9, sort) {\n        return cache(scope, this, \"vals\", \"values\", field9, sort || true);\n    },\n    lookupRef (scope, field10) {\n        return cache(scope, this, \"lookup\", \"tupleindex\", field10, false);\n    },\n    indataRef (scope, field11) {\n        return cache(scope, this, \"indata\", \"tupleindex\", field11, true, true);\n    }\n};\nfunction parseFacet(spec, scope, group) {\n    const facet = spec.from.facet, name = facet.name, data = getDataRef(facet, scope);\n    let op;\n    if (!facet.name) (0, _vegaUtil.error)(\"Facet must have a name: \" + (0, _vegaUtil.stringValue)(facet));\n    if (!facet.data) (0, _vegaUtil.error)(\"Facet must reference a data set: \" + (0, _vegaUtil.stringValue)(facet));\n    if (facet.field) op = scope.add(PreFacet({\n        field: scope.fieldRef(facet.field),\n        pulse: data\n    }));\n    else if (facet.groupby) op = scope.add(Facet({\n        key: scope.keyRef(facet.groupby),\n        group: ref(scope.proxy(group.parent)),\n        pulse: data\n    }));\n    else (0, _vegaUtil.error)(\"Facet must specify groupby or field: \" + (0, _vegaUtil.stringValue)(facet));\n     // initialize facet subscope\n    const subscope = scope.fork(), source = subscope.add(Collect()), values = subscope.add(Sieve({\n        pulse: ref(source)\n    }));\n    subscope.addData(name, new DataScope(subscope, source, source, values));\n    subscope.addSignal(\"parent\", null); // parse faceted subflow\n    op.params.subflow = {\n        $subflow: subscope.parse(spec).toRuntime()\n    };\n}\nfunction parseSubflow(spec, scope, input) {\n    const op = scope.add(PreFacet({\n        pulse: input.pulse\n    })), subscope = scope.fork();\n    subscope.add(Sieve());\n    subscope.addSignal(\"parent\", null); // parse group mark subflow\n    op.params.subflow = {\n        $subflow: subscope.parse(spec).toRuntime()\n    };\n}\nfunction parseTrigger(spec, scope, name) {\n    const remove = spec.remove, insert = spec.insert, toggle = spec.toggle, modify = spec.modify, values = spec.values, op = scope.add(operator());\n    const update = \"if(\" + spec.trigger + ',modify(\"' + name + '\",' + [\n        insert,\n        remove,\n        toggle,\n        modify,\n        values\n    ].map((_)=>_ == null ? \"null\" : _).join(\",\") + \"),0)\";\n    const expr5 = (0, _vegaFunctions.parseExpression)(update, scope);\n    op.update = expr5.$expr;\n    op.params = expr5.$params;\n}\nfunction parseMark(spec, scope) {\n    const role = getRole(spec), group = spec.type === GroupMark, facet = spec.from && spec.from.facet, overlap = spec.overlap;\n    let layout = spec.layout || role === ScopeRole || role === FrameRole, ops, op, store, enc, name, layoutRef, boundRef;\n    const nested = role === MarkRole || layout || facet; // resolve input data\n    const input = parseData$1(spec.from, group, scope); // data join to map tuples to visual items\n    op = scope.add(DataJoin({\n        key: input.key || (spec.key ? fieldRef$1(spec.key) : undefined),\n        pulse: input.pulse,\n        clean: !group\n    }));\n    const joinRef = ref(op); // collect visual items\n    op = store = scope.add(Collect({\n        pulse: joinRef\n    })); // connect visual items to scenegraph\n    op = scope.add(Mark({\n        markdef: definition(spec),\n        interactive: interactive(spec.interactive, scope),\n        clip: clip(spec.clip, scope),\n        context: {\n            $context: true\n        },\n        groups: scope.lookup(),\n        parent: scope.signals.parent ? scope.signalRef(\"parent\") : null,\n        index: scope.markpath(),\n        pulse: ref(op)\n    }));\n    const markRef = ref(op); // add visual encoders\n    op = enc = scope.add(Encode(parseEncode(spec.encode, spec.type, role, spec.style, scope, {\n        mod: false,\n        pulse: markRef\n    }))); // monitor parent marks to propagate changes\n    op.params.parent = scope.encode(); // add post-encoding transforms, if defined\n    if (spec.transform) spec.transform.forEach((_)=>{\n        const tx = parseTransform(_, scope), md = tx.metadata;\n        if (md.generates || md.changes) (0, _vegaUtil.error)(\"Mark transforms should not generate new data.\");\n        if (!md.nomod) enc.params.mod = true; // update encode mod handling\n        tx.params.pulse = ref(op);\n        scope.add(op = tx);\n    });\n     // if item sort specified, perform post-encoding\n    if (spec.sort) op = scope.add(SortItems({\n        sort: scope.compareRef(spec.sort),\n        pulse: ref(op)\n    }));\n    const encodeRef = ref(op); // add view layout operator if needed\n    if (facet || layout) {\n        layout = scope.add(ViewLayout({\n            layout: scope.objectProperty(spec.layout),\n            legends: scope.legends,\n            mark: markRef,\n            pulse: encodeRef\n        }));\n        layoutRef = ref(layout);\n    } // compute bounding boxes\n    const bound = scope.add(Bound({\n        mark: markRef,\n        pulse: layoutRef || encodeRef\n    }));\n    boundRef = ref(bound); // if group mark, recurse to parse nested content\n    if (group) {\n        // juggle layout & bounds to ensure they run *after* any faceting transforms\n        if (nested) {\n            ops = scope.operators;\n            ops.pop();\n            if (layout) ops.pop();\n        }\n        scope.pushState(encodeRef, layoutRef || boundRef, joinRef);\n        facet ? parseFacet(spec, scope, input) // explicit facet\n         : nested ? parseSubflow(spec, scope, input) // standard mark group\n         : scope.parse(spec); // guide group, we can avoid nested scopes\n        scope.popState();\n        if (nested) {\n            if (layout) ops.push(layout);\n            ops.push(bound);\n        }\n    } // if requested, add overlap removal transform\n    if (overlap) boundRef = parseOverlap(overlap, boundRef, scope);\n     // render / sieve items\n    const render = scope.add(Render({\n        pulse: boundRef\n    })), sieve = scope.add(Sieve({\n        pulse: ref(render)\n    }, undefined, scope.parent())); // if mark is named, make accessible as reactive geometry\n    // add trigger updates if defined\n    if (spec.name != null) {\n        name = spec.name;\n        scope.addData(name, new DataScope(scope, store, render, sieve));\n        if (spec.on) spec.on.forEach((on)=>{\n            if (on.insert || on.remove || on.toggle) (0, _vegaUtil.error)(\"Marks only support modify triggers.\");\n            parseTrigger(on, scope, name);\n        });\n    }\n}\nfunction parseOverlap(overlap, source, scope) {\n    const method = overlap.method, bound = overlap.bound, sep = overlap.separation;\n    const params = {\n        separation: isSignal(sep) ? scope.signalRef(sep.signal) : sep,\n        method: isSignal(method) ? scope.signalRef(method.signal) : method,\n        pulse: source\n    };\n    if (overlap.order) params.sort = scope.compareRef({\n        field: overlap.order\n    });\n    if (bound) {\n        const tol = bound.tolerance;\n        params.boundTolerance = isSignal(tol) ? scope.signalRef(tol.signal) : +tol;\n        params.boundScale = scope.scaleRef(bound.scale);\n        params.boundOrient = bound.orient;\n    }\n    return ref(scope.add(Overlap(params)));\n}\nfunction parseLegend(spec, scope) {\n    const config = scope.config.legend, encode = spec.encode || {}, _ = lookup(spec, config), legendEncode = encode.legend || {}, name = legendEncode.name || undefined, interactive2 = legendEncode.interactive, style = legendEncode.style, scales = {};\n    let scale6 = 0, entryLayout, params, children; // resolve scales and 'canonical' scale name\n    LegendScales.forEach((s)=>spec[s] ? (scales[s] = spec[s], scale6 = scale6 || spec[s]) : 0);\n    if (!scale6) (0, _vegaUtil.error)(\"Missing valid scale for legend.\"); // resolve legend type (symbol, gradient, or discrete gradient)\n    const type = legendType(spec, scope.scaleType(scale6)); // single-element data source for legend group\n    const datum = {\n        title: spec.title != null,\n        scales: scales,\n        type: type,\n        vgrad: type !== \"symbol\" && _.isVertical()\n    };\n    const dataRef = ref(scope.add(Collect(null, [\n        datum\n    ]))); // encoding properties for legend entry sub-group\n    const entryEncode = {\n        enter: {\n            x: {\n                value: 0\n            },\n            y: {\n                value: 0\n            }\n        }\n    }; // data source for legend values\n    const entryRef = ref(scope.add(LegendEntries(params = {\n        type: type,\n        scale: scope.scaleRef(scale6),\n        count: scope.objectProperty(_(\"tickCount\")),\n        limit: scope.property(_(\"symbolLimit\")),\n        values: scope.objectProperty(spec.values),\n        minstep: scope.property(spec.tickMinStep),\n        formatType: scope.property(spec.formatType),\n        formatSpecifier: scope.property(spec.format)\n    }))); // continuous gradient legend\n    if (type === Gradient) {\n        children = [\n            legendGradient(spec, scale6, config, encode.gradient),\n            legendGradientLabels(spec, config, encode.labels, entryRef)\n        ]; // adjust default tick count based on the gradient length\n        params.count = params.count || scope.signalRef(`max(2,2*floor((${deref(_.gradientLength())})/100))`);\n    } else if (type === Discrete) children = [\n        legendGradientDiscrete(spec, scale6, config, encode.gradient, entryRef),\n        legendGradientLabels(spec, config, encode.labels, entryRef)\n    ];\n    else {\n        // determine legend symbol group layout\n        entryLayout = legendSymbolLayout(spec, config);\n        children = [\n            legendSymbolGroups(spec, config, encode, entryRef, deref(entryLayout.columns))\n        ]; // pass symbol size information to legend entry generator\n        params.size = sizeExpression(spec, scope, children[0].marks);\n    } // generate legend marks\n    children = [\n        guideGroup({\n            role: LegendEntryRole,\n            from: dataRef,\n            encode: entryEncode,\n            marks: children,\n            layout: entryLayout,\n            interactive: interactive2\n        })\n    ]; // include legend title if defined\n    if (datum.title) children.push(legendTitle(spec, config, encode.title, dataRef));\n     // parse legend specification\n    return parseMark(guideGroup({\n        role: LegendRole,\n        from: dataRef,\n        encode: extendEncode(buildLegendEncode(_, spec, config), legendEncode, Skip),\n        marks: children,\n        aria: _(\"aria\"),\n        description: _(\"description\"),\n        zindex: _(\"zindex\"),\n        name,\n        interactive: interactive2,\n        style\n    }), scope);\n}\nfunction legendType(spec, scaleType) {\n    let type = spec.type || Symbols;\n    if (!spec.type && scaleCount(spec) === 1 && (spec.fill || spec.stroke)) type = (0, _vegaScale.isContinuous)(scaleType) ? Gradient : (0, _vegaScale.isDiscretizing)(scaleType) ? Discrete : Symbols;\n    return type !== Gradient ? type : (0, _vegaScale.isDiscretizing)(scaleType) ? Discrete : Gradient;\n}\nfunction scaleCount(spec) {\n    return LegendScales.reduce((count, type)=>count + (spec[type] ? 1 : 0), 0);\n}\nfunction buildLegendEncode(_, spec, config) {\n    const encode = {\n        enter: {},\n        update: {}\n    };\n    addEncoders(encode, {\n        orient: _(\"orient\"),\n        offset: _(\"offset\"),\n        padding: _(\"padding\"),\n        titlePadding: _(\"titlePadding\"),\n        cornerRadius: _(\"cornerRadius\"),\n        fill: _(\"fillColor\"),\n        stroke: _(\"strokeColor\"),\n        strokeWidth: config.strokeWidth,\n        strokeDash: config.strokeDash,\n        x: _(\"legendX\"),\n        y: _(\"legendY\"),\n        // accessibility support\n        format: spec.format,\n        formatType: spec.formatType\n    });\n    return encode;\n}\nfunction sizeExpression(spec, scope, marks) {\n    const size = deref(getChannel(\"size\", spec, marks)), strokeWidth = deref(getChannel(\"strokeWidth\", spec, marks)), fontSize = deref(getFontSize(marks[1].encode, scope, GuideLabelStyle));\n    return (0, _vegaFunctions.parseExpression)(`max(ceil(sqrt(${size})+${strokeWidth}),${fontSize})`, scope);\n}\nfunction getChannel(name, spec, marks) {\n    return spec[name] ? `scale(\"${spec[name]}\",datum)` : getEncoding(name, marks[0].encode);\n}\nfunction getFontSize(encode, scope, style) {\n    return getEncoding(\"fontSize\", encode) || getStyle(\"fontSize\", scope, style);\n}\nconst angleExpr = `item.orient===\"${Left}\"?-90:item.orient===\"${Right}\"?90:0`;\nfunction parseTitle(spec, scope) {\n    spec = (0, _vegaUtil.isString)(spec) ? {\n        text: spec\n    } : spec;\n    const _ = lookup(spec, scope.config.title), encode = spec.encode || {}, userEncode = encode.group || {}, name = userEncode.name || undefined, interactive3 = userEncode.interactive, style = userEncode.style, children = []; // single-element data source for group title\n    const datum = {}, dataRef = ref(scope.add(Collect(null, [\n        datum\n    ]))); // include title text\n    children.push(buildTitle(spec, _, titleEncode(spec), dataRef)); // include subtitle text\n    if (spec.subtitle) children.push(buildSubTitle(spec, _, encode.subtitle, dataRef));\n     // parse title specification\n    return parseMark(guideGroup({\n        role: TitleRole,\n        from: dataRef,\n        encode: groupEncode(_, userEncode),\n        marks: children,\n        aria: _(\"aria\"),\n        description: _(\"description\"),\n        zindex: _(\"zindex\"),\n        name,\n        interactive: interactive3,\n        style\n    }), scope);\n} // provide backwards-compatibility for title custom encode;\n// the top-level encode block has been *deprecated*.\nfunction titleEncode(spec) {\n    const encode = spec.encode;\n    return encode && encode.title || (0, _vegaUtil.extend)({\n        name: spec.name,\n        interactive: spec.interactive,\n        style: spec.style\n    }, encode);\n}\nfunction groupEncode(_, userEncode) {\n    const encode = {\n        enter: {},\n        update: {}\n    };\n    addEncoders(encode, {\n        orient: _(\"orient\"),\n        anchor: _(\"anchor\"),\n        align: {\n            signal: alignExpr$1\n        },\n        angle: {\n            signal: angleExpr\n        },\n        limit: _(\"limit\"),\n        frame: _(\"frame\"),\n        offset: _(\"offset\") || 0,\n        padding: _(\"subtitlePadding\")\n    });\n    return extendEncode(encode, userEncode, Skip);\n}\nfunction buildTitle(spec, _, userEncode, dataRef) {\n    const zero1 = {\n        value: 0\n    }, text = spec.text, encode = {\n        enter: {\n            opacity: zero1\n        },\n        update: {\n            opacity: {\n                value: 1\n            }\n        },\n        exit: {\n            opacity: zero1\n        }\n    };\n    addEncoders(encode, {\n        text: text,\n        align: {\n            signal: \"item.mark.group.align\"\n        },\n        angle: {\n            signal: \"item.mark.group.angle\"\n        },\n        limit: {\n            signal: \"item.mark.group.limit\"\n        },\n        baseline: \"top\",\n        dx: _(\"dx\"),\n        dy: _(\"dy\"),\n        fill: _(\"color\"),\n        font: _(\"font\"),\n        fontSize: _(\"fontSize\"),\n        fontStyle: _(\"fontStyle\"),\n        fontWeight: _(\"fontWeight\"),\n        lineHeight: _(\"lineHeight\")\n    }, {\n        // update\n        align: _(\"align\"),\n        angle: _(\"angle\"),\n        baseline: _(\"baseline\")\n    });\n    return guideMark({\n        type: TextMark,\n        role: TitleTextRole,\n        style: GroupTitleStyle,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction buildSubTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n        value: 0\n    }, text = spec.subtitle, encode = {\n        enter: {\n            opacity: zero2\n        },\n        update: {\n            opacity: {\n                value: 1\n            }\n        },\n        exit: {\n            opacity: zero2\n        }\n    };\n    addEncoders(encode, {\n        text: text,\n        align: {\n            signal: \"item.mark.group.align\"\n        },\n        angle: {\n            signal: \"item.mark.group.angle\"\n        },\n        limit: {\n            signal: \"item.mark.group.limit\"\n        },\n        baseline: \"top\",\n        dx: _(\"dx\"),\n        dy: _(\"dy\"),\n        fill: _(\"subtitleColor\"),\n        font: _(\"subtitleFont\"),\n        fontSize: _(\"subtitleFontSize\"),\n        fontStyle: _(\"subtitleFontStyle\"),\n        fontWeight: _(\"subtitleFontWeight\"),\n        lineHeight: _(\"subtitleLineHeight\")\n    }, {\n        // update\n        align: _(\"align\"),\n        angle: _(\"angle\"),\n        baseline: _(\"baseline\")\n    });\n    return guideMark({\n        type: TextMark,\n        role: TitleSubtitleRole,\n        style: GroupSubtitleStyle,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction parseData(data, scope) {\n    const transforms = [];\n    if (data.transform) data.transform.forEach((tx)=>{\n        transforms.push(parseTransform(tx, scope));\n    });\n    if (data.on) data.on.forEach((on)=>{\n        parseTrigger(on, scope, data.name);\n    });\n    scope.addDataPipeline(data.name, analyze(data, scope, transforms));\n}\n/**\n * Analyze a data pipeline, add needed operators.\n */ function analyze(data, scope, ops) {\n    const output = [];\n    let source = null, modify = false, generate = false, upstream, i, n, t, m;\n    if (data.values) {\n        // hard-wired input data set\n        if (isSignal(data.values) || hasSignal(data.format)) {\n            // if either values is signal or format has signal, use dynamic loader\n            output.push(load(scope, data));\n            output.push(source = collect());\n        } else // otherwise, ingest upon dataflow init\n        output.push(source = collect({\n            $ingest: data.values,\n            $format: data.format\n        }));\n    } else if (data.url) {\n        // load data from external source\n        if (hasSignal(data.url) || hasSignal(data.format)) {\n            // if either url or format has signal, use dynamic loader\n            output.push(load(scope, data));\n            output.push(source = collect());\n        } else // otherwise, request load upon dataflow init\n        output.push(source = collect({\n            $request: data.url,\n            $format: data.format\n        }));\n    } else if (data.source) {\n        // derives from one or more other data sets\n        source = upstream = (0, _vegaUtil.array)(data.source).map((d)=>ref(scope.getData(d).output));\n        output.push(null); // populate later\n    } // scan data transforms, add collectors as needed\n    for(i = 0, n = ops.length; i < n; ++i){\n        t = ops[i];\n        m = t.metadata;\n        if (!source && !m.source) output.push(source = collect());\n        output.push(t);\n        if (m.generates) generate = true;\n        if (m.modifies && !generate) modify = true;\n        if (m.source) source = t;\n        else if (m.changes) source = null;\n    }\n    if (upstream) {\n        n = upstream.length - 1;\n        output[0] = Relay({\n            derive: modify,\n            pulse: n ? upstream : upstream[0]\n        });\n        if (modify || n) // collect derived and multi-pulse tuples\n        output.splice(1, 0, collect());\n    }\n    if (!source) output.push(collect());\n    output.push(Sieve({}));\n    return output;\n}\nfunction collect(values) {\n    const s = Collect({}, values);\n    s.metadata = {\n        source: true\n    };\n    return s;\n}\nfunction load(scope, data) {\n    return Load({\n        url: data.url ? scope.property(data.url) : undefined,\n        async: data.async ? scope.property(data.async) : undefined,\n        values: data.values ? scope.property(data.values) : undefined,\n        format: scope.objectProperty(data.format)\n    });\n}\nconst isX = (orient)=>orient === Bottom || orient === Top; // get sign coefficient based on axis orient\nconst getSign = (orient, a, b)=>isSignal(orient) ? ifLeftTopExpr(orient.signal, a, b) : orient === Left || orient === Top ? a : b; // condition on axis x-direction\nconst ifX = (orient, a, b)=>isSignal(orient) ? ifXEnc(orient.signal, a, b) : isX(orient) ? a : b; // condition on axis y-direction\nconst ifY = (orient, a, b)=>isSignal(orient) ? ifYEnc(orient.signal, a, b) : isX(orient) ? b : a;\nconst ifTop = (orient, a, b)=>isSignal(orient) ? ifTopExpr(orient.signal, a, b) : orient === Top ? {\n        value: a\n    } : {\n        value: b\n    };\nconst ifRight = (orient, a, b)=>isSignal(orient) ? ifRightExpr(orient.signal, a, b) : orient === Right ? {\n        value: a\n    } : {\n        value: b\n    };\nconst ifXEnc = ($orient, a, b)=>ifEnc(`${$orient} === '${Top}' || ${$orient} === '${Bottom}'`, a, b);\nconst ifYEnc = ($orient, a, b)=>ifEnc(`${$orient} !== '${Top}' && ${$orient} !== '${Bottom}'`, a, b);\nconst ifLeftTopExpr = ($orient, a, b)=>ifExpr(`${$orient} === '${Left}' || ${$orient} === '${Top}'`, a, b);\nconst ifTopExpr = ($orient, a, b)=>ifExpr(`${$orient} === '${Top}'`, a, b);\nconst ifRightExpr = ($orient, a, b)=>ifExpr(`${$orient} === '${Right}'`, a, b);\nconst ifEnc = (test, a, b)=>{\n    // ensure inputs are encoder objects (or null)\n    a = a != null ? encoder(a) : a;\n    b = b != null ? encoder(b) : b;\n    if (isSimple(a) && isSimple(b)) {\n        // if possible generate simple signal expression\n        a = a ? a.signal || (0, _vegaUtil.stringValue)(a.value) : null;\n        b = b ? b.signal || (0, _vegaUtil.stringValue)(b.value) : null;\n        return {\n            signal: `${test} ? (${a}) : (${b})`\n        };\n    } else // otherwise generate rule set\n    return [\n        (0, _vegaUtil.extend)({\n            test\n        }, a)\n    ].concat(b || []);\n};\nconst isSimple = (enc)=>enc == null || Object.keys(enc).length === 1;\nconst ifExpr = (test, a, b)=>({\n        signal: `${test} ? (${toExpr(a)}) : (${toExpr(b)})`\n    });\nconst ifOrient = ($orient, t, b, l, r)=>({\n        signal: (l != null ? `${$orient} === '${Left}' ? (${toExpr(l)}) : ` : \"\") + (b != null ? `${$orient} === '${Bottom}' ? (${toExpr(b)}) : ` : \"\") + (r != null ? `${$orient} === '${Right}' ? (${toExpr(r)}) : ` : \"\") + (t != null ? `${$orient} === '${Top}' ? (${toExpr(t)}) : ` : \"\") + \"(null)\"\n    });\nconst toExpr = (v)=>isSignal(v) ? v.signal : v == null ? null : (0, _vegaUtil.stringValue)(v);\nconst mult = (sign, value16)=>value16 === 0 ? 0 : isSignal(sign) ? {\n        signal: `(${sign.signal}) * ${value16}`\n    } : {\n        value: sign * value16\n    };\nconst patch = (value17, base)=>{\n    const s = value17.signal;\n    return s && s.endsWith(\"(null)\") ? {\n        signal: s.slice(0, -6) + base.signal\n    } : value17;\n};\nfunction fallback(prop, config, axisConfig1, style) {\n    let styleProp;\n    if (config && (0, _vegaUtil.hasOwnProperty)(config, prop)) return config[prop];\n    else if ((0, _vegaUtil.hasOwnProperty)(axisConfig1, prop)) return axisConfig1[prop];\n    else if (prop.startsWith(\"title\")) {\n        switch(prop){\n            case \"titleColor\":\n                styleProp = \"fill\";\n                break;\n            case \"titleFont\":\n            case \"titleFontSize\":\n            case \"titleFontWeight\":\n                styleProp = prop[5].toLowerCase() + prop.slice(6);\n        }\n        return style[GuideTitleStyle][styleProp];\n    } else if (prop.startsWith(\"label\")) {\n        switch(prop){\n            case \"labelColor\":\n                styleProp = \"fill\";\n                break;\n            case \"labelFont\":\n            case \"labelFontSize\":\n                styleProp = prop[5].toLowerCase() + prop.slice(6);\n        }\n        return style[GuideLabelStyle][styleProp];\n    }\n    return null;\n}\nfunction keys(objects) {\n    const map = {};\n    for (const obj of objects){\n        if (!obj) continue;\n        for(const key in obj)map[key] = 1;\n    }\n    return Object.keys(map);\n}\nfunction axisConfig(spec, scope) {\n    var config = scope.config, style = config.style, axis = config.axis, band = scope.scaleType(spec.scale) === \"band\" && config.axisBand, orient = spec.orient, xy, or, key;\n    if (isSignal(orient)) {\n        const xyKeys = keys([\n            config.axisX,\n            config.axisY\n        ]), orientKeys = keys([\n            config.axisTop,\n            config.axisBottom,\n            config.axisLeft,\n            config.axisRight\n        ]);\n        xy = {};\n        for (key of xyKeys)xy[key] = ifX(orient, fallback(key, config.axisX, axis, style), fallback(key, config.axisY, axis, style));\n        or = {};\n        for (key of orientKeys)or[key] = ifOrient(orient.signal, fallback(key, config.axisTop, axis, style), fallback(key, config.axisBottom, axis, style), fallback(key, config.axisLeft, axis, style), fallback(key, config.axisRight, axis, style));\n    } else {\n        xy = orient === Top || orient === Bottom ? config.axisX : config.axisY;\n        or = config[\"axis\" + orient[0].toUpperCase() + orient.slice(1)];\n    }\n    const result = xy || or || band ? (0, _vegaUtil.extend)({}, axis, xy, or, band) : axis;\n    return result;\n}\nfunction axisDomain(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient;\n    let enter, update;\n    const encode = {\n        enter: enter = {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one\n        },\n        exit: {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"domainColor\"),\n        strokeCap: _(\"domainCap\"),\n        strokeDash: _(\"domainDash\"),\n        strokeDashOffset: _(\"domainDashOffset\"),\n        strokeWidth: _(\"domainWidth\"),\n        strokeOpacity: _(\"domainOpacity\")\n    });\n    const pos0 = position(spec, 0);\n    const pos1 = position(spec, 1);\n    enter.x = update.x = ifX(orient, pos0, zero);\n    enter.x2 = update.x2 = ifX(orient, pos1);\n    enter.y = update.y = ifY(orient, pos0, zero);\n    enter.y2 = update.y2 = ifY(orient, pos1);\n    return guideMark({\n        type: RuleMark,\n        role: AxisDomainRole,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction position(spec, pos) {\n    return {\n        scale: spec.scale,\n        range: pos\n    };\n}\nfunction axisGrid(spec, config, userEncode, dataRef, band) {\n    const _ = lookup(spec, config), orient = spec.orient, vscale = spec.gridScale, sign = getSign(orient, 1, -1), offset = offsetValue(spec.offset, sign);\n    let enter, exit, update;\n    const encode = {\n        enter: enter = {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one\n        },\n        exit: exit = {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"gridColor\"),\n        strokeCap: _(\"gridCap\"),\n        strokeDash: _(\"gridDash\"),\n        strokeDashOffset: _(\"gridDashOffset\"),\n        strokeOpacity: _(\"gridOpacity\"),\n        strokeWidth: _(\"gridWidth\")\n    });\n    const tickPos = {\n        scale: spec.scale,\n        field: Value,\n        band: band.band,\n        extra: band.extra,\n        offset: band.offset,\n        round: _(\"tickRound\")\n    };\n    const sz = ifX(orient, {\n        signal: \"height\"\n    }, {\n        signal: \"width\"\n    });\n    const gridStart = vscale ? {\n        scale: vscale,\n        range: 0,\n        mult: sign,\n        offset: offset\n    } : {\n        value: 0,\n        offset: offset\n    };\n    const gridEnd = vscale ? {\n        scale: vscale,\n        range: 1,\n        mult: sign,\n        offset: offset\n    } : (0, _vegaUtil.extend)(sz, {\n        mult: sign,\n        offset: offset\n    });\n    enter.x = update.x = ifX(orient, tickPos, gridStart);\n    enter.y = update.y = ifY(orient, tickPos, gridStart);\n    enter.x2 = update.x2 = ifY(orient, gridEnd);\n    enter.y2 = update.y2 = ifX(orient, gridEnd);\n    exit.x = ifX(orient, tickPos);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n        type: RuleMark,\n        role: AxisGridRole,\n        key: Value,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction offsetValue(offset, sign) {\n    if (sign === 1) ;\n    else if (!(0, _vegaUtil.isObject)(offset)) offset = isSignal(sign) ? {\n        signal: `(${sign.signal}) * (${offset || 0})`\n    } : sign * (offset || 0);\n    else {\n        let entry6 = offset = (0, _vegaUtil.extend)({}, offset);\n        while(entry6.mult != null)if (!(0, _vegaUtil.isObject)(entry6.mult)) {\n            entry6.mult = isSignal(sign) // no offset if sign === 1\n             ? {\n                signal: `(${entry6.mult}) * (${sign.signal})`\n            } : entry6.mult * sign;\n            return offset;\n        } else entry6 = entry6.mult = (0, _vegaUtil.extend)({}, entry6.mult);\n        entry6.mult = sign;\n    }\n    return offset;\n}\nfunction axisTicks(spec, config, userEncode, dataRef, size, band) {\n    const _ = lookup(spec, config), orient = spec.orient, sign = getSign(orient, -1, 1);\n    let enter, exit, update;\n    const encode = {\n        enter: enter = {\n            opacity: zero\n        },\n        update: update = {\n            opacity: one\n        },\n        exit: exit = {\n            opacity: zero\n        }\n    };\n    addEncoders(encode, {\n        stroke: _(\"tickColor\"),\n        strokeCap: _(\"tickCap\"),\n        strokeDash: _(\"tickDash\"),\n        strokeDashOffset: _(\"tickDashOffset\"),\n        strokeOpacity: _(\"tickOpacity\"),\n        strokeWidth: _(\"tickWidth\")\n    });\n    const tickSize = encoder(size);\n    tickSize.mult = sign;\n    const tickPos = {\n        scale: spec.scale,\n        field: Value,\n        band: band.band,\n        extra: band.extra,\n        offset: band.offset,\n        round: _(\"tickRound\")\n    };\n    update.y = enter.y = ifX(orient, zero, tickPos);\n    update.y2 = enter.y2 = ifX(orient, tickSize);\n    exit.x = ifX(orient, tickPos);\n    update.x = enter.x = ifY(orient, zero, tickPos);\n    update.x2 = enter.x2 = ifY(orient, tickSize);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n        type: RuleMark,\n        role: AxisTickRole,\n        key: Value,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction flushExpr(scale7, threshold, a, b, c) {\n    return {\n        signal: 'flush(range(\"' + scale7 + '\"), ' + 'scale(\"' + scale7 + '\", datum.value), ' + threshold + \",\" + a + \",\" + b + \",\" + c + \")\"\n    };\n}\nfunction axisLabels(spec, config, userEncode, dataRef, size, band) {\n    const _ = lookup(spec, config), orient = spec.orient, scale8 = spec.scale, sign = getSign(orient, -1, 1), flush = deref(_(\"labelFlush\")), flushOffset = deref(_(\"labelFlushOffset\")), labelAlign = _(\"labelAlign\"), labelBaseline = _(\"labelBaseline\");\n    let flushOn = flush === 0 || !!flush, update;\n    const tickSize = encoder(size);\n    tickSize.mult = sign;\n    tickSize.offset = encoder(_(\"labelPadding\") || 0);\n    tickSize.offset.mult = sign;\n    const tickPos = {\n        scale: scale8,\n        field: Value,\n        band: 0.5,\n        offset: extendOffset(band.offset, _(\"labelOffset\"))\n    };\n    const align = ifX(orient, flushOn ? flushExpr(scale8, flush, '\"left\"', '\"right\"', '\"center\"') : {\n        value: \"center\"\n    }, ifRight(orient, \"left\", \"right\"));\n    const baseline1 = ifX(orient, ifTop(orient, \"bottom\", \"top\"), flushOn ? flushExpr(scale8, flush, '\"top\"', '\"bottom\"', '\"middle\"') : {\n        value: \"middle\"\n    });\n    const offsetExpr = flushExpr(scale8, flush, `-(${flushOffset})`, flushOffset, 0);\n    flushOn = flushOn && flushOffset;\n    const enter = {\n        opacity: zero,\n        x: ifX(orient, tickPos, tickSize),\n        y: ifY(orient, tickPos, tickSize)\n    };\n    const encode = {\n        enter: enter,\n        update: update = {\n            opacity: one,\n            text: {\n                field: Label\n            },\n            x: enter.x,\n            y: enter.y,\n            align,\n            baseline: baseline1\n        },\n        exit: {\n            opacity: zero,\n            x: enter.x,\n            y: enter.y\n        }\n    };\n    addEncoders(encode, {\n        dx: !labelAlign && flushOn ? ifX(orient, offsetExpr) : null,\n        dy: !labelBaseline && flushOn ? ifY(orient, offsetExpr) : null\n    });\n    addEncoders(encode, {\n        angle: _(\"labelAngle\"),\n        fill: _(\"labelColor\"),\n        fillOpacity: _(\"labelOpacity\"),\n        font: _(\"labelFont\"),\n        fontSize: _(\"labelFontSize\"),\n        fontWeight: _(\"labelFontWeight\"),\n        fontStyle: _(\"labelFontStyle\"),\n        limit: _(\"labelLimit\"),\n        lineHeight: _(\"labelLineHeight\")\n    }, {\n        align: labelAlign,\n        baseline: labelBaseline\n    });\n    const bound = _(\"labelBound\");\n    let overlap = _(\"labelOverlap\"); // if overlap method or bound defined, request label overlap removal\n    overlap = overlap || bound ? {\n        separation: _(\"labelSeparation\"),\n        method: overlap,\n        order: \"datum.index\",\n        bound: bound ? {\n            scale: scale8,\n            orient,\n            tolerance: bound\n        } : null\n    } : undefined;\n    if (update.align !== align) update.align = patch(update.align, align);\n    if (update.baseline !== baseline1) update.baseline = patch(update.baseline, baseline1);\n    return guideMark({\n        type: TextMark,\n        role: AxisLabelRole,\n        style: GuideLabelStyle,\n        key: Value,\n        from: dataRef,\n        encode,\n        overlap\n    }, userEncode);\n}\nfunction axisTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient, sign = getSign(orient, -1, 1);\n    let enter, update;\n    const encode = {\n        enter: enter = {\n            opacity: zero,\n            anchor: encoder(_(\"titleAnchor\", null)),\n            align: {\n                signal: alignExpr$1\n            }\n        },\n        update: update = (0, _vegaUtil.extend)({}, enter, {\n            opacity: one,\n            text: encoder(spec.title)\n        }),\n        exit: {\n            opacity: zero\n        }\n    };\n    const titlePos = {\n        signal: `lerp(range(\"${spec.scale}\"), ${anchorExpr(0, 1, 0.5)})`\n    };\n    update.x = ifX(orient, titlePos);\n    update.y = ifY(orient, titlePos);\n    enter.angle = ifX(orient, zero, mult(sign, 90));\n    enter.baseline = ifX(orient, ifTop(orient, Bottom, Top), {\n        value: Bottom\n    });\n    update.angle = enter.angle;\n    update.baseline = enter.baseline;\n    addEncoders(encode, {\n        fill: _(\"titleColor\"),\n        fillOpacity: _(\"titleOpacity\"),\n        font: _(\"titleFont\"),\n        fontSize: _(\"titleFontSize\"),\n        fontStyle: _(\"titleFontStyle\"),\n        fontWeight: _(\"titleFontWeight\"),\n        limit: _(\"titleLimit\"),\n        lineHeight: _(\"titleLineHeight\")\n    }, {\n        // require update\n        align: _(\"titleAlign\"),\n        angle: _(\"titleAngle\"),\n        baseline: _(\"titleBaseline\")\n    });\n    autoLayout(_, orient, encode, userEncode);\n    encode.update.align = patch(encode.update.align, enter.align);\n    encode.update.angle = patch(encode.update.angle, enter.angle);\n    encode.update.baseline = patch(encode.update.baseline, enter.baseline);\n    return guideMark({\n        type: TextMark,\n        role: AxisTitleRole,\n        style: GuideTitleStyle,\n        from: dataRef,\n        encode\n    }, userEncode);\n}\nfunction autoLayout(_, orient, encode, userEncode) {\n    const auto = (value18, dim)=>value18 != null ? (encode.update[dim] = patch(encoder(value18), encode.update[dim]), false) : !has(dim, userEncode) ? true : false;\n    const autoY = auto(_(\"titleX\"), \"x\"), autoX = auto(_(\"titleY\"), \"y\");\n    encode.enter.auto = autoX === autoY ? encoder(autoX) : ifX(orient, encoder(autoX), encoder(autoY));\n}\nfunction parseAxis(spec, scope) {\n    const config = axisConfig(spec, scope), encode = spec.encode || {}, axisEncode = encode.axis || {}, name = axisEncode.name || undefined, interactive4 = axisEncode.interactive, style = axisEncode.style, _ = lookup(spec, config), band = tickBand(_); // single-element data source for axis group\n    const datum = {\n        scale: spec.scale,\n        ticks: !!_(\"ticks\"),\n        labels: !!_(\"labels\"),\n        grid: !!_(\"grid\"),\n        domain: !!_(\"domain\"),\n        title: spec.title != null\n    };\n    const dataRef = ref(scope.add(Collect({}, [\n        datum\n    ]))); // data source for axis ticks\n    const ticksRef = ref(scope.add(AxisTicks({\n        scale: scope.scaleRef(spec.scale),\n        extra: scope.property(band.extra),\n        count: scope.objectProperty(spec.tickCount),\n        values: scope.objectProperty(spec.values),\n        minstep: scope.property(spec.tickMinStep),\n        formatType: scope.property(spec.formatType),\n        formatSpecifier: scope.property(spec.format)\n    }))); // generate axis marks\n    const children = [];\n    let size; // include axis gridlines if requested\n    if (datum.grid) children.push(axisGrid(spec, config, encode.grid, ticksRef, band));\n     // include axis ticks if requested\n    if (datum.ticks) {\n        size = _(\"tickSize\");\n        children.push(axisTicks(spec, config, encode.ticks, ticksRef, size, band));\n    } // include axis labels if requested\n    if (datum.labels) {\n        size = datum.ticks ? size : 0;\n        children.push(axisLabels(spec, config, encode.labels, ticksRef, size, band));\n    } // include axis domain path if requested\n    if (datum.domain) children.push(axisDomain(spec, config, encode.domain, dataRef));\n     // include axis title if defined\n    if (datum.title) children.push(axisTitle(spec, config, encode.title, dataRef));\n     // parse axis specification\n    return parseMark(guideGroup({\n        role: AxisRole,\n        from: dataRef,\n        encode: extendEncode(buildAxisEncode(_, spec), axisEncode, Skip),\n        marks: children,\n        aria: _(\"aria\"),\n        description: _(\"description\"),\n        zindex: _(\"zindex\"),\n        name,\n        interactive: interactive4,\n        style\n    }), scope);\n}\nfunction buildAxisEncode(_, spec) {\n    const encode = {\n        enter: {},\n        update: {}\n    };\n    addEncoders(encode, {\n        orient: _(\"orient\"),\n        offset: _(\"offset\") || 0,\n        position: value(spec.position, 0),\n        titlePadding: _(\"titlePadding\"),\n        minExtent: _(\"minExtent\"),\n        maxExtent: _(\"maxExtent\"),\n        range: {\n            signal: `abs(span(range(\"${spec.scale}\")))`\n        },\n        translate: _(\"translate\"),\n        // accessibility support\n        format: spec.format,\n        formatType: spec.formatType\n    });\n    return encode;\n}\nfunction parseScope(spec, scope, preprocessed) {\n    const signals = (0, _vegaUtil.array)(spec.signals), scales = (0, _vegaUtil.array)(spec.scales); // parse signal definitions, if not already preprocessed\n    if (!preprocessed) signals.forEach((_)=>parseSignal(_, scope)); // parse cartographic projection definitions\n    (0, _vegaUtil.array)(spec.projections).forEach((_)=>parseProjection(_, scope)); // initialize scale references\n    scales.forEach((_)=>initScale(_, scope)); // parse data sources\n    (0, _vegaUtil.array)(spec.data).forEach((_)=>parseData(_, scope)); // parse scale definitions\n    scales.forEach((_)=>parseScale(_, scope)); // parse signal updates\n    (preprocessed || signals).forEach((_)=>parseSignalUpdates(_, scope)); // parse axis definitions\n    (0, _vegaUtil.array)(spec.axes).forEach((_)=>parseAxis(_, scope)); // parse mark definitions\n    (0, _vegaUtil.array)(spec.marks).forEach((_)=>parseMark(_, scope)); // parse legend definitions\n    (0, _vegaUtil.array)(spec.legends).forEach((_)=>parseLegend(_, scope)); // parse title, if defined\n    if (spec.title) parseTitle(spec.title, scope); // parse collected lambda (anonymous) expressions\n    scope.parseLambdas();\n    return scope;\n}\nconst rootEncode = (spec)=>extendEncode({\n        enter: {\n            x: {\n                value: 0\n            },\n            y: {\n                value: 0\n            }\n        },\n        update: {\n            width: {\n                signal: \"width\"\n            },\n            height: {\n                signal: \"height\"\n            }\n        }\n    }, spec);\nfunction parseView(spec, scope) {\n    const config = scope.config; // add scenegraph root\n    const root = ref(scope.root = scope.add(operator())); // parse top-level signal definitions\n    const signals = collectSignals(spec, config);\n    signals.forEach((_)=>parseSignal(_, scope)); // assign description, event, legend, and locale configuration\n    scope.description = spec.description || config.description;\n    scope.eventConfig = config.events;\n    scope.legends = scope.objectProperty(config.legend && config.legend.layout);\n    scope.locale = config.locale; // store root group item\n    const input = scope.add(Collect()); // encode root group item\n    const encode = scope.add(Encode(parseEncode(rootEncode(spec.encode), GroupMark, FrameRole, spec.style, scope, {\n        pulse: ref(input)\n    }))); // perform view layout\n    const parent = scope.add(ViewLayout({\n        layout: scope.objectProperty(spec.layout),\n        legends: scope.legends,\n        autosize: scope.signalRef(\"autosize\"),\n        mark: root,\n        pulse: ref(encode)\n    }));\n    scope.operators.pop(); // parse remainder of specification\n    scope.pushState(ref(encode), ref(parent), null);\n    parseScope(spec, scope, signals);\n    scope.operators.push(parent); // bound / render / sieve root item\n    let op = scope.add(Bound({\n        mark: root,\n        pulse: ref(parent)\n    }));\n    op = scope.add(Render({\n        pulse: ref(op)\n    }));\n    op = scope.add(Sieve({\n        pulse: ref(op)\n    })); // track metadata for root item\n    scope.addData(\"root\", new DataScope(scope, input, input, op));\n    return scope;\n}\nfunction signalObject(name, value19) {\n    return value19 && value19.signal ? {\n        name,\n        update: value19.signal\n    } : {\n        name,\n        value: value19\n    };\n}\n/**\n * Collect top-level signals, merging values as needed. Signals\n * defined in the config signals arrays are added only if that\n * signal is not explicitly defined in the specification.\n * Built-in signals (autosize, background, padding, width, height)\n * receive special treatment. They are initialized using the\n * top-level spec property, or, if undefined in the spec, using\n * the corresponding top-level config property. If this property\n * is a signal reference object, the signal expression maps to the\n * signal 'update' property. If the spec's top-level signal array\n * contains an entry that matches a built-in signal, that entry\n * will be merged with the built-in specification, potentially\n * overwriting existing 'value' or 'update' properties.\n */ function collectSignals(spec, config) {\n    const _ = (name)=>value(spec[name], config[name]), signals = [\n        signalObject(\"background\", _(\"background\")),\n        signalObject(\"autosize\", parseAutosize(_(\"autosize\"))),\n        signalObject(\"padding\", parsePadding(_(\"padding\"))),\n        signalObject(\"width\", _(\"width\") || 0),\n        signalObject(\"height\", _(\"height\") || 0)\n    ], pre = signals.reduce((p, s)=>(p[s.name] = s, p), {}), map = {}; // add spec signal array\n    (0, _vegaUtil.array)(spec.signals).forEach((s)=>{\n        if ((0, _vegaUtil.hasOwnProperty)(pre, s.name)) // merge if built-in signal\n        s = (0, _vegaUtil.extend)(pre[s.name], s);\n        else // otherwise add to signal list\n        signals.push(s);\n        map[s.name] = s;\n    }); // add config signal array\n    (0, _vegaUtil.array)(config.signals).forEach((s)=>{\n        if (!(0, _vegaUtil.hasOwnProperty)(map, s.name) && !(0, _vegaUtil.hasOwnProperty)(pre, s.name)) // add to signal list if not already defined\n        signals.push(s);\n    });\n    return signals;\n}\nfunction Scope(config, options) {\n    this.config = config || {};\n    this.options = options || {};\n    this.bindings = [];\n    this.field = {};\n    this.signals = {};\n    this.lambdas = {};\n    this.scales = {};\n    this.events = {};\n    this.data = {};\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this.eventConfig = null;\n    this.locale = null;\n    this._id = 0;\n    this._subid = 0;\n    this._nextsub = [\n        0\n    ];\n    this._parent = [];\n    this._encode = [];\n    this._lookup = [];\n    this._markpath = [];\n}\nfunction Subscope(scope) {\n    this.config = scope.config;\n    this.options = scope.options;\n    this.legends = scope.legends;\n    this.field = Object.create(scope.field);\n    this.signals = Object.create(scope.signals);\n    this.lambdas = Object.create(scope.lambdas);\n    this.scales = Object.create(scope.scales);\n    this.events = Object.create(scope.events);\n    this.data = Object.create(scope.data);\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this._id = 0;\n    this._subid = ++scope._nextsub[0];\n    this._nextsub = scope._nextsub;\n    this._parent = scope._parent.slice();\n    this._encode = scope._encode.slice();\n    this._lookup = scope._lookup.slice();\n    this._markpath = scope._markpath;\n}\nScope.prototype = Subscope.prototype = {\n    parse (spec) {\n        return parseScope(spec, this);\n    },\n    fork () {\n        return new Subscope(this);\n    },\n    isSubscope () {\n        return this._subid > 0;\n    },\n    toRuntime () {\n        this.finish();\n        return {\n            description: this.description,\n            operators: this.operators,\n            streams: this.streams,\n            updates: this.updates,\n            bindings: this.bindings,\n            eventConfig: this.eventConfig,\n            locale: this.locale\n        };\n    },\n    id () {\n        return (this._subid ? this._subid + \":\" : 0) + this._id++;\n    },\n    add (op) {\n        this.operators.push(op);\n        op.id = this.id(); // if pre-registration references exist, resolve them now\n        if (op.refs) {\n            op.refs.forEach((ref5)=>{\n                ref5.$ref = op.id;\n            });\n            op.refs = null;\n        }\n        return op;\n    },\n    proxy (op) {\n        const vref = op instanceof Entry ? ref(op) : op;\n        return this.add(Proxy({\n            value: vref\n        }));\n    },\n    addStream (stream) {\n        this.streams.push(stream);\n        stream.id = this.id();\n        return stream;\n    },\n    addUpdate (update) {\n        this.updates.push(update);\n        return update;\n    },\n    // Apply metadata\n    finish () {\n        let name3, ds; // annotate root\n        if (this.root) this.root.root = true; // annotate signals\n        for(name3 in this.signals)this.signals[name3].signal = name3;\n         // annotate scales\n        for(name3 in this.scales)this.scales[name3].scale = name3;\n         // annotate data sets\n        function annotate(op, name, type) {\n            let data, list;\n            if (op) {\n                data = op.data || (op.data = {});\n                list = data[name] || (data[name] = []);\n                list.push(type);\n            }\n        }\n        for(name3 in this.data){\n            ds = this.data[name3];\n            annotate(ds.input, name3, \"input\");\n            annotate(ds.output, name3, \"output\");\n            annotate(ds.values, name3, \"values\");\n            for(const field12 in ds.index)annotate(ds.index[field12], name3, \"index:\" + field12);\n        }\n        return this;\n    },\n    // ----\n    pushState (encode, parent, lookup1) {\n        this._encode.push(ref(this.add(Sieve({\n            pulse: encode\n        }))));\n        this._parent.push(parent);\n        this._lookup.push(lookup1 ? ref(this.proxy(lookup1)) : null);\n        this._markpath.push(-1);\n    },\n    popState () {\n        this._encode.pop();\n        this._parent.pop();\n        this._lookup.pop();\n        this._markpath.pop();\n    },\n    parent () {\n        return (0, _vegaUtil.peek)(this._parent);\n    },\n    encode () {\n        return (0, _vegaUtil.peek)(this._encode);\n    },\n    lookup () {\n        return (0, _vegaUtil.peek)(this._lookup);\n    },\n    markpath () {\n        const p = this._markpath;\n        return ++p[p.length - 1];\n    },\n    // ----\n    fieldRef (field13, name) {\n        if ((0, _vegaUtil.isString)(field13)) return fieldRef$1(field13, name);\n        if (!field13.signal) (0, _vegaUtil.error)(\"Unsupported field reference: \" + (0, _vegaUtil.stringValue)(field13));\n        const s = field13.signal;\n        let f = this.field[s];\n        if (!f) {\n            const params = {\n                name: this.signalRef(s)\n            };\n            if (name) params.as = name;\n            this.field[s] = f = ref(this.add(Field(params)));\n        }\n        return f;\n    },\n    compareRef (cmp) {\n        let signal = false;\n        const check = (_)=>isSignal(_) ? (signal = true, this.signalRef(_.signal)) : isExpr$1(_) ? (signal = true, this.exprRef(_.expr)) : _;\n        const fields = (0, _vegaUtil.array)(cmp.field).map(check), orders = (0, _vegaUtil.array)(cmp.order).map(check);\n        return signal ? ref(this.add(Compare({\n            fields: fields,\n            orders: orders\n        }))) : compareRef(fields, orders);\n    },\n    keyRef (fields, flat) {\n        let signal = false;\n        const check = (_)=>isSignal(_) ? (signal = true, ref(sig[_.signal])) : _;\n        const sig = this.signals;\n        fields = (0, _vegaUtil.array)(fields).map(check);\n        return signal ? ref(this.add(Key({\n            fields: fields,\n            flat: flat\n        }))) : keyRef(fields, flat);\n    },\n    sortRef (sort) {\n        if (!sort) return sort; // including id ensures stable sorting\n        const a = aggrField(sort.op, sort.field), o = sort.order || Ascending;\n        return o.signal ? ref(this.add(Compare({\n            fields: a,\n            orders: this.signalRef(o.signal)\n        }))) : compareRef(a, o);\n    },\n    // ----\n    event (source, type) {\n        const key = source + \":\" + type;\n        if (!this.events[key]) {\n            const id = this.id();\n            this.streams.push({\n                id: id,\n                source: source,\n                type: type\n            });\n            this.events[key] = id;\n        }\n        return this.events[key];\n    },\n    // ----\n    hasOwnSignal (name) {\n        return (0, _vegaUtil.hasOwnProperty)(this.signals, name);\n    },\n    addSignal (name, value20) {\n        if (this.hasOwnSignal(name)) (0, _vegaUtil.error)(\"Duplicate signal name: \" + (0, _vegaUtil.stringValue)(name));\n        const op = value20 instanceof Entry ? value20 : this.add(operator(value20));\n        return this.signals[name] = op;\n    },\n    getSignal (name) {\n        if (!this.signals[name]) (0, _vegaUtil.error)(\"Unrecognized signal name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.signals[name];\n    },\n    signalRef (s) {\n        if (this.signals[s]) return ref(this.signals[s]);\n        else if (!(0, _vegaUtil.hasOwnProperty)(this.lambdas, s)) this.lambdas[s] = this.add(operator(null));\n        return ref(this.lambdas[s]);\n    },\n    parseLambdas () {\n        const code = Object.keys(this.lambdas);\n        for(let i = 0, n = code.length; i < n; ++i){\n            const s = code[i], e = (0, _vegaFunctions.parseExpression)(s, this), op = this.lambdas[s];\n            op.params = e.$params;\n            op.update = e.$expr;\n        }\n    },\n    property (spec) {\n        return spec && spec.signal ? this.signalRef(spec.signal) : spec;\n    },\n    objectProperty (spec) {\n        return !spec || !(0, _vegaUtil.isObject)(spec) ? spec : this.signalRef(spec.signal || propertyLambda(spec));\n    },\n    exprRef (code, name) {\n        const params = {\n            expr: (0, _vegaFunctions.parseExpression)(code, this)\n        };\n        if (name) params.expr.$name = name;\n        return ref(this.add(Expression(params)));\n    },\n    addBinding (name, bind) {\n        if (!this.bindings) (0, _vegaUtil.error)(\"Nested signals do not support binding: \" + (0, _vegaUtil.stringValue)(name));\n        this.bindings.push((0, _vegaUtil.extend)({\n            signal: name\n        }, bind));\n    },\n    // ----\n    addScaleProj (name, transform1) {\n        if ((0, _vegaUtil.hasOwnProperty)(this.scales, name)) (0, _vegaUtil.error)(\"Duplicate scale or projection name: \" + (0, _vegaUtil.stringValue)(name));\n        this.scales[name] = this.add(transform1);\n    },\n    addScale (name, params) {\n        this.addScaleProj(name, Scale(params));\n    },\n    addProjection (name, params) {\n        this.addScaleProj(name, Projection(params));\n    },\n    getScale (name) {\n        if (!this.scales[name]) (0, _vegaUtil.error)(\"Unrecognized scale name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.scales[name];\n    },\n    scaleRef (name) {\n        return ref(this.getScale(name));\n    },\n    scaleType (name) {\n        return this.getScale(name).params.type;\n    },\n    projectionRef (name) {\n        return this.scaleRef(name);\n    },\n    projectionType (name) {\n        return this.scaleType(name);\n    },\n    // ----\n    addData (name, dataScope) {\n        if ((0, _vegaUtil.hasOwnProperty)(this.data, name)) (0, _vegaUtil.error)(\"Duplicate data set name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.data[name] = dataScope;\n    },\n    getData (name) {\n        if (!this.data[name]) (0, _vegaUtil.error)(\"Undefined data set name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.data[name];\n    },\n    addDataPipeline (name, entries) {\n        if ((0, _vegaUtil.hasOwnProperty)(this.data, name)) (0, _vegaUtil.error)(\"Duplicate data set name: \" + (0, _vegaUtil.stringValue)(name));\n        return this.addData(name, DataScope.fromEntries(this, entries));\n    }\n};\nfunction propertyLambda(spec) {\n    return ((0, _vegaUtil.isArray)(spec) ? arrayLambda : objectLambda)(spec);\n}\nfunction arrayLambda(array) {\n    const n = array.length;\n    let code = \"[\";\n    for(let i = 0; i < n; ++i){\n        const value21 = array[i];\n        code += (i > 0 ? \",\" : \"\") + ((0, _vegaUtil.isObject)(value21) ? value21.signal || propertyLambda(value21) : (0, _vegaUtil.stringValue)(value21));\n    }\n    return code + \"]\";\n}\nfunction objectLambda(obj) {\n    let code = \"{\", i = 0, key, value22;\n    for(key in obj){\n        value22 = obj[key];\n        code += (++i > 1 ? \",\" : \"\") + (0, _vegaUtil.stringValue)(key) + \":\" + ((0, _vegaUtil.isObject)(value22) ? value22.signal || propertyLambda(value22) : (0, _vegaUtil.stringValue)(value22));\n    }\n    return code + \"}\";\n}\n/**\n * Standard configuration defaults for Vega specification parsing.\n * Users can provide their own (sub-)set of these default values\n * by passing in a config object to the top-level parse method.\n */ function defaults() {\n    const defaultFont = \"sans-serif\", defaultSymbolSize = 30, defaultStrokeWidth = 2, defaultColor = \"#4c78a8\", black = \"#000\", gray = \"#888\", lightGray = \"#ddd\";\n    return {\n        // default visualization description\n        description: \"Vega visualization\",\n        // default padding around visualization\n        padding: 0,\n        // default for automatic sizing; options: 'none', 'pad', 'fit'\n        // or provide an object (e.g., {'type': 'pad', 'resize': true})\n        autosize: \"pad\",\n        // default view background color\n        // covers the entire view component\n        background: null,\n        // default event handling configuration\n        // preventDefault for view-sourced event types except 'wheel'\n        events: {\n            defaults: {\n                allow: [\n                    \"wheel\"\n                ]\n            }\n        },\n        // defaults for top-level group marks\n        // accepts mark properties (fill, stroke, etc)\n        // covers the data rectangle within group width/height\n        group: null,\n        // defaults for basic mark types\n        // each subset accepts mark properties (fill, stroke, etc)\n        mark: null,\n        arc: {\n            fill: defaultColor\n        },\n        area: {\n            fill: defaultColor\n        },\n        image: null,\n        line: {\n            stroke: defaultColor,\n            strokeWidth: defaultStrokeWidth\n        },\n        path: {\n            stroke: defaultColor\n        },\n        rect: {\n            fill: defaultColor\n        },\n        rule: {\n            stroke: black\n        },\n        shape: {\n            stroke: defaultColor\n        },\n        symbol: {\n            fill: defaultColor,\n            size: 64\n        },\n        text: {\n            fill: black,\n            font: defaultFont,\n            fontSize: 11\n        },\n        trail: {\n            fill: defaultColor,\n            size: defaultStrokeWidth\n        },\n        // style definitions\n        style: {\n            // axis & legend labels\n            \"guide-label\": {\n                fill: black,\n                font: defaultFont,\n                fontSize: 10\n            },\n            // axis & legend titles\n            \"guide-title\": {\n                fill: black,\n                font: defaultFont,\n                fontSize: 11,\n                fontWeight: \"bold\"\n            },\n            // headers, including chart title\n            \"group-title\": {\n                fill: black,\n                font: defaultFont,\n                fontSize: 13,\n                fontWeight: \"bold\"\n            },\n            // chart subtitle\n            \"group-subtitle\": {\n                fill: black,\n                font: defaultFont,\n                fontSize: 12\n            },\n            // defaults for styled point marks in Vega-Lite\n            point: {\n                size: defaultSymbolSize,\n                strokeWidth: defaultStrokeWidth,\n                shape: \"circle\"\n            },\n            circle: {\n                size: defaultSymbolSize,\n                strokeWidth: defaultStrokeWidth\n            },\n            square: {\n                size: defaultSymbolSize,\n                strokeWidth: defaultStrokeWidth,\n                shape: \"square\"\n            },\n            // defaults for styled group marks in Vega-Lite\n            cell: {\n                fill: \"transparent\",\n                stroke: lightGray\n            }\n        },\n        // defaults for title\n        title: {\n            orient: \"top\",\n            anchor: \"middle\",\n            offset: 4,\n            subtitlePadding: 3\n        },\n        // defaults for axes\n        axis: {\n            minExtent: 0,\n            maxExtent: 200,\n            bandPosition: 0.5,\n            domain: true,\n            domainWidth: 1,\n            domainColor: gray,\n            grid: false,\n            gridWidth: 1,\n            gridColor: lightGray,\n            labels: true,\n            labelAngle: 0,\n            labelLimit: 180,\n            labelOffset: 0,\n            labelPadding: 2,\n            ticks: true,\n            tickColor: gray,\n            tickOffset: 0,\n            tickRound: true,\n            tickSize: 5,\n            tickWidth: 1,\n            titlePadding: 4\n        },\n        // correction for centering bias\n        axisBand: {\n            tickOffset: -0.5\n        },\n        // defaults for cartographic projection\n        projection: {\n            type: \"mercator\"\n        },\n        // defaults for legends\n        legend: {\n            orient: \"right\",\n            padding: 0,\n            gridAlign: \"each\",\n            columnPadding: 10,\n            rowPadding: 2,\n            symbolDirection: \"vertical\",\n            gradientDirection: \"vertical\",\n            gradientLength: 200,\n            gradientThickness: 16,\n            gradientStrokeColor: lightGray,\n            gradientStrokeWidth: 0,\n            gradientLabelOffset: 2,\n            labelAlign: \"left\",\n            labelBaseline: \"middle\",\n            labelLimit: 160,\n            labelOffset: 4,\n            labelOverlap: true,\n            symbolLimit: 30,\n            symbolType: \"circle\",\n            symbolSize: 100,\n            symbolOffset: 0,\n            symbolStrokeWidth: 1.5,\n            symbolBaseFillColor: \"transparent\",\n            symbolBaseStrokeColor: gray,\n            titleLimit: 180,\n            titleOrient: \"top\",\n            titlePadding: 5,\n            layout: {\n                offset: 18,\n                direction: \"horizontal\",\n                left: {\n                    direction: \"vertical\"\n                },\n                right: {\n                    direction: \"vertical\"\n                }\n            }\n        },\n        // defaults for scale ranges\n        range: {\n            category: {\n                scheme: \"tableau10\"\n            },\n            ordinal: {\n                scheme: \"blues\"\n            },\n            heatmap: {\n                scheme: \"yellowgreenblue\"\n            },\n            ramp: {\n                scheme: \"blues\"\n            },\n            diverging: {\n                scheme: \"blueorange\",\n                extent: [\n                    1,\n                    0\n                ]\n            },\n            symbol: [\n                \"circle\",\n                \"square\",\n                \"triangle-up\",\n                \"cross\",\n                \"diamond\",\n                \"triangle-right\",\n                \"triangle-down\",\n                \"triangle-left\"\n            ]\n        }\n    };\n}\nfunction parse(spec, config, options) {\n    if (!(0, _vegaUtil.isObject)(spec)) (0, _vegaUtil.error)(\"Input Vega specification must be an object.\");\n    config = (0, _vegaUtil.mergeConfig)(defaults(), config, spec.config);\n    return parseView(spec, new Scope(config, options)).toRuntime();\n}\n\n},{\"vega-util\":\"bApja\",\"vega-functions\":\"iuqsd\",\"vega-event-selector\":\"fFzhr\",\"vega-scale\":\"bEydG\",\"vega-dataflow\":\"3NitK\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fFzhr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"parseSelector\", ()=>eventSelector);\nconst VIEW = \"view\", LBRACK = \"[\", RBRACK = \"]\", LBRACE = \"{\", RBRACE = \"}\", COLON = \":\", COMMA = \",\", NAME = \"@\", GT = \">\", ILLEGAL = /[[\\]{}]/, DEFAULT_MARKS = {\n    \"*\": 1,\n    arc: 1,\n    area: 1,\n    group: 1,\n    image: 1,\n    line: 1,\n    path: 1,\n    rect: 1,\n    rule: 1,\n    shape: 1,\n    symbol: 1,\n    text: 1,\n    trail: 1\n};\nlet DEFAULT_SOURCE, MARKS;\n/**\n * Parse an event selector string.\n * Returns an array of event stream definitions.\n */ function eventSelector(selector, source, marks) {\n    DEFAULT_SOURCE = source || VIEW;\n    MARKS = marks || DEFAULT_MARKS;\n    return parseMerge(selector.trim()).map(parseSelector);\n}\nfunction isMarkType(type) {\n    return MARKS[type];\n}\nfunction find(s, i, endChar, pushChar, popChar) {\n    const n = s.length;\n    let count = 0, c;\n    for(; i < n; ++i){\n        c = s[i];\n        if (!count && c === endChar) return i;\n        else if (popChar && popChar.indexOf(c) >= 0) --count;\n        else if (pushChar && pushChar.indexOf(c) >= 0) ++count;\n    }\n    return i;\n}\nfunction parseMerge(s) {\n    const output = [], n = s.length;\n    let start = 0, i = 0;\n    while(i < n){\n        i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n        output.push(s.substring(start, i).trim());\n        start = ++i;\n    }\n    if (output.length === 0) throw \"Empty event selector: \" + s;\n    return output;\n}\nfunction parseSelector(s) {\n    return s[0] === \"[\" ? parseBetween(s) : parseStream(s);\n}\nfunction parseBetween(s) {\n    const n = s.length;\n    let i = 1, b;\n    i = find(s, i, RBRACK, LBRACK, RBRACK);\n    if (i === n) throw \"Empty between selector: \" + s;\n    b = parseMerge(s.substring(1, i));\n    if (b.length !== 2) throw \"Between selector must have two elements: \" + s;\n    s = s.slice(i + 1).trim();\n    if (s[0] !== GT) throw \"Expected '>' after between selector: \" + s;\n    b = b.map(parseSelector);\n    const stream = parseSelector(s.slice(1).trim());\n    if (stream.between) return {\n        between: b,\n        stream: stream\n    };\n    else stream.between = b;\n    return stream;\n}\nfunction parseStream(s) {\n    const stream = {\n        source: DEFAULT_SOURCE\n    }, source = [];\n    let throttle = [\n        0,\n        0\n    ], markname = 0, start = 0, n = s.length, i = 0, j, filter; // extract throttle from end\n    if (s[n - 1] === RBRACE) {\n        i = s.lastIndexOf(LBRACE);\n        if (i >= 0) {\n            try {\n                throttle = parseThrottle(s.substring(i + 1, n - 1));\n            } catch (e) {\n                throw \"Invalid throttle specification: \" + s;\n            }\n            s = s.slice(0, i).trim();\n            n = s.length;\n        } else throw \"Unmatched right brace: \" + s;\n        i = 0;\n    }\n    if (!n) throw s; // set name flag based on first char\n    if (s[0] === NAME) markname = ++i; // extract first part of multi-part stream selector\n    j = find(s, i, COLON);\n    if (j < n) {\n        source.push(s.substring(start, j).trim());\n        start = i = ++j;\n    } // extract remaining part of stream selector\n    i = find(s, i, LBRACK);\n    if (i === n) source.push(s.substring(start, n).trim());\n    else {\n        source.push(s.substring(start, i).trim());\n        filter = [];\n        start = ++i;\n        if (start === n) throw \"Unmatched left bracket: \" + s;\n    } // extract filters\n    while(i < n){\n        i = find(s, i, RBRACK);\n        if (i === n) throw \"Unmatched left bracket: \" + s;\n        filter.push(s.substring(start, i).trim());\n        if (i < n - 1 && s[++i] !== LBRACK) throw \"Expected left bracket: \" + s;\n        start = ++i;\n    } // marshall event stream specification\n    if (!(n = source.length) || ILLEGAL.test(source[n - 1])) throw \"Invalid event selector: \" + s;\n    if (n > 1) {\n        stream.type = source[1];\n        if (markname) stream.markname = source[0].slice(1);\n        else if (isMarkType(source[0])) stream.marktype = source[0];\n        else stream.source = source[0];\n    } else stream.type = source[0];\n    if (stream.type.slice(-1) === \"!\") {\n        stream.consume = true;\n        stream.type = stream.type.slice(0, -1);\n    }\n    if (filter != null) stream.filter = filter;\n    if (throttle[0]) stream.throttle = throttle[0];\n    if (throttle[1]) stream.debounce = throttle[1];\n    return stream;\n}\nfunction parseThrottle(s) {\n    const a = s.split(COMMA);\n    if (!s.length || a.length > 2) throw s;\n    return a.map((_)=>{\n        const x = +_;\n        if (x !== x) throw s;\n        return x;\n    });\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2l1no\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ASTNode\", ()=>ASTNode);\nparcelHelpers.export(exports, \"ArrayExpression\", ()=>ArrayExpression);\nparcelHelpers.export(exports, \"BinaryExpression\", ()=>BinaryExpression);\nparcelHelpers.export(exports, \"CallExpression\", ()=>CallExpression);\nparcelHelpers.export(exports, \"ConditionalExpression\", ()=>ConditionalExpression);\nparcelHelpers.export(exports, \"Identifier\", ()=>Identifier);\nparcelHelpers.export(exports, \"Literal\", ()=>Literal);\nparcelHelpers.export(exports, \"LogicalExpression\", ()=>LogicalExpression);\nparcelHelpers.export(exports, \"MemberExpression\", ()=>MemberExpression);\nparcelHelpers.export(exports, \"ObjectExpression\", ()=>ObjectExpression);\nparcelHelpers.export(exports, \"Property\", ()=>Property);\nparcelHelpers.export(exports, \"RawCode\", ()=>RawCode);\nparcelHelpers.export(exports, \"UnaryExpression\", ()=>UnaryExpression);\nparcelHelpers.export(exports, \"codegen\", ()=>codegen);\nparcelHelpers.export(exports, \"constants\", ()=>Constants);\nparcelHelpers.export(exports, \"functions\", ()=>Functions);\nparcelHelpers.export(exports, \"parse\", ()=>parser);\nvar _vegaUtil = require(\"vega-util\");\nconst RawCode = \"RawCode\";\nconst Literal = \"Literal\";\nconst Property = \"Property\";\nconst Identifier = \"Identifier\";\nconst ArrayExpression = \"ArrayExpression\";\nconst BinaryExpression = \"BinaryExpression\";\nconst CallExpression = \"CallExpression\";\nconst ConditionalExpression = \"ConditionalExpression\";\nconst LogicalExpression = \"LogicalExpression\";\nconst MemberExpression = \"MemberExpression\";\nconst ObjectExpression = \"ObjectExpression\";\nconst UnaryExpression = \"UnaryExpression\";\nfunction ASTNode(type) {\n    this.type = type;\n}\nASTNode.prototype.visit = function(visitor) {\n    let c, i, n;\n    if (visitor(this)) return 1;\n    for(c = children(this), i = 0, n = c.length; i < n; ++i){\n        if (c[i].visit(visitor)) return 1;\n    }\n};\nfunction children(node) {\n    switch(node.type){\n        case ArrayExpression:\n            return node.elements;\n        case BinaryExpression:\n        case LogicalExpression:\n            return [\n                node.left,\n                node.right\n            ];\n        case CallExpression:\n            return [\n                node.callee\n            ].concat(node.arguments);\n        case ConditionalExpression:\n            return [\n                node.test,\n                node.consequent,\n                node.alternate\n            ];\n        case MemberExpression:\n            return [\n                node.object,\n                node.property\n            ];\n        case ObjectExpression:\n            return node.properties;\n        case Property:\n            return [\n                node.key,\n                node.value\n            ];\n        case UnaryExpression:\n            return [\n                node.argument\n            ];\n        case Identifier:\n        case Literal:\n        case RawCode:\n        default:\n            return [];\n    }\n}\n/*\n  The following expression parser is based on Esprima (http://esprima.org/).\n  Original header comment and license for Esprima is included here:\n\n  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>\n  Copyright (C) 2013 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>\n  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>\n  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>\n  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>\n  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/ var TokenName, source, index, length, lookahead;\nvar TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\nTokenName = {};\nTokenName[TokenBooleanLiteral] = \"Boolean\";\nTokenName[TokenEOF] = \"<end>\";\nTokenName[TokenIdentifier] = \"Identifier\";\nTokenName[TokenKeyword] = \"Keyword\";\nTokenName[TokenNullLiteral] = \"Null\";\nTokenName[TokenNumericLiteral] = \"Numeric\";\nTokenName[TokenPunctuator] = \"Punctuator\";\nTokenName[TokenStringLiteral] = \"String\";\nTokenName[TokenRegularExpression] = \"RegularExpression\";\nvar SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\"; // Error messages should be identical to V8.\nvar MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\nvar ILLEGAL = \"ILLEGAL\", DISABLED = \"Disabled.\"; // See also tools/generate-unicode-regex.py.\nvar RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), // eslint-disable-next-line no-misleading-character-class\nRegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"); // Ensure the condition is true, otherwise throw an error.\n// This is only to have a better contract semantic, i.e. another safety net\n// to catch a logic error. The condition shall be fulfilled in normal case.\n// Do NOT use this to enforce a certain condition on any user input.\nfunction assert(condition, message) {\n    /* istanbul ignore next */ if (!condition) throw new Error(\"ASSERT: \" + message);\n}\nfunction isDecimalDigit(ch) {\n    return ch >= 0x30 && ch <= 0x39; // 0..9\n}\nfunction isHexDigit(ch) {\n    return \"0123456789abcdefABCDEF\".indexOf(ch) >= 0;\n}\nfunction isOctalDigit(ch) {\n    return \"01234567\".indexOf(ch) >= 0;\n} // 7.2 White Space\nfunction isWhiteSpace(ch) {\n    return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && [\n        0x1680,\n        0x180E,\n        0x2000,\n        0x2001,\n        0x2002,\n        0x2003,\n        0x2004,\n        0x2005,\n        0x2006,\n        0x2007,\n        0x2008,\n        0x2009,\n        0x200A,\n        0x202F,\n        0x205F,\n        0x3000,\n        0xFEFF\n    ].indexOf(ch) >= 0;\n} // 7.3 Line Terminators\nfunction isLineTerminator(ch) {\n    return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029;\n} // 7.6 Identifier Names and Identifiers\nfunction isIdentifierStart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch));\n}\nfunction isIdentifierPart(ch) {\n    return ch === 0x24 || ch === 0x5F || ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A || ch >= 0x30 && ch <= 0x39 || ch === 0x5C || ch >= 0x80 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch));\n} // 7.6.1.1 Keywords\nconst keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n};\nfunction skipComment() {\n    while(index < length){\n        const ch = source.charCodeAt(index);\n        if (isWhiteSpace(ch) || isLineTerminator(ch)) ++index;\n        else break;\n    }\n}\nfunction scanHexEscape(prefix) {\n    var i, len, ch, code = 0;\n    len = prefix === \"u\" ? 4 : 2;\n    for(i = 0; i < len; ++i)if (index < length && isHexDigit(source[index])) {\n        ch = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    } else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return String.fromCharCode(code);\n}\nfunction scanUnicodeCodePointEscape() {\n    var ch, code, cu1, cu2;\n    ch = source[index];\n    code = 0; // At least, one hex digit is required.\n    if (ch === \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    while(index < length){\n        ch = source[index++];\n        if (!isHexDigit(ch)) break;\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch.toLowerCase());\n    }\n    if (code > 0x10FFFF || ch !== \"}\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // UTF-16 Encoding\n    if (code <= 0xFFFF) return String.fromCharCode(code);\n    cu1 = (code - 0x10000 >> 10) + 0xD800;\n    cu2 = (code - 0x10000 & 1023) + 0xDC00;\n    return String.fromCharCode(cu1, cu2);\n}\nfunction getEscapedIdentifier() {\n    var ch, id;\n    ch = source.charCodeAt(index++);\n    id = String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n    if (ch === 0x5C) {\n        if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        ++index;\n        ch = scanHexEscape(\"u\");\n        if (!ch || ch === \"\\\\\" || !isIdentifierStart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        id = ch;\n    }\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (!isIdentifierPart(ch)) break;\n        ++index;\n        id += String.fromCharCode(ch); // '\\u' (U+005C, U+0075) denotes an escaped character.\n        if (ch === 0x5C) {\n            id = id.substr(0, id.length - 1);\n            if (source.charCodeAt(index) !== 0x75) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            ++index;\n            ch = scanHexEscape(\"u\");\n            if (!ch || ch === \"\\\\\" || !isIdentifierPart(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n            id += ch;\n        }\n    }\n    return id;\n}\nfunction getIdentifier() {\n    var start, ch;\n    start = index++;\n    while(index < length){\n        ch = source.charCodeAt(index);\n        if (ch === 0x5C) {\n            // Blackslash (U+005C) marks Unicode escape sequence.\n            index = start;\n            return getEscapedIdentifier();\n        }\n        if (isIdentifierPart(ch)) ++index;\n        else break;\n    }\n    return source.slice(start, index);\n}\nfunction scanIdentifier() {\n    var start, id, type;\n    start = index; // Backslash (U+005C) starts an escaped character.\n    id = source.charCodeAt(index) === 0x5C ? getEscapedIdentifier() : getIdentifier(); // There is no keyword or literal with only one character.\n    // Thus, it must be an identifier.\n    if (id.length === 1) type = TokenIdentifier;\n    else if (keywords.hasOwnProperty(id)) // eslint-disable-line no-prototype-builtins\n    type = TokenKeyword;\n    else if (id === \"null\") type = TokenNullLiteral;\n    else if (id === \"true\" || id === \"false\") type = TokenBooleanLiteral;\n    else type = TokenIdentifier;\n    return {\n        type: type,\n        value: id,\n        start: start,\n        end: index\n    };\n} // 7.7 Punctuators\nfunction scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch(code){\n        // Check for most common single-character punctuators.\n        case 0x2E:\n        case 0x28:\n        case 0x29:\n        case 0x3B:\n        case 0x2C:\n        case 0x7B:\n        case 0x7D:\n        case 0x5B:\n        case 0x5D:\n        case 0x3A:\n        case 0x3F:\n        case 0x7E:\n            // ~\n            ++index;\n            return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code),\n                start: start,\n                end: index\n            };\n        default:\n            code2 = source.charCodeAt(index + 1); // '=' (U+003D) marks an assignment or comparison operator.\n            if (code2 === 0x3D) switch(code){\n                case 0x2B:\n                case 0x2D:\n                case 0x2F:\n                case 0x3C:\n                case 0x3E:\n                case 0x5E:\n                case 0x7C:\n                case 0x25:\n                case 0x26:\n                case 0x2A:\n                    // *\n                    index += 2;\n                    return {\n                        type: TokenPunctuator,\n                        value: String.fromCharCode(code) + String.fromCharCode(code2),\n                        start: start,\n                        end: index\n                    };\n                case 0x21:\n                case 0x3D:\n                    // =\n                    index += 2; // !== and ===\n                    if (source.charCodeAt(index) === 0x3D) ++index;\n                    return {\n                        type: TokenPunctuator,\n                        value: source.slice(start, index),\n                        start: start,\n                        end: index\n                    };\n            }\n    } // 4-character punctuator: >>>=\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n        index += 4;\n        return {\n            type: TokenPunctuator,\n            value: ch4,\n            start: start,\n            end: index\n        };\n    } // 3-character punctuators: === !== >>> <<= >>=\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n        index += 3;\n        return {\n            type: TokenPunctuator,\n            value: ch3,\n            start: start,\n            end: index\n        };\n    } // Other 2-character punctuators: ++ -- << >> && ||\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".indexOf(ch1) >= 0 || ch2 === \"=>\") {\n        index += 2;\n        return {\n            type: TokenPunctuator,\n            value: ch2,\n            start: start,\n            end: index\n        };\n    }\n    if (ch2 === \"//\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n     // 1-character punctuators: < > = ! + - * % & | ^ /\n    if (\"<>=!+-*%&|^/\".indexOf(ch1) >= 0) {\n        ++index;\n        return {\n            type: TokenPunctuator,\n            value: ch1,\n            start: start,\n            end: index\n        };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL);\n} // 7.8.3 Numeric Literals\nfunction scanHexLiteral(start) {\n    let number = \"\";\n    while(index < length){\n        if (!isHexDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (number.length === 0) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(\"0x\" + number, 16),\n        start: start,\n        end: index\n    };\n}\nfunction scanOctalLiteral(start) {\n    let number = \"0\" + source[index++];\n    while(index < length){\n        if (!isOctalDigit(source[index])) break;\n        number += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseInt(number, 8),\n        octal: true,\n        start: start,\n        end: index\n    };\n}\nfunction scanNumericLiteral() {\n    var number, start, ch;\n    ch = source[index];\n    assert(isDecimalDigit(ch.charCodeAt(0)) || ch === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number = \"\";\n    if (ch !== \".\") {\n        number = source[index++];\n        ch = source[index]; // Hex number starts with '0x'.\n        // Octal number starts with '0'.\n        if (number === \"0\") {\n            if (ch === \"x\" || ch === \"X\") {\n                ++index;\n                return scanHexLiteral(start);\n            }\n            if (isOctalDigit(ch)) return scanOctalLiteral(start);\n             // decimal number starts with '0' such as '09' is illegal.\n            if (ch && isDecimalDigit(ch.charCodeAt(0))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        }\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \".\") {\n        number += source[index++];\n        while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        ch = source[index];\n    }\n    if (ch === \"e\" || ch === \"E\") {\n        number += source[index++];\n        ch = source[index];\n        if (ch === \"+\" || ch === \"-\") number += source[index++];\n        if (isDecimalDigit(source.charCodeAt(index))) while(isDecimalDigit(source.charCodeAt(index)))number += source[index++];\n        else throwError({}, MessageUnexpectedToken, ILLEGAL);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenNumericLiteral,\n        value: parseFloat(number),\n        start: start,\n        end: index\n    };\n} // 7.8.4 String Literals\nfunction scanStringLiteral() {\n    var str = \"\", quote, start, ch, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while(index < length){\n        ch = source[index++];\n        if (ch === quote) {\n            quote = \"\";\n            break;\n        } else if (ch === \"\\\\\") {\n            ch = source[index++];\n            if (!ch || !isLineTerminator(ch.charCodeAt(0))) switch(ch){\n                case \"u\":\n                case \"x\":\n                    if (source[index] === \"{\") {\n                        ++index;\n                        str += scanUnicodeCodePointEscape();\n                    } else str += scanHexEscape(ch);\n                    break;\n                case \"n\":\n                    str += \"\\n\";\n                    break;\n                case \"r\":\n                    str += \"\\r\";\n                    break;\n                case \"t\":\n                    str += \"\t\";\n                    break;\n                case \"b\":\n                    str += \"\\b\";\n                    break;\n                case \"f\":\n                    str += \"\\f\";\n                    break;\n                case \"v\":\n                    str += \"\\v\";\n                    break;\n                default:\n                    if (isOctalDigit(ch)) {\n                        code = \"01234567\".indexOf(ch); // \\0 is not octal escape sequence\n                        if (code !== 0) octal = true;\n                        if (index < length && isOctalDigit(source[index])) {\n                            octal = true;\n                            code = code * 8 + \"01234567\".indexOf(source[index++]); // 3 digits are only allowed when string starts\n                            // with 0, 1, 2, 3\n                            if (\"0123\".indexOf(ch) >= 0 && index < length && isOctalDigit(source[index])) code = code * 8 + \"01234567\".indexOf(source[index++]);\n                        }\n                        str += String.fromCharCode(code);\n                    } else str += ch;\n                    break;\n            }\n            else if (ch === \"\\r\" && source[index] === \"\\n\") ++index;\n        } else if (isLineTerminator(ch.charCodeAt(0))) break;\n        else str += ch;\n    }\n    if (quote !== \"\") throwError({}, MessageUnexpectedToken, ILLEGAL);\n    return {\n        type: TokenStringLiteral,\n        value: str,\n        octal: octal,\n        start: start,\n        end: index\n    };\n}\nfunction testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.indexOf(\"u\") >= 0) // Replace each astral symbol and every Unicode code point\n    // escape sequence with a single ASCII symbol to avoid throwing on\n    // regular expressions that are only valid in combination with the\n    // `/u` flag.\n    // Note: replacing with the ASCII symbol `x` might cause false\n    // negatives in unlikely scenarios. For example, `[\\u{61}-b]` is a\n    // perfectly valid pattern that is equivalent to `[a-b]`, but it\n    // would be replaced by `[x-b]` which throws an error.\n    tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1)=>{\n        if (parseInt($1, 16) <= 0x10FFFF) return \"x\";\n        throwError({}, MessageInvalidRegExp);\n    }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n     // First, detect invalid regular expressions.\n    try {\n        new RegExp(tmp);\n    } catch (e) {\n        throwError({}, MessageInvalidRegExp);\n    } // Return a regular expression object for this pattern-flag pair, or\n    // `null` in case the current environment doesn't support the flags it\n    // uses.\n    try {\n        return new RegExp(pattern, flags);\n    } catch (exception) {\n        return null;\n    }\n}\nfunction scanRegExpBody() {\n    var ch, str, classMarker, terminated, body;\n    ch = source[index];\n    assert(ch === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while(index < length){\n        ch = source[index++];\n        str += ch;\n        if (ch === \"\\\\\") {\n            ch = source[index++]; // ECMA-262 7.8.5\n            if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n            str += ch;\n        } else if (isLineTerminator(ch.charCodeAt(0))) throwError({}, MessageUnterminatedRegExp);\n        else if (classMarker) {\n            if (ch === \"]\") classMarker = false;\n        } else {\n            if (ch === \"/\") {\n                terminated = true;\n                break;\n            } else if (ch === \"[\") classMarker = true;\n        }\n    }\n    if (!terminated) throwError({}, MessageUnterminatedRegExp);\n     // Exclude leading and trailing slash.\n    body = str.substr(1, str.length - 2);\n    return {\n        value: body,\n        literal: str\n    };\n}\nfunction scanRegExpFlags() {\n    var ch, str, flags;\n    str = \"\";\n    flags = \"\";\n    while(index < length){\n        ch = source[index];\n        if (!isIdentifierPart(ch.charCodeAt(0))) break;\n        ++index;\n        if (ch === \"\\\\\" && index < length) throwError({}, MessageUnexpectedToken, ILLEGAL);\n        else {\n            flags += ch;\n            str += ch;\n        }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) throwError({}, MessageInvalidRegExp, flags);\n    return {\n        value: flags,\n        literal: str\n    };\n}\nfunction scanRegExp() {\n    var start, body, flags, value;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value = testRegExp(body.value, flags.value);\n    return {\n        literal: body.literal + flags.literal,\n        value: value,\n        regex: {\n            pattern: body.value,\n            flags: flags.value\n        },\n        start: start,\n        end: index\n    };\n}\nfunction isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n}\nfunction advance() {\n    skipComment();\n    if (index >= length) return {\n        type: TokenEOF,\n        start: index,\n        end: index\n    };\n    const ch = source.charCodeAt(index);\n    if (isIdentifierStart(ch)) return scanIdentifier();\n     // Very common: ( and ) and ;\n    if (ch === 0x28 || ch === 0x29 || ch === 0x3B) return scanPunctuator();\n     // String literal starts with single quote (U+0027) or double quote (U+0022).\n    if (ch === 0x27 || ch === 0x22) return scanStringLiteral();\n     // Dot (.) U+002E can also start a floating-point number, hence the need\n    // to check the next character.\n    if (ch === 0x2E) {\n        if (isDecimalDigit(source.charCodeAt(index + 1))) return scanNumericLiteral();\n        return scanPunctuator();\n    }\n    if (isDecimalDigit(ch)) return scanNumericLiteral();\n    return scanPunctuator();\n}\nfunction lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n}\nfunction peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n}\nfunction finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n}\nfunction finishBinaryExpression(operator, left, right) {\n    const node = new ASTNode(operator === \"||\" || operator === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator;\n    node.left = left;\n    node.right = right;\n    return node;\n}\nfunction finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n}\nfunction finishConditionalExpression(test, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n}\nfunction finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n}\nfunction finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n        if (node.raw === \"//\") node.raw = \"/(?:)/\";\n        node.regex = token.regex;\n    }\n    return node;\n}\nfunction finishMemberExpression(accessor, object, property) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor === \"[\";\n    node.object = object;\n    node.property = property;\n    if (!node.computed) property.member = true;\n    return node;\n}\nfunction finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n}\nfunction finishProperty(kind, key, value) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key;\n    node.value = value;\n    node.kind = kind;\n    return node;\n}\nfunction finishUnaryExpression(operator, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n} // Throw an exception\nfunction throwError(token, messageFormat) {\n    var error, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index1)=>{\n        assert(index1 < args.length, \"Message reference must be in range\");\n        return args[index1];\n    });\n    error = new Error(msg);\n    error.index = index;\n    error.description = msg;\n    throw error;\n} // Throw an exception because of the token.\nfunction throwUnexpected(token) {\n    if (token.type === TokenEOF) throwError(token, MessageUnexpectedEOS);\n    if (token.type === TokenNumericLiteral) throwError(token, MessageUnexpectedNumber);\n    if (token.type === TokenStringLiteral) throwError(token, MessageUnexpectedString);\n    if (token.type === TokenIdentifier) throwError(token, MessageUnexpectedIdentifier);\n    if (token.type === TokenKeyword) throwError(token, MessageUnexpectedReserved);\n     // BooleanLiteral, NullLiteral, or Punctuator.\n    throwError(token, MessageUnexpectedToken, token.value);\n} // Expect the next token to match the specified punctuator.\n// If not, an exception will be thrown.\nfunction expect(value) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value) throwUnexpected(token);\n} // Return true if the next token matches the specified punctuator.\nfunction match(value) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value;\n} // Return true if the next token matches the specified keyword\nfunction matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n} // 11.1.4 Array Initialiser\nfunction parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while(!match(\"]\"))if (match(\",\")) {\n        lex();\n        elements.push(null);\n    } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) expect(\",\");\n    }\n    lex();\n    return finishArrayExpression(elements);\n} // 11.1.5 Object Initialiser\nfunction parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex(); // Note: This function is called only from parseObjectProperty(), where\n    // EOF and Punctuator tokens are already filtered out.\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n        if (token.octal) throwError(token, MessageStrictOctalLiteral);\n        return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n}\nfunction parseObjectProperty() {\n    var token, key, id, value;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n        id = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", id, value);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) throwUnexpected(token);\n    else {\n        key = parseObjectPropertyKey();\n        expect(\":\");\n        value = parseConditionalExpression();\n        return finishProperty(\"init\", key, value);\n    }\n}\nfunction parseObjectInitialiser() {\n    var properties = [], property, name, key, map = {}, toString = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while(!match(\"}\")){\n        property = parseObjectProperty();\n        if (property.key.type === SyntaxIdentifier) name = property.key.name;\n        else name = toString(property.key.value);\n        key = \"$\" + name;\n        if (Object.prototype.hasOwnProperty.call(map, key)) throwError({}, MessageStrictDuplicateProperty);\n        else map[key] = true;\n        properties.push(property);\n        if (!match(\"}\")) expect(\",\");\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n} // 11.1.6 The Grouping Operator\nfunction parseGroupExpression() {\n    expect(\"(\");\n    const expr = parseExpression();\n    expect(\")\");\n    return expr;\n} // 11.1 Primary Expressions\nconst legalKeywords = {\n    \"if\": 1\n};\nfunction parsePrimaryExpression() {\n    var type, token, expr;\n    if (match(\"(\")) return parseGroupExpression();\n    if (match(\"[\")) return parseArrayInitialiser();\n    if (match(\"{\")) return parseObjectInitialiser();\n    type = lookahead.type;\n    index = lookahead.start;\n    if (type === TokenIdentifier || legalKeywords[lookahead.value]) expr = finishIdentifier(lex().value);\n    else if (type === TokenStringLiteral || type === TokenNumericLiteral) {\n        if (lookahead.octal) throwError(lookahead, MessageStrictOctalLiteral);\n        expr = finishLiteral(lex());\n    } else if (type === TokenKeyword) throw new Error(DISABLED);\n    else if (type === TokenBooleanLiteral) {\n        token = lex();\n        token.value = token.value === \"true\";\n        expr = finishLiteral(token);\n    } else if (type === TokenNullLiteral) {\n        token = lex();\n        token.value = null;\n        expr = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n        expr = finishLiteral(scanRegExp());\n        peek();\n    } else throwUnexpected(lex());\n    return expr;\n} // 11.2 Left-Hand-Side Expressions\nfunction parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) while(index < length){\n        args.push(parseConditionalExpression());\n        if (match(\")\")) break;\n        expect(\",\");\n    }\n    expect(\")\");\n    return args;\n}\nfunction parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) throwUnexpected(token);\n    return finishIdentifier(token.value);\n}\nfunction parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n}\nfunction parseComputedMember() {\n    expect(\"[\");\n    const expr = parseExpression();\n    expect(\"]\");\n    return expr;\n}\nfunction parseLeftHandSideExpressionAllowCall() {\n    var expr, args, property;\n    expr = parsePrimaryExpression();\n    for(;;){\n        if (match(\".\")) {\n            property = parseNonComputedMember();\n            expr = finishMemberExpression(\".\", expr, property);\n        } else if (match(\"(\")) {\n            args = parseArguments();\n            expr = finishCallExpression(expr, args);\n        } else if (match(\"[\")) {\n            property = parseComputedMember();\n            expr = finishMemberExpression(\"[\", expr, property);\n        } else break;\n    }\n    return expr;\n} // 11.3 Postfix Expressions\nfunction parsePostfixExpression() {\n    const expr = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n        if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    }\n    return expr;\n} // 11.4 Unary Operators\nfunction parseUnaryExpression() {\n    var token, expr;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) expr = parsePostfixExpression();\n    else if (match(\"++\") || match(\"--\")) throw new Error(DISABLED);\n    else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n        token = lex();\n        expr = parseUnaryExpression();\n        expr = finishUnaryExpression(token.value, expr);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) throw new Error(DISABLED);\n    else expr = parsePostfixExpression();\n    return expr;\n}\nfunction binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) return 0;\n    switch(token.value){\n        case \"||\":\n            prec = 1;\n            break;\n        case \"&&\":\n            prec = 2;\n            break;\n        case \"|\":\n            prec = 3;\n            break;\n        case \"^\":\n            prec = 4;\n            break;\n        case \"&\":\n            prec = 5;\n            break;\n        case \"==\":\n        case \"!=\":\n        case \"===\":\n        case \"!==\":\n            prec = 6;\n            break;\n        case \"<\":\n        case \">\":\n        case \"<=\":\n        case \">=\":\n        case \"instanceof\":\n        case \"in\":\n            prec = 7;\n            break;\n        case \"<<\":\n        case \">>\":\n        case \">>>\":\n            prec = 8;\n            break;\n        case \"+\":\n        case \"-\":\n            prec = 9;\n            break;\n        case \"*\":\n        case \"/\":\n        case \"%\":\n            prec = 11;\n            break;\n    }\n    return prec;\n} // 11.5 Multiplicative Operators\n// 11.6 Additive Operators\n// 11.7 Bitwise Shift Operators\n// 11.8 Relational Operators\n// 11.9 Equality Operators\n// 11.10 Binary Bitwise Operators\n// 11.11 Binary Logical Operators\nfunction parseBinaryExpression() {\n    var marker, markers, expr, token, prec, stack, right, operator, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) return left;\n    token.prec = prec;\n    lex();\n    markers = [\n        marker,\n        lookahead\n    ];\n    right = parseUnaryExpression();\n    stack = [\n        left,\n        token,\n        right\n    ];\n    while((prec = binaryPrecedence(lookahead)) > 0){\n        // Reduce: make a binary expression from the three topmost entries.\n        while(stack.length > 2 && prec <= stack[stack.length - 2].prec){\n            right = stack.pop();\n            operator = stack.pop().value;\n            left = stack.pop();\n            markers.pop();\n            expr = finishBinaryExpression(operator, left, right);\n            stack.push(expr);\n        } // Shift.\n        token = lex();\n        token.prec = prec;\n        stack.push(token);\n        markers.push(lookahead);\n        expr = parseUnaryExpression();\n        stack.push(expr);\n    } // Final reduce to clean-up the stack.\n    i = stack.length - 1;\n    expr = stack[i];\n    markers.pop();\n    while(i > 1){\n        markers.pop();\n        expr = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr);\n        i -= 2;\n    }\n    return expr;\n} // 11.12 Conditional Operator\nfunction parseConditionalExpression() {\n    var expr, consequent, alternate;\n    expr = parseBinaryExpression();\n    if (match(\"?\")) {\n        lex();\n        consequent = parseConditionalExpression();\n        expect(\":\");\n        alternate = parseConditionalExpression();\n        expr = finishConditionalExpression(expr, consequent, alternate);\n    }\n    return expr;\n} // 11.14 Comma Operator\nfunction parseExpression() {\n    const expr = parseConditionalExpression();\n    if (match(\",\")) throw new Error(DISABLED); // no sequence expressions\n    return expr;\n}\nfunction parser(code) {\n    source = code;\n    index = 0;\n    length = source.length;\n    lookahead = null;\n    peek();\n    const expr = parseExpression();\n    if (lookahead.type !== TokenEOF) throw new Error(\"Unexpect token after expression.\");\n    return expr;\n}\nvar Constants = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n};\nfunction Functions(codegen1) {\n    function fncall(name, args, cast, type) {\n        let obj = codegen1(args[0]);\n        if (cast) {\n            obj = cast + \"(\" + obj + \")\";\n            if (cast.lastIndexOf(\"new \", 0) === 0) obj = \"(\" + obj + \")\";\n        }\n        return obj + \".\" + name + (type < 0 ? \"\" : type === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen1).join(\",\") + \")\");\n    }\n    function fn(name, cast, type) {\n        return (args)=>fncall(name, args, cast, type);\n    }\n    const DATE = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n        // MATH functions\n        isNaN: \"Number.isNaN\",\n        isFinite: \"Number.isFinite\",\n        abs: \"Math.abs\",\n        acos: \"Math.acos\",\n        asin: \"Math.asin\",\n        atan: \"Math.atan\",\n        atan2: \"Math.atan2\",\n        ceil: \"Math.ceil\",\n        cos: \"Math.cos\",\n        exp: \"Math.exp\",\n        floor: \"Math.floor\",\n        log: \"Math.log\",\n        max: \"Math.max\",\n        min: \"Math.min\",\n        pow: \"Math.pow\",\n        random: \"Math.random\",\n        round: \"Math.round\",\n        sin: \"Math.sin\",\n        sqrt: \"Math.sqrt\",\n        tan: \"Math.tan\",\n        clamp: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to clamp function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to clamp function.\");\n            const a = args.map(codegen1);\n            return \"Math.max(\" + a[1] + \", Math.min(\" + a[2] + \",\" + a[0] + \"))\";\n        },\n        // DATE functions\n        now: \"Date.now\",\n        utc: \"Date.UTC\",\n        datetime: DATE,\n        date: fn(\"getDate\", DATE, 0),\n        day: fn(\"getDay\", DATE, 0),\n        year: fn(\"getFullYear\", DATE, 0),\n        month: fn(\"getMonth\", DATE, 0),\n        hours: fn(\"getHours\", DATE, 0),\n        minutes: fn(\"getMinutes\", DATE, 0),\n        seconds: fn(\"getSeconds\", DATE, 0),\n        milliseconds: fn(\"getMilliseconds\", DATE, 0),\n        time: fn(\"getTime\", DATE, 0),\n        timezoneoffset: fn(\"getTimezoneOffset\", DATE, 0),\n        utcdate: fn(\"getUTCDate\", DATE, 0),\n        utcday: fn(\"getUTCDay\", DATE, 0),\n        utcyear: fn(\"getUTCFullYear\", DATE, 0),\n        utcmonth: fn(\"getUTCMonth\", DATE, 0),\n        utchours: fn(\"getUTCHours\", DATE, 0),\n        utcminutes: fn(\"getUTCMinutes\", DATE, 0),\n        utcseconds: fn(\"getUTCSeconds\", DATE, 0),\n        utcmilliseconds: fn(\"getUTCMilliseconds\", DATE, 0),\n        // sequence functions\n        length: fn(\"length\", null, -1),\n        // STRING functions\n        parseFloat: \"parseFloat\",\n        parseInt: \"parseInt\",\n        upper: fn(\"toUpperCase\", STRING, 0),\n        lower: fn(\"toLowerCase\", STRING, 0),\n        substring: fn(\"substring\", STRING),\n        split: fn(\"split\", STRING),\n        trim: fn(\"trim\", STRING, 0),\n        // REGEXP functions\n        regexp: REGEXP,\n        test: fn(\"test\", REGEXP),\n        // Control Flow functions\n        if: function(args) {\n            if (args.length < 3) (0, _vegaUtil.error)(\"Missing arguments to if function.\");\n            if (args.length > 3) (0, _vegaUtil.error)(\"Too many arguments to if function.\");\n            const a = args.map(codegen1);\n            return \"(\" + a[0] + \"?\" + a[1] + \":\" + a[2] + \")\";\n        }\n    };\n}\nfunction stripQuotes(s) {\n    const n = s && s.length - 1;\n    return n && (s[0] === '\"' && s[n] === '\"' || s[0] === \"'\" && s[n] === \"'\") ? s.slice(1, -1) : s;\n}\nfunction codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? (0, _vegaUtil.toSet)(opt.allowed) : {}, forbidden = opt.forbidden ? (0, _vegaUtil.toSet)(opt.forbidden) : {}, constants = opt.constants || Constants, functions = (opt.functions || Functions)(visit), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = (0, _vegaUtil.isFunction)(globalvar) ? globalvar : (id)=>\"\".concat(globalvar, '[\"').concat(id, '\"]');\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit(ast) {\n        if ((0, _vegaUtil.isString)(ast)) return ast;\n        const generator = Generators[ast.type];\n        if (generator == null) (0, _vegaUtil.error)(\"Unsupported type: \" + ast.type);\n        return generator(ast);\n    }\n    const Generators = {\n        Literal: (n)=>n.raw,\n        Identifier: (n)=>{\n            const id = n.name;\n            if (memberDepth > 0) return id;\n            else if ((0, _vegaUtil.hasOwnProperty)(forbidden, id)) return (0, _vegaUtil.error)(\"Illegal identifier: \" + id);\n            else if ((0, _vegaUtil.hasOwnProperty)(constants, id)) return constants[id];\n            else if ((0, _vegaUtil.hasOwnProperty)(allowed, id)) return id;\n            else {\n                globals[id] = 1;\n                return outputGlobal(id);\n            }\n        },\n        MemberExpression: (n)=>{\n            const d = !n.computed, o = visit(n.object);\n            if (d) memberDepth += 1;\n            const p = visit(n.property);\n            if (o === fieldvar) // strip quotes to sanitize field name (#1653)\n            fields[stripQuotes(p)] = 1;\n            if (d) memberDepth -= 1;\n            return o + (d ? \".\" + p : \"[\" + p + \"]\");\n        },\n        CallExpression: (n)=>{\n            if (n.callee.type !== \"Identifier\") (0, _vegaUtil.error)(\"Illegal callee type: \" + n.callee.type);\n            const callee = n.callee.name, args = n.arguments, fn = (0, _vegaUtil.hasOwnProperty)(functions, callee) && functions[callee];\n            if (!fn) (0, _vegaUtil.error)(\"Unrecognized function: \" + callee);\n            return (0, _vegaUtil.isFunction)(fn) ? fn(args) : fn + \"(\" + args.map(visit).join(\",\") + \")\";\n        },\n        ArrayExpression: (n)=>\"[\" + n.elements.map(visit).join(\",\") + \"]\",\n        BinaryExpression: (n)=>\"(\" + visit(n.left) + \" \" + n.operator + \" \" + visit(n.right) + \")\",\n        UnaryExpression: (n)=>\"(\" + n.operator + visit(n.argument) + \")\",\n        ConditionalExpression: (n)=>\"(\" + visit(n.test) + \"?\" + visit(n.consequent) + \":\" + visit(n.alternate) + \")\",\n        LogicalExpression: (n)=>\"(\" + visit(n.left) + n.operator + visit(n.right) + \")\",\n        ObjectExpression: (n)=>\"{\" + n.properties.map(visit).join(\",\") + \"}\",\n        Property: (n)=>{\n            memberDepth += 1;\n            const k = visit(n.key);\n            memberDepth -= 1;\n            return k + \":\" + visit(n.value);\n        }\n    };\n    function codegen2(ast) {\n        const result = {\n            code: visit(ast),\n            globals: Object.keys(globals),\n            fields: Object.keys(fields)\n        };\n        globals = {};\n        fields = {};\n        return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants;\n    return codegen2;\n}\n\n},{\"vega-util\":\"bApja\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gXMNx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"selector\", ()=>eventSelector);\nconst VIEW = \"view\", LBRACK = \"[\", RBRACK = \"]\", LBRACE = \"{\", RBRACE = \"}\", COLON = \":\", COMMA = \",\", NAME = \"@\", GT = \">\", ILLEGAL = /[[\\]{}]/, DEFAULT_MARKS = {\n    \"*\": 1,\n    arc: 1,\n    area: 1,\n    group: 1,\n    image: 1,\n    line: 1,\n    path: 1,\n    rect: 1,\n    rule: 1,\n    shape: 1,\n    symbol: 1,\n    text: 1,\n    trail: 1\n};\nlet DEFAULT_SOURCE, MARKS;\n/**\n * Parse an event selector string.\n * Returns an array of event stream definitions.\n */ function eventSelector(selector, source, marks) {\n    DEFAULT_SOURCE = source || VIEW;\n    MARKS = marks || DEFAULT_MARKS;\n    return parseMerge(selector.trim()).map(parseSelector);\n}\nfunction isMarkType(type) {\n    return MARKS[type];\n}\nfunction find(s, i, endChar, pushChar, popChar) {\n    const n = s.length;\n    let count = 0, c;\n    for(; i < n; ++i){\n        c = s[i];\n        if (!count && c === endChar) return i;\n        else if (popChar && popChar.indexOf(c) >= 0) --count;\n        else if (pushChar && pushChar.indexOf(c) >= 0) ++count;\n    }\n    return i;\n}\nfunction parseMerge(s) {\n    const output = [], n = s.length;\n    let start = 0, i = 0;\n    while(i < n){\n        i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n        output.push(s.substring(start, i).trim());\n        start = ++i;\n    }\n    if (output.length === 0) throw \"Empty event selector: \" + s;\n    return output;\n}\nfunction parseSelector(s) {\n    return s[0] === \"[\" ? parseBetween(s) : parseStream(s);\n}\nfunction parseBetween(s) {\n    const n = s.length;\n    let i = 1, b;\n    i = find(s, i, RBRACK, LBRACK, RBRACK);\n    if (i === n) throw \"Empty between selector: \" + s;\n    b = parseMerge(s.substring(1, i));\n    if (b.length !== 2) throw \"Between selector must have two elements: \" + s;\n    s = s.slice(i + 1).trim();\n    if (s[0] !== GT) throw \"Expected '>' after between selector: \" + s;\n    b = b.map(parseSelector);\n    const stream = parseSelector(s.slice(1).trim());\n    if (stream.between) return {\n        between: b,\n        stream: stream\n    };\n    else stream.between = b;\n    return stream;\n}\nfunction parseStream(s) {\n    const stream = {\n        source: DEFAULT_SOURCE\n    }, source = [];\n    let throttle = [\n        0,\n        0\n    ], markname = 0, start = 0, n = s.length, i = 0, j, filter; // extract throttle from end\n    if (s[n - 1] === RBRACE) {\n        i = s.lastIndexOf(LBRACE);\n        if (i >= 0) {\n            try {\n                throttle = parseThrottle(s.substring(i + 1, n - 1));\n            } catch (e) {\n                throw \"Invalid throttle specification: \" + s;\n            }\n            s = s.slice(0, i).trim();\n            n = s.length;\n        } else throw \"Unmatched right brace: \" + s;\n        i = 0;\n    }\n    if (!n) throw s; // set name flag based on first char\n    if (s[0] === NAME) markname = ++i; // extract first part of multi-part stream selector\n    j = find(s, i, COLON);\n    if (j < n) {\n        source.push(s.substring(start, j).trim());\n        start = i = ++j;\n    } // extract remaining part of stream selector\n    i = find(s, i, LBRACK);\n    if (i === n) source.push(s.substring(start, n).trim());\n    else {\n        source.push(s.substring(start, i).trim());\n        filter = [];\n        start = ++i;\n        if (start === n) throw \"Unmatched left bracket: \" + s;\n    } // extract filters\n    while(i < n){\n        i = find(s, i, RBRACK);\n        if (i === n) throw \"Unmatched left bracket: \" + s;\n        filter.push(s.substring(start, i).trim());\n        if (i < n - 1 && s[++i] !== LBRACK) throw \"Expected left bracket: \" + s;\n        start = ++i;\n    } // marshall event stream specification\n    if (!(n = source.length) || ILLEGAL.test(source[n - 1])) throw \"Invalid event selector: \" + s;\n    if (n > 1) {\n        stream.type = source[1];\n        if (markname) stream.markname = source[0].slice(1);\n        else if (isMarkType(source[0])) stream.marktype = source[0];\n        else stream.source = source[0];\n    } else stream.type = source[0];\n    if (stream.type.slice(-1) === \"!\") {\n        stream.consume = true;\n        stream.type = stream.type.slice(0, -1);\n    }\n    if (filter != null) stream.filter = filter;\n    if (throttle[0]) stream.throttle = throttle[0];\n    if (throttle[1]) stream.debounce = throttle[1];\n    return stream;\n}\nfunction parseThrottle(s) {\n    const a = s.split(COMMA);\n    if (!s.length || a.length > 2) throw s;\n    return a.map((_)=>{\n        const x = +_;\n        if (x !== x) throw s;\n        return x;\n    });\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4LXyM\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"colorSchemes\", ()=>(0, _colorSchemes.colorSchemes));\nparcelHelpers.export(exports, \"constants\", ()=>_constants);\nparcelHelpers.export(exports, \"searchExpression\", ()=>_searchExpression);\nparcelHelpers.export(exports, \"specs\", ()=>_sanddanceSpecs);\nparcelHelpers.export(exports, \"types\", ()=>_types);\nparcelHelpers.export(exports, \"use\", ()=>use);\nparcelHelpers.export(exports, \"util\", ()=>_util);\nparcelHelpers.export(exports, \"VegaDeckGl\", ()=>_vegaDeckGl);\nparcelHelpers.export(exports, \"Viewer\", ()=>(0, _viewer.Viewer));\nparcelHelpers.export(exports, \"version\", ()=>(0, _version.version));\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _searchExpression = require(\"@msrvida/search-expression\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _types = require(\"./types\");\nvar _util = require(\"./util\");\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _colorSchemes = require(\"./colorSchemes\");\nvar _viewer = require(\"./viewer\");\nvar _version = require(\"./version\");\nconst use = (0, _vegaDeckGl.use);\n\n},{\"./constants\":\"2SlZI\",\"@msrvida/search-expression\":\"3EP3i\",\"@msrvida/sanddance-specs\":\"aBhpQ\",\"./types\":\"4gpr7\",\"./util\":\"eohCL\",\"@msrvida/vega-deck.gl\":\"6fUZE\",\"./colorSchemes\":\"bPdl3\",\"./viewer\":\"a6Rh9\",\"./version\":\"cwHcu\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2SlZI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"ColorScaleNone\", ()=>(0, _sanddanceSpecs.ColorScaleNone));\nparcelHelpers.export(exports, \"FieldNames\", ()=>(0, _sanddanceSpecs.FieldNames));\nparcelHelpers.export(exports, \"ScaleNames\", ()=>(0, _sanddanceSpecs.ScaleNames));\nparcelHelpers.export(exports, \"SignalNames\", ()=>(0, _sanddanceSpecs.SignalNames));\nparcelHelpers.export(exports, \"GL_ORDINAL\", ()=>GL_ORDINAL);\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nconst GL_ORDINAL = \"GL_ORDINAL\";\n\n},{\"@msrvida/sanddance-specs\":\"aBhpQ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aBhpQ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _build = require(\"./build\");\nparcelHelpers.exportAll(_build, exports);\nvar _constants = require(\"./constants\");\nparcelHelpers.exportAll(_constants, exports);\nvar _inference = require(\"./inference\");\nparcelHelpers.exportAll(_inference, exports);\nvar _interfaces = require(\"./interfaces\");\nparcelHelpers.exportAll(_interfaces, exports);\nvar _types = require(\"./types\");\nparcelHelpers.exportAll(_types, exports);\n\n},{\"./build\":\"2pBTq\",\"./constants\":\"3I5IU\",\"./inference\":\"hgLDN\",\"./interfaces\":\"czyLt\",\"./types\":\"0QlBW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2pBTq\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"build\", ()=>build);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _charts = require(\"./charts\");\nvar _inference = require(\"./inference\");\nvar _specBuilder = require(\"./specBuilder\");\nfunction build(specContext, currData) {\n    const { specColumns  } = specContext;\n    const columns = [\n        specColumns.color,\n        specColumns.facet,\n        specColumns.facetV,\n        specColumns.group,\n        specColumns.size,\n        specColumns.sort,\n        specColumns.x,\n        specColumns.y,\n        specColumns.z, \n    ];\n    (0, _inference.inferAll)(columns, currData);\n    const specBuilderProps = (0, _charts.getSpecBuilderPropsForChart)(specContext);\n    const specBuilder = new (0, _specBuilder.SpecBuilder)(specBuilderProps, specContext);\n    let specResult;\n    if (specBuilder) {\n        try {\n            const errors = specBuilder.validate();\n            if (errors.length) specResult = {\n                errors,\n                specCapabilities: specBuilderProps.specCapabilities,\n                vegaSpec: null\n            };\n            else specResult = specBuilder.build();\n        } catch (e) {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [\n                    e.stack\n                ]\n            };\n        }\n        if (!specResult.errors) {\n            const data0 = specResult.vegaSpec.data[0];\n            data0.values = currData;\n        }\n    } else specResult = {\n        specCapabilities: null,\n        vegaSpec: null,\n        errors: [\n            `could not build spec for ${specContext.insight.chart}`\n        ]\n    };\n    return specResult;\n}\n\n},{\"./charts\":\"euC7e\",\"./inference\":\"hgLDN\",\"./specBuilder\":\"bLsvI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"euC7e\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSpecBuilderPropsForChart\", ()=>getSpecBuilderPropsForChart);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _barchartH = require(\"./barchartH\");\nvar _barchartHDefault = parcelHelpers.interopDefault(_barchartH);\nvar _barchartV = require(\"./barchartV\");\nvar _barchartVDefault = parcelHelpers.interopDefault(_barchartV);\nvar _density = require(\"./density\");\nvar _densityDefault = parcelHelpers.interopDefault(_density);\nvar _grid = require(\"./grid\");\nvar _gridDefault = parcelHelpers.interopDefault(_grid);\nvar _scatterplot = require(\"./scatterplot\");\nvar _scatterplotDefault = parcelHelpers.interopDefault(_scatterplot);\nvar _stacks = require(\"./stacks\");\nvar _stacksDefault = parcelHelpers.interopDefault(_stacks);\nvar _strips = require(\"./strips\");\nvar _stripsDefault = parcelHelpers.interopDefault(_strips);\nvar _treemap = require(\"./treemap\");\nvar _treemapDefault = parcelHelpers.interopDefault(_treemap);\nvar _facetLayout = require(\"../facetLayout\");\nvar _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nconst map = {\n    barchart: (0, _barchartVDefault.default),\n    barchartH: (0, _barchartHDefault.default),\n    barchartV: (0, _barchartVDefault.default),\n    density: (0, _densityDefault.default),\n    grid: (0, _gridDefault.default),\n    scatterplot: (0, _scatterplotDefault.default),\n    stacks: (0, _stacksDefault.default),\n    strips: (0, _stripsDefault.default),\n    treemap: (0, _treemapDefault.default)\n};\nfunction getSpecBuilderPropsForChart(specContext) {\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const fn = map[insight.chart];\n    if (fn) {\n        const props = fn(specContext);\n        if (insight.columns.facet) {\n            const discreteFacetColumn = {\n                column: specColumns.facet,\n                defaultBins: (0, _defaults.defaultBins),\n                maxbins: (0, _defaults.maxbins),\n                maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                maxbinsSignalName: (0, _constants.SignalNames).FacetBins\n            };\n            const discreteFacetVColumn = {\n                column: specColumns.facetV,\n                defaultBins: (0, _defaults.defaultBins),\n                maxbins: (0, _defaults.maxbins),\n                maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                maxbinsSignalName: (0, _constants.SignalNames).FacetVBins\n            };\n            const { facetLayout , layoutPair  } = (0, _facetLayout.getFacetLayout)(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n            props.layouts.unshift(layoutPair);\n            props.facetLayout = facetLayout;\n            props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n        }\n        return props;\n    }\n}\n\n},{\"./barchartH\":\"62o3l\",\"./barchartV\":\"1ulMm\",\"./density\":\"d1hGL\",\"./grid\":\"7qJJk\",\"./scatterplot\":\"bmKhB\",\"./stacks\":\"36aPG\",\"./strips\":\"bdRT1\",\"./treemap\":\"dXgQh\",\"../facetLayout\":\"kRHoI\",\"../constants\":\"3I5IU\",\"../defaults\":\"5kAFI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"62o3l\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nvar _size = require(\"../size\");\nexports.default = function(specContext) {\n    var _a, _b, _c, _d;\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const { language  } = specViewOptions;\n    const showAxes = true;\n    const bandProps = {\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes\n    };\n    const x = {\n        title: null\n    };\n    const axisScales = {\n        x,\n        y: {\n            title: (_a = specColumns.y) === null || _a === void 0 ? void 0 : _a.name\n        },\n        z: {\n            title: (_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.name\n        }\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: bandProps\n        }\n    ];\n    if (insight.totalStyle === \"sum-strip-percent\") {\n        x.aggregate = \"percent\";\n        x.title = language.percent;\n        const stripProps = {\n            addPercentageScale: true,\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes\n        };\n        layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n        });\n    } else {\n        const aggProps = {\n            niceScale: true,\n            dock: \"left\",\n            globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n            globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n            sumBy: specColumns.size,\n            showAxes\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props: aggProps\n        });\n        switch(insight.totalStyle){\n            case \"sum-treemap\":\n                {\n                    x.aggregate = \"sum\";\n                    x.title = language.sum;\n                    const treemapProps = {\n                        corner: \"top-left\",\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes\n                    };\n                    layouts.push({\n                        layoutType: \"Treemap\",\n                        props: treemapProps\n                    });\n                    break;\n                }\n            case \"sum-strip\":\n                {\n                    x.aggregate = \"sum\";\n                    x.title = language.sum;\n                    const stripProps = {\n                        sortOrder: \"ascending\",\n                        orientation: \"horizontal\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            case \"count-strip\":\n                {\n                    x.aggregate = \"count\";\n                    x.title = language.count;\n                    const stripProps = {\n                        sortOrder: \"ascending\",\n                        orientation: \"horizontal\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            default:\n                {\n                    x.aggregate = \"count\";\n                    x.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: \"down-right\",\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes\n                    };\n                    layouts.push({\n                        layoutType: \"Square\",\n                        props: squareProps\n                    });\n                    break;\n                }\n        }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: ((_c = specColumns.y) === null || _c === void 0 ? void 0 : _c.quantitative) ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).YBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: ((_d = specColumns.z) === null || _d === void 0 ? void 0 : _d.quantitative) ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, _size.allowNoneForSize),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, _constants.SignalNames).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }, \n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"3I5IU\",\"../defaults\":\"5kAFI\",\"../size\":\"ev1W0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3I5IU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"FieldNames\", ()=>FieldNames);\nparcelHelpers.export(exports, \"ScaleNames\", ()=>ScaleNames);\nparcelHelpers.export(exports, \"SignalNames\", ()=>SignalNames);\nparcelHelpers.export(exports, \"Other\", ()=>Other);\nparcelHelpers.export(exports, \"ColorScaleNone\", ()=>ColorScaleNone);\nconst FieldNames = {\n    Active: \"__SandDance__Active\",\n    Collapsed: \"__SandDance__Collapsed\",\n    Contains: \"__SandDance__Contains\",\n    Count: \"__SandDance__Count\",\n    Sum: \"__SandDance__Sum\",\n    SumOfCount: \"__SandDance__CountSum\",\n    SumOfSum: \"__SandDance__SumSum\",\n    Selected: \"__SandDance__Selected\",\n    First: \"__SandDance__First\",\n    Last: \"__SandDance__Last\",\n    Top: \"__SandDance__Top\",\n    TopColor: \"__SandDance__TopColor\",\n    TopIndex: \"__SandDance__TopIndex\",\n    PowerBISelectionId: \"__SandDance__PowerBISelectionId\",\n    FacetSearch: \"__SandDance__FacetSearch\",\n    FacetTitle: \"__SandDance__FacetTitle\",\n    Ordinal: \"__SandDance__Ordinal\",\n    WrapCol: \"__SandDance__WrapCol\",\n    WrapRow: \"__SandDance__WrapRow\",\n    Value: \"__SandDance__Value\",\n    OffsetX: \"__SandDance__X\",\n    OffsetY: \"__SandDance__Y\",\n    OffsetHeight: \"__SandDance__H\",\n    OffsetWidth: \"__SandDance__W\"\n};\nconst ScaleNames = {\n    Color: \"scale_color\",\n    X: \"scale_x\",\n    Y: \"scale_y\",\n    Z: \"scale_z\"\n};\nconst SignalNames = {\n    ViewportWidth: \"ViewportWidth\",\n    ViewportHeight: \"ViewportHeight\",\n    MinCellWidth: \"MinCellWidth\",\n    MinCellHeight: \"MinCellHeight\",\n    PlotOffsetLeft: \"PlotOffsetLeft\",\n    PlotOffsetTop: \"PlotOffsetTop\",\n    PlotOffsetBottom: \"PlotOffsetBottom\",\n    PlotOffsetRight: \"PlotOffsetRight\",\n    PlotHeightIn: \"PlotHeightIn\",\n    PlotWidthIn: \"PlotWidthIn\",\n    PlotHeightOut: \"PlotHeightOut\",\n    PlotWidthOut: \"PlotWidthOut\",\n    ColorBinCount: \"RoleColor_BinCountSignal\",\n    ColorReverse: \"RoleColor_ReverseSignal\",\n    FacetAxesAdjustX: \"RoleFacet_AxesAdjustSignalX\",\n    FacetAxesAdjustY: \"RoleFacet_AxesAdjustSignalY\",\n    FacetBins: \"RoleFacet_BinsSignal\",\n    FacetVBins: \"RoleFacetV_BinsSignal\",\n    FacetPaddingTop: \"FacetPaddingTop\",\n    FacetPaddingBottom: \"FacetPaddingBottom\",\n    FacetPaddingLeft: \"FacetPaddingLeft\",\n    MarkOpacity: \"Mark_OpacitySignal\",\n    PointScale: \"Chart_PointScaleSignal\",\n    TextAngleX: \"Text_AngleXSignal\",\n    TextAngleY: \"Text_AngleYSignal\",\n    TextScale: \"Text_ScaleSignal\",\n    TextSize: \"Text_SizeSignal\",\n    TextTitleSize: \"Text_TitleSizeSignal\",\n    TreeMapMethod: \"Chart_TreeMapMethodSignal\",\n    XBins: \"RoleX_BinsSignal\",\n    YBins: \"RoleY_BinsSignal\",\n    ZHeight: \"RoleZ_HeightSignal\",\n    ZGrounded: \"RoleZ_Grounded\",\n    ZProportion: \"RoleZ_ProportionSignal\"\n};\nconst Other = \"__Other\";\nconst ColorScaleNone = \"none\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5kAFI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultBins\", ()=>defaultBins);\nparcelHelpers.export(exports, \"maxbins\", ()=>maxbins);\nparcelHelpers.export(exports, \"minBarBandWidth\", ()=>minBarBandWidth);\nparcelHelpers.export(exports, \"minFacetWidth\", ()=>minFacetWidth);\nparcelHelpers.export(exports, \"minFacetHeight\", ()=>minFacetHeight);\nparcelHelpers.export(exports, \"facetPaddingLeft\", ()=>facetPaddingLeft);\nparcelHelpers.export(exports, \"facetPaddingTop\", ()=>facetPaddingTop);\nparcelHelpers.export(exports, \"facetPaddingBottom\", ()=>facetPaddingBottom);\nparcelHelpers.export(exports, \"facetPaddingRight\", ()=>facetPaddingRight);\nparcelHelpers.export(exports, \"axesLabelLimit\", ()=>axesLabelLimit);\nparcelHelpers.export(exports, \"axesTitleLimit\", ()=>axesTitleLimit);\nparcelHelpers.export(exports, \"axesTitlePaddingX\", ()=>axesTitlePaddingX);\nparcelHelpers.export(exports, \"axesTitlePaddingY\", ()=>axesTitlePaddingY);\nparcelHelpers.export(exports, \"axesTitlePaddingFacetX\", ()=>axesTitlePaddingFacetX);\nparcelHelpers.export(exports, \"axesTitlePaddingFacetY\", ()=>axesTitlePaddingFacetY);\nparcelHelpers.export(exports, \"axesOffsetX\", ()=>axesOffsetX);\nparcelHelpers.export(exports, \"axesOffsetY\", ()=>axesOffsetY);\nparcelHelpers.export(exports, \"scatterSizedMin\", ()=>scatterSizedMin);\nparcelHelpers.export(exports, \"scatterSizedDiv\", ()=>scatterSizedDiv);\nparcelHelpers.export(exports, \"debounce\", ()=>debounce);\nconst defaultBins = 10;\nconst maxbins = 100;\nconst minBarBandWidth = 15;\nconst minFacetWidth = 140;\nconst minFacetHeight = 180;\nconst facetPaddingLeft = 40;\nconst facetPaddingTop = 40;\nconst facetPaddingBottom = 40;\nconst facetPaddingRight = 40;\nconst axesLabelLimit = 100;\nconst axesTitleLimit = 100;\nconst axesTitlePaddingX = 30;\nconst axesTitlePaddingY = 60;\nconst axesTitlePaddingFacetX = 69;\nconst axesTitlePaddingFacetY = 92;\nconst axesOffsetX = 120;\nconst axesOffsetY = 120;\nconst scatterSizedMin = 10;\nconst scatterSizedDiv = 20;\nconst debounce = 250;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ev1W0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"allowNoneForSize\", ()=>allowNoneForSize);\nfunction allowNoneForSize(specContext) {\n    switch(specContext.insight.totalStyle){\n        case \"sum-strip\":\n        case \"sum-strip-percent\":\n        case \"sum-treemap\":\n            return false;\n        default:\n            //if totalStyle is blank, count is assumed\n            return true;\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1ulMm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nvar _size = require(\"../size\");\nexports.default = function(specContext) {\n    var _a, _b;\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const { language  } = specViewOptions;\n    const showAxes = true;\n    const bandProps = {\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes\n    };\n    const y = {\n        title: null\n    };\n    const axisScales = {\n        x: {\n            title: specColumns.x && specColumns.x.name\n        },\n        y,\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: bandProps\n        }\n    ];\n    if (insight.totalStyle === \"sum-strip-percent\") {\n        y.aggregate = \"percent\";\n        y.title = language.percent;\n        const stripProps = {\n            addPercentageScale: true,\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes\n        };\n        layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n        });\n    } else {\n        const aggProps = {\n            niceScale: true,\n            dock: \"bottom\",\n            globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n            globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n            sumBy: specColumns.size,\n            showAxes\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props: aggProps\n        });\n        switch(insight.totalStyle){\n            case \"sum-treemap\":\n                {\n                    y.aggregate = \"sum\";\n                    y.title = language.sum;\n                    const treemapProps = {\n                        corner: \"bottom-left\",\n                        size: specColumns.size,\n                        treeMapMethod: specViewOptions.language.treeMapMethod,\n                        z: specColumns.z,\n                        showAxes\n                    };\n                    layouts.push({\n                        layoutType: \"Treemap\",\n                        props: treemapProps\n                    });\n                    break;\n                }\n            case \"sum-strip\":\n                {\n                    y.aggregate = \"sum\";\n                    y.title = language.sum;\n                    const stripProps = {\n                        sortOrder: \"descending\",\n                        orientation: \"vertical\",\n                        size: specColumns.size,\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            case \"count-strip\":\n                {\n                    y.aggregate = \"count\";\n                    y.title = language.count;\n                    const stripProps = {\n                        sortOrder: \"descending\",\n                        orientation: \"vertical\",\n                        sort: specColumns.sort,\n                        z: specColumns.z,\n                        showAxes\n                    };\n                    layouts.push({\n                        layoutType: \"Strip\",\n                        props: stripProps\n                    });\n                    break;\n                }\n            default:\n                {\n                    y.aggregate = \"count\";\n                    y.title = language.count;\n                    const squareProps = {\n                        sortBy: specColumns.sort,\n                        fillDirection: \"right-up\",\n                        z: specColumns.z,\n                        maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                        maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                        showAxes\n                    };\n                    layouts.push({\n                        layoutType: \"Square\",\n                        props: squareProps\n                    });\n                    break;\n                }\n        }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).XBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: ((_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.quantitative) ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, _size.allowNoneForSize),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, _constants.SignalNames).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }, \n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"3I5IU\",\"../defaults\":\"5kAFI\",\"../size\":\"ev1W0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"d1hGL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nvar _size = require(\"../size\");\nexports.default = function(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const axisScales = {\n        x: {\n            title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name\n        },\n        y: {\n            title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name\n        },\n        z: {\n            title: (_c = specColumns.z) === null || _c === void 0 ? void 0 : _c.name\n        }\n    };\n    const backgroundImage = ((_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.quantitative) && ((_f = insight.backgroundImage) === null || _f === void 0 ? void 0 : _f.extents) && insight.backgroundImage;\n    const showAxes = !backgroundImage;\n    const hBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes,\n        outerSignalExtents: backgroundImage && {\n            max: backgroundImage.extents.top,\n            min: backgroundImage.extents.bottom\n        }\n    };\n    const vBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes,\n        outerSignalExtents: backgroundImage && {\n            max: backgroundImage.extents.right,\n            min: backgroundImage.extents.left\n        }\n    };\n    const aggProps = {\n        onBuild: null,\n        aggregation: null,\n        sumBy: specColumns.size\n    };\n    const layouts = [\n        {\n            layoutType: \"Band\",\n            props: vBandProps\n        },\n        {\n            layoutType: \"Band\",\n            props: hBandProps\n        },\n        {\n            layoutType: \"AggregateSquare\",\n            props: aggProps\n        }, \n    ];\n    switch(insight.totalStyle){\n        case \"sum-treemap\":\n            {\n                aggProps.aggregation = \"sum\";\n                const treemapProps = {\n                    corner: \"bottom-left\",\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z,\n                    showAxes\n                };\n                layouts.push({\n                    layoutType: \"Treemap\",\n                    props: treemapProps\n                });\n                break;\n            }\n        case \"sum-strip\":\n            {\n                aggProps.aggregation = \"sum\";\n                const stripProps = {\n                    sortOrder: \"ascending\",\n                    orientation: \"vertical\",\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes\n                };\n                layouts.push({\n                    layoutType: \"Strip\",\n                    props: stripProps\n                });\n                break;\n            }\n        case \"count-strip\":\n            {\n                aggProps.aggregation = \"count\";\n                const stripProps = {\n                    sortOrder: \"ascending\",\n                    orientation: \"vertical\",\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes\n                };\n                layouts.push({\n                    layoutType: \"Strip\",\n                    props: stripProps\n                });\n                break;\n            }\n        default:\n            {\n                aggProps.aggregation = \"count\";\n                const squareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: \"right-down\",\n                    z: specColumns.z,\n                    maxGroupedUnits: null,\n                    maxGroupedFillSize: null,\n                    showAxes\n                };\n                aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled)=>{\n                    squareProps.maxGroupedUnits = aggMaxExtent;\n                    squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n                };\n                layouts.push({\n                    layoutType: \"Square\",\n                    props: squareProps\n                });\n                break;\n            }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: true,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).XBins\n                    ]\n                },\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).YBins\n                    ]\n                },\n                {\n                    role: \"z\",\n                    axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    allowNone: (0, _size.allowNoneForSize),\n                    excludeCategoric: true,\n                    signals: [\n                        (0, _constants.SignalNames).TreeMapMethod\n                    ]\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }, \n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"3I5IU\",\"../defaults\":\"5kAFI\",\"../size\":\"ev1W0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7qJJk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    var _a;\n    const { specColumns  } = specContext;\n    const squareProps = {\n        sortBy: specColumns.sort,\n        fillDirection: \"right-down\",\n        z: specColumns.z,\n        collapseYHeight: true,\n        showAxes: true\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    return {\n        axisScales,\n        layouts: [\n            {\n                layoutType: \"Square\",\n                props: squareProps\n            }, \n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"z\",\n                    axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }, \n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"3I5IU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bmKhB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const backgroundImageExtents = ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative) && ((_c = insight.backgroundImage) === null || _c === void 0 ? void 0 : _c.extents);\n    const scatterProps = {\n        x: specColumns.x,\n        y: specColumns.y,\n        z: specColumns.z,\n        size: specColumns.size,\n        scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n        zGrounded: specViewOptions.language.zGrounded,\n        backgroundImageExtents,\n        showAxes: !backgroundImageExtents\n    };\n    const axisScales = {\n        x: {\n            title: (_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.name\n        },\n        y: {\n            title: (_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.name\n        },\n        z: {\n            title: (_f = specColumns.z) === null || _f === void 0 ? void 0 : _f.name\n        }\n    };\n    return {\n        axisScales,\n        layouts: [\n            {\n                layoutType: \"Scatter\",\n                props: scatterProps\n            }, \n        ],\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"x\",\n                    axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\"\n                },\n                {\n                    role: \"y\",\n                    axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? \"range\" : \"exact\"\n                },\n                {\n                    role: \"z\",\n                    axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"size\",\n                    excludeCategoric: true,\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }, \n            ],\n            signals: [\n                (0, _constants.SignalNames).PointScale,\n                (0, _constants.SignalNames).ZGrounded\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"3I5IU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"36aPG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _defaults = require(\"../defaults\");\nvar _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g;\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const axisScales = {\n        x: {\n            title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name\n        },\n        y: {\n            title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name\n        },\n        z: {\n            title: specViewOptions.language.count\n        }\n    };\n    const backgroundImage = ((_c = specColumns.x) === null || _c === void 0 ? void 0 : _c.quantitative) && ((_d = specColumns.y) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = insight.backgroundImage) === null || _e === void 0 ? void 0 : _e.extents) && insight.backgroundImage;\n    const showAxes = !backgroundImage;\n    const hBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"horizontal\",\n        groupby: {\n            column: specColumns.y,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes,\n        outerSignalExtents: backgroundImage && {\n            max: backgroundImage.extents.top,\n            min: backgroundImage.extents.bottom\n        }\n    };\n    const vBandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: \"vertical\",\n        groupby: {\n            column: specColumns.x,\n            defaultBins: (0, _defaults.defaultBins),\n            maxbinsSignalName: (0, _constants.SignalNames).XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins: (0, _defaults.maxbins)\n        },\n        minBandWidth: (0, _defaults.minBarBandWidth),\n        showAxes,\n        outerSignalExtents: backgroundImage && {\n            max: backgroundImage.extents.right,\n            min: backgroundImage.extents.left\n        }\n    };\n    const stackProps = {\n        sort: specColumns.sort,\n        showAxes\n    };\n    return {\n        axisScales,\n        customZScale: true,\n        layouts: [\n            {\n                layoutType: \"Band\",\n                props: vBandProps\n            },\n            {\n                layoutType: \"Band\",\n                props: hBandProps\n            },\n            {\n                layoutType: \"Stack\",\n                props: stackProps\n            }, \n        ],\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"x\",\n                    binnable: true,\n                    axisSelection: ((_f = specColumns.x) === null || _f === void 0 ? void 0 : _f.quantitative) ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).XBins\n                    ]\n                },\n                {\n                    role: \"y\",\n                    binnable: true,\n                    axisSelection: ((_g = specColumns.y) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\",\n                    axisSelectionBetweenTicks: true,\n                    signals: [\n                        (0, _constants.SignalNames).YBins\n                    ]\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }, \n            ]\n        }\n    };\n};\n\n},{\"../defaults\":\"5kAFI\",\"../constants\":\"3I5IU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bdRT1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    var _a;\n    const { specColumns  } = specContext;\n    const stripProps = {\n        sortOrder: \"ascending\",\n        orientation: \"vertical\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes: true\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: specColumns.size ? \"sum\" : \"count\"\n        };\n        const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n        const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n        const props = {\n            dock: \"top\",\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props\n        });\n    }\n    layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n    });\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"size\",\n                    allowNone: true,\n                    excludeCategoric: true\n                },\n                {\n                    role: \"z\",\n                    axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"sort\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }, \n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"3I5IU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dXgQh\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"../constants\");\nexports.default = function(specContext) {\n    var _a;\n    const { specColumns , specViewOptions  } = specContext;\n    const treemapProps = {\n        corner: \"top-left\",\n        group: specColumns.group,\n        size: specColumns.size,\n        treeMapMethod: specViewOptions.language.treeMapMethod,\n        z: specColumns.z,\n        showAxes: true\n    };\n    const axisScales = {\n        z: {\n            title: specColumns.z && specColumns.z.name\n        }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: \"sum\"\n        };\n        const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n        const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n        const props = {\n            dock: \"top\",\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false\n        };\n        layouts.push({\n            layoutType: \"AggregateContainer\",\n            props\n        });\n    }\n    layouts.push({\n        layoutType: \"Treemap\",\n        props: treemapProps\n    });\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: \"size\",\n                    excludeCategoric: true\n                },\n                {\n                    role: \"group\",\n                    allowNone: true\n                },\n                {\n                    role: \"z\",\n                    axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? \"range\" : \"exact\",\n                    allowNone: true\n                },\n                {\n                    role: \"color\",\n                    allowNone: true\n                },\n                {\n                    role: \"facet\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetBins\n                    ]\n                },\n                {\n                    role: \"facetV\",\n                    allowNone: true,\n                    signals: [\n                        (0, _constants.SignalNames).FacetVBins\n                    ]\n                }, \n            ],\n            signals: [\n                (0, _constants.SignalNames).TreeMapMethod\n            ]\n        }\n    };\n};\n\n},{\"../constants\":\"3I5IU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kRHoI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getFacetLayout\", ()=>getFacetLayout);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _defaults = require(\"./defaults\");\nfunction getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n    let layoutPair;\n    const groupby = facetColumn;\n    const plotPadding = {\n        x: 0,\n        y: 0\n    };\n    let facetPadding;\n    switch(facetStyle){\n        case \"cross\":\n            {\n                const props = {\n                    axisTextColor,\n                    colRowTitles: true,\n                    groupbyX: groupby,\n                    groupbyY: facetVColumn\n                };\n                layoutPair = {\n                    layoutType: \"Cross\",\n                    props\n                };\n                facetPadding = {\n                    bottom: (0, _defaults.facetPaddingBottom),\n                    left: (0, _defaults.facetPaddingLeft),\n                    top: 0\n                };\n                plotPadding.y = (0, _defaults.facetPaddingTop);\n                plotPadding.x = (0, _defaults.facetPaddingRight);\n                break;\n            }\n        case \"wrap\":\n        default:\n            {\n                const props = {\n                    axisTextColor,\n                    cellTitles: true,\n                    groupby\n                };\n                layoutPair = {\n                    layoutType: \"Wrap\",\n                    props\n                };\n                facetPadding = {\n                    bottom: (0, _defaults.facetPaddingBottom),\n                    left: (0, _defaults.facetPaddingLeft),\n                    top: (0, _defaults.facetPaddingTop)\n                };\n                break;\n            }\n    }\n    const facetLayout = {\n        facetPadding,\n        plotPadding\n    };\n    return {\n        layoutPair,\n        facetLayout\n    };\n}\n\n},{\"./defaults\":\"5kAFI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hgLDN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Derive column metadata from the data array.\n * @param data Array of data objects.\n */ parcelHelpers.export(exports, \"getColumnsFromData\", ()=>getColumnsFromData);\n/**\n * Get columns associated with each Insight role.\n * @param insight Insight to specify column roles.\n * @param columns Array of Columns inferred from the data.\n */ parcelHelpers.export(exports, \"getSpecColumns\", ()=>getSpecColumns);\n/**\n * Populate columns with type inferences and stats.\n * @param columns Array of columns.\n * @param data Array of data objects.\n */ parcelHelpers.export(exports, \"inferAll\", ()=>inferAll);\nparcelHelpers.export(exports, \"getStats\", ()=>getStats);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _d3Color = require(\"d3-color\");\nfunction isColor(cssColorSpecifier) {\n    return !!(0, _d3Color.color)(cssColorSpecifier);\n}\nfunction isQuantitative(column) {\n    return column.type === \"number\" || column.type === \"integer\";\n}\nfunction getColumnsFromData(inferTypesFn, data, columnTypes) {\n    const sample = data[0];\n    const fields = sample ? Object.keys(sample) : [];\n    const inferences = Object.assign(Object.assign({}, inferTypesFn(data, fields)), columnTypes);\n    const columns = fields.map((name)=>{\n        const column = {\n            name,\n            type: inferences[name]\n        };\n        return column;\n    });\n    inferAll(columns, data);\n    return columns;\n}\nfunction getSpecColumns(insight, columns) {\n    function getColumnByName(name) {\n        return columns.filter((c)=>c.name === name)[0];\n    }\n    return {\n        color: getColumnByName(insight.columns && insight.columns.color),\n        facet: getColumnByName(insight.columns && insight.columns.facet),\n        facetV: getColumnByName(insight.columns && insight.columns.facetV),\n        group: getColumnByName(insight.columns && insight.columns.group),\n        size: getColumnByName(insight.columns && insight.columns.size),\n        sort: getColumnByName(insight.columns && insight.columns.sort),\n        uid: getColumnByName(insight.columns && insight.columns.uid),\n        x: getColumnByName(insight.columns && insight.columns.x),\n        y: getColumnByName(insight.columns && insight.columns.y),\n        z: getColumnByName(insight.columns && insight.columns.z)\n    };\n}\nfunction inferAll(columns, data) {\n    columns.forEach((column)=>{\n        if (column) {\n            if (typeof column.quantitative !== \"boolean\") column.quantitative = isQuantitative(column);\n            if (!column.stats) column.stats = getStats(data, column);\n            if (column.type === \"string\" && typeof column.isColorData !== \"boolean\") checkIsColorData(data, column);\n        }\n    });\n}\nfunction checkIsColorData(data, column) {\n    if (!column.stats.hasColorData) {\n        column.isColorData = false;\n        return;\n    }\n    for(let i = 0; i < data.length; i++)if (!isColor(data[i][column.name])) {\n        column.isColorData = false;\n        return;\n    }\n    column.isColorData = true;\n}\nfunction getStats(data, column) {\n    const distinctMap = {};\n    const stats = {\n        distinctValueCount: null,\n        max: null,\n        mean: null,\n        min: null\n    };\n    let sum = 0;\n    for(let i = 0; i < data.length; i++){\n        const row = data[i];\n        const value = row[column.name];\n        const num = +value;\n        distinctMap[value] = true;\n        if (!isNaN(num)) {\n            if (stats.max === null || num > stats.max) stats.max = num;\n            if (stats.min === null || num < stats.min) stats.min = num;\n            sum += num;\n        }\n        if (column.type === \"string\" && !stats.hasColorData && isColor(value)) stats.hasColorData = true;\n    }\n    if (column.quantitative) {\n        stats.mean = data.length > 0 && sum / data.length;\n        stats.hasNegative = detectNegative(column, data);\n        if (column.type === \"integer\") stats.isSequential = detectSequentialColumn(column, data);\n    }\n    stats.distinctValueCount = Object.keys(distinctMap).length;\n    return stats;\n}\nfunction detectNegative(column, data) {\n    for(let i = 1; i < data.length; i++){\n        if (data[i][column.name] < 0) return true;\n    }\n    return false;\n}\nfunction detectSequentialColumn(column, data) {\n    if (data.length < 2) return false;\n    const colname = column.name;\n    for(let i = 1; i < data.length; i++){\n        if (data[i][colname] !== data[i - 1][colname] + 1) return false;\n    }\n    return true;\n}\n\n},{\"d3-color\":\"cAejr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cAejr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"color\", ()=>(0, _colorJsDefault.default));\nparcelHelpers.export(exports, \"rgb\", ()=>(0, _colorJs.rgb));\nparcelHelpers.export(exports, \"hsl\", ()=>(0, _colorJs.hsl));\nparcelHelpers.export(exports, \"lab\", ()=>(0, _labJsDefault.default));\nparcelHelpers.export(exports, \"hcl\", ()=>(0, _labJs.hcl));\nparcelHelpers.export(exports, \"lch\", ()=>(0, _labJs.lch));\nparcelHelpers.export(exports, \"gray\", ()=>(0, _labJs.gray));\nparcelHelpers.export(exports, \"cubehelix\", ()=>(0, _cubehelixJsDefault.default));\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nvar _labJs = require(\"./lab.js\");\nvar _labJsDefault = parcelHelpers.interopDefault(_labJs);\nvar _cubehelixJs = require(\"./cubehelix.js\");\nvar _cubehelixJsDefault = parcelHelpers.interopDefault(_cubehelixJs);\n\n},{\"./color.js\":\"gKmlp\",\"./lab.js\":false,\"./cubehelix.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gKmlp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Color\", ()=>Color);\nparcelHelpers.export(exports, \"darker\", ()=>darker);\nparcelHelpers.export(exports, \"brighter\", ()=>brighter);\nparcelHelpers.export(exports, \"rgbConvert\", ()=>rgbConvert);\nparcelHelpers.export(exports, \"rgb\", ()=>rgb);\nparcelHelpers.export(exports, \"Rgb\", ()=>Rgb);\nparcelHelpers.export(exports, \"hslConvert\", ()=>hslConvert);\nparcelHelpers.export(exports, \"hsl\", ()=>hsl);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nfunction Color() {}\nvar darker = 0.7;\nvar brighter = 1 / darker;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(\"^rgb\\\\(\" + [\n    reI,\n    reI,\n    reI\n] + \"\\\\)$\"), reRgbPercent = new RegExp(\"^rgb\\\\(\" + [\n    reP,\n    reP,\n    reP\n] + \"\\\\)$\"), reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [\n    reI,\n    reI,\n    reI,\n    reN\n] + \"\\\\)$\"), reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [\n    reP,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\"), reHslPercent = new RegExp(\"^hsl\\\\(\" + [\n    reN,\n    reP,\n    reP\n] + \"\\\\)$\"), reHslaPercent = new RegExp(\"^hsla\\\\(\" + [\n    reN,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\");\nvar named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, _defineJsDefault.default)(Color, color, {\n    copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable: function() {\n        return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    formatHex: color_formatHex,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n});\nfunction color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction color_formatHsl() {\n    return hslConvert(this).formatHsl();\n}\nfunction color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n     : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\nexports.default = color;\nfunction rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n}\nfunction rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n}\nfunction rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Rgb, rgb, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb: function() {\n        return this;\n    },\n    displayable: function() {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: rgb_formatHex,\n    formatHex: rgb_formatHex,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n}));\nfunction rgb_formatHex() {\n    return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\nfunction rgb_formatRgb() {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction hex(value) {\n    value = Math.max(0, Math.min(255, Math.round(value) || 0));\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n}\nfunction hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new Hsl(h, s, l, o.opacity);\n}\nfunction hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Hsl, hsl, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl: function() {\n        var a = this.opacity;\n        a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n},{\"./define.js\":\"X423M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"X423M\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"extend\", ()=>extend);\nexports.default = function(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n};\nfunction extend(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bLsvI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"SpecBuilder\", ()=>SpecBuilder);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _axes = require(\"./axes\");\nvar _color = require(\"./color\");\nvar _constants = require(\"./constants\");\nvar _defaults = require(\"./defaults\");\nvar _facetTitle = require(\"./facetTitle\");\nvar _fill = require(\"./fill\");\nvar _globalScope = require(\"./globalScope\");\nvar _scope = require(\"./scope\");\nvar _signals = require(\"./signals\");\nvar _index = require(\"./layouts/index\");\nvar _image = require(\"./image\");\nclass SpecBuilder {\n    constructor(props, specContext){\n        this.props = props;\n        this.specContext = specContext;\n        this.globalSignals = {\n            facetAxesAdjustX: {\n                name: (0, _constants.SignalNames).FacetAxesAdjustX,\n                update: props.facetLayout && props.collapseFacetAxes ? (0, _defaults.facetPaddingLeft).toString() : \"0\"\n            },\n            facetAxesAdjustY: {\n                name: (0, _constants.SignalNames).FacetAxesAdjustY,\n                update: props.facetLayout && props.collapseFacetAxes ? (0, _defaults.facetPaddingBottom).toString() : \"0\"\n            },\n            minCellWidth: {\n                name: (0, _constants.SignalNames).MinCellWidth,\n                update: `${0, _defaults.minFacetWidth}`\n            },\n            minCellHeight: {\n                name: (0, _constants.SignalNames).MinCellHeight,\n                update: `${0, _defaults.minFacetHeight}`\n            },\n            plotOffsetLeft: {\n                name: (0, _constants.SignalNames).PlotOffsetLeft,\n                update: \"0\"\n            },\n            plotOffsetTop: {\n                name: (0, _constants.SignalNames).PlotOffsetTop,\n                update: \"0\"\n            },\n            plotOffsetBottom: {\n                name: (0, _constants.SignalNames).PlotOffsetBottom,\n                update: \"0\"\n            },\n            plotOffsetRight: {\n                name: (0, _constants.SignalNames).PlotOffsetRight,\n                update: \"0\"\n            },\n            plotHeightOut: {\n                name: (0, _constants.SignalNames).PlotHeightOut,\n                update: (0, _constants.SignalNames).PlotHeightIn\n            },\n            plotWidthOut: {\n                name: (0, _constants.SignalNames).PlotWidthOut,\n                update: (0, _constants.SignalNames).PlotWidthIn\n            }\n        };\n    }\n    validate() {\n        const { specContext  } = this;\n        const { specCapabilities  } = this.props;\n        const { roles  } = specCapabilities;\n        const required = roles.filter((r)=>{\n            switch(typeof r.allowNone){\n                case \"boolean\":\n                    return !r.allowNone;\n                case \"undefined\":\n                    return true;\n                case \"function\":\n                    return !r.allowNone(specContext);\n            }\n        });\n        const numeric = roles.filter((r)=>r.excludeCategoric);\n        const errors = required.map((r)=>{\n            if (specContext.specColumns[r.role]) return null;\n            else return `Field ${r.role} is required.`;\n        }).concat(numeric.map((r)=>{\n            if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) return `Field ${r.role} must be quantitative.`;\n            else return null;\n        })).filter(Boolean);\n        const { backgroundImage  } = specContext.insight;\n        if (backgroundImage && !backgroundImage.extents) errors.push(\"BackgroundImage must have extents.\");\n        return errors;\n    }\n    build() {\n        var _a, _b;\n        const { globalSignals , specContext  } = this;\n        const { facetLayout , specCapabilities  } = this.props;\n        const { insight , specColumns , specViewOptions  } = specContext;\n        const dataName = \"data_source\";\n        const { vegaSpec , groupMark  } = this.initSpec(dataName);\n        const { topColorField , colorDataName  } = (0, _color.addColor)({\n            scope: vegaSpec,\n            dataName,\n            specContext,\n            scaleName: (0, _constants.ScaleNames).Color,\n            legendDataName: \"data_legend\",\n            topLookupName: \"data_topcolorlookup\",\n            colorReverseSignalName: (0, _constants.SignalNames).ColorReverse\n        });\n        const globalScope = new (0, _globalScope.GlobalScope)({\n            dataName: colorDataName,\n            markGroup: groupMark,\n            scope: vegaSpec,\n            signals: globalSignals\n        });\n        if (facetLayout) {\n            (0, _scope.addSignals)(vegaSpec, {\n                name: (0, _constants.SignalNames).FacetPaddingBottom,\n                update: `${facetLayout.facetPadding.bottom}`\n            }, {\n                name: (0, _constants.SignalNames).FacetPaddingLeft,\n                update: `${facetLayout.facetPadding.left}`\n            }, {\n                name: (0, _constants.SignalNames).FacetPaddingTop,\n                update: `${facetLayout.facetPadding.top}`\n            });\n            globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n            globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n        }\n        const { firstScope , finalScope , specResult , allGlobalScales , allEncodingRules ,  } = this.iterateLayouts(globalScope, (i, innerScope)=>{\n            if (facetLayout && i === 0) globalScope.zSize = innerScope.offsets.h;\n        });\n        if (specResult) return specResult;\n        if (allGlobalScales.length > 0) {\n            const plotHeightOut = globalSignals.plotHeightOut.name;\n            const plotWidthOut = globalSignals.plotWidthOut.name;\n            const colTitleScale = {\n                type: \"linear\",\n                name: \"scale_facet_col_title\",\n                domain: [\n                    0,\n                    1\n                ],\n                range: [\n                    0,\n                    {\n                        signal: plotWidthOut\n                    }\n                ]\n            };\n            const rowTitleScale = {\n                type: \"linear\",\n                name: \"scale_facet_row_title\",\n                domain: [\n                    0,\n                    1\n                ],\n                range: [\n                    {\n                        signal: plotHeightOut\n                    },\n                    0\n                ]\n            };\n            const facetScope = facetLayout ? firstScope : null;\n            const backgroundGroup = facetLayout ? facetScope.facetScope : groupMark;\n            //TODO if capability and numeric x,y\n            if (insight.backgroundImage && specCapabilities.backgroundImage && ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative)) {\n                //backgroundGroup.encode.update.fill = { value: 'pink' }\n                if (!backgroundGroup.marks) backgroundGroup.marks = [];\n                const imageMark = (0, _image.getImageMark)(insight.backgroundImage, allGlobalScales);\n                backgroundGroup.marks.unshift(imageMark);\n            }\n            const axesScopes = facetLayout ? (0, _facetTitle.addFacetAxesGroupMarks)({\n                globalScope: globalScope.scope,\n                plotScope: groupMark,\n                facetScope,\n                colTitleScale,\n                rowTitleScale,\n                colSeqName: \"data_FacetCellColTitles\",\n                rowSeqName: \"data_FacetCellRowTitles\"\n            }) : {\n                main: [\n                    {\n                        scope: groupMark,\n                        lines: true,\n                        labels: true,\n                        title: true\n                    }\n                ]\n            };\n            (0, _axes.addGlobalAxes)({\n                globalScope,\n                allGlobalScales,\n                axisScales: this.props.axisScales,\n                plotOffsetSignals: {\n                    x: globalSignals.plotOffsetLeft,\n                    y: globalSignals.plotOffsetBottom\n                },\n                axesOffsets: {\n                    x: (0, _defaults.axesOffsetX),\n                    y: (0, _defaults.axesOffsetY)\n                },\n                axesTitlePadding: facetLayout ? {\n                    x: (0, _defaults.axesTitlePaddingFacetX),\n                    y: (0, _defaults.axesTitlePaddingFacetY)\n                } : {\n                    x: (0, _defaults.axesTitlePaddingX),\n                    y: (0, _defaults.axesTitlePaddingY)\n                },\n                labelBaseline: {\n                    x: \"top\",\n                    y: \"middle\"\n                },\n                specColumns,\n                specViewOptions,\n                axesScopes,\n                hideZAxis: !!facetLayout,\n                view: insight.view\n            });\n        }\n        //add mark to the final scope\n        if (finalScope.mark) {\n            const { update  } = finalScope.mark.encode;\n            const outputDataName = \"output\";\n            finalScope.mark.from.data = outputDataName;\n            (0, _scope.addData)(globalScope.markGroup, {\n                name: outputDataName,\n                source: globalScope.markDataName,\n                transform: [\n                    {\n                        type: \"formula\",\n                        expr: finalScope.offsets.x,\n                        as: (0, _constants.FieldNames).OffsetX\n                    },\n                    {\n                        type: \"formula\",\n                        expr: finalScope.offsets.y,\n                        as: (0, _constants.FieldNames).OffsetY\n                    }, \n                ]\n            });\n            update.x = {\n                field: (0, _constants.FieldNames).OffsetX\n            };\n            update.y = {\n                field: (0, _constants.FieldNames).OffsetY\n            };\n            allEncodingRules.forEach((map)=>{\n                for(const key in map)if (update[key]) {\n                    const arrIn = map[key];\n                    if (!Array.isArray(update[key])) {\n                        const value = update[key];\n                        const arrOut = [];\n                        update[key] = arrOut;\n                        arrIn.forEach((rule)=>arrOut.push(rule));\n                        arrOut.push(value);\n                    } else {\n                        const arrOut = update[key];\n                        arrIn.forEach((rule)=>arrOut.unshift(rule));\n                    }\n                }\n            });\n            update.fill = (0, _fill.fill)(specContext, topColorField, (0, _constants.ScaleNames).Color);\n            update.opacity = (0, _fill.opacity)(specContext);\n        }\n        return {\n            specCapabilities,\n            vegaSpec\n        };\n    }\n    initSpec(dataName) {\n        const { globalSignals  } = this;\n        const { facetAxesAdjustX , facetAxesAdjustY , minCellWidth , minCellHeight , plotOffsetLeft , plotOffsetBottom , plotOffsetTop , plotOffsetRight , plotHeightOut , plotWidthOut  } = globalSignals;\n        const { specContext  } = this;\n        const { insight  } = specContext;\n        const groupMark = {\n            type: \"group\",\n            //style: 'cell',\n            encode: {\n                update: {\n                    x: {\n                        signal: `${(0, _constants.SignalNames).PlotOffsetLeft} - ${(0, _constants.SignalNames).FacetAxesAdjustX}`\n                    },\n                    y: {\n                        signal: (0, _constants.SignalNames).PlotOffsetTop\n                    },\n                    height: {\n                        signal: `${(0, _constants.SignalNames).PlotHeightOut} - ${(0, _constants.SignalNames).FacetAxesAdjustY}`\n                    },\n                    width: {\n                        signal: `${(0, _constants.SignalNames).PlotWidthOut} + ${(0, _constants.SignalNames).FacetAxesAdjustX}`\n                    }\n                }\n            }\n        };\n        const inputDataname = \"input\";\n        const vegaSpec = {\n            $schema: \"https://vega.github.io/schema/vega/v5.json\",\n            //style: 'cell',\n            data: [\n                {\n                    name: inputDataname\n                },\n                {\n                    name: dataName,\n                    source: inputDataname,\n                    transform: []\n                }\n            ],\n            marks: [\n                groupMark\n            ],\n            signals: (0, _signals.textSignals)(specContext, (0, _constants.SignalNames).ViewportHeight).concat([\n                minCellWidth,\n                minCellHeight,\n                {\n                    name: (0, _constants.SignalNames).ViewportHeight,\n                    update: `max(${(0, _constants.SignalNames).MinCellHeight}, ${insight.size.height})`\n                },\n                {\n                    name: (0, _constants.SignalNames).ViewportWidth,\n                    update: `max(${(0, _constants.SignalNames).MinCellWidth}, ${insight.size.width})`\n                },\n                plotOffsetLeft,\n                plotOffsetTop,\n                plotOffsetBottom,\n                plotOffsetRight,\n                facetAxesAdjustX,\n                facetAxesAdjustY,\n                {\n                    name: (0, _constants.SignalNames).PlotHeightIn,\n                    update: `${(0, _constants.SignalNames).ViewportHeight} - ${(0, _constants.SignalNames).PlotOffsetBottom} + ${(0, _constants.SignalNames).FacetAxesAdjustY}`\n                },\n                {\n                    name: (0, _constants.SignalNames).PlotWidthIn,\n                    update: `${(0, _constants.SignalNames).ViewportWidth} - ${(0, _constants.SignalNames).PlotOffsetLeft} - ${(0, _constants.SignalNames).PlotOffsetRight}`\n                },\n                plotHeightOut,\n                plotWidthOut,\n                {\n                    name: \"height\",\n                    update: `${(0, _constants.SignalNames).PlotOffsetTop} + ${(0, _constants.SignalNames).PlotHeightOut} + ${(0, _constants.SignalNames).PlotOffsetBottom} - ${(0, _constants.SignalNames).FacetAxesAdjustY}`\n                },\n                {\n                    name: \"width\",\n                    update: `${(0, _constants.SignalNames).PlotWidthOut} + ${(0, _constants.SignalNames).PlotOffsetLeft} + ${(0, _constants.SignalNames).PlotOffsetRight}`\n                }, \n            ])\n        };\n        return {\n            vegaSpec,\n            groupMark\n        };\n    }\n    iterateLayouts(globalScope, onLayoutBuild) {\n        let specResult;\n        let parentScope = {\n            sizeSignals: globalScope.sizeSignals,\n            offsets: globalScope.offsets\n        };\n        let firstScope;\n        let childScope;\n        const groupings = [];\n        const { layouts , specCapabilities  } = this.props;\n        const allGlobalScales = [];\n        const allEncodingRules = [];\n        for(let i = 0; i < layouts.length; i++){\n            if (!parentScope) continue;\n            const buildProps = {\n                globalScope,\n                parentScope,\n                axesScales: this.props.axisScales,\n                groupings,\n                id: i\n            };\n            const layout = this.createLayout(layouts[i], buildProps);\n            try {\n                childScope = layout.build();\n                childScope.id = i;\n                const groupby = layout.getGrouping();\n                if (groupby) groupings.push({\n                    id: i,\n                    groupby,\n                    fieldOps: [\n                        {\n                            field: null,\n                            op: \"count\",\n                            as: (0, _constants.FieldNames).Count\n                        }, \n                    ]\n                });\n                const sumOp = layout.getAggregateSumOp();\n                if (sumOp) groupings[groupings.length - 1].fieldOps.push(sumOp);\n                onLayoutBuild(i, childScope);\n            } catch (e) {\n                specResult = {\n                    errors: [\n                        e.stack\n                    ],\n                    specCapabilities,\n                    vegaSpec: null\n                };\n                break;\n            }\n            if (childScope && childScope.globalScales) allGlobalScales.push(childScope.globalScales);\n            if (childScope.encodingRuleMap) allEncodingRules.push(childScope.encodingRuleMap);\n            if (i === 0) firstScope = childScope;\n            parentScope = childScope;\n        }\n        return {\n            firstScope,\n            finalScope: parentScope,\n            specResult,\n            allGlobalScales,\n            allEncodingRules\n        };\n    }\n    createLayout(layoutPair, buildProps) {\n        const { layoutType , props  } = layoutPair;\n        const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n        const layoutClass = (0, _index.layoutClasses)[layoutType];\n        const layout = new layoutClass(layoutBuildProps);\n        layout.id = buildProps.id;\n        return layout;\n    }\n}\n\n},{\"./axes\":\"6V3Kf\",\"./color\":\"bR3Rc\",\"./constants\":\"3I5IU\",\"./defaults\":\"5kAFI\",\"./facetTitle\":\"k14Ax\",\"./fill\":\"cZVNs\",\"./globalScope\":\"8eLZx\",\"./scope\":\"deG3T\",\"./signals\":\"6xNUg\",\"./layouts/index\":\"6WMRo\",\"./image\":\"CdrH9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6V3Kf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addGlobalAxes\", ()=>addGlobalAxes);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _defaults = require(\"./defaults\");\nvar _scope = require(\"./scope\");\nfunction addGlobalAxes(props1) {\n    const { axesOffsets , axisScales , axesScopes , axesTitlePadding , allGlobalScales , globalScope , labelBaseline , plotOffsetSignals , specColumns , specViewOptions  } = props1;\n    const { scope  } = globalScope;\n    allGlobalScales.forEach((globalScales)=>{\n        const { scales  } = globalScales;\n        for(const xyz in scales){\n            const _scales = scales[xyz];\n            if (_scales) {\n                (0, _scope.addScales)(scope, ..._scales);\n                let { showAxes  } = globalScales;\n                let zindex = undefined;\n                if (xyz === \"z\") {\n                    showAxes = false;\n                    if (props1.view === \"3d\" && specViewOptions.zAxisOptions && !props1.hideZAxis) {\n                        if (specViewOptions.zAxisOptions.showZAxis) {\n                            showAxes = true;\n                            zindex = specViewOptions.zAxisOptions.zIndex;\n                        }\n                    }\n                }\n                if (showAxes && axisScales) {\n                    const axisScale = axisScales[xyz];\n                    if (axisScale) {\n                        const lineColor = specViewOptions.colors.axisLine;\n                        const horizontal = xyz === \"x\";\n                        const column = specColumns[xyz] || {\n                            quantitative: true\n                        };\n                        const title = axisScale.title;\n                        const props = {\n                            title,\n                            horizontal,\n                            column,\n                            specViewOptions,\n                            lineColor,\n                            titlePadding: axesTitlePadding[xyz],\n                            labelBaseline: labelBaseline[xyz],\n                            zindex\n                        };\n                        axesScopes[\"main\"].forEach((a)=>(0, _scope.addAxes)(a.scope, createAxis(Object.assign(Object.assign({}, props), {\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines\n                            }))));\n                        if (axesScopes[xyz]) axesScopes[xyz].forEach((a)=>(0, _scope.addAxes)(a.scope, createAxis(Object.assign(Object.assign({}, props), {\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines\n                            }))));\n                        if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                            const plotOffsetSignal = plotOffsetSignals[xyz];\n                            plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                        }\n                    }\n                }\n            }\n        }\n    });\n}\nfunction createAxis(props) {\n    const { column , horizontal , labelBaseline , lineColor , scale , showLabels , showTitle , showLines , specViewOptions , title , titlePadding , zindex  } = props;\n    const axis = Object.assign(Object.assign(Object.assign(Object.assign({\n        zindex,\n        scale: scale.name,\n        orient: horizontal ? \"bottom\" : \"left\",\n        domain: showLines,\n        ticks: showLines\n    }, showLines && {\n        domainColor: lineColor,\n        tickColor: lineColor,\n        tickSize: specViewOptions.tickSize\n    }), showTitle && {\n        title,\n        titleAlign: horizontal ? \"left\" : \"right\",\n        titleAngle: {\n            signal: horizontal ? (0, _constants.SignalNames).TextAngleX : (0, _constants.SignalNames).TextAngleY\n        },\n        titleColor: specViewOptions.colors.axisText,\n        titleFontSize: {\n            signal: (0, _constants.SignalNames).TextTitleSize\n        },\n        titleLimit: (0, _defaults.axesTitleLimit),\n        titlePadding\n    }), {\n        labels: showLabels\n    }), showLabels && {\n        labelAlign: horizontal ? \"left\" : \"right\",\n        labelBaseline,\n        labelAngle: {\n            signal: horizontal ? (0, _constants.SignalNames).TextAngleX : (0, _constants.SignalNames).TextAngleY\n        },\n        labelColor: specViewOptions.colors.axisText,\n        labelFontSize: {\n            signal: (0, _constants.SignalNames).TextSize\n        },\n        labelLimit: (0, _defaults.axesLabelLimit)\n    });\n    if (column.quantitative) axis.format = \"~r\";\n    return axis;\n}\n\n},{\"./constants\":\"3I5IU\",\"./defaults\":\"5kAFI\",\"./scope\":\"deG3T\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"deG3T\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"addAxes\", ()=>addAxes);\nparcelHelpers.export(exports, \"addData\", ()=>addData);\nparcelHelpers.export(exports, \"addMarks\", ()=>addMarks);\nparcelHelpers.export(exports, \"addScales\", ()=>addScales);\nparcelHelpers.export(exports, \"addSignals\", ()=>addSignals);\nparcelHelpers.export(exports, \"addTransforms\", ()=>addTransforms);\nparcelHelpers.export(exports, \"getDataByName\", ()=>getDataByName);\nparcelHelpers.export(exports, \"getGroupBy\", ()=>getGroupBy);\nparcelHelpers.export(exports, \"addOffsets\", ()=>addOffsets);\nfunction addAxes(scope, ...axes) {\n    if (!axes || !axes.length) return;\n    if (!scope.axes) scope.axes = [];\n    scope.axes.push(...axes.filter(Boolean));\n}\nfunction addData(scope, ...datas) {\n    if (!datas || !datas.length) return;\n    if (!scope.data) scope.data = [];\n    scope.data.push(...datas.filter(Boolean));\n}\nfunction addMarks(scope, ...marks) {\n    if (!marks || !marks.length) return;\n    if (!scope.marks) scope.marks = [];\n    scope.marks.push(...marks.filter(Boolean));\n}\nfunction addScales(scope, ...scales) {\n    if (!scales || !scales.length) return;\n    if (!scope.scales) scope.scales = [];\n    scope.scales.push(...scales.filter(Boolean));\n}\nfunction addSignals(scope, ...signals) {\n    if (!signals || !signals.length) return;\n    if (!scope.signals) scope.signals = [];\n    scope.signals.push(...signals.filter(Boolean));\n}\nfunction addTransforms(data, ...transforms) {\n    if (!transforms || !transforms.length) return;\n    if (!data.transform) data.transform = [];\n    data.transform.push(...transforms.filter(Boolean));\n}\nfunction getDataByName(data, dataName) {\n    for(let i = 0; i < data.length; i++){\n        if (data[i].name === dataName) return {\n            data: data[i],\n            index: i\n        };\n    }\n}\nfunction getGroupBy(groupings) {\n    const groupby = groupings.map((g)=>g.groupby);\n    return groupby.reduce((acc, val)=>acc.concat(val), []);\n}\nfunction addOffsets(...offsets) {\n    return offsets.filter(Boolean).join(\" + \");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bR3Rc\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addColor\", ()=>addColor);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _scope = require(\"./scope\");\nvar _scales = require(\"./scales\");\nvar _signals = require(\"./signals\");\nvar _constants = require(\"./constants\");\nvar _legends = require(\"./legends\");\nvar _top = require(\"./top\");\nfunction addColor(props) {\n    const { colorReverseSignalName , dataName , scope , legendDataName , scaleName , specContext , topLookupName  } = props;\n    let colorDataName = dataName;\n    const { insight , specColumns , specViewOptions  } = specContext;\n    const legends = (0, _legends.getLegends)(specContext, scaleName);\n    if (legends) scope.legends = legends;\n    const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n    if (categoricalColor) {\n        (0, _scope.addData)(scope, ...(0, _top.topLookup)(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, (0, _constants.FieldNames).TopColor, (0, _constants.FieldNames).TopIndex));\n        colorDataName = legendDataName;\n    }\n    if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n        if (specColumns.color.quantitative) (0, _scope.addScales)(scope, (0, _scales.binnableColorScale)(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n        else (0, _scope.addScales)(scope, {\n            name: scaleName,\n            type: \"ordinal\",\n            domain: {\n                data: colorDataName,\n                field: (0, _constants.FieldNames).TopColor,\n                sort: true\n            },\n            range: {\n                scheme: insight.scheme || (0, _constants.ColorScaleNone)\n            },\n            reverse: {\n                signal: colorReverseSignalName\n            }\n        });\n    }\n    (0, _scope.addSignals)(scope, (0, _signals.colorBinCountSignal)(specContext), (0, _signals.colorReverseSignal)(specContext));\n    return {\n        topColorField: (0, _constants.FieldNames).TopColor,\n        colorDataName\n    };\n}\n\n},{\"./scope\":\"deG3T\",\"./scales\":\"hjH4p\",\"./signals\":\"6xNUg\",\"./constants\":\"3I5IU\",\"./legends\":\"b8dQ9\",\"./top\":\"5wQr0\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hjH4p\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"linearScale\", ()=>linearScale);\nparcelHelpers.export(exports, \"pointScale\", ()=>pointScale);\nparcelHelpers.export(exports, \"binnableColorScale\", ()=>binnableColorScale);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction linearScale(scaleName, domain, range, reverse, zero, nice = true) {\n    const scale = {\n        name: scaleName,\n        type: \"linear\",\n        range,\n        round: true,\n        reverse,\n        domain,\n        zero,\n        nice\n    };\n    return scale;\n}\nfunction pointScale(scaleName, data, range, field, reverse) {\n    const scale = {\n        name: scaleName,\n        type: \"point\",\n        range,\n        domain: {\n            data,\n            field: (0, _expr.safeFieldName)(field),\n            sort: true\n        },\n        padding: 0.5\n    };\n    if (reverse !== undefined) scale.reverse = reverse;\n    return scale;\n}\nfunction binnableColorScale(scaleName, colorBin, data, field, scheme) {\n    scheme = scheme || (0, _constants.ColorScaleNone);\n    const domain = {\n        data,\n        field: (0, _expr.safeFieldName)(field)\n    };\n    const range = {\n        scheme\n    };\n    const reverse = {\n        signal: (0, _constants.SignalNames).ColorReverse\n    };\n    if (colorBin !== \"continuous\") range.count = {\n        signal: (0, _constants.SignalNames).ColorBinCount\n    };\n    switch(colorBin){\n        case \"continuous\":\n            {\n                const sequentialScale = {\n                    name: scaleName,\n                    type: \"linear\",\n                    domain,\n                    range,\n                    reverse\n                };\n                return sequentialScale;\n            }\n        case \"quantile\":\n            {\n                const quantileScale = {\n                    name: scaleName,\n                    type: \"quantile\",\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantileScale;\n            }\n        default:\n            {\n                const quantizeScale = {\n                    name: scaleName,\n                    type: \"quantize\",\n                    domain,\n                    range,\n                    reverse\n                };\n                return quantizeScale;\n            }\n    }\n}\n\n},{\"./constants\":\"3I5IU\",\"./expr\":\"7TBI4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7TBI4\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * Make sure that the field name is accessible via Vega's Field type\n * https://vega.github.io/vega/docs/types/#Field\n * examples: \"source.x\", \"target['x']\", \"[my.field]\"\n */ parcelHelpers.export(exports, \"safeFieldName\", ()=>safeFieldName);\n/**\n * Make sure the field name is usable in a Vega expression\n */ parcelHelpers.export(exports, \"exprSafeFieldName\", ()=>exprSafeFieldName);\nfunction safeFieldName(field) {\n    return field.replace(\".\", \"\\\\.\").replace(\"[\", \"\\\\[\").replace(\"]\", \"\\\\]\");\n}\nfunction exprSafeFieldName(field) {\n    //remove whitespace, period, accessors and logical modifiers\n    return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, \"\");\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6xNUg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultZProportion\", ()=>defaultZProportion);\nparcelHelpers.export(exports, \"textSignals\", ()=>textSignals);\nparcelHelpers.export(exports, \"colorBinCountSignal\", ()=>colorBinCountSignal);\nparcelHelpers.export(exports, \"colorReverseSignal\", ()=>colorReverseSignal);\nparcelHelpers.export(exports, \"modifySignal\", ()=>modifySignal);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _defaults = require(\"./defaults\");\nconst defaultZProportion = 0.6;\nfunction textSignals(context, heightSignal) {\n    const { specViewOptions  } = context;\n    const signals = [\n        {\n            name: (0, _constants.SignalNames).ZProportion,\n            value: defaultZProportion,\n            bind: {\n                name: specViewOptions.language.zScaleProportion,\n                debounce: (0, _defaults.debounce),\n                input: \"range\",\n                min: 0.1,\n                max: 2,\n                step: 0.1\n            }\n        },\n        {\n            name: (0, _constants.SignalNames).ZHeight,\n            update: `${heightSignal} * ${(0, _constants.SignalNames).ZProportion}`\n        },\n        {\n            name: (0, _constants.SignalNames).TextScale,\n            value: 1.2,\n            bind: {\n                name: specViewOptions.language.textScaleSignal,\n                debounce: (0, _defaults.debounce),\n                input: \"range\",\n                min: 0.5,\n                max: 2,\n                step: 0.1\n            }\n        },\n        {\n            name: (0, _constants.SignalNames).TextSize,\n            update: `${(0, _constants.SignalNames).TextScale} * 10`\n        },\n        {\n            name: (0, _constants.SignalNames).TextTitleSize,\n            update: `${(0, _constants.SignalNames).TextScale} * 15`\n        },\n        {\n            name: (0, _constants.SignalNames).TextAngleX,\n            value: 30,\n            bind: {\n                name: specViewOptions.language.xAxisTextAngleSignal,\n                debounce: (0, _defaults.debounce),\n                input: \"range\",\n                min: 0,\n                max: 90,\n                step: 1\n            }\n        },\n        {\n            name: (0, _constants.SignalNames).TextAngleY,\n            value: 0,\n            bind: {\n                name: specViewOptions.language.yAxisTextAngleSignal,\n                debounce: (0, _defaults.debounce),\n                input: \"range\",\n                min: -90,\n                max: 0,\n                step: 1\n            }\n        },\n        {\n            name: (0, _constants.SignalNames).MarkOpacity,\n            value: 1,\n            bind: {\n                name: specViewOptions.language.markOpacitySignal,\n                debounce: (0, _defaults.debounce),\n                input: \"range\",\n                min: 0.1,\n                max: 1,\n                step: 0.05\n            }\n        }, \n    ];\n    return signals;\n}\nfunction colorBinCountSignal(context) {\n    const { specViewOptions  } = context;\n    const signal = {\n        name: (0, _constants.SignalNames).ColorBinCount,\n        value: 7,\n        bind: {\n            name: specViewOptions.language.colorBinCount,\n            debounce: (0, _defaults.debounce),\n            input: \"range\",\n            min: 1,\n            max: specViewOptions.maxLegends + 1,\n            step: 1\n        }\n    };\n    return signal;\n}\nfunction colorReverseSignal(context) {\n    const { specViewOptions  } = context;\n    const signal = {\n        name: (0, _constants.SignalNames).ColorReverse,\n        value: false,\n        bind: {\n            name: specViewOptions.language.colorReverse,\n            input: \"checkbox\"\n        }\n    };\n    return signal;\n}\nfunction modifySignal(s, fn, update) {\n    s.update = `${fn}((${s.update}), (${update}))`;\n}\n\n},{\"./constants\":\"3I5IU\",\"./defaults\":\"5kAFI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"b8dQ9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getLegends\", ()=>getLegends);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ function legend(column, fill) {\n    const legend1 = {\n        orient: \"none\",\n        title: column.name,\n        fill,\n        encode: {\n            symbols: {\n                update: {\n                    shape: {\n                        value: \"square\"\n                    }\n                }\n            }\n        }\n    };\n    if (column.quantitative) {\n        legend1.type = \"symbol\";\n        legend1.format = \"~r\";\n    }\n    return legend1;\n}\nfunction getLegends(context, fill) {\n    const { specColumns , insight  } = context;\n    if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) return [\n        legend(specColumns.color, fill)\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5wQr0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"topLookup\", ()=>topLookup);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction topLookup(column, count, source, legend, lookupName, fieldName, indexName) {\n    const data = [\n        {\n            name: lookupName,\n            source,\n            transform: [\n                {\n                    type: \"aggregate\",\n                    groupby: [\n                        (0, _expr.safeFieldName)(column.name)\n                    ]\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"count\"\n                    ],\n                    as: [\n                        indexName\n                    ]\n                },\n                {\n                    type: \"filter\",\n                    expr: `datum[${JSON.stringify(indexName)}] <= ${count}`\n                }, \n            ]\n        },\n        {\n            name: legend,\n            source,\n            transform: [\n                {\n                    type: \"lookup\",\n                    from: lookupName,\n                    key: (0, _expr.safeFieldName)(column.name),\n                    fields: [\n                        column.name\n                    ].map((0, _expr.safeFieldName)),\n                    values: [\n                        column.name\n                    ].map((0, _expr.safeFieldName)),\n                    as: [\n                        fieldName\n                    ]\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum[${JSON.stringify(fieldName)}] == null ? '${(0, _constants.Other)}' : datum[${JSON.stringify(fieldName)}]`,\n                    as: fieldName\n                }, \n            ]\n        }, \n    ];\n    return data;\n}\n\n},{\"./constants\":\"3I5IU\",\"./expr\":\"7TBI4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"k14Ax\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addFacetColRowTitles\", ()=>addFacetColRowTitles);\nparcelHelpers.export(exports, \"addFacetCellTitles\", ()=>addFacetCellTitles);\nparcelHelpers.export(exports, \"addFacetAxesGroupMarks\", ()=>addFacetAxesGroupMarks);\nparcelHelpers.export(exports, \"facetRowHeaderFooter\", ()=>facetRowHeaderFooter);\nparcelHelpers.export(exports, \"facetColumnHeaderFooter\", ()=>facetColumnHeaderFooter);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _scope = require(\"./scope\");\nvar _constants = require(\"./constants\");\nfunction addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n    const titleSignal = `parent[${JSON.stringify((0, _constants.FieldNames).FacetTitle)}]`;\n    const index = `datum[${JSON.stringify((0, _constants.FieldNames).Ordinal)}] - 1`;\n    const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index);\n    const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index);\n    (0, _scope.addMarks)(globalScope, col.header, row.footer);\n    (0, _scope.addMarks)(col.header, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"center\"\n                },\n                baseline: {\n                    value: \"middle\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}]}`\n                },\n                x: {\n                    signal: `${sizeSignals.layoutWidth} / 2`\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth\n                },\n                fontSize: {\n                    signal: (0, _constants.SignalNames).TextSize\n                },\n                text: {\n                    signal: titleSignal\n                }\n            }\n        }\n    });\n    (0, _scope.addMarks)(row.footer, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"left\"\n                },\n                baseline: {\n                    value: \"middle\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}]}`\n                },\n                y: {\n                    signal: `${sizeSignals.layoutHeight} / 2`\n                },\n                limit: {\n                    signal: (0, _constants.SignalNames).PlotOffsetRight\n                },\n                fontSize: {\n                    signal: (0, _constants.SignalNames).TextSize\n                },\n                text: {\n                    signal: titleSignal\n                }\n            }\n        }\n    });\n}\nfunction addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n    (0, _scope.addMarks)(scope, {\n        type: \"text\",\n        encode: {\n            enter: {\n                align: {\n                    value: \"center\"\n                },\n                baseline: {\n                    value: \"bottom\"\n                },\n                fill: {\n                    value: axisTextColor\n                }\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}]}`\n                },\n                x: {\n                    signal: `(${sizeSignals.layoutWidth}) / 2`\n                },\n                text: {\n                    signal: `parent[${JSON.stringify((0, _constants.FieldNames).FacetTitle)}]`\n                },\n                fontSize: {\n                    signal: (0, _constants.SignalNames).TextSize\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth\n                },\n                y: {\n                    signal: `-${(0, _constants.SignalNames).FacetPaddingTop} / 2`\n                }\n            }\n        }\n    });\n}\nfunction addFacetAxesGroupMarks(props) {\n    const { colSeqName , colTitleScale , globalScope , facetScope , plotScope , rowSeqName , rowTitleScale  } = props;\n    const { sizeSignals  } = facetScope;\n    const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n    const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n    const index = \"datum.data\";\n    const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index);\n    const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index);\n    (0, _scope.addData)(globalScope, colSequence, rowSequence);\n    (0, _scope.addMarks)(globalScope, col.footer, row.header);\n    (0, _scope.addScales)(globalScope, colTitleScale, rowTitleScale);\n    const map = {\n        main: [\n            {\n                scope: facetScope.facetScope,\n                lines: true,\n                labels: false,\n                title: false\n            }, \n        ],\n        x: [\n            {\n                scope: col.footer,\n                lines: true,\n                labels: true,\n                title: false\n            },\n            {\n                scope: plotScope,\n                scale: colTitleScale,\n                lines: false,\n                labels: false,\n                title: true\n            }, \n        ],\n        y: [\n            {\n                scope: row.header,\n                lines: true,\n                labels: true,\n                title: false\n            },\n            {\n                scope: plotScope,\n                scale: rowTitleScale,\n                lines: false,\n                labels: false,\n                title: true\n            }, \n        ]\n    };\n    return map;\n}\nfunction facetRowHeaderFooter(data, sizeSignals, index) {\n    const rowFn = (xSignal)=>{\n        return {\n            type: \"group\",\n            from: {\n                data\n            },\n            encode: {\n                update: {\n                    x: {\n                        signal: xSignal\n                    },\n                    y: {\n                        signal: `${(0, _constants.SignalNames).PlotOffsetTop} + ${(0, _constants.SignalNames).FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${(0, _constants.SignalNames).FacetPaddingTop} + ${(0, _constants.SignalNames).FacetPaddingBottom})`\n                    },\n                    height: {\n                        signal: sizeSignals.layoutHeight\n                    }\n                }\n            }\n        };\n    };\n    const header = rowFn((0, _constants.SignalNames).PlotOffsetLeft);\n    const footer = rowFn(`${(0, _constants.SignalNames).PlotOffsetLeft} + ${(0, _constants.SignalNames).PlotWidthOut} + ${(0, _constants.SignalNames).PlotOffsetRight} / 2`);\n    return {\n        header,\n        footer\n    };\n}\nfunction facetColumnHeaderFooter(data, sizeSignals, index) {\n    const colFn = (ySignal)=>{\n        return {\n            type: \"group\",\n            from: {\n                data\n            },\n            encode: {\n                update: {\n                    x: {\n                        signal: `(${index}) * (${sizeSignals.layoutWidth} + ${(0, _constants.SignalNames).FacetPaddingLeft}) + ${(0, _constants.SignalNames).FacetPaddingLeft} + ${(0, _constants.SignalNames).PlotOffsetLeft} - ${(0, _constants.SignalNames).FacetAxesAdjustX}`\n                    },\n                    y: {\n                        signal: `${ySignal} - ${(0, _constants.SignalNames).FacetAxesAdjustY}`\n                    },\n                    width: {\n                        signal: sizeSignals.layoutWidth\n                    }\n                }\n            }\n        };\n    };\n    //create group marks based on data sequences\n    const header = colFn(`${(0, _constants.SignalNames).PlotOffsetTop} / 2`);\n    const footer = colFn(`${(0, _constants.SignalNames).PlotOffsetTop} + ${(0, _constants.SignalNames).PlotHeightOut}`);\n    return {\n        header,\n        footer\n    };\n}\nfunction createSequence(dataName, countSignal) {\n    return {\n        name: dataName,\n        transform: [\n            {\n                type: \"sequence\",\n                start: 0,\n                stop: {\n                    signal: countSignal\n                }\n            }, \n        ]\n    };\n}\n\n},{\"./scope\":\"deG3T\",\"./constants\":\"3I5IU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cZVNs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"fill\", ()=>fill);\nparcelHelpers.export(exports, \"opacity\", ()=>opacity);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction fill(context, colorFieldName, scale) {\n    const { specColumns , insight , specViewOptions  } = context;\n    const colorColumn = specColumns.color;\n    return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n        field: (0, _expr.safeFieldName)(colorColumn.name)\n    } : {\n        scale,\n        field: colorColumn.quantitative ? (0, _expr.safeFieldName)(colorColumn.name) : colorFieldName\n    } : {\n        value: specViewOptions.colors.defaultCube\n    };\n}\nfunction opacity(context) {\n    const result = {\n        signal: (0, _constants.SignalNames).MarkOpacity\n    };\n    return result;\n}\n\n},{\"./constants\":\"3I5IU\",\"./expr\":\"7TBI4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8eLZx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"GlobalScope\", ()=>GlobalScope);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _scope = require(\"./scope\");\nclass GlobalScope {\n    constructor(props){\n        const { dataName , markGroup , scope , signals  } = props;\n        this.scope = scope;\n        this._markGroup = markGroup;\n        this.signals = signals;\n        this.data = (0, _scope.getDataByName)(scope.data, dataName).data;\n        this._markDataName = dataName;\n        this.offsets = {\n            x: \"0\",\n            y: \"0\",\n            h: (0, _constants.SignalNames).PlotHeightIn,\n            w: (0, _constants.SignalNames).PlotWidthIn\n        };\n        this.sizeSignals = {\n            layoutHeight: (0, _constants.SignalNames).PlotHeightIn,\n            layoutWidth: (0, _constants.SignalNames).PlotWidthIn\n        };\n        this.zSize = (0, _constants.SignalNames).PlotHeightIn;\n    }\n    get markDataName() {\n        return this._markDataName;\n    }\n    setMarkDataName(markDataName) {\n        this._markDataName = markDataName;\n    }\n    get markGroup() {\n        return this._markGroup;\n    }\n    setMarkGroup(markGroup) {\n        this._markGroup = markGroup;\n    }\n}\n\n},{\"./constants\":\"3I5IU\",\"./scope\":\"deG3T\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6WMRo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"layoutClasses\", ()=>layoutClasses);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _aggregateContainer = require(\"./aggregateContainer\");\nvar _aggregateSquare = require(\"./aggregateSquare\");\nvar _band = require(\"./band\");\nvar _cross = require(\"./cross\");\nvar _scatter = require(\"./scatter\");\nvar _square = require(\"./square\");\nvar _stack = require(\"./stack\");\nvar _strip = require(\"./strip\");\nvar _treemap = require(\"./treemap\");\nvar _wrap = require(\"./wrap\");\nconst layoutClasses = {\n    AggregateContainer: (0, _aggregateContainer.AggregateContainer),\n    AggregateSquare: (0, _aggregateSquare.AggregateSquare),\n    Band: (0, _band.Band),\n    Cross: (0, _cross.Cross),\n    Scatter: (0, _scatter.Scatter),\n    Square: (0, _square.Square),\n    Stack: (0, _stack.Stack),\n    Strip: (0, _strip.Strip),\n    Treemap: (0, _treemap.Treemap),\n    Wrap: (0, _wrap.Wrap)\n};\n\n},{\"./aggregateContainer\":\"bTNWm\",\"./aggregateSquare\":\"BLoBC\",\"./band\":\"j7AHg\",\"./cross\":\"IDkEt\",\"./scatter\":\"aSoBU\",\"./square\":\"3Z7xY\",\"./stack\":\"5GWVY\",\"./strip\":\"6r0rk\",\"./treemap\":\"it60v\",\"./wrap\":\"h0NOR\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bTNWm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AggregateContainer\", ()=>AggregateContainer);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nclass AggregateContainer extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const a = this.aggregation = this.getAggregation();\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            scale: `scale_${p}`,\n            extentData: `data_${p}_extent`,\n            offsets: `data_${p}_offsets`\n        };\n    }\n    getAggregateSumOp() {\n        if (this.aggregation === \"sum\") {\n            const fieldOp = {\n                field: (0, _expr.safeFieldName)(this.props.sumBy.name),\n                op: \"sum\",\n                as: (0, _constants.FieldNames).Sum\n            };\n            return fieldOp;\n        }\n    }\n    build() {\n        const { aggregation , names , props  } = this;\n        const { dock , globalScope , groupings , niceScale , parentScope , showAxes  } = props;\n        (0, _scope.addTransforms)(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, (0, _scope.getGroupBy)(groupings))), {\n            as: [\n                names.aggregateField\n            ]\n        }), {\n            type: \"extent\",\n            field: (0, _expr.safeFieldName)(names.aggregateField),\n            signal: names.globalAggregateExtentSignal\n        });\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: props.globalAggregateMaxExtentSignal,\n            update: `${names.globalAggregateExtentSignal}[1]`\n        });\n        const horizontal = dock === \"left\";\n        const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n        const offsets = {\n            x: parentScope.offsets.x,\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, dock === \"bottom\" ? groupScaled : \"\"),\n            h: horizontal ? parentScope.offsets.h : dock === \"top\" ? groupScaled : `${parentScope.offsets.h} - ${groupScaled}`,\n            w: horizontal ? groupScaled : parentScope.offsets.w\n        };\n        const scale = {\n            type: \"linear\",\n            name: names.scale,\n            domain: [\n                0,\n                {\n                    signal: props.globalAggregateMaxExtentSignal\n                }, \n            ],\n            range: horizontal ? [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutWidth\n                }, \n            ] : [\n                {\n                    signal: parentScope.sizeSignals.layoutHeight\n                },\n                0, \n            ],\n            nice: niceScale,\n            zero: true,\n            reverse: dock === \"top\"\n        };\n        const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: props.globalAggregateMaxExtentScaledSignal,\n            update: dock === \"bottom\" ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}` : globalAggregateMaxExtentScaledValue\n        });\n        return {\n            offsets,\n            sizeSignals: horizontal ? {\n                layoutHeight: parentScope.sizeSignals.layoutHeight,\n                layoutWidth: null\n            } : {\n                layoutHeight: null,\n                layoutWidth: parentScope.sizeSignals.layoutWidth\n            },\n            globalScales: {\n                showAxes,\n                scales: {\n                    x: horizontal ? [\n                        scale\n                    ] : undefined,\n                    y: horizontal ? undefined : [\n                        scale\n                    ]\n                }\n            },\n            encodingRuleMap: horizontal ? {\n                x: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: parentScope.offsets.x\n                    }\n                ],\n                width: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ]\n            } : {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: dock === \"top\" ? parentScope.offsets.y : (0, _scope.addOffsets)(parentScope.offsets.y, parentScope.offsets.h)\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n    getTransforms(aggregation, groupby) {\n        const trans = {\n            type: \"joinaggregate\",\n            groupby: groupby.map((0, _expr.safeFieldName)),\n            ops: [\n                aggregation\n            ]\n        };\n        if (aggregation === \"sum\") trans.fields = [\n            this.props.sumBy.name\n        ].map((0, _expr.safeFieldName));\n        return trans;\n    }\n    getAggregation() {\n        const { props  } = this;\n        let s;\n        if (props.dock === \"left\") s = props.axesScales.x;\n        else s = props.axesScales.y;\n        switch(s.aggregate){\n            case \"sum\":\n                return \"sum\";\n            default:\n                return \"count\";\n        }\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../constants\":\"3I5IU\",\"../expr\":\"7TBI4\",\"../scope\":\"deG3T\",\"../selection\":\"a3WxW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jBcoW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"Layout\", ()=>Layout);\nclass Layout {\n    constructor(props){\n        this.props = props;\n        this.id = props.id;\n    }\n    getGrouping() {\n        return null;\n    }\n    getAggregateSumOp() {\n        return null;\n    }\n    build() {\n        throw \"Not implemented\";\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a3WxW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"testForCollapseSelection\", ()=>testForCollapseSelection);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nfunction testForCollapseSelection() {\n    return `datum.${(0, _constants.FieldNames).Collapsed}`;\n}\n\n},{\"./constants\":\"3I5IU\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"BLoBC\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"AggregateSquare\", ()=>AggregateSquare);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nclass AggregateSquare extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const a = this.props.aggregation;\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            extentData: `data_${p}_extent`\n        };\n    }\n    build() {\n        const { names , props  } = this;\n        const { aggregation , globalScope , groupings , onBuild , parentScope  } = props;\n        const { sizeSignals  } = parentScope;\n        (0, _scope.addTransforms)(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, (0, _scope.getGroupBy)(groupings))), {\n            as: [\n                names.aggregateField\n            ]\n        }), {\n            type: \"extent\",\n            field: (0, _expr.safeFieldName)(names.aggregateField),\n            signal: names.globalAggregateExtentSignal\n        });\n        const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n        const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n        const squareMaxArea = `(${[\n            squareMaxSide,\n            squareMaxSide\n        ].join(\" * \")})`;\n        const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n        const squareArea = `(${[\n            squareMaxArea,\n            shrinkRatio\n        ].join(\" * \")})`;\n        const squareSide = `sqrt(${squareArea})`;\n        const localAggregateMaxExtentScaled = squareSide;\n        onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n        const offsets = {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n            h: squareSide,\n            w: squareSide\n        };\n        return {\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: offsets.y\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n    getTransforms(aggregation, groupby) {\n        const trans = {\n            type: \"joinaggregate\",\n            groupby: groupby.map((0, _expr.safeFieldName)),\n            ops: [\n                aggregation\n            ]\n        };\n        if (aggregation === \"sum\") trans.fields = [\n            this.props.sumBy.name\n        ].map((0, _expr.safeFieldName));\n        return trans;\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../expr\":\"7TBI4\",\"../scope\":\"deG3T\",\"../selection\":\"a3WxW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"j7AHg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"bandScaleLinearSuffix\", ()=>bandScaleLinearSuffix);\nparcelHelpers.export(exports, \"Band\", ()=>Band);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _bin = require(\"../bin\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _signals = require(\"../signals\");\nvar _scales = require(\"../scales\");\nconst bandScaleLinearSuffix = \"_linear\";\nclass Band extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `band_${this.id}`;\n        this.names = {\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            bandWidth: `${p}_bandwidth`,\n            accumulative: `${p}_accumulative`\n        };\n        this.bin = (0, _bin.binnable)(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n    }\n    getGrouping() {\n        return this.bin.fields;\n    }\n    build() {\n        const { bin , names , props  } = this;\n        const { globalScope , minBandWidth , orientation , parentScope , showAxes  } = props;\n        const binField = bin.fields[0];\n        if (bin.native === false) {\n            (0, _scope.addSignals)(globalScope.scope, ...bin.signals);\n            (0, _scope.addTransforms)(globalScope.data, ...bin.transforms);\n            (0, _scope.addData)(globalScope.scope, bin.dataSequence);\n        }\n        //TODO don't add this, use existing dataset\n        (0, _scope.addData)(globalScope.scope, {\n            name: names.accumulative,\n            source: bin.fullScaleDataname,\n            transform: [\n                {\n                    type: \"aggregate\",\n                    groupby: this.getGrouping().map((0, _expr.safeFieldName)),\n                    ops: [\n                        \"count\"\n                    ]\n                }, \n            ]\n        });\n        const horizontal = orientation === \"horizontal\";\n        const minCellSignal = horizontal ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n        (0, _signals.modifySignal)(minCellSignal, \"max\", `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: names.bandWidth,\n            update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`\n        });\n        const scale = this.getScale(bin, horizontal);\n        if (props.outerSignalExtents && bin.native === false) //add a linear scale for use by background image\n        (0, _scope.addScales)(globalScope.scope, (0, _scales.linearScale)(scale.name + bandScaleLinearSuffix, {\n            signal: bin.extentSignal\n        }, scale.range, scale.reverse, false, false));\n        let encodingRuleMap;\n        if (!props.excludeEncodingRuleMap) encodingRuleMap = horizontal ? {\n            x: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    signal: parentScope.offsets.x\n                }, \n            ],\n            width: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                }, \n            ]\n        } : {\n            y: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    signal: (0, _scope.addOffsets)(parentScope.offsets.y, parentScope.offsets.h)\n                }, \n            ],\n            height: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                }, \n            ]\n        };\n        return {\n            offsets: this.getOffset(horizontal, binField),\n            sizeSignals: horizontal ? {\n                layoutHeight: names.bandWidth,\n                layoutWidth: parentScope.sizeSignals.layoutWidth\n            } : {\n                layoutHeight: parentScope.sizeSignals.layoutHeight,\n                layoutWidth: names.bandWidth\n            },\n            globalScales: {\n                showAxes,\n                scales: {\n                    x: horizontal ? undefined : [\n                        scale\n                    ],\n                    y: horizontal ? [\n                        scale\n                    ] : undefined\n                }\n            },\n            encodingRuleMap\n        };\n    }\n    getOffset(horizontal, binField) {\n        const { names , props  } = this;\n        const { parentScope  } = props;\n        return {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, horizontal ? \"\" : `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, horizontal ? `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])` : \"\"),\n            h: horizontal ? names.bandWidth : parentScope.offsets.h,\n            w: horizontal ? parentScope.offsets.w : names.bandWidth\n        };\n    }\n    getScale(bin, horizontal) {\n        const { names  } = this;\n        const { parentScope  } = this.props;\n        const binField = (0, _expr.safeFieldName)(bin.fields[0]);\n        let bandScale;\n        if (horizontal) bandScale = {\n            type: \"band\",\n            name: names.yScale,\n            range: [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutHeight\n                }, \n            ],\n            padding: 0.1,\n            domain: {\n                data: bin.domainDataName,\n                field: binField,\n                sort: true\n            },\n            reverse: true\n        };\n        else bandScale = {\n            type: \"band\",\n            name: names.xScale,\n            range: [\n                0,\n                {\n                    signal: parentScope.sizeSignals.layoutWidth\n                }, \n            ],\n            padding: 0.1,\n            domain: {\n                data: bin.domainDataName,\n                field: binField,\n                sort: true\n            }\n        };\n        return bandScale;\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../bin\":\"9Oj9O\",\"../expr\":\"7TBI4\",\"../scope\":\"deG3T\",\"../selection\":\"a3WxW\",\"../signals\":\"6xNUg\",\"../scales\":\"hjH4p\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9Oj9O\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"binnable\", ()=>binnable);\nparcelHelpers.export(exports, \"outerExtentSignal\", ()=>outerExtentSignal);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nvar _defaults = require(\"./defaults\");\nvar _transforms = require(\"./transforms\");\nfunction binnable(prefix, domainDataName, discreteColumn, outerSignalExtents) {\n    const { column , defaultBins , maxbins , maxbinsSignalDisplayName , maxbinsSignalName  } = discreteColumn;\n    if (column.quantitative) {\n        const field = `${prefix}_bin_${(0, _expr.exprSafeFieldName)(column.name)}`;\n        const fieldEnd = `${field}_end`;\n        const binSignal = `${field}_bins`;\n        const dataExtentSignal = `${field}_bin_extent`;\n        const outerSignal = `${field}_outer_extent`;\n        domainDataName = `${field}_sequence`; //override the data name\n        const extentTransform = (0, _transforms.dataExtent)(column, dataExtentSignal);\n        let imageSignal;\n        if (outerSignalExtents) imageSignal = outerExtentSignal(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n        const maxbinsSignal = {\n            name: maxbinsSignalName,\n            value: defaultBins,\n            bind: {\n                name: maxbinsSignalDisplayName,\n                debounce: (0, _defaults.debounce),\n                input: \"range\",\n                min: 1,\n                max: maxbins,\n                step: 1\n            }\n        };\n        const extentSignal = (imageSignal === null || imageSignal === void 0 ? void 0 : imageSignal.name) || dataExtentSignal;\n        const binTransform = {\n            type: \"bin\",\n            field: (0, _expr.safeFieldName)(column.name),\n            as: [\n                field,\n                fieldEnd, \n            ],\n            signal: binSignal,\n            extent: {\n                signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`\n            },\n            maxbins: {\n                signal: maxbinsSignalName\n            }\n        };\n        const dataSequence = {\n            name: domainDataName,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: {\n                        signal: `${binSignal}.start`\n                    },\n                    stop: {\n                        signal: `${binSignal}.stop`\n                    },\n                    step: {\n                        signal: `${binSignal}.step`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.data\",\n                    as: field\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data + ${binSignal}.step`,\n                    as: fieldEnd\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"row_number\"\n                    ],\n                    as: [\n                        (0, _constants.FieldNames).Ordinal\n                    ]\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data === ${binSignal}.start`,\n                    as: (0, _constants.FieldNames).First\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                    as: (0, _constants.FieldNames).Last\n                }, \n            ]\n        };\n        const signals = [\n            maxbinsSignal\n        ];\n        if (imageSignal) signals.push(imageSignal);\n        const augmentBinnable = {\n            discreteColumn,\n            native: false,\n            transforms: [\n                extentTransform,\n                binTransform\n            ],\n            fields: [\n                field,\n                fieldEnd\n            ],\n            binSignal,\n            extentSignal,\n            dataSequence,\n            domainDataName,\n            signals,\n            fullScaleDataname: dataSequence.name\n        };\n        return augmentBinnable;\n    } else {\n        const nativeBinnable = {\n            discreteColumn,\n            native: true,\n            fields: [\n                column.name\n            ],\n            domainDataName,\n            fullScaleDataname: domainDataName\n        };\n        return nativeBinnable;\n    }\n}\nfunction outerExtentSignal(name, min, max, dataExtent) {\n    return {\n        name,\n        update: `[min(${min}, ${dataExtent}[0]), max(${max}, ${dataExtent}[1])]`\n    };\n}\n\n},{\"./constants\":\"3I5IU\",\"./expr\":\"7TBI4\",\"./defaults\":\"5kAFI\",\"./transforms\":\"bWcDn\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bWcDn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"dataExtent\", ()=>dataExtent);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _expr = require(\"./expr\");\nfunction dataExtent(column, signal) {\n    return {\n        type: \"extent\",\n        field: (0, _expr.safeFieldName)(column.name),\n        signal\n    };\n}\n\n},{\"./expr\":\"7TBI4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"IDkEt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Cross\", ()=>Cross);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _bin = require(\"../bin\");\nvar _constants = require(\"../constants\");\nvar _facetSearch = require(\"../facetSearch\");\nvar _facetTitle = require(\"../facetTitle\");\nvar _ordinal = require(\"../ordinal\");\nvar _scope = require(\"../scope\");\nvar _signals = require(\"../signals\");\nclass Cross extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `cross_${this.id}`;\n        this.binX = (0, _bin.binnable)(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n        this.binY = (0, _bin.binnable)(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n        this.names = {\n            facetDataName: `data_${p}_facet`,\n            searchUnion: `data_${p}_search`,\n            dimScale: `scale_${p}`,\n            dimCount: `${p}_count`,\n            dimCategorical: `data_${p}_cat`,\n            dimCellSize: `${p}_cell_size`,\n            dimCellSizeCalc: `${p}_cell_calc`\n        };\n    }\n    getGrouping() {\n        return this.binX.fields.concat(this.binY.fields);\n    }\n    build() {\n        const { binX , binY , names , prefix , props  } = this;\n        const { axisTextColor , colRowTitles , globalScope , parentScope  } = props;\n        const titles = {\n            x: {\n                dataName: null,\n                quantitative: null\n            },\n            y: {\n                dataName: null,\n                quantitative: null\n            }\n        };\n        const dx = {\n            dim: \"x\",\n            bin: binX,\n            sortOrder: \"ascending\",\n            size: parentScope.sizeSignals.layoutWidth,\n            layout: parentScope.sizeSignals.layoutWidth,\n            min: globalScope.signals.minCellWidth.name,\n            out: globalScope.signals.plotWidthOut,\n            offset: (0, _constants.SignalNames).FacetPaddingLeft,\n            padding: (0, _constants.SignalNames).FacetPaddingLeft,\n            dataOut: null,\n            scaleName: null,\n            position: null\n        };\n        const dy = {\n            dim: \"y\",\n            bin: binY,\n            sortOrder: \"ascending\",\n            size: parentScope.sizeSignals.layoutHeight,\n            layout: parentScope.sizeSignals.layoutHeight,\n            min: globalScope.signals.minCellHeight.name,\n            out: globalScope.signals.plotHeightOut,\n            offset: (0, _constants.SignalNames).FacetPaddingTop,\n            padding: `(${(0, _constants.SignalNames).FacetPaddingTop} + ${(0, _constants.SignalNames).FacetPaddingBottom})`,\n            dataOut: null,\n            scaleName: null,\n            position: null\n        };\n        const dimensions = [\n            dx,\n            dy\n        ];\n        dimensions.forEach((d)=>{\n            const { bin , dim , padding , sortOrder  } = d;\n            let data;\n            let dataName;\n            let countSignal;\n            let scale;\n            const titleSource = titles[dim];\n            if (bin.native === false) {\n                (0, _scope.addSignals)(globalScope.scope, ...bin.signals);\n                (0, _scope.addTransforms)(globalScope.data, ...bin.transforms);\n                (0, _scope.addData)(globalScope.scope, bin.dataSequence);\n                (0, _scope.addTransforms)(bin.dataSequence, {\n                    type: \"formula\",\n                    expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                    as: (0, _constants.FieldNames).Contains\n                });\n                data = bin.dataSequence;\n                dataName = bin.dataSequence.name;\n                countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                scale = (0, _ordinal.ordinalScale)(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                titleSource.dataName = bin.dataSequence.name;\n            } else {\n                dataName = globalScope.markDataName;\n                const ord = (0, _ordinal.createOrdinals)(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                data = ord.data;\n                (0, _scope.addData)(globalScope.scope, ord.data);\n                countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                scale = ord.scale;\n                titleSource.dataName = ord.data.name;\n            }\n            titleSource.quantitative = bin.discreteColumn.column.quantitative;\n            d.dataOut = data;\n            d.scaleName = scale.name;\n            (0, _scope.addTransforms)(data, {\n                type: \"formula\",\n                expr: (0, _facetSearch.serializeAsVegaExpression)(bin, (0, _constants.FieldNames).First, (0, _constants.FieldNames).Last),\n                as: (0, _constants.FieldNames).FacetSearch\n            }, {\n                type: \"formula\",\n                expr: (0, _facetSearch.displayBin)(bin),\n                as: (0, _constants.FieldNames).FacetTitle\n            });\n            (0, _scope.addScales)(globalScope.scope, scale);\n            const count = `${names.dimCount}_${dim}`;\n            const calc = `${names.dimCellSizeCalc}_${dim}`;\n            const size = `${names.dimCellSize}_${dim}`;\n            (0, _scope.addSignals)(globalScope.scope, {\n                name: count,\n                update: countSignal\n            });\n            (0, _scope.addSignals)(globalScope.scope, {\n                name: calc,\n                update: `${d.layout} / ${count}`\n            }, {\n                name: size,\n                update: `max(${d.min}, (${calc} - ${padding}))`\n            });\n            (0, _signals.modifySignal)(d.out, \"max\", `((${size} + ${padding}) * ${count})`);\n            d.position = this.dimensionOffset(d);\n        });\n        const groupRow = {\n            type: \"group\",\n            encode: {\n                update: {\n                    y: {\n                        signal: dy.position\n                    }\n                }\n            },\n            from: {\n                data: dy.dataOut.name\n            },\n            data: [\n                {\n                    name: names.searchUnion,\n                    source: dx.dataOut.name,\n                    transform: [\n                        {\n                            type: \"formula\",\n                            expr: `[datum[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}], merge(parent[${JSON.stringify((0, _constants.FieldNames).FacetSearch)}], { clause: '&&'})]`,\n                            as: (0, _constants.FieldNames).FacetSearch\n                        }, \n                    ]\n                }, \n            ]\n        };\n        const groupCol = {\n            style: \"cell\",\n            name: prefix,\n            type: \"group\",\n            encode: {\n                update: {\n                    height: {\n                        signal: `${names.dimCellSize}_y`\n                    },\n                    width: {\n                        signal: `${names.dimCellSize}_x`\n                    },\n                    x: {\n                        signal: dx.position\n                    }\n                }\n            },\n            from: {\n                data: names.searchUnion\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, groupRow);\n        (0, _scope.addMarks)(groupRow, groupCol);\n        const offsets = {\n            x: this.dimensionOffset(dx),\n            y: this.dimensionOffset(dy),\n            h: `${names.dimCellSize}_y`,\n            w: `${names.dimCellSize}_x`\n        };\n        const sizeSignals = {\n            layoutHeight: `${names.dimCellSize}_y`,\n            layoutWidth: `${names.dimCellSize}_x`,\n            colCount: `${names.dimCount}_x`,\n            rowCount: `${names.dimCount}_y`\n        };\n        if (colRowTitles) (0, _facetTitle.addFacetColRowTitles)(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n        return {\n            facetScope: groupCol,\n            offsets,\n            sizeSignals,\n            titles\n        };\n    }\n    dimensionOffset(d) {\n        const { names  } = this;\n        return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../bin\":\"9Oj9O\",\"../constants\":\"3I5IU\",\"../facetSearch\":\"fnVov\",\"../facetTitle\":\"k14Ax\",\"../ordinal\":\"l9Svf\",\"../scope\":\"deG3T\",\"../signals\":\"6xNUg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fnVov\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"displayBin\", ()=>displayBin);\nparcelHelpers.export(exports, \"serializeAsVegaExpression\", ()=>serializeAsVegaExpression);\nfunction displayBin(bin) {\n    const val = (index)=>`datum[${JSON.stringify(bin.fields[index])}]`;\n    return bin.discreteColumn.column.quantitative ? `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')` : val(0);\n}\nfunction obj(nameValues, clause) {\n    if (clause) nameValues = [\n        clause,\n        ...nameValues\n    ];\n    return `{${nameValues.join()}}`;\n}\nfunction serializeAsVegaExpression(bin, firstFieldName, lastFieldName, clause) {\n    if (bin.discreteColumn.column.quantitative) {\n        const low = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'>='\",\n            `value:datum[${JSON.stringify(bin.fields[0])}]`, \n        ];\n        const high = [\n            \"clause:'&&'\",\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'<'\",\n            `value:datum[${JSON.stringify(bin.fields[1])}]`, \n        ];\n        return obj([\n            `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`, \n        ], clause);\n    } else {\n        const exact = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            \"operator:'=='\",\n            `value:datum[${JSON.stringify(bin.fields[0])}]`, \n        ];\n        return obj([\n            `expressions:[${obj(exact)}]`, \n        ], clause);\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"l9Svf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createOrdinals\", ()=>createOrdinals);\nparcelHelpers.export(exports, \"ordinalScale\", ()=>ordinalScale);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _expr = require(\"./expr\");\nfunction createOrdinals(source, prefix, binFields, sortOrder) {\n    const _binFields = binFields.map((0, _expr.safeFieldName));\n    const dataName = `${prefix}_bin_order`;\n    const data = {\n        name: dataName,\n        source,\n        transform: [\n            {\n                type: \"aggregate\",\n                groupby: _binFields\n            },\n            {\n                type: \"collect\",\n                sort: {\n                    field: _binFields,\n                    order: _binFields.map((f)=>sortOrder)\n                }\n            },\n            {\n                type: \"window\",\n                ops: [\n                    \"row_number\"\n                ],\n                as: [\n                    (0, _constants.FieldNames).Ordinal\n                ]\n            }, \n        ]\n    };\n    return {\n        data,\n        scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields)\n    };\n}\nfunction ordinalScale(dataName, scaleName, binFields) {\n    return {\n        type: \"ordinal\",\n        name: scaleName,\n        domain: {\n            data: dataName,\n            field: (0, _expr.safeFieldName)(binFields[0])\n        },\n        range: {\n            data: dataName,\n            field: (0, _constants.FieldNames).Ordinal\n        }\n    };\n}\n\n},{\"./constants\":\"3I5IU\",\"./expr\":\"7TBI4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aSoBU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Scatter\", ()=>Scatter);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _defaults = require(\"../defaults\");\nvar _expr = require(\"../expr\");\nvar _scales = require(\"../scales\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _transforms = require(\"../transforms\");\nvar _bin = require(\"../bin\");\nclass Scatter extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `scatter_${this.id}`;\n        this.names = {\n            aggregateData: `data_${p}_aggregate`,\n            markData: `data_${p}_mark`,\n            xDataExtent: `${p}_xDataExtent`,\n            yDataExtent: `${p}_yDataExtent`,\n            xExtent: `${p}_xExtent`,\n            yExtent: `${p}_yExtent`,\n            sizeExtent: `${p}_sizeExtent`,\n            sizeRange: `${p}_sizeRange`,\n            sizeScale: `${p}_sizeScale`,\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names , prefix , props  } = this;\n        const { backgroundImageExtents , globalScope , parentScope , scatterPointScaleDisplay , showAxes , size , x , y , z , zGrounded  } = props;\n        const qsize = size && size.quantitative && size;\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: (0, _constants.SignalNames).PointScale,\n            value: 5,\n            bind: {\n                name: scatterPointScaleDisplay,\n                debounce: (0, _defaults.debounce),\n                input: \"range\",\n                min: 1,\n                max: 10,\n                step: 1\n            }\n        }, {\n            name: (0, _constants.SignalNames).ZGrounded,\n            value: false,\n            bind: {\n                name: zGrounded,\n                input: \"checkbox\"\n            }\n        });\n        if (backgroundImageExtents) {\n            (0, _scope.addTransforms)(globalScope.data, (0, _transforms.dataExtent)(x, names.xDataExtent), (0, _transforms.dataExtent)(y, names.yDataExtent));\n            const xSignal = (0, _bin.outerExtentSignal)(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n            const ySignal = (0, _bin.outerExtentSignal)(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n            (0, _scope.addSignals)(globalScope.scope, xSignal, ySignal);\n        }\n        if (qsize) {\n            (0, _scope.addTransforms)(globalScope.data, {\n                type: \"extent\",\n                field: (0, _expr.safeFieldName)(qsize.name),\n                signal: names.sizeExtent\n            });\n            (0, _scope.addScales)(globalScope.scope, {\n                name: names.sizeScale,\n                type: \"linear\",\n                domain: [\n                    0,\n                    {\n                        signal: `${names.sizeExtent}[1]`\n                    }\n                ],\n                range: [\n                    0,\n                    {\n                        signal: names.sizeRange\n                    }\n                ]\n            });\n            (0, _scope.addSignals)(globalScope.scope, {\n                name: names.sizeRange,\n                update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${(0, _defaults.scatterSizedDiv)}`\n            });\n        }\n        (0, _scope.addData)(globalScope.scope, {\n            name: names.markData,\n            source: globalScope.markDataName,\n            transform: [\n                x,\n                y,\n                z\n            ].map((c)=>{\n                if (!c || !c.quantitative) return;\n                const t = {\n                    type: \"filter\",\n                    expr: `isValid(datum[${JSON.stringify(c.name)}])`\n                };\n                return t;\n            }).filter(Boolean)\n        });\n        globalScope.setMarkDataName(names.markData);\n        const globalScales = {\n            showAxes,\n            scales: {}\n        };\n        const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n        const sizeValueSignal = qsize ? `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${(0, _constants.SignalNames).PointScale}` : (0, _constants.SignalNames).PointScale;\n        const update = Object.assign({\n            height: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                },\n                {\n                    signal: sizeValueSignal\n                }, \n            ],\n            width: {\n                signal: sizeValueSignal\n            }\n        }, z && {\n            z: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                },\n                {\n                    signal: `${(0, _constants.SignalNames).ZGrounded} ? 0 : ${zValue}`\n                }, \n            ],\n            depth: [\n                {\n                    test: (0, _selection.testForCollapseSelection)(),\n                    value: 0\n                },\n                {\n                    signal: `${(0, _constants.SignalNames).ZGrounded} ? ${zValue} : ${sizeValueSignal}`\n                }, \n            ]\n        });\n        const columnSignals = [\n            {\n                column: x,\n                xyz: \"x\",\n                scaleName: names.xScale,\n                domain: backgroundImageExtents ? {\n                    signal: names.xExtent\n                } : {\n                    data: globalScope.data.name,\n                    field: (0, _expr.safeFieldName)(x.name)\n                },\n                reverse: false,\n                signal: parentScope.sizeSignals.layoutWidth\n            },\n            {\n                column: y,\n                xyz: \"y\",\n                scaleName: names.yScale,\n                domain: backgroundImageExtents ? {\n                    signal: names.yExtent\n                } : {\n                    data: globalScope.data.name,\n                    field: (0, _expr.safeFieldName)(y.name)\n                },\n                reverse: true,\n                signal: parentScope.sizeSignals.layoutHeight\n            },\n            {\n                column: z,\n                xyz: \"z\",\n                scaleName: names.zScale,\n                domain: {\n                    data: globalScope.data.name,\n                    field: z ? (0, _expr.safeFieldName)(z.name) : null\n                },\n                reverse: false,\n                signal: `(${globalScope.zSize}) * ${(0, _constants.SignalNames).ZProportion}`\n            }, \n        ];\n        columnSignals.forEach((cs)=>{\n            const { column , domain , reverse , scaleName , signal , xyz  } = cs;\n            if (!column) return;\n            let scale;\n            if (column.quantitative) scale = (0, _scales.linearScale)(scaleName, domain, [\n                0,\n                {\n                    signal\n                }\n            ], reverse, false, showAxes);\n            else scale = (0, _scales.pointScale)(scaleName, globalScope.data.name, [\n                0,\n                {\n                    signal\n                }\n            ], column.name, reverse);\n            globalScales.scales[xyz] = [\n                scale\n            ];\n        });\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, mark);\n        return {\n            offsets: {\n                x: (0, _scope.addOffsets)(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                y: (0, _scope.addOffsets)(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                h: sizeValueSignal,\n                w: sizeValueSignal\n            },\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            globalScales,\n            mark,\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: (0, _scope.addOffsets)(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight)\n                    }, \n                ]\n            }\n        };\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../constants\":\"3I5IU\",\"../defaults\":\"5kAFI\",\"../expr\":\"7TBI4\",\"../scales\":\"hjH4p\",\"../scope\":\"deG3T\",\"../selection\":\"a3WxW\",\"../transforms\":\"bWcDn\",\"../bin\":\"9Oj9O\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3Z7xY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Square\", ()=>Square);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _zBase = require(\"../zBase\");\nclass Square extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `square_${this.id}`;\n        this.names = {\n            bandWidth: this.getBandWidth(),\n            maxGroupField: `${p}_max_group`,\n            maxGroupSignal: `${p}_max_grouping`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names , prefix , props  } = this;\n        const { fillDirection , globalScope , groupings , parentScope , collapseYHeight , showAxes , sortBy , z  } = props;\n        const zScale = (0, _zBase.addZScale)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        (0, _scope.addTransforms)(globalScope.data, Object.assign({\n            type: \"stack\",\n            groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName)),\n            as: [\n                names.stack0,\n                names.stack1\n            ]\n        }, sortBy && {\n            sort: {\n                field: (0, _expr.safeFieldName)(sortBy.name),\n                order: \"ascending\"\n            }\n        }));\n        const { gap , levelSize , size , squaresPerBand  } = this.addSignals();\n        const heightSignal = {\n            signal: fillDirection === \"down-right\" ? size : levelSize\n        };\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    height: collapseYHeight ? [\n                        {\n                            test: (0, _selection.testForCollapseSelection)(),\n                            value: 0\n                        },\n                        heightSignal, \n                    ] : heightSignal,\n                    width: {\n                        signal: fillDirection === \"down-right\" ? levelSize : size\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, _selection.testForCollapseSelection)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, _expr.safeFieldName)(z.name)\n                        }, \n                    ]\n                })\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, mark);\n        const { tx , ty  } = this.transformXY(gap, levelSize, squaresPerBand);\n        return Object.assign(Object.assign(Object.assign({}, z && {\n            globalScales: {\n                showAxes,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            }\n        }), {\n            offsets: {\n                x: (0, _scope.addOffsets)(parentScope.offsets.x, tx.expr),\n                y: (0, _scope.addOffsets)(parentScope.offsets.y, ty.expr),\n                h: size,\n                w: size\n            },\n            mark,\n            sizeSignals: {\n                layoutHeight: size,\n                layoutWidth: size\n            }\n        }), collapseYHeight && {\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: parentScope.offsets.y\n                    }, \n                ]\n            }\n        });\n    }\n    getBandWidth() {\n        const { offsets  } = this.props.parentScope;\n        switch(this.props.fillDirection){\n            case \"down-right\":\n                return offsets.h;\n            default:\n                return offsets.w;\n        }\n    }\n    addSignals() {\n        const { names , props  } = this;\n        const { fillDirection , globalScope , groupings , parentScope  } = props;\n        let { maxGroupedFillSize , maxGroupedUnits  } = props;\n        if (!maxGroupedUnits) {\n            if (groupings) {\n                (0, _scope.addTransforms)(globalScope.data, {\n                    type: \"joinaggregate\",\n                    groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName)),\n                    ops: [\n                        \"count\"\n                    ],\n                    as: [\n                        names.maxGroupField\n                    ]\n                }, {\n                    type: \"extent\",\n                    field: names.maxGroupField,\n                    signal: names.maxGroupSignal\n                });\n                maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n            } else maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n        }\n        if (!maxGroupedFillSize) maxGroupedFillSize = fillDirection === \"down-right\" ? parentScope.offsets.w : parentScope.offsets.h;\n        const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n        const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n        const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n        const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n        const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n        const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n        return {\n            gap,\n            levelSize,\n            size,\n            squaresPerBand\n        };\n    }\n    transformXY(gap, levelSize, squaresPerBand) {\n        const { names , prefix  } = this;\n        const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n        const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n        const { fillDirection , parentScope  } = this.props;\n        const tx = {\n            type: \"formula\",\n            expr: null,\n            as: `${prefix}_${(0, _constants.FieldNames).OffsetX}`\n        };\n        const ty = {\n            type: \"formula\",\n            expr: null,\n            as: `${prefix}_${(0, _constants.FieldNames).OffsetY}`\n        };\n        switch(fillDirection){\n            case \"down-right\":\n                tx.expr = `${level} * (${levelSize} + ${gap})`;\n                ty.expr = compartment;\n                break;\n            case \"right-up\":\n                tx.expr = compartment;\n                ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                break;\n            case \"right-down\":\n            default:\n                tx.expr = compartment;\n                ty.expr = `${level} * (${levelSize} + ${gap})`;\n                break;\n        }\n        return {\n            tx,\n            ty\n        };\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../constants\":\"3I5IU\",\"../expr\":\"7TBI4\",\"../scope\":\"deG3T\",\"../selection\":\"a3WxW\",\"../zBase\":\"9NSN1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9NSN1\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"addZScale\", ()=>addZScale);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _scales = require(\"./scales\");\nvar _expr = require(\"./expr\");\nfunction addZScale(z, zSize, dataName, zScaleName) {\n    if (z) {\n        const zRange = [\n            0,\n            {\n                signal: `(${zSize}) * ${(0, _constants.SignalNames).ZProportion}`\n            }\n        ];\n        const scale = z.quantitative ? (0, _scales.linearScale)(zScaleName, {\n            data: dataName,\n            field: (0, _expr.safeFieldName)(z.name)\n        }, zRange, false, true) : (0, _scales.pointScale)(zScaleName, dataName, zRange, z.name, false);\n        return scale;\n    }\n}\n\n},{\"./constants\":\"3I5IU\",\"./scales\":\"hjH4p\",\"./expr\":\"7TBI4\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5GWVY\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Stack\", ()=>Stack);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nclass Stack extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `stack_${this.id}`;\n        this.names = {\n            cube: `${p}_cube`,\n            globalDataName: `data_${p}_count`,\n            globalExtent: `${p}_global_extent`,\n            levelDataName: `data_${p}_level`,\n            count: `${p}_count`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            sequence: `data_${p}_sequence`,\n            sides: `${p}_sides`,\n            size: `${p}_size`,\n            squared: `${p}_squared`,\n            maxCount: `${p}_maxCount`,\n            maxLevels: `${p}_maxLevels`,\n            zScale: `${p}_zScale`\n        };\n    }\n    build() {\n        const { names , props  } = this;\n        const { globalScope , groupings , parentScope , showAxes , sort  } = props;\n        const { sizeSignals  } = parentScope;\n        (0, _scope.addTransforms)(globalScope.data, {\n            type: \"joinaggregate\",\n            groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName)),\n            ops: [\n                \"count\"\n            ],\n            as: [\n                names.count\n            ]\n        }, {\n            type: \"extent\",\n            field: names.count,\n            signal: names.globalExtent\n        }, Object.assign({\n            type: \"stack\",\n            groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName)),\n            as: [\n                names.stack0,\n                names.stack1\n            ]\n        }, sort && {\n            sort: {\n                field: (0, _expr.safeFieldName)(sort.name),\n                order: \"ascending\"\n            }\n        }));\n        (0, _scope.addData)(globalScope.scope, {\n            name: names.sequence,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: 1,\n                    stop: {\n                        signal: `sqrt(${names.globalExtent}[1])`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.data * datum.data\",\n                    as: \"squared\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                    as: \"maxlevels\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                    as: \"side\"\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.side * datum.maxlevels + datum.maxlevels - 1\",\n                    as: \"sidecubeheight\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                    as: \"heightmatch\"\n                },\n                {\n                    type: \"collect\",\n                    sort: {\n                        field: \"heightmatch\",\n                        order: \"ascending\"\n                    }\n                },\n                {\n                    type: \"window\",\n                    ops: [\n                        \"row_number\"\n                    ]\n                },\n                {\n                    type: \"filter\",\n                    expr: \"datum.row_number === 1\"\n                }, \n            ]\n        });\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: names.size,\n            update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`\n        }, {\n            name: names.squared,\n            update: `data('${names.sequence}')[0].squared`\n        }, {\n            name: names.sides,\n            update: `sqrt(${names.squared})`\n        }, {\n            name: names.cube,\n            update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`\n        }, {\n            name: names.maxLevels,\n            update: `data('${names.sequence}')[0].maxlevels`\n        }, {\n            name: names.maxCount,\n            update: `${names.maxLevels} * ${names.squared}`\n        });\n        const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n        const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n        const cubeX = `(${layerOrdinal} % ${names.sides})`;\n        const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n        const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n        const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n        const offsets = {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n            h: names.size,\n            w: names.size\n        };\n        const mark = {\n            type: \"rect\",\n            from: {\n                data: this.names.levelDataName\n            },\n            encode: {\n                update: {\n                    z: {\n                        signal: `${zLevel} * (${names.cube} + 1)`\n                    },\n                    height: {\n                        signal: names.cube\n                    },\n                    width: {\n                        signal: names.cube\n                    },\n                    depth: {\n                        signal: names.cube\n                    }\n                }\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, mark);\n        const zScale = {\n            type: \"linear\",\n            name: names.zScale,\n            domain: [\n                0,\n                {\n                    signal: names.maxCount\n                }, \n            ],\n            range: [\n                0,\n                {\n                    signal: `${names.maxLevels} * (${names.cube} + 1) - 1`\n                }, \n            ],\n            nice: false\n        };\n        return {\n            offsets,\n            mark,\n            sizeSignals: {\n                layoutHeight: names.size,\n                layoutWidth: names.size\n            },\n            globalScales: {\n                showAxes,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            },\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        signal: parentScope.offsets.y\n                    }\n                ],\n                z: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ],\n                depth: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ],\n                height: [\n                    {\n                        test: (0, _selection.testForCollapseSelection)(),\n                        value: 0\n                    }\n                ]\n            }\n        };\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../expr\":\"7TBI4\",\"../scope\":\"deG3T\",\"../selection\":\"a3WxW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6r0rk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Strip\", ()=>Strip);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _zBase = require(\"../zBase\");\nclass Strip extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `strip_${this.id}`;\n        this.names = {\n            firstField: `${p}${(0, _constants.FieldNames).First}`,\n            lastField: `${p}${(0, _constants.FieldNames).Last}`,\n            valueField: `${p}${(0, _constants.FieldNames).Value}`,\n            scale: `scale_${p}`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names , prefix , props  } = this;\n        const { addPercentageScale , globalScope , groupings , orientation , showAxes , size , sort , sortOrder , parentScope , z  } = props;\n        const zScale = (0, _zBase.addZScale)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        const horizontal = orientation === \"horizontal\";\n        const transform = [];\n        if (sort) transform.push({\n            type: \"collect\",\n            sort: {\n                field: (0, _expr.safeFieldName)(sort.name),\n                order: sortOrder\n            }\n        });\n        let stackField;\n        if (size) {\n            stackField = size.name;\n            transform.push({\n                type: \"filter\",\n                expr: `datum[${JSON.stringify(size.name)}] > 0`\n            });\n        } else {\n            stackField = names.valueField;\n            transform.push({\n                type: \"formula\",\n                expr: \"1\",\n                as: stackField\n            });\n        }\n        const stackTransform = {\n            type: \"stack\",\n            field: (0, _expr.safeFieldName)(stackField),\n            offset: \"normalize\",\n            as: [\n                names.firstField,\n                names.lastField\n            ]\n        };\n        if (groupings.length) stackTransform.groupby = (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName));\n        transform.push(stackTransform);\n        (0, _scope.addTransforms)(globalScope.data, ...transform);\n        const span = [\n            names.lastField,\n            names.firstField\n        ].map((f)=>`datum[${JSON.stringify(f)}]`).join(\" - \");\n        const offsets = {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, horizontal ? `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})` : \"\"),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, horizontal ? \"\" : `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n            h: horizontal ? parentScope.offsets.h : `(${span}) * (${parentScope.offsets.h})`,\n            w: horizontal ? `(${span}) * (${parentScope.offsets.w})` : parentScope.offsets.w\n        };\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: globalScope.markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    height: {\n                        signal: offsets.h\n                    },\n                    width: {\n                        signal: offsets.w\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, _selection.testForCollapseSelection)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, _expr.safeFieldName)(z.name)\n                        }, \n                    ]\n                })\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, mark);\n        let percentageScale;\n        if (addPercentageScale) percentageScale = [\n            {\n                type: \"linear\",\n                name: names.scale,\n                domain: [\n                    0,\n                    100\n                ],\n                range: horizontal ? [\n                    0,\n                    {\n                        signal: parentScope.sizeSignals.layoutWidth\n                    }, \n                ] : [\n                    {\n                        signal: parentScope.sizeSignals.layoutHeight\n                    },\n                    0, \n                ]\n            }\n        ];\n        return {\n            globalScales: {\n                showAxes,\n                scales: {\n                    x: horizontal ? percentageScale : undefined,\n                    y: horizontal ? undefined : percentageScale,\n                    z: zScale && [\n                        zScale\n                    ]\n                }\n            },\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            },\n            mark\n        };\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../constants\":\"3I5IU\",\"../expr\":\"7TBI4\",\"../scope\":\"deG3T\",\"../selection\":\"a3WxW\",\"../zBase\":\"9NSN1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"it60v\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Treemap\", ()=>Treemap);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _scope = require(\"../scope\");\nvar _selection = require(\"../selection\");\nvar _zBase = require(\"../zBase\");\nclass Treemap extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `treemap_${this.id}`;\n        this.names = {\n            dataName: `data_${p}`,\n            dataHeightWidth: `data_${p}_hw`,\n            dataExtents: `data_${p}_extents`,\n            dataFacet: `data_${p}_facet`,\n            dataFacetMark: `data_${p}_facetMark`,\n            fieldChildren: `${p}_children`,\n            fieldDepth: `${p}_depth`,\n            fieldX0: `${p}_x0`,\n            fieldX1: `${p}_x1`,\n            fieldY0: `${p}_y0`,\n            fieldY1: `${p}_y1`,\n            fieldHeight: `${p}_h`,\n            fieldWidth: `${p}_w`,\n            heightExtent: `${p}_heightExtent`,\n            widthExtent: `${p}_widthExtent`,\n            zScale: `scale_${p}_z`\n        };\n    }\n    build() {\n        const { names , props  } = this;\n        const { globalScope , parentScope , showAxes , treeMapMethod , z  } = props;\n        const zScale = (0, _zBase.addZScale)(z, globalScope.zSize, globalScope.data.name, names.zScale);\n        const offsets = {\n            x: (0, _scope.addOffsets)(parentScope.offsets.x, fn(names.fieldX0)),\n            y: (0, _scope.addOffsets)(parentScope.offsets.y, fn(names.fieldY0)),\n            h: subtract(names.fieldY1, names.fieldY0),\n            w: subtract(names.fieldX1, names.fieldX0)\n        };\n        const mark = this.transformedMark(offsets);\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: (0, _constants.SignalNames).TreeMapMethod,\n            value: \"squarify\",\n            bind: {\n                name: treeMapMethod,\n                input: \"select\",\n                options: [\n                    \"squarify\",\n                    \"binary\", \n                ]\n            }\n        });\n        return Object.assign(Object.assign({}, z && {\n            globalScales: {\n                showAxes,\n                scales: {\n                    z: [\n                        zScale\n                    ]\n                }\n            }\n        }), {\n            mark,\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null\n            }\n        });\n    }\n    transformedMark(offsets) {\n        const { names , props  } = this;\n        const { globalScope , groupings , parentScope  } = props;\n        if (groupings.length) {\n            //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n            (0, _scope.addData)(globalScope.scope, {\n                name: names.dataHeightWidth,\n                source: globalScope.markDataName,\n                transform: [\n                    {\n                        type: \"formula\",\n                        expr: parentScope.offsets.h,\n                        as: names.fieldHeight\n                    },\n                    {\n                        type: \"formula\",\n                        expr: parentScope.offsets.w,\n                        as: names.fieldWidth\n                    }, \n                ]\n            });\n            const treemapData = {\n                name: names.dataFacetMark,\n                source: names.dataFacet\n            };\n            const facets = {\n                type: \"group\",\n                from: {\n                    facet: {\n                        name: names.dataFacet,\n                        data: names.dataHeightWidth,\n                        groupby: (0, _scope.getGroupBy)(groupings).map((0, _expr.safeFieldName))\n                    }\n                },\n                data: [\n                    {\n                        name: names.dataExtents,\n                        source: names.dataFacet,\n                        transform: [\n                            {\n                                type: \"extent\",\n                                field: names.fieldHeight,\n                                signal: names.heightExtent\n                            },\n                            {\n                                type: \"extent\",\n                                field: names.fieldWidth,\n                                signal: names.widthExtent\n                            }, \n                        ]\n                    },\n                    treemapData, \n                ]\n            };\n            globalScope.setMarkDataName(names.dataFacetMark);\n            (0, _scope.addMarks)(globalScope.markGroup, facets);\n            //assign new markgroup after adding mark to original group\n            globalScope.setMarkGroup(facets);\n            this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n            return this.addMark(offsets, facets, globalScope.markDataName);\n        } else {\n            this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n            return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n        }\n    }\n    addMark(offsets, markParent, markDataName) {\n        const { names , prefix , props  } = this;\n        const { z  } = props;\n        const mark = {\n            name: prefix,\n            type: \"rect\",\n            from: {\n                data: markDataName\n            },\n            encode: {\n                update: Object.assign({\n                    width: {\n                        signal: offsets.w\n                    },\n                    height: {\n                        signal: offsets.h\n                    }\n                }, z && {\n                    z: {\n                        value: 0\n                    },\n                    depth: [\n                        {\n                            test: (0, _selection.testForCollapseSelection)(),\n                            value: 0\n                        },\n                        {\n                            scale: names.zScale,\n                            field: (0, _expr.safeFieldName)(z.name)\n                        }, \n                    ]\n                })\n            }\n        };\n        (0, _scope.addMarks)(markParent, mark);\n        return mark;\n    }\n    treemapTransform(treemapData, widthSignal, heightSignal) {\n        const { names , props  } = this;\n        const { group , size  } = props;\n        (0, _scope.addTransforms)(treemapData, {\n            type: \"filter\",\n            expr: `datum[${JSON.stringify(size.name)}] > 0`\n        }, {\n            type: \"nest\",\n            keys: [\n                group && group.name || \"__NONE__\"\n            ]\n        }, {\n            type: \"treemap\",\n            field: (0, _expr.safeFieldName)(size.name),\n            sort: {\n                field: \"value\",\n                order: \"descending\"\n            },\n            round: true,\n            method: {\n                signal: (0, _constants.SignalNames).TreeMapMethod\n            },\n            paddingInner: 1,\n            paddingOuter: 0,\n            size: [\n                {\n                    signal: widthSignal\n                },\n                {\n                    signal: heightSignal\n                }, \n            ],\n            as: [\n                names.fieldX0,\n                names.fieldY0,\n                names.fieldX1,\n                names.fieldY1,\n                names.fieldDepth,\n                names.fieldChildren, \n            ]\n        });\n    }\n}\nfunction fn(n) {\n    return `datum[${JSON.stringify(n)}]`;\n}\nfunction subtract(...fields) {\n    return fields.map((n)=>fn(n)).join(\" - \");\n}\n\n},{\"./layout\":\"jBcoW\",\"../constants\":\"3I5IU\",\"../expr\":\"7TBI4\",\"../scope\":\"deG3T\",\"../selection\":\"a3WxW\",\"../zBase\":\"9NSN1\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h0NOR\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Wrap\", ()=>Wrap);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _layout = require(\"./layout\");\nvar _bin = require(\"../bin\");\nvar _constants = require(\"../constants\");\nvar _expr = require(\"../expr\");\nvar _facetSearch = require(\"../facetSearch\");\nvar _facetTitle = require(\"../facetTitle\");\nvar _ordinal = require(\"../ordinal\");\nvar _scope = require(\"../scope\");\nvar _signals = require(\"../signals\");\nclass Wrap extends (0, _layout.Layout) {\n    constructor(props){\n        super(props);\n        this.props = props;\n        const p = this.prefix = `wrap_${this.id}`;\n        this.bin = (0, _bin.binnable)(this.prefix, props.globalScope.data.name, props.groupby);\n        this.names = {\n            outputData: `data_${p}_out`,\n            rowColumnDataName: `data_${p}_row_col`,\n            cellHeight: `${p}_cellHeight`,\n            cellWidth: `${p}_cellWidth`,\n            fits: `${p}_fits`,\n            target: `${p}_target`,\n            minArea: `${p}_minArea`,\n            aspect: `${p}_aspect`,\n            minAspect: `${p}_minAspect`,\n            idealAspect: `${p}_idealAspect`,\n            dataLength: `${p}_dataLength`,\n            rxc0: `${p}_rxc0`,\n            rxc1: `${p}_rxc1`,\n            rxc2: `${p}_rxc2`,\n            rxc: `${p}_rxc`,\n            growColCount: `${p}_growColCount`,\n            growCellWidth: `${p}_growCellWidth`,\n            fitsArea: `${p}_fitsArea`,\n            colCount: `${p}_colCount`\n        };\n    }\n    getGrouping() {\n        return this.bin.fields;\n    }\n    build() {\n        const { bin , names , prefix , props  } = this;\n        const { axisTextColor , cellTitles , globalScope , parentScope  } = props;\n        let ordinalBinData;\n        if (bin.native === false) {\n            (0, _scope.addSignals)(globalScope.scope, ...bin.signals);\n            (0, _scope.addTransforms)(globalScope.data, ...bin.transforms);\n            (0, _scope.addData)(globalScope.scope, bin.dataSequence);\n            (0, _scope.addTransforms)(bin.dataSequence, {\n                type: \"formula\",\n                expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                as: (0, _constants.FieldNames).Contains\n            });\n            ordinalBinData = bin.dataSequence.name;\n        } else {\n            const ord = (0, _ordinal.createOrdinals)(globalScope.data.name, prefix, bin.fields, \"ascending\");\n            (0, _scope.addData)(globalScope.scope, ord.data);\n            ordinalBinData = ord.data.name;\n        }\n        (0, _scope.addData)(globalScope.scope, {\n            name: names.rxc0,\n            transform: [\n                {\n                    type: \"sequence\",\n                    start: 1,\n                    stop: {\n                        signal: `ceil(sqrt(${names.dataLength})) + 1`\n                    }\n                },\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.dataLength} / datum.data)`,\n                    as: \"complement\"\n                }, \n            ]\n        }, {\n            name: names.rxc1,\n            source: names.rxc0,\n            transform: [\n                {\n                    type: \"project\",\n                    fields: [\n                        \"data\"\n                    ],\n                    as: [\n                        \"cols\"\n                    ]\n                }, \n            ]\n        }, {\n            name: names.rxc2,\n            source: names.rxc0,\n            transform: [\n                {\n                    type: \"project\",\n                    fields: [\n                        \"complement\"\n                    ],\n                    as: [\n                        \"cols\"\n                    ]\n                }, \n            ]\n        }, {\n            name: names.rxc,\n            source: [\n                names.rxc1,\n                names.rxc2\n            ],\n            transform: [\n                {\n                    type: \"formula\",\n                    expr: `ceil(${names.dataLength} / datum.cols)`,\n                    as: \"rows\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                    as: \"cellw\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.cols === 1 ? max(datum.cellw, ${(0, _constants.SignalNames).MinCellWidth}) : datum.cellw`,\n                    as: \"cellw\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                    as: \"cellh\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `datum.rows === 1 ? max(datum.cellh, ${(0, _constants.SignalNames).MinCellHeight}) : datum.cellh`,\n                    as: \"cellh\"\n                },\n                {\n                    type: \"formula\",\n                    expr: `(datum.cellw >= ${(0, _constants.SignalNames).MinCellWidth} && datum.cellh >= ${(0, _constants.SignalNames).MinCellHeight})`,\n                    as: \"meetsmin\"\n                },\n                {\n                    type: \"filter\",\n                    expr: \"datum.meetsmin\"\n                },\n                {\n                    type: \"formula\",\n                    expr: \"datum.cellw / datum.cellh\",\n                    as: names.aspect\n                },\n                {\n                    type: \"formula\",\n                    expr: `abs(datum.${names.aspect} - ${names.target})`,\n                    as: names.idealAspect\n                },\n                {\n                    type: \"formula\",\n                    expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                    as: \"coverage\"\n                },\n                {\n                    type: \"collect\",\n                    sort: {\n                        field: [\n                            names.idealAspect,\n                            \"coverage\"\n                        ],\n                        order: [\n                            \"ascending\",\n                            \"descending\"\n                        ]\n                    }\n                }, \n            ]\n        }, {\n            name: names.rowColumnDataName,\n            source: ordinalBinData,\n            transform: [\n                {\n                    type: \"formula\",\n                    expr: `floor((datum[${JSON.stringify((0, _constants.FieldNames).Ordinal)}] - 1) / ${names.colCount})`,\n                    as: (0, _constants.FieldNames).WrapRow\n                },\n                {\n                    type: \"formula\",\n                    expr: `(datum[${JSON.stringify((0, _constants.FieldNames).Ordinal)}] - 1) % ${names.colCount}`,\n                    as: (0, _constants.FieldNames).WrapCol\n                },\n                {\n                    type: \"formula\",\n                    expr: (0, _facetSearch.serializeAsVegaExpression)(bin, (0, _constants.FieldNames).First, (0, _constants.FieldNames).Last),\n                    as: (0, _constants.FieldNames).FacetSearch\n                },\n                {\n                    type: \"formula\",\n                    expr: (0, _facetSearch.displayBin)(bin),\n                    as: (0, _constants.FieldNames).FacetTitle\n                }, \n            ]\n        });\n        const dataOut = {\n            name: names.outputData,\n            source: globalScope.data.name,\n            transform: [\n                {\n                    type: \"lookup\",\n                    from: names.rowColumnDataName,\n                    key: (0, _expr.safeFieldName)(bin.fields[0]),\n                    fields: [\n                        bin.fields[0]\n                    ].map((0, _expr.safeFieldName)),\n                    values: [\n                        (0, _constants.FieldNames).WrapRow,\n                        (0, _constants.FieldNames).WrapCol\n                    ]\n                }, \n            ]\n        };\n        (0, _scope.addData)(globalScope.scope, dataOut);\n        globalScope.setMarkDataName(names.outputData);\n        (0, _scope.addSignals)(globalScope.scope, {\n            name: names.minAspect,\n            update: `${(0, _constants.SignalNames).MinCellWidth} / ${(0, _constants.SignalNames).MinCellHeight}`\n        }, {\n            name: names.target,\n            update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`\n        }, {\n            name: names.minArea,\n            update: `${(0, _constants.SignalNames).MinCellWidth}*${(0, _constants.SignalNames).MinCellHeight}`\n        }, {\n            name: names.aspect,\n            update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`\n        }, {\n            name: names.dataLength,\n            update: `data(${JSON.stringify(ordinalBinData)}).length`\n        }, {\n            name: names.growColCount,\n            update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${(0, _constants.SignalNames).MinCellWidth}), 1)`\n        }, {\n            name: names.growCellWidth,\n            update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`\n        }, {\n            name: names.fitsArea,\n            update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`\n        }, {\n            name: names.fits,\n            update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`\n        }, {\n            name: names.colCount,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`\n        }, {\n            name: names.cellWidth,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`\n        }, {\n            name: names.cellHeight,\n            update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${(0, _constants.SignalNames).MinCellHeight}`\n        });\n        (0, _signals.modifySignal)(globalScope.signals.plotHeightOut, \"max\", `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n        (0, _signals.modifySignal)(globalScope.signals.plotWidthOut, \"max\", `(${names.cellWidth} * ${names.colCount})`);\n        const signalH = [\n            names.cellHeight,\n            (0, _constants.SignalNames).FacetPaddingTop,\n            (0, _constants.SignalNames).FacetPaddingBottom\n        ].join(\" - \");\n        const signalW = [\n            names.cellWidth,\n            (0, _constants.SignalNames).FacetPaddingLeft\n        ].join(\" - \");\n        const signalX = (0, _scope.addOffsets)(parentScope.offsets.x, `datum[${JSON.stringify((0, _constants.FieldNames).WrapCol)}] * ${names.cellWidth}`, (0, _constants.SignalNames).FacetPaddingLeft);\n        const signalY = (0, _scope.addOffsets)(parentScope.offsets.y, `datum[${JSON.stringify((0, _constants.FieldNames).WrapRow)}] * ${names.cellHeight}`, (0, _constants.SignalNames).FacetPaddingTop);\n        const update = {\n            height: {\n                signal: signalH\n            },\n            width: {\n                signal: signalW\n            },\n            x: {\n                signal: signalX\n            },\n            y: {\n                signal: signalY\n            }\n        };\n        const offsets = {\n            x: signalX,\n            y: signalY,\n            h: signalH,\n            w: signalW\n        };\n        const group = {\n            style: \"cell\",\n            name: prefix,\n            type: \"group\",\n            from: {\n                data: names.rowColumnDataName\n            },\n            encode: {\n                update\n            }\n        };\n        (0, _scope.addMarks)(globalScope.markGroup, group);\n        const sizeSignals = {\n            layoutHeight: `(${names.cellHeight} - ${(0, _constants.SignalNames).FacetPaddingTop} - ${(0, _constants.SignalNames).FacetPaddingBottom})`,\n            layoutWidth: `(${names.cellWidth} - ${(0, _constants.SignalNames).FacetPaddingLeft})`,\n            colCount: names.colCount,\n            rowCount: `ceil(${names.dataLength} / ${names.colCount})`\n        };\n        if (cellTitles) (0, _facetTitle.addFacetCellTitles)(group, sizeSignals, axisTextColor);\n        return {\n            facetScope: group,\n            sizeSignals,\n            offsets\n        };\n    }\n}\n\n},{\"./layout\":\"jBcoW\",\"../bin\":\"9Oj9O\",\"../constants\":\"3I5IU\",\"../expr\":\"7TBI4\",\"../facetSearch\":\"fnVov\",\"../facetTitle\":\"k14Ax\",\"../ordinal\":\"l9Svf\",\"../scope\":\"deG3T\",\"../signals\":\"6xNUg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"CdrH9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getImageMark\", ()=>getImageMark);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _band = require(\"./layouts/band\");\nfunction getImageMark(backgroundImage, allGlobalScales) {\n    const xScale = allGlobalScales.filter((s)=>s.scales.x)[0].scales.x[0];\n    const yScale = allGlobalScales.filter((s)=>s.scales.y)[0].scales.y[0];\n    const [xScaleName, yScaleName] = [\n        xScale,\n        yScale\n    ].map((s)=>s.name + (xScale.type === \"band\" ? (0, _band.bandScaleLinearSuffix) : \"\"));\n    return {\n        type: \"image\",\n        encode: {\n            update: {\n                url: {\n                    value: backgroundImage.url\n                },\n                aspect: {\n                    value: false\n                },\n                baseline: {\n                    value: \"bottom\"\n                },\n                height: {\n                    signal: getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top)\n                },\n                y: {\n                    signal: getScaledValue(yScaleName, backgroundImage.extents.bottom)\n                },\n                width: {\n                    signal: getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left)\n                },\n                x: {\n                    signal: getScaledValue(xScaleName, backgroundImage.extents.left)\n                }\n            }\n        }\n    };\n}\nfunction getScaledSpan(scaleName, low, high) {\n    return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n}\nfunction getScaledValue(scaleName, value) {\n    return `scale('${scaleName}', ${value})`;\n}\n\n},{\"./layouts/band\":\"j7AHg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"czyLt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"0QlBW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"3EP3i\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _compare = require(\"./compare\");\nparcelHelpers.exportAll(_compare, exports);\nvar _exec = require(\"./exec\");\nparcelHelpers.exportAll(_exec, exports);\nvar _group = require(\"./group\");\nparcelHelpers.exportAll(_group, exports);\nvar _invert = require(\"./invert\");\nparcelHelpers.exportAll(_invert, exports);\nvar _narrow = require(\"./narrow\");\nparcelHelpers.exportAll(_narrow, exports);\nvar _types = require(\"./types\");\nparcelHelpers.exportAll(_types, exports);\n\n},{\"./compare\":\"coHWy\",\"./exec\":\"6LVt9\",\"./group\":\"iKDUA\",\"./invert\":\"26SIK\",\"./narrow\":\"9bITl\",\"./types\":\"erTV8\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"coHWy\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"compareExpression\", ()=>compareExpression);\nparcelHelpers.export(exports, \"compareGroup\", ()=>compareGroup);\nparcelHelpers.export(exports, \"compare\", ()=>compare);\nparcelHelpers.export(exports, \"startsWith\", ()=>startsWith);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _group = require(\"./group\");\nconst expressionKeys = Object.keys({\n    clause: null,\n    name: null,\n    operator: null,\n    value: null\n});\nfunction compareExpression(a, b) {\n    if (a && b) for(let k = 0; k < expressionKeys.length; k++){\n        const key = expressionKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    else return !a && !b;\n    return true;\n}\nconst groupKeys = Object.keys({\n    clause: null\n});\nfunction compareGroup(a, b) {\n    for(let k = 0; k < groupKeys.length; k++){\n        const key = groupKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    if (!a.expressions && !b.expressions) return true;\n    if (!a.expressions || !b.expressions) return false;\n    if (a.expressions.length != b.expressions.length) return false;\n    for(let i = 0; i < a.expressions.length; i++){\n        if (!compareExpression(a.expressions[i], b.expressions[i])) return false;\n    }\n    return true;\n}\nfunction compare(a, b) {\n    if (a == b) return true;\n    if (!a || !b) return false;\n    const arrs = [\n        a,\n        b\n    ].map((0, _group.ensureSearchExpressionGroupArray));\n    const [arrA, arrB] = arrs;\n    if (arrA.length != arrB.length) return false;\n    for(let i = 0; i < arrA.length; i++){\n        if (!compareGroup(arrA[i], arrB[i])) return false;\n    }\n    return true;\n}\nfunction startsWith(whole, part) {\n    if (!part) return true;\n    const arrs = [\n        whole,\n        part\n    ].map((0, _group.ensureSearchExpressionGroupArray));\n    const [wholeArray, partArray] = arrs;\n    if (partArray.length > wholeArray.length) return false;\n    for(let i = 0; i < partArray.length; i++){\n        if (!compareGroup(wholeArray[i], partArray[i])) return false;\n    }\n    return true;\n}\n\n},{\"./group\":\"iKDUA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iKDUA\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"isSearchExpressionGroup\", ()=>isSearchExpressionGroup);\nparcelHelpers.export(exports, \"createGroupFromExpression\", ()=>createGroupFromExpression);\nparcelHelpers.export(exports, \"ensureSearchExpressionGroupArray\", ()=>ensureSearchExpressionGroupArray);\nfunction isSearchExpressionGroup(search) {\n    if (!search) return false;\n    return !!search.expressions;\n}\nfunction createGroupFromExpression(input) {\n    const output = {\n        expressions: [\n            input\n        ]\n    };\n    return output;\n}\nfunction ensureSearchExpressionGroupArray(search) {\n    if (Array.isArray(search)) return [\n        ...search\n    ];\n    else if (isSearchExpressionGroup(search)) return [\n        search\n    ];\n    else return [\n        createGroupFromExpression(search)\n    ];\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6LVt9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Exec\", ()=>Exec);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _group = require(\"./group\");\nfunction valueToBoolean(value) {\n    if (typeof value === \"string\") switch(value.toLowerCase()){\n        case \"true\":\n            return true;\n        case \"false\":\n            return false;\n    }\n    return !!value;\n}\nfunction valueToString(value) {\n    if (value == null) return \"\";\n    switch(typeof value){\n        case \"string\":\n            return value;\n        case \"boolean\":\n        case \"number\":\n            return value.toString();\n    }\n    return \"\";\n}\nfunction isStringOperation(ex) {\n    switch(ex.operator){\n        case \"contains\":\n        case \"!contains\":\n        case \"starts\":\n        case \"!starts\":\n            return true;\n    }\n    return false;\n}\nfunction isnullorEmpty(value) {\n    if (value == null) return true; //double equal sign to also catch undefined\n    if (typeof value === \"string\" && value.length === 0) return true;\n    return false;\n}\nclass Exec {\n    constructor(search, columns){\n        this.columns = columns;\n        this.groups = (0, _group.ensureSearchExpressionGroupArray)(search).map((g)=>{\n            const expressions = g.expressions.filter(Boolean);\n            expressions.forEach((ex)=>{\n                ex.column = this.getColumn(ex.name);\n                ex.valueBool = valueToBoolean(ex.value);\n                ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n                ex.stringOperation = isStringOperation(ex);\n            });\n            const group = Object.assign(Object.assign({}, g), {\n                expressions\n            });\n            return group;\n        });\n    }\n    getColumn(name) {\n        for(let i = 0; i < this.columns.length; i++){\n            if (this.columns[i].name == name) return this.columns[i];\n        }\n    }\n    runExpressionOnColumn(datum, ex) {\n        const actualDataValue = datum[ex.name];\n        if (ex.operator === \"isnullorEmpty\") return isnullorEmpty(actualDataValue);\n        else if (ex.operator === \"!isnullorEmpty\") return !isnullorEmpty(actualDataValue);\n        let dataValue = actualDataValue;\n        let expressionValue = ex.value;\n        if (ex.column) {\n            if (ex.column.type === \"string\" || ex.stringOperation) {\n                dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n                expressionValue = ex.valueLow;\n            } else if (ex.column.type === \"boolean\") {\n                dataValue = valueToBoolean(actualDataValue);\n                expressionValue = ex.valueBool;\n            } else if (ex.column.quantitative) {\n                dataValue = +actualDataValue;\n                expressionValue = +ex.value;\n            }\n        }\n        switch(ex.operator){\n            case \"!=\":\n                return dataValue != expressionValue;\n            case \"<\":\n                return dataValue < expressionValue;\n            case \"<=\":\n                return dataValue <= expressionValue;\n            case \"==\":\n                return dataValue == expressionValue;\n            case \">\":\n                return dataValue > expressionValue;\n            case \">=\":\n                return dataValue >= expressionValue;\n            case \"contains\":\n                return dataValue.indexOf(expressionValue) >= 0;\n            case \"!contains\":\n                return dataValue.indexOf(expressionValue) < 0;\n            case \"starts\":\n                return dataValue.indexOf(expressionValue) == 0;\n            case \"!starts\":\n                return dataValue.indexOf(expressionValue) !== 0;\n        }\n    }\n    runExpression(datum, ex) {\n        if (ex.name == null) {\n            //run on all columns\n            const group = {\n                expressions: this.columns.map((column, i)=>{\n                    const ex2 = Object.assign(Object.assign({}, ex), {\n                        column,\n                        name: column.name\n                    });\n                    if (i) ex2.clause = \"||\";\n                    return ex2;\n                })\n            };\n            return this.runGroup(datum, group);\n        } else return this.runExpressionOnColumn(datum, ex);\n    }\n    runGroup(datum, group) {\n        let accumulator = this.runExpression(datum, group.expressions[0]);\n        for(let i = 1; i < group.expressions.length; i++){\n            const ex = group.expressions[i];\n            switch(ex.clause){\n                case \"&&\":\n                    accumulator = accumulator && this.runExpression(datum, ex);\n                    break;\n                case \"||\":\n                    accumulator = accumulator || this.runExpression(datum, ex);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n    run(datum) {\n        let accumulator = this.runGroup(datum, this.groups[0]);\n        for(let i = 1; i < this.groups.length; i++){\n            const group = this.groups[i];\n            switch(group.clause){\n                case \"&&\":\n                    accumulator = accumulator && this.runGroup(datum, group);\n                    break;\n                case \"||\":\n                    accumulator = accumulator || this.runGroup(datum, group);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n}\n\n},{\"./group\":\"iKDUA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"26SIK\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"invert\", ()=>invert);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _group = require(\"./group\");\nfunction invertSearchExpressionGroup(input) {\n    //this only works if all expressions in this group have the same clause\n    const output = {\n        expressions: input.expressions.map(invertSearchExpression)\n    };\n    if (input.clause) output.clause = invertedClauses[input.clause];\n    return output;\n}\nconst invertedOperators = {\n    \"!=\": \"==\",\n    \"==\": \"!=\",\n    \"<\": \">=\",\n    \">=\": \"<\",\n    \"<=\": \">\",\n    \">\": \"<=\",\n    \"!contains\": \"contains\",\n    \"contains\": \"!contains\",\n    \"!isnullorEmpty\": \"isnullorEmpty\",\n    \"isnullorEmpty\": \"!isnullorEmpty\",\n    \"!starts\": \"starts\",\n    \"starts\": \"!starts\"\n};\nconst invertedClauses = {\n    \"&&\": \"||\",\n    \"||\": \"&&\"\n};\nfunction invertSearchExpression(input) {\n    const operator = invertedOperators[input.operator];\n    const output = Object.assign(Object.assign({}, input), {\n        operator\n    });\n    if (input.clause) output.clause = invertedClauses[input.clause];\n    return output;\n}\nfunction invert(search) {\n    if (Array.isArray(search)) return search.map(invertSearchExpressionGroup);\n    else if ((0, _group.isSearchExpressionGroup)(search)) return invertSearchExpressionGroup(search);\n    else return invertSearchExpression(search);\n}\n\n},{\"./group\":\"iKDUA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9bITl\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"narrow\", ()=>narrow);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _group = require(\"./group\");\nfunction narrow(a, b) {\n    if (!a) return b;\n    const arrs = [\n        a,\n        b\n    ].map((0, _group.ensureSearchExpressionGroupArray));\n    const [arrA, arrB] = arrs;\n    arrB[0].clause = \"&&\";\n    return arrA.concat(arrB);\n}\n\n},{\"./group\":\"iKDUA\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"erTV8\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4gpr7\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"eohCL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getColumnsFromData\", ()=>(0, _sanddanceSpecs.getColumnsFromData));\nparcelHelpers.export(exports, \"getStats\", ()=>(0, _sanddanceSpecs.getStats));\nparcelHelpers.export(exports, \"inferAll\", ()=>(0, _sanddanceSpecs.inferAll));\nparcelHelpers.export(exports, \"getPresenterStyle\", ()=>(0, _defaults.getPresenterStyle));\nparcelHelpers.export(exports, \"isInternalFieldName\", ()=>isInternalFieldName);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _defaults = require(\"./defaults\");\nfunction isInternalFieldName(columnName, includeVegaDeckGLFields = false) {\n    if (includeVegaDeckGLFields) {\n        if (columnName === (0, _constants.GL_ORDINAL)) return true;\n    }\n    for(const f in 0, _constants.FieldNames){\n        if (columnName === (0, _constants.FieldNames)[f]) return true;\n    }\n    return false;\n}\n\n},{\"./constants\":\"2SlZI\",\"@msrvida/sanddance-specs\":\"aBhpQ\",\"./defaults\":\"doogP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"doogP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"defaultViewerOptions\", ()=>defaultViewerOptions);\nparcelHelpers.export(exports, \"getPresenterStyle\", ()=>getPresenterStyle);\nparcelHelpers.export(exports, \"cssPrefix\", ()=>cssPrefix);\nparcelHelpers.export(exports, \"dualColorSchemeColors\", ()=>dualColorSchemeColors);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nconst { defaultPresenterConfig , defaultPresenterStyle  } = _vegaDeckGl.defaults;\nconst { desaturate  } = _vegaDeckGl.util;\nconst defaultViewerOptions = {\n    colors: {\n        activeCube: \"purple\",\n        defaultCube: _vegaDeckGl.util.colorToString(defaultPresenterStyle.defaultCubeColor),\n        hoveredCube: _vegaDeckGl.util.colorToString(defaultPresenterStyle.highlightColor),\n        selectedCube: \"yellow\",\n        axisSelectHighlight: _vegaDeckGl.util.colorToString([\n            128,\n            128,\n            128,\n            128\n        ]),\n        axisLine: \"#000\",\n        axisText: \"#000\",\n        unselectedColorMethod: (color)=>{\n            const c = desaturate(color, 0.05);\n            c[3] = 171;\n            return c;\n        }\n    },\n    language: {\n        headers: {\n            chart: \"Chart\",\n            details: \"Details\",\n            legend: \"Legend\",\n            selection: \"Select & Filter\"\n        },\n        bing: \"bing\",\n        newColorMap: \"remap color to filtered items\",\n        oldColorMap: \"keep same colors\",\n        deselect: \"deselect\",\n        exclude: \"exclude\",\n        isolate: \"isolate\",\n        legendOther: \"other\",\n        nextDetail: \">\",\n        previousDetail: \"<\",\n        reset: \"reset\",\n        colorBinCount: \"Color bin count\",\n        colorReverse: \"Color reverse\",\n        count: \"Count\",\n        percent: \"Percent\",\n        sum: \"Sum\",\n        scatterPointScale: \"Point scale\",\n        FacetMaxBins: \"Facet max bins\",\n        FacetVMaxBins: \"Cross facet max bins\",\n        XMaxBins: \"X axis max bins\",\n        YMaxBins: \"Y axis max bins\",\n        XGridSize: \"X grid size\",\n        YGridSize: \"Y grid size\",\n        InnerPaddingSize: \"Inner padding size\",\n        OuterPaddingSize: \"Outer padding size\",\n        treeMapMethod: \"Treemap layout\",\n        facetColumns: \"Facet columns\",\n        facetRows: \"Facet rows\",\n        markOpacitySignal: \"Mark opacity\",\n        textScaleSignal: \"Text scale\",\n        xAxisTextAngleSignal: \"X axis text angle\",\n        yAxisTextAngleSignal: \"Y axis text angle\",\n        zGrounded: \"Z grounded\",\n        zScaleProportion: \"Z scale proportion to Y\",\n        selectionCount: (count)=>`${count} items selected`\n    },\n    maxLegends: 19,\n    onError: (errors)=>{\n    //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n    },\n    transitionDurations: Object.assign(Object.assign({}, defaultPresenterConfig.transitionDurations), {\n        scope: 600\n    }),\n    selectionPolygonZ: -1,\n    tickSize: 10\n};\nfunction getPresenterStyle(options) {\n    const style = {\n        cssPrefix,\n        fontFamily: options.fontFamily,\n        defaultCubeColor: _vegaDeckGl.util.colorFromString(options.colors.defaultCube)\n    };\n    if (options.colors.hoveredCube) style.highlightColor = _vegaDeckGl.util.colorFromString(options.colors.hoveredCube);\n    //if (options.lightSettings) {\n    // style.lightSettings = options.lightSettings;\n    //}\n    return style;\n}\nconst cssPrefix = \"sanddance-\";\nconst dualColorSchemeColors = {\n    black: \"#212121\",\n    gray: \"#D2D2D2\",\n    blue: \"#0060F0\",\n    green: \"#00C000\",\n    orange: \"#FF9900\",\n    red: \"#E00000\"\n};\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6fUZE\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"base\", ()=>(0, _base.base));\nparcelHelpers.export(exports, \"use\", ()=>(0, _base.use));\nparcelHelpers.export(exports, \"Presenter\", ()=>(0, _presenter.Presenter));\nparcelHelpers.export(exports, \"ViewGl\", ()=>(0, _viewGl.ViewGl));\nparcelHelpers.export(exports, \"constants\", ()=>_constants);\nparcelHelpers.export(exports, \"controls\", ()=>_controls);\nparcelHelpers.export(exports, \"defaults\", ()=>_defaults);\nparcelHelpers.export(exports, \"types\", ()=>_types);\nparcelHelpers.export(exports, \"util\", ()=>_util);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nvar _controls = require(\"./exports/controls\");\nvar _types = require(\"./exports/types\");\nvar _util = require(\"./exports/util\");\nvar _defaults = require(\"./defaults\");\nvar _base = require(\"./base\");\nvar _presenter = require(\"./presenter\");\nvar _viewGl = require(\"./vega-classes/viewGl\");\nvar _enums = require(\"./enums\");\nparcelHelpers.exportAll(_enums, exports);\n\n},{\"./constants\":\"9JE81\",\"./exports/controls\":\"i5ODk\",\"./exports/types\":\"clkEp\",\"./exports/util\":\"OAw6e\",\"./defaults\":\"2VC3T\",\"./base\":\"bgAmf\",\"./presenter\":\"483nJ\",\"./vega-classes/viewGl\":\"8D9Ej\",\"./enums\":\"gGAEP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9JE81\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"layerNames\", ()=>layerNames);\nconst layerNames = {\n    cubes: \"LAYER_CUBES\",\n    lines: \"LAYER_LINES\",\n    text: \"LAYER_TEXT\",\n    paths: \"LAYER_PATHS\",\n    polygons: \"LAYER_POLYGONS\"\n};\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"i5ODk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n//alphabetize variables for documentation\nparcelHelpers.export(exports, \"Table\", ()=>(0, _controls.Table));\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * This file is for external facing export only, do not use this for internal references,\n * as it may cause circular dependencies in Rollup.\n */ var _controls = require(\"../controls\");\n\n},{\"../controls\":\"4QI3M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4QI3M\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"KeyCodes\", ()=>KeyCodes);\nparcelHelpers.export(exports, \"Table\", ()=>Table);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _tsxCreateElement = require(\"tsx-create-element\");\nconst KeyCodes = {\n    ENTER: \"Enter\"\n};\nconst Table = (props)=>{\n    return (0, _tsxCreateElement.createElement)(\"table\", {\n        className: props.className\n    }, props.children, props.rows.map((row, i)=>(0, _tsxCreateElement.createElement)(\"tr\", {\n            className: props.rowClassName || \"\",\n            onClick: (e)=>props.onRowClick && props.onRowClick(e, i),\n            tabIndex: props.onRowClick ? 0 : -1,\n            onKeyUp: (e)=>{\n                if (e.key === KeyCodes.ENTER && props.onRowClick) props.onRowClick(e, i);\n            }\n        }, row.cells.map((cell, i)=>(0, _tsxCreateElement.createElement)(\"td\", {\n                className: cell.className || \"\",\n                title: cell.title || \"\"\n            }, cell.content)))));\n};\n\n},{\"tsx-create-element\":\"45tGW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"45tGW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createElement\", ()=>createElement);\nparcelHelpers.export(exports, \"addChild\", ()=>addChild);\nparcelHelpers.export(exports, \"mount\", ()=>mount);\nparcelHelpers.export(exports, \"findElementByChildPositions\", ()=>findElementByChildPositions);\nparcelHelpers.export(exports, \"focusActiveElement\", ()=>focusActiveElement);\nparcelHelpers.export(exports, \"setActiveElement\", ()=>setActiveElement);\nparcelHelpers.export(exports, \"getActiveElementInfo\", ()=>getActiveElementInfo);\nvar _htmlTags = require(\"html-tags\");\nvar _svgTags = require(\"svg-tags\");\nconst htmlTagArray = _htmlTags.default || _htmlTags;\nconst svgTagArray = _svgTags.default || _svgTags;\n/**\n * Decamelizes a string with/without a custom separator (hyphen by default).\n * from: https://ourcodeworld.com/articles/read/608/how-to-camelize-and-decamelize-strings-in-javascript\n *\n * @param str String in camelcase\n * @param separator Separator for the new decamelized string.\n */ function decamelize(str, separator = \"-\") {\n    return str.replace(/([a-z\\d])([A-Z])/g, \"$1\" + separator + \"$2\").replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, \"$1\" + separator + \"$2\").toLowerCase();\n}\nfunction createElement(tag, attrs, ...children) {\n    if (typeof tag === \"function\") {\n        const fn = tag;\n        const props = attrs;\n        props.children = children;\n        return fn(props);\n    } else {\n        const ns = tagNamespace(tag);\n        const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n        const map = attrs;\n        let ref;\n        for(let name in map)if (name && map.hasOwnProperty(name)) {\n            let value = map[name];\n            if (name === \"className\" && value !== void 0) setAttribute(el, ns, \"class\", value.toString());\n            else if (name === \"disabled\" && !value) ;\n            else if (value === null || value === undefined) continue;\n            else if (value === true) setAttribute(el, ns, name, name);\n            else if (typeof value === \"function\") {\n                if (name === \"ref\") ref = value;\n                else el[name.toLowerCase()] = value;\n            } else if (typeof value === \"object\") setAttribute(el, ns, name, flatten(value));\n            else setAttribute(el, ns, name, value.toString());\n        }\n        if (children && children.length > 0) appendChildren(el, children);\n        if (ref) ref(el);\n        return el;\n    }\n}\nfunction setAttribute(el, ns, name, value) {\n    if (ns) el.setAttributeNS(null, name, value);\n    else el.setAttribute(name, value);\n}\nfunction flatten(o) {\n    const arr = [];\n    for(let prop in o)arr.push(`${decamelize(prop, \"-\")}:${o[prop]}`);\n    return arr.join(\";\");\n}\nfunction addChild(parentElement, child) {\n    if (child === null || child === undefined || typeof child === \"boolean\") return;\n    else if (Array.isArray(child)) appendChildren(parentElement, child);\n    else if (isElement(child)) parentElement.appendChild(child);\n    else parentElement.appendChild(document.createTextNode(child.toString()));\n}\nfunction appendChildren(parentElement, children) {\n    children.forEach((child)=>addChild(parentElement, child));\n}\nfunction isElement(el) {\n    //nodeType cannot be zero https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n    return !!el.nodeType;\n}\nfunction mount(element, container) {\n    container.innerHTML = \"\";\n    if (element) addChild(container, element);\n}\nfunction findElementByChildPositions(childPositions, container) {\n    let element = container || document.body;\n    let childPosition;\n    while(element && childPositions.length){\n        childPosition = childPositions.shift();\n        element = element.children.item(childPosition);\n    }\n    if (element) return element;\n}\nfunction focusActiveElement(element, activeElementInfo) {\n    element.focus();\n    element.scrollTop = activeElementInfo.scrollTop;\n    const input = element;\n    if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n}\nfunction setActiveElement(activeElementInfo, container) {\n    if (activeElementInfo) {\n        const element = findElementByChildPositions(activeElementInfo.childPositions, container);\n        if (element) focusActiveElement(element, activeElementInfo);\n    }\n}\nfunction getActiveElementInfo(container) {\n    let element = document.activeElement;\n    const { scrollTop , selectionDirection , selectionEnd , selectionStart  } = element;\n    const activeElementInfo = {\n        childPositions: [],\n        scrollTop,\n        selectionDirection,\n        selectionEnd,\n        selectionStart\n    };\n    while(element && element !== document.body && element !== container){\n        activeElementInfo.childPositions.unshift(getChildPosition(element));\n        element = element.parentElement;\n    }\n    if ((element === document.body || element === container) && activeElementInfo.childPositions.length) return activeElementInfo;\n}\nfunction getChildPosition(element) {\n    let childPosition = 0;\n    while(element = element.previousElementSibling)childPosition++;\n    return childPosition;\n}\nfunction tagNamespace(tag) {\n    //issue: this won't disambiguate certain tags which exist in both svg and html: <a>, <title> ...\n    if (tag === \"svg\" || svgTagArray.indexOf(tag) >= 0 && !(htmlTagArray.indexOf(tag) >= 0)) return \"http://www.w3.org/2000/svg\";\n}\n\n},{\"html-tags\":\"hwqcI\",\"svg-tags\":\"8MTi6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hwqcI\":[function(require,module,exports) {\n\"use strict\";\nmodule.exports = require(\"./html-tags.json\");\n\n},{\"./html-tags.json\":\"g3iWq\"}],\"g3iWq\":[function(require,module,exports) {\nmodule.exports = JSON.parse('[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rb\",\"rp\",\"rt\",\"rtc\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]');\n\n},{}],\"8MTi6\":[function(require,module,exports) {\nmodule.exports = require(\"./svg-tags.json\");\n\n},{\"./svg-tags.json\":\"dHXPc\"}],\"dHXPc\":[function(require,module,exports) {\nmodule.exports = JSON.parse('[\"a\",\"altGlyph\",\"altGlyphDef\",\"altGlyphItem\",\"animate\",\"animateColor\",\"animateMotion\",\"animateTransform\",\"circle\",\"clipPath\",\"color-profile\",\"cursor\",\"defs\",\"desc\",\"ellipse\",\"feBlend\",\"feColorMatrix\",\"feComponentTransfer\",\"feComposite\",\"feConvolveMatrix\",\"feDiffuseLighting\",\"feDisplacementMap\",\"feDistantLight\",\"feFlood\",\"feFuncA\",\"feFuncB\",\"feFuncG\",\"feFuncR\",\"feGaussianBlur\",\"feImage\",\"feMerge\",\"feMergeNode\",\"feMorphology\",\"feOffset\",\"fePointLight\",\"feSpecularLighting\",\"feSpotLight\",\"feTile\",\"feTurbulence\",\"filter\",\"font\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignObject\",\"g\",\"glyph\",\"glyphRef\",\"hkern\",\"image\",\"line\",\"linearGradient\",\"marker\",\"mask\",\"metadata\",\"missing-glyph\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialGradient\",\"rect\",\"script\",\"set\",\"stop\",\"style\",\"svg\",\"switch\",\"symbol\",\"text\",\"textPath\",\"title\",\"tref\",\"tspan\",\"use\",\"view\",\"vkern\"]');\n\n},{}],\"clkEp\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"OAw6e\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n//alphabetize for documentation\nparcelHelpers.export(exports, \"addDiv\", ()=>(0, _htmlHelpers.addDiv));\nparcelHelpers.export(exports, \"addEl\", ()=>(0, _htmlHelpers.addEl));\nparcelHelpers.export(exports, \"allTruthy\", ()=>(0, _array.allTruthy));\nparcelHelpers.export(exports, \"clone\", ()=>(0, _clone.clone));\nparcelHelpers.export(exports, \"colorFromString\", ()=>(0, _color.colorFromString));\nparcelHelpers.export(exports, \"colorIsEqual\", ()=>(0, _color.colorIsEqual));\nparcelHelpers.export(exports, \"colorToString\", ()=>(0, _color.colorToString));\nparcelHelpers.export(exports, \"concat\", ()=>(0, _array.concat));\nparcelHelpers.export(exports, \"createElement\", ()=>(0, _tsxCreateElement.createElement));\nparcelHelpers.export(exports, \"deepMerge\", ()=>(0, _clone.deepMerge));\nparcelHelpers.export(exports, \"desaturate\", ()=>(0, _color.desaturate));\nparcelHelpers.export(exports, \"getActiveElementInfo\", ()=>(0, _tsxCreateElement.getActiveElementInfo));\nparcelHelpers.export(exports, \"getCubeLayer\", ()=>(0, _layers.getCubeLayer));\nparcelHelpers.export(exports, \"getCubes\", ()=>(0, _layers.getCubes));\nparcelHelpers.export(exports, \"mount\", ()=>(0, _tsxCreateElement.mount));\nparcelHelpers.export(exports, \"outerSize\", ()=>(0, _htmlHelpers.outerSize));\nparcelHelpers.export(exports, \"push\", ()=>(0, _array.push));\nparcelHelpers.export(exports, \"setActiveElement\", ()=>(0, _tsxCreateElement.setActiveElement));\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * This file is for external facing export only, do not use this for internal references,\n * as it may cause circular dependencies in Rollup.\n */ var _array = require(\"../array\");\nvar _htmlHelpers = require(\"../htmlHelpers\");\nvar _clone = require(\"../clone\");\nvar _color = require(\"../color\");\nvar _tsxCreateElement = require(\"tsx-create-element\");\nvar _layers = require(\"../layers\");\n\n},{\"../array\":\"9ipvJ\",\"../htmlHelpers\":\"30u4H\",\"../clone\":\"iXJRs\",\"../color\":\"1dPRr\",\"tsx-create-element\":\"45tGW\",\"../layers\":\"dFLCZ\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9ipvJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"concat\", ()=>concat);\n/**\n * Returns array with items which are truthy.\n * @param args array or arrays to concat into a single array.\n */ parcelHelpers.export(exports, \"allTruthy\", ()=>allTruthy);\n/**\n * Add an array to an existing array in place.\n * @param arr Array to append to.\n * @param items Arrof of items to append.\n */ parcelHelpers.export(exports, \"push\", ()=>push);\nfunction concat(...args) {\n    return args.reduce((p, c)=>c ? p.concat(c) : p, []);\n}\nfunction allTruthy(...args) {\n    return args.reduce((p, c)=>c ? p.concat(c) : p, []).filter(Boolean);\n}\nfunction push(arr, items) {\n    arr.push.apply(arr, items);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"30u4H\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ /**\n * Create a new element as a child of another element.\n * @param tagName Tag name of the new tag to create.\n * @param parentElement Reference of the element to append to.\n * @returns new HTMLElement.\n */ parcelHelpers.export(exports, \"addEl\", ()=>addEl);\n/**\n * Create a new div HTMLElement as a child of another element.\n * @param parentElement Reference of the element to append to.\n * @param className Optional css class name to apply to the div.\n */ parcelHelpers.export(exports, \"addDiv\", ()=>addDiv);\n/**\n * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n * @param el HTML Element to measure.\n */ parcelHelpers.export(exports, \"outerSize\", ()=>outerSize);\nfunction addEl(tagName, parentElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n}\nfunction addDiv(parentElement, className) {\n    const div = addEl(\"div\", parentElement);\n    if (className) div.className = className;\n    return div;\n}\nfunction outerSize(el) {\n    const cs = getComputedStyle(el);\n    const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return {\n        height,\n        width\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"iXJRs\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"clone\", ()=>clone);\nparcelHelpers.export(exports, \"deepMerge\", ()=>deepMerge);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _deepmerge = require(\"deepmerge\");\nconst deepmerge = _deepmerge.default || _deepmerge;\nfunction clone(objectToClone) {\n    if (!objectToClone) return objectToClone;\n    return deepmerge.all([\n        objectToClone\n    ]);\n}\nconst dontMerge = (destination, source)=>source;\nfunction deepMerge(...objectsToMerge) {\n    const objects = objectsToMerge.filter(Boolean);\n    return deepmerge.all(objects, {\n        arrayMerge: dontMerge\n    });\n}\n\n},{\"deepmerge\":\"cwOt9\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cwOt9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nvar isMergeableObject = function isMergeableObject(value) {\n    return isNonNullObject(value) && !isSpecial(value);\n};\nfunction isNonNullObject(value) {\n    return !!value && typeof value === \"object\";\n}\nfunction isSpecial(value) {\n    var stringValue = Object.prototype.toString.call(value);\n    return stringValue === \"[object RegExp]\" || stringValue === \"[object Date]\" || isReactElement(value);\n}\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === \"function\" && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for(\"react.element\") : 0xeac7;\nfunction isReactElement(value) {\n    return value.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n}\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n    return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value;\n}\nfunction defaultArrayMerge(target, source, options) {\n    return target.concat(source).map(function(element) {\n        return cloneUnlessOtherwiseSpecified(element, options);\n    });\n}\nfunction mergeObject(target, source, options) {\n    var destination = {};\n    if (options.isMergeableObject(target)) Object.keys(target).forEach(function(key) {\n        destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n    });\n    Object.keys(source).forEach(function(key) {\n        if (!options.isMergeableObject(source[key]) || !target[key]) destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n        else destination[key] = deepmerge(target[key], source[key], options);\n    });\n    return destination;\n}\nfunction deepmerge(target, source, options) {\n    options = options || {};\n    options.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    options.isMergeableObject = options.isMergeableObject || isMergeableObject;\n    var sourceIsArray = Array.isArray(source);\n    var targetIsArray = Array.isArray(target);\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n    if (!sourceAndTargetTypesMatch) return cloneUnlessOtherwiseSpecified(source, options);\n    else if (sourceIsArray) return options.arrayMerge(target, source, options);\n    else return mergeObject(target, source, options);\n}\ndeepmerge.all = function deepmergeAll(array, options) {\n    if (!Array.isArray(array)) throw new Error(\"first argument should be an array\");\n    return array.reduce(function(prev, next) {\n        return deepmerge(prev, next, options);\n    }, {});\n};\nvar deepmerge_1 = deepmerge;\nexports.default = deepmerge_1;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1dPRr\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Compares 2 colors to see if they are equal.\n * @param a RGBAColor to compare\n * @param b RGBAColor to compare\n * @returns True if colors are equal.\n */ parcelHelpers.export(exports, \"colorIsEqual\", ()=>colorIsEqual);\n/**\n * Convert a CSS color string to a Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n */ parcelHelpers.export(exports, \"colorFromString\", ()=>colorFromString);\n/**\n * Convert a Deck.gl color to a CSS rgba() string.\n * @param color A Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n */ parcelHelpers.export(exports, \"colorToString\", ()=>colorToString);\nparcelHelpers.export(exports, \"desaturate\", ()=>desaturate);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _d3Color = require(\"d3-color\");\nfunction rgbToDeckglColor(c) {\n    return [\n        c.r,\n        c.g,\n        c.b,\n        c.opacity * 255\n    ];\n}\nfunction colorIsEqual(a, b) {\n    if (a.length !== b.length) return false;\n    for(let i = 0; i < a.length; i++){\n        if (a[i] !== b[i]) return false;\n    }\n    return true;\n}\nfunction colorFromString(cssColorSpecifier) {\n    if (cssColorSpecifier) {\n        const dc = (0, _d3Color.color)(cssColorSpecifier);\n        if (dc) {\n            const c = dc.rgb();\n            return rgbToDeckglColor(c);\n        }\n    }\n}\nfunction colorToString(color) {\n    const c = [\n        ...color\n    ];\n    if (c.length > 3) c[3] /= 255;\n    return `rgba(${c.join(\",\")})`;\n}\nfunction desaturate(color, value) {\n    const rgb = (0, _d3Color.rgb)(color[0], color[1], color[2], color[3] / 255);\n    const hslColor = (0, _d3Color.hsl)(rgb);\n    hslColor.s = value;\n    const c = hslColor.rgb();\n    return rgbToDeckglColor(c);\n}\n\n},{\"d3-color\":\"fiRaH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fiRaH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"color\", ()=>(0, _colorJsDefault.default));\nparcelHelpers.export(exports, \"rgb\", ()=>(0, _colorJs.rgb));\nparcelHelpers.export(exports, \"hsl\", ()=>(0, _colorJs.hsl));\nparcelHelpers.export(exports, \"lab\", ()=>(0, _labJsDefault.default));\nparcelHelpers.export(exports, \"hcl\", ()=>(0, _labJs.hcl));\nparcelHelpers.export(exports, \"lch\", ()=>(0, _labJs.lch));\nparcelHelpers.export(exports, \"gray\", ()=>(0, _labJs.gray));\nparcelHelpers.export(exports, \"cubehelix\", ()=>(0, _cubehelixJsDefault.default));\nvar _colorJs = require(\"./color.js\");\nvar _colorJsDefault = parcelHelpers.interopDefault(_colorJs);\nvar _labJs = require(\"./lab.js\");\nvar _labJsDefault = parcelHelpers.interopDefault(_labJs);\nvar _cubehelixJs = require(\"./cubehelix.js\");\nvar _cubehelixJsDefault = parcelHelpers.interopDefault(_cubehelixJs);\n\n},{\"./color.js\":\"7w2ru\",\"./lab.js\":false,\"./cubehelix.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7w2ru\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Color\", ()=>Color);\nparcelHelpers.export(exports, \"darker\", ()=>darker);\nparcelHelpers.export(exports, \"brighter\", ()=>brighter);\nparcelHelpers.export(exports, \"rgbConvert\", ()=>rgbConvert);\nparcelHelpers.export(exports, \"rgb\", ()=>rgb);\nparcelHelpers.export(exports, \"Rgb\", ()=>Rgb);\nparcelHelpers.export(exports, \"hslConvert\", ()=>hslConvert);\nparcelHelpers.export(exports, \"hsl\", ()=>hsl);\nvar _defineJs = require(\"./define.js\");\nvar _defineJsDefault = parcelHelpers.interopDefault(_defineJs);\nfunction Color() {}\nvar darker = 0.7;\nvar brighter = 1 / darker;\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(\"^rgb\\\\(\" + [\n    reI,\n    reI,\n    reI\n] + \"\\\\)$\"), reRgbPercent = new RegExp(\"^rgb\\\\(\" + [\n    reP,\n    reP,\n    reP\n] + \"\\\\)$\"), reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [\n    reI,\n    reI,\n    reI,\n    reN\n] + \"\\\\)$\"), reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [\n    reP,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\"), reHslPercent = new RegExp(\"^hsl\\\\(\" + [\n    reN,\n    reP,\n    reP\n] + \"\\\\)$\"), reHslaPercent = new RegExp(\"^hsla\\\\(\" + [\n    reN,\n    reP,\n    reP,\n    reN\n] + \"\\\\)$\");\nvar named = {\n    aliceblue: 0xf0f8ff,\n    antiquewhite: 0xfaebd7,\n    aqua: 0x00ffff,\n    aquamarine: 0x7fffd4,\n    azure: 0xf0ffff,\n    beige: 0xf5f5dc,\n    bisque: 0xffe4c4,\n    black: 0x000000,\n    blanchedalmond: 0xffebcd,\n    blue: 0x0000ff,\n    blueviolet: 0x8a2be2,\n    brown: 0xa52a2a,\n    burlywood: 0xdeb887,\n    cadetblue: 0x5f9ea0,\n    chartreuse: 0x7fff00,\n    chocolate: 0xd2691e,\n    coral: 0xff7f50,\n    cornflowerblue: 0x6495ed,\n    cornsilk: 0xfff8dc,\n    crimson: 0xdc143c,\n    cyan: 0x00ffff,\n    darkblue: 0x00008b,\n    darkcyan: 0x008b8b,\n    darkgoldenrod: 0xb8860b,\n    darkgray: 0xa9a9a9,\n    darkgreen: 0x006400,\n    darkgrey: 0xa9a9a9,\n    darkkhaki: 0xbdb76b,\n    darkmagenta: 0x8b008b,\n    darkolivegreen: 0x556b2f,\n    darkorange: 0xff8c00,\n    darkorchid: 0x9932cc,\n    darkred: 0x8b0000,\n    darksalmon: 0xe9967a,\n    darkseagreen: 0x8fbc8f,\n    darkslateblue: 0x483d8b,\n    darkslategray: 0x2f4f4f,\n    darkslategrey: 0x2f4f4f,\n    darkturquoise: 0x00ced1,\n    darkviolet: 0x9400d3,\n    deeppink: 0xff1493,\n    deepskyblue: 0x00bfff,\n    dimgray: 0x696969,\n    dimgrey: 0x696969,\n    dodgerblue: 0x1e90ff,\n    firebrick: 0xb22222,\n    floralwhite: 0xfffaf0,\n    forestgreen: 0x228b22,\n    fuchsia: 0xff00ff,\n    gainsboro: 0xdcdcdc,\n    ghostwhite: 0xf8f8ff,\n    gold: 0xffd700,\n    goldenrod: 0xdaa520,\n    gray: 0x808080,\n    green: 0x008000,\n    greenyellow: 0xadff2f,\n    grey: 0x808080,\n    honeydew: 0xf0fff0,\n    hotpink: 0xff69b4,\n    indianred: 0xcd5c5c,\n    indigo: 0x4b0082,\n    ivory: 0xfffff0,\n    khaki: 0xf0e68c,\n    lavender: 0xe6e6fa,\n    lavenderblush: 0xfff0f5,\n    lawngreen: 0x7cfc00,\n    lemonchiffon: 0xfffacd,\n    lightblue: 0xadd8e6,\n    lightcoral: 0xf08080,\n    lightcyan: 0xe0ffff,\n    lightgoldenrodyellow: 0xfafad2,\n    lightgray: 0xd3d3d3,\n    lightgreen: 0x90ee90,\n    lightgrey: 0xd3d3d3,\n    lightpink: 0xffb6c1,\n    lightsalmon: 0xffa07a,\n    lightseagreen: 0x20b2aa,\n    lightskyblue: 0x87cefa,\n    lightslategray: 0x778899,\n    lightslategrey: 0x778899,\n    lightsteelblue: 0xb0c4de,\n    lightyellow: 0xffffe0,\n    lime: 0x00ff00,\n    limegreen: 0x32cd32,\n    linen: 0xfaf0e6,\n    magenta: 0xff00ff,\n    maroon: 0x800000,\n    mediumaquamarine: 0x66cdaa,\n    mediumblue: 0x0000cd,\n    mediumorchid: 0xba55d3,\n    mediumpurple: 0x9370db,\n    mediumseagreen: 0x3cb371,\n    mediumslateblue: 0x7b68ee,\n    mediumspringgreen: 0x00fa9a,\n    mediumturquoise: 0x48d1cc,\n    mediumvioletred: 0xc71585,\n    midnightblue: 0x191970,\n    mintcream: 0xf5fffa,\n    mistyrose: 0xffe4e1,\n    moccasin: 0xffe4b5,\n    navajowhite: 0xffdead,\n    navy: 0x000080,\n    oldlace: 0xfdf5e6,\n    olive: 0x808000,\n    olivedrab: 0x6b8e23,\n    orange: 0xffa500,\n    orangered: 0xff4500,\n    orchid: 0xda70d6,\n    palegoldenrod: 0xeee8aa,\n    palegreen: 0x98fb98,\n    paleturquoise: 0xafeeee,\n    palevioletred: 0xdb7093,\n    papayawhip: 0xffefd5,\n    peachpuff: 0xffdab9,\n    peru: 0xcd853f,\n    pink: 0xffc0cb,\n    plum: 0xdda0dd,\n    powderblue: 0xb0e0e6,\n    purple: 0x800080,\n    rebeccapurple: 0x663399,\n    red: 0xff0000,\n    rosybrown: 0xbc8f8f,\n    royalblue: 0x4169e1,\n    saddlebrown: 0x8b4513,\n    salmon: 0xfa8072,\n    sandybrown: 0xf4a460,\n    seagreen: 0x2e8b57,\n    seashell: 0xfff5ee,\n    sienna: 0xa0522d,\n    silver: 0xc0c0c0,\n    skyblue: 0x87ceeb,\n    slateblue: 0x6a5acd,\n    slategray: 0x708090,\n    slategrey: 0x708090,\n    snow: 0xfffafa,\n    springgreen: 0x00ff7f,\n    steelblue: 0x4682b4,\n    tan: 0xd2b48c,\n    teal: 0x008080,\n    thistle: 0xd8bfd8,\n    tomato: 0xff6347,\n    turquoise: 0x40e0d0,\n    violet: 0xee82ee,\n    wheat: 0xf5deb3,\n    white: 0xffffff,\n    whitesmoke: 0xf5f5f5,\n    yellow: 0xffff00,\n    yellowgreen: 0x9acd32\n};\n(0, _defineJsDefault.default)(Color, color, {\n    copy: function(channels) {\n        return Object.assign(new this.constructor, this, channels);\n    },\n    displayable: function() {\n        return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    formatHex: color_formatHex,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n});\nfunction color_formatHex() {\n    return this.rgb().formatHex();\n}\nfunction color_formatHsl() {\n    return hslConvert(this).formatHsl();\n}\nfunction color_formatRgb() {\n    return this.rgb().formatRgb();\n}\nfunction color(format) {\n    var m, l;\n    format = (format + \"\").trim().toLowerCase();\n    return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n     : l === 3 ? new Rgb(m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, (m & 0xf) << 4 | m & 0xf, 1) // #f00\n     : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n     : l === 4 ? rgba(m >> 12 & 0xf | m >> 8 & 0xf0, m >> 8 & 0xf | m >> 4 & 0xf0, m >> 4 & 0xf | m & 0xf0, ((m & 0xf) << 4 | m & 0xf) / 0xff) // #f000\n     : null // invalid hex\n    ) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n     : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n     : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n     : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n     : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n     : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n     : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n     : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n}\nexports.default = color;\nfunction rgbn(n) {\n    return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\nfunction rgba(r, g, b, a) {\n    if (a <= 0) r = g = b = NaN;\n    return new Rgb(r, g, b, a);\n}\nfunction rgbConvert(o) {\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Rgb;\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n}\nfunction rgb(r, g, b, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\nfunction Rgb(r, g, b, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Rgb, rgb, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb: function() {\n        return this;\n    },\n    displayable: function() {\n        return -0.5 <= this.r && this.r < 255.5 && -0.5 <= this.g && this.g < 255.5 && -0.5 <= this.b && this.b < 255.5 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    hex: rgb_formatHex,\n    formatHex: rgb_formatHex,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n}));\nfunction rgb_formatHex() {\n    return \"#\" + hex(this.r) + hex(this.g) + hex(this.b);\n}\nfunction rgb_formatRgb() {\n    var a = this.opacity;\n    a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n    return (a === 1 ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a === 1 ? \")\" : \", \" + a + \")\");\n}\nfunction hex(value) {\n    value = Math.max(0, Math.min(255, Math.round(value) || 0));\n    return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\nfunction hsla(h, s, l, a) {\n    if (a <= 0) h = s = l = NaN;\n    else if (l <= 0 || l >= 1) h = s = NaN;\n    else if (s <= 0) h = NaN;\n    return new Hsl(h, s, l, a);\n}\nfunction hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color)) o = color(o);\n    if (!o) return new Hsl;\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n    if (s) {\n        if (r === max) h = (g - b) / s + (g < b) * 6;\n        else if (g === max) h = (b - r) / s + 2;\n        else h = (r - g) / s + 4;\n        s /= l < 0.5 ? max + min : 2 - max - min;\n        h *= 60;\n    } else s = l > 0 && l < 1 ? 0 : h;\n    return new Hsl(h, s, l, o.opacity);\n}\nfunction hsl(h, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\nfunction Hsl(h, s, l, opacity) {\n    this.h = +h;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n}\n(0, _defineJsDefault.default)(Hsl, hsl, (0, _defineJs.extend)(Color, {\n    brighter: function(k) {\n        k = k == null ? brighter : Math.pow(brighter, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker: function(k) {\n        k = k == null ? darker : Math.pow(darker, k);\n        return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb: function() {\n        var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n        return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n    },\n    displayable: function() {\n        return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n    },\n    formatHsl: function() {\n        var a = this.opacity;\n        a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));\n        return (a === 1 ? \"hsl(\" : \"hsla(\") + (this.h || 0) + \", \" + (this.s || 0) * 100 + \"%, \" + (this.l || 0) * 100 + \"%\" + (a === 1 ? \")\" : \", \" + a + \")\");\n    }\n}));\n/* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) {\n    return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255;\n}\n\n},{\"./define.js\":\"5LoNF\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"5LoNF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"extend\", ()=>extend);\nexports.default = function(constructor, factory, prototype) {\n    constructor.prototype = factory.prototype = prototype;\n    prototype.constructor = constructor;\n};\nfunction extend(parent, definition) {\n    var prototype = Object.create(parent.prototype);\n    for(var key in definition)prototype[key] = definition[key];\n    return prototype;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dFLCZ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getLayers\", ()=>getLayers);\nparcelHelpers.export(exports, \"getCubeLayer\", ()=>getCubeLayer);\nparcelHelpers.export(exports, \"getCubes\", ()=>getCubes);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _array = require(\"./array\");\nvar _base = require(\"./base\");\nvar _constants = require(\"./constants\");\nvar _cubeLayer = require(\"./cube-layer/cube-layer\");\nvar _easing = require(\"./easing\");\nfunction getLayers(presenter, config, stage, lightSettings /*LightSettings*/ , lightingMix, interpolator, guideLines) {\n    const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n    const { x , y , z  } = stage.axes;\n    const lines = (0, _array.concat)(stage.gridLines, guideLines);\n    const texts = [\n        ...stage.textData\n    ];\n    [\n        x,\n        y,\n        z\n    ].forEach((axes)=>{\n        axes.forEach((axis)=>{\n            if (axis.domain) lines.push(axis.domain);\n            if (axis.ticks) lines.push.apply(lines, axis.ticks);\n            if (axis.tickText) texts.push.apply(texts, axis.tickText);\n            if (axis.title) texts.push(axis.title);\n        });\n    });\n    let characterSet;\n    if (config.getCharacterSet) characterSet = config.getCharacterSet(stage);\n    else //Basic symbols, numbers, and uppercase / lowercase alphabet\n    characterSet = new Array(95).fill(1).map((_, i)=>String.fromCharCode(32 + i));\n    if (stage.facets) stage.facets.forEach((f)=>{\n        if (f.lines) lines.push.apply(lines, f.lines);\n    });\n    const lineLayer = newLineLayer((0, _constants.layerNames).lines, lines);\n    const textLayer = newTextLayer(presenter, (0, _constants.layerNames).text, texts, config, presenter.style.fontFamily, characterSet);\n    const pathLayer = newPathLayer((0, _constants.layerNames).paths, stage.pathData);\n    const polygonLayer = newPolygonLayer((0, _constants.layerNames).polygons, stage.polygonData);\n    return [\n        textLayer,\n        cubeLayer,\n        lineLayer,\n        pathLayer,\n        polygonLayer\n    ];\n}\nfunction newCubeLayer(presenter, config, cubeData, highlightColor, lightSettings /*LightSettings*/ , lightingMix, interpolator) {\n    const getPosition = getTiming(config.transitionDurations.position, (0, _easing.easing));\n    const getSize = getTiming(config.transitionDurations.size, (0, _easing.easing));\n    const getColor = getTiming(config.transitionDurations.color);\n    const cubeLayerProps = {\n        interpolator,\n        lightingMix,\n        id: (0, _constants.layerNames).cubes,\n        data: cubeData,\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        pickable: true,\n        autoHighlight: true,\n        highlightColor,\n        onClick: (o, e)=>{\n            config.onCubeClick(e && e.srcEvent, o.object);\n        },\n        onHover: (o, e)=>{\n            if (o.index === -1) {\n                presenter.deckgl.interactiveState.onCube = false;\n                config.onCubeHover(e && e.srcEvent, null);\n            } else {\n                presenter.deckgl.interactiveState.onCube = true;\n                config.onCubeHover(e && e.srcEvent, o.object);\n            }\n        },\n        //lightSettings,\n        transitions: {\n            getPosition,\n            getColor,\n            getSize\n        }\n    };\n    return new (0, _cubeLayer.CubeLayer)(cubeLayerProps);\n}\nfunction newLineLayer(id, data) {\n    return new (0, _base.base).layers.LineLayer({\n        id,\n        data,\n        widthUnits: \"pixels\",\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getColor: (o)=>o.color,\n        getWidth: (o)=>o.strokeWidth\n    });\n}\nfunction newPathLayer(id, data) {\n    if (!data) return null;\n    return new (0, _base.base).layers.PathLayer({\n        id,\n        data,\n        billboard: true,\n        widthScale: 1,\n        widthMinPixels: 2,\n        widthUnits: \"pixels\",\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getPath: (o)=>o.positions,\n        getColor: (o)=>o.strokeColor,\n        getWidth: (o)=>o.strokeWidth\n    });\n}\nfunction newPolygonLayer(id, data) {\n    if (!data) return null;\n    const newlayer = new (0, _base.base).layers.PolygonLayer({\n        id,\n        data,\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        getPolygon: (o)=>o.positions,\n        getFillColor: (o)=>o.fillColor,\n        getLineColor: (o)=>o.strokeColor,\n        wireframe: false,\n        filled: true,\n        stroked: true,\n        pickable: true,\n        extruded: true,\n        getElevation: (o)=>o.depth,\n        getLineWidth: (o)=>o.strokeWidth\n    });\n    return newlayer;\n}\nfunction newTextLayer(presenter, id, data, config, fontFamily, characterSet) {\n    let alphaCutoff = config.getTextHighlightAlphaCutoff && config.getTextHighlightAlphaCutoff();\n    if (alphaCutoff === undefined) alphaCutoff = 0.1;\n    const props = {\n        id,\n        data,\n        characterSet,\n        coordinateSystem: (0, _base.base).deck.COORDINATE_SYSTEM.CARTESIAN,\n        sizeUnits: \"pixels\",\n        autoHighlight: true,\n        pickable: true,\n        highlightColor: (p)=>{\n            if (config.getTextHighlightColor) return config.getTextHighlightColor(p.object);\n            else return [\n                0,\n                0,\n                0,\n                0\n            ];\n        },\n        onClick: (o, e)=>{\n            const pe = e && e.srcEvent;\n            config.onTextClick && config.onTextClick(pe, o.object);\n        },\n        onHover: (o, e)=>{\n            if (o.index === -1) presenter.deckgl.interactiveState.onText = false;\n            else presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object) : true;\n        },\n        getColor: config.getTextColor || ((o)=>o.color),\n        getTextAnchor: (o)=>o.textAnchor,\n        getSize: (o)=>o.size,\n        getAngle: (o)=>o.angle,\n        fontSettings: {\n            sdf: false,\n            fontSize: 128,\n            buffer: 3\n        },\n        _subLayerProps: {\n            characters: {\n                alphaCutoff\n            }\n        }\n    };\n    if (fontFamily) props.fontFamily = fontFamily;\n    return new (0, _base.base).layers.TextLayer(props);\n}\nfunction getTiming(duration, easing) {\n    let timing;\n    if (duration) {\n        timing = {\n            duration,\n            type: \"interpolation\"\n        };\n        if (easing) timing.easing = easing;\n    }\n    return timing;\n}\nfunction getCubeLayer(deckProps) {\n    return deckProps.layers.filter((layer)=>layer && layer.id === (0, _constants.layerNames).cubes)[0];\n}\nfunction getCubes(deckProps) {\n    const cubeLayer = getCubeLayer(deckProps);\n    if (!cubeLayer) return;\n    const cubeLayerProps = cubeLayer.props;\n    return cubeLayerProps.data;\n}\n\n},{\"./array\":\"9ipvJ\",\"./base\":\"bgAmf\",\"./constants\":\"9JE81\",\"./cube-layer/cube-layer\":\"2xAjB\",\"./easing\":\"8LZVN\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bgAmf\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"base\", ()=>base);\n/**\n * Specify the dependency libraries to use for rendering.\n * @param vega Vega library.\n * @param deck deck/core library.\n * @param layers deck/layers library.\n * @param luma luma.gl library.\n */ parcelHelpers.export(exports, \"use\", ()=>use);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ const vega = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null\n};\nconst deck = {\n    _CameraLight: null,\n    AmbientLight: null,\n    CompositeLayer: null,\n    COORDINATE_SYSTEM: null,\n    Deck: null,\n    DirectionalLight: null,\n    Layer: null,\n    LightingEffect: null,\n    LinearInterpolator: null,\n    OrbitView: null,\n    OrbitController: null,\n    gouraudLighting: null,\n    picking: null,\n    project32: null\n};\nconst layers = {\n    IconLayer: null,\n    LineLayer: null,\n    PathLayer: null,\n    PolygonLayer: null,\n    TextLayer: null\n};\nconst luma = {\n    CubeGeometry: null,\n    Model: null,\n    Texture2D: null\n};\nconst base = {\n    deck,\n    layers,\n    luma,\n    vega\n};\nfunction use(vega1, deck1, layers1, luma1) {\n    base.deck = deck1;\n    base.layers = layers1;\n    base.luma = luma1;\n    base.vega = vega1;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2xAjB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"CubeLayer\", ()=>CubeLayer);\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n// Adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/layers/src/grid-cell-layer/grid-cell-layer.js\nvar _cubeLayerFragmentGlsl = require(\"./cube-layer-fragment.glsl\");\nvar _cubeLayerFragmentGlslDefault = parcelHelpers.interopDefault(_cubeLayerFragmentGlsl);\nvar _cubeLayerVertexGlsl = require(\"./cube-layer-vertex.glsl\");\nvar _cubeLayerVertexGlslDefault = parcelHelpers.interopDefault(_cubeLayerVertexGlsl);\nvar _base = require(\"../base\");\n//https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\nconst UNSIGNED_BYTE = 0x1401;\nconst DOUBLE = 0x140a;\nconst DEFAULT_COLOR = [\n    255,\n    0,\n    255,\n    255\n];\nconst defaultProps = {\n    lightingMix: 0.5,\n    getSize: (x)=>x.size,\n    getPosition: (x)=>x.position,\n    getColor: (x)=>x.color,\n    material: {\n        ambient: 0.5,\n        diffuse: 1\n    }\n};\nfunction _CubeLayer(props1) {\n    //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n    class __CubeLayer extends (0, _base.base).deck.Layer {\n        getShaders() {\n            return {\n                vs: (0, _cubeLayerVertexGlslDefault.default),\n                fs: (0, _cubeLayerFragmentGlslDefault.default),\n                modules: [\n                    (0, _base.base).deck.project32,\n                    (0, _base.base).deck.gouraudLighting,\n                    (0, _base.base).deck.picking\n                ]\n            };\n        }\n        initializeState() {\n            const attributeManager = this.getAttributeManager();\n            attributeManager.addInstanced({\n                instancePositions: {\n                    size: 3,\n                    type: DOUBLE,\n                    transition: true,\n                    accessor: \"getPosition\"\n                },\n                instanceSizes: {\n                    size: 3,\n                    transition: true,\n                    accessor: \"getSize\"\n                },\n                instanceColors: {\n                    size: 4,\n                    type: UNSIGNED_BYTE,\n                    transition: true,\n                    accessor: \"getColor\",\n                    defaultValue: DEFAULT_COLOR\n                }\n            });\n        }\n        updateState({ props , oldProps , changeFlags  }) {\n            super.updateState({\n                props,\n                oldProps,\n                changeFlags\n            }); //TODO add parameter type to deck.gl-typings\n            // Re-generate model if geometry changed\n            //if (props.fp64 !== oldProps.fp64) {\n            const { gl  } = this.context;\n            if (this.state.model) this.state.model.delete();\n            this.setState({\n                model: this._getModel(gl)\n            });\n            this.getAttributeManager().invalidateAll();\n        //}\n        }\n        _getModel(gl) {\n            return new (0, _base.base).luma.Model(gl, Object.assign({}, this.getShaders(), {\n                id: this.props.id,\n                geometry: new (0, _base.base).luma.CubeGeometry(),\n                isInstanced: true\n            }));\n        }\n        draw({ uniforms  }) {\n            let { lightingMix  } = this.props;\n            if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n            this.state.model.setUniforms(Object.assign({}, uniforms, {\n                lightingMix\n            })).draw();\n        }\n    }\n    __CubeLayer.layerName = \"CubeLayer\";\n    __CubeLayer.defaultProps = defaultProps;\n    const instance = new __CubeLayer(props1);\n    return instance;\n}\nconst CubeLayer = _CubeLayer;\n\n},{\"./cube-layer-fragment.glsl\":\"63x0c\",\"./cube-layer-vertex.glsl\":\"g3DUd\",\"../base\":\"bgAmf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"63x0c\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nexports.default = `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"g3DUd\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\nvar _defaults = require(\"../defaults\");\nexports.default = `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec3 instancePositions64Low;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${(0, _defaults.minPixelSize).toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${(0, _defaults.minPixelSize).toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_size(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_size(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_size(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset, position_worldspace);\n  \n  vec3 lightColor = lighting_getLightColor(instanceColors.rgb, project_uCameraPosition, position_worldspace.xyz, project_normal(normals));\n  vec3 mixedLight = mix(instanceColors.rgb, lightColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n\n},{\"../defaults\":\"2VC3T\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2VC3T\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"minHeight\", ()=>minHeight);\nparcelHelpers.export(exports, \"minWidth\", ()=>minWidth);\nparcelHelpers.export(exports, \"defaultPresenterStyle\", ()=>defaultPresenterStyle);\nparcelHelpers.export(exports, \"defaultPresenterConfig\", ()=>defaultPresenterConfig);\nparcelHelpers.export(exports, \"createStage\", ()=>createStage);\nparcelHelpers.export(exports, \"groupStrokeWidth\", ()=>groupStrokeWidth);\nparcelHelpers.export(exports, \"lineZ\", ()=>lineZ);\nparcelHelpers.export(exports, \"defaultView\", ()=>defaultView);\nparcelHelpers.export(exports, \"min3dDepth\", ()=>min3dDepth);\nparcelHelpers.export(exports, \"minPixelSize\", ()=>minPixelSize);\nconst minHeight = \"100px\";\nconst minWidth = \"100px\";\nconst defaultPresenterStyle = {\n    cssPrefix: \"vega-deckgl-\",\n    defaultCubeColor: [\n        128,\n        128,\n        128,\n        255\n    ],\n    highlightColor: [\n        0,\n        0,\n        0,\n        255\n    ]\n};\nconst defaultPresenterConfig = {\n    onCubeClick: (e, cube)=>{},\n    onCubeHover: (e, cube)=>{},\n    transitionDurations: {\n        color: 100,\n        position: 600,\n        size: 600,\n        view: 600\n    }\n};\nfunction createStage(view) {\n    const stage = {\n        view,\n        cubeData: [],\n        pathData: [],\n        polygonData: [],\n        axes: {\n            x: [],\n            y: [],\n            z: []\n        },\n        gridLines: [],\n        textData: [],\n        legend: {\n            rows: {}\n        },\n        facets: []\n    };\n    return stage;\n}\nconst groupStrokeWidth = 1;\nconst lineZ = -1;\nconst defaultView = \"2d\";\nconst min3dDepth = 0.05;\nconst minPixelSize = 0.5;\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8LZVN\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"easing\", ()=>easing);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _d3Ease = require(\"d3-ease\");\nfunction easing(t) {\n    if (t === 0 || t === 1) return t;\n    return (0, _d3Ease.easeExpInOut)(t);\n}\n\n},{\"d3-ease\":\"41M6m\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"41M6m\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"easeLinear\", ()=>(0, _linearJs.linear));\nparcelHelpers.export(exports, \"easeQuad\", ()=>(0, _quadJs.quadInOut));\nparcelHelpers.export(exports, \"easeQuadIn\", ()=>(0, _quadJs.quadIn));\nparcelHelpers.export(exports, \"easeQuadOut\", ()=>(0, _quadJs.quadOut));\nparcelHelpers.export(exports, \"easeQuadInOut\", ()=>(0, _quadJs.quadInOut));\nparcelHelpers.export(exports, \"easeCubic\", ()=>(0, _cubicJs.cubicInOut));\nparcelHelpers.export(exports, \"easeCubicIn\", ()=>(0, _cubicJs.cubicIn));\nparcelHelpers.export(exports, \"easeCubicOut\", ()=>(0, _cubicJs.cubicOut));\nparcelHelpers.export(exports, \"easeCubicInOut\", ()=>(0, _cubicJs.cubicInOut));\nparcelHelpers.export(exports, \"easePoly\", ()=>(0, _polyJs.polyInOut));\nparcelHelpers.export(exports, \"easePolyIn\", ()=>(0, _polyJs.polyIn));\nparcelHelpers.export(exports, \"easePolyOut\", ()=>(0, _polyJs.polyOut));\nparcelHelpers.export(exports, \"easePolyInOut\", ()=>(0, _polyJs.polyInOut));\nparcelHelpers.export(exports, \"easeSin\", ()=>(0, _sinJs.sinInOut));\nparcelHelpers.export(exports, \"easeSinIn\", ()=>(0, _sinJs.sinIn));\nparcelHelpers.export(exports, \"easeSinOut\", ()=>(0, _sinJs.sinOut));\nparcelHelpers.export(exports, \"easeSinInOut\", ()=>(0, _sinJs.sinInOut));\nparcelHelpers.export(exports, \"easeExp\", ()=>(0, _expJs.expInOut));\nparcelHelpers.export(exports, \"easeExpIn\", ()=>(0, _expJs.expIn));\nparcelHelpers.export(exports, \"easeExpOut\", ()=>(0, _expJs.expOut));\nparcelHelpers.export(exports, \"easeExpInOut\", ()=>(0, _expJs.expInOut));\nparcelHelpers.export(exports, \"easeCircle\", ()=>(0, _circleJs.circleInOut));\nparcelHelpers.export(exports, \"easeCircleIn\", ()=>(0, _circleJs.circleIn));\nparcelHelpers.export(exports, \"easeCircleOut\", ()=>(0, _circleJs.circleOut));\nparcelHelpers.export(exports, \"easeCircleInOut\", ()=>(0, _circleJs.circleInOut));\nparcelHelpers.export(exports, \"easeBounce\", ()=>(0, _bounceJs.bounceOut));\nparcelHelpers.export(exports, \"easeBounceIn\", ()=>(0, _bounceJs.bounceIn));\nparcelHelpers.export(exports, \"easeBounceOut\", ()=>(0, _bounceJs.bounceOut));\nparcelHelpers.export(exports, \"easeBounceInOut\", ()=>(0, _bounceJs.bounceInOut));\nparcelHelpers.export(exports, \"easeBack\", ()=>(0, _backJs.backInOut));\nparcelHelpers.export(exports, \"easeBackIn\", ()=>(0, _backJs.backIn));\nparcelHelpers.export(exports, \"easeBackOut\", ()=>(0, _backJs.backOut));\nparcelHelpers.export(exports, \"easeBackInOut\", ()=>(0, _backJs.backInOut));\nparcelHelpers.export(exports, \"easeElastic\", ()=>(0, _elasticJs.elasticOut));\nparcelHelpers.export(exports, \"easeElasticIn\", ()=>(0, _elasticJs.elasticIn));\nparcelHelpers.export(exports, \"easeElasticOut\", ()=>(0, _elasticJs.elasticOut));\nparcelHelpers.export(exports, \"easeElasticInOut\", ()=>(0, _elasticJs.elasticInOut));\nvar _linearJs = require(\"./linear.js\");\nvar _quadJs = require(\"./quad.js\");\nvar _cubicJs = require(\"./cubic.js\");\nvar _polyJs = require(\"./poly.js\");\nvar _sinJs = require(\"./sin.js\");\nvar _expJs = require(\"./exp.js\");\nvar _circleJs = require(\"./circle.js\");\nvar _bounceJs = require(\"./bounce.js\");\nvar _backJs = require(\"./back.js\");\nvar _elasticJs = require(\"./elastic.js\");\n\n},{\"./linear.js\":false,\"./quad.js\":false,\"./cubic.js\":false,\"./poly.js\":false,\"./sin.js\":false,\"./exp.js\":\"lRQd2\",\"./circle.js\":false,\"./bounce.js\":false,\"./back.js\":false,\"./elastic.js\":false,\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"lRQd2\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"expIn\", ()=>expIn);\nparcelHelpers.export(exports, \"expOut\", ()=>expOut);\nparcelHelpers.export(exports, \"expInOut\", ()=>expInOut);\nvar _mathJs = require(\"./math.js\");\nfunction expIn(t) {\n    return (0, _mathJs.tpmt)(1 - +t);\n}\nfunction expOut(t) {\n    return 1 - (0, _mathJs.tpmt)(t);\n}\nfunction expInOut(t) {\n    return ((t *= 2) <= 1 ? (0, _mathJs.tpmt)(1 - t) : 2 - (0, _mathJs.tpmt)(t - 1)) / 2;\n}\n\n},{\"./math.js\":\"hKyWI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hKyWI\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n// tpmt is two power minus ten times t scaled to [0,1]\nparcelHelpers.export(exports, \"tpmt\", ()=>tpmt);\nfunction tpmt(x) {\n    return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"483nJ\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Class which presents a Stage of chart data using Deck.gl to render.\n */ parcelHelpers.export(exports, \"Presenter\", ()=>Presenter);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"./base\");\nvar _clone = require(\"./clone\");\nvar _color = require(\"./color\");\nvar _deckgl = require(\"./deck.gl-classes/deckgl\");\nvar _linearInterpolator = require(\"./deck.gl-classes/linearInterpolator\");\nvar _defaults = require(\"./defaults\");\nvar _easing = require(\"./easing\");\nvar _effects = require(\"./effects\");\nvar _enums = require(\"./enums\");\nvar _layers = require(\"./layers\");\nvar _legend = require(\"./legend\");\nvar _rule = require(\"./marks/rule\");\nvar _panel = require(\"./panel\");\nvar _patchedCubeArray = require(\"./patchedCubeArray\");\nvar _stagers = require(\"./stagers\");\nvar _viewState = require(\"./viewState\");\nvar _tsxCreateElement = require(\"tsx-create-element\");\nclass Presenter {\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */ constructor(el, style){\n        this.el = el;\n        this.style = (0, _clone.deepMerge)((0, _defaults.defaultPresenterStyle), style);\n        (0, _panel.initializePanel)(this);\n        this._last = {\n            view: null,\n            height: null,\n            width: null,\n            cubeCount: null,\n            stage: null\n        };\n    }\n    /**\n     * Get the previously rendered Stage object.\n     */ get stage() {\n        return this._last.stage;\n    }\n    /**\n     * Get the current View camera type.\n     */ get view() {\n        return this._last.view;\n    }\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */ animationCancel() {\n        if (this.animationTimer) {\n            clearTimeout(this.animationTimer);\n            this.animationTimer = null;\n            if (this.logger) this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || \"handler\"}`);\n            if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) this.queuedAnimationOptions.animationCanceled.call(null);\n        }\n    }\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */ animationQueue(handler, timeout, options) {\n        if (this.logger) this.logger(`queueing animation ${options && options.waitingLabel || \"waiting\"}...`);\n        this.animationCancel();\n        this.animationTimer = setTimeout(()=>{\n            if (this.logger) this.logger(`queueing animation ${options && options.handlerLabel || \"handler\"}...`);\n            handler();\n        }, timeout);\n    }\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */ getElement(type) {\n        const elements = this.el.getElementsByClassName((0, _panel.className)(type, this));\n        if (elements && elements.length) return elements[0];\n    }\n    /**\n     * Present the Vega Scene, or Stage object using Deck.gl.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area.\n     * @param config Optional presentation configuration object.\n     */ present(sceneOrStage, height, width, config) {\n        this.animationCancel();\n        const scene = sceneOrStage;\n        let stage;\n        const options = {\n            maxOrdinal: 0,\n            currAxis: null,\n            defaultCubeColor: this.style.defaultCubeColor,\n            assignCubeOrdinal: (config === null || config === void 0 ? void 0 : config.onSceneRectAssignCubeOrdinal) || (()=>options.maxOrdinal++),\n            zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n        };\n        //determine if this is a vega scene\n        if (scene.marktype) {\n            stage = (0, _defaults.createStage)(scene.view);\n            (0, _stagers.sceneToStage)(options, stage, scene);\n        } else stage = sceneOrStage;\n        if (!this.deckgl) {\n            const classes = (0, _deckgl.createDeckGLClassesForPresenter)({\n                doubleClickHandler: ()=>{\n                    this.homeCamera();\n                }\n            });\n            this.OrbitControllerClass = classes.OrbitControllerClass;\n            const initialViewState = (0, _viewState.targetViewState)(height, width, stage.view);\n            let glOptions;\n            if (config && config.preserveDrawingBuffer) glOptions = {\n                preserveDrawingBuffer: true\n            };\n            const deckProps = {\n                glOptions,\n                height: null,\n                width: null,\n                effects: (0, _effects.lightingEffects)(),\n                layers: [],\n                onClick: config && config.onLayerClick,\n                views: [\n                    new (0, _base.base).deck.OrbitView({\n                        controller: (0, _base.base).deck.OrbitController\n                    })\n                ],\n                initialViewState,\n                container: this.getElement((0, _enums.PresenterElement).gl),\n                getCursor: (interactiveState)=>{\n                    if (interactiveState.onText || interactiveState.onAxisSelection) return \"pointer\";\n                    else if (interactiveState.onCube) return \"default\";\n                    else return \"grab\";\n                }\n            };\n            if (stage.backgroundColor) deckProps.style = {\n                \"background-color\": (0, _color.colorToString)(stage.backgroundColor)\n            };\n            this.deckgl = new classes.DeckGL_Class(deckProps);\n        }\n        let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n        if (options.maxOrdinal) {\n            cubeCount = Math.max(cubeCount, options.maxOrdinal);\n            const empty = {\n                isEmpty: true,\n                color: [\n                    0,\n                    0,\n                    0,\n                    0\n                ]\n            };\n            stage.cubeData = (0, _patchedCubeArray.patchCubeArray)(cubeCount, empty, stage.cubeData);\n        }\n        this.setDeckProps(stage, height, width, cubeCount, config);\n        const a = (0, _tsxCreateElement.getActiveElementInfo)();\n        (0, _tsxCreateElement.mount)((0, _legend.LegendView)({\n            legend: stage.legend,\n            onClick: config && config.onLegendClick\n        }), this.getElement((0, _enums.PresenterElement).legend));\n        (0, _tsxCreateElement.setActiveElement)(a);\n        if (config && config.onPresent) config.onPresent();\n    }\n    /**\n     * Present the same recently rendered Stage with only slight modifications such as a color change,\n     * using the previous Stage values as a basis.\n     * @param stage Partially populated Stage object containing changes.\n     * @param modifyConfig Optional presentation configuration object.\n     */ rePresent(stage, modifyConfig) {\n        const newStage = Object.assign(Object.assign({}, this._last.stage), stage);\n        this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n    }\n    isNewBounds(view, height, width, cubeCount) {\n        const lastBounds = this.lastBounds();\n        for(const prop in lastBounds){\n            if (lastBounds[prop] === null) return true;\n        }\n        const newBounds = {\n            cubeCount,\n            height,\n            view,\n            width\n        };\n        for(const prop1 in lastBounds){\n            if (lastBounds[prop1] !== newBounds[prop1]) return true;\n        }\n    }\n    lastBounds() {\n        const { cubeCount , height , view , width  } = this._last;\n        return {\n            cubeCount,\n            height,\n            view,\n            width\n        };\n    }\n    setDeckProps(stage, height, width, cubeCount, modifyConfig) {\n        const config = (0, _clone.deepMerge)((0, _defaults.defaultPresenterConfig), modifyConfig);\n        const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n        //let lightSettings = this.style.lightSettings[stage.view];\n        const lightingMix = stage.view === \"3d\" ? 1.0 : 0.0;\n        let linearInterpolator;\n        //choose the current OrbitView viewstate if possible\n        let viewState = this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView || this.deckgl.props.viewState;\n        if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n            let newViewStateTarget = true;\n            if (config && config.onTargetViewState) {\n                const result = config.onTargetViewState(height, width);\n                height = result.height;\n                width = result.width;\n                if (result.newViewStateTarget !== undefined) newViewStateTarget = result.newViewStateTarget;\n            }\n            if (!viewState || newViewStateTarget) viewState = (0, _viewState.targetViewState)(height, width, stage.view);\n            const oldCubeLayer = (0, _layers.getCubeLayer)(this.deckgl.props);\n            if (oldCubeLayer) {\n                linearInterpolator = new (0, _linearInterpolator.LinearInterpolator)((0, _viewState.viewStateProps));\n                linearInterpolator.layerStartProps = {\n                    lightingMix: oldCubeLayer.props.lightingMix\n                };\n                linearInterpolator.layerEndProps = {\n                    lightingMix\n                };\n                viewState.transitionDuration = config.transitionDurations.view;\n                viewState.transitionEasing = (0, _easing.easing);\n                viewState.transitionInterpolator = linearInterpolator;\n            }\n            stage.view;\n        }\n        const guideLines = this._showGuides && (0, _rule.box)(0, 0, height, width, \"#0f0\", 1, true);\n        config.preLayer && config.preLayer(stage);\n        const layers = (0, _layers.getLayers)(this, config, stage, /*lightSettings*/ null, lightingMix, linearInterpolator, guideLines);\n        const deckProps = {\n            effects: (0, _effects.lightingEffects)(),\n            views: [\n                new (0, _base.base).deck.OrbitView({\n                    controller: (0, _base.base).deck.OrbitController\n                })\n            ],\n            initialViewState: viewState,\n            layers\n        };\n        if (config && config.preStage) config.preStage(stage, deckProps);\n        requestAnimationFrame(()=>this.deckgl.setProps(Object.assign(Object.assign({}, deckProps), {\n                onAfterRender: ()=>{\n                    if (this._afterRenderHandler) this._afterRenderHandler();\n                }\n            })));\n        delete stage.cubeData;\n        this._last = {\n            cubeCount,\n            height,\n            width,\n            stage: stage,\n            view: stage.view\n        };\n    }\n    canvasToDataURL() {\n        return new Promise((resolve, reject)=>{\n            this._afterRenderHandler = ()=>{\n                this._afterRenderHandler = null;\n                const png = this.deckgl.canvas.toDataURL(\"image/png\");\n                resolve(png);\n            };\n        });\n    }\n    /**\n     * Home the camera to the last initial position.\n     */ homeCamera() {\n        const viewState = (0, _viewState.targetViewState)(this._last.height, this._last.width, this._last.view);\n        viewState.transitionDuration = (0, _defaults.defaultPresenterConfig).transitionDurations.view;\n        viewState.transitionEasing = (0, _easing.easing);\n        viewState.transitionInterpolator = new (0, _linearInterpolator.LinearInterpolator)((0, _viewState.viewStateProps));\n        const deckProps = {\n            effects: (0, _effects.lightingEffects)(),\n            views: this.deckgl.props.views,\n            initialViewState: viewState,\n            layers: this.deckgl.props.layers\n        };\n        this.deckgl.setProps(deckProps);\n    }\n    /**\n     * Get cube data array from the cubes layer.\n     */ getCubeData() {\n        return (0, _layers.getCubes)(this.deckgl.props);\n    }\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */ showGuides() {\n        this._showGuides = true;\n        this.getElement((0, _enums.PresenterElement).gl).classList.add(\"show-center\");\n        this.rePresent(Object.assign(Object.assign({}, this._last.stage), {\n            cubeData: this.getCubeData()\n        }));\n    }\n    finalize() {\n        this.animationCancel();\n        if (this.deckgl) this.deckgl.finalize();\n        if (this.el) this.el.innerHTML = \"\";\n        this._last = null;\n        this.deckgl = null;\n        this.el = null;\n        this.logger = null;\n        this.queuedAnimationOptions = null;\n    }\n}\n\n},{\"./base\":\"bgAmf\",\"./clone\":\"iXJRs\",\"./color\":\"1dPRr\",\"./deck.gl-classes/deckgl\":\"87MlB\",\"./deck.gl-classes/linearInterpolator\":\"fCpPo\",\"./defaults\":\"2VC3T\",\"./easing\":\"8LZVN\",\"./effects\":\"e492i\",\"./enums\":\"gGAEP\",\"./layers\":\"dFLCZ\",\"./legend\":\"1PiRU\",\"./marks/rule\":\"6xovX\",\"./panel\":\"4Dg9o\",\"./patchedCubeArray\":\"gnP4f\",\"./stagers\":\"72W8V\",\"./viewState\":\"hENsH\",\"tsx-create-element\":\"45tGW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"87MlB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Creates Deck.gl classes for rendering WebGL.\n * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n */ parcelHelpers.export(exports, \"createDeckGLClassesForPresenter\", ()=>createDeckGLClassesForPresenter);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\nvar _orbitController = require(\"./orbitController\");\n//adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\nconst CANVAS_STYLE = {\n    position: \"absolute\",\n    left: 0,\n    top: 0,\n    width: \"100%\",\n    height: \"100%\"\n};\n// Create canvas elements for map and deck\nfunction createCanvas(props) {\n    let { container =document.body  } = props;\n    if (typeof container === \"string\") container = document.getElementById(container);\n    if (!container) throw Error(\"Deck: container not found\");\n    // Add DOM elements\n    const containerStyle = window.getComputedStyle(container);\n    if (containerStyle.position === \"static\") container.style.position = \"relative\";\n    const deckCanvas = document.createElement(\"canvas\");\n    container.appendChild(deckCanvas);\n    Object.assign(deckCanvas.style, CANVAS_STYLE);\n    return {\n        container,\n        deckCanvas\n    };\n}\nfunction createDeckGLClassesForPresenter(factoryOptions) {\n    const OrbitControllerClass = (0, _orbitController.createOrbitControllerClass)(factoryOptions);\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n    function wrapper(props1) {\n        /**\n         * @params container (Element) - DOM element to add deck.gl canvas to\n         * @params controller (Object) - Controller class. Leave empty for auto detection\n         */ class DeckGLInternal extends (0, _base.base).deck.Deck {\n            constructor(props){\n                if (typeof document === \"undefined\") // Not browser\n                throw Error(\"Deck can only be used in the browser\");\n                const { deckCanvas  } = createCanvas(props);\n                const viewState = props.initialViewState || props.viewState || {};\n                super(Object.assign({}, props, {\n                    width: \"100%\",\n                    height: \"100%\",\n                    canvas: deckCanvas,\n                    controller: OrbitControllerClass,\n                    initialViewState: viewState\n                }));\n                // Callback for the controller\n                this._updateViewState = (params)=>{\n                    if (this.onViewStateChange) this.onViewStateChange(params);\n                };\n            }\n            setProps(props) {\n                // this._updateViewState must be bound to `this`\n                // but we don't have access to the current instance before calling super().\n                if (\"onViewStateChange\" in props && this._updateViewState) {\n                    // This is called at least once at _onRendererInitialized\n                    this.onViewStateChange = props.onViewStateChange;\n                    props.onViewStateChange = this._updateViewState;\n                }\n                super.setProps(props);\n            }\n        }\n        const instance = new DeckGLInternal(props1);\n        return instance;\n    }\n    return {\n        OrbitControllerClass,\n        DeckGL_Class: wrapper\n    };\n}\n\n},{\"../base\":\"bgAmf\",\"./orbitController\":\"drHQk\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"drHQk\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"createOrbitControllerClass\", ()=>createOrbitControllerClass);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\nfunction createOrbitControllerClass(factoryOptions) {\n    function wrapper(props1) {\n        class OrbitControllerInternal extends (0, _base.base).deck.OrbitController {\n            constructor(props){\n                super(props);\n                this.invertPan = true;\n            }\n            handleEvent(event) {\n                if (event.type === \"doubletap\") {\n                    if (factoryOptions && factoryOptions.doubleClickHandler) return factoryOptions.doubleClickHandler(event, this);\n                }\n                return super.handleEvent(event);\n            }\n        }\n        const instance = new OrbitControllerInternal(props1);\n        return instance;\n    }\n    return wrapper;\n}\n\n},{\"../base\":\"bgAmf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fCpPo\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LinearInterpolator\", ()=>LinearInterpolator);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\nfunction wrapper(props) {\n    class LinearInterpolatorInternal extends (0, _base.base).deck.LinearInterpolator {\n        constructor(transitionProps){\n            super(transitionProps);\n        }\n        interpolateProps(viewStateStartProps, viewStateEndProps, t) {\n            if (this.layerStartProps && this.layerEndProps) this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n            return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n        }\n    }\n    const instance = new LinearInterpolatorInternal(props);\n    return instance;\n}\nconst LinearInterpolator = wrapper;\n\n},{\"../base\":\"bgAmf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e492i\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"lightingEffects\", ()=>lightingEffects);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"./base\");\nfunction lightingEffects() {\n    const ambientLight = new (0, _base.base).deck.AmbientLight({\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 0.3\n    });\n    const cameraLight = new (0, _base.base).deck._CameraLight({\n        color: [\n            255,\n            255,\n            255\n        ],\n        intensity: 1\n    });\n    // const directionalLight = new base.deck.DirectionalLight({\n    //     color: [255, 255, 255],\n    //     direction: [0, 0, -1],\n    //     intensity: 0.2\n    //   });\n    return [\n        new (0, _base.base).deck.LightingEffect({\n            ambientLight,\n            cameraLight\n        })\n    ];\n}\n\n},{\"./base\":\"bgAmf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gGAEP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"PresenterElement\", ()=>PresenterElement);\nvar PresenterElement;\n(function(PresenterElement1) {\n    PresenterElement1[PresenterElement1[\"root\"] = 0] = \"root\";\n    PresenterElement1[PresenterElement1[\"gl\"] = 1] = \"gl\";\n    PresenterElement1[PresenterElement1[\"panel\"] = 2] = \"panel\";\n    PresenterElement1[PresenterElement1[\"legend\"] = 3] = \"legend\";\n    PresenterElement1[PresenterElement1[\"vegaControls\"] = 4] = \"vegaControls\";\n})(PresenterElement || (PresenterElement = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1PiRU\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"LegendView\", ()=>LegendView);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _tsxCreateElement = require(\"tsx-create-element\");\nvar _controls = require(\"./controls\");\nconst LegendView = (props)=>{\n    const rows = [];\n    const addRow = (row, i)=>{\n        const fn = symbolMap[row.symbol.shape];\n        let jsx;\n        if (fn) jsx = fn(row.symbol);\n        else jsx = (0, _tsxCreateElement.createElement)(\"span\", null, \"x\");\n        rows.push({\n            cells: [\n                {\n                    className: \"symbol\",\n                    content: jsx\n                },\n                {\n                    className: \"label\",\n                    content: row.label,\n                    title: row.label\n                }, \n            ]\n        });\n    };\n    const sorted = Object.keys(props.legend.rows).sort((a, b)=>+a - +b);\n    sorted.forEach((i)=>addRow(props.legend.rows[i], +i));\n    if (sorted.length) return (0, _tsxCreateElement.createElement)((0, _controls.Table), {\n        rows: rows,\n        rowClassName: \"legend-row\",\n        onRowClick: (e, i)=>props.onClick(e, props.legend, i)\n    }, props.legend.title !== undefined && (0, _tsxCreateElement.createElement)(\"tr\", {\n        tabIndex: props.onClick ? 0 : -1,\n        onClick: (e)=>props.onClick(e, props.legend, null),\n        onKeyUp: (e)=>{\n            if (e.key === (0, _controls.KeyCodes).ENTER && props.onClick) props.onClick(e, props.legend, null);\n        }\n    }, (0, _tsxCreateElement.createElement)(\"th\", {\n        colSpan: 2\n    }, props.legend.title)));\n};\nconst symbolMap = {\n    square: function(symbol) {\n        return (0, _tsxCreateElement.createElement)(\"div\", {\n            style: {\n                height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                backgroundColor: symbol.fill,\n                borderColor: symbol.fill\n            }\n        });\n    }\n};\n\n},{\"tsx-create-element\":\"45tGW\",\"./controls\":\"4QI3M\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6xovX\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"box\", ()=>box);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\nvar _color = require(\"../color\");\nvar _defaults = require(\"../defaults\");\nvar _zaxis = require(\"../zaxis\");\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, _base.base).vega.sceneVisit(scene, function(item) {\n        const x1 = item.x || 0;\n        const y1 = item.y || 0;\n        const x2 = item.x2 != null ? item.x2 : x1;\n        const y2 = item.y2 != null ? item.y2 : y1;\n        const lineItem = styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n        if (item.mark.role === \"axis-tick\") {\n            if (options.currAxis.role === \"z\") {\n                (0, _zaxis.zSwap)(lineItem.sourcePosition);\n                (0, _zaxis.zSwap)(lineItem.targetPosition);\n            }\n            options.currAxis.ticks.push(lineItem);\n        } else if (item.mark.role === \"axis-domain\") {\n            if (options.currAxis.role === \"z\") {\n                (0, _zaxis.zSwap)(lineItem.sourcePosition);\n                (0, _zaxis.zSwap)(lineItem.targetPosition);\n            }\n            options.currAxis.domain = lineItem;\n        } else stage.gridLines.push(lineItem);\n    });\n};\nfunction styledLine(x1, y1, x2, y2, stroke, strokeWidth) {\n    const line = {\n        sourcePosition: [\n            x1,\n            -y1,\n            (0, _defaults.lineZ)\n        ],\n        targetPosition: [\n            x2,\n            -y2,\n            (0, _defaults.lineZ)\n        ],\n        color: (0, _color.colorFromString)(stroke),\n        strokeWidth: strokeWidth\n    };\n    return line;\n}\nfunction box(gx, gy, height, width, stroke, strokeWidth, diagonals = false) {\n    const lines = [\n        styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n        styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n        styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n        styledLine(gx, gy + height, gx, gy, stroke, strokeWidth), \n    ];\n    if (diagonals) {\n        lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n        lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n    }\n    return lines;\n}\nexports.default = markStager;\n\n},{\"../base\":\"bgAmf\",\"../color\":\"1dPRr\",\"../defaults\":\"2VC3T\",\"../zaxis\":\"2gxCb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"2gxCb\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"zSwap\", ()=>zSwap);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _defaults = require(\"./defaults\");\nfunction zSwap(v3) {\n    const temp = -v3[1]; //negeative y to positive z\n    if (v3[0] === (0, _defaults.lineZ)) v3[0] = 0;\n    v3[1] = v3[2];\n    v3[2] = temp;\n}\n\n},{\"./defaults\":\"2VC3T\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4Dg9o\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"initializePanel\", ()=>initializePanel);\nparcelHelpers.export(exports, \"className\", ()=>className);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _tsxCreateElement = require(\"tsx-create-element\");\nvar _defaults = require(\"./defaults\");\nvar _enums = require(\"./enums\");\nfunction initializePanel(presenter) {\n    const rootDiv = (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).root, presenter)\n    }, (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).gl, presenter),\n        style: {\n            minHeight: (0, _defaults.minHeight),\n            minWidth: (0, _defaults.minWidth)\n        }\n    }), (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).panel, presenter)\n    }, (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).vegaControls, presenter)\n    }), (0, _tsxCreateElement.createElement)(\"div\", {\n        className: className((0, _enums.PresenterElement).legend, presenter)\n    })));\n    (0, _tsxCreateElement.mount)(rootDiv, presenter.el);\n}\nfunction className(type, presenter) {\n    return `${presenter.style.cssPrefix}${(0, _enums.PresenterElement)[type]}`;\n}\n\n},{\"tsx-create-element\":\"45tGW\",\"./defaults\":\"2VC3T\",\"./enums\":\"gGAEP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"gnP4f\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"patchCubeArray\", ()=>patchCubeArray);\nfunction patchCubeArray(allocatedSize, empty, cubes) {\n    const patched = new Array(allocatedSize);\n    patched.fill(empty);\n    cubes.forEach((cube)=>patched[cube.ordinal] = cube);\n    return patched;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"72W8V\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"sceneToStage\", ()=>sceneToStage);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _legend = require(\"./marks/legend\");\nvar _legendDefault = parcelHelpers.interopDefault(_legend);\nvar _rect = require(\"./marks/rect\");\nvar _rectDefault = parcelHelpers.interopDefault(_rect);\nvar _rule = require(\"./marks/rule\");\nvar _ruleDefault = parcelHelpers.interopDefault(_rule);\nvar _line = require(\"./marks/line\");\nvar _lineDefault = parcelHelpers.interopDefault(_line);\nvar _text = require(\"./marks/text\");\nvar _textDefault = parcelHelpers.interopDefault(_text);\nvar _area = require(\"./marks/area\");\nvar _areaDefault = parcelHelpers.interopDefault(_area);\nvar _base = require(\"./base\");\nvar _color = require(\"./color\");\nvar _defaults = require(\"./defaults\");\nvar _interfaces = require(\"./marks/interfaces\");\nfunction getOrientItem(group1) {\n    if (group1.orient) return group1;\n    return group1.datum;\n}\nfunction convertGroupRole(group2, options) {\n    if (group2.mark.role === \"legend\") return (0, _interfaces.GroupType).legend;\n    if (group2.mark.role === \"axis\") {\n        if (group2.mark.zindex === options.zAxisZindex && options.zAxisZindex !== undefined) return (0, _interfaces.GroupType).zAxis;\n        const orientItem = getOrientItem(group2);\n        if (orientItem) switch(orientItem.orient){\n            case \"bottom\":\n            case \"top\":\n                return (0, _interfaces.GroupType).xAxis;\n            case \"left\":\n            case \"right\":\n                return (0, _interfaces.GroupType).yAxis;\n        }\n    }\n}\nconst group = (options, stage, scene, x, y, groupType)=>{\n    (0, _base.base).vega.sceneVisit(scene, function(g) {\n        const gx = g.x || 0, gy = g.y || 0;\n        if (g.context && g.context.background && !stage.backgroundColor) stage.backgroundColor = (0, _color.colorFromString)(g.context.background);\n        if (g.stroke) {\n            const facetRect = {\n                datum: g.datum,\n                lines: (0, _rule.box)(gx + x, gy + y, g.height, g.width, g.stroke, (0, _defaults.groupStrokeWidth))\n            };\n            stage.facets.push(facetRect);\n        }\n        groupType = convertGroupRole(g, options) || groupType;\n        setCurrentAxis(options, stage, groupType);\n        // draw group contents\n        (0, _base.base).vega.sceneVisit(g, function(item) {\n            mainStager(options, stage, item, gx + x, gy + y, groupType);\n        });\n    });\n};\nfunction setCurrentAxis(options, stage, groupType) {\n    let axes;\n    let role;\n    switch(groupType){\n        case (0, _interfaces.GroupType).xAxis:\n            axes = stage.axes.x;\n            role = \"x\";\n            break;\n        case (0, _interfaces.GroupType).yAxis:\n            axes = stage.axes.y;\n            role = \"y\";\n            break;\n        case (0, _interfaces.GroupType).zAxis:\n            axes = stage.axes.z;\n            role = \"z\";\n            break;\n        default:\n            return;\n    }\n    options.currAxis = {\n        domain: null,\n        tickText: [],\n        ticks: [],\n        role\n    };\n    axes.push(options.currAxis);\n}\nconst markStagers = {\n    group,\n    legend: (0, _legendDefault.default),\n    rect: (0, _rectDefault.default),\n    rule: (0, _ruleDefault.default),\n    line: (0, _lineDefault.default),\n    area: (0, _areaDefault.default),\n    text: (0, _textDefault.default)\n};\nconst mainStager = (options, stage, scene, x, y, groupType)=>{\n    if (scene.marktype !== \"group\" && groupType === (0, _interfaces.GroupType).legend) (0, _legendDefault.default)(options, stage, scene, x, y, groupType);\n    else {\n        const markStager = markStagers[scene.marktype];\n        if (markStager) markStager(options, stage, scene, x, y, groupType);\n    }\n};\nfunction sceneToStage(options, stage, scene) {\n    mainStager(options, stage, scene, 0, 0, null);\n    sortAxis(stage.axes.x, 0);\n    sortAxis(stage.axes.y, 1);\n}\nfunction sortAxis(axes, dim) {\n    axes.forEach((axis)=>{\n        if (axis.domain) orderDomain(axis.domain, dim);\n        axis.ticks.sort((a, b)=>a.sourcePosition[dim] - b.sourcePosition[dim]);\n        axis.tickText.sort((a, b)=>a.position[dim] - b.position[dim]);\n    });\n}\nfunction orderDomain(domain, dim) {\n    if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n        const temp = domain.targetPosition;\n        domain.targetPosition = domain.sourcePosition;\n        domain.sourcePosition = temp;\n    }\n}\n\n},{\"./marks/legend\":\"6OZ8j\",\"./marks/rect\":\"dlbLt\",\"./marks/rule\":\"6xovX\",\"./marks/line\":\"7FQyF\",\"./marks/text\":\"202md\",\"./marks/area\":\"driMx\",\"./base\":\"bgAmf\",\"./color\":\"1dPRr\",\"./defaults\":\"2VC3T\",\"./marks/interfaces\":\"1LnNW\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"6OZ8j\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\nconst legendMap = {\n    \"legend-title\": function(legend, textItem) {\n        legend.title = textItem.text;\n    },\n    \"legend-symbol\": function(legend, symbol) {\n        const { bounds , fill , shape  } = symbol;\n        //this object is safe for serialization\n        const legendRowSymbol = {\n            bounds,\n            fill,\n            shape\n        };\n        const i = symbol.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        legend.rows[i].symbol = legendRowSymbol;\n    },\n    \"legend-label\": function(legend, label) {\n        const i = label.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        const row = legend.rows[i];\n        row.label = label.text;\n        row.value = label.datum.value;\n    }\n};\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, _base.base).vega.sceneVisit(scene, function(item) {\n        const fn = legendMap[item.mark.role];\n        if (fn) fn(stage.legend, item);\n    });\n};\nexports.default = markStager;\n\n},{\"../base\":\"bgAmf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"dlbLt\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\nvar _color = require(\"../color\");\nvar _defaults = require(\"../defaults\");\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    (0, _base.base).vega.sceneVisit(scene, function(item) {\n        //for orthographic (2d) - always use 0 or else Deck will not show them\n        const z = stage.view === \"2d\" ? 0 : item.z || 0;\n        const depth = (stage.view === \"2d\" ? 0 : item.depth || 0) + (0, _defaults.min3dDepth);\n        //change direction of y from SVG to GL\n        const ty = -1;\n        const ordinal = options.assignCubeOrdinal(item.datum);\n        if (ordinal > options.maxOrdinal) options.maxOrdinal = ordinal;\n        if (ordinal === undefined) ;\n        else {\n            const cube = {\n                ordinal,\n                size: [\n                    item.width,\n                    item.height,\n                    depth\n                ],\n                position: [\n                    x + (item.x || 0),\n                    ty * (y + (item.y || 0)) - item.height,\n                    z\n                ],\n                color: (0, _color.colorFromString)(item.fill) || options.defaultCubeColor || [\n                    128,\n                    128,\n                    128,\n                    128\n                ]\n            };\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n            stage.cubeData.push(cube);\n        }\n    });\n};\nexports.default = markStager;\n\n},{\"../base\":\"bgAmf\",\"../color\":\"1dPRr\",\"../defaults\":\"2VC3T\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7FQyF\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _color = require(\"../color\");\n//change direction of y from SVG to GL\nconst ty = -1;\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    const g = Object.assign({\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 1\n    }, scene.items[0]);\n    const path = {\n        strokeWidth: g.strokeWidth,\n        strokeColor: (0, _color.colorFromString)(g.stroke),\n        positions: scene.items.map((it)=>[\n                it.x,\n                ty * it.y,\n                it.z || 0, \n            ])\n    };\n    path.strokeColor[3] *= g.strokeOpacity;\n    path.strokeColor[3] *= g.opacity;\n    stage.pathData.push(path);\n};\nexports.default = markStager;\n\n},{\"../color\":\"1dPRr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"202md\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\nvar _color = require(\"../color\");\nvar _zaxis = require(\"../zaxis\");\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    //scale Deck.Gl text to Vega size\n    const fontScale = 1;\n    //change direction of y from SVG to GL\n    const ty = -1;\n    (0, _base.base).vega.sceneVisit(scene, function(item) {\n        if (!item.text) return;\n        const size = item.fontSize * fontScale;\n        const alignmentBaseline = convertBaseline(item.baseline);\n        const yOffset = alignmentBaseline === \"top\" ? item.fontSize / 2 : 0; //fixup to get tick text correct\n        const textItem = {\n            color: (0, _color.colorFromString)(item.fill),\n            text: item.limit === undefined ? item.text : (0, _base.base).vega.truncate(item.text, item.limit, \"right\", item.ellipsis || \"...\"),\n            position: [\n                x + (item.x || 0),\n                ty * (y + (item.y || 0) + yOffset),\n                0\n            ],\n            size,\n            angle: convertAngle(item.angle),\n            textAnchor: convertAlignment(item.align),\n            alignmentBaseline,\n            metaData: item.metaData\n        };\n        if (item.mark.role === \"axis-label\") {\n            const tickText = textItem;\n            tickText.value = item.datum.value;\n            if (options.currAxis.role === \"z\") (0, _zaxis.zSwap)(tickText.position);\n            options.currAxis.tickText.push(tickText);\n        } else if (item.mark.role === \"axis-title\") {\n            if (options.currAxis.role === \"z\") (0, _zaxis.zSwap)(textItem.position);\n            options.currAxis.title = textItem;\n        } else stage.textData.push(textItem);\n    });\n};\nfunction convertAngle(vegaTextAngle) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) return 360 - vegaTextAngle;\n    return 0;\n}\nfunction convertAlignment(textAlign) {\n    switch(textAlign){\n        case \"center\":\n            return \"middle\";\n        case \"left\":\n            return \"start\";\n        case \"right\":\n            return \"end\";\n    }\n    return \"start\";\n}\nfunction convertBaseline(baseline) {\n    switch(baseline){\n        case \"middle\":\n            return \"center\";\n    }\n    return baseline || \"bottom\";\n}\nexports.default = markStager;\n\n},{\"../base\":\"bgAmf\",\"../color\":\"1dPRr\",\"../zaxis\":\"2gxCb\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"driMx\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _color = require(\"../color\");\n//change direction of y from SVG to GL\nconst ty = -1;\nconst markStager = (options, stage, scene, x, y, groupType)=>{\n    const g = Object.assign({\n        fillOpacity: 1,\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 0,\n        depth: 0\n    }, scene.items[0]);\n    const points = scene.items.map((item)=>{\n        item = Object.assign({\n            z: 0\n        }, item);\n        item = Object.assign({\n            x2: item.x,\n            y2: item.y,\n            z2: item.z\n        }, item);\n        return [\n            item.x,\n            ty * item.y,\n            item.z,\n            item.x2,\n            ty * item.y2,\n            item.z2, \n        ];\n    });\n    const positions = [];\n    const startpoint = [\n        points[0][0],\n        points[0][1],\n        points[0][2]\n    ];\n    points.forEach((p)=>{\n        positions.push([\n            p[0],\n            p[1],\n            p[2]\n        ]);\n    });\n    points.reverse().forEach((p)=>{\n        positions.push([\n            p[3],\n            p[4],\n            p[5]\n        ]);\n    });\n    positions.push(startpoint);\n    const polygon = {\n        fillColor: (0, _color.colorFromString)(g.fill) || [\n            0,\n            0,\n            0,\n            0\n        ],\n        positions,\n        strokeColor: (0, _color.colorFromString)(g.stroke) || [\n            0,\n            0,\n            0,\n            0\n        ],\n        strokeWidth: g.strokeWidth,\n        depth: g.depth\n    };\n    polygon.fillColor[3] *= g.fillOpacity;\n    polygon.fillColor[3] *= g.opacity;\n    polygon.strokeColor[3] *= g.strokeOpacity;\n    polygon.strokeColor[3] *= g.opacity;\n    stage.polygonData.push(polygon);\n};\nexports.default = markStager;\n\n},{\"../color\":\"1dPRr\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"1LnNW\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"GroupType\", ()=>GroupType);\nvar GroupType;\n(function(GroupType1) {\n    GroupType1[GroupType1[\"none\"] = 0] = \"none\";\n    GroupType1[GroupType1[\"legend\"] = 1] = \"legend\";\n    GroupType1[GroupType1[\"xAxis\"] = 2] = \"xAxis\";\n    GroupType1[GroupType1[\"yAxis\"] = 3] = \"yAxis\";\n    GroupType1[GroupType1[\"zAxis\"] = 4] = \"zAxis\";\n})(GroupType || (GroupType = {}));\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"hENsH\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"viewStateProps\", ()=>viewStateProps);\nparcelHelpers.export(exports, \"targetViewState\", ()=>targetViewState);\nconst viewStateProps = [\n    \"target\",\n    \"rotationOrbit\",\n    \"rotationX\",\n    \"zoom\"\n];\nfunction targetViewState(height, width, view) {\n    const target = [\n        width / 2,\n        -height / 2,\n        0\n    ];\n    if (view === \"2d\") return {\n        target,\n        rotationOrbit: 0,\n        rotationX: 90,\n        zoom: -0.2\n    };\n    else return {\n        target,\n        rotationOrbit: 25,\n        rotationX: 30,\n        zoom: -0.4\n    };\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"8D9Ej\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ViewGl\", ()=>ViewGl);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\nvar _defaults = require(\"../defaults\");\nvar _presenter = require(\"../presenter\");\nvar _enums = require(\"../enums\");\nvar _rendererGl = require(\"./rendererGl\");\nlet registered = false;\n//dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n//pass in the SuperClass, which should be a vega.View\nfunction _ViewGl(runtime1, config1) {\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class ViewGlInternal extends (0, _base.base).vega.View {\n        constructor(runtime, config = {}){\n            super(runtime, config);\n            this.config = config;\n            this.presenter = config.presenter;\n            config.presenterConfig = config.presenterConfig || {};\n            config.presenterConfig.redraw = ()=>{\n                this._redraw = true; //use Vega View private member _redraw\n                this.run();\n            };\n        }\n        renderer(...args) {\n            if (args && args.length) {\n                const renderer = args[0];\n                if (renderer === \"deck.gl\" && !registered) {\n                    (0, _base.base).vega.renderModule(\"deck.gl\", {\n                        handler: (0, _base.base).vega.CanvasHandler,\n                        renderer: (0, _rendererGl.RendererGl)\n                    });\n                    registered = true;\n                }\n                return super.renderer(renderer);\n            } else return super.renderer();\n        }\n        initialize(el) {\n            if (!this.presenter) this.presenter = new (0, _presenter.Presenter)(el);\n            super.initialize(this.presenter.getElement((0, _enums.PresenterElement).vegaControls));\n            const renderer = this._renderer;\n            renderer.presenterConfig = this.config.presenterConfig;\n            renderer.presenter = this.presenter;\n            renderer.getView = this.config && this.config.getView || (()=>this.presenter.view || (0, _defaults.defaultView));\n            return this;\n        }\n        error(e) {\n            if (this.presenter.logger) this.presenter.logger(e);\n        }\n    }\n    const instance = new ViewGlInternal(runtime1, config1);\n    return instance;\n}\nconst ViewGl = _ViewGl;\n\n},{\"../base\":\"bgAmf\",\"../defaults\":\"2VC3T\",\"../presenter\":\"483nJ\",\"../enums\":\"gGAEP\",\"./rendererGl\":\"jd6IB\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jd6IB\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"RendererGl\", ()=>RendererGl);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _base = require(\"../base\");\n//pass in the SuperClass, which should be a vega.View\nfunction _RendererGl(loader) {\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class RendererGlInternal extends (0, _base.base).vega.Renderer {\n        initialize(el, width, height, origin) {\n            this.height = height;\n            this.width = width;\n            // this method will invoke resize to size the canvas appropriately\n            return super.initialize(el, width, height, origin);\n        }\n        resize(width, height, origin) {\n            super.resize(width, height, origin);\n            this.origin = origin;\n            this.height = height;\n            this.width = width;\n            //rteturn this for vega\n            return this;\n        }\n        _render(scene, items) {\n            const scene3d = scene;\n            scene3d.view = this.getView();\n            this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n            //return this for vega\n            return this;\n        }\n    }\n    const instance = new RendererGlInternal(loader);\n    return instance;\n}\nconst RendererGl = _RendererGl;\n\n},{\"../base\":\"bgAmf\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"bPdl3\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"colorSchemes\", ()=>colorSchemes);\nparcelHelpers.export(exports, \"registerColorSchemes\", ()=>registerColorSchemes);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _defaults = require(\"./defaults\");\nconst dualPairs = [\n    [\n        (0, _defaults.dualColorSchemeColors).black,\n        (0, _defaults.dualColorSchemeColors).gray\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).red,\n        (0, _defaults.dualColorSchemeColors).green\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).red,\n        (0, _defaults.dualColorSchemeColors).blue\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).black,\n        (0, _defaults.dualColorSchemeColors).red\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).black,\n        (0, _defaults.dualColorSchemeColors).orange\n    ],\n    [\n        (0, _defaults.dualColorSchemeColors).black,\n        (0, _defaults.dualColorSchemeColors).green\n    ], \n];\nconst colorSchemes = [\n    {\n        scheme: (0, _sanddanceSpecs.ColorScaleNone),\n        colors: [\n            (0, _defaults.defaultViewerOptions).colors.defaultCube\n        ]\n    }, \n];\ncreateDualColorSchemes();\nfunction registerColorSchemes(vega) {\n    colorSchemes.forEach((cs)=>{\n        if (cs.colors.length === 1) vega.scheme(cs.scheme, (x)=>cs.colors[0]);\n        else vega.scheme(cs.scheme, cs.colors);\n    });\n}\nfunction createPair(names, colors) {\n    const scheme = `dual_${names[0]}${names[1]}`;\n    colorSchemes.push({\n        scheme,\n        colors\n    });\n}\nfunction createDualColorSchemes() {\n    dualPairs.forEach((colors)=>{\n        const names = colors.map((color)=>{\n            for(const key in 0, _defaults.dualColorSchemeColors)if (color === (0, _defaults.dualColorSchemeColors)[key]) return key;\n        });\n        createPair(names, colors);\n        createPair([\n            ...names\n        ].reverse(), [\n            ...colors\n        ].reverse());\n    });\n}\n\n},{\"@msrvida/sanddance-specs\":\"aBhpQ\",\"./defaults\":\"doogP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"a6Rh9\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/**\n * Component to view a SandDance data visualization.\n */ parcelHelpers.export(exports, \"Viewer\", ()=>Viewer);\nvar _animator = require(\"./animator\");\nvar _axes = require(\"./axes\");\nvar _axisSelection = require(\"./axisSelection\");\nvar _colorCubes = require(\"./colorCubes\");\nvar _colorSchemes = require(\"./colorSchemes\");\nvar _constants = require(\"./constants\");\nvar _dataScope = require(\"./dataScope\");\nvar _defaults = require(\"./defaults\");\nvar _details = require(\"./details\");\nvar _headers = require(\"./headers\");\nvar _legend = require(\"./legend\");\nvar _ordinal = require(\"./ordinal\");\nvar _search = require(\"./search\");\nvar _signals = require(\"./signals\");\nvar _tooltip = require(\"./tooltip\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _searchExpression = require(\"@msrvida/search-expression\");\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _characterSet = require(\"./characterSet\");\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var __awaiter = undefined && undefined.__awaiter || function(thisArg, _arguments, P, generator) {\n    function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n            resolve(value);\n        });\n    }\n    return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n            try {\n                step(generator.next(value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function rejected(value) {\n            try {\n                step(generator[\"throw\"](value));\n            } catch (e) {\n                reject(e);\n            }\n        }\n        function step(result) {\n            result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nconst { defaultView  } = _vegaDeckGl.defaults;\nconst zAxisZindex = 1010;\nlet didRegisterColorSchemes = false;\nclass Viewer {\n    /**\n     * Instantiate a new Viewer.\n     * @param element Parent HTMLElement to present within.\n     * @param options Optional viewer options object.\n     */ constructor(element, options){\n        this.element = element;\n        this.options = _vegaDeckGl.util.deepMerge((0, _defaults.defaultViewerOptions), options);\n        this.presenter = new _vegaDeckGl.Presenter(element, (0, _defaults.getPresenterStyle)(this.options));\n        this._characterSet = new (0, _characterSet.CharacterSet)();\n        this._dataScope = new (0, _dataScope.DataScope)();\n        this._animator = new (0, _animator.Animator)(this._dataScope, {\n            onDataChanged: this.onDataChanged.bind(this),\n            onAnimateDataChange: this.onAnimateDataChange.bind(this)\n        });\n        this._details = new (0, _details.Details)(this.presenter.getElement(_vegaDeckGl.PresenterElement.panel), this.options.language, this._animator, this._dataScope, (remap)=>{\n            this.currentColorContext = ~~remap;\n            this.renderSameLayout();\n        }, ()=>this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n        this.insight = {};\n    }\n    changeColorContexts(colorContexts) {\n        this.colorContexts = colorContexts;\n        this.currentColorContext = 0;\n        this.options.onColorContextChange && this.options.onColorContextChange();\n    }\n    applyLegendColorContext(colorContext) {\n        const a = _vegaDeckGl.util.getActiveElementInfo();\n        _vegaDeckGl.util.mount(colorContext.legendElement, this.presenter.getElement(_vegaDeckGl.PresenterElement.legend));\n        _vegaDeckGl.util.setActiveElement(a);\n        this.presenter.stage.legend = colorContext.legend;\n    }\n    onAnimateDataChange(dataChange, waitingLabel, handlerLabel) {\n        return new Promise((resolve, reject)=>{\n            let innerPromise;\n            if (dataChange === (0, _animator.DataLayoutChange).refine) {\n                const oldColorContext = this.colorContexts[this.currentColorContext];\n                innerPromise = new Promise((innerResolve)=>{\n                    this.renderNewLayout({}, {\n                        preStage: (stage, deckProps)=>{\n                            (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                            this.overrideAxisLabels(stage);\n                            (0, _colorCubes.applyColorMapToCubes)([\n                                oldColorContext.colorMap\n                            ], _vegaDeckGl.util.getCubes(deckProps));\n                            if (this.options.onStage) this.options.onStage(stage, deckProps);\n                        }\n                    }).then(()=>{\n                        //apply old legend\n                        this.applyLegendColorContext(oldColorContext);\n                        innerResolve();\n                    });\n                });\n            } else innerPromise = this.renderNewLayout({}, {\n                preStage: (stage, deckProps)=>{\n                    (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                    this.overrideAxisLabels(stage);\n                    if (this.options.onStage) this.options.onStage(stage, deckProps);\n                }\n            });\n            innerPromise.then(()=>{\n                this.presenter.animationQueue(resolve, this.options.transitionDurations.position, {\n                    waitingLabel,\n                    handlerLabel,\n                    animationCanceled: reject\n                });\n            });\n        });\n    }\n    onDataChanged(dataLayout, filter) {\n        return __awaiter(this, void 0, void 0, function*() {\n            switch(dataLayout){\n                case (0, _animator.DataLayoutChange).same:\n                    this.renderSameLayout();\n                    break;\n                case (0, _animator.DataLayoutChange).refine:\n                    {\n                        //save cube colors\n                        const oldColorContext = this.colorContexts[this.currentColorContext];\n                        let colorMap;\n                        yield this.renderNewLayout({}, {\n                            preStage: (stage, deckProps)=>{\n                                //save off the spec colors\n                                colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n                                (0, _colorCubes.applyColorMapToCubes)([\n                                    oldColorContext.colorMap\n                                ], _vegaDeckGl.util.getCubes(deckProps));\n                                this.preStage(stage, deckProps);\n                            },\n                            onPresent: ()=>{\n                                //save new legend\n                                const newColorContext = {\n                                    colorMap,\n                                    legend: _vegaDeckGl.util.clone(this.presenter.stage.legend),\n                                    legendElement: this.presenter.getElement(_vegaDeckGl.PresenterElement.legend).children[0]\n                                };\n                                //apply old legend\n                                this.applyLegendColorContext(oldColorContext);\n                                this.changeColorContexts([\n                                    oldColorContext,\n                                    newColorContext\n                                ]);\n                            }\n                        });\n                        //narrow the filter only if it is different\n                        if (!_searchExpression.compare(this.insight.filter, filter)) this.insight.filter = _searchExpression.narrow(this.insight.filter, filter);\n                        if (this.options.onDataFilter) this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                        break;\n                    }\n                case (0, _animator.DataLayoutChange).reset:\n                    {\n                        const colorContext = {\n                            colorMap: null,\n                            legend: null,\n                            legendElement: null\n                        };\n                        this.changeColorContexts([\n                            colorContext\n                        ]);\n                        yield this.renderNewLayout({}, {\n                            onPresent: ()=>{\n                                (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n                            }\n                        });\n                        delete this.insight.filter;\n                        if (this.options.onDataFilter) this.options.onDataFilter(null, null);\n                        break;\n                    }\n            }\n            if (this.options.onSelectionChanged) {\n                const sel = this.getSelection();\n                this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n            }\n        });\n    }\n    getSpecColumnsWithFilteredStats() {\n        if (!this._dataScope.hasFilteredData()) return this._specColumns;\n        const roles = [\n            \"color\",\n            \"facet\",\n            \"group\",\n            \"size\",\n            \"sort\",\n            \"sum\",\n            \"x\",\n            \"y\",\n            \"z\"\n        ];\n        const specColumns = Object.assign({}, this._specColumns);\n        roles.forEach((r)=>{\n            if (specColumns[r]) {\n                const column = Object.assign({}, specColumns[r]);\n                column.stats = this.getColumnStats(column);\n                specColumns[r] = column;\n            }\n        });\n        return specColumns;\n    }\n    renderNewLayout(signalValues, presenterConfig, view) {\n        return __awaiter(this, void 0, void 0, function*() {\n            const currData = this._dataScope.currentData();\n            const context = {\n                specColumns: this.getSpecColumnsWithFilteredStats(),\n                insight: this.insight,\n                specViewOptions: Object.assign(Object.assign({}, this.options), {\n                    zAxisOptions: {\n                        showZAxis: true,\n                        zIndex: zAxisZindex\n                    }\n                })\n            };\n            const specResult = (0, _sanddanceSpecs.build)(context, currData);\n            if (!specResult.errors) {\n                const uiValues = (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n                (0, _signals.applySignalValues)(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n                this.vegaSpec = specResult.vegaSpec;\n                this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n                this.specCapabilities = specResult.specCapabilities;\n                const config = this.createConfig(presenterConfig);\n                if (view) config.getView = ()=>view;\n                if (!didRegisterColorSchemes) {\n                    (0, _colorSchemes.registerColorSchemes)(_vegaDeckGl.base.vega);\n                    didRegisterColorSchemes = true;\n                }\n                try {\n                    if (this.vegaViewGl) this.vegaViewGl.finalize();\n                    const runtime = _vegaDeckGl.base.vega.parse(this.vegaSpec);\n                    this.vegaViewGl = new _vegaDeckGl.ViewGl(runtime, config).renderer(\"deck.gl\").initialize(this.element);\n                    yield this.vegaViewGl.runAsync();\n                    const handler = (n, v)=>{\n                        this._characterSet.resetCharacterSet(true);\n                    };\n                    this.vegaSpec.signals.forEach((s)=>{\n                        this.vegaViewGl.addSignalListener(s.name, handler);\n                    });\n                    //capture new color color contexts via signals\n                    this.configForSignalCapture(config.presenterConfig);\n                } catch (e) {\n                    specResult.errors = [\n                        e.message\n                    ];\n                }\n                if (!specResult.errors) (0, _headers.ensureHeaders)(this.presenter, this.options.language.headers);\n            }\n            if (specResult.errors) {\n                if (this.options.onError) this.options.onError(specResult.errors);\n                else if (this.presenter.logger) this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join(\"\\n\")}`);\n            }\n            return specResult;\n        });\n    }\n    /**\n     * Render the same layout with new options.\n     * @param newViewerOptions New options object.\n     */ renderSameLayout(newViewerOptions) {\n        const colorContext = this.colorContexts[this.currentColorContext];\n        const clonedCubes = this.presenter.getCubeData().map((cube)=>{\n            return Object.assign({}, cube);\n        });\n        this.applyLegendColorContext(colorContext);\n        let { axes , textData  } = this.presenter.stage;\n        let recoloredAxes;\n        if (newViewerOptions) {\n            if (newViewerOptions.colors) {\n                recoloredAxes = (0, _axes.recolorAxes)(this.presenter.stage, this._lastColorOptions, newViewerOptions.colors);\n                this._lastColorOptions = _vegaDeckGl.util.clone(newViewerOptions.colors);\n                axes = recoloredAxes.axes || axes;\n                textData = recoloredAxes.textData || textData;\n            }\n            this.options = _vegaDeckGl.util.deepMerge(this.options, newViewerOptions);\n        }\n        const colorMaps = [\n            colorContext.colorMap\n        ];\n        let colorMethod;\n        const hasSelectedData = this._dataScope.hasSelectedData();\n        const hasActive = !!this._dataScope.active;\n        if (hasSelectedData || hasActive) {\n            const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n            colorMaps.push(selectedColorMap);\n            colorMethod = this.options.colors.unselectedColorMethod;\n        }\n        (0, _colorCubes.applyColorMapToCubes)(colorMaps, clonedCubes, colorMethod);\n        const stage = {\n            cubeData: clonedCubes,\n            axes,\n            textData\n        };\n        this.vegaViewGl.presenter.rePresent(stage, this.createConfig().presenterConfig);\n    }\n    getView(view) {\n        if (view === undefined) {\n            if (this.presenter.view === null) return defaultView;\n            else return this.presenter.view;\n        } else return view;\n    }\n    transformData(values, transform) {\n        try {\n            const runtime = _vegaDeckGl.base.vega.parse({\n                $schema: \"https://vega.github.io/schema/vega/v4.json\",\n                data: [\n                    {\n                        name: \"source\",\n                        values,\n                        transform\n                    }\n                ]\n            });\n            new _vegaDeckGl.ViewGl(runtime).run();\n        } catch (e) {\n        // continue regardless of error\n        }\n        return values;\n    }\n    /**\n     * Render data into a visualization.\n     * @param insight Object to create a visualization specification.\n     * @param data Array of data objects.\n     * @param view Optional View to specify camera type.\n     * @param ordinalMap Optional map of ordinals to assign to the data such that the same cubes can be re-used for new data.\n     */ render(insight, data, options = {}) {\n        return __awaiter(this, void 0, void 0, function*() {\n            let result;\n            //see if refine expression has changed\n            if (!_searchExpression.compare(insight.filter, this.insight.filter)) {\n                const allowAsyncRenderTime = 100;\n                if (insight.filter) {\n                    //refining\n                    result = yield this._render(insight, data, options, true);\n                    this.presenter.animationQueue(()=>{\n                        this.filter(insight.filter, options.rebaseFilter && options.rebaseFilter());\n                    }, allowAsyncRenderTime, {\n                        waitingLabel: \"layout before refine\",\n                        handlerLabel: \"refine after layout\"\n                    });\n                } else {\n                    //not refining\n                    this._dataScope.setFilteredData(null);\n                    result = yield this._render(insight, data, options, true);\n                    this.presenter.animationQueue(()=>{\n                        this.reset();\n                    }, allowAsyncRenderTime, {\n                        waitingLabel: \"layout before reset\",\n                        handlerLabel: \"reset after layout\"\n                    });\n                }\n            } else result = yield this._render(insight, data, options, false);\n            return result;\n        });\n    }\n    shouldViewstateTransition(newInsight, oldInsight) {\n        if (!oldInsight.columns) return false;\n        if (oldInsight.chart !== newInsight.chart) return true;\n        if (oldInsight.size.height !== newInsight.size.height) return true;\n        if (oldInsight.size.width !== newInsight.size.width) return true;\n        if (oldInsight.columns.facet !== newInsight.columns.facet) return true;\n        return false;\n    }\n    configForSignalCapture(presenterConfig) {\n        const colorContext = {\n            colorMap: null,\n            legend: null,\n            legendElement: null\n        };\n        //now be ready to capture color changing signals \n        presenterConfig.preStage = (stage, deckProps)=>{\n            if (this._shouldSaveColorContext()) //save off the colors from Vega layout\n            colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n            this.preStage(stage, deckProps);\n        };\n        presenterConfig.onPresent = ()=>{\n            if (this._shouldSaveColorContext()) {\n                (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n                this.changeColorContexts([\n                    colorContext\n                ]);\n                this._dataScope.deselect();\n            }\n        };\n    }\n    _render(insight, data, options, forceNewCharacterSet) {\n        return __awaiter(this, void 0, void 0, function*() {\n            if (this._tooltip) {\n                this._tooltip.finalize();\n                this._tooltip = null;\n            }\n            if (this._dataScope.setData(data, options.columns)) //apply transform to the data\n            this.transformData(data, insight.transform);\n            this._specColumns = (0, _sanddanceSpecs.getSpecColumns)(insight, this._dataScope.getColumns(options.columnTypes));\n            const ordinalMap = (0, _ordinal.assignOrdinals)(this._specColumns, data, options.ordinalMap);\n            this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n            this.insight = _vegaDeckGl.util.clone(insight);\n            this._lastColorOptions = _vegaDeckGl.util.clone(this.options.colors);\n            this._shouldSaveColorContext = ()=>!options.initialColorContext;\n            const colorContext = options.initialColorContext || {\n                colorMap: null,\n                legend: null,\n                legendElement: null\n            };\n            const specResult = yield this.renderNewLayout(insight.signalValues, {\n                preStage: (stage, deckProps)=>{\n                    if (this._shouldSaveColorContext()) //save off the colors from Vega layout\n                    colorContext.colorMap = (0, _colorCubes.colorMapFromCubes)(stage.cubeData);\n                    else //apply passed colorContext\n                    (0, _colorCubes.applyColorMapToCubes)([\n                        colorContext.colorMap\n                    ], _vegaDeckGl.util.getCubes(deckProps));\n                    //if items are selected, repaint\n                    const hasSelectedData = !!this._dataScope.hasSelectedData();\n                    const hasActive = !!this._dataScope.active;\n                    if (this._dataScope.hasSelectedData() || this._dataScope.active) {\n                        const selectedColorMap = (0, _colorCubes.getSelectedColorMap)(this._dataScope.currentData(), hasSelectedData, hasActive, this.options);\n                        (0, _colorCubes.applyColorMapToCubes)([\n                            colorContext.colorMap,\n                            selectedColorMap\n                        ], stage.cubeData, this.options.colors.unselectedColorMethod);\n                    }\n                    this.preStage(stage, deckProps);\n                },\n                onPresent: ()=>{\n                    if (this._shouldSaveColorContext()) {\n                        (0, _colorCubes.populateColorContext)(colorContext, this.presenter);\n                        this.changeColorContexts([\n                            colorContext\n                        ]);\n                    } else //apply passed colorContext\n                    this.applyLegendColorContext(colorContext);\n                },\n                shouldViewstateTransition: ()=>this.shouldViewstateTransition(insight, this.insight)\n            }, this.getView(insight.view));\n            //future signal changes should save the color context\n            this._shouldSaveColorContext = ()=>!options.discardColorContextUpdates || !options.discardColorContextUpdates();\n            this._details.render();\n            const result = {\n                ordinalMap,\n                specResult\n            };\n            return result;\n        });\n    }\n    overrideAxisLabels(stage) {\n    // if (this._specColumns.x && this._specColumns.x.type === 'date') {\n    //     stage.axes.x.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.x)\n    //     ));\n    // }\n    // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n    //     stage.axes.y.forEach(axis => makeDateRange(\n    //         axis.tickText,\n    //         this.getColumnStats(this._specColumns.y)\n    //     ));\n    // }\n    }\n    preStage(stage, deckProps) {\n        const onClick = (e, search)=>{\n            if (this.options.onAxisClick) this.options.onAxisClick(e, search);\n            else this.select(search);\n        };\n        this.overrideAxisLabels(stage);\n        const polygonLayer = (0, _axisSelection.axisSelectionLayer)(this.presenter, this.specCapabilities, this._specColumns, stage, onClick, this.options.colors.axisSelectHighlight, this.options.selectionPolygonZ);\n        const order = 1; //after textlayer but before others\n        deckProps.layers.splice(order, 0, polygonLayer);\n        (0, _legend.finalizeLegend)(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n        if (this.options.onStage) this.options.onStage(stage, deckProps);\n    }\n    onCubeClick(e, cube) {\n        this.options.onCubeClick && this.options.onCubeClick(e, cube);\n        const hasSelectedData = this._dataScope.hasSelectedData();\n        if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n            //if active is within selection, keep the selection and activate the one.\n            const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n            if (indexWithinSelection.index >= 0) {\n                this.activate(indexWithinSelection.datum);\n                this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                if (this.options.onSelectionChanged) {\n                    const sel = this.getSelection();\n                    this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                }\n                return;\n            }\n        }\n        if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][0, _constants.GL_ORDINAL] === cube.ordinal) {\n            this.deselect();\n            return;\n        }\n        const search = {\n            name: (0, _constants.GL_ORDINAL),\n            operator: \"==\",\n            value: cube.ordinal\n        };\n        this.select(search);\n    }\n    onCubeHover(e, cube) {\n        if (this._tooltip) {\n            this._tooltip.finalize();\n            this._tooltip = null;\n        }\n        if (!cube) return;\n        const currentData = this._dataScope.currentData();\n        const index = (0, _ordinal.getDataIndexOfCube)(cube, currentData);\n        if (index >= 0) this._tooltip = new (0, _tooltip.Tooltip)({\n            options: this.options.tooltipOptions,\n            item: currentData[index],\n            position: e,\n            cssPrefix: this.presenter.style.cssPrefix\n        });\n    }\n    onTextHover(e, t) {\n        //return true if highlight color is different\n        if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor) return false;\n        return !_vegaDeckGl.util.colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n    }\n    createConfig(c) {\n        const { getTextColor , getTextHighlightColor , getTextHighlightAlphaCutoff , onTextClick  } = this.options;\n        const defaultPresenterConfig = {\n            zAxisZindex,\n            getCharacterSet: (stage)=>this._characterSet.getCharacterSet(stage),\n            getTextColor,\n            getTextHighlightColor,\n            getTextHighlightAlphaCutoff,\n            onTextClick: (e, t)=>{\n                if (t.metaData && t.metaData.search) {\n                    const search = (0, _search.getSearchGroupFromVegaValue)(t.metaData.search);\n                    if (this.options.onAxisClick) this.options.onAxisClick(e, search);\n                    else this.select(search);\n                }\n                if (onTextClick) onTextClick(e, t);\n            },\n            onCubeClick: this.onCubeClick.bind(this),\n            onCubeHover: this.onCubeHover.bind(this),\n            onTextHover: this.onTextHover.bind(this),\n            preStage: this.preStage.bind(this),\n            onPresent: this.options.onPresent,\n            onLayerClick: (info, e)=>{\n                if (!info || !info.object) this.deselect();\n            },\n            onLegendClick: (e, legend, clickedIndex)=>{\n                const legendRow = clickedIndex !== null && legend.rows[clickedIndex];\n                if (legendRow) {\n                    if (this.options.onLegendRowClick) this.options.onLegendRowClick(e, legendRow);\n                    else this.select(legendRow.search);\n                } else if (this.options.onLegendHeaderClick) //header clicked\n                this.options.onLegendHeaderClick(e);\n            },\n            onSceneRectAssignCubeOrdinal: (datum)=>{\n                //TODO see if datum is a facet selection rect\n                return datum[0, _constants.GL_ORDINAL];\n            },\n            onTargetViewState: (h, w)=>{\n                const { height , width  } = this.insight.size;\n                let newViewStateTarget;\n                if (this.options.onNewViewStateTarget) newViewStateTarget = this.options.onNewViewStateTarget();\n                return {\n                    height,\n                    width,\n                    newViewStateTarget\n                };\n            },\n            preserveDrawingBuffer: this.options.preserveDrawingBuffer\n        };\n        if (this.options.onBeforeCreateLayers) defaultPresenterConfig.preLayer = (stage)=>{\n            this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n        };\n        const config = {\n            presenter: this.presenter,\n            presenterConfig: Object.assign(defaultPresenterConfig, c)\n        };\n        if (this.options.transitionDurations) config.presenterConfig.transitionDurations = this.options.transitionDurations;\n        return config;\n    }\n    /**\n     * Filter the data and animate.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n     */ filter(search, rebase = false) {\n        const u = this._dataScope.createUserSelection(search, false, rebase);\n        return new Promise((resolve, reject)=>{\n            this._animator.filter(search, u.included, u.excluded, rebase).then(()=>{\n                this._details.clear();\n                this._details.clearSelection();\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n    /**\n     * Remove any filtration and animate.\n     */ reset() {\n        return new Promise((resolve, reject)=>{\n            this._animator.reset().then(()=>{\n                this._details.clear();\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Select cubes by a filter expression.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     */ select(search) {\n        return new Promise((resolve, reject)=>{\n            this._animator.select(search).then(()=>{\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n    /**\n     * Removes any selection.\n     */ deselect() {\n        return new Promise((resolve, reject)=>{\n            this._animator.deselect().then(()=>{\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Gets the current selection.\n     */ getSelection() {\n        if (!this._dataScope) return null;\n        const selectionState = {\n            search: this._dataScope.selection && this._dataScope.selection.search || null,\n            selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n            active: this._dataScope.active\n        };\n        return selectionState;\n    }\n    /**\n     * Set one data row to the active state.\n     */ activate(datum) {\n        return new Promise((resolve, reject)=>{\n            this._animator.activate(datum).then(()=>{\n                this._details.render();\n                resolve();\n            });\n        });\n    }\n    /**\n     * Deactivate item.\n     */ deActivate() {\n        return new Promise((resolve, reject)=>{\n            if (this._dataScope && this._dataScope.active) this._animator.deactivate().then(()=>{\n                this._details.render();\n                resolve();\n            });\n            else resolve();\n        });\n    }\n    /**\n     * Gets the current insight with signal values.\n     */ getInsight() {\n        const insight = Object.assign({}, this.insight);\n        insight.signalValues = this.getSignalValues();\n        return insight;\n    }\n    /**\n     * Gets column stats from current data (filtered or all).\n     * @param column Column to get stats for.\n     */ getColumnStats(column) {\n        return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n    }\n    /**\n     * Gets current signal values.\n     */ getSignalValues() {\n        return (0, _signals.extractSignalValuesFromView)(this.vegaViewGl, this.vegaSpec);\n    }\n    finalize() {\n        if (this._dataScope) this._dataScope.finalize();\n        if (this._details) this._details.finalize();\n        if (this._tooltip) this._tooltip.finalize();\n        if (this.vegaViewGl) this.vegaViewGl.finalize();\n        if (this.presenter) this.presenter.finalize();\n        if (this.element) this.element.innerHTML = \"\";\n        this.colorContexts = null;\n        this.element = null;\n        this.options = null;\n        this.presenter = null;\n        this.vegaSpec = null;\n        this.vegaViewGl = null;\n        this._animator = null;\n        this._dataScope = null;\n        this._details = null;\n        this._tooltip = null;\n    }\n}\n/**\n * Default Viewer options.\n */ Viewer.defaultViewerOptions = (0, _defaults.defaultViewerOptions);\n\n},{\"./animator\":\"82S4R\",\"./axes\":\"7Ym5k\",\"./axisSelection\":\"cK1oO\",\"./colorCubes\":\"ijIyP\",\"./colorSchemes\":\"bPdl3\",\"./constants\":\"2SlZI\",\"./dataScope\":\"aOagG\",\"./defaults\":\"doogP\",\"./details\":\"jmS4n\",\"./headers\":\"kKnIm\",\"./legend\":\"je7e0\",\"./ordinal\":\"fMfsn\",\"./search\":\"160ba\",\"./signals\":\"4zIGL\",\"./tooltip\":\"h84Gn\",\"@msrvida/sanddance-specs\":\"aBhpQ\",\"@msrvida/search-expression\":\"3EP3i\",\"@msrvida/vega-deck.gl\":\"6fUZE\",\"./characterSet\":\"e6qKV\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"82S4R\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataLayoutChange\", ()=>DataLayoutChange);\nparcelHelpers.export(exports, \"Animator\", ()=>Animator);\nvar DataLayoutChange;\n(function(DataLayoutChange1) {\n    DataLayoutChange1[DataLayoutChange1[\"same\"] = 0] = \"same\";\n    DataLayoutChange1[DataLayoutChange1[\"reset\"] = 1] = \"reset\";\n    DataLayoutChange1[DataLayoutChange1[\"refine\"] = 2] = \"refine\";\n})(DataLayoutChange || (DataLayoutChange = {}));\nclass Animator {\n    constructor(dataScope, props){\n        this.dataScope = dataScope;\n        this.props = props;\n    }\n    select(search) {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.select(search);\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n    deselect() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deselect();\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n    filter(search, keepData, collapseData, rebase) {\n        if (rebase) this.dataScope.collapse(false, keepData);\n        this.dataScope.collapse(true, collapseData);\n        return new Promise((resolve, reject)=>{\n            this.props.onAnimateDataChange(DataLayoutChange.refine, \"before refine\", \"refine\").then(()=>{\n                this.dataScope.deselect();\n                this.dataScope.setFilteredData(keepData);\n                this.props.onDataChanged(DataLayoutChange.refine, search);\n                resolve();\n            }).catch(reject);\n        });\n    }\n    reset() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deselect();\n            this.dataScope.setFilteredData(null);\n            this.props.onAnimateDataChange(DataLayoutChange.reset, \"before reset\", \"reset\").then(()=>{\n                this.dataScope.collapse(false);\n                this.props.onDataChanged(DataLayoutChange.reset);\n                resolve();\n            }).catch(reject);\n        });\n    }\n    activate(datum) {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.activate(datum);\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n    deactivate() {\n        return new Promise((resolve, reject)=>{\n            this.dataScope.deactivate();\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"7Ym5k\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"recolorAxes\", ()=>recolorAxes);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nfunction cloneAxis(axes, axisColor, axisTextColor) {\n    return axes.map((axis)=>{\n        const newAxis = _vegaDeckGl.util.deepMerge(axis);\n        if (newAxis.domain) newAxis.domain.color = axisColor;\n        if (newAxis.title) newAxis.title.color = axisTextColor;\n        newAxis.ticks.forEach((t)=>{\n            t.color = axisColor;\n        });\n        newAxis.tickText.forEach((t)=>{\n            t.color = axisTextColor;\n        });\n        return newAxis;\n    });\n}\nfunction cloneTextData(textData, color) {\n    return textData.map((t)=>{\n        return Object.assign(Object.assign({}, t), {\n            color\n        });\n    });\n}\nfunction recolorAxes(stage, oldColors, newColors) {\n    const hasNewLineColor = newColors.axisLine && newColors.axisLine !== oldColors.axisLine;\n    const hasNewTextColor = newColors.axisText && newColors.axisText !== oldColors.axisText;\n    let axes;\n    let textData;\n    if (hasNewLineColor || hasNewTextColor) {\n        const lineColor = _vegaDeckGl.util.colorFromString(newColors.axisLine || oldColors.axisLine);\n        const textColor = _vegaDeckGl.util.colorFromString(newColors.axisText || oldColors.axisText);\n        axes = {\n            x: cloneAxis(stage.axes.x, lineColor, textColor),\n            y: cloneAxis(stage.axes.y, lineColor, textColor),\n            z: cloneAxis(stage.axes.z, lineColor, textColor)\n        };\n    }\n    if (hasNewTextColor) textData = cloneTextData(stage.textData, _vegaDeckGl.util.colorFromString(newColors.axisText));\n    return {\n        axes,\n        textData\n    };\n}\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cK1oO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"axisSelectionLayer\", ()=>axisSelectionLayer);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _expression = require(\"./expression\");\nvar _search = require(\"./search\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nfunction axisSelectionLayer(presenter, specCapabilities, columns, stage, clickHandler, highlightColor, polygonZ) {\n    const polygons = [];\n    const xRole = specCapabilities.roles.filter((r)=>r.role === \"x\")[0];\n    if (xRole && xRole.axisSelection) stage.axes.x.filter((axis)=>axis.tickText.length).forEach((axis)=>{\n        polygons.push.apply(polygons, axisSelectionPolygons(axis, false, xRole.axisSelection, columns.x));\n    });\n    const yRole = specCapabilities.roles.filter((r)=>r.role === \"y\")[0];\n    if (yRole && yRole.axisSelection) stage.axes.y.filter((axis)=>axis.tickText.length).forEach((axis)=>{\n        polygons.push.apply(polygons, axisSelectionPolygons(axis, true, yRole.axisSelection, columns.y));\n    });\n    if (stage.facets && columns.facet) polygons.push.apply(polygons, facetSelectionPolygons(stage.facets));\n    //move polygons to Z\n    polygons.forEach((datum)=>{\n        datum.polygon.forEach((p)=>{\n            p[2] = polygonZ;\n        });\n    });\n    const onClick = (o, e)=>clickHandler(e.srcEvent, o.object.search);\n    const polygonLayer = new _vegaDeckGl.base.layers.PolygonLayer({\n        autoHighlight: true,\n        coordinateSystem: _vegaDeckGl.base.deck.COORDINATE_SYSTEM.CARTESIAN,\n        data: polygons,\n        extruded: false,\n        highlightColor: _vegaDeckGl.util.colorFromString(highlightColor),\n        id: \"selections\",\n        onHover: (o, e)=>{\n            if (o.index === -1) presenter.deckgl.interactiveState.onAxisSelection = false;\n            else presenter.deckgl.interactiveState.onAxisSelection = true;\n        },\n        onClick,\n        getElevation: ()=>0,\n        getFillColor: ()=>[\n                0,\n                0,\n                0,\n                0\n            ],\n        pickable: true,\n        stroked: false\n    });\n    return polygonLayer;\n}\nfunction axisSelectionPolygons(axis, vertical, axisSelectionType, column) {\n    const polygons = [];\n    const size = 50;\n    const getSearch = axisSelectionType === \"exact\" ? (a, c, i)=>({\n            expressions: [\n                (0, _expression.selectExactAxis)(a, c, i)\n            ]\n        }) : (0, _expression.selectBetweenAxis);\n    const { domain , ticks  } = axis;\n    if (ticks.length > 0 && domain) {\n        const dim = vertical ? 1 : 0;\n        const between = Math.abs(ticks[0].sourcePosition[dim] - domain.sourcePosition[dim]) > 1;\n        let divisions;\n        if (between) {\n            divisions = [];\n            for(let i = 1; i < ticks.length; i++)divisions.push((ticks[i].sourcePosition[dim] + ticks[i - 1].sourcePosition[dim]) / 2);\n        } else divisions = ticks.slice(1, -1).map((tick)=>tick.sourcePosition[dim]);\n        const add = (p2, i)=>{\n            const coords = [\n                [\n                    p1,\n                    q1\n                ],\n                [\n                    p2,\n                    q1\n                ],\n                [\n                    p2,\n                    q2\n                ],\n                [\n                    p1,\n                    q2\n                ]\n            ];\n            polygons.push({\n                search: getSearch(axis, column, i),\n                polygon: vertical ? coords.map((xy)=>xy.reverse()) : coords\n            });\n            p1 = p2;\n        };\n        let p1 = domain.sourcePosition[dim];\n        const q1 = domain.sourcePosition[vertical ? 0 : 1];\n        const q2 = q1 - size;\n        divisions.forEach(add);\n        add(domain.targetPosition[dim], ticks.length - (between ? 1 : 2));\n    }\n    return polygons;\n}\nfunction facetSelectionPolygons(facetRects) {\n    const polygons = [];\n    const linesAndSearches = facetRects.map(({ datum , lines  }, i)=>{\n        const group = (0, _search.getSearchGroupFromVegaValue)(datum[(0, _sanddanceSpecs.FieldNames).FacetSearch]);\n        return {\n            lines,\n            search: group\n        };\n    });\n    linesAndSearches.forEach(({ lines , search  }, i)=>{\n        //take any 2 lines to get a box dimension\n        const [x, y] = minMaxPoints(lines.slice(2));\n        polygons.push({\n            search,\n            polygon: [\n                [\n                    x.min,\n                    y.min\n                ],\n                [\n                    x.max,\n                    y.min\n                ],\n                [\n                    x.max,\n                    y.max\n                ],\n                [\n                    x.min,\n                    y.max\n                ]\n            ]\n        });\n    });\n    return polygons;\n}\nfunction minMaxPoints(lines) {\n    const points = [];\n    lines.forEach((line)=>{\n        [\n            line.sourcePosition,\n            line.targetPosition\n        ].forEach((point)=>{\n            points.push(point);\n        });\n    });\n    return [\n        0,\n        1\n    ].map((dim)=>{\n        const minMax = {\n            min: null,\n            max: null\n        };\n        points.forEach((point)=>{\n            if (minMax.max == null) minMax.max = point[dim];\n            else minMax.max = Math.max(minMax.max, point[dim]);\n            if (minMax.min == null) minMax.min = point[dim];\n            else minMax.min = Math.min(minMax.min, point[dim]);\n        });\n        return minMax;\n    });\n}\n\n},{\"./expression\":\"9NWzg\",\"./search\":\"160ba\",\"@msrvida/sanddance-specs\":\"aBhpQ\",\"@msrvida/vega-deck.gl\":\"6fUZE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"9NWzg\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"notNice\", ()=>notNice);\nparcelHelpers.export(exports, \"selectNullOrEmpty\", ()=>selectNullOrEmpty);\nparcelHelpers.export(exports, \"selectExact\", ()=>selectExact);\nparcelHelpers.export(exports, \"selectNone\", ()=>selectNone);\nparcelHelpers.export(exports, \"selectExactAxis\", ()=>selectExactAxis);\nparcelHelpers.export(exports, \"selectBetween\", ()=>selectBetween);\nparcelHelpers.export(exports, \"selectBetweenAxis\", ()=>selectBetweenAxis);\nfunction notNice(niceValue) {\n    //convert \"nice\" numbers to numeric value\n    return (niceValue + \"\").replace(/[\\s,]/g, \"\");\n}\nfunction tickValue(axis, i) {\n    const tick = axis.tickText[i];\n    let value;\n    if (tick) value = axis.tickText[i].value;\n    return {\n        tick,\n        value\n    };\n}\nfunction selectNullOrEmpty(column) {\n    const searchExpression = {\n        name: column.name,\n        operator: \"isnullorEmpty\"\n    };\n    return searchExpression;\n}\nfunction selectExact(column, value) {\n    if (value == null) return selectNullOrEmpty(column);\n    const searchExpression = {\n        name: column.name,\n        operator: \"==\",\n        value\n    };\n    return searchExpression;\n}\nfunction selectNone(column, values) {\n    const expressions = values.map((value, i)=>{\n        const searchExpression = {\n            name: column.name,\n            operator: \"!=\",\n            value\n        };\n        if (i) searchExpression.clause = \"&&\";\n        return searchExpression;\n    });\n    const searchExpressionGroup = {\n        expressions\n    };\n    return searchExpressionGroup;\n}\nfunction selectExactAxis(axis, column, i) {\n    const result = tickValue(axis, i);\n    if (result.tick) return selectExact(column, result.value);\n}\nfunction selectBetween(column, lowValue, highValue, lowOperator = \">=\", highOperator = \"<\") {\n    const expressions = [];\n    if (lowValue !== undefined) expressions.push({\n        name: column.name,\n        operator: lowOperator,\n        value: lowValue\n    });\n    if (highValue !== undefined) expressions.push({\n        name: column.name,\n        operator: highOperator,\n        value: highValue\n    });\n    if (expressions.length > 1) expressions[1].clause = \"&&\";\n    const searchExpressionGroup = {\n        expressions\n    };\n    return searchExpressionGroup;\n}\nfunction selectBetweenAxis(axis, column, i) {\n    const low = tickValue(axis, i);\n    const high = tickValue(axis, i + 1);\n    return selectBetween(column, low.value, high.value);\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"160ba\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSearchGroupFromVegaValue\", ()=>getSearchGroupFromVegaValue);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _array = require(\"./array\");\nfunction getSearchGroupFromVegaValue(search) {\n    let group;\n    const vegaSearch = search;\n    if (Array.isArray(vegaSearch)) {\n        //flatten into one group\n        group = {\n            expressions: []\n        };\n        vegaSearch.forEach((g)=>{\n            const clonedExpressions = _vegaDeckGl.util.clone(g.expressions).filter(Boolean);\n            clonedExpressions[0].clause = \"&&\";\n            (0, _array.push)(group.expressions, clonedExpressions);\n        });\n    } else group = vegaSearch ? {\n        expressions: vegaSearch.expressions.filter(Boolean)\n    } : null;\n    return group;\n}\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"./array\":\"44gIO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"44gIO\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"allTruthy\", ()=>allTruthy);\nparcelHelpers.export(exports, \"concat\", ()=>concat);\nparcelHelpers.export(exports, \"push\", ()=>push);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nconst { allTruthy , concat , push  } = (0, _vegaDeckGl.util);\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"ijIyP\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"getSelectedColorMap\", ()=>getSelectedColorMap);\nparcelHelpers.export(exports, \"colorMapFromCubes\", ()=>colorMapFromCubes);\nparcelHelpers.export(exports, \"populateColorContext\", ()=>populateColorContext);\nparcelHelpers.export(exports, \"applyColorMapToCubes\", ()=>applyColorMapToCubes);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _constants = require(\"./constants\");\nfunction getSelectedColorMap(currentData, showSelectedData, showActive, viewerOptions) {\n    function getSelectionColorItem(datum) {\n        let item;\n        if (showSelectedData) item = datum[(0, _sanddanceSpecs.FieldNames).Selected] ? {\n            color: _vegaDeckGl.util.colorFromString(viewerOptions.colors.selectedCube)\n        } : {\n            unSelected: true\n        };\n        if (showActive && datum[(0, _sanddanceSpecs.FieldNames).Active]) item = {\n            color: _vegaDeckGl.util.colorFromString(viewerOptions.colors.activeCube)\n        };\n        return item;\n    }\n    const colorMap = {};\n    currentData.forEach((datum)=>{\n        const selectionColor = getSelectionColorItem(datum);\n        if (selectionColor) {\n            const ordinal = datum[0, _constants.GL_ORDINAL];\n            colorMap[ordinal] = selectionColor;\n        }\n    });\n    return colorMap;\n}\nfunction colorMapFromCubes(cubes) {\n    const map = {};\n    cubes.forEach((cube)=>{\n        map[cube.ordinal] = {\n            color: cube.color\n        };\n    });\n    return map;\n}\nfunction populateColorContext(colorContext, presenter) {\n    if (!colorContext.colorMap) {\n        const cubes = presenter.getCubeData();\n        colorContext.colorMap = colorMapFromCubes(cubes);\n    }\n    colorContext.legend = _vegaDeckGl.util.clone(presenter.stage.legend);\n    colorContext.legendElement = presenter.getElement(_vegaDeckGl.PresenterElement.legend).children[0];\n}\nfunction applyColorMapToCubes(maps, cubes, unselectedColorMethod) {\n    Object.keys(maps[0]).forEach((ordinal)=>{\n        const cube = cubes[+ordinal];\n        if (cube && !cube.isEmpty) {\n            const actualColorMappedItem = maps[0][ordinal];\n            if (maps.length > 1) {\n                const selectedColorMappedItem = maps[1][ordinal];\n                if (selectedColorMappedItem) {\n                    if (selectedColorMappedItem.unSelected && unselectedColorMethod) cube.color = unselectedColorMethod(actualColorMappedItem.color);\n                    else cube.color = selectedColorMappedItem.color;\n                    return;\n                }\n            }\n            cube.color = actualColorMappedItem.color;\n        }\n    });\n}\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"@msrvida/sanddance-specs\":\"aBhpQ\",\"./constants\":\"2SlZI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"aOagG\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"DataScope\", ()=>DataScope);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _searchExpression = require(\"@msrvida/search-expression\");\nvar _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _constants = require(\"./constants\");\nclass DataScope {\n    constructor(){\n        this.filteredColumnsStats = {};\n    }\n    setData(data, columns) {\n        const differentData = this.data !== data;\n        if (differentData) {\n            if (this.data) //clean up things we added to old data\n            this.deselect();\n            this.data = data;\n            this.columns = columns;\n            this.filteredData = null;\n            this.filteredColumnsStats = {};\n        }\n        return differentData;\n    }\n    setFilteredData(filteredData) {\n        this.filteredData = filteredData;\n        this.filteredColumnsStats = {};\n    }\n    getColumns(columnTypes) {\n        if (!this.columns) this.columns = (0, _sanddanceSpecs.getColumnsFromData)(_vegaDeckGl.base.vega.inferTypes, this.data, columnTypes);\n        return this.columns;\n    }\n    getFilteredColumnStats(columnName) {\n        if (!this.filteredColumnsStats[columnName]) this.filteredColumnsStats[columnName] = (0, _sanddanceSpecs.getStats)(this.filteredData, this.columns.filter((c)=>c.name === columnName)[0]);\n        return this.filteredColumnsStats[columnName];\n    }\n    currentData() {\n        return this.filteredData || this.data;\n    }\n    select(search) {\n        this.deselect();\n        if (search) {\n            this.selection = this.createUserSelection(search, true, false);\n            if (this.selection.included.length) this.activate(this.selection.included[0]);\n        }\n    }\n    createUserSelection(search, assign, rebase) {\n        const exec = new (0, _searchExpression.Exec)(search, this.getColumns());\n        const s = {\n            search,\n            included: [],\n            excluded: []\n        };\n        const data = rebase ? this.data : this.currentData();\n        data.forEach((datum)=>{\n            if (exec.run(datum)) {\n                if (assign) datum[(0, _sanddanceSpecs.FieldNames).Selected] = true;\n                s.included.push(datum);\n            } else s.excluded.push(datum);\n        });\n        return s;\n    }\n    deselect() {\n        this.deactivate();\n        this.data.forEach((datum)=>{\n            delete datum[(0, _sanddanceSpecs.FieldNames).Selected];\n        });\n        this.selection = null;\n    }\n    hasFilteredData() {\n        return !!this.filteredData;\n    }\n    hasSelectedData() {\n        return !!this.selection;\n    }\n    collapse(collapsed, data = this.data) {\n        data.forEach((datum)=>{\n            datum[(0, _sanddanceSpecs.FieldNames).Collapsed] = collapsed;\n        });\n        this.isCollapsed = collapsed;\n    }\n    activate(datum) {\n        this.deactivate();\n        datum[(0, _sanddanceSpecs.FieldNames).Active] = true;\n        this.active = datum;\n    }\n    deactivate() {\n        if (this.active) delete this.active[(0, _sanddanceSpecs.FieldNames).Active];\n        this.active = null;\n    }\n    ordinalIndexWithinSelection(ordinal) {\n        if (this.selection) for(let i = 0; i < this.selection.included.length; i++){\n            const datum = this.selection.included[i];\n            if (datum[0, _constants.GL_ORDINAL] === ordinal) return {\n                datum,\n                index: i\n            };\n        }\n        return {\n            datum: null,\n            index: -1\n        };\n    }\n    finalize() {\n        this.data = null;\n        this.filteredData = null;\n        this.filteredColumnsStats = null;\n        if (this.selection) {\n            this.selection.excluded = null;\n            this.selection.included = null;\n            this.selection = null;\n        }\n    }\n}\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"@msrvida/search-expression\":\"3EP3i\",\"@msrvida/sanddance-specs\":\"aBhpQ\",\"./constants\":\"2SlZI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"jmS4n\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Details\", ()=>Details);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _defaults = require(\"./defaults\");\nvar _constants = require(\"./constants\");\nvar _searchExpression = require(\"@msrvida/search-expression\");\nvar _util = require(\"./util\");\nvar Action;\n(function(Action1) {\n    Action1[Action1[\"deselect\"] = 0] = \"deselect\";\n    Action1[Action1[\"isolate\"] = 1] = \"isolate\";\n    Action1[Action1[\"exclude\"] = 2] = \"exclude\";\n    Action1[Action1[\"reset\"] = 3] = \"reset\";\n    Action1[Action1[\"next\"] = 4] = \"next\";\n    Action1[Action1[\"previous\"] = 5] = \"previous\";\n})(Action || (Action = {}));\nclass Details {\n    constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps){\n        this.language = language;\n        this.animator = animator;\n        this.dataScope = dataScope;\n        this.colorMapHandler = colorMapHandler;\n        this.hasColorMaps = hasColorMaps;\n        this.element = (0, _vegaDeckGl.util).addDiv(parentElement, `${(0, _defaults.cssPrefix)}unitControls`);\n        this.clear();\n    }\n    finalize() {\n        if (this.element) this.element.innerHTML = \"\";\n        this.dataScope = null;\n        this.element = null;\n    }\n    clear() {\n        this.state = {\n            userSelection: null,\n            index: -1,\n            remapColor: false\n        };\n        this.render();\n    }\n    clearSelection() {\n        this.state.userSelection = null;\n        this.state.index = -1;\n        this.render();\n    }\n    populate(userSelection, index = 0) {\n        this.state.userSelection = userSelection;\n        this.state.index = index;\n        this.render();\n    }\n    selectByNameValue(columnName, value) {\n        const search = {\n            name: columnName,\n            operator: \"==\",\n            value\n        };\n        this.clearSelection();\n        this.animator.select(search);\n        this.populate(this.dataScope.selection);\n    }\n    remapChanged(remap) {\n        this.state.remapColor = remap;\n        this.colorMapHandler(remap);\n        this.render();\n    }\n    handleAction(action) {\n        let p;\n        const u = this.state.userSelection;\n        switch(action){\n            case Action.deselect:\n                this.clearSelection();\n                p = this.animator.deselect();\n                break;\n            case Action.exclude:\n                this.clearSelection();\n                p = this.animator.filter((0, _searchExpression.invert)(u.search), u.excluded, u.included, false);\n                this.state.remapColor = false;\n                break;\n            case Action.isolate:\n                this.clearSelection();\n                p = this.animator.filter(u.search, u.included, u.excluded, false);\n                this.state.remapColor = false;\n                break;\n            case Action.reset:\n                this.clear();\n                p = this.animator.reset();\n                break;\n            default:\n                switch(action){\n                    case Action.previous:\n                        this.state.index--;\n                        if (this.state.index < 0) this.state.index = this.state.userSelection.included.length - 1;\n                        break;\n                    case Action.next:\n                        this.state.index++;\n                        if (this.state.index >= this.state.userSelection.included.length) this.state.index = 0;\n                        break;\n                }\n                this.render();\n                p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n        p.then(()=>this.render());\n    }\n    render() {\n        const hasRefinedData = this.dataScope.hasFilteredData();\n        const renderProps = {\n            language: this.language,\n            actionHandler: (action)=>this.handleAction(action),\n            selectionHandler: (columnName, value)=>this.selectByNameValue(columnName, value),\n            count: this.state.userSelection && this.state.userSelection.included.length,\n            hasRefinedData,\n            item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n            remapColorHandler: (remap)=>this.remapChanged(remap),\n            hasColorMaps: this.hasColorMaps() && hasRefinedData,\n            remapColor: this.state.remapColor\n        };\n        const a = _vegaDeckGl.util.getActiveElementInfo();\n        _vegaDeckGl.util.mount(renderDetails(renderProps), this.element);\n        _vegaDeckGl.util.setActiveElement(a);\n    }\n}\nconst renderDetails = (props)=>{\n    const controlButtons = [\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler(Action.deselect)\n        }, props.language.deselect),\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler(Action.isolate)\n        }, props.language.isolate),\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: !props.item,\n            onClick: (e)=>props.actionHandler(Action.exclude)\n        }, props.language.exclude), \n    ];\n    const colorMapping = _vegaDeckGl.util.createElement(\"div\", null, _vegaDeckGl.util.createElement(\"button\", {\n        disabled: props.remapColor,\n        onClick: (e)=>props.remapColorHandler(true)\n    }, props.language.newColorMap), _vegaDeckGl.util.createElement(\"button\", {\n        disabled: !props.remapColor,\n        onClick: (e)=>props.remapColorHandler(false)\n    }, props.language.oldColorMap));\n    const singleItem = props.count === 1;\n    const scrollButtons = [\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: singleItem,\n            onClick: (e)=>props.actionHandler(Action.previous)\n        }, props.language.previousDetail),\n        _vegaDeckGl.util.createElement(\"button\", {\n            disabled: singleItem,\n            onClick: (e)=>props.actionHandler(Action.next)\n        }, props.language.nextDetail),\n        _vegaDeckGl.util.createElement(\"span\", null, \" \", props.language.selectionCount(props.count)), \n    ];\n    const rows = [];\n    for(const prop in props.item){\n        if (prop === (0, _constants.GL_ORDINAL)) continue;\n        if ((0, _util.isInternalFieldName)(prop)) continue;\n        rows.push({\n            cells: [\n                {\n                    content: prop\n                },\n                {\n                    content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler)\n                }, \n            ]\n        });\n    }\n    return _vegaDeckGl.util.createElement(\"div\", null, props.hasColorMaps && colorMapping, _vegaDeckGl.util.createElement(\"h4\", null, props.language.headers.selection), _vegaDeckGl.util.createElement(\"div\", {\n        className: `${(0, _defaults.cssPrefix)}selection`\n    }, controlButtons, _vegaDeckGl.util.createElement(\"button\", {\n        disabled: !props.hasRefinedData,\n        onClick: (e)=>props.actionHandler(Action.reset)\n    }, \"reset\")), props.item && _vegaDeckGl.util.createElement(\"h4\", null, props.language.headers.details), _vegaDeckGl.util.createElement(\"div\", null, _vegaDeckGl.util.createElement(\"div\", {\n        className: `${(0, _defaults.cssPrefix)}details-scroll`\n    }, props.item && scrollButtons), _vegaDeckGl.util.createElement(\"div\", {\n        className: `${(0, _defaults.cssPrefix)}details`\n    }, props.item && _vegaDeckGl.util.createElement((0, _vegaDeckGl.controls).Table, {\n        rows: rows\n    }))));\n};\nfunction linkSelect(language, columnName, value, selectionHandler) {\n    return _vegaDeckGl.util.createElement(\"span\", null, _vegaDeckGl.util.createElement(\"a\", {\n        href: \"#\",\n        onClick: (e)=>selectionHandler(columnName, value)\n    }, value), isNaN(value) ? [\n        \" \",\n        _vegaDeckGl.util.createElement(\"a\", {\n            className: \"bing-search\",\n            href: `https://www.bing.com/search?q=${encodeURIComponent(value)}`,\n            target: \"_blank\"\n        }, language.bing)\n    ] : \"\");\n}\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"./defaults\":\"doogP\",\"./constants\":\"2SlZI\",\"@msrvida/search-expression\":\"3EP3i\",\"./util\":\"eohCL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"kKnIm\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"ensureHeaders\", ()=>ensureHeaders);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nfunction ensureHeaders(presenter, headers) {\n    const vegaControls = presenter.getElement((0, _vegaDeckGl.PresenterElement).vegaControls);\n    conditionalHeader(!!vegaControls.querySelectorAll(\".vega-bindings > *\").length, vegaControls, headers.chart);\n    const legend = presenter.getElement((0, _vegaDeckGl.PresenterElement).legend);\n    conditionalHeader(!!legend.children.length, legend, headers.legend);\n}\nfunction conditionalHeader(condition, element, header) {\n    const existing = existingHeader(element, header);\n    if (condition && !existing) addHeader(element, header);\n    if (!condition && existing) existing.remove();\n}\nfunction addHeader(element, header) {\n    const h = document.createElement(\"h4\");\n    h.innerHTML = header;\n    element.insertAdjacentElement(\"beforebegin\", h);\n}\nfunction existingHeader(element, header) {\n    const { previousElementSibling  } = element;\n    if (previousElementSibling && previousElementSibling.innerHTML === header) return previousElementSibling;\n}\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"je7e0\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"finalizeLegend\", ()=>finalizeLegend);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _sanddanceSpecs = require(\"@msrvida/sanddance-specs\");\nvar _expression = require(\"./expression\");\nfunction legendRange(colorBinType, column, legend, clickedIndex) {\n    if (column.quantitative) return selectQuantitative(colorBinType, column, legend, clickedIndex);\n    else return selectCategorical(column, legend, clickedIndex);\n}\nfunction selectCategorical(column, legend, clickedIndex) {\n    const value = legend.rows[clickedIndex].value;\n    if (value === (0, _sanddanceSpecs.Other)) {\n        const values = [];\n        for(const i in legend.rows)if (+i !== clickedIndex) values.push(legend.rows[i].value);\n        return (0, _expression.selectNone)(column, values);\n    } else //select equal\n    return {\n        expressions: [\n            (0, _expression.selectExact)(column, legend.rows[clickedIndex].value)\n        ]\n    };\n}\nfunction selectQuantitative(colorBinType, column, legend, clickedIndex) {\n    const keys = Object.keys(legend.rows).map((key)=>+key).sort((a, b)=>+a - +b);\n    let lowValue;\n    let lowOperator;\n    let highValue;\n    let highOperator;\n    const rowText = legend.rows[clickedIndex].label;\n    switch(colorBinType){\n        case \"continuous\":\n            lowValue = rowText;\n            if (clickedIndex < keys.length - 1) highValue = legend.rows[clickedIndex + 1].value;\n            break;\n        default:\n            {\n                if (rowText.indexOf(\"null\") > 0) {\n                    const ex = {\n                        expressions: [\n                            (0, _expression.selectNullOrEmpty)(column)\n                        ]\n                    };\n                    return ex;\n                }\n                const dash = rowText.indexOf(\"\\u2013\"); //this is not the common dash character!\n                if (dash > 0) {\n                    //bug in Vega for quantize?\n                    //lowOperator = '>';\n                    //highOperator = '<=';\n                    lowValue = rowText.substr(0, dash);\n                    highValue = rowText.substr(dash + 1);\n                } else {\n                    if (rowText.indexOf(\"<\") >= 0) highValue = rowText.substring(2);\n                    else if (rowText.indexOf(\"\\u2265\") >= 0) lowValue = rowText.substring(2);\n                }\n            }\n    }\n    if (lowValue) lowValue = (0, _expression.notNice)(lowValue);\n    if (highValue) highValue = (0, _expression.notNice)(highValue);\n    if (lowValue === highValue) return {\n        expressions: [\n            (0, _expression.selectExact)(column, lowValue)\n        ]\n    };\n    else return (0, _expression.selectBetween)(column, lowValue, highValue, lowOperator, highOperator);\n}\nfunction finalizeLegend(colorBinType, colorColumn, legend, language) {\n    const rowTexts = [];\n    for(const i in legend.rows){\n        const row = legend.rows[i];\n        row.search = legendRange(colorBinType, colorColumn, legend, +i);\n        if (row.value === (0, _sanddanceSpecs.Other)) row.label = language.legendOther;\n        else rowTexts.push(row.value);\n    }\n}\n\n},{\"@msrvida/sanddance-specs\":\"aBhpQ\",\"./expression\":\"9NWzg\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"fMfsn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"assignOrdinals\", ()=>assignOrdinals);\nparcelHelpers.export(exports, \"getDataIndexOfCube\", ()=>getDataIndexOfCube);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _constants = require(\"./constants\");\nfunction assignOrdinals(columns, data, ordinalMap) {\n    const uCol = columns.uid && columns.uid.name;\n    if (ordinalMap) data.forEach((d, i)=>{\n        const key = uCol ? d[uCol] : i;\n        d[0, _constants.GL_ORDINAL] = ordinalMap[key];\n    });\n    else {\n        ordinalMap = {};\n        data.forEach((d, i)=>{\n            d[0, _constants.GL_ORDINAL] = i;\n            const uColValue = uCol ? d[uCol] : i;\n            ordinalMap[uColValue] = i;\n        });\n    }\n    return ordinalMap;\n}\nfunction getDataIndexOfCube(cube, data) {\n    const len = data.length;\n    for(let i = 0; i < len; i++){\n        if (data[i][0, _constants.GL_ORDINAL] === cube.ordinal) return i;\n    }\n}\n\n},{\"./constants\":\"2SlZI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"4zIGL\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"applySignalValues\", ()=>applySignalValues);\nparcelHelpers.export(exports, \"extractSignalValuesFromView\", ()=>extractSignalValuesFromView);\nfunction applySignalValues(sv, b) {\n    if (!sv || !b || !b.signals || !b.signals.length) return;\n    for(const key in sv){\n        const value = sv[key];\n        const signalB = b.signals.filter((signal)=>signal.name === key)[0];\n        if (signalB && signalB.bind) signalB.value = value;\n    }\n}\nfunction extractSignalValuesFromView(view, spec) {\n    if (!view || !spec || !spec.signals || !spec.signals.length) return;\n    const result = {};\n    spec.signals.forEach((signalA)=>{\n        //bound to a UI control\n        if (signalA.bind) try {\n            result[signalA.name] = view.signal(signalA.name);\n        } catch (e) {\n        // continue regardless of error\n        }\n    });\n    return result;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"h84Gn\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"Tooltip\", ()=>Tooltip);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ var _vegaDeckGl = require(\"@msrvida/vega-deck.gl\");\nvar _constants = require(\"./constants\");\nvar _util = require(\"./util\");\nconst { outerSize  } = _vegaDeckGl.util;\nconst { Table  } = _vegaDeckGl.controls;\nclass Tooltip {\n    constructor(props){\n        const renderProps = {\n            cssPrefix: props.cssPrefix,\n            rows: getRows(props.item, props.options)\n        };\n        this.element = renderTooltip(renderProps);\n        if (this.element) {\n            this.element.style.position = \"absolute\";\n            this.child = this.element.firstChild;\n            document.body.appendChild(this.element);\n            //measure and move as necessary\n            let m = outerSize(this.child);\n            while(m.height > document.documentElement.clientHeight){\n                const tr = this.child.querySelector(\"tr:last-child\");\n                if (tr) tr.parentElement.removeChild(tr);\n                else break;\n                m = outerSize(this.child);\n            }\n            if (props.position.clientX + m.width >= document.documentElement.clientWidth) this.child.style.right = \"0\";\n            let moveTop = true;\n            if (props.position.clientY + m.height >= document.documentElement.clientHeight) {\n                if (props.position.clientY - m.height > 0) this.child.style.bottom = \"0\";\n                else moveTop = false;\n            }\n            if (moveTop) this.element.style.top = `${props.position.clientY}px`;\n            this.element.style.left = `${props.position.clientX}px`;\n        }\n    }\n    finalize() {\n        if (this.element) document.body.removeChild(this.element);\n        this.element = null;\n    }\n}\nfunction getRows(item, options) {\n    const rows = [];\n    for(const columnName in item){\n        if (columnName === (0, _constants.GL_ORDINAL)) continue;\n        if ((0, _util.isInternalFieldName)(columnName)) continue;\n        if (options && options.exclude) {\n            if (options.exclude(columnName)) continue;\n        }\n        const value = item[columnName];\n        let content;\n        if (options && options.displayValue) content = options.displayValue(value);\n        else switch(value){\n            case null:\n                content = _vegaDeckGl.util.createElement(\"i\", null, \"null\");\n                break;\n            case undefined:\n                content = _vegaDeckGl.util.createElement(\"i\", null, \"undefined\");\n                break;\n            default:\n                content = value.toString();\n        }\n        rows.push({\n            cells: [\n                {\n                    content: columnName + \":\"\n                },\n                {\n                    content\n                }, \n            ]\n        });\n    }\n    return rows;\n}\nconst renderTooltip = (props)=>{\n    return props.rows.length === 0 ? null : _vegaDeckGl.util.createElement(\"div\", {\n        className: `${props.cssPrefix}tooltip`\n    }, Table({\n        rows: props.rows\n    }));\n};\n\n},{\"@msrvida/vega-deck.gl\":\"6fUZE\",\"./constants\":\"2SlZI\",\"./util\":\"eohCL\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"e6qKV\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\n/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/ parcelHelpers.export(exports, \"CharacterSet\", ()=>CharacterSet);\nclass CharacterSet {\n    resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n        if (forceNewCharacterSet || needsNewCharacterSet(oldInsight, newInsight)) this.chars = undefined;\n    }\n    getCharacterSet(stage) {\n        if (!this.chars) {\n            const map = {};\n            const addText = (text)=>{\n                Array.from(text).forEach((char)=>{\n                    map[char] = true;\n                });\n            };\n            stage.textData.forEach((t)=>addText(t.text));\n            const { x , y , z  } = stage.axes;\n            [\n                x,\n                y,\n                z\n            ].forEach((axes)=>{\n                axes.forEach((axis)=>{\n                    if (axis.tickText) axis.tickText.forEach((t)=>addText(t.text));\n                    if (axis.title) addText(axis.title.text);\n                });\n            });\n            this.chars = Object.keys(map);\n        }\n        return this.chars;\n    }\n}\nfunction needsNewCharacterSet(oldInsight, newInsight) {\n    if (!oldInsight) return true;\n    if (!newInsight) return true;\n    if (oldInsight.chart !== newInsight.chart) return true;\n    if (oldInsight.facetStyle !== newInsight.facetStyle) return true;\n    if (oldInsight.totalStyle !== newInsight.totalStyle) return true;\n    if (oldInsight.hideAxes !== newInsight.hideAxes) return true;\n    if (oldInsight.view !== newInsight.view) return true;\n    if (differentObjectValues(oldInsight.signalValues, newInsight.signalValues)) return true;\n    if (differentObjectValues(oldInsight.size, newInsight.size)) return true;\n    const oldColumns = oldInsight.columns;\n    const newColumns = newInsight.columns;\n    if (oldColumns.facet !== newColumns.facet) return true;\n    if (oldColumns.facetV !== newColumns.facetV) return true;\n    if (oldColumns.x !== newColumns.x) return true;\n    if (oldColumns.y !== newColumns.y) return true;\n    if (oldColumns.z !== newColumns.z) return true;\n    return false;\n}\nfunction differentObjectValues(a, b) {\n    if (!a && !b) return false;\n    if (!a || !b) return true;\n    const keys = Object.keys(b);\n    for(let i = 0; i < keys.length; i++){\n        const key = keys[i];\n        const ta = typeof a;\n        const tb = typeof b;\n        if (ta !== tb) return true;\n        if (ta === \"object\") return differentObjectValues(a[key], b[key]);\n        else {\n            if (a[key] !== b[key]) return true;\n        }\n    }\n    return false;\n}\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}],\"cwHcu\":[function(require,module,exports) {\nvar parcelHelpers = require(\"@parcel/transformer-js/src/esmodule-helpers.js\");\nparcelHelpers.defineInteropFlag(exports);\nparcelHelpers.export(exports, \"version\", ()=>version);\nconst version = \"3.2.1\";\n\n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"jA2du\"}]},[\"gK9HS\"], \"gK9HS\", \"parcelRequire0e59\")\n\n"
  },
  {
    "path": "docs/tests/v3/es6/sanddance-test-es6.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/sanddance-test-es6.css\" />\n</head>\n\n<body>\n    <header>\n        <h1>sanddance test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/sanddance-test-es6.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/css/test.css",
    "content": "body {\n    font-family: 'Segoe UI', sans-serif;\n}\n\n#vis { \n    position: absolute;\n    bottom: 0;\n    top: 5em;\n    left: 1em;\n    right: 0;\n}\n.sanddance-gl { \n    right: 290px;\n}\n.sanddance-panel {\n    width: 250px;\n}\n.vega-bind-name {\n    display: block;\n}"
  },
  {
    "path": "docs/tests/v3/umd/css/transition.css",
    "content": "html,\nbody {\n    font-family: sans-serif;\n    height: 100%;\n}\n\nbody.rows {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-areas: \"header\" \"view\" \"footer\";\n    margin: 0;\n    overflow: scroll;\n}\n\nbody.columns {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-columns: 40% 60%;\n    grid-template-areas: \"header header\" \"left right\" \"footer footer\";\n    margin: 0;\n}\n\nheader {\n    border-bottom: 1px solid silver;\n    grid-area: header;\n    padding: 0 2em;\n}\n\nfooter {\n    border-top: 1px solid silver;\n    grid-area: footer;\n    padding: 0 2em;\n}\n\n#view-type-button {\n    position: absolute;\n    right: 2em;\n    top: 2em;\n}\n\n#view-div, #view-div .vega-deckgl-gl {\n    height: 100%;\n}\n\n#split-left.double {\n    display: grid;\n    grid-template-columns: auto;\n    grid-template-rows: 50% 50%;\n}\n\n#split-left {\n    grid-area: left;\n    overflow: hidden;\n}\n\n.textform {\n    background-color: #ccc;\n    display: grid;\n    grid-template-columns: auto;\n    grid-template-rows: auto 2em;\n    padding: 10px;\n}\n\n#split-left textarea {\n    border: 0;\n    height: 100%;\n    padding: 0 0 0 5px;\n    resize: none;\n    width: 100%;\n}\n\n#split-right,\n#error {\n    grid-area: right;\n}\n\n#error {\n    font-size: larger;\n    padding: 1em;\n}\n\n#split-right .vega-bindings {\n    padding: 1em;\n}\n\n.vega-deckgl-root {\n    display: grid;\n    grid-template-rows: auto 200px;\n    height: 100%;\n}\n\n.vega-deckgl-legend {\n    font-family: sans-serif;\n    position: absolute;\n    right: 1em;\n    top: 1em;\n    z-index: 1;\n}\n"
  },
  {
    "path": "docs/tests/v3/umd/css/vega-deck.gl.test.css",
    "content": ".vega-deckgl-gl {\n    border: 1px solid #ccc;\n    height: 700px;\n}\n"
  },
  {
    "path": "docs/tests/v3/umd/cubeTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-deck.gl cubeTest</title>\n    <link rel=\"stylesheet\" href=\"css/vega-deck.gl.test.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist/dist.dev.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>vega-deck.gl cubeTest</h1>\n    </header>\n\n    <button id=\"animate\">animate</button>\n    \n    <div id=\"vis\"></div>\n\n    <script src=\"js/cubeTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/embed.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>Embed SandDance Explorer in iframe</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <header>\n        <h1>Embed SandDance Explorer in iframe</h1>\n    </header>\n\n    <!-- \n        Reference the hosted version at https://microsoft.github.io/SandDance/embed/v3/sanddance-embed.html\n        or download it and host it on your own site.\n    -->\n    <iframe id=\"embed\" style=\"width: 90%; height: 600px\" src=\"../../../embed/v3/sanddance-embed.html\"></iframe>\n\n    <script>\n        const embed = document.getElementById('embed');\n        embed.onload = () => {\n            fetch('../../../sample-data/titanicmaster.tsv')\n                .then(response => response.text())\n                .then(rawText => {\n                    const w = document.getElementById('embed').contentWindow;\n                    const message = {\n                        // action definitions: 'init' | 'load' | 'getData' | 'getInsight'\n                        // https://github.com/microsoft/SandDance/blob/master/packages/sanddance-embed/src/types/message.d.ts#L3\n                        action: 'load',\n\n                        // data property may be a raw data file description:\n                        // https://microsoft.github.io/SandDance/docs/sanddance-explorer/v3/interfaces/datafile.html\n                        data: { rawText, type: 'tsv' }\n\n                        // or it may be an array\n                        //data: [{ a: 1 }, { a: 2 }, { a: 3 },]\n                    };\n                    w.postMessage(message, '*');\n\n                    /*\n                    // here we can add a button to get the current insight from the explorer\n                    const b = document.createElement('button');\n                    b.innerText = 'log current insight to console'\n                    b.onclick = () => {\n                        w.postMessage({ action: 'getInsight' }, '*');\n                    };\n                    document.body.appendChild(b);\n                    */\n                });\n        };\n\n        window.onmessage = (e) => {\n            // message responses\n            console.log('messaged', e.data);\n        };\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/js/cubeTest.js",
    "content": "var cubeTest;\n(function (cubeTest) {\n    var VegaDeckGl = SandDance.VegaDeckGl;\n    VegaDeckGl.use(null, deck, deck, luma);\n    var colors = {\n        red: [255, 0, 0],\n        green: [0, 255, 0],\n        blue: [0, 0, 255],\n        gray: [128, 128, 128]\n    };\n    cubeTest.presenter = new VegaDeckGl.Presenter(document.querySelector('#vis'));\n    var stage = {\n        cubeData: [\n            {\n                color: colors.red,\n                position: [0, 0, 0],\n                size: [100, 100, 100]\n            },\n            {\n                color: colors.green,\n                position: [100, 0, 100],\n                size: [100, 100, 100]\n            },\n            {\n                color: colors.blue,\n                position: [0, 100, 100],\n                size: [100, 100, 100]\n            },\n        ],\n        legend: { rows: {} },\n        axes: {\n            x: [{\n                    domain: {\n                        color: [0, 0, 0, 255],\n                        sourcePosition: [0, 0, 0],\n                        targetPosition: [400, 0, 0],\n                        strokeWidth: 10\n                    },\n                    ticks: [],\n                    tickText: []\n                }],\n            y: [{\n                    domain: {\n                        color: [0, 0, 0, 255],\n                        sourcePosition: [0, 0, 0],\n                        targetPosition: [0, 200, 0],\n                        strokeWidth: 10\n                    },\n                    ticks: [],\n                    tickText: []\n                }],\n            z: [{\n                    domain: {\n                        color: [0, 0, 0, 255],\n                        sourcePosition: [0, 0, 0],\n                        targetPosition: [0, 0, 200],\n                        strokeWidth: 10\n                    },\n                    ticks: [],\n                    tickText: []\n                }]\n        },\n        textData: [],\n        view: '3d'\n    };\n    cubeTest.presenter.present(stage, 200, 400);\n    var orbitViewState = {\n        target: [90, 15, 23],\n        rotationOrbit: -45,\n        rotationX: 67,\n        zoom: 0.01\n    };\n    cubeTest.presenter.deckgl.setProps({ initialViewState: orbitViewState });\n    document.getElementById('animate').addEventListener('click', function (e) {\n        stage.cubeData = [\n            {\n                color: colors.blue,\n                position: [0, 300, 100],\n                size: [100, 100, 100]\n            },\n            {\n                color: colors.gray,\n                position: [100, 100, 300],\n                size: [10, 10, 10]\n            },\n            {\n                color: colors.red,\n                position: [300, 0, 0],\n                size: [100, 100, 100]\n            },\n            {\n                color: colors.green,\n                position: [100, 300, 100],\n                size: [100, 100, 100]\n            },\n        ];\n        cubeTest.presenter.present(stage, 200, 400);\n    });\n})(cubeTest || (cubeTest = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/js/qualBarChartTest.js",
    "content": "var qualBarChartTest;\n(function (qualBarChartTest) {\n    SandDance.use(vega, deck, deck, luma);\n    qualBarChartTest.viewer = new SandDance.Viewer(document.getElementById('vis'));\n    function getValue(i) {\n        if (i < 20)\n            return 0;\n        if (i < 25)\n            return 1;\n        if (i < 35)\n            return 2;\n        return 3;\n    }\n    var data = [];\n    for (var i = 0; i < 70; i++) {\n        var v = getValue(i);\n        data.push({\n            myUid: i,\n            myX: \"cat\" + v,\n            myY: i,\n            myZ: i,\n            myColor: v.toString(),\n            mySort: i\n        });\n    }\n    var glDiv = qualBarChartTest.viewer.presenter.getElement(SandDance.VegaDeckGl.PresenterElement.gl);\n    var insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ'\n        },\n        scheme: 'category20',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth\n        },\n        chart: 'barchart',\n        view: '2d'\n    };\n    qualBarChartTest.viewer.render(insight, data, { columnTypes: { myColor: 'string' } });\n})(qualBarChartTest || (qualBarChartTest = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/js/quanBarChartTest.js",
    "content": "var quanBarChartTest;\n(function (quanBarChartTest) {\n    SandDance.use(vega, deck, deck, luma);\n    quanBarChartTest.viewer = new SandDance.Viewer(document.getElementById('vis'));\n    function getValue(i) {\n        if (i < 200)\n            return 0;\n        if (i < 250)\n            return 1;\n        if (i < 350)\n            return 2;\n        return 3;\n    }\n    var data = [];\n    for (var i = 0; i < 700; i++) {\n        var v = getValue(i);\n        data.push({\n            myUid: i,\n            myX: v,\n            myY: i,\n            myZ: i,\n            myColor: v,\n            mySort: i\n        });\n    }\n    var glDiv = quanBarChartTest.viewer.presenter.getElement(SandDance.VegaDeckGl.PresenterElement.gl);\n    var insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ'\n        },\n        scheme: 'redblue',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth\n        },\n        chart: 'barchart',\n        view: '2d'\n    };\n    quanBarChartTest.viewer.render(insight, data);\n})(quanBarChartTest || (quanBarChartTest = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/js/scatterplotTest.js",
    "content": "var scatterplotTest;\n(function (scatterplotTest) {\n    SandDance.use(vega, deck, deck, luma);\n    scatterplotTest.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    var glDiv = scatterplotTest.viewer.presenter.getElement(SandDance.VegaDeckGl.PresenterElement.gl);\n    var options = {\n        columns: {\n            color: 'Education',\n            sort: 'TotalPop',\n            uid: 'Id',\n            x: 'Longitude',\n            y: 'Latitude',\n            z: 'Income'\n        },\n        scheme: 'redblue',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth\n        },\n        chart: 'scatterplot'\n    };\n    vega.loader().load('../../../sample-data/demovote.tsv').then(function (text) {\n        var data = vega.read(text, { type: 'tsv' });\n        scatterplotTest.viewer.render(options, data);\n    });\n})(scatterplotTest || (scatterplotTest = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/js/test.js",
    "content": "var test;\n(function (test) {\n    var data = [\n        { myUid: 0, myColor: 0, mySort: 0, myX: 0, myY: 0, myZ: 0 },\n        { myUid: 1, myColor: 1, mySort: 1, myX: 1, myY: 1, myZ: 1 },\n        { myUid: 2, myColor: 2, mySort: 2, myX: 2, myY: 2, myZ: 2 },\n    ];\n    var options = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ'\n        },\n        size: {\n            height: 700,\n            width: 700\n        },\n        chart: 'scatterplot'\n    };\n    SandDance.use(vega, deck, deck, luma);\n    test.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    test.viewer.render(options, data);\n})(test || (test = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/js/transforms.js",
    "content": "var transformTest;\n(function (transformTest) {\n    var insight = {\n        columns: {\n            color: 'brand',\n            x: 'Horsepower',\n            y: 'Miles_per_Gallon',\n            z: 'Cylinders'\n        },\n        transform: [\n            {\n                type: 'formula',\n                expr: 'split(datum.Name, \" \")',\n                as: 'name_split'\n            },\n            {\n                type: 'formula',\n                expr: 'datum.name_split[0]',\n                as: 'brand'\n            },\n        ],\n        size: {\n            height: 700,\n            width: 700\n        },\n        scheme: 'category20',\n        view: '2d',\n        chart: 'scatterplot',\n        signalValues: {\n            Chart_PointScaleSignal: 8,\n            Text_AngleXSignal: 0,\n            Text_AngleYSignal: -90\n        }\n    };\n    SandDance.use(vega, deck, deck, luma);\n    transformTest.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    fetch('https://vega.github.io/editor/data/cars.json').then(function (response) {\n        return response.json();\n    }).then(function (json) {\n        transformTest.viewer.render(insight, json);\n    });\n})(transformTest || (transformTest = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/js/transition.js",
    "content": "var transition;\n(function (transition) {\n    var view;\n    var lastSpec;\n    var viewType = '3d';\n    SandDance.use(vega, deck, deck, luma);\n    function toggleView() {\n        if (viewType === '3d') {\n            viewType = '2d';\n        }\n        else {\n            viewType = '3d';\n        }\n        update(lastSpec);\n    }\n    transition.toggleView = toggleView;\n    function update(spec) {\n        view = new SandDance.VegaDeckGl.ViewGl(vega.parse(spec), { presenter: view && view.presenter, getView: function () { return viewType; } })\n            .renderer('deck.gl')\n            .initialize(document.querySelector('#split-right'))\n            .run();\n        lastSpec = spec;\n    }\n    transition.update = update;\n    function getText(textId) {\n        var textarea = document.getElementById(textId);\n        var text = textarea.value;\n        var errorDiv = document.getElementById('error');\n        var splitRight = document.getElementById('split-right');\n        try {\n            var spec = JSON.parse(text);\n            splitRight.style.opacity = '1';\n            errorDiv.style.display = 'none';\n            update(spec);\n        }\n        catch (e) {\n            errorDiv.innerText = e;\n            errorDiv.style.display = '';\n            splitRight.style.opacity = '0.1';\n        }\n    }\n    transition.getText = getText;\n    fetch('./specs/scatter3D.json')\n        .then(function (response) { return response.text(); })\n        .then(function (text) {\n        var textarea = document.getElementById('text1');\n        textarea.value = text;\n        getText('text1');\n    });\n    fetch('./specs/titanic.json')\n        .then(function (response) { return response.text(); })\n        .then(function (text) { return document.getElementById('text2').value = text; });\n})(transition || (transition = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/js/treeMapTest.js",
    "content": "var treeMapTest;\n(function (treeMapTest) {\n    SandDance.use(vega, deck, deck, luma);\n    treeMapTest.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    var glDiv = treeMapTest.viewer.presenter.getElement(SandDance.VegaDeckGl.PresenterElement.gl);\n    var options = {\n        columns: {\n            color: 'Class',\n            size: 'TicketCost',\n            uid: 'Name'\n        },\n        scheme: 'category10',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth\n        },\n        chart: 'treemap'\n    };\n    vega.loader().load('../../../sample-data/titanicmaster.tsv').then(function (text) {\n        var data = vega.read(text, { type: 'tsv' });\n        treeMapTest.viewer.render(options, data);\n    });\n})(treeMapTest || (treeMapTest = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/js/vega-deck.gl.test.js",
    "content": "var vegaDeckglTest;\n(function (vegaDeckglTest) {\n    SandDance.use(vega, deck, deck, luma);\n    var spec = {\n        \"$schema\": \"https://vega.github.io/schema/vega/v4.json\",\n        \"background\": \"#DEDEDE\",\n        \"width\": 500,\n        \"height\": 200,\n        \"padding\": 5,\n        \"data\": [\n            {\n                \"name\": \"table\",\n                \"values\": [\n                    { \"x\": 0, \"y\": 28, \"c\": 0 }, { \"x\": 0, \"y\": 55, \"c\": 1 },\n                    { \"x\": 1, \"y\": 43, \"c\": 0 }, { \"x\": 1, \"y\": 91, \"c\": 1 },\n                    { \"x\": 2, \"y\": 81, \"c\": 0 }, { \"x\": 2, \"y\": 53, \"c\": 1 },\n                    { \"x\": 3, \"y\": 19, \"c\": 0 }, { \"x\": 3, \"y\": 87, \"c\": 1 },\n                    { \"x\": 4, \"y\": 52, \"c\": 0 }, { \"x\": 4, \"y\": 48, \"c\": 1 },\n                    { \"x\": 5, \"y\": 24, \"c\": 0 }, { \"x\": 5, \"y\": 49, \"c\": 1 },\n                    { \"x\": 6, \"y\": 87, \"c\": 0 }, { \"x\": 6, \"y\": 66, \"c\": 1 },\n                    { \"x\": 7, \"y\": 17, \"c\": 0 }, { \"x\": 7, \"y\": 27, \"c\": 1 },\n                    { \"x\": 8, \"y\": 68, \"c\": 0 }, { \"x\": 8, \"y\": 16, \"c\": 1 },\n                    { \"x\": 9, \"y\": 49, \"c\": 0 }, { \"x\": 9, \"y\": 15, \"c\": 1 }\n                ],\n                \"transform\": [\n                    {\n                        \"type\": \"stack\",\n                        \"groupby\": [\"x\"],\n                        \"sort\": { \"field\": \"c\" },\n                        \"field\": \"y\"\n                    }\n                ]\n            }\n        ],\n        \"scales\": [\n            {\n                \"name\": \"x\",\n                \"type\": \"band\",\n                \"range\": \"width\",\n                \"domain\": { \"data\": \"table\", \"field\": \"x\" }\n            },\n            {\n                \"name\": \"y\",\n                \"type\": \"linear\",\n                \"range\": \"height\",\n                \"nice\": true, \"zero\": true,\n                \"domain\": { \"data\": \"table\", \"field\": \"y1\" }\n            },\n            {\n                \"name\": \"color\",\n                \"type\": \"ordinal\",\n                \"range\": \"category\",\n                \"domain\": { \"data\": \"table\", \"field\": \"c\" }\n            }\n        ],\n        \"axes\": [\n            { \"orient\": \"bottom\", \"scale\": \"x\", \"title\": \"X Axis\", \"tickColor\": \"red\", \"tickWidth\": 3, \"labelColor\": \"blue\", \"titleColor\": \"green\" },\n            { \"orient\": \"left\", \"scale\": \"y\", \"title\": \"Y Axis\", \"domainColor\": \"magenta\", \"domainWidth\": 2, \"tickWidth\": 7 }\n        ],\n        \"marks\": [\n            {\n                \"type\": \"rect\",\n                \"from\": { \"data\": \"table\" },\n                \"encode\": {\n                    \"enter\": {\n                        \"x\": { \"scale\": \"x\", \"field\": \"x\" },\n                        \"width\": { \"scale\": \"x\", \"band\": 1, \"offset\": -1 },\n                        \"y\": { \"scale\": \"y\", \"field\": \"y0\" },\n                        \"y2\": { \"scale\": \"y\", \"field\": \"y1\" },\n                        \"fill\": { \"scale\": \"color\", \"field\": \"c\" }\n                    },\n                    \"update\": {\n                        \"fillOpacity\": { \"value\": 1 }\n                    },\n                    \"hover\": {\n                        \"fillOpacity\": { \"value\": 0.5 }\n                    }\n                }\n            }\n        ],\n        \"legends\": [\n            {\n                \"fill\": \"color\",\n                \"title\": \"Legend\",\n                \"encode\": {\n                    \"symbols\": {\n                        \"update\": {\n                            \"shape\": { \"value\": \"square\" }\n                        }\n                    }\n                }\n            }\n        ]\n    };\n    var view = new SandDance.VegaDeckGl.ViewGl(vega.parse(spec), { getView: function () { return '2d'; } })\n        .renderer('deck.gl')\n        .initialize(document.querySelector('#vis'))\n        .run();\n})(vegaDeckglTest || (vegaDeckglTest = {}));\n"
  },
  {
    "path": "docs/tests/v3/umd/qualBarChartTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance qualBarChartTest</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v3/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance qualBarChartTest</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/qualBarChartTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/quanBarChartTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance quanBarChartTest</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v3/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance quanBarChartTest</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/quanBarChartTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/sanddance-specs.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>sanddance-specs demo</title>\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-specs@1/dist/umd/sanddance-specs.js\" charset=\"utf-8\"></script>\n</head>\n\n<body>\n    <div id=\"view\"></div>\n    <script>\n        vega.loader().load('https://sanddance.js.org/sample-data/titanicmaster.tsv').then(tsv_data => {\n            const data = vega.read(tsv_data, { type: 'tsv', parse: 'auto' });\n\n            const insight = {\n                \"colorBin\": \"quantize\",\n                \"columns\": {\n                    \"x\": \"Gender\",\n                    \"color\": \"Survived\",\n                    \"sort\": \"Survived\",\n                    \"facet\": \"Age\"\n                },\n                \"scheme\": \"set1\",   //see https://vega.github.io/vega/docs/schemes/#reference\n                \"facetStyle\": \"wrap\",\n                \"size\": {\n                    \"height\": 600,\n                    \"width\": 800\n                },\n                \"chart\": \"barchartV\"\n            };\n\n            const columns = SandDanceSpecs.getColumnsFromData(vega.inferTypes, data);\n            const specColumns = SandDanceSpecs.getSpecColumns(insight, columns);\n            const specViewOptions = {\n                colors: {\n                    defaultCube: \"steelblue\",\n                    axisLine: \"#000\",\n                    axisText: \"#000\"\n                },\n                language: {\n                    count: \"Count\"\n                },\n                maxLegends: 20,\n                tickSize: 10\n            };\n            const context = { specColumns, insight, specViewOptions };\n            const specResult = SandDanceSpecs.build(context, data);\n\n            if (specResult.errors) {\n                console.log(specResult.errors);\n            } else {\n                console.log(specResult.vegaSpec);\n            }\n\n            const runtime = vega.parse(specResult.vegaSpec);\n            const vegaView = new vega.View(runtime, {\n                renderer: 'canvas',  // renderer (canvas or svg)\n                container: '#view',   // parent DOM container\n            });\n            vegaView.runAsync().then(() => {\n                console.log(`done`);\n            }).catch(e => {\n                console.log(`error ${e}`);\n            });\n\n        });\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/scatterplotTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance scatterplot test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v3/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist/dist.dev.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance scatterplot test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/scatterplotTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/specs/scatter3D.json",
    "content": "{\n    \"$schema\": \"https://vega.github.io/schema/vega/v3.json\",\n    \"width\": 700,\n    \"height\": 700,\n    \"padding\": 5,\n    \"signals\": [\n        {\n            \"name\": \"depth\",\n            \"value\": 700\n        },\n        {\n            \"name\": \"xaxis\",\n            \"value\": \"Longitude\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"yaxis\",\n            \"value\": \"Latitude\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"zaxis\",\n            \"value\": \"Obama\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"colorBy\",\n            \"value\": \"Income\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"size\",\n            \"value\": \"MedAge\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"reverseColor\",\n            \"value\": false,\n            \"bind\": {\n                \"input\": \"checkbox\"\n            }\n        }\n    ],\n    \"projections\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"albersUsa\"\n        }\n    ],\n    \"data\": [\n        {\n            \"name\": \"source\",\n            \"format\": {\n                \"type\": \"tsv\",\n                \"parse\": \"auto\"\n            },\n            \"url\": \"../../../sample-data/demovote.tsv\",\n            \"transform\": [\n                {\n                    \"type\": \"geopoint\",\n                    \"projection\": \"projection\",\n                    \"fields\": [\n                        \"Longitude\",\n                        \"Latitude\"\n                    ],\n                    \"as\": [\n                        \"ProjLongitude\",\n                        \"ProjLatitude\"\n                    ]\n                }\n            ]\n        }\n    ],\n    \"scales\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"xaxis\"\n                }\n            },\n            \"range\": \"width\"\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"yaxis\"\n                }\n            },\n            \"range\": \"height\"\n        },\n        {\n            \"name\": \"z\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"zaxis\"\n                }\n            },\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"depth\"\n                }\n            ]\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": false,\n            \"zero\": true,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"size\"\n                }\n            },\n            \"range\": [\n                5,\n                30\n            ]\n        },\n        {\n            \"name\": \"mycolorscale\",\n            \"type\": \"sequential\",\n            \"interpolate\": \"rgb\",\n            \"reverse\": {\n                \"signal\": \"reverseColor\"\n            },\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"colorBy\"\n                }\n            },\n            \"range\": [\n                \"#0000ff\",\n                \"#00ff00\",\n                \"#ff0000\"\n            ]\n        }\n    ],\n    \"axes\": [\n        {\n            \"scale\": \"x\",\n            \"grid\": true,\n            \"domain\": false,\n            \"orient\": \"bottom\",\n            \"tickCount\": 5,\n            \"title\": {\n                \"signal\": \"xaxis\"\n            }\n        },\n        {\n            \"scale\": \"y\",\n            \"grid\": true,\n            \"domain\": false,\n            \"orient\": \"left\",\n            \"titlePadding\": 5,\n            \"title\": {\n                \"signal\": \"yaxis\"\n            }\n        }\n    ],\n    \"marks\": [\n        {\n            \"name\": \"marks2\",\n            \"type\": \"rect\",\n            \"from\": {\n                \"data\": \"source\"\n            },\n            \"encode\": {\n                \"update\": {\n                    \"x\": {\n                        \"scale\": \"x\",\n                        \"field\": {\n                            \"signal\": \"xaxis\"\n                        }\n                    },\n                    \"y\": {\n                        \"scale\": \"y\",\n                        \"field\": {\n                            \"signal\": \"yaxis\"\n                        }\n                    },\n                    \"z\": {\n                        \"scale\": \"z\",\n                        \"field\": {\n                            \"signal\": \"zaxis\"\n                        }\n                    },\n                    \"depth\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"width\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"height\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"opacity\": {\n                        \"value\": 0.6\n                    },\n                    \"fill\": {\n                        \"scale\": \"mycolorscale\",\n                        \"field\": {\n                            \"signal\": \"colorBy\"\n                        }\n                    },\n                    \"stroke\": {\n                        \"scale\": \"mycolorscale\",\n                        \"field\": {\n                            \"signal\": \"colorBy\"\n                        }\n                    }\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "docs/tests/v3/umd/specs/titanic.json",
    "content": "{\n    \"$schema\": \"https://vega.github.io/schema/vega/v3.json\",\n    \"height\": 500,\n    \"padding\": 5,\n    \"signals\": [\n        {\n            \"name\": \"columns\",\n            \"value\": 17,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 10,\n                \"max\": 35,\n                \"step\": 1\n            }\n        },\n        {\n            \"name\": \"bins\",\n            \"value\": 7,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 2,\n                \"max\": 20,\n                \"step\": 1\n            }\n        },\n        {\n            \"name\": \"x_step\",\n            \"value\": 200,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 60,\n                \"max\": 200,\n                \"step\": 20\n            }\n        },\n        {\n            \"name\": \"x_padding\",\n            \"value\": 0.2\n        },\n        {\n            \"name\": \"width\",\n            \"update\": \"bandspace(domain('xscale2').length, x_padding, x_padding) * x_step\"\n        },\n        {\n            \"name\": \"height\",\n            \"update\": \"(rowxtent[1])*(bandwidth('xscale')+2*x_padding)\"\n        },\n        {\n            \"name\": \"newheight2\",\n            \"update\": \"(rowxtent[1]-1)*(bandwidth('xscale')+2*x_padding)\"\n        },\n        {\n            \"name\": \"variable\",\n            \"value\": \"Age\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"Age\",\n                    \"TicketCost\"\n                ]\n            }\n        }\n    ],\n    \"data\": [\n        {\n            \"name\": \"points\",\n            \"format\": {\n                \"type\": \"tsv\",\n                \"parse\": \"auto\"\n            },\n            \"url\": \"../../../sample-data/titanicmaster.tsv\"\n        },\n        {\n            \"name\": \"nested\",\n            \"source\": \"points\",\n            \"transform\": [\n                {\n                    \"type\": \"extent\",\n                    \"field\": {\n                        \"signal\": \"variable\"\n                    },\n                    \"signal\": \"age_extent\"\n                },\n                {\n                    \"type\": \"bin\",\n                    \"field\": {\n                        \"signal\": \"variable\"\n                    },\n                    \"extent\": {\n                        \"signal\": \"age_extent\"\n                    },\n                    \"maxbins\": {\n                        \"signal\": \"bins\"\n                    },\n                    \"as\": [\n                        \"age0\",\n                        \"age1\"\n                    ]\n                },\n                {\n                    \"type\": \"stack\",\n                    \"groupby\": [\n                        \"age0\"\n                    ],\n                    \"sort\": {\n                        \"field\": {\n                            \"signal\": \"variable\"\n                        }\n                    }\n                },\n                {\n                    \"type\": \"formula\",\n                    \"expr\": \"floor(datum.y0 / columns)\",\n                    \"as\": \"row\"\n                },\n                {\n                    \"type\": \"extent\",\n                    \"signal\": \"xtent\",\n                    \"field\": \"y1\"\n                },\n                {\n                    \"type\": \"extent\",\n                    \"signal\": \"rowxtent\",\n                    \"field\": \"row\"\n                },\n                {\n                    \"type\": \"formula\",\n                    \"expr\": \"datum.y0 % columns\",\n                    \"as\": \"column\"\n                }\n            ]\n        }\n    ],\n    \"scales\": [\n        {\n            \"name\": \"xscale\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"x_step * (1-x_padding)\"\n                }\n            ],\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"column\",\n                \"sort\": true\n            }\n        },\n        {\n            \"name\": \"yscale\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"newheight2\"\n                }\n            ],\n            \"round\": true,\n            \"reverse\": true,\n            \"align\": 1,\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"row\",\n                \"sort\": true\n            },\n            \"zero\": true,\n            \"nice\": true\n        },\n        {\n            \"name\": \"yscalea\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"height\"\n                }\n            ],\n            \"round\": true,\n            \"reverse\": true,\n            \"align\": 1,\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"row\",\n                \"sort\": true\n            },\n            \"zero\": true,\n            \"nice\": true\n        },\n        {\n            \"name\": \"xscale2\",\n            \"type\": \"band\",\n            \"range\": {\n                \"step\": {\n                    \"signal\": \"x_step\"\n                }\n            },\n            \"padding\": {\n                \"signal\": \"x_padding\"\n            },\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"age0\",\n                \"sort\": true\n            }\n        },\n        {\n            \"name\": \"mycolor\",\n            \"type\": \"linear\",\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": {\n                    \"signal\": \"variable\"\n                }\n            },\n            \"range\": {\n                \"scheme\": \"redyellowgreen\"\n            }\n        }\n    ],\n    \"axes\": [\n        {\n            \"orient\": \"bottom\",\n            \"scale\": \"xscale2\",\n            \"zindex\": 1\n        },\n        {\n            \"orient\": \"left\",\n            \"scale\": \"yscalea\",\n            \"zindex\": 1,\n            \"title\": \"People\",\n            \"encode\": {\n                \"ticks\": {\n                    \"update\": {\n                        \"stroke\": {\n                            \"value\": \"steelblue\"\n                        }\n                    }\n                },\n                \"labels\": {\n                    \"interactive\": true,\n                    \"update\": {\n                        \"text\": {\n                            \"signal\": \"columns * datum.value\"\n                        }\n                    }\n                }\n            }\n        }\n    ],\n    \"marks\": [\n        {\n            \"type\": \"rect\",\n            \"from\": {\n                \"data\": \"nested\"\n            },\n            \"encode\": {\n                \"update\": {\n                    \"x\": {\n                        \"scale\": \"xscale2\",\n                        \"field\": \"age0\",\n                        \"offset\": {\n                            \"scale\": \"xscale\",\n                            \"field\": \"column\"\n                        }\n                    },\n                    \"width\": {\n                        \"scale\": \"xscale\",\n                        \"band\": true\n                    },\n                    \"y\": {\n                        \"scale\": \"yscale\",\n                        \"field\": \"row\",\n                        \"band\": true\n                    },\n                    \"z\": {\n                        \"field\": \"TicketCost\"\n                    },\n                    \"depth\": {\n                        \"value\": 10\n                    },\n                    \"id\": {\n                        \"field\": \"Id\"\n                    },\n                    \"height\": {\n                        \"scale\": \"xscale\",\n                        \"band\": true\n                    },\n                    \"fill\": {\n                        \"scale\": \"mycolor\",\n                        \"field\": {\n                            \"signal\": \"variable\"\n                        }\n                    },\n                    \"stroke\": {\n                        \"value\": \"white\"\n                    }\n                },\n                \"hover\": {\n                    \"fill\": {\n                        \"value\": \"firebrick\"\n                    }\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "docs/tests/v3/umd/test.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v3/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/test.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/transforms.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v3/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance transforms test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/transforms.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/transition.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>vega-deck.gl transition</title>\n    <link rel=\"stylesheet\" href=\"css/transition.css\">\n</head>\n\n<body class=\"columns\">\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n\n    <header>\n        <h1>vega-deck.gl transition editor</h1>\n        <button id=\"view-type-button\" onclick=\"transition.toggleView()\">2D / 3D</button>\n    </header>\n    <div id=\"split-left\" class=\"double\">\n        <div class=\"textform\">\n            <textarea id=\"text1\"></textarea>\n            <button onclick=\"transition.getText('text1')\">Apply this spec</button>\n        </div>\n        <div class=\"textform\">\n            <textarea id=\"text2\"></textarea>\n            <button onclick=\"transition.getText('text2')\">Apply this spec</button>\n        </div>\n    </div>\n    <div id=\"split-right\">\n    </div>\n    <div id=\"error\"></div>\n    <footer>\n    </footer>\n\n    <script src=\"js/transition.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/treeMapTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance scatterplot test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v3/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance treemap test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/treeMapTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v3/umd/vega-deck.gl.test.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-deck.gl test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/vega-deck.gl.test.css\" />\n    <script src=\"https://unpkg.com/vega@^5.17/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/deck.gl@~8.3/dist.min.js\"></script>\n    <script src=\"../../../dist/sanddance/v3/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>vega-deck.gl test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/vega-deck.gl.test.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/es6/app.html",
    "content": "---\n---\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/sanddance-app.css\">\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/sanddance-app-site.css?2\">\n    <link rel=\"shortcut icon\" href=\"../../../favicon.ico\" />\n</head>\n\n<body>\n    <!-- link to JSON files so we can get a url from the bundler -->\n    <a class=\"sanddance-app-static-content\" id=\"demovote\" data-display-name=\"Demo Vote\" data-type=\"tsv\"\n        href=\"../../../sample-data/demovote.tsv\"></a>\n    <a class=\"sanddance-app-static-content\" id=\"titanic\" data-display-name=\"Titanic\" data-type=\"tsv\"\n        href=\"../../../sample-data/titanicmaster.tsv\"></a>\n\n    <script>\n        function setTheme(darkTheme) {\n            localStorage.setItem('theme', darkTheme ? 'Dark' : 'Light');\n        }\n        var darkTheme = localStorage.getItem('theme') === 'Dark';\n        var insights = {\n            \"titanic\": {\n                \"columns\": {\n                    \"uid\": \"Name\",\n                    \"x\": \"Gender\",\n                    \"y\": \"Joined\",\n                    \"color\": \"Survived\",\n                    \"z\": \"TicketCost\",\n                    \"sort\": \"Survived\"\n                },\n                \"scheme\": \"dual_redgreen\",\n                \"chart\": \"barchart\",\n                \"view\": \"2d\"\n            },\n            \"demovote\": {\n                \"columns\": {\n                    \"uid\": \"Id\",\n                    \"x\": \"Longitude\",\n                    \"y\": \"Latitude\",\n                    \"color\": \"Obama\",\n                    \"z\": \"Education\",\n                    \"sort\": \"State\"\n                },\n                \"scheme\": \"redblue\",\n                \"chart\": \"scatterplot\",\n                \"view\": \"2d\",\n                \"colorBin\": \"quantize\"\n            }\n        };\n        var options = {\n            \"*\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleColor_BinCountSignal\": 7\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            \"titanic\": {\n                \"chartPrefs\": {\n                    \"barchart\": {\n                        \"color\": {\n                            \"Gender\": {\n                                \"scheme\": \"set2\"\n                            }\n                        }\n                    }\n                }\n            },\n            \"demovote\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"color\": {\n                            \"Winner\": {\n                                \"scheme\": \"dual_bluered\"\n                            }\n                        }\n                    },\n                    \"stacks\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleX_BinsSignal\": 30,\n                                    \"RoleY_BinsSignal\": 30\n                                }\n                            }\n                        }\n                    }\n                },\n                \"tooltipExclusions\": [\"Id\", \"Latitude\", \"Longitude\"]\n            }\n        };\n    </script>\n\n    <main id=\"app\"></main>\n\n    <footer>\n        {% include footer-links.html %}\n    </footer>\n\n    <script src=\"https://unpkg.com/react@17/umd/react.development.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@17/umd/react-dom.development.js\" crossorigin></script>\n    <script src=\"js/sanddance-app.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/es6/css/sanddance-app-site.css",
    "content": "html,\nbody {\n    height: 100%;\n    margin: 0;\n}\n\nbody {\n    display: grid;\n    font-family: 'Segoe UI', sans-serif;\n    grid-template-rows: auto 0fr;\n}\nselect,\nbutton,\ninput {\n    font-family: 'Segoe UI', sans-serif;\n}\n\nheader {\n    border-bottom: 1px solid #ccc;\n    font-size: smaller;\n    padding: 5px 1em;\n}\n\nfooter {\n    border-top: 1px solid #ccc;\n    font-size: smaller;\n    padding: 5px 1em;\n}\n"
  },
  {
    "path": "docs/tests/v4/es6/css/sanddance-app.css",
    "content": ".sanddance-app-static-content {\n  display: none;\n}\n\n.sanddance-app {\n  display: grid;\n  grid-template-rows: 100% 0;\n  height: 100%;\n}\n\n.sanddance-export .ms-Button {\n  margin-bottom: 1em;\n  margin-top: 0.5em;\n}\n\n.sanddance-datasource-picker {\n  width: 100%;\n}\n\n.sanddance-root {\n  height: 100%;\n  position: relative;\n  width: 100%;\n}\n\n.sanddance-gl {\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.sanddance-gl.show-center {\n  background: linear-gradient(to right, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%), linear-gradient(to bottom, transparent 49.9%, rgba(255, 0, 0, 0.7), transparent 50.1%);\n}\n\n.sanddance-gl canvas {\n  outline: none;\n}\n\n.sanddance-panel {\n  position: absolute;\n  top: 1em;\n  right: 1em;\n  bottom: 1em;\n  background: #fff;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  border: 1px solid #ccc;\n  overflow-y: scroll;\n  padding-bottom: 1em;\n  padding-left: 1em;\n}\n\n.sanddance-legend table {\n  border-collapse: collapse;\n}\n\n.sanddance-legend th {\n  word-break: break-word;\n  max-width: 11em;\n}\n\n.sanddance-legend .legend-row {\n  cursor: pointer;\n}\n\n.sanddance-legend .legend-row td {\n  padding: 2px;\n}\n\n.sanddance-legend .legend-row:hover {\n  background-color: #efefef;\n}\n\n.sanddance-legend .symbol div {\n  border-style: outset;\n  border-width: 1.5px;\n}\n\n.sanddance-legend .label {\n  max-width: 9em;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n.sanddance-details {\n  font-size: smaller;\n}\n\n.sanddance-details-scroll {\n  padding-bottom: 1em;\n}\n\n.sanddance-tooltip {\n  z-index: 1;\n}\n\n.sanddance-tooltip table {\n  background: #333;\n  color: #fff;\n  font-size: smaller;\n  margin: 1em;\n  min-width: 16em;\n  padding: 6px;\n  position: absolute;\n}\n\n.sanddance-tooltip td {\n  max-width: 16em;\n  overflow: hidden;\n  text-align: left;\n  text-overflow: ellipsis;\n  vertical-align: top;\n  width: 75%;\n}\n\n.sanddance-tooltip td:first-child {\n  width: 25%;\n}\n\n.sanddance-scheme.disabled {\n  filter: grayscale(95%);\n}\n\n.sanddance-scheme.option {\n  display: grid;\n  grid-template-columns: 10em auto;\n  width: 100%;\n}\n\n.sanddance-scheme.title {\n  justify-content: flex-start;\n}\n\n.sanddance-scheme span {\n  align-self: center;\n}\n\n.sanddance-scheme svg, .sanddance-scheme .swatch {\n  align-self: center;\n  border: thin solid #777;\n  height: 24px;\n}\n\n.sanddance-scheme svg {\n  width: 100%;\n}\n\n.sanddance-scheme .swatch div {\n  display: inline-block;\n  width: 10px;\n  height: 24px;\n}\n\n.sanddance-explorer-topbar {\n  background-color: #fff;\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: 300px auto;\n  height: 36px;\n}\n\n.sanddance-explorer-topbar .logo {\n  color: rgb(0, 120, 212);\n  display: grid;\n  grid-template-columns: 50px auto;\n  padding: 6px 0;\n}\n\n.sanddance-explorer-topbar .logo svg {\n  fill: rgb(0, 120, 212);\n  height: 24px;\n  margin: 0 auto;\n  width: 24px;\n}\n\n.sanddance-explorer-topbar .logo a {\n  color: inherit;\n  font-size: 14px;\n  font-weight: bold;\n  line-height: 24px;\n  text-decoration: none;\n}\n\n.sanddance-explorer-commandbar {\n  position: relative;\n}\n\n.sanddance-explorer-commandbar > div {\n  left: 0;\n  position: absolute;\n  right: 0;\n}\n\n.sanddance-explorer-commandbar .ms-CommandBar {\n  height: 36px;\n}\n\n.dark-theme .sanddance-explorer-topbar {\n  background-color: #000;\n}\n\n.dark-theme .sanddance-explorer-topbar .logo {\n  color: #00b4f0;\n}\n\n.sanddance-group {\n  border-top: 1px solid #ccc;\n  padding-bottom: 1.5em;\n  position: relative;\n}\n\n.sanddance-group .group-head {\n  display: grid;\n  grid-template-columns: auto auto;\n  line-height: 16px;\n  margin: 1em 0;\n}\n\n.sanddance-group .group-head label {\n  font-size: 11px;\n  font-weight: 600;\n  letter-spacing: 3px;\n  opacity: 0.8;\n  text-transform: uppercase;\n}\n\n.sanddance-group .group-head .count {\n  color: #333;\n  font-size: 12px;\n  text-align: right;\n}\n\n.sanddance-group .group-icon {\n  position: absolute;\n  top: -1px;\n  right: 0;\n}\n\n.sanddance-group:first-child {\n  border-top: none;\n}\n\n.sanddance-group:first-child .group-head {\n  margin-top: 0;\n}\n\n.sanddance-group:last-child {\n  padding-bottom: 0;\n}\n\n.sanddance-sidebar {\n  background-color: #f9f9f9;\n  display: grid;\n  overflow: hidden;\n  position: relative;\n  transition: width 350ms cubic-bezier(0.4, 0, 0.2, 1);\n  width: 300px;\n}\n\n.sanddance-sidebar:not(.pinned) {\n  bottom: 0;\n  position: absolute;\n  top: 0;\n}\n\n.sanddance-sidebar .sidebar-content {\n  background-color: inherit;\n  display: grid;\n  grid-template-areas: \"stats stats\" \"tabs bar\";\n  grid-template-columns: 50px auto;\n  grid-template-rows: 0fr auto;\n  height: 100%;\n  overflow: hidden;\n  position: absolute;\n  z-index: 1;\n}\n\n.sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.1);\n  display: grid;\n  grid-area: tabs;\n  grid-template-rows: auto 0fr;\n  position: relative;\n}\n\n.sanddance-sidebar .vbutton {\n  align-self: center;\n  display: grid;\n  height: 60px;\n}\n\n.sanddance-sidebar .vbutton.selected {\n  background-color: #f9f9f9;\n}\n\n.sanddance-sidebar .vbutton button {\n  height: 100%;\n  width: 100%;\n}\n\n.sanddance-sidebar .vbutton button .ms-Button-icon {\n  font-size: 20px;\n}\n\n.sanddance-sidebar .sidebar-dialogs .vbutton {\n  height: 16.6666666667%;\n  max-height: 60px;\n  min-height: 32px;\n}\n\n.sanddance-sidebar .scrollable-container {\n  width: 250px;\n}\n\n.sanddance-sidebar .sidetab {\n  grid-area: bar;\n  padding: 12px;\n}\n\n.sanddance-sidebar.closed {\n  width: 50px;\n}\n\n.sanddance-sidebar.calculator .calculating {\n  background: rgba(249, 249, 249, 0.5);\n  height: 100%;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.sanddance-sidebar.calculator .ms-Spinner {\n  margin-top: -16px;\n  position: relative;\n  top: 50%;\n}\n\n.dark-theme .sanddance-sidebar {\n  background-color: #272727;\n  color: #fff;\n}\n\n.dark-theme .sanddance-sidebar .vbuttons {\n  background-color: rgba(0, 0, 0, 0.4);\n}\n\n.dark-theme .sanddance-sidebar .vbutton.selected {\n  background-color: #272727;\n}\n\n.dark-theme .sanddance-sidebar.calculator .calculating {\n  background: rgba(39, 39, 39, 0.5);\n}\n\n.sanddance-chart-type .ms-ChoiceFieldGroup-flexContainer {\n  display: grid;\n  grid-template-columns: repeat(2, 50%);\n  grid-auto-flow: column;\n  grid-template-rows: repeat(4, auto);\n}\n\n.sanddance-datascope {\n  grid-area: stats;\n  background-color: rgba(0, 0, 0, 0.05);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n  min-height: 5em;\n}\n\n.sanddance-datascope.extended > div {\n  margin: 12px;\n  width: 276px;\n}\n\n.sanddance-datascope label {\n  display: block;\n  font-size: 10px;\n  text-transform: uppercase;\n}\n\n.sanddance-datascope.compact {\n  align-self: center;\n  cursor: pointer;\n  display: grid;\n  text-align: center;\n  width: 50px;\n}\n\n.sanddance-datascope.compact > div {\n  align-self: center;\n}\n\n.sanddance-datascope .datascope-button {\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  box-sizing: border-box;\n  height: 36px;\n  min-width: unset;\n  width: 33.333%;\n}\n\n.sanddance-datascope .datascope-button:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-datascope .datascope-button label {\n  cursor: inherit;\n}\n\n.sanddance-datascope.active .datascope-button.selected {\n  border-color: rgb(0, 120, 212);\n}\n\n.dark-theme .sanddance-datascope {\n  background-color: rgba(0, 0, 0, 0.3);\n  border-bottom-color: rgba(255, 255, 255, 0.1);\n}\n\n.dark-theme .sanddance-datascope .datascope-button {\n  background-color: #000;\n  border-color: rgba(255, 255, 255, 0.2);\n  color: #fff;\n}\n\n.dark-theme .sanddance-datascope .datascope-button:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-dataItem {\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n\n.sanddance-dataItem .name-value {\n  border-top: 1px solid #ddd;\n  cursor: pointer;\n  padding: 4px;\n  position: relative;\n  word-break: break-all;\n}\n\n.sanddance-dataItem .name-value:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-dataItem .name-value:first-child {\n  border-top: none;\n}\n\n.sanddance-dataItem .column-name {\n  font-weight: 500;\n}\n\n.sanddance-dataItem .column-value {\n  max-height: 20em;\n  overflow: auto;\n}\n\n.sanddance-dataItem .bing-search {\n  text-align: right;\n}\n\n.dark-theme .sanddance-dataItem {\n  background-color: #000;\n  border-color: #222;\n}\n\n.dark-theme .sanddance-dataItem .name-value {\n  border-top-color: #222;\n}\n\n.dark-theme .sanddance-dataItem a {\n  color: #00b4f0;\n}\n\n.sanddance-dataIndex .index {\n  display: grid;\n  grid-template-columns: 32px auto 32px;\n  line-height: 32px;\n  margin: 0px -8px 6px -8px;\n  text-align: center;\n}\n\n.sanddance-dataIndex .item-filtered {\n  background-color: rgba(0, 0, 0, 0.1);\n  font-size: 10px;\n  padding: 2px 4px;\n  text-transform: uppercase;\n}\n\n.sanddance-dataIndex .ms-Dropdown-container {\n  margin-bottom: 0.5em;\n}\n\n.sanddance-dataIndex button {\n  margin-top: 1em;\n}\n\n.scrollable-container {\n  display: grid;\n  min-height: 200px;\n  position: relative;\n}\n\n.scrollable {\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  right: 0;\n  overflow-y: auto;\n  top: 0;\n}\n\n.sanddance-search .sanddance-search-group {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n}\n\n.sanddance-search .sanddance-search-group {\n  background: #fff;\n  margin-top: 1em;\n  padding: 4px;\n}\n\n.sanddance-search .sanddance-search-group:first-child {\n  margin-top: 0;\n}\n\n.sanddance-search .sanddance-search-expression {\n  background-color: rgba(0, 0, 0, 0.1);\n  margin: 12px 4px;\n  padding: 4px 8px 8px 8px;\n}\n\n.sanddance-search .search-action {\n  width: 100%;\n}\n\n.sanddance-search .search-bottom-action {\n  margin-top: 1em;\n}\n\n.sanddance-search .search-field {\n  margin-top: 4px;\n}\n\n.dark-theme .sanddance-search .sanddance-search-group {\n  border-color: rgba(255, 255, 255, 0.2);\n  background: #000;\n}\n\n.dark-theme .sanddance-search .sanddance-search-expression {\n  background-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-snapshots .ms-Button {\n  margin-bottom: 0.5em;\n}\n\n.sanddance-snapshots .snapshot {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  cursor: pointer;\n  margin-bottom: 0.5em;\n  padding: 5px;\n}\n\n.sanddance-snapshots .snapshot.selected {\n  border-color: rgba(0, 0, 0, 0.6);\n  border-width: 2px;\n  padding: 4px;\n}\n\n.sanddance-snapshots .snapshot:hover {\n  background-color: rgba(0, 0, 0, 0.1);\n}\n\n.sanddance-snapshots .snapshot:first-child {\n  margin-top: 0.5em;\n}\n\n.sanddance-snapshots .title {\n  font-weight: 500;\n  word-break: break-word;\n}\n\n.sanddance-snapshots .description {\n  font-weight: 100;\n  word-break: break-word;\n}\n\n.sanddance-snapshots .thumbnail {\n  display: grid;\n  height: 160px;\n  margin-top: 0.5em;\n}\n\n.sanddance-snapshots img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n\n.sanddance-snapshots .actions {\n  display: grid;\n  grid-auto-flow: column;\n}\n\n.sanddance-snapshots .actions a, .sanddance-snapshots .actions span {\n  align-self: center;\n  text-align: center;\n}\n\n.sanddance-snapshots .actions button {\n  width: 100%;\n}\n\n.sanddance-snapshot-dialog .thumbnail {\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  display: grid;\n  height: 300px;\n  margin-top: 1em;\n}\n\n.sanddance-snapshot-dialog img {\n  height: 100%;\n  object-fit: contain;\n  width: 100%;\n}\n\n.dark-theme .sanddance-snapshots .snapshot {\n  background-color: rgba(0, 0, 0, 0.6);\n  border-color: rgba(255, 255, 255, 0.2);\n}\n\n.dark-theme .sanddance-snapshots .snapshot.selected {\n  border-color: rgba(255, 255, 255, 0.6);\n}\n\n.dark-theme .sanddance-snapshots .snapshot:hover {\n  background-color: rgb(0, 0, 0);\n}\n\n.dark-theme .sanddance-snapshots .actions a {\n  color: #fff;\n}\n\n.dark-theme.sanddance-snapshot-dialog .thumbnail {\n  border-color: rgba(255, 255, 255, 0.2);\n}\n\n.sanddance-history ol {\n  padding-left: 20px;\n}\n\n.sanddance-history li {\n  border: 1px solid transparent;\n  cursor: pointer;\n}\n\n.sanddance-history li.selected {\n  font-weight: bold;\n}\n\n.sanddance-history-button {\n  background: none;\n  border: 0;\n  font-size: inherit;\n  font-style: inherit;\n  font-weight: inherit;\n  height: unset;\n  padding: 3px 4px;\n  text-align: left;\n  width: 100%;\n}\n\n.sanddance-history-button .ms-Button-label {\n  display: inline;\n  font-weight: inherit;\n  margin: 0;\n}\n\n.sanddance-note {\n  background-color: #fffacd;\n  border: 1px solid #333;\n  box-shadow: 8px 8px 12px -6px #ccc;\n  color: #333;\n  margin: 1em;\n  padding: 20px;\n  position: absolute;\n  width: 15em;\n  word-break: break-word;\n}\n\n.sanddance-note .cancel {\n  position: absolute;\n  right: -1px;\n  top: -1px;\n}\n\n.sanddance-note .cancel i {\n  color: #333;\n}\n\n.sanddance-columnMap {\n  position: relative;\n}\n\n.sanddance-columnMap .ms-Dropdown-container {\n  margin-top: 10px;\n}\n\n.sanddance-columnMap .column-options {\n  bottom: 3px;\n  position: absolute;\n  right: 0;\n}\n\n.sanddance-columnMap-absolute {\n  margin-bottom: 1em;\n  margin-left: -4em;\n  margin-right: 1em;\n  margin-top: -1em;\n}\n\n.sanddance-columnMap-absolute .ms-Dropdown-container {\n  margin-top: 0;\n}\n\n.sanddance-tooltip {\n  z-index: 2;\n}\n\n.sanddance-chart-button {\n  display: block;\n  margin-top: 10px;\n}\n\n.sanddance-columnTypes {\n  max-height: 20em;\n  overflow: scroll;\n}\n\n.sanddance-columnTypes th, .sanddance-columnTypes td {\n  padding: 0 5px;\n}\n\n.sanddance-columnTypes td, .sanddance-columnTypes button {\n  height: 18px;\n}\n\n.sanddance-columnTypes tr.changed {\n  text-decoration: line-through;\n}\n\n.sanddance-dialog ul {\n  margin: 0;\n}\n\n.sanddance-dialog section {\n  margin-top: 1em;\n}\n\n.sanddance-dialog section:first-child {\n  margin-top: 0;\n}\n\n.sanddance-dialog .tip {\n  font-style: italic;\n}\n\n.sanddance-explorer {\n  display: grid;\n  font-family: \"Segoe UI\", sans-serif;\n  font-size: 13px;\n  grid-template-rows: 0fr auto;\n}\n\n.sanddance-explorer.dark-theme {\n  background-color: black;\n}\n\n.sanddance-explorer.dark-theme canvas {\n  background-color: black;\n}\n\n.sanddance-main {\n  display: grid;\n  position: relative;\n  transition: grid-template-columns 350ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.sanddance-main .loading {\n  grid-row-end: span 2;\n  position: relative;\n}\n\n.sanddance-main .loading .ms-Spinner {\n  position: absolute;\n  top: 50%;\n  width: 100%;\n}\n\n.sanddance-main .sanddance-view {\n  display: grid;\n  position: relative;\n  margin-left: 50px;\n}\n\n.sanddance-main .sanddance-layout-unpinned, .sanddance-main .sanddance-layout-pinned {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n}\n\n.sanddance-main.hide-legend .sanddance-layout-unpinned, .sanddance-main.hide-legend .sanddance-layout-pinned {\n  right: 0;\n}\n\n.sanddance-main .sanddance-layout-pinned {\n  left: 300px;\n}\n\n.sanddance-main .sanddance-ReactViewer {\n  overflow: hidden;\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n}\n\n.sanddance-main.hide-legend .sanddance-ReactViewer {\n  left: 0;\n}\n\n.sanddance-main.show-center .sanddance-layout-unpinned, .sanddance-main.show-center .sanddance-layout-pinned {\n  background: linear-gradient(to right, transparent 49%, rgba(255, 0, 255, 0.2), transparent 51%);\n  background-color: rgba(0, 255, 255, 0.1);\n}\n\n.sanddance-main.pinned {\n  grid-template-columns: 300px auto;\n  grid-template-areas: \"side main\";\n}\n\n.sanddance-main.pinned .sanddance-view {\n  grid-area: main;\n  margin-left: 0;\n}\n\n.sanddance-main.pinned .loading {\n  grid-area: main;\n  grid-row-end: unset;\n}\n\n.sanddance-main.pinned .sanddance-slidePanel {\n  grid-area: side;\n}\n\n.sanddance-main.pinned.closed {\n  grid-template-columns: 0 auto;\n}\n\n.sanddance-main.pinned.closed .sanddance-view {\n  margin-left: 50px;\n}\n\n.sanddance-main span.ms-layer {\n  display: none;\n}\n\n.sanddance-advanced-renderer {\n  height: 36px;\n  position: absolute;\n  right: 0;\n  top: 0;\n  width: 40px;\n}\n\n.sanddance-renderer-dialog ul {\n  list-style-type: none;\n  padding-left: 2em;\n}\n\n.sanddance-background-image-dialog {\n  min-width: 32em;\n}\n\n.sanddance-background-image-dialog .thumbnail {\n  border-bottom: 1px solid #ccc;\n  display: grid;\n  grid-template-columns: auto auto;\n  padding-bottom: 1em;\n}\n\n.sanddance-background-image-dialog .thumbnail > * {\n  align-self: center;\n}\n\n.sanddance-background-image-dialog .thumbnail img {\n  margin-right: 1em;\n  max-height: 160px;\n  max-width: 16em;\n  object-fit: contain;\n}\n\n.sanddance-background-image-dialog .axis-bounds {\n  border-bottom: 1px solid #ccc;\n  padding-bottom: 1em;\n}\n\n.sanddance-background-image-dialog .axis-bound-fields {\n  display: grid;\n  column-gap: 1em;\n  grid-template-columns: auto auto;\n  margin-bottom: 1em;\n}\n\n#sanddance-vega-spec {\n  border: 1px inset;\n  max-height: 20em;\n  overflow: scroll;\n}\n\n.sanddance-panel {\n  top: 5em;\n  bottom: unset;\n  overflow-y: unset;\n  padding-right: 1em;\n  padding-top: 32px;\n}\n\n.sanddance-panel h4,\n.sanddance-panel .sanddance-vegaControls,\n.sanddance-panel .sanddance-unitControls {\n  display: none;\n}\n\n.sanddance-main.hide-legend .sanddance-panel {\n  display: none;\n}\n\n.sanddance-panel-tools {\n  position: absolute;\n  top: 0;\n  right: 0;\n}\n\n.sanddance-legend {\n  min-width: 54px;\n}\n\n.sanddance-explanation {\n  font-size: smaller;\n  font-style: italic;\n  margin-bottom: 1em;\n}\n\n.sanddance-explanation .fieldname,\n.sanddance-explanation .fieldtype {\n  font-style: italic;\n}\n\n.sanddance-signal {\n  margin-top: 1em;\n}\n\n.sanddance-legend th {\n  color: #005a9e;\n  cursor: pointer;\n}\n\n.sanddance-legend th:hover {\n  background-color: rgba(43, 136, 216, 0.3333333333);\n}\n\n.sanddance-legend .legend-row:hover {\n  background-color: rgb(0, 120, 212);\n  color: #fff;\n}\n\n.sanddance-form-separate {\n  margin-top: 1em;\n}\n\n.dark-theme .sanddance-dialog a {\n  color: #00b4f0;\n}\n\n.dark-theme .sanddance-panel {\n  background-color: #000;\n  color: #fff;\n}\n\n.dark-theme .sanddance-legend th {\n  color: #3ac5f3;\n}\n\n.dark-theme .sanddance-legend th:hover {\n  color: #009ed3;\n}\n\n\n.sanddance-sidebar .sanddance-datascope {\n  min-height: 7em;\n}\n\n/*# sourceMappingURL=sanddance-app.css.map */\n"
  },
  {
    "path": "docs/tests/v4/es6/css/sanddance-test-es6.css",
    "content": ".sanddance-gl {\n    border: 1px solid #ccc;\n    float: left;\n    height: 700px;\n    width: 700px;\n    margin-right: 1em;\n}\n\n.sanddance-tooltip table {\n    background: #333;\n    color: #fff;\n    font-size: smaller;\n    margin: 1em;\n    min-width: 16em;\n    padding: 6px;\n    position: absolute; \n}\n  \n.sanddance-tooltip td {\n    text-align: left;\n    vertical-align: top;\n    width: 75%; \n}\n\n.sanddance-tooltip td:first-child {\n    width: 25%; \n}\n  "
  },
  {
    "path": "docs/tests/v4/es6/css/vega-morphcharts-test-es6.css",
    "content": "\nhtml,\nbody {\n    font-family: sans-serif;\n    height: 100%;\n}\n\nbody.rows {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-areas: \"header\" \"view\" \"footer\";\n    margin: 0;\n    overflow: scroll;\n}\n\nbody.columns {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-columns: 40% 60%;\n    grid-template-areas: \"header header\" \"left right\" \"footer footer\";\n    margin: 0;\n}\n\nheader {\n    border-bottom: 1px solid silver;\n    grid-area: header;\n    padding: 0 2em;\n}\n\nfooter {\n    border-top: 1px solid silver;\n    grid-area: footer;\n    padding: 0 2em;\n}\n\n#view-type-button {\n    position: absolute;\n    right: 2em;\n    top: 2em;\n}\n\n#view-div, #view-div .vega-morphcharts-gl {\n    height: 100%;\n}\n\n#split-left {\n    grid-area: left;\n    overflow: hidden;\n}\n#vis {\n   grid-area: right;\n   position: relative;\n}\n\n.textform {\n    background-color: #ccc;\n    display: grid;\n    grid-template-rows: auto 2em;\n    height: 100%;\n}\n\n#split-left textarea {\n    border: 0;\n    height: 100%;\n    padding: 0 0 0 5px;\n    resize: none;\n}\n\n#split-right,\n#error {\n    grid-area: right;\n}\n\n#error {\n    font-size: larger;\n    padding: 1em;\n}\n\n#split-right .vega-bindings {\n    padding: 1em;\n}\n\n.vega-morphcharts-root {\n    display: grid;\n    grid-template-rows: auto 200px;\n    height: 100%;\n}\n\n.vega-morphcharts-legend {\n    font-family: sans-serif;\n    position: absolute;\n    right: 1em;\n    top: 1em;\n    z-index: 1;\n}\n"
  },
  {
    "path": "docs/tests/v4/es6/js/sanddance-app.js",
    "content": "(function(global2, factory) {\n  typeof exports === \"object\" && typeof module !== \"undefined\" ? factory(require(\"react\"), require(\"react-dom\")) : typeof define === \"function\" && define.amd ? define([\"react\", \"react-dom\"], factory) : (global2 = typeof globalThis !== \"undefined\" ? globalThis : global2 || self, factory(global2.React, global2.ReactDOM));\n})(this, (function(React, ReactDOM) {\n  \"use strict\";\n  function _interopNamespaceDefault(e) {\n    const n = Object.create(null, { [Symbol.toStringTag]: { value: \"Module\" } });\n    if (e) {\n      for (const k in e) {\n        if (k !== \"default\") {\n          const d2 = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d2.get ? d2 : {\n            enumerable: true,\n            get: () => e[k]\n          });\n        }\n      }\n    }\n    n.default = e;\n    return Object.freeze(n);\n  }\n  const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);\n  const ReactDOM__namespace = /* @__PURE__ */ _interopNamespaceDefault(ReactDOM);\n  const FieldNames = {\n    Active: \"__SandDance__Active\",\n    Collapsed: \"__SandDance__Collapsed\",\n    Contains: \"__SandDance__Contains\",\n    Count: \"__SandDance__Count\",\n    Sum: \"__SandDance__Sum\",\n    SumOfCount: \"__SandDance__CountSum\",\n    SumOfSum: \"__SandDance__SumSum\",\n    Selected: \"__SandDance__Selected\",\n    First: \"__SandDance__First\",\n    Last: \"__SandDance__Last\",\n    Top: \"__SandDance__Top\",\n    TopColor: \"__SandDance__TopColor\",\n    TopIndex: \"__SandDance__TopIndex\",\n    PowerBISelectionId: \"__SandDance__PowerBISelectionId\",\n    FacetSearch: \"__SandDance__FacetSearch\",\n    FacetTitle: \"__SandDance__FacetTitle\",\n    Ordinal: \"__SandDance__Ordinal\",\n    WrapCol: \"__SandDance__WrapCol\",\n    WrapRow: \"__SandDance__WrapRow\",\n    Value: \"__SandDance__Value\",\n    OffsetX: \"__SandDance__X\",\n    OffsetY: \"__SandDance__Y\",\n    OffsetHeight: \"__SandDance__H\",\n    OffsetWidth: \"__SandDance__W\"\n  };\n  const ScaleNames = {\n    Color: \"scale_color\",\n    X: \"scale_x\",\n    Y: \"scale_y\",\n    Z: \"scale_z\"\n  };\n  const SignalNames = {\n    ViewportWidth: \"ViewportWidth\",\n    ViewportHeight: \"ViewportHeight\",\n    MinCellWidth: \"MinCellWidth\",\n    MinCellHeight: \"MinCellHeight\",\n    PlotOffsetLeft: \"PlotOffsetLeft\",\n    PlotOffsetTop: \"PlotOffsetTop\",\n    PlotOffsetBottom: \"PlotOffsetBottom\",\n    PlotOffsetRight: \"PlotOffsetRight\",\n    PlotHeightIn: \"PlotHeightIn\",\n    PlotWidthIn: \"PlotWidthIn\",\n    PlotHeightOut: \"PlotHeightOut\",\n    PlotWidthOut: \"PlotWidthOut\",\n    ColorBinCount: \"RoleColor_BinCountSignal\",\n    ColorReverse: \"RoleColor_ReverseSignal\",\n    FacetAxesAdjustX: \"RoleFacet_AxesAdjustSignalX\",\n    FacetAxesAdjustY: \"RoleFacet_AxesAdjustSignalY\",\n    FacetBins: \"RoleFacet_BinsSignal\",\n    FacetVBins: \"RoleFacetV_BinsSignal\",\n    FacetPaddingTop: \"FacetPaddingTop\",\n    FacetPaddingBottom: \"FacetPaddingBottom\",\n    FacetPaddingLeft: \"FacetPaddingLeft\",\n    MarkOpacity: \"Mark_OpacitySignal\",\n    PointScale: \"Chart_PointScaleSignal\",\n    TextAngleX: \"Text_AngleXSignal\",\n    TextAngleY: \"Text_AngleYSignal\",\n    TextScale: \"Text_ScaleSignal\",\n    TextSize: \"Text_SizeSignal\",\n    TextTitleSize: \"Text_TitleSizeSignal\",\n    TreeMapMethod: \"Chart_TreeMapMethodSignal\",\n    XBins: \"RoleX_BinsSignal\",\n    YBins: \"RoleY_BinsSignal\",\n    ZHeight: \"RoleZ_HeightSignal\",\n    ZGrounded: \"RoleZ_Grounded\",\n    ZProportion: \"RoleZ_ProportionSignal\"\n  };\n  const Other = \"__Other\";\n  const ColorScaleNone = \"none\";\n  const defaultBins = 10;\n  const maxbins = 100;\n  const minBarBandWidth = 15;\n  const minFacetWidth = 140;\n  const minFacetHeight = 180;\n  const facetPaddingLeft = 40;\n  const facetPaddingTop = 40;\n  const facetPaddingBottom = 40;\n  const facetPaddingRight = 40;\n  const axesLabelLimit = 100;\n  const axesTitleLimit = 100;\n  const axesTitlePaddingX = 30;\n  const axesTitlePaddingY = 60;\n  const axesTitlePaddingFacetX = 69;\n  const axesTitlePaddingFacetY = 92;\n  const axesOffsetX = 120;\n  const axesOffsetY = 120;\n  const scatterSizedDiv = 20;\n  const debounce$1 = 250;\n  function allowNoneForSize(specContext) {\n    switch (specContext.insight.totalStyle) {\n      case \"sum-strip\":\n      case \"sum-strip-percent\":\n      case \"sum-treemap\":\n        return false;\n      default:\n        return true;\n    }\n  }\n  function barchartH(specContext) {\n    var _a2, _b2, _c2, _d2;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { language } = specViewOptions;\n    const showAxes = !insight.hideAxes;\n    const bandProps = {\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes\n    };\n    const x2 = { title: null };\n    const axisScales = {\n      x: x2,\n      y: { title: (_a2 = specColumns.y) === null || _a2 === void 0 ? void 0 : _a2.name },\n      z: { title: (_b2 = specColumns.z) === null || _b2 === void 0 ? void 0 : _b2.name }\n    };\n    const layouts = [{\n      layoutType: \"Band\",\n      props: bandProps\n    }];\n    const { totalStyle, view } = insight;\n    if (totalStyle === \"sum-strip-percent\") {\n      x2.aggregate = \"percent\";\n      x2.title = language.percent;\n      const stripProps = {\n        addPercentageScale: true,\n        sortOrder: \"ascending\",\n        orientation: \"horizontal\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes,\n        view\n      };\n      layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n      });\n    } else {\n      const aggProps = {\n        niceScale: true,\n        dock: \"left\",\n        globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n        globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n        sumBy: specColumns.size,\n        showAxes\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props: aggProps\n      });\n      switch (totalStyle) {\n        case \"sum-treemap\": {\n          x2.aggregate = \"sum\";\n          x2.title = language.sum;\n          const treemapProps = {\n            corner: \"top-left\",\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Treemap\",\n            props: treemapProps\n          });\n          break;\n        }\n        case \"sum-strip\": {\n          x2.aggregate = \"sum\";\n          x2.title = language.sum;\n          const stripProps = {\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        case \"count-strip\": {\n          x2.aggregate = \"count\";\n          x2.title = language.count;\n          const stripProps = {\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        default: {\n          x2.aggregate = \"count\";\n          x2.title = language.count;\n          const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: \"down-right\",\n            z: specColumns.z,\n            maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n            maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Square\",\n            props: squareProps\n          });\n          break;\n        }\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: true,\n        percentage: true,\n        roles: [\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_c2 = specColumns.y) === null || _c2 === void 0 ? void 0 : _c2.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_d2 = specColumns.z) === null || _d2 === void 0 ? void 0 : _d2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function barchartV(specContext) {\n    var _a2, _b2;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { language } = specViewOptions;\n    const showAxes = !insight.hideAxes;\n    const bandProps = {\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes\n    };\n    const y2 = { title: null };\n    const axisScales = {\n      x: { title: specColumns.x && specColumns.x.name },\n      y: y2,\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [{\n      layoutType: \"Band\",\n      props: bandProps\n    }];\n    const { totalStyle, view } = insight;\n    if (totalStyle === \"sum-strip-percent\") {\n      y2.aggregate = \"percent\";\n      y2.title = language.percent;\n      const stripProps = {\n        addPercentageScale: true,\n        sortOrder: \"descending\",\n        orientation: \"vertical\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes,\n        view\n      };\n      layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n      });\n    } else {\n      const aggProps = {\n        niceScale: true,\n        dock: \"bottom\",\n        globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n        globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n        sumBy: specColumns.size,\n        showAxes\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props: aggProps\n      });\n      switch (totalStyle) {\n        case \"sum-treemap\": {\n          y2.aggregate = \"sum\";\n          y2.title = language.sum;\n          const treemapProps = {\n            corner: \"bottom-left\",\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Treemap\",\n            props: treemapProps\n          });\n          break;\n        }\n        case \"sum-strip\": {\n          y2.aggregate = \"sum\";\n          y2.title = language.sum;\n          const stripProps = {\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        case \"count-strip\": {\n          y2.aggregate = \"count\";\n          y2.title = language.count;\n          const stripProps = {\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        default: {\n          y2.aggregate = \"count\";\n          y2.title = language.count;\n          const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: \"right-up\",\n            z: specColumns.z,\n            maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n            maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Square\",\n            props: squareProps\n          });\n          break;\n        }\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: true,\n        percentage: true,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_b2 = specColumns.z) === null || _b2 === void 0 ? void 0 : _b2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function density(specContext) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const axisScales = {\n      x: { title: (_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.name },\n      y: { title: (_b2 = specColumns.y) === null || _b2 === void 0 ? void 0 : _b2.name },\n      z: { title: (_c2 = specColumns.z) === null || _c2 === void 0 ? void 0 : _c2.name }\n    };\n    const backgroundImage = ((_d2 = specColumns.x) === null || _d2 === void 0 ? void 0 : _d2.quantitative) && ((_e2 = specColumns.y) === null || _e2 === void 0 ? void 0 : _e2.quantitative) && ((_f = insight.backgroundImage) === null || _f === void 0 ? void 0 : _f.extents) && insight.backgroundImage;\n    const showAxes = !(backgroundImage || insight.hideAxes);\n    const hBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom }\n    };\n    const vBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left }\n    };\n    const aggProps = {\n      onBuild: null,\n      aggregation: null,\n      sumBy: specColumns.size\n    };\n    const layouts = [\n      {\n        layoutType: \"Band\",\n        props: vBandProps\n      },\n      {\n        layoutType: \"Band\",\n        props: hBandProps\n      },\n      {\n        layoutType: \"AggregateSquare\",\n        props: aggProps\n      }\n    ];\n    const { totalStyle, view } = insight;\n    switch (totalStyle) {\n      case \"sum-treemap\": {\n        aggProps.aggregation = \"sum\";\n        const treemapProps = {\n          corner: \"bottom-left\",\n          size: specColumns.size,\n          treeMapMethod: specViewOptions.language.treeMapMethod,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Treemap\",\n          props: treemapProps\n        });\n        break;\n      }\n      case \"sum-strip\": {\n        aggProps.aggregation = \"sum\";\n        const stripProps = {\n          sortOrder: \"ascending\",\n          orientation: \"vertical\",\n          size: specColumns.size,\n          sort: specColumns.sort,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Strip\",\n          props: stripProps\n        });\n        break;\n      }\n      case \"count-strip\": {\n        aggProps.aggregation = \"count\";\n        const stripProps = {\n          sortOrder: \"ascending\",\n          orientation: \"vertical\",\n          sort: specColumns.sort,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Strip\",\n          props: stripProps\n        });\n        break;\n      }\n      default: {\n        aggProps.aggregation = \"count\";\n        const squareProps = {\n          sortBy: specColumns.sort,\n          fillDirection: \"right-down\",\n          z: specColumns.z,\n          maxGroupedUnits: null,\n          maxGroupedFillSize: null,\n          showAxes,\n          view\n        };\n        aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled) => {\n          squareProps.maxGroupedUnits = aggMaxExtent;\n          squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n        };\n        layouts.push({\n          layoutType: \"Square\",\n          props: squareProps\n        });\n        break;\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: true,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function grid(specContext) {\n    var _a2;\n    const { insight, specColumns } = specContext;\n    const { view } = insight;\n    const squareProps = {\n      sortBy: specColumns.sort,\n      fillDirection: \"right-down\",\n      z: specColumns.z,\n      collapseYHeight: true,\n      showAxes: !insight.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    return {\n      axisScales,\n      layouts: [\n        {\n          layoutType: \"Square\",\n          props: squareProps\n        }\n      ],\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"z\",\n            axisSelection: ((_a2 = specColumns.z) === null || _a2 === void 0 ? void 0 : _a2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function scatterplot(specContext) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const backgroundImageExtents = ((_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.quantitative) && ((_b2 = specColumns.y) === null || _b2 === void 0 ? void 0 : _b2.quantitative) && ((_c2 = insight.backgroundImage) === null || _c2 === void 0 ? void 0 : _c2.extents);\n    const scatterProps = {\n      x: specColumns.x,\n      y: specColumns.y,\n      z: specColumns.z,\n      size: specColumns.size,\n      scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n      zGrounded: specViewOptions.language.zGrounded,\n      backgroundImageExtents,\n      showAxes: !(backgroundImageExtents || insight.hideAxes),\n      view: insight.view\n    };\n    const axisScales = {\n      x: { title: (_d2 = specColumns.x) === null || _d2 === void 0 ? void 0 : _d2.name },\n      y: { title: (_e2 = specColumns.y) === null || _e2 === void 0 ? void 0 : _e2.name },\n      z: { title: (_f = specColumns.z) === null || _f === void 0 ? void 0 : _f.name }\n    };\n    return {\n      axisScales,\n      layouts: [\n        {\n          layoutType: \"Scatter\",\n          props: scatterProps\n        }\n      ],\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"x\",\n            axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\"\n          },\n          {\n            role: \"y\",\n            axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? \"range\" : \"exact\"\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: false\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            excludeCategoric: true,\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ],\n        signals: [SignalNames.PointScale, SignalNames.ZGrounded]\n      }\n    };\n  }\n  function stacks(specContext) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const axisScales = {\n      x: { title: (_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.name },\n      y: { title: (_b2 = specColumns.y) === null || _b2 === void 0 ? void 0 : _b2.name },\n      z: { title: specViewOptions.language.count }\n    };\n    const backgroundImage = ((_c2 = specColumns.x) === null || _c2 === void 0 ? void 0 : _c2.quantitative) && ((_d2 = specColumns.y) === null || _d2 === void 0 ? void 0 : _d2.quantitative) && ((_e2 = insight.backgroundImage) === null || _e2 === void 0 ? void 0 : _e2.extents) && insight.backgroundImage;\n    const showAxes = !(backgroundImage || insight.hideAxes);\n    const hBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom }\n    };\n    const vBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left }\n    };\n    const stackProps = {\n      sort: specColumns.sort,\n      showAxes\n    };\n    return {\n      axisScales,\n      customZScale: true,\n      layouts: [\n        {\n          layoutType: \"Band\",\n          props: vBandProps\n        },\n        {\n          layoutType: \"Band\",\n          props: hBandProps\n        },\n        {\n          layoutType: \"Stack\",\n          props: stackProps\n        }\n      ],\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_f = specColumns.x) === null || _f === void 0 ? void 0 : _f.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_g = specColumns.y) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function strips(specContext) {\n    var _a2;\n    const { insight, specColumns } = specContext;\n    const { view } = insight;\n    const stripProps = {\n      sortOrder: \"ascending\",\n      orientation: \"vertical\",\n      size: specColumns.size,\n      sort: specColumns.sort,\n      z: specColumns.z,\n      showAxes: !insight.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n      axisScales.y = {\n        title: null,\n        aggregate: specColumns.size ? \"sum\" : \"count\"\n      };\n      const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n      const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n      const props = {\n        dock: \"top\",\n        niceScale: false,\n        globalAggregateMaxExtentScaledSignal,\n        globalAggregateMaxExtentSignal,\n        sumBy: specColumns.size,\n        showAxes: false\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props\n      });\n    }\n    layouts.push({\n      layoutType: \"Strip\",\n      props: stripProps\n    });\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"size\",\n            allowNone: true,\n            //size by none is a count\n            excludeCategoric: true\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_a2 = specColumns.z) === null || _a2 === void 0 ? void 0 : _a2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function treemap$1(specContext) {\n    var _a2;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { view } = insight;\n    const treemapProps = {\n      corner: \"top-left\",\n      group: specColumns.group,\n      size: specColumns.size,\n      treeMapMethod: specViewOptions.language.treeMapMethod,\n      z: specColumns.z,\n      showAxes: !insight.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n      axisScales.y = {\n        title: null,\n        aggregate: \"sum\"\n      };\n      const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n      const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n      const props = {\n        dock: \"top\",\n        niceScale: false,\n        globalAggregateMaxExtentScaledSignal,\n        globalAggregateMaxExtentSignal,\n        sumBy: specColumns.size,\n        showAxes: false\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props\n      });\n    }\n    layouts.push({\n      layoutType: \"Treemap\",\n      props: treemapProps\n    });\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"size\",\n            excludeCategoric: true\n          },\n          {\n            role: \"group\",\n            allowNone: true\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_a2 = specColumns.z) === null || _a2 === void 0 ? void 0 : _a2.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ],\n        signals: [SignalNames.TreeMapMethod]\n      }\n    };\n  }\n  function getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n    let layoutPair;\n    const groupby = facetColumn;\n    const plotPadding = {\n      x: 0,\n      y: 0\n    };\n    let facetPadding;\n    switch (facetStyle) {\n      case \"cross\": {\n        const props = {\n          axisTextColor,\n          colRowTitles: true,\n          groupbyX: groupby,\n          groupbyY: facetVColumn\n        };\n        layoutPair = {\n          layoutType: \"Cross\",\n          props\n        };\n        facetPadding = {\n          bottom: facetPaddingBottom,\n          left: facetPaddingLeft,\n          top: 0\n        };\n        plotPadding.y = facetPaddingTop;\n        plotPadding.x = facetPaddingRight;\n        break;\n      }\n      case \"wrap\":\n      default: {\n        const props = {\n          axisTextColor,\n          cellTitles: true,\n          groupby\n        };\n        layoutPair = {\n          layoutType: \"Wrap\",\n          props\n        };\n        facetPadding = {\n          bottom: facetPaddingBottom,\n          left: facetPaddingLeft,\n          top: facetPaddingTop\n        };\n        break;\n      }\n    }\n    const facetLayout = {\n      facetPadding,\n      plotPadding\n    };\n    return {\n      layoutPair,\n      facetLayout\n    };\n  }\n  const map$4 = {\n    barchart: barchartV,\n    barchartH,\n    barchartV,\n    density,\n    grid,\n    scatterplot,\n    stacks,\n    strips,\n    treemap: treemap$1\n  };\n  function getSpecBuilderPropsForChart(specContext) {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const fn2 = map$4[insight.chart];\n    if (fn2) {\n      const props = fn2(specContext);\n      if (insight.columns.facet) {\n        const discreteFacetColumn = {\n          column: specColumns.facet,\n          defaultBins,\n          maxbins,\n          maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n          maxbinsSignalName: SignalNames.FacetBins\n        };\n        const discreteFacetVColumn = {\n          column: specColumns.facetV,\n          defaultBins,\n          maxbins,\n          maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n          maxbinsSignalName: SignalNames.FacetVBins\n        };\n        const { facetLayout, layoutPair } = getFacetLayout(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n        props.layouts.unshift(layoutPair);\n        props.facetLayout = facetLayout;\n        props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n      }\n      return props;\n    }\n  }\n  function define2(constructor, factory, prototype2) {\n    constructor.prototype = factory.prototype = prototype2;\n    prototype2.constructor = constructor;\n  }\n  function extend$1(parent, definition2) {\n    var prototype2 = Object.create(parent.prototype);\n    for (var key2 in definition2) prototype2[key2] = definition2[key2];\n    return prototype2;\n  }\n  function Color$2() {\n  }\n  var darker = 0.7;\n  var brighter = 1 / darker;\n  var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`), reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`), reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`), reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`), reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`), reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n  var named = {\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  };\n  define2(Color$2, color$2, {\n    copy(channels) {\n      return Object.assign(new this.constructor(), this, channels);\n    },\n    displayable() {\n      return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    // Deprecated! Use color.formatHex.\n    formatHex: color_formatHex,\n    formatHex8: color_formatHex8,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n  });\n  function color_formatHex() {\n    return this.rgb().formatHex();\n  }\n  function color_formatHex8() {\n    return this.rgb().formatHex8();\n  }\n  function color_formatHsl() {\n    return hslConvert(this).formatHsl();\n  }\n  function color_formatRgb() {\n    return this.rgb().formatRgb();\n  }\n  function color$2(format2) {\n    var m2, l;\n    format2 = (format2 + \"\").trim().toLowerCase();\n    return (m2 = reHex.exec(format2)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format2)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format2)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format2)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format2)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n  }\n  function rgbn(n) {\n    return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1);\n  }\n  function rgba(r, g, b2, a2) {\n    if (a2 <= 0) r = g = b2 = NaN;\n    return new Rgb(r, g, b2, a2);\n  }\n  function rgbConvert(o) {\n    if (!(o instanceof Color$2)) o = color$2(o);\n    if (!o) return new Rgb();\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n  }\n  function rgb$1(r, g, b2, opacity2) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b2, opacity2 == null ? 1 : opacity2);\n  }\n  function Rgb(r, g, b2, opacity2) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b2;\n    this.opacity = +opacity2;\n  }\n  define2(Rgb, rgb$1, extend$1(Color$2, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb() {\n      return this;\n    },\n    clamp() {\n      return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n    },\n    displayable() {\n      return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);\n    },\n    hex: rgb_formatHex,\n    // Deprecated! Use color.formatHex.\n    formatHex: rgb_formatHex,\n    formatHex8: rgb_formatHex8,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n  }));\n  function rgb_formatHex() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n  }\n  function rgb_formatHex8() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n  }\n  function rgb_formatRgb() {\n    const a2 = clampa(this.opacity);\n    return `${a2 === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a2 === 1 ? \")\" : `, ${a2})`}`;\n  }\n  function clampa(opacity2) {\n    return isNaN(opacity2) ? 1 : Math.max(0, Math.min(1, opacity2));\n  }\n  function clampi(value2) {\n    return Math.max(0, Math.min(255, Math.round(value2) || 0));\n  }\n  function hex(value2) {\n    value2 = clampi(value2);\n    return (value2 < 16 ? \"0\" : \"\") + value2.toString(16);\n  }\n  function hsla(h2, s2, l, a2) {\n    if (a2 <= 0) h2 = s2 = l = NaN;\n    else if (l <= 0 || l >= 1) h2 = s2 = NaN;\n    else if (s2 <= 0) h2 = NaN;\n    return new Hsl(h2, s2, l, a2);\n  }\n  function hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color$2)) o = color$2(o);\n    if (!o) return new Hsl();\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b2 = o.b / 255, min2 = Math.min(r, g, b2), max2 = Math.max(r, g, b2), h2 = NaN, s2 = max2 - min2, l = (max2 + min2) / 2;\n    if (s2) {\n      if (r === max2) h2 = (g - b2) / s2 + (g < b2) * 6;\n      else if (g === max2) h2 = (b2 - r) / s2 + 2;\n      else h2 = (r - g) / s2 + 4;\n      s2 /= l < 0.5 ? max2 + min2 : 2 - max2 - min2;\n      h2 *= 60;\n    } else {\n      s2 = l > 0 && l < 1 ? 0 : h2;\n    }\n    return new Hsl(h2, s2, l, o.opacity);\n  }\n  function hsl$1(h2, s2, l, opacity2) {\n    return arguments.length === 1 ? hslConvert(h2) : new Hsl(h2, s2, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Hsl(h2, s2, l, opacity2) {\n    this.h = +h2;\n    this.s = +s2;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  define2(Hsl, hsl$1, extend$1(Color$2, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h2 = this.h % 360 + (this.h < 0) * 360, s2 = isNaN(h2) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s2, m1 = 2 * l - m2;\n      return new Rgb(\n        hsl2rgb(h2 >= 240 ? h2 - 240 : h2 + 120, m1, m2),\n        hsl2rgb(h2, m1, m2),\n        hsl2rgb(h2 < 120 ? h2 + 240 : h2 - 120, m1, m2),\n        this.opacity\n      );\n    },\n    clamp() {\n      return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n    },\n    displayable() {\n      return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);\n    },\n    formatHsl() {\n      const a2 = clampa(this.opacity);\n      return `${a2 === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a2 === 1 ? \")\" : `, ${a2})`}`;\n    }\n  }));\n  function clamph(value2) {\n    value2 = (value2 || 0) % 360;\n    return value2 < 0 ? value2 + 360 : value2;\n  }\n  function clampt(value2) {\n    return Math.max(0, Math.min(1, value2 || 0));\n  }\n  function hsl2rgb(h2, m1, m2) {\n    return (h2 < 60 ? m1 + (m2 - m1) * h2 / 60 : h2 < 180 ? m2 : h2 < 240 ? m1 + (m2 - m1) * (240 - h2) / 60 : m1) * 255;\n  }\n  const radians$1 = Math.PI / 180;\n  const degrees$2 = 180 / Math.PI;\n  const K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, t0$2 = 4 / 29, t1$1 = 6 / 29, t2 = 3 * t1$1 * t1$1, t3 = t1$1 * t1$1 * t1$1;\n  function labConvert(o) {\n    if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n    if (o instanceof Hcl) return hcl2lab(o);\n    if (!(o instanceof Rgb)) o = rgbConvert(o);\n    var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b2 = rgb2lrgb(o.b), y2 = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b2) / Yn), x2, z2;\n    if (r === g && g === b2) x2 = z2 = y2;\n    else {\n      x2 = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b2) / Xn);\n      z2 = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b2) / Zn);\n    }\n    return new Lab(116 * y2 - 16, 500 * (x2 - y2), 200 * (y2 - z2), o.opacity);\n  }\n  function lab$1(l, a2, b2, opacity2) {\n    return arguments.length === 1 ? labConvert(l) : new Lab(l, a2, b2, opacity2 == null ? 1 : opacity2);\n  }\n  function Lab(l, a2, b2, opacity2) {\n    this.l = +l;\n    this.a = +a2;\n    this.b = +b2;\n    this.opacity = +opacity2;\n  }\n  define2(Lab, lab$1, extend$1(Color$2, {\n    brighter(k) {\n      return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    darker(k) {\n      return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    rgb() {\n      var y2 = (this.l + 16) / 116, x2 = isNaN(this.a) ? y2 : y2 + this.a / 500, z2 = isNaN(this.b) ? y2 : y2 - this.b / 200;\n      x2 = Xn * lab2xyz(x2);\n      y2 = Yn * lab2xyz(y2);\n      z2 = Zn * lab2xyz(z2);\n      return new Rgb(\n        lrgb2rgb(3.1338561 * x2 - 1.6168667 * y2 - 0.4906146 * z2),\n        lrgb2rgb(-0.9787684 * x2 + 1.9161415 * y2 + 0.033454 * z2),\n        lrgb2rgb(0.0719453 * x2 - 0.2289914 * y2 + 1.4052427 * z2),\n        this.opacity\n      );\n    }\n  }));\n  function xyz2lab(t) {\n    return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0$2;\n  }\n  function lab2xyz(t) {\n    return t > t1$1 ? t * t * t : t2 * (t - t0$2);\n  }\n  function lrgb2rgb(x2) {\n    return 255 * (x2 <= 31308e-7 ? 12.92 * x2 : 1.055 * Math.pow(x2, 1 / 2.4) - 0.055);\n  }\n  function rgb2lrgb(x2) {\n    return (x2 /= 255) <= 0.04045 ? x2 / 12.92 : Math.pow((x2 + 0.055) / 1.055, 2.4);\n  }\n  function hclConvert(o) {\n    if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n    if (!(o instanceof Lab)) o = labConvert(o);\n    if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n    var h2 = Math.atan2(o.b, o.a) * degrees$2;\n    return new Hcl(h2 < 0 ? h2 + 360 : h2, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n  }\n  function hcl$1(h2, c2, l, opacity2) {\n    return arguments.length === 1 ? hclConvert(h2) : new Hcl(h2, c2, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Hcl(h2, c2, l, opacity2) {\n    this.h = +h2;\n    this.c = +c2;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  function hcl2lab(o) {\n    if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n    var h2 = o.h * radians$1;\n    return new Lab(o.l, Math.cos(h2) * o.c, Math.sin(h2) * o.c, o.opacity);\n  }\n  define2(Hcl, hcl$1, extend$1(Color$2, {\n    brighter(k) {\n      return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n    },\n    darker(k) {\n      return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n    },\n    rgb() {\n      return hcl2lab(this).rgb();\n    }\n  }));\n  var A = -0.14861, B$1 = 1.78277, C$1 = -0.29227, D$1 = -0.90649, E = 1.97294, ED = E * D$1, EB = E * B$1, BC_DA = B$1 * C$1 - D$1 * A;\n  function cubehelixConvert(o) {\n    if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Rgb)) o = rgbConvert(o);\n    var r = o.r / 255, g = o.g / 255, b2 = o.b / 255, l = (BC_DA * b2 + ED * r - EB * g) / (BC_DA + ED - EB), bl2 = b2 - l, k = (E * (g - l) - C$1 * bl2) / D$1, s2 = Math.sqrt(k * k + bl2 * bl2) / (E * l * (1 - l)), h2 = s2 ? Math.atan2(k, bl2) * degrees$2 - 120 : NaN;\n    return new Cubehelix(h2 < 0 ? h2 + 360 : h2, s2, l, o.opacity);\n  }\n  function cubehelix$1(h2, s2, l, opacity2) {\n    return arguments.length === 1 ? cubehelixConvert(h2) : new Cubehelix(h2, s2, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Cubehelix(h2, s2, l, opacity2) {\n    this.h = +h2;\n    this.s = +s2;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  define2(Cubehelix, cubehelix$1, extend$1(Color$2, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h2 = isNaN(this.h) ? 0 : (this.h + 120) * radians$1, l = +this.l, a2 = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh2 = Math.cos(h2), sinh2 = Math.sin(h2);\n      return new Rgb(\n        255 * (l + a2 * (A * cosh2 + B$1 * sinh2)),\n        255 * (l + a2 * (C$1 * cosh2 + D$1 * sinh2)),\n        255 * (l + a2 * (E * cosh2)),\n        this.opacity\n      );\n    }\n  }));\n  function isColor(cssColorSpecifier) {\n    return !!color$2(cssColorSpecifier);\n  }\n  function checkIsColorData(data2, column) {\n    if (!column.stats.hasColorData) {\n      column.isColorData = false;\n      return;\n    }\n    for (let i = 0; i < data2.length; i++) {\n      if (!isColor(data2[i][column.name])) {\n        column.isColorData = false;\n        return;\n      }\n    }\n    column.isColorData = true;\n  }\n  function isQuantitative(column) {\n    return column.type === \"number\" || column.type === \"integer\";\n  }\n  function detectNegative(columnName, data2) {\n    for (let i = 1; i < data2.length; i++) {\n      const value2 = columnName == null ? data2[i] : data2[i][columnName];\n      if (value2 < 0)\n        return true;\n    }\n    return false;\n  }\n  function detectSequentialColumn(columnName, data2) {\n    if (data2.length < 2)\n      return false;\n    for (let i = 1; i < data2.length; i++) {\n      const curr = columnName == null ? data2[i] : data2[i][columnName];\n      const prev = columnName == null ? data2[i - 1] : data2[i - 1][columnName];\n      if (curr !== prev + 1)\n        return false;\n    }\n    return true;\n  }\n  function getStats(data2, ...args) {\n    let columnName;\n    let columnType;\n    let columnQuantitative;\n    let distinctValuesCallback;\n    if (args.length <= 2) {\n      const column = args[0];\n      columnName = column.name;\n      columnType = column.type;\n      columnQuantitative = column.quantitative;\n      distinctValuesCallback = args[1];\n    } else {\n      columnName = args[0];\n      columnType = args[1];\n      columnQuantitative = args[2];\n      distinctValuesCallback = args[3];\n    }\n    const distinctMap = {};\n    const stats = {\n      nonNull: 0,\n      distinctValueCount: null,\n      max: null,\n      mean: null,\n      min: null\n    };\n    const columnIsString = columnType === \"string\";\n    let sum2 = 0;\n    for (let i = 0; i < data2.length; i++) {\n      const row = data2[i];\n      const value2 = columnName == null ? row : row[columnName];\n      if (columnIsString) {\n        if (value2 !== \"\") {\n          stats.nonNull++;\n        }\n      } else if (value2 != null) {\n        stats.nonNull++;\n      }\n      const num = +value2;\n      distinctMap[value2] = true;\n      if (!isNaN(num)) {\n        if (stats.max === null || num > stats.max) {\n          stats.max = num;\n        }\n        if (stats.min === null || num < stats.min) {\n          stats.min = num;\n        }\n        sum2 += num;\n      }\n      if ((columnType === \"date\" || columnIsString) && !stats.hasColorData && isColor(value2)) {\n        stats.hasColorData = true;\n      }\n    }\n    if (columnQuantitative) {\n      stats.mean = data2.length > 0 && sum2 / data2.length;\n      stats.hasNegative = detectNegative(columnName, data2);\n      if (columnType === \"integer\") {\n        stats.isSequential = detectSequentialColumn(columnName, data2);\n      }\n    }\n    const distinctValues = Object.keys(distinctMap);\n    if (distinctValuesCallback) {\n      distinctValues.sort();\n      distinctValuesCallback(distinctValues);\n    }\n    stats.distinctValueCount = distinctValues.length;\n    return stats;\n  }\n  function getColumnsFromData(inferTypesFn, data2, columnTypes) {\n    const sample = data2[0];\n    const fields = sample ? Object.keys(sample) : [];\n    const inferences = Object.assign(Object.assign({}, inferTypesFn(data2, fields)), columnTypes);\n    const columns = fields.map((name) => {\n      const column = {\n        name,\n        type: inferences[name]\n      };\n      return column;\n    });\n    inferAll(columns, data2);\n    return columns;\n  }\n  function inferAll(columns, data2) {\n    columns.forEach((column) => {\n      if (column) {\n        if (typeof column.quantitative !== \"boolean\") {\n          column.quantitative = isQuantitative(column);\n        }\n        if (!column.stats) {\n          column.stats = getStats(data2, column);\n        }\n        if ((column.type === \"date\" || column.type === \"string\") && typeof column.isColorData !== \"boolean\") {\n          checkIsColorData(data2, column);\n        }\n      }\n    });\n  }\n  let Table$2 = class Table {\n    constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = \"right\") {\n      this.columns = columns;\n      this.rows = rows;\n      this.maxWidth = maxWidth;\n      this.underlineHeaders = underlineHeaders;\n      this.align = align;\n      this.columnWidths = this.columns.map((col, idx) => Math.max(col.length, ...this.rows.map((row) => {\n        var _a2;\n        return ((_a2 = row[idx]) === null || _a2 === void 0 ? void 0 : _a2.length) || 0;\n      })));\n    }\n    createSpaces(num) {\n      return \" \".repeat(num);\n    }\n    groupColumns() {\n      let cumulativeWidth = 0;\n      const columnGroups = [];\n      let currentGroup = [];\n      this.columns.forEach((col, idx) => {\n        const columnSpace = this.columnWidths[idx] + 1;\n        if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n          columnGroups.push(currentGroup);\n          cumulativeWidth = columnSpace;\n          currentGroup = [col];\n        } else {\n          cumulativeWidth += columnSpace;\n          currentGroup.push(col);\n        }\n      });\n      if (currentGroup.length > 0) {\n        columnGroups.push(currentGroup);\n      }\n      return columnGroups;\n    }\n    formatRow(row, group2) {\n      return group2.map((col) => {\n        const idx = this.columns.indexOf(col);\n        const cellValue = row[idx] == null ? \"\" : row[idx].toString();\n        return this.align === \"right\" ? cellValue.padStart(this.columnWidths[idx], \" \") : cellValue.padEnd(this.columnWidths[idx], \" \");\n      }).join(this.createSpaces(1));\n    }\n    formatHeader(group2) {\n      return group2.map((col) => {\n        const idx = this.columns.indexOf(col);\n        return this.align === \"right\" ? col.padStart(this.columnWidths[idx], \" \") : col.padEnd(this.columnWidths[idx], \" \");\n      }).join(this.createSpaces(1));\n    }\n    underlineHeader(group2) {\n      return group2.map((col) => \"-\".repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n    }\n    render() {\n      const output2 = [];\n      const columnGroups = this.groupColumns();\n      columnGroups.forEach((group2, groupIndex) => {\n        const headerRow = this.formatHeader(group2);\n        let section = headerRow + (groupIndex < columnGroups.length - 1 ? \" \\\\\" : \"\") + \"\\n\";\n        if (this.underlineHeaders) {\n          section += this.underlineHeader(group2) + \"\\n\";\n        }\n        this.rows.forEach((row) => {\n          section += this.formatRow(row, group2) + \"\\n\";\n        });\n        output2.push(section);\n        if (groupIndex < columnGroups.length - 1) {\n          output2.push(\"\\n\");\n        }\n      });\n      return output2.join(\"\");\n    }\n  };\n  var pandasSimulation;\n  (function(pandasSimulation2) {\n    const typeMapping = {\n      boolean: \"bool\",\n      number: \"float64\",\n      // Assuming 'number' is used for floating-point numbers\n      date: \"datetime64[ns]\",\n      string: \"object\",\n      integer: \"int64\"\n    };\n    function head(columns, data2, maxWidth = 80) {\n      const numRows = 5;\n      const top = data2.slice(0, numRows);\n      const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n      const columnNames = [\"\"].concat(columns.map((col) => col.name));\n      const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map((col) => {\n        var _a2;\n        return ((_a2 = row[col.name]) === null || _a2 === void 0 ? void 0 : _a2.toString()) || \"\";\n      })));\n      const table = new Table$2(columnNames, rows, maxWidth, false, \"right\");\n      return table.render();\n    }\n    pandasSimulation2.head = head;\n    function info2(columns, data2, maxWidth = 80) {\n      const numRows = data2.length;\n      const output2 = [];\n      output2.push(\"<class 'pandas.core.frame.DataFrame'>\");\n      output2.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n      output2.push(`Data columns (total ${columns.length} columns):\n`);\n      const columnHeaders = [\"#\", \"Column\", \"Non-Null Count\", \"Dtype\"];\n      const rows = columns.map((col, idx) => {\n        const nonNullCount = col.stats.nonNull.toString();\n        const dtype = typeMapping[col.type] || \"unknown\";\n        return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n      });\n      const table = new Table$2(columnHeaders, rows, maxWidth, true, \"left\");\n      output2.push(table.render());\n      const memoryUsage = columns.reduce((total, col) => {\n        var _a2;\n        const exampleValue = (_a2 = data2.find((row) => row[col.name] != null)) === null || _a2 === void 0 ? void 0 : _a2[col.name];\n        if (exampleValue == null)\n          return total;\n        const size = new Blob([exampleValue.toString()]).size;\n        return total + size * numRows;\n      }, 0);\n      output2.push(`\ndtypes: ${columns.filter((col) => col.type === \"number\").length} float64, ${columns.filter((col) => col.type === \"integer\").length} int64, ${columns.filter((col) => col.type === \"string\").length} object`);\n      output2.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n      return output2.join(\"\\n\");\n    }\n    pandasSimulation2.info = info2;\n  })(pandasSimulation || (pandasSimulation = {}));\n  function getSpecColumns(insight, columns) {\n    function getColumnByName(name) {\n      return columns.filter((c2) => c2.name === name)[0];\n    }\n    return {\n      color: getColumnByName(insight.columns && insight.columns.color),\n      facet: getColumnByName(insight.columns && insight.columns.facet),\n      facetV: getColumnByName(insight.columns && insight.columns.facetV),\n      group: getColumnByName(insight.columns && insight.columns.group),\n      size: getColumnByName(insight.columns && insight.columns.size),\n      sort: getColumnByName(insight.columns && insight.columns.sort),\n      uid: getColumnByName(insight.columns && insight.columns.uid),\n      x: getColumnByName(insight.columns && insight.columns.x),\n      y: getColumnByName(insight.columns && insight.columns.y),\n      z: getColumnByName(insight.columns && insight.columns.z)\n    };\n  }\n  function addAxes(scope, ...axes) {\n    if (!axes || !axes.length)\n      return;\n    if (!scope.axes)\n      scope.axes = [];\n    scope.axes.push(...axes.filter(Boolean));\n  }\n  function addData(scope, ...datas) {\n    if (!datas || !datas.length)\n      return;\n    if (!scope.data)\n      scope.data = [];\n    scope.data.push(...datas.filter(Boolean));\n  }\n  function addMarks(scope, ...marks) {\n    if (!marks || !marks.length)\n      return;\n    if (!scope.marks)\n      scope.marks = [];\n    scope.marks.push(...marks.filter(Boolean));\n  }\n  function addScales(scope, ...scales2) {\n    if (!scales2 || !scales2.length)\n      return;\n    if (!scope.scales)\n      scope.scales = [];\n    scope.scales.push(...scales2.filter(Boolean));\n  }\n  function addSignals(scope, ...signals) {\n    if (!signals || !signals.length)\n      return;\n    if (!scope.signals)\n      scope.signals = [];\n    scope.signals.push(...signals.filter(Boolean));\n  }\n  function addTransforms(data2, ...transforms2) {\n    if (!transforms2 || !transforms2.length)\n      return;\n    if (!data2.transform)\n      data2.transform = [];\n    data2.transform.push(...transforms2.filter(Boolean));\n  }\n  function getDataByName(data2, dataName) {\n    for (let i = 0; i < data2.length; i++) {\n      if (data2[i].name === dataName)\n        return { data: data2[i], index: i };\n    }\n  }\n  function getGroupBy(groupings) {\n    const groupby = groupings.map((g) => g.groupby);\n    return groupby.reduce((acc, val) => acc.concat(val), []);\n  }\n  function addOffsets(...offsets2) {\n    return offsets2.filter(Boolean).join(\" + \");\n  }\n  function addGlobalAxes(props) {\n    const { axesOffsets, axisScales, axesScopes, axesTitlePadding, allGlobalScales, globalScope, labelBaseline, plotOffsetSignals, specColumns, specViewOptions } = props;\n    const { scope } = globalScope;\n    allGlobalScales.forEach((globalScales) => {\n      const { scales: scales2 } = globalScales;\n      for (const xyz in scales2) {\n        const _scales = scales2[xyz];\n        if (_scales) {\n          addScales(scope, ..._scales);\n          let { showAxes } = globalScales;\n          let zindex = void 0;\n          if (xyz === \"z\") {\n            showAxes = false;\n            if (props.view === \"3d\" && specViewOptions.zAxisOptions && !props.hideZAxis) {\n              if (specViewOptions.zAxisOptions.showZAxis) {\n                showAxes = true;\n                zindex = specViewOptions.zAxisOptions.zIndex;\n              }\n            }\n          }\n          if (showAxes && axisScales) {\n            const axisScale = axisScales[xyz];\n            if (axisScale) {\n              const lineColor = specViewOptions.colors.axisLine;\n              const horizontal = xyz === \"x\";\n              const column = specColumns[xyz] || { quantitative: true };\n              const title = axisScale.title;\n              const props2 = {\n                title,\n                horizontal,\n                column,\n                specViewOptions,\n                lineColor,\n                titlePadding: axesTitlePadding[xyz],\n                labelBaseline: labelBaseline[xyz],\n                zindex\n              };\n              axesScopes[\"main\"].forEach((a2) => addAxes(a2.scope, createAxis(Object.assign(Object.assign({}, props2), { scale: a2.scale || _scales[0], showTitle: a2.title, showLabels: a2.labels, showLines: a2.lines }))));\n              if (axesScopes[xyz]) {\n                axesScopes[xyz].forEach((a2) => addAxes(a2.scope, createAxis(Object.assign(Object.assign({}, props2), { scale: a2.scale || _scales[0], showTitle: a2.title, showLabels: a2.labels, showLines: a2.lines }))));\n              }\n              if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                const plotOffsetSignal = plotOffsetSignals[xyz];\n                plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n              }\n            }\n          }\n        }\n      }\n    });\n  }\n  function createAxis(props) {\n    const { column, horizontal, labelBaseline, lineColor, scale: scale2, showLabels, showTitle, showLines, specViewOptions, title, titlePadding, zindex } = props;\n    const axis = Object.assign(Object.assign(Object.assign(Object.assign({ zindex, scale: scale2.name, orient: horizontal ? \"bottom\" : \"left\", domain: showLines, ticks: showLines }, showLines && {\n      domainColor: lineColor,\n      tickColor: lineColor,\n      tickSize: specViewOptions.tickSize\n    }), showTitle && {\n      title,\n      titleAlign: horizontal ? \"left\" : \"right\",\n      titleAngle: {\n        signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY\n      },\n      titleColor: specViewOptions.colors.axisText,\n      titleFontSize: {\n        signal: SignalNames.TextTitleSize\n      },\n      titleLimit: axesTitleLimit,\n      titlePadding\n    }), { labels: showLabels }), showLabels && {\n      labelAlign: horizontal ? \"left\" : \"right\",\n      labelBaseline,\n      labelAngle: {\n        signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY\n      },\n      labelColor: specViewOptions.colors.axisText,\n      labelFontSize: {\n        signal: SignalNames.TextSize\n      },\n      labelLimit: axesLabelLimit\n    });\n    if (column.quantitative) {\n      axis.format = \"~r\";\n    }\n    return axis;\n  }\n  function safeFieldName(field2) {\n    return field2.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"').replace(/\\./g, \"\\\\.\").replace(/\\[/g, \"\\\\[\").replace(/\\]/g, \"\\\\]\");\n  }\n  function exprSafeFieldName(field2) {\n    return field2.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, \"\");\n  }\n  function linearScale(scaleName, domain2, range2, reverse2, zero2, nice2 = true) {\n    const scale2 = {\n      name: scaleName,\n      type: \"linear\",\n      range: range2,\n      round: true,\n      reverse: reverse2,\n      domain: domain2,\n      zero: zero2,\n      nice: nice2\n    };\n    return scale2;\n  }\n  function pointScale(scaleName, data2, range2, field2, reverse2) {\n    const scale2 = {\n      name: scaleName,\n      type: \"point\",\n      range: range2,\n      domain: {\n        data: data2,\n        field: safeFieldName(field2),\n        sort: true\n      },\n      padding: 0.5\n    };\n    if (reverse2 !== void 0) {\n      scale2.reverse = reverse2;\n    }\n    return scale2;\n  }\n  function binnableColorScale(scaleName, colorBin, data2, field2, scheme2) {\n    scheme2 = scheme2 || ColorScaleNone;\n    const domain2 = {\n      data: data2,\n      field: safeFieldName(field2)\n    };\n    const range2 = {\n      scheme: scheme2\n    };\n    const reverse2 = { signal: SignalNames.ColorReverse };\n    if (colorBin !== \"continuous\") {\n      range2.count = { signal: SignalNames.ColorBinCount };\n    }\n    switch (colorBin) {\n      case \"continuous\": {\n        const sequentialScale = {\n          name: scaleName,\n          type: \"linear\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return sequentialScale;\n      }\n      case \"quantile\": {\n        const quantileScale = {\n          name: scaleName,\n          type: \"quantile\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return quantileScale;\n      }\n      default: {\n        const quantizeScale = {\n          name: scaleName,\n          type: \"quantize\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return quantizeScale;\n      }\n    }\n  }\n  const defaultZProportion = 0.6;\n  function textSignals(context2, heightSignal) {\n    const { specViewOptions } = context2;\n    const signals = [\n      {\n        name: SignalNames.ZProportion,\n        value: defaultZProportion,\n        bind: {\n          name: specViewOptions.language.zScaleProportion,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 0.1,\n          max: 2,\n          step: 0.1\n        }\n      },\n      {\n        name: SignalNames.ZHeight,\n        update: `${heightSignal} * ${SignalNames.ZProportion}`\n      },\n      {\n        name: SignalNames.TextScale,\n        value: 1.2,\n        bind: {\n          name: specViewOptions.language.textScaleSignal,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 0.5,\n          max: 2,\n          step: 0.1\n        }\n      },\n      {\n        name: SignalNames.TextSize,\n        update: `${SignalNames.TextScale} * 10`\n      },\n      {\n        name: SignalNames.TextTitleSize,\n        update: `${SignalNames.TextScale} * 15`\n      },\n      {\n        name: SignalNames.TextAngleX,\n        value: 30,\n        bind: {\n          name: specViewOptions.language.xAxisTextAngleSignal,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 0,\n          max: 90,\n          step: 1\n        }\n      },\n      {\n        name: SignalNames.TextAngleY,\n        value: 0,\n        bind: {\n          name: specViewOptions.language.yAxisTextAngleSignal,\n          debounce: debounce$1,\n          input: \"range\",\n          min: -90,\n          max: 0,\n          step: 1\n        }\n      },\n      {\n        name: SignalNames.MarkOpacity,\n        value: 1,\n        bind: {\n          name: specViewOptions.language.markOpacitySignal,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 0.1,\n          max: 1,\n          step: 0.05\n        }\n      }\n    ];\n    return signals;\n  }\n  function colorBinCountSignal(context2) {\n    const { specViewOptions } = context2;\n    const signal = {\n      name: SignalNames.ColorBinCount,\n      value: 7,\n      bind: {\n        name: specViewOptions.language.colorBinCount,\n        debounce: debounce$1,\n        input: \"range\",\n        min: 1,\n        max: specViewOptions.maxLegends + 1,\n        step: 1\n      }\n    };\n    return signal;\n  }\n  function colorReverseSignal(context2) {\n    const { specViewOptions } = context2;\n    const signal = {\n      name: SignalNames.ColorReverse,\n      value: false,\n      bind: {\n        name: specViewOptions.language.colorReverse,\n        input: \"checkbox\"\n      }\n    };\n    return signal;\n  }\n  function modifySignal(s2, fn2, update2) {\n    s2.update = `${fn2}((${s2.update}), (${update2}))`;\n  }\n  function legend(column, fill2) {\n    const legend2 = {\n      orient: \"none\",\n      title: column.name,\n      fill: fill2,\n      encode: {\n        symbols: {\n          update: {\n            shape: {\n              value: \"square\"\n            }\n          }\n        }\n      }\n    };\n    if (column.quantitative) {\n      legend2.type = \"symbol\";\n      legend2.format = \"~r\";\n    }\n    return legend2;\n  }\n  function getLegends(context2, fill2) {\n    const { specColumns, insight } = context2;\n    if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n      return [legend(specColumns.color, fill2)];\n    }\n  }\n  function topLookup(column, count2, source2, legend2, lookupName, fieldName, indexName) {\n    const data2 = [\n      {\n        name: lookupName,\n        source: source2,\n        transform: [\n          {\n            type: \"aggregate\",\n            groupby: [safeFieldName(column.name)]\n          },\n          {\n            type: \"window\",\n            ops: [\"count\"],\n            as: [indexName]\n          },\n          {\n            type: \"filter\",\n            expr: `datum[${JSON.stringify(indexName)}] <= ${count2}`\n          }\n        ]\n      },\n      {\n        name: legend2,\n        source: source2,\n        transform: [\n          {\n            type: \"lookup\",\n            from: lookupName,\n            key: safeFieldName(column.name),\n            fields: [column.name].map(safeFieldName),\n            values: [column.name].map(safeFieldName),\n            as: [fieldName]\n          },\n          {\n            type: \"formula\",\n            expr: `datum[${JSON.stringify(fieldName)}] == null ? '${Other}' : datum[${JSON.stringify(fieldName)}]`,\n            as: fieldName\n          }\n        ]\n      }\n    ];\n    return data2;\n  }\n  function addColor(props) {\n    const { colorReverseSignalName, dataName, scope, legendDataName, scaleName, specContext, topLookupName } = props;\n    let colorDataName = dataName;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const legends = getLegends(specContext, scaleName);\n    if (legends) {\n      scope.legends = legends;\n    }\n    const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n    if (categoricalColor) {\n      addData(scope, ...topLookup(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, FieldNames.TopColor, FieldNames.TopIndex));\n      colorDataName = legendDataName;\n    }\n    if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n      if (specColumns.color.quantitative) {\n        addScales(scope, binnableColorScale(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n      } else {\n        addScales(scope, {\n          name: scaleName,\n          type: \"ordinal\",\n          domain: {\n            data: colorDataName,\n            field: FieldNames.TopColor,\n            sort: true\n          },\n          range: {\n            scheme: insight.scheme || ColorScaleNone\n          },\n          reverse: { signal: colorReverseSignalName }\n        });\n      }\n    }\n    addSignals(scope, colorBinCountSignal(specContext), colorReverseSignal(specContext));\n    return { topColorField: FieldNames.TopColor, colorDataName };\n  }\n  function addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n    const titleSignal = `parent[${JSON.stringify(FieldNames.FacetTitle)}]`;\n    const index2 = `datum[${JSON.stringify(FieldNames.Ordinal)}] - 1`;\n    const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index2);\n    const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index2);\n    addMarks(globalScope, col.header, row.footer);\n    addMarks(col.header, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"center\"\n          },\n          baseline: {\n            value: \"middle\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          x: {\n            signal: `${sizeSignals.layoutWidth} / 2`\n          },\n          limit: {\n            signal: sizeSignals.layoutWidth\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          text: {\n            signal: titleSignal\n          }\n        }\n      }\n    });\n    addMarks(row.footer, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"left\"\n          },\n          baseline: {\n            value: \"middle\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          y: {\n            signal: `${sizeSignals.layoutHeight} / 2`\n          },\n          limit: {\n            signal: SignalNames.PlotOffsetRight\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          text: {\n            signal: titleSignal\n          }\n        }\n      }\n    });\n  }\n  function addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n    addMarks(scope, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"center\"\n          },\n          baseline: {\n            value: \"bottom\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          x: {\n            signal: `(${sizeSignals.layoutWidth}) / 2`\n          },\n          text: {\n            signal: `parent[${JSON.stringify(FieldNames.FacetTitle)}]`\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          limit: {\n            signal: sizeSignals.layoutWidth\n          },\n          y: {\n            signal: `-${SignalNames.FacetPaddingTop} / 2`\n          }\n        }\n      }\n    });\n  }\n  function addFacetAxesGroupMarks(props) {\n    const { colSeqName, colTitleScale, globalScope, facetScope, plotScope, rowSeqName, rowTitleScale } = props;\n    const { sizeSignals } = facetScope;\n    const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n    const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n    const index2 = \"datum.data\";\n    const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index2);\n    const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index2);\n    addData(globalScope, colSequence, rowSequence);\n    addMarks(globalScope, col.footer, row.header);\n    addScales(globalScope, colTitleScale, rowTitleScale);\n    const map2 = {\n      main: [\n        {\n          scope: facetScope.facetScope,\n          lines: true,\n          labels: false,\n          title: false\n        }\n      ],\n      x: [\n        {\n          scope: col.footer,\n          lines: true,\n          labels: true,\n          title: false\n        },\n        {\n          scope: plotScope,\n          scale: colTitleScale,\n          lines: false,\n          labels: false,\n          title: true\n        }\n      ],\n      y: [\n        {\n          scope: row.header,\n          lines: true,\n          labels: true,\n          title: false\n        },\n        {\n          scope: plotScope,\n          scale: rowTitleScale,\n          lines: false,\n          labels: false,\n          title: true\n        }\n      ]\n    };\n    return map2;\n  }\n  function facetRowHeaderFooter(data2, sizeSignals, index2) {\n    const rowFn = (xSignal) => {\n      return {\n        type: \"group\",\n        from: { data: data2 },\n        encode: {\n          update: {\n            x: { signal: xSignal },\n            y: {\n              signal: `${SignalNames.PlotOffsetTop} + ${SignalNames.FacetPaddingTop} + (${index2}) * (${sizeSignals.layoutHeight} + ${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`\n            },\n            height: { signal: sizeSignals.layoutHeight }\n          }\n        }\n      };\n    };\n    const header = rowFn(SignalNames.PlotOffsetLeft);\n    const footer = rowFn(`${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetRight} / 2`);\n    return { header, footer };\n  }\n  function facetColumnHeaderFooter(data2, sizeSignals, index2) {\n    const colFn = (ySignal) => {\n      return {\n        type: \"group\",\n        from: { data: data2 },\n        encode: {\n          update: {\n            x: {\n              signal: `(${index2}) * (${sizeSignals.layoutWidth} + ${SignalNames.FacetPaddingLeft}) + ${SignalNames.FacetPaddingLeft} + ${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}`\n            },\n            y: { signal: `${ySignal} - ${SignalNames.FacetAxesAdjustY}` },\n            width: { signal: sizeSignals.layoutWidth }\n          }\n        }\n      };\n    };\n    const header = colFn(`${SignalNames.PlotOffsetTop} / 2`);\n    const footer = colFn(`${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut}`);\n    return { header, footer };\n  }\n  function createSequence(dataName, countSignal) {\n    return {\n      name: dataName,\n      transform: [\n        {\n          type: \"sequence\",\n          start: 0,\n          stop: {\n            signal: countSignal\n          }\n        }\n      ]\n    };\n  }\n  function fill$1(context2, colorFieldName, scale2) {\n    const { specColumns, insight, specViewOptions } = context2;\n    const colorColumn = specColumns.color;\n    return colorColumn ? colorColumn.isColorData || insight.directColor ? {\n      field: safeFieldName(colorColumn.name)\n    } : {\n      scale: scale2,\n      field: colorColumn.quantitative ? safeFieldName(colorColumn.name) : colorFieldName\n    } : {\n      value: specViewOptions.colors.defaultCube\n    };\n  }\n  function opacity(context2) {\n    const result = {\n      signal: SignalNames.MarkOpacity\n    };\n    return result;\n  }\n  class GlobalScope {\n    constructor(props) {\n      const { dataName, markGroup, scope, signals } = props;\n      this.scope = scope;\n      this._markGroup = markGroup;\n      this.signals = signals;\n      this.data = getDataByName(scope.data, dataName).data;\n      this._markDataName = dataName;\n      this.offsets = {\n        x: \"0\",\n        y: \"0\",\n        h: SignalNames.PlotHeightIn,\n        w: SignalNames.PlotWidthIn\n      };\n      this.sizeSignals = {\n        layoutHeight: SignalNames.PlotHeightIn,\n        layoutWidth: SignalNames.PlotWidthIn\n      };\n      this.zSize = SignalNames.PlotHeightIn;\n    }\n    get markDataName() {\n      return this._markDataName;\n    }\n    setMarkDataName(markDataName) {\n      this._markDataName = markDataName;\n    }\n    get markGroup() {\n      return this._markGroup;\n    }\n    setMarkGroup(markGroup) {\n      this._markGroup = markGroup;\n    }\n  }\n  class Layout {\n    constructor(props) {\n      this.props = props;\n      this.id = props.id;\n    }\n    getGrouping() {\n      return null;\n    }\n    getAggregateSumOp() {\n      return null;\n    }\n    build() {\n      throw \"Not implemented\";\n    }\n  }\n  function testForCollapseSelection() {\n    return `datum.${FieldNames.Collapsed}`;\n  }\n  class AggregateContainer extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const a2 = this.aggregation = this.getAggregation();\n      const p = this.prefix = `agg_${this.id}`;\n      this.names = {\n        barCount: `${p}_count`,\n        aggregateField: `${p}_aggregate_value`,\n        globalAggregateExtentSignal: `${p}_${a2}_extent`,\n        scale: `scale_${p}`,\n        extentData: `data_${p}_extent`,\n        offsets: `data_${p}_offsets`\n      };\n    }\n    getAggregateSumOp() {\n      if (this.aggregation === \"sum\") {\n        const fieldOp = {\n          field: safeFieldName(this.props.sumBy.name),\n          op: \"sum\",\n          as: FieldNames.Sum\n        };\n        return fieldOp;\n      }\n    }\n    build() {\n      const { aggregation, names, props } = this;\n      const { dock, globalScope, groupings, niceScale, parentScope, showAxes } = props;\n      addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n        type: \"extent\",\n        field: safeFieldName(names.aggregateField),\n        signal: names.globalAggregateExtentSignal\n      });\n      addSignals(globalScope.scope, {\n        name: props.globalAggregateMaxExtentSignal,\n        update: `${names.globalAggregateExtentSignal}[1]`\n      });\n      const horizontal = dock === \"left\";\n      const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n      const offsets2 = {\n        x: parentScope.offsets.x,\n        y: addOffsets(parentScope.offsets.y, dock === \"bottom\" ? groupScaled : \"\"),\n        h: horizontal ? parentScope.offsets.h : dock === \"top\" ? groupScaled : `${parentScope.offsets.h} - ${groupScaled}`,\n        w: horizontal ? groupScaled : parentScope.offsets.w\n      };\n      const scale2 = {\n        type: \"linear\",\n        name: names.scale,\n        domain: [\n          0,\n          {\n            signal: props.globalAggregateMaxExtentSignal\n          }\n        ],\n        range: horizontal ? [\n          0,\n          {\n            signal: parentScope.sizeSignals.layoutWidth\n          }\n        ] : [\n          {\n            signal: parentScope.sizeSignals.layoutHeight\n          },\n          0\n        ],\n        nice: niceScale,\n        zero: true,\n        reverse: dock === \"top\"\n      };\n      const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n      addSignals(globalScope.scope, {\n        name: props.globalAggregateMaxExtentScaledSignal,\n        update: dock === \"bottom\" ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}` : globalAggregateMaxExtentScaledValue\n      });\n      return {\n        offsets: offsets2,\n        sizeSignals: horizontal ? {\n          layoutHeight: parentScope.sizeSignals.layoutHeight,\n          layoutWidth: null\n        } : {\n          layoutHeight: null,\n          layoutWidth: parentScope.sizeSignals.layoutWidth\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? [scale2] : void 0,\n            y: horizontal ? void 0 : [scale2]\n          }\n        },\n        encodingRuleMap: horizontal ? {\n          x: [{\n            test: testForCollapseSelection(),\n            signal: parentScope.offsets.x\n          }],\n          width: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        } : {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: dock === \"top\" ? parentScope.offsets.y : addOffsets(parentScope.offsets.y, parentScope.offsets.h)\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n    getTransforms(aggregation, groupby) {\n      const trans = {\n        type: \"joinaggregate\",\n        groupby: groupby.map(safeFieldName),\n        ops: [aggregation]\n      };\n      if (aggregation === \"sum\") {\n        trans.fields = [this.props.sumBy.name].map(safeFieldName);\n      }\n      return trans;\n    }\n    getAggregation() {\n      const { props } = this;\n      let s2;\n      if (props.dock === \"left\") {\n        s2 = props.axesScales.x;\n      } else {\n        s2 = props.axesScales.y;\n      }\n      switch (s2.aggregate) {\n        case \"sum\":\n          return \"sum\";\n        default:\n          return \"count\";\n      }\n    }\n  }\n  class AggregateSquare extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const a2 = this.props.aggregation;\n      const p = this.prefix = `agg_${this.id}`;\n      this.names = {\n        barCount: `${p}_count`,\n        aggregateField: `${p}_aggregate_value`,\n        globalAggregateExtentSignal: `${p}_${a2}_extent`,\n        extentData: `data_${p}_extent`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { aggregation, globalScope, groupings, onBuild, parentScope } = props;\n      const { sizeSignals } = parentScope;\n      addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n        type: \"extent\",\n        field: safeFieldName(names.aggregateField),\n        signal: names.globalAggregateExtentSignal\n      });\n      const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n      const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n      const squareMaxArea = `(${[squareMaxSide, squareMaxSide].join(\" * \")})`;\n      const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n      const squareArea = `(${[squareMaxArea, shrinkRatio].join(\" * \")})`;\n      const squareSide = `sqrt(${squareArea})`;\n      const localAggregateMaxExtentScaled = squareSide;\n      onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n        y: addOffsets(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n        h: squareSide,\n        w: squareSide\n      };\n      return {\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        encodingRuleMap: {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: offsets2.y\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n    getTransforms(aggregation, groupby) {\n      const trans = {\n        type: \"joinaggregate\",\n        groupby: groupby.map(safeFieldName),\n        ops: [aggregation]\n      };\n      if (aggregation === \"sum\") {\n        trans.fields = [this.props.sumBy.name].map(safeFieldName);\n      }\n      return trans;\n    }\n  }\n  function dataExtent(column, signal) {\n    return {\n      type: \"extent\",\n      field: safeFieldName(column.name),\n      signal\n    };\n  }\n  function binnable(prefix, domainDataName, discreteColumn, outerSignalExtents) {\n    const { column, defaultBins: defaultBins2, maxbins: maxbins2, maxbinsSignalDisplayName, maxbinsSignalName } = discreteColumn;\n    if (column.quantitative) {\n      const field2 = `${prefix}_bin_${exprSafeFieldName(column.name)}`;\n      const fieldEnd = `${field2}_end`;\n      const binSignal = `${field2}_bins`;\n      const dataExtentSignal = `${field2}_bin_extent`;\n      const dataExtentSpanSignal = `${field2}_bin_extent_span`;\n      const outerSignal = `${field2}_outer_extent`;\n      domainDataName = `${field2}_sequence`;\n      const extentTransform = dataExtent(column, dataExtentSignal);\n      let imageSignal;\n      if (outerSignalExtents) {\n        imageSignal = outerExtentSignal(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n      }\n      const maxbinsSignal = {\n        name: maxbinsSignalName,\n        value: defaultBins2,\n        bind: {\n          name: maxbinsSignalDisplayName,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 1,\n          max: maxbins2,\n          step: 1\n        }\n      };\n      const extentSignal = (imageSignal === null || imageSignal === void 0 ? void 0 : imageSignal.name) || dataExtentSignal;\n      const binTransform = {\n        type: \"bin\",\n        field: safeFieldName(column.name),\n        as: [\n          field2,\n          fieldEnd\n        ],\n        signal: binSignal,\n        extent: {\n          signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`\n          //add a tiny bit to the upper extent to force the extra bin - https://github.com/vega/vega/issues/2899\n        },\n        minstep: shouldBeIntegralBinStep(column) ? 1 : 0,\n        maxbins: {\n          signal: maxbinsSignalName\n        }\n      };\n      const dataSequence = {\n        name: domainDataName,\n        transform: [\n          {\n            type: \"sequence\",\n            start: {\n              signal: `${binSignal}.start`\n            },\n            stop: {\n              signal: `${binSignal}.stop`\n            },\n            step: {\n              signal: `${binSignal}.step`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.data\",\n            as: field2\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data + ${binSignal}.step`,\n            as: fieldEnd\n          },\n          {\n            type: \"window\",\n            ops: [\"row_number\"],\n            as: [FieldNames.Ordinal]\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data === ${binSignal}.start`,\n            as: FieldNames.First\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n            as: FieldNames.Last\n          },\n          {\n            // when there is only one bin, use only first sequence element\n            type: \"filter\",\n            expr: `${dataExtentSpanSignal} === 0 ? datum[${JSON.stringify(FieldNames.First)}] : true`\n          }\n        ]\n      };\n      const signals = [\n        maxbinsSignal,\n        {\n          name: dataExtentSpanSignal,\n          update: `${extentSignal}[1] - ${extentSignal}[0]`\n        }\n      ];\n      if (imageSignal) {\n        signals.push(imageSignal);\n      }\n      const augmentBinnable = {\n        discreteColumn,\n        native: false,\n        transforms: [extentTransform, binTransform],\n        fields: [field2, fieldEnd],\n        binSignal,\n        extentSignal,\n        dataSequence,\n        domainDataName,\n        signals,\n        fullScaleDataname: dataSequence.name\n      };\n      return augmentBinnable;\n    } else {\n      const nativeBinnable = {\n        discreteColumn,\n        native: true,\n        fields: [column.name],\n        domainDataName,\n        fullScaleDataname: domainDataName\n      };\n      return nativeBinnable;\n    }\n  }\n  function outerExtentSignal(name, min2, max2, dataExtent2) {\n    return {\n      name,\n      update: `[min(${min2}, ${dataExtent2}[0]), max(${max2}, ${dataExtent2}[1])]`\n    };\n  }\n  function shouldBeIntegralBinStep(column) {\n    return column.quantitative && (column.type === \"integer\" && column.stats.max - column.stats.min <= 7);\n  }\n  const bandScaleLinearSuffix = \"_linear\";\n  let Band$1 = class Band extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `band_${this.id}`;\n      this.names = {\n        xScale: `scale_${p}_x`,\n        yScale: `scale_${p}_y`,\n        bandWidth: `${p}_bandwidth`,\n        accumulative: `${p}_accumulative`\n      };\n      this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n    }\n    getGrouping() {\n      return this.bin.fields;\n    }\n    build() {\n      const { bin: bin2, names, props } = this;\n      const { globalScope, minBandWidth, orientation, parentScope, showAxes } = props;\n      const binField = bin2.fields[0];\n      if (bin2.native === false) {\n        addSignals(globalScope.scope, ...bin2.signals);\n        addTransforms(globalScope.data, ...bin2.transforms);\n        addData(globalScope.scope, bin2.dataSequence);\n      }\n      addData(globalScope.scope, {\n        name: names.accumulative,\n        source: bin2.fullScaleDataname,\n        transform: [\n          {\n            type: \"aggregate\",\n            groupby: this.getGrouping().map(safeFieldName),\n            ops: [\"count\"]\n          }\n        ]\n      });\n      const horizontal = orientation === \"horizontal\";\n      const minCellSignal = horizontal ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n      modifySignal(minCellSignal, \"max\", `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n      addSignals(globalScope.scope, {\n        name: names.bandWidth,\n        update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`\n      });\n      const scale2 = this.getScale(bin2, horizontal);\n      if (props.outerSignalExtents && bin2.native === false) {\n        addScales(globalScope.scope, linearScale(scale2.name + bandScaleLinearSuffix, { signal: bin2.extentSignal }, scale2.range, scale2.reverse, false, false));\n      }\n      let encodingRuleMap;\n      if (!props.excludeEncodingRuleMap) {\n        encodingRuleMap = horizontal ? {\n          x: [\n            {\n              test: testForCollapseSelection(),\n              signal: parentScope.offsets.x\n            }\n          ],\n          width: [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            }\n          ]\n        } : {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: addOffsets(parentScope.offsets.y, parentScope.offsets.h)\n            }\n          ],\n          height: [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            }\n          ]\n        };\n      }\n      return {\n        offsets: this.getOffset(horizontal, binField),\n        sizeSignals: horizontal ? {\n          layoutHeight: names.bandWidth,\n          layoutWidth: parentScope.sizeSignals.layoutWidth\n        } : {\n          layoutHeight: parentScope.sizeSignals.layoutHeight,\n          layoutWidth: names.bandWidth\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? void 0 : [scale2],\n            y: horizontal ? [scale2] : void 0\n          }\n        },\n        encodingRuleMap\n      };\n    }\n    getOffset(horizontal, binField) {\n      const { names, props } = this;\n      const { parentScope } = props;\n      return {\n        x: addOffsets(parentScope.offsets.x, horizontal ? \"\" : `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n        y: addOffsets(parentScope.offsets.y, horizontal ? `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])` : \"\"),\n        h: horizontal ? names.bandWidth : parentScope.offsets.h,\n        w: horizontal ? parentScope.offsets.w : names.bandWidth\n      };\n    }\n    getScale(bin2, horizontal) {\n      const { names } = this;\n      const { parentScope } = this.props;\n      const binField = safeFieldName(bin2.fields[0]);\n      let bandScale;\n      if (horizontal) {\n        bandScale = {\n          type: \"band\",\n          name: names.yScale,\n          range: [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutHeight\n            }\n          ],\n          padding: 0.1,\n          domain: {\n            data: bin2.domainDataName,\n            field: binField,\n            sort: true\n          },\n          reverse: true\n        };\n      } else {\n        bandScale = {\n          type: \"band\",\n          name: names.xScale,\n          range: [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutWidth\n            }\n          ],\n          padding: 0.1,\n          domain: {\n            data: bin2.domainDataName,\n            field: binField,\n            sort: true\n          }\n        };\n      }\n      return bandScale;\n    }\n  };\n  function displayBin(bin2) {\n    const val = (index2) => `datum[${JSON.stringify(bin2.fields[index2])}]`;\n    return bin2.discreteColumn.column.quantitative ? `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')` : val(0);\n  }\n  function obj(nameValues, clause) {\n    return `{${nameValues.join()}}`;\n  }\n  function serializeAsVegaExpression(bin2, firstFieldName, lastFieldName, clause) {\n    if (bin2.discreteColumn.column.quantitative) {\n      const low = [\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'>='\",\n        `value:datum[${JSON.stringify(bin2.fields[0])}]`\n      ];\n      const high = [\n        \"clause:'&&'\",\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'<'\",\n        `value:datum[${JSON.stringify(bin2.fields[1])}]`\n      ];\n      return obj([\n        `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`\n      ]);\n    } else {\n      const exact = [\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'=='\",\n        `value:datum[${JSON.stringify(bin2.fields[0])}]`\n      ];\n      return obj([\n        `expressions:[${obj(exact)}]`\n      ]);\n    }\n  }\n  function createOrdinals(source2, prefix, binFields, sortOrder) {\n    const _binFields = binFields.map(safeFieldName);\n    const dataName = `${prefix}_bin_order`;\n    const data2 = {\n      name: dataName,\n      source: source2,\n      transform: [\n        {\n          type: \"aggregate\",\n          groupby: _binFields\n        },\n        {\n          type: \"collect\",\n          sort: {\n            field: _binFields,\n            order: _binFields.map((f) => sortOrder)\n          }\n        },\n        {\n          type: \"window\",\n          ops: [\"row_number\"],\n          as: [FieldNames.Ordinal]\n        }\n      ]\n    };\n    return {\n      data: data2,\n      scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields)\n    };\n  }\n  function ordinalScale(dataName, scaleName, binFields) {\n    return {\n      type: \"ordinal\",\n      name: scaleName,\n      domain: {\n        data: dataName,\n        field: safeFieldName(binFields[0])\n      },\n      range: {\n        data: dataName,\n        field: FieldNames.Ordinal\n      }\n    };\n  }\n  let Cross$1 = class Cross extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `cross_${this.id}`;\n      this.binX = binnable(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n      this.binY = binnable(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n      this.names = {\n        facetDataName: `data_${p}_facet`,\n        searchUnion: `data_${p}_search`,\n        dimScale: `scale_${p}`,\n        dimCount: `${p}_count`,\n        dimCategorical: `data_${p}_cat`,\n        dimCellSize: `${p}_cell_size`,\n        dimCellSizeCalc: `${p}_cell_calc`\n      };\n    }\n    getGrouping() {\n      return this.binX.fields.concat(this.binY.fields);\n    }\n    build() {\n      const { binX, binY, names, prefix, props } = this;\n      const { axisTextColor, colRowTitles, globalScope, parentScope } = props;\n      const titles = { x: { dataName: null, quantitative: null }, y: { dataName: null, quantitative: null } };\n      const dx = {\n        dim: \"x\",\n        bin: binX,\n        sortOrder: \"ascending\",\n        size: parentScope.sizeSignals.layoutWidth,\n        layout: parentScope.sizeSignals.layoutWidth,\n        min: globalScope.signals.minCellWidth.name,\n        out: globalScope.signals.plotWidthOut,\n        offset: SignalNames.FacetPaddingLeft,\n        padding: SignalNames.FacetPaddingLeft,\n        dataOut: null,\n        scaleName: null,\n        position: null\n      };\n      const dy = {\n        dim: \"y\",\n        bin: binY,\n        sortOrder: \"ascending\",\n        size: parentScope.sizeSignals.layoutHeight,\n        layout: parentScope.sizeSignals.layoutHeight,\n        min: globalScope.signals.minCellHeight.name,\n        out: globalScope.signals.plotHeightOut,\n        offset: SignalNames.FacetPaddingTop,\n        padding: `(${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n        dataOut: null,\n        scaleName: null,\n        position: null\n      };\n      const dimensions = [dx, dy];\n      dimensions.forEach((d2) => {\n        const { bin: bin2, dim, padding: padding2, sortOrder } = d2;\n        let data2;\n        let dataName;\n        let countSignal;\n        let scale2;\n        const titleSource = titles[dim];\n        if (bin2.native === false) {\n          addSignals(globalScope.scope, ...bin2.signals);\n          addTransforms(globalScope.data, ...bin2.transforms);\n          addData(globalScope.scope, bin2.dataSequence);\n          addTransforms(bin2.dataSequence, {\n            type: \"formula\",\n            expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin2.fields[0])}, datum[${JSON.stringify(bin2.fields[0])}])`,\n            as: FieldNames.Contains\n          });\n          data2 = bin2.dataSequence;\n          dataName = bin2.dataSequence.name;\n          countSignal = `length(data(${JSON.stringify(dataName)}))`;\n          scale2 = ordinalScale(dataName, `${names.dimScale}_${dim}`, bin2.fields);\n          titleSource.dataName = bin2.dataSequence.name;\n        } else {\n          dataName = globalScope.markDataName;\n          const ord = createOrdinals(dataName, `${prefix}_${dim}`, bin2.fields, sortOrder);\n          data2 = ord.data;\n          addData(globalScope.scope, ord.data);\n          countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n          scale2 = ord.scale;\n          titleSource.dataName = ord.data.name;\n        }\n        titleSource.quantitative = bin2.discreteColumn.column.quantitative;\n        d2.dataOut = data2;\n        d2.scaleName = scale2.name;\n        addTransforms(data2, {\n          type: \"formula\",\n          expr: serializeAsVegaExpression(bin2, FieldNames.First, FieldNames.Last),\n          as: FieldNames.FacetSearch\n        }, {\n          type: \"formula\",\n          expr: displayBin(bin2),\n          as: FieldNames.FacetTitle\n        });\n        addScales(globalScope.scope, scale2);\n        const count2 = `${names.dimCount}_${dim}`;\n        const calc = `${names.dimCellSizeCalc}_${dim}`;\n        const size = `${names.dimCellSize}_${dim}`;\n        addSignals(globalScope.scope, { name: count2, update: countSignal });\n        addSignals(globalScope.scope, {\n          name: calc,\n          update: `${d2.layout} / ${count2}`\n        }, {\n          name: size,\n          update: `max(${d2.min}, (${calc} - ${padding2}))`\n        });\n        modifySignal(d2.out, \"max\", `((${size} + ${padding2}) * ${count2})`);\n        d2.position = this.dimensionOffset(d2);\n      });\n      const groupRow = {\n        type: \"group\",\n        encode: {\n          update: {\n            y: {\n              signal: dy.position\n            }\n          }\n        },\n        from: {\n          data: dy.dataOut.name\n        },\n        data: [\n          {\n            name: names.searchUnion,\n            source: dx.dataOut.name,\n            transform: [\n              {\n                type: \"formula\",\n                expr: `[datum[${JSON.stringify(FieldNames.FacetSearch)}], merge(parent[${JSON.stringify(FieldNames.FacetSearch)}], { clause: '&&'})]`,\n                as: FieldNames.FacetSearch\n              }\n            ]\n          }\n        ]\n      };\n      const groupCol = {\n        style: \"cell\",\n        name: prefix,\n        type: \"group\",\n        encode: {\n          update: {\n            height: {\n              signal: `${names.dimCellSize}_y`\n            },\n            width: {\n              signal: `${names.dimCellSize}_x`\n            },\n            x: {\n              signal: dx.position\n            }\n          }\n        },\n        from: {\n          data: names.searchUnion\n        }\n      };\n      addMarks(globalScope.markGroup, groupRow);\n      addMarks(groupRow, groupCol);\n      const offsets2 = {\n        x: this.dimensionOffset(dx),\n        y: this.dimensionOffset(dy),\n        h: `${names.dimCellSize}_y`,\n        w: `${names.dimCellSize}_x`\n      };\n      const sizeSignals = {\n        layoutHeight: `${names.dimCellSize}_y`,\n        layoutWidth: `${names.dimCellSize}_x`,\n        colCount: `${names.dimCount}_x`,\n        rowCount: `${names.dimCount}_y`\n      };\n      if (colRowTitles) {\n        addFacetColRowTitles(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n      }\n      return {\n        facetScope: groupCol,\n        offsets: offsets2,\n        sizeSignals,\n        titles\n      };\n    }\n    dimensionOffset(d2) {\n      const { names } = this;\n      return `${d2.offset} + (scale(${JSON.stringify(d2.scaleName)}, datum[${JSON.stringify(d2.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d2.dim} + ${d2.padding})`;\n    }\n  };\n  let Scatter$1 = class Scatter extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `scatter_${this.id}`;\n      this.names = {\n        aggregateData: `data_${p}_aggregate`,\n        markData: `data_${p}_mark`,\n        xDataExtent: `${p}_xDataExtent`,\n        yDataExtent: `${p}_yDataExtent`,\n        xExtent: `${p}_xExtent`,\n        yExtent: `${p}_yExtent`,\n        sizeExtent: `${p}_sizeExtent`,\n        sizeRange: `${p}_sizeRange`,\n        sizeScale: `${p}_sizeScale`,\n        xScale: `scale_${p}_x`,\n        yScale: `scale_${p}_y`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { backgroundImageExtents, globalScope, parentScope, scatterPointScaleDisplay, showAxes, size, view, x: x2, y: y2, z: z2, zGrounded } = props;\n      const qsize = size && size.quantitative && size;\n      addSignals(globalScope.scope, {\n        name: SignalNames.PointScale,\n        value: 5,\n        bind: {\n          name: scatterPointScaleDisplay,\n          debounce: debounce$1,\n          input: \"range\",\n          min: 1,\n          max: 10,\n          step: 0.1\n        }\n      }, {\n        name: SignalNames.ZGrounded,\n        value: false,\n        bind: {\n          name: zGrounded,\n          input: \"checkbox\"\n        }\n      });\n      if (backgroundImageExtents) {\n        addTransforms(globalScope.data, dataExtent(x2, names.xDataExtent), dataExtent(y2, names.yDataExtent));\n        const xSignal = outerExtentSignal(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n        const ySignal = outerExtentSignal(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n        addSignals(globalScope.scope, xSignal, ySignal);\n      }\n      if (qsize) {\n        addTransforms(globalScope.data, {\n          type: \"extent\",\n          field: safeFieldName(qsize.name),\n          signal: names.sizeExtent\n        });\n        addScales(globalScope.scope, {\n          name: names.sizeScale,\n          type: \"pow\",\n          exponent: 0.5,\n          domain: [0, { signal: `${names.sizeExtent}[1]` }],\n          range: [0, { signal: names.sizeRange }]\n        });\n        addSignals(globalScope.scope, {\n          name: names.sizeRange,\n          update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${scatterSizedDiv}`\n        });\n      }\n      addData(globalScope.scope, {\n        name: names.markData,\n        source: globalScope.markDataName,\n        transform: [x2, y2, z2].map((c2) => {\n          if (!c2 || !c2.quantitative)\n            return;\n          const t = {\n            type: \"filter\",\n            expr: `isValid(datum[${JSON.stringify(c2.name)}])`\n          };\n          return t;\n        }).filter(Boolean)\n      });\n      globalScope.setMarkDataName(names.markData);\n      const globalScales = { showAxes, scales: {} };\n      const zValue = z2 ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z2.name)}])` : null;\n      const sizeValueSignal = qsize ? `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${SignalNames.PointScale}` : SignalNames.PointScale;\n      const update2 = Object.assign({ height: [\n        {\n          test: testForCollapseSelection(),\n          value: 0\n        },\n        {\n          signal: sizeValueSignal\n        }\n      ], width: {\n        signal: sizeValueSignal\n      } }, z2 && {\n        z: [\n          {\n            test: testForCollapseSelection(),\n            value: 0\n          },\n          {\n            signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`\n          }\n        ],\n        zindex: [\n          {\n            signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`\n          }\n        ],\n        depth: [\n          {\n            test: testForCollapseSelection(),\n            value: 0\n          },\n          {\n            signal: view === \"3d\" ? `${SignalNames.ZGrounded} ? ${zValue} : ${sizeValueSignal}` : \"0\"\n          }\n        ]\n      });\n      const columnSignals = [\n        {\n          column: x2,\n          xyz: \"x\",\n          scaleName: names.xScale,\n          domain: backgroundImageExtents ? {\n            signal: names.xExtent\n          } : {\n            data: globalScope.data.name,\n            field: safeFieldName(x2.name)\n          },\n          reverse: false,\n          signal: parentScope.sizeSignals.layoutWidth\n        },\n        {\n          column: y2,\n          xyz: \"y\",\n          scaleName: names.yScale,\n          domain: backgroundImageExtents ? {\n            signal: names.yExtent\n          } : {\n            data: globalScope.data.name,\n            field: safeFieldName(y2.name)\n          },\n          reverse: true,\n          signal: parentScope.sizeSignals.layoutHeight\n        },\n        {\n          column: z2,\n          xyz: \"z\",\n          scaleName: names.zScale,\n          domain: {\n            data: globalScope.data.name,\n            field: z2 ? safeFieldName(z2.name) : null\n          },\n          reverse: false,\n          signal: view === \"3d\" ? `(${globalScope.zSize}) * ${SignalNames.ZProportion}` : `10 * ${SignalNames.ZProportion}`\n        }\n      ];\n      columnSignals.forEach((cs) => {\n        const { column, domain: domain2, reverse: reverse2, scaleName, signal, xyz } = cs;\n        if (!column)\n          return;\n        let scale2;\n        if (column.quantitative) {\n          scale2 = linearScale(scaleName, domain2, [0, { signal }], reverse2, false, showAxes);\n          if (shouldBeIntegralBinStep(column)) {\n            scale2.bins = { step: 1 };\n          }\n        } else {\n          scale2 = pointScale(scaleName, globalScope.data.name, [0, { signal }], column.name, reverse2);\n        }\n        globalScales.scales[xyz] = [scale2];\n      });\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: globalScope.markDataName },\n        encode: { update: update2 }\n      };\n      addMarks(globalScope.markGroup, mark);\n      return {\n        offsets: {\n          x: addOffsets(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x2.name)}])`),\n          y: addOffsets(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y2.name)}]) - ${sizeValueSignal}`),\n          h: sizeValueSignal,\n          w: sizeValueSignal\n        },\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        globalScales,\n        mark,\n        encodingRuleMap: {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: addOffsets(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight)\n            }\n          ]\n        }\n      };\n    }\n  };\n  function addZScale(z2, zSize, dataName, zScaleName) {\n    if (z2) {\n      const zRange = [0, { signal: `(${zSize}) * ${SignalNames.ZProportion}` }];\n      const scale2 = z2.quantitative ? linearScale(zScaleName, {\n        data: dataName,\n        field: safeFieldName(z2.name)\n      }, zRange, false, true) : pointScale(zScaleName, dataName, zRange, z2.name, false);\n      return scale2;\n    }\n  }\n  class Square extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `square_${this.id}`;\n      this.names = {\n        bandWidth: this.getBandWidth(),\n        maxGroupField: `${p}_max_group`,\n        maxGroupSignal: `${p}_max_grouping`,\n        stack0: `${p}_stack0`,\n        stack1: `${p}_stack1`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { fillDirection, globalScope, groupings, parentScope, collapseYHeight, showAxes, sortBy, view, z: z2 } = props;\n      const zScale = addZScale(z2, globalScope.zSize, globalScope.data.name, names.zScale);\n      addTransforms(globalScope.data, Object.assign({ type: \"stack\", groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sortBy && {\n        sort: {\n          field: safeFieldName(sortBy.name),\n          order: \"ascending\"\n        }\n      }));\n      const { gap, levelSize, size, squaresPerBand } = this.addSignals();\n      const heightSignal = {\n        signal: fillDirection === \"down-right\" ? size : levelSize\n      };\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: {\n          data: globalScope.markDataName\n        },\n        encode: {\n          update: Object.assign({ height: collapseYHeight ? [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            },\n            heightSignal\n          ] : heightSignal, width: {\n            signal: fillDirection === \"down-right\" ? levelSize : size\n          } }, z2 && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z2.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      const { tx: tx2, ty: ty2 } = this.transformXY(gap, levelSize, squaresPerBand);\n      return Object.assign(Object.assign(Object.assign({}, z2 && {\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        }\n      }), { offsets: {\n        x: addOffsets(parentScope.offsets.x, tx2.expr),\n        y: addOffsets(parentScope.offsets.y, ty2.expr),\n        h: size,\n        w: size\n      }, mark, sizeSignals: {\n        layoutHeight: size,\n        layoutWidth: size\n      } }), collapseYHeight && {\n        encodingRuleMap: {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: parentScope.offsets.y\n            }\n          ]\n        }\n      });\n    }\n    getBandWidth() {\n      const { offsets: offsets2 } = this.props.parentScope;\n      switch (this.props.fillDirection) {\n        case \"down-right\":\n          return offsets2.h;\n        default:\n          return offsets2.w;\n      }\n    }\n    addSignals() {\n      const { names, props } = this;\n      const { fillDirection, globalScope, groupings, parentScope } = props;\n      let { maxGroupedFillSize, maxGroupedUnits } = props;\n      if (!maxGroupedUnits) {\n        if (groupings) {\n          addTransforms(globalScope.data, {\n            type: \"joinaggregate\",\n            groupby: getGroupBy(groupings).map(safeFieldName),\n            ops: [\"count\"],\n            as: [names.maxGroupField]\n          }, {\n            type: \"extent\",\n            field: names.maxGroupField,\n            signal: names.maxGroupSignal\n          });\n          maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n        } else {\n          maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n        }\n      }\n      if (!maxGroupedFillSize) {\n        maxGroupedFillSize = fillDirection === \"down-right\" ? parentScope.offsets.w : parentScope.offsets.h;\n      }\n      const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n      const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n      const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n      const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n      const levels2 = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n      const levelSize = `(((${maxGroupedFillSize}) / ${levels2}) - ${gap})`;\n      return { gap, levelSize, size, squaresPerBand };\n    }\n    transformXY(gap, levelSize, squaresPerBand) {\n      const { names, prefix } = this;\n      const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n      const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n      const { fillDirection, parentScope } = this.props;\n      const tx2 = {\n        type: \"formula\",\n        expr: null,\n        as: `${prefix}_${FieldNames.OffsetX}`\n      };\n      const ty2 = {\n        type: \"formula\",\n        expr: null,\n        as: `${prefix}_${FieldNames.OffsetY}`\n      };\n      switch (fillDirection) {\n        case \"down-right\": {\n          tx2.expr = `${level} * (${levelSize} + ${gap})`;\n          ty2.expr = compartment;\n          break;\n        }\n        case \"right-up\": {\n          tx2.expr = compartment;\n          ty2.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n          break;\n        }\n        case \"right-down\":\n        default: {\n          tx2.expr = compartment;\n          ty2.expr = `${level} * (${levelSize} + ${gap})`;\n          break;\n        }\n      }\n      return { tx: tx2, ty: ty2 };\n    }\n  }\n  let Stack$1 = class Stack extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `stack_${this.id}`;\n      this.names = {\n        cube: `${p}_cube`,\n        globalDataName: `data_${p}_count`,\n        globalExtent: `${p}_global_extent`,\n        levelDataName: `data_${p}_level`,\n        count: `${p}_count`,\n        stack0: `${p}_stack0`,\n        stack1: `${p}_stack1`,\n        sequence: `data_${p}_sequence`,\n        sides: `${p}_sides`,\n        size: `${p}_size`,\n        squared: `${p}_squared`,\n        maxCount: `${p}_maxCount`,\n        maxLevels: `${p}_maxLevels`,\n        zScale: `${p}_zScale`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { globalScope, groupings, parentScope, showAxes, sort: sort2 } = props;\n      const { sizeSignals } = parentScope;\n      addTransforms(globalScope.data, {\n        type: \"joinaggregate\",\n        groupby: getGroupBy(groupings).map(safeFieldName),\n        ops: [\"count\"],\n        as: [names.count]\n      }, {\n        type: \"extent\",\n        field: names.count,\n        signal: names.globalExtent\n      }, Object.assign({ type: \"stack\", groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sort2 && {\n        sort: {\n          field: safeFieldName(sort2.name),\n          order: \"ascending\"\n        }\n      }));\n      addData(globalScope.scope, {\n        name: names.sequence,\n        transform: [\n          {\n            type: \"sequence\",\n            start: 1,\n            stop: {\n              signal: `sqrt(${names.globalExtent}[1])`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.data * datum.data\",\n            as: \"squared\"\n          },\n          {\n            type: \"formula\",\n            expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n            as: \"maxlevels\"\n          },\n          {\n            type: \"formula\",\n            expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n            as: \"side\"\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.side * datum.maxlevels + datum.maxlevels - 1\",\n            as: \"sidecubeheight\"\n          },\n          {\n            type: \"formula\",\n            expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n            as: \"heightmatch\"\n          },\n          {\n            type: \"collect\",\n            sort: {\n              field: \"heightmatch\",\n              order: \"ascending\"\n            }\n          },\n          {\n            type: \"window\",\n            ops: [\"row_number\"]\n          },\n          {\n            type: \"filter\",\n            expr: \"datum.row_number === 1\"\n          }\n        ]\n      });\n      addSignals(globalScope.scope, {\n        name: names.size,\n        update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`\n      }, {\n        name: names.squared,\n        update: `data('${names.sequence}')[0].squared`\n      }, {\n        name: names.sides,\n        update: `sqrt(${names.squared})`\n      }, {\n        name: names.cube,\n        update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`\n      }, {\n        name: names.maxLevels,\n        update: `data('${names.sequence}')[0].maxlevels`\n      }, {\n        name: names.maxCount,\n        update: `${names.maxLevels} * ${names.squared}`\n      });\n      const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n      const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n      const cubeX = `(${layerOrdinal} % ${names.sides})`;\n      const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n      const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n      const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n        y: addOffsets(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n        h: names.size,\n        w: names.size\n      };\n      const mark = {\n        type: \"rect\",\n        from: { data: this.names.levelDataName },\n        encode: {\n          update: {\n            z: {\n              signal: `${zLevel} * (${names.cube} + 1)`\n            },\n            height: {\n              signal: names.cube\n            },\n            width: {\n              signal: names.cube\n            },\n            depth: {\n              signal: names.cube\n            }\n          }\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      const zScale = {\n        type: \"linear\",\n        name: names.zScale,\n        domain: [\n          0,\n          {\n            signal: names.maxCount\n          }\n        ],\n        range: [\n          0,\n          {\n            signal: `${names.maxLevels} * (${names.cube} + 1) - 1`\n          }\n        ],\n        nice: false\n      };\n      return {\n        offsets: offsets2,\n        mark,\n        sizeSignals: {\n          layoutHeight: names.size,\n          layoutWidth: names.size\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        },\n        encodingRuleMap: {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: parentScope.offsets.y\n          }],\n          z: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }],\n          depth: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n  };\n  class Strip extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `strip_${this.id}`;\n      this.names = {\n        firstField: `${p}${FieldNames.First}`,\n        lastField: `${p}${FieldNames.Last}`,\n        valueField: `${p}${FieldNames.Value}`,\n        scale: `scale_${p}`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { addPercentageScale, globalScope, groupings, orientation, showAxes, size, sort: sort2, sortOrder, parentScope, view, z: z2 } = props;\n      const zScale = addZScale(z2, globalScope.zSize, globalScope.data.name, names.zScale);\n      const horizontal = orientation === \"horizontal\";\n      const transform2 = [];\n      if (sort2) {\n        transform2.push({\n          type: \"collect\",\n          sort: {\n            field: safeFieldName(sort2.name),\n            order: sortOrder\n          }\n        });\n      }\n      let stackField;\n      if (size) {\n        stackField = size.name;\n        transform2.push({\n          type: \"filter\",\n          expr: `datum[${JSON.stringify(size.name)}] > 0`\n        });\n      } else {\n        stackField = names.valueField;\n        transform2.push({\n          type: \"formula\",\n          expr: \"1\",\n          as: stackField\n        });\n      }\n      const stackTransform = {\n        type: \"stack\",\n        field: safeFieldName(stackField),\n        offset: \"normalize\",\n        as: [names.firstField, names.lastField]\n      };\n      if (groupings.length) {\n        stackTransform.groupby = getGroupBy(groupings).map(safeFieldName);\n      }\n      transform2.push(stackTransform);\n      addTransforms(globalScope.data, ...transform2);\n      const span2 = [names.lastField, names.firstField].map((f) => `datum[${JSON.stringify(f)}]`).join(\" - \");\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, horizontal ? `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})` : \"\"),\n        y: addOffsets(parentScope.offsets.y, horizontal ? \"\" : `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n        h: horizontal ? parentScope.offsets.h : `(${span2}) * (${parentScope.offsets.h})`,\n        w: horizontal ? `(${span2}) * (${parentScope.offsets.w})` : parentScope.offsets.w\n      };\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: globalScope.markDataName },\n        encode: {\n          update: Object.assign({ height: {\n            signal: offsets2.h\n          }, width: {\n            signal: offsets2.w\n          } }, z2 && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z2.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      let percentageScale;\n      if (addPercentageScale) {\n        percentageScale = [{\n          type: \"linear\",\n          name: names.scale,\n          domain: [0, 100],\n          range: horizontal ? [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutWidth\n            }\n          ] : [\n            {\n              signal: parentScope.sizeSignals.layoutHeight\n            },\n            0\n          ]\n        }];\n      }\n      return {\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? percentageScale : void 0,\n            y: horizontal ? void 0 : percentageScale,\n            z: zScale && [zScale]\n          }\n        },\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        mark\n      };\n    }\n  }\n  let Treemap$1 = class Treemap extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `treemap_${this.id}`;\n      this.names = {\n        dataName: `data_${p}`,\n        dataHeightWidth: `data_${p}_hw`,\n        dataExtents: `data_${p}_extents`,\n        dataFacet: `data_${p}_facet`,\n        dataFacetMark: `data_${p}_facetMark`,\n        fieldChildren: `${p}_children`,\n        fieldDepth: `${p}_depth`,\n        fieldX0: `${p}_x0`,\n        fieldX1: `${p}_x1`,\n        fieldY0: `${p}_y0`,\n        fieldY1: `${p}_y1`,\n        fieldHeight: `${p}_h`,\n        fieldWidth: `${p}_w`,\n        heightExtent: `${p}_heightExtent`,\n        widthExtent: `${p}_widthExtent`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { globalScope, parentScope, showAxes, treeMapMethod, z: z2 } = props;\n      const zScale = addZScale(z2, globalScope.zSize, globalScope.data.name, names.zScale);\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, fn(names.fieldX0)),\n        y: addOffsets(parentScope.offsets.y, fn(names.fieldY0)),\n        h: subtract$1(names.fieldY1, names.fieldY0),\n        w: subtract$1(names.fieldX1, names.fieldX0)\n      };\n      const mark = this.transformedMark(offsets2);\n      addSignals(globalScope.scope, {\n        name: SignalNames.TreeMapMethod,\n        value: \"squarify\",\n        bind: {\n          name: treeMapMethod,\n          input: \"select\",\n          options: [\n            \"squarify\",\n            \"binary\"\n          ]\n        }\n      });\n      return Object.assign(Object.assign({}, z2 && {\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        }\n      }), {\n        mark,\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        }\n      });\n    }\n    transformedMark(offsets2) {\n      const { names, props } = this;\n      const { globalScope, groupings, parentScope } = props;\n      if (groupings.length) {\n        addData(globalScope.scope, {\n          name: names.dataHeightWidth,\n          source: globalScope.markDataName,\n          transform: [\n            {\n              type: \"formula\",\n              expr: parentScope.offsets.h,\n              as: names.fieldHeight\n            },\n            {\n              type: \"formula\",\n              expr: parentScope.offsets.w,\n              as: names.fieldWidth\n            }\n          ]\n        });\n        const treemapData = {\n          name: names.dataFacetMark,\n          source: names.dataFacet\n        };\n        const facets = {\n          type: \"group\",\n          from: {\n            facet: {\n              name: names.dataFacet,\n              data: names.dataHeightWidth,\n              groupby: getGroupBy(groupings).map(safeFieldName)\n            }\n          },\n          data: [\n            {\n              name: names.dataExtents,\n              source: names.dataFacet,\n              transform: [\n                {\n                  type: \"extent\",\n                  field: names.fieldHeight,\n                  signal: names.heightExtent\n                },\n                {\n                  type: \"extent\",\n                  field: names.fieldWidth,\n                  signal: names.widthExtent\n                }\n              ]\n            },\n            treemapData\n          ]\n        };\n        globalScope.setMarkDataName(names.dataFacetMark);\n        addMarks(globalScope.markGroup, facets);\n        globalScope.setMarkGroup(facets);\n        this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n        return this.addMark(offsets2, facets, globalScope.markDataName);\n      } else {\n        this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n        return this.addMark(offsets2, globalScope.markGroup, globalScope.markDataName);\n      }\n    }\n    addMark(offsets2, markParent, markDataName) {\n      const { names, prefix, props } = this;\n      const { view, z: z2 } = props;\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: markDataName },\n        encode: {\n          update: Object.assign({ width: {\n            signal: offsets2.w\n          }, height: {\n            signal: offsets2.h\n          } }, z2 && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z2.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(markParent, mark);\n      return mark;\n    }\n    treemapTransform(treemapData, widthSignal, heightSignal) {\n      const { names, props } = this;\n      const { group: group2, size } = props;\n      addTransforms(treemapData, {\n        type: \"filter\",\n        expr: `datum[${JSON.stringify(size.name)}] > 0`\n      }, {\n        type: \"nest\",\n        keys: [group2 && group2.name || \"__NONE__\"]\n      }, {\n        type: \"treemap\",\n        field: safeFieldName(size.name),\n        sort: { field: \"value\", order: \"descending\" },\n        round: true,\n        method: { signal: SignalNames.TreeMapMethod },\n        paddingInner: 1,\n        paddingOuter: 0,\n        size: [\n          { signal: widthSignal },\n          { signal: heightSignal }\n        ],\n        as: [\n          names.fieldX0,\n          names.fieldY0,\n          names.fieldX1,\n          names.fieldY1,\n          names.fieldDepth,\n          names.fieldChildren\n        ]\n      });\n    }\n  };\n  function fn(n) {\n    return `datum[${JSON.stringify(n)}]`;\n  }\n  function subtract$1(...fields) {\n    return fields.map((n) => fn(n)).join(\" - \");\n  }\n  class Wrap extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `wrap_${this.id}`;\n      this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n      this.names = {\n        outputData: `data_${p}_out`,\n        rowColumnDataName: `data_${p}_row_col`,\n        cellHeight: `${p}_cellHeight`,\n        cellWidth: `${p}_cellWidth`,\n        fits: `${p}_fits`,\n        target: `${p}_target`,\n        minArea: `${p}_minArea`,\n        aspect: `${p}_aspect`,\n        minAspect: `${p}_minAspect`,\n        idealAspect: `${p}_idealAspect`,\n        dataLength: `${p}_dataLength`,\n        rxc0: `${p}_rxc0`,\n        rxc1: `${p}_rxc1`,\n        rxc2: `${p}_rxc2`,\n        rxc: `${p}_rxc`,\n        growColCount: `${p}_growColCount`,\n        growCellWidth: `${p}_growCellWidth`,\n        fitsArea: `${p}_fitsArea`,\n        colCount: `${p}_colCount`\n      };\n    }\n    getGrouping() {\n      return this.bin.fields;\n    }\n    build() {\n      const { bin: bin2, names, prefix, props } = this;\n      const { axisTextColor, cellTitles, globalScope, parentScope } = props;\n      let ordinalBinData;\n      if (bin2.native === false) {\n        addSignals(globalScope.scope, ...bin2.signals);\n        addTransforms(globalScope.data, ...bin2.transforms);\n        addData(globalScope.scope, bin2.dataSequence);\n        addTransforms(bin2.dataSequence, {\n          type: \"formula\",\n          expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin2.fields[0])}, datum[${JSON.stringify(bin2.fields[0])}])`,\n          as: FieldNames.Contains\n        });\n        ordinalBinData = bin2.dataSequence.name;\n      } else {\n        const ord = createOrdinals(globalScope.data.name, prefix, bin2.fields, \"ascending\");\n        addData(globalScope.scope, ord.data);\n        ordinalBinData = ord.data.name;\n      }\n      addData(globalScope.scope, {\n        name: names.rxc0,\n        transform: [\n          {\n            type: \"sequence\",\n            start: 1,\n            stop: {\n              signal: `ceil(sqrt(${names.dataLength})) + 1`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: `ceil(${names.dataLength} / datum.data)`,\n            as: \"complement\"\n          }\n        ]\n      }, {\n        name: names.rxc1,\n        source: names.rxc0,\n        transform: [\n          {\n            type: \"project\",\n            fields: [\"data\"],\n            as: [\"cols\"]\n          }\n        ]\n      }, {\n        name: names.rxc2,\n        source: names.rxc0,\n        transform: [\n          {\n            type: \"project\",\n            fields: [\"complement\"],\n            as: [\"cols\"]\n          }\n        ]\n      }, {\n        name: names.rxc,\n        source: [names.rxc1, names.rxc2],\n        transform: [\n          {\n            type: \"formula\",\n            expr: `ceil(${names.dataLength} / datum.cols)`,\n            as: \"rows\"\n          },\n          {\n            type: \"formula\",\n            expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n            as: \"cellw\"\n          },\n          {\n            type: \"formula\",\n            expr: `datum.cols === 1 ? max(datum.cellw, ${SignalNames.MinCellWidth}) : datum.cellw`,\n            as: \"cellw\"\n          },\n          {\n            type: \"formula\",\n            expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n            as: \"cellh\"\n          },\n          {\n            type: \"formula\",\n            expr: `datum.rows === 1 ? max(datum.cellh, ${SignalNames.MinCellHeight}) : datum.cellh`,\n            as: \"cellh\"\n          },\n          {\n            type: \"formula\",\n            expr: `(datum.cellw >= ${SignalNames.MinCellWidth} && datum.cellh >= ${SignalNames.MinCellHeight})`,\n            as: \"meetsmin\"\n          },\n          {\n            type: \"filter\",\n            expr: \"datum.meetsmin\"\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.cellw / datum.cellh\",\n            as: names.aspect\n          },\n          {\n            type: \"formula\",\n            expr: `abs(datum.${names.aspect} - ${names.target})`,\n            as: names.idealAspect\n          },\n          {\n            type: \"formula\",\n            expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n            as: \"coverage\"\n          },\n          {\n            type: \"collect\",\n            sort: {\n              field: [names.idealAspect, \"coverage\"],\n              order: [\"ascending\", \"descending\"]\n            }\n          }\n        ]\n      }, {\n        name: names.rowColumnDataName,\n        source: ordinalBinData,\n        transform: [\n          {\n            type: \"formula\",\n            expr: `floor((datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) / ${names.colCount})`,\n            as: FieldNames.WrapRow\n          },\n          {\n            type: \"formula\",\n            expr: `(datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) % ${names.colCount}`,\n            as: FieldNames.WrapCol\n          },\n          {\n            type: \"formula\",\n            expr: serializeAsVegaExpression(bin2, FieldNames.First, FieldNames.Last),\n            as: FieldNames.FacetSearch\n          },\n          {\n            type: \"formula\",\n            expr: displayBin(bin2),\n            as: FieldNames.FacetTitle\n          }\n        ]\n      });\n      const dataOut = {\n        name: names.outputData,\n        source: globalScope.data.name,\n        transform: [\n          {\n            type: \"lookup\",\n            from: names.rowColumnDataName,\n            key: safeFieldName(bin2.fields[0]),\n            fields: [bin2.fields[0]].map(safeFieldName),\n            values: [FieldNames.WrapRow, FieldNames.WrapCol]\n          }\n        ]\n      };\n      addData(globalScope.scope, dataOut);\n      globalScope.setMarkDataName(names.outputData);\n      addSignals(globalScope.scope, {\n        name: names.minAspect,\n        update: `${SignalNames.MinCellWidth} / ${SignalNames.MinCellHeight}`\n      }, {\n        name: names.target,\n        update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`\n      }, {\n        name: names.minArea,\n        update: `${SignalNames.MinCellWidth}*${SignalNames.MinCellHeight}`\n      }, {\n        name: names.aspect,\n        update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`\n      }, {\n        name: names.dataLength,\n        update: `data(${JSON.stringify(ordinalBinData)}).length`\n      }, {\n        name: names.growColCount,\n        update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${SignalNames.MinCellWidth}), 1)`\n      }, {\n        name: names.growCellWidth,\n        update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`\n      }, {\n        name: names.fitsArea,\n        update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`\n      }, {\n        name: names.fits,\n        update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`\n      }, {\n        name: names.colCount,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`\n      }, {\n        name: names.cellWidth,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`\n      }, {\n        name: names.cellHeight,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${SignalNames.MinCellHeight}`\n      });\n      modifySignal(globalScope.signals.plotHeightOut, \"max\", `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n      modifySignal(globalScope.signals.plotWidthOut, \"max\", `(${names.cellWidth} * ${names.colCount})`);\n      const signalH = [names.cellHeight, SignalNames.FacetPaddingTop, SignalNames.FacetPaddingBottom].join(\" - \");\n      const signalW = [names.cellWidth, SignalNames.FacetPaddingLeft].join(\" - \");\n      const signalX = addOffsets(parentScope.offsets.x, `datum[${JSON.stringify(FieldNames.WrapCol)}] * ${names.cellWidth}`, SignalNames.FacetPaddingLeft);\n      const signalY = addOffsets(parentScope.offsets.y, `datum[${JSON.stringify(FieldNames.WrapRow)}] * ${names.cellHeight}`, SignalNames.FacetPaddingTop);\n      const update2 = {\n        height: {\n          signal: signalH\n        },\n        width: {\n          signal: signalW\n        },\n        x: {\n          signal: signalX\n        },\n        y: {\n          signal: signalY\n        }\n      };\n      const offsets2 = {\n        x: signalX,\n        y: signalY,\n        h: signalH,\n        w: signalW\n      };\n      const group2 = {\n        style: \"cell\",\n        name: prefix,\n        type: \"group\",\n        from: {\n          data: names.rowColumnDataName\n        },\n        encode: { update: update2 }\n      };\n      addMarks(globalScope.markGroup, group2);\n      const sizeSignals = {\n        layoutHeight: `(${names.cellHeight} - ${SignalNames.FacetPaddingTop} - ${SignalNames.FacetPaddingBottom})`,\n        layoutWidth: `(${names.cellWidth} - ${SignalNames.FacetPaddingLeft})`,\n        colCount: names.colCount,\n        rowCount: `ceil(${names.dataLength} / ${names.colCount})`\n      };\n      if (cellTitles) {\n        addFacetCellTitles(group2, sizeSignals, axisTextColor);\n      }\n      return {\n        facetScope: group2,\n        sizeSignals,\n        offsets: offsets2\n      };\n    }\n  }\n  const layoutClasses = {\n    AggregateContainer,\n    AggregateSquare,\n    Band: Band$1,\n    Cross: Cross$1,\n    Scatter: Scatter$1,\n    Square,\n    Stack: Stack$1,\n    Strip,\n    Treemap: Treemap$1,\n    Wrap\n  };\n  function getImageMark(backgroundImage, allGlobalScales) {\n    const xScale = allGlobalScales.filter((s2) => s2.scales.x)[0].scales.x[0];\n    const yScale = allGlobalScales.filter((s2) => s2.scales.y)[0].scales.y[0];\n    const [xScaleName, yScaleName] = [xScale, yScale].map((s2) => s2.name + (xScale.type === \"band\" ? bandScaleLinearSuffix : \"\"));\n    return {\n      type: \"image\",\n      encode: {\n        update: {\n          url: {\n            value: backgroundImage.url\n          },\n          aspect: {\n            value: false\n          },\n          baseline: {\n            value: \"bottom\"\n          },\n          height: {\n            signal: getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top)\n          },\n          y: {\n            signal: getScaledValue(yScaleName, backgroundImage.extents.bottom)\n          },\n          width: {\n            signal: getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left)\n          },\n          x: {\n            signal: getScaledValue(xScaleName, backgroundImage.extents.left)\n          }\n        }\n      }\n    };\n  }\n  function getScaledSpan(scaleName, low, high) {\n    return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n  }\n  function getScaledValue(scaleName, value2) {\n    return `scale('${scaleName}', ${value2})`;\n  }\n  class SpecBuilder {\n    constructor(props, specContext) {\n      this.props = props;\n      this.specContext = specContext;\n      this.globalSignals = {\n        facetAxesAdjustX: { name: SignalNames.FacetAxesAdjustX, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingLeft.toString() : \"0\" },\n        facetAxesAdjustY: { name: SignalNames.FacetAxesAdjustY, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingBottom.toString() : \"0\" },\n        minCellWidth: {\n          name: SignalNames.MinCellWidth,\n          update: `${minFacetWidth}`\n        },\n        minCellHeight: { name: SignalNames.MinCellHeight, update: `${minFacetHeight}` },\n        plotOffsetLeft: { name: SignalNames.PlotOffsetLeft, update: \"0\" },\n        plotOffsetTop: { name: SignalNames.PlotOffsetTop, update: \"0\" },\n        plotOffsetBottom: { name: SignalNames.PlotOffsetBottom, update: \"0\" },\n        plotOffsetRight: { name: SignalNames.PlotOffsetRight, update: \"0\" },\n        plotHeightOut: { name: SignalNames.PlotHeightOut, update: SignalNames.PlotHeightIn },\n        plotWidthOut: { name: SignalNames.PlotWidthOut, update: SignalNames.PlotWidthIn }\n      };\n    }\n    validate() {\n      const { specContext } = this;\n      const { specCapabilities } = this.props;\n      const { roles } = specCapabilities;\n      const required2 = roles.filter((r) => {\n        switch (typeof r.allowNone) {\n          case \"boolean\":\n            return !r.allowNone;\n          case \"undefined\":\n            return true;\n          case \"function\":\n            return !r.allowNone(specContext);\n        }\n      });\n      const numeric = roles.filter((r) => r.excludeCategoric);\n      const errors = required2.map((r) => {\n        if (specContext.specColumns[r.role]) {\n          return null;\n        } else {\n          return `Field ${r.role} is required.`;\n        }\n      }).concat(numeric.map((r) => {\n        if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) {\n          return `Field ${r.role} must be quantitative.`;\n        } else {\n          return null;\n        }\n      })).filter(Boolean);\n      const { backgroundImage } = specContext.insight;\n      if (backgroundImage && !backgroundImage.extents) {\n        errors.push(\"BackgroundImage must have extents.\");\n      }\n      return errors;\n    }\n    build() {\n      var _a2, _b2;\n      const { globalSignals, specContext } = this;\n      const { facetLayout, specCapabilities } = this.props;\n      const { insight, specColumns, specViewOptions } = specContext;\n      const dataName = \"data_source\";\n      const { vegaSpec, groupMark } = this.initSpec(dataName);\n      const { topColorField, colorDataName } = addColor({\n        scope: vegaSpec,\n        dataName,\n        specContext,\n        scaleName: ScaleNames.Color,\n        legendDataName: \"data_legend\",\n        topLookupName: \"data_topcolorlookup\",\n        colorReverseSignalName: SignalNames.ColorReverse\n      });\n      const globalScope = new GlobalScope({\n        dataName: colorDataName,\n        markGroup: groupMark,\n        scope: vegaSpec,\n        signals: globalSignals\n      });\n      if (facetLayout) {\n        addSignals(vegaSpec, {\n          name: SignalNames.FacetPaddingBottom,\n          update: `${facetLayout.facetPadding.bottom}`\n        }, {\n          name: SignalNames.FacetPaddingLeft,\n          update: `${facetLayout.facetPadding.left}`\n        }, {\n          name: SignalNames.FacetPaddingTop,\n          update: `${facetLayout.facetPadding.top}`\n        });\n        globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n        globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n      }\n      const { firstScope, finalScope, specResult, allGlobalScales, allEncodingRules } = this.iterateLayouts(globalScope, (i, innerScope) => {\n        if (facetLayout && i === 0) {\n          globalScope.zSize = innerScope.offsets.h;\n        }\n      });\n      if (specResult) {\n        return specResult;\n      }\n      if (allGlobalScales.length > 0) {\n        const plotHeightOut = globalSignals.plotHeightOut.name;\n        const plotWidthOut = globalSignals.plotWidthOut.name;\n        const colTitleScale = {\n          type: \"linear\",\n          name: \"scale_facet_col_title\",\n          domain: [0, 1],\n          range: [0, { signal: plotWidthOut }]\n        };\n        const rowTitleScale = {\n          type: \"linear\",\n          name: \"scale_facet_row_title\",\n          domain: [0, 1],\n          range: [{ signal: plotHeightOut }, 0]\n        };\n        const facetScope = facetLayout ? firstScope : null;\n        const backgroundGroup = facetLayout ? facetScope.facetScope : groupMark;\n        if (insight.backgroundImage && specCapabilities.backgroundImage && ((_a2 = specColumns.x) === null || _a2 === void 0 ? void 0 : _a2.quantitative) && ((_b2 = specColumns.y) === null || _b2 === void 0 ? void 0 : _b2.quantitative)) {\n          if (!backgroundGroup.marks) {\n            backgroundGroup.marks = [];\n          }\n          const imageMark = getImageMark(insight.backgroundImage, allGlobalScales);\n          backgroundGroup.marks.unshift(imageMark);\n        }\n        const axesScopes = facetLayout ? addFacetAxesGroupMarks({\n          globalScope: globalScope.scope,\n          plotScope: groupMark,\n          facetScope,\n          colTitleScale,\n          rowTitleScale,\n          colSeqName: \"data_FacetCellColTitles\",\n          rowSeqName: \"data_FacetCellRowTitles\"\n        }) : {\n          main: [{\n            scope: groupMark,\n            lines: true,\n            labels: true,\n            title: true\n          }]\n        };\n        addGlobalAxes({\n          globalScope,\n          allGlobalScales,\n          axisScales: this.props.axisScales,\n          plotOffsetSignals: { x: globalSignals.plotOffsetLeft, y: globalSignals.plotOffsetBottom },\n          axesOffsets: { x: axesOffsetX, y: axesOffsetY },\n          axesTitlePadding: facetLayout ? { x: axesTitlePaddingFacetX, y: axesTitlePaddingFacetY } : { x: axesTitlePaddingX, y: axesTitlePaddingY },\n          labelBaseline: { x: \"top\", y: \"middle\" },\n          specColumns,\n          specViewOptions,\n          axesScopes,\n          hideZAxis: !!facetLayout,\n          view: insight.view\n        });\n      }\n      if (finalScope.mark) {\n        const { update: update2 } = finalScope.mark.encode;\n        const outputDataName = \"output\";\n        finalScope.mark.from.data = outputDataName;\n        addData(globalScope.markGroup, {\n          name: outputDataName,\n          source: globalScope.markDataName,\n          transform: [\n            {\n              type: \"formula\",\n              expr: finalScope.offsets.x,\n              as: FieldNames.OffsetX\n            },\n            {\n              type: \"formula\",\n              expr: finalScope.offsets.y,\n              as: FieldNames.OffsetY\n            }\n          ]\n        });\n        update2.x = {\n          field: FieldNames.OffsetX\n        };\n        update2.y = {\n          field: FieldNames.OffsetY\n        };\n        allEncodingRules.forEach((map2) => {\n          for (const key2 in map2) {\n            if (update2[key2]) {\n              const arrIn = map2[key2];\n              if (!Array.isArray(update2[key2])) {\n                const value2 = update2[key2];\n                const arrOut = [];\n                update2[key2] = arrOut;\n                arrIn.forEach((rule2) => arrOut.push(rule2));\n                arrOut.push(value2);\n              } else {\n                const arrOut = update2[key2];\n                arrIn.forEach((rule2) => arrOut.unshift(rule2));\n              }\n            }\n          }\n        });\n        update2.fill = fill$1(specContext, topColorField, ScaleNames.Color);\n        update2.opacity = opacity();\n      }\n      return {\n        specCapabilities,\n        vegaSpec\n      };\n    }\n    initSpec(dataName) {\n      const { globalSignals } = this;\n      const { facetAxesAdjustX, facetAxesAdjustY, minCellWidth, minCellHeight, plotOffsetLeft, plotOffsetBottom, plotOffsetTop, plotOffsetRight, plotHeightOut, plotWidthOut } = globalSignals;\n      const { specContext } = this;\n      const { insight } = specContext;\n      const groupMark = {\n        type: \"group\",\n        //style: 'cell',\n        encode: {\n          update: {\n            x: { signal: `${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}` },\n            y: { signal: SignalNames.PlotOffsetTop },\n            height: { signal: `${SignalNames.PlotHeightOut} - ${SignalNames.FacetAxesAdjustY}` },\n            width: { signal: `${SignalNames.PlotWidthOut} + ${SignalNames.FacetAxesAdjustX}` }\n          }\n        }\n      };\n      const inputDataname = \"input\";\n      const vegaSpec = {\n        $schema: \"https://vega.github.io/schema/vega/v5.json\",\n        //style: 'cell',\n        data: [{ name: inputDataname }, { name: dataName, source: inputDataname, transform: [] }],\n        marks: [groupMark],\n        signals: textSignals(specContext, SignalNames.ViewportHeight).concat([\n          minCellWidth,\n          minCellHeight,\n          {\n            name: SignalNames.ViewportHeight,\n            update: `max(${SignalNames.MinCellHeight}, ${insight.size.height})`\n          },\n          {\n            name: SignalNames.ViewportWidth,\n            update: `max(${SignalNames.MinCellWidth}, ${insight.size.width})`\n          },\n          plotOffsetLeft,\n          plotOffsetTop,\n          plotOffsetBottom,\n          plotOffsetRight,\n          facetAxesAdjustX,\n          facetAxesAdjustY,\n          {\n            name: SignalNames.PlotHeightIn,\n            update: `${SignalNames.ViewportHeight} - ${SignalNames.PlotOffsetBottom} + ${SignalNames.FacetAxesAdjustY}`\n          },\n          {\n            name: SignalNames.PlotWidthIn,\n            update: `${SignalNames.ViewportWidth} - ${SignalNames.PlotOffsetLeft} - ${SignalNames.PlotOffsetRight}`\n          },\n          plotHeightOut,\n          plotWidthOut,\n          {\n            name: \"height\",\n            update: `${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut} + ${SignalNames.PlotOffsetBottom} - ${SignalNames.FacetAxesAdjustY}`\n          },\n          {\n            name: \"width\",\n            update: `${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotOffsetRight}`\n          }\n        ])\n      };\n      return { vegaSpec, groupMark };\n    }\n    iterateLayouts(globalScope, onLayoutBuild) {\n      let specResult;\n      let parentScope = {\n        sizeSignals: globalScope.sizeSignals,\n        offsets: globalScope.offsets\n      };\n      let firstScope;\n      let childScope;\n      const groupings = [];\n      const { layouts, specCapabilities } = this.props;\n      const allGlobalScales = [];\n      const allEncodingRules = [];\n      for (let i = 0; i < layouts.length; i++) {\n        if (!parentScope)\n          continue;\n        const buildProps = {\n          globalScope,\n          parentScope,\n          axesScales: this.props.axisScales,\n          groupings,\n          id: i\n        };\n        const layout = this.createLayout(layouts[i], buildProps);\n        try {\n          childScope = layout.build();\n          childScope.id = i;\n          const groupby = layout.getGrouping();\n          if (groupby) {\n            groupings.push({\n              id: i,\n              groupby,\n              fieldOps: [\n                { field: null, op: \"count\", as: FieldNames.Count }\n              ]\n            });\n          }\n          const sumOp = layout.getAggregateSumOp();\n          if (sumOp) {\n            groupings[groupings.length - 1].fieldOps.push(sumOp);\n          }\n          onLayoutBuild(i, childScope);\n        } catch (e) {\n          specResult = {\n            errors: [e.stack],\n            specCapabilities,\n            vegaSpec: null\n          };\n          break;\n        }\n        if (childScope && childScope.globalScales) {\n          allGlobalScales.push(childScope.globalScales);\n        }\n        if (childScope.encodingRuleMap) {\n          allEncodingRules.push(childScope.encodingRuleMap);\n        }\n        if (i === 0) {\n          firstScope = childScope;\n        }\n        parentScope = childScope;\n      }\n      return { firstScope, finalScope: parentScope, specResult, allGlobalScales, allEncodingRules };\n    }\n    createLayout(layoutPair, buildProps) {\n      const { layoutType, props } = layoutPair;\n      const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n      const layoutClass = layoutClasses[layoutType];\n      const layout = new layoutClass(layoutBuildProps);\n      layout.id = buildProps.id;\n      return layout;\n    }\n  }\n  function build(specContext, currData) {\n    const { specColumns } = specContext;\n    const columns = [\n      specColumns.color,\n      specColumns.facet,\n      specColumns.facetV,\n      specColumns.group,\n      specColumns.size,\n      specColumns.sort,\n      specColumns.x,\n      specColumns.y,\n      specColumns.z\n    ];\n    inferAll(columns, currData);\n    const specBuilderProps = getSpecBuilderPropsForChart(specContext);\n    const specBuilder = new SpecBuilder(specBuilderProps, specContext);\n    let specResult;\n    if (specBuilder) {\n      try {\n        const errors = specBuilder.validate();\n        if (errors.length) {\n          specResult = {\n            errors,\n            specCapabilities: specBuilderProps.specCapabilities,\n            vegaSpec: null\n          };\n        } else {\n          specResult = specBuilder.build();\n        }\n      } catch (e) {\n        specResult = {\n          specCapabilities: null,\n          vegaSpec: null,\n          errors: [e.stack]\n        };\n      }\n      if (!specResult.errors) {\n        const data0 = specResult.vegaSpec.data[0];\n        data0.values = currData;\n      }\n    } else {\n      specResult = {\n        specCapabilities: null,\n        vegaSpec: null,\n        errors: [`could not build spec for ${specContext.insight.chart}`]\n      };\n    }\n    return specResult;\n  }\n  const index$7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    ColorScaleNone,\n    FieldNames,\n    Other,\n    ScaleNames,\n    SignalNames,\n    build,\n    getColumnsFromData,\n    getSpecColumns,\n    getStats,\n    inferAll\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const GL_ORDINAL = \"GL_ORDINAL\";\n  const constants$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    ColorScaleNone,\n    FieldNames,\n    GL_ORDINAL,\n    ScaleNames,\n    SignalNames\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function isSearchExpressionGroup(search) {\n    if (!search) {\n      return false;\n    }\n    return !!search.expressions;\n  }\n  function createGroupFromExpression(input) {\n    const output2 = {\n      expressions: [input]\n    };\n    return output2;\n  }\n  function ensureSearchExpressionGroupArray(search) {\n    if (Array.isArray(search)) {\n      return [...search];\n    } else if (isSearchExpressionGroup(search)) {\n      return [search];\n    } else {\n      return [createGroupFromExpression(search)];\n    }\n  }\n  const expressionKeys = Object.keys({\n    clause: null,\n    name: null,\n    operator: null,\n    value: null\n  });\n  function compareExpression(a2, b2) {\n    if (a2 && b2) {\n      for (let k = 0; k < expressionKeys.length; k++) {\n        const key2 = expressionKeys[k];\n        if (a2[key2] != b2[key2])\n          return false;\n      }\n    } else {\n      return !a2 && !b2;\n    }\n    return true;\n  }\n  const groupKeys = Object.keys({\n    clause: null\n  });\n  function compareGroup$1(a2, b2) {\n    for (let k = 0; k < groupKeys.length; k++) {\n      const key2 = groupKeys[k];\n      if (a2[key2] != b2[key2])\n        return false;\n    }\n    if (!a2.expressions && !b2.expressions)\n      return true;\n    if (!a2.expressions || !b2.expressions)\n      return false;\n    if (a2.expressions.length != b2.expressions.length)\n      return false;\n    for (let i = 0; i < a2.expressions.length; i++) {\n      if (!compareExpression(a2.expressions[i], b2.expressions[i]))\n        return false;\n    }\n    return true;\n  }\n  function compare$4(a2, b2) {\n    if (a2 == b2)\n      return true;\n    if (!a2 || !b2)\n      return false;\n    const arrs = [a2, b2].map(ensureSearchExpressionGroupArray);\n    const [arrA, arrB] = arrs;\n    if (arrA.length != arrB.length)\n      return false;\n    for (let i = 0; i < arrA.length; i++) {\n      if (!compareGroup$1(arrA[i], arrB[i]))\n        return false;\n    }\n    return true;\n  }\n  function startsWith(whole, part) {\n    if (!part)\n      return true;\n    const arrs = [whole, part].map(ensureSearchExpressionGroupArray);\n    const [wholeArray, partArray] = arrs;\n    if (partArray.length > wholeArray.length)\n      return false;\n    for (let i = 0; i < partArray.length; i++) {\n      if (!compareGroup$1(wholeArray[i], partArray[i]))\n        return false;\n    }\n    return true;\n  }\n  function valueToBoolean(value2) {\n    if (typeof value2 === \"string\") {\n      switch (value2.toLowerCase()) {\n        case \"true\":\n          return true;\n        case \"false\":\n          return false;\n      }\n    }\n    return !!value2;\n  }\n  function valueToString(value2) {\n    if (value2 == null) {\n      return \"\";\n    }\n    switch (typeof value2) {\n      case \"string\":\n        return value2;\n      case \"boolean\":\n      case \"number\":\n        return value2.toString();\n    }\n    return \"\";\n  }\n  function isStringOperation(ex) {\n    switch (ex.operator) {\n      case \"contains\":\n      case \"!contains\":\n      case \"starts\":\n      case \"!starts\":\n        return true;\n    }\n    return false;\n  }\n  function isnullorEmpty(value2) {\n    if (value2 == null)\n      return true;\n    if (typeof value2 === \"string\" && value2.length === 0)\n      return true;\n    return false;\n  }\n  class Exec {\n    constructor(search, columns) {\n      this.columns = columns;\n      this.groups = ensureSearchExpressionGroupArray(search).map((g) => {\n        const expressions = g.expressions.filter(Boolean);\n        expressions.forEach((ex) => {\n          ex.column = this.getColumn(ex.name);\n          ex.valueBool = valueToBoolean(ex.value);\n          ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n          ex.stringOperation = isStringOperation(ex);\n        });\n        const group2 = Object.assign(Object.assign({}, g), { expressions });\n        return group2;\n      });\n    }\n    getColumn(name) {\n      for (let i = 0; i < this.columns.length; i++) {\n        if (this.columns[i].name == name) {\n          return this.columns[i];\n        }\n      }\n    }\n    runExpressionOnColumn(datum2, ex) {\n      const actualDataValue = datum2[ex.name];\n      if (ex.operator === \"isnullorEmpty\") {\n        return isnullorEmpty(actualDataValue);\n      } else if (ex.operator === \"!isnullorEmpty\") {\n        return !isnullorEmpty(actualDataValue);\n      }\n      let dataValue = actualDataValue;\n      let expressionValue = ex.value;\n      if (ex.column) {\n        if (ex.column.type === \"string\" || ex.stringOperation) {\n          dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n          expressionValue = ex.valueLow;\n        } else if (ex.column.type === \"boolean\") {\n          dataValue = valueToBoolean(actualDataValue);\n          expressionValue = ex.valueBool;\n        } else if (ex.column.quantitative) {\n          dataValue = +actualDataValue;\n          expressionValue = +ex.value;\n        }\n      }\n      switch (ex.operator) {\n        case \"!=\":\n          return dataValue != expressionValue;\n        case \"<\":\n          return dataValue < expressionValue;\n        case \"<=\":\n          return dataValue <= expressionValue;\n        case \"==\":\n          return dataValue == expressionValue;\n        case \">\":\n          return dataValue > expressionValue;\n        case \">=\":\n          return dataValue >= expressionValue;\n        case \"contains\":\n          return dataValue.indexOf(expressionValue) >= 0;\n        case \"!contains\":\n          return dataValue.indexOf(expressionValue) < 0;\n        case \"starts\":\n          return dataValue.indexOf(expressionValue) == 0;\n        case \"!starts\":\n          return dataValue.indexOf(expressionValue) !== 0;\n      }\n    }\n    runExpression(datum2, ex) {\n      if (ex.name == null) {\n        const group2 = {\n          expressions: this.columns.map((column, i) => {\n            const ex2 = Object.assign(Object.assign({}, ex), { column, name: column.name });\n            if (i) {\n              ex2.clause = \"||\";\n            }\n            return ex2;\n          })\n        };\n        return this.runGroup(datum2, group2);\n      } else {\n        return this.runExpressionOnColumn(datum2, ex);\n      }\n    }\n    runGroup(datum2, group2) {\n      let accumulator = this.runExpression(datum2, group2.expressions[0]);\n      for (let i = 1; i < group2.expressions.length; i++) {\n        const ex = group2.expressions[i];\n        switch (ex.clause) {\n          case \"&&\":\n            accumulator = accumulator && this.runExpression(datum2, ex);\n            break;\n          case \"||\":\n            accumulator = accumulator || this.runExpression(datum2, ex);\n            break;\n        }\n      }\n      return accumulator;\n    }\n    run(datum2) {\n      let accumulator = this.runGroup(datum2, this.groups[0]);\n      for (let i = 1; i < this.groups.length; i++) {\n        const group2 = this.groups[i];\n        switch (group2.clause) {\n          case \"&&\":\n            accumulator = accumulator && this.runGroup(datum2, group2);\n            break;\n          case \"||\":\n            accumulator = accumulator || this.runGroup(datum2, group2);\n            break;\n        }\n      }\n      return accumulator;\n    }\n  }\n  function invertSearchExpressionGroup(input) {\n    const output2 = {\n      expressions: input.expressions.map(invertSearchExpression)\n    };\n    if (input.clause) {\n      output2.clause = invertedClauses[input.clause];\n    }\n    return output2;\n  }\n  const invertedOperators = {\n    \"!=\": \"==\",\n    \"==\": \"!=\",\n    \"<\": \">=\",\n    \">=\": \"<\",\n    \"<=\": \">\",\n    \">\": \"<=\",\n    \"!contains\": \"contains\",\n    \"contains\": \"!contains\",\n    \"!isnullorEmpty\": \"isnullorEmpty\",\n    \"isnullorEmpty\": \"!isnullorEmpty\",\n    \"!starts\": \"starts\",\n    \"starts\": \"!starts\"\n  };\n  const invertedClauses = {\n    \"&&\": \"||\",\n    \"||\": \"&&\"\n  };\n  function invertSearchExpression(input) {\n    const operator2 = invertedOperators[input.operator];\n    const output2 = Object.assign(Object.assign({}, input), { operator: operator2 });\n    if (input.clause) {\n      output2.clause = invertedClauses[input.clause];\n    }\n    return output2;\n  }\n  function invert$2(search) {\n    if (Array.isArray(search)) {\n      return search.map(invertSearchExpressionGroup);\n    } else if (isSearchExpressionGroup(search)) {\n      return invertSearchExpressionGroup(search);\n    } else {\n      return invertSearchExpression(search);\n    }\n  }\n  function narrow(a2, b2) {\n    if (!a2) {\n      return b2;\n    }\n    const arrs = [a2, b2].map(ensureSearchExpressionGroupArray);\n    const [arrA, arrB] = arrs;\n    arrB[0].clause = \"&&\";\n    return arrA.concat(arrB);\n  }\n  const index$6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Exec,\n    compare: compare$4,\n    compareExpression,\n    compareGroup: compareGroup$1,\n    createGroupFromExpression,\n    ensureSearchExpressionGroupArray,\n    invert: invert$2,\n    isSearchExpressionGroup,\n    narrow,\n    startsWith\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const types$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n  function decamelize(str, separator = \"-\") {\n    return str.replace(/([a-z\\d])([A-Z])/g, \"$1\" + separator + \"$2\").replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, \"$1\" + separator + \"$2\").toLowerCase();\n  }\n  function createElement(tag, attrs, ...children2) {\n    if (typeof tag === \"function\") {\n      const fn2 = tag;\n      let props = attrs;\n      if (props === null || props === void 0) {\n        props = { children: children2 };\n      } else {\n        props.children = children2;\n      }\n      return fn2(props);\n    } else {\n      const ns = tag === \"svg\" ? SVG_NAMESPACE : null;\n      const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n      const map2 = attrs;\n      let ref2;\n      for (let name in map2) {\n        if (name && map2.hasOwnProperty(name)) {\n          let value2 = map2[name];\n          if (name === \"className\" && value2 !== void 0) {\n            setAttribute$1(el, ns, \"class\", value2.toString());\n          } else if (name === \"disabled\" && !value2) ;\n          else if (value2 === null || value2 === void 0) {\n            continue;\n          } else if (value2 === true) {\n            setAttribute$1(el, ns, name, name);\n          } else if (typeof value2 === \"function\") {\n            if (name === \"ref\") {\n              ref2 = value2;\n            } else {\n              el[name.toLowerCase()] = value2;\n            }\n          } else if (typeof value2 === \"object\") {\n            setAttribute$1(el, ns, name, flatten$1(value2));\n          } else {\n            setAttribute$1(el, ns, name, value2.toString());\n          }\n        }\n      }\n      if (children2 && children2.length > 0) {\n        appendChildren(el, children2);\n      }\n      if (ref2) {\n        ref2(el);\n      }\n      return el;\n    }\n  }\n  function setAttribute$1(el, ns, name, value2) {\n    if (ns) {\n      el.setAttributeNS(null, name, value2);\n    } else {\n      el.setAttribute(name, value2);\n    }\n  }\n  function flatten$1(o) {\n    const arr = [];\n    for (let prop in o)\n      arr.push(`${decamelize(prop, \"-\")}:${o[prop]}`);\n    return arr.join(\";\");\n  }\n  function isInsideForeignObject(element2) {\n    let current = element2;\n    while (current) {\n      if (current.tagName.toLowerCase() === \"foreignobject\") {\n        return true;\n      }\n      current = current.parentElement;\n    }\n    return false;\n  }\n  function recreateWithSvgNamespace(element2) {\n    const svgElement = document.createElementNS(SVG_NAMESPACE, element2.tagName.toLowerCase());\n    for (let i = 0; i < element2.attributes.length; i++) {\n      const attr2 = element2.attributes[i];\n      svgElement.setAttributeNS(null, attr2.name, attr2.value);\n    }\n    const eventProperties = [\n      \"onclick\",\n      \"onmousedown\",\n      \"onmouseup\",\n      \"onmouseover\",\n      \"onmouseout\",\n      \"onmousemove\",\n      \"onkeydown\",\n      \"onkeyup\",\n      \"onkeypress\",\n      \"onfocus\",\n      \"onblur\"\n    ];\n    for (const prop of eventProperties) {\n      if (element2[prop]) {\n        svgElement[prop] = element2[prop];\n      }\n    }\n    for (let i = 0; i < element2.childNodes.length; i++) {\n      const child = element2.childNodes[i];\n      if (child.nodeType === Node.ELEMENT_NODE) {\n        svgElement.appendChild(recreateWithSvgNamespace(child));\n      } else {\n        svgElement.appendChild(child.cloneNode(true));\n      }\n    }\n    return svgElement;\n  }\n  function addChild(parentElement, child) {\n    if (child === null || child === void 0 || typeof child === \"boolean\") {\n      return;\n    } else if (Array.isArray(child)) {\n      appendChildren(parentElement, child);\n    } else if (isElement(child)) {\n      const childEl = child;\n      if (parentElement.namespaceURI === SVG_NAMESPACE && childEl.namespaceURI !== SVG_NAMESPACE && childEl.tagName.toLowerCase() !== \"foreignobject\" && !isInsideForeignObject(parentElement)) {\n        const recreated = recreateWithSvgNamespace(childEl);\n        parentElement.appendChild(recreated);\n      } else {\n        parentElement.appendChild(childEl);\n      }\n    } else {\n      parentElement.appendChild(document.createTextNode(child.toString()));\n    }\n  }\n  function appendChildren(parentElement, children2) {\n    children2.forEach((child) => addChild(parentElement, child));\n  }\n  function isElement(el) {\n    return !!el.nodeType;\n  }\n  function mount(element2, container) {\n    container.innerHTML = \"\";\n    if (element2) {\n      addChild(container, element2);\n    }\n  }\n  function findElementByChildPositions(childPositions, container) {\n    let element2 = container || document.body;\n    let childPosition;\n    while (element2 && childPositions.length) {\n      childPosition = childPositions.shift();\n      element2 = element2.children.item(childPosition);\n    }\n    if (element2) {\n      return element2;\n    }\n  }\n  function focusActiveElement(element2, activeElementInfo) {\n    element2.focus();\n    element2.scrollTop = activeElementInfo.scrollTop;\n    const input = element2;\n    if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) {\n      input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n    }\n  }\n  function setActiveElement(activeElementInfo, container) {\n    if (activeElementInfo) {\n      const element2 = findElementByChildPositions(activeElementInfo.childPositions, container);\n      if (element2) {\n        focusActiveElement(element2, activeElementInfo);\n      }\n    }\n  }\n  function getActiveElementInfo(container) {\n    let element2 = document.activeElement;\n    const { scrollTop, selectionDirection, selectionEnd, selectionStart } = element2;\n    const activeElementInfo = {\n      childPositions: [],\n      scrollTop,\n      selectionDirection,\n      selectionEnd,\n      selectionStart\n    };\n    while (element2 && element2 !== document.body && element2 !== container) {\n      activeElementInfo.childPositions.unshift(getChildPosition(element2));\n      element2 = element2.parentElement;\n    }\n    if ((element2 === document.body || element2 === container) && activeElementInfo.childPositions.length)\n      return activeElementInfo;\n  }\n  function getChildPosition(element2) {\n    let childPosition = 0;\n    while (element2 = element2.previousElementSibling)\n      childPosition++;\n    return childPosition;\n  }\n  const KeyCodes$2 = {\n    ENTER: \"Enter\"\n  };\n  const Table$1 = (props) => {\n    return createElement(\n      \"table\",\n      { className: props.className },\n      props.children,\n      props.rows.map((row, i) => createElement(\"tr\", { className: props.rowClassName || \"\", onClick: (e) => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: (e) => {\n        if (e.key === KeyCodes$2.ENTER && props.onRowClick) {\n          props.onRowClick(e, i);\n        }\n      } }, row.cells.map((cell2, i2) => createElement(\"td\", { className: cell2.className || \"\", title: cell2.title || \"\" }, cell2.content))))\n    );\n  };\n  const controls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Table: Table$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var EPSILON$3 = 1e-6;\n  var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\n  function setMatrixArrayType(type2) {\n    ARRAY_TYPE = type2;\n  }\n  function create$8() {\n    var out = new ARRAY_TYPE(9);\n    if (ARRAY_TYPE != Float32Array) {\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[5] = 0;\n      out[6] = 0;\n      out[7] = 0;\n    }\n    out[0] = 1;\n    out[4] = 1;\n    out[8] = 1;\n    return out;\n  }\n  function fromMat4(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[4];\n    out[4] = a2[5];\n    out[5] = a2[6];\n    out[6] = a2[8];\n    out[7] = a2[9];\n    out[8] = a2[10];\n    return out;\n  }\n  function fromValues$5(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n  }\n  function fromQuat$1(out, q) {\n    var x2 = q[0], y2 = q[1], z2 = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z22 = z2 + z2;\n    var xx = x2 * x22;\n    var yx = y2 * x22;\n    var yy = y2 * y22;\n    var zx = z2 * x22;\n    var zy = z2 * y22;\n    var zz = z2 * z22;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z22;\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n    return out;\n  }\n  function create$7() {\n    var out = new ARRAY_TYPE(16);\n    if (ARRAY_TYPE != Float32Array) {\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n    }\n    out[0] = 1;\n    out[5] = 1;\n    out[10] = 1;\n    out[15] = 1;\n    return out;\n  }\n  function copy$7(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    out[4] = a2[4];\n    out[5] = a2[5];\n    out[6] = a2[6];\n    out[7] = a2[7];\n    out[8] = a2[8];\n    out[9] = a2[9];\n    out[10] = a2[10];\n    out[11] = a2[11];\n    out[12] = a2[12];\n    out[13] = a2[13];\n    out[14] = a2[14];\n    out[15] = a2[15];\n    return out;\n  }\n  function fromValues$4(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n  }\n  function identity$8(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function invert$1(out, a2) {\n    var a00 = a2[0], a01 = a2[1], a02 = a2[2], a03 = a2[3];\n    var a10 = a2[4], a11 = a2[5], a12 = a2[6], a13 = a2[7];\n    var a20 = a2[8], a21 = a2[9], a22 = a2[10], a23 = a2[11];\n    var a30 = a2[12], a31 = a2[13], a32 = a2[14], a33 = a2[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32;\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) {\n      return null;\n    }\n    det = 1 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n    return out;\n  }\n  function multiply$2(out, a2, b2) {\n    var a00 = a2[0], a01 = a2[1], a02 = a2[2], a03 = a2[3];\n    var a10 = a2[4], a11 = a2[5], a12 = a2[6], a13 = a2[7];\n    var a20 = a2[8], a21 = a2[9], a22 = a2[10], a23 = a2[11];\n    var a30 = a2[12], a31 = a2[13], a32 = a2[14], a33 = a2[15];\n    var b0 = b2[0], b1 = b2[1], b22 = b2[2], b3 = b2[3];\n    out[0] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[4];\n    b1 = b2[5];\n    b22 = b2[6];\n    b3 = b2[7];\n    out[4] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[8];\n    b1 = b2[9];\n    b22 = b2[10];\n    b3 = b2[11];\n    out[8] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[12];\n    b1 = b2[13];\n    b22 = b2[14];\n    b3 = b2[15];\n    out[12] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    return out;\n  }\n  function translate$2(out, a2, v) {\n    var x2 = v[0], y2 = v[1], z2 = v[2];\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    if (a2 === out) {\n      out[12] = a2[0] * x2 + a2[4] * y2 + a2[8] * z2 + a2[12];\n      out[13] = a2[1] * x2 + a2[5] * y2 + a2[9] * z2 + a2[13];\n      out[14] = a2[2] * x2 + a2[6] * y2 + a2[10] * z2 + a2[14];\n      out[15] = a2[3] * x2 + a2[7] * y2 + a2[11] * z2 + a2[15];\n    } else {\n      a00 = a2[0];\n      a01 = a2[1];\n      a02 = a2[2];\n      a03 = a2[3];\n      a10 = a2[4];\n      a11 = a2[5];\n      a12 = a2[6];\n      a13 = a2[7];\n      a20 = a2[8];\n      a21 = a2[9];\n      a22 = a2[10];\n      a23 = a2[11];\n      out[0] = a00;\n      out[1] = a01;\n      out[2] = a02;\n      out[3] = a03;\n      out[4] = a10;\n      out[5] = a11;\n      out[6] = a12;\n      out[7] = a13;\n      out[8] = a20;\n      out[9] = a21;\n      out[10] = a22;\n      out[11] = a23;\n      out[12] = a00 * x2 + a10 * y2 + a20 * z2 + a2[12];\n      out[13] = a01 * x2 + a11 * y2 + a21 * z2 + a2[13];\n      out[14] = a02 * x2 + a12 * y2 + a22 * z2 + a2[14];\n      out[15] = a03 * x2 + a13 * y2 + a23 * z2 + a2[15];\n    }\n    return out;\n  }\n  function scale$6(out, a2, v) {\n    var x2 = v[0], y2 = v[1], z2 = v[2];\n    out[0] = a2[0] * x2;\n    out[1] = a2[1] * x2;\n    out[2] = a2[2] * x2;\n    out[3] = a2[3] * x2;\n    out[4] = a2[4] * y2;\n    out[5] = a2[5] * y2;\n    out[6] = a2[6] * y2;\n    out[7] = a2[7] * y2;\n    out[8] = a2[8] * z2;\n    out[9] = a2[9] * z2;\n    out[10] = a2[10] * z2;\n    out[11] = a2[11] * z2;\n    out[12] = a2[12];\n    out[13] = a2[13];\n    out[14] = a2[14];\n    out[15] = a2[15];\n    return out;\n  }\n  function fromScaling(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function fromRotationTranslationScale(out, q, v, s2) {\n    var x2 = q[0], y2 = q[1], z2 = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z22 = z2 + z2;\n    var xx = x2 * x22;\n    var xy = x2 * y22;\n    var xz = x2 * z22;\n    var yy = y2 * y22;\n    var yz = y2 * z22;\n    var zz = z2 * z22;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z22;\n    var sx = s2[0];\n    var sy = s2[1];\n    var sz2 = s2[2];\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz2;\n    out[9] = (yz - wx) * sz2;\n    out[10] = (1 - (xx + yy)) * sz2;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n  }\n  function fromRotationTranslationScaleOrigin(out, q, v, s2, o) {\n    var x2 = q[0], y2 = q[1], z2 = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z22 = z2 + z2;\n    var xx = x2 * x22;\n    var xy = x2 * y22;\n    var xz = x2 * z22;\n    var yy = y2 * y22;\n    var yz = y2 * z22;\n    var zz = z2 * z22;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z22;\n    var sx = s2[0];\n    var sy = s2[1];\n    var sz2 = s2[2];\n    var ox = o[0];\n    var oy = o[1];\n    var oz = o[2];\n    var out0 = (1 - (yy + zz)) * sx;\n    var out1 = (xy + wz) * sx;\n    var out2 = (xz - wy) * sx;\n    var out4 = (xy - wz) * sy;\n    var out5 = (1 - (xx + zz)) * sy;\n    var out6 = (yz + wx) * sy;\n    var out8 = (xz + wy) * sz2;\n    var out9 = (yz - wx) * sz2;\n    var out10 = (1 - (xx + yy)) * sz2;\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = 0;\n    out[4] = out4;\n    out[5] = out5;\n    out[6] = out6;\n    out[7] = 0;\n    out[8] = out8;\n    out[9] = out9;\n    out[10] = out10;\n    out[11] = 0;\n    out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n    out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n    out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n    out[15] = 1;\n    return out;\n  }\n  function fromQuat(out, q) {\n    var x2 = q[0], y2 = q[1], z2 = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z22 = z2 + z2;\n    var xx = x2 * x22;\n    var yx = y2 * x22;\n    var yy = y2 * y22;\n    var zx = z2 * x22;\n    var zy = z2 * y22;\n    var zz = z2 * z22;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z22;\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function frustum(out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left);\n    var tb = 1 / (top - bottom);\n    var nf = 1 / (near - far);\n    out[0] = near * 2 * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = near * 2 * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = far * near * 2 * nf;\n    out[15] = 0;\n    return out;\n  }\n  function perspectiveNO(out, fovy, aspect, near, far) {\n    var f = 1 / Math.tan(fovy / 2);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n      var nf = 1 / (near - far);\n      out[10] = (far + near) * nf;\n      out[14] = 2 * far * near * nf;\n    } else {\n      out[10] = -1;\n      out[14] = -2 * near;\n    }\n    return out;\n  }\n  var perspective = perspectiveNO;\n  function lookAt(out, eye, center, up) {\n    var x02, x12, x2, y02, y12, y2, z02, z1, z2, len2;\n    var eyex = eye[0];\n    var eyey = eye[1];\n    var eyez = eye[2];\n    var upx = up[0];\n    var upy = up[1];\n    var upz = up[2];\n    var centerx = center[0];\n    var centery = center[1];\n    var centerz = center[2];\n    if (Math.abs(eyex - centerx) < EPSILON$3 && Math.abs(eyey - centery) < EPSILON$3 && Math.abs(eyez - centerz) < EPSILON$3) {\n      return identity$8(out);\n    }\n    z02 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n    len2 = 1 / Math.sqrt(z02 * z02 + z1 * z1 + z2 * z2);\n    z02 *= len2;\n    z1 *= len2;\n    z2 *= len2;\n    x02 = upy * z2 - upz * z1;\n    x12 = upz * z02 - upx * z2;\n    x2 = upx * z1 - upy * z02;\n    len2 = Math.sqrt(x02 * x02 + x12 * x12 + x2 * x2);\n    if (!len2) {\n      x02 = 0;\n      x12 = 0;\n      x2 = 0;\n    } else {\n      len2 = 1 / len2;\n      x02 *= len2;\n      x12 *= len2;\n      x2 *= len2;\n    }\n    y02 = z1 * x2 - z2 * x12;\n    y12 = z2 * x02 - z02 * x2;\n    y2 = z02 * x12 - z1 * x02;\n    len2 = Math.sqrt(y02 * y02 + y12 * y12 + y2 * y2);\n    if (!len2) {\n      y02 = 0;\n      y12 = 0;\n      y2 = 0;\n    } else {\n      len2 = 1 / len2;\n      y02 *= len2;\n      y12 *= len2;\n      y2 *= len2;\n    }\n    out[0] = x02;\n    out[1] = y02;\n    out[2] = z02;\n    out[3] = 0;\n    out[4] = x12;\n    out[5] = y12;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x02 * eyex + x12 * eyey + x2 * eyez);\n    out[13] = -(y02 * eyex + y12 * eyey + y2 * eyez);\n    out[14] = -(z02 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n    return out;\n  }\n  var mul = multiply$2;\n  function create$6() {\n    var out = new ARRAY_TYPE(3);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    return out;\n  }\n  function clone$4(a2) {\n    var out = new ARRAY_TYPE(3);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    return out;\n  }\n  function length$1(a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z2 = a2[2];\n    return Math.sqrt(x2 * x2 + y2 * y2 + z2 * z2);\n  }\n  function fromValues$3(x2, y2, z2) {\n    var out = new ARRAY_TYPE(3);\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z2;\n    return out;\n  }\n  function copy$6(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    return out;\n  }\n  function set$8(out, x2, y2, z2) {\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z2;\n    return out;\n  }\n  function add$4(out, a2, b2) {\n    out[0] = a2[0] + b2[0];\n    out[1] = a2[1] + b2[1];\n    out[2] = a2[2] + b2[2];\n    return out;\n  }\n  function subtract(out, a2, b2) {\n    out[0] = a2[0] - b2[0];\n    out[1] = a2[1] - b2[1];\n    out[2] = a2[2] - b2[2];\n    return out;\n  }\n  function multiply$1(out, a2, b2) {\n    out[0] = a2[0] * b2[0];\n    out[1] = a2[1] * b2[1];\n    out[2] = a2[2] * b2[2];\n    return out;\n  }\n  function min$3(out, a2, b2) {\n    out[0] = Math.min(a2[0], b2[0]);\n    out[1] = Math.min(a2[1], b2[1]);\n    out[2] = Math.min(a2[2], b2[2]);\n    return out;\n  }\n  function max$3(out, a2, b2) {\n    out[0] = Math.max(a2[0], b2[0]);\n    out[1] = Math.max(a2[1], b2[1]);\n    out[2] = Math.max(a2[2], b2[2]);\n    return out;\n  }\n  function scale$5(out, a2, b2) {\n    out[0] = a2[0] * b2;\n    out[1] = a2[1] * b2;\n    out[2] = a2[2] * b2;\n    return out;\n  }\n  function scaleAndAdd(out, a2, b2, scale2) {\n    out[0] = a2[0] + b2[0] * scale2;\n    out[1] = a2[1] + b2[1] * scale2;\n    out[2] = a2[2] + b2[2] * scale2;\n    return out;\n  }\n  function distance(a2, b2) {\n    var x2 = b2[0] - a2[0];\n    var y2 = b2[1] - a2[1];\n    var z2 = b2[2] - a2[2];\n    return Math.sqrt(x2 * x2 + y2 * y2 + z2 * z2);\n  }\n  function squaredDistance(a2, b2) {\n    var x2 = b2[0] - a2[0];\n    var y2 = b2[1] - a2[1];\n    var z2 = b2[2] - a2[2];\n    return x2 * x2 + y2 * y2 + z2 * z2;\n  }\n  function squaredLength(a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z2 = a2[2];\n    return x2 * x2 + y2 * y2 + z2 * z2;\n  }\n  function negate(out, a2) {\n    out[0] = -a2[0];\n    out[1] = -a2[1];\n    out[2] = -a2[2];\n    return out;\n  }\n  function normalize$5(out, a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z2 = a2[2];\n    var len2 = x2 * x2 + y2 * y2 + z2 * z2;\n    if (len2 > 0) {\n      len2 = 1 / Math.sqrt(len2);\n    }\n    out[0] = a2[0] * len2;\n    out[1] = a2[1] * len2;\n    out[2] = a2[2] * len2;\n    return out;\n  }\n  function dot$1(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];\n  }\n  function cross$1(out, a2, b2) {\n    var ax = a2[0], ay = a2[1], az = a2[2];\n    var bx = b2[0], by = b2[1], bz = b2[2];\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n  }\n  function lerp$1(out, a2, b2, t) {\n    var ax = a2[0];\n    var ay = a2[1];\n    var az = a2[2];\n    out[0] = ax + t * (b2[0] - ax);\n    out[1] = ay + t * (b2[1] - ay);\n    out[2] = az + t * (b2[2] - az);\n    return out;\n  }\n  function transformMat4$2(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z2 = a2[2];\n    var w2 = m2[3] * x2 + m2[7] * y2 + m2[11] * z2 + m2[15];\n    w2 = w2 || 1;\n    out[0] = (m2[0] * x2 + m2[4] * y2 + m2[8] * z2 + m2[12]) / w2;\n    out[1] = (m2[1] * x2 + m2[5] * y2 + m2[9] * z2 + m2[13]) / w2;\n    out[2] = (m2[2] * x2 + m2[6] * y2 + m2[10] * z2 + m2[14]) / w2;\n    return out;\n  }\n  function transformMat3(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z2 = a2[2];\n    out[0] = x2 * m2[0] + y2 * m2[3] + z2 * m2[6];\n    out[1] = x2 * m2[1] + y2 * m2[4] + z2 * m2[7];\n    out[2] = x2 * m2[2] + y2 * m2[5] + z2 * m2[8];\n    return out;\n  }\n  function transformQuat(out, a2, q) {\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3];\n    var vx = a2[0], vy = a2[1], vz = a2[2];\n    var tx2 = qy * vz - qz * vy;\n    var ty2 = qz * vx - qx * vz;\n    var tz = qx * vy - qy * vx;\n    tx2 = tx2 + tx2;\n    ty2 = ty2 + ty2;\n    tz = tz + tz;\n    out[0] = vx + qw * tx2 + qy * tz - qz * ty2;\n    out[1] = vy + qw * ty2 + qz * tx2 - qx * tz;\n    out[2] = vz + qw * tz + qx * ty2 - qy * tx2;\n    return out;\n  }\n  function exactEquals$1(a2, b2) {\n    return a2[0] === b2[0] && a2[1] === b2[1] && a2[2] === b2[2];\n  }\n  function equals$2(a2, b2) {\n    var a0 = a2[0], a1 = a2[1], a22 = a2[2];\n    var b0 = b2[0], b1 = b2[1], b22 = b2[2];\n    return Math.abs(a0 - b0) <= EPSILON$3 * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON$3 * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a22 - b22) <= EPSILON$3 * Math.max(1, Math.abs(a22), Math.abs(b22));\n  }\n  var len = length$1;\n  (function() {\n    var vec2 = create$6();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 3;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        vec2[2] = a2[i + 2];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n        a2[i + 2] = vec2[2];\n      }\n      return a2;\n    };\n  })();\n  function create$5() {\n    var out = new ARRAY_TYPE(4);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n    }\n    return out;\n  }\n  function clone$3(a2) {\n    var out = new ARRAY_TYPE(4);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function fromValues$2(x2, y2, z2, w2) {\n    var out = new ARRAY_TYPE(4);\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z2;\n    out[3] = w2;\n    return out;\n  }\n  function copy$5(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function set$7(out, x2, y2, z2, w2) {\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z2;\n    out[3] = w2;\n    return out;\n  }\n  function normalize$4(out, a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z2 = a2[2];\n    var w2 = a2[3];\n    var len2 = x2 * x2 + y2 * y2 + z2 * z2 + w2 * w2;\n    if (len2 > 0) {\n      len2 = 1 / Math.sqrt(len2);\n    }\n    out[0] = x2 * len2;\n    out[1] = y2 * len2;\n    out[2] = z2 * len2;\n    out[3] = w2 * len2;\n    return out;\n  }\n  function dot(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2] + a2[3] * b2[3];\n  }\n  function transformMat4$1(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z2 = a2[2], w2 = a2[3];\n    out[0] = m2[0] * x2 + m2[4] * y2 + m2[8] * z2 + m2[12] * w2;\n    out[1] = m2[1] * x2 + m2[5] * y2 + m2[9] * z2 + m2[13] * w2;\n    out[2] = m2[2] * x2 + m2[6] * y2 + m2[10] * z2 + m2[14] * w2;\n    out[3] = m2[3] * x2 + m2[7] * y2 + m2[11] * z2 + m2[15] * w2;\n    return out;\n  }\n  function exactEquals(a2, b2) {\n    return a2[0] === b2[0] && a2[1] === b2[1] && a2[2] === b2[2] && a2[3] === b2[3];\n  }\n  (function() {\n    var vec2 = create$5();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 4;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        vec2[2] = a2[i + 2];\n        vec2[3] = a2[i + 3];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n        a2[i + 2] = vec2[2];\n        a2[i + 3] = vec2[3];\n      }\n      return a2;\n    };\n  })();\n  function create$4() {\n    var out = new ARRAY_TYPE(4);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    out[3] = 1;\n    return out;\n  }\n  function setAxisAngle(out, axis, rad) {\n    rad = rad * 0.5;\n    var s2 = Math.sin(rad);\n    out[0] = s2 * axis[0];\n    out[1] = s2 * axis[1];\n    out[2] = s2 * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n  }\n  function multiply(out, a2, b2) {\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = b2[0], by = b2[1], bz = b2[2], bw = b2[3];\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n  }\n  function rotateX(out, a2, rad) {\n    rad *= 0.5;\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n  }\n  function rotateY(out, a2, rad) {\n    rad *= 0.5;\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var by = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n  }\n  function slerp(out, a2, b2, t) {\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = b2[0], by = b2[1], bz = b2[2], bw = b2[3];\n    var omega, cosom, sinom, scale0, scale1;\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    if (cosom < 0) {\n      cosom = -cosom;\n      bx = -bx;\n      by = -by;\n      bz = -bz;\n      bw = -bw;\n    }\n    if (1 - cosom > EPSILON$3) {\n      omega = Math.acos(cosom);\n      sinom = Math.sin(omega);\n      scale0 = Math.sin((1 - t) * omega) / sinom;\n      scale1 = Math.sin(t * omega) / sinom;\n    } else {\n      scale0 = 1 - t;\n      scale1 = t;\n    }\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    return out;\n  }\n  function conjugate(out, a2) {\n    out[0] = -a2[0];\n    out[1] = -a2[1];\n    out[2] = -a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function fromMat3(out, m2) {\n    var fTrace = m2[0] + m2[4] + m2[8];\n    var fRoot;\n    if (fTrace > 0) {\n      fRoot = Math.sqrt(fTrace + 1);\n      out[3] = 0.5 * fRoot;\n      fRoot = 0.5 / fRoot;\n      out[0] = (m2[5] - m2[7]) * fRoot;\n      out[1] = (m2[6] - m2[2]) * fRoot;\n      out[2] = (m2[1] - m2[3]) * fRoot;\n    } else {\n      var i = 0;\n      if (m2[4] > m2[0]) i = 1;\n      if (m2[8] > m2[i * 3 + i]) i = 2;\n      var j = (i + 1) % 3;\n      var k = (i + 2) % 3;\n      fRoot = Math.sqrt(m2[i * 3 + i] - m2[j * 3 + j] - m2[k * 3 + k] + 1);\n      out[i] = 0.5 * fRoot;\n      fRoot = 0.5 / fRoot;\n      out[3] = (m2[j * 3 + k] - m2[k * 3 + j]) * fRoot;\n      out[j] = (m2[j * 3 + i] + m2[i * 3 + j]) * fRoot;\n      out[k] = (m2[k * 3 + i] + m2[i * 3 + k]) * fRoot;\n    }\n    return out;\n  }\n  var clone$2 = clone$3;\n  var fromValues$1 = fromValues$2;\n  var copy$4 = copy$5;\n  var set$6 = set$7;\n  var normalize$3 = normalize$4;\n  function equals$1(a2, b2) {\n    return Math.abs(dot(a2, b2)) >= 1 - EPSILON$3;\n  }\n  var rotationTo = (function() {\n    var tmpvec3 = create$6();\n    var xUnitVec3 = fromValues$3(1, 0, 0);\n    var yUnitVec3 = fromValues$3(0, 1, 0);\n    return function(out, a2, b2) {\n      var dot2 = dot$1(a2, b2);\n      if (dot2 < -0.999999) {\n        cross$1(tmpvec3, xUnitVec3, a2);\n        if (len(tmpvec3) < 1e-6) cross$1(tmpvec3, yUnitVec3, a2);\n        normalize$5(tmpvec3, tmpvec3);\n        setAxisAngle(out, tmpvec3, Math.PI);\n        return out;\n      } else if (dot2 > 0.999999) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 1;\n        return out;\n      } else {\n        cross$1(tmpvec3, a2, b2);\n        out[0] = tmpvec3[0];\n        out[1] = tmpvec3[1];\n        out[2] = tmpvec3[2];\n        out[3] = 1 + dot2;\n        return normalize$3(out, out);\n      }\n    };\n  })();\n  (function() {\n    var temp1 = create$4();\n    var temp2 = create$4();\n    return function(out, a2, b2, c2, d2, t) {\n      slerp(temp1, a2, d2, t);\n      slerp(temp2, b2, c2, t);\n      slerp(out, temp1, temp2, 2 * t * (1 - t));\n      return out;\n    };\n  })();\n  (function() {\n    var matr = create$8();\n    return function(out, view, right, up) {\n      matr[0] = right[0];\n      matr[3] = right[1];\n      matr[6] = right[2];\n      matr[1] = up[0];\n      matr[4] = up[1];\n      matr[7] = up[2];\n      matr[2] = -view[0];\n      matr[5] = -view[1];\n      matr[8] = -view[2];\n      return normalize$3(out, fromMat3(out, matr));\n    };\n  })();\n  function create$3() {\n    var out = new ARRAY_TYPE(2);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n    }\n    return out;\n  }\n  function clone$1(a2) {\n    var out = new ARRAY_TYPE(2);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    return out;\n  }\n  function fromValues(x2, y2) {\n    var out = new ARRAY_TYPE(2);\n    out[0] = x2;\n    out[1] = y2;\n    return out;\n  }\n  function copy$3(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    return out;\n  }\n  function set$5(out, x2, y2) {\n    out[0] = x2;\n    out[1] = y2;\n    return out;\n  }\n  function transformMat4(out, a2, m2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    out[0] = m2[0] * x2 + m2[4] * y2 + m2[12];\n    out[1] = m2[1] * x2 + m2[5] * y2 + m2[13];\n    return out;\n  }\n  function equals(a2, b2) {\n    var a0 = a2[0], a1 = a2[1];\n    var b0 = b2[0], b1 = b2[1];\n    return Math.abs(a0 - b0) <= EPSILON$3 * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON$3 * Math.max(1, Math.abs(a1), Math.abs(b1));\n  }\n  (function() {\n    var vec2 = create$3();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 2;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n      }\n      return a2;\n    };\n  })();\n  let Constants$1 = class Constants {\n  };\n  Constants$1.TWO_PI = 6.283185307179586;\n  Constants$1.PI = 3.141592653589793;\n  Constants$1.PI_OVER_TWO = 1.5707963267948966;\n  Constants$1.PI_OVER_THREE = 1.0471975511965976;\n  Constants$1.PI_OVER_FOUR = 0.7853981633974483;\n  Constants$1.PI_OVER_SIX = 0.5235987755982988;\n  Constants$1.LOG_2 = 0.6931471805599453;\n  Constants$1.RADIANS_PER_DEGREE = 0.017453292519943295;\n  Constants$1.DEGREES_PER_RADIAN = 57.29577951308232;\n  Constants$1.ROOT_TWO = 1.4142135623730951;\n  Constants$1.ROOT_TWO_OVER_TWO = 0.7071067811865476;\n  Constants$1.ROOT_THREE = 1.7320508075688772;\n  Constants$1.ROOT_THREE_OVER_TWO = 0.8660254037844386;\n  Constants$1.ROOT_THREE_OVER_THREE = 0.5773502691896257;\n  Constants$1.VECTOR2_ZERO = fromValues(0, 0);\n  Constants$1.VECTOR2_ONE = fromValues(1, 1);\n  Constants$1.VECTOR2_UNITX = fromValues(1, 0);\n  Constants$1.VECTOR2_UNITY = fromValues(0, 1);\n  Constants$1.VECTOR3_ZERO = fromValues$3(0, 0, 0);\n  Constants$1.VECTOR3_ONE = fromValues$3(1, 1, 1);\n  Constants$1.VECTOR3_UNITX = fromValues$3(1, 0, 0);\n  Constants$1.VECTOR3_UNITY = fromValues$3(0, 1, 0);\n  Constants$1.VECTOR3_UNITZ = fromValues$3(0, 0, 1);\n  Constants$1.VECTOR3_REFLECTX = fromValues$3(1, -1, -1);\n  Constants$1.VECTOR3_REFLECTY = fromValues$3(-1, 1, -1);\n  Constants$1.VECTOR3_REFLECTZ = fromValues$3(-1, -1, 1);\n  Constants$1.VECTOR4_ZERO = fromValues$2(0, 0, 0, 0);\n  Constants$1.VECTOR4_ONE = fromValues$2(1, 1, 1, 1);\n  Constants$1.VECTOR4_UNITX = fromValues$2(1, 0, 0, 0);\n  Constants$1.VECTOR4_UNITY = fromValues$2(0, 1, 0, 0);\n  Constants$1.VECTOR4_UNITZ = fromValues$2(0, 0, 1, 0);\n  Constants$1.VECTOR4_UNITW = fromValues$2(0, 0, 0, 1);\n  Constants$1.MAT3_IDENTITY = create$8();\n  Constants$1.MAT4_IDENTITY = create$7();\n  Constants$1.MAT4_ROTATION_MINUS_90 = fromValues$4(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  Constants$1.QUAT_IDENTITY = create$4();\n  Constants$1.QUAT_ROTATEX_PLUS_90 = fromValues$1(Constants$1.ROOT_TWO_OVER_TWO, 0, 0, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEX_MINUS_90 = fromValues$1(-Constants$1.ROOT_TWO_OVER_TWO, 0, 0, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEY_PLUS_90 = fromValues$1(0, Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEY_MINUS_90 = fromValues$1(0, -Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEZ_PLUS_90 = fromValues$1(0, 0, Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.QUAT_ROTATEZ_MINUS_90 = fromValues$1(0, 0, -Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO);\n  Constants$1.MILLISECONDS_PER_DAY = 864e5;\n  class MathHelper {\n    static simpleLinearRegression(points2) {\n      const n = points2.length;\n      let sumX = 0;\n      let sumY = 0;\n      let sumXY = 0;\n      let sumXX = 0;\n      for (let i = 0; i < n; i++) {\n        sumX += points2[i].x;\n        sumY += points2[i].y;\n        sumXY += points2[i].x * points2[i].y;\n        sumXX += points2[i].x * points2[i].x;\n      }\n      const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n      const yIntercept = (sumY - slope * sumX) / n;\n      return { slope, yIntercept };\n    }\n    static clamp(value2, min2, max2) {\n      return Math.max(Math.min(value2, max2), min2);\n    }\n    static lerp(value1, value2, amount) {\n      return value1 + (value2 - value1) * amount;\n    }\n    static normalize(value2, min2, max2, from = 0, to = 1) {\n      return max2 - min2 == 0 ? 0 : Math.max(Math.min((to - from) * (value2 - min2) / (max2 - min2) + from, to), from);\n    }\n    static splitExponent(value2, result) {\n      let exponent2 = Math.round(Math.log10(Math.abs(value2)));\n      let coefficient = value2 / Math.pow(10, exponent2);\n      if (coefficient < 1) {\n        coefficient *= 10;\n        exponent2--;\n      }\n      result[0] = coefficient;\n      result[1] = exponent2;\n    }\n    static combineExponent(mantissa, exponent2) {\n      return mantissa * Math.pow(10, exponent2);\n    }\n    static isPowerOf2(value2) {\n      return (value2 & value2 - 1) == 0;\n    }\n  }\n  class PseudoRandom {\n    constructor(seed) {\n      this._seed = seed % 2147483647;\n      if (this._seed <= 0)\n        this._seed += 2147483646;\n    }\n    next() {\n      return this._seed = this._seed * 16807 % 2147483647;\n    }\n    nextFloat() {\n      return (this.next() - 1) / 2147483646;\n    }\n    nextInteger(min2, max2) {\n      return Math.floor(this.nextFloat() * (max2 - min2 + 1) + min2);\n    }\n  }\n  class AngleHelper {\n    static degreesToRadians(degrees2) {\n      return degrees2 * Constants$1.RADIANS_PER_DEGREE;\n    }\n    static radiansToDegrees(radians2) {\n      return radians2 * Constants$1.DEGREES_PER_RADIAN;\n    }\n    static wrapAngle(angle2) {\n      if (angle2 > Constants$1.PI)\n        angle2 = angle2 - Constants$1.TWO_PI;\n      else if (angle2 < -Constants$1.PI)\n        angle2 += Constants$1.TWO_PI;\n      return angle2;\n    }\n    static sphericalToCartesian(altitude, longitude2, latitude, result) {\n      latitude = AngleHelper.degreesToRadians(latitude);\n      longitude2 = AngleHelper.degreesToRadians(longitude2);\n      const scale2 = Math.cos(latitude);\n      result[0] = altitude * scale2 * Math.sin(longitude2);\n      result[1] = altitude * Math.sin(latitude);\n      result[2] = altitude * scale2 * Math.cos(longitude2);\n    }\n    static cartesianToSpherical(x2, y2, z2, result) {\n      result[0] = Math.atan2(x2, z2);\n      result[1] = Math.asin(y2);\n    }\n    static angleBetweenVectors(from, to) {\n      if (exactEquals$1(from, to)) {\n        return 0;\n      } else {\n        const dot2 = MathHelper.clamp(dot$1(from, to), -1, 1);\n        return Math.acos(dot2);\n      }\n    }\n    static signedAngleBetweenVectors(from, to, up) {\n      if (exactEquals$1(from, to)) {\n        return 0;\n      } else {\n        const dot2 = MathHelper.clamp(dot$1(from, to), -1, 1);\n        let angle2 = Math.acos(dot2);\n        cross$1(AngleHelper._vec3, from, to);\n        if (dot$1(AngleHelper._vec3, up) < 0) {\n          angle2 = -angle2;\n        }\n        return angle2;\n      }\n    }\n  }\n  AngleHelper._vec3 = create$6();\n  class CameraBase {\n    getView(view) {\n      this.getPosition(view.position);\n    }\n    setView(view, isSmooth) {\n      this.setPosition(view.position, isSmooth);\n    }\n    lerpView(from, to, time2) {\n      lerp$1(this._vec3, from.position, to.position, time2);\n      this.setPosition(this._vec3, false);\n    }\n    get vMatrices() {\n      return this._vMatrices;\n    }\n    get inverseVMatrices() {\n      return this._inverseVMatrices;\n    }\n    get mvMatrices() {\n      return this._mvMatrices;\n    }\n    get pMatrices() {\n      return this._pMatrices;\n    }\n    get inversePMatrices() {\n      return this._inversePMatrices;\n    }\n    get pickVMatrix() {\n      return this._pickVMatrix;\n    }\n    get rMatrix() {\n      return this._mat3;\n    }\n    getOrbit(value2) {\n      copy$4(value2, this._orbitRotation);\n    }\n    setOrbit(value2, isSmooth) {\n      copy$4(this._orbitRotation, value2);\n      if (!isSmooth) {\n        copy$4(this._smoothedOrbitRotation, value2);\n      }\n    }\n    getPosition(value2) {\n      copy$6(value2, this._cameraPosition);\n    }\n    setPosition(value2, isSmooth) {\n      copy$6(this._cameraPosition, value2);\n      if (!isSmooth) {\n        copy$6(this._smoothedCameraPosition, value2);\n      }\n    }\n    constructor(core) {\n      this._core = core;\n      this._vec3 = create$6();\n      this._quat = create$4();\n      this._mat3 = create$8();\n      this._right = create$6();\n      this._up = create$6();\n      this._forward = create$6();\n      this._modelManipulationOrigin = create$6();\n      this.modelPosition = create$6();\n      this.modelScale = create$6();\n      this.modelRotation = create$4();\n      this._orbitRotation = create$4();\n      this._orbitDirection = create$4();\n      this._smoothedOrbitRotation = create$4();\n      this._smoothedCameraPosition = create$6();\n      this._smoothedCameraRotation = create$4();\n      this._cameraPosition = create$6();\n      this._cameraRotation = create$4();\n      this._combinedPosition = create$6();\n      this._combinedRotation = create$4();\n      this._leftToRightEye = create$6();\n      this._pickVMatrix = create$7();\n      this._eyePositions = [create$6(), create$6()];\n      this._vMatrices = [create$7(), create$7()];\n      this._mvMatrices = [create$7(), create$7()];\n      this._pMatrices = [create$7(), create$7()];\n      this._inverseVMatrices = [create$7(), create$7()];\n      this._inversePMatrices = [create$7(), create$7()];\n    }\n    reset(isSmooth) {\n      copy$6(this._cameraPosition, Constants$1.VECTOR3_ZERO);\n      copy$4(this._cameraRotation, Constants$1.QUAT_IDENTITY);\n      copy$4(this._orbitRotation, Constants$1.QUAT_IDENTITY);\n      if (!isSmooth) {\n        this.syncSmooth();\n      }\n    }\n    update(elapsedTime) {\n      let amount = Math.min(elapsedTime * this._core.config.positionSmoothing, 1);\n      lerp$1(this._smoothedCameraPosition, this._smoothedCameraPosition, this._cameraPosition, amount);\n      amount = Math.min(elapsedTime * this._core.config.rotationSmoothing, 1);\n      slerp(this._smoothedCameraRotation, this._smoothedCameraRotation, this._cameraRotation, amount);\n      slerp(this._smoothedOrbitRotation, this._smoothedOrbitRotation, this._orbitRotation, amount);\n      const epsilon3 = 1e-6;\n      let x2;\n      let y2;\n      let z2;\n      let w2;\n      x2 = this._smoothedCameraPosition[0] - this._cameraPosition[0];\n      y2 = this._smoothedCameraPosition[1] - this._cameraPosition[1];\n      z2 = this._smoothedCameraPosition[2] - this._cameraPosition[2];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z2) < epsilon3) {\n        copy$6(this._smoothedCameraPosition, this._cameraPosition);\n      }\n      x2 = this._smoothedCameraRotation[0] - this._cameraRotation[0];\n      y2 = this._smoothedCameraRotation[1] - this._cameraRotation[1];\n      z2 = this._smoothedCameraRotation[2] - this._cameraRotation[2];\n      w2 = this._smoothedCameraRotation[3] - this._cameraRotation[3];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z2) < epsilon3 && Math.abs(w2) < epsilon3) {\n        copy$4(this._smoothedCameraRotation, this._cameraRotation);\n      }\n      x2 = this._smoothedOrbitRotation[0] - this._orbitRotation[0];\n      y2 = this._smoothedOrbitRotation[1] - this._orbitRotation[1];\n      z2 = this._smoothedOrbitRotation[2] - this._orbitRotation[2];\n      w2 = this._smoothedOrbitRotation[3] - this._orbitRotation[3];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z2) < epsilon3 && Math.abs(w2) < epsilon3) {\n        copy$4(this._smoothedOrbitRotation, this._orbitRotation);\n      }\n      normalize$3(this._smoothedCameraRotation, this._smoothedCameraRotation);\n      normalize$3(this._smoothedOrbitRotation, this._smoothedOrbitRotation);\n      conjugate(this._orbitDirection, this._smoothedOrbitRotation);\n      transformMat4$2(this._modelManipulationOrigin, this.modelManipulationOrigin, this.modelMMatrix);\n      subtract(this._vec3, this._smoothedCameraPosition, this._modelManipulationOrigin);\n      transformQuat(this._combinedPosition, this._vec3, this._orbitDirection);\n      add$4(this._combinedPosition, this._combinedPosition, this._modelManipulationOrigin);\n      multiply(this._combinedRotation, this._orbitDirection, this._smoothedCameraRotation);\n      fromQuat$1(this._mat3, this._combinedRotation);\n      this._right[0] = this._mat3[0];\n      this._right[1] = this._mat3[1];\n      this._right[2] = this._mat3[2];\n      this._up[0] = this._mat3[3];\n      this._up[1] = this._mat3[4];\n      this._up[2] = this._mat3[5];\n      this._forward[0] = this._mat3[6];\n      this._forward[1] = this._mat3[7];\n      this._forward[2] = this._mat3[8];\n      const view = this._vMatrices[0];\n      view[0] = this._right[0];\n      view[1] = this._up[0];\n      view[2] = this._forward[0];\n      view[4] = this._right[1];\n      view[5] = this._up[1];\n      view[6] = this._forward[1];\n      view[8] = this._right[2];\n      view[9] = this._up[2];\n      view[10] = this._forward[2];\n      view[12] = -dot$1(this._right, this._combinedPosition);\n      view[13] = -dot$1(this._up, this._combinedPosition);\n      view[14] = -dot$1(this._forward, this._combinedPosition);\n      const aspectRatio = this.width / this.height;\n      if (this._core.config.stereoMode == StereoMode.none) {\n        if (this._core.config.tilesX != 1 || this._core.config.tilesY != 1) {\n          const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n          const bottom = -top;\n          const left = -aspectRatio * top;\n          const right = aspectRatio * top;\n          const width2 = right - left;\n          const height2 = top - bottom;\n          const tileWidth = width2 / this._core.config.tilesX;\n          const tileHeight = height2 / this._core.config.tilesY;\n          frustum(this._pMatrices[0], left + this._core.config.tileOffsetX * tileWidth, left + (this._core.config.tileOffsetX + 1) * tileWidth, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY - 1) * tileHeight, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY) * tileHeight, this._core.config.nearPlane, this._core.config.farPlane);\n        } else {\n          perspective(this.pMatrices[0], this._core.config.fov, aspectRatio, this._core.config.nearPlane, this._core.config.farPlane);\n        }\n        multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n        invert$1(this._inverseVMatrices[0], this.vMatrices[0]);\n        invert$1(this._inversePMatrices[0], this.pMatrices[0]);\n      } else {\n        cross$1(this._leftToRightEye, this._forward, this._up);\n        normalize$5(this._leftToRightEye, this._leftToRightEye);\n        scaleAndAdd(this._eyePositions[0], this._combinedPosition, this._leftToRightEye, -this._core.config.ipd);\n        scaleAndAdd(this._eyePositions[1], this._combinedPosition, this._leftToRightEye, this._core.config.ipd);\n        this._vMatrices[0][12] += this._core.config.ipd * 0.5;\n        copy$7(this._vMatrices[1], this._vMatrices[0]);\n        this._vMatrices[1][12] -= this._core.config.ipd;\n        const frustumShift = this._core.config.ipd * 0.5 * this._core.config.nearPlane / this._core.config.screenDistance;\n        const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n        const bottom = -top;\n        let left = -aspectRatio * top + frustumShift;\n        let right = aspectRatio * top + frustumShift;\n        frustum(this._pMatrices[0], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n        left = -aspectRatio * top - frustumShift;\n        right = aspectRatio * top - frustumShift;\n        frustum(this._pMatrices[1], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n        multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n        multiply$2(this._mvMatrices[1], this._vMatrices[1], this.modelMMatrix);\n        invert$1(this._inverseVMatrices[0], this._vMatrices[0]);\n        invert$1(this._inversePMatrices[0], this._pMatrices[0]);\n        copy$7(this._inverseVMatrices[1], this._inverseVMatrices[0]);\n        this._inverseVMatrices[1][12] += this._core.config.ipd;\n        invert$1(this._inversePMatrices[1], this._pMatrices[1]);\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`cam off ${this._cameraPosition[0] < 0 ? \"\" : \" \"}${this._cameraPosition[0].toFixed(3)},${this._cameraPosition[1] < 0 ? \"\" : \" \"}${this._cameraPosition[1].toFixed(3)},${this._cameraPosition[2] < 0 ? \"\" : \" \"}${this._cameraPosition[2].toFixed(3)}`);\n        this._core.debugText.addLine(`cam pos ${this._combinedPosition[0] < 0 ? \"\" : \" \"}${this._combinedPosition[0].toFixed(3)},${this._combinedPosition[1] < 0 ? \"\" : \" \"}${this._combinedPosition[1].toFixed(3)},${this._combinedPosition[2] < 0 ? \"\" : \" \"}${this._combinedPosition[2].toFixed(3)}`);\n        this._core.debugText.addLine(`cam rot ${this._combinedRotation[0] < 0 ? \"\" : \" \"}${this._combinedRotation[0].toFixed(3)},${this._combinedRotation[1] < 0 ? \"\" : \" \"}${this._combinedRotation[1].toFixed(3)},${this._combinedRotation[2] < 0 ? \"\" : \" \"}${this._combinedRotation[2].toFixed(3)},${this._combinedRotation[3] < 0 ? \"\" : \" \"}${this._combinedRotation[3].toFixed(3)}`);\n      }\n    }\n    _zoom(direction, distance2) {\n      scaleAndAdd(this._cameraPosition, this._cameraPosition, direction, distance2);\n    }\n    rotate(translationDelta) {\n    }\n    zoom(zoomDelta, x2, y2) {\n      this.unproject(this._vec3, x2, y2, 1);\n      normalize$5(this._vec3, this._vec3);\n      const distance$1 = zoomDelta * distance(this._combinedPosition, this.modelPosition);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      this._zoom(this._vec3, distance$1);\n    }\n    _twist(axis, angle2) {\n    }\n    twist(angle2, x2, y2) {\n    }\n    updatePickVMatrix(x2, y2) {\n      this.unproject(this._vec3, x2, y2, 1);\n      lookAt(this._pickVMatrix, this._combinedPosition, this._vec3, this._up);\n    }\n    syncSmooth() {\n      copy$6(this._smoothedCameraPosition, this._cameraPosition);\n      copy$4(this._smoothedCameraRotation, this._cameraRotation);\n      copy$4(this._smoothedOrbitRotation, this._orbitRotation);\n    }\n    updateModelManipulationOrigin(from, to) {\n      const a2 = create$6();\n      const b2 = create$6();\n      const c2 = create$6();\n      const d2 = create$6();\n      transformMat4$2(a2, from, this.modelMMatrix);\n      transformMat4$2(b2, to, this.modelMMatrix);\n      subtract(a2, this._cameraPosition, a2);\n      subtract(b2, this._cameraPosition, b2);\n      transformQuat(c2, a2, this._orbitDirection);\n      transformQuat(d2, b2, this._orbitDirection);\n      subtract(c2, c2, a2);\n      subtract(d2, d2, b2);\n      subtract(this._vec3, c2, d2);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      add$4(this._cameraPosition, this._cameraPosition, this._vec3);\n      add$4(this._smoothedCameraPosition, this._smoothedCameraPosition, this._vec3);\n    }\n    unproject(position2, x2, y2, z2) {\n      set$8(position2, 2 * x2 / this.width - 1, 1 - 2 * y2 / this.height, z2);\n      transformMat4$2(position2, position2, this._inversePMatrices[0]);\n      transformMat4$2(position2, position2, this._inverseVMatrices[0]);\n    }\n    translate(translationDelta) {\n      const distance$1 = distance(this.modelPosition, this._combinedPosition);\n      const height2 = 2 * Math.tan(this._core.config.fov / 2) * distance$1 / this.height;\n      set$8(this._vec3, height2 * translationDelta[0], -height2 * translationDelta[1], 0);\n      transformQuat(this._vec3, this._vec3, this._combinedRotation);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      subtract(this._cameraPosition, this._cameraPosition, this._vec3);\n    }\n  }\n  class AltAzimuthCamera extends CameraBase {\n    getView(view) {\n      super.getView(view);\n      view.altitude = this.altitude;\n      view.azimuth = this.azimuth;\n      view.fov = this._core.config.fov;\n    }\n    setView(view, isSmooth) {\n      super.setView(view, isSmooth);\n      this.setAltAzimuth(view.altitude, view.azimuth, isSmooth);\n      this._core.config.fov = view.fov;\n    }\n    lerpView(from, to, time2) {\n      super.lerpView(from, to, time2);\n      this.setAltAzimuth(MathHelper.lerp(from.altitude, to.altitude, time2), MathHelper.lerp(from.azimuth, to.azimuth, time2), false);\n      this._core.config.fov = MathHelper.lerp(from.fov, to.fov, time2);\n    }\n    update(elapsedTime) {\n      super.update(elapsedTime);\n      if (this._core.config.isDebugVisible) {\n        const altitude = AngleHelper.radiansToDegrees(this.altitude);\n        const azimuth = AngleHelper.radiansToDegrees(this.azimuth);\n        this._core.debugText.addLine(`cam alt ${altitude < 0 ? \"\" : \" \"}${altitude.toFixed(1)}`);\n        this._core.debugText.addLine(`cam azi ${azimuth < 0 ? \"\" : \" \"}${azimuth.toFixed(1)}`);\n      }\n    }\n    get altitude() {\n      transformQuat(this._up, Constants$1.VECTOR3_UNITY, this._combinedRotation);\n      transformQuat(this._right, Constants$1.VECTOR3_UNITX, this._combinedRotation);\n      return -AngleHelper.signedAngleBetweenVectors(Constants$1.VECTOR3_UNITY, this._up, this._right);\n    }\n    get azimuth() {\n      transformQuat(this._up, Constants$1.VECTOR3_UNITY, this._combinedRotation);\n      transformQuat(this._right, Constants$1.VECTOR3_UNITX, this._combinedRotation);\n      return -AngleHelper.signedAngleBetweenVectors(Constants$1.VECTOR3_UNITX, this._right, this._up);\n    }\n    setAltAzimuth(altitude, azimuth, isSmooth) {\n      setAxisAngle(this._quat, Constants$1.VECTOR3_UNITX, altitude);\n      multiply(this._orbitRotation, this._quat, Constants$1.QUAT_IDENTITY);\n      setAxisAngle(this._quat, Constants$1.VECTOR3_UNITY, azimuth);\n      multiply(this._orbitRotation, this._orbitRotation, this._quat);\n      if (!isSmooth) {\n        this.syncSmooth();\n      }\n    }\n    rotate(translationDelta) {\n      const length2 = Math.min(this.width, this.height);\n      let angle2 = translationDelta[1] * Constants$1.PI / length2;\n      setAxisAngle(this._quat, Constants$1.VECTOR3_UNITX, angle2);\n      multiply(this._orbitRotation, this._quat, this._orbitRotation);\n      angle2 = translationDelta[0] * Constants$1.PI / length2;\n      setAxisAngle(this._quat, Constants$1.VECTOR3_UNITY, angle2);\n      multiply(this._orbitRotation, this._orbitRotation, this._quat);\n    }\n  }\n  let Config$2 = class Config {\n    constructor(core) {\n      this.reset();\n    }\n    reset() {\n      this.isDebugVisible = false;\n      this.logLevel = LogLevel.warn;\n      this.shaderPath = \"shaders\";\n      this.fontPath = \"fonts\";\n      this.modelDistance = 0.5;\n      this.modelSize = 0.25;\n      this.stereoMode = StereoMode.none;\n      this.ipd = 0.06;\n      this.screenDistance = 0.5;\n      this.fov = AngleHelper.degreesToRadians(30);\n      this.nearPlane = 0.01;\n      this.farPlane = 100;\n      this.pickWidth = 512;\n      this.pickHeight = 512;\n      this.pickHoldDelay = 1e3;\n      this.pickSelectDelay = 100;\n      this.resizeMinimumDelay = 250;\n      this.rotationSmoothing = 0.02;\n      this.positionSmoothing = 0.02;\n      this.focusSmoothing = 0.01;\n      this.scaleSmoothing = 0.02;\n      this.mouseWheelZoomScale = -2e-3;\n      this.mouseWheelRotationScale = -2e-3;\n      this.dragToleranceSquared = 100;\n      this.manipulatorMinRelativeDistanceSquared = 100;\n      this.isMultiTouchEnabled = true;\n      this.isMultiTouchZoomEnabled = true;\n      this.isMultiTouchTwistEnabled = true;\n      this.isMultiTouchRotateEnabled = true;\n      this.isMultiTouchTranslateEnabled = true;\n      this.multiTouchZoomScale = 1;\n      this.cameraMinDistance = 0.1;\n      this.cameraMaxDistance = 10;\n      this.xrControllerRayColor = fromValues$3(0.5, 0.5, 0.5);\n      this.xrControllerProfile = \"windows-mixed-reality\";\n      this.xrControllerHandedness = \"right\";\n      this.paletteColor = new Uint8Array([128, 128, 128, 0]);\n      this.textColor = create$6();\n      this.textHoverColor = create$6();\n      this.textBorderColor = create$6();\n      this.textBorderWidth = 24 / 255;\n      this.identityRotation = Constants$1.VECTOR3_UNITY;\n      this.axesTextLabelMaxGlyphs = 32;\n      this.axesTextColor = create$6();\n      this.axesTextBorderColor = create$6();\n      this.axesTextHoverColor = create$6();\n      this.axesTextLabelMajorSize = 0.03;\n      this.axesTextLabelMinorSize = 0.02;\n      this.axesTextTitleMaxGlyphs = 127;\n      this.axesTextTitleSize = 0.05;\n      this.axesTextHeadingMaxGlyphs = 128;\n      this.axesTextHeadingSize = 0.075;\n      this.axesTextTitleLineHeight = 1.5;\n      this.axesTextHeadingLineHeight = 1.5;\n      this.axesTextLabelLineHeight = 1.5;\n      this.axesGridMajorThickness = 2e-4;\n      this.axesGridMinorThickness = 1e-4;\n      this.axesGridZeroThickness = 2e-3;\n      this.axesGridPickDivisionHeight = 0.025;\n      this.axesGridBackgroundColor = create$6();\n      this.axesGridHighlightColor = create$6();\n      this.axesGridMinorColor = create$6();\n      this.axesGridMajorColor = create$6();\n      this.axesGridZeroColor = create$6();\n      this.axesGridDefaultDivisions = 10;\n      this.keyTitleMaxGlyphs = 64;\n      this.keyLabelMaxGlyphs = 64;\n      this.selectionColor = create$6();\n      this.hoverColor = create$6();\n      this.activeColor = create$6();\n      this.highlightMode = HighlightMode.color;\n      this.lassoThickness = 4;\n      this.lassoDashWidth = 2;\n      this.lassoColor = create$6();\n      this.minCubifiedTreeMapSlice = 0.01;\n      this.sdfBuffer = 192;\n      this.sdfBorder = 0;\n      this.forceDirectIsEnabled = false;\n      this.forceDirectAttraction = 1;\n      this.forceDirectRepulsion = 1;\n      this.forceDirectGravity = 1;\n      this.forceDirectInterval = 0.1;\n      this.forceDirectMaxDistance = 0.1;\n      this.forceDirectTheta = 1;\n      this.forceDirectIterationsPerLayout = 1;\n      this.forceDirectEdgeWeightPower = 1;\n      this.forceDirectLockX = false;\n      this.forceDirectLockY = false;\n      this.forceDirectLockZ = false;\n      this.transitionDuration = 400;\n      this.transitionStaggering = 100;\n      this.transitionView = true;\n      this.isTransitionPickingEnabled = false;\n      this.backgroundColor = create$5();\n      this.theme = Theme.light;\n      this.ambientColor = create$6();\n      this.renderMode = RenderMode.color;\n      this.tilesX = 1;\n      this.tilesY = 1;\n      this.tileOffsetX = 0;\n      this.tileOffsetY = 0;\n    }\n    get theme() {\n      return this._theme;\n    }\n    set theme(value2) {\n      if (this._theme != value2) {\n        this._theme = value2;\n        switch (value2) {\n          case Theme.dark:\n            set$7(this.backgroundColor, 0, 0, 0, 1);\n            set$8(this.textColor, 0.9, 0.9, 0.9);\n            set$8(this.textHoverColor, 1, 1, 1);\n            set$8(this.textBorderColor, 0, 0, 0);\n            set$8(this.axesTextColor, 0.9, 0.9, 0.9);\n            set$8(this.axesTextBorderColor, 0, 0, 0);\n            set$8(this.axesTextHoverColor, 1, 1, 1);\n            set$8(this.axesGridBackgroundColor, 0.02, 0.02, 0.02);\n            set$8(this.axesGridHighlightColor, 0.04, 0.04, 0.04);\n            set$8(this.axesGridMinorColor, 0.05, 0.05, 0.05);\n            set$8(this.axesGridMajorColor, 0.1, 0.1, 0.1);\n            set$8(this.axesGridZeroColor, 0.05, 0.1, 0.1);\n            set$8(this.selectionColor, 1, 1, 0);\n            set$8(this.hoverColor, 1, 0, 1);\n            set$8(this.activeColor, 0, 1, 1);\n            set$8(this.lassoColor, 0.9, 0.9, 0.9);\n            break;\n          case Theme.light:\n            set$7(this.backgroundColor, 1, 1, 1, 1);\n            set$8(this.textColor, 0, 0, 0);\n            set$8(this.textHoverColor, 0.1, 0.1, 0.1);\n            set$8(this.textBorderColor, 1, 1, 1);\n            set$8(this.axesTextColor, 0, 0, 0);\n            set$8(this.axesTextBorderColor, 1, 1, 1);\n            set$8(this.axesTextHoverColor, 0.1, 0.1, 0.1);\n            set$8(this.axesGridBackgroundColor, 1, 1, 1);\n            set$8(this.axesGridHighlightColor, 0.925, 0.925, 0.925);\n            set$8(this.axesGridMinorColor, 0.9, 0.9, 0.9);\n            set$8(this.axesGridMajorColor, 0.8, 0.8, 0.8);\n            set$8(this.axesGridZeroColor, 0.7, 0.9, 0.9);\n            set$8(this.selectionColor, 1, 1, 0);\n            set$8(this.hoverColor, 1, 0, 1);\n            set$8(this.activeColor, 0, 1, 1);\n            set$8(this.lassoColor, 0.1, 0.1, 0.1);\n            break;\n        }\n        if (this.themeChangedCallback) {\n          this.themeChangedCallback(this._theme);\n        }\n      }\n    }\n  };\n  class DebugText {\n    get text() {\n      return this._text;\n    }\n    constructor() {\n      this.clear();\n    }\n    clear() {\n      this._text = \"\";\n    }\n    addLine(value2) {\n      this._text += value2 + \"\\n\";\n    }\n  }\n  class Fps {\n    get frameCounter() {\n      return this._frameCounter;\n    }\n    get totalFrames() {\n      return this._totalFrames;\n    }\n    constructor(core) {\n      this._core = core;\n      this._totalFrames = 0;\n      this.reset();\n    }\n    update(elapsedTime) {\n      this._elapsedTime += elapsedTime;\n      if (this._elapsedTime > 1e3) {\n        this._elapsedTime -= 1e3;\n        this._fps = this._frameCounter;\n        this._frameCounter = 0;\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`fps      ${this._fps}`);\n      }\n    }\n    render() {\n      this._frameCounter++;\n      this._totalFrames++;\n    }\n    reset() {\n      this._fps = 0;\n      this._frameCounter = 0;\n      this._elapsedTime = 0;\n    }\n  }\n  const PaletteType = {\n    sequentialsinglehue: \"sequentialsinglehue\",\n    sequentialmultihue: \"sequentialmultihue\",\n    diverging: \"diverging\",\n    qualitative: \"qualitative\"\n  };\n  class PaletteResources {\n    constructor() {\n      this.palettes = {\n        \"blues\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 251, 255, 222, 235, 247, 198, 219, 239, 158, 202, 225, 107, 174, 214, 66, 146, 198, 33, 113, 181, 8, 81, 156, 8, 48, 107]) },\n        \"greens\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 252, 245, 229, 245, 224, 199, 233, 192, 161, 217, 155, 116, 196, 118, 65, 171, 93, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n        \"greys\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 255, 255, 240, 240, 240, 217, 217, 217, 189, 189, 189, 150, 150, 150, 115, 115, 115, 82, 82, 82, 37, 37, 37, 0, 0, 0]) },\n        \"oranges\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 235, 254, 230, 206, 253, 208, 162, 253, 174, 107, 253, 141, 60, 241, 105, 19, 217, 72, 1, 166, 54, 3, 127, 39, 4]) },\n        \"purples\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([252, 251, 253, 239, 237, 245, 218, 218, 235, 188, 189, 220, 158, 154, 200, 128, 125, 186, 106, 81, 163, 84, 39, 143, 63, 0, 125]) },\n        \"reds\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 240, 254, 224, 210, 252, 187, 161, 252, 146, 114, 251, 106, 74, 239, 59, 44, 203, 24, 29, 165, 15, 21, 103, 0, 13]) },\n        \"viridis\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([72, 37, 117, 65, 68, 135, 53, 96, 141, 42, 120, 142, 33, 145, 141, 34, 168, 132, 67, 191, 113, 122, 209, 81, 188, 223, 39]) },\n        \"inferno\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([23, 12, 59, 66, 10, 104, 107, 23, 110, 147, 38, 103, 187, 55, 85, 221, 81, 58, 243, 119, 26, 252, 165, 10, 246, 214, 69]) },\n        \"magma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([21, 14, 55, 59, 15, 112, 101, 26, 128, 140, 41, 129, 182, 55, 122, 222, 73, 104, 247, 111, 92, 254, 159, 109, 254, 206, 145]) },\n        \"plasma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([66, 3, 157, 106, 0, 168, 144, 13, 164, 177, 42, 144, 203, 71, 121, 225, 100, 98, 242, 131, 76, 252, 166, 54, 252, 206, 37]) },\n        \"bluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 229, 245, 249, 204, 236, 230, 153, 216, 201, 102, 194, 164, 65, 174, 118, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n        \"bluepurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 224, 236, 244, 191, 211, 230, 158, 188, 218, 140, 150, 198, 140, 107, 177, 136, 65, 157, 129, 15, 124, 77, 0, 75]) },\n        \"greenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 240, 224, 243, 219, 204, 235, 197, 168, 221, 181, 123, 204, 196, 78, 179, 211, 43, 140, 190, 8, 104, 172, 8, 64, 129]) },\n        \"orangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 236, 254, 232, 200, 253, 212, 158, 253, 187, 132, 252, 141, 89, 239, 101, 72, 215, 48, 31, 179, 0, 0, 127, 0, 0]) },\n        \"purpleblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 231, 242, 208, 209, 230, 166, 189, 219, 116, 169, 207, 54, 144, 192, 5, 112, 176, 4, 90, 141, 2, 56, 88]) },\n        \"purplebluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 226, 240, 208, 209, 230, 166, 189, 219, 103, 169, 207, 54, 144, 192, 2, 129, 138, 1, 108, 89, 1, 70, 54]) },\n        \"purplered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 244, 249, 231, 225, 239, 212, 185, 218, 201, 148, 199, 223, 101, 176, 231, 41, 138, 206, 18, 86, 152, 0, 67, 103, 0, 31]) },\n        \"redpurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 243, 253, 224, 221, 252, 197, 192, 250, 159, 181, 247, 104, 161, 221, 52, 151, 174, 1, 126, 122, 1, 119, 73, 0, 106]) },\n        \"yellowgreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 247, 252, 185, 217, 240, 163, 173, 221, 142, 120, 198, 121, 65, 171, 93, 35, 132, 67, 0, 104, 55, 0, 69, 41]) },\n        \"yellowgreenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 217, 237, 248, 177, 199, 233, 180, 127, 205, 187, 65, 182, 196, 29, 145, 192, 34, 94, 168, 37, 52, 148, 8, 29, 88]) },\n        \"yelloworangebrown\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 255, 247, 188, 254, 227, 145, 254, 196, 79, 254, 153, 41, 236, 112, 20, 204, 76, 2, 153, 52, 4, 102, 37, 6]) },\n        \"yelloworangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 204, 255, 237, 160, 254, 217, 118, 254, 178, 76, 253, 141, 60, 252, 78, 42, 227, 26, 28, 189, 0, 38, 128, 0, 38]) },\n        \"brownbluegreen\": { type: PaletteType.diverging, colors: new Uint8Array([84, 48, 5, 140, 81, 10, 191, 129, 45, 223, 194, 125, 246, 232, 195, 245, 245, 245, 199, 234, 229, 128, 205, 193, 53, 151, 143, 1, 102, 94, 0, 60, 48]) },\n        \"pinkyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([142, 1, 82, 197, 27, 125, 222, 119, 174, 241, 182, 218, 253, 224, 239, 247, 247, 247, 230, 245, 208, 184, 225, 134, 127, 188, 65, 77, 146, 33, 39, 100, 25]) },\n        \"purplegreen\": { type: PaletteType.diverging, colors: new Uint8Array([64, 0, 75, 118, 42, 131, 153, 112, 171, 194, 165, 207, 231, 212, 232, 247, 247, 247, 217, 240, 211, 166, 219, 160, 90, 174, 97, 27, 120, 55, 0, 68, 27]) },\n        \"purpleorange\": { type: PaletteType.diverging, colors: new Uint8Array([127, 59, 8, 179, 88, 6, 224, 130, 20, 253, 184, 99, 254, 224, 182, 247, 247, 247, 216, 218, 235, 178, 171, 210, 128, 115, 172, 84, 39, 136, 45, 0, 75]) },\n        \"redblue\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 247, 247, 247, 209, 229, 240, 146, 197, 222, 67, 147, 195, 33, 102, 172, 5, 48, 97]) },\n        \"redgrey\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 255, 255, 255, 224, 224, 224, 186, 186, 186, 135, 135, 135, 77, 77, 77, 26, 26, 26]) },\n        \"redyellowblue\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 144, 255, 255, 191, 224, 243, 248, 171, 217, 233, 116, 173, 209, 69, 117, 180, 49, 54, 149]) },\n        \"redyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 217, 239, 139, 166, 217, 106, 102, 189, 99, 26, 152, 80, 0, 104, 55]) },\n        \"spectral\": { type: PaletteType.diverging, colors: new Uint8Array([158, 1, 66, 213, 62, 79, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 230, 245, 152, 171, 221, 164, 102, 194, 165, 50, 136, 189, 94, 79, 162]) },\n        \"accent\": { type: PaletteType.qualitative, colors: new Uint8Array([127, 201, 127, 190, 174, 212, 253, 192, 134, 255, 255, 153, 56, 108, 176, 240, 2, 127, 191, 91, 23, 102, 102, 102]) },\n        \"category10\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 255, 127, 14, 44, 160, 44, 214, 39, 40, 148, 103, 189, 140, 86, 75, 227, 119, 194, 127, 127, 127, 188, 189, 34, 23, 190, 207]) },\n        \"category20\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 174, 199, 232, 255, 127, 14, 255, 187, 120, 44, 160, 44, 152, 223, 138, 214, 39, 40, 255, 152, 150, 148, 103, 189, 197, 176, 213, 140, 86, 75, 196, 156, 148, 227, 119, 194, 247, 182, 210, 127, 127, 127, 199, 199, 199, 188, 189, 34, 219, 219, 141, 23, 190, 207, 158, 218, 229]) },\n        \"dark2\": { type: PaletteType.qualitative, colors: new Uint8Array([27, 158, 119, 217, 95, 2, 117, 112, 179, 231, 41, 138, 102, 166, 30, 230, 171, 2, 166, 118, 29, 102, 102, 102]) },\n        \"paired\": { type: PaletteType.qualitative, colors: new Uint8Array([166, 206, 227, 31, 120, 180, 178, 223, 138, 51, 160, 44, 251, 154, 153, 227, 26, 28, 253, 191, 111, 255, 127, 0, 202, 178, 214, 106, 61, 154, 255, 255, 153, 177, 89, 40]) },\n        \"pastel1\": { type: PaletteType.qualitative, colors: new Uint8Array([251, 180, 174, 179, 205, 227, 204, 235, 197, 222, 203, 228, 254, 217, 166, 255, 255, 204, 229, 216, 189, 253, 218, 236, 242, 242, 242]) },\n        \"pastel2\": { type: PaletteType.qualitative, colors: new Uint8Array([179, 226, 205, 253, 205, 172, 203, 213, 232, 244, 202, 228, 230, 245, 201, 255, 242, 174, 241, 226, 204, 204, 204, 204]) },\n        \"set1\": { type: PaletteType.qualitative, colors: new Uint8Array([228, 26, 28, 55, 126, 184, 77, 175, 74, 152, 78, 163, 255, 127, 0, 255, 255, 51, 166, 86, 40, 247, 129, 191, 153, 153, 153]) },\n        \"set2\": { type: PaletteType.qualitative, colors: new Uint8Array([102, 194, 165, 252, 141, 98, 141, 160, 203, 231, 138, 195, 166, 216, 84, 255, 217, 47, 229, 196, 148, 179, 179, 179]) },\n        \"set3\": { type: PaletteType.qualitative, colors: new Uint8Array([141, 211, 199, 255, 255, 179, 190, 186, 218, 251, 128, 114, 128, 177, 211, 253, 180, 98, 179, 222, 105, 252, 205, 229, 217, 217, 217, 188, 128, 189, 204, 235, 197, 255, 237, 111]) }\n      };\n    }\n  }\n  class PaletteBase {\n    get colors() {\n      return this._colors;\n    }\n    set colors(value2) {\n      if (this._colors != value2) {\n        this._colors = value2;\n        this._changed = true;\n      }\n    }\n    constructor() {\n      this._colors = null;\n    }\n    copyFrom(palette) {\n      if (palette.colors) {\n        this.colors = new Uint8Array(palette.colors);\n      } else {\n        this.colors = null;\n      }\n    }\n    update() {\n    }\n  }\n  let Palette$3 = class Palette extends PaletteBase {\n  };\n  class PositionVertex {\n    static getPosition(buffer, index2, value2) {\n      const offset2 = index2 * PositionVertex.SIZE;\n      set$8(value2, buffer[offset2], buffer[offset2 + 1], buffer[offset2 + 2]);\n    }\n    static setPosition(buffer, index2, value2) {\n      const offset2 = index2 * PositionVertex.SIZE;\n      buffer[offset2] = value2[0];\n      buffer[offset2 + 1] = value2[1];\n      buffer[offset2 + 2] = value2[2];\n    }\n  }\n  PositionVertex.SIZE = 3;\n  PositionVertex.SIZE_BYTES = 12;\n  class PositionColorVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getColor(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      set$8(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255);\n    }\n    static setColor(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n    }\n  }\n  PositionColorVertex.SIZE_BYTES = 16;\n  PositionColorVertex.POSITION_OFFSET_BYTES = 0;\n  PositionColorVertex.COLOR_OFFSET_BYTES = 12;\n  class PositionTextureVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n  }\n  PositionTextureVertex.SIZE_BYTES = 16;\n  PositionTextureVertex.POSITION_OFFSET_BYTES = 0;\n  PositionTextureVertex.TEX_COORD_OFFSET_BYTES = 12;\n  class PositionTexturePickVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$7(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n  }\n  PositionTexturePickVertex.SIZE_BYTES = 20;\n  PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES = 0;\n  PositionTexturePickVertex.POSITION_OFFSET_BYTES = 4;\n  PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES = 16;\n  class PositionNormalTextureVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getNormal(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      set$8(value2, bufferView.getInt8(offset2) / 127, bufferView.getInt8(offset2 + 1) / 127, bufferView.getInt8(offset2 + 2) / 127);\n    }\n    static setNormal(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      bufferView.setInt8(offset2, value2[0] * 127);\n      bufferView.setInt8(offset2 + 1, value2[1] * 127);\n      bufferView.setInt8(offset2 + 2, value2[2] * 127);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n  }\n  PositionNormalTextureVertex.SIZE_BYTES = 20;\n  PositionNormalTextureVertex.POSITION_OFFSET_BYTES = 0;\n  PositionNormalTextureVertex.NORMAL_OFFSET_BYTES = 12;\n  PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES = 16;\n  class PickGridVertex {\n    static getTranslation(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setTranslation(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getNormal(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      set$8(value2, bufferView.getInt8(offset2) / 127, bufferView.getInt8(offset2 + 1) / 127, bufferView.getInt8(offset2 + 2) / 127);\n    }\n    static setNormal(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      bufferView.setInt8(offset2, value2[0] * 127);\n      bufferView.setInt8(offset2 + 1, value2[1] * 127);\n      bufferView.setInt8(offset2 + 2, value2[2] * 127);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$7(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n    static getBounds(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.BOUNDS_OFFSET_BYTES;\n      set$7(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535, bufferView.getUint16(offset2 + 4, true) / 65535, bufferView.getUint16(offset2 + 6, true) / 65535);\n    }\n    static setBounds(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.BOUNDS_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n      bufferView.setUint16(offset2 + 4, value2[2] * 65535, true);\n      bufferView.setUint16(offset2 + 6, value2[3] * 65535, true);\n    }\n  }\n  PickGridVertex.SIZE_BYTES = 32;\n  PickGridVertex.TRANSLATION_OFFSET_BYTES = 0;\n  PickGridVertex.NORMAL_OFFSET_BYTES = 12;\n  PickGridVertex.ID_COLOR_OFFSET_BYTES = 16;\n  PickGridVertex.TEX_COORD_OFFSET_BYTES = 20;\n  PickGridVertex.BOUNDS_OFFSET_BYTES = 24;\n  class UnitVertex {\n    static getIdHover(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.ID_HOVER_OFFSET_BYTES, true);\n    }\n    static setIdHover(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.ID_HOVER_OFFSET_BYTES, value2, true);\n    }\n    static copyIdHover(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ID_HOVER_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ID_HOVER_OFFSET_BYTES, true), true);\n    }\n    static getTranslation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setTranslation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static copyTranslation(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TRANSLATION_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TRANSLATION_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      set$5(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255);\n    }\n    static setColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n    }\n    static copyColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.COLOR_OFFSET_BYTES;\n      toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n      toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n    }\n    static getOrder(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ORDER_OFFSET_BYTES;\n      set$5(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true));\n    }\n    static setOrder(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ORDER_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n    }\n    static copyOrder(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ORDER_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ORDER_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n    }\n    static getScale(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SCALE_OFFSET_BYTES;\n      set$8(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setScale(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SCALE_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static copyScale(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SCALE_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SCALE_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getRotation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ROTATION_OFFSET_BYTES;\n      set$6(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true), bufferView.getFloat32(offset2 + 12, true));\n    }\n    static setRotation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ROTATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n      bufferView.setFloat32(offset2 + 12, value2[3], true);\n    }\n    static copyRotation(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ROTATION_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ROTATION_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n      toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TEXCOORD_OFFSET_BYTES;\n      set$6(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true), bufferView.getFloat32(offset2 + 12, true));\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TEXCOORD_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n      bufferView.setFloat32(offset2 + 12, value2[3], true);\n    }\n    static copyTexCoord(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TEXCOORD_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TEXCOORD_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n      toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$7(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static getSelected(bufferView, index2) {\n      return bufferView.getInt8(UnitVertex.SIZE_BYTES * index2 + this.SELECTED_OFFSET_BYTES) / 127;\n    }\n    static setSelected(bufferView, index2, value2) {\n      bufferView.setInt8(UnitVertex.SIZE_BYTES * index2 + this.SELECTED_OFFSET_BYTES, value2 * 127);\n    }\n    static copySelected(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setInt8(UnitVertex.SIZE_BYTES * toIndex + this.SELECTED_OFFSET_BYTES, fromBufferView.getInt8(UnitVertex.SIZE_BYTES * fromIndex + this.SELECTED_OFFSET_BYTES));\n    }\n    static getRounding(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.ROUNDING_OFFSET_BYTES, true);\n    }\n    static setRounding(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.ROUNDING_OFFSET_BYTES, value2, true);\n    }\n    static copyRounding(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ROUNDING_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ROUNDING_OFFSET_BYTES, true), true);\n    }\n    static getParameter1(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_1_OFFSET_BYTES, true);\n    }\n    static setParameter1(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_1_OFFSET_BYTES, value2, true);\n    }\n    static copyParameter1(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_1_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_1_OFFSET_BYTES, true), true);\n    }\n    static getParameter2(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_2_OFFSET_BYTES, true);\n    }\n    static setParameter2(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_2_OFFSET_BYTES, value2, true);\n    }\n    static copyParameter2(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_2_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_2_OFFSET_BYTES, true), true);\n    }\n    static getMaterial(bufferView, index2) {\n      return bufferView.getUint16(UnitVertex.SIZE_BYTES * index2 + this.MATERIAL_OFFSET_BYTES);\n    }\n    static setMaterial(bufferView, index2, value2) {\n      bufferView.setUint16(UnitVertex.SIZE_BYTES * index2 + this.MATERIAL_OFFSET_BYTES, value2);\n    }\n    static copyMaterial(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint16(UnitVertex.SIZE_BYTES * toIndex + this.MATERIAL_OFFSET_BYTES, fromBufferView.getUint16(UnitVertex.SIZE_BYTES * fromIndex + this.MATERIAL_OFFSET_BYTES, true), true);\n    }\n    static getTexture(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.TEXTURE_OFFSET_BYTES);\n    }\n    static setTexture(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.TEXTURE_OFFSET_BYTES, value2);\n    }\n    static copyTexture(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.TEXTURE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.TEXTURE_OFFSET_BYTES));\n    }\n    static getSdfBuffer(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BUFFER_OFFSET_BYTES);\n    }\n    static setSdfBuffer(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BUFFER_OFFSET_BYTES, value2);\n    }\n    static copySdfBuffer(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BUFFER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BUFFER_OFFSET_BYTES));\n    }\n    static getSdfBorder(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BORDER_OFFSET_BYTES);\n    }\n    static setSdfBorder(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BORDER_OFFSET_BYTES, value2);\n    }\n    static copySdfBorder(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BORDER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BORDER_OFFSET_BYTES));\n    }\n    static getMatId(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.MAT_TYPE_OFFSET_BYTES);\n    }\n    static setMatId(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.MAT_TYPE_OFFSET_BYTES, value2);\n    }\n    static copyMatId(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_TYPE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_TYPE_OFFSET_BYTES));\n    }\n    static getMatColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_COLOR_OFFSET_BYTES;\n      value2[0] = bufferView.getUint16(offset2) / 255;\n      value2[1] = bufferView.getUint16(offset2 + 2) / 255;\n      value2[2] = bufferView.getUint16(offset2 + 4) / 255;\n    }\n    static setMatColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_COLOR_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 255);\n      bufferView.setUint16(offset2 + 2, value2[1] * 255);\n      bufferView.setUint16(offset2 + 4, value2[2] * 255);\n    }\n    static copyMatColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.MAT_COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.MAT_COLOR_OFFSET_BYTES;\n      toBufferView.setUint16(toOffset, fromBufferView.getUint16(fromOffset));\n      toBufferView.setUint16(toOffset + 2, fromBufferView.getUint16(fromOffset + 2));\n      toBufferView.setUint16(toOffset + 4, fromBufferView.getUint16(fromOffset + 4));\n    }\n    static getMatFuzz(bufferView, index2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_FUZZ_OFFSET_BYTES;\n      return bufferView.getUint8(offset2) / 255;\n    }\n    static setMatFuzz(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_FUZZ_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2 * 255);\n    }\n    static copyMatFuzz(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_FUZZ_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_FUZZ_OFFSET_BYTES));\n    }\n    static getMatGloss(bufferView, index2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_GLOSS_OFFSET_BYTES;\n      return bufferView.getUint8(offset2) / 255;\n    }\n    static setMatGloss(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_GLOSS_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2 * 255);\n    }\n    static copyMatGloss(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_GLOSS_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_GLOSS_OFFSET_BYTES));\n    }\n    static getMatDensity(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_DENSITY_OFFSET_BYTES, true);\n    }\n    static setMatDensity(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_DENSITY_OFFSET_BYTES, value2, true);\n    }\n    static copyMatDensity(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_DENSITY_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_DENSITY_OFFSET_BYTES, true), true);\n    }\n    static getMatRefractiveIndex(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true);\n    }\n    static setMatRefractiveIndex(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, value2, true);\n    }\n    static copyMatRefractiveIndex(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true), true);\n    }\n    static getSegColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SEG_COLOR_OFFSET_BYTES;\n      value2[0] = bufferView.getUint8(offset2) / 255;\n      value2[1] = bufferView.getUint8(offset2 + 1) / 255;\n      value2[2] = bufferView.getUint8(offset2 + 2) / 255;\n      value2[3] = bufferView.getUint8(offset2 + 3) / 255;\n    }\n    static setSegColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SEG_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static copySegColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SEG_COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SEG_COLOR_OFFSET_BYTES;\n      toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n      toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n      toBufferView.setUint8(toOffset + 2, fromBufferView.getUint8(fromOffset + 2));\n      toBufferView.setUint8(toOffset + 3, fromBufferView.getUint8(fromOffset + 3));\n    }\n  }\n  UnitVertex.SIZE_BYTES = 120;\n  UnitVertex.ID_HOVER_OFFSET_BYTES = 0;\n  UnitVertex.ID_COLOR_OFFSET_BYTES = 4;\n  UnitVertex.ORDER_OFFSET_BYTES = 8;\n  UnitVertex.STAGGER_ORDER_OFFSET_BYTES = 12;\n  UnitVertex.SELECTED_OFFSET_BYTES = 80;\n  UnitVertex.TRANSLATION_OFFSET_BYTES = 16;\n  UnitVertex.COLOR_OFFSET_BYTES = 28;\n  UnitVertex.MATERIAL_OFFSET_BYTES = 30;\n  UnitVertex.SCALE_OFFSET_BYTES = 32;\n  UnitVertex.ROUNDING_OFFSET_BYTES = 44;\n  UnitVertex.ROTATION_OFFSET_BYTES = 48;\n  UnitVertex.TEXCOORD_OFFSET_BYTES = 64;\n  UnitVertex.TEXTURE_OFFSET_BYTES = 81;\n  UnitVertex.SDF_BUFFER_OFFSET_BYTES = 82;\n  UnitVertex.SDF_BORDER_OFFSET_BYTES = 83;\n  UnitVertex.PARAMETER_1_OFFSET_BYTES = 84;\n  UnitVertex.PARAMETER_2_OFFSET_BYTES = 88;\n  UnitVertex.MAT_TYPE_OFFSET_BYTES = 92;\n  UnitVertex.MAT_COLOR_OFFSET_BYTES = 112;\n  UnitVertex.MAT_FUZZ_OFFSET_BYTES = 96;\n  UnitVertex.MAT_GLOSS_OFFSET_BYTES = 97;\n  UnitVertex.MAT_DENSITY_OFFSET_BYTES = 100;\n  UnitVertex.MAT_REFRACTIVE_INDEX_OFFSET_BYTES = 104;\n  UnitVertex.SEG_COLOR_OFFSET_BYTES = 108;\n  class ObjMesh {\n  }\n  class ObjHelper {\n    constructor(core) {\n      this._core = core;\n    }\n    read(data2) {\n      const start = window.performance.now();\n      const indices = [];\n      const positions2 = [];\n      const normals = [];\n      const texCoords = [];\n      const meshes = [];\n      const indexOffsets = [];\n      const indexCounts = [];\n      const faceLookup = {};\n      const lines = data2.split(\"\\n\");\n      let faceCount = 0;\n      for (let i = 0; i < lines.length; i++) {\n        const parts = lines[i].trim().split(\" \");\n        if (parts.length > 0) {\n          switch (parts[0]) {\n            case \"o\":\n              meshes.push(parts[1]);\n              indexOffsets.push(indices.length);\n              break;\n            case \"v\":\n              positions2.push(parseFloat(parts[1]));\n              positions2.push(parseFloat(parts[2]));\n              positions2.push(parseFloat(parts[3]));\n              break;\n            case \"vt\":\n              texCoords.push(parseFloat(parts[1]));\n              texCoords.push(parseFloat(parts[2]));\n              break;\n            case \"vn\":\n              normals.push(parseFloat(parts[1]));\n              normals.push(parseFloat(parts[2]));\n              normals.push(parseFloat(parts[3]));\n              break;\n            case \"f\":\n              for (let i2 = 0; i2 < parts.length - 1; i2++) {\n                const part = parts[i2 + 1];\n                if (faceLookup[part] == void 0) {\n                  faceLookup[part] = faceCount++;\n                }\n                indices.push(faceLookup[part]);\n              }\n              break;\n          }\n        }\n      }\n      for (let i = 0; i < meshes.length - 1; i++) {\n        indexCounts.push(indexOffsets[i + 1] - indexOffsets[i]);\n      }\n      indexCounts.push(indices.length - indexOffsets[meshes.length - 1]);\n      const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * Object.keys(faceLookup).length);\n      const dataView = new DataView(vertices);\n      let minX = Number.MAX_VALUE;\n      let minY = Number.MAX_VALUE;\n      let minZ2 = Number.MAX_VALUE;\n      let maxX = -Number.MAX_VALUE;\n      let maxY2 = -Number.MAX_VALUE;\n      let maxZ = -Number.MAX_VALUE;\n      const faces = Object.keys(faceLookup);\n      const _vec2 = create$3();\n      const _vec3 = create$6();\n      let hasTexCoords, hasNormals;\n      if (faces.length > 0) {\n        const faceParts = faces[0].split(\"/\");\n        hasTexCoords = faceParts.length > 1 && !isNaN(parseInt(faceParts[1]));\n        hasNormals = faceParts.length > 2 && !isNaN(parseInt(faceParts[2]));\n      }\n      for (let i = 0; i < faces.length; i++) {\n        const faceParts = faces[i].split(\"/\");\n        let index2 = (parseInt(faceParts[0]) - 1) * 3;\n        const x2 = positions2[index2];\n        const y2 = positions2[index2 + 1];\n        const z2 = positions2[index2 + 2];\n        set$8(_vec3, x2, y2, z2);\n        PositionNormalTextureVertex.setPosition(dataView, i, _vec3);\n        minX = Math.min(x2, minX);\n        minY = Math.min(y2, minY);\n        minZ2 = Math.min(z2, minZ2);\n        maxX = Math.max(x2, maxX);\n        maxY2 = Math.max(y2, maxY2);\n        maxZ = Math.max(z2, maxZ);\n        if (hasNormals) {\n          index2 = (parseInt(faceParts[2]) - 1) * 3;\n          set$8(_vec3, normals[index2], normals[index2 + 1], normals[index2 + 2]);\n          PositionNormalTextureVertex.setNormal(dataView, i, _vec3);\n        }\n        if (hasTexCoords) {\n          index2 = (parseInt(faceParts[1]) - 1) * 2;\n          set$5(_vec2, texCoords[index2], texCoords[index2 + 1]);\n          PositionNormalTextureVertex.setTexCoord(dataView, i, _vec2);\n        }\n      }\n      const originX = (minX + maxX) / 2;\n      const originY = (minY + maxY2) / 2;\n      const originZ = (minZ2 + maxZ) / 2;\n      const objMesh = new ObjMesh();\n      objMesh.vertices = vertices;\n      objMesh.indices = new Uint16Array(indices);\n      objMesh.meshes = meshes;\n      objMesh.indexOffsets = indexOffsets;\n      objMesh.indexCounts = indexCounts;\n      objMesh.indexCount = indices.length;\n      objMesh.minX = minX;\n      objMesh.minY = minY;\n      objMesh.minZ = minZ2;\n      objMesh.maxX = maxX;\n      objMesh.maxY = maxY2;\n      objMesh.maxZ = maxZ;\n      objMesh.originX = originX;\n      objMesh.originY = originY;\n      objMesh.originZ = originZ;\n      this._core.log.write(LogLevel.info, `obj loaded ${Math.round(window.performance.now() - start)}ms`);\n      return objMesh;\n    }\n  }\n  class Cube {\n  }\n  Cube.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5\n  ]);\n  Cube.INDICES = new Uint16Array([5, 4, 1, 0, 3, 4, 7, 5, 6, 1, 2, 3, 6, 7]);\n  Cube.CUBE_MAP_INDICES = new Uint16Array([2, 3, 1, 0, 4, 3, 7, 2, 6, 1, 5, 4, 6, 7]);\n  Cube.FACE_NORMALS = [\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, -1, 0),\n    fromValues$3(-1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Cube.FACE_POSITIONS = [\n    fromValues$3(0, 0.5, 0),\n    fromValues$3(0.5, 0, 0),\n    fromValues$3(0, -0.5, 0),\n    fromValues$3(-0.5, 0, 0),\n    fromValues$3(0, 0, 0.5),\n    fromValues$3(0, 0, -0.5)\n  ];\n  Cube.FACE_ROTATIONS = [\n    fromValues$5(1, 0, 0, 0, 0, -1, 0, 1, 0),\n    fromValues$5(0, 0, -1, 0, 1, 0, 1, 0, 0),\n    fromValues$5(1, 0, 0, 0, 0, 1, 0, -1, 0),\n    fromValues$5(0, 0, 1, 0, 1, 0, -1, 0, 0),\n    fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n  ];\n  Cube.EDGE_POSITIONS = [\n    fromValues$3(0, 0.5, 0.5),\n    fromValues$3(0.5, 0.5, 0),\n    fromValues$3(0, 0.5, -0.5),\n    fromValues$3(-0.5, 0.5, 0),\n    fromValues$3(0, -0.5, 0.5),\n    fromValues$3(0.5, -0.5, 0),\n    fromValues$3(0, -0.5, -0.5),\n    fromValues$3(-0.5, -0.5, 0),\n    fromValues$3(0.5, 0, 0.5),\n    fromValues$3(0.5, 0, -0.5),\n    fromValues$3(-0.5, 0, -0.5),\n    fromValues$3(-0.5, 0, 0.5)\n  ];\n  Cube.EDGE_NORMALS = [\n    fromValues$3(0, Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, 0, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, 0, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO)\n  ];\n  Cube.EDGE_CORNERS = [\n    [0, 1],\n    [1, 5],\n    [4, 5],\n    [0, 4],\n    [2, 3],\n    [2, 6],\n    [6, 7],\n    [3, 7],\n    [1, 2],\n    [5, 6],\n    [4, 7],\n    [0, 3]\n  ];\n  Cube.EDGE_FACES = [\n    [0, 4],\n    [0, 1],\n    [0, 5],\n    [0, 3],\n    [2, 4],\n    [2, 1],\n    [2, 5],\n    [2, 3],\n    [1, 4],\n    [1, 5],\n    [3, 5],\n    [3, 4]\n  ];\n  Cube.EDGE_AXIS = [\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    1,\n    1,\n    1,\n    1\n  ];\n  Cube.AXIS_EDGES = [\n    [0, 2, 4, 6],\n    [8, 9, 10, 11],\n    [1, 3, 5, 7]\n  ];\n  Cube.AXIS_FACES = [\n    [1, 3],\n    [0, 2],\n    [4, 5]\n  ];\n  Cube.OPPOSITE_FACES = [\n    2,\n    3,\n    0,\n    1,\n    5,\n    4\n  ];\n  Cube.EDGE_POSITIVES = [\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0)\n  ];\n  Cube.EDGE_FORWARDS = [\n    fromValues$3(0, Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, -Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, Constants$1.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, 0, Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants$1.ROOT_TWO_OVER_TWO, 0, -Constants$1.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants$1.ROOT_TWO_OVER_TWO, 0, -Constants$1.ROOT_TWO_OVER_TWO)\n  ];\n  let ControllerVisual$1 = class ControllerVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(controller) {\n      this.controller = controller;\n    }\n  };\n  class Controller {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get texture() {\n      return this._texture;\n    }\n    get rayMMatrix() {\n      return this._rayMMatrix;\n    }\n    get rayIndexCount() {\n      return this._rayIndexCount;\n    }\n    get rayVertices() {\n      return this._rayVertices;\n    }\n    get rayIndices() {\n      return this._rayIndices;\n    }\n    constructor(core, options2) {\n      this._cubeObj = `o Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 -1.000000\nv 1.000000 1.000000 -0.999999\nv 0.999999 1.000000 1.000001\nv -1.000000 1.000000 1.000000\nv -1.000000 1.000000 -1.000000\nvt 1.000000 0.333333\nvt 1.000000 0.666667\nvt 0.666667 0.666667\nvt 0.666667 0.333333\nvt 0.666667 0.000000\nvt 0.000000 0.333333\nvt 0.000000 0.000000\nvt 0.333333 0.000000\nvt 0.333333 1.000000\nvt 0.000000 1.000000\nvt 0.000000 0.666667\nvt 0.333333 0.333333\nvt 0.333333 0.666667\nvt 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.000000 0.000000 1.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\ns off\nf 2/1/1 3/2/1 4/3/1\nf 8/1/2 7/4/2 6/5/2\nf 5/6/3 6/7/3 2/8/3\nf 6/8/4 7/5/4 3/4/4\nf 3/9/5 7/10/5 8/11/5\nf 1/12/6 4/13/6 8/11/6\nf 1/4/1 2/1/1 4/3/1\nf 5/14/2 8/1/2 6/5/2\nf 1/12/3 5/6/3 2/8/3\nf 2/12/4 6/8/4 3/4/4\nf 4/13/5 3/9/5 8/11/5\nf 5/6/6 1/12/6 8/11/6`;\n      this._core = core;\n      this._obj = options2.obj;\n      this._texture = options2.texture || new ImageData(new Uint8ClampedArray([0, 0, 0, 255]), 1, 1);\n    }\n    initialize() {\n      const _vec3 = create$6();\n      this._mMatrix = create$7();\n      const objMesh = new ObjHelper(this._core).read(this._obj || this._cubeObj);\n      if (!this._obj) {\n        this.useRayPose = true;\n        const modelThickness = 0.02;\n        const modelLength = 0.1;\n        set$8(_vec3, modelThickness, modelThickness, modelLength);\n        fromScaling(this._mMatrix, _vec3);\n        set$8(_vec3, 0, 0, 1);\n        translate$2(this._mMatrix, this._mMatrix, _vec3);\n      }\n      this._vertices = objMesh.vertices;\n      this._indices = objMesh.indices;\n      this._indexCount = objMesh.indexCount;\n      this._rayMMatrix = create$7();\n      const rayVertices = Cube.POSITIONS;\n      this._rayVertices = new ArrayBuffer(PositionColorVertex.SIZE_BYTES * rayVertices.length / PositionVertex.SIZE);\n      const rayVerticesView = new DataView(this._rayVertices);\n      const rayIndices = Cube.INDICES;\n      this._rayIndices = new Uint16Array(rayIndices);\n      const rayVertexCount = rayVertices.length / PositionVertex.SIZE;\n      this._rayIndexCount = rayIndices.length;\n      for (let i = 0; i < rayVertexCount; i++) {\n        set$8(_vec3, rayVertices[i * PositionVertex.SIZE], rayVertices[i * PositionVertex.SIZE + 1], rayVertices[i * PositionVertex.SIZE + 2]);\n        PositionColorVertex.setPosition(rayVerticesView, i, _vec3);\n        PositionColorVertex.setColor(rayVerticesView, i, this._core.config.xrControllerRayColor);\n      }\n      const rayThickness = 25e-4;\n      const rayLength = 10;\n      set$8(_vec3, rayThickness, rayThickness, rayLength);\n      fromScaling(this._rayMMatrix, _vec3);\n      set$8(_vec3, 0, 0, -0.5);\n      translate$2(this._rayMMatrix, this._rayMMatrix, _vec3);\n      this._isInitialized = true;\n      this._core.log.write(LogLevel.info, \"controller initialized\");\n    }\n    update(elapsedTime) {\n    }\n  }\n  class MatrixHelper {\n    static fieldOfViewFromProjectionMatrix(p) {\n      return 2 * Math.atan(1 / p[5]);\n    }\n  }\n  class AxesVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(axes) {\n      this.axes = axes;\n    }\n  }\n  class AxesBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    set vMatrix(value2) {\n      this._vMatrix = value2;\n    }\n    pickGrid(id2) {\n      const offset2 = id2 * 3;\n      return {\n        divisionX: this._pickGrid[offset2] - 1,\n        divisionY: this._pickGrid[offset2 + 1] - 1,\n        divisionZ: this._pickGrid[offset2 + 2] - 1\n      };\n    }\n    pickTitle(id2) {\n      return { axis: this._pickTitle[id2] };\n    }\n    pickLabel(id2) {\n      const offset2 = id2 * 2;\n      return {\n        axis: this._pickLabel[offset2],\n        label: this._pickLabel[offset2 + 1]\n      };\n    }\n    pickHeading(id2) {\n      return { axis: this._pickHeading[id2] };\n    }\n    getFromValues(index2) {\n      return this._fromValues[index2];\n    }\n    setFromValues(index2, value2) {\n      if (this._fromValues[index2] != value2) {\n        this._fromValues[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getToValues(index2) {\n      return this._toValues[index2];\n    }\n    setToValues(index2, value2) {\n      if (this._toValues[index2] != value2) {\n        this._toValues[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get font() {\n      return this._font;\n    }\n    set font(value2) {\n      if (this._font != value2) {\n        this._font = value2;\n        this._hasChanged = true;\n      }\n    }\n    get gridPickDivisionHeight() {\n      return this._gridPickDivisionHeight;\n    }\n    set gridPickDivisionHeight(value2) {\n      if (this._gridPickDivisionHeight != value2) {\n        this._gridPickDivisionHeight = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core) {\n      this._core = core;\n      this._mMatrix = create$7();\n      this._mvMatrix = create$7();\n      this._textMetric = { maxTop: 0, width: 0, maxHeight: 0 };\n      this._gridPickDivisionHeight = core.config.axesGridPickDivisionHeight;\n      this.textBorderWidth = core.config.textBorderWidth;\n      this.gamma = 0;\n      this.gridMajorThickness = core.config.axesGridMajorThickness;\n      this.gridMinorThickness = core.config.axesGridMinorThickness;\n      this.gridZeroThickness = core.config.axesGridZeroThickness;\n      this._font = core.font;\n      this.isGridPickingEnabled = false;\n    }\n    update(elapsedTime) {\n    }\n  }\n  let Quad$3 = class Quad {\n    static positions(transform2) {\n      const positions2 = new Float32Array(12);\n      const position2 = create$6();\n      for (let i = 0; i < 4; i++) {\n        set$8(position2, this.POSITIONS[i * 3], this.POSITIONS[i * 3 + 1], this.POSITIONS[i * 3 + 2]);\n        transformMat4$2(position2, position2, transform2);\n        positions2[i * 3] = position2[0];\n        positions2[i * 3 + 1] = position2[1];\n        positions2[i * 3 + 2] = position2[2];\n      }\n      return positions2;\n    }\n    static textured(transform2, texTransform = Constants$1.MAT4_IDENTITY) {\n      const positions2 = this.positions(transform2);\n      const texCoords = this.TEX_COORDS;\n      const vertices = new ArrayBuffer(PositionTextureVertex.SIZE_BYTES * positions2.length / 3);\n      const verticesView = new DataView(vertices);\n      const position2 = create$6();\n      const texCoord = create$3();\n      for (let i = 0; i < positions2.length / PositionVertex.SIZE; i++) {\n        set$8(position2, positions2[i * PositionVertex.SIZE], positions2[i * PositionVertex.SIZE + 1], positions2[i * PositionVertex.SIZE + 2]);\n        set$5(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n        transformMat4(texCoord, texCoord, texTransform);\n        PositionTextureVertex.setPosition(verticesView, i, position2);\n        PositionTextureVertex.setTexCoord(verticesView, i, texCoord);\n      }\n      return verticesView;\n    }\n    static normalTextured(transform2, texTransform = Constants$1.MAT4_IDENTITY) {\n      const positions2 = this.positions(transform2);\n      const texCoords = this.TEX_COORDS;\n      const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * positions2.length / 3);\n      const verticesView = new DataView(vertices);\n      const position2 = create$6();\n      const texCoord = create$3();\n      const normal3 = create$6();\n      const normal4 = create$5();\n      for (let i = 0; i < positions2.length / PositionVertex.SIZE; i++) {\n        set$8(position2, positions2[i * PositionVertex.SIZE], positions2[i * PositionVertex.SIZE + 1], positions2[i * PositionVertex.SIZE + 2]);\n        set$5(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n        transformMat4(texCoord, texCoord, texTransform);\n        PositionNormalTextureVertex.setPosition(verticesView, i, position2);\n        set$7(normal4, 0, 0, 1, 0);\n        transformMat4$1(normal4, normal4, transform2);\n        set$8(normal3, normal4[0], normal4[1], normal4[2]);\n        normalize$5(normal3, normal3);\n        PositionNormalTextureVertex.setNormal(verticesView, i, normal3);\n        PositionNormalTextureVertex.setTexCoord(verticesView, i, texCoord);\n      }\n      return verticesView;\n    }\n  };\n  Quad$3.FACE_NORMALS = [\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Quad$3.FACE_ROTATIONS = [\n    fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n  ];\n  Quad$3.EDGE_POSITIONS = [\n    fromValues$3(0, 0.5, 0),\n    fromValues$3(0.5, 0, 0),\n    fromValues$3(0, -0.5, 0),\n    fromValues$3(-0.5, 0, 0)\n  ];\n  Quad$3.EDGE_NORMALS = [\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, -1, 0),\n    fromValues$3(-1, 0, 0)\n  ];\n  Quad$3.EDGE_POSITIVES = [\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 1, 0)\n  ];\n  Quad$3.EDGE_FORWARDS = [\n    fromValues$3(0, 0, -1),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Quad$3.AXIS_EDGES = [\n    [0, 2],\n    [1, 3]\n  ];\n  Quad$3.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0,\n    0.5,\n    0.5,\n    0,\n    -0.5,\n    -0.5,\n    0,\n    0.5,\n    -0.5,\n    0\n  ]);\n  Quad$3.INDICES = new Uint16Array([0, 2, 1, 1, 2, 3]);\n  Quad$3.TEX_COORDS = new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]);\n  class TextHelper {\n    static truncate(text2, length2) {\n      return text2.length > length2 ? `${text2.substr(0, length2 - 1)}…` : text2;\n    }\n    static measure(font2, text2, size) {\n      size.width = 0;\n      let maxDescent = 0;\n      for (const char of text2) {\n        let glyph = font2.glyphs[char];\n        if (!glyph) {\n          font2.addGlyph(char);\n          glyph = font2.glyphs[char];\n        }\n        size.width += glyph.advance;\n        size.maxTop = Math.max(glyph.top, size.maxTop);\n        maxDescent = Math.max(glyph.height - glyph.top, maxDescent);\n      }\n      size.maxHeight = size.maxTop + maxDescent;\n    }\n    static wrap(font2, text2, maxWidth) {\n      const lines = [];\n      let width2 = 0;\n      let start = 0;\n      let lastBreakingChar = -1;\n      let widthAfterLastBreakingChar = 0;\n      for (let i = 0; i < text2.length; i++) {\n        let char = text2.charAt(i);\n        let glyph = font2.glyphs[char];\n        if (!glyph) {\n          font2.addGlyph(char);\n          glyph = font2.glyphs[char];\n        }\n        width2 += glyph.advance;\n        if (char == \" \" || char == \"-\") {\n          widthAfterLastBreakingChar = width2;\n          lastBreakingChar = i;\n        }\n        if (width2 > maxWidth) {\n          if (lastBreakingChar == -1) {\n            lines.push(text2.substring(start, i));\n            start = i;\n            width2 += glyph.advance;\n          } else {\n            lines.push(text2.substring(start, lastBreakingChar));\n            start = lastBreakingChar + 1;\n            width2 -= widthAfterLastBreakingChar;\n            widthAfterLastBreakingChar = 0;\n            lastBreakingChar = -1;\n          }\n        }\n      }\n      lines.push(text2.substring(start, text2.length));\n      return lines;\n    }\n    static addString(font2, text2, vertices, indices, index2, position2, scale2, offset2, rotation2, idColor) {\n      for (const char of text2) {\n        this.addGlyph(font2, char, vertices, indices, index2++, position2, scale2, offset2, rotation2, idColor);\n      }\n    }\n    static addGlyph(font2, char, vertices, indices, index2, position2, scale2, offset2, rotation2, idColor) {\n      let glyph = font2.glyphs[char];\n      if (!glyph) {\n        font2.addGlyph(char);\n        glyph = font2.glyphs[char];\n      }\n      const vertexOffset = index2 * 4;\n      const width2 = glyph.width * scale2;\n      const height2 = glyph.height * scale2;\n      const top = glyph.top * scale2;\n      const border = font2.border * scale2;\n      const x02 = offset2[0] - border;\n      const x12 = offset2[0] + width2 + border;\n      const y02 = offset2[1] + top + border;\n      const y12 = offset2[1] + top - height2 - border;\n      const z02 = offset2[2];\n      set$8(this._topLeft, x02, y02, z02);\n      set$8(this._topRight, x12, y02, z02);\n      set$8(this._bottomLeft, x02, y12, z02);\n      set$8(this._bottomRight, x12, y12, z02);\n      if (rotation2) {\n        transformQuat(this._topLeft, this._topLeft, rotation2);\n        transformQuat(this._topRight, this._topRight, rotation2);\n        transformQuat(this._bottomLeft, this._bottomLeft, rotation2);\n        transformQuat(this._bottomRight, this._bottomRight, rotation2);\n      }\n      add$4(this._vec3, this._topLeft, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset, this._vec3);\n      add$4(this._vec3, this._topRight, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 1, this._vec3);\n      add$4(this._vec3, this._bottomLeft, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 2, this._vec3);\n      add$4(this._vec3, this._bottomRight, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 3, this._vec3);\n      set$5(this._vec2, glyph.u0, glyph.v0);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset, this._vec2);\n      set$5(this._vec2, glyph.u1, glyph.v0);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 1, this._vec2);\n      set$5(this._vec2, glyph.u0, glyph.v1);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 2, this._vec2);\n      set$5(this._vec2, glyph.u1, glyph.v1);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 3, this._vec2);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 1, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 2, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 3, idColor);\n      offset2[0] += glyph.advance * scale2;\n      const indexTemplate = Quad$3.INDICES;\n      const indexOffset = index2 * 6;\n      for (let i = 0; i < 6; i++) {\n        indices[indexOffset + i] = indexTemplate[i] + vertexOffset;\n      }\n    }\n  }\n  TextHelper._vec2 = create$3();\n  TextHelper._vec3 = create$6();\n  TextHelper._topLeft = create$6();\n  TextHelper._topRight = create$6();\n  TextHelper._bottomLeft = create$6();\n  TextHelper._bottomRight = create$6();\n  class PickHelper {\n    static nextPickId() {\n      return this._pickId++;\n    }\n    static encodeNumber(number2, type2, color2) {\n      const encoded = number2 | PickHelper.encodeType(type2);\n      PickHelper.float32ToVec4(encoded, color2);\n    }\n    static decodeNumber(color2) {\n      return color2[0] + (color2[1] << 8) + (color2[2] << 16);\n    }\n    static encodeVec3(vec3, type2, color2) {\n      const encoded = vec3[0] | vec3[1] << 8 | vec3[2] << 16 | PickHelper.encodeType(type2);\n      PickHelper.float32ToVec4(encoded, color2);\n    }\n    static decodeVec3(color2, axes) {\n      axes[0] = color2[0];\n      axes[1] = color2[1];\n      axes[2] = color2[2];\n    }\n    static encodeType(type2) {\n      return type2 << 24;\n    }\n    static decodeType(color2) {\n      return color2[3];\n    }\n    static float32ToVec4(number2, color2) {\n      color2[0] = ((number2 & 255) >>> 0) / 255;\n      color2[1] = ((number2 & 65280) >>> 8) / 255;\n      color2[2] = ((number2 & 16711680) >>> 16) / 255;\n      color2[3] = ((number2 & 4278190080) >>> 24) / 255;\n    }\n    static uint8ArrayToNumber(color2) {\n      return color2[0] + (color2[1] << 8) + (color2[2] << 16) + (color2[3] << 24);\n    }\n  }\n  PickHelper._pickId = 1;\n  class Cartesian3dAxes extends AxesBase {\n    get size() {\n      return this._size;\n    }\n    get isDiscreteX() {\n      return this._isDiscrete[0];\n    }\n    set isDiscreteX(value2) {\n      if (value2 != this._isDiscrete[0]) {\n        this._isDiscrete[0] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteY() {\n      return this._isDiscrete[1];\n    }\n    set isDiscreteY(value2) {\n      if (value2 != this._isDiscrete[1]) {\n        this._isDiscrete[1] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteZ() {\n      return this._isDiscrete[2];\n    }\n    set isDiscreteZ(value2) {\n      if (value2 != this._isDiscrete[2]) {\n        this._isDiscrete[2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (value2 != this._minBoundsZ) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (value2 != this._minBoundsZ) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsOutsideEdge(index2) {\n      return this._isOutsideEdge[index2];\n    }\n    getIsForwardFace(index2) {\n      return this._isForwardFace[index2];\n    }\n    get textVertices() {\n      return this._textVertices;\n    }\n    get textIndices() {\n      return this._textIndices;\n    }\n    getLabelMMatrix(index2) {\n      return this._labelMMatrices[index2];\n    }\n    setLabelPositions(index2, value2) {\n      if (this._labelPositions[index2] != value2) {\n        this._labelPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabels(index2, value2) {\n      if (this._labels[index2] != value2) {\n        this._labels[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabelSizes(index2, value2) {\n      if (this._labelSizes[index2] != value2) {\n        this._labelSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getLabelOrientation(index2) {\n      return this._orientations[index2];\n    }\n    setLabelOrientation(index2, orientation) {\n      if (this._orientations[index2] != orientation) {\n        this._orientations[index2] = orientation;\n        this._hasChanged = true;\n      }\n    }\n    getTitleIndexCount(index2) {\n      return this._titleIndexCounts[index2];\n    }\n    getTitleIndexOffset(index2) {\n      return this._titleIndexOffsets[index2];\n    }\n    getTitleMMatrix(index2) {\n      return this._titleMMatrices[index2];\n    }\n    setTitle(index2, value2) {\n      if (this._titles[index2] != value2) {\n        this._titles[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setTitleSize(index2, value2) {\n      if (this._titleSizes[index2] != value2) {\n        this._titleSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getHeadingIndexCount(index2) {\n      return this._headingIndexCounts[index2];\n    }\n    getHeadingIndexOffset(index2) {\n      return this._headingIndexOffsets[index2];\n    }\n    getHeadingMMatrix(index2) {\n      return this._headingMMatrices[index2];\n    }\n    setHeading(index2, value2) {\n      if (this._headings[index2] != value2) {\n        this._headings[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setHeadingSize(index2, value2) {\n      if (this._headingSizes[index2] != value2) {\n        this._headingSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsLeftToRightHorizontal(index2) {\n      return this._isLeftToRightHorizontal[index2];\n    }\n    getIsLeftToRightVertical(index2) {\n      return this._isLeftToRightVertical[index2];\n    }\n    getAxesLeftToRightIndexCount(index2) {\n      return this._axesLeftToRightIndexCounts[index2];\n    }\n    getAxesRightToLeftIndexCount(index2) {\n      return this._axesRightToLeftIndexCounts[index2];\n    }\n    getAxesLeftToRightIndexOffset(index2) {\n      return this._axesLeftToRightIndexOffsets[index2];\n    }\n    getAxesRightToLeftIndexOffset(index2) {\n      return this._axesRightToLeftIndexOffsets[index2];\n    }\n    get gridVertices() {\n      return this._gridVertices;\n    }\n    get gridIndices() {\n      return this._gridIndices;\n    }\n    getGridTicksIndexCount(index2) {\n      return this._gridTicksIndexCounts[index2];\n    }\n    getGridTicksIndexOffset(index2) {\n      return this._gridTicksIndexOffsets[index2];\n    }\n    getGridFaceIndexCount(index2) {\n      return this._gridFaceIndexCounts[index2];\n    }\n    getGridFaceIndexOffset(index2) {\n      return this._gridFaceIndexOffsets[index2];\n    }\n    getGridTicksMMatrix(index2) {\n      return this._gridTicksMMatrices[index2];\n    }\n    getGridFaceMMatrix(index2) {\n      return this._gridFaceMMatrices[index2];\n    }\n    getGridTicksScale(index2) {\n      return this._gridTicksScales[index2];\n    }\n    getGridFaceZero(index2) {\n      return this._gridFaceZeros[index2];\n    }\n    getGridTicksZero(index2) {\n      return this._gridTicksZeros[index2];\n    }\n    getGridFaceMinorGridlines(index2) {\n      return this._gridFaceMinorGridlines[index2];\n    }\n    getGridTicksMinorGridlines(index2) {\n      return this._gridTicksMinorGridlines[index2];\n    }\n    setTickPositions(index2, value2) {\n      if (this._gridTicksPositions[index2] != value2) {\n        this._gridTicksPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingX() {\n      return this._scalingX;\n    }\n    set scalingX(value2) {\n      if (value2 != this._scalingX) {\n        this._scalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingY() {\n      return this._scalingY;\n    }\n    set scalingY(value2) {\n      if (value2 != this._scalingY) {\n        this._scalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingZ() {\n      return this._scalingZ;\n    }\n    set scalingZ(value2) {\n      if (value2 != this._scalingZ) {\n        this._scalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offset[12];\n    }\n    set offsetX(value2) {\n      if (value2 != this._offset[12]) {\n        this._offset[12] = value2;\n      }\n    }\n    get offsetY() {\n      return this._offset[13];\n    }\n    set offsetY(value2) {\n      if (value2 != this._offset[13]) {\n        this._offset[13] = value2;\n      }\n    }\n    get offsetZ() {\n      return this._offset[14];\n    }\n    set offsetZ(value2) {\n      if (value2 != this._offset[14]) {\n        this._offset[14] = value2;\n      }\n    }\n    constructor(core) {\n      super(core);\n      this._size = create$6();\n      this._translation = create$6();\n      this._normal = create$6();\n      this._forward = create$6();\n      this._right = create$6();\n      this._up = create$6();\n      this._texCoord = create$3();\n      this._bounds = create$5();\n      this._vec3 = create$6();\n      this._vec4 = create$5();\n      this._mat3 = create$8();\n      this._isDiscrete = [false, false, false];\n      this._minBoundsX = 0;\n      this._minBoundsY = 0;\n      this._minBoundsZ = 0;\n      this._maxBoundsX = 0;\n      this._maxBoundsY = 0;\n      this._maxBoundsZ = 0;\n      this._isForwardFace = [];\n      this._isForwardEdge = [];\n      this._isOutsideEdge = [];\n      for (let i = 0; i < 6; i++) {\n        this._isForwardFace.push(false);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._isForwardEdge.push(false);\n        this._isOutsideEdge.push(false);\n      }\n      this._textOffset = create$6();\n      this._textPosition = create$6();\n      this._distances = [];\n      for (let i = 0; i < 12; i++) {\n        this._distances.push(0);\n      }\n      this._labelPositions = [];\n      this._labels = [];\n      this._labelSizes = [];\n      this._maxLabelSize = [];\n      this._axesLeftToRightIndexCounts = [];\n      this._axesRightToLeftIndexCounts = [];\n      this._axesLeftToRightIndexOffsets = [];\n      this._axesRightToLeftIndexOffsets = [];\n      this._labelMMatrices = [];\n      this._orientations = [];\n      for (let i = 0; i < 3; i++) {\n        this._maxLabelSize.push(create$3());\n        this._orientations.push(AxesTextOrientation.parallel);\n        this._axesLeftToRightIndexCounts.push(0);\n        this._axesRightToLeftIndexCounts.push(0);\n        this._axesLeftToRightIndexOffsets.push(0);\n        this._axesRightToLeftIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._labelMMatrices.push(create$7());\n      }\n      this._titles = [];\n      this._titleSizes = [];\n      this._titleIndexCounts = [];\n      this._titleIndexOffsets = [];\n      this._titleMMatrices = [];\n      for (let i = 0; i < 3; i++) {\n        this._titles.push(null);\n        this._titleSizes.push(core.config.axesTextTitleSize);\n        this._titleIndexCounts.push(0);\n        this._titleIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._titleMMatrices.push(create$7());\n      }\n      this._headings = [];\n      this._headingSizes = [];\n      this._headingIndexCounts = [];\n      this._headingIndexOffsets = [];\n      this._headingMMatrices = [];\n      this.isHeadingVisible = [];\n      for (let i = 0; i < 3; i++) {\n        this._headings.push(null);\n        this._headingSizes.push(core.config.axesTextHeadingSize);\n        this._headingIndexCounts.push(0);\n        this._headingIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._headingMMatrices.push(create$7());\n        this.isHeadingVisible.push(true);\n      }\n      this.isEdgeVisible = [];\n      this._edgePosition = create$6();\n      this._edgePositive = create$6();\n      this._edgeNormal = create$6();\n      this._edgeNormalTemp = create$6();\n      this._edgePositiveTemp = create$6();\n      this._isLeftToRightHorizontal = [];\n      this._isLeftToRightVertical = [];\n      this._edgeHorizontalRight = [];\n      this._edgeHorizontalUp = [];\n      this._edgeHorizontalForward = [];\n      this._edgeVerticalRight = [];\n      this._edgeVerticalUp = [];\n      this._edgeVerticalForward = [];\n      for (let i = 0; i < 12; i++) {\n        this.isEdgeVisible.push(true);\n        this._isLeftToRightHorizontal.push(false);\n        this._isLeftToRightVertical.push(false);\n        this._edgeHorizontalRight.push(create$6());\n        this._edgeHorizontalUp.push(create$6());\n        this._edgeHorizontalForward.push(create$6());\n        this._edgeVerticalRight.push(create$6());\n        this._edgeVerticalUp.push(create$6());\n        this._edgeVerticalForward.push(create$6());\n      }\n      this.isFaceVisible = [];\n      for (let i = 0; i < 6; i++) {\n        this.isFaceVisible.push(true);\n      }\n      this.arePickDivisionsVisible = [];\n      this.areFacesVisible = [];\n      this._indexTemplate = Quad$3.INDICES;\n      this.zero = create$6();\n      this._gridTicksZeros = [];\n      this._gridFaceZeros = [];\n      this.minorGridlines = fromValues$3(1, 1, 1);\n      this._gridTicksMinorGridlines = [];\n      this._gridFaceMinorGridlines = [];\n      this._gridTicksPositions = [];\n      this._gridTicksScales = [];\n      this._gridTicksIndexCounts = [];\n      this._gridTicksIndexOffsets = [];\n      this._gridFaceScale = create$6();\n      this._gridFaceIndexCounts = [];\n      this._gridFaceIndexOffsets = [];\n      this._gridFaceMMatrices = [];\n      this._gridTicksMMatrices = [];\n      this._gridTicksRotations = [];\n      for (let i = 0; i < 3; i++) {\n        this.arePickDivisionsVisible.push(true);\n        this.areFacesVisible.push(true);\n        this._gridTicksZeros.push(create$3());\n        this._gridFaceZeros.push(create$3());\n        this._gridTicksMinorGridlines.push(create$3());\n        this._gridFaceMinorGridlines.push(create$3());\n        this._gridTicksScales.push(create$6());\n        this._gridTicksIndexCounts.push(0);\n        this._gridTicksIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 6; i++) {\n        this._gridFaceIndexCounts.push(0);\n        this._gridFaceIndexOffsets.push(0);\n        this._gridFaceMMatrices.push(create$7());\n      }\n      for (let i = 0; i < 12; i++) {\n        this._gridTicksMMatrices.push(create$7());\n        this._gridTicksRotations.push(create$7());\n        const _mat4 = this._gridTicksRotations[i];\n        _mat4[0] = Cube.EDGE_POSITIVES[i][0];\n        _mat4[1] = Cube.EDGE_POSITIVES[i][1];\n        _mat4[2] = Cube.EDGE_POSITIVES[i][2];\n        _mat4[4] = Cube.EDGE_NORMALS[i][0];\n        _mat4[5] = Cube.EDGE_NORMALS[i][1];\n        _mat4[6] = Cube.EDGE_NORMALS[i][2];\n        cross$1(this._vec3, Cube.EDGE_POSITIVES[i], Cube.EDGE_NORMALS[i]);\n        _mat4[8] = this._vec3[0];\n        _mat4[9] = this._vec3[1];\n        _mat4[10] = this._vec3[2];\n      }\n      this._fromValues = [null, null, null];\n      this._toValues = [null, null, null];\n      this.isDivisionPickingEnabled = [false, false, false];\n      this.isLabelPickingEnabled = [false, false, false];\n      this.isTitlePickingEnabled = [false, false, false];\n      this.isHeadingPickingEnabled = [false, false, false];\n      this.isAxisReversed = [false, false, false];\n      this._scalingX = 1;\n      this._scalingY = 1;\n      this._scalingZ = 1;\n      this._offset = create$7();\n    }\n    initialize() {\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this.isInitialized) {\n        if (this._hasChanged) {\n          const start = window.performance.now();\n          this._hasChanged = false;\n          set$8(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, this._maxBoundsZ - this._minBoundsZ);\n          const maxBounds = Math.max(this._size[0], Math.max(this._size[1], this._size[2]));\n          this._size[0] *= this._scalingX / maxBounds;\n          this._size[1] *= this._scalingY / maxBounds;\n          this._size[2] *= this._scalingZ / maxBounds;\n          this._updateGrids(this._size);\n          this._updateText(this._size);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n          this._core.log.write(LogLevel.info, `cartesian3d updated ${Math.round(window.performance.now() - start)}ms`);\n        }\n        multiply$2(this._mMatrix, this.mMatrix, this._offset);\n        this._mvMatrix = create$7();\n        multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n        fromMat4(this._mat3, this._mvMatrix);\n        for (let faceId = 0; faceId < 6; faceId++) {\n          multiply$1(this._vec3, Cube.FACE_POSITIONS[faceId], this._size);\n          transformMat4$2(this._forward, this._vec3, this._mvMatrix);\n          transformMat3(this._normal, Cube.FACE_NORMALS[faceId], this._mat3);\n          this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n        }\n        this._forward[0] = this._mat3[2];\n        this._forward[1] = this._mat3[5];\n        this._forward[2] = this._mat3[8];\n        for (let edgeId = 0; edgeId < 12; edgeId++) {\n          const faceIds = Cube.EDGE_FACES[edgeId];\n          const forward1 = this._isForwardFace[faceIds[0]];\n          const forward2 = this._isForwardFace[faceIds[1]];\n          const outsideEdge = forward1 != forward2;\n          this._isOutsideEdge[edgeId] = outsideEdge;\n          if (outsideEdge) {\n            this._isForwardEdge[edgeId] = dot$1(Cube.EDGE_FORWARDS[edgeId], this._forward) < 0;\n          }\n          this._distances[edgeId] = 0;\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          if (this.arePickDivisionsVisible[axisId]) {\n            set$5(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n            set$5(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n            const gridTicksScale = this._gridTicksScales[axisId];\n            for (let edge = 0; edge < 4; edge++) {\n              const edgeId = Cube.AXIS_EDGES[axisId][edge];\n              if (this._isOutsideEdge[edgeId] && this.isEdgeVisible[edgeId]) {\n                let distance2 = this._distances[edgeId];\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n                scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n                translate$2(gridTicksMMatrix, this._mMatrix, this._vec3);\n                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                if (!this._isForwardEdge[edgeId]) {\n                  scale$6(gridTicksMMatrix, gridTicksMMatrix, Constants$1.VECTOR3_REFLECTX);\n                }\n                scale$6(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                this._distances[edgeId] = distance2;\n              }\n            }\n          }\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          if (this.areFacesVisible[axisId]) {\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            set$5(this._gridFaceZeros[axisId], this.zero[axisId2], this.zero[axisId3]);\n            set$5(this._gridFaceMinorGridlines[axisId], this.minorGridlines[axisId2], this.minorGridlines[axisId3]);\n            for (let face = 0; face < 2; face++) {\n              const faceId = Cube.AXIS_FACES[axisId][face];\n              if (this._isForwardFace[faceId]) {\n                const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                scale$6(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                if (this._size[axisId] > 0) {\n                  translate$2(gridFaceMMatrix, gridFaceMMatrix, Cube.FACE_POSITIONS[faceId]);\n                }\n              }\n            }\n          }\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (this._isOutsideEdge[edgeId]) {\n              multiply$1(this._edgePosition, Cube.EDGE_POSITIONS[edgeId], this._size);\n              transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n              normalize$5(this._forward, this._edgePosition);\n              negate(this._forward, this._forward);\n              cross$1(this._right, Constants$1.VECTOR3_UNITY, this._forward);\n              normalize$5(this._right, this._right);\n              cross$1(this._up, this._forward, this._right);\n              transformMat3(this._edgeNormal, Cube.EDGE_NORMALS[edgeId], this._mat3);\n              transformMat3(this._edgePositive, Cube.EDGE_POSITIVES[edgeId], this._mat3);\n              copy$6(this._edgeNormalTemp, this._edgeNormal);\n              copy$6(this._edgePositiveTemp, this._edgePositive);\n              const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n              const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n              const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n              if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n                copy$6(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n              } else {\n                negate(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n                negate(this._edgeNormalTemp, this._edgeNormalTemp);\n              }\n              if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n                this._isLeftToRightHorizontal[edgeId] = true;\n                copy$6(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n              } else {\n                this._isLeftToRightHorizontal[edgeId] = false;\n                negate(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n                negate(this._edgePositiveTemp, this._edgePositiveTemp);\n              }\n              cross$1(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n              if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n                this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                negate(edgeHorizontalRight, edgeHorizontalRight);\n              }\n              cross$1(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n              const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n              const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n              const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n              if (dot$1(this._edgeNormal, this._right) < 0) {\n                copy$6(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n              } else {\n                negate(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n                negate(this._edgeNormal, this._edgeNormal);\n              }\n              if (dot$1(this._edgePositive, this._up) < 0) {\n                this._isLeftToRightVertical[edgeId] = true;\n                copy$6(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n              } else {\n                this._isLeftToRightVertical[edgeId] = false;\n                negate(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n                negate(this._edgePositive, this._edgePositive);\n              }\n              cross$1(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n              if (dot$1(edgeVerticalForward, this._forward) < 0) {\n                this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                negate(edgeVerticalRight, edgeVerticalRight);\n              }\n              cross$1(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n              if (this.isEdgeVisible[edgeId]) {\n                if (this._labels[axisId]) {\n                  this._updateLabels(axisId, edgeId);\n                }\n                if (this._titles[axisId]) {\n                  this._updateTitle(axisId, edgeId);\n                }\n              }\n              if (this.isHeadingVisible[edgeId]) {\n                this._updateHeading(axisId, edgeId);\n              }\n            }\n          }\n        }\n      }\n    }\n    _updateLabels(axisId, edgeId) {\n      const orientation = this._orientations[axisId];\n      let distance2 = this._distances[edgeId];\n      let maxLabelSize = this._maxLabelSize[axisId][1];\n      if (orientation == AxesTextOrientation.parallel)\n        maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n      distance2 += maxLabelSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const labelMMatrix = this._labelMMatrices[edgeId];\n      labelMMatrix[12] = this._vec3[0];\n      labelMMatrix[13] = this._vec3[1];\n      labelMMatrix[14] = this._vec3[2];\n      if (orientation == AxesTextOrientation.parallel) {\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      } else {\n        const right = this._edgeVerticalRight[edgeId];\n        const up = this._edgeVerticalUp[edgeId];\n        const forward = this._edgeVerticalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      }\n      multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n      if (orientation == AxesTextOrientation.perpendicular) {\n        multiply$2(labelMMatrix, labelMMatrix, Constants$1.MAT4_ROTATION_MINUS_90);\n      }\n      distance2 += maxLabelSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateTitle(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n      distance2 += titleTextSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const titleMMatrix = this._titleMMatrices[edgeId];\n      titleMMatrix[12] = this._vec3[0];\n      titleMMatrix[13] = this._vec3[1];\n      titleMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      titleMMatrix[0] = right[0];\n      titleMMatrix[1] = right[1];\n      titleMMatrix[2] = right[2];\n      titleMMatrix[4] = up[0];\n      titleMMatrix[5] = up[1];\n      titleMMatrix[6] = up[2];\n      titleMMatrix[8] = forward[0];\n      titleMMatrix[9] = forward[1];\n      titleMMatrix[10] = forward[2];\n      multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n      distance2 += titleTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateHeading(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n      distance2 += headingTextSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const headingMMatrix = this._headingMMatrices[edgeId];\n      headingMMatrix[12] = this._vec3[0];\n      headingMMatrix[13] = this._vec3[1];\n      headingMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      headingMMatrix[0] = right[0];\n      headingMMatrix[1] = right[1];\n      headingMMatrix[2] = right[2];\n      headingMMatrix[4] = up[0];\n      headingMMatrix[5] = up[1];\n      headingMMatrix[6] = up[2];\n      headingMMatrix[8] = forward[0];\n      headingMMatrix[9] = forward[1];\n      headingMMatrix[10] = forward[2];\n      multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n      distance2 += headingTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateGrids(size) {\n      let offset2 = 0;\n      this.pickGridLookup = {};\n      this._pickGrid = [];\n      const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n      const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n      const zDivisions = this._gridTicksPositions[2] ? this._gridTicksPositions[2].length - 1 : 0;\n      const count2 = 2 * (xDivisions * yDivisions) + 2 * (xDivisions * zDivisions) + 2 * (yDivisions * zDivisions) + xDivisions + yDivisions + zDivisions;\n      const byteLength = PickGridVertex.SIZE_BYTES * count2 * 4;\n      if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n        this._gridVertices = new ArrayBuffer(byteLength);\n        this._gridVerticesView = new DataView(this._gridVertices);\n        this._gridIndices = new Uint16Array(count2 * 6);\n      }\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const width2 = size[axisId];\n        set$8(this._gridTicksScales[axisId], width2, this._gridPickDivisionHeight, 1);\n        offset2 = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset2);\n        for (let face = 0; face < 2; face++) {\n          const faceId = Cube.AXIS_FACES[axisId][face];\n          offset2 = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset2);\n        }\n        this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n      }\n    }\n    _updateText(size) {\n      let glyphOffset = 0;\n      let count2 = 0;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const labels = this._labels[axisId];\n        if (labels) {\n          for (let i = 0; i < labels.length; i++) {\n            count2 += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n          }\n        }\n        const title = this._titles[axisId];\n        if (title) {\n          count2 += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n        }\n        const heading = this._headings[axisId];\n        if (heading) {\n          count2 += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n      }\n      const byteLength = PositionTexturePickVertex.SIZE_BYTES * count2 * 4;\n      if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n        this._textVertices = new ArrayBuffer(byteLength);\n        this._textVerticesView = new DataView(this._textVertices);\n        this._textIndices = new Uint16Array(count2 * 6);\n      }\n      this.pickLabelLookup = {};\n      this._pickLabel = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._labels[axisId]) {\n          const width2 = size[axisId];\n          const maxLabelSize = this._maxLabelSize[axisId];\n          const orientation = this._orientations[axisId];\n          set$5(maxLabelSize, 0, 0);\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateLeftToRightAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateRightToLeftAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesLeftToRightIndexCounts[axisId] = 0;\n          this._axesRightToLeftIndexCounts[axisId] = 0;\n          this._maxLabelSize[axisId][0] = 0;\n          this._maxLabelSize[axisId][1] = 0;\n        }\n      }\n      this.pickTitleLookup = {};\n      this._pickTitle = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._titles[axisId]) {\n          set$8(this._textPosition, 0, 0, 0);\n          set$8(this._textOffset, 0, 0, 0);\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n          const scale2 = this._titleSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n          this.pickTitleLookup[pickId] = this._pickTitle.length;\n          this._pickTitle.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          this._titleIndexCounts[axisId] = 0;\n        }\n      }\n      this.pickHeadingLookup = {};\n      this._pickHeading = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._headings[axisId]) {\n          set$8(this._textPosition, 0, 0, 0);\n          set$8(this._textOffset, 0, 0, 0);\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n          const scale2 = this._headingSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n          this.pickHeadingLookup[pickId] = this._pickHeading.length;\n          this._pickHeading.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          this._headingIndexCounts[axisId] = 0;\n        }\n      }\n    }\n    _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions2, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions2[label2] : positions2[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$8(this._textPosition, (position2 - 0.5) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = position2 == 0 ? 0 : position2 == 1 ? -width2 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            maxSize[0] = Math.max(width2, maxSize[0]);\n            maxSize[1] = Math.max(lineHeight2, maxSize[1]);\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$8(this._textPosition, 0, (position2 - 0.5) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = position2 == 0 ? 0 : position2 == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n            }\n            maxSize[0] = Math.max(lineHeight2, maxSize[0]);\n            maxSize[1] = Math.max(width2, maxSize[1]);\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions2, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions2[label2] : positions2[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$8(this._textPosition, (0.5 - position2) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = label2 == 0 ? -width2 : label2 == labels.length - 1 ? 0 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$8(this._textPosition, 0, (0.5 - position2) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = label2 == 0 ? -maxGlyphTop : label2 == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n            }\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset2) {\n      this._gridTicksIndexOffsets[axisId] = offset2 * 6;\n      if (this._gridTicksPositions[axisId]) {\n        const axes = create$6();\n        const positions2 = this._gridTicksPositions[axisId];\n        const isAxisReversed = this.isAxisReversed[axisId];\n        let vertexOffset = offset2 * 4;\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const left = isAxisReversed ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const right = isAxisReversed ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId] = position2 + 1;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n          this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n          this._pickGrid.push(axes[0]);\n          this._pickGrid.push(axes[1]);\n          this._pickGrid.push(axes[2]);\n          let indexOffset = offset2 * 6;\n          for (let j = 0; j < this._indexTemplate.length; j++) {\n            indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n          }\n          set$7(this._bounds, left + 0.5, 0, right + 0.5, 1);\n          this._translation[0] = left;\n          this._translation[1] = 0.5;\n          this._translation[2] = 0;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 1;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = left;\n          this._translation[1] = -0.5;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 0;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          offset2++;\n        }\n      }\n      this._gridTicksIndexCounts[axisId] = offset2 * 6 - this._gridTicksIndexOffsets[axisId];\n      return offset2;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset2) {\n      set$8(this._translation, 0, 0, 0);\n      this._gridFaceIndexOffsets[faceId] = offset2 * 6;\n      const axisId2 = axisId == 0 ? 1 : 0;\n      const axisId3 = axisId == 2 ? 1 : 2;\n      if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n        const axes = create$6();\n        negate(this._normal, Cube.FACE_NORMALS[faceId]);\n        const positions2 = this._gridTicksPositions[axisId2];\n        const positions3 = this._gridTicksPositions[axisId3];\n        const isAxisReversed2 = this.isAxisReversed[axisId2];\n        const isAxisReversed3 = this.isAxisReversed[axisId3];\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId2] = position2 + 1;\n          let vertexOffset = offset2 * 4;\n          for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n            const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n            const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n            axes[axisId3] = position3 + 1;\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n            this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n            this._pickGrid.push(axes[0]);\n            this._pickGrid.push(axes[1]);\n            this._pickGrid.push(axes[2]);\n            let indexOffset = offset2 * 6;\n            for (let i = 0; i < this._indexTemplate.length; i++) {\n              indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n            }\n            set$7(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = max3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = max3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = min3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = min3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            offset2++;\n          }\n        }\n      }\n      this._gridFaceIndexCounts[faceId] = offset2 * 6 - this._gridFaceIndexOffsets[faceId];\n      return offset2;\n    }\n  }\n  class Cartesian2dAxes extends AxesBase {\n    get size() {\n      return this._size;\n    }\n    get isDiscreteX() {\n      return this._isDiscrete[0];\n    }\n    set isDiscreteX(value2) {\n      if (value2 != this._isDiscrete[0]) {\n        this._isDiscrete[0] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteY() {\n      return this._isDiscrete[1];\n    }\n    set isDiscreteY(value2) {\n      if (value2 != this._isDiscrete[1]) {\n        this._isDiscrete[1] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsOutsideEdge(index2) {\n      return this._isOutsideEdge[index2];\n    }\n    getIsForwardFace(index2) {\n      return this._isForwardFace[index2];\n    }\n    get textVertices() {\n      return this._textVertices;\n    }\n    get textIndices() {\n      return this._textIndices;\n    }\n    getLabelMMatrix(index2) {\n      return this._labelMMatrices[index2];\n    }\n    setLabelPositions(index2, value2) {\n      if (this._labelPositions[index2] != value2) {\n        this._labelPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabels(index2, value2) {\n      if (this._labels[index2] != value2) {\n        this._labels[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabelSizes(index2, value2) {\n      if (this._labelSizes[index2] != value2) {\n        this._labelSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getLabelOrientation(index2) {\n      return this._orientations[index2];\n    }\n    setLabelOrientation(index2, orientation) {\n      if (this._orientations[index2] != orientation) {\n        this._orientations[index2] = orientation;\n        this._hasChanged = true;\n      }\n    }\n    getTitleIndexCount(index2) {\n      return this._titleIndexCounts[index2];\n    }\n    getTitleIndexOffset(index2) {\n      return this._titleIndexOffsets[index2];\n    }\n    getTitleMMatrix(index2) {\n      return this._titleMMatrices[index2];\n    }\n    setTitle(index2, value2) {\n      if (this._titles[index2] != value2) {\n        this._titles[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setTitleSize(index2, value2) {\n      if (this._titleSizes[index2] != value2) {\n        this._titleSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getHeadingIndexCount(index2) {\n      return this._headingIndexCounts[index2];\n    }\n    getHeadingIndexOffset(index2) {\n      return this._headingIndexOffsets[index2];\n    }\n    getHeadingMMatrix(index2) {\n      return this._headingMMatrices[index2];\n    }\n    setHeading(index2, value2) {\n      if (this._headings[index2] != value2) {\n        this._headings[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setHeadingSize(index2, value2) {\n      if (this._headingSizes[index2] != value2) {\n        this._headingSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsLeftToRightHorizontal(index2) {\n      return this._isLeftToRightHorizontal[index2];\n    }\n    getIsLeftToRightVertical(index2) {\n      return this._isLeftToRightVertical[index2];\n    }\n    getAxesLeftToRightIndexCount(index2) {\n      return this._axesLeftToRightIndexCounts[index2];\n    }\n    getAxesRightToLeftIndexCount(index2) {\n      return this._axesRightToLeftIndexCounts[index2];\n    }\n    getAxesLeftToRightIndexOffset(index2) {\n      return this._axesLeftToRightIndexOffsets[index2];\n    }\n    getAxesRightToLeftIndexOffset(index2) {\n      return this._axesRightToLeftIndexOffsets[index2];\n    }\n    get gridVertices() {\n      return this._gridVertices;\n    }\n    get gridIndices() {\n      return this._gridIndices;\n    }\n    getGridTicksIndexCount(index2) {\n      return this._gridTicksIndexCounts[index2];\n    }\n    getGridTicksIndexOffset(index2) {\n      return this._gridTicksIndexOffsets[index2];\n    }\n    getGridFaceIndexCount(index2) {\n      return this._gridFaceIndexCounts[index2];\n    }\n    getGridFaceIndexOffset(index2) {\n      return this._gridFaceIndexOffsets[index2];\n    }\n    getGridTicksMMatrix(index2) {\n      return this._gridTicksMMatrices[index2];\n    }\n    getGridFaceMMatrix(index2) {\n      return this._gridFaceMMatrices[index2];\n    }\n    getGridTicksScale(index2) {\n      return this._gridTicksScales[index2];\n    }\n    getGridTicksZero(index2) {\n      return this._gridTicksZeros[index2];\n    }\n    get gridFaceZero() {\n      return this._gridFaceZeros;\n    }\n    get gridFaceMinorGridlines() {\n      return this._gridFaceMinorGridlines;\n    }\n    getGridTicksMinorGridlines(index2) {\n      return this._gridTicksMinorGridlines[index2];\n    }\n    setTickPositions(index2, value2) {\n      if (this._gridTicksPositions[index2] != value2) {\n        this._gridTicksPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingX() {\n      return this._scalingX;\n    }\n    set scalingX(value2) {\n      if (value2 != this._scalingX) {\n        this._scalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingY() {\n      return this._scalingY;\n    }\n    set scalingY(value2) {\n      if (value2 != this._scalingY) {\n        this._scalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offset[12];\n    }\n    set offsetX(value2) {\n      if (value2 != this._offset[12]) {\n        this._offset[12] = value2;\n      }\n    }\n    get offsetY() {\n      return this._offset[13];\n    }\n    set offsetY(value2) {\n      if (value2 != this._offset[13]) {\n        this._offset[13] = value2;\n      }\n    }\n    set rotation(value2) {\n      if (this._rotation != value2) {\n        this._rotation = value2;\n        this._rMatrix = create$7();\n        fromQuat(this._rMatrix, value2);\n      }\n    }\n    constructor(core) {\n      super(core);\n      this._size = create$6();\n      this._translation = create$6();\n      this._normal = create$6();\n      this._forward = create$6();\n      this._right = create$6();\n      this._up = create$6();\n      this._texCoord = create$3();\n      this._bounds = create$5();\n      this._vec3 = create$6();\n      this._vec4 = create$5();\n      this._mat3 = create$8();\n      this._isDiscrete = [false, false];\n      this._minBoundsX = 0;\n      this._minBoundsY = 0;\n      this._maxBoundsX = 0;\n      this._maxBoundsY = 0;\n      this._isForwardFace = [];\n      this._isForwardEdge = [];\n      this._isOutsideEdge = [];\n      for (let i = 0; i < 2; i++) {\n        this._isForwardFace.push(false);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._isForwardEdge.push(false);\n        this._isOutsideEdge.push(false);\n      }\n      this._textOffset = create$6();\n      this._textPosition = create$6();\n      this._distances = [];\n      for (let i = 0; i < 4; i++) {\n        this._distances.push(0);\n      }\n      this._labelPositions = [];\n      this._labels = [];\n      this._labelSizes = [];\n      this._maxLabelSize = [];\n      this._axesLeftToRightIndexCounts = [];\n      this._axesRightToLeftIndexCounts = [];\n      this._axesLeftToRightIndexOffsets = [];\n      this._axesRightToLeftIndexOffsets = [];\n      this._labelMMatrices = [];\n      this._orientations = [];\n      for (let i = 0; i < 2; i++) {\n        this._maxLabelSize.push(create$3());\n        this._orientations.push(AxesTextOrientation.parallel);\n        this._axesLeftToRightIndexCounts.push(0);\n        this._axesRightToLeftIndexCounts.push(0);\n        this._axesLeftToRightIndexOffsets.push(0);\n        this._axesRightToLeftIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._labelMMatrices.push(create$7());\n      }\n      this._titles = [];\n      this._titleSizes = [];\n      this._titleIndexCounts = [];\n      this._titleIndexOffsets = [];\n      this._titleMMatrices = [];\n      for (let i = 0; i < 2; i++) {\n        this._titles.push(null);\n        this._titleSizes.push(core.config.axesTextTitleSize);\n        this._titleIndexCounts.push(0);\n        this._titleIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._titleMMatrices.push(create$7());\n      }\n      this._headings = [];\n      this._headingSizes = [];\n      this._headingIndexCounts = [];\n      this._headingIndexOffsets = [];\n      this._headingMMatrices = [];\n      this.isHeadingVisible = [];\n      for (let i = 0; i < 2; i++) {\n        this._headings.push(null);\n        this._headingSizes.push(core.config.axesTextHeadingSize);\n        this._headingIndexCounts.push(0);\n        this._headingIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._headingMMatrices.push(create$7());\n        this.isHeadingVisible.push(true);\n      }\n      this.isEdgeVisible = [];\n      this._edgePosition = create$6();\n      this._edgePositive = create$6();\n      this._edgeNormal = create$6();\n      this._edgeNormalTemp = create$6();\n      this._edgePositiveTemp = create$6();\n      this._isLeftToRightHorizontal = [];\n      this._isLeftToRightVertical = [];\n      this._edgeHorizontalRight = [];\n      this._edgeHorizontalUp = [];\n      this._edgeHorizontalForward = [];\n      this._edgeVerticalRight = [];\n      this._edgeVerticalUp = [];\n      this._edgeVerticalForward = [];\n      for (let i = 0; i < 4; i++) {\n        this.isEdgeVisible.push(true);\n        this._isLeftToRightHorizontal.push(false);\n        this._isLeftToRightVertical.push(false);\n        this._edgeHorizontalRight.push(create$6());\n        this._edgeHorizontalUp.push(create$6());\n        this._edgeHorizontalForward.push(create$6());\n        this._edgeVerticalRight.push(create$6());\n        this._edgeVerticalUp.push(create$6());\n        this._edgeVerticalForward.push(create$6());\n      }\n      this.isFaceVisible = [];\n      for (let i = 0; i < 2; i++) {\n        this.isFaceVisible.push(true);\n      }\n      this.arePickDivisionsVisible = [];\n      this.areFacesVisible = [];\n      this._indexTemplate = Quad$3.INDICES;\n      this.zero = create$6();\n      this._gridTicksZeros = [];\n      this._gridFaceZeros = create$3();\n      this.minorGridlines = fromValues$3(1, 1, 1);\n      this._gridTicksMinorGridlines = [];\n      this._gridFaceMinorGridlines = create$3();\n      this._gridTicksPositions = [];\n      this._gridTicksScales = [];\n      this._gridTicksIndexCounts = [];\n      this._gridTicksIndexOffsets = [];\n      this._gridFaceScale = create$6();\n      this._gridFaceIndexCounts = [];\n      this._gridFaceIndexOffsets = [];\n      this._gridFaceMMatrices = [];\n      this._gridTicksMMatrices = [];\n      this._gridTicksRotations = [];\n      for (let i = 0; i < 2; i++) {\n        this.arePickDivisionsVisible.push(true);\n        this.areFacesVisible.push(true);\n        this._gridTicksZeros.push(create$3());\n        this._gridTicksMinorGridlines.push(create$3());\n        this._gridTicksScales.push(create$6());\n        this._gridTicksIndexCounts.push(0);\n        this._gridTicksIndexOffsets.push(0);\n        this._gridFaceIndexCounts.push(0);\n        this._gridFaceIndexOffsets.push(0);\n        this._gridFaceMMatrices.push(create$7());\n      }\n      for (let i = 0; i < 4; i++) {\n        this._gridTicksMMatrices.push(create$7());\n        this._gridTicksRotations.push(create$7());\n        const _mat4 = this._gridTicksRotations[i];\n        _mat4[0] = Quad$3.EDGE_POSITIVES[i][0];\n        _mat4[1] = Quad$3.EDGE_POSITIVES[i][1];\n        _mat4[2] = Quad$3.EDGE_POSITIVES[i][2];\n        _mat4[4] = Quad$3.EDGE_NORMALS[i][0];\n        _mat4[5] = Quad$3.EDGE_NORMALS[i][1];\n        _mat4[6] = Quad$3.EDGE_NORMALS[i][2];\n        cross$1(this._vec3, Quad$3.EDGE_POSITIVES[i], Quad$3.EDGE_NORMALS[i]);\n        _mat4[8] = this._vec3[0];\n        _mat4[9] = this._vec3[1];\n        _mat4[10] = this._vec3[2];\n      }\n      this._fromValues = [null, null];\n      this._toValues = [null, null];\n      this.isDivisionPickingEnabled = [false, false];\n      this.isLabelPickingEnabled = [false, false];\n      this.isTitlePickingEnabled = [false, false];\n      this.isHeadingPickingEnabled = [false, false];\n      this.isAxisReversed = [false, false];\n      this._scalingX = 1;\n      this._scalingY = 1;\n      this._offset = create$7();\n    }\n    initialize() {\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this.isInitialized) {\n        if (this._hasChanged) {\n          const start = window.performance.now();\n          this._hasChanged = false;\n          set$8(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, 0);\n          const maxBounds = Math.max(this._size[0], this._size[1]);\n          this._size[0] *= this._scalingX / maxBounds;\n          this._size[1] *= this._scalingY / maxBounds;\n          this._updateGrids(this._size);\n          this._updateText(this._size);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n          this._core.log.write(LogLevel.info, `cartesian2d updated ${Math.round(window.performance.now() - start)}ms`);\n        }\n        if (this._rMatrix) {\n          mul(this._mMatrix, this.mMatrix, this._rMatrix);\n          mul(this._mMatrix, this._mMatrix, this._offset);\n        } else {\n          multiply$2(this._mMatrix, this.mMatrix, this._offset);\n        }\n        this._mvMatrix = create$7();\n        multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n        fromMat4(this._mat3, this._mvMatrix);\n        for (let faceId = 0; faceId < 2; faceId++) {\n          transformMat4$2(this._forward, Constants$1.VECTOR3_ZERO, this._mvMatrix);\n          transformMat3(this._normal, Quad$3.FACE_NORMALS[faceId], this._mat3);\n          this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n        }\n        this._forward[0] = this._mat3[2];\n        this._forward[1] = this._mat3[5];\n        this._forward[2] = this._mat3[8];\n        for (let edgeId = 0; edgeId < 4; edgeId++) {\n          this._isForwardEdge[edgeId] = dot$1(Quad$3.EDGE_FORWARDS[edgeId], this._forward) < 0;\n          this._distances[edgeId] = 0;\n        }\n        for (let axisId = 0; axisId < 2; axisId++) {\n          if (this.arePickDivisionsVisible[axisId]) {\n            set$5(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n            set$5(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n            const gridTicksScale = this._gridTicksScales[axisId];\n            for (let edge = 0; edge < 2; edge++) {\n              const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n              if (this.isEdgeVisible[edgeId]) {\n                let distance2 = this._distances[edgeId];\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                multiply$1(this._vec3, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n                scaleAndAdd(this._vec3, this._vec3, Quad$3.EDGE_NORMALS[edgeId], distance2);\n                translate$2(gridTicksMMatrix, this._mMatrix, this._vec3);\n                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                if (!this._isForwardEdge[edgeId]) {\n                  scale$6(gridTicksMMatrix, gridTicksMMatrix, Constants$1.VECTOR3_REFLECTX);\n                }\n                scale$6(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                this._distances[edgeId] = distance2;\n              }\n            }\n          }\n        }\n        set$5(this._gridFaceZeros, this.zero[0], this.zero[1]);\n        set$5(this._gridFaceMinorGridlines, this.minorGridlines[0], this.minorGridlines[1]);\n        for (let faceId = 0; faceId < 2; faceId++) {\n          if (this._isForwardFace[faceId]) {\n            const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n            scale$6(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n          }\n        }\n        for (let axisId = 0; axisId < 2; axisId++) {\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n            multiply$1(this._edgePosition, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n            transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n            normalize$5(this._forward, this._edgePosition);\n            negate(this._forward, this._forward);\n            cross$1(this._right, Constants$1.VECTOR3_UNITY, this._forward);\n            normalize$5(this._right, this._right);\n            cross$1(this._up, this._forward, this._right);\n            transformMat3(this._edgeNormal, Quad$3.EDGE_NORMALS[edgeId], this._mat3);\n            transformMat3(this._edgePositive, Quad$3.EDGE_POSITIVES[edgeId], this._mat3);\n            copy$6(this._edgeNormalTemp, this._edgeNormal);\n            copy$6(this._edgePositiveTemp, this._edgePositive);\n            const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n            const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n            const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n            if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n              copy$6(edgeHorizontalUp, Quad$3.EDGE_NORMALS[edgeId]);\n            } else {\n              negate(edgeHorizontalUp, Quad$3.EDGE_NORMALS[edgeId]);\n              negate(this._edgeNormalTemp, this._edgeNormalTemp);\n            }\n            if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n              this._isLeftToRightHorizontal[edgeId] = true;\n              copy$6(edgeHorizontalRight, Quad$3.EDGE_POSITIVES[edgeId]);\n            } else {\n              this._isLeftToRightHorizontal[edgeId] = false;\n              negate(edgeHorizontalRight, Quad$3.EDGE_POSITIVES[edgeId]);\n              negate(this._edgePositiveTemp, this._edgePositiveTemp);\n            }\n            cross$1(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n            if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n              this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n              negate(edgeHorizontalRight, edgeHorizontalRight);\n            }\n            cross$1(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n            const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n            const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n            const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n            if (dot$1(this._edgeNormal, this._right) < 0) {\n              copy$6(edgeVerticalUp, Quad$3.EDGE_NORMALS[edgeId]);\n            } else {\n              negate(edgeVerticalUp, Quad$3.EDGE_NORMALS[edgeId]);\n              negate(this._edgeNormal, this._edgeNormal);\n            }\n            if (dot$1(this._edgePositive, this._up) < 0) {\n              this._isLeftToRightVertical[edgeId] = true;\n              copy$6(edgeVerticalRight, Quad$3.EDGE_POSITIVES[edgeId]);\n            } else {\n              this._isLeftToRightVertical[edgeId] = false;\n              negate(edgeVerticalRight, Quad$3.EDGE_POSITIVES[edgeId]);\n              negate(this._edgePositive, this._edgePositive);\n            }\n            cross$1(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n            if (dot$1(edgeVerticalForward, this._forward) < 0) {\n              this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n              negate(edgeVerticalRight, edgeVerticalRight);\n            }\n            cross$1(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n            if (this.isEdgeVisible[edgeId]) {\n              if (this._labels[axisId]) {\n                this._updateLabels(axisId, edgeId);\n              }\n              if (this._titles[axisId]) {\n                this._updateTitle(axisId, edgeId);\n              }\n            }\n            if (this.isHeadingVisible[edgeId]) {\n              this._updateHeading(axisId, edgeId);\n            }\n          }\n        }\n      }\n    }\n    _updateLabels(axisId, edgeId) {\n      const orientation = this._orientations[axisId];\n      let distance2 = this._distances[edgeId];\n      let maxLabelSize = this._maxLabelSize[axisId][1];\n      if (orientation == AxesTextOrientation.parallel)\n        maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n      distance2 += maxLabelSize * 0.5;\n      multiply$1(this._vec3, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$3.EDGE_NORMALS[edgeId], distance2);\n      const labelMMatrix = this._labelMMatrices[edgeId];\n      labelMMatrix[12] = this._vec3[0];\n      labelMMatrix[13] = this._vec3[1];\n      labelMMatrix[14] = this._vec3[2];\n      if (orientation == AxesTextOrientation.parallel) {\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      } else {\n        const right = this._edgeVerticalRight[edgeId];\n        const up = this._edgeVerticalUp[edgeId];\n        const forward = this._edgeVerticalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      }\n      multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n      if (orientation == AxesTextOrientation.perpendicular) {\n        multiply$2(labelMMatrix, labelMMatrix, Constants$1.MAT4_ROTATION_MINUS_90);\n      }\n      distance2 += maxLabelSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateTitle(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n      distance2 += titleTextSize * 0.5;\n      multiply$1(this._vec3, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$3.EDGE_NORMALS[edgeId], distance2);\n      const titleMMatrix = this._titleMMatrices[edgeId];\n      titleMMatrix[12] = this._vec3[0];\n      titleMMatrix[13] = this._vec3[1];\n      titleMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      titleMMatrix[0] = right[0];\n      titleMMatrix[1] = right[1];\n      titleMMatrix[2] = right[2];\n      titleMMatrix[4] = up[0];\n      titleMMatrix[5] = up[1];\n      titleMMatrix[6] = up[2];\n      titleMMatrix[8] = forward[0];\n      titleMMatrix[9] = forward[1];\n      titleMMatrix[10] = forward[2];\n      multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n      distance2 += titleTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateHeading(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n      distance2 += headingTextSize * 0.5;\n      multiply$1(this._vec3, Quad$3.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$3.EDGE_NORMALS[edgeId], distance2);\n      const headingMMatrix = this._headingMMatrices[edgeId];\n      headingMMatrix[12] = this._vec3[0];\n      headingMMatrix[13] = this._vec3[1];\n      headingMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      headingMMatrix[0] = right[0];\n      headingMMatrix[1] = right[1];\n      headingMMatrix[2] = right[2];\n      headingMMatrix[4] = up[0];\n      headingMMatrix[5] = up[1];\n      headingMMatrix[6] = up[2];\n      headingMMatrix[8] = forward[0];\n      headingMMatrix[9] = forward[1];\n      headingMMatrix[10] = forward[2];\n      multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n      distance2 += headingTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateGrids(size) {\n      let offset2 = 0;\n      this.pickGridLookup = {};\n      this._pickGrid = [];\n      const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n      const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n      const count2 = 2 * (xDivisions * yDivisions) + xDivisions + yDivisions;\n      const byteLength = PickGridVertex.SIZE_BYTES * count2 * 4;\n      if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n        this._gridVertices = new ArrayBuffer(byteLength);\n        this._gridVerticesView = new DataView(this._gridVertices);\n        this._gridIndices = new Uint16Array(count2 * 6);\n      }\n      for (let axisId2 = 0; axisId2 < 2; axisId2++) {\n        const width2 = size[axisId2];\n        set$8(this._gridTicksScales[axisId2], width2, this._gridPickDivisionHeight, 1);\n        offset2 = this._updateGridTicks(axisId2, this._gridVerticesView, this._gridIndices, offset2);\n        this._gridFaceScale[axisId2] = size[axisId2] == 0 ? 1 : size[axisId2];\n      }\n      const axisId = 2;\n      this._gridFaceScale[axisId] = 1;\n      for (let faceId = 0; faceId < 2; faceId++) {\n        offset2 = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset2);\n      }\n    }\n    _updateText(size) {\n      let glyphOffset = 0;\n      let count2 = 0;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const labels = this._labels[axisId];\n        if (labels) {\n          for (let i = 0; i < labels.length; i++) {\n            count2 += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n          }\n        }\n        const title = this._titles[axisId];\n        if (title) {\n          count2 += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n        }\n        const heading = this._headings[axisId];\n        if (heading) {\n          count2 += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n      }\n      const byteLength = PositionTexturePickVertex.SIZE_BYTES * count2 * 4;\n      if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n        this._textVertices = new ArrayBuffer(byteLength);\n        this._textVerticesView = new DataView(this._textVertices);\n        this._textIndices = new Uint16Array(count2 * 6);\n      }\n      this.pickLabelLookup = {};\n      this._pickLabel = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._labels[axisId]) {\n          const width2 = size[axisId];\n          const maxLabelSize = this._maxLabelSize[axisId];\n          const orientation = this._orientations[axisId];\n          set$5(maxLabelSize, 0, 0);\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateLeftToRightAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateRightToLeftAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesLeftToRightIndexCounts[axisId] = 0;\n          this._axesRightToLeftIndexCounts[axisId] = 0;\n          this._maxLabelSize[axisId][0] = 0;\n          this._maxLabelSize[axisId][1] = 0;\n        }\n      }\n      this.pickTitleLookup = {};\n      this._pickTitle = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._titles[axisId]) {\n          set$8(this._textPosition, 0, 0, 0);\n          set$8(this._textOffset, 0, 0, 0);\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n          const scale2 = this._titleSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n          this.pickTitleLookup[pickId] = this._pickTitle.length;\n          this._pickTitle.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          this._titleIndexCounts[axisId] = 0;\n        }\n      }\n      this.pickHeadingLookup = {};\n      this._pickHeading = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._headings[axisId]) {\n          set$8(this._textPosition, 0, 0, 0);\n          set$8(this._textOffset, 0, 0, 0);\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n          const scale2 = this._headingSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n          this.pickHeadingLookup[pickId] = this._pickHeading.length;\n          this._pickHeading.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          this._headingIndexCounts[axisId] = 0;\n        }\n      }\n    }\n    _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions2, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions2[label2] : positions2[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$8(this._textPosition, (position2 - 0.5) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = position2 == 0 ? 0 : position2 == 1 ? -width2 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            maxSize[0] = Math.max(width2, maxSize[0]);\n            maxSize[1] = Math.max(lineHeight2, maxSize[1]);\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$8(this._textPosition, 0, (position2 - 0.5) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = position2 == 0 ? 0 : position2 == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n            }\n            maxSize[0] = Math.max(lineHeight2, maxSize[0]);\n            maxSize[1] = Math.max(width2, maxSize[1]);\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions2, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions2[label2] : positions2[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$8(this._textPosition, (0.5 - position2) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = label2 == 0 ? -width2 : label2 == labels.length - 1 ? 0 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$8(this._textPosition, 0, (0.5 - position2) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = label2 == 0 ? -maxGlyphTop : label2 == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n            }\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset2) {\n      this._gridTicksIndexOffsets[axisId] = offset2 * 6;\n      if (this._gridTicksPositions[axisId]) {\n        const axes = create$6();\n        const positions2 = this._gridTicksPositions[axisId];\n        const isAxisReversed = this.isAxisReversed[axisId];\n        let vertexOffset = offset2 * 4;\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const left = isAxisReversed ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const right = isAxisReversed ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId] = position2 + 1;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n          this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n          this._pickGrid.push(axes[0]);\n          this._pickGrid.push(axes[1]);\n          this._pickGrid.push(axes[2]);\n          let indexOffset = offset2 * 6;\n          for (let j = 0; j < this._indexTemplate.length; j++) {\n            indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n          }\n          set$7(this._bounds, left + 0.5, 0, right + 0.5, 1);\n          this._translation[0] = left;\n          this._translation[1] = 0.5;\n          this._translation[2] = 0;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 1;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = left;\n          this._translation[1] = -0.5;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 0;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants$1.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          offset2++;\n        }\n      }\n      this._gridTicksIndexCounts[axisId] = offset2 * 6 - this._gridTicksIndexOffsets[axisId];\n      return offset2;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset2) {\n      set$8(this._translation, 0, 0, 0);\n      this._gridFaceIndexOffsets[faceId] = offset2 * 6;\n      const axisId2 = axisId == 0 ? 1 : 0;\n      const axisId3 = axisId == 2 ? 1 : 2;\n      if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n        const axes = create$6();\n        negate(this._normal, Quad$3.FACE_NORMALS[faceId]);\n        const positions2 = this._gridTicksPositions[axisId2];\n        const positions3 = this._gridTicksPositions[axisId3];\n        const isAxisReversed2 = this.isAxisReversed[axisId2];\n        const isAxisReversed3 = this.isAxisReversed[axisId3];\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId2] = position2 + 1;\n          let vertexOffset = offset2 * 4;\n          for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n            const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n            const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n            axes[axisId3] = position3 + 1;\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n            this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n            this._pickGrid.push(axes[0]);\n            this._pickGrid.push(axes[1]);\n            this._pickGrid.push(axes[2]);\n            let indexOffset = offset2 * 6;\n            for (let i = 0; i < this._indexTemplate.length; i++) {\n              indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n            }\n            set$7(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = max3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = max3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = min3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = min3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            offset2++;\n          }\n        }\n      }\n      this._gridFaceIndexCounts[faceId] = offset2 * 6 - this._gridFaceIndexOffsets[faceId];\n      return offset2;\n    }\n  }\n  class Glyph {\n    toJSON() {\n      return {\n        key: this.key,\n        char: this.char,\n        width: this.width,\n        height: this.height,\n        top: this.top,\n        left: this.left,\n        advance: this.advance,\n        u0: this.u0,\n        v0: this.v0,\n        u1: this.u1,\n        v1: this.v1\n      };\n    }\n  }\n  let FontVisual$2 = class FontVisual {\n    update() {\n    }\n    constructor(font2) {\n      this.font = font2;\n    }\n  };\n  class Font {\n    get atlas() {\n      return this._rasterizer.fontAtlas;\n    }\n    get count() {\n      return this._chars.size;\n    }\n    constructor(core, rasterizer) {\n      this._core = core;\n      this._rasterizer = rasterizer;\n      this._chars = /* @__PURE__ */ new Set();\n      this._previousSize = 0;\n      this.glyphs = {};\n    }\n    addGlyph(char) {\n      if (!this._chars.has(char)) {\n        this._chars.add(char);\n        this._rasterizer.draw(char);\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._core.log.write(LogLevel.info, `${this.name} added ${this._chars.size - this._previousSize} new glyphs`);\n        this._previousSize = this._chars.size;\n        if (this.hasChangedCallback) {\n          this.hasChangedCallback();\n        }\n      }\n    }\n    toJSON() {\n      const glyphs = [];\n      for (let key2 in this.glyphs) {\n        const glyph = this.glyphs[key2];\n        glyphs.push(glyph.toJSON());\n      }\n      return {\n        name: this.name,\n        size: this.size,\n        border: this.border,\n        glyphs,\n        edgeValue: this.edgeValue\n      };\n    }\n  }\n  class FontAtlas {\n    constructor(width2, height2) {\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = width2;\n      canvas.height = height2;\n      const context2 = canvas.getContext(\"2d\");\n      context2.clearRect(0, 0, width2, height2);\n      this.imageData = context2.getImageData(0, 0, width2, height2);\n      this.x = 0;\n      this.top = new Uint16Array(width2);\n    }\n  }\n  class FontRasterizer {\n    get font() {\n      return this._font;\n    }\n    get fontAtlas() {\n      return this._fontAtlas;\n    }\n    constructor(core, options2) {\n      let start = performance.now();\n      this._core = core;\n      this._fontAtlas = options2.fontAtlas;\n      this._fontSize = options2.fontSize;\n      this._border = options2.border;\n      this._fontFamily = options2.fontFamily;\n      this._fontWeight = options2.fontWeight;\n      this._fontStyle = options2.fontStyle;\n      this._baseline = options2.baseline;\n      this._maxDistance = options2.maxDistance;\n      this._edgeValue = options2.edgeValue;\n      this._font = new Font(core, this);\n      this._font.name = `${this._fontFamily}${this._fontSize}${this._fontWeight == \"normal\" ? \"\" : this._fontWeight}${this._fontStyle == \"normal\" ? \"\" : this._fontStyle}`.replace(/[^a-z0-9,]/ig, \"\").toLowerCase();\n      this._font.size = this._fontSize;\n      this._font.border = this._border;\n      this._font.edgeValue = this._edgeValue;\n      const glyphRasterizerOptions = {\n        baseline: this._baseline,\n        border: this._border,\n        edgeValue: this._edgeValue,\n        fontFamily: this._fontFamily,\n        fontSize: this._fontSize,\n        fontStyle: this._fontStyle,\n        fontWeight: this._fontWeight,\n        maxDistance: this._maxDistance\n      };\n      this._glyphRasterizer = new GlyphRasterizer(core, glyphRasterizerOptions);\n      this._core.log.write(LogLevel.info, `font rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n      const glyph = this._glyphRasterizer.draw(char);\n      const texWidth = glyph.width + 2 * this._border;\n      const texHeight = glyph.height + 2 * this._border;\n      const width2 = this._fontAtlas.imageData.width;\n      const height2 = this._fontAtlas.imageData.height;\n      if (this._fontAtlas.x + texWidth > width2) {\n        this._fontAtlas.x = 0;\n      }\n      let y2 = 0;\n      for (let x2 = this._fontAtlas.x; x2 < this._fontAtlas.x + texWidth; x2++) {\n        y2 = Math.max(y2, this._fontAtlas.top[x2]);\n      }\n      if (y2 + texHeight > height2) {\n        this._core.log.write(LogLevel.warn, `${this._font.name} height overflow`);\n      }\n      for (let x2 = this._fontAtlas.x; x2 < this._fontAtlas.x + texWidth; x2++) {\n        this._fontAtlas.top[x2] = y2 + texHeight;\n      }\n      glyph.u0 = this._fontAtlas.x / width2;\n      glyph.v0 = y2 / height2;\n      glyph.u1 = (this._fontAtlas.x + texWidth) / width2;\n      glyph.v1 = (y2 + texHeight) / height2;\n      this._font.glyphs[char] = glyph;\n      for (let i = 0; i < glyph.distances.length; i++) {\n        const distance2 = glyph.distances[i];\n        const dataX = i % texWidth;\n        const dataY = Math.floor(i / texWidth);\n        const offset2 = (this._fontAtlas.x + dataX + (y2 + dataY) * width2) * 4;\n        this._fontAtlas.imageData.data[offset2 + 0] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 1] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 2] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 3] = 255;\n      }\n      this._fontAtlas.x += texWidth;\n    }\n  }\n  class GlyphRasterizer {\n    constructor(core, options2) {\n      let start = performance.now();\n      this._core = core;\n      this._fontSize = options2.fontSize;\n      this._border = options2.border;\n      this._fontFamily = options2.fontFamily;\n      this._fontWeight = options2.fontWeight;\n      this._fontStyle = options2.fontStyle;\n      this._baseline = options2.baseline;\n      this._maxDistance = options2.maxDistance;\n      this._edgeValue = options2.edgeValue;\n      this._size = this._fontSize + this._border * 2;\n      this._size += this._border * 2;\n      this._gridOuter = new Float64Array(this._size * this._size);\n      this._gridInner = new Float64Array(this._size * this._size);\n      this._f = new Float64Array(this._size);\n      this._z = new Float64Array(this._size + 1);\n      this._v = new Uint16Array(this._size);\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = canvas.height = this._size;\n      this._context = canvas.getContext(\"2d\", { willReadFrequently: true });\n      this._context.font = `${this._fontStyle} ${this._fontWeight} ${this._fontSize}px ${this._fontFamily} `;\n      this._context.textBaseline = this._baseline;\n      this._context.textAlign = \"left\";\n      this._context.fillStyle = \"black\";\n      this._core.log.write(LogLevel.info, `glyph rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n      const textMetrics2 = this._context.measureText(char);\n      const glyphLeft = 0;\n      const glyphTop = Math.floor(textMetrics2.actualBoundingBoxAscent);\n      let glyphWidth = Math.ceil(textMetrics2.actualBoundingBoxRight);\n      let glyphHeight = Math.ceil(textMetrics2.actualBoundingBoxAscent) + Math.ceil(textMetrics2.actualBoundingBoxDescent);\n      glyphWidth = Math.min(this._size - this._border, glyphWidth);\n      glyphHeight = Math.min(this._size - this._border, glyphHeight);\n      const width2 = glyphWidth + 2 * this._border;\n      const height2 = glyphHeight + 2 * this._border;\n      const length2 = width2 * height2;\n      const distances = new Uint8ClampedArray(length2);\n      const gradientsX = new Uint8ClampedArray(length2);\n      const gradientsY = new Uint8ClampedArray(length2);\n      const pixels = new Uint8ClampedArray(length2);\n      const glyph = new Glyph();\n      glyph.char = char;\n      glyph.key = char.codePointAt(0);\n      glyph.distances = distances;\n      glyph.gradientsX = gradientsX;\n      glyph.gradientsY = gradientsY;\n      glyph.pixels = pixels;\n      glyph.width = glyphWidth;\n      glyph.height = glyphHeight;\n      glyph.top = glyphTop;\n      glyph.left = glyphLeft;\n      glyph.advance = textMetrics2.width;\n      if (glyphWidth == 0 || glyphHeight == 0) {\n        return glyph;\n      }\n      this._context.clearRect(this._border, this._border, glyphWidth, glyphHeight);\n      this._context.fillText(char, this._border, this._border + glyphTop);\n      const imgData = this._context.getImageData(this._border, this._border, glyphWidth, glyphHeight);\n      for (let i = 0; i < length2; i++) {\n        this._gridOuter[i] = Number.MAX_VALUE;\n        this._gridInner[i] = 0;\n      }\n      for (let y2 = 0; y2 < glyphHeight; y2++) {\n        for (let x2 = 0; x2 < glyphWidth; x2++) {\n          const a2 = imgData.data[4 * (y2 * glyphWidth + x2) + 3] / 255;\n          if (a2 > 0) {\n            const j = (y2 + this._border) * width2 + x2 + this._border;\n            if (a2 == 1) {\n              this._gridOuter[j] = 0;\n              this._gridInner[j] = Number.MAX_VALUE;\n            } else {\n              const d2 = 0.5 - a2;\n              this._gridOuter[j] = d2 > 0 ? d2 * d2 : 0;\n              this._gridInner[j] = d2 < 0 ? d2 * d2 : 0;\n              pixels[j] = 255;\n            }\n          }\n        }\n      }\n      this._edt(this._gridOuter, 0, 0, width2, height2, width2, this._f, this._v, this._z);\n      this._edt(this._gridInner, this._border, this._border, glyphWidth, glyphHeight, width2, this._f, this._v, this._z);\n      const distances2 = new Float32Array(length2);\n      for (let i = 0; i < length2; i++) {\n        const distance2 = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n        distances[i] = Math.round(this._edgeValue - distance2 * 255 / this._maxDistance);\n        distances2[i] = distance2;\n      }\n      for (let i = 0; i < length2; i++) {\n        const x2 = i % width2;\n        const y2 = Math.floor(i / width2);\n        const d2 = distances2[i];\n        const sign2 = d2 < 0 ? -1 : 1;\n        const x02 = x2 > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n        const x12 = x2 < width2 - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n        const y02 = y2 > 0 ? distances2[i - width2] : Number.MAX_VALUE;\n        const y12 = y2 < height2 - 1 ? distances2[i + width2] : Number.MAX_VALUE;\n        let gradientX = sign2 * x02 < sign2 * x12 ? d2 - x02 : x12 - d2;\n        let gradientY = sign2 * y02 < sign2 * y12 ? y02 - d2 : d2 - y12;\n        gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 255);\n        gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 255);\n      }\n      return glyph;\n    }\n    _edt(data2, x02, y02, width2, height2, gridSize, f, v, z2) {\n      for (let x2 = x02; x2 < x02 + width2; x2++)\n        this._edt1d(data2, y02 * gridSize + x2, gridSize, height2, f, v, z2);\n      for (let y2 = y02; y2 < y02 + height2; y2++)\n        this._edt1d(data2, y2 * gridSize + x02, 1, width2, f, v, z2);\n    }\n    _edt1d(grid2, offset2, stride, n, f, v, z2) {\n      v[0] = 0;\n      z2[0] = -Number.MAX_VALUE;\n      z2[1] = Number.MAX_VALUE;\n      f[0] = grid2[offset2];\n      for (let q = 1, k = 0, s2 = 0; q < n; q++) {\n        f[q] = grid2[offset2 + q * stride];\n        const q2 = q * q;\n        do {\n          const r = v[k];\n          s2 = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n        } while (s2 <= z2[k] && --k > -1);\n        k++;\n        v[k] = q;\n        z2[k] = s2;\n        z2[k + 1] = Number.MAX_VALUE;\n      }\n      for (let q = 0, k = 0; q < n; q++) {\n        while (z2[k + 1] < q) {\n          k++;\n        }\n        const r = v[k];\n        const qr = q - r;\n        grid2[offset2 + q * stride] = f[r] + qr * qr;\n      }\n    }\n  }\n  class ManipulationProcessor {\n    get manipulators() {\n      return this._manipulators;\n    }\n    get count() {\n      return this._count;\n    }\n    get isDragging() {\n      return this._isDragging;\n    }\n    constructor(core) {\n      this._core = core;\n      this._count = 0;\n      this._centroid = create$6();\n      this._previousCentroid = create$6();\n      this._relativePositionToCentroid = create$6();\n      this._directionToCentroid = create$6();\n      this._previousDirectionToCentroid = create$6();\n      this._manipulators = {};\n      this._removedManipulators = [];\n      this.cumulativeTranslation = create$6();\n      this.translationDelta = create$6();\n      this.centroid = create$6();\n      this.maxScale = Number.MAX_VALUE;\n      this.twistAxis = fromValues$3(0, 0, 1);\n      this.initialize();\n    }\n    update(elapsedTime, manipulators) {\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        if (!manipulators[manipulator.id]) {\n          if (this.removeManipulator) {\n            this.removeManipulator(manipulator);\n          }\n          this._removedManipulators.push(manipulator.id);\n        }\n      }\n      if (this._removedManipulators.length > 0) {\n        for (let i = 0; i < this._removedManipulators.length; i++) {\n          delete this._manipulators[this._removedManipulators[i]];\n          this._count--;\n        }\n        this._removedManipulators = [];\n      }\n      for (const key2 in manipulators) {\n        const manipulator = manipulators[key2];\n        if (!this._manipulators[manipulator.id]) {\n          if (!this.addManipulator || this.addManipulator(manipulator)) {\n            copy$6(manipulator.initialPosition, manipulator.position);\n            this._manipulators[manipulator.id] = manipulator;\n            this._count++;\n          }\n        }\n      }\n      set$8(this.translationDelta, 0, 0, 0);\n      this.scaleDelta = 0;\n      this.twistDelta = 0;\n      if (this._count > 0) {\n        if (this._previousCount > 0) {\n          if (this.prepareManipulation) {\n            this.prepareManipulation();\n          }\n          this._process();\n          if (this.processManipulation) {\n            this.processManipulation(elapsedTime);\n          }\n        } else {\n          this.initialize();\n          if (this.beginManipulation) {\n            this.beginManipulation();\n          }\n        }\n      } else {\n        if (this._previousCount > 0) {\n          if (this.endManipulation) {\n            this.endManipulation();\n          }\n        }\n      }\n      this._isDragging = this._count == 1 && squaredLength(this.cumulativeTranslation) > this._core.config.dragToleranceSquared || this._count > 1;\n      this._previousCount = this._count;\n    }\n    initialize() {\n      set$8(this.centroid, 0, 0, 0);\n      set$8(this.cumulativeTranslation, 0, 0, 0);\n      this.cumulativeScale = 1;\n      this.cumulativeTwist = 0;\n    }\n    _process() {\n      if (this._previousCount > 0) {\n        let persisted = 0;\n        for (const key2 in this._manipulators) {\n          const manipulator = this._manipulators[key2];\n          if (manipulator.isPersisted) {\n            persisted++;\n          }\n        }\n        const removed = this._previousCount - persisted;\n        if (persisted > 0) {\n          if (removed > 0) {\n            copy$6(this._centroid, this._previousCentroid);\n          } else {\n            set$8(this._centroid, 0, 0, 0);\n            for (const key2 in this._manipulators) {\n              const manipulator = this._manipulators[key2];\n              if (manipulator.isPersisted) {\n                add$4(this._centroid, this._centroid, manipulator.position);\n              }\n            }\n            scale$5(this._centroid, this._centroid, 1 / persisted);\n          }\n          for (const key2 in this._manipulators) {\n            const manipulator = this._manipulators[key2];\n            if (manipulator.isPersisted) {\n              manipulator.maxTranslationSquared = Math.max(manipulator.maxTranslationSquared, squaredDistance(manipulator.position, manipulator.initialPosition));\n              add$4(this.translationDelta, this.translationDelta, manipulator.position);\n              subtract(this.translationDelta, this.translationDelta, manipulator.previousPosition);\n              subtract(this._relativePositionToCentroid, manipulator.position, this._centroid);\n              const distanceToCentroidSquared = squaredLength(this._relativePositionToCentroid);\n              if (distanceToCentroidSquared < this._core.config.manipulatorMinRelativeDistanceSquared) {\n                this.scaleDelta += 1;\n              } else {\n                const distanceToCentroid = Math.sqrt(distanceToCentroidSquared);\n                const previousDistanceToCentroidSquared = squaredLength(manipulator.previousPositionRelativeToCentroid);\n                const previousDistanceToCentroid = Math.sqrt(previousDistanceToCentroidSquared);\n                this.scaleDelta += distanceToCentroid / previousDistanceToCentroid;\n                scale$5(this._directionToCentroid, this._relativePositionToCentroid, 1 / distanceToCentroid);\n                scale$5(this._previousDirectionToCentroid, manipulator.previousPositionRelativeToCentroid, 1 / previousDistanceToCentroid);\n                this.twistDelta += AngleHelper.signedAngleBetweenVectors(this._previousDirectionToCentroid, this._directionToCentroid, this.twistAxis);\n              }\n            }\n          }\n          scale$5(this.translationDelta, this.translationDelta, 1 / persisted);\n          add$4(this.cumulativeTranslation, this.cumulativeTranslation, this.translationDelta);\n          this.scaleDelta /= persisted;\n          this.cumulativeScale = MathHelper.clamp(this.cumulativeScale * this.scaleDelta, this.minScale, this.maxScale);\n          this.scaleDelta -= 1;\n          this.twistDelta /= persisted;\n          this.cumulativeTwist += this.twistDelta;\n        }\n      }\n      set$8(this.centroid, 0, 0, 0);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        add$4(this.centroid, this.centroid, manipulator.position);\n      }\n      scale$5(this.centroid, this.centroid, 1 / this._count);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        subtract(manipulator.positionRelativeToCentroid, manipulator.position, this.centroid);\n      }\n      copy$6(this._previousCentroid, this.centroid);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        manipulator.isPersisted = true;\n        copy$6(manipulator.previousPosition, manipulator.position);\n        copy$6(manipulator.previousRotationAxis, manipulator.rotationAxis);\n        copy$6(manipulator.previousPositionRelativeToCentroid, manipulator.positionRelativeToCentroid);\n      }\n    }\n  }\n  class MouseWheel {\n    constructor(core) {\n      this._core = core;\n      this._previousTotal = 0;\n      this.total = 0;\n    }\n    initialize(element2) {\n      element2.addEventListener(\"wheel\", (e) => {\n        e.preventDefault();\n        const wheelEvent = e;\n        this.total += wheelEvent.deltaY;\n      }, { passive: false });\n    }\n    update(elapsedTime) {\n      const total = this.total;\n      this.delta = total - this._previousTotal;\n      this._previousTotal = total;\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`mse whl ${this.total < 0 ? \"\" : \" \"}${Math.round(this.total)}`);\n      }\n    }\n  }\n  class Manipulator {\n    constructor() {\n      this.pickedIndex = 0;\n      this.maxTranslationSquared = 0;\n      this.initialPosition = create$6();\n      this.position = create$6();\n      this.previousPosition = create$6();\n      this.holdOrigin = create$6();\n      this.positionRelativeToCentroid = create$6();\n      this.previousPositionRelativeToCentroid = create$6();\n      this.rotationAxis = create$6();\n      this.previousRotationAxis = create$6();\n    }\n  }\n  class Pointers {\n    get hoverX() {\n      return this._hoverX;\n    }\n    get hoverY() {\n      return this._hoverY;\n    }\n    get hoverId() {\n      return this._hoverId;\n    }\n    constructor(core, manipulators) {\n      this._core = core;\n      this._manipulators = manipulators;\n    }\n    initialize(element2) {\n      this._element = element2;\n      element2.addEventListener(\"pointerdown\", (e) => this._handlePointerDown(e), { passive: true });\n      element2.addEventListener(\"pointermove\", (e) => this._handlePointerMove(e), { passive: true });\n      element2.addEventListener(\"pointerup\", (e) => this._handlePointerUp(e), { passive: true });\n      element2.addEventListener(\"pointercancel\", (e) => this._handlePointerCancel(e), { passive: true });\n      element2.addEventListener(\"pointerleave\", (e) => this._handlePointerLeave(e), { passive: true });\n      element2.addEventListener(\"pointerout\", (e) => this._handlePointerOut(e), { passive: true });\n    }\n    update(elapsedTime) {\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`pen rot  ${(this._tiltX | 0).toFixed(3)},${(this._tiltY | 0).toFixed(3)},${(this._twist | 0).toFixed(3)}`);\n        this._core.debugText.addLine(`hov pos  ${this.hoverX ? `${this.hoverX.toFixed(3)},${this.hoverY.toFixed(3)}px` : \"\"}`);\n      }\n    }\n    _handlePointerDown(e) {\n      this._element.focus();\n      const devicePixelRatio2 = this._core.renderer.devicePixelRatio;\n      const manipulator = new Manipulator();\n      const id2 = e.pointerId;\n      const x2 = e.offsetX * devicePixelRatio2;\n      const y2 = e.offsetY * devicePixelRatio2;\n      manipulator.id = id2;\n      manipulator.position[0] = x2;\n      manipulator.position[1] = y2;\n      manipulator.type = e.pointerType;\n      manipulator.button = e.button;\n      manipulator.shiftKey = e.shiftKey;\n      manipulator.ctrlKey = e.ctrlKey;\n      manipulator.altKey = e.altKey;\n      manipulator.event = e;\n      this._manipulators[id2] = manipulator;\n      this._hoverId = id2;\n      this._hoverX = x2;\n      this._hoverY = y2;\n    }\n    _handlePointerMove(e) {\n      const devicePixelRatio2 = this._core.renderer.devicePixelRatio;\n      const x2 = e.offsetX * devicePixelRatio2;\n      const y2 = e.offsetY * devicePixelRatio2;\n      const id2 = e.pointerId;\n      const manipulator = this._manipulators[id2];\n      if (manipulator) {\n        manipulator.position[0] = x2;\n        manipulator.position[1] = y2;\n        manipulator.event = e;\n      }\n      switch (e.pointerType) {\n        case \"mouse\":\n          this._hoverId = id2;\n          this._hoverX = x2;\n          this._hoverY = y2;\n          break;\n        case \"pen\":\n          this._hoverId = id2;\n          this._hoverX = x2;\n          this._hoverY = y2;\n          this._tiltX = e.tiltX;\n          this._tiltY = e.tiltY;\n          this._twist = e.twist;\n          break;\n      }\n    }\n    _handlePointerUp(e) {\n      const manipulator = this._manipulators[e.pointerId];\n      if (manipulator) {\n        manipulator.event = e;\n      }\n      this._remove(e.pointerId);\n    }\n    _handlePointerCancel(e) {\n      this._remove(e.pointerId);\n    }\n    _handlePointerLeave(e) {\n      this._resetHover();\n      this._remove(e.pointerId);\n    }\n    _handlePointerOut(e) {\n      this._resetHover();\n      this._remove(e.pointerId);\n    }\n    _resetHover() {\n      this._hoverId = null;\n      this._hoverX = null;\n      this._hoverY = null;\n    }\n    _remove(pointerId) {\n      const manipulator = this._manipulators[pointerId];\n      if (manipulator) {\n        delete this._manipulators[pointerId];\n      }\n    }\n  }\n  class AnimationHelper {\n    static smoothStep(value2) {\n      return value2 * value2 * (3 - 2 * value2);\n    }\n    static damp(value2, target2, threshold2, dampening) {\n      if (Math.abs(target2) < threshold2) {\n        return MathHelper.lerp(value2, 0, dampening);\n      } else {\n        return MathHelper.lerp(value2, target2, dampening);\n      }\n    }\n  }\n  class Keyboard {\n    constructor(core) {\n      this._core = core;\n      this._pressedKeys = /* @__PURE__ */ new Set();\n      this._previousPressedKeys = /* @__PURE__ */ new Set();\n    }\n    initialize(element2) {\n      element2.addEventListener(\"keydown\", (e) => {\n        this._handleKeyDown(e);\n      }, false);\n      element2.addEventListener(\"keyup\", (e) => {\n        this._handleKeyUp(e);\n      }, false);\n    }\n    update(elapsedTime) {\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`key tot  ${this._pressedKeys.size}`);\n      }\n    }\n    isKeyDown(key2) {\n      return this._pressedKeys.has(key2);\n    }\n    wasKeyReleased(key2) {\n      if (this._pressedKeys.has(key2)) {\n        if (!this._previousPressedKeys.has(key2)) {\n          this._previousPressedKeys.add(key2);\n          return true;\n        }\n      } else {\n        this._previousPressedKeys.delete(key2);\n      }\n      return false;\n    }\n    _handleKeyDown(e) {\n      const keyboardEvent = e;\n      const key2 = keyboardEvent.key;\n      if (!this._pressedKeys.has(key2)) {\n        this._pressedKeys.add(key2);\n      }\n    }\n    _handleKeyUp(e) {\n      const keyboardEvent = e;\n      const key2 = keyboardEvent.key;\n      if (this._pressedKeys.has(key2)) {\n        this._pressedKeys.delete(key2);\n      }\n    }\n  }\n  class Manager {\n    constructor(core) {\n      this._manipulators = {};\n      this._core = core;\n      this._vec3 = create$6();\n      this._manipulationProcessor = new ManipulationProcessor(core);\n      this._manipulators = {};\n      this._pointers = new Pointers(core, this._manipulators);\n      this._pointers.initialize(core.container);\n      this._mouseWheel = new MouseWheel(core);\n      this._mouseWheel.initialize(core.container);\n      this._keyboard = new Keyboard(core);\n      this._keyboard.initialize(core.container);\n      this.isPickingEnabled = true;\n      this.mouseWheelZoomScale = this._core.config.mouseWheelZoomScale;\n      this.mouseWheelRotationScale = this._core.config.mouseWheelRotationScale;\n      this.multiTouchZoomScale = this._core.config.multiTouchZoomScale;\n      this.pickHoldDelay = this._core.config.pickHoldDelay;\n      this.pickSelectDelay = this._core.config.pickSelectDelay;\n      const rightButton2 = 2;\n      this.singleTouchAction = (manipulator) => {\n        if (manipulator.type == \"mouse\" && manipulator.button == rightButton2 || manipulator.shiftKey || manipulator.ctrlKey) {\n          return SingleTouchAction.translate;\n        } else if (manipulator.altKey || manipulator.type == \"pen\" && manipulator.button == rightButton2) {\n          return SingleTouchAction.lasso;\n        } else {\n          return SingleTouchAction.rotate;\n        }\n      };\n      this.mouseWheelAction = (keyboard) => {\n        if (this._keyboard.isKeyDown(\"Control\")) {\n          return MouseWheelAction.rotateY;\n        } else {\n          return MouseWheelAction.zoom;\n        }\n      };\n      this.lassoPickType = PickType.data;\n      this._thumbstickX = 0;\n      this._previousControllerButtonPressed = [false, false, false, false];\n      this._quat0 = create$4();\n      this._quat1 = create$4();\n    }\n    update(elapsedTime, xrFrame) {\n      if (xrFrame) {\n        const inputSources = this._core.webXRSession.inputSources;\n        if (inputSources.length > 0 && this._core.renderer.controllers.length > 0) {\n          const inputSource = inputSources[0];\n          const controllerVisual = this._core.renderer.controllers[0];\n          if (inputSource.gripSpace && inputSource.targetRayMode == \"tracked-pointer\") {\n            const gripPose = xrFrame.getPose(inputSource.gripSpace, this._core.renderer.webXRReferenceSpace);\n            if (gripPose) {\n              controllerVisual.mMatrix = gripPose.transform.matrix;\n            }\n            const gamepad = inputSource.gamepad;\n            this._core.renderer.isPickingEnabled = false;\n            const rayPose = xrFrame.getPose(inputSource.targetRaySpace, this._core.renderer.webXRReferenceSpace);\n            if (rayPose) {\n              controllerVisual.rayMMatrix = rayPose.transform.matrix;\n              if (gamepad.buttons[0].value > 0 && this.isPickingEnabled) {\n                this._core.renderer.pickVMatrix = rayPose.transform.inverse.matrix;\n                this._core.renderer.isPickingEnabled = true;\n              }\n            }\n            const threshold2 = 0.2;\n            const dampening = Math.min(0.015 * elapsedTime, 1);\n            this._thumbstickX = AnimationHelper.damp(this._thumbstickX, gamepad.axes[2], threshold2, dampening);\n            if (this._thumbstickX != 0) {\n              setAxisAngle(this._quat0, Constants$1.VECTOR3_UNITY, 0.01 * this._thumbstickX * elapsedTime);\n              this._core.getModelRotation(this._quat1);\n              multiply(this._quat1, this._quat0, this._quat1);\n              this._core.setModelRotation(this._quat1, true);\n            }\n            if (gamepad.buttons[2].pressed) {\n              if (!this._previousControllerButtonPressed[2]) {\n                this._previousControllerButtonPressed[2] = true;\n                if (this.controllerButtonPressedCallback) {\n                  this.controllerButtonPressedCallback(2);\n                }\n              }\n            } else {\n              this._previousControllerButtonPressed[2] = false;\n            }\n          }\n        }\n      } else {\n        const camera = this._core.camera;\n        this._manipulationProcessor.update(elapsedTime, this._manipulators);\n        this._pointers.update(elapsedTime);\n        this._mouseWheel.update(elapsedTime);\n        this._keyboard.update(elapsedTime);\n        if (this._mouseWheel.delta != 0) {\n          switch (this.mouseWheelAction(this._keyboard)) {\n            case MouseWheelAction.zoom:\n              if (this._pointers.hoverX, this._pointers.hoverY) {\n                camera.zoom(this._mouseWheel.delta * this.mouseWheelZoomScale, this._pointers.hoverX, this._pointers.hoverY);\n              }\n              break;\n            case MouseWheelAction.rotateY:\n              setAxisAngle(this._quat0, Constants$1.VECTOR3_UNITY, this._mouseWheel.delta * this.mouseWheelRotationScale);\n              camera.getOrbit(this._quat1);\n              multiply(this._quat1, this._quat1, this._quat0);\n              camera.setOrbit(this._quat1, true);\n              break;\n          }\n        }\n        const count2 = this._manipulationProcessor.count;\n        if (count2 == 0) {\n          if (this._isLassoPicking) {\n            this._isLassoPicking = false;\n            this._core.renderer.isLassoPicking = false;\n            const x02 = Math.min(this._lassoX0, this._lassoX1);\n            const y02 = Math.min(this._lassoY0, this._lassoY1);\n            const x12 = Math.max(this._lassoX0, this._lassoX1);\n            const y12 = Math.max(this._lassoY0, this._lassoY1);\n            if (x12 - x02 > 0 && y12 - y02 > 0) {\n              const sets = this._core.pickLasso(x02, y02, x12, y12, this.lassoPickType);\n              const result = {\n                x0: x02,\n                y0: y02,\n                x1: x12,\n                y1: y12,\n                pickType: this.lassoPickType,\n                ids: sets,\n                manipulator: this._manipulator\n              };\n              this.pickLassoCallback(result);\n            }\n          }\n        } else if (count2 == 1) {\n          const translationDelta = this._manipulationProcessor.translationDelta;\n          if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n            const manipulators = this._manipulationProcessor.manipulators;\n            for (const key2 in manipulators) {\n              const manipulator = manipulators[key2];\n              switch (this.singleTouchAction(manipulator)) {\n                case SingleTouchAction.rotate:\n                  camera.rotate(translationDelta);\n                  break;\n                case SingleTouchAction.translate:\n                  camera.translate(translationDelta);\n                  break;\n                case SingleTouchAction.lasso:\n                  if (this.pickLassoCallback) {\n                    if (!this._isLassoPicking) {\n                      this._isLassoPicking = true;\n                      this._core.renderer.isLassoPicking = true;\n                      this._lassoX0 = manipulator.position[0];\n                      this._lassoY0 = manipulator.position[1];\n                    }\n                    this._lassoX1 = manipulator.position[0];\n                    this._lassoY1 = manipulator.position[1];\n                    this._core.renderer.lassoX0 = Math.min(this._lassoX0, this._lassoX1);\n                    this._core.renderer.lassoY0 = Math.min(this._lassoY0, this._lassoY1);\n                    this._core.renderer.lassoX1 = Math.max(this._lassoX0, this._lassoX1);\n                    this._core.renderer.lassoY1 = Math.max(this._lassoY0, this._lassoY1);\n                  }\n                  break;\n              }\n              break;\n            }\n          }\n        } else {\n          const translationDelta = this._manipulationProcessor.translationDelta;\n          const camera2 = this._core.camera;\n          if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n            camera2.translate(translationDelta);\n          }\n          if (this._manipulationProcessor.scaleDelta != 0) {\n            const distance2 = this._manipulationProcessor.scaleDelta * this.multiTouchZoomScale;\n            camera2.zoom(distance2, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n          }\n          if (this._manipulationProcessor.twistDelta != 0) {\n            camera2.twist(this._manipulationProcessor.twistDelta, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n          }\n        }\n        if (this.isPickingEnabled && !this._manipulationProcessor.isDragging && !this._isLassoPicking) {\n          const camera2 = this._core.camera;\n          const renderer = this._core.renderer;\n          if (renderer.isCapturingPickImage) {\n            camera2.updatePickVMatrix(renderer.width / 2, renderer.height / 2);\n            renderer.pickVMatrix = camera2.pickVMatrix;\n            renderer.isPickingEnabled = true;\n            this._pickedTime = 0;\n          } else if (this._pointers.hoverId > -1) {\n            const pickingX = this._pointers.hoverX;\n            const pickingY = this._pointers.hoverY;\n            camera2.updatePickVMatrix(pickingX, pickingY);\n            renderer.pickVMatrix = camera2.pickVMatrix;\n            renderer.isPickingEnabled = true;\n            if (this._pickedId != renderer.pickedId) {\n              this._pickedId = renderer.pickedId;\n              this._pickedTime = 0;\n            } else {\n              if (this._manipulationProcessor.count == 1) {\n                this._pickedTime += elapsedTime;\n                for (const key2 in this._manipulators) {\n                  this._manipulator = this._manipulators[key2];\n                  break;\n                }\n              }\n            }\n            if (this._pickedTime > 0) {\n              switch (renderer.pickedType) {\n                case PickType.data:\n                  if (this._pickedTime > this.pickHoldDelay) {\n                    renderer.getVertexPosition(this._vec3, this._pickedId);\n                    this._core.setModelManipulationOrigin(this._vec3);\n                    this._pickedTime = 0;\n                  } else if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.transitionBuffers.length; i++) {\n                        const transitionBuffer = renderer.transitionBuffers[i];\n                        const id2 = transitionBuffer.pickIdLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = {\n                            transitionBuffer: i,\n                            id: id2,\n                            manipulator: this._manipulator\n                          };\n                          this._core.log.write(LogLevel.info, `picked id ${result.id}, transition buffer ${i}`);\n                          if (this.pickItemCallback) {\n                            this.pickItemCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.label:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.labelSets.length; i++) {\n                        const labelSet = renderer.labelSets[i].label;\n                        const id2 = labelSet.pickIdLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = {\n                            label: id2,\n                            set: i,\n                            manipulator: this._manipulator\n                          };\n                          this._core.log.write(LogLevel.info, `picked label ${result.label}, set ${result.set}`);\n                          if (this.pickLabelSetCallback) {\n                            this.pickLabelSetCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesDivision:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickGridLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickGrid(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked division (${result.divisionX}, ${result.divisionY}, ${result.divisionZ}), axes ${result.axes}`);\n                          if (this.pickAxesGridCallback) {\n                            this.pickAxesGridCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesTitle:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickTitleLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickTitle(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked title ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesTitleCallback) {\n                            this.pickAxesTitleCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesLabel:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickLabelLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickLabel(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked label ${result.label}, axis ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesLabelCallback) {\n                            this.pickAxesLabelCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesHeading:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickHeadingLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickHeading(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked heading ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesHeadingCallback) {\n                            this.pickAxesHeadingCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n              }\n            }\n          } else {\n            renderer.isPickingEnabled = false;\n            this._pickedTime = 0;\n          }\n        } else {\n          this._core.renderer.isPickingEnabled = false;\n          this._pickedTime = 0;\n        }\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`man tot  ${this._manipulationProcessor.count}`);\n        this._core.debugText.addLine(`pck key  ${this._core.renderer.pickedId}`);\n      }\n    }\n  }\n  let Log$1 = class Log {\n    constructor(core) {\n      this._core = core;\n    }\n    write(level, value2) {\n      if (level >= this._core.config.logLevel) {\n        switch (level) {\n          case LogLevel.trace:\n            console.trace(value2);\n            break;\n          case LogLevel.debug:\n            console.debug(value2);\n            break;\n          case LogLevel.info:\n            console.info(value2);\n            break;\n          case LogLevel.warn:\n            console.warn(value2);\n            break;\n          case LogLevel.error:\n            console.error(value2);\n            break;\n        }\n      }\n    }\n  };\n  var __awaiter$4 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class Core {\n    get container() {\n      return this._container;\n    }\n    get started() {\n      return this._started;\n    }\n    get debugText() {\n      return this._debugText;\n    }\n    get log() {\n      return this._log;\n    }\n    get totalFrames() {\n      return this._fps.totalFrames;\n    }\n    get camera() {\n      return this._camera;\n    }\n    set camera(value2) {\n      this._camera = value2;\n    }\n    getModelRotation(value2) {\n      copy$4(value2, this._modelRotation);\n    }\n    setModelRotation(value2, isSmooth) {\n      copy$4(this._modelRotation, value2);\n      if (!isSmooth) {\n        copy$4(this._smoothedModelRotation, this._modelRotation);\n      }\n    }\n    getModelScale() {\n      return this._modelScale[0];\n    }\n    setModelScale(value2, isSmooth) {\n      set$8(this._modelScale, value2, value2, value2);\n      if (!isSmooth) {\n        copy$6(this._smoothedModelScale, this._modelScale);\n      }\n    }\n    getModelManipulationOrigin(value2) {\n      copy$6(value2, this._modelManipulationOrigin);\n    }\n    setModelManipulationOrigin(value2) {\n      this._updateManipulationOrigin(value2);\n    }\n    getModelPosition(value2) {\n      copy$6(value2, this._modelPosition);\n    }\n    setModelPosition(value2, isSmooth) {\n      copy$6(this._modelPosition, value2);\n      if (!isSmooth) {\n        copy$6(this._smoothedModelPosition, this._modelPosition);\n      }\n    }\n    get webXRSession() {\n      return this._webXRSession;\n    }\n    get renderer() {\n      return this._renderer;\n    }\n    set renderer(renderer) {\n      if (this._renderer == renderer) {\n        return;\n      }\n      if (this._renderer) {\n        this.stop();\n        this._renderer.remove();\n      }\n      if (!renderer.isInitialized) {\n        renderer.initialize(this);\n      }\n      if (this._renderer) {\n        renderer.transitionTime = this._renderer.transitionTime;\n        for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n          const previousTransitionBuffer = this._renderer.transitionBuffers[i];\n          const transitionBuffer = renderer.createTransitionBuffer(previousTransitionBuffer.currentBuffer.ids);\n          transitionBuffer.copyFrom(previousTransitionBuffer);\n          renderer.transitionBuffers.push(transitionBuffer);\n        }\n        const currentAxes = this._renderer.currentAxes;\n        if (currentAxes) {\n          renderer.currentAxes = [];\n          for (let i = 0; i < currentAxes.length; i++) {\n            const axesVisual = currentAxes[i];\n            const axes = axesVisual.axes;\n            if (axes instanceof Cartesian3dAxes) {\n              const cartesian3dAxesVisual = renderer.createCartesian3dAxesVisual(axes);\n              renderer.currentAxes.push(cartesian3dAxesVisual);\n            } else if (axes instanceof Cartesian2dAxes) {\n              renderer.currentAxes.push(renderer.createCartesian2dAxesVisual(axes));\n            }\n          }\n        }\n        const labelSets = this._renderer.labelSets;\n        if (labelSets) {\n          renderer.labelSets = [];\n          for (let i = 0; i < labelSets.length; i++) {\n            renderer.labelSets.push(renderer.createLabelSetVisual(labelSets[i].label));\n          }\n        }\n        const images = this._renderer.images;\n        if (images) {\n          renderer.images = [];\n          for (let i = 0; i < images.length; i++) {\n            renderer.images.push(renderer.createImageVisual(images[i].image));\n          }\n        }\n        const fonts = this._renderer.fonts;\n        if (fonts) {\n          for (const key2 in fonts) {\n            const font2 = fonts[key2].font;\n            renderer.fonts[font2.name] = renderer.createFontVisual(font2);\n          }\n        }\n      } else {\n        renderer.fonts[this._font.name] = renderer.createFontVisual(this._font);\n      }\n      if (this._renderer) {\n        this._renderer.finalize();\n      }\n      this._renderer = renderer;\n      this._fps.reset();\n      this.start();\n    }\n    get font() {\n      return this._font;\n    }\n    get paletteResources() {\n      return this._paletteResources;\n    }\n    get config() {\n      return this._config;\n    }\n    get inputManager() {\n      return this._inputManager;\n    }\n    constructor(options2) {\n      setMatrixArrayType(Array);\n      this._vec3 = create$6();\n      this._quat = create$4();\n      this._mat4 = create$7();\n      this._container = options2 && options2.container ? options2.container : document.body;\n      this._config = new Config$2(this);\n      this._log = new Log$1(this);\n      this._debugText = new DebugText();\n      this._inputManager = options2 && options2.useInputManager === false ? null : new Manager(this);\n      const fontRasterizerOptions = options2 && options2.fontRasterizerOptions ? options2.fontRasterizerOptions : {\n        fontAtlas: new FontAtlas(256, 512),\n        fontSize: 24,\n        border: 3,\n        fontFamily: '\"segoe ui semibold\", sans-serif',\n        fontWeight: \"normal\",\n        fontStyle: \"normal\",\n        baseline: \"alphabetic\",\n        maxDistance: 8,\n        edgeValue: 192\n      };\n      const fontRasterizer = new FontRasterizer(this, fontRasterizerOptions);\n      this._font = fontRasterizer.font;\n      this._paletteResources = new PaletteResources();\n      this._previousTime = 0;\n      this._fps = new Fps(this);\n      this._modelMMatrix = create$7();\n      this._modelPosition = create$6();\n      this._modelRotation = create$4();\n      this._modelScale = create$6();\n      this._smoothedModelPosition = create$6();\n      this._smoothedModelRotation = create$4();\n      this._smoothedModelScale = create$6();\n      this._modelManipulationOrigin = create$6();\n      this._camera = new AltAzimuthCamera(this);\n      this.resetModel(false);\n    }\n    getView(view) {\n      this.getModelPosition(view.position);\n      this.getModelRotation(view.rotation);\n      view.scale = this.getModelScale();\n    }\n    setView(view, isSmooth) {\n      this.setModelPosition(view.position, isSmooth);\n      this.setModelRotation(view.rotation, isSmooth);\n      this.setModelScale(view.scale, isSmooth);\n    }\n    lerpView(from, to, time2) {\n      lerp$1(this._vec3, from.position, to.position, time2);\n      this.setModelPosition(this._vec3, false);\n      slerp(this._quat, from.rotation, to.rotation, time2);\n      this.setModelRotation(this._quat, false);\n      this.setModelScale(MathHelper.lerp(from.scale, to.scale, time2), false);\n    }\n    resetModel(isSmooth) {\n      set$8(this._modelPosition, 0, 0, -this._config.modelDistance);\n      set$8(this._modelScale, this._config.modelSize, this._config.modelSize, this._config.modelSize);\n      set$6(this._modelRotation, 0, 0, 0, 1);\n      if (!isSmooth) {\n        this._syncSmooth();\n      }\n    }\n    resetManipulationOrigin() {\n      if (!exactEquals$1(this._modelManipulationOrigin, Constants$1.VECTOR3_ZERO)) {\n        this._updateManipulationOrigin(Constants$1.VECTOR3_ZERO);\n      }\n    }\n    reset(isSmooth) {\n      this.resetModel(isSmooth);\n      this.resetManipulationOrigin();\n      this._camera.reset(isSmooth);\n    }\n    start() {\n      if (!this._started && this._renderer) {\n        this._windowAnimationFrame = window.requestAnimationFrame((currentTime) => this._tick(currentTime));\n        this._started = true;\n        this._log.write(LogLevel.info, \"render loop started\");\n        if (this.startCallback) {\n          this.startCallback();\n        }\n      }\n    }\n    stop() {\n      if (this._started) {\n        this._started = false;\n        if (this._windowAnimationFrame != null) {\n          window.cancelAnimationFrame(this._windowAnimationFrame);\n          this._windowAnimationFrame = null;\n          this._log.write(LogLevel.info, \"render loop stopped\");\n        }\n        if (this.stopCallback) {\n          this.stopCallback();\n        }\n      }\n    }\n    checkWebXRSupport() {\n      const xrSystem = navigator.xr;\n      if (xrSystem) {\n        xrSystem.isSessionSupported(\"immersive-vr\").then((supported) => {\n          if (supported) {\n            this._log.write(LogLevel.info, \"WebXR supported\");\n            if (this.webXRSupportedCallback) {\n              this.webXRSupportedCallback();\n            }\n          }\n        });\n      }\n    }\n    requestWebXRSession() {\n      if (this._webXRSession) {\n        this._webXRSession.end();\n      } else {\n        navigator.xr.requestSession(\"immersive-vr\").then((session) => this._webXRSessionStarted(session));\n      }\n    }\n    _webXRSessionStarted(session) {\n      if (this.webXRSessionStartedCallback) {\n        this.webXRSessionStartedCallback();\n      }\n      this._webXRSession = session;\n      session.onend = () => this._webXRSessionEnded();\n      this._renderer.initializeWebXR(session).then(() => {\n        if (this._windowAnimationFrame) {\n          window.cancelAnimationFrame(this._windowAnimationFrame);\n          this._windowAnimationFrame = null;\n        }\n        session.requestAnimationFrame((currentTime, xrframe) => this._tick(currentTime, xrframe));\n      });\n      session.oninputsourceschange = (event2) => this._webXRInputSourcesChanged(event2);\n    }\n    _webXRSessionEnded() {\n      if (this.webXRSessionEndedCallback) {\n        this.webXRSessionEndedCallback();\n      }\n      this._webXRSession = null;\n      this._renderer.controllers.length = 0;\n      this.start();\n    }\n    _webXRInputSourcesChanged(event2) {\n      if (event2.added.length > 0) {\n        const added = event2.added[0];\n        if (added.targetRayMode == \"tracked-pointer\") {\n          const profiles = added.profiles;\n          const handedness = added.handedness;\n          if (this.webXRInputSourceRequestCallback) {\n            this.webXRInputSourceRequestCallback(profiles, handedness, (response) => {\n              const options2 = {\n                profiles,\n                handedness,\n                obj: response.obj,\n                texture: response.texture\n              };\n              const controller = new Controller(this, options2);\n              this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n            }, (e) => {\n              this._log.write(LogLevel.error, e);\n            });\n          } else {\n            const options2 = {};\n            const controller = new Controller(this, options2);\n            this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n          }\n        }\n      }\n      if (event2.removed.length > 0) {\n        this.renderer.controllers.length = 0;\n      }\n    }\n    _tick(currentTime, xrFrame) {\n      return __awaiter$4(this, void 0, void 0, function* () {\n        let elapsedTime = currentTime - this._previousTime;\n        this._previousTime = currentTime;\n        if (elapsedTime > 0) {\n          this.update(elapsedTime, xrFrame);\n          yield this.render(elapsedTime, xrFrame);\n        }\n        if (xrFrame) {\n          xrFrame.session.requestAnimationFrame((currentTime2, xrframe) => this._tick(currentTime2, xrframe));\n        } else if (this._started) {\n          this._windowAnimationFrame = window.requestAnimationFrame((currentTime2) => this._tick(currentTime2));\n        }\n      });\n    }\n    update(elapsedTime, xrFrame) {\n      this._renderer.setSize(elapsedTime);\n      if (this.updateCallback) {\n        this.updateCallback(elapsedTime, xrFrame);\n      }\n      if (this._config.isDebugVisible) {\n        this._debugText.clear();\n      }\n      this._fps.update(elapsedTime);\n      if (this._inputManager) {\n        this._inputManager.isPickingEnabled = this._config.isTransitionPickingEnabled || this._renderer.transitionTime == 1;\n        this._inputManager.update(elapsedTime, xrFrame);\n      }\n      let amount = Math.min(elapsedTime * this._config.positionSmoothing, 1);\n      lerp$1(this._smoothedModelPosition, this._smoothedModelPosition, this._modelPosition, amount);\n      amount = Math.min(elapsedTime * this._config.rotationSmoothing, 1);\n      slerp(this._smoothedModelRotation, this._smoothedModelRotation, this._modelRotation, amount);\n      amount = Math.min(elapsedTime * this._config.scaleSmoothing, 1);\n      lerp$1(this._smoothedModelScale, this._smoothedModelScale, this._modelScale, amount);\n      fromRotationTranslationScaleOrigin(this._modelMMatrix, this._smoothedModelRotation, this._smoothedModelPosition, this._smoothedModelScale, this._modelManipulationOrigin);\n      this._renderer.mMatrix = this._modelMMatrix;\n      if (this._config.isDebugVisible) {\n        this._debugText.addLine(`mod pos ${this._smoothedModelPosition[0] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[0].toFixed(3)},${this._smoothedModelPosition[1] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[1].toFixed(3)},${this._smoothedModelPosition[2] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[2].toFixed(3)}`);\n        this._debugText.addLine(`mod rot ${this._smoothedModelRotation[0] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[0].toFixed(3)},${this._smoothedModelRotation[1] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[1].toFixed(3)},${this._smoothedModelRotation[2] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[2].toFixed(3)},${this._smoothedModelRotation[3] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[3].toFixed(3)}`);\n        this._debugText.addLine(`mod siz  ${this._smoothedModelScale[0].toFixed(3)}`);\n        this._debugText.addLine(`man ori ${this._modelManipulationOrigin[0] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[0].toFixed(3)},${this._modelManipulationOrigin[1] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[1].toFixed(3)},${this._modelManipulationOrigin[2] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[2].toFixed(3)}`);\n        this._debugText.addLine(`scr dst  ${this._config.screenDistance.toFixed(3)}`);\n        this._debugText.addLine(`cam fov  ${Math.round(AngleHelper.radiansToDegrees(this._config.fov))}`);\n        this._debugText.addLine(`tbf tot  ${this._renderer.transitionBuffers.length}`);\n      }\n      if (!xrFrame) {\n        this._camera.width = this._renderer.width;\n        this._camera.height = this._renderer.height;\n        this._camera.modelMMatrix = this._modelMMatrix;\n        this._camera.modelPosition = this._smoothedModelPosition;\n        this._camera.modelRotation = this._smoothedModelRotation;\n        this._camera.modelScale = this._smoothedModelScale;\n        this._camera.modelManipulationOrigin = this._modelManipulationOrigin;\n        this._camera.update(elapsedTime);\n        this._renderer.vMatrices = this._camera.vMatrices;\n        this._renderer.mvMatrices = this._camera.mvMatrices;\n        this._renderer.pMatrices = this._camera.pMatrices;\n        this._renderer.inverseVMatrices = this._camera.inverseVMatrices;\n        this._renderer.inversePMatrices = this._camera.inversePMatrices;\n      }\n      this._renderer.prepare(xrFrame);\n      if (!xrFrame && this._config.stereoMode == StereoMode.none) {\n        this._renderer.pickPMatrix = this._camera.pMatrices[0];\n      } else {\n        const fov = MatrixHelper.fieldOfViewFromProjectionMatrix(this._renderer.pMatrices[0]);\n        perspective(this._mat4, fov, this._renderer.width / this._renderer.height, this._config.nearPlane, this._config.farPlane);\n        this._renderer.pickPMatrix = this._mat4;\n      }\n      if (this._renderer.isInitialized) {\n        this._renderer.update(elapsedTime);\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$4(this, void 0, void 0, function* () {\n        this._fps.render();\n        if (this._renderer.isInitialized) {\n          yield this._renderer.render(elapsedTime, xrFrame);\n          if (this.afterRenderCallback) {\n            this.afterRenderCallback();\n          }\n        }\n      });\n    }\n    _syncSmooth() {\n      copy$6(this._smoothedModelPosition, this._modelPosition);\n      copy$6(this._smoothedModelScale, this._modelScale);\n      copy$4(this._smoothedModelRotation, this._modelRotation);\n    }\n    _updateManipulationOrigin(position2) {\n      this._log.write(LogLevel.info, `manipulation origin ${position2[0].toFixed(3)},${position2[1].toFixed(3)},${position2[2].toFixed(3)}`);\n      this._camera.updateModelManipulationOrigin(this._modelManipulationOrigin, position2);\n      copy$6(this._modelManipulationOrigin, position2);\n      transformMat4$2(this._vec3, this._modelManipulationOrigin, this._modelMMatrix);\n      subtract(this._modelPosition, this._vec3, this._modelManipulationOrigin);\n      copy$6(this._smoothedModelPosition, this._modelPosition);\n      if (this.manipulationOriginChangedCallback) {\n        const result = {\n          x: position2[0],\n          y: position2[1],\n          z: position2[2]\n        };\n        this.manipulationOriginChangedCallback(result);\n      }\n    }\n    pickLasso(x02, y02, x12, y12, pickType) {\n      const inverseMMatrix = create$7();\n      invert$1(inverseMMatrix, this._modelMMatrix);\n      const sets = [];\n      const nearPositions = [create$6(), create$6(), create$6(), create$6()];\n      const farPositions = [create$6(), create$6(), create$6(), create$6()];\n      const directions = [create$6(), create$6(), create$6(), create$6()];\n      this._camera.unproject(nearPositions[0], x02, y12, -1);\n      this._camera.unproject(farPositions[0], x02, y12, 1);\n      this._camera.unproject(nearPositions[1], x12, y12, -1);\n      this._camera.unproject(farPositions[1], x12, y12, 1);\n      this._camera.unproject(nearPositions[2], x12, y02, -1);\n      this._camera.unproject(farPositions[2], x12, y02, 1);\n      this._camera.unproject(nearPositions[3], x02, y02, -1);\n      this._camera.unproject(farPositions[3], x02, y02, 1);\n      for (let i = 0; i < 4; i++) {\n        transformMat4$2(nearPositions[i], nearPositions[i], inverseMMatrix);\n        transformMat4$2(farPositions[i], farPositions[i], inverseMMatrix);\n        subtract(directions[i], farPositions[i], nearPositions[i]);\n        normalize$5(directions[i], directions[i]);\n      }\n      const normals = [create$6(), create$6(), create$6(), create$6()];\n      const d2 = [];\n      for (let i = 0; i < 4; i++) {\n        cross$1(normals[i], directions[(i + 1) % 4], directions[i]);\n        normalize$5(normals[i], normals[i]);\n        d2.push(-dot$1(normals[i], nearPositions[i]));\n      }\n      if (pickType == PickType.data) {\n        const translation = create$6();\n        for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n          const transitionBuffer = this._renderer.transitionBuffers[i];\n          const set2 = /* @__PURE__ */ new Set();\n          if (transitionBuffer.isVisible) {\n            const start = window.performance.now();\n            const currentBuffer = transitionBuffer.currentBuffer;\n            const lookup2 = currentBuffer.lookup;\n            for (let j = 0; j < currentBuffer.length; j++) {\n              const id2 = currentBuffer.ids[j];\n              const index2 = lookup2[id2];\n              if (index2 != null) {\n                UnitVertex.getTranslation(currentBuffer.dataView, index2, translation);\n                let isInside = true;\n                for (let k = 0; k < 4; k++) {\n                  let distance2 = dot$1(normals[k], translation);\n                  distance2 += d2[k];\n                  if (distance2 < 0) {\n                    isInside = false;\n                    break;\n                  }\n                }\n                if (isInside) {\n                  set2.add(id2);\n                }\n              }\n            }\n            if (set2.size > 0) {\n              this._log.write(LogLevel.info, `lasso transition buffer ${i} picked ${set2.size} ${Math.round(window.performance.now() - start)}ms`);\n            }\n          }\n          sets.push(set2);\n        }\n      }\n      return sets;\n    }\n  }\n  const StereoMode = {\n    none: \"none\",\n    split: \"split\",\n    anaglyph: \"anaglyph\",\n    left: \"left\",\n    right: \"right\"\n  };\n  const HorizontalAlignment = {\n    left: \"left\",\n    center: \"center\",\n    right: \"right\"\n  };\n  const VerticalAlignment = {\n    top: \"top\",\n    center: \"center\",\n    bottom: \"bottom\"\n  };\n  const AxesTextOrientation = {\n    parallel: \"parallel\",\n    perpendicular: \"perpendicular\"\n  };\n  const AxesVisibility = {\n    none: \"none\",\n    current: \"current\",\n    previous: \"previous\"\n  };\n  const PickType = {\n    none: 0,\n    data: 1,\n    label: 2,\n    axesDivision: 3,\n    axesTitle: 4,\n    axesLabel: 5,\n    axesHeading: 6\n  };\n  const Theme = {\n    dark: \"dark\",\n    light: \"light\"\n  };\n  const HighlightMode = {\n    luminance: \"luminance\",\n    color: \"color\"\n  };\n  const UnitType = {\n    block: \"block\",\n    blockSdf: \"blockSdf\",\n    sphere: \"sphere\",\n    sphereSdf: \"sphereSdf\",\n    cylinder: \"cylinder\",\n    cylinderSdf: \"cylinderSdf\",\n    hexPrism: \"hexPrism\",\n    hexPrismSdf: \"hexPrismSdf\",\n    sdf: \"sdf\",\n    disk: \"disk\",\n    ringSdf: \"ringSdf\"\n  };\n  const SingleTouchAction = {\n    translate: \"translate\",\n    rotate: \"rotate\",\n    lasso: \"lasso\"\n  };\n  const MouseWheelAction = {\n    zoom: \"zoom\",\n    rotateY: \"rotateY\"\n  };\n  const LogLevel = {\n    trace: 0,\n    debug: 1,\n    info: 2,\n    warn: 3,\n    error: 4\n  };\n  const Edge3D = {\n    topFront: 0,\n    topRight: 1,\n    topBack: 2,\n    bottomRight: 5,\n    frontRight: 8,\n    backRight: 9\n  };\n  const RenderMode = {\n    color: \"color\"\n  };\n  let LabelSetVisual$2 = class LabelSetVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(labelSet) {\n      this.label = labelSet;\n    }\n  };\n  let LabelBase$1 = class LabelBase {\n    get material() {\n      return this._material;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get verticesView() {\n      return this._verticesView;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get materialType() {\n      return this._materialType;\n    }\n    get materialColor() {\n      return this._materialColor;\n    }\n    get materialFuzz() {\n      return this._materialFuzz;\n    }\n    get materialGloss() {\n      return this._materialGloss;\n    }\n    get segmentColor() {\n      return this._segmentColor;\n    }\n    get scale() {\n      return this._scale;\n    }\n    set scale(value2) {\n      if (this._scale != value2) {\n        this._scale = value2;\n        this._hasChanged = true;\n      }\n    }\n    get font() {\n      return this._font;\n    }\n    set font(value2) {\n      if (this._font != value2) {\n        this._font = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotation() {\n      return this._rotation;\n    }\n    set rotation(value2) {\n      if (this._rotation != value2) {\n        this._rotation = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseX(value2) {\n      if (this._reverseX != value2) {\n        this._reverseX = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseY(value2) {\n      if (this._reverseY != value2) {\n        this._reverseY = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseZ(value2) {\n      if (this._reverseZ != value2) {\n        this._reverseZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get horizontalAlignment() {\n      return this._horizontalAlignment;\n    }\n    set horizontalAlignment(value2) {\n      if (this._horizontalAlignment != value2) {\n        this._horizontalAlignment = value2;\n        this._hasChanged = true;\n      }\n    }\n    get verticalAlignment() {\n      return this._verticalAlignment;\n    }\n    set verticalAlignment(value2) {\n      if (this._verticalAlignment != value2) {\n        this._verticalAlignment = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offsetX;\n    }\n    set offsetX(value2) {\n      if (this._offsetX != value2) {\n        this._offsetX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetY() {\n      return this._offsetY;\n    }\n    set offsetY(value2) {\n      if (this._offsetY != value2) {\n        this._offsetY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetZ() {\n      return this._offsetZ;\n    }\n    set offsetZ(value2) {\n      if (this._offsetZ != value2) {\n        this._offsetZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxGlyphTop() {\n      return this._maxGlyphTop;\n    }\n    set maxGlyphTop(value2) {\n      if (this._maxGlyphTop != value2) {\n        this._maxGlyphTop = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxGlyphHeight() {\n      return this._maxGlyphHeight;\n    }\n    set maxGlyphHeight(value2) {\n      if (this._maxGlyphHeight != value2) {\n        this._maxGlyphHeight = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options2) {\n      this._core = core;\n      this._offset = create$6();\n      this._vec3 = create$6();\n      this._vec4 = create$5();\n      this._mMatrix = create$7();\n      this._indexCount = 0;\n      this._maxGlyphs = options2.maxGlyphs;\n      this._textMetric = { width: 0, maxHeight: 0, maxTop: 0 };\n      this.scale = options2.scale ? options2.scale : 1;\n      this.offsetX = options2.offsetX ? options2.offsetX : 0;\n      this.offsetY = options2.offsetY ? options2.offsetY : 0;\n      this.offsetZ = options2.offsetZ ? options2.offsetZ : 0;\n      this.reverseX = options2.reverseX;\n      this.reverseY = options2.reverseY;\n      this.reverseZ = options2.reverseZ;\n      this.rotation = options2.rotation;\n      this.maxGlyphTop = options2.maxGlyphTop;\n      this.horizontalAlignment = options2.horizontalAlignment === void 0 ? HorizontalAlignment.center : options2.horizontalAlignment;\n      this.verticalAlignment = options2.verticalAlignment === void 0 ? VerticalAlignment.center : options2.verticalAlignment;\n      this._material = options2.material;\n      this.borderWidth = core.config.textBorderWidth;\n      this.gamma = 0;\n      this._materialType = options2.materialType || 0;\n      this._materialColor = options2.materialColor || core.config.textColor;\n      this._materialFuzz = options2.materialFuzz || 0;\n      this._materialGloss = options2.materialGloss || 0;\n      this._segmentColor = options2.segmentColor;\n    }\n    initialize() {\n      this._vertices = new ArrayBuffer(PositionTexturePickVertex.SIZE_BYTES * this._maxGlyphs * 4);\n      this._verticesView = new DataView(this._vertices);\n      this._indices = new Uint32Array(this._maxGlyphs * 6);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n  };\n  class LabelSet extends LabelBase$1 {\n    get materials() {\n      return this._materials;\n    }\n    get materialTypes() {\n      return this._materialTypes;\n    }\n    get materialColors() {\n      return this._materialColors;\n    }\n    get materialFuzzes() {\n      return this._materialFuzzes;\n    }\n    get materialGlosses() {\n      return this._materialGlosses;\n    }\n    get segmentColors() {\n      return this._segmentColors;\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (this._minBoundsX != value2) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (this._minBoundsY != value2) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (this._minBoundsZ != value2) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (this._maxBoundsX != value2) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (this._maxBoundsY != value2) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (this._maxBoundsZ != value2) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsX() {\n      return this._positionsX;\n    }\n    set positionsX(value2) {\n      if (this._positionsX != value2) {\n        this._positionsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsY() {\n      return this._positionsY;\n    }\n    set positionsY(value2) {\n      if (this._positionsY != value2) {\n        this._positionsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsZ() {\n      return this._positionsZ;\n    }\n    set positionsZ(value2) {\n      if (this._positionsZ != value2) {\n        this._positionsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingX() {\n      return this._positionScalingX;\n    }\n    set positionScalingX(value2) {\n      if (this._positionScalingX != value2) {\n        this._positionScalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingY() {\n      return this._positionScalingY;\n    }\n    set positionScalingY(value2) {\n      if (this._positionScalingY != value2) {\n        this._positionScalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingZ() {\n      return this._positionScalingZ;\n    }\n    set positionScalingZ(value2) {\n      if (this._positionScalingZ != value2) {\n        this._positionScalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotations() {\n      return this._rotations;\n    }\n    set rotations(value2) {\n      if (this._rotations != value2) {\n        this._rotations = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsX() {\n      return this._offsetsX;\n    }\n    set offsetsX(value2) {\n      if (this._offsetsX != value2) {\n        this._offsetsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsY() {\n      return this._offsetsY;\n    }\n    set offsetsY(value2) {\n      if (this._offsetsY != value2) {\n        this._offsetsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsZ() {\n      return this._offsetsZ;\n    }\n    set offsetsZ(value2) {\n      if (this._offsetsZ != value2) {\n        this._offsetsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingX() {\n      return this._offsetScalingX;\n    }\n    set offsetScalingX(value2) {\n      if (this._offsetScalingX != value2) {\n        this._offsetScalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingY() {\n      return this._offsetScalingY;\n    }\n    set offsetScalingY(value2) {\n      if (this._offsetScalingY != value2) {\n        this._offsetScalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingZ() {\n      return this._offsetScalingZ;\n    }\n    set offsetScalingZ(value2) {\n      if (this._offsetScalingZ != value2) {\n        this._offsetScalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get text() {\n      return this._text;\n    }\n    set text(value2) {\n      if (this._text != value2) {\n        this._text = value2;\n        this._hasChanged = true;\n      }\n    }\n    get horizontalAlignments() {\n      return this._horizontalAlignments;\n    }\n    set horizontalAlignments(value2) {\n      if (this._horizontalAlignments != value2) {\n        this._horizontalAlignments = value2;\n        this._hasChanged = true;\n      }\n    }\n    get verticalAlignments() {\n      return this._verticalAlignments;\n    }\n    set verticalAlignments(value2) {\n      if (this._verticalAlignments != value2) {\n        this._verticalAlignments = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scales() {\n      return this._scales;\n    }\n    set scales(value2) {\n      if (this._scales != value2) {\n        this._scales = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalesScaling() {\n      return this._scalesScaling;\n    }\n    set scalesScaling(value2) {\n      if (this._scalesScaling != value2) {\n        this._scalesScaling = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options2) {\n      super(core, options2);\n      this._quat = create$4();\n      this._materials = options2.materials;\n      this._materialType = options2.materialType;\n      this._materialColor = options2.materialColors ? null : options2.materialColor || core.config.textColor;\n      this._materialColors = options2.materialColors;\n      this.minBoundsX = options2.minBoundsX ? options2.minBoundsX : 0;\n      this.minBoundsY = options2.minBoundsY ? options2.minBoundsY : 0;\n      this.minBoundsZ = options2.minBoundsZ ? options2.minBoundsZ : 0;\n      this.maxBoundsX = options2.maxBoundsX ? options2.maxBoundsX : 1;\n      this.maxBoundsY = options2.maxBoundsY ? options2.maxBoundsY : 1;\n      this.maxBoundsZ = options2.maxBoundsZ ? options2.maxBoundsZ : 1;\n      this._font = options2.font || core.font;\n      this.text = options2.text;\n      this.positionsX = options2.positionsX;\n      this.positionsY = options2.positionsY;\n      this.positionsZ = options2.positionsZ;\n      this.positionScalingX = options2.positionScalingX ? options2.positionScalingX : 1;\n      this.positionScalingY = options2.positionScalingY ? options2.positionScalingY : 1;\n      this.positionScalingZ = options2.positionScalingZ ? options2.positionScalingZ : 1;\n      this.rotations = options2.rotations;\n      this.offsetsX = options2.offsetsX;\n      this.offsetsY = options2.offsetsY;\n      this.offsetsZ = options2.offsetsZ;\n      this.offsetScalingX = options2.offsetScalingX ? options2.offsetScalingX : 1;\n      this.offsetScalingY = options2.offsetScalingY ? options2.offsetScalingY : 1;\n      this.offsetScalingZ = options2.offsetScalingZ ? options2.offsetScalingZ : 1;\n      if (options2.horizontalAlignments)\n        this.horizontalAlignments = options2.horizontalAlignments;\n      if (options2.verticalAlignments)\n        this.verticalAlignments = options2.verticalAlignments;\n      if (options2.scales)\n        this.scales = options2.scales;\n      this.scalesScaling = options2.scalesScaling ? options2.scalesScaling : 1;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.pickIdLookup = {};\n        if (!this._text) {\n          this._indexCount = 0;\n        } else {\n          const start = window.performance.now();\n          const modelSizeX = this._maxBoundsX - this._minBoundsX;\n          const modelSizeY = this._maxBoundsY - this._minBoundsY;\n          const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n          const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n          const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n          const modelOriginX = (this._minBoundsX + this._maxBoundsX) / 2;\n          const modelOriginY = (this._minBoundsY + this._maxBoundsY) / 2;\n          const modelOriginZ = (this._minBoundsZ + this._maxBoundsZ) / 2;\n          if (this._rotation) {\n            set$6(this._quat, this._rotation[0], this._rotation[1], this._rotation[2], this._rotation[3]);\n          }\n          let glyphs = 0;\n          for (let i = 0; i < this._text.length; i++) {\n            const offsetX = (this._offsetsX ? this._offsetsX[i] / 2 : this._offsetX) * boundsScaling * this._offsetScalingX;\n            const offsetY = (this._offsetsY ? this._offsetsY[i] / 2 : this._offsetY) * boundsScaling * this._offsetScalingY;\n            const offsetZ = (this._offsetsZ ? this._offsetsZ[i] / 2 : this._offsetZ) * boundsScaling * this._offsetScalingZ;\n            const text2 = TextHelper.truncate(this._text[i], this._maxGlyphs - glyphs);\n            const scale2 = (this._scales ? this._scales[i] * this._scalesScaling : this._scale) * boundsScaling / this._font.size;\n            TextHelper.measure(this._font, text2, this._textMetric);\n            const width2 = this._textMetric.width * scale2;\n            const lineHeight2 = this._font.size * scale2;\n            const maxGlyphTop = (this._maxGlyphTop ? this._maxGlyphTop : this._textMetric.maxTop) * scale2;\n            const horizontalAlignment = this._horizontalAlignments ? this._horizontalAlignments[i] : this._horizontalAlignment;\n            switch (horizontalAlignment) {\n              case HorizontalAlignment.left:\n                this._offset[0] = offsetX;\n                break;\n              case HorizontalAlignment.center:\n                this._offset[0] = offsetX - width2 / 2;\n                break;\n              case HorizontalAlignment.right:\n                this._offset[0] = offsetX - width2;\n                break;\n            }\n            const verticalAlignment = this._verticalAlignments ? this._verticalAlignments[i] : this._verticalAlignment;\n            switch (verticalAlignment) {\n              case VerticalAlignment.top:\n                this._offset[1] = offsetY - lineHeight2 / 2;\n                break;\n              case VerticalAlignment.center:\n                this._offset[1] = offsetY;\n                break;\n              case VerticalAlignment.bottom:\n                this._offset[1] = offsetY + lineHeight2 / 2;\n                break;\n            }\n            this._offset[1] -= maxGlyphTop / 2;\n            this._offset[2] = offsetZ;\n            let positionX = this.positionsX ? this.positionsX[i] * this.positionScalingX : 0;\n            let positionY = this.positionsY ? this.positionsY[i] * this.positionScalingY : 0;\n            let positionZ = this.positionsZ ? this.positionsZ[i] * this.positionScalingZ : 0;\n            if (this._reverseX) {\n              positionX = this.minBoundsX + this.maxBoundsX - positionX;\n            }\n            if (this._reverseY) {\n              positionY = this.minBoundsY + this.maxBoundsY - positionY;\n            }\n            if (this._reverseZ) {\n              positionZ = this.minBoundsZ + this.maxBoundsZ - positionZ;\n            }\n            set$8(this._vec3, (positionX - modelOriginX) * boundsScaling, (positionY - modelOriginY) * boundsScaling, (positionZ - modelOriginZ) * boundsScaling);\n            if (this._rotations) {\n              set$6(this._quat, this._rotations[i * 4], this._rotations[i * 4 + 1], this._rotations[i * 4 + 2], this._rotations[i * 4 + 3]);\n            }\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.label, this._vec4);\n            this.pickIdLookup[pickId] = i;\n            TextHelper.addString(this._font, text2, this._verticesView, this._indices, glyphs, this._vec3, scale2, this._offset, this._rotation || this._rotations ? this._quat : null, this._vec4);\n            glyphs += text2.length;\n            if (glyphs >= this._maxGlyphs) {\n              glyphs = this._maxGlyphs;\n              break;\n            }\n          }\n          this._indexCount = glyphs * 6;\n          this._core.log.write(LogLevel.info, `label set updated ${Math.round(window.performance.now() - start)}ms`);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n        }\n      }\n    }\n  }\n  let ImageVisual$2 = class ImageVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(image2) {\n      this.image = image2;\n    }\n  };\n  let ImageBase$1 = class ImageBase {\n    get material() {\n      return this._material;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get imageData() {\n      return this._imageData;\n    }\n    set imageData(value2) {\n      if (this._imageData != value2) {\n        this._imageData = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotation() {\n      return this._rotation;\n    }\n    set rotation(value2) {\n      if (!equals$1(this._rotation, value2)) {\n        copy$4(this._rotation, value2);\n        this._hasChanged = true;\n      }\n    }\n    get position() {\n      return this._position;\n    }\n    set position(value2) {\n      if (!equals$2(this._position, value2)) {\n        copy$6(this._position, value2);\n        this._hasChanged = true;\n      }\n    }\n    get texCoord0() {\n      return this._texCoord0;\n    }\n    set texCoord0(value2) {\n      if (!equals(this._texCoord0, value2)) {\n        copy$3(this._texCoord0, value2);\n        this._hasChanged = true;\n      }\n    }\n    get texCoord1() {\n      return this._texCoord1;\n    }\n    set texCoord1(value2) {\n      if (!equals(this._texCoord1, value2)) {\n        copy$3(this._texCoord1, value2);\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (this._minBoundsX != value2) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (this._minBoundsY != value2) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (this._minBoundsZ != value2) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (this._maxBoundsX != value2) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (this._maxBoundsY != value2) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (this._maxBoundsZ != value2) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options2) {\n      this._core = core;\n      this._mMatrix = create$7();\n      this._origin = create$6();\n      this._translation = create$6();\n      this._scale = create$6();\n      this._transform = create$7();\n      this._imageData = options2.imageData;\n      this._minBoundsX = options2.minBoundsX === void 0 ? 0 : options2.minBoundsX;\n      this._minBoundsY = options2.minBoundsY === void 0 ? 0 : options2.minBoundsY;\n      this._minBoundsZ = options2.minBoundsZ === void 0 ? 0 : options2.minBoundsZ;\n      this._maxBoundsX = options2.maxBoundsX === void 0 ? 1 : options2.maxBoundsX;\n      this._maxBoundsY = options2.maxBoundsY === void 0 ? 1 : options2.maxBoundsY;\n      this._maxBoundsZ = options2.maxBoundsZ === void 0 ? 1 : options2.maxBoundsZ;\n      this._position = options2.position ? clone$4(options2.position) : create$6();\n      this._rotation = options2.rotation ? clone$2(options2.rotation) : create$4();\n      this._texCoord0 = options2.texCoord0 ? clone$1(options2.texCoord0) : fromValues(0, 0);\n      this._texCoord1 = options2.texCoord1 ? clone$1(options2.texCoord1) : fromValues(1, 1);\n      this._material = options2.material === void 0 ? -1 : options2.material;\n      this._hasChanged = true;\n    }\n  };\n  class ImageQuad extends ImageBase$1 {\n    get width() {\n      return this._width;\n    }\n    set width(value2) {\n      if (this._width != value2) {\n        this._width = value2;\n        this._hasChanged = true;\n      }\n    }\n    get height() {\n      return this._height;\n    }\n    set height(value2) {\n      if (this._height != value2) {\n        this._height = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options2) {\n      super(core, options2);\n      this._width = options2.width === void 0 ? 1 : options2.width;\n      this._height = options2.height === void 0 ? 1 : options2.height;\n      this._texTransform = create$7();\n      translate$2(this._texTransform, this._texTransform, fromValues$3(0, 1, 0));\n      scale$6(this._texTransform, this._texTransform, fromValues$3(1, -1, 1));\n    }\n    initialize() {\n      this._vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * 4);\n      this._indices = Quad$3.INDICES;\n      this._indexCount = this._indices.length;\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        const modelSizeX = this._maxBoundsX - this._minBoundsX;\n        const modelSizeY = this._maxBoundsY - this._minBoundsY;\n        const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n        const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n        const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n        set$8(this._origin, (this._minBoundsX + this._maxBoundsX) / 2, (this._minBoundsY + this._maxBoundsY) / 2, (this._minBoundsZ + this._maxBoundsZ) / 2);\n        subtract(this._translation, this._position, this._origin);\n        scale$5(this._translation, this._translation, boundsScaling);\n        set$8(this._scale, this._width, this._height, 1);\n        scale$5(this._scale, this._scale, boundsScaling);\n        fromRotationTranslationScale(this._transform, this._rotation, this._translation, this._scale);\n        this._verticesView = Quad$3.normalTextured(this._transform, this._texTransform);\n        this._vertices = this._verticesView.buffer;\n        if (this.hasChangedCallback) {\n          this.hasChangedCallback();\n        }\n      }\n    }\n  }\n  class BoundsHelper {\n    static rotateBounds(minBounds, maxBounds, rotation2, rotatedMinBounds, rotatedMaxBounds, offset2) {\n      const sizeX = maxBounds[0] - minBounds[0];\n      const sizeY = maxBounds[1] - minBounds[1];\n      const sizeZ = maxBounds[2] - minBounds[2];\n      const min2 = rotatedMinBounds;\n      const max2 = rotatedMaxBounds;\n      set$8(min2, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n      set$8(max2, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n      const vertices = Cube.POSITIONS;\n      const position2 = create$6();\n      for (let i = 0; i < 8; i++) {\n        set$8(position2, vertices[i * 3] * sizeX, vertices[i * 3 + 1] * sizeY, vertices[i * 3 + 2] * sizeZ);\n        add$4(position2, position2, offset2);\n        transformQuat(position2, position2, rotation2);\n        subtract(position2, position2, offset2);\n        min$3(min2, min2, position2);\n        max$3(max2, max2, position2);\n      }\n      add$4(position2, minBounds, maxBounds);\n      scale$5(position2, position2, 0.5);\n      add$4(min2, min2, position2);\n      add$4(max2, max2, position2);\n    }\n    static cylinder(pa2, pb, radius2, minBounds, maxBounds) {\n      const a2 = create$6();\n      subtract(a2, pb, pa2);\n      const aa = dot$1(a2, a2);\n      const ex = radius2 * Math.sqrt(1 - a2[0] * a2[0] / aa);\n      const ey = radius2 * Math.sqrt(1 - a2[1] * a2[1] / aa);\n      const ez = radius2 * Math.sqrt(1 - a2[2] * a2[2] / aa);\n      minBounds[0] = Math.min(pa2[0] - ex, pb[0] - ex);\n      minBounds[1] = Math.min(pa2[1] - ey, pb[1] - ey);\n      minBounds[2] = Math.min(pa2[2] - ez, pb[2] - ez);\n      maxBounds[0] = Math.max(pa2[0] + ex, pb[0] + ex);\n      maxBounds[1] = Math.max(pa2[1] + ey, pb[1] + ey);\n      maxBounds[2] = Math.max(pa2[2] + ez, pb[2] + ez);\n    }\n  }\n  class LayoutBase {\n    get facetScaling() {\n      return this._facetScaling;\n    }\n    offsetX(facetCoordX) {\n      return ((facetCoordX + 0.5) / this._facetsX - 0.5) * (this.maxModelBoundsX - this.minModelBoundsX) / this._maxBounds;\n    }\n    offsetY(facetCoordY) {\n      return ((facetCoordY + 0.5) / this._facetsY - 0.5) * (this.maxModelBoundsY - this.minModelBoundsY) / this._maxBounds;\n    }\n    offsetZ(facetCoordZ) {\n      return ((facetCoordZ + 0.5) / this._facetsZ - 0.5) * (this.maxModelBoundsZ - this.minModelBoundsZ) / this._maxBounds;\n    }\n    constructor(core) {\n      this._core = core;\n      this.modelOriginX = 0;\n      this.modelOriginY = 0;\n      this.modelOriginZ = 0;\n      this.minModelBoundsX = 0;\n      this.minModelBoundsY = 0;\n      this.minModelBoundsZ = 0;\n      this.maxModelBoundsX = 0;\n      this.maxModelBoundsY = 0;\n      this.maxModelBoundsZ = 0;\n      this.minLayoutBoundsX = 0;\n      this.minLayoutBoundsY = 0;\n      this.minLayoutBoundsZ = 0;\n      this.maxLayoutBoundsX = 0;\n      this.maxLayoutBoundsY = 0;\n      this.maxLayoutBoundsZ = 0;\n      this._facetSpacingX = 0;\n      this._facetSpacingY = 0;\n      this._facetSpacingZ = 0;\n      this._facetSizeX = 0;\n      this._facetSizeY = 0;\n      this._facetSizeZ = 0;\n      this._facetsX = 1;\n      this._facetsY = 1;\n      this._facetsZ = 1;\n    }\n    _updateModelBounds(options2) {\n      this.minModelBoundsX = options2.minBoundsX === void 0 ? this.minLayoutBoundsX : options2.minBoundsX;\n      this.minModelBoundsY = options2.minBoundsY === void 0 ? this.minLayoutBoundsY : options2.minBoundsY;\n      this.minModelBoundsZ = options2.minBoundsZ === void 0 ? this.minLayoutBoundsZ : options2.minBoundsZ;\n      this.maxModelBoundsX = options2.maxBoundsX === void 0 ? this.maxLayoutBoundsX : options2.maxBoundsX;\n      this.maxModelBoundsY = options2.maxBoundsY === void 0 ? this.maxLayoutBoundsY : options2.maxBoundsY;\n      this.maxModelBoundsZ = options2.maxBoundsZ === void 0 ? this.maxLayoutBoundsZ : options2.maxBoundsZ;\n      this._isFacetted = options2.facetsX !== void 0 && options2.facetsX > 1 && options2.facetCoordsX != null || options2.facetsY !== void 0 && options2.facetsY > 1 && options2.facetCoordsY != null || options2.facetsZ !== void 0 && options2.facetsZ > 1 && options2.facetCoordsZ != null;\n      this._facetSpacingX = options2.facetSpacingX === void 0 ? 0 : options2.facetSpacingX;\n      this._facetSpacingY = options2.facetSpacingY === void 0 ? 0 : options2.facetSpacingY;\n      this._facetSpacingZ = options2.facetSpacingZ === void 0 ? 0 : options2.facetSpacingZ;\n      let modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n      let modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n      let modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n      const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n      this._facetSizeX = modelSizeX;\n      this._facetSizeY = modelSizeY;\n      this._facetSizeZ = modelSizeZ;\n      this._facetsX = options2.facetCoordsX ? options2.facetsX : 1;\n      this._facetsY = options2.facetCoordsY ? options2.facetsY : 1;\n      this._facetsZ = options2.facetCoordsZ ? options2.facetsZ : 1;\n      this.minModelBoundsX -= this._facetSizeX * this._facetSpacingX / 2;\n      this.minModelBoundsY -= this._facetSizeY * this._facetSpacingY / 2;\n      this.minModelBoundsZ -= this._facetSizeZ * this._facetSpacingZ / 2;\n      this.maxModelBoundsX = this.minModelBoundsX + this._facetsX * this._facetSizeX * (1 + this._facetSpacingX);\n      this.maxModelBoundsY = this.minModelBoundsY + this._facetsY * this._facetSizeY * (1 + this._facetSpacingY);\n      this.maxModelBoundsZ = this.minModelBoundsZ + this._facetsZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n      this.modelOriginX = (this.minModelBoundsX + this.maxModelBoundsX) / 2;\n      this.modelOriginY = (this.minModelBoundsY + this.maxModelBoundsY) / 2;\n      this.modelOriginZ = (this.minModelBoundsZ + this.maxModelBoundsZ) / 2;\n      modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n      modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n      modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n      this._maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n      this._boundsScaling = this._maxBounds == 0 ? 1 : 1 / this._maxBounds;\n      this._facetScaling = maxBounds / this._maxBounds;\n    }\n    resetCumulativeLayoutBounds() {\n      this.minCumulativeLayoutBoundsX = void 0;\n      this.minCumulativeLayoutBoundsY = void 0;\n      this.minCumulativeLayoutBoundsZ = void 0;\n      this.maxCumulativeLayoutBoundsX = void 0;\n      this.maxCumulativeLayoutBoundsY = void 0;\n      this.maxCumulativeLayoutBoundsZ = void 0;\n    }\n    _updateCumulativeLayoutBounds() {\n      this.minCumulativeLayoutBoundsX = this.minCumulativeLayoutBoundsX === void 0 ? this.minLayoutBoundsX : Math.min(this.minCumulativeLayoutBoundsX, this.minLayoutBoundsX);\n      this.minCumulativeLayoutBoundsY = this.minCumulativeLayoutBoundsY === void 0 ? this.minLayoutBoundsY : Math.min(this.minCumulativeLayoutBoundsY, this.minLayoutBoundsY);\n      this.minCumulativeLayoutBoundsZ = this.minCumulativeLayoutBoundsZ === void 0 ? this.minLayoutBoundsZ : Math.min(this.minCumulativeLayoutBoundsZ, this.minLayoutBoundsZ);\n      this.maxCumulativeLayoutBoundsX = this.maxCumulativeLayoutBoundsX === void 0 ? this.maxLayoutBoundsX : Math.max(this.maxCumulativeLayoutBoundsX, this.maxLayoutBoundsX);\n      this.maxCumulativeLayoutBoundsY = this.maxCumulativeLayoutBoundsY === void 0 ? this.maxLayoutBoundsY : Math.max(this.maxCumulativeLayoutBoundsY, this.maxLayoutBoundsY);\n      this.maxCumulativeLayoutBoundsZ = this.maxCumulativeLayoutBoundsZ === void 0 ? this.maxLayoutBoundsZ : Math.max(this.maxCumulativeLayoutBoundsZ, this.maxLayoutBoundsZ);\n    }\n    unitToModelSize(unitSize) {\n      return unitSize / this._boundsScaling;\n    }\n    unitToModelPositionX(unitPositionX) {\n      return this.unitToModelSize(unitPositionX) + this.modelOriginX;\n    }\n    unitToModelPositionY(unitPositionY) {\n      return this.unitToModelSize(unitPositionY) + this.modelOriginY;\n    }\n    unitToModelPositionZ(unitPositionZ) {\n      return this.unitToModelSize(unitPositionZ) + this.modelOriginZ;\n    }\n    unitToModelPosition(unitPosition, modelPosition) {\n      modelPosition[0] = this.unitToModelPositionX(unitPosition[0]);\n      modelPosition[1] = this.unitToModelPositionY(unitPosition[1]);\n      modelPosition[2] = this.unitToModelPositionZ(unitPosition[2]);\n    }\n    modelToUnitSize(modelSize) {\n      return modelSize * this._boundsScaling;\n    }\n    modelToUnitPositionX(modelPositionX) {\n      return (modelPositionX - this.modelOriginX) * this._boundsScaling;\n    }\n    modelToUnitPositionY(modelPositionY) {\n      return (modelPositionY - this.modelOriginY) * this._boundsScaling;\n    }\n    modelToUnitPositionZ(modelPositionZ) {\n      return (modelPositionZ - this.modelOriginZ) * this._boundsScaling;\n    }\n    modelToUnitPosition(modelPosition, unitPosition) {\n      unitPosition[0] = this.modelToUnitPositionX(modelPosition[0]);\n      unitPosition[1] = this.modelToUnitPositionY(modelPosition[1]);\n      unitPosition[2] = this.modelToUnitPositionZ(modelPosition[2]);\n    }\n    inclusiveUnitBounds(buffer, ids, unitType, offset2, count2, minBounds, maxBounds) {\n      set$8(minBounds, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n      set$8(maxBounds, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n      const unitScale = create$6();\n      const unitRotation = create$4();\n      const unitTranslation = create$6();\n      const lookup2 = buffer.lookup;\n      const dataView = buffer.dataView;\n      let minBounds0;\n      let maxBounds0;\n      let minBounds1;\n      let maxBounds1;\n      switch (unitType) {\n        case UnitType.sphere:\n        case UnitType.sphereSdf:\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            const radius2 = unitScale[0] / 2;\n            minBounds[0] = Math.min(minBounds[0], unitTranslation[0] - radius2);\n            minBounds[1] = Math.min(minBounds[1], unitTranslation[1] - radius2);\n            minBounds[2] = Math.min(minBounds[2], unitTranslation[2] - radius2);\n            maxBounds[0] = Math.max(maxBounds[0], unitTranslation[0] + radius2);\n            maxBounds[1] = Math.max(maxBounds[1], unitTranslation[1] + radius2);\n            maxBounds[2] = Math.max(maxBounds[2], unitTranslation[2] + radius2);\n          }\n          break;\n        case UnitType.hexPrism:\n        case UnitType.hexPrismSdf:\n        case UnitType.block:\n        case UnitType.blockSdf:\n          minBounds0 = create$6();\n          maxBounds0 = create$6();\n          minBounds1 = create$6();\n          maxBounds1 = create$6();\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getRotation(dataView, index2, unitRotation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            minBounds0[0] = unitTranslation[0] - unitScale[0] / 2;\n            minBounds0[1] = unitTranslation[1] - unitScale[1] / 2;\n            minBounds0[2] = unitTranslation[2] - unitScale[2] / 2;\n            maxBounds0[0] = unitTranslation[0] + unitScale[0] / 2;\n            maxBounds0[1] = unitTranslation[1] + unitScale[1] / 2;\n            maxBounds0[2] = unitTranslation[2] + unitScale[2] / 2;\n            BoundsHelper.rotateBounds(minBounds0, maxBounds0, unitRotation, minBounds1, maxBounds1, Constants$1.VECTOR3_ZERO);\n            min$3(minBounds, minBounds, minBounds1);\n            max$3(maxBounds, maxBounds, maxBounds1);\n          }\n          break;\n        case UnitType.cylinder:\n        case UnitType.cylinderSdf:\n          minBounds0 = create$6();\n          maxBounds0 = create$6();\n          const pa2 = create$6();\n          const pb = create$6();\n          const identityRotation = Constants$1.VECTOR3_UNITY;\n          let ca;\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getRotation(dataView, index2, unitRotation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            const length2 = unitScale[1];\n            const radius2 = Math.max(unitScale[0], unitScale[2]);\n            if (length2 != 0 && radius2 != 0) {\n              if (equals$1(unitRotation, Constants$1.QUAT_IDENTITY)) {\n                ca = identityRotation;\n              } else {\n                ca = create$6();\n                transformQuat(ca, identityRotation, unitRotation);\n              }\n              scaleAndAdd(pa2, unitTranslation, ca, -length2 * 0.5);\n              scaleAndAdd(pb, unitTranslation, ca, length2 * 0.5);\n              BoundsHelper.cylinder(pa2, pb, radius2, minBounds0, maxBounds0);\n              min$3(minBounds, minBounds, minBounds0);\n              max$3(maxBounds, maxBounds, maxBounds0);\n            }\n          }\n          break;\n      }\n    }\n  }\n  class Scatter extends LayoutBase {\n    layout(buffer, ids, options2) {\n      const start = window.performance.now();\n      const offset2 = options2.offset === void 0 ? 0 : options2.offset;\n      const count2 = options2.count === void 0 ? ids.length : options2.count;\n      const positionScalingX = options2.positionScalingX === void 0 ? 1 : options2.positionScalingX;\n      const positionScalingY = options2.positionScalingY === void 0 ? 1 : options2.positionScalingY;\n      const positionScalingZ = options2.positionScalingZ === void 0 ? 1 : options2.positionScalingZ;\n      if (!this._positions || this._positions.length < buffer.length * 3) {\n        this._positions = new Float32Array(buffer.length * 3);\n      }\n      this.minLayoutBoundsX = Number.MAX_VALUE;\n      this.minLayoutBoundsY = Number.MAX_VALUE;\n      this.minLayoutBoundsZ = Number.MAX_VALUE;\n      this.maxLayoutBoundsX = -Number.MAX_VALUE;\n      this.maxLayoutBoundsY = -Number.MAX_VALUE;\n      this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = lookup2[id2];\n        let positionX = options2.positionsX ? options2.positionsX[id2] * positionScalingX : 0;\n        let positionY = options2.positionsY ? options2.positionsY[id2] * positionScalingY : 0;\n        let positionZ = options2.positionsZ ? options2.positionsZ[id2] * positionScalingZ : 0;\n        this._positions[index2 * 3] = positionX;\n        this._positions[index2 * 3 + 1] = positionY;\n        this._positions[index2 * 3 + 2] = positionZ;\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, positionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, positionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, positionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, positionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, positionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, positionZ);\n      }\n      this._updateCumulativeLayoutBounds();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options2) {\n      const start = window.performance.now();\n      const offset2 = options2.offset === void 0 ? 0 : options2.offset;\n      const count2 = options2.count === void 0 ? ids.length : options2.count;\n      const dataView = buffer.dataView;\n      const _vec2 = create$3();\n      const _vec3 = create$6();\n      const _vec4 = create$5();\n      const _quat = create$4();\n      const sizeScalingX = options2.sizeScaling === void 0 ? options2.sizeScalingX === void 0 ? 1 : options2.sizeScalingX : options2.sizeScaling;\n      const sizeScalingY = options2.sizeScaling === void 0 ? options2.sizeScalingY === void 0 ? 1 : options2.sizeScalingY : options2.sizeScaling;\n      const sizeScalingZ = options2.sizeScaling === void 0 ? options2.sizeScalingZ === void 0 ? 1 : options2.sizeScalingZ : options2.sizeScaling;\n      const sizesX = options2.sizes ? options2.sizes : options2.sizesX;\n      const sizesY = options2.sizes ? options2.sizes : options2.sizesY;\n      const sizesZ = options2.sizes ? options2.sizes : options2.sizesZ;\n      const minSize = options2.minSize === void 0 ? 0 : options2.minSize;\n      const minColor = options2.minColor === void 0 ? 0 : options2.minColor;\n      const maxColor = options2.maxColor === void 0 ? 1 : options2.maxColor;\n      const minOrder = options2.minOrder === void 0 ? 0 : options2.minOrder;\n      const maxOrder = options2.maxOrder === void 0 ? 1 : options2.maxOrder;\n      const orderReverse = options2.orderReverse === void 0 ? false : options2.orderReverse;\n      const minStaggerOrder = options2.minStaggerOrder === void 0 ? 0 : options2.minStaggerOrder;\n      const maxStaggerOrder = options2.maxStaggerOrder === void 0 ? 1 : options2.maxStaggerOrder;\n      const staggerOrderReverse = options2.staggerOrderReverse === void 0 ? false : options2.staggerOrderReverse;\n      const reverseX = options2.reverseX === void 0 ? false : options2.reverseX;\n      const reverseY = options2.reverseY === void 0 ? false : options2.reverseY;\n      const reverseZ = options2.reverseZ === void 0 ? false : options2.reverseZ;\n      this._updateModelBounds(options2);\n      if (options2.rotation) {\n        _quat[0] = options2.rotation[0];\n        _quat[1] = options2.rotation[1];\n        _quat[2] = options2.rotation[2];\n        _quat[3] = options2.rotation[3];\n      } else {\n        rotationTo(_quat, this._core.config.identityRotation, Constants$1.VECTOR3_UNITY);\n      }\n      if (options2.texCoord) {\n        _vec4[0] = options2.texCoord[0];\n        _vec4[1] = options2.texCoord[1];\n        _vec4[2] = options2.texCoord[2];\n        _vec4[3] = options2.texCoord[3];\n      }\n      const lookup2 = buffer.lookup;\n      const selection = options2.selected && options2.selected.size > 0;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = lookup2[id2];\n        let positionX = this._positions[index2 * 3];\n        let positionY = this._positions[index2 * 3 + 1];\n        let positionZ = this._positions[index2 * 3 + 2];\n        if (this._isFacetted) {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n          }\n          const facetX = options2.facetCoordsX ? options2.facetCoordsX[id2] : 0;\n          const facetY = options2.facetCoordsY ? options2.facetCoordsY[id2] : 0;\n          const facetZ = options2.facetCoordsZ ? options2.facetCoordsZ[id2] : 0;\n          positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n          positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n          positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        } else {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n          }\n        }\n        _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n        _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n        _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n        UnitVertex.setTranslation(dataView, index2, _vec3);\n        _vec3[0] = Math.max((sizesX ? Math.abs(sizesX[id2]) : 1) * sizeScalingX, minSize) * this._boundsScaling;\n        _vec3[1] = Math.max((sizesY ? Math.abs(sizesY[id2]) : 1) * sizeScalingY, minSize) * this._boundsScaling;\n        _vec3[2] = Math.max((sizesZ ? Math.abs(sizesZ[id2]) : 1) * sizeScalingZ, minSize) * this._boundsScaling;\n        UnitVertex.setScale(dataView, index2, _vec3);\n        if (options2.rotations) {\n          _quat[0] = options2.rotations[id2 * 4];\n          _quat[1] = options2.rotations[id2 * 4 + 1];\n          _quat[2] = options2.rotations[id2 * 4 + 2];\n          _quat[3] = options2.rotations[id2 * 4 + 3];\n          UnitVertex.setRotation(dataView, index2, _quat);\n        } else {\n          UnitVertex.setRotation(dataView, index2, _quat);\n        }\n        if (options2.colors) {\n          const size = 1 / (maxColor - minColor + 1);\n          const color2 = MathHelper.normalize(options2.colors[id2], minColor, maxColor, size / 2, 1 - size / 2);\n          if (options2.colors1) {\n            const color1 = MathHelper.normalize(options2.colors1[id2], minColor, maxColor, size / 2, 1 - size / 2);\n            set$5(_vec2, color2, color1);\n          } else {\n            set$5(_vec2, color2, color2);\n          }\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else {\n          UnitVertex.setColor(dataView, index2, Constants$1.VECTOR2_ONE);\n        }\n        UnitVertex.setIdHover(dataView, index2, options2.hover ? options2.hover[id2] : id2);\n        UnitVertex.setSelected(dataView, index2, selection ? options2.selected.has(id2) ? 1 : -1 : 0);\n        if (options2.order !== void 0) {\n          const order = MathHelper.normalize(options2.order[id2], minOrder, maxOrder, 0, 1);\n          _vec2[0] = orderReverse ? 1 - order : order;\n        } else {\n          _vec2[0] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        if (options2.staggerOrder !== void 0) {\n          _vec2[1] = options2.staggerOrder;\n        } else if (options2.staggerOrders) {\n          const stagger = MathHelper.normalize(options2.staggerOrders[id2], minStaggerOrder, maxStaggerOrder, 0, 1);\n          _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n        } else {\n          _vec2[1] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        UnitVertex.setOrder(dataView, index2, _vec2);\n        UnitVertex.setMaterial(dataView, index2, options2.material ? options2.material : options2.materials ? options2.materials[id2] : 0);\n        UnitVertex.setRounding(dataView, index2, options2.rounding ? options2.rounding * this._boundsScaling : options2.roundings ? options2.roundings[id2] * this._boundsScaling : 0);\n        UnitVertex.setParameter1(dataView, index2, options2.parameter1 ? options2.parameter1 : options2.parameters1 ? options2.parameters1[id2] : 0);\n        UnitVertex.setParameter2(dataView, index2, options2.parameter2 ? options2.parameter2 : options2.parameters2 ? options2.parameters2[id2] : 0);\n        UnitVertex.setSdfBuffer(dataView, index2, options2.sdfBuffer ? options2.sdfBuffer : options2.sdfBuffers ? options2.sdfBuffers[id2] : this._core.config.sdfBuffer);\n        UnitVertex.setSdfBorder(dataView, index2, options2.sdfBorder ? options2.sdfBorder : options2.sdfBorders ? options2.sdfBorders[id2] : this._core.config.sdfBorder);\n        if (options2.texCoords) {\n          _vec4[0] = options2.texCoords[id2 * 4];\n          _vec4[1] = options2.texCoords[id2 * 4 + 1];\n          _vec4[2] = options2.texCoords[id2 * 4 + 2];\n          _vec4[3] = options2.texCoords[id2 * 4 + 3];\n          UnitVertex.setTexCoord(dataView, index2, _vec4);\n        } else {\n          UnitVertex.setTexCoord(dataView, index2, _vec4);\n        }\n        UnitVertex.setMatId(dataView, index2, options2.materialType ? options2.materialType : options2.materialTypes ? options2.materialTypes[id2] : 0);\n        UnitVertex.setMatColor(dataView, index2, options2.materialColor ? options2.materialColor : options2.materialColors ? [options2.materialColors[id2 * 3], options2.materialColors[id2 * 3 + 1], options2.materialColors[id2 * 3 + 2]] : [0, 0, 0]);\n        UnitVertex.setMatFuzz(dataView, index2, options2.materialFuzz ? options2.materialFuzz : options2.materialFuzzes ? options2.materialFuzzes[id2] : 0);\n        UnitVertex.setMatGloss(dataView, index2, options2.materialGloss ? options2.materialGloss : options2.materialGlosses ? options2.materialGlosses[id2] : 0);\n        UnitVertex.setMatDensity(dataView, index2, options2.materialDensity ? options2.materialDensity : options2.materialDensities ? options2.materialDensities[id2] : 0);\n        UnitVertex.setMatRefractiveIndex(dataView, index2, options2.materialRefractiveIndex ? options2.materialRefractiveIndex : options2.materialRefractiveIndices ? options2.materialRefractiveIndices[id2] : 0);\n        UnitVertex.setSegColor(dataView, index2, options2.segmentColor ? options2.segmentColor : options2.segmentColors ? [options2.segmentColors[id2 * 4], options2.segmentColors[id2 * 4 + 1], options2.segmentColors[id2 * 4 + 2], options2.segmentColors[id2 * 4 + 3]] : [buffer.idColors[id2 * 4], buffer.idColors[id2 * 4 + 1], buffer.idColors[id2 * 4 + 2], buffer.idColors[id2 * 4 + 3]]);\n      }\n      buffer.update();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  fromValues$3(0.2126, 0.7152, 0.0722);\n  create$6();\n  create$6();\n  class PathHelper {\n    static getFilenameWithoutExtension(path2) {\n      const dot2 = path2.lastIndexOf(\".\");\n      if (dot2 == -1) {\n        return path2;\n      } else {\n        const start = path2.lastIndexOf(\"/\") == -1 ? 0 : path2.lastIndexOf(\"/\") + 1;\n        return path2.substring(start, dot2);\n      }\n    }\n    static getExtension(path2) {\n      const dot2 = path2.lastIndexOf(\".\");\n      if (dot2 == -1 || dot2 == path2.length - 1) {\n        return null;\n      } else {\n        return path2.substring(dot2 + 1, path2.length);\n      }\n    }\n    static getFilename(path2) {\n      if (path2.lastIndexOf(\"/\") == -1) {\n        return path2;\n      } else {\n        const start = path2.lastIndexOf(\"/\") + 1;\n        return path2.substring(start, path2.length);\n      }\n    }\n    static getPath(path2) {\n      if (path2.lastIndexOf(\"/\") == -1) {\n        return \"\";\n      } else {\n        return path2.substring(0, path2.lastIndexOf(\"/\"));\n      }\n    }\n    static combine(first, second2) {\n      const seperator = first.lastIndexOf(\"/\") == first.length - 1;\n      if (second2.indexOf(\"/\") == 0) {\n        if (seperator) {\n          return first.substring(0, first.length - 1) + second2;\n        } else {\n          return first + second2;\n        }\n      } else {\n        if (seperator) {\n          return first + second2;\n        } else {\n          return first + \"/\" + second2;\n        }\n      }\n    }\n  }\n  class TextureHelper {\n    static create(gl, width2, height2, format2, type2, filter2, bytes, internalFormat = format2) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter2);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter2);\n      gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width2, height2, 0, format2, type2, bytes);\n      return texture;\n    }\n    static fromImage(gl, image2, mipmaps, filter2) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image2);\n      if (mipmaps && MathHelper.isPowerOf2(image2.width) && MathHelper.isPowerOf2(image2.height))\n        gl.generateMipmap(gl.TEXTURE_2D);\n      else {\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter2);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter2);\n      }\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      return texture;\n    }\n    static cubemapFromImages(gl, images) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n      const targets = [\n        gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n        gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n        gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n      ];\n      for (let i = 0; i < 6; i++) {\n        gl.texImage2D(targets[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, images[i]);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      }\n      gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n      gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n      return texture;\n    }\n  }\n  class Line extends LayoutBase {\n    layout(buffer, ids, fromIds, toIds, options2) {\n      const start = window.performance.now();\n      const offset2 = options2.offset === void 0 ? 0 : options2.offset;\n      const count2 = options2.count === void 0 ? ids.length : options2.count;\n      const positionScalingX = options2.positionScalingX === void 0 ? 1 : options2.positionScalingX;\n      const positionScalingY = options2.positionScalingY === void 0 ? 1 : options2.positionScalingY;\n      const positionScalingZ = options2.positionScalingZ === void 0 ? 1 : options2.positionScalingZ;\n      const sizeScalingX = options2.sizeScaling === void 0 ? options2.sizeScalingX === void 0 ? 1 : options2.sizeScalingX : options2.sizeScaling;\n      const sizeScalingY = options2.sizeScaling === void 0 ? options2.sizeScalingY === void 0 ? 1 : options2.sizeScalingY : options2.sizeScaling;\n      const sizeScalingZ = options2.sizeScaling === void 0 ? options2.sizeScalingZ === void 0 ? 1 : options2.sizeScalingZ : options2.sizeScaling;\n      const minSize = options2.minSize === void 0 ? 0 : options2.minSize;\n      const offsetScaling = options2.offsetScaling === void 0 ? 1 : options2.offsetScaling;\n      if (!this._positions || this._positions.length < buffer.length * 3) {\n        this._positions = new Float32Array(buffer.length * 3);\n        this._sizes = new Float32Array(buffer.length * 3);\n        this._rotations = new Float32Array(buffer.length * 4);\n      }\n      this.minLayoutBoundsX = Number.MAX_VALUE;\n      this.minLayoutBoundsY = Number.MAX_VALUE;\n      this.minLayoutBoundsZ = Number.MAX_VALUE;\n      this.maxLayoutBoundsX = -Number.MAX_VALUE;\n      this.maxLayoutBoundsY = -Number.MAX_VALUE;\n      this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n      const _vec3 = create$6();\n      const _quat = create$4();\n      const direction = create$6();\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const fromId = fromIds[id2];\n        const toId = toIds[id2];\n        const index2 = lookup2[id2];\n        let toPositionX = options2.positionsX ? options2.positionsX[toId] * positionScalingX : 0;\n        let toPositionY = options2.positionsY ? options2.positionsY[toId] * positionScalingY : 0;\n        let toPositionZ = options2.positionsZ ? options2.positionsZ[toId] * positionScalingZ : 0;\n        let fromPositionX = options2.positionsX ? options2.positionsX[fromId] * positionScalingX : 0;\n        let fromPositionY = options2.positionsY ? options2.positionsY[fromId] * positionScalingY : 0;\n        let fromPositionZ = options2.positionsZ ? options2.positionsZ[fromId] * positionScalingZ : 0;\n        if (fromId == toId) {\n          this._sizes[index2 * 3] = 0;\n          this._sizes[index2 * 3 + 1] = 0;\n          this._sizes[index2 * 3 + 2] = 0;\n          this._rotations[index2 * 4] = 0;\n          this._rotations[index2 * 4 + 1] = 0;\n          this._rotations[index2 * 4 + 2] = 0;\n          this._rotations[index2 * 4 + 3] = 1;\n        } else {\n          direction[0] = toPositionX - fromPositionX;\n          direction[1] = toPositionY - fromPositionY;\n          direction[2] = toPositionZ - fromPositionZ;\n          let length2 = length$1(direction);\n          scale$5(direction, direction, 1 / length2);\n          rotationTo(_quat, this._core.config.identityRotation, direction);\n          this._rotations[index2 * 4] = _quat[0];\n          this._rotations[index2 * 4 + 1] = _quat[1];\n          this._rotations[index2 * 4 + 2] = _quat[2];\n          this._rotations[index2 * 4 + 3] = _quat[3];\n          if (options2.offsets) {\n            const fromOffset = options2.offsets[fromId] * offsetScaling / 2;\n            const toOffset = options2.offsets[toId] * offsetScaling / 2;\n            toPositionX -= direction[0] * toOffset;\n            toPositionY -= direction[1] * toOffset;\n            toPositionZ -= direction[2] * toOffset;\n            fromPositionX += direction[0] * fromOffset;\n            fromPositionY += direction[1] * fromOffset;\n            fromPositionZ += direction[2] * fromOffset;\n            length2 = Math.max(length2 - toOffset - fromOffset, minSize);\n          }\n          this._sizes[index2 * 3 + 1] = Math.max(length2 * sizeScalingY, minSize);\n          if (options2.lineSizes) {\n            this._sizes[index2 * 3] = Math.max(options2.lineSizes[id2] * sizeScalingX, minSize);\n            this._sizes[index2 * 3 + 2] = Math.max(options2.lineSizes[id2] * sizeScalingZ, minSize);\n          } else if (options2.endSizes) {\n            this._sizes[index2 * 3] = Math.max(options2.endSizes[fromId] * sizeScalingX, minSize);\n            this._sizes[index2 * 3 + 2] = Math.max(options2.endSizes[toId] * sizeScalingZ, minSize);\n          } else {\n            this._sizes[index2 * 3] = sizeScalingX;\n            this._sizes[index2 * 3 + 2] = sizeScalingZ;\n          }\n        }\n        _vec3[0] = (fromPositionX + toPositionX) / 2;\n        _vec3[1] = (fromPositionY + toPositionY) / 2;\n        _vec3[2] = (fromPositionZ + toPositionZ) / 2;\n        this._positions[index2 * 3] = _vec3[0];\n        this._positions[index2 * 3 + 1] = _vec3[1];\n        this._positions[index2 * 3 + 2] = _vec3[2];\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, fromPositionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, fromPositionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, fromPositionZ);\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, toPositionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, toPositionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, toPositionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, fromPositionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, fromPositionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, fromPositionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, toPositionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, toPositionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, toPositionZ);\n      }\n      this._updateCumulativeLayoutBounds();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, fromIds, toIds, options2) {\n      const start = window.performance.now();\n      const offset2 = options2.offset === void 0 ? 0 : options2.offset;\n      const count2 = options2.count === void 0 ? ids.length : options2.count;\n      const dataView = buffer.dataView;\n      const _vec2 = create$3();\n      const _vec3 = create$6();\n      const _quat = create$4();\n      const endMinColor = options2.endMinColor === void 0 ? 0 : options2.endMinColor;\n      const endMaxColor = options2.endMaxColor === void 0 ? 1 : options2.endMaxColor;\n      const lineMinColor = options2.lineMinColor === void 0 ? 0 : options2.lineMinColor;\n      const lineMaxColor = options2.lineMaxColor === void 0 ? 1 : options2.lineMaxColor;\n      const minOrder = options2.minOrder === void 0 ? 0 : options2.minOrder;\n      const maxOrder = options2.maxOrder === void 0 ? 1 : options2.maxOrder;\n      const orderReverse = options2.orderReverse === void 0 ? false : options2.orderReverse;\n      const minStaggerOrder = options2.minStaggerOrder === void 0 ? 0 : options2.minStaggerOrder;\n      const maxStaggerOrder = options2.maxStaggerOrder === void 0 ? 1 : options2.maxStaggerOrder;\n      const staggerOrderReverse = options2.staggerOrderReverse === void 0 ? false : options2.staggerOrderReverse;\n      const reverseX = options2.reverseX === void 0 ? false : options2.reverseX;\n      const reverseY = options2.reverseY === void 0 ? false : options2.reverseY;\n      const reverseZ = options2.reverseZ === void 0 ? false : options2.reverseZ;\n      this._updateModelBounds(options2);\n      const lookup2 = buffer.lookup;\n      const selection = options2.selected && options2.selected.size > 0;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const fromId = fromIds[id2];\n        const toId = toIds[id2];\n        const index2 = lookup2[id2];\n        let positionX = this._positions[index2 * 3];\n        let positionY = this._positions[index2 * 3 + 1];\n        let positionZ = this._positions[index2 * 3 + 2];\n        if (this._isFacetted) {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n          }\n          const facetX = options2.facetCoordsX ? options2.facetCoordsX[id2] : 0;\n          const facetY = options2.facetCoordsY ? options2.facetCoordsY[id2] : 0;\n          const facetZ = options2.facetCoordsZ ? options2.facetCoordsZ[id2] : 0;\n          positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n          positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n          positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        } else {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n          }\n        }\n        _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n        _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n        _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n        UnitVertex.setTranslation(dataView, index2, _vec3);\n        _vec3[0] = this._sizes[index2 * 3] * this._boundsScaling;\n        _vec3[1] = this._sizes[index2 * 3 + 1] * this._boundsScaling;\n        _vec3[2] = this._sizes[index2 * 3 + 2] * this._boundsScaling;\n        UnitVertex.setScale(dataView, index2, _vec3);\n        _quat[0] = this._rotations[index2 * 4];\n        _quat[1] = this._rotations[index2 * 4 + 1];\n        _quat[2] = this._rotations[index2 * 4 + 2];\n        _quat[3] = this._rotations[index2 * 4 + 3];\n        if (reverseX) {\n          _quat[1] = -_quat[1];\n          _quat[2] = -_quat[2];\n        }\n        if (reverseY) {\n          _quat[0] = -_quat[0];\n          _quat[2] = -_quat[2];\n        }\n        if (reverseZ) {\n          _quat[0] = -_quat[0];\n          _quat[1] = -_quat[1];\n        }\n        UnitVertex.setRotation(dataView, index2, _quat);\n        let size;\n        if (options2.endColors) {\n          size = 1 / (endMaxColor - endMinColor + 1);\n          const fromColor = MathHelper.normalize(options2.endColors[fromId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n          const toColor = MathHelper.normalize(options2.endColors[toId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n          set$5(_vec2, fromColor, toColor);\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else if (options2.lineColors) {\n          size = 1 / (lineMaxColor - lineMinColor + 1);\n          const color2 = MathHelper.normalize(options2.lineColors[id2], lineMinColor, lineMaxColor, size / 2, 1 - size / 2);\n          set$5(_vec2, color2, color2);\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else {\n          UnitVertex.setColor(dataView, index2, Constants$1.VECTOR2_ONE);\n        }\n        UnitVertex.setIdHover(dataView, index2, options2.hover ? options2.hover[id2] : id2);\n        UnitVertex.setSelected(dataView, index2, selection ? options2.selected.has(id2) ? 1 : -1 : 0);\n        if (options2.order !== void 0) {\n          const order = MathHelper.normalize(options2.order[id2], minOrder, maxOrder, 0, 1);\n          _vec2[0] = orderReverse ? 1 - order : order;\n        } else {\n          _vec2[0] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        if (options2.staggerOrder !== void 0) {\n          _vec2[1] = options2.staggerOrder;\n        } else if (options2.staggerOrders) {\n          const stagger = MathHelper.normalize(options2.staggerOrders[id2], minStaggerOrder, maxStaggerOrder, 0, 1);\n          _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n        } else {\n          _vec2[1] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        UnitVertex.setOrder(dataView, index2, _vec2);\n        UnitVertex.setMaterial(dataView, index2, options2.material ? options2.material : options2.materials ? options2.materials[id2] : 0);\n        UnitVertex.setRounding(dataView, index2, options2.rounding ? options2.rounding * this._boundsScaling : options2.roundings ? options2.roundings[id2] * this._boundsScaling : 0);\n        UnitVertex.setSdfBuffer(dataView, index2, options2.sdfBuffer ? options2.sdfBuffer : options2.sdfBuffers ? options2.sdfBuffers[id2] : this._core.config.sdfBuffer);\n        UnitVertex.setSdfBorder(dataView, index2, options2.sdfBorder ? options2.sdfBorder : options2.sdfBorders ? options2.sdfBorders[id2] : this._core.config.sdfBorder);\n        UnitVertex.setMatId(dataView, index2, options2.materialType ? options2.materialType : options2.materialTypes ? options2.materialTypes[id2] : 0);\n        UnitVertex.setMatColor(dataView, index2, options2.materialColor ? options2.materialColor : options2.materialColors ? [options2.materialColors[id2 * 3], options2.materialColors[id2 * 3 + 1], options2.materialColors[id2 * 3 + 2]] : [0, 0, 0]);\n        UnitVertex.setMatFuzz(dataView, index2, options2.materialFuzz ? options2.materialFuzz : options2.materialFuzzes ? options2.materialFuzzes[id2] : 0);\n        UnitVertex.setMatGloss(dataView, index2, options2.materialGloss ? options2.materialGloss : options2.materialGlosses ? options2.materialGlosses[id2] : 0);\n        UnitVertex.setMatDensity(dataView, index2, options2.materialDensity ? options2.materialDensity : options2.materialDensities ? options2.materialDensities[id2] : 0);\n        UnitVertex.setMatRefractiveIndex(dataView, index2, options2.materialRefractiveIndex ? options2.materialRefractiveIndex : options2.materialRefractiveIndices ? options2.materialRefractiveIndices[id2] : 0);\n        UnitVertex.setSegColor(dataView, index2, options2.segmentColor ? options2.segmentColor : options2.segmentColors ? [options2.segmentColors[id2 * 4], options2.segmentColors[id2 * 4 + 1], options2.segmentColors[id2 * 4 + 2], options2.segmentColors[id2 * 4 + 3]] : [buffer.idColors[id2 * 4], buffer.idColors[id2 * 4 + 1], buffer.idColors[id2 * 4 + 2], buffer.idColors[id2 * 4 + 3]]);\n      }\n      buffer.update();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  class AtlasBase {\n    get imageData() {\n      return this._imageData;\n    }\n    set imageData(value2) {\n      if (this._imageData != value2) {\n        this._imageData = value2;\n        this._changed = true;\n      }\n    }\n    constructor() {\n      this._imageData = null;\n    }\n    copyFrom(atlas) {\n      if (atlas.imageData) {\n        this._imageData = atlas.imageData;\n        this._changed = true;\n      } else {\n        this.imageData = null;\n      }\n    }\n    update() {\n    }\n  }\n  let Atlas$2 = class Atlas extends AtlasBase {\n  };\n  class BufferBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get ids() {\n      return this._ids;\n    }\n    get dataView() {\n      return this._dataView;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get lookup() {\n      return this._lookup;\n    }\n    get length() {\n      return this._length;\n    }\n    get selected() {\n      return this._selected;\n    }\n    constructor(core, ids) {\n      this._core = core;\n      this._ids = ids;\n      this._length = ids.length;\n      this._vertices = new ArrayBuffer(this._length * UnitVertex.SIZE_BYTES);\n      this._dataView = new DataView(this._vertices);\n      this._selected = /* @__PURE__ */ new Set();\n      this.from = 0;\n      this.to = 1;\n      this.unitType = UnitType.block;\n      this._lookup = {};\n      for (let i = 0; i < this._length; i++) {\n        const id2 = ids[i];\n        this._lookup[id2] = i;\n        UnitVertex.setRotation(this._dataView, i, Constants$1.QUAT_IDENTITY);\n      }\n    }\n    createShared() {\n      const buffer = Object.create(this);\n      buffer._vertices = new ArrayBuffer(buffer._vertices.byteLength);\n      buffer._dataView = new DataView(buffer._vertices);\n      return buffer;\n    }\n    copyFrom(buffer) {\n      const start = window.performance.now();\n      const fromDataView = buffer.dataView;\n      const toDataView = this._dataView;\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < this._length; i++) {\n        const index2 = lookup2[this._ids[i]];\n        if (index2 != null) {\n          UnitVertex.copyIdHover(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTranslation(fromDataView, index2, toDataView, i);\n          UnitVertex.copyScale(fromDataView, index2, toDataView, i);\n          UnitVertex.copyRotation(fromDataView, index2, toDataView, i);\n          UnitVertex.copyColor(fromDataView, index2, toDataView, i);\n          UnitVertex.copySelected(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMaterial(fromDataView, index2, toDataView, i);\n          UnitVertex.copyRounding(fromDataView, index2, toDataView, i);\n          UnitVertex.copyOrder(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTexCoord(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTexture(fromDataView, index2, toDataView, i);\n          UnitVertex.copySdfBuffer(fromDataView, index2, toDataView, i);\n          UnitVertex.copySdfBorder(fromDataView, index2, toDataView, i);\n          UnitVertex.copyParameter1(fromDataView, index2, toDataView, i);\n          UnitVertex.copyParameter2(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatId(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatColor(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatFuzz(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatRefractiveIndex(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatGloss(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatDensity(fromDataView, index2, toDataView, i);\n          UnitVertex.copySegColor(fromDataView, index2, toDataView, i);\n        } else {\n          UnitVertex.setRotation(toDataView, i, Constants$1.QUAT_IDENTITY);\n        }\n      }\n      this.unitType = buffer.unitType;\n      this._selected = buffer.selected;\n      this._core.log.write(LogLevel.info, `buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update() {\n    }\n    updateSelection(options2) {\n      const start = window.performance.now();\n      const ids = options2 && options2.ids ? options2.ids : this._ids;\n      const offset2 = options2 && options2.offset !== void 0 ? options2.offset : 0;\n      const count2 = options2 && options2.count !== void 0 ? options2.count : ids.length;\n      const selection = this._selected.size > 0;\n      const dataView = this._dataView;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = this._lookup[id2];\n        UnitVertex.setSelected(dataView, index2, selection ? this._selected.has(id2) ? 1 : -1 : 0);\n      }\n      this.update();\n      this._core.log.write(LogLevel.info, `buffer update selection ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  class TransitionBufferBase {\n    get pickIdLookup() {\n      return this._pickIdLookup;\n    }\n    get currentBuffer() {\n      return this._isBuffer1Current ? this._buffer1 : this._buffer2;\n    }\n    get previousBuffer() {\n      return this._isBuffer1Current ? this._buffer2 : this._buffer1;\n    }\n    get currentPalette() {\n      return this._isBuffer1Current ? this._palette1 : this._palette2;\n    }\n    get previousPalette() {\n      return this._isBuffer1Current ? this._palette2 : this._palette1;\n    }\n    get currentAtlas() {\n      return this._isBuffer1Current ? this._atlas1 : this._atlas2;\n    }\n    get previousAtlas() {\n      return this._isBuffer1Current ? this._atlas2 : this._atlas1;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get length() {\n      return this._length;\n    }\n    constructor(core, ids, bufferType, paletteType, atlasType) {\n      this.bufferType = bufferType;\n      this.paletteType = paletteType;\n      this.atlasType = atlasType;\n      this._core = core;\n      this._length = ids.length;\n      this.id = TransitionBufferBase._id++;\n      this.isVisible = true;\n      this.transitionTime = 1;\n      this.activeId = -1;\n      const start = window.performance.now();\n      this._buffer1 = new bufferType(core, ids);\n      this._buffer2 = this._buffer1.createShared();\n      this._palette1 = new paletteType();\n      this._palette2 = new paletteType();\n      this._atlas1 = new atlasType();\n      this._atlas2 = new atlasType();\n      this.isPickingEnabled = true;\n      this._pickIdLookup = {};\n      const dataView1 = this._buffer1.dataView;\n      const dataView2 = this._buffer2.dataView;\n      const _vec4 = create$5();\n      this.idColors = new Float32Array(this._length * 4);\n      this._buffer1.idColors = this.idColors;\n      this._buffer2.idColors = this.idColors;\n      for (let i = 0; i < this._length; i++) {\n        const id2 = ids[i];\n        const pickId = PickHelper.nextPickId();\n        this._pickIdLookup[pickId] = id2;\n        PickHelper.encodeNumber(pickId, PickType.data, _vec4);\n        this.idColors[i * 4] = _vec4[0];\n        this.idColors[i * 4 + 1] = _vec4[1];\n        this.idColors[i * 4 + 2] = _vec4[2];\n        this.idColors[i * 4 + 3] = _vec4[3];\n        UnitVertex.setIdColor(dataView1, i, _vec4);\n        UnitVertex.setIdColor(dataView2, i, _vec4);\n      }\n      this._core.log.write(LogLevel.info, `transition buffer created ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    swap() {\n      this._isBuffer1Current = !this._isBuffer1Current;\n    }\n    copyFrom(transitionBuffer) {\n      const start = window.performance.now();\n      this.key = transitionBuffer.key;\n      this.isVisible = transitionBuffer.isVisible;\n      this.transitionTime = transitionBuffer.transitionTime;\n      this.isPickingEnabled = transitionBuffer.isPickingEnabled;\n      this.unitType = transitionBuffer.unitType;\n      this.activeId = transitionBuffer.activeId;\n      this.currentBuffer.copyFrom(transitionBuffer.currentBuffer);\n      this.previousBuffer.copyFrom(transitionBuffer.previousBuffer);\n      this.currentBuffer.update();\n      this.previousBuffer.update();\n      this.currentPalette.copyFrom(transitionBuffer.currentPalette);\n      this.previousPalette.copyFrom(transitionBuffer.previousPalette);\n      this.currentAtlas.copyFrom(transitionBuffer.currentAtlas);\n      this.previousAtlas.copyFrom(transitionBuffer.previousAtlas);\n      this._core.log.write(LogLevel.info, `transition buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  TransitionBufferBase._id = 1;\n  let Buffer$3 = class Buffer extends BufferBase {\n    constructor(core, ids) {\n      super(core, ids);\n    }\n  };\n  let TransitionBuffer$2 = class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$3, Palette$3, Atlas$2);\n    }\n  };\n  class DebugAxes {\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    initialize() {\n      let vertexOffset = 0;\n      let indexOffset = 0;\n      const axisVertices = Cube.POSITIONS;\n      const axisIndices2 = Cube.INDICES;\n      this._vertices = new ArrayBuffer(3 * PositionColorVertex.SIZE_BYTES * axisVertices.length / PositionVertex.SIZE);\n      const verticesView = new DataView(this._vertices);\n      this._indices = new Uint16Array(3 * axisIndices2.length + 4);\n      const vertexCount = axisVertices.length / PositionVertex.SIZE;\n      const indexCount = axisIndices2.length;\n      const transform2 = create$7();\n      const length2 = 1;\n      const width2 = 0.01;\n      transform2[0] = length2;\n      transform2[5] = width2;\n      transform2[10] = width2;\n      transform2[12] = 0.5;\n      transform2[13] = 0;\n      transform2[14] = 0;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants$1.VECTOR3_UNITX, transform2, vertexOffset, indexOffset);\n      indexOffset += indexCount;\n      this._indices[indexOffset++] = axisIndices2[indexCount - 1] + vertexOffset;\n      vertexOffset += vertexCount;\n      this._indices[indexOffset++] = axisIndices2[0] + vertexOffset;\n      transform2[0] = width2;\n      transform2[5] = length2;\n      transform2[10] = width2;\n      transform2[12] = 0;\n      transform2[13] = 0.5;\n      transform2[14] = 0;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants$1.VECTOR3_UNITY, transform2, vertexOffset, indexOffset);\n      indexOffset += indexCount;\n      this._indices[indexOffset++] = axisIndices2[indexCount - 1] + vertexOffset;\n      vertexOffset += vertexCount;\n      this._indices[indexOffset++] = axisIndices2[0] + vertexOffset;\n      transform2[0] = width2;\n      transform2[5] = width2;\n      transform2[10] = length2;\n      transform2[12] = 0;\n      transform2[13] = 0;\n      transform2[14] = 0.5;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants$1.VECTOR3_UNITZ, transform2, vertexOffset, indexOffset);\n      this._indexCount = this._indices.length;\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    _createAxis(axisVertices, axisIndices2, verticesView, indices, color2, transform2, vertexOffset, indexOffset) {\n      const position2 = create$6();\n      const vertexCount = axisVertices.length / PositionVertex.SIZE;\n      const indexCount = axisIndices2.length;\n      for (let i = 0; i < vertexCount; i++) {\n        set$8(position2, axisVertices[i * PositionVertex.SIZE], axisVertices[i * PositionVertex.SIZE + 1], axisVertices[i * PositionVertex.SIZE + 2]);\n        transformMat4$2(position2, position2, transform2);\n        PositionColorVertex.setPosition(verticesView, vertexOffset + i, position2);\n        PositionColorVertex.setColor(verticesView, vertexOffset + i, color2);\n      }\n      for (let i = 0; i < indexCount; i++) {\n        indices[indexOffset + i] = axisIndices2[i] + vertexOffset;\n      }\n    }\n  }\n  var __awaiter$3 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class RendererConfig {\n    reset() {\n    }\n  }\n  class RendererBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get config() {\n      return this._config;\n    }\n    get devicePixelRatio() {\n      return this._devicePixelRatio;\n    }\n    get width() {\n      return this._canvas.width;\n    }\n    set width(value2) {\n      this._options.width = value2;\n    }\n    get height() {\n      return this._canvas.height;\n    }\n    set height(value2) {\n      this._options.height = value2;\n    }\n    get webXRReferenceSpace() {\n      return this._webXRReferenceSpace;\n    }\n    get pickedType() {\n      return this._pickedType;\n    }\n    get pickedId() {\n      return this._pickedId;\n    }\n    get isCapturingPickImage() {\n      return this._isCapturingPickImage;\n    }\n    capturePickImage() {\n      this._isCapturingPickImage = true;\n    }\n    get backgroundColor() {\n      return this._backgroundColor;\n    }\n    set backgroundColor(value2) {\n      if (!exactEquals(value2, this._backgroundColor)) {\n        this._backgroundColor = value2;\n      }\n    }\n    get ambientColor() {\n      return this._ambientColor;\n    }\n    set ambientColor(value2) {\n      if (!exactEquals$1(value2, this._ambientColor)) {\n        this._ambientColor = value2;\n      }\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    swapAxes() {\n      this._isAxes1Current = !this._isAxes1Current;\n    }\n    createCartesian2dAxesVisual(axes) {\n      return new AxesVisual(axes);\n    }\n    createCartesian3dAxesVisual(axes) {\n      return new AxesVisual(axes);\n    }\n    _createDebugAxesVisual(debugAxes) {\n      return null;\n    }\n    createLabelSetVisual(labelSet) {\n      return new LabelSetVisual$2(labelSet);\n    }\n    createControllerVisual(controller) {\n      return new ControllerVisual$1(controller);\n    }\n    createTransitionBuffer(ids) {\n      return new TransitionBuffer$2(this._core, ids);\n    }\n    createImageVisual(image2) {\n      return new ImageVisual$2(image2);\n    }\n    createFontVisual(font2) {\n      return new FontVisual$2(font2);\n    }\n    constructor(options2) {\n      this._options = options2;\n      this.fonts = {};\n    }\n    get isWebXRSupported() {\n      return false;\n    }\n    initialize(core) {\n      this._core = core;\n      this._canvas = document.createElement(\"canvas\");\n      const contextmenu = this._options && this._options.contextmenu;\n      if (!contextmenu) {\n        this._canvas.addEventListener(\"contextmenu\", (e) => {\n          e.preventDefault();\n        });\n      }\n      this._canvas.tabIndex = this._core.container.tabIndex;\n      this._canvas.style.display = \"block\";\n      this._canvas.style.touchAction = \"none\";\n      this._core.container.appendChild(this._canvas);\n      this._mvMatrices = [create$7(), create$7()];\n      this.pickPMatrix = create$7();\n      this.axesVisibility = AxesVisibility.current;\n      this._debugAxes = new DebugAxes();\n      this._debugAxesVisual = this._createDebugAxesVisual(this._debugAxes);\n      this.transitionTime = 1;\n      this.transitionBuffers = [];\n      this.areLabelsVisible = true;\n      this.labelSets = [];\n      this.controllers = [];\n      this.areImagesVisible = true;\n      this.images = [];\n      this._viewports = [new DOMRect(), new DOMRect()];\n      this.isPickingEnabled = false;\n      this._pickedType = PickType.none;\n      this._pickedId = 0;\n      this._lassoMMatrix = create$7();\n      this._lassoThickness = create$3();\n      this._resizeMinimumDelay = -1;\n      this._previousResizeWidth = -1;\n      this._previousResizeHeight = -1;\n    }\n    remove() {\n      this._core.container.removeChild(this._canvas);\n    }\n    finalize() {\n      this._isInitialized = false;\n    }\n    setSize(elapsedTime) {\n      if (this._options && this._options.width && this._options.height) {\n        this._devicePixelRatio = 1;\n        this._resizeWidth = this._options.width;\n        this._resizeHeight = this._options.height;\n      } else {\n        this._devicePixelRatio = window.devicePixelRatio || 1;\n        this._resizeWidth = this._core.container.clientWidth * devicePixelRatio;\n        this._resizeHeight = this._core.container.clientHeight * devicePixelRatio;\n      }\n      if (this._resizeWidth != this._previousResizeWidth || this._resizeHeight != this._previousResizeHeight) {\n        this._previousResizeWidth = this._resizeWidth;\n        this._previousResizeHeight = this._resizeHeight;\n        this._isResizing = true;\n        this._resizeElapsedTime = elapsedTime;\n      }\n      if (this._isResizing) {\n        if (this._resizeElapsedTime > this._resizeMinimumDelay && this._isInitialized) {\n          this._isResizing = false;\n          this._resizeMinimumDelay = this._core.config.resizeMinimumDelay;\n          this._resize(this._resizeWidth, this._resizeHeight);\n        } else {\n          this._resizeElapsedTime += elapsedTime;\n        }\n      }\n    }\n    _resize(width2, height2) {\n      this._canvas.style.width = `${Math.floor(width2 / this._devicePixelRatio)}px`;\n      this._canvas.style.height = `${Math.floor(height2 / this._devicePixelRatio)}px`;\n      width2 = Math.floor(width2);\n      height2 = Math.floor(height2);\n      this._canvas.width = width2;\n      this._canvas.height = height2;\n    }\n    update(elapsedTime) {\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        if (transitionBuffer.isVisible) {\n          const previous = transitionBuffer.previousPalette;\n          const current = transitionBuffer.currentPalette;\n          if (previous) {\n            previous.update();\n          }\n          if (current) {\n            current.update();\n          }\n        }\n      }\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        if (transitionBuffer.isVisible) {\n          const previous = transitionBuffer.previousAtlas;\n          const current = transitionBuffer.currentAtlas;\n          if (previous) {\n            previous.update();\n          }\n          if (current) {\n            current.update();\n          }\n        }\n      }\n      if (this._core.config.isDebugVisible) {\n        if (this._debugAxesVisual) {\n          this._debugAxesVisual.mMatrix = this.mMatrix;\n          this._debugAxesVisual.vMatrices = this.vMatrices;\n          this._debugAxesVisual.pMatrices = this.pMatrices;\n          this._debugAxesVisual.viewports = this._viewports;\n          this._debugAxesVisual.viewportOffset = this._viewportOffset;\n          this._debugAxesVisual.viewportCount = this._viewportCount;\n        }\n      }\n      if (this.areLabelsVisible) {\n        for (let i = 0; i < this.labelSets.length; i++) {\n          const labelSetVisual = this.labelSets[i];\n          if (labelSetVisual.isVisible) {\n            this.labelSets[i].label.update(elapsedTime);\n            labelSetVisual.mMatrix = this.mMatrix;\n            labelSetVisual.vMatrices = this.vMatrices;\n            labelSetVisual.pMatrices = this.pMatrices;\n            labelSetVisual.isPickingEnabled = this.isPickingEnabled;\n            labelSetVisual.pickPMatrix = this.pickPMatrix;\n            labelSetVisual.pickVMatrix = this.pickVMatrix;\n            labelSetVisual.viewports = this._viewports;\n            labelSetVisual.viewportOffset = this._viewportOffset;\n            labelSetVisual.viewportCount = this._viewportCount;\n            labelSetVisual.update(elapsedTime);\n          }\n        }\n      }\n      if (this.areImagesVisible) {\n        for (let i = 0; i < this.images.length; i++) {\n          const imageVisual = this.images[i];\n          if (imageVisual && imageVisual.isVisible) {\n            const image2 = this.images[i].image;\n            image2.update(elapsedTime);\n            imageVisual.mMatrix = this.mMatrix;\n            imageVisual.vMatrices = this.vMatrices;\n            imageVisual.pMatrices = this.pMatrices;\n            imageVisual.isPickingEnabled = this.isPickingEnabled;\n            imageVisual.pickPMatrix = this.pickPMatrix;\n            imageVisual.pickVMatrix = this.pickVMatrix;\n            imageVisual.viewports = this._viewports;\n            imageVisual.viewportOffset = this._viewportOffset;\n            imageVisual.viewportCount = this._viewportCount;\n            imageVisual.update(elapsedTime);\n          }\n        }\n      }\n      for (let i = 0; i < this.controllers.length; i++) {\n        const controllerVisual = this.controllers[i];\n        if (controllerVisual.isVisible) {\n          const controller = this.controllers[i].controller;\n          controller.update(elapsedTime);\n          controllerVisual.vMatrices = this.vMatrices;\n          controllerVisual.inverseVMatrices = this.vMatrices;\n          controllerVisual.pMatrices = this.pMatrices;\n          controllerVisual.viewports = this._viewports;\n          controllerVisual.viewportOffset = this._viewportOffset;\n          controllerVisual.viewportCount = this._viewportCount;\n          controllerVisual.update(elapsedTime);\n        }\n      }\n      const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n      if (axesVisuals) {\n        for (let i = 0; i < axesVisuals.length; i++) {\n          const axesVisual = axesVisuals[i];\n          if (axesVisual.isVisible) {\n            const axes = axesVisual.axes;\n            axes.mMatrix = this.mMatrix;\n            axes.vMatrix = this.vMatrices[0];\n            axes.update(elapsedTime);\n            axesVisual.vMatrices = this.vMatrices;\n            axesVisual.pMatrices = this.pMatrices;\n            axesVisual.isPickingEnabled = this.isPickingEnabled;\n            axesVisual.pickPMatrix = this.pickPMatrix;\n            axesVisual.pickVMatrix = this.pickVMatrix;\n            axesVisual.viewports = this._viewports;\n            axesVisual.viewportOffset = this._viewportOffset;\n            axesVisual.viewportCount = this._viewportCount;\n            axesVisual.update(elapsedTime);\n          }\n        }\n      }\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        const font2 = fontVisual.font;\n        font2.update();\n        fontVisual.update();\n      }\n    }\n    getVertexPosition(position2, pickedId) {\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        const id2 = transitionBuffer.pickIdLookup[pickedId];\n        if (id2 > -1) {\n          const index2 = transitionBuffer.currentBuffer.lookup[id2];\n          const dataView = transitionBuffer.currentBuffer.dataView;\n          UnitVertex.getTranslation(dataView, index2, position2);\n          break;\n        }\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$3(this, void 0, void 0, function* () {\n      });\n    }\n    prepare(xrFrame) {\n    }\n    initializeWebXR(session) {\n      return null;\n    }\n  }\n  let Quad$2 = class Quad {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const _vec3 = fromValues$3(2, 2, 2);\n      const _mat4 = create$7();\n      fromScaling(_mat4, _vec3);\n      const vertices = Quad$3.positions(_mat4);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$3.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  let Atlas$1 = class Atlas extends AtlasBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([255, 255, 255, 255]));\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._imageData) {\n        this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Palette$2 = class Palette extends PaletteBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._colors) {\n        const colors2 = new Uint8Array(this._colors);\n        for (let i = 0; i < colors2.length; i++) {\n          colors2[i] = Math.pow(colors2[i] / 255, 2.2) * 255;\n        }\n        this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors2);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Buffer$2 = class Buffer extends BufferBase {\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update() {\n      if (this._isInitialized) {\n        const start = window.performance.now();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n        this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n      }\n    }\n  };\n  let TransitionBuffer$1 = class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$2, Palette$2, Atlas$1);\n    }\n    initializeContext(gl) {\n      this._buffer1.initializeContext(gl);\n      this._buffer2.initializeContext(gl);\n      this._palette1.initializeContext(this._core, gl);\n      this._palette2.initializeContext(this._core, gl);\n      this._atlas1.initializeContext(this._core, gl);\n      this._atlas2.initializeContext(this._core, gl);\n      this._isInitialized = true;\n    }\n  };\n  let Config$1 = class Config extends RendererConfig {\n    constructor() {\n      super();\n      this.reset();\n    }\n    reset() {\n      this.specularIntensity = 0.15;\n      this.specularPower = 150;\n      this.lightPosition = fromValues$3(-0.5, 0.5, 0);\n      this.ambient = 0.01;\n      const _quat1 = create$4();\n      const _quat2 = create$4();\n      let angle2 = AngleHelper.degreesToRadians(15);\n      setAxisAngle(_quat1, Constants$1.VECTOR3_UNITX, angle2);\n      multiply(_quat2, _quat1, _quat2);\n      angle2 = AngleHelper.degreesToRadians(-15);\n      setAxisAngle(_quat1, Constants$1.VECTOR3_UNITY, angle2);\n      multiply(_quat2, _quat2, _quat1);\n      this.directionToLight = create$6();\n      transformQuat(this.directionToLight, Constants$1.VECTOR3_UNITZ, _quat2);\n      this.halfAngle = create$6();\n      add$4(this.halfAngle, Constants$1.VECTOR3_UNITZ, this.directionToLight);\n      normalize$5(this.halfAngle, this.halfAngle);\n      this.isFxaaEnabled = false;\n    }\n  };\n  let Resources$1 = class Resources {\n    bindFramebuffer(framebuffer) {\n      if (this.framebuffer != framebuffer) {\n        this.framebuffer = framebuffer;\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n      }\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this.framebuffer = this._gl.createFramebuffer();\n      this.ANGLE_instanced_arrays = gl.getExtension(\"ANGLE_instanced_arrays\");\n      this.OES_standard_derivatives = gl.getExtension(\"OES_standard_derivatives\");\n      this.EXT_frag_depth = gl.getExtension(\"EXT_frag_depth\");\n      this.OES_element_index_uint = gl.getExtension(\"OES_element_index_uint\");\n      this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n  };\n  Resources$1.glsl = {\n    \"anaglyph.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nconst vec3 LEFT_MASK = vec3(1.0, 0.0, 0.0);\\nconst vec3 RIGHT_MASK = vec3(0.0, 1.0, 1.0);\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 color = LEFT_MASK * dot(texture2D(uSampler1, texCoords).rgb, LUMINANCE);\\ncolor += RIGHT_MASK * dot(texture2D(uSampler2, texCoords).rgb, LUMINANCE);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n',\n    \"color.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec3 vColor;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(vColor, GAMMA), 1.0);\\n}\\n',\n    \"color.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec3 aColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying lowp vec3 vColor;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvColor = aColor;\\n}\\n\",\n    \"lasso.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\ngl_FragColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n',\n    \"lasso.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"model.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform sampler2D uSampler;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(texture2D(uSampler, vTexCoord).xyz, GAMMA), 1.0);\\nvec3 color = texture2D(uSampler, vTexCoord).xyz;\\nfloat ambient = 0.01;\\nvec3 normal = normalize(vNormal);\\nfloat diffuse = 0.5 * max(dot(uDirectionToLight, normal), 0.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (ambient + diffuse);\\ncolor += specular;\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n',\n    \"model.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nvTexCoord = aTexCoord;\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(aNormal, 0.0));\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\n}\\n\",\n    \"pickgrid.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#define Derivatives\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nuniform vec3 uDirectionToLight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick)\\n{\\ngl_FragColor = vColor;\\n}\\nelse\\n{\\nvec2 buffer;\\n#ifdef Derivatives\\nbuffer = fwidth(vTexCoord);\\n#else\\nbuffer = vec2(0.002);\\n#endif\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nfloat diffuse = 0.2 * max(dot(uDirectionToLight, vNormal), 0.0);\\nfloat ambient = 0.8;\\ncolor.xyz *= (ambient + diffuse);\\ncolor.xyz = pow(color.xyz, GAMMA);\\ngl_FragColor = color;\\n}\\n}\\n',\n    \"pickgrid.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec4 aIdColor;\\nattribute mediump vec2 aTexCoord;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#define Derivatives\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse {\\nfloat distance = texture2D(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\ngl_FragColor = vec4(pow(mix(uBorderColor, mix(uColor, uHoverColor, vHover), value), GAMMA), 1.0);\\n}\\n}\\n',\n    \"sdftext.vertex.fx\": \"#version 100\\nattribute lowp vec4 aIdColor;\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nif (uPick) {\\ngl_FragColor = vec4(0.0);\\n}\\nelse {\\ngl_FragColor = vec4(texture2D(uSampler, vTexCoord).xyz, 1.0);\\n}\\n}\\n\",\n    \"texture.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": '#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void)\\n{\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n',\n    \"unitblock.vertex.fx\": '#version 100\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitcylinder.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - sqrt(h1);\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - sqrt(h2);\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unitcylinder.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unithexprism.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform mat4 uVMatrix;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nvec4 iHexPrism( in vec3 ro, in vec3 rd, in float ra, in float he )\\n{\\nconst vec3 n1 = vec3( 1.0,0.0,0.0);\\nconst vec3 n2 = vec3( 0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n3 = vec3(-0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n4 = vec3( 0.0,1.0,0.0);\\nvec3 t1 = vec3((vec2(ra,-ra)-dot(ro,n1))/dot(rd,n1), 1.0);\\nvec3 t2 = vec3((vec2(ra,-ra)-dot(ro,n2))/dot(rd,n2), 1.0);\\nvec3 t3 = vec3((vec2(ra,-ra)-dot(ro,n3))/dot(rd,n3), 1.0);\\nvec3 t4 = vec3((vec2(he,-he)-dot(ro,n4))/dot(rd,n4), 1.0);\\nif( t1.y<t1.x ) t1=vec3(t1.yx,-1.0);\\nif( t2.y<t2.x ) t2=vec3(t2.yx,-1.0);\\nif( t3.y<t3.x ) t3=vec3(t3.yx,-1.0);\\nif( t4.y<t4.x ) t4=vec3(t4.yx,-1.0);\\nvec4 tN=vec4(t1.x,t1.z*n1);\\nif( t2.x>tN.x ) tN=vec4(t2.x,t2.z*n2);\\nif( t3.x>tN.x ) tN=vec4(t3.x,t3.z*n3);\\nif( t4.x>tN.x ) tN=vec4(t4.x,t4.z*n4);\\nfloat tF = min(min(t1.y,t2.y),min(t3.y,t4.y));\\nif( tN.x>tF || tF<0.0) return vec4(-1.0);\\nreturn tN;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = -vViewCenter;\\nmat3 rot = mat3(uVMatrix);\\nvec3 rdd = rd * rot;\\nvec3 roo = ro * rot;\\nvec4 tnor = iHexPrism(roo, rdd, vRadius * vScaling, vHeight * vScaling);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = rot * tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unithexprism.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvRadius = 0.0;\\nvHeight = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvRadius = scale.x * ROOT_THREE_OVER_TWO;\\nvHeight = scale.y;\\nvec3 position = aPosition;\\nposition.y *= scale.y;\\nposition.z *= scale.x;\\nposition.x *= scale.x * ROOT_THREE_OVER_TWO;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvScaling = length(uMMatrix[0].xyz) / 2.0;\\n}\\n}\\n',\n    \"unitsdf.fragment.fx\": '#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform vec3\t uBackgroundColor;\\nuniform float \t uBuffer;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nfloat distance = mix(texture2D(uPreviousSampler1, vPreviousTexCoord).r, texture2D(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer) {\\ndiscard;\\n}\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\nfloat uGamma = 0.0;\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer + gamma, uBuffer, distance);\\ngl_FragColor = vec4(mix(color, uBackgroundColor, value), 1.0);\\n}\\n}\\n',\n    \"unitsdf.vertex.fx\": '#version 100\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute mediump vec4 aTexCoord;\\nattribute mediump vec4 aPreviousTexCoord;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n',\n    \"unitsphere.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat sphIntersect(in vec3 ro, in vec3 rd, in vec4 sph)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot(oc, rd);\\nfloat c = dot(oc, oc) - sph.w * sph.w;\\nfloat h = b * b - c;\\nif (h < 0.0) return -1.0;\\nreturn -b - sqrt(h);\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unitsphere.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute lowp float aColor;\\nattribute lowp float aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump float vRadius;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec4 translation = vec4(mix(aPreviousTranslation, aTranslation, animation), 1.0);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * translation).xyz;\\ntranslation.xyz += aPosition * scale;\\nvViewPosition = (mvMatrix * translation).xyz;\\ngl_Position = uPMatrix * vec4(vViewPosition, 1.0);\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n',\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nmat3 transpose(in mat3 mat) {\\nvec3 i0 = mat[0];\\nvec3 i1 = mat[1];\\nvec3 i2 = mat[2];\\nreturn mat3\\n(\\nvec3(i0.x, i1.x, i2.x),\\nvec3(i0.y, i1.y, i2.y),\\nvec3(i0.z, i1.z, i2.z)\\n);\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n  };\n  let ShaderBase$1 = class ShaderBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    set vertexBuffer(value2) {\n      if (this._vertexBuffer != value2) {\n        this._vertexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    set indexBuffer(value2) {\n      if (this._indexBuffer != value2) {\n        this._indexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    constructor(core, main) {\n      this._core = core;\n      this._main = main;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n      const program = this._gl.createProgram();\n      this._gl.attachShader(program, vs);\n      this._gl.attachShader(program, fs);\n      this._gl.linkProgram(program);\n      if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n      }\n      return program;\n    }\n    _compileShader(source2, type2) {\n      const shader = this._gl.createShader(type2);\n      this._gl.shaderSource(shader, source2);\n      this._gl.compileShader(shader);\n      if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n      }\n      return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n      const remove2 = `#define ${directive}`;\n      const index2 = shaderSource.indexOf(remove2);\n      shaderSource = index2 == -1 ? shaderSource : shaderSource.substring(0, index2) + shaderSource.substring(index2 + remove2.length);\n      return shaderSource;\n    }\n    prepare() {\n      if (this._program != this._main.shaderResources.currentProgram) {\n        if (this._main.shaderResources.currentShader) {\n          this._main.shaderResources.currentShader.disableProgram();\n        }\n        this.enableProgram(this._program);\n        this.updateBuffers();\n        this.updateTextures();\n      } else {\n        if (this._haveBuffersChanged) {\n          this.updateBuffers();\n        }\n        if (this._haveTexturesChanged) {\n          this.updateTextures();\n        }\n      }\n    }\n    apply() {\n    }\n    applyModel() {\n    }\n    applyView() {\n    }\n    enableProgram(program) {\n      this._gl.useProgram(program);\n      this._main.shaderResources.currentProgram = program;\n      this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n      this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n      this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n      this._main.shaderResources.currentShader = null;\n      this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n      callback(this._includesFromFile(Resources$1.glsl[vsName]), this._includesFromFile(Resources$1.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n      this._sourceFromUrl(vsName, (vsSource) => {\n        this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n          this._sourceFromUrl(fsName, (fsSource) => {\n            this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n              callback(vsIncSource, fsIncSource);\n            });\n          });\n        });\n      });\n    }\n    _sourceFromUrl(url, callback) {\n      const request2 = new XMLHttpRequest();\n      request2.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n      request2.onreadystatechange = () => {\n        if (request2.readyState == XMLHttpRequest.DONE && request2.status == 200) {\n          callback(request2.responseText);\n        }\n      };\n      request2.send();\n    }\n    _includesFromFile(source2) {\n      let index2 = 0;\n      do {\n        index2 = source2.indexOf(\"#include\", index2);\n        if (index2 != -1) {\n          const start = source2.indexOf('\"', index2);\n          const end = source2.indexOf('\"', start + 1);\n          const name = source2.substring(start + 1, end);\n          const inc = Resources$1.glsl[name];\n          source2 = source2.substring(0, index2) + inc + source2.substring(end + 1);\n        }\n      } while (index2 != -1);\n      return source2;\n    }\n    _includesFromUrl(source2, index2, callback) {\n      index2 = source2.indexOf(\"#include\", index2);\n      if (index2 != -1) {\n        const start = source2.indexOf('\"', index2);\n        const end = source2.indexOf('\"', start + 1);\n        const name = source2.substring(start + 1, end);\n        this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n          source2 = source2.substring(0, index2) + include + source2.substring(end + 1);\n          this._includesFromUrl(source2, index2, callback);\n        });\n      } else {\n        callback(source2);\n      }\n    }\n  };\n  let Color$1 = class Color extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"color.vertex.fx\", \"color.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionColorVertex.SIZE_BYTES, PositionColorVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 3, this._gl.UNSIGNED_BYTE, true, PositionColorVertex.SIZE_BYTES, PositionColorVertex.COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  let Texture$1 = class Texture extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  };\n  let Lasso$3 = class Lasso extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n      this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  class Model extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"model.vertex.fx\", \"model.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n    }\n    applyView() {\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  let SdfText$1 = class SdfText extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n      this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n      this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n      this._gl.uniform1f(this._gammaUniform, this.gamma);\n      this._gl.uniform1f(this._bufferUniform, this.buffer);\n      this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  };\n  let PickGrid$1 = class PickGrid extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n      this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n      this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n      this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n      this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n      this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n      this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n      this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n      this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n      this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n      this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n      this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n      this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n      this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n      this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n      this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n      this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n      this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n      this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n      this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n      this._gl.uniform2fv(this._zeroUniform, this.zero);\n      this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._boundsAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  let UnitShader$1 = class UnitShader extends ShaderBase$1 {\n    get paletteTexture() {\n      return this._paletteTexture;\n    }\n    set paletteTexture(value2) {\n      if (this._paletteTexture != value2) {\n        this._paletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousPaletteTexture() {\n      return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value2) {\n      if (this._previousPaletteTexture != value2) {\n        this._previousPaletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get sdfTexture() {\n      return this._sdfTexture;\n    }\n    set sdfTexture(value2) {\n      if (this._sdfTexture != value2) {\n        this._sdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousSdfTexture() {\n      return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value2) {\n      if (this._previousSdfTexture != value2) {\n        this._previousSdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    set instanceBuffer(value2) {\n      if (this._instanceBuffer != value2) {\n        this._instanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    set previousInstanceBuffer(value2) {\n      if (this._previousInstanceBuffer != value2) {\n        this._previousInstanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    initializeData() {\n      this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n      this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n      this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n      this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n      this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n      this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n      this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n      this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n      this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n      this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n      this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n      this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n      this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._ambientUniform = gl.getUniformLocation(this._program, \"uAmbient\");\n      this._activeColorUniform = gl.getUniformLocation(this._program, \"uActiveColor\");\n      this._selectedColorUniform = gl.getUniformLocation(this._program, \"uSelectedColor\");\n      this._highlightModeUniform = gl.getUniformLocation(this._program, \"uHighlightMode\");\n      const vertices = Cube.POSITIONS;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Cube.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this.indexCount = indices.length;\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._updateCurrentBuffer();\n      this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n      this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._translationAttribute);\n      this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._scaleAttribute);\n      this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._selectedAttribute);\n      this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 1);\n      this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      if (this._previousInstanceBuffer != this._instanceBuffer) {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n      }\n      this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n      this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n      this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1f(this._timeUniform, this.time);\n      this._gl.uniform1f(this._durationUniform, this.duration);\n      this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n      this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n      this._gl.uniform1i(this._previousSampler0Uniform, 0);\n      this._gl.uniform1i(this._sampler0Uniform, 1);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n      this._gl.uniform1f(this._ambientUniform, this.ambient);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._activeColorUniform, this.activeColor);\n      this._gl.uniform3fv(this._selectedColorUniform, this.selectedColor);\n      this._gl.uniform1f(this._hoverUniform, this.hover);\n      this._gl.uniform1f(this._activeUniform, this.active);\n      this._gl.uniform1f(this._highlightModeUniform, this.highlightMode == HighlightMode.luminance ? 0 : 1);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n    }\n    updateTextures() {\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 0);\n    }\n  };\n  let UnitBlock$1 = class UnitBlock extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            vsSource = this._removeDirective(vsSource, \"Derivatives\");\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  };\n  let UnitSphere$1 = class UnitSphere extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n  };\n  let UnitCylinder$1 = class UnitCylinder extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  };\n  class UnitHexPrism extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unithexprism.vertex.fx\", \"unithexprism.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  }\n  let UnitSdf$1 = class UnitSdf extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            vsSource = this._removeDirective(vsSource, \"Derivatives\");\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n      this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n      this._sdfBufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._sdfBackgroundColorUniform = gl.getUniformLocation(this._program, \"uBackgroundColor\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n      super.apply();\n      this._gl.uniform1i(this._previousSampler1Uniform, 2);\n      this._gl.uniform1i(this._sampler1Uniform, 3);\n      this._gl.uniform1f(this._sdfBufferUniform, this.sdfBuffer);\n      this._gl.uniform3fv(this._sdfBackgroundColorUniform, this.sdfBackgroundColor);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 0);\n    }\n  };\n  class Anaglyph extends ShaderBase$1 {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"anaglyph.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n    }\n  }\n  class DebugAxesVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.colorShader.isInitialized;\n    }\n    constructor(core, main, debugAxes) {\n      this._main = main;\n      this._debugAxes = debugAxes;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._debugAxes.isInitialized) {\n        this._debugAxes.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._debugAxes.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._debugAxes.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const colorShader = this._main.colorShader;\n        const shaderResources = this._main.shaderResources;\n        colorShader.vertexBuffer = this._vertexBuffer;\n        colorShader.indexBuffer = this._indexBuffer;\n        colorShader.prepare();\n        colorShader.mMatrix = this.mMatrix;\n        colorShader.apply();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          colorShader.vMatrix = this.vMatrices[viewport];\n          colorShader.pMatrix = this.pMatrices[viewport];\n          colorShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._debugAxes.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  }\n  let AxesVisualBase$1 = class AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get axes() {\n      return this._axes;\n    }\n    constructor(core) {\n      this._core = core;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._renderGrid();\n        this._renderText();\n      }\n    }\n    _renderGrid() {\n    }\n    _renderText() {\n    }\n  };\n  let Cartesian2dVisual$1 = class Cartesian2dVisual extends AxesVisualBase$1 {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian2dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 2; edge++) {\n          const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n          if (axes.isEdgeVisible[edgeId]) {\n            if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n              indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n              indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n            } else {\n              indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n              indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n            }\n            if (indexCount > 0) {\n              shader.mMatrix = axes.getLabelMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n            indexCount = axes.getTitleIndexCount(axisId);\n            if (indexCount > 0) {\n              indexOffset = axes.getTitleIndexOffset(axisId);\n              shader.mMatrix = axes.getTitleMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n          indexCount = axes.getHeadingIndexCount(axisId);\n          if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n            indexOffset = axes.getHeadingIndexOffset(axisId);\n            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n            shader.applyModel();\n            shader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n              const viewport = i + this.viewportOffset;\n              shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n              this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n              shader.vMatrix = this.vMatrices[viewport];\n              shader.pMatrix = this.pMatrices[viewport];\n              shader.applyView();\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n              shader.isPickShader = true;\n              shader.pMatrix = this.pickPMatrix;\n              shader.vMatrix = this.pickVMatrix;\n              shader.applyView();\n              shaderResources.bindFramebuffer(this.pickFramebuffer);\n              this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.directionToLight = Constants$1.VECTOR3_UNITZ;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width3 = gridTicksScale[0];\n          const height3 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n            if (axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width3, height3);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      const axisId2 = 0;\n      const axisId3 = 1;\n      const width2 = size[axisId2];\n      const height2 = size[axisId3];\n      gridShader.zero = axes.gridFaceZero;\n      gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n      for (let face = 0; face < 2; face++) {\n        const faceId = face;\n        if (axes.getIsForwardFace(faceId)) {\n          this._renderGridFace(faceId, width2, height2);\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, this._axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, this._axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  };\n  let Cartesian3dVisual$1 = class Cartesian3dVisual extends AxesVisualBase$1 {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian3dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 4; edge++) {\n          const edgeId = Cube.AXIS_EDGES[axisId][edge];\n          if (axes.getIsOutsideEdge(edgeId)) {\n            if (axes.isEdgeVisible[edgeId]) {\n              if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n              } else {\n                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n              }\n              if (indexCount > 0) {\n                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n              indexCount = axes.getTitleIndexCount(axisId);\n              if (indexCount > 0) {\n                indexOffset = axes.getTitleIndexOffset(axisId);\n                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n            }\n            indexCount = axes.getHeadingIndexCount(axisId);\n            if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n              indexOffset = axes.getHeadingIndexOffset(axisId);\n              shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.directionToLight = Constants$1.VECTOR3_UNITZ;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width2 = gridTicksScale[0];\n          const height2 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.areFacesVisible[axisId]) {\n          const axisId2 = axisId == 0 ? 1 : 0;\n          const axisId3 = axisId == 2 ? 1 : 2;\n          const width2 = size[axisId2];\n          const height2 = size[axisId3];\n          gridShader.zero = axes.getGridFaceZero(axisId);\n          gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n          for (let face = 0; face < 2; face++) {\n            const faceId = Cube.AXIS_FACES[axisId][face];\n            if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n              this._renderGridFace(faceId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  };\n  class ControllerVisual {\n    get isInitialized() {\n      return this._isInitialized && this._modelShader.isInitialized && this._colorShader.isInitialized;\n    }\n    get controller() {\n      return this._controller;\n    }\n    constructor(core, main, controller) {\n      this._core = core;\n      this._main = main;\n      this._mMatrix = create$7();\n      this._vec3 = create$6();\n      this._controller = controller;\n      this._modelShader = main.modelShader;\n      this._colorShader = main.colorShader;\n      this.mMatrix = create$7();\n      this.rayMMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._controller.isInitialized) {\n        this._controller.initialize();\n      }\n      this._initialize(gl);\n    }\n    _initialize(gl) {\n      this._gl = gl;\n      this.modelTexture = TextureHelper.fromImage(gl, this._controller.texture, false, gl.LINEAR);\n      this._modelVertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._modelVertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._controller.vertices, gl.STATIC_DRAW);\n      this._modelIndexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._modelIndexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.indices, gl.STATIC_DRAW);\n      this._rayVertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._rayVertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._controller.rayVertices, gl.STATIC_DRAW);\n      this._rayIndexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._rayIndexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.rayIndices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._modelShader.vertexBuffer = this._modelVertexBuffer;\n        this._modelShader.indexBuffer = this._modelIndexBuffer;\n        this._modelShader.texture2D = this.modelTexture;\n        this._modelShader.prepare();\n        multiply$2(this._mMatrix, this._controller.useRayPose ? this.rayMMatrix : this.mMatrix, this._controller.mMatrix);\n        this._modelShader.mMatrix = this._mMatrix;\n        this._modelShader.specularPower = 10;\n        this._modelShader.specularIntensity = 0.01;\n        this._modelShader.apply();\n        this._modelShader.applyModel();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          this._modelShader.directionToLight = Constants$1.VECTOR3_UNITZ;\n          this._modelShader.halfAngle = Constants$1.VECTOR3_UNITZ;\n          this._modelShader.vMatrix = this.vMatrices[viewport];\n          this._modelShader.pMatrix = this.pMatrices[viewport];\n          this._modelShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._controller.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this.isRayVisible) {\n          this._colorShader.vertexBuffer = this._rayVertexBuffer;\n          this._colorShader.indexBuffer = this._rayIndexBuffer;\n          this._colorShader.prepare();\n          multiply$2(this._mMatrix, this.rayMMatrix, this._controller.rayMMatrix);\n          this._colorShader.mMatrix = this._mMatrix;\n          this._colorShader.apply();\n          this._colorShader.applyModel();\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            this._colorShader.vMatrix = this.vMatrices[viewport];\n            this._colorShader.pMatrix = this.pMatrices[viewport];\n            this._colorShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._controller.rayIndexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      }\n    }\n  }\n  let ImageVisual$1 = class ImageVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n      return this._image;\n    }\n    constructor(core, main, image2) {\n      this._core = core;\n      this._main = main;\n      this._image = image2;\n      this._image.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this.mMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._image.isInitialized) {\n        this._image.initialize();\n      }\n      this._gl = gl;\n      if (this._image.imageData) {\n        this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n      }\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const textureShader = this._main.textureShader;\n        const shaderResources = this._main.shaderResources;\n        textureShader.vertexBuffer = this._vertexBuffer;\n        textureShader.indexBuffer = this._indexBuffer;\n        textureShader.texture2D = this.texture;\n        textureShader.prepare();\n        textureShader.mMatrix = this.mMatrix;\n        textureShader.isPickShader = false;\n        textureShader.apply();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          textureShader.vMatrix = this.vMatrices[viewport];\n          textureShader.pMatrix = this.pMatrices[viewport];\n          textureShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this.isPickingEnabled) {\n          textureShader.isPickShader = true;\n          textureShader.vMatrix = this.pickVMatrix;\n          textureShader.pMatrix = this.pickPMatrix;\n          textureShader.applyView();\n          shaderResources.bindFramebuffer(this.pickFramebuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  };\n  let LabelVisualBase$1 = class LabelVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label2) {\n      this._core = core;\n      this._main = main;\n      this._label = label2;\n      this._label.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this._mMatrix = create$7();\n      this.mMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._label.isInitialized) {\n        this._label.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const indexCount = this._label.indexCount;\n        if (indexCount > 0) {\n          const shader = this._main.sdfTextShader;\n          const fontVisual = this._main.fonts[this._label.font.name];\n          shader.vertexBuffer = this._vertexBuffer;\n          shader.indexBuffer = this._indexBuffer;\n          shader.texture2D = fontVisual.texture;\n          shader.prepare();\n          shader.gamma = this._label.gamma;\n          shader.buffer = fontVisual.font.edgeValue / 255;\n          shader.borderWidth = this._label.borderWidth;\n          shader.color = this._label.color || this._core.config.textColor;\n          shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n          shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n          shader.pickedIdColor = this.pickedIdColor;\n          shader.apply();\n          multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n          shader.mMatrix = this._mMatrix;\n          shader.applyModel();\n          shader.isPickShader = false;\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            shader.vMatrix = this.vMatrices[viewport];\n            shader.pMatrix = this.pMatrices[viewport];\n            shader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n          }\n          if (this.isPickingEnabled) {\n            shader.isPickShader = true;\n            shader.pMatrix = this.pickPMatrix;\n            shader.vMatrix = this.pickVMatrix;\n            shader.applyView();\n            this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n          }\n        }\n      }\n    }\n  };\n  let LabelVisual$1 = class LabelVisual extends LabelVisualBase$1 {\n    get label() {\n      return this._label;\n    }\n    set text(value2) {\n      this._label.text = value2;\n    }\n    get text() {\n      return this._label.text;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  };\n  let LabelSetVisual$1 = class LabelSetVisual extends LabelVisualBase$1 {\n    get label() {\n      return this._label;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  };\n  let FontVisual$1 = class FontVisual {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get font() {\n      return this._font;\n    }\n    constructor(core, font2) {\n      this._core = core;\n      this._font = font2;\n      font2.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._isInitialized = true;\n      if (this._font.count > 0) {\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n        this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n      }\n    }\n  };\n  let Lasso$2 = class Lasso {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const vertices = Quad$3.textured(Constants$1.MAT4_IDENTITY);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$3.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  var __awaiter$2 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  let Main$1 = class Main extends RendererBase {\n    get shaderResources() {\n      return this._shaderResources;\n    }\n    get colorShader() {\n      return this._colorShader;\n    }\n    get textureShader() {\n      return this._textureShader;\n    }\n    get lassoShader() {\n      return this._lassoShader;\n    }\n    get modelShader() {\n      return this._modelShader;\n    }\n    get sdfTextShader() {\n      return this._sdfTextShader;\n    }\n    get gridShader() {\n      return this._gridShader;\n    }\n    get blockShader() {\n      return this._blockShader;\n    }\n    get sphereShader() {\n      return this._sphereShader;\n    }\n    get cyclinderShader() {\n      return this._cylinderShader;\n    }\n    get hexPrismShader() {\n      return this._hexPrismShader;\n    }\n    get sdfShader() {\n      return this._sdfShader;\n    }\n    get anaglyphShader() {\n      return this._anaglyphShader;\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    get config() {\n      return this._config;\n    }\n    constructor(options2) {\n      super(options2);\n      this._config = new Config$1();\n      this._quad = new Quad$2();\n      this._lasso = new Lasso$2();\n      this._pickedPixels = new Uint8Array(4);\n      this._pickedIdColor = create$5();\n      this._mat3 = create$8();\n      this._directionToCamera = create$6();\n      this._directionToLight = create$6();\n      this._halfAngle = create$6();\n      this._cameraPosition = create$6();\n      this._modelPosition = create$6();\n      this.depthEnabled = true;\n    }\n    get isSupported() {\n      return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    get isWebXRSupported() {\n      return true;\n    }\n    initialize(core) {\n      super.initialize(core);\n      this._shaderResources = new Resources$1();\n      this._colorShader = new Color$1(this._core, this);\n      this._textureShader = new Texture$1(this._core, this);\n      this._lassoShader = new Lasso$3(this._core, this);\n      this._modelShader = new Model(this._core, this);\n      this._sdfTextShader = new SdfText$1(this._core, this);\n      this._gridShader = new PickGrid$1(this._core, this);\n      this._anaglyphShader = new Anaglyph(this._core, this);\n      this._blockShader = new UnitBlock$1(this._core, this);\n      this._sphereShader = new UnitSphere$1(this._core, this);\n      this._cylinderShader = new UnitCylinder$1(this._core, this);\n      this._hexPrismShader = new UnitHexPrism(this._core, this);\n      this._sdfShader = new UnitSdf$1(this._core, this);\n      this._initializeContext(this._createContext(this._canvas));\n      this._canvas.addEventListener(\"webglcontextlost\", (event2) => {\n        this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n        this._isInitialized = false;\n        event2.preventDefault();\n      }, false);\n      this._canvas.addEventListener(\"webglcontextrestored\", () => {\n        this._initializeContext(this._createContext(this._canvas));\n        this._isInitialized = true;\n        this._core.log.write(LogLevel.info, \"WebGL context restored\");\n      }, false);\n      this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n      this._gl = gl;\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        fontVisual.initializeContext(gl);\n      }\n      this._shaderResources.initializeContext(this._gl);\n      this._colorShader.initializeContext(this._gl);\n      this._textureShader.initializeContext(this._gl);\n      this._lassoShader.initializeContext(this._gl);\n      this._modelShader.initializeContext(this._gl);\n      this._sdfTextShader.initializeContext(this._gl);\n      this._gridShader.initializeContext(this._gl);\n      this._anaglyphShader.initializeContext(this._gl);\n      this._blockShader.initializeContext(this._gl);\n      this._sphereShader.initializeContext(this._gl);\n      this._cylinderShader.initializeContext(this._gl);\n      this._hexPrismShader.initializeContext(this._gl);\n      this._sdfShader.initializeContext(this._gl);\n      this._quad.initializeContext(this._gl);\n      this._lasso.initializeContext(this._gl);\n      this._debugAxesVisual.initializeContext(this._gl);\n      this._framebuffers = [null, null];\n      const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, this._core.config.pickWidth, this._core.config.pickHeight);\n      const framebuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(framebuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._pickFrameBuffer = framebuffer;\n      this._anaglyphTextures = [null, null];\n      this.anaglyphFramebuffers = [null, null];\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        this.transitionBuffers[i].initializeContext(this._gl);\n      }\n      if (this._axes1) {\n        for (let i = 0; i < this._axes1.length; i++) {\n          this._axes1[i].initializeContext(this._gl);\n        }\n      }\n      if (this._axes2) {\n        for (let i = 0; i < this._axes2.length; i++) {\n          this._axes2[i].initializeContext(this._gl);\n        }\n      }\n      for (let i = 0; i < this.labelSets.length; i++) {\n        this.labelSets[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.images.length; i++) {\n        this.images[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.controllers.length; i++) {\n        this.controllers[i].initializeContext(this._gl);\n      }\n    }\n    _resize(width2, height2) {\n      super._resize(width2, height2);\n      for (let i = 0; i < 2; i++) {\n        const texture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        const renderBuffer = this._gl.createRenderbuffer();\n        this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n        this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, width2, height2);\n        const framebuffer = this._gl.createFramebuffer();\n        this._shaderResources.bindFramebuffer(framebuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n        this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n        this._anaglyphTextures[i] = texture;\n        this.anaglyphFramebuffers[i] = framebuffer;\n      }\n      this._core.log.write(LogLevel.info, `buffers resized ${width2},${height2}`);\n    }\n    _createContext(canvas) {\n      const antialias = this._options ? this._options.antialias === void 0 ? true : this._options.antialias : true;\n      const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === void 0 ? false : this._options.preserveDrawingBuffer : false;\n      return canvas.getContext(\"webgl\", {\n        stencil: true,\n        alpha: true,\n        antialias,\n        preserveDrawingBuffer\n      });\n    }\n    initializeWebXR(session) {\n      const promise = new Promise((resolve2, reject) => {\n        this._gl.makeXRCompatible().then(() => {\n          session.updateRenderState({\n            baseLayer: new XRWebGLLayer(session, this._gl),\n            depthNear: this._core.config.nearPlane,\n            depthFar: this._core.config.farPlane\n          });\n          session.requestReferenceSpace(\"local\").then((refSpace) => {\n            this._webXRReferenceSpace = refSpace;\n            resolve2();\n          });\n        });\n      });\n      return promise;\n    }\n    prepare(xrFrame) {\n      if (xrFrame) {\n        const pose = xrFrame.getViewerPose(this._webXRReferenceSpace);\n        if (pose) {\n          const glLayer = xrFrame.session.renderState.baseLayer;\n          for (let i = 0; i < pose.views.length; i++) {\n            const view = pose.views[i];\n            this.vMatrices[i] = view.transform.inverse.matrix;\n            this.inverseVMatrices[i] = view.transform.matrix;\n            multiply$2(this._mvMatrices[i], this.vMatrices[i], this.mMatrix);\n            this.mvMatrices[i] = this._mvMatrices[i];\n            this.pMatrices[i] = view.projectionMatrix;\n            const viewport = glLayer.getViewport(view);\n            this._viewports[i].x = viewport.x;\n            this._viewports[i].y = viewport.y;\n            this._viewports[i].width = viewport.width;\n            this._viewports[i].height = viewport.height;\n            this._framebuffers[i] = glLayer.framebuffer;\n          }\n        }\n        this._viewportOffset = 0;\n        this._viewportCount = 2;\n      } else {\n        let viewport;\n        switch (this._core.config.stereoMode) {\n          case StereoMode.none:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 1;\n            this._framebuffers[0] = null;\n            break;\n          case StereoMode.left:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 1;\n            this._framebuffers[0] = null;\n            break;\n          case StereoMode.right:\n            viewport = this._viewports[1];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 1;\n            this._viewportCount = 1;\n            this._framebuffers[1] = null;\n            break;\n          case StereoMode.anaglyph:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            viewport = this._viewports[1];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n            this._framebuffers[0] = this.anaglyphFramebuffers[0];\n            this._framebuffers[1] = this.anaglyphFramebuffers[1];\n            break;\n          case StereoMode.split:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width / 2;\n            viewport.height = this._canvas.height;\n            viewport = this._viewports[1];\n            viewport.x = this._canvas.width / 2;\n            viewport.y = 0;\n            viewport.width = this._canvas.width / 2;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n            this._framebuffers[0] = null;\n            this._framebuffers[1] = null;\n            break;\n        }\n      }\n    }\n    createTransitionBuffer(ids) {\n      const buffer = new TransitionBuffer$1(this._core, ids);\n      buffer.initializeContext(this._gl);\n      return buffer;\n    }\n    createControllerVisual(controller) {\n      const visual = new ControllerVisual(this._core, this, controller);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian2dAxesVisual(axes) {\n      const visual = new Cartesian2dVisual$1(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n      const visual = new Cartesian3dVisual$1(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    _createDebugAxesVisual(debugAxes) {\n      return new DebugAxesVisual(this._core, this, debugAxes);\n    }\n    _createLabelVisual(label2) {\n      return new LabelVisual$1(this._core, this, label2);\n    }\n    createLabelSetVisual(labelSet) {\n      const visual = new LabelSetVisual$1(this._core, this, labelSet);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createImageVisual(image2) {\n      const visual = new ImageVisual$1(this._core, this, image2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createFontVisual(font2) {\n      const visual = new FontVisual$1(this._core, font2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    getDataUrl(mimeType) {\n      return this._canvas.toDataURL(mimeType);\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$2(this, void 0, void 0, function* () {\n        if (this.depthEnabled) {\n          this._gl.enable(this._gl.DEPTH_TEST);\n        } else {\n          this._gl.disable(this._gl.DEPTH_TEST);\n        }\n        this._gl.enable(this._gl.CULL_FACE);\n        this._gl.disable(this._gl.BLEND);\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.clearColor(0, 0, 0, 0);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n        this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], backgroundColor[3]);\n        if (xrFrame) {\n          const glLayer = xrFrame.session.renderState.baseLayer;\n          this._shaderResources.bindFramebuffer(glLayer.framebuffer);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        } else if (this._core.config.stereoMode == StereoMode.anaglyph) {\n          for (let i = 0; i < 2; i++) {\n            this._shaderResources.bindFramebuffer(this.anaglyphFramebuffers[i]);\n            this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n          }\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        } else {\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        if (this._core.config.isDebugVisible) {\n          this._debugAxesVisual.framebuffers = this._framebuffers;\n          this._debugAxesVisual.render(elapsedTime, xrFrame);\n        }\n        const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n        if (axesVisuals) {\n          for (let i = 0; i < axesVisuals.length; i++) {\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n              axesVisual.pickedIdColor = this._pickedIdColor;\n              axesVisual.pickFramebuffer = this._pickFrameBuffer;\n              axesVisual.framebuffers = this._framebuffers;\n              axesVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        for (let i = 0; i < this.transitionBuffers.length; i++) {\n          const transitionBuffer = this.transitionBuffers[i];\n          if (transitionBuffer.isVisible) {\n            this._renderTransitionBuffer(xrFrame, transitionBuffer);\n          }\n        }\n        if (this.areLabelsVisible) {\n          for (let i = 0; i < this.labelSets.length; i++) {\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n              labelSetVisual.pickedIdColor = this._pickedIdColor;\n              labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n              labelSetVisual.framebuffers = this._framebuffers;\n              labelSetVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        if (this.areImagesVisible) {\n          for (let i = 0; i < this.images.length; i++) {\n            const imageVisual = this.images[i];\n            if (imageVisual.isVisible) {\n              imageVisual.framebuffers = this._framebuffers;\n              imageVisual.pickFramebuffer = this._pickFrameBuffer;\n              imageVisual.isPickingEnabled = this.isPickingEnabled;\n              imageVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        for (let i = 0; i < this.controllers.length; i++) {\n          const controllerVisual = this.controllers[i];\n          if (controllerVisual.isVisible) {\n            controllerVisual.isRayVisible = this.isPickingEnabled;\n            controllerVisual.framebuffers = this._framebuffers;\n            controllerVisual.render(elapsedTime, xrFrame);\n          }\n        }\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n          this._pickedType = PickHelper.decodeType(this._pickedPixels);\n          set$7(this._pickedIdColor, this._pickedPixels[0] / 255, this._pickedPixels[1] / 255, this._pickedPixels[2] / 255, this._pickedPixels[3] / 255);\n          this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n          if (this._isCapturingPickImage && this.capturePickImageCallback) {\n            this._isCapturingPickImage = false;\n            const data2 = new Uint8ClampedArray(this._core.config.pickWidth * this._core.config.pickHeight * 4);\n            this._gl.readPixels(0, 0, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, data2);\n            for (let i = 0; i < data2.length / 4; i++) {\n              if (data2[i * 4 + 3] == PickType.data) {\n                data2[i * 4 + 3] = 255;\n              } else {\n                data2[i * 4] = 0;\n                data2[i * 4 + 1] = 0;\n                data2[i * 4 + 2] = 0;\n                data2[i * 4 + 3] = 0;\n              }\n            }\n            const length2 = this._core.config.pickWidth * this._core.config.pickHeight * 4;\n            const row = this._core.config.pickWidth * 4;\n            const end = (this._core.config.pickHeight - 1) * row;\n            const flipped = new Uint8ClampedArray(length2);\n            for (let i = 0; i < length2; i += row) {\n              flipped.set(data2.subarray(i, i + row), end - i);\n            }\n            this.capturePickImageCallback(flipped, this._core.config.pickWidth, this._core.config.pickHeight);\n          }\n        } else {\n          set$7(this._pickedIdColor, 0, 0, 0, 0);\n          this._pickedId = 0;\n        }\n        if (this.isLassoPicking && this._lassoShader.isInitialized) {\n          this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n          this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n          const lassoWidth = this.lassoX1 - this.lassoX0;\n          const lassoHeight = this.lassoY1 - this.lassoY0;\n          this._lassoShader.prepare();\n          this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n          this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n          this._lassoShader.apply();\n          const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewportIndex = i + this._viewportOffset;\n            this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n            const viewport = this._viewports[viewportIndex];\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n            this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n            this._lassoMMatrix[10] = 1;\n            this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n            this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n            this._lassoShader.mMatrix = this._lassoMMatrix;\n            set$5(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n            this._lassoShader.thickness = this._lassoThickness;\n            this._lassoShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n        if (this._core.config.stereoMode == StereoMode.anaglyph && this._anaglyphShader.isInitialized && this._quad.isInitialized) {\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.viewport(this._viewports[0].x, this._viewports[0].y, this._viewports[0].width, this._viewports[0].height);\n          this._anaglyphShader.vertexBuffer = this._quad.vertexBuffer;\n          this._anaglyphShader.indexBuffer = this._quad.indexBuffer;\n          this._anaglyphShader.texture2D1 = this._anaglyphTextures[0];\n          this._anaglyphShader.texture2D2 = this._anaglyphTextures[1];\n          this._anaglyphShader.prepare();\n          this._anaglyphShader.viewport = this._viewports[0];\n          this._anaglyphShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      });\n    }\n    _renderTransitionBuffer(xrFrame, transitionBuffer) {\n      const currentBuffer = transitionBuffer.currentBuffer;\n      const previousBuffer = transitionBuffer.previousBuffer;\n      const currentPalette = transitionBuffer.currentPalette;\n      const previousPalette = transitionBuffer.previousPalette;\n      const currentAtlas = transitionBuffer.currentAtlas;\n      const previousAtlas = transitionBuffer.previousAtlas;\n      const unitType = transitionBuffer.unitType === void 0 ? currentBuffer.unitType : transitionBuffer.unitType;\n      const id2 = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n      const hoverId = id2 > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id2) : -1;\n      const activeId = transitionBuffer.activeId;\n      if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf || unitType == UnitType.ringSdf)) {\n        this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._blockShader.prepare();\n        this._blockShader.mMatrix = this.mMatrix;\n        this._blockShader.time = this.transitionTime;\n        this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._blockShader.rangeMin = 0;\n        this._blockShader.rangeMax = transitionBuffer.length - 1;\n        this._blockShader.hover = hoverId;\n        this._blockShader.active = activeId;\n        this._blockShader.selectedColor = this._core.config.selectionColor;\n        this._blockShader.hoverColor = this._core.config.hoverColor;\n        this._blockShader.activeColor = this._core.config.activeColor;\n        this._blockShader.highlightMode = this._core.config.highlightMode;\n        this._blockShader.specularPower = this._config.specularPower;\n        this._blockShader.specularIntensity = this._config.specularIntensity;\n        this._blockShader.ambient = this._config.ambient;\n        this._blockShader.apply();\n        this._blockShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._blockShader.directionToLight = this._directionToLight;\n            this._blockShader.halfAngle = this._halfAngle;\n          } else {\n            this._blockShader.directionToLight = this._config.directionToLight;\n            this._blockShader.halfAngle = this._config.halfAngle;\n          }\n          this._blockShader.vMatrix = vMatrix;\n          this._blockShader.pMatrix = this.pMatrices[viewport];\n          this._blockShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._blockShader.isPickShader = true;\n          this._blockShader.pMatrix = this.pickPMatrix;\n          this._blockShader.vMatrix = this.pickVMatrix;\n          this._blockShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf || unitType == UnitType.disk)) {\n        this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sphereShader.prepare();\n        this._sphereShader.mMatrix = this.mMatrix;\n        this._sphereShader.time = this.transitionTime;\n        this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sphereShader.rangeMin = 0;\n        this._sphereShader.rangeMax = transitionBuffer.length - 1;\n        this._sphereShader.hover = hoverId;\n        this._sphereShader.active = activeId;\n        this._sphereShader.selectedColor = this._core.config.selectionColor;\n        this._sphereShader.hoverColor = this._core.config.hoverColor;\n        this._sphereShader.activeColor = this._core.config.activeColor;\n        this._sphereShader.highlightMode = this._core.config.highlightMode;\n        this._sphereShader.specularPower = this._config.specularPower;\n        this._sphereShader.specularIntensity = this._config.specularIntensity;\n        this._sphereShader.ambient = this._config.ambient;\n        this._sphereShader.apply();\n        this._sphereShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._sphereShader.directionToLight = this._directionToLight;\n            this._sphereShader.halfAngle = this._halfAngle;\n          } else {\n            this._sphereShader.directionToLight = this._config.directionToLight;\n            this._sphereShader.halfAngle = this._config.halfAngle;\n          }\n          this._sphereShader.vMatrix = vMatrix;\n          this._sphereShader.pMatrix = this.pMatrices[viewport];\n          this._sphereShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._sphereShader.isPickShader = true;\n          this._sphereShader.pMatrix = this.pickPMatrix;\n          this._sphereShader.vMatrix = this.pickVMatrix;\n          this._sphereShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n        this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._cylinderShader.prepare();\n        this._cylinderShader.mMatrix = this.mMatrix;\n        this._cylinderShader.time = this.transitionTime;\n        this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._cylinderShader.rangeMin = 0;\n        this._cylinderShader.rangeMax = transitionBuffer.length - 1;\n        this._cylinderShader.hover = hoverId;\n        this._cylinderShader.active = activeId;\n        this._cylinderShader.selectedColor = this._core.config.selectionColor;\n        this._cylinderShader.hoverColor = this._core.config.hoverColor;\n        this._cylinderShader.activeColor = this._core.config.activeColor;\n        this._cylinderShader.highlightMode = this._core.config.highlightMode;\n        this._cylinderShader.specularPower = this._config.specularPower;\n        this._cylinderShader.specularIntensity = this._config.specularIntensity;\n        this._cylinderShader.ambient = this._config.ambient;\n        this._cylinderShader.apply();\n        this._cylinderShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._cylinderShader.directionToLight = this._directionToLight;\n            this._cylinderShader.halfAngle = this._halfAngle;\n          } else {\n            this._cylinderShader.directionToLight = this._config.directionToLight;\n            this._cylinderShader.halfAngle = this._config.halfAngle;\n          }\n          this._cylinderShader.vMatrix = vMatrix;\n          this._cylinderShader.pMatrix = this.pMatrices[viewport];\n          this._cylinderShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._cylinderShader.isPickShader = true;\n          this._cylinderShader.pMatrix = this.pickPMatrix;\n          this._cylinderShader.vMatrix = this.pickVMatrix;\n          this._cylinderShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._hexPrismShader.isInitialized && (unitType == UnitType.hexPrism || unitType == UnitType.hexPrismSdf)) {\n        this._hexPrismShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._hexPrismShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._hexPrismShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._hexPrismShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._hexPrismShader.prepare();\n        this._hexPrismShader.mMatrix = this.mMatrix;\n        this._hexPrismShader.time = this.transitionTime;\n        this._hexPrismShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._hexPrismShader.rangeMin = 0;\n        this._hexPrismShader.rangeMax = transitionBuffer.length - 1;\n        this._hexPrismShader.hover = hoverId;\n        this._hexPrismShader.active = activeId;\n        this._hexPrismShader.selectedColor = this._core.config.selectionColor;\n        this._hexPrismShader.hoverColor = this._core.config.hoverColor;\n        this._hexPrismShader.activeColor = this._core.config.activeColor;\n        this._hexPrismShader.highlightMode = this._core.config.highlightMode;\n        this._hexPrismShader.specularPower = this._config.specularPower;\n        this._hexPrismShader.specularIntensity = this._config.specularIntensity;\n        this._hexPrismShader.ambient = this._config.ambient;\n        this._hexPrismShader.apply();\n        this._hexPrismShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._hexPrismShader.directionToLight = this._directionToLight;\n            this._hexPrismShader.halfAngle = this._halfAngle;\n          } else {\n            this._hexPrismShader.directionToLight = this._config.directionToLight;\n            this._hexPrismShader.halfAngle = this._config.halfAngle;\n          }\n          this._hexPrismShader.vMatrix = vMatrix;\n          this._hexPrismShader.pMatrix = this.pMatrices[viewport];\n          this._hexPrismShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._hexPrismShader.isPickShader = true;\n          this._hexPrismShader.pMatrix = this.pickPMatrix;\n          this._hexPrismShader.vMatrix = this.pickVMatrix;\n          this._hexPrismShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n        this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n        this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n        this._sdfShader.prepare();\n        this._sdfShader.mMatrix = this.mMatrix;\n        this._sdfShader.time = this.transitionTime;\n        this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sdfShader.rangeMin = 0;\n        this._sdfShader.rangeMax = transitionBuffer.length - 1;\n        this._sdfShader.hover = hoverId;\n        this._sdfShader.active = activeId;\n        this._sdfShader.selectedColor = this._core.config.selectionColor;\n        this._sdfShader.hoverColor = this._core.config.hoverColor;\n        this._sdfShader.activeColor = this._core.config.activeColor;\n        this._sdfShader.highlightMode = this._core.config.highlightMode;\n        this._sdfShader.sdfBuffer = (this.sdfBuffer || this._core.config.sdfBuffer) / 255;\n        this._sdfShader.sdfBackgroundColor = this.sdfBackgroundColor || fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n        this._sdfShader.specularPower = this._config.specularPower;\n        this._sdfShader.specularIntensity = this._config.specularIntensity;\n        this._sdfShader.ambient = this._config.ambient;\n        this._sdfShader.apply();\n        this._sdfShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$5(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$8(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$5(this._directionToCamera, this._directionToCamera);\n            add$4(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$5(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._sdfShader.directionToLight = this._directionToLight;\n            this._sdfShader.halfAngle = this._halfAngle;\n          } else {\n            this._sdfShader.directionToLight = this._config.directionToLight;\n            this._sdfShader.halfAngle = this._config.halfAngle;\n          }\n          this._sdfShader.vMatrix = vMatrix;\n          this._sdfShader.pMatrix = this.pMatrices[viewport];\n          this._sdfShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._sdfShader.isPickShader = true;\n          this._sdfShader.pMatrix = this.pickPMatrix;\n          this._sdfShader.vMatrix = this.pickVMatrix;\n          this._sdfShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      }\n    }\n  };\n  let Quad$1 = class Quad {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const _vec3 = fromValues$3(2, 2, 2);\n      const _mat4 = create$7();\n      fromScaling(_mat4, _vec3);\n      const vertices = Quad$3.positions(_mat4);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$3.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  class Atlas extends AtlasBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([255, 255, 255, 255]));\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._imageData) {\n        this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n      } else {\n        this._texture = null;\n      }\n    }\n  }\n  let Palette$1 = class Palette extends PaletteBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._colors) {\n        const colors2 = new Uint8Array(this._colors);\n        for (let i = 0; i < colors2.length; i++) {\n          colors2[i] = Math.pow(colors2[i] / 255, 2.2) * 255;\n        }\n        this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors2);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Buffer$1 = class Buffer extends BufferBase {\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    constructor(core, ids) {\n      super(core, ids);\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update() {\n      if (this._isInitialized) {\n        const start = window.performance.now();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n        this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n      }\n    }\n  };\n  class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$1, Palette$1, Atlas);\n    }\n    initializeContext(gl) {\n      this._buffer1.initializeContext(gl);\n      this._buffer2.initializeContext(gl);\n      this._palette1.initializeContext(this._core, gl);\n      this._palette2.initializeContext(this._core, gl);\n      this._atlas1.initializeContext(this._core, gl);\n      this._atlas2.initializeContext(this._core, gl);\n      this._isInitialized = true;\n    }\n  }\n  class Config extends RendererConfig {\n    get keyLightAltitude() {\n      return this._keyLightAltitude;\n    }\n    set keyLightAltitude(value2) {\n      this._keyLightAltitude = value2;\n      this._updateLights();\n    }\n    get keyLightAzimuth() {\n      return this._keyLightAzimuth;\n    }\n    set keyLightAzimuth(value2) {\n      this._keyLightAzimuth = value2;\n      this._updateLights();\n    }\n    get keyLightDistance() {\n      return this._keyLightDistance;\n    }\n    set keyLightDistance(value2) {\n      this._keyLightDistance = value2;\n      this._updateLights();\n    }\n    get fillLight1Altitude() {\n      return this._fillLight1Altitude;\n    }\n    set fillLight1Altitude(value2) {\n      this._fillLight1Altitude = value2;\n      this._updateLights();\n    }\n    get fillLight1Azimuth() {\n      return this._fillLight1Azimuth;\n    }\n    set fillLight1Azimuth(value2) {\n      this._fillLight1Azimuth = value2;\n      this._updateLights();\n    }\n    get fillLight2Altitude() {\n      return this._fillLight2Altitude;\n    }\n    set fillLight2Altitude(value2) {\n      this._fillLight2Altitude = value2;\n      this._updateLights();\n    }\n    get fillLight2Azimuth() {\n      return this._fillLight2Azimuth;\n    }\n    set fillLight2Azimuth(value2) {\n      this._fillLight2Azimuth = value2;\n      this._updateLights();\n    }\n    constructor() {\n      super();\n      this._rotation = create$4();\n      this.keyLightPosition = create$6();\n      this.fillLight1Position = create$6();\n      this.fillLight2Position = create$6();\n      this.reset();\n    }\n    _updateLights() {\n      this._updateLight(this._keyLightAltitude, this._keyLightAzimuth, this._keyLightDistance, this.keyLightPosition);\n      this._updateLight(this._fillLight1Altitude, this._fillLight1Azimuth, 1, this.fillLight1Position);\n      this._updateLight(this._fillLight2Altitude, this._fillLight2Azimuth, 1, this.fillLight2Position);\n    }\n    _updateLight(altitude, azimuth, distance2, position2) {\n      rotateY(this._rotation, Constants$1.QUAT_IDENTITY, AngleHelper.degreesToRadians(azimuth));\n      rotateX(this._rotation, this._rotation, AngleHelper.degreesToRadians(-altitude));\n      transformQuat(position2, Constants$1.VECTOR3_UNITZ, this._rotation);\n      scale$5(position2, position2, distance2);\n    }\n    reset() {\n      this.isSsaoEnabled = true;\n      this.ssaoWidth = 1024;\n      this.ssaoHeight = 1024;\n      this.ssaoBlurEnabled = true;\n      this.ssaoKernelSize = 8;\n      this.ssaoNoiseSize = 4;\n      this.ssaoRadius = 0.02;\n      this.ssaoPower = 1;\n      this.isShadowEnabled = true;\n      this.shadowWidth = 1024;\n      this.shadowHeight = 1024;\n      this.isDofEnabled = false;\n      this.dofAutoFocus = true;\n      this.dofFocusDistance = 0.5;\n      this.dofFocusRange = 0.5;\n      this.dofMaxBackgroundBlur = 0.75;\n      this.isBloomEnabled = false;\n      this.bloomIntensity = 2;\n      this.specularIntensity = 0.15;\n      this.specularPower = 150;\n      this.ambientIntensity = 0.1;\n      this.materialIntensity = 0.5;\n      this.keyLightIntensity = 1.5;\n      this.fillLight1Intensity = 0.25;\n      this.fillLight2Intensity = 0.25;\n      this._keyLightAltitude = 30;\n      this._keyLightAzimuth = -45;\n      this._keyLightDistance = 1;\n      this._fillLight1Altitude = 30;\n      this._fillLight1Azimuth = 45;\n      this._fillLight2Altitude = 30;\n      this._fillLight2Azimuth = -135;\n      this._updateLights();\n      this.isFxaaEnabled = false;\n    }\n  }\n  class Resources {\n    bindFramebuffer(framebuffer) {\n      if (this.framebuffer != framebuffer) {\n        this.framebuffer = framebuffer;\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n      }\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this.framebuffer = this._gl.createFramebuffer();\n      this.OES_texture_float = gl.getExtension(\"OES_texture_float\");\n      this.OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n      this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n  }\n  Resources.glsl = {\n    \"background.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\ngl_FragDepth = 0.99999;\\nmyPosition = vec4(0.0, 0.0, -FAR_PLANE, 0.0);\\nmyColor = vec4(uColor, 1.0);\\nmyNormal = vec4(0.0, 0.0, 1.0, 0.0);\\n}\\n',\n    \"box.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nfloat result = 0.0;\\nfor (int x = -2; x < 2; x++)\\n{\\nfor (int y = -2; y < 2; y++)\\n{\\nvec2 offset = vec2(float(x) + 0.5, float(y) + 0.5) * texelSize;\\nresult += texture(uSampler, texCoords + offset).r;\\n}\\n}\\nresult /= 16.0;\\nmyOutputColor = vec4(vec3(result), 1.0);\\n}\\n\",\n    \"bright.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec4 color = texture(uSampler, texCoords);\\nmyOutputColor = vec4(color.rgb * color.a, 1.0);\\n}\\n\",\n    \"combine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform float uIntensity;\\nout vec4 myOutputColor;\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 bloom =\\ntexture(uSampler2, texCoords).rgb +\\ntexture(uSampler3, texCoords).rgb +\\ntexture(uSampler4, texCoords).rgb +\\ntexture(uSampler5, texCoords).rgb;\\nbloom *= uIntensity;\\nvec3 color = texture(uSampler1, texCoords).rgb;\\ncolor += bloom;\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"deferred.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform mat4 uInverseVMatrix;\\nuniform mat4 uShadowVMatrix;\\nuniform mat4 uShadowPMatrix;\\nuniform bool uShadow;\\nuniform bool uSsao;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform vec3 uKeyLightHalfAngle;\\nuniform vec3 uDirectionToKeyLight;\\nuniform vec3 uDirectionToFillLight1;\\nuniform vec3 uDirectionToFillLight2;\\nuniform vec2 uShadowMapSize;\\nuniform float uKeyLightIntensity;\\nuniform float uFillLight1Intensity;\\nuniform float uFillLight2Intensity;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbientIntensity;\\nuniform float uMaterialIntensity;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec4 position = texture(uSampler1, texCoords);\\nvec4 color = texture(uSampler2, texCoords);\\nvec4 normal = texture(uSampler3, texCoords);\\nfloat shadow;\\nif (uShadow)\\n{\\nvec4 positionWorld = uInverseVMatrix * vec4(position.xyz, 1.0);\\nvec4 positionShadowView = uShadowVMatrix * positionWorld;\\nvec4 positionShadowViewProjection = uShadowPMatrix * positionShadowView;\\nvec3 projCoords = positionShadowViewProjection.xyz / positionShadowViewProjection.w;\\nprojCoords = projCoords * 0.5 + 0.5;\\nfloat minProjCoords = min(projCoords.x, projCoords.y);\\nfloat maxProjCoords = max(projCoords.x, projCoords.y);\\nif (minProjCoords < 0.0 || maxProjCoords > 1.0)\\n{\\nshadow = 1.0;\\n}\\nelse\\n{\\nfloat currentDepth = projCoords.z;\\nfloat bias = 0.0;\\nvec2 texelSize = 1.0 / uShadowMapSize;\\nfor(int x = -1; x <= 1; ++x)\\n{\\nfor(int y = -1; y <= 1; ++y)\\n{\\nfloat pcfDepth = texture(uSampler5, projCoords.xy + vec2(x, y) * texelSize).r;\\nshadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;\\n}\\n}\\nshadow /= 9.0;\\nshadow = clamp(1.0 - shadow, 0.0, 1.0);\\n}\\n}\\nelse\\n{\\nshadow = 1.0;\\n}\\nfloat ssao = uSsao ? texture(uSampler4, texCoords).r : 1.0;\\nfloat diffuseIntensity = clamp(dot(normal.rgb, uDirectionToKeyLight), 0.0, 1.0) * uKeyLightIntensity * shadow;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight1), 0.0, 1.0) * uFillLight1Intensity * ssao;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight2), 0.0, 1.0) * uFillLight2Intensity * ssao;\\nvec3 diffuse = color.rgb * diffuseIntensity * uMaterialIntensity;\\nvec3 ambient = uAmbientIntensity * color.rgb * ssao;\\nvec3 emissive = color.w * color.rgb;\\nfloat specular = normal.w * clamp(pow(clamp(dot(normal.rgb, uKeyLightHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity * uKeyLightIntensity * shadow, 0.0, 1.0);\\nvec3 result = min(ambient + diffuse + specular + emissive, 1.0);\\nresult = pow(result, GAMMA);\\nmyOutputColor = vec4(result, position.w);\\n}\\n',\n    \"dofblur.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uNearFocusDepth;\\nuniform float uFarFocusDepth;\\nuniform float uMaxBackgroundBlur;\\nout vec4 myOutputColor;\\nfloat circleOfConfusion(in float depth )\\n{\\nfloat f;\\nif (depth < uFocusDepth)\\n{\\nf = (depth - uFocusDepth) / (uFocusDepth - uNearFocusDepth);\\nf = clamp(f, -1.0, 0.0);\\n}\\nelse\\n{\\nf = (depth - uFocusDepth) / (uFarFocusDepth - uFocusDepth);\\nf = clamp(f, 0.0, uMaxBackgroundBlur);\\n}\\nreturn f * 0.5 + 0.5;\\n}\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nvec4 color = texture(uSampler1, texCoords);\\nfloat depth = -texture(uSampler2, texCoords).z;\\nfloat coc = circleOfConfusion(depth);\\nmyOutputColor = vec4(coc);\\n}\\n\",\n    \"dofcombine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uAperture;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nout vec4 myOutputColor;\\nconst float MAX_CIRCLE_OF_CONFUSION = 3.0;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec2 texelSizeLow = texelSize * 4.0;\\nconst int NUM_TAPS = 13;\\nvec2 samples[NUM_TAPS];\\nsamples[0] = vec2(-0.326212,-0.405810);\\nsamples[1] = vec2(-0.840144,-0.073580);\\nsamples[2] = vec2(-0.695914, 0.457137);\\nsamples[3] = vec2(-0.203345, 0.620716);\\nsamples[4] = vec2( 0.962340,-0.194983);\\nsamples[5] = vec2( 0.473434,-0.480026);\\nsamples[6] = vec2( 0.519456, 0.767022);\\nsamples[7] = vec2( 0.185461,-0.893124);\\nsamples[8] = vec2( 0.507431, 0.064425);\\nsamples[9] = vec2( 0.896420, 0.412458);\\nsamples[10] = vec2(-0.321940,-0.932615);\\nsamples[11] = vec2(-0.791559,-0.597710);\\nsamples[12] = vec2( 0.000000, 0.000000);\\nconst float maxCoC = 5.0;\\nconst float radiusScale = 0.5;\\nvec4 cOut = texture(uSampler1, texCoords);\\nfloat coc = texture(uSampler2, texCoords).r;\\nfloat centerDepth = coc;\\nfloat discRadius = abs(coc * 2.0 - 1.0) * maxCoC;\\nfloat discRadiusLow = discRadius * radiusScale;\\ncOut = vec4(0.0);\\nfloat acc = 0.0;\\nfor (int t = 0; t < NUM_TAPS; t++)\\n{\\nvec2 coordLow = texCoords + (texelSizeLow * samples[t] * discRadiusLow);\\nvec2 coordHigh = texCoords + (texelSize * samples[t] * discRadius);\\nvec4 tapLow = texture(uSampler1, coordLow);\\nvec4 tapHigh = texture(uSampler1, coordHigh);\\nfloat cocLow = texture(uSampler2, coordLow).r;\\nfloat cocHigh = texture(uSampler2, coordHigh).r;\\nfloat tapBlur = abs(cocHigh * 2.0 - 1.0);\\nvec4 tap = mix(tapHigh, tapLow, tapBlur);\\nfloat cocBlur = mix(cocHigh, cocLow, tapBlur);\\ncocBlur = (cocBlur >= centerDepth) ? 1.0 : abs(cocBlur * 2.0 - 1.0);\\ncOut += tap * cocBlur;\\nacc += cocBlur;\\n}\\nvec4 result = cOut / acc;\\nmyOutputColor = result;\\n}\\n\",\n    \"downsample.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nmyOutputColor = texture(uSampler, texCoords);\\n}\\n\",\n    \"fxaa.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nconst float FXAA_SPAN_MAX = 8.0;\\nconst float FXAA_REDUCE_MUL = 1.0 / 8.0;\\nconst float FXAA_REDUCE_MIN = 1.0 / 128.0;\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec3 color = texture(uSampler, texCoords).rgb;\\nvec3 colorNW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorNE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorSW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y + texelSize.y)).rgb;\\nvec3 colorSE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y + texelSize.y)).rgb;\\nfloat luminance = dot(color, LUMINANCE);\\nfloat luminanceNW = dot(colorNW, LUMINANCE);\\nfloat luminanceNE = dot(colorNE, LUMINANCE);\\nfloat luminanceSW = dot(colorSW, LUMINANCE);\\nfloat luminanceSE = dot(colorSE, LUMINANCE);\\nfloat luminanceMin = min(luminance, min(min(luminanceNW, luminanceNE), min(luminanceSW, luminanceSE)));\\nfloat luminanceMax = max(luminance, max(max(luminanceNW, luminanceNE), max(luminanceSW, luminanceSE)));\\nvec2 dir = vec2(luminanceSW + luminanceSE - luminanceNW - luminanceNE, luminanceNW + luminanceSW - luminanceNE - luminanceSE);\\nfloat dirReduce = max((luminanceNW + luminanceNE + luminanceSW + luminanceSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\\nfloat rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\\ndir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texelSize;\\nvec3 colorA = 0.5 * (\\ntexture(uSampler, texCoords.xy + dir * (1.0/3.0 - 0.5)).rgb +\\ntexture(uSampler, texCoords.xy + dir * (2.0/3.0 - 0.5)).rgb);\\nvec3 colorB = colorA * 0.5 + 0.25 * (\\ntexture(uSampler, texCoords.xy - dir * 0.5).rgb +\\ntexture(uSampler, texCoords.xy + dir * 0.5).rgb);\\nluminance = dot(colorB, LUMINANCE);\\nif (luminance < luminanceMin || luminance > luminanceMax)\\n{\\nmyOutputColor = vec4(colorA, 1.0);\\n}\\nelse\\n{\\nmyOutputColor = vec4(colorB, 1.0);\\n}\\n}\\n',\n    \"gaussian.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nuniform bool uHorizontal;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec2 texelSize = vec2(1.0) / uResolution;\\nconst int NUM_WEIGHTS = 3;\\nfloat weights[NUM_WEIGHTS];\\nweights[0] = 0.2270270270;\\nweights[1] = 0.3162162162;\\nweights[2] = 0.0702702703;\\nfloat offsets[NUM_WEIGHTS];\\noffsets[0] = 0.0;\\noffsets[1] = 1.3846153846;\\noffsets[2] = 3.2307692308;\\nvec3 color = texture(uSampler, texCoords).rgb * weights[0];\\nif (uHorizontal)\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\n}\\n}\\nelse\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\n}\\n}\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"lasso.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nin mediump vec2 vTexCoord;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\nmyOutputColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n',\n    \"lasso.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nout mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"pickgrid.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nin lowp vec4 vColor;\\nin mediump vec2 vTexCoord;\\nin mediump vec4 vBounds;\\nin mediump vec3 vNormal;\\nin vec3 vViewPosition;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void) {\\nif (uPick)\\n{\\nmyPosition = vColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec2 buffer = fwidth(vTexCoord);\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\nmyColor.xyz = color.xyz;\\n}\\n}\\n',\n    \"pickgrid.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin lowp vec4 aIdColor;\\nin mediump vec2 aTexCoord;\\nin mediump vec3 aNormal;\\nin mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nout lowp vec4 vColor;\\nout mediump vec2 vTexCoord;\\nout mediump vec4 vBounds;\\nout mediump vec3 vNormal;\\nout vec3 vViewPosition;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nin lowp vec4 vIdColor;\\nin lowp float vHover;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick) {\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nfloat distance = texture(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth)\\n{\\ndiscard;\\n}\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, mix(uColor, uHoverColor, vHover), value);\\nmyPosition.xyz = vViewPosition;\\nmyNormal.xyz = vNormal;\\nmyColor.w = 1.0;\\nmyPosition.w = 0.0;\\nmyNormal.w = 0.0;\\n}\\n}\\n\",\n    \"sdftext.vertex.fx\": \"#version 300 es\\nin lowp vec4 aIdColor;\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nout vec3 vViewPosition;\\nout vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nout lowp vec4 vIdColor;\\nout lowp float vHover;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(0.0, 0.0, 1.0, 0.0));\\nvec4 viewPosition = mvMatrix* vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"ssao.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nconst int SSAO_KERNEL_SIZE = 8;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform mat4 uPMatrix;\\nuniform vec4 uViewport;\\nuniform float uSsaoNoiseSize;\\nuniform float uSsaoRadius;\\nuniform float uSsaoPower;\\nuniform vec3 uSsaoKernel[SSAO_KERNEL_SIZE];\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 position = texture(uSampler1, texCoords).rgb;\\nvec3 normal = texture(uSampler2, texCoords).rgb;\\nfloat occlusion = 0.0;\\nvec2 noiseScale = uViewport.zw / uSsaoNoiseSize;\\nvec3 randomVec = texture(uSampler3, texCoords * noiseScale).rgb;\\nvec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));\\nvec3 bitangent = cross(normal, tangent);\\nmat3 tbn = mat3(tangent, bitangent, normal);\\nfor(int i = 0; i < SSAO_KERNEL_SIZE; i++)\\n{\\nvec3 mySample = tbn * uSsaoKernel[i];\\nmySample = position + mySample * uSsaoRadius;\\nvec4 offset = vec4(mySample, 1.0);\\noffset = uPMatrix * offset;\\noffset.xy /= offset.w;\\noffset.xy = offset.xy * 0.5 + 0.5;\\nfloat sampleDepth = texture(uSampler1, offset.xy).z;\\nfloat rangeCheck = abs(position.z - sampleDepth) > uSsaoRadius ? 0.0 : 1.0;\\nocclusion += (sampleDepth < mySample.z ? 0.0 : 1.0) * rangeCheck;\\n}\\nocclusion /= float(SSAO_KERNEL_SIZE);\\nocclusion = pow(1.0 - occlusion, uSsaoPower);\\nmyOutputColor = vec4(occlusion, 0.0, 0.0, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform sampler2D uSampler;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nmyPosition.xyz = vViewPosition;\\nmyColor.xyz = pow(texture(uSampler, vTexCoord).xyz, INV_GAMMA);\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\n}\\n',\n    \"texture.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec3 aNormal;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nout vec3 vViewPosition;\\nout mediump vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitblock.vertex.fx\": '#version 300 es\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitcylinder.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec4 vCircle1;\\nin vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w, uShadow ? -1.0 : 1.0);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitcylinder.vertex.fx\": '#version 300 es\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout vec3 vViewPosition;\\nout vec4 vCircle1;\\nout vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitsdf.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec2 vTexCoord;\\nin mediump vec2 vPreviousTexCoord;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nfloat uBorderWidth = 0.0 / 255.0;\\nfloat uBuffer = 192.0 / 255.0;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat distance = mix(texture(uPreviousSampler1, vPreviousTexCoord).r, texture(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat uGamma = 0.0;\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, color, value);\\n}\\n}\\n',\n    \"unitsdf.vertex.fx\": '#version 300 es\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin mediump vec4 aTexCoord;\\nin mediump vec4 aPreviousTexCoord;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout mediump vec2 vTexCoord;\\nout mediump vec2 vPreviousTexCoord;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n',\n    \"unitsphere.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec3 vViewCenter;\\nin mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s, uShadow ? -1.0 : 1.0);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitsphere.vertex.fx\": '#version 300 es\\n#include \"common.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin lowp float aColor;\\nin lowp float aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump float vRadius;\\nout vec3 vViewPosition;\\nout vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\ntranslation.xyz += aPosition * scale;\\nvec4 viewPosition = mvMatrix * vec4(translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n',\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\n\",\n    \"intersect.include.fx\": \"float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph, in float shadow)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot( oc, rd );\\nfloat c = dot( oc, oc ) - sph.w*sph.w;\\nfloat h = b*b - c;\\nif( h<0.0 ) return -1.0;\\nreturn -b - shadow * sqrt( h );\\n}\\nfloat roundedboxIntersect( in vec3 ro, in vec3 rd, in vec3 size, in float rad )\\n{\\nvec3 m = 1.0/rd;\\nvec3 n = m*ro;\\nvec3 k = abs(m)*(size+rad);\\nvec3 t1 = -n - k;\\nvec3 t2 = -n + k;\\nfloat tN = max( max( t1.x, t1.y ), t1.z );\\nfloat tF = min( min( t2.x, t2.y ), t2.z );\\nif( tN > tF || tF < 0.0) return -1.0;\\nfloat t = tN;\\nvec3 pos = ro+t*rd;\\nvec3 s = sign(pos);\\nro *= s;\\nrd *= s;\\npos *= s;\\npos -= size;\\npos = max( pos.xyz, pos.yzx );\\nif( min(min(pos.x,pos.y),pos.z)<0.0 ) return t;\\nvec3 oc = ro - size;\\nvec3 dd = rd*rd;\\nvec3 oo = oc*oc;\\nvec3 od = oc*rd;\\nfloat ra2 = rad*rad;\\nt = 1e20;\\n{\\nfloat b = od.x + od.y + od.z;\\nfloat c = oo.x + oo.y + oo.z - ra2;\\nfloat h = b*b - c;\\nif( h>0.0 ) t = -b-sqrt(h);\\n}\\n{\\nfloat a = dd.y + dd.z;\\nfloat b = od.y + od.z;\\nfloat c = oo.y + oo.z - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.x+rd.x*h)<size.x ) t = h;\\n}\\n}\\n{\\nfloat a = dd.z + dd.x;\\nfloat b = od.z + od.x;\\nfloat c = oo.z + oo.x - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.y+rd.y*h)<size.y ) t = h;\\n}\\n}\\n{\\nfloat a = dd.x + dd.y;\\nfloat b = od.x + od.y;\\nfloat c = oo.x + oo.y - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.z+rd.z*h)<size.z ) t = h;\\n}\\n}\\nif( t>1e19 ) t=-1.0;\\nreturn t;\\n}\\nvec3 roundedboxNormal( in vec3 pos, in vec3 siz, in float rad )\\n{\\nreturn sign(pos)*normalize(max(abs(pos)-siz,0.0));\\n}\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - shadow * sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-shadow * sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - shadow * sqrt( h1 );\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - shadow * sqrt( h2 );\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n  };\n  class ShaderBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    set vertexBuffer(value2) {\n      if (this._vertexBuffer != value2) {\n        this._vertexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    set indexBuffer(value2) {\n      if (this._indexBuffer != value2) {\n        this._indexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    constructor(core, main) {\n      this._core = core;\n      this._main = main;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n      const program = this._gl.createProgram();\n      this._gl.attachShader(program, vs);\n      this._gl.attachShader(program, fs);\n      this._gl.linkProgram(program);\n      if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n      }\n      return program;\n    }\n    _compileShader(source2, type2) {\n      const shader = this._gl.createShader(type2);\n      this._gl.shaderSource(shader, source2);\n      this._gl.compileShader(shader);\n      if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n      }\n      return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n      const remove2 = `#define ${directive}`;\n      const index2 = shaderSource.indexOf(remove2);\n      shaderSource = index2 == -1 ? shaderSource : shaderSource.substring(0, index2) + shaderSource.substring(index2 + remove2.length);\n      return shaderSource;\n    }\n    prepare() {\n      if (this._program != this._main.shaderResources.currentProgram) {\n        if (this._main.shaderResources.currentShader) {\n          this._main.shaderResources.currentShader.disableProgram();\n        }\n        this.enableProgram(this._program);\n        this.updateBuffers();\n        this.updateTextures();\n      } else {\n        if (this._haveBuffersChanged) {\n          this.updateBuffers();\n        }\n        if (this._haveTexturesChanged) {\n          this.updateTextures();\n        }\n      }\n    }\n    apply() {\n    }\n    applyModel() {\n    }\n    applyView() {\n    }\n    enableProgram(program) {\n      this._gl.useProgram(program);\n      this._main.shaderResources.currentProgram = program;\n      this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n      this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n      this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n      this._main.shaderResources.currentShader = null;\n      this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n      callback(this._includesFromFile(Resources.glsl[vsName]), this._includesFromFile(Resources.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n      this._sourceFromUrl(vsName, (vsSource) => {\n        this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n          this._sourceFromUrl(fsName, (fsSource) => {\n            this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n              callback(vsIncSource, fsIncSource);\n            });\n          });\n        });\n      });\n    }\n    _sourceFromUrl(url, callback) {\n      const request2 = new XMLHttpRequest();\n      request2.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n      request2.onreadystatechange = () => {\n        if (request2.readyState == XMLHttpRequest.DONE && request2.status == 200) {\n          callback(request2.responseText);\n        }\n      };\n      request2.send();\n    }\n    _includesFromFile(source2) {\n      let index2 = 0;\n      do {\n        index2 = source2.indexOf(\"#include\", index2);\n        if (index2 != -1) {\n          const start = source2.indexOf('\"', index2);\n          const end = source2.indexOf('\"', start + 1);\n          const name = source2.substring(start + 1, end);\n          const inc = Resources.glsl[name];\n          source2 = source2.substring(0, index2) + inc + source2.substring(end + 1);\n        }\n      } while (index2 != -1);\n      return source2;\n    }\n    _includesFromUrl(source2, index2, callback) {\n      index2 = source2.indexOf(\"#include\", index2);\n      if (index2 != -1) {\n        const start = source2.indexOf('\"', index2);\n        const end = source2.indexOf('\"', start + 1);\n        const name = source2.substring(start + 1, end);\n        this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n          source2 = source2.substring(0, index2) + include + source2.substring(end + 1);\n          this._includesFromUrl(source2, index2, callback);\n        });\n      } else {\n        callback(source2);\n      }\n    }\n  }\n  class Texture extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  let Lasso$1 = class Lasso extends ShaderBase {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n      this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  class SdfText extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n      this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n      this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n      this._gl.uniform1f(this._gammaUniform, this.gamma);\n      this._gl.uniform1f(this._bufferUniform, this.buffer);\n      this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class PickGrid extends ShaderBase {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n      this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n      this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n      this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n      this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n      this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n      this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n      this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n      this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n      this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n      this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n      this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n      this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n      this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n      this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n      this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n      this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n      this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n      this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n      this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n      this._gl.uniform2fv(this._zeroUniform, this.zero);\n      this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._boundsAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  }\n  class UnitShader extends ShaderBase {\n    get paletteTexture() {\n      return this._paletteTexture;\n    }\n    set paletteTexture(value2) {\n      if (this._paletteTexture != value2) {\n        this._paletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousPaletteTexture() {\n      return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value2) {\n      if (this._previousPaletteTexture != value2) {\n        this._previousPaletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get sdfTexture() {\n      return this._sdfTexture;\n    }\n    set sdfTexture(value2) {\n      if (this._sdfTexture != value2) {\n        this._sdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousSdfTexture() {\n      return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value2) {\n      if (this._previousSdfTexture != value2) {\n        this._previousSdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    set instanceBuffer(value2) {\n      if (this._instanceBuffer != value2) {\n        this._instanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    set previousInstanceBuffer(value2) {\n      if (this._previousInstanceBuffer != value2) {\n        this._previousInstanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    initializeData() {\n      this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n      this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n      this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n      this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n      this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n      this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n      this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n      this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n      this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n      this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n      this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n      this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n      this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n      const vertices = Cube.POSITIONS;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Cube.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this.indexCount = indices.length;\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._updateCurrentBuffer();\n      this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n      this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._idAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._idColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._translationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._translationAttribute);\n      this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._scaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._scaleAttribute);\n      this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._selectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._selectedAttribute);\n      this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._orderAttribute, 1);\n      this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n      if (this._previousInstanceBuffer != this._instanceBuffer) {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n      }\n      this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n      this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousScaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n      this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1f(this._timeUniform, this.time);\n      this._gl.uniform1f(this._durationUniform, this.duration);\n      this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n      this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n      this._gl.uniform1i(this._previousSampler0Uniform, 0);\n      this._gl.uniform1i(this._sampler0Uniform, 1);\n      this._gl.uniform1f(this._hoverUniform, this.hover);\n      this._gl.uniform1f(this._activeUniform, this.active);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniform1i(this._shadowUniform, this.isShadowMap ? 1 : 0);\n    }\n    updateTextures() {\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._translationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._scaleAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousScaleAttribute, 0);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 0);\n      this._gl.vertexAttribDivisor(this._selectedAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 0);\n      this._gl.vertexAttribDivisor(this._orderAttribute, 0);\n      this._gl.vertexAttribDivisor(this._idAttribute, 0);\n      this._gl.vertexAttribDivisor(this._idColorAttribute, 0);\n    }\n  }\n  class UnitBlock extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n  }\n  class UnitSphere extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n  }\n  class UnitCylinder extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n  }\n  class UnitSdf extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n      this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._texCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n      super.apply();\n      this._gl.uniform1i(this._previousSampler1Uniform, 2);\n      this._gl.uniform1i(this._sampler1Uniform, 3);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._texCoordAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 0);\n    }\n  }\n  class Background extends ShaderBase {\n    constructor(core, main) {\n      super(core, main);\n      this._quad = new Quad$1();\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      this._quad.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"background.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._isInitialized = true;\n      this._vao = gl.createVertexArray();\n      gl.bindVertexArray(this._vao);\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._quad.vertexBuffer);\n      gl.vertexAttribPointer(this._positionAttribute, 3, gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      gl.enableVertexAttribArray(this._positionAttribute);\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._quad.indexBuffer);\n      gl.bindVertexArray(null);\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindVertexArray(this._vao);\n    }\n  }\n  class Ssao extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"ssao.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._ssaoNoiseSizeUniform = gl.getUniformLocation(this._program, \"uSsaoNoiseSize\");\n      this._ssaoRadiusUniform = gl.getUniformLocation(this._program, \"uSsaoRadius\");\n      this._ssaoPowerUniform = gl.getUniformLocation(this._program, \"uSsaoPower\");\n      this._ssaoKernelUniform = gl.getUniformLocation(this._program, \"uSsaoKernel\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._ssaoNoiseSizeUniform, this.ssaoNoiseSize);\n      this._gl.uniform1f(this._ssaoRadiusUniform, this.ssaoRadius);\n      this._gl.uniform1f(this._ssaoPowerUniform, this.ssaoPower);\n      this._gl.uniform3fv(this._ssaoKernelUniform, this.ssaoKernel);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n  }\n  class Box extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"box.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Deferred extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D4() {\n      return this._texture2D4;\n    }\n    set texture2D4(value2) {\n      if (this._texture2D4 != value2) {\n        this._texture2D4 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D5() {\n      return this._texture2D5;\n    }\n    set texture2D5(value2) {\n      if (this._texture2D5 != value2) {\n        this._texture2D5 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    constructor(core, main) {\n      super(core, main);\n      this.directionToKeyLight = create$6();\n      this.directionToFillLight1 = create$6();\n      this.directionToFillLight2 = create$6();\n      this.keyLightHalfAngle = create$6();\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"deferred.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n      this._ssaoUniform = gl.getUniformLocation(this._program, \"uSsao\");\n      this._inverseVMatrixUniform = gl.getUniformLocation(this._program, \"uInverseVMatrix\");\n      this._shadowVMatrixUniform = gl.getUniformLocation(this._program, \"uShadowVMatrix\");\n      this._shadowPMatrixUniform = gl.getUniformLocation(this._program, \"uShadowPMatrix\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n      this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._shadowMapSizeUniform = gl.getUniformLocation(this._program, \"uShadowMapSize\");\n      this._keyLightHalfAngleUniform = gl.getUniformLocation(this._program, \"uKeyLightHalfAngle\");\n      this._directionToKeyLightUniform = gl.getUniformLocation(this._program, \"uDirectionToKeyLight\");\n      this._directionToFillLight1Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight1\");\n      this._directionToFillLight2Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight2\");\n      this._keyLightIntensityUniform = gl.getUniformLocation(this._program, \"uKeyLightIntensity\");\n      this._fillLight1IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight1Intensity\");\n      this._fillLight2IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight2Intensity\");\n      this._ambientIntensityUniform = gl.getUniformLocation(this._program, \"uAmbientIntensity\");\n      this._materialIntensityUniform = gl.getUniformLocation(this._program, \"uMaterialIntensity\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._shadowUniform, this.isShadowEnabled ? 1 : 0);\n      this._gl.uniform1i(this._ssaoUniform, this.isSsaoEnabled ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._inverseVMatrixUniform, false, this.inverseVMatrix);\n      this._gl.uniformMatrix4fv(this._shadowVMatrixUniform, false, this.shadowVMatrix);\n      this._gl.uniformMatrix4fv(this._shadowPMatrixUniform, false, this.shadowPMatrix);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform1i(this._samplerUniform4, 3);\n      this._gl.uniform1i(this._samplerUniform5, 4);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform2f(this._shadowMapSizeUniform, this.shadowMapWidth, this.shadowMapHeight);\n      this._gl.uniform1f(this._keyLightIntensityUniform, this.keyLightIntensity);\n      this._gl.uniform1f(this._fillLight1IntensityUniform, this.fillLight1Intensity);\n      this._gl.uniform1f(this._fillLight2IntensityUniform, this.fillLight2Intensity);\n      this._gl.uniform1f(this._ambientIntensityUniform, this.ambientIntensity);\n      this._gl.uniform1f(this._materialIntensityUniform, this.materialIntensity);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n      this._gl.uniform3fv(this._directionToKeyLightUniform, this.directionToKeyLight);\n      this._gl.uniform3fv(this._directionToFillLight1Uniform, this.directionToFillLight1);\n      this._gl.uniform3fv(this._directionToFillLight2Uniform, this.directionToFillLight2);\n      this._gl.uniform3fv(this._keyLightHalfAngleUniform, this.keyLightHalfAngle);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n      this._gl.activeTexture(this._gl.TEXTURE4);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n  }\n  class Combine extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D4() {\n      return this._texture2D4;\n    }\n    set texture2D4(value2) {\n      if (this._texture2D4 != value2) {\n        this._texture2D4 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D5() {\n      return this._texture2D5;\n    }\n    set texture2D5(value2) {\n      if (this._texture2D5 != value2) {\n        this._texture2D5 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"combine.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._intensityUniform = gl.getUniformLocation(this._program, \"uIntensity\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n      this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n      this._gl.uniform1f(this._intensityUniform, this.intensity);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform1i(this._samplerUniform4, 3);\n      this._gl.uniform1i(this._samplerUniform5, 4);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n      this._gl.activeTexture(this._gl.TEXTURE4);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n  }\n  class DofBlur extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"dofblur.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n      this._nearFocusDepthUniform = gl.getUniformLocation(this._program, \"uNearFocusDepth\");\n      this._farFocusDepthUniform = gl.getUniformLocation(this._program, \"uFarFocusDepth\");\n      this._maxBackgroundBlurUniform = gl.getUniformLocation(this._program, \"uMaxBackgroundBlur\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n      this._gl.uniform1f(this._nearFocusDepthUniform, this.nearFocusDepth);\n      this._gl.uniform1f(this._farFocusDepthUniform, this.farFocusDepth);\n      this._gl.uniform1f(this._maxBackgroundBlurUniform, this.maxBackgroundBlur);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n    }\n  }\n  class Downsample extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"downsample.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Gaussian extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"gaussian.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n      this._horizontalUniform = gl.getUniformLocation(this._program, \"uHorizontal\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n      this._gl.uniform1i(this._horizontalUniform, this.horizontal ? 1 : 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class DofCombine extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"dofcombine.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n      this._apertureUniform = gl.getUniformLocation(this._program, \"uAperture\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n      this._gl.uniform1f(this._apertureUniform, this.aperture);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n  }\n  class Fxaa extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"fxaa.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Bright extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"bright.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get axes() {\n      return this._axes;\n    }\n    constructor(core) {\n      this._core = core;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._renderGrid();\n        this._renderText();\n      }\n    }\n    _renderGrid() {\n    }\n    _renderText() {\n    }\n  }\n  class Cartesian2dVisual extends AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian2dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 2; edge++) {\n          const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n          if (axes.isEdgeVisible[edgeId]) {\n            if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n              indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n              indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n            } else {\n              indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n              indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n            }\n            if (indexCount > 0) {\n              shader.mMatrix = axes.getLabelMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n            indexCount = axes.getTitleIndexCount(axisId);\n            if (indexCount > 0) {\n              indexOffset = axes.getTitleIndexOffset(axisId);\n              shader.mMatrix = axes.getTitleMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n          indexCount = axes.getHeadingIndexCount(axisId);\n          if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n            indexOffset = axes.getHeadingIndexOffset(axisId);\n            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n            shader.applyModel();\n            shader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n              const viewport = i + this.viewportOffset;\n              this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n              shader.vMatrix = this.vMatrices[viewport];\n              shader.pMatrix = this.pMatrices[viewport];\n              shader.applyView();\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n              shader.isPickShader = true;\n              shader.pMatrix = this.pickPMatrix;\n              shader.vMatrix = this.pickVMatrix;\n              shader.applyView();\n              shaderResources.bindFramebuffer(this.pickFramebuffer);\n              this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const gridShader = this._main.gridShader;\n      const axes = this._axes;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width3 = gridTicksScale[0];\n          const height3 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$3.AXIS_EDGES[axisId][edge];\n            if (axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width3, height3);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      const axisId2 = 0;\n      const axisId3 = 1;\n      const width2 = size[axisId2];\n      const height2 = size[axisId3];\n      gridShader.zero = axes.gridFaceZero;\n      gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n      for (let face = 0; face < 2; face++) {\n        const faceId = face;\n        if (axes.getIsForwardFace(faceId)) {\n          this._renderGridFace(faceId, width2, height2);\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  }\n  class Cartesian3dVisual extends AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian3dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 4; edge++) {\n          const edgeId = Cube.AXIS_EDGES[axisId][edge];\n          if (axes.getIsOutsideEdge(edgeId)) {\n            if (axes.isEdgeVisible[edgeId]) {\n              if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n              } else {\n                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n              }\n              if (indexCount > 0) {\n                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n              indexCount = axes.getTitleIndexCount(axisId);\n              if (indexCount > 0) {\n                indexOffset = axes.getTitleIndexOffset(axisId);\n                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n            }\n            indexCount = axes.getHeadingIndexCount(axisId);\n            if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n              indexOffset = axes.getHeadingIndexOffset(axisId);\n              shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width2 = gridTicksScale[0];\n          const height2 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.areFacesVisible[axisId]) {\n          const axisId2 = axisId == 0 ? 1 : 0;\n          const axisId3 = axisId == 2 ? 1 : 2;\n          const width2 = size[axisId2];\n          const height2 = size[axisId3];\n          gridShader.zero = axes.getGridFaceZero(axisId);\n          gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n          for (let face = 0; face < 2; face++) {\n            const faceId = Cube.AXIS_FACES[axisId][face];\n            if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n              this._renderGridFace(faceId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  }\n  class FontVisual {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get font() {\n      return this._font;\n    }\n    constructor(core, font2) {\n      this._core = core;\n      this._font = font2;\n      font2.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._isInitialized = true;\n      if (this._font.count > 0) {\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n        this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n      }\n    }\n  }\n  class LabelVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label2) {\n      this._core = core;\n      this._main = main;\n      this._label = label2;\n      this._label.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this._mMatrix = create$7();\n      this.mMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._label.isInitialized) {\n        this._label.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const indexCount = this._label.indexCount;\n        if (indexCount > 0) {\n          const shader = this._main.sdfTextShader;\n          const fontVisual = this._main.fonts[this._label.font.name];\n          shader.vertexBuffer = this._vertexBuffer;\n          shader.indexBuffer = this._indexBuffer;\n          shader.texture2D = fontVisual.texture;\n          shader.prepare();\n          shader.gamma = this._label.gamma;\n          shader.buffer = fontVisual.font.edgeValue / 255;\n          shader.borderWidth = this._label.borderWidth;\n          shader.color = this._label.color || this._core.config.textColor;\n          shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n          shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n          shader.pickedIdColor = this.pickedIdColor;\n          shader.apply();\n          multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n          shader.mMatrix = this._mMatrix;\n          shader.applyModel();\n          shader.isPickShader = false;\n          this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            shader.vMatrix = this.vMatrices[viewport];\n            shader.pMatrix = this.pMatrices[viewport];\n            shader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n          if (this.isPickingEnabled) {\n            shader.isPickShader = true;\n            shader.pMatrix = this.pickPMatrix;\n            shader.vMatrix = this.pickVMatrix;\n            shader.applyView();\n            this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      }\n    }\n  }\n  class LabelVisual extends LabelVisualBase {\n    get label() {\n      return this._label;\n    }\n    set text(value2) {\n      this._label.text = value2;\n    }\n    get text() {\n      return this._label.text;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  }\n  class LabelSetVisual extends LabelVisualBase {\n    get label() {\n      return this._label;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  }\n  class ImageVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n      return this._image;\n    }\n    constructor(core, main, image2) {\n      this._core = core;\n      this._main = main;\n      this._image = image2;\n      this._image.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this.mMatrix = create$7();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._image.isInitialized) {\n        this._image.initialize();\n      }\n      this._gl = gl;\n      if (this._image.imageData) {\n        this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n      }\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const textureShader = this._main.textureShader;\n        textureShader.vertexBuffer = this._vertexBuffer;\n        textureShader.indexBuffer = this._indexBuffer;\n        textureShader.texture2D = this.texture;\n        textureShader.prepare();\n        textureShader.mMatrix = this.mMatrix;\n        textureShader.apply();\n        this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          textureShader.vMatrix = this.vMatrices[viewport];\n          textureShader.pMatrix = this.pMatrices[viewport];\n          textureShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  }\n  class Lasso {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const vertices = Quad$3.textured(Constants$1.MAT4_IDENTITY);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$3.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  }\n  var __awaiter$1 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class Main extends RendererBase {\n    get shaderResources() {\n      return this._shaderResources;\n    }\n    get textureShader() {\n      return this._textureShader;\n    }\n    get lassoShader() {\n      return this._lassoShader;\n    }\n    get sdfTextShader() {\n      return this._sdfTextShader;\n    }\n    get gridShader() {\n      return this._gridShader;\n    }\n    get blockShader() {\n      return this._blockShader;\n    }\n    get sphereShader() {\n      return this._sphereShader;\n    }\n    get cyclinderShader() {\n      return this._cylinderShader;\n    }\n    get sdfShader() {\n      return this._sdfShader;\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    get config() {\n      return this._config;\n    }\n    constructor(options2) {\n      super(options2);\n      this._config = new Config();\n      this._quad = new Quad$1();\n      this._lasso = new Lasso();\n      this._pickedPixels = new Uint8Array(4);\n      this._pickedIdColor = create$5();\n      this._position = create$6();\n      this._direction = create$6();\n      this._cameraRotation = create$8();\n      this._cameraPosition = create$6();\n      this._modelPosition = create$6();\n      this._modelManipulationOrigin = create$6();\n      this._shadowVMatrix = create$7();\n      this._shadowPMatrix = create$7();\n    }\n    get isSupported() {\n      return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    initialize(core) {\n      super.initialize(core);\n      this._shaderResources = new Resources();\n      this._textureShader = new Texture(core, this);\n      this._lassoShader = new Lasso$1(core, this);\n      this._sdfTextShader = new SdfText(core, this);\n      this._gridShader = new PickGrid(core, this);\n      this._blockShader = new UnitBlock(core, this);\n      this._sphereShader = new UnitSphere(core, this);\n      this._cylinderShader = new UnitCylinder(core, this);\n      this._sdfShader = new UnitSdf(core, this);\n      this._backgroundShader = new Background(core, this);\n      this._ssaoShader = new Ssao(core, this);\n      this._boxShader = new Box(core, this);\n      this._deferredShader = new Deferred(core, this);\n      this._combineShader = new Combine(core, this);\n      this._dofBlurShader = new DofBlur(core, this);\n      this._downsampleShader = new Downsample(core, this);\n      this._gaussianShader = new Gaussian(core, this);\n      this._dofCombineShader = new DofCombine(core, this);\n      this._fxaaShader = new Fxaa(core, this);\n      this._brightPassShader = new Bright(core, this);\n      this._initializeContext(this._createContext(this._canvas));\n      this._canvas.addEventListener(\"webglcontextlost\", (event2) => {\n        this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n        event2.preventDefault();\n      }, false);\n      this._canvas.addEventListener(\"webglcontextrestored\", () => {\n        this._initializeContext(this._createContext(this._canvas));\n        this._core.log.write(LogLevel.info, \"WebGL context restored\");\n      }, false);\n      this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n      this._gl = gl;\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        fontVisual.initializeContext(gl);\n      }\n      this._ssaoSampleKernel = new Float32Array(this._config.ssaoKernelSize * 3);\n      const random2 = new PseudoRandom(0);\n      const _vec3 = create$6();\n      for (let i = 0; i < this._config.ssaoKernelSize; i++) {\n        _vec3[0] = random2.nextFloat() * 2 - 1;\n        _vec3[1] = random2.nextFloat() * 2 - 1;\n        _vec3[2] = random2.nextFloat();\n        normalize$5(_vec3, _vec3);\n        scale$5(_vec3, _vec3, random2.nextFloat());\n        let scale2 = i / this._config.ssaoKernelSize;\n        scale2 = MathHelper.lerp(0.1, 1, scale2 * scale2);\n        scale$5(_vec3, _vec3, scale2);\n        this._ssaoSampleKernel[i * 3] = _vec3[0];\n        this._ssaoSampleKernel[i * 3 + 1] = _vec3[1];\n        this._ssaoSampleKernel[i * 3 + 2] = _vec3[2];\n      }\n      const noise = new Float32Array(this._config.ssaoNoiseSize * this._config.ssaoNoiseSize * 4);\n      _vec3[2] = 0;\n      for (let i = 0; i < this._config.ssaoNoiseSize * this._config.ssaoNoiseSize; i++) {\n        _vec3[0] = random2.nextFloat() * 2 - 1;\n        _vec3[1] = random2.nextFloat() * 2 - 1;\n        normalize$5(_vec3, _vec3);\n        noise[i * 4] = _vec3[0];\n        noise[i * 4 + 1] = _vec3[1];\n      }\n      this._ssaoNoiseTexture = this._gl.createTexture();\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._ssaoNoiseTexture);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST);\n      this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA32F, this._config.ssaoNoiseSize, this._config.ssaoNoiseSize, 0, this._gl.RGBA, this._gl.FLOAT, noise);\n      this._ssaoWidth = -1;\n      this._ssaoHeight = -1;\n      this._shadowWidth = -1;\n      this._shadowHeight = -1;\n      this._shaderResources.initializeContext(this._gl);\n      this._textureShader.initializeContext(this._gl);\n      this._lassoShader.initializeContext(this._gl);\n      this._sdfTextShader.initializeContext(this._gl);\n      this._gridShader.initializeContext(this._gl);\n      this._blockShader.initializeContext(this._gl);\n      this._sphereShader.initializeContext(this._gl);\n      this._cylinderShader.initializeContext(this._gl);\n      this._sdfShader.initializeContext(this._gl);\n      this._backgroundShader.initializeContext(this._gl);\n      this._ssaoShader.initializeContext(this._gl);\n      this._boxShader.initializeContext(this._gl);\n      this._deferredShader.initializeContext(this._gl);\n      this._combineShader.initializeContext(this._gl);\n      this._dofBlurShader.initializeContext(this._gl);\n      this._downsampleShader.initializeContext(this._gl);\n      this._gaussianShader.initializeContext(this._gl);\n      this._dofCombineShader.initializeContext(this._gl);\n      this._fxaaShader.initializeContext(this._gl);\n      this._brightPassShader.initializeContext(this._gl);\n      this._quad.initializeContext(this._gl);\n      this._lasso.initializeContext(this._gl);\n      this._framebuffers = [null, null];\n      const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, this._core.config.pickWidth, this._core.config.pickHeight);\n      const framebuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(framebuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._pickFrameBuffer = framebuffer;\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        this.transitionBuffers[i].initializeContext(this._gl);\n      }\n      if (this._axes1) {\n        for (let i = 0; i < this._axes1.length; i++) {\n          this._axes1[i].initializeContext(this._gl);\n        }\n      }\n      if (this._axes2) {\n        for (let i = 0; i < this._axes2.length; i++) {\n          this._axes2[i].initializeContext(this._gl);\n        }\n      }\n      for (let i = 0; i < this.labelSets.length; i++) {\n        this.labelSets[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.images.length; i++) {\n        this.images[i].initializeContext(this._gl);\n      }\n    }\n    _resize(width2, height2) {\n      super._resize(width2, height2);\n      this._positionTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.NEAREST, null, this._gl.RGBA32F);\n      this._colorTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._normalTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._geometryFrameBuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._positionTexture, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT1, this._gl.TEXTURE_2D, this._colorTexture, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT2, this._gl.TEXTURE_2D, this._normalTexture, 0);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, width2, height2);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.drawBuffers([this._gl.COLOR_ATTACHMENT0, this._gl.COLOR_ATTACHMENT1, this._gl.COLOR_ATTACHMENT2]);\n      this._postProcessTexture1 = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessDepthTexture = TextureHelper.create(this._gl, width2, height2, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n      this._postProcessFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture1, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._postProcessDepthTexture, 0);\n      this._postProcessTexture2 = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture2, 0);\n      this._postProcessDofTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RED, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.R32F);\n      this._postProcessDofFrameBuffer = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessDofTexture, 0);\n      const widthHalf = Math.round(width2 / 2);\n      const heightHalf = Math.round(height2 / 2);\n      this._postProcessHalfTexture1 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessHalfFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture1, 0);\n      this._postProcessHalfTexture2 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessHalfFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture2, 0);\n      const widthQuarter = Math.round(widthHalf / 2);\n      const heightQuarter = Math.round(heightHalf / 2);\n      this._postProcessQuarterTexture1 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessQuarterFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture1, 0);\n      this._postProcessQuarterTexture2 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessQuarterFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture2, 0);\n      const widthEighth = Math.round(widthQuarter / 2);\n      const heightEighth = Math.round(heightQuarter / 2);\n      this._postProcessEighthTexture1 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessEighthFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture1, 0);\n      this._postProcessEighthTexture2 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessEighthFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture2, 0);\n      const widthSixteenth = Math.round(widthEighth / 2);\n      const hgeightSixteenth = Math.round(heightEighth / 2);\n      this._postProcessSixteenthTexture1 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessSixteenthFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture1, 0);\n      this._postProcessSixteenthTexture2 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessSixteenthFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture2, 0);\n      this._core.log.write(LogLevel.info, `buffers resized ${width2},${height2}`);\n    }\n    _createContext(canvas) {\n      let supported = false;\n      const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === void 0 ? false : this._options.preserveDrawingBuffer : false;\n      const options2 = {\n        stencil: true,\n        alpha: false,\n        antialias: false,\n        preserveDrawingBuffer\n      };\n      const gl = canvas.getContext(\"webgl2\", options2);\n      if (gl) {\n        const OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n        const EXT_color_buffer_float = gl.getExtension(\"EXT_color_buffer_float\");\n        if (OES_texture_float_linear && EXT_color_buffer_float && gl.MAX_DRAW_BUFFERS > 3) {\n          const texture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.FLOAT, gl.LINEAR, null, gl.RGBA32F);\n          const framebuffer = gl.createFramebuffer();\n          gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n          gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n          const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n          if (status == gl.FRAMEBUFFER_COMPLETE) {\n            supported = true;\n          }\n          gl.bindTexture(gl.TEXTURE_2D, null);\n        }\n      }\n      return supported ? gl : null;\n    }\n    prepare() {\n      let viewport;\n      switch (this._core.config.stereoMode) {\n        case StereoMode.none:\n          viewport = this._viewports[0];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 0;\n          this._viewportCount = 1;\n          break;\n        case StereoMode.left:\n          viewport = this._viewports[0];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 0;\n          this._viewportCount = 1;\n          break;\n        case StereoMode.right:\n          viewport = this._viewports[1];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 1;\n          this._viewportCount = 1;\n          break;\n      }\n    }\n    createTransitionBuffer(ids) {\n      const buffer = new TransitionBuffer(this._core, ids);\n      buffer.initializeContext(this._gl);\n      return buffer;\n    }\n    createCartesian2dAxesVisual(axes) {\n      const visual = new Cartesian2dVisual(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n      const visual = new Cartesian3dVisual(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    _createLabelVisual(label2) {\n      return new LabelVisual(this._core, this, label2);\n    }\n    createLabelSetVisual(labelSet) {\n      const visual = new LabelSetVisual(this._core, this, labelSet);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createImageVisual(image2) {\n      const visual = new ImageVisual(this._core, this, image2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createFontVisual(font2) {\n      const visual = new FontVisual(this._core, font2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    getDataUrl(mimeType) {\n      return this._canvas.toDataURL(mimeType);\n    }\n    update(elapsedTime) {\n      super.update(elapsedTime);\n      if (this._shadowWidth != this._config.shadowWidth || this._shadowHeight != this._config.shadowHeight) {\n        this._shadowWidth = this._config.shadowWidth;\n        this._shadowHeight = this._config.shadowHeight;\n        this._shadowColorTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        this._shadowDepthTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n        this._shadowFrameBuffer = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._shadowFrameBuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._shadowColorTexture, 0);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._shadowDepthTexture, 0);\n        this._core.log.write(LogLevel.info, `shadow map resized ${this._shadowWidth},${this._shadowHeight}`);\n      }\n      if (this._ssaoWidth != this._config.ssaoWidth || this._ssaoHeight != this._config.ssaoHeight) {\n        this._ssaoWidth = this._config.ssaoWidth;\n        this._ssaoHeight = this._config.ssaoHeight;\n        this._ssaoTexture1 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n        this._ssaoFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture1, 0);\n        this._ssaoTexture2 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n        this._ssaoFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture2, 0);\n        this._core.log.write(LogLevel.info, `ssao map resized ${this._ssaoWidth},${this._ssaoHeight}`);\n      }\n      if (this._config.isDofEnabled && this._config.dofAutoFocus) {\n        this._core.getModelManipulationOrigin(this._modelManipulationOrigin);\n        this._core.getModelPosition(this._modelPosition);\n        add$4(this._position, this._modelManipulationOrigin, this._modelPosition);\n        this._core.camera.getPosition(this._cameraPosition);\n        subtract(this._position, this._position, this._cameraPosition);\n        const distance2 = -this._position[2];\n        const amount = Math.min(elapsedTime * this._core.config.focusSmoothing, 1);\n        this._config.dofFocusDistance = MathHelper.lerp(this._config.dofFocusDistance, distance2, amount);\n      }\n    }\n    render(elapsedTime) {\n      return __awaiter$1(this, void 0, void 0, function* () {\n        this._gl.enable(this._gl.DEPTH_TEST);\n        this._gl.enable(this._gl.CULL_FACE);\n        this._gl.cullFace(this._gl.BACK);\n        this._gl.disable(this._gl.BLEND);\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.clearColor(0, 0, 0, 0);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n        this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1);\n        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT | this._gl.STENCIL_BUFFER_BIT);\n        if (this.config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.clear(this._gl.DEPTH_BUFFER_BIT);\n          perspective(this._shadowPMatrix, AngleHelper.degreesToRadians(30), this._config.shadowWidth / this._config.shadowHeight, this._core.config.nearPlane, this._core.config.farPlane);\n          set$8(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n          fromMat4(this._cameraRotation, this.inverseVMatrices[0]);\n          transformMat3(this._position, this._config.keyLightPosition, this._cameraRotation);\n          add$4(this._position, this._position, this._modelPosition);\n          lookAt(this._shadowVMatrix, this._position, this._modelPosition, Constants$1.VECTOR3_UNITY);\n        }\n        for (let i = 0; i < this.transitionBuffers.length; i++) {\n          const transitionBuffer = this.transitionBuffers[i];\n          if (transitionBuffer.isVisible) {\n            this._renderTransitionBuffer(transitionBuffer);\n          }\n        }\n        const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n        if (axesVisuals) {\n          for (let i = 0; i < axesVisuals.length; i++) {\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n              axesVisual.pickedIdColor = this._pickedIdColor;\n              axesVisual.pickFramebuffer = this._pickFrameBuffer;\n              axesVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              axesVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this.areLabelsVisible) {\n          for (let i = 0; i < this.labelSets.length; i++) {\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n              labelSetVisual.pickedIdColor = this._pickedIdColor;\n              labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n              labelSetVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              labelSetVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this.areImagesVisible) {\n          for (let i = 0; i < this.images.length; i++) {\n            const imageVisual = this.images[i];\n            if (imageVisual.isVisible) {\n              imageVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              imageVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this._backgroundShader.isInitialized) {\n          this._backgroundShader.prepare();\n          this._backgroundShader.color = fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n          this._backgroundShader.apply();\n          this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewport = i + this._viewportOffset;\n            this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n          this._gl.bindVertexArray(null);\n        }\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n          this._pickedType = PickHelper.decodeType(this._pickedPixels);\n          set$7(this._pickedIdColor, this._pickedPixels[0] / 255, this._pickedPixels[1] / 255, this._pickedPixels[2] / 255, this._pickedPixels[3] / 255);\n          this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n        } else {\n          set$7(this._pickedIdColor, 0, 0, 0, 0);\n          this._pickedId = 0;\n        }\n        if (this.transitionBuffers.length > 0 && this._quad.isInitialized) {\n          const viewport = this._viewportOffset;\n          this._postProcess(this.vMatrices[viewport], this.inverseVMatrices[viewport], this.pMatrices[viewport], this._viewports[viewport]);\n        }\n        if (this.isLassoPicking && this._lassoShader.isInitialized) {\n          this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n          this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n          const lassoWidth = this.lassoX1 - this.lassoX0;\n          const lassoHeight = this.lassoY1 - this.lassoY0;\n          this._lassoShader.prepare();\n          this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n          this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n          this._lassoShader.apply();\n          const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewportIndex = i + this._viewportOffset;\n            this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n            const viewport = this._viewports[viewportIndex];\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n            this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n            this._lassoMMatrix[10] = 1;\n            this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n            this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n            this._lassoShader.mMatrix = this._lassoMMatrix;\n            set$5(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n            this._lassoShader.thickness = this._lassoThickness;\n            this._lassoShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      });\n    }\n    _renderTransitionBuffer(transitionBuffer) {\n      const currentBuffer = transitionBuffer.currentBuffer;\n      const previousBuffer = transitionBuffer.previousBuffer;\n      const currentPalette = transitionBuffer.currentPalette;\n      const previousPalette = transitionBuffer.previousPalette;\n      const currentAtlas = transitionBuffer.currentAtlas;\n      const previousAtlas = transitionBuffer.previousAtlas;\n      const unitType = transitionBuffer.unitType === void 0 ? currentBuffer.unitType : transitionBuffer.unitType;\n      const id2 = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n      const hoverId = id2 > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id2) : -1;\n      const activeId = transitionBuffer.activeId;\n      if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf)) {\n        this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._blockShader.prepare();\n        this._blockShader.mMatrix = this.mMatrix;\n        this._blockShader.time = this.transitionTime;\n        this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._blockShader.rangeMin = currentBuffer.from;\n        this._blockShader.rangeMax = currentBuffer.to;\n        this._blockShader.hover = hoverId;\n        this._blockShader.active = activeId;\n        this._blockShader.specularPower = this._config.specularPower;\n        this._blockShader.specularIntensity = this._config.specularIntensity;\n        this._blockShader.apply();\n        this._blockShader.isPickShader = false;\n        this._blockShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._blockShader.vMatrix = this.vMatrices[viewport];\n          this._blockShader.pMatrix = this.pMatrices[viewport];\n          this._blockShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._gl.cullFace(this._gl.FRONT);\n          this._blockShader.isPickShader = false;\n          this._blockShader.isShadowMap = true;\n          this._blockShader.vMatrix = this._shadowVMatrix;\n          this._blockShader.pMatrix = this._shadowPMatrix;\n          this._blockShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n          this._gl.cullFace(this._gl.BACK);\n        }\n        if (this.isPickingEnabled) {\n          this._blockShader.isPickShader = true;\n          this._blockShader.isShadowMap = false;\n          this._blockShader.pMatrix = this.pickPMatrix;\n          this._blockShader.vMatrix = this.pickVMatrix;\n          this._blockShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf)) {\n        this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sphereShader.prepare();\n        this._sphereShader.mMatrix = this.mMatrix;\n        this._sphereShader.time = this.transitionTime;\n        this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sphereShader.rangeMin = currentBuffer.from;\n        this._sphereShader.rangeMax = currentBuffer.to;\n        this._sphereShader.hover = hoverId;\n        this._sphereShader.active = activeId;\n        this._sphereShader.specularPower = this._config.specularPower;\n        this._sphereShader.specularIntensity = this._config.specularIntensity;\n        this._sphereShader.apply();\n        this._sphereShader.isPickShader = false;\n        this._sphereShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._sphereShader.vMatrix = this.vMatrices[viewport];\n          this._sphereShader.pMatrix = this.pMatrices[viewport];\n          this._sphereShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._sphereShader.isPickShader = false;\n          this._sphereShader.isShadowMap = true;\n          this._sphereShader.vMatrix = this._shadowVMatrix;\n          this._sphereShader.pMatrix = this._shadowPMatrix;\n          this._sphereShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n        }\n        if (this.isPickingEnabled) {\n          this._sphereShader.isPickShader = true;\n          this._sphereShader.isShadowMap = false;\n          this._sphereShader.pMatrix = this.pickPMatrix;\n          this._sphereShader.vMatrix = this.pickVMatrix;\n          this._sphereShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n        this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._cylinderShader.prepare();\n        this._cylinderShader.mMatrix = this.mMatrix;\n        this._cylinderShader.time = this.transitionTime;\n        this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._cylinderShader.rangeMin = currentBuffer.from;\n        this._cylinderShader.rangeMax = currentBuffer.to;\n        this._cylinderShader.hover = hoverId;\n        this._cylinderShader.active = activeId;\n        this._cylinderShader.specularPower = this._config.specularPower;\n        this._cylinderShader.specularIntensity = this._config.specularIntensity;\n        this._cylinderShader.apply();\n        this._cylinderShader.isPickShader = false;\n        this._cylinderShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._cylinderShader.vMatrix = this.vMatrices[viewport];\n          this._cylinderShader.pMatrix = this.pMatrices[viewport];\n          this._cylinderShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._cylinderShader.isPickShader = false;\n          this._cylinderShader.isShadowMap = true;\n          this._cylinderShader.vMatrix = this._shadowVMatrix;\n          this._cylinderShader.pMatrix = this._shadowPMatrix;\n          this._cylinderShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n        }\n        if (this.isPickingEnabled) {\n          this._cylinderShader.isPickShader = true;\n          this._cylinderShader.isShadowMap = false;\n          this._cylinderShader.pMatrix = this.pickPMatrix;\n          this._cylinderShader.vMatrix = this.pickVMatrix;\n          this._cylinderShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n        this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n        this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n        this._sdfShader.prepare();\n        this._sdfShader.mMatrix = this.mMatrix;\n        this._sdfShader.time = this.transitionTime;\n        this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sdfShader.rangeMin = currentBuffer.from;\n        this._sdfShader.rangeMax = currentBuffer.to;\n        this._sdfShader.hover = hoverId;\n        this._sdfShader.active = activeId;\n        this._sdfShader.specularPower = this._config.specularPower;\n        this._sdfShader.specularIntensity = this._config.specularIntensity;\n        this._sdfShader.apply();\n        this._sdfShader.isPickShader = false;\n        this._sdfShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._sdfShader.vMatrix = this.vMatrices[viewport];\n          this._sdfShader.pMatrix = this.pMatrices[viewport];\n          this._sdfShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._gl.cullFace(this._gl.FRONT);\n          this._sdfShader.isPickShader = false;\n          this._sdfShader.isShadowMap = true;\n          this._sdfShader.vMatrix = this._shadowVMatrix;\n          this._sdfShader.pMatrix = this._shadowPMatrix;\n          this._sdfShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n          this._gl.cullFace(this._gl.BACK);\n        }\n        if (this.isPickingEnabled) {\n          this._sdfShader.isPickShader = true;\n          this._sdfShader.isShadowMap = false;\n          this._sdfShader.pMatrix = this.pickPMatrix;\n          this._sdfShader.vMatrix = this.pickVMatrix;\n          this._sdfShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      }\n    }\n    _postProcess(vMatrix, inverseVMatrix, pMatrix, viewport) {\n      if (this._deferredShader.isInitialized) {\n        this._gl.disable(this._gl.DEPTH_TEST);\n        let ssaoTexture;\n        if (this._config.isSsaoEnabled && this._ssaoShader.isInitialized) {\n          this._gl.viewport(0, 0, this._config.ssaoWidth, this._config.ssaoHeight);\n          ssaoTexture = this._ssaoTexture1;\n          this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer1);\n          this._ssaoShader.vertexBuffer = this._quad.vertexBuffer;\n          this._ssaoShader.indexBuffer = this._quad.indexBuffer;\n          this._ssaoShader.texture2D1 = this._positionTexture;\n          this._ssaoShader.texture2D2 = this._normalTexture;\n          this._ssaoShader.texture2D3 = this._ssaoNoiseTexture;\n          this._ssaoShader.prepare();\n          this._ssaoShader.pMatrix = pMatrix;\n          this._ssaoShader.ssaoNoiseSize = this._config.ssaoNoiseSize;\n          this._ssaoShader.ssaoRadius = this._config.ssaoRadius;\n          this._ssaoShader.ssaoPower = this._config.ssaoPower;\n          this._ssaoShader.ssaoKernel = this._ssaoSampleKernel;\n          this._ssaoShader.left = 0;\n          this._ssaoShader.top = 0;\n          this._ssaoShader.width = this._config.ssaoWidth;\n          this._ssaoShader.height = this._config.ssaoHeight;\n          this._ssaoShader.apply();\n          this._ssaoShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          if (this._config.ssaoBlurEnabled && this._boxShader.isInitialized) {\n            ssaoTexture = this._ssaoTexture2;\n            this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer2);\n            this._boxShader.vertexBuffer = this._quad.vertexBuffer;\n            this._boxShader.indexBuffer = this._quad.indexBuffer;\n            this._boxShader.texture2D = this._ssaoTexture1;\n            this._boxShader.prepare();\n            this._boxShader.left = 0;\n            this._boxShader.top = 0;\n            this._boxShader.width = this._config.ssaoWidth;\n            this._boxShader.height = this._config.ssaoHeight;\n            this._boxShader.apply();\n            this._boxShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n        this._gl.viewport(viewport.left, viewport.top, viewport.width, viewport.height);\n        let postProcessFrameBuffer = this._postProcessFrameBuffer1;\n        this._shaderResources.bindFramebuffer(postProcessFrameBuffer);\n        this._deferredShader.vertexBuffer = this._quad.vertexBuffer;\n        this._deferredShader.indexBuffer = this._quad.indexBuffer;\n        this._deferredShader.texture2D1 = this._positionTexture;\n        this._deferredShader.texture2D2 = this._colorTexture;\n        this._deferredShader.texture2D3 = this._normalTexture;\n        this._deferredShader.texture2D4 = this._config.isSsaoEnabled ? ssaoTexture : null;\n        this._deferredShader.texture2D5 = this._shadowDepthTexture;\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n        this._deferredShader.prepare();\n        this._deferredShader.isShadowEnabled = this._config.isShadowEnabled;\n        this._deferredShader.isSsaoEnabled = this._config.isSsaoEnabled;\n        this._deferredShader.inverseVMatrix = inverseVMatrix;\n        this._deferredShader.shadowVMatrix = this._shadowVMatrix;\n        this._deferredShader.shadowPMatrix = this._shadowPMatrix;\n        this._deferredShader.vMatrix = vMatrix;\n        this._deferredShader.keyLightIntensity = this._config.keyLightIntensity;\n        this._deferredShader.fillLight1Intensity = this._config.fillLight1Intensity;\n        this._deferredShader.fillLight2Intensity = this._config.fillLight2Intensity;\n        this._core.camera.getPosition(this._cameraPosition);\n        fromMat4(this._cameraRotation, vMatrix);\n        set$8(this._position, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n        normalize$5(this._deferredShader.directionToKeyLight, this._config.keyLightPosition);\n        subtract(this._direction, this._cameraPosition, this._position);\n        normalize$5(this._direction, this._direction);\n        add$4(this._deferredShader.keyLightHalfAngle, this._direction, this._deferredShader.directionToKeyLight);\n        normalize$5(this._deferredShader.keyLightHalfAngle, this._deferredShader.keyLightHalfAngle);\n        copy$6(this._deferredShader.directionToFillLight1, this._config.fillLight1Position);\n        copy$6(this._deferredShader.directionToFillLight2, this._config.fillLight2Position);\n        this._deferredShader.left = viewport.left;\n        this._deferredShader.top = viewport.top;\n        this._deferredShader.width = viewport.width;\n        this._deferredShader.height = viewport.height;\n        this._deferredShader.shadowMapWidth = this._config.shadowWidth;\n        this._deferredShader.shadowMapHeight = this._config.shadowHeight;\n        this._deferredShader.ambientIntensity = this._config.ambientIntensity;\n        this._deferredShader.materialIntensity = this._config.materialIntensity;\n        this._deferredShader.specularPower = this._config.specularPower;\n        this._deferredShader.specularIntensity = this._config.specularIntensity;\n        this._deferredShader.apply();\n        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        const widthHalf = Math.round(viewport.width / 2);\n        const heightHalf = Math.round(viewport.height / 2);\n        const widthQuarter = Math.round(widthHalf / 2);\n        const heightQuarter = Math.round(heightHalf / 2);\n        const widthEighth = Math.round(widthQuarter / 2);\n        const heightEighth = Math.round(heightQuarter / 2);\n        const widthSixteenth = Math.round(widthEighth / 2);\n        const heightSixteenth = Math.round(heightEighth / 2);\n        if (this._config.isDofEnabled && this._dofBlurShader.isInitialized && this._dofCombineShader.isInitialized) {\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n          this._dofBlurShader.vertexBuffer = this._quad.vertexBuffer;\n          this._dofBlurShader.indexBuffer = this._quad.indexBuffer;\n          this._dofBlurShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._dofBlurShader.texture2D2 = this._positionTexture;\n          this._dofBlurShader.prepare();\n          this._dofBlurShader.focusDepth = this._config.dofFocusDistance;\n          this._dofBlurShader.nearFocusDepth = this._config.dofFocusDistance - this._config.dofFocusRange / 2;\n          this._dofBlurShader.farFocusDepth = this._config.dofFocusDistance + this._config.dofFocusRange / 2;\n          this._dofBlurShader.maxBackgroundBlur = this._config.dofMaxBackgroundBlur;\n          this._dofBlurShader.left = viewport.left;\n          this._dofBlurShader.top = viewport.top;\n          this._dofBlurShader.width = viewport.width;\n          this._dofBlurShader.height = viewport.height;\n          this._dofBlurShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n          this._dofCombineShader.vertexBuffer = this._quad.vertexBuffer;\n          this._dofCombineShader.indexBuffer = this._quad.indexBuffer;\n          this._dofCombineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._dofCombineShader.texture2D2 = this._postProcessDofTexture;\n          this._dofCombineShader.prepare();\n          this._dofCombineShader.focusDepth = this._config.dofFocusDistance;\n          this._dofCombineShader.left = viewport.left;\n          this._dofCombineShader.top = viewport.top;\n          this._dofCombineShader.width = viewport.width;\n          this._dofCombineShader.height = viewport.height;\n          this._dofCombineShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this._config.isBloomEnabled && this._brightPassShader.isInitialized && this._gaussianShader.isInitialized) {\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthHalf;\n          this._brightPassShader.height = heightHalf;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessHalfTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthQuarter;\n          this._brightPassShader.height = heightQuarter;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessQuarterTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthEighth;\n          this._brightPassShader.height = heightEighth;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessEighthTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthSixteenth;\n          this._brightPassShader.height = heightSixteenth;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessHalfTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthHalf;\n          this._gaussianShader.height = heightHalf;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessHalfTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessQuarterTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthQuarter;\n          this._gaussianShader.height = heightQuarter;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessQuarterTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessEighthTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthEighth;\n          this._gaussianShader.height = heightEighth;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessEighthTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessSixteenthTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthSixteenth;\n          this._gaussianShader.height = heightSixteenth;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessSixteenthTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this._config.isFxaaEnabled && this._fxaaShader.isInitialized) {\n          postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n          this._fxaaShader.vertexBuffer = this._quad.vertexBuffer;\n          this._fxaaShader.indexBuffer = this._quad.indexBuffer;\n          this._fxaaShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._fxaaShader.prepare();\n          this._fxaaShader.left = viewport.left;\n          this._fxaaShader.top = viewport.top;\n          this._fxaaShader.width = viewport.width;\n          this._fxaaShader.height = viewport.height;\n          this._fxaaShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        this._shaderResources.bindFramebuffer(null);\n        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n        this._combineShader.vertexBuffer = this._quad.vertexBuffer;\n        this._combineShader.indexBuffer = this._quad.indexBuffer;\n        this._combineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n        if (this._config.isBloomEnabled) {\n          this._combineShader.texture2D2 = this._postProcessHalfTexture1;\n          this._combineShader.texture2D3 = this._postProcessQuarterTexture1;\n          this._combineShader.texture2D4 = this._postProcessEighthTexture1;\n          this._combineShader.texture2D5 = this._postProcessSixteenthTexture1;\n        } else {\n          this._combineShader.texture2D2 = null;\n          this._combineShader.texture2D3 = null;\n          this._combineShader.texture2D4 = null;\n          this._combineShader.texture2D5 = null;\n        }\n        this._combineShader.prepare();\n        this._combineShader.viewport = viewport;\n        this._combineShader.intensity = this._config.bloomIntensity;\n        this._combineShader.apply();\n        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n      }\n    }\n  }\n  (function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  });\n  class MaterialBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * MaterialBufferData.SIZE);\n      this.TYPE_OFFSET = 0 / 4;\n      this.FUZZ_OFFSET = 4 / 4;\n      this.REFRACTIVE_INDEX_OFFSET = 8 / 4;\n      this.TEXTURE_ID_OFFSET = 12 / 4;\n      this.COLOR_OFFSET = 16 / 4;\n      this.GLOSSINESS_OFFSET = 28 / 4;\n      this.ID_COLOR_OFFSET = 32 / 4;\n      this.DENSITY_OFFSET = 48 / 4;\n    }\n    getType(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getFuzz(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.FUZZ_OFFSET];\n    }\n    setFuzz(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.FUZZ_OFFSET] = value2;\n    }\n    getRefractiveIndex(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.REFRACTIVE_INDEX_OFFSET];\n    }\n    setRefractiveIndex(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.REFRACTIVE_INDEX_OFFSET] = value2;\n    }\n    getTextureId(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.TEXTURE_ID_OFFSET];\n    }\n    setTextureId(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.TEXTURE_ID_OFFSET] = value2;\n    }\n    getColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getGlossiness(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.GLOSSINESS_OFFSET];\n    }\n    setGlossiness(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.GLOSSINESS_OFFSET] = value2;\n    }\n    getDensity(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.DENSITY_OFFSET];\n    }\n    setDensity(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.DENSITY_OFFSET] = value2;\n    }\n    getIdColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.ID_COLOR_OFFSET;\n      set$7(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setIdColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.ID_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  MaterialBufferData.SIZE = 64 / 4;\n  class TextureBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * TextureBufferData.SIZE);\n      this.COLOR0_OFFSET = 0 / 4;\n      this.TYPE_OFFSET = 12 / 4;\n      this.COLOR1_OFFSET = 16 / 4;\n      this.SIZE0_OFFSET = 32 / 4;\n      this.SIZE1_OFFSET = 48 / 4;\n      this.CLIP_OFFSET = 64 / 4;\n      this.OFFSET_OFFSET = 80 / 4;\n    }\n    getType(index2) {\n      return this[TextureBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[TextureBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getColor0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR0_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getColor1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR1_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      set$7(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setSize0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getSize1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      set$7(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setSize1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getClip(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.CLIP_OFFSET;\n      set$7(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setClip(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.CLIP_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getOffset(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.OFFSET_OFFSET;\n      set$5(value2, this[offset2], this[offset2 + 1]);\n    }\n    setOffset(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.OFFSET_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n  }\n  TextureBufferData.SIZE = 96 / 4;\n  class HittableBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * HittableBufferData.SIZE);\n      this.CENTER0_OFFSET = 0 / 4;\n      this.TYPE_OFFSET = 12 / 4;\n      this.SIZE0_OFFSET = 16 / 4;\n      this.MATERIAL_ID_OFFSET = 28 / 4;\n      this.ROTATION0_OFFSET = 32 / 4;\n      this.ROTATION1_OFFSET = 48 / 4;\n      this.TEXCOORD0_OFFSET = 64 / 4;\n      this.TEXCOORD1_OFFSET = 72 / 4;\n      this.CENTER1_OFFSET = 80 / 4;\n      this.ROUNDING_OFFSET = 92 / 4;\n      this.SIZE1_OFFSET = 96 / 4;\n      this.BOUNDARY_TYPE_OFFSET = 108 / 4;\n      this.TIME0_OFFSET = 112 / 4;\n      this.TIME1_OFFSET = 116 / 4;\n      this.TEX_ID_OFFSET = 120 / 4;\n      this.SDF_BUFFER_OFFSET = 124 / 4;\n      this.SDF_BORDER_OFFSET = 128 / 4;\n      this.PARAMETER_1_OFFSET = 132 / 4;\n      this.PARAMETER_2_OFFSET = 136 / 4;\n      this.MATERIAL_FUZZ_OFFSET = 140 / 4;\n      this.MATERIAL_GLOSS_OFFSET = 144 / 4;\n      this.MATERIAL_DENSITY_OFFSET = 148 / 4;\n      this.MATERIAL_REFRACTIVE_INDEX_OFFSET = 152 / 4;\n      this.MATERIAL_COLOR_OFFSET = 160 / 4;\n      this.MATERIAL_TYPE_ID_OFFSET = 172 / 4;\n      this.SEGMENT_COLOR_OFFSET = 176 / 4;\n      this.TEXTURE_TYPE_ID_OFFSET = 192 / 4;\n      this.TEXTURE_ID_OFFSET = 196 / 4;\n    }\n    getType(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getCenter0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER0_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getCenter1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER1_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getTime0(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TIME0_OFFSET];\n    }\n    setTime0(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TIME0_OFFSET] = value2;\n    }\n    getTime1(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TIME1_OFFSET];\n    }\n    setTime1(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TIME1_OFFSET] = value2;\n    }\n    getSize0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getRotation0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION0_OFFSET;\n      set$6(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getRotation1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION1_OFFSET;\n      set$6(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getTexCoord0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD0_OFFSET;\n      set$5(value2, this[offset2], this[offset2 + 1]);\n    }\n    setTexCoord0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n    getTexCoord1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD1_OFFSET;\n      set$5(value2, this[offset2], this[offset2 + 1]);\n    }\n    setTexCoord1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n    getRounding(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.ROUNDING_OFFSET];\n    }\n    setRounding(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.ROUNDING_OFFSET] = value2;\n    }\n    getParameter1(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.PARAMETER_1_OFFSET];\n    }\n    setParameter1(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.PARAMETER_1_OFFSET] = value2;\n    }\n    getParameter2(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.PARAMETER_2_OFFSET];\n    }\n    setParameter2(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.PARAMETER_2_OFFSET] = value2;\n    }\n    getBoundaryType(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.BOUNDARY_TYPE_OFFSET];\n    }\n    setBoundaryType(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.BOUNDARY_TYPE_OFFSET] = value2;\n    }\n    getTexId(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TEX_ID_OFFSET];\n    }\n    setTexId(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TEX_ID_OFFSET] = value2;\n    }\n    getSdfBuffer(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.SDF_BUFFER_OFFSET];\n    }\n    setSdfBuffer(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.SDF_BUFFER_OFFSET] = value2;\n    }\n    getSdfBorder(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.SDF_BORDER_OFFSET];\n    }\n    setSdfBorder(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.SDF_BORDER_OFFSET] = value2;\n    }\n    getMaterialTypeId(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_TYPE_ID_OFFSET];\n    }\n    setMaterialTypeId(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_TYPE_ID_OFFSET] = value2;\n    }\n    getMaterialFuzz(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_FUZZ_OFFSET];\n    }\n    setMaterialFuzz(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_FUZZ_OFFSET] = value2;\n    }\n    getMaterialDensity(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_DENSITY_OFFSET];\n    }\n    setMaterialDensity(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_DENSITY_OFFSET] = value2;\n    }\n    getMaterialGloss(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_GLOSS_OFFSET];\n    }\n    setMaterialGloss(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_GLOSS_OFFSET] = value2;\n    }\n    getMaterialRefractiveIndex(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_REFRACTIVE_INDEX_OFFSET];\n    }\n    setMaterialRefractiveIndex(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_REFRACTIVE_INDEX_OFFSET] = value2;\n    }\n    getMaterialColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.MATERIAL_COLOR_OFFSET;\n      value2[0] = this[offset2];\n      value2[1] = this[offset2 + 1];\n      value2[2] = this[offset2 + 2];\n    }\n    setMaterialColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.MATERIAL_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSegmentColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SEGMENT_COLOR_OFFSET;\n      value2[0] = this[offset2];\n      value2[1] = this[offset2 + 1];\n      value2[2] = this[offset2 + 2];\n      value2[3] = this[offset2 + 3];\n    }\n    setSegmentColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SEGMENT_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  HittableBufferData.SIZE = 208 / 4;\n  class ComputeUniformBufferData extends Float32Array {\n    constructor() {\n      super(ComputeUniformBufferData.SIZE);\n      this.POSITION_OFFSET = 0 / 4;\n      this.WIDTH_OFFSET = 12 / 4;\n      this.RIGHT_OFFSET = 16 / 4;\n      this.HEIGHT_OFFSET = 28 / 4;\n      this.UP_OFFSET = 32 / 4;\n      this.SEED_OFFSET = 44 / 4;\n      this.FORWARD_OFFSET = 48 / 4;\n      this.FOV_OFFSET = 60 / 4;\n      this.BACKGROUND_COLOR_OFFSET = 64 / 4;\n      this.TIME0_OFFSET = 76 / 4;\n      this.AMBIENT_COLOR_OFFSET = 80 / 4;\n      this.TIME1_OFFSET = 92 / 4;\n      this.TILES_X = 96 / 4;\n      this.TILES_Y = 100 / 4;\n      this.TILE_OFFSET_X = 104 / 4;\n      this.TILE_OFFSET_Y = 108 / 4;\n      this.LOOKAT_OFFSET = 112 / 4;\n      this.APERTURE_OFFSET = 124 / 4;\n      this.FOCUS_DISTANCE_OFFSET = 128 / 4;\n      this.RAYS_PER_FRAME_OFFSET = 132 / 4;\n    }\n    getFocusDistance() {\n      return this[this.FOCUS_DISTANCE_OFFSET];\n    }\n    setFocusDistance(value2) {\n      this[this.FOCUS_DISTANCE_OFFSET] = value2;\n    }\n    getWidth() {\n      return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value2) {\n      this[this.WIDTH_OFFSET] = value2;\n    }\n    getHeight() {\n      return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value2) {\n      this[this.HEIGHT_OFFSET] = value2;\n    }\n    getSeed() {\n      return this[this.SEED_OFFSET];\n    }\n    setSeed(value2) {\n      this[this.SEED_OFFSET] = value2;\n    }\n    getRaysPerFrame() {\n      return this[this.RAYS_PER_FRAME_OFFSET];\n    }\n    setRaysPerFrame(value2) {\n      this[this.RAYS_PER_FRAME_OFFSET] = value2;\n    }\n    getFieldOfView() {\n      return this[this.FOV_OFFSET];\n    }\n    setFieldOfView(value2) {\n      this[this.FOV_OFFSET] = value2;\n    }\n    getAperture() {\n      return this[this.APERTURE_OFFSET];\n    }\n    setAperture(value2) {\n      this[this.APERTURE_OFFSET] = value2;\n    }\n    getPosition(value2) {\n      set$8(value2, this[this.POSITION_OFFSET], this[this.POSITION_OFFSET + 1], this[this.POSITION_OFFSET + 2]);\n    }\n    setPosition(value2) {\n      this[this.POSITION_OFFSET] = value2[0];\n      this[this.POSITION_OFFSET + 1] = value2[1];\n      this[this.POSITION_OFFSET + 2] = value2[2];\n    }\n    getRight(value2) {\n      set$8(value2, this[this.RIGHT_OFFSET], this[this.RIGHT_OFFSET + 1], this[this.RIGHT_OFFSET + 2]);\n    }\n    setRight(value2) {\n      this[this.RIGHT_OFFSET] = value2[0];\n      this[this.RIGHT_OFFSET + 1] = value2[1];\n      this[this.RIGHT_OFFSET + 2] = value2[2];\n    }\n    getUp(value2) {\n      set$8(value2, this[this.UP_OFFSET], this[this.UP_OFFSET + 1], this[this.UP_OFFSET + 2]);\n    }\n    setUp(value2) {\n      this[this.UP_OFFSET] = value2[0];\n      this[this.UP_OFFSET + 1] = value2[1];\n      this[this.UP_OFFSET + 2] = value2[2];\n    }\n    getForward(value2) {\n      set$8(value2, this[this.FORWARD_OFFSET], this[this.FORWARD_OFFSET + 1], this[this.FORWARD_OFFSET + 2]);\n    }\n    setForward(value2) {\n      this[this.FORWARD_OFFSET] = value2[0];\n      this[this.FORWARD_OFFSET + 1] = value2[1];\n      this[this.FORWARD_OFFSET + 2] = value2[2];\n    }\n    getBackgroundColor(value2) {\n      set$7(value2, this[this.BACKGROUND_COLOR_OFFSET], this[this.BACKGROUND_COLOR_OFFSET + 1], this[this.BACKGROUND_COLOR_OFFSET + 2], this[this.BACKGROUND_COLOR_OFFSET + 3]);\n    }\n    setBackgroundColor(value2) {\n      this[this.BACKGROUND_COLOR_OFFSET] = value2[0];\n      this[this.BACKGROUND_COLOR_OFFSET + 1] = value2[1];\n      this[this.BACKGROUND_COLOR_OFFSET + 2] = value2[2];\n      this[this.BACKGROUND_COLOR_OFFSET + 3] = value2[3];\n    }\n    getAmbientColor(value2) {\n      set$8(value2, this[this.AMBIENT_COLOR_OFFSET], this[this.AMBIENT_COLOR_OFFSET + 1], this[this.AMBIENT_COLOR_OFFSET + 2]);\n    }\n    setAmbientColor(value2) {\n      this[this.AMBIENT_COLOR_OFFSET] = value2[0];\n      this[this.AMBIENT_COLOR_OFFSET + 1] = value2[1];\n      this[this.AMBIENT_COLOR_OFFSET + 2] = value2[2];\n    }\n    getTime0() {\n      return this[this.TIME0_OFFSET];\n    }\n    setTime0(value2) {\n      this[this.TIME0_OFFSET] = value2;\n    }\n    getTime1() {\n      return this[this.TIME1_OFFSET];\n    }\n    setTime1(value2) {\n      this[this.TIME1_OFFSET] = value2;\n    }\n    getTilesX() {\n      return this[this.TILES_X];\n    }\n    setTilesX(value2) {\n      this[this.TILES_X] = value2;\n    }\n    getTilesY() {\n      return this[this.TILES_Y];\n    }\n    setTilesY(value2) {\n      this[this.TILES_Y] = value2;\n    }\n    getTileOffsetX() {\n      return this[this.TILE_OFFSET_X];\n    }\n    setTileOffsetX(value2) {\n      this[this.TILE_OFFSET_X] = value2;\n    }\n    getTileOffsetY() {\n      return this[this.TILE_OFFSET_Y];\n    }\n    setTileOffsetY(value2) {\n      this[this.TILE_OFFSET_Y] = value2;\n    }\n    getLookAt(value2) {\n      set$8(value2, this[this.LOOKAT_OFFSET], this[this.LOOKAT_OFFSET + 1], this[this.LOOKAT_OFFSET + 2]);\n    }\n    setLookAt(value2) {\n      this[this.LOOKAT_OFFSET] = value2[0];\n      this[this.LOOKAT_OFFSET + 1] = value2[1];\n      this[this.LOOKAT_OFFSET + 2] = value2[2];\n    }\n  }\n  ComputeUniformBufferData.SIZE = 144 / 4;\n  class FullscreenQuadUniformBufferData extends Float32Array {\n    constructor() {\n      super(FullscreenQuadUniformBufferData.SIZE);\n      this.WIDTH_OFFSET = 0 / 4;\n      this.HEIGHT_OFFSET = 4 / 4;\n      this.SPP_OFFSET = 8 / 4;\n      this.EXPOSURE_OFFSET = 12 / 4;\n      this.MIN_DEPTH_OFFSET = 16 / 4;\n      this.MAX_DEPTH_OFFSET = 20 / 4;\n      this.EDGE_NORMAL_OFFSET = 24 / 4;\n      this.EDGE_DEPTH_OFFSET = 28 / 4;\n      this.EDGE_FOREGROUND_OFFSET = 32 / 4;\n      this.EDGE_BACKGROUND_OFFSET = 48 / 4;\n    }\n    getWidth() {\n      return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value2) {\n      this[this.WIDTH_OFFSET] = value2;\n    }\n    getHeight() {\n      return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value2) {\n      this[this.HEIGHT_OFFSET] = value2;\n    }\n    getSamplesPerPixel() {\n      return this[this.SPP_OFFSET];\n    }\n    setSamplesPerPixel(value2) {\n      this[this.SPP_OFFSET] = value2;\n    }\n    getExposure() {\n      return this[this.EXPOSURE_OFFSET];\n    }\n    setExposure(value2) {\n      this[this.EXPOSURE_OFFSET] = value2;\n    }\n    getMinDepth() {\n      return this[this.MIN_DEPTH_OFFSET];\n    }\n    setMinDepth(value2) {\n      this[this.MIN_DEPTH_OFFSET] = value2;\n    }\n    getMaxDepth() {\n      return this[this.MAX_DEPTH_OFFSET];\n    }\n    setMaxDepth(value2) {\n      this[this.MAX_DEPTH_OFFSET] = value2;\n    }\n    getEdgeDepth() {\n      return this[this.EDGE_DEPTH_OFFSET];\n    }\n    setEdgeDepth(value2) {\n      this[this.EDGE_DEPTH_OFFSET] = value2;\n    }\n    getEdgeNormal() {\n      return this[this.EDGE_NORMAL_OFFSET];\n    }\n    setEdgeNormal(value2) {\n      this[this.EDGE_NORMAL_OFFSET] = value2;\n    }\n    getEdgeForeground(value2) {\n      set$7(value2, this[this.EDGE_FOREGROUND_OFFSET], this[this.EDGE_FOREGROUND_OFFSET + 1], this[this.EDGE_FOREGROUND_OFFSET + 2], this[this.EDGE_FOREGROUND_OFFSET + 3]);\n    }\n    setEdgeForeground(value2) {\n      this[this.EDGE_FOREGROUND_OFFSET] = value2[0];\n      this[this.EDGE_FOREGROUND_OFFSET + 1] = value2[1];\n      this[this.EDGE_FOREGROUND_OFFSET + 2] = value2[2];\n      this[this.EDGE_FOREGROUND_OFFSET + 3] = value2[3];\n    }\n    getEdgeBackground(value2) {\n      set$7(value2, this[this.EDGE_BACKGROUND_OFFSET], this[this.EDGE_BACKGROUND_OFFSET + 1], this[this.EDGE_BACKGROUND_OFFSET + 2], this[this.EDGE_BACKGROUND_OFFSET + 3]);\n    }\n    setEdgeBackground(value2) {\n      this[this.EDGE_BACKGROUND_OFFSET] = value2[0];\n      this[this.EDGE_BACKGROUND_OFFSET + 1] = value2[1];\n      this[this.EDGE_BACKGROUND_OFFSET + 2] = value2[2];\n      this[this.EDGE_BACKGROUND_OFFSET + 3] = value2[3];\n    }\n  }\n  FullscreenQuadUniformBufferData.SIZE = 64 / 4;\n  class LinearBVHNodeBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * LinearBVHNodeBufferData.SIZE);\n      this.CENTER_OFFSET = 0 / 4;\n      this.SIZE_OFFSET = 16 / 4;\n      this.PRIMITIVES_OFFSET_OFFSET = 12 / 4;\n      this.SECOND_CHILD_OFFSET_OFFSET = 28 / 4;\n      this.N_PRIMITIVES_OFFSET = 32 / 4;\n      this.AXIS_OFFSET = 36 / 4;\n    }\n    getCenter(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getPrimitivesOffset(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.PRIMITIVES_OFFSET_OFFSET];\n    }\n    setPrimitivesOffset(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.PRIMITIVES_OFFSET_OFFSET] = value2;\n    }\n    getSecondChildOffset(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.SECOND_CHILD_OFFSET_OFFSET];\n    }\n    setSecondChildOffset(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.SECOND_CHILD_OFFSET_OFFSET] = value2;\n    }\n    getNPrimitives(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.N_PRIMITIVES_OFFSET];\n    }\n    setNPrimitives(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.N_PRIMITIVES_OFFSET] = value2;\n    }\n    getAxis(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.AXIS_OFFSET];\n    }\n    setAxis(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.AXIS_OFFSET] = value2;\n    }\n  }\n  LinearBVHNodeBufferData.SIZE = 48 / 4;\n  class LightBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * LightBufferData.SIZE);\n      this.ROTATION_OFFSET = 0 / 4;\n      this.CENTER_OFFSET = 16 / 4;\n      this.TYPE_OFFSET = 28 / 4;\n      this.SIZE_OFFSET = 32 / 4;\n      this.COLOR_OFFSET = 48 / 4;\n    }\n    getType(index2) {\n      return this[LightBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[LightBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getCenter(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getColor(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      set$8(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getRotation(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.ROTATION_OFFSET;\n      set$6(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.ROTATION_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  LightBufferData.SIZE = 64 / 4;\n  (function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  });\n  const types = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    MorphChartsCore: Core\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function concat(...args) {\n    return args.reduce((p, c2) => c2 ? p.concat(c2) : p, []);\n  }\n  function allTruthy(...args) {\n    return args.reduce((p, c2) => c2 ? p.concat(c2) : p, []).filter(Boolean);\n  }\n  function push$1(arr, items) {\n    arr.push.apply(arr, items);\n  }\n  function addEl(tagName, parentElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n  }\n  function addDiv(parentElement, className2) {\n    const div = addEl(\"div\", parentElement);\n    if (className2) {\n      div.className = className2;\n    }\n    return div;\n  }\n  function outerSize$1(el) {\n    const cs = getComputedStyle(el);\n    const height2 = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width2 = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return { height: height2, width: width2 };\n  }\n  var isMergeableObject = function isMergeableObject2(value2) {\n    return isNonNullObject(value2) && !isSpecial(value2);\n  };\n  function isNonNullObject(value2) {\n    return !!value2 && typeof value2 === \"object\";\n  }\n  function isSpecial(value2) {\n    var stringValue = Object.prototype.toString.call(value2);\n    return stringValue === \"[object RegExp]\" || stringValue === \"[object Date]\" || isReactElement(value2);\n  }\n  var canUseSymbol = typeof Symbol === \"function\" && Symbol.for;\n  var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for(\"react.element\") : 60103;\n  function isReactElement(value2) {\n    return value2.$$typeof === REACT_ELEMENT_TYPE;\n  }\n  function emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n  }\n  function cloneUnlessOtherwiseSpecified(value2, options2) {\n    return options2.clone !== false && options2.isMergeableObject(value2) ? deepmerge$1(emptyTarget(value2), value2, options2) : value2;\n  }\n  function defaultArrayMerge(target2, source2, options2) {\n    return target2.concat(source2).map(function(element2) {\n      return cloneUnlessOtherwiseSpecified(element2, options2);\n    });\n  }\n  function mergeObject(target2, source2, options2) {\n    var destination = {};\n    if (options2.isMergeableObject(target2)) {\n      Object.keys(target2).forEach(function(key2) {\n        destination[key2] = cloneUnlessOtherwiseSpecified(target2[key2], options2);\n      });\n    }\n    Object.keys(source2).forEach(function(key2) {\n      if (!options2.isMergeableObject(source2[key2]) || !target2[key2]) {\n        destination[key2] = cloneUnlessOtherwiseSpecified(source2[key2], options2);\n      } else {\n        destination[key2] = deepmerge$1(target2[key2], source2[key2], options2);\n      }\n    });\n    return destination;\n  }\n  function deepmerge$1(target2, source2, options2) {\n    options2 = options2 || {};\n    options2.arrayMerge = options2.arrayMerge || defaultArrayMerge;\n    options2.isMergeableObject = options2.isMergeableObject || isMergeableObject;\n    var sourceIsArray = Array.isArray(source2);\n    var targetIsArray = Array.isArray(target2);\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n    if (!sourceAndTargetTypesMatch) {\n      return cloneUnlessOtherwiseSpecified(source2, options2);\n    } else if (sourceIsArray) {\n      return options2.arrayMerge(target2, source2, options2);\n    } else {\n      return mergeObject(target2, source2, options2);\n    }\n  }\n  deepmerge$1.all = function deepmergeAll(array2, options2) {\n    if (!Array.isArray(array2)) {\n      throw new Error(\"first argument should be an array\");\n    }\n    return array2.reduce(function(prev, next) {\n      return deepmerge$1(prev, next, options2);\n    }, {});\n  };\n  var deepmerge_1 = deepmerge$1;\n  const _deepmerge = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    default: deepmerge_1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function isObject$1(o) {\n    return Object.prototype.toString.call(o) === \"[object Object]\";\n  }\n  function isPlainObject(o) {\n    var ctor, prot;\n    if (isObject$1(o) === false) return false;\n    ctor = o.constructor;\n    if (ctor === void 0) return true;\n    prot = ctor.prototype;\n    if (isObject$1(prot) === false) return false;\n    if (prot.hasOwnProperty(\"isPrototypeOf\") === false) {\n      return false;\n    }\n    return true;\n  }\n  const deepmerge = deepmerge_1 || _deepmerge;\n  function clone(objectToClone) {\n    if (!objectToClone)\n      return objectToClone;\n    return deepmerge.all([objectToClone]);\n  }\n  const dontMerge = (destination, source2) => source2;\n  function deepMerge(...objectsToMerge) {\n    const objects = objectsToMerge.filter(Boolean);\n    return deepmerge.all(objects, { arrayMerge: dontMerge, isMergeableObject: isPlainObject });\n  }\n  function rgbToDeckglColor(c2) {\n    return [c2.r, c2.g, c2.b, c2.opacity * 255];\n  }\n  function colorIsEqual(a2, b2) {\n    if (a2.length !== b2.length)\n      return false;\n    for (let i = 0; i < a2.length; i++) {\n      if (a2[i] !== b2[i])\n        return false;\n    }\n    return true;\n  }\n  function colorFromString(cssColorSpecifier) {\n    if (cssColorSpecifier) {\n      const dc = color$2(cssColorSpecifier);\n      if (dc) {\n        const c2 = dc.rgb();\n        return rgbToDeckglColor(c2);\n      }\n    }\n  }\n  function colorToString(color2) {\n    const c2 = [...color2];\n    if (c2.length > 3) {\n      c2[3] /= 255;\n    }\n    return `rgba(${c2.join(\",\")})`;\n  }\n  function desaturate(color2, value2) {\n    const rgb2 = rgb$1(color2[0], color2[1], color2[2], color2[3] / 255);\n    const hslColor = hsl$1(rgb2);\n    hslColor.s = value2;\n    const c2 = hslColor.rgb();\n    return rgbToDeckglColor(c2);\n  }\n  const util$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    addDiv,\n    addEl,\n    allTruthy,\n    clone,\n    colorFromString,\n    colorIsEqual,\n    colorToString,\n    concat,\n    createElement,\n    deepMerge,\n    desaturate,\n    getActiveElementInfo,\n    mount,\n    outerSize: outerSize$1,\n    push: push$1,\n    setActiveElement\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const minHeight = \"100px\";\n  const minWidth = \"100px\";\n  const defaultPresenterStyle$1 = {\n    cssPrefix: \"vega-morphcharts-\",\n    defaultCubeColor: [128, 128, 128, 255],\n    highlightColor: [0, 0, 0, 255]\n  };\n  const defaultPresenterConfig = {\n    onCubeClick: (e, cube) => {\n    },\n    onCubeHover: (e, cube) => {\n    },\n    transitionDurations: {\n      position: 600,\n      stagger: 600,\n      view: 600\n    },\n    renderer: {\n      advanced: false,\n      advancedOptions: {},\n      basicOptions: {\n        antialias: true\n      }\n    }\n  };\n  function createStage(view) {\n    const stage = {\n      view,\n      cubeData: [],\n      pathData: [],\n      axes: {\n        x: [],\n        y: [],\n        z: []\n      },\n      gridLines: [],\n      textData: [],\n      legend: {\n        rows: {}\n      },\n      facets: []\n    };\n    return stage;\n  }\n  const groupStrokeWidth = 1;\n  const lineZ = 0;\n  const defaultView$1 = \"2d\";\n  const minZ = 0.5;\n  const min3dDepth = 0.05;\n  const minPixelSize = 0.5;\n  const zAxisEncodeColor = [7, 7, 7, 255];\n  const zAxisOutColor = [0, 0, 0, 255];\n  function defaultOnAxisItem(vegaItem, stageItem, stage, currAxis) {\n    if (colorIsEqual(stageItem.color, zAxisEncodeColor)) {\n      stageItem.color = zAxisOutColor;\n      if (currAxis.axisRole !== \"z\") {\n        const previousAxisRole = removeCurrentAxes(stage, currAxis);\n        if (previousAxisRole) {\n          currAxis.axisRole = \"z\";\n          stage.axes.z.push(currAxis);\n        }\n      }\n    }\n  }\n  function removeCurrentAxes(stage, currAxis) {\n    for (const axisRole in stage.axes) {\n      const axes = stage.axes[axisRole];\n      for (let i = 0; i < axes.length; i++) {\n        if (axes[i] === currAxis) {\n          axes.splice(i, 1);\n          return axisRole;\n        }\n      }\n    }\n  }\n  const defaults$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    createStage,\n    defaultOnAxisItem,\n    defaultPresenterConfig,\n    defaultPresenterStyle: defaultPresenterStyle$1,\n    defaultView: defaultView$1,\n    groupStrokeWidth,\n    lineZ,\n    min3dDepth,\n    minHeight,\n    minPixelSize,\n    minWidth,\n    minZ\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const vega$1 = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null\n  };\n  const base$3 = {\n    vega: vega$1\n  };\n  function use$5(vega2) {\n    base$3.vega = vega2;\n  }\n  var PresenterElement$1;\n  (function(PresenterElement2) {\n    PresenterElement2[PresenterElement2[\"root\"] = 0] = \"root\";\n    PresenterElement2[PresenterElement2[\"gl\"] = 1] = \"gl\";\n    PresenterElement2[PresenterElement2[\"panel\"] = 2] = \"panel\";\n    PresenterElement2[PresenterElement2[\"legend\"] = 3] = \"legend\";\n    PresenterElement2[PresenterElement2[\"vegaControls\"] = 4] = \"vegaControls\";\n  })(PresenterElement$1 || (PresenterElement$1 = {}));\n  const LegendView = (props) => {\n    const rows = [];\n    const addRow = (row, i) => {\n      const fn2 = symbolMap[row.symbol.shape];\n      let jsx;\n      if (fn2) {\n        jsx = fn2(row.symbol);\n      } else {\n        jsx = createElement(\"span\", null, \"x\");\n      }\n      rows.push({\n        cells: [\n          { className: \"symbol\", content: jsx },\n          { className: \"label\", content: row.label, title: row.label }\n        ]\n      });\n    };\n    const sorted = Object.keys(props.legend.rows).sort((a2, b2) => +a2 - +b2);\n    sorted.forEach((i) => addRow(props.legend.rows[i]));\n    if (sorted.length) {\n      return createElement(Table$1, { rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\n        \"tr\",\n        { onClick: (e) => props.onClick(e, props.legend, null) },\n        createElement(\"th\", { colSpan: 2 }, props.legend.title)\n      ));\n    }\n  };\n  const symbolMap = {\n    square: function(symbol2) {\n      return createElement(\"div\", { style: {\n        height: `${symbol2.bounds.y2 - symbol2.bounds.y1}px`,\n        width: `${symbol2.bounds.x2 - symbol2.bounds.x1}px`,\n        backgroundColor: symbol2.fill,\n        borderColor: symbol2.fill\n      } });\n    }\n  };\n  function initializePanel(presenter) {\n    const rootDiv = createElement(\n      \"div\",\n      { className: className$1(PresenterElement$1.root, presenter) },\n      createElement(\"div\", { className: className$1(PresenterElement$1.gl, presenter), style: { minHeight, minWidth } }),\n      createElement(\n        \"div\",\n        { className: className$1(PresenterElement$1.panel, presenter) },\n        createElement(\"div\", { className: className$1(PresenterElement$1.vegaControls, presenter) }),\n        createElement(\"div\", { className: className$1(PresenterElement$1.legend, presenter) })\n      )\n    );\n    mount(rootDiv, presenter.el);\n  }\n  function className$1(type2, presenter) {\n    return `${presenter.style.cssPrefix}${PresenterElement$1[type2]}`;\n  }\n  function patchCubeArray(allocatedSize, empty, cubes) {\n    const patched = new Array(allocatedSize);\n    patched.fill(empty);\n    cubes.forEach((cube) => patched[cube.ordinal] = cube);\n    return patched;\n  }\n  const legendMap = {\n    \"legend-title\": function(legend2, textItem) {\n      legend2.title = textItem.text;\n    },\n    \"legend-symbol\": function(legend2, symbol2) {\n      const { bounds: bounds2, fill: fill2, shape: shape2 } = symbol2;\n      const legendRowSymbol = { bounds: bounds2, fill: fill2, shape: shape2 };\n      const i = symbol2.datum.index;\n      legend2.rows[i] = legend2.rows[i] || {};\n      legend2.rows[i].symbol = legendRowSymbol;\n    },\n    \"legend-label\": function(legend2, label2) {\n      const i = label2.datum.index;\n      legend2.rows[i] = legend2.rows[i] || {};\n      const row = legend2.rows[i];\n      row.label = label2.text;\n      row.value = label2.datum.value;\n    }\n  };\n  const markStager$5 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(item) {\n      const fn2 = legendMap[item.mark.role];\n      if (fn2) {\n        fn2(stage.legend, item);\n      }\n    });\n  };\n  const markStager$4 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(item) {\n      const { bounds: bounds2, height: height2, url, width: width2 } = item;\n      let { x1: x12, x2: x22, y1: y12, y2: y22 } = bounds2;\n      x12 += x2;\n      x22 += x2;\n      y12 += y2;\n      y22 += y2;\n      if (!stage.backgroundImages) {\n        stage.backgroundImages = [];\n      }\n      stage.backgroundImages.push({ bounds: { x1: x12, x2: x22, y1: y12, y2: y22 }, height: height2, url, width: width2 });\n    });\n  };\n  const markStager$3 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(item) {\n      const noZ = item.z === void 0;\n      const z2 = noZ ? 0 : (item.z || 0) + minZ;\n      const depth = (noZ ? 0 : item.depth || 0) + min3dDepth;\n      const ty2 = -1;\n      const ordinal2 = options2.assignCubeOrdinal(item.datum);\n      if (ordinal2 > options2.maxOrdinal) {\n        options2.maxOrdinal = ordinal2;\n      }\n      if (ordinal2 === void 0) ;\n      else {\n        const cube = {\n          ordinal: ordinal2,\n          size: [item.width, item.height, depth],\n          position: [x2 + (+item.x || 0), ty2 * (y2 + (+item.y || 0)) - +item.height, z2],\n          color: colorFromString(item.fill) || options2.defaultCubeColor || [128, 128, 128, 128]\n        };\n        cube.color[3] = item.opacity === void 0 ? 255 : 255 * item.opacity;\n        stage.cubeData.push(cube);\n      }\n    });\n  };\n  const markStager$2 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(item) {\n      const x12 = item.x || 0;\n      const y12 = item.y || 0;\n      const x22 = item.x2 != null ? item.x2 : x12;\n      const y22 = item.y2 != null ? item.y2 : y12;\n      const lineItem = styledLine(x12 + x2, y12 + y2, x22 + x2, y22 + y2, item.stroke, item.strokeWidth);\n      const { currAxis } = options2;\n      if (options2.modifyAxis) {\n        options2.modifyAxis(item, lineItem, stage, currAxis);\n      }\n      if (item.mark.role === \"axis-tick\") {\n        currAxis.ticks.push(lineItem);\n      } else if (item.mark.role === \"axis-domain\") {\n        currAxis.domain = lineItem;\n      } else {\n        stage.gridLines.push(lineItem);\n      }\n    });\n  };\n  function styledLine(x12, y12, x2, y2, stroke2, strokeWidth) {\n    const line2 = {\n      sourcePosition: [x12, -y12, lineZ],\n      //-1 = change direction of y from SVG to GL\n      targetPosition: [x2, -y2, lineZ],\n      color: colorFromString(stroke2),\n      strokeWidth\n    };\n    return line2;\n  }\n  function box(gx, gy, height2, width2, stroke2, strokeWidth, diagonals = false) {\n    const lines = [\n      styledLine(gx, gy, gx + width2, gy, stroke2, strokeWidth),\n      styledLine(gx + width2, gy, gx + width2, gy + height2, stroke2, strokeWidth),\n      styledLine(gx + width2, gy + height2, gx, gy + height2, stroke2, strokeWidth),\n      styledLine(gx, gy + height2, gx, gy, stroke2, strokeWidth)\n    ];\n    if (diagonals) {\n      lines.push(styledLine(gx, gy, gx + width2, gy + height2, stroke2, strokeWidth));\n      lines.push(styledLine(gx, gy + height2, gx + width2, gy, stroke2, strokeWidth));\n    }\n    return lines;\n  }\n  const ty = -1;\n  const markStager$1 = (options2, stage, scene, x2, y2, groupType) => {\n    const g = Object.assign({ opacity: 1, strokeOpacity: 1, strokeWidth: 1 }, scene.items[0]);\n    const path2 = {\n      strokeWidth: g.strokeWidth,\n      strokeColor: colorFromString(g.stroke),\n      positions: scene.items.map((it) => [\n        it.x,\n        ty * it.y,\n        it.z || 0\n      ])\n    };\n    path2.strokeColor[3] *= g.strokeOpacity;\n    path2.strokeColor[3] *= g.opacity;\n    stage.pathData.push(path2);\n  };\n  const markStager = (options2, stage, scene, x2, y2, groupType) => {\n    const ty2 = -1;\n    base$3.vega.sceneVisit(scene, function(item) {\n      if (!item.text)\n        return;\n      const size = item.fontSize;\n      const yOffset = 0;\n      const textItem = {\n        color: colorFromString(item.fill),\n        text: item.limit === void 0 ? item.text : base$3.vega.truncate(item.text, item.limit, \"right\", item.ellipsis || \"...\"),\n        //use dots instead of unicode ellipsis for\n        position: [x2 + (item.x || 0), ty2 * (y2 + (item.y || 0) + yOffset), 0],\n        size,\n        angle: convertAngle(item.angle),\n        //textAnchor: convertAlignment(item.align),\n        //alignmentBaseline,\n        metaData: item.metaData\n      };\n      const { currAxis } = options2;\n      if (options2.modifyAxis) {\n        options2.modifyAxis(item, textItem, stage, currAxis);\n      }\n      if (item.mark.role === \"axis-label\") {\n        const tickText = textItem;\n        tickText.value = item.datum.value;\n        currAxis.tickText.push(tickText);\n      } else if (item.mark.role === \"axis-title\") {\n        currAxis.title = textItem;\n      } else {\n        stage.textData.push(textItem);\n      }\n    });\n  };\n  function convertAngle(vegaTextAngle) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n      return 360 - vegaTextAngle;\n    }\n    return 0;\n  }\n  var GroupType;\n  (function(GroupType2) {\n    GroupType2[GroupType2[\"none\"] = 0] = \"none\";\n    GroupType2[GroupType2[\"legend\"] = 1] = \"legend\";\n    GroupType2[GroupType2[\"xAxis\"] = 2] = \"xAxis\";\n    GroupType2[GroupType2[\"yAxis\"] = 3] = \"yAxis\";\n    GroupType2[GroupType2[\"zAxis\"] = 4] = \"zAxis\";\n  })(GroupType || (GroupType = {}));\n  function getAxisGroupType(item, options2) {\n    const axisItem = item;\n    const axisMark = axisItem === null || axisItem === void 0 ? void 0 : axisItem.mark;\n    if ((axisMark === null || axisMark === void 0 ? void 0 : axisMark.zindex) === options2.zAxisZindex && options2.zAxisZindex !== void 0) {\n      return GroupType.zAxis;\n    }\n    switch (axisItem.orient) {\n      case \"bottom\":\n      case \"top\":\n        return GroupType.xAxis;\n      case \"left\":\n      case \"right\":\n        return GroupType.yAxis;\n    }\n  }\n  function convertGroupRole(item, options2) {\n    if (item.mark.role === \"legend\")\n      return GroupType.legend;\n    if (item.mark.role === \"axis\") {\n      const groupType = getAxisGroupType(item, options2);\n      if (groupType !== void 0) {\n        return groupType;\n      }\n    }\n  }\n  const group$1 = (options2, stage, scene, x2, y2, groupType) => {\n    base$3.vega.sceneVisit(scene, function(g) {\n      const gx = g.x || 0, gy = g.y || 0;\n      if (g.context && g.context.background && !stage.backgroundColor) {\n        stage.backgroundColor = colorFromString(g.context.background);\n      }\n      if (g.stroke) {\n        const facetRect = {\n          datum: g.datum,\n          lines: box(gx + x2, gy + y2, g.height, g.width, g.stroke, groupStrokeWidth)\n        };\n        stage.facets.push(facetRect);\n      }\n      groupType = convertGroupRole(g, options2) || groupType;\n      setCurrentAxis(options2, stage, groupType);\n      base$3.vega.sceneVisit(g, function(item) {\n        mainStager(options2, stage, item, gx + x2, gy + y2, groupType);\n      });\n    });\n  };\n  function setCurrentAxis(options2, stage, groupType) {\n    let axisRole;\n    switch (groupType) {\n      case GroupType.xAxis:\n        axisRole = \"x\";\n        break;\n      case GroupType.yAxis:\n        axisRole = \"y\";\n        break;\n      case GroupType.zAxis:\n        axisRole = \"z\";\n        break;\n      default:\n        return;\n    }\n    options2.currAxis = {\n      axisRole,\n      domain: null,\n      tickText: [],\n      ticks: []\n    };\n    stage.axes[axisRole].push(options2.currAxis);\n  }\n  const markStagers = {\n    group: group$1,\n    legend: markStager$5,\n    image: markStager$4,\n    rect: markStager$3,\n    rule: markStager$2,\n    line: markStager$1,\n    text: markStager\n  };\n  const mainStager = (options2, stage, scene, x2, y2, groupType) => {\n    if (scene.marktype !== \"group\" && groupType === GroupType.legend) {\n      markStager$5(options2, stage, scene);\n    } else {\n      const markStager2 = markStagers[scene.marktype];\n      if (markStager2) {\n        markStager2(options2, stage, scene, x2, y2, groupType);\n      }\n    }\n  };\n  function sceneToStage(options2, stage, scene) {\n    mainStager(options2, stage, scene, 0, 0, null);\n    sortAxis(stage.axes.x, 0);\n    sortAxis(stage.axes.y, 1);\n    sortAxis(stage.axes.z, 1);\n  }\n  function sortAxis(axes, dim) {\n    axes.forEach((axis) => {\n      if (axis.domain)\n        orderDomain(axis.domain, dim);\n      axis.ticks.sort((a2, b2) => a2.sourcePosition[dim] - b2.sourcePosition[dim]);\n      axis.tickText.sort((a2, b2) => a2.position[dim] - b2.position[dim]);\n    });\n  }\n  function orderDomain(domain2, dim) {\n    if (domain2.sourcePosition[dim] > domain2.targetPosition[dim]) {\n      const temp2 = domain2.targetPosition;\n      domain2.targetPosition = domain2.sourcePosition;\n      domain2.sourcePosition = temp2;\n    }\n  }\n  function outerBounds(b1, b2) {\n    if (!b1 && !b2)\n      return;\n    if (!b1)\n      return b2;\n    if (!b2)\n      return b1;\n    const minProps = [\n      \"minBoundsX\",\n      \"minBoundsY\",\n      \"minBoundsZ\"\n    ];\n    const maxProps = [\n      \"maxBoundsX\",\n      \"maxBoundsY\",\n      \"maxBoundsZ\"\n    ];\n    const result = {};\n    minProps.forEach((p) => result[p] = notNull(Math.min, b1[p], b2[p]));\n    maxProps.forEach((p) => result[p] = notNull(Math.max, b1[p], b2[p]));\n    return result;\n  }\n  function notNull(fn2, v1, v2) {\n    if (v1 == null && v2 == null)\n      return null;\n    if (v1 == null)\n      return v2;\n    if (v2 == null)\n      return v1;\n    return fn2(v1, v2);\n  }\n  function increment$1(b2, minBoundsX, minBoundsY, minBoundsZ, maxBoundsX, maxBoundsY, maxBoundsZ) {\n    return outerBounds(b2, {\n      minBoundsX,\n      minBoundsY,\n      minBoundsZ,\n      maxBoundsX,\n      maxBoundsY,\n      maxBoundsZ\n    });\n  }\n  const createAxesLayer = (props) => {\n    const { config, height: height2, ref: ref2, stage } = props;\n    const { core } = ref2;\n    const { renderer } = core;\n    const { x: x2, y: y2, z: z2 } = stage.axes;\n    const xyz = [...x2, ...y2, ...z2];\n    renderer.currentAxes = [];\n    if (!xyz.length) {\n      renderer.axesVisibility = AxesVisibility.none;\n      return;\n    }\n    renderer.axesVisibility = AxesVisibility.current;\n    const correlation = new AxesCorrelation(stage, 3);\n    const { axesSets, labels } = correlation;\n    const grid2 = correlation.getGrid();\n    if (grid2.byColumn[0]) {\n      grid2.byColumn[0].forEach((row) => {\n        row.axesSet.showFacetTitleY = true;\n      });\n      grid2.byRow[0].forEach((col) => {\n        col.axesSet.showFacetTitleX = true;\n      });\n    }\n    if (grid2.rows > 1) {\n      const { byRow } = grid2;\n      byRow[0].forEach(({ axesSet }, col) => {\n        if (!axesSet.y) {\n          if (byRow[1][col].axesSet) {\n            byRow[1][col].axesSet.x.tickText = axesSet.x.tickText;\n            byRow[1][col].axesSet.showFacetTitleX = axesSet.showFacetTitleX;\n            delete axesSet.x;\n          }\n        }\n      });\n    }\n    let bounds2;\n    const allAxesSetBounds = [];\n    let anyZ = false;\n    for (let i = 0; i < axesSets.length; i++) {\n      if (axesSets[i].z) {\n        anyZ = true;\n        break;\n      }\n    }\n    const is3d = stage.view === \"3d\" && anyZ;\n    axesSets.forEach((axesSet) => {\n      if (!axesSet.x && !axesSet.y)\n        return;\n      const axesSetBounds = {\n        axesSet,\n        maxBoundsX: null,\n        maxBoundsY: null,\n        maxBoundsZ: null,\n        minBoundsX: null,\n        minBoundsY: null,\n        minBoundsZ: null\n      };\n      if (is3d) {\n        const zBounds = getDomainBounds(1, axesSet.z);\n        axesSetBounds.minBoundsZ = -zBounds.maxBounds;\n        axesSetBounds.maxBoundsZ = -zBounds.minBounds;\n      }\n      const yBounds = getDomainBounds(1, axesSet.y);\n      axesSetBounds.minBoundsY = yBounds.minBounds;\n      axesSetBounds.maxBoundsY = yBounds.maxBounds;\n      axesSetBounds.y = yBounds.minBounds;\n      axesSetBounds.h = yBounds.maxBounds - yBounds.minBounds;\n      const xBounds = getDomainBounds(0, axesSet.x);\n      axesSetBounds.minBoundsX = xBounds.minBounds;\n      axesSetBounds.maxBoundsX = xBounds.maxBounds;\n      axesSetBounds.x = xBounds.minBounds;\n      axesSetBounds.w = xBounds.maxBounds - xBounds.minBounds;\n      allAxesSetBounds.push(axesSetBounds);\n      bounds2 = outerBounds(bounds2, axesSetBounds);\n    });\n    const facetLabelX = labels.filter((label2) => label2.axisRole === \"x\")[0];\n    const facetLabelY = labels.filter((label2) => label2.axisRole === \"y\")[0];\n    core.inputManager.pickAxesTitleCallback = ({ axis, axes, manipulator }) => {\n      const axesSet = axesSets[axes];\n      let a2;\n      let f;\n      switch (axis) {\n        case 0: {\n          a2 = axesSet.x;\n          f = facetLabelX;\n          break;\n        }\n        case 1: {\n          a2 = axesSet.y;\n          f = facetLabelY;\n          break;\n        }\n        case 2: {\n          a2 = axesSet.z;\n          break;\n        }\n      }\n      if (a2) {\n        config.onTextClick(manipulator.event, a2.title || f.title);\n      }\n    };\n    allAxesSetBounds.forEach((axesSetBounds) => {\n      const { axesSet } = axesSetBounds;\n      if (!axesSet.x && !axesSet.y)\n        return;\n      const cartesian2 = new (is3d ? Cartesian3dAxes : Cartesian2dAxes)(core);\n      cartesian2.isDivisionPickingEnabled = [false, false, false];\n      cartesian2.arePickDivisionsVisible = [false, false, false];\n      cartesian2.isLabelPickingEnabled = [false, false, false];\n      cartesian2.isTitlePickingEnabled = [false, false, false];\n      cartesian2.isGridPickingEnabled = false;\n      cartesian2.isHeadingPickingEnabled = [false, false, false];\n      createAxes(cartesian2, 0, 0, axesSet.x, AxesTextOrientation.perpendicular, height2, props, axesSet.showFacetTitleX && facetLabelX);\n      createAxes(cartesian2, 1, 1, axesSet.y, AxesTextOrientation.perpendicular, height2, props, axesSet.showFacetTitleY && facetLabelY);\n      if (is3d) {\n        createAxes(cartesian2, 1, 2, axesSet.z, AxesTextOrientation.perpendicular, height2, props);\n      }\n      configCartesianAxes(is3d, bounds2, cartesian2);\n      const { maxBoundsX, maxBoundsY, minBoundsX, minBoundsY } = bounds2;\n      const w2 = maxBoundsX - minBoundsX;\n      const h2 = maxBoundsY - minBoundsY;\n      cartesian2.scalingX = axesSetBounds.w / w2;\n      cartesian2.scalingY = axesSetBounds.h / h2;\n      cartesian2.offsetX = (axesSetBounds.x - minBoundsX + axesSetBounds.w / 2) / w2 - 0.5;\n      cartesian2.offsetY = (axesSetBounds.y - minBoundsY + axesSetBounds.h / 2) / h2 - 0.5;\n      const aspect = h2 / w2;\n      if (aspect > 1) {\n        cartesian2.offsetX /= aspect;\n      } else {\n        cartesian2.offsetY *= aspect;\n      }\n      const axes = is3d ? renderer.createCartesian3dAxesVisual(cartesian2) : renderer.createCartesian2dAxesVisual(cartesian2);\n      renderer.currentAxes.push(axes);\n      props.config.onAxesComplete && props.config.onAxesComplete(cartesian2);\n    });\n    return { bounds: bounds2 };\n  };\n  const nullDomain = {\n    sourcePosition: [0, 0, 0],\n    targetPosition: [0, 0, 0]\n  };\n  class AxesCorrelation {\n    constructor(stage, dimensions) {\n      this.dimensions = dimensions;\n      const { x: x2, y: y2, z: z2 } = stage.axes;\n      this.axesSets = [];\n      this.labels = [];\n      [x2, y2, z2].forEach((axes) => {\n        axes.forEach((axis) => {\n          if (this.axesSets.length === 0) {\n            this.initialize(axis);\n          } else {\n            this.correlate(axis);\n          }\n        });\n      });\n    }\n    getGrid() {\n      const mapCols = {};\n      const mapRows = {};\n      this.axesSets.forEach((axesSet) => {\n        var _a2;\n        const domain2 = (_a2 = axesSet === null || axesSet === void 0 ? void 0 : axesSet.x) === null || _a2 === void 0 ? void 0 : _a2.domain;\n        if (!domain2)\n          return;\n        const col = domain2.sourcePosition[0].toString();\n        const row = domain2.sourcePosition[1].toString();\n        if (!mapCols[col]) {\n          mapCols[col] = {};\n        }\n        mapCols[col][row] = axesSet;\n        mapRows[row] = null;\n      });\n      const colKeys = Object.keys(mapCols).sort((a2, b2) => +a2 - +b2);\n      const rowKeys = Object.keys(mapRows).sort((a2, b2) => +a2 - +b2);\n      return {\n        cols: colKeys.length,\n        rows: rowKeys.length,\n        byColumn: colKeys.map((colKey) => rowKeys.map((rowKey) => {\n          return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] };\n        })),\n        byRow: rowKeys.map((rowKey) => colKeys.map((colKey) => {\n          return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] };\n        }))\n      };\n    }\n    initialize(axis) {\n      if (!axis.domain) {\n        this.labels.push(axis);\n        return;\n      }\n      const axesSet = {};\n      axesSet[axis.axisRole] = axis;\n      this.axesSets.push(axesSet);\n    }\n    correlate(axis) {\n      if (!axis.domain) {\n        this.labels.push(axis);\n        return;\n      }\n      for (let i = 0; i < this.axesSets.length; i++) {\n        const axesSet = this.axesSets[i];\n        for (const axisRole in axesSet) {\n          const test2 = axesSet[axisRole];\n          if (this.matchDomains(axis.domain, test2.domain)) {\n            if (!axesSet[axis.axisRole] || !axesSet[axis.axisRole].tickText.length && axis.tickText.length) {\n              axesSet[axis.axisRole] = axis;\n            }\n            return;\n          }\n        }\n      }\n      this.initialize(axis);\n    }\n    matchDomains(a2, b2) {\n      if (this.matchPoint(a2.sourcePosition, b2.sourcePosition))\n        return true;\n      if (this.matchPoint(a2.sourcePosition, b2.targetPosition))\n        return true;\n      if (this.matchPoint(a2.targetPosition, b2.targetPosition))\n        return true;\n      if (this.matchPoint(a2.targetPosition, b2.sourcePosition))\n        return true;\n      return false;\n    }\n    matchPoint(a2, b2) {\n      for (let i = 0; i < this.dimensions; i++) {\n        if (a2[i] !== b2[i])\n          return false;\n      }\n      return true;\n    }\n  }\n  function createAxes(cartesian2, dim2d, dim3d, axis, orientation, height2, props, facetLabel) {\n    const domain2 = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n    const { tickPositions, tickText, textPos, textSize } = convertAxis(axis, domain2, dim2d, height2);\n    if (axis.axisRole === \"z\") {\n      tickPositions.forEach((t, i) => tickPositions[i] = 1 - t);\n      textPos.forEach((t, i) => textPos[i] = 1 - t);\n      tickText.reverse();\n      tickPositions.reverse();\n      textPos.reverse();\n    }\n    cartesian2.setTickPositions(dim3d, tickPositions);\n    cartesian2.zero[dim3d] = 0;\n    cartesian2.setLabelPositions(dim3d, textPos);\n    cartesian2.setLabels(dim3d, tickText);\n    cartesian2.setLabelSizes(dim3d, textSize);\n    const title = (axis === null || axis === void 0 ? void 0 : axis.title) || (facetLabel === null || facetLabel === void 0 ? void 0 : facetLabel.title);\n    if (title === null || title === void 0 ? void 0 : title.text) {\n      cartesian2.setTitle(dim3d, title.text);\n      cartesian2.setTitleSize(dim3d, title.size / height2);\n    }\n    cartesian2.setLabelOrientation(dim3d, orientation);\n    props.config.onAxisConfig && props.config.onAxisConfig(cartesian2, dim3d, axis);\n    return {\n      tickText\n    };\n  }\n  function configCartesianAxes(is3d, bounds2, cartesian2) {\n    if (is3d) {\n      cartesian2.isEdgeVisible[Edge3D.topBack] = false;\n    }\n    cartesian2.isEdgeVisible[Edge3D.backRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.bottomRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.frontRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.topFront] = false;\n    cartesian2.isEdgeVisible[Edge3D.topRight] = false;\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds2;\n    cartesian2.minBoundsX = minBoundsX;\n    cartesian2.maxBoundsX = maxBoundsX;\n    cartesian2.minBoundsY = minBoundsY;\n    cartesian2.maxBoundsY = maxBoundsY;\n    if (is3d) {\n      cartesian2.minBoundsZ = minBoundsZ;\n      cartesian2.maxBoundsZ = maxBoundsZ;\n    }\n  }\n  function getDomainBounds(dim2d, axis) {\n    const domain2 = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n    const minBounds = domain2.sourcePosition[dim2d];\n    const maxBounds = domain2.targetPosition[dim2d];\n    return {\n      maxBounds,\n      minBounds\n    };\n  }\n  function convertAxis(axis, domain2, dim, height2) {\n    const start = domain2.sourcePosition[dim];\n    const span2 = domain2.targetPosition[dim] - start;\n    const tickPositions = axis ? axis.ticks.map((t) => (t.sourcePosition[dim] - start) / span2) : [];\n    const tickText = axis ? axis.tickText.map((t) => t.text) : [];\n    const textPos = axis ? axis.tickText.map((t) => (t.position[dim] - start) / span2) : [];\n    const textSize = axis ? axis.tickText.map((t) => t.size / height2) : [];\n    if (tickPositions.length) {\n      if (tickPositions[0] !== 0) {\n        tickPositions[0] = 0;\n      }\n      if (tickPositions[tickPositions.length - 1] !== 1) {\n        tickPositions[tickPositions.length - 1] = 1;\n      }\n    }\n    return {\n      tickPositions,\n      tickText,\n      textPos,\n      textSize\n    };\n  }\n  let ColorMap$1 = class ColorMap {\n    constructor(quant = 5) {\n      this.quant = quant;\n      this.colorMap = {};\n      this.colorArray = [];\n    }\n    getColorKey(rgbaColor) {\n      const color2 = rgbaColor.slice(0, 3).map((e) => Math.floor(e / this.quant) * this.quant);\n      color2[3] = rgbaColor[3];\n      return JSON.stringify(color2);\n    }\n    registerColor(rgbaColor) {\n      const colorKey = this.getColorKey(rgbaColor);\n      if (!this.colorMap[colorKey]) {\n        this.colorMap[colorKey] = {\n          index: this.colorArray.length,\n          rgbaColor\n        };\n        this.colorArray.push(rgbaColor);\n      }\n      return this.colorMap[colorKey].index;\n    }\n    getPalette() {\n      return {\n        palette: new Uint8Array(this.colorArray.flat()),\n        maxColor: this.colorArray.length - 1\n      };\n    }\n  };\n  function convert$3(newColor) {\n    const c2 = colorFromString(newColor).slice(0, 3);\n    return c2.map((v) => v / 255);\n  }\n  function colorConfig(ref2, colors2) {\n    if (!colors2)\n      return;\n    const { config } = ref2.core;\n    config.activeColor = convert$3(colors2.activeItemColor);\n    config.backgroundColor = new Float32Array(convert$3(colors2.backgroundColor));\n    config.textColor = convert$3(colors2.textColor);\n    config.textBorderColor = convert$3(colors2.textBorderColor);\n    config.axesTextColor = convert$3(colors2.axesTextLabelColor);\n    config.axesGridBackgroundColor = convert$3(colors2.axesGridBackgroundColor);\n    config.axesGridHighlightColor = convert$3(colors2.axesGridHighlightColor);\n    config.axesGridMinorColor = convert$3(colors2.axesGridMinorColor);\n    config.axesGridMajorColor = convert$3(colors2.axesGridMajorColor);\n    config.axesGridZeroColor = convert$3(colors2.axesGridZeroColor);\n    ref2.core.renderer[\"_theme\"] = null;\n  }\n  const key$2 = \"cube\";\n  const createCubeLayer = (props) => {\n    const { ref: ref2, stage } = props;\n    const { core } = ref2;\n    const scatter = new Scatter(core);\n    const { ids, colors: colors2, positionsX, positionsY, positionsZ, sizesX, sizesY, sizesZ, bounds: bounds2, maxColor, palette } = convert$2(stage);\n    if (!ids.length)\n      return;\n    const { renderer } = core;\n    let cubeTransitionBuffer = renderer.transitionBuffers.find((t) => t.key === key$2);\n    if (!cubeTransitionBuffer) {\n      cubeTransitionBuffer = renderer.createTransitionBuffer(ids);\n      cubeTransitionBuffer.key = key$2;\n      renderer.transitionBuffers.push(cubeTransitionBuffer);\n    } else {\n      cubeTransitionBuffer.swap();\n    }\n    scatter.layout(cubeTransitionBuffer.currentBuffer, ids, {\n      positionsX,\n      positionsY,\n      positionsZ\n    });\n    const layer = {\n      positionsX,\n      positionsY,\n      positionsZ,\n      update: (newBounds, selected, stagger) => {\n        const { colors: colors3, maxColor: maxColor2, minColor, palette: palette2 } = layer.unitColorMap;\n        const currCubeTransitionBuffer = core.renderer.transitionBuffers.find((t) => t.key === key$2);\n        currCubeTransitionBuffer.currentBuffer.unitType = UnitType.block;\n        currCubeTransitionBuffer.currentPalette.colors = palette2;\n        let options2 = Object.assign({\n          selected,\n          colors: colors3,\n          minColor,\n          maxColor: maxColor2,\n          sizesX,\n          sizesY,\n          sizesZ\n        }, newBounds);\n        if (stagger === null || stagger === void 0 ? void 0 : stagger.staggerOrders) {\n          const { maxStaggerOrder, minStaggerOrder, staggerOrders } = stagger;\n          options2 = Object.assign(Object.assign({}, options2), {\n            maxStaggerOrder,\n            minStaggerOrder,\n            staggerOrders\n          });\n        }\n        scatter.update(currCubeTransitionBuffer.currentBuffer, ids, options2);\n      },\n      bounds: bounds2,\n      unitColorMap: {\n        colors: colors2,\n        ids,\n        minColor: 0,\n        maxColor,\n        palette\n      }\n    };\n    return layer;\n  };\n  function convert$2(stage) {\n    const { cubeData } = stage;\n    const { length: length2 } = cubeData;\n    const ids = [];\n    const colors2 = new Float64Array(length2);\n    const positionsX = new Float64Array(length2);\n    const positionsY = new Float64Array(length2);\n    const positionsZ = new Float64Array(length2);\n    const sizesX = new Float64Array(length2);\n    const sizesY = new Float64Array(length2);\n    const sizesZ = new Float64Array(length2);\n    let bounds2;\n    const colorMap = new ColorMap$1();\n    cubeData.forEach((cube, i) => {\n      ids.push(i);\n      if (cube.isEmpty) {\n        positionsX[i] = 0;\n        positionsY[i] = 0;\n        positionsZ[i] = 0;\n        sizesX[i] = 0;\n        sizesY[i] = 0;\n        sizesZ[i] = 0;\n        colors2[i] = 0;\n      } else {\n        positionsX[i] = cube.position[0] + cube.size[0] * 0.5;\n        positionsY[i] = cube.position[1] + cube.size[1] * 0.5;\n        positionsZ[i] = cube.position[2] + cube.size[2] * 0.5;\n        sizesX[i] = cube.size[0];\n        sizesY[i] = cube.size[1];\n        sizesZ[i] = cube.size[2];\n        bounds2 = increment$1(bounds2, cube.position[0], cube.position[1], cube.position[2], cube.position[0] + cube.size[0], cube.position[1] + cube.size[1], cube.position[2] + cube.size[2]);\n        colors2[i] = colorMap.registerColor(cube.color);\n      }\n    });\n    const { palette, maxColor } = colorMap.getPalette();\n    return {\n      ids: new Uint32Array(ids),\n      colors: colors2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      sizesX,\n      sizesY,\n      sizesZ,\n      bounds: bounds2,\n      maxColor,\n      palette\n    };\n  }\n  const key$1 = \"line\";\n  const createLineLayer = (props) => {\n    const { height: height2, ref: ref2, stage } = props;\n    const { core } = ref2;\n    const lines = new Line(core);\n    const { ids, fromIds, toIds, lineColors, lineSizes, bounds: bounds2, positionsX, positionsY, positionsZ, lineMaxColor, palette } = convert$1(stage, height2);\n    if (!ids.length)\n      return;\n    const { renderer } = core;\n    let lineTransitionBuffer = renderer.transitionBuffers.find((t) => t.key === key$1);\n    if (!lineTransitionBuffer) {\n      lineTransitionBuffer = renderer.createTransitionBuffer(ids);\n      lineTransitionBuffer.key = key$1;\n      renderer.transitionBuffers.push(lineTransitionBuffer);\n    } else {\n      lineTransitionBuffer.swap();\n    }\n    lines.layout(lineTransitionBuffer.currentBuffer, ids, fromIds, toIds, {\n      positionsX,\n      positionsY,\n      positionsZ,\n      lineSizes,\n      sizeScaling: 1\n    });\n    let options2 = {\n      lineColors,\n      lineMinColor: 0,\n      lineMaxColor\n    };\n    lineTransitionBuffer.currentBuffer.unitType = UnitType.cylinder;\n    lineTransitionBuffer.currentPalette.colors = palette;\n    return {\n      update: (newBounds) => {\n        options2 = Object.assign(Object.assign({}, options2), newBounds);\n        const currLineTransitionBuffer = core.renderer.transitionBuffers.find((t) => t.key === key$1);\n        lines.update(currLineTransitionBuffer.currentBuffer, ids, fromIds, toIds, options2);\n      },\n      bounds: bounds2,\n      unitColorMap: {\n        ids,\n        colors: lineColors,\n        minColor: 0,\n        maxColor: lineMaxColor,\n        palette\n      }\n    };\n  };\n  function convert$1(stage, height2, width2) {\n    const { pathData } = stage;\n    const positions2 = [];\n    const lines = [];\n    const colorMap = new ColorMap$1();\n    pathData.forEach((path2) => {\n      const color2 = colorMap.registerColor(path2.strokeColor);\n      let from = positions2.length;\n      positions2.push(path2.positions[0]);\n      for (let i = 1; i < path2.positions.length; i++) {\n        const to = positions2.length;\n        positions2.push(path2.positions[i]);\n        lines.push({\n          id: lines.length,\n          from,\n          to,\n          color: color2,\n          size: path2.strokeWidth\n        });\n        from = to;\n      }\n    });\n    const ids = new Uint32Array(lines.length);\n    const fromIds = new Uint32Array(lines.length);\n    const toIds = new Uint32Array(lines.length);\n    const lineColors = new Float64Array(lines.length);\n    const lineSizes = new Float64Array(lines.length);\n    lines.forEach((line2, i) => {\n      ids[i] = i;\n      fromIds[i] = line2.from;\n      toIds[i] = line2.to;\n      lineColors[i] = line2.color;\n      lineSizes[i] = line2.size;\n    });\n    const positionsX = new Float64Array(positions2.length);\n    const positionsY = new Float64Array(positions2.length);\n    const positionsZ = new Float64Array(positions2.length);\n    let bounds2;\n    positions2.forEach((p, i) => {\n      positionsX[i] = p[0];\n      positionsY[i] = p[1] + height2;\n      positionsZ[i] = p[2];\n      bounds2 = increment$1(bounds2, positionsX[i], positionsY[i], positionsZ[i], positionsX[i], positionsY[i], positionsZ[i]);\n    });\n    const { palette, maxColor: lineMaxColor } = colorMap.getPalette();\n    return {\n      ids,\n      fromIds,\n      toIds,\n      lineColors,\n      lineSizes,\n      bounds: bounds2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      lineMaxColor,\n      palette\n    };\n  }\n  const createTextLayer = (props) => {\n    const { ref: ref2, stage } = props;\n    const { core } = ref2;\n    const { positionsX, positionsY, positionsZ, sizes, bounds: bounds2, maxGlyphs, text: text2 } = convert(stage);\n    if (text2.length === 0) {\n      core.renderer.labelSets = [];\n      return;\n    }\n    const options2 = {\n      text: text2,\n      maxGlyphs,\n      scales: sizes\n    };\n    const labelSet = new LabelSet(core, options2);\n    labelSet.positionsX = positionsX;\n    labelSet.positionsY = positionsY;\n    labelSet.positionsZ = positionsZ;\n    labelSet.horizontalAlignment = HorizontalAlignment.center;\n    labelSet.verticalAlignment = VerticalAlignment.center;\n    const layer = {\n      update: (bounds3) => {\n        const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds3;\n        labelSet.minBoundsX = minBoundsX;\n        labelSet.minBoundsY = minBoundsY;\n        labelSet.minBoundsZ = minBoundsZ;\n        labelSet.maxBoundsX = maxBoundsX;\n        labelSet.maxBoundsY = maxBoundsY;\n        labelSet.maxBoundsZ = maxBoundsZ;\n      },\n      bounds: bounds2\n    };\n    const labelSetVisual = core.renderer.createLabelSetVisual(labelSet);\n    core.renderer.labelSets = [labelSetVisual];\n    return layer;\n  };\n  function convert(stage) {\n    const { textData } = stage;\n    const { length: length2 } = textData;\n    const ids = [];\n    const text2 = [];\n    const colors2 = new Float64Array(length2);\n    const positionsX = new Float64Array(length2);\n    const positionsY = new Float64Array(length2);\n    const positionsZ = new Float64Array(length2);\n    const sizes = new Float64Array(length2);\n    let bounds2;\n    let maxGlyphs = 0;\n    const colorMap = new ColorMap$1();\n    textData.forEach((t, i) => {\n      ids.push(i);\n      text2.push(t.text);\n      maxGlyphs += t.text.length;\n      positionsX[i] = t.position[0];\n      positionsY[i] = t.position[1];\n      positionsZ[i] = t.position[2];\n      sizes[i] = 1.5 * t.size;\n      bounds2 = increment$1(bounds2, t.position[0], t.position[1], t.position[2], t.position[0], t.position[1], t.position[2]);\n      colors2[i] = colorMap.registerColor(t.color);\n    });\n    const { palette, maxColor } = colorMap.getPalette();\n    return {\n      ids: new Uint32Array(ids),\n      colors: colors2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      sizes,\n      bounds: bounds2,\n      maxColor,\n      maxGlyphs,\n      palette,\n      text: text2\n    };\n  }\n  function getImageData(url) {\n    return new Promise((resolve2, reject) => {\n      const imageElement = document.createElement(\"img\");\n      imageElement.onload = () => {\n        const canvas = document.createElement(\"canvas\");\n        const ctx = canvas.getContext(\"2d\");\n        const { height: height2, width: width2 } = imageElement;\n        canvas.width = width2;\n        canvas.height = height2;\n        ctx.drawImage(imageElement, 0, 0);\n        resolve2(ctx.getImageData(0, 0, width2, height2));\n      };\n      imageElement.src = url;\n    });\n  }\n  function createImageQuad(core, imageData, bounds2, position2, width2, height2) {\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds2;\n    const imageOptions = {\n      imageData,\n      position: position2,\n      height: height2,\n      width: width2,\n      minBoundsX,\n      maxBoundsX,\n      minBoundsZ,\n      maxBoundsZ,\n      minBoundsY,\n      maxBoundsY\n    };\n    return new ImageQuad(core, imageOptions);\n  }\n  function createCameraDefaults() {\n    const qModelRotation2d2 = create$4();\n    const qModelRotation3d2 = Constants$1.QUAT_ROTATEX_MINUS_90;\n    const qCameraRotation2d2 = create$4();\n    const qCameraRotation3d2 = create$4();\n    const qAngle = create$4();\n    const vCameraPosition2 = create$6();\n    setAxisAngle(qCameraRotation3d2, Constants$1.VECTOR3_UNITX, AngleHelper.degreesToRadians(30));\n    setAxisAngle(qAngle, Constants$1.VECTOR3_UNITY, AngleHelper.degreesToRadians(-25));\n    multiply(qCameraRotation3d2, qCameraRotation3d2, qAngle);\n    return {\n      qModelRotation2d: qModelRotation2d2,\n      qModelRotation3d: qModelRotation3d2,\n      qCameraRotation2d: qCameraRotation2d2,\n      qCameraRotation3d: qCameraRotation3d2,\n      vCameraPosition: vCameraPosition2\n    };\n  }\n  const cameraDefaults = createCameraDefaults();\n  const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n  function applyCameraCallbacks(ref2, lastPresenterConfig, lastView, transistion2dOnly) {\n    const { cameraTransitioner, core, modelTransitioner, positionTransitioner } = ref2;\n    ref2.reset = () => {\n      core.reset(true);\n      if (lastView === \"3d\") {\n        modelTransitioner.qRotation.to = qModelRotation3d;\n        cameraTransitioner.qRotation.to = qCameraRotation3d;\n        cameraTransitioner.vPosition.to = vCameraPosition;\n      } else {\n        modelTransitioner.qRotation.to = qModelRotation2d;\n        cameraTransitioner.qRotation.to = qCameraRotation2d;\n        cameraTransitioner.vPosition.to = vCameraPosition;\n      }\n      slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.to, modelTransitioner.qRotation.to, 0);\n      core.setModelRotation(modelTransitioner.qRotation.current, true);\n      core.camera.setOrbit(cameraTransitioner.qRotation.to, true);\n      core.camera.setPosition(cameraTransitioner.vPosition.to, true);\n    };\n    const cam = (t) => {\n      slerp(cameraTransitioner.qRotation.current, cameraTransitioner.qRotation.from, cameraTransitioner.qRotation.to, t);\n      lerp$1(cameraTransitioner.vPosition.current, cameraTransitioner.vPosition.from, cameraTransitioner.vPosition.to, t);\n      core.camera.setOrbit(cameraTransitioner.qRotation.current, false);\n      core.camera.setPosition(cameraTransitioner.vPosition.current, false);\n      core.inputManager.isPickingEnabled = false;\n    };\n    core.updateCallback = (elapsedTime) => {\n      const { transitionDurations } = lastPresenterConfig;\n      if (positionTransitioner.isTransitioning) {\n        const t = positionTransitioner.elapse(elapsedTime, transitionDurations.position + transitionDurations.stagger);\n        core.renderer.transitionTime = t;\n        setTransitionTimeAxesVisibility(transistion2dOnly, core);\n      } else {\n        core.inputManager.isPickingEnabled = true;\n      }\n      if (modelTransitioner.isTransitioning) {\n        const tm = modelTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n        if (modelTransitioner.shouldTransition) {\n          slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.from, modelTransitioner.qRotation.to, tm);\n          core.setModelRotation(modelTransitioner.qRotation.current, false);\n        }\n        cam(tm);\n      }\n      if (cameraTransitioner.isTransitioning) {\n        const t = cameraTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n        cam(t);\n      }\n    };\n  }\n  function setTransitionTimeAxesVisibility(transistion2dOnly, core) {\n    const t = core.renderer.transitionTime;\n    if (transistion2dOnly) {\n      if (t < 0.5) {\n        core.renderer.axesVisibility = AxesVisibility.previous;\n      } else {\n        core.renderer.axesVisibility = AxesVisibility.current;\n      }\n    } else {\n      if (t <= 0.01) {\n        core.renderer.axesVisibility = AxesVisibility.previous;\n      } else if (t >= 0.99) {\n        core.renderer.axesVisibility = AxesVisibility.current;\n      } else {\n        core.renderer.axesVisibility = AxesVisibility.none;\n      }\n    }\n  }\n  function morphChartsRender(ref2, prevStage, stage, height2, width2, preStage, colors2, config) {\n    const { qCameraRotation2d: qCameraRotation2d2, qCameraRotation3d: qCameraRotation3d2, qModelRotation2d: qModelRotation2d2, qModelRotation3d: qModelRotation3d2, vCameraPosition: vCameraPosition2 } = cameraDefaults;\n    const { core, cameraTransitioner, modelTransitioner, positionTransitioner } = ref2;\n    let transistion2dOnly = false;\n    let cameraTo;\n    let holdCamera;\n    if (config.camera === \"hold\") {\n      holdCamera = true;\n    } else {\n      cameraTo = config.camera;\n    }\n    if (prevStage && prevStage.view !== stage.view) {\n      modelTransitioner.shouldTransition = !holdCamera;\n      if (stage.view === \"2d\") {\n        modelTransitioner.qRotation.from = qModelRotation3d2;\n        modelTransitioner.qRotation.to = qModelRotation2d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      } else {\n        modelTransitioner.qRotation.from = qModelRotation2d2;\n        modelTransitioner.qRotation.to = qModelRotation3d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      }\n    } else {\n      modelTransitioner.shouldTransition = false;\n      if (stage.view === \"2d\") {\n        transistion2dOnly = true;\n        modelTransitioner.qRotation.to = qModelRotation2d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      } else {\n        modelTransitioner.qRotation.to = qModelRotation3d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      }\n    }\n    core.camera.getOrbit(cameraTransitioner.qRotation.from);\n    core.camera.getPosition(cameraTransitioner.vPosition.from);\n    if (!prevStage) {\n      core.setModelRotation(modelTransitioner.qRotation.to, false);\n      core.camera.setOrbit(cameraTransitioner.qRotation.to, false);\n      core.camera.setPosition(cameraTransitioner.vPosition.to, false);\n    } else if (!holdCamera) {\n      cameraTransitioner.begin();\n    }\n    positionTransitioner.begin();\n    if (modelTransitioner.shouldTransition) {\n      modelTransitioner.begin();\n    }\n    const props = { ref: ref2, stage, height: height2, config };\n    const cubeLayer = createCubeLayer(props);\n    const lineLayer = createLineLayer(props);\n    const textLayer = createTextLayer(props);\n    const { backgroundImages } = stage;\n    let contentBounds = outerBounds(outerBounds(cubeLayer === null || cubeLayer === void 0 ? void 0 : cubeLayer.bounds, lineLayer === null || lineLayer === void 0 ? void 0 : lineLayer.bounds), outerBounds(textLayer === null || textLayer === void 0 ? void 0 : textLayer.bounds, null));\n    backgroundImages === null || backgroundImages === void 0 ? void 0 : backgroundImages.forEach((backgroundImage) => {\n      contentBounds = outerBounds(contentBounds, convertBounds(backgroundImage.bounds));\n    });\n    props.bounds = contentBounds;\n    core.renderer.previousAxes = core.renderer.currentAxes;\n    const axesLayer = createAxesLayer(props);\n    core.config.transitionStaggering = config.transitionDurations.stagger;\n    core.config.transitionDuration = config.transitionDurations.position;\n    let bounds2;\n    if (axesLayer && axesLayer.bounds) {\n      bounds2 = axesLayer.bounds;\n    } else {\n      bounds2 = contentBounds;\n    }\n    ref2.setMorphChartsRendererOptions(config.renderer);\n    if (preStage) {\n      preStage(stage, cubeLayer);\n    }\n    core.renderer.images = [];\n    if (backgroundImages) {\n      const addImage = (imageBounds, imageData) => {\n        const imageWidth2 = imageBounds.maxBoundsX - imageBounds.minBoundsX;\n        const imageHeight2 = imageBounds.maxBoundsY - imageBounds.minBoundsY;\n        const position2 = [imageBounds.minBoundsX + imageWidth2 / 2, imageBounds.minBoundsY + imageHeight2 / 2, 0];\n        const imageQuad = createImageQuad(core, imageData, contentBounds, position2, imageWidth2, imageHeight2);\n        const imageVisual = core.renderer.createImageVisual(imageQuad);\n        core.renderer.images.push(imageVisual);\n      };\n      const imageDataCache = {};\n      backgroundImages.forEach((backgroundImage) => {\n        const imageBounds = convertBounds(backgroundImage.bounds);\n        const imageData = imageDataCache[backgroundImage.url];\n        if (imageData) {\n          addImage(imageBounds, imageData);\n        } else {\n          getImageData(backgroundImage.url).then((imageData2) => {\n            imageDataCache[backgroundImage.url] = imageData2;\n            addImage(imageBounds, imageData2);\n          });\n        }\n      });\n    }\n    layersWithSelection(cubeLayer, lineLayer, textLayer, config.layerSelection, bounds2, ref2.layerStagger);\n    applyCameraCallbacks(ref2, config, stage.view, transistion2dOnly);\n    core.renderer.transitionTime = 0;\n    colorConfig(ref2, colors2);\n    return {\n      bounds: bounds2,\n      getCubeLayer: () => cubeLayer,\n      update: (layerSelection) => layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds2, ref2.layerStagger),\n      activate: (id2) => core.renderer.transitionBuffers[0].activeId = id2,\n      moveCamera: (camera) => {\n        if (!(positionTransitioner.isTransitioning || modelTransitioner.isTransitioning)) {\n          core.camera.getOrbit(cameraTransitioner.qRotation.from);\n          core.camera.getPosition(cameraTransitioner.vPosition.from);\n          cameraTransitioner.move(camera.position, camera.rotation);\n        }\n      },\n      setTransitionTimeAxesVisibility: () => {\n        setTransitionTimeAxesVisibility(transistion2dOnly, core);\n      }\n    };\n  }\n  function layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds2, layerStagger) {\n    const layerItems = [\n      {\n        layer: cubeLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.cubes,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.cubes\n      },\n      {\n        layer: lineLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.lines,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.lines\n      },\n      {\n        layer: textLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.texts,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.texts\n      }\n    ];\n    layerItems.forEach((layerItem) => {\n      var _a2;\n      return (_a2 = layerItem.layer) === null || _a2 === void 0 ? void 0 : _a2.update(bounds2, layerItem.selection, layerItem.stagger);\n    });\n  }\n  function convertBounds(bounds2) {\n    if (!bounds2)\n      return;\n    return {\n      minBoundsX: bounds2.x1,\n      maxBoundsX: bounds2.x2,\n      minBoundsY: -bounds2.y2,\n      maxBoundsY: -bounds2.y1,\n      minBoundsZ: minZ,\n      maxBoundsZ: minZ\n    };\n  }\n  function shouldChangeRenderer(prev, next) {\n    var _a2, _b2;\n    if (!prev || !next)\n      return true;\n    if (prev.advanced !== next.advanced)\n      return true;\n    if (!prev.advanced) {\n      return ((_a2 = prev.basicOptions) === null || _a2 === void 0 ? void 0 : _a2.antialias) != ((_b2 = next.basicOptions) === null || _b2 === void 0 ? void 0 : _b2.antialias);\n    }\n  }\n  function getRenderer(mcRendererOptions, core) {\n    const advanced = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced;\n    const r = advanced ? new Main() : new Main$1(mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.basicOptions);\n    core.renderer = r;\n    setRendererOptions(r, mcRendererOptions);\n    return r;\n  }\n  function setRendererOptions(renderer, mcRendererOptions) {\n    const o = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advancedOptions;\n    if ((mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced) && o) {\n      for (const key2 in o) {\n        renderer.config[key2] = o[key2];\n      }\n    }\n  }\n  function rendererEnabled(advanced) {\n    const r = advanced ? new Main() : new Main$1();\n    return r.isSupported;\n  }\n  const rightButton = 2;\n  function listenCanvasEvents(core, options2) {\n    const { container, pickGridCallback } = options2;\n    const { inputManager } = core;\n    if (options2.onLasso) {\n      inputManager.pickLassoCallback = (result) => {\n        options2.onLasso(result.ids[0], result.manipulator.event);\n      };\n    }\n    inputManager.singleTouchAction = (manipulator) => {\n      if (manipulator.button == rightButton || manipulator.shiftKey || manipulator.ctrlKey) {\n        return SingleTouchAction.rotate;\n      } else if (manipulator.altKey) {\n        return SingleTouchAction.lasso;\n      } else {\n        return SingleTouchAction.translate;\n      }\n    };\n    inputManager.pickAxesGridCallback = ({ divisionX, divisionY, divisionZ, manipulator }) => {\n      clearClickTimeout();\n      const { altKey, button, shiftKey } = manipulator;\n      const me = { altKey, shiftKey, button };\n      const e = me;\n      pickGridCallback([divisionX, divisionY, divisionZ], e);\n    };\n    const canvas = container.getElementsByTagName(\"canvas\")[0];\n    let pickedId;\n    const hover2 = (e) => {\n      if (core.renderer.pickedId !== pickedId) {\n        pickedId = core.renderer.pickedId;\n        const ordinal2 = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n        options2.onCubeHover(e, ordinal2);\n      }\n    };\n    canvas.addEventListener(\"mousemove\", (e) => {\n      clearClickTimeout();\n      if (mousedown) {\n        options2.onCubeHover(e, null);\n      }\n      hover2(e);\n    });\n    canvas.addEventListener(\"mouseout\", hover2);\n    canvas.addEventListener(\"mouseover\", hover2);\n    let mousedown;\n    canvas.addEventListener(\"mousedown\", () => {\n      mousedown = true;\n    });\n    canvas.addEventListener(\"mouseup\", (e) => {\n      mousedown = false;\n    });\n    let canvasClickTimeout;\n    const clearClickTimeout = () => {\n      clearTimeout(canvasClickTimeout);\n      canvasClickTimeout = null;\n    };\n    canvas.addEventListener(\"click\", (e) => {\n      canvasClickTimeout = setTimeout(() => {\n        options2.onCanvasClick(e);\n      }, 50);\n    });\n    inputManager.pickItemCallback = ({ manipulator }) => {\n      clearClickTimeout();\n      const ordinal2 = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n      options2.onCubeClick(manipulator.event, ordinal2);\n    };\n  }\n  function cubicInOut(t) {\n    return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n  }\n  function easing(t) {\n    if (t === 0 || t === 1)\n      return t;\n    return cubicInOut(t);\n  }\n  class Transitioner {\n    constructor() {\n      this.isTransitioning = false;\n    }\n    begin() {\n      this.isTransitioning = true;\n      this.time = 0;\n    }\n    elapse(elapsedTime, totalTime, ease = false) {\n      this.time += elapsedTime;\n      if (this.time >= totalTime) {\n        this.isTransitioning = false;\n        this.time = totalTime;\n        this.ended && this.ended();\n      }\n      const t = this.time / totalTime;\n      return ease ? easing(t) : t;\n    }\n  }\n  class CameraTransitioner extends Transitioner {\n    constructor() {\n      super();\n      this.qRotation = {\n        from: create$4(),\n        to: null,\n        current: create$4()\n      };\n      this.vPosition = {\n        from: create$6(),\n        to: null,\n        current: create$6()\n      };\n    }\n    move(position2, rotation2) {\n      this.begin();\n      this.qRotation.to = rotation2;\n      this.vPosition.to = position2;\n    }\n  }\n  class ModelTransitioner extends Transitioner {\n    constructor() {\n      super();\n      this.shouldTransition = false;\n      this.qRotation = {\n        from: null,\n        to: null,\n        current: create$4()\n      };\n    }\n  }\n  function init$1(options2, mcRendererOptions) {\n    const { container } = options2;\n    const core = new Core({ container });\n    getRenderer(mcRendererOptions, core);\n    listenCanvasEvents(core, options2);\n    core.config.pickSelectDelay = 50;\n    const cameraTransitioner = new CameraTransitioner();\n    const modelTransitioner = new ModelTransitioner();\n    const positionTransitioner = new Transitioner();\n    positionTransitioner.ended = () => {\n      core.renderer.axesVisibility = AxesVisibility.current;\n    };\n    const ref2 = {\n      supportedRenders: {\n        advanced: rendererEnabled(true),\n        basic: rendererEnabled(false)\n      },\n      reset: null,\n      cameraTransitioner,\n      modelTransitioner,\n      positionTransitioner,\n      core,\n      setMorphChartsRendererOptions(mcRendererOptions2) {\n        if (shouldChangeRenderer(ref2.lastMorphChartsRendererOptions, mcRendererOptions2)) {\n          getRenderer(mcRendererOptions2, core);\n          listenCanvasEvents(core, options2);\n        } else {\n          if (mcRendererOptions2.advanced) {\n            setRendererOptions(core.renderer, mcRendererOptions2);\n          }\n        }\n        ref2.lastMorphChartsRendererOptions = mcRendererOptions2;\n      },\n      lastMorphChartsRendererOptions: mcRendererOptions,\n      layerStagger: {}\n    };\n    return ref2;\n  }\n  class Presenter {\n    /**\n     * Get the previously rendered Stage object.\n     */\n    get stage() {\n      return this._last.stage;\n    }\n    /**\n     * Get the current View camera type.\n     */\n    get view() {\n      return this._last.view;\n    }\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */\n    constructor(el, style2) {\n      this.el = el;\n      this.style = deepMerge(defaultPresenterStyle$1, style2);\n      initializePanel(this);\n      this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n    }\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */\n    animationCancel() {\n      if (this.animationTimer) {\n        clearTimeout(this.animationTimer);\n        this.animationTimer = null;\n        if (this.logger) {\n          this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || \"handler\"}`);\n        }\n        if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n          this.queuedAnimationOptions.animationCanceled.call(null);\n        }\n      }\n    }\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */\n    animationQueue(handler, timeout2, options2) {\n      if (this.logger) {\n        this.logger(`queueing animation ${options2 && options2.waitingLabel || \"waiting\"}...(${timeout2})`);\n      }\n      this.animationCancel();\n      this.animationTimer = setTimeout(() => {\n        if (this.logger) {\n          this.logger(`queueing animation ${options2 && options2.handlerLabel || \"handler\"}...`);\n        }\n        handler();\n      }, timeout2);\n    }\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */\n    getElement(type2) {\n      const elements = this.el.getElementsByClassName(className$1(type2, this));\n      if (elements && elements.length) {\n        return elements[0];\n      }\n    }\n    /**\n     * Present the Vega Scene, or Stage object using Morphcharts.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area.\n     * @param config Optional presentation configuration object.\n     */\n    present(sceneOrStage, height2, width2, config) {\n      this.animationCancel();\n      const scene = sceneOrStage;\n      let stage;\n      const options2 = {\n        maxOrdinal: 0,\n        currAxis: null,\n        defaultCubeColor: this.style.defaultCubeColor,\n        assignCubeOrdinal: config && config.onSceneRectAssignCubeOrdinal || (() => options2.maxOrdinal++),\n        modifyAxis: (config === null || config === void 0 ? void 0 : config.onAxisItem) ? config.onAxisItem : defaultOnAxisItem,\n        zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n      };\n      if (scene.marktype) {\n        stage = createStage(scene.view);\n        sceneToStage(options2, stage, scene);\n      } else {\n        stage = sceneOrStage;\n      }\n      const c2 = deepMerge(defaultPresenterConfig, config);\n      if (!this.morphchartsref) {\n        this._morphChartsOptions = {\n          container: this.getElement(PresenterElement$1.gl),\n          pickGridCallback: c2.axisPickGridCallback,\n          onCubeHover: (e, ordinal2) => {\n            c2.onCubeHover(e, { ordinal: ordinal2, color: null, position: null, size: null });\n          },\n          onCubeClick: (e, ordinal2) => {\n            c2.onCubeClick(e, { ordinal: ordinal2, color: null, position: null, size: null });\n          },\n          onCanvasClick: config === null || config === void 0 ? void 0 : config.onLayerClick,\n          onLasso: config === null || config === void 0 ? void 0 : config.onLasso\n        };\n        this.morphchartsref = init$1(this._morphChartsOptions, c2.renderer || defaultPresenterConfig.renderer);\n      }\n      let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n      if (options2.maxOrdinal) {\n        cubeCount = Math.max(cubeCount, options2.maxOrdinal);\n        const empty = {\n          isEmpty: true\n        };\n        stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n      }\n      config.preLayer && config.preLayer(stage);\n      this.morphChartsRenderResult = morphChartsRender(this.morphchartsref, this._last.stage, stage, height2, width2, config && config.preStage, config && config.morphChartsColors, c2);\n      delete stage.cubeData;\n      delete stage.redraw;\n      this._last = {\n        cubeCount,\n        height: height2,\n        width: width2,\n        stage,\n        view: stage.view\n      };\n      const a2 = getActiveElementInfo();\n      mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement$1.legend));\n      setActiveElement(a2);\n      if (config && config.onPresent) {\n        config.onPresent();\n      }\n    }\n    canvasToDataURL() {\n      return new Promise((resolve2, reject) => {\n        this.morphchartsref.core.afterRenderCallback = () => {\n          this.morphchartsref.core.afterRenderCallback = null;\n          const canvas = this.getElement(PresenterElement$1.gl).getElementsByTagName(\"canvas\")[0];\n          const png = canvas.toDataURL(\"image/png\");\n          resolve2(png);\n        };\n      });\n    }\n    configColors(mcColors) {\n      colorConfig(this.morphchartsref, mcColors);\n    }\n    /**\n     * Home the camera to the last initial position.\n     */\n    homeCamera() {\n      var _a2;\n      (_a2 = this.morphchartsref) === null || _a2 === void 0 ? void 0 : _a2.reset();\n    }\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */\n    showGuides() {\n      this.getElement(PresenterElement$1.gl).classList.add(\"show-center\");\n    }\n    finalize() {\n      this.animationCancel();\n      if (this.morphchartsref)\n        this.morphchartsref.core.stop();\n      if (this.el)\n        this.el.innerHTML = \"\";\n      this._last = null;\n      this.morphchartsref = null;\n      this.el = null;\n      this.logger = null;\n      this.queuedAnimationOptions = null;\n    }\n  }\n  function _RendererGl(loader2) {\n    class RendererGlInternal extends base$3.vega.Renderer {\n      initialize(el, width2, height2, origin) {\n        this.height = height2;\n        this.width = width2;\n        return super.initialize(el, width2, height2, origin);\n      }\n      resize(width2, height2, origin) {\n        super.resize(width2, height2, origin);\n        this.origin = origin;\n        this.height = height2;\n        this.width = width2;\n        return this;\n      }\n      _render(scene, items) {\n        const scene3d = scene;\n        scene3d.view = this.getView();\n        this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n        return this;\n      }\n    }\n    const instance = new RendererGlInternal(loader2);\n    return instance;\n  }\n  const RendererGl = _RendererGl;\n  let registered = false;\n  function _ViewGl(runtime2, config) {\n    class ViewGlInternal extends base$3.vega.View {\n      constructor(runtime3, config2 = {}) {\n        super(runtime3, config2);\n        this.config = config2;\n        this.presenter = config2.presenter;\n        config2.presenterConfig = config2.presenterConfig || {};\n        config2.presenterConfig.redraw = () => {\n          this._redraw = true;\n          this.run();\n        };\n      }\n      renderer(...args) {\n        if (args && args.length) {\n          const renderer = args[0];\n          if (renderer === \"morphcharts\" && !registered) {\n            base$3.vega.renderModule(\"morphcharts\", { handler: base$3.vega.CanvasHandler, renderer: RendererGl });\n            registered = true;\n          }\n          return super.renderer(renderer);\n        } else {\n          return super.renderer();\n        }\n      }\n      initialize(el) {\n        if (!this.presenter) {\n          this.presenter = new Presenter(el);\n        }\n        super.initialize(this.presenter.getElement(PresenterElement$1.vegaControls));\n        const renderer = this._renderer;\n        renderer.presenterConfig = this.config.presenterConfig;\n        renderer.presenter = this.presenter;\n        renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView$1);\n        return this;\n      }\n      error(e) {\n        if (this.presenter.logger) {\n          this.presenter.logger(e);\n        }\n      }\n    }\n    const instance = new ViewGlInternal(runtime2, config);\n    return instance;\n  }\n  const ViewGl = _ViewGl;\n  const version$5 = \"1.0.6\";\n  const index$5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Presenter,\n    get PresenterElement() {\n      return PresenterElement$1;\n    },\n    ViewGl,\n    base: base$3,\n    controls,\n    defaults: defaults$1,\n    types,\n    use: use$5,\n    util: util$4,\n    version: version$5\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const { defaultPresenterStyle } = defaults$1;\n  const defaultViewerOptions$1 = {\n    colors: {\n      activeCube: \"purple\",\n      defaultCube: colorToString(defaultPresenterStyle.defaultCubeColor),\n      hoveredCube: colorToString(defaultPresenterStyle.highlightColor),\n      selectedCube: \"yellow\",\n      axisSelectHighlight: colorToString([128, 128, 128, 128]),\n      axisLine: \"#000\",\n      axisText: \"#000\",\n      gridLine: \"#CCC\",\n      backgroundColor: \"#FFF\"\n    },\n    language: {\n      headers: {\n        chart: \"Chart\",\n        details: \"Details\",\n        legend: \"Legend\",\n        selection: \"Select & Filter\"\n      },\n      bing: \"bing\",\n      newColorMap: \"remap color to filtered items\",\n      oldColorMap: \"keep same colors\",\n      deselect: \"deselect\",\n      exclude: \"exclude\",\n      isolate: \"isolate\",\n      legendOther: \"other\",\n      nextDetail: \">\",\n      previousDetail: \"<\",\n      reset: \"reset\",\n      colorBinCount: \"Color bin count\",\n      colorReverse: \"Color reverse\",\n      count: \"Count\",\n      percent: \"Percent\",\n      sum: \"Sum\",\n      scatterPointScale: \"Point scale\",\n      FacetMaxBins: \"Facet max bins\",\n      FacetVMaxBins: \"Cross facet max bins\",\n      XMaxBins: \"X axis max bins\",\n      YMaxBins: \"Y axis max bins\",\n      XGridSize: \"X grid size\",\n      YGridSize: \"Y grid size\",\n      InnerPaddingSize: \"Inner padding size\",\n      OuterPaddingSize: \"Outer padding size\",\n      treeMapMethod: \"Treemap layout\",\n      facetColumns: \"Facet columns\",\n      facetRows: \"Facet rows\",\n      markOpacitySignal: \"Mark opacity\",\n      textScaleSignal: \"Text scale\",\n      xAxisTextAngleSignal: \"X axis text angle\",\n      yAxisTextAngleSignal: \"Y axis text angle\",\n      zGrounded: \"Z grounded\",\n      zScaleProportion: \"Z scale proportion to Y\",\n      selectionCount: (count2) => `${count2} items selected`\n    },\n    maxLegends: 19,\n    //20 would be \"other\"\n    onError: (errors) => {\n    },\n    filterRenderingTimerPadding: 200,\n    selectionPolygonZ: -1,\n    tickSize: 10\n  };\n  function getPresenterStyle(options2) {\n    const style2 = {\n      cssPrefix,\n      fontFamily: options2.fontFamily,\n      defaultCubeColor: colorFromString(options2.colors.defaultCube)\n    };\n    if (options2.colors.hoveredCube) {\n      style2.highlightColor = colorFromString(options2.colors.hoveredCube);\n    }\n    return style2;\n  }\n  const cssPrefix = \"sanddance-\";\n  const dualColorSchemeColors = {\n    black: \"#212121\",\n    gray: \"#D2D2D2\",\n    blue: \"#0060F0\",\n    green: \"#00C000\",\n    orange: \"#FF9900\",\n    red: \"#E00000\"\n  };\n  function isInternalFieldName(columnName, includeVegaMorphChartsFields = false) {\n    if (includeVegaMorphChartsFields) {\n      if (columnName === GL_ORDINAL)\n        return true;\n    }\n    for (const f in FieldNames) {\n      if (columnName === FieldNames[f])\n        return true;\n    }\n    return false;\n  }\n  const util$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    getColumnsFromData,\n    getPresenterStyle,\n    getStats,\n    inferAll,\n    isInternalFieldName\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const dualPairs = [\n    [dualColorSchemeColors.black, dualColorSchemeColors.gray],\n    [dualColorSchemeColors.red, dualColorSchemeColors.green],\n    [dualColorSchemeColors.red, dualColorSchemeColors.blue],\n    [dualColorSchemeColors.black, dualColorSchemeColors.red],\n    [dualColorSchemeColors.black, dualColorSchemeColors.orange],\n    [dualColorSchemeColors.black, dualColorSchemeColors.green]\n  ];\n  const colorSchemes = [\n    {\n      scheme: ColorScaleNone,\n      colors: [defaultViewerOptions$1.colors.defaultCube]\n    }\n  ];\n  createDualColorSchemes();\n  function registerColorSchemes(vega2) {\n    colorSchemes.forEach((cs) => {\n      if (cs.colors.length === 1) {\n        vega2.scheme(cs.scheme, (x2) => cs.colors[0]);\n      } else {\n        vega2.scheme(cs.scheme, cs.colors);\n      }\n    });\n  }\n  function createPair(names, colors2) {\n    const scheme2 = `dual_${names[0]}${names[1]}`;\n    colorSchemes.push({ scheme: scheme2, colors: colors2 });\n  }\n  function createDualColorSchemes() {\n    dualPairs.forEach((colors2) => {\n      const names = colors2.map((color2) => {\n        for (const key2 in dualColorSchemeColors)\n          if (color2 === dualColorSchemeColors[key2])\n            return key2;\n      });\n      createPair(names, colors2);\n      createPair([...names].reverse(), [...colors2].reverse());\n    });\n  }\n  var DataLayoutChange;\n  (function(DataLayoutChange2) {\n    DataLayoutChange2[DataLayoutChange2[\"same\"] = 0] = \"same\";\n    DataLayoutChange2[DataLayoutChange2[\"reset\"] = 1] = \"reset\";\n    DataLayoutChange2[DataLayoutChange2[\"refine\"] = 2] = \"refine\";\n  })(DataLayoutChange || (DataLayoutChange = {}));\n  class Animator {\n    constructor(dataScope, props) {\n      this.dataScope = dataScope;\n      this.props = props;\n    }\n    select(search) {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.select(search);\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    deselect() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deselect();\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    filter(search, keepData, collapseData, rebase) {\n      if (rebase) {\n        this.dataScope.collapse(false, keepData);\n      }\n      this.dataScope.collapse(true, collapseData);\n      return new Promise((resolve2, reject) => {\n        this.props.onAnimateDataChange(DataLayoutChange.refine, \"before refine\", \"refine\").then(() => {\n          this.dataScope.deselect();\n          this.dataScope.setFilteredData(keepData);\n          this.props.onDataChanged(DataLayoutChange.refine, search);\n          resolve2();\n        }).catch(reject);\n      });\n    }\n    reset() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deselect();\n        let time2;\n        if (!this.dataScope.hasFilteredData()) {\n          time2 = 0;\n        } else {\n          this.dataScope.setFilteredData(null);\n        }\n        this.props.onAnimateDataChange(DataLayoutChange.reset, \"before reset\", \"reset\", time2).then(() => {\n          this.dataScope.collapse(false);\n          this.props.onDataChanged(DataLayoutChange.reset);\n          resolve2();\n        }).catch(reject);\n      });\n    }\n    activate(datum2) {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.activate(datum2);\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    deactivate() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deactivate();\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n  }\n  function notNice(niceValue) {\n    return (niceValue + \"\").replace(/[\\s,]/g, \"\");\n  }\n  function tickValue(axis, i) {\n    const tick = axis.tickText[i];\n    let value2;\n    if (tick) {\n      value2 = axis.tickText[i].value;\n    }\n    return { tick, value: value2 };\n  }\n  function selectNullOrEmpty(column) {\n    const searchExpression = {\n      name: column.name,\n      operator: \"isnullorEmpty\"\n    };\n    return searchExpression;\n  }\n  function selectExact(column, value2) {\n    if (value2 == null) {\n      return selectNullOrEmpty(column);\n    }\n    const searchExpression = {\n      name: column.name,\n      operator: \"==\",\n      value: value2\n    };\n    return searchExpression;\n  }\n  function selectNone(column, values2) {\n    const expressions = values2.map((value2, i) => {\n      const searchExpression = {\n        name: column.name,\n        operator: \"!=\",\n        value: value2\n      };\n      if (i) {\n        searchExpression.clause = \"&&\";\n      }\n      return searchExpression;\n    });\n    const searchExpressionGroup = {\n      expressions\n    };\n    return searchExpressionGroup;\n  }\n  function selectExactAxis(axis, column, i) {\n    const result = tickValue(axis, i);\n    if (result.tick) {\n      return selectExact(column, result.value);\n    }\n  }\n  function selectBetween(column, lowValue, highValue, lowOperator = \">=\", highOperator = \"<\") {\n    const expressions = [];\n    if (lowValue !== void 0) {\n      expressions.push({\n        name: column.name,\n        operator: lowOperator,\n        value: lowValue\n      });\n    }\n    if (highValue !== void 0) {\n      expressions.push({\n        name: column.name,\n        operator: highOperator,\n        value: highValue\n      });\n    }\n    if (expressions.length > 1) {\n      expressions[1].clause = \"&&\";\n    }\n    const searchExpressionGroup = {\n      expressions\n    };\n    return searchExpressionGroup;\n  }\n  function selectBetweenAxis(axis, column, i) {\n    const low = tickValue(axis, i);\n    const high = tickValue(axis, i + 1);\n    return selectBetween(column, low.value, high.value);\n  }\n  const dimToRole = {\n    0: \"x\",\n    1: \"y\",\n    2: \"z\"\n  };\n  const roleToDim = {\n    x: 0,\n    y: 1,\n    z: 1\n  };\n  class AxisSelection {\n    constructor(specCapabilities, columns, stage) {\n      this.specCapabilities = specCapabilities;\n      this.columns = columns;\n      this.stage = stage;\n    }\n    convert(divisions) {\n      const searchRoles = [];\n      divisions.forEach((division, i) => {\n        const role = dimToRole[i];\n        const axes = this.stage.axes[role];\n        const axis = axes.filter((axis2) => axis2.tickText.length)[0];\n        if (axis) {\n          const capabilities2 = this.specCapabilities.roles.filter((r) => r.role === role)[0];\n          const column = this.columns[role];\n          if (division >= 0 && (capabilities2 === null || capabilities2 === void 0 ? void 0 : capabilities2.axisSelection)) {\n            searchRoles.push({\n              axis,\n              role,\n              capabilities: capabilities2,\n              column,\n              division\n            });\n          }\n        }\n      });\n      switch (searchRoles.length) {\n        case 0: {\n          return null;\n        }\n        case 1: {\n          return this.getSearchFromSearchRole(searchRoles[0]);\n        }\n        default: {\n          const roles = searchRoles.map((searchRole) => this.getSearchFromSearchRole(searchRole));\n          roles.forEach((role, i) => {\n            if (i === 0)\n              return;\n            role.clause = \"&&\";\n          });\n          return roles;\n        }\n      }\n    }\n    getSearchFromSearchRole(searchRole) {\n      const getSearch = searchRole.capabilities.axisSelection === \"exact\" ? (a2, c2, i) => ({ expressions: [selectExactAxis(a2, c2, i)] }) : selectBetweenAxis;\n      const { axis, column, division } = searchRole;\n      return getSearch(axis, column, division);\n    }\n  }\n  function moveTicksBetween(axes) {\n    axes.forEach((axis) => {\n      if (axis.ticks.length === 0)\n        return;\n      const dim = roleToDim[axis.axisRole];\n      const { color: color2 } = axis.ticks[0];\n      const newLine = (value2) => {\n        const line2 = {\n          sourcePosition: [0, 0, 0],\n          targetPosition: [0, 0, 0],\n          color: color2\n        };\n        line2.sourcePosition[dim] = value2;\n        return line2;\n      };\n      const newTicks = [];\n      newTicks.push(newLine(axis.domain.sourcePosition[dim]));\n      for (let i = 1; i < axis.ticks.length; i++) {\n        newTicks.push(newLine((axis.ticks[i].sourcePosition[dim] + axis.ticks[i - 1].sourcePosition[dim]) / 2));\n      }\n      newTicks.push(newLine(axis.domain.targetPosition[dim]));\n      axis.ticks = newTicks;\n    });\n  }\n  function populateColorContext(colorContext, presenter) {\n    if (!colorContext.colorMap) {\n      colorContext.colorMap = presenter.morphChartsRenderResult.getCubeLayer().unitColorMap;\n    }\n    colorContext.legend = clone(presenter.stage.legend);\n    colorContext.legendElement = presenter.getElement(PresenterElement$1.legend).children[0];\n  }\n  let DataScope$2 = class DataScope {\n    constructor() {\n      this.filteredColumnsStats = {};\n    }\n    setData(data2, columns) {\n      const differentData = this.data !== data2;\n      if (differentData) {\n        if (this.data) {\n          this.deselect();\n        }\n        this.data = data2;\n        this.columns = columns;\n        this.filteredData = null;\n        this.filteredColumnsStats = {};\n      }\n      return differentData;\n    }\n    setFilteredData(filteredData) {\n      this.filteredData = filteredData;\n      this.filteredColumnsStats = {};\n    }\n    getColumns(columnTypes) {\n      if (!this.columns) {\n        this.columns = getColumnsFromData(base$3.vega.inferTypes, this.data, columnTypes);\n      }\n      return this.columns;\n    }\n    getFilteredColumnStats(columnName) {\n      if (!this.filteredColumnsStats[columnName]) {\n        this.filteredColumnsStats[columnName] = getStats(this.filteredData, this.columns.filter((c2) => c2.name === columnName)[0]);\n      }\n      return this.filteredColumnsStats[columnName];\n    }\n    currentData() {\n      return this.filteredData || this.data;\n    }\n    select(search) {\n      this.deselect();\n      if (search) {\n        this.selection = this.createUserSelection(search, true, false);\n        if (this.selection.included.length) {\n          this.activate(this.selection.included[0]);\n        }\n      }\n    }\n    createUserSelection(search, assign2, rebase) {\n      const exec = new Exec(search, this.getColumns());\n      const s2 = {\n        search,\n        included: [],\n        excluded: []\n      };\n      const data2 = rebase ? this.data : this.currentData();\n      data2.forEach((datum2) => {\n        if (exec.run(datum2)) {\n          if (assign2) {\n            datum2[FieldNames.Selected] = true;\n          }\n          s2.included.push(datum2);\n        } else {\n          s2.excluded.push(datum2);\n        }\n      });\n      return s2;\n    }\n    deselect() {\n      this.deactivate();\n      this.data.forEach((datum2) => {\n        delete datum2[FieldNames.Selected];\n      });\n      this.selection = null;\n    }\n    hasFilteredData() {\n      return !!this.filteredData;\n    }\n    hasSelectedData() {\n      return !!this.selection;\n    }\n    collapse(collapsed, data2 = this.data) {\n      data2.forEach((datum2) => {\n        datum2[FieldNames.Collapsed] = collapsed;\n      });\n      this.isCollapsed = collapsed;\n    }\n    activate(datum2) {\n      this.deactivate();\n      datum2[FieldNames.Active] = true;\n      this.active = datum2;\n    }\n    deactivate() {\n      if (this.active) {\n        delete this.active[FieldNames.Active];\n      }\n      this.active = null;\n    }\n    ordinalIndexWithinSelection(ordinal2) {\n      if (this.selection) {\n        for (let i = 0; i < this.selection.included.length; i++) {\n          const datum2 = this.selection.included[i];\n          if (datum2[GL_ORDINAL] === ordinal2) {\n            return { datum: datum2, index: i };\n          }\n        }\n      }\n      return { datum: null, index: -1 };\n    }\n    finalize() {\n      this.data = null;\n      this.filteredData = null;\n      this.filteredColumnsStats = null;\n      if (this.selection) {\n        this.selection.excluded = null;\n        this.selection.included = null;\n        this.selection = null;\n      }\n    }\n  };\n  var Action;\n  (function(Action2) {\n    Action2[Action2[\"deselect\"] = 0] = \"deselect\";\n    Action2[Action2[\"isolate\"] = 1] = \"isolate\";\n    Action2[Action2[\"exclude\"] = 2] = \"exclude\";\n    Action2[Action2[\"reset\"] = 3] = \"reset\";\n    Action2[Action2[\"next\"] = 4] = \"next\";\n    Action2[Action2[\"previous\"] = 5] = \"previous\";\n  })(Action || (Action = {}));\n  class Details {\n    constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n      this.language = language;\n      this.animator = animator;\n      this.dataScope = dataScope;\n      this.colorMapHandler = colorMapHandler;\n      this.hasColorMaps = hasColorMaps;\n      this.element = addDiv(parentElement, `${cssPrefix}unitControls`);\n      this.clear();\n    }\n    finalize() {\n      if (this.element)\n        this.element.innerHTML = \"\";\n      this.dataScope = null;\n      this.element = null;\n    }\n    clear() {\n      this.state = {\n        userSelection: null,\n        index: -1,\n        remapColor: false\n      };\n      this.render();\n    }\n    clearSelection() {\n      this.state.userSelection = null;\n      this.state.index = -1;\n      this.render();\n    }\n    populate(userSelection, index2 = 0) {\n      this.state.userSelection = userSelection;\n      this.state.index = index2;\n      this.render();\n    }\n    selectByNameValue(columnName, value2) {\n      const search = {\n        name: columnName,\n        operator: \"==\",\n        value: value2\n      };\n      this.clearSelection();\n      this.animator.select(search);\n      this.populate(this.dataScope.selection);\n    }\n    remapChanged(remap) {\n      this.state.remapColor = remap;\n      this.colorMapHandler(remap);\n      this.render();\n    }\n    handleAction(action) {\n      let p;\n      const u2 = this.state.userSelection;\n      switch (action) {\n        case Action.deselect: {\n          this.clearSelection();\n          p = this.animator.deselect();\n          break;\n        }\n        case Action.exclude: {\n          this.clearSelection();\n          p = this.animator.filter(invert$2(u2.search), u2.excluded, u2.included, false);\n          this.state.remapColor = false;\n          break;\n        }\n        case Action.isolate: {\n          this.clearSelection();\n          p = this.animator.filter(u2.search, u2.included, u2.excluded, false);\n          this.state.remapColor = false;\n          break;\n        }\n        case Action.reset: {\n          this.clear();\n          p = this.animator.reset();\n          break;\n        }\n        default: {\n          switch (action) {\n            case Action.previous: {\n              this.state.index--;\n              if (this.state.index < 0) {\n                this.state.index = this.state.userSelection.included.length - 1;\n              }\n              break;\n            }\n            case Action.next: {\n              this.state.index++;\n              if (this.state.index >= this.state.userSelection.included.length) {\n                this.state.index = 0;\n              }\n              break;\n            }\n          }\n          this.render();\n          p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n      }\n      p.then(() => this.render());\n    }\n    render() {\n      const hasRefinedData = this.dataScope.hasFilteredData();\n      const renderProps = {\n        language: this.language,\n        actionHandler: (action) => this.handleAction(action),\n        selectionHandler: (columnName, value2) => this.selectByNameValue(columnName, value2),\n        count: this.state.userSelection && this.state.userSelection.included.length,\n        hasRefinedData,\n        item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n        remapColorHandler: (remap) => this.remapChanged(remap),\n        hasColorMaps: this.hasColorMaps() && hasRefinedData,\n        remapColor: this.state.remapColor\n      };\n      const a2 = getActiveElementInfo();\n      mount(renderDetails(renderProps), this.element);\n      setActiveElement(a2);\n    }\n  }\n  const renderDetails = (props) => {\n    const controlButtons = [\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.deselect) }, props.language.deselect),\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.isolate) }, props.language.isolate),\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.exclude) }, props.language.exclude)\n    ];\n    const colorMapping2 = createElement(\n      \"div\",\n      null,\n      createElement(\"button\", { disabled: props.remapColor, onClick: (e) => props.remapColorHandler(true) }, props.language.newColorMap),\n      createElement(\"button\", { disabled: !props.remapColor, onClick: (e) => props.remapColorHandler(false) }, props.language.oldColorMap)\n    );\n    const singleItem = props.count === 1;\n    const scrollButtons = [\n      createElement(\"button\", { disabled: singleItem, onClick: (e) => props.actionHandler(Action.previous) }, props.language.previousDetail),\n      createElement(\"button\", { disabled: singleItem, onClick: (e) => props.actionHandler(Action.next) }, props.language.nextDetail),\n      createElement(\n        \"span\",\n        null,\n        \" \",\n        props.language.selectionCount(props.count)\n      )\n    ];\n    const rows = [];\n    for (const prop in props.item) {\n      if (prop === GL_ORDINAL) {\n        continue;\n      }\n      if (isInternalFieldName(prop)) {\n        continue;\n      }\n      rows.push({\n        cells: [\n          { content: prop },\n          { content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler) }\n        ]\n      });\n    }\n    return createElement(\n      \"div\",\n      null,\n      props.hasColorMaps && colorMapping2,\n      createElement(\"h4\", null, props.language.headers.selection),\n      createElement(\n        \"div\",\n        { className: `${cssPrefix}selection` },\n        controlButtons,\n        createElement(\"button\", { disabled: !props.hasRefinedData, onClick: (e) => props.actionHandler(Action.reset) }, \"reset\")\n      ),\n      props.item && createElement(\"h4\", null, props.language.headers.details),\n      createElement(\n        \"div\",\n        null,\n        createElement(\"div\", { className: `${cssPrefix}details-scroll` }, props.item && scrollButtons),\n        createElement(\"div\", { className: `${cssPrefix}details` }, props.item && createElement(Table$1, { rows }))\n      )\n    );\n  };\n  function linkSelect(language, columnName, value2, selectionHandler) {\n    return createElement(\n      \"span\",\n      null,\n      createElement(\"a\", { href: \"#\", onClick: (e) => selectionHandler(columnName, value2) }, value2),\n      isNaN(value2) ? [\" \", createElement(\"a\", { className: \"bing-search\", href: `https://www.bing.com/search?q=${encodeURIComponent(value2)}`, target: \"_blank\" }, language.bing)] : \"\"\n    );\n  }\n  function ensureHeaders(presenter, headers) {\n    const vegaControls = presenter.getElement(PresenterElement$1.vegaControls);\n    conditionalHeader(!!vegaControls.querySelectorAll(\".vega-bindings > *\").length, vegaControls, headers.chart);\n    const legend2 = presenter.getElement(PresenterElement$1.legend);\n    conditionalHeader(!!legend2.children.length, legend2, headers.legend);\n  }\n  function conditionalHeader(condition, element2, header) {\n    const existing = existingHeader(element2, header);\n    if (condition && !existing) {\n      addHeader(element2, header);\n    }\n    if (!condition && existing) {\n      existing.remove();\n    }\n  }\n  function addHeader(element2, header) {\n    const h2 = document.createElement(\"h4\");\n    h2.innerHTML = header;\n    element2.insertAdjacentElement(\"beforebegin\", h2);\n  }\n  function existingHeader(element2, header) {\n    const { previousElementSibling } = element2;\n    if (previousElementSibling && previousElementSibling.innerHTML === header) {\n      return previousElementSibling;\n    }\n  }\n  function legendRange(colorBinType, column, legend2, clickedIndex) {\n    if (column.quantitative) {\n      return selectQuantitative(colorBinType, column, legend2, clickedIndex);\n    } else {\n      return selectCategorical(column, legend2, clickedIndex);\n    }\n  }\n  function selectCategorical(column, legend2, clickedIndex) {\n    const value2 = legend2.rows[clickedIndex].value;\n    if (value2 === Other) {\n      const values2 = [];\n      for (const i in legend2.rows) {\n        if (+i !== clickedIndex) {\n          values2.push(legend2.rows[i].value);\n        }\n      }\n      return selectNone(column, values2);\n    } else {\n      return { expressions: [selectExact(column, legend2.rows[clickedIndex].value)] };\n    }\n  }\n  function selectQuantitative(colorBinType, column, legend2, clickedIndex) {\n    const keys2 = Object.keys(legend2.rows).map((key2) => +key2).sort((a2, b2) => +a2 - +b2);\n    let lowValue;\n    let lowOperator;\n    let highValue;\n    let highOperator;\n    const rowText = legend2.rows[clickedIndex].label;\n    switch (colorBinType) {\n      case \"continuous\": {\n        lowValue = rowText;\n        if (clickedIndex < keys2.length - 1) {\n          highValue = legend2.rows[clickedIndex + 1].value;\n        }\n        break;\n      }\n      default: {\n        if (rowText.indexOf(\"null\") > 0) {\n          const ex = {\n            expressions: [selectNullOrEmpty(column)]\n          };\n          return ex;\n        }\n        const dash = rowText.indexOf(\"–\");\n        if (dash > 0) {\n          lowValue = rowText.substr(0, dash);\n          highValue = rowText.substr(dash + 1);\n        } else {\n          if (rowText.indexOf(\"<\") >= 0) {\n            highValue = rowText.substring(2);\n          } else {\n            if (rowText.indexOf(\"≥\") >= 0) {\n              lowValue = rowText.substring(2);\n            }\n          }\n        }\n      }\n    }\n    if (lowValue)\n      lowValue = notNice(lowValue);\n    if (highValue)\n      highValue = notNice(highValue);\n    if (lowValue === highValue) {\n      return { expressions: [selectExact(column, lowValue)] };\n    } else {\n      return selectBetween(column, lowValue, highValue, lowOperator, highOperator);\n    }\n  }\n  function finalizeLegend(colorBinType, colorColumn, legend2, language) {\n    const rowTexts = [];\n    for (const i in legend2.rows) {\n      const row = legend2.rows[i];\n      row.search = legendRange(colorBinType, colorColumn, legend2, +i);\n      if (row.value === Other) {\n        row.label = language.legendOther;\n      } else {\n        rowTexts.push(row.value);\n      }\n    }\n  }\n  function assignOrdinals(columns, data2, ordinalMap) {\n    const uCol = columns.uid && columns.uid.name;\n    if (ordinalMap) {\n      data2.forEach((d2, i) => {\n        const key2 = uCol ? d2[uCol] : i;\n        d2[GL_ORDINAL] = ordinalMap[key2];\n      });\n    } else {\n      ordinalMap = {};\n      data2.forEach((d2, i) => {\n        d2[GL_ORDINAL] = i;\n        const uColValue = uCol ? d2[uCol] : i;\n        ordinalMap[uColValue] = i;\n      });\n    }\n    return ordinalMap;\n  }\n  function getDataIndexOfCube(cube, data2) {\n    const len2 = data2.length;\n    for (let i = 0; i < len2; i++) {\n      if (data2[i][GL_ORDINAL] === cube.ordinal) {\n        return i;\n      }\n    }\n  }\n  const { push } = util$4;\n  function getSearchGroupFromVegaValue(search) {\n    let group2;\n    const vegaSearch = search;\n    if (Array.isArray(vegaSearch)) {\n      group2 = { expressions: [] };\n      vegaSearch.forEach((g) => {\n        const clonedExpressions = clone(g.expressions).filter(Boolean);\n        clonedExpressions[0].clause = \"&&\";\n        push(group2.expressions, clonedExpressions);\n      });\n    } else {\n      group2 = vegaSearch ? { expressions: vegaSearch.expressions.filter(Boolean) } : null;\n    }\n    return group2;\n  }\n  function applySignalValues(sv, b2) {\n    if (!sv || !b2 || !b2.signals || !b2.signals.length)\n      return;\n    for (const key2 in sv) {\n      const value2 = sv[key2];\n      const signalB = b2.signals.filter((signal) => signal.name === key2)[0];\n      if (signalB && signalB.bind) {\n        signalB.value = value2;\n      }\n    }\n  }\n  function extractSignalValuesFromView(view, spec) {\n    if (!view || !spec || !spec.signals || !spec.signals.length)\n      return;\n    const result = {};\n    spec.signals.forEach((signalA) => {\n      if (signalA.bind) {\n        try {\n          result[signalA.name] = view.signal(signalA.name);\n        } catch (e) {\n        }\n      }\n    });\n    return result;\n  }\n  const hideSignalUI = [\n    SignalNames.MarkOpacity,\n    SignalNames.TextAngleX,\n    SignalNames.TextAngleY\n  ];\n  function unbindSignalUI(spec) {\n    spec.signals.forEach((signal) => {\n      if (hideSignalUI.indexOf(signal.name) >= 0) {\n        delete signal.bind;\n      }\n    });\n  }\n  const { outerSize } = util$4;\n  const { Table } = controls;\n  let Tooltip$1 = class Tooltip {\n    constructor(props) {\n      this.props = props;\n      const renderProps = {\n        cssPrefix: props.cssPrefix,\n        rows: getRows(props.dataItem)\n      };\n      this.finalizeHandler = () => this.destroy();\n      this.element = renderTooltip(renderProps);\n      if (this.element) {\n        this.element.style.position = \"absolute\";\n        this.child = this.element.firstChild;\n        document.body.appendChild(this.element);\n        let m2 = outerSize(this.child);\n        while (m2.height > document.documentElement.clientHeight) {\n          const tr2 = this.child.querySelector(\"tr:last-child\");\n          if (tr2) {\n            tr2.parentElement.removeChild(tr2);\n          } else {\n            break;\n          }\n          m2 = outerSize(this.child);\n        }\n        let position2;\n        const te = props.event;\n        if (te.touches) {\n          position2 = te[0];\n        } else {\n          const pme = props.event;\n          position2 = pme;\n        }\n        if (position2.clientX + m2.width >= document.documentElement.clientWidth) {\n          this.child.style.right = \"0\";\n        }\n        let moveTop = true;\n        if (position2.clientY + m2.height >= document.documentElement.clientHeight) {\n          if (position2.clientY - m2.height > 0) {\n            this.child.style.bottom = \"0\";\n          } else {\n            moveTop = false;\n          }\n        }\n        if (moveTop) {\n          this.element.style.top = `${position2.clientY}px`;\n        }\n        this.element.style.left = `${position2.clientX}px`;\n        this.child.addEventListener(\"mouseenter\", this.finalizeHandler);\n        this.child.addEventListener(\"mousemove\", this.finalizeHandler);\n        this.child.addEventListener(\"mouseover\", this.finalizeHandler);\n      }\n    }\n    destroy() {\n      this.child.removeEventListener(\"mouseenter\", this.finalizeHandler);\n      this.child.removeEventListener(\"mousemove\", this.finalizeHandler);\n      this.child.removeEventListener(\"mouseover\", this.finalizeHandler);\n      if (this.element) {\n        document.body.removeChild(this.element);\n      }\n      this.element = null;\n    }\n  };\n  function cleanDataItem(item) {\n    const ret = {};\n    for (const columnName in item) {\n      if (columnName === GL_ORDINAL) {\n        continue;\n      }\n      if (isInternalFieldName(columnName)) {\n        continue;\n      }\n      ret[columnName] = item[columnName];\n    }\n    return ret;\n  }\n  function getRows(item) {\n    const rows = [];\n    for (const columnName in item) {\n      const value2 = item[columnName];\n      let content2;\n      switch (value2) {\n        case null:\n          content2 = createElement(\"i\", null, \"null\");\n          break;\n        case void 0:\n          content2 = createElement(\"i\", null, \"undefined\");\n          break;\n        default:\n          content2 = value2.toString();\n      }\n      rows.push({\n        cells: [\n          { content: columnName + \":\" },\n          { content: content2 }\n        ]\n      });\n    }\n    return rows;\n  }\n  const renderTooltip = (props) => {\n    return props.rows.length === 0 ? null : createElement(\"div\", { className: `${props.cssPrefix}tooltip` }, Table({ rows: props.rows }));\n  };\n  class CharacterSet {\n    resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n      if (forceNewCharacterSet || needsNewCharacterSet(oldInsight, newInsight)) {\n        this.chars = void 0;\n      }\n    }\n    getCharacterSet(stage) {\n      if (!this.chars) {\n        const map2 = {};\n        const addText = (text2) => {\n          Array.from(text2).forEach((char) => {\n            map2[char] = true;\n          });\n        };\n        stage.textData.forEach((t) => addText(t.text));\n        const { x: x2, y: y2 } = stage.axes;\n        [x2, y2].forEach((axes) => {\n          axes.forEach((axis) => {\n            if (axis.tickText)\n              axis.tickText.forEach((t) => addText(t.text));\n            if (axis.title)\n              addText(axis.title.text);\n          });\n        });\n        this.chars = Object.keys(map2);\n      }\n      return this.chars;\n    }\n  }\n  function needsNewCharacterSet(oldInsight, newInsight) {\n    if (!oldInsight)\n      return true;\n    if (!newInsight)\n      return true;\n    if (oldInsight.chart !== newInsight.chart)\n      return true;\n    if (oldInsight.facetStyle !== newInsight.facetStyle)\n      return true;\n    if (oldInsight.totalStyle !== newInsight.totalStyle)\n      return true;\n    if (oldInsight.hideAxes !== newInsight.hideAxes)\n      return true;\n    if (differentObjectValues(oldInsight.signalValues, newInsight.signalValues))\n      return true;\n    if (differentObjectValues(oldInsight.size, newInsight.size))\n      return true;\n    const oldColumns = oldInsight.columns;\n    const newColumns = newInsight.columns;\n    if (oldColumns.facet !== newColumns.facet)\n      return true;\n    if (oldColumns.facetV !== newColumns.facetV)\n      return true;\n    if (oldColumns.x !== newColumns.x)\n      return true;\n    if (oldColumns.y !== newColumns.y)\n      return true;\n    if (oldColumns.z !== newColumns.z)\n      return true;\n    return false;\n  }\n  function differentObjectValues(a2, b2) {\n    if (!a2 && !b2)\n      return false;\n    if (!a2 || !b2)\n      return true;\n    const keys2 = Object.keys(b2);\n    for (let i = 0; i < keys2.length; i++) {\n      const key2 = keys2[i];\n      const ta = typeof a2;\n      const tb = typeof b2;\n      if (ta !== tb)\n        return true;\n      if (ta === \"object\") {\n        return differentObjectValues(a2[key2], b2[key2]);\n      } else {\n        if (a2[key2] !== b2[key2])\n          return true;\n      }\n    }\n    return false;\n  }\n  function ascending$2(a2, b2) {\n    return a2 == null || b2 == null ? NaN : a2 < b2 ? -1 : a2 > b2 ? 1 : a2 >= b2 ? 0 : NaN;\n  }\n  function descending$1(a2, b2) {\n    return a2 == null || b2 == null ? NaN : b2 < a2 ? -1 : b2 > a2 ? 1 : b2 >= a2 ? 0 : NaN;\n  }\n  function bisector(f) {\n    let compare12, compare2, delta;\n    if (f.length !== 2) {\n      compare12 = ascending$2;\n      compare2 = (d2, x2) => ascending$2(f(d2), x2);\n      delta = (d2, x2) => f(d2) - x2;\n    } else {\n      compare12 = f === ascending$2 || f === descending$1 ? f : zero$3;\n      compare2 = f;\n      delta = f;\n    }\n    function left(a2, x2, lo = 0, hi = a2.length) {\n      if (lo < hi) {\n        if (compare12(x2, x2) !== 0) return hi;\n        do {\n          const mid = lo + hi >>> 1;\n          if (compare2(a2[mid], x2) < 0) lo = mid + 1;\n          else hi = mid;\n        } while (lo < hi);\n      }\n      return lo;\n    }\n    function right(a2, x2, lo = 0, hi = a2.length) {\n      if (lo < hi) {\n        if (compare12(x2, x2) !== 0) return hi;\n        do {\n          const mid = lo + hi >>> 1;\n          if (compare2(a2[mid], x2) <= 0) lo = mid + 1;\n          else hi = mid;\n        } while (lo < hi);\n      }\n      return lo;\n    }\n    function center(a2, x2, lo = 0, hi = a2.length) {\n      const i = left(a2, x2, lo, hi - 1);\n      return i > lo && delta(a2[i - 1], x2) > -delta(a2[i], x2) ? i - 1 : i;\n    }\n    return { left, center, right };\n  }\n  function zero$3() {\n    return 0;\n  }\n  function number$6(x2) {\n    return x2 === null ? NaN : +x2;\n  }\n  function* numbers$2(values2, valueof) {\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    }\n  }\n  const ascendingBisect = bisector(ascending$2);\n  const bisectRight$1 = ascendingBisect.right;\n  const bisectLeft$1 = ascendingBisect.left;\n  bisector(number$6).center;\n  function variance(values2, valueof) {\n    let count2 = 0;\n    let delta;\n    let mean2 = 0;\n    let sum2 = 0;\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          delta = value2 - mean2;\n          mean2 += delta / ++count2;\n          sum2 += delta * (value2 - mean2);\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          delta = value2 - mean2;\n          mean2 += delta / ++count2;\n          sum2 += delta * (value2 - mean2);\n        }\n      }\n    }\n    if (count2 > 1) return sum2 / (count2 - 1);\n  }\n  function deviation(values2, valueof) {\n    const v = variance(values2, valueof);\n    return v ? Math.sqrt(v) : v;\n  }\n  class Adder {\n    constructor() {\n      this._partials = new Float64Array(32);\n      this._n = 0;\n    }\n    add(x2) {\n      const p = this._partials;\n      let i = 0;\n      for (let j = 0; j < this._n && j < 32; j++) {\n        const y2 = p[j], hi = x2 + y2, lo = Math.abs(x2) < Math.abs(y2) ? x2 - (hi - y2) : y2 - (hi - x2);\n        if (lo) p[i++] = lo;\n        x2 = hi;\n      }\n      p[i] = x2;\n      this._n = i + 1;\n      return this;\n    }\n    valueOf() {\n      const p = this._partials;\n      let n = this._n, x2, y2, lo, hi = 0;\n      if (n > 0) {\n        hi = p[--n];\n        while (n > 0) {\n          x2 = hi;\n          y2 = p[--n];\n          hi = x2 + y2;\n          lo = y2 - (hi - x2);\n          if (lo) break;\n        }\n        if (n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0)) {\n          y2 = lo * 2;\n          x2 = hi + y2;\n          if (y2 == x2 - hi) hi = x2;\n        }\n      }\n      return hi;\n    }\n  }\n  class InternMap extends Map {\n    constructor(entries, key2 = keyof) {\n      super();\n      Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key2 } });\n      if (entries != null) for (const [key3, value2] of entries) this.set(key3, value2);\n    }\n    get(key2) {\n      return super.get(intern_get(this, key2));\n    }\n    has(key2) {\n      return super.has(intern_get(this, key2));\n    }\n    set(key2, value2) {\n      return super.set(intern_set(this, key2), value2);\n    }\n    delete(key2) {\n      return super.delete(intern_delete(this, key2));\n    }\n  }\n  class InternSet extends Set {\n    constructor(values2, key2 = keyof) {\n      super();\n      Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key2 } });\n      if (values2 != null) for (const value2 of values2) this.add(value2);\n    }\n    has(value2) {\n      return super.has(intern_get(this, value2));\n    }\n    add(value2) {\n      return super.add(intern_set(this, value2));\n    }\n    delete(value2) {\n      return super.delete(intern_delete(this, value2));\n    }\n  }\n  function intern_get({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    return _intern.has(key2) ? _intern.get(key2) : value2;\n  }\n  function intern_set({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    if (_intern.has(key2)) return _intern.get(key2);\n    _intern.set(key2, value2);\n    return value2;\n  }\n  function intern_delete({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    if (_intern.has(key2)) {\n      value2 = _intern.get(key2);\n      _intern.delete(key2);\n    }\n    return value2;\n  }\n  function keyof(value2) {\n    return value2 !== null && typeof value2 === \"object\" ? value2.valueOf() : value2;\n  }\n  function permute(source2, keys2) {\n    return Array.from(keys2, (key2) => source2[key2]);\n  }\n  function compareDefined(compare2 = ascending$2) {\n    if (compare2 === ascending$2) return ascendingDefined;\n    if (typeof compare2 !== \"function\") throw new TypeError(\"compare is not a function\");\n    return (a2, b2) => {\n      const x2 = compare2(a2, b2);\n      if (x2 || x2 === 0) return x2;\n      return (compare2(b2, b2) === 0) - (compare2(a2, a2) === 0);\n    };\n  }\n  function ascendingDefined(a2, b2) {\n    return (a2 == null || !(a2 >= a2)) - (b2 == null || !(b2 >= b2)) || (a2 < b2 ? -1 : a2 > b2 ? 1 : 0);\n  }\n  const e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);\n  function tickSpec(start, stop2, count2) {\n    const step = (stop2 - start) / Math.max(0, count2), power = Math.floor(Math.log10(step)), error2 = step / Math.pow(10, power), factor = error2 >= e10 ? 10 : error2 >= e5 ? 5 : error2 >= e2 ? 2 : 1;\n    let i1, i2, inc;\n    if (power < 0) {\n      inc = Math.pow(10, -power) / factor;\n      i1 = Math.round(start * inc);\n      i2 = Math.round(stop2 * inc);\n      if (i1 / inc < start) ++i1;\n      if (i2 / inc > stop2) --i2;\n      inc = -inc;\n    } else {\n      inc = Math.pow(10, power) * factor;\n      i1 = Math.round(start / inc);\n      i2 = Math.round(stop2 / inc);\n      if (i1 * inc < start) ++i1;\n      if (i2 * inc > stop2) --i2;\n    }\n    if (i2 < i1 && 0.5 <= count2 && count2 < 2) return tickSpec(start, stop2, count2 * 2);\n    return [i1, i2, inc];\n  }\n  function ticks(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    if (!(count2 > 0)) return [];\n    if (start === stop2) return [start];\n    const reverse2 = stop2 < start, [i1, i2, inc] = reverse2 ? tickSpec(stop2, start, count2) : tickSpec(start, stop2, count2);\n    if (!(i2 >= i1)) return [];\n    const n = i2 - i1 + 1, ticks2 = new Array(n);\n    if (reverse2) {\n      if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) / -inc;\n      else for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) * inc;\n    } else {\n      if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) / -inc;\n      else for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) * inc;\n    }\n    return ticks2;\n  }\n  function tickIncrement(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    return tickSpec(start, stop2, count2)[2];\n  }\n  function tickStep(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    const reverse2 = stop2 < start, inc = reverse2 ? tickIncrement(stop2, start, count2) : tickIncrement(start, stop2, count2);\n    return (reverse2 ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n  }\n  function max$2(values2, valueof) {\n    let max2;\n    if (valueof === void 0) {\n      for (const value2 of values2) {\n        if (value2 != null && (max2 < value2 || max2 === void 0 && value2 >= value2)) {\n          max2 = value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (max2 < value2 || max2 === void 0 && value2 >= value2)) {\n          max2 = value2;\n        }\n      }\n    }\n    return max2;\n  }\n  function min$2(values2, valueof) {\n    let min2;\n    if (valueof === void 0) {\n      for (const value2 of values2) {\n        if (value2 != null && (min2 > value2 || min2 === void 0 && value2 >= value2)) {\n          min2 = value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (min2 > value2 || min2 === void 0 && value2 >= value2)) {\n          min2 = value2;\n        }\n      }\n    }\n    return min2;\n  }\n  function quickselect(array2, k, left = 0, right = Infinity, compare2) {\n    k = Math.floor(k);\n    left = Math.floor(Math.max(0, left));\n    right = Math.floor(Math.min(array2.length - 1, right));\n    if (!(left <= k && k <= right)) return array2;\n    compare2 = compare2 === void 0 ? ascendingDefined : compareDefined(compare2);\n    while (right > left) {\n      if (right - left > 600) {\n        const n = right - left + 1;\n        const m2 = k - left + 1;\n        const z2 = Math.log(n);\n        const s2 = 0.5 * Math.exp(2 * z2 / 3);\n        const sd = 0.5 * Math.sqrt(z2 * s2 * (n - s2) / n) * (m2 - n / 2 < 0 ? -1 : 1);\n        const newLeft = Math.max(left, Math.floor(k - m2 * s2 / n + sd));\n        const newRight = Math.min(right, Math.floor(k + (n - m2) * s2 / n + sd));\n        quickselect(array2, k, newLeft, newRight, compare2);\n      }\n      const t = array2[k];\n      let i = left;\n      let j = right;\n      swap$1(array2, left, k);\n      if (compare2(array2[right], t) > 0) swap$1(array2, left, right);\n      while (i < j) {\n        swap$1(array2, i, j), ++i, --j;\n        while (compare2(array2[i], t) < 0) ++i;\n        while (compare2(array2[j], t) > 0) --j;\n      }\n      if (compare2(array2[left], t) === 0) swap$1(array2, left, j);\n      else ++j, swap$1(array2, j, right);\n      if (j <= k) left = j + 1;\n      if (k <= j) right = j - 1;\n    }\n    return array2;\n  }\n  function swap$1(array2, i, j) {\n    const t = array2[i];\n    array2[i] = array2[j];\n    array2[j] = t;\n  }\n  function quantile$1(values2, p, valueof) {\n    values2 = Float64Array.from(numbers$2(values2, valueof));\n    if (!(n = values2.length) || isNaN(p = +p)) return;\n    if (p <= 0 || n < 2) return min$2(values2);\n    if (p >= 1) return max$2(values2);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = max$2(quickselect(values2, i0).subarray(0, i0 + 1)), value1 = min$2(values2.subarray(i0 + 1));\n    return value0 + (value1 - value0) * (i - i0);\n  }\n  function quantileSorted(values2, p, valueof = number$6) {\n    if (!(n = values2.length) || isNaN(p = +p)) return;\n    if (p <= 0 || n < 2) return +valueof(values2[0], 0, values2);\n    if (p >= 1) return +valueof(values2[n - 1], n - 1, values2);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values2[i0], i0, values2), value1 = +valueof(values2[i0 + 1], i0 + 1, values2);\n    return value0 + (value1 - value0) * (i - i0);\n  }\n  function mean(values2, valueof) {\n    let count2 = 0;\n    let sum2 = 0;\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          ++count2, sum2 += value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          ++count2, sum2 += value2;\n        }\n      }\n    }\n    if (count2) return sum2 / count2;\n  }\n  function median(values2, valueof) {\n    return quantile$1(values2, 0.5, valueof);\n  }\n  function* flatten(arrays) {\n    for (const array2 of arrays) {\n      yield* array2;\n    }\n  }\n  function merge$4(arrays) {\n    return Array.from(flatten(arrays));\n  }\n  function range$3(start, stop2, step) {\n    start = +start, stop2 = +stop2, step = (n = arguments.length) < 2 ? (stop2 = start, start = 0, 1) : n < 3 ? 1 : +step;\n    var i = -1, n = Math.max(0, Math.ceil((stop2 - start) / step)) | 0, range2 = new Array(n);\n    while (++i < n) {\n      range2[i] = start + i * step;\n    }\n    return range2;\n  }\n  function sum$1(values2, valueof) {\n    let sum2 = 0;\n    {\n      for (let value2 of values2) {\n        if (value2 = +value2) {\n          sum2 += value2;\n        }\n      }\n    }\n    return sum2;\n  }\n  function intersection(values2, ...others) {\n    values2 = new InternSet(values2);\n    others = others.map(set$4);\n    out: for (const value2 of values2) {\n      for (const other of others) {\n        if (!other.has(value2)) {\n          values2.delete(value2);\n          continue out;\n        }\n      }\n    }\n    return values2;\n  }\n  function set$4(values2) {\n    return values2 instanceof InternSet ? values2 : new InternSet(values2);\n  }\n  function union(...others) {\n    const set2 = new InternSet();\n    for (const other of others) {\n      for (const o of other) {\n        set2.add(o);\n      }\n    }\n    return set2;\n  }\n  function initRange(domain2, range2) {\n    switch (arguments.length) {\n      case 0:\n        break;\n      case 1:\n        this.range(domain2);\n        break;\n      default:\n        this.range(range2).domain(domain2);\n        break;\n    }\n    return this;\n  }\n  function initInterpolator(domain2, interpolator) {\n    switch (arguments.length) {\n      case 0:\n        break;\n      case 1: {\n        if (typeof domain2 === \"function\") this.interpolator(domain2);\n        else this.range(domain2);\n        break;\n      }\n      default: {\n        this.domain(domain2);\n        if (typeof interpolator === \"function\") this.interpolator(interpolator);\n        else this.range(interpolator);\n        break;\n      }\n    }\n    return this;\n  }\n  const implicit = Symbol(\"implicit\");\n  function ordinal() {\n    var index2 = new InternMap(), domain2 = [], range2 = [], unknown = implicit;\n    function scale2(d2) {\n      let i = index2.get(d2);\n      if (i === void 0) {\n        if (unknown !== implicit) return unknown;\n        index2.set(d2, i = domain2.push(d2) - 1);\n      }\n      return range2[i % range2.length];\n    }\n    scale2.domain = function(_) {\n      if (!arguments.length) return domain2.slice();\n      domain2 = [], index2 = new InternMap();\n      for (const value2 of _) {\n        if (index2.has(value2)) continue;\n        index2.set(value2, domain2.push(value2) - 1);\n      }\n      return scale2;\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), scale2) : range2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return ordinal(domain2, range2).unknown(unknown);\n    };\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function basis(t12, v0, v1, v2, v3) {\n    var t22 = t12 * t12, t32 = t22 * t12;\n    return ((1 - 3 * t12 + 3 * t22 - t32) * v0 + (4 - 6 * t22 + 3 * t32) * v1 + (1 + 3 * t12 + 3 * t22 - 3 * t32) * v2 + t32 * v3) / 6;\n  }\n  function basis$1(values2) {\n    var n = values2.length - 1;\n    return function(t) {\n      var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values2[i], v2 = values2[i + 1], v0 = i > 0 ? values2[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values2[i + 2] : 2 * v2 - v1;\n      return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n  }\n  function basisClosed(values2) {\n    var n = values2.length;\n    return function(t) {\n      var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values2[(i + n - 1) % n], v1 = values2[i % n], v2 = values2[(i + 1) % n], v3 = values2[(i + 2) % n];\n      return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n  }\n  const constant$5 = (x2) => () => x2;\n  function linear$2(a2, d2) {\n    return function(t) {\n      return a2 + t * d2;\n    };\n  }\n  function exponential(a2, b2, y2) {\n    return a2 = Math.pow(a2, y2), b2 = Math.pow(b2, y2) - a2, y2 = 1 / y2, function(t) {\n      return Math.pow(a2 + t * b2, y2);\n    };\n  }\n  function hue$1(a2, b2) {\n    var d2 = b2 - a2;\n    return d2 ? linear$2(a2, d2 > 180 || d2 < -180 ? d2 - 360 * Math.round(d2 / 360) : d2) : constant$5(isNaN(a2) ? b2 : a2);\n  }\n  function gamma(y2) {\n    return (y2 = +y2) === 1 ? nogamma : function(a2, b2) {\n      return b2 - a2 ? exponential(a2, b2, y2) : constant$5(isNaN(a2) ? b2 : a2);\n    };\n  }\n  function nogamma(a2, b2) {\n    var d2 = b2 - a2;\n    return d2 ? linear$2(a2, d2) : constant$5(isNaN(a2) ? b2 : a2);\n  }\n  const rgb = (function rgbGamma(y2) {\n    var color2 = gamma(y2);\n    function rgb2(start, end) {\n      var r = color2((start = rgb$1(start)).r, (end = rgb$1(end)).r), g = color2(start.g, end.g), b2 = color2(start.b, end.b), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.r = r(t);\n        start.g = g(t);\n        start.b = b2(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    }\n    rgb2.gamma = rgbGamma;\n    return rgb2;\n  })(1);\n  function rgbSpline(spline) {\n    return function(colors2) {\n      var n = colors2.length, r = new Array(n), g = new Array(n), b2 = new Array(n), i, color2;\n      for (i = 0; i < n; ++i) {\n        color2 = rgb$1(colors2[i]);\n        r[i] = color2.r || 0;\n        g[i] = color2.g || 0;\n        b2[i] = color2.b || 0;\n      }\n      r = spline(r);\n      g = spline(g);\n      b2 = spline(b2);\n      color2.opacity = 1;\n      return function(t) {\n        color2.r = r(t);\n        color2.g = g(t);\n        color2.b = b2(t);\n        return color2 + \"\";\n      };\n    };\n  }\n  var rgbBasis = rgbSpline(basis$1);\n  var rgbBasisClosed = rgbSpline(basisClosed);\n  function numberArray(a2, b2) {\n    if (!b2) b2 = [];\n    var n = a2 ? Math.min(b2.length, a2.length) : 0, c2 = b2.slice(), i;\n    return function(t) {\n      for (i = 0; i < n; ++i) c2[i] = a2[i] * (1 - t) + b2[i] * t;\n      return c2;\n    };\n  }\n  function isNumberArray(x2) {\n    return ArrayBuffer.isView(x2) && !(x2 instanceof DataView);\n  }\n  function array$5(a2, b2) {\n    return (isNumberArray(b2) ? numberArray : genericArray)(a2, b2);\n  }\n  function genericArray(a2, b2) {\n    var nb = b2 ? b2.length : 0, na = a2 ? Math.min(nb, a2.length) : 0, x2 = new Array(na), c2 = new Array(nb), i;\n    for (i = 0; i < na; ++i) x2[i] = interpolate$1(a2[i], b2[i]);\n    for (; i < nb; ++i) c2[i] = b2[i];\n    return function(t) {\n      for (i = 0; i < na; ++i) c2[i] = x2[i](t);\n      return c2;\n    };\n  }\n  function date$1(a2, b2) {\n    var d2 = /* @__PURE__ */ new Date();\n    return a2 = +a2, b2 = +b2, function(t) {\n      return d2.setTime(a2 * (1 - t) + b2 * t), d2;\n    };\n  }\n  function interpolateNumber(a2, b2) {\n    return a2 = +a2, b2 = +b2, function(t) {\n      return a2 * (1 - t) + b2 * t;\n    };\n  }\n  function object$1(a2, b2) {\n    var i = {}, c2 = {}, k;\n    if (a2 === null || typeof a2 !== \"object\") a2 = {};\n    if (b2 === null || typeof b2 !== \"object\") b2 = {};\n    for (k in b2) {\n      if (k in a2) {\n        i[k] = interpolate$1(a2[k], b2[k]);\n      } else {\n        c2[k] = b2[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c2[k] = i[k](t);\n      return c2;\n    };\n  }\n  var reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, reB = new RegExp(reA.source, \"g\");\n  function zero$2(b2) {\n    return function() {\n      return b2;\n    };\n  }\n  function one$2(b2) {\n    return function(t) {\n      return b2(t) + \"\";\n    };\n  }\n  function string(a2, b2) {\n    var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s2 = [], q = [];\n    a2 = a2 + \"\", b2 = b2 + \"\";\n    while ((am = reA.exec(a2)) && (bm = reB.exec(b2))) {\n      if ((bs = bm.index) > bi) {\n        bs = b2.slice(bi, bs);\n        if (s2[i]) s2[i] += bs;\n        else s2[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s2[i]) s2[i] += bm;\n        else s2[++i] = bm;\n      } else {\n        s2[++i] = null;\n        q.push({ i, x: interpolateNumber(am, bm) });\n      }\n      bi = reB.lastIndex;\n    }\n    if (bi < b2.length) {\n      bs = b2.slice(bi);\n      if (s2[i]) s2[i] += bs;\n      else s2[++i] = bs;\n    }\n    return s2.length < 2 ? q[0] ? one$2(q[0].x) : zero$2(b2) : (b2 = q.length, function(t) {\n      for (var i2 = 0, o; i2 < b2; ++i2) s2[(o = q[i2]).i] = o.x(t);\n      return s2.join(\"\");\n    });\n  }\n  function interpolate$1(a2, b2) {\n    var t = typeof b2, c2;\n    return b2 == null || t === \"boolean\" ? constant$5(b2) : (t === \"number\" ? interpolateNumber : t === \"string\" ? (c2 = color$2(b2)) ? (b2 = c2, rgb) : string : b2 instanceof color$2 ? rgb : b2 instanceof Date ? date$1 : isNumberArray(b2) ? numberArray : Array.isArray(b2) ? genericArray : typeof b2.valueOf !== \"function\" && typeof b2.toString !== \"function\" || isNaN(b2) ? object$1 : interpolateNumber)(a2, b2);\n  }\n  function discrete$1(range2) {\n    var n = range2.length;\n    return function(t) {\n      return range2[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n    };\n  }\n  function hue(a2, b2) {\n    var i = hue$1(+a2, +b2);\n    return function(t) {\n      var x2 = i(t);\n      return x2 - 360 * Math.floor(x2 / 360);\n    };\n  }\n  function interpolateRound(a2, b2) {\n    return a2 = +a2, b2 = +b2, function(t) {\n      return Math.round(a2 * (1 - t) + b2 * t);\n    };\n  }\n  var degrees$1 = 180 / Math.PI;\n  var identity$7 = {\n    translateX: 0,\n    translateY: 0,\n    rotate: 0,\n    skewX: 0,\n    scaleX: 1,\n    scaleY: 1\n  };\n  function decompose(a2, b2, c2, d2, e, f) {\n    var scaleX, scaleY2, skewX;\n    if (scaleX = Math.sqrt(a2 * a2 + b2 * b2)) a2 /= scaleX, b2 /= scaleX;\n    if (skewX = a2 * c2 + b2 * d2) c2 -= a2 * skewX, d2 -= b2 * skewX;\n    if (scaleY2 = Math.sqrt(c2 * c2 + d2 * d2)) c2 /= scaleY2, d2 /= scaleY2, skewX /= scaleY2;\n    if (a2 * d2 < b2 * c2) a2 = -a2, b2 = -b2, skewX = -skewX, scaleX = -scaleX;\n    return {\n      translateX: e,\n      translateY: f,\n      rotate: Math.atan2(b2, a2) * degrees$1,\n      skewX: Math.atan(skewX) * degrees$1,\n      scaleX,\n      scaleY: scaleY2\n    };\n  }\n  var svgNode;\n  function parseCss(value2) {\n    const m2 = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value2 + \"\");\n    return m2.isIdentity ? identity$7 : decompose(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f);\n  }\n  function parseSvg(value2) {\n    if (value2 == null) return identity$7;\n    if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n    svgNode.setAttribute(\"transform\", value2);\n    if (!(value2 = svgNode.transform.baseVal.consolidate())) return identity$7;\n    value2 = value2.matrix;\n    return decompose(value2.a, value2.b, value2.c, value2.d, value2.e, value2.f);\n  }\n  function interpolateTransform(parse2, pxComma, pxParen, degParen) {\n    function pop(s2) {\n      return s2.length ? s2.pop() + \" \" : \"\";\n    }\n    function translate2(xa, ya, xb, yb, s2, q) {\n      if (xa !== xb || ya !== yb) {\n        var i = s2.push(\"translate(\", null, pxComma, null, pxParen);\n        q.push({ i: i - 4, x: interpolateNumber(xa, xb) }, { i: i - 2, x: interpolateNumber(ya, yb) });\n      } else if (xb || yb) {\n        s2.push(\"translate(\" + xb + pxComma + yb + pxParen);\n      }\n    }\n    function rotate2(a2, b2, s2, q) {\n      if (a2 !== b2) {\n        if (a2 - b2 > 180) b2 += 360;\n        else if (b2 - a2 > 180) a2 += 360;\n        q.push({ i: s2.push(pop(s2) + \"rotate(\", null, degParen) - 2, x: interpolateNumber(a2, b2) });\n      } else if (b2) {\n        s2.push(pop(s2) + \"rotate(\" + b2 + degParen);\n      }\n    }\n    function skewX(a2, b2, s2, q) {\n      if (a2 !== b2) {\n        q.push({ i: s2.push(pop(s2) + \"skewX(\", null, degParen) - 2, x: interpolateNumber(a2, b2) });\n      } else if (b2) {\n        s2.push(pop(s2) + \"skewX(\" + b2 + degParen);\n      }\n    }\n    function scale2(xa, ya, xb, yb, s2, q) {\n      if (xa !== xb || ya !== yb) {\n        var i = s2.push(pop(s2) + \"scale(\", null, \",\", null, \")\");\n        q.push({ i: i - 4, x: interpolateNumber(xa, xb) }, { i: i - 2, x: interpolateNumber(ya, yb) });\n      } else if (xb !== 1 || yb !== 1) {\n        s2.push(pop(s2) + \"scale(\" + xb + \",\" + yb + \")\");\n      }\n    }\n    return function(a2, b2) {\n      var s2 = [], q = [];\n      a2 = parse2(a2), b2 = parse2(b2);\n      translate2(a2.translateX, a2.translateY, b2.translateX, b2.translateY, s2, q);\n      rotate2(a2.rotate, b2.rotate, s2, q);\n      skewX(a2.skewX, b2.skewX, s2, q);\n      scale2(a2.scaleX, a2.scaleY, b2.scaleX, b2.scaleY, s2, q);\n      a2 = b2 = null;\n      return function(t) {\n        var i = -1, n = q.length, o;\n        while (++i < n) s2[(o = q[i]).i] = o.x(t);\n        return s2.join(\"\");\n      };\n    };\n  }\n  var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\n  var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n  var epsilon2$1 = 1e-12;\n  function cosh(x2) {\n    return ((x2 = Math.exp(x2)) + 1 / x2) / 2;\n  }\n  function sinh(x2) {\n    return ((x2 = Math.exp(x2)) - 1 / x2) / 2;\n  }\n  function tanh(x2) {\n    return ((x2 = Math.exp(2 * x2)) - 1) / (x2 + 1);\n  }\n  const zoom$1 = (function zoomRho(rho, rho2, rho4) {\n    function zoom2(p02, p1) {\n      var ux0 = p02[0], uy0 = p02[1], w0 = p02[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n      if (d2 < epsilon2$1) {\n        S = Math.log(w1 / w0) / rho;\n        i = function(t) {\n          return [\n            ux0 + t * dx,\n            uy0 + t * dy,\n            w0 * Math.exp(rho * t * S)\n          ];\n        };\n      } else {\n        var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n        S = (r1 - r0) / rho;\n        i = function(t) {\n          var s2 = t * S, coshr0 = cosh(r0), u2 = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s2 + r0) - sinh(r0));\n          return [\n            ux0 + u2 * dx,\n            uy0 + u2 * dy,\n            w0 * coshr0 / cosh(rho * s2 + r0)\n          ];\n        };\n      }\n      i.duration = S * 1e3 * rho / Math.SQRT2;\n      return i;\n    }\n    zoom2.rho = function(_) {\n      var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n      return zoomRho(_1, _2, _4);\n    };\n    return zoom2;\n  })(Math.SQRT2, 2, 4);\n  function hsl(hue2) {\n    return function(start, end) {\n      var h2 = hue2((start = hsl$1(start)).h, (end = hsl$1(end)).h), s2 = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h2(t);\n        start.s = s2(t);\n        start.l = l(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    };\n  }\n  const hsl_default = hsl(hue$1);\n  var hslLong = hsl(nogamma);\n  function lab(start, end) {\n    var l = nogamma((start = lab$1(start)).l, (end = lab$1(end)).l), a2 = nogamma(start.a, end.a), b2 = nogamma(start.b, end.b), opacity2 = nogamma(start.opacity, end.opacity);\n    return function(t) {\n      start.l = l(t);\n      start.a = a2(t);\n      start.b = b2(t);\n      start.opacity = opacity2(t);\n      return start + \"\";\n    };\n  }\n  function hcl(hue2) {\n    return function(start, end) {\n      var h2 = hue2((start = hcl$1(start)).h, (end = hcl$1(end)).h), c2 = nogamma(start.c, end.c), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h2(t);\n        start.c = c2(t);\n        start.l = l(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    };\n  }\n  const hcl_default = hcl(hue$1);\n  var hclLong = hcl(nogamma);\n  function cubehelix(hue2) {\n    return (function cubehelixGamma(y2) {\n      y2 = +y2;\n      function cubehelix2(start, end) {\n        var h2 = hue2((start = cubehelix$1(start)).h, (end = cubehelix$1(end)).h), s2 = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n        return function(t) {\n          start.h = h2(t);\n          start.s = s2(t);\n          start.l = l(Math.pow(t, y2));\n          start.opacity = opacity2(t);\n          return start + \"\";\n        };\n      }\n      cubehelix2.gamma = cubehelixGamma;\n      return cubehelix2;\n    })(1);\n  }\n  const cubehelix_default = cubehelix(hue$1);\n  var cubehelixLong = cubehelix(nogamma);\n  function piecewise(interpolate2, values2) {\n    if (values2 === void 0) values2 = interpolate2, interpolate2 = interpolate$1;\n    var i = 0, n = values2.length - 1, v = values2[0], I = new Array(n < 0 ? 0 : n);\n    while (i < n) I[i] = interpolate2(v, v = values2[++i]);\n    return function(t) {\n      var i2 = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n      return I[i2](t - i2);\n    };\n  }\n  function quantize$2(interpolator, n) {\n    var samples = new Array(n);\n    for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n    return samples;\n  }\n  const $$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    interpolate: interpolate$1,\n    interpolateArray: array$5,\n    interpolateBasis: basis$1,\n    interpolateBasisClosed: basisClosed,\n    interpolateCubehelix: cubehelix_default,\n    interpolateCubehelixLong: cubehelixLong,\n    interpolateDate: date$1,\n    interpolateDiscrete: discrete$1,\n    interpolateHcl: hcl_default,\n    interpolateHclLong: hclLong,\n    interpolateHsl: hsl_default,\n    interpolateHslLong: hslLong,\n    interpolateHue: hue,\n    interpolateLab: lab,\n    interpolateNumber,\n    interpolateNumberArray: numberArray,\n    interpolateObject: object$1,\n    interpolateRgb: rgb,\n    interpolateRgbBasis: rgbBasis,\n    interpolateRgbBasisClosed: rgbBasisClosed,\n    interpolateRound,\n    interpolateString: string,\n    interpolateTransformCss,\n    interpolateTransformSvg,\n    interpolateZoom: zoom$1,\n    piecewise,\n    quantize: quantize$2\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function constants(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  function number$5(x2) {\n    return +x2;\n  }\n  var unit = [0, 1];\n  function identity$6(x2) {\n    return x2;\n  }\n  function normalize$2(a2, b2) {\n    return (b2 -= a2 = +a2) ? function(x2) {\n      return (x2 - a2) / b2;\n    } : constants(isNaN(b2) ? NaN : 0.5);\n  }\n  function clamper(a2, b2) {\n    var t;\n    if (a2 > b2) t = a2, a2 = b2, b2 = t;\n    return function(x2) {\n      return Math.max(a2, Math.min(b2, x2));\n    };\n  }\n  function bimap(domain2, range2, interpolate2) {\n    var d0 = domain2[0], d1 = domain2[1], r0 = range2[0], r1 = range2[1];\n    if (d1 < d0) d0 = normalize$2(d1, d0), r0 = interpolate2(r1, r0);\n    else d0 = normalize$2(d0, d1), r0 = interpolate2(r0, r1);\n    return function(x2) {\n      return r0(d0(x2));\n    };\n  }\n  function polymap(domain2, range2, interpolate2) {\n    var j = Math.min(domain2.length, range2.length) - 1, d2 = new Array(j), r = new Array(j), i = -1;\n    if (domain2[j] < domain2[0]) {\n      domain2 = domain2.slice().reverse();\n      range2 = range2.slice().reverse();\n    }\n    while (++i < j) {\n      d2[i] = normalize$2(domain2[i], domain2[i + 1]);\n      r[i] = interpolate2(range2[i], range2[i + 1]);\n    }\n    return function(x2) {\n      var i2 = bisectRight$1(domain2, x2, 1, j) - 1;\n      return r[i2](d2[i2](x2));\n    };\n  }\n  function copy$2(source2, target2) {\n    return target2.domain(source2.domain()).range(source2.range()).interpolate(source2.interpolate()).clamp(source2.clamp()).unknown(source2.unknown());\n  }\n  function transformer$3() {\n    var domain2 = unit, range2 = unit, interpolate2 = interpolate$1, transform2, untransform, unknown, clamp2 = identity$6, piecewise2, output2, input;\n    function rescale() {\n      var n = Math.min(domain2.length, range2.length);\n      if (clamp2 !== identity$6) clamp2 = clamper(domain2[0], domain2[n - 1]);\n      piecewise2 = n > 2 ? polymap : bimap;\n      output2 = input = null;\n      return scale2;\n    }\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : (output2 || (output2 = piecewise2(domain2.map(transform2), range2, interpolate2)))(transform2(clamp2(x2)));\n    }\n    scale2.invert = function(y2) {\n      return clamp2(untransform((input || (input = piecewise2(range2, domain2.map(transform2), interpolateNumber)))(y2)));\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2 = Array.from(_, number$5), rescale()) : domain2.slice();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();\n    };\n    scale2.rangeRound = function(_) {\n      return range2 = Array.from(_), interpolate2 = interpolateRound, rescale();\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = _ ? true : identity$6, rescale()) : clamp2 !== identity$6;\n    };\n    scale2.interpolate = function(_) {\n      return arguments.length ? (interpolate2 = _, rescale()) : interpolate2;\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t, u2) {\n      transform2 = t, untransform = u2;\n      return rescale();\n    };\n  }\n  function continuous$1() {\n    return transformer$3()(identity$6, identity$6);\n  }\n  function formatDecimal$1(x2) {\n    return Math.abs(x2 = Math.round(x2)) >= 1e21 ? x2.toLocaleString(\"en\").replace(/,/g, \"\") : x2.toString(10);\n  }\n  function formatDecimalParts$1(x2, p) {\n    if ((i = (x2 = p ? x2.toExponential(p - 1) : x2.toExponential()).indexOf(\"e\")) < 0) return null;\n    var i, coefficient = x2.slice(0, i);\n    return [\n      coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n      +x2.slice(i + 1)\n    ];\n  }\n  function exponent$1(x2) {\n    return x2 = formatDecimalParts$1(Math.abs(x2)), x2 ? x2[1] : NaN;\n  }\n  function formatGroup$1(grouping, thousands) {\n    return function(value2, width2) {\n      var i = value2.length, t = [], j = 0, g = grouping[0], length2 = 0;\n      while (i > 0 && g > 0) {\n        if (length2 + g + 1 > width2) g = Math.max(1, width2 - length2);\n        t.push(value2.substring(i -= g, i + g));\n        if ((length2 += g + 1) > width2) break;\n        g = grouping[j = (j + 1) % grouping.length];\n      }\n      return t.reverse().join(thousands);\n    };\n  }\n  function formatNumerals$1(numerals) {\n    return function(value2) {\n      return value2.replace(/[0-9]/g, function(i) {\n        return numerals[+i];\n      });\n    };\n  }\n  var re$1 = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n  function formatSpecifier$1(specifier) {\n    if (!(match2 = re$1.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match2;\n    return new FormatSpecifier$1({\n      fill: match2[1],\n      align: match2[2],\n      sign: match2[3],\n      symbol: match2[4],\n      zero: match2[5],\n      width: match2[6],\n      comma: match2[7],\n      precision: match2[8] && match2[8].slice(1),\n      trim: match2[9],\n      type: match2[10]\n    });\n  }\n  formatSpecifier$1.prototype = FormatSpecifier$1.prototype;\n  function FormatSpecifier$1(specifier) {\n    this.fill = specifier.fill === void 0 ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === void 0 ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === void 0 ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === void 0 ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === void 0 ? void 0 : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === void 0 ? \"\" : specifier.type + \"\";\n  }\n  FormatSpecifier$1.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === void 0 ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === void 0 ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n  };\n  function formatTrim$1(s2) {\n    out: for (var n = s2.length, i = 1, i0 = -1, i1; i < n; ++i) {\n      switch (s2[i]) {\n        case \".\":\n          i0 = i1 = i;\n          break;\n        case \"0\":\n          if (i0 === 0) i0 = i;\n          i1 = i;\n          break;\n        default:\n          if (!+s2[i]) break out;\n          if (i0 > 0) i0 = 0;\n          break;\n      }\n    }\n    return i0 > 0 ? s2.slice(0, i0) + s2.slice(i1 + 1) : s2;\n  }\n  var prefixExponent$1;\n  function formatPrefixAuto$1(x2, p) {\n    var d2 = formatDecimalParts$1(x2, p);\n    if (!d2) return x2 + \"\";\n    var coefficient = d2[0], exponent2 = d2[1], i = exponent2 - (prefixExponent$1 = Math.max(-8, Math.min(8, Math.floor(exponent2 / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts$1(x2, Math.max(0, p + i - 1))[0];\n  }\n  function formatRounded$1(x2, p) {\n    var d2 = formatDecimalParts$1(x2, p);\n    if (!d2) return x2 + \"\";\n    var coefficient = d2[0], exponent2 = d2[1];\n    return exponent2 < 0 ? \"0.\" + new Array(-exponent2).join(\"0\") + coefficient : coefficient.length > exponent2 + 1 ? coefficient.slice(0, exponent2 + 1) + \".\" + coefficient.slice(exponent2 + 1) : coefficient + new Array(exponent2 - coefficient.length + 2).join(\"0\");\n  }\n  const formatTypes$1 = {\n    \"%\": (x2, p) => (x2 * 100).toFixed(p),\n    \"b\": (x2) => Math.round(x2).toString(2),\n    \"c\": (x2) => x2 + \"\",\n    \"d\": formatDecimal$1,\n    \"e\": (x2, p) => x2.toExponential(p),\n    \"f\": (x2, p) => x2.toFixed(p),\n    \"g\": (x2, p) => x2.toPrecision(p),\n    \"o\": (x2) => Math.round(x2).toString(8),\n    \"p\": (x2, p) => formatRounded$1(x2 * 100, p),\n    \"r\": formatRounded$1,\n    \"s\": formatPrefixAuto$1,\n    \"X\": (x2) => Math.round(x2).toString(16).toUpperCase(),\n    \"x\": (x2) => Math.round(x2).toString(16)\n  };\n  function identity$5(x2) {\n    return x2;\n  }\n  var map$3 = Array.prototype.map, prefixes$1 = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n  function formatLocale$2(locale2) {\n    var group2 = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity$5 : formatGroup$1(map$3.call(locale2.grouping, Number), locale2.thousands + \"\"), currencyPrefix = locale2.currency === void 0 ? \"\" : locale2.currency[0] + \"\", currencySuffix = locale2.currency === void 0 ? \"\" : locale2.currency[1] + \"\", decimal = locale2.decimal === void 0 ? \".\" : locale2.decimal + \"\", numerals = locale2.numerals === void 0 ? identity$5 : formatNumerals$1(map$3.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? \"%\" : locale2.percent + \"\", minus = locale2.minus === void 0 ? \"−\" : locale2.minus + \"\", nan = locale2.nan === void 0 ? \"NaN\" : locale2.nan + \"\";\n    function newFormat(specifier) {\n      specifier = formatSpecifier$1(specifier);\n      var fill2 = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol2 = specifier.symbol, zero2 = specifier.zero, width2 = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type;\n      if (type2 === \"n\") comma = true, type2 = \"g\";\n      else if (!formatTypes$1[type2]) precision === void 0 && (precision = 12), trim = true, type2 = \"g\";\n      if (zero2 || fill2 === \"0\" && align === \"=\") zero2 = true, fill2 = \"0\", align = \"=\";\n      var prefix = symbol2 === \"$\" ? currencyPrefix : symbol2 === \"#\" && /[boxX]/.test(type2) ? \"0\" + type2.toLowerCase() : \"\", suffix = symbol2 === \"$\" ? currencySuffix : /[%p]/.test(type2) ? percent : \"\";\n      var formatType = formatTypes$1[type2], maybeSuffix = /[defgprs%]/.test(type2);\n      precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n      function format2(value2) {\n        var valuePrefix = prefix, valueSuffix = suffix, i, n, c2;\n        if (type2 === \"c\") {\n          valueSuffix = formatType(value2) + valueSuffix;\n          value2 = \"\";\n        } else {\n          value2 = +value2;\n          var valueNegative = value2 < 0 || 1 / value2 < 0;\n          value2 = isNaN(value2) ? nan : formatType(Math.abs(value2), precision);\n          if (trim) value2 = formatTrim$1(value2);\n          if (valueNegative && +value2 === 0 && sign2 !== \"+\") valueNegative = false;\n          valuePrefix = (valueNegative ? sign2 === \"(\" ? sign2 : minus : sign2 === \"-\" || sign2 === \"(\" ? \"\" : sign2) + valuePrefix;\n          valueSuffix = (type2 === \"s\" ? prefixes$1[8 + prefixExponent$1 / 3] : \"\") + valueSuffix + (valueNegative && sign2 === \"(\" ? \")\" : \"\");\n          if (maybeSuffix) {\n            i = -1, n = value2.length;\n            while (++i < n) {\n              if (c2 = value2.charCodeAt(i), 48 > c2 || c2 > 57) {\n                valueSuffix = (c2 === 46 ? decimal + value2.slice(i + 1) : value2.slice(i)) + valueSuffix;\n                value2 = value2.slice(0, i);\n                break;\n              }\n            }\n          }\n        }\n        if (comma && !zero2) value2 = group2(value2, Infinity);\n        var length2 = valuePrefix.length + value2.length + valueSuffix.length, padding2 = length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) : \"\";\n        if (comma && zero2) value2 = group2(padding2 + value2, padding2.length ? width2 - valueSuffix.length : Infinity), padding2 = \"\";\n        switch (align) {\n          case \"<\":\n            value2 = valuePrefix + value2 + valueSuffix + padding2;\n            break;\n          case \"=\":\n            value2 = valuePrefix + padding2 + value2 + valueSuffix;\n            break;\n          case \"^\":\n            value2 = padding2.slice(0, length2 = padding2.length >> 1) + valuePrefix + value2 + valueSuffix + padding2.slice(length2);\n            break;\n          default:\n            value2 = padding2 + valuePrefix + value2 + valueSuffix;\n            break;\n        }\n        return numerals(value2);\n      }\n      format2.toString = function() {\n        return specifier + \"\";\n      };\n      return format2;\n    }\n    function formatPrefix2(specifier, value2) {\n      var f = newFormat((specifier = formatSpecifier$1(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value2) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes$1[8 + e / 3];\n      return function(value3) {\n        return f(k * value3) + prefix;\n      };\n    }\n    return {\n      format: newFormat,\n      formatPrefix: formatPrefix2\n    };\n  }\n  var locale$3;\n  var format$4;\n  var formatPrefix;\n  defaultLocale$3({\n    thousands: \",\",\n    grouping: [3],\n    currency: [\"$\", \"\"]\n  });\n  function defaultLocale$3(definition2) {\n    locale$3 = formatLocale$2(definition2);\n    format$4 = locale$3.format;\n    formatPrefix = locale$3.formatPrefix;\n    return locale$3;\n  }\n  function precisionFixed(step) {\n    return Math.max(0, -exponent$1(Math.abs(step)));\n  }\n  function precisionPrefix(step, value2) {\n    return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value2) / 3))) * 3 - exponent$1(Math.abs(step)));\n  }\n  function precisionRound(step, max2) {\n    step = Math.abs(step), max2 = Math.abs(max2) - step;\n    return Math.max(0, exponent$1(max2) - exponent$1(step)) + 1;\n  }\n  function tickFormat$1(start, stop2, count2, specifier) {\n    var step = tickStep(start, stop2, count2), precision;\n    specifier = formatSpecifier$1(specifier == null ? \",f\" : specifier);\n    switch (specifier.type) {\n      case \"s\": {\n        var value2 = Math.max(Math.abs(start), Math.abs(stop2));\n        if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value2))) specifier.precision = precision;\n        return formatPrefix(specifier, value2);\n      }\n      case \"\":\n      case \"e\":\n      case \"g\":\n      case \"p\":\n      case \"r\": {\n        if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop2))))) specifier.precision = precision - (specifier.type === \"e\");\n        break;\n      }\n      case \"f\":\n      case \"%\": {\n        if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n        break;\n      }\n    }\n    return format$4(specifier);\n  }\n  function linearish(scale2) {\n    var domain2 = scale2.domain;\n    scale2.ticks = function(count2) {\n      var d2 = domain2();\n      return ticks(d2[0], d2[d2.length - 1], count2 == null ? 10 : count2);\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      var d2 = domain2();\n      return tickFormat$1(d2[0], d2[d2.length - 1], count2 == null ? 10 : count2, specifier);\n    };\n    scale2.nice = function(count2) {\n      if (count2 == null) count2 = 10;\n      var d2 = domain2();\n      var i0 = 0;\n      var i1 = d2.length - 1;\n      var start = d2[i0];\n      var stop2 = d2[i1];\n      var prestep;\n      var step;\n      var maxIter = 10;\n      if (stop2 < start) {\n        step = start, start = stop2, stop2 = step;\n        step = i0, i0 = i1, i1 = step;\n      }\n      while (maxIter-- > 0) {\n        step = tickIncrement(start, stop2, count2);\n        if (step === prestep) {\n          d2[i0] = start;\n          d2[i1] = stop2;\n          return domain2(d2);\n        } else if (step > 0) {\n          start = Math.floor(start / step) * step;\n          stop2 = Math.ceil(stop2 / step) * step;\n        } else if (step < 0) {\n          start = Math.ceil(start * step) / step;\n          stop2 = Math.floor(stop2 * step) / step;\n        } else {\n          break;\n        }\n        prestep = step;\n      }\n      return scale2;\n    };\n    return scale2;\n  }\n  function linear$1() {\n    var scale2 = continuous$1();\n    scale2.copy = function() {\n      return copy$2(scale2, linear$1());\n    };\n    initRange.apply(scale2, arguments);\n    return linearish(scale2);\n  }\n  function identity$4(domain2) {\n    var unknown;\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : x2;\n    }\n    scale2.invert = scale2;\n    scale2.domain = scale2.range = function(_) {\n      return arguments.length ? (domain2 = Array.from(_, number$5), scale2) : domain2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return identity$4(domain2).unknown(unknown);\n    };\n    domain2 = arguments.length ? Array.from(domain2, number$5) : [0, 1];\n    return linearish(scale2);\n  }\n  function nice(domain2, interval2) {\n    domain2 = domain2.slice();\n    var i0 = 0, i1 = domain2.length - 1, x02 = domain2[i0], x12 = domain2[i1], t;\n    if (x12 < x02) {\n      t = i0, i0 = i1, i1 = t;\n      t = x02, x02 = x12, x12 = t;\n    }\n    domain2[i0] = interval2.floor(x02);\n    domain2[i1] = interval2.ceil(x12);\n    return domain2;\n  }\n  function transformLog(x2) {\n    return Math.log(x2);\n  }\n  function transformExp(x2) {\n    return Math.exp(x2);\n  }\n  function transformLogn(x2) {\n    return -Math.log(-x2);\n  }\n  function transformExpn(x2) {\n    return -Math.exp(-x2);\n  }\n  function pow10(x2) {\n    return isFinite(x2) ? +(\"1e\" + x2) : x2 < 0 ? 0 : x2;\n  }\n  function powp(base2) {\n    return base2 === 10 ? pow10 : base2 === Math.E ? Math.exp : (x2) => Math.pow(base2, x2);\n  }\n  function logp(base2) {\n    return base2 === Math.E ? Math.log : base2 === 10 && Math.log10 || base2 === 2 && Math.log2 || (base2 = Math.log(base2), (x2) => Math.log(x2) / base2);\n  }\n  function reflect(f) {\n    return (x2, k) => -f(-x2, k);\n  }\n  function loggish(transform2) {\n    const scale2 = transform2(transformLog, transformExp);\n    const domain2 = scale2.domain;\n    let base2 = 10;\n    let logs;\n    let pows;\n    function rescale() {\n      logs = logp(base2), pows = powp(base2);\n      if (domain2()[0] < 0) {\n        logs = reflect(logs), pows = reflect(pows);\n        transform2(transformLogn, transformExpn);\n      } else {\n        transform2(transformLog, transformExp);\n      }\n      return scale2;\n    }\n    scale2.base = function(_) {\n      return arguments.length ? (base2 = +_, rescale()) : base2;\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2(_), rescale()) : domain2();\n    };\n    scale2.ticks = (count2) => {\n      const d2 = domain2();\n      let u2 = d2[0];\n      let v = d2[d2.length - 1];\n      const r = v < u2;\n      if (r) [u2, v] = [v, u2];\n      let i = logs(u2);\n      let j = logs(v);\n      let k;\n      let t;\n      const n = count2 == null ? 10 : +count2;\n      let z2 = [];\n      if (!(base2 % 1) && j - i < n) {\n        i = Math.floor(i), j = Math.ceil(j);\n        if (u2 > 0) for (; i <= j; ++i) {\n          for (k = 1; k < base2; ++k) {\n            t = i < 0 ? k / pows(-i) : k * pows(i);\n            if (t < u2) continue;\n            if (t > v) break;\n            z2.push(t);\n          }\n        }\n        else for (; i <= j; ++i) {\n          for (k = base2 - 1; k >= 1; --k) {\n            t = i > 0 ? k / pows(-i) : k * pows(i);\n            if (t < u2) continue;\n            if (t > v) break;\n            z2.push(t);\n          }\n        }\n        if (z2.length * 2 < n) z2 = ticks(u2, v, n);\n      } else {\n        z2 = ticks(i, j, Math.min(j - i, n)).map(pows);\n      }\n      return r ? z2.reverse() : z2;\n    };\n    scale2.tickFormat = (count2, specifier) => {\n      if (count2 == null) count2 = 10;\n      if (specifier == null) specifier = base2 === 10 ? \"s\" : \",\";\n      if (typeof specifier !== \"function\") {\n        if (!(base2 % 1) && (specifier = formatSpecifier$1(specifier)).precision == null) specifier.trim = true;\n        specifier = format$4(specifier);\n      }\n      if (count2 === Infinity) return specifier;\n      const k = Math.max(1, base2 * count2 / scale2.ticks().length);\n      return (d2) => {\n        let i = d2 / pows(Math.round(logs(d2)));\n        if (i * base2 < base2 - 0.5) i *= base2;\n        return i <= k ? specifier(d2) : \"\";\n      };\n    };\n    scale2.nice = () => {\n      return domain2(nice(domain2(), {\n        floor: (x2) => pows(Math.floor(logs(x2))),\n        ceil: (x2) => pows(Math.ceil(logs(x2)))\n      }));\n    };\n    return scale2;\n  }\n  function log$4() {\n    const scale2 = loggish(transformer$3()).domain([1, 10]);\n    scale2.copy = () => copy$2(scale2, log$4()).base(scale2.base());\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function transformSymlog(c2) {\n    return function(x2) {\n      return Math.sign(x2) * Math.log1p(Math.abs(x2 / c2));\n    };\n  }\n  function transformSymexp(c2) {\n    return function(x2) {\n      return Math.sign(x2) * Math.expm1(Math.abs(x2)) * c2;\n    };\n  }\n  function symlogish(transform2) {\n    var c2 = 1, scale2 = transform2(transformSymlog(c2), transformSymexp(c2));\n    scale2.constant = function(_) {\n      return arguments.length ? transform2(transformSymlog(c2 = +_), transformSymexp(c2)) : c2;\n    };\n    return linearish(scale2);\n  }\n  function symlog$1() {\n    var scale2 = symlogish(transformer$3());\n    scale2.copy = function() {\n      return copy$2(scale2, symlog$1()).constant(scale2.constant());\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function transformPow(exponent2) {\n    return function(x2) {\n      return x2 < 0 ? -Math.pow(-x2, exponent2) : Math.pow(x2, exponent2);\n    };\n  }\n  function transformSqrt(x2) {\n    return x2 < 0 ? -Math.sqrt(-x2) : Math.sqrt(x2);\n  }\n  function transformSquare(x2) {\n    return x2 < 0 ? -x2 * x2 : x2 * x2;\n  }\n  function powish(transform2) {\n    var scale2 = transform2(identity$6, identity$6), exponent2 = 1;\n    function rescale() {\n      return exponent2 === 1 ? transform2(identity$6, identity$6) : exponent2 === 0.5 ? transform2(transformSqrt, transformSquare) : transform2(transformPow(exponent2), transformPow(1 / exponent2));\n    }\n    scale2.exponent = function(_) {\n      return arguments.length ? (exponent2 = +_, rescale()) : exponent2;\n    };\n    return linearish(scale2);\n  }\n  function pow$4() {\n    var scale2 = powish(transformer$3());\n    scale2.copy = function() {\n      return copy$2(scale2, pow$4()).exponent(scale2.exponent());\n    };\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function sqrt$3() {\n    return pow$4.apply(null, arguments).exponent(0.5);\n  }\n  function quantile() {\n    var domain2 = [], range2 = [], thresholds = [], unknown;\n    function rescale() {\n      var i = 0, n = Math.max(1, range2.length);\n      thresholds = new Array(n - 1);\n      while (++i < n) thresholds[i - 1] = quantileSorted(domain2, i / n);\n      return scale2;\n    }\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : range2[bisectRight$1(thresholds, x2)];\n    }\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return i < 0 ? [NaN, NaN] : [\n        i > 0 ? thresholds[i - 1] : domain2[0],\n        i < thresholds.length ? thresholds[i] : domain2[domain2.length - 1]\n      ];\n    };\n    scale2.domain = function(_) {\n      if (!arguments.length) return domain2.slice();\n      domain2 = [];\n      for (let d2 of _) if (d2 != null && !isNaN(d2 = +d2)) domain2.push(d2);\n      domain2.sort(ascending$2);\n      return rescale();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.quantiles = function() {\n      return thresholds.slice();\n    };\n    scale2.copy = function() {\n      return quantile().domain(domain2).range(range2).unknown(unknown);\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function quantize$1() {\n    var x02 = 0, x12 = 1, n = 1, domain2 = [0.5], range2 = [0, 1], unknown;\n    function scale2(x2) {\n      return x2 != null && x2 <= x2 ? range2[bisectRight$1(domain2, x2, 0, n)] : unknown;\n    }\n    function rescale() {\n      var i = -1;\n      domain2 = new Array(n);\n      while (++i < n) domain2[i] = ((i + 1) * x12 - (i - n) * x02) / (n + 1);\n      return scale2;\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12] = _, x02 = +x02, x12 = +x12, rescale()) : [x02, x12];\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (n = (range2 = Array.from(_)).length - 1, rescale()) : range2.slice();\n    };\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return i < 0 ? [NaN, NaN] : i < 1 ? [x02, domain2[0]] : i >= n ? [domain2[n - 1], x12] : [domain2[i - 1], domain2[i]];\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : scale2;\n    };\n    scale2.thresholds = function() {\n      return domain2.slice();\n    };\n    scale2.copy = function() {\n      return quantize$1().domain([x02, x12]).range(range2).unknown(unknown);\n    };\n    return initRange.apply(linearish(scale2), arguments);\n  }\n  function threshold() {\n    var domain2 = [0.5], range2 = [0, 1], unknown, n = 1;\n    function scale2(x2) {\n      return x2 != null && x2 <= x2 ? range2[bisectRight$1(domain2, x2, 0, n)] : unknown;\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2 = Array.from(_), n = Math.min(domain2.length, range2.length - 1), scale2) : domain2.slice();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), n = Math.min(domain2.length, range2.length - 1), scale2) : range2.slice();\n    };\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return [domain2[i - 1], domain2[i]];\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return threshold().domain(domain2).range(range2).unknown(unknown);\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  const t0$1 = /* @__PURE__ */ new Date(), t1 = /* @__PURE__ */ new Date();\n  function timeInterval$1(floori, offseti, count2, field2) {\n    function interval2(date2) {\n      return floori(date2 = arguments.length === 0 ? /* @__PURE__ */ new Date() : /* @__PURE__ */ new Date(+date2)), date2;\n    }\n    interval2.floor = (date2) => {\n      return floori(date2 = /* @__PURE__ */ new Date(+date2)), date2;\n    };\n    interval2.ceil = (date2) => {\n      return floori(date2 = new Date(date2 - 1)), offseti(date2, 1), floori(date2), date2;\n    };\n    interval2.round = (date2) => {\n      const d0 = interval2(date2), d1 = interval2.ceil(date2);\n      return date2 - d0 < d1 - date2 ? d0 : d1;\n    };\n    interval2.offset = (date2, step) => {\n      return offseti(date2 = /* @__PURE__ */ new Date(+date2), step == null ? 1 : Math.floor(step)), date2;\n    };\n    interval2.range = (start, stop2, step) => {\n      const range2 = [];\n      start = interval2.ceil(start);\n      step = step == null ? 1 : Math.floor(step);\n      if (!(start < stop2) || !(step > 0)) return range2;\n      let previous;\n      do\n        range2.push(previous = /* @__PURE__ */ new Date(+start)), offseti(start, step), floori(start);\n      while (previous < start && start < stop2);\n      return range2;\n    };\n    interval2.filter = (test2) => {\n      return timeInterval$1((date2) => {\n        if (date2 >= date2) while (floori(date2), !test2(date2)) date2.setTime(date2 - 1);\n      }, (date2, step) => {\n        if (date2 >= date2) {\n          if (step < 0) while (++step <= 0) {\n            while (offseti(date2, -1), !test2(date2)) {\n            }\n          }\n          else while (--step >= 0) {\n            while (offseti(date2, 1), !test2(date2)) {\n            }\n          }\n        }\n      });\n    };\n    if (count2) {\n      interval2.count = (start, end) => {\n        t0$1.setTime(+start), t1.setTime(+end);\n        floori(t0$1), floori(t1);\n        return Math.floor(count2(t0$1, t1));\n      };\n      interval2.every = (step) => {\n        step = Math.floor(step);\n        return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval2 : interval2.filter(field2 ? (d2) => field2(d2) % step === 0 : (d2) => interval2.count(0, d2) % step === 0);\n      };\n    }\n    return interval2;\n  }\n  const millisecond = timeInterval$1(() => {\n  }, (date2, step) => {\n    date2.setTime(+date2 + step);\n  }, (start, end) => {\n    return end - start;\n  });\n  millisecond.every = (k) => {\n    k = Math.floor(k);\n    if (!isFinite(k) || !(k > 0)) return null;\n    if (!(k > 1)) return millisecond;\n    return timeInterval$1((date2) => {\n      date2.setTime(Math.floor(date2 / k) * k);\n    }, (date2, step) => {\n      date2.setTime(+date2 + step * k);\n    }, (start, end) => {\n      return (end - start) / k;\n    });\n  };\n  millisecond.range;\n  const durationSecond$1 = 1e3;\n  const durationMinute$1 = durationSecond$1 * 60;\n  const durationHour$1 = durationMinute$1 * 60;\n  const durationDay$1 = durationHour$1 * 24;\n  const durationWeek$1 = durationDay$1 * 7;\n  const durationMonth$1 = durationDay$1 * 30;\n  const durationYear$1 = durationDay$1 * 365;\n  const second = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds());\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationSecond$1);\n  }, (start, end) => {\n    return (end - start) / durationSecond$1;\n  }, (date2) => {\n    return date2.getUTCSeconds();\n  });\n  second.range;\n  const timeMinute = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond$1);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationMinute$1);\n  }, (start, end) => {\n    return (end - start) / durationMinute$1;\n  }, (date2) => {\n    return date2.getMinutes();\n  });\n  timeMinute.range;\n  const utcMinute = timeInterval$1((date2) => {\n    date2.setUTCSeconds(0, 0);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationMinute$1);\n  }, (start, end) => {\n    return (end - start) / durationMinute$1;\n  }, (date2) => {\n    return date2.getUTCMinutes();\n  });\n  utcMinute.range;\n  const timeHour = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond$1 - date2.getMinutes() * durationMinute$1);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationHour$1);\n  }, (start, end) => {\n    return (end - start) / durationHour$1;\n  }, (date2) => {\n    return date2.getHours();\n  });\n  timeHour.range;\n  const utcHour = timeInterval$1((date2) => {\n    date2.setUTCMinutes(0, 0, 0);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationHour$1);\n  }, (start, end) => {\n    return (end - start) / durationHour$1;\n  }, (date2) => {\n    return date2.getUTCHours();\n  });\n  utcHour.range;\n  const timeDay = timeInterval$1(\n    (date2) => date2.setHours(0, 0, 0, 0),\n    (date2, step) => date2.setDate(date2.getDate() + step),\n    (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1,\n    (date2) => date2.getDate() - 1\n  );\n  timeDay.range;\n  const utcDay = timeInterval$1((date2) => {\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCDate(date2.getUTCDate() + step);\n  }, (start, end) => {\n    return (end - start) / durationDay$1;\n  }, (date2) => {\n    return date2.getUTCDate() - 1;\n  });\n  utcDay.range;\n  const unixDay = timeInterval$1((date2) => {\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCDate(date2.getUTCDate() + step);\n  }, (start, end) => {\n    return (end - start) / durationDay$1;\n  }, (date2) => {\n    return Math.floor(date2 / durationDay$1);\n  });\n  unixDay.range;\n  function timeWeekday(i) {\n    return timeInterval$1((date2) => {\n      date2.setDate(date2.getDate() - (date2.getDay() + 7 - i) % 7);\n      date2.setHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setDate(date2.getDate() + step * 7);\n    }, (start, end) => {\n      return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1;\n    });\n  }\n  const timeSunday = timeWeekday(0);\n  const timeMonday = timeWeekday(1);\n  const timeTuesday = timeWeekday(2);\n  const timeWednesday = timeWeekday(3);\n  const timeThursday = timeWeekday(4);\n  const timeFriday = timeWeekday(5);\n  const timeSaturday = timeWeekday(6);\n  timeSunday.range;\n  timeMonday.range;\n  timeTuesday.range;\n  timeWednesday.range;\n  timeThursday.range;\n  timeFriday.range;\n  timeSaturday.range;\n  function utcWeekday(i) {\n    return timeInterval$1((date2) => {\n      date2.setUTCDate(date2.getUTCDate() - (date2.getUTCDay() + 7 - i) % 7);\n      date2.setUTCHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setUTCDate(date2.getUTCDate() + step * 7);\n    }, (start, end) => {\n      return (end - start) / durationWeek$1;\n    });\n  }\n  const utcSunday = utcWeekday(0);\n  const utcMonday = utcWeekday(1);\n  const utcTuesday = utcWeekday(2);\n  const utcWednesday = utcWeekday(3);\n  const utcThursday = utcWeekday(4);\n  const utcFriday = utcWeekday(5);\n  const utcSaturday = utcWeekday(6);\n  utcSunday.range;\n  utcMonday.range;\n  utcTuesday.range;\n  utcWednesday.range;\n  utcThursday.range;\n  utcFriday.range;\n  utcSaturday.range;\n  const timeMonth = timeInterval$1((date2) => {\n    date2.setDate(1);\n    date2.setHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setMonth(date2.getMonth() + step);\n  }, (start, end) => {\n    return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n  }, (date2) => {\n    return date2.getMonth();\n  });\n  timeMonth.range;\n  const utcMonth = timeInterval$1((date2) => {\n    date2.setUTCDate(1);\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCMonth(date2.getUTCMonth() + step);\n  }, (start, end) => {\n    return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n  }, (date2) => {\n    return date2.getUTCMonth();\n  });\n  utcMonth.range;\n  const timeYear = timeInterval$1((date2) => {\n    date2.setMonth(0, 1);\n    date2.setHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setFullYear(date2.getFullYear() + step);\n  }, (start, end) => {\n    return end.getFullYear() - start.getFullYear();\n  }, (date2) => {\n    return date2.getFullYear();\n  });\n  timeYear.every = (k) => {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval$1((date2) => {\n      date2.setFullYear(Math.floor(date2.getFullYear() / k) * k);\n      date2.setMonth(0, 1);\n      date2.setHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setFullYear(date2.getFullYear() + step * k);\n    });\n  };\n  timeYear.range;\n  const utcYear = timeInterval$1((date2) => {\n    date2.setUTCMonth(0, 1);\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCFullYear(date2.getUTCFullYear() + step);\n  }, (start, end) => {\n    return end.getUTCFullYear() - start.getUTCFullYear();\n  }, (date2) => {\n    return date2.getUTCFullYear();\n  });\n  utcYear.every = (k) => {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval$1((date2) => {\n      date2.setUTCFullYear(Math.floor(date2.getUTCFullYear() / k) * k);\n      date2.setUTCMonth(0, 1);\n      date2.setUTCHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setUTCFullYear(date2.getUTCFullYear() + step * k);\n    });\n  };\n  utcYear.range;\n  function ticker(year, month, week2, day, hour, minute) {\n    const tickIntervals = [\n      [second, 1, durationSecond$1],\n      [second, 5, 5 * durationSecond$1],\n      [second, 15, 15 * durationSecond$1],\n      [second, 30, 30 * durationSecond$1],\n      [minute, 1, durationMinute$1],\n      [minute, 5, 5 * durationMinute$1],\n      [minute, 15, 15 * durationMinute$1],\n      [minute, 30, 30 * durationMinute$1],\n      [hour, 1, durationHour$1],\n      [hour, 3, 3 * durationHour$1],\n      [hour, 6, 6 * durationHour$1],\n      [hour, 12, 12 * durationHour$1],\n      [day, 1, durationDay$1],\n      [day, 2, 2 * durationDay$1],\n      [week2, 1, durationWeek$1],\n      [month, 1, durationMonth$1],\n      [month, 3, 3 * durationMonth$1],\n      [year, 1, durationYear$1]\n    ];\n    function ticks2(start, stop2, count2) {\n      const reverse2 = stop2 < start;\n      if (reverse2) [start, stop2] = [stop2, start];\n      const interval2 = count2 && typeof count2.range === \"function\" ? count2 : tickInterval(start, stop2, count2);\n      const ticks3 = interval2 ? interval2.range(start, +stop2 + 1) : [];\n      return reverse2 ? ticks3.reverse() : ticks3;\n    }\n    function tickInterval(start, stop2, count2) {\n      const target2 = Math.abs(stop2 - start) / count2;\n      const i = bisector(([, , step2]) => step2).right(tickIntervals, target2);\n      if (i === tickIntervals.length) return year.every(tickStep(start / durationYear$1, stop2 / durationYear$1, count2));\n      if (i === 0) return millisecond.every(Math.max(tickStep(start, stop2, count2), 1));\n      const [t, step] = tickIntervals[target2 / tickIntervals[i - 1][2] < tickIntervals[i][2] / target2 ? i - 1 : i];\n      return t.every(step);\n    }\n    return [ticks2, tickInterval];\n  }\n  const [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\n  const [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n  function localDate$1(d2) {\n    if (0 <= d2.y && d2.y < 100) {\n      var date2 = new Date(-1, d2.m, d2.d, d2.H, d2.M, d2.S, d2.L);\n      date2.setFullYear(d2.y);\n      return date2;\n    }\n    return new Date(d2.y, d2.m, d2.d, d2.H, d2.M, d2.S, d2.L);\n  }\n  function utcDate$1(d2) {\n    if (0 <= d2.y && d2.y < 100) {\n      var date2 = new Date(Date.UTC(-1, d2.m, d2.d, d2.H, d2.M, d2.S, d2.L));\n      date2.setUTCFullYear(d2.y);\n      return date2;\n    }\n    return new Date(Date.UTC(d2.y, d2.m, d2.d, d2.H, d2.M, d2.S, d2.L));\n  }\n  function newDate(y2, m2, d2) {\n    return { y: y2, m: m2, d: d2, H: 0, M: 0, S: 0, L: 0 };\n  }\n  function formatLocale$1(locale2) {\n    var locale_dateTime = locale2.dateTime, locale_date = locale2.date, locale_time = locale2.time, locale_periods = locale2.periods, locale_weekdays = locale2.days, locale_shortWeekdays = locale2.shortDays, locale_months = locale2.months, locale_shortMonths = locale2.shortMonths;\n    var periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths);\n    var formats2 = {\n      \"a\": formatShortWeekday,\n      \"A\": formatWeekday,\n      \"b\": formatShortMonth,\n      \"B\": formatMonth,\n      \"c\": null,\n      \"d\": formatDayOfMonth,\n      \"e\": formatDayOfMonth,\n      \"f\": formatMicroseconds,\n      \"g\": formatYearISO,\n      \"G\": formatFullYearISO,\n      \"H\": formatHour24,\n      \"I\": formatHour12,\n      \"j\": formatDayOfYear,\n      \"L\": formatMilliseconds,\n      \"m\": formatMonthNumber,\n      \"M\": formatMinutes,\n      \"p\": formatPeriod,\n      \"q\": formatQuarter,\n      \"Q\": formatUnixTimestamp,\n      \"s\": formatUnixTimestampSeconds,\n      \"S\": formatSeconds,\n      \"u\": formatWeekdayNumberMonday,\n      \"U\": formatWeekNumberSunday,\n      \"V\": formatWeekNumberISO,\n      \"w\": formatWeekdayNumberSunday,\n      \"W\": formatWeekNumberMonday,\n      \"x\": null,\n      \"X\": null,\n      \"y\": formatYear$1,\n      \"Y\": formatFullYear,\n      \"Z\": formatZone,\n      \"%\": formatLiteralPercent\n    };\n    var utcFormats = {\n      \"a\": formatUTCShortWeekday,\n      \"A\": formatUTCWeekday,\n      \"b\": formatUTCShortMonth,\n      \"B\": formatUTCMonth,\n      \"c\": null,\n      \"d\": formatUTCDayOfMonth,\n      \"e\": formatUTCDayOfMonth,\n      \"f\": formatUTCMicroseconds,\n      \"g\": formatUTCYearISO,\n      \"G\": formatUTCFullYearISO,\n      \"H\": formatUTCHour24,\n      \"I\": formatUTCHour12,\n      \"j\": formatUTCDayOfYear,\n      \"L\": formatUTCMilliseconds,\n      \"m\": formatUTCMonthNumber,\n      \"M\": formatUTCMinutes,\n      \"p\": formatUTCPeriod,\n      \"q\": formatUTCQuarter,\n      \"Q\": formatUnixTimestamp,\n      \"s\": formatUnixTimestampSeconds,\n      \"S\": formatUTCSeconds,\n      \"u\": formatUTCWeekdayNumberMonday,\n      \"U\": formatUTCWeekNumberSunday,\n      \"V\": formatUTCWeekNumberISO,\n      \"w\": formatUTCWeekdayNumberSunday,\n      \"W\": formatUTCWeekNumberMonday,\n      \"x\": null,\n      \"X\": null,\n      \"y\": formatUTCYear,\n      \"Y\": formatUTCFullYear,\n      \"Z\": formatUTCZone,\n      \"%\": formatLiteralPercent\n    };\n    var parses = {\n      \"a\": parseShortWeekday,\n      \"A\": parseWeekday,\n      \"b\": parseShortMonth,\n      \"B\": parseMonth,\n      \"c\": parseLocaleDateTime,\n      \"d\": parseDayOfMonth,\n      \"e\": parseDayOfMonth,\n      \"f\": parseMicroseconds,\n      \"g\": parseYear,\n      \"G\": parseFullYear,\n      \"H\": parseHour24,\n      \"I\": parseHour24,\n      \"j\": parseDayOfYear,\n      \"L\": parseMilliseconds,\n      \"m\": parseMonthNumber,\n      \"M\": parseMinutes,\n      \"p\": parsePeriod,\n      \"q\": parseQuarter,\n      \"Q\": parseUnixTimestamp,\n      \"s\": parseUnixTimestampSeconds,\n      \"S\": parseSeconds,\n      \"u\": parseWeekdayNumberMonday,\n      \"U\": parseWeekNumberSunday,\n      \"V\": parseWeekNumberISO,\n      \"w\": parseWeekdayNumberSunday,\n      \"W\": parseWeekNumberMonday,\n      \"x\": parseLocaleDate,\n      \"X\": parseLocaleTime,\n      \"y\": parseYear,\n      \"Y\": parseFullYear,\n      \"Z\": parseZone,\n      \"%\": parseLiteralPercent\n    };\n    formats2.x = newFormat(locale_date, formats2);\n    formats2.X = newFormat(locale_time, formats2);\n    formats2.c = newFormat(locale_dateTime, formats2);\n    utcFormats.x = newFormat(locale_date, utcFormats);\n    utcFormats.X = newFormat(locale_time, utcFormats);\n    utcFormats.c = newFormat(locale_dateTime, utcFormats);\n    function newFormat(specifier, formats3) {\n      return function(date2) {\n        var string2 = [], i = -1, j = 0, n = specifier.length, c2, pad2, format2;\n        if (!(date2 instanceof Date)) date2 = /* @__PURE__ */ new Date(+date2);\n        while (++i < n) {\n          if (specifier.charCodeAt(i) === 37) {\n            string2.push(specifier.slice(j, i));\n            if ((pad2 = pads[c2 = specifier.charAt(++i)]) != null) c2 = specifier.charAt(++i);\n            else pad2 = c2 === \"e\" ? \" \" : \"0\";\n            if (format2 = formats3[c2]) c2 = format2(date2, pad2);\n            string2.push(c2);\n            j = i + 1;\n          }\n        }\n        string2.push(specifier.slice(j, i));\n        return string2.join(\"\");\n      };\n    }\n    function newParse(specifier, Z3) {\n      return function(string2) {\n        var d2 = newDate(1900, void 0, 1), i = parseSpecifier(d2, specifier, string2 += \"\", 0), week2, day;\n        if (i != string2.length) return null;\n        if (\"Q\" in d2) return new Date(d2.Q);\n        if (\"s\" in d2) return new Date(d2.s * 1e3 + (\"L\" in d2 ? d2.L : 0));\n        if (Z3 && !(\"Z\" in d2)) d2.Z = 0;\n        if (\"p\" in d2) d2.H = d2.H % 12 + d2.p * 12;\n        if (d2.m === void 0) d2.m = \"q\" in d2 ? d2.q : 0;\n        if (\"V\" in d2) {\n          if (d2.V < 1 || d2.V > 53) return null;\n          if (!(\"w\" in d2)) d2.w = 1;\n          if (\"Z\" in d2) {\n            week2 = utcDate$1(newDate(d2.y, 0, 1)), day = week2.getUTCDay();\n            week2 = day > 4 || day === 0 ? utcMonday.ceil(week2) : utcMonday(week2);\n            week2 = utcDay.offset(week2, (d2.V - 1) * 7);\n            d2.y = week2.getUTCFullYear();\n            d2.m = week2.getUTCMonth();\n            d2.d = week2.getUTCDate() + (d2.w + 6) % 7;\n          } else {\n            week2 = localDate$1(newDate(d2.y, 0, 1)), day = week2.getDay();\n            week2 = day > 4 || day === 0 ? timeMonday.ceil(week2) : timeMonday(week2);\n            week2 = timeDay.offset(week2, (d2.V - 1) * 7);\n            d2.y = week2.getFullYear();\n            d2.m = week2.getMonth();\n            d2.d = week2.getDate() + (d2.w + 6) % 7;\n          }\n        } else if (\"W\" in d2 || \"U\" in d2) {\n          if (!(\"w\" in d2)) d2.w = \"u\" in d2 ? d2.u % 7 : \"W\" in d2 ? 1 : 0;\n          day = \"Z\" in d2 ? utcDate$1(newDate(d2.y, 0, 1)).getUTCDay() : localDate$1(newDate(d2.y, 0, 1)).getDay();\n          d2.m = 0;\n          d2.d = \"W\" in d2 ? (d2.w + 6) % 7 + d2.W * 7 - (day + 5) % 7 : d2.w + d2.U * 7 - (day + 6) % 7;\n        }\n        if (\"Z\" in d2) {\n          d2.H += d2.Z / 100 | 0;\n          d2.M += d2.Z % 100;\n          return utcDate$1(d2);\n        }\n        return localDate$1(d2);\n      };\n    }\n    function parseSpecifier(d2, specifier, string2, j) {\n      var i = 0, n = specifier.length, m2 = string2.length, c2, parse2;\n      while (i < n) {\n        if (j >= m2) return -1;\n        c2 = specifier.charCodeAt(i++);\n        if (c2 === 37) {\n          c2 = specifier.charAt(i++);\n          parse2 = parses[c2 in pads ? specifier.charAt(i++) : c2];\n          if (!parse2 || (j = parse2(d2, string2, j)) < 0) return -1;\n        } else if (c2 != string2.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    function parsePeriod(d2, string2, i) {\n      var n = periodRe.exec(string2.slice(i));\n      return n ? (d2.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortWeekday(d2, string2, i) {\n      var n = shortWeekdayRe.exec(string2.slice(i));\n      return n ? (d2.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseWeekday(d2, string2, i) {\n      var n = weekdayRe.exec(string2.slice(i));\n      return n ? (d2.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortMonth(d2, string2, i) {\n      var n = shortMonthRe.exec(string2.slice(i));\n      return n ? (d2.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseMonth(d2, string2, i) {\n      var n = monthRe.exec(string2.slice(i));\n      return n ? (d2.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseLocaleDateTime(d2, string2, i) {\n      return parseSpecifier(d2, locale_dateTime, string2, i);\n    }\n    function parseLocaleDate(d2, string2, i) {\n      return parseSpecifier(d2, locale_date, string2, i);\n    }\n    function parseLocaleTime(d2, string2, i) {\n      return parseSpecifier(d2, locale_time, string2, i);\n    }\n    function formatShortWeekday(d2) {\n      return locale_shortWeekdays[d2.getDay()];\n    }\n    function formatWeekday(d2) {\n      return locale_weekdays[d2.getDay()];\n    }\n    function formatShortMonth(d2) {\n      return locale_shortMonths[d2.getMonth()];\n    }\n    function formatMonth(d2) {\n      return locale_months[d2.getMonth()];\n    }\n    function formatPeriod(d2) {\n      return locale_periods[+(d2.getHours() >= 12)];\n    }\n    function formatQuarter(d2) {\n      return 1 + ~~(d2.getMonth() / 3);\n    }\n    function formatUTCShortWeekday(d2) {\n      return locale_shortWeekdays[d2.getUTCDay()];\n    }\n    function formatUTCWeekday(d2) {\n      return locale_weekdays[d2.getUTCDay()];\n    }\n    function formatUTCShortMonth(d2) {\n      return locale_shortMonths[d2.getUTCMonth()];\n    }\n    function formatUTCMonth(d2) {\n      return locale_months[d2.getUTCMonth()];\n    }\n    function formatUTCPeriod(d2) {\n      return locale_periods[+(d2.getUTCHours() >= 12)];\n    }\n    function formatUTCQuarter(d2) {\n      return 1 + ~~(d2.getUTCMonth() / 3);\n    }\n    return {\n      format: function(specifier) {\n        var f = newFormat(specifier += \"\", formats2);\n        f.toString = function() {\n          return specifier;\n        };\n        return f;\n      },\n      parse: function(specifier) {\n        var p = newParse(specifier += \"\", false);\n        p.toString = function() {\n          return specifier;\n        };\n        return p;\n      },\n      utcFormat: function(specifier) {\n        var f = newFormat(specifier += \"\", utcFormats);\n        f.toString = function() {\n          return specifier;\n        };\n        return f;\n      },\n      utcParse: function(specifier) {\n        var p = newParse(specifier += \"\", true);\n        p.toString = function() {\n          return specifier;\n        };\n        return p;\n      }\n    };\n  }\n  var pads = { \"-\": \"\", \"_\": \" \", \"0\": \"0\" }, numberRe = /^\\s*\\d+/, percentRe = /^%/, requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n  function pad$2(value2, fill2, width2) {\n    var sign2 = value2 < 0 ? \"-\" : \"\", string2 = (sign2 ? -value2 : value2) + \"\", length2 = string2.length;\n    return sign2 + (length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) + string2 : string2);\n  }\n  function requote(s2) {\n    return s2.replace(requoteRe, \"\\\\$&\");\n  }\n  function formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n  }\n  function formatLookup(names) {\n    return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n  }\n  function parseWeekdayNumberSunday(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d2.w = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekdayNumberMonday(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d2.u = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberSunday(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.U = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberISO(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.V = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberMonday(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.W = +n[0], i + n[0].length) : -1;\n  }\n  function parseFullYear(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 4));\n    return n ? (d2.y = +n[0], i + n[0].length) : -1;\n  }\n  function parseYear(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.y = +n[0] + (+n[0] > 68 ? 1900 : 2e3), i + n[0].length) : -1;\n  }\n  function parseZone(d2, string2, i) {\n    var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string2.slice(i, i + 6));\n    return n ? (d2.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n  }\n  function parseQuarter(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d2.q = n[0] * 3 - 3, i + n[0].length) : -1;\n  }\n  function parseMonthNumber(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function parseDayOfMonth(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.d = +n[0], i + n[0].length) : -1;\n  }\n  function parseDayOfYear(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 3));\n    return n ? (d2.m = 0, d2.d = +n[0], i + n[0].length) : -1;\n  }\n  function parseHour24(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.H = +n[0], i + n[0].length) : -1;\n  }\n  function parseMinutes(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.M = +n[0], i + n[0].length) : -1;\n  }\n  function parseSeconds(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d2.S = +n[0], i + n[0].length) : -1;\n  }\n  function parseMilliseconds(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 3));\n    return n ? (d2.L = +n[0], i + n[0].length) : -1;\n  }\n  function parseMicroseconds(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 6));\n    return n ? (d2.L = Math.floor(n[0] / 1e3), i + n[0].length) : -1;\n  }\n  function parseLiteralPercent(d2, string2, i) {\n    var n = percentRe.exec(string2.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function parseUnixTimestamp(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i));\n    return n ? (d2.Q = +n[0], i + n[0].length) : -1;\n  }\n  function parseUnixTimestampSeconds(d2, string2, i) {\n    var n = numberRe.exec(string2.slice(i));\n    return n ? (d2.s = +n[0], i + n[0].length) : -1;\n  }\n  function formatDayOfMonth(d2, p) {\n    return pad$2(d2.getDate(), p, 2);\n  }\n  function formatHour24(d2, p) {\n    return pad$2(d2.getHours(), p, 2);\n  }\n  function formatHour12(d2, p) {\n    return pad$2(d2.getHours() % 12 || 12, p, 2);\n  }\n  function formatDayOfYear(d2, p) {\n    return pad$2(1 + timeDay.count(timeYear(d2), d2), p, 3);\n  }\n  function formatMilliseconds(d2, p) {\n    return pad$2(d2.getMilliseconds(), p, 3);\n  }\n  function formatMicroseconds(d2, p) {\n    return formatMilliseconds(d2, p) + \"000\";\n  }\n  function formatMonthNumber(d2, p) {\n    return pad$2(d2.getMonth() + 1, p, 2);\n  }\n  function formatMinutes(d2, p) {\n    return pad$2(d2.getMinutes(), p, 2);\n  }\n  function formatSeconds(d2, p) {\n    return pad$2(d2.getSeconds(), p, 2);\n  }\n  function formatWeekdayNumberMonday(d2) {\n    var day = d2.getDay();\n    return day === 0 ? 7 : day;\n  }\n  function formatWeekNumberSunday(d2, p) {\n    return pad$2(timeSunday.count(timeYear(d2) - 1, d2), p, 2);\n  }\n  function dISO(d2) {\n    var day = d2.getDay();\n    return day >= 4 || day === 0 ? timeThursday(d2) : timeThursday.ceil(d2);\n  }\n  function formatWeekNumberISO(d2, p) {\n    d2 = dISO(d2);\n    return pad$2(timeThursday.count(timeYear(d2), d2) + (timeYear(d2).getDay() === 4), p, 2);\n  }\n  function formatWeekdayNumberSunday(d2) {\n    return d2.getDay();\n  }\n  function formatWeekNumberMonday(d2, p) {\n    return pad$2(timeMonday.count(timeYear(d2) - 1, d2), p, 2);\n  }\n  function formatYear$1(d2, p) {\n    return pad$2(d2.getFullYear() % 100, p, 2);\n  }\n  function formatYearISO(d2, p) {\n    d2 = dISO(d2);\n    return pad$2(d2.getFullYear() % 100, p, 2);\n  }\n  function formatFullYear(d2, p) {\n    return pad$2(d2.getFullYear() % 1e4, p, 4);\n  }\n  function formatFullYearISO(d2, p) {\n    var day = d2.getDay();\n    d2 = day >= 4 || day === 0 ? timeThursday(d2) : timeThursday.ceil(d2);\n    return pad$2(d2.getFullYear() % 1e4, p, 4);\n  }\n  function formatZone(d2) {\n    var z2 = d2.getTimezoneOffset();\n    return (z2 > 0 ? \"-\" : (z2 *= -1, \"+\")) + pad$2(z2 / 60 | 0, \"0\", 2) + pad$2(z2 % 60, \"0\", 2);\n  }\n  function formatUTCDayOfMonth(d2, p) {\n    return pad$2(d2.getUTCDate(), p, 2);\n  }\n  function formatUTCHour24(d2, p) {\n    return pad$2(d2.getUTCHours(), p, 2);\n  }\n  function formatUTCHour12(d2, p) {\n    return pad$2(d2.getUTCHours() % 12 || 12, p, 2);\n  }\n  function formatUTCDayOfYear(d2, p) {\n    return pad$2(1 + utcDay.count(utcYear(d2), d2), p, 3);\n  }\n  function formatUTCMilliseconds(d2, p) {\n    return pad$2(d2.getUTCMilliseconds(), p, 3);\n  }\n  function formatUTCMicroseconds(d2, p) {\n    return formatUTCMilliseconds(d2, p) + \"000\";\n  }\n  function formatUTCMonthNumber(d2, p) {\n    return pad$2(d2.getUTCMonth() + 1, p, 2);\n  }\n  function formatUTCMinutes(d2, p) {\n    return pad$2(d2.getUTCMinutes(), p, 2);\n  }\n  function formatUTCSeconds(d2, p) {\n    return pad$2(d2.getUTCSeconds(), p, 2);\n  }\n  function formatUTCWeekdayNumberMonday(d2) {\n    var dow = d2.getUTCDay();\n    return dow === 0 ? 7 : dow;\n  }\n  function formatUTCWeekNumberSunday(d2, p) {\n    return pad$2(utcSunday.count(utcYear(d2) - 1, d2), p, 2);\n  }\n  function UTCdISO(d2) {\n    var day = d2.getUTCDay();\n    return day >= 4 || day === 0 ? utcThursday(d2) : utcThursday.ceil(d2);\n  }\n  function formatUTCWeekNumberISO(d2, p) {\n    d2 = UTCdISO(d2);\n    return pad$2(utcThursday.count(utcYear(d2), d2) + (utcYear(d2).getUTCDay() === 4), p, 2);\n  }\n  function formatUTCWeekdayNumberSunday(d2) {\n    return d2.getUTCDay();\n  }\n  function formatUTCWeekNumberMonday(d2, p) {\n    return pad$2(utcMonday.count(utcYear(d2) - 1, d2), p, 2);\n  }\n  function formatUTCYear(d2, p) {\n    return pad$2(d2.getUTCFullYear() % 100, p, 2);\n  }\n  function formatUTCYearISO(d2, p) {\n    d2 = UTCdISO(d2);\n    return pad$2(d2.getUTCFullYear() % 100, p, 2);\n  }\n  function formatUTCFullYear(d2, p) {\n    return pad$2(d2.getUTCFullYear() % 1e4, p, 4);\n  }\n  function formatUTCFullYearISO(d2, p) {\n    var day = d2.getUTCDay();\n    d2 = day >= 4 || day === 0 ? utcThursday(d2) : utcThursday.ceil(d2);\n    return pad$2(d2.getUTCFullYear() % 1e4, p, 4);\n  }\n  function formatUTCZone() {\n    return \"+0000\";\n  }\n  function formatLiteralPercent() {\n    return \"%\";\n  }\n  function formatUnixTimestamp(d2) {\n    return +d2;\n  }\n  function formatUnixTimestampSeconds(d2) {\n    return Math.floor(+d2 / 1e3);\n  }\n  var locale$2;\n  var timeFormat$1;\n  var timeParse$1;\n  var utcFormat$1;\n  var utcParse$1;\n  defaultLocale$2({\n    dateTime: \"%x, %X\",\n    date: \"%-m/%-d/%Y\",\n    time: \"%-I:%M:%S %p\",\n    periods: [\"AM\", \"PM\"],\n    days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n    shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n    months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n    shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n  });\n  function defaultLocale$2(definition2) {\n    locale$2 = formatLocale$1(definition2);\n    timeFormat$1 = locale$2.format;\n    timeParse$1 = locale$2.parse;\n    utcFormat$1 = locale$2.utcFormat;\n    utcParse$1 = locale$2.utcParse;\n    return locale$2;\n  }\n  function date(t) {\n    return new Date(t);\n  }\n  function number$4(t) {\n    return t instanceof Date ? +t : +/* @__PURE__ */ new Date(+t);\n  }\n  function calendar(ticks2, tickInterval, year, month, week2, day, hour, minute, second2, format2) {\n    var scale2 = continuous$1(), invert2 = scale2.invert, domain2 = scale2.domain;\n    var formatMillisecond = format2(\".%L\"), formatSecond = format2(\":%S\"), formatMinute = format2(\"%I:%M\"), formatHour = format2(\"%I %p\"), formatDay = format2(\"%a %d\"), formatWeek = format2(\"%b %d\"), formatMonth = format2(\"%B\"), formatYear2 = format2(\"%Y\");\n    function tickFormat2(date2) {\n      return (second2(date2) < date2 ? formatMillisecond : minute(date2) < date2 ? formatSecond : hour(date2) < date2 ? formatMinute : day(date2) < date2 ? formatHour : month(date2) < date2 ? week2(date2) < date2 ? formatDay : formatWeek : year(date2) < date2 ? formatMonth : formatYear2)(date2);\n    }\n    scale2.invert = function(y2) {\n      return new Date(invert2(y2));\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? domain2(Array.from(_, number$4)) : domain2().map(date);\n    };\n    scale2.ticks = function(interval2) {\n      var d2 = domain2();\n      return ticks2(d2[0], d2[d2.length - 1], interval2 == null ? 10 : interval2);\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      return specifier == null ? tickFormat2 : format2(specifier);\n    };\n    scale2.nice = function(interval2) {\n      var d2 = domain2();\n      if (!interval2 || typeof interval2.range !== \"function\") interval2 = tickInterval(d2[0], d2[d2.length - 1], interval2 == null ? 10 : interval2);\n      return interval2 ? domain2(nice(d2, interval2)) : scale2;\n    };\n    scale2.copy = function() {\n      return copy$2(scale2, calendar(ticks2, tickInterval, year, month, week2, day, hour, minute, second2, format2));\n    };\n    return scale2;\n  }\n  function time$1() {\n    return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute, second, timeFormat$1).domain([new Date(2e3, 0, 1), new Date(2e3, 0, 2)]), arguments);\n  }\n  function utcTime() {\n    return initRange.apply(calendar(utcTicks, utcTickInterval, utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, utcFormat$1).domain([Date.UTC(2e3, 0, 1), Date.UTC(2e3, 0, 2)]), arguments);\n  }\n  function transformer$2() {\n    var x02 = 0, x12 = 1, t02, t12, k10, transform2, interpolator = identity$6, clamp2 = false, unknown;\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : interpolator(k10 === 0 ? 0.5 : (x2 = (transform2(x2) - t02) * k10, clamp2 ? Math.max(0, Math.min(1, x2)) : x2));\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12] = _, t02 = transform2(x02 = +x02), t12 = transform2(x12 = +x12), k10 = t02 === t12 ? 0 : 1 / (t12 - t02), scale2) : [x02, x12];\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = !!_, scale2) : clamp2;\n    };\n    scale2.interpolator = function(_) {\n      return arguments.length ? (interpolator = _, scale2) : interpolator;\n    };\n    function range2(interpolate2) {\n      return function(_) {\n        var r0, r1;\n        return arguments.length ? ([r0, r1] = _, interpolator = interpolate2(r0, r1), scale2) : [interpolator(0), interpolator(1)];\n      };\n    }\n    scale2.range = range2(interpolate$1);\n    scale2.rangeRound = range2(interpolateRound);\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t) {\n      transform2 = t, t02 = t(x02), t12 = t(x12), k10 = t02 === t12 ? 0 : 1 / (t12 - t02);\n      return scale2;\n    };\n  }\n  function copy$1(source2, target2) {\n    return target2.domain(source2.domain()).interpolator(source2.interpolator()).clamp(source2.clamp()).unknown(source2.unknown());\n  }\n  function sequential() {\n    var scale2 = linearish(transformer$2()(identity$6));\n    scale2.copy = function() {\n      return copy$1(scale2, sequential());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialLog() {\n    var scale2 = loggish(transformer$2()).domain([1, 10]);\n    scale2.copy = function() {\n      return copy$1(scale2, sequentialLog()).base(scale2.base());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialSymlog() {\n    var scale2 = symlogish(transformer$2());\n    scale2.copy = function() {\n      return copy$1(scale2, sequentialSymlog()).constant(scale2.constant());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialPow() {\n    var scale2 = powish(transformer$2());\n    scale2.copy = function() {\n      return copy$1(scale2, sequentialPow()).exponent(scale2.exponent());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialSqrt() {\n    return sequentialPow.apply(null, arguments).exponent(0.5);\n  }\n  function transformer$1() {\n    var x02 = 0, x12 = 0.5, x2 = 1, s2 = 1, t02, t12, t22, k10, k21, interpolator = identity$6, transform2, clamp2 = false, unknown;\n    function scale2(x3) {\n      return isNaN(x3 = +x3) ? unknown : (x3 = 0.5 + ((x3 = +transform2(x3)) - t12) * (s2 * x3 < s2 * t12 ? k10 : k21), interpolator(clamp2 ? Math.max(0, Math.min(1, x3)) : x3));\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12, x2] = _, t02 = transform2(x02 = +x02), t12 = transform2(x12 = +x12), t22 = transform2(x2 = +x2), k10 = t02 === t12 ? 0 : 0.5 / (t12 - t02), k21 = t12 === t22 ? 0 : 0.5 / (t22 - t12), s2 = t12 < t02 ? -1 : 1, scale2) : [x02, x12, x2];\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = !!_, scale2) : clamp2;\n    };\n    scale2.interpolator = function(_) {\n      return arguments.length ? (interpolator = _, scale2) : interpolator;\n    };\n    function range2(interpolate2) {\n      return function(_) {\n        var r0, r1, r2;\n        return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate2, [r0, r1, r2]), scale2) : [interpolator(0), interpolator(0.5), interpolator(1)];\n      };\n    }\n    scale2.range = range2(interpolate$1);\n    scale2.rangeRound = range2(interpolateRound);\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t) {\n      transform2 = t, t02 = t(x02), t12 = t(x12), t22 = t(x2), k10 = t02 === t12 ? 0 : 0.5 / (t12 - t02), k21 = t12 === t22 ? 0 : 0.5 / (t22 - t12), s2 = t12 < t02 ? -1 : 1;\n      return scale2;\n    };\n  }\n  function diverging$1() {\n    var scale2 = linearish(transformer$1()(identity$6));\n    scale2.copy = function() {\n      return copy$1(scale2, diverging$1());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingLog() {\n    var scale2 = loggish(transformer$1()).domain([0.1, 1, 10]);\n    scale2.copy = function() {\n      return copy$1(scale2, divergingLog()).base(scale2.base());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingSymlog() {\n    var scale2 = symlogish(transformer$1());\n    scale2.copy = function() {\n      return copy$1(scale2, divergingSymlog()).constant(scale2.constant());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingPow() {\n    var scale2 = powish(transformer$1());\n    scale2.copy = function() {\n      return copy$1(scale2, divergingPow()).exponent(scale2.exponent());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingSqrt() {\n    return divergingPow.apply(null, arguments).exponent(0.5);\n  }\n  function assignTransitionStagger(transition, currentData, selection, presenter) {\n    const { layerStagger } = presenter.morphchartsref;\n    const { morphChartsRenderResult } = presenter;\n    const cubelayer = morphChartsRenderResult.getCubeLayer();\n    const range2 = transition.reverse ? [1, 0] : [0, 1];\n    if (!transition || transition.type === \"ordinal\" && !transition.reverse) {\n      delete layerStagger.cubes;\n    } else {\n      const staggerOrders = new Float64Array(cubelayer.positionsX.length);\n      switch (transition.type) {\n        case \"ordinal\": {\n          const scale2 = linear$1(range2).domain([0, currentData.length]);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            staggerOrders[glOrdinal] = scale2(i);\n          });\n          break;\n        }\n        case \"column\": {\n          if (transition.column.quantitative) {\n            const values2 = new Float64Array(currentData.length);\n            currentData.forEach((datum2, i) => {\n              values2[i] = datum2[transition.column.name];\n            });\n            const stats = getStats(currentData, transition.column);\n            const scale2 = linear$1(range2).domain([stats.min, stats.max]);\n            currentData.forEach((datum2, i) => {\n              const glOrdinal = datum2[GL_ORDINAL];\n              staggerOrders[glOrdinal] = scale2(values2[i]);\n            });\n          } else {\n            const strings2 = new Array(currentData.length);\n            currentData.forEach((datum2, i) => {\n              strings2[i] = datum2[transition.column.name];\n            });\n            getStats(currentData, transition.column, (distictValues) => {\n              currentData.forEach((datum2, i) => {\n                const glOrdinal = datum2[GL_ORDINAL];\n                const index2 = distictValues.indexOf(strings2[i]);\n                const staggerOrder = index2 / distictValues.length;\n                staggerOrders[glOrdinal] = transition.reverse ? 1 - staggerOrder : staggerOrder;\n              });\n            });\n          }\n          break;\n        }\n        case \"position\": {\n          const dimensions = {\n            x: cubelayer.positionsX,\n            y: cubelayer.positionsY,\n            z: cubelayer.positionsZ\n          };\n          const positions2 = dimensions[transition.dimension];\n          const values2 = new Float64Array(currentData.length);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            values2[i] = positions2[glOrdinal];\n          });\n          const stats = getStats(values2, null, \"number\", true);\n          const scale2 = linear$1(range2).domain([stats.min, stats.max]);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            staggerOrders[glOrdinal] = scale2(values2[i]);\n          });\n          break;\n        }\n      }\n      layerStagger.cubes = { staggerOrders, maxStaggerOrder: 1, minStaggerOrder: 0 };\n    }\n    cubelayer.update(morphChartsRenderResult.bounds, selection, layerStagger.cubes);\n  }\n  var __awaiter = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  const { defaultView } = defaults$1;\n  const zAxisZindex = 1010;\n  let didRegisterColorSchemes = false;\n  let Viewer$1 = class Viewer {\n    /**\n     * Instantiate a new Viewer.\n     * @param element Parent HTMLElement to present within.\n     * @param options Optional viewer options object.\n     */\n    constructor(element2, options2) {\n      this.element = element2;\n      this.options = deepMerge(defaultViewerOptions$1, options2);\n      this.presenter = new Presenter(element2, getPresenterStyle(this.options));\n      this._characterSet = new CharacterSet();\n      this._dataScope = new DataScope$2();\n      this._animator = new Animator(this._dataScope, {\n        onDataChanged: this.onDataChanged.bind(this),\n        onAnimateDataChange: this.onAnimateDataChange.bind(this)\n      });\n      this._details = new Details(this.presenter.getElement(PresenterElement$1.panel), this.options.language, this._animator, this._dataScope, (remap) => {\n        this.currentColorContext = ~~remap;\n        this.renderSameLayout();\n      }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n      this.insight = {};\n    }\n    changeColorContexts(colorContexts) {\n      this.colorContexts = colorContexts;\n      this.currentColorContext = 0;\n      this.options.onColorContextChange && this.options.onColorContextChange();\n    }\n    applyLegendColorContext(colorContext) {\n      const a2 = getActiveElementInfo();\n      mount(colorContext.legendElement, this.presenter.getElement(PresenterElement$1.legend));\n      setActiveElement(a2);\n      this.presenter.stage.legend = colorContext.legend;\n    }\n    onAnimateDataChange(dataChange, waitingLabel, handlerLabel, time2) {\n      var _a2;\n      if (time2 === void 0) {\n        const transitionDurations = ((_a2 = this.setup) === null || _a2 === void 0 ? void 0 : _a2.transitionDurations) || defaultPresenterConfig.transitionDurations;\n        time2 = transitionDurations.position + transitionDurations.stagger;\n      }\n      return new Promise((resolve2, reject) => {\n        let innerPromise;\n        if (dataChange === DataLayoutChange.refine) {\n          const oldColorContext = this.colorContexts[this.currentColorContext];\n          innerPromise = new Promise((innerResolve) => {\n            this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, cubeLayer) => {\n              finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n              this.overrideAxisLabels(stage);\n              cubeLayer.unitColorMap = oldColorContext.colorMap;\n              if (this.options.onStage) {\n                this.options.onStage(stage);\n              }\n            } })).then(() => {\n              this.applyLegendColorContext(oldColorContext);\n              innerResolve();\n            });\n          });\n        } else {\n          innerPromise = this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, colorMapper) => {\n            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            this.overrideAxisLabels(stage);\n            if (this.options.onStage) {\n              this.options.onStage(stage);\n            }\n          } }));\n        }\n        innerPromise.then(() => {\n          this.presenter.animationQueue(resolve2, time2, { waitingLabel, handlerLabel, animationCanceled: reject });\n        });\n      });\n    }\n    onDataChanged(dataLayout, filter2) {\n      return __awaiter(this, void 0, void 0, function* () {\n        switch (dataLayout) {\n          case DataLayoutChange.same: {\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            const hasActive = !!this._dataScope.active;\n            if (hasSelectedData || hasActive) {\n              this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n            } else {\n              this.presenter.morphChartsRenderResult.update({ cubes: null });\n            }\n            break;\n          }\n          case DataLayoutChange.refine: {\n            const oldColorContext = this.colorContexts[this.currentColorContext];\n            let colorMap;\n            this.presenter.morphChartsRenderResult.update({ cubes: null });\n            yield this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, cubeLayer) => {\n              colorMap = cubeLayer.unitColorMap;\n              cubeLayer.unitColorMap = oldColorContext.colorMap;\n              this.preStage(stage, cubeLayer);\n            }, onPresent: () => {\n              const newColorContext = {\n                colorMap,\n                legend: clone(this.presenter.stage.legend),\n                legendElement: this.presenter.getElement(PresenterElement$1.legend).children[0]\n              };\n              this.applyLegendColorContext(oldColorContext);\n              this.changeColorContexts([oldColorContext, newColorContext]);\n              this.onPresent();\n            } }));\n            if (!compare$4(this.insight.filter, filter2)) {\n              this.insight.filter = narrow(this.insight.filter, filter2);\n            }\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n            }\n            break;\n          }\n          case DataLayoutChange.reset: {\n            const colorContext = {\n              colorMap: null,\n              legend: null,\n              legendElement: null\n            };\n            this.changeColorContexts([colorContext]);\n            this.presenter.morphChartsRenderResult.update({ cubes: null });\n            yield this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { onPresent: () => {\n              populateColorContext(colorContext, this.presenter);\n              this.onPresent();\n            } }));\n            delete this.insight.filter;\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(null, null);\n            }\n            break;\n          }\n        }\n        if (this.options.onSelectionChanged) {\n          const sel = this.getSelection();\n          this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n        }\n      });\n    }\n    convertSearchToSet() {\n      if (this._dataScope.selection) {\n        const s2 = /* @__PURE__ */ new Set();\n        let found = false;\n        this._dataScope.selection.included.forEach((o, i) => {\n          s2.add(o[GL_ORDINAL]);\n          found = true;\n        });\n        if (!found) {\n          s2.add(-1);\n        }\n        return s2;\n      }\n    }\n    convertSetToSearch(s2) {\n      const search = {\n        expressions: []\n      };\n      s2.forEach((value2) => {\n        search.expressions.push({\n          name: GL_ORDINAL,\n          operator: \"==\",\n          value: value2,\n          clause: \"||\"\n        });\n      });\n      return search;\n    }\n    getSpecColumnsWithFilteredStats() {\n      if (!this._dataScope.hasFilteredData()) {\n        return this._specColumns;\n      }\n      const roles = [\"color\", \"facet\", \"group\", \"size\", \"sort\", \"sum\", \"x\", \"y\", \"z\"];\n      const specColumns = Object.assign({}, this._specColumns);\n      roles.forEach((r) => {\n        if (specColumns[r]) {\n          const column = Object.assign({}, specColumns[r]);\n          column.stats = this.getColumnStats(column);\n          specColumns[r] = column;\n        }\n      });\n      return specColumns;\n    }\n    renderNewLayout(signalValues, presenterConfig, view) {\n      return __awaiter(this, void 0, void 0, function* () {\n        const currData = this._dataScope.currentData();\n        const context2 = {\n          specColumns: this.getSpecColumnsWithFilteredStats(),\n          insight: this.insight,\n          specViewOptions: Object.assign(Object.assign({}, this.options), { zAxisOptions: {\n            showZAxis: true,\n            zIndex: zAxisZindex\n          }, collapseFacetAxes: true })\n        };\n        const specResult = build(context2, currData);\n        if (!specResult.errors) {\n          const uiValues = extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n          applySignalValues(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n          unbindSignalUI(specResult.vegaSpec);\n          this.vegaSpec = specResult.vegaSpec;\n          this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n          this.specCapabilities = specResult.specCapabilities;\n          const config = this.createConfig(presenterConfig);\n          this._lastPresenterConfig = config.presenterConfig;\n          if (view) {\n            config.getView = () => view;\n          }\n          if (!didRegisterColorSchemes) {\n            registerColorSchemes(base$3.vega);\n            didRegisterColorSchemes = true;\n          }\n          try {\n            if (this.vegaViewGl) {\n              this.vegaViewGl.finalize();\n            }\n            const runtime2 = base$3.vega.parse(this.vegaSpec);\n            this.vegaViewGl = new ViewGl(runtime2, config).renderer(\"morphcharts\").initialize(this.element);\n            yield this.vegaViewGl.runAsync();\n            const handler = (n, v) => {\n              this._characterSet.resetCharacterSet(true);\n            };\n            this.vegaSpec.signals.forEach((s2) => {\n              this.vegaViewGl.addSignalListener(s2.name, handler);\n            });\n            this.configForSignalCapture(config.presenterConfig);\n          } catch (e) {\n            specResult.errors = [e.message];\n          }\n          if (!specResult.errors) {\n            ensureHeaders(this.presenter, this.options.language.headers);\n          }\n        }\n        if (specResult.errors) {\n          if (this.options.onError) {\n            this.options.onError(specResult.errors);\n          } else if (this.presenter.logger) {\n            this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join(\"\\n\")}`);\n          }\n        }\n        return specResult;\n      });\n    }\n    /**\n     * Render the same layout with new options.\n     * @param newViewerOptions New options object.\n     */\n    renderSameLayout(newViewerOptions) {\n      const colorContext = this.colorContexts[this.currentColorContext];\n      this.applyLegendColorContext(colorContext);\n      if (newViewerOptions) {\n        if (newViewerOptions.colors) {\n          const mcColors = this.getMorphChartsColors();\n          this.presenter.configColors(mcColors);\n          this._lastPresenterConfig.morphChartsColors = mcColors;\n        }\n        this.options = deepMerge(this.options, newViewerOptions);\n      }\n      this.presenter.morphChartsRenderResult.getCubeLayer().unitColorMap = colorContext.colorMap;\n      this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n    }\n    getView(view) {\n      if (view === void 0) {\n        if (this.presenter.view === null) {\n          return defaultView;\n        } else {\n          return this.presenter.view;\n        }\n      } else {\n        return view;\n      }\n    }\n    transformData(values2, transform2) {\n      try {\n        const runtime2 = base$3.vega.parse({\n          $schema: \"https://vega.github.io/schema/vega/v4.json\",\n          data: [{\n            name: \"source\",\n            values: values2,\n            transform: transform2\n          }]\n        });\n        new ViewGl(runtime2).run();\n      } catch (e) {\n      }\n      return values2;\n    }\n    /**\n     * Render data into a visualization.\n     * @param insightSetup InsightSetup object to create a visualization rendering.\n     * @param data Array of data objects.\n     * @param renderOptions Optional RenderOptions object.\n     */\n    render(insightSetup_1, data_1) {\n      return __awaiter(this, arguments, void 0, function* (insightSetup, data2, renderOptions = {}) {\n        const { insight, setup: setup2 } = insightSetup;\n        let result;\n        if (!compare$4(insight.filter, this.insight.filter)) {\n          const transitionDurations = (setup2 === null || setup2 === void 0 ? void 0 : setup2.transitionDurations) || defaultPresenterConfig.transitionDurations;\n          const renderTime = transitionDurations.position + transitionDurations.stagger;\n          const allowAsyncRenderTime = renderTime + this.options.filterRenderingTimerPadding;\n          if (insight.filter) {\n            result = yield this._render(insightSetup, data2, renderOptions, true);\n            this.presenter.animationQueue(() => {\n              this.filter(insight.filter, renderOptions.rebaseFilter && renderOptions.rebaseFilter());\n            }, allowAsyncRenderTime, { waitingLabel: \"layout before refine\", handlerLabel: \"refine after layout\" });\n          } else {\n            this._dataScope.setFilteredData(null);\n            result = yield this._render(insightSetup, data2, renderOptions, true);\n            this.presenter.animationQueue(() => {\n              this.reset();\n            }, allowAsyncRenderTime, { waitingLabel: \"layout before reset\", handlerLabel: \"reset after layout\" });\n          }\n        } else {\n          result = yield this._render(insightSetup, data2, renderOptions, false);\n        }\n        return result;\n      });\n    }\n    shouldViewstateTransition(newInsight, oldInsight) {\n      if (!oldInsight.columns)\n        return false;\n      if (oldInsight.chart !== newInsight.chart)\n        return true;\n      if (oldInsight.size.height !== newInsight.size.height)\n        return true;\n      if (oldInsight.size.width !== newInsight.size.width)\n        return true;\n      if (oldInsight.columns.facet !== newInsight.columns.facet)\n        return true;\n      return false;\n    }\n    configForSignalCapture(presenterConfig) {\n      const colorContext = {\n        colorMap: null,\n        legend: null,\n        legendElement: null\n      };\n      presenterConfig.preStage = (stage, cubeLayer) => {\n        if (this._shouldSaveColorContext()) {\n          colorContext.colorMap = cubeLayer.unitColorMap;\n        }\n        this.preStage(stage, cubeLayer);\n      };\n      presenterConfig.onPresent = () => {\n        if (this._shouldSaveColorContext()) {\n          populateColorContext(colorContext, this.presenter);\n          this.changeColorContexts([colorContext]);\n          this._dataScope.deselect();\n        }\n        this.onPresent();\n      };\n    }\n    onPresent() {\n      var _a2;\n      if ((_a2 = this.setup) === null || _a2 === void 0 ? void 0 : _a2.transition) {\n        assignTransitionStagger(this.setup.transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n      }\n      this.options.onPresent && this.options.onPresent();\n    }\n    _render(insightSetup, data2, renderOptions, forceNewCharacterSet) {\n      return __awaiter(this, void 0, void 0, function* () {\n        const { insight, setup: setup2 } = insightSetup;\n        if (this._tooltip) {\n          this._tooltip.destroy();\n          this._tooltip = null;\n        }\n        if (this._dataScope.setData(data2, renderOptions.columns)) {\n          this.transformData(data2, insight.transform);\n        }\n        this._specColumns = getSpecColumns(insight, this._dataScope.getColumns(renderOptions.columnTypes));\n        const ordinalMap = assignOrdinals(this._specColumns, data2, renderOptions.ordinalMap);\n        this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n        this.insight = clone(insight);\n        this.setup = setup2;\n        this._shouldSaveColorContext = () => !renderOptions.initialColorContext;\n        const colorContext = renderOptions.initialColorContext || {\n          colorMap: null,\n          legend: null,\n          legendElement: null\n        };\n        const specResult = yield this.renderNewLayout(insight.signalValues, Object.assign(Object.assign({}, setup2 || {}), { preStage: (stage, cubeLayer) => {\n          if (this._shouldSaveColorContext()) {\n            colorContext.colorMap = cubeLayer.unitColorMap;\n          } else {\n            cubeLayer.unitColorMap = colorContext.colorMap;\n          }\n          const hasSelectedData = !!this._dataScope.hasSelectedData();\n          if (hasSelectedData || this._dataScope.active) ;\n          this.preStage(stage, cubeLayer);\n        }, onPresent: () => {\n          if (this._shouldSaveColorContext()) {\n            populateColorContext(colorContext, this.presenter);\n            this.changeColorContexts([colorContext]);\n          } else {\n            this.applyLegendColorContext(colorContext);\n          }\n          this.onPresent();\n        }, shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight) }), this.getView(insight.view));\n        this._shouldSaveColorContext = () => !renderOptions.discardColorContextUpdates || !renderOptions.discardColorContextUpdates();\n        this._details.render();\n        const result = { ordinalMap, specResult };\n        return result;\n      });\n    }\n    overrideAxisLabels(stage) {\n    }\n    preLayer(stage) {\n      let axisRole;\n      for (axisRole in stage.axes) {\n        const capability = this.specCapabilities.roles.filter((r) => r.role === axisRole)[0];\n        if (capability && (capability.axisSelectionBetweenTicks || capability.axisSelection === \"exact\")) {\n          moveTicksBetween(stage.axes[axisRole]);\n        }\n      }\n    }\n    preStage(stage, cubeLayer) {\n      this.overrideAxisLabels(stage);\n      this._axisSelection = new AxisSelection(this.specCapabilities, this._specColumns, stage);\n      finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n      if (this.options.onStage) {\n        this.options.onStage(stage);\n      }\n    }\n    onCubeClick(e, cube) {\n      this.options.onCubeClick && this.options.onCubeClick(e, cube);\n      const hasSelectedData = this._dataScope.hasSelectedData();\n      if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n        const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n        if (indexWithinSelection.index >= 0) {\n          this.activate(indexWithinSelection.datum);\n          this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n          if (this.options.onSelectionChanged) {\n            const sel = this.getSelection();\n            this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n          }\n          return;\n        }\n      }\n      if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][GL_ORDINAL] === cube.ordinal) {\n        this.deselect();\n        return;\n      }\n      const search = {\n        name: GL_ORDINAL,\n        operator: \"==\",\n        value: cube.ordinal\n      };\n      this.select(search);\n    }\n    onCubeHover(event2, cube) {\n      var _a2, _b2;\n      if (this._tooltip) {\n        this._tooltip.destroy();\n        this._tooltip = null;\n      }\n      if (!cube) {\n        return;\n      }\n      const currentData = this._dataScope.currentData();\n      const index2 = getDataIndexOfCube(cube, currentData);\n      if (index2 >= 0) {\n        const dataItem = cleanDataItem(((_a2 = this.options.tooltipOptions) === null || _a2 === void 0 ? void 0 : _a2.prepareDataItem(currentData[index2])) || currentData[index2]);\n        const tooltipCreateOptions = {\n          dataItem,\n          event: event2\n        };\n        if ((_b2 = this.options.tooltipOptions) === null || _b2 === void 0 ? void 0 : _b2.create) {\n          this._tooltip = this.options.tooltipOptions.create(tooltipCreateOptions);\n        } else {\n          this._tooltip = new Tooltip$1(Object.assign(Object.assign({}, tooltipCreateOptions), { cssPrefix: this.presenter.style.cssPrefix }));\n        }\n      }\n    }\n    onTextHover(e, t) {\n      if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor)\n        return false;\n      return !colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n    }\n    getMorphChartsColors() {\n      const { colors: colors2 } = this.options;\n      return {\n        activeItemColor: colors2.activeCube,\n        axesGridBackgroundColor: colors2.backgroundColor,\n        axesGridHighlightColor: colors2.axisSelectHighlight,\n        axesGridMajorColor: colors2.gridLine,\n        axesGridMinorColor: colors2.gridLine,\n        axesGridZeroColor: colors2.gridLine,\n        axesTextHeadingColor: colors2.axisText,\n        axesTextLabelColor: colors2.axisText,\n        axesTextTitleColor: colors2.axisText,\n        backgroundColor: colors2.backgroundColor,\n        textBorderColor: colors2.backgroundColor,\n        textColor: colors2.axisText\n      };\n    }\n    createConfig(c2) {\n      var _a2;\n      const { getTextColor, getTextHighlightColor, onTextClick } = this.options;\n      const defaultPresenterConfig2 = {\n        morphChartsColors: this.getMorphChartsColors(),\n        zAxisZindex,\n        getCharacterSet: (stage) => this._characterSet.getCharacterSet(stage),\n        getTextColor,\n        getTextHighlightColor,\n        onTextClick: (e, t) => {\n          if (t.metaData && t.metaData.search) {\n            const search = getSearchGroupFromVegaValue(t.metaData.search);\n            if (this.options.onAxisClick) {\n              this.options.onAxisClick(e, search);\n            } else {\n              this.select(search);\n            }\n          }\n          if (onTextClick) {\n            onTextClick(e, t);\n          }\n        },\n        onCubeClick: this.onCubeClick.bind(this),\n        onCubeHover: this.onCubeHover.bind(this),\n        onTextHover: this.onTextHover.bind(this),\n        preLayer: this.preLayer.bind(this),\n        preStage: this.preStage.bind(this),\n        onPresent: this.onPresent.bind(this),\n        onAxisConfig: (cartesian2, dim3d, axis) => {\n          if (!axis)\n            return;\n          const role = this.specCapabilities.roles.filter((r) => r.role === axis.axisRole)[0];\n          if (role === null || role === void 0 ? void 0 : role.axisSelection) {\n            cartesian2.isDivisionPickingEnabled[dim3d] = true;\n            cartesian2.arePickDivisionsVisible[dim3d] = axis.tickText.length > 0;\n            cartesian2.isLabelPickingEnabled[dim3d] = true;\n            cartesian2.isTitlePickingEnabled[dim3d] = true;\n            cartesian2.isHeadingPickingEnabled[dim3d] = true;\n            cartesian2.isGridPickingEnabled = false;\n          }\n        },\n        onAxesComplete: (cartesian2) => {\n        },\n        axisPickGridCallback: (divisions, e) => {\n          const search = this._axisSelection.convert(divisions);\n          if (this.options.onAxisClick) {\n            this.options.onAxisClick(e, search);\n          } else {\n            this.select(search);\n          }\n        },\n        onLayerClick: (e) => {\n          this.options.onCanvasClick && this.options.onCanvasClick(e);\n          this.deselect();\n        },\n        onLegendClick: (e, legend2, clickedIndex) => {\n          const legendRow = clickedIndex !== null && legend2.rows[clickedIndex];\n          if (legendRow) {\n            if (this.options.onLegendRowClick) {\n              this.options.onLegendRowClick(e, legendRow);\n            } else {\n              this.select(legendRow.search);\n            }\n          } else if (this.options.onLegendHeaderClick) {\n            this.options.onLegendHeaderClick(e);\n          }\n        },\n        onSceneRectAssignCubeOrdinal: (datum2) => {\n          return datum2[GL_ORDINAL];\n        },\n        onTargetViewState: (h2, w2) => {\n          const { height: height2, width: width2 } = this.insight.size;\n          let newViewStateTarget;\n          if (this.options.onNewViewStateTarget) {\n            newViewStateTarget = this.options.onNewViewStateTarget();\n          }\n          return { height: height2, width: width2, newViewStateTarget };\n        },\n        layerSelection: {\n          cubes: this.convertSearchToSet()\n        },\n        preserveDrawingBuffer: this.options.preserveDrawingBuffer\n      };\n      if (!this.options.disableLasso) {\n        defaultPresenterConfig2.onLasso = (ids, e) => {\n          this.deselect();\n          const search = this.convertSetToSearch(ids);\n          this.select(search);\n        };\n      }\n      if (this.options.onBeforeCreateLayers) {\n        defaultPresenterConfig2.preLayer = (stage) => {\n          this.preLayer(stage);\n          this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n        };\n      }\n      const config = {\n        presenter: this.presenter,\n        presenterConfig: Object.assign(defaultPresenterConfig2, c2)\n      };\n      if ((_a2 = this.setup) === null || _a2 === void 0 ? void 0 : _a2.transitionDurations) {\n        config.presenterConfig.transitionDurations = this.setup.transitionDurations;\n      }\n      return config;\n    }\n    /**\n     * Filter the data and animate.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n     */\n    filter(search, rebase = false) {\n      const u2 = this._dataScope.createUserSelection(search, false, rebase);\n      return new Promise((resolve2, reject) => {\n        this._animator.filter(search, u2.included, u2.excluded, rebase).then(() => {\n          this._details.clear();\n          this._details.clearSelection();\n          this._details.populate(this._dataScope.selection);\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Remove any filtration and animate.\n     */\n    reset() {\n      return new Promise((resolve2, reject) => {\n        this._animator.reset().then(() => {\n          this._details.clear();\n          this._details.clearSelection();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Select cubes by a filter expression.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     */\n    select(search) {\n      return new Promise((resolve2, reject) => {\n        this._animator.select(search).then(() => {\n          this._details.populate(this._dataScope.selection);\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Removes any selection.\n     */\n    deselect() {\n      return new Promise((resolve2, reject) => {\n        this._animator.deselect().then(() => {\n          this._details.clearSelection();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Gets the current selection.\n     */\n    getSelection() {\n      if (!this._dataScope)\n        return null;\n      const selectionState = {\n        search: this._dataScope.selection && this._dataScope.selection.search || null,\n        selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n        active: this._dataScope.active\n      };\n      return selectionState;\n    }\n    /**\n     * Set one data row to the active state.\n     */\n    activate(datum2) {\n      return new Promise((resolve2, reject) => {\n        this._animator.activate(datum2).then(() => {\n          this.presenter.morphChartsRenderResult.activate(datum2[GL_ORDINAL]);\n          this._details.render();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Deactivate item.\n     */\n    deActivate() {\n      return new Promise((resolve2, reject) => {\n        if (this._dataScope && this._dataScope.active) {\n          this._animator.deactivate().then(() => {\n            this.presenter.morphChartsRenderResult.activate(-1);\n            this._details.render();\n            resolve2();\n          });\n        } else {\n          resolve2();\n        }\n      });\n    }\n    /**\n     * Gets the current camera.\n     * @param transitionFinal Optional flag to get camera destination when transition completes.\n     */\n    getCamera(transitionFinal = false) {\n      var _a2, _b2, _c2, _d2, _e2, _f, _g;\n      let position2 = [0, 0, 0];\n      let rotation2 = [0, 0, 0, 0];\n      if (transitionFinal) {\n        position2 = Array.from((_b2 = (_a2 = this.presenter) === null || _a2 === void 0 ? void 0 : _a2.morphchartsref) === null || _b2 === void 0 ? void 0 : _b2.cameraTransitioner.vPosition.to);\n        rotation2 = Array.from((_d2 = (_c2 = this.presenter) === null || _c2 === void 0 ? void 0 : _c2.morphchartsref) === null || _d2 === void 0 ? void 0 : _d2.cameraTransitioner.qRotation.to);\n      } else {\n        const camera = (_g = (_f = (_e2 = this.presenter) === null || _e2 === void 0 ? void 0 : _e2.morphchartsref) === null || _f === void 0 ? void 0 : _f.core) === null || _g === void 0 ? void 0 : _g.camera;\n        if (camera) {\n          camera.getPosition(position2);\n          camera.getOrbit(rotation2);\n        }\n      }\n      return { position: position2, rotation: rotation2, captureSize: this.insight.size };\n    }\n    /**\n     * Sets the current camera.\n     * @param camera Camera to set.\n     */\n    setCamera(camera) {\n      var _a2, _b2;\n      if (camera) {\n        (_b2 = (_a2 = this.presenter) === null || _a2 === void 0 ? void 0 : _a2.morphChartsRenderResult) === null || _b2 === void 0 ? void 0 : _b2.moveCamera(camera);\n      }\n    }\n    /**\n     * Gets the current insight with signal values.\n     */\n    getInsight() {\n      const insight = Object.assign({}, this.insight);\n      insight.signalValues = this.getSignalValues();\n      return insight;\n    }\n    /**\n     * Gets column stats from current data (filtered or all).\n     * @param column Column to get stats for.\n     */\n    getColumnStats(column) {\n      return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n    }\n    /**\n     * Gets current signal values.\n     */\n    getSignalValues() {\n      return extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n    }\n    assignTransitionStagger(transition) {\n      assignTransitionStagger(transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n    }\n    finalize() {\n      if (this._dataScope)\n        this._dataScope.finalize();\n      if (this._details)\n        this._details.finalize();\n      if (this._tooltip)\n        this._tooltip.destroy();\n      if (this.vegaViewGl)\n        this.vegaViewGl.finalize();\n      if (this.presenter)\n        this.presenter.finalize();\n      if (this.element)\n        this.element.innerHTML = \"\";\n      this.colorContexts = null;\n      this.element = null;\n      this.options = null;\n      this.presenter = null;\n      this.vegaSpec = null;\n      this.vegaViewGl = null;\n      this._animator = null;\n      this._dataScope = null;\n      this._details = null;\n      this._tooltip = null;\n    }\n  };\n  Viewer$1.defaultViewerOptions = defaultViewerOptions$1;\n  const version$4 = \"4.0.6\";\n  const use$4 = use$5;\n  const index$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    VegaMorphCharts: index$5,\n    Viewer: Viewer$1,\n    colorSchemes,\n    constants: constants$1,\n    searchExpression: index$6,\n    specs: index$7,\n    types: types$1,\n    use: use$4,\n    util: util$3,\n    version: version$4\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var collectionCompare = compare$2;\n  function compare$2(value1, value2) {\n    if (value1 === value2) {\n      return true;\n    }\n    if (value1 !== value1 && value2 !== value2) {\n      return true;\n    }\n    if ({}.toString.call(value1) != {}.toString.call(value2)) {\n      return false;\n    }\n    if (value1 !== Object(value1)) {\n      return false;\n    }\n    if (!value1) {\n      return false;\n    }\n    if (Array.isArray(value1)) {\n      return compareArrays(value1, value2);\n    }\n    if ({}.toString.call(value1) == \"[object Set]\") {\n      return compareArrays(Array.from(value1), Array.from(value2));\n    }\n    if ({}.toString.call(value1) == \"[object Object]\") {\n      return compareObjects(value1, value2);\n    } else {\n      return compareNativeSubtypes(value1, value2);\n    }\n  }\n  function compareNativeSubtypes(value1, value2) {\n    return value1.toString() === value2.toString();\n  }\n  function compareArrays(value1, value2) {\n    var len2 = value1.length;\n    if (len2 != value2.length) {\n      return false;\n    }\n    var alike = true;\n    for (var i = 0; i < len2; i++) {\n      if (!compare$2(value1[i], value2[i])) {\n        alike = false;\n        break;\n      }\n    }\n    return alike;\n  }\n  function compareObjects(value1, value2) {\n    var keys1 = Object.keys(value1).sort();\n    var keys2 = Object.keys(value2).sort();\n    var len2 = keys1.length;\n    if (len2 != keys2.length) {\n      return false;\n    }\n    for (var i = 0; i < len2; i++) {\n      var key1 = keys1[i];\n      var key2 = keys2[i];\n      if (!(key1 == key2 && compare$2(value1[key1], value2[key2]))) {\n        return false;\n      }\n    }\n    return true;\n  }\n  const compare$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    default: collectionCompare\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const classList = (...args) => {\n    return args.filter(Boolean).join(\" \");\n  };\n  const deepCompare = collectionCompare || compare$3;\n  function addNullable(insight, signalValues) {\n    const withNulls = Object.assign(Object.assign({ view: null, filter: null }, insight), { signalValues });\n    return withNulls;\n  }\n  function compareInsight(viewer, insight) {\n    const currentInsight = viewer.getInsight();\n    const a2 = addNullable(currentInsight, Object.assign(Object.assign({}, viewer.insight.signalValues), currentInsight.signalValues));\n    const b2 = addNullable(insight, Object.assign(Object.assign({}, a2.signalValues), insight.signalValues));\n    const compare2 = deepCompare(a2, b2);\n    return { a: a2, b: b2, compare: compare2 };\n  }\n  const util$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    classList,\n    compareInsight,\n    deepCompare\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const base$2 = {\n    react: null,\n    reactDOM: null\n  };\n  function use$3(react, reactDOM, vega2) {\n    use$5(vega2);\n    base$2.react = react;\n    base$2.reactDOM = reactDOM;\n    Viewer.prototype = react.Component.prototype;\n  }\n  function _Viewer(_props) {\n    class __Viewer extends base$2.react.Component {\n      layout() {\n        const { props } = this;\n        this.lastData = props.data;\n        this.viewer.render({\n          insight: props.insight,\n          setup: props.setup\n        }, props.data, props.renderOptions).then((renderResult) => {\n          props.onView && props.onView(renderResult);\n        }).catch((e) => {\n          props.onError && props.onError(e);\n        });\n      }\n      view() {\n        var _a2, _b2, _c2, _d2, _e2;\n        const { props } = this;\n        let didLayout = false;\n        if (props.insight && props.data) {\n          const c2 = compareInsight(this.viewer, props.insight);\n          const sameDataRef = props.data === this.lastData;\n          if (!c2.compare || !sameDataRef) {\n            this.layout();\n            didLayout = true;\n          }\n        }\n        if (!didLayout && props.setup) {\n          const { camera } = props.setup;\n          if (camera !== \"hold\") {\n            if (!deepCompare(this.viewer.setup.camera, camera)) {\n              if (!camera) {\n                (_b2 = (_a2 = this.viewer) === null || _a2 === void 0 ? void 0 : _a2.presenter) === null || _b2 === void 0 ? void 0 : _b2.homeCamera();\n              } else {\n                this.viewer.setCamera(camera);\n              }\n              const setup2 = clone(this.viewer.setup);\n              setup2.camera = camera;\n              this.viewer.setup = setup2;\n            }\n          }\n          if (props.setup.renderer) {\n            (_e2 = (_d2 = (_c2 = this.viewer) === null || _c2 === void 0 ? void 0 : _c2.presenter) === null || _d2 === void 0 ? void 0 : _d2.morphchartsref) === null || _e2 === void 0 ? void 0 : _e2.setMorphChartsRendererOptions(props.setup.renderer);\n          }\n        }\n      }\n      componentDidMount() {\n        const { props } = this;\n        const element2 = base$2.reactDOM.findDOMNode(this.viewerDiv);\n        this.viewer = new Viewer$1(element2, props.viewerOptions);\n        if (props.onMount) {\n          if (props.onMount(this.viewer.presenter.getElement(PresenterElement$1.gl))) {\n            this.view();\n          }\n        } else {\n          this.view();\n        }\n      }\n      componentDidUpdate() {\n        const { props } = this;\n        this.viewer.options = deepMerge(this.viewer.options, props.viewerOptions);\n        this.view();\n      }\n      componentWillUnmount() {\n        this.viewer.finalize();\n      }\n      render() {\n        return base$2.react.createElement(\"div\", { className: \"sanddance-ReactViewer\", ref: (div) => this.viewerDiv = div });\n      }\n    }\n    return new __Viewer(_props);\n  }\n  const Viewer = _Viewer;\n  const version$3 = \"4.0.2\";\n  const index$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    SandDance: index$4,\n    Viewer,\n    use: use$3,\n    util: util$2,\n    version: version$3\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const strings$1 = {\n    appName: \"SandDance\",\n    bingsearch: \"Bing\",\n    bingsearchDescription: (term) => `Search Bing for \"${term}\"`,\n    buttonClose: \"Close\",\n    buttonSelect: \"Search & Select\",\n    buttonColorSchemeMap: \"Map color scheme to filtered data\",\n    buttonColorSchemeRemap: \"Remap color to filtered data\",\n    buttonColorSchemeKeep: \"Keep same color scheme\",\n    buttonCopyToClipboard: \"Copy to clipboard\",\n    buttonExclude: \"Exclude\",\n    buttonExport: \"Export\",\n    buttonExportCount: (total) => total == 1 ? \"Export 1 row...\" : `Export ${total} rows...`,\n    buttonIsolate: \"Isolate\",\n    buttonReset: \"Stop filtering\",\n    buttonDeselect: \"Clear selection\",\n    buttonToolbarFloat: \"Float toolbar\",\n    buttonToolbarDock: \"Dock toolbar\",\n    buttonToolbarHide: \"Hide toolbar\",\n    buttonToolbarShow: \"Show toolbar\",\n    buttonNextDataItem: \"Next data item\",\n    buttonPrevDataItem: \"Previous data item\",\n    buttonCreateSnapshot: \"Create snapshot\",\n    buttonNextSnapshot: \"Next snapshot\",\n    buttonPrevSnapshot: \"Previous snapshot\",\n    buttonUpdateSnapshot: \"Update snapshot\",\n    buttonAddExpression: \"Add expression\",\n    buttonAddExpressionGroup: \"Add group\",\n    buttonDeleteExpression: \"Delete\",\n    buttonDeleteExpressionGroup: \"Delete group\",\n    buttonClearSnapshots: \"Clear snapshots\",\n    buttonDeleteSnapshot: \"Delete snapshot\",\n    buttonEditSnapshot: \"Edit snapshot\",\n    buttonMoveUp: \"Move up\",\n    buttonMoveDown: \"Move down\",\n    buttonShowVegaSpec: \"Show Vega spec\",\n    buttonLaunchVegaEditor: \"Open Vega Editor\",\n    buttonCameraHome: \"Center chart in window\",\n    buttonTooltipMapping: \"Tooltip columns...\",\n    buttonBackgroundImage: \"Background image...\",\n    buttonTransitionReverse: \"Play Reverse\",\n    buttonTransitionPause: \"Pause\",\n    buttonTransitionPlay: \"Play\",\n    buttonUndo: \"Undo\",\n    buttonRedo: \"Redo\",\n    buttonColumnTypes: \"Column types...\",\n    buttonApply: \"Apply\",\n    buttonRemove: \"Remove\",\n    buttonResetToDefault: \"Reset to default\",\n    chartTypeBarChartH: \"Bar\",\n    chartTypeBarChartV: \"Column\",\n    chartTypeDensity: \"Density\",\n    chartTypeGrid: \"Grid\",\n    chartTypeScatterPlot: \"Scatter\",\n    chartTypeStacks: \"Stacks\",\n    chartTypeStrips: \"Strips\",\n    chartTypeTreeMap: \"Treemap\",\n    defaultFileName: \"sanddance-data\",\n    errorExportFilenameEmpty: \"Filename cannot be blank\",\n    errorExportFilenameCharacters: (characters) => `A filename cannot contain any of the following characters: ${characters}`,\n    errorColumnMustBeNumeric: \"Numeric column required for this chart type.\",\n    errorNumericValue: \"Value must be numeric\",\n    errorImageFormat: \"File is not an image\",\n    labelBackgroundImageDialogTitle: \"Background image\",\n    labelBackgroundImageSubtext: \"Background image can only be shown on Scatterplot, Density, and Stacks charts. Columns must be numeric type.\",\n    labelBackgroundLeft: \"Left extent\",\n    labelBackgroundRight: \"Right extent\",\n    labelBackgroundBottom: \"Bottom extent\",\n    labelBackgroundTop: \"Top extent\",\n    labelBlank: \"blank\",\n    labelNull: \"null\",\n    labelTrue: \"true\",\n    labelFalse: \"false\",\n    labelSystemInfo: \"System info\",\n    labelChangeColumnType: \"Change column type\",\n    labelChartSettings: \"Chart settings\",\n    labelEditColumn: \"Edit\",\n    labelColumnName: \"Column name\",\n    labelColumnType: \"Column type\",\n    labelColumnDistinct: \"Distinct values\",\n    labelColumnHasColorData: \"Has color data\",\n    labelColumnIsColorData: \"Is color data\",\n    labelColumnQuantitativeMin: \"Min\",\n    labelColumnQuantitativeMax: \"Max\",\n    labelColumnQuantitativeMean: \"Mean\",\n    labelDataBrowser: \"Data browser\",\n    labelDataScope: \"Scope\",\n    labelExport: \"Export Data\",\n    labelExportFormat: \"File format\",\n    labelExportCSV: \".CSV - Comma separated values\",\n    labelExportHTML: \".HTML - A SandDance html page embedding this data\",\n    labelExportJSON: \".JSON - JavaScript object notation\",\n    labelExportTSV: \".TSV - Tab separated values\",\n    labelHistory: \"History\",\n    labelHistoryWarning: \"This will erase your current history.\",\n    labelTools: \"Tools\",\n    labelHoldCamera: \"Keep previous camera position\",\n    labelVegaSpec: \"Vega specification\",\n    labelColor: \"Chart color\",\n    labelError: \"Error\",\n    labelExportFileName: \"File name\",\n    labelSnapshots: \"Snapshots\",\n    labelSnapshotSettingThumbnailWidth: \"Thumbnail image width\",\n    labelSearch: \"Select by search\",\n    labelSearchClause: \"Clause\",\n    labelSearchColumn: \"Field\",\n    labelSearchOperator: \"Operator\",\n    labelSearchValue: \"Value\",\n    labelSearchValuePlaceholder: \"Value to search for\",\n    labelChart: \"Chart\",\n    labelChartCanvas: \"Chart canvas\",\n    labelColumnMapping: \"Column Mapping\",\n    labelChartTypeOptions: \"Chart options\",\n    labelColorBin: \"Color binning\",\n    labelColorOptions: \"Color options\",\n    labelColorBinExplanation: \"For numeric columns\",\n    labelColorFieldInfo: (colorColumnName, colorColumnType, categoricalNumeric, distinctValueCount) => `Field <span className=\"fieldname\">${colorColumnName}</span> is of type <span className=\"fieldtype\">${colorColumnType}</span>${categoricalNumeric ? ` and has ${distinctValueCount} distinct values` : \"\"}.`,\n    labelColorFieldIsColorData: (colorColumnName) => `Field <span className=\"fieldname\">${colorColumnName}</span> contains direct color data.`,\n    labelColorBinNone: \"None (continuous)\",\n    labelColorBinQuantize: \"Quantize\",\n    labelColorBinQuantile: \"Quantile\",\n    labelColorFilter: \"Note: Colors will be re-mapped to the filter when viewing this snapshot.\",\n    labelColorScheme: \"Scheme\",\n    labelTotal: \"Total by\",\n    labelTotalByCountSquare: \"Count (Grid layout)\",\n    labelTotalByCountStrip: \"Count (Strip layout)\",\n    labelTotalBySumStrip: \"Sum (Strip layout)\",\n    labelTotalBySumTreemap: \"Sum (Treemap layout)\",\n    labelTotalBySumStripPercent: \"Sum as percentage (Strip layout)\",\n    labelColumnColor: \"Color by\",\n    labelColumnFacet: \"Facet by\",\n    labelFacetLayout: \"Facet layout\",\n    labelFacetLayoutWrap: \"Wrap\",\n    // labelFacetLayoutHorizontal: 'Horizontal',\n    // labelFacetLayoutVertical: 'Vertical',\n    labelFacetLayoutCross: \"⊞\",\n    labelColumnFacetV: \"Cross facet by\",\n    labelColumnSort: \"Sort by\",\n    labelColumnX: \"X Axis\",\n    labelColumnY: \"Y Axis\",\n    labelColumnZ: \"Z Axis\",\n    labelColumnSize: \"Size by\",\n    labelColumnGroup: \"Group by\",\n    labelAliasColor: \"Color\",\n    labelAliasFacet: \"Facet\",\n    labelAliasFacetV: \"Vertical facet\",\n    labelAliasSort: \"Sort\",\n    labelAliasX: \"X Axis\",\n    labelAliasY: \"Y Axis\",\n    labelAliasZ: \"Z Axis\",\n    labelAliasSize: \"Size\",\n    labelAliasGroup: \"Group\",\n    labelDataItemIsFiltered: \"Item is filtered from view\",\n    labelHistoryInit: \"Initial view\",\n    labelHistoryFilterClear: \"Clear filter\",\n    labelHistoryFilterIExclude: \"Exclude filter\",\n    labelHistoryFilterIsolate: \"Isolate filter\",\n    labelHistoryChangeChartType: (chart) => `Change chart type to ${chart}`,\n    labelHistoryMapColumn: (column) => `Map ${column} role`,\n    labelHistoryUnMapColumn: (column) => `Unmap ${column} role`,\n    labelHistoryReviveSnapshot: \"Revive snapshot\",\n    labelHistoryColorBin: \"Change color binning\",\n    labelHistoryDirectColor: \"Change direct color\",\n    labelRenderer: \"Renderer quality\",\n    labelRendererAdvancedDisabled: \"Renderer quality (Enhanced 3D mode not supported on this device)\",\n    labelRendererBasic: \"Standard mode\",\n    labelRendererAdvanced: \"Enhanced 3D mode\",\n    labelRendererOptions: \"Renderer options ...\",\n    labelRendererOptionsDialogTitle: \"Renderer options\",\n    labelRendererOptionsAntialias: \"Antialias\",\n    labelRendererOptionsBloom: \"Bloom highlighting (for selections)\",\n    labelRendererOptionsBloomIntensity: \"Intensity\",\n    labelRendererOptionsDof: \"Depth of Field\",\n    labelRendererOptionsDofRange: \"Focus Range\",\n    labelRendererOptionsFxaa: \"Antialias\",\n    labelRendererOptionsShadow: \"Shadows\",\n    labelRendererOptionsSsao: \"Screen Space Ambient Occlusion\",\n    labelShowLegend: \"Show legend\",\n    labelShowAxes: \"Show axes\",\n    labelSnapshotTitle: \"Title\",\n    labelSnapshotDescription: \"Note (optional)\",\n    labelTooltipMapping: \"Tooltip columns\",\n    labelTransition: \"Transition\",\n    labelTransitionOptions: \"Transition options\",\n    labelTransitionScrubber: \"Scrub transition\",\n    labelTransitionStaggerBy: \"Stagger by\",\n    labelTransitionStaggerByOrdinal: \"Data order\",\n    labelTransitionStaggerByColumn: \"Column\",\n    labelTransitionStaggerByPosition: \"Axis position\",\n    labelTransitionStaggerOptions: \"Stagger options\",\n    labelTransitionStaggerReverse: \"Reverse\",\n    labelTransitionDurations: \"Transition durations\",\n    labelTransitionCamera: \"2D / 3D view\",\n    labelTransitionDuration: \"Duration\",\n    labelTransitionStagger: \"Stagger\",\n    labelVegaSpecData: \"Data reference\",\n    labelVegaSpecNotes: \"Note: You may need to change the color scheme to make this visible in Vega.\",\n    labelYes: \"Yes\",\n    labelNo: \"No\",\n    labelConfirmation: \"Are you sure?\",\n    labelColumnTypes: \"Column types\",\n    loading: \"Loading...\",\n    schemeCategorical: \"Categorical\",\n    schemeCyclical: \"Cyclical\",\n    schemeDiverging: \"Diverging\",\n    schemeDual: \"Dual\",\n    schemeSequentialMultiHue: \"Sequential Multi Hue\",\n    schemeSequentialMultiHueDark: \"For dark backgrounds\",\n    schemeSequentialMultiHueLight: \"For light backgrounds\",\n    schemeSequentialSingleHue: \"Sequential Single Hue\",\n    selectDataSpanAll: \"All rows\",\n    selectDataSpanFilter: \"Filtered\",\n    selectDataSpanSelection: \"Selected\",\n    selectVegaSpecDataNone: \"None\",\n    selectVegaSpecDataInline: \"Inline - WARNING this may use substantial browser/clipboard memory for large data sets.\",\n    selectVegaSpecDataUrl: \"URL\",\n    record: (current, total) => `${current} of ${total}`,\n    searchEQ: \"=\",\n    searchNEQ: \"<>\",\n    searchGT: \">\",\n    searchGTE: \">=\",\n    searchLT: \"<\",\n    searchLTE: \"<=\",\n    searchNULL: \"is null or empty\",\n    searchIN: \"contains\",\n    searchSW: \"starts with\",\n    searchWHERE: \"Where\",\n    searchAND: \"and\",\n    searchOR: \"or\",\n    selectAny: \"-- any --\",\n    selectNone: \"-- none --\",\n    selectNumeric: \"Numeric\",\n    selectNonNumeric: \"Categorical\",\n    selectDirectColor: \"Direct color\",\n    selectReference: \"Column mappings\",\n    tooltipSearch: (column, value2) => `Click to search in '${column}' for \"${value2}\"`,\n    labelRequired: \"required\",\n    labelSystem: \"System\",\n    labelViewType2d: \"View in 2D\",\n    labelViewType3d: \"View in 3D\",\n    labelDataColors: \"Enabled if this data column contains any CSS color values.\",\n    labelDataNullAll: \"Loading data...\",\n    labelDataNullFiltered: \"You can filter by first making a selection, then choosing <b>Isolate</b> or <b>Exclude</b> in the top bar.\",\n    labelDataNullSelection: \"You can select by: <ul><li>clicking the chart axes</li><li>clicking in the legend</li><li>searching</li</ul>\",\n    labelZeroAll: \"Dataset contains zero rows.\",\n    labelZeroSearchResults: \"No rows matched your search.\",\n    signalGroups: [\n      { prefix: \"Chart\", label: \"Chart options\" },\n      { prefix: \"Mark\", label: \"Mark options\" },\n      { prefix: \"RoleColor\", label: \"Color options\" },\n      { prefix: \"RoleFacet\", label: \"Facet options\" },\n      { prefix: \"RoleSort\", label: \"Sort options\" },\n      { prefix: \"RoleX\", label: \"X axis options\" },\n      { prefix: \"RoleY\", label: \"Y axis options\" },\n      { prefix: \"RoleZ\", label: \"Z axis options\" },\n      { prefix: \"Text\", label: \"Text options\" },\n      { prefix: \"*\", label: \"Options\" }\n    ],\n    percentValueFormat: (value2) => `${value2}%`\n  };\n  function IconButton$1(props) {\n    return base$1.react.createElement(base$1.fluentUI.IconButton, Object.assign({}, props, { styles: props.styles || {\n      root: {\n        color: props.themePalette.black\n      },\n      rootHovered: {\n        background: \"transparent\",\n        color: props.themePalette.themePrimary\n      },\n      rootPressed: {\n        background: \"transparent\"\n      },\n      menuIcon: {\n        display: \"none\"\n      }\n    }, iconProps: { iconName: props.iconName }, menuProps: props.menuProps }));\n  }\n  const maxCategoricalColors = 20;\n  function defaultColorScheme$1(c2) {\n    if (c2.quantitative) {\n      return \"redyellowgreen\";\n    } else if (c2.stats.distinctValueCount === 2) {\n      return \"dual_redgreen\";\n    } else if (c2.stats.distinctValueCount <= 10) {\n      return \"category10\";\n    }\n    return \"category20\";\n  }\n  const maxDistinctVal = 20;\n  const minDistinctVal = 2;\n  class BarChartRecommenderSummary {\n    constructor(columns, data2) {\n      let score2 = -1;\n      for (let i = 0; i < columns.length; i++) {\n        const recommendation = new BarChartRecommender(columns[i], data2).recommend();\n        if (recommendation.score > score2) {\n          this.best = recommendation;\n          score2 = recommendation.score;\n        }\n        if (score2 === 1)\n          break;\n      }\n      for (let k = 0; k < columns.length; k++) {\n        const column = columns[k];\n        if (column.name === this.best.columns.x || column.stats.isSequential)\n          continue;\n        if (column.quantitative || column.stats.distinctValueCount < maxCategoricalColors && column.stats.distinctValueCount > 1) {\n          this.best.columns.color = this.best.columns.sort = column.name;\n          this.best.scheme = defaultColorScheme$1(column);\n          if (column.quantitative) {\n            this.best.colorBin = \"quantile\";\n          }\n          break;\n        }\n      }\n    }\n    recommend() {\n      return this.best;\n    }\n  }\n  class BarChartRecommender {\n    constructor(column, data2) {\n      this.score = 0;\n      this.column = column;\n      this.rules = [\n        (column2) => {\n          if (column2.stats.isSequential)\n            return false;\n          else if (column2.quantitative) {\n            return true;\n          } else if (!column2.quantitative && column2.stats.distinctValueCount <= maxDistinctVal && column2.stats.distinctValueCount >= minDistinctVal) {\n            return true;\n          } else {\n            return false;\n          }\n        }\n      ];\n      for (let i = 0; i < this.rules.length; i++) {\n        if (this.rules[i](column))\n          this.score++;\n      }\n    }\n    recommend() {\n      const rec = {\n        chart: \"barchart\",\n        columns: {\n          x: this.column.name\n        },\n        score: this.score,\n        scheme: void 0,\n        view: \"2d\"\n      };\n      return rec;\n    }\n  }\n  const longitudeNames = [\"lon\", \"long\", \"longitude\"];\n  const latitudeNames = [\"lat\", \"latitude\"];\n  function isSpec(names, limits, column, data2) {\n    let is = false;\n    const cname = column.name.toLowerCase();\n    for (let i = 0; i < names.length; i++) {\n      if (names[i] === cname) {\n        is = true;\n        break;\n      }\n    }\n    return is;\n  }\n  function isLongitude(column, data2) {\n    return isSpec(longitudeNames, [-180, 180], column);\n  }\n  function isLatitude(column, data2) {\n    return isSpec(latitudeNames, [-90, 90], column);\n  }\n  function isGeo(column, data2) {\n    return isLatitude(column) || isLongitude(column);\n  }\n  class ScatterPlotRecommenderSummary {\n    constructor(columns, data2) {\n      const rec = {\n        chart: \"scatterplot\",\n        score: void 0,\n        columns: {},\n        scheme: void 0,\n        view: \"2d\"\n      };\n      columns.forEach((column) => {\n        if (!rec.columns.x) {\n          if (column.name.toLowerCase() === \"x\") {\n            return rec.columns.x = column.name;\n          } else if (isLongitude(column)) {\n            return rec.columns.x = column.name;\n          }\n        }\n        if (!rec.columns.y) {\n          if (column.name.toLowerCase() === \"y\") {\n            return rec.columns.y = column.name;\n          } else if (isLatitude(column)) {\n            return rec.columns.y = column.name;\n          }\n        }\n        if (!rec.columns.color && !column.stats.isSequential) {\n          if (column.quantitative || column.stats.distinctValueCount < maxCategoricalColors) {\n            rec.columns.color = rec.columns.sort = column.name;\n            rec.scheme = defaultColorScheme$1(column);\n            if (column.quantitative) {\n              rec.colorBin = \"quantile\";\n            }\n            return;\n          }\n        }\n      });\n      if (rec.columns.x && rec.columns.y) {\n        this.best = rec;\n      }\n    }\n    recommend() {\n      return this.best;\n    }\n  }\n  function preferredColumnForTreemapSize(columns, strict) {\n    for (let i = 0; i < columns.length; i++) {\n      const c2 = columns[i];\n      if (c2.quantitative) {\n        if (strict && c2.stats.hasNegative)\n          continue;\n        if (strict && c2.stats.isSequential)\n          continue;\n        if (strict && isGeo(c2))\n          continue;\n        return c2;\n      }\n    }\n  }\n  class RecommenderSummary {\n    constructor(columns, data2) {\n      const quickRec = new ScatterPlotRecommenderSummary(columns, data2).recommend();\n      if (quickRec) {\n        this.rec = quickRec;\n      } else {\n        const barChartrec = new BarChartRecommenderSummary(columns, data2).recommend();\n        if (barChartrec && barChartrec.score >= 1) {\n          this.rec = barChartrec;\n        } else {\n          this.rec = {\n            chart: \"grid\",\n            columns: {},\n            score: 1\n          };\n        }\n      }\n    }\n    recommend() {\n      return this.rec;\n    }\n  }\n  function ensureColumnsExist(insightColumns, actualColumns, transform2) {\n    for (const role in insightColumns) {\n      const columnName = insightColumns[role];\n      const column = actualColumns.filter((c2) => c2.name === columnName)[0];\n      const transformColumn = transform2 ? transform2.filter((t) => {\n        switch (t.type) {\n          case \"formula\": {\n            return t.as === columnName;\n          }\n        }\n      })[0] : null;\n      if (!(column || transformColumn)) {\n        delete insightColumns[role];\n      }\n    }\n  }\n  function ensureColumnsPopulated(chart, totalStyle, insightColumns, actualColumns) {\n    const nonInternal = actualColumns.filter((c2) => !isInternalFieldName(c2.name));\n    const firstColumn = nonInternal[0];\n    const firstColumnName = firstColumn && firstColumn.name;\n    const firstQuantitative = nonInternal.filter((c2) => c2.quantitative)[0];\n    const firstQuantitativeColumnName = firstQuantitative && firstQuantitative.name;\n    const ensureColumn = (role, quantitative, treemap2) => {\n      if (!insightColumns[role]) {\n        if (treemap2) {\n          insightColumns[role] = getTreemapColumn(actualColumns).name;\n        } else {\n          insightColumns[role] = quantitative ? firstQuantitativeColumnName : firstColumnName;\n        }\n      }\n    };\n    function checkRequiresSize() {\n      switch (totalStyle) {\n        case \"sum-strip\":\n        case \"sum-strip-percent\":\n          ensureColumn(\"size\", true);\n          break;\n        case \"sum-treemap\":\n          ensureColumn(\"size\", true, true);\n          break;\n      }\n    }\n    switch (chart) {\n      case \"barchart\":\n      case \"barchartV\":\n        ensureColumn(\"x\");\n        checkRequiresSize();\n        break;\n      case \"barchartH\":\n        ensureColumn(\"y\");\n        checkRequiresSize();\n        break;\n      case \"density\":\n        ensureColumn(\"x\");\n        ensureColumn(\"y\");\n        checkRequiresSize();\n        break;\n      case \"scatterplot\":\n      case \"stacks\":\n        ensureColumn(\"x\");\n        ensureColumn(\"y\");\n        break;\n      case \"treemap\":\n        if (!insightColumns.size) {\n          insightColumns.size = getTreemapColumn(actualColumns).name;\n        }\n        if (!insightColumns.size) {\n          return [strings$1.errorColumnMustBeNumeric];\n        }\n        break;\n    }\n  }\n  function getTreemapColumn(columns) {\n    let column = preferredColumnForTreemapSize(columns, true);\n    if (!column) {\n      column = preferredColumnForTreemapSize(columns, false);\n    }\n    return column;\n  }\n  function colorMapping(insight, columns) {\n    if (columns && insight.columns && insight.columns.color) {\n      return columns.filter((c2) => c2.name === insight.columns.color)[0];\n    }\n  }\n  function getBackgroundImageColumnBounds(columns) {\n    const bounds2 = [];\n    const getBound = (dimension, dataExtent2, column) => {\n      const { stats } = column;\n      const numericValue = dataExtent2 === \"max\" ? stats.max : stats.min;\n      return {\n        columnName: column.name,\n        dimension,\n        valid: true,\n        dataExtent: dataExtent2,\n        numericValue,\n        stringValue: numericValue.toString()\n      };\n    };\n    const dataExtents = [\"max\", \"min\"];\n    const dimensions = [\"x\", \"y\"];\n    columns.forEach((c2) => {\n      if (c2.quantitative) {\n        dimensions.forEach((dimension) => dataExtents.forEach((dataExtent2) => bounds2.push(getBound(dimension, dataExtent2, c2))));\n      }\n    });\n    return bounds2;\n  }\n  function _BackgroundImageEditor(_props) {\n    class __BackgroundImageEditor extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = {\n          backgroundImageColumnBounds: [],\n          readyToApply: false,\n          hidden: true\n        };\n      }\n      show(insightColumns) {\n        const { explorer: explorer2, quantitativeColumns } = this.props;\n        if (!quantitativeColumns.length) {\n          return;\n        }\n        const xCol = quantitativeColumns.filter((c2) => c2.name === insightColumns.x)[0];\n        const yCol = quantitativeColumns.filter((c2) => c2.name === insightColumns.y)[0];\n        let backgroundImageColumnBounds;\n        if (explorer2.imageHolder.backgroundImageColumnBounds.length < quantitativeColumns.length * 4) {\n          backgroundImageColumnBounds = getBackgroundImageColumnBounds(explorer2.state.dataContent.columns);\n        } else {\n          backgroundImageColumnBounds = clone(explorer2.imageHolder.backgroundImageColumnBounds);\n        }\n        const newState = { hidden: false, xCol, yCol, backgroundImageColumnBounds };\n        this.setState(newState);\n        this.checkReady();\n      }\n      render() {\n        const { props, state } = this;\n        const { explorer: explorer2 } = props;\n        return base$1.react.createElement(\n          Dialog$1,\n          { hidden: state.hidden, onDismiss: () => this.setState({ hidden: true, backgroundImageFileFormatError: null }), modalProps: {\n            containerClassName: \"sanddance-background-image-dialog\"\n          }, dialogContentProps: {\n            type: base$1.fluentUI.DialogType.normal,\n            title: strings$1.labelBackgroundImageDialogTitle,\n            subText: strings$1.labelBackgroundImageSubtext\n          }, buttons: [\n            base$1.react.createElement(base$1.fluentUI.PrimaryButton, { key: \"apply\", iconProps: { iconName: \"Photo2Add\" }, text: strings$1.buttonApply, onClick: () => this.applyImage(true), disabled: !state.readyToApply })\n          ] },\n          explorer2.imageHolder.img ? base$1.react.createElement(\n            \"div\",\n            { className: \"thumbnail\" },\n            base$1.react.createElement(\"img\", { src: explorer2.imageHolder.img.src }),\n            base$1.react.createElement(base$1.fluentUI.DefaultButton, { key: \"remove\", iconProps: { iconName: \"Photo2Remove\" }, text: strings$1.buttonRemove, onClick: () => {\n              explorer2.imageHolder.img = null;\n              this.applyImage(false);\n              this.setState({ readyToApply: false });\n            } })\n          ) : base$1.react.createElement(\n            \"div\",\n            { className: \"thumbnail\" },\n            base$1.react.createElement(\"input\", { type: \"file\", onChange: (e) => this.readBackgroundImage(e) }),\n            state.backgroundImageFileFormatError && base$1.react.createElement(\"div\", { className: \"error\" }, state.backgroundImageFileFormatError)\n          ),\n          this.inputForColumn(state.xCol, \"X axis\", \"x\", strings$1.labelBackgroundLeft, strings$1.labelBackgroundRight),\n          this.inputForColumn(state.yCol, \"Y axis\", \"y\", strings$1.labelBackgroundBottom, strings$1.labelBackgroundTop)\n        );\n      }\n      inputForColumn(column, label2, dimension, minLabel, maxLabel) {\n        const { props, state } = this;\n        const fieldInput = (label3, dataExtent2, getDefault) => {\n          const bounds2 = state.backgroundImageColumnBounds.filter((b2) => b2.columnName === (column === null || column === void 0 ? void 0 : column.name) && b2.dimension === dimension && b2.dataExtent === dataExtent2)[0];\n          if (!bounds2) {\n            return null;\n          }\n          return base$1.react.createElement(\n            \"div\",\n            { className: \"axis-bound-field\" },\n            base$1.react.createElement(base$1.fluentUI.TextField, { label: label3, onChange: (e, value2) => {\n              const numericValue = +value2;\n              bounds2.stringValue = value2;\n              bounds2.valid = !(!value2 || isNaN(numericValue));\n              if (bounds2.valid) {\n                bounds2.numericValue = numericValue;\n              }\n              this.setState({ backgroundImageColumnBounds: [...state.backgroundImageColumnBounds] });\n              this.checkReady();\n            }, value: bounds2.stringValue, errorMessage: bounds2.valid ? null : strings$1.errorNumericValue, onRenderSuffix: (a2) => {\n              return base$1.react.createElement(IconButton$1, {\n                iconName: \"ScaleVolume\",\n                themePalette: props.themePalette,\n                title: \"Use data extent\",\n                onClick: () => {\n                  bounds2.numericValue = getDefault();\n                  bounds2.stringValue = bounds2.numericValue.toString();\n                  bounds2.valid = true;\n                  this.setState({ backgroundImageColumnBounds: [...state.backgroundImageColumnBounds] });\n                  this.checkReady();\n                }\n              });\n            } })\n          );\n        };\n        return base$1.react.createElement(\n          \"div\",\n          { className: \"axis-bounds\" },\n          base$1.react.createElement(base$1.fluentUI.Dropdown, { label: label2, options: props.quantitativeColumns.map((c2) => {\n            const option = {\n              key: c2.name,\n              text: c2.name\n            };\n            return option;\n          }), onChange: (e, o) => {\n            const newState = { readyToApply: false };\n            const newColumn = props.quantitativeColumns.filter((c2) => c2.name === o.key)[0];\n            switch (dimension) {\n              case \"x\": {\n                newState.xCol = newColumn;\n                break;\n              }\n              case \"y\": {\n                newState.yCol = newColumn;\n                break;\n              }\n            }\n            this.setState(newState);\n            this.checkReady();\n          }, selectedKey: column === null || column === void 0 ? void 0 : column.name }),\n          base$1.react.createElement(\n            \"div\",\n            { className: \"axis-bound-fields\" },\n            fieldInput(minLabel, \"min\", () => column.stats.min),\n            fieldInput(maxLabel, \"max\", () => column.stats.max)\n          )\n        );\n      }\n      readBackgroundImage(e) {\n        if (e.target.files) {\n          const file = e.target.files[0];\n          const reader = new FileReader();\n          reader.onload = () => {\n            const img = new Image();\n            img.onerror = () => {\n              this.setState({ backgroundImageFileFormatError: strings$1.errorImageFormat });\n            };\n            img.onload = () => {\n              const { src, height: height2, width: width2 } = img;\n              this.props.explorer.imageHolder.img = { src, height: height2, width: width2 };\n              this.checkReady();\n            };\n            try {\n              img.src = reader.result;\n            } catch (e3) {\n              this.setState({ backgroundImageFileFormatError: strings$1.errorImageFormat });\n            }\n          };\n          reader.readAsDataURL(file);\n        }\n      }\n      checkReady() {\n        setTimeout(() => {\n          const { state, props } = this;\n          const { explorer: explorer2 } = props;\n          const { backgroundImageColumnBounds } = state;\n          let valid = true;\n          const dimensions = [\"x\", \"y\"];\n          const dataExtents = [\"max\", \"min\"];\n          [state.xCol, state.yCol].forEach((c2) => dimensions.forEach((dimension) => dataExtents.forEach((dataExtent2) => {\n            const bounds2 = backgroundImageColumnBounds.filter((b2) => b2.columnName === c2.name && b2.dataExtent === dataExtent2 && b2.dimension === dimension)[0];\n            if (!bounds2.valid) {\n              valid = false;\n            }\n          })));\n          const readyToApply = explorer2.imageHolder.img && valid;\n          this.setState({ readyToApply });\n        }, 0);\n      }\n      applyImage(showBackgroundImage) {\n        const { props, state } = this;\n        const { explorer: explorer2 } = props;\n        explorer2.imageHolder.showBackgroundImage = showBackgroundImage;\n        explorer2.imageHolder.backgroundImageColumnBounds = clone(state.backgroundImageColumnBounds);\n        if (showBackgroundImage) {\n          switch (props.chart) {\n            case \"density\":\n            case \"scatterplot\":\n            case \"stacks\": {\n              break;\n            }\n            default: {\n              explorer2.changeChartType(\"scatterplot\");\n              return;\n            }\n          }\n        }\n        explorer2.forceUpdate();\n      }\n    }\n    return new __BackgroundImageEditor(_props);\n  }\n  const BackgroundImageEditor = _BackgroundImageEditor;\n  function setInsightBackgroundImage(insight, imageHolder, columns) {\n    if (!imageHolder.showBackgroundImage || !columns.x || !columns.y) {\n      return;\n    }\n    const { backgroundImageColumnBounds } = imageHolder;\n    const xBounds = backgroundImageColumnBounds.filter((b2) => b2.columnName === columns.x && b2.dimension === \"x\");\n    const yBounds = backgroundImageColumnBounds.filter((b2) => b2.columnName === columns.y && b2.dimension === \"y\");\n    if (!xBounds.length || !yBounds.length) {\n      return;\n    }\n    const allBounds = [...xBounds, ...yBounds];\n    for (let i = 0; i < allBounds.length; i++) {\n      if (!allBounds[i].valid) {\n        return;\n      }\n    }\n    const bottom = yBounds.filter((b2) => b2.dataExtent === \"min\")[0];\n    const left = xBounds.filter((b2) => b2.dataExtent === \"min\")[0];\n    const right = xBounds.filter((b2) => b2.dataExtent === \"max\")[0];\n    const top = yBounds.filter((b2) => b2.dataExtent === \"max\")[0];\n    const all = [bottom, left, right, top];\n    for (let i = 0; i < all.length; i++) {\n      if (!all[i]) {\n        return;\n      }\n    }\n    const { src, height: height2, width: width2 } = imageHolder.img;\n    insight.backgroundImage = {\n      url: src,\n      size: { height: height2, width: width2 },\n      extents: {\n        bottom: bottom.numericValue,\n        left: left.numericValue,\n        right: right.numericValue,\n        top: top.numericValue\n      }\n    };\n    insight.size = insight.backgroundImage.size;\n  }\n  const dropdownWidth = 200;\n  function Dropdown$1(props) {\n    const newProps = Object.assign({}, props);\n    let selectedKey = null;\n    if (newProps.options && newProps.options.length > 1) {\n      const selectedOptions = newProps.options.filter((option) => option.selected);\n      if (selectedOptions && selectedOptions.length > 0) {\n        selectedKey = selectedOptions[0].key;\n      }\n    }\n    if (newProps.collapseLabel) {\n      newProps.onRenderTitle = ((a2, b2) => {\n        return base$1.react.createElement(\n          \"span\",\n          null,\n          newProps.label,\n          \": \",\n          a2[0].text\n        );\n      });\n    }\n    return base$1.react.createElement(base$1.fluentUI.Dropdown, Object.assign({ dropdownWidth }, newProps, { label: newProps.collapseLabel ? null : newProps.label, selectedKey }));\n  }\n  function getInitialSignalValue(explorer2, signal) {\n    let initialValue;\n    try {\n      initialValue = explorer2.viewer.vegaViewGl.signal(signal.name);\n    } catch (error2) {\n    }\n    return initialValue;\n  }\n  function Signal(props) {\n    if (!props.explorer.viewer || !props.signal) {\n      return null;\n    }\n    if (props.signal.bind) {\n      const input = props.signal.bind.input;\n      if (input) {\n        const fn2 = map$2[input];\n        if (fn2) {\n          const prefix = props.prefix ? `${props.prefix} ` : \"\";\n          const control = fn2(prefix, props.signal.bind, props.initialValue, (value2) => {\n            props.onChange && props.onChange(value2);\n            props.explorer.signal(props.signal.name, value2, props.newViewStateTarget);\n          }, props.disabled, props.collapseLabel, props.componentRef);\n          return base$1.react.createElement(\"div\", { className: \"sanddance-signal\" }, control);\n        }\n      }\n    }\n    return null;\n  }\n  const map$2 = {};\n  map$2[\"range\"] = (prefix, bind2, initialValue, onChange, disabled, collapseLabel, ref2) => {\n    let debouncer;\n    return base$1.react.createElement(base$1.fluentUI.Slider, { componentRef: ref2, label: prefix + bind2.name, max: bind2.max, min: bind2.min, step: bind2.step, defaultValue: initialValue, onChange: (value2) => {\n      if (debouncer) {\n        clearTimeout(debouncer);\n      }\n      debouncer = setTimeout(() => onChange(value2), bind2.debounce || 0);\n    }, disabled });\n  };\n  map$2[\"select\"] = (prefix, bind2, initialValue, onChange, disabled, collapseLabel, ref2) => {\n    const options2 = bind2.options.map((o, i) => {\n      const option = {\n        key: o,\n        text: o\n      };\n      return option;\n    });\n    const label2 = prefix + bind2.name;\n    return base$1.react.createElement(base$1.fluentUI.Dropdown, { componentRef: ref2, onRenderTitle: collapseLabel ? ((a2, b2) => base$1.react.createElement(\n      \"span\",\n      null,\n      label2,\n      \": \",\n      a2[0].text\n    )) : void 0, defaultSelectedKey: initialValue, label: collapseLabel ? void 0 : label2, options: options2, onChange: (e, o) => onChange(o.text), disabled });\n  };\n  map$2[\"checkbox\"] = (prefix, bind2, initialValue, onChange, disabled, collapseLabel, ref2) => {\n    return base$1.react.createElement(base$1.fluentUI.Toggle, { componentRef: ref2, defaultChecked: initialValue, label: prefix + bind2.name, onChange: (e, checked) => onChange(checked), disabled });\n  };\n  const maxFacets = 50;\n  const roleLabels = {\n    color: strings$1.labelColumnColor,\n    facet: strings$1.labelColumnFacet,\n    facetV: strings$1.labelColumnFacetV,\n    group: strings$1.labelColumnGroup,\n    size: strings$1.labelColumnSize,\n    sort: strings$1.labelColumnSort,\n    uid: null,\n    x: strings$1.labelColumnX,\n    y: strings$1.labelColumnY,\n    z: strings$1.labelColumnZ\n  };\n  const aliasLabels = {\n    color: strings$1.labelAliasColor,\n    facet: strings$1.labelAliasFacet,\n    facetV: strings$1.labelAliasFacetV,\n    group: strings$1.labelAliasGroup,\n    size: strings$1.labelAliasSize,\n    sort: strings$1.labelAliasSort,\n    uid: null,\n    x: strings$1.labelAliasX,\n    y: strings$1.labelAliasY,\n    z: strings$1.labelAliasZ\n  };\n  function filterColumnList(context2, columns) {\n    switch (context2) {\n      case \"facet\":\n      case \"facetV\":\n        return columns.filter((column) => column.quantitative || column.stats.distinctValueCount && column.stats.distinctValueCount < maxFacets);\n      default:\n        return columns.slice();\n    }\n  }\n  function optionsForSpecColumn(sectionName, columns, role, disabledColumnName, selectedColumnName) {\n    const filtered = filterColumnList(role, columns);\n    const options2 = filtered.map((column) => {\n      const option = {\n        key: `column:${column.name}`,\n        text: column.name,\n        data: column,\n        selected: selectedColumnName === column.name,\n        disabled: disabledColumnName === column.name\n      };\n      return option;\n    });\n    if (options2.length) {\n      const option = {\n        key: sectionName,\n        text: sectionName,\n        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n      };\n      options2.unshift(option);\n    }\n    return options2;\n  }\n  function optionsForReference(sectionName, specRoles) {\n    const options2 = specRoles.map((specRole) => {\n      const option = {\n        key: `role:${specRole.role}`,\n        text: aliasLabels[specRole.role],\n        data: specRole.role\n      };\n      return option;\n    }).sort((a2, b2) => a2.text.localeCompare(b2.text));\n    if (options2.length) {\n      const option = {\n        key: sectionName,\n        text: sectionName,\n        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n      };\n      options2.unshift(option);\n    }\n    return options2;\n  }\n  function selectFirst(options2) {\n    for (let i = 0; i < options2.length; i++) {\n      if (options2[i].itemType === base$1.fluentUI.DropdownMenuItemType.Header)\n        continue;\n      options2[i].selected = true;\n      return;\n    }\n  }\n  function getColumnMapOptions(props) {\n    if (!props.specRole)\n      return null;\n    let categoricalColumns;\n    let directColorColumns;\n    let directColorGroup;\n    let referenceGroup = [];\n    if (props.specRole.role === \"color\") {\n      categoricalColumns = props.categoricalColumns.filter((c2) => !c2.isColorData);\n      directColorColumns = props.categoricalColumns.filter((c2) => c2.isColorData);\n      directColorGroup = optionsForSpecColumn(strings$1.selectDirectColor, directColorColumns, \"color\", props.disabledColumnName, props.selectedColumnName);\n    } else {\n      categoricalColumns = props.categoricalColumns;\n    }\n    if (props.specRole.role === \"sort\") {\n      const others = props.specCapabilities.roles.filter((specRole) => specRole.role !== props.specRole.role);\n      referenceGroup = optionsForReference(strings$1.selectReference, others);\n    }\n    const quantitativeGroup = optionsForSpecColumn(strings$1.selectNumeric, props.quantitativeColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const categoricGroup = props.specRole.excludeCategoric ? null : optionsForSpecColumn(strings$1.selectNonNumeric, categoricalColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const options2 = referenceGroup.concat(quantitativeGroup).concat(categoricGroup).concat(directColorGroup).filter(Boolean);\n    return options2;\n  }\n  function ColumnMap(props) {\n    const options2 = getColumnMapOptions(props);\n    if (props.specRole.allowNone) {\n      options2.unshift({\n        key: -1,\n        text: strings$1.selectNone\n      });\n    }\n    const hasSelection = options2.reduce((p, c2) => {\n      return p || c2.selected;\n    }, false);\n    if (!hasSelection) {\n      selectFirst(options2);\n    }\n    let signals;\n    if (props.explorer.viewer && props.explorer.viewer.vegaSpec) {\n      if (props.specRole.signals) {\n        signals = props.explorer.viewer.vegaSpec.signals.filter((s2) => props.specRole.signals.indexOf(s2.name) >= 0);\n      }\n    }\n    const label2 = roleLabels[props.specRole.role];\n    const signalElements = !props.hideSignals && signals && signals.map((signal, i) => {\n      let initialValue;\n      try {\n        initialValue = props.explorer.viewer.vegaViewGl.signal(signal.name);\n      } catch (error2) {\n      }\n      return base$1.react.createElement(Signal, { key: signal.name + i + initialValue, explorer: props.explorer, signal, initialValue, onChange: (value2) => props.onChangeSignal && props.onChangeSignal(signal.name, value2), collapseLabel: props.collapseLabel });\n    });\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"sanddance-columnMap\" },\n      props.prefix,\n      !props.hideDropdown && base$1.react.createElement(Dropdown$1, { componentRef: props.componentRef, collapseLabel: props.collapseLabel, disabled: props.disabled, label: label2, options: options2, onChange: (e, o) => props.changeColumnMapping(props.specRole.role, typeof o.data === \"string\" ? o.data : clone(o.data)), onDismiss: props.onDismiss }),\n      signalElements,\n      props.suffix\n    );\n  }\n  function attachSpecRoleToAxisTitle(stage, specCapabilities) {\n    for (const axisName in stage.axes) {\n      specCapabilities.roles.forEach((specRole) => {\n        if (specRole.role === axisName) {\n          const axes = stage.axes[axisName];\n          axes.forEach((axis) => {\n            if (axis.title) {\n              const textItem = axis.title;\n              textItem.specRole = specRole;\n            }\n          });\n        }\n      });\n    }\n  }\n  function px$1(n) {\n    return n + \"px\";\n  }\n  function _PositionedColumnMap(_props) {\n    class __PositionedColumnMap extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        const { left, top } = props;\n        this.state = { left, top };\n        this.dropdownRef = base$1.react.createRef();\n      }\n      focus() {\n        if (!this.focused) {\n          this.focused = true;\n          this.dropdownRef.current.focus(true);\n        }\n      }\n      componentDidMount() {\n        const size = outerSize$1(this.div);\n        const over = {\n          left: Math.max(0, this.state.left + size.width - this.props.container.offsetWidth),\n          top: Math.max(0, this.state.top + size.height - this.props.container.offsetHeight)\n        };\n        if (over.left || over.top) {\n          let { left, top } = this.state;\n          left -= over.left;\n          top -= over.top;\n          this.setState({ left, top });\n        } else {\n          this.focus();\n        }\n      }\n      componentDidUpdate() {\n        this.focus();\n      }\n      render() {\n        return base$1.react.createElement(\n          \"div\",\n          { ref: (div) => {\n            if (div)\n              this.div = div;\n          }, className: \"sanddance-columnMap-absolute\", style: { position: \"absolute\", left: px$1(this.state.left), top: px$1(this.state.top) } },\n          base$1.react.createElement(ColumnMap, Object.assign({}, this.props, { componentRef: this.dropdownRef, hideSignals: true }))\n        );\n      }\n    }\n    return new __PositionedColumnMap(_props);\n  }\n  const PositionedColumnMap = _PositionedColumnMap;\n  function _ColumnTypeChanger(_props) {\n    class __ColumnTypeChanger extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = this.getInitialState();\n      }\n      getInitialState() {\n        const { props } = this;\n        return {\n          dialogHidden: true,\n          confirmationHidden: true,\n          quantitativeColumns: props.initialQuantitativeColumns.map((c2) => clone(c2)),\n          categoricalColumns: props.initialCategoricalColumns.map((c2) => clone(c2)),\n          columnTypes: null\n        };\n      }\n      closeDialog() {\n        this.setState(this.getInitialState());\n      }\n      openConfirmation(columnTypes) {\n        this.setState({ columnTypes, confirmationHidden: false });\n      }\n      render() {\n        const { props, state } = this;\n        const hasChanges = props.initialQuantitativeColumns.some((c2, i) => {\n          return c2.quantitative !== state.quantitativeColumns[i].quantitative;\n        });\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          base$1.react.createElement(base$1.fluentUI.DefaultButton, { text: strings$1.buttonColumnTypes, onClick: () => this.setState({ dialogHidden: false }) }),\n          base$1.react.createElement(\n            Dialog$1,\n            { minWidth: \"80%\", hidden: state.dialogHidden, onDismiss: () => this.closeDialog(), dialogContentProps: {\n              className: `sanddance-dialog ${props.theme}`,\n              type: base$1.fluentUI.DialogType.normal,\n              title: strings$1.labelColumnTypes\n            }, buttons: [\n              base$1.react.createElement(base$1.fluentUI.DefaultButton, { key: \"revert\", text: strings$1.buttonResetToDefault, onClick: () => this.openConfirmation(null), iconProps: { iconName: \"Undo\" } }),\n              base$1.react.createElement(base$1.fluentUI.DefaultButton, { key: \"apply\", text: strings$1.buttonApply, onClick: () => {\n                const columnTypes = {};\n                state.quantitativeColumns.forEach((c2) => {\n                  columnTypes[c2.name] = c2.quantitative ? c2.type : \"string\";\n                });\n                state.categoricalColumns.forEach((c2) => {\n                  columnTypes[c2.name] = \"string\";\n                });\n                this.openConfirmation(columnTypes);\n              }, iconProps: { iconName: \"Accept\" }, disabled: !hasChanges })\n            ] },\n            base$1.react.createElement(\n              \"div\",\n              { className: \"sanddance-columnTypes\" },\n              state.quantitativeColumns.length > 0 && base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(\"h3\", null, strings$1.selectNumeric),\n                base$1.react.createElement(\n                  \"table\",\n                  null,\n                  base$1.react.createElement(\n                    \"thead\",\n                    null,\n                    base$1.react.createElement(\n                      \"tr\",\n                      null,\n                      base$1.react.createElement(\"th\", null, strings$1.labelEditColumn),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnName),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnQuantitativeMin),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnQuantitativeMax),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnQuantitativeMean),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnDistinct)\n                    )\n                  ),\n                  base$1.react.createElement(\"tbody\", null, state.quantitativeColumns.map((c2, i) => base$1.react.createElement(\n                    \"tr\",\n                    { key: i, className: c2.quantitative ? \"\" : \"changed\" },\n                    base$1.react.createElement(\n                      \"td\",\n                      null,\n                      base$1.react.createElement(IconButton$1, { iconName: \"Edit\", onClick: void 0, menuProps: {\n                        items: [strings$1.selectNumeric, strings$1.selectNonNumeric].map((t) => {\n                          return {\n                            key: t,\n                            text: t,\n                            onClick: () => {\n                              c2.quantitative = t === strings$1.selectNumeric;\n                              this.setState({ quantitativeColumns: [...state.quantitativeColumns] });\n                            }\n                          };\n                        })\n                      }, themePalette: props.themePalette, title: strings$1.labelChangeColumnType })\n                    ),\n                    base$1.react.createElement(\"td\", null, c2.name),\n                    base$1.react.createElement(\"td\", null, c2.stats.min),\n                    base$1.react.createElement(\"td\", null, c2.stats.max),\n                    base$1.react.createElement(\"td\", null, c2.stats.mean),\n                    base$1.react.createElement(\"td\", null, c2.stats.distinctValueCount)\n                  )))\n                )\n              ),\n              state.categoricalColumns.length > 0 && base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(\"h3\", null, strings$1.selectNonNumeric),\n                base$1.react.createElement(\n                  \"table\",\n                  null,\n                  base$1.react.createElement(\n                    \"thead\",\n                    null,\n                    base$1.react.createElement(\n                      \"tr\",\n                      null,\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnName),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnType),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnDistinct),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnHasColorData),\n                      base$1.react.createElement(\"th\", null, strings$1.labelColumnIsColorData)\n                    )\n                  ),\n                  base$1.react.createElement(\"tbody\", null, state.categoricalColumns.map((c2, i) => base$1.react.createElement(\n                    \"tr\",\n                    { key: i },\n                    base$1.react.createElement(\"td\", null, c2.name),\n                    base$1.react.createElement(\"td\", null, c2.type),\n                    base$1.react.createElement(\"td\", null, c2.stats.distinctValueCount),\n                    base$1.react.createElement(\"td\", null, (!!c2.stats.hasColorData).toString()),\n                    base$1.react.createElement(\"td\", null, (!!c2.isColorData).toString())\n                  )))\n                )\n              )\n            )\n          ),\n          base$1.react.createElement(Dialog$1, { hidden: state.confirmationHidden, onDismiss: () => this.setState({ confirmationHidden: true }), dialogContentProps: {\n            className: `sanddance-dialog ${props.theme}`,\n            type: base$1.fluentUI.DialogType.normal,\n            title: strings$1.labelConfirmation,\n            subText: strings$1.labelHistoryWarning\n          }, buttons: base$1.react.createElement(base$1.fluentUI.PrimaryButton, { text: strings$1.buttonApply, onClick: () => {\n            this.closeDialog();\n            this.props.onConfirmUpdate(this.state.columnTypes);\n          }, iconProps: { iconName: \"Accept\" } }) })\n        );\n      }\n    }\n    return new __ColumnTypeChanger(_props);\n  }\n  const ColumnTypeChanger = _ColumnTypeChanger;\n  const embedHtml = (title, embed) => `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>${title}</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/css/sanddance-explorer.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/css/sanddance-embed.css\" />\n</head>\n<body>\n    <script src=\"https://unpkg.com/react@17/umd/react.production.min.js\"><\\/script>\n    <script src=\"https://unpkg.com/react-dom@17/umd/react-dom.production.min.js\"><\\/script>\n    <script src=\"https://unpkg.com/vega@6.2/build/vega.min.js\"><\\/script>\n    <script src=\"https://unpkg.com/@fluentui/react@8/dist/fluentui-react.js\"><\\/script>\n    <script src=\"https://unpkg.com/@msrvida/fluentui-icons@1/dist/umd/fluentui-icons.js\"><\\/script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/umd/sanddance-explorer.js\"><\\/script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/umd/sanddance-embed.js\"><\\/script>\n    ${embed}\n</body>\n</html>`;\n  function convertToDelimited(data2, delimiter) {\n    const fields = Object.keys(data2[0]);\n    const file = data2.map((row) => {\n      return fields.map((fieldName) => {\n        const value2 = row[fieldName];\n        if (typeof value2 === \"number\") {\n          return value2;\n        }\n        if (typeof value2 === \"string\") {\n          if (value2.indexOf(delimiter) >= 0) {\n            return `\"${value2.replace(/\"/g, '\"\"')}\"`;\n          } else {\n            return value2;\n          }\n        }\n        return \"\";\n      }).join(delimiter);\n    });\n    file.unshift(fields.join(delimiter));\n    return file.join(\"\\n\");\n  }\n  const exportTypes = [\n    [\"json\", strings$1.labelExportJSON],\n    [\"csv\", strings$1.labelExportCSV],\n    [\"tsv\", strings$1.labelExportTSV],\n    [\"html\", strings$1.labelExportHTML]\n  ];\n  function _DataExportPicker(_props) {\n    class __DataExportPicker extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = this.getInitialState(this.props);\n      }\n      getInitialState(props) {\n        const initialState = {\n          initializer: props.initializer,\n          dialogHidden: true,\n          exportType: exportTypes[0][0],\n          fileName: props.initializer.fileName,\n          fileNameError: \"\",\n          working: false\n        };\n        return initialState;\n      }\n      componentDidUpdate() {\n        if (!deepCompare(this.props.initializer, this.state.initializer)) {\n          this.setState(this.getInitialState(this.props));\n        }\n      }\n      // Converts to dataExport type and calls dataExportHandler to deal with data\n      createExport(exportType, displayName) {\n        const final = (data2) => {\n          this.props.dataExportHandler(data2, exportType, displayName);\n          this.close();\n        };\n        const json2 = JSON.stringify(this.props.data, columnReplacer);\n        switch (exportType) {\n          case \"json\": {\n            final(json2);\n            break;\n          }\n          case \"csv\": {\n            final(convertToDelimited(JSON.parse(json2), \",\"));\n            break;\n          }\n          case \"tsv\": {\n            final(convertToDelimited(JSON.parse(json2), \"\t\"));\n            break;\n          }\n          case \"html\": {\n            const csv = convertToDelimited(JSON.parse(json2), \",\");\n            const html = embedHtml(`${strings$1.appName} - ${escape(displayName)}`, embedScript(csv, displayName));\n            final(html);\n          }\n        }\n      }\n      close() {\n        this.setState({ dialogHidden: true, working: false });\n      }\n      render() {\n        const closeDialog = () => this.close();\n        if (this.state.delayAction) {\n          requestAnimationFrame(() => {\n            if (this.state.delayAction) {\n              this.state.delayAction();\n              this.setState({ delayAction: null });\n            }\n          });\n        }\n        const disabled = this.state.working || this.state.dialogHidden;\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          base$1.react.createElement(base$1.fluentUI.DefaultButton, { className: \"search-action search-bottom-action\", text: strings$1.buttonExportCount(this.props.data.length), onClick: () => this.setState({ dialogHidden: false }), disabled: this.props.disabled }),\n          base$1.react.createElement(\n            Dialog$1,\n            { hidden: this.state.dialogHidden, onDismiss: closeDialog, dialogContentProps: {\n              className: `sanddance-dialog ${this.props.theme}`,\n              type: base$1.fluentUI.DialogType.normal,\n              title: strings$1.labelExport\n            }, buttons: [\n              base$1.react.createElement(base$1.fluentUI.PrimaryButton, { key: 0, disabled: disabled || !!this.state.fileNameError, onClick: (e) => this.setState({\n                delayAction: () => this.createExport(this.state.exportType, this.state.fileName),\n                working: true\n              }), text: strings$1.buttonExport, iconProps: {\n                iconName: \"Download\"\n              } })\n            ] },\n            base$1.react.createElement(base$1.fluentUI.TextField, { label: strings$1.labelExportFileName, onChange: (e, displayName) => {\n              const displayNameError = getFileNameError(displayName);\n              this.setState({ fileName: displayName, fileNameError: displayNameError });\n            }, errorMessage: this.state.fileNameError, value: this.state.fileName }),\n            base$1.react.createElement(base$1.fluentUI.ChoiceGroup, { className: \"sanddance-form-separate\", disabled, selectedKey: this.state.exportType, options: exportTypes.map(([exportType, text2]) => {\n              return {\n                key: exportType,\n                text: text2,\n                disabled: false\n              };\n            }), onChange: (ev, option) => this.setState({ exportType: option.key }), label: strings$1.labelExportFormat })\n          )\n        );\n      }\n    }\n    return new __DataExportPicker(_props);\n  }\n  const DataExportPicker = _DataExportPicker;\n  const illegalChars = '\\\\/:*?\"<>|';\n  function getFileNameError(displayName) {\n    if (!displayName) {\n      return strings$1.errorExportFilenameEmpty;\n    }\n    for (let i = 0; i < illegalChars.length; i++) {\n      if (displayName.indexOf(illegalChars[i]) >= 0) {\n        return strings$1.errorExportFilenameCharacters(illegalChars);\n      }\n    }\n  }\n  function removeExtensions(fileName) {\n    exportTypes.forEach(([exportType]) => {\n      const re2 = new RegExp(`\\\\.${exportType}`, \"ig\");\n      fileName = fileName.replace(re2, \"\");\n    });\n    return fileName;\n  }\n  function columnReplacer(name, value2) {\n    if (isInternalFieldName(name, true)) {\n      return void 0;\n    }\n    return value2 === null ? \"\" : value2;\n  }\n  function embedScript(csv, displayName, snapshots) {\n    const dataFile = { type: \"csv\", displayName, snapshots };\n    return `<pre id='csv-data' style='display:none'>${csv}</pre>\n    <script>SandDanceEmbed.load(Object.assign({rawText: document.getElementById('csv-data').innerText}, ${JSON.stringify(dataFile)}))<\\/script>`;\n  }\n  function getEmbedHTML(data2, displayName, snapshots) {\n    const json2 = JSON.stringify(data2, columnReplacer);\n    const csv = convertToDelimited(JSON.parse(json2), \",\");\n    const html = embedHtml(`${strings$1.appName} - ${escape(displayName)}`, embedScript(csv, displayName, snapshots));\n    return html;\n  }\n  function Group$1(props) {\n    return base$1.react.createElement(\n      \"div\",\n      { className: classList(\"sanddance-group\", props.className) },\n      base$1.react.createElement(\n        \"div\",\n        { className: \"group-head\" },\n        base$1.react.createElement(\"label\", null, props.label),\n        props.labelCount && base$1.react.createElement(\n          \"span\",\n          { className: \"count\" },\n          \"(\",\n          props.labelCount,\n          \")\"\n        )\n      ),\n      props.children && base$1.react.createElement(\"div\", { className: \"group-body\" }, props.children)\n    );\n  }\n  function ToggleColumns(props) {\n    return base$1.react.createElement(\"div\", null, props.allColumns.map((c2, i) => base$1.react.createElement(\n      \"div\",\n      { key: c2.name },\n      base$1.react.createElement(\n        \"label\",\n        null,\n        base$1.react.createElement(base$1.fluentUI.Toggle, { checked: props.exclusions.indexOf(c2.name) < 0, inlineLabel: true, label: c2.name, onChange: () => props.toggleExclusion(c2.name) })\n      )\n    )));\n  }\n  const singleFacetLayouts = [\n    { facetStyle: \"wrap\", text: strings$1.labelFacetLayoutWrap }\n    //{ facetStyle: 'horizontal', text: strings.labelFacetLayoutHorizontal },\n    //{ facetStyle: 'vertical', text: strings.labelFacetLayoutVertical }\n  ];\n  const chartLabelMap = [\n    {\n      key: \"grid\",\n      text: strings$1.chartTypeGrid\n    },\n    {\n      key: \"scatterplot\",\n      text: strings$1.chartTypeScatterPlot\n    },\n    {\n      key: \"density\",\n      text: strings$1.chartTypeDensity\n    },\n    {\n      key: \"barchartV\",\n      text: strings$1.chartTypeBarChartV\n    },\n    {\n      key: \"barchartH\",\n      text: strings$1.chartTypeBarChartH\n    },\n    {\n      key: \"treemap\",\n      text: strings$1.chartTypeTreeMap\n    },\n    {\n      key: \"strips\",\n      text: strings$1.chartTypeStrips\n    },\n    {\n      key: \"stacks\",\n      text: strings$1.chartTypeStacks\n    }\n  ];\n  function chartLabel(key2) {\n    for (let i = 0; i < chartLabelMap.length; i++) {\n      if (key2 === chartLabelMap[i].key) {\n        return chartLabelMap[i].text;\n      }\n    }\n  }\n  function _Chart(_props) {\n    class __Chart extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = {\n          showTooltipDialog: false\n        };\n        this.choiceRef = base$1.react.createRef();\n        props.explorer.dialogFocusHandler.focus = () => {\n          var _a2;\n          return (_a2 = this.choiceRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        };\n      }\n      render() {\n        const { props } = this;\n        const { explorer: explorer2, specCapabilities } = props;\n        const signals = explorer2.viewer && explorer2.viewer.vegaSpec && specCapabilities && specCapabilities.signals && explorer2.viewer.vegaSpec.signals.filter((s2) => specCapabilities.signals.indexOf(s2.name) >= 0);\n        const hasOptions = !!signals || (specCapabilities === null || specCapabilities === void 0 ? void 0 : specCapabilities.backgroundImage);\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelChart },\n            base$1.react.createElement(\n              \"div\",\n              { className: \"calculator\" },\n              base$1.react.createElement(base$1.fluentUI.ChoiceGroup, { componentRef: this.choiceRef, selectedKey: props.chart, className: \"sanddance-chart-type\", options: chartLabelMap.map((o) => {\n                return Object.assign(Object.assign({}, o), { disabled: props.disabled || o.key === \"treemap\" && props.quantitativeColumns.length === 0 });\n              }), onChange: (e, o) => props.explorer.changeChartType(o.key) })\n            )\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelColumnMapping },\n            base$1.react.createElement(\n              \"div\",\n              null,\n              specCapabilities && specCapabilities.roles.map((specRole, i) => {\n                const specColumnInRole = props.insightColumns[specRole.role];\n                const selectedColumnName = specColumnInRole;\n                let disabledColumnName;\n                let prefix;\n                let suffix;\n                let hideDropdown = false;\n                let { totalStyle } = props;\n                if (!totalStyle) {\n                  totalStyle = \"count-square\";\n                }\n                let { facetStyle } = props;\n                if (!facetStyle) {\n                  facetStyle = \"wrap\";\n                }\n                switch (specRole.role) {\n                  case \"facet\": {\n                    suffix = base$1.react.createElement(Dropdown$1, { disabled: !props.insightColumns.facet, collapseLabel: props.collapseLabels, label: strings$1.labelFacetLayout, calloutProps: { style: { minWidth: \"18em\" } }, options: [\n                      {\n                        key: \"header1\",\n                        text: `${strings$1.labelFacetLayout}:`,\n                        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n                      },\n                      ...singleFacetLayouts.map((f) => {\n                        const o = {\n                          key: f.facetStyle,\n                          text: f.text,\n                          data: f,\n                          selected: facetStyle === f.facetStyle\n                        };\n                        return o;\n                      }),\n                      {\n                        key: \"divider\",\n                        text: \"-\",\n                        itemType: base$1.fluentUI.DropdownMenuItemType.Divider\n                      },\n                      {\n                        key: \"header2\",\n                        text: `${strings$1.labelColumnFacetV}:`,\n                        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n                      },\n                      ...getColumnMapOptions(Object.assign(Object.assign({}, props), { specRole, selectedColumnName: props.insightColumns.facetV })).map((o) => {\n                        if (o.itemType !== base$1.fluentUI.DropdownMenuItemType.Header) {\n                          const facetData = {\n                            facetStyle: \"cross\",\n                            column: o.data\n                          };\n                          o.data = facetData;\n                          o.text = `${strings$1.labelFacetLayoutCross} ${o.text}`;\n                        }\n                        return o;\n                      })\n                    ], onChange: (e, o) => {\n                      const facetData = o.data;\n                      props.changeColumnMapping(\"facet\", \"facet\", null, { facetStyle: facetData.facetStyle });\n                      if (facetData.facetStyle === \"cross\") {\n                        props.changeColumnMapping(\"facetV\", clone(facetData.column));\n                      }\n                    } });\n                    break;\n                  }\n                  case \"facetV\": {\n                    hideDropdown = true;\n                    break;\n                  }\n                  case \"size\": {\n                    const options2 = [\n                      {\n                        key: \"count-square\",\n                        text: strings$1.labelTotalByCountSquare,\n                        data: \"count-square\",\n                        selected: !totalStyle || totalStyle === \"count-square\"\n                      },\n                      {\n                        key: \"count-strip\",\n                        text: strings$1.labelTotalByCountStrip,\n                        data: \"count-strip\",\n                        selected: totalStyle === \"count-strip\"\n                      },\n                      {\n                        key: \"sum-strip\",\n                        text: strings$1.labelTotalBySumStrip,\n                        data: \"sum-strip\",\n                        selected: totalStyle === \"sum-strip\"\n                      },\n                      {\n                        key: \"sum-treemap\",\n                        text: strings$1.labelTotalBySumTreemap,\n                        data: \"sum-treemap\",\n                        selected: totalStyle === \"sum-treemap\",\n                        disabled: props.quantitativeColumns.length === 0\n                      }\n                    ];\n                    if (specCapabilities.percentage) {\n                      options2.push({\n                        key: \"sum-strip-percent\",\n                        text: strings$1.labelTotalBySumStripPercent,\n                        data: \"sum-strip-percent\",\n                        selected: totalStyle === \"sum-strip-percent\",\n                        disabled: props.quantitativeColumns.length === 0\n                      });\n                    }\n                    prefix = !specCapabilities.countsAndSums ? null : base$1.react.createElement(Dropdown$1, { collapseLabel: props.collapseLabels, label: strings$1.labelTotal, calloutProps: { style: { minWidth: \"18em\" } }, options: options2, onChange: (e, o) => {\n                      const totalStyle2 = o.data;\n                      let defaultColumn;\n                      if (totalStyle2.indexOf(\"sum-\") === 0) {\n                        if (totalStyle2 === \"sum-treemap\") {\n                          defaultColumn = getTreemapColumn(props.allColumns);\n                        }\n                        defaultColumn = defaultColumn || props.quantitativeColumns[0];\n                      }\n                      props.changeColumnMapping(\"size\", \"size\", defaultColumn, { totalStyle: totalStyle2 });\n                    } });\n                    break;\n                  }\n                }\n                const disabled = props.disabled || specRole.disabled || specRole.role === \"size\" && !(!specCapabilities.countsAndSums || totalStyle.indexOf(\"sum-\") === 0) || specRole.role === \"sort\" && specCapabilities.countsAndSums && totalStyle === \"sum-treemap\";\n                return base$1.react.createElement(ColumnMap, Object.assign({}, props, { prefix, suffix, collapseLabel: props.collapseLabels, disabled, disabledColumnName, selectedColumnName, specRole, key: i, onChangeSignal: (name, value2) => props.onChangeSignal(specRole.role, selectedColumnName, name, value2), hideDropdown }));\n              }),\n              base$1.react.createElement(base$1.fluentUI.DefaultButton, { className: \"sanddance-chart-button\", text: strings$1.buttonTooltipMapping, onClick: () => this.setState({ showTooltipDialog: true }) })\n            )\n          ),\n          hasOptions && base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelChartTypeOptions },\n            signals && signals.map((signal, i) => base$1.react.createElement(Signal, { key: i, signal, explorer: explorer2, initialValue: getInitialSignalValue(explorer2, signal), disabled: props.disabled || this.disableSignal(signal), collapseLabel: props.collapseLabels, newViewStateTarget: false })),\n            (specCapabilities === null || specCapabilities === void 0 ? void 0 : specCapabilities.backgroundImage) && base$1.react.createElement(base$1.fluentUI.DefaultButton, { className: \"sanddance-chart-button\", text: strings$1.buttonBackgroundImage, onClick: () => {\n              let insightColumns;\n              switch (props.chart) {\n                case \"scatterplot\":\n                case \"stacks\": {\n                  insightColumns = props.insightColumns;\n                  break;\n                }\n              }\n              if (!insightColumns) {\n                insightColumns = props.explorer.changeChartType(\"scatterplot\");\n              }\n              this.backgroundImageEditor.show(insightColumns);\n            } })\n          ),\n          base$1.react.createElement(\n            Dialog$1,\n            { hidden: !this.state.showTooltipDialog, onDismiss: () => this.setState({ showTooltipDialog: false }), title: strings$1.labelTooltipMapping },\n            base$1.react.createElement(ToggleColumns, { allColumns: props.allColumns, exclusions: props.tooltipExclusions, toggleExclusion: props.toggleTooltipExclusion })\n          ),\n          base$1.react.createElement(BackgroundImageEditor, Object.assign({}, props, { ref: (e) => this.backgroundImageEditor = e }))\n        );\n      }\n      disableSignal(signal) {\n        if (this.props.view === \"2d\" && signal.name === SignalNames.ZGrounded) {\n          return true;\n        }\n        return false;\n      }\n    }\n    return new __Chart(_props);\n  }\n  const Chart = _Chart;\n  function TextField$1(props) {\n    return base$1.react.createElement(base$1.fluentUI.TextField, Object.assign({ onKeyUp: (e) => {\n      e.nativeEvent.stopImmediatePropagation();\n    } }, props));\n  }\n  const maxAutocomplete = 100;\n  function getValidOperators(column) {\n    const type2 = column && column.type;\n    switch (type2) {\n      case \"boolean\":\n        return [\n          [\"==\", strings$1.searchEQ],\n          [\"!=\", strings$1.searchNEQ],\n          [\"isnullorEmpty\", strings$1.searchNULL]\n        ];\n      case \"date\":\n      case \"integer\":\n      case \"number\":\n        return [\n          [\"==\", strings$1.searchEQ],\n          [\"!=\", strings$1.searchNEQ],\n          [\">\", strings$1.searchGT],\n          [\">=\", strings$1.searchGTE],\n          [\"<\", strings$1.searchLT],\n          [\"<=\", strings$1.searchLTE],\n          [\"isnullorEmpty\", strings$1.searchNULL]\n        ];\n      case \"string\":\n      default:\n        return [\n          [\"==\", strings$1.searchEQ],\n          [\"!=\", strings$1.searchNEQ],\n          [\">\", strings$1.searchGT],\n          [\">=\", strings$1.searchGTE],\n          [\"<\", strings$1.searchLT],\n          [\"<=\", strings$1.searchLTE],\n          [\"contains\", strings$1.searchIN],\n          [\"starts\", strings$1.searchSW],\n          [\"isnullorEmpty\", strings$1.searchNULL]\n        ];\n    }\n  }\n  function getExpressionClauses(currClause, disableOR) {\n    const keys2 = [\n      [\"&&\", strings$1.searchAND]\n    ];\n    if (!disableOR) {\n      keys2.push([\"||\", strings$1.searchOR]);\n    }\n    return keys2.map((key2, i) => {\n      const [clause, text2] = key2;\n      const selected = currClause == clause;\n      const option = {\n        key: i,\n        text: text2,\n        data: clause,\n        selected\n      };\n      return option;\n    });\n  }\n  function getOperators(ex, column) {\n    let anySelected = false;\n    const validOperators = getValidOperators(column);\n    const options2 = validOperators.map((validoperator) => {\n      const [op, text2] = validoperator;\n      const selected = ex.operator === op;\n      anySelected = anySelected || selected;\n      const option = {\n        key: op,\n        text: text2,\n        data: op,\n        selected\n      };\n      return option;\n    });\n    if (!anySelected) {\n      options2[0].selected = true;\n    }\n    return options2;\n  }\n  function getDistinctValues(data2, columnName) {\n    const distinctMap = {};\n    for (let i = 0; i < data2.length; i++) {\n      const row = data2[i];\n      const value2 = row[columnName];\n      distinctMap[value2] = true;\n    }\n    return Object.keys(distinctMap).sort();\n  }\n  function getValues(ex, column, data2, autoCompleteDistinctValues) {\n    const stats = column && column.stats;\n    if (stats && stats.distinctValueCount < maxAutocomplete) {\n      if (!autoCompleteDistinctValues[column.name]) {\n        autoCompleteDistinctValues[column.name] = getDistinctValues(data2, column.name);\n      }\n      return autoCompleteDistinctValues[column.name].map((v, i) => ({\n        key: i,\n        text: v\n      }));\n    }\n    return [];\n  }\n  function getText(ex) {\n    if (ex.operator === \"isnullorEmpty\")\n      return \"\";\n    return typeof ex.value === \"string\" ? ex.value : ex.value == null ? \"\" : ex.value.toString();\n  }\n  function SearchTerm(props) {\n    const ex = props.searchExpression;\n    const possibleValues = getValues(ex, props.column, props.data, props.autoCompleteDistinctValues);\n    return base$1.react.createElement(\n      \"div\",\n      null,\n      props.index > 0 && base$1.react.createElement(Dropdown$1, { collapseLabel: props.collapseLabels, className: \"search-field\", label: strings$1.labelSearchClause, dropdownWidth: 120, disabled: !ex.unlocked || props.disableOR, options: getExpressionClauses(ex.clause, props.disableOR), onChange: (e, o) => props.onUpdateExpression({ clause: o.data }, props.index) }),\n      base$1.react.createElement(Dropdown$1, { componentRef: props.dropdownRef, collapseLabel: props.collapseLabels, className: \"search-field\", label: strings$1.labelSearchColumn, options: [\n        {\n          key: \"\",\n          text: strings$1.selectAny,\n          data: null,\n          selected: ex.name === null\n        }\n      ].concat(props.columns.map((c2, i) => ({\n        key: c2.name,\n        text: c2.name,\n        data: c2,\n        selected: c2.name === ex.name\n      }))), onChange: (e, o) => props.onUpdateExpression({ name: o.data && o.data.name || null }, props.index) }),\n      base$1.react.createElement(Dropdown$1, { collapseLabel: props.collapseLabels, className: \"search-field\", label: strings$1.labelSearchOperator, dropdownWidth: 120, options: getOperators(ex, props.column), onChange: (e, o) => props.onUpdateExpression({ operator: o.data }, props.index) }),\n      possibleValues.length > 0 && base$1.react.createElement(base$1.fluentUI.ComboBox, { className: \"search-field\", label: props.collapseLabels ? null : strings$1.labelSearchValue, placeholder: strings$1.labelSearchValuePlaceholder, disabled: ex.operator === \"isnullorEmpty\", dropdownWidth, allowFreeform: true, autoComplete: \"on\", errorMessage: ex.errorMessage, text: getText(ex), options: getValues(ex, props.column, props.data, props.autoCompleteDistinctValues), onChange: (e, o, i, value2) => {\n        if (o) {\n          value2 = o.text;\n        }\n        props.onUpdateExpression({ value: value2 }, props.index);\n      } }),\n      possibleValues.length === 0 && base$1.react.createElement(TextField$1, { className: \"search-field\", label: props.collapseLabels ? null : strings$1.labelSearchValue, placeholder: strings$1.labelSearchValuePlaceholder, disabled: ex.operator === \"isnullorEmpty\", errorMessage: ex.errorMessage, value: getText(ex), onChange: (e, v) => props.onUpdateExpression({ value: v }, props.index) })\n    );\n  }\n  function Button(props) {\n    return base$1.react.createElement(base$1.fluentUI.DefaultButton, Object.assign({}, props, { styles: {\n      root: Object.assign({ backgroundColor: \"transparent\", height: \"30px\", width: props.width, padding: 0 }, props.rootStyle),\n      rootDisabled: {\n        backgroundColor: \"transparent\"\n      },\n      icon: {\n        color: props.themePalette.themePrimary\n      },\n      label: {\n        fontWeight: \"400\",\n        textAlign: props.textAlign || \"left\"\n      }\n    }, iconProps: { iconName: props.iconName } }));\n  }\n  const maxClauses = 5;\n  function getColumnWithName(columnName, columns) {\n    for (let i = 0; i < columns.length; i++) {\n      if (columns[i].name === columnName)\n        return columns[i];\n    }\n  }\n  function validateExpression(ex) {\n    if (ex.operator === \"isnullorEmpty\") {\n      ex.errorMessage = null;\n      return;\n    }\n    const s2 = getText(ex);\n    if (s2.length === 0) {\n      ex.errorMessage = strings$1.labelRequired;\n    } else {\n      ex.errorMessage = null;\n    }\n  }\n  function clearExpressionValidation(ex) {\n    if (ex.operator === \"isnullorEmpty\") {\n      ex.errorMessage = null;\n      return;\n    }\n    const s2 = getText(ex);\n    if (s2.length !== 0) {\n      ex.errorMessage = null;\n    }\n  }\n  function getGroupClauses(currClause, index2, disableGroupOR) {\n    let keys2;\n    if (index2 === 0) {\n      keys2 = [\n        [null, strings$1.searchWHERE]\n      ];\n    } else {\n      keys2 = [\n        [\"&&\", strings$1.searchAND]\n      ];\n      if (!disableGroupOR) {\n        keys2.push([\"||\", strings$1.searchOR]);\n      }\n    }\n    return keys2.map((key2, i) => {\n      const [clause, text2] = key2;\n      const selected = currClause == clause;\n      const option = {\n        key: i,\n        text: text2,\n        data: clause,\n        selected\n      };\n      return option;\n    });\n  }\n  function _Search(_props) {\n    class __Search extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = this.getInitialState(this.props);\n        this.dropdownRef = base$1.react.createRef();\n        props.explorer.dialogFocusHandler.focus = () => {\n          var _a2;\n          return (_a2 = this.dropdownRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        };\n      }\n      getInitialState(props) {\n        const initialState = {\n          groups: props.initializer.search || [this.newGroup(0, null)],\n          sortedColumns: [...props.initializer.columns].sort((a2, b2) => a2.name.localeCompare(b2.name)),\n          initializer: props.initializer\n        };\n        initialState.groups.forEach((group2) => {\n          group2.expressions.forEach((ex) => ex.unlocked = group2.expressions.length <= 2);\n        });\n        return initialState;\n      }\n      componentDidUpdate() {\n        if (!deepCompare(this.props.initializer, this.state.initializer)) {\n          this.setState(this.getInitialState(this.props));\n        }\n      }\n      validateAndSearch() {\n        const groups = [...this.state.groups];\n        groups.forEach((group2) => {\n          group2.expressions.forEach(validateExpression);\n          const errors = group2.expressions.reduce((p, c2) => p || c2.errorMessage, \"\");\n          if (errors) {\n            this.setState({ groups });\n          } else {\n            this.props.onSelect(this.state.groups);\n          }\n        });\n      }\n      newGroup(key2, clause) {\n        const group2 = {\n          key: key2,\n          clause,\n          expressions: [this.newExpression(0, null)]\n        };\n        return group2;\n      }\n      updateGroup(partialGroup, groupIndex) {\n        const groups = [...this.state.groups];\n        const group2 = Object.assign(Object.assign({}, groups[groupIndex]), partialGroup);\n        groups[groupIndex] = group2;\n        this.setState({ groups });\n      }\n      addGroup() {\n        const groups = [...this.state.groups];\n        const maxKey = groups.reduce((max2, p) => p.key > max2 ? p.key : max2, groups[0].key);\n        const newGroup = this.newGroup(maxKey + 1, \"&&\");\n        groups.push(newGroup);\n        this.setState({ groups });\n      }\n      deleteGroup(groupIndex) {\n        const groups = [...this.state.groups];\n        groups.splice(groupIndex, 1);\n        this.setState({ groups });\n      }\n      newExpression(key2, clause) {\n        const ex = { key: key2, clause, name: null, operator: \"contains\", value: \"\" };\n        return ex;\n      }\n      addExpression(groupIndex) {\n        const groups = [...this.state.groups];\n        const group2 = Object.assign({}, groups[groupIndex]);\n        const expressions = [...group2.expressions];\n        const maxKey = expressions.reduce((max2, p) => p.key > max2 ? p.key : max2, expressions[0].key);\n        const newEx = this.newExpression(maxKey + 1, \"&&\");\n        expressions.push(newEx);\n        if (expressions.length === 2) {\n          newEx.unlocked = true;\n        } else {\n          expressions.forEach((ex) => ex.unlocked = false);\n          newEx.clause = expressions[1].clause;\n        }\n        group2.expressions = expressions;\n        groups[groupIndex] = group2;\n        this.setState({ groups });\n      }\n      updateExpression(partialEx, groupIndex, index2) {\n        const groups = [...this.state.groups];\n        const group2 = Object.assign({}, groups[groupIndex]);\n        const expressions = [...group2.expressions];\n        const currentEx = expressions[index2];\n        if (currentEx.name !== partialEx.name) {\n          const oldColumn = getColumnWithName(currentEx.name, this.state.sortedColumns);\n          const newColumn = getColumnWithName(partialEx.name, this.state.sortedColumns);\n          const oldType = oldColumn && oldColumn.type;\n          const newType = newColumn && newColumn.type;\n          if (oldType !== newType) {\n            const newOperators = getValidOperators(newColumn).map((validOperator) => validOperator[0]);\n            if (newOperators.indexOf(currentEx.operator) < 0) {\n              partialEx.operator = \"==\";\n            }\n          }\n        }\n        const ex = Object.assign(Object.assign({}, currentEx), partialEx);\n        clearExpressionValidation(ex);\n        expressions[index2] = ex;\n        group2.expressions = expressions;\n        groups[groupIndex] = group2;\n        this.setState({ groups });\n      }\n      deleteExpression(groupIndex, index2) {\n        const groups = [...this.state.groups];\n        const group2 = Object.assign({}, groups[groupIndex]);\n        const expressions = [...group2.expressions];\n        expressions.splice(index2, 1);\n        if (expressions.length === 2) {\n          expressions[1].unlocked = true;\n        }\n        group2.expressions = expressions;\n        groups[groupIndex] = group2;\n        this.setState({ groups });\n      }\n      render() {\n        return base$1.react.createElement(\n          Group$1,\n          { className: \"sanddance-search\", label: strings$1.labelSearch },\n          base$1.react.createElement(\n            \"div\",\n            null,\n            this.state.groups.map((group2, groupIndex) => base$1.react.createElement(\n              \"div\",\n              { className: \"sanddance-search-group\", key: group2.key },\n              base$1.react.createElement(Dropdown$1, { collapseLabel: this.props.collapseLabels, className: \"search-group-clause\", label: strings$1.labelSearchClause, disabled: groupIndex === 0 || this.props.disableGroupOR, dropdownWidth: 120, options: getGroupClauses(group2.clause, groupIndex, this.props.disableGroupOR), onChange: (e, o) => this.updateGroup({ clause: o.data }, groupIndex) }),\n              base$1.react.createElement(\"div\", null, group2.expressions.map((ex, i) => base$1.react.createElement(\n                \"div\",\n                { className: \"sanddance-search-expression\", key: ex.key },\n                base$1.react.createElement(SearchTerm, { dropdownRef: groupIndex === 0 && i === 0 ? this.dropdownRef : void 0, collapseLabels: this.props.collapseLabels, onUpdateExpression: (ex2, i2) => this.updateExpression(ex2, groupIndex, i2), autoCompleteDistinctValues: this.props.autoCompleteDistinctValues, index: i, columns: this.state.sortedColumns, data: this.props.data, searchExpression: ex, disableOR: this.props.disableExpressionOR, column: getColumnWithName(ex.name, this.state.sortedColumns) }),\n                group2.expressions.length > 1 && base$1.react.createElement(Button, { themePalette: this.props.themePalette, className: \"search-action\", iconName: \"Cancel\", onClick: () => this.deleteExpression(groupIndex, i), text: strings$1.buttonDeleteExpression })\n              ))),\n              group2.expressions.length < maxClauses && base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(Button, { themePalette: this.props.themePalette, className: \"search-action\", iconName: \"Add\", onClick: () => this.addExpression(groupIndex), text: strings$1.buttonAddExpression })\n              ),\n              this.state.groups.length > 1 && base$1.react.createElement(Button, { themePalette: this.props.themePalette, className: \"search-action\", iconName: \"Cancel\", onClick: () => this.deleteGroup(groupIndex), text: strings$1.buttonDeleteExpressionGroup })\n            )),\n            this.state.groups.length < maxClauses && base$1.react.createElement(\n              \"div\",\n              null,\n              base$1.react.createElement(Button, { themePalette: this.props.themePalette, className: \"search-action search-bottom-action\", iconName: \"Add\", onClick: () => this.addGroup(), text: strings$1.buttonAddExpressionGroup })\n            )\n          ),\n          base$1.react.createElement(base$1.fluentUI.PrimaryButton, { className: \"search-action search-bottom-action\", text: strings$1.buttonSelect, onClick: () => this.validateAndSearch() })\n        );\n      }\n    }\n    return new __Search(_props);\n  }\n  const Search = _Search;\n  var PresenterElement = PresenterElement$1;\n  function getCanvas(viewer) {\n    const tags = viewer.presenter.getElement(PresenterElement.gl).getElementsByTagName(\"canvas\");\n    if (tags) {\n      return tags[0];\n    }\n  }\n  function removeTabIndex(viewer) {\n    const canvas = getCanvas(viewer);\n    if (canvas) {\n      canvas.tabIndex = -1;\n    }\n  }\n  const capabilities = {\n    webgl: !!document.createElement(\"canvas\").getContext(\"webgl\"),\n    webgl2: !!document.createElement(\"canvas\").getContext(\"webgl2\")\n  };\n  const version$2 = \"4.1.8\";\n  var SandDance = index$4;\n  var DataRefType;\n  (function(DataRefType2) {\n    DataRefType2[DataRefType2[\"none\"] = 0] = \"none\";\n    DataRefType2[DataRefType2[\"inline\"] = 1] = \"inline\";\n    DataRefType2[DataRefType2[\"url\"] = 2] = \"url\";\n  })(DataRefType || (DataRefType = {}));\n  function filterSignals(signal) {\n    switch (signal.name) {\n      case SandDance.constants.SignalNames.XBins:\n      case SandDance.constants.SignalNames.YBins:\n      case SandDance.constants.SignalNames.FacetBins:\n      case SandDance.constants.SignalNames.FacetVBins:\n      case SandDance.constants.SignalNames.ColorBinCount:\n      case SandDance.constants.SignalNames.ColorReverse:\n      case SandDance.constants.SignalNames.PointScale:\n      case SandDance.constants.SignalNames.TreeMapMethod:\n      case SandDance.constants.SignalNames.ZGrounded:\n        return false;\n      default:\n        return !!signal.bind;\n    }\n  }\n  function cloneData(vegaSpec) {\n    const data0 = vegaSpec.data[0];\n    const valuesData = data0;\n    const values2 = valuesData.values;\n    delete valuesData.values;\n    const data2 = SandDance.VegaMorphCharts.util.clone(vegaSpec.data);\n    valuesData.values = values2;\n    return { data: data2, values: values2 };\n  }\n  function cloneScales(vegaSpec) {\n    return SandDance.VegaMorphCharts.util.clone(vegaSpec.scales);\n  }\n  function serializeSpec(vegaSpec, datafile, dataRefType, transform2, scheme2) {\n    const scales2 = cloneScales(vegaSpec);\n    const colorScale = scales2.filter((scale2) => scale2.name === SandDance.constants.ScaleNames.Color)[0];\n    if (scheme2.indexOf(\"dual_\") >= 0) {\n      colorScale.range = SandDance.colorSchemes.filter((cs) => cs.scheme === scheme2)[0].colors;\n    }\n    const clone2 = cloneData(vegaSpec);\n    const data0 = clone2.data[0];\n    if (dataRefType === DataRefType.inline) {\n      const valuesData = data0;\n      valuesData.format = { parse: \"auto\", type: \"json\" };\n      valuesData.values = clone2.values;\n    } else if (dataRefType === DataRefType.none) {\n      const valuesData = data0;\n      valuesData.values = [];\n      if (transform2) {\n        if (valuesData.transform) {\n          valuesData.transform.push.apply(valuesData.transform, transform2);\n        } else {\n          valuesData.transform = transform2;\n        }\n      }\n    } else if (dataRefType === DataRefType.url) {\n      const urlData = data0;\n      urlData.url = datafile.dataUrl;\n      urlData.format = { parse: \"auto\", type: datafile.type };\n      if (transform2) {\n        if (urlData.transform) {\n          urlData.transform.push.apply(urlData.transform, transform2);\n        } else {\n          urlData.transform = transform2;\n        }\n      }\n    }\n    return Object.assign(Object.assign({}, vegaSpec), { data: clone2.data, scales: scales2 });\n  }\n  function defaultDataRefType(datafile) {\n    if (datafile.dataUrl) {\n      return DataRefType.url;\n    }\n    return DataRefType.none;\n  }\n  function initState(props) {\n    return {\n      showSystemDialog: false,\n      showVegaDialog: false,\n      dataRefType: defaultDataRefType(props.dataFile),\n      spec: null\n    };\n  }\n  function signalGroupKey(key2) {\n    for (let i = 0; i < strings$1.signalGroups.length; i++) {\n      if (strings$1.signalGroups[i].prefix === key2) {\n        return key2;\n      }\n    }\n    return \"*\";\n  }\n  function vegaSignalGroups(vegaSignals) {\n    const signalGroupMap = {};\n    vegaSignals.forEach((vs) => {\n      const split = vs.name.split(\"_\");\n      const key2 = signalGroupKey(split[0]);\n      signalGroupMap[key2] = signalGroupMap[key2] || [];\n      signalGroupMap[key2].push(vs);\n    });\n    return signalGroupMap;\n  }\n  function _Settings(_props) {\n    class __Settings extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = initState(props);\n      }\n      render() {\n        const { props, state } = this;\n        if (!props.explorer.viewer || !props.explorer.viewer.vegaSpec)\n          return null;\n        const options2 = [\n          {\n            key: DataRefType.none,\n            text: strings$1.selectVegaSpecDataNone,\n            selected: this.state.dataRefType === DataRefType.none,\n            data: DataRefType.none\n          },\n          !props.dataFile.rawText && {\n            key: DataRefType.url,\n            text: strings$1.selectVegaSpecDataUrl,\n            selected: this.state.dataRefType === DataRefType.url,\n            data: DataRefType.url\n          },\n          {\n            key: DataRefType.inline,\n            text: strings$1.selectVegaSpecDataInline,\n            selected: this.state.dataRefType === DataRefType.inline,\n            data: DataRefType.inline\n          }\n        ].filter(Boolean);\n        const signalGroupMap = vegaSignalGroups(props.explorer.viewer.vegaSpec.signals);\n        let first = true;\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          strings$1.signalGroups.map((sg, gi) => {\n            const vegaSignals = signalGroupMap[sg.prefix];\n            if (vegaSignals) {\n              const filteredVegaSignals = vegaSignals.filter(filterSignals);\n              if (filteredVegaSignals.length > 0) {\n                return base$1.react.createElement(Group$1, { key: sg.prefix, label: sg.label }, filteredVegaSignals.map((signal, i) => {\n                  const ref2 = base$1.react.createRef();\n                  if (first) {\n                    first = false;\n                    props.explorer.dialogFocusHandler.focus = () => {\n                      const f = ref2.current;\n                      if (f === null || f === void 0 ? void 0 : f.focus) {\n                        f.focus();\n                      }\n                    };\n                  }\n                  return base$1.react.createElement(Signal, { componentRef: ref2, key: i, signal, explorer: props.explorer, initialValue: getInitialSignalValue(props.explorer, signal), newViewStateTarget: false });\n                }));\n              }\n            }\n          }),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelChartCanvas },\n            base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.labelShowAxes, defaultChecked: !props.hideAxes, onChange: (e, checked) => props.onToggleAxes(!checked) }),\n            base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.labelShowLegend, defaultChecked: !props.hideLegend, onChange: (e, checked) => props.onToggleLegend(!checked) })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTools },\n            base$1.react.createElement(base$1.fluentUI.DefaultButton, { text: strings$1.buttonShowVegaSpec, onClick: () => this.setState({\n              showVegaDialog: true,\n              spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, this.state.dataRefType, props.explorer.viewer.getInsight().transform, this.props.scheme)\n            }) })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelSnapshots },\n            base$1.react.createElement(base$1.fluentUI.Slider, { label: strings$1.labelSnapshotSettingThumbnailWidth, onChange: (value2) => {\n              this.props.explorer.snapshotThumbWidth = value2;\n            }, min: 100, max: 800, defaultValue: this.props.explorer.snapshotThumbWidth })\n          ),\n          props.additionalSettings && props.additionalSettings.map((g, i) => base$1.react.createElement(Group$1, { key: i, label: g.groupLabel }, g.children)),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelSystem },\n            base$1.react.createElement(base$1.fluentUI.DefaultButton, { text: strings$1.labelSystemInfo, onClick: () => this.setState({ showSystemDialog: true }) })\n          ),\n          base$1.react.createElement(\n            Dialog$1,\n            { hidden: !state.showVegaDialog, onDismiss: () => this.setState(initState(this.props)), minWidth: \"80%\", title: strings$1.labelVegaSpec, buttons: [\n              base$1.react.createElement(base$1.fluentUI.PrimaryButton, { key: \"copy\", iconProps: { iconName: \"Copy\" }, text: strings$1.buttonCopyToClipboard, onClick: () => {\n                const pre = document.getElementById(\"sanddance-vega-spec\");\n                const range2 = document.createRange();\n                range2.selectNode(pre);\n                const selection = window.getSelection();\n                selection.removeAllRanges();\n                selection.addRange(range2);\n                document.execCommand(\"copy\");\n              } }),\n              base$1.react.createElement(base$1.fluentUI.DefaultButton, { key: \"edit\", iconProps: { iconName: \"OpenInNewWindow\" }, text: strings$1.buttonLaunchVegaEditor, onClick: () => {\n                window.open(\"https://vega.github.io/editor/\", \"_blank\");\n              } })\n            ] },\n            base$1.react.createElement(Dropdown$1, { label: strings$1.labelVegaSpecData, options: options2, onChange: (e, o) => this.setState({\n              dataRefType: o.data,\n              spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, o.data, props.explorer.viewer.getInsight().transform, this.props.scheme)\n            }) }),\n            base$1.react.createElement(\"pre\", { id: \"sanddance-vega-spec\" }, JSON.stringify(this.state.spec, null, 2)),\n            base$1.react.createElement(\"div\", null, strings$1.labelVegaSpecNotes)\n          ),\n          base$1.react.createElement(\n            Dialog$1,\n            { hidden: !state.showSystemDialog, onDismiss: () => this.setState(initState(this.props)), title: strings$1.labelSystemInfo },\n            base$1.react.createElement(\n              \"ul\",\n              null,\n              this.props.children,\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"SandDanceExplorer version: \",\n                version$2\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"SandDanceReact version: \",\n                version$3\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"SandDance version: \",\n                SandDance.version\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"Vega-MorphCharts version: \",\n                SandDance.VegaMorphCharts.version\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"WebGL enabled: \",\n                capabilities.webgl ? strings$1.labelYes : strings$1.labelNo\n              ),\n              base$1.react.createElement(\n                \"li\",\n                null,\n                \"WebGL2 enabled: \",\n                capabilities.webgl2 ? strings$1.labelYes : strings$1.labelNo\n              )\n            )\n          )\n        );\n      }\n    }\n    return new __Settings(_props);\n  }\n  const Settings = _Settings;\n  function _SnapshotEditor(_props) {\n    class __SnapshotEditor extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = {\n          showEditFormDialog: false,\n          title: \"\",\n          description: \"\",\n          image: null,\n          bgColor: null,\n          insight: null,\n          editIndex: -1\n        };\n      }\n      resize(src, thumbWidth) {\n        if (!src)\n          return;\n        const img = new Image();\n        img.onload = () => {\n          const canvas = document.createElement(\"canvas\"), ctx = canvas.getContext(\"2d\");\n          const ratio = img.width / thumbWidth;\n          canvas.height = img.height / ratio;\n          canvas.width = thumbWidth;\n          ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n          const image2 = canvas.toDataURL();\n          this.setState({ image: image2 });\n        };\n        img.src = src;\n      }\n      editSnapshot(snapshot, editIndex = -1) {\n        if (snapshot) {\n          this.setState(Object.assign(Object.assign({ showEditFormDialog: true }, snapshot), { editIndex }));\n        } else {\n          const { explorer: explorer2 } = this.props;\n          const signalValues = explorer2.viewer.getSignalValues();\n          explorer2.viewer.deselect().then(() => {\n            const canvas = getCanvas(explorer2.viewer);\n            const bgColor = canvas && window.getComputedStyle(canvas).backgroundColor;\n            const insight = clone(explorer2.viewer.getInsight());\n            delete insight.size;\n            insight.signalValues = signalValues;\n            const title = this.props.getTitle && this.props.getTitle(insight) || \"\";\n            const description = this.props.getDescription && this.props.getDescription(insight) || \"\";\n            this.setState({ showEditFormDialog: true, bgColor, title, description, insight, image: null, editIndex });\n            setTimeout(() => {\n              explorer2.viewer.presenter.canvasToDataURL().then((dataUrl) => {\n                this.resize(dataUrl, explorer2.snapshotThumbWidth);\n              });\n            }, 500);\n          });\n        }\n      }\n      render() {\n        var _a2, _b2;\n        const { explorer: explorer2 } = this.props;\n        return base$1.react.createElement(\n          Dialog$1,\n          { modalProps: { className: classList(\"sanddance-snapshot-dialog\", this.props.theme) }, minWidth: `${explorer2.snapshotThumbWidth + 64}px`, hidden: !this.state.showEditFormDialog, onDismiss: () => this.setState({ showEditFormDialog: false }), title: this.state.editIndex >= 0 ? strings$1.buttonEditSnapshot : strings$1.buttonCreateSnapshot, buttons: base$1.react.createElement(base$1.fluentUI.PrimaryButton, { disabled: !this.state.image || !this.state.title, key: 0, onClick: (e) => {\n            const setup2 = clone(explorer2.getSetup());\n            if (setup2.camera !== \"hold\") {\n              setup2.camera = explorer2.viewer.getCamera();\n            }\n            const snapshot = {\n              title: this.state.title,\n              description: this.state.description,\n              insight: this.state.insight,\n              image: this.state.image,\n              bgColor: this.state.bgColor,\n              setup: setup2\n            };\n            this.props.modifySnapShot && this.props.modifySnapShot(snapshot);\n            this.props.onWriteSnapshot(snapshot, this.state.editIndex);\n            this.setState({ showEditFormDialog: false, title: \"\", description: \"\", image: null });\n          }, iconProps: { iconName: \"Camera\" }, text: this.state.editIndex >= 0 ? strings$1.buttonUpdateSnapshot : strings$1.buttonCreateSnapshot }) },\n          base$1.react.createElement(base$1.fluentUI.TextField, { label: strings$1.labelSnapshotTitle, onChange: (e, title) => this.setState({ title }), value: this.state.title }),\n          base$1.react.createElement(base$1.fluentUI.TextField, { label: strings$1.labelSnapshotDescription, onChange: (e, description) => this.setState({ description }), value: this.state.description, multiline: true }),\n          base$1.react.createElement(\n            \"div\",\n            { className: \"thumbnail\" },\n            !this.state.image && base$1.react.createElement(base$1.fluentUI.Spinner, null),\n            this.state.image && base$1.react.createElement(\"img\", { src: this.state.image, style: { backgroundColor: this.state.bgColor } })\n          ),\n          ((_b2 = (_a2 = explorer2.viewer) === null || _a2 === void 0 ? void 0 : _a2.colorContexts) === null || _b2 === void 0 ? void 0 : _b2.length) > 1 && base$1.react.createElement(\"div\", null, strings$1.labelColorFilter)\n        );\n      }\n    }\n    return new __SnapshotEditor(_props);\n  }\n  const SnapshotEditor = _SnapshotEditor;\n  function _Snapshots(_props) {\n    class __Snapshots extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = {\n          confirmation: null,\n          title: \"\",\n          description: \"\",\n          image: null,\n          bgColor: null,\n          insight: null\n        };\n      }\n      render() {\n        const items = [\n          {\n            key: \"clear\",\n            text: strings$1.buttonClearSnapshots,\n            onClick: () => this.setState({\n              confirmation: {\n                buttonText: strings$1.buttonClearSnapshots,\n                handler: () => this.props.onClearSnapshots()\n              }\n            }),\n            disabled: this.props.snapshots.length === 0\n          }\n        ];\n        if (this.props.getTopActions) {\n          items.push.apply(items, this.props.getTopActions(this.props.snapshots));\n        }\n        const ref2 = base$1.react.createRef();\n        this.props.explorer.dialogFocusHandler.focus = () => {\n          var _a2;\n          (_a2 = ref2.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        };\n        return base$1.react.createElement(\n          Group$1,\n          { className: \"sanddance-snapshots\", label: strings$1.labelSnapshots },\n          base$1.react.createElement(\n            \"div\",\n            null,\n            base$1.react.createElement(base$1.fluentUI.PrimaryButton, { componentRef: ref2, text: strings$1.buttonCreateSnapshot, onClick: (e) => this.props.editor.editSnapshot(), split: true, menuProps: {\n              items\n            } }),\n            this.props.getChildren && this.props.getChildren(this.props.snapshots),\n            this.state.confirmation && base$1.react.createElement(Dialog$1, { hidden: false, buttons: base$1.react.createElement(base$1.fluentUI.PrimaryButton, { key: 0, onClick: (e) => {\n              this.setState({ confirmation: null });\n              this.state.confirmation.handler();\n            }, iconProps: { iconName: \"Delete\" }, text: this.state.confirmation.buttonText }), onDismiss: () => this.setState({ confirmation: null }) }, strings$1.labelConfirmation),\n            base$1.react.createElement(\"div\", null, this.props.snapshots.map((snapshot, i) => {\n              const actions = this.props.getActions && this.props.getActions(snapshot, i) || [];\n              actions.push({\n                iconButtonProps: {\n                  themePalette: this.props.themePalette,\n                  title: strings$1.buttonEditSnapshot,\n                  onClick: (e) => this.props.editor.editSnapshot(snapshot, i),\n                  iconName: \"Edit\"\n                }\n              });\n              if (this.props.snapshots.length > 1) {\n                actions.push({\n                  iconButtonProps: {\n                    disabled: i === 0,\n                    themePalette: this.props.themePalette,\n                    title: strings$1.buttonMoveUp,\n                    onClick: (e) => this.props.onMoveUp(i),\n                    iconName: \"SortUp\"\n                  }\n                }, {\n                  iconButtonProps: {\n                    disabled: i > this.props.snapshots.length - 2,\n                    themePalette: this.props.themePalette,\n                    title: strings$1.buttonMoveDown,\n                    onClick: (e) => this.props.onMoveDown(i),\n                    iconName: \"SortDown\"\n                  }\n                });\n              }\n              actions.push({\n                iconButtonProps: {\n                  themePalette: this.props.themePalette,\n                  title: strings$1.buttonDeleteSnapshot,\n                  onClick: () => this.setState({\n                    confirmation: {\n                      buttonText: strings$1.buttonDeleteSnapshot,\n                      handler: () => this.props.onRemoveSnapshot(i)\n                    }\n                  }),\n                  iconName: \"Delete\"\n                }\n              });\n              return base$1.react.createElement(\n                \"div\",\n                { key: i, className: classList(\"snapshot\", i === this.props.selectedSnapshotIndex && \"selected\") },\n                base$1.react.createElement(\n                  \"div\",\n                  { onClick: (e) => this.props.onSnapshotClick(snapshot, i) },\n                  base$1.react.createElement(\"div\", { className: \"title\" }, snapshot.title),\n                  base$1.react.createElement(\n                    \"div\",\n                    { className: \"thumbnail\" },\n                    base$1.react.createElement(\"img\", { title: snapshot.description, src: snapshot.image, style: { backgroundColor: snapshot.bgColor } })\n                  )\n                ),\n                base$1.react.createElement(Actions, { actions, snapshot })\n              );\n            }))\n          )\n        );\n      }\n    }\n    return new __Snapshots(_props);\n  }\n  const Snapshots = _Snapshots;\n  function Actions(props) {\n    return base$1.react.createElement(\"div\", { className: \"actions\" }, props.actions.map((action, i) => {\n      if (action.iconButtonProps) {\n        return base$1.react.createElement(IconButton$1, Object.assign({ key: i }, action.iconButtonProps));\n      }\n      if (action.element) {\n        return action.element;\n      }\n    }));\n  }\n  const positions = [\n    [\"x\", strings$1.labelAliasX],\n    [\"y\", strings$1.labelAliasY],\n    [\"z\", strings$1.labelAliasZ]\n  ];\n  const autoScrubInterval = 50;\n  function _TransitionEditor(_props) {\n    class __TransitionEditor extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.state = Object.assign({ scrub: 100, pauseDisabled: true }, this.initialCalc(props.transitionDurations));\n        this.autoScrubber = new AutoScrubber(autoScrubInterval, (direction, interval2) => {\n          const totalMs = this.state.totalTransition * 1e3;\n          const currentMs = this.state.scrub / 100 * totalMs;\n          const scrubMs = currentMs + direction * interval2;\n          let scrub = scrubMs / totalMs * 100;\n          if (direction < 0 && scrub <= 0) {\n            scrub = 0;\n            this.autoScrubber.stop();\n          }\n          if (direction > 0 && scrub >= 100) {\n            scrub = 100;\n            this.autoScrubber.stop();\n          }\n          this.setScrubState(scrub);\n        });\n      }\n      initialCalc(transitionDurations) {\n        const totalTransition = (transitionDurations.position + transitionDurations.stagger) / 1e3;\n        const staggerPercent = transitionDurations.stagger === 0 ? 1 : transitionDurations.stagger / (totalTransition * 1e3) * 100;\n        const viewTransition = transitionDurations.view / 1e3;\n        return { totalTransition, staggerPercent, viewTransition };\n      }\n      setScrubState(scrub) {\n        const { morphChartsRenderResult, morphchartsref } = this.props.explorer.viewer.presenter;\n        morphchartsref.core.renderer.transitionTime = scrub / 100;\n        morphChartsRenderResult.setTransitionTimeAxesVisibility();\n        scrub = Math.round(scrub);\n        this.setState({ scrub, pauseDisabled: this.autoScrubber.isStopped() });\n      }\n      setDurations() {\n        setTimeout(() => {\n          const { props, state } = this;\n          const { totalTransition, staggerPercent, viewTransition } = state;\n          const stagger = totalTransition * staggerPercent / 100;\n          const { transitionDurations } = props;\n          transitionDurations.position = (totalTransition - stagger) * 1e3;\n          transitionDurations.stagger = stagger * 1e3;\n          transitionDurations.view = viewTransition * 1e3;\n          syncTansitionDurations(props.explorer.viewer, transitionDurations);\n          props.changeSetup(null, false);\n        });\n      }\n      render() {\n        const { props, state } = this;\n        const { explorer: explorer2, transitionDurations, changeSetup } = props;\n        const sliderRef = base$1.react.createRef();\n        explorer2.dialogFocusHandler.focus = () => {\n          var _a2;\n          return (_a2 = sliderRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        };\n        return base$1.react.createElement(\n          \"div\",\n          null,\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTransition },\n            base$1.react.createElement(base$1.fluentUI.Slider, { componentRef: sliderRef, label: strings$1.labelTransitionScrubber, min: 0, max: 100, valueFormat: strings$1.percentValueFormat, value: state.scrub, onChange: (scrub) => {\n              this.autoScrubber.stop();\n              this.setScrubState(scrub);\n            } }),\n            base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, title: strings$1.buttonTransitionReverse, iconName: \"PlayReverseResume\", onClick: () => {\n              this.autoScrubber.toggleScrubbing(-1);\n              if (state.scrub === 0) {\n                this.setState({ scrub: 100 });\n              }\n            } }),\n            base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, title: strings$1.buttonTransitionPause, iconName: \"Pause\", onClick: () => {\n              this.autoScrubber.togglePause();\n            }, disabled: state.pauseDisabled }),\n            base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, title: strings$1.buttonTransitionPlay, iconName: \"PlayResume\", onClick: () => {\n              this.autoScrubber.toggleScrubbing(1);\n              if (state.scrub === 100) {\n                this.setState({ scrub: 0 });\n              }\n            } })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTransitionOptions },\n            base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.labelHoldCamera, checked: explorer2.state.holdCamera, onChange: (e, holdCamera) => {\n              changeSetup({ holdCamera }, false);\n            } }),\n            base$1.react.createElement(base$1.fluentUI.ChoiceGroup, { label: strings$1.labelTransitionStaggerBy, selectedKey: props.transitionType, options: [\n              {\n                key: \"ordinal\",\n                text: strings$1.labelTransitionStaggerByOrdinal\n              },\n              {\n                key: \"column\",\n                text: strings$1.labelTransitionStaggerByColumn\n              },\n              {\n                key: \"position\",\n                text: strings$1.labelTransitionStaggerByPosition\n              }\n            ], onChange: (e, o) => {\n              const transitionType = o.key;\n              changeSetup({ transitionType }, true);\n            } })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTransitionStaggerOptions },\n            (() => {\n              switch (props.transitionType) {\n                case \"column\": {\n                  return base$1.react.createElement(Dropdown$1, { collapseLabel: props.compactUI, label: strings$1.labelTransitionStaggerByColumn, options: getColumnOptions(props, props.transitionColumn.name), onChange: (e, o) => {\n                    changeSetup({ transitionColumn: o.data }, true);\n                  } });\n                }\n                case \"position\": {\n                  return base$1.react.createElement(Dropdown$1, { collapseLabel: props.compactUI, label: strings$1.labelTransitionStaggerByPosition, options: positions.map(([key2, text2]) => {\n                    return { key: key2, text: text2, selected: props.transitionDimension === key2 };\n                  }), onChange: (e, o) => {\n                    changeSetup({ transitionDimension: o.key }, true);\n                  } });\n                }\n              }\n            })(),\n            base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.labelTransitionStaggerReverse, checked: props.transitionReverse, onChange: (e, transitionReverse) => changeSetup({ transitionReverse }, true) })\n          ),\n          base$1.react.createElement(\n            Group$1,\n            { label: strings$1.labelTransitionDurations },\n            base$1.react.createElement(base$1.fluentUI.Slider, { label: strings$1.labelTransitionDuration, onChange: (totalTransition) => {\n              this.setState({ totalTransition });\n              this.setDurations();\n            }, min: 0, max: 5, step: 0.1, value: state.totalTransition }),\n            base$1.react.createElement(base$1.fluentUI.Slider, { label: strings$1.labelTransitionStagger, onChange: (staggerPercent) => {\n              this.setState({ staggerPercent });\n              this.setDurations();\n            }, min: 0, max: 100, valueFormat: strings$1.percentValueFormat, value: state.staggerPercent }),\n            base$1.react.createElement(base$1.fluentUI.Slider, { label: strings$1.labelTransitionCamera, onChange: (viewTransition) => {\n              this.setState({ viewTransition });\n              this.setDurations();\n            }, min: 0, max: 5, step: 0.1, value: state.viewTransition }),\n            base$1.react.createElement(Button, { themePalette: props.themePalette, onClick: () => {\n              const defaults2 = defaultPresenterConfig.transitionDurations;\n              const { position: position2, stagger, view } = defaults2;\n              transitionDurations.position = position2;\n              transitionDurations.stagger = stagger;\n              transitionDurations.view = view;\n              this.setState(Object.assign({}, this.initialCalc(transitionDurations)));\n              this.setDurations();\n            }, text: strings$1.buttonResetToDefault })\n          )\n        );\n      }\n    }\n    return new __TransitionEditor(_props);\n  }\n  const TransitionEditor = _TransitionEditor;\n  function groupOptions(sectionName, columns, selectedKey) {\n    const options2 = columns.map((column) => {\n      const option = {\n        key: `column:${column.name}`,\n        text: column.name,\n        data: column,\n        selected: column.name === selectedKey\n      };\n      return option;\n    });\n    if (options2.length) {\n      const option = {\n        key: sectionName,\n        text: sectionName,\n        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n      };\n      options2.unshift(option);\n    }\n    return options2;\n  }\n  function getColumnOptions(props, selectedKey) {\n    const quantitativeGroup = groupOptions(strings$1.selectNumeric, props.quantitativeColumns, selectedKey);\n    const categoricGroup = groupOptions(strings$1.selectNonNumeric, props.categoricalColumns, selectedKey);\n    return quantitativeGroup.concat(categoricGroup);\n  }\n  function getTransition(state) {\n    const reverse2 = state.transitionReverse;\n    switch (state.transitionType) {\n      case \"ordinal\": {\n        return {\n          type: \"ordinal\",\n          reverse: reverse2\n        };\n      }\n      case \"column\": {\n        return {\n          type: \"column\",\n          column: state.transitionColumn,\n          reverse: reverse2\n        };\n      }\n      case \"position\": {\n        return {\n          type: \"position\",\n          dimension: state.transitionDimension,\n          reverse: reverse2\n        };\n      }\n    }\n  }\n  function syncTansitionDurations(viewer, transitionDurations) {\n    var _a2, _b2;\n    const config = (_b2 = (_a2 = viewer === null || viewer === void 0 ? void 0 : viewer.presenter) === null || _a2 === void 0 ? void 0 : _a2.morphchartsref) === null || _b2 === void 0 ? void 0 : _b2.core.config;\n    if (config) {\n      const { position: position2, stagger } = transitionDurations;\n      config.transitionDuration = position2;\n      config.transitionStaggering = stagger;\n    }\n  }\n  class AutoScrubber {\n    constructor(interval2, onInterval) {\n      this.interval = interval2;\n      this.onInterval = onInterval;\n    }\n    getSignedInterval() {\n      return this.interval * this.direction;\n    }\n    toggleScrubbing(direction) {\n      if (this.isScrubbing() && direction === this.direction) {\n        this.pause();\n      } else {\n        this.start(direction);\n      }\n    }\n    isPaused() {\n      return !this.isScrubbing() && this.direction !== void 0;\n    }\n    isStopped() {\n      return !this.isScrubbing() && this.direction === void 0;\n    }\n    isScrubbing() {\n      return this.autoScrubTimer !== void 0;\n    }\n    togglePause() {\n      if (this.isScrubbing()) {\n        this.pause();\n      } else if (this.direction) {\n        this.start(this.direction);\n      }\n    }\n    start(direction) {\n      this.direction = direction;\n      if (!this.isScrubbing()) {\n        this.autoScrubTimer = setInterval(() => this.onInterval(this.direction, this.interval), this.interval);\n      }\n    }\n    pause() {\n      clearInterval(this.autoScrubTimer);\n      this.autoScrubTimer = void 0;\n    }\n    stop() {\n      this.pause();\n      this.direction = void 0;\n    }\n  }\n  const className = \"sanddance-panel-tools\";\n  function ensureToolbar(panel) {\n    const existing = panel.getElementsByClassName(className);\n    if (existing.length > 0) {\n      return existing[0];\n    } else {\n      const div = addDiv(panel, className);\n      panel.insertAdjacentElement(\"afterbegin\", div);\n      return div;\n    }\n  }\n  function applyColorButtons(presenter, showLegend, props) {\n    const panel = presenter.getElement(PresenterElement$1.panel);\n    const div = ensureToolbar(panel);\n    base$1.reactDOM.render(ColorMap(props), div);\n    panel.style.display = showLegend ? \"\" : \"none\";\n  }\n  function ColorMap(props) {\n    const menuProps = {\n      items: [\n        {\n          key: \"new\",\n          text: strings$1.buttonColorSchemeRemap,\n          disabled: !props.canRemap || props.isRemap,\n          onClick: () => props.colorMapHandler(true)\n        },\n        {\n          key: \"old\",\n          text: strings$1.buttonColorSchemeKeep,\n          disabled: !props.canRemap || !props.isRemap,\n          onClick: () => props.colorMapHandler(false)\n        }\n      ]\n    };\n    return base$1.react.createElement(\n      \"div\",\n      null,\n      base$1.react.createElement(IconButton$1, { styles: {\n        menuIcon: {\n          display: \"none\"\n        }\n      }, themePalette: props.themePalette, title: strings$1.buttonColorSchemeMap, onClick: null, iconName: props.canRemap ? \"FiltersSolid\" : \"Filters\", menuProps })\n    );\n  }\n  function bestColorScheme(newColumn, oldColumn, oldScheme) {\n    return defaultColorScheme(newColumn);\n  }\n  function defaultColorScheme(c2) {\n    if (c2.quantitative) {\n      return \"redyellowgreen\";\n    } else if (c2.stats.distinctValueCount === 2) {\n      return \"dual_redgreen\";\n    } else if (c2.stats.distinctValueCount <= 10) {\n      return \"category10\";\n    }\n    return \"category20\";\n  }\n  function formatDecimal(x2) {\n    return Math.abs(x2 = Math.round(x2)) >= 1e21 ? x2.toLocaleString(\"en\").replace(/,/g, \"\") : x2.toString(10);\n  }\n  function formatDecimalParts(x2, p) {\n    if ((i = (x2 = p ? x2.toExponential(p - 1) : x2.toExponential()).indexOf(\"e\")) < 0) return null;\n    var i, coefficient = x2.slice(0, i);\n    return [\n      coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n      +x2.slice(i + 1)\n    ];\n  }\n  function exponent(x2) {\n    return x2 = formatDecimalParts(Math.abs(x2)), x2 ? x2[1] : NaN;\n  }\n  function formatGroup(grouping, thousands) {\n    return function(value2, width2) {\n      var i = value2.length, t = [], j = 0, g = grouping[0], length2 = 0;\n      while (i > 0 && g > 0) {\n        if (length2 + g + 1 > width2) g = Math.max(1, width2 - length2);\n        t.push(value2.substring(i -= g, i + g));\n        if ((length2 += g + 1) > width2) break;\n        g = grouping[j = (j + 1) % grouping.length];\n      }\n      return t.reverse().join(thousands);\n    };\n  }\n  function formatNumerals(numerals) {\n    return function(value2) {\n      return value2.replace(/[0-9]/g, function(i) {\n        return numerals[+i];\n      });\n    };\n  }\n  var re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n  function formatSpecifier(specifier) {\n    if (!(match2 = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match2;\n    return new FormatSpecifier({\n      fill: match2[1],\n      align: match2[2],\n      sign: match2[3],\n      symbol: match2[4],\n      zero: match2[5],\n      width: match2[6],\n      comma: match2[7],\n      precision: match2[8] && match2[8].slice(1),\n      trim: match2[9],\n      type: match2[10]\n    });\n  }\n  formatSpecifier.prototype = FormatSpecifier.prototype;\n  function FormatSpecifier(specifier) {\n    this.fill = specifier.fill === void 0 ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === void 0 ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === void 0 ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === void 0 ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === void 0 ? void 0 : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === void 0 ? \"\" : specifier.type + \"\";\n  }\n  FormatSpecifier.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === void 0 ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === void 0 ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n  };\n  function formatTrim(s2) {\n    out: for (var n = s2.length, i = 1, i0 = -1, i1; i < n; ++i) {\n      switch (s2[i]) {\n        case \".\":\n          i0 = i1 = i;\n          break;\n        case \"0\":\n          if (i0 === 0) i0 = i;\n          i1 = i;\n          break;\n        default:\n          if (!+s2[i]) break out;\n          if (i0 > 0) i0 = 0;\n          break;\n      }\n    }\n    return i0 > 0 ? s2.slice(0, i0) + s2.slice(i1 + 1) : s2;\n  }\n  var prefixExponent;\n  function formatPrefixAuto(x2, p) {\n    var d2 = formatDecimalParts(x2, p);\n    if (!d2) return x2 + \"\";\n    var coefficient = d2[0], exponent2 = d2[1], i = exponent2 - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent2 / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x2, Math.max(0, p + i - 1))[0];\n  }\n  function formatRounded(x2, p) {\n    var d2 = formatDecimalParts(x2, p);\n    if (!d2) return x2 + \"\";\n    var coefficient = d2[0], exponent2 = d2[1];\n    return exponent2 < 0 ? \"0.\" + new Array(-exponent2).join(\"0\") + coefficient : coefficient.length > exponent2 + 1 ? coefficient.slice(0, exponent2 + 1) + \".\" + coefficient.slice(exponent2 + 1) : coefficient + new Array(exponent2 - coefficient.length + 2).join(\"0\");\n  }\n  const formatTypes = {\n    \"%\": function(x2, p) {\n      return (x2 * 100).toFixed(p);\n    },\n    \"b\": function(x2) {\n      return Math.round(x2).toString(2);\n    },\n    \"c\": function(x2) {\n      return x2 + \"\";\n    },\n    \"d\": formatDecimal,\n    \"e\": function(x2, p) {\n      return x2.toExponential(p);\n    },\n    \"f\": function(x2, p) {\n      return x2.toFixed(p);\n    },\n    \"g\": function(x2, p) {\n      return x2.toPrecision(p);\n    },\n    \"o\": function(x2) {\n      return Math.round(x2).toString(8);\n    },\n    \"p\": function(x2, p) {\n      return formatRounded(x2 * 100, p);\n    },\n    \"r\": formatRounded,\n    \"s\": formatPrefixAuto,\n    \"X\": function(x2) {\n      return Math.round(x2).toString(16).toUpperCase();\n    },\n    \"x\": function(x2) {\n      return Math.round(x2).toString(16);\n    }\n  };\n  function identity$3(x2) {\n    return x2;\n  }\n  var map$1 = Array.prototype.map, prefixes = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n  function formatLocale(locale2) {\n    var group2 = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity$3 : formatGroup(map$1.call(locale2.grouping, Number), locale2.thousands + \"\"), currencyPrefix = locale2.currency === void 0 ? \"\" : locale2.currency[0] + \"\", currencySuffix = locale2.currency === void 0 ? \"\" : locale2.currency[1] + \"\", decimal = locale2.decimal + \"\", numerals = locale2.numerals === void 0 ? identity$3 : formatNumerals(map$1.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? \"%\" : locale2.percent + \"\", minus = locale2.minus + \"\", nan = locale2.nan === void 0 ? \"NaN\" : locale2.nan + \"\";\n    function newFormat(specifier) {\n      specifier = formatSpecifier(specifier);\n      var fill2 = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol2 = specifier.symbol, zero2 = specifier.zero, width2 = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type;\n      if (type2 === \"n\") comma = true, type2 = \"g\";\n      else if (!formatTypes[type2]) precision === void 0 && (precision = 12), trim = true, type2 = \"g\";\n      if (zero2 || fill2 === \"0\" && align === \"=\") zero2 = true, fill2 = \"0\", align = \"=\";\n      var prefix = symbol2 === \"$\" ? currencyPrefix : symbol2 === \"#\" && /[boxX]/.test(type2) ? \"0\" + type2.toLowerCase() : \"\", suffix = symbol2 === \"$\" ? currencySuffix : /[%p]/.test(type2) ? percent : \"\";\n      var formatType = formatTypes[type2], maybeSuffix = /[defgprs%]/.test(type2);\n      precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n      function format2(value2) {\n        var valuePrefix = prefix, valueSuffix = suffix, i, n, c2;\n        if (type2 === \"c\") {\n          valueSuffix = formatType(value2) + valueSuffix;\n          value2 = \"\";\n        } else {\n          value2 = +value2;\n          var valueNegative = value2 < 0 || 1 / value2 < 0;\n          value2 = isNaN(value2) ? nan : formatType(Math.abs(value2), precision);\n          if (trim) value2 = formatTrim(value2);\n          if (valueNegative && +value2 === 0 && sign2 !== \"+\") valueNegative = false;\n          valuePrefix = (valueNegative ? sign2 === \"(\" ? sign2 : minus : sign2 === \"-\" || sign2 === \"(\" ? \"\" : sign2) + valuePrefix;\n          valueSuffix = (type2 === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign2 === \"(\" ? \")\" : \"\");\n          if (maybeSuffix) {\n            i = -1, n = value2.length;\n            while (++i < n) {\n              if (c2 = value2.charCodeAt(i), 48 > c2 || c2 > 57) {\n                valueSuffix = (c2 === 46 ? decimal + value2.slice(i + 1) : value2.slice(i)) + valueSuffix;\n                value2 = value2.slice(0, i);\n                break;\n              }\n            }\n          }\n        }\n        if (comma && !zero2) value2 = group2(value2, Infinity);\n        var length2 = valuePrefix.length + value2.length + valueSuffix.length, padding2 = length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) : \"\";\n        if (comma && zero2) value2 = group2(padding2 + value2, padding2.length ? width2 - valueSuffix.length : Infinity), padding2 = \"\";\n        switch (align) {\n          case \"<\":\n            value2 = valuePrefix + value2 + valueSuffix + padding2;\n            break;\n          case \"=\":\n            value2 = valuePrefix + padding2 + value2 + valueSuffix;\n            break;\n          case \"^\":\n            value2 = padding2.slice(0, length2 = padding2.length >> 1) + valuePrefix + value2 + valueSuffix + padding2.slice(length2);\n            break;\n          default:\n            value2 = padding2 + valuePrefix + value2 + valueSuffix;\n            break;\n        }\n        return numerals(value2);\n      }\n      format2.toString = function() {\n        return specifier + \"\";\n      };\n      return format2;\n    }\n    function formatPrefix2(specifier, value2) {\n      var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent(value2) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];\n      return function(value3) {\n        return f(k * value3) + prefix;\n      };\n    }\n    return {\n      format: newFormat,\n      formatPrefix: formatPrefix2\n    };\n  }\n  var locale$1;\n  var format$3;\n  defaultLocale$1({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [3],\n    currency: [\"$\", \"\"],\n    minus: \"-\"\n  });\n  function defaultLocale$1(definition2) {\n    locale$1 = formatLocale(definition2);\n    format$3 = locale$1.format;\n    locale$1.formatPrefix;\n    return locale$1;\n  }\n  var DataScopeId;\n  (function(DataScopeId2) {\n    DataScopeId2[DataScopeId2[\"AllData\"] = 0] = \"AllData\";\n    DataScopeId2[DataScopeId2[\"SelectedData\"] = 1] = \"SelectedData\";\n    DataScopeId2[DataScopeId2[\"FilteredData\"] = 2] = \"FilteredData\";\n  })(DataScopeId || (DataScopeId = {}));\n  function resetSelectedItemIndex(selectedItemIndex) {\n    selectedItemIndex[DataScopeId.AllData] = 0;\n    selectedItemIndex[DataScopeId.FilteredData] = 0;\n    selectedItemIndex[DataScopeId.SelectedData] = 0;\n  }\n  const shortFormat = format$3(\".2~s\");\n  function short(n) {\n    return n === -1 ? \"--\" : n ? n < 1e3 ? n.toString() : shortFormat(n) : \"0\";\n  }\n  function DataScope$1(props) {\n    const dataCount = Object.assign({ all: -1, filtered: -1, selected: -1 }, props.dataCount);\n    return props.compact ? base$1.react.createElement(\n      \"div\",\n      { className: classList(\"sanddance-datascope\", \"compact\"), onClick: props.onCompactClick },\n      base$1.react.createElement(Compact, Object.assign({}, props, { dataScopeId: DataScopeId.AllData, text: strings$1.selectDataSpanAll, count: dataCount.all })),\n      base$1.react.createElement(Compact, Object.assign({}, props, { dataScopeId: DataScopeId.FilteredData, text: strings$1.selectDataSpanFilter, count: dataCount.filtered })),\n      base$1.react.createElement(Compact, Object.assign({}, props, { dataScopeId: DataScopeId.SelectedData, text: strings$1.selectDataSpanSelection, count: dataCount.selected }))\n    ) : base$1.react.createElement(\n      \"div\",\n      { className: classList(\"sanddance-datascope\", \"extended\", props.active && \"active\") },\n      base$1.react.createElement(\n        \"div\",\n        null,\n        base$1.react.createElement(\"div\", null, props.dataSet),\n        base$1.react.createElement(\n          \"div\",\n          { className: \"datascope-buttons\" },\n          base$1.react.createElement(DataScopeButton, Object.assign({}, props, { dataScopeId: DataScopeId.AllData, text: strings$1.selectDataSpanAll, count: dataCount.all })),\n          base$1.react.createElement(DataScopeButton, Object.assign({}, props, { dataScopeId: DataScopeId.FilteredData, text: strings$1.selectDataSpanFilter, count: dataCount.filtered })),\n          base$1.react.createElement(DataScopeButton, Object.assign({}, props, { dataScopeId: DataScopeId.SelectedData, text: strings$1.selectDataSpanSelection, count: dataCount.selected }))\n        )\n      )\n    );\n  }\n  function Compact(props) {\n    return base$1.react.createElement(\"div\", { title: props.text, onClick: () => {\n      props.onDataScopeClick(props.dataScopeId);\n    } }, short(props.count));\n  }\n  function DataScopeButton(props) {\n    return base$1.react.createElement(Button, { themePalette: props.themePalette, className: classList(\"datascope-button\", props.selectedDataScope === props.dataScopeId && \"selected\"), disabled: props.disabled, text: props.text, onClick: () => {\n      props.onDataScopeClick(props.dataScopeId);\n    }, onRenderText: () => {\n      return base$1.react.createElement(\n        \"div\",\n        { title: props.count > 0 ? props.count.toString() : \"\" },\n        base$1.react.createElement(\"label\", null, props.text),\n        base$1.react.createElement(\"div\", null, short(props.count))\n      );\n    }, onRenderIcon: () => null });\n  }\n  function Scrollable(props) {\n    return base$1.react.createElement(\n      \"div\",\n      { className: classList(\"scrollable-container\", props.className), role: props.role },\n      base$1.react.createElement(\"div\", { className: \"scrollable\" }, props.children)\n    );\n  }\n  var SideTabId;\n  (function(SideTabId2) {\n    SideTabId2[SideTabId2[\"ChartType\"] = 0] = \"ChartType\";\n    SideTabId2[SideTabId2[\"Data\"] = 1] = \"Data\";\n    SideTabId2[SideTabId2[\"Search\"] = 2] = \"Search\";\n    SideTabId2[SideTabId2[\"Color\"] = 3] = \"Color\";\n    SideTabId2[SideTabId2[\"Snapshots\"] = 4] = \"Snapshots\";\n    SideTabId2[SideTabId2[\"History\"] = 5] = \"History\";\n    SideTabId2[SideTabId2[\"Transition\"] = 6] = \"Transition\";\n    SideTabId2[SideTabId2[\"Settings\"] = 7] = \"Settings\";\n    SideTabId2[SideTabId2[\"Pin\"] = 8] = \"Pin\";\n    SideTabId2[SideTabId2[\"Collapse\"] = 9] = \"Collapse\";\n  })(SideTabId || (SideTabId = {}));\n  function Sidebutton(props) {\n    const selected = !props.closed && props.selectedSideTab === props.sideTabId;\n    const buttonProps = props.omitAriaSelected ? {} : {\n      \"aria-selected\": selected\n    };\n    return base$1.react.createElement(\n      \"div\",\n      { className: classList(\"vbutton\", selected && \"selected\") },\n      props.badgeText && base$1.react.createElement(\"div\", { className: \"count\" }, props.badgeText),\n      base$1.react.createElement(IconButton$1, Object.assign({}, buttonProps, { role: props.role || \"tab\", themePalette: props.themePalette, className: \"vbutton\", iconName: props.iconName, title: props.title, onClick: () => {\n        props.onSideTabClick(props.sideTabId);\n      } }))\n    );\n  }\n  function Sidebar(props) {\n    const sidebuttons = [\n      {\n        sideTabId: SideTabId.ChartType,\n        iconName: \"BIDashboard\",\n        title: strings$1.labelChart\n      },\n      {\n        sideTabId: SideTabId.Color,\n        iconName: \"Color\",\n        title: strings$1.labelColor\n      },\n      {\n        sideTabId: SideTabId.Data,\n        iconName: \"Table\",\n        title: strings$1.labelDataBrowser\n      },\n      {\n        sideTabId: SideTabId.Search,\n        iconName: \"Search\",\n        title: strings$1.labelSearch\n      },\n      !props.snapshotsHidden && {\n        sideTabId: SideTabId.Snapshots,\n        iconName: \"Camera\",\n        title: strings$1.labelSnapshots\n      },\n      {\n        sideTabId: SideTabId.History,\n        iconName: \"History\",\n        title: strings$1.labelHistory\n      },\n      {\n        sideTabId: SideTabId.Transition,\n        iconName: \"Flow\",\n        title: strings$1.labelTransition\n      },\n      {\n        sideTabId: SideTabId.Settings,\n        iconName: \"Settings\",\n        title: strings$1.labelChartSettings\n      }\n    ].filter(Boolean);\n    return base$1.react.createElement(\n      \"div\",\n      { className: classList(\"sanddance-sidebar\", \"calculator\", props.pinned && \"pinned\", props.closed && \"closed\") },\n      base$1.react.createElement(\n        \"div\",\n        { className: \"sidebar-content\" },\n        base$1.react.createElement(DataScope$1, Object.assign({}, props.dataScopeProps)),\n        base$1.react.createElement(\n          \"div\",\n          { className: \"vbuttons\" },\n          base$1.react.createElement(\"div\", { className: \"sidebar-dialogs\", role: \"tablist\" }, sidebuttons.map((sidebutton, i) => base$1.react.createElement(Sidebutton, Object.assign({ key: i }, props, sidebutton, { themePalette: props.themePalette })))),\n          !props.hideSidebarControls && base$1.react.createElement(\n            \"div\",\n            { className: \"sidebar-controls\" },\n            base$1.react.createElement(Sidebutton, Object.assign({}, props, { omitAriaSelected: true, role: \"button\", sideTabId: SideTabId.Pin, iconName: props.pinned ? \"Pinned\" : \"Pin\", title: props.pinned ? strings$1.buttonToolbarFloat : strings$1.buttonToolbarDock })),\n            base$1.react.createElement(Sidebutton, Object.assign({}, props, { omitAriaSelected: true, role: \"button\", sideTabId: SideTabId.Collapse, iconName: props.closed ? \"DoubleChevronRight12\" : \"DoubleChevronLeft12\", title: props.closed ? strings$1.buttonToolbarShow : strings$1.buttonToolbarHide }))\n          )\n        ),\n        base$1.react.createElement(\n          Scrollable,\n          { role: \"tabpanel\" },\n          base$1.react.createElement(\"div\", { className: \"sidetab\" }, props.children)\n        ),\n        props.calculating && base$1.react.createElement(\n          \"div\",\n          { className: \"calculating\" },\n          base$1.react.createElement(base$1.fluentUI.Spinner, { size: base$1.fluentUI.SpinnerSize.large })\n        )\n      )\n    );\n  }\n  const CommandBarButtonStyles = (props) => {\n    const { theme } = props;\n    if (!theme) {\n      throw new Error(\"Theme is undefined or null.\");\n    }\n    const { palette, semanticColors } = theme;\n    const BUTTON_ICON_CLASSNAME = \".ms-Button-icon\";\n    return {\n      root: [\n        Object.assign({}, base$1.fluentUI.getFocusStyle(theme, { inset: 2 })),\n        {\n          backgroundColor: palette.white\n        }\n      ],\n      rootHovered: {\n        backgroundColor: palette.neutralLighter,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: palette.themeDarkAlt\n          }\n        }\n      },\n      rootPressed: {\n        backgroundColor: palette.neutralLight,\n        color: palette.neutralDark,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: palette.themeDark\n          }\n        }\n      },\n      rootChecked: {\n        backgroundColor: palette.neutralLight,\n        color: palette.neutralDark,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: palette.themeDark\n          }\n        }\n      },\n      rootCheckedHovered: {\n        backgroundColor: palette.neutralQuaternaryAlt,\n        color: palette.neutralDark\n      },\n      rootExpanded: {\n        color: palette.neutralDark,\n        backgroundColor: palette.neutralLight,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: palette.themeDark\n          }\n        }\n      },\n      rootExpandedHovered: {\n        background: palette.neutralQuaternaryAlt\n      },\n      rootDisabled: {\n        backgroundColor: palette.white,\n        selectors: {\n          [BUTTON_ICON_CLASSNAME]: {\n            color: semanticColors.disabledBodySubtext\n          }\n        }\n      },\n      splitButtonMenuButton: {\n        backgroundColor: palette.white,\n        color: palette.neutralSecondary,\n        selectors: {\n          \":hover\": {\n            backgroundColor: palette.neutralLighter,\n            selectors: {\n              [BUTTON_ICON_CLASSNAME]: {\n                color: palette.neutralPrimary\n              }\n            }\n          },\n          \":active\": {\n            backgroundColor: palette.neutralLight,\n            selectors: {\n              [BUTTON_ICON_CLASSNAME]: {\n                color: palette.neutralPrimary\n              }\n            }\n          }\n        }\n      },\n      splitButtonMenuButtonDisabled: {\n        backgroundColor: palette.white\n      },\n      icon: {\n        color: palette.themePrimary\n      }\n    };\n  };\n  const s = `\n ......\n.......\n...\n......\n ......\n    ...\n.......\n......\n`;\n  const d = s.split(\"\\n\").map((row, irow) => row.length ? row.split(\"\").map((char, icol) => char.trim() ? `M${2 * icol + 1} ${2 * (irow - 1) + 1} v1 h1 v-1 Z` : \"\").join(\" \") : \"\").join(\"\\n\");\n  function Logo() {\n    return base$1.react.createElement(\n      \"svg\",\n      { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 16 16\" },\n      base$1.react.createElement(\"path\", { d })\n    );\n  }\n  function Topbar(props) {\n    var _a2;\n    const zeroResults = props.selectionState.selectedData && props.selectionState.selectedData.length === 0;\n    const disabled = !props.loaded;\n    const items = [\n      {\n        key: \"undo\",\n        name: strings$1.buttonUndo,\n        iconProps: {\n          iconName: \"Undo\"\n        },\n        disabled: disabled || props.historyItems.length === 0 || props.historyIndex === 0,\n        onClick: props.undo\n      },\n      {\n        key: \"redo\",\n        name: strings$1.buttonRedo,\n        iconProps: {\n          iconName: \"Redo\"\n        },\n        disabled: disabled || props.historyItems.length <= 1 || props.historyIndex >= props.historyItems.length - 1,\n        onClick: props.redo\n      },\n      {\n        key: \"deselect\",\n        name: strings$1.buttonDeselect,\n        iconProps: {\n          iconName: \"Cancel\"\n        },\n        disabled: disabled || !props.selectionSearch,\n        onClick: props.doDeselect\n      },\n      {\n        key: \"isolate\",\n        name: strings$1.buttonIsolate,\n        iconProps: {\n          iconName: \"Filter\"\n        },\n        disabled: disabled || !props.selectionSearch || zeroResults,\n        onClick: () => props.doFilter(props.selectionSearch, strings$1.labelHistoryFilterIsolate)\n      },\n      {\n        key: \"exclude\",\n        name: strings$1.buttonExclude,\n        iconProps: {\n          iconName: \"ClearFilter\"\n        },\n        disabled: disabled || !props.selectionSearch || zeroResults,\n        onClick: () => props.doFilter(invert$2(props.selectionSearch), strings$1.labelHistoryFilterIExclude)\n      },\n      {\n        key: \"reset\",\n        name: strings$1.buttonReset,\n        iconProps: {\n          iconName: \"RemoveFilter\"\n        },\n        disabled: disabled || !props.filter,\n        onClick: () => props.doUnfilter(strings$1.labelHistoryFilterClear)\n      }\n    ];\n    if (props.buttons) {\n      items.push.apply(items, props.buttons);\n    }\n    if (props.collapseLabels) {\n      items.forEach((item) => item.iconOnly = true);\n    }\n    const farItems = [];\n    if (!props.snapshotsHidden) {\n      farItems.push({\n        key: \"previous-snapshot\",\n        iconProps: {\n          iconName: \"Previous\"\n        },\n        title: strings$1.buttonPrevSnapshot,\n        onClick: props.onSnapshotPreviousClick,\n        disabled: !props.snapshots || props.snapshots.length < 2\n      }, {\n        key: \"snapshot\",\n        iconProps: {\n          iconName: \"Camera\"\n        },\n        title: strings$1.buttonCreateSnapshot,\n        onClick: props.onSnapshotClick,\n        disabled: !props.loaded\n      }, {\n        key: \"next-snapshot\",\n        iconProps: {\n          iconName: \"Next\"\n        },\n        title: strings$1.buttonNextSnapshot,\n        onClick: props.onSnapshotNextClick,\n        disabled: !props.snapshots || props.snapshots.length < 2\n      });\n    }\n    farItems.push({\n      key: \"view\",\n      iconProps: {\n        iconName: props.view === \"2d\" ? \"CubeShape\" : \"Page\"\n      },\n      title: props.view === \"2d\" ? strings$1.labelViewType3d : strings$1.labelViewType2d,\n      onClick: props.onViewClick,\n      disabled: !props.loaded\n    });\n    if ((_a2 = props.iconButtons) === null || _a2 === void 0 ? void 0 : _a2.length) {\n      farItems.push(...props.iconButtons);\n    }\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"sanddance-explorer-topbar\" },\n      base$1.react.createElement(\n        \"div\",\n        { className: \"logo\" },\n        base$1.react.createElement(Logo, null),\n        base$1.react.createElement(\"a\", { href: props.logoClickUrl || \"/\", target: props.logoClickTarget || \"_blank\" }, strings$1.appName)\n      ),\n      base$1.react.createElement(\n        \"div\",\n        { className: \"sanddance-explorer-commandbar\" },\n        base$1.react.createElement(\n          base$1.fluentUI.Customizer,\n          { scopedSettings: {\n            CommandBarButton: {\n              styles: (buttonProps) => {\n                buttonProps.theme.palette = props.themePalette;\n                return CommandBarButtonStyles(buttonProps);\n              }\n            }\n          } },\n          base$1.react.createElement(base$1.fluentUI.CommandBar, { items, farItems, styles: {\n            root: {\n              backgroundColor: \"transparent\",\n              height: \"unset\",\n              paddingLeft: 0,\n              paddingRight: 0\n            }\n          } })\n        )\n      )\n    );\n  }\n  const loadDataFile = (dataFile, columnTypes) => new Promise((resolve2, reject) => {\n    const vega2 = base$3.vega;\n    const loader2 = vega2.loader();\n    function handleRawText(text2) {\n      let data2;\n      try {\n        data2 = vega2.read(text2, { type: dataFile.type, parse: {} });\n      } catch (e) {\n        reject(e);\n      }\n      if (data2) {\n        loadDataArray(data2, dataFile.type, columnTypes).then((dc) => {\n          if (dataFile.snapshotsUrl) {\n            fetch(dataFile.snapshotsUrl).then((response) => response.json()).then((snapshots) => {\n              dc.snapshots = snapshots;\n              resolve2(dc);\n            }).catch(reject);\n          } else if (dataFile.snapshots) {\n            dc.snapshots = dataFile.snapshots;\n            resolve2(dc);\n          } else {\n            resolve2(dc);\n          }\n        }).catch(reject);\n      }\n    }\n    if (dataFile.dataUrl) {\n      loader2.load(dataFile.dataUrl).then(handleRawText).catch(reject);\n    } else if (dataFile.rawText) {\n      handleRawText(dataFile.rawText);\n    } else {\n      reject(\"dataFile object must have either dataUrl or rawText property set.\");\n    }\n  });\n  const loadDataArray = (data2, type2, columnTypes) => new Promise((resolve2, reject) => {\n    const parse2 = type2 === \"csv\" || type2 === \"tsv\";\n    if (parse2) {\n      data2.forEach((row) => {\n        for (const column in row) {\n          if (row[column] === \"\") {\n            row[column] = null;\n          }\n        }\n      });\n    }\n    const columns = getColumnsFromData(base$3.vega.inferTypes, data2, columnTypes).filter((c2) => c2.name && c2.name.trim()).sort((a2, b2) => a2.name.localeCompare(b2.name));\n    if (parse2) {\n      const booleanColumns = columns.filter((c2) => c2.type === \"boolean\");\n      const dateColumns = columns.filter((c2) => c2.type === \"date\");\n      const numericColumns = columns.filter((c2) => c2.type === \"integer\" || c2.type === \"number\");\n      data2.forEach((obj2) => {\n        booleanColumns.forEach((c2) => {\n          obj2[c2.name] = (\"\" + obj2[c2.name]).toLowerCase() === \"true\";\n        });\n        dateColumns.forEach((c2) => {\n          const input = obj2[c2.name];\n          if (input !== null) {\n            const d2 = new Date(input);\n            d2.input = input;\n            obj2[c2.name] = d2;\n          }\n        });\n        numericColumns.forEach((c2) => {\n          const n = parseFloat(obj2[c2.name]);\n          obj2[c2.name] = isNaN(n) ? null : n;\n        });\n      });\n    }\n    resolve2({ data: data2, columns });\n  });\n  var util$1 = util$4;\n  const themePalettes = {};\n  themePalettes[\"\"] = {\n    themePrimary: \"#0078d4\",\n    themeLighterAlt: \"#eff6fc\",\n    themeLighter: \"#deecf9\",\n    themeLight: \"#c7e0f4\",\n    themeTertiary: \"#71afe5\",\n    themeSecondary: \"#2b88d8\",\n    themeDarkAlt: \"#106ebe\",\n    themeDark: \"#005a9e\",\n    themeDarker: \"#004578\",\n    neutralLighterAlt: \"#faf9f8\",\n    neutralLighter: \"#f3f2f1\",\n    neutralLight: \"#edebe9\",\n    neutralQuaternaryAlt: \"#e1dfdd\",\n    neutralQuaternary: \"#d0d0d0\",\n    neutralTertiaryAlt: \"#c8c6c4\",\n    neutralTertiary: \"#595959\",\n    neutralSecondary: \"#373737\",\n    neutralSecondaryAlt: \"#373737\",\n    neutralPrimaryAlt: \"#2f2f2f\",\n    neutralPrimary: \"#000000\",\n    neutralDark: \"#151515\",\n    black: \"#0b0b0b\",\n    white: \"#ffffff\"\n  };\n  themePalettes[\"dark-theme\"] = {\n    themePrimary: \"#0078d4\",\n    themeLighterAlt: \"#eff6fc\",\n    themeLighter: \"#deecf9\",\n    themeLight: \"#c7e0f4\",\n    themeTertiary: \"#71afe5\",\n    themeSecondary: \"#2b88d8\",\n    themeDarkAlt: \"#106ebe\",\n    themeDark: \"#005a9e\",\n    themeDarker: \"#004578\",\n    neutralLighterAlt: \"#0b0b0b\",\n    neutralLighter: \"#151515\",\n    neutralLight: \"#252525\",\n    neutralQuaternaryAlt: \"#2f2f2f\",\n    neutralQuaternary: \"#373737\",\n    neutralTertiaryAlt: \"#595959\",\n    neutralTertiary: \"#c8c8c8\",\n    neutralSecondary: \"#d0d0d0\",\n    neutralSecondaryAlt: \"#d0d0d0\",\n    neutralPrimaryAlt: \"#dadada\",\n    neutralPrimary: \"#ffffff\",\n    neutralDark: \"#f4f4f4\",\n    black: \"#f8f8f8\",\n    white: \"#000000\"\n  };\n  function getColorSettingsFromThemePalette(themePalette) {\n    const c2 = util$1.colorFromString(themePalette.themeSecondary);\n    c2[3] = 256 / 3;\n    return {\n      axisLine: themePalette.black,\n      axisText: themePalette.black,\n      gridLine: themePalette.neutralLight,\n      backgroundColor: themePalette.white,\n      hoveredCube: themePalette.black,\n      clickableText: themePalette.themeDark,\n      clickableTextHighlight: util$1.colorToString(c2),\n      searchText: themePalette.neutralPrimary,\n      searchTextHighlight: themePalette.neutralPrimaryAlt\n    };\n  }\n  const fontFamily$1 = \"Segoe UI, sans-serif\";\n  const defaultViewerOptions = {\n    colors: getColorSettingsFromThemePalette(themePalettes[\"\"]),\n    fontFamily: fontFamily$1\n  };\n  const snapshotThumbWidth = 300;\n  const defaultRenderer = {\n    advanced: false,\n    advancedOptions: {\n      bloomIntensity: 2,\n      isBloomEnabled: false,\n      isDofEnabled: false,\n      dofFocusRange: 0.25,\n      isFxaaEnabled: false,\n      isShadowEnabled: true,\n      isSsaoEnabled: true\n    },\n    basicOptions: {\n      antialias: true\n    }\n  };\n  function initialExplorerState(props) {\n    const renderer = props.initialRenderer || defaultRenderer;\n    if (!renderer.advancedOptions) {\n      renderer.advancedOptions = defaultRenderer.advancedOptions;\n    }\n    if (!renderer.basicOptions) {\n      renderer.basicOptions = defaultRenderer.basicOptions;\n    }\n    const state = {\n      calculating: null,\n      errors: null,\n      autoCompleteDistinctValues: {},\n      colorBin: null,\n      dataContent: null,\n      dataFile: null,\n      search: null,\n      totalStyle: null,\n      facetStyle: \"wrap\",\n      filter: null,\n      filteredData: null,\n      specCapabilities: null,\n      size: {\n        height: null,\n        width: null\n      },\n      scheme: null,\n      transform: null,\n      columns: null,\n      chart: \"grid\",\n      signalValues: null,\n      hideAxes: false,\n      hideLegend: false,\n      sideTabId: SideTabId.ChartType,\n      dataScopeId: DataScopeId.AllData,\n      selectedItemIndex: {},\n      sidebarClosed: props.initialSidebarClosed === void 0 ? false : props.initialSidebarClosed,\n      sidebarPinned: props.initialSidebarPinned === void 0 ? true : props.initialSidebarPinned,\n      view: props.initialView || \"2d\",\n      snapshots: [],\n      selectedSnapshotIndex: -1,\n      tooltipExclusions: [],\n      positionedColumnMapProps: null,\n      note: null,\n      historyIndex: -1,\n      historyItems: [],\n      renderer,\n      transitionType: \"ordinal\",\n      transitionDimension: \"x\",\n      transitionDurations: clone(defaultPresenterConfig.transitionDurations)\n    };\n    resetSelectedItemIndex(state.selectedItemIndex);\n    return state;\n  }\n  function schemeOption(selected, scheme2) {\n    return {\n      key: scheme2,\n      text: scheme2,\n      selected: selected === scheme2,\n      scheme: scheme2,\n      children: schemesJSX[scheme2]\n    };\n  }\n  function schemeHeader(key2, text2) {\n    return {\n      key: key2,\n      text: text2,\n      itemType: base$1.fluentUI.DropdownMenuItemType.Header\n    };\n  }\n  const schemesJSX = {};\n  const p8 = `${100 / 8}%`;\n  const p9 = `${100 / 9}%`;\n  const p10 = `${100 / 10}%`;\n  const p12 = `${100 / 12}%`;\n  const p20 = `${100 / 20}%`;\n  let loaded$5 = false;\n  function load$7() {\n    schemesJSX[\"accent\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#7fc97f\", style: { width: p8, background: \"rgb(127, 201, 127)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#beaed4\", style: { width: p8, background: \"rgb(190, 174, 212)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdc086\", style: { width: p8, background: \"rgb(253, 192, 134)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffff99\", style: { width: p8, background: \"rgb(255, 255, 153)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#386cb0\", style: { width: p8, background: \"rgb(56, 108, 176)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f0027f\", style: { width: p8, background: \"rgb(240, 2, 127)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bf5b17\", style: { width: p8, background: \"rgb(191, 91, 23)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#666666\", style: { width: p8, background: \"rgb(102, 102, 102)\" } })\n    );\n    schemesJSX[\"category10\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#1f77b4\", style: { width: p10, background: \"rgb(31, 119, 180)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff7f0e\", style: { width: p10, background: \"rgb(255, 127, 14)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#2ca02c\", style: { width: p10, background: \"rgb(44, 160, 44)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d62728\", style: { width: p10, background: \"rgb(214, 39, 40)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9467bd\", style: { width: p10, background: \"rgb(148, 103, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8c564b\", style: { width: p10, background: \"rgb(140, 86, 75)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e377c2\", style: { width: p10, background: \"rgb(227, 119, 194)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#7f7f7f\", style: { width: p10, background: \"rgb(127, 127, 127)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bcbd22\", style: { width: p10, background: \"rgb(188, 189, 34)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#17becf\", style: { width: p10, background: \"rgb(23, 190, 207)\" } })\n    );\n    schemesJSX[\"category20\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#1f77b4\", style: { width: p20, background: \"rgb(31, 119, 180)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#aec7e8\", style: { width: p20, background: \"rgb(174, 199, 232)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff7f0e\", style: { width: p20, background: \"rgb(255, 127, 14)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffbb78\", style: { width: p20, background: \"rgb(255, 187, 120)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#2ca02c\", style: { width: p20, background: \"rgb(44, 160, 44)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#98df8a\", style: { width: p20, background: \"rgb(152, 223, 138)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d62728\", style: { width: p20, background: \"rgb(214, 39, 40)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff9896\", style: { width: p20, background: \"rgb(255, 152, 150)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9467bd\", style: { width: p20, background: \"rgb(148, 103, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c5b0d5\", style: { width: p20, background: \"rgb(197, 176, 213)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8c564b\", style: { width: p20, background: \"rgb(140, 86, 75)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c49c94\", style: { width: p20, background: \"rgb(196, 156, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e377c2\", style: { width: p20, background: \"rgb(227, 119, 194)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f7b6d2\", style: { width: p20, background: \"rgb(247, 182, 210)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#7f7f7f\", style: { width: p20, background: \"rgb(127, 127, 127)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c7c7c7\", style: { width: p20, background: \"rgb(199, 199, 199)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bcbd22\", style: { width: p20, background: \"rgb(188, 189, 34)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#dbdb8d\", style: { width: p20, background: \"rgb(219, 219, 141)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#17becf\", style: { width: p20, background: \"rgb(23, 190, 207)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9edae5\", style: { width: p20, background: \"rgb(158, 218, 229)\" } })\n    );\n    schemesJSX[\"category20b\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#393b79\", style: { width: p20, background: \"rgb(57, 59, 121)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#5254a3\", style: { width: p20, background: \"rgb(82, 84, 163)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#6b6ecf\", style: { width: p20, background: \"rgb(107, 110, 207)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9c9ede\", style: { width: p20, background: \"rgb(156, 158, 222)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#637939\", style: { width: p20, background: \"rgb(99, 121, 57)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8ca252\", style: { width: p20, background: \"rgb(140, 162, 82)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b5cf6b\", style: { width: p20, background: \"rgb(181, 207, 107)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#cedb9c\", style: { width: p20, background: \"rgb(206, 219, 156)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8c6d31\", style: { width: p20, background: \"rgb(140, 109, 49)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bd9e39\", style: { width: p20, background: \"rgb(189, 158, 57)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e7ba52\", style: { width: p20, background: \"rgb(231, 186, 82)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e7cb94\", style: { width: p20, background: \"rgb(231, 203, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#843c39\", style: { width: p20, background: \"rgb(132, 60, 57)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ad494a\", style: { width: p20, background: \"rgb(173, 73, 74)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d6616b\", style: { width: p20, background: \"rgb(214, 97, 107)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e7969c\", style: { width: p20, background: \"rgb(231, 150, 156)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#7b4173\", style: { width: p20, background: \"rgb(123, 65, 115)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a55194\", style: { width: p20, background: \"rgb(165, 81, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ce6dbd\", style: { width: p20, background: \"rgb(206, 109, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#de9ed6\", style: { width: p20, background: \"rgb(222, 158, 214)\" } })\n    );\n    schemesJSX[\"category20c\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#3182bd\", style: { width: p20, background: \"rgb(49, 130, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#6baed6\", style: { width: p20, background: \"rgb(107, 174, 214)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9ecae1\", style: { width: p20, background: \"rgb(158, 202, 225)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c6dbef\", style: { width: p20, background: \"rgb(198, 219, 239)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e6550d\", style: { width: p20, background: \"rgb(230, 85, 13)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fd8d3c\", style: { width: p20, background: \"rgb(253, 141, 60)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdae6b\", style: { width: p20, background: \"rgb(253, 174, 107)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdd0a2\", style: { width: p20, background: \"rgb(253, 208, 162)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#31a354\", style: { width: p20, background: \"rgb(49, 163, 84)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#74c476\", style: { width: p20, background: \"rgb(116, 196, 118)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a1d99b\", style: { width: p20, background: \"rgb(161, 217, 155)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#c7e9c0\", style: { width: p20, background: \"rgb(199, 233, 192)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#756bb1\", style: { width: p20, background: \"rgb(117, 107, 177)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9e9ac8\", style: { width: p20, background: \"rgb(158, 154, 200)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bcbddc\", style: { width: p20, background: \"rgb(188, 189, 220)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#dadaeb\", style: { width: p20, background: \"rgb(218, 218, 235)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#636363\", style: { width: p20, background: \"rgb(99, 99, 99)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#969696\", style: { width: p20, background: \"rgb(150, 150, 150)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bdbdbd\", style: { width: p20, background: \"rgb(189, 189, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d9d9d9\", style: { width: p20, background: \"rgb(217, 217, 217)\" } })\n    );\n    schemesJSX[\"dark2\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#1b9e77\", style: { width: p8, background: \"rgb(27, 158, 119)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d95f02\", style: { width: p8, background: \"rgb(217, 95, 2)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#7570b3\", style: { width: p8, background: \"rgb(117, 112, 179)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e7298a\", style: { width: p8, background: \"rgb(231, 41, 138)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#66a61e\", style: { width: p8, background: \"rgb(102, 166, 30)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e6ab02\", style: { width: p8, background: \"rgb(230, 171, 2)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a6761d\", style: { width: p8, background: \"rgb(166, 118, 29)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#666666\", style: { width: p8, background: \"rgb(102, 102, 102)\" } })\n    );\n    schemesJSX[\"paired\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#a6cee3\", style: { width: p12, background: \"rgb(166, 206, 227)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#1f78b4\", style: { width: p12, background: \"rgb(31, 120, 180)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b2df8a\", style: { width: p12, background: \"rgb(178, 223, 138)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#33a02c\", style: { width: p12, background: \"rgb(51, 160, 44)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fb9a99\", style: { width: p12, background: \"rgb(251, 154, 153)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e31a1c\", style: { width: p12, background: \"rgb(227, 26, 28)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdbf6f\", style: { width: p12, background: \"rgb(253, 191, 111)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff7f00\", style: { width: p12, background: \"rgb(255, 127, 0)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#cab2d6\", style: { width: p12, background: \"rgb(202, 178, 214)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#6a3d9a\", style: { width: p12, background: \"rgb(106, 61, 154)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffff99\", style: { width: p12, background: \"rgb(255, 255, 153)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b15928\", style: { width: p12, background: \"rgb(177, 89, 40)\" } })\n    );\n    schemesJSX[\"pastel1\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#fbb4ae\", style: { width: p9, background: \"rgb(251, 180, 174)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b3cde3\", style: { width: p9, background: \"rgb(179, 205, 227)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ccebc5\", style: { width: p9, background: \"rgb(204, 235, 197)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#decbe4\", style: { width: p9, background: \"rgb(222, 203, 228)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fed9a6\", style: { width: p9, background: \"rgb(254, 217, 166)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffffcc\", style: { width: p9, background: \"rgb(255, 255, 204)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e5d8bd\", style: { width: p9, background: \"rgb(229, 216, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fddaec\", style: { width: p9, background: \"rgb(253, 218, 236)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f2f2f2\", style: { width: p9, background: \"rgb(242, 242, 242)\" } })\n    );\n    schemesJSX[\"pastel2\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#b3e2cd\", style: { width: p8, background: \"rgb(179, 226, 205)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdcdac\", style: { width: p8, background: \"rgb(253, 205, 172)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#cbd5e8\", style: { width: p8, background: \"rgb(203, 213, 232)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f4cae4\", style: { width: p8, background: \"rgb(244, 202, 228)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e6f5c9\", style: { width: p8, background: \"rgb(230, 245, 201)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fff2ae\", style: { width: p8, background: \"rgb(255, 242, 174)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f1e2cc\", style: { width: p8, background: \"rgb(241, 226, 204)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#cccccc\", style: { width: p8, background: \"rgb(204, 204, 204)\" } })\n    );\n    schemesJSX[\"set1\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#e41a1c\", style: { width: p9, background: \"rgb(228, 26, 28)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#377eb8\", style: { width: p9, background: \"rgb(55, 126, 184)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#4daf4a\", style: { width: p9, background: \"rgb(77, 175, 74)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#984ea3\", style: { width: p9, background: \"rgb(152, 78, 163)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff7f00\", style: { width: p9, background: \"rgb(255, 127, 0)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffff33\", style: { width: p9, background: \"rgb(255, 255, 51)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a65628\", style: { width: p9, background: \"rgb(166, 86, 40)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f781bf\", style: { width: p9, background: \"rgb(247, 129, 191)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#999999\", style: { width: p9, background: \"rgb(153, 153, 153)\" } })\n    );\n    schemesJSX[\"set2\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#66c2a5\", style: { width: p8, background: \"rgb(102, 194, 165)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fc8d62\", style: { width: p8, background: \"rgb(252, 141, 98)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#8da0cb\", style: { width: p8, background: \"rgb(141, 160, 203)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e78ac3\", style: { width: p8, background: \"rgb(231, 138, 195)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#a6d854\", style: { width: p8, background: \"rgb(166, 216, 84)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffd92f\", style: { width: p8, background: \"rgb(255, 217, 47)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e5c494\", style: { width: p8, background: \"rgb(229, 196, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b3b3b3\", style: { width: p8, background: \"rgb(179, 179, 179)\" } })\n    );\n    schemesJSX[\"set3\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#8dd3c7\", style: { width: p12, background: \"rgb(141, 211, 199)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffffb3\", style: { width: p12, background: \"rgb(255, 255, 179)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bebada\", style: { width: p12, background: \"rgb(190, 186, 218)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fb8072\", style: { width: p12, background: \"rgb(251, 128, 114)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#80b1d3\", style: { width: p12, background: \"rgb(128, 177, 211)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fdb462\", style: { width: p12, background: \"rgb(253, 180, 98)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b3de69\", style: { width: p12, background: \"rgb(179, 222, 105)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fccde5\", style: { width: p12, background: \"rgb(252, 205, 229)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d9d9d9\", style: { width: p12, background: \"rgb(217, 217, 217)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bc80bd\", style: { width: p12, background: \"rgb(188, 128, 189)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ccebc5\", style: { width: p12, background: \"rgb(204, 235, 197)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffed6f\", style: { width: p12, background: \"rgb(255, 237, 111)\" } })\n    );\n    schemesJSX[\"tableau10\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#4c78a8\", style: { width: p10, background: \"rgb(76, 120, 168)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f58518\", style: { width: p10, background: \"rgb(245, 133, 24)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e45756\", style: { width: p10, background: \"rgb(228, 87, 86)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#72b7b2\", style: { width: p10, background: \"rgb(114, 183, 178)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#54a24b\", style: { width: p10, background: \"rgb(84, 162, 75)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#eeca3b\", style: { width: p10, background: \"rgb(238, 202, 59)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b279a2\", style: { width: p10, background: \"rgb(178, 121, 162)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff9da6\", style: { width: p10, background: \"rgb(255, 157, 166)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9d755d\", style: { width: p10, background: \"rgb(157, 117, 93)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bab0ac\", style: { width: p10, background: \"rgb(186, 176, 172)\" } })\n    );\n    schemesJSX[\"tableau20\"] = base$1.react.createElement(\n      \"div\",\n      { className: \"swatch\" },\n      base$1.react.createElement(\"div\", { title: \"#4c78a8\", style: { width: p20, background: \"rgb(76, 120, 168)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9ecae9\", style: { width: p20, background: \"rgb(158, 202, 233)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f58518\", style: { width: p20, background: \"rgb(245, 133, 24)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ffbf79\", style: { width: p20, background: \"rgb(255, 191, 121)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#54a24b\", style: { width: p20, background: \"rgb(84, 162, 75)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#88d27a\", style: { width: p20, background: \"rgb(136, 210, 122)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b79a20\", style: { width: p20, background: \"rgb(183, 154, 32)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#f2cf5b\", style: { width: p20, background: \"rgb(242, 207, 91)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#439894\", style: { width: p20, background: \"rgb(67, 152, 148)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#83bcb6\", style: { width: p20, background: \"rgb(131, 188, 182)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#e45756\", style: { width: p20, background: \"rgb(228, 87, 86)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#ff9d98\", style: { width: p20, background: \"rgb(255, 157, 152)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#79706e\", style: { width: p20, background: \"rgb(121, 112, 110)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#bab0ac\", style: { width: p20, background: \"rgb(186, 176, 172)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d67195\", style: { width: p20, background: \"rgb(214, 113, 149)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#fcbfd2\", style: { width: p20, background: \"rgb(252, 191, 210)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#b279a2\", style: { width: p20, background: \"rgb(178, 121, 162)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d6a5c9\", style: { width: p20, background: \"rgb(214, 165, 201)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#9e765f\", style: { width: p20, background: \"rgb(158, 118, 95)\" } }),\n      base$1.react.createElement(\"div\", { title: \"#d8b5a5\", style: { width: p20, background: \"rgb(216, 181, 165)\" } })\n    );\n    loaded$5 = true;\n  }\n  function categorical(selected) {\n    if (!loaded$5)\n      load$7();\n    return [\n      schemeOption(selected, \"accent\"),\n      schemeOption(selected, \"category10\"),\n      schemeOption(selected, \"category20\"),\n      schemeOption(selected, \"category20b\"),\n      schemeOption(selected, \"category20c\"),\n      schemeOption(selected, \"dark2\"),\n      schemeOption(selected, \"paired\"),\n      schemeOption(selected, \"pastel1\"),\n      schemeOption(selected, \"pastel2\"),\n      schemeOption(selected, \"set1\"),\n      schemeOption(selected, \"set2\"),\n      schemeOption(selected, \"set3\"),\n      schemeOption(selected, \"tableau10\"),\n      schemeOption(selected, \"tableau20\")\n    ];\n  }\n  let loaded$4 = false;\n  function load$6() {\n    schemesJSX[\"rainbow\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-rainbow\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#6e40aa\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#bf3caf\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#fe4b83\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#ff7847\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#e2b72f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#aff05b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#52f667\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#1ddfa3\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#23abd8\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#4c6edb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#6e40aa\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-rainbow)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"sinebow\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-sinebow\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#ff4040\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#e78d0b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#a7d503\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#58fc2a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#18f472\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#00bfbf\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#1872f4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#582afc\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#a703d5\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#e70b8d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ff4040\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-sinebow)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    loaded$4 = true;\n  }\n  function cyclical(selected) {\n    if (!loaded$4)\n      load$6();\n    return [\n      schemeOption(selected, \"rainbow\"),\n      schemeOption(selected, \"sinebow\")\n    ];\n  }\n  let loaded$3 = false;\n  function load$5() {\n    schemesJSX[\"blueorange\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-blueorange\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(5, 48, 97)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(34, 101, 163)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(75, 148, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(143, 194, 221)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(205, 227, 238)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(242, 240, 235)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(253, 221, 179)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(248, 182, 100)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(221, 132, 31)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(178, 90, 9)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(127, 59, 8)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-blueorange)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"brownbluegreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-brownbluegreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(84, 48, 5)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(139, 84, 15)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(188, 132, 53)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(222, 190, 123)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(242, 228, 192)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(238, 241, 234)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(195, 231, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(127, 201, 191)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(57, 152, 143)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(10, 103, 95)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 60, 48)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-brownbluegreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purplegreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purplegreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(64, 0, 75)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(115, 47, 128)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(154, 109, 170)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(193, 164, 205)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(228, 210, 230)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(239, 240, 239)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(214, 238, 209)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(162, 215, 158)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(92, 173, 101)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(33, 120, 57)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 68, 27)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purplegreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"pinkyellowgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-pinkyellowgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(142, 1, 82)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(192, 38, 126)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(221, 114, 173)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(240, 179, 214)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(250, 221, 237)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(245, 243, 239)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(225, 242, 202)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(182, 222, 135)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(128, 187, 71)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(79, 145, 37)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(39, 100, 25)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-pinkyellowgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purpleorange\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purpleorange\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(45, 0, 75)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(85, 45, 132)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(129, 112, 172)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(176, 170, 208)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(215, 215, 233)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(243, 238, 234)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(253, 221, 179)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(248, 182, 100)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(221, 132, 31)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(178, 90, 9)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(127, 59, 8)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purpleorange)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(103, 0, 31)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(172, 32, 47)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(213, 96, 80)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(241, 163, 133)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(251, 215, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(242, 239, 238)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(205, 227, 238)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(143, 194, 221)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(75, 148, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(34, 101, 163)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(5, 48, 97)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redgrey\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redgrey\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(103, 0, 31)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(172, 32, 47)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(213, 96, 80)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(241, 163, 133)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(252, 216, 197)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(250, 244, 241)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(223, 223, 223)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(184, 184, 184)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(134, 134, 134)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(78, 78, 78)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(26, 26, 26)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redgrey)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redyellowblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redyellowblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(165, 0, 38)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(212, 50, 44)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(241, 110, 67)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(252, 172, 100)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 221, 144)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(250, 248, 193)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(220, 241, 236)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(171, 214, 232)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(117, 171, 208)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(74, 116, 180)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(49, 54, 149)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redyellowblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redyellowgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redyellowgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(165, 0, 38)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(212, 50, 44)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(241, 110, 67)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(252, 172, 99)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 221, 141)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(249, 247, 174)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(215, 238, 142)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(164, 216, 110)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(100, 188, 97)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(34, 150, 79)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 104, 55)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redyellowgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"spectral\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-spectral\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(158, 1, 66)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(209, 60, 75)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(240, 112, 74)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(252, 172, 99)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 221, 141)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(251, 248, 176)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(224, 243, 161)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(169, 221, 162)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(105, 189, 169)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(66, 136, 181)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(94, 79, 162)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-spectral)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    loaded$3 = true;\n  }\n  function diverging(selected) {\n    if (!loaded$3)\n      load$5();\n    return [\n      schemeOption(selected, \"blueorange\"),\n      schemeOption(selected, \"brownbluegreen\"),\n      schemeOption(selected, \"purplegreen\"),\n      schemeOption(selected, \"pinkyellowgreen\"),\n      schemeOption(selected, \"purpleorange\"),\n      schemeOption(selected, \"redblue\"),\n      schemeOption(selected, \"redgrey\"),\n      schemeOption(selected, \"redyellowblue\"),\n      schemeOption(selected, \"redyellowgreen\"),\n      schemeOption(selected, \"spectral\")\n    ];\n  }\n  let loaded$2 = false;\n  function load$4() {\n    colorSchemes.filter((cs) => cs.colors.length === 2).map((binaryScheme, i) => {\n      schemesJSX[binaryScheme.scheme] = base$1.react.createElement(\"div\", { className: \"swatch\" }, binaryScheme.colors.map((color2, j) => base$1.react.createElement(\"div\", { key: j, title: color2, style: { width: \"50%\", backgroundColor: color2 } })));\n    });\n    loaded$2 = true;\n  }\n  function dual(selected) {\n    if (!loaded$2)\n      load$4();\n    return colorSchemes.filter((cs) => cs.colors.length === 2).map((binaryScheme, i) => schemeOption(selected, binaryScheme.scheme));\n  }\n  let loaded$1 = false;\n  function load$3() {\n    schemesJSX[\"viridis\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-viridis\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#440154\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#482475\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#414487\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#355f8d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#2a788e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#21918c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#22a884\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#44bf70\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#7ad151\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#bddf26\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#fde725\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-viridis)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"inferno\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-inferno\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#000004\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#160b39\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#420a68\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#6a176e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#932667\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#bc3754\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#dd513a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f37819\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#fca50a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#f6d746\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#fcffa4\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-inferno)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"magma\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-magma\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#000004\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#140e36\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#3b0f70\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#641a80\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#8c2981\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#b73779\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#de4968\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f7705c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#fe9f6d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#fecf92\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#fcfdbf\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-magma)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"plasma\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-plasma\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#0d0887\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#41049d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#6a00a8\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#8f0da4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#b12a90\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#cc4778\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#e16462\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f2844b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#fca636\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#fcce25\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#f0f921\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-plasma)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"cividis\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-cividis\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#002051\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#0a326a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#2b446e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#4d566d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#696970\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#7f7c75\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#948f78\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#ada476\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#caba6a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#ead156\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#fdea45\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-cividis)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"turbo\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-turbo\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#23171b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#4a58dd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#2f9df5\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#27d7c4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#4df884\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#95fb51\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#dedd32\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#ffa423\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#f65f18\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#ba2208\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#900c00\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-turbo)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"bluegreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-bluegreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 252, 253)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(232, 246, 249)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(213, 239, 237)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(183, 228, 218)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(143, 211, 193)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(104, 194, 163)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(73, 177, 127)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(47, 153, 89)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(21, 127, 60)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(3, 100, 41)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 68, 27)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-bluegreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"bluepurple\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-bluepurple\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 252, 253)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(228, 238, 245)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(204, 221, 236)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(178, 202, 225)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(156, 179, 213)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(143, 149, 198)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(140, 116, 181)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(137, 82, 165)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(133, 45, 143)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(115, 15, 113)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(77, 0, 75)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-bluepurple)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"goldgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-goldgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#f4d166\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#d5ca60\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#b6c35c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#98bb59\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#7cb257\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#60a656\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#4b9c53\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#3f8f4f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#33834a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#257740\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#146c36\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-goldgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"goldorange\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-goldorange\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#f4d166\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#f8be5c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#f8aa4c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#f5983b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#f3852a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#ef701b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#e2621f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#d65322\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#c54923\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#b14223\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#9e3a26\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-goldorange)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"goldred\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-goldred\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#f4d166\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#f6be59\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#f9aa51\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#fc964e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#f6834b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#ee734a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#e56249\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#db5247\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#cf4244\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#c43141\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#b71d3e\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-goldred)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"greenblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-greenblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 252, 240)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(229, 245, 223)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(211, 238, 206)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(189, 229, 191)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(158, 217, 187)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(123, 203, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(88, 183, 205)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(57, 156, 198)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(29, 126, 183)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(11, 96, 161)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(8, 64, 129)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-greenblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"orangered\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-orangered\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 247, 236)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(254, 235, 207)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(253, 220, 175)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(253, 202, 148)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(253, 176, 122)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(250, 142, 93)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(241, 108, 73)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(224, 69, 48)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(200, 29, 19)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(167, 4, 3)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(127, 0, 0)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-orangered)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purplebluegreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purplebluegreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 247, 251)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(239, 231, 242)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(219, 216, 234)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(190, 201, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(152, 185, 217)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(105, 168, 207)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(64, 150, 192)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(25, 135, 159)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(3, 120, 119)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(1, 99, 83)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(1, 70, 54)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purplebluegreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purpleblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purpleblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 247, 251)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(239, 234, 244)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(219, 218, 235)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(191, 201, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(155, 185, 217)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(114, 168, 207)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(67, 148, 195)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(26, 125, 182)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(6, 103, 161)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(4, 82, 129)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(2, 56, 88)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purpleblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purplered\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purplered\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 244, 249)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(234, 227, 240)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(220, 201, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(208, 170, 210)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(208, 138, 194)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(221, 99, 174)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(227, 56, 144)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(215, 28, 108)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(183, 11, 79)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(143, 2, 58)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(103, 0, 31)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purplered)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"redpurple\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-redpurple\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 247, 243)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(253, 228, 225)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(252, 207, 204)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(251, 181, 188)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(249, 147, 176)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(243, 105, 163)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(224, 62, 152)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(192, 23, 136)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(153, 3, 124)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(112, 1, 116)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(73, 0, 106)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-redpurple)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"yellowgreenblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-yellowgreenblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 217)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(239, 249, 189)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(213, 238, 179)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(169, 221, 183)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(115, 201, 189)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(69, 180, 194)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(40, 151, 191)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(32, 115, 178)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(35, 78, 160)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(28, 49, 133)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(8, 29, 88)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-yellowgreenblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"yellowgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-yellowgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 229)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(247, 252, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(228, 244, 172)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(199, 232, 155)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(162, 216, 138)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(120, 197, 120)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(78, 175, 99)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(47, 148, 78)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(21, 121, 63)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(3, 96, 52)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 69, 41)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-yellowgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"yelloworangebrown\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-yelloworangebrown\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 229)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(255, 248, 196)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(254, 234, 161)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(254, 214, 118)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 186, 74)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(251, 153, 44)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(238, 121, 24)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(216, 91, 10)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(183, 67, 4)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(143, 50, 4)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(102, 37, 6)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-yelloworangebrown)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"yelloworangered\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-yelloworangered\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 204)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(255, 240, 169)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(254, 224, 135)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(254, 201, 101)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(254, 171, 75)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(253, 137, 60)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(250, 92, 46)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(236, 48, 35)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(211, 17, 33)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(175, 2, 37)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(128, 0, 38)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-yelloworangered)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#323232\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#2e4463\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#1e588a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#086da7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#0082b9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#039ac7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#12b1d4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#2bc8e2\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#3ddff0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#61f4fb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffffff\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkgold\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkgold\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#3c3c3c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#554a38\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#6d5a35\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#846f32\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#a0832d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#bf9828\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#dbb022\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f0cb23\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#fae241\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#fff290\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffffff\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkgold)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkgreen\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkgreen\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#3a3a3a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#245447\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#076a4c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#038145\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#2d9642\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#5fa941\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#89bb3f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#b3cb3b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#dbdc34\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#ffed39\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffffaa\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkgreen)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkmulti\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkmulti\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#373737\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#294767\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#1e5b88\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#1a748b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#1f8e7e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#29a869\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#6abf50\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#aad332\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#eae30d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#fff166\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffffff\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkmulti)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"darkred\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-darkred\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#343434\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#643633\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#8c3a36\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#b03e38\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#d14632\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#e75d1e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#eb7e20\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#ed9c25\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#efb92d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#f3d431\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ffeb2c\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-darkred)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lightgreyred\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lightgreyred\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#efe9e6\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#e2dcd9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#d7cecb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#ccc1be\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#c0b4af\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#c4a293\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#d38b66\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#de7336\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#e15917\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#df3a10\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#dc000b\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lightgreyred)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lightgreyteal\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lightgreyteal\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#e4eaea\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#d7ddde\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#cbd1d4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#bcc6ca\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#adbac0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#85b2be\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#4aacc1\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#22a1c2\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#2192c0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#1e84be\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#1876bc\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lightgreyteal)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lightmulti\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lightmulti\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#e0f1f2\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#caebd7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#b8e2b3\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#bddf93\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#d8e17e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#f6e072\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#f6c659\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#f4a946\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#f58a3f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#f56c3f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#ef4a3c\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lightmulti)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lightorange\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lightorange\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#f2e7da\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#f7d7bd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#f9c7a0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#fab78a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#faa47a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#f8936d\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#f38264\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#ed725f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#e6605b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#dd4f5b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#d43d5b\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lightorange)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"lighttealblue\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-lighttealblue\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#e3e9e0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#c4ddd1\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#a2d1cb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#84c4c9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#66b5c3\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#49a7bd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#3698b4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#3188a9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#2d799e\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#276994\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#255988\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-lighttealblue)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    loaded$1 = true;\n  }\n  function sequentialMultiHue(selected) {\n    if (!loaded$1)\n      load$3();\n    return [\n      schemeOption(selected, \"viridis\"),\n      schemeOption(selected, \"magma\"),\n      schemeOption(selected, \"inferno\"),\n      schemeOption(selected, \"plasma\"),\n      schemeOption(selected, \"cividis\"),\n      schemeOption(selected, \"turbo\"),\n      schemeOption(selected, \"bluegreen\"),\n      schemeOption(selected, \"bluepurple\"),\n      schemeOption(selected, \"goldgreen\"),\n      schemeOption(selected, \"goldorange\"),\n      schemeOption(selected, \"goldred\"),\n      schemeOption(selected, \"greenblue\"),\n      schemeOption(selected, \"orangered\"),\n      schemeOption(selected, \"purplebluegreen\"),\n      schemeOption(selected, \"purpleblue\"),\n      schemeOption(selected, \"purplered\"),\n      schemeOption(selected, \"redpurple\"),\n      schemeOption(selected, \"yellowgreenblue\"),\n      schemeOption(selected, \"yellowgreen\"),\n      schemeOption(selected, \"yelloworangebrown\"),\n      schemeOption(selected, \"yelloworangered\"),\n      schemeHeader(\"schemeSequentialMultiHueDark\", strings$1.schemeSequentialMultiHueDark),\n      schemeOption(selected, \"darkblue\"),\n      schemeOption(selected, \"darkgold\"),\n      schemeOption(selected, \"darkgreen\"),\n      schemeOption(selected, \"darkmulti\"),\n      schemeOption(selected, \"darkred\"),\n      schemeHeader(\"schemeSequentialMultiHueLight\", strings$1.schemeSequentialMultiHueLight),\n      schemeOption(selected, \"lightgreyred\"),\n      schemeOption(selected, \"lightgreyteal\"),\n      schemeOption(selected, \"lightmulti\"),\n      schemeOption(selected, \"lightorange\"),\n      schemeOption(selected, \"lighttealblue\")\n    ];\n  }\n  let loaded = false;\n  function load$2() {\n    schemesJSX[\"blues\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-blues\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 251, 255)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(227, 238, 249)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(207, 225, 242)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(181, 212, 233)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(147, 195, 223)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(109, 174, 213)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(75, 151, 201)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(47, 126, 188)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(24, 100, 170)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(10, 74, 144)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(8, 48, 107)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-blues)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"tealblues\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-tealblues\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#bce4d8\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#a3d6d2\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#8cc9cd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#76bdc7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#5fb0c0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#45a2b9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#3993b0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#3584a6\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#32759b\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#2f6790\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#2c5985\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-tealblues)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"teals\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-teals\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#bbdfdf\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#a2d4d5\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#8ac9c9\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#75bcbb\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#61b0af\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#4da5a4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#379998\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#2b8b8c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#1e7f7f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#127273\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#006667\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-teals)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"greens\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-greens\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(247, 252, 245)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(232, 246, 227)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(211, 238, 205)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(183, 226, 177)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(151, 212, 148)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(115, 195, 120)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(77, 175, 98)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(47, 152, 79)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(21, 127, 59)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(3, 100, 41)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 68, 27)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-greens)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"greys\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-greys\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 255, 255)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(242, 242, 242)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(226, 226, 226)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(206, 206, 206)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(180, 180, 180)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(151, 151, 151)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(122, 122, 122)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(95, 95, 95)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(64, 64, 64)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(30, 30, 30)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(0, 0, 0)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-greys)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"purples\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-purples\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(252, 251, 253)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(241, 239, 246)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(226, 225, 239)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(206, 206, 229)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(182, 181, 216)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(158, 155, 201)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(135, 130, 188)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(115, 99, 172)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(97, 64, 155)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(80, 31, 140)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(63, 0, 125)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-purples)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"browns\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-browns\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#eedbbd\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#ecca96\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#e9b97a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#e4a865\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#dc9856\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#d18954\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#c7784c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#c0673f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#b85536\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#ad4433\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#9f3632\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-browns)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"reds\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-reds\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 245, 240)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(254, 227, 214)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(253, 201, 180)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(252, 170, 142)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(252, 138, 107)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(249, 105, 76)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(239, 69, 51)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(217, 39, 35)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(187, 21, 26)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(151, 11, 19)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(103, 0, 13)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-reds)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"oranges\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-oranges\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"rgb(255, 245, 235)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"rgb(254, 232, 211)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"rgb(253, 216, 179)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"rgb(253, 194, 140)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"rgb(253, 167, 98)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"rgb(251, 141, 61)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"rgb(242, 112, 29)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"rgb(226, 86, 9)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"rgb(196, 65, 3)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"rgb(159, 51, 3)\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"rgb(127, 39, 4)\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-oranges)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    schemesJSX[\"warmgreys\"] = base$1.react.createElement(\n      \"svg\",\n      { viewBox: \"0,0,1,1\", preserveAspectRatio: \"none\" },\n      base$1.react.createElement(\n        \"defs\",\n        null,\n        base$1.react.createElement(\n          \"linearGradient\",\n          { id: \"gradient-warmgreys\" },\n          base$1.react.createElement(\"stop\", { offset: \"0%\", stopColor: \"#dcd4d0\" }),\n          base$1.react.createElement(\"stop\", { offset: \"10%\", stopColor: \"#cec5c1\" }),\n          base$1.react.createElement(\"stop\", { offset: \"20%\", stopColor: \"#c0b8b4\" }),\n          base$1.react.createElement(\"stop\", { offset: \"30%\", stopColor: \"#b3aaa7\" }),\n          base$1.react.createElement(\"stop\", { offset: \"40%\", stopColor: \"#a59c99\" }),\n          base$1.react.createElement(\"stop\", { offset: \"50%\", stopColor: \"#98908c\" }),\n          base$1.react.createElement(\"stop\", { offset: \"60%\", stopColor: \"#8b827f\" }),\n          base$1.react.createElement(\"stop\", { offset: \"70%\", stopColor: \"#7e7673\" }),\n          base$1.react.createElement(\"stop\", { offset: \"80%\", stopColor: \"#726866\" }),\n          base$1.react.createElement(\"stop\", { offset: \"90%\", stopColor: \"#665c5a\" }),\n          base$1.react.createElement(\"stop\", { offset: \"100%\", stopColor: \"#59504e\" })\n        )\n      ),\n      base$1.react.createElement(\"rect\", { fill: \"url(#gradient-warmgreys)\", x: \"0\", y: \"0\", width: \"1\", height: \"1\" })\n    );\n    loaded = true;\n  }\n  function sequentialSingleHue(selected) {\n    if (!loaded)\n      load$2();\n    return [\n      schemeOption(selected, \"blues\"),\n      schemeOption(selected, \"tealblues\"),\n      schemeOption(selected, \"teals\"),\n      schemeOption(selected, \"greens\"),\n      schemeOption(selected, \"browns\"),\n      schemeOption(selected, \"oranges\"),\n      schemeOption(selected, \"reds\"),\n      schemeOption(selected, \"purples\"),\n      schemeOption(selected, \"warmgreys\"),\n      schemeOption(selected, \"greys\")\n    ];\n  }\n  const maxDistinctColors = 20;\n  function Palette(props) {\n    const { distinctValueCount } = props.colorColumn.stats;\n    const isDual = distinctValueCount === 2;\n    const categoricalNumeric = distinctValueCount > 0 && distinctValueCount < maxDistinctColors;\n    let isQualitative = false;\n    let isQuantitative2 = false;\n    switch (props.colorColumn.type) {\n      case \"boolean\":\n      case \"string\":\n        isQualitative = true;\n        break;\n      case \"number\":\n        isQuantitative2 = true;\n        break;\n      case \"date\":\n      case \"integer\":\n        isQuantitative2 = true;\n        isQualitative = categoricalNumeric;\n    }\n    const selected = props.scheme;\n    const options2 = [];\n    function menu(name, opts) {\n      if (options2.length) {\n        options2.push({\n          key: \"divider\" + options2.length,\n          text: null,\n          itemType: base$1.fluentUI.DropdownMenuItemType.Divider\n        });\n      }\n      options2.push({\n        key: name,\n        text: name,\n        itemType: base$1.fluentUI.DropdownMenuItemType.Header\n      });\n      options2.push.apply(options2, opts);\n    }\n    isQualitative && menu(strings$1.schemeCategorical, categorical(selected));\n    isQuantitative2 && menu(strings$1.schemeSequentialSingleHue, sequentialSingleHue(selected));\n    isQuantitative2 && menu(strings$1.schemeSequentialMultiHue, sequentialMultiHue(selected));\n    isQuantitative2 && menu(strings$1.schemeDiverging, diverging(selected));\n    isQuantitative2 && menu(strings$1.schemeCyclical, cyclical(selected));\n    isDual && menu(strings$1.schemeDual, dual(selected));\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"sanddance-palette\" },\n      base$1.react.createElement(\"div\", { className: \"sanddance-explanation\", dangerouslySetInnerHTML: {\n        __html: strings$1.labelColorFieldInfo(props.colorColumn.name, props.colorColumn.type, categoricalNumeric, distinctValueCount)\n      } }),\n      base$1.react.createElement(Dropdown$1, { collapseLabel: props.collapseLabel, disabled: props.disabled, dropdownWidth: 400, label: strings$1.labelColorScheme, onRenderOption: (option) => {\n        if (option.itemType === base$1.fluentUI.DropdownMenuItemType.Header) {\n          return base$1.react.createElement(\"span\", null, option.text);\n        } else {\n          return base$1.react.createElement(\n            \"div\",\n            { className: \"sanddance-scheme option\" },\n            base$1.react.createElement(\"span\", { className: \"name\" }, option.scheme),\n            option.children\n          );\n        }\n      }, options: options2, onChange: (e, o) => {\n        props.changeColorScheme(o.scheme);\n      } }),\n      base$1.react.createElement(\"div\", { className: classList(\"sanddance-scheme\", props.disabled && \"disabled\") }, props.scheme && schemesJSX[props.scheme])\n    );\n  }\n  function Color(props) {\n    const colorColumn = props.dataContent.columns.filter((c2) => c2.name === props.colorColumn)[0];\n    const disabledColorBin = !colorColumn || !colorColumn.quantitative || props.directColor;\n    const colorBin = props.colorBin || \"quantize\";\n    const dropdownRef = base$1.react.createRef();\n    props.explorer.dialogFocusHandler.focus = () => {\n      var _a2;\n      return (_a2 = dropdownRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n    };\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"sanddance-color-dialog\" },\n      base$1.react.createElement(\n        Group$1,\n        { label: strings$1.labelColor },\n        base$1.react.createElement(ColumnMap, Object.assign({}, props, { componentRef: dropdownRef, collapseLabel: props.compactUI, selectedColumnName: props.colorColumn, specRole: props.specCapabilities && props.specCapabilities.roles.filter((r) => r.role === \"color\")[0], key: 0 })),\n        colorColumn && colorColumn.isColorData && base$1.react.createElement(\"div\", { className: \"sanddance-explanation\", dangerouslySetInnerHTML: { __html: strings$1.labelColorFieldIsColorData(colorColumn.name) } }),\n        colorColumn && !colorColumn.isColorData && base$1.react.createElement(Palette, { collapseLabel: props.compactUI, scheme: props.scheme, colorColumn, changeColorScheme: (scheme2) => {\n          props.onColorSchemeChange(scheme2);\n        }, disabled: props.disabled || props.directColor || colorColumn && colorColumn.isColorData }),\n        colorColumn && !colorColumn.isColorData && base$1.react.createElement(Signal, { disabled: props.disabled || !colorColumn || props.directColor || colorColumn && colorColumn.isColorData, signal: props.colorReverseSignal, explorer: props.explorer, initialValue: getInitialSignalValue(props.explorer, props.colorReverseSignal), onChange: props.onColorReverseChange, collapseLabel: props.compactUI })\n      ),\n      colorColumn && !colorColumn.isColorData && base$1.react.createElement(\n        Group$1,\n        { label: strings$1.labelColorBin },\n        base$1.react.createElement(\"div\", { className: \"sanddance-explanation\" }, strings$1.labelColorBinExplanation),\n        base$1.react.createElement(base$1.fluentUI.ChoiceGroup, { selectedKey: colorBin, options: [\n          {\n            key: \"continuous\",\n            text: strings$1.labelColorBinNone,\n            disabled: disabledColorBin\n          },\n          {\n            key: \"quantize\",\n            text: strings$1.labelColorBinQuantize,\n            disabled: disabledColorBin\n          },\n          {\n            key: \"quantile\",\n            text: strings$1.labelColorBinQuantile,\n            disabled: disabledColorBin\n          }\n        ], onChange: (e, o) => {\n          props.onColorBinChange(o.key);\n        } }),\n        base$1.react.createElement(Signal, { disabled: props.disabled || disabledColorBin || props.colorBin === \"continuous\", signal: props.colorBinSignal, explorer: props.explorer, initialValue: getInitialSignalValue(props.explorer, props.colorBinSignal), onChange: props.onColorBinCountChange, collapseLabel: props.compactUI })\n      ),\n      colorColumn && !colorColumn.isColorData && base$1.react.createElement(\n        Group$1,\n        { label: strings$1.labelColorOptions },\n        base$1.react.createElement(base$1.fluentUI.Toggle, { label: strings$1.selectDirectColor, disabled: !colorColumn.stats.hasColorData, checked: !!(colorColumn.stats.hasColorData && props.directColor), onChange: (e, checked) => props.onDirectColorChange(checked) }),\n        base$1.react.createElement(\"div\", { className: \"sanddance-explanation\", dangerouslySetInnerHTML: { __html: strings$1.labelDataColors } })\n      )\n    );\n  }\n  const KeyCodes$1 = {\n    ENTER: 13\n  };\n  function isNumber$2(value2) {\n    if (typeof value2 === \"number\")\n      return true;\n    if (!isNaN(value2))\n      return true;\n    return false;\n  }\n  function isBoolean$2(value2) {\n    if (typeof value2 === \"boolean\")\n      return true;\n    if (typeof value2 === \"string\") {\n      switch (value2.toLowerCase()) {\n        case \"true\":\n        case \"false\":\n          return true;\n      }\n    }\n    return false;\n  }\n  function bingSearchLink(column, value2) {\n    if (isNumber$2(value2))\n      return null;\n    if (isBoolean$2(value2))\n      return null;\n    if (column && column.stats.distinctValueCount === 2)\n      return null;\n    return base$1.react.createElement(\n      \"div\",\n      { className: \"bing-search\" },\n      base$1.react.createElement(\"a\", { href: `https://www.bing.com/search?q=${encodeURIComponent(value2)}`, target: \"_blank\", title: strings$1.bingsearchDescription(value2), \"aria-label\": strings$1.bingsearchDescription(value2) }, strings$1.bingsearch)\n    );\n  }\n  function displayValue(value2) {\n    switch (value2) {\n      case \"\": {\n        return { special: true, display: strings$1.labelBlank };\n      }\n      case null: {\n        return { special: true, display: strings$1.labelNull };\n      }\n      case true: {\n        return { special: true, display: strings$1.labelTrue };\n      }\n      case false: {\n        return { special: true, display: strings$1.labelFalse };\n      }\n      default: {\n        if (typeof value2 === \"object\") {\n          if (value2 instanceof Date) {\n            const d2 = value2;\n            return displayValue(d2.input);\n          }\n          return { special: false, display: value2.toLocaleString() };\n        }\n        return { special: false, display: value2 };\n      }\n    }\n  }\n  function displayValueElement(nvp) {\n    const d2 = displayValue(nvp.value);\n    if (d2.special) {\n      return base$1.react.createElement(\"i\", null, d2.display);\n    }\n    return d2.display;\n  }\n  function DataItem(props) {\n    if (!props.item) {\n      return null;\n    }\n    const nameValuePairs = [];\n    for (const columnName in props.item) {\n      if (columnName === GL_ORDINAL && !props.showSystemFields) {\n        continue;\n      }\n      if (isInternalFieldName(columnName)) {\n        continue;\n      }\n      const nameValuePair = {\n        columnName,\n        value: props.item[columnName]\n      };\n      if (!props.bingSearchDisabled) {\n        nameValuePair.bingSearch = bingSearchLink(props.columns.filter((c2) => c2.name === columnName)[0], props.item[columnName]);\n      }\n      nameValuePairs.push(nameValuePair);\n    }\n    return base$1.react.createElement(\"div\", { className: \"sanddance-dataItem\" }, nameValuePairs.map((nameValuePair, i) => {\n      const ex = {\n        key: 0,\n        name: nameValuePair.columnName,\n        operator: \"==\",\n        value: nameValuePair.value\n      };\n      if (nameValuePair.value === null || nameValuePair.value === \"\") {\n        ex.operator = \"isnullorEmpty\";\n        delete ex.value;\n      }\n      const searchClick = (e) => {\n        const search = {\n          key: 0,\n          expressions: [ex]\n        };\n        props.onSearch(e, [search]);\n      };\n      const title = strings$1.tooltipSearch(nameValuePair.columnName, displayValue(nameValuePair.value).display);\n      return base$1.react.createElement(\n        \"div\",\n        { key: i, onClick: !props.disabled ? searchClick : null, title, onKeyUp: (e) => {\n          if (e.keyCode === KeyCodes$1.ENTER) {\n            searchClick(e);\n          }\n        }, tabIndex: 0, className: \"name-value\" },\n        base$1.react.createElement(\"div\", { className: \"column-name\" }, nameValuePair.columnName),\n        base$1.react.createElement(\"div\", { className: \"column-value\" }, displayValueElement(nameValuePair)),\n        nameValuePair.bingSearch\n      );\n    }));\n  }\n  const dataBrowserZeroMessages = {};\n  dataBrowserZeroMessages[DataScopeId.AllData] = strings$1.labelZeroAll;\n  dataBrowserZeroMessages[DataScopeId.FilteredData] = null;\n  dataBrowserZeroMessages[DataScopeId.SelectedData] = strings$1.labelZeroSearchResults;\n  const dataBrowserNullMessages = {};\n  dataBrowserNullMessages[DataScopeId.AllData] = strings$1.labelDataNullAll;\n  dataBrowserNullMessages[DataScopeId.FilteredData] = strings$1.labelDataNullFiltered;\n  dataBrowserNullMessages[DataScopeId.SelectedData] = strings$1.labelDataNullSelection;\n  function DataBrowser(props) {\n    function activateRecord(newIndex) {\n      props.onActivate(props.data[newIndex], newIndex);\n    }\n    const { index: index2 } = props;\n    const length2 = props.data && props.data.length || 0;\n    const dropdownRef = base$1.react.createRef();\n    props.explorer.dialogFocusHandler.focus = () => {\n      var _a2;\n      return (_a2 = dropdownRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n    };\n    return base$1.react.createElement(\n      Group$1,\n      { label: strings$1.labelDataBrowser, className: \"sanddance-dataIndex\" },\n      base$1.react.createElement(Dropdown$1, { componentRef: dropdownRef, label: strings$1.labelDataScope, collapseLabel: true, options: [\n        {\n          key: DataScopeId.AllData,\n          text: strings$1.selectDataSpanAll,\n          isSelected: props.selectedDataScope === DataScopeId.AllData\n        },\n        {\n          key: DataScopeId.FilteredData,\n          text: strings$1.selectDataSpanFilter,\n          isSelected: props.selectedDataScope === DataScopeId.FilteredData\n        },\n        {\n          key: DataScopeId.SelectedData,\n          text: strings$1.selectDataSpanSelection,\n          isSelected: props.selectedDataScope === DataScopeId.SelectedData\n        }\n      ], onChange: (e, o) => {\n        props.onDataScopeClick(o.key);\n      } }),\n      !props.data && base$1.react.createElement(\"div\", { dangerouslySetInnerHTML: { __html: props.nullMessage } }),\n      props.data && !props.data.length && base$1.react.createElement(\"div\", null, props.zeroMessage),\n      !!length2 && base$1.react.createElement(\n        \"div\",\n        null,\n        base$1.react.createElement(\n          \"div\",\n          { className: \"index\" },\n          base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, iconName: \"ChevronLeftMed\", onClick: (e) => activateRecord(index2 <= 0 ? length2 - 1 : index2 - 1), disabled: props.disabled || length2 === 1, title: strings$1.buttonPrevDataItem }),\n          base$1.react.createElement(\"span\", null, strings$1.record(index2 + 1, length2)),\n          base$1.react.createElement(IconButton$1, { themePalette: props.themePalette, iconName: \"ChevronRightMed\", onClick: (e) => activateRecord(index2 >= length2 - 1 ? 0 : index2 + 1), disabled: props.disabled || length2 === 1, title: strings$1.buttonNextDataItem })\n        ),\n        !props.itemVisible && base$1.react.createElement(\"div\", { className: \"item-filtered\" }, strings$1.labelDataItemIsFiltered),\n        base$1.react.createElement(DataItem, { columns: props.columns, item: props.data[index2], disabled: props.disabled, onSearch: props.onSearch, bingSearchDisabled: props.bingSearchDisabled })\n      ),\n      base$1.react.createElement(ColumnTypeChanger, { theme: props.theme, themePalette: props.themePalette, initialCategoricalColumns: props.categoricalColumns, initialQuantitativeColumns: props.quantitativeColumns, onConfirmUpdate: props.onUpdateColumnTypes }),\n      props.dataExportHandler && props.data && base$1.react.createElement(DataExportPicker, { theme: props.theme, initializer: {\n        fileName: `${removeExtensions(props.displayName)} (${props.data.length})`\n      }, data: props.data, dataExportHandler: props.dataExportHandler, disabled: props.disabled })\n    );\n  }\n  function History(props) {\n    return base$1.react.createElement(\n      Group$1,\n      { label: strings$1.labelHistory, className: \"sanddance-history\" },\n      base$1.react.createElement(\"ol\", null, props.historyItems.map((hi, i) => {\n        let ref2;\n        if (i === props.historyIndex) {\n          ref2 = base$1.react.createRef();\n          props.explorer.dialogFocusHandler.focus = () => {\n            var _a2;\n            (_a2 = ref2.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n          };\n        }\n        return base$1.react.createElement(\n          \"li\",\n          { key: i, className: classList(i === props.historyIndex && \"selected\"), onKeyUp: (e) => {\n            if (e.keyCode === KeyCodes$1.ENTER) {\n              props.redo(i);\n            }\n          } },\n          base$1.react.createElement(base$1.fluentUI.DefaultButton, { className: \"sanddance-history-button\", componentRef: ref2, text: hi.label, onClick: () => props.redo(i) })\n        );\n      }))\n    );\n  }\n  function getPureInsight(historicInsight) {\n    const { colorBin, columns, directColor, facetStyle, filter: filter2, hideAxes, hideLegend, scheme: scheme2, signalValues, size, totalStyle, transform: transform2, chart, view } = historicInsight;\n    const insight = {\n      colorBin,\n      columns,\n      directColor,\n      facetStyle,\n      filter: filter2,\n      hideAxes,\n      hideLegend,\n      scheme: scheme2,\n      signalValues,\n      size,\n      totalStyle,\n      transform: transform2,\n      chart,\n      view\n    };\n    return insight;\n  }\n  function replay(historyItems, index2) {\n    let filter2 = null;\n    let historicInsight = {};\n    for (let i = 0; i < index2 + 1; i++) {\n      const historyItem = historyItems[i];\n      if (historyItem) {\n        if (historyItem.historicInsight.filter === null) {\n          filter2 = null;\n        } else if (historyItem.historicInsight.rebaseFilter) {\n          filter2 = historyItem.historicInsight.filter;\n        } else if (historyItem.historicInsight.filter) {\n          filter2 = narrow(filter2, historyItem.historicInsight.filter);\n        }\n        historicInsight = Object.assign(Object.assign({}, historicInsight), historyItem.historicInsight);\n      }\n    }\n    return Object.assign(Object.assign({}, historicInsight), { filter: filter2 });\n  }\n  function hasClientXY(e) {\n    if (e && e.clientX !== void 0 && e.clientX !== void 0) {\n      return { top: e.clientY, left: e.clientX };\n    }\n  }\n  function getPosition(e) {\n    const xy = hasClientXY(e);\n    if (xy) {\n      return xy;\n    }\n    const te = e;\n    if (te === null || te === void 0 ? void 0 : te.touches) {\n      for (let i = 0; i < te.touches.length; i++) {\n        const xy2 = hasClientXY(te.touches[i]);\n        if (xy2) {\n          return xy2;\n        }\n      }\n    }\n    const el = e.target;\n    if (el && el.getClientRects) {\n      return el.getClientRects()[0];\n    }\n  }\n  function initPrefs(prefs, partialInsight) {\n    if (partialInsight) {\n      const specTypePrefs = prefs[partialInsight.chart] || {};\n      prefs[partialInsight.chart] = specTypePrefs;\n      for (const _role in partialInsight.columns) {\n        const role = _role;\n        if (role === \"color\" || role === \"x\") {\n          const rolePrefs = specTypePrefs[role] || {};\n          specTypePrefs[role] = rolePrefs;\n          const column = partialInsight.columns[role];\n          const copySignalValue = (signalName) => {\n            if (partialInsight.signalValues && partialInsight.signalValues[signalName] && rolePrefs[column]) {\n              const signalValues = rolePrefs[column].signalValues || {};\n              signalValues[signalName] = partialInsight.signalValues[signalName];\n              rolePrefs[column].signalValues = signalValues;\n            }\n          };\n          switch (role) {\n            case \"color\":\n              rolePrefs[column] = {\n                scheme: partialInsight.scheme,\n                colorBin: partialInsight.colorBin\n              };\n              copySignalValue(SignalNames.ColorBinCount);\n              break;\n            case \"x\":\n              copySignalValue(SignalNames.XBins);\n              break;\n          }\n        }\n      }\n    }\n  }\n  function saveSignalValuePref(prefs, chart, role, column, signalName, signalValue) {\n    const partialInsight = savePref(prefs, chart, role, column, { signalValues: {} });\n    partialInsight.signalValues[signalName] = signalValue;\n  }\n  function copyPrefToNewState(prefs, chart, role, columnName) {\n    const specTypePrefs = deepMerge({}, prefs[\"*\"], prefs[chart]);\n    const rolePrefs = deepMerge({}, specTypePrefs[\"*\"], specTypePrefs[role]);\n    const partialInsight = deepMerge({}, rolePrefs[\"*\"], rolePrefs[columnName]);\n    return partialInsight;\n  }\n  function savePref(prefs, chart, role, column, partialInsight) {\n    const SpecTypePrefs = prefs[chart] || {};\n    prefs[chart] = SpecTypePrefs;\n    const rolePrefs = SpecTypePrefs[role] || {};\n    SpecTypePrefs[role] = rolePrefs;\n    rolePrefs[column] = deepMerge({}, rolePrefs[column], partialInsight);\n    return rolePrefs[column];\n  }\n  function comparableGroup(group2) {\n    return Object.assign(Object.assign({}, group2), { clause: null });\n  }\n  function compareGroup(a2, b2) {\n    return compareGroup$1(comparableGroup(a2), comparableGroup(b2));\n  }\n  function compareGroups(haystack, needle) {\n    const groups = [];\n    let found = false;\n    haystack.forEach((group2) => {\n      if (compareGroup(group2, needle)) {\n        found = true;\n      } else {\n        groups.push(group2);\n      }\n    });\n    return { groups, found };\n  }\n  function createInputSearch(search) {\n    const groups = ensureSearchExpressionGroupArray(search);\n    const dialogSearch = groups.map((group2, groupIndex) => {\n      return Object.assign(Object.assign({ key: groupIndex }, group2), { expressions: group2.expressions.map((ex, i) => {\n        const ex2 = Object.assign({ key: i }, ex);\n        return ex2;\n      }) });\n    });\n    return dialogSearch;\n  }\n  function _Renderer(_props) {\n    class __Renderer extends base$1.react.Component {\n      constructor(props) {\n        var _a2, _b2;\n        super(props);\n        this.state = this.getInitialState(props);\n        if (!((_b2 = (_a2 = this.state.viewer) === null || _a2 === void 0 ? void 0 : _a2.presenter) === null || _b2 === void 0 ? void 0 : _b2.morphchartsref)) {\n          const t = setInterval(() => {\n            var _a3, _b3;\n            const newState = this.getInitialState(props);\n            if (this.mounted && ((_b3 = (_a3 = newState.viewer) === null || _a3 === void 0 ? void 0 : _a3.presenter) === null || _b3 === void 0 ? void 0 : _b3.morphchartsref)) {\n              clearInterval(t);\n              this.setState(newState);\n            }\n          }, 10);\n        }\n      }\n      componentDidMount() {\n        this.mounted = true;\n      }\n      componentWillUnmount() {\n        this.mounted = false;\n      }\n      getInitialState(props) {\n        const { viewer } = props.explorer;\n        return {\n          showOptions: false,\n          viewer\n        };\n      }\n      setOptions(newOptions) {\n        const { explorer: explorer2 } = this.props;\n        const renderer = Object.assign(Object.assign({}, explorer2.state.renderer), newOptions);\n        const { onSetupOptionsChanged } = explorer2.props;\n        if (onSetupOptionsChanged) {\n          const setup2 = explorer2.getSetup();\n          setup2.renderer = renderer;\n          onSetupOptionsChanged(setup2);\n        }\n        explorer2.setState({ renderer });\n      }\n      setBasicOptions(newOptions) {\n        this.setOptions({\n          advanced: false,\n          basicOptions: Object.assign(Object.assign({}, this.props.basicOptions), newOptions)\n        });\n      }\n      setAdvancedOptions(newOptions) {\n        this.setOptions({\n          advanced: true,\n          advancedOptions: Object.assign(Object.assign({}, this.props.advancedOptions), newOptions)\n        });\n      }\n      render() {\n        var _a2, _b2;\n        const { props, state } = this;\n        const iconButtonStyles = {\n          menuIcon: {\n            display: \"none\"\n          }\n        };\n        if (!((_b2 = (_a2 = state.viewer) === null || _a2 === void 0 ? void 0 : _a2.presenter) === null || _b2 === void 0 ? void 0 : _b2.morphchartsref)) {\n          return base$1.react.createElement(IconButton$1, { styles: iconButtonStyles, className: \"sanddance-advanced-renderer\", disabled: true, iconName: \"HourGlass\", onClick: void 0, themePalette: props.themePalette, title: strings$1.labelRenderer });\n        } else {\n          const { morphchartsref } = state.viewer.presenter;\n          const choiceButtonStyle = {\n            border: \"none\"\n          };\n          const { advanced, advancedOptions, basicOptions } = props;\n          return base$1.react.createElement(\n            \"div\",\n            null,\n            base$1.react.createElement(IconButton$1, { iconName: \"PicturePosition\", title: strings$1.buttonCameraHome, onClick: props.onHomeClick, styles: iconButtonStyles, themePalette: props.themePalette }),\n            base$1.react.createElement(IconButton$1, { styles: iconButtonStyles, className: \"sanddance-advanced-renderer\", iconName: advanced ? \"DiamondSolid\" : \"Diamond\", disabled: !morphchartsref.supportedRenders.advanced, onClick: void 0, themePalette: props.themePalette, title: morphchartsref.supportedRenders.advanced ? strings$1.labelRenderer : strings$1.labelRendererAdvancedDisabled, menuProps: {\n              items: [\n                {\n                  key: \"basic\",\n                  text: strings$1.labelRendererBasic,\n                  iconProps: {\n                    iconName: advanced ? null : \"RadioBullet\"\n                  },\n                  onClick: () => advanced && this.setOptions({ advanced: false })\n                  //disabled: !advanced,\n                },\n                {\n                  key: \"advanced\",\n                  text: strings$1.labelRendererAdvanced,\n                  iconProps: {\n                    iconName: advanced ? \"RadioBullet\" : null\n                  },\n                  onClick: () => !advanced && this.setOptions({ advanced: true })\n                  //disabled: advanced,\n                },\n                {\n                  key: \"options\",\n                  text: strings$1.labelRendererOptions,\n                  onClick: (e) => this.setState({ showOptions: true })\n                }\n              ]\n            } }),\n            base$1.react.createElement(\n              Dialog$1,\n              { hidden: !state.showOptions, dialogContentProps: {\n                className: \"sanddance-renderer-dialog\",\n                title: strings$1.labelRendererOptionsDialogTitle\n              }, onDismiss: () => this.setState({ showOptions: false }) },\n              base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(Button, { iconName: advanced ? \"RadioBtnOff\" : \"RadioBtnOn\", onClick: () => this.setOptions({ advanced: false }), text: strings$1.labelRendererBasic, themePalette: props.themePalette, rootStyle: choiceButtonStyle }),\n                base$1.react.createElement(\n                  \"ul\",\n                  null,\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: basicOptions.antialias, label: strings$1.labelRendererOptionsAntialias, onChange: (e, antialias) => this.setBasicOptions({ antialias }) })\n                  )\n                )\n              ),\n              base$1.react.createElement(\n                \"div\",\n                null,\n                base$1.react.createElement(Button, { iconName: advanced ? \"RadioBtnOn\" : \"RadioBtnOff\", onClick: () => this.setOptions({ advanced: true }), text: strings$1.labelRendererAdvanced, themePalette: props.themePalette, rootStyle: choiceButtonStyle }),\n                base$1.react.createElement(\n                  \"ul\",\n                  null,\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isShadowEnabled, label: strings$1.labelRendererOptionsShadow, onChange: (e, isShadowEnabled) => this.setAdvancedOptions({ isShadowEnabled }) })\n                  ),\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isSsaoEnabled, label: strings$1.labelRendererOptionsSsao, onChange: (e, isSsaoEnabled) => this.setAdvancedOptions({ isSsaoEnabled }) })\n                  ),\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isBloomEnabled, label: strings$1.labelRendererOptionsBloom, onChange: (e, isBloomEnabled) => this.setAdvancedOptions({ isBloomEnabled }) }),\n                    base$1.react.createElement(\n                      \"ul\",\n                      null,\n                      base$1.react.createElement(\n                        \"li\",\n                        null,\n                        base$1.react.createElement(base$1.fluentUI.Slider, { value: advancedOptions.bloomIntensity, min: 0.1, max: 5, step: 0.01, label: strings$1.labelRendererOptionsBloomIntensity, onChange: (bloomIntensity) => this.setAdvancedOptions({ bloomIntensity, isBloomEnabled: true }) })\n                      )\n                    )\n                  ),\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isDofEnabled, label: strings$1.labelRendererOptionsDof, onChange: (e, isDofEnabled) => this.setAdvancedOptions({ isDofEnabled }) }),\n                    base$1.react.createElement(\n                      \"ul\",\n                      null,\n                      base$1.react.createElement(\n                        \"li\",\n                        null,\n                        base$1.react.createElement(base$1.fluentUI.Slider, { value: advancedOptions.dofFocusRange, min: 0, max: 2, step: 0.01, label: strings$1.labelRendererOptionsDofRange, onChange: (dofFocusRange) => this.setAdvancedOptions({ dofFocusRange, isDofEnabled: true }) })\n                      )\n                    )\n                  ),\n                  base$1.react.createElement(\n                    \"li\",\n                    null,\n                    base$1.react.createElement(base$1.fluentUI.Toggle, { checked: advancedOptions.isFxaaEnabled, label: strings$1.labelRendererOptionsFxaa, onChange: (e, isFxaaEnabled) => this.setAdvancedOptions({ isFxaaEnabled }) })\n                  )\n                )\n              )\n            )\n          );\n        }\n      }\n    }\n    return new __Renderer(_props);\n  }\n  const Renderer$1 = _Renderer;\n  function _Explorer(_props) {\n    class __Explorer extends base$1.react.Component {\n      constructor(props) {\n        super(props);\n        this.dialogFocusHandler = {};\n        this.state = initialExplorerState(props);\n        this.imageHolder = { img: null, backgroundImageColumnBounds: [], showBackgroundImage: false };\n        this.snapshotThumbWidth = snapshotThumbWidth;\n        this.discardColorContextUpdates = true;\n        this.updateViewerOptions(Object.assign(Object.assign({}, clone(Viewer$1.defaultViewerOptions)), props.viewerOptions));\n      }\n      finalize() {\n        if (this.viewer)\n          this.viewer.finalize();\n      }\n      updateViewerOptions(viewerOptions) {\n        this.viewerOptions = Object.assign(Object.assign({}, deepMerge(defaultViewerOptions, {\n          tooltipOptions: {\n            prepareDataItem: ((item) => {\n              const ret = {};\n              for (const columnName in item) {\n                if (this.state.tooltipExclusions.indexOf(columnName) < 0) {\n                  ret[columnName] = item[columnName];\n                }\n              }\n              return ret;\n            })\n          }\n        }, this.viewerOptions, viewerOptions)), { onColorContextChange: () => this.manageColorToolbar(), onDataFilter: (filter2, filteredData) => {\n          const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n          selectedItemIndex[DataScopeId.FilteredData] = 0;\n          this.changeInsight({ filter: filter2 }, { label: this.historicFilterChange, omit: !this.historicFilterChange });\n          this.historicFilterChange = null;\n          this.setState({ filteredData, selectedItemIndex });\n          if (this.state.sideTabId === SideTabId.Data && this.state.dataScopeId === DataScopeId.FilteredData) {\n            requestAnimationFrame(() => filteredData && this.silentActivation(filteredData[0]));\n          }\n          viewerOptions && viewerOptions.onDataFilter && viewerOptions.onDataFilter(filter2, filteredData);\n        }, onSelectionChanged: (newSearch, index2, selectedData) => {\n          if (this.ignoreSelectionChange)\n            return;\n          const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n          selectedItemIndex[DataScopeId.SelectedData] = index2 || 0;\n          let { search } = this.state;\n          const { sideTabId } = this.state;\n          if (newSearch) {\n            search = createInputSearch(newSearch);\n          }\n          this.setState({ search, selectedItemIndex, sideTabId });\n          viewerOptions && viewerOptions.onSelectionChanged && viewerOptions.onSelectionChanged(newSearch, index2, selectedData);\n        }, onAxisClick: (e, search) => {\n          this.toggleableSearch(e, search);\n          viewerOptions && viewerOptions.onAxisClick && viewerOptions.onAxisClick(e, search);\n        }, onLegendHeaderClick: (e) => {\n          const pos = getPosition(e);\n          const specRole = this.state.specCapabilities && this.state.specCapabilities.roles.filter((r) => r.role === \"color\")[0];\n          const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), { collapseLabel: true, container: this.div, selectedColumnName: this.state.columns[\"color\"], onDismiss: () => {\n            this.setState({ positionedColumnMapProps: null });\n          }, specRole, left: pos.left - this.div.clientLeft, top: pos.top - this.div.clientTop });\n          this.setState({ positionedColumnMapProps });\n        }, onLegendRowClick: (e, legendRow) => {\n          this.toggleableSearch(e, legendRow.search);\n          viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onLegendRowClick(e, legendRow);\n        }, onError: (errors) => {\n          this.setState({ errors });\n          viewerOptions && viewerOptions.onError && viewerOptions.onError(errors);\n        }, onBeforeCreateLayers: (stage, specCapabilities) => {\n          attachSpecRoleToAxisTitle(stage, specCapabilities);\n        }, getTextColor: (o) => {\n          if (o.specRole) {\n            return colorFromString(this.viewerOptions.colors.clickableText);\n          } else if (o.metaData && o.metaData.search) {\n            return colorFromString(this.viewerOptions.colors.searchText);\n          } else {\n            return o.color;\n          }\n        }, getTextHighlightColor: (o) => {\n          if (o.specRole) {\n            return colorFromString(this.viewerOptions.colors.clickableTextHighlight);\n          } else if (o.metaData && o.metaData.search) {\n            return colorFromString(this.viewerOptions.colors.searchTextHighlight);\n          } else {\n            return [0, 0, 0, 0];\n          }\n        }, onTextClick: (e, text2) => {\n          if (e && text2) {\n            const pos = getPosition(e);\n            const rect2 = this.viewer.element.getBoundingClientRect();\n            pos.left += rect2.left;\n            pos.top += rect2.top;\n            const { specRole } = text2;\n            if (pos && specRole) {\n              const positionedColumnMapProps = Object.assign(Object.assign({}, this.getColumnMapBaseProps()), { collapseLabel: true, container: this.div, selectedColumnName: this.state.columns[specRole.role], onDismiss: () => {\n                this.setState({ positionedColumnMapProps: null });\n              }, specRole, left: pos.left, top: pos.top });\n              this.setState({ positionedColumnMapProps });\n            } else {\n              this.setState({ positionedColumnMapProps: null });\n            }\n          }\n        }, onNewViewStateTarget: () => this.newViewStateTarget });\n        if (this.viewer && this.viewer.presenter) {\n          const newPresenterStyle = getPresenterStyle(this.viewerOptions);\n          const mergePrenterStyle = Object.assign(Object.assign({}, this.viewer.presenter.style), newPresenterStyle);\n          this.viewer.presenter.style = mergePrenterStyle;\n          this.viewer.options = deepMerge(this.viewer.options, this.props.viewerOptions, this.viewerOptions);\n        }\n      }\n      signal(signalName, signalValue, newViewStateTarget) {\n        switch (signalName) {\n          case SignalNames.ColorBinCount:\n          case SignalNames.ColorReverse:\n          case SignalNames.MarkOpacity:\n            this.discardColorContextUpdates = false;\n            break;\n        }\n        this.newViewStateTarget = newViewStateTarget;\n        this.viewer.vegaViewGl.signal(signalName, signalValue);\n        this.viewer.vegaViewGl.runAsync().then(() => {\n          if (this.state.signalValues) {\n            this.state.signalValues[signalName] = signalValue;\n          }\n          this.discardColorContextUpdates = true;\n          this.newViewStateTarget = void 0;\n          this.props.onSignalChanged && this.props.onSignalChanged(signalName, signalValue);\n        });\n      }\n      manageColorToolbar() {\n        const canRemap = this.viewer.colorContexts && this.viewer.colorContexts.length > 1;\n        applyColorButtons(this.viewer.presenter, !!this.state.columns.color, {\n          themePalette: themePalettes[this.props.theme || \"\"],\n          canRemap,\n          isRemap: canRemap && this.viewer.currentColorContext > 0,\n          colorMapHandler: (remap) => {\n            this.viewer.currentColorContext = ~~remap;\n            this.viewer.renderSameLayout();\n            this.manageColorToolbar();\n          }\n        });\n      }\n      getInsight() {\n        return this.viewer.getInsight();\n      }\n      getSetup() {\n        return {\n          camera: this.state.holdCamera ? \"hold\" : this.state.camera,\n          renderer: this.state.renderer,\n          transition: getTransition(this.state),\n          transitionDurations: this.state.transitionDurations\n        };\n      }\n      setSetup(setup2, newState) {\n        newState.camera = void 0;\n        if (setup2) {\n          this.props.onSetupOptionsChanged && this.props.onSetupOptionsChanged(setup2);\n          const { camera, renderer, transition, transitionDurations } = setup2;\n          newState.renderer = renderer;\n          newState.transitionType = transition.type;\n          if (camera === \"hold\") {\n            newState.holdCamera = true;\n          } else {\n            newState.holdCamera = false;\n            newState.camera = camera;\n          }\n          if (transition.type === \"column\") {\n            newState.transitionColumn = transition.column;\n          } else if (transition.type === \"position\") {\n            newState.transitionDimension = transition.dimension;\n          }\n          if (transitionDurations) {\n            newState.transitionDurations = transitionDurations;\n            syncTansitionDurations(this.viewer, transitionDurations);\n          }\n        }\n      }\n      setInsight(historyAction, newState = {}, partialInsight = this.viewer.getInsight(), rebaseFilter, setup2) {\n        const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n        resetSelectedItemIndex(selectedItemIndex);\n        const historicInsight = Object.assign({ chart: null, scheme: null, columns: null, filter: null, rebaseFilter }, partialInsight);\n        const state = Object.assign({ filteredData: null, selectedItemIndex, search: createInputSearch(historicInsight.filter) }, newState);\n        const changeInsight = () => {\n          this.getColorContext = null;\n          this.setSetup(setup2, historicInsight);\n          this.changeInsight(historicInsight, historyAction, state, setup2);\n        };\n        const currentFilter = this.viewer.getInsight().filter;\n        if (rebaseFilter && currentFilter && historicInsight.filter) {\n          if (startsWith(historicInsight.filter, currentFilter)) {\n            changeInsight();\n          } else {\n            const { transitionDurations } = this.state;\n            const renderTime = transitionDurations.position + transitionDurations.stagger;\n            const allowAsyncRenderTime = renderTime + this.viewerOptions.filterRenderingTimerPadding;\n            this.viewer.reset().then(() => new Promise((resolve2, reject) => {\n              setTimeout(resolve2, allowAsyncRenderTime);\n            })).then(changeInsight);\n          }\n        } else {\n          changeInsight();\n        }\n      }\n      handleReviveSnapshot(snapshot, selectedSnapshotIndex) {\n        let handled = false;\n        if (this.props.onSnapshotClick) {\n          this.setState({ selectedSnapshotIndex });\n          handled = this.props.onSnapshotClick(snapshot, selectedSnapshotIndex);\n        }\n        if (!handled) {\n          this.reviveSnapshot(selectedSnapshotIndex);\n        }\n      }\n      reviveSnapshot(snapshotOrIndex) {\n        if (typeof snapshotOrIndex === \"number\") {\n          const selectedSnapshotIndex = snapshotOrIndex;\n          const snapshot = this.state.snapshots[selectedSnapshotIndex];\n          const newState = { note: snapshot.description, selectedSnapshotIndex };\n          if (!this.state.sidebarClosed) {\n            newState.sideTabId = SideTabId.Snapshots;\n            this.scrollSnapshotIntoView(selectedSnapshotIndex);\n          }\n          if (snapshot.insight) {\n            const { backgroundImage } = snapshot.insight;\n            this.imageHolder.showBackgroundImage = !!backgroundImage;\n            if (backgroundImage) {\n              this.imageHolder.img = {\n                src: backgroundImage.url,\n                height: backgroundImage.size.height,\n                width: backgroundImage.size.width\n              };\n            }\n          }\n          this.setInsight({ label: strings$1.labelHistoryReviveSnapshot }, newState, snapshot.insight, true, snapshot.setup);\n        } else {\n          const snapshot = snapshotOrIndex;\n          if (snapshot.insight) {\n            this.setInsight({ label: strings$1.labelHistoryReviveSnapshot }, { note: snapshot.description, selectedSnapshotIndex: -1 }, snapshot.insight, true, snapshot.setup);\n          } else {\n            this.setState({ note: snapshot.description, selectedSnapshotIndex: -1 });\n          }\n        }\n      }\n      load(data2, getPartialInsight, optionsOrPrefs) {\n        this.setState({ historyIndex: -1, historyItems: [] });\n        this.changeInsight({ columns: null }, { label: null, omit: true }, { note: null });\n        return new Promise((resolve2, reject) => {\n          const loadFinal = (dataContent) => {\n            let partialInsight;\n            this.prefs = optionsOrPrefs && optionsOrPrefs.chartPrefs || optionsOrPrefs || {};\n            this.imageHolder.backgroundImageColumnBounds = getBackgroundImageColumnBounds(dataContent.columns);\n            if (getPartialInsight) {\n              partialInsight = getPartialInsight(dataContent.columns);\n              initPrefs(this.prefs, partialInsight);\n            }\n            if (!partialInsight) {\n              const r = new RecommenderSummary(dataContent.columns, dataContent.data);\n              partialInsight = r.recommend();\n            }\n            partialInsight = Object.assign({ facetStyle: \"wrap\", filter: null, totalStyle: null, transform: null }, partialInsight);\n            if (partialInsight.chart === \"barchart\") {\n              partialInsight.chart = \"barchartV\";\n            }\n            const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n            const sideTabId = SideTabId.ChartType;\n            resetSelectedItemIndex(selectedItemIndex);\n            const newState = Object.assign({\n              camera: void 0,\n              columns: {},\n              dataFile,\n              dataContent,\n              snapshots: dataContent.snapshots || this.state.snapshots,\n              autoCompleteDistinctValues: {},\n              filteredData: null,\n              tooltipExclusions: optionsOrPrefs && optionsOrPrefs.tooltipExclusions || [],\n              selectedItemIndex,\n              sideTabId\n            }, partialInsight);\n            this.getColorContext = null;\n            ensureColumnsExist(newState.columns, dataContent.columns, newState.transform);\n            const errors = ensureColumnsPopulated(partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.chart, partialInsight === null || partialInsight === void 0 ? void 0 : partialInsight.totalStyle, newState.columns, dataContent.columns);\n            newState.errors = errors;\n            newState.transitionColumn = dataContent.columns[0];\n            const setup2 = optionsOrPrefs && optionsOrPrefs.setup;\n            this.setSetup(setup2, newState);\n            this.changeInsight(partialInsight, { label: strings$1.labelHistoryInit, insert: true }, newState, optionsOrPrefs && optionsOrPrefs.setup);\n            this.activateDataBrowserItem(sideTabId, this.state.dataScopeId);\n            resolve2();\n          };\n          let dataFile;\n          if (Array.isArray(data2)) {\n            return loadDataArray(data2, \"json\", optionsOrPrefs && optionsOrPrefs.columnTypes).then((result) => {\n              dataFile = {\n                type: \"json\"\n              };\n              loadFinal(result);\n            }).catch(reject);\n          } else {\n            dataFile = data2;\n            return loadDataFile(dataFile, optionsOrPrefs && optionsOrPrefs.columnTypes).then(loadFinal).catch(reject);\n          }\n        });\n      }\n      changeChartType(chart) {\n        const partialInsight = Object.assign({}, copyPrefToNewState(this.prefs, chart, \"*\", \"*\"));\n        const insight = Object.assign({ chart }, partialInsight);\n        const columns = deepMerge({}, partialInsight.columns, this.state.columns);\n        const { signalValues } = this.viewer.getInsight();\n        insight.signalValues = Object.assign(Object.assign({}, this.state.signalValues), signalValues);\n        insight.columns = Object.assign({}, columns);\n        insight.totalStyle = this.state.totalStyle;\n        let errors;\n        if (this.state.chart === \"scatterplot\" && (chart === \"barchart\" || chart === \"barchartV\")) {\n          insight.columns = Object.assign(Object.assign({}, columns), { sort: columns.y });\n        } else if (this.state.chart === \"scatterplot\" && chart === \"barchartH\") {\n          insight.columns = Object.assign(Object.assign({}, columns), { sort: columns.x });\n        } else if (chart === \"treemap\") {\n          insight.view = \"2d\";\n          if (!columns.size) {\n            let sizeColumn;\n            if (partialInsight && partialInsight.columns && partialInsight.columns.size) {\n              const prefSizeColumn = this.state.dataContent.columns.filter((c2) => c2.name === partialInsight.columns.size)[0];\n              if (prefSizeColumn && prefSizeColumn.quantitative) {\n                sizeColumn = prefSizeColumn;\n              }\n            }\n            if (!sizeColumn) {\n              sizeColumn = getTreemapColumn(this.state.dataContent.columns);\n            }\n            if (!sizeColumn) {\n              errors = [strings$1.errorColumnMustBeNumeric];\n            } else {\n              insight.columns = Object.assign(Object.assign({}, columns), { size: sizeColumn.name });\n            }\n          }\n        } else if (chart === \"stacks\") {\n          insight.view = \"3d\";\n        }\n        ensureColumnsExist(insight.columns, this.state.dataContent.columns, this.state.transform);\n        errors = ensureColumnsPopulated(chart, insight.totalStyle, insight.columns, this.state.dataContent.columns);\n        this.calculate(() => {\n          this.changeInsight(insight, { label: strings$1.labelHistoryChangeChartType(chartLabel(chart)) }, errors ? { errors, camera: void 0 } : { camera: void 0 });\n        });\n        return insight.columns;\n      }\n      calculate(calculating) {\n        this.setState({ calculating });\n      }\n      changeView(view) {\n        this.changeInsight({ view }, { label: view === \"2d\" ? strings$1.labelViewType2d : strings$1.labelViewType3d });\n      }\n      //state members which change the insight\n      changeInsight(partialInsight, historyAction, additionalUIState, historicSetup) {\n        if (!partialInsight.signalValues) {\n          partialInsight.signalValues = null;\n        }\n        if (partialInsight.chart === \"barchart\") {\n          partialInsight.chart = \"barchartV\";\n        }\n        this.addHistory(Object.assign(Object.assign({}, partialInsight), { historicSetup }), historyAction, additionalUIState);\n      }\n      addHistory(historicInsight, historyAction, additionalUIState) {\n        const setCleanState = (newState) => {\n          const cleanState = Object.assign(Object.assign({}, newState), additionalUIState);\n          if (!cleanState.note) {\n            cleanState.note = null;\n          }\n          delete cleanState.rebaseFilter;\n          if (this.viewer) {\n            const { signalValues } = this.viewer.getInsight();\n            cleanState.signalValues = Object.assign(Object.assign(Object.assign({}, this.state.signalValues), signalValues), cleanState.signalValues);\n          }\n          this.setState(cleanState);\n        };\n        if (historyAction.omit) {\n          setCleanState(historicInsight);\n          return;\n        }\n        const historyItems = this.state.historyItems.slice(0, this.state.historyIndex + 1);\n        const historyIndex = historyItems.length;\n        historyItems.push({ label: historyAction.label, historicInsight });\n        if (historyAction.insert) {\n          setCleanState({ historyIndex, historyItems });\n        } else {\n          setCleanState(Object.assign(Object.assign({}, historicInsight), { historyIndex, historyItems }));\n        }\n      }\n      replay(index2) {\n        return replay(this.state.historyItems, index2);\n      }\n      undo() {\n        const historyIndex = this.state.historyIndex - 1;\n        if (historyIndex < 0)\n          return;\n        this.doReplay(historyIndex);\n      }\n      redo(historyIndex = this.state.historyIndex + 1) {\n        if (historyIndex >= this.state.historyItems.length)\n          return;\n        this.doReplay(historyIndex);\n      }\n      doReplay(historyIndex) {\n        const newState = this.replay(historyIndex);\n        this.rebaseFilter = true;\n        this.setSetup(newState.historicSetup, newState);\n        this.setState(Object.assign(Object.assign({}, newState), { historyIndex }));\n      }\n      changespecCapabilities(specCapabilities) {\n        this.setState({ specCapabilities });\n      }\n      changeColumnMapping(role, column, options2) {\n        const columns = Object.assign({}, this.state.columns);\n        const label2 = column ? strings$1.labelHistoryMapColumn(role) : strings$1.labelHistoryUnMapColumn(role);\n        const final = () => {\n          const partialInsight = { columns, totalStyle: options2 ? options2.totalStyle : this.state.totalStyle };\n          const errors = ensureColumnsPopulated(this.state.chart, partialInsight.totalStyle, partialInsight.columns, this.state.dataContent.columns);\n          columns[role] = column && column.name;\n          this.changeInsight(partialInsight, { label: label2 }, errors ? { errors, camera: this.viewer.getCamera() } : { camera: this.viewer.getCamera() });\n        };\n        const _changeInsight = (newInsight, columnUpdate, historyAction) => {\n          newInsight.columns = deepMerge({}, columns, columnUpdate);\n          savePref(this.prefs, this.state.chart, \"*\", \"*\", { columns: columnUpdate });\n          this.changeInsight(newInsight, historyAction, { camera: this.viewer.getCamera() });\n        };\n        if (column) {\n          let columnUpdate;\n          switch (role) {\n            case \"facet\": {\n              copyPrefToNewState(this.prefs, this.state.chart, \"facet\", column.name);\n              const historicInsight = { columns, facetStyle: options2 ? options2.facetStyle : this.state.facetStyle };\n              columnUpdate = { facet: column.name };\n              _changeInsight(historicInsight, columnUpdate, { label: label2 });\n              break;\n            }\n            case \"color\": {\n              let calculating = null;\n              const historicInsight = { scheme: options2 && options2.scheme, columns, colorBin: this.state.colorBin };\n              if (!historicInsight.scheme) {\n                copyPrefToNewState(this.prefs, this.state.chart, \"color\", column.name);\n              }\n              if (!historicInsight.scheme) {\n                historicInsight.scheme = bestColorScheme(column, null, this.state.scheme);\n              }\n              if (!column.stats.hasColorData) {\n                historicInsight.directColor = false;\n                if (this.state.directColor !== historicInsight.directColor) {\n                  calculating = () => this._resize();\n                }\n              }\n              if (this.state.columns && this.state.columns.color && this.state.columns.color !== column.name) {\n                const currColorColumn = this.state.dataContent.columns.filter((c2) => c2.name === this.state.columns.color)[0];\n                if (column.isColorData != currColorColumn.isColorData) {\n                  calculating = () => this._resize();\n                }\n              }\n              this.ignoreSelectionChange = true;\n              this.viewer.deselect().then(() => {\n                this.ignoreSelectionChange = false;\n                requestAnimationFrame(() => {\n                  columnUpdate = { color: column.name };\n                  this.getColorContext = null;\n                  this.setState({ calculating });\n                  _changeInsight(historicInsight, columnUpdate, { label: label2 });\n                });\n              });\n              break;\n            }\n            case \"x\": {\n              copyPrefToNewState(this.prefs, this.state.chart, \"x\", column.name);\n              const historicInsight = { columns };\n              columnUpdate = { x: column.name };\n              _changeInsight(historicInsight, columnUpdate, { label: label2 });\n              break;\n            }\n            case \"size\": {\n              copyPrefToNewState(this.prefs, this.state.chart, \"size\", column.name);\n              const historicInsight = { totalStyle: options2 ? options2.totalStyle : this.state.totalStyle };\n              columnUpdate = { size: column.name };\n              _changeInsight(historicInsight, columnUpdate, { label: label2 });\n              break;\n            }\n            default: {\n              final();\n              break;\n            }\n          }\n        } else {\n          switch (role) {\n            case \"facet\": {\n              columns.facet = null;\n              columns.facetV = null;\n              this.changeInsight({ columns, facetStyle: \"wrap\" }, { label: label2 });\n              break;\n            }\n            default: {\n              final();\n              break;\n            }\n          }\n        }\n      }\n      setSideTabId(sideTabId, dataScopeId) {\n        if (sideTabId === SideTabId.Data && dataScopeId == null) {\n          dataScopeId = this.getBestDataScopeId();\n        }\n        if (dataScopeId == null) {\n          dataScopeId = this.state.dataScopeId;\n        }\n        const calculating = () => {\n          this.dialogFocusHandler.focus && this.dialogFocusHandler.focus();\n        };\n        this.setState({ sideTabId, dataScopeId, sidebarClosed: false, calculating });\n        this.activateDataBrowserItem(sideTabId, dataScopeId);\n      }\n      getBestDataScopeId() {\n        let dataScopeId;\n        const selectionState = this.viewer && this.viewer.getSelection();\n        if (selectionState && selectionState.selectedData && selectionState.selectedData.length) {\n          dataScopeId = DataScopeId.SelectedData;\n        } else if (this.state.filteredData) {\n          dataScopeId = DataScopeId.FilteredData;\n        } else {\n          dataScopeId = DataScopeId.AllData;\n        }\n        return dataScopeId;\n      }\n      activateDataBrowserItem(sideTabId, dataScopeId) {\n        if (!this.viewer)\n          return;\n        let itemToActivate;\n        if (sideTabId === SideTabId.Data) {\n          switch (dataScopeId) {\n            case DataScopeId.AllData: {\n              itemToActivate = this.state.dataContent && this.state.dataContent.data[this.state.selectedItemIndex[DataScopeId.AllData]];\n              break;\n            }\n            case DataScopeId.FilteredData: {\n              itemToActivate = this.state.filteredData && this.state.filteredData[this.state.selectedItemIndex[DataScopeId.FilteredData]];\n              break;\n            }\n            case DataScopeId.SelectedData: {\n              const selection = this.viewer.getSelection() || {};\n              itemToActivate = selection.selectedData && selection.selectedData[this.state.selectedItemIndex[DataScopeId.SelectedData]];\n              break;\n            }\n          }\n        }\n        this.silentActivation(itemToActivate);\n      }\n      silentActivation(itemToActivate) {\n        this.ignoreSelectionChange = true;\n        const done = () => {\n          this.ignoreSelectionChange = false;\n        };\n        if (itemToActivate) {\n          return this.viewer.activate(itemToActivate).then(done);\n        } else {\n          return this.viewer.deActivate().then(done);\n        }\n      }\n      sidebar(sidebarClosed, sidebarPinned) {\n        this.setState({ sidebarClosed, sidebarPinned });\n      }\n      resize() {\n        this.setState({ calculating: () => this._resize() });\n      }\n      _resize() {\n        this.changeInsight({ size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed) }, { label: \"resize\", omit: true });\n      }\n      viewerMounted(glDiv) {\n        this.setState({\n          size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed),\n          signalValues: this.state.signalValues\n          //keep initialized signalValues\n        });\n      }\n      getLayoutDivSize(pinned, closed) {\n        const div = pinned && !closed ? this.layoutDivPinned : this.layoutDivUnpinned;\n        return { height: div.offsetHeight, width: div.offsetWidth };\n      }\n      toggleableSearch(e, search) {\n        if (e.ctrlKey) {\n          this.setState({ search: createInputSearch(search) });\n          this.setSideTabId(SideTabId.Search);\n        } else {\n          const oldSelection = this.viewer.getSelection();\n          if (oldSelection.search) {\n            const result = compareGroups(ensureSearchExpressionGroupArray(oldSelection.search), search);\n            if (result.found) {\n              if (result.groups.length === 0) {\n                this.doDeselect();\n              } else {\n                this.doSelect(result.groups);\n              }\n            } else {\n              if (e.altKey || e.shiftKey) {\n                let group2 = true;\n                if (e.altKey) {\n                  search.clause = \"&&\";\n                } else if (e.shiftKey) {\n                  if (this.props.searchORDisabled) {\n                    group2 = false;\n                  } else {\n                    search.clause = \"||\";\n                  }\n                }\n                if (group2) {\n                  result.groups.push(search);\n                  this.doSelect(result.groups);\n                } else {\n                  this.doSelect(search);\n                }\n              } else {\n                this.doSelect(search);\n              }\n            }\n          } else {\n            this.doSelect(search);\n          }\n        }\n      }\n      doFilter(search, historicFilterChange) {\n        this.historicFilterChange = historicFilterChange;\n        this.viewer.filter(search);\n      }\n      doUnfilter(historicFilterChange) {\n        this.historicFilterChange = historicFilterChange;\n        this.viewer.reset();\n      }\n      doSelect(search) {\n        return this.viewer.select(search);\n      }\n      doDeselect() {\n        return this.viewer.deselect();\n      }\n      writeSnapshot(snapshot, editIndex) {\n        let { selectedSnapshotIndex } = this.state;\n        let snapshots;\n        if (editIndex >= 0) {\n          snapshots = [...this.state.snapshots];\n          snapshots[editIndex] = snapshot;\n          this.setState({ snapshots, selectedSnapshotIndex });\n        } else {\n          const note = snapshot.description;\n          snapshots = this.state.snapshots.concat(snapshot);\n          selectedSnapshotIndex = snapshots.length - 1;\n          this.scrollSnapshotIntoView(selectedSnapshotIndex);\n          this.setState({ sideTabId: SideTabId.Snapshots, snapshots, selectedSnapshotIndex, note });\n        }\n        this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n      }\n      scrollSnapshotIntoView(selectedSnapshotIndex) {\n        clearTimeout(this.scrollSnapshotTimer);\n        if (this.state.sidebarClosed)\n          return;\n        this.scrollSnapshotTimer = setTimeout(() => {\n          const selectedSnapshotElement = this.div.querySelector(`.snapshot:nth-child(${selectedSnapshotIndex + 1})`);\n          if (selectedSnapshotElement) {\n            selectedSnapshotElement.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n          }\n        }, 500);\n      }\n      componentDidMount() {\n        if (this.props.mounted) {\n          this.props.mounted(this);\n        }\n      }\n      render() {\n        var _a2, _b2, _c2;\n        const insight = getPureInsight(this.state);\n        const loaded2 = !!(insight.columns && this.state.dataContent);\n        if (loaded2) {\n          setInsightBackgroundImage(insight, this.imageHolder, this.state.columns);\n        }\n        const selectionState = this.viewer && this.viewer.getSelection() || {};\n        const selectionSearch = selectionState && selectionState.search;\n        const columnMapProps = this.getColumnMapBaseProps();\n        const datas = {};\n        datas[DataScopeId.AllData] = this.state.dataContent && this.state.dataContent.data;\n        datas[DataScopeId.FilteredData] = this.state.filteredData;\n        datas[DataScopeId.SelectedData] = selectionState && selectionState.selectedData;\n        if (this.state.calculating) {\n          requestAnimationFrame(() => {\n            if (this.state.calculating) {\n              this.state.calculating();\n              this.setState({ calculating: null });\n            }\n          });\n        }\n        const theme = this.props.theme || \"\";\n        const themePalette = themePalettes[theme];\n        let renderOptions;\n        if (loaded2) {\n          renderOptions = Object.assign(Object.assign({}, this.props.renderOptions), { rebaseFilter: () => this.rebaseFilter, initialColorContext: this.getColorContext && this.getColorContext(this.viewer.insight, insight), discardColorContextUpdates: () => this.discardColorContextUpdates, columns: (_a2 = this.state.dataContent) === null || _a2 === void 0 ? void 0 : _a2.columns });\n        }\n        return base$1.react.createElement(\n          \"div\",\n          { ref: (div) => {\n            if (div)\n              this.div = div;\n          }, className: classList(\"sanddance-explorer\", this.props.theme) },\n          base$1.react.createElement(Topbar, { collapseLabels: this.props.compactUI, historyIndex: this.state.historyIndex, historyItems: this.state.historyItems, undo: () => this.undo(), redo: () => this.redo(), logoClickUrl: this.props.logoClickUrl, logoClickTarget: this.props.logoClickTarget, themePalette, loaded: loaded2, doDeselect: this.doDeselect.bind(this), doFilter: this.doFilter.bind(this), doUnfilter: this.doUnfilter.bind(this), filter: this.state.filter, selectionSearch, selectionState, buttons: this.props.topBarButtonProps, iconButtons: this.props.topBarIconButtonProps, view: this.state.view, snapshotsHidden: (_b2 = this.props.snapshotProps) === null || _b2 === void 0 ? void 0 : _b2.hidden, snapshots: this.state.snapshots, onSnapshotPreviousClick: () => {\n            let selectedSnapshotIndex;\n            if (this.state.selectedSnapshotIndex === -1) {\n              selectedSnapshotIndex = this.state.snapshots.length - 1;\n            } else {\n              selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n              selectedSnapshotIndex--;\n              if (selectedSnapshotIndex < 0) {\n                selectedSnapshotIndex = this.state.snapshots.length - 1;\n              }\n            }\n            this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n          }, onSnapshotClick: () => this.snapshotEditor.editSnapshot(), onSnapshotNextClick: () => {\n            let selectedSnapshotIndex;\n            if (this.state.selectedSnapshotIndex === -1) {\n              selectedSnapshotIndex = 0;\n            } else {\n              selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n              selectedSnapshotIndex++;\n              if (selectedSnapshotIndex > this.state.snapshots.length - 1) {\n                selectedSnapshotIndex = 0;\n              }\n            }\n            this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n          }, onViewClick: () => {\n            const view = this.state.view === \"2d\" ? \"3d\" : \"2d\";\n            this.changeInsight({ view }, { label: view === \"2d\" ? strings$1.labelViewType2d : strings$1.labelViewType3d });\n          } }),\n          base$1.react.createElement(\n            \"div\",\n            { className: classList(\"sanddance-main\", this.state.sidebarPinned && \"pinned\", this.state.sidebarClosed && \"closed\", (insight.hideLegend || insight.directColor || !colorMapping(insight, this.state.dataContent && this.state.dataContent.columns)) && \"hide-legend\") },\n            base$1.react.createElement(\"div\", { ref: (div) => {\n              if (div && !this.layoutDivUnpinned)\n                this.layoutDivUnpinned = div;\n            }, className: \"sanddance-layout-unpinned\" }),\n            base$1.react.createElement(\"div\", { ref: (div) => {\n              if (div && !this.layoutDivPinned)\n                this.layoutDivPinned = div;\n            }, className: \"sanddance-layout-pinned\" }),\n            !loaded2 && base$1.react.createElement(\n              \"div\",\n              { className: \"loading\" },\n              base$1.react.createElement(base$1.fluentUI.Spinner, { size: base$1.fluentUI.SpinnerSize.large, label: strings$1.loading })\n            ),\n            base$1.react.createElement(Sidebar, { themePalette, calculating: !!this.state.calculating, closed: this.state.sidebarClosed, hideSidebarControls: this.props.hideSidebarControls, snapshotsHidden: (_c2 = this.props.snapshotProps) === null || _c2 === void 0 ? void 0 : _c2.hidden, pinned: this.state.sidebarPinned, disabled: !loaded2, dataScopeProps: {\n              themePalette,\n              compact: this.state.sidebarClosed,\n              onCompactClick: () => {\n                this.changeInsight({\n                  size: this.getLayoutDivSize(this.state.sidebarPinned, false)\n                }, {\n                  label: null,\n                  omit: true\n                }, {\n                  sidebarClosed: false\n                });\n              },\n              dataSet: this.props.datasetElement,\n              dataCount: loaded2 && {\n                all: this.state.dataContent && this.state.dataContent.data.length,\n                filtered: this.state.filteredData && this.state.filteredData.length,\n                selected: selectionState && selectionState.selectedData && selectionState.selectedData.length\n              },\n              active: this.state.sideTabId === SideTabId.Data,\n              onDataScopeClick: (dataScopeId) => this.setSideTabId(SideTabId.Data, dataScopeId),\n              selectedDataScope: this.state.dataScopeId,\n              disabled: !loaded2\n            }, onSideTabClick: (sideTabId) => {\n              if (sideTabId === SideTabId.Collapse || this.state.sideTabId === sideTabId) {\n                let { dataScopeId, sidebarClosed } = this.state;\n                if (sidebarClosed && sideTabId === SideTabId.Data) {\n                  dataScopeId = this.getBestDataScopeId();\n                }\n                sidebarClosed = !this.state.sidebarClosed;\n                this.changeInsight({\n                  size: this.getLayoutDivSize(this.state.sidebarPinned, sidebarClosed)\n                }, {\n                  label: null,\n                  omit: true\n                }, {\n                  dataScopeId,\n                  sidebarClosed\n                });\n              } else if (sideTabId === SideTabId.Pin) {\n                this.changeInsight({\n                  size: this.getLayoutDivSize(!this.state.sidebarPinned, this.state.sidebarClosed)\n                }, {\n                  label: null,\n                  omit: true\n                }, {\n                  sidebarPinned: !this.state.sidebarPinned\n                });\n              } else {\n                this.setSideTabId(sideTabId);\n              }\n            }, selectedSideTab: this.state.sideTabId }, loaded2 && (() => {\n              switch (this.state.sideTabId) {\n                case SideTabId.ChartType: {\n                  return base$1.react.createElement(Chart, Object.assign({ themePalette, collapseLabels: this.props.compactUI, tooltipExclusions: this.state.tooltipExclusions, toggleTooltipExclusion: (columnName) => {\n                    const tooltipExclusions = [...this.state.tooltipExclusions];\n                    const i = tooltipExclusions.indexOf(columnName);\n                    if (i < 0) {\n                      tooltipExclusions.push(columnName);\n                    } else {\n                      tooltipExclusions.splice(i, 1);\n                    }\n                    this.setState({ tooltipExclusions });\n                    this.props.onTooltipExclusionsChanged && this.props.onTooltipExclusionsChanged(tooltipExclusions);\n                  }, disabled: !loaded2 || this.state.sidebarClosed }, columnMapProps, { chart: this.state.chart, view: this.state.view, insightColumns: this.state.columns, onChangeSignal: (role, column, name, value2) => saveSignalValuePref(this.prefs, this.state.chart, role, column, name, value2) }));\n                }\n                case SideTabId.Color: {\n                  return base$1.react.createElement(Color, Object.assign({ compactUI: this.props.compactUI, specCapabilities: this.state.specCapabilities, disabled: !loaded2 || this.state.sidebarClosed }, columnMapProps, { dataContent: this.state.dataContent, scheme: this.state.scheme, colorBin: this.state.colorBin, colorBinSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s2) => s2.name === SignalNames.ColorBinCount)[0], colorReverseSignal: this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter((s2) => s2.name === SignalNames.ColorReverse)[0], colorColumn: this.state.columns.color, onColorBinChange: (colorBin) => {\n                    this.ignoreSelectionChange = true;\n                    this.viewer.deselect().then(() => {\n                      this.ignoreSelectionChange = false;\n                      requestAnimationFrame(() => {\n                        this.getColorContext = null;\n                        this.changeInsight({ colorBin }, { label: strings$1.labelHistoryColorBin });\n                        savePref(this.prefs, this.state.chart, \"color\", this.state.columns.color, { colorBin });\n                      });\n                    });\n                  }, onColorSchemeChange: (scheme2) => {\n                    this.changeColumnMapping(\"color\", this.state.dataContent.columns.filter((c2) => c2.name === this.state.columns.color)[0], { scheme: scheme2 });\n                    savePref(this.prefs, this.state.chart, \"color\", this.state.columns.color, { scheme: scheme2 });\n                  }, onColorBinCountChange: (value2) => {\n                    const signalValues = {};\n                    signalValues[SignalNames.ColorBinCount] = value2;\n                    savePref(this.prefs, this.state.chart, \"color\", this.state.columns.color, { signalValues });\n                  }, onColorReverseChange: (value2) => {\n                    this.getColorContext = null;\n                  }, directColor: this.state.directColor, onDirectColorChange: (directColor) => {\n                    this.changeInsight({ directColor }, { label: strings$1.labelHistoryDirectColor }, { calculating: () => this._resize() });\n                  } }));\n                }\n                case SideTabId.Data: {\n                  const data2 = datas[this.state.dataScopeId];\n                  let itemVisible = true;\n                  switch (this.state.dataScopeId) {\n                    case DataScopeId.AllData: {\n                      const item = this.state.selectedItemIndex[this.state.dataScopeId];\n                      itemVisible = this.state.dataContent && !this.state.filteredData || this.state.filteredData.indexOf(data2[item]) >= 0;\n                    }\n                  }\n                  return base$1.react.createElement(DataBrowser, { explorer: this, theme: this.props.theme, themePalette, disabled: !loaded2 || this.state.sidebarClosed, columns: this.state.dataContent && this.state.dataContent.columns, categoricalColumns: columnMapProps.categoricalColumns, quantitativeColumns: columnMapProps.quantitativeColumns, data: data2, displayName: this.state.dataFile && this.state.dataFile.displayName || strings$1.defaultFileName, nullMessage: dataBrowserNullMessages[this.state.dataScopeId], zeroMessage: dataBrowserZeroMessages[this.state.dataScopeId], index: this.state.selectedItemIndex[this.state.dataScopeId], itemVisible, dataExportHandler: this.props.dataExportHandler, selectedDataScope: this.state.dataScopeId, onDataScopeClick: (dataScopeId) => this.setSideTabId(SideTabId.Data, dataScopeId), onActivate: (row, index2) => {\n                    const selectedItemIndex = Object.assign({}, this.state.selectedItemIndex);\n                    selectedItemIndex[this.state.dataScopeId] = index2;\n                    this.setState({ selectedItemIndex });\n                    this.silentActivation(row);\n                  }, onSearch: (e, search) => {\n                    if (e.ctrlKey) {\n                      this.setState({ sideTabId: SideTabId.Search, search });\n                    } else {\n                      this.doSelect(search);\n                    }\n                  }, bingSearchDisabled: this.props.bingSearchDisabled, onUpdateColumnTypes: (columnTypes) => {\n                    this.load(this.state.dataFile, null, { prefs: this.prefs, columnTypes });\n                  } });\n                }\n                case SideTabId.Search: {\n                  return base$1.react.createElement(Search, { explorer: this, collapseLabels: this.props.compactUI, themePalette, disabled: !loaded2 || this.state.sidebarClosed, disableGroupOR: this.props.searchORDisabled, disableExpressionOR: this.props.searchORDisabled, initializer: {\n                    columns: columnMapProps.allColumns,\n                    search: this.state.search\n                  }, autoCompleteDistinctValues: this.state.autoCompleteDistinctValues, onSelect: (expr2) => this.doSelect(expr2), data: this.state.dataContent.data });\n                }\n                case SideTabId.Snapshots: {\n                  return base$1.react.createElement(Snapshots, Object.assign({}, this.props.snapshotProps, { editor: this.snapshotEditor, themePalette, explorer: this, snapshots: this.state.snapshots, selectedSnapshotIndex: this.state.selectedSnapshotIndex, onClearSnapshots: () => {\n                    const snapshots = [];\n                    this.setState({ snapshots, selectedSnapshotIndex: -1 });\n                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                  }, onWriteSnapshot: (s2, i) => this.writeSnapshot(s2, i), onRemoveSnapshot: (i) => {\n                    const snapshots = [...this.state.snapshots];\n                    snapshots.splice(i, 1);\n                    let { selectedSnapshotIndex } = this.state;\n                    if (i === selectedSnapshotIndex) {\n                      selectedSnapshotIndex = -1;\n                    } else if (selectedSnapshotIndex > i) {\n                      selectedSnapshotIndex--;\n                    }\n                    this.setState({ snapshots, selectedSnapshotIndex });\n                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                  }, onSnapshotClick: (snapshot, selectedSnapshotIndex) => {\n                    this.setState({ selectedSnapshotIndex });\n                    this.calculate(() => {\n                      this.handleReviveSnapshot(snapshot, selectedSnapshotIndex);\n                    });\n                  }, onMoveUp: (i) => {\n                    if (i > 0) {\n                      const snapshots = [...this.state.snapshots];\n                      const temp2 = snapshots[i - 1];\n                      snapshots[i - 1] = snapshots[i];\n                      snapshots[i] = temp2;\n                      let { selectedSnapshotIndex } = this.state;\n                      if (i === selectedSnapshotIndex) {\n                        selectedSnapshotIndex = i - 1;\n                      } else if (i - 1 === selectedSnapshotIndex) {\n                        selectedSnapshotIndex = i;\n                      }\n                      this.setState({ snapshots, selectedSnapshotIndex });\n                      this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                    }\n                  }, onMoveDown: (i) => {\n                    if (i < this.state.snapshots.length - 1) {\n                      const snapshots = [...this.state.snapshots];\n                      const temp2 = snapshots[i + 1];\n                      snapshots[i + 1] = snapshots[i];\n                      snapshots[i] = temp2;\n                      let { selectedSnapshotIndex } = this.state;\n                      if (i === selectedSnapshotIndex) {\n                        selectedSnapshotIndex = i + 1;\n                      } else if (i + 1 === selectedSnapshotIndex) {\n                        selectedSnapshotIndex = i;\n                      }\n                      this.setState({ snapshots, selectedSnapshotIndex });\n                      this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                    }\n                  } }));\n                }\n                case SideTabId.History: {\n                  return base$1.react.createElement(History, { explorer: this, themePalette, historyIndex: this.state.historyIndex, historyItems: this.state.historyItems, redo: (i) => this.redo(i) });\n                }\n                case SideTabId.Transition: {\n                  return base$1.react.createElement(TransitionEditor, Object.assign({}, columnMapProps, this.state, { compactUI: this.props.compactUI, explorer: this, themePalette, changeSetup: (newState, affectsStagger) => {\n                    const calculating = () => {\n                      if (affectsStagger) {\n                        this.viewer.assignTransitionStagger(getTransition(this.state));\n                      }\n                      this.props.onSetupOptionsChanged && this.props.onSetupOptionsChanged(this.getSetup());\n                    };\n                    if (newState) {\n                      this.setState(Object.assign(Object.assign({}, newState), { calculating }));\n                    } else {\n                      calculating();\n                    }\n                  } }));\n                }\n                case SideTabId.Settings: {\n                  return base$1.react.createElement(Settings, { explorer: this, dataFile: this.state.dataFile, scheme: this.state.scheme, hideLegend: this.state.hideLegend, onToggleLegend: (hideLegend) => this.setState({ hideLegend, calculating: () => this._resize() }), hideAxes: this.state.hideAxes, onToggleAxes: (hideAxes) => this.setState({ calculating: () => this.setState({ hideAxes }) }), additionalSettings: this.props.additionalSettings }, this.props.systemInfoChildren);\n                }\n              }\n            })()),\n            loaded2 && base$1.react.createElement(\n              \"div\",\n              { className: \"sanddance-view\" },\n              base$1.react.createElement(Viewer, { renderOptions, viewerOptions: this.viewerOptions, ref: (reactViewer) => {\n                if (reactViewer) {\n                  this.viewer = reactViewer.viewer;\n                }\n              }, onView: (renderResult) => {\n                this.rebaseFilter = false;\n                this.changespecCapabilities(renderResult.specResult.errors ? renderResult.specResult.specCapabilities : this.viewer.specCapabilities);\n                this.getColorContext = (oldInsight, newInsight) => {\n                  if (!oldInsight && !newInsight) {\n                    return null;\n                  }\n                  if (!oldInsight || !newInsight) {\n                    return null;\n                  }\n                  if (oldInsight.scheme !== newInsight.scheme) {\n                    return null;\n                  }\n                  if (oldInsight.columns.color !== newInsight.columns.color) {\n                    return null;\n                  }\n                  if (oldInsight.directColor != newInsight.directColor) {\n                    return null;\n                  }\n                  return this.viewer.colorContexts && this.viewer.colorContexts[this.viewer.currentColorContext];\n                };\n                removeTabIndex(this.viewer);\n                this.props.onView && this.props.onView();\n              }, onError: (e) => {\n                this.props.onError && this.props.onError(e);\n              }, data: this.state.dataContent.data, insight, setup: this.getSetup(), onMount: (el) => this.viewerMounted(el) }),\n              this.state.note && base$1.react.createElement(\n                \"div\",\n                { className: \"sanddance-note\" },\n                base$1.react.createElement(IconButton$1, { className: \"cancel\", themePalette, title: strings$1.buttonClose, iconName: \"Cancel\", onClick: () => this.setState({ note: null }) }),\n                base$1.react.createElement(\"div\", null, this.state.note)\n              ),\n              base$1.react.createElement(Renderer$1, { explorer: this, advanced: this.state.renderer.advanced, advancedOptions: this.state.renderer.advancedOptions, basicOptions: this.state.renderer.basicOptions, themePalette, onHomeClick: () => {\n                this.setState({ camera: void 0 });\n                this.viewer.presenter.homeCamera();\n              } })\n            ),\n            base$1.react.createElement(Dialog$1, { title: strings$1.labelError, hidden: !this.state.errors, onDismiss: () => {\n              this.setState({ errors: null });\n            } }, this.state.errors && this.state.errors.map((error2, i) => base$1.react.createElement(\"div\", { key: i }, error2))),\n            base$1.react.createElement(SnapshotEditor, Object.assign({ ref: (se) => this.snapshotEditor = se }, this.props.snapshotProps, { explorer: this, onWriteSnapshot: (s2, i) => this.writeSnapshot(s2, i), theme: this.props.theme, themePalette }))\n          ),\n          this.state.positionedColumnMapProps && base$1.react.createElement(PositionedColumnMap, Object.assign({}, this.state.positionedColumnMapProps))\n        );\n      }\n      getColumnMapBaseProps() {\n        const allColumns = this.state.dataContent && this.state.dataContent.columns.filter((c2) => !isInternalFieldName(c2.name, true));\n        const quantitativeColumns = allColumns && allColumns.filter((c2) => c2.quantitative);\n        const categoricalColumns = allColumns && allColumns.filter((c2) => !c2.quantitative);\n        const props = {\n          changeColumnMapping: (role, columnOrRole, defaultColumn, options2) => {\n            let column;\n            if (typeof columnOrRole === \"string\") {\n              const columnName = this.state.columns[columnOrRole];\n              column = allColumns.filter((c2) => c2.name === columnName)[0] || defaultColumn;\n            } else {\n              column = columnOrRole;\n            }\n            this.changeColumnMapping(role, column, options2);\n          },\n          facetStyle: this.state.facetStyle,\n          totalStyle: this.state.totalStyle,\n          allColumns,\n          quantitativeColumns,\n          categoricalColumns,\n          specCapabilities: this.state.specCapabilities,\n          explorer: this\n        };\n        return props;\n      }\n    }\n    return new __Explorer(_props);\n  }\n  const Explorer = _Explorer;\n  const base$1 = {\n    fluentUI: null,\n    react: null,\n    reactDOM: null\n  };\n  function use$2(fluentUI2, react, reactDOM, vega2) {\n    use$3(react, reactDOM, vega2);\n    base$1.fluentUI = fluentUI2;\n    base$1.react = react;\n    base$1.reactDOM = reactDOM;\n    BackgroundImageEditor.prototype = react.Component.prototype;\n    Chart.prototype = react.Component.prototype;\n    ColumnTypeChanger.prototype = react.Component.prototype;\n    DataExportPicker.prototype = react.Component.prototype;\n    Explorer.prototype = react.Component.prototype;\n    PositionedColumnMap.prototype = react.Component.prototype;\n    Renderer$1.prototype = react.Component.prototype;\n    Search.prototype = react.Component.prototype;\n    SnapshotEditor.prototype = react.Component.prototype;\n    Snapshots.prototype = react.Component.prototype;\n    Settings.prototype = react.Component.prototype;\n    TransitionEditor.prototype = react.Component.prototype;\n  }\n  function Dialog$1(props) {\n    return base$1.react.createElement(\n      base$1.fluentUI.Dialog,\n      Object.assign({}, props, { dialogContentProps: Object.assign({\n        type: base$1.fluentUI.DialogType.normal,\n        title: props.title\n      }, props.dialogContentProps) }),\n      base$1.react.createElement(\"div\", { onKeyUp: (e) => {\n        e.nativeEvent.stopImmediatePropagation();\n      } }, props.children),\n      base$1.react.createElement(\n        base$1.fluentUI.DialogFooter,\n        null,\n        props.buttons,\n        base$1.react.createElement(base$1.fluentUI.DefaultButton, { iconProps: { iconName: \"Cancel\" }, onClick: props.onDismiss, text: strings$1.buttonClose })\n      )\n    );\n  }\n  const index$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Dialog: Dialog$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const SandDanceExplorer = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Explorer,\n    SandDance: index$4,\n    SandDanceReact: index$3,\n    get SideTabId() {\n      return SideTabId;\n    },\n    capabilities,\n    controls: index$2,\n    getColorSettingsFromThemePalette,\n    getEmbedHTML,\n    themePalettes,\n    use: use$2,\n    util: util$2,\n    version: version$2\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const base = {\n    fluentUI: null\n  };\n  function use$1(fluentUI2, vega2) {\n    use$2(fluentUI2, React__namespace, ReactDOM__namespace, vega2);\n    base.fluentUI = fluentUI2;\n  }\n  var extendStatics = function(d2, b2) {\n    extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d3, b3) {\n      d3.__proto__ = b3;\n    } || function(d3, b3) {\n      for (var p in b3) if (Object.prototype.hasOwnProperty.call(b3, p)) d3[p] = b3[p];\n    };\n    return extendStatics(d2, b2);\n  };\n  function __extends(d2, b2) {\n    if (typeof b2 !== \"function\" && b2 !== null)\n      throw new TypeError(\"Class extends value \" + String(b2) + \" is not a constructor or null\");\n    extendStatics(d2, b2);\n    function __() {\n      this.constructor = d2;\n    }\n    d2.prototype = b2 === null ? Object.create(b2) : (__.prototype = b2.prototype, new __());\n  }\n  var __assign$1 = function() {\n    __assign$1 = Object.assign || function __assign2(t) {\n      for (var s2, i = 1, n = arguments.length; i < n; i++) {\n        s2 = arguments[i];\n        for (var p in s2) if (Object.prototype.hasOwnProperty.call(s2, p)) t[p] = s2[p];\n      }\n      return t;\n    };\n    return __assign$1.apply(this, arguments);\n  };\n  function __rest(s2, e) {\n    var t = {};\n    for (var p in s2) if (Object.prototype.hasOwnProperty.call(s2, p) && e.indexOf(p) < 0)\n      t[p] = s2[p];\n    if (s2 != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s2); i < p.length; i++) {\n        if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s2, p[i]))\n          t[p[i]] = s2[p[i]];\n      }\n    return t;\n  }\n  function __decorate(decorators, target2, key2, desc) {\n    var c2 = arguments.length, r = c2 < 3 ? target2 : desc === null ? desc = Object.getOwnPropertyDescriptor(target2, key2) : desc, d2;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target2, key2, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d2 = decorators[i]) r = (c2 < 3 ? d2(r) : c2 > 3 ? d2(target2, key2, r) : d2(target2, key2)) || r;\n    return c2 > 3 && r && Object.defineProperty(target2, key2, r), r;\n  }\n  function __spreadArray(to, from, pack2) {\n    if (pack2 || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n        if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n        ar[i] = from[i];\n      }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n  }\n  typeof SuppressedError === \"function\" ? SuppressedError : function(error2, suppressed, message) {\n    var e = new Error(message);\n    return e.name = \"SuppressedError\", e.error = error2, e.suppressed = suppressed, e;\n  };\n  var packagesCache = {};\n  var _win = void 0;\n  try {\n    _win = window;\n  } catch (e) {\n  }\n  function setVersion(packageName, packageVersion) {\n    if (typeof _win !== \"undefined\") {\n      var packages = _win.__packages__ = _win.__packages__ || {};\n      if (!packages[packageName] || !packagesCache[packageName]) {\n        packagesCache[packageName] = packageVersion;\n        var versions = packages[packageName] = packages[packageName] || [];\n        versions.push(packageVersion);\n      }\n    }\n  }\n  setVersion(\"@fluentui/set-version\", \"6.0.0\");\n  function canUseDOM() {\n    return (\n      // eslint-disable-next-line no-restricted-globals\n      typeof window !== \"undefined\" && !!// eslint-disable-next-line no-restricted-globals, @typescript-eslint/no-deprecated\n      (window.document && window.document.createElement)\n    );\n  }\n  var _window$1 = void 0;\n  try {\n    _window$1 = window;\n  } catch (e) {\n  }\n  function getWindow(rootElement) {\n    if (!canUseDOM() || typeof _window$1 === \"undefined\") {\n      return void 0;\n    } else {\n      var el = rootElement;\n      return el && el.ownerDocument && el.ownerDocument.defaultView ? el.ownerDocument.defaultView : _window$1;\n    }\n  }\n  var Async = (\n    /** @class */\n    (function() {\n      function Async2(parent, onError) {\n        this._timeoutIds = null;\n        this._immediateIds = null;\n        this._intervalIds = null;\n        this._animationFrameIds = null;\n        this._isDisposed = false;\n        this._parent = parent || null;\n        this._onErrorHandler = onError;\n        this._noop = function() {\n        };\n      }\n      Async2.prototype.dispose = function() {\n        var id2;\n        this._isDisposed = true;\n        this._parent = null;\n        if (this._timeoutIds) {\n          for (id2 in this._timeoutIds) {\n            if (this._timeoutIds.hasOwnProperty(id2)) {\n              this.clearTimeout(parseInt(id2, 10));\n            }\n          }\n          this._timeoutIds = null;\n        }\n        if (this._immediateIds) {\n          for (id2 in this._immediateIds) {\n            if (this._immediateIds.hasOwnProperty(id2)) {\n              this.clearImmediate(parseInt(id2, 10));\n            }\n          }\n          this._immediateIds = null;\n        }\n        if (this._intervalIds) {\n          for (id2 in this._intervalIds) {\n            if (this._intervalIds.hasOwnProperty(id2)) {\n              this.clearInterval(parseInt(id2, 10));\n            }\n          }\n          this._intervalIds = null;\n        }\n        if (this._animationFrameIds) {\n          for (id2 in this._animationFrameIds) {\n            if (this._animationFrameIds.hasOwnProperty(id2)) {\n              this.cancelAnimationFrame(parseInt(id2, 10));\n            }\n          }\n          this._animationFrameIds = null;\n        }\n      };\n      Async2.prototype.setTimeout = function(callback, duration) {\n        var _this = this;\n        var timeoutId = 0;\n        if (!this._isDisposed) {\n          if (!this._timeoutIds) {\n            this._timeoutIds = {};\n          }\n          timeoutId = setTimeout(function() {\n            try {\n              if (_this._timeoutIds) {\n                delete _this._timeoutIds[timeoutId];\n              }\n              callback.apply(_this._parent);\n            } catch (e) {\n              _this._logError(e);\n            }\n          }, duration);\n          this._timeoutIds[timeoutId] = true;\n        }\n        return timeoutId;\n      };\n      Async2.prototype.clearTimeout = function(id2) {\n        if (this._timeoutIds && this._timeoutIds[id2]) {\n          clearTimeout(id2);\n          delete this._timeoutIds[id2];\n        }\n      };\n      Async2.prototype.setImmediate = function(callback, targetElement) {\n        var _this = this;\n        var immediateId = 0;\n        var win = getWindow(targetElement);\n        if (!this._isDisposed) {\n          if (!this._immediateIds) {\n            this._immediateIds = {};\n          }\n          var setImmediateCallback = function() {\n            try {\n              if (_this._immediateIds) {\n                delete _this._immediateIds[immediateId];\n              }\n              callback.apply(_this._parent);\n            } catch (e) {\n              _this._logError(e);\n            }\n          };\n          immediateId = win.setTimeout(setImmediateCallback, 0);\n          this._immediateIds[immediateId] = true;\n        }\n        return immediateId;\n      };\n      Async2.prototype.clearImmediate = function(id2, targetElement) {\n        var win = getWindow(targetElement);\n        if (this._immediateIds && this._immediateIds[id2]) {\n          win.clearTimeout(id2);\n          delete this._immediateIds[id2];\n        }\n      };\n      Async2.prototype.setInterval = function(callback, duration) {\n        var _this = this;\n        var intervalId = 0;\n        if (!this._isDisposed) {\n          if (!this._intervalIds) {\n            this._intervalIds = {};\n          }\n          intervalId = setInterval(function() {\n            try {\n              callback.apply(_this._parent);\n            } catch (e) {\n              _this._logError(e);\n            }\n          }, duration);\n          this._intervalIds[intervalId] = true;\n        }\n        return intervalId;\n      };\n      Async2.prototype.clearInterval = function(id2) {\n        if (this._intervalIds && this._intervalIds[id2]) {\n          clearInterval(id2);\n          delete this._intervalIds[id2];\n        }\n      };\n      Async2.prototype.throttle = function(func, wait, options2) {\n        var _this = this;\n        if (this._isDisposed) {\n          return this._noop;\n        }\n        var waitMS = wait || 0;\n        var leading = true;\n        var trailing = true;\n        var lastExecuteTime = 0;\n        var lastResult;\n        var lastArgs;\n        var timeoutId = null;\n        if (options2 && typeof options2.leading === \"boolean\") {\n          leading = options2.leading;\n        }\n        if (options2 && typeof options2.trailing === \"boolean\") {\n          trailing = options2.trailing;\n        }\n        var callback = function(userCall) {\n          var now2 = Date.now();\n          var delta = now2 - lastExecuteTime;\n          var waitLength = leading ? waitMS - delta : waitMS;\n          if (delta >= waitMS && (!userCall || leading)) {\n            lastExecuteTime = now2;\n            if (timeoutId) {\n              _this.clearTimeout(timeoutId);\n              timeoutId = null;\n            }\n            lastResult = func.apply(_this._parent, lastArgs);\n          } else if (timeoutId === null && trailing) {\n            timeoutId = _this.setTimeout(callback, waitLength);\n          }\n          return lastResult;\n        };\n        var resultFunction = (function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          lastArgs = args;\n          return callback(true);\n        });\n        return resultFunction;\n      };\n      Async2.prototype.debounce = function(func, wait, options2) {\n        var _this = this;\n        if (this._isDisposed) {\n          var noOpFunction = (function() {\n          });\n          noOpFunction.cancel = function() {\n            return;\n          };\n          noOpFunction.flush = (function() {\n            return null;\n          });\n          noOpFunction.pending = function() {\n            return false;\n          };\n          return noOpFunction;\n        }\n        var waitMS = wait || 0;\n        var leading = false;\n        var trailing = true;\n        var maxWait = null;\n        var lastCallTime = 0;\n        var lastExecuteTime = Date.now();\n        var lastResult;\n        var lastArgs;\n        var timeoutId = null;\n        if (options2 && typeof options2.leading === \"boolean\") {\n          leading = options2.leading;\n        }\n        if (options2 && typeof options2.trailing === \"boolean\") {\n          trailing = options2.trailing;\n        }\n        if (options2 && typeof options2.maxWait === \"number\" && !isNaN(options2.maxWait)) {\n          maxWait = options2.maxWait;\n        }\n        var markExecuted = function(time2) {\n          if (timeoutId) {\n            _this.clearTimeout(timeoutId);\n            timeoutId = null;\n          }\n          lastExecuteTime = time2;\n        };\n        var invokeFunction = function(time2) {\n          markExecuted(time2);\n          lastResult = func.apply(_this._parent, lastArgs);\n        };\n        var callback = function(userCall) {\n          var now2 = Date.now();\n          var executeImmediately = false;\n          if (userCall) {\n            if (leading && now2 - lastCallTime >= waitMS) {\n              executeImmediately = true;\n            }\n            lastCallTime = now2;\n          }\n          var delta = now2 - lastCallTime;\n          var waitLength = waitMS - delta;\n          var maxWaitDelta = now2 - lastExecuteTime;\n          var maxWaitExpired = false;\n          if (maxWait !== null) {\n            if (maxWaitDelta >= maxWait && timeoutId) {\n              maxWaitExpired = true;\n            } else {\n              waitLength = Math.min(waitLength, maxWait - maxWaitDelta);\n            }\n          }\n          if (delta >= waitMS || maxWaitExpired || executeImmediately) {\n            invokeFunction(now2);\n          } else if ((timeoutId === null || !userCall) && trailing) {\n            timeoutId = _this.setTimeout(callback, waitLength);\n          }\n          return lastResult;\n        };\n        var pending = function() {\n          return !!timeoutId;\n        };\n        var cancel = function() {\n          if (pending()) {\n            markExecuted(Date.now());\n          }\n        };\n        var flush2 = function() {\n          if (pending()) {\n            invokeFunction(Date.now());\n          }\n          return lastResult;\n        };\n        var resultFunction = (function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          lastArgs = args;\n          return callback(true);\n        });\n        resultFunction.cancel = cancel;\n        resultFunction.flush = flush2;\n        resultFunction.pending = pending;\n        return resultFunction;\n      };\n      Async2.prototype.requestAnimationFrame = function(callback, targetElement) {\n        var _this = this;\n        var animationFrameId = 0;\n        var win = getWindow(targetElement);\n        if (!this._isDisposed) {\n          if (!this._animationFrameIds) {\n            this._animationFrameIds = {};\n          }\n          var animationFrameCallback = function() {\n            try {\n              if (_this._animationFrameIds) {\n                delete _this._animationFrameIds[animationFrameId];\n              }\n              callback.apply(_this._parent);\n            } catch (e) {\n              _this._logError(e);\n            }\n          };\n          animationFrameId = win.requestAnimationFrame ? win.requestAnimationFrame(animationFrameCallback) : win.setTimeout(animationFrameCallback, 0);\n          this._animationFrameIds[animationFrameId] = true;\n        }\n        return animationFrameId;\n      };\n      Async2.prototype.cancelAnimationFrame = function(id2, targetElement) {\n        var win = getWindow(targetElement);\n        if (this._animationFrameIds && this._animationFrameIds[id2]) {\n          win.cancelAnimationFrame ? win.cancelAnimationFrame(id2) : win.clearTimeout(id2);\n          delete this._animationFrameIds[id2];\n        }\n      };\n      Async2.prototype._logError = function(e) {\n        if (this._onErrorHandler) {\n          this._onErrorHandler(e);\n        }\n      };\n      return Async2;\n    })()\n  );\n  function isVirtualElement(element2) {\n    return element2 && !!element2._virtual;\n  }\n  function getVirtualParent(child) {\n    var parent;\n    if (child && isVirtualElement(child)) {\n      parent = child._virtual.parent;\n    }\n    return parent;\n  }\n  function getParent(child, allowVirtualParents) {\n    var _a2, _b2;\n    if (allowVirtualParents === void 0) {\n      allowVirtualParents = true;\n    }\n    if (!child) {\n      return null;\n    }\n    var parent = allowVirtualParents && getVirtualParent(child);\n    if (parent) {\n      return parent;\n    }\n    if (typeof child.assignedElements !== \"function\" && ((_a2 = child.assignedSlot) === null || _a2 === void 0 ? void 0 : _a2.parentNode)) {\n      return child.assignedSlot;\n    } else if (((_b2 = child.parentNode) === null || _b2 === void 0 ? void 0 : _b2.nodeType) === 11) {\n      return child.parentNode.host;\n    } else {\n      return child.parentNode;\n    }\n  }\n  function elementContains(parent, child, allowVirtualParents) {\n    if (allowVirtualParents === void 0) {\n      allowVirtualParents = true;\n    }\n    var isContained = false;\n    if (parent && child) {\n      if (allowVirtualParents) {\n        if (parent === child) {\n          isContained = true;\n        } else {\n          isContained = false;\n          while (child) {\n            var nextParent = getParent(child);\n            if (nextParent === parent) {\n              isContained = true;\n              break;\n            }\n            child = nextParent;\n          }\n        }\n      } else if (parent.contains) {\n        isContained = parent.contains(child);\n      }\n    }\n    return isContained;\n  }\n  function findElementRecursive(element2, matchFunction, doc) {\n    doc !== null && doc !== void 0 ? doc : doc = document;\n    if (!element2 || element2 === doc.body || element2 instanceof Document) {\n      return null;\n    }\n    return matchFunction(element2) ? element2 : findElementRecursive(getParent(element2), matchFunction);\n  }\n  function elementContainsAttribute(element2, attribute, doc) {\n    var elementMatch = findElementRecursive(element2, function(testElement) {\n      return testElement.hasAttribute(attribute);\n    }, doc);\n    return elementMatch && elementMatch.getAttribute(attribute);\n  }\n  var getActiveElement = function(doc) {\n    var ae = doc.activeElement;\n    while (ae === null || ae === void 0 ? void 0 : ae.shadowRoot) {\n      ae = ae.shadowRoot.activeElement;\n    }\n    return ae;\n  };\n  function getChildren(parent, allowVirtualChildren) {\n    if (allowVirtualChildren === void 0) {\n      allowVirtualChildren = true;\n    }\n    var children2 = [];\n    if (parent) {\n      for (var i = 0; i < parent.children.length; i++) {\n        children2.push(parent.children.item(i));\n      }\n      if (allowVirtualChildren && isVirtualElement(parent)) {\n        children2.push.apply(children2, parent._virtual.children);\n      }\n    }\n    return children2;\n  }\n  var getEventTarget = function(event2) {\n    var target2 = event2.target;\n    if (target2 && target2.shadowRoot) {\n      target2 = event2.composedPath()[0];\n    }\n    return target2;\n  };\n  var DATA_PORTAL_ATTRIBUTE = \"data-portal-element\";\n  function setPortalAttribute(element2) {\n    element2.setAttribute(DATA_PORTAL_ATTRIBUTE, \"true\");\n  }\n  function portalContainsElement(target2, parent, doc) {\n    var _a2;\n    var elementMatch = findElementRecursive(target2, function(testElement) {\n      var _a3;\n      return parent === testElement || !!((_a3 = testElement.hasAttribute) === null || _a3 === void 0 ? void 0 : _a3.call(testElement, DATA_PORTAL_ATTRIBUTE));\n    }, doc);\n    return elementMatch !== null && !!((_a2 = elementMatch.hasAttribute) === null || _a2 === void 0 ? void 0 : _a2.call(elementMatch, DATA_PORTAL_ATTRIBUTE));\n  }\n  function setVirtualParent(child, parent) {\n    var virtualChild = child;\n    var virtualParent = parent;\n    if (!virtualChild._virtual) {\n      virtualChild._virtual = {\n        children: []\n      };\n    }\n    var oldParent = virtualChild._virtual.parent;\n    if (oldParent && oldParent !== parent) {\n      var index2 = oldParent._virtual.children.indexOf(virtualChild);\n      if (index2 > -1) {\n        oldParent._virtual.children.splice(index2, 1);\n      }\n    }\n    virtualChild._virtual.parent = virtualParent || void 0;\n    if (virtualParent) {\n      if (!virtualParent._virtual) {\n        virtualParent._virtual = {\n          children: []\n        };\n      }\n      virtualParent._virtual.children.push(virtualChild);\n    }\n  }\n  function getDocument(rootElement) {\n    if (!canUseDOM() || typeof document === \"undefined\") {\n      return void 0;\n    } else {\n      var el = rootElement;\n      return el && el.ownerDocument ? el.ownerDocument : document;\n    }\n  }\n  var IS_FOCUSABLE_ATTRIBUTE$1 = \"data-is-focusable\";\n  var IS_VISIBLE_ATTRIBUTE = \"data-is-visible\";\n  var FOCUSZONE_ID_ATTRIBUTE$1 = \"data-focuszone-id\";\n  var FOCUSZONE_SUB_ATTRIBUTE = \"data-is-sub-focuszone\";\n  function getFirstFocusable(rootElement, currentElement, includeElementsInFocusZones, includeShadowRoots) {\n    return getNextElement(rootElement, currentElement, true, false, false, includeElementsInFocusZones, void 0, void 0, void 0, includeShadowRoots);\n  }\n  function getLastFocusable(rootElement, currentElement, includeElementsInFocusZones, includeShadowRoots) {\n    return getPreviousElement(rootElement, currentElement, true, false, true, includeElementsInFocusZones, void 0, void 0, includeShadowRoots);\n  }\n  function getFirstTabbable(rootElement, currentElement, includeElementsInFocusZones, checkNode, includeShadowRoots) {\n    return getNextElement(rootElement, currentElement, checkNode, false, false, includeElementsInFocusZones, false, true, void 0, includeShadowRoots);\n  }\n  function getLastTabbable(rootElement, currentElement, includeElementsInFocusZones, checkNode, includeShadowRoots) {\n    return getPreviousElement(rootElement, currentElement, checkNode, false, true, includeElementsInFocusZones, false, true, includeShadowRoots);\n  }\n  function focusFirstChild(rootElement, bypassHiddenElements, includeShadowRoots) {\n    var element2 = getNextElement(rootElement, rootElement, true, false, false, true, void 0, void 0, bypassHiddenElements, includeShadowRoots);\n    if (element2) {\n      focusAsync(element2);\n      return true;\n    }\n    return false;\n  }\n  function getPreviousElement(rootElement, currentElement, checkNode, suppressParentTraversal, traverseChildren, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots) {\n    var _a2;\n    if (!currentElement || !allowFocusRoot && currentElement === rootElement) {\n      return null;\n    }\n    var isCurrentElementVisible = isElementVisible(currentElement);\n    if (traverseChildren && isCurrentElementVisible && (includeElementsInFocusZones || !(isElementFocusZone(currentElement) || isElementFocusSubZone(currentElement)))) {\n      var lastElementChild = currentElement.lastElementChild || includeShadowRoots && ((_a2 = currentElement.shadowRoot) === null || _a2 === void 0 ? void 0 : _a2.lastElementChild);\n      var childMatch = getPreviousElement(rootElement, lastElementChild, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n      if (childMatch) {\n        if (tabbable && isElementTabbable(childMatch, true, includeShadowRoots) || !tabbable) {\n          return childMatch;\n        }\n        var childMatchSiblingMatch = getPreviousElement(rootElement, childMatch.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n        if (childMatchSiblingMatch) {\n          return childMatchSiblingMatch;\n        }\n        var childMatchParent = childMatch.parentElement;\n        while (childMatchParent && childMatchParent !== currentElement) {\n          var childMatchParentMatch = getPreviousElement(rootElement, childMatchParent.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n          if (childMatchParentMatch) {\n            return childMatchParentMatch;\n          }\n          childMatchParent = childMatchParent.parentElement;\n        }\n      }\n    }\n    if (checkNode && isCurrentElementVisible && isElementTabbable(currentElement, tabbable, includeShadowRoots)) {\n      return currentElement;\n    }\n    var siblingMatch = getPreviousElement(rootElement, currentElement.previousElementSibling, true, true, true, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n    if (siblingMatch) {\n      return siblingMatch;\n    }\n    if (!suppressParentTraversal) {\n      return getPreviousElement(rootElement, currentElement.parentElement, true, false, false, includeElementsInFocusZones, allowFocusRoot, tabbable, includeShadowRoots);\n    }\n    return null;\n  }\n  function getNextElement(rootElement, currentElement, checkNode, suppressParentTraversal, suppressChildTraversal, includeElementsInFocusZones, allowFocusRoot, tabbable, bypassHiddenElements, includeShadowRoots) {\n    var _a2;\n    if (!currentElement || currentElement === rootElement && suppressChildTraversal && !allowFocusRoot) {\n      return null;\n    }\n    var checkElementVisibility = bypassHiddenElements ? isElementVisibleAndNotHidden : isElementVisible;\n    var isCurrentElementVisible = checkElementVisibility(currentElement);\n    if (checkNode && isCurrentElementVisible && isElementTabbable(currentElement, tabbable, includeShadowRoots)) {\n      return currentElement;\n    }\n    if (!suppressChildTraversal && isCurrentElementVisible && (includeElementsInFocusZones || !(isElementFocusZone(currentElement) || isElementFocusSubZone(currentElement)))) {\n      var firstElementchild = currentElement.firstElementChild || includeShadowRoots && ((_a2 = currentElement.shadowRoot) === null || _a2 === void 0 ? void 0 : _a2.firstElementChild);\n      var childMatch = getNextElement(rootElement, firstElementchild, true, true, false, includeElementsInFocusZones, allowFocusRoot, tabbable, bypassHiddenElements, includeShadowRoots);\n      if (childMatch) {\n        return childMatch;\n      }\n    }\n    if (currentElement === rootElement) {\n      return null;\n    }\n    var siblingMatch = getNextElement(rootElement, currentElement.nextElementSibling, true, true, false, includeElementsInFocusZones, allowFocusRoot, tabbable, bypassHiddenElements, includeShadowRoots);\n    if (siblingMatch) {\n      return siblingMatch;\n    }\n    if (!suppressParentTraversal) {\n      return getNextElement(rootElement, currentElement.parentElement, false, false, true, includeElementsInFocusZones, allowFocusRoot, tabbable, bypassHiddenElements, includeShadowRoots);\n    }\n    return null;\n  }\n  function isElementVisible(element2) {\n    if (!element2 || !element2.getAttribute) {\n      return false;\n    }\n    var visibilityAttribute = element2.getAttribute(IS_VISIBLE_ATTRIBUTE);\n    if (visibilityAttribute !== null && visibilityAttribute !== void 0) {\n      return visibilityAttribute === \"true\";\n    }\n    return element2.offsetHeight !== 0 || element2.offsetParent !== null || // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    element2.isVisible === true;\n  }\n  function isElementVisibleAndNotHidden(element2, win) {\n    var theWin = win !== null && win !== void 0 ? win : getWindow();\n    return !!element2 && isElementVisible(element2) && !element2.hidden && theWin.getComputedStyle(element2).visibility !== \"hidden\";\n  }\n  function isElementTabbable(element2, checkTabIndex, checkShadowRoot) {\n    if (checkShadowRoot === void 0) {\n      checkShadowRoot = true;\n    }\n    if (!element2 || element2.disabled) {\n      return false;\n    }\n    var tabIndex = 0;\n    var tabIndexAttributeValue = null;\n    if (element2 && element2.getAttribute) {\n      tabIndexAttributeValue = element2.getAttribute(\"tabIndex\");\n      if (tabIndexAttributeValue) {\n        tabIndex = parseInt(tabIndexAttributeValue, 10);\n      }\n    }\n    var isFocusableAttribute = element2.getAttribute ? element2.getAttribute(IS_FOCUSABLE_ATTRIBUTE$1) : null;\n    var isTabIndexSet = tabIndexAttributeValue !== null && tabIndex >= 0;\n    var delegatesFocus = checkShadowRoot && element2.shadowRoot ? !!element2.shadowRoot.delegatesFocus : false;\n    var result = !!element2 && isFocusableAttribute !== \"false\" && (element2.tagName === \"A\" || element2.tagName === \"BUTTON\" || element2.tagName === \"INPUT\" || element2.tagName === \"TEXTAREA\" || element2.tagName === \"SELECT\" || isFocusableAttribute === \"true\" || isTabIndexSet || delegatesFocus);\n    return checkTabIndex ? tabIndex !== -1 && result : result;\n  }\n  function isElementFocusZone(element2) {\n    return !!(element2 && element2.getAttribute && !!element2.getAttribute(FOCUSZONE_ID_ATTRIBUTE$1));\n  }\n  function isElementFocusSubZone(element2) {\n    return !!(element2 && element2.getAttribute && element2.getAttribute(FOCUSZONE_SUB_ATTRIBUTE) === \"true\");\n  }\n  function doesElementContainFocus(element2) {\n    var doc = getDocument(element2);\n    var currentActiveElement = doc && doc.activeElement;\n    if (currentActiveElement && elementContains(element2, currentActiveElement)) {\n      return true;\n    }\n    return false;\n  }\n  function shouldWrapFocus(element2, noWrapDataAttribute, doc) {\n    var theDoc = getDocument();\n    return elementContainsAttribute(element2, noWrapDataAttribute, theDoc) === \"true\" ? false : true;\n  }\n  var animationId = void 0;\n  function focusAsync(element2) {\n    if (element2) {\n      var win = getWindow(element2);\n      if (win) {\n        if (animationId !== void 0) {\n          win.cancelAnimationFrame(animationId);\n        }\n        animationId = win.requestAnimationFrame(function() {\n          element2 && element2.focus();\n          animationId = void 0;\n        });\n      }\n    }\n  }\n  function getFocusableByIndexPath(parent, path2) {\n    var element2 = parent;\n    for (var _i = 0, path_1 = path2; _i < path_1.length; _i++) {\n      var index2 = path_1[_i];\n      var nextChild = element2.children[Math.min(index2, element2.children.length - 1)];\n      if (!nextChild) {\n        break;\n      }\n      element2 = nextChild;\n    }\n    element2 = isElementTabbable(element2) && isElementVisible(element2) ? element2 : getNextElement(parent, element2, true) || getPreviousElement(parent, element2);\n    return element2;\n  }\n  function getElementIndexPath(fromElement, toElement) {\n    var path2 = [];\n    while (toElement && fromElement && toElement !== fromElement) {\n      var parent_1 = getParent(toElement, true);\n      if (parent_1 === null) {\n        return [];\n      }\n      path2.unshift(Array.prototype.indexOf.call(parent_1.children, toElement));\n      toElement = parent_1;\n    }\n    return path2;\n  }\n  function on$1(element2, eventName, callback, options2) {\n    element2.addEventListener(eventName, callback, options2);\n    return function() {\n      return element2.removeEventListener(eventName, callback, options2);\n    };\n  }\n  function shallowCompare(a2, b2) {\n    if (!a2 || !b2) {\n      return !a2 && !b2;\n    }\n    for (var propName in a2) {\n      if (a2.hasOwnProperty(propName)) {\n        if (!b2.hasOwnProperty(propName) || b2[propName] !== a2[propName]) {\n          return false;\n        }\n      }\n    }\n    for (var propName in b2) {\n      if (b2.hasOwnProperty(propName)) {\n        if (!a2.hasOwnProperty(propName)) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n  function assign(target2) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    return filteredAssign.apply(this, [null, target2].concat(args));\n  }\n  function filteredAssign(isAllowed, target2) {\n    var args = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n      args[_i - 2] = arguments[_i];\n    }\n    target2 = target2 || {};\n    for (var _a2 = 0, args_1 = args; _a2 < args_1.length; _a2++) {\n      var sourceObject = args_1[_a2];\n      if (sourceObject) {\n        for (var propName in sourceObject) {\n          if (sourceObject.hasOwnProperty(propName) && (!isAllowed || isAllowed(propName))) {\n            target2[propName] = sourceObject[propName];\n          }\n        }\n      }\n    }\n    return target2;\n  }\n  var EventGroup = (\n    /** @class */\n    (function() {\n      function EventGroup2(parent) {\n        this._id = EventGroup2._uniqueId++;\n        this._parent = parent;\n        this._eventRecords = [];\n      }\n      EventGroup2.raise = function(target2, eventName, eventArgs, bubbleEvent, doc) {\n        var retVal2;\n        var theDoc = doc !== null && doc !== void 0 ? doc : getDocument();\n        if (EventGroup2._isElement(target2)) {\n          if (typeof theDoc !== \"undefined\" && theDoc.createEvent) {\n            var ev = theDoc.createEvent(\"HTMLEvents\");\n            ev.initEvent(eventName, bubbleEvent || false, true);\n            assign(ev, eventArgs);\n            retVal2 = target2.dispatchEvent(ev);\n          } else if (typeof theDoc !== \"undefined\" && theDoc.createEventObject) {\n            var evObj = theDoc.createEventObject(eventArgs);\n            target2.fireEvent(\"on\" + eventName, evObj);\n          }\n        } else {\n          while (target2 && retVal2 !== false) {\n            var events2 = target2.__events__;\n            var eventRecords = events2 ? events2[eventName] : null;\n            if (eventRecords) {\n              for (var id2 in eventRecords) {\n                if (eventRecords.hasOwnProperty(id2)) {\n                  var eventRecordList = eventRecords[id2];\n                  for (var listIndex = 0; retVal2 !== false && listIndex < eventRecordList.length; listIndex++) {\n                    var record = eventRecordList[listIndex];\n                    if (record.objectCallback) {\n                      retVal2 = record.objectCallback.call(record.parent, eventArgs);\n                    }\n                  }\n                }\n              }\n            }\n            target2 = bubbleEvent ? target2.parent : null;\n          }\n        }\n        return retVal2;\n      };\n      EventGroup2.isObserved = function(target2, eventName) {\n        var events2 = target2 && target2.__events__;\n        return !!events2 && !!events2[eventName];\n      };\n      EventGroup2.isDeclared = function(target2, eventName) {\n        var declaredEvents = target2 && target2.__declaredEvents;\n        return !!declaredEvents && !!declaredEvents[eventName];\n      };\n      EventGroup2.stopPropagation = function(event2) {\n        if (event2.stopPropagation) {\n          event2.stopPropagation();\n        } else {\n          event2.cancelBubble = true;\n        }\n      };\n      EventGroup2._isElement = function(target2) {\n        return !!target2 && (!!target2.addEventListener || typeof HTMLElement !== \"undefined\" && target2 instanceof HTMLElement);\n      };\n      EventGroup2.prototype.dispose = function() {\n        if (!this._isDisposed) {\n          this._isDisposed = true;\n          this.off();\n          this._parent = null;\n        }\n      };\n      EventGroup2.prototype.onAll = function(target2, events2, useCapture) {\n        for (var eventName in events2) {\n          if (events2.hasOwnProperty(eventName)) {\n            this.on(target2, eventName, events2[eventName], useCapture);\n          }\n        }\n      };\n      EventGroup2.prototype.on = function(target2, eventName, callback, options2) {\n        var _this = this;\n        if (eventName.indexOf(\",\") > -1) {\n          var events2 = eventName.split(/[ ,]+/);\n          for (var i = 0; i < events2.length; i++) {\n            this.on(target2, events2[i], callback, options2);\n          }\n        } else {\n          var parent_1 = this._parent;\n          var eventRecord = {\n            target: target2,\n            eventName,\n            parent: parent_1,\n            callback,\n            options: options2\n          };\n          var events2 = target2.__events__ = target2.__events__ || {};\n          events2[eventName] = events2[eventName] || {\n            count: 0\n          };\n          events2[eventName][this._id] = events2[eventName][this._id] || [];\n          events2[eventName][this._id].push(eventRecord);\n          events2[eventName].count++;\n          if (EventGroup2._isElement(target2)) {\n            var processElementEvent = function() {\n              var args = [];\n              for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n              }\n              if (_this._isDisposed) {\n                return;\n              }\n              var result;\n              try {\n                result = callback.apply(parent_1, args);\n                if (result === false && args[0]) {\n                  var e = args[0];\n                  if (e.preventDefault) {\n                    e.preventDefault();\n                  }\n                  if (e.stopPropagation) {\n                    e.stopPropagation();\n                  }\n                  e.cancelBubble = true;\n                }\n              } catch (e3) {\n              }\n              return result;\n            };\n            eventRecord.elementCallback = processElementEvent;\n            if (target2.addEventListener) {\n              target2.addEventListener(eventName, processElementEvent, options2);\n            } else if (target2.attachEvent) {\n              target2.attachEvent(\"on\" + eventName, processElementEvent);\n            }\n          } else {\n            var processObjectEvent = function() {\n              var args = [];\n              for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n              }\n              if (_this._isDisposed) {\n                return;\n              }\n              return callback.apply(parent_1, args);\n            };\n            eventRecord.objectCallback = processObjectEvent;\n          }\n          this._eventRecords.push(eventRecord);\n        }\n      };\n      EventGroup2.prototype.off = function(target2, eventName, callback, options2) {\n        for (var i = 0; i < this._eventRecords.length; i++) {\n          var eventRecord = this._eventRecords[i];\n          if ((!target2 || target2 === eventRecord.target) && (!eventName || eventName === eventRecord.eventName) && (!callback || callback === eventRecord.callback) && (typeof options2 !== \"boolean\" || options2 === eventRecord.options)) {\n            var events2 = eventRecord.target.__events__;\n            var targetArrayLookup = events2[eventRecord.eventName];\n            var targetArray = targetArrayLookup ? targetArrayLookup[this._id] : null;\n            if (targetArray) {\n              if (targetArray.length === 1 || !callback) {\n                targetArrayLookup.count -= targetArray.length;\n                delete events2[eventRecord.eventName][this._id];\n              } else {\n                targetArrayLookup.count--;\n                targetArray.splice(targetArray.indexOf(eventRecord), 1);\n              }\n              if (!targetArrayLookup.count) {\n                delete events2[eventRecord.eventName];\n              }\n            }\n            if (eventRecord.elementCallback) {\n              if (eventRecord.target.removeEventListener) {\n                eventRecord.target.removeEventListener(eventRecord.eventName, eventRecord.elementCallback, eventRecord.options);\n              } else if (eventRecord.target.detachEvent) {\n                eventRecord.target.detachEvent(\"on\" + eventRecord.eventName, eventRecord.elementCallback);\n              }\n            }\n            this._eventRecords.splice(i--, 1);\n          }\n        }\n      };\n      EventGroup2.prototype.raise = function(eventName, eventArgs, bubbleEvent) {\n        return EventGroup2.raise(this._parent, eventName, eventArgs, bubbleEvent);\n      };\n      EventGroup2.prototype.declare = function(event2) {\n        var declaredEvents = this._parent.__declaredEvents = this._parent.__declaredEvents || {};\n        if (typeof event2 === \"string\") {\n          declaredEvents[event2] = true;\n        } else {\n          for (var i = 0; i < event2.length; i++) {\n            declaredEvents[event2[i]] = true;\n          }\n        }\n      };\n      EventGroup2._uniqueId = 0;\n      return EventGroup2;\n    })()\n  );\n  var GLOBAL_STYLESHEET_KEY = \"__global__\";\n  var SHADOW_DOM_STYLESHEET_SETTING = \"__shadow_dom_stylesheet__\";\n  var DEFAULT_SHADOW_CONFIG = {\n    stylesheetKey: GLOBAL_STYLESHEET_KEY,\n    inShadow: false,\n    window: void 0,\n    __isShadowConfig__: true\n  };\n  var makeShadowConfig = function(stylesheetKey, inShadow, window2) {\n    return {\n      stylesheetKey,\n      inShadow,\n      window: window2,\n      __isShadowConfig__: true\n    };\n  };\n  var isShadowConfig = function(value2) {\n    if (!(value2 && isRecord(value2))) {\n      return false;\n    }\n    return value2.__isShadowConfig__ === true;\n  };\n  function isRecord(value2) {\n    return value2 !== null && typeof value2 === \"object\" && !Array.isArray(value2);\n  }\n  function extractStyleParts(sheet) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    var classes = [];\n    var objects = [];\n    var stylesheet2 = sheet;\n    function _processArgs(argsList) {\n      for (var _i2 = 0, argsList_1 = argsList; _i2 < argsList_1.length; _i2++) {\n        var arg = argsList_1[_i2];\n        if (arg && !isShadowConfig(arg)) {\n          if (typeof arg === \"string\") {\n            if (arg.indexOf(\" \") >= 0) {\n              _processArgs(arg.split(\" \"));\n            } else {\n              var translatedArgs = stylesheet2.argsFromClassName(arg);\n              if (translatedArgs) {\n                _processArgs(translatedArgs);\n              } else {\n                if (classes.indexOf(arg) === -1) {\n                  classes.push(arg);\n                }\n              }\n            }\n          } else if (Array.isArray(arg)) {\n            _processArgs(arg);\n          } else if (typeof arg === \"object\") {\n            objects.push(arg);\n          }\n        }\n      }\n    }\n    _processArgs(args);\n    return {\n      classes,\n      objects\n    };\n  }\n  function setRTL$1(isRTL) {\n    if (_rtl !== isRTL) {\n      _rtl = isRTL;\n    }\n  }\n  function getRTL$1() {\n    if (_rtl === void 0) {\n      _rtl = // eslint-disable-next-line no-restricted-globals\n      typeof document !== \"undefined\" && // eslint-disable-next-line no-restricted-globals\n      !!document.documentElement && // eslint-disable-next-line no-restricted-globals\n      document.documentElement.getAttribute(\"dir\") === \"rtl\";\n    }\n    return _rtl;\n  }\n  var _rtl;\n  _rtl = getRTL$1();\n  function getStyleOptions() {\n    return {\n      rtl: getRTL$1(),\n      shadowConfig: DEFAULT_SHADOW_CONFIG\n    };\n  }\n  var InjectionMode = {\n    /**\n     * Avoids style injection, use getRules() to read the styles.\n     */\n    none: 0,\n    /**\n     * Inserts rules using the insertRule api.\n     */\n    insertNode: 1,\n    /**\n     * Appends rules using appendChild.\n     */\n    appendChild: 2\n  };\n  var STYLESHEET_SETTING = \"__stylesheet__\";\n  var REUSE_STYLE_NODE = typeof navigator !== \"undefined\" && /rv:11.0/.test(navigator.userAgent);\n  var _global$1 = {};\n  try {\n    _global$1 = window || {};\n  } catch (_a2) {\n  }\n  var _stylesheet;\n  var Stylesheet = (\n    /** @class */\n    (function() {\n      function Stylesheet2(config, serializedStylesheet) {\n        var _a2, _b2, _c2, _d2, _e2, _f;\n        this._rules = [];\n        this._preservedRules = [];\n        this._counter = 0;\n        this._keyToClassName = {};\n        this._onInsertRuleCallbacks = [];\n        this._onResetCallbacks = [];\n        this._classNameToArgs = {};\n        this._config = __assign$1({ injectionMode: typeof document === \"undefined\" ? InjectionMode.none : InjectionMode.insertNode, defaultPrefix: \"css\", namespace: void 0, cspSettings: void 0 }, config);\n        this._classNameToArgs = (_a2 = serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.classNameToArgs) !== null && _a2 !== void 0 ? _a2 : this._classNameToArgs;\n        this._counter = (_b2 = serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.counter) !== null && _b2 !== void 0 ? _b2 : this._counter;\n        this._keyToClassName = (_d2 = (_c2 = this._config.classNameCache) !== null && _c2 !== void 0 ? _c2 : serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.keyToClassName) !== null && _d2 !== void 0 ? _d2 : this._keyToClassName;\n        this._preservedRules = (_e2 = serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.preservedRules) !== null && _e2 !== void 0 ? _e2 : this._preservedRules;\n        this._rules = (_f = serializedStylesheet === null || serializedStylesheet === void 0 ? void 0 : serializedStylesheet.rules) !== null && _f !== void 0 ? _f : this._rules;\n      }\n      Stylesheet2.getInstance = function(shadowConfig) {\n        _stylesheet = _global$1[STYLESHEET_SETTING];\n        if (_global$1[SHADOW_DOM_STYLESHEET_SETTING]) {\n          return _global$1[SHADOW_DOM_STYLESHEET_SETTING].getInstance(shadowConfig);\n        }\n        if (!_stylesheet || _stylesheet._lastStyleElement && _stylesheet._lastStyleElement.ownerDocument !== document) {\n          var fabricConfig = (_global$1 === null || _global$1 === void 0 ? void 0 : _global$1.FabricConfig) || {};\n          var stylesheet2 = new Stylesheet2(fabricConfig.mergeStyles, fabricConfig.serializedStylesheet);\n          _stylesheet = stylesheet2;\n          _global$1[STYLESHEET_SETTING] = stylesheet2;\n        }\n        return _stylesheet;\n      };\n      Stylesheet2.prototype.serialize = function() {\n        return JSON.stringify({\n          classNameToArgs: this._classNameToArgs,\n          counter: this._counter,\n          keyToClassName: this._keyToClassName,\n          preservedRules: this._preservedRules,\n          rules: this._rules\n        });\n      };\n      Stylesheet2.prototype.setConfig = function(config) {\n        this._config = __assign$1(__assign$1({}, this._config), config);\n      };\n      Stylesheet2.prototype.onReset = function(callback) {\n        var _this = this;\n        this._onResetCallbacks.push(callback);\n        return function() {\n          _this._onResetCallbacks = _this._onResetCallbacks.filter(function(cb) {\n            return cb !== callback;\n          });\n        };\n      };\n      Stylesheet2.prototype.onInsertRule = function(callback) {\n        var _this = this;\n        this._onInsertRuleCallbacks.push(callback);\n        return function() {\n          _this._onInsertRuleCallbacks = _this._onInsertRuleCallbacks.filter(function(cb) {\n            return cb !== callback;\n          });\n        };\n      };\n      Stylesheet2.prototype.getClassName = function(displayName) {\n        var namespace = this._config.namespace;\n        var prefix = displayName || this._config.defaultPrefix;\n        return \"\".concat(namespace ? namespace + \"-\" : \"\").concat(prefix, \"-\").concat(this._counter++);\n      };\n      Stylesheet2.prototype.cacheClassName = function(className2, key2, args, rules2) {\n        this._keyToClassName[this._getCacheKey(key2)] = className2;\n        this._classNameToArgs[className2] = {\n          args,\n          rules: rules2\n        };\n      };\n      Stylesheet2.prototype.classNameFromKey = function(key2) {\n        return this._keyToClassName[this._getCacheKey(key2)];\n      };\n      Stylesheet2.prototype.getClassNameCache = function() {\n        return this._keyToClassName;\n      };\n      Stylesheet2.prototype.argsFromClassName = function(className2) {\n        var entry2 = this._classNameToArgs[className2];\n        return entry2 && entry2.args;\n      };\n      Stylesheet2.prototype.insertedRulesFromClassName = function(className2) {\n        var entry2 = this._classNameToArgs[className2];\n        return entry2 && entry2.rules;\n      };\n      Stylesheet2.prototype.insertRule = function(rule2, preserve, stylesheetKey) {\n        if (stylesheetKey === void 0) {\n          stylesheetKey = GLOBAL_STYLESHEET_KEY;\n        }\n        var injectionMode = this._config.injectionMode;\n        var element2 = injectionMode !== InjectionMode.none ? this._getStyleElement() : void 0;\n        if (preserve) {\n          this._preservedRules.push(rule2);\n        }\n        if (element2) {\n          switch (injectionMode) {\n            case InjectionMode.insertNode:\n              this._insertRuleIntoSheet(element2.sheet, rule2);\n              break;\n            case InjectionMode.appendChild:\n              element2.appendChild(document.createTextNode(rule2));\n              break;\n          }\n        } else {\n          this._rules.push(rule2);\n        }\n        if (this._config.onInsertRule) {\n          this._config.onInsertRule(rule2);\n        }\n        this._onInsertRuleCallbacks.forEach(function(callback) {\n          return callback({ key: stylesheetKey, sheet: element2 ? element2.sheet : void 0, rule: rule2 });\n        });\n      };\n      Stylesheet2.prototype.getRules = function(includePreservedRules) {\n        return (includePreservedRules ? this._preservedRules.join(\"\") : \"\") + this._rules.join(\"\");\n      };\n      Stylesheet2.prototype.reset = function() {\n        this._rules = [];\n        this._counter = 0;\n        this._classNameToArgs = {};\n        this._keyToClassName = {};\n        this._onResetCallbacks.forEach(function(callback) {\n          return callback();\n        });\n      };\n      Stylesheet2.prototype.resetKeys = function() {\n        this._keyToClassName = {};\n      };\n      Stylesheet2.prototype._createStyleElement = function() {\n        var _a2;\n        var doc = ((_a2 = this._config.window) === null || _a2 === void 0 ? void 0 : _a2.document) || document;\n        var head = doc.head;\n        var styleElement = doc.createElement(\"style\");\n        var nodeToInsertBefore = null;\n        styleElement.setAttribute(\"data-merge-styles\", \"true\");\n        var cspSettings = this._config.cspSettings;\n        if (cspSettings) {\n          if (cspSettings.nonce) {\n            styleElement.setAttribute(\"nonce\", cspSettings.nonce);\n          }\n        }\n        if (this._lastStyleElement) {\n          nodeToInsertBefore = this._lastStyleElement.nextElementSibling;\n        } else {\n          var placeholderStyleTag = this._findPlaceholderStyleTag();\n          if (placeholderStyleTag) {\n            nodeToInsertBefore = placeholderStyleTag.nextElementSibling;\n          } else {\n            nodeToInsertBefore = head.childNodes[0];\n          }\n        }\n        head.insertBefore(styleElement, head.contains(nodeToInsertBefore) ? nodeToInsertBefore : null);\n        this._lastStyleElement = styleElement;\n        return styleElement;\n      };\n      Stylesheet2.prototype._insertRuleIntoSheet = function(sheet, rule2) {\n        if (!sheet) {\n          return false;\n        }\n        try {\n          sheet.insertRule(rule2, sheet.cssRules.length);\n          return true;\n        } catch (e) {\n        }\n        return false;\n      };\n      Stylesheet2.prototype._getCacheKey = function(key2) {\n        return key2;\n      };\n      Stylesheet2.prototype._getStyleElement = function() {\n        var _this = this;\n        if (!this._styleElement) {\n          this._styleElement = this._createStyleElement();\n          if (!REUSE_STYLE_NODE) {\n            var win = this._config.window || window;\n            win.requestAnimationFrame(function() {\n              _this._styleElement = void 0;\n            });\n          }\n        }\n        return this._styleElement;\n      };\n      Stylesheet2.prototype._findPlaceholderStyleTag = function() {\n        var head = document.head;\n        if (head) {\n          return head.querySelector(\"style[data-merge-styles]\");\n        }\n        return null;\n      };\n      return Stylesheet2;\n    })()\n  );\n  var rules = {};\n  function kebabRules(rulePairs, index2) {\n    var rule2 = rulePairs[index2];\n    if (rule2.charAt(0) !== \"-\") {\n      rulePairs[index2] = rules[rule2] = rules[rule2] || rule2.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n    }\n  }\n  var _vendorSettings;\n  function getVendorSettings() {\n    var _a2;\n    if (!_vendorSettings) {\n      var doc = typeof document !== \"undefined\" ? document : void 0;\n      var nav = typeof navigator !== \"undefined\" ? navigator : void 0;\n      var userAgent = (_a2 = nav === null || nav === void 0 ? void 0 : nav.userAgent) === null || _a2 === void 0 ? void 0 : _a2.toLowerCase();\n      if (!doc) {\n        _vendorSettings = {\n          isWebkit: true,\n          isMoz: true,\n          isOpera: true,\n          isMs: true\n        };\n      } else {\n        _vendorSettings = {\n          isWebkit: !!(doc && \"WebkitAppearance\" in doc.documentElement.style),\n          isMoz: !!(userAgent && userAgent.indexOf(\"firefox\") > -1),\n          isOpera: !!(userAgent && userAgent.indexOf(\"opera\") > -1),\n          isMs: !!(nav && (/rv:11.0/i.test(nav.userAgent) || /Edge\\/\\d./i.test(navigator.userAgent)))\n        };\n      }\n    }\n    return _vendorSettings;\n  }\n  var autoPrefixNames = {\n    \"user-select\": 1\n  };\n  function prefixRules(rulePairs, index2) {\n    var vendorSettings = getVendorSettings();\n    var name = rulePairs[index2];\n    if (autoPrefixNames[name]) {\n      var value2 = rulePairs[index2 + 1];\n      if (autoPrefixNames[name]) {\n        if (vendorSettings.isWebkit) {\n          rulePairs.push(\"-webkit-\" + name, value2);\n        }\n        if (vendorSettings.isMoz) {\n          rulePairs.push(\"-moz-\" + name, value2);\n        }\n        if (vendorSettings.isMs) {\n          rulePairs.push(\"-ms-\" + name, value2);\n        }\n        if (vendorSettings.isOpera) {\n          rulePairs.push(\"-o-\" + name, value2);\n        }\n      }\n    }\n  }\n  var NON_PIXEL_NUMBER_PROPS = [\n    \"column-count\",\n    \"font-weight\",\n    \"flex\",\n    \"flex-grow\",\n    \"flex-shrink\",\n    \"fill-opacity\",\n    \"opacity\",\n    \"order\",\n    \"z-index\",\n    \"zoom\"\n  ];\n  function provideUnits(rulePairs, index2) {\n    var name = rulePairs[index2];\n    var value2 = rulePairs[index2 + 1];\n    if (typeof value2 === \"number\") {\n      var isNonPixelProp = NON_PIXEL_NUMBER_PROPS.indexOf(name) > -1;\n      var isVariableOrPrefixed = name.indexOf(\"--\") > -1;\n      var unit2 = isNonPixelProp || isVariableOrPrefixed ? \"\" : \"px\";\n      rulePairs[index2 + 1] = \"\".concat(value2).concat(unit2);\n    }\n  }\n  var _a$6;\n  var LEFT$1 = \"left\";\n  var RIGHT$1 = \"right\";\n  var NO_FLIP = \"@noflip\";\n  var NAME_REPLACEMENTS = (_a$6 = {}, _a$6[LEFT$1] = RIGHT$1, _a$6[RIGHT$1] = LEFT$1, _a$6);\n  var VALUE_REPLACEMENTS = {\n    \"w-resize\": \"e-resize\",\n    \"sw-resize\": \"se-resize\",\n    \"nw-resize\": \"ne-resize\"\n  };\n  function rtlifyRules(options2, rulePairs, index2) {\n    if (options2.rtl) {\n      var name_1 = rulePairs[index2];\n      if (!name_1) {\n        return;\n      }\n      var value2 = rulePairs[index2 + 1];\n      if (typeof value2 === \"string\" && value2.indexOf(NO_FLIP) >= 0) {\n        rulePairs[index2 + 1] = value2.replace(/\\s*(?:\\/\\*\\s*)?\\@noflip\\b(?:\\s*\\*\\/)?\\s*?/g, \"\");\n      } else if (name_1.indexOf(LEFT$1) >= 0) {\n        rulePairs[index2] = name_1.replace(LEFT$1, RIGHT$1);\n      } else if (name_1.indexOf(RIGHT$1) >= 0) {\n        rulePairs[index2] = name_1.replace(RIGHT$1, LEFT$1);\n      } else if (String(value2).indexOf(LEFT$1) >= 0) {\n        rulePairs[index2 + 1] = value2.replace(LEFT$1, RIGHT$1);\n      } else if (String(value2).indexOf(RIGHT$1) >= 0) {\n        rulePairs[index2 + 1] = value2.replace(RIGHT$1, LEFT$1);\n      } else if (NAME_REPLACEMENTS[name_1]) {\n        rulePairs[index2] = NAME_REPLACEMENTS[name_1];\n      } else if (VALUE_REPLACEMENTS[value2]) {\n        rulePairs[index2 + 1] = VALUE_REPLACEMENTS[value2];\n      } else {\n        switch (name_1) {\n          case \"margin\":\n          case \"padding\":\n            rulePairs[index2 + 1] = flipQuad(value2);\n            break;\n          case \"box-shadow\":\n            rulePairs[index2 + 1] = negateNum(value2, 0);\n            break;\n        }\n      }\n    }\n  }\n  function negateNum(value2, partIndex) {\n    var parts = value2.split(\" \");\n    var numberVal = parseInt(parts[partIndex], 10);\n    parts[0] = parts[0].replace(String(numberVal), String(numberVal * -1));\n    return parts.join(\" \");\n  }\n  function flipQuad(value2) {\n    if (typeof value2 === \"string\") {\n      var parts = value2.split(\" \");\n      if (parts.length === 4) {\n        return \"\".concat(parts[0], \" \").concat(parts[3], \" \").concat(parts[2], \" \").concat(parts[1]);\n      }\n    }\n    return value2;\n  }\n  function tokenizeWithParentheses(value2) {\n    var parts = [];\n    var partStart = 0;\n    var parens = 0;\n    for (var i = 0; i < value2.length; i++) {\n      switch (value2[i]) {\n        case \"(\":\n          parens++;\n          break;\n        case \")\":\n          if (parens) {\n            parens--;\n          }\n          break;\n        case \"\t\":\n        case \" \":\n          if (!parens) {\n            if (i > partStart) {\n              parts.push(value2.substring(partStart, i));\n            }\n            partStart = i + 1;\n          }\n          break;\n      }\n    }\n    if (partStart < value2.length) {\n      parts.push(value2.substring(partStart));\n    }\n    return parts;\n  }\n  var DISPLAY_NAME = \"displayName\";\n  function getDisplayName(rules2) {\n    var rootStyle = rules2 && rules2[\"&\"];\n    return rootStyle ? rootStyle.displayName : void 0;\n  }\n  var globalSelectorRegExp = /\\:global\\((.+?)\\)/g;\n  function expandCommaSeparatedGlobals(selectorWithGlobals) {\n    if (!globalSelectorRegExp.test(selectorWithGlobals)) {\n      return selectorWithGlobals;\n    }\n    var replacementInfo = [];\n    var findGlobal = /\\:global\\((.+?)\\)/g;\n    var match2 = null;\n    while (match2 = findGlobal.exec(selectorWithGlobals)) {\n      if (match2[1].indexOf(\",\") > -1) {\n        replacementInfo.push([\n          match2.index,\n          match2.index + match2[0].length,\n          // Wrap each of the found selectors in :global()\n          match2[1].split(\",\").map(function(v) {\n            return \":global(\".concat(v.trim(), \")\");\n          }).join(\", \")\n        ]);\n      }\n    }\n    return replacementInfo.reverse().reduce(function(selector, _a2) {\n      var matchIndex = _a2[0], matchEndIndex = _a2[1], replacement = _a2[2];\n      var prefix = selector.slice(0, matchIndex);\n      var suffix = selector.slice(matchEndIndex);\n      return prefix + replacement + suffix;\n    }, selectorWithGlobals);\n  }\n  function isSelector(potentialSelector) {\n    return potentialSelector.indexOf(\":global(\") >= 0 || potentialSelector.indexOf(\":\") === 0;\n  }\n  function expandSelector(newSelector, currentSelector) {\n    if (newSelector.indexOf(\":global(\") >= 0) {\n      return newSelector.replace(globalSelectorRegExp, \"$1\");\n    } else if (newSelector.indexOf(\":host(\") === 0) {\n      return newSelector;\n    } else if (newSelector.indexOf(\":\") === 0) {\n      return currentSelector + newSelector;\n    } else if (newSelector.indexOf(\"&\") < 0) {\n      return currentSelector + \" \" + newSelector;\n    }\n    return newSelector;\n  }\n  function extractSelector(currentSelector, rules2, selector, value2, stylesheet2) {\n    if (rules2 === void 0) {\n      rules2 = { __order: [] };\n    }\n    if (selector.indexOf(\"@\") === 0) {\n      selector = selector + \"{\" + currentSelector;\n      extractRules([value2], rules2, selector, stylesheet2);\n    } else if (selector.indexOf(\",\") > -1) {\n      expandCommaSeparatedGlobals(selector).split(\",\").map(function(s2) {\n        return s2.trim();\n      }).forEach(function(separatedSelector) {\n        return extractRules([value2], rules2, expandSelector(separatedSelector, currentSelector), stylesheet2);\n      });\n    } else {\n      extractRules([value2], rules2, expandSelector(selector, currentSelector), stylesheet2);\n    }\n  }\n  function extractRules(args, rules2, currentSelector, stylesheet2) {\n    if (rules2 === void 0) {\n      rules2 = { __order: [] };\n    }\n    if (currentSelector === void 0) {\n      currentSelector = \"&\";\n    }\n    var currentRules = rules2[currentSelector];\n    if (!currentRules) {\n      currentRules = {};\n      rules2[currentSelector] = currentRules;\n      rules2.__order.push(currentSelector);\n    }\n    for (var _i = 0, args_1 = args; _i < args_1.length; _i++) {\n      var arg = args_1[_i];\n      if (typeof arg === \"string\") {\n        var expandedRules = stylesheet2.argsFromClassName(arg);\n        if (expandedRules) {\n          extractRules(expandedRules, rules2, currentSelector, stylesheet2);\n        }\n      } else if (Array.isArray(arg)) {\n        extractRules(arg, rules2, currentSelector, stylesheet2);\n      } else {\n        for (var prop in arg) {\n          if (arg.hasOwnProperty(prop)) {\n            var propValue = arg[prop];\n            if (prop === \"selectors\") {\n              var selectors = arg.selectors;\n              for (var newSelector in selectors) {\n                if (selectors.hasOwnProperty(newSelector)) {\n                  extractSelector(currentSelector, rules2, newSelector, selectors[newSelector], stylesheet2);\n                }\n              }\n            } else if (typeof propValue === \"object\" || isSelector(prop)) {\n              if (propValue !== null && propValue !== void 0) {\n                extractSelector(currentSelector, rules2, prop, propValue, stylesheet2);\n              }\n            } else {\n              if (propValue !== void 0) {\n                if (prop === \"margin\" || prop === \"padding\") {\n                  expandQuads(currentRules, prop, propValue);\n                } else {\n                  currentRules[prop] = propValue;\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    return rules2;\n  }\n  function expandQuads(currentRules, name, value2) {\n    var parts = typeof value2 === \"string\" ? tokenizeWithParentheses(value2) : [value2];\n    if (parts.length === 0) {\n      parts.push(value2);\n    }\n    if (parts[parts.length - 1] === \"!important\") {\n      parts = parts.slice(0, -1).map(function(p) {\n        return p + \" !important\";\n      });\n    }\n    currentRules[name + \"Top\"] = parts[0];\n    currentRules[name + \"Right\"] = parts[1] || parts[0];\n    currentRules[name + \"Bottom\"] = parts[2] || parts[0];\n    currentRules[name + \"Left\"] = parts[3] || parts[1] || parts[0];\n  }\n  function getKeyForRules(options2, rules2) {\n    var serialized = [options2.rtl ? \"rtl\" : \"ltr\"];\n    var hasProps = false;\n    for (var _i = 0, _a2 = rules2.__order; _i < _a2.length; _i++) {\n      var selector = _a2[_i];\n      serialized.push(selector);\n      var rulesForSelector = rules2[selector];\n      for (var propName in rulesForSelector) {\n        if (rulesForSelector.hasOwnProperty(propName) && rulesForSelector[propName] !== void 0) {\n          hasProps = true;\n          serialized.push(propName, rulesForSelector[propName]);\n        }\n      }\n    }\n    return hasProps ? serialized.join(\"\") : void 0;\n  }\n  function repeatString(target2, count2) {\n    if (count2 <= 0) {\n      return \"\";\n    }\n    if (count2 === 1) {\n      return target2;\n    }\n    return target2 + repeatString(target2, count2 - 1);\n  }\n  function serializeRuleEntries(options2, ruleEntries) {\n    if (!ruleEntries) {\n      return \"\";\n    }\n    var allEntries = [];\n    for (var entry2 in ruleEntries) {\n      if (ruleEntries.hasOwnProperty(entry2) && entry2 !== DISPLAY_NAME && ruleEntries[entry2] !== void 0) {\n        allEntries.push(entry2, ruleEntries[entry2]);\n      }\n    }\n    for (var i = 0; i < allEntries.length; i += 2) {\n      kebabRules(allEntries, i);\n      provideUnits(allEntries, i);\n      rtlifyRules(options2, allEntries, i);\n      prefixRules(allEntries, i);\n    }\n    for (var i = 1; i < allEntries.length; i += 4) {\n      allEntries.splice(i, 1, \":\", allEntries[i], \";\");\n    }\n    return allEntries.join(\"\");\n  }\n  function styleToRegistration(options2) {\n    var _a2;\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    var stylesheet2 = (_a2 = options2.stylesheet) !== null && _a2 !== void 0 ? _a2 : Stylesheet.getInstance(options2.shadowConfig);\n    var rules2 = extractRules(args, void 0, void 0, stylesheet2);\n    var key2 = getKeyForRules(options2, rules2);\n    if (key2) {\n      var registration = {\n        className: stylesheet2.classNameFromKey(key2),\n        key: key2,\n        args\n      };\n      if (!registration.className) {\n        registration.className = stylesheet2.getClassName(getDisplayName(rules2));\n        var rulesToInsert = [];\n        for (var _b2 = 0, _c2 = rules2.__order; _b2 < _c2.length; _b2++) {\n          var selector = _c2[_b2];\n          rulesToInsert.push(selector, serializeRuleEntries(options2, rules2[selector]));\n        }\n        registration.rulesToInsert = rulesToInsert;\n      }\n      return registration;\n    }\n    return void 0;\n  }\n  function applyRegistration(registration, specificityMultiplier, shadowConfig, sheet) {\n    if (specificityMultiplier === void 0) {\n      specificityMultiplier = 1;\n    }\n    var stylesheet2 = sheet !== null && sheet !== void 0 ? sheet : Stylesheet.getInstance(shadowConfig);\n    var className2 = registration.className, key2 = registration.key, args = registration.args, rulesToInsert = registration.rulesToInsert;\n    if (rulesToInsert) {\n      for (var i = 0; i < rulesToInsert.length; i += 2) {\n        var rules2 = rulesToInsert[i + 1];\n        if (rules2) {\n          var selector = rulesToInsert[i];\n          selector = selector.replace(/&/g, repeatString(\".\".concat(registration.className), specificityMultiplier));\n          var processedRule = \"\".concat(selector, \"{\").concat(rules2, \"}\").concat(selector.indexOf(\"@\") === 0 ? \"}\" : \"\");\n          stylesheet2.insertRule(processedRule);\n        }\n      }\n      stylesheet2.cacheClassName(className2, key2, args, rulesToInsert);\n    }\n  }\n  function styleToClassName(options2) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    var registration = styleToRegistration.apply(void 0, __spreadArray([options2], args, false));\n    if (registration) {\n      applyRegistration(registration, options2.specificityMultiplier, options2.shadowConfig, options2.stylesheet);\n      return registration.className;\n    }\n    return \"\";\n  }\n  function mergeStyles() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      args[_i] = arguments[_i];\n    }\n    return mergeCss(args, getStyleOptions());\n  }\n  function mergeCss(args, options2) {\n    var styleArgs = args instanceof Array ? args : [args];\n    var opts = options2 || {};\n    var hasShadowConfig = isShadowConfig(styleArgs[0]);\n    if (hasShadowConfig) {\n      opts.shadowConfig = styleArgs[0];\n    }\n    opts.stylesheet = Stylesheet.getInstance(opts.shadowConfig);\n    var _a2 = extractStyleParts(opts.stylesheet, styleArgs), classes = _a2.classes, objects = _a2.objects;\n    if (objects.length) {\n      classes.push(styleToClassName(opts, objects));\n    }\n    return classes.join(\" \");\n  }\n  function concatStyleSets() {\n    var styleSets = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      styleSets[_i] = arguments[_i];\n    }\n    if (styleSets && styleSets.length === 1 && styleSets[0] && !styleSets[0].subComponentStyles && !isShadowConfig(styleSets[0])) {\n      return styleSets[0];\n    }\n    var mergedSet = {};\n    var workingSubcomponentStyles = {};\n    for (var _a2 = 0, styleSets_1 = styleSets; _a2 < styleSets_1.length; _a2++) {\n      var currentSet = styleSets_1[_a2];\n      if (currentSet && !isShadowConfig(currentSet)) {\n        for (var prop in currentSet) {\n          if (currentSet.hasOwnProperty(prop)) {\n            if (prop === \"subComponentStyles\" && currentSet.subComponentStyles !== void 0) {\n              var currentComponentStyles = currentSet.subComponentStyles;\n              for (var subCompProp in currentComponentStyles) {\n                if (currentComponentStyles.hasOwnProperty(subCompProp)) {\n                  if (workingSubcomponentStyles.hasOwnProperty(subCompProp)) {\n                    workingSubcomponentStyles[subCompProp].push(currentComponentStyles[subCompProp]);\n                  } else {\n                    workingSubcomponentStyles[subCompProp] = [currentComponentStyles[subCompProp]];\n                  }\n                }\n              }\n              continue;\n            }\n            var mergedValue = mergedSet[prop];\n            var currentValue = currentSet[prop];\n            if (mergedValue === void 0) {\n              mergedSet[prop] = currentValue;\n            } else {\n              mergedSet[prop] = __spreadArray(__spreadArray([], Array.isArray(mergedValue) ? mergedValue : [mergedValue], true), Array.isArray(currentValue) ? currentValue : [currentValue], true);\n            }\n          }\n        }\n      }\n    }\n    if (Object.keys(workingSubcomponentStyles).length > 0) {\n      mergedSet.subComponentStyles = {};\n      var mergedSubStyles = mergedSet.subComponentStyles;\n      var _loop_1 = function(subCompProp2) {\n        if (workingSubcomponentStyles.hasOwnProperty(subCompProp2)) {\n          var workingSet_1 = workingSubcomponentStyles[subCompProp2];\n          mergedSubStyles[subCompProp2] = function(styleProps) {\n            return concatStyleSets.apply(void 0, workingSet_1.map(function(styleFunctionOrObject) {\n              return typeof styleFunctionOrObject === \"function\" ? styleFunctionOrObject(styleProps) : styleFunctionOrObject;\n            }));\n          };\n        }\n      };\n      for (var subCompProp in workingSubcomponentStyles) {\n        _loop_1(subCompProp);\n      }\n    }\n    return mergedSet;\n  }\n  function mergeStyleSets() {\n    var styleSets = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      styleSets[_i] = arguments[_i];\n    }\n    return mergeCssSets(styleSets, getStyleOptions());\n  }\n  function mergeCssSets(styleSets, options2) {\n    var classNameSet = { subComponentStyles: {} };\n    var shadowConfig = void 0;\n    var styleSet;\n    if (isShadowConfig(styleSets[0])) {\n      shadowConfig = styleSets[0];\n      styleSet = styleSets[1];\n    } else {\n      styleSet = styleSets[0];\n    }\n    shadowConfig !== null && shadowConfig !== void 0 ? shadowConfig : shadowConfig = options2 === null || options2 === void 0 ? void 0 : options2.shadowConfig;\n    var opts = __assign$1(__assign$1({}, options2), { shadowConfig });\n    if (!styleSet && styleSets.length <= 1) {\n      return { subComponentStyles: {} };\n    }\n    var sheet = Stylesheet.getInstance(shadowConfig);\n    opts.stylesheet = sheet;\n    var concatenatedStyleSet = concatStyleSets.apply(void 0, styleSets);\n    var registrations = [];\n    for (var styleSetArea in concatenatedStyleSet) {\n      if (concatenatedStyleSet.hasOwnProperty(styleSetArea)) {\n        if (styleSetArea === \"subComponentStyles\") {\n          classNameSet.subComponentStyles = concatenatedStyleSet.subComponentStyles || {};\n          continue;\n        } else if (styleSetArea === \"__shadowConfig__\") {\n          continue;\n        }\n        var styles = concatenatedStyleSet[styleSetArea];\n        var _a2 = extractStyleParts(sheet, styles), classes = _a2.classes, objects = _a2.objects;\n        if (objects === null || objects === void 0 ? void 0 : objects.length) {\n          var registration = styleToRegistration(opts || {}, { displayName: styleSetArea }, objects);\n          if (registration) {\n            registrations.push(registration);\n            classNameSet[styleSetArea] = classes.concat([registration.className]).join(\" \");\n          }\n        } else {\n          classNameSet[styleSetArea] = classes.join(\" \");\n        }\n      }\n    }\n    for (var _i = 0, registrations_1 = registrations; _i < registrations_1.length; _i++) {\n      var registration = registrations_1[_i];\n      if (registration) {\n        applyRegistration(registration, options2 === null || options2 === void 0 ? void 0 : options2.specificityMultiplier, shadowConfig);\n      }\n    }\n    return classNameSet;\n  }\n  function concatStyleSetsWithProps(styleProps) {\n    var allStyles = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      allStyles[_i - 1] = arguments[_i];\n    }\n    var result = [];\n    for (var _a2 = 0, allStyles_1 = allStyles; _a2 < allStyles_1.length; _a2++) {\n      var styles = allStyles_1[_a2];\n      if (styles) {\n        result.push(typeof styles === \"function\" ? styles(styleProps) : styles);\n      }\n    }\n    if (result.length === 1) {\n      return result[0];\n    } else if (result.length) {\n      return concatStyleSets.apply(void 0, result);\n    }\n    return {};\n  }\n  function fontFace(font2) {\n    var stylesheet2 = Stylesheet.getInstance();\n    var rule2 = serializeRuleEntries(getStyleOptions(), font2);\n    var className2 = stylesheet2.classNameFromKey(rule2);\n    if (className2) {\n      return;\n    }\n    var name = stylesheet2.getClassName();\n    stylesheet2.insertRule(\"@font-face{\".concat(rule2, \"}\"), true);\n    stylesheet2.cacheClassName(name, rule2, [], [\"font-face\", rule2]);\n  }\n  function keyframes(timeline) {\n    var stylesheet2 = Stylesheet.getInstance();\n    var rulesArray = [];\n    for (var prop in timeline) {\n      if (timeline.hasOwnProperty(prop)) {\n        rulesArray.push(prop, \"{\", serializeRuleEntries(getStyleOptions(), timeline[prop]), \"}\");\n      }\n    }\n    var rules2 = rulesArray.join(\"\");\n    var className2 = stylesheet2.classNameFromKey(rules2);\n    if (className2) {\n      return className2;\n    }\n    var name = stylesheet2.getClassName();\n    stylesheet2.insertRule(\"@keyframes \".concat(name, \"{\").concat(rules2, \"}\"), true);\n    stylesheet2.cacheClassName(name, rules2, [], [\"keyframes\", rules2]);\n    return name;\n  }\n  var _scrollbarWidth;\n  var _bodyScrollDisabledCount = 0;\n  var DisabledScrollClassName = mergeStyles({\n    overflow: \"hidden !important\"\n  });\n  var DATA_IS_SCROLLABLE_ATTRIBUTE = \"data-is-scrollable\";\n  var allowScrollOnElement = function(element2, events2) {\n    var window2 = getWindow(element2);\n    if (!element2 || !window2) {\n      return;\n    }\n    var _previousClientY = 0;\n    var _element = null;\n    var computedStyles = window2.getComputedStyle(element2);\n    var _saveClientY = function(event2) {\n      if (event2.targetTouches.length === 1) {\n        _previousClientY = event2.targetTouches[0].clientY;\n      }\n    };\n    var _preventOverscrolling = function(event2) {\n      if (event2.targetTouches.length !== 1) {\n        return;\n      }\n      event2.stopPropagation();\n      if (!_element) {\n        return;\n      }\n      var clientY = event2.targetTouches[0].clientY - _previousClientY;\n      var scrollableParent = findScrollableParent(event2.target);\n      if (scrollableParent && _element !== scrollableParent) {\n        _element = scrollableParent;\n        computedStyles = window2.getComputedStyle(_element);\n      }\n      var scrollTop = _element.scrollTop;\n      var isColumnReverse = (computedStyles === null || computedStyles === void 0 ? void 0 : computedStyles.flexDirection) === \"column-reverse\";\n      if (scrollTop === 0 && (isColumnReverse ? clientY < 0 : clientY > 0)) {\n        event2.preventDefault();\n      }\n      if (_element.scrollHeight - Math.abs(Math.ceil(scrollTop)) <= _element.clientHeight && (isColumnReverse ? clientY > 0 : clientY < 0)) {\n        event2.preventDefault();\n      }\n    };\n    events2.on(element2, \"touchstart\", _saveClientY, { passive: false });\n    events2.on(element2, \"touchmove\", _preventOverscrolling, { passive: false });\n    _element = element2;\n  };\n  var allowOverscrollOnElement = function(element2, events2) {\n    if (!element2) {\n      return;\n    }\n    var _allowElementScroll = function(event2) {\n      event2.stopPropagation();\n    };\n    events2.on(element2, \"touchmove\", _allowElementScroll, { passive: false });\n  };\n  var _disableIosBodyScroll = function(event2) {\n    event2.preventDefault();\n  };\n  function disableBodyScroll() {\n    var doc = getDocument();\n    if (doc && doc.body && !_bodyScrollDisabledCount) {\n      doc.body.classList.add(DisabledScrollClassName);\n      doc.body.addEventListener(\"touchmove\", _disableIosBodyScroll, { passive: false, capture: false });\n    }\n    _bodyScrollDisabledCount++;\n  }\n  function enableBodyScroll() {\n    if (_bodyScrollDisabledCount > 0) {\n      var doc = getDocument();\n      if (doc && doc.body && _bodyScrollDisabledCount === 1) {\n        doc.body.classList.remove(DisabledScrollClassName);\n        doc.body.removeEventListener(\"touchmove\", _disableIosBodyScroll);\n      }\n      _bodyScrollDisabledCount--;\n    }\n  }\n  function getScrollbarWidth(doc) {\n    if (_scrollbarWidth === void 0) {\n      var theDoc = getDocument();\n      var scrollDiv = theDoc.createElement(\"div\");\n      scrollDiv.style.setProperty(\"width\", \"100px\");\n      scrollDiv.style.setProperty(\"height\", \"100px\");\n      scrollDiv.style.setProperty(\"overflow\", \"scroll\");\n      scrollDiv.style.setProperty(\"position\", \"absolute\");\n      scrollDiv.style.setProperty(\"top\", \"-9999px\");\n      theDoc.body.appendChild(scrollDiv);\n      _scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n      theDoc.body.removeChild(scrollDiv);\n    }\n    return _scrollbarWidth;\n  }\n  function findScrollableParent(startingElement) {\n    var el = startingElement;\n    var doc = getDocument(startingElement);\n    while (el && el !== doc.body) {\n      if (el.getAttribute(DATA_IS_SCROLLABLE_ATTRIBUTE) === \"true\") {\n        return el;\n      }\n      el = el.parentElement;\n    }\n    el = startingElement;\n    while (el && el !== doc.body) {\n      if (el.getAttribute(DATA_IS_SCROLLABLE_ATTRIBUTE) !== \"false\") {\n        var computedStyles = getComputedStyle(el);\n        var overflowY = computedStyles ? computedStyles.getPropertyValue(\"overflow-y\") : \"\";\n        if (overflowY && (overflowY === \"scroll\" || overflowY === \"auto\")) {\n          return el;\n        }\n      }\n      el = el.parentElement;\n    }\n    if (!el || el === doc.body) {\n      el = getWindow(startingElement);\n    }\n    return el;\n  }\n  function warn$1(message) {\n    if (console && console.warn) {\n      console.warn(message);\n    }\n  }\n  var define_process_env_default = { NODE_ENV: \"production\" };\n  function warnConditionallyRequiredProps(componentName, props, requiredProps, conditionalPropName, condition) {\n    if (condition === true && define_process_env_default.NODE_ENV !== \"production\") {\n      for (var _i = 0, requiredProps_1 = requiredProps; _i < requiredProps_1.length; _i++) {\n        var requiredPropName = requiredProps_1[_i];\n        if (!(requiredPropName in props)) {\n          warn$1(\"\".concat(componentName, \" property '\").concat(requiredPropName, \"' is required when '\").concat(conditionalPropName, \"' is used.'\"));\n        }\n      }\n    }\n  }\n  function warnMutuallyExclusive(componentName, props, exclusiveMap) {\n  }\n  function warnDeprecations(componentName, props, deprecationMap) {\n  }\n  (function(_super) {\n    __extends(BaseComponent, _super);\n    function BaseComponent(props, context2) {\n      var _this = _super.call(this, props, context2) || this;\n      _makeAllSafe(_this, BaseComponent.prototype, [\n        \"componentDidMount\",\n        \"shouldComponentUpdate\",\n        \"getSnapshotBeforeUpdate\",\n        \"render\",\n        \"componentDidUpdate\",\n        \"componentWillUnmount\"\n      ]);\n      return _this;\n    }\n    BaseComponent.prototype.componentDidUpdate = function(prevProps, prevState) {\n      this._updateComponentRef(prevProps, this.props);\n    };\n    BaseComponent.prototype.componentDidMount = function() {\n      this._setComponentRef(this.props.componentRef, this);\n    };\n    BaseComponent.prototype.componentWillUnmount = function() {\n      this._setComponentRef(this.props.componentRef, null);\n      if (this.__disposables) {\n        for (var i = 0, len2 = this._disposables.length; i < len2; i++) {\n          var disposable = this.__disposables[i];\n          if (disposable.dispose) {\n            disposable.dispose();\n          }\n        }\n        this.__disposables = null;\n      }\n    };\n    Object.defineProperty(BaseComponent.prototype, \"className\", {\n      /**\n       * Gets the object's class name.\n       */\n      get: function() {\n        if (!this.__className) {\n          var funcNameRegex = /function (.{1,})\\(/;\n          var results = funcNameRegex.exec(this.constructor.toString());\n          this.__className = results && results.length > 1 ? results[1] : \"\";\n        }\n        return this.__className;\n      },\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(BaseComponent.prototype, \"_disposables\", {\n      /**\n       * Allows subclasses to push things to this._disposables to be auto disposed.\n       */\n      get: function() {\n        if (!this.__disposables) {\n          this.__disposables = [];\n        }\n        return this.__disposables;\n      },\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(BaseComponent.prototype, \"_async\", {\n      /**\n       * Gets the async instance associated with the component, created on demand. The async instance gives\n       * subclasses a way to execute setTimeout/setInterval async calls safely, where the callbacks\n       * will be cleared/ignored automatically after unmounting. The helpers within the async object also\n       * preserve the this pointer so that you don't need to \"bind\" the callbacks.\n       */\n      get: function() {\n        if (!this.__async) {\n          this.__async = new Async(this);\n          this._disposables.push(this.__async);\n        }\n        return this.__async;\n      },\n      enumerable: false,\n      configurable: true\n    });\n    Object.defineProperty(BaseComponent.prototype, \"_events\", {\n      /**\n       * Gets the event group instance assocaited with the component, created on demand. The event instance\n       * provides on/off methods for listening to DOM (or regular javascript object) events. The event callbacks\n       * will be automatically disconnected after unmounting. The helpers within the events object also\n       * preserve the this reference so that you don't need to \"bind\" the callbacks.\n       */\n      get: function() {\n        if (!this.__events) {\n          this.__events = new EventGroup(this);\n          this._disposables.push(this.__events);\n        }\n        return this.__events;\n      },\n      enumerable: false,\n      configurable: true\n    });\n    BaseComponent.prototype._resolveRef = function(refName) {\n      var _this = this;\n      if (!this.__resolves) {\n        this.__resolves = {};\n      }\n      if (!this.__resolves[refName]) {\n        this.__resolves[refName] = function(ref2) {\n          return _this[refName] = ref2;\n        };\n      }\n      return this.__resolves[refName];\n    };\n    BaseComponent.prototype._updateComponentRef = function(currentProps, newProps) {\n      if (newProps === void 0) {\n        newProps = {};\n      }\n      if (currentProps && newProps && currentProps.componentRef !== newProps.componentRef) {\n        this._setComponentRef(currentProps.componentRef, null);\n        this._setComponentRef(newProps.componentRef, this);\n      }\n    };\n    BaseComponent.prototype._warnDeprecations = function(deprecationMap) {\n      warnDeprecations(this.className, this.props);\n    };\n    BaseComponent.prototype._warnMutuallyExclusive = function(mutuallyExclusiveMap) {\n      warnMutuallyExclusive(this.className, this.props);\n    };\n    BaseComponent.prototype._warnConditionallyRequiredProps = function(requiredProps, conditionalPropName, condition) {\n      warnConditionallyRequiredProps(this.className, this.props, requiredProps, conditionalPropName, condition);\n    };\n    BaseComponent.prototype._setComponentRef = function(ref2, value2) {\n      if (!this._skipComponentRefResolution && ref2) {\n        if (typeof ref2 === \"function\") {\n          ref2(value2);\n        }\n        if (typeof ref2 === \"object\") {\n          ref2.current = value2;\n        }\n      }\n    };\n    return BaseComponent;\n  })(React__namespace.Component);\n  function _makeAllSafe(obj2, prototype2, methodNames) {\n    for (var i = 0, len2 = methodNames.length; i < len2; i++) {\n      _makeSafe(obj2, prototype2, methodNames[i]);\n    }\n  }\n  function _makeSafe(obj2, prototype2, methodName) {\n    var classMethod = obj2[methodName];\n    var prototypeMethod = prototype2[methodName];\n    if (classMethod || prototypeMethod) {\n      obj2[methodName] = function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        var retVal2;\n        if (prototypeMethod) {\n          retVal2 = prototypeMethod.apply(this, args);\n        }\n        if (classMethod !== prototypeMethod) {\n          retVal2 = classMethod.apply(this, args);\n        }\n        return retVal2;\n      };\n    }\n  }\n  function nullRender() {\n    return null;\n  }\n  var DelayedRender = (\n    /** @class */\n    (function(_super) {\n      __extends(DelayedRender2, _super);\n      function DelayedRender2(props) {\n        var _this = _super.call(this, props) || this;\n        _this.state = {\n          isRendered: getWindow() === void 0\n        };\n        return _this;\n      }\n      DelayedRender2.prototype.componentDidMount = function() {\n        var _this = this;\n        var delay = this.props.delay;\n        this._timeoutId = window.setTimeout(function() {\n          _this.setState({\n            isRendered: true\n          });\n        }, delay);\n      };\n      DelayedRender2.prototype.componentWillUnmount = function() {\n        if (this._timeoutId) {\n          clearTimeout(this._timeoutId);\n        }\n      };\n      DelayedRender2.prototype.render = function() {\n        return this.state.isRendered ? React__namespace.Children.only(this.props.children) : null;\n      };\n      DelayedRender2.defaultProps = {\n        delay: 0\n      };\n      return DelayedRender2;\n    })(React__namespace.Component)\n  );\n  var GLOBAL_SETTINGS_PROP_NAME = \"__globalSettings__\";\n  var CALLBACK_STATE_PROP_NAME = \"__callbacks__\";\n  var _counter = 0;\n  var GlobalSettings = (\n    /** @class */\n    (function() {\n      function GlobalSettings2() {\n      }\n      GlobalSettings2.getValue = function(key2, defaultValue) {\n        var globalSettings = _getGlobalSettings();\n        if (globalSettings[key2] === void 0) {\n          globalSettings[key2] = typeof defaultValue === \"function\" ? defaultValue() : defaultValue;\n        }\n        return globalSettings[key2];\n      };\n      GlobalSettings2.setValue = function(key2, value2) {\n        var globalSettings = _getGlobalSettings();\n        var callbacks = globalSettings[CALLBACK_STATE_PROP_NAME];\n        var oldValue = globalSettings[key2];\n        if (value2 !== oldValue) {\n          globalSettings[key2] = value2;\n          var changeDescription = {\n            oldValue,\n            value: value2,\n            key: key2\n          };\n          for (var id2 in callbacks) {\n            if (callbacks.hasOwnProperty(id2)) {\n              callbacks[id2](changeDescription);\n            }\n          }\n        }\n        return value2;\n      };\n      GlobalSettings2.addChangeListener = function(cb) {\n        var id2 = cb.__id__;\n        var callbacks = _getCallbacks();\n        if (!id2) {\n          id2 = cb.__id__ = String(_counter++);\n        }\n        callbacks[id2] = cb;\n      };\n      GlobalSettings2.removeChangeListener = function(cb) {\n        var callbacks = _getCallbacks();\n        delete callbacks[cb.__id__];\n      };\n      return GlobalSettings2;\n    })()\n  );\n  function _getGlobalSettings() {\n    var _a2;\n    var win = getWindow();\n    var globalObj = win || {};\n    if (!globalObj[GLOBAL_SETTINGS_PROP_NAME]) {\n      globalObj[GLOBAL_SETTINGS_PROP_NAME] = (_a2 = {}, _a2[CALLBACK_STATE_PROP_NAME] = {}, _a2);\n    }\n    return globalObj[GLOBAL_SETTINGS_PROP_NAME];\n  }\n  function _getCallbacks() {\n    var globalSettings = _getGlobalSettings();\n    return globalSettings[CALLBACK_STATE_PROP_NAME];\n  }\n  var KeyCodes = {\n    backspace: 8,\n    tab: 9,\n    enter: 13,\n    alt: 18,\n    escape: 27,\n    space: 32,\n    pageUp: 33,\n    pageDown: 34,\n    end: 35,\n    home: 36,\n    left: 37,\n    up: 38,\n    right: 39,\n    down: 40\n  };\n  var Rectangle = (\n    /** @class */\n    (function() {\n      function Rectangle2(left, right, top, bottom) {\n        if (left === void 0) {\n          left = 0;\n        }\n        if (right === void 0) {\n          right = 0;\n        }\n        if (top === void 0) {\n          top = 0;\n        }\n        if (bottom === void 0) {\n          bottom = 0;\n        }\n        this.top = top;\n        this.bottom = bottom;\n        this.left = left;\n        this.right = right;\n      }\n      Object.defineProperty(Rectangle2.prototype, \"width\", {\n        /**\n         * Calculated automatically by subtracting the right from left\n         */\n        get: function() {\n          return this.right - this.left;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Rectangle2.prototype, \"height\", {\n        /**\n         * Calculated automatically by subtracting the bottom from top.\n         */\n        get: function() {\n          return this.bottom - this.top;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Rectangle2.prototype.equals = function(rect2) {\n        return parseFloat(this.top.toFixed(4)) === parseFloat(rect2.top.toFixed(4)) && parseFloat(this.bottom.toFixed(4)) === parseFloat(rect2.bottom.toFixed(4)) && parseFloat(this.left.toFixed(4)) === parseFloat(rect2.left.toFixed(4)) && parseFloat(this.right.toFixed(4)) === parseFloat(rect2.right.toFixed(4));\n      };\n      return Rectangle2;\n    })()\n  );\n  function appendFunction(parent) {\n    var functions = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      functions[_i - 1] = arguments[_i];\n    }\n    if (functions.length < 2) {\n      return functions[0];\n    }\n    return function() {\n      var args = [];\n      for (var _i2 = 0; _i2 < arguments.length; _i2++) {\n        args[_i2] = arguments[_i2];\n      }\n      functions.forEach(function(f) {\n        return f && f.apply(parent, args);\n      });\n    };\n  }\n  function mergeAriaAttributeValues() {\n    var ariaAttributes = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      ariaAttributes[_i] = arguments[_i];\n    }\n    var mergedAttribute = ariaAttributes.filter(function(arg) {\n      return arg;\n    }).join(\" \").trim();\n    return mergedAttribute === \"\" ? void 0 : mergedAttribute;\n  }\n  function findIndex(array2, cb, fromIndex) {\n    if (fromIndex === void 0) {\n      fromIndex = 0;\n    }\n    var index2 = -1;\n    for (var i = fromIndex; array2 && i < array2.length; i++) {\n      if (cb(array2[i], i)) {\n        index2 = i;\n        break;\n      }\n    }\n    return index2;\n  }\n  function find$3(array2, cb) {\n    var index2 = findIndex(array2, cb);\n    if (index2 < 0) {\n      return void 0;\n    }\n    return array2[index2];\n  }\n  function addElementAtIndex(array2, index2, itemToAdd) {\n    var copy2 = array2.slice();\n    copy2.splice(index2, 0, itemToAdd);\n    return copy2;\n  }\n  function arraysEqual(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function getItem$1(key2) {\n    var result = null;\n    try {\n      var win = getWindow();\n      result = win ? win.sessionStorage.getItem(key2) : null;\n    } catch (e) {\n    }\n    return result;\n  }\n  function setItem(key2, data2) {\n    var _a2;\n    try {\n      (_a2 = getWindow()) === null || _a2 === void 0 ? void 0 : _a2.sessionStorage.setItem(key2, data2);\n    } catch (e) {\n    }\n  }\n  var RTL_LOCAL_STORAGE_KEY = \"isRTL\";\n  var _isRTL;\n  function getRTL(theme) {\n    if (theme === void 0) {\n      theme = {};\n    }\n    if (theme.rtl !== void 0) {\n      return theme.rtl;\n    }\n    if (_isRTL === void 0) {\n      var savedRTL = getItem$1(RTL_LOCAL_STORAGE_KEY);\n      if (savedRTL !== null) {\n        _isRTL = savedRTL === \"1\";\n        setRTL(_isRTL);\n      }\n      var doc = getDocument();\n      if (_isRTL === void 0 && doc) {\n        _isRTL = (doc.body && doc.body.getAttribute(\"dir\") || doc.documentElement.getAttribute(\"dir\")) === \"rtl\";\n        setRTL$1(_isRTL);\n      }\n    }\n    return !!_isRTL;\n  }\n  function setRTL(isRTL, persistSetting) {\n    if (persistSetting === void 0) {\n      persistSetting = false;\n    }\n    var doc = getDocument();\n    if (doc) {\n      doc.documentElement.setAttribute(\"dir\", isRTL ? \"rtl\" : \"ltr\");\n    }\n    if (persistSetting) {\n      setItem(RTL_LOCAL_STORAGE_KEY, isRTL ? \"1\" : \"0\");\n    }\n    _isRTL = isRTL;\n    setRTL$1(_isRTL);\n  }\n  function getRTLSafeKeyCode(key2, theme) {\n    if (theme === void 0) {\n      theme = {};\n    }\n    if (getRTL(theme)) {\n      if (key2 === KeyCodes.left) {\n        key2 = KeyCodes.right;\n      } else if (key2 === KeyCodes.right) {\n        key2 = KeyCodes.left;\n      }\n    }\n    return key2;\n  }\n  var MAX_CACHE_COUNT = 50;\n  var DEFAULT_SPECIFICITY_MULTIPLIER = 5;\n  var _memoizedClassNames = 0;\n  var stylesheet$1 = Stylesheet.getInstance();\n  if (stylesheet$1 && stylesheet$1.onReset) {\n    stylesheet$1.onReset(function() {\n      return _memoizedClassNames++;\n    });\n  }\n  var retVal = \"__retval__\";\n  function classNamesFunction(options2) {\n    if (options2 === void 0) {\n      options2 = {};\n    }\n    var windowMap = /* @__PURE__ */ new Map();\n    var styleCalcCount = 0;\n    var getClassNamesCount = 0;\n    var currentMemoizedClassNames = _memoizedClassNames;\n    var getClassNames2 = function(styleFunctionOrObject, styleProps) {\n      var _a2;\n      if (styleProps === void 0) {\n        styleProps = {};\n      }\n      if (options2.useStaticStyles && typeof styleFunctionOrObject === \"function\" && styleFunctionOrObject.__noStyleOverride__) {\n        return styleFunctionOrObject(styleProps);\n      }\n      getClassNamesCount++;\n      var shadowConfig = styleFunctionOrObject ? styleFunctionOrObject.__shadowConfig__ : void 0;\n      var key2 = shadowConfig && shadowConfig.window ? shadowConfig.window : \"__default__\";\n      if (!windowMap.has(key2)) {\n        windowMap.set(key2, /* @__PURE__ */ new Map());\n      }\n      var current = windowMap.get(key2);\n      var theme = styleProps.theme;\n      var rtl = theme && theme.rtl !== void 0 ? theme.rtl : getRTL();\n      var disableCaching = options2.disableCaching;\n      if (currentMemoizedClassNames !== _memoizedClassNames) {\n        currentMemoizedClassNames = _memoizedClassNames;\n        windowMap.set(key2, /* @__PURE__ */ new Map());\n        current = windowMap.get(key2);\n        styleCalcCount = 0;\n      }\n      if (!options2.disableCaching) {\n        current = _traverseMap(windowMap.get(key2), styleFunctionOrObject);\n        current = _traverseMap(current, styleProps);\n      }\n      if (disableCaching || !current[retVal]) {\n        if (styleFunctionOrObject === void 0) {\n          current[retVal] = {};\n        } else {\n          current[retVal] = mergeCssSets([\n            typeof styleFunctionOrObject === \"function\" ? styleFunctionOrObject(styleProps) : styleFunctionOrObject\n          ], {\n            shadowConfig: styleFunctionOrObject.__shadowConfig__,\n            rtl: !!rtl,\n            specificityMultiplier: options2.useStaticStyles ? DEFAULT_SPECIFICITY_MULTIPLIER : void 0\n          });\n        }\n        if (!disableCaching) {\n          styleCalcCount++;\n        }\n      }\n      if (styleCalcCount > (options2.cacheSize || MAX_CACHE_COUNT)) {\n        var win = getWindow();\n        if ((_a2 = win === null || win === void 0 ? void 0 : win.FabricConfig) === null || _a2 === void 0 ? void 0 : _a2.enableClassNameCacheFullWarning) {\n          console.warn(\"Styles are being recalculated too frequently. Cache miss rate is \".concat(styleCalcCount, \"/\").concat(getClassNamesCount, \".\"));\n          console.trace();\n        }\n        windowMap.get(key2).clear();\n        styleCalcCount = 0;\n        options2.disableCaching = true;\n      }\n      return current[retVal];\n    };\n    return getClassNames2;\n  }\n  function _traverseEdge(current, value2) {\n    value2 = _normalizeValue(value2);\n    if (!current.has(value2)) {\n      current.set(value2, /* @__PURE__ */ new Map());\n    }\n    return current.get(value2);\n  }\n  function _traverseMap(current, inputs) {\n    if (typeof inputs === \"function\") {\n      var cachedInputsFromStyled = inputs.__cachedInputs__;\n      if (cachedInputsFromStyled) {\n        for (var _i = 0, _a2 = inputs.__cachedInputs__; _i < _a2.length; _i++) {\n          var input = _a2[_i];\n          current = _traverseEdge(current, input);\n        }\n      } else {\n        current = _traverseEdge(current, inputs);\n      }\n    } else if (typeof inputs === \"object\") {\n      for (var propName in inputs) {\n        if (inputs.hasOwnProperty(propName)) {\n          current = _traverseEdge(current, inputs[propName]);\n        }\n      }\n    }\n    return current;\n  }\n  function _normalizeValue(value2) {\n    switch (value2) {\n      case void 0:\n        return \"__undefined__\";\n      case null:\n        return \"__null__\";\n      default:\n        return value2;\n    }\n  }\n  var _initializedStylesheetResets$1 = false;\n  var _resetCounter = 0;\n  var _emptyObject = { empty: true };\n  var _dictionary = {};\n  var _weakMap = typeof WeakMap === \"undefined\" ? null : WeakMap;\n  function resetMemoizations() {\n    _resetCounter++;\n  }\n  function memoizeFunction(cb, maxCacheSize, ignoreNullOrUndefinedResult) {\n    if (maxCacheSize === void 0) {\n      maxCacheSize = 100;\n    }\n    if (ignoreNullOrUndefinedResult === void 0) {\n      ignoreNullOrUndefinedResult = false;\n    }\n    if (!_weakMap) {\n      return cb;\n    }\n    if (!_initializedStylesheetResets$1) {\n      var stylesheet2 = Stylesheet.getInstance();\n      if (stylesheet2 && stylesheet2.onReset) {\n        Stylesheet.getInstance().onReset(resetMemoizations);\n      }\n      _initializedStylesheetResets$1 = true;\n    }\n    var rootNode;\n    var cacheSize = 0;\n    var localResetCounter = _resetCounter;\n    return function memoizedFunction() {\n      var args = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n      }\n      var currentNode = rootNode;\n      if (rootNode === void 0 || localResetCounter !== _resetCounter || maxCacheSize > 0 && cacheSize > maxCacheSize) {\n        rootNode = _createNode();\n        cacheSize = 0;\n        localResetCounter = _resetCounter;\n      }\n      currentNode = rootNode;\n      for (var i = 0; i < args.length; i++) {\n        var arg = _normalizeArg(args[i]);\n        if (!currentNode.map.has(arg)) {\n          currentNode.map.set(arg, _createNode());\n        }\n        currentNode = currentNode.map.get(arg);\n      }\n      if (!currentNode.hasOwnProperty(\"value\")) {\n        currentNode.value = cb.apply(void 0, args);\n        cacheSize++;\n      }\n      if (ignoreNullOrUndefinedResult && (currentNode.value === null || currentNode.value === void 0)) {\n        currentNode.value = cb.apply(void 0, args);\n      }\n      return currentNode.value;\n    };\n  }\n  function createMemoizer(getValue2) {\n    if (!_weakMap) {\n      return getValue2;\n    }\n    var cache2 = new _weakMap();\n    function memoizedGetValue(input) {\n      if (!input || typeof input !== \"function\" && typeof input !== \"object\") {\n        return getValue2(input);\n      }\n      if (cache2.has(input)) {\n        return cache2.get(input);\n      }\n      var value2 = getValue2(input);\n      cache2.set(input, value2);\n      return value2;\n    }\n    return memoizedGetValue;\n  }\n  function _normalizeArg(val) {\n    if (!val) {\n      return _emptyObject;\n    } else if (typeof val === \"object\" || typeof val === \"function\") {\n      return val;\n    } else if (!_dictionary[val]) {\n      _dictionary[val] = { val };\n    }\n    return _dictionary[val];\n  }\n  function _createNode() {\n    return {\n      map: _weakMap ? new _weakMap() : null\n    };\n  }\n  function createComposedComponent(outer) {\n    var Outer = outer;\n    var outerMemoizer = createMemoizer(function(inner) {\n      if (outer === inner) {\n        throw new Error(\"Attempted to compose a component with itself.\");\n      }\n      var Inner = inner;\n      var innerMemoizer = createMemoizer(function(defaultRender) {\n        var InnerWithDefaultRender = function(innerProps) {\n          return React__namespace.createElement(Inner, __assign$1({}, innerProps, { defaultRender }));\n        };\n        return InnerWithDefaultRender;\n      });\n      var OuterWithDefaultRender = function(outerProps) {\n        var defaultRender = outerProps.defaultRender;\n        return React__namespace.createElement(Outer, __assign$1({}, outerProps, { defaultRender: defaultRender ? innerMemoizer(defaultRender) : Inner }));\n      };\n      return OuterWithDefaultRender;\n    });\n    return outerMemoizer;\n  }\n  var componentAsMemoizer = createMemoizer(createComposedComponent);\n  function composeComponentAs(outer, inner) {\n    return componentAsMemoizer(outer)(inner);\n  }\n  function isControlled(props, valueProp) {\n    return props[valueProp] !== void 0 && props[valueProp] !== null;\n  }\n  function css() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      args[_i] = arguments[_i];\n    }\n    var classes = [];\n    for (var _a2 = 0, args_1 = args; _a2 < args_1.length; _a2++) {\n      var arg = args_1[_a2];\n      if (arg) {\n        if (typeof arg === \"string\") {\n          classes.push(arg);\n        } else if (arg.hasOwnProperty(\"toString\") && typeof arg.toString === \"function\") {\n          classes.push(arg.toString());\n        } else {\n          for (var key2 in arg) {\n            if (arg[key2]) {\n              classes.push(key2);\n            }\n          }\n        }\n      }\n    }\n    return classes.join(\" \");\n  }\n  var CustomizationsGlobalKey = \"customizations\";\n  var NO_CUSTOMIZATIONS = { settings: {}, scopedSettings: {}, inCustomizerContext: false };\n  var _allSettings = GlobalSettings.getValue(CustomizationsGlobalKey, {\n    settings: {},\n    scopedSettings: {},\n    inCustomizerContext: false\n  });\n  var _events = [];\n  var Customizations = (\n    /** @class */\n    (function() {\n      function Customizations2() {\n      }\n      Customizations2.reset = function() {\n        _allSettings.settings = {};\n        _allSettings.scopedSettings = {};\n      };\n      Customizations2.applySettings = function(settings) {\n        _allSettings.settings = __assign$1(__assign$1({}, _allSettings.settings), settings);\n        Customizations2._raiseChange();\n      };\n      Customizations2.applyScopedSettings = function(scopeName, settings) {\n        _allSettings.scopedSettings[scopeName] = __assign$1(__assign$1({}, _allSettings.scopedSettings[scopeName]), settings);\n        Customizations2._raiseChange();\n      };\n      Customizations2.getSettings = function(properties, scopeName, localSettings) {\n        if (localSettings === void 0) {\n          localSettings = NO_CUSTOMIZATIONS;\n        }\n        var settings = {};\n        var localScopedSettings = scopeName && localSettings.scopedSettings[scopeName] || {};\n        var globalScopedSettings = scopeName && _allSettings.scopedSettings[scopeName] || {};\n        for (var _i = 0, properties_1 = properties; _i < properties_1.length; _i++) {\n          var property2 = properties_1[_i];\n          settings[property2] = localScopedSettings[property2] || localSettings.settings[property2] || globalScopedSettings[property2] || _allSettings.settings[property2];\n        }\n        return settings;\n      };\n      Customizations2.applyBatchedUpdates = function(code, suppressUpdate) {\n        Customizations2._suppressUpdates = true;\n        try {\n          code();\n        } catch (_a2) {\n        }\n        Customizations2._suppressUpdates = false;\n        if (!suppressUpdate) {\n          Customizations2._raiseChange();\n        }\n      };\n      Customizations2.observe = function(onChange) {\n        _events.push(onChange);\n      };\n      Customizations2.unobserve = function(onChange) {\n        _events = _events.filter(function(cb) {\n          return cb !== onChange;\n        });\n      };\n      Customizations2._raiseChange = function() {\n        if (!Customizations2._suppressUpdates) {\n          _events.forEach(function(cb) {\n            return cb();\n          });\n        }\n      };\n      return Customizations2;\n    })()\n  );\n  var CustomizerContext = React__namespace.createContext({\n    customizations: {\n      inCustomizerContext: false,\n      settings: {},\n      scopedSettings: {}\n    }\n  });\n  function mergeSettings(oldSettings, newSettings) {\n    if (oldSettings === void 0) {\n      oldSettings = {};\n    }\n    var mergeSettingsWith = _isSettingsFunction(newSettings) ? newSettings : _settingsMergeWith(newSettings);\n    return mergeSettingsWith(oldSettings);\n  }\n  function mergeScopedSettings(oldSettings, newSettings) {\n    if (oldSettings === void 0) {\n      oldSettings = {};\n    }\n    var mergeSettingsWith = _isSettingsFunction(newSettings) ? newSettings : _scopedSettingsMergeWith(newSettings);\n    return mergeSettingsWith(oldSettings);\n  }\n  function _isSettingsFunction(settings) {\n    return typeof settings === \"function\";\n  }\n  function _settingsMergeWith(newSettings) {\n    return function(settings) {\n      return newSettings ? __assign$1(__assign$1({}, settings), newSettings) : settings;\n    };\n  }\n  function _scopedSettingsMergeWith(scopedSettingsFromProps) {\n    if (scopedSettingsFromProps === void 0) {\n      scopedSettingsFromProps = {};\n    }\n    return function(oldScopedSettings) {\n      var newScopedSettings = __assign$1({}, oldScopedSettings);\n      for (var scopeName in scopedSettingsFromProps) {\n        if (scopedSettingsFromProps.hasOwnProperty(scopeName)) {\n          newScopedSettings[scopeName] = __assign$1(__assign$1({}, oldScopedSettings[scopeName]), scopedSettingsFromProps[scopeName]);\n        }\n      }\n      return newScopedSettings;\n    };\n  }\n  function mergeCustomizations(props, parentContext) {\n    var _a2 = (parentContext || {}).customizations, customizations = _a2 === void 0 ? { settings: {}, scopedSettings: {} } : _a2;\n    return {\n      customizations: {\n        settings: mergeSettings(customizations.settings, props.settings),\n        scopedSettings: mergeScopedSettings(customizations.scopedSettings, props.scopedSettings),\n        inCustomizerContext: true\n      }\n    };\n  }\n  var Customizer = (\n    /** @class */\n    (function(_super) {\n      __extends(Customizer2, _super);\n      function Customizer2() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._onCustomizationChange = function() {\n          return _this.forceUpdate();\n        };\n        return _this;\n      }\n      Customizer2.prototype.componentDidMount = function() {\n        Customizations.observe(this._onCustomizationChange);\n      };\n      Customizer2.prototype.componentWillUnmount = function() {\n        Customizations.unobserve(this._onCustomizationChange);\n      };\n      Customizer2.prototype.render = function() {\n        var _this = this;\n        var contextTransform = this.props.contextTransform;\n        return React__namespace.createElement(CustomizerContext.Consumer, null, function(parentContext) {\n          var newContext = mergeCustomizations(_this.props, parentContext);\n          if (contextTransform) {\n            newContext = contextTransform(newContext);\n          }\n          return React__namespace.createElement(CustomizerContext.Provider, { value: newContext }, _this.props.children);\n        });\n      };\n      return Customizer2;\n    })(React__namespace.Component)\n  );\n  function hoistStatics(source2, dest) {\n    for (var name_1 in source2) {\n      if (source2.hasOwnProperty(name_1)) {\n        dest[name_1] = source2[name_1];\n      }\n    }\n    return dest;\n  }\n  var noop$5 = function() {\n    return false;\n  };\n  var noopShadow = function() {\n    return DEFAULT_SHADOW_CONFIG;\n  };\n  var noopRootStylesheets = function() {\n    return /* @__PURE__ */ new Map();\n  };\n  var noopUndefined = function() {\n    return void 0;\n  };\n  var getNewContext = function() {\n    return {\n      stylesheets: /* @__PURE__ */ new Map(),\n      useAdoptedStylesheetEx: noop$5,\n      useAdoptedStylesheet: noop$5,\n      useShadowConfig: noopShadow,\n      useMergeStylesShadowRootContext: noopUndefined,\n      useHasMergeStylesShadowRootContext: noop$5,\n      useMergeStylesRootStylesheets: noopRootStylesheets,\n      useWindow: noopUndefined,\n      useStyled: noopUndefined\n    };\n  };\n  var MergeStylesDefaultContext = React__namespace.createContext(getNewContext());\n  var useMergeStylesHooks = function() {\n    var ctx = React__namespace.useContext(MergeStylesDefaultContext);\n    return {\n      useAdoptedStylesheet: ctx.useAdoptedStylesheet,\n      useAdoptedStylesheetEx: ctx.useAdoptedStylesheetEx,\n      useShadowConfig: ctx.useShadowConfig,\n      useMergeStylesShadowRootContext: ctx.useMergeStylesShadowRootContext,\n      useHasMergeStylesShadowRootContext: ctx.useHasMergeStylesShadowRootContext,\n      useMergeStylesRootStylesheets: ctx.useMergeStylesRootStylesheets,\n      useWindow: ctx.useWindow,\n      useStyled: ctx.useStyled\n    };\n  };\n  var MergeStylesShadowRootContext = React__namespace.createContext(void 0);\n  var useHasMergeStylesShadowRootContext = function() {\n    return !!useMergeStylesShadowRootContext();\n  };\n  var useMergeStylesShadowRootContext = function() {\n    return React__namespace.useContext(MergeStylesShadowRootContext);\n  };\n  var MergeStylesShadowRootConsumer = function(_a2) {\n    var stylesheetKey = _a2.stylesheetKey, children2 = _a2.children;\n    var _b2 = useMergeStylesHooks(), useAdoptedStylesheetEx = _b2.useAdoptedStylesheetEx, useMergeStylesRootStylesheets = _b2.useMergeStylesRootStylesheets, useWindow2 = _b2.useWindow;\n    var shadowCtx = useMergeStylesShadowRootContext();\n    var rootMergeStyles = useMergeStylesRootStylesheets();\n    var win = useWindow2();\n    useAdoptedStylesheetEx(GLOBAL_STYLESHEET_KEY, shadowCtx, rootMergeStyles, win);\n    useAdoptedStylesheetEx(stylesheetKey, shadowCtx, rootMergeStyles, win);\n    return children2(!!shadowCtx);\n  };\n  var WindowContext = React__namespace.createContext({\n    // eslint-disable-next-line no-restricted-globals\n    window: typeof window === \"object\" ? window : void 0\n  });\n  var useWindow = function() {\n    return React__namespace.useContext(WindowContext).window;\n  };\n  var useDocument = function() {\n    var _a2;\n    return (_a2 = React__namespace.useContext(WindowContext).window) === null || _a2 === void 0 ? void 0 : _a2.document;\n  };\n  var memoizedMakeShadowConfig = memoizeFunction(makeShadowConfig);\n  var mergeComponentStyles = memoizeFunction(\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function(defaultStyles, componentStyles, shadowConfig) {\n      var _a2;\n      var styles = (_a2 = componentStyles !== null && componentStyles !== void 0 ? componentStyles : defaultStyles) !== null && _a2 !== void 0 ? _a2 : {};\n      styles.__shadowConfig__ = shadowConfig;\n      return styles;\n    }\n  );\n  function customizable(scope, fields, concatStyles) {\n    return function customizableFactory(ComposedComponent) {\n      var _a2;\n      var resultClass = (_a2 = /** @class */\n      (function(_super) {\n        __extends(ComponentWithInjectedProps, _super);\n        function ComponentWithInjectedProps(props) {\n          var _this = _super.call(this, props) || this;\n          _this._styleCache = {};\n          _this._onSettingChanged = _this._onSettingChanged.bind(_this);\n          return _this;\n        }\n        ComponentWithInjectedProps.prototype.componentDidMount = function() {\n          Customizations.observe(this._onSettingChanged);\n        };\n        ComponentWithInjectedProps.prototype.componentWillUnmount = function() {\n          Customizations.unobserve(this._onSettingChanged);\n        };\n        ComponentWithInjectedProps.prototype.render = function() {\n          var _this = this;\n          return React__namespace.createElement(MergeStylesShadowRootConsumer, { stylesheetKey: scope }, function(inShadow) {\n            return React__namespace.createElement(CustomizerContext.Consumer, null, function(context2) {\n              var _b2;\n              var defaultProps = Customizations.getSettings(fields, scope, context2.customizations);\n              var win = (_b2 = _this.context.window) !== null && _b2 !== void 0 ? _b2 : getWindow();\n              var shadowConfig = memoizedMakeShadowConfig(scope, inShadow, win);\n              var componentProps = _this.props;\n              if (defaultProps.styles && typeof defaultProps.styles === \"function\") {\n                defaultProps.styles = defaultProps.styles(__assign$1(__assign$1({}, defaultProps), componentProps));\n              }\n              if (defaultProps.styles) {\n                if (_this._styleCache.default !== defaultProps.styles || _this._styleCache.component !== componentProps.styles) {\n                  var mergedStyles = concatStyleSets(defaultProps.styles, componentProps.styles);\n                  mergedStyles.__shadowConfig__ = shadowConfig;\n                  _this._styleCache.default = defaultProps.styles;\n                  _this._styleCache.component = componentProps.styles;\n                  _this._styleCache.merged = mergedStyles;\n                }\n                return React__namespace.createElement(ComposedComponent, __assign$1({}, defaultProps, componentProps, { styles: _this._styleCache.merged }));\n              }\n              var styles = mergeComponentStyles(defaultProps.styles, componentProps.styles, shadowConfig);\n              return React__namespace.createElement(ComposedComponent, __assign$1({}, defaultProps, componentProps, { styles }));\n            });\n          });\n        };\n        ComponentWithInjectedProps.prototype._onSettingChanged = function() {\n          this.forceUpdate();\n        };\n        return ComponentWithInjectedProps;\n      })(React__namespace.Component), _a2.displayName = \"Customized\" + scope, _a2.contextType = WindowContext, _a2);\n      return hoistStatics(ComposedComponent, resultClass);\n    };\n  }\n  function useCustomizationSettings(properties, scopeName) {\n    var forceUpdate = useForceUpdate();\n    var customizations = React__namespace.useContext(CustomizerContext).customizations;\n    var inCustomizerContext = customizations.inCustomizerContext;\n    React__namespace.useEffect(function() {\n      if (!inCustomizerContext) {\n        Customizations.observe(forceUpdate);\n      }\n      return function() {\n        if (!inCustomizerContext) {\n          Customizations.unobserve(forceUpdate);\n        }\n      };\n    }, [inCustomizerContext]);\n    return Customizations.getSettings(properties, scopeName, customizations);\n  }\n  function useForceUpdate() {\n    var _a2 = React__namespace.useState(0), setValue = _a2[1];\n    return function() {\n      return setValue(function(value2) {\n        return ++value2;\n      });\n    };\n  }\n  function extendComponent(parent, methods2) {\n    for (var name_1 in methods2) {\n      if (methods2.hasOwnProperty(name_1)) {\n        parent[name_1] = appendFunction(parent, parent[name_1], methods2[name_1]);\n      }\n    }\n  }\n  var CURRENT_ID_PROPERTY = \"__currentId__\";\n  var DEFAULT_ID_STRING = \"id__\";\n  var _global = getWindow() || {};\n  if (_global[CURRENT_ID_PROPERTY] === void 0) {\n    _global[CURRENT_ID_PROPERTY] = 0;\n  }\n  var _initializedStylesheetResets = false;\n  function getId(prefix) {\n    if (!_initializedStylesheetResets) {\n      var stylesheet2 = Stylesheet.getInstance();\n      if (stylesheet2 && stylesheet2.onReset) {\n        stylesheet2.onReset(resetIds);\n      }\n      _initializedStylesheetResets = true;\n    }\n    var index2 = _global[CURRENT_ID_PROPERTY]++;\n    return (prefix === void 0 ? DEFAULT_ID_STRING : prefix) + index2;\n  }\n  function resetIds(counter) {\n    if (counter === void 0) {\n      counter = 0;\n    }\n    _global[CURRENT_ID_PROPERTY] = counter;\n  }\n  var toObjectMap = function() {\n    var items = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      items[_i] = arguments[_i];\n    }\n    var result = {};\n    for (var _a2 = 0, items_1 = items; _a2 < items_1.length; _a2++) {\n      var item = items_1[_a2];\n      var keys2 = Array.isArray(item) ? item : Object.keys(item);\n      for (var _b2 = 0, keys_1 = keys2; _b2 < keys_1.length; _b2++) {\n        var key2 = keys_1[_b2];\n        result[key2] = 1;\n      }\n    }\n    return result;\n  };\n  var baseElementEvents = toObjectMap([\n    \"onCopy\",\n    \"onCut\",\n    \"onPaste\",\n    \"onCompositionEnd\",\n    \"onCompositionStart\",\n    \"onCompositionUpdate\",\n    \"onFocus\",\n    \"onFocusCapture\",\n    \"onBlur\",\n    \"onBlurCapture\",\n    \"onChange\",\n    \"onInput\",\n    \"onSubmit\",\n    \"onLoad\",\n    \"onError\",\n    \"onKeyDown\",\n    \"onKeyDownCapture\",\n    \"onKeyPress\",\n    \"onKeyUp\",\n    \"onAbort\",\n    \"onCanPlay\",\n    \"onCanPlayThrough\",\n    \"onDurationChange\",\n    \"onEmptied\",\n    \"onEncrypted\",\n    \"onEnded\",\n    \"onLoadedData\",\n    \"onLoadedMetadata\",\n    \"onLoadStart\",\n    \"onPause\",\n    \"onPlay\",\n    \"onPlaying\",\n    \"onProgress\",\n    \"onRateChange\",\n    \"onSeeked\",\n    \"onSeeking\",\n    \"onStalled\",\n    \"onSuspend\",\n    \"onTimeUpdate\",\n    \"onVolumeChange\",\n    \"onWaiting\",\n    \"onClick\",\n    \"onClickCapture\",\n    \"onContextMenu\",\n    \"onDoubleClick\",\n    \"onDrag\",\n    \"onDragEnd\",\n    \"onDragEnter\",\n    \"onDragExit\",\n    \"onDragLeave\",\n    \"onDragOver\",\n    \"onDragStart\",\n    \"onDrop\",\n    \"onMouseDown\",\n    \"onMouseDownCapture\",\n    \"onMouseEnter\",\n    \"onMouseLeave\",\n    \"onMouseMove\",\n    \"onMouseOut\",\n    \"onMouseOver\",\n    \"onMouseUp\",\n    \"onMouseUpCapture\",\n    \"onSelect\",\n    \"onTouchCancel\",\n    \"onTouchEnd\",\n    \"onTouchMove\",\n    \"onTouchStart\",\n    \"onScroll\",\n    \"onWheel\",\n    \"onPointerCancel\",\n    \"onPointerDown\",\n    \"onPointerEnter\",\n    \"onPointerLeave\",\n    \"onPointerMove\",\n    \"onPointerOut\",\n    \"onPointerOver\",\n    \"onPointerUp\",\n    \"onGotPointerCapture\",\n    \"onLostPointerCapture\"\n  ]);\n  var baseElementProperties = toObjectMap([\n    \"accessKey\",\n    // global\n    \"children\",\n    // global\n    \"className\",\n    // global\n    \"contentEditable\",\n    // global\n    \"dir\",\n    // global\n    \"draggable\",\n    // global\n    \"hidden\",\n    // global\n    \"htmlFor\",\n    // global\n    \"id\",\n    // global\n    \"lang\",\n    // global\n    \"ref\",\n    // global\n    \"role\",\n    // global\n    \"style\",\n    // global\n    \"tabIndex\",\n    // global\n    \"title\",\n    // global\n    \"translate\",\n    // global\n    \"spellCheck\",\n    // global\n    \"name\"\n    // global\n  ]);\n  var htmlElementProperties = toObjectMap(baseElementProperties, baseElementEvents);\n  toObjectMap(htmlElementProperties, [\n    \"form\"\n    // button, fieldset, input, label, meter, object, output, select, textarea\n  ]);\n  var audioProperties = toObjectMap(htmlElementProperties, [\n    \"height\",\n    // canvas, embed, iframe, img, input, object, video\n    \"loop\",\n    // audio, video\n    \"muted\",\n    // audio, video\n    \"preload\",\n    // audio, video\n    \"src\",\n    // audio, embed, iframe, img, input, script, source, track, video\n    \"width\"\n    // canvas, embed, iframe, img, input, object, video\n  ]);\n  toObjectMap(audioProperties, [\n    \"poster\"\n    // video\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"start\"\n    // ol\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"value\"\n    // button, input, li, option, meter, progress, param\n  ]);\n  var anchorProperties = toObjectMap(htmlElementProperties, [\n    \"download\",\n    // a, area\n    \"href\",\n    // a, area, base, link\n    \"hrefLang\",\n    // a, area, link\n    \"media\",\n    // a, area, link, source, style\n    \"rel\",\n    // a, area, link\n    \"target\",\n    // a, area, base, form\n    \"type\"\n    // a, button, input, link, menu, object, script, source, style\n  ]);\n  var buttonProperties = toObjectMap(htmlElementProperties, [\n    \"autoFocus\",\n    // button, input, select, textarea\n    \"disabled\",\n    // button, fieldset, input, optgroup, option, select, textarea\n    \"form\",\n    // button, fieldset, input, label, meter, object, output, select, textarea\n    \"formAction\",\n    // input, button\n    \"formEncType\",\n    // input, button\n    \"formMethod\",\n    // input, button\n    \"formNoValidate\",\n    // input, button\n    \"formTarget\",\n    // input, button\n    \"type\",\n    // a, button, input, link, menu, object, script, source, style\n    \"value\"\n    // button, input, li, option, meter, progress, param,\n  ]);\n  var inputProperties = toObjectMap(buttonProperties, [\n    \"accept\",\n    // input\n    \"alt\",\n    // area, img, input\n    \"autoCapitalize\",\n    // input, textarea\n    \"autoComplete\",\n    // form, input\n    \"checked\",\n    // input\n    \"dirname\",\n    // input, textarea\n    \"form\",\n    // button, fieldset, input, label, meter, object, output, select, textarea\n    \"height\",\n    // canvas, embed, iframe, img, input, object, video\n    \"inputMode\",\n    // input\n    \"list\",\n    // input\n    \"max\",\n    // input, meter\n    \"maxLength\",\n    // input, textarea\n    \"min\",\n    // input, meter\n    \"minLength\",\n    // input, textarea\n    \"multiple\",\n    // input, select\n    \"pattern\",\n    // input\n    \"placeholder\",\n    // input, textarea\n    \"readOnly\",\n    // input, textarea\n    \"required\",\n    // input, select, textarea\n    \"src\",\n    // audio, embed, iframe, img, input, script, source, track, video\n    \"step\",\n    // input\n    \"size\",\n    // input\n    \"type\",\n    // a, button, input, link, menu, object, script, source, style\n    \"value\",\n    // button, input, li, option, meter, progress, param\n    \"width\"\n    // canvas, embed, iframe, img, input, object, video\n  ]);\n  var textAreaProperties = toObjectMap(buttonProperties, [\n    \"autoCapitalize\",\n    // input, textarea\n    \"cols\",\n    // textarea\n    \"dirname\",\n    // input, textarea\n    \"form\",\n    // button, fieldset, input, label, meter, object, output, select, textarea\n    \"maxLength\",\n    // input, textarea\n    \"minLength\",\n    // input, textarea\n    \"placeholder\",\n    // input, textarea\n    \"readOnly\",\n    // input, textarea\n    \"required\",\n    // input, select, textarea\n    \"rows\",\n    // textarea\n    \"wrap\"\n    // textarea\n  ]);\n  toObjectMap(buttonProperties, [\n    \"form\",\n    // button, fieldset, input, label, meter, object, output, select, textarea\n    \"multiple\",\n    // input, select\n    \"required\"\n    // input, select, textarea\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"selected\",\n    // option\n    \"value\"\n    // button, input, li, option, meter, progress, param\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"cellPadding\",\n    // table\n    \"cellSpacing\"\n    // table\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"rowSpan\",\n    // td, th\n    \"scope\"\n    // th\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"colSpan\",\n    // td\n    \"headers\",\n    // td\n    \"rowSpan\",\n    // td, th\n    \"scope\"\n    // th\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"span\"\n    // col, colgroup\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"span\"\n    // col, colgroup\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"acceptCharset\",\n    // form\n    \"action\",\n    // form\n    \"encType\",\n    // form\n    \"encType\",\n    // form\n    \"method\",\n    // form\n    \"noValidate\",\n    // form\n    \"target\"\n    // form\n  ]);\n  toObjectMap(htmlElementProperties, [\n    \"allow\",\n    // iframe\n    \"allowFullScreen\",\n    // iframe\n    \"allowPaymentRequest\",\n    // iframe\n    \"allowTransparency\",\n    // iframe\n    \"csp\",\n    // iframe\n    \"height\",\n    // canvas, embed, iframe, img, input, object, video\n    \"importance\",\n    // iframe\n    \"referrerPolicy\",\n    // iframe\n    \"sandbox\",\n    // iframe\n    \"src\",\n    // audio, embed, iframe, img, input, script, source, track, video\n    \"srcDoc\",\n    // iframe\n    \"width\"\n    // canvas, embed, iframe, img, input, object, video,\n  ]);\n  var imgProperties = toObjectMap(htmlElementProperties, [\n    \"alt\",\n    // area, img, input\n    \"crossOrigin\",\n    // img\n    \"height\",\n    // canvas, embed, iframe, img, input, object, video\n    \"src\",\n    // audio, embed, iframe, img, input, script, source, track, video\n    \"srcSet\",\n    // img, source\n    \"useMap\",\n    // img, object,\n    \"width\"\n    // canvas, embed, iframe, img, input, object, video\n  ]);\n  var divProperties = htmlElementProperties;\n  function getNativeProps(props, allowedPropNames, excludedPropNames) {\n    var isArray2 = Array.isArray(allowedPropNames);\n    var result = {};\n    var keys2 = Object.keys(props);\n    for (var _i = 0, keys_2 = keys2; _i < keys_2.length; _i++) {\n      var key2 = keys_2[_i];\n      var isNativeProp = !isArray2 && allowedPropNames[key2] || isArray2 && allowedPropNames.indexOf(key2) >= 0 || key2.indexOf(\"data-\") === 0 || key2.indexOf(\"aria-\") === 0;\n      if (isNativeProp && (!excludedPropNames || (excludedPropNames === null || excludedPropNames === void 0 ? void 0 : excludedPropNames.indexOf(key2)) === -1)) {\n        result[key2] = props[key2];\n      }\n    }\n    return result;\n  }\n  var REACT_LIFECYCLE_EXCLUSIONS = [\n    \"setState\",\n    \"render\",\n    \"componentWillMount\",\n    \"UNSAFE_componentWillMount\",\n    \"componentDidMount\",\n    \"componentWillReceiveProps\",\n    \"UNSAFE_componentWillReceiveProps\",\n    \"shouldComponentUpdate\",\n    \"componentWillUpdate\",\n    \"getSnapshotBeforeUpdate\",\n    \"UNSAFE_componentWillUpdate\",\n    \"componentDidUpdate\",\n    \"componentWillUnmount\"\n  ];\n  function hoistMethods(destination, source2, exclusions) {\n    if (exclusions === void 0) {\n      exclusions = REACT_LIFECYCLE_EXCLUSIONS;\n    }\n    var hoisted = [];\n    var _loop_1 = function(methodName2) {\n      if (typeof source2[methodName2] === \"function\" && destination[methodName2] === void 0 && (!exclusions || exclusions.indexOf(methodName2) === -1)) {\n        hoisted.push(methodName2);\n        destination[methodName2] = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          source2[methodName2].apply(source2, args);\n        };\n      }\n    };\n    for (var methodName in source2) {\n      _loop_1(methodName);\n    }\n    return hoisted;\n  }\n  function unhoistMethods(source2, methodNames) {\n    methodNames.forEach(function(methodName) {\n      return delete source2[methodName];\n    });\n  }\n  function initializeComponentRef(obj2) {\n    extendComponent(obj2, {\n      componentDidMount: _onMount,\n      componentDidUpdate: _onUpdate,\n      componentWillUnmount: _onUnmount\n    });\n  }\n  function _onMount() {\n    _setComponentRef(this.props.componentRef, this);\n  }\n  function _onUpdate(prevProps) {\n    if (prevProps.componentRef !== this.props.componentRef) {\n      _setComponentRef(prevProps.componentRef, null);\n      _setComponentRef(this.props.componentRef, this);\n    }\n  }\n  function _onUnmount() {\n    _setComponentRef(this.props.componentRef, null);\n  }\n  function _setComponentRef(componentRef, value2) {\n    if (componentRef) {\n      if (typeof componentRef === \"object\") {\n        componentRef.current = value2;\n      } else if (typeof componentRef === \"function\") {\n        componentRef(value2);\n      }\n    }\n  }\n  var _a$5;\n  var DirectionalKeyCodes = (_a$5 = {}, _a$5[KeyCodes.up] = 1, _a$5[KeyCodes.down] = 1, _a$5[KeyCodes.left] = 1, _a$5[KeyCodes.right] = 1, _a$5[KeyCodes.home] = 1, _a$5[KeyCodes.end] = 1, _a$5[KeyCodes.tab] = 1, _a$5[KeyCodes.pageUp] = 1, _a$5[KeyCodes.pageDown] = 1, _a$5);\n  function isDirectionalKeyCode(which) {\n    return !!DirectionalKeyCodes[which];\n  }\n  var IsFocusVisibleClassName = \"ms-Fabric--isFocusVisible\";\n  var IsFocusHiddenClassName = \"ms-Fabric--isFocusHidden\";\n  function updateClassList(el, enabled) {\n    if (el) {\n      el.classList.add(enabled ? IsFocusVisibleClassName : IsFocusHiddenClassName);\n      el.classList.remove(enabled ? IsFocusHiddenClassName : IsFocusVisibleClassName);\n    }\n  }\n  function setFocusVisibility(enabled, target2, registeredProviders) {\n    var _a2;\n    if (registeredProviders) {\n      registeredProviders.forEach(function(ref2) {\n        return updateClassList(ref2.current, enabled);\n      });\n    } else {\n      updateClassList((_a2 = getWindow(target2)) === null || _a2 === void 0 ? void 0 : _a2.document.body, enabled);\n    }\n  }\n  var mountCounters = /* @__PURE__ */ new WeakMap();\n  var callbackMap = /* @__PURE__ */ new WeakMap();\n  function setMountCounters(key2, delta) {\n    var newValue;\n    var currValue = mountCounters.get(key2);\n    if (currValue) {\n      newValue = currValue + delta;\n    } else {\n      newValue = 1;\n    }\n    mountCounters.set(key2, newValue);\n    return newValue;\n  }\n  function setCallbackMap(context2) {\n    var callbacks = callbackMap.get(context2);\n    if (callbacks) {\n      return callbacks;\n    }\n    var onMouseDown = function(ev) {\n      return _onMouseDown(ev, context2.registeredProviders);\n    };\n    var onPointerDown = function(ev) {\n      return _onPointerDown(ev, context2.registeredProviders);\n    };\n    var onKeyDown = function(ev) {\n      return _onKeyDown(ev, context2.registeredProviders);\n    };\n    var onKeyUp = function(ev) {\n      return _onKeyUp(ev, context2.registeredProviders);\n    };\n    callbacks = { onMouseDown, onPointerDown, onKeyDown, onKeyUp };\n    callbackMap.set(context2, callbacks);\n    return callbacks;\n  }\n  var FocusRectsContext = React__namespace.createContext(void 0);\n  function useFocusRects(rootRef) {\n    var context2 = React__namespace.useContext(FocusRectsContext);\n    React__namespace.useEffect(function() {\n      var _a2, _b2, _c2, _d2;\n      var win = getWindow(rootRef === null || rootRef === void 0 ? void 0 : rootRef.current);\n      if (!win || ((_a2 = win.FabricConfig) === null || _a2 === void 0 ? void 0 : _a2.disableFocusRects) === true) {\n        return void 0;\n      }\n      var el = win;\n      var onMouseDown;\n      var onPointerDown;\n      var onKeyDown;\n      var onKeyUp;\n      if (((_b2 = context2 === null || context2 === void 0 ? void 0 : context2.providerRef) === null || _b2 === void 0 ? void 0 : _b2.current) && ((_d2 = (_c2 = context2 === null || context2 === void 0 ? void 0 : context2.providerRef) === null || _c2 === void 0 ? void 0 : _c2.current) === null || _d2 === void 0 ? void 0 : _d2.addEventListener)) {\n        el = context2.providerRef.current;\n        var callbacks = (\n          /*@__NOINLINE__*/\n          setCallbackMap(context2)\n        );\n        onMouseDown = callbacks.onMouseDown;\n        onPointerDown = callbacks.onPointerDown;\n        onKeyDown = callbacks.onKeyDown;\n        onKeyUp = callbacks.onKeyUp;\n      } else {\n        onMouseDown = _onMouseDown;\n        onPointerDown = _onPointerDown;\n        onKeyDown = _onKeyDown;\n        onKeyUp = _onKeyUp;\n      }\n      var count2 = setMountCounters(el, 1);\n      if (count2 <= 1) {\n        el.addEventListener(\"mousedown\", onMouseDown, true);\n        el.addEventListener(\"pointerdown\", onPointerDown, true);\n        el.addEventListener(\"keydown\", onKeyDown, true);\n        el.addEventListener(\"keyup\", onKeyUp, true);\n      }\n      return function() {\n        var _a3;\n        if (!win || ((_a3 = win.FabricConfig) === null || _a3 === void 0 ? void 0 : _a3.disableFocusRects) === true) {\n          return;\n        }\n        count2 = setMountCounters(el, -1);\n        if (count2 === 0) {\n          el.removeEventListener(\"mousedown\", onMouseDown, true);\n          el.removeEventListener(\"pointerdown\", onPointerDown, true);\n          el.removeEventListener(\"keydown\", onKeyDown, true);\n          el.removeEventListener(\"keyup\", onKeyUp, true);\n        }\n      };\n    }, [context2, rootRef]);\n  }\n  var FocusRects = function(props) {\n    useFocusRects(props.rootRef);\n    return null;\n  };\n  function _onMouseDown(ev, registeredProviders) {\n    setFocusVisibility(false, ev.target, registeredProviders);\n  }\n  function _onPointerDown(ev, registeredProviders) {\n    if (ev.pointerType !== \"mouse\") {\n      setFocusVisibility(false, ev.target, registeredProviders);\n    }\n  }\n  function _onKeyDown(ev, registeredProviders) {\n    if (isDirectionalKeyCode(ev.which)) {\n      setFocusVisibility(true, ev.target, registeredProviders);\n    }\n  }\n  function _onKeyUp(ev, registeredProviders) {\n    if (isDirectionalKeyCode(ev.which)) {\n      setFocusVisibility(true, ev.target, registeredProviders);\n    }\n  }\n  var FocusRectsProvider = function(props) {\n    var providerRef = props.providerRef, layerRoot = props.layerRoot;\n    var registeredProviders = React__namespace.useState([])[0];\n    var parentContext = React__namespace.useContext(FocusRectsContext);\n    var inheritParentContext = parentContext !== void 0 && !layerRoot;\n    var context2 = React__namespace.useMemo(function() {\n      return inheritParentContext ? void 0 : {\n        providerRef,\n        registeredProviders,\n        registerProvider: function(ref2) {\n          registeredProviders.push(ref2);\n          parentContext === null || parentContext === void 0 ? void 0 : parentContext.registerProvider(ref2);\n        },\n        unregisterProvider: function(ref2) {\n          parentContext === null || parentContext === void 0 ? void 0 : parentContext.unregisterProvider(ref2);\n          var i = registeredProviders.indexOf(ref2);\n          if (i >= 0) {\n            registeredProviders.splice(i, 1);\n          }\n        }\n      };\n    }, [providerRef, registeredProviders, parentContext, inheritParentContext]);\n    React__namespace.useEffect(function() {\n      if (context2) {\n        context2.registerProvider(context2.providerRef);\n        return function() {\n          return context2.unregisterProvider(context2.providerRef);\n        };\n      }\n    }, [context2]);\n    if (context2) {\n      return React__namespace.createElement(FocusRectsContext.Provider, { value: context2 }, props.children);\n    } else {\n      return React__namespace.createElement(React__namespace.Fragment, null, props.children);\n    }\n  };\n  function getItem(key2) {\n    var result = null;\n    try {\n      var win = getWindow();\n      result = win ? win.localStorage.getItem(key2) : null;\n    } catch (e) {\n    }\n    return result;\n  }\n  var _language;\n  var STORAGE_KEY = \"language\";\n  function getLanguage(persistenceType) {\n    if (persistenceType === void 0) {\n      persistenceType = \"sessionStorage\";\n    }\n    if (_language === void 0) {\n      var doc = getDocument();\n      var savedLanguage = persistenceType === \"localStorage\" ? getItem(STORAGE_KEY) : persistenceType === \"sessionStorage\" ? getItem$1(STORAGE_KEY) : void 0;\n      if (savedLanguage) {\n        _language = savedLanguage;\n      }\n      if (_language === void 0 && doc) {\n        _language = doc.documentElement.getAttribute(\"lang\");\n      }\n      if (_language === void 0) {\n        _language = \"en\";\n      }\n    }\n    return _language;\n  }\n  function merge$3(target2) {\n    var args = [];\n    for (var _i = 1; _i < arguments.length; _i++) {\n      args[_i - 1] = arguments[_i];\n    }\n    for (var _a2 = 0, args_1 = args; _a2 < args_1.length; _a2++) {\n      var arg = args_1[_a2];\n      _merge(target2 || {}, arg);\n    }\n    return target2;\n  }\n  function _merge(target2, source2, circularReferences) {\n    if (circularReferences === void 0) {\n      circularReferences = [];\n    }\n    circularReferences.push(source2);\n    for (var name_1 in source2) {\n      if (source2.hasOwnProperty(name_1)) {\n        if (name_1 !== \"__proto__\" && name_1 !== \"constructor\" && name_1 !== \"prototype\") {\n          var value2 = source2[name_1];\n          if (typeof value2 === \"object\" && value2 !== null && !Array.isArray(value2)) {\n            var isCircularReference = circularReferences.indexOf(value2) > -1;\n            target2[name_1] = isCircularReference ? value2 : _merge(target2[name_1] || {}, value2, circularReferences);\n          } else {\n            target2[name_1] = value2;\n          }\n        }\n      }\n    }\n    circularReferences.pop();\n    return target2;\n  }\n  var isIOS = function() {\n    if (!window || !window.navigator || !window.navigator.userAgent) {\n      return false;\n    }\n    return /iPad|iPhone|iPod/i.test(window.navigator.userAgent);\n  };\n  var tagsToIgnore = [\"TEMPLATE\", \"STYLE\", \"SCRIPT\"];\n  function modalize(target2) {\n    var targetDocument = getDocument(target2);\n    if (!targetDocument) {\n      return function() {\n        return void 0;\n      };\n    }\n    var affectedNodes = [];\n    while (target2 !== targetDocument.body && target2.parentElement) {\n      for (var _i = 0, _a2 = target2.parentElement.children; _i < _a2.length; _i++) {\n        var sibling = _a2[_i];\n        var ariaHidden = sibling.getAttribute(\"aria-hidden\");\n        if (sibling !== target2 && (ariaHidden === null || ariaHidden === void 0 ? void 0 : ariaHidden.toLowerCase()) !== \"true\" && tagsToIgnore.indexOf(sibling.tagName) === -1) {\n          affectedNodes.push([sibling, ariaHidden]);\n        }\n      }\n      target2 = target2.parentElement;\n    }\n    affectedNodes.forEach(function(_a3) {\n      var node = _a3[0];\n      node.setAttribute(\"aria-hidden\", \"true\");\n    });\n    return function() {\n      unmodalize(affectedNodes);\n      affectedNodes = [];\n    };\n  }\n  function unmodalize(affectedNodes) {\n    affectedNodes.forEach(function(_a2) {\n      var node = _a2[0], originalValue = _a2[1];\n      if (originalValue) {\n        node.setAttribute(\"aria-hidden\", originalValue);\n      } else {\n        node.removeAttribute(\"aria-hidden\");\n      }\n    });\n  }\n  var isMacResult;\n  function isMac(reset2) {\n    var _a2;\n    if (typeof isMacResult === \"undefined\" || reset2) {\n      var win = getWindow();\n      var userAgent = (_a2 = win === null || win === void 0 ? void 0 : win.navigator) === null || _a2 === void 0 ? void 0 : _a2.userAgent;\n      isMacResult = !!userAgent && userAgent.indexOf(\"Macintosh\") !== -1;\n    }\n    return !!isMacResult;\n  }\n  function hasHorizontalOverflow(element2) {\n    return element2.clientWidth < element2.scrollWidth;\n  }\n  function hasVerticalOverflow(element2) {\n    return element2.clientHeight < element2.scrollHeight;\n  }\n  function hasOverflow(element2) {\n    return hasHorizontalOverflow(element2) || hasVerticalOverflow(element2);\n  }\n  function createComposedRenderFunction(outer) {\n    var outerMemoizer = createMemoizer(function(inner) {\n      var innerMemoizer = createMemoizer(function(defaultRender) {\n        return function(innerProps) {\n          return inner(innerProps, defaultRender);\n        };\n      });\n      return function(outerProps, defaultRender) {\n        return outer(outerProps, defaultRender ? innerMemoizer(defaultRender) : inner);\n      };\n    });\n    return outerMemoizer;\n  }\n  var memoizer = createMemoizer(createComposedRenderFunction);\n  function composeRenderFunction(outer, inner) {\n    return memoizer(outer)(inner);\n  }\n  var safeRequestAnimationFrame = function(component) {\n    var activeTimeouts;\n    return function(cb) {\n      if (!activeTimeouts) {\n        activeTimeouts = /* @__PURE__ */ new Set();\n        extendComponent(component, {\n          componentWillUnmount: function() {\n            activeTimeouts.forEach(function(id2) {\n              return cancelAnimationFrame(id2);\n            });\n          }\n        });\n      }\n      var timeoutId = requestAnimationFrame(function() {\n        activeTimeouts.delete(timeoutId);\n        cb();\n      });\n      activeTimeouts.add(timeoutId);\n    };\n  };\n  var DefaultFields = [\"theme\", \"styles\"];\n  function styled(Component, baseStyles, getProps, customizable2, pure) {\n    customizable2 = customizable2 || { scope: \"\", fields: void 0 };\n    var scope = customizable2.scope, _a2 = customizable2.fields, fields = _a2 === void 0 ? DefaultFields : _a2;\n    var Wrapped = React__namespace.forwardRef(function(props, forwardedRef) {\n      var styles = React__namespace.useRef(void 0);\n      var settings = useCustomizationSettings(fields, scope);\n      var customizedStyles = settings.styles;\n      settings.dir;\n      var rest = __rest(settings, [\"styles\", \"dir\"]);\n      var additionalProps = getProps ? getProps(props) : void 0;\n      var useStyled = useMergeStylesHooks().useStyled;\n      var cache2 = styles.current && styles.current.__cachedInputs__ || [];\n      var propStyles = props.styles;\n      if (!styles.current || customizedStyles !== cache2[1] || propStyles !== cache2[2]) {\n        var concatenatedStyles = function(styleProps) {\n          return concatStyleSetsWithProps(styleProps, baseStyles, customizedStyles, propStyles);\n        };\n        concatenatedStyles.__cachedInputs__ = [\n          baseStyles,\n          customizedStyles,\n          propStyles\n        ];\n        concatenatedStyles.__noStyleOverride__ = !customizedStyles && !propStyles;\n        styles.current = concatenatedStyles;\n      }\n      styles.current.__shadowConfig__ = useStyled(scope);\n      return React__namespace.createElement(Component, __assign$1({ ref: forwardedRef }, rest, additionalProps, props, { styles: styles.current }));\n    });\n    Wrapped.displayName = \"Styled\".concat(Component.displayName || Component.name);\n    var pureComponent = pure ? React__namespace.memo(Wrapped) : Wrapped;\n    if (Wrapped.displayName) {\n      pureComponent.displayName = Wrapped.displayName;\n    }\n    return pureComponent;\n  }\n  function warnControlledUsage(params2) {\n  }\n  var isIE11 = function() {\n    var _a2;\n    var win = getWindow();\n    if (!((_a2 = win === null || win === void 0 ? void 0 : win.navigator) === null || _a2 === void 0 ? void 0 : _a2.userAgent)) {\n      return false;\n    }\n    return win.navigator.userAgent.indexOf(\"rv:11.0\") > -1;\n  };\n  function getPropsWithDefaults(defaultProps, propsWithoutDefaults) {\n    var props = __assign$1({}, propsWithoutDefaults);\n    for (var _i = 0, _a2 = Object.keys(defaultProps); _i < _a2.length; _i++) {\n      var key2 = _a2[_i];\n      if (props[key2] === void 0) {\n        props[key2] = defaultProps[key2];\n      }\n    }\n    return props;\n  }\n  var createResolver = function(local) {\n    return function(newValue) {\n      for (var _i = 0, _a2 = local.refs; _i < _a2.length; _i++) {\n        var ref2 = _a2[_i];\n        if (typeof ref2 === \"function\") {\n          ref2(newValue);\n        } else if (ref2) {\n          ref2.current = newValue;\n        }\n      }\n    };\n  };\n  var createMergedRef = function(value2) {\n    var local = {\n      refs: []\n    };\n    return function() {\n      var newRefs = [];\n      for (var _i = 0; _i < arguments.length; _i++) {\n        newRefs[_i] = arguments[_i];\n      }\n      if (!local.resolver || !arraysEqual(local.refs, newRefs)) {\n        local.resolver = createResolver(local);\n      }\n      local.refs = newRefs;\n      return local.resolver;\n    };\n  };\n  var useIsomorphicLayoutEffect = canUseDOM() ? React__namespace.useLayoutEffect : React__namespace.useEffect;\n  var IconType;\n  (function(IconType2) {\n    IconType2[IconType2[\"default\"] = 0] = \"default\";\n    IconType2[IconType2[\"image\"] = 1] = \"image\";\n    IconType2[IconType2[\"Default\"] = 1e5] = \"Default\";\n    IconType2[IconType2[\"Image\"] = 100001] = \"Image\";\n  })(IconType || (IconType = {}));\n  var ImageFit;\n  (function(ImageFit2) {\n    ImageFit2[ImageFit2[\"center\"] = 0] = \"center\";\n    ImageFit2[ImageFit2[\"contain\"] = 1] = \"contain\";\n    ImageFit2[ImageFit2[\"cover\"] = 2] = \"cover\";\n    ImageFit2[ImageFit2[\"none\"] = 3] = \"none\";\n    ImageFit2[ImageFit2[\"centerCover\"] = 4] = \"centerCover\";\n    ImageFit2[ImageFit2[\"centerContain\"] = 5] = \"centerContain\";\n  })(ImageFit || (ImageFit = {}));\n  var ImageCoverStyle;\n  (function(ImageCoverStyle2) {\n    ImageCoverStyle2[ImageCoverStyle2[\"landscape\"] = 0] = \"landscape\";\n    ImageCoverStyle2[ImageCoverStyle2[\"portrait\"] = 1] = \"portrait\";\n  })(ImageCoverStyle || (ImageCoverStyle = {}));\n  var ImageLoadState;\n  (function(ImageLoadState2) {\n    ImageLoadState2[ImageLoadState2[\"notLoaded\"] = 0] = \"notLoaded\";\n    ImageLoadState2[ImageLoadState2[\"loaded\"] = 1] = \"loaded\";\n    ImageLoadState2[ImageLoadState2[\"error\"] = 2] = \"error\";\n    ImageLoadState2[ImageLoadState2[\"errorLoaded\"] = 3] = \"errorLoaded\";\n  })(ImageLoadState || (ImageLoadState = {}));\n  function useAsync() {\n    var asyncRef = React__namespace.useRef(void 0);\n    if (!asyncRef.current) {\n      asyncRef.current = new Async();\n    }\n    React__namespace.useEffect(function() {\n      return function() {\n        var _a2;\n        (_a2 = asyncRef.current) === null || _a2 === void 0 ? void 0 : _a2.dispose();\n        asyncRef.current = void 0;\n      };\n    }, []);\n    return asyncRef.current;\n  }\n  function useConst(initialValue) {\n    var ref2 = React__namespace.useRef(void 0);\n    if (ref2.current === void 0) {\n      ref2.current = {\n        value: typeof initialValue === \"function\" ? initialValue() : initialValue\n      };\n    }\n    return ref2.current.value;\n  }\n  function useBoolean(initialState) {\n    var _a2 = React__namespace.useState(initialState), value2 = _a2[0], setValue = _a2[1];\n    var setTrue = useConst(function() {\n      return function() {\n        setValue(true);\n      };\n    });\n    var setFalse = useConst(function() {\n      return function() {\n        setValue(false);\n      };\n    });\n    var toggle = useConst(function() {\n      return function() {\n        setValue(function(currentValue) {\n          return !currentValue;\n        });\n      };\n    });\n    return [value2, { setTrue, setFalse, toggle }];\n  }\n  function useControllableValue(controlledValue, defaultUncontrolledValue, onChange) {\n    var _a2 = React__namespace.useState(defaultUncontrolledValue), value2 = _a2[0], setValue = _a2[1];\n    var isControlled2 = useConst(controlledValue !== void 0);\n    var currentValue = isControlled2 ? controlledValue : value2;\n    var valueRef = React__namespace.useRef(currentValue);\n    var onChangeRef = React__namespace.useRef(onChange);\n    React__namespace.useEffect(function() {\n      valueRef.current = currentValue;\n      onChangeRef.current = onChange;\n    });\n    var setValueOrCallOnChange = useConst(function() {\n      return function(update2, ev) {\n        var newValue = typeof update2 === \"function\" ? update2(valueRef.current) : update2;\n        if (onChangeRef.current) {\n          onChangeRef.current(ev, newValue);\n        }\n        if (!isControlled2) {\n          setValue(newValue);\n        }\n      };\n    });\n    return [currentValue, setValueOrCallOnChange];\n  }\n  function useEventCallback(fn2) {\n    var callbackRef = React__namespace.useRef(function() {\n      throw new Error(\"Cannot call an event handler while rendering\");\n    });\n    useIsomorphicLayoutEffect(function() {\n      callbackRef.current = fn2;\n    }, [fn2]);\n    return useConst(function() {\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        var callback = callbackRef.current;\n        return callback.apply(void 0, args);\n      };\n    });\n  }\n  function useId(prefix, providedId) {\n    var ref2 = React__namespace.useRef(providedId);\n    if (!ref2.current) {\n      ref2.current = getId(prefix);\n    }\n    return ref2.current;\n  }\n  function useMergedRefs() {\n    var refs = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      refs[_i] = arguments[_i];\n    }\n    var mergedCallback = React__namespace.useCallback(function(value2) {\n      mergedCallback.current = value2;\n      for (var _i2 = 0, refs_1 = refs; _i2 < refs_1.length; _i2++) {\n        var ref2 = refs_1[_i2];\n        if (typeof ref2 === \"function\") {\n          ref2(value2);\n        } else if (ref2) {\n          ref2.current = value2;\n        }\n      }\n    }, __spreadArray([], refs, true));\n    return mergedCallback;\n  }\n  function useOnEvent(element2, eventName, callback, useCapture) {\n    var callbackRef = React__namespace.useRef(callback);\n    callbackRef.current = callback;\n    React__namespace.useEffect(function() {\n      var actualElement = element2 && \"current\" in element2 ? element2.current : element2;\n      if (!actualElement || !actualElement.addEventListener) {\n        return;\n      }\n      var dispose = on$1(actualElement, eventName, function(ev) {\n        return callbackRef.current(ev);\n      }, useCapture);\n      return dispose;\n    }, [element2, eventName, useCapture]);\n  }\n  function usePrevious(value2) {\n    var ref2 = React__namespace.useRef(void 0);\n    React__namespace.useEffect(function() {\n      ref2.current = value2;\n    });\n    return ref2.current;\n  }\n  var useSetTimeout = function() {\n    var timeoutIds = useConst({});\n    React__namespace.useEffect(\n      function() {\n        return function() {\n          for (var _i = 0, _a2 = Object.keys(timeoutIds); _i < _a2.length; _i++) {\n            var id2 = _a2[_i];\n            clearTimeout(id2);\n          }\n        };\n      },\n      // useConst ensures this will never change, but react-hooks/exhaustive-deps doesn't know that\n      [timeoutIds]\n    );\n    return useConst({\n      setTimeout: function(func, duration) {\n        var id2 = setTimeout(func, duration);\n        timeoutIds[id2] = 1;\n        return id2;\n      },\n      clearTimeout: function(id2) {\n        delete timeoutIds[id2];\n        clearTimeout(id2);\n      }\n    });\n  };\n  function useTarget(target2, hostElement) {\n    var _a2, _b2, _c2;\n    var previousTargetProp = React__namespace.useRef(void 0);\n    var targetRef = React__namespace.useRef(null);\n    var targetWindow = useWindow();\n    if (!target2 || target2 !== previousTargetProp.current || typeof target2 === \"string\") {\n      var currentElement = hostElement === null || hostElement === void 0 ? void 0 : hostElement.current;\n      if (target2) {\n        if (typeof target2 === \"string\") {\n          if ((_a2 = currentElement === null || currentElement === void 0 ? void 0 : currentElement.getRootNode()) === null || _a2 === void 0 ? void 0 : _a2.host) {\n            targetRef.current = (_c2 = (_b2 = currentElement === null || currentElement === void 0 ? void 0 : currentElement.getRootNode()) === null || _b2 === void 0 ? void 0 : _b2.querySelector(target2)) !== null && _c2 !== void 0 ? _c2 : null;\n          } else {\n            var currentDoc = getDocument(currentElement);\n            targetRef.current = currentDoc ? currentDoc.querySelector(target2) : null;\n          }\n        } else if (\"stopPropagation\" in target2) {\n          targetRef.current = target2;\n        } else if (\"getBoundingClientRect\" in target2) {\n          targetRef.current = target2;\n        } else if (\"current\" in target2) {\n          targetRef.current = target2.current;\n        } else {\n          targetRef.current = target2;\n        }\n      }\n      previousTargetProp.current = target2;\n    }\n    return [targetRef, targetWindow];\n  }\n  var useUnmount = function(callback) {\n    var unmountRef = React__namespace.useRef(callback);\n    unmountRef.current = callback;\n    React__namespace.useEffect(function() {\n      return function() {\n        var _a2;\n        (_a2 = unmountRef.current) === null || _a2 === void 0 ? void 0 : _a2.call(unmountRef);\n      };\n    }, []);\n  };\n  var getClassNames$r = classNamesFunction();\n  var SVG_REGEX = /\\.svg$/i;\n  var KEY_PREFIX = \"fabricImage\";\n  function useLoadState(props, imageElement) {\n    var onLoadingStateChange = props.onLoadingStateChange, onLoad = props.onLoad, onError = props.onError, src = props.src;\n    var _a2 = React__namespace.useState(ImageLoadState.notLoaded), loadState = _a2[0], setLoadState = _a2[1];\n    useIsomorphicLayoutEffect(function() {\n      setLoadState(ImageLoadState.notLoaded);\n    }, [src]);\n    React__namespace.useEffect(function() {\n      if (loadState === ImageLoadState.notLoaded) {\n        var isLoaded = imageElement.current ? src && imageElement.current.naturalWidth > 0 && imageElement.current.naturalHeight > 0 || imageElement.current.complete && SVG_REGEX.test(src) : false;\n        if (isLoaded) {\n          setLoadState(ImageLoadState.loaded);\n        }\n      }\n    });\n    React__namespace.useEffect(function() {\n      onLoadingStateChange === null || onLoadingStateChange === void 0 ? void 0 : onLoadingStateChange(loadState);\n    }, [loadState]);\n    var onImageLoaded = React__namespace.useCallback(function(ev) {\n      onLoad === null || onLoad === void 0 ? void 0 : onLoad(ev);\n      if (src) {\n        setLoadState(ImageLoadState.loaded);\n      }\n    }, [src, onLoad]);\n    var onImageError = React__namespace.useCallback(function(ev) {\n      onError === null || onError === void 0 ? void 0 : onError(ev);\n      setLoadState(ImageLoadState.error);\n    }, [onError]);\n    return [loadState, onImageLoaded, onImageError];\n  }\n  var ImageBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var frameElement = React__namespace.useRef(void 0);\n    var imageElement = React__namespace.useRef(void 0);\n    var _a2 = useLoadState(props, imageElement), loadState = _a2[0], onImageLoaded = _a2[1], onImageError = _a2[2];\n    var imageProps = getNativeProps(props, imgProperties, [\n      \"width\",\n      \"height\"\n    ]);\n    var src = props.src, alt = props.alt, width2 = props.width, height2 = props.height, _b2 = props.shouldFadeIn, shouldFadeIn = _b2 === void 0 ? true : _b2, shouldStartVisible = props.shouldStartVisible, className2 = props.className, imageFit = props.imageFit, role = props.role, maximizeFrame = props.maximizeFrame, styles = props.styles, theme = props.theme, loading = props.loading;\n    var coverStyle = useCoverStyle(props, loadState, imageElement, frameElement);\n    var classNames2 = getClassNames$r(styles, {\n      theme,\n      className: className2,\n      width: width2,\n      height: height2,\n      maximizeFrame,\n      shouldFadeIn,\n      shouldStartVisible,\n      isLoaded: loadState === ImageLoadState.loaded || loadState === ImageLoadState.notLoaded && props.shouldStartVisible,\n      isLandscape: coverStyle === ImageCoverStyle.landscape,\n      isCenter: imageFit === ImageFit.center,\n      isCenterContain: imageFit === ImageFit.centerContain,\n      isCenterCover: imageFit === ImageFit.centerCover,\n      isContain: imageFit === ImageFit.contain,\n      isCover: imageFit === ImageFit.cover,\n      isNone: imageFit === ImageFit.none,\n      isError: loadState === ImageLoadState.error,\n      isNotImageFit: imageFit === void 0\n    });\n    return React__namespace.createElement(\n      \"div\",\n      { className: classNames2.root, style: { width: width2, height: height2 }, ref: frameElement },\n      React__namespace.createElement(\"img\", __assign$1({}, imageProps, { onLoad: onImageLoaded, onError: onImageError, key: KEY_PREFIX + props.src || \"\", className: classNames2.image, ref: useMergedRefs(imageElement, forwardedRef), src, alt, role, loading }))\n    );\n  });\n  ImageBase.displayName = \"ImageBase\";\n  function useCoverStyle(props, loadState, imageElement, frameElement) {\n    var previousLoadState = React__namespace.useRef(loadState);\n    var coverStyle = React__namespace.useRef(void 0);\n    if (coverStyle === void 0 || previousLoadState.current === ImageLoadState.notLoaded && loadState === ImageLoadState.loaded) {\n      coverStyle.current = computeCoverStyle(props, loadState, imageElement, frameElement);\n    }\n    previousLoadState.current = loadState;\n    return coverStyle.current;\n  }\n  function computeCoverStyle(props, loadState, imageElement, frameElement) {\n    var imageFit = props.imageFit, width2 = props.width, height2 = props.height;\n    if (props.coverStyle !== void 0) {\n      return props.coverStyle;\n    } else if (loadState === ImageLoadState.loaded && (imageFit === ImageFit.cover || imageFit === ImageFit.contain || imageFit === ImageFit.centerContain || imageFit === ImageFit.centerCover) && imageElement.current && frameElement.current) {\n      var desiredRatio = void 0;\n      if (typeof width2 === \"number\" && typeof height2 === \"number\" && imageFit !== ImageFit.centerContain && imageFit !== ImageFit.centerCover) {\n        desiredRatio = width2 / height2;\n      } else {\n        desiredRatio = frameElement.current.clientWidth / frameElement.current.clientHeight;\n      }\n      var naturalRatio = imageElement.current.naturalWidth / imageElement.current.naturalHeight;\n      if (naturalRatio > desiredRatio) {\n        return ImageCoverStyle.landscape;\n      }\n    }\n    return ImageCoverStyle.portrait;\n  }\n  function buildClassMap(styles) {\n    var classes = {};\n    var _loop_1 = function(styleName2) {\n      if (styles.hasOwnProperty(styleName2)) {\n        var className_1;\n        Object.defineProperty(classes, styleName2, {\n          get: function() {\n            if (className_1 === void 0) {\n              className_1 = mergeStyles(styles[styleName2]).toString();\n            }\n            return className_1;\n          },\n          enumerable: true,\n          configurable: true\n        });\n      }\n    };\n    for (var styleName in styles) {\n      _loop_1(styleName);\n    }\n    return classes;\n  }\n  var ICON_SETTING_NAME = \"icons\";\n  var _iconSettings = GlobalSettings.getValue(ICON_SETTING_NAME, {\n    __options: {\n      disableWarnings: false,\n      warnOnMissingIcons: true\n    },\n    __remapped: {}\n  });\n  var stylesheet = Stylesheet.getInstance();\n  if (stylesheet && stylesheet.onReset) {\n    stylesheet.onReset(function() {\n      for (var name_1 in _iconSettings) {\n        if (_iconSettings.hasOwnProperty(name_1) && !!_iconSettings[name_1].subset) {\n          _iconSettings[name_1].subset.className = void 0;\n        }\n      }\n    });\n  }\n  var normalizeIconName = function(name) {\n    return name.toLowerCase();\n  };\n  function registerIcons$1(iconSubset, options2) {\n    var subset = __assign$1(__assign$1({}, iconSubset), { isRegistered: false, className: void 0 });\n    var icons = iconSubset.icons;\n    options2 = options2 ? __assign$1(__assign$1({}, _iconSettings.__options), options2) : _iconSettings.__options;\n    for (var iconName in icons) {\n      if (icons.hasOwnProperty(iconName)) {\n        var code = icons[iconName];\n        var normalizedIconName = normalizeIconName(iconName);\n        if (_iconSettings[normalizedIconName]) {\n          _warnDuplicateIcon(iconName);\n        } else {\n          _iconSettings[normalizedIconName] = {\n            code,\n            subset\n          };\n        }\n      }\n    }\n  }\n  function unregisterIcons$1(iconNames) {\n    var options2 = _iconSettings.__options;\n    var _loop_1 = function(iconName2) {\n      var normalizedIconName = normalizeIconName(iconName2);\n      if (_iconSettings[normalizedIconName]) {\n        delete _iconSettings[normalizedIconName];\n      } else {\n        if (!options2.disableWarnings) {\n          warn$1('The icon \"'.concat(iconName2, '\" tried to unregister but was not registered.'));\n        }\n      }\n      if (_iconSettings.__remapped[normalizedIconName]) {\n        delete _iconSettings.__remapped[normalizedIconName];\n      }\n      Object.keys(_iconSettings.__remapped).forEach(function(key2) {\n        if (_iconSettings.__remapped[key2] === normalizedIconName) {\n          delete _iconSettings.__remapped[key2];\n        }\n      });\n    };\n    for (var _i = 0, iconNames_1 = iconNames; _i < iconNames_1.length; _i++) {\n      var iconName = iconNames_1[_i];\n      _loop_1(iconName);\n    }\n  }\n  function getIcon(name) {\n    var icon = void 0;\n    var options2 = _iconSettings.__options;\n    name = name ? normalizeIconName(name) : \"\";\n    name = _iconSettings.__remapped[name] || name;\n    if (name) {\n      icon = _iconSettings[name];\n      if (icon) {\n        var subset = icon.subset;\n        if (subset && subset.fontFace) {\n          if (!subset.isRegistered) {\n            fontFace(subset.fontFace);\n            subset.isRegistered = true;\n          }\n          if (!subset.className) {\n            subset.className = mergeStyles(subset.style, {\n              fontFamily: subset.fontFace.fontFamily,\n              fontWeight: subset.fontFace.fontWeight || \"normal\",\n              fontStyle: subset.fontFace.fontStyle || \"normal\"\n            });\n          }\n        }\n      } else {\n        if (!options2.disableWarnings && options2.warnOnMissingIcons) {\n          warn$1('The icon \"'.concat(name, '\" was used but not registered. See https://github.com/microsoft/fluentui/wiki/Using-icons for more information.'));\n        }\n      }\n    }\n    return icon;\n  }\n  var _missingIcons = [];\n  var _missingIconsTimer = void 0;\n  function _warnDuplicateIcon(iconName) {\n    var options2 = _iconSettings.__options;\n    var warningDelay = 2e3;\n    var maxIconsInMessage = 10;\n    if (!options2.disableWarnings) {\n      _missingIcons.push(iconName);\n      if (_missingIconsTimer === void 0) {\n        _missingIconsTimer = setTimeout(function() {\n          warn$1(\"Some icons were re-registered. Applications should only call registerIcons for any given icon once. Redefining what an icon is may have unintended consequences. Duplicates include: \\n\" + _missingIcons.slice(0, maxIconsInMessage).join(\", \") + (_missingIcons.length > maxIconsInMessage ? \" (+ \".concat(_missingIcons.length - maxIconsInMessage, \" more)\") : \"\"));\n          _missingIconsTimer = void 0;\n          _missingIcons = [];\n        }, warningDelay);\n      }\n    }\n  }\n  function makeSemanticColors(p, e, s2, isInverted, depComments) {\n    if (depComments === void 0) {\n      depComments = false;\n    }\n    var semanticColors = __assign$1({\n      primaryButtonBorder: \"transparent\",\n      errorText: !isInverted ? \"#a4262c\" : \"#F1707B\",\n      messageText: !isInverted ? \"#323130\" : \"#F3F2F1\",\n      messageLink: !isInverted ? \"#005A9E\" : \"#6CB8F6\",\n      messageLinkHovered: !isInverted ? \"#004578\" : \"#82C7FF\",\n      infoIcon: !isInverted ? \"#605e5c\" : \"#C8C6C4\",\n      errorIcon: !isInverted ? \"#A80000\" : \"#F1707B\",\n      blockingIcon: !isInverted ? \"#FDE7E9\" : \"#442726\",\n      warningIcon: !isInverted ? \"#797775\" : \"#C8C6C4\",\n      severeWarningIcon: !isInverted ? \"#D83B01\" : \"#FCE100\",\n      successIcon: !isInverted ? \"#107C10\" : \"#92C353\",\n      infoBackground: !isInverted ? \"#f3f2f1\" : \"#323130\",\n      errorBackground: !isInverted ? \"#FDE7E9\" : \"#442726\",\n      blockingBackground: !isInverted ? \"#FDE7E9\" : \"#442726\",\n      warningBackground: !isInverted ? \"#FFF4CE\" : \"#433519\",\n      severeWarningBackground: !isInverted ? \"#FED9CC\" : \"#4F2A0F\",\n      successBackground: !isInverted ? \"#DFF6DD\" : \"#393D1B\",\n      // deprecated\n      warningHighlight: !isInverted ? \"#ffb900\" : \"#fff100\",\n      successText: !isInverted ? \"#107C10\" : \"#92c353\"\n    }, s2);\n    var fullSemanticColors = getSemanticColors(p, e, semanticColors, isInverted);\n    return _fixDeprecatedSlots(fullSemanticColors, depComments);\n  }\n  function getSemanticColors(p, e, s2, isInverted, depComments) {\n    var result = {};\n    var _a2 = p || {}, white = _a2.white, black = _a2.black, themePrimary = _a2.themePrimary, themeDark = _a2.themeDark, themeDarker = _a2.themeDarker, themeDarkAlt = _a2.themeDarkAlt, themeLighter = _a2.themeLighter, neutralLight = _a2.neutralLight, neutralLighter = _a2.neutralLighter, neutralDark = _a2.neutralDark, neutralQuaternary = _a2.neutralQuaternary, neutralQuaternaryAlt = _a2.neutralQuaternaryAlt, neutralPrimary = _a2.neutralPrimary, neutralSecondary = _a2.neutralSecondary, neutralSecondaryAlt = _a2.neutralSecondaryAlt, neutralTertiary = _a2.neutralTertiary, neutralTertiaryAlt = _a2.neutralTertiaryAlt, neutralLighterAlt = _a2.neutralLighterAlt, accent = _a2.accent;\n    if (white) {\n      result.bodyBackground = white;\n      result.bodyFrameBackground = white;\n      result.accentButtonText = white;\n      result.buttonBackground = white;\n      result.primaryButtonText = white;\n      result.primaryButtonTextHovered = white;\n      result.primaryButtonTextPressed = white;\n      result.inputBackground = white;\n      result.inputForegroundChecked = white;\n      result.listBackground = white;\n      result.menuBackground = white;\n      result.cardStandoutBackground = white;\n    }\n    if (black) {\n      result.bodyTextChecked = black;\n      result.buttonTextCheckedHovered = black;\n    }\n    if (themePrimary) {\n      result.link = themePrimary;\n      result.primaryButtonBackground = themePrimary;\n      result.inputBackgroundChecked = themePrimary;\n      result.inputIcon = themePrimary;\n      result.inputFocusBorderAlt = themePrimary;\n      result.menuIcon = themePrimary;\n      result.menuHeader = themePrimary;\n      result.accentButtonBackground = themePrimary;\n    }\n    if (themeDark) {\n      result.primaryButtonBackgroundPressed = themeDark;\n      result.inputBackgroundCheckedHovered = themeDark;\n      result.inputIconHovered = themeDark;\n    }\n    if (themeDarker) {\n      result.linkHovered = themeDarker;\n    }\n    if (themeDarkAlt) {\n      result.primaryButtonBackgroundHovered = themeDarkAlt;\n    }\n    if (themeLighter) {\n      result.inputPlaceholderBackgroundChecked = themeLighter;\n    }\n    if (neutralLight) {\n      result.bodyBackgroundChecked = neutralLight;\n      result.bodyFrameDivider = neutralLight;\n      result.bodyDivider = neutralLight;\n      result.variantBorder = neutralLight;\n      result.buttonBackgroundCheckedHovered = neutralLight;\n      result.buttonBackgroundPressed = neutralLight;\n      result.listItemBackgroundChecked = neutralLight;\n      result.listHeaderBackgroundPressed = neutralLight;\n      result.menuItemBackgroundPressed = neutralLight;\n      result.menuItemBackgroundChecked = neutralLight;\n    }\n    if (neutralLighter) {\n      result.bodyBackgroundHovered = neutralLighter;\n      result.buttonBackgroundHovered = neutralLighter;\n      result.buttonBackgroundDisabled = neutralLighter;\n      result.buttonBorderDisabled = neutralLighter;\n      result.primaryButtonBackgroundDisabled = neutralLighter;\n      result.disabledBackground = neutralLighter;\n      result.listItemBackgroundHovered = neutralLighter;\n      result.listHeaderBackgroundHovered = neutralLighter;\n      result.menuItemBackgroundHovered = neutralLighter;\n    }\n    if (neutralQuaternary) {\n      result.primaryButtonTextDisabled = neutralQuaternary;\n      result.disabledSubtext = neutralQuaternary;\n    }\n    if (neutralQuaternaryAlt) {\n      result.listItemBackgroundCheckedHovered = neutralQuaternaryAlt;\n    }\n    if (neutralTertiary) {\n      result.disabledBodyText = neutralTertiary;\n      result.variantBorderHovered = (s2 === null || s2 === void 0 ? void 0 : s2.variantBorderHovered) || neutralTertiary;\n      result.buttonTextDisabled = neutralTertiary;\n      result.inputIconDisabled = neutralTertiary;\n      result.disabledText = neutralTertiary;\n    }\n    if (neutralPrimary) {\n      result.bodyText = neutralPrimary;\n      result.actionLink = neutralPrimary;\n      result.buttonText = neutralPrimary;\n      result.inputBorderHovered = neutralPrimary;\n      result.inputText = neutralPrimary;\n      result.listText = neutralPrimary;\n      result.menuItemText = neutralPrimary;\n    }\n    if (neutralLighterAlt) {\n      result.bodyStandoutBackground = neutralLighterAlt;\n      result.defaultStateBackground = neutralLighterAlt;\n    }\n    if (neutralDark) {\n      result.actionLinkHovered = neutralDark;\n      result.buttonTextHovered = neutralDark;\n      result.buttonTextChecked = neutralDark;\n      result.buttonTextPressed = neutralDark;\n      result.inputTextHovered = neutralDark;\n      result.menuItemTextHovered = neutralDark;\n    }\n    if (neutralSecondary) {\n      result.bodySubtext = neutralSecondary;\n      result.focusBorder = neutralSecondary;\n      result.inputBorder = neutralSecondary;\n      result.smallInputBorder = neutralSecondary;\n      result.inputPlaceholderText = neutralSecondary;\n    }\n    if (neutralSecondaryAlt) {\n      result.buttonBorder = neutralSecondaryAlt;\n    }\n    if (neutralTertiaryAlt) {\n      result.disabledBodySubtext = neutralTertiaryAlt;\n      result.disabledBorder = neutralTertiaryAlt;\n      result.buttonBackgroundChecked = neutralTertiaryAlt;\n      result.menuDivider = neutralTertiaryAlt;\n    }\n    if (accent) {\n      result.accentButtonBackground = accent;\n    }\n    if (e === null || e === void 0 ? void 0 : e.elevation4) {\n      result.cardShadow = e.elevation4;\n    }\n    if (!isInverted && (e === null || e === void 0 ? void 0 : e.elevation8)) {\n      result.cardShadowHovered = e.elevation8;\n    } else if (result.variantBorderHovered) {\n      result.cardShadowHovered = \"0 0 1px \" + result.variantBorderHovered;\n    }\n    result = __assign$1(__assign$1({}, result), s2);\n    return result;\n  }\n  function _fixDeprecatedSlots(s2, depComments) {\n    var dep = \"\";\n    if (depComments === true) {\n      dep = \" /* @deprecated */\";\n    }\n    s2.listTextColor = s2.listText + dep;\n    s2.menuItemBackgroundChecked += dep;\n    s2.warningHighlight += dep;\n    s2.warningText = s2.messageText + dep;\n    s2.successText += dep;\n    return s2;\n  }\n  function mergeThemes(theme, partialTheme) {\n    var _a2, _b2, _c2;\n    if (partialTheme === void 0) {\n      partialTheme = {};\n    }\n    var mergedTheme = merge$3({}, theme, partialTheme, {\n      semanticColors: getSemanticColors(partialTheme.palette, partialTheme.effects, partialTheme.semanticColors, partialTheme.isInverted === void 0 ? theme.isInverted : partialTheme.isInverted)\n    });\n    if (((_a2 = partialTheme.palette) === null || _a2 === void 0 ? void 0 : _a2.themePrimary) && !((_b2 = partialTheme.palette) === null || _b2 === void 0 ? void 0 : _b2.accent)) {\n      mergedTheme.palette.accent = partialTheme.palette.themePrimary;\n    }\n    if (partialTheme.defaultFontStyle) {\n      for (var _i = 0, _d2 = Object.keys(mergedTheme.fonts); _i < _d2.length; _i++) {\n        var fontStyle = _d2[_i];\n        mergedTheme.fonts[fontStyle] = merge$3(mergedTheme.fonts[fontStyle], partialTheme.defaultFontStyle, (_c2 = partialTheme === null || partialTheme === void 0 ? void 0 : partialTheme.fonts) === null || _c2 === void 0 ? void 0 : _c2[fontStyle]);\n      }\n    }\n    return mergedTheme;\n  }\n  var DefaultPalette = {\n    themeDarker: \"#004578\",\n    themeDark: \"#005a9e\",\n    themeDarkAlt: \"#106ebe\",\n    themePrimary: \"#0078d4\",\n    themeSecondary: \"#2b88d8\",\n    themeTertiary: \"#71afe5\",\n    themeLight: \"#c7e0f4\",\n    themeLighter: \"#deecf9\",\n    themeLighterAlt: \"#eff6fc\",\n    black: \"#000000\",\n    blackTranslucent40: \"rgba(0,0,0,.4)\",\n    neutralDark: \"#201f1e\",\n    neutralPrimary: \"#323130\",\n    neutralPrimaryAlt: \"#3b3a39\",\n    neutralSecondary: \"#605e5c\",\n    neutralSecondaryAlt: \"#8a8886\",\n    neutralTertiary: \"#a19f9d\",\n    neutralTertiaryAlt: \"#c8c6c4\",\n    neutralQuaternary: \"#d2d0ce\",\n    neutralQuaternaryAlt: \"#e1dfdd\",\n    neutralLight: \"#edebe9\",\n    neutralLighter: \"#f3f2f1\",\n    neutralLighterAlt: \"#faf9f8\",\n    accent: \"#0078d4\",\n    white: \"#ffffff\",\n    whiteTranslucent40: \"rgba(255,255,255,.4)\",\n    yellowDark: \"#d29200\",\n    yellow: \"#ffb900\",\n    yellowLight: \"#fff100\",\n    orange: \"#d83b01\",\n    orangeLight: \"#ea4300\",\n    orangeLighter: \"#ff8c00\",\n    redDark: \"#a4262c\",\n    red: \"#e81123\",\n    magentaDark: \"#5c005c\",\n    magenta: \"#b4009e\",\n    magentaLight: \"#e3008c\",\n    purpleDark: \"#32145a\",\n    purple: \"#5c2d91\",\n    purpleLight: \"#b4a0ff\",\n    blueDark: \"#002050\",\n    blueMid: \"#00188f\",\n    blue: \"#0078d4\",\n    blueLight: \"#00bcf2\",\n    tealDark: \"#004b50\",\n    teal: \"#008272\",\n    tealLight: \"#00b294\",\n    greenDark: \"#004b1c\",\n    green: \"#107c10\",\n    greenLight: \"#bad80a\"\n  };\n  var Depths;\n  (function(Depths2) {\n    Depths2.depth0 = \"0 0 0 0 transparent\";\n    Depths2.depth4 = \"0 1.6px 3.6px 0 rgba(0, 0, 0, 0.132), 0 0.3px 0.9px 0 rgba(0, 0, 0, 0.108)\";\n    Depths2.depth8 = \"0 3.2px 7.2px 0 rgba(0, 0, 0, 0.132), 0 0.6px 1.8px 0 rgba(0, 0, 0, 0.108)\";\n    Depths2.depth16 = \"0 6.4px 14.4px 0 rgba(0, 0, 0, 0.132), 0 1.2px 3.6px 0 rgba(0, 0, 0, 0.108)\";\n    Depths2.depth64 = \"0 25.6px 57.6px 0 rgba(0, 0, 0, 0.22), 0 4.8px 14.4px 0 rgba(0, 0, 0, 0.18)\";\n  })(Depths || (Depths = {}));\n  var DefaultEffects = {\n    elevation4: Depths.depth4,\n    elevation8: Depths.depth8,\n    elevation16: Depths.depth16,\n    elevation64: Depths.depth64,\n    roundedCorner2: \"2px\",\n    roundedCorner4: \"4px\",\n    roundedCorner6: \"6px\"\n  };\n  var DefaultSpacing = {\n    s2: \"4px\",\n    s1: \"8px\",\n    m: \"16px\",\n    l1: \"20px\",\n    l2: \"32px\"\n  };\n  var EASING_FUNCTION_1 = \"cubic-bezier(.1,.9,.2,1)\";\n  var EASING_FUNCTION_2 = \"cubic-bezier(.1,.25,.75,.9)\";\n  var DURATION_1 = \"0.167s\";\n  var DURATION_2 = \"0.267s\";\n  var DURATION_3 = \"0.367s\";\n  var DURATION_4 = \"0.467s\";\n  var FADE_IN = keyframes({\n    from: { opacity: 0 },\n    to: { opacity: 1 }\n  });\n  var FADE_OUT = keyframes({\n    from: { opacity: 1 },\n    to: { opacity: 0, visibility: \"hidden\" }\n  });\n  var SLIDE_RIGHT_IN10 = _createSlideInX(-10);\n  var SLIDE_RIGHT_IN20 = _createSlideInX(-20);\n  var SLIDE_RIGHT_IN40 = _createSlideInX(-40);\n  var SLIDE_RIGHT_IN400 = _createSlideInX(-400);\n  var SLIDE_LEFT_IN10 = _createSlideInX(10);\n  var SLIDE_LEFT_IN20 = _createSlideInX(20);\n  var SLIDE_LEFT_IN40 = _createSlideInX(40);\n  var SLIDE_LEFT_IN400 = _createSlideInX(400);\n  var SLIDE_UP_IN10 = _createSlideInY(10);\n  var SLIDE_UP_IN20 = _createSlideInY(20);\n  var SLIDE_DOWN_IN10 = _createSlideInY(-10);\n  var SLIDE_DOWN_IN20 = _createSlideInY(-20);\n  var SLIDE_RIGHT_OUT10 = _createSlideOutX(10);\n  var SLIDE_RIGHT_OUT20 = _createSlideOutX(20);\n  var SLIDE_RIGHT_OUT40 = _createSlideOutX(40);\n  var SLIDE_RIGHT_OUT400 = _createSlideOutX(400);\n  var SLIDE_LEFT_OUT10 = _createSlideOutX(-10);\n  var SLIDE_LEFT_OUT20 = _createSlideOutX(-20);\n  var SLIDE_LEFT_OUT40 = _createSlideOutX(-40);\n  var SLIDE_LEFT_OUT400 = _createSlideOutX(-400);\n  var SLIDE_UP_OUT10 = _createSlideOutY(-10);\n  var SLIDE_UP_OUT20 = _createSlideOutY(-20);\n  var SLIDE_DOWN_OUT10 = _createSlideOutY(10);\n  var SLIDE_DOWN_OUT20 = _createSlideOutY(20);\n  var SCALE_UP100 = keyframes({\n    from: { transform: \"scale3d(.98,.98,1)\" },\n    to: { transform: \"scale3d(1,1,1)\" }\n  });\n  var SCALE_DOWN98 = keyframes({\n    from: { transform: \"scale3d(1,1,1)\" },\n    to: { transform: \"scale3d(.98,.98,1)\" }\n  });\n  var SCALE_DOWN100 = keyframes({\n    from: { transform: \"scale3d(1.03,1.03,1)\" },\n    to: { transform: \"scale3d(1,1,1)\" }\n  });\n  var SCALE_UP103 = keyframes({\n    from: { transform: \"scale3d(1,1,1)\" },\n    to: { transform: \"scale3d(1.03,1.03,1)\" }\n  });\n  var ROTATE90 = keyframes({\n    from: { transform: \"rotateZ(0deg)\" },\n    to: { transform: \"rotateZ(90deg)\" }\n  });\n  var ROTATE_N90 = keyframes({\n    from: { transform: \"rotateZ(0deg)\" },\n    to: { transform: \"rotateZ(-90deg)\" }\n  });\n  var AnimationVariables = {\n    easeFunction1: EASING_FUNCTION_1,\n    easeFunction2: EASING_FUNCTION_2,\n    durationValue2: DURATION_2,\n    durationValue3: DURATION_3\n  };\n  var AnimationStyles = {\n    slideRightIn10: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_RIGHT_IN10), DURATION_3, EASING_FUNCTION_1),\n    slideRightIn20: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_RIGHT_IN20), DURATION_3, EASING_FUNCTION_1),\n    slideRightIn40: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_RIGHT_IN40), DURATION_3, EASING_FUNCTION_1),\n    slideRightIn400: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_RIGHT_IN400), DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn10: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_LEFT_IN10), DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn20: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_LEFT_IN20), DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn40: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_LEFT_IN40), DURATION_3, EASING_FUNCTION_1),\n    slideLeftIn400: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_LEFT_IN400), DURATION_3, EASING_FUNCTION_1),\n    slideUpIn10: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_UP_IN10), DURATION_3, EASING_FUNCTION_1),\n    slideUpIn20: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_UP_IN20), DURATION_3, EASING_FUNCTION_1),\n    slideDownIn10: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_DOWN_IN10), DURATION_3, EASING_FUNCTION_1),\n    slideDownIn20: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SLIDE_DOWN_IN20), DURATION_3, EASING_FUNCTION_1),\n    slideRightOut10: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_RIGHT_OUT10), DURATION_3, EASING_FUNCTION_1),\n    slideRightOut20: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_RIGHT_OUT20), DURATION_3, EASING_FUNCTION_1),\n    slideRightOut40: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_RIGHT_OUT40), DURATION_3, EASING_FUNCTION_1),\n    slideRightOut400: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_RIGHT_OUT400), DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut10: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_LEFT_OUT10), DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut20: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_LEFT_OUT20), DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut40: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_LEFT_OUT40), DURATION_3, EASING_FUNCTION_1),\n    slideLeftOut400: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_LEFT_OUT400), DURATION_3, EASING_FUNCTION_1),\n    slideUpOut10: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_UP_OUT10), DURATION_3, EASING_FUNCTION_1),\n    slideUpOut20: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_UP_OUT20), DURATION_3, EASING_FUNCTION_1),\n    slideDownOut10: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_DOWN_OUT10), DURATION_3, EASING_FUNCTION_1),\n    slideDownOut20: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SLIDE_DOWN_OUT20), DURATION_3, EASING_FUNCTION_1),\n    scaleUpIn100: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SCALE_UP100), DURATION_3, EASING_FUNCTION_1),\n    scaleDownIn100: _createAnimation(\"\".concat(FADE_IN, \",\").concat(SCALE_DOWN100), DURATION_3, EASING_FUNCTION_1),\n    scaleUpOut103: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SCALE_UP103), DURATION_1, EASING_FUNCTION_2),\n    scaleDownOut98: _createAnimation(\"\".concat(FADE_OUT, \",\").concat(SCALE_DOWN98), DURATION_1, EASING_FUNCTION_2),\n    fadeIn100: _createAnimation(FADE_IN, DURATION_1, EASING_FUNCTION_2),\n    fadeIn200: _createAnimation(FADE_IN, DURATION_2, EASING_FUNCTION_2),\n    fadeIn400: _createAnimation(FADE_IN, DURATION_3, EASING_FUNCTION_2),\n    fadeIn500: _createAnimation(FADE_IN, DURATION_4, EASING_FUNCTION_2),\n    fadeOut100: _createAnimation(FADE_OUT, DURATION_1, EASING_FUNCTION_2),\n    fadeOut200: _createAnimation(FADE_OUT, DURATION_2, EASING_FUNCTION_2),\n    fadeOut400: _createAnimation(FADE_OUT, DURATION_3, EASING_FUNCTION_2),\n    fadeOut500: _createAnimation(FADE_OUT, DURATION_4, EASING_FUNCTION_2),\n    rotate90deg: _createAnimation(ROTATE90, \"0.1s\", EASING_FUNCTION_2),\n    rotateN90deg: _createAnimation(ROTATE_N90, \"0.1s\", EASING_FUNCTION_2)\n    // expandCollapse 100/200/400, delay 100/200\n  };\n  function _createAnimation(animationName, animationDuration2, animationTimingFunction) {\n    return {\n      animationName,\n      animationDuration: animationDuration2,\n      animationTimingFunction,\n      animationFillMode: \"both\"\n    };\n  }\n  function _createSlideInX(fromX) {\n    return keyframes({\n      from: { transform: \"translate3d(\".concat(fromX, \"px,0,0)\"), pointerEvents: \"none\" },\n      to: { transform: \"translate3d(0,0,0)\", pointerEvents: \"auto\" }\n    });\n  }\n  function _createSlideInY(fromY) {\n    return keyframes({\n      from: { transform: \"translate3d(0,\".concat(fromY, \"px,0)\"), pointerEvents: \"none\" },\n      to: { transform: \"translate3d(0,0,0)\", pointerEvents: \"auto\" }\n    });\n  }\n  function _createSlideOutX(toX) {\n    return keyframes({\n      from: { transform: \"translate3d(0,0,0)\" },\n      to: { transform: \"translate3d(\".concat(toX, \"px,0,0)\") }\n    });\n  }\n  function _createSlideOutY(toY) {\n    return keyframes({\n      from: { transform: \"translate3d(0,0,0)\" },\n      to: { transform: \"translate3d(0,\".concat(toY, \"px,0)\") }\n    });\n  }\n  var LocalizedFontNames;\n  (function(LocalizedFontNames2) {\n    LocalizedFontNames2.Arabic = \"Segoe UI Web (Arabic)\";\n    LocalizedFontNames2.Cyrillic = \"Segoe UI Web (Cyrillic)\";\n    LocalizedFontNames2.EastEuropean = \"Segoe UI Web (East European)\";\n    LocalizedFontNames2.Greek = \"Segoe UI Web (Greek)\";\n    LocalizedFontNames2.Hebrew = \"Segoe UI Web (Hebrew)\";\n    LocalizedFontNames2.Thai = \"Leelawadee UI Web\";\n    LocalizedFontNames2.Vietnamese = \"Segoe UI Web (Vietnamese)\";\n    LocalizedFontNames2.WestEuropean = \"Segoe UI Web (West European)\";\n    LocalizedFontNames2.Selawik = \"Selawik Web\";\n    LocalizedFontNames2.Armenian = \"Segoe UI Web (Armenian)\";\n    LocalizedFontNames2.Georgian = \"Segoe UI Web (Georgian)\";\n  })(LocalizedFontNames || (LocalizedFontNames = {}));\n  var LocalizedFontFamilies;\n  (function(LocalizedFontFamilies2) {\n    LocalizedFontFamilies2.Arabic = \"'\".concat(LocalizedFontNames.Arabic, \"'\");\n    LocalizedFontFamilies2.ChineseSimplified = \"'Microsoft Yahei UI', Verdana, Simsun\";\n    LocalizedFontFamilies2.ChineseTraditional = \"'Microsoft Jhenghei UI', Pmingliu\";\n    LocalizedFontFamilies2.Cyrillic = \"'\".concat(LocalizedFontNames.Cyrillic, \"'\");\n    LocalizedFontFamilies2.EastEuropean = \"'\".concat(LocalizedFontNames.EastEuropean, \"'\");\n    LocalizedFontFamilies2.Greek = \"'\".concat(LocalizedFontNames.Greek, \"'\");\n    LocalizedFontFamilies2.Hebrew = \"'\".concat(LocalizedFontNames.Hebrew, \"'\");\n    LocalizedFontFamilies2.Hindi = \"'Nirmala UI'\";\n    LocalizedFontFamilies2.Japanese = \"'Yu Gothic UI', 'Meiryo UI', Meiryo, 'MS Pgothic', Osaka\";\n    LocalizedFontFamilies2.Korean = \"'Malgun Gothic', Gulim\";\n    LocalizedFontFamilies2.Selawik = \"'\".concat(LocalizedFontNames.Selawik, \"'\");\n    LocalizedFontFamilies2.Thai = \"'Leelawadee UI Web', 'Kmer UI'\";\n    LocalizedFontFamilies2.Vietnamese = \"'\".concat(LocalizedFontNames.Vietnamese, \"'\");\n    LocalizedFontFamilies2.WestEuropean = \"'\".concat(LocalizedFontNames.WestEuropean, \"'\");\n    LocalizedFontFamilies2.Armenian = \"'\".concat(LocalizedFontNames.Armenian, \"'\");\n    LocalizedFontFamilies2.Georgian = \"'\".concat(LocalizedFontNames.Georgian, \"'\");\n  })(LocalizedFontFamilies || (LocalizedFontFamilies = {}));\n  var FontSizes;\n  (function(FontSizes2) {\n    FontSizes2.size10 = \"10px\";\n    FontSizes2.size12 = \"12px\";\n    FontSizes2.size14 = \"14px\";\n    FontSizes2.size16 = \"16px\";\n    FontSizes2.size18 = \"18px\";\n    FontSizes2.size20 = \"20px\";\n    FontSizes2.size24 = \"24px\";\n    FontSizes2.size28 = \"28px\";\n    FontSizes2.size32 = \"32px\";\n    FontSizes2.size42 = \"42px\";\n    FontSizes2.size68 = \"68px\";\n    FontSizes2.mini = \"10px\";\n    FontSizes2.xSmall = \"10px\";\n    FontSizes2.small = \"12px\";\n    FontSizes2.smallPlus = \"12px\";\n    FontSizes2.medium = \"14px\";\n    FontSizes2.mediumPlus = \"16px\";\n    FontSizes2.icon = \"16px\";\n    FontSizes2.large = \"18px\";\n    FontSizes2.xLarge = \"20px\";\n    FontSizes2.xLargePlus = \"24px\";\n    FontSizes2.xxLarge = \"28px\";\n    FontSizes2.xxLargePlus = \"32px\";\n    FontSizes2.superLarge = \"42px\";\n    FontSizes2.mega = \"68px\";\n  })(FontSizes || (FontSizes = {}));\n  var FontWeights;\n  (function(FontWeights2) {\n    FontWeights2.light = 100;\n    FontWeights2.semilight = 300;\n    FontWeights2.regular = 400;\n    FontWeights2.semibold = 600;\n    FontWeights2.bold = 700;\n  })(FontWeights || (FontWeights = {}));\n  var IconFontSizes;\n  (function(IconFontSizes2) {\n    IconFontSizes2.xSmall = \"10px\";\n    IconFontSizes2.small = \"12px\";\n    IconFontSizes2.medium = \"16px\";\n    IconFontSizes2.large = \"20px\";\n  })(IconFontSizes || (IconFontSizes = {}));\n  var FontFamilyFallbacks = \"'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif\";\n  var defaultFontFamily = \"'Segoe UI', '\".concat(LocalizedFontNames.WestEuropean, \"'\");\n  var LanguageToFontMap = {\n    ar: LocalizedFontFamilies.Arabic,\n    bg: LocalizedFontFamilies.Cyrillic,\n    cs: LocalizedFontFamilies.EastEuropean,\n    el: LocalizedFontFamilies.Greek,\n    et: LocalizedFontFamilies.EastEuropean,\n    he: LocalizedFontFamilies.Hebrew,\n    hi: LocalizedFontFamilies.Hindi,\n    hr: LocalizedFontFamilies.EastEuropean,\n    hu: LocalizedFontFamilies.EastEuropean,\n    ja: LocalizedFontFamilies.Japanese,\n    kk: LocalizedFontFamilies.EastEuropean,\n    ko: LocalizedFontFamilies.Korean,\n    lt: LocalizedFontFamilies.EastEuropean,\n    lv: LocalizedFontFamilies.EastEuropean,\n    pl: LocalizedFontFamilies.EastEuropean,\n    ru: LocalizedFontFamilies.Cyrillic,\n    sk: LocalizedFontFamilies.EastEuropean,\n    \"sr-latn\": LocalizedFontFamilies.EastEuropean,\n    th: LocalizedFontFamilies.Thai,\n    tr: LocalizedFontFamilies.EastEuropean,\n    uk: LocalizedFontFamilies.Cyrillic,\n    vi: LocalizedFontFamilies.Vietnamese,\n    \"zh-hans\": LocalizedFontFamilies.ChineseSimplified,\n    \"zh-hant\": LocalizedFontFamilies.ChineseTraditional,\n    hy: LocalizedFontFamilies.Armenian,\n    ka: LocalizedFontFamilies.Georgian\n  };\n  function _fontFamilyWithFallbacks(fontFamily2) {\n    return \"\".concat(fontFamily2, \", \").concat(FontFamilyFallbacks);\n  }\n  function _getLocalizedFontFamily(language) {\n    for (var lang in LanguageToFontMap) {\n      if (LanguageToFontMap.hasOwnProperty(lang) && language && lang.indexOf(language) === 0) {\n        return LanguageToFontMap[lang];\n      }\n    }\n    return defaultFontFamily;\n  }\n  function _createFont(size, weight, fontFamily2) {\n    return {\n      fontFamily: fontFamily2,\n      MozOsxFontSmoothing: \"grayscale\",\n      WebkitFontSmoothing: \"antialiased\",\n      fontSize: size,\n      fontWeight: weight\n    };\n  }\n  function createFontStyles(localeCode) {\n    var localizedFont = _getLocalizedFontFamily(localeCode);\n    var fontFamilyWithFallback = _fontFamilyWithFallbacks(localizedFont);\n    var fontStyles = {\n      tiny: _createFont(FontSizes.mini, FontWeights.regular, fontFamilyWithFallback),\n      xSmall: _createFont(FontSizes.xSmall, FontWeights.regular, fontFamilyWithFallback),\n      small: _createFont(FontSizes.small, FontWeights.regular, fontFamilyWithFallback),\n      smallPlus: _createFont(FontSizes.smallPlus, FontWeights.regular, fontFamilyWithFallback),\n      medium: _createFont(FontSizes.medium, FontWeights.regular, fontFamilyWithFallback),\n      mediumPlus: _createFont(FontSizes.mediumPlus, FontWeights.regular, fontFamilyWithFallback),\n      large: _createFont(FontSizes.large, FontWeights.regular, fontFamilyWithFallback),\n      xLarge: _createFont(FontSizes.xLarge, FontWeights.semibold, fontFamilyWithFallback),\n      xLargePlus: _createFont(FontSizes.xLargePlus, FontWeights.semibold, fontFamilyWithFallback),\n      xxLarge: _createFont(FontSizes.xxLarge, FontWeights.semibold, fontFamilyWithFallback),\n      xxLargePlus: _createFont(FontSizes.xxLargePlus, FontWeights.semibold, fontFamilyWithFallback),\n      superLarge: _createFont(FontSizes.superLarge, FontWeights.semibold, fontFamilyWithFallback),\n      mega: _createFont(FontSizes.mega, FontWeights.semibold, fontFamilyWithFallback)\n    };\n    return fontStyles;\n  }\n  var DefaultBaseUrl = \"https://res-1.cdn.office.net/files/fabric-cdn-prod_20230815.002/assets\";\n  var DefaultFontStyles = createFontStyles(getLanguage());\n  function _registerFontFace(fontFamily2, url, fontWeight, localFontName) {\n    fontFamily2 = \"'\".concat(fontFamily2, \"'\");\n    var localFontSrc = localFontName !== void 0 ? \"local('\".concat(localFontName, \"'),\") : \"\";\n    fontFace({\n      fontFamily: fontFamily2,\n      src: localFontSrc + \"url('\".concat(url, \".woff2') format('woff2'),\") + \"url('\".concat(url, \".woff') format('woff')\"),\n      fontWeight,\n      fontStyle: \"normal\",\n      fontDisplay: \"swap\"\n    });\n  }\n  function _registerFontFaceSet(baseUrl, fontFamily2, cdnFolder, cdnFontName, localFontName) {\n    if (cdnFontName === void 0) {\n      cdnFontName = \"segoeui\";\n    }\n    var urlBase = \"\".concat(baseUrl, \"/\").concat(cdnFolder, \"/\").concat(cdnFontName);\n    _registerFontFace(fontFamily2, urlBase + \"-light\", FontWeights.light, localFontName && localFontName + \" Light\");\n    _registerFontFace(fontFamily2, urlBase + \"-semilight\", FontWeights.semilight, localFontName && localFontName + \" SemiLight\");\n    _registerFontFace(fontFamily2, urlBase + \"-regular\", FontWeights.regular, localFontName);\n    _registerFontFace(fontFamily2, urlBase + \"-semibold\", FontWeights.semibold, localFontName && localFontName + \" SemiBold\");\n    _registerFontFace(fontFamily2, urlBase + \"-bold\", FontWeights.bold, localFontName && localFontName + \" Bold\");\n  }\n  function registerDefaultFontFaces(baseUrl) {\n    if (baseUrl) {\n      var fontUrl = \"\".concat(baseUrl, \"/fonts\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Thai, \"leelawadeeui-thai\", \"leelawadeeui\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Arabic, \"segoeui-arabic\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Cyrillic, \"segoeui-cyrillic\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.EastEuropean, \"segoeui-easteuropean\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Greek, \"segoeui-greek\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Hebrew, \"segoeui-hebrew\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Vietnamese, \"segoeui-vietnamese\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.WestEuropean, \"segoeui-westeuropean\", \"segoeui\", \"Segoe UI\");\n      _registerFontFaceSet(fontUrl, LocalizedFontFamilies.Selawik, \"selawik\", \"selawik\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Armenian, \"segoeui-armenian\");\n      _registerFontFaceSet(fontUrl, LocalizedFontNames.Georgian, \"segoeui-georgian\");\n      _registerFontFace(\"Leelawadee UI Web\", \"\".concat(fontUrl, \"/leelawadeeui-thai/leelawadeeui-semilight\"), FontWeights.light);\n      _registerFontFace(\"Leelawadee UI Web\", \"\".concat(fontUrl, \"/leelawadeeui-thai/leelawadeeui-bold\"), FontWeights.semibold);\n    }\n  }\n  function _getFontBaseUrl() {\n    var _a2, _b2;\n    var fabricConfig = (_a2 = getWindow()) === null || _a2 === void 0 ? void 0 : _a2.FabricConfig;\n    return (_b2 = fabricConfig === null || fabricConfig === void 0 ? void 0 : fabricConfig.fontBaseUrl) !== null && _b2 !== void 0 ? _b2 : DefaultBaseUrl;\n  }\n  registerDefaultFontFaces(_getFontBaseUrl());\n  function createTheme(theme, depComments) {\n    if (theme === void 0) {\n      theme = {};\n    }\n    if (depComments === void 0) {\n      depComments = false;\n    }\n    var isInverted = !!theme.isInverted;\n    var baseTheme = {\n      palette: DefaultPalette,\n      effects: DefaultEffects,\n      fonts: DefaultFontStyles,\n      spacing: DefaultSpacing,\n      isInverted,\n      disableGlobalClassNames: false,\n      semanticColors: makeSemanticColors(DefaultPalette, DefaultEffects, void 0, isInverted, depComments),\n      rtl: void 0\n    };\n    return mergeThemes(baseTheme, theme);\n  }\n  var HighContrastSelector = \"@media screen and (-ms-high-contrast: active), screen and (forced-colors: active)\";\n  var HighContrastSelectorWhite = (\n    // eslint-disable-next-line @fluentui/max-len\n    \"@media screen and (-ms-high-contrast: black-on-white), screen and (forced-colors: active) and (prefers-color-scheme: light)\"\n  );\n  var ScreenWidthMinSmall = 320;\n  var ScreenWidthMinMedium = 480;\n  var ScreenWidthMinLarge = 640;\n  var ScreenWidthMinXLarge = 1024;\n  var ScreenWidthMinXXLarge = 1366;\n  var ScreenWidthMaxSmall = ScreenWidthMinMedium - 1;\n  var ScreenWidthMaxMedium = ScreenWidthMinLarge - 1;\n  var ScreenWidthMinUhfMobile = 768;\n  function getScreenSelector(min2, max2) {\n    var minSelector = \" and (min-width: \".concat(min2, \"px)\");\n    var maxSelector = typeof max2 === \"number\" ? \" and (max-width: \".concat(max2, \"px)\") : \"\";\n    return \"@media only screen\".concat(minSelector).concat(maxSelector);\n  }\n  function getHighContrastNoAdjustStyle() {\n    return {\n      forcedColorAdjust: \"none\",\n      MsHighContrastAdjust: \"none\"\n    };\n  }\n  var ZIndexes;\n  (function(ZIndexes2) {\n    ZIndexes2.Nav = 1;\n    ZIndexes2.ScrollablePane = 1;\n    ZIndexes2.FocusStyle = 1;\n    ZIndexes2.Coachmark = 1e3;\n    ZIndexes2.Layer = 1e6;\n    ZIndexes2.KeytipLayer = 1000001;\n  })(ZIndexes || (ZIndexes = {}));\n  function getFocusStyle(theme, insetOrOptions, position2, highContrastStyle, borderColor, outlineColor, isFocusedOnly, borderRadius) {\n    if (typeof insetOrOptions === \"number\" || !insetOrOptions) {\n      return _getFocusStyleInternal(theme, {\n        inset: insetOrOptions,\n        position: position2,\n        highContrastStyle,\n        borderColor,\n        outlineColor,\n        isFocusedOnly,\n        borderRadius\n      });\n    } else {\n      return _getFocusStyleInternal(theme, insetOrOptions);\n    }\n  }\n  function _getFocusStyleInternal(theme, options2) {\n    var _a2, _b2;\n    if (options2 === void 0) {\n      options2 = {};\n    }\n    var borderRadius = options2.borderRadius, _c2 = options2.inset, inset = _c2 === void 0 ? 0 : _c2, _d2 = options2.width, width2 = _d2 === void 0 ? 1 : _d2, _e2 = options2.position, position2 = _e2 === void 0 ? \"relative\" : _e2, highContrastStyle = options2.highContrastStyle, _f = options2.borderColor, borderColor = _f === void 0 ? theme.palette.white : _f, _g = options2.outlineColor, outlineColor = _g === void 0 ? theme.palette.neutralSecondary : _g, _h = options2.isFocusedOnly, isFocusedOnly = _h === void 0 ? true : _h, pointerEvents = options2.pointerEvents;\n    return {\n      // Clear browser-specific focus styles and use 'transparent' as placeholder for focus style.\n      outline: \"transparent\",\n      // Requirement because pseudo-element is absolutely positioned.\n      position: position2,\n      selectors: (_a2 = {\n        // Clear the focus border in Firefox.\n        // Reference: http://stackoverflow.com/a/199319/1436671\n        \"::-moz-focus-inner\": {\n          border: \"0\"\n        }\n      }, // When the element that uses this mixin is in a :focus state, add a pseudo-element to\n      // create a border.\n      _a2[\".\".concat(IsFocusVisibleClassName, \" &\").concat(isFocusedOnly ? \":focus\" : \"\", \":after, :host(.\").concat(IsFocusVisibleClassName, \") &\").concat(isFocusedOnly ? \":focus\" : \"\", \":after\")] = {\n        content: '\"\"',\n        position: \"absolute\",\n        pointerEvents,\n        left: inset + 1,\n        top: inset + 1,\n        bottom: inset + 1,\n        right: inset + 1,\n        border: \"\".concat(width2, \"px solid \").concat(borderColor),\n        outline: \"\".concat(width2, \"px solid \").concat(outlineColor),\n        zIndex: ZIndexes.FocusStyle,\n        borderRadius,\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = highContrastStyle, _b2)\n      }, _a2)\n    };\n  }\n  function focusClear() {\n    return {\n      selectors: {\n        \"&::-moz-focus-inner\": {\n          // Clear the focus border in Firefox. Reference: http://stackoverflow.com/a/199319/1436671\n          border: 0\n        },\n        \"&\": {\n          // Clear browser specific focus styles and use transparent as placeholder for focus style\n          outline: \"transparent\"\n        }\n      }\n    };\n  }\n  var getInputFocusStyle = function(borderColor, borderRadius, borderType, borderPosition) {\n    var _a2, _b2, _c2;\n    if (borderType === void 0) {\n      borderType = \"border\";\n    }\n    if (borderPosition === void 0) {\n      borderPosition = -1;\n    }\n    var isBorderBottom = borderType === \"borderBottom\";\n    return {\n      borderColor,\n      selectors: {\n        \":after\": (_a2 = {\n          pointerEvents: \"none\",\n          content: \"''\",\n          position: \"absolute\",\n          left: isBorderBottom ? 0 : borderPosition,\n          top: borderPosition,\n          bottom: borderPosition,\n          right: isBorderBottom ? 0 : borderPosition\n        }, _a2[borderType] = \"2px solid \".concat(borderColor), _a2.borderRadius = borderRadius, _a2.width = borderType === \"borderBottom\" ? \"100%\" : void 0, _a2.selectors = (_b2 = {}, _b2[HighContrastSelector] = (_c2 = {}, _c2[borderType === \"border\" ? \"borderColor\" : \"borderBottomColor\"] = \"Highlight\", _c2), _b2), _a2)\n      }\n    };\n  };\n  var hiddenContentStyle = {\n    position: \"absolute\",\n    width: 1,\n    height: 1,\n    margin: -1,\n    padding: 0,\n    border: 0,\n    overflow: \"hidden\",\n    whiteSpace: \"nowrap\"\n  };\n  var _getGlobalClassNames = memoizeFunction(function(classNames2, disableGlobalClassNames) {\n    var styleSheet = Stylesheet.getInstance();\n    if (disableGlobalClassNames) {\n      return Object.keys(classNames2).reduce(function(acc, className2) {\n        acc[className2] = styleSheet.getClassName(classNames2[className2]);\n        return acc;\n      }, {});\n    }\n    return classNames2;\n  });\n  function getGlobalClassNames(classNames2, theme, disableGlobalClassNames) {\n    return _getGlobalClassNames(classNames2, theme.disableGlobalClassNames);\n  }\n  var __assign = function() {\n    __assign = Object.assign || function(t) {\n      for (var s2, i = 1, n = arguments.length; i < n; i++) {\n        s2 = arguments[i];\n        for (var p in s2) if (Object.prototype.hasOwnProperty.call(s2, p))\n          t[p] = s2[p];\n      }\n      return t;\n    };\n    return __assign.apply(this, arguments);\n  };\n  var _root = typeof window === \"undefined\" ? global : window;\n  var _styleNonce = _root && _root.CSPSettings && _root.CSPSettings.nonce;\n  var _themeState = initializeThemeState();\n  function initializeThemeState() {\n    var state = _root.__themeState__ || {\n      theme: void 0,\n      lastStyleElement: void 0,\n      registeredStyles: []\n    };\n    if (!state.runState) {\n      state = __assign(__assign({}, state), { perf: {\n        count: 0,\n        duration: 0\n      }, runState: {\n        flushTimer: 0,\n        mode: 0,\n        buffer: []\n      } });\n    }\n    if (!state.registeredThemableStyles) {\n      state = __assign(__assign({}, state), { registeredThemableStyles: [] });\n    }\n    _root.__themeState__ = state;\n    return state;\n  }\n  function applyThemableStyles(stylesArray, styleRecord) {\n    if (_themeState.loadStyles) {\n      _themeState.loadStyles(resolveThemableArray(stylesArray).styleString, stylesArray);\n    } else {\n      registerStyles(stylesArray);\n    }\n  }\n  function loadTheme$1(theme) {\n    _themeState.theme = theme;\n    reloadStyles();\n  }\n  function clearStyles(option) {\n    {\n      clearStylesInternal(_themeState.registeredThemableStyles);\n      _themeState.registeredThemableStyles = [];\n    }\n  }\n  function clearStylesInternal(records) {\n    records.forEach(function(styleRecord) {\n      var styleElement = styleRecord && styleRecord.styleElement;\n      if (styleElement && styleElement.parentElement) {\n        styleElement.parentElement.removeChild(styleElement);\n      }\n    });\n  }\n  function reloadStyles() {\n    if (_themeState.theme) {\n      var themableStyles = [];\n      for (var _i = 0, _a2 = _themeState.registeredThemableStyles; _i < _a2.length; _i++) {\n        var styleRecord = _a2[_i];\n        themableStyles.push(styleRecord.themableStyle);\n      }\n      if (themableStyles.length > 0) {\n        clearStyles();\n        applyThemableStyles([].concat.apply([], themableStyles));\n      }\n    }\n  }\n  function resolveThemableArray(splitStyleArray) {\n    var theme = _themeState.theme;\n    var themable = false;\n    var resolvedArray = (splitStyleArray || []).map(function(currentValue) {\n      var themeSlot = currentValue.theme;\n      if (themeSlot) {\n        themable = true;\n        var themedValue = theme ? theme[themeSlot] : void 0;\n        var defaultValue = currentValue.defaultValue || \"inherit\";\n        if (theme && !themedValue && console && !(themeSlot in theme) && typeof DEBUG !== \"undefined\" && DEBUG) {\n          console.warn('Theming value not provided for \"'.concat(themeSlot, '\". Falling back to \"').concat(defaultValue, '\".'));\n        }\n        return themedValue || defaultValue;\n      } else {\n        return currentValue.rawString;\n      }\n    });\n    return {\n      styleString: resolvedArray.join(\"\"),\n      themable\n    };\n  }\n  function registerStyles(styleArray) {\n    if (typeof document === \"undefined\") {\n      return;\n    }\n    var head = document.getElementsByTagName(\"head\")[0];\n    var styleElement = document.createElement(\"style\");\n    var _a2 = resolveThemableArray(styleArray), styleString = _a2.styleString, themable = _a2.themable;\n    styleElement.setAttribute(\"data-load-themed-styles\", \"true\");\n    if (_styleNonce) {\n      styleElement.setAttribute(\"nonce\", _styleNonce);\n    }\n    styleElement.appendChild(document.createTextNode(styleString));\n    _themeState.perf.count++;\n    head.appendChild(styleElement);\n    var ev = document.createEvent(\"HTMLEvents\");\n    ev.initEvent(\n      \"styleinsert\",\n      true,\n      false\n      /* cancelable */\n    );\n    ev.args = {\n      newStyle: styleElement\n    };\n    document.dispatchEvent(ev);\n    var record = {\n      styleElement,\n      themableStyle: styleArray\n    };\n    if (themable) {\n      _themeState.registeredThemableStyles.push(record);\n    } else {\n      _themeState.registeredStyles.push(record);\n    }\n  }\n  var _theme = createTheme({});\n  var _onThemeChangeCallbacks = [];\n  var ThemeSettingName = \"theme\";\n  function initializeThemeInCustomizations() {\n    var _a2;\n    var _b2, _c2;\n    var win = getWindow();\n    if ((_b2 = win === null || win === void 0 ? void 0 : win.FabricConfig) === null || _b2 === void 0 ? void 0 : _b2.legacyTheme) {\n      loadTheme(win.FabricConfig.legacyTheme);\n    } else if (!Customizations.getSettings([ThemeSettingName]).theme) {\n      if ((_c2 = win === null || win === void 0 ? void 0 : win.FabricConfig) === null || _c2 === void 0 ? void 0 : _c2.theme) {\n        _theme = createTheme(win.FabricConfig.theme);\n      }\n      Customizations.applySettings((_a2 = {}, _a2[ThemeSettingName] = _theme, _a2));\n    }\n  }\n  initializeThemeInCustomizations();\n  function getTheme(depComments) {\n    if (depComments === void 0) {\n      depComments = false;\n    }\n    if (depComments === true) {\n      _theme = createTheme({}, depComments);\n    }\n    return _theme;\n  }\n  function loadTheme(theme, depComments) {\n    var _a2;\n    if (depComments === void 0) {\n      depComments = false;\n    }\n    _theme = createTheme(theme, depComments);\n    loadTheme$1(__assign$1(__assign$1(__assign$1(__assign$1({}, _theme.palette), _theme.semanticColors), _theme.effects), _loadFonts(_theme)));\n    Customizations.applySettings((_a2 = {}, _a2[ThemeSettingName] = _theme, _a2));\n    _onThemeChangeCallbacks.forEach(function(callback) {\n      try {\n        callback(_theme);\n      } catch (e) {\n      }\n    });\n    return _theme;\n  }\n  function _loadFonts(theme) {\n    var lines = {};\n    for (var _i = 0, _a2 = Object.keys(theme.fonts); _i < _a2.length; _i++) {\n      var fontName = _a2[_i];\n      var font2 = theme.fonts[fontName];\n      for (var _b2 = 0, _c2 = Object.keys(font2); _b2 < _c2.length; _b2++) {\n        var propName = _c2[_b2];\n        var name_1 = fontName + propName.charAt(0).toUpperCase() + propName.slice(1);\n        var value2 = font2[propName];\n        if (propName === \"fontSize\" && typeof value2 === \"number\") {\n          value2 = value2 + \"px\";\n        }\n        lines[name_1] = value2;\n      }\n    }\n    return lines;\n  }\n  var normalize$1 = {\n    boxShadow: \"none\",\n    margin: 0,\n    padding: 0,\n    boxSizing: \"border-box\"\n  };\n  function getPlaceholderStyles(styles) {\n    return {\n      selectors: {\n        \"::placeholder\": styles,\n        // Chrome, Safari, Opera, Firefox\n        \":-ms-input-placeholder\": styles,\n        // IE 10+\n        \"::-ms-input-placeholder\": styles\n        // Edge\n      }\n    };\n  }\n  var AnimationClassNames = buildClassMap(AnimationStyles);\n  setVersion(\"@fluentui/style-utilities\", \"8.13.5\");\n  initializeThemeInCustomizations();\n  var GlobalClassNames$h = {\n    root: \"ms-Image\",\n    rootMaximizeFrame: \"ms-Image--maximizeFrame\",\n    image: \"ms-Image-image\",\n    imageCenter: \"ms-Image-image--center\",\n    imageContain: \"ms-Image-image--contain\",\n    imageCover: \"ms-Image-image--cover\",\n    imageCenterContain: \"ms-Image-image--centerContain\",\n    imageCenterCover: \"ms-Image-image--centerCover\",\n    imageNone: \"ms-Image-image--none\",\n    imageLandscape: \"ms-Image-image--landscape\",\n    imagePortrait: \"ms-Image-image--portrait\"\n  };\n  var getStyles$w = function(props) {\n    var className2 = props.className, width2 = props.width, height2 = props.height, maximizeFrame = props.maximizeFrame, isLoaded = props.isLoaded, shouldFadeIn = props.shouldFadeIn, shouldStartVisible = props.shouldStartVisible, isLandscape = props.isLandscape, isCenter = props.isCenter, isContain = props.isContain, isCover = props.isCover, isCenterContain = props.isCenterContain, isCenterCover = props.isCenterCover, isNone = props.isNone, isError = props.isError, isNotImageFit = props.isNotImageFit, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$h, theme);\n    var ImageFitStyles = {\n      position: \"absolute\",\n      left: \"50% /* @noflip */\",\n      top: \"50%\",\n      transform: \"translate(-50%,-50%)\"\n      // @todo test RTL renders transform: translate(50%,-50%);\n    };\n    var window2 = getWindow();\n    var supportsObjectFit = window2 !== void 0 && // eslint-disable-next-line @fluentui/max-len\n    // cast needed as vendor prefixed `msMaxTouchPoints` api is no longer part of TS lib declaration - introduced with TS 4.4\n    window2.navigator.msMaxTouchPoints === void 0;\n    var fallbackObjectFitStyles = isContain && isLandscape || isCover && !isLandscape ? { width: \"100%\", height: \"auto\" } : { width: \"auto\", height: \"100%\" };\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          overflow: \"hidden\"\n        },\n        maximizeFrame && [\n          classNames2.rootMaximizeFrame,\n          {\n            height: \"100%\",\n            width: \"100%\"\n          }\n        ],\n        isLoaded && shouldFadeIn && !shouldStartVisible && AnimationClassNames.fadeIn400,\n        (isCenter || isContain || isCover || isCenterContain || isCenterCover) && {\n          position: \"relative\"\n        },\n        className2\n      ],\n      image: [\n        classNames2.image,\n        {\n          display: \"block\",\n          opacity: 0\n        },\n        isLoaded && [\n          \"is-loaded\",\n          {\n            opacity: 1\n          }\n        ],\n        isCenter && [classNames2.imageCenter, ImageFitStyles],\n        isContain && [\n          classNames2.imageContain,\n          supportsObjectFit && {\n            width: \"100%\",\n            height: \"100%\",\n            objectFit: \"contain\"\n          },\n          !supportsObjectFit && fallbackObjectFitStyles,\n          !supportsObjectFit && ImageFitStyles\n        ],\n        isCover && [\n          classNames2.imageCover,\n          supportsObjectFit && {\n            width: \"100%\",\n            height: \"100%\",\n            objectFit: \"cover\"\n          },\n          !supportsObjectFit && fallbackObjectFitStyles,\n          !supportsObjectFit && ImageFitStyles\n        ],\n        isCenterContain && [\n          classNames2.imageCenterContain,\n          isLandscape && {\n            maxWidth: \"100%\"\n          },\n          !isLandscape && {\n            maxHeight: \"100%\"\n          },\n          ImageFitStyles\n        ],\n        isCenterCover && [\n          classNames2.imageCenterCover,\n          isLandscape && {\n            maxHeight: \"100%\"\n          },\n          !isLandscape && {\n            maxWidth: \"100%\"\n          },\n          ImageFitStyles\n        ],\n        isNone && [\n          classNames2.imageNone,\n          {\n            width: \"auto\",\n            height: \"auto\"\n          }\n        ],\n        isNotImageFit && [\n          !!width2 && !height2 && {\n            height: \"auto\",\n            width: \"100%\"\n          },\n          !width2 && !!height2 && {\n            height: \"100%\",\n            width: \"auto\"\n          },\n          !!width2 && !!height2 && {\n            height: \"100%\",\n            width: \"100%\"\n          }\n        ],\n        isLandscape && classNames2.imageLandscape,\n        !isLandscape && classNames2.imagePortrait,\n        !isLoaded && \"is-notLoaded\",\n        shouldFadeIn && \"is-fadeIn\",\n        isError && \"is-error\"\n      ]\n    };\n  };\n  var Image$1 = styled(ImageBase, getStyles$w, void 0, {\n    scope: \"Image\"\n  }, true);\n  Image$1.displayName = \"Image\";\n  var classNames = mergeStyleSets({\n    root: {\n      display: \"inline-block\",\n      textDecoration: \"inherit\"\n    },\n    placeholder: [\n      \"ms-Icon-placeHolder\",\n      {\n        width: \"1em\"\n      }\n    ],\n    image: [\n      \"ms-Icon-imageContainer\",\n      {\n        overflow: \"hidden\"\n      }\n    ]\n  });\n  var MS_ICON = \"ms-Icon\";\n  var getStyles$v = function(props) {\n    var className2 = props.className, iconClassName = props.iconClassName, isPlaceholder = props.isPlaceholder, isImage = props.isImage, styles = props.styles;\n    return {\n      root: [\n        isPlaceholder && classNames.placeholder,\n        classNames.root,\n        isImage && classNames.image,\n        iconClassName,\n        className2,\n        styles && styles.root,\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        styles && styles.imageContainer\n      ]\n    };\n  };\n  var getIconContent = memoizeFunction(\n    function(iconName) {\n      var _a2 = getIcon(iconName) || {\n        subset: {},\n        code: void 0\n      }, code = _a2.code, subset = _a2.subset;\n      if (!code) {\n        return null;\n      }\n      return {\n        children: code,\n        iconClassName: subset.className,\n        fontFamily: subset.fontFace && subset.fontFace.fontFamily,\n        mergeImageProps: subset.mergeImageProps\n      };\n    },\n    void 0,\n    true\n    /*ignoreNullOrUndefinedResult */\n  );\n  var FontIcon = function(props) {\n    var iconName = props.iconName, className2 = props.className, _a2 = props.style, style2 = _a2 === void 0 ? {} : _a2;\n    var iconContent = getIconContent(iconName) || {};\n    var iconClassName = iconContent.iconClassName, children2 = iconContent.children, fontFamily2 = iconContent.fontFamily, mergeImageProps = iconContent.mergeImageProps;\n    var nativeProps = getNativeProps(props, htmlElementProperties);\n    var accessibleName = props[\"aria-label\"] || props.title;\n    var containerProps = props[\"aria-label\"] || props[\"aria-labelledby\"] || props.title ? {\n      role: mergeImageProps ? void 0 : \"img\"\n    } : {\n      \"aria-hidden\": true\n    };\n    var finalChildren = children2;\n    if (mergeImageProps) {\n      if (typeof children2 === \"object\" && typeof children2.props === \"object\" && accessibleName) {\n        finalChildren = React__namespace.cloneElement(children2, { alt: accessibleName });\n      }\n    }\n    return React__namespace.createElement(\"i\", __assign$1({ \"data-icon-name\": iconName }, containerProps, nativeProps, mergeImageProps ? {\n      title: void 0,\n      \"aria-label\": void 0\n    } : {}, {\n      className: css(MS_ICON, classNames.root, iconClassName, !iconName && classNames.placeholder, className2),\n      // Apply the font family this way to ensure it doesn't get overridden by Fabric Core ms-Icon styles\n      // https://github.com/microsoft/fluentui/issues/10449\n      style: __assign$1({ fontFamily: fontFamily2 }, style2)\n    }), finalChildren);\n  };\n  memoizeFunction(function(iconName, className2, ariaLabel2) {\n    return FontIcon({ iconName, className: className2, \"aria-label\": ariaLabel2 });\n  });\n  var getClassNames$q = classNamesFunction({\n    // Icon is used a lot by other components.\n    // It's likely to see expected cases which pass different className to the Icon.\n    // Therefore setting a larger cache size.\n    cacheSize: 100\n  });\n  var IconBase = (\n    /** @class */\n    (function(_super) {\n      __extends(IconBase2, _super);\n      function IconBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._onImageLoadingStateChange = function(state) {\n          if (_this.props.imageProps && _this.props.imageProps.onLoadingStateChange) {\n            _this.props.imageProps.onLoadingStateChange(state);\n          }\n          if (state === ImageLoadState.error) {\n            _this.setState({ imageLoadError: true });\n          }\n        };\n        _this.state = {\n          imageLoadError: false\n        };\n        return _this;\n      }\n      IconBase2.prototype.render = function() {\n        var _a2 = this.props, children2 = _a2.children, className2 = _a2.className, styles = _a2.styles, iconName = _a2.iconName, imageErrorAs = _a2.imageErrorAs, theme = _a2.theme;\n        var isPlaceholder = typeof iconName === \"string\" && iconName.length === 0;\n        var isImage = (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          !!this.props.imageProps || this.props.iconType === IconType.image || this.props.iconType === IconType.Image\n        );\n        var iconContent = getIconContent(iconName) || {};\n        var iconClassName = iconContent.iconClassName, iconContentChildren = iconContent.children, mergeImageProps = iconContent.mergeImageProps;\n        var classNames2 = getClassNames$q(styles, {\n          theme,\n          className: className2,\n          iconClassName,\n          isImage,\n          isPlaceholder\n        });\n        var RootType = isImage ? \"span\" : \"i\";\n        var nativeProps = getNativeProps(this.props, htmlElementProperties, [\n          \"aria-label\"\n        ]);\n        var imageLoadError = this.state.imageLoadError;\n        var imageProps = __assign$1(__assign$1({}, this.props.imageProps), { onLoadingStateChange: this._onImageLoadingStateChange });\n        var ImageType = imageLoadError && imageErrorAs || Image$1;\n        var ariaLabel2 = this.props[\"aria-label\"] || this.props.ariaLabel;\n        var accessibleName = imageProps.alt || ariaLabel2 || this.props.title;\n        var hasName = !!(accessibleName || this.props[\"aria-labelledby\"] || imageProps[\"aria-label\"] || imageProps[\"aria-labelledby\"]);\n        var containerProps = hasName ? {\n          role: isImage || mergeImageProps ? void 0 : \"img\",\n          \"aria-label\": isImage || mergeImageProps ? void 0 : accessibleName\n        } : {\n          \"aria-hidden\": true\n        };\n        var finalIconContentChildren = iconContentChildren;\n        if (mergeImageProps && iconContentChildren && typeof iconContentChildren === \"object\" && accessibleName) {\n          finalIconContentChildren = React__namespace.cloneElement(iconContentChildren, {\n            alt: accessibleName\n          });\n        }\n        return React__namespace.createElement(RootType, __assign$1({ \"data-icon-name\": iconName }, containerProps, nativeProps, mergeImageProps ? {\n          title: void 0,\n          \"aria-label\": void 0\n        } : {}, { className: classNames2.root }), isImage ? React__namespace.createElement(ImageType, __assign$1({}, imageProps)) : children2 || finalIconContentChildren);\n      };\n      return IconBase2;\n    })(React__namespace.Component)\n  );\n  var Icon = styled(IconBase, getStyles$v, void 0, {\n    scope: \"Icon\"\n  }, true);\n  Icon.displayName = \"Icon\";\n  var ImageIcon = function(props) {\n    var className2 = props.className, imageProps = props.imageProps;\n    var nativeProps = getNativeProps(props, htmlElementProperties, [\n      \"aria-label\",\n      \"aria-labelledby\",\n      \"title\",\n      \"aria-describedby\"\n    ]);\n    var altText = imageProps.alt || props[\"aria-label\"];\n    var hasName = altText || props[\"aria-labelledby\"] || props.title || imageProps[\"aria-label\"] || imageProps[\"aria-labelledby\"] || imageProps.title;\n    var imageNameProps = {\n      \"aria-labelledby\": props[\"aria-labelledby\"],\n      \"aria-describedby\": props[\"aria-describedby\"],\n      title: props.title\n    };\n    var containerProps = hasName ? {} : {\n      \"aria-hidden\": true\n    };\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({}, containerProps, nativeProps, { className: css(MS_ICON, classNames.root, classNames.image, className2) }),\n      React__namespace.createElement(Image$1, __assign$1({}, imageNameProps, imageProps, { alt: hasName ? altText : \"\" }))\n    );\n  };\n  var DirectionalHint = {\n    /**\n     * Appear above the target element, with the left edges of the callout and target aligning.\n     */\n    topLeftEdge: 0,\n    /**\n     * Appear above the target element, with the centers of the callout and target aligning.\n     */\n    topCenter: 1,\n    /**\n     * Appear above the target element, with the right edges of the callout and target aligning.\n     */\n    topRightEdge: 2,\n    /**\n     * Appear above the target element, aligning with the target element such that the callout tends toward\n     * the center of the screen.\n     */\n    topAutoEdge: 3,\n    /**\n     * Appear below the target element, with the left edges of the callout and target aligning.\n     */\n    bottomLeftEdge: 4,\n    /**\n     * Appear below the target element, with the centers of the callout and target aligning.\n     */\n    bottomCenter: 5,\n    /**\n     * Appear below the target element, with the right edges of the callout and target aligning.\n     */\n    bottomRightEdge: 6,\n    /**\n     * Appear below the target element, aligning with the target element such that the callout tends toward\n     * the center of the screen.\n     */\n    bottomAutoEdge: 7,\n    /**\n     * Appear to the left of the target element, with the top edges of the callout and target aligning.\n     */\n    leftTopEdge: 8,\n    /**\n     * Appear to the left of the target element, with the centers of the callout and target aligning.\n     */\n    leftCenter: 9,\n    /**\n     * Appear to the left of the target element, with the bottom edges of the callout and target aligning.\n     */\n    leftBottomEdge: 10,\n    /**\n     * Appear to the right of the target element, with the top edges of the callout and target aligning.\n     */\n    rightTopEdge: 11,\n    /**\n     * Appear to the right of the target element, with the centers of the callout and target aligning.\n     */\n    rightCenter: 12,\n    /**\n     * Appear to the right of the target element, with the bottom edges of the callout and target aligning.\n     */\n    rightBottomEdge: 13\n  };\n  var ContextualMenuItemType;\n  (function(ContextualMenuItemType2) {\n    ContextualMenuItemType2[ContextualMenuItemType2[\"Normal\"] = 0] = \"Normal\";\n    ContextualMenuItemType2[ContextualMenuItemType2[\"Divider\"] = 1] = \"Divider\";\n    ContextualMenuItemType2[ContextualMenuItemType2[\"Header\"] = 2] = \"Header\";\n    ContextualMenuItemType2[ContextualMenuItemType2[\"Section\"] = 3] = \"Section\";\n  })(ContextualMenuItemType || (ContextualMenuItemType = {}));\n  var FocusZoneTabbableElements = {\n    /** All tabbing action is allowed */\n    all: 1,\n    /** Tabbing is allowed only on input elements */\n    inputOnly: 2\n  };\n  var FocusZoneDirection;\n  (function(FocusZoneDirection2) {\n    FocusZoneDirection2[FocusZoneDirection2[\"vertical\"] = 0] = \"vertical\";\n    FocusZoneDirection2[FocusZoneDirection2[\"horizontal\"] = 1] = \"horizontal\";\n    FocusZoneDirection2[FocusZoneDirection2[\"bidirectional\"] = 2] = \"bidirectional\";\n    FocusZoneDirection2[FocusZoneDirection2[\"domOrder\"] = 3] = \"domOrder\";\n  })(FocusZoneDirection || (FocusZoneDirection = {}));\n  var IS_FOCUSABLE_ATTRIBUTE = \"data-is-focusable\";\n  var IS_ENTER_DISABLED_ATTRIBUTE = \"data-disable-click-on-enter\";\n  var FOCUSZONE_ID_ATTRIBUTE = \"data-focuszone-id\";\n  var TABINDEX = \"tabindex\";\n  var NO_VERTICAL_WRAP = \"data-no-vertical-wrap\";\n  var NO_HORIZONTAL_WRAP = \"data-no-horizontal-wrap\";\n  var LARGE_DISTANCE_FROM_CENTER = 999999999;\n  var LARGE_NEGATIVE_DISTANCE_FROM_CENTER = -999999999;\n  var focusZoneStyles;\n  var focusZoneClass = \"ms-FocusZone\";\n  function raiseClickFromKeyboardEvent(target2, ev) {\n    var event2;\n    if (typeof MouseEvent === \"function\") {\n      event2 = new MouseEvent(\"click\", {\n        ctrlKey: ev === null || ev === void 0 ? void 0 : ev.ctrlKey,\n        metaKey: ev === null || ev === void 0 ? void 0 : ev.metaKey,\n        shiftKey: ev === null || ev === void 0 ? void 0 : ev.shiftKey,\n        altKey: ev === null || ev === void 0 ? void 0 : ev.altKey,\n        bubbles: ev === null || ev === void 0 ? void 0 : ev.bubbles,\n        cancelable: ev === null || ev === void 0 ? void 0 : ev.cancelable\n      });\n    } else {\n      event2 = document.createEvent(\"MouseEvents\");\n      event2.initMouseEvent(\n        \"click\",\n        ev ? ev.bubbles : false,\n        ev ? ev.cancelable : false,\n        // eslint-disable-next-line no-restricted-globals\n        window,\n        // not using getWindow() since this can only be run client side\n        0,\n        // detail\n        0,\n        // screen x\n        0,\n        // screen y\n        0,\n        // client x\n        0,\n        // client y\n        ev ? ev.ctrlKey : false,\n        ev ? ev.altKey : false,\n        ev ? ev.shiftKey : false,\n        ev ? ev.metaKey : false,\n        0,\n        // button\n        null\n      );\n    }\n    target2.dispatchEvent(event2);\n  }\n  function getRootClass() {\n    if (!focusZoneStyles) {\n      focusZoneStyles = mergeStyles({\n        selectors: {\n          \":focus\": {\n            outline: \"none\"\n          }\n        }\n      }, focusZoneClass);\n    }\n    return focusZoneStyles;\n  }\n  var _allInstances = {};\n  var _outerZones = /* @__PURE__ */ new Set();\n  var ALLOWED_INPUT_TYPES = [\"text\", \"number\", \"password\", \"email\", \"tel\", \"url\", \"search\", \"textarea\"];\n  var ALLOW_VIRTUAL_ELEMENTS = false;\n  var FocusZone = (\n    /** @class */\n    (function(_super) {\n      __extends(FocusZone2, _super);\n      function FocusZone2(props) {\n        var _a2, _b2, _c2, _d2;\n        var _this = _super.call(this, props) || this;\n        _this._root = React__namespace.createRef();\n        _this._mergedRef = createMergedRef();\n        _this._onFocus = function(ev) {\n          if (_this._portalContainsElement(ev.target)) {\n            return;\n          }\n          var _a22 = _this.props, onActiveElementChanged = _a22.onActiveElementChanged, doNotAllowFocusEventToPropagate = _a22.doNotAllowFocusEventToPropagate, stopFocusPropagation = _a22.stopFocusPropagation, onFocusNotification = _a22.onFocusNotification, onFocus = _a22.onFocus, shouldFocusInnerElementWhenReceivedFocus = _a22.shouldFocusInnerElementWhenReceivedFocus, defaultTabbableElement = _a22.defaultTabbableElement;\n          var isImmediateDescendant = _this._isImmediateDescendantOfZone(ev.target);\n          var newActiveElement;\n          if (isImmediateDescendant) {\n            newActiveElement = ev.target;\n          } else {\n            var parentElement = ev.target;\n            while (parentElement && parentElement !== _this._root.current) {\n              if (isElementTabbable(parentElement, void 0, _this._inShadowRoot) && _this._isImmediateDescendantOfZone(parentElement)) {\n                newActiveElement = parentElement;\n                break;\n              }\n              parentElement = getParent(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n            }\n          }\n          if (shouldFocusInnerElementWhenReceivedFocus && ev.target === _this._root.current) {\n            var maybeElementToFocus = defaultTabbableElement && typeof defaultTabbableElement === \"function\" && _this._root.current && defaultTabbableElement(_this._root.current);\n            if (maybeElementToFocus && isElementTabbable(maybeElementToFocus, void 0, _this._inShadowRoot)) {\n              newActiveElement = maybeElementToFocus;\n              maybeElementToFocus.focus();\n            } else {\n              _this.focus(true);\n              if (_this._activeElement) {\n                newActiveElement = null;\n              }\n            }\n          }\n          var initialElementFocused = !_this._activeElement;\n          if (newActiveElement && newActiveElement !== _this._activeElement) {\n            if (isImmediateDescendant || initialElementFocused) {\n              _this._setFocusAlignment(newActiveElement, true, true);\n            }\n            _this._activeElement = newActiveElement;\n            if (initialElementFocused) {\n              _this._updateTabIndexes();\n            }\n          }\n          if (onActiveElementChanged) {\n            onActiveElementChanged(_this._activeElement, ev);\n          }\n          if (stopFocusPropagation || doNotAllowFocusEventToPropagate) {\n            ev.stopPropagation();\n          }\n          if (onFocus) {\n            onFocus(ev);\n          } else if (onFocusNotification) {\n            onFocusNotification();\n          }\n        };\n        _this._onBlur = function() {\n          _this._setParkedFocus(false);\n        };\n        _this._onMouseDown = function(ev) {\n          if (_this._portalContainsElement(ev.target)) {\n            return;\n          }\n          var disabled = _this.props.disabled;\n          if (disabled) {\n            return;\n          }\n          var target2 = ev.target;\n          var path2 = [];\n          while (target2 && target2 !== _this._root.current) {\n            path2.push(target2);\n            target2 = getParent(target2, ALLOW_VIRTUAL_ELEMENTS);\n          }\n          while (path2.length) {\n            target2 = path2.pop();\n            if (target2 && isElementTabbable(target2, void 0, _this._inShadowRoot)) {\n              _this._setActiveElement(target2, true);\n            }\n            if (isElementFocusZone(target2)) {\n              break;\n            }\n          }\n        };\n        _this._onKeyDown = function(ev, theme) {\n          if (_this._portalContainsElement(ev.target)) {\n            return;\n          }\n          var _a22 = _this.props, direction = _a22.direction, disabled = _a22.disabled, isInnerZoneKeystroke = _a22.isInnerZoneKeystroke, pagingSupportDisabled = _a22.pagingSupportDisabled, shouldEnterInnerZone = _a22.shouldEnterInnerZone;\n          if (disabled) {\n            return;\n          }\n          if (_this.props.onKeyDown) {\n            _this.props.onKeyDown(ev);\n          }\n          if (ev.isDefaultPrevented()) {\n            return;\n          }\n          if (_this._getDocument().activeElement === _this._root.current && _this._isInnerZone) {\n            return;\n          }\n          if ((shouldEnterInnerZone && shouldEnterInnerZone(ev) || isInnerZoneKeystroke && isInnerZoneKeystroke(ev)) && _this._isImmediateDescendantOfZone(ev.target)) {\n            var innerZone = _this._getFirstInnerZone();\n            if (innerZone) {\n              if (!innerZone.focus(true)) {\n                return;\n              }\n            } else if (isElementFocusSubZone(ev.target)) {\n              if (!_this.focusElement(getNextElement(ev.target, ev.target.firstChild, true))) {\n                return;\n              }\n            } else {\n              return;\n            }\n          } else if (ev.altKey) {\n            return;\n          } else {\n            switch (ev.which) {\n              case KeyCodes.space:\n                if (_this._shouldRaiseClicksOnSpace && _this._tryInvokeClickForFocusable(ev.target, ev)) {\n                  break;\n                }\n                return;\n              case KeyCodes.left:\n                if (direction !== FocusZoneDirection.vertical) {\n                  _this._preventDefaultWhenHandled(ev);\n                  if (_this._moveFocusLeft(theme)) {\n                    break;\n                  }\n                }\n                return;\n              case KeyCodes.right:\n                if (direction !== FocusZoneDirection.vertical) {\n                  _this._preventDefaultWhenHandled(ev);\n                  if (_this._moveFocusRight(theme)) {\n                    break;\n                  }\n                }\n                return;\n              case KeyCodes.up:\n                if (direction !== FocusZoneDirection.horizontal) {\n                  _this._preventDefaultWhenHandled(ev);\n                  if (_this._moveFocusUp()) {\n                    break;\n                  }\n                }\n                return;\n              case KeyCodes.down:\n                if (direction !== FocusZoneDirection.horizontal) {\n                  _this._preventDefaultWhenHandled(ev);\n                  if (_this._moveFocusDown()) {\n                    break;\n                  }\n                }\n                return;\n              case KeyCodes.pageDown:\n                if (!pagingSupportDisabled && _this._moveFocusPaging(true)) {\n                  break;\n                }\n                return;\n              case KeyCodes.pageUp:\n                if (!pagingSupportDisabled && _this._moveFocusPaging(false)) {\n                  break;\n                }\n                return;\n              case KeyCodes.tab:\n                if (\n                  // eslint-disable-next-line @typescript-eslint/no-deprecated\n                  _this.props.allowTabKey || _this.props.handleTabKey === FocusZoneTabbableElements.all || _this.props.handleTabKey === FocusZoneTabbableElements.inputOnly && _this._isElementInput(ev.target)\n                ) {\n                  var focusChanged = false;\n                  _this._processingTabKey = true;\n                  if (direction === FocusZoneDirection.vertical || !_this._shouldWrapFocus(_this._activeElement, NO_HORIZONTAL_WRAP)) {\n                    focusChanged = ev.shiftKey ? _this._moveFocusUp() : _this._moveFocusDown();\n                  } else {\n                    var tabWithDirection = getRTL(theme) ? !ev.shiftKey : ev.shiftKey;\n                    focusChanged = tabWithDirection ? _this._moveFocusLeft(theme) : _this._moveFocusRight(theme);\n                  }\n                  _this._processingTabKey = false;\n                  if (focusChanged) {\n                    break;\n                  } else if (_this.props.shouldResetActiveElementWhenTabFromZone) {\n                    _this._activeElement = null;\n                  }\n                }\n                return;\n              case KeyCodes.home:\n                if (_this._isContentEditableElement(ev.target) || _this._isElementInput(ev.target) && !_this._shouldInputLoseFocus(ev.target, false)) {\n                  return false;\n                }\n                var firstChild = _this._root.current && _this._root.current.firstChild;\n                if (_this._root.current && firstChild && _this.focusElement(getNextElement(_this._root.current, firstChild, true))) {\n                  break;\n                }\n                return;\n              case KeyCodes.end:\n                if (_this._isContentEditableElement(ev.target) || _this._isElementInput(ev.target) && !_this._shouldInputLoseFocus(ev.target, true)) {\n                  return false;\n                }\n                var lastChild = _this._root.current && _this._root.current.lastChild;\n                if (_this._root.current && _this.focusElement(getPreviousElement(_this._root.current, lastChild, true, true, true))) {\n                  break;\n                }\n                return;\n              case KeyCodes.enter:\n                if (_this._shouldRaiseClicksOnEnter && _this._tryInvokeClickForFocusable(ev.target, ev)) {\n                  break;\n                }\n                return;\n              default:\n                return;\n            }\n          }\n          ev.preventDefault();\n          ev.stopPropagation();\n        };\n        _this._getHorizontalDistanceFromCenter = function(isForward, activeRect, targetRect) {\n          var leftAlignment = _this._focusAlignment.left || _this._focusAlignment.x || 0;\n          var targetRectTop = Math.floor(targetRect.top);\n          var activeRectBottom = Math.floor(activeRect.bottom);\n          var targetRectBottom = Math.floor(targetRect.bottom);\n          var activeRectTop = Math.floor(activeRect.top);\n          var isValidCandidateOnpagingDown = isForward && targetRectTop > activeRectBottom;\n          var isValidCandidateOnpagingUp = !isForward && targetRectBottom < activeRectTop;\n          if (isValidCandidateOnpagingDown || isValidCandidateOnpagingUp) {\n            if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) {\n              return 0;\n            }\n            return Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n          }\n          if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) {\n            return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n          }\n          return LARGE_DISTANCE_FROM_CENTER;\n        };\n        initializeComponentRef(_this);\n        _this._id = getId(\"FocusZone\");\n        _this._focusAlignment = {\n          left: 0,\n          top: 0\n        };\n        _this._processingTabKey = false;\n        var shouldRaiseClicksFallback = (_b2 = (_a2 = props.shouldRaiseClicks) !== null && _a2 !== void 0 ? _a2 : FocusZone2.defaultProps.shouldRaiseClicks) !== null && _b2 !== void 0 ? _b2 : true;\n        _this._shouldRaiseClicksOnEnter = (_c2 = props.shouldRaiseClicksOnEnter) !== null && _c2 !== void 0 ? _c2 : shouldRaiseClicksFallback;\n        _this._shouldRaiseClicksOnSpace = (_d2 = props.shouldRaiseClicksOnSpace) !== null && _d2 !== void 0 ? _d2 : shouldRaiseClicksFallback;\n        return _this;\n      }\n      FocusZone2.getOuterZones = function() {\n        return _outerZones.size;\n      };\n      FocusZone2._onKeyDownCapture = function(ev) {\n        if (ev.which === KeyCodes.tab) {\n          _outerZones.forEach(function(zone) {\n            return zone._updateTabIndexes();\n          });\n        }\n      };\n      FocusZone2.prototype.componentDidMount = function() {\n        var _a2;\n        var root = this._root.current;\n        this._inShadowRoot = !!((_a2 = this.context) === null || _a2 === void 0 ? void 0 : _a2.shadowRoot);\n        _allInstances[this._id] = this;\n        if (root) {\n          var parentElement = getParent(root, ALLOW_VIRTUAL_ELEMENTS);\n          while (parentElement && parentElement !== this._getDocument().body && parentElement.nodeType === 1) {\n            if (isElementFocusZone(parentElement)) {\n              this._isInnerZone = true;\n              break;\n            }\n            parentElement = getParent(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n          }\n          if (!this._isInnerZone) {\n            _outerZones.add(this);\n            this._root.current && this._root.current.addEventListener(\"keydown\", FocusZone2._onKeyDownCapture, true);\n          }\n          this._root.current && this._root.current.addEventListener(\"blur\", this._onBlur, true);\n          this._updateTabIndexes();\n          if (this.props.defaultTabbableElement && typeof this.props.defaultTabbableElement === \"string\") {\n            this._activeElement = this._getDocument().querySelector(this.props.defaultTabbableElement);\n          } else if (this.props.defaultActiveElement) {\n            this._activeElement = this._getDocument().querySelector(this.props.defaultActiveElement);\n          }\n          if (this.props.shouldFocusOnMount) {\n            this.focus();\n          }\n        }\n      };\n      FocusZone2.prototype.componentDidUpdate = function() {\n        var _a2;\n        var root = this._root.current;\n        var doc = this._getDocument();\n        this._inShadowRoot = !!((_a2 = this.context) === null || _a2 === void 0 ? void 0 : _a2.shadowRoot);\n        if (this._activeElement && !elementContains(this._root.current, this._activeElement, ALLOW_VIRTUAL_ELEMENTS) || this._defaultFocusElement && !elementContains(this._root.current, this._defaultFocusElement, ALLOW_VIRTUAL_ELEMENTS)) {\n          this._activeElement = null;\n          this._defaultFocusElement = null;\n          this._updateTabIndexes();\n        }\n        if (!this.props.preventFocusRestoration && doc && this._lastIndexPath && (doc.activeElement === doc.body || doc.activeElement === null || doc.activeElement === root)) {\n          var elementToFocus = getFocusableByIndexPath(root, this._lastIndexPath);\n          if (elementToFocus) {\n            this._setActiveElement(elementToFocus, true);\n            elementToFocus.focus();\n            this._setParkedFocus(false);\n          } else {\n            this._setParkedFocus(true);\n          }\n        }\n      };\n      FocusZone2.prototype.componentWillUnmount = function() {\n        delete _allInstances[this._id];\n        if (!this._isInnerZone) {\n          _outerZones.delete(this);\n          this._root.current && this._root.current.removeEventListener(\"keydown\", FocusZone2._onKeyDownCapture, true);\n        }\n        if (this._root.current) {\n          this._root.current.removeEventListener(\"blur\", this._onBlur, true);\n        }\n        this._activeElement = null;\n        this._defaultFocusElement = null;\n      };\n      FocusZone2.prototype.render = function() {\n        var _this = this;\n        var _a2 = this.props, tag = _a2.as, elementType = _a2.elementType, rootProps = _a2.rootProps, ariaDescribedBy = _a2.ariaDescribedBy, ariaLabelledBy = _a2.ariaLabelledBy, className2 = _a2.className;\n        var divProps = getNativeProps(this.props, htmlElementProperties);\n        var Tag = tag || elementType || \"div\";\n        this._evaluateFocusBeforeRender();\n        var theme = getTheme();\n        return React__namespace.createElement(Tag, __assign$1({ \"aria-labelledby\": ariaLabelledBy, \"aria-describedby\": ariaDescribedBy }, divProps, rootProps, {\n          // Once the getClassName correctly memoizes inputs this should\n          // be replaced so that className is passed to getRootClass and is included there so\n          // the class names will always be in the same order.\n          className: css(getRootClass(), className2),\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          ref: this._mergedRef(this.props.elementRef, this._root),\n          \"data-focuszone-id\": this._id,\n          // eslint-disable-next-line react/jsx-no-bind\n          onKeyDown: function(ev) {\n            return _this._onKeyDown(ev, theme);\n          },\n          onFocus: this._onFocus,\n          onMouseDownCapture: this._onMouseDown\n        }), this.props.children);\n      };\n      FocusZone2.prototype.focus = function(forceIntoFirstElement, bypassHiddenElements) {\n        if (forceIntoFirstElement === void 0) {\n          forceIntoFirstElement = false;\n        }\n        if (bypassHiddenElements === void 0) {\n          bypassHiddenElements = false;\n        }\n        if (this._root.current) {\n          if (!forceIntoFirstElement && this._root.current.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\" && this._isInnerZone) {\n            var ownerZoneElement = this._getOwnerZone(this._root.current);\n            if (ownerZoneElement !== this._root.current) {\n              var ownerZone = _allInstances[ownerZoneElement.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n              return !!ownerZone && ownerZone.focusElement(this._root.current);\n            }\n            return false;\n          } else if (!forceIntoFirstElement && this._activeElement && elementContains(this._root.current, this._activeElement) && isElementTabbable(this._activeElement, void 0, this._inShadowRoot) && (!bypassHiddenElements || isElementVisibleAndNotHidden(this._activeElement))) {\n            this._activeElement.focus();\n            return true;\n          } else {\n            var firstChild = this._root.current.firstChild;\n            return this.focusElement(getNextElement(this._root.current, firstChild, true, void 0, void 0, void 0, void 0, void 0, bypassHiddenElements));\n          }\n        }\n        return false;\n      };\n      FocusZone2.prototype.focusLast = function() {\n        if (this._root.current) {\n          var lastChild = this._root.current && this._root.current.lastChild;\n          return this.focusElement(getPreviousElement(this._root.current, lastChild, true, true, true));\n        }\n        return false;\n      };\n      FocusZone2.prototype.focusElement = function(element2, forceAlignment) {\n        var _a2 = this.props, onBeforeFocus = _a2.onBeforeFocus, shouldReceiveFocus = _a2.shouldReceiveFocus;\n        if (shouldReceiveFocus && !shouldReceiveFocus(element2) || onBeforeFocus && !onBeforeFocus(element2)) {\n          return false;\n        }\n        if (element2) {\n          this._setActiveElement(element2, forceAlignment);\n          if (this._activeElement) {\n            this._activeElement.focus();\n          }\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype.setFocusAlignment = function(point2) {\n        this._focusAlignment = point2;\n      };\n      Object.defineProperty(FocusZone2.prototype, \"defaultFocusElement\", {\n        get: function() {\n          return this._defaultFocusElement;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(FocusZone2.prototype, \"activeElement\", {\n        get: function() {\n          return this._activeElement;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      FocusZone2.prototype._evaluateFocusBeforeRender = function() {\n        var root = this._root.current;\n        var doc = this._getDocument();\n        if (doc) {\n          var focusedElement = doc.activeElement;\n          if (focusedElement !== root) {\n            var shouldRestoreFocus = elementContains(root, focusedElement, false);\n            this._lastIndexPath = shouldRestoreFocus ? getElementIndexPath(root, focusedElement) : void 0;\n          }\n        }\n      };\n      FocusZone2.prototype._setParkedFocus = function(isParked) {\n        var root = this._root.current;\n        if (root && this._isParked !== isParked) {\n          this._isParked = isParked;\n          if (isParked) {\n            if (!this.props.allowFocusRoot) {\n              this._parkedTabIndex = root.getAttribute(\"tabindex\");\n              root.setAttribute(\"tabindex\", \"-1\");\n            }\n            root.focus();\n          } else if (!this.props.allowFocusRoot) {\n            if (this._parkedTabIndex) {\n              root.setAttribute(\"tabindex\", this._parkedTabIndex);\n              this._parkedTabIndex = void 0;\n            } else {\n              root.removeAttribute(\"tabindex\");\n            }\n          }\n        }\n      };\n      FocusZone2.prototype._setActiveElement = function(element2, forceAlignment) {\n        var previousActiveElement = this._activeElement;\n        this._activeElement = element2;\n        if (previousActiveElement) {\n          if (isElementFocusZone(previousActiveElement)) {\n            this._updateTabIndexes(previousActiveElement);\n          }\n          previousActiveElement.tabIndex = -1;\n        }\n        if (this._activeElement) {\n          if (!this._focusAlignment || forceAlignment) {\n            this._setFocusAlignment(element2, true, true);\n          }\n          this._activeElement.tabIndex = 0;\n        }\n      };\n      FocusZone2.prototype._preventDefaultWhenHandled = function(ev) {\n        this.props.preventDefaultWhenHandled && ev.preventDefault();\n      };\n      FocusZone2.prototype._tryInvokeClickForFocusable = function(targetElement, ev) {\n        var target2 = targetElement;\n        if (target2 === this._root.current) {\n          return false;\n        }\n        do {\n          if (target2.tagName === \"BUTTON\" || target2.tagName === \"A\" || target2.tagName === \"INPUT\" || target2.tagName === \"TEXTAREA\" || target2.tagName === \"SUMMARY\") {\n            return false;\n          }\n          if (this._isImmediateDescendantOfZone(target2) && target2.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\" && target2.getAttribute(IS_ENTER_DISABLED_ATTRIBUTE) !== \"true\") {\n            raiseClickFromKeyboardEvent(target2, ev);\n            return true;\n          }\n          target2 = getParent(target2, ALLOW_VIRTUAL_ELEMENTS);\n        } while (target2 !== this._root.current);\n        return false;\n      };\n      FocusZone2.prototype._getFirstInnerZone = function(rootElement) {\n        rootElement = rootElement || this._activeElement || this._root.current;\n        if (!rootElement) {\n          return null;\n        }\n        if (isElementFocusZone(rootElement)) {\n          return _allInstances[rootElement.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n        }\n        var child = rootElement.firstElementChild;\n        while (child) {\n          if (isElementFocusZone(child)) {\n            return _allInstances[child.getAttribute(FOCUSZONE_ID_ATTRIBUTE)];\n          }\n          var match2 = this._getFirstInnerZone(child);\n          if (match2) {\n            return match2;\n          }\n          child = child.nextElementSibling;\n        }\n        return null;\n      };\n      FocusZone2.prototype._moveFocus = function(isForward, getDistanceFromCenter, ev, useDefaultWrap) {\n        if (useDefaultWrap === void 0) {\n          useDefaultWrap = true;\n        }\n        var element2 = this._activeElement;\n        var candidateDistance = -1;\n        var candidateElement = void 0;\n        var changedFocus = false;\n        var isBidirectional = this.props.direction === FocusZoneDirection.bidirectional;\n        if (!element2 || !this._root.current) {\n          return false;\n        }\n        if (this._isElementInput(element2)) {\n          if (!this._shouldInputLoseFocus(element2, isForward)) {\n            return false;\n          }\n        }\n        var activeRect = isBidirectional ? element2.getBoundingClientRect() : null;\n        do {\n          element2 = isForward ? getNextElement(this._root.current, element2) : getPreviousElement(this._root.current, element2);\n          if (isBidirectional) {\n            if (element2) {\n              var targetRect = element2.getBoundingClientRect();\n              var elementDistance = getDistanceFromCenter(activeRect, targetRect);\n              if (elementDistance === -1 && candidateDistance === -1) {\n                candidateElement = element2;\n                break;\n              }\n              if (elementDistance > -1 && (candidateDistance === -1 || elementDistance < candidateDistance)) {\n                candidateDistance = elementDistance;\n                candidateElement = element2;\n              }\n              if (candidateDistance >= 0 && elementDistance < 0) {\n                break;\n              }\n            }\n          } else {\n            candidateElement = element2;\n            break;\n          }\n        } while (element2);\n        if (candidateElement && candidateElement !== this._activeElement) {\n          changedFocus = true;\n          this.focusElement(candidateElement);\n        } else if (this.props.isCircularNavigation && useDefaultWrap) {\n          if (isForward) {\n            return this.focusElement(getNextElement(this._root.current, this._root.current.firstElementChild, true));\n          } else {\n            return this.focusElement(getPreviousElement(this._root.current, this._root.current.lastElementChild, true, true, true));\n          }\n        }\n        return changedFocus;\n      };\n      FocusZone2.prototype._moveFocusDown = function() {\n        var _this = this;\n        var targetTop = -1;\n        var leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0;\n        if (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          this._moveFocus(true, function(activeRect, targetRect) {\n            var distance2 = -1;\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectBottom = Math.floor(activeRect.bottom);\n            if (targetRectTop < activeRectBottom) {\n              if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) {\n                return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n              }\n              return LARGE_DISTANCE_FROM_CENTER;\n            }\n            if (targetTop === -1 && targetRectTop >= activeRectBottom || targetRectTop === targetTop) {\n              targetTop = targetRectTop;\n              if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) {\n                distance2 = 0;\n              } else {\n                distance2 = Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n              }\n            }\n            return distance2;\n          })\n        ) {\n          this._setFocusAlignment(this._activeElement, false, true);\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._moveFocusUp = function() {\n        var _this = this;\n        var targetTop = -1;\n        var leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0;\n        if (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          this._moveFocus(false, function(activeRect, targetRect) {\n            var distance2 = -1;\n            var targetRectBottom = Math.floor(targetRect.bottom);\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectTop = Math.floor(activeRect.top);\n            if (targetRectBottom > activeRectTop) {\n              if (!_this._shouldWrapFocus(_this._activeElement, NO_VERTICAL_WRAP)) {\n                return LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n              }\n              return LARGE_DISTANCE_FROM_CENTER;\n            }\n            if (targetTop === -1 && targetRectBottom <= activeRectTop || targetRectTop === targetTop) {\n              targetTop = targetRectTop;\n              if (leftAlignment >= targetRect.left && leftAlignment <= targetRect.left + targetRect.width) {\n                distance2 = 0;\n              } else {\n                distance2 = Math.abs(targetRect.left + targetRect.width / 2 - leftAlignment);\n              }\n            }\n            return distance2;\n          })\n        ) {\n          this._setFocusAlignment(this._activeElement, false, true);\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._moveFocusLeft = function(theme) {\n        var _this = this;\n        var shouldWrap = this._shouldWrapFocus(this._activeElement, NO_HORIZONTAL_WRAP);\n        if (this._moveFocus(\n          getRTL(theme),\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          function(activeRect, targetRect) {\n            var distance2 = -1;\n            var topBottomComparison;\n            if (getRTL(theme)) {\n              topBottomComparison = parseFloat(targetRect.top.toFixed(3)) < parseFloat(activeRect.bottom.toFixed(3));\n            } else {\n              topBottomComparison = parseFloat(targetRect.bottom.toFixed(3)) > parseFloat(activeRect.top.toFixed(3));\n            }\n            if (topBottomComparison && targetRect.right <= activeRect.right && _this.props.direction !== FocusZoneDirection.vertical) {\n              distance2 = activeRect.right - targetRect.right;\n            } else if (!shouldWrap) {\n              distance2 = LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n            }\n            return distance2;\n          },\n          void 0,\n          shouldWrap\n        )) {\n          this._setFocusAlignment(this._activeElement, true, false);\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._moveFocusRight = function(theme) {\n        var _this = this;\n        var shouldWrap = this._shouldWrapFocus(this._activeElement, NO_HORIZONTAL_WRAP);\n        if (this._moveFocus(\n          !getRTL(theme),\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          function(activeRect, targetRect) {\n            var distance2 = -1;\n            var topBottomComparison;\n            if (getRTL(theme)) {\n              topBottomComparison = parseFloat(targetRect.bottom.toFixed(3)) > parseFloat(activeRect.top.toFixed(3));\n            } else {\n              topBottomComparison = parseFloat(targetRect.top.toFixed(3)) < parseFloat(activeRect.bottom.toFixed(3));\n            }\n            if (topBottomComparison && targetRect.left >= activeRect.left && _this.props.direction !== FocusZoneDirection.vertical) {\n              distance2 = targetRect.left - activeRect.left;\n            } else if (!shouldWrap) {\n              distance2 = LARGE_NEGATIVE_DISTANCE_FROM_CENTER;\n            }\n            return distance2;\n          },\n          void 0,\n          shouldWrap\n        )) {\n          this._setFocusAlignment(this._activeElement, true, false);\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._moveFocusPaging = function(isForward, useDefaultWrap) {\n        if (useDefaultWrap === void 0) {\n          useDefaultWrap = true;\n        }\n        var element2 = this._activeElement;\n        if (!element2 || !this._root.current) {\n          return false;\n        }\n        if (this._isElementInput(element2)) {\n          if (!this._shouldInputLoseFocus(element2, isForward)) {\n            return false;\n          }\n        }\n        var scrollableParent = findScrollableParent(element2);\n        if (!scrollableParent) {\n          return false;\n        }\n        var candidateDistance = -1;\n        var candidateElement = void 0;\n        var targetTop = -1;\n        var targetBottom = -1;\n        var pagesize = scrollableParent.clientHeight;\n        var activeRect = element2.getBoundingClientRect();\n        do {\n          element2 = isForward ? getNextElement(this._root.current, element2) : getPreviousElement(this._root.current, element2);\n          if (element2) {\n            var targetRect = element2.getBoundingClientRect();\n            var targetRectTop = Math.floor(targetRect.top);\n            var activeRectBottom = Math.floor(activeRect.bottom);\n            var targetRectBottom = Math.floor(targetRect.bottom);\n            var activeRectTop = Math.floor(activeRect.top);\n            var elementDistance = this._getHorizontalDistanceFromCenter(isForward, activeRect, targetRect);\n            var isElementPassedPageSizeOnPagingDown = isForward && targetRectTop > activeRectBottom + pagesize;\n            var isElementPassedPageSizeOnPagingUp = !isForward && targetRectBottom < activeRectTop - pagesize;\n            if (isElementPassedPageSizeOnPagingDown || isElementPassedPageSizeOnPagingUp) {\n              break;\n            }\n            if (elementDistance > -1) {\n              if (isForward && targetRectTop > targetTop) {\n                targetTop = targetRectTop;\n                candidateDistance = elementDistance;\n                candidateElement = element2;\n              } else if (!isForward && targetRectBottom < targetBottom) {\n                targetBottom = targetRectBottom;\n                candidateDistance = elementDistance;\n                candidateElement = element2;\n              } else if (candidateDistance === -1 || elementDistance <= candidateDistance) {\n                candidateDistance = elementDistance;\n                candidateElement = element2;\n              }\n            }\n          }\n        } while (element2);\n        var changedFocus = false;\n        if (candidateElement && candidateElement !== this._activeElement) {\n          changedFocus = true;\n          this.focusElement(candidateElement);\n          this._setFocusAlignment(candidateElement, false, true);\n        } else if (this.props.isCircularNavigation && useDefaultWrap) {\n          if (isForward) {\n            return this.focusElement(getNextElement(this._root.current, this._root.current.firstElementChild, true));\n          }\n          return this.focusElement(getPreviousElement(this._root.current, this._root.current.lastElementChild, true, true, true));\n        }\n        return changedFocus;\n      };\n      FocusZone2.prototype._setFocusAlignment = function(element2, isHorizontal, isVertical) {\n        if (this.props.direction === FocusZoneDirection.bidirectional && (!this._focusAlignment || isHorizontal || isVertical)) {\n          var rect2 = element2.getBoundingClientRect();\n          var left = rect2.left + rect2.width / 2;\n          var top_1 = rect2.top + rect2.height / 2;\n          if (!this._focusAlignment) {\n            this._focusAlignment = { left, top: top_1 };\n          }\n          if (isHorizontal) {\n            this._focusAlignment.left = left;\n          }\n          if (isVertical) {\n            this._focusAlignment.top = top_1;\n          }\n        }\n      };\n      FocusZone2.prototype._isImmediateDescendantOfZone = function(element2) {\n        return this._getOwnerZone(element2) === this._root.current;\n      };\n      FocusZone2.prototype._getOwnerZone = function(element2) {\n        var parentElement = getParent(element2, ALLOW_VIRTUAL_ELEMENTS);\n        while (parentElement && parentElement !== this._root.current && parentElement !== this._getDocument().body) {\n          if (isElementFocusZone(parentElement)) {\n            return parentElement;\n          }\n          parentElement = getParent(parentElement, ALLOW_VIRTUAL_ELEMENTS);\n        }\n        return parentElement;\n      };\n      FocusZone2.prototype._updateTabIndexes = function(element2) {\n        if (!this._activeElement && this.props.defaultTabbableElement && typeof this.props.defaultTabbableElement === \"function\") {\n          this._activeElement = this.props.defaultTabbableElement(this._root.current);\n        }\n        if (!element2 && this._root.current) {\n          this._defaultFocusElement = null;\n          element2 = this._root.current;\n          if (this._activeElement && !elementContains(element2, this._activeElement)) {\n            this._activeElement = null;\n          }\n        }\n        if (this._activeElement && !isElementTabbable(this._activeElement, void 0, this._inShadowRoot)) {\n          this._activeElement = null;\n        }\n        var childNodes = element2 && element2.children;\n        for (var childIndex = 0; childNodes && childIndex < childNodes.length; childIndex++) {\n          var child = childNodes[childIndex];\n          if (!isElementFocusZone(child)) {\n            if (child.getAttribute && child.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"false\") {\n              child.setAttribute(TABINDEX, \"-1\");\n            }\n            if (isElementTabbable(child, void 0, this._inShadowRoot)) {\n              if (this.props.disabled) {\n                child.setAttribute(TABINDEX, \"-1\");\n              } else if (!this._isInnerZone && (!this._activeElement && !this._defaultFocusElement || this._activeElement === child)) {\n                this._defaultFocusElement = child;\n                if (child.getAttribute(TABINDEX) !== \"0\") {\n                  child.setAttribute(TABINDEX, \"0\");\n                }\n              } else if (child.getAttribute(TABINDEX) !== \"-1\") {\n                child.setAttribute(TABINDEX, \"-1\");\n              }\n            } else if (child.tagName === \"svg\" && child.getAttribute(\"focusable\") !== \"false\") {\n              child.setAttribute(\"focusable\", \"false\");\n            }\n          } else if (child.getAttribute(IS_FOCUSABLE_ATTRIBUTE) === \"true\") {\n            if (!this._isInnerZone && (!this._activeElement && !this._defaultFocusElement || this._activeElement === child)) {\n              this._defaultFocusElement = child;\n              if (child.getAttribute(TABINDEX) !== \"0\") {\n                child.setAttribute(TABINDEX, \"0\");\n              }\n            } else if (child.getAttribute(TABINDEX) !== \"-1\") {\n              child.setAttribute(TABINDEX, \"-1\");\n            }\n          }\n          this._updateTabIndexes(child);\n        }\n      };\n      FocusZone2.prototype._isContentEditableElement = function(element2) {\n        return element2 && element2.getAttribute(\"contenteditable\") === \"true\";\n      };\n      FocusZone2.prototype._isElementInput = function(element2) {\n        if (element2 && element2.tagName && (element2.tagName.toLowerCase() === \"input\" || element2.tagName.toLowerCase() === \"textarea\")) {\n          return true;\n        }\n        return false;\n      };\n      FocusZone2.prototype._shouldInputLoseFocus = function(element2, isForward) {\n        if (!this._processingTabKey && element2 && element2.type && ALLOWED_INPUT_TYPES.indexOf(element2.type.toLowerCase()) > -1) {\n          var selectionStart = element2.selectionStart;\n          var selectionEnd = element2.selectionEnd;\n          var isRangeSelected = selectionStart !== selectionEnd;\n          var inputValue = element2.value;\n          var isReadonly = element2.readOnly;\n          if (isRangeSelected || selectionStart > 0 && !isForward && !isReadonly || selectionStart !== inputValue.length && isForward && !isReadonly || !!this.props.handleTabKey && !(this.props.shouldInputLoseFocusOnArrowKey && this.props.shouldInputLoseFocusOnArrowKey(element2))) {\n            return false;\n          }\n        }\n        return true;\n      };\n      FocusZone2.prototype._shouldWrapFocus = function(element2, noWrapDataAttribute) {\n        return this.props.checkForNoWrap ? shouldWrapFocus(element2, noWrapDataAttribute) : true;\n      };\n      FocusZone2.prototype._portalContainsElement = function(element2) {\n        return element2 && !!this._root.current && portalContainsElement(element2, this._root.current);\n      };\n      FocusZone2.prototype._getDocument = function() {\n        return getDocument(this._root.current);\n      };\n      FocusZone2.defaultProps = {\n        isCircularNavigation: false,\n        direction: FocusZoneDirection.bidirectional,\n        shouldRaiseClicks: true,\n        // Hardcoding uncontrolled flag for proper interop with FluentUI V9.\n        \"data-tabster\": '{\"uncontrolled\": {}}'\n      };\n      FocusZone2.contextType = MergeStylesShadowRootContext;\n      return FocusZone2;\n    })(React__namespace.Component)\n  );\n  function getIsChecked(item) {\n    if (item.canCheck) {\n      return !!(item.isChecked || item.checked);\n    }\n    if (typeof item.isChecked === \"boolean\") {\n      return item.isChecked;\n    }\n    if (typeof item.checked === \"boolean\") {\n      return item.checked;\n    }\n    return null;\n  }\n  function hasSubmenu(item) {\n    return !!(item.subMenuProps || item.items);\n  }\n  function isItemDisabled(item) {\n    return !!(item.isDisabled || item.disabled);\n  }\n  function getMenuItemAriaRole(item) {\n    var isChecked = getIsChecked(item);\n    var canCheck = isChecked !== null;\n    return canCheck ? \"menuitemcheckbox\" : \"menuitem\";\n  }\n  var RectangleEdge;\n  (function(RectangleEdge2) {\n    RectangleEdge2[RectangleEdge2[\"top\"] = 1] = \"top\";\n    RectangleEdge2[RectangleEdge2[\"bottom\"] = -1] = \"bottom\";\n    RectangleEdge2[RectangleEdge2[\"left\"] = 2] = \"left\";\n    RectangleEdge2[RectangleEdge2[\"right\"] = -2] = \"right\";\n  })(RectangleEdge || (RectangleEdge = {}));\n  var Position;\n  (function(Position2) {\n    Position2[Position2[\"top\"] = 0] = \"top\";\n    Position2[Position2[\"bottom\"] = 1] = \"bottom\";\n    Position2[Position2[\"start\"] = 2] = \"start\";\n    Position2[Position2[\"end\"] = 3] = \"end\";\n  })(Position || (Position = {}));\n  var _a$4;\n  function _createPositionData(targetEdge, alignmentEdge, isAuto) {\n    return {\n      targetEdge,\n      alignmentEdge,\n      isAuto\n    };\n  }\n  var DirectionalDictionary = (_a$4 = {}, _a$4[DirectionalHint.topLeftEdge] = _createPositionData(RectangleEdge.top, RectangleEdge.left), _a$4[DirectionalHint.topCenter] = _createPositionData(RectangleEdge.top), _a$4[DirectionalHint.topRightEdge] = _createPositionData(RectangleEdge.top, RectangleEdge.right), _a$4[DirectionalHint.topAutoEdge] = _createPositionData(RectangleEdge.top, void 0, true), _a$4[DirectionalHint.bottomLeftEdge] = _createPositionData(RectangleEdge.bottom, RectangleEdge.left), _a$4[DirectionalHint.bottomCenter] = _createPositionData(RectangleEdge.bottom), _a$4[DirectionalHint.bottomRightEdge] = _createPositionData(RectangleEdge.bottom, RectangleEdge.right), _a$4[DirectionalHint.bottomAutoEdge] = _createPositionData(RectangleEdge.bottom, void 0, true), _a$4[DirectionalHint.leftTopEdge] = _createPositionData(RectangleEdge.left, RectangleEdge.top), _a$4[DirectionalHint.leftCenter] = _createPositionData(RectangleEdge.left), _a$4[DirectionalHint.leftBottomEdge] = _createPositionData(RectangleEdge.left, RectangleEdge.bottom), _a$4[DirectionalHint.rightTopEdge] = _createPositionData(RectangleEdge.right, RectangleEdge.top), _a$4[DirectionalHint.rightCenter] = _createPositionData(RectangleEdge.right), _a$4[DirectionalHint.rightBottomEdge] = _createPositionData(RectangleEdge.right, RectangleEdge.bottom), _a$4);\n  function _isRectangleWithinBounds(rect2, boundingRect) {\n    if (rect2.top < boundingRect.top) {\n      return false;\n    }\n    if (rect2.bottom > boundingRect.bottom) {\n      return false;\n    }\n    if (rect2.left < boundingRect.left) {\n      return false;\n    }\n    if (rect2.right > boundingRect.right) {\n      return false;\n    }\n    return true;\n  }\n  function _getOutOfBoundsEdges(rect2, boundingRect) {\n    var outOfBounds2 = [];\n    if (rect2.top < boundingRect.top) {\n      outOfBounds2.push(RectangleEdge.top);\n    }\n    if (rect2.bottom > boundingRect.bottom) {\n      outOfBounds2.push(RectangleEdge.bottom);\n    }\n    if (rect2.left < boundingRect.left) {\n      outOfBounds2.push(RectangleEdge.left);\n    }\n    if (rect2.right > boundingRect.right) {\n      outOfBounds2.push(RectangleEdge.right);\n    }\n    return outOfBounds2;\n  }\n  function _getEdgeValue(rect2, edge) {\n    return rect2[RectangleEdge[edge]];\n  }\n  function _setEdgeValue(rect2, edge, value2) {\n    rect2[RectangleEdge[edge]] = value2;\n    return rect2;\n  }\n  function _getCenterValue(rect2, edge) {\n    var edges = _getFlankingEdges(edge);\n    return (_getEdgeValue(rect2, edges.positiveEdge) + _getEdgeValue(rect2, edges.negativeEdge)) / 2;\n  }\n  function _getRelativeEdgeValue(edge, value2) {\n    if (edge > 0) {\n      return value2;\n    } else {\n      return value2 * -1;\n    }\n  }\n  function _getRelativeRectEdgeValue(edge, rect2) {\n    return _getRelativeEdgeValue(edge, _getEdgeValue(rect2, edge));\n  }\n  function _getRelativeEdgeDifference(rect2, hostRect, edge) {\n    var edgeDifference = _getEdgeValue(rect2, edge) - _getEdgeValue(hostRect, edge);\n    return _getRelativeEdgeValue(edge, edgeDifference);\n  }\n  function _moveEdge(rect2, edge, newValue, maintainSize) {\n    if (maintainSize === void 0) {\n      maintainSize = true;\n    }\n    var difference = _getEdgeValue(rect2, edge) - newValue;\n    var returnRect = _setEdgeValue(rect2, edge, newValue);\n    if (maintainSize) {\n      returnRect = _setEdgeValue(rect2, edge * -1, _getEdgeValue(rect2, edge * -1) - difference);\n    }\n    return returnRect;\n  }\n  function _alignEdges(rect2, target2, edge, gap) {\n    if (gap === void 0) {\n      gap = 0;\n    }\n    return _moveEdge(rect2, edge, _getEdgeValue(target2, edge) + _getRelativeEdgeValue(edge, gap));\n  }\n  function _alignOppositeEdges(rect2, target2, targetEdge, gap) {\n    if (gap === void 0) {\n      gap = 0;\n    }\n    var oppositeEdge = targetEdge * -1;\n    var adjustedGap = _getRelativeEdgeValue(oppositeEdge, gap);\n    return _moveEdge(rect2, targetEdge * -1, _getEdgeValue(target2, targetEdge) + adjustedGap);\n  }\n  function _isEdgeInBounds(rect2, bounds2, edge) {\n    var adjustedRectValue = _getRelativeRectEdgeValue(edge, rect2);\n    return adjustedRectValue > _getRelativeRectEdgeValue(edge, bounds2);\n  }\n  function _getOutOfBoundsDegree(rect2, bounds2) {\n    var breakingEdges = _getOutOfBoundsEdges(rect2, bounds2);\n    var total = 0;\n    for (var _i = 0, breakingEdges_1 = breakingEdges; _i < breakingEdges_1.length; _i++) {\n      var edge = breakingEdges_1[_i];\n      total += Math.pow(_getRelativeEdgeDifference(rect2, bounds2, edge), 2);\n    }\n    return total;\n  }\n  function _canScrollResizeToFitEdge(target2, bounding, targetEdge, minimumScrollResizeHeight) {\n    if (minimumScrollResizeHeight === void 0) {\n      minimumScrollResizeHeight = 200;\n    }\n    if (targetEdge !== RectangleEdge.bottom && targetEdge !== RectangleEdge.top) {\n      return false;\n    }\n    return _getRelativeEdgeDifference(target2, bounding, targetEdge) >= minimumScrollResizeHeight;\n  }\n  function _flipToFit(rect2, target2, bounding, positionData, shouldScroll, minimumScrollResizeHeight, gap) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    if (gap === void 0) {\n      gap = 0;\n    }\n    var directions = [\n      RectangleEdge.left,\n      RectangleEdge.right,\n      RectangleEdge.bottom,\n      RectangleEdge.top\n    ];\n    if (getRTL()) {\n      directions[0] *= -1;\n      directions[1] *= -1;\n    }\n    var currentEstimate = rect2;\n    var currentEdge = positionData.targetEdge;\n    var currentAlignment = positionData.alignmentEdge;\n    var oobDegree;\n    var bestEdge = currentEdge;\n    var bestAlignment = currentAlignment;\n    for (var i = 0; i < 4; i++) {\n      if (_isEdgeInBounds(currentEstimate, bounding, currentEdge)) {\n        return {\n          elementRectangle: currentEstimate,\n          targetEdge: currentEdge,\n          alignmentEdge: currentAlignment\n        };\n      } else if (shouldScroll && _canScrollResizeToFitEdge(target2, bounding, currentEdge, minimumScrollResizeHeight)) {\n        switch (currentEdge) {\n          case RectangleEdge.bottom:\n            currentEstimate.bottom = bounding.bottom;\n            break;\n          case RectangleEdge.top:\n            currentEstimate.top = bounding.top;\n            break;\n        }\n        return {\n          elementRectangle: currentEstimate,\n          targetEdge: currentEdge,\n          alignmentEdge: currentAlignment,\n          forcedInBounds: true\n        };\n      } else {\n        var currentOOBDegree = _getOutOfBoundsDegree(currentEstimate, bounding);\n        if (!oobDegree || currentOOBDegree < oobDegree) {\n          oobDegree = currentOOBDegree;\n          bestEdge = currentEdge;\n          bestAlignment = currentAlignment;\n        }\n        directions.splice(directions.indexOf(currentEdge), 1);\n        if (directions.length > 0) {\n          if (directions.indexOf(currentEdge * -1) > -1) {\n            currentEdge = currentEdge * -1;\n          } else {\n            currentAlignment = currentEdge;\n            currentEdge = directions.slice(-1)[0];\n          }\n          currentEstimate = _estimatePosition(rect2, target2, { targetEdge: currentEdge, alignmentEdge: currentAlignment }, gap);\n        }\n      }\n    }\n    currentEstimate = _estimatePosition(rect2, target2, { targetEdge: bestEdge, alignmentEdge: bestAlignment }, gap);\n    return {\n      elementRectangle: currentEstimate,\n      targetEdge: bestEdge,\n      alignmentEdge: bestAlignment\n    };\n  }\n  function _flipAlignmentEdge(elementEstimate, target2, gap, coverTarget) {\n    var alignmentEdge = elementEstimate.alignmentEdge, targetEdge = elementEstimate.targetEdge, elementRectangle = elementEstimate.elementRectangle;\n    var oppositeEdge = alignmentEdge * -1;\n    var newEstimate = _estimatePosition(elementRectangle, target2, { targetEdge, alignmentEdge: oppositeEdge }, gap, coverTarget);\n    return {\n      elementRectangle: newEstimate,\n      targetEdge,\n      alignmentEdge: oppositeEdge\n    };\n  }\n  function _adjustFitWithinBounds(element2, target2, bounding, positionData, shouldScroll, minimumScrollResizeHeight, gap, directionalHintFixed, coverTarget) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    if (gap === void 0) {\n      gap = 0;\n    }\n    var alignmentEdge = positionData.alignmentEdge, alignTargetEdge = positionData.alignTargetEdge;\n    var elementEstimate = {\n      elementRectangle: element2,\n      targetEdge: positionData.targetEdge,\n      alignmentEdge\n    };\n    if (!directionalHintFixed && !coverTarget) {\n      elementEstimate = _flipToFit(element2, target2, bounding, positionData, shouldScroll, minimumScrollResizeHeight, gap);\n    }\n    var outOfBounds2 = _getOutOfBoundsEdges(elementEstimate.elementRectangle, bounding);\n    var fixedEdge = directionalHintFixed ? -elementEstimate.targetEdge : void 0;\n    if (outOfBounds2.length > 0) {\n      if (alignTargetEdge) {\n        if (elementEstimate.alignmentEdge && outOfBounds2.indexOf(elementEstimate.alignmentEdge * -1) > -1) {\n          var flippedElementEstimate = _flipAlignmentEdge(elementEstimate, target2, gap, coverTarget);\n          if (_isRectangleWithinBounds(flippedElementEstimate.elementRectangle, bounding)) {\n            return flippedElementEstimate;\n          } else {\n            elementEstimate = _alignOutOfBoundsEdges(_getOutOfBoundsEdges(flippedElementEstimate.elementRectangle, bounding), elementEstimate, bounding, fixedEdge);\n          }\n        } else {\n          elementEstimate = _alignOutOfBoundsEdges(outOfBounds2, elementEstimate, bounding, fixedEdge);\n        }\n      } else {\n        elementEstimate = _alignOutOfBoundsEdges(outOfBounds2, elementEstimate, bounding, fixedEdge);\n      }\n    }\n    return elementEstimate;\n  }\n  function _alignOutOfBoundsEdges(outOfBoundsEdges, elementEstimate, bounding, preserveEdge) {\n    for (var _i = 0, outOfBoundsEdges_1 = outOfBoundsEdges; _i < outOfBoundsEdges_1.length; _i++) {\n      var direction = outOfBoundsEdges_1[_i];\n      var edgeAttempt = void 0;\n      if (preserveEdge && preserveEdge === direction * -1) {\n        edgeAttempt = _moveEdge(elementEstimate.elementRectangle, direction, _getEdgeValue(bounding, direction), false);\n        elementEstimate.forcedInBounds = true;\n      } else {\n        edgeAttempt = _alignEdges(elementEstimate.elementRectangle, bounding, direction);\n        var inBounds = _isEdgeInBounds(edgeAttempt, bounding, direction * -1);\n        if (!inBounds) {\n          edgeAttempt = _moveEdge(edgeAttempt, direction * -1, _getEdgeValue(bounding, direction * -1), false);\n          elementEstimate.forcedInBounds = true;\n        }\n      }\n      elementEstimate.elementRectangle = edgeAttempt;\n    }\n    return elementEstimate;\n  }\n  function _centerEdgeToPoint(rect2, edge, point2) {\n    var positiveEdge = _getFlankingEdges(edge).positiveEdge;\n    var elementMiddle = _getCenterValue(rect2, edge);\n    var distanceToMiddle = elementMiddle - _getEdgeValue(rect2, positiveEdge);\n    return _moveEdge(rect2, positiveEdge, point2 - distanceToMiddle);\n  }\n  function _estimatePosition(elementToPosition, target2, positionData, gap, coverTarget) {\n    if (gap === void 0) {\n      gap = 0;\n    }\n    var estimatedElementPosition = new Rectangle(elementToPosition.left, elementToPosition.right, elementToPosition.top, elementToPosition.bottom);\n    var alignmentEdge = positionData.alignmentEdge, targetEdge = positionData.targetEdge;\n    var elementEdge = coverTarget ? targetEdge : targetEdge * -1;\n    estimatedElementPosition = coverTarget ? _alignEdges(estimatedElementPosition, target2, targetEdge, gap) : _alignOppositeEdges(estimatedElementPosition, target2, targetEdge, gap);\n    if (!alignmentEdge) {\n      var targetMiddlePoint = _getCenterValue(target2, targetEdge);\n      estimatedElementPosition = _centerEdgeToPoint(estimatedElementPosition, elementEdge, targetMiddlePoint);\n    } else {\n      estimatedElementPosition = _alignEdges(estimatedElementPosition, target2, alignmentEdge);\n    }\n    return estimatedElementPosition;\n  }\n  function _getFlankingEdges(edge) {\n    if (edge === RectangleEdge.top || edge === RectangleEdge.bottom) {\n      return {\n        positiveEdge: RectangleEdge.left,\n        negativeEdge: RectangleEdge.right\n      };\n    } else {\n      return {\n        positiveEdge: RectangleEdge.top,\n        negativeEdge: RectangleEdge.bottom\n      };\n    }\n  }\n  function _finalizeReturnEdge(elementRectangle, returnEdge, bounds2) {\n    if (bounds2 && Math.abs(_getRelativeEdgeDifference(elementRectangle, bounds2, returnEdge)) > Math.abs(_getRelativeEdgeDifference(elementRectangle, bounds2, returnEdge * -1))) {\n      return returnEdge * -1;\n    }\n    return returnEdge;\n  }\n  function _isEdgeOnBounds(elementRectangle, edge, bounds2) {\n    return bounds2 !== void 0 && _getEdgeValue(elementRectangle, edge) === _getEdgeValue(bounds2, edge);\n  }\n  function _finalizeElementPosition(elementRectangle, hostElement, targetEdge, bounds2, alignmentEdge, coverTarget, doNotFinalizeReturnEdge, forceWithinBounds) {\n    var returnValue = {};\n    var hostRect = _getRectangleFromElement(hostElement);\n    var elementEdge = coverTarget ? targetEdge : targetEdge * -1;\n    var returnEdge = alignmentEdge ? alignmentEdge : _getFlankingEdges(targetEdge).positiveEdge;\n    if (!doNotFinalizeReturnEdge || _isEdgeOnBounds(elementRectangle, getOppositeEdge(returnEdge), bounds2)) {\n      returnEdge = _finalizeReturnEdge(elementRectangle, returnEdge, bounds2);\n    }\n    returnValue[RectangleEdge[elementEdge]] = _getRelativeEdgeDifference(elementRectangle, hostRect, elementEdge);\n    returnValue[RectangleEdge[returnEdge]] = _getRelativeEdgeDifference(elementRectangle, hostRect, returnEdge);\n    if (forceWithinBounds) {\n      returnValue[RectangleEdge[elementEdge * -1]] = _getRelativeEdgeDifference(elementRectangle, hostRect, elementEdge * -1);\n      returnValue[RectangleEdge[returnEdge * -1]] = _getRelativeEdgeDifference(elementRectangle, hostRect, returnEdge * -1);\n    }\n    return returnValue;\n  }\n  function _calculateActualBeakWidthInPixels(beakWidth) {\n    return Math.sqrt(beakWidth * beakWidth * 2);\n  }\n  function _getPositionData(directionalHint, directionalHintForRTL, previousPositions) {\n    if (directionalHint === void 0) {\n      directionalHint = DirectionalHint.bottomAutoEdge;\n    }\n    if (previousPositions) {\n      return {\n        alignmentEdge: previousPositions.alignmentEdge,\n        isAuto: previousPositions.isAuto,\n        targetEdge: previousPositions.targetEdge\n      };\n    }\n    var positionInformation = __assign$1({}, DirectionalDictionary[directionalHint]);\n    if (getRTL()) {\n      if (positionInformation.alignmentEdge && positionInformation.alignmentEdge % 2 === 0) {\n        positionInformation.alignmentEdge = positionInformation.alignmentEdge * -1;\n      }\n      return directionalHintForRTL !== void 0 ? DirectionalDictionary[directionalHintForRTL] : positionInformation;\n    }\n    return positionInformation;\n  }\n  function _getAlignmentData(positionData, target2, boundingRect, coverTarget, alignTargetEdge) {\n    if (positionData.isAuto) {\n      positionData.alignmentEdge = getClosestEdge(positionData.targetEdge, target2, boundingRect);\n    }\n    positionData.alignTargetEdge = alignTargetEdge;\n    return positionData;\n  }\n  function getClosestEdge(targetEdge, target2, boundingRect) {\n    var targetCenter = _getCenterValue(target2, targetEdge);\n    var boundingCenter = _getCenterValue(boundingRect, targetEdge);\n    var _a2 = _getFlankingEdges(targetEdge), positiveEdge = _a2.positiveEdge, negativeEdge = _a2.negativeEdge;\n    if (targetCenter <= boundingCenter) {\n      return positiveEdge;\n    } else {\n      return negativeEdge;\n    }\n  }\n  function _positionElementWithinBounds(elementToPosition, target2, bounding, positionData, gap, shouldScroll, minimumScrollResizeHeight, directionalHintFixed, coverTarget) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    var estimatedElementPosition = _estimatePosition(elementToPosition, target2, positionData, gap, coverTarget);\n    if (_isRectangleWithinBounds(estimatedElementPosition, bounding)) {\n      return {\n        elementRectangle: estimatedElementPosition,\n        targetEdge: positionData.targetEdge,\n        alignmentEdge: positionData.alignmentEdge\n      };\n    } else {\n      return _adjustFitWithinBounds(estimatedElementPosition, target2, bounding, positionData, shouldScroll, minimumScrollResizeHeight, gap, directionalHintFixed, coverTarget);\n    }\n  }\n  function _finalizeBeakPosition(elementPosition, positionedBeak, bounds2) {\n    var targetEdge = elementPosition.targetEdge * -1;\n    var actualElement = new Rectangle(0, elementPosition.elementRectangle.width, 0, elementPosition.elementRectangle.height);\n    var returnValue = {};\n    var returnEdge = _finalizeReturnEdge(elementPosition.elementRectangle, elementPosition.alignmentEdge ? elementPosition.alignmentEdge : _getFlankingEdges(targetEdge).positiveEdge, bounds2);\n    var beakEdgeDifference = _getRelativeEdgeDifference(elementPosition.elementRectangle, elementPosition.targetRectangle, targetEdge);\n    var showBeak = beakEdgeDifference > Math.abs(_getEdgeValue(positionedBeak, targetEdge));\n    returnValue[RectangleEdge[targetEdge]] = _getEdgeValue(positionedBeak, targetEdge);\n    returnValue[RectangleEdge[returnEdge]] = _getRelativeEdgeDifference(positionedBeak, actualElement, returnEdge);\n    return {\n      elementPosition: __assign$1({}, returnValue),\n      closestEdge: getClosestEdge(elementPosition.targetEdge, positionedBeak, actualElement),\n      targetEdge,\n      hideBeak: !showBeak\n    };\n  }\n  function _positionBeak(beakWidth, elementPosition) {\n    var target2 = elementPosition.targetRectangle;\n    var _a2 = _getFlankingEdges(elementPosition.targetEdge), positiveEdge = _a2.positiveEdge, negativeEdge = _a2.negativeEdge;\n    var beakTargetPoint = _getCenterValue(target2, elementPosition.targetEdge);\n    var elementBounds = new Rectangle(beakWidth / 2, elementPosition.elementRectangle.width - beakWidth / 2, beakWidth / 2, elementPosition.elementRectangle.height - beakWidth / 2);\n    var beakPosition = new Rectangle(0, beakWidth, 0, beakWidth);\n    beakPosition = _moveEdge(beakPosition, elementPosition.targetEdge * -1, -beakWidth / 2);\n    beakPosition = _centerEdgeToPoint(beakPosition, elementPosition.targetEdge * -1, beakTargetPoint - _getRelativeRectEdgeValue(positiveEdge, elementPosition.elementRectangle));\n    if (!_isEdgeInBounds(beakPosition, elementBounds, positiveEdge)) {\n      beakPosition = _alignEdges(beakPosition, elementBounds, positiveEdge);\n    } else if (!_isEdgeInBounds(beakPosition, elementBounds, negativeEdge)) {\n      beakPosition = _alignEdges(beakPosition, elementBounds, negativeEdge);\n    }\n    return beakPosition;\n  }\n  function _getRectangleFromElement(element2) {\n    var clientRect = element2.getBoundingClientRect();\n    return new Rectangle(clientRect.left, clientRect.right, clientRect.top, clientRect.bottom);\n  }\n  function _getRectangleFromIRect(rect2) {\n    return new Rectangle(rect2.left, rect2.right, rect2.top, rect2.bottom);\n  }\n  function _getTargetRect(bounds2, target2) {\n    var targetRectangle;\n    if (target2) {\n      if (!!target2.preventDefault) {\n        var ev = target2;\n        targetRectangle = new Rectangle(ev.clientX, ev.clientX, ev.clientY, ev.clientY);\n      } else if (!!target2.getBoundingClientRect) {\n        targetRectangle = _getRectangleFromElement(target2);\n      } else {\n        var rectOrPoint = target2;\n        var left = rectOrPoint.left || rectOrPoint.x;\n        var top_1 = rectOrPoint.top || rectOrPoint.y;\n        var right = rectOrPoint.right || left;\n        var bottom = rectOrPoint.bottom || top_1;\n        targetRectangle = new Rectangle(left, right, top_1, bottom);\n      }\n      if (!_isRectangleWithinBounds(targetRectangle, bounds2)) {\n        var outOfBounds2 = _getOutOfBoundsEdges(targetRectangle, bounds2);\n        for (var _i = 0, outOfBounds_1 = outOfBounds2; _i < outOfBounds_1.length; _i++) {\n          var direction = outOfBounds_1[_i];\n          targetRectangle[RectangleEdge[direction]] = bounds2[RectangleEdge[direction]];\n        }\n      }\n    } else {\n      targetRectangle = new Rectangle(0, 0, 0, 0);\n    }\n    return targetRectangle;\n  }\n  function _positionElementRelative(props, elementToPosition, boundingRect, previousPositions, shouldScroll, minimumScrollResizeHeight) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    var gap = props.gapSpace ? props.gapSpace : 0;\n    var targetRect = _getTargetRect(boundingRect, props.target);\n    var positionData = _getAlignmentData(_getPositionData(props.directionalHint, props.directionalHintForRTL, previousPositions), targetRect, boundingRect, props.coverTarget, props.alignTargetEdge);\n    var positionedElement = _positionElementWithinBounds(_getRectangleFromElement(elementToPosition), targetRect, boundingRect, positionData, gap, shouldScroll, minimumScrollResizeHeight, props.directionalHintFixed, props.coverTarget);\n    return __assign$1(__assign$1({}, positionedElement), { targetRectangle: targetRect });\n  }\n  function _finalizePositionData(positionedElement, hostElement, bounds2, coverTarget, doNotFinalizeReturnEdge) {\n    var finalizedElement = _finalizeElementPosition(positionedElement.elementRectangle, hostElement, positionedElement.targetEdge, bounds2, positionedElement.alignmentEdge, coverTarget, doNotFinalizeReturnEdge, positionedElement.forcedInBounds);\n    return {\n      elementPosition: finalizedElement,\n      targetEdge: positionedElement.targetEdge,\n      alignmentEdge: positionedElement.alignmentEdge\n    };\n  }\n  function _calculateGapSpace(isBeakVisible, beakWidth, gapSpace) {\n    if (beakWidth === void 0) {\n      beakWidth = 0;\n    }\n    if (gapSpace === void 0) {\n      gapSpace = 0;\n    }\n    return _calculateActualBeakWidthInPixels(isBeakVisible ? beakWidth : 0) / 2 + gapSpace;\n  }\n  function _positionCallout(props, hostElement, callout, previousPositions, shouldScroll, minimumScrollResizeHeight, doNotFinalizeReturnEdge, win) {\n    if (shouldScroll === void 0) {\n      shouldScroll = false;\n    }\n    var theWin = win !== null && win !== void 0 ? win : getWindow();\n    var beakWidth = props.isBeakVisible ? props.beakWidth || 0 : 0;\n    var gap = _calculateGapSpace(props.isBeakVisible, props.beakWidth, props.gapSpace);\n    var positionProps = props;\n    positionProps.gapSpace = gap;\n    var boundingRect = props.bounds ? _getRectangleFromIRect(props.bounds) : new Rectangle(0, theWin.innerWidth - getScrollbarWidth(), 0, theWin.innerHeight);\n    var positionedElement = _positionElementRelative(positionProps, callout, boundingRect, previousPositions, shouldScroll, minimumScrollResizeHeight);\n    var beakPositioned = _positionBeak(beakWidth, positionedElement);\n    var finalizedBeakPosition = _finalizeBeakPosition(positionedElement, beakPositioned, boundingRect);\n    return __assign$1(__assign$1({}, _finalizePositionData(positionedElement, hostElement, boundingRect, props.coverTarget, doNotFinalizeReturnEdge)), { beakPosition: finalizedBeakPosition });\n  }\n  function _positionCard(props, hostElement, callout, previousPositions, win) {\n    var theWin = win !== null && win !== void 0 ? win : getWindow();\n    return _positionCallout(props, hostElement, callout, previousPositions, false, void 0, true, theWin);\n  }\n  function _getRectangleFromTarget(target2) {\n    var _a2, _b2, _c2, _d2;\n    var mouseTarget = target2;\n    var elementTarget = target2;\n    var rectOrPointTarget = target2;\n    var targetRect;\n    var left = (_a2 = rectOrPointTarget.left) !== null && _a2 !== void 0 ? _a2 : rectOrPointTarget.x;\n    var top = (_b2 = rectOrPointTarget.top) !== null && _b2 !== void 0 ? _b2 : rectOrPointTarget.y;\n    var right = (_c2 = rectOrPointTarget.right) !== null && _c2 !== void 0 ? _c2 : left;\n    var bottom = (_d2 = rectOrPointTarget.bottom) !== null && _d2 !== void 0 ? _d2 : top;\n    if (!!mouseTarget.stopPropagation) {\n      targetRect = new Rectangle(mouseTarget.clientX, mouseTarget.clientX, mouseTarget.clientY, mouseTarget.clientY);\n    } else if (left !== void 0 && top !== void 0) {\n      targetRect = new Rectangle(left, right, top, bottom);\n    } else {\n      targetRect = _getRectangleFromElement(elementTarget);\n    }\n    return targetRect;\n  }\n  function positionCallout(props, hostElement, elementToPosition, previousPositions, shouldScroll, minimumScrollResizeHeight, win) {\n    return _positionCallout(props, hostElement, elementToPosition, previousPositions, shouldScroll, minimumScrollResizeHeight, void 0, win);\n  }\n  function positionCard(props, hostElement, elementToPosition, previousPositions, win) {\n    return _positionCard(props, hostElement, elementToPosition, previousPositions, win);\n  }\n  function getOppositeEdge(edge) {\n    return edge * -1;\n  }\n  function _getBoundsFromTargetWindow(target2, targetWindow) {\n    var segments2 = void 0;\n    if (targetWindow.getWindowSegments) {\n      segments2 = targetWindow.getWindowSegments();\n    }\n    if (segments2 === void 0 || segments2.length <= 1) {\n      return {\n        top: 0,\n        left: 0,\n        right: targetWindow.innerWidth,\n        bottom: targetWindow.innerHeight,\n        width: targetWindow.innerWidth,\n        height: targetWindow.innerHeight\n      };\n    }\n    var x2 = 0;\n    var y2 = 0;\n    if (target2 !== null && !!target2.getBoundingClientRect) {\n      var clientRect = target2.getBoundingClientRect();\n      x2 = (clientRect.left + clientRect.right) / 2;\n      y2 = (clientRect.top + clientRect.bottom) / 2;\n    } else if (target2 !== null) {\n      x2 = target2.left || target2.x;\n      y2 = target2.top || target2.y;\n    }\n    var bounds2 = { top: 0, left: 0, right: 0, bottom: 0, width: 0, height: 0 };\n    for (var _i = 0, segments_1 = segments2; _i < segments_1.length; _i++) {\n      var segment = segments_1[_i];\n      if (x2 && segment.left <= x2 && segment.right >= x2 && y2 && segment.top <= y2 && segment.bottom >= y2) {\n        bounds2 = {\n          top: segment.top,\n          left: segment.left,\n          right: segment.right,\n          bottom: segment.bottom,\n          width: segment.width,\n          height: segment.height\n        };\n      }\n    }\n    return bounds2;\n  }\n  function getBoundsFromTargetWindow(target2, targetWindow) {\n    return _getBoundsFromTargetWindow(target2, targetWindow);\n  }\n  function calculateGapSpace(isBeakVisible, beakWidth, gapSpace) {\n    return _calculateGapSpace(isBeakVisible, beakWidth, gapSpace);\n  }\n  function getRectangleFromTarget(target2) {\n    return _getRectangleFromTarget(target2);\n  }\n  function useScrollbarAsync(props, root) {\n    var async = useAsync();\n    var _a2 = React__namespace.useState(false), needsVerticalScrollBarState = _a2[0], setNeedsVerticalScrollBar = _a2[1];\n    React__namespace.useEffect(function() {\n      async.requestAnimationFrame(function() {\n        var _a3;\n        if (props.style && props.style.overflowY) {\n          return;\n        }\n        var needsVerticalScrollBar = false;\n        if (root && root.current && ((_a3 = root.current) === null || _a3 === void 0 ? void 0 : _a3.firstElementChild)) {\n          var rootHeight = root.current.clientHeight;\n          var firstChildHeight = root.current.firstElementChild.clientHeight;\n          if (rootHeight > 0 && firstChildHeight > rootHeight) {\n            needsVerticalScrollBar = firstChildHeight - rootHeight > 1;\n          }\n        }\n        if (needsVerticalScrollBarState !== needsVerticalScrollBar) {\n          setNeedsVerticalScrollBar(needsVerticalScrollBar);\n        }\n      });\n      return function() {\n        return async.dispose();\n      };\n    });\n    return needsVerticalScrollBarState;\n  }\n  function defaultFocusRestorer(options2) {\n    var originalElement = options2.originalElement, containsFocus = options2.containsFocus;\n    if (originalElement && containsFocus && originalElement !== getWindow()) {\n      setTimeout(function() {\n        var _a2;\n        (_a2 = originalElement.focus) === null || _a2 === void 0 ? void 0 : _a2.call(originalElement);\n      }, 0);\n    }\n  }\n  function useRestoreFocus(props, root) {\n    var _a2 = props.onRestoreFocus, onRestoreFocus = _a2 === void 0 ? defaultFocusRestorer : _a2;\n    var originalFocusedElement = React__namespace.useRef(void 0);\n    var containsFocus = React__namespace.useRef(false);\n    React__namespace.useEffect(function() {\n      originalFocusedElement.current = getDocument().activeElement;\n      if (doesElementContainFocus(root.current)) {\n        containsFocus.current = true;\n      }\n      return function() {\n        var _a3;\n        onRestoreFocus === null || onRestoreFocus === void 0 ? void 0 : onRestoreFocus({\n          originalElement: originalFocusedElement.current,\n          containsFocus: containsFocus.current,\n          documentContainsFocus: ((_a3 = getDocument()) === null || _a3 === void 0 ? void 0 : _a3.hasFocus()) || false\n        });\n        originalFocusedElement.current = void 0;\n      };\n    }, []);\n    useOnEvent(root, \"focus\", React__namespace.useCallback(function() {\n      containsFocus.current = true;\n    }, []), true);\n    useOnEvent(root, \"blur\", React__namespace.useCallback(function(ev) {\n      if (root.current && ev.relatedTarget && !root.current.contains(ev.relatedTarget)) {\n        containsFocus.current = false;\n      }\n    }, []), true);\n  }\n  function useHideSiblingNodes(props, root) {\n    var shouldHideSiblings = String(props[\"aria-modal\"]).toLowerCase() === \"true\" && props.enableAriaHiddenSiblings;\n    React__namespace.useEffect(function() {\n      if (!(shouldHideSiblings && root.current)) {\n        return;\n      }\n      var unmodalize2 = modalize(root.current);\n      return unmodalize2;\n    }, [root, shouldHideSiblings]);\n  }\n  var Popup = React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var props = getPropsWithDefaults({ shouldRestoreFocus: true, enableAriaHiddenSiblings: true }, propsWithoutDefaults);\n    var root = React__namespace.useRef(void 0);\n    var mergedRootRef = useMergedRefs(root, forwardedRef);\n    useHideSiblingNodes(props, root);\n    useRestoreFocus(props, root);\n    var role = props.role, className2 = props.className, ariaLabel2 = props.ariaLabel, ariaLabelledBy = props.ariaLabelledBy, ariaDescribedBy = props.ariaDescribedBy, style2 = props.style, children2 = props.children, onDismiss = props.onDismiss;\n    var needsVerticalScrollBar = useScrollbarAsync(props, root);\n    var onKeyDown = React__namespace.useCallback(function(ev) {\n      switch (ev.which) {\n        case KeyCodes.escape:\n          if (onDismiss) {\n            onDismiss(ev);\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n          break;\n      }\n    }, [onDismiss]);\n    var win = useWindow();\n    useOnEvent(win, \"keydown\", onKeyDown);\n    return React__namespace.createElement(\"div\", __assign$1({ ref: mergedRootRef }, getNativeProps(props, divProperties), { className: className2, role, \"aria-label\": ariaLabel2, \"aria-labelledby\": ariaLabelledBy, \"aria-describedby\": ariaDescribedBy, onKeyDown, style: __assign$1({ overflowY: needsVerticalScrollBar ? \"scroll\" : void 0, outline: \"none\" }, style2) }), children2);\n  });\n  Popup.displayName = \"Popup\";\n  var useDocumentEx = function() {\n    var _a2;\n    return (_a2 = useDocument()) !== null && _a2 !== void 0 ? _a2 : typeof document !== \"undefined\" ? document : void 0;\n  };\n  var useWindowEx = function() {\n    var _a2;\n    return (_a2 = useWindow()) !== null && _a2 !== void 0 ? _a2 : typeof window !== \"undefined\" ? window : void 0;\n  };\n  var getDocumentEx = function(ctx) {\n    var _a2, _b2;\n    return (_b2 = (_a2 = ctx === null || ctx === void 0 ? void 0 : ctx.window) === null || _a2 === void 0 ? void 0 : _a2.document) !== null && _b2 !== void 0 ? _b2 : typeof document !== \"undefined\" ? document : void 0;\n  };\n  var getWindowEx = function(ctx) {\n    var _a2;\n    return (_a2 = ctx === null || ctx === void 0 ? void 0 : ctx.window) !== null && _a2 !== void 0 ? _a2 : typeof window !== \"undefined\" ? window : void 0;\n  };\n  var _a$3;\n  var COMPONENT_NAME$9 = \"CalloutContentBase\";\n  var ANIMATIONS = (_a$3 = {}, _a$3[RectangleEdge.top] = AnimationClassNames.slideUpIn10, _a$3[RectangleEdge.bottom] = AnimationClassNames.slideDownIn10, _a$3[RectangleEdge.left] = AnimationClassNames.slideLeftIn10, _a$3[RectangleEdge.right] = AnimationClassNames.slideRightIn10, _a$3);\n  var BEAK_ORIGIN_POSITION = { top: 0, left: 0 };\n  var OFF_SCREEN_STYLE = {\n    opacity: 0,\n    filter: \"opacity(0)\",\n    pointerEvents: \"none\"\n  };\n  var ARIA_ROLE_ATTRIBUTES = [\"role\", \"aria-roledescription\"];\n  var DEFAULT_PROPS$6 = {\n    preventDismissOnLostFocus: false,\n    preventDismissOnScroll: false,\n    preventDismissOnResize: false,\n    isBeakVisible: true,\n    beakWidth: 16,\n    gapSpace: 0,\n    minPagePadding: 8,\n    directionalHint: DirectionalHint.bottomAutoEdge\n  };\n  var getClassNames$p = classNamesFunction({\n    disableCaching: true\n    // disabling caching because stylesProp.position mutates often\n  });\n  function useBounds(_a2, targetRef, targetWindow) {\n    var bounds2 = _a2.bounds, _b2 = _a2.minPagePadding, minPagePadding = _b2 === void 0 ? DEFAULT_PROPS$6.minPagePadding : _b2, target2 = _a2.target;\n    var _c2 = React__namespace.useState(false), targetWindowResized = _c2[0], setTargetWindowResized = _c2[1];\n    var cachedBounds = React__namespace.useRef(void 0);\n    var getBounds = React__namespace.useCallback(function() {\n      if (!cachedBounds.current || targetWindowResized) {\n        var currentBounds = typeof bounds2 === \"function\" ? targetWindow ? bounds2(target2, targetWindow) : void 0 : bounds2;\n        if (!currentBounds && targetWindow) {\n          currentBounds = getBoundsFromTargetWindow(targetRef.current, targetWindow);\n          currentBounds = {\n            top: currentBounds.top + minPagePadding,\n            left: currentBounds.left + minPagePadding,\n            right: currentBounds.right - minPagePadding,\n            bottom: currentBounds.bottom - minPagePadding,\n            width: currentBounds.width - minPagePadding * 2,\n            height: currentBounds.height - minPagePadding * 2\n          };\n        }\n        cachedBounds.current = currentBounds;\n        targetWindowResized && setTargetWindowResized(false);\n      }\n      return cachedBounds.current;\n    }, [bounds2, minPagePadding, target2, targetRef, targetWindow, targetWindowResized]);\n    var async = useAsync();\n    useOnEvent(targetWindow, \"resize\", async.debounce(function() {\n      setTargetWindowResized(true);\n    }, 500, { leading: true }));\n    return getBounds;\n  }\n  function useMaxHeight(_a2, getBounds, targetRef, positions2) {\n    var _b2;\n    var calloutMaxHeight = _a2.calloutMaxHeight, finalHeight = _a2.finalHeight, directionalHint = _a2.directionalHint, directionalHintFixed = _a2.directionalHintFixed, hidden = _a2.hidden, gapSpace = _a2.gapSpace, beakWidth = _a2.beakWidth, isBeakVisible = _a2.isBeakVisible, coverTarget = _a2.coverTarget;\n    var _c2 = React__namespace.useState(), maxHeight = _c2[0], setMaxHeight = _c2[1];\n    var _d2 = (_b2 = positions2 === null || positions2 === void 0 ? void 0 : positions2.elementPosition) !== null && _b2 !== void 0 ? _b2 : {}, top = _d2.top, bottom = _d2.bottom;\n    var targetRect = (targetRef === null || targetRef === void 0 ? void 0 : targetRef.current) ? getRectangleFromTarget(targetRef.current) : void 0;\n    React__namespace.useEffect(function() {\n      var _a3;\n      var bounds2 = (_a3 = getBounds()) !== null && _a3 !== void 0 ? _a3 : {};\n      var topBounds = bounds2.top;\n      var bottomBounds = bounds2.bottom;\n      var calculatedHeight;\n      if ((positions2 === null || positions2 === void 0 ? void 0 : positions2.targetEdge) === RectangleEdge.top && (targetRect === null || targetRect === void 0 ? void 0 : targetRect.top) && !coverTarget) {\n        bottomBounds = targetRect.top - calculateGapSpace(isBeakVisible, beakWidth, gapSpace);\n      }\n      if (typeof top === \"number\" && bottomBounds) {\n        calculatedHeight = bottomBounds - top;\n      } else if (typeof bottom === \"number\" && typeof topBounds === \"number\" && bottomBounds) {\n        calculatedHeight = bottomBounds - topBounds - bottom;\n      }\n      if (!calloutMaxHeight && !hidden || calloutMaxHeight && calculatedHeight && calloutMaxHeight > calculatedHeight) {\n        setMaxHeight(calculatedHeight);\n      } else if (calloutMaxHeight) {\n        setMaxHeight(calloutMaxHeight);\n      } else {\n        setMaxHeight(void 0);\n      }\n    }, [\n      bottom,\n      calloutMaxHeight,\n      finalHeight,\n      directionalHint,\n      directionalHintFixed,\n      getBounds,\n      hidden,\n      positions2,\n      top,\n      gapSpace,\n      beakWidth,\n      isBeakVisible,\n      targetRect,\n      coverTarget\n    ]);\n    return maxHeight;\n  }\n  function usePositions(props, hostElement, calloutElement, targetRef, getBounds, popupRef) {\n    var _a2 = React__namespace.useState(), positions2 = _a2[0], setPositions = _a2[1];\n    var positionAttempts = React__namespace.useRef(0);\n    var previousTarget = React__namespace.useRef(void 0);\n    var async = useAsync();\n    var hidden = props.hidden, target2 = props.target, finalHeight = props.finalHeight, calloutMaxHeight = props.calloutMaxHeight, onPositioned = props.onPositioned, directionalHint = props.directionalHint, hideOverflow = props.hideOverflow, preferScrollResizePositioning = props.preferScrollResizePositioning;\n    var win = useWindowEx();\n    var localRef = React__namespace.useRef(void 0);\n    var popupStyles;\n    if (localRef.current !== popupRef.current) {\n      localRef.current = popupRef.current;\n      popupStyles = popupRef.current ? win === null || win === void 0 ? void 0 : win.getComputedStyle(popupRef.current) : void 0;\n    }\n    var popupOverflowY = popupStyles === null || popupStyles === void 0 ? void 0 : popupStyles.overflowY;\n    React__namespace.useEffect(function() {\n      if (!hidden) {\n        var timerId_1 = async.requestAnimationFrame(function() {\n          var _a3, _b2;\n          if (hostElement.current && calloutElement) {\n            var currentProps = __assign$1(__assign$1({}, props), { target: targetRef.current, bounds: getBounds() });\n            var dupeCalloutElement = calloutElement.cloneNode(true);\n            dupeCalloutElement.style.maxHeight = calloutMaxHeight ? \"\".concat(calloutMaxHeight) : \"\";\n            dupeCalloutElement.style.visibility = \"hidden\";\n            (_a3 = calloutElement.parentElement) === null || _a3 === void 0 ? void 0 : _a3.appendChild(dupeCalloutElement);\n            var previousPositions = previousTarget.current === target2 ? positions2 : void 0;\n            var isOverflowYHidden = hideOverflow || popupOverflowY === \"clip\" || popupOverflowY === \"hidden\";\n            var shouldScroll = preferScrollResizePositioning && !isOverflowYHidden;\n            var newPositions = finalHeight ? positionCard(currentProps, hostElement.current, dupeCalloutElement, previousPositions, win) : positionCallout(currentProps, hostElement.current, dupeCalloutElement, previousPositions, shouldScroll, void 0, win);\n            (_b2 = calloutElement.parentElement) === null || _b2 === void 0 ? void 0 : _b2.removeChild(dupeCalloutElement);\n            if (!positions2 && newPositions || positions2 && newPositions && !arePositionsEqual(positions2, newPositions) && positionAttempts.current < 5) {\n              positionAttempts.current++;\n              setPositions(newPositions);\n            } else if (positionAttempts.current > 0) {\n              positionAttempts.current = 0;\n              onPositioned === null || onPositioned === void 0 ? void 0 : onPositioned(positions2);\n            }\n          }\n        }, calloutElement);\n        previousTarget.current = target2;\n        return function() {\n          async.cancelAnimationFrame(timerId_1);\n          previousTarget.current = void 0;\n        };\n      } else {\n        setPositions(void 0);\n        positionAttempts.current = 0;\n      }\n    }, [\n      hidden,\n      directionalHint,\n      async,\n      calloutElement,\n      calloutMaxHeight,\n      hostElement,\n      targetRef,\n      finalHeight,\n      getBounds,\n      onPositioned,\n      positions2,\n      props,\n      target2,\n      hideOverflow,\n      preferScrollResizePositioning,\n      popupOverflowY,\n      win\n    ]);\n    return positions2;\n  }\n  function useAutoFocus(_a2, positions2, calloutElement) {\n    var hidden = _a2.hidden, setInitialFocus = _a2.setInitialFocus;\n    var async = useAsync();\n    var hasPositions = !!positions2;\n    React__namespace.useEffect(function() {\n      if (!hidden && setInitialFocus && hasPositions && calloutElement) {\n        var timerId_2 = async.requestAnimationFrame(function() {\n          return focusFirstChild(calloutElement);\n        }, calloutElement);\n        return function() {\n          return async.cancelAnimationFrame(timerId_2);\n        };\n      }\n    }, [hidden, hasPositions, async, calloutElement, setInitialFocus]);\n  }\n  function useDismissHandlers(_a2, positions2, hostElement, targetRef, targetWindow) {\n    var hidden = _a2.hidden, onDismiss = _a2.onDismiss, preventDismissOnScroll = _a2.preventDismissOnScroll, preventDismissOnResize = _a2.preventDismissOnResize, preventDismissOnLostFocus = _a2.preventDismissOnLostFocus, dismissOnTargetClick = _a2.dismissOnTargetClick, shouldDismissOnWindowFocus = _a2.shouldDismissOnWindowFocus, preventDismissOnEvent = _a2.preventDismissOnEvent;\n    var isMouseDownOnPopup = React__namespace.useRef(false);\n    var async = useAsync();\n    var mouseDownHandlers = useConst([\n      function() {\n        isMouseDownOnPopup.current = true;\n      },\n      function() {\n        isMouseDownOnPopup.current = false;\n      }\n    ]);\n    var positionsExists = !!positions2;\n    React__namespace.useEffect(function() {\n      var dismissOnScroll = function(ev) {\n        if (positionsExists && !preventDismissOnScroll) {\n          dismissOnClickOrScroll(ev);\n        }\n      };\n      var dismissOnResize = function(ev) {\n        if (!preventDismissOnResize && !(preventDismissOnEvent && preventDismissOnEvent(ev))) {\n          onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss(ev);\n        }\n      };\n      var dismissOnLostFocus = function(ev) {\n        if (!preventDismissOnLostFocus) {\n          dismissOnClickOrScroll(ev);\n        }\n      };\n      var dismissOnClickOrScroll = function(ev) {\n        var eventPaths = ev.composedPath ? ev.composedPath() : [];\n        var target2 = eventPaths.length > 0 ? eventPaths[0] : ev.target;\n        var isEventTargetOutsideCallout = hostElement.current && !elementContains(hostElement.current, target2);\n        if (isEventTargetOutsideCallout && isMouseDownOnPopup.current) {\n          isMouseDownOnPopup.current = false;\n          return;\n        }\n        if (!targetRef.current && isEventTargetOutsideCallout || ev.target !== targetWindow && isEventTargetOutsideCallout && (!targetRef.current || \"stopPropagation\" in targetRef.current || dismissOnTargetClick || target2 !== targetRef.current && !elementContains(targetRef.current, target2))) {\n          if (preventDismissOnEvent && preventDismissOnEvent(ev)) {\n            return;\n          }\n          onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss(ev);\n        }\n      };\n      var dismissOnTargetWindowBlur = function(ev) {\n        if (!shouldDismissOnWindowFocus) {\n          return;\n        }\n        if ((preventDismissOnEvent && !preventDismissOnEvent(ev) || !preventDismissOnEvent && !preventDismissOnLostFocus) && !(targetWindow === null || targetWindow === void 0 ? void 0 : targetWindow.document.hasFocus()) && ev.relatedTarget === null) {\n          onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss(ev);\n        }\n      };\n      var disposablesPromise = new Promise(function(resolve2) {\n        async.setTimeout(function() {\n          if (!hidden && targetWindow) {\n            var disposables_1 = [\n              on$1(targetWindow, \"scroll\", dismissOnScroll, true),\n              on$1(targetWindow, \"resize\", dismissOnResize, true),\n              on$1(targetWindow.document.documentElement, \"focus\", dismissOnLostFocus, true),\n              on$1(targetWindow.document.documentElement, \"click\", dismissOnLostFocus, true),\n              on$1(targetWindow, \"blur\", dismissOnTargetWindowBlur, true)\n            ];\n            resolve2(function() {\n              disposables_1.forEach(function(dispose) {\n                return dispose();\n              });\n            });\n          }\n        }, 0);\n      });\n      return function() {\n        disposablesPromise.then(function(dispose) {\n          return dispose();\n        });\n      };\n    }, [\n      hidden,\n      async,\n      hostElement,\n      targetRef,\n      targetWindow,\n      onDismiss,\n      shouldDismissOnWindowFocus,\n      dismissOnTargetClick,\n      preventDismissOnLostFocus,\n      preventDismissOnResize,\n      preventDismissOnScroll,\n      positionsExists,\n      preventDismissOnEvent\n    ]);\n    return mouseDownHandlers;\n  }\n  var CalloutContentBase = React__namespace.memo(React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var props = getPropsWithDefaults(DEFAULT_PROPS$6, propsWithoutDefaults);\n    var styles = props.styles, style2 = props.style, ariaLabel2 = props.ariaLabel, ariaDescribedBy = props.ariaDescribedBy, ariaLabelledBy = props.ariaLabelledBy, className2 = props.className, isBeakVisible = props.isBeakVisible, children2 = props.children, beakWidth = props.beakWidth, calloutWidth = props.calloutWidth, calloutMaxWidth = props.calloutMaxWidth, calloutMinWidth = props.calloutMinWidth, doNotLayer = props.doNotLayer, finalHeight = props.finalHeight, _a2 = props.hideOverflow, hideOverflow = _a2 === void 0 ? !!finalHeight : _a2, backgroundColor = props.backgroundColor, calloutMaxHeight = props.calloutMaxHeight, onScroll = props.onScroll, _b2 = props.shouldRestoreFocus, shouldRestoreFocus = _b2 === void 0 ? true : _b2, target2 = props.target, hidden = props.hidden, onLayerMounted = props.onLayerMounted, popupProps = props.popupProps;\n    var hostElement = React__namespace.useRef(null);\n    var popupRef = React__namespace.useRef(null);\n    var mergedPopupRefs = useMergedRefs(popupRef, popupProps === null || popupProps === void 0 ? void 0 : popupProps.ref);\n    var _c2 = React__namespace.useState(null), calloutElement = _c2[0], setCalloutElement = _c2[1];\n    var calloutCallback = React__namespace.useCallback(function(calloutEl) {\n      setCalloutElement(calloutEl);\n    }, []);\n    var rootRef = useMergedRefs(hostElement, forwardedRef);\n    var _d2 = useTarget(props.target, {\n      current: calloutElement\n    }), targetRef = _d2[0], targetWindow = _d2[1];\n    var getBounds = useBounds(props, targetRef, targetWindow);\n    var positions2 = usePositions(props, hostElement, calloutElement, targetRef, getBounds, mergedPopupRefs);\n    var maxHeight = useMaxHeight(props, getBounds, targetRef, positions2);\n    var _e2 = useDismissHandlers(props, positions2, hostElement, targetRef, targetWindow), mouseDownOnPopup = _e2[0], mouseUpOnPopup = _e2[1];\n    var isForcedInBounds = (positions2 === null || positions2 === void 0 ? void 0 : positions2.elementPosition.top) && (positions2 === null || positions2 === void 0 ? void 0 : positions2.elementPosition.bottom);\n    var cssPositions = __assign$1(__assign$1({}, positions2 === null || positions2 === void 0 ? void 0 : positions2.elementPosition), { maxHeight });\n    if (isForcedInBounds) {\n      cssPositions.bottom = void 0;\n    }\n    useAutoFocus(props, positions2, calloutElement);\n    React__namespace.useEffect(function() {\n      if (!hidden) {\n        onLayerMounted === null || onLayerMounted === void 0 ? void 0 : onLayerMounted();\n      }\n    }, [hidden]);\n    if (!targetWindow) {\n      return null;\n    }\n    var overflowYHidden = hideOverflow;\n    var beakVisible = isBeakVisible && !!target2;\n    var classNames2 = getClassNames$p(styles, {\n      theme: props.theme,\n      className: className2,\n      overflowYHidden,\n      calloutWidth,\n      positions: positions2,\n      beakWidth,\n      backgroundColor,\n      calloutMaxWidth,\n      calloutMinWidth,\n      doNotLayer\n    });\n    var overflowStyle = __assign$1(__assign$1({ maxHeight: calloutMaxHeight ? calloutMaxHeight : \"100%\" }, style2), overflowYHidden && { overflowY: \"hidden\" });\n    var visibilityStyle = props.hidden ? { visibility: \"hidden\" } : void 0;\n    return React__namespace.createElement(\n      \"div\",\n      { ref: rootRef, className: classNames2.container, style: visibilityStyle },\n      React__namespace.createElement(\n        \"div\",\n        __assign$1({}, getNativeProps(props, divProperties, ARIA_ROLE_ATTRIBUTES), {\n          className: css(classNames2.root, positions2 && positions2.targetEdge && ANIMATIONS[positions2.targetEdge]),\n          style: positions2 ? __assign$1({}, cssPositions) : OFF_SCREEN_STYLE,\n          // Safari and Firefox on Mac OS requires this to back-stop click events so focus remains in the Callout.\n          // See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus\n          tabIndex: -1,\n          ref: calloutCallback\n        }),\n        beakVisible && React__namespace.createElement(\"div\", { className: classNames2.beak, style: getBeakPosition(positions2) }),\n        beakVisible && React__namespace.createElement(\"div\", { className: classNames2.beakCurtain }),\n        React__namespace.createElement(\n          Popup,\n          __assign$1({\n            // don't use getNativeElementProps for role and roledescription because it will also\n            // pass through data-* props (resulting in them being used in two places)\n            role: props.role,\n            \"aria-roledescription\": props[\"aria-roledescription\"],\n            ariaDescribedBy,\n            ariaLabel: ariaLabel2,\n            ariaLabelledBy,\n            className: classNames2.calloutMain,\n            onDismiss: props.onDismiss,\n            onMouseDown: mouseDownOnPopup,\n            onMouseUp: mouseUpOnPopup,\n            onRestoreFocus: props.onRestoreFocus,\n            onScroll,\n            // eslint-disable-next-line @typescript-eslint/no-deprecated\n            shouldRestoreFocus,\n            style: overflowStyle\n          }, popupProps, { ref: mergedPopupRefs }),\n          children2\n        )\n      )\n    );\n  }), function(previousProps, nextProps) {\n    if (!nextProps.shouldUpdateWhenHidden && previousProps.hidden && nextProps.hidden) {\n      return true;\n    }\n    return shallowCompare(previousProps, nextProps);\n  });\n  function getBeakPosition(positions2) {\n    var _a2, _b2;\n    var beakPositionStyle = __assign$1(__assign$1({}, (_a2 = positions2 === null || positions2 === void 0 ? void 0 : positions2.beakPosition) === null || _a2 === void 0 ? void 0 : _a2.elementPosition), { display: ((_b2 = positions2 === null || positions2 === void 0 ? void 0 : positions2.beakPosition) === null || _b2 === void 0 ? void 0 : _b2.hideBeak) ? \"none\" : void 0 });\n    if (!beakPositionStyle.top && !beakPositionStyle.bottom && !beakPositionStyle.left && !beakPositionStyle.right) {\n      beakPositionStyle.left = BEAK_ORIGIN_POSITION.left;\n      beakPositionStyle.top = BEAK_ORIGIN_POSITION.top;\n    }\n    return beakPositionStyle;\n  }\n  function arePositionsEqual(prevElementPositions, newElementPosition) {\n    return comparePositions(prevElementPositions.elementPosition, newElementPosition.elementPosition) && comparePositions(prevElementPositions.beakPosition.elementPosition, newElementPosition.beakPosition.elementPosition);\n  }\n  function comparePositions(prevElementPositions, newElementPositions) {\n    for (var key2 in newElementPositions) {\n      if (newElementPositions.hasOwnProperty(key2)) {\n        var oldPositionEdge = prevElementPositions[key2];\n        var newPositionEdge = newElementPositions[key2];\n        if (oldPositionEdge !== void 0 && newPositionEdge !== void 0) {\n          if (oldPositionEdge.toFixed(2) !== newPositionEdge.toFixed(2)) {\n            return false;\n          }\n        } else {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n  CalloutContentBase.displayName = COMPONENT_NAME$9;\n  function getBeakStyle(beakWidth) {\n    return {\n      height: beakWidth,\n      width: beakWidth\n    };\n  }\n  var GlobalClassNames$g = {\n    container: \"ms-Callout-container\",\n    root: \"ms-Callout\",\n    beak: \"ms-Callout-beak\",\n    beakCurtain: \"ms-Callout-beakCurtain\",\n    calloutMain: \"ms-Callout-main\"\n  };\n  var getStyles$u = function(props) {\n    var _a2;\n    var theme = props.theme, className2 = props.className, overflowYHidden = props.overflowYHidden, calloutWidth = props.calloutWidth, beakWidth = props.beakWidth, backgroundColor = props.backgroundColor, calloutMaxWidth = props.calloutMaxWidth, calloutMinWidth = props.calloutMinWidth, doNotLayer = props.doNotLayer;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$g, theme);\n    var semanticColors = theme.semanticColors, effects = theme.effects;\n    return {\n      container: [\n        classNames2.container,\n        {\n          position: \"relative\"\n        }\n      ],\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          position: \"absolute\",\n          display: \"flex\",\n          zIndex: doNotLayer ? ZIndexes.Layer : void 0,\n          boxSizing: \"border-box\",\n          borderRadius: effects.roundedCorner2,\n          boxShadow: effects.elevation16,\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n            borderWidth: 1,\n            borderStyle: \"solid\",\n            borderColor: \"WindowText\"\n          }, _a2)\n        },\n        focusClear(),\n        className2,\n        !!calloutWidth && { width: calloutWidth },\n        !!calloutMaxWidth && { maxWidth: calloutMaxWidth },\n        !!calloutMinWidth && { minWidth: calloutMinWidth }\n      ],\n      beak: [\n        classNames2.beak,\n        {\n          position: \"absolute\",\n          backgroundColor: semanticColors.menuBackground,\n          boxShadow: \"inherit\",\n          border: \"inherit\",\n          boxSizing: \"border-box\",\n          transform: \"rotate(45deg)\"\n        },\n        getBeakStyle(beakWidth),\n        backgroundColor && {\n          backgroundColor\n        }\n      ],\n      beakCurtain: [\n        classNames2.beakCurtain,\n        {\n          position: \"absolute\",\n          top: 0,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          backgroundColor: semanticColors.menuBackground,\n          borderRadius: effects.roundedCorner2\n        }\n      ],\n      calloutMain: [\n        classNames2.calloutMain,\n        {\n          backgroundColor: semanticColors.menuBackground,\n          overflowX: \"hidden\",\n          overflowY: \"auto\",\n          position: \"relative\",\n          width: \"100%\",\n          borderRadius: effects.roundedCorner2\n        },\n        overflowYHidden && {\n          overflowY: \"hidden\"\n        },\n        backgroundColor && {\n          backgroundColor\n        }\n      ]\n    };\n  };\n  var CalloutContent = styled(CalloutContentBase, getStyles$u, void 0, {\n    scope: \"CalloutContent\"\n  });\n  var PortalCompatContext = React__namespace.createContext(void 0);\n  var portalCompatContextDefaultValue = function() {\n    return function() {\n      return void 0;\n    };\n  };\n  PortalCompatContext.Provider;\n  function usePortalCompat() {\n    var _React_useContext;\n    return (_React_useContext = React__namespace.useContext(PortalCompatContext)) !== null && _React_useContext !== void 0 ? _React_useContext : portalCompatContextDefaultValue;\n  }\n  var getClassNames$o = classNamesFunction();\n  var getFabricTheme = memoizeFunction(function(theme, isRTL) {\n    return createTheme(__assign$1(__assign$1({}, theme), { rtl: isRTL }));\n  });\n  var getDir = function(_a2) {\n    var theme = _a2.theme, dir = _a2.dir;\n    var contextDir = getRTL(theme) ? \"rtl\" : \"ltr\";\n    var pageDir = getRTL() ? \"rtl\" : \"ltr\";\n    var componentDir = dir ? dir : contextDir;\n    return {\n      // If Fabric dir !== contextDir\n      // Or If contextDir !== pageDir\n      // Then we need to set dir of the Fabric root\n      rootDir: componentDir !== contextDir || componentDir !== pageDir ? componentDir : dir,\n      // If dir !== contextDir || pageDir\n      // then set contextual theme around content\n      needsTheme: componentDir !== contextDir\n    };\n  };\n  var FabricBase = React__namespace.forwardRef(function(props, ref2) {\n    var className2 = props.className, theme = props.theme, applyTheme = props.applyTheme, applyThemeToBody = props.applyThemeToBody, styles = props.styles;\n    var classNames2 = getClassNames$o(styles, {\n      theme,\n      applyTheme,\n      className: className2\n    });\n    var rootElement = React__namespace.useRef(null);\n    useApplyThemeToBody(applyThemeToBody, classNames2, rootElement);\n    return React__namespace.createElement(React__namespace.Fragment, null, useRenderedContent(props, classNames2, rootElement, ref2));\n  });\n  FabricBase.displayName = \"FabricBase\";\n  function useRenderedContent(props, _a2, rootElement, ref2) {\n    var root = _a2.root;\n    var _b2 = props.as, Root = _b2 === void 0 ? \"div\" : _b2, dir = props.dir, theme = props.theme;\n    var divProps = getNativeProps(props, divProperties, [\"dir\"]);\n    var _c2 = getDir(props), rootDir = _c2.rootDir, needsTheme = _c2.needsTheme;\n    var renderedContent = React__namespace.createElement(\n      FocusRectsProvider,\n      { providerRef: rootElement },\n      React__namespace.createElement(Root, __assign$1({ dir: rootDir }, divProps, { className: root, ref: useMergedRefs(rootElement, ref2) }))\n    );\n    if (needsTheme) {\n      renderedContent = // eslint-disable-next-line @typescript-eslint/no-deprecated\n      React__namespace.createElement(Customizer, { settings: { theme: getFabricTheme(theme, dir === \"rtl\") } }, renderedContent);\n    }\n    return renderedContent;\n  }\n  function useApplyThemeToBody(applyThemeToBody, _a2, rootElement) {\n    var bodyThemed = _a2.bodyThemed;\n    React__namespace.useEffect(function() {\n      if (applyThemeToBody) {\n        var currentDoc_1 = getDocument(rootElement.current);\n        if (currentDoc_1) {\n          currentDoc_1.body.classList.add(bodyThemed);\n          return function() {\n            currentDoc_1.body.classList.remove(bodyThemed);\n          };\n        }\n      }\n    }, [bodyThemed, applyThemeToBody, rootElement]);\n    return rootElement;\n  }\n  var inheritFont = { fontFamily: \"inherit\" };\n  var GlobalClassNames$f = {\n    root: \"ms-Fabric\",\n    bodyThemed: \"ms-Fabric-bodyThemed\"\n  };\n  var getStyles$t = function(props) {\n    var applyTheme = props.applyTheme, className2 = props.className, preventBlanketFontInheritance = props.preventBlanketFontInheritance, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$f, theme);\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          color: theme.palette.neutralPrimary\n        },\n        !preventBlanketFontInheritance && {\n          \"& button\": inheritFont,\n          \"& input\": inheritFont,\n          \"& textarea\": inheritFont\n        },\n        // apply theme to only if applyTheme is true\n        applyTheme && {\n          color: theme.semanticColors.bodyText,\n          backgroundColor: theme.semanticColors.bodyBackground\n        },\n        className2\n      ],\n      bodyThemed: [\n        {\n          backgroundColor: theme.semanticColors.bodyBackground\n        }\n      ]\n    };\n  };\n  var Fabric = styled(FabricBase, getStyles$t, void 0, {\n    scope: \"Fabric\"\n  });\n  var _layersByHostId = {};\n  var _layerHostsById = {};\n  var defaultHostId = \"fluent-default-layer-host\";\n  var _defaultHostSelector = \"#\".concat(defaultHostId);\n  function registerLayer(hostId, callback) {\n    if (!_layersByHostId[hostId]) {\n      _layersByHostId[hostId] = [];\n    }\n    _layersByHostId[hostId].push(callback);\n    var layerHosts = _layerHostsById[hostId];\n    if (layerHosts) {\n      for (var _i = 0, layerHosts_1 = layerHosts; _i < layerHosts_1.length; _i++) {\n        var layerHost = layerHosts_1[_i];\n        layerHost.notifyLayersChanged();\n      }\n    }\n  }\n  function unregisterLayer(hostId, callback) {\n    var layers = _layersByHostId[hostId];\n    if (layers) {\n      var idx = layers.indexOf(callback);\n      if (idx >= 0) {\n        layers.splice(idx, 1);\n        if (layers.length === 0) {\n          delete _layersByHostId[hostId];\n        }\n      }\n    }\n    var layerHosts = _layerHostsById[hostId];\n    if (layerHosts) {\n      for (var _i = 0, layerHosts_2 = layerHosts; _i < layerHosts_2.length; _i++) {\n        var layerHost = layerHosts_2[_i];\n        layerHost.notifyLayersChanged();\n      }\n    }\n  }\n  function getLayerHost(hostId) {\n    var layerHosts = _layerHostsById[hostId];\n    return layerHosts && layerHosts[0] || void 0;\n  }\n  function createDefaultLayerHost(doc, shadowRoot) {\n    if (shadowRoot === void 0) {\n      shadowRoot = null;\n    }\n    var host = doc.createElement(\"div\");\n    host.setAttribute(\"id\", defaultHostId);\n    host.style.cssText = \"position:fixed;z-index:1000000\";\n    if (shadowRoot) {\n      shadowRoot.appendChild(host);\n    } else {\n      doc === null || doc === void 0 ? void 0 : doc.body.appendChild(host);\n    }\n    return host;\n  }\n  function getDefaultTarget() {\n    return _defaultHostSelector;\n  }\n  var getClassNames$n = classNamesFunction();\n  var getFocusVisibility = function(providerRef) {\n    if (providerRef === null || providerRef === void 0 ? void 0 : providerRef.current) {\n      return providerRef.current.classList.contains(IsFocusVisibleClassName);\n    }\n    return false;\n  };\n  var LayerBase = React__namespace.forwardRef(function(props, ref2) {\n    var registerPortalEl = usePortalCompat();\n    var rootRef = React__namespace.useRef(null);\n    var mergedRef = useMergedRefs(rootRef, ref2);\n    var layerRef = React__namespace.useRef(void 0);\n    var fabricElementRef = React__namespace.useRef(null);\n    var focusContext = React__namespace.useContext(FocusRectsContext);\n    var _a2 = React__namespace.useState(false), needRaiseLayerMount = _a2[0], setNeedRaiseLayerMount = _a2[1];\n    var focusRectsRef = React__namespace.useCallback(function(el) {\n      var isFocusVisible = getFocusVisibility(focusContext === null || focusContext === void 0 ? void 0 : focusContext.providerRef);\n      if (el && isFocusVisible) {\n        el.classList.add(IsFocusVisibleClassName);\n      }\n    }, [focusContext]);\n    var children2 = props.children, className2 = props.className, eventBubblingEnabled = props.eventBubblingEnabled, fabricProps = props.fabricProps, hostId = props.hostId, insertFirst = props.insertFirst, _b2 = props.onLayerDidMount, onLayerDidMount = _b2 === void 0 ? function() {\n      return void 0;\n    } : _b2, _c2 = props.onLayerMounted, onLayerMounted = _c2 === void 0 ? function() {\n      return void 0;\n    } : _c2, onLayerWillUnmount = props.onLayerWillUnmount, styles = props.styles, theme = props.theme;\n    var fabricRef = useMergedRefs(fabricElementRef, fabricProps === null || fabricProps === void 0 ? void 0 : fabricProps.ref, focusRectsRef);\n    var classNames2 = getClassNames$n(styles, {\n      theme,\n      className: className2,\n      isNotHost: !hostId\n    });\n    var getHost = function(doc, shadowRoot) {\n      var _a22, _b22;\n      if (shadowRoot === void 0) {\n        shadowRoot = null;\n      }\n      var root = shadowRoot !== null && shadowRoot !== void 0 ? shadowRoot : doc;\n      if (hostId) {\n        var layerHost = getLayerHost(hostId);\n        if (layerHost) {\n          return (_a22 = layerHost.rootRef.current) !== null && _a22 !== void 0 ? _a22 : null;\n        }\n        return (_b22 = root.getElementById(hostId)) !== null && _b22 !== void 0 ? _b22 : null;\n      } else {\n        var defaultHostSelector = getDefaultTarget();\n        var host = defaultHostSelector ? root.querySelector(defaultHostSelector) : null;\n        if (!host) {\n          host = createDefaultLayerHost(doc, shadowRoot);\n        }\n        return host;\n      }\n    };\n    var removeLayerElement = function() {\n      onLayerWillUnmount === null || onLayerWillUnmount === void 0 ? void 0 : onLayerWillUnmount();\n      var elem = layerRef.current;\n      layerRef.current = void 0;\n      if (elem && elem.parentNode) {\n        elem.parentNode.removeChild(elem);\n      }\n    };\n    var createLayerElement = function() {\n      var _a22, _b22, _c22, _d2;\n      var doc = getDocument(rootRef.current);\n      var shadowRoot = ((_b22 = (_a22 = rootRef.current) === null || _a22 === void 0 ? void 0 : _a22.getRootNode()) === null || _b22 === void 0 ? void 0 : _b22.host) ? (_c22 = rootRef === null || rootRef === void 0 ? void 0 : rootRef.current) === null || _c22 === void 0 ? void 0 : _c22.getRootNode() : void 0;\n      if (!doc || !doc && !shadowRoot) {\n        return;\n      }\n      var host = getHost(doc, shadowRoot);\n      if (!host) {\n        return;\n      }\n      if (!host.__tabsterElementFlags) {\n        host.__tabsterElementFlags = {};\n      }\n      host.__tabsterElementFlags.noDirectAriaHidden = true;\n      removeLayerElement();\n      var el = ((_d2 = host.ownerDocument) !== null && _d2 !== void 0 ? _d2 : doc).createElement(\"div\");\n      el.className = classNames2.root;\n      setPortalAttribute(el);\n      setVirtualParent(el, rootRef.current);\n      insertFirst ? host.insertBefore(el, host.firstChild) : host.appendChild(el);\n      layerRef.current = el;\n      setNeedRaiseLayerMount(true);\n    };\n    useIsomorphicLayoutEffect(function() {\n      createLayerElement();\n      if (hostId) {\n        registerLayer(hostId, createLayerElement);\n      }\n      var unregisterPortalEl = layerRef.current ? registerPortalEl(layerRef.current) : void 0;\n      return function() {\n        if (unregisterPortalEl) {\n          unregisterPortalEl();\n        }\n        removeLayerElement();\n        if (hostId) {\n          unregisterLayer(hostId, createLayerElement);\n        }\n      };\n    }, [hostId]);\n    React__namespace.useEffect(function() {\n      if (layerRef.current && needRaiseLayerMount) {\n        onLayerMounted === null || onLayerMounted === void 0 ? void 0 : onLayerMounted();\n        onLayerDidMount === null || onLayerDidMount === void 0 ? void 0 : onLayerDidMount();\n        setNeedRaiseLayerMount(false);\n      }\n    }, [needRaiseLayerMount, onLayerMounted, onLayerDidMount]);\n    return React__namespace.createElement(\"span\", { className: \"ms-layer\", ref: mergedRef }, layerRef.current && ReactDOM__namespace.createPortal(React__namespace.createElement(\n      FocusRectsProvider,\n      { layerRoot: true, providerRef: fabricRef },\n      React__namespace.createElement(Fabric, __assign$1({}, !eventBubblingEnabled && getFilteredEvents(), fabricProps, { className: css(classNames2.content, fabricProps === null || fabricProps === void 0 ? void 0 : fabricProps.className), ref: fabricRef }), children2)\n    ), layerRef.current));\n  });\n  LayerBase.displayName = \"LayerBase\";\n  var filteredEventProps;\n  var onFilterEvent = function(ev) {\n    if (ev.eventPhase === Event.BUBBLING_PHASE && ev.type !== \"mouseenter\" && ev.type !== \"mouseleave\" && ev.type !== \"touchstart\" && ev.type !== \"touchend\") {\n      ev.stopPropagation();\n    }\n  };\n  function getFilteredEvents() {\n    if (!filteredEventProps) {\n      filteredEventProps = {};\n      [\n        \"onClick\",\n        \"onContextMenu\",\n        \"onDoubleClick\",\n        \"onDrag\",\n        \"onDragEnd\",\n        \"onDragEnter\",\n        \"onDragExit\",\n        \"onDragLeave\",\n        \"onDragOver\",\n        \"onDragStart\",\n        \"onDrop\",\n        \"onMouseDown\",\n        \"onMouseEnter\",\n        \"onMouseLeave\",\n        \"onMouseMove\",\n        \"onMouseOver\",\n        \"onMouseOut\",\n        \"onMouseUp\",\n        \"onTouchMove\",\n        \"onTouchStart\",\n        \"onTouchCancel\",\n        \"onTouchEnd\",\n        \"onKeyDown\",\n        \"onKeyPress\",\n        \"onKeyUp\",\n        \"onFocus\",\n        \"onBlur\",\n        \"onChange\",\n        \"onInput\",\n        \"onInvalid\",\n        \"onSubmit\"\n      ].forEach(function(name) {\n        return filteredEventProps[name] = onFilterEvent;\n      });\n    }\n    return filteredEventProps;\n  }\n  var GlobalClassNames$e = {\n    root: \"ms-Layer\",\n    rootNoHost: \"ms-Layer--fixed\",\n    content: \"ms-Layer-content\"\n  };\n  var getStyles$s = function(props) {\n    var className2 = props.className, isNotHost = props.isNotHost, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$e, theme);\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        isNotHost && [\n          classNames2.rootNoHost,\n          {\n            position: \"fixed\",\n            zIndex: ZIndexes.Layer,\n            top: 0,\n            left: 0,\n            bottom: 0,\n            right: 0,\n            visibility: \"hidden\"\n          }\n        ],\n        className2\n      ],\n      content: [\n        classNames2.content,\n        {\n          visibility: \"visible\"\n        }\n      ]\n    };\n  };\n  var Layer = styled(LayerBase, getStyles$s, void 0, {\n    scope: \"Layer\",\n    fields: [\"hostId\", \"theme\", \"styles\"]\n  });\n  var Callout = React__namespace.forwardRef(function(_a2, forwardedRef) {\n    var layerProps = _a2.layerProps, doNotLayer = _a2.doNotLayer, rest = __rest(_a2, [\"layerProps\", \"doNotLayer\"]);\n    var content2 = React__namespace.createElement(CalloutContent, __assign$1({}, rest, { doNotLayer, ref: forwardedRef }));\n    return doNotLayer ? content2 : React__namespace.createElement(Layer, __assign$1({}, layerProps), content2);\n  });\n  Callout.displayName = \"Callout\";\n  var COMPONENT_NAME$8 = \"FocusTrapZone\";\n  var DEFAULT_PROPS$5 = {\n    disabled: false,\n    disableFirstFocus: false,\n    forceFocusInsideTrap: true,\n    isClickableOutsideFocusTrap: false,\n    // Hardcoding completely uncontrolled flag for proper interop with FluentUI V9.\n    \"data-tabster\": '{\"uncontrolled\": {\"completely\": true}}'\n  };\n  var useComponentRef$6 = function(componentRef, previouslyFocusedElement, focusFTZ) {\n    React__namespace.useImperativeHandle(componentRef, function() {\n      return {\n        get previouslyFocusedElement() {\n          return previouslyFocusedElement;\n        },\n        focus: focusFTZ\n      };\n    }, [focusFTZ, previouslyFocusedElement]);\n  };\n  var FocusTrapZone = React__namespace.forwardRef(function(propsWithoutDefaults, ref2) {\n    var _a2;\n    var root = React__namespace.useRef(null);\n    var firstBumper = React__namespace.useRef(null);\n    var lastBumper = React__namespace.useRef(null);\n    var mergedRootRef = useMergedRefs(root, ref2);\n    var doc = useDocument();\n    var win = useWindowEx();\n    var inShadow = useHasMergeStylesShadowRootContext();\n    var isFirstRender = (_a2 = usePrevious(false)) !== null && _a2 !== void 0 ? _a2 : true;\n    var props = getPropsWithDefaults(DEFAULT_PROPS$5, propsWithoutDefaults);\n    var internalState = useConst({\n      hasFocus: false,\n      focusStackId: useId(\"ftz-\", props.id)\n    });\n    var children2 = props.children, componentRef = props.componentRef, disabled = props.disabled, disableFirstFocus = props.disableFirstFocus, forceFocusInsideTrap = props.forceFocusInsideTrap, focusPreviouslyFocusedInnerElement = props.focusPreviouslyFocusedInnerElement, firstFocusableSelector = props.firstFocusableSelector, firstFocusableTarget = props.firstFocusableTarget, _b2 = props.disableRestoreFocus, disableRestoreFocus = _b2 === void 0 ? props.ignoreExternalFocusing : _b2, isClickableOutsideFocusTrap = props.isClickableOutsideFocusTrap, enableAriaHiddenSiblings = props.enableAriaHiddenSiblings;\n    var bumperProps = {\n      \"aria-hidden\": true,\n      style: {\n        pointerEvents: \"none\",\n        position: \"fixed\"\n        // 'fixed' prevents browsers from scrolling to bumpers when viewport does not contain them\n      },\n      tabIndex: disabled ? -1 : 0,\n      // make bumpers tabbable only when enabled\n      \"data-is-visible\": true,\n      \"data-is-focus-trap-zone-bumper\": true\n    };\n    var focusElementAsync = React__namespace.useCallback(function(element2) {\n      if (element2 !== firstBumper.current && element2 !== lastBumper.current) {\n        focusAsync(element2);\n      }\n    }, []);\n    var focusFTZ = useEventCallback(function() {\n      if (!root.current) {\n        return;\n      }\n      var previouslyFocusedElementInTrapZone = internalState.previouslyFocusedElementInTrapZone;\n      if (focusPreviouslyFocusedInnerElement && previouslyFocusedElementInTrapZone && elementContains(root.current, previouslyFocusedElementInTrapZone)) {\n        focusElementAsync(previouslyFocusedElementInTrapZone);\n        return;\n      }\n      var firstFocusableChild = null;\n      if (typeof firstFocusableTarget === \"string\") {\n        firstFocusableChild = root.current.querySelector(firstFocusableTarget);\n      } else if (firstFocusableTarget) {\n        firstFocusableChild = firstFocusableTarget(root.current);\n      } else if (firstFocusableSelector) {\n        var focusSelector = typeof firstFocusableSelector === \"string\" ? firstFocusableSelector : firstFocusableSelector();\n        firstFocusableChild = root.current.querySelector(\".\" + focusSelector);\n      }\n      if (!firstFocusableChild) {\n        firstFocusableChild = getNextElement(root.current, root.current.firstChild, false, false, false, true, void 0, void 0, void 0, inShadow);\n      }\n      if (firstFocusableChild) {\n        focusElementAsync(firstFocusableChild);\n      }\n    });\n    var focusBumper = function(isFirstBumper) {\n      if (disabled || !root.current) {\n        return;\n      }\n      var nextFocusable = isFirstBumper === internalState.hasFocus ? getLastTabbable(root.current, lastBumper.current, true, false, inShadow) : getFirstTabbable(root.current, firstBumper.current, true, false, inShadow);\n      if (nextFocusable) {\n        if (nextFocusable === firstBumper.current || nextFocusable === lastBumper.current) {\n          focusFTZ();\n        } else {\n          nextFocusable.focus();\n        }\n      }\n    };\n    var onRootBlurCapture = function(ev) {\n      var _a3;\n      (_a3 = props.onBlurCapture) === null || _a3 === void 0 ? void 0 : _a3.call(props, ev);\n      var relatedTarget = ev.relatedTarget;\n      if (ev.relatedTarget === null) {\n        relatedTarget = getActiveElement(doc);\n      }\n      if (!elementContains(root.current, relatedTarget)) {\n        internalState.hasFocus = false;\n      }\n    };\n    var onRootFocusCapture = function(ev) {\n      var _a3;\n      (_a3 = props.onFocusCapture) === null || _a3 === void 0 ? void 0 : _a3.call(props, ev);\n      if (ev.target === firstBumper.current) {\n        focusBumper(true);\n      } else if (ev.target === lastBumper.current) {\n        focusBumper(false);\n      }\n      internalState.hasFocus = true;\n      if (ev.target !== ev.currentTarget && !(ev.target === firstBumper.current || ev.target === lastBumper.current)) {\n        internalState.previouslyFocusedElementInTrapZone = getEventTarget(ev.nativeEvent);\n      }\n    };\n    var returnFocusToInitiator = useEventCallback(function(elementToFocusOnDismiss) {\n      FocusTrapZone.focusStack = FocusTrapZone.focusStack.filter(function(value2) {\n        return internalState.focusStackId !== value2;\n      });\n      if (!doc) {\n        return;\n      }\n      var activeElement = doc.activeElement;\n      if (!disableRestoreFocus && typeof (elementToFocusOnDismiss === null || elementToFocusOnDismiss === void 0 ? void 0 : elementToFocusOnDismiss.focus) === \"function\" && // only restore focus if the current focused element is within the FTZ, or if nothing is focused\n      (elementContains(root.current, activeElement) || activeElement === doc.body || activeElement.shadowRoot)) {\n        focusElementAsync(elementToFocusOnDismiss);\n      }\n    });\n    var forceFocusOrClickInTrap = useEventCallback(function(ev) {\n      if (disabled) {\n        return;\n      }\n      if (internalState.focusStackId === FocusTrapZone.focusStack.slice(-1)[0]) {\n        var targetElement = getEventTarget(ev);\n        if (targetElement && !elementContains(root.current, targetElement)) {\n          if (doc && getActiveElement(doc) === doc.body) {\n            setTimeout(function() {\n              if (doc && getActiveElement(doc) === doc.body) {\n                focusFTZ();\n                internalState.hasFocus = true;\n              }\n            }, 0);\n          } else {\n            focusFTZ();\n            internalState.hasFocus = true;\n          }\n          ev.preventDefault();\n          ev.stopPropagation();\n        }\n      }\n    });\n    React__namespace.useEffect(function() {\n      var disposables = [];\n      if (forceFocusInsideTrap) {\n        disposables.push(on$1(win, \"focus\", forceFocusOrClickInTrap, true));\n      }\n      if (!isClickableOutsideFocusTrap) {\n        disposables.push(on$1(win, \"click\", forceFocusOrClickInTrap, true));\n      }\n      return function() {\n        disposables.forEach(function(dispose) {\n          return dispose();\n        });\n      };\n    }, [forceFocusInsideTrap, isClickableOutsideFocusTrap, win]);\n    React__namespace.useEffect(function() {\n      if (disabled || !isFirstRender && !forceFocusInsideTrap || !root.current) {\n        return;\n      }\n      FocusTrapZone.focusStack.push(internalState.focusStackId);\n      var elementToFocusOnDismiss = props.elementToFocusOnDismiss || getActiveElement(doc);\n      if (!disableFirstFocus && !elementContains(root.current, elementToFocusOnDismiss)) {\n        focusFTZ();\n      }\n      return function() {\n        return returnFocusToInitiator(elementToFocusOnDismiss);\n      };\n    }, [forceFocusInsideTrap, disabled]);\n    React__namespace.useEffect(function() {\n      if (!disabled && enableAriaHiddenSiblings) {\n        var unmodalize2 = modalize(root.current);\n        return unmodalize2;\n      }\n    }, [disabled, enableAriaHiddenSiblings, root]);\n    useUnmount(function() {\n      delete internalState.previouslyFocusedElementInTrapZone;\n    });\n    useComponentRef$6(componentRef, internalState.previouslyFocusedElementInTrapZone, focusFTZ);\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({ \"aria-labelledby\": props.ariaLabelledBy }, getNativeProps(props, divProperties), { ref: mergedRootRef, onFocusCapture: onRootFocusCapture, onBlurCapture: onRootBlurCapture }),\n      React__namespace.createElement(\"div\", __assign$1({}, bumperProps, { ref: firstBumper })),\n      children2,\n      React__namespace.createElement(\"div\", __assign$1({}, bumperProps, { ref: lastBumper }))\n    );\n  });\n  FocusTrapZone.displayName = COMPONENT_NAME$8;\n  FocusTrapZone.focusStack = [];\n  var defaultIconRenderer = function(props) {\n    var item = props.item, classNames2 = props.classNames;\n    var iconProps = item.iconProps;\n    return React__namespace.createElement(Icon, __assign$1({}, iconProps, { className: classNames2.icon }));\n  };\n  var renderItemIcon = function(props) {\n    var item = props.item, hasIcons = props.hasIcons;\n    if (!hasIcons) {\n      return null;\n    }\n    if (item.onRenderIcon) {\n      return item.onRenderIcon(props, defaultIconRenderer);\n    }\n    return defaultIconRenderer(props);\n  };\n  var renderCheckMarkIcon = function(_a2) {\n    var onCheckmarkClick = _a2.onCheckmarkClick, item = _a2.item, classNames2 = _a2.classNames;\n    var isItemChecked = getIsChecked(item);\n    if (onCheckmarkClick) {\n      var onClick = function(e) {\n        return onCheckmarkClick(item, e);\n      };\n      return React__namespace.createElement(Icon, {\n        iconName: item.canCheck !== false && isItemChecked ? \"CheckMark\" : \"\",\n        className: classNames2.checkmarkIcon,\n        // eslint-disable-next-line react/jsx-no-bind\n        onClick\n      });\n    }\n    return null;\n  };\n  var renderItemName = function(_a2) {\n    var item = _a2.item, classNames2 = _a2.classNames;\n    if (item.text || item.name) {\n      return React__namespace.createElement(\"span\", { className: classNames2.label }, item.text || item.name);\n    }\n    return null;\n  };\n  var renderSecondaryText = function(_a2) {\n    var item = _a2.item, classNames2 = _a2.classNames;\n    if (item.secondaryText) {\n      return React__namespace.createElement(\"span\", { className: classNames2.secondaryText }, item.secondaryText);\n    }\n    return null;\n  };\n  var renderSubMenuIcon = function(_a2) {\n    var item = _a2.item, classNames2 = _a2.classNames, theme = _a2.theme;\n    if (hasSubmenu(item)) {\n      return React__namespace.createElement(Icon, __assign$1({ iconName: getRTL(theme) ? \"ChevronLeft\" : \"ChevronRight\" }, item.submenuIconProps, { className: classNames2.subMenuIcon }));\n    }\n    return null;\n  };\n  var ContextualMenuItemBase = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuItemBase2, _super);\n      function ContextualMenuItemBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this.openSubMenu = function() {\n          var _a2 = _this.props, item = _a2.item, openSubMenu = _a2.openSubMenu, getSubmenuTarget = _a2.getSubmenuTarget;\n          if (getSubmenuTarget) {\n            var submenuTarget = getSubmenuTarget();\n            if (hasSubmenu(item) && openSubMenu && submenuTarget) {\n              openSubMenu(item, submenuTarget);\n            }\n          }\n        };\n        _this.dismissSubMenu = function() {\n          var _a2 = _this.props, item = _a2.item, dismissSubMenu = _a2.dismissSubMenu;\n          if (hasSubmenu(item) && dismissSubMenu) {\n            dismissSubMenu();\n          }\n        };\n        _this.dismissMenu = function(dismissAll) {\n          var dismissMenu = _this.props.dismissMenu;\n          if (dismissMenu) {\n            dismissMenu(void 0, dismissAll);\n          }\n        };\n        initializeComponentRef(_this);\n        return _this;\n      }\n      ContextualMenuItemBase2.prototype.render = function() {\n        var _a2 = this.props, item = _a2.item, classNames2 = _a2.classNames;\n        var renderContent = item.onRenderContent || this._renderLayout;\n        return React__namespace.createElement(\"div\", { className: item.split ? classNames2.linkContentMenu : classNames2.linkContent }, renderContent(this.props, {\n          renderCheckMarkIcon,\n          renderItemIcon,\n          renderItemName,\n          renderSecondaryText,\n          renderSubMenuIcon\n        }));\n      };\n      ContextualMenuItemBase2.prototype._renderLayout = function(props, defaultRenders) {\n        return React__namespace.createElement(\n          React__namespace.Fragment,\n          null,\n          defaultRenders.renderCheckMarkIcon(props),\n          defaultRenders.renderItemIcon(props),\n          defaultRenders.renderItemName(props),\n          defaultRenders.renderSecondaryText(props),\n          defaultRenders.renderSubMenuIcon(props)\n        );\n      };\n      return ContextualMenuItemBase2;\n    })(React__namespace.Component)\n  );\n  var getDividerClassNames = memoizeFunction(\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    function(theme) {\n      return mergeStyleSets({\n        wrapper: {\n          display: \"inline-flex\",\n          height: \"100%\",\n          alignItems: \"center\"\n        },\n        divider: {\n          width: 1,\n          height: \"100%\",\n          backgroundColor: theme.palette.neutralTertiaryAlt\n        }\n      });\n    }\n  );\n  var CONTEXTUAL_MENU_ITEM_HEIGHT = 36;\n  var MediumScreenSelector$1 = getScreenSelector(0, ScreenWidthMaxMedium);\n  var getMenuItemStyles = memoizeFunction(function(theme) {\n    var _a2, _b2, _c2, _d2, _e2;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, palette = theme.palette;\n    var ContextualMenuItemBackgroundHoverColor = semanticColors.menuItemBackgroundHovered;\n    var ContextualMenuItemTextHoverColor = semanticColors.menuItemTextHovered;\n    var ContextualMenuItemBackgroundSelectedColor = semanticColors.menuItemBackgroundPressed;\n    var ContextualMenuItemDividerColor = semanticColors.bodyDivider;\n    var menuItemStyles = {\n      item: [\n        fonts.medium,\n        {\n          color: semanticColors.bodyText,\n          position: \"relative\",\n          boxSizing: \"border-box\"\n        }\n      ],\n      divider: {\n        display: \"block\",\n        height: \"1px\",\n        backgroundColor: ContextualMenuItemDividerColor,\n        position: \"relative\"\n      },\n      root: [\n        getFocusStyle(theme),\n        fonts.medium,\n        {\n          color: semanticColors.bodyText,\n          backgroundColor: \"transparent\",\n          border: \"none\",\n          width: \"100%\",\n          height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          lineHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          display: \"block\",\n          cursor: \"pointer\",\n          padding: \"0px 8px 0 4px\",\n          // inner elements have a margin of 4px (4 + 4 = 8px as on right side)\n          textAlign: \"left\"\n        }\n      ],\n      rootDisabled: {\n        color: semanticColors.disabledBodyText,\n        cursor: \"default\",\n        pointerEvents: \"none\",\n        selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n          // ensure disabled text looks different than enabled\n          color: \"GrayText\",\n          opacity: 1\n        }, _a2)\n      },\n      rootHovered: {\n        backgroundColor: ContextualMenuItemBackgroundHoverColor,\n        color: ContextualMenuItemTextHoverColor,\n        selectors: {\n          \".ms-ContextualMenu-icon\": {\n            color: palette.themeDarkAlt\n          },\n          \".ms-ContextualMenu-submenuIcon\": {\n            color: palette.neutralPrimary\n          }\n        }\n      },\n      rootFocused: {\n        backgroundColor: palette.white\n      },\n      rootChecked: {\n        selectors: {\n          \".ms-ContextualMenu-checkmarkIcon\": {\n            color: palette.neutralPrimary\n          }\n        }\n      },\n      rootPressed: {\n        backgroundColor: ContextualMenuItemBackgroundSelectedColor,\n        selectors: {\n          \".ms-ContextualMenu-icon\": {\n            color: palette.themeDark\n          },\n          \".ms-ContextualMenu-submenuIcon\": {\n            color: palette.neutralPrimary\n          }\n        }\n      },\n      rootExpanded: {\n        backgroundColor: ContextualMenuItemBackgroundSelectedColor,\n        color: semanticColors.bodyTextChecked,\n        selectors: (_b2 = {\n          \".ms-ContextualMenu-submenuIcon\": (_c2 = {}, _c2[HighContrastSelector] = {\n            // icons inside of anchor tags are not properly inheriting color in high contrast\n            color: \"inherit\"\n          }, _c2)\n        }, _b2[HighContrastSelector] = __assign$1({}, getHighContrastNoAdjustStyle()), _b2)\n      },\n      linkContent: {\n        whiteSpace: \"nowrap\",\n        height: \"inherit\",\n        display: \"flex\",\n        alignItems: \"center\",\n        maxWidth: \"100%\"\n      },\n      anchorLink: {\n        padding: \"0px 8px 0 4px\",\n        // inner elements have a margin of 4px (4 + 4 = 8px as on right side)\n        textRendering: \"auto\",\n        color: \"inherit\",\n        letterSpacing: \"normal\",\n        wordSpacing: \"normal\",\n        textTransform: \"none\",\n        textIndent: \"0px\",\n        textShadow: \"none\",\n        textDecoration: \"none\",\n        boxSizing: \"border-box\"\n      },\n      label: {\n        margin: \"0 4px\",\n        verticalAlign: \"middle\",\n        display: \"inline-block\",\n        flexGrow: \"1\",\n        textOverflow: \"ellipsis\",\n        whiteSpace: \"nowrap\",\n        overflow: \"hidden\"\n      },\n      secondaryText: {\n        color: theme.palette.neutralSecondary,\n        paddingLeft: \"20px\",\n        textAlign: \"right\"\n      },\n      icon: {\n        display: \"inline-block\",\n        minHeight: \"1px\",\n        maxHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n        fontSize: IconFontSizes.medium,\n        width: IconFontSizes.medium,\n        margin: \"0 4px\",\n        verticalAlign: \"middle\",\n        flexShrink: \"0\",\n        selectors: (_d2 = {}, _d2[MediumScreenSelector$1] = {\n          fontSize: IconFontSizes.large,\n          width: IconFontSizes.large\n        }, _d2)\n      },\n      iconColor: {\n        color: semanticColors.menuIcon\n      },\n      iconDisabled: {\n        color: semanticColors.disabledBodyText\n      },\n      checkmarkIcon: {\n        color: semanticColors.bodySubtext\n      },\n      subMenuIcon: {\n        height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n        lineHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n        color: palette.neutralSecondary,\n        textAlign: \"center\",\n        display: \"inline-block\",\n        verticalAlign: \"middle\",\n        flexShrink: \"0\",\n        fontSize: IconFontSizes.small,\n        // 12px\n        selectors: (_e2 = {\n          \":hover\": {\n            color: palette.neutralPrimary\n          },\n          \":active\": {\n            color: palette.neutralPrimary\n          }\n        }, _e2[MediumScreenSelector$1] = {\n          fontSize: IconFontSizes.medium\n          // 16px\n        }, _e2)\n      },\n      splitButtonFlexContainer: [\n        getFocusStyle(theme),\n        {\n          display: \"flex\",\n          height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          flexWrap: \"nowrap\",\n          justifyContent: \"center\",\n          alignItems: \"flex-start\"\n        }\n      ]\n    };\n    return concatStyleSets(menuItemStyles);\n  });\n  var CONTEXTUAL_SPLIT_MENU_MINWIDTH = \"28px\";\n  var MediumScreenSelector = getScreenSelector(0, ScreenWidthMaxMedium);\n  var getSplitButtonVerticalDividerClassNames = memoizeFunction(\n    /* eslint-disable @typescript-eslint/no-deprecated */\n    function(theme) {\n      var _a2;\n      return mergeStyleSets(getDividerClassNames(theme), {\n        /* eslint-enable @typescript-eslint/no-deprecated */\n        wrapper: {\n          position: \"absolute\",\n          right: 28,\n          // width of the splitMenu based on the padding plus icon fontSize\n          selectors: (_a2 = {}, _a2[MediumScreenSelector] = {\n            right: 32\n            // fontSize of the icon increased from 12px to 16px\n          }, _a2)\n        },\n        divider: {\n          height: 16,\n          width: 1\n        }\n      });\n    }\n  );\n  var GlobalClassNames$d = {\n    item: \"ms-ContextualMenu-item\",\n    divider: \"ms-ContextualMenu-divider\",\n    root: \"ms-ContextualMenu-link\",\n    isChecked: \"is-checked\",\n    isExpanded: \"is-expanded\",\n    isDisabled: \"is-disabled\",\n    linkContent: \"ms-ContextualMenu-linkContent\",\n    linkContentMenu: \"ms-ContextualMenu-linkContent\",\n    icon: \"ms-ContextualMenu-icon\",\n    iconColor: \"ms-ContextualMenu-iconColor\",\n    checkmarkIcon: \"ms-ContextualMenu-checkmarkIcon\",\n    subMenuIcon: \"ms-ContextualMenu-submenuIcon\",\n    label: \"ms-ContextualMenu-itemText\",\n    secondaryText: \"ms-ContextualMenu-secondaryText\",\n    splitMenu: \"ms-ContextualMenu-splitMenu\",\n    screenReaderText: \"ms-ContextualMenu-screenReaderText\"\n  };\n  var getItemClassNames = memoizeFunction(function(theme, disabled, expanded, checked, isAnchorLink, knownIcon, itemClassName, dividerClassName, iconClassName, subMenuClassName, primaryDisabled, className2) {\n    var _a2, _b2, _c2, _d2;\n    var styles = getMenuItemStyles(theme);\n    var classNames2 = getGlobalClassNames(GlobalClassNames$d, theme);\n    return mergeStyleSets({\n      item: [classNames2.item, styles.item, itemClassName],\n      divider: [classNames2.divider, styles.divider, dividerClassName],\n      root: [\n        classNames2.root,\n        styles.root,\n        checked && [classNames2.isChecked, styles.rootChecked],\n        isAnchorLink && styles.anchorLink,\n        expanded && [classNames2.isExpanded, styles.rootExpanded],\n        disabled && [classNames2.isDisabled, styles.rootDisabled],\n        !disabled && !expanded && [\n          {\n            selectors: (_a2 = {\n              \":hover\": styles.rootHovered,\n              \":active\": styles.rootPressed\n            }, // eslint-disable-next-line @fluentui/max-len\n            _a2[\".\".concat(IsFocusVisibleClassName, \" &:focus, .\").concat(IsFocusVisibleClassName, \" &:focus:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:hover\")] = styles.rootFocused, _a2[\".\".concat(IsFocusVisibleClassName, \" &:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:hover\")] = {\n              background: \"inherit;\"\n            }, _a2)\n          }\n        ],\n        className2\n      ],\n      splitPrimary: [\n        styles.root,\n        {\n          width: \"calc(100% - \".concat(CONTEXTUAL_SPLIT_MENU_MINWIDTH, \")\")\n        },\n        checked && [\"is-checked\", styles.rootChecked],\n        (disabled || primaryDisabled) && [\"is-disabled\", styles.rootDisabled],\n        !(disabled || primaryDisabled) && !checked && [\n          {\n            selectors: (_b2 = {\n              \":hover\": styles.rootHovered\n            }, // when hovering over the splitPrimary also affect the splitMenu\n            _b2[\":hover ~ .\".concat(classNames2.splitMenu)] = styles.rootHovered, _b2[\":active\"] = styles.rootPressed, // eslint-disable-next-line @fluentui/max-len\n            _b2[\".\".concat(IsFocusVisibleClassName, \" &:focus, .\").concat(IsFocusVisibleClassName, \" &:focus:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:hover\")] = styles.rootFocused, _b2[\".\".concat(IsFocusVisibleClassName, \" &:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:hover\")] = {\n              background: \"inherit;\"\n            }, _b2)\n          }\n        ]\n      ],\n      splitMenu: [\n        classNames2.splitMenu,\n        styles.root,\n        {\n          flexBasis: \"0\",\n          padding: \"0 8px\",\n          minWidth: CONTEXTUAL_SPLIT_MENU_MINWIDTH\n        },\n        expanded && [\"is-expanded\", styles.rootExpanded],\n        disabled && [\"is-disabled\", styles.rootDisabled],\n        !disabled && !expanded && [\n          {\n            selectors: (_c2 = {\n              \":hover\": styles.rootHovered,\n              \":active\": styles.rootPressed\n            }, // eslint-disable-next-line @fluentui/max-len\n            _c2[\".\".concat(IsFocusVisibleClassName, \" &:focus, .\").concat(IsFocusVisibleClassName, \" &:focus:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:hover\")] = styles.rootFocused, _c2[\".\".concat(IsFocusVisibleClassName, \" &:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:hover\")] = {\n              background: \"inherit;\"\n            }, _c2)\n          }\n        ]\n      ],\n      anchorLink: styles.anchorLink,\n      linkContent: [classNames2.linkContent, styles.linkContent],\n      linkContentMenu: [\n        classNames2.linkContentMenu,\n        styles.linkContent,\n        {\n          justifyContent: \"center\"\n        }\n      ],\n      icon: [\n        classNames2.icon,\n        knownIcon && styles.iconColor,\n        styles.icon,\n        iconClassName,\n        disabled && [classNames2.isDisabled, styles.iconDisabled]\n      ],\n      iconColor: styles.iconColor,\n      checkmarkIcon: [classNames2.checkmarkIcon, knownIcon && styles.checkmarkIcon, styles.icon, iconClassName],\n      subMenuIcon: [\n        classNames2.subMenuIcon,\n        styles.subMenuIcon,\n        subMenuClassName,\n        expanded && { color: theme.palette.neutralPrimary },\n        disabled && [styles.iconDisabled]\n      ],\n      label: [classNames2.label, styles.label],\n      secondaryText: [classNames2.secondaryText, styles.secondaryText],\n      splitContainer: [\n        styles.splitButtonFlexContainer,\n        !disabled && !checked && [\n          {\n            selectors: (_d2 = {}, // eslint-disable-next-line @fluentui/max-len\n            _d2[\".\".concat(IsFocusVisibleClassName, \" &:focus, .\").concat(IsFocusVisibleClassName, \" &:focus:hover, :host(.\").concat(IsFocusVisibleClassName, \") &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:hover\")] = styles.rootFocused, _d2)\n          }\n        ]\n      ],\n      screenReaderText: [\n        classNames2.screenReaderText,\n        styles.screenReaderText,\n        hiddenContentStyle,\n        { visibility: \"hidden\" }\n      ]\n    });\n  });\n  var getItemStyles = function(props) {\n    var theme = props.theme, disabled = props.disabled, expanded = props.expanded, checked = props.checked, isAnchorLink = props.isAnchorLink, knownIcon = props.knownIcon, itemClassName = props.itemClassName, dividerClassName = props.dividerClassName, iconClassName = props.iconClassName, subMenuClassName = props.subMenuClassName, primaryDisabled = props.primaryDisabled, className2 = props.className;\n    return getItemClassNames(theme, disabled, expanded, checked, isAnchorLink, knownIcon, itemClassName, dividerClassName, iconClassName, subMenuClassName, primaryDisabled, className2);\n  };\n  var ContextualMenuItem = styled(ContextualMenuItemBase, getItemStyles, void 0, { scope: \"ContextualMenuItem\" });\n  var ContextualMenuItemWrapper = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuItemWrapper2, _super);\n      function ContextualMenuItemWrapper2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._onItemMouseEnter = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseEnter = _a2.onItemMouseEnter;\n          if (onItemMouseEnter) {\n            onItemMouseEnter(item, ev, ev.currentTarget);\n          }\n        };\n        _this._onItemClick = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemClickBase = _a2.onItemClickBase;\n          if (onItemClickBase) {\n            onItemClickBase(item, ev, ev.currentTarget);\n          }\n        };\n        _this._onItemMouseLeave = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseLeave = _a2.onItemMouseLeave;\n          if (onItemMouseLeave) {\n            onItemMouseLeave(item, ev);\n          }\n        };\n        _this._onItemKeyDown = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemKeyDown = _a2.onItemKeyDown;\n          if (onItemKeyDown) {\n            onItemKeyDown(item, ev);\n          }\n        };\n        _this._onItemMouseMove = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseMove = _a2.onItemMouseMove;\n          if (onItemMouseMove) {\n            onItemMouseMove(item, ev, ev.currentTarget);\n          }\n        };\n        _this._getSubmenuTarget = function() {\n          return void 0;\n        };\n        initializeComponentRef(_this);\n        return _this;\n      }\n      ContextualMenuItemWrapper2.prototype.shouldComponentUpdate = function(newProps) {\n        return !shallowCompare(newProps, this.props);\n      };\n      return ContextualMenuItemWrapper2;\n    })(React__namespace.Component)\n  );\n  var KTP_PREFIX = \"ktp\";\n  var KTP_SEPARATOR = \"-\";\n  var DATAKTP_TARGET = \"data-ktp-target\";\n  var DATAKTP_EXECUTE_TARGET = \"data-ktp-execute-target\";\n  var KTP_LAYER_ID = \"ktp-layer-id\";\n  var KeytipEvents;\n  (function(KeytipEvents2) {\n    KeytipEvents2.KEYTIP_ADDED = \"keytipAdded\";\n    KeytipEvents2.KEYTIP_REMOVED = \"keytipRemoved\";\n    KeytipEvents2.KEYTIP_UPDATED = \"keytipUpdated\";\n    KeytipEvents2.PERSISTED_KEYTIP_ADDED = \"persistedKeytipAdded\";\n    KeytipEvents2.PERSISTED_KEYTIP_REMOVED = \"persistedKeytipRemoved\";\n    KeytipEvents2.PERSISTED_KEYTIP_EXECUTE = \"persistedKeytipExecute\";\n    KeytipEvents2.ENTER_KEYTIP_MODE = \"enterKeytipMode\";\n    KeytipEvents2.EXIT_KEYTIP_MODE = \"exitKeytipMode\";\n  })(KeytipEvents || (KeytipEvents = {}));\n  var KeytipManager = (\n    /** @class */\n    (function() {\n      function KeytipManager2() {\n        this.keytips = {};\n        this.persistedKeytips = {};\n        this.sequenceMapping = {};\n        this.inKeytipMode = false;\n        this.shouldEnterKeytipMode = true;\n        this.delayUpdatingKeytipChange = false;\n      }\n      KeytipManager2.getInstance = function() {\n        return this._instance;\n      };\n      KeytipManager2.prototype.init = function(delayUpdatingKeytipChange) {\n        this.delayUpdatingKeytipChange = delayUpdatingKeytipChange;\n      };\n      KeytipManager2.prototype.register = function(keytipProps, persisted) {\n        if (persisted === void 0) {\n          persisted = false;\n        }\n        var props = keytipProps;\n        if (!persisted) {\n          props = this.addParentOverflow(keytipProps);\n          this.sequenceMapping[props.keySequences.toString()] = props;\n        }\n        var uniqueKeytip = this._getUniqueKtp(props);\n        persisted ? this.persistedKeytips[uniqueKeytip.uniqueID] = uniqueKeytip : this.keytips[uniqueKeytip.uniqueID] = uniqueKeytip;\n        if (this.inKeytipMode || !this.delayUpdatingKeytipChange) {\n          var event_1 = persisted ? KeytipEvents.PERSISTED_KEYTIP_ADDED : KeytipEvents.KEYTIP_ADDED;\n          EventGroup.raise(this, event_1, {\n            keytip: props,\n            uniqueID: uniqueKeytip.uniqueID\n          });\n        }\n        return uniqueKeytip.uniqueID;\n      };\n      KeytipManager2.prototype.update = function(keytipProps, uniqueID) {\n        var newKeytipProps = this.addParentOverflow(keytipProps);\n        var uniqueKeytip = this._getUniqueKtp(newKeytipProps, uniqueID);\n        var oldKeyTip = this.keytips[uniqueID];\n        if (oldKeyTip) {\n          uniqueKeytip.keytip.visible = oldKeyTip.keytip.visible;\n          this.keytips[uniqueID] = uniqueKeytip;\n          delete this.sequenceMapping[oldKeyTip.keytip.keySequences.toString()];\n          this.sequenceMapping[uniqueKeytip.keytip.keySequences.toString()] = uniqueKeytip.keytip;\n          if (this.inKeytipMode || !this.delayUpdatingKeytipChange) {\n            EventGroup.raise(this, KeytipEvents.KEYTIP_UPDATED, {\n              keytip: uniqueKeytip.keytip,\n              uniqueID: uniqueKeytip.uniqueID\n            });\n          }\n        }\n      };\n      KeytipManager2.prototype.unregister = function(keytipToRemove, uniqueID, persisted) {\n        if (persisted === void 0) {\n          persisted = false;\n        }\n        persisted ? delete this.persistedKeytips[uniqueID] : delete this.keytips[uniqueID];\n        !persisted && delete this.sequenceMapping[keytipToRemove.keySequences.toString()];\n        var event2 = persisted ? KeytipEvents.PERSISTED_KEYTIP_REMOVED : KeytipEvents.KEYTIP_REMOVED;\n        if (this.inKeytipMode || !this.delayUpdatingKeytipChange) {\n          EventGroup.raise(this, event2, {\n            keytip: keytipToRemove,\n            uniqueID\n          });\n        }\n      };\n      KeytipManager2.prototype.enterKeytipMode = function() {\n        EventGroup.raise(this, KeytipEvents.ENTER_KEYTIP_MODE);\n      };\n      KeytipManager2.prototype.exitKeytipMode = function() {\n        EventGroup.raise(this, KeytipEvents.EXIT_KEYTIP_MODE);\n      };\n      KeytipManager2.prototype.getKeytips = function() {\n        var _this = this;\n        return Object.keys(this.keytips).map(function(key2) {\n          return _this.keytips[key2].keytip;\n        });\n      };\n      KeytipManager2.prototype.addParentOverflow = function(keytipProps) {\n        var fullSequence = __spreadArray([], keytipProps.keySequences, true);\n        fullSequence.pop();\n        if (fullSequence.length !== 0) {\n          var parentKeytip = this.sequenceMapping[fullSequence.toString()];\n          if (parentKeytip && parentKeytip.overflowSetSequence) {\n            return __assign$1(__assign$1({}, keytipProps), { overflowSetSequence: parentKeytip.overflowSetSequence });\n          }\n        }\n        return keytipProps;\n      };\n      KeytipManager2.prototype.menuExecute = function(overflowButtonSequences, keytipSequences) {\n        EventGroup.raise(this, KeytipEvents.PERSISTED_KEYTIP_EXECUTE, {\n          overflowButtonSequences,\n          keytipSequences\n        });\n      };\n      KeytipManager2.prototype._getUniqueKtp = function(keytipProps, uniqueID) {\n        if (uniqueID === void 0) {\n          uniqueID = getId();\n        }\n        return { keytip: __assign$1({}, keytipProps), uniqueID };\n      };\n      KeytipManager2._instance = new KeytipManager2();\n      return KeytipManager2;\n    })()\n  );\n  function sequencesToID(keySequences) {\n    return keySequences.reduce(function(prevValue, keySequence) {\n      return prevValue + KTP_SEPARATOR + keySequence.split(\"\").join(KTP_SEPARATOR);\n    }, KTP_PREFIX);\n  }\n  function mergeOverflows(keySequences, overflowKeySequences) {\n    var overflowSequenceLen = overflowKeySequences.length;\n    var overflowSequence = __spreadArray([], overflowKeySequences, true).pop();\n    var newKeySequences = __spreadArray([], keySequences, true);\n    return addElementAtIndex(newKeySequences, overflowSequenceLen - 1, overflowSequence);\n  }\n  function getAriaDescribedBy(keySequences) {\n    var describedby = \" \" + KTP_LAYER_ID;\n    if (!keySequences.length) {\n      return describedby;\n    }\n    return describedby + \" \" + sequencesToID(keySequences);\n  }\n  function useKeytipData(options2) {\n    var uniqueId = React__namespace.useRef(void 0);\n    var keytipProps = options2.keytipProps ? __assign$1({ disabled: options2.disabled }, options2.keytipProps) : void 0;\n    var keytipManager = useConst(KeytipManager.getInstance());\n    var prevOptions = usePrevious(options2);\n    useIsomorphicLayoutEffect(function() {\n      if (uniqueId.current && keytipProps && ((prevOptions === null || prevOptions === void 0 ? void 0 : prevOptions.keytipProps) !== options2.keytipProps || (prevOptions === null || prevOptions === void 0 ? void 0 : prevOptions.disabled) !== options2.disabled)) {\n        keytipManager.update(keytipProps, uniqueId.current);\n      }\n    });\n    useIsomorphicLayoutEffect(function() {\n      if (keytipProps) {\n        uniqueId.current = keytipManager.register(keytipProps);\n      }\n      return function() {\n        keytipProps && keytipManager.unregister(keytipProps, uniqueId.current);\n      };\n    }, []);\n    var nativeKeytipProps = {\n      ariaDescribedBy: options2.ariaDescribedBy,\n      keytipId: void 0\n    };\n    if (keytipProps) {\n      nativeKeytipProps = getKeytipData(keytipManager, keytipProps, options2.ariaDescribedBy);\n    }\n    return nativeKeytipProps;\n  }\n  function getKeytipData(keytipManager, keytipProps, describedByPrepend) {\n    var newKeytipProps = keytipManager.addParentOverflow(keytipProps);\n    var ariaDescribedBy = mergeAriaAttributeValues(describedByPrepend, getAriaDescribedBy(newKeytipProps.keySequences));\n    var keySequences = __spreadArray([], newKeytipProps.keySequences, true);\n    if (newKeytipProps.overflowSetSequence) {\n      keySequences = mergeOverflows(keySequences, newKeytipProps.overflowSetSequence);\n    }\n    var keytipId = sequencesToID(keySequences);\n    return {\n      ariaDescribedBy,\n      keytipId\n    };\n  }\n  var KeytipData = function(props) {\n    var _a2;\n    var children2 = props.children, keytipDataProps = __rest(props, [\"children\"]);\n    var _b2 = useKeytipData(keytipDataProps), keytipId = _b2.keytipId, ariaDescribedBy = _b2.ariaDescribedBy;\n    return children2((_a2 = {}, _a2[DATAKTP_TARGET] = keytipId, _a2[DATAKTP_EXECUTE_TARGET] = keytipId, _a2[\"aria-describedby\"] = ariaDescribedBy, _a2));\n  };\n  var ContextualMenuAnchor = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuAnchor2, _super);\n      function ContextualMenuAnchor2() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._anchor = React__namespace.createRef();\n        _this._getMemoizedMenuButtonKeytipProps = memoizeFunction(function(keytipProps) {\n          return __assign$1(__assign$1({}, keytipProps), { hasMenu: true });\n        });\n        _this._getSubmenuTarget = function() {\n          return _this._anchor.current ? _this._anchor.current : void 0;\n        };\n        _this._onItemClick = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemClick = _a2.onItemClick;\n          if (onItemClick) {\n            onItemClick(item, ev);\n          }\n        };\n        _this._renderAriaDescription = function(ariaDescription, className2) {\n          return ariaDescription ? React__namespace.createElement(\"span\", { id: _this._ariaDescriptionId, className: className2 }, ariaDescription) : null;\n        };\n        return _this;\n      }\n      ContextualMenuAnchor2.prototype.render = function() {\n        var _this = this;\n        var _a2 = this.props, item = _a2.item, classNames2 = _a2.classNames, index2 = _a2.index, focusableElementIndex = _a2.focusableElementIndex, totalItemCount = _a2.totalItemCount, hasCheckmarks = _a2.hasCheckmarks, hasIcons = _a2.hasIcons, expandedMenuItemKey = _a2.expandedMenuItemKey, onItemClick = _a2.onItemClick, openSubMenu = _a2.openSubMenu, dismissSubMenu = _a2.dismissSubMenu, dismissMenu = _a2.dismissMenu;\n        var ChildrenRenderer = ContextualMenuItem;\n        if (this.props.item.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(this.props.item.contextualMenuItemAs, ChildrenRenderer);\n        }\n        if (this.props.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(this.props.contextualMenuItemAs, ChildrenRenderer);\n        }\n        var anchorRel = item.rel;\n        if (item.target && item.target.toLowerCase() === \"_blank\") {\n          anchorRel = anchorRel ? anchorRel : \"nofollow noopener noreferrer\";\n        }\n        var itemHasSubmenu = hasSubmenu(item);\n        var nativeProps = getNativeProps(item, anchorProperties);\n        var disabled = isItemDisabled(item);\n        var itemProps = item.itemProps, ariaDescription = item.ariaDescription;\n        var keytipProps = item.keytipProps;\n        if (keytipProps && itemHasSubmenu) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        if (ariaDescription) {\n          this._ariaDescriptionId = getId();\n        }\n        var ariaDescribedByIds = mergeAriaAttributeValues(item.ariaDescribedBy, ariaDescription ? this._ariaDescriptionId : void 0, nativeProps[\"aria-describedby\"]);\n        var additionalItemProperties = {\n          \"aria-describedby\": ariaDescribedByIds\n        };\n        return React__namespace.createElement(\n          \"div\",\n          null,\n          React__namespace.createElement(KeytipData, { keytipProps: item.keytipProps, ariaDescribedBy: ariaDescribedByIds, disabled }, function(keytipAttributes) {\n            return React__namespace.createElement(\n              \"a\",\n              __assign$1({}, additionalItemProperties, nativeProps, keytipAttributes, {\n                ref: _this._anchor,\n                href: item.href,\n                target: item.target,\n                rel: anchorRel,\n                className: classNames2.root,\n                role: \"menuitem\",\n                \"aria-haspopup\": itemHasSubmenu || void 0,\n                \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : void 0,\n                \"aria-posinset\": focusableElementIndex + 1,\n                \"aria-setsize\": totalItemCount,\n                \"aria-disabled\": isItemDisabled(item),\n                // eslint-disable-next-line @typescript-eslint/no-deprecated\n                style: item.style,\n                onClick: _this._onItemClick,\n                onMouseEnter: _this._onItemMouseEnter,\n                onMouseLeave: _this._onItemMouseLeave,\n                onMouseMove: _this._onItemMouseMove,\n                onKeyDown: itemHasSubmenu ? _this._onItemKeyDown : void 0\n              }),\n              React__namespace.createElement(ChildrenRenderer, __assign$1({ componentRef: item.componentRef, item, classNames: classNames2, index: index2, onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : void 0, hasIcons, openSubMenu, dismissSubMenu, dismissMenu, getSubmenuTarget: _this._getSubmenuTarget }, itemProps)),\n              _this._renderAriaDescription(ariaDescription, classNames2.screenReaderText)\n            );\n          })\n        );\n      };\n      return ContextualMenuAnchor2;\n    })(ContextualMenuItemWrapper)\n  );\n  var ContextualMenuButton = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuButton2, _super);\n      function ContextualMenuButton2() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._btn = React__namespace.createRef();\n        _this._getMemoizedMenuButtonKeytipProps = memoizeFunction(function(keytipProps) {\n          return __assign$1(__assign$1({}, keytipProps), { hasMenu: true });\n        });\n        _this._renderAriaDescription = function(ariaDescription, className2) {\n          return ariaDescription ? React__namespace.createElement(\"span\", { id: _this._ariaDescriptionId, className: className2 }, ariaDescription) : null;\n        };\n        _this._getSubmenuTarget = function() {\n          return _this._btn.current ? _this._btn.current : void 0;\n        };\n        return _this;\n      }\n      ContextualMenuButton2.prototype.render = function() {\n        var _this = this;\n        var _a2 = this.props, item = _a2.item, classNames2 = _a2.classNames, index2 = _a2.index, focusableElementIndex = _a2.focusableElementIndex, totalItemCount = _a2.totalItemCount, hasCheckmarks = _a2.hasCheckmarks, hasIcons = _a2.hasIcons, contextualMenuItemAs = _a2.contextualMenuItemAs, expandedMenuItemKey = _a2.expandedMenuItemKey, onItemMouseDown2 = _a2.onItemMouseDown, onItemClick = _a2.onItemClick, openSubMenu = _a2.openSubMenu, dismissSubMenu = _a2.dismissSubMenu, dismissMenu = _a2.dismissMenu;\n        var ChildrenRenderer = ContextualMenuItem;\n        if (item.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(item.contextualMenuItemAs, ChildrenRenderer);\n        }\n        if (contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(contextualMenuItemAs, ChildrenRenderer);\n        }\n        var isChecked = getIsChecked(item);\n        var canCheck = isChecked !== null;\n        var defaultRole = getMenuItemAriaRole(item);\n        var itemHasSubmenu = hasSubmenu(item);\n        var itemProps = item.itemProps, ariaLabel2 = item.ariaLabel, ariaDescription = item.ariaDescription;\n        var buttonNativeProperties = getNativeProps(item, buttonProperties);\n        delete buttonNativeProperties.disabled;\n        var itemRole = item.role || defaultRole;\n        if (ariaDescription) {\n          this._ariaDescriptionId = getId();\n        }\n        var ariaDescribedByIds = mergeAriaAttributeValues(item.ariaDescribedBy, ariaDescription ? this._ariaDescriptionId : void 0, buttonNativeProperties[\"aria-describedby\"]);\n        var itemButtonProperties = {\n          className: classNames2.root,\n          onClick: this._onItemClick,\n          onKeyDown: itemHasSubmenu ? this._onItemKeyDown : void 0,\n          onMouseEnter: this._onItemMouseEnter,\n          onMouseLeave: this._onItemMouseLeave,\n          onMouseDown: function(ev) {\n            return onItemMouseDown2 ? onItemMouseDown2(item, ev) : void 0;\n          },\n          onMouseMove: this._onItemMouseMove,\n          href: item.href,\n          title: item.title,\n          \"aria-label\": ariaLabel2,\n          \"aria-describedby\": ariaDescribedByIds,\n          \"aria-haspopup\": itemHasSubmenu || void 0,\n          \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : void 0,\n          \"aria-posinset\": focusableElementIndex + 1,\n          \"aria-setsize\": totalItemCount,\n          \"aria-disabled\": isItemDisabled(item),\n          \"aria-checked\": (itemRole === \"menuitemcheckbox\" || itemRole === \"menuitemradio\") && canCheck ? !!isChecked : void 0,\n          \"aria-selected\": itemRole === \"menuitem\" && canCheck ? !!isChecked : void 0,\n          role: itemRole,\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          style: item.style\n        };\n        var keytipProps = item.keytipProps;\n        if (keytipProps && itemHasSubmenu) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        return React__namespace.createElement(KeytipData, { keytipProps, ariaDescribedBy: ariaDescribedByIds, disabled: isItemDisabled(item) }, function(keytipAttributes) {\n          return React__namespace.createElement(\n            \"button\",\n            __assign$1({ ref: _this._btn }, buttonNativeProperties, itemButtonProperties, keytipAttributes),\n            React__namespace.createElement(ChildrenRenderer, __assign$1({ componentRef: item.componentRef, item, classNames: classNames2, index: index2, onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : void 0, hasIcons, openSubMenu, dismissSubMenu, dismissMenu, getSubmenuTarget: _this._getSubmenuTarget }, itemProps)),\n            _this._renderAriaDescription(ariaDescription, classNames2.screenReaderText)\n          );\n        });\n      };\n      return ContextualMenuButton2;\n    })(ContextualMenuItemWrapper)\n  );\n  var getStyles$r = function(props) {\n    var theme = props.theme, getClassNames2 = props.getClassNames, className2 = props.className;\n    if (!theme) {\n      throw new Error(\"Theme is undefined or null.\");\n    }\n    if (getClassNames2) {\n      var names = getClassNames2(theme);\n      return {\n        wrapper: [names.wrapper],\n        divider: [names.divider]\n      };\n    }\n    return {\n      wrapper: [\n        {\n          display: \"inline-flex\",\n          height: \"100%\",\n          alignItems: \"center\"\n        },\n        className2\n      ],\n      divider: [\n        {\n          width: 1,\n          height: \"100%\",\n          backgroundColor: theme.palette.neutralTertiaryAlt\n        }\n      ]\n    };\n  };\n  var getClassNames$m = classNamesFunction();\n  var VerticalDividerBase = React__namespace.forwardRef(function(props, ref2) {\n    var styles = props.styles, theme = props.theme, deprecatedGetClassNames = props.getClassNames, className2 = props.className;\n    var classNames2 = getClassNames$m(styles, { theme, getClassNames: deprecatedGetClassNames, className: className2 });\n    return React__namespace.createElement(\n      \"span\",\n      { className: classNames2.wrapper, ref: ref2 },\n      React__namespace.createElement(\"span\", { className: classNames2.divider })\n    );\n  });\n  VerticalDividerBase.displayName = \"VerticalDividerBase\";\n  var VerticalDivider = styled(VerticalDividerBase, getStyles$r, void 0, {\n    scope: \"VerticalDivider\"\n  });\n  var TouchIdleDelay$2 = 500;\n  var ContextualMenuSplitButton = (\n    /** @class */\n    (function(_super) {\n      __extends(ContextualMenuSplitButton2, _super);\n      function ContextualMenuSplitButton2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._getMemoizedMenuButtonKeytipProps = memoizeFunction(function(keytipProps) {\n          return __assign$1(__assign$1({}, keytipProps), { hasMenu: true });\n        });\n        _this._onItemKeyDown = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemKeyDown = _a2.onItemKeyDown;\n          if (ev.which === KeyCodes.enter) {\n            _this._executeItemClick(ev);\n            ev.preventDefault();\n            ev.stopPropagation();\n          } else if (onItemKeyDown) {\n            onItemKeyDown(item, ev);\n          }\n        };\n        _this._getSubmenuTarget = function() {\n          return _this._splitButton;\n        };\n        _this._renderAriaDescription = function(ariaDescription, className2) {\n          return ariaDescription ? React__namespace.createElement(\"span\", { id: _this._ariaDescriptionId, className: className2 }, ariaDescription) : null;\n        };\n        _this._onItemMouseEnterPrimary = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseEnter = _a2.onItemMouseEnter;\n          if (onItemMouseEnter) {\n            onItemMouseEnter(__assign$1(__assign$1({}, item), { subMenuProps: void 0, items: void 0 }), ev, _this._splitButton);\n          }\n        };\n        _this._onItemMouseEnterIcon = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseEnter = _a2.onItemMouseEnter;\n          if (onItemMouseEnter) {\n            onItemMouseEnter(item, ev, _this._splitButton);\n          }\n        };\n        _this._onItemMouseMovePrimary = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseMove = _a2.onItemMouseMove;\n          if (onItemMouseMove) {\n            onItemMouseMove(__assign$1(__assign$1({}, item), { subMenuProps: void 0, items: void 0 }), ev, _this._splitButton);\n          }\n        };\n        _this._onItemMouseMoveIcon = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemMouseMove = _a2.onItemMouseMove;\n          if (onItemMouseMove) {\n            onItemMouseMove(item, ev, _this._splitButton);\n          }\n        };\n        _this._onIconItemClick = function(ev) {\n          var _a2 = _this.props, item = _a2.item, onItemClickBase = _a2.onItemClickBase;\n          if (onItemClickBase) {\n            onItemClickBase(item, ev, _this._splitButton ? _this._splitButton : ev.currentTarget);\n          }\n        };\n        _this._executeItemClick = function(ev) {\n          var _a2 = _this.props, item = _a2.item, executeItemClick = _a2.executeItemClick, onItemClick = _a2.onItemClick;\n          if (item.disabled || item.isDisabled) {\n            return;\n          }\n          if (_this._processingTouch && !item.canCheck && onItemClick) {\n            return onItemClick(item, ev);\n          }\n          if (executeItemClick) {\n            executeItemClick(item, ev);\n          }\n        };\n        _this._onTouchStart = function(ev) {\n          if (_this._splitButton && !(\"onpointerdown\" in _this._splitButton)) {\n            _this._handleTouchAndPointerEvent(ev);\n          }\n        };\n        _this._onPointerDown = function(ev) {\n          if (ev.pointerType === \"touch\") {\n            _this._handleTouchAndPointerEvent(ev);\n            ev.preventDefault();\n            ev.stopImmediatePropagation();\n          }\n        };\n        _this._async = new Async(_this);\n        _this._events = new EventGroup(_this);\n        _this._dismissLabelId = getId();\n        return _this;\n      }\n      ContextualMenuSplitButton2.prototype.componentDidMount = function() {\n        if (this._splitButton && \"onpointerdown\" in this._splitButton) {\n          this._events.on(this._splitButton, \"pointerdown\", this._onPointerDown, true);\n        }\n      };\n      ContextualMenuSplitButton2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n      };\n      ContextualMenuSplitButton2.prototype.render = function() {\n        var _this = this;\n        var _a2;\n        var _b2 = this.props, item = _b2.item, classNames2 = _b2.classNames, index2 = _b2.index, focusableElementIndex = _b2.focusableElementIndex, totalItemCount = _b2.totalItemCount, hasCheckmarks = _b2.hasCheckmarks, hasIcons = _b2.hasIcons, onItemMouseLeave = _b2.onItemMouseLeave, expandedMenuItemKey = _b2.expandedMenuItemKey;\n        var itemHasSubmenu = hasSubmenu(item);\n        var keytipProps = item.keytipProps;\n        if (keytipProps) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        var ariaDescription = item.ariaDescription;\n        if (ariaDescription) {\n          this._ariaDescriptionId = getId();\n        }\n        var ariaChecked = (_a2 = getIsChecked(item)) !== null && _a2 !== void 0 ? _a2 : void 0;\n        return React__namespace.createElement(KeytipData, { keytipProps, disabled: isItemDisabled(item) }, function(keytipAttributes) {\n          return React__namespace.createElement(\n            \"div\",\n            { \"data-ktp-target\": keytipAttributes[\"data-ktp-target\"], ref: function(splitButton) {\n              _this._splitButton = splitButton;\n            }, role: getMenuItemAriaRole(item), \"aria-label\": item.ariaLabel, className: classNames2.splitContainer, \"aria-disabled\": isItemDisabled(item), \"aria-expanded\": itemHasSubmenu ? item.key === expandedMenuItemKey : void 0, \"aria-haspopup\": true, \"aria-describedby\": mergeAriaAttributeValues(item.ariaDescribedBy, ariaDescription ? _this._ariaDescriptionId : void 0, keytipAttributes[\"aria-describedby\"]), \"aria-checked\": ariaChecked, \"aria-posinset\": focusableElementIndex + 1, \"aria-setsize\": totalItemCount, onMouseEnter: _this._onItemMouseEnterPrimary, onMouseLeave: onItemMouseLeave ? onItemMouseLeave.bind(_this, __assign$1(__assign$1({}, item), { subMenuProps: null, items: null })) : void 0, onMouseMove: _this._onItemMouseMovePrimary, onKeyDown: _this._onItemKeyDown, onClick: _this._executeItemClick, onTouchStart: _this._onTouchStart, tabIndex: 0, \"data-is-focusable\": true, \"aria-roledescription\": item[\"aria-roledescription\"] },\n            _this._renderSplitPrimaryButton(item, classNames2, index2, hasCheckmarks, hasIcons),\n            _this._renderSplitDivider(item),\n            _this._renderSplitIconButton(item, classNames2, index2, keytipAttributes),\n            _this._renderAriaDescription(ariaDescription, classNames2.screenReaderText)\n          );\n        });\n      };\n      ContextualMenuSplitButton2.prototype._renderSplitPrimaryButton = function(item, classNames2, index2, hasCheckmarks, hasIcons) {\n        var _a2 = this.props, _b2 = _a2.contextualMenuItemAs, ChildrenRenderer = _b2 === void 0 ? ContextualMenuItem : _b2, onItemClick = _a2.onItemClick;\n        var itemProps = {\n          key: item.key,\n          disabled: isItemDisabled(item) || item.primaryDisabled,\n          /* eslint-disable @typescript-eslint/no-deprecated */\n          name: item.name,\n          text: item.text || item.name,\n          secondaryText: item.secondaryText,\n          /* eslint-enable @typescript-eslint/no-deprecated */\n          className: classNames2.splitPrimary,\n          canCheck: item.canCheck,\n          isChecked: item.isChecked,\n          checked: item.checked,\n          iconProps: item.iconProps,\n          id: this._dismissLabelId,\n          onRenderIcon: item.onRenderIcon,\n          data: item.data,\n          \"data-is-focusable\": false\n        };\n        var itemComponentProps = item.itemProps;\n        return React__namespace.createElement(\n          \"button\",\n          __assign$1({}, getNativeProps(itemProps, buttonProperties)),\n          React__namespace.createElement(ChildrenRenderer, __assign$1({ \"data-is-focusable\": false, item: __assign$1(__assign$1({}, itemProps), { onClick: item.onClick }), classNames: classNames2, index: index2, onCheckmarkClick: hasCheckmarks && onItemClick ? onItemClick : void 0, hasIcons }, itemComponentProps))\n        );\n      };\n      ContextualMenuSplitButton2.prototype._renderSplitDivider = function(item) {\n        var getDividerClassNames2 = item.getSplitButtonVerticalDividerClassNames || getSplitButtonVerticalDividerClassNames;\n        return React__namespace.createElement(\n          VerticalDivider,\n          {\n            // eslint-disable-next-line @typescript-eslint/no-deprecated\n            getClassNames: getDividerClassNames2\n          }\n        );\n      };\n      ContextualMenuSplitButton2.prototype._renderSplitIconButton = function(item, classNames2, index2, keytipAttributes) {\n        var _a2 = this.props, onItemMouseLeave = _a2.onItemMouseLeave, onItemMouseDown2 = _a2.onItemMouseDown, openSubMenu = _a2.openSubMenu, dismissSubMenu = _a2.dismissSubMenu, dismissMenu = _a2.dismissMenu;\n        var ChildrenRenderer = ContextualMenuItem;\n        if (this.props.item.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(this.props.item.contextualMenuItemAs, ChildrenRenderer);\n        }\n        if (this.props.contextualMenuItemAs) {\n          ChildrenRenderer = composeComponentAs(this.props.contextualMenuItemAs, ChildrenRenderer);\n        }\n        var itemProps = {\n          onClick: this._onIconItemClick,\n          disabled: isItemDisabled(item),\n          className: classNames2.splitMenu,\n          subMenuProps: item.subMenuProps,\n          submenuIconProps: item.submenuIconProps,\n          split: true,\n          key: item.key,\n          \"aria-labelledby\": this._dismissLabelId\n        };\n        var buttonProps = __assign$1(__assign$1({}, getNativeProps(itemProps, buttonProperties)), {\n          onMouseEnter: this._onItemMouseEnterIcon,\n          onMouseLeave: onItemMouseLeave ? onItemMouseLeave.bind(this, item) : void 0,\n          onMouseDown: function(ev) {\n            return onItemMouseDown2 ? onItemMouseDown2(item, ev) : void 0;\n          },\n          onMouseMove: this._onItemMouseMoveIcon,\n          \"data-is-focusable\": false,\n          \"data-ktp-execute-target\": keytipAttributes[\"data-ktp-execute-target\"],\n          \"aria-haspopup\": true\n        });\n        var itemComponentProps = item.itemProps;\n        return React__namespace.createElement(\n          \"button\",\n          __assign$1({}, buttonProps),\n          React__namespace.createElement(ChildrenRenderer, __assign$1({ componentRef: item.componentRef, item: itemProps, classNames: classNames2, index: index2, hasIcons: false, openSubMenu, dismissSubMenu, dismissMenu, getSubmenuTarget: this._getSubmenuTarget }, itemComponentProps))\n        );\n      };\n      ContextualMenuSplitButton2.prototype._handleTouchAndPointerEvent = function(ev) {\n        var _this = this;\n        var onTap = this.props.onTap;\n        if (onTap) {\n          onTap(ev);\n        }\n        if (this._lastTouchTimeoutId) {\n          this._async.clearTimeout(this._lastTouchTimeoutId);\n          this._lastTouchTimeoutId = void 0;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n          _this._processingTouch = false;\n          _this._lastTouchTimeoutId = void 0;\n        }, TouchIdleDelay$2);\n      };\n      return ContextualMenuSplitButton2;\n    })(ContextualMenuItemWrapper)\n  );\n  var BaseDecorator = (\n    /** @class */\n    (function(_super) {\n      __extends(BaseDecorator2, _super);\n      function BaseDecorator2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._updateComposedComponentRef = _this._updateComposedComponentRef.bind(_this);\n        return _this;\n      }\n      BaseDecorator2.prototype._updateComposedComponentRef = function(composedComponentInstance) {\n        this._composedComponentInstance = composedComponentInstance;\n        if (composedComponentInstance) {\n          this._hoisted = hoistMethods(this, composedComponentInstance);\n        } else if (this._hoisted) {\n          unhoistMethods(this, this._hoisted);\n        }\n      };\n      return BaseDecorator2;\n    })(React__namespace.Component)\n  );\n  var ResponsiveMode;\n  (function(ResponsiveMode2) {\n    ResponsiveMode2[ResponsiveMode2[\"small\"] = 0] = \"small\";\n    ResponsiveMode2[ResponsiveMode2[\"medium\"] = 1] = \"medium\";\n    ResponsiveMode2[ResponsiveMode2[\"large\"] = 2] = \"large\";\n    ResponsiveMode2[ResponsiveMode2[\"xLarge\"] = 3] = \"xLarge\";\n    ResponsiveMode2[ResponsiveMode2[\"xxLarge\"] = 4] = \"xxLarge\";\n    ResponsiveMode2[ResponsiveMode2[\"xxxLarge\"] = 5] = \"xxxLarge\";\n    ResponsiveMode2[ResponsiveMode2[\"unknown\"] = 999] = \"unknown\";\n  })(ResponsiveMode || (ResponsiveMode = {}));\n  var RESPONSIVE_MAX_CONSTRAINT = [479, 639, 1023, 1365, 1919, 99999999];\n  var _lastMode;\n  function getInitialResponsiveMode() {\n    var _a2;\n    return (_a2 = _lastMode) !== null && _a2 !== void 0 ? _a2 : ResponsiveMode.large;\n  }\n  function withResponsiveMode(ComposedComponent) {\n    var _a2;\n    var resultClass = (_a2 = /** @class */\n    (function(_super) {\n      __extends(WithResponsiveMode, _super);\n      function WithResponsiveMode(props) {\n        var _this = _super.call(this, props) || this;\n        _this._onResize = function() {\n          var responsiveMode = getResponsiveMode(_this.context.window);\n          if (responsiveMode !== _this.state.responsiveMode) {\n            _this.setState({\n              responsiveMode\n            });\n          }\n        };\n        _this._events = new EventGroup(_this);\n        _this._updateComposedComponentRef = _this._updateComposedComponentRef.bind(_this);\n        _this.state = {\n          responsiveMode: getInitialResponsiveMode()\n        };\n        return _this;\n      }\n      WithResponsiveMode.prototype.componentDidMount = function() {\n        this._events.on(this.context.window, \"resize\", this._onResize);\n        this._onResize();\n      };\n      WithResponsiveMode.prototype.componentWillUnmount = function() {\n        this._events.dispose();\n      };\n      WithResponsiveMode.prototype.render = function() {\n        var responsiveMode = this.state.responsiveMode;\n        return responsiveMode === ResponsiveMode.unknown ? null : React__namespace.createElement(ComposedComponent, __assign$1({ ref: this._updateComposedComponentRef, responsiveMode }, this.props));\n      };\n      return WithResponsiveMode;\n    })(BaseDecorator), _a2.contextType = WindowContext, _a2);\n    return hoistStatics(ComposedComponent, resultClass);\n  }\n  function getWidthOfCurrentWindow(currentWindow) {\n    try {\n      return currentWindow.document.documentElement.clientWidth;\n    } catch (e) {\n      return currentWindow.innerWidth;\n    }\n  }\n  function getResponsiveMode(currentWindow) {\n    var responsiveMode = ResponsiveMode.small;\n    if (currentWindow) {\n      try {\n        while (getWidthOfCurrentWindow(currentWindow) > RESPONSIVE_MAX_CONSTRAINT[responsiveMode]) {\n          responsiveMode++;\n        }\n      } catch (e) {\n        responsiveMode = getInitialResponsiveMode();\n      }\n      _lastMode = responsiveMode;\n    } else {\n      {\n        throw new Error(\"Content was rendered in a server environment without providing a default responsive mode. Call setResponsiveMode to define what the responsive mode is.\");\n      }\n    }\n    return responsiveMode;\n  }\n  var useResponsiveMode = function(elementRef, overrideResponsiveMode) {\n    var _a2 = React__namespace.useState(getInitialResponsiveMode()), lastResponsiveMode = _a2[0], setLastResponsiveMode = _a2[1];\n    var onResize = React__namespace.useCallback(function() {\n      var newResponsiveMode = getResponsiveMode(getWindow(elementRef.current));\n      if (lastResponsiveMode !== newResponsiveMode) {\n        setLastResponsiveMode(newResponsiveMode);\n      }\n    }, [elementRef, lastResponsiveMode]);\n    var win = useWindow();\n    useOnEvent(win, \"resize\", onResize);\n    React__namespace.useEffect(function() {\n      if (overrideResponsiveMode === void 0) {\n        onResize();\n      }\n    }, [overrideResponsiveMode]);\n    return overrideResponsiveMode !== null && overrideResponsiveMode !== void 0 ? overrideResponsiveMode : lastResponsiveMode;\n  };\n  var MenuContext = React__namespace.createContext({});\n  var getClassNames$l = classNamesFunction();\n  var getContextualMenuItemClassNames = classNamesFunction();\n  var DEFAULT_PROPS$4 = {\n    items: [],\n    shouldFocusOnMount: true,\n    gapSpace: 0,\n    directionalHint: DirectionalHint.bottomAutoEdge,\n    beakWidth: 16\n  };\n  function getItemCount(items) {\n    var totalItemCount = 0;\n    for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {\n      var item = items_1[_i];\n      if (item.itemType !== ContextualMenuItemType.Divider && item.itemType !== ContextualMenuItemType.Header) {\n        var itemCount = item.customOnRenderListLength ? item.customOnRenderListLength : 1;\n        totalItemCount += itemCount;\n      }\n    }\n    return totalItemCount;\n  }\n  function getSubmenuItems(item, options2) {\n    var target2 = options2 === null || options2 === void 0 ? void 0 : options2.target;\n    var items = item.subMenuProps ? item.subMenuProps.items : item.items;\n    if (items) {\n      var overrideItems = [];\n      for (var _i = 0, items_2 = items; _i < items_2.length; _i++) {\n        var subItem = items_2[_i];\n        if (subItem.preferMenuTargetAsEventTarget) {\n          var onClick = subItem.onClick, contextItem = __rest(subItem, [\"onClick\"]);\n          overrideItems.push(__assign$1(__assign$1({}, contextItem), { onClick: getOnClickWithOverrideTarget(onClick, target2) }));\n        } else {\n          overrideItems.push(subItem);\n        }\n      }\n      return overrideItems;\n    }\n  }\n  function canAnyMenuItemsCheck(items) {\n    return items.some(function(item) {\n      if (item.canCheck) {\n        return true;\n      }\n      if (item.sectionProps && item.sectionProps.items.some(function(submenuItem) {\n        return submenuItem.canCheck === true;\n      })) {\n        return true;\n      }\n      return false;\n    });\n  }\n  var NavigationIdleDelay = 250;\n  var COMPONENT_NAME$7 = \"ContextualMenu\";\n  var _getMenuItemStylesFunction = memoizeFunction(function() {\n    var styles = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n      styles[_i] = arguments[_i];\n    }\n    return function(styleProps) {\n      return concatStyleSetsWithProps.apply(void 0, __spreadArray([styleProps, getItemStyles], styles, false));\n    };\n  });\n  function useVisibility(props, targetWindow) {\n    var _a2 = props.hidden, hidden = _a2 === void 0 ? false : _a2, onMenuDismissed = props.onMenuDismissed, onMenuOpened = props.onMenuOpened;\n    var previousHidden = usePrevious(hidden);\n    var onMenuOpenedRef = React__namespace.useRef(onMenuOpened);\n    var onMenuClosedRef = React__namespace.useRef(onMenuDismissed);\n    var propsRef = React__namespace.useRef(props);\n    onMenuOpenedRef.current = onMenuOpened;\n    onMenuClosedRef.current = onMenuDismissed;\n    propsRef.current = props;\n    React__namespace.useEffect(function() {\n      var _a3, _b2;\n      if (hidden && previousHidden === false) {\n        (_a3 = onMenuClosedRef.current) === null || _a3 === void 0 ? void 0 : _a3.call(onMenuClosedRef, propsRef.current);\n      } else if (!hidden && previousHidden !== false) {\n        (_b2 = onMenuOpenedRef.current) === null || _b2 === void 0 ? void 0 : _b2.call(onMenuOpenedRef, propsRef.current);\n      }\n    }, [hidden, previousHidden]);\n    React__namespace.useEffect(function() {\n      return function() {\n        var _a3;\n        return (_a3 = onMenuClosedRef.current) === null || _a3 === void 0 ? void 0 : _a3.call(onMenuClosedRef, propsRef.current);\n      };\n    }, []);\n  }\n  function useSubMenuState(_a2, dismiss) {\n    var hidden = _a2.hidden, items = _a2.items, theme = _a2.theme, className2 = _a2.className, id2 = _a2.id, menuTarget = _a2.target;\n    var _b2 = React__namespace.useState(), expandedMenuItemKey = _b2[0], setExpandedMenuItemKey = _b2[1];\n    var _c2 = React__namespace.useState(), submenuTarget = _c2[0], setSubmenuTarget = _c2[1];\n    var _d2 = React__namespace.useState(), shouldFocusOnContainer = _d2[0], setShouldFocusOnContainer = _d2[1];\n    var subMenuId = useId(COMPONENT_NAME$7, id2);\n    var closeSubMenu = React__namespace.useCallback(function() {\n      setShouldFocusOnContainer(void 0);\n      setExpandedMenuItemKey(void 0);\n      setSubmenuTarget(void 0);\n    }, []);\n    var openSubMenu = React__namespace.useCallback(function(_a3, target2, focusContainer) {\n      var submenuItemKey = _a3.key;\n      if (expandedMenuItemKey === submenuItemKey) {\n        return;\n      }\n      target2.focus();\n      setShouldFocusOnContainer(focusContainer);\n      setExpandedMenuItemKey(submenuItemKey);\n      setSubmenuTarget(target2);\n    }, [expandedMenuItemKey]);\n    React__namespace.useEffect(function() {\n      if (hidden) {\n        closeSubMenu();\n      }\n    }, [hidden, closeSubMenu]);\n    var onSubMenuDismiss = useOnSubmenuDismiss(dismiss, closeSubMenu);\n    var getSubmenuProps = function() {\n      var item = findItemByKeyFromItems(expandedMenuItemKey, items);\n      var submenuProps = null;\n      if (item) {\n        submenuProps = {\n          items: getSubmenuItems(item, { target: menuTarget }),\n          target: submenuTarget,\n          onDismiss: onSubMenuDismiss,\n          isSubMenu: true,\n          id: subMenuId,\n          shouldFocusOnMount: true,\n          shouldFocusOnContainer,\n          directionalHint: getRTL(theme) ? DirectionalHint.leftTopEdge : DirectionalHint.rightTopEdge,\n          className: className2,\n          gapSpace: 0,\n          isBeakVisible: false\n        };\n        if (item.subMenuProps) {\n          assign(submenuProps, item.subMenuProps);\n        }\n        if (item.preferMenuTargetAsEventTarget) {\n          var onItemClick = item.onItemClick;\n          submenuProps.onItemClick = getOnClickWithOverrideTarget(onItemClick, menuTarget);\n        }\n      }\n      return submenuProps;\n    };\n    return [expandedMenuItemKey, openSubMenu, getSubmenuProps, onSubMenuDismiss];\n  }\n  function useShouldUpdateFocusOnMouseMove(_a2) {\n    var delayUpdateFocusOnHover = _a2.delayUpdateFocusOnHover, hidden = _a2.hidden;\n    var shouldUpdateFocusOnMouseEvent = React__namespace.useRef(!delayUpdateFocusOnHover);\n    var gotMouseMove = React__namespace.useRef(false);\n    React__namespace.useEffect(function() {\n      shouldUpdateFocusOnMouseEvent.current = !delayUpdateFocusOnHover;\n      gotMouseMove.current = hidden ? false : !delayUpdateFocusOnHover && gotMouseMove.current;\n    }, [delayUpdateFocusOnHover, hidden]);\n    var onMenuFocusCapture = React__namespace.useCallback(function() {\n      if (delayUpdateFocusOnHover) {\n        shouldUpdateFocusOnMouseEvent.current = false;\n      }\n    }, [delayUpdateFocusOnHover]);\n    return [shouldUpdateFocusOnMouseEvent, gotMouseMove, onMenuFocusCapture];\n  }\n  function usePreviousActiveElement(_a2, targetWindow, hostElement) {\n    var hidden = _a2.hidden, onRestoreFocus = _a2.onRestoreFocus;\n    var previousActiveElement = React__namespace.useRef(void 0);\n    var tryFocusPreviousActiveElement = React__namespace.useCallback(function(options2) {\n      var _a3, _b2;\n      if (onRestoreFocus) {\n        onRestoreFocus(options2);\n      } else if (options2 === null || options2 === void 0 ? void 0 : options2.documentContainsFocus) {\n        (_b2 = (_a3 = previousActiveElement.current) === null || _a3 === void 0 ? void 0 : _a3.focus) === null || _b2 === void 0 ? void 0 : _b2.call(_a3);\n      }\n    }, [onRestoreFocus]);\n    useIsomorphicLayoutEffect(function() {\n      var _a3, _b2;\n      if (!hidden) {\n        var newElement = targetWindow === null || targetWindow === void 0 ? void 0 : targetWindow.document.activeElement;\n        if (!((_a3 = hostElement.current) === null || _a3 === void 0 ? void 0 : _a3.contains(newElement)) && newElement.tagName !== \"BODY\") {\n          previousActiveElement.current = newElement;\n        }\n      } else if (previousActiveElement.current) {\n        tryFocusPreviousActiveElement({\n          originalElement: previousActiveElement.current,\n          containsFocus: true,\n          documentContainsFocus: ((_b2 = getDocument()) === null || _b2 === void 0 ? void 0 : _b2.hasFocus()) || false\n        });\n        previousActiveElement.current = void 0;\n      }\n    }, [hidden, targetWindow === null || targetWindow === void 0 ? void 0 : targetWindow.document.activeElement, tryFocusPreviousActiveElement, hostElement]);\n    return [tryFocusPreviousActiveElement];\n  }\n  function useKeyHandlers(_a2, dismiss, hostElement, openSubMenu) {\n    var theme = _a2.theme, isSubMenu = _a2.isSubMenu, _b2 = _a2.focusZoneProps, _c2 = _b2 === void 0 ? {} : _b2, checkForNoWrap = _c2.checkForNoWrap, _d2 = _c2.direction, focusZoneDirection = _d2 === void 0 ? FocusZoneDirection.vertical : _d2;\n    var lastKeyDownWasAltOrMeta = React__namespace.useRef(void 0);\n    var keyHandler = function(ev, shouldHandleKey, dismissAllMenus) {\n      var handled = false;\n      if (shouldHandleKey(ev)) {\n        dismiss(ev, dismissAllMenus);\n        ev.preventDefault();\n        ev.stopPropagation();\n        handled = true;\n      }\n      return handled;\n    };\n    var shouldCloseSubMenu = function(ev) {\n      var submenuCloseKey = getRTL(theme) ? KeyCodes.right : KeyCodes.left;\n      if (ev.which !== submenuCloseKey || !isSubMenu) {\n        return false;\n      }\n      return !!(focusZoneDirection === FocusZoneDirection.vertical || checkForNoWrap && !shouldWrapFocus(ev.target, \"data-no-horizontal-wrap\"));\n    };\n    var shouldHandleKeyDown = function(ev) {\n      return (\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        ev.which === KeyCodes.escape || shouldCloseSubMenu(ev) || ev.which === KeyCodes.up && (ev.altKey || ev.metaKey)\n      );\n    };\n    var onKeyDown = function(ev) {\n      lastKeyDownWasAltOrMeta.current = isAltOrMeta$1(ev);\n      var dismissAllMenus = ev.which === KeyCodes.escape && (isMac() || isIOS());\n      return keyHandler(ev, shouldHandleKeyDown, dismissAllMenus);\n    };\n    var shouldHandleKeyUp = function(ev) {\n      var keyPressIsAltOrMetaAlone = lastKeyDownWasAltOrMeta.current && isAltOrMeta$1(ev);\n      lastKeyDownWasAltOrMeta.current = false;\n      return !!keyPressIsAltOrMetaAlone && !(isIOS() || isMac());\n    };\n    var onKeyUp = function(ev) {\n      return keyHandler(\n        ev,\n        shouldHandleKeyUp,\n        true\n        /* dismissAllMenus */\n      );\n    };\n    var onMenuKeyDown = function(ev) {\n      var handled = onKeyDown(ev);\n      if (handled || !hostElement.current) {\n        return;\n      }\n      var hasModifier = !!(ev.altKey || ev.metaKey);\n      var isUp = ev.which === KeyCodes.up;\n      var isDown = ev.which === KeyCodes.down;\n      if (!hasModifier && (isUp || isDown)) {\n        var elementToFocus = isUp ? getLastFocusable(hostElement.current, hostElement.current.lastChild, true) : getFirstFocusable(hostElement.current, hostElement.current.firstChild, true);\n        if (elementToFocus) {\n          elementToFocus.focus();\n          ev.preventDefault();\n          ev.stopPropagation();\n        }\n      }\n    };\n    var onItemKeyDown = function(item, ev) {\n      var openKey = getRTL(theme) ? KeyCodes.left : KeyCodes.right;\n      if (!item.disabled && // eslint-disable-next-line @typescript-eslint/no-deprecated\n      (ev.which === openKey || ev.which === KeyCodes.enter || ev.which === KeyCodes.down && (ev.altKey || ev.metaKey))) {\n        openSubMenu(item, ev.currentTarget);\n        ev.preventDefault();\n      }\n    };\n    return [onKeyDown, onKeyUp, onMenuKeyDown, onItemKeyDown];\n  }\n  function useScrollHandler(asyncTracker) {\n    var isScrollIdle = React__namespace.useRef(true);\n    var scrollIdleTimeoutId = React__namespace.useRef(void 0);\n    var onScroll = function() {\n      if (!isScrollIdle.current && scrollIdleTimeoutId.current !== void 0) {\n        asyncTracker.clearTimeout(scrollIdleTimeoutId.current);\n        scrollIdleTimeoutId.current = void 0;\n      } else {\n        isScrollIdle.current = false;\n      }\n      scrollIdleTimeoutId.current = asyncTracker.setTimeout(function() {\n        isScrollIdle.current = true;\n      }, NavigationIdleDelay);\n    };\n    return [onScroll, isScrollIdle];\n  }\n  function useOnSubmenuDismiss(dismiss, closeSubMenu) {\n    var isMountedRef = React__namespace.useRef(false);\n    React__namespace.useEffect(function() {\n      isMountedRef.current = true;\n      return function() {\n        isMountedRef.current = false;\n      };\n    }, []);\n    var onSubMenuDismiss = function(ev, dismissAll) {\n      if (dismissAll) {\n        dismiss(ev, dismissAll);\n      } else if (isMountedRef.current) {\n        closeSubMenu();\n      }\n    };\n    return onSubMenuDismiss;\n  }\n  function useSubmenuEnterTimer(_a2, asyncTracker) {\n    var _b2 = _a2.subMenuHoverDelay, subMenuHoverDelay = _b2 === void 0 ? NavigationIdleDelay : _b2;\n    var enterTimerRef = React__namespace.useRef(void 0);\n    var cancelSubMenuTimer = function() {\n      if (enterTimerRef.current !== void 0) {\n        asyncTracker.clearTimeout(enterTimerRef.current);\n        enterTimerRef.current = void 0;\n      }\n    };\n    var startSubmenuTimer = function(onTimerExpired) {\n      enterTimerRef.current = asyncTracker.setTimeout(function() {\n        onTimerExpired();\n        cancelSubMenuTimer();\n      }, subMenuHoverDelay);\n    };\n    return [cancelSubMenuTimer, startSubmenuTimer, enterTimerRef];\n  }\n  function useMouseHandlers(props, isScrollIdle, subMenuEntryTimer, targetWindow, shouldUpdateFocusOnMouseEvent, gotMouseMove, expandedMenuItemKey, hostElement, startSubmenuTimer, cancelSubMenuTimer, openSubMenu, onSubMenuDismiss, dismiss) {\n    var menuTarget = props.target;\n    var onItemMouseEnterBase = function(item, ev, target2) {\n      if (shouldUpdateFocusOnMouseEvent.current) {\n        gotMouseMove.current = true;\n      }\n      if (shouldIgnoreMouseEvent()) {\n        return;\n      }\n      updateFocusOnMouseEvent(item, ev, target2);\n    };\n    var onItemMouseMoveBase = function(item, ev, target2) {\n      var targetElement = ev.currentTarget;\n      if (shouldUpdateFocusOnMouseEvent.current) {\n        gotMouseMove.current = true;\n      } else {\n        return;\n      }\n      if (!isScrollIdle.current || subMenuEntryTimer.current !== void 0 || targetElement === (targetWindow === null || targetWindow === void 0 ? void 0 : targetWindow.document.activeElement)) {\n        return;\n      }\n      updateFocusOnMouseEvent(item, ev, target2);\n    };\n    var shouldIgnoreMouseEvent = function() {\n      return !isScrollIdle.current || !gotMouseMove.current;\n    };\n    var onMouseItemLeave = function(item, ev) {\n      var _a2;\n      if (shouldIgnoreMouseEvent()) {\n        return;\n      }\n      cancelSubMenuTimer();\n      if (expandedMenuItemKey !== void 0) {\n        return;\n      }\n      if (hostElement.current.setActive) {\n        try {\n          hostElement.current.setActive();\n        } catch (e) {\n        }\n      } else {\n        (_a2 = hostElement.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n      }\n    };\n    var updateFocusOnMouseEvent = function(item, ev, target2) {\n      var targetElement = target2 ? target2 : ev.currentTarget;\n      if (item.key === expandedMenuItemKey) {\n        return;\n      }\n      cancelSubMenuTimer();\n      if (expandedMenuItemKey === void 0) {\n        targetElement.focus();\n      }\n      if (hasSubmenu(item)) {\n        ev.stopPropagation();\n        startSubmenuTimer(function() {\n          targetElement.focus();\n          openSubMenu(item, targetElement, true);\n        });\n      } else {\n        startSubmenuTimer(function() {\n          onSubMenuDismiss(ev);\n          targetElement.focus();\n        });\n      }\n    };\n    var onItemClick = function(item, ev) {\n      onItemClickBase(item, ev, ev.currentTarget);\n    };\n    var onItemClickBase = function(item, ev, target2) {\n      var items = getSubmenuItems(item, { target: menuTarget });\n      cancelSubMenuTimer();\n      if (!hasSubmenu(item) && (!items || !items.length)) {\n        executeItemClick(item, ev);\n      } else {\n        if (item.key !== expandedMenuItemKey) {\n          var shouldFocusOnContainer = typeof props.shouldFocusOnContainer === \"boolean\" ? props.shouldFocusOnContainer : ev.nativeEvent.pointerType === \"mouse\";\n          openSubMenu(item, target2, shouldFocusOnContainer);\n        }\n      }\n      ev.stopPropagation();\n      ev.preventDefault();\n    };\n    var onAnchorClick = function(item, ev) {\n      executeItemClick(item, ev);\n      ev.stopPropagation();\n    };\n    var executeItemClick = function(item, ev) {\n      if (item.disabled || item.isDisabled) {\n        return;\n      }\n      if (item.preferMenuTargetAsEventTarget) {\n        overrideTarget(ev, menuTarget);\n      }\n      var shouldDismiss = false;\n      if (item.onClick) {\n        shouldDismiss = !!item.onClick(ev, item);\n      } else if (props.onItemClick) {\n        shouldDismiss = !!props.onItemClick(ev, item);\n      }\n      if (shouldDismiss || !ev.defaultPrevented) {\n        dismiss(ev, true);\n      }\n    };\n    return [\n      onItemMouseEnterBase,\n      onItemMouseMoveBase,\n      onMouseItemLeave,\n      onItemClick,\n      onAnchorClick,\n      executeItemClick,\n      onItemClickBase\n    ];\n  }\n  var ContextualMenuBase = React__namespace.memo(React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var _a2;\n    var _b2 = getPropsWithDefaults(DEFAULT_PROPS$4, propsWithoutDefaults);\n    _b2.ref;\n    var props = __rest(_b2, [\"ref\"]);\n    var hostElement = React__namespace.useRef(null);\n    var asyncTracker = useAsync();\n    var menuId = useId(COMPONENT_NAME$7, props.id);\n    var dismiss = function(ev, dismissAll) {\n      var _a3;\n      return (_a3 = props.onDismiss) === null || _a3 === void 0 ? void 0 : _a3.call(props, ev, dismissAll);\n    };\n    var _c2 = useTarget(props.target, hostElement), targetRef = _c2[0], targetWindow = _c2[1];\n    var tryFocusPreviousActiveElement = usePreviousActiveElement(props, targetWindow, hostElement)[0];\n    var _d2 = useSubMenuState(props, dismiss), expandedMenuItemKey = _d2[0], openSubMenu = _d2[1], getSubmenuProps = _d2[2], onSubMenuDismiss = _d2[3];\n    var _e2 = useShouldUpdateFocusOnMouseMove(props), shouldUpdateFocusOnMouseEvent = _e2[0], gotMouseMove = _e2[1], onMenuFocusCapture = _e2[2];\n    var _f = useScrollHandler(asyncTracker), onScroll = _f[0], isScrollIdle = _f[1];\n    var _g = useSubmenuEnterTimer(props, asyncTracker), cancelSubMenuTimer = _g[0], startSubmenuTimer = _g[1], subMenuEntryTimer = _g[2];\n    var responsiveMode = useResponsiveMode(hostElement, props.responsiveMode);\n    useVisibility(props);\n    var _h = useKeyHandlers(props, dismiss, hostElement, openSubMenu), onKeyDown = _h[0], onKeyUp = _h[1], onMenuKeyDown = _h[2], onItemKeyDown = _h[3];\n    var _j = useMouseHandlers(props, isScrollIdle, subMenuEntryTimer, targetWindow, shouldUpdateFocusOnMouseEvent, gotMouseMove, expandedMenuItemKey, hostElement, startSubmenuTimer, cancelSubMenuTimer, openSubMenu, onSubMenuDismiss, dismiss), onItemMouseEnterBase = _j[0], onItemMouseMoveBase = _j[1], onMouseItemLeave = _j[2], onItemClick = _j[3], onAnchorClick = _j[4], executeItemClick = _j[5], onItemClickBase = _j[6];\n    var onDefaultRenderMenuList = function(menuListProps, menuClassNames, defaultRender) {\n      var indexCorrection = 0;\n      var items2 = menuListProps.items, totalItemCount = menuListProps.totalItemCount, hasCheckmarks2 = menuListProps.hasCheckmarks, hasIcons2 = menuListProps.hasIcons;\n      return React__namespace.createElement(\"ul\", { className: menuClassNames.list, onKeyDown, onKeyUp, role: \"presentation\" }, items2.map(function(item, index2) {\n        var menuItem = renderMenuItem(item, index2, indexCorrection, totalItemCount, hasCheckmarks2, hasIcons2, menuClassNames);\n        if (item.itemType !== ContextualMenuItemType.Divider && item.itemType !== ContextualMenuItemType.Header) {\n          var indexIncrease = item.customOnRenderListLength ? item.customOnRenderListLength : 1;\n          indexCorrection += indexIncrease;\n        }\n        return menuItem;\n      }));\n    };\n    var renderFocusZone = function(children2, adjustedFocusZoneProps2) {\n      var _a3 = props.focusZoneAs, ChildrenRenderer = _a3 === void 0 ? FocusZone : _a3;\n      return React__namespace.createElement(ChildrenRenderer, __assign$1({}, adjustedFocusZoneProps2), children2);\n    };\n    var renderMenuItem = function(item, index2, focusableElementIndex, totalItemCount, hasCheckmarks2, hasIcons2, menuClassNames) {\n      var _a3;\n      var renderedItems = [];\n      var iconProps = item.iconProps || { iconName: \"None\" };\n      var getItemClassNames2 = item.getItemClassNames, itemProps = item.itemProps;\n      var styles2 = itemProps ? itemProps.styles : void 0;\n      var dividerClassName = item.itemType === ContextualMenuItemType.Divider ? item.className : void 0;\n      var subMenuIconClassName = item.submenuIconProps ? item.submenuIconProps.className : \"\";\n      var itemClassNames;\n      if (getItemClassNames2) {\n        itemClassNames = getItemClassNames2(props.theme, isItemDisabled(item), expandedMenuItemKey === item.key, !!getIsChecked(item), !!item.href, iconProps.iconName !== \"None\", item.className, dividerClassName, iconProps.className, subMenuIconClassName, item.primaryDisabled);\n      } else {\n        var itemStyleProps = {\n          theme: props.theme,\n          disabled: isItemDisabled(item),\n          expanded: expandedMenuItemKey === item.key,\n          checked: !!getIsChecked(item),\n          isAnchorLink: !!item.href,\n          knownIcon: iconProps.iconName !== \"None\",\n          itemClassName: item.className,\n          dividerClassName,\n          iconClassName: iconProps.className,\n          subMenuClassName: subMenuIconClassName,\n          primaryDisabled: item.primaryDisabled\n        };\n        itemClassNames = getContextualMenuItemClassNames(_getMenuItemStylesFunction((_a3 = menuClassNames.subComponentStyles) === null || _a3 === void 0 ? void 0 : _a3.menuItem, styles2), itemStyleProps);\n      }\n      if (item.text === \"-\" || item.name === \"-\") {\n        item.itemType = ContextualMenuItemType.Divider;\n      }\n      switch (item.itemType) {\n        case ContextualMenuItemType.Divider:\n          renderedItems.push(renderSeparator(index2, itemClassNames));\n          break;\n        case ContextualMenuItemType.Header:\n          renderedItems.push(renderSeparator(index2, itemClassNames));\n          var headerItem = renderHeaderMenuItem(item, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2);\n          renderedItems.push(renderListItem(headerItem, item.key || index2, itemClassNames, item.title));\n          break;\n        case ContextualMenuItemType.Section:\n          renderedItems.push(renderSectionItem(item, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2));\n          break;\n        default:\n          var defaultRenderNormalItem = function() {\n            return renderNormalItem(item, itemClassNames, index2, focusableElementIndex, totalItemCount, hasCheckmarks2, hasIcons2);\n          };\n          var menuItem = props.onRenderContextualMenuItem ? props.onRenderContextualMenuItem(item, defaultRenderNormalItem) : defaultRenderNormalItem();\n          renderedItems.push(renderListItem(menuItem, item.key || index2, itemClassNames, item.title));\n          break;\n      }\n      return React__namespace.createElement(React__namespace.Fragment, { key: item.key }, renderedItems);\n    };\n    var defaultMenuItemRenderer = function(item, menuClassNames) {\n      var index2 = item.index, focusableElementIndex = item.focusableElementIndex, totalItemCount = item.totalItemCount, hasCheckmarks2 = item.hasCheckmarks, hasIcons2 = item.hasIcons;\n      return renderMenuItem(item, index2, focusableElementIndex, totalItemCount, hasCheckmarks2, hasIcons2, menuClassNames);\n    };\n    var renderSectionItem = function(sectionItem, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2) {\n      var sectionProps = sectionItem.sectionProps;\n      if (!sectionProps) {\n        return;\n      }\n      var headerItem;\n      var groupProps;\n      if (sectionProps.title) {\n        var headerContextualMenuItem = void 0;\n        var ariaLabelledby = \"\";\n        if (typeof sectionProps.title === \"string\") {\n          var id_1 = menuId + sectionProps.title.replace(/\\s/g, \"\");\n          headerContextualMenuItem = {\n            key: \"section-\".concat(sectionProps.title, \"-title\"),\n            itemType: ContextualMenuItemType.Header,\n            text: sectionProps.title,\n            id: id_1\n          };\n          ariaLabelledby = id_1;\n        } else {\n          var id_2 = sectionProps.title.id || menuId + sectionProps.title.key.replace(/\\s/g, \"\");\n          headerContextualMenuItem = __assign$1(__assign$1({}, sectionProps.title), { id: id_2 });\n          ariaLabelledby = id_2;\n        }\n        if (headerContextualMenuItem) {\n          groupProps = {\n            role: \"group\",\n            \"aria-labelledby\": ariaLabelledby\n          };\n          headerItem = renderHeaderMenuItem(headerContextualMenuItem, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2);\n        }\n      }\n      if (sectionProps.items && sectionProps.items.length > 0) {\n        var correctedIndex_1 = 0;\n        return React__namespace.createElement(\n          \"li\",\n          { role: \"presentation\", key: sectionProps.key || sectionItem.key || \"section-\".concat(index2) },\n          React__namespace.createElement(\n            \"div\",\n            __assign$1({}, groupProps),\n            React__namespace.createElement(\n              \"ul\",\n              { className: menuClassNames.list, role: \"presentation\" },\n              sectionProps.topDivider && renderSeparator(index2, itemClassNames, true, true),\n              headerItem && renderListItem(headerItem, sectionItem.key || index2, itemClassNames, sectionItem.title),\n              sectionProps.items.map(function(contextualMenuItem, itemsIndex) {\n                var menuItem = renderMenuItem(contextualMenuItem, itemsIndex, correctedIndex_1, getItemCount(sectionProps.items), hasCheckmarks2, hasIcons2, menuClassNames);\n                if (contextualMenuItem.itemType !== ContextualMenuItemType.Divider && contextualMenuItem.itemType !== ContextualMenuItemType.Header) {\n                  var indexIncrease = contextualMenuItem.customOnRenderListLength ? contextualMenuItem.customOnRenderListLength : 1;\n                  correctedIndex_1 += indexIncrease;\n                }\n                return menuItem;\n              }),\n              sectionProps.bottomDivider && renderSeparator(index2, itemClassNames, false, true)\n            )\n          )\n        );\n      }\n    };\n    var renderListItem = function(content2, key2, classNames3, title2) {\n      return React__namespace.createElement(\"li\", { role: \"presentation\", title: title2, key: key2, className: classNames3.item }, content2);\n    };\n    var renderSeparator = function(index2, classNames3, top, fromSection) {\n      if (fromSection || index2 > 0) {\n        return React__namespace.createElement(\"li\", { role: \"separator\", key: \"separator-\" + index2 + (top === void 0 ? \"\" : top ? \"-top\" : \"-bottom\"), className: classNames3.divider, \"aria-hidden\": \"true\" });\n      }\n      return null;\n    };\n    var renderNormalItem = function(item, classNames3, index2, focusableElementIndex, totalItemCount, hasCheckmarks2, hasIcons2) {\n      if (item.onRender) {\n        return item.onRender(__assign$1({ \"aria-posinset\": focusableElementIndex + 1, \"aria-setsize\": totalItemCount }, item), dismiss);\n      }\n      var contextualMenuItemAs = props.contextualMenuItemAs;\n      var commonProps = {\n        item,\n        classNames: classNames3,\n        index: index2,\n        focusableElementIndex,\n        totalItemCount,\n        hasCheckmarks: hasCheckmarks2,\n        hasIcons: hasIcons2,\n        contextualMenuItemAs,\n        onItemMouseEnter: onItemMouseEnterBase,\n        onItemMouseLeave: onMouseItemLeave,\n        onItemMouseMove: onItemMouseMoveBase,\n        onItemMouseDown,\n        executeItemClick,\n        onItemKeyDown,\n        expandedMenuItemKey,\n        openSubMenu,\n        dismissSubMenu: onSubMenuDismiss,\n        dismissMenu: dismiss\n      };\n      if (item.href) {\n        var ContextualMenuAnchorAs = ContextualMenuAnchor;\n        if (item.contextualMenuItemWrapperAs) {\n          ContextualMenuAnchorAs = composeComponentAs(item.contextualMenuItemWrapperAs, ContextualMenuAnchorAs);\n        }\n        return React__namespace.createElement(ContextualMenuAnchorAs, __assign$1({}, commonProps, { onItemClick: onAnchorClick }));\n      }\n      if (item.split && hasSubmenu(item)) {\n        var ContextualMenuSplitButtonAs = ContextualMenuSplitButton;\n        if (item.contextualMenuItemWrapperAs) {\n          ContextualMenuSplitButtonAs = composeComponentAs(item.contextualMenuItemWrapperAs, ContextualMenuSplitButtonAs);\n        }\n        return React__namespace.createElement(ContextualMenuSplitButtonAs, __assign$1({}, commonProps, { onItemClick, onItemClickBase, onTap: cancelSubMenuTimer }));\n      }\n      var ContextualMenuButtonAs = ContextualMenuButton;\n      if (item.contextualMenuItemWrapperAs) {\n        ContextualMenuButtonAs = composeComponentAs(item.contextualMenuItemWrapperAs, ContextualMenuButtonAs);\n      }\n      return React__namespace.createElement(ContextualMenuButtonAs, __assign$1({}, commonProps, { onItemClick, onItemClickBase }));\n    };\n    var renderHeaderMenuItem = function(item, itemClassNames, menuClassNames, index2, hasCheckmarks2, hasIcons2) {\n      var ChildrenRenderer = ContextualMenuItem;\n      if (item.contextualMenuItemAs) {\n        ChildrenRenderer = composeComponentAs(item.contextualMenuItemAs, ChildrenRenderer);\n      }\n      if (props.contextualMenuItemAs) {\n        ChildrenRenderer = composeComponentAs(props.contextualMenuItemAs, ChildrenRenderer);\n      }\n      var itemProps = item.itemProps, id3 = item.id;\n      var divHtmlProperties = itemProps && getNativeProps(itemProps, divProperties);\n      return (\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        React__namespace.createElement(\n          \"div\",\n          __assign$1({ id: id3, className: menuClassNames.header }, divHtmlProperties, { style: item.style }),\n          React__namespace.createElement(ChildrenRenderer, __assign$1({ item, classNames: itemClassNames, index: index2, onCheckmarkClick: hasCheckmarks2 ? onItemClick : void 0, hasIcons: hasIcons2 }, itemProps))\n        )\n      );\n    };\n    var isBeakVisible = props.isBeakVisible;\n    var items = props.items, labelElementId = props.labelElementId, id2 = props.id, className2 = props.className, beakWidth = props.beakWidth, directionalHint = props.directionalHint, directionalHintForRTL = props.directionalHintForRTL, alignTargetEdge = props.alignTargetEdge, gapSpace = props.gapSpace, coverTarget = props.coverTarget, ariaLabel2 = props.ariaLabel, doNotLayer = props.doNotLayer, target2 = props.target, bounds2 = props.bounds, useTargetWidth = props.useTargetWidth, useTargetAsMinWidth = props.useTargetAsMinWidth, directionalHintFixed = props.directionalHintFixed, shouldFocusOnMount = props.shouldFocusOnMount, shouldFocusOnContainer = props.shouldFocusOnContainer, title = props.title, styles = props.styles, theme = props.theme, calloutProps = props.calloutProps, _k = props.onRenderSubMenu, onRenderSubMenu2 = _k === void 0 ? onDefaultRenderSubMenu : _k, _l = props.onRenderMenuList, onRenderMenuList = _l === void 0 ? function(menuListProps, defaultRender) {\n      return onDefaultRenderMenuList(menuListProps, classNames2);\n    } : _l, focusZoneProps = props.focusZoneProps, getMenuClassNames = props.getMenuClassNames;\n    var classNames2 = getMenuClassNames ? getMenuClassNames(theme, className2) : getClassNames$l(styles, {\n      theme,\n      className: className2\n    });\n    var hasIcons = itemsHaveIcons(items);\n    function itemsHaveIcons(contextualMenuItems) {\n      for (var _i = 0, contextualMenuItems_1 = contextualMenuItems; _i < contextualMenuItems_1.length; _i++) {\n        var item = contextualMenuItems_1[_i];\n        if (item.iconProps) {\n          return true;\n        }\n        if (item.itemType === ContextualMenuItemType.Section && item.sectionProps && itemsHaveIcons(item.sectionProps.items)) {\n          return true;\n        }\n      }\n      return false;\n    }\n    var adjustedFocusZoneProps = __assign$1(__assign$1({ direction: FocusZoneDirection.vertical, handleTabKey: FocusZoneTabbableElements.all, isCircularNavigation: true, \"data-tabster\": '{\"uncontrolled\": {}, \"focusable\": { \"excludeFromMover\": true }}' }, focusZoneProps), { className: css(classNames2.root, (_a2 = props.focusZoneProps) === null || _a2 === void 0 ? void 0 : _a2.className) });\n    var hasCheckmarks = canAnyMenuItemsCheck(items);\n    var submenuProps = expandedMenuItemKey && props.hidden !== true ? getSubmenuProps() : null;\n    isBeakVisible = isBeakVisible === void 0 ? responsiveMode <= ResponsiveMode.medium : isBeakVisible;\n    var contextMenuStyle;\n    var targetAsHtmlElement = targetRef.current;\n    if ((useTargetWidth || useTargetAsMinWidth) && targetAsHtmlElement && targetAsHtmlElement.offsetWidth) {\n      var targetBoundingRect = targetAsHtmlElement.getBoundingClientRect();\n      var targetWidth = targetBoundingRect.width - 2;\n      if (useTargetWidth) {\n        contextMenuStyle = {\n          width: targetWidth\n        };\n      } else if (useTargetAsMinWidth) {\n        contextMenuStyle = {\n          minWidth: targetWidth\n        };\n      }\n    }\n    if (items && items.length > 0) {\n      var totalItemCount_1 = getItemCount(items);\n      var calloutStyles_1 = classNames2.subComponentStyles ? classNames2.subComponentStyles.callout : void 0;\n      return React__namespace.createElement(MenuContext.Consumer, null, function(menuContext) {\n        return React__namespace.createElement(\n          Callout,\n          __assign$1({ styles: calloutStyles_1, onRestoreFocus: tryFocusPreviousActiveElement }, calloutProps, { target: target2 || menuContext.target, isBeakVisible, beakWidth, directionalHint, directionalHintForRTL, gapSpace, coverTarget, doNotLayer, className: css(\"ms-ContextualMenu-Callout\", calloutProps && calloutProps.className), setInitialFocus: shouldFocusOnMount, onDismiss: props.onDismiss || menuContext.onDismiss, onScroll, bounds: bounds2, directionalHintFixed, alignTargetEdge, hidden: props.hidden || menuContext.hidden, ref: forwardedRef }),\n          React__namespace.createElement(\n            \"div\",\n            { style: contextMenuStyle, ref: hostElement, id: id2, className: classNames2.container, tabIndex: shouldFocusOnContainer ? 0 : -1, onKeyDown: onMenuKeyDown, onKeyUp, onFocusCapture: onMenuFocusCapture, \"aria-label\": ariaLabel2, \"aria-labelledby\": labelElementId, role: \"menu\" },\n            title && React__namespace.createElement(\n              \"div\",\n              { className: classNames2.title },\n              \" \",\n              title,\n              \" \"\n            ),\n            items && items.length ? renderFocusZone(onRenderMenuList({\n              ariaLabel: ariaLabel2,\n              items,\n              totalItemCount: totalItemCount_1,\n              hasCheckmarks,\n              hasIcons,\n              defaultMenuItemRenderer: function(item) {\n                return defaultMenuItemRenderer(item, classNames2);\n              },\n              labelElementId\n            }, function(menuListProps, defaultRender) {\n              return onDefaultRenderMenuList(menuListProps, classNames2);\n            }), adjustedFocusZoneProps) : null,\n            submenuProps && onRenderSubMenu2(submenuProps, onDefaultRenderSubMenu)\n          ),\n          React__namespace.createElement(FocusRects, null)\n        );\n      });\n    } else {\n      return null;\n    }\n  }), function(prevProps, newProps) {\n    if (!newProps.shouldUpdateWhenHidden && prevProps.hidden && newProps.hidden) {\n      return true;\n    }\n    return shallowCompare(prevProps, newProps);\n  });\n  ContextualMenuBase.displayName = \"ContextualMenuBase\";\n  function isAltOrMeta$1(ev) {\n    return ev.which === KeyCodes.alt || ev.key === \"Meta\";\n  }\n  function onItemMouseDown(item, ev) {\n    var _a2;\n    (_a2 = item.onMouseDown) === null || _a2 === void 0 ? void 0 : _a2.call(item, item, ev);\n  }\n  function onDefaultRenderSubMenu(subMenuProps, defaultRender) {\n    throw Error(\"ContextualMenuBase: onRenderSubMenu callback is null or undefined. Please ensure to set `onRenderSubMenu` property either manually or with `styled` helper.\");\n  }\n  function findItemByKeyFromItems(key2, items) {\n    for (var _i = 0, items_3 = items; _i < items_3.length; _i++) {\n      var item = items_3[_i];\n      if (item.itemType === ContextualMenuItemType.Section && item.sectionProps) {\n        var match2 = findItemByKeyFromItems(key2, item.sectionProps.items);\n        if (match2) {\n          return match2;\n        }\n      } else if (item.key && item.key === key2) {\n        return item;\n      }\n    }\n  }\n  function getOnClickWithOverrideTarget(onClick, target2) {\n    return onClick ? function(ev, item) {\n      overrideTarget(ev, target2);\n      return onClick(ev, item);\n    } : onClick;\n  }\n  function overrideTarget(ev, target2) {\n    if (ev && target2) {\n      ev.persist();\n      if (target2 instanceof Event) {\n        ev.target = target2.target;\n      } else if (target2 instanceof Element) {\n        ev.target = target2;\n      }\n    }\n  }\n  var GlobalClassNames$c = {\n    root: \"ms-ContextualMenu\",\n    container: \"ms-ContextualMenu-container\",\n    list: \"ms-ContextualMenu-list\",\n    header: \"ms-ContextualMenu-header\",\n    title: \"ms-ContextualMenu-title\",\n    isopen: \"is-open\"\n  };\n  var getStyles$q = function(props) {\n    var className2 = props.className, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$c, theme);\n    var fonts = theme.fonts, semanticColors = theme.semanticColors, effects = theme.effects;\n    return {\n      root: [\n        theme.fonts.medium,\n        classNames2.root,\n        classNames2.isopen,\n        {\n          backgroundColor: semanticColors.menuBackground,\n          minWidth: \"180px\"\n        },\n        className2\n      ],\n      container: [\n        classNames2.container,\n        {\n          selectors: {\n            \":focus\": { outline: 0 }\n          }\n        }\n      ],\n      list: [\n        classNames2.list,\n        classNames2.isopen,\n        {\n          listStyleType: \"none\",\n          margin: \"0\",\n          padding: \"0\"\n        }\n      ],\n      header: [\n        classNames2.header,\n        fonts.small,\n        {\n          fontWeight: FontWeights.semibold,\n          color: semanticColors.menuHeader,\n          background: \"none\",\n          backgroundColor: \"transparent\",\n          border: \"none\",\n          height: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          lineHeight: CONTEXTUAL_MENU_ITEM_HEIGHT,\n          cursor: \"default\",\n          padding: \"0px 6px\",\n          userSelect: \"none\",\n          textAlign: \"left\"\n        }\n      ],\n      title: [\n        classNames2.title,\n        {\n          fontSize: fonts.mediumPlus.fontSize,\n          paddingRight: \"14px\",\n          paddingLeft: \"14px\",\n          paddingBottom: \"5px\",\n          paddingTop: \"5px\",\n          backgroundColor: semanticColors.menuItemBackgroundPressed\n        }\n      ],\n      subComponentStyles: {\n        callout: {\n          root: {\n            boxShadow: effects.elevation8\n          }\n        },\n        menuItem: {}\n      }\n    };\n  };\n  function onRenderSubMenu(subMenuProps) {\n    return React__namespace.createElement(LocalContextualMenu, __assign$1({}, subMenuProps));\n  }\n  var LocalContextualMenu = styled(ContextualMenuBase, getStyles$q, function(props) {\n    return {\n      onRenderSubMenu: props.onRenderSubMenu ? composeRenderFunction(props.onRenderSubMenu, onRenderSubMenu) : onRenderSubMenu\n    };\n  }, { scope: \"ContextualMenu\" });\n  var ContextualMenu = LocalContextualMenu;\n  ContextualMenu.displayName = \"ContextualMenu\";\n  var ButtonGlobalClassNames = {\n    msButton: \"ms-Button\",\n    msButtonHasMenu: \"ms-Button--hasMenu\",\n    msButtonIcon: \"ms-Button-icon\",\n    msButtonMenuIcon: \"ms-Button-menuIcon\",\n    msButtonLabel: \"ms-Button-label\",\n    msButtonDescription: \"ms-Button-description\",\n    msButtonScreenReaderText: \"ms-Button-screenReaderText\",\n    msButtonFlexContainer: \"ms-Button-flexContainer\",\n    msButtonTextContainer: \"ms-Button-textContainer\"\n  };\n  var getBaseButtonClassNames = memoizeFunction(function(theme, styles, className2, variantClassName, iconClassName, menuIconClassName, disabled, hasMenu, checked, expanded, isSplit) {\n    var _a2, _b2;\n    var classNames2 = getGlobalClassNames(ButtonGlobalClassNames, theme || {});\n    var isExpanded = expanded && !isSplit;\n    return mergeStyleSets(styles.__shadowConfig__, {\n      root: [\n        classNames2.msButton,\n        styles.root,\n        variantClassName,\n        checked && [\"is-checked\", styles.rootChecked],\n        isExpanded && [\n          \"is-expanded\",\n          styles.rootExpanded,\n          (_a2 = {}, _a2[\":hover .\".concat(classNames2.msButtonIcon)] = styles.iconExpandedHovered, // menuIcon falls back to rootExpandedHovered to support original behavior\n          _a2[\":hover .\".concat(classNames2.msButtonMenuIcon)] = styles.menuIconExpandedHovered || styles.rootExpandedHovered, _a2[\":hover\"] = styles.rootExpandedHovered, _a2)\n        ],\n        hasMenu && [ButtonGlobalClassNames.msButtonHasMenu, styles.rootHasMenu],\n        disabled && [\"is-disabled\", styles.rootDisabled],\n        !disabled && !isExpanded && !checked && (_b2 = {\n          \":hover\": styles.rootHovered\n        }, _b2[\":hover .\".concat(classNames2.msButtonLabel)] = styles.labelHovered, _b2[\":hover .\".concat(classNames2.msButtonIcon)] = styles.iconHovered, _b2[\":hover .\".concat(classNames2.msButtonDescription)] = styles.descriptionHovered, _b2[\":hover .\".concat(classNames2.msButtonMenuIcon)] = styles.menuIconHovered, _b2[\":focus\"] = styles.rootFocused, _b2[\":active\"] = styles.rootPressed, _b2[\":active .\".concat(classNames2.msButtonIcon)] = styles.iconPressed, _b2[\":active .\".concat(classNames2.msButtonDescription)] = styles.descriptionPressed, _b2[\":active .\".concat(classNames2.msButtonMenuIcon)] = styles.menuIconPressed, _b2),\n        disabled && checked && [styles.rootCheckedDisabled],\n        !disabled && checked && {\n          \":hover\": styles.rootCheckedHovered,\n          \":active\": styles.rootCheckedPressed\n        },\n        className2\n      ],\n      flexContainer: [classNames2.msButtonFlexContainer, styles.flexContainer],\n      textContainer: [classNames2.msButtonTextContainer, styles.textContainer],\n      icon: [\n        classNames2.msButtonIcon,\n        iconClassName,\n        styles.icon,\n        isExpanded && styles.iconExpanded,\n        checked && styles.iconChecked,\n        disabled && styles.iconDisabled\n      ],\n      label: [classNames2.msButtonLabel, styles.label, checked && styles.labelChecked, disabled && styles.labelDisabled],\n      menuIcon: [\n        classNames2.msButtonMenuIcon,\n        menuIconClassName,\n        styles.menuIcon,\n        checked && styles.menuIconChecked,\n        disabled && !isSplit && styles.menuIconDisabled,\n        !disabled && !isExpanded && !checked && {\n          \":hover\": styles.menuIconHovered,\n          \":active\": styles.menuIconPressed\n        },\n        isExpanded && [\"is-expanded\", styles.menuIconExpanded]\n      ],\n      description: [\n        classNames2.msButtonDescription,\n        styles.description,\n        checked && styles.descriptionChecked,\n        disabled && styles.descriptionDisabled\n      ],\n      screenReaderText: [classNames2.msButtonScreenReaderText, styles.screenReaderText]\n    });\n  });\n  var SplitButtonGlobalClassNames = {\n    msSplitButtonDivider: \"ms-SplitButton-divider\"\n  };\n  var getSplitButtonClassNames = memoizeFunction(function(styles, disabled, expanded, checked, primaryDisabled) {\n    return {\n      root: mergeStyles(styles.splitButtonMenuButton, expanded && [styles.splitButtonMenuButtonExpanded], disabled && [styles.splitButtonMenuButtonDisabled], checked && !disabled && [styles.splitButtonMenuButtonChecked], primaryDisabled && !disabled && [\n        {\n          \":focus\": styles.splitButtonMenuFocused\n        }\n      ]),\n      splitButtonContainer: mergeStyles(styles.splitButtonContainer, !disabled && checked && [\n        styles.splitButtonContainerChecked,\n        {\n          \":hover\": styles.splitButtonContainerCheckedHovered\n        }\n      ], !disabled && !checked && [\n        {\n          \":hover\": styles.splitButtonContainerHovered,\n          \":focus\": styles.splitButtonContainerFocused\n        }\n      ], disabled && styles.splitButtonContainerDisabled),\n      icon: mergeStyles(styles.splitButtonMenuIcon, disabled && styles.splitButtonMenuIconDisabled, !disabled && primaryDisabled && styles.splitButtonMenuIcon),\n      flexContainer: mergeStyles(styles.splitButtonFlexContainer),\n      divider: mergeStyles(SplitButtonGlobalClassNames.msSplitButtonDivider, styles.splitButtonDivider, (primaryDisabled || disabled) && styles.splitButtonDividerDisabled)\n    };\n  });\n  var TouchIdleDelay$1 = 500;\n  var COMPONENT_NAME$6 = \"BaseButton\";\n  var BaseButton = (\n    /** @class */\n    (function(_super) {\n      __extends(BaseButton2, _super);\n      function BaseButton2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._buttonElement = React__namespace.createRef();\n        _this._splitButtonContainer = React__namespace.createRef();\n        _this._mergedRef = createMergedRef();\n        _this._renderedVisibleMenu = false;\n        _this._getMemoizedMenuButtonKeytipProps = memoizeFunction(function(keytipProps) {\n          return __assign$1(__assign$1({}, keytipProps), { hasMenu: true });\n        });\n        _this._onRenderIcon = function(buttonProps, defaultRender) {\n          var iconProps = _this.props.iconProps;\n          if (iconProps && (iconProps.iconName !== void 0 || iconProps.imageProps)) {\n            var className2 = iconProps.className, imageProps = iconProps.imageProps, rest = __rest(iconProps, [\"className\", \"imageProps\"]);\n            if (iconProps.styles) {\n              return React__namespace.createElement(Icon, __assign$1({ className: css(_this._classNames.icon, className2), imageProps }, rest));\n            }\n            if (iconProps.iconName) {\n              return React__namespace.createElement(FontIcon, __assign$1({ className: css(_this._classNames.icon, className2) }, rest));\n            }\n            if (imageProps) {\n              return React__namespace.createElement(ImageIcon, __assign$1({ className: css(_this._classNames.icon, className2), imageProps }, rest));\n            }\n          }\n          return null;\n        };\n        _this._onRenderTextContents = function() {\n          var _a2 = _this.props, text2 = _a2.text, children2 = _a2.children, _b2 = _a2.secondaryText, secondaryText = _b2 === void 0 ? _this.props.description : _b2, _c2 = _a2.onRenderText, onRenderText = _c2 === void 0 ? _this._onRenderText : _c2, _d2 = _a2.onRenderDescription, onRenderDescription = _d2 === void 0 ? _this._onRenderDescription : _d2;\n          if (text2 || typeof children2 === \"string\" || secondaryText) {\n            return React__namespace.createElement(\n              \"span\",\n              { className: _this._classNames.textContainer },\n              onRenderText(_this.props, _this._onRenderText),\n              onRenderDescription(_this.props, _this._onRenderDescription)\n            );\n          }\n          return [onRenderText(_this.props, _this._onRenderText), onRenderDescription(_this.props, _this._onRenderDescription)];\n        };\n        _this._onRenderText = function() {\n          var text2 = _this.props.text;\n          var children2 = _this.props.children;\n          if (text2 === void 0 && typeof children2 === \"string\") {\n            text2 = children2;\n          }\n          if (_this._hasText()) {\n            return React__namespace.createElement(\"span\", { key: _this._labelId, className: _this._classNames.label, id: _this._labelId }, text2);\n          }\n          return null;\n        };\n        _this._onRenderChildren = function() {\n          var children2 = _this.props.children;\n          if (typeof children2 === \"string\") {\n            return null;\n          }\n          return children2;\n        };\n        _this._onRenderDescription = function(props2) {\n          var _a2 = props2.secondaryText, secondaryText = _a2 === void 0 ? _this.props.description : _a2;\n          return secondaryText ? React__namespace.createElement(\"span\", { key: _this._descriptionId, className: _this._classNames.description, id: _this._descriptionId }, secondaryText) : null;\n        };\n        _this._onRenderAriaDescription = function() {\n          var ariaDescription = _this.props.ariaDescription;\n          return ariaDescription ? React__namespace.createElement(\"span\", { className: _this._classNames.screenReaderText, id: _this._ariaDescriptionId }, ariaDescription) : null;\n        };\n        _this._onRenderMenuIcon = function(props2) {\n          var menuIconProps = _this.props.menuIconProps;\n          return React__namespace.createElement(FontIcon, __assign$1({ iconName: \"ChevronDown\" }, menuIconProps, { className: _this._classNames.menuIcon }));\n        };\n        _this._onRenderMenu = function(menuProps) {\n          var MenuType = _this.props.menuAs ? composeComponentAs(_this.props.menuAs, ContextualMenu) : ContextualMenu;\n          return React__namespace.createElement(MenuType, __assign$1({}, menuProps));\n        };\n        _this._onDismissMenu = function(ev) {\n          var menuProps = _this.props.menuProps;\n          if (menuProps && menuProps.onDismiss) {\n            menuProps.onDismiss(ev);\n          }\n          if (!ev || !ev.defaultPrevented) {\n            _this._dismissMenu();\n          }\n        };\n        _this._dismissMenu = function() {\n          _this._menuShouldFocusOnMount = void 0;\n          _this._menuShouldFocusOnContainer = void 0;\n          _this.setState({ menuHidden: true });\n        };\n        _this._openMenu = function(shouldFocusOnContainer, shouldFocusOnMount) {\n          if (shouldFocusOnMount === void 0) {\n            shouldFocusOnMount = true;\n          }\n          if (_this.props.menuProps) {\n            _this._menuShouldFocusOnContainer = shouldFocusOnContainer;\n            _this._menuShouldFocusOnMount = shouldFocusOnMount;\n            _this._renderedVisibleMenu = true;\n            _this.setState({ menuHidden: false });\n          }\n        };\n        _this._onToggleMenu = function(shouldFocusOnContainer) {\n          var shouldFocusOnMount = true;\n          if (_this.props.menuProps && _this.props.menuProps.shouldFocusOnMount === false) {\n            shouldFocusOnMount = false;\n          }\n          _this.state.menuHidden ? _this._openMenu(shouldFocusOnContainer, shouldFocusOnMount) : _this._dismissMenu();\n        };\n        _this._onSplitContainerFocusCapture = function(ev) {\n          var container = _this._splitButtonContainer.current;\n          if (!container || ev.target && portalContainsElement(ev.target, container)) {\n            return;\n          }\n          container.focus();\n        };\n        _this._onSplitButtonPrimaryClick = function(ev) {\n          if (!_this.state.menuHidden) {\n            _this._dismissMenu();\n          }\n          var singleTouchTarget = _this._processingTouch && !_this.props.toggle;\n          if (!singleTouchTarget && _this.props.onClick) {\n            _this.props.onClick(ev);\n          } else if (singleTouchTarget) {\n            _this._onMenuClick(ev);\n          }\n        };\n        _this._onKeyDown = function(ev) {\n          if (_this.props.disabled && (ev.which === KeyCodes.enter || ev.which === KeyCodes.space)) {\n            ev.preventDefault();\n            ev.stopPropagation();\n          } else if (!_this.props.disabled) {\n            if (_this.props.menuProps) {\n              _this._onMenuKeyDown(ev);\n            } else if (_this.props.onKeyDown !== void 0) {\n              _this.props.onKeyDown(ev);\n            }\n          }\n        };\n        _this._onKeyUp = function(ev) {\n          if (!_this.props.disabled && _this.props.onKeyUp !== void 0) {\n            _this.props.onKeyUp(ev);\n          }\n        };\n        _this._onKeyPress = function(ev) {\n          if (!_this.props.disabled && _this.props.onKeyPress !== void 0) {\n            _this.props.onKeyPress(ev);\n          }\n        };\n        _this._onMouseUp = function(ev) {\n          if (!_this.props.disabled && _this.props.onMouseUp !== void 0) {\n            _this.props.onMouseUp(ev);\n          }\n        };\n        _this._onMouseDown = function(ev) {\n          if (!_this.props.disabled && _this.props.onMouseDown !== void 0) {\n            _this.props.onMouseDown(ev);\n          }\n        };\n        _this._onClick = function(ev) {\n          if (!_this.props.disabled) {\n            if (_this.props.menuProps) {\n              _this._onMenuClick(ev);\n            } else if (_this.props.onClick !== void 0) {\n              _this.props.onClick(ev);\n            }\n          }\n        };\n        _this._onSplitButtonContainerKeyDown = function(ev) {\n          if (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) {\n            if (_this._buttonElement.current) {\n              _this._buttonElement.current.click();\n              ev.preventDefault();\n              ev.stopPropagation();\n            }\n          } else {\n            _this._onMenuKeyDown(ev);\n          }\n        };\n        _this._onMenuKeyDown = function(ev) {\n          var _a2;\n          if (_this.props.disabled) {\n            return;\n          }\n          if (_this.props.onKeyDown) {\n            _this.props.onKeyDown(ev);\n          }\n          var isUp = ev.which === KeyCodes.up;\n          var isDown = ev.which === KeyCodes.down;\n          if (!ev.defaultPrevented && _this._isValidMenuOpenKey(ev)) {\n            var onMenuClick = _this.props.onMenuClick;\n            if (onMenuClick) {\n              onMenuClick(ev, _this.props);\n            }\n            _this._onToggleMenu(false);\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n          if (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) {\n            setFocusVisibility(true, ev.target, (_a2 = _this.context) === null || _a2 === void 0 ? void 0 : _a2.registeredProviders);\n          }\n          if (!(ev.altKey || ev.metaKey) && (isUp || isDown)) {\n            if (!_this.state.menuHidden && _this.props.menuProps) {\n              var currentShouldFocusOnMount = _this._menuShouldFocusOnMount !== void 0 ? _this._menuShouldFocusOnMount : _this.props.menuProps.shouldFocusOnMount;\n              if (!currentShouldFocusOnMount) {\n                ev.preventDefault();\n                ev.stopPropagation();\n                _this._menuShouldFocusOnMount = true;\n                _this.forceUpdate();\n              }\n            }\n          }\n        };\n        _this._onTouchStart = function() {\n          if (_this._isSplitButton && _this._splitButtonContainer.current && !(\"onpointerdown\" in _this._splitButtonContainer.current)) {\n            _this._handleTouchAndPointerEvent();\n          }\n        };\n        _this._onMenuClick = function(ev) {\n          var _a2 = _this.props, onMenuClick = _a2.onMenuClick, menuProps = _a2.menuProps;\n          if (onMenuClick) {\n            onMenuClick(ev, _this.props);\n          }\n          var shouldFocusOnContainer = typeof (menuProps === null || menuProps === void 0 ? void 0 : menuProps.shouldFocusOnContainer) === \"boolean\" ? menuProps.shouldFocusOnContainer : ev.nativeEvent.pointerType === \"mouse\";\n          if (!ev.defaultPrevented) {\n            _this._onToggleMenu(shouldFocusOnContainer);\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n        };\n        initializeComponentRef(_this);\n        _this._async = new Async(_this);\n        _this._events = new EventGroup(_this);\n        warnConditionallyRequiredProps(COMPONENT_NAME$6, props, [\"menuProps\", \"onClick\"], \"split\", _this.props.split);\n        _this._labelId = getId();\n        _this._descriptionId = getId();\n        _this._ariaDescriptionId = getId();\n        _this.state = {\n          menuHidden: true\n        };\n        return _this;\n      }\n      Object.defineProperty(BaseButton2.prototype, \"_isSplitButton\", {\n        get: function() {\n          return !!this.props.menuProps && !!this.props.onClick && this.props.split === true;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      BaseButton2.prototype.render = function() {\n        var _a2;\n        var _b2 = this.props, ariaDescription = _b2.ariaDescription, ariaLabel2 = _b2.ariaLabel, ariaHidden = _b2.ariaHidden, className2 = _b2.className, disabled = _b2.disabled, allowDisabledFocus = _b2.allowDisabledFocus, primaryDisabled = _b2.primaryDisabled, _c2 = _b2.secondaryText, secondaryText = _c2 === void 0 ? this.props.description : _c2, href2 = _b2.href, iconProps = _b2.iconProps, menuIconProps = _b2.menuIconProps, styles = _b2.styles, checked = _b2.checked, variantClassName = _b2.variantClassName, theme = _b2.theme, toggle = _b2.toggle, getClassNames2 = _b2.getClassNames, role = _b2.role;\n        var menuHidden = this.state.menuHidden;\n        var isPrimaryButtonDisabled = disabled || primaryDisabled;\n        this._classNames = getClassNames2 ? getClassNames2(theme, className2, variantClassName, iconProps && iconProps.className, menuIconProps && menuIconProps.className, isPrimaryButtonDisabled, checked, !menuHidden, !!this.props.menuProps, this.props.split, !!allowDisabledFocus) : getBaseButtonClassNames(theme, styles, className2, variantClassName, iconProps && iconProps.className, menuIconProps && menuIconProps.className, isPrimaryButtonDisabled, !!this.props.menuProps, checked, !menuHidden, this.props.split);\n        var _d2 = this, _ariaDescriptionId = _d2._ariaDescriptionId, _labelId = _d2._labelId, _descriptionId = _d2._descriptionId;\n        var renderAsAnchor = !isPrimaryButtonDisabled && !!href2;\n        var tag = renderAsAnchor ? \"a\" : \"button\";\n        var nativeProps = getNativeProps(\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          assign(renderAsAnchor ? {} : { type: \"button\" }, this.props.rootProps, this.props),\n          renderAsAnchor ? anchorProperties : buttonProperties,\n          [\n            \"disabled\"\n            // let disabled buttons be focused and styled as disabled.\n          ]\n        );\n        var resolvedAriaLabel = ariaLabel2 || nativeProps[\"aria-label\"];\n        var ariaDescribedBy = void 0;\n        if (ariaDescription) {\n          ariaDescribedBy = _ariaDescriptionId;\n        } else if (secondaryText && this.props.onRenderDescription !== nullRender) {\n          ariaDescribedBy = _descriptionId;\n        } else if (nativeProps[\"aria-describedby\"]) {\n          ariaDescribedBy = nativeProps[\"aria-describedby\"];\n        }\n        var ariaLabelledBy = void 0;\n        if (nativeProps[\"aria-labelledby\"]) {\n          ariaLabelledBy = nativeProps[\"aria-labelledby\"];\n        } else if (ariaDescribedBy && !resolvedAriaLabel) {\n          ariaLabelledBy = this._hasText() ? _labelId : void 0;\n        }\n        var dataIsFocusable = this.props[\"data-is-focusable\"] === false || disabled && !allowDisabledFocus || this._isSplitButton ? false : true;\n        var isCheckboxTypeRole = role === \"menuitemcheckbox\" || role === \"checkbox\";\n        var checkedOrPressedValue = isCheckboxTypeRole ? !!checked : toggle === true ? !!checked : void 0;\n        var buttonProps = assign(nativeProps, (_a2 = {\n          className: this._classNames.root,\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          ref: this._mergedRef(this.props.elementRef, this._buttonElement),\n          disabled: isPrimaryButtonDisabled && !allowDisabledFocus,\n          onKeyDown: this._onKeyDown,\n          onKeyPress: this._onKeyPress,\n          onKeyUp: this._onKeyUp,\n          onMouseDown: this._onMouseDown,\n          onMouseUp: this._onMouseUp,\n          onClick: this._onClick,\n          \"aria-label\": resolvedAriaLabel,\n          \"aria-labelledby\": ariaLabelledBy,\n          \"aria-describedby\": ariaDescribedBy,\n          \"aria-disabled\": isPrimaryButtonDisabled,\n          \"data-is-focusable\": dataIsFocusable\n        }, // aria-pressed attribute should only be present for toggle buttons\n        // aria-checked attribute should only be present for toggle buttons with checkbox type role\n        _a2[isCheckboxTypeRole ? \"aria-checked\" : \"aria-pressed\"] = checkedOrPressedValue, _a2));\n        if (ariaHidden) {\n          buttonProps[\"aria-hidden\"] = true;\n        }\n        if (this._isSplitButton) {\n          return this._onRenderSplitButtonContent(tag, buttonProps);\n        } else if (this.props.menuProps) {\n          var _e2 = this.props.menuProps.id, id2 = _e2 === void 0 ? \"\".concat(this._labelId, \"-menu\") : _e2;\n          assign(buttonProps, {\n            \"aria-expanded\": !menuHidden,\n            \"aria-controls\": !menuHidden ? id2 : null,\n            \"aria-haspopup\": true\n          });\n        }\n        return this._onRenderContent(tag, buttonProps);\n      };\n      BaseButton2.prototype.componentDidMount = function() {\n        if (this._isSplitButton && this._splitButtonContainer.current) {\n          if (\"onpointerdown\" in this._splitButtonContainer.current) {\n            this._events.on(this._splitButtonContainer.current, \"pointerdown\", this._onPointerDown, true);\n          }\n          if (\"onpointerup\" in this._splitButtonContainer.current && this.props.onPointerUp) {\n            this._events.on(this._splitButtonContainer.current, \"pointerup\", this.props.onPointerUp, true);\n          }\n        }\n      };\n      BaseButton2.prototype.componentDidUpdate = function(prevProps, prevState) {\n        if (this.props.onAfterMenuDismiss && !prevState.menuHidden && this.state.menuHidden) {\n          this.props.onAfterMenuDismiss();\n        }\n      };\n      BaseButton2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n      };\n      BaseButton2.prototype.focus = function() {\n        var _a2, _b2;\n        if (this._isSplitButton && this._splitButtonContainer.current) {\n          setFocusVisibility(true, void 0, (_a2 = this.context) === null || _a2 === void 0 ? void 0 : _a2.registeredProviders);\n          this._splitButtonContainer.current.focus();\n        } else if (this._buttonElement.current) {\n          setFocusVisibility(true, void 0, (_b2 = this.context) === null || _b2 === void 0 ? void 0 : _b2.registeredProviders);\n          this._buttonElement.current.focus();\n        }\n      };\n      BaseButton2.prototype.dismissMenu = function() {\n        this._dismissMenu();\n      };\n      BaseButton2.prototype.openMenu = function(shouldFocusOnContainer, shouldFocusOnMount) {\n        this._openMenu(shouldFocusOnContainer, shouldFocusOnMount);\n      };\n      BaseButton2.prototype._onRenderContent = function(tag, buttonProps) {\n        var _this = this;\n        var props = this.props;\n        var Tag = tag;\n        var menuIconProps = props.menuIconProps, menuProps = props.menuProps, _a2 = props.onRenderIcon, onRenderIcon = _a2 === void 0 ? this._onRenderIcon : _a2, _b2 = props.onRenderAriaDescription, onRenderAriaDescription = _b2 === void 0 ? this._onRenderAriaDescription : _b2, _c2 = props.onRenderChildren, onRenderChildren = _c2 === void 0 ? this._onRenderChildren : _c2, _d2 = props.onRenderMenu, onRenderMenu = _d2 === void 0 ? this._onRenderMenu : _d2, _e2 = props.onRenderMenuIcon, onRenderMenuIcon = _e2 === void 0 ? this._onRenderMenuIcon : _e2, disabled = props.disabled;\n        var keytipProps = props.keytipProps;\n        if (keytipProps && menuProps) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        var Button2 = function(keytipAttributes) {\n          return React__namespace.createElement(\n            Tag,\n            __assign$1({}, buttonProps, keytipAttributes),\n            React__namespace.createElement(\n              \"span\",\n              { className: _this._classNames.flexContainer, \"data-automationid\": \"splitbuttonprimary\" },\n              onRenderIcon(props, _this._onRenderIcon),\n              _this._onRenderTextContents(),\n              onRenderAriaDescription(props, _this._onRenderAriaDescription),\n              onRenderChildren(props, _this._onRenderChildren),\n              !_this._isSplitButton && (menuProps || menuIconProps || _this.props.onRenderMenuIcon) && onRenderMenuIcon(_this.props, _this._onRenderMenuIcon),\n              menuProps && !menuProps.doNotLayer && _this._shouldRenderMenu() && onRenderMenu(_this._getMenuProps(menuProps), _this._onRenderMenu)\n            )\n          );\n        };\n        var Content = keytipProps ? (\n          // If we're making a split button, we won't put the keytip here\n          React__namespace.createElement(KeytipData, { keytipProps: !this._isSplitButton ? keytipProps : void 0, ariaDescribedBy: buttonProps[\"aria-describedby\"], disabled }, function(keytipAttributes) {\n            return Button2(keytipAttributes);\n          })\n        ) : Button2();\n        if (menuProps && menuProps.doNotLayer) {\n          return React__namespace.createElement(\n            React__namespace.Fragment,\n            null,\n            Content,\n            this._shouldRenderMenu() && onRenderMenu(this._getMenuProps(menuProps), this._onRenderMenu)\n          );\n        }\n        return React__namespace.createElement(\n          React__namespace.Fragment,\n          null,\n          Content,\n          React__namespace.createElement(FocusRects, null)\n        );\n      };\n      BaseButton2.prototype._shouldRenderMenu = function() {\n        var menuHidden = this.state.menuHidden;\n        var _a2 = this.props, persistMenu = _a2.persistMenu, renderPersistedMenuHiddenOnMount = _a2.renderPersistedMenuHiddenOnMount;\n        if (!menuHidden) {\n          return true;\n        } else if (persistMenu && (this._renderedVisibleMenu || renderPersistedMenuHiddenOnMount)) {\n          return true;\n        }\n        return false;\n      };\n      BaseButton2.prototype._hasText = function() {\n        return this.props.text !== null && (this.props.text !== void 0 || typeof this.props.children === \"string\");\n      };\n      BaseButton2.prototype._getMenuProps = function(menuProps) {\n        var persistMenu = this.props.persistMenu;\n        var menuHidden = this.state.menuHidden;\n        if (!menuProps.ariaLabel && !menuProps.labelElementId && this._hasText()) {\n          menuProps = __assign$1(__assign$1({}, menuProps), { labelElementId: this._labelId });\n        }\n        return __assign$1(__assign$1({ id: this._labelId + \"-menu\", directionalHint: DirectionalHint.bottomLeftEdge }, menuProps), { shouldFocusOnContainer: this._menuShouldFocusOnContainer, shouldFocusOnMount: this._menuShouldFocusOnMount, hidden: persistMenu ? menuHidden : void 0, className: css(\"ms-BaseButton-menuhost\", menuProps.className), target: this._isSplitButton ? this._splitButtonContainer.current : this._buttonElement.current, onDismiss: this._onDismissMenu });\n      };\n      BaseButton2.prototype._onRenderSplitButtonContent = function(tag, buttonProps) {\n        var _this = this;\n        var _a2 = this.props, _b2 = _a2.styles, styles = _b2 === void 0 ? {} : _b2, disabled = _a2.disabled, allowDisabledFocus = _a2.allowDisabledFocus, checked = _a2.checked, getSplitButtonClassNames$1 = _a2.getSplitButtonClassNames, primaryDisabled = _a2.primaryDisabled, menuProps = _a2.menuProps, toggle = _a2.toggle, role = _a2.role, primaryActionButtonProps = _a2.primaryActionButtonProps;\n        var keytipProps = this.props.keytipProps;\n        var menuHidden = this.state.menuHidden;\n        var classNames2 = getSplitButtonClassNames$1 ? getSplitButtonClassNames$1(!!disabled, !menuHidden, !!checked, !!allowDisabledFocus) : styles && getSplitButtonClassNames(styles, !!disabled, !menuHidden, !!checked, !!primaryDisabled);\n        assign(buttonProps, {\n          onClick: void 0,\n          onPointerDown: void 0,\n          onPointerUp: void 0,\n          tabIndex: -1,\n          \"data-is-focusable\": false\n        });\n        if (keytipProps && menuProps) {\n          keytipProps = this._getMemoizedMenuButtonKeytipProps(keytipProps);\n        }\n        var containerProps = getNativeProps(buttonProps, [], [\"disabled\"]);\n        if (primaryActionButtonProps) {\n          assign(buttonProps, primaryActionButtonProps);\n        }\n        var SplitButton = function(keytipAttributes) {\n          return React__namespace.createElement(\n            \"div\",\n            __assign$1({}, containerProps, { \"data-ktp-target\": keytipAttributes ? keytipAttributes[\"data-ktp-target\"] : void 0, role: role ? role : \"button\", \"aria-disabled\": disabled, \"aria-haspopup\": true, \"aria-expanded\": !menuHidden, \"aria-pressed\": toggle ? !!checked : void 0, \"aria-describedby\": mergeAriaAttributeValues(buttonProps[\"aria-describedby\"], keytipAttributes ? keytipAttributes[\"aria-describedby\"] : void 0), className: classNames2 && classNames2.splitButtonContainer, onKeyDown: _this._onSplitButtonContainerKeyDown, onTouchStart: _this._onTouchStart, ref: _this._splitButtonContainer, \"data-is-focusable\": true, onClick: !disabled && !primaryDisabled ? _this._onSplitButtonPrimaryClick : void 0, tabIndex: !disabled && !primaryDisabled || allowDisabledFocus ? 0 : void 0, \"aria-roledescription\": buttonProps[\"aria-roledescription\"], onFocusCapture: _this._onSplitContainerFocusCapture }),\n            React__namespace.createElement(\n              \"span\",\n              { style: { display: \"flex\", width: \"100%\" } },\n              _this._onRenderContent(tag, buttonProps),\n              _this._onRenderSplitButtonMenuButton(classNames2, keytipAttributes),\n              _this._onRenderSplitButtonDivider(classNames2)\n            )\n          );\n        };\n        return keytipProps ? React__namespace.createElement(KeytipData, { keytipProps, disabled }, function(keytipAttributes) {\n          return SplitButton(keytipAttributes);\n        }) : SplitButton();\n      };\n      BaseButton2.prototype._onRenderSplitButtonDivider = function(classNames2) {\n        if (classNames2 && classNames2.divider) {\n          var onClick = function(ev) {\n            ev.stopPropagation();\n          };\n          return React__namespace.createElement(\"span\", { className: classNames2.divider, \"aria-hidden\": true, onClick });\n        }\n        return null;\n      };\n      BaseButton2.prototype._onRenderSplitButtonMenuButton = function(classNames2, keytipAttributes) {\n        var _a2 = this.props, allowDisabledFocus = _a2.allowDisabledFocus, checked = _a2.checked, disabled = _a2.disabled, splitButtonMenuProps = _a2.splitButtonMenuProps, splitButtonAriaLabel = _a2.splitButtonAriaLabel, primaryDisabled = _a2.primaryDisabled;\n        var menuHidden = this.state.menuHidden;\n        var menuIconProps = this.props.menuIconProps;\n        if (menuIconProps === void 0) {\n          menuIconProps = {\n            iconName: \"ChevronDown\"\n          };\n        }\n        var splitButtonProps = __assign$1(__assign$1({}, splitButtonMenuProps), { styles: classNames2, checked, disabled, allowDisabledFocus, onClick: this._onMenuClick, menuProps: void 0, iconProps: __assign$1(__assign$1({}, menuIconProps), { className: this._classNames.menuIcon }), ariaLabel: splitButtonAriaLabel, \"aria-haspopup\": true, \"aria-expanded\": !menuHidden, \"data-is-focusable\": false });\n        return React__namespace.createElement(BaseButton2, __assign$1({}, splitButtonProps, { \"data-ktp-execute-target\": keytipAttributes ? keytipAttributes[\"data-ktp-execute-target\"] : keytipAttributes, onMouseDown: this._onMouseDown, tabIndex: primaryDisabled && !allowDisabledFocus ? 0 : -1 }));\n      };\n      BaseButton2.prototype._onPointerDown = function(ev) {\n        var onPointerDown = this.props.onPointerDown;\n        if (onPointerDown) {\n          onPointerDown(ev);\n        }\n        if (ev.pointerType === \"touch\") {\n          this._handleTouchAndPointerEvent();\n          ev.preventDefault();\n          ev.stopImmediatePropagation();\n        }\n      };\n      BaseButton2.prototype._handleTouchAndPointerEvent = function() {\n        var _this = this;\n        if (this._lastTouchTimeoutId !== void 0) {\n          this._async.clearTimeout(this._lastTouchTimeoutId);\n          this._lastTouchTimeoutId = void 0;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n          _this._processingTouch = false;\n          _this._lastTouchTimeoutId = void 0;\n          if (_this.state.menuHidden) {\n            _this.focus();\n          }\n        }, TouchIdleDelay$1);\n      };\n      BaseButton2.prototype._isValidMenuOpenKey = function(ev) {\n        if (this.props.menuTriggerKeyCode) {\n          return ev.which === this.props.menuTriggerKeyCode;\n        } else if (this.props.menuProps) {\n          return ev.which === KeyCodes.down && (ev.altKey || ev.metaKey);\n        }\n        return false;\n      };\n      BaseButton2.defaultProps = {\n        baseClassName: \"ms-Button\",\n        styles: {},\n        split: false\n      };\n      BaseButton2.contextType = FocusRectsContext;\n      return BaseButton2;\n    })(React__namespace.Component)\n  );\n  var noOutline = {\n    outline: 0\n  };\n  var iconStyle = function(fontSize2) {\n    return {\n      fontSize: fontSize2,\n      margin: \"0 4px\",\n      height: \"16px\",\n      lineHeight: \"16px\",\n      textAlign: \"center\",\n      flexShrink: 0\n    };\n  };\n  var getStyles$p = memoizeFunction(function(theme) {\n    var _a2, _b2;\n    var semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var border = semanticColors.buttonBorder;\n    var disabledBackground = semanticColors.disabledBackground;\n    var disabledText = semanticColors.disabledText;\n    var buttonHighContrastFocus = {\n      left: -2,\n      top: -2,\n      bottom: -2,\n      right: -2,\n      outlineColor: \"ButtonText\"\n    };\n    return {\n      root: [\n        getFocusStyle(theme, { inset: 1, highContrastStyle: buttonHighContrastFocus, borderColor: \"transparent\" }),\n        theme.fonts.medium,\n        {\n          border: \"1px solid \" + border,\n          borderRadius: effects.roundedCorner2,\n          boxSizing: \"border-box\",\n          cursor: \"pointer\",\n          display: \"inline-flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          padding: \"0 16px\",\n          textDecoration: \"none\",\n          textAlign: \"center\",\n          userSelect: \"none\",\n          // IE11 workaround for preventing shift of child elements of a button when active.\n          \":active > span\": {\n            position: \"relative\",\n            left: 0,\n            top: 0\n          }\n        }\n      ],\n      rootDisabled: [\n        getFocusStyle(theme, { inset: 1, highContrastStyle: buttonHighContrastFocus, borderColor: \"transparent\" }),\n        {\n          backgroundColor: disabledBackground,\n          borderColor: disabledBackground,\n          color: disabledText,\n          cursor: \"default\",\n          \":hover\": noOutline,\n          \":focus\": noOutline\n        }\n      ],\n      iconDisabled: (_a2 = {\n        color: disabledText\n      }, _a2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _a2),\n      menuIconDisabled: (_b2 = {\n        color: disabledText\n      }, _b2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _b2),\n      flexContainer: {\n        display: \"flex\",\n        height: \"100%\",\n        flexWrap: \"nowrap\",\n        justifyContent: \"center\",\n        alignItems: \"center\"\n      },\n      description: {\n        display: \"block\"\n      },\n      textContainer: {\n        flexGrow: 1,\n        display: \"block\"\n      },\n      icon: iconStyle(fonts.mediumPlus.fontSize),\n      menuIcon: iconStyle(fonts.small.fontSize),\n      label: {\n        margin: \"0 4px\",\n        lineHeight: \"100%\",\n        display: \"block\"\n      },\n      screenReaderText: hiddenContentStyle\n    };\n  });\n  var getStyles$o = memoizeFunction(function(theme, customStyles) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;\n    var effects = theme.effects, palette = theme.palette, semanticColors = theme.semanticColors;\n    var buttonHighContrastFocus = {\n      left: -2,\n      top: -2,\n      bottom: -2,\n      right: -2,\n      border: \"none\"\n    };\n    var splitButtonDividerBaseStyles2 = {\n      position: \"absolute\",\n      width: 1,\n      right: 31,\n      top: 8,\n      bottom: 8\n    };\n    var splitButtonStyles = {\n      splitButtonContainer: [\n        getFocusStyle(theme, { highContrastStyle: buttonHighContrastFocus, inset: 2, pointerEvents: \"none\" }),\n        {\n          display: \"inline-flex\",\n          \".ms-Button--default\": {\n            borderTopRightRadius: \"0\",\n            borderBottomRightRadius: \"0\",\n            borderRight: \"none\",\n            flexGrow: \"1\"\n          },\n          \".ms-Button--primary\": (_a2 = {\n            borderTopRightRadius: \"0\",\n            borderBottomRightRadius: \"0\",\n            border: \"none\",\n            flexGrow: \"1\",\n            \":hover\": {\n              border: \"none\"\n            },\n            \":active\": {\n              border: \"none\"\n            }\n          }, _a2[HighContrastSelector] = __assign$1(__assign$1({ color: \"WindowText\", backgroundColor: \"Window\", border: \"1px solid WindowText\", borderRightWidth: \"0\" }, getHighContrastNoAdjustStyle()), { \":hover\": {\n            backgroundColor: \"Highlight\",\n            border: \"1px solid Highlight\",\n            borderRightWidth: \"0\",\n            color: \"HighlightText\"\n          }, \":active\": {\n            border: \"1px solid Highlight\"\n          } }), _a2),\n          \".ms-Button--default + .ms-Button\": (_b2 = {}, _b2[HighContrastSelector] = {\n            border: \"1px solid WindowText\",\n            borderLeftWidth: \"0\",\n            \":hover\": {\n              backgroundColor: \"HighlightText\",\n              borderColor: \"Highlight\",\n              color: \"Highlight\",\n              \".ms-Button-menuIcon\": __assign$1({ backgroundColor: \"HighlightText\", color: \"Highlight\" }, getHighContrastNoAdjustStyle())\n            }\n          }, _b2),\n          '.ms-Button--default + .ms-Button[aria-expanded=\"true\"]': (_c2 = {}, _c2[HighContrastSelector] = {\n            backgroundColor: \"HighlightText\",\n            borderColor: \"Highlight\",\n            color: \"Highlight\",\n            \".ms-Button-menuIcon\": __assign$1({ backgroundColor: \"HighlightText\", color: \"Highlight\" }, getHighContrastNoAdjustStyle())\n          }, _c2),\n          \".ms-Button--primary + .ms-Button\": (_d2 = {\n            border: \"none\"\n          }, _d2[HighContrastSelector] = {\n            border: \"1px solid WindowText\",\n            borderLeftWidth: \"0\",\n            \":hover\": {\n              borderLeftWidth: \"0\",\n              backgroundColor: \"Highlight\",\n              borderColor: \"Highlight\",\n              color: \"HighlightText\",\n              \".ms-Button-menuIcon\": __assign$1(__assign$1({}, getHighContrastNoAdjustStyle()), { color: \"HighlightText\" })\n            }\n          }, _d2),\n          '.ms-Button--primary + .ms-Button[aria-expanded=\"true\"]': (_e2 = {}, _e2[HighContrastSelector] = __assign$1(__assign$1({ backgroundColor: \"Highlight\", borderColor: \"Highlight\", color: \"HighlightText\" }, getHighContrastNoAdjustStyle()), { \".ms-Button-menuIcon\": {\n            color: \"HighlightText\"\n          } }), _e2),\n          \".ms-Button.is-disabled\": (_f = {}, _f[HighContrastSelector] = {\n            color: \"GrayText\",\n            borderColor: \"GrayText\",\n            backgroundColor: \"Window\"\n          }, _f)\n        }\n      ],\n      splitButtonContainerHovered: {\n        \".ms-Button--default.is-disabled\": (_g = {\n          backgroundColor: semanticColors.buttonBackgroundDisabled,\n          color: semanticColors.buttonTextDisabled\n        }, _g[HighContrastSelector] = {\n          color: \"GrayText\",\n          borderColor: \"GrayText\",\n          backgroundColor: \"Window\"\n        }, _g),\n        \".ms-Button--primary.is-disabled\": (_h = {\n          backgroundColor: semanticColors.primaryButtonBackgroundDisabled,\n          color: semanticColors.primaryButtonTextDisabled\n        }, _h[HighContrastSelector] = {\n          color: \"GrayText\",\n          borderColor: \"GrayText\",\n          backgroundColor: \"Window\"\n        }, _h)\n      },\n      splitButtonContainerChecked: {\n        \".ms-Button--primary\": (_j = {}, _j[HighContrastSelector] = __assign$1({ color: \"Window\", backgroundColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _j)\n      },\n      splitButtonContainerCheckedHovered: {\n        \".ms-Button--primary\": (_k = {}, _k[HighContrastSelector] = __assign$1({ color: \"Window\", backgroundColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _k)\n      },\n      splitButtonContainerFocused: {\n        outline: \"none!important\"\n      },\n      splitButtonMenuButton: (_l = {\n        padding: 6,\n        height: \"auto\",\n        boxSizing: \"border-box\",\n        borderRadius: 0,\n        borderTopRightRadius: effects.roundedCorner2,\n        borderBottomRightRadius: effects.roundedCorner2,\n        border: \"1px solid \".concat(palette.neutralSecondaryAlt),\n        borderLeft: \"none\",\n        outline: \"transparent\",\n        userSelect: \"none\",\n        display: \"inline-block\",\n        textDecoration: \"none\",\n        textAlign: \"center\",\n        cursor: \"pointer\",\n        verticalAlign: \"top\",\n        width: 32,\n        marginLeft: -1,\n        marginTop: 0,\n        marginRight: 0,\n        marginBottom: 0\n      }, _l[HighContrastSelector] = {\n        \".ms-Button-menuIcon\": {\n          color: \"WindowText\"\n        }\n      }, _l),\n      splitButtonDivider: __assign$1(__assign$1({}, splitButtonDividerBaseStyles2), (_m = {}, _m[HighContrastSelector] = {\n        backgroundColor: \"WindowText\"\n      }, _m)),\n      splitButtonDividerDisabled: __assign$1(__assign$1({}, splitButtonDividerBaseStyles2), (_o = {}, _o[HighContrastSelector] = {\n        backgroundColor: \"GrayText\"\n      }, _o)),\n      splitButtonMenuButtonDisabled: (_p = {\n        pointerEvents: \"none\",\n        border: \"none\",\n        \":hover\": {\n          cursor: \"default\"\n        },\n        \".ms-Button--primary\": (_q = {}, _q[HighContrastSelector] = {\n          color: \"GrayText\",\n          borderColor: \"GrayText\",\n          backgroundColor: \"Window\"\n        }, _q),\n        \".ms-Button-menuIcon\": (_r = {}, _r[HighContrastSelector] = {\n          color: \"GrayText\"\n        }, _r)\n      }, _p[HighContrastSelector] = {\n        color: \"GrayText\",\n        border: \"1px solid GrayText\",\n        backgroundColor: \"Window\"\n      }, _p),\n      splitButtonFlexContainer: {\n        display: \"flex\",\n        height: \"100%\",\n        flexWrap: \"nowrap\",\n        justifyContent: \"center\",\n        alignItems: \"center\"\n      },\n      splitButtonContainerDisabled: (_s = {\n        outline: \"none\",\n        border: \"none\"\n      }, _s[HighContrastSelector] = __assign$1({ color: \"GrayText\", borderColor: \"GrayText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _s),\n      splitButtonMenuFocused: __assign$1({}, getFocusStyle(theme, { highContrastStyle: buttonHighContrastFocus, inset: 2 }))\n    };\n    return concatStyleSets(splitButtonStyles, customStyles);\n  });\n  var splitButtonDividerBaseStyles = function() {\n    return {\n      position: \"absolute\",\n      width: 1,\n      right: 31,\n      top: 8,\n      bottom: 8\n    };\n  };\n  function standardStyles(theme) {\n    var _a2, _b2, _c2, _d2, _e2;\n    var s2 = theme.semanticColors, p = theme.palette;\n    var buttonBackground = s2.buttonBackground;\n    var buttonBackgroundPressed = s2.buttonBackgroundPressed;\n    var buttonBackgroundHovered = s2.buttonBackgroundHovered;\n    var buttonBackgroundDisabled = s2.buttonBackgroundDisabled;\n    var buttonText = s2.buttonText;\n    var buttonTextHovered = s2.buttonTextHovered;\n    var buttonTextDisabled = s2.buttonTextDisabled;\n    var buttonTextChecked = s2.buttonTextChecked;\n    var buttonTextCheckedHovered = s2.buttonTextCheckedHovered;\n    return {\n      root: {\n        backgroundColor: buttonBackground,\n        color: buttonText\n      },\n      rootHovered: (_a2 = {\n        backgroundColor: buttonBackgroundHovered,\n        color: buttonTextHovered\n      }, _a2[HighContrastSelector] = {\n        borderColor: \"Highlight\",\n        color: \"Highlight\"\n      }, _a2),\n      rootPressed: {\n        backgroundColor: buttonBackgroundPressed,\n        color: buttonTextChecked\n      },\n      rootExpanded: {\n        backgroundColor: buttonBackgroundPressed,\n        color: buttonTextChecked\n      },\n      rootChecked: {\n        backgroundColor: buttonBackgroundPressed,\n        color: buttonTextChecked\n      },\n      rootCheckedHovered: {\n        backgroundColor: buttonBackgroundPressed,\n        color: buttonTextCheckedHovered\n      },\n      rootDisabled: (_b2 = {\n        color: buttonTextDisabled,\n        backgroundColor: buttonBackgroundDisabled\n      }, _b2[HighContrastSelector] = {\n        color: \"GrayText\",\n        borderColor: \"GrayText\",\n        backgroundColor: \"Window\"\n      }, _b2),\n      // Split button styles\n      splitButtonContainer: (_c2 = {}, _c2[HighContrastSelector] = {\n        border: \"none\"\n      }, _c2),\n      splitButtonMenuButton: {\n        color: p.white,\n        backgroundColor: \"transparent\",\n        \":hover\": (_d2 = {\n          backgroundColor: p.neutralLight\n        }, _d2[HighContrastSelector] = {\n          color: \"Highlight\"\n        }, _d2)\n      },\n      splitButtonMenuButtonDisabled: {\n        backgroundColor: s2.buttonBackgroundDisabled,\n        \":hover\": {\n          backgroundColor: s2.buttonBackgroundDisabled\n        }\n      },\n      splitButtonDivider: __assign$1(__assign$1({}, splitButtonDividerBaseStyles()), (_e2 = { backgroundColor: p.neutralTertiaryAlt }, _e2[HighContrastSelector] = {\n        backgroundColor: \"WindowText\"\n      }, _e2)),\n      splitButtonDividerDisabled: {\n        backgroundColor: theme.palette.neutralTertiaryAlt\n      },\n      splitButtonMenuButtonChecked: {\n        backgroundColor: p.neutralQuaternaryAlt,\n        \":hover\": {\n          backgroundColor: p.neutralQuaternaryAlt\n        }\n      },\n      splitButtonMenuButtonExpanded: {\n        backgroundColor: p.neutralQuaternaryAlt,\n        \":hover\": {\n          backgroundColor: p.neutralQuaternaryAlt\n        }\n      },\n      splitButtonMenuIcon: {\n        color: s2.buttonText\n      },\n      splitButtonMenuIconDisabled: {\n        color: s2.buttonTextDisabled\n      }\n    };\n  }\n  function primaryStyles(theme) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j;\n    var p = theme.palette, s2 = theme.semanticColors;\n    return {\n      root: (_a2 = {\n        backgroundColor: s2.primaryButtonBackground,\n        border: \"1px solid \".concat(s2.primaryButtonBackground),\n        color: s2.primaryButtonText\n      }, _a2[HighContrastSelector] = __assign$1({ color: \"Window\", backgroundColor: \"WindowText\", borderColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _a2[\".\".concat(IsFocusVisibleClassName, \" &:focus, :host(.\").concat(IsFocusVisibleClassName, \") &:focus\")] = {\n        \":after\": {\n          border: \"none\",\n          outlineColor: p.white\n        }\n      }, _a2),\n      rootHovered: (_b2 = {\n        backgroundColor: s2.primaryButtonBackgroundHovered,\n        border: \"1px solid \".concat(s2.primaryButtonBackgroundHovered),\n        color: s2.primaryButtonTextHovered\n      }, _b2[HighContrastSelector] = {\n        color: \"Window\",\n        backgroundColor: \"Highlight\",\n        borderColor: \"Highlight\"\n      }, _b2),\n      rootPressed: (_c2 = {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        border: \"1px solid \".concat(s2.primaryButtonBackgroundPressed),\n        color: s2.primaryButtonTextPressed\n      }, _c2[HighContrastSelector] = __assign$1({ color: \"Window\", backgroundColor: \"WindowText\", borderColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _c2),\n      rootExpanded: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        color: s2.primaryButtonTextPressed\n      },\n      rootChecked: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        color: s2.primaryButtonTextPressed\n      },\n      rootCheckedHovered: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        color: s2.primaryButtonTextPressed\n      },\n      rootDisabled: (_d2 = {\n        color: s2.primaryButtonTextDisabled,\n        backgroundColor: s2.primaryButtonBackgroundDisabled\n      }, _d2[HighContrastSelector] = {\n        color: \"GrayText\",\n        borderColor: \"GrayText\",\n        backgroundColor: \"Window\"\n      }, _d2),\n      // Split button styles\n      splitButtonContainer: (_e2 = {}, _e2[HighContrastSelector] = {\n        border: \"none\"\n      }, _e2),\n      splitButtonDivider: __assign$1(__assign$1({}, splitButtonDividerBaseStyles()), (_f = { backgroundColor: p.white }, _f[HighContrastSelector] = {\n        backgroundColor: \"Window\"\n      }, _f)),\n      splitButtonMenuButton: (_g = {\n        backgroundColor: s2.primaryButtonBackground,\n        color: s2.primaryButtonText\n      }, _g[HighContrastSelector] = {\n        backgroundColor: \"Canvas\"\n      }, _g[\":hover\"] = (_h = {\n        backgroundColor: s2.primaryButtonBackgroundHovered\n      }, _h[HighContrastSelector] = {\n        color: \"Highlight\"\n      }, _h), _g),\n      splitButtonMenuButtonDisabled: {\n        backgroundColor: s2.primaryButtonBackgroundDisabled,\n        \":hover\": {\n          backgroundColor: s2.primaryButtonBackgroundDisabled\n        }\n      },\n      splitButtonMenuButtonChecked: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        \":hover\": {\n          backgroundColor: s2.primaryButtonBackgroundPressed\n        }\n      },\n      splitButtonMenuButtonExpanded: {\n        backgroundColor: s2.primaryButtonBackgroundPressed,\n        \":hover\": {\n          backgroundColor: s2.primaryButtonBackgroundPressed\n        }\n      },\n      splitButtonMenuIcon: {\n        color: s2.primaryButtonText\n      },\n      splitButtonMenuIconDisabled: (_j = {\n        color: p.neutralTertiary\n      }, _j[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _j)\n    };\n  }\n  var DEFAULT_BUTTON_MIN_HEIGHT = \"32px\";\n  var DEFAULT_BUTTON_MIN_WIDTH = \"80px\";\n  var getStyles$n = memoizeFunction(function(theme, customStyles, primary) {\n    var baseButtonStyles = getStyles$p(theme);\n    var splitButtonStyles = getStyles$o(theme);\n    var defaultButtonStyles = {\n      root: {\n        minWidth: DEFAULT_BUTTON_MIN_WIDTH,\n        minHeight: DEFAULT_BUTTON_MIN_HEIGHT\n      },\n      label: {\n        fontWeight: FontWeights.semibold\n      }\n    };\n    return concatStyleSets(baseButtonStyles, defaultButtonStyles, primary ? primaryStyles(theme) : standardStyles(theme), splitButtonStyles, customStyles);\n  });\n  var DefaultButton = (\n    /** @class */\n    (function(_super) {\n      __extends(DefaultButton2, _super);\n      function DefaultButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      DefaultButton2.prototype.render = function() {\n        var _a2 = this.props, _b2 = _a2.primary, primary = _b2 === void 0 ? false : _b2, styles = _a2.styles, theme = _a2.theme;\n        return React__namespace.createElement(BaseButton, __assign$1({}, this.props, { variantClassName: primary ? \"ms-Button--primary\" : \"ms-Button--default\", styles: getStyles$n(theme, styles, primary), onRenderDescription: nullRender }));\n      };\n      DefaultButton2 = __decorate([\n        customizable(\"DefaultButton\", [\"theme\", \"styles\"])\n      ], DefaultButton2);\n      return DefaultButton2;\n    })(React__namespace.Component)\n  );\n  var DEFAULT_BUTTON_HEIGHT = \"40px\";\n  var DEFAULT_PADDING = \"0 4px\";\n  var getStyles$m = memoizeFunction(function(theme, customStyles) {\n    var _a2, _b2, _c2;\n    var baseButtonStyles = getStyles$p(theme);\n    var actionButtonStyles = {\n      root: (_a2 = {\n        padding: DEFAULT_PADDING,\n        height: DEFAULT_BUTTON_HEIGHT,\n        color: theme.palette.neutralPrimary,\n        backgroundColor: \"transparent\",\n        border: \"1px solid transparent\"\n      }, _a2[HighContrastSelector] = {\n        borderColor: \"Window\"\n      }, _a2),\n      rootHovered: (_b2 = {\n        color: theme.palette.themePrimary\n      }, _b2[HighContrastSelector] = {\n        color: \"Highlight\"\n      }, _b2),\n      iconHovered: {\n        color: theme.palette.themePrimary\n      },\n      rootPressed: {\n        color: theme.palette.black\n      },\n      rootExpanded: {\n        color: theme.palette.themePrimary\n      },\n      iconPressed: {\n        color: theme.palette.themeDarker\n      },\n      rootDisabled: (_c2 = {\n        color: theme.palette.neutralTertiary,\n        backgroundColor: \"transparent\",\n        borderColor: \"transparent\"\n      }, _c2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _c2),\n      rootChecked: {\n        color: theme.palette.black\n      },\n      iconChecked: {\n        color: theme.palette.themeDarker\n      },\n      flexContainer: {\n        justifyContent: \"flex-start\"\n      },\n      icon: {\n        color: theme.palette.themeDarkAlt\n      },\n      iconDisabled: {\n        color: \"inherit\"\n      },\n      menuIcon: {\n        color: theme.palette.neutralSecondary\n      },\n      textContainer: {\n        flexGrow: 0\n      }\n    };\n    return concatStyleSets(baseButtonStyles, actionButtonStyles, customStyles);\n  });\n  var ActionButton = (\n    /** @class */\n    (function(_super) {\n      __extends(ActionButton2, _super);\n      function ActionButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      ActionButton2.prototype.render = function() {\n        var _a2 = this.props, styles = _a2.styles, theme = _a2.theme;\n        return React__namespace.createElement(BaseButton, __assign$1({}, this.props, { variantClassName: \"ms-Button--action ms-Button--command\", styles: getStyles$m(theme, styles), onRenderDescription: nullRender }));\n      };\n      ActionButton2 = __decorate([\n        customizable(\"ActionButton\", [\"theme\", \"styles\"])\n      ], ActionButton2);\n      return ActionButton2;\n    })(React__namespace.Component)\n  );\n  var getStyles$l = memoizeFunction(function(theme, customStyles) {\n    var _a2;\n    var baseButtonStyles = getStyles$p(theme);\n    var splitButtonStyles = getStyles$o(theme);\n    var palette = theme.palette, semanticColors = theme.semanticColors;\n    var iconButtonStyles = {\n      root: {\n        padding: \"0 4px\",\n        width: \"32px\",\n        height: \"32px\",\n        backgroundColor: \"transparent\",\n        border: \"none\",\n        color: semanticColors.link\n      },\n      rootHovered: (_a2 = {\n        color: palette.themeDarkAlt,\n        backgroundColor: palette.neutralLighter\n      }, _a2[HighContrastSelector] = {\n        borderColor: \"Highlight\",\n        color: \"Highlight\"\n      }, _a2),\n      rootHasMenu: {\n        width: \"auto\"\n      },\n      rootPressed: {\n        color: palette.themeDark,\n        backgroundColor: palette.neutralLight\n      },\n      rootExpanded: {\n        color: palette.themeDark,\n        backgroundColor: palette.neutralLight\n      },\n      rootChecked: {\n        color: palette.themeDark,\n        backgroundColor: palette.neutralLight\n      },\n      rootCheckedHovered: {\n        color: palette.themeDark,\n        backgroundColor: palette.neutralQuaternaryAlt\n      },\n      rootDisabled: {\n        color: palette.neutralTertiaryAlt\n      }\n    };\n    return concatStyleSets(baseButtonStyles, iconButtonStyles, splitButtonStyles, customStyles);\n  });\n  var IconButton = (\n    /** @class */\n    (function(_super) {\n      __extends(IconButton2, _super);\n      function IconButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      IconButton2.prototype.render = function() {\n        var _a2 = this.props, styles = _a2.styles, theme = _a2.theme;\n        return React__namespace.createElement(BaseButton, __assign$1({}, this.props, { variantClassName: \"ms-Button--icon\", styles: getStyles$l(theme, styles), onRenderText: nullRender, onRenderDescription: nullRender }));\n      };\n      IconButton2 = __decorate([\n        customizable(\"IconButton\", [\"theme\", \"styles\"])\n      ], IconButton2);\n      return IconButton2;\n    })(React__namespace.Component)\n  );\n  var PrimaryButton = (\n    /** @class */\n    (function(_super) {\n      __extends(PrimaryButton2, _super);\n      function PrimaryButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      PrimaryButton2.prototype.render = function() {\n        return React__namespace.createElement(DefaultButton, __assign$1({}, this.props, { primary: true, onRenderDescription: nullRender }));\n      };\n      PrimaryButton2 = __decorate([\n        customizable(\"PrimaryButton\", [\"theme\", \"styles\"])\n      ], PrimaryButton2);\n      return PrimaryButton2;\n    })(React__namespace.Component)\n  );\n  var getStyles$k = memoizeFunction(function(theme, customStyles, focusInset, focusColor) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m, _o;\n    var baseButtonStyles = getStyles$p(theme);\n    var baseSplitButtonStyles = getStyles$o(theme);\n    var p = theme.palette, semanticColors = theme.semanticColors;\n    var commandButtonHighContrastFocus = {\n      left: 4,\n      top: 4,\n      bottom: 4,\n      right: 4,\n      border: \"none\"\n    };\n    var commandButtonStyles = {\n      root: [\n        getFocusStyle(theme, {\n          inset: 2,\n          highContrastStyle: commandButtonHighContrastFocus,\n          borderColor: \"transparent\"\n        }),\n        theme.fonts.medium,\n        (_a2 = {\n          minWidth: \"40px\",\n          backgroundColor: p.white,\n          color: p.neutralPrimary,\n          padding: \"0 4px\",\n          border: \"none\",\n          borderRadius: 0\n        }, _a2[HighContrastSelector] = {\n          border: \"none\"\n        }, _a2)\n      ],\n      rootHovered: (_b2 = {\n        backgroundColor: p.neutralLighter,\n        color: p.neutralDark\n      }, _b2[HighContrastSelector] = {\n        color: \"Highlight\"\n      }, _b2[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDarkAlt\n      }, _b2[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _b2),\n      rootPressed: (_c2 = {\n        backgroundColor: p.neutralLight,\n        color: p.neutralDark\n      }, _c2[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDark\n      }, _c2[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _c2),\n      rootChecked: (_d2 = {\n        backgroundColor: p.neutralLight,\n        color: p.neutralDark\n      }, _d2[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDark\n      }, _d2[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _d2),\n      rootCheckedHovered: (_e2 = {\n        backgroundColor: p.neutralQuaternaryAlt\n      }, _e2[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDark\n      }, _e2[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _e2),\n      rootExpanded: (_f = {\n        backgroundColor: p.neutralLight,\n        color: p.neutralDark\n      }, _f[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n        color: p.themeDark\n      }, _f[\".\".concat(ButtonGlobalClassNames.msButtonMenuIcon)] = {\n        color: p.neutralPrimary\n      }, _f),\n      rootExpandedHovered: {\n        backgroundColor: p.neutralQuaternaryAlt\n      },\n      rootDisabled: (_g = {\n        backgroundColor: p.white\n      }, _g[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = (_h = {\n        color: semanticColors.disabledBodySubtext\n      }, _h[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _h), _g[HighContrastSelector] = __assign$1({ color: \"GrayText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _g),\n      // Split button styles\n      splitButtonContainer: (_j = {\n        height: \"100%\"\n      }, _j[HighContrastSelector] = {\n        border: \"none\"\n      }, _j),\n      splitButtonDividerDisabled: (_k = {}, _k[HighContrastSelector] = {\n        backgroundColor: \"Window\"\n      }, _k),\n      splitButtonDivider: {\n        backgroundColor: p.neutralTertiaryAlt\n      },\n      splitButtonMenuButton: {\n        backgroundColor: p.white,\n        border: \"none\",\n        borderTopRightRadius: \"0\",\n        borderBottomRightRadius: \"0\",\n        color: p.neutralSecondary,\n        \":hover\": (_l = {\n          backgroundColor: p.neutralLighter,\n          color: p.neutralDark\n        }, _l[HighContrastSelector] = {\n          color: \"Highlight\"\n        }, _l[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n          color: p.neutralPrimary\n        }, _l),\n        \":active\": (_m = {\n          backgroundColor: p.neutralLight\n        }, _m[\".\".concat(ButtonGlobalClassNames.msButtonIcon)] = {\n          color: p.neutralPrimary\n        }, _m)\n      },\n      splitButtonMenuButtonDisabled: (_o = {\n        backgroundColor: p.white\n      }, _o[HighContrastSelector] = __assign$1({ color: \"GrayText\", border: \"none\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _o),\n      splitButtonMenuButtonChecked: {\n        backgroundColor: p.neutralLight,\n        color: p.neutralDark,\n        \":hover\": {\n          backgroundColor: p.neutralQuaternaryAlt\n        }\n      },\n      splitButtonMenuButtonExpanded: {\n        backgroundColor: p.neutralLight,\n        color: p.black,\n        \":hover\": {\n          backgroundColor: p.neutralQuaternaryAlt\n        }\n      },\n      splitButtonMenuIcon: {\n        color: p.neutralPrimary\n      },\n      splitButtonMenuIconDisabled: {\n        color: p.neutralTertiary\n      },\n      label: {\n        fontWeight: \"normal\"\n        // theme.fontWeights.semibold,\n      },\n      icon: {\n        color: p.themePrimary\n      },\n      menuIcon: {\n        color: p.neutralSecondary\n      }\n    };\n    return concatStyleSets(baseButtonStyles, baseSplitButtonStyles, commandButtonStyles, customStyles);\n  });\n  var CommandBarButton = (\n    /** @class */\n    (function(_super) {\n      __extends(CommandBarButton2, _super);\n      function CommandBarButton2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      CommandBarButton2.prototype.render = function() {\n        var _a2 = this.props, styles = _a2.styles, theme = _a2.theme;\n        return React__namespace.createElement(BaseButton, __assign$1({}, this.props, { variantClassName: \"ms-Button--commandBar\", styles: getStyles$k(theme, styles), onRenderDescription: nullRender }));\n      };\n      CommandBarButton2 = __decorate([\n        customizable(\"CommandBarButton\", [\"theme\", \"styles\"])\n      ], CommandBarButton2);\n      return CommandBarButton2;\n    })(React__namespace.Component)\n  );\n  var CommandButton = ActionButton;\n  var getClassNames$k = classNamesFunction({\n    // Label is used a lot by other components.\n    // It's likely to see expected cases which pass different className to the Label.\n    // Therefore setting a larger cache size.\n    cacheSize: 100\n  });\n  var LabelBase = (\n    /** @class */\n    (function(_super) {\n      __extends(LabelBase2, _super);\n      function LabelBase2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      LabelBase2.prototype.render = function() {\n        var _a2 = this.props, _b2 = _a2.as, RootType = _b2 === void 0 ? \"label\" : _b2, children2 = _a2.children, className2 = _a2.className, disabled = _a2.disabled, styles = _a2.styles, required2 = _a2.required, theme = _a2.theme;\n        var classNames2 = getClassNames$k(styles, {\n          className: className2,\n          disabled,\n          required: required2,\n          theme\n        });\n        return React__namespace.createElement(RootType, __assign$1({}, getNativeProps(this.props, divProperties), { className: classNames2.root }), children2);\n      };\n      return LabelBase2;\n    })(React__namespace.Component)\n  );\n  var getStyles$j = function(props) {\n    var _a2;\n    var theme = props.theme, className2 = props.className, disabled = props.disabled, required2 = props.required;\n    var semanticColors = theme.semanticColors;\n    var labelFontWeight = FontWeights.semibold;\n    var labelColor = semanticColors.bodyText;\n    var labelDisabledColor = semanticColors.disabledBodyText;\n    var labelRequiredStarColor = semanticColors.errorText;\n    return {\n      root: [\n        \"ms-Label\",\n        theme.fonts.medium,\n        {\n          fontWeight: labelFontWeight,\n          color: labelColor,\n          boxSizing: \"border-box\",\n          boxShadow: \"none\",\n          margin: 0,\n          display: \"block\",\n          padding: \"5px 0\",\n          wordWrap: \"break-word\",\n          overflowWrap: \"break-word\"\n        },\n        disabled && {\n          color: labelDisabledColor,\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _a2)\n        },\n        required2 && {\n          selectors: {\n            \"::after\": {\n              content: \"' *'\",\n              color: labelRequiredStarColor,\n              paddingRight: 12\n            }\n          }\n        },\n        className2\n      ]\n    };\n  };\n  var Label$2 = styled(LabelBase, getStyles$j, void 0, {\n    scope: \"Label\"\n  });\n  var getClassNames$j = classNamesFunction();\n  var LARGE_IMAGE_SIZE = 71;\n  var DEFAULT_PROPS$3 = {\n    // This ensures default imageSize value doesn't mutate. Mutation can cause style re-calcuation.\n    imageSize: { width: 32, height: 32 }\n  };\n  var ChoiceGroupOptionBase = function(propsWithoutDefaults) {\n    var props = getPropsWithDefaults(__assign$1(__assign$1({}, DEFAULT_PROPS$3), { key: propsWithoutDefaults.itemKey }), propsWithoutDefaults);\n    var ariaLabel2 = props.ariaLabel, focused = props.focused, required2 = props.required, theme = props.theme, iconProps = props.iconProps, imageSrc = props.imageSrc, imageSize = props.imageSize, disabled = props.disabled, checked = props.checked, id2 = props.id, styles = props.styles, name = props.name, rest = __rest(props, [\"ariaLabel\", \"focused\", \"required\", \"theme\", \"iconProps\", \"imageSrc\", \"imageSize\", \"disabled\", \"checked\", \"id\", \"styles\", \"name\"]);\n    var classNames2 = getClassNames$j(styles, {\n      theme,\n      hasIcon: !!iconProps,\n      hasImage: !!imageSrc,\n      checked,\n      disabled,\n      imageIsLarge: !!imageSrc && (imageSize.width > LARGE_IMAGE_SIZE || imageSize.height > LARGE_IMAGE_SIZE),\n      imageSize,\n      focused\n    });\n    var _a2 = getNativeProps(rest, inputProperties), className2 = _a2.className, nativeProps = __rest(_a2, [\"className\"]);\n    var defaultOnRenderLabel = function() {\n      return React__namespace.createElement(\"span\", { id: props.labelId, className: \"ms-ChoiceFieldLabel\" }, props.text);\n    };\n    var defaultOnRenderField = function() {\n      var _a3 = props.imageAlt, imageAlt = _a3 === void 0 ? \"\" : _a3, selectedImageSrc = props.selectedImageSrc;\n      var onRenderLabel = props.onRenderLabel ? composeRenderFunction(props.onRenderLabel, defaultOnRenderLabel) : defaultOnRenderLabel;\n      var label2 = onRenderLabel(__assign$1(__assign$1({}, props), { key: props.itemKey }));\n      return React__namespace.createElement(\n        \"label\",\n        { htmlFor: id2, className: classNames2.field },\n        imageSrc && React__namespace.createElement(\n          \"div\",\n          { className: classNames2.innerField },\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.imageWrapper },\n            React__namespace.createElement(Image$1, __assign$1({ src: imageSrc, alt: imageAlt }, imageSize))\n          ),\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.selectedImageWrapper },\n            React__namespace.createElement(Image$1, __assign$1({ src: selectedImageSrc, alt: imageAlt }, imageSize))\n          )\n        ),\n        iconProps && React__namespace.createElement(\n          \"div\",\n          { className: classNames2.innerField },\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.iconWrapper },\n            React__namespace.createElement(Icon, __assign$1({}, iconProps))\n          )\n        ),\n        imageSrc || iconProps ? React__namespace.createElement(\"div\", { className: classNames2.labelWrapper }, label2) : label2\n      );\n    };\n    var _b2 = props.onRenderField, onRenderField = _b2 === void 0 ? defaultOnRenderField : _b2;\n    var onChange = function(evt) {\n      var _a3;\n      (_a3 = props.onChange) === null || _a3 === void 0 ? void 0 : _a3.call(props, evt, __assign$1(__assign$1({}, props), { key: props.itemKey }));\n    };\n    var onBlur = function(evt) {\n      var _a3;\n      (_a3 = props.onBlur) === null || _a3 === void 0 ? void 0 : _a3.call(props, evt);\n    };\n    var onFocus = function(evt) {\n      var _a3;\n      (_a3 = props.onFocus) === null || _a3 === void 0 ? void 0 : _a3.call(props, evt, __assign$1(__assign$1({}, props), { key: props.itemKey }));\n    };\n    return React__namespace.createElement(\n      \"div\",\n      { className: classNames2.root },\n      React__namespace.createElement(\n        \"div\",\n        { className: classNames2.choiceFieldWrapper },\n        React__namespace.createElement(\"input\", __assign$1({ \"aria-label\": ariaLabel2, id: id2, className: css(classNames2.input, className2), type: \"radio\", name, disabled, checked, required: required2 }, nativeProps, { onChange, onFocus, onBlur })),\n        onRenderField(__assign$1(__assign$1({}, props), { key: props.itemKey }), defaultOnRenderField)\n      )\n    );\n  };\n  ChoiceGroupOptionBase.displayName = \"ChoiceGroupOption\";\n  var GlobalClassNames$b = {\n    root: \"ms-ChoiceField\",\n    choiceFieldWrapper: \"ms-ChoiceField-wrapper\",\n    input: \"ms-ChoiceField-input\",\n    field: \"ms-ChoiceField-field\",\n    innerField: \"ms-ChoiceField-innerField\",\n    imageWrapper: \"ms-ChoiceField-imageWrapper\",\n    iconWrapper: \"ms-ChoiceField-iconWrapper\",\n    labelWrapper: \"ms-ChoiceField-labelWrapper\",\n    checked: \"is-checked\"\n  };\n  var labelWrapperLineHeight = 15;\n  var labelWrapperHeight = labelWrapperLineHeight * 2 + 2;\n  var iconSize = 32;\n  var choiceFieldSize = 20;\n  var choiceFieldTransitionDuration = \"200ms\";\n  var choiceFieldTransitionTiming = \"cubic-bezier(.4, 0, .23, 1)\";\n  var radioButtonSpacing = 3;\n  var radioButtonInnerSize = 5;\n  function getChoiceGroupFocusStyle(focusBorderColor, hasIconOrImage) {\n    var _a2, _b2;\n    return [\n      \"is-inFocus\",\n      {\n        selectors: (_a2 = {}, _a2[\".\".concat(IsFocusVisibleClassName, \" &, :host(.\").concat(IsFocusVisibleClassName, \") &\")] = {\n          position: \"relative\",\n          outline: \"transparent\",\n          selectors: {\n            \"::-moz-focus-inner\": {\n              border: 0\n            },\n            \":after\": {\n              content: '\"\"',\n              top: -2,\n              right: -2,\n              bottom: -2,\n              left: -2,\n              pointerEvents: \"none\",\n              border: \"1px solid \".concat(focusBorderColor),\n              position: \"absolute\",\n              selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n                borderColor: \"WindowText\",\n                borderWidth: hasIconOrImage ? 1 : 2\n              }, _b2)\n            }\n          }\n        }, _a2)\n      }\n    ];\n  }\n  function getImageWrapperStyle(isSelectedImageWrapper, className2, checked) {\n    return [\n      className2,\n      {\n        paddingBottom: 2,\n        transitionProperty: \"opacity\",\n        transitionDuration: choiceFieldTransitionDuration,\n        transitionTimingFunction: \"ease\",\n        selectors: {\n          \".ms-Image\": {\n            display: \"inline-block\",\n            borderStyle: \"none\"\n          }\n        }\n      },\n      (checked ? !isSelectedImageWrapper : isSelectedImageWrapper) && [\n        \"is-hidden\",\n        {\n          position: \"absolute\",\n          left: 0,\n          top: 0,\n          width: \"100%\",\n          height: \"100%\",\n          overflow: \"hidden\",\n          opacity: 0\n        }\n      ]\n    ];\n  }\n  var getStyles$i = function(props) {\n    var _a2, _b2, _c2, _d2, _e2;\n    var theme = props.theme, hasIcon = props.hasIcon, hasImage = props.hasImage, checked = props.checked, disabled = props.disabled, imageIsLarge = props.imageIsLarge, focused = props.focused, imageSize = props.imageSize;\n    var palette = theme.palette, semanticColors = theme.semanticColors, fonts = theme.fonts;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$b, theme);\n    var circleBorderColor = palette.neutralPrimary;\n    var circleHoveredBorderColor = semanticColors.inputBorderHovered;\n    var circleCheckedBorderColor = semanticColors.inputBackgroundChecked;\n    var circleCheckedHoveredBorderColor = palette.themeDark;\n    var circleDisabledBorderColor = semanticColors.disabledBodySubtext;\n    var circleBackgroundColor = semanticColors.bodyBackground;\n    var dotUncheckedHoveredColor = palette.neutralSecondary;\n    var dotCheckedColor = semanticColors.inputBackgroundChecked;\n    var dotCheckedHoveredColor = palette.themeDark;\n    var dotDisabledColor = semanticColors.disabledBodySubtext;\n    var labelHoverFocusColor = palette.neutralDark;\n    var focusBorderColor = semanticColors.focusBorder;\n    var iconOrImageChoiceBorderUncheckedHoveredColor = semanticColors.inputBorderHovered;\n    var iconOrImageChoiceBorderCheckedColor = semanticColors.inputBackgroundChecked;\n    var iconOrImageChoiceBorderCheckedHoveredColor = palette.themeDark;\n    var iconOrImageChoiceBackgroundColor = palette.neutralLighter;\n    var fieldHoverOrFocusProperties = {\n      selectors: {\n        \".ms-ChoiceFieldLabel\": {\n          color: labelHoverFocusColor\n        },\n        \":before\": {\n          borderColor: checked ? circleCheckedHoveredBorderColor : circleHoveredBorderColor\n        },\n        \":after\": [\n          !hasIcon && !hasImage && !checked && {\n            content: '\"\"',\n            transitionProperty: \"background-color\",\n            left: 5,\n            top: 5,\n            width: 10,\n            height: 10,\n            backgroundColor: dotUncheckedHoveredColor\n          },\n          checked && {\n            borderColor: dotCheckedHoveredColor,\n            background: dotCheckedHoveredColor\n          }\n        ]\n      }\n    };\n    var enabledFieldWithImageHoverOrFocusProperties = {\n      borderColor: checked ? iconOrImageChoiceBorderCheckedHoveredColor : iconOrImageChoiceBorderUncheckedHoveredColor,\n      selectors: {\n        \":before\": {\n          opacity: 1,\n          borderColor: checked ? circleCheckedHoveredBorderColor : circleHoveredBorderColor\n        }\n      }\n    };\n    var circleAreaProperties = [\n      {\n        content: '\"\"',\n        display: \"inline-block\",\n        backgroundColor: circleBackgroundColor,\n        borderWidth: 1,\n        borderStyle: \"solid\",\n        borderColor: circleBorderColor,\n        width: choiceFieldSize,\n        height: choiceFieldSize,\n        fontWeight: \"normal\",\n        position: \"absolute\",\n        top: 0,\n        left: 0,\n        boxSizing: \"border-box\",\n        transitionProperty: \"border-color\",\n        transitionDuration: choiceFieldTransitionDuration,\n        transitionTimingFunction: choiceFieldTransitionTiming,\n        borderRadius: \"50%\"\n      },\n      disabled && {\n        borderColor: circleDisabledBorderColor,\n        selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ borderColor: \"GrayText\", background: \"Window\" }, getHighContrastNoAdjustStyle()), _a2)\n      },\n      checked && {\n        borderColor: disabled ? circleDisabledBorderColor : circleCheckedBorderColor,\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n          borderColor: \"Highlight\",\n          background: \"Window\",\n          forcedColorAdjust: \"none\"\n        }, _b2)\n      },\n      (hasIcon || hasImage) && {\n        top: radioButtonSpacing,\n        right: radioButtonSpacing,\n        left: \"auto\",\n        // To reset the value of 'left' to its default value, so that 'right' works\n        opacity: checked ? 1 : 0\n      }\n    ];\n    var dotAreaProperties = [\n      {\n        content: '\"\"',\n        width: 0,\n        height: 0,\n        borderRadius: \"50%\",\n        position: \"absolute\",\n        left: choiceFieldSize / 2,\n        right: 0,\n        transitionProperty: \"border-width\",\n        transitionDuration: choiceFieldTransitionDuration,\n        transitionTimingFunction: choiceFieldTransitionTiming,\n        boxSizing: \"border-box\"\n      },\n      checked && {\n        borderWidth: 5,\n        borderStyle: \"solid\",\n        borderColor: disabled ? dotDisabledColor : dotCheckedColor,\n        background: dotCheckedColor,\n        left: 5,\n        top: 5,\n        width: 10,\n        height: 10,\n        selectors: (_c2 = {}, _c2[HighContrastSelector] = {\n          borderColor: \"Highlight\",\n          forcedColorAdjust: \"none\"\n        }, _c2)\n      },\n      checked && (hasIcon || hasImage) && {\n        top: radioButtonSpacing + radioButtonInnerSize,\n        right: radioButtonSpacing + radioButtonInnerSize,\n        left: \"auto\"\n        // To reset the value of 'left' to its default value, so that 'right' works\n      }\n    ];\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          display: \"flex\",\n          alignItems: \"center\",\n          boxSizing: \"border-box\",\n          color: semanticColors.bodyText,\n          minHeight: 26,\n          border: \"none\",\n          position: \"relative\",\n          marginTop: 8,\n          selectors: {\n            \".ms-ChoiceFieldLabel\": {\n              display: \"inline-block\"\n            }\n          }\n        },\n        !hasIcon && !hasImage && {\n          selectors: {\n            \".ms-ChoiceFieldLabel\": {\n              paddingLeft: \"26px\"\n            }\n          }\n        },\n        hasImage && \"ms-ChoiceField--image\",\n        hasIcon && \"ms-ChoiceField--icon\",\n        (hasIcon || hasImage) && {\n          display: \"inline-flex\",\n          fontSize: 0,\n          margin: \"0 4px 4px 0\",\n          paddingLeft: 0,\n          backgroundColor: iconOrImageChoiceBackgroundColor,\n          height: \"100%\"\n        }\n      ],\n      choiceFieldWrapper: [\n        classNames2.choiceFieldWrapper,\n        focused && getChoiceGroupFocusStyle(focusBorderColor, hasIcon || hasImage)\n      ],\n      // The hidden input\n      input: [\n        classNames2.input,\n        {\n          position: \"absolute\",\n          opacity: 0,\n          top: 0,\n          right: 0,\n          width: \"100%\",\n          height: \"100%\",\n          margin: 0\n        },\n        disabled && \"is-disabled\"\n      ],\n      field: [\n        classNames2.field,\n        checked && classNames2.checked,\n        {\n          display: \"inline-block\",\n          cursor: \"pointer\",\n          marginTop: 0,\n          position: \"relative\",\n          verticalAlign: \"top\",\n          userSelect: \"none\",\n          minHeight: 20,\n          selectors: {\n            \":hover\": !disabled && fieldHoverOrFocusProperties,\n            \":focus\": !disabled && fieldHoverOrFocusProperties,\n            // The circle\n            \":before\": circleAreaProperties,\n            // The dot\n            \":after\": dotAreaProperties\n          }\n        },\n        hasIcon && \"ms-ChoiceField--icon\",\n        hasImage && \"ms-ChoiceField-field--image\",\n        (hasIcon || hasImage) && {\n          boxSizing: \"content-box\",\n          cursor: \"pointer\",\n          paddingTop: 22,\n          margin: 0,\n          textAlign: \"center\",\n          transitionProperty: \"all\",\n          transitionDuration: choiceFieldTransitionDuration,\n          transitionTimingFunction: \"ease\",\n          border: \"1px solid transparent\",\n          justifyContent: \"center\",\n          alignItems: \"center\",\n          display: \"flex\",\n          flexDirection: \"column\"\n        },\n        checked && {\n          borderColor: iconOrImageChoiceBorderCheckedColor\n        },\n        (hasIcon || hasImage) && !disabled && {\n          selectors: {\n            \":hover\": enabledFieldWithImageHoverOrFocusProperties,\n            \":focus\": enabledFieldWithImageHoverOrFocusProperties\n          }\n        },\n        disabled && {\n          cursor: \"default\",\n          selectors: {\n            \".ms-ChoiceFieldLabel\": {\n              color: semanticColors.disabledBodyText,\n              selectors: (_d2 = {}, _d2[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _d2)\n            }\n          }\n        },\n        checked && disabled && {\n          borderColor: iconOrImageChoiceBackgroundColor\n        }\n      ],\n      innerField: [\n        classNames2.innerField,\n        hasImage && {\n          // using non-null assertion because we have a default in `ChoiceGroupOptionBase` class.\n          height: imageSize.height,\n          width: imageSize.width\n        },\n        (hasIcon || hasImage) && {\n          position: \"relative\",\n          display: \"inline-block\",\n          paddingLeft: 30,\n          paddingRight: 30\n        },\n        (hasIcon || hasImage) && imageIsLarge && {\n          paddingLeft: 24,\n          paddingRight: 24\n        },\n        (hasIcon || hasImage) && disabled && {\n          opacity: 0.25,\n          selectors: (_e2 = {}, _e2[HighContrastSelector] = {\n            color: \"GrayText\",\n            opacity: 1\n          }, _e2)\n        }\n      ],\n      imageWrapper: getImageWrapperStyle(false, classNames2.imageWrapper, checked),\n      selectedImageWrapper: getImageWrapperStyle(true, classNames2.imageWrapper, checked),\n      iconWrapper: [\n        classNames2.iconWrapper,\n        {\n          fontSize: iconSize,\n          lineHeight: iconSize,\n          height: iconSize\n        }\n      ],\n      labelWrapper: [\n        classNames2.labelWrapper,\n        fonts.medium,\n        (hasIcon || hasImage) && {\n          display: \"block\",\n          position: \"relative\",\n          margin: \"4px 8px 2px 8px\",\n          height: labelWrapperHeight,\n          lineHeight: labelWrapperLineHeight,\n          // using non-null assertion because we have a default in `ChoiceGroupOptionBase` class.\n          maxWidth: imageSize.width * 2,\n          overflow: \"hidden\",\n          whiteSpace: \"pre-wrap\"\n        }\n      ]\n    };\n  };\n  var ChoiceGroupOption = styled(ChoiceGroupOptionBase, getStyles$i, void 0, { scope: \"ChoiceGroupOption\" });\n  var getClassNames$i = classNamesFunction();\n  var getOptionId = function(option, id2) {\n    return \"\".concat(id2, \"-\").concat(option.key);\n  };\n  var findOption = function(options2, key2) {\n    return key2 === void 0 ? void 0 : find$3(options2, function(value2) {\n      return value2.key === key2;\n    });\n  };\n  var focusSelectedOption = function(options2, keyChecked, id2, focusProviders, doc) {\n    var optionToFocus = findOption(options2, keyChecked) || options2.filter(function(option) {\n      return !option.disabled;\n    })[0];\n    var elementToFocus = optionToFocus && (doc === null || doc === void 0 ? void 0 : doc.getElementById(getOptionId(optionToFocus, id2)));\n    if (elementToFocus) {\n      elementToFocus.focus();\n      setFocusVisibility(true, elementToFocus, focusProviders);\n    }\n  };\n  var focusFromFocusTrapZone = function(evt) {\n    return evt.relatedTarget instanceof HTMLElement && evt.relatedTarget.dataset.isFocusTrapZoneBumper === \"true\";\n  };\n  var useComponentRef$5 = function(options2, keyChecked, id2, componentRef, focusProviders) {\n    var doc = useDocumentEx();\n    React__namespace.useImperativeHandle(componentRef, function() {\n      return {\n        get checkedOption() {\n          return findOption(options2, keyChecked);\n        },\n        focus: function() {\n          focusSelectedOption(options2, keyChecked, id2, focusProviders, doc);\n        }\n      };\n    }, [options2, keyChecked, id2, focusProviders, doc]);\n  };\n  var COMPONENT_NAME$5 = \"ChoiceGroup\";\n  var ChoiceGroupBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var className2 = props.className, theme = props.theme, styles = props.styles, _a2 = props.options, options2 = _a2 === void 0 ? [] : _a2, label2 = props.label, required2 = props.required, disabled = props.disabled, name = props.name, defaultSelectedKey = props.defaultSelectedKey, componentRef = props.componentRef, onChange = props.onChange;\n    var id2 = useId(\"ChoiceGroup\");\n    var labelId = useId(\"ChoiceGroupLabel\");\n    var divProps = getNativeProps(props, divProperties, [\n      \"onChange\",\n      \"className\",\n      \"required\"\n    ]);\n    var classNames2 = getClassNames$i(styles, {\n      theme,\n      className: className2,\n      optionsContainIconOrImage: options2.some(function(option) {\n        return !!(option.iconProps || option.imageSrc);\n      })\n    });\n    var ariaLabelledBy = props.ariaLabelledBy || (label2 ? labelId : props[\"aria-labelledby\"]);\n    var _b2 = useControllableValue(props.selectedKey, defaultSelectedKey), keyChecked = _b2[0], setKeyChecked = _b2[1];\n    var _c2 = React__namespace.useState(), keyFocused = _c2[0], setKeyFocused = _c2[1];\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRefs = useMergedRefs(rootRef, forwardedRef);\n    var focusContext = React__namespace.useContext(FocusRectsContext);\n    useComponentRef$5(options2, keyChecked, id2, componentRef, focusContext === null || focusContext === void 0 ? void 0 : focusContext.registeredProviders);\n    useFocusRects(rootRef);\n    var onFocus = React__namespace.useCallback(function(ev, option) {\n      var _a22;\n      if (option) {\n        setKeyFocused(option.itemKey);\n        (_a22 = option.onFocus) === null || _a22 === void 0 ? void 0 : _a22.call(option, ev);\n      }\n    }, []);\n    var onBlur = React__namespace.useCallback(function(ev, option) {\n      var _a22;\n      setKeyFocused(void 0);\n      (_a22 = option === null || option === void 0 ? void 0 : option.onBlur) === null || _a22 === void 0 ? void 0 : _a22.call(option, ev);\n    }, []);\n    var onOptionChange = React__namespace.useCallback(function(evt, option) {\n      var _a22;\n      if (!option) {\n        return;\n      }\n      setKeyChecked(option.itemKey);\n      (_a22 = option.onChange) === null || _a22 === void 0 ? void 0 : _a22.call(option, evt);\n      onChange === null || onChange === void 0 ? void 0 : onChange(evt, findOption(options2, option.itemKey));\n    }, [onChange, options2, setKeyChecked]);\n    var onRadioFocus = React__namespace.useCallback(function(evt) {\n      if (focusFromFocusTrapZone(evt)) {\n        focusSelectedOption(options2, keyChecked, id2, focusContext === null || focusContext === void 0 ? void 0 : focusContext.registeredProviders);\n      }\n    }, [options2, keyChecked, id2, focusContext]);\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({ className: classNames2.root }, divProps, { ref: mergedRootRefs }),\n      React__namespace.createElement(\n        \"div\",\n        __assign$1({ role: \"radiogroup\" }, ariaLabelledBy && { \"aria-labelledby\": ariaLabelledBy }, { onFocus: onRadioFocus }),\n        label2 && React__namespace.createElement(Label$2, { className: classNames2.label, required: required2, id: labelId, disabled }, label2),\n        React__namespace.createElement(\"div\", { className: classNames2.flexContainer }, options2.map(function(option) {\n          return React__namespace.createElement(ChoiceGroupOption, __assign$1({ itemKey: option.key }, option, { key: option.key, onBlur, onFocus, onChange: onOptionChange, focused: option.key === keyFocused, checked: option.key === keyChecked, disabled: option.disabled || disabled, id: getOptionId(option, id2), labelId: option.labelId || \"\".concat(labelId, \"-\").concat(option.key), name: name || id2, required: required2 }));\n        }))\n      )\n    );\n  });\n  ChoiceGroupBase.displayName = COMPONENT_NAME$5;\n  var GlobalClassNames$a = {\n    root: \"ms-ChoiceFieldGroup\",\n    flexContainer: \"ms-ChoiceFieldGroup-flexContainer\"\n  };\n  var getStyles$h = function(props) {\n    var className2 = props.className, optionsContainIconOrImage = props.optionsContainIconOrImage, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$a, theme);\n    return {\n      root: [\n        className2,\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          display: \"block\"\n        }\n      ],\n      flexContainer: [\n        classNames2.flexContainer,\n        optionsContainIconOrImage && {\n          display: \"flex\",\n          flexDirection: \"row\",\n          flexWrap: \"wrap\"\n        }\n      ]\n    };\n  };\n  var ChoiceGroup = styled(ChoiceGroupBase, getStyles$h, void 0, { scope: \"ChoiceGroup\" });\n  var SELECTION_FORWARD = \"forward\";\n  var SELECTION_BACKWARD = \"backward\";\n  var Autofill = (\n    /** @class */\n    (function(_super) {\n      __extends(Autofill2, _super);\n      function Autofill2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._inputElement = React__namespace.createRef();\n        _this._autoFillEnabled = true;\n        _this._onCompositionStart = function(ev) {\n          _this.setState({ isComposing: true });\n          _this._autoFillEnabled = false;\n        };\n        _this._onCompositionUpdate = function() {\n          if (isIE11()) {\n            _this._updateValue(_this._getCurrentInputValue(), true);\n          }\n        };\n        _this._onCompositionEnd = function(ev) {\n          var inputValue = _this._getCurrentInputValue();\n          _this._tryEnableAutofill(inputValue, _this.value, false, true);\n          _this.setState({ isComposing: false });\n          _this._async.setTimeout(function() {\n            _this._updateValue(_this._getCurrentInputValue(), false);\n          }, 0);\n        };\n        _this._onClick = function() {\n          if (_this.value && _this.value !== \"\" && _this._autoFillEnabled) {\n            _this._autoFillEnabled = false;\n          }\n        };\n        _this._onKeyDown = function(ev) {\n          if (_this.props.onKeyDown) {\n            _this.props.onKeyDown(ev);\n          }\n          if (!ev.nativeEvent.isComposing) {\n            switch (ev.which) {\n              case KeyCodes.backspace:\n                _this._autoFillEnabled = false;\n                break;\n              case KeyCodes.left:\n              case KeyCodes.right:\n                if (_this._autoFillEnabled) {\n                  _this.setState(function(prev) {\n                    return {\n                      inputValue: _this.props.suggestedDisplayValue || prev.inputValue\n                    };\n                  });\n                  _this._autoFillEnabled = false;\n                }\n                break;\n              default:\n                if (!_this._autoFillEnabled) {\n                  if (_this.props.enableAutofillOnKeyPress.indexOf(ev.which) !== -1) {\n                    _this._autoFillEnabled = true;\n                  }\n                }\n                break;\n            }\n          }\n        };\n        _this._onInputChanged = function(ev) {\n          var value2 = _this._getCurrentInputValue(ev);\n          if (!_this.state.isComposing) {\n            _this._tryEnableAutofill(value2, _this.value, ev.nativeEvent.isComposing);\n          }\n          if (!(isIE11() && _this.state.isComposing)) {\n            var nativeEventComposing = ev.nativeEvent.isComposing;\n            var isComposing = nativeEventComposing === void 0 ? _this.state.isComposing : nativeEventComposing;\n            _this._updateValue(value2, isComposing);\n          }\n        };\n        _this._onChanged = function() {\n          return;\n        };\n        _this._updateValue = function(newValue, composing) {\n          if (!newValue && newValue === _this.value) {\n            return;\n          }\n          var _a2 = _this.props, onInputChange = _a2.onInputChange, onInputValueChange = _a2.onInputValueChange;\n          if (onInputChange) {\n            newValue = (onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(newValue, composing)) || \"\";\n          }\n          _this.setState({ inputValue: newValue }, function() {\n            return onInputValueChange === null || onInputValueChange === void 0 ? void 0 : onInputValueChange(newValue, composing);\n          });\n        };\n        initializeComponentRef(_this);\n        _this._async = new Async(_this);\n        _this.state = {\n          inputValue: props.defaultVisibleValue || \"\",\n          isComposing: false\n        };\n        return _this;\n      }\n      Autofill2.getDerivedStateFromProps = function(props, state) {\n        if (props.updateValueInWillReceiveProps) {\n          var updatedInputValue = props.updateValueInWillReceiveProps();\n          if (updatedInputValue !== null && updatedInputValue !== state.inputValue && !state.isComposing) {\n            return __assign$1(__assign$1({}, state), { inputValue: updatedInputValue });\n          }\n        }\n        return null;\n      };\n      Object.defineProperty(Autofill2.prototype, \"cursorLocation\", {\n        get: function() {\n          if (this._inputElement.current) {\n            var inputElement = this._inputElement.current;\n            if (inputElement.selectionDirection !== SELECTION_FORWARD) {\n              return inputElement.selectionEnd;\n            } else {\n              return inputElement.selectionStart;\n            }\n          } else {\n            return -1;\n          }\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"isValueSelected\", {\n        get: function() {\n          return Boolean(this.inputElement && this.inputElement.selectionStart !== this.inputElement.selectionEnd);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"value\", {\n        get: function() {\n          return this._getControlledValue() || this.state.inputValue || \"\";\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"selectionStart\", {\n        get: function() {\n          return this._inputElement.current ? this._inputElement.current.selectionStart : -1;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"selectionEnd\", {\n        get: function() {\n          return this._inputElement.current ? this._inputElement.current.selectionEnd : -1;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(Autofill2.prototype, \"inputElement\", {\n        get: function() {\n          return this._inputElement.current;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Autofill2.prototype.componentDidUpdate = function(_, _1, cursor2) {\n        var _a2;\n        var _b2 = this.props, suggestedDisplayValue = _b2.suggestedDisplayValue, shouldSelectFullInputValueInComponentDidUpdate = _b2.shouldSelectFullInputValueInComponentDidUpdate, preventValueSelection = _b2.preventValueSelection;\n        var differenceIndex = 0;\n        if (preventValueSelection) {\n          return;\n        }\n        var document2 = ((_a2 = this.context) === null || _a2 === void 0 ? void 0 : _a2.window.document) || getDocument(this._inputElement.current);\n        var isFocused = this._inputElement.current && this._inputElement.current === (document2 === null || document2 === void 0 ? void 0 : document2.activeElement);\n        if (isFocused && this._autoFillEnabled && this.value && suggestedDisplayValue && _doesTextStartWith(suggestedDisplayValue, this.value)) {\n          var shouldSelectFullRange = false;\n          if (shouldSelectFullInputValueInComponentDidUpdate) {\n            shouldSelectFullRange = shouldSelectFullInputValueInComponentDidUpdate();\n          }\n          if (shouldSelectFullRange) {\n            this._inputElement.current.setSelectionRange(0, suggestedDisplayValue.length, SELECTION_BACKWARD);\n          } else {\n            while (differenceIndex < this.value.length && this.value[differenceIndex].toLocaleLowerCase() === suggestedDisplayValue[differenceIndex].toLocaleLowerCase()) {\n              differenceIndex++;\n            }\n            if (differenceIndex > 0) {\n              this._inputElement.current.setSelectionRange(differenceIndex, suggestedDisplayValue.length, SELECTION_BACKWARD);\n            }\n          }\n        } else if (this._inputElement.current) {\n          if (cursor2 !== null && !this._autoFillEnabled && !this.state.isComposing) {\n            this._inputElement.current.setSelectionRange(cursor2.start, cursor2.end, cursor2.dir);\n          }\n        }\n      };\n      Autofill2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n      };\n      Autofill2.prototype.render = function() {\n        var nativeProps = getNativeProps(this.props, inputProperties);\n        var style2 = __assign$1(__assign$1({}, this.props.style), { fontFamily: \"inherit\" });\n        return React__namespace.createElement(\"input\", __assign$1({ autoCapitalize: \"off\", autoComplete: \"off\", \"aria-autocomplete\": \"both\" }, nativeProps, {\n          style: style2,\n          ref: this._inputElement,\n          value: this._getDisplayValue(),\n          onCompositionStart: this._onCompositionStart,\n          onCompositionUpdate: this._onCompositionUpdate,\n          onCompositionEnd: this._onCompositionEnd,\n          // TODO (Fabric 8?) - switch to calling only onChange. See notes in TextField._onInputChange.\n          onChange: this._onChanged,\n          onInput: this._onInputChanged,\n          onKeyDown: this._onKeyDown,\n          onClick: this.props.onClick ? this.props.onClick : this._onClick,\n          \"data-lpignore\": true\n        }));\n      };\n      Autofill2.prototype.focus = function() {\n        this._inputElement.current && this._inputElement.current.focus();\n      };\n      Autofill2.prototype.clear = function() {\n        this._autoFillEnabled = true;\n        this._updateValue(\"\", false);\n        this._inputElement.current && this._inputElement.current.setSelectionRange(0, 0);\n      };\n      Autofill2.prototype.getSnapshotBeforeUpdate = function() {\n        var _a2, _b2;\n        var inel = this._inputElement.current;\n        if (inel && inel.selectionStart !== this.value.length) {\n          return {\n            start: (_a2 = inel.selectionStart) !== null && _a2 !== void 0 ? _a2 : inel.value.length,\n            end: (_b2 = inel.selectionEnd) !== null && _b2 !== void 0 ? _b2 : inel.value.length,\n            dir: inel.selectionDirection || \"backward\"\n          };\n        }\n        return null;\n      };\n      Autofill2.prototype._getCurrentInputValue = function(ev) {\n        if (ev && ev.target && ev.target.value) {\n          return ev.target.value;\n        } else if (this.inputElement && this.inputElement.value) {\n          return this.inputElement.value;\n        } else {\n          return \"\";\n        }\n      };\n      Autofill2.prototype._tryEnableAutofill = function(newValue, oldValue, isComposing, isComposed) {\n        if (!isComposing && newValue && this._inputElement.current && this._inputElement.current.selectionStart === newValue.length && !this._autoFillEnabled && (newValue.length > oldValue.length || isComposed)) {\n          this._autoFillEnabled = true;\n        }\n      };\n      Autofill2.prototype._getDisplayValue = function() {\n        if (this._autoFillEnabled) {\n          return _getDisplayValue(this.value, this.props.suggestedDisplayValue);\n        }\n        return this.value;\n      };\n      Autofill2.prototype._getControlledValue = function() {\n        var value2 = this.props.value;\n        if (value2 === void 0 || typeof value2 === \"string\") {\n          return value2;\n        }\n        console.warn(\"props.value of Autofill should be a string, but it is \".concat(value2, \" with type of \").concat(typeof value2));\n        return value2.toString();\n      };\n      Autofill2.defaultProps = {\n        enableAutofillOnKeyPress: [KeyCodes.down, KeyCodes.up]\n      };\n      Autofill2.contextType = WindowContext;\n      return Autofill2;\n    })(React__namespace.Component)\n  );\n  function _getDisplayValue(inputValue, suggestedDisplayValue) {\n    var displayValue2 = inputValue;\n    if (suggestedDisplayValue && inputValue && _doesTextStartWith(suggestedDisplayValue, displayValue2)) {\n      displayValue2 = suggestedDisplayValue;\n    }\n    return displayValue2;\n  }\n  function _doesTextStartWith(text2, startWith) {\n    if (!text2 || !startWith) {\n      return false;\n    }\n    return text2.toLocaleLowerCase().indexOf(startWith.toLocaleLowerCase()) === 0;\n  }\n  var getClassNames$h = classNamesFunction();\n  var CheckboxBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var disabled = props.disabled, required2 = props.required, inputProps = props.inputProps, name = props.name, ariaLabel2 = props.ariaLabel, ariaLabelledBy = props.ariaLabelledBy, ariaDescribedBy = props.ariaDescribedBy, ariaPositionInSet = props.ariaPositionInSet, ariaSetSize = props.ariaSetSize, title = props.title, checkmarkIconProps = props.checkmarkIconProps, styles = props.styles, theme = props.theme, className2 = props.className, _a2 = props.boxSide, boxSide = _a2 === void 0 ? \"start\" : _a2;\n    var id2 = useId(\"checkbox-\", props.id);\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRefs = useMergedRefs(rootRef, forwardedRef);\n    var inputRef = React__namespace.useRef(null);\n    var _b2 = useControllableValue(props.checked, props.defaultChecked, props.onChange), isChecked = _b2[0], setIsChecked = _b2[1];\n    var _c2 = useControllableValue(props.indeterminate, props.defaultIndeterminate), isIndeterminate = _c2[0], setIsIndeterminate = _c2[1];\n    useFocusRects(rootRef);\n    var classNames2 = getClassNames$h(styles, {\n      theme,\n      className: className2,\n      disabled,\n      indeterminate: isIndeterminate,\n      checked: isChecked,\n      reversed: boxSide !== \"start\",\n      isUsingCustomLabelRender: !!props.onRenderLabel\n    });\n    var onChange = React__namespace.useCallback(function(event2) {\n      if (isIndeterminate) {\n        setIsChecked(!!isChecked, event2);\n        setIsIndeterminate(false);\n      } else {\n        setIsChecked(!isChecked, event2);\n      }\n    }, [setIsChecked, setIsIndeterminate, isIndeterminate, isChecked]);\n    var defaultLabelRenderer = React__namespace.useCallback(function(checkboxProps) {\n      if (!checkboxProps) {\n        return null;\n      }\n      return checkboxProps.label ? React__namespace.createElement(\"span\", { className: classNames2.text, title: checkboxProps.title }, checkboxProps.label) : null;\n    }, [classNames2.text]);\n    var setNativeIndeterminate = React__namespace.useCallback(function(indeterminate) {\n      if (!inputRef.current) {\n        return;\n      }\n      var value2 = !!indeterminate;\n      inputRef.current.indeterminate = value2;\n      setIsIndeterminate(value2);\n    }, [setIsIndeterminate]);\n    useComponentRef$4(props, isChecked, isIndeterminate, setNativeIndeterminate, inputRef);\n    React__namespace.useEffect(function() {\n      return setNativeIndeterminate(isIndeterminate);\n    }, [setNativeIndeterminate, isIndeterminate]);\n    var onRenderLabel = props.onRenderLabel || defaultLabelRenderer;\n    var ariaChecked = isIndeterminate ? \"mixed\" : void 0;\n    var mergedInputProps = __assign$1(__assign$1({ className: classNames2.input, type: \"checkbox\" }, inputProps), { checked: !!isChecked, disabled, required: required2, name, id: id2, title, onChange, \"aria-disabled\": disabled, \"aria-label\": ariaLabel2, \"aria-labelledby\": ariaLabelledBy, \"aria-describedby\": ariaDescribedBy, \"aria-posinset\": ariaPositionInSet, \"aria-setsize\": ariaSetSize, \"aria-checked\": ariaChecked });\n    return React__namespace.createElement(\n      \"div\",\n      { className: classNames2.root, title, ref: mergedRootRefs },\n      React__namespace.createElement(\"input\", __assign$1({}, mergedInputProps, { ref: inputRef, title, \"data-ktp-execute-target\": true })),\n      React__namespace.createElement(\n        \"label\",\n        { className: classNames2.label, htmlFor: id2 },\n        React__namespace.createElement(\n          \"div\",\n          { className: classNames2.checkbox, \"data-ktp-target\": true },\n          React__namespace.createElement(Icon, __assign$1({ iconName: \"CheckMark\" }, checkmarkIconProps, { className: classNames2.checkmark }))\n        ),\n        onRenderLabel(props, defaultLabelRenderer)\n      )\n    );\n  });\n  CheckboxBase.displayName = \"CheckboxBase\";\n  function useComponentRef$4(props, isChecked, isIndeterminate, setIndeterminate, checkBoxRef) {\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        get checked() {\n          return !!isChecked;\n        },\n        get indeterminate() {\n          return !!isIndeterminate;\n        },\n        set indeterminate(indeterminate) {\n          setIndeterminate(indeterminate);\n        },\n        focus: function() {\n          if (checkBoxRef.current) {\n            checkBoxRef.current.focus();\n          }\n        }\n      };\n    }, [checkBoxRef, isChecked, isIndeterminate, setIndeterminate]);\n  }\n  var GlobalClassNames$9 = {\n    root: \"ms-Checkbox\",\n    label: \"ms-Checkbox-label\",\n    checkbox: \"ms-Checkbox-checkbox\",\n    checkmark: \"ms-Checkbox-checkmark\",\n    text: \"ms-Checkbox-text\"\n  };\n  var MS_CHECKBOX_LABEL_SIZE = \"20px\";\n  var MS_CHECKBOX_TRANSITION_DURATION = \"200ms\";\n  var MS_CHECKBOX_TRANSITION_TIMING = \"cubic-bezier(.4, 0, .23, 1)\";\n  var getStyles$g = function(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\n    var className2 = props.className, theme = props.theme, reversed = props.reversed, checked = props.checked, disabled = props.disabled, isUsingCustomLabelRender = props.isUsingCustomLabelRender, indeterminate = props.indeterminate;\n    var semanticColors = theme.semanticColors, effects = theme.effects, palette = theme.palette, fonts = theme.fonts;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$9, theme);\n    var checkmarkFontColor = semanticColors.inputForegroundChecked;\n    var checkmarkFontColorHovered = palette.neutralSecondary;\n    var checkboxBorderColor = palette.neutralPrimary;\n    var checkboxBorderIndeterminateColor = semanticColors.inputBackgroundChecked;\n    var checkboxBorderColorChecked = semanticColors.inputBackgroundChecked;\n    var checkboxBorderColorDisabled = semanticColors.disabledBodySubtext;\n    var checkboxBorderHoveredColor = semanticColors.inputBorderHovered;\n    var checkboxBorderIndeterminateHoveredColor = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxBackgroundChecked = semanticColors.inputBackgroundChecked;\n    var checkboxBackgroundCheckedHovered = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxBorderColorCheckedHovered = semanticColors.inputBackgroundCheckedHovered;\n    var checkboxHoveredTextColor = semanticColors.inputTextHovered;\n    var checkboxBackgroundDisabledChecked = semanticColors.disabledBodySubtext;\n    var checkboxTextColor = semanticColors.bodyText;\n    var checkboxTextColorDisabled = semanticColors.disabledText;\n    var indeterminateDotStyles = [\n      (_a2 = {\n        content: '\"\"',\n        borderRadius: effects.roundedCorner2,\n        position: \"absolute\",\n        width: 10,\n        height: 10,\n        top: 4,\n        left: 4,\n        boxSizing: \"border-box\",\n        borderWidth: 5,\n        borderStyle: \"solid\",\n        borderColor: disabled ? checkboxBorderColorDisabled : checkboxBorderIndeterminateColor,\n        transitionProperty: \"border-width, border, border-color\",\n        transitionDuration: MS_CHECKBOX_TRANSITION_DURATION,\n        transitionTimingFunction: MS_CHECKBOX_TRANSITION_TIMING\n      }, _a2[HighContrastSelector] = {\n        borderColor: \"WindowText\"\n      }, _a2)\n    ];\n    return {\n      root: [\n        classNames2.root,\n        {\n          position: \"relative\",\n          display: \"flex\"\n        },\n        reversed && \"reversed\",\n        checked && \"is-checked\",\n        !disabled && \"is-enabled\",\n        disabled && \"is-disabled\",\n        !disabled && [\n          !checked && (_b2 = {}, _b2[\":hover .\".concat(classNames2.checkbox)] = (_c2 = {\n            borderColor: checkboxBorderHoveredColor\n          }, _c2[HighContrastSelector] = {\n            borderColor: \"Highlight\"\n          }, _c2), _b2[\":focus .\".concat(classNames2.checkbox)] = { borderColor: checkboxBorderHoveredColor }, _b2[\":hover .\".concat(classNames2.checkmark)] = (_d2 = {\n            color: checkmarkFontColorHovered,\n            opacity: \"1\"\n          }, _d2[HighContrastSelector] = {\n            color: \"Highlight\"\n          }, _d2), _b2),\n          checked && !indeterminate && (_e2 = {}, _e2[\":hover .\".concat(classNames2.checkbox)] = {\n            background: checkboxBackgroundCheckedHovered,\n            borderColor: checkboxBorderColorCheckedHovered\n          }, _e2[\":focus .\".concat(classNames2.checkbox)] = {\n            background: checkboxBackgroundCheckedHovered,\n            borderColor: checkboxBorderColorCheckedHovered\n          }, _e2[HighContrastSelector] = (_f = {}, _f[\":hover .\".concat(classNames2.checkbox)] = {\n            background: \"Highlight\",\n            borderColor: \"Highlight\"\n          }, _f[\":focus .\".concat(classNames2.checkbox)] = {\n            background: \"Highlight\"\n          }, _f[\":focus:hover .\".concat(classNames2.checkbox)] = {\n            background: \"Highlight\"\n          }, _f[\":focus:hover .\".concat(classNames2.checkmark)] = {\n            color: \"Window\"\n          }, _f[\":hover .\".concat(classNames2.checkmark)] = {\n            color: \"Window\"\n          }, _f), _e2),\n          indeterminate && (_g = {}, _g[\":hover .\".concat(classNames2.checkbox, \", :hover .\").concat(classNames2.checkbox, \":after\")] = (_h = {\n            borderColor: checkboxBorderIndeterminateHoveredColor\n          }, _h[HighContrastSelector] = {\n            borderColor: \"WindowText\"\n          }, _h), _g[\":focus .\".concat(classNames2.checkbox)] = {\n            borderColor: checkboxBorderIndeterminateHoveredColor\n          }, _g[\":hover .\".concat(classNames2.checkmark)] = {\n            opacity: \"0\"\n          }, _g),\n          (_j = {}, _j[\":hover .\".concat(classNames2.text, \", :focus .\").concat(classNames2.text)] = (_k = {\n            color: checkboxHoveredTextColor\n          }, _k[HighContrastSelector] = {\n            color: disabled ? \"GrayText\" : \"WindowText\"\n          }, _k), _j)\n        ],\n        className2\n      ],\n      input: (_l = {\n        position: \"absolute\",\n        background: \"none\",\n        opacity: 0\n      }, // eslint-disable-next-line @fluentui/max-len\n      _l[\".\".concat(IsFocusVisibleClassName, \" &:focus + label::before, :host(.\").concat(IsFocusVisibleClassName, \") &:focus + label::before\")] = (_m = {\n        outline: \"1px solid \" + theme.palette.neutralSecondary,\n        outlineOffset: \"2px\"\n      }, _m[HighContrastSelector] = {\n        outline: \"1px solid WindowText\"\n      }, _m), _l),\n      label: [\n        classNames2.label,\n        theme.fonts.medium,\n        {\n          display: \"flex\",\n          alignItems: isUsingCustomLabelRender ? \"center\" : \"flex-start\",\n          cursor: disabled ? \"default\" : \"pointer\",\n          position: \"relative\",\n          userSelect: \"none\"\n        },\n        reversed && {\n          flexDirection: \"row-reverse\",\n          justifyContent: \"flex-end\"\n        },\n        {\n          \"&::before\": {\n            position: \"absolute\",\n            left: 0,\n            right: 0,\n            top: 0,\n            bottom: 0,\n            content: '\"\"',\n            pointerEvents: \"none\"\n          }\n        }\n      ],\n      checkbox: [\n        classNames2.checkbox,\n        (_o = {\n          position: \"relative\",\n          display: \"flex\",\n          flexShrink: 0,\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          height: MS_CHECKBOX_LABEL_SIZE,\n          width: MS_CHECKBOX_LABEL_SIZE,\n          border: \"1px solid \".concat(checkboxBorderColor),\n          borderRadius: effects.roundedCorner2,\n          boxSizing: \"border-box\",\n          transitionProperty: \"background, border, border-color\",\n          transitionDuration: MS_CHECKBOX_TRANSITION_DURATION,\n          transitionTimingFunction: MS_CHECKBOX_TRANSITION_TIMING,\n          /* in case the icon is bigger than the box */\n          overflow: \"hidden\",\n          \":after\": indeterminate ? indeterminateDotStyles : null\n        }, _o[HighContrastSelector] = __assign$1({ borderColor: \"WindowText\" }, getHighContrastNoAdjustStyle()), _o),\n        indeterminate && {\n          borderColor: checkboxBorderIndeterminateColor\n        },\n        !reversed ? (\n          // This margin on the checkbox is for backwards compat. Notably it has the effect where a customRender\n          // is used, there will be only a 4px margin from checkbox to label. The label by default would have\n          // another 4px margin for a total of 8px margin between checkbox and label. We don't combine the two\n          // (and move it into the text) to not incur a breaking change for everyone using custom render atm.\n          {\n            marginRight: 4\n          }\n        ) : {\n          marginLeft: 4\n        },\n        !disabled && !indeterminate && checked && (_p = {\n          background: checkboxBackgroundChecked,\n          borderColor: checkboxBorderColorChecked\n        }, _p[HighContrastSelector] = {\n          background: \"Highlight\",\n          borderColor: \"Highlight\"\n        }, _p),\n        disabled && (_q = {\n          borderColor: checkboxBorderColorDisabled\n        }, _q[HighContrastSelector] = {\n          borderColor: \"GrayText\"\n        }, _q),\n        checked && disabled && (_r = {\n          background: checkboxBackgroundDisabledChecked,\n          borderColor: checkboxBorderColorDisabled\n        }, _r[HighContrastSelector] = {\n          background: \"Window\"\n        }, _r)\n      ],\n      checkmark: [\n        classNames2.checkmark,\n        (_s = {\n          opacity: checked && !indeterminate ? \"1\" : \"0\",\n          color: checkmarkFontColor\n        }, _s[HighContrastSelector] = __assign$1({ color: disabled ? \"GrayText\" : \"Window\" }, getHighContrastNoAdjustStyle()), _s)\n      ],\n      text: [\n        classNames2.text,\n        (_t = {\n          color: disabled ? checkboxTextColorDisabled : checkboxTextColor,\n          fontSize: fonts.medium.fontSize,\n          lineHeight: \"20px\"\n        }, _t[HighContrastSelector] = __assign$1({ color: disabled ? \"GrayText\" : \"WindowText\" }, getHighContrastNoAdjustStyle()), _t),\n        !reversed ? {\n          marginLeft: 4\n        } : {\n          marginRight: 4\n        }\n      ]\n    };\n  };\n  var Checkbox = styled(CheckboxBase, getStyles$g, void 0, { scope: \"Checkbox\" });\n  var _a$2, _b$2;\n  var ComboBoxHeight = 32;\n  var ComboBoxLineHeight = 30;\n  var ComboBoxCaretDownWidth = 32;\n  var ComboBoxOptionHeight = 36;\n  var getDisabledStyles = memoizeFunction(function(theme) {\n    var _a2;\n    var semanticColors = theme.semanticColors;\n    return {\n      backgroundColor: semanticColors.disabledBackground,\n      color: semanticColors.disabledText,\n      cursor: \"default\",\n      selectors: (_a2 = {\n        \":after\": {\n          borderColor: semanticColors.disabledBackground\n        }\n      }, _a2[HighContrastSelector] = {\n        color: \"GrayText\",\n        selectors: {\n          \":after\": {\n            borderColor: \"GrayText\"\n          }\n        }\n      }, _a2)\n    };\n  });\n  var listOptionHighContrastStyles = {\n    selectors: (_a$2 = {}, _a$2[HighContrastSelector] = __assign$1({ backgroundColor: \"Highlight\", borderColor: \"Highlight\", color: \"HighlightText\" }, getHighContrastNoAdjustStyle()), _a$2)\n  };\n  var inputHighContrastStyles = {\n    selectors: (_b$2 = {}, _b$2[HighContrastSelector] = __assign$1({ color: \"WindowText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _b$2)\n  };\n  var getOptionStyles = memoizeFunction(function(theme, customStylesForAllOptions, customOptionStylesForCurrentOption, isPending, isHidden, isSelected) {\n    var _a2;\n    var palette = theme.palette, semanticColors = theme.semanticColors;\n    var option = {\n      textHoveredColor: semanticColors.menuItemTextHovered,\n      textSelectedColor: palette.neutralDark,\n      textDisabledColor: semanticColors.disabledText,\n      backgroundHoveredColor: semanticColors.menuItemBackgroundHovered,\n      backgroundPressedColor: semanticColors.menuItemBackgroundPressed\n    };\n    var optionStyles = {\n      root: [\n        theme.fonts.medium,\n        {\n          backgroundColor: isPending ? option.backgroundHoveredColor : \"transparent\",\n          boxSizing: \"border-box\",\n          cursor: \"pointer\",\n          display: isHidden ? \"none\" : \"block\",\n          width: \"100%\",\n          height: \"auto\",\n          minHeight: ComboBoxOptionHeight,\n          lineHeight: \"20px\",\n          padding: \"0 8px\",\n          position: \"relative\",\n          borderWidth: \"1px\",\n          borderStyle: \"solid\",\n          borderColor: \"transparent\",\n          borderRadius: 0,\n          wordWrap: \"break-word\",\n          overflowWrap: \"break-word\",\n          textAlign: \"left\",\n          selectors: __assign$1(__assign$1((_a2 = {}, _a2[HighContrastSelector] = {\n            border: \"none\",\n            borderColor: \"Background\"\n          }, _a2), !isHidden && {\n            \"&.ms-Checkbox\": {\n              display: \"flex\",\n              alignItems: \"center\"\n            }\n          }), { \"&.ms-Button--command:hover:active\": {\n            backgroundColor: option.backgroundPressedColor\n          }, \".ms-Checkbox-label\": {\n            width: \"100%\"\n          } })\n        },\n        isSelected ? [\n          {\n            backgroundColor: \"transparent\",\n            color: option.textSelectedColor,\n            selectors: {\n              \":hover\": [\n                {\n                  backgroundColor: option.backgroundHoveredColor\n                },\n                listOptionHighContrastStyles\n              ]\n            }\n          },\n          getFocusStyle(theme, { inset: -1, isFocusedOnly: false }),\n          listOptionHighContrastStyles\n        ] : []\n      ],\n      rootHovered: {\n        backgroundColor: option.backgroundHoveredColor,\n        color: option.textHoveredColor\n      },\n      rootFocused: {\n        backgroundColor: option.backgroundHoveredColor\n      },\n      rootDisabled: {\n        color: option.textDisabledColor,\n        cursor: \"default\"\n      },\n      optionText: {\n        overflow: \"hidden\",\n        whiteSpace: \"nowrap\",\n        textOverflow: \"ellipsis\",\n        minWidth: \"0px\",\n        maxWidth: \"100%\",\n        wordWrap: \"break-word\",\n        overflowWrap: \"break-word\",\n        display: \"inline-block\"\n      },\n      optionTextWrapper: {\n        maxWidth: \"100%\",\n        display: \"flex\",\n        alignItems: \"center\"\n      }\n    };\n    return concatStyleSets(optionStyles, customStylesForAllOptions, customOptionStylesForCurrentOption);\n  });\n  var getCaretDownButtonStyles = memoizeFunction(function(theme, customStyles) {\n    var _a2, _b2;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts;\n    var caret = {\n      buttonTextColor: semanticColors.bodySubtext,\n      buttonTextHoveredCheckedColor: semanticColors.buttonTextChecked,\n      buttonBackgroundHoveredColor: semanticColors.listItemBackgroundHovered,\n      buttonBackgroundCheckedColor: semanticColors.listItemBackgroundChecked,\n      buttonBackgroundCheckedHoveredColor: semanticColors.listItemBackgroundCheckedHovered\n    };\n    var buttonHighContrastStyles = {\n      selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ backgroundColor: \"Highlight\", borderColor: \"Highlight\", color: \"HighlightText\" }, getHighContrastNoAdjustStyle()), _a2)\n    };\n    var styles = {\n      root: {\n        color: caret.buttonTextColor,\n        fontSize: fonts.small.fontSize,\n        position: \"absolute\",\n        top: 0,\n        height: \"100%\",\n        lineHeight: ComboBoxLineHeight,\n        width: ComboBoxCaretDownWidth,\n        textAlign: \"center\",\n        cursor: \"default\",\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = __assign$1({ backgroundColor: \"ButtonFace\", borderColor: \"ButtonText\", color: \"ButtonText\" }, getHighContrastNoAdjustStyle()), _b2)\n      },\n      icon: {\n        fontSize: fonts.small.fontSize\n      },\n      rootHovered: [\n        {\n          backgroundColor: caret.buttonBackgroundHoveredColor,\n          color: caret.buttonTextHoveredCheckedColor,\n          cursor: \"pointer\"\n        },\n        buttonHighContrastStyles\n      ],\n      rootPressed: [\n        {\n          backgroundColor: caret.buttonBackgroundCheckedColor,\n          color: caret.buttonTextHoveredCheckedColor\n        },\n        buttonHighContrastStyles\n      ],\n      rootChecked: [\n        {\n          backgroundColor: caret.buttonBackgroundCheckedColor,\n          color: caret.buttonTextHoveredCheckedColor\n        },\n        buttonHighContrastStyles\n      ],\n      rootCheckedHovered: [\n        {\n          backgroundColor: caret.buttonBackgroundCheckedHoveredColor,\n          color: caret.buttonTextHoveredCheckedColor\n        },\n        buttonHighContrastStyles\n      ],\n      rootDisabled: [\n        getDisabledStyles(theme),\n        {\n          position: \"absolute\"\n        }\n      ]\n    };\n    return concatStyleSets(styles, customStyles);\n  });\n  var getStyles$f = memoizeFunction(function(theme, customStyles, comboBoxOptionWidth) {\n    var _a2, _b2, _c2, _d2, _e2, _f;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, effects = theme.effects;\n    var root = {\n      textColor: semanticColors.inputText,\n      borderColor: semanticColors.inputBorder,\n      borderHoveredColor: semanticColors.inputBorderHovered,\n      borderPressedColor: semanticColors.inputFocusBorderAlt,\n      borderFocusedColor: semanticColors.inputFocusBorderAlt,\n      backgroundColor: semanticColors.inputBackground,\n      erroredColor: semanticColors.errorText\n    };\n    var option = {\n      headerTextColor: semanticColors.menuHeader,\n      dividerBorderColor: semanticColors.bodyDivider\n    };\n    var placeholderHighContrastStyles = {\n      selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _a2)\n    };\n    var placeholderStyles = [\n      {\n        color: semanticColors.inputPlaceholderText\n      },\n      placeholderHighContrastStyles\n    ];\n    var placeholderStylesHovered = [\n      {\n        color: semanticColors.inputTextHovered\n      },\n      placeholderHighContrastStyles\n    ];\n    var disabledPlaceholderStyles = [\n      {\n        color: semanticColors.disabledText\n      },\n      placeholderHighContrastStyles\n    ];\n    var ComboBoxRootHighContrastFocused = __assign$1(__assign$1({ color: \"HighlightText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), { selectors: {\n      \":after\": {\n        borderColor: \"Highlight\"\n      }\n    } });\n    var focusBorderStyles = getInputFocusStyle(root.borderPressedColor, effects.roundedCorner2, \"border\", 0);\n    var styles = {\n      container: {},\n      label: {},\n      labelDisabled: {},\n      root: [\n        theme.fonts.medium,\n        {\n          boxShadow: \"none\",\n          marginLeft: \"0\",\n          paddingRight: ComboBoxCaretDownWidth,\n          paddingLeft: 9,\n          color: root.textColor,\n          position: \"relative\",\n          outline: \"0\",\n          userSelect: \"none\",\n          backgroundColor: root.backgroundColor,\n          cursor: \"text\",\n          display: \"block\",\n          height: ComboBoxHeight,\n          whiteSpace: \"nowrap\",\n          textOverflow: \"ellipsis\",\n          boxSizing: \"border-box\",\n          // Border-box matches Dropdown and TextField\n          selectors: {\n            \".ms-Label\": {\n              display: \"inline-block\",\n              marginBottom: \"8px\"\n            },\n            \"&.is-open\": {\n              selectors: (_b2 = {}, _b2[HighContrastSelector] = ComboBoxRootHighContrastFocused, _b2)\n            },\n            // setting border using pseudo-element here in order to\n            // prevent chevron button to overlap ComboBox border under certain resolutions\n            \":after\": {\n              pointerEvents: \"none\",\n              content: \"''\",\n              position: \"absolute\",\n              left: 0,\n              top: 0,\n              bottom: 0,\n              right: 0,\n              borderWidth: \"1px\",\n              borderStyle: \"solid\",\n              borderColor: root.borderColor,\n              borderRadius: effects.roundedCorner2\n            }\n          }\n        }\n      ],\n      rootHovered: {\n        selectors: (_c2 = {\n          \":after\": {\n            borderColor: root.borderHoveredColor\n          },\n          \".ms-ComboBox-Input\": [\n            {\n              color: semanticColors.inputTextHovered\n            },\n            getPlaceholderStyles(placeholderStylesHovered),\n            inputHighContrastStyles\n          ]\n        }, _c2[HighContrastSelector] = __assign$1(__assign$1({ color: \"HighlightText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), { selectors: {\n          \":after\": {\n            borderColor: \"Highlight\"\n          }\n        } }), _c2)\n      },\n      rootPressed: [\n        {\n          position: \"relative\",\n          selectors: (_d2 = {}, _d2[HighContrastSelector] = ComboBoxRootHighContrastFocused, _d2)\n        }\n      ],\n      rootFocused: [\n        {\n          selectors: (_e2 = {\n            \".ms-ComboBox-Input\": [\n              {\n                color: semanticColors.inputTextHovered\n              },\n              inputHighContrastStyles\n            ]\n          }, _e2[HighContrastSelector] = ComboBoxRootHighContrastFocused, _e2)\n        },\n        focusBorderStyles\n      ],\n      rootDisabled: getDisabledStyles(theme),\n      rootError: {\n        selectors: {\n          \":after\": {\n            borderColor: root.erroredColor\n          },\n          \":hover:after\": {\n            borderColor: semanticColors.inputBorderHovered\n          }\n        }\n      },\n      rootDisallowFreeForm: {},\n      input: [\n        getPlaceholderStyles(placeholderStyles),\n        {\n          backgroundColor: root.backgroundColor,\n          color: root.textColor,\n          boxSizing: \"border-box\",\n          width: \"100%\",\n          height: \"100%\",\n          borderStyle: \"none\",\n          outline: \"none\",\n          font: \"inherit\",\n          textOverflow: \"ellipsis\",\n          padding: \"0\",\n          selectors: {\n            \"::-ms-clear\": {\n              display: \"none\"\n            }\n          }\n        },\n        inputHighContrastStyles\n      ],\n      inputDisabled: [getDisabledStyles(theme), getPlaceholderStyles(disabledPlaceholderStyles)],\n      errorMessage: [\n        theme.fonts.small,\n        {\n          color: root.erroredColor,\n          marginTop: \"5px\"\n        }\n      ],\n      callout: {\n        boxShadow: effects.elevation8\n      },\n      optionsContainerWrapper: {\n        width: comboBoxOptionWidth\n      },\n      optionsContainer: {\n        display: \"block\"\n      },\n      screenReaderText: hiddenContentStyle,\n      header: [\n        fonts.medium,\n        {\n          fontWeight: FontWeights.semibold,\n          color: option.headerTextColor,\n          backgroundColor: \"none\",\n          borderStyle: \"none\",\n          height: ComboBoxOptionHeight,\n          lineHeight: ComboBoxOptionHeight,\n          cursor: \"default\",\n          padding: \"0 8px\",\n          userSelect: \"none\",\n          textAlign: \"left\",\n          selectors: (_f = {}, _f[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _f)\n        }\n      ],\n      divider: {\n        height: 1,\n        backgroundColor: option.dividerBorderColor\n      }\n    };\n    return concatStyleSets(styles, customStyles);\n  });\n  var getClassNames$g = memoizeFunction(function(styles, className2, isOpen, disabled, required2, focused, allowFreeForm, hasErrorMessage) {\n    return {\n      container: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-container\", className2, styles.container),\n      label: mergeStyles(styles.__shadowConfig__, styles.label, disabled && styles.labelDisabled),\n      root: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox\", hasErrorMessage ? styles.rootError : isOpen && \"is-open\", required2 && \"is-required\", styles.root, !allowFreeForm && styles.rootDisallowFreeForm, hasErrorMessage && !focused ? styles.rootError : !disabled && focused && styles.rootFocused, !disabled && {\n        selectors: {\n          \":hover\": hasErrorMessage ? styles.rootError : !isOpen && !focused && styles.rootHovered,\n          \":active\": hasErrorMessage ? styles.rootError : styles.rootPressed,\n          \":focus\": hasErrorMessage ? styles.rootError : styles.rootFocused\n        }\n      }, disabled && [\"is-disabled\", styles.rootDisabled]),\n      input: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-Input\", styles.input, disabled && styles.inputDisabled),\n      errorMessage: mergeStyles(styles.__shadowConfig__, styles.errorMessage),\n      callout: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-callout\", styles.callout),\n      optionsContainerWrapper: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-optionsContainerWrapper\", styles.optionsContainerWrapper),\n      optionsContainer: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-optionsContainer\", styles.optionsContainer),\n      header: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-header\", styles.header),\n      divider: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-divider\", styles.divider),\n      screenReaderText: mergeStyles(styles.__shadowConfig__, styles.screenReaderText)\n    };\n  });\n  var getComboBoxOptionClassNames = memoizeFunction(function(styles) {\n    return {\n      optionText: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-optionText\", styles.optionText),\n      root: mergeStyles(styles.__shadowConfig__, \"ms-ComboBox-option\", styles.root, {\n        selectors: {\n          \":hover\": styles.rootHovered,\n          \":focus\": styles.rootFocused,\n          \":active\": styles.rootPressed\n        }\n      }),\n      optionTextWrapper: mergeStyles(styles.__shadowConfig__, styles.optionTextWrapper)\n    };\n  });\n  function getAllSelectedOptions(options2, selectedIndices) {\n    var selectedOptions = [];\n    for (var _i = 0, selectedIndices_1 = selectedIndices; _i < selectedIndices_1.length; _i++) {\n      var index2 = selectedIndices_1[_i];\n      var option = options2[index2];\n      if (option) {\n        selectedOptions.push(option);\n      }\n    }\n    return selectedOptions;\n  }\n  var SelectableOptionMenuItemType;\n  (function(SelectableOptionMenuItemType2) {\n    SelectableOptionMenuItemType2[SelectableOptionMenuItemType2[\"Normal\"] = 0] = \"Normal\";\n    SelectableOptionMenuItemType2[SelectableOptionMenuItemType2[\"Divider\"] = 1] = \"Divider\";\n    SelectableOptionMenuItemType2[SelectableOptionMenuItemType2[\"Header\"] = 2] = \"Header\";\n    SelectableOptionMenuItemType2[SelectableOptionMenuItemType2[\"SelectAll\"] = 3] = \"SelectAll\";\n  })(SelectableOptionMenuItemType || (SelectableOptionMenuItemType = {}));\n  var SearchDirection;\n  (function(SearchDirection2) {\n    SearchDirection2[SearchDirection2[\"backward\"] = -1] = \"backward\";\n    SearchDirection2[SearchDirection2[\"none\"] = 0] = \"none\";\n    SearchDirection2[SearchDirection2[\"forward\"] = 1] = \"forward\";\n  })(SearchDirection || (SearchDirection = {}));\n  var HoverStatus;\n  (function(HoverStatus2) {\n    HoverStatus2[HoverStatus2[\"clearAll\"] = -2] = \"clearAll\";\n    HoverStatus2[HoverStatus2[\"default\"] = -1] = \"default\";\n  })(HoverStatus || (HoverStatus = {}));\n  var ScrollIdleDelay = 250;\n  var TouchIdleDelay = 500;\n  var ReadOnlyPendingAutoCompleteTimeout = 1e3;\n  var ComboBoxOptionWrapper = React__namespace.memo(function(_a2) {\n    var render = _a2.render;\n    return render();\n  }, function(_a2, _b2) {\n    _a2.render;\n    var oldProps = __rest(_a2, [\"render\"]);\n    _b2.render;\n    var newProps = __rest(_b2, [\"render\"]);\n    return shallowCompare(oldProps, newProps);\n  });\n  var COMPONENT_NAME$4 = \"ComboBox\";\n  var DEFAULT_PROPS$2 = {\n    options: [],\n    allowFreeform: false,\n    allowParentArrowNavigation: false,\n    autoComplete: \"on\",\n    buttonIconProps: { iconName: \"ChevronDown\" }\n  };\n  function useOptionsState(_a2) {\n    var options2 = _a2.options, defaultSelectedKey = _a2.defaultSelectedKey, selectedKey = _a2.selectedKey;\n    var _b2 = React__namespace.useState(function() {\n      return getSelectedIndices(options2, buildDefaultSelectedKeys(defaultSelectedKey, selectedKey));\n    }), selectedIndices = _b2[0], setSelectedIndices = _b2[1];\n    var _c2 = React__namespace.useState(options2), currentOptions = _c2[0], setCurrentOptions = _c2[1];\n    var _d2 = React__namespace.useState(), suggestedDisplayValue = _d2[0], setSuggestedDisplayValue = _d2[1];\n    React__namespace.useEffect(function() {\n      if (selectedKey !== void 0) {\n        var selectedKeys = buildSelectedKeys(selectedKey);\n        var indices = getSelectedIndices(options2, selectedKeys);\n        setSelectedIndices(indices);\n      }\n      setCurrentOptions(options2);\n    }, [options2, selectedKey]);\n    React__namespace.useEffect(function() {\n      if (selectedKey === null) {\n        setSuggestedDisplayValue(void 0);\n      }\n    }, [selectedKey]);\n    return [\n      selectedIndices,\n      setSelectedIndices,\n      currentOptions,\n      setCurrentOptions,\n      suggestedDisplayValue,\n      setSuggestedDisplayValue\n    ];\n  }\n  var ComboBox = React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var _a2 = getPropsWithDefaults(DEFAULT_PROPS$2, propsWithoutDefaults);\n    _a2.ref;\n    var props = __rest(_a2, [\"ref\"]);\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRef = useMergedRefs(rootRef, forwardedRef);\n    var _b2 = useOptionsState(props), selectedIndices = _b2[0], setSelectedIndices = _b2[1], currentOptions = _b2[2], setCurrentOptions = _b2[3], suggestedDisplayValue = _b2[4], setSuggestedDisplayValue = _b2[5];\n    return React__namespace.createElement(ComboBoxInternal, __assign$1({}, props, { hoisted: {\n      mergedRootRef,\n      rootRef,\n      selectedIndices,\n      setSelectedIndices,\n      currentOptions,\n      setCurrentOptions,\n      suggestedDisplayValue,\n      setSuggestedDisplayValue\n    } }));\n  });\n  ComboBox.displayName = COMPONENT_NAME$4;\n  function findFirstDescendant(element2, match2) {\n    var children2 = getChildren(element2);\n    for (var index2 = 0; index2 < children2.length; index2++) {\n      var child = children2[index2];\n      if (match2(child)) {\n        return child;\n      }\n      var candidate = findFirstDescendant(child, match2);\n      if (candidate) {\n        return candidate;\n      }\n    }\n    return null;\n  }\n  var ComboBoxInternal = (\n    /** @class */\n    (function(_super) {\n      __extends(ComboBoxInternal2, _super);\n      function ComboBoxInternal2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._autofill = React__namespace.createRef();\n        _this._comboBoxWrapper = React__namespace.createRef();\n        _this._comboBoxMenu = React__namespace.createRef();\n        _this._selectedElement = React__namespace.createRef();\n        _this._overrideScrollDismiss = false;\n        _this.focus = function(shouldOpenOnFocus, useFocusAsync) {\n          if (_this.props.disabled) {\n            return;\n          }\n          if (_this._autofill.current) {\n            if (useFocusAsync) {\n              focusAsync(_this._autofill.current);\n            } else {\n              _this._autofill.current.focus();\n            }\n            if (shouldOpenOnFocus) {\n              _this.setState({\n                isOpen: true\n              });\n            }\n          }\n          if (!_this._hasFocus()) {\n            _this.setState({ focusState: \"focused\" });\n          }\n        };\n        _this.dismissMenu = function() {\n          var isOpen = _this.state.isOpen;\n          isOpen && _this.setState({ isOpen: false });\n        };\n        _this._onUpdateValueInAutofillWillReceiveProps = function() {\n          var comboBox = _this._autofill.current;\n          if (!comboBox) {\n            return null;\n          }\n          if (comboBox.value === null || comboBox.value === void 0) {\n            return null;\n          }\n          return normalizeToString(_this._currentVisibleValue);\n        };\n        _this._renderComboBoxWrapper = function(multiselectAccessibleText, errorMessageId) {\n          var _a2 = _this.props, label2 = _a2.label, disabled = _a2.disabled, ariaLabel2 = _a2.ariaLabel, _b2 = _a2.ariaDescribedBy, ariaDescribedBy = _b2 === void 0 ? _this.props[\"aria-describedby\"] : _b2, required2 = _a2.required, errorMessage = _a2.errorMessage, buttonIconProps = _a2.buttonIconProps, isButtonAriaHidden = _a2.isButtonAriaHidden, title = _a2.title, placeholderProp = _a2.placeholder, tabIndex = _a2.tabIndex, autofill = _a2.autofill, iconButtonProps = _a2.iconButtonProps, suggestedDisplayValue = _a2.hoisted.suggestedDisplayValue;\n          var _c2 = _this.state, ariaActiveDescendantValue = _c2.ariaActiveDescendantValue, isOpen = _c2.isOpen;\n          var placeholder = _this._hasFocus() && _this.props.multiSelect && multiselectAccessibleText ? multiselectAccessibleText : placeholderProp;\n          var labelledBy = [_this.props[\"aria-labelledby\"], label2 && _this._id + \"-label\"].join(\" \").trim();\n          var labelProps = {\n            \"aria-labelledby\": labelledBy ? labelledBy : void 0,\n            \"aria-label\": ariaLabel2 && !label2 ? ariaLabel2 : void 0\n          };\n          var hasErrorMessage = errorMessage && errorMessage.length > 0 ? true : false;\n          return React__namespace.createElement(\n            \"div\",\n            { \"data-ktp-target\": true, ref: _this._comboBoxWrapper, id: _this._id + \"wrapper\", className: _this._classNames.root, \"aria-owns\": isOpen ? _this._id + \"-list\" : void 0 },\n            React__namespace.createElement(Autofill, __assign$1({ \"data-ktp-execute-target\": true, \"data-is-interactable\": !disabled, componentRef: _this._autofill, id: _this._id + \"-input\", className: _this._classNames.input, type: \"text\", onFocus: _this._onFocus, onBlur: _this._onBlur, onKeyDown: _this._onInputKeyDown, onKeyUp: _this._onInputKeyUp, onClick: _this._onAutofillClick, onTouchStart: _this._onTouchStart, onInputValueChange: _this._onInputChange, \"aria-expanded\": isOpen, \"aria-autocomplete\": _this._getAriaAutoCompleteValue(), role: \"combobox\", readOnly: disabled }, labelProps, {\n              \"aria-describedby\": errorMessage !== void 0 ? mergeAriaAttributeValues(ariaDescribedBy, errorMessageId) : ariaDescribedBy,\n              \"aria-activedescendant\": ariaActiveDescendantValue,\n              \"aria-required\": required2,\n              \"aria-disabled\": disabled,\n              \"aria-invalid\": hasErrorMessage,\n              \"aria-controls\": isOpen ? _this._id + \"-list\" : void 0,\n              spellCheck: false,\n              defaultVisibleValue: _this._currentVisibleValue,\n              suggestedDisplayValue,\n              // eslint-disable-next-line @typescript-eslint/no-deprecated\n              updateValueInWillReceiveProps: _this._onUpdateValueInAutofillWillReceiveProps,\n              shouldSelectFullInputValueInComponentDidUpdate: _this._onShouldSelectFullInputValueInAutofillComponentDidUpdate,\n              title,\n              preventValueSelection: !_this._hasFocus(),\n              placeholder,\n              tabIndex: disabled ? -1 : tabIndex\n            }, autofill)),\n            React__namespace.createElement(IconButton, __assign$1({ className: \"ms-ComboBox-CaretDown-button\", styles: _this._getCaretButtonStyles(), role: isButtonAriaHidden ? \"presentation\" : void 0, \"aria-hidden\": isButtonAriaHidden }, !isButtonAriaHidden ? labelProps : void 0, { \"data-is-focusable\": false, tabIndex: -1, onClick: _this._onComboBoxClick, onBlur: _this._onBlur, iconProps: buttonIconProps, disabled, checked: isOpen }, iconButtonProps))\n          );\n        };\n        _this._onShouldSelectFullInputValueInAutofillComponentDidUpdate = function() {\n          return _this._currentVisibleValue === _this.props.hoisted.suggestedDisplayValue;\n        };\n        _this._getVisibleValue = function() {\n          var _a2 = _this.props, text2 = _a2.text, allowFreeform = _a2.allowFreeform, allowFreeInput = _a2.allowFreeInput, autoComplete = _a2.autoComplete, _b2 = _a2.hoisted, suggestedDisplayValue = _b2.suggestedDisplayValue, selectedIndices = _b2.selectedIndices, currentOptions = _b2.currentOptions;\n          var _c2 = _this.state, currentPendingValueValidIndex = _c2.currentPendingValueValidIndex, currentPendingValue = _c2.currentPendingValue, isOpen = _c2.isOpen;\n          var currentPendingIndexValid = indexWithinBounds(currentOptions, currentPendingValueValidIndex);\n          if (!(isOpen && currentPendingIndexValid) && (text2 || text2 === \"\") && (currentPendingValue === null || currentPendingValue === void 0)) {\n            return text2;\n          }\n          if (_this.props.multiSelect) {\n            if (_this._hasFocus()) {\n              var index2 = -1;\n              if (autoComplete === \"on\" && currentPendingIndexValid) {\n                index2 = currentPendingValueValidIndex;\n              }\n              return _this._getPendingString(currentPendingValue, currentOptions, index2);\n            } else {\n              return _this._getMultiselectDisplayString(selectedIndices, currentOptions, suggestedDisplayValue);\n            }\n          } else {\n            var index2 = _this._getFirstSelectedIndex();\n            if (allowFreeform || allowFreeInput) {\n              if (autoComplete === \"on\" && currentPendingIndexValid) {\n                index2 = currentPendingValueValidIndex;\n              }\n              return _this._getPendingString(currentPendingValue, currentOptions, index2);\n            } else {\n              if (currentPendingIndexValid && autoComplete === \"on\") {\n                index2 = currentPendingValueValidIndex;\n                return normalizeToString(currentPendingValue);\n              } else if (!_this.state.isOpen && currentPendingValue) {\n                return indexWithinBounds(currentOptions, index2) ? currentPendingValue : normalizeToString(suggestedDisplayValue);\n              } else {\n                return indexWithinBounds(currentOptions, index2) ? getPreviewText(currentOptions[index2]) : normalizeToString(suggestedDisplayValue);\n              }\n            }\n          }\n        };\n        _this._onInputChange = function(updatedValue) {\n          if (_this.props.disabled) {\n            _this._handleInputWhenDisabled(\n              null\n              /* event */\n            );\n            return;\n          }\n          if (_this.props.onInputValueChange) {\n            _this.props.onInputValueChange(updatedValue);\n          }\n          _this.props.allowFreeform || _this.props.allowFreeInput ? _this._processInputChangeWithFreeform(updatedValue) : _this._processInputChangeWithoutFreeform(updatedValue);\n        };\n        _this._onFocus = function() {\n          var _a2, _b2;\n          (_b2 = (_a2 = _this._autofill.current) === null || _a2 === void 0 ? void 0 : _a2.inputElement) === null || _b2 === void 0 ? void 0 : _b2.select();\n          if (!_this._hasFocus()) {\n            _this.setState({ focusState: \"focusing\" });\n          }\n        };\n        _this._onResolveOptions = function() {\n          if (_this.props.onResolveOptions) {\n            var newOptions_1 = _this.props.onResolveOptions(__spreadArray([], _this.props.hoisted.currentOptions, true));\n            if (Array.isArray(newOptions_1)) {\n              _this.props.hoisted.setCurrentOptions(newOptions_1);\n            } else if (newOptions_1 && newOptions_1.then) {\n              _this._currentPromise = newOptions_1;\n              newOptions_1.then(function(newOptionsFromPromise) {\n                if (newOptions_1 === _this._currentPromise) {\n                  _this.props.hoisted.setCurrentOptions(newOptionsFromPromise);\n                }\n              });\n            }\n          }\n        };\n        _this._onBlur = function(event2) {\n          var _a2, _b2;\n          var doc = getDocumentEx(_this.context);\n          var relatedTarget = event2.relatedTarget;\n          if (event2.relatedTarget === null) {\n            relatedTarget = doc === null || doc === void 0 ? void 0 : doc.activeElement;\n          }\n          if (relatedTarget) {\n            var isBlurFromComboBoxTitle = (_a2 = _this.props.hoisted.rootRef.current) === null || _a2 === void 0 ? void 0 : _a2.contains(relatedTarget);\n            var isBlurFromComboBoxMenu = (_b2 = _this._comboBoxMenu.current) === null || _b2 === void 0 ? void 0 : _b2.contains(relatedTarget);\n            var isBlurFromComboBoxMenuAncestor = _this._comboBoxMenu.current && findElementRecursive(_this._comboBoxMenu.current, function(element2) {\n              return element2 === relatedTarget;\n            }, doc);\n            if (isBlurFromComboBoxTitle || isBlurFromComboBoxMenu || isBlurFromComboBoxMenuAncestor) {\n              if (isBlurFromComboBoxMenuAncestor && _this._hasFocus() && (!_this.props.multiSelect || _this.props.allowFreeform)) {\n                _this._submitPendingValue(event2);\n              }\n              event2.preventDefault();\n              event2.stopPropagation();\n              return;\n            }\n          }\n          if (_this._hasFocus()) {\n            _this.setState({ focusState: \"none\" });\n            if (!_this.props.multiSelect || _this.props.allowFreeform) {\n              _this._submitPendingValue(event2);\n            }\n          }\n        };\n        _this._onRenderContainer = function(props2, defaultRender) {\n          var onRenderList = props2.onRenderList, calloutProps = props2.calloutProps, dropdownWidth2 = props2.dropdownWidth, dropdownMaxWidth = props2.dropdownMaxWidth, _a2 = props2.onRenderUpperContent, onRenderUpperContent = _a2 === void 0 ? _this._onRenderUpperContent : _a2, _b2 = props2.onRenderLowerContent, onRenderLowerContent = _b2 === void 0 ? _this._onRenderLowerContent : _b2, useComboBoxAsMenuWidth = props2.useComboBoxAsMenuWidth, persistMenu = props2.persistMenu, _c2 = props2.shouldRestoreFocus, shouldRestoreFocus = _c2 === void 0 ? true : _c2;\n          var isOpen = _this.state.isOpen;\n          var id2 = _this._id;\n          var comboBoxMenuWidth = useComboBoxAsMenuWidth && _this._comboBoxWrapper.current ? _this._comboBoxWrapper.current.clientWidth + 2 : void 0;\n          return React__namespace.createElement(\n            Callout,\n            __assign$1({ isBeakVisible: false, gapSpace: 0, doNotLayer: false, directionalHint: DirectionalHint.bottomLeftEdge, directionalHintFixed: false }, calloutProps, {\n              onLayerMounted: _this._onLayerMounted,\n              className: css(_this._classNames.callout, calloutProps === null || calloutProps === void 0 ? void 0 : calloutProps.className),\n              target: _this._comboBoxWrapper.current,\n              onDismiss: _this._onDismiss,\n              onMouseDown: _this._onCalloutMouseDown,\n              onScroll: _this._onScroll,\n              setInitialFocus: false,\n              calloutWidth: useComboBoxAsMenuWidth && _this._comboBoxWrapper.current ? comboBoxMenuWidth && comboBoxMenuWidth : dropdownWidth2,\n              calloutMaxWidth: dropdownMaxWidth ? dropdownMaxWidth : comboBoxMenuWidth,\n              hidden: persistMenu ? !isOpen : void 0,\n              // eslint-disable-next-line @typescript-eslint/no-deprecated\n              shouldRestoreFocus,\n              // eslint-disable-next-line react/jsx-no-bind\n              preventDismissOnEvent: function(ev) {\n                return _this._preventDismissOnScrollOrResize(ev);\n              }\n            }),\n            onRenderUpperContent(_this.props, _this._onRenderUpperContent),\n            React__namespace.createElement(\"div\", { className: _this._classNames.optionsContainerWrapper, ref: _this._comboBoxMenu }, onRenderList === null || onRenderList === void 0 ? void 0 : onRenderList(__assign$1(__assign$1({}, props2), { id: id2 }), _this._onRenderList)),\n            onRenderLowerContent(_this.props, _this._onRenderLowerContent)\n          );\n        };\n        _this._onLayerMounted = function() {\n          _this._onCalloutLayerMounted();\n          _this._async.setTimeout(function() {\n            _this._scrollIntoView();\n          }, 0);\n          if (_this.props.calloutProps && _this.props.calloutProps.onLayerMounted) {\n            _this.props.calloutProps.onLayerMounted();\n          }\n        };\n        _this._onRenderLabel = function(onRenderLabelProps) {\n          var _a2 = onRenderLabelProps.props, label2 = _a2.label, disabled = _a2.disabled, required2 = _a2.required;\n          if (label2) {\n            return React__namespace.createElement(\n              Label$2,\n              { id: _this._id + \"-label\", disabled, required: required2, className: _this._classNames.label },\n              label2,\n              onRenderLabelProps.multiselectAccessibleText && React__namespace.createElement(\"span\", { className: _this._classNames.screenReaderText }, onRenderLabelProps.multiselectAccessibleText)\n            );\n          }\n          return null;\n        };\n        _this._onRenderList = function(props2) {\n          var _a2 = props2.onRenderItem, onRenderItem = _a2 === void 0 ? _this._onRenderItem : _a2, label2 = props2.label, ariaLabel2 = props2.ariaLabel, multiSelect = props2.multiSelect;\n          var queue = { items: [] };\n          var renderedList = [];\n          var emptyQueue = function() {\n            var newGroup = queue.id ? [\n              React__namespace.createElement(\"div\", { role: \"group\", key: queue.id, \"aria-labelledby\": queue.id }, queue.items)\n            ] : queue.items;\n            renderedList = __spreadArray(__spreadArray([], renderedList, true), newGroup, true);\n            queue = { items: [] };\n          };\n          var placeRenderedOptionIntoQueue = function(item, index2) {\n            switch (item.itemType) {\n              case SelectableOptionMenuItemType.Header:\n                queue.items.length > 0 && emptyQueue();\n                var id_1 = _this._id + item.key;\n                queue.items.push(onRenderItem(__assign$1(__assign$1({ id: id_1 }, item), { index: index2 }), _this._onRenderItem));\n                queue.id = id_1;\n                break;\n              case SelectableOptionMenuItemType.Divider:\n                index2 > 0 && queue.items.push(onRenderItem(__assign$1(__assign$1({}, item), { index: index2 }), _this._onRenderItem));\n                queue.items.length > 0 && emptyQueue();\n                break;\n              default:\n                queue.items.push(onRenderItem(__assign$1(__assign$1({}, item), { index: index2 }), _this._onRenderItem));\n            }\n          };\n          props2.options.forEach(function(item, index2) {\n            placeRenderedOptionIntoQueue(item, index2);\n          });\n          queue.items.length > 0 && emptyQueue();\n          var id2 = _this._id;\n          return React__namespace.createElement(\"div\", { id: id2 + \"-list\", className: _this._classNames.optionsContainer, \"aria-labelledby\": label2 && id2 + \"-label\", \"aria-label\": ariaLabel2 && !label2 ? ariaLabel2 : void 0, \"aria-multiselectable\": multiSelect ? \"true\" : void 0, role: \"listbox\" }, renderedList);\n        };\n        _this._onRenderItem = function(item) {\n          switch (item.itemType) {\n            case SelectableOptionMenuItemType.Divider:\n              return _this._renderSeparator(item);\n            case SelectableOptionMenuItemType.Header:\n              return _this._renderHeader(item);\n            default:\n              return _this._renderOption(item);\n          }\n        };\n        _this._onRenderLowerContent = function() {\n          return null;\n        };\n        _this._onRenderUpperContent = function() {\n          return null;\n        };\n        _this._renderOption = function(item) {\n          var _a2;\n          var _b2 = _this.props.onRenderOption, onRenderOption = _b2 === void 0 ? _this._onRenderOptionContent : _b2;\n          var id2 = (_a2 = item.id) !== null && _a2 !== void 0 ? _a2 : _this._id + \"-list\" + item.index;\n          var isSelected = _this._isOptionSelected(item.index);\n          var isChecked = _this._isOptionChecked(item.index);\n          var isIndeterminate = _this._isOptionIndeterminate(item.index);\n          var optionStyles = _this._getCurrentOptionStyles(item);\n          var optionClassNames = getComboBoxOptionClassNames(optionStyles);\n          var title = item.title;\n          var getOptionComponent = function() {\n            return !_this.props.multiSelect ? React__namespace.createElement(CommandButton, {\n              id: id2,\n              key: item.key,\n              \"data-index\": item.index,\n              styles: optionStyles,\n              checked: isSelected,\n              className: \"ms-ComboBox-option\",\n              onClick: _this._onItemClick(item),\n              // eslint-disable-next-line react/jsx-no-bind\n              onMouseEnter: _this._onOptionMouseEnter.bind(_this, item.index),\n              // eslint-disable-next-line react/jsx-no-bind\n              onMouseMove: _this._onOptionMouseMove.bind(_this, item.index),\n              onMouseLeave: _this._onOptionMouseLeave,\n              role: \"option\",\n              \"aria-selected\": isSelected ? \"true\" : \"false\",\n              ariaLabel: item.ariaLabel,\n              disabled: item.disabled,\n              title\n            }, React__namespace.createElement(\"span\", { className: optionClassNames.optionTextWrapper, ref: isSelected ? _this._selectedElement : void 0 }, onRenderOption(item, _this._onRenderOptionContent))) : React__namespace.createElement(Checkbox, {\n              id: id2,\n              ariaLabel: item.ariaLabel,\n              ariaLabelledBy: item.ariaLabel ? void 0 : id2 + \"-label\",\n              key: item.key,\n              styles: optionStyles,\n              className: \"ms-ComboBox-option\",\n              onChange: _this._onItemClick(item),\n              label: item.text,\n              checked: isChecked,\n              indeterminate: isIndeterminate,\n              title,\n              disabled: item.disabled,\n              // eslint-disable-next-line react/jsx-no-bind\n              onRenderLabel: _this._renderCheckboxLabel.bind(_this, __assign$1(__assign$1({}, item), { id: id2 + \"-label\" })),\n              inputProps: __assign$1({\n                // aria-selected should only be applied to checked items, not hovered items\n                \"aria-selected\": isChecked ? \"true\" : \"false\",\n                role: \"option\"\n              }, {\n                \"data-index\": item.index,\n                \"data-is-focusable\": true\n              })\n            });\n          };\n          return React__namespace.createElement(ComboBoxOptionWrapper, {\n            key: item.key,\n            index: item.index,\n            disabled: item.disabled,\n            isSelected,\n            isChecked,\n            isIndeterminate,\n            text: item.text,\n            // eslint-disable-next-line react/jsx-no-bind\n            render: getOptionComponent,\n            data: item.data\n          });\n        };\n        _this._onCalloutMouseDown = function(ev) {\n          ev.preventDefault();\n        };\n        _this._onScroll = function() {\n          var _a2;\n          if (!_this._isScrollIdle && _this._scrollIdleTimeoutId !== void 0) {\n            _this._async.clearTimeout(_this._scrollIdleTimeoutId);\n            _this._scrollIdleTimeoutId = void 0;\n          } else {\n            _this._isScrollIdle = false;\n          }\n          if ((_a2 = _this.props.calloutProps) === null || _a2 === void 0 ? void 0 : _a2.onScroll) {\n            _this.props.calloutProps.onScroll();\n          }\n          _this._scrollIdleTimeoutId = _this._async.setTimeout(function() {\n            _this._isScrollIdle = true;\n          }, ScrollIdleDelay);\n        };\n        _this._onRenderOptionContent = function(item) {\n          var optionClassNames = getComboBoxOptionClassNames(_this._getCurrentOptionStyles(item));\n          return React__namespace.createElement(\"span\", { className: optionClassNames.optionText }, item.text);\n        };\n        _this._onRenderMultiselectOptionContent = function(item) {\n          var optionClassNames = getComboBoxOptionClassNames(_this._getCurrentOptionStyles(item));\n          return React__namespace.createElement(\"span\", { id: item.id, \"aria-hidden\": \"true\", className: optionClassNames.optionText }, item.text);\n        };\n        _this._onDismiss = function() {\n          var onMenuDismiss = _this.props.onMenuDismiss;\n          if (onMenuDismiss) {\n            onMenuDismiss();\n          }\n          if (_this.props.persistMenu) {\n            _this._onCalloutLayerMounted();\n          }\n          _this._setOpenStateAndFocusOnClose(\n            false,\n            false\n            /* focusInputAfterClose */\n          );\n          _this._resetSelectedIndex();\n        };\n        _this._onAfterClearPendingInfo = function() {\n          _this._processingClearPendingInfo = false;\n        };\n        _this._onInputKeyDown = function(ev) {\n          var _a2 = _this.props, disabled = _a2.disabled, allowFreeform = _a2.allowFreeform, allowFreeInput = _a2.allowFreeInput, allowParentArrowNavigation = _a2.allowParentArrowNavigation, autoComplete = _a2.autoComplete, currentOptions = _a2.hoisted.currentOptions;\n          var _b2 = _this.state, isOpen = _b2.isOpen, currentPendingValueValidIndexOnHover = _b2.currentPendingValueValidIndexOnHover;\n          _this._lastKeyDownWasAltOrMeta = isAltOrMeta(ev);\n          if (disabled) {\n            _this._handleInputWhenDisabled(ev);\n            return;\n          }\n          var index2 = _this._getPendingSelectedIndex(\n            false\n            /* includeCurrentPendingValue */\n          );\n          switch (ev.which) {\n            case KeyCodes.enter:\n              if (_this._autofill.current && _this._autofill.current.inputElement) {\n                _this._autofill.current.inputElement.select();\n              }\n              _this._submitPendingValue(ev);\n              if (_this.props.multiSelect && isOpen) {\n                _this.setState({\n                  currentPendingValueValidIndex: index2\n                });\n              } else {\n                if (isOpen || (!allowFreeform || _this.state.currentPendingValue === void 0 || _this.state.currentPendingValue === null || _this.state.currentPendingValue.length <= 0) && _this.state.currentPendingValueValidIndex < 0) {\n                  _this.setState({\n                    isOpen: !isOpen\n                  });\n                }\n              }\n              break;\n            case KeyCodes.tab:\n              if (!_this.props.multiSelect) {\n                _this._submitPendingValue(ev);\n              }\n              if (isOpen) {\n                _this._setOpenStateAndFocusOnClose(\n                  !isOpen,\n                  false\n                  /* focusInputAfterClose */\n                );\n              }\n              return;\n            case KeyCodes.escape:\n              _this._resetSelectedIndex();\n              if (isOpen) {\n                _this.setState({\n                  isOpen: false\n                });\n              } else {\n                return;\n              }\n              break;\n            case KeyCodes.up:\n              if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) {\n                index2 = _this.props.hoisted.currentOptions.length;\n              }\n              if (ev.altKey || ev.metaKey) {\n                if (isOpen) {\n                  _this._setOpenStateAndFocusOnClose(\n                    !isOpen,\n                    true\n                    /* focusInputAfterClose */\n                  );\n                  break;\n                }\n                return;\n              }\n              ev.preventDefault();\n              _this._setPendingInfoFromIndexAndDirection(index2, SearchDirection.backward);\n              break;\n            case KeyCodes.down:\n              if (ev.altKey || ev.metaKey) {\n                _this._setOpenStateAndFocusOnClose(\n                  true,\n                  true\n                  /* focusInputAfterClose */\n                );\n              } else {\n                if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) {\n                  index2 = -1;\n                }\n                ev.preventDefault();\n                _this._setPendingInfoFromIndexAndDirection(index2, SearchDirection.forward);\n              }\n              break;\n            case KeyCodes.home:\n            case KeyCodes.end:\n              if (allowFreeform || allowFreeInput) {\n                return;\n              }\n              index2 = -1;\n              var directionToSearch = SearchDirection.forward;\n              if (ev.which === KeyCodes.end) {\n                index2 = currentOptions.length;\n                directionToSearch = SearchDirection.backward;\n              }\n              _this._setPendingInfoFromIndexAndDirection(index2, directionToSearch);\n              break;\n            /* eslint-disable no-fallthrough */\n            case KeyCodes.space:\n              if (!allowFreeform && !allowFreeInput && autoComplete === \"off\") {\n                break;\n              }\n            default:\n              if (ev.which >= 112 && ev.which <= 123) {\n                return;\n              }\n              if (ev.keyCode === KeyCodes.alt || ev.key === \"Meta\") {\n                return;\n              }\n              if (allowParentArrowNavigation && (ev.keyCode === KeyCodes.left || ev.keyCode === KeyCodes.right)) {\n                return;\n              }\n              if (!allowFreeform && !allowFreeInput && autoComplete === \"on\") {\n                _this._onInputChange(ev.key);\n                break;\n              }\n              return;\n          }\n          ev.stopPropagation();\n          ev.preventDefault();\n        };\n        _this._onInputKeyUp = function(ev) {\n          var _a2 = _this.props, disabled = _a2.disabled, allowFreeform = _a2.allowFreeform, allowFreeInput = _a2.allowFreeInput, autoComplete = _a2.autoComplete;\n          var isOpen = _this.state.isOpen;\n          var keyPressIsAltOrMetaAlone = _this._lastKeyDownWasAltOrMeta && isAltOrMeta(ev);\n          _this._lastKeyDownWasAltOrMeta = false;\n          var shouldHandleKey = keyPressIsAltOrMetaAlone && !(isMac() || isIOS());\n          if (disabled) {\n            _this._handleInputWhenDisabled(ev);\n            return;\n          }\n          switch (ev.which) {\n            case KeyCodes.space:\n              if (!allowFreeform && !allowFreeInput && autoComplete === \"off\") {\n                _this._setOpenStateAndFocusOnClose(!isOpen, !!isOpen);\n              }\n              return;\n            default:\n              if (shouldHandleKey && isOpen) {\n                _this._setOpenStateAndFocusOnClose(\n                  !isOpen,\n                  true\n                  /* focusInputAfterClose */\n                );\n              } else {\n                if (_this.state.focusState === \"focusing\" && _this.props.openOnKeyboardFocus) {\n                  _this.setState({ isOpen: true });\n                }\n                if (_this.state.focusState !== \"focused\") {\n                  _this.setState({ focusState: \"focused\" });\n                }\n              }\n              return;\n          }\n        };\n        _this._onOptionMouseLeave = function() {\n          if (_this._shouldIgnoreMouseEvent()) {\n            return;\n          }\n          if (_this.props.persistMenu && !_this.state.isOpen) {\n            return;\n          }\n          _this.setState({\n            currentPendingValueValidIndexOnHover: HoverStatus.clearAll\n          });\n        };\n        _this._onComboBoxClick = function() {\n          var disabled = _this.props.disabled;\n          var isOpen = _this.state.isOpen;\n          if (!disabled) {\n            _this._setOpenStateAndFocusOnClose(\n              !isOpen,\n              false\n              /* focusInputAfterClose */\n            );\n            _this.setState({ focusState: \"focused\" });\n          }\n        };\n        _this._onAutofillClick = function() {\n          var _a2 = _this.props, disabled = _a2.disabled, allowFreeform = _a2.allowFreeform;\n          if (allowFreeform && !disabled) {\n            _this.focus(_this.state.isOpen || _this._processingTouch);\n          } else {\n            _this._onComboBoxClick();\n          }\n        };\n        _this._onTouchStart = function() {\n          if (_this._comboBoxWrapper.current && !(\"onpointerdown\" in _this._comboBoxWrapper)) {\n            _this._handleTouchAndPointerEvent();\n          }\n        };\n        _this._onPointerDown = function(ev) {\n          if (ev.pointerType === \"touch\") {\n            _this._handleTouchAndPointerEvent();\n            ev.preventDefault();\n            ev.stopImmediatePropagation();\n          }\n        };\n        initializeComponentRef(_this);\n        _this._async = new Async(_this);\n        _this._events = new EventGroup(_this);\n        _this._id = props.id || getId(\"ComboBox\");\n        _this._isScrollIdle = true;\n        _this._processingTouch = false;\n        _this._gotMouseMove = false;\n        _this._processingClearPendingInfo = false;\n        _this.state = {\n          isOpen: false,\n          focusState: \"none\",\n          currentPendingValueValidIndex: -1,\n          currentPendingValue: void 0,\n          currentPendingValueValidIndexOnHover: HoverStatus.default\n        };\n        return _this;\n      }\n      Object.defineProperty(ComboBoxInternal2.prototype, \"selectedOptions\", {\n        /**\n         * All selected options\n         */\n        get: function() {\n          var _a2 = this.props.hoisted, currentOptions = _a2.currentOptions, selectedIndices = _a2.selectedIndices;\n          return getAllSelectedOptions(currentOptions, selectedIndices);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      ComboBoxInternal2.prototype.componentDidMount = function() {\n        if (this._comboBoxWrapper.current && !this.props.disabled) {\n          this._events.on(this._comboBoxWrapper.current, \"focus\", this._onResolveOptions, true);\n          if (\"onpointerdown\" in this._comboBoxWrapper.current) {\n            this._events.on(this._comboBoxWrapper.current, \"pointerdown\", this._onPointerDown, true);\n          }\n        }\n      };\n      ComboBoxInternal2.prototype.componentDidUpdate = function(prevProps, prevState) {\n        var _this = this;\n        var _a2, _b2, _c2;\n        var _d2 = this.props, allowFreeform = _d2.allowFreeform, allowFreeInput = _d2.allowFreeInput, text2 = _d2.text, onMenuOpen = _d2.onMenuOpen, onMenuDismissed = _d2.onMenuDismissed, _e2 = _d2.hoisted, currentOptions = _e2.currentOptions, selectedIndices = _e2.selectedIndices;\n        var _f = this.state, currentPendingValue = _f.currentPendingValue, currentPendingValueValidIndex = _f.currentPendingValueValidIndex, isOpen = _f.isOpen;\n        if (isOpen && (!prevState.isOpen || prevState.currentPendingValueValidIndex !== currentPendingValueValidIndex)) {\n          this._async.setTimeout(function() {\n            return _this._scrollIntoView();\n          }, 0);\n        }\n        var doc = getDocumentEx(this.context);\n        if (this._hasFocus() && (isOpen || prevState.isOpen && !isOpen && this._focusInputAfterClose && this._autofill.current && (doc === null || doc === void 0 ? void 0 : doc.activeElement) !== this._autofill.current.inputElement)) {\n          this.focus(\n            void 0,\n            true\n            /*useFocusAsync*/\n          );\n        }\n        if (this._focusInputAfterClose && (prevState.isOpen && !isOpen || this._hasFocus() && (!isOpen && !this.props.multiSelect && prevProps.hoisted.selectedIndices && selectedIndices && prevProps.hoisted.selectedIndices[0] !== selectedIndices[0] || !allowFreeform && !allowFreeInput || text2 !== prevProps.text))) {\n          this._onFocus();\n        }\n        this._notifyPendingValueChanged(prevState);\n        if (isOpen && !prevState.isOpen) {\n          this._overrideScrollDismiss = true;\n          this._async.clearTimeout(this._overrideScrollDimissTimeout);\n          this._overrideScrollDimissTimeout = this._async.setTimeout(function() {\n            _this._overrideScrollDismiss = false;\n          }, 100);\n          onMenuOpen === null || onMenuOpen === void 0 ? void 0 : onMenuOpen();\n        }\n        if (!isOpen && prevState.isOpen && onMenuDismissed) {\n          onMenuDismissed();\n        }\n        var newCurrentPendingValueValidIndex = currentPendingValueValidIndex;\n        var options2 = currentOptions.map(function(item, index2) {\n          return __assign$1(__assign$1({}, item), { index: index2 });\n        });\n        if (!shallowCompare(prevProps.hoisted.currentOptions, currentOptions) && currentPendingValue) {\n          newCurrentPendingValueValidIndex = this.props.allowFreeform || this.props.allowFreeInput ? this._processInputChangeWithFreeform(currentPendingValue) : this._updateAutocompleteIndexWithoutFreeform(currentPendingValue);\n        }\n        var descendantText = void 0;\n        if (isOpen && this._hasFocus() && newCurrentPendingValueValidIndex !== -1) {\n          descendantText = (_a2 = options2[newCurrentPendingValueValidIndex].id) !== null && _a2 !== void 0 ? _a2 : this._id + \"-list\" + newCurrentPendingValueValidIndex;\n        } else if (isOpen && selectedIndices.length) {\n          descendantText = (_c2 = (_b2 = options2[selectedIndices[0]]) === null || _b2 === void 0 ? void 0 : _b2.id) !== null && _c2 !== void 0 ? _c2 : this._id + \"-list\" + selectedIndices[0];\n        }\n        if (descendantText !== this.state.ariaActiveDescendantValue) {\n          this.setState({\n            ariaActiveDescendantValue: descendantText\n          });\n        }\n      };\n      ComboBoxInternal2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n        this._events.dispose();\n      };\n      ComboBoxInternal2.prototype.render = function() {\n        var id2 = this._id;\n        var errorMessageId = id2 + \"-error\";\n        var _a2 = this.props, className2 = _a2.className, disabled = _a2.disabled, required2 = _a2.required, errorMessage = _a2.errorMessage, _b2 = _a2.onRenderContainer, onRenderContainer = _b2 === void 0 ? this._onRenderContainer : _b2, _c2 = _a2.onRenderLabel, onRenderLabel = _c2 === void 0 ? this._onRenderLabel : _c2, _d2 = _a2.onRenderList, onRenderList = _d2 === void 0 ? this._onRenderList : _d2, _e2 = _a2.onRenderItem, onRenderItem = _e2 === void 0 ? this._onRenderItem : _e2, _f = _a2.onRenderOption, onRenderOption = _f === void 0 ? this._onRenderOptionContent : _f, allowFreeform = _a2.allowFreeform, customStyles = _a2.styles, theme = _a2.theme, persistMenu = _a2.persistMenu, multiSelect = _a2.multiSelect, _g = _a2.hoisted, suggestedDisplayValue = _g.suggestedDisplayValue, selectedIndices = _g.selectedIndices, currentOptions = _g.currentOptions;\n        var isOpen = this.state.isOpen;\n        this._currentVisibleValue = this._getVisibleValue();\n        var multiselectAccessibleText = multiSelect ? this._getMultiselectDisplayString(selectedIndices, currentOptions, suggestedDisplayValue) : void 0;\n        var divProps = getNativeProps(this.props, divProperties, [\n          \"onChange\",\n          \"value\",\n          \"aria-describedby\",\n          \"aria-labelledby\"\n        ]);\n        var hasErrorMessage = errorMessage && errorMessage.length > 0 ? true : false;\n        this._classNames = this.props.getClassNames ? this.props.getClassNames(theme, !!isOpen, !!disabled, !!required2, !!this._hasFocus(), !!allowFreeform, !!hasErrorMessage, className2) : getClassNames$g(getStyles$f(theme, customStyles), className2, !!isOpen, !!disabled, !!required2, !!this._hasFocus(), !!allowFreeform, !!hasErrorMessage);\n        var comboBoxWrapper = this._renderComboBoxWrapper(multiselectAccessibleText, errorMessageId);\n        return React__namespace.createElement(\n          \"div\",\n          __assign$1({}, divProps, { ref: this.props.hoisted.mergedRootRef, className: this._classNames.container }),\n          onRenderLabel({ props: this.props, multiselectAccessibleText }, this._onRenderLabel),\n          comboBoxWrapper,\n          (persistMenu || isOpen) && onRenderContainer(__assign$1(__assign$1({}, this.props), { onRenderList, onRenderItem, onRenderOption, options: currentOptions.map(function(item, index2) {\n            return __assign$1(__assign$1({}, item), { index: index2 });\n          }), onDismiss: this._onDismiss }), this._onRenderContainer),\n          hasErrorMessage && React__namespace.createElement(\"div\", { role: \"alert\", id: errorMessageId, className: this._classNames.errorMessage }, errorMessage)\n        );\n      };\n      ComboBoxInternal2.prototype._getPendingString = function(currentPendingValue, currentOptions, index2) {\n        return currentPendingValue !== null && currentPendingValue !== void 0 ? currentPendingValue : indexWithinBounds(currentOptions, index2) ? getPreviewText(currentOptions[index2]) : \"\";\n      };\n      ComboBoxInternal2.prototype._getMultiselectDisplayString = function(selectedIndices, currentOptions, suggestedDisplayValue) {\n        var displayValues = [];\n        for (var idx = 0; selectedIndices && idx < selectedIndices.length; idx++) {\n          var index2 = selectedIndices[idx];\n          if (currentOptions[index2].itemType !== SelectableOptionMenuItemType.SelectAll) {\n            displayValues.push(indexWithinBounds(currentOptions, index2) ? currentOptions[index2].text : normalizeToString(suggestedDisplayValue));\n          }\n        }\n        var _a2 = this.props.multiSelectDelimiter, multiSelectDelimiter = _a2 === void 0 ? \", \" : _a2;\n        return displayValues.join(multiSelectDelimiter);\n      };\n      ComboBoxInternal2.prototype._preventDismissOnScrollOrResize = function(ev) {\n        var calloutProps = this.props.calloutProps;\n        if (calloutProps === null || calloutProps === void 0 ? void 0 : calloutProps.preventDismissOnEvent) {\n          return calloutProps.preventDismissOnEvent(ev);\n        }\n        if (this._overrideScrollDismiss && (ev.type === \"scroll\" || ev.type === \"resize\")) {\n          return true;\n        }\n        return false;\n      };\n      ComboBoxInternal2.prototype._processInputChangeWithFreeform = function(updatedValue) {\n        var _this = this;\n        var currentOptions = this.props.hoisted.currentOptions;\n        var newCurrentPendingValueValidIndex = -1;\n        if (updatedValue === \"\") {\n          var items = currentOptions.map(function(item, index2) {\n            return __assign$1(__assign$1({}, item), { index: index2 });\n          }).filter(function(option) {\n            return isNormalOption(option) && !option.disabled && getPreviewText(option) === updatedValue;\n          });\n          if (items.length === 1) {\n            newCurrentPendingValueValidIndex = items[0].index;\n          }\n          this._setPendingInfo(updatedValue, newCurrentPendingValueValidIndex, updatedValue);\n          return newCurrentPendingValueValidIndex;\n        }\n        var originalUpdatedValue = updatedValue;\n        updatedValue = this._adjustForCaseSensitivity(updatedValue);\n        var newSuggestedDisplayValue = \"\";\n        if (this.props.autoComplete === \"on\") {\n          var items = currentOptions.map(function(item, index2) {\n            return __assign$1(__assign$1({}, item), { index: index2 });\n          }).filter(function(option) {\n            return isNormalOption(option) && !option.disabled && _this._adjustForCaseSensitivity(getPreviewText(option)).indexOf(updatedValue) === 0;\n          });\n          if (items.length > 0) {\n            var text2 = getPreviewText(items[0]);\n            newSuggestedDisplayValue = this._adjustForCaseSensitivity(text2) !== updatedValue ? text2 : \"\";\n            newCurrentPendingValueValidIndex = items[0].index;\n          }\n        } else {\n          var items = currentOptions.map(function(item, index2) {\n            return __assign$1(__assign$1({}, item), { index: index2 });\n          }).filter(function(option) {\n            return isNormalOption(option) && !option.disabled && _this._adjustForCaseSensitivity(getPreviewText(option)) === updatedValue;\n          });\n          if (items.length === 1) {\n            newCurrentPendingValueValidIndex = items[0].index;\n          }\n        }\n        this._setPendingInfo(originalUpdatedValue, newCurrentPendingValueValidIndex, newSuggestedDisplayValue);\n        return newCurrentPendingValueValidIndex;\n      };\n      ComboBoxInternal2.prototype._processInputChangeWithoutFreeform = function(updatedValue) {\n        var _this = this;\n        var _a2 = this.state, currentPendingValue = _a2.currentPendingValue, currentPendingValueValidIndex = _a2.currentPendingValueValidIndex;\n        if (this.props.autoComplete === \"on\") {\n          if (updatedValue !== \"\") {\n            if (this._autoCompleteTimeout) {\n              this._async.clearTimeout(this._autoCompleteTimeout);\n              this._autoCompleteTimeout = void 0;\n              updatedValue = normalizeToString(currentPendingValue) + updatedValue;\n            }\n            var matchingIndex = this._updateAutocompleteIndexWithoutFreeform(updatedValue);\n            this._autoCompleteTimeout = this._async.setTimeout(function() {\n              _this._autoCompleteTimeout = void 0;\n            }, ReadOnlyPendingAutoCompleteTimeout);\n            return matchingIndex;\n          }\n        }\n        var index2 = currentPendingValueValidIndex >= 0 ? currentPendingValueValidIndex : this._getFirstSelectedIndex();\n        this._setPendingInfoFromIndex(index2);\n        return index2;\n      };\n      ComboBoxInternal2.prototype._updateAutocompleteIndexWithoutFreeform = function(updatedValue) {\n        var _this = this;\n        var currentOptions = this.props.hoisted.currentOptions;\n        var originalUpdatedValue = updatedValue;\n        updatedValue = this._adjustForCaseSensitivity(updatedValue);\n        var items = currentOptions.map(function(item, i) {\n          return __assign$1(__assign$1({}, item), { index: i });\n        }).filter(function(option) {\n          return isNormalOption(option) && !option.disabled && _this._adjustForCaseSensitivity(option.text).indexOf(updatedValue) === 0;\n        });\n        if (items.length > 0) {\n          this._setPendingInfo(originalUpdatedValue, items[0].index, getPreviewText(items[0]));\n          return items[0].index;\n        }\n        return -1;\n      };\n      ComboBoxInternal2.prototype._getFirstSelectedIndex = function() {\n        var selectedIndices = this.props.hoisted.selectedIndices;\n        return (selectedIndices === null || selectedIndices === void 0 ? void 0 : selectedIndices.length) ? selectedIndices[0] : -1;\n      };\n      ComboBoxInternal2.prototype._getNextSelectableIndex = function(index2, searchDirection) {\n        var currentOptions = this.props.hoisted.currentOptions;\n        var newIndex = index2 + searchDirection;\n        newIndex = Math.max(0, Math.min(currentOptions.length - 1, newIndex));\n        if (!indexWithinBounds(currentOptions, newIndex)) {\n          return -1;\n        }\n        var option = currentOptions[newIndex];\n        if (!isSelectableOption(option) || option.hidden === true) {\n          if (searchDirection !== SearchDirection.none && (newIndex > 0 && searchDirection < SearchDirection.none || newIndex >= 0 && newIndex < currentOptions.length && searchDirection > SearchDirection.none)) {\n            newIndex = this._getNextSelectableIndex(newIndex, searchDirection);\n          } else {\n            return index2;\n          }\n        }\n        return newIndex;\n      };\n      ComboBoxInternal2.prototype._setSelectedIndex = function(index2, submitPendingValueEvent, searchDirection) {\n        if (searchDirection === void 0) {\n          searchDirection = SearchDirection.none;\n        }\n        var _a2 = this.props, onChange = _a2.onChange, onPendingValueChanged = _a2.onPendingValueChanged, _b2 = _a2.hoisted, initialIndices = _b2.selectedIndices, currentOptions = _b2.currentOptions;\n        var selectedIndices = initialIndices ? initialIndices.slice() : [];\n        var changedOptions = currentOptions.slice();\n        index2 = this._getNextSelectableIndex(index2, searchDirection);\n        if (!indexWithinBounds(currentOptions, index2)) {\n          return;\n        }\n        if (this.props.multiSelect || selectedIndices.length < 1 || selectedIndices.length === 1 && selectedIndices[0] !== index2) {\n          var option = __assign$1({}, currentOptions[index2]);\n          if (!option || option.disabled) {\n            return;\n          }\n          if (this.props.multiSelect) {\n            option.selected = option.selected !== void 0 ? !option.selected : selectedIndices.indexOf(index2) < 0;\n            if (option.itemType === SelectableOptionMenuItemType.SelectAll) {\n              selectedIndices = [];\n              if (option.selected) {\n                currentOptions.forEach(function(currentOption, i) {\n                  if (!currentOption.disabled && isSelectableOption(currentOption)) {\n                    selectedIndices.push(i);\n                    changedOptions[i] = __assign$1(__assign$1({}, currentOption), { selected: true });\n                  }\n                });\n              } else {\n                changedOptions = currentOptions.map(function(currentOption) {\n                  return __assign$1(__assign$1({}, currentOption), { selected: false });\n                });\n              }\n            } else {\n              if (option.selected && selectedIndices.indexOf(index2) < 0) {\n                selectedIndices.push(index2);\n              } else if (!option.selected && selectedIndices.indexOf(index2) >= 0) {\n                selectedIndices = selectedIndices.filter(function(value2) {\n                  return value2 !== index2;\n                });\n              }\n              changedOptions[index2] = option;\n              var selectAllOption = changedOptions.filter(function(o) {\n                return o.itemType === SelectableOptionMenuItemType.SelectAll;\n              })[0];\n              if (selectAllOption) {\n                var selectAllState = this._isSelectAllChecked(selectedIndices);\n                var selectAllIndex_1 = changedOptions.indexOf(selectAllOption);\n                if (selectAllState) {\n                  selectedIndices.push(selectAllIndex_1);\n                  changedOptions[selectAllIndex_1] = __assign$1(__assign$1({}, selectAllOption), { selected: true });\n                } else {\n                  selectedIndices = selectedIndices.filter(function(value2) {\n                    return value2 !== selectAllIndex_1;\n                  });\n                  changedOptions[selectAllIndex_1] = __assign$1(__assign$1({}, selectAllOption), { selected: false });\n                }\n              }\n            }\n          } else {\n            selectedIndices[0] = index2;\n          }\n          submitPendingValueEvent.persist();\n          if (this.props.selectedKey || this.props.selectedKey === null) {\n            if (this._hasPendingValue && onPendingValueChanged) {\n              onPendingValueChanged();\n              this._hasPendingValue = false;\n            }\n          } else {\n            this.props.hoisted.setSelectedIndices(selectedIndices);\n            this.props.hoisted.setCurrentOptions(changedOptions);\n            if (this._hasPendingValue && onPendingValueChanged) {\n              onPendingValueChanged();\n              this._hasPendingValue = false;\n            }\n          }\n          if (onChange) {\n            onChange(submitPendingValueEvent, option, index2, getPreviewText(option));\n          }\n        }\n        if (this.props.multiSelect && this.state.isOpen) {\n          return;\n        }\n        this._clearPendingInfo();\n      };\n      ComboBoxInternal2.prototype._submitPendingValue = function(submitPendingValueEvent) {\n        var _a2;\n        var _b2 = this.props, onChange = _b2.onChange, allowFreeform = _b2.allowFreeform, autoComplete = _b2.autoComplete, multiSelect = _b2.multiSelect, hoisted = _b2.hoisted;\n        var currentOptions = hoisted.currentOptions;\n        var _c2 = this.state, currentPendingValue = _c2.currentPendingValue, currentPendingValueValidIndex = _c2.currentPendingValueValidIndex, currentPendingValueValidIndexOnHover = _c2.currentPendingValueValidIndexOnHover;\n        var selectedIndices = this.props.hoisted.selectedIndices;\n        if (this._processingClearPendingInfo) {\n          return;\n        }\n        if (allowFreeform) {\n          if (currentPendingValue === null || currentPendingValue === void 0) {\n            if (currentPendingValueValidIndexOnHover >= 0) {\n              this._setSelectedIndex(currentPendingValueValidIndexOnHover, submitPendingValueEvent);\n              this._clearPendingInfo();\n            }\n            return;\n          }\n          if (indexWithinBounds(currentOptions, currentPendingValueValidIndex)) {\n            var pendingOptionText = this._adjustForCaseSensitivity(getPreviewText(currentOptions[currentPendingValueValidIndex]));\n            var autofill = this._autofill.current;\n            var adjustedCurrentPendingValue = this._adjustForCaseSensitivity(currentPendingValue);\n            if (adjustedCurrentPendingValue === pendingOptionText || autoComplete && pendingOptionText.indexOf(adjustedCurrentPendingValue) === 0 && (autofill === null || autofill === void 0 ? void 0 : autofill.isValueSelected) && currentPendingValue.length + (autofill.selectionEnd - autofill.selectionStart) === pendingOptionText.length || ((_a2 = autofill === null || autofill === void 0 ? void 0 : autofill.inputElement) === null || _a2 === void 0 ? void 0 : _a2.value) !== void 0 && this._adjustForCaseSensitivity(autofill.inputElement.value) === pendingOptionText) {\n              this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent);\n              if (multiSelect && this.state.isOpen) {\n                return;\n              }\n              this._clearPendingInfo();\n              return;\n            }\n          }\n          if (onChange) {\n            if (onChange) {\n              onChange(submitPendingValueEvent, void 0, void 0, currentPendingValue);\n            }\n          } else {\n            var newOption = {\n              key: currentPendingValue || getId(),\n              text: normalizeToString(currentPendingValue)\n            };\n            if (multiSelect) {\n              newOption.selected = true;\n            }\n            var newOptions = currentOptions.concat([newOption]);\n            if (selectedIndices) {\n              if (!multiSelect) {\n                selectedIndices = [];\n              }\n              selectedIndices.push(newOptions.length - 1);\n            }\n            hoisted.setCurrentOptions(newOptions);\n            hoisted.setSelectedIndices(selectedIndices);\n          }\n        } else if (currentPendingValueValidIndex >= 0) {\n          this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent);\n        } else if (currentPendingValueValidIndexOnHover >= 0) {\n          this._setSelectedIndex(currentPendingValueValidIndexOnHover, submitPendingValueEvent);\n        }\n        this._clearPendingInfo();\n      };\n      ComboBoxInternal2.prototype._onCalloutLayerMounted = function() {\n        this._gotMouseMove = false;\n      };\n      ComboBoxInternal2.prototype._renderSeparator = function(item) {\n        var index2 = item.index, key2 = item.key;\n        if (index2 && index2 > 0) {\n          return React__namespace.createElement(\"div\", { role: \"presentation\", key: key2, className: this._classNames.divider });\n        }\n        return null;\n      };\n      ComboBoxInternal2.prototype._renderHeader = function(item) {\n        var _a2 = this.props.onRenderOption, onRenderOption = _a2 === void 0 ? this._onRenderOptionContent : _a2;\n        return React__namespace.createElement(\"div\", { id: item.id, key: item.key, className: this._classNames.header }, onRenderOption(item, this._onRenderOptionContent));\n      };\n      ComboBoxInternal2.prototype._renderCheckboxLabel = function(item) {\n        var _a2 = this.props.onRenderOption, onRenderOption = _a2 === void 0 ? this._onRenderMultiselectOptionContent : _a2;\n        return onRenderOption(item, this._onRenderMultiselectOptionContent);\n      };\n      ComboBoxInternal2.prototype._isOptionHighlighted = function(index2) {\n        var currentPendingValueValidIndexOnHover = this.state.currentPendingValueValidIndexOnHover;\n        if (currentPendingValueValidIndexOnHover === HoverStatus.clearAll) {\n          return false;\n        }\n        return currentPendingValueValidIndexOnHover >= 0 ? currentPendingValueValidIndexOnHover === index2 : this._isOptionSelected(index2);\n      };\n      ComboBoxInternal2.prototype._isOptionSelected = function(index2) {\n        return this._getPendingSelectedIndex(\n          true\n          /* includePendingValue */\n        ) === index2;\n      };\n      ComboBoxInternal2.prototype._isOptionChecked = function(index2) {\n        if (this.props.multiSelect && index2 !== void 0 && this.props.hoisted.selectedIndices) {\n          var idxOfSelectedIndex = -1;\n          idxOfSelectedIndex = this.props.hoisted.selectedIndices.indexOf(index2);\n          return idxOfSelectedIndex >= 0;\n        }\n        return false;\n      };\n      ComboBoxInternal2.prototype._isOptionIndeterminate = function(index2) {\n        var _a2 = this.props, multiSelect = _a2.multiSelect, hoisted = _a2.hoisted;\n        if (multiSelect && index2 !== void 0 && hoisted.selectedIndices && hoisted.currentOptions) {\n          var option = hoisted.currentOptions[index2];\n          if (option && option.itemType === SelectableOptionMenuItemType.SelectAll) {\n            return hoisted.selectedIndices.length > 0 && !this._isSelectAllChecked();\n          }\n        }\n        return false;\n      };\n      ComboBoxInternal2.prototype._isSelectAllChecked = function(testIndices) {\n        var _a2 = this.props, multiSelect = _a2.multiSelect, hoisted = _a2.hoisted;\n        var selectAllOption = hoisted.currentOptions.find(function(option) {\n          return option.itemType === SelectableOptionMenuItemType.SelectAll;\n        });\n        var selectedIndices = testIndices || hoisted.selectedIndices;\n        if (!multiSelect || !selectedIndices || !selectAllOption) {\n          return false;\n        }\n        var selectAllIndex = hoisted.currentOptions.indexOf(selectAllOption);\n        var compareSelectedIndices = selectedIndices.filter(function(value2) {\n          return value2 !== selectAllIndex;\n        });\n        var selectableOptions = hoisted.currentOptions.filter(function(option) {\n          return !option.disabled && option.itemType !== SelectableOptionMenuItemType.SelectAll && isSelectableOption(option);\n        });\n        return compareSelectedIndices.length === selectableOptions.length;\n      };\n      ComboBoxInternal2.prototype._getPendingSelectedIndex = function(includeCurrentPendingValue) {\n        var _a2 = this.state, currentPendingValueValidIndex = _a2.currentPendingValueValidIndex, currentPendingValue = _a2.currentPendingValue;\n        return currentPendingValueValidIndex >= 0 || includeCurrentPendingValue && currentPendingValue !== null && currentPendingValue !== void 0 ? currentPendingValueValidIndex : this.props.multiSelect ? -1 : this._getFirstSelectedIndex();\n      };\n      ComboBoxInternal2.prototype._scrollIntoView = function() {\n        var _a2 = this.props, onScrollToItem = _a2.onScrollToItem, scrollSelectedToTop = _a2.scrollSelectedToTop;\n        var currentPendingSelectedIndex = this._getPendingSelectedIndex(true);\n        if (onScrollToItem) {\n          onScrollToItem(currentPendingSelectedIndex >= 0 ? currentPendingSelectedIndex : this._getFirstSelectedIndex());\n          return;\n        }\n        var scrollToElement = this._selectedElement.current;\n        if (this.props.multiSelect && this._comboBoxMenu.current) {\n          scrollToElement = findFirstDescendant(this._comboBoxMenu.current, function(element2) {\n            var _a3;\n            return ((_a3 = element2.dataset) === null || _a3 === void 0 ? void 0 : _a3.index) === currentPendingSelectedIndex.toString();\n          });\n        }\n        if (scrollToElement && scrollToElement.offsetParent) {\n          var alignToTop = true;\n          if (this._comboBoxMenu.current && this._comboBoxMenu.current.offsetParent) {\n            var scrollableParent = this._comboBoxMenu.current.offsetParent;\n            var selectedElement = scrollToElement.offsetParent;\n            var _b2 = selectedElement, offsetHeight = _b2.offsetHeight, offsetTop = _b2.offsetTop;\n            var _c2 = scrollableParent, parentOffsetHeight = _c2.offsetHeight, scrollTop = _c2.scrollTop;\n            var isAbove = offsetTop < scrollTop;\n            var isBelow = offsetTop + offsetHeight > scrollTop + parentOffsetHeight;\n            if (isAbove || scrollSelectedToTop) {\n              alignToTop = false;\n              scrollableParent.scrollTo(0, offsetTop);\n            } else if (isBelow) {\n              scrollableParent.scrollTo(0, offsetTop - parentOffsetHeight + offsetHeight);\n            }\n          } else {\n            scrollToElement.offsetParent.scrollIntoView(alignToTop);\n          }\n        }\n      };\n      ComboBoxInternal2.prototype._onItemClick = function(item) {\n        var _this = this;\n        var onItemClick = this.props.onItemClick;\n        var index2 = item.index;\n        return function(ev) {\n          if (!_this.props.multiSelect) {\n            _this._autofill.current && _this._autofill.current.focus();\n            _this.setState({\n              isOpen: false\n            });\n          }\n          onItemClick && onItemClick(ev, item, index2);\n          _this._setSelectedIndex(index2, ev);\n        };\n      };\n      ComboBoxInternal2.prototype._resetSelectedIndex = function() {\n        var currentOptions = this.props.hoisted.currentOptions;\n        this._clearPendingInfo();\n        var selectedIndex = this._getFirstSelectedIndex();\n        if (selectedIndex > 0 && selectedIndex < currentOptions.length) {\n          this.props.hoisted.setSuggestedDisplayValue(currentOptions[selectedIndex].text);\n        } else if (this.props.text) {\n          this.props.hoisted.setSuggestedDisplayValue(this.props.text);\n        }\n      };\n      ComboBoxInternal2.prototype._clearPendingInfo = function() {\n        this._processingClearPendingInfo = true;\n        this.props.hoisted.setSuggestedDisplayValue(void 0);\n        this.setState({\n          currentPendingValue: void 0,\n          currentPendingValueValidIndex: -1,\n          currentPendingValueValidIndexOnHover: HoverStatus.default\n        }, this._onAfterClearPendingInfo);\n      };\n      ComboBoxInternal2.prototype._setPendingInfo = function(currentPendingValue, currentPendingValueValidIndex, suggestedDisplayValue) {\n        if (currentPendingValueValidIndex === void 0) {\n          currentPendingValueValidIndex = -1;\n        }\n        if (this._processingClearPendingInfo) {\n          return;\n        }\n        this.props.hoisted.setSuggestedDisplayValue(suggestedDisplayValue);\n        this.setState({\n          currentPendingValue: normalizeToString(currentPendingValue),\n          currentPendingValueValidIndex,\n          currentPendingValueValidIndexOnHover: HoverStatus.default\n        });\n      };\n      ComboBoxInternal2.prototype._setPendingInfoFromIndex = function(index2) {\n        var currentOptions = this.props.hoisted.currentOptions;\n        if (index2 >= 0 && index2 < currentOptions.length) {\n          var option = currentOptions[index2];\n          this._setPendingInfo(getPreviewText(option), index2, getPreviewText(option));\n        } else {\n          this._clearPendingInfo();\n        }\n      };\n      ComboBoxInternal2.prototype._setPendingInfoFromIndexAndDirection = function(index2, searchDirection) {\n        var currentOptions = this.props.hoisted.currentOptions;\n        if (searchDirection === SearchDirection.forward && index2 >= currentOptions.length - 1) {\n          index2 = -1;\n        } else if (searchDirection === SearchDirection.backward && index2 <= 0) {\n          index2 = currentOptions.length;\n        }\n        var indexUpdate = this._getNextSelectableIndex(index2, searchDirection);\n        if (index2 === indexUpdate) {\n          if (searchDirection === SearchDirection.forward) {\n            index2 = this._getNextSelectableIndex(-1, searchDirection);\n          } else if (searchDirection === SearchDirection.backward) {\n            index2 = this._getNextSelectableIndex(currentOptions.length, searchDirection);\n          }\n        } else {\n          index2 = indexUpdate;\n        }\n        if (indexWithinBounds(currentOptions, index2)) {\n          this._setPendingInfoFromIndex(index2);\n        }\n      };\n      ComboBoxInternal2.prototype._notifyPendingValueChanged = function(prevState) {\n        var onPendingValueChanged = this.props.onPendingValueChanged;\n        if (!onPendingValueChanged) {\n          return;\n        }\n        var currentOptions = this.props.hoisted.currentOptions;\n        var _a2 = this.state, currentPendingValue = _a2.currentPendingValue, currentPendingValueValidIndex = _a2.currentPendingValueValidIndex, currentPendingValueValidIndexOnHover = _a2.currentPendingValueValidIndexOnHover;\n        var newPendingIndex = void 0;\n        var newPendingValue = void 0;\n        if (currentPendingValueValidIndexOnHover !== prevState.currentPendingValueValidIndexOnHover && indexWithinBounds(currentOptions, currentPendingValueValidIndexOnHover)) {\n          newPendingIndex = currentPendingValueValidIndexOnHover;\n        } else if (currentPendingValueValidIndex !== prevState.currentPendingValueValidIndex && indexWithinBounds(currentOptions, currentPendingValueValidIndex)) {\n          newPendingIndex = currentPendingValueValidIndex;\n        } else if (currentPendingValue !== prevState.currentPendingValue) {\n          newPendingValue = currentPendingValue;\n        }\n        if (newPendingIndex !== void 0 || newPendingValue !== void 0 || this._hasPendingValue) {\n          onPendingValueChanged(newPendingIndex !== void 0 ? currentOptions[newPendingIndex] : void 0, newPendingIndex, newPendingValue);\n          this._hasPendingValue = newPendingIndex !== void 0 || newPendingValue !== void 0;\n        }\n      };\n      ComboBoxInternal2.prototype._setOpenStateAndFocusOnClose = function(isOpen, focusInputAfterClose) {\n        this._focusInputAfterClose = focusInputAfterClose;\n        this.setState({ isOpen });\n      };\n      ComboBoxInternal2.prototype._onOptionMouseEnter = function(index2) {\n        if (this._shouldIgnoreMouseEvent()) {\n          return;\n        }\n        this.setState({\n          currentPendingValueValidIndexOnHover: index2\n        });\n      };\n      ComboBoxInternal2.prototype._onOptionMouseMove = function(index2) {\n        this._gotMouseMove = true;\n        if (!this._isScrollIdle || this.state.currentPendingValueValidIndexOnHover === index2) {\n          return;\n        }\n        this.setState({\n          currentPendingValueValidIndexOnHover: index2\n        });\n      };\n      ComboBoxInternal2.prototype._shouldIgnoreMouseEvent = function() {\n        return !this._isScrollIdle || !this._gotMouseMove;\n      };\n      ComboBoxInternal2.prototype._handleInputWhenDisabled = function(ev) {\n        if (this.props.disabled) {\n          if (this.state.isOpen) {\n            this.setState({ isOpen: false });\n          }\n          if (ev !== null && // eslint-disable-next-line @typescript-eslint/no-deprecated\n          ev.which !== KeyCodes.tab && // eslint-disable-next-line @typescript-eslint/no-deprecated\n          ev.which !== KeyCodes.escape && // eslint-disable-next-line @typescript-eslint/no-deprecated\n          (ev.which < 112 || ev.which > 123)) {\n            ev.stopPropagation();\n            ev.preventDefault();\n          }\n        }\n      };\n      ComboBoxInternal2.prototype._handleTouchAndPointerEvent = function() {\n        var _this = this;\n        if (this._lastTouchTimeoutId !== void 0) {\n          this._async.clearTimeout(this._lastTouchTimeoutId);\n          this._lastTouchTimeoutId = void 0;\n        }\n        this._processingTouch = true;\n        this._lastTouchTimeoutId = this._async.setTimeout(function() {\n          _this._processingTouch = false;\n          _this._lastTouchTimeoutId = void 0;\n        }, TouchIdleDelay);\n      };\n      ComboBoxInternal2.prototype._getCaretButtonStyles = function() {\n        var customCaretDownButtonStyles = this.props.caretDownButtonStyles;\n        return getCaretDownButtonStyles(this.props.theme, customCaretDownButtonStyles);\n      };\n      ComboBoxInternal2.prototype._getCurrentOptionStyles = function(item) {\n        var _a2;\n        var customStylesForAllOptions = this.props.comboBoxOptionStyles;\n        var customStylesForCurrentOption = item.styles;\n        var optionStyles = getOptionStyles(this.props.theme, customStylesForAllOptions, customStylesForCurrentOption, this._isPendingOption(item), item.hidden, this._isOptionHighlighted(item.index));\n        optionStyles.__shadowConfig__ = (_a2 = this.props.styles) === null || _a2 === void 0 ? void 0 : _a2.__shadowConfig__;\n        return optionStyles;\n      };\n      ComboBoxInternal2.prototype._getAriaAutoCompleteValue = function() {\n        var autoComplete = !this.props.disabled && this.props.autoComplete === \"on\";\n        return autoComplete ? this.props.allowFreeform ? \"inline\" : \"both\" : \"list\";\n      };\n      ComboBoxInternal2.prototype._isPendingOption = function(item) {\n        return item && item.index === this.state.currentPendingValueValidIndex;\n      };\n      ComboBoxInternal2.prototype._hasFocus = function() {\n        return this.state.focusState !== \"none\";\n      };\n      ComboBoxInternal2.prototype._adjustForCaseSensitivity = function(text2) {\n        return this.props.caseSensitive ? text2 : text2.toLowerCase();\n      };\n      ComboBoxInternal2.contextType = WindowContext;\n      ComboBoxInternal2 = __decorate([\n        customizable(\"ComboBox\", [\"theme\", \"styles\"])\n      ], ComboBoxInternal2);\n      return ComboBoxInternal2;\n    })(React__namespace.Component)\n  );\n  function getSelectedIndices(options2, selectedKeys) {\n    if (!options2 || !selectedKeys) {\n      return [];\n    }\n    var selectedIndices = {};\n    options2.forEach(function(option, index2) {\n      if (option.selected) {\n        selectedIndices[index2] = true;\n      }\n    });\n    var _loop_1 = function(selectedKey2) {\n      var index2 = findIndex(options2, function(option) {\n        return option.key === selectedKey2;\n      });\n      if (index2 > -1) {\n        selectedIndices[index2] = true;\n      }\n    };\n    for (var _i = 0, selectedKeys_1 = selectedKeys; _i < selectedKeys_1.length; _i++) {\n      var selectedKey = selectedKeys_1[_i];\n      _loop_1(selectedKey);\n    }\n    return Object.keys(selectedIndices).map(Number).sort();\n  }\n  function buildDefaultSelectedKeys(defaultSelectedKey, selectedKey) {\n    var selectedKeys = buildSelectedKeys(defaultSelectedKey);\n    if (selectedKeys.length) {\n      return selectedKeys;\n    }\n    return buildSelectedKeys(selectedKey);\n  }\n  function buildSelectedKeys(selectedKey) {\n    if (selectedKey === void 0) {\n      return [];\n    }\n    return selectedKey instanceof Array ? selectedKey : [selectedKey];\n  }\n  function normalizeToString(value2) {\n    return value2 || \"\";\n  }\n  function indexWithinBounds(options2, index2) {\n    return !!options2 && index2 >= 0 && index2 < options2.length;\n  }\n  function isNormalOption(option) {\n    return option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider && option.itemType !== SelectableOptionMenuItemType.SelectAll;\n  }\n  function isSelectableOption(option) {\n    return option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider;\n  }\n  function getPreviewText(item) {\n    return item.useAriaLabelAsText && item.ariaLabel ? item.ariaLabel : item.text;\n  }\n  function isAltOrMeta(ev) {\n    return ev.which === KeyCodes.alt || ev.key === \"Meta\";\n  }\n  var COMMAND_BAR_HEIGHT = 44;\n  var getStyles$e = function(props) {\n    var className2 = props.className, theme = props.theme;\n    var semanticColors = theme.semanticColors;\n    return {\n      root: [\n        theme.fonts.medium,\n        \"ms-CommandBar\",\n        {\n          display: \"flex\",\n          backgroundColor: semanticColors.bodyBackground,\n          padding: \"0 14px 0 24px\",\n          height: COMMAND_BAR_HEIGHT\n        },\n        className2\n      ],\n      primarySet: [\n        \"ms-CommandBar-primaryCommand\",\n        {\n          flexGrow: \"1\",\n          display: \"flex\",\n          alignItems: \"stretch\"\n        }\n      ],\n      secondarySet: [\n        \"ms-CommandBar-secondaryCommand\",\n        {\n          flexShrink: \"0\",\n          display: \"flex\",\n          alignItems: \"stretch\"\n        }\n      ]\n    };\n  };\n  var getCommandButtonStyles = memoizeFunction(function(customStyles) {\n    var rootStyles = {\n      height: \"100%\"\n    };\n    var labelStyles = {\n      whiteSpace: \"nowrap\"\n    };\n    var _a2 = customStyles || {}, root = _a2.root, label2 = _a2.label, restCustomStyles = __rest(_a2, [\"root\", \"label\"]);\n    return __assign$1(__assign$1({}, restCustomStyles), { root: root ? [rootStyles, root] : rootStyles, label: label2 ? [labelStyles, label2] : labelStyles });\n  });\n  var registerPersistedKeytips = function(keytipsToRegister, keytipManager, registeredPersistedKeytips) {\n    for (var _i = 0, keytipsToRegister_1 = keytipsToRegister; _i < keytipsToRegister_1.length; _i++) {\n      var keytip = keytipsToRegister_1[_i];\n      var uniqueID = keytipManager.register(keytip, true);\n      registeredPersistedKeytips[uniqueID] = keytip;\n    }\n  };\n  var unregisterPersistedKeytips = function(keytipManager, registeredPersistedKeytips) {\n    for (var _i = 0, _a2 = Object.keys(registeredPersistedKeytips); _i < _a2.length; _i++) {\n      var uniqueID = _a2[_i];\n      keytipManager.unregister(registeredPersistedKeytips[uniqueID], uniqueID, true);\n      delete registeredPersistedKeytips[uniqueID];\n    }\n  };\n  var useKeytipRegistrations = function(registeredPersistedKeytips, keytipsToRegister, keytipManager) {\n    var prevPersistedKeytips = usePrevious(registeredPersistedKeytips);\n    React__namespace.useEffect(function() {\n      if (prevPersistedKeytips) {\n        unregisterPersistedKeytips(keytipManager, prevPersistedKeytips);\n        registerPersistedKeytips(keytipsToRegister, keytipManager, registeredPersistedKeytips);\n      }\n    });\n    React__namespace.useEffect(function() {\n      registerPersistedKeytips(keytipsToRegister, keytipManager, registeredPersistedKeytips);\n      return function() {\n        unregisterPersistedKeytips(keytipManager, registeredPersistedKeytips);\n      };\n    }, []);\n  };\n  var OverflowButton = function(props) {\n    var keytipManager = KeytipManager.getInstance();\n    var className2 = props.className, overflowItems = props.overflowItems, keytipSequences = props.keytipSequences, itemSubMenuProvider = props.itemSubMenuProvider, onRenderOverflowButton = props.onRenderOverflowButton;\n    var persistedKeytips = useConst({});\n    var getSubMenuForItem = React__namespace.useCallback(function(item) {\n      if (itemSubMenuProvider) {\n        return itemSubMenuProvider(item);\n      }\n      if (item.subMenuProps) {\n        return item.subMenuProps.items;\n      }\n      return void 0;\n    }, [itemSubMenuProvider]);\n    var _a2 = React__namespace.useMemo(function() {\n      var newKeytipsToRegister = [];\n      var newOverflowItems = [];\n      if (keytipSequences) {\n        overflowItems === null || overflowItems === void 0 ? void 0 : overflowItems.forEach(function(overflowItem) {\n          var _a3;\n          var keytip = overflowItem.keytipProps;\n          if (keytip) {\n            var persistedKeytip = {\n              content: keytip.content,\n              keySequences: keytip.keySequences,\n              disabled: keytip.disabled || !!(overflowItem.disabled || overflowItem.isDisabled),\n              hasDynamicChildren: keytip.hasDynamicChildren,\n              hasMenu: keytip.hasMenu\n            };\n            if (keytip.hasDynamicChildren || getSubMenuForItem(overflowItem)) {\n              persistedKeytip.onExecute = keytipManager.menuExecute.bind(keytipManager, keytipSequences, (_a3 = overflowItem === null || overflowItem === void 0 ? void 0 : overflowItem.keytipProps) === null || _a3 === void 0 ? void 0 : _a3.keySequences);\n              persistedKeytip.hasOverflowSubMenu = true;\n            } else {\n              persistedKeytip.onExecute = keytip.onExecute;\n            }\n            newKeytipsToRegister.push(persistedKeytip);\n            var newOverflowItem = __assign$1(__assign$1({}, overflowItem), { keytipProps: __assign$1(__assign$1({}, keytip), { overflowSetSequence: keytipSequences }) });\n            newOverflowItems === null || newOverflowItems === void 0 ? void 0 : newOverflowItems.push(newOverflowItem);\n          } else {\n            newOverflowItems === null || newOverflowItems === void 0 ? void 0 : newOverflowItems.push(overflowItem);\n          }\n        });\n      } else {\n        newOverflowItems = overflowItems;\n      }\n      return { modifiedOverflowItems: newOverflowItems, keytipsToRegister: newKeytipsToRegister };\n    }, [overflowItems, getSubMenuForItem, keytipManager, keytipSequences]), modifiedOverflowItems = _a2.modifiedOverflowItems, keytipsToRegister = _a2.keytipsToRegister;\n    useKeytipRegistrations(persistedKeytips, keytipsToRegister, keytipManager);\n    return React__namespace.createElement(\"div\", { className: className2 }, onRenderOverflowButton(modifiedOverflowItems));\n  };\n  var getClassNames$f = classNamesFunction();\n  var COMPONENT_NAME$3 = \"OverflowSet\";\n  var useComponentRef$3 = function(props, divContainer) {\n    var doc = useDocumentEx();\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        focus: function(_forceIntoFirstElement, bypassHiddenElements) {\n          var focusSucceeded = false;\n          if (divContainer.current) {\n            focusSucceeded = focusFirstChild(divContainer.current, bypassHiddenElements);\n          }\n          return focusSucceeded;\n        },\n        focusElement: function(childElement) {\n          var focusSucceeded = false;\n          if (!childElement) {\n            return false;\n          }\n          if (divContainer.current && elementContains(divContainer.current, childElement)) {\n            childElement.focus();\n            focusSucceeded = (doc === null || doc === void 0 ? void 0 : doc.activeElement) === childElement;\n          }\n          return focusSucceeded;\n        }\n      };\n    }, [divContainer, doc]);\n  };\n  var OverflowSetBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var divContainer = React__namespace.useRef(null);\n    var mergedRef = useMergedRefs(divContainer, forwardedRef);\n    useComponentRef$3(props, divContainer);\n    var items = props.items, overflowItems = props.overflowItems, className2 = props.className, styles = props.styles, vertical = props.vertical, role = props.role, _a2 = props.overflowSide, overflowSide = _a2 === void 0 ? \"end\" : _a2, onRenderItem = props.onRenderItem;\n    var classNames2 = getClassNames$f(styles, { className: className2, vertical });\n    var showOverflow = !!overflowItems && overflowItems.length > 0;\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({}, getNativeProps(props, divProperties), { role: role || \"group\", \"aria-orientation\": role === \"menubar\" ? vertical === true ? \"vertical\" : \"horizontal\" : void 0, className: classNames2.root, ref: mergedRef }),\n      overflowSide === \"start\" && showOverflow && React__namespace.createElement(OverflowButton, __assign$1({}, props, { className: classNames2.overflowButton })),\n      items && items.map(function(item, i) {\n        return React__namespace.createElement(\"div\", { className: classNames2.item, key: item.key, role: \"none\" }, onRenderItem(item));\n      }),\n      overflowSide === \"end\" && showOverflow && React__namespace.createElement(OverflowButton, __assign$1({}, props, { className: classNames2.overflowButton }))\n    );\n  });\n  OverflowSetBase.displayName = COMPONENT_NAME$3;\n  var overflowItemStyle = {\n    flexShrink: 0,\n    display: \"inherit\"\n  };\n  var getStyles$d = function(props) {\n    var className2 = props.className, vertical = props.vertical;\n    return {\n      root: [\n        \"ms-OverflowSet\",\n        {\n          position: \"relative\",\n          display: \"flex\",\n          flexWrap: \"nowrap\"\n        },\n        vertical && { flexDirection: \"column\" },\n        className2\n      ],\n      item: [\"ms-OverflowSet-item\", overflowItemStyle],\n      overflowButton: [\"ms-OverflowSet-overflowButton\", overflowItemStyle]\n    };\n  };\n  var OverflowSet = styled(OverflowSetBase, getStyles$d, void 0, {\n    scope: \"OverflowSet\"\n  });\n  var ResizeGroupDirection;\n  (function(ResizeGroupDirection2) {\n    ResizeGroupDirection2[ResizeGroupDirection2[\"horizontal\"] = 0] = \"horizontal\";\n    ResizeGroupDirection2[ResizeGroupDirection2[\"vertical\"] = 1] = \"vertical\";\n  })(ResizeGroupDirection || (ResizeGroupDirection = {}));\n  var RESIZE_DELAY = 16;\n  var getMeasurementCache = function() {\n    var measurementsCache = {};\n    return {\n      /**\n       * Checks if the provided data has a cacheKey. If it has a cacheKey and there is a\n       * corresponding entry in the measurementsCache, then it will return that value.\n       * Returns undefined otherwise.\n       */\n      getCachedMeasurement: function(data2) {\n        if (data2 && data2.cacheKey && measurementsCache.hasOwnProperty(data2.cacheKey)) {\n          return measurementsCache[data2.cacheKey];\n        }\n        return void 0;\n      },\n      /**\n       * Should be called whenever there is a new measurement associated with a given data object.\n       * If the data has a cacheKey, store that measurement in the measurementsCache.\n       */\n      addMeasurementToCache: function(data2, measurement) {\n        if (data2.cacheKey) {\n          measurementsCache[data2.cacheKey] = measurement;\n        }\n      }\n    };\n  };\n  var getNextResizeGroupStateProvider = function(measurementCache) {\n    if (measurementCache === void 0) {\n      measurementCache = getMeasurementCache();\n    }\n    var _measurementCache = measurementCache;\n    var _containerDimension;\n    function _getMeasuredDimension(measuredData, getElementToMeasureDimension) {\n      var cachedDimension = _measurementCache.getCachedMeasurement(measuredData);\n      if (cachedDimension !== void 0) {\n        return cachedDimension;\n      }\n      var measuredDimension = getElementToMeasureDimension();\n      _measurementCache.addMeasurementToCache(measuredData, measuredDimension);\n      return measuredDimension;\n    }\n    function _shrinkContentsUntilTheyFit(data2, onReduceData, getElementToMeasureDimension) {\n      var dataToMeasure = data2;\n      var measuredDimension = _getMeasuredDimension(data2, getElementToMeasureDimension);\n      while (measuredDimension > _containerDimension) {\n        var nextMeasuredData = onReduceData(dataToMeasure);\n        if (nextMeasuredData === void 0) {\n          return {\n            renderedData: dataToMeasure,\n            resizeDirection: void 0,\n            dataToMeasure: void 0\n          };\n        }\n        measuredDimension = _measurementCache.getCachedMeasurement(nextMeasuredData);\n        if (measuredDimension === void 0) {\n          return {\n            dataToMeasure: nextMeasuredData,\n            resizeDirection: \"shrink\"\n          };\n        }\n        dataToMeasure = nextMeasuredData;\n      }\n      return {\n        renderedData: dataToMeasure,\n        resizeDirection: void 0,\n        dataToMeasure: void 0\n      };\n    }\n    function _growDataUntilItDoesNotFit(data2, onGrowData, getElementToMeasureDimension, onReduceData) {\n      var dataToMeasure = data2;\n      var measuredDimension = _getMeasuredDimension(data2, getElementToMeasureDimension);\n      while (measuredDimension < _containerDimension) {\n        var nextMeasuredData = onGrowData(dataToMeasure);\n        if (nextMeasuredData === void 0) {\n          return {\n            renderedData: dataToMeasure,\n            resizeDirection: void 0,\n            dataToMeasure: void 0\n          };\n        }\n        measuredDimension = _measurementCache.getCachedMeasurement(nextMeasuredData);\n        if (measuredDimension === void 0) {\n          return {\n            dataToMeasure: nextMeasuredData\n          };\n        }\n        dataToMeasure = nextMeasuredData;\n      }\n      return __assign$1({ resizeDirection: \"shrink\" }, _shrinkContentsUntilTheyFit(dataToMeasure, onReduceData, getElementToMeasureDimension));\n    }\n    function _updateContainerDimension(newDimension, fullDimensionData, renderedData, onGrowData) {\n      var nextState;\n      if (newDimension > _containerDimension) {\n        if (onGrowData) {\n          nextState = {\n            resizeDirection: \"grow\",\n            dataToMeasure: onGrowData(renderedData)\n          };\n        } else {\n          nextState = {\n            resizeDirection: \"shrink\",\n            dataToMeasure: fullDimensionData\n          };\n        }\n      } else {\n        nextState = {\n          resizeDirection: \"shrink\",\n          dataToMeasure: renderedData\n        };\n      }\n      _containerDimension = newDimension;\n      return __assign$1(__assign$1({}, nextState), { measureContainer: false });\n    }\n    function getNextState(props, currentState, getElementToMeasureDimension, newContainerDimension) {\n      if (newContainerDimension === void 0 && currentState.dataToMeasure === void 0) {\n        return void 0;\n      }\n      if (newContainerDimension) {\n        if (_containerDimension && currentState.renderedData && !currentState.dataToMeasure) {\n          return __assign$1(__assign$1({}, currentState), _updateContainerDimension(newContainerDimension, props.data, currentState.renderedData, props.onGrowData));\n        }\n        _containerDimension = newContainerDimension;\n      }\n      var nextState = __assign$1(__assign$1({}, currentState), { measureContainer: false });\n      if (currentState.dataToMeasure) {\n        if (currentState.resizeDirection === \"grow\" && props.onGrowData) {\n          nextState = __assign$1(__assign$1({}, nextState), _growDataUntilItDoesNotFit(currentState.dataToMeasure, props.onGrowData, getElementToMeasureDimension, props.onReduceData));\n        } else {\n          nextState = __assign$1(__assign$1({}, nextState), _shrinkContentsUntilTheyFit(currentState.dataToMeasure, props.onReduceData, getElementToMeasureDimension));\n        }\n      }\n      return nextState;\n    }\n    function shouldRenderDataForMeasurement(dataToMeasure) {\n      if (!dataToMeasure || _measurementCache.getCachedMeasurement(dataToMeasure) !== void 0) {\n        return false;\n      }\n      return true;\n    }\n    function getInitialResizeGroupState(data2) {\n      return {\n        dataToMeasure: __assign$1({}, data2),\n        resizeDirection: \"grow\",\n        measureContainer: true\n      };\n    }\n    return {\n      getNextState,\n      shouldRenderDataForMeasurement,\n      getInitialResizeGroupState\n    };\n  };\n  var MeasuredContext = React__namespace.createContext({ isMeasured: false });\n  var hiddenDivStyles = { position: \"fixed\", visibility: \"hidden\" };\n  var hiddenParentStyles = { position: \"relative\" };\n  function resizeDataReducer(state, action) {\n    var _a2;\n    switch (action.type) {\n      case \"resizeData\":\n        return __assign$1({}, action.value);\n      case \"dataToMeasure\":\n        return __assign$1(__assign$1({}, state), { dataToMeasure: action.value, resizeDirection: \"grow\", measureContainer: true });\n      default:\n        return __assign$1(__assign$1({}, state), (_a2 = {}, _a2[action.type] = action.value, _a2));\n    }\n  }\n  function useResizeState(props, nextResizeGroupStateProvider, rootRef) {\n    var initialStateData = useConst(function() {\n      return nextResizeGroupStateProvider.getInitialResizeGroupState(props.data);\n    });\n    var _a2 = React__namespace.useReducer(resizeDataReducer, initialStateData), resizeData = _a2[0], dispatchResizeDataAction = _a2[1];\n    React__namespace.useEffect(function() {\n      dispatchResizeDataAction({\n        type: \"dataToMeasure\",\n        value: props.data\n      });\n    }, [props.data]);\n    var stateRef = React__namespace.useRef(initialStateData);\n    stateRef.current = __assign$1({}, resizeData);\n    var updateResizeState = React__namespace.useCallback(function(nextState) {\n      if (nextState) {\n        dispatchResizeDataAction({\n          type: \"resizeData\",\n          value: nextState\n        });\n      }\n    }, []);\n    var remeasure = React__namespace.useCallback(function() {\n      if (rootRef.current) {\n        dispatchResizeDataAction({\n          type: \"measureContainer\",\n          value: true\n        });\n      }\n    }, [rootRef]);\n    return [stateRef, updateResizeState, remeasure];\n  }\n  function useResizingBehavior(props, rootRef) {\n    var nextResizeGroupStateProvider = useConst(getNextResizeGroupStateProvider);\n    var initialHiddenDiv = React__namespace.useRef(null);\n    var updateHiddenDiv = React__namespace.useRef(null);\n    var hasRenderedContent = React__namespace.useRef(false);\n    var async = useAsync();\n    var _a2 = useResizeState(props, nextResizeGroupStateProvider, rootRef), stateRef = _a2[0], updateResizeState = _a2[1], remeasure = _a2[2];\n    React__namespace.useEffect(function() {\n      var _a22;\n      if (stateRef.current.renderedData) {\n        hasRenderedContent.current = true;\n        (_a22 = props.dataDidRender) === null || _a22 === void 0 ? void 0 : _a22.call(props, stateRef.current.renderedData);\n      }\n    });\n    React__namespace.useEffect(function() {\n      async.requestAnimationFrame(function() {\n        var containerDimension = void 0;\n        if (stateRef.current.measureContainer && rootRef.current) {\n          var boundingRect = rootRef.current.getBoundingClientRect();\n          containerDimension = props.direction === ResizeGroupDirection.vertical ? boundingRect.height : boundingRect.width;\n        }\n        var nextState = nextResizeGroupStateProvider.getNextState(props, stateRef.current, function() {\n          var refToMeasure = !hasRenderedContent.current ? initialHiddenDiv : updateHiddenDiv;\n          if (!refToMeasure.current) {\n            return 0;\n          }\n          var measuredBoundingRect = refToMeasure.current.getBoundingClientRect();\n          return props.direction === ResizeGroupDirection.vertical ? measuredBoundingRect.height : measuredBoundingRect.width;\n        }, containerDimension);\n        updateResizeState(nextState);\n      }, rootRef.current);\n    });\n    var win = useWindow();\n    useOnEvent(win, \"resize\", async.debounce(remeasure, RESIZE_DELAY, { leading: true }));\n    var dataNeedsMeasuring = nextResizeGroupStateProvider.shouldRenderDataForMeasurement(stateRef.current.dataToMeasure);\n    var isInitialMeasure = !hasRenderedContent.current && dataNeedsMeasuring;\n    return [\n      stateRef.current.dataToMeasure,\n      stateRef.current.renderedData,\n      remeasure,\n      initialHiddenDiv,\n      updateHiddenDiv,\n      dataNeedsMeasuring,\n      isInitialMeasure\n    ];\n  }\n  var measuredContextValue = { isMeasured: true };\n  var ResizeGroupBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRef = useMergedRefs(rootRef, forwardedRef);\n    var _a2 = useResizingBehavior(props, rootRef), dataToMeasure = _a2[0], renderedData = _a2[1], remeasure = _a2[2], initialHiddenDiv = _a2[3], updateHiddenDiv = _a2[4], dataNeedsMeasuring = _a2[5], isInitialMeasure = _a2[6];\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return { remeasure };\n    }, [remeasure]);\n    var className2 = props.className, onRenderData = props.onRenderData;\n    var divProps = getNativeProps(props, divProperties, [\"data\"]);\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({}, divProps, { className: className2, ref: mergedRootRef }),\n      React__namespace.createElement(\n        \"div\",\n        { style: hiddenParentStyles },\n        dataNeedsMeasuring && !isInitialMeasure && React__namespace.createElement(\n          \"div\",\n          { style: hiddenDivStyles, ref: updateHiddenDiv },\n          React__namespace.createElement(MeasuredContext.Provider, { value: measuredContextValue }, onRenderData(dataToMeasure))\n        ),\n        React__namespace.createElement(\"div\", { ref: initialHiddenDiv, style: isInitialMeasure ? hiddenDivStyles : void 0, \"data-automation-id\": \"visibleContent\" }, isInitialMeasure ? onRenderData(dataToMeasure) : renderedData && onRenderData(renderedData))\n      )\n    );\n  });\n  ResizeGroupBase.displayName = \"ResizeGroupBase\";\n  var ResizeGroup = ResizeGroupBase;\n  var getClassNames$e = classNamesFunction();\n  var TooltipBase = (\n    /** @class */\n    (function(_super) {\n      __extends(TooltipBase2, _super);\n      function TooltipBase2() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._onRenderContent = function(props) {\n          if (typeof props.content === \"string\") {\n            return React__namespace.createElement(\"p\", { className: _this._classNames.subText }, props.content);\n          } else {\n            return React__namespace.createElement(\"div\", { className: _this._classNames.subText }, props.content);\n          }\n        };\n        return _this;\n      }\n      TooltipBase2.prototype.render = function() {\n        var _a2 = this.props, className2 = _a2.className, calloutProps = _a2.calloutProps, directionalHint = _a2.directionalHint, directionalHintForRTL = _a2.directionalHintForRTL, styles = _a2.styles, id2 = _a2.id, maxWidth = _a2.maxWidth, _b2 = _a2.onRenderContent, onRenderContent = _b2 === void 0 ? this._onRenderContent : _b2, targetElement = _a2.targetElement, theme = _a2.theme;\n        this._classNames = getClassNames$e(styles, {\n          theme,\n          className: className2 || calloutProps && calloutProps.className,\n          beakWidth: calloutProps && calloutProps.isBeakVisible ? calloutProps.beakWidth : 0,\n          gapSpace: calloutProps && calloutProps.gapSpace,\n          maxWidth\n        });\n        return React__namespace.createElement(\n          Callout,\n          __assign$1({ target: targetElement, directionalHint, directionalHintForRTL }, calloutProps, getNativeProps(this.props, divProperties, [\"id\"]), { className: this._classNames.root }),\n          React__namespace.createElement(\"div\", { className: this._classNames.content, id: id2, onFocus: this.props.onFocus, onMouseEnter: this.props.onMouseEnter, onMouseLeave: this.props.onMouseLeave }, onRenderContent(this.props, this._onRenderContent))\n        );\n      };\n      TooltipBase2.defaultProps = {\n        directionalHint: DirectionalHint.topCenter,\n        maxWidth: \"364px\",\n        calloutProps: {\n          isBeakVisible: true,\n          beakWidth: 16,\n          gapSpace: 0,\n          setInitialFocus: true,\n          doNotLayer: false\n        }\n      };\n      return TooltipBase2;\n    })(React__namespace.Component)\n  );\n  var getStyles$c = function(props) {\n    var className2 = props.className, _a2 = props.beakWidth, beakWidth = _a2 === void 0 ? 16 : _a2, _b2 = props.gapSpace, gapSpace = _b2 === void 0 ? 0 : _b2, maxWidth = props.maxWidth, theme = props.theme;\n    var semanticColors = theme.semanticColors, fonts = theme.fonts, effects = theme.effects;\n    var tooltipGapSpace = -(Math.sqrt(beakWidth * beakWidth / 2) + gapSpace) + 1 / // There isn't really a great way to pass in a `window` reference here so disabling the line rule\n    // eslint-disable-next-line no-restricted-globals\n    window.devicePixelRatio;\n    return {\n      root: [\n        \"ms-Tooltip\",\n        theme.fonts.medium,\n        AnimationClassNames.fadeIn200,\n        {\n          background: semanticColors.menuBackground,\n          boxShadow: effects.elevation8,\n          padding: \"8px\",\n          maxWidth,\n          selectors: {\n            \":after\": {\n              content: \"''\",\n              position: \"absolute\",\n              bottom: tooltipGapSpace,\n              left: tooltipGapSpace,\n              right: tooltipGapSpace,\n              top: tooltipGapSpace,\n              zIndex: 0\n            }\n          }\n        },\n        className2\n      ],\n      content: [\n        \"ms-Tooltip-content\",\n        fonts.small,\n        {\n          position: \"relative\",\n          zIndex: 1,\n          color: semanticColors.menuItemText,\n          wordWrap: \"break-word\",\n          overflowWrap: \"break-word\",\n          overflow: \"hidden\"\n        }\n      ],\n      subText: [\n        \"ms-Tooltip-subtext\",\n        {\n          // Using inherit here to avoid unintentional global overrides of the <p> tag.\n          fontSize: \"inherit\",\n          fontWeight: \"inherit\",\n          color: \"inherit\",\n          margin: 0\n        }\n      ]\n    };\n  };\n  var Tooltip = styled(TooltipBase, getStyles$c, void 0, {\n    scope: \"Tooltip\"\n  });\n  var TooltipDelay;\n  (function(TooltipDelay2) {\n    TooltipDelay2[TooltipDelay2[\"zero\"] = 0] = \"zero\";\n    TooltipDelay2[TooltipDelay2[\"medium\"] = 1] = \"medium\";\n    TooltipDelay2[TooltipDelay2[\"long\"] = 2] = \"long\";\n  })(TooltipDelay || (TooltipDelay = {}));\n  var TooltipOverflowMode;\n  (function(TooltipOverflowMode2) {\n    TooltipOverflowMode2[TooltipOverflowMode2[\"Parent\"] = 0] = \"Parent\";\n    TooltipOverflowMode2[TooltipOverflowMode2[\"Self\"] = 1] = \"Self\";\n  })(TooltipOverflowMode || (TooltipOverflowMode = {}));\n  var getClassNames$d = classNamesFunction();\n  var TooltipHostBase = (\n    /** @class */\n    (function(_super) {\n      __extends(TooltipHostBase2, _super);\n      function TooltipHostBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._tooltipHost = React__namespace.createRef();\n        _this._defaultTooltipId = getId(\"tooltip\");\n        _this.show = function() {\n          _this._toggleTooltip(true);\n        };\n        _this.dismiss = function() {\n          _this._hideTooltip();\n        };\n        _this._getTargetElement = function() {\n          if (!_this._tooltipHost.current) {\n            return void 0;\n          }\n          var overflowMode = _this.props.overflowMode;\n          if (overflowMode !== void 0) {\n            switch (overflowMode) {\n              case TooltipOverflowMode.Parent:\n                return _this._tooltipHost.current.parentElement;\n              case TooltipOverflowMode.Self:\n                return _this._tooltipHost.current;\n            }\n          }\n          return _this._tooltipHost.current;\n        };\n        _this._onTooltipFocus = function(ev) {\n          if (_this._ignoreNextFocusEvent) {\n            _this._ignoreNextFocusEvent = false;\n            return;\n          }\n          _this._onTooltipMouseEnter(ev);\n        };\n        _this._onTooltipContentFocus = function(ev) {\n          if (TooltipHostBase2._currentVisibleTooltip && TooltipHostBase2._currentVisibleTooltip !== _this) {\n            TooltipHostBase2._currentVisibleTooltip.dismiss();\n          }\n          TooltipHostBase2._currentVisibleTooltip = _this;\n          _this._clearDismissTimer();\n          _this._clearOpenTimer();\n        };\n        _this._onTooltipBlur = function(ev) {\n          var _a2;\n          _this._ignoreNextFocusEvent = ((_a2 = getDocumentEx(_this.context)) === null || _a2 === void 0 ? void 0 : _a2.activeElement) === ev.target;\n          _this._dismissTimerId = _this._async.setTimeout(function() {\n            _this._hideTooltip();\n          }, 0);\n        };\n        _this._onTooltipMouseEnter = function(ev) {\n          var _a2 = _this.props, overflowMode = _a2.overflowMode, delay = _a2.delay;\n          var doc = getDocumentEx(_this.context);\n          if (TooltipHostBase2._currentVisibleTooltip && TooltipHostBase2._currentVisibleTooltip !== _this) {\n            TooltipHostBase2._currentVisibleTooltip.dismiss();\n          }\n          TooltipHostBase2._currentVisibleTooltip = _this;\n          if (overflowMode !== void 0) {\n            var overflowElement = _this._getTargetElement();\n            if (overflowElement && !hasOverflow(overflowElement)) {\n              return;\n            }\n          }\n          if (ev.target && portalContainsElement(ev.target, _this._getTargetElement(), doc)) {\n            return;\n          }\n          _this._clearDismissTimer();\n          _this._clearOpenTimer();\n          if (delay !== TooltipDelay.zero) {\n            var delayTime = _this._getDelayTime(delay);\n            _this._openTimerId = _this._async.setTimeout(function() {\n              _this._toggleTooltip(true);\n            }, delayTime);\n          } else {\n            _this._toggleTooltip(true);\n          }\n        };\n        _this._onTooltipMouseLeave = function(ev) {\n          var closeDelay = _this.props.closeDelay;\n          _this._clearDismissTimer();\n          _this._clearOpenTimer();\n          if (closeDelay) {\n            _this._dismissTimerId = _this._async.setTimeout(function() {\n              _this._toggleTooltip(false);\n            }, closeDelay);\n          } else {\n            _this._toggleTooltip(false);\n          }\n          if (TooltipHostBase2._currentVisibleTooltip === _this) {\n            TooltipHostBase2._currentVisibleTooltip = void 0;\n          }\n        };\n        _this._onTooltipKeyDown = function(ev) {\n          if ((ev.which === KeyCodes.escape || ev.ctrlKey) && _this.state.isTooltipVisible) {\n            _this._hideTooltip();\n            ev.stopPropagation();\n          }\n        };\n        _this._clearDismissTimer = function() {\n          _this._async.clearTimeout(_this._dismissTimerId);\n        };\n        _this._clearOpenTimer = function() {\n          _this._async.clearTimeout(_this._openTimerId);\n        };\n        _this._hideTooltip = function() {\n          _this._clearOpenTimer();\n          _this._clearDismissTimer();\n          _this._toggleTooltip(false);\n        };\n        _this._toggleTooltip = function(isTooltipVisible) {\n          if (_this.state.isTooltipVisible !== isTooltipVisible) {\n            _this.setState({ isTooltipVisible }, function() {\n              return _this.props.onTooltipToggle && _this.props.onTooltipToggle(isTooltipVisible);\n            });\n          }\n        };\n        _this._getDelayTime = function(delay) {\n          switch (delay) {\n            case TooltipDelay.medium:\n              return 300;\n            case TooltipDelay.long:\n              return 500;\n            default:\n              return 0;\n          }\n        };\n        initializeComponentRef(_this);\n        _this.state = {\n          isAriaPlaceholderRendered: false,\n          isTooltipVisible: false\n        };\n        return _this;\n      }\n      TooltipHostBase2.prototype.render = function() {\n        var _a2 = this.props, calloutProps = _a2.calloutProps, children2 = _a2.children, content2 = _a2.content, directionalHint = _a2.directionalHint, directionalHintForRTL = _a2.directionalHintForRTL, className2 = _a2.hostClassName, id2 = _a2.id, _b2 = _a2.setAriaDescribedBy, setAriaDescribedBy = _b2 === void 0 ? true : _b2, tooltipProps = _a2.tooltipProps, styles = _a2.styles, theme = _a2.theme;\n        this._classNames = getClassNames$d(styles, {\n          theme,\n          className: className2\n        });\n        var isTooltipVisible = this.state.isTooltipVisible;\n        var tooltipId = id2 || this._defaultTooltipId;\n        var tooltipRenderProps = __assign$1(__assign$1({ id: \"\".concat(tooltipId, \"--tooltip\"), content: content2, targetElement: this._getTargetElement(), directionalHint, directionalHintForRTL, calloutProps: assign({}, calloutProps, {\n          onDismiss: this._hideTooltip,\n          onFocus: this._onTooltipContentFocus,\n          onMouseEnter: this._onTooltipMouseEnter,\n          onMouseLeave: this._onTooltipMouseLeave\n        }), onMouseEnter: this._onTooltipMouseEnter, onMouseLeave: this._onTooltipMouseLeave }, getNativeProps(this.props, divProperties, [\"id\"])), tooltipProps);\n        var tooltipContent = (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.onRenderContent) ? tooltipProps.onRenderContent(tooltipRenderProps, function(props) {\n          return (props === null || props === void 0 ? void 0 : props.content) ? React__namespace.createElement(React__namespace.Fragment, null, props.content) : null;\n        }) : content2;\n        var showTooltip = isTooltipVisible && !!tooltipContent;\n        var ariaDescribedBy = setAriaDescribedBy && isTooltipVisible && !!tooltipContent ? tooltipId : void 0;\n        return React__namespace.createElement(\n          \"div\",\n          { className: this._classNames.root, ref: this._tooltipHost, onFocusCapture: this._onTooltipFocus, onBlurCapture: this._onTooltipBlur, onMouseEnter: this._onTooltipMouseEnter, onMouseLeave: this._onTooltipMouseLeave, onKeyDown: this._onTooltipKeyDown, role: \"none\", \"aria-describedby\": ariaDescribedBy },\n          children2,\n          showTooltip && React__namespace.createElement(Tooltip, __assign$1({}, tooltipRenderProps)),\n          React__namespace.createElement(\"div\", { hidden: true, id: tooltipId, style: hiddenContentStyle }, tooltipContent)\n        );\n      };\n      TooltipHostBase2.prototype.componentDidMount = function() {\n        this._async = new Async(this);\n      };\n      TooltipHostBase2.prototype.componentWillUnmount = function() {\n        if (TooltipHostBase2._currentVisibleTooltip && TooltipHostBase2._currentVisibleTooltip === this) {\n          TooltipHostBase2._currentVisibleTooltip = void 0;\n        }\n        this._async.dispose();\n      };\n      TooltipHostBase2.defaultProps = {\n        delay: TooltipDelay.medium\n      };\n      TooltipHostBase2.contextType = WindowContext;\n      return TooltipHostBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$8 = {\n    root: \"ms-TooltipHost\",\n    ariaPlaceholder: \"ms-TooltipHost-aria-placeholder\"\n  };\n  var getStyles$b = function(props) {\n    var className2 = props.className, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$8, theme);\n    return {\n      root: [\n        classNames2.root,\n        {\n          display: \"inline\"\n        },\n        className2\n      ]\n    };\n  };\n  var TooltipHost = styled(TooltipHostBase, getStyles$b, void 0, {\n    scope: \"TooltipHost\"\n  });\n  var getClassNames$c = classNamesFunction();\n  var CommandBarBase = (\n    /** @class */\n    (function(_super) {\n      __extends(CommandBarBase2, _super);\n      function CommandBarBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._overflowSet = React__namespace.createRef();\n        _this._resizeGroup = React__namespace.createRef();\n        _this._onRenderData = function(data2) {\n          var _a2 = _this.props, ariaLabel2 = _a2.ariaLabel, primaryGroupAriaLabel = _a2.primaryGroupAriaLabel, farItemsGroupAriaLabel = _a2.farItemsGroupAriaLabel;\n          var hasSecondSet = data2.farItems && data2.farItems.length > 0;\n          return React__namespace.createElement(\n            FocusZone,\n            { className: css(_this._classNames.root), direction: FocusZoneDirection.horizontal, role: \"menubar\", \"aria-label\": ariaLabel2 },\n            React__namespace.createElement(OverflowSet, { role: hasSecondSet ? \"group\" : \"none\", \"aria-label\": hasSecondSet ? primaryGroupAriaLabel : void 0, componentRef: _this._overflowSet, className: css(_this._classNames.primarySet), items: data2.primaryItems, overflowItems: data2.overflowItems.length ? data2.overflowItems : void 0, onRenderItem: _this._onRenderItem, onRenderOverflowButton: _this._onRenderOverflowButton }),\n            hasSecondSet && React__namespace.createElement(OverflowSet, { role: \"group\", \"aria-label\": farItemsGroupAriaLabel, className: css(_this._classNames.secondarySet), items: data2.farItems, onRenderItem: _this._onRenderItem, onRenderOverflowButton: nullRender })\n          );\n        };\n        _this._onRenderItem = function(item) {\n          if (item.onRender) {\n            return item.onRender(item, function() {\n              return void 0;\n            });\n          }\n          var itemText = item.text || item.name;\n          var commandButtonProps = __assign$1(__assign$1({ allowDisabledFocus: true, role: \"menuitem\" }, item), { styles: getCommandButtonStyles(item.buttonStyles), className: css(\"ms-CommandBarItem-link\", item.className), text: !item.iconOnly ? itemText : void 0, menuProps: item.subMenuProps, onClick: _this._onButtonClick(item) });\n          if (item.iconOnly && (itemText !== void 0 || item.tooltipHostProps)) {\n            return React__namespace.createElement(TooltipHost, __assign$1({\n              role: \"none\",\n              content: itemText,\n              // eslint-disable-next-line @typescript-eslint/no-deprecated\n              setAriaDescribedBy: false\n            }, item.tooltipHostProps), _this._commandButton(item, commandButtonProps));\n          }\n          return _this._commandButton(item, commandButtonProps);\n        };\n        _this._commandButton = function(item, props2) {\n          var ButtonAs = _this.props.buttonAs;\n          var CommandBarButtonAs = item.commandBarButtonAs;\n          var DefaultButtonAs = CommandBarButton;\n          var Type = DefaultButtonAs;\n          if (CommandBarButtonAs) {\n            Type = composeComponentAs(CommandBarButtonAs, Type);\n          }\n          if (ButtonAs) {\n            Type = composeComponentAs(ButtonAs, Type);\n          }\n          return React__namespace.createElement(Type, __assign$1({}, props2));\n        };\n        _this._onRenderOverflowButton = function(overflowItems) {\n          var _a2 = _this.props.overflowButtonProps, overflowButtonProps = _a2 === void 0 ? {} : _a2;\n          var combinedOverflowItems = __spreadArray(__spreadArray([], overflowButtonProps.menuProps ? overflowButtonProps.menuProps.items : [], true), overflowItems, true);\n          var overflowProps = __assign$1(__assign$1({ role: \"menuitem\" }, overflowButtonProps), { styles: __assign$1({ menuIcon: { fontSize: \"17px\" } }, overflowButtonProps.styles), className: css(\"ms-CommandBar-overflowButton\", overflowButtonProps.className), menuProps: __assign$1(__assign$1({}, overflowButtonProps.menuProps), { items: combinedOverflowItems }), menuIconProps: __assign$1({ iconName: \"More\" }, overflowButtonProps.menuIconProps) });\n          var OverflowButtonType = _this.props.overflowButtonAs ? composeComponentAs(_this.props.overflowButtonAs, CommandBarButton) : CommandBarButton;\n          return React__namespace.createElement(OverflowButtonType, __assign$1({}, overflowProps));\n        };\n        _this._onReduceData = function(data2) {\n          var _a2 = _this.props, shiftOnReduce = _a2.shiftOnReduce, onDataReduced = _a2.onDataReduced;\n          var primaryItems = data2.primaryItems, overflowItems = data2.overflowItems, cacheKey = data2.cacheKey;\n          var farItems = data2.farItems;\n          var movedItem = primaryItems[shiftOnReduce ? 0 : primaryItems.length - 1];\n          if (movedItem !== void 0) {\n            movedItem.renderedInOverflow = true;\n            overflowItems = __spreadArray([movedItem], overflowItems, true);\n            primaryItems = shiftOnReduce ? primaryItems.slice(1) : primaryItems.slice(0, -1);\n            var newData = __assign$1(__assign$1({}, data2), { primaryItems, overflowItems });\n            cacheKey = _this._computeCacheKey({ primaryItems, overflow: overflowItems.length > 0, farItems });\n            if (onDataReduced) {\n              onDataReduced(movedItem);\n            }\n            newData.cacheKey = cacheKey;\n            return newData;\n          }\n          return void 0;\n        };\n        _this._onGrowData = function(data2) {\n          var _a2 = _this.props, shiftOnReduce = _a2.shiftOnReduce, onDataGrown = _a2.onDataGrown;\n          var minimumOverflowItems = data2.minimumOverflowItems;\n          var primaryItems = data2.primaryItems, overflowItems = data2.overflowItems, cacheKey = data2.cacheKey;\n          var farItems = data2.farItems;\n          var movedItem = overflowItems[0];\n          if (movedItem !== void 0 && overflowItems.length > minimumOverflowItems) {\n            movedItem.renderedInOverflow = false;\n            overflowItems = overflowItems.slice(1);\n            primaryItems = shiftOnReduce ? __spreadArray([movedItem], primaryItems, true) : __spreadArray(__spreadArray([], primaryItems, true), [movedItem], false);\n            var newData = __assign$1(__assign$1({}, data2), { primaryItems, overflowItems });\n            cacheKey = _this._computeCacheKey({ primaryItems, overflow: overflowItems.length > 0, farItems });\n            if (onDataGrown) {\n              onDataGrown(movedItem);\n            }\n            newData.cacheKey = cacheKey;\n            return newData;\n          }\n          return void 0;\n        };\n        initializeComponentRef(_this);\n        return _this;\n      }\n      CommandBarBase2.prototype.render = function() {\n        var _a2 = this.props, items = _a2.items, overflowItems = _a2.overflowItems, farItems = _a2.farItems, styles = _a2.styles, theme = _a2.theme, dataDidRender = _a2.dataDidRender, _b2 = _a2.onReduceData, onReduceData = _b2 === void 0 ? this._onReduceData : _b2, _c2 = _a2.onGrowData, onGrowData = _c2 === void 0 ? this._onGrowData : _c2, _d2 = _a2.resizeGroupAs, ResizeGroupAs = _d2 === void 0 ? ResizeGroup : _d2;\n        var commandBarData = {\n          primaryItems: __spreadArray([], items, true),\n          overflowItems: __spreadArray([], overflowItems, true),\n          minimumOverflowItems: __spreadArray([], overflowItems, true).length,\n          // for tracking\n          farItems,\n          cacheKey: this._computeCacheKey({\n            primaryItems: __spreadArray([], items, true),\n            overflow: overflowItems && overflowItems.length > 0,\n            farItems\n          })\n        };\n        this._classNames = getClassNames$c(styles, { theme });\n        var nativeProps = getNativeProps(this.props, divProperties);\n        return React__namespace.createElement(ResizeGroupAs, __assign$1({}, nativeProps, { componentRef: this._resizeGroup, data: commandBarData, onReduceData, onGrowData, onRenderData: this._onRenderData, dataDidRender }));\n      };\n      CommandBarBase2.prototype.focus = function() {\n        var overflowSet = this._overflowSet.current;\n        overflowSet && overflowSet.focus();\n      };\n      CommandBarBase2.prototype.remeasure = function() {\n        this._resizeGroup.current && this._resizeGroup.current.remeasure();\n      };\n      CommandBarBase2.prototype._onButtonClick = function(item) {\n        return function(ev) {\n          if (item.inactive) {\n            return;\n          }\n          if (item.onClick) {\n            item.onClick(ev, item);\n          }\n        };\n      };\n      CommandBarBase2.prototype._computeCacheKey = function(data2) {\n        var primaryItems = data2.primaryItems, overflow = data2.overflow, farItems = data2.farItems;\n        var returnKey = function(acc, current) {\n          var _a2 = current.cacheKey, cacheKey = _a2 === void 0 ? current.key : _a2;\n          return acc + cacheKey;\n        };\n        var primaryKey = primaryItems && primaryItems.reduce(returnKey, \"\");\n        var overflowKey = overflow ? \"overflow\" : \"\";\n        var farKey = farItems && farItems.reduce(returnKey, \"\");\n        return [primaryKey, overflowKey, farKey].join(\"\");\n      };\n      CommandBarBase2.defaultProps = {\n        items: [],\n        overflowItems: []\n      };\n      return CommandBarBase2;\n    })(React__namespace.Component)\n  );\n  var CommandBar = styled(CommandBarBase, getStyles$e, void 0, {\n    scope: \"CommandBar\"\n  });\n  var DialogType;\n  (function(DialogType2) {\n    DialogType2[DialogType2[\"normal\"] = 0] = \"normal\";\n    DialogType2[DialogType2[\"largeHeader\"] = 1] = \"largeHeader\";\n    DialogType2[DialogType2[\"close\"] = 2] = \"close\";\n  })(DialogType || (DialogType = {}));\n  var animationDuration = AnimationVariables.durationValue2;\n  var globalClassNames$1 = {\n    root: \"ms-Modal\",\n    main: \"ms-Dialog-main\",\n    scrollableContent: \"ms-Modal-scrollableContent\",\n    isOpen: \"is-open\",\n    layer: \"ms-Modal-Layer\"\n  };\n  var getStyles$a = function(props) {\n    var _a2;\n    var className2 = props.className, containerClassName = props.containerClassName, scrollableContentClassName = props.scrollableContentClassName, isOpen = props.isOpen, isVisible = props.isVisible, hasBeenOpened = props.hasBeenOpened, modalRectangleTop = props.modalRectangleTop, theme = props.theme, topOffsetFixed = props.topOffsetFixed, isModeless = props.isModeless, layerClassName = props.layerClassName, isDefaultDragHandle = props.isDefaultDragHandle, windowInnerHeight = props.windowInnerHeight;\n    var palette = theme.palette, effects = theme.effects, fonts = theme.fonts;\n    var classNames2 = getGlobalClassNames(globalClassNames$1, theme);\n    return {\n      root: [\n        classNames2.root,\n        fonts.medium,\n        {\n          backgroundColor: \"transparent\",\n          position: \"fixed\",\n          height: \"100%\",\n          width: \"100%\",\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          opacity: 0,\n          pointerEvents: \"none\",\n          transition: \"opacity \".concat(animationDuration)\n        },\n        topOffsetFixed && typeof modalRectangleTop === \"number\" && hasBeenOpened && {\n          alignItems: \"flex-start\"\n        },\n        isOpen && classNames2.isOpen,\n        isVisible && {\n          opacity: 1\n        },\n        isVisible && !isModeless && {\n          pointerEvents: \"auto\"\n        },\n        className2\n      ],\n      main: [\n        classNames2.main,\n        {\n          boxShadow: effects.elevation64,\n          borderRadius: effects.roundedCorner2,\n          backgroundColor: palette.white,\n          boxSizing: \"border-box\",\n          position: \"relative\",\n          textAlign: \"left\",\n          outline: \"3px solid transparent\",\n          maxHeight: \"calc(100% - 32px)\",\n          maxWidth: \"calc(100% - 32px)\",\n          minHeight: \"176px\",\n          minWidth: \"288px\",\n          overflowY: \"auto\",\n          zIndex: isModeless ? ZIndexes.Layer : void 0\n        },\n        isModeless && {\n          pointerEvents: \"auto\"\n        },\n        topOffsetFixed && typeof modalRectangleTop === \"number\" && hasBeenOpened && {\n          top: modalRectangleTop\n        },\n        isDefaultDragHandle && {\n          cursor: \"move\"\n        },\n        containerClassName\n      ],\n      scrollableContent: [\n        classNames2.scrollableContent,\n        {\n          overflowY: \"auto\",\n          flexGrow: 1,\n          maxHeight: \"100vh\",\n          selectors: (_a2 = {}, _a2[\"@supports (-webkit-overflow-scrolling: touch)\"] = {\n            maxHeight: windowInnerHeight\n          }, _a2)\n        },\n        scrollableContentClassName\n      ],\n      layer: isModeless && [layerClassName, classNames2.layer, { pointerEvents: \"none\" }],\n      keyboardMoveIconContainer: {\n        position: \"absolute\",\n        display: \"flex\",\n        justifyContent: \"center\",\n        width: \"100%\",\n        padding: \"3px 0px\"\n      },\n      keyboardMoveIcon: {\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        fontSize: fonts.xLargePlus.fontSize,\n        width: \"24px\"\n      }\n    };\n  };\n  var getClassNames$b = classNamesFunction();\n  var OverlayBase = (\n    /** @class */\n    (function(_super) {\n      __extends(OverlayBase2, _super);\n      function OverlayBase2(props) {\n        var _this = _super.call(this, props) || this;\n        initializeComponentRef(_this);\n        var _a2 = _this.props.allowTouchBodyScroll, allowTouchBodyScroll = _a2 === void 0 ? false : _a2;\n        _this._allowTouchBodyScroll = allowTouchBodyScroll;\n        return _this;\n      }\n      OverlayBase2.prototype.componentDidMount = function() {\n        !this._allowTouchBodyScroll && disableBodyScroll();\n      };\n      OverlayBase2.prototype.componentWillUnmount = function() {\n        !this._allowTouchBodyScroll && enableBodyScroll();\n      };\n      OverlayBase2.prototype.render = function() {\n        var _a2 = this.props, isDark = _a2.isDarkThemed, className2 = _a2.className, theme = _a2.theme, styles = _a2.styles;\n        var divProps = getNativeProps(this.props, divProperties);\n        var classNames2 = getClassNames$b(styles, {\n          theme,\n          className: className2,\n          isDark\n        });\n        return React__namespace.createElement(\"div\", __assign$1({}, divProps, { className: classNames2.root }));\n      };\n      return OverlayBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$7 = {\n    root: \"ms-Overlay\",\n    rootDark: \"ms-Overlay--dark\"\n  };\n  var getStyles$9 = function(props) {\n    var _a2;\n    var className2 = props.className, theme = props.theme, isNone = props.isNone, isDark = props.isDark;\n    var palette = theme.palette;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$7, theme);\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          backgroundColor: palette.whiteTranslucent40,\n          top: 0,\n          right: 0,\n          bottom: 0,\n          left: 0,\n          position: \"absolute\",\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n            border: \"1px solid WindowText\",\n            opacity: 0\n          }, _a2)\n        },\n        isNone && {\n          visibility: \"hidden\"\n        },\n        isDark && [\n          classNames2.rootDark,\n          {\n            backgroundColor: palette.blackTranslucent40\n          }\n        ],\n        className2\n      ]\n    };\n  };\n  var Overlay = styled(OverlayBase, getStyles$9, void 0, {\n    scope: \"Overlay\"\n  });\n  var getClassNames$a = memoizeFunction(function(className2, isDragging) {\n    return {\n      root: mergeStyles(className2, isDragging && {\n        touchAction: \"none\",\n        selectors: {\n          \"& *\": {\n            userSelect: \"none\"\n          }\n        }\n      })\n    };\n  });\n  var eventMapping = {\n    touch: {\n      start: \"touchstart\",\n      move: \"touchmove\",\n      stop: \"touchend\"\n    },\n    mouse: {\n      start: \"mousedown\",\n      move: \"mousemove\",\n      stop: \"mouseup\"\n    }\n  };\n  var DraggableZone = (\n    /** @class */\n    (function(_super) {\n      __extends(DraggableZone2, _super);\n      function DraggableZone2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._currentEventType = eventMapping.mouse;\n        _this._events = [];\n        _this._onMouseDown = function(event2) {\n          var onMouseDown = React__namespace.Children.only(_this.props.children).props.onMouseDown;\n          if (onMouseDown) {\n            onMouseDown(event2);\n          }\n          _this._currentEventType = eventMapping.mouse;\n          return _this._onDragStart(event2);\n        };\n        _this._onMouseUp = function(event2) {\n          var onMouseUp = React__namespace.Children.only(_this.props.children).props.onMouseUp;\n          if (onMouseUp) {\n            onMouseUp(event2);\n          }\n          _this._currentEventType = eventMapping.mouse;\n          return _this._onDragStop(event2);\n        };\n        _this._onTouchStart = function(event2) {\n          var onTouchStart = React__namespace.Children.only(_this.props.children).props.onTouchStart;\n          if (onTouchStart) {\n            onTouchStart(event2);\n          }\n          _this._currentEventType = eventMapping.touch;\n          return _this._onDragStart(event2);\n        };\n        _this._onTouchEnd = function(event2) {\n          var onTouchEnd = React__namespace.Children.only(_this.props.children).props.onTouchEnd;\n          if (onTouchEnd) {\n            onTouchEnd(event2);\n          }\n          _this._currentEventType = eventMapping.touch;\n          _this._onDragStop(event2);\n        };\n        _this._onDragStart = function(event2) {\n          if (typeof event2.button === \"number\" && event2.button !== 0) {\n            return false;\n          }\n          if (_this.props.handleSelector && !_this._matchesSelector(event2.target, _this.props.handleSelector) || _this.props.preventDragSelector && _this._matchesSelector(event2.target, _this.props.preventDragSelector)) {\n            return;\n          }\n          _this._touchId = _this._getTouchId(event2);\n          var position2 = _this._getControlPosition(event2);\n          if (position2 === void 0) {\n            return;\n          }\n          var dragData = _this._createDragDataFromPosition(position2);\n          _this.props.onStart && _this.props.onStart(event2, dragData);\n          _this.setState({\n            isDragging: true,\n            lastPosition: position2\n          });\n          var doc = getDocumentEx(_this.context);\n          _this._events = [\n            on$1(\n              doc.body,\n              _this._currentEventType.move,\n              _this._onDrag,\n              true\n              /* use capture phase */\n            ),\n            on$1(\n              doc.body,\n              _this._currentEventType.stop,\n              _this._onDragStop,\n              true\n              /* use capture phase */\n            )\n          ];\n        };\n        _this._onDrag = function(event2) {\n          if (event2.type === \"touchmove\") {\n            event2.preventDefault();\n          }\n          var position2 = _this._getControlPosition(event2);\n          if (!position2) {\n            return;\n          }\n          var updatedData = _this._createUpdatedDragData(_this._createDragDataFromPosition(position2));\n          var updatedPosition = updatedData.position;\n          _this.props.onDragChange && _this.props.onDragChange(event2, updatedData);\n          _this.setState({\n            position: updatedPosition,\n            lastPosition: position2\n          });\n        };\n        _this._onDragStop = function(event2) {\n          if (!_this.state.isDragging) {\n            return;\n          }\n          var position2 = _this._getControlPosition(event2);\n          if (!position2) {\n            return;\n          }\n          var baseDragData = _this._createDragDataFromPosition(position2);\n          _this.setState({\n            isDragging: false,\n            lastPosition: void 0\n          });\n          _this.props.onStop && _this.props.onStop(event2, baseDragData);\n          if (_this.props.position) {\n            _this.setState({\n              position: _this.props.position\n            });\n          }\n          _this._events.forEach(function(dispose) {\n            return dispose();\n          });\n        };\n        _this.state = {\n          isDragging: false,\n          position: _this.props.position || { x: 0, y: 0 },\n          lastPosition: void 0\n        };\n        return _this;\n      }\n      DraggableZone2.prototype.componentDidUpdate = function(prevProps) {\n        if (this.props.position && (!prevProps.position || this.props.position !== prevProps.position)) {\n          this.setState({ position: this.props.position });\n        }\n      };\n      DraggableZone2.prototype.componentWillUnmount = function() {\n        this._events.forEach(function(dispose) {\n          return dispose();\n        });\n      };\n      DraggableZone2.prototype.render = function() {\n        var child = React__namespace.Children.only(this.props.children);\n        var props = child.props;\n        var position2 = this.props.position;\n        var _a2 = this.state, statePosition = _a2.position, isDragging = _a2.isDragging;\n        var x2 = statePosition.x;\n        var y2 = statePosition.y;\n        if (position2 && !isDragging) {\n          x2 = position2.x;\n          y2 = position2.y;\n        }\n        return React__namespace.cloneElement(child, {\n          style: __assign$1(__assign$1({}, props.style), { transform: \"translate(\".concat(x2, \"px, \").concat(y2, \"px)\") }),\n          className: getClassNames$a(props.className, this.state.isDragging).root,\n          onMouseDown: this._onMouseDown,\n          onMouseUp: this._onMouseUp,\n          onTouchStart: this._onTouchStart,\n          onTouchEnd: this._onTouchEnd\n        });\n      };\n      DraggableZone2.prototype._getControlPosition = function(event2) {\n        var touchObj = this._getActiveTouch(event2);\n        if (this._touchId !== void 0 && !touchObj) {\n          return void 0;\n        }\n        var eventToGetOffset = touchObj || event2;\n        return {\n          x: eventToGetOffset.clientX,\n          y: eventToGetOffset.clientY\n        };\n      };\n      DraggableZone2.prototype._getActiveTouch = function(event2) {\n        return event2.targetTouches && this._findTouchInTouchList(event2.targetTouches) || event2.changedTouches && this._findTouchInTouchList(event2.changedTouches);\n      };\n      DraggableZone2.prototype._getTouchId = function(event2) {\n        var touch2 = event2.targetTouches && event2.targetTouches[0] || event2.changedTouches && event2.changedTouches[0];\n        if (touch2) {\n          return touch2.identifier;\n        }\n      };\n      DraggableZone2.prototype._matchesSelector = function(element2, selector) {\n        var _a2;\n        if (!element2 || element2 === ((_a2 = getDocumentEx(this.context)) === null || _a2 === void 0 ? void 0 : _a2.body)) {\n          return false;\n        }\n        var matchesSelectorFn = (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          element2.matches || element2.webkitMatchesSelector || element2.msMatchesSelector\n        );\n        if (!matchesSelectorFn) {\n          return false;\n        }\n        return matchesSelectorFn.call(element2, selector) || this._matchesSelector(element2.parentElement, selector);\n      };\n      DraggableZone2.prototype._findTouchInTouchList = function(touchList) {\n        if (this._touchId === void 0) {\n          return;\n        }\n        for (var i = 0; i < touchList.length; i++) {\n          if (touchList[i].identifier === this._touchId) {\n            return touchList[i];\n          }\n        }\n        return void 0;\n      };\n      DraggableZone2.prototype._createDragDataFromPosition = function(position2) {\n        var lastPosition = this.state.lastPosition;\n        if (lastPosition === void 0) {\n          return {\n            delta: { x: 0, y: 0 },\n            lastPosition: position2,\n            position: position2\n          };\n        }\n        return {\n          delta: {\n            x: position2.x - lastPosition.x,\n            y: position2.y - lastPosition.y\n          },\n          lastPosition,\n          position: position2\n        };\n      };\n      DraggableZone2.prototype._createUpdatedDragData = function(baseDragData) {\n        var position2 = this.state.position;\n        return {\n          position: {\n            x: position2.x + baseDragData.delta.x,\n            y: position2.y + baseDragData.delta.y\n          },\n          delta: baseDragData.delta,\n          lastPosition: position2\n        };\n      };\n      DraggableZone2.contextType = WindowContext;\n      return DraggableZone2;\n    })(React__namespace.Component)\n  );\n  var ZERO = { x: 0, y: 0 };\n  var DEFAULT_PROPS$1 = {\n    isOpen: false,\n    isDarkOverlay: true,\n    className: \"\",\n    containerClassName: \"\",\n    enableAriaHiddenSiblings: true\n  };\n  var getClassNames$9 = classNamesFunction();\n  var getMoveDelta = function(ev) {\n    var delta = 10;\n    if (ev.shiftKey) {\n      if (!ev.ctrlKey) {\n        delta = 50;\n      }\n    } else if (ev.ctrlKey) {\n      delta = 1;\n    }\n    return delta;\n  };\n  var useComponentRef$2 = function(props, focusTrapZone) {\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        focus: function() {\n          if (focusTrapZone.current) {\n            focusTrapZone.current.focus();\n          }\n        }\n      };\n    }, [focusTrapZone]);\n  };\n  var ModalBase = React__namespace.forwardRef(function(propsWithoutDefaults, ref2) {\n    var _a2, _b2, _c2, _d2, _e2;\n    var props = getPropsWithDefaults(DEFAULT_PROPS$1, propsWithoutDefaults);\n    var allowTouchBodyScroll = props.allowTouchBodyScroll, className2 = props.className, children2 = props.children, containerClassName = props.containerClassName, scrollableContentClassName = props.scrollableContentClassName, elementToFocusOnDismiss = props.elementToFocusOnDismiss, firstFocusableSelector = props.firstFocusableSelector, focusTrapZoneProps = props.focusTrapZoneProps, forceFocusInsideTrap = props.forceFocusInsideTrap, _f = props.disableRestoreFocus, disableRestoreFocus = _f === void 0 ? props.ignoreExternalFocusing : _f, isBlocking = props.isBlocking, isAlert = props.isAlert, isClickableOutsideFocusTrap = props.isClickableOutsideFocusTrap, isDarkOverlay = props.isDarkOverlay, onDismiss = props.onDismiss, layerProps = props.layerProps, overlay = props.overlay, isOpen = props.isOpen, titleAriaId = props.titleAriaId, styles = props.styles, subtitleAriaId = props.subtitleAriaId, theme = props.theme, topOffsetFixed = props.topOffsetFixed, responsiveMode = props.responsiveMode, onLayerDidMount = props.onLayerDidMount, isModeless = props.isModeless, dragOptions = props.dragOptions, onDismissed = props.onDismissed, enableAriaHiddenSiblings = props.enableAriaHiddenSiblings, popupProps = props.popupProps;\n    var rootRef = React__namespace.useRef(null);\n    var focusTrapZone = React__namespace.useRef(null);\n    var focusTrapZoneRef = useMergedRefs(focusTrapZone, focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.componentRef);\n    var focusTrapZoneElm = React__namespace.useRef(null);\n    var mergedRef = useMergedRefs(rootRef, ref2);\n    var modalResponsiveMode = useResponsiveMode(mergedRef);\n    var focusTrapZoneId = useId(\"ModalFocusTrapZone\", focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.id);\n    var win = useWindow();\n    var _g = useSetTimeout(), setTimeout2 = _g.setTimeout, clearTimeout2 = _g.clearTimeout;\n    var _h = React__namespace.useState(isOpen), isModalOpen = _h[0], setIsModalOpen = _h[1];\n    var _j = React__namespace.useState(isOpen), isVisible = _j[0], setIsVisible = _j[1];\n    var _k = React__namespace.useState(ZERO), coordinates = _k[0], setCoordinates = _k[1];\n    var _l = React__namespace.useState(), modalRectangleTop = _l[0], setModalRectangleTop = _l[1];\n    var _m = useBoolean(false), isModalMenuOpen = _m[0], _o = _m[1], toggleModalMenuOpen = _o.toggle, setModalMenuClose = _o.setFalse;\n    var internalState = useConst(function() {\n      return {\n        onModalCloseTimer: 0,\n        allowTouchBodyScroll,\n        scrollableContent: null,\n        lastSetCoordinates: ZERO,\n        events: new EventGroup({})\n      };\n    });\n    var keepInBounds = (dragOptions || {}).keepInBounds;\n    var isAlertRole = isAlert !== null && isAlert !== void 0 ? isAlert : isBlocking && !isModeless;\n    var layerClassName = layerProps === void 0 ? \"\" : layerProps.className;\n    var classNames2 = getClassNames$9(styles, {\n      theme,\n      className: className2,\n      containerClassName,\n      scrollableContentClassName,\n      isOpen,\n      isVisible,\n      hasBeenOpened: internalState.hasBeenOpened,\n      modalRectangleTop,\n      topOffsetFixed,\n      isModeless,\n      layerClassName,\n      windowInnerHeight: win === null || win === void 0 ? void 0 : win.innerHeight,\n      isDefaultDragHandle: dragOptions && !dragOptions.dragHandleSelector\n    });\n    var mergedLayerProps = __assign$1(__assign$1({ eventBubblingEnabled: false }, layerProps), { onLayerDidMount: layerProps && layerProps.onLayerDidMount ? layerProps.onLayerDidMount : onLayerDidMount, insertFirst: (layerProps === null || layerProps === void 0 ? void 0 : layerProps.insertFirst) || isModeless, className: classNames2.layer });\n    var allowScrollOnModal = React__namespace.useCallback(function(elt) {\n      if (elt) {\n        if (internalState.allowTouchBodyScroll) {\n          allowOverscrollOnElement(elt, internalState.events);\n        } else {\n          allowScrollOnElement(elt, internalState.events);\n        }\n      } else {\n        internalState.events.off(internalState.scrollableContent);\n      }\n      internalState.scrollableContent = elt;\n    }, [internalState]);\n    var registerInitialModalPosition = function() {\n      var dialogMain = focusTrapZoneElm.current;\n      var modalRectangle = dialogMain === null || dialogMain === void 0 ? void 0 : dialogMain.getBoundingClientRect();\n      if (modalRectangle) {\n        if (topOffsetFixed) {\n          setModalRectangleTop(modalRectangle.top);\n        }\n        if (keepInBounds) {\n          internalState.minPosition = { x: -modalRectangle.left, y: -modalRectangle.top };\n          internalState.maxPosition = { x: modalRectangle.left, y: modalRectangle.top };\n        }\n      }\n    };\n    var getClampedAxis = React__namespace.useCallback(function(axis, position2) {\n      var minPosition = internalState.minPosition, maxPosition = internalState.maxPosition;\n      if (keepInBounds && minPosition && maxPosition) {\n        position2 = Math.max(minPosition[axis], position2);\n        position2 = Math.min(maxPosition[axis], position2);\n      }\n      return position2;\n    }, [keepInBounds, internalState]);\n    var handleModalClose = function() {\n      var _a22;\n      internalState.lastSetCoordinates = ZERO;\n      setModalMenuClose();\n      internalState.isInKeyboardMoveMode = false;\n      setIsModalOpen(false);\n      setCoordinates(ZERO);\n      (_a22 = internalState.disposeOnKeyUp) === null || _a22 === void 0 ? void 0 : _a22.call(internalState);\n      onDismissed === null || onDismissed === void 0 ? void 0 : onDismissed();\n    };\n    var handleDragStart = React__namespace.useCallback(function() {\n      setModalMenuClose();\n      internalState.isInKeyboardMoveMode = false;\n    }, [internalState, setModalMenuClose]);\n    var handleDrag = React__namespace.useCallback(function(ev, dragData) {\n      setCoordinates(function(prevValue) {\n        return {\n          x: getClampedAxis(\"x\", prevValue.x + dragData.delta.x),\n          y: getClampedAxis(\"y\", prevValue.y + dragData.delta.y)\n        };\n      });\n    }, [getClampedAxis]);\n    var handleDragStop = React__namespace.useCallback(function() {\n      if (focusTrapZone.current) {\n        focusTrapZone.current.focus();\n      }\n    }, []);\n    var handleEnterKeyboardMoveMode = function() {\n      var handleKeyDown = function(ev) {\n        if (ev.altKey && ev.ctrlKey && ev.keyCode === KeyCodes.space) {\n          ev.preventDefault();\n          ev.stopPropagation();\n          return;\n        }\n        var newLocal = ev.altKey || ev.keyCode === KeyCodes.escape;\n        if (isModalMenuOpen && newLocal) {\n          setModalMenuClose();\n        }\n        if (internalState.isInKeyboardMoveMode && (ev.keyCode === KeyCodes.escape || ev.keyCode === KeyCodes.enter)) {\n          internalState.isInKeyboardMoveMode = false;\n          ev.preventDefault();\n          ev.stopPropagation();\n        }\n        if (internalState.isInKeyboardMoveMode) {\n          var handledEvent = true;\n          var delta_1 = getMoveDelta(ev);\n          switch (ev.keyCode) {\n            /* eslint-disable no-fallthrough */\n            case KeyCodes.escape:\n              setCoordinates(internalState.lastSetCoordinates);\n            case KeyCodes.enter: {\n              internalState.lastSetCoordinates = ZERO;\n              break;\n            }\n            case KeyCodes.up: {\n              setCoordinates(function(prevValue) {\n                return { x: prevValue.x, y: getClampedAxis(\"y\", prevValue.y - delta_1) };\n              });\n              break;\n            }\n            case KeyCodes.down: {\n              setCoordinates(function(prevValue) {\n                return { x: prevValue.x, y: getClampedAxis(\"y\", prevValue.y + delta_1) };\n              });\n              break;\n            }\n            case KeyCodes.left: {\n              setCoordinates(function(prevValue) {\n                return { x: getClampedAxis(\"x\", prevValue.x - delta_1), y: prevValue.y };\n              });\n              break;\n            }\n            case KeyCodes.right: {\n              setCoordinates(function(prevValue) {\n                return { x: getClampedAxis(\"x\", prevValue.x + delta_1), y: prevValue.y };\n              });\n              break;\n            }\n            default: {\n              handledEvent = false;\n            }\n          }\n          if (handledEvent) {\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n        }\n      };\n      internalState.lastSetCoordinates = coordinates;\n      setModalMenuClose();\n      internalState.isInKeyboardMoveMode = true;\n      internalState.events.on(\n        win,\n        \"keydown\",\n        handleKeyDown,\n        true\n        /* useCapture */\n      );\n      internalState.disposeOnKeyDown = function() {\n        internalState.events.off(\n          win,\n          \"keydown\",\n          handleKeyDown,\n          true\n          /* useCapture */\n        );\n        internalState.disposeOnKeyDown = void 0;\n      };\n    };\n    var handleExitKeyboardMoveMode = function(ev) {\n      var _a22, _b22;\n      (_a22 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.onBlur) === null || _a22 === void 0 ? void 0 : _a22.call(focusTrapZoneProps, ev);\n      internalState.lastSetCoordinates = ZERO;\n      internalState.isInKeyboardMoveMode = false;\n      (_b22 = internalState.disposeOnKeyDown) === null || _b22 === void 0 ? void 0 : _b22.call(internalState);\n    };\n    var registerForKeyUp = function() {\n      var handleKeyUp = function(ev) {\n        if (ev.altKey && ev.ctrlKey && ev.keyCode === KeyCodes.space) {\n          if (elementContains(internalState.scrollableContent, ev.target)) {\n            toggleModalMenuOpen();\n            ev.preventDefault();\n            ev.stopPropagation();\n          }\n        }\n      };\n      if (!internalState.disposeOnKeyUp) {\n        internalState.events.on(\n          win,\n          \"keyup\",\n          handleKeyUp,\n          true\n          /* useCapture */\n        );\n        internalState.disposeOnKeyUp = function() {\n          internalState.events.off(\n            win,\n            \"keyup\",\n            handleKeyUp,\n            true\n            /* useCapture */\n          );\n          internalState.disposeOnKeyUp = void 0;\n        };\n      }\n    };\n    React__namespace.useEffect(function() {\n      clearTimeout2(internalState.onModalCloseTimer);\n      if (isOpen) {\n        requestAnimationFrame(function() {\n          return setTimeout2(registerInitialModalPosition, 0);\n        });\n        setIsModalOpen(true);\n        if (dragOptions) {\n          registerForKeyUp();\n        }\n        internalState.hasBeenOpened = true;\n        setIsVisible(true);\n      }\n      if (!isOpen && isModalOpen) {\n        internalState.onModalCloseTimer = setTimeout2(handleModalClose, parseFloat(animationDuration) * 1e3);\n        setIsVisible(false);\n      }\n    }, [isModalOpen, isOpen]);\n    useUnmount(function() {\n      internalState.events.dispose();\n      if (internalState.onModalCloseTimer) {\n        clearTimeout2(internalState.onModalCloseTimer);\n        internalState.onModalCloseTimer = 0;\n      }\n    });\n    useComponentRef$2(props, focusTrapZone);\n    var modalContent = React__namespace.createElement(\n      FocusTrapZone,\n      __assign$1({}, focusTrapZoneProps, {\n        id: focusTrapZoneId,\n        ref: focusTrapZoneElm,\n        componentRef: focusTrapZoneRef,\n        className: css(classNames2.main, focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.className),\n        elementToFocusOnDismiss: (_a2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.elementToFocusOnDismiss) !== null && _a2 !== void 0 ? _a2 : elementToFocusOnDismiss,\n        isClickableOutsideFocusTrap: (_b2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.isClickableOutsideFocusTrap) !== null && _b2 !== void 0 ? _b2 : isModeless || isClickableOutsideFocusTrap || !isBlocking,\n        disableRestoreFocus: (_c2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.disableRestoreFocus) !== null && _c2 !== void 0 ? _c2 : disableRestoreFocus,\n        forceFocusInsideTrap: ((_d2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.forceFocusInsideTrap) !== null && _d2 !== void 0 ? _d2 : forceFocusInsideTrap) && !isModeless,\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        firstFocusableSelector: (focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.firstFocusableSelector) || firstFocusableSelector,\n        focusPreviouslyFocusedInnerElement: (_e2 = focusTrapZoneProps === null || focusTrapZoneProps === void 0 ? void 0 : focusTrapZoneProps.focusPreviouslyFocusedInnerElement) !== null && _e2 !== void 0 ? _e2 : true,\n        onBlur: internalState.isInKeyboardMoveMode ? handleExitKeyboardMoveMode : void 0\n      }),\n      dragOptions && internalState.isInKeyboardMoveMode && React__namespace.createElement(\"div\", { className: classNames2.keyboardMoveIconContainer }, dragOptions.keyboardMoveIconProps ? React__namespace.createElement(Icon, __assign$1({}, dragOptions.keyboardMoveIconProps)) : React__namespace.createElement(Icon, { iconName: \"move\", className: classNames2.keyboardMoveIcon })),\n      React__namespace.createElement(\n        \"div\",\n        { ref: allowScrollOnModal, className: classNames2.scrollableContent, \"data-is-scrollable\": true },\n        dragOptions && isModalMenuOpen && React__namespace.createElement(dragOptions.menu, { items: [\n          { key: \"move\", text: dragOptions.moveMenuItemText, onClick: handleEnterKeyboardMoveMode },\n          { key: \"close\", text: dragOptions.closeMenuItemText, onClick: handleModalClose }\n        ], onDismiss: setModalMenuClose, alignTargetEdge: true, coverTarget: true, directionalHint: DirectionalHint.topLeftEdge, directionalHintFixed: true, shouldFocusOnMount: true, target: internalState.scrollableContent }),\n        children2\n      )\n    );\n    return isModalOpen && modalResponsiveMode >= (responsiveMode || ResponsiveMode.small) && React__namespace.createElement(\n      Layer,\n      __assign$1({ ref: mergedRef }, mergedLayerProps),\n      React__namespace.createElement(\n        Popup,\n        __assign$1({\n          role: isAlertRole ? \"alertdialog\" : \"dialog\",\n          ariaLabelledBy: titleAriaId,\n          ariaDescribedBy: subtitleAriaId,\n          onDismiss,\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          shouldRestoreFocus: !disableRestoreFocus,\n          // Modeless modals shouldn't hide siblings.\n          // Popup will automatically handle this based on the aria-modal setting.\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          enableAriaHiddenSiblings,\n          \"aria-modal\": !isModeless\n        }, popupProps),\n        React__namespace.createElement(\n          \"div\",\n          { className: classNames2.root, role: !isModeless ? \"document\" : void 0 },\n          !isModeless && React__namespace.createElement(Overlay, __assign$1({ \"aria-hidden\": true, isDarkThemed: isDarkOverlay, onClick: isBlocking ? void 0 : onDismiss, allowTouchBodyScroll }, overlay)),\n          dragOptions ? React__namespace.createElement(DraggableZone, { handleSelector: dragOptions.dragHandleSelector || \"#\".concat(focusTrapZoneId), preventDragSelector: \"button\", onStart: handleDragStart, onDragChange: handleDrag, onStop: handleDragStop, position: coordinates }, modalContent) : modalContent\n        )\n      )\n    ) || null;\n  });\n  ModalBase.displayName = \"Modal\";\n  var Modal = styled(ModalBase, getStyles$a, void 0, {\n    scope: \"Modal\",\n    fields: [\"theme\", \"styles\", \"enableAriaHiddenSiblings\"]\n  });\n  Modal.displayName = \"Modal\";\n  var getClassNames$8 = classNamesFunction();\n  var DialogFooterBase = (\n    /** @class */\n    (function(_super) {\n      __extends(DialogFooterBase2, _super);\n      function DialogFooterBase2(props) {\n        var _this = _super.call(this, props) || this;\n        initializeComponentRef(_this);\n        return _this;\n      }\n      DialogFooterBase2.prototype.render = function() {\n        var _a2 = this.props, className2 = _a2.className, styles = _a2.styles, theme = _a2.theme;\n        this._classNames = getClassNames$8(styles, {\n          theme,\n          className: className2\n        });\n        return React__namespace.createElement(\n          \"div\",\n          { className: this._classNames.actions },\n          React__namespace.createElement(\"div\", { className: this._classNames.actionsRight }, this._renderChildrenAsActions())\n        );\n      };\n      DialogFooterBase2.prototype._renderChildrenAsActions = function() {\n        var _this = this;\n        return React__namespace.Children.map(this.props.children, function(child) {\n          return child ? React__namespace.createElement(\"span\", { className: _this._classNames.action }, child) : null;\n        });\n      };\n      return DialogFooterBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$6 = {\n    actions: \"ms-Dialog-actions\",\n    action: \"ms-Dialog-action\",\n    actionsRight: \"ms-Dialog-actionsRight\"\n  };\n  var getStyles$8 = function(props) {\n    var className2 = props.className, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$6, theme);\n    return {\n      actions: [\n        classNames2.actions,\n        {\n          position: \"relative\",\n          width: \"100%\",\n          minHeight: \"24px\",\n          lineHeight: \"24px\",\n          margin: \"16px 0 0\",\n          fontSize: \"0\",\n          selectors: {\n            \".ms-Button\": {\n              lineHeight: \"normal\",\n              verticalAlign: \"middle\"\n            }\n          }\n        },\n        className2\n      ],\n      action: [\n        classNames2.action,\n        {\n          margin: \"0 4px\"\n        }\n      ],\n      actionsRight: [\n        classNames2.actionsRight,\n        {\n          alignItems: \"center\",\n          display: \"flex\",\n          fontSize: \"0\",\n          justifyContent: \"flex-end\",\n          marginRight: \"-4px\"\n        }\n      ]\n    };\n  };\n  var DialogFooter = styled(DialogFooterBase, getStyles$8, void 0, { scope: \"DialogFooter\" });\n  DialogFooter.displayName = \"DialogFooter\";\n  var getClassNames$7 = classNamesFunction();\n  var DialogFooterType = React__namespace.createElement(DialogFooter, null).type;\n  var DialogContentBase = (\n    /** @class */\n    (function(_super) {\n      __extends(DialogContentBase2, _super);\n      function DialogContentBase2(props) {\n        var _this = _super.call(this, props) || this;\n        initializeComponentRef(_this);\n        return _this;\n      }\n      DialogContentBase2.prototype.render = function() {\n        var _a2 = this.props, showCloseButton = _a2.showCloseButton, className2 = _a2.className, closeButtonAriaLabel = _a2.closeButtonAriaLabel, onDismiss = _a2.onDismiss, subTextId = _a2.subTextId, subText = _a2.subText, _b2 = _a2.titleProps, titleProps = _b2 === void 0 ? {} : _b2, titleId = _a2.titleId, title = _a2.title, type2 = _a2.type, styles = _a2.styles, theme = _a2.theme, draggableHeaderClassName = _a2.draggableHeaderClassName;\n        var classNames2 = getClassNames$7(styles, {\n          theme,\n          className: className2,\n          isLargeHeader: type2 === DialogType.largeHeader,\n          isClose: type2 === DialogType.close,\n          draggableHeaderClassName\n        });\n        var groupings = this._groupChildren();\n        var subTextContent;\n        if (subText) {\n          subTextContent = React__namespace.createElement(\"p\", { className: classNames2.subText, id: subTextId }, subText);\n        }\n        return React__namespace.createElement(\n          \"div\",\n          { className: classNames2.content },\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.header },\n            React__namespace.createElement(\"div\", __assign$1({ id: titleId, role: \"heading\", \"aria-level\": 1 }, titleProps, { className: css(classNames2.title, titleProps.className) }), title),\n            React__namespace.createElement(\n              \"div\",\n              { className: classNames2.topButton },\n              this.props.topButtonsProps.map(function(props, index2) {\n                return React__namespace.createElement(IconButton, __assign$1({ key: props.uniqueId || index2 }, props));\n              }),\n              (type2 === DialogType.close || showCloseButton && type2 !== DialogType.largeHeader) && React__namespace.createElement(IconButton, { className: classNames2.button, iconProps: { iconName: \"Cancel\" }, ariaLabel: closeButtonAriaLabel, onClick: onDismiss })\n            )\n          ),\n          React__namespace.createElement(\n            \"div\",\n            { className: classNames2.inner },\n            React__namespace.createElement(\n              \"div\",\n              { className: classNames2.innerContent },\n              subTextContent,\n              groupings.contents\n            ),\n            groupings.footers\n          )\n        );\n      };\n      DialogContentBase2.prototype._groupChildren = function() {\n        var groupings = {\n          footers: [],\n          contents: []\n        };\n        React__namespace.Children.map(this.props.children, function(child) {\n          if (typeof child === \"object\" && child !== null && child.type === DialogFooterType) {\n            groupings.footers.push(child);\n          } else {\n            groupings.contents.push(child);\n          }\n        });\n        return groupings;\n      };\n      DialogContentBase2.defaultProps = {\n        showCloseButton: false,\n        className: \"\",\n        topButtonsProps: [],\n        closeButtonAriaLabel: \"Close\"\n      };\n      DialogContentBase2 = __decorate([\n        withResponsiveMode\n      ], DialogContentBase2);\n      return DialogContentBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$5 = {\n    contentLgHeader: \"ms-Dialog-lgHeader\",\n    close: \"ms-Dialog--close\",\n    subText: \"ms-Dialog-subText\",\n    header: \"ms-Dialog-header\",\n    headerLg: \"ms-Dialog--lgHeader\",\n    button: \"ms-Dialog-button ms-Dialog-button--close\",\n    inner: \"ms-Dialog-inner\",\n    content: \"ms-Dialog-content\",\n    title: \"ms-Dialog-title\"\n  };\n  var getStyles$7 = function(props) {\n    var _a2, _b2, _c2;\n    var className2 = props.className, theme = props.theme, isLargeHeader = props.isLargeHeader, isClose = props.isClose, hidden = props.hidden, isMultiline = props.isMultiline, draggableHeaderClassName = props.draggableHeaderClassName;\n    var palette = theme.palette, fonts = theme.fonts, effects = theme.effects, semanticColors = theme.semanticColors;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$5, theme);\n    return {\n      content: [\n        isLargeHeader && [\n          classNames2.contentLgHeader,\n          {\n            borderTop: \"4px solid \".concat(palette.themePrimary)\n          }\n        ],\n        isClose && classNames2.close,\n        {\n          flexGrow: 1,\n          overflowY: \"hidden\"\n          // required for allowScrollOnElement\n        },\n        className2\n      ],\n      subText: [\n        classNames2.subText,\n        fonts.medium,\n        {\n          margin: \"0 0 24px 0\",\n          color: semanticColors.bodySubtext,\n          lineHeight: \"1.5\",\n          wordWrap: \"break-word\",\n          fontWeight: FontWeights.regular\n        }\n      ],\n      header: [\n        classNames2.header,\n        {\n          position: \"relative\",\n          width: \"100%\",\n          boxSizing: \"border-box\"\n        },\n        isClose && classNames2.close,\n        draggableHeaderClassName && [\n          draggableHeaderClassName,\n          {\n            cursor: \"move\"\n          }\n        ]\n      ],\n      button: [\n        classNames2.button,\n        hidden && {\n          selectors: {\n            \".ms-Icon.ms-Icon--Cancel\": {\n              color: semanticColors.buttonText,\n              fontSize: IconFontSizes.medium\n            }\n          }\n        }\n      ],\n      inner: [\n        classNames2.inner,\n        {\n          padding: \"0 24px 24px\",\n          selectors: (_a2 = {}, _a2[\"@media (min-width: \".concat(ScreenWidthMinSmall, \"px) and (max-width: \").concat(ScreenWidthMaxSmall, \"px)\")] = {\n            padding: \"0 16px 16px\"\n          }, _a2)\n        }\n      ],\n      innerContent: [\n        classNames2.content,\n        {\n          position: \"relative\",\n          width: \"100%\"\n        }\n      ],\n      title: [\n        classNames2.title,\n        fonts.xLarge,\n        {\n          color: semanticColors.bodyText,\n          margin: \"0\",\n          minHeight: fonts.xLarge.fontSize,\n          padding: \"16px 46px 20px 24px\",\n          lineHeight: \"normal\",\n          selectors: (_b2 = {}, _b2[\"@media (min-width: \".concat(ScreenWidthMinSmall, \"px) and (max-width: \").concat(ScreenWidthMaxSmall, \"px)\")] = {\n            padding: \"16px 46px 16px 16px\"\n          }, _b2)\n        },\n        isLargeHeader && {\n          color: semanticColors.menuHeader\n        },\n        isMultiline && { fontSize: fonts.xxLarge.fontSize }\n      ],\n      topButton: [\n        {\n          display: \"flex\",\n          flexDirection: \"row\",\n          flexWrap: \"nowrap\",\n          position: \"absolute\",\n          top: \"0\",\n          right: \"0\",\n          padding: \"15px 15px 0 0\",\n          selectors: (_c2 = {\n            \"> *\": {\n              flex: \"0 0 auto\"\n            },\n            \".ms-Dialog-button\": {\n              color: semanticColors.buttonText\n            },\n            \".ms-Dialog-button:hover\": {\n              color: semanticColors.buttonTextHovered,\n              borderRadius: effects.roundedCorner2\n            }\n          }, _c2[\"@media (min-width: \".concat(ScreenWidthMinSmall, \"px) and (max-width: \").concat(ScreenWidthMaxSmall, \"px)\")] = {\n            padding: \"15px 8px 0 0\"\n          }, _c2)\n        }\n      ]\n    };\n  };\n  var DialogContent = styled(DialogContentBase, getStyles$7, void 0, { scope: \"DialogContent\" });\n  DialogContent.displayName = \"DialogContent\";\n  var getClassNames$6 = classNamesFunction();\n  var DefaultModalProps = {\n    isDarkOverlay: false,\n    isBlocking: false,\n    className: \"\",\n    containerClassName: \"\",\n    topOffsetFixed: false,\n    enableAriaHiddenSiblings: true\n  };\n  var DefaultDialogContentProps = {\n    type: DialogType.normal,\n    className: \"\",\n    topButtonsProps: []\n  };\n  var DialogBase = (\n    /** @class */\n    (function(_super) {\n      __extends(DialogBase2, _super);\n      function DialogBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._getSubTextId = function() {\n          var _a2 = _this.props, ariaDescribedById = _a2.ariaDescribedById, modalProps = _a2.modalProps, dialogContentProps = _a2.dialogContentProps, subText = _a2.subText;\n          var id2 = modalProps && modalProps.subtitleAriaId || ariaDescribedById;\n          if (!id2) {\n            id2 = (dialogContentProps && dialogContentProps.subText || subText) && _this._defaultSubTextId;\n          }\n          return id2;\n        };\n        _this._getTitleTextId = function() {\n          var _a2 = _this.props, ariaLabelledById = _a2.ariaLabelledById, modalProps = _a2.modalProps, dialogContentProps = _a2.dialogContentProps, title = _a2.title;\n          var id2 = modalProps && modalProps.titleAriaId || ariaLabelledById;\n          if (!id2) {\n            id2 = (dialogContentProps && dialogContentProps.title || title) && _this._defaultTitleTextId;\n          }\n          return id2;\n        };\n        _this._id = getId(\"Dialog\");\n        _this._defaultTitleTextId = _this._id + \"-title\";\n        _this._defaultSubTextId = _this._id + \"-subText\";\n        return _this;\n      }\n      DialogBase2.prototype.render = function() {\n        var _a2, _b2, _c2;\n        var props = this.props;\n        var className2 = props.className, containerClassName = props.containerClassName, contentClassName = props.contentClassName, elementToFocusOnDismiss = props.elementToFocusOnDismiss, firstFocusableSelector = props.firstFocusableSelector, forceFocusInsideTrap = props.forceFocusInsideTrap, styles = props.styles, hidden = props.hidden, _d2 = props.disableRestoreFocus, disableRestoreFocus = _d2 === void 0 ? props.ignoreExternalFocusing : _d2, isBlocking = props.isBlocking, isClickableOutsideFocusTrap = props.isClickableOutsideFocusTrap, isDarkOverlay = props.isDarkOverlay, _e2 = props.isOpen, isOpen = _e2 === void 0 ? !hidden : _e2, onDismiss = props.onDismiss, onDismissed = props.onDismissed, onLayerDidMount = props.onLayerDidMount, responsiveMode = props.responsiveMode, subText = props.subText, theme = props.theme, title = props.title, topButtonsProps = props.topButtonsProps, type2 = props.type, minWidth2 = props.minWidth, maxWidth = props.maxWidth, modalProps = props.modalProps;\n        var mergedLayerProps = __assign$1({ onLayerDidMount }, modalProps === null || modalProps === void 0 ? void 0 : modalProps.layerProps);\n        var dialogDraggableClassName;\n        var dragOptions;\n        if ((modalProps === null || modalProps === void 0 ? void 0 : modalProps.dragOptions) && !((_a2 = modalProps.dragOptions) === null || _a2 === void 0 ? void 0 : _a2.dragHandleSelector)) {\n          dragOptions = __assign$1({}, modalProps.dragOptions);\n          dialogDraggableClassName = \"ms-Dialog-draggable-header\";\n          dragOptions.dragHandleSelector = \".\".concat(dialogDraggableClassName);\n        }\n        var mergedModalProps = __assign$1(__assign$1(__assign$1(__assign$1({}, DefaultModalProps), { elementToFocusOnDismiss, firstFocusableSelector, forceFocusInsideTrap, disableRestoreFocus, isClickableOutsideFocusTrap, responsiveMode, className: className2, containerClassName, isBlocking, isDarkOverlay, onDismissed }), modalProps), { dragOptions, layerProps: mergedLayerProps, isOpen });\n        var dialogContentProps = __assign$1(__assign$1(__assign$1({ className: contentClassName, subText, title, topButtonsProps, type: type2 }, DefaultDialogContentProps), props.dialogContentProps), { draggableHeaderClassName: dialogDraggableClassName, titleProps: __assign$1({\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          id: ((_b2 = props.dialogContentProps) === null || _b2 === void 0 ? void 0 : _b2.titleId) || this._defaultTitleTextId\n        }, (_c2 = props.dialogContentProps) === null || _c2 === void 0 ? void 0 : _c2.titleProps) });\n        var classNames2 = getClassNames$6(styles, {\n          theme,\n          className: mergedModalProps.className,\n          containerClassName: mergedModalProps.containerClassName,\n          hidden,\n          dialogDefaultMinWidth: minWidth2,\n          dialogDefaultMaxWidth: maxWidth\n        });\n        return React__namespace.createElement(\n          Modal,\n          __assign$1({}, mergedModalProps, { className: classNames2.root, containerClassName: classNames2.main, onDismiss: onDismiss || mergedModalProps.onDismiss, subtitleAriaId: this._getSubTextId(), titleAriaId: this._getTitleTextId() }),\n          React__namespace.createElement(DialogContent, __assign$1({ subTextId: this._defaultSubTextId, showCloseButton: mergedModalProps.isBlocking, onDismiss }, dialogContentProps), props.children)\n        );\n      };\n      DialogBase2.defaultProps = {\n        hidden: true\n      };\n      DialogBase2 = __decorate([\n        withResponsiveMode\n      ], DialogBase2);\n      return DialogBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames$4 = {\n    root: \"ms-Dialog\"\n  };\n  var getStyles$6 = function(props) {\n    var _a2;\n    var className2 = props.className, containerClassName = props.containerClassName, _b2 = props.dialogDefaultMinWidth, dialogDefaultMinWidth = _b2 === void 0 ? \"288px\" : _b2, _c2 = props.dialogDefaultMaxWidth, dialogDefaultMaxWidth = _c2 === void 0 ? \"340px\" : _c2, hidden = props.hidden, theme = props.theme;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$4, theme);\n    return {\n      root: [classNames2.root, theme.fonts.medium, className2],\n      main: [\n        {\n          width: dialogDefaultMinWidth,\n          outline: \"3px solid transparent\",\n          selectors: (_a2 = {}, _a2[\"@media (min-width: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n            width: \"auto\",\n            maxWidth: dialogDefaultMaxWidth,\n            minWidth: dialogDefaultMinWidth\n          }, _a2)\n        },\n        !hidden && { display: \"flex\" },\n        containerClassName\n      ]\n    };\n  };\n  var Dialog = styled(DialogBase, getStyles$6, void 0, { scope: \"Dialog\" });\n  Dialog.displayName = \"Dialog\";\n  var DropdownSizePosCache = (\n    /** @class */\n    (function() {\n      function DropdownSizePosCache2() {\n        this._size = 0;\n      }\n      DropdownSizePosCache2.prototype.updateOptions = function(options2) {\n        var displayOnlyOptionsCache = [];\n        var notSelectableOptionsCache = [];\n        var size = 0;\n        for (var i = 0; i < options2.length; i++) {\n          var _a2 = options2[i], itemType = _a2.itemType, hidden = _a2.hidden;\n          if (itemType === SelectableOptionMenuItemType.Divider || itemType === SelectableOptionMenuItemType.Header) {\n            displayOnlyOptionsCache.push(i);\n            notSelectableOptionsCache.push(i);\n          } else if (hidden) {\n            notSelectableOptionsCache.push(i);\n          } else {\n            size++;\n          }\n        }\n        this._size = size;\n        this._displayOnlyOptionsCache = displayOnlyOptionsCache;\n        this._notSelectableOptionsCache = notSelectableOptionsCache;\n        this._cachedOptions = __spreadArray([], options2, true);\n      };\n      Object.defineProperty(DropdownSizePosCache2.prototype, \"optionSetSize\", {\n        /**\n         * The size of all the selectable options.\n         */\n        get: function() {\n          return this._size;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(DropdownSizePosCache2.prototype, \"cachedOptions\", {\n        /**\n         * The chached options array.\n         */\n        get: function() {\n          return this._cachedOptions;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      DropdownSizePosCache2.prototype.positionInSet = function(index2) {\n        if (index2 === void 0) {\n          return void 0;\n        }\n        var offset2 = 0;\n        while (index2 > this._notSelectableOptionsCache[offset2]) {\n          offset2++;\n        }\n        if (this._displayOnlyOptionsCache[offset2] === index2) {\n          throw new Error(\"Unexpected: Option at index \".concat(index2, \" is not a selectable element.\"));\n        }\n        if (this._notSelectableOptionsCache[offset2] === index2) {\n          return void 0;\n        }\n        return index2 - offset2 + 1;\n      };\n      return DropdownSizePosCache2;\n    })()\n  );\n  var PanelType;\n  (function(PanelType2) {\n    PanelType2[PanelType2[\"smallFluid\"] = 0] = \"smallFluid\";\n    PanelType2[PanelType2[\"smallFixedFar\"] = 1] = \"smallFixedFar\";\n    PanelType2[PanelType2[\"smallFixedNear\"] = 2] = \"smallFixedNear\";\n    PanelType2[PanelType2[\"medium\"] = 3] = \"medium\";\n    PanelType2[PanelType2[\"large\"] = 4] = \"large\";\n    PanelType2[PanelType2[\"largeFixed\"] = 5] = \"largeFixed\";\n    PanelType2[PanelType2[\"extraLarge\"] = 6] = \"extraLarge\";\n    PanelType2[PanelType2[\"custom\"] = 7] = \"custom\";\n    PanelType2[PanelType2[\"customNear\"] = 8] = \"customNear\";\n  })(PanelType || (PanelType = {}));\n  var getClassNames$5 = classNamesFunction();\n  var PanelVisibilityState;\n  (function(PanelVisibilityState2) {\n    PanelVisibilityState2[PanelVisibilityState2[\"closed\"] = 0] = \"closed\";\n    PanelVisibilityState2[PanelVisibilityState2[\"animatingOpen\"] = 1] = \"animatingOpen\";\n    PanelVisibilityState2[PanelVisibilityState2[\"open\"] = 2] = \"open\";\n    PanelVisibilityState2[PanelVisibilityState2[\"animatingClosed\"] = 3] = \"animatingClosed\";\n  })(PanelVisibilityState || (PanelVisibilityState = {}));\n  var PanelBase = (\n    /** @class */\n    (function(_super) {\n      __extends(PanelBase2, _super);\n      function PanelBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._panel = React__namespace.createRef();\n        _this._animationCallback = null;\n        _this._hasCustomNavigation = !!(_this.props.onRenderNavigation || _this.props.onRenderNavigationContent);\n        _this.dismiss = function(ev) {\n          if (_this.props.onDismiss && _this.isActive) {\n            _this.props.onDismiss(ev);\n          }\n          if (!ev || ev && !ev.defaultPrevented) {\n            _this.close();\n          }\n        };\n        _this._allowScrollOnPanel = function(elt) {\n          var _a3;\n          _this._resizeObserver = _this._createResizeObserver(function(entries) {\n            if (entries.length > 0 && entries[0].target === elt) {\n              _this._updateFooterPosition();\n            }\n          });\n          if (elt) {\n            (_a3 = _this._resizeObserver) === null || _a3 === void 0 ? void 0 : _a3.observe(elt);\n            if (_this._allowTouchBodyScroll) {\n              allowOverscrollOnElement(elt, _this._events);\n            } else {\n              allowScrollOnElement(elt, _this._events);\n            }\n          } else {\n            _this._events.off(_this._scrollableContent);\n          }\n          _this._scrollableContent = elt;\n        };\n        _this._onRenderNavigation = function(props2) {\n          if (!_this.props.onRenderNavigationContent && !_this.props.onRenderNavigation && !_this.props.hasCloseButton) {\n            return null;\n          }\n          var _a3 = _this.props.onRenderNavigationContent, onRenderNavigationContent = _a3 === void 0 ? _this._onRenderNavigationContent : _a3;\n          return React__namespace.createElement(\"div\", { className: _this._classNames.navigation }, onRenderNavigationContent(props2, _this._onRenderNavigationContent));\n        };\n        _this._onRenderNavigationContent = function(props2) {\n          var _a3;\n          var closeButtonAriaLabel = props2.closeButtonAriaLabel, hasCloseButton = props2.hasCloseButton, _b2 = props2.onRenderHeader, onRenderHeader = _b2 === void 0 ? _this._onRenderHeader : _b2;\n          if (hasCloseButton) {\n            var iconButtonStyles = (_a3 = _this._classNames.subComponentStyles) === null || _a3 === void 0 ? void 0 : _a3.closeButton();\n            return React__namespace.createElement(\n              React__namespace.Fragment,\n              null,\n              !_this._hasCustomNavigation && onRenderHeader(_this.props, _this._onRenderHeader, _this._headerTextId),\n              React__namespace.createElement(IconButton, { styles: iconButtonStyles, className: _this._classNames.closeButton, onClick: _this._onPanelClick, ariaLabel: closeButtonAriaLabel, title: closeButtonAriaLabel, \"data-is-visible\": true, iconProps: { iconName: \"Cancel\" } })\n            );\n          }\n          return null;\n        };\n        _this._onRenderHeader = function(props2, defaultRender, headerTextId) {\n          var headerText = props2.headerText, _a3 = props2.headerTextProps, headerTextProps = _a3 === void 0 ? {} : _a3;\n          if (headerText) {\n            return React__namespace.createElement(\n              \"div\",\n              { className: _this._classNames.header },\n              React__namespace.createElement(\"div\", __assign$1({ id: headerTextId, role: \"heading\", \"aria-level\": 1 }, headerTextProps, { className: css(_this._classNames.headerText, headerTextProps.className) }), headerText)\n            );\n          }\n          return null;\n        };\n        _this._onRenderBody = function(props2) {\n          return React__namespace.createElement(\"div\", { className: _this._classNames.content }, props2.children);\n        };\n        _this._onRenderFooter = function(props2) {\n          var _a3 = _this.props.onRenderFooterContent, onRenderFooterContent = _a3 === void 0 ? null : _a3;\n          if (onRenderFooterContent) {\n            return React__namespace.createElement(\n              \"div\",\n              { className: _this._classNames.footer },\n              React__namespace.createElement(\"div\", { className: _this._classNames.footerInner }, onRenderFooterContent())\n            );\n          }\n          return null;\n        };\n        _this._animateTo = function(newVisibilityState) {\n          if (newVisibilityState === PanelVisibilityState.open && _this.props.onOpen) {\n            _this.props.onOpen();\n          }\n          _this._animationCallback = _this._async.setTimeout(function() {\n            _this.setState({ visibility: newVisibilityState });\n            _this._onTransitionComplete(newVisibilityState);\n          }, 200);\n        };\n        _this._clearExistingAnimationTimer = function() {\n          if (_this._animationCallback !== null) {\n            _this._async.clearTimeout(_this._animationCallback);\n          }\n        };\n        _this._onPanelClick = function(ev) {\n          _this.dismiss(ev);\n        };\n        _this._onTransitionComplete = function(newVisibilityState) {\n          _this._updateFooterPosition();\n          if (newVisibilityState === PanelVisibilityState.open && _this.props.onOpened) {\n            _this.props.onOpened();\n          }\n          if (newVisibilityState === PanelVisibilityState.closed && _this.props.onDismissed) {\n            _this.props.onDismissed();\n          }\n        };\n        var _a2 = _this.props.allowTouchBodyScroll, allowTouchBodyScroll = _a2 === void 0 ? false : _a2;\n        _this._allowTouchBodyScroll = allowTouchBodyScroll;\n        initializeComponentRef(_this);\n        _this.state = {\n          isFooterSticky: false,\n          // intentionally ignore props so animation takes place during componentDidMount\n          visibility: PanelVisibilityState.closed,\n          id: getId(\"Panel\")\n        };\n        return _this;\n      }\n      PanelBase2.getDerivedStateFromProps = function(nextProps, prevState) {\n        if (nextProps.isOpen === void 0) {\n          return null;\n        }\n        if (nextProps.isOpen && (prevState.visibility === PanelVisibilityState.closed || prevState.visibility === PanelVisibilityState.animatingClosed)) {\n          return { visibility: PanelVisibilityState.animatingOpen };\n        }\n        if (!nextProps.isOpen && (prevState.visibility === PanelVisibilityState.open || prevState.visibility === PanelVisibilityState.animatingOpen)) {\n          return { visibility: PanelVisibilityState.animatingClosed };\n        }\n        return null;\n      };\n      PanelBase2.prototype.componentDidMount = function() {\n        this._async = new Async(this);\n        this._events = new EventGroup(this);\n        var win = getWindowEx(this.context);\n        var doc = getDocumentEx(this.context);\n        this._events.on(win, \"resize\", this._updateFooterPosition);\n        if (this._shouldListenForOuterClick(this.props)) {\n          this._events.on(doc === null || doc === void 0 ? void 0 : doc.body, \"mousedown\", this._dismissOnOuterClick, true);\n        }\n        if (this.props.isOpen) {\n          this.setState({ visibility: PanelVisibilityState.animatingOpen });\n        }\n      };\n      PanelBase2.prototype.componentDidUpdate = function(previousProps, previousState) {\n        var shouldListenOnOuterClick = this._shouldListenForOuterClick(this.props);\n        var previousShouldListenOnOuterClick = this._shouldListenForOuterClick(previousProps);\n        if (this.state.visibility !== previousState.visibility) {\n          this._clearExistingAnimationTimer();\n          if (this.state.visibility === PanelVisibilityState.animatingOpen) {\n            this._animateTo(PanelVisibilityState.open);\n          } else if (this.state.visibility === PanelVisibilityState.animatingClosed) {\n            this._animateTo(PanelVisibilityState.closed);\n          }\n        }\n        var doc = getDocumentEx(this.context);\n        if (shouldListenOnOuterClick && !previousShouldListenOnOuterClick) {\n          this._events.on(doc === null || doc === void 0 ? void 0 : doc.body, \"mousedown\", this._dismissOnOuterClick, true);\n        } else if (!shouldListenOnOuterClick && previousShouldListenOnOuterClick) {\n          this._events.off(doc === null || doc === void 0 ? void 0 : doc.body, \"mousedown\", this._dismissOnOuterClick, true);\n        }\n      };\n      PanelBase2.prototype.componentWillUnmount = function() {\n        var _a2;\n        this._async.dispose();\n        this._events.dispose();\n        (_a2 = this._resizeObserver) === null || _a2 === void 0 ? void 0 : _a2.disconnect();\n      };\n      PanelBase2.prototype.render = function() {\n        var _a2 = this.props, _b2 = _a2.className, className2 = _b2 === void 0 ? \"\" : _b2, elementToFocusOnDismiss = _a2.elementToFocusOnDismiss, firstFocusableSelector = _a2.firstFocusableSelector, focusTrapZoneProps = _a2.focusTrapZoneProps, forceFocusInsideTrap = _a2.forceFocusInsideTrap, hasCloseButton = _a2.hasCloseButton, headerText = _a2.headerText, _c2 = _a2.headerClassName, headerClassName = _c2 === void 0 ? \"\" : _c2, ignoreExternalFocusing = _a2.ignoreExternalFocusing, isBlocking = _a2.isBlocking, isFooterAtBottom = _a2.isFooterAtBottom, isLightDismiss = _a2.isLightDismiss, isHiddenOnDismiss = _a2.isHiddenOnDismiss, layerProps = _a2.layerProps, overlayProps = _a2.overlayProps, popupProps = _a2.popupProps, type2 = _a2.type, styles = _a2.styles, theme = _a2.theme, customWidth = _a2.customWidth, _d2 = _a2.onLightDismissClick, onLightDismissClick = _d2 === void 0 ? this._onPanelClick : _d2, _e2 = _a2.onRenderNavigation, onRenderNavigation = _e2 === void 0 ? this._onRenderNavigation : _e2, _f = _a2.onRenderHeader, onRenderHeader = _f === void 0 ? this._onRenderHeader : _f, _g = _a2.onRenderBody, onRenderBody = _g === void 0 ? this._onRenderBody : _g, _h = _a2.onRenderFooter, onRenderFooter = _h === void 0 ? this._onRenderFooter : _h;\n        var _j = this.state, isFooterSticky = _j.isFooterSticky, visibility = _j.visibility, id2 = _j.id;\n        var isLeft = type2 === PanelType.smallFixedNear || type2 === PanelType.customNear ? true : false;\n        var isRTL = getRTL(theme);\n        var isOnRightSide = isRTL ? isLeft : !isLeft;\n        var customWidthStyles = type2 === PanelType.custom || type2 === PanelType.customNear ? { width: customWidth } : {};\n        var nativeProps = getNativeProps(this.props, divProperties);\n        var isOpen = this.isActive;\n        var isAnimating = visibility === PanelVisibilityState.animatingClosed || visibility === PanelVisibilityState.animatingOpen;\n        this._headerTextId = headerText && id2 + \"-headerText\";\n        if (!isOpen && !isAnimating && !isHiddenOnDismiss) {\n          return null;\n        }\n        this._classNames = getClassNames$5(styles, {\n          theme,\n          className: className2,\n          focusTrapZoneClassName: focusTrapZoneProps ? focusTrapZoneProps.className : void 0,\n          hasCloseButton,\n          headerClassName,\n          isAnimating,\n          isFooterSticky,\n          isFooterAtBottom,\n          isOnRightSide,\n          isOpen,\n          isHiddenOnDismiss,\n          type: type2,\n          hasCustomNavigation: this._hasCustomNavigation\n        });\n        var _k = this, _classNames = _k._classNames, _allowTouchBodyScroll = _k._allowTouchBodyScroll;\n        var overlay;\n        if (isBlocking && isOpen) {\n          overlay = React__namespace.createElement(Overlay, __assign$1({ className: _classNames.overlay, isDarkThemed: false, onClick: isLightDismiss ? onLightDismissClick : void 0, allowTouchBodyScroll: _allowTouchBodyScroll }, overlayProps));\n        }\n        return React__namespace.createElement(\n          Layer,\n          __assign$1({}, layerProps),\n          React__namespace.createElement(\n            Popup,\n            __assign$1({ role: \"dialog\", \"aria-modal\": isBlocking ? \"true\" : void 0, ariaLabelledBy: this._headerTextId ? this._headerTextId : void 0, onDismiss: this.dismiss, className: _classNames.hiddenPanel, enableAriaHiddenSiblings: isOpen ? true : false }, popupProps),\n            React__namespace.createElement(\n              \"div\",\n              __assign$1({ \"aria-hidden\": !isOpen && isAnimating }, nativeProps, { ref: this._panel, className: _classNames.root }),\n              overlay,\n              React__namespace.createElement(\n                FocusTrapZone,\n                __assign$1({ ignoreExternalFocusing, forceFocusInsideTrap: !isBlocking || isHiddenOnDismiss && !isOpen ? false : forceFocusInsideTrap, firstFocusableSelector, isClickableOutsideFocusTrap: true }, focusTrapZoneProps, { className: _classNames.main, style: customWidthStyles, elementToFocusOnDismiss }),\n                React__namespace.createElement(\n                  \"div\",\n                  { className: _classNames.contentInner },\n                  React__namespace.createElement(\n                    \"div\",\n                    { ref: this._allowScrollOnPanel, className: _classNames.scrollableContent, \"data-is-scrollable\": true },\n                    React__namespace.createElement(\"div\", { className: _classNames.commands, \"data-is-visible\": true }, onRenderNavigation(this.props, this._onRenderNavigation)),\n                    (this._hasCustomNavigation || !hasCloseButton) && onRenderHeader(this.props, this._onRenderHeader, this._headerTextId),\n                    onRenderBody(this.props, this._onRenderBody),\n                    onRenderFooter(this.props, this._onRenderFooter)\n                  )\n                )\n              )\n            )\n          )\n        );\n      };\n      PanelBase2.prototype.open = function() {\n        if (this.props.isOpen !== void 0) {\n          return;\n        }\n        if (this.isActive) {\n          return;\n        }\n        this.setState({ visibility: PanelVisibilityState.animatingOpen });\n      };\n      PanelBase2.prototype.close = function() {\n        if (this.props.isOpen !== void 0) {\n          return;\n        }\n        if (!this.isActive) {\n          return;\n        }\n        this.setState({ visibility: PanelVisibilityState.animatingClosed });\n      };\n      Object.defineProperty(PanelBase2.prototype, \"isActive\", {\n        /** isActive is true when panel is open or opening. */\n        get: function() {\n          return this.state.visibility === PanelVisibilityState.open || this.state.visibility === PanelVisibilityState.animatingOpen;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      PanelBase2.prototype._createResizeObserver = function(callback) {\n        var _a2;\n        var doc = getDocumentEx(this.context);\n        var resizeObserver = null;\n        if ((_a2 = doc === null || doc === void 0 ? void 0 : doc.defaultView) === null || _a2 === void 0 ? void 0 : _a2.ResizeObserver) {\n          resizeObserver = new doc.defaultView.ResizeObserver(callback);\n        }\n        return resizeObserver;\n      };\n      PanelBase2.prototype._shouldListenForOuterClick = function(props) {\n        return !!props.isBlocking && !!props.isOpen;\n      };\n      PanelBase2.prototype._updateFooterPosition = function() {\n        var scrollableContent = this._scrollableContent;\n        if (scrollableContent) {\n          var height2 = scrollableContent.clientHeight;\n          var innerHeight_1 = scrollableContent.scrollHeight;\n          this.setState({\n            isFooterSticky: height2 < innerHeight_1 ? true : false\n          });\n        }\n      };\n      PanelBase2.prototype._dismissOnOuterClick = function(ev) {\n        var panel = this._panel.current;\n        if (this.isActive && panel && !ev.defaultPrevented) {\n          if (!elementContains(panel, ev.target)) {\n            if (this.props.onOuterClick) {\n              this.props.onOuterClick(ev);\n            } else {\n              this.dismiss(ev);\n            }\n          }\n        }\n      };\n      PanelBase2.defaultProps = {\n        isHiddenOnDismiss: false,\n        isOpen: void 0,\n        isBlocking: true,\n        hasCloseButton: true,\n        type: PanelType.smallFixedFar\n      };\n      PanelBase2.contextType = WindowContext;\n      return PanelBase2;\n    })(React__namespace.Component)\n  );\n  var _a$1, _b$1, _c$1, _d$1, _e$1;\n  var GlobalClassNames$3 = {\n    root: \"ms-Panel\",\n    main: \"ms-Panel-main\",\n    commands: \"ms-Panel-commands\",\n    contentInner: \"ms-Panel-contentInner\",\n    scrollableContent: \"ms-Panel-scrollableContent\",\n    navigation: \"ms-Panel-navigation\",\n    closeButton: \"ms-Panel-closeButton ms-PanelAction-close\",\n    header: \"ms-Panel-header\",\n    headerText: \"ms-Panel-headerText\",\n    content: \"ms-Panel-content\",\n    footer: \"ms-Panel-footer\",\n    footerInner: \"ms-Panel-footerInner\",\n    isOpen: \"is-open\",\n    hasCloseButton: \"ms-Panel--hasCloseButton\",\n    smallFluid: \"ms-Panel--smFluid\",\n    smallFixedNear: \"ms-Panel--smLeft\",\n    smallFixedFar: \"ms-Panel--sm\",\n    medium: \"ms-Panel--md\",\n    large: \"ms-Panel--lg\",\n    largeFixed: \"ms-Panel--fixed\",\n    extraLarge: \"ms-Panel--xl\",\n    custom: \"ms-Panel--custom\",\n    customNear: \"ms-Panel--customLeft\"\n  };\n  var panelWidth = {\n    full: \"100%\",\n    auto: \"auto\",\n    xs: 272,\n    sm: 340,\n    md1: 592,\n    md2: 644,\n    lg: 940\n  };\n  var panelMargin = {\n    auto: \"auto\",\n    none: 0,\n    md: 48,\n    lg: 428,\n    xl: 176\n  };\n  var smallPanelSelectors = (_a$1 = {}, _a$1[\"@media (min-width: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n    width: panelWidth.sm\n  }, _a$1);\n  var mediumPanelSelectors = (_b$1 = {}, _b$1[\"@media (min-width: \".concat(ScreenWidthMinLarge, \"px)\")] = {\n    width: panelWidth.md1\n  }, _b$1[\"@media (min-width: \".concat(ScreenWidthMinXLarge, \"px)\")] = {\n    width: panelWidth.md2\n  }, _b$1);\n  var largePanelSelectors = (_c$1 = {}, _c$1[\"@media (min-width: \".concat(ScreenWidthMinUhfMobile, \"px)\")] = {\n    left: panelMargin.md,\n    width: panelWidth.auto\n  }, _c$1[\"@media (min-width: \".concat(ScreenWidthMinXXLarge, \"px)\")] = {\n    left: panelMargin.lg\n  }, _c$1);\n  var largeFixedPanelSelectors = (_d$1 = {}, _d$1[\"@media (min-width: \".concat(ScreenWidthMinXXLarge, \"px)\")] = {\n    left: panelMargin.auto,\n    width: panelWidth.lg\n  }, _d$1);\n  var extraLargePanelSelectors = (_e$1 = {}, _e$1[\"@media (min-width: \".concat(ScreenWidthMinXXLarge, \"px)\")] = {\n    left: panelMargin.xl\n  }, _e$1);\n  var getPanelBreakpoints = function(type2) {\n    var selectors;\n    switch (type2) {\n      case PanelType.smallFixedFar:\n        selectors = __assign$1({}, smallPanelSelectors);\n        break;\n      case PanelType.medium:\n        selectors = __assign$1(__assign$1({}, smallPanelSelectors), mediumPanelSelectors);\n        break;\n      case PanelType.large:\n        selectors = __assign$1(__assign$1(__assign$1({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors);\n        break;\n      case PanelType.largeFixed:\n        selectors = __assign$1(__assign$1(__assign$1(__assign$1({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors), largeFixedPanelSelectors);\n        break;\n      case PanelType.extraLarge:\n        selectors = __assign$1(__assign$1(__assign$1(__assign$1({}, smallPanelSelectors), mediumPanelSelectors), largePanelSelectors), extraLargePanelSelectors);\n        break;\n    }\n    return selectors;\n  };\n  var commandBarHeight = \"44px\";\n  var sharedPaddingStyles = {\n    paddingLeft: \"24px\",\n    paddingRight: \"24px\"\n  };\n  var getStyles$5 = function(props) {\n    var _a2, _b2, _c2, _d2;\n    var className2 = props.className, focusTrapZoneClassName = props.focusTrapZoneClassName, hasCloseButton = props.hasCloseButton, headerClassName = props.headerClassName, isAnimating = props.isAnimating, isFooterSticky = props.isFooterSticky, isFooterAtBottom = props.isFooterAtBottom, isOnRightSide = props.isOnRightSide, isOpen = props.isOpen, isHiddenOnDismiss = props.isHiddenOnDismiss, hasCustomNavigation = props.hasCustomNavigation, theme = props.theme, _e2 = props.type, type2 = _e2 === void 0 ? PanelType.smallFixedFar : _e2;\n    var effects = theme.effects, fonts = theme.fonts, semanticColors = theme.semanticColors;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$3, theme);\n    var isCustomPanel = type2 === PanelType.custom || type2 === PanelType.customNear;\n    return {\n      root: [\n        classNames2.root,\n        theme.fonts.medium,\n        isOpen && classNames2.isOpen,\n        hasCloseButton && classNames2.hasCloseButton,\n        {\n          pointerEvents: \"none\",\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          right: 0,\n          bottom: 0\n        },\n        isCustomPanel && isOnRightSide && classNames2.custom,\n        isCustomPanel && !isOnRightSide && classNames2.customNear,\n        className2\n      ],\n      overlay: [\n        {\n          pointerEvents: \"auto\",\n          cursor: \"pointer\"\n        },\n        isOpen && isAnimating && AnimationClassNames.fadeIn100,\n        !isOpen && isAnimating && AnimationClassNames.fadeOut100\n      ],\n      hiddenPanel: [\n        !isOpen && !isAnimating && isHiddenOnDismiss && {\n          visibility: \"hidden\"\n        }\n      ],\n      main: [\n        classNames2.main,\n        {\n          backgroundColor: semanticColors.bodyBackground,\n          boxShadow: effects.elevation64,\n          pointerEvents: \"auto\",\n          position: \"absolute\",\n          display: \"flex\",\n          flexDirection: \"column\",\n          overflowX: \"hidden\",\n          overflowY: \"auto\",\n          WebkitOverflowScrolling: \"touch\",\n          bottom: 0,\n          top: 0,\n          // left, right, width are overridden depending on the type of the Panel and the screen breakpoint.\n          left: panelMargin.auto,\n          right: panelMargin.none,\n          width: panelWidth.full,\n          selectors: __assign$1((_a2 = {}, _a2[HighContrastSelector] = {\n            borderLeft: \"3px solid \".concat(semanticColors.variantBorder),\n            borderRight: \"3px solid \".concat(semanticColors.variantBorder)\n          }, _a2), getPanelBreakpoints(type2))\n        },\n        type2 === PanelType.smallFluid && {\n          left: panelMargin.none\n        },\n        type2 === PanelType.smallFixedNear && {\n          left: panelMargin.none,\n          right: panelMargin.auto,\n          width: panelWidth.xs\n        },\n        type2 === PanelType.customNear && {\n          right: \"auto\",\n          left: 0\n        },\n        isCustomPanel && {\n          maxWidth: \"100vw\"\n        },\n        isOpen && isAnimating && !isOnRightSide && AnimationClassNames.slideRightIn40,\n        isOpen && isAnimating && isOnRightSide && AnimationClassNames.slideLeftIn40,\n        !isOpen && isAnimating && !isOnRightSide && AnimationClassNames.slideLeftOut40,\n        !isOpen && isAnimating && isOnRightSide && AnimationClassNames.slideRightOut40,\n        focusTrapZoneClassName\n      ],\n      commands: [\n        classNames2.commands,\n        {\n          // Ensures that the sticky header always has a background to prevent overlaps on scroll.\n          backgroundColor: semanticColors.bodyBackground,\n          paddingTop: 18,\n          selectors: (_b2 = {}, _b2[\"@media (min-height: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n            position: \"sticky\",\n            top: 0,\n            zIndex: 1\n          }, _b2)\n        },\n        hasCustomNavigation && {\n          paddingTop: \"inherit\"\n        }\n      ],\n      navigation: [\n        classNames2.navigation,\n        {\n          display: \"flex\",\n          justifyContent: \"flex-end\"\n        },\n        hasCustomNavigation && {\n          height: commandBarHeight\n        }\n      ],\n      contentInner: [\n        classNames2.contentInner,\n        {\n          display: \"flex\",\n          flexDirection: \"column\",\n          flexGrow: 1,\n          overflowY: \"hidden\"\n        }\n      ],\n      header: [\n        classNames2.header,\n        sharedPaddingStyles,\n        {\n          alignSelf: \"flex-start\"\n        },\n        hasCloseButton && !hasCustomNavigation && {\n          flexGrow: 1\n        },\n        hasCustomNavigation && {\n          // Ensure that title doesn't shrink if screen is too small\n          flexShrink: 0\n        }\n      ],\n      headerText: [\n        classNames2.headerText,\n        fonts.xLarge,\n        {\n          color: semanticColors.bodyText,\n          lineHeight: \"27px\",\n          overflowWrap: \"break-word\",\n          wordWrap: \"break-word\",\n          wordBreak: \"break-word\",\n          hyphens: \"auto\"\n        },\n        headerClassName\n      ],\n      scrollableContent: [\n        classNames2.scrollableContent,\n        {\n          overflowY: \"auto\"\n        },\n        isFooterAtBottom && {\n          flexGrow: 1,\n          display: \"inherit\",\n          flexDirection: \"inherit\"\n        }\n      ],\n      content: [\n        classNames2.content,\n        sharedPaddingStyles,\n        {\n          paddingBottom: 20\n        },\n        isFooterAtBottom && {\n          selectors: (_c2 = {}, _c2[\"@media (min-height: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n            flexGrow: 1\n          }, _c2)\n        }\n      ],\n      footer: [\n        classNames2.footer,\n        {\n          // Ensure that footer doesn't shrink if screen is too small\n          flexShrink: 0,\n          borderTop: \"1px solid transparent\",\n          transition: \"opacity \".concat(AnimationVariables.durationValue3, \" \").concat(AnimationVariables.easeFunction2),\n          selectors: (_d2 = {}, _d2[\"@media (min-height: \".concat(ScreenWidthMinMedium, \"px)\")] = {\n            position: \"sticky\",\n            bottom: 0\n          }, _d2)\n        },\n        isFooterSticky && {\n          backgroundColor: semanticColors.bodyBackground,\n          borderTopColor: semanticColors.variantBorder\n        }\n      ],\n      footerInner: [\n        classNames2.footerInner,\n        sharedPaddingStyles,\n        {\n          paddingBottom: 16,\n          paddingTop: 16\n        }\n      ],\n      subComponentStyles: {\n        closeButton: {\n          root: [\n            classNames2.closeButton,\n            {\n              marginRight: 14,\n              color: theme.palette.neutralSecondary,\n              fontSize: IconFontSizes.large\n            },\n            hasCustomNavigation && {\n              marginRight: 0,\n              height: \"auto\",\n              width: \"44px\"\n            }\n          ],\n          rootHovered: {\n            color: theme.palette.neutralPrimary\n          }\n        }\n      }\n    };\n  };\n  var Panel = styled(PanelBase, getStyles$5, void 0, {\n    scope: \"Panel\"\n  });\n  var getClassNames$4 = classNamesFunction();\n  var DEFAULT_PROPS = {\n    options: []\n  };\n  function useSelectedItemsState(_a2) {\n    var defaultSelectedKeys = _a2.defaultSelectedKeys, selectedKeys = _a2.selectedKeys, defaultSelectedKey = _a2.defaultSelectedKey, selectedKey = _a2.selectedKey, options2 = _a2.options, multiSelect = _a2.multiSelect;\n    var oldOptions = usePrevious(options2);\n    var _b2 = React__namespace.useState([]), selectedIndices = _b2[0], setSelectedIndices = _b2[1];\n    var selectedKeyPropToUse;\n    var didOptionsChange = options2 !== oldOptions;\n    if (multiSelect) {\n      if (didOptionsChange && defaultSelectedKeys !== void 0) {\n        selectedKeyPropToUse = defaultSelectedKeys;\n      } else {\n        selectedKeyPropToUse = selectedKeys;\n      }\n    } else {\n      if (didOptionsChange && defaultSelectedKey !== void 0) {\n        selectedKeyPropToUse = defaultSelectedKey;\n      } else {\n        selectedKeyPropToUse = selectedKey;\n      }\n    }\n    var oldSelectedKeyProp = usePrevious(selectedKeyPropToUse);\n    React__namespace.useEffect(function() {\n      var getSelectedIndexes = function() {\n        if (selectedKeyPropToUse === void 0) {\n          if (multiSelect) {\n            return getAllSelectedIndices();\n          }\n          var selectedIndex = getSelectedIndex(null);\n          return selectedIndex !== -1 ? [selectedIndex] : [];\n        } else if (!Array.isArray(selectedKeyPropToUse)) {\n          var selectedIndex = getSelectedIndex(selectedKeyPropToUse);\n          return selectedIndex !== -1 ? [selectedIndex] : [];\n        }\n        var returnValue = [];\n        for (var _i = 0, selectedKeyPropToUse_1 = selectedKeyPropToUse; _i < selectedKeyPropToUse_1.length; _i++) {\n          var key2 = selectedKeyPropToUse_1[_i];\n          var selectedIndex = getSelectedIndex(key2);\n          selectedIndex !== -1 && returnValue.push(selectedIndex);\n        }\n        return returnValue;\n      };\n      var getAllSelectedIndices = function() {\n        return options2.map(function(option, index2) {\n          return option.selected ? index2 : -1;\n        }).filter(function(index2) {\n          return index2 !== -1;\n        });\n      };\n      var getSelectedIndex = function(searchKey) {\n        return findIndex(options2, function(option) {\n          if (searchKey != null) {\n            return option.key === searchKey;\n          } else {\n            return !!option.selected || !!option.isSelected;\n          }\n        });\n      };\n      if ((selectedKeyPropToUse !== void 0 || !oldOptions) && (selectedKeyPropToUse !== oldSelectedKeyProp || didOptionsChange)) {\n        setSelectedIndices(getSelectedIndexes());\n      }\n    }, [didOptionsChange, multiSelect, oldOptions, oldSelectedKeyProp, options2, selectedKeyPropToUse]);\n    return [selectedIndices, setSelectedIndices];\n  }\n  var DropdownBase = React__namespace.forwardRef(function(propsWithoutDefaults, forwardedRef) {\n    var props = getPropsWithDefaults(DEFAULT_PROPS, propsWithoutDefaults);\n    var rootRef = React__namespace.useRef(null);\n    var mergedRootRef = useMergedRefs(forwardedRef, rootRef);\n    var responsiveMode = useResponsiveMode(rootRef, props.responsiveMode);\n    var _a2 = useSelectedItemsState(props), selectedIndices = _a2[0], setSelectedIndices = _a2[1];\n    return React__namespace.createElement(DropdownInternal, __assign$1({}, props, { responsiveMode, hoisted: { rootRef: mergedRootRef, selectedIndices, setSelectedIndices } }));\n  });\n  DropdownBase.displayName = \"DropdownBase\";\n  var DropdownInternal = (\n    /** @class */\n    (function(_super) {\n      __extends(DropdownInternal2, _super);\n      function DropdownInternal2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._host = React__namespace.createRef();\n        _this._focusZone = React__namespace.createRef();\n        _this._dropDown = React__namespace.createRef();\n        _this._scrollIdleDelay = 250;\n        _this._sizePosCache = new DropdownSizePosCache();\n        _this._requestAnimationFrame = safeRequestAnimationFrame(_this);\n        _this.dismissMenu = function() {\n          var isOpen = _this.state.isOpen;\n          isOpen && _this.setState({ isOpen: false });\n        };\n        _this._onChange = function(event2, options22, index2, checked, multiSelect2) {\n          var _a2 = _this.props, onChange = _a2.onChange, onChanged = _a2.onChanged;\n          if (onChange || onChanged) {\n            var changedOpt = multiSelect2 ? __assign$1(__assign$1({}, options22[index2]), { selected: !checked }) : options22[index2];\n            onChange && onChange(__assign$1(__assign$1({}, event2), { target: _this._dropDown.current }), changedOpt, index2);\n            onChanged && onChanged(changedOpt, index2);\n          }\n        };\n        _this._getPlaceholder = function() {\n          return _this.props.placeholder || _this.props.placeHolder;\n        };\n        _this._getTitle = function(items, _unused) {\n          var _a2 = _this.props.multiSelectDelimiter, multiSelectDelimiter = _a2 === void 0 ? \", \" : _a2;\n          return items.map(function(i) {\n            return i.text;\n          }).join(multiSelectDelimiter);\n        };\n        _this._onRenderTitle = function(items) {\n          return React__namespace.createElement(React__namespace.Fragment, null, _this._getTitle(items));\n        };\n        _this._onRenderPlaceholder = function(props2) {\n          if (!_this._getPlaceholder()) {\n            return null;\n          }\n          return React__namespace.createElement(React__namespace.Fragment, null, _this._getPlaceholder());\n        };\n        _this._onRenderContainer = function(props2) {\n          var calloutProps = props2.calloutProps, panelProps = props2.panelProps;\n          var _a2 = _this.props, responsiveMode = _a2.responsiveMode, dropdownWidth2 = _a2.dropdownWidth;\n          var isSmall = responsiveMode <= ResponsiveMode.medium;\n          var focusTrapZoneProps = { firstFocusableTarget: \"#\".concat(_this._listId, \"1\") };\n          var panelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.panel : void 0;\n          var calloutWidth = void 0;\n          var calloutMinWidth = void 0;\n          if (dropdownWidth2 === \"auto\") {\n            calloutMinWidth = _this._dropDown.current ? _this._dropDown.current.clientWidth : 0;\n          } else {\n            calloutWidth = dropdownWidth2 || (_this._dropDown.current ? _this._dropDown.current.clientWidth : 0);\n          }\n          return isSmall ? React__namespace.createElement(Panel, __assign$1({ closeButtonAriaLabel: \"Close\", focusTrapZoneProps, hasCloseButton: true, isOpen: true, isLightDismiss: true, onDismiss: _this._onDismiss, styles: panelStyles }, panelProps), _this._renderFocusableList(props2)) : React__namespace.createElement(Callout, __assign$1({ isBeakVisible: false, gapSpace: 0, doNotLayer: false, directionalHintFixed: false, directionalHint: DirectionalHint.bottomLeftEdge, calloutWidth, calloutMinWidth }, calloutProps, { className: _this._classNames.callout, target: _this._dropDown.current, onDismiss: _this._onDismiss, onScroll: _this._onScroll, onPositioned: _this._onPositioned }), _this._renderFocusableList(props2));\n        };\n        _this._onRenderCaretDown = function(props2) {\n          return React__namespace.createElement(Icon, { className: _this._classNames.caretDown, iconName: \"ChevronDown\", \"aria-hidden\": true });\n        };\n        _this._onRenderList = function(props2) {\n          var _a2 = props2.onRenderItem, onRenderItem = _a2 === void 0 ? _this._onRenderItem : _a2;\n          var queue = { items: [] };\n          var renderedList = [];\n          var emptyQueue = function() {\n            var newGroup = queue.id ? [\n              React__namespace.createElement(\"div\", { role: \"group\", key: queue.id, \"aria-labelledby\": queue.id }, queue.items)\n            ] : queue.items;\n            renderedList = __spreadArray(__spreadArray([], renderedList, true), newGroup, true);\n            queue = { items: [] };\n          };\n          var placeRenderedOptionIntoQueue = function(item, index2) {\n            switch (item.itemType) {\n              case SelectableOptionMenuItemType.Header:\n                queue.items.length > 0 && emptyQueue();\n                var id2 = _this._id + item.key;\n                queue.items.push(onRenderItem(__assign$1(__assign$1({ id: id2 }, item), { index: index2 }), _this._onRenderItem));\n                queue.id = id2;\n                break;\n              case SelectableOptionMenuItemType.Divider:\n                index2 > 0 && queue.items.push(onRenderItem(__assign$1(__assign$1({}, item), { index: index2 }), _this._onRenderItem));\n                queue.items.length > 0 && emptyQueue();\n                break;\n              default:\n                queue.items.push(onRenderItem(__assign$1(__assign$1({}, item), { index: index2 }), _this._onRenderItem));\n            }\n          };\n          props2.options.forEach(function(item, index2) {\n            placeRenderedOptionIntoQueue(item, index2);\n          });\n          queue.items.length > 0 && emptyQueue();\n          return React__namespace.createElement(React__namespace.Fragment, null, renderedList);\n        };\n        _this._onRenderItem = function(item) {\n          switch (item.itemType) {\n            case SelectableOptionMenuItemType.Divider:\n              return _this._renderSeparator(item);\n            case SelectableOptionMenuItemType.Header:\n              return _this._renderHeader(item);\n            default:\n              return _this._renderOption(item);\n          }\n        };\n        _this._renderOption = function(item) {\n          var _a2;\n          var _b2 = _this.props, _c2 = _b2.onRenderOption, onRenderOption = _c2 === void 0 ? _this._onRenderOption : _c2, _d2 = _b2.hoisted.selectedIndices, selectedIndices = _d2 === void 0 ? [] : _d2;\n          var isItemSelected = item.index !== void 0 && selectedIndices ? selectedIndices.indexOf(item.index) > -1 : false;\n          var itemClassName = item.hidden ? _this._classNames.dropdownItemHidden : isItemSelected && item.disabled === true ? _this._classNames.dropdownItemSelectedAndDisabled : isItemSelected ? _this._classNames.dropdownItemSelected : item.disabled === true ? _this._classNames.dropdownItemDisabled : _this._classNames.dropdownItem;\n          var title = item.title;\n          var id2 = _this._listId + item.index;\n          var labelId = (_a2 = item.id) !== null && _a2 !== void 0 ? _a2 : id2 + \"-label\";\n          var multiSelectItemStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.multiSelectItem : void 0;\n          return !_this.props.multiSelect ? React__namespace.createElement(CommandButton, {\n            id: id2,\n            key: item.key,\n            \"data-index\": item.index,\n            \"data-is-focusable\": !item.disabled,\n            disabled: item.disabled,\n            className: itemClassName,\n            onClick: _this._onItemClick(item),\n            // eslint-disable-next-line react/jsx-no-bind\n            onMouseEnter: _this._onItemMouseEnter.bind(_this, item),\n            // eslint-disable-next-line react/jsx-no-bind\n            onMouseLeave: _this._onMouseItemLeave.bind(_this, item),\n            // eslint-disable-next-line react/jsx-no-bind\n            onMouseMove: _this._onItemMouseMove.bind(_this, item),\n            role: \"option\",\n            \"aria-selected\": isItemSelected ? \"true\" : \"false\",\n            ariaLabel: item.ariaLabel,\n            title,\n            \"aria-posinset\": _this._sizePosCache.positionInSet(item.index),\n            \"aria-setsize\": _this._sizePosCache.optionSetSize\n          }, onRenderOption(item, _this._onRenderOption)) : React__namespace.createElement(Checkbox, {\n            id: id2,\n            key: item.key,\n            disabled: item.disabled,\n            onChange: _this._onItemClick(item),\n            inputProps: __assign$1({ \"aria-selected\": isItemSelected, onMouseEnter: _this._onItemMouseEnter.bind(_this, item), onMouseLeave: _this._onMouseItemLeave.bind(_this, item), onMouseMove: _this._onItemMouseMove.bind(_this, item), role: \"option\" }, {\n              \"data-index\": item.index,\n              \"data-is-focusable\": !(item.disabled || item.hidden)\n            }),\n            label: item.text,\n            title,\n            // eslint-disable-next-line react/jsx-no-bind\n            onRenderLabel: _this._onRenderItemLabel.bind(_this, __assign$1(__assign$1({}, item), { id: labelId })),\n            className: css(itemClassName, \"is-multi-select\"),\n            checked: isItemSelected,\n            styles: multiSelectItemStyles,\n            ariaPositionInSet: !item.hidden ? _this._sizePosCache.positionInSet(item.index) : void 0,\n            ariaSetSize: !item.hidden ? _this._sizePosCache.optionSetSize : void 0,\n            ariaLabel: item.ariaLabel,\n            ariaLabelledBy: item.ariaLabel ? void 0 : labelId\n          });\n        };\n        _this._onRenderOption = function(item) {\n          return React__namespace.createElement(\"span\", { className: _this._classNames.dropdownOptionText }, item.text);\n        };\n        _this._onRenderMultiselectOption = function(item) {\n          return React__namespace.createElement(\"span\", { id: item.id, \"aria-hidden\": \"true\", className: _this._classNames.dropdownOptionText }, item.text);\n        };\n        _this._onRenderItemLabel = function(item) {\n          var _a2 = _this.props.onRenderOption, onRenderOption = _a2 === void 0 ? _this._onRenderMultiselectOption : _a2;\n          return onRenderOption(item, _this._onRenderMultiselectOption);\n        };\n        _this._onPositioned = function(positions2) {\n          if (_this._focusZone.current) {\n            _this._requestAnimationFrame(function() {\n              var selectedIndices = _this.props.hoisted.selectedIndices;\n              if (_this._focusZone.current) {\n                if (!_this._hasBeenPositioned && selectedIndices && selectedIndices[0] && !_this.props.options[selectedIndices[0]].disabled) {\n                  var element2 = getDocument().getElementById(\"\".concat(_this._id, \"-list\").concat(selectedIndices[0]));\n                  if (element2) {\n                    _this._focusZone.current.focusElement(element2);\n                  }\n                  _this._hasBeenPositioned = true;\n                } else {\n                  _this._focusZone.current.focus();\n                }\n              }\n            });\n          }\n          if (!_this.state.calloutRenderEdge || _this.state.calloutRenderEdge !== positions2.targetEdge) {\n            _this.setState({\n              calloutRenderEdge: positions2.targetEdge\n            });\n          }\n        };\n        _this._onItemClick = function(item) {\n          return function(event2) {\n            if (!item.disabled) {\n              _this.setSelectedIndex(event2, item.index);\n              if (!_this.props.multiSelect) {\n                _this.setState({\n                  isOpen: false\n                });\n              }\n            }\n          };\n        };\n        _this._onScroll = function() {\n          var win = getWindowEx(_this.context);\n          if (!_this._isScrollIdle && _this._scrollIdleTimeoutId !== void 0) {\n            win.clearTimeout(_this._scrollIdleTimeoutId);\n            _this._scrollIdleTimeoutId = void 0;\n          } else {\n            _this._isScrollIdle = false;\n          }\n          _this._scrollIdleTimeoutId = win.setTimeout(function() {\n            _this._isScrollIdle = true;\n          }, _this._scrollIdleDelay);\n        };\n        _this._onMouseItemLeave = function(item, ev) {\n          if (_this._shouldIgnoreMouseEvent()) {\n            return;\n          }\n          if (_this._host.current) {\n            if (_this._host.current.setActive) {\n              try {\n                _this._host.current.setActive();\n              } catch (e) {\n              }\n            } else {\n              _this._host.current.focus();\n            }\n          }\n        };\n        _this._onDismiss = function() {\n          _this.setState({ isOpen: false });\n        };\n        _this._onDropdownBlur = function(ev) {\n          var disabled = _this._isDisabled();\n          if (disabled) {\n            return;\n          }\n          if (_this.state.isOpen) {\n            return;\n          }\n          _this.setState({ hasFocus: false });\n          if (_this.props.onBlur) {\n            _this.props.onBlur(ev);\n          }\n        };\n        _this._onDropdownKeyDown = function(ev) {\n          var disabled = _this._isDisabled();\n          if (disabled) {\n            return;\n          }\n          _this._lastKeyDownWasAltOrMeta = _this._isAltOrMeta(ev);\n          if (_this.props.onKeyDown) {\n            _this.props.onKeyDown(ev);\n            if (ev.defaultPrevented) {\n              return;\n            }\n          }\n          var newIndex;\n          var selectedIndex = _this.props.hoisted.selectedIndices.length ? _this.props.hoisted.selectedIndices[0] : -1;\n          var containsExpandCollapseModifier = ev.altKey || ev.metaKey;\n          var isOpen = _this.state.isOpen;\n          switch (ev.which) {\n            case KeyCodes.enter:\n              _this.setState({\n                isOpen: !isOpen\n              });\n              break;\n            case KeyCodes.escape:\n              if (!isOpen) {\n                return;\n              }\n              _this.setState({\n                isOpen: false\n              });\n              break;\n            case KeyCodes.up:\n              if (containsExpandCollapseModifier) {\n                if (isOpen) {\n                  _this.setState({ isOpen: false });\n                  break;\n                }\n                return;\n              }\n              if (_this.props.multiSelect) {\n                _this.setState({ isOpen: true });\n              } else if (!_this._isDisabled()) {\n                newIndex = _this._moveIndex(ev, -1, selectedIndex - 1, selectedIndex);\n              }\n              break;\n            case KeyCodes.down:\n              if (containsExpandCollapseModifier) {\n                ev.stopPropagation();\n                ev.preventDefault();\n              }\n              if (containsExpandCollapseModifier && !isOpen || _this.props.multiSelect) {\n                _this.setState({ isOpen: true });\n              } else if (!_this._isDisabled()) {\n                newIndex = _this._moveIndex(ev, 1, selectedIndex + 1, selectedIndex);\n              }\n              break;\n            case KeyCodes.home:\n              if (!_this.props.multiSelect) {\n                newIndex = _this._moveIndex(ev, 1, 0, selectedIndex);\n              }\n              break;\n            case KeyCodes.end:\n              if (!_this.props.multiSelect) {\n                newIndex = _this._moveIndex(ev, -1, _this.props.options.length - 1, selectedIndex);\n              }\n              break;\n            case KeyCodes.space:\n              break;\n            default:\n              return;\n          }\n          if (newIndex !== selectedIndex) {\n            ev.stopPropagation();\n            ev.preventDefault();\n          }\n        };\n        _this._onDropdownKeyUp = function(ev) {\n          var disabled = _this._isDisabled();\n          if (disabled) {\n            return;\n          }\n          var shouldHandleKey = _this._shouldHandleKeyUp(ev);\n          var isOpen = _this.state.isOpen;\n          if (_this.props.onKeyUp) {\n            _this.props.onKeyUp(ev);\n            if (ev.defaultPrevented) {\n              return;\n            }\n          }\n          switch (ev.which) {\n            case KeyCodes.space:\n              _this.setState({\n                isOpen: !isOpen\n              });\n              break;\n            default:\n              if (shouldHandleKey && isOpen) {\n                _this.setState({ isOpen: false });\n              }\n              return;\n          }\n          ev.stopPropagation();\n          ev.preventDefault();\n        };\n        _this._onZoneKeyDown = function(ev) {\n          var _a2, _b2;\n          var elementToFocus;\n          _this._lastKeyDownWasAltOrMeta = _this._isAltOrMeta(ev);\n          var containsExpandCollapseModifier = ev.altKey || ev.metaKey;\n          switch (ev.which) {\n            case KeyCodes.up:\n              if (containsExpandCollapseModifier) {\n                _this.setState({ isOpen: false });\n              } else {\n                if (_this._host.current) {\n                  elementToFocus = getLastFocusable(_this._host.current, _this._host.current.lastChild, true);\n                }\n              }\n              break;\n            // All directional keystrokes should be canceled when the zone is rendered.\n            // This avoids the body scroll from reacting and thus dismissing the dropdown.\n            case KeyCodes.home:\n            case KeyCodes.end:\n            case KeyCodes.pageUp:\n            case KeyCodes.pageDown:\n              break;\n            case KeyCodes.down:\n              if (!containsExpandCollapseModifier && _this._host.current) {\n                elementToFocus = getFirstFocusable(_this._host.current, _this._host.current.firstChild, true);\n              }\n              break;\n            case KeyCodes.escape:\n              _this.setState({ isOpen: false });\n              break;\n            case KeyCodes.tab:\n              _this.setState({ isOpen: false });\n              var document_1 = getDocument();\n              if (document_1) {\n                if (ev.shiftKey) {\n                  (_a2 = getPreviousElement(document_1.body, _this._dropDown.current, false, false, true, true)) === null || _a2 === void 0 ? void 0 : _a2.focus();\n                } else {\n                  (_b2 = getNextElement(document_1.body, _this._dropDown.current, false, false, true, true)) === null || _b2 === void 0 ? void 0 : _b2.focus();\n                }\n              }\n              break;\n            default:\n              return;\n          }\n          if (elementToFocus) {\n            elementToFocus.focus();\n          }\n          ev.stopPropagation();\n          ev.preventDefault();\n        };\n        _this._onZoneKeyUp = function(ev) {\n          var shouldHandleKey = _this._shouldHandleKeyUp(ev);\n          if (shouldHandleKey && _this.state.isOpen) {\n            _this.setState({ isOpen: false });\n            ev.preventDefault();\n          }\n        };\n        _this._onDropdownClick = function(ev) {\n          if (_this.props.onClick) {\n            _this.props.onClick(ev);\n            if (ev.defaultPrevented) {\n              return;\n            }\n          }\n          var isOpen = _this.state.isOpen;\n          var disabled = _this._isDisabled();\n          if (!disabled && !_this._shouldOpenOnFocus()) {\n            _this.setState({\n              isOpen: !isOpen\n            });\n          }\n          _this._isFocusedByClick = false;\n        };\n        _this._onDropdownMouseDown = function() {\n          _this._isFocusedByClick = true;\n        };\n        _this._onFocus = function(ev) {\n          var disabled = _this._isDisabled();\n          if (!disabled) {\n            if (_this.props.onFocus) {\n              _this.props.onFocus(ev);\n            }\n            var state = { hasFocus: true };\n            if (_this._shouldOpenOnFocus()) {\n              state.isOpen = true;\n            }\n            _this.setState(state);\n          }\n        };\n        _this._isDisabled = function() {\n          var disabled = _this.props.disabled;\n          var isDisabled = _this.props.isDisabled;\n          if (disabled === void 0) {\n            disabled = isDisabled;\n          }\n          return disabled;\n        };\n        _this._onRenderLabel = function(props2) {\n          var label2 = props2.label, required2 = props2.required, disabled = props2.disabled;\n          var labelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.label : void 0;\n          return label2 ? React__namespace.createElement(Label$2, { className: _this._classNames.label, id: _this._labelId, required: required2, styles: labelStyles, disabled }, label2) : null;\n        };\n        initializeComponentRef(_this);\n        props.multiSelect;\n        props.selectedKey;\n        props.selectedKeys;\n        props.defaultSelectedKey;\n        props.defaultSelectedKeys;\n        var options2 = props.options;\n        _this._id = props.id || getId(\"Dropdown\");\n        _this._labelId = _this._id + \"-label\";\n        _this._listId = _this._id + \"-list\";\n        _this._optionId = _this._id + \"-option\";\n        _this._isScrollIdle = true;\n        _this._hasBeenPositioned = false;\n        _this._sizePosCache.updateOptions(options2);\n        _this.state = {\n          isOpen: false,\n          hasFocus: false,\n          calloutRenderEdge: void 0\n        };\n        return _this;\n      }\n      Object.defineProperty(DropdownInternal2.prototype, \"selectedOptions\", {\n        /**\n         * All selected options\n         */\n        get: function() {\n          var _a2 = this.props, options2 = _a2.options, selectedIndices = _a2.hoisted.selectedIndices;\n          return getAllSelectedOptions(options2, selectedIndices);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      DropdownInternal2.prototype.componentWillUnmount = function() {\n        clearTimeout(this._scrollIdleTimeoutId);\n      };\n      DropdownInternal2.prototype.componentDidUpdate = function(prevProps, prevState) {\n        if (prevState.isOpen === true && this.state.isOpen === false) {\n          this._gotMouseMove = false;\n          this._hasBeenPositioned = false;\n          if (this.props.onDismiss) {\n            this.props.onDismiss();\n          }\n        }\n      };\n      DropdownInternal2.prototype.render = function() {\n        var id2 = this._id;\n        var props = this.props;\n        var className2 = props.className, label2 = props.label, options2 = props.options, ariaLabel2 = props.ariaLabel, required2 = props.required, errorMessage = props.errorMessage, propStyles = props.styles, theme = props.theme, panelProps = props.panelProps, calloutProps = props.calloutProps, _a2 = props.onRenderTitle, onRenderTitle = _a2 === void 0 ? this._getTitle : _a2, _b2 = props.onRenderContainer, onRenderContainer = _b2 === void 0 ? this._onRenderContainer : _b2, _c2 = props.onRenderCaretDown, onRenderCaretDown = _c2 === void 0 ? this._onRenderCaretDown : _c2, _d2 = props.onRenderLabel, onRenderLabel = _d2 === void 0 ? this._onRenderLabel : _d2, _e2 = props.onRenderItem, onRenderItem = _e2 === void 0 ? this._onRenderItem : _e2, selectedIndices = props.hoisted.selectedIndices, responsiveMode = props.responsiveMode;\n        var _f = this.state, isOpen = _f.isOpen, calloutRenderEdge = _f.calloutRenderEdge, hasFocus = _f.hasFocus;\n        var onRenderPlaceholder = props.onRenderPlaceholder || props.onRenderPlaceHolder || this._getPlaceholder;\n        if (options2 !== this._sizePosCache.cachedOptions) {\n          this._sizePosCache.updateOptions(options2);\n        }\n        var selectedOptions = getAllSelectedOptions(options2, selectedIndices);\n        var divProps = getNativeProps(props, divProperties);\n        var disabled = this._isDisabled();\n        var isSmall = responsiveMode <= ResponsiveMode.medium;\n        var errorMessageId = id2 + \"-errorMessage\";\n        this._classNames = getClassNames$4(propStyles, {\n          theme,\n          className: className2,\n          hasError: !!(errorMessage && errorMessage.length > 0),\n          hasLabel: !!label2,\n          isOpen,\n          required: required2,\n          disabled,\n          isRenderingPlaceholder: !selectedOptions.length,\n          panelClassName: panelProps ? panelProps.className : void 0,\n          calloutClassName: calloutProps ? calloutProps.className : void 0,\n          calloutRenderEdge\n        });\n        var hasErrorMessage = !!errorMessage && errorMessage.length > 0;\n        return React__namespace.createElement(\n          \"div\",\n          { className: this._classNames.root, ref: this.props.hoisted.rootRef, \"aria-owns\": isOpen && !isSmall ? this._listId : void 0 },\n          onRenderLabel(this.props, this._onRenderLabel),\n          React__namespace.createElement(\n            \"div\",\n            __assign$1({ \"data-is-focusable\": !disabled, \"data-ktp-target\": true, ref: this._dropDown, id: id2, tabIndex: disabled ? -1 : 0, role: \"combobox\", \"aria-haspopup\": \"listbox\", \"aria-expanded\": isOpen ? \"true\" : \"false\", \"aria-label\": ariaLabel2, \"aria-labelledby\": label2 && !ariaLabel2 ? mergeAriaAttributeValues(this._labelId, this._optionId) : void 0, \"aria-describedby\": hasErrorMessage ? this._id + \"-errorMessage\" : void 0, \"aria-required\": required2, \"aria-disabled\": disabled, \"aria-invalid\": hasErrorMessage, \"aria-controls\": isOpen && !isSmall ? this._listId : void 0 }, divProps, { className: this._classNames.dropdown, onBlur: this._onDropdownBlur, onKeyDown: this._onDropdownKeyDown, onKeyUp: this._onDropdownKeyUp, onClick: this._onDropdownClick, onMouseDown: this._onDropdownMouseDown, onFocus: this._onFocus }),\n            React__namespace.createElement(\n              \"span\",\n              { id: this._optionId, className: this._classNames.title, \"aria-live\": hasFocus ? \"polite\" : void 0, \"aria-atomic\": hasFocus ? true : void 0 },\n              // If option is selected render title, otherwise render the placeholder text\n              selectedOptions.length ? onRenderTitle(selectedOptions, this._onRenderTitle) : onRenderPlaceholder(props, this._onRenderPlaceholder)\n            ),\n            React__namespace.createElement(\"span\", { className: this._classNames.caretDownWrapper }, onRenderCaretDown(props, this._onRenderCaretDown))\n          ),\n          isOpen && onRenderContainer(__assign$1(__assign$1({}, props), { onDismiss: this._onDismiss, onRenderItem }), this._onRenderContainer),\n          hasErrorMessage && React__namespace.createElement(\"div\", { role: \"alert\", id: errorMessageId, className: this._classNames.errorMessage }, errorMessage)\n        );\n      };\n      DropdownInternal2.prototype.focus = function(shouldOpenOnFocus) {\n        if (this._dropDown.current) {\n          this._dropDown.current.focus();\n          if (shouldOpenOnFocus) {\n            this.setState({\n              isOpen: true\n            });\n          }\n        }\n      };\n      DropdownInternal2.prototype.setSelectedIndex = function(event2, index2) {\n        var _a2 = this.props, options2 = _a2.options, selectedKey = _a2.selectedKey, selectedKeys = _a2.selectedKeys, multiSelect = _a2.multiSelect, notifyOnReselect = _a2.notifyOnReselect, _b2 = _a2.hoisted.selectedIndices, selectedIndices = _b2 === void 0 ? [] : _b2;\n        var checked = selectedIndices ? selectedIndices.indexOf(index2) > -1 : false;\n        var newIndexes = [];\n        index2 = Math.max(0, Math.min(options2.length - 1, index2));\n        if (selectedKey !== void 0 || selectedKeys !== void 0) {\n          this._onChange(event2, options2, index2, checked, multiSelect);\n          return;\n        }\n        if (!multiSelect && !notifyOnReselect && index2 === selectedIndices[0]) {\n          return;\n        } else if (multiSelect) {\n          newIndexes = selectedIndices ? this._copyArray(selectedIndices) : [];\n          if (checked) {\n            var position2 = newIndexes.indexOf(index2);\n            if (position2 > -1) {\n              newIndexes.splice(position2, 1);\n            }\n          } else {\n            newIndexes.push(index2);\n          }\n        } else {\n          newIndexes = [index2];\n        }\n        event2.persist();\n        this.props.hoisted.setSelectedIndices(newIndexes);\n        this._onChange(event2, options2, index2, checked, multiSelect);\n      };\n      DropdownInternal2.prototype._copyArray = function(array2) {\n        var newArray = [];\n        for (var _i = 0, array_1 = array2; _i < array_1.length; _i++) {\n          var element2 = array_1[_i];\n          newArray.push(element2);\n        }\n        return newArray;\n      };\n      DropdownInternal2.prototype._moveIndex = function(event2, stepValue, index2, selectedIndex) {\n        var options2 = this.props.options;\n        if (selectedIndex === index2 || options2.length === 0) {\n          return selectedIndex;\n        }\n        if (index2 >= options2.length) {\n          index2 = 0;\n        } else if (index2 < 0) {\n          index2 = options2.length - 1;\n        }\n        var stepCounter = 0;\n        while (options2[index2].itemType === SelectableOptionMenuItemType.Header || options2[index2].itemType === SelectableOptionMenuItemType.Divider || options2[index2].disabled) {\n          if (stepCounter >= options2.length) {\n            return selectedIndex;\n          }\n          if (index2 + stepValue < 0) {\n            index2 = options2.length;\n          } else if (index2 + stepValue >= options2.length) {\n            index2 = -1;\n          }\n          index2 = index2 + stepValue;\n          stepCounter++;\n        }\n        this.setSelectedIndex(event2, index2);\n        return index2;\n      };\n      DropdownInternal2.prototype._renderFocusableList = function(props) {\n        var _a2 = props.onRenderList, onRenderList = _a2 === void 0 ? this._onRenderList : _a2, label2 = props.label, ariaLabel2 = props.ariaLabel, multiSelect = props.multiSelect;\n        return React__namespace.createElement(\n          \"div\",\n          { className: this._classNames.dropdownItemsWrapper, onKeyDown: this._onZoneKeyDown, onKeyUp: this._onZoneKeyUp, ref: this._host, tabIndex: 0 },\n          React__namespace.createElement(FocusZone, { ref: this._focusZone, direction: FocusZoneDirection.vertical, id: this._listId, className: this._classNames.dropdownItems, role: \"listbox\", \"aria-label\": ariaLabel2, \"aria-labelledby\": label2 && !ariaLabel2 ? this._labelId : void 0, \"aria-multiselectable\": multiSelect }, onRenderList(props, this._onRenderList))\n        );\n      };\n      DropdownInternal2.prototype._renderSeparator = function(item) {\n        var index2 = item.index, key2 = item.key;\n        var separatorClassName = item.hidden ? this._classNames.dropdownDividerHidden : this._classNames.dropdownDivider;\n        if (index2 > 0) {\n          return React__namespace.createElement(\"div\", { role: \"presentation\", key: key2, className: separatorClassName });\n        }\n        return null;\n      };\n      DropdownInternal2.prototype._renderHeader = function(item) {\n        var _a2 = this.props.onRenderOption, onRenderOption = _a2 === void 0 ? this._onRenderOption : _a2;\n        var key2 = item.key, id2 = item.id;\n        var headerClassName = item.hidden ? this._classNames.dropdownItemHeaderHidden : this._classNames.dropdownItemHeader;\n        return React__namespace.createElement(\"div\", { id: id2, key: key2, className: headerClassName }, onRenderOption(item, this._onRenderOption));\n      };\n      DropdownInternal2.prototype._onItemMouseEnter = function(item, ev) {\n        if (this._shouldIgnoreMouseEvent()) {\n          return;\n        }\n        var targetElement = ev.currentTarget;\n        targetElement.focus();\n      };\n      DropdownInternal2.prototype._onItemMouseMove = function(item, ev) {\n        var doc = getDocumentEx(this.context);\n        var targetElement = ev.currentTarget;\n        this._gotMouseMove = true;\n        if (!this._isScrollIdle || doc.activeElement === targetElement) {\n          return;\n        }\n        targetElement.focus();\n      };\n      DropdownInternal2.prototype._shouldIgnoreMouseEvent = function() {\n        return !this._isScrollIdle || !this._gotMouseMove;\n      };\n      DropdownInternal2.prototype._isAltOrMeta = function(ev) {\n        return ev.which === KeyCodes.alt || ev.key === \"Meta\";\n      };\n      DropdownInternal2.prototype._shouldHandleKeyUp = function(ev) {\n        var keyPressIsAltOrMetaAlone = this._lastKeyDownWasAltOrMeta && this._isAltOrMeta(ev);\n        this._lastKeyDownWasAltOrMeta = false;\n        return !!keyPressIsAltOrMetaAlone && !(isMac() || isIOS());\n      };\n      DropdownInternal2.prototype._shouldOpenOnFocus = function() {\n        var hasFocus = this.state.hasFocus;\n        var openOnKeyboardFocus = this.props.openOnKeyboardFocus;\n        return !this._isFocusedByClick && openOnKeyboardFocus === true && !hasFocus;\n      };\n      DropdownInternal2.defaultProps = {\n        options: []\n      };\n      DropdownInternal2.contextType = WindowContext;\n      return DropdownInternal2;\n    })(React__namespace.Component)\n  );\n  var _a, _b, _c, _d, _e;\n  var GlobalClassNames$2 = {\n    root: \"ms-Dropdown-container\",\n    label: \"ms-Dropdown-label\",\n    dropdown: \"ms-Dropdown\",\n    title: \"ms-Dropdown-title\",\n    caretDownWrapper: \"ms-Dropdown-caretDownWrapper\",\n    caretDown: \"ms-Dropdown-caretDown\",\n    callout: \"ms-Dropdown-callout\",\n    panel: \"ms-Dropdown-panel\",\n    dropdownItems: \"ms-Dropdown-items\",\n    dropdownItem: \"ms-Dropdown-item\",\n    dropdownDivider: \"ms-Dropdown-divider\",\n    dropdownOptionText: \"ms-Dropdown-optionText\",\n    dropdownItemHeader: \"ms-Dropdown-header\",\n    titleIsPlaceHolder: \"ms-Dropdown-titleIsPlaceHolder\",\n    titleHasError: \"ms-Dropdown-title--hasError\"\n  };\n  var DROPDOWN_HEIGHT = 32;\n  var DROPDOWN_ITEM_HEIGHT = 36;\n  var highContrastAdjustMixin = (_a = {}, _a[\"\".concat(HighContrastSelector, \", \").concat(HighContrastSelectorWhite.replace(\"@media \", \"\"))] = __assign$1({}, getHighContrastNoAdjustStyle()), _a);\n  var highContrastItemAndTitleStateMixin = {\n    selectors: __assign$1((_b = {}, _b[HighContrastSelector] = (_c = {\n      backgroundColor: \"Highlight\",\n      borderColor: \"Highlight\",\n      color: \"HighlightText\"\n    }, _c[\".\".concat(IsFocusVisibleClassName, \" &:focus:after\")] = {\n      borderColor: \"HighlightText\"\n    }, _c), _b[\".ms-Checkbox-checkbox\"] = (_d = {}, _d[HighContrastSelector] = {\n      borderColor: \"HighlightText\"\n    }, _d), _b), highContrastAdjustMixin)\n  };\n  var highContrastBorderState = {\n    selectors: (_e = {}, _e[HighContrastSelector] = {\n      borderColor: \"Highlight\"\n    }, _e)\n  };\n  var MinimumScreenSelector = getScreenSelector(0, ScreenWidthMinMedium);\n  var getStyles$4 = function(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m;\n    var theme = props.theme, hasError = props.hasError, hasLabel = props.hasLabel, className2 = props.className, isOpen = props.isOpen, disabled = props.disabled, required2 = props.required, isRenderingPlaceholder = props.isRenderingPlaceholder, panelClassName = props.panelClassName, calloutClassName = props.calloutClassName, calloutRenderEdge = props.calloutRenderEdge;\n    if (!theme) {\n      throw new Error(\"theme is undefined or null in base Dropdown getStyles function.\");\n    }\n    var globalClassnames = getGlobalClassNames(GlobalClassNames$2, theme);\n    var palette = theme.palette, semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var rootHoverFocusActiveSelectorNeutralDarkMixin = {\n      color: semanticColors.menuItemTextHovered\n    };\n    var rootHoverFocusActiveSelectorNeutralPrimaryMixin = {\n      color: semanticColors.menuItemText\n    };\n    var borderColorError = {\n      borderColor: semanticColors.errorText\n    };\n    var dropdownItemStyle = [\n      globalClassnames.dropdownItem,\n      {\n        backgroundColor: \"transparent\",\n        boxSizing: \"border-box\",\n        cursor: \"pointer\",\n        display: \"flex\",\n        alignItems: \"center\",\n        padding: \"0 8px\",\n        width: \"100%\",\n        minHeight: DROPDOWN_ITEM_HEIGHT,\n        lineHeight: 20,\n        height: 0,\n        position: \"relative\",\n        border: \"1px solid transparent\",\n        borderRadius: 0,\n        wordWrap: \"break-word\",\n        overflowWrap: \"break-word\",\n        textAlign: \"left\",\n        \".ms-Button-flexContainer\": {\n          width: \"100%\"\n        }\n      }\n    ];\n    var dropdownHeaderStyle = [\n      globalClassnames.dropdownItemHeader,\n      __assign$1(__assign$1({}, fonts.medium), { fontWeight: FontWeights.semibold, color: semanticColors.menuHeader, background: \"none\", backgroundColor: \"transparent\", border: \"none\", height: DROPDOWN_ITEM_HEIGHT, lineHeight: DROPDOWN_ITEM_HEIGHT, cursor: \"default\", padding: \"0 8px\", userSelect: \"none\", textAlign: \"left\", selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _a2) })\n    ];\n    var selectedItemBackgroundColor = semanticColors.menuItemBackgroundPressed;\n    var itemSelectors = function(isSelected) {\n      var _a3, _b3;\n      if (isSelected === void 0) {\n        isSelected = false;\n      }\n      return {\n        selectors: (_a3 = {\n          \"&:hover\": [\n            {\n              color: semanticColors.menuItemTextHovered,\n              backgroundColor: !isSelected ? semanticColors.menuItemBackgroundHovered : selectedItemBackgroundColor\n            },\n            highContrastItemAndTitleStateMixin\n          ],\n          \"&.is-multi-select:hover\": [\n            { backgroundColor: !isSelected ? \"transparent\" : selectedItemBackgroundColor },\n            highContrastItemAndTitleStateMixin\n          ],\n          \"&:active:hover\": [\n            {\n              color: semanticColors.menuItemTextHovered,\n              backgroundColor: !isSelected ? semanticColors.menuItemBackgroundPressed : semanticColors.menuItemBackgroundHovered\n            },\n            highContrastItemAndTitleStateMixin\n          ]\n        }, _a3[\".\".concat(IsFocusVisibleClassName, \" &:focus:after, :host(.\").concat(IsFocusVisibleClassName, \") &:focus:after\")] = (_b3 = {\n          left: 0,\n          top: 0,\n          bottom: 0,\n          right: 0\n        }, _b3[HighContrastSelector] = {\n          inset: \"2px\"\n        }, _b3), _a3[HighContrastSelector] = {\n          border: \"none\"\n        }, _a3)\n      };\n    };\n    var dropdownItemSelected = __spreadArray(__spreadArray([], dropdownItemStyle, true), [\n      {\n        backgroundColor: selectedItemBackgroundColor,\n        color: semanticColors.menuItemTextHovered\n      },\n      itemSelectors(true),\n      highContrastItemAndTitleStateMixin\n    ], false);\n    var dropdownItemDisabled = __spreadArray(__spreadArray([], dropdownItemStyle, true), [\n      {\n        color: semanticColors.disabledText,\n        cursor: \"default\",\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n          color: \"GrayText\",\n          border: \"none\"\n        }, _b2)\n      }\n    ], false);\n    var titleOpenBorderRadius = calloutRenderEdge === RectangleEdge.bottom ? \"\".concat(effects.roundedCorner2, \" \").concat(effects.roundedCorner2, \" 0 0\") : \"0 0 \".concat(effects.roundedCorner2, \" \").concat(effects.roundedCorner2);\n    var calloutOpenBorderRadius = calloutRenderEdge === RectangleEdge.bottom ? \"0 0 \".concat(effects.roundedCorner2, \" \").concat(effects.roundedCorner2) : \"\".concat(effects.roundedCorner2, \" \").concat(effects.roundedCorner2, \" 0 0\");\n    return {\n      root: [globalClassnames.root, className2],\n      label: globalClassnames.label,\n      dropdown: [\n        globalClassnames.dropdown,\n        normalize$1,\n        fonts.medium,\n        {\n          color: semanticColors.menuItemText,\n          borderColor: semanticColors.focusBorder,\n          position: \"relative\",\n          outline: 0,\n          userSelect: \"none\",\n          selectors: (_c2 = {}, _c2[\"&:hover .\" + globalClassnames.title] = [\n            !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n            { borderColor: isOpen ? palette.neutralSecondary : palette.neutralPrimary },\n            highContrastBorderState\n          ], _c2[\"&:focus .\" + globalClassnames.title] = [\n            !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n            { selectors: (_d2 = {}, _d2[HighContrastSelector] = { color: \"Highlight\" }, _d2) }\n          ], _c2[\"&:focus:after\"] = [\n            {\n              pointerEvents: \"none\",\n              content: \"''\",\n              position: \"absolute\",\n              boxSizing: \"border-box\",\n              top: \"0px\",\n              left: \"0px\",\n              width: \"100%\",\n              height: \"100%\",\n              // see https://github.com/microsoft/fluentui/pull/9182 for semantic color disc\n              border: !disabled ? \"2px solid \".concat(palette.themePrimary) : \"none\",\n              borderRadius: \"2px\",\n              selectors: (_e2 = {}, _e2[HighContrastSelector] = {\n                color: \"Highlight\"\n              }, _e2)\n            }\n          ], _c2[\"&:active .\" + globalClassnames.title] = [\n            !disabled && rootHoverFocusActiveSelectorNeutralDarkMixin,\n            { borderColor: palette.themePrimary },\n            highContrastBorderState\n          ], _c2[\"&:hover .\" + globalClassnames.caretDown] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:focus .\" + globalClassnames.caretDown] = [\n            !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin,\n            { selectors: (_f = {}, _f[HighContrastSelector] = { color: \"Highlight\" }, _f) }\n          ], _c2[\"&:active .\" + globalClassnames.caretDown] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:hover .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:focus .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:active .\" + globalClassnames.titleIsPlaceHolder] = !disabled && rootHoverFocusActiveSelectorNeutralPrimaryMixin, _c2[\"&:hover .\" + globalClassnames.titleHasError] = borderColorError, _c2[\"&:active .\" + globalClassnames.titleHasError] = borderColorError, _c2)\n        },\n        isOpen && \"is-open\",\n        disabled && \"is-disabled\",\n        required2 && \"is-required\",\n        required2 && !hasLabel && {\n          selectors: (_g = {\n            \":before\": {\n              content: \"'*'\",\n              color: semanticColors.errorText,\n              position: \"absolute\",\n              top: -5,\n              right: -10\n            }\n          }, _g[HighContrastSelector] = {\n            selectors: {\n              \":after\": {\n                right: -14\n                // moving the * 4 pixel to right to alleviate border clipping in HC mode.\n              }\n            }\n          }, _g)\n        }\n      ],\n      title: [\n        globalClassnames.title,\n        normalize$1,\n        {\n          backgroundColor: semanticColors.inputBackground,\n          borderWidth: 1,\n          borderStyle: \"solid\",\n          borderColor: semanticColors.inputBorder,\n          borderRadius: isOpen ? titleOpenBorderRadius : effects.roundedCorner2,\n          cursor: \"pointer\",\n          display: \"block\",\n          height: DROPDOWN_HEIGHT,\n          lineHeight: DROPDOWN_HEIGHT - 2,\n          padding: \"0 28px 0 8px\",\n          position: \"relative\",\n          overflow: \"hidden\",\n          whiteSpace: \"nowrap\",\n          textOverflow: \"ellipsis\"\n        },\n        isRenderingPlaceholder && [globalClassnames.titleIsPlaceHolder, { color: semanticColors.inputPlaceholderText }],\n        hasError && [globalClassnames.titleHasError, borderColorError],\n        disabled && {\n          backgroundColor: semanticColors.disabledBackground,\n          border: \"none\",\n          color: semanticColors.disabledText,\n          cursor: \"default\",\n          selectors: (_h = {}, _h[HighContrastSelector] = __assign$1({ border: \"1px solid GrayText\", color: \"GrayText\", backgroundColor: \"Window\" }, getHighContrastNoAdjustStyle()), _h)\n        }\n      ],\n      caretDownWrapper: [\n        globalClassnames.caretDownWrapper,\n        {\n          height: DROPDOWN_HEIGHT,\n          lineHeight: DROPDOWN_HEIGHT - 2,\n          // height minus the border\n          paddingTop: 1,\n          position: \"absolute\",\n          right: 8,\n          top: 0\n        },\n        !disabled && {\n          cursor: \"pointer\"\n        }\n      ],\n      caretDown: [\n        globalClassnames.caretDown,\n        { color: palette.neutralSecondary, fontSize: fonts.small.fontSize, pointerEvents: \"none\" },\n        disabled && {\n          color: semanticColors.disabledText,\n          selectors: (_j = {}, _j[HighContrastSelector] = __assign$1({ color: \"GrayText\" }, getHighContrastNoAdjustStyle()), _j)\n        }\n      ],\n      errorMessage: __assign$1(__assign$1({ color: semanticColors.errorText }, theme.fonts.small), { paddingTop: 5 }),\n      callout: [\n        globalClassnames.callout,\n        {\n          boxShadow: effects.elevation8,\n          borderRadius: calloutOpenBorderRadius,\n          selectors: (_k = {}, _k[\".ms-Callout-main\"] = { borderRadius: calloutOpenBorderRadius }, _k)\n        },\n        calloutClassName\n      ],\n      dropdownItemsWrapper: { selectors: { \"&:focus\": { outline: 0 } } },\n      dropdownItems: [globalClassnames.dropdownItems, { display: \"block\" }],\n      dropdownItem: __spreadArray(__spreadArray([], dropdownItemStyle, true), [itemSelectors()], false),\n      dropdownItemSelected,\n      dropdownItemDisabled,\n      dropdownItemSelectedAndDisabled: [dropdownItemSelected, dropdownItemDisabled, { backgroundColor: \"transparent\" }],\n      dropdownItemHidden: __spreadArray(__spreadArray([], dropdownItemStyle, true), [{ display: \"none\" }], false),\n      dropdownDivider: [globalClassnames.dropdownDivider, { height: 1, backgroundColor: semanticColors.bodyDivider }],\n      dropdownDividerHidden: [globalClassnames.dropdownDivider, { display: \"none\" }],\n      dropdownOptionText: [\n        globalClassnames.dropdownOptionText,\n        {\n          overflow: \"hidden\",\n          whiteSpace: \"nowrap\",\n          textOverflow: \"ellipsis\",\n          minWidth: 0,\n          maxWidth: \"100%\",\n          wordWrap: \"break-word\",\n          overflowWrap: \"break-word\",\n          margin: \"1px\"\n        }\n      ],\n      dropdownItemHeader: dropdownHeaderStyle,\n      dropdownItemHeaderHidden: __spreadArray(__spreadArray([], dropdownHeaderStyle, true), [{ display: \"none\" }], false),\n      subComponentStyles: {\n        label: { root: { display: \"inline-block\" } },\n        multiSelectItem: {\n          root: {\n            padding: 0\n          },\n          label: {\n            alignSelf: \"stretch\",\n            padding: \"0 8px\",\n            width: \"100%\"\n          },\n          input: {\n            selectors: (_l = {}, // eslint-disable-next-line @fluentui/max-len\n            _l[\".\".concat(IsFocusVisibleClassName, \" &:focus + label::before, :host(.\").concat(IsFocusVisibleClassName, \") &:focus + label::before\")] = {\n              outlineOffset: \"0px\"\n            }, _l)\n          }\n        },\n        panel: {\n          root: [panelClassName],\n          main: {\n            selectors: (_m = {}, // In case of extra small screen sizes\n            _m[MinimumScreenSelector] = {\n              // panelWidth xs\n              width: 272\n            }, _m)\n          },\n          contentInner: { padding: \"0 0 20px\" }\n        }\n      }\n    };\n  };\n  var Dropdown = styled(DropdownBase, getStyles$4, void 0, {\n    scope: \"Dropdown\"\n  });\n  Dropdown.displayName = \"Dropdown\";\n  const fabricIconsWoff = \"data:font/woff;base64,d09GRgABAAAAABuQAA4AAAAAMIgABKj2AAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEgAAABgMVN8b2NtYXAAAAGMAAABEAAAArIn/BeDY3Z0IAAAApwAAAAgAAAAKgnZCa9mcGdtAAACvAAAAPAAAAFZ/J7mjmdhc3AAAAOsAAAADAAAAAwACAAbZ2x5ZgAAA7gAABITAAAepM100RhoZWFkAAAVzAAAADIAAAA2BVACQGhoZWEAABYAAAAAFQAAACQQAQgDaG10eAAAFhgAAABQAAAAchoOED5sb2NhAAAWaAAAAHAAAABw0ZDZvG1heHAAABbYAAAAHQAAACAAWQIibmFtZQAAFvgAAAP3AAAJ+pKX8lVwb3N0AAAa8AAAABQAAAAg/1EArnByZXAAABsEAAAAiQAAANN4vfIOeJxjYGH/xDiBgZWBgXUWqzEDA6M0hGa+yJDGJMTBysrFyMQIBgxAIMCAAL7BCgoMDs95vzpzgPkQkgGsjgXCU2BgAAD3EghqeJxjYGBgZoBgGQZGIMnAuAbIYwTzWRgnAOkEBgcGVgaF57zP+Z8LPhd6Lvxc4rnMc6Xnvs8zn094PvX5sufLnx9+IfPC4cWUF9NeLH9x4sXvl6IvS17ufXnoFfNrjteX36x+s+bNqTen3zK9bXuX+W7m+/73Ez72fFz16dhnn8/Bn598Vfnq/P8/AwPYBgG4DYpYbJiEZEMxDhsy3s3AboPEF4nfEp8kvkp8lHgr8QoID0jMl6iTqJLIkciU8BN/K35ZvEm8UbxQPFBcXpxNbKVYolismJyohIi/cKVwuXCMcJSwqtAiwYOCkwXmC8zlW8zXxpvN85znPk8AtyDXZ0jo0RYwstHejsEOAFLcpEl4nGPQYghlKGBoYFjFyMDYwOzAeIDBAYsIEAAAqhwHlXicXY+/TsNADMZzJLSEJ0A6IZ11KkOViJ3phksk1CUlDOelgNRKpO+AlIXFA8/ibhnzYgjMEf4utr/P+ny/c6f5yXx2nKVHKilWnDfhoNQLDurtmf35IU/vNmVhTNV5VvdlwWoJomtOF/VNsGjI0PWWTG0eH7acLWKXxY7w0nDShk7qbQB2qL/HHeJVPJLFI4QS30/xfYxL+rUsVobTiyasA/des/OoAUzFYxN49BoQf8ikP3VnE+NsOWXbwE5zgkSfygL3RJqE+0uPf/Wgkv+G+23Iv6tB9U3c9Bb0h2HBgrChl2fbUAkaYPkOhPxkxgABAAIACAAK//8AD3icnVh7cFRVmj/ffaYREm46SedFwk2nuwkhCelOp8E86EQSeSwkBgapboMwCktQMrqKGEDngKPgBHFMZtx1YLWUCZY7o7vrc2uYXdupLXGmZsQdtsbaSu38oQKzs+Jzq5TOvSf7nXNvd5rglu509+3zuOfxnfO9ft9HJHKKEOV76j1EJjohMcM0AqZhnpL/YL0qvWqvIeo96e//UFlP8APECxf0S1oDUbHh80AM9PGE5bW8CXlca8CafClh7cZx+MnDL7kGxxWbht8wo6YRMfKIFadWXE5RxS3llBXH8Z+Tz/V5+jw+3gO6B0K4tgd8SlJ6MWGvs9clpBft9QnpJemlhEKuaNrrcQhupxCNaHpaT5MYuYscJsdx56KS4iKtWJUDmu5V5RrNXxP0ywFvMIRdLcFoS2s04FVbY9gVbo2ESyI4qMQX8EInRFuCoVhIbYSQN6Q3gr9G00O6Nx/0gO7Lh+KiEp/uC1SBT/bFqiASbo35YnInxNQYhKuk4qJ8yV/TKEVbOiVvuBPLRmznY3+VpH0BAPJT7N3S8pXs4NOeQg/+nmYHV5aXsnefAhmA2U9BHb6F72bewnfxLdQ9xY5IiiJ9uIl9Wt0VXPHOD31LfaVNpePvrAjGF7JPN33ovIWCq99CwSZrbP3DO9radjy8PlPGtq6qq1u1NeaWSu3/jxg79yDsP3Ev3DG73YdXkpr79ipSpV25ZPHSpjmEiZJIBH95RKOkkoSRtwYyM2Tmy/VgmKEYChdevM/shIieL+tmCDlndMIKMKtkXx6Jrz/UxAorNw6NdMVtSqlE410jQxsr4aOmQ+vjpTUVvrn2XQWV9w8M3F9ZID0y11dRU6oRi17X0XZzd61E4nGJ1Hbf3NZx3Whe6YLaovq+YcM6Zgz31RfVLijN4+KO9BGaR3SKWlTApR7pMiCqmk4lj9iE4aPTy6howJWNTtrEmpQDMpmkAZvYAWlSJviCylSnCiVeEiJtuNIsiTK/pg2kotFfVORvrHBLueLrOhSa0/hGJZ5XokBUqhPHbkDE8CNPDAlvF4+gkzTqI38yd+PYA5X0cN6BDoaKyqlr/OuvCQXxiyyLVUlKJNypoMYoXGN0s5ibDdSs1lhrbSTsK/GVKAR2J9huZWl///pjx15LnX3hmScfODTY1FOyf9GzH0DJ4/vPn/nJnnh8z0/OnN9/6H/OPReDOkaosahky/3fg8aTZ1OvHTumEXuSjSVgTEremTorutb3L49t3/5wz+M31Dz22Qtb+fwPDjhrrX7on++mEmEfLexYcF9yy7f5xkTYnMy58kkRqSD13OZoOqjchHCBBDQRHinQKIegU86YAT2PhJemJ+3DT6qBpQe6e/Ylo5d7dz3hV5azyamlsHpOQ3ygUWVljbXF5vK19cHlzUvKtH/sPoBznpRGcE44mtw3dY//iV3KtRBIXzPQOBBvmCO/V7akeXmwfu1ys7i2sSznzv1oEbkUKSglCtca4IYw2hKDRrRzncpsE6XGt7184uBN4fBNB0+8vO2+81utj73l5UGvPL9vo9O393cnkskTv9vrlnge0e1M29hnfeINlpd7ZWPr+fucvimSM1yUwoOQrL5wGq/jkoGuJ2b6VDNk6lj9OmsKYW7hxWla88iXRApQ6VUKEyxA7VcpC+iow7tOj/b3j57elSn7ju7s6Nh5tM8t7UfLg0htMOiILOWfKaLQ3Cm8tGjOJFHKVMzDh181TiV4FLzvajxNA2kmUbIcT+Q3OP0mP4Dhj5r8FBGusgugToqaYBpFJdhGT+Q3IuA+OqFVLb2LLLKot6UKBY9rHVCudxKxCFCGKjaFuyukPGgjyeA+Gk3H+RQ+WU1RmtFYSqdJOs5pTSm4gPMQTm5GRprJLWQvGSVPkZfIGS4tSpVUWFwk5UuKe/eKe+9uu7BTqvXOaKrCucE1N+JwTHG4M8syzW67pTsHuXvle3lWWyGPgPbB6QdXr37w9Acs/Uh0sKfOW1lT6a3r2dISbIu2tK9Zyvv4a1CP5doBp87vAsdF2taE+4/ubBdzsY/NNnFwfFaHNHvE9lnt87PaecSl8RGW5hTX9QxGm1e3t0Tbgi1bslQPRt0DfUlzyXTqfCUxrn3n0f7mtW0RnMv7VDLbGMNVPewqgz79DcYQGTIyXE/ayVrH9ywAoW2OGBsZdhiORHPuQZRbaYf/2AUtrTFETKaYZGpCIGsMs8Lg20yjSA9Go4O9i6aFm+ItmXKZzh6GtoXzSudZcd5QkBYuzHFlXlmJlRJkEz6bz3P0Qqa8PYVaa2flXaJyPLaldI6HN2xKAAGpV7PwXMGMJUQrHRI4z7XJrqNRlfjWF0/Qm8JD26zTCXll36bkiXf23D5x9OD1MIHIAT3E0N5R3QrfRE+8uPXh6W3WLxJyT9/ZO/a8cyLZdduRVQgtWHLZ0OC6WLXw5e59KljMc+2b1/SI0tDJZaokAxBgk6jTaKrUyXQgD2ECBC4nVbTglznmBoV4xRqcdrNRdmxfiQ99qGO/UX0UHxJvKmj5rj94dOJ2TsymPnllwjq9bcghdePo3qHtty7DS9LIqiO3dfFj3XG2Txxy2/TDzqGrY+sGh5bxg7o+W39Tf5PUkm7cOR83DqE/4wqJAF1HeB7jTs4HQa6bCHxjoAm6OIl4vc7l8in6m+aK6/rCNdXswXlzy5t7l7D77beONEjL2f0Nva/cMrAW9mvFwZgJx2LNzCifl8eKypYsaapYfluj9PTCGn1e4Rz47/JmtciMBYs19mCwf1HXri3fWgKH7DMNR6RlcKihd00Z7K+uae5bucK028rh4+ZYZXM5K55TOFc3F9o3N962rKKpYUkZfJiHbJABfY9OBHbRiIfzJWIgU0IGSgqFOAYndhUIACPjN02+UArtL75qHqIek88EDQUwjVGNFZfeczyJTSTP1EeSx4mbkIeX9EtXxzfyGAZM1u6EPGYNYxAlj2N8c0XTGsYhHEPBBnQyDXl877mEBFDpvDwAQ8oBEC422OP2eALOUTiHnkA+Zx+T/irBFqvPpW+E3zsYDBBX6tzgF3JJQm+EKuA3eMQnnK2GAyhbloS3JuhlqhJUS47vGJ0QnSj9NvpFalGUZi7XiHZxrWuIQXyuZKPDjngjoQB3a+LBhdGZMiIncenAxIRFpcA0sZOcYIayqBBlcioA6LgYficmgaRRgQBvUsSaAYw1L3EM6dwWSBSPKHlVbyI9DgFpOGF/pBYm0mMiNpVwpopfvOurMLNC+o4OtbcPHe3rH+XlqEpzGv38pVgDDpMy9aJ+ke8Z8PAIV1eHrTL54og1Jg+PYEVUrbER3K+MlGkj7liHn9LYiDyML+WLVlkZVnGKVWaVkTk8NhD3xTF9PWkiEcQ7bWQFYp7rr6Z2NsrxIiSQOb4uNjGeiJpe3EvSwRvCK/FBSE4NntzX27vv5GCm7L77xkjkxru7u/fcGA7fuOeQADUKcnIKbxnofvZpAubLTVCQYJ8kkzA/MfWXSfZJQiO5i/DSJji9O3c5mXMHV1IEUoLFOJl9av0bzoYCuSmJS1qVSVwf5U3lMqJ/iXgI8ac3XNspFUZbpFCVmsEVtYj4qwAcFCGFSpx+vUSh6BbfP/3Q6pVd9E9vPXNX5+qHTr+PvvT7LH0xtbK6Q64+cP7MyT3x/sfeRgNy6J/eY5cfo9AjET4OtEceBHLX/MTR1979/CC6X77QqsNv3KsoDL3syTPnDxyZ/o+/ixx/Zox9/PnZv91u0COc99xWc/2gIp5BGfKi9AZ46ObqKsoCKhDaZERZPASBMTacgHEYT7BhGMOIhId2lNsM8F7Rz/hYvA++Pse7UcRaIk7AQNXJJWCMioY1guyNoPPslGNOAgLDBrTwCBqLuU/FIAhjCBPlAQfz8XwFwEWKTX57eJeNaIU62qtXrtvUHKivDzRvWreyur0DdRl7F65cuylcu2SmV0Nt3rRqQWv5tckV5hQ1VySvLW9dsGpTtk+Z6dPJrl9tbljT0eIz2hYvbjN8LR1rGjb/ahel2N+0uj1carRf2W+TgXv9+RXeRUMjh3t7D48MLfJW5PvvHfjKXuFrdojYfhW5Ae+mSubqUA/RSFYTNN3xfHowoxVtUOzPAkhfpyzirRhPSqEz1AY3P3Fn1/UjJwfjcVcLugv9xpz19/zNxt5DuzeWrd2QUX48xM9Hb7hh9Oe7GpsW7TpwdHXyuUdvZ13IvnPsXGKcKtPampEnNw+eHLmeCm3A5RRl46ND7Yv/4rZuf8aOUL4CX8nT8e2ewLLtxywNmX8OGhJj0oQbKz6g2zrPifmEDSDI1UgmgAGfHtJDsVDMF/OpukAHIfzjih7SIWKCbqjZeAN+/H7i/czPfrkr/QOdxONpkpLQbMJ1yT+egq4fsVfsipSacqMbqzxnyvtxlVrzu7rkO1jydYQbhP1L8r9OsZR04Q170qWV5zIcWuswmrmS1pyMnoc3RJPTWuxHLTHMGUoljDzwh17V+jHsmMIlaYbMVJIdt0lKnpihMeEMBYJFnB1PIpUY6WRo7ErCDiCcQjkbt1SgbdkwO16pbZS+OkLBUDcTBTcqHDrNjihctP5/BhBOUmDwp4/v27x06eZ9j/90MKc+G/O7q1wB8TMZhdxFtYVXLeXWr8ydVDhx/Dc76Z91sj/3BDmxJNq3ElJOqoiJuDHkZER0nnAIgUg5IGQ0wwgSS8CUEQebXo/Ci5AJ/jxSYMULq6sLrXiBB2helaFQoyoPqMf6Efv9b6RfWg+w38Ktv7H/KO1mf4AP4Rb7WqkB668A3Mp+ayspX+EU9fkUWugrLJBovmHk27RAamR4ifyxqV0i/cm6U36Ul1TcLEo4zWI6HVsFaPt9eNc8ihf0cz/A0U3UFXMMasok08h8IfOgPqBRvSzwC6PC0WKc7j7gPhxSpUV2TCYzsk5cJbGzTfHQ3H8q8Mk5QtTn9bTAnjrIfi/3TurzCfYCjmM/S8AluKTNS8ANX1q6LtqMwyH4d6Kpf6/bYp7I28sRL6gbk8zLCpMwgJNhg7QuwbxwCdfSpS9tDjclEiZlOsdDqkCuHPirAr8qY9Zj8ndGODSS3xbYiFf1YYGNZlASrwkZRqykvz2zDhIdECCYD7AQKn3Hesyudaq4hn6Rw6YZACVqwkc7OSPicokIjOkHv+BEBCIZZqjIBZvey1acsbF2L7xxxsLL51hWF5ds4XVz0yQjInLYxP+FXZnJ4VZw3jvZW462xbo+PWunyVUp3UDywoXk+fPiPye72xpws7uTmZf472RGhV7nIYIuz0gbmDw36jfqJPxDfG4iwnNiU/FETYgF3EOiUE/CQII9j5KscHzBnk/AAJucOsfFIcA43KA8mGQvJKwNMh5cQlrdQRJx38CG9PPOGrganwQbEnww3g/XGYH1S1E/diLvPBjDGhzr84in2KOIEsNYK2Wl5Lj9qHSndGf6LL96lT9npj5jN8PTSj48/QP2FnsLllk72etyM3RZZ+Vm9rp1lvOUC7gevzKmwnUxuEGhp2pqKkWl9+wqR2dsHpR9IXlEWIUxUSa+Lhf+1Cz+qiRFbhLDdDIW1EmizM5GKKlssmJKvMLDf1XOQaHZpISdkkQCAumqJK36By5+nEPySTH2oAQhPzEschjpkUxuAbHBjWANfAbPavAzuxPIL1mH9K/syR54Fj6zdrNfTxOmw260gVot01H/v4WWUKFTZwzl13i/xNr7D8ryqVf1NcjUbfkGl3IjH3dOYdRKc+NaP+eR7OHxaTol4tqZ+JRHtqrH/oKHtiQvK4+yyFWUoQUMoEQ2O1qG0blehnYjYsgi2+qAAa7CesgrQBeganhkrhqSyDBiqMeOp1JSRSDj39nBJA+gkxMTyWm0ackJO3nqVHJaxNTYxLrG58GON6QkOn37AreRWSQRSIIYlZ4vpiRPyZ/gQiBM5bRYlGdY3Lh0ti2/i3yXjJK/Jifd06CMqbPKTH+gJBuLtUMslA/cd5XkxmfZpIdIXFbiwXMSIZFsMBeCcCvCeMSuiPFB/EdEzxX9OXVJpHZ5WEXdylSmomYq7JKXyx6XU/hFeW9gcd00yfbwcnEdkNlDYPaQ9AaXJZp7u8GpC25FyvSgtFE0jAjBULhQnZECGX0XRu7jdYszS2lztS3lld5pMtPFSy+Qq8bA7DH27gxvZzLpLFub4Tz5X7oQ0KMAeJxjYGRgYGBZ8W1igahBPL/NVwZuDgYQ2P/3YAOIvmfgdQZEczCAxTkZmEAUAE1pCdgAAHicY2BkYOBgAAE4yciACpgAAsoAHQAAAHicY9ViWMbBwCDMwMDwmYGNAQQamBoYYADIYmxgBNKMLEAWEDIIMwaDxYWZGhjbmSSBbFYgD6EDrIvxMuMVBiMGSTgfCBlkGA6AOACflgxrAAAAFgAqAEIAZAFUAaQByAIcAjICngLsAzwDpAP+BQYFcgWuBdAGDAZ6BpYGsgbUBvQHGgdMB2QHhgecB7IILAiECLQJQgm0CgoKWgrQCyQLgAvWC/IMDgwyDFYMhgy8DRANQA1eDaQN5g4EDmYPUnicY2BkYGAwZzjBwMsAAoxgkguEGSNBTAAdRwF9AAAAeJy1VD+LHDcUf3u79l1wfARDwKWKEM7HMmtfzJnY1WHHla85mwM3Ae2MdkZ4diQkjYcxLlK6yMdIY8inCAmkTJ1PkDpVyrz3pNnb827MJZAdRvPT0/v7e08LALdHX8II4u8rfCMewS3cRbwDu/BNwmOUP0t4gvjbhK/Bp2ATvg6fwduEd+Fr+D7hPfgcfkn4BhzC7wnfHP08miS8D4c7v2KU0eQT3BU7fyY8gi/G5wnvwP74TcJjlL9LeIL4x4Svwe3xbwlfBzH+I+FdcJO9hPfgcDL4uQEvJj8kfHP8bvJXwvvwYu+7n96Lo7v3HohTnTvjzSKIx8ZZ42TQpsnESV2LM11WwYsz5ZV7rYrsqZw7nYvTJ8+OxIn3KvgzVba1dJsHm5Jz5Tx6Fvez4+N4Sofx7LkqjRLaCymCk4VaSvdKmIUIlVrLr3SmtSTOzdLKRiufbU2+CsE+nM26rsuWw3mGNrPQW1M6aat+tjBN8LMLc99aW2tVCDrIxEvTiqXsResVJoGJkVgEI3KnZFBTUWhva9lPhWwKYZ3G0xxVFH6lF1a5pQ4B3c17LqLWuWrIFx54YdwAFhRhulmqdaZo8zAVxDzaTslmCKAb0VU6r9Yy6zCobvK6LbBNq+xNU/fiQN8RajnHXC7U0cPHsmX1QjelcMoH7BSxehGAzFe+HjEDBxqjBLWkFjiNUQvTNbWRxWX2ZKRKOSrHYChc22DbIApFZZJOpWp7mVEcxqZP6tQQdIj8VHquMefs6t2G9yDgCO7CPXiA6BQ05ODAgMd3AQFljxE5vPO0SpRoRA1keHICNT4CzlBWQoVnnncKvwq1X+NaoOZTtJvjnnxTjCf4z3LE9p41yY6sSmjRn0TNq1hcReec8/ApZwH3MZtjfNZtB8t1u+ecjcFVoA5VJfENzECB0iVn+QplxBKdVKy7jb+S9y0yOGjn+F3iXmJOmtnK/gXzxHNA6UOY4dPxk6G/D+2zFGeGuGcvJfux6KFH6YK9UbWzrdE952yxI5r7KFYW1PuXXJNgJnr8tsxdZCIyNmiTzHDVDjWoDgVT3BesZ7njPUuID4pjuTPRNk9eVNpL9m25r1Rz4DOymnMeQydqroishryihecuuA3JYlXD9Epdtbwv0CbH/ZT5ijMf405XcT6sQPMkdsxTjut2zrpUKWnnWE3Lc1ds5Z5sakYHqH8HvzSh88TLNu8xh//K7YX3gj2VKHM8xyHdqWFWt1UwRN/M69HaDFAlsZbA8YZbQP5jrQVKOq7c8K382OzJS1OluC8mrbGqiFu+WS1bUrZDNwc/pFnzTf7nGY3/jE3qzIX34YboxDLND+U7Z6Zjb/+Hu/03hsc4mgB4nGNgZgCD/34M5QyYwBwAKWEB/3ic28CgzbCJkZNJm3ETF4jcztWaG2qrysChvZ07NdhBTwbE4onwsNCQBLF4nc215YVBLD4dFRkRHhCLX05CmI8DxBLg4+FkZwGxBMEAxBLaMKEgwADIYtjOCDeaCW40M9xoFrjRrHCj2eQkoUazw43mgBvNCTd6kzAju/YGBgXX2kwJFwDEASgaAAAA\";\n  function initializeIcons$1() {\n    const subset = {\n      style: {\n        MozOsxFontSmoothing: \"grayscale\",\n        WebkitFontSmoothing: \"antialiased\",\n        fontStyle: \"normal\",\n        fontWeight: \"normal\",\n        speak: \"none\"\n      },\n      fontFace: {\n        fontFamily: '\"FabricMDL2Icons\"',\n        src: `url(\"${fabricIconsWoff}\") format(\"woff\")`\n      },\n      icons: {\n        Accept: \"\",\n        Add: \"\",\n        BIDashboard: \"\",\n        Camera: \"\",\n        Cancel: \"\",\n        ChevronDown: \"\",\n        ChevronLeftMed: \"\",\n        ChevronRightMed: \"\",\n        Clear: \"\",\n        ClearFilter: \"\",\n        ClearNight: \"\",\n        CloudDownload: \"\",\n        Color: \"\",\n        Copy: \"\",\n        CubeShape: \"\",\n        Delete: \"\",\n        Diamond: \"\",\n        DiamondSolid: \"\",\n        DoubleChevronLeft12: \"\",\n        DoubleChevronRight12: \"\",\n        Download: \"\",\n        Edit: \"\",\n        Filter: \"\",\n        Filters: \"\",\n        FiltersSolid: \"\",\n        Flow: \"\",\n        History: \"\",\n        HourGlass: \"\",\n        More: \"\",\n        Next: \"\",\n        OpenInNewWindow: \"\",\n        Page: \"\",\n        Pause: \"\",\n        Photo2Add: \"\",\n        Photo2Remove: \"\",\n        PicturePosition: \"\",\n        Pin: \"\",\n        Pinned: \"\",\n        PlayResume: \"\",\n        PlayReverseResume: \"\",\n        Previous: \"\",\n        RadioBtnOff: \"\",\n        RadioBtnOn: \"\",\n        RadioBullet: \"\",\n        Redo: \"\",\n        RemoveFilter: \"\",\n        ScaleVolume: \"\",\n        Search: \"\",\n        Settings: \"\",\n        SortDown: \"\",\n        SortUp: \"\",\n        Sunny: \"\",\n        Table: \"\",\n        Undo: \"\"\n      }\n    };\n    return subset;\n  }\n  let registerIcons;\n  let unregisterIcons;\n  function initializeIcons() {\n    [initializeIcons$1].forEach((initialize2) => {\n      const subset = initialize2();\n      unregisterIcons && unregisterIcons(Object.keys(subset.icons));\n      registerIcons(subset, {\n        disableWarnings: true\n      });\n    });\n  }\n  function use(_registerIcons, _unregisterIcons) {\n    registerIcons = _registerIcons;\n    unregisterIcons = _unregisterIcons;\n  }\n  var ONKEYDOWN_TIMEOUT_DURATION = 1e3;\n  var getClassNames$3 = classNamesFunction();\n  var getSlotStyleFn = function(sty) {\n    return function(value2) {\n      var _a2;\n      return _a2 = {}, _a2[sty] = \"\".concat(value2, \"%\"), _a2;\n    };\n  };\n  var getPercent = function(value2, sliderMin, sliderMax) {\n    return sliderMax === sliderMin ? 0 : (value2 - sliderMin) / (sliderMax - sliderMin) * 100;\n  };\n  var useComponentRef$1 = function(props, sliderBoxRef, value2, range2) {\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        get value() {\n          return value2;\n        },\n        get range() {\n          return range2;\n        },\n        focus: function() {\n          var _a2;\n          (_a2 = sliderBoxRef.current) === null || _a2 === void 0 ? void 0 : _a2.focus();\n        }\n      };\n    }, [range2, sliderBoxRef, value2]);\n  };\n  var useSlider = function(props, ref2) {\n    var _a2 = props.step, step = _a2 === void 0 ? 1 : _a2, className2 = props.className, _b2 = props.disabled, disabled = _b2 === void 0 ? false : _b2, label2 = props.label, _c2 = props.max, max2 = _c2 === void 0 ? 10 : _c2, _d2 = props.min, min2 = _d2 === void 0 ? 0 : _d2, _e2 = props.showValue, showValue = _e2 === void 0 ? true : _e2, _f = props.buttonProps, buttonProps = _f === void 0 ? {} : _f, _g = props.vertical, vertical = _g === void 0 ? false : _g, snapToStep = props.snapToStep, valueFormat = props.valueFormat, styles = props.styles, theme = props.theme, originFromZero = props.originFromZero, ariaLabelledBy = props[\"aria-labelledby\"], _h = props.ariaLabel, ariaLabel2 = _h === void 0 ? props[\"aria-label\"] : _h, ranged = props.ranged, onChange = props.onChange, onChanged = props.onChanged;\n    var disposables = React__namespace.useRef([]);\n    var _j = useSetTimeout(), setTimeout2 = _j.setTimeout, clearTimeout2 = _j.clearTimeout;\n    var sliderLine = React__namespace.useRef(null);\n    var win = useWindowEx();\n    var _k = useControllableValue(props.value, props.defaultValue, function(ev, v) {\n      return onChange === null || onChange === void 0 ? void 0 : onChange(v, ranged ? [internalState.latestLowerValue, v] : void 0, ev);\n    }), unclampedValue = _k[0], setValue = _k[1];\n    var _l = useControllableValue(props.lowerValue, props.defaultLowerValue, function(ev, lv) {\n      return onChange === null || onChange === void 0 ? void 0 : onChange(internalState.latestValue, [lv, internalState.latestValue], ev);\n    }), unclampedLowerValue = _l[0], setLowerValue = _l[1];\n    var value2 = Math.max(min2, Math.min(max2, unclampedValue || 0));\n    var lowerValue = Math.max(min2, Math.min(value2, unclampedLowerValue || 0));\n    var internalState = useConst({\n      onKeyDownTimer: -1,\n      isAdjustingLowerValue: false,\n      latestValue: value2,\n      latestLowerValue: lowerValue\n    });\n    internalState.latestValue = value2;\n    internalState.latestLowerValue = lowerValue;\n    var id2 = useId(\"Slider\", props.id || (buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.id));\n    var classNames2 = getClassNames$3(styles, {\n      className: className2,\n      disabled,\n      vertical,\n      showTransitions: !snapToStep && !internalState.isBetweenSteps,\n      showValue,\n      ranged,\n      theme\n    });\n    var steps = (max2 - min2) / step;\n    var clearOnKeyDownTimer = function() {\n      clearTimeout2(internalState.onKeyDownTimer);\n      internalState.onKeyDownTimer = -1;\n    };\n    var setOnKeyDownTimer = function(event2) {\n      clearOnKeyDownTimer();\n      if (onChanged) {\n        internalState.onKeyDownTimer = setTimeout2(function() {\n          onChanged(event2, internalState.latestValue, ranged ? [internalState.latestLowerValue, internalState.latestValue] : void 0);\n        }, ONKEYDOWN_TIMEOUT_DURATION);\n      }\n    };\n    var getAriaValueText = function(valueProps) {\n      var ariaValueText = props.ariaValueText;\n      if (valueProps !== void 0) {\n        return ariaValueText ? ariaValueText(valueProps) : valueProps.toString();\n      }\n      return void 0;\n    };\n    var updateValue = function(ev, newValue, newUnroundedValue) {\n      newValue = Math.min(max2, Math.max(min2, newValue));\n      newUnroundedValue = newUnroundedValue !== void 0 ? Math.min(max2, Math.max(min2, newUnroundedValue)) : void 0;\n      var numDec = 0;\n      if (isFinite(step)) {\n        while (Math.round(step * Math.pow(10, numDec)) / Math.pow(10, numDec) !== step) {\n          numDec++;\n        }\n      }\n      var roundedValue = parseFloat(newValue.toFixed(numDec));\n      internalState.isBetweenSteps = newUnroundedValue !== void 0 && newUnroundedValue !== roundedValue;\n      if (ranged) {\n        if (internalState.isAdjustingLowerValue && (originFromZero ? roundedValue <= 0 : roundedValue <= internalState.latestValue)) {\n          setLowerValue(roundedValue, ev);\n        } else if (!internalState.isAdjustingLowerValue && (originFromZero ? roundedValue >= 0 : roundedValue >= internalState.latestLowerValue)) {\n          setValue(roundedValue, ev);\n        }\n      } else {\n        setValue(roundedValue, ev);\n      }\n    };\n    var onKeyDown = function(event2) {\n      var newCurrentValue = internalState.isAdjustingLowerValue ? internalState.latestLowerValue : internalState.latestValue;\n      var diff = 0;\n      switch (event2.which) {\n        case getRTLSafeKeyCode(KeyCodes.left, props.theme):\n        case KeyCodes.down:\n          diff = -step;\n          clearOnKeyDownTimer();\n          setOnKeyDownTimer(event2);\n          break;\n        case getRTLSafeKeyCode(KeyCodes.right, props.theme):\n        case KeyCodes.up:\n          diff = step;\n          clearOnKeyDownTimer();\n          setOnKeyDownTimer(event2);\n          break;\n        case KeyCodes.home:\n          newCurrentValue = min2;\n          clearOnKeyDownTimer();\n          setOnKeyDownTimer(event2);\n          break;\n        case KeyCodes.end:\n          newCurrentValue = max2;\n          clearOnKeyDownTimer();\n          setOnKeyDownTimer(event2);\n          break;\n        default:\n          return;\n      }\n      updateValue(event2, newCurrentValue + diff);\n      event2.preventDefault();\n      event2.stopPropagation();\n    };\n    var getPosition2 = function(event2, verticalProp) {\n      var currentPosition = 0;\n      switch (event2.type) {\n        case \"mousedown\":\n        case \"mousemove\":\n          currentPosition = !verticalProp ? event2.clientX : event2.clientY;\n          break;\n        case \"touchstart\":\n        case \"touchmove\":\n          currentPosition = !verticalProp ? event2.touches[0].clientX : event2.touches[0].clientY;\n          break;\n      }\n      return currentPosition;\n    };\n    var calculateCurrentSteps = function(event2) {\n      var sliderPositionRect = sliderLine.current.getBoundingClientRect();\n      var sliderLength = !props.vertical ? sliderPositionRect.width : sliderPositionRect.height;\n      var stepLength = sliderLength / steps;\n      var currentSteps;\n      var distance2;\n      if (!props.vertical) {\n        var left = getPosition2(event2, props.vertical);\n        distance2 = getRTL(props.theme) ? sliderPositionRect.right - left : left - sliderPositionRect.left;\n        currentSteps = distance2 / stepLength;\n      } else {\n        var bottom = getPosition2(event2, props.vertical);\n        distance2 = sliderPositionRect.bottom - bottom;\n        currentSteps = distance2 / stepLength;\n      }\n      return currentSteps;\n    };\n    var onMouseMoveOrTouchMove = function(event2, suppressEventCancelation) {\n      var currentSteps = calculateCurrentSteps(event2);\n      var newUnroundedValue = min2 + step * currentSteps;\n      var newCurrentValue = min2 + step * Math.round(currentSteps);\n      updateValue(event2, newCurrentValue, newUnroundedValue);\n      if (!suppressEventCancelation) {\n        event2.preventDefault();\n        event2.stopPropagation();\n      }\n    };\n    var onMouseDownOrTouchStart = function(event2) {\n      if (ranged) {\n        var currentSteps = calculateCurrentSteps(event2);\n        var newValue = min2 + step * currentSteps;\n        internalState.isAdjustingLowerValue = newValue <= internalState.latestLowerValue || newValue - internalState.latestLowerValue <= internalState.latestValue - newValue;\n      }\n      if (event2.type === \"mousedown\") {\n        disposables.current.push(on$1(win, \"mousemove\", onMouseMoveOrTouchMove, true), on$1(win, \"mouseup\", onMouseUpOrTouchEnd, true));\n      } else if (event2.type === \"touchstart\") {\n        disposables.current.push(on$1(win, \"touchmove\", onMouseMoveOrTouchMove, true), on$1(win, \"touchend\", onMouseUpOrTouchEnd, true));\n      }\n      onMouseMoveOrTouchMove(event2, true);\n    };\n    var onMouseUpOrTouchEnd = function(event2) {\n      internalState.isBetweenSteps = void 0;\n      onChanged === null || onChanged === void 0 ? void 0 : onChanged(event2, internalState.latestValue, ranged ? [internalState.latestLowerValue, internalState.latestValue] : void 0);\n      disposeListeners();\n    };\n    var onThumbFocus = function(event2) {\n      internalState.isAdjustingLowerValue = event2.target === lowerValueThumbRef.current;\n    };\n    var disposeListeners = React__namespace.useCallback(function() {\n      disposables.current.forEach(function(dispose) {\n        return dispose();\n      });\n      disposables.current = [];\n    }, []);\n    React__namespace.useEffect(function() {\n      return disposeListeners;\n    }, [disposeListeners]);\n    var lowerValueThumbRef = React__namespace.useRef(null);\n    var thumbRef = React__namespace.useRef(null);\n    var sliderBoxRef = React__namespace.useRef(null);\n    useComponentRef$1(props, sliderBoxRef, value2, ranged ? [lowerValue, value2] : void 0);\n    var getPositionStyles = getSlotStyleFn(vertical ? \"bottom\" : getRTL(props.theme) ? \"right\" : \"left\");\n    var getTrackStyles = getSlotStyleFn(vertical ? \"height\" : \"width\");\n    var originValue = originFromZero ? 0 : min2;\n    var valuePercent = getPercent(value2, min2, max2);\n    var lowerValuePercent = getPercent(lowerValue, min2, max2);\n    var originPercentOfLine = getPercent(originValue, min2, max2);\n    var activeSectionWidth = ranged ? valuePercent - lowerValuePercent : Math.abs(originPercentOfLine - valuePercent);\n    var topSectionWidth = Math.min(100 - valuePercent, 100 - originPercentOfLine);\n    var bottomSectionWidth = ranged ? lowerValuePercent : Math.min(valuePercent, originPercentOfLine);\n    var rootProps = {\n      className: classNames2.root,\n      ref: ref2\n    };\n    var labelProps = {\n      className: classNames2.titleLabel,\n      children: label2,\n      disabled,\n      htmlFor: ariaLabel2 ? void 0 : id2\n    };\n    var valueLabelProps = showValue ? {\n      className: classNames2.valueLabel,\n      children: valueFormat ? valueFormat(value2) : value2,\n      disabled,\n      htmlFor: disabled ? id2 : void 0\n    } : void 0;\n    var lowerValueLabelProps = ranged && showValue ? {\n      className: classNames2.valueLabel,\n      children: valueFormat ? valueFormat(lowerValue) : lowerValue,\n      disabled\n    } : void 0;\n    var zeroTickProps = originFromZero ? {\n      className: classNames2.zeroTick,\n      style: getPositionStyles(originPercentOfLine)\n    } : void 0;\n    var trackActiveProps = {\n      className: css(classNames2.lineContainer, classNames2.activeSection),\n      style: getTrackStyles(activeSectionWidth)\n    };\n    var trackTopInactiveProps = {\n      className: css(classNames2.lineContainer, classNames2.inactiveSection),\n      style: getTrackStyles(topSectionWidth)\n    };\n    var trackBottomInactiveProps = {\n      className: css(classNames2.lineContainer, classNames2.inactiveSection),\n      style: getTrackStyles(bottomSectionWidth)\n    };\n    var sliderProps = __assign$1({ \"aria-disabled\": disabled, role: \"slider\", tabIndex: disabled ? void 0 : 0 }, { \"data-is-focusable\": !disabled });\n    var sliderBoxProps = __assign$1(__assign$1(__assign$1({ id: id2, className: css(classNames2.slideBox, buttonProps.className), ref: sliderBoxRef }, !disabled && {\n      onMouseDown: onMouseDownOrTouchStart,\n      onTouchStart: onMouseDownOrTouchStart,\n      onKeyDown\n    }), buttonProps && getNativeProps(buttonProps, divProperties, [\"id\", \"className\"])), !ranged && __assign$1(__assign$1({}, sliderProps), { \"aria-valuemin\": min2, \"aria-valuemax\": max2, \"aria-valuenow\": value2, \"aria-valuetext\": getAriaValueText(value2), \"aria-label\": ariaLabel2 || label2, \"aria-labelledby\": ariaLabelledBy }));\n    var onFocusProp = disabled ? {} : { onFocus: onThumbFocus };\n    var thumbProps = __assign$1({ ref: thumbRef, className: classNames2.thumb, style: getPositionStyles(valuePercent) }, ranged && __assign$1(__assign$1(__assign$1({}, sliderProps), onFocusProp), { id: \"max-\".concat(id2), \"aria-valuemin\": lowerValue, \"aria-valuemax\": max2, \"aria-valuenow\": value2, \"aria-valuetext\": getAriaValueText(value2), \"aria-label\": \"max \".concat(ariaLabel2 || label2) }));\n    var lowerValueThumbProps = ranged ? __assign$1(__assign$1(__assign$1({ ref: lowerValueThumbRef, className: classNames2.thumb, style: getPositionStyles(lowerValuePercent) }, sliderProps), onFocusProp), { id: \"min-\".concat(id2), \"aria-valuemin\": min2, \"aria-valuemax\": value2, \"aria-valuenow\": lowerValue, \"aria-valuetext\": getAriaValueText(lowerValue), \"aria-label\": \"min \".concat(ariaLabel2 || label2) }) : void 0;\n    var containerProps = {\n      className: classNames2.container\n    };\n    var sliderLineProps = {\n      ref: sliderLine,\n      className: classNames2.line\n    };\n    return {\n      root: rootProps,\n      label: labelProps,\n      sliderBox: sliderBoxProps,\n      container: containerProps,\n      valueLabel: valueLabelProps,\n      lowerValueLabel: lowerValueLabelProps,\n      thumb: thumbProps,\n      lowerValueThumb: lowerValueThumbProps,\n      zeroTick: zeroTickProps,\n      activeTrack: trackActiveProps,\n      topInactiveTrack: trackTopInactiveProps,\n      bottomInactiveTrack: trackBottomInactiveProps,\n      sliderLine: sliderLineProps\n    };\n  };\n  var COMPONENT_NAME$2 = \"SliderBase\";\n  var SliderBase = React__namespace.forwardRef(function(props, ref2) {\n    var slotProps = useSlider(props, ref2);\n    return React__namespace.createElement(\n      \"div\",\n      __assign$1({}, slotProps.root),\n      slotProps && React__namespace.createElement(Label$2, __assign$1({}, slotProps.label)),\n      React__namespace.createElement(\n        \"div\",\n        __assign$1({}, slotProps.container),\n        props.ranged && (props.vertical ? slotProps.valueLabel && React__namespace.createElement(Label$2, __assign$1({}, slotProps.valueLabel)) : slotProps.lowerValueLabel && React__namespace.createElement(Label$2, __assign$1({}, slotProps.lowerValueLabel))),\n        React__namespace.createElement(\n          \"div\",\n          __assign$1({}, slotProps.sliderBox),\n          React__namespace.createElement(\n            \"div\",\n            __assign$1({}, slotProps.sliderLine),\n            props.ranged && React__namespace.createElement(\"span\", __assign$1({}, slotProps.lowerValueThumb)),\n            React__namespace.createElement(\"span\", __assign$1({}, slotProps.thumb)),\n            slotProps.zeroTick && React__namespace.createElement(\"span\", __assign$1({}, slotProps.zeroTick)),\n            React__namespace.createElement(\"span\", __assign$1({}, slotProps.bottomInactiveTrack)),\n            React__namespace.createElement(\"span\", __assign$1({}, slotProps.activeTrack)),\n            React__namespace.createElement(\"span\", __assign$1({}, slotProps.topInactiveTrack))\n          )\n        ),\n        props.ranged && props.vertical ? slotProps.lowerValueLabel && React__namespace.createElement(Label$2, __assign$1({}, slotProps.lowerValueLabel)) : slotProps.valueLabel && React__namespace.createElement(Label$2, __assign$1({}, slotProps.valueLabel))\n      ),\n      React__namespace.createElement(FocusRects, null)\n    );\n  });\n  SliderBase.displayName = COMPONENT_NAME$2;\n  var GlobalClassNames$1 = {\n    root: \"ms-Slider\",\n    enabled: \"ms-Slider-enabled\",\n    disabled: \"ms-Slider-disabled\",\n    row: \"ms-Slider-row\",\n    column: \"ms-Slider-column\",\n    container: \"ms-Slider-container\",\n    slideBox: \"ms-Slider-slideBox\",\n    line: \"ms-Slider-line\",\n    thumb: \"ms-Slider-thumb\",\n    activeSection: \"ms-Slider-active\",\n    inactiveSection: \"ms-Slider-inactive\",\n    valueLabel: \"ms-Slider-value\",\n    showValue: \"ms-Slider-showValue\",\n    showTransitions: \"ms-Slider-showTransitions\",\n    zeroTick: \"ms-Slider-zeroTick\"\n  };\n  var getStyles$3 = function(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m, _o;\n    var className2 = props.className, titleLabelClassName = props.titleLabelClassName, theme = props.theme, vertical = props.vertical, disabled = props.disabled, showTransitions = props.showTransitions, showValue = props.showValue, ranged = props.ranged;\n    var semanticColors = theme.semanticColors, palette = theme.palette;\n    var classNames2 = getGlobalClassNames(GlobalClassNames$1, theme);\n    var pressedActiveSectionColor = semanticColors.inputBackgroundCheckedHovered;\n    var hoveredActiveSectionColor = semanticColors.inputBackgroundChecked;\n    var hoveredPressedinactiveSectionColor = palette.neutralSecondaryAlt;\n    var restActiveSectionColor = palette.neutralPrimary;\n    var restInactiveSectionColor = palette.neutralSecondaryAlt;\n    var disabledActiveSectionColor = semanticColors.disabledText;\n    var disabledInactiveSectionColor = semanticColors.disabledBackground;\n    var thumbBackgroundColor = semanticColors.inputBackground;\n    var thumbBorderColor = semanticColors.smallInputBorder;\n    var thumbDisabledBorderColor = semanticColors.disabledBorder;\n    var slideBoxActiveSectionStyles = !disabled && {\n      backgroundColor: pressedActiveSectionColor,\n      selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n        backgroundColor: \"Highlight\"\n      }, _a2)\n    };\n    var slideBoxInactiveSectionStyles = !disabled && {\n      backgroundColor: hoveredPressedinactiveSectionColor,\n      selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n        borderColor: \"Highlight\"\n      }, _b2)\n    };\n    var slideHoverSectionStyles = !disabled && {\n      backgroundColor: hoveredActiveSectionColor,\n      selectors: (_c2 = {}, _c2[HighContrastSelector] = {\n        backgroundColor: \"Highlight\"\n      }, _c2)\n    };\n    var slideBoxActiveThumbStyles = !disabled && {\n      border: \"2px solid \".concat(pressedActiveSectionColor),\n      selectors: (_d2 = {}, _d2[HighContrastSelector] = {\n        borderColor: \"Highlight\"\n      }, _d2)\n    };\n    var slideBoxActiveZeroTickStyles = !props.disabled && {\n      backgroundColor: semanticColors.inputPlaceholderBackgroundChecked,\n      selectors: (_e2 = {}, _e2[HighContrastSelector] = {\n        backgroundColor: \"Highlight\"\n      }, _e2)\n    };\n    return {\n      root: __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([\n        classNames2.root,\n        theme.fonts.medium,\n        {\n          userSelect: \"none\"\n        },\n        vertical && {\n          marginRight: 8\n        }\n      ], [!disabled ? classNames2.enabled : void 0], false), [disabled ? classNames2.disabled : void 0], false), [!vertical ? classNames2.row : void 0], false), [vertical ? classNames2.column : void 0], false), [\n        className2\n      ], false),\n      titleLabel: [\n        {\n          padding: 0\n        },\n        titleLabelClassName\n      ],\n      container: [\n        classNames2.container,\n        {\n          display: \"flex\",\n          flexWrap: \"nowrap\",\n          alignItems: \"center\"\n        },\n        vertical && {\n          flexDirection: \"column\",\n          height: \"100%\",\n          textAlign: \"center\",\n          margin: \"8px 0\"\n        }\n      ],\n      slideBox: __spreadArray(__spreadArray([\n        classNames2.slideBox,\n        !ranged && getFocusStyle(theme),\n        {\n          background: \"transparent\",\n          border: \"none\",\n          flexGrow: 1,\n          lineHeight: 28,\n          display: \"flex\",\n          alignItems: \"center\",\n          selectors: (_f = {}, _f[\":active .\".concat(classNames2.activeSection)] = slideBoxActiveSectionStyles, _f[\":hover .\".concat(classNames2.activeSection)] = slideHoverSectionStyles, _f[\":active .\".concat(classNames2.inactiveSection)] = slideBoxInactiveSectionStyles, _f[\":hover .\".concat(classNames2.inactiveSection)] = slideBoxInactiveSectionStyles, _f[\":active .\".concat(classNames2.thumb)] = slideBoxActiveThumbStyles, _f[\":hover .\".concat(classNames2.thumb)] = slideBoxActiveThumbStyles, _f[\":active .\".concat(classNames2.zeroTick)] = slideBoxActiveZeroTickStyles, _f[\":hover .\".concat(classNames2.zeroTick)] = slideBoxActiveZeroTickStyles, _f[HighContrastSelector] = {\n            forcedColorAdjust: \"none\"\n          }, _f)\n        },\n        vertical ? {\n          height: \"100%\",\n          width: 28,\n          padding: \"8px 0\"\n          // Make room for thumb at bottom of line\n        } : {\n          height: 28,\n          width: \"auto\",\n          padding: \"0 8px\"\n          // Make room for thumb at ends of line\n        }\n      ], [showValue ? classNames2.showValue : void 0], false), [showTransitions ? classNames2.showTransitions : void 0], false),\n      thumb: [\n        classNames2.thumb,\n        ranged && getFocusStyle(theme, { inset: -4 }),\n        {\n          borderWidth: 2,\n          borderStyle: \"solid\",\n          borderColor: thumbBorderColor,\n          borderRadius: 10,\n          boxSizing: \"border-box\",\n          background: thumbBackgroundColor,\n          display: \"block\",\n          width: 16,\n          height: 16,\n          position: \"absolute\"\n        },\n        vertical ? {\n          left: -6,\n          margin: \"0 auto\",\n          transform: \"translateY(8px)\"\n        } : {\n          top: -6,\n          transform: getRTL(theme) ? \"translateX(50%)\" : \"translateX(-50%)\"\n        },\n        showTransitions && {\n          transition: \"left \".concat(AnimationVariables.durationValue3, \" \").concat(AnimationVariables.easeFunction1)\n        },\n        disabled && {\n          borderColor: thumbDisabledBorderColor,\n          selectors: (_g = {}, _g[HighContrastSelector] = {\n            borderColor: \"GrayText\"\n          }, _g)\n        }\n      ],\n      line: [\n        classNames2.line,\n        {\n          display: \"flex\",\n          position: \"relative\"\n        },\n        vertical ? {\n          height: \"100%\",\n          width: 4,\n          margin: \"0 auto\",\n          flexDirection: \"column-reverse\"\n        } : {\n          width: \"100%\"\n        }\n      ],\n      lineContainer: [\n        {\n          borderRadius: 4,\n          boxSizing: \"border-box\"\n        },\n        vertical ? {\n          width: 4,\n          height: \"100%\"\n        } : {\n          height: 4,\n          width: \"100%\"\n        }\n      ],\n      activeSection: [\n        classNames2.activeSection,\n        {\n          background: restActiveSectionColor,\n          selectors: (_h = {}, _h[HighContrastSelector] = {\n            backgroundColor: \"WindowText\"\n          }, _h)\n        },\n        showTransitions && {\n          transition: \"width \".concat(AnimationVariables.durationValue3, \" \").concat(AnimationVariables.easeFunction1)\n        },\n        disabled && {\n          background: disabledActiveSectionColor,\n          selectors: (_j = {}, _j[HighContrastSelector] = {\n            backgroundColor: \"GrayText\",\n            borderColor: \"GrayText\"\n          }, _j)\n        }\n      ],\n      inactiveSection: [\n        classNames2.inactiveSection,\n        {\n          background: restInactiveSectionColor,\n          selectors: (_k = {}, _k[HighContrastSelector] = {\n            border: \"1px solid WindowText\"\n          }, _k)\n        },\n        showTransitions && {\n          transition: \"width \".concat(AnimationVariables.durationValue3, \" \").concat(AnimationVariables.easeFunction1)\n        },\n        disabled && {\n          background: disabledInactiveSectionColor,\n          selectors: (_l = {}, _l[HighContrastSelector] = {\n            borderColor: \"GrayText\"\n          }, _l)\n        }\n      ],\n      zeroTick: [\n        classNames2.zeroTick,\n        {\n          position: \"absolute\",\n          background: semanticColors.disabledBorder,\n          selectors: (_m = {}, _m[HighContrastSelector] = {\n            backgroundColor: \"WindowText\"\n          }, _m)\n        },\n        props.disabled && {\n          background: semanticColors.disabledBackground,\n          selectors: (_o = {}, _o[HighContrastSelector] = {\n            backgroundColor: \"GrayText\"\n          }, _o)\n        },\n        props.vertical ? {\n          width: \"16px\",\n          height: \"1px\",\n          transform: getRTL(theme) ? \"translateX(6px)\" : \"translateX(-6px)\"\n        } : {\n          width: \"1px\",\n          height: \"16px\",\n          transform: \"translateY(-6px)\"\n        }\n      ],\n      valueLabel: [\n        classNames2.valueLabel,\n        {\n          flexShrink: 1,\n          width: 30,\n          lineHeight: \"1\"\n          // using a string here meaning it's relative to the size of the font\n        },\n        vertical ? {\n          margin: \"0 auto\",\n          whiteSpace: \"nowrap\",\n          width: 40\n        } : {\n          margin: \"0 8px\",\n          whiteSpace: \"nowrap\",\n          width: 40\n        }\n      ]\n    };\n  };\n  var Slider = styled(SliderBase, getStyles$3, void 0, {\n    scope: \"Slider\"\n  });\n  var SpinnerSize;\n  (function(SpinnerSize2) {\n    SpinnerSize2[SpinnerSize2[\"xSmall\"] = 0] = \"xSmall\";\n    SpinnerSize2[SpinnerSize2[\"small\"] = 1] = \"small\";\n    SpinnerSize2[SpinnerSize2[\"medium\"] = 2] = \"medium\";\n    SpinnerSize2[SpinnerSize2[\"large\"] = 3] = \"large\";\n  })(SpinnerSize || (SpinnerSize = {}));\n  var SpinnerType;\n  (function(SpinnerType2) {\n    SpinnerType2[SpinnerType2[\"normal\"] = 0] = \"normal\";\n    SpinnerType2[SpinnerType2[\"large\"] = 1] = \"large\";\n  })(SpinnerType || (SpinnerType = {}));\n  var getClassNames$2 = classNamesFunction();\n  var SpinnerBase = (\n    /** @class */\n    (function(_super) {\n      __extends(SpinnerBase2, _super);\n      function SpinnerBase2() {\n        return _super !== null && _super.apply(this, arguments) || this;\n      }\n      SpinnerBase2.prototype.render = function() {\n        var _a2 = this.props, type2 = _a2.type, size = _a2.size, ariaLabel2 = _a2.ariaLabel, ariaLive = _a2.ariaLive, styles = _a2.styles, label2 = _a2.label, theme = _a2.theme, className2 = _a2.className, labelPosition = _a2.labelPosition;\n        var statusMessage = ariaLabel2;\n        var nativeProps = getNativeProps(this.props, divProperties, [\"size\"]);\n        var styleSize = size;\n        if (styleSize === void 0 && type2 !== void 0) {\n          styleSize = type2 === SpinnerType.large ? SpinnerSize.large : SpinnerSize.medium;\n        }\n        var classNames2 = getClassNames$2(styles, {\n          theme,\n          size: styleSize,\n          className: className2,\n          labelPosition\n        });\n        return React__namespace.createElement(\n          \"div\",\n          __assign$1({}, nativeProps, { className: classNames2.root }),\n          React__namespace.createElement(\"div\", { className: classNames2.circle }),\n          label2 && React__namespace.createElement(\"div\", { className: classNames2.label }, label2),\n          statusMessage && React__namespace.createElement(\n            \"div\",\n            { role: \"status\", \"aria-live\": ariaLive },\n            React__namespace.createElement(\n              DelayedRender,\n              null,\n              React__namespace.createElement(\"div\", { className: classNames2.screenReaderText }, statusMessage)\n            )\n          )\n        );\n      };\n      SpinnerBase2.defaultProps = {\n        size: SpinnerSize.medium,\n        ariaLive: \"polite\",\n        labelPosition: \"bottom\"\n      };\n      return SpinnerBase2;\n    })(React__namespace.Component)\n  );\n  var GlobalClassNames = {\n    root: \"ms-Spinner\",\n    circle: \"ms-Spinner-circle\",\n    label: \"ms-Spinner-label\"\n  };\n  var spinAnimation = memoizeFunction(function() {\n    return keyframes({\n      \"0%\": {\n        transform: \"rotate(0deg)\"\n      },\n      \"100%\": {\n        transform: \"rotate(360deg)\"\n      }\n    });\n  });\n  var getStyles$2 = function(props) {\n    var _a2;\n    var theme = props.theme, size = props.size, className2 = props.className, labelPosition = props.labelPosition;\n    var palette = theme.palette;\n    var classNames2 = getGlobalClassNames(GlobalClassNames, theme);\n    return {\n      root: [\n        classNames2.root,\n        {\n          display: \"flex\",\n          flexDirection: \"column\",\n          alignItems: \"center\",\n          justifyContent: \"center\"\n        },\n        labelPosition === \"top\" && {\n          flexDirection: \"column-reverse\"\n        },\n        labelPosition === \"right\" && {\n          flexDirection: \"row\"\n        },\n        labelPosition === \"left\" && {\n          flexDirection: \"row-reverse\"\n        },\n        className2\n      ],\n      circle: [\n        classNames2.circle,\n        {\n          boxSizing: \"border-box\",\n          borderRadius: \"50%\",\n          borderWidth: \"1.5px\",\n          borderStyle: \"solid\",\n          borderTopColor: palette.themePrimary,\n          borderRightColor: palette.themeLight,\n          borderBottomColor: palette.themeLight,\n          borderLeftColor: palette.themeLight,\n          animationName: spinAnimation(),\n          animationDuration: \"1.3s\",\n          animationIterationCount: \"infinite\",\n          animationTimingFunction: \"cubic-bezier(.53,.21,.29,.67)\",\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = __assign$1({ borderTopColor: \"Highlight\" }, getHighContrastNoAdjustStyle()), _a2)\n        },\n        size === SpinnerSize.xSmall && [\n          \"ms-Spinner--xSmall\",\n          {\n            width: 12,\n            height: 12\n          }\n        ],\n        size === SpinnerSize.small && [\n          \"ms-Spinner--small\",\n          {\n            width: 16,\n            height: 16\n          }\n        ],\n        size === SpinnerSize.medium && [\n          \"ms-Spinner--medium\",\n          {\n            width: 20,\n            height: 20\n          }\n        ],\n        size === SpinnerSize.large && [\n          \"ms-Spinner--large\",\n          {\n            width: 28,\n            height: 28\n          }\n        ]\n      ],\n      label: [\n        classNames2.label,\n        theme.fonts.small,\n        {\n          color: palette.themePrimary,\n          margin: \"8px 0 0\",\n          textAlign: \"center\"\n        },\n        labelPosition === \"top\" && {\n          margin: \"0 0 8px\"\n        },\n        labelPosition === \"right\" && {\n          margin: \"0 0 0 8px\"\n        },\n        labelPosition === \"left\" && {\n          margin: \"0 8px 0 0\"\n        }\n      ],\n      screenReaderText: hiddenContentStyle\n    };\n  };\n  var Spinner = styled(SpinnerBase, getStyles$2, void 0, { scope: \"Spinner\" });\n  var getClassNames$1 = classNamesFunction();\n  var DEFAULT_STATE_VALUE = \"\";\n  var COMPONENT_NAME$1 = \"TextField\";\n  var REVEAL_ICON_NAME = \"RedEye\";\n  var HIDE_ICON_NAME = \"Hide\";\n  var TextFieldBase = (\n    /** @class */\n    (function(_super) {\n      __extends(TextFieldBase2, _super);\n      function TextFieldBase2(props) {\n        var _this = _super.call(this, props) || this;\n        _this._textElement = React__namespace.createRef();\n        _this._onFocus = function(ev) {\n          if (_this.props.onFocus) {\n            _this.props.onFocus(ev);\n          }\n          _this.setState({ isFocused: true }, function() {\n            if (_this.props.validateOnFocusIn) {\n              _this._validate(_this.value);\n            }\n          });\n        };\n        _this._onBlur = function(ev) {\n          if (_this.props.onBlur) {\n            _this.props.onBlur(ev);\n          }\n          _this.setState({ isFocused: false }, function() {\n            if (_this.props.validateOnFocusOut) {\n              _this._validate(_this.value);\n            }\n          });\n        };\n        _this._onRenderLabel = function(props2) {\n          var label2 = props2.label, required2 = props2.required;\n          var labelStyles = _this._classNames.subComponentStyles ? _this._classNames.subComponentStyles.label : void 0;\n          if (label2) {\n            return React__namespace.createElement(Label$2, { required: required2, htmlFor: _this._id, styles: labelStyles, disabled: props2.disabled, id: _this._labelId }, props2.label);\n          }\n          return null;\n        };\n        _this._onRenderDescription = function(props2) {\n          if (props2.description) {\n            return React__namespace.createElement(\"span\", { className: _this._classNames.description }, props2.description);\n          }\n          return null;\n        };\n        _this._onRevealButtonClick = function(event2) {\n          _this.setState(function(prevState) {\n            return { isRevealingPassword: !prevState.isRevealingPassword };\n          });\n        };\n        _this._onInputChange = function(event2) {\n          var _a22, _b2;\n          var element2 = event2.target;\n          var value2 = element2.value;\n          var previousValue = _getValue(_this.props, _this.state) || \"\";\n          if (value2 === void 0 || value2 === _this._lastChangeValue || value2 === previousValue) {\n            _this._lastChangeValue = void 0;\n            return;\n          }\n          _this._lastChangeValue = value2;\n          (_b2 = (_a22 = _this.props).onChange) === null || _b2 === void 0 ? void 0 : _b2.call(_a22, event2, value2);\n          if (!_this._isControlled) {\n            _this.setState({ uncontrolledValue: value2 });\n          }\n        };\n        initializeComponentRef(_this);\n        _this._async = new Async(_this);\n        _this._fallbackId = getId(COMPONENT_NAME$1);\n        _this._descriptionId = getId(COMPONENT_NAME$1 + \"Description\");\n        _this._labelId = getId(COMPONENT_NAME$1 + \"Label\");\n        _this._prefixId = getId(COMPONENT_NAME$1 + \"Prefix\");\n        _this._suffixId = getId(COMPONENT_NAME$1 + \"Suffix\");\n        _this._warnControlledUsage();\n        var _a2 = props.defaultValue, defaultValue = _a2 === void 0 ? DEFAULT_STATE_VALUE : _a2;\n        if (typeof defaultValue === \"number\") {\n          defaultValue = String(defaultValue);\n        }\n        _this.state = {\n          uncontrolledValue: _this._isControlled ? void 0 : defaultValue,\n          isFocused: false,\n          errorMessage: \"\"\n        };\n        _this._delayedValidate = _this._async.debounce(_this._validate, _this.props.deferredValidationTime);\n        _this._lastValidation = 0;\n        return _this;\n      }\n      Object.defineProperty(TextFieldBase2.prototype, \"value\", {\n        /**\n         * Gets the current value of the text field.\n         */\n        get: function() {\n          return _getValue(this.props, this.state);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype.componentDidMount = function() {\n        this._adjustInputHeight();\n        if (this.props.validateOnLoad) {\n          this._validate(this.value);\n        }\n      };\n      TextFieldBase2.prototype.componentWillUnmount = function() {\n        this._async.dispose();\n      };\n      TextFieldBase2.prototype.getSnapshotBeforeUpdate = function(prevProps, prevState) {\n        return {\n          selection: [this.selectionStart, this.selectionEnd]\n        };\n      };\n      TextFieldBase2.prototype.componentDidUpdate = function(prevProps, prevState, snapshot) {\n        var props = this.props;\n        var _a2 = (snapshot || {}).selection, selection = _a2 === void 0 ? [null, null] : _a2;\n        var start = selection[0], end = selection[1];\n        if (!!prevProps.multiline !== !!props.multiline && prevState.isFocused) {\n          this.focus();\n          if (start !== null && end !== null && start >= 0 && end >= 0) {\n            this.setSelectionRange(start, end);\n          }\n        }\n        if (prevProps.value !== props.value) {\n          this._lastChangeValue = void 0;\n        }\n        var prevValue = _getValue(prevProps, prevState);\n        var value2 = this.value;\n        if (prevValue !== value2) {\n          this._warnControlledUsage(prevProps);\n          if (this.state.errorMessage && !props.errorMessage) {\n            this.setState({ errorMessage: \"\" });\n          }\n          this._adjustInputHeight();\n          if (_shouldValidateAllChanges(props)) {\n            this._delayedValidate(value2);\n          }\n        }\n      };\n      TextFieldBase2.prototype.render = function() {\n        var _a2 = this.props, borderless = _a2.borderless, className2 = _a2.className, disabled = _a2.disabled, invalid = _a2.invalid, iconProps = _a2.iconProps, inputClassName = _a2.inputClassName, label2 = _a2.label, multiline = _a2.multiline, required2 = _a2.required, underlined = _a2.underlined, prefix = _a2.prefix, resizable = _a2.resizable, suffix = _a2.suffix, theme = _a2.theme, styles = _a2.styles, autoAdjustHeight = _a2.autoAdjustHeight, canRevealPassword = _a2.canRevealPassword, revealPasswordAriaLabel = _a2.revealPasswordAriaLabel, type2 = _a2.type, _b2 = _a2.onRenderPrefix, onRenderPrefix = _b2 === void 0 ? this._onRenderPrefix : _b2, _c2 = _a2.onRenderSuffix, onRenderSuffix = _c2 === void 0 ? this._onRenderSuffix : _c2, _d2 = _a2.onRenderLabel, onRenderLabel = _d2 === void 0 ? this._onRenderLabel : _d2, _e2 = _a2.onRenderDescription, onRenderDescription = _e2 === void 0 ? this._onRenderDescription : _e2;\n        var _f = this.state, isFocused = _f.isFocused, isRevealingPassword = _f.isRevealingPassword;\n        var errorMessage = this._errorMessage;\n        var isInvalid = typeof invalid === \"boolean\" ? invalid : !!errorMessage;\n        var hasRevealButton = !!canRevealPassword && type2 === \"password\" && _browserNeedsRevealButton();\n        var classNames2 = this._classNames = getClassNames$1(styles, {\n          theme,\n          className: className2,\n          disabled,\n          focused: isFocused,\n          required: required2,\n          multiline,\n          hasLabel: !!label2,\n          hasErrorMessage: isInvalid,\n          borderless,\n          resizable,\n          hasIcon: !!iconProps,\n          underlined,\n          inputClassName,\n          autoAdjustHeight,\n          hasRevealButton\n        });\n        return (\n          // eslint-disable-next-line @typescript-eslint/no-deprecated\n          React__namespace.createElement(\n            \"div\",\n            { ref: this.props.elementRef, className: classNames2.root },\n            React__namespace.createElement(\n              \"div\",\n              { className: classNames2.wrapper },\n              onRenderLabel(this.props, this._onRenderLabel),\n              React__namespace.createElement(\n                \"div\",\n                { className: classNames2.fieldGroup },\n                (prefix !== void 0 || this.props.onRenderPrefix) && React__namespace.createElement(\"div\", { className: classNames2.prefix, id: this._prefixId }, onRenderPrefix(this.props, this._onRenderPrefix)),\n                multiline ? this._renderTextArea() : this._renderInput(),\n                iconProps && React__namespace.createElement(Icon, __assign$1({ className: classNames2.icon }, iconProps)),\n                hasRevealButton && // Explicitly set type=\"button\" since the default button type within a form is \"submit\"\n                React__namespace.createElement(\n                  \"button\",\n                  { \"aria-label\": revealPasswordAriaLabel, className: classNames2.revealButton, onClick: this._onRevealButtonClick, \"aria-pressed\": !!isRevealingPassword, type: \"button\" },\n                  React__namespace.createElement(\n                    \"span\",\n                    { className: classNames2.revealSpan },\n                    React__namespace.createElement(Icon, { className: classNames2.revealIcon, iconName: isRevealingPassword ? HIDE_ICON_NAME : REVEAL_ICON_NAME })\n                  )\n                ),\n                (suffix !== void 0 || this.props.onRenderSuffix) && React__namespace.createElement(\"div\", { className: classNames2.suffix, id: this._suffixId }, onRenderSuffix(this.props, this._onRenderSuffix))\n              )\n            ),\n            this._isDescriptionAvailable && React__namespace.createElement(\n              \"span\",\n              { id: this._descriptionId },\n              onRenderDescription(this.props, this._onRenderDescription),\n              errorMessage && React__namespace.createElement(\n                \"div\",\n                { role: \"alert\" },\n                React__namespace.createElement(DelayedRender, null, this._renderErrorMessage())\n              )\n            )\n          )\n        );\n      };\n      TextFieldBase2.prototype.focus = function() {\n        if (this._textElement.current) {\n          this._textElement.current.focus();\n        }\n      };\n      TextFieldBase2.prototype.blur = function() {\n        if (this._textElement.current) {\n          this._textElement.current.blur();\n        }\n      };\n      TextFieldBase2.prototype.select = function() {\n        if (this._textElement.current) {\n          this._textElement.current.select();\n        }\n      };\n      TextFieldBase2.prototype.setSelectionStart = function(value2) {\n        if (this._textElement.current) {\n          this._textElement.current.selectionStart = value2;\n        }\n      };\n      TextFieldBase2.prototype.setSelectionEnd = function(value2) {\n        if (this._textElement.current) {\n          this._textElement.current.selectionEnd = value2;\n        }\n      };\n      Object.defineProperty(TextFieldBase2.prototype, \"selectionStart\", {\n        /**\n         * Gets the selection start of the text field\n         */\n        get: function() {\n          return this._textElement.current ? this._textElement.current.selectionStart : -1;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(TextFieldBase2.prototype, \"selectionEnd\", {\n        /**\n         * Gets the selection end of the text field\n         */\n        get: function() {\n          return this._textElement.current ? this._textElement.current.selectionEnd : -1;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype.setSelectionRange = function(start, end) {\n        if (this._textElement.current) {\n          this._textElement.current.setSelectionRange(start, end);\n        }\n      };\n      TextFieldBase2.prototype._warnControlledUsage = function(prevProps) {\n        warnControlledUsage({\n          componentId: this._id,\n          props: this.props\n        });\n        if (this.props.value === null && !this._hasWarnedNullValue) {\n          this._hasWarnedNullValue = true;\n          warn$1(\"Warning: 'value' prop on '\".concat(COMPONENT_NAME$1, \"' should not be null. Consider using an \") + \"empty string to clear the component or undefined to indicate an uncontrolled component.\");\n        }\n      };\n      Object.defineProperty(TextFieldBase2.prototype, \"_id\", {\n        /** Returns `props.id` if available, or a fallback if not. */\n        get: function() {\n          return this.props.id || this._fallbackId;\n        },\n        enumerable: false,\n        configurable: true\n      });\n      Object.defineProperty(TextFieldBase2.prototype, \"_isControlled\", {\n        get: function() {\n          return isControlled(this.props, \"value\");\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype._onRenderPrefix = function(props) {\n        var prefix = props.prefix;\n        return React__namespace.createElement(\"span\", { style: { paddingBottom: \"1px\" } }, prefix);\n      };\n      TextFieldBase2.prototype._onRenderSuffix = function(props) {\n        var suffix = props.suffix;\n        return React__namespace.createElement(\"span\", { style: { paddingBottom: \"1px\" } }, suffix);\n      };\n      Object.defineProperty(TextFieldBase2.prototype, \"_errorMessage\", {\n        /**\n         * Current error message from either `props.errorMessage` or the result of `props.onGetErrorMessage`.\n         *\n         * - If there is no validation error or we have not validated the input value, errorMessage is an empty string.\n         * - If we have done the validation and there is validation error, errorMessage is the validation error message.\n         */\n        get: function() {\n          var _a2 = this.props.errorMessage, errorMessage = _a2 === void 0 ? this.state.errorMessage : _a2;\n          return errorMessage || \"\";\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype._renderErrorMessage = function() {\n        var errorMessage = this._errorMessage;\n        return errorMessage ? typeof errorMessage === \"string\" ? React__namespace.createElement(\n          \"p\",\n          { className: this._classNames.errorMessage },\n          React__namespace.createElement(\"span\", { \"data-automation-id\": \"error-message\" }, errorMessage)\n        ) : React__namespace.createElement(\"div\", { className: this._classNames.errorMessage, \"data-automation-id\": \"error-message\" }, errorMessage) : null;\n      };\n      Object.defineProperty(TextFieldBase2.prototype, \"_isDescriptionAvailable\", {\n        /**\n         * If a custom description render function is supplied then treat description as always available.\n         * Otherwise defer to the presence of description or error message text.\n         */\n        get: function() {\n          var props = this.props;\n          return !!(props.onRenderDescription || props.description || this._errorMessage);\n        },\n        enumerable: false,\n        configurable: true\n      });\n      TextFieldBase2.prototype._renderTextArea = function() {\n        var _a2 = this.props.invalid, invalid = _a2 === void 0 ? !!this._errorMessage : _a2;\n        var textAreaProps = getNativeProps(this.props, textAreaProperties, [\"defaultValue\"]);\n        var ariaLabelledBy = this.props[\"aria-labelledby\"] || (this.props.label ? this._labelId : void 0);\n        return React__namespace.createElement(\"textarea\", __assign$1({ id: this._id }, textAreaProps, { ref: this._textElement, value: this.value || \"\", onInput: this._onInputChange, onChange: this._onInputChange, className: this._classNames.field, \"aria-labelledby\": ariaLabelledBy, \"aria-describedby\": this._isDescriptionAvailable ? this._descriptionId : this.props[\"aria-describedby\"], \"aria-invalid\": invalid, \"aria-label\": this.props.ariaLabel, readOnly: this.props.readOnly, onFocus: this._onFocus, onBlur: this._onBlur }));\n      };\n      TextFieldBase2.prototype._renderInput = function() {\n        var _a2 = this.props, ariaLabel2 = _a2.ariaLabel, _b2 = _a2.invalid, invalid = _b2 === void 0 ? !!this._errorMessage : _b2, onRenderPrefix = _a2.onRenderPrefix, onRenderSuffix = _a2.onRenderSuffix, prefix = _a2.prefix, suffix = _a2.suffix, _c2 = _a2.type, type2 = _c2 === void 0 ? \"text\" : _c2, label2 = _a2.label;\n        var labelIds = [];\n        label2 && labelIds.push(this._labelId);\n        (prefix !== void 0 || onRenderPrefix) && labelIds.push(this._prefixId);\n        (suffix !== void 0 || onRenderSuffix) && labelIds.push(this._suffixId);\n        var inputProps = __assign$1(__assign$1({ type: this.state.isRevealingPassword ? \"text\" : type2, id: this._id }, getNativeProps(this.props, inputProperties, [\"defaultValue\", \"type\"])), { \"aria-labelledby\": this.props[\"aria-labelledby\"] || (labelIds.length > 0 ? labelIds.join(\" \") : void 0), ref: this._textElement, value: this.value || \"\", onInput: this._onInputChange, onChange: this._onInputChange, className: this._classNames.field, \"aria-label\": ariaLabel2, \"aria-describedby\": this._isDescriptionAvailable ? this._descriptionId : this.props[\"aria-describedby\"], \"aria-invalid\": invalid, onFocus: this._onFocus, onBlur: this._onBlur });\n        var defaultRender = function(updatedInputProps) {\n          return React__namespace.createElement(\"input\", __assign$1({}, updatedInputProps));\n        };\n        var onRenderInput = this.props.onRenderInput || defaultRender;\n        return onRenderInput(inputProps, defaultRender);\n      };\n      TextFieldBase2.prototype._validate = function(value2) {\n        var _this = this;\n        if (this._latestValidateValue === value2 && _shouldValidateAllChanges(this.props)) {\n          return;\n        }\n        this._latestValidateValue = value2;\n        var onGetErrorMessage = this.props.onGetErrorMessage;\n        var result = onGetErrorMessage && onGetErrorMessage(value2 || \"\");\n        if (result !== void 0) {\n          if (typeof result === \"string\" || !(\"then\" in result)) {\n            this.setState({ errorMessage: result });\n            this._notifyAfterValidate(value2, result);\n          } else {\n            var currentValidation_1 = ++this._lastValidation;\n            result.then(function(errorMessage) {\n              if (currentValidation_1 === _this._lastValidation) {\n                _this.setState({ errorMessage });\n              }\n              _this._notifyAfterValidate(value2, errorMessage);\n            });\n          }\n        } else {\n          this._notifyAfterValidate(value2, \"\");\n        }\n      };\n      TextFieldBase2.prototype._notifyAfterValidate = function(value2, errorMessage) {\n        if (value2 === this.value && this.props.onNotifyValidationResult) {\n          this.props.onNotifyValidationResult(errorMessage, value2);\n        }\n      };\n      TextFieldBase2.prototype._adjustInputHeight = function() {\n        var _a2, _b2;\n        if (this._textElement.current && this.props.autoAdjustHeight && this.props.multiline) {\n          var scrollTop = (_b2 = (_a2 = this.props.scrollContainerRef) === null || _a2 === void 0 ? void 0 : _a2.current) === null || _b2 === void 0 ? void 0 : _b2.scrollTop;\n          var textField = this._textElement.current;\n          textField.style.height = \"\";\n          textField.style.height = textField.scrollHeight + \"px\";\n          if (scrollTop) {\n            this.props.scrollContainerRef.current.scrollTop = scrollTop;\n          }\n        }\n      };\n      TextFieldBase2.defaultProps = {\n        resizable: true,\n        deferredValidationTime: 200,\n        validateOnLoad: true\n      };\n      return TextFieldBase2;\n    })(React__namespace.Component)\n  );\n  function _getValue(props, state) {\n    var _a2 = props.value, value2 = _a2 === void 0 ? state.uncontrolledValue : _a2;\n    if (typeof value2 === \"number\") {\n      return String(value2);\n    }\n    return value2;\n  }\n  function _shouldValidateAllChanges(props) {\n    return !(props.validateOnFocusIn || props.validateOnFocusOut);\n  }\n  var __browserNeedsRevealButton;\n  function _browserNeedsRevealButton() {\n    if (typeof __browserNeedsRevealButton !== \"boolean\") {\n      var win = getWindow();\n      if (win === null || win === void 0 ? void 0 : win.navigator) {\n        var isEdge = /Edg/.test(win.navigator.userAgent || \"\");\n        __browserNeedsRevealButton = !(isIE11() || isEdge);\n      } else {\n        __browserNeedsRevealButton = true;\n      }\n    }\n    return __browserNeedsRevealButton;\n  }\n  var globalClassNames = {\n    root: \"ms-TextField\",\n    description: \"ms-TextField-description\",\n    errorMessage: \"ms-TextField-errorMessage\",\n    field: \"ms-TextField-field\",\n    fieldGroup: \"ms-TextField-fieldGroup\",\n    prefix: \"ms-TextField-prefix\",\n    suffix: \"ms-TextField-suffix\",\n    wrapper: \"ms-TextField-wrapper\",\n    revealButton: \"ms-TextField-reveal\",\n    multiline: \"ms-TextField--multiline\",\n    borderless: \"ms-TextField--borderless\",\n    underlined: \"ms-TextField--underlined\",\n    unresizable: \"ms-TextField--unresizable\",\n    required: \"is-required\",\n    disabled: \"is-disabled\",\n    active: \"is-active\"\n  };\n  function getLabelStyles(props) {\n    var underlined = props.underlined, disabled = props.disabled, focused = props.focused, theme = props.theme;\n    var palette = theme.palette, fonts = theme.fonts;\n    return function() {\n      var _a2;\n      return {\n        root: [\n          underlined && disabled && {\n            color: palette.neutralTertiary\n          },\n          underlined && {\n            fontSize: fonts.medium.fontSize,\n            marginRight: 8,\n            paddingLeft: 12,\n            paddingRight: 0,\n            lineHeight: \"22px\",\n            height: 32\n          },\n          underlined && focused && {\n            selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n              height: 31\n              // -1px to prevent jumpiness in HC with the increased border-width to 2px\n            }, _a2)\n          }\n        ]\n      };\n    };\n  }\n  function getStyles$1(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _j, _k, _l, _m;\n    var theme = props.theme, className2 = props.className, disabled = props.disabled, focused = props.focused, required2 = props.required, multiline = props.multiline, hasLabel = props.hasLabel, borderless = props.borderless, underlined = props.underlined, hasIcon = props.hasIcon, resizable = props.resizable, hasErrorMessage = props.hasErrorMessage, inputClassName = props.inputClassName, autoAdjustHeight = props.autoAdjustHeight, hasRevealButton = props.hasRevealButton;\n    var semanticColors = theme.semanticColors, effects = theme.effects, fonts = theme.fonts;\n    var classNames2 = getGlobalClassNames(globalClassNames, theme);\n    var fieldPrefixSuffix = {\n      // Suffix/Prefix are not editable so the disabled slot perfectly fits.\n      background: semanticColors.disabledBackground,\n      color: !disabled ? semanticColors.inputPlaceholderText : semanticColors.disabledText,\n      display: \"flex\",\n      alignItems: \"center\",\n      padding: \"0 10px\",\n      lineHeight: 1,\n      whiteSpace: \"nowrap\",\n      flexShrink: 0,\n      selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n        background: \"Window\",\n        color: disabled ? \"GrayText\" : \"WindowText\"\n      }, _a2)\n    };\n    var placeholderStyles = [\n      {\n        color: semanticColors.inputPlaceholderText,\n        opacity: 1,\n        selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n          color: \"GrayText\"\n        }, _b2)\n      }\n    ];\n    var disabledPlaceholderStyles = {\n      color: semanticColors.disabledText,\n      selectors: (_c2 = {}, _c2[HighContrastSelector] = {\n        color: \"GrayText\"\n      }, _c2)\n    };\n    return {\n      root: [\n        classNames2.root,\n        fonts.medium,\n        required2 && classNames2.required,\n        disabled && classNames2.disabled,\n        focused && classNames2.active,\n        multiline && classNames2.multiline,\n        borderless && classNames2.borderless,\n        underlined && classNames2.underlined,\n        normalize$1,\n        {\n          position: \"relative\"\n        },\n        className2\n      ],\n      wrapper: [\n        classNames2.wrapper,\n        underlined && [\n          {\n            display: \"flex\",\n            borderBottom: \"1px solid \".concat(!hasErrorMessage ? semanticColors.inputBorder : semanticColors.errorText),\n            width: \"100%\"\n          },\n          disabled && {\n            borderBottomColor: semanticColors.disabledBackground,\n            selectors: (_d2 = {}, _d2[HighContrastSelector] = __assign$1({ borderColor: \"GrayText\" }, getHighContrastNoAdjustStyle()), _d2)\n          },\n          !disabled && {\n            selectors: {\n              \":hover\": {\n                borderBottomColor: !hasErrorMessage ? semanticColors.inputBorderHovered : semanticColors.errorText,\n                selectors: (_e2 = {}, _e2[HighContrastSelector] = __assign$1({ borderBottomColor: \"Highlight\" }, getHighContrastNoAdjustStyle()), _e2)\n              }\n            }\n          },\n          focused && [\n            {\n              position: \"relative\"\n            },\n            getInputFocusStyle(!hasErrorMessage ? semanticColors.inputFocusBorderAlt : semanticColors.errorText, 0, \"borderBottom\")\n          ]\n        ]\n      ],\n      fieldGroup: [\n        classNames2.fieldGroup,\n        normalize$1,\n        {\n          border: \"1px solid \".concat(semanticColors.inputBorder),\n          borderRadius: effects.roundedCorner2,\n          background: semanticColors.inputBackground,\n          cursor: \"text\",\n          height: 32,\n          display: \"flex\",\n          flexDirection: \"row\",\n          alignItems: \"stretch\",\n          position: \"relative\"\n        },\n        multiline && {\n          minHeight: \"60px\",\n          height: \"auto\",\n          display: \"flex\"\n        },\n        !focused && !disabled && {\n          selectors: {\n            \":hover\": {\n              borderColor: semanticColors.inputBorderHovered,\n              selectors: (_f = {}, _f[HighContrastSelector] = __assign$1({ borderColor: \"Highlight\" }, getHighContrastNoAdjustStyle()), _f)\n            }\n          }\n        },\n        focused && !underlined && getInputFocusStyle(!hasErrorMessage ? semanticColors.inputFocusBorderAlt : semanticColors.errorText, effects.roundedCorner2),\n        disabled && {\n          borderColor: semanticColors.disabledBackground,\n          selectors: (_g = {}, _g[HighContrastSelector] = __assign$1({ borderColor: \"GrayText\" }, getHighContrastNoAdjustStyle()), _g),\n          cursor: \"default\"\n        },\n        borderless && {\n          border: \"none\"\n        },\n        borderless && focused && {\n          border: \"none\",\n          selectors: {\n            \":after\": {\n              border: \"none\"\n            }\n          }\n        },\n        underlined && {\n          flex: \"1 1 0px\",\n          border: \"none\",\n          textAlign: \"left\"\n        },\n        underlined && disabled && {\n          backgroundColor: \"transparent\"\n        },\n        hasErrorMessage && !underlined && {\n          borderColor: semanticColors.errorText,\n          selectors: {\n            \"&:hover\": {\n              borderColor: semanticColors.errorText\n            }\n          }\n        },\n        !hasLabel && required2 && {\n          selectors: (_h = {\n            \":before\": {\n              content: \"'*'\",\n              color: semanticColors.errorText,\n              position: \"absolute\",\n              top: -5,\n              right: -10\n            }\n          }, _h[HighContrastSelector] = {\n            selectors: {\n              \":before\": {\n                color: \"WindowText\",\n                right: -14\n                // moving the * 4 pixel to right to alleviate border clipping in HC mode.\n              }\n            }\n          }, _h)\n        }\n      ],\n      field: [\n        fonts.medium,\n        classNames2.field,\n        normalize$1,\n        {\n          borderRadius: 0,\n          border: \"none\",\n          background: \"none\",\n          backgroundColor: \"transparent\",\n          color: semanticColors.inputText,\n          padding: \"0 8px\",\n          width: \"100%\",\n          minWidth: 0,\n          textOverflow: \"ellipsis\",\n          outline: 0,\n          selectors: (_j = {\n            \"&:active, &:focus, &:hover\": { outline: 0 },\n            \"::-ms-clear\": {\n              display: \"none\"\n            }\n          }, _j[HighContrastSelector] = {\n            background: \"Window\",\n            color: disabled ? \"GrayText\" : \"WindowText\"\n          }, _j)\n        },\n        getPlaceholderStyles(placeholderStyles),\n        multiline && !resizable && [\n          classNames2.unresizable,\n          {\n            resize: \"none\"\n          }\n        ],\n        multiline && {\n          minHeight: \"inherit\",\n          lineHeight: 17,\n          flexGrow: 1,\n          paddingTop: 6,\n          paddingBottom: 6,\n          overflow: \"auto\",\n          width: \"100%\"\n        },\n        multiline && autoAdjustHeight && {\n          overflow: \"hidden\"\n        },\n        hasIcon && !hasRevealButton && {\n          paddingRight: 24\n        },\n        multiline && hasIcon && {\n          paddingRight: 40\n        },\n        disabled && [\n          {\n            backgroundColor: semanticColors.disabledBackground,\n            color: semanticColors.disabledText,\n            borderColor: semanticColors.disabledBackground\n          },\n          getPlaceholderStyles(disabledPlaceholderStyles)\n        ],\n        underlined && {\n          textAlign: \"left\"\n        },\n        focused && !borderless && {\n          selectors: (_k = {}, _k[HighContrastSelector] = {\n            paddingLeft: 11,\n            paddingRight: 11\n          }, _k)\n        },\n        focused && multiline && !borderless && {\n          selectors: (_l = {}, _l[HighContrastSelector] = {\n            paddingTop: 4\n            // take into consideration the 2px increased border-width (not when borderless).\n          }, _l)\n        },\n        inputClassName\n      ],\n      icon: [\n        multiline && {\n          paddingRight: 24,\n          alignItems: \"flex-end\"\n        },\n        {\n          pointerEvents: \"none\",\n          position: \"absolute\",\n          bottom: 6,\n          right: 8,\n          top: \"auto\",\n          fontSize: IconFontSizes.medium,\n          lineHeight: 18\n        },\n        disabled && {\n          color: semanticColors.disabledText\n        }\n      ],\n      description: [\n        classNames2.description,\n        {\n          color: semanticColors.bodySubtext,\n          fontSize: fonts.xSmall.fontSize\n        }\n      ],\n      errorMessage: [\n        classNames2.errorMessage,\n        AnimationClassNames.slideDownIn20,\n        fonts.small,\n        {\n          color: semanticColors.errorText,\n          margin: 0,\n          paddingTop: 5,\n          display: \"flex\",\n          alignItems: \"center\"\n        }\n      ],\n      prefix: [classNames2.prefix, fieldPrefixSuffix],\n      suffix: [classNames2.suffix, fieldPrefixSuffix],\n      revealButton: [\n        classNames2.revealButton,\n        \"ms-Button\",\n        \"ms-Button--icon\",\n        getFocusStyle(theme, { inset: 1 }),\n        {\n          height: 30,\n          width: 32,\n          border: \"none\",\n          padding: \"0px 4px\",\n          backgroundColor: \"transparent\",\n          color: semanticColors.link,\n          selectors: {\n            \":hover\": {\n              outline: 0,\n              color: semanticColors.primaryButtonBackgroundHovered,\n              backgroundColor: semanticColors.buttonBackgroundHovered,\n              selectors: (_m = {}, _m[HighContrastSelector] = {\n                borderColor: \"Highlight\",\n                color: \"Highlight\"\n              }, _m)\n            },\n            \":focus\": { outline: 0 }\n          }\n        },\n        hasIcon && {\n          marginRight: 28\n        }\n      ],\n      revealSpan: {\n        display: \"flex\",\n        height: \"100%\",\n        alignItems: \"center\"\n      },\n      revealIcon: {\n        margin: \"0px 4px\",\n        pointerEvents: \"none\",\n        bottom: 6,\n        right: 8,\n        top: \"auto\",\n        fontSize: IconFontSizes.medium,\n        lineHeight: 18\n      },\n      subComponentStyles: {\n        label: getLabelStyles(props)\n      }\n    };\n  }\n  var TextField = styled(TextFieldBase, getStyles$1, void 0, {\n    scope: \"TextField\"\n  });\n  var getClassNames = classNamesFunction();\n  var COMPONENT_NAME = \"Toggle\";\n  var ToggleBase = React__namespace.forwardRef(function(props, forwardedRef) {\n    var _a2 = props.as, RootType = _a2 === void 0 ? \"div\" : _a2, ariaLabel2 = props.ariaLabel, controlledChecked = props.checked, className2 = props.className, _b2 = props.defaultChecked, defaultChecked = _b2 === void 0 ? false : _b2, disabled = props.disabled, inlineLabel = props.inlineLabel, label2 = props.label, offAriaLabel = props.offAriaLabel, offText = props.offText, onAriaLabel = props.onAriaLabel, onChange = props.onChange, onChanged = props.onChanged, onToggleClick = props.onClick, onText = props.onText, role = props.role, styles = props.styles, theme = props.theme;\n    var _c2 = useControllableValue(controlledChecked, defaultChecked, React__namespace.useCallback(function(ev, isChecked) {\n      onChange === null || onChange === void 0 ? void 0 : onChange(ev, isChecked);\n      onChanged === null || onChanged === void 0 ? void 0 : onChanged(isChecked);\n    }, [onChange, onChanged])), checked = _c2[0], setChecked = _c2[1];\n    var classNames2 = getClassNames(styles, {\n      theme,\n      className: className2,\n      disabled,\n      checked,\n      inlineLabel,\n      onOffMissing: !onText && !offText\n    });\n    var badAriaLabel = checked ? onAriaLabel : offAriaLabel;\n    var id2 = useId(COMPONENT_NAME, props.id);\n    var labelId = \"\".concat(id2, \"-label\");\n    var stateTextId = \"\".concat(id2, \"-stateText\");\n    var stateText = checked ? onText : offText;\n    var toggleNativeProps = getNativeProps(props, inputProperties, [\n      \"defaultChecked\"\n    ]);\n    var labelledById = void 0;\n    if (!ariaLabel2 && !badAriaLabel) {\n      if (label2) {\n        labelledById = labelId;\n      }\n      if (stateText && !labelledById) {\n        labelledById = stateTextId;\n      }\n    }\n    var toggleButton = React__namespace.useRef(null);\n    useFocusRects(toggleButton);\n    useComponentRef(props, checked, toggleButton);\n    var onClick = function(ev) {\n      if (!disabled) {\n        setChecked(!checked, ev);\n        if (onToggleClick) {\n          onToggleClick(ev);\n        }\n      }\n    };\n    var slotProps = {\n      root: {\n        className: classNames2.root,\n        hidden: toggleNativeProps.hidden\n      },\n      label: {\n        children: label2,\n        className: classNames2.label,\n        htmlFor: id2,\n        id: labelId\n      },\n      container: {\n        className: classNames2.container\n      },\n      pill: __assign$1(__assign$1({}, toggleNativeProps), { \"aria-disabled\": disabled, \"aria-checked\": checked, \"aria-label\": ariaLabel2 ? ariaLabel2 : badAriaLabel, \"aria-labelledby\": labelledById, className: classNames2.pill, \"data-is-focusable\": true, \"data-ktp-target\": true, disabled, id: id2, onClick, ref: toggleButton, role: role ? role : \"switch\", type: \"button\" }),\n      thumb: {\n        className: classNames2.thumb\n      },\n      stateText: {\n        children: stateText,\n        className: classNames2.text,\n        htmlFor: id2,\n        id: stateTextId\n      }\n    };\n    return React__namespace.createElement(\n      RootType,\n      __assign$1({ ref: forwardedRef }, slotProps.root),\n      label2 && React__namespace.createElement(Label$2, __assign$1({}, slotProps.label)),\n      React__namespace.createElement(\n        \"div\",\n        __assign$1({}, slotProps.container),\n        React__namespace.createElement(\n          \"button\",\n          __assign$1({}, slotProps.pill),\n          React__namespace.createElement(\"span\", __assign$1({}, slotProps.thumb))\n        ),\n        (checked && onText || offText) && React__namespace.createElement(Label$2, __assign$1({}, slotProps.stateText))\n      )\n    );\n  });\n  ToggleBase.displayName = COMPONENT_NAME + \"Base\";\n  var useComponentRef = function(props, isChecked, toggleButtonRef) {\n    React__namespace.useImperativeHandle(props.componentRef, function() {\n      return {\n        get checked() {\n          return !!isChecked;\n        },\n        focus: function() {\n          if (toggleButtonRef.current) {\n            toggleButtonRef.current.focus();\n          }\n        }\n      };\n    }, [isChecked, toggleButtonRef]);\n  };\n  var DEFAULT_PILL_WIDTH = 40;\n  var DEFAULT_PILL_HEIGHT = 20;\n  var DEFAULT_THUMB_SIZE = 12;\n  var getStyles = function(props) {\n    var _a2, _b2, _c2, _d2, _e2, _f, _g;\n    var theme = props.theme, className2 = props.className, disabled = props.disabled, checked = props.checked, inlineLabel = props.inlineLabel, onOffMissing = props.onOffMissing;\n    var semanticColors = theme.semanticColors, palette = theme.palette;\n    var pillUncheckedBackground = semanticColors.bodyBackground;\n    var pillCheckedBackground = semanticColors.inputBackgroundChecked;\n    var pillCheckedHoveredBackground = semanticColors.inputBackgroundCheckedHovered;\n    var thumbUncheckedHoveredBackground = palette.neutralDark;\n    var pillCheckedDisabledBackground = semanticColors.disabledBodySubtext;\n    var thumbBackground = semanticColors.smallInputBorder;\n    var thumbCheckedBackground = semanticColors.inputForegroundChecked;\n    var thumbDisabledBackground = semanticColors.disabledBodySubtext;\n    var thumbCheckedDisabledBackground = semanticColors.disabledBackground;\n    var pillBorderColor = semanticColors.smallInputBorder;\n    var pillBorderHoveredColor = semanticColors.inputBorderHovered;\n    var pillBorderDisabledColor = semanticColors.disabledBodySubtext;\n    var textDisabledColor = semanticColors.disabledText;\n    return {\n      root: [\n        \"ms-Toggle\",\n        checked && \"is-checked\",\n        !disabled && \"is-enabled\",\n        disabled && \"is-disabled\",\n        theme.fonts.medium,\n        {\n          marginBottom: \"8px\"\n        },\n        inlineLabel && {\n          display: \"flex\",\n          alignItems: \"center\"\n        },\n        className2\n      ],\n      label: [\n        \"ms-Toggle-label\",\n        { display: \"inline-block\" },\n        disabled && {\n          color: textDisabledColor,\n          selectors: (_a2 = {}, _a2[HighContrastSelector] = {\n            color: \"GrayText\"\n          }, _a2)\n        },\n        inlineLabel && !onOffMissing && {\n          marginRight: 16\n        },\n        onOffMissing && inlineLabel && {\n          order: 1,\n          marginLeft: 16\n        },\n        inlineLabel && { wordBreak: \"break-word\" }\n      ],\n      container: [\n        \"ms-Toggle-innerContainer\",\n        {\n          display: \"flex\",\n          position: \"relative\"\n        }\n      ],\n      pill: [\n        \"ms-Toggle-background\",\n        getFocusStyle(theme, { inset: -3 }),\n        {\n          fontSize: \"20px\",\n          boxSizing: \"border-box\",\n          width: DEFAULT_PILL_WIDTH,\n          height: DEFAULT_PILL_HEIGHT,\n          borderRadius: DEFAULT_PILL_HEIGHT / 2,\n          transition: \"all 0.1s ease\",\n          border: \"1px solid \".concat(pillBorderColor),\n          background: pillUncheckedBackground,\n          cursor: \"pointer\",\n          display: \"flex\",\n          alignItems: \"center\",\n          padding: \"0 3px\",\n          overflow: \"visible\"\n        },\n        !disabled && [\n          !checked && {\n            selectors: {\n              \":hover\": [\n                {\n                  borderColor: pillBorderHoveredColor\n                }\n              ],\n              \":hover .ms-Toggle-thumb\": [\n                {\n                  backgroundColor: thumbUncheckedHoveredBackground,\n                  selectors: (_b2 = {}, _b2[HighContrastSelector] = {\n                    borderColor: \"Highlight\"\n                  }, _b2)\n                }\n              ]\n            }\n          },\n          checked && [\n            {\n              background: pillCheckedBackground,\n              borderColor: \"transparent\",\n              justifyContent: \"flex-end\"\n            },\n            {\n              selectors: (_c2 = {\n                \":hover\": [\n                  {\n                    backgroundColor: pillCheckedHoveredBackground,\n                    borderColor: \"transparent\",\n                    selectors: (_d2 = {}, _d2[HighContrastSelector] = {\n                      backgroundColor: \"Highlight\"\n                    }, _d2)\n                  }\n                ]\n              }, _c2[HighContrastSelector] = __assign$1({ backgroundColor: \"Highlight\" }, getHighContrastNoAdjustStyle()), _c2)\n            }\n          ]\n        ],\n        disabled && [\n          {\n            cursor: \"default\"\n          },\n          !checked && [\n            {\n              borderColor: pillBorderDisabledColor\n            }\n          ],\n          checked && [\n            {\n              backgroundColor: pillCheckedDisabledBackground,\n              borderColor: \"transparent\",\n              justifyContent: \"flex-end\"\n            }\n          ]\n        ],\n        !disabled && {\n          selectors: {\n            \"&:hover\": {\n              selectors: (_e2 = {}, _e2[HighContrastSelector] = {\n                borderColor: \"Highlight\"\n              }, _e2)\n            }\n          }\n        }\n      ],\n      thumb: [\n        \"ms-Toggle-thumb\",\n        {\n          display: \"block\",\n          width: DEFAULT_THUMB_SIZE,\n          height: DEFAULT_THUMB_SIZE,\n          borderRadius: \"50%\",\n          transition: \"all 0.1s ease\",\n          backgroundColor: thumbBackground,\n          /* Border is added to handle high contrast mode for Firefox */\n          borderColor: \"transparent\",\n          borderWidth: DEFAULT_THUMB_SIZE / 2,\n          borderStyle: \"solid\",\n          boxSizing: \"border-box\"\n        },\n        !disabled && checked && [\n          {\n            backgroundColor: thumbCheckedBackground,\n            selectors: (_f = {}, _f[HighContrastSelector] = {\n              backgroundColor: \"Window\",\n              borderColor: \"Window\"\n            }, _f)\n          }\n        ],\n        disabled && [\n          !checked && [\n            {\n              backgroundColor: thumbDisabledBackground\n            }\n          ],\n          checked && [\n            {\n              backgroundColor: thumbCheckedDisabledBackground\n            }\n          ]\n        ]\n      ],\n      text: [\n        \"ms-Toggle-stateText\",\n        {\n          selectors: {\n            // Workaround: make rules more specific than Label rules.\n            \"&&\": {\n              padding: \"0\",\n              margin: \"0 8px\",\n              userSelect: \"none\",\n              fontWeight: FontWeights.regular\n            }\n          }\n        },\n        disabled && {\n          selectors: {\n            \"&&\": {\n              color: textDisabledColor,\n              selectors: (_g = {}, _g[HighContrastSelector] = {\n                color: \"GrayText\"\n              }, _g)\n            }\n          }\n        }\n      ]\n    };\n  };\n  var Toggle = styled(ToggleBase, getStyles, void 0, {\n    scope: \"Toggle\"\n  });\n  use(registerIcons$1);\n  initializeIcons();\n  const fluentUI = {\n    ActionButton,\n    ChoiceGroup,\n    ComboBox,\n    CommandBar,\n    ContextualMenuItemType,\n    Customizer,\n    DefaultButton,\n    Dialog,\n    DialogFooter,\n    DialogType,\n    Dropdown,\n    DropdownMenuItemType: SelectableOptionMenuItemType,\n    Icon,\n    IconButton,\n    getFocusStyle,\n    getTheme,\n    Label: Label$2,\n    loadTheme,\n    Modal,\n    PrimaryButton,\n    Slider,\n    Spinner,\n    SpinnerSize,\n    TextField,\n    Toggle,\n    registerIcons: registerIcons$1,\n    unregisterIcons: unregisterIcons$1\n  };\n  const strings = {\n    buttonLoadData: \"Load data\",\n    buttonThemeDark: \"Dark\",\n    buttonThemeLight: \"Light\",\n    buttonExport: \"Export\",\n    menuUserData: \"Use your own data\",\n    menuLocal: \"On this computer ...\",\n    menuUrl: \"Enter a URL ...\",\n    menuSnapshotsExportAsJSON: \"Export as .snapshots JSON file\",\n    menuSnapshotsExportAs: \"Export as ...\",\n    menuSnapshotsImport: \"Import a .snapshots JSON file\",\n    dialogTitleLocal: \"Use a file from your computer\",\n    dialogSubtextLocal: \"Your file will not be uploaded, it is only used by the browser on this computer.  The currently supported data formats are json (the default), csv (comma-separated values), tsv (tab-separated values), and topojson.\",\n    dialogTitleUrl: \"Use a data file via URL\",\n    dialogTitleSnapshotsExport: \"Export as\",\n    dialogTitleSnapshotsLocal: \"Use a snapshots file from your computer\",\n    dialogSubtextSnapshotsLocal: \"Use a file that was previously exported snapshots file. Your file will not be uploaded, it is only used by the browser on this computer.\",\n    dialogTitleSnapshotsUrl: \"Use a snapshots file via URL\",\n    dialogLoadButton: \"Load\",\n    labelLocal: \"[local]\",\n    labelColorFilter: \"Note: Colors will be re-mapped to the filter when viewing this saved chart.\",\n    labelPreferences: \"Preferences\",\n    labelCompactUI: \"Compact UI\",\n    labelCompactUIDescription: \"Compact UI hides collapses labels on dropdown menus.\",\n    labelSnapshotsExportHTMLTitle: \"HTML\",\n    labelSnapshotsExportHTMLDescription: \"A self contained HTML page with current data and snapshots pre-loaded.\",\n    labelSnapshotsExportMarkdownTitle: \"Markdown\",\n    labelSnapshotsExportMarkdownDescription: \"Markdown is a language used by many blogging platforms. Exports a Markdown file with thumbnails of these snapshots which link back to the SandDance website.\",\n    labelSnapshotsShortcut: \"Tip: Your .snapshots JSON file can also be pre-loaded with this\",\n    labelShare: \"share\",\n    labelLink: \"link\",\n    labelLinkDescription: \"A URL to revive this snapshot.\",\n    labelUrl: \"Url\",\n    labelDataFormat: \"Data format\",\n    labelDataUrlShortcut: \"Tip: Your data file can also be pre-loaded with this\",\n    urlInputPlaceholder: \"paste URL\",\n    sampleDataPrefix: \"Sample data\",\n    localFilePrefix: \"Local file\",\n    urlPrefix: \"Url\",\n    errorInvalidFileFormat: \"Invalid file format\",\n    errorNoUrl: \"Please enter a url\",\n    errorUrlHttp: 'Url must begin with \"http\"',\n    errorDownloadFailure: \"Data could not be prepared for download.\",\n    errorDataSourceFromLocal: (ds) => `Could not load ${ds.type} from local file.`,\n    errorDataSourceFromUrl: (ds) => `Could not load ${ds.type} from ${ds.dataUrl}`\n  };\n  function invalidUrlError(url) {\n    if (!url) {\n      return strings.errorNoUrl;\n    }\n    if (url.toLocaleLowerCase().substr(0, 4) !== \"http\") {\n      return strings.errorUrlHttp;\n    }\n  }\n  function DataSourceButton(props) {\n    const picker = props.getPicker();\n    if (!picker)\n      return null;\n    const menuProps = {\n      items: [\n        {\n          key: \"sample-section\",\n          itemType: base.fluentUI.ContextualMenuItemType.Section,\n          sectionProps: {\n            title: strings.sampleDataPrefix,\n            items: props.dataSources.map((ds, i) => {\n              const item = {\n                key: ds.id,\n                text: ds.displayName,\n                onClick: (e) => {\n                  picker.changeDataSource(ds);\n                }\n              };\n              return item;\n            })\n          }\n        },\n        {\n          key: \"user-section\",\n          itemType: base.fluentUI.ContextualMenuItemType.Section,\n          sectionProps: {\n            topDivider: true,\n            title: strings.menuUserData,\n            items: [\n              {\n                key: \"local\",\n                text: strings.menuLocal,\n                onClick: (e) => picker.setState({ dialogMode: \"local\" })\n              },\n              {\n                key: \"url\",\n                text: strings.menuUrl,\n                onClick: (e) => picker.setState({ dialogMode: \"url\" })\n              }\n            ]\n          }\n        }\n      ]\n    };\n    return React__namespace.createElement(base.fluentUI.PrimaryButton, { className: \"sanddance-datasource-picker\", text: dataSourcePrefix(props.dataSource.dataSourceType, props.dataSource.displayName), menuProps });\n  }\n  class DataSourcePicker extends React__namespace.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        url: \"\",\n        urlType: DataSourcePicker.urlTypes[0],\n        working: false\n      };\n    }\n    changeDataSource(dataSource) {\n      this.setState({ working: true });\n      return new Promise((resolve2, reject) => {\n        const uploadFormatError = \"\";\n        const urlError = \"\";\n        this.setState({ uploadFormatError, urlError });\n        this.props.changeDataSource(dataSource).then(() => {\n          this.setState({\n            working: false,\n            uploadFormatError: \"\",\n            urlError: \"\",\n            dialogMode: null\n          });\n          resolve2();\n        }).catch((reason) => {\n          this.setState({ working: false });\n          reject(reason);\n        });\n      });\n    }\n    upload(e) {\n      if (e.target.files) {\n        const file = e.target.files[0];\n        const split = file.name.split(\".\");\n        const type2 = split[split.length - 1];\n        if (DataSourcePicker.urlTypes.indexOf(type2) >= 0) {\n          const reader = new FileReader();\n          reader.onload = () => {\n            const id2 = file.name;\n            const displayName = file.name;\n            const rawText = reader.result;\n            const ds = {\n              dataSourceType: \"local\",\n              displayName,\n              id: id2,\n              rawText,\n              type: type2\n            };\n            this.changeDataSource(ds);\n          };\n          reader.readAsText(file);\n        } else {\n          const uploadFormatError = strings.errorInvalidFileFormat;\n          this.setState({ uploadFormatError });\n        }\n      }\n    }\n    loadUrl() {\n      if (!this.state.url) {\n        return this.setState({ urlError: strings.errorNoUrl });\n      }\n      if (this.state.url.toLocaleLowerCase().substr(0, 4) !== \"http\") {\n        return this.setState({ urlError: strings.errorUrlHttp });\n      }\n      const { url } = this.state;\n      const ds = {\n        dataSourceType: \"url\",\n        displayName: url,\n        id: url,\n        dataUrl: url,\n        type: this.state.urlType\n      };\n      this.changeDataSource(ds).catch((e) => {\n        this.setState({ urlError: e.message });\n      });\n    }\n    getUrlShortcut(dataUrl, type2) {\n      const dss = {\n        dataSource: {\n          dataSourceType: \"url\",\n          dataUrl,\n          displayName: dataUrl.substring(dataUrl.lastIndexOf(\"/\") + 1, dataUrl.lastIndexOf(\".\")),\n          id: \"\",\n          type: type2\n        }\n      };\n      return \"#\" + JSON.stringify(dss);\n    }\n    render() {\n      const closeDialog = () => {\n        this.setState({ dialogMode: null });\n      };\n      let shortcut;\n      if (this.state.url && !invalidUrlError(this.state.url) && !this.state.urlError) {\n        shortcut = this.getUrlShortcut(this.state.url, this.state.urlType);\n      }\n      return [React__namespace.createElement(\n        Dialog$1,\n        { key: \"local\", hidden: !(this.state.dialogMode === \"local\"), onDismiss: closeDialog, dialogContentProps: {\n          className: `sanddance-dialog ${this.props.theme}`,\n          type: base.fluentUI.DialogType.normal,\n          title: strings.dialogTitleLocal,\n          subText: strings.dialogSubtextLocal\n        } },\n        React__namespace.createElement(\"input\", { type: \"file\", onChange: (e) => this.upload(e), disabled: this.state.working }),\n        this.state.uploadFormatError && React__namespace.createElement(\"div\", { className: \"error\" }, this.state.uploadFormatError)\n      ), React__namespace.createElement(\n        Dialog$1,\n        { key: \"url\", hidden: !(this.state.dialogMode === \"url\"), onDismiss: closeDialog, dialogContentProps: {\n          className: `sanddance-dialog ${this.props.theme}`,\n          type: base.fluentUI.DialogType.normal,\n          title: strings.dialogTitleUrl\n        }, buttons: [\n          React__namespace.createElement(base.fluentUI.PrimaryButton, { key: 0, onClick: (e) => this.loadUrl(), iconProps: { iconName: \"CloudDownload\" }, text: strings.dialogLoadButton, disabled: this.state.working })\n        ] },\n        React__namespace.createElement(\n          \"section\",\n          null,\n          React__namespace.createElement(base.fluentUI.TextField, { label: strings.labelUrl, placeholder: strings.urlInputPlaceholder, onKeyUp: (e) => e.keyCode === 13 && this.loadUrl(), onChange: (e, url) => this.setState({ url, urlError: \"\" }), value: this.state.url, disabled: this.state.working }),\n          this.state.urlError && React__namespace.createElement(\"div\", { className: \"error\" }, this.state.urlError)\n        ),\n        React__namespace.createElement(\n          \"section\",\n          null,\n          React__namespace.createElement(base.fluentUI.ChoiceGroup, { selectedKey: this.state.urlType, options: DataSourcePicker.urlTypes.map((urlType, i) => {\n            return {\n              key: urlType,\n              text: urlType,\n              disabled: this.state.working\n            };\n          }), onChange: (ev, option) => this.setState({ urlType: option.text, urlError: \"\" }), label: strings.labelDataFormat })\n        ),\n        React__namespace.createElement(\n          \"section\",\n          { className: \"tip\", style: { visibility: !invalidUrlError(this.state.url) && !this.state.urlError ? \"visible\" : \"hidden\" } },\n          strings.labelDataUrlShortcut,\n          \" \",\n          React__namespace.createElement(\"a\", { href: shortcut, title: strings.labelLinkDescription, \"aria-label\": strings.labelLinkDescription }, strings.labelLink)\n        )\n      )];\n    }\n  }\n  DataSourcePicker.urlTypes = [\"json\", \"csv\", \"tsv\", \"topojson\"];\n  function dataSourcePrefix(dt, displayName) {\n    switch (dt) {\n      case \"sample\":\n        return `${strings.sampleDataPrefix}: ${displayName}`;\n      case \"local\":\n        return strings.localFilePrefix;\n      case \"url\":\n        return strings.urlPrefix;\n    }\n    return strings.buttonLoadData;\n  }\n  function downloadData(data2, fileName) {\n    const a2 = document.createElement(\"a\");\n    a2.setAttribute(\"download\", fileName);\n    document.body.appendChild(a2);\n    const blob = dataURIToBlob(data2);\n    a2.href = URL.createObjectURL(blob);\n    a2.onclick = () => {\n      requestAnimationFrame(() => URL.revokeObjectURL(a2.href));\n      document.body.removeChild(a2);\n    };\n    a2.click();\n  }\n  function dataURIToBlob(binStr) {\n    const len2 = binStr.length, arr = new Uint8Array(len2);\n    for (let i = 0; i < len2; i++) {\n      arr[i] = binStr.charCodeAt(i);\n    }\n    return new Blob([arr]);\n  }\n  var util = util$4;\n  function markdownImageLink(alt, imageUrl, link2) {\n    return `[![${alt}](${imageUrl})](${link2})`;\n  }\n  function cleanSnapshots(snapshots) {\n    const clean = util.clone(snapshots);\n    clean.forEach((snapshot) => {\n      if (snapshot.dataSource) {\n        delete snapshot.dataSource.snapshotsUrl;\n      }\n    });\n    return clean;\n  }\n  function downloadSnapshotsJSON(snapshots, filename) {\n    const clean = cleanSnapshots(snapshots);\n    downloadData(JSON.stringify(clean, null, 2), filename);\n  }\n  function serializeSnapshot(snapshotWithImage) {\n    const snapshot = util.clone(snapshotWithImage);\n    delete snapshot.bgColor;\n    delete snapshot.image;\n    if (snapshot.dataSource) {\n      delete snapshot.dataSource.rawText;\n    }\n    return JSON.stringify(snapshot);\n  }\n  function isSnapshot(snapshot) {\n    return snapshot.insight && snapshot.title;\n  }\n  function validSnapshots(snapshots) {\n    if (Array.isArray(snapshots)) {\n      for (let i = 0; i < snapshots.length; i++) {\n        if (!isSnapshot(snapshots[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    return false;\n  }\n  class SnapshotImportLocal extends React__namespace.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        working: false\n      };\n    }\n    readFile(e) {\n      if (e.target.files) {\n        this.setState({ working: true });\n        const file = e.target.files[0];\n        const reader = new FileReader();\n        reader.onload = () => {\n          const rawText = reader.result;\n          let snapshots;\n          try {\n            snapshots = JSON.parse(rawText);\n          } catch (e3) {\n            this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n          }\n          if (validSnapshots(snapshots)) {\n            this.props.onImportSnapshot(snapshots);\n            this.setState({ working: false });\n            this.props.onDismiss();\n          } else {\n            this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n          }\n        };\n        reader.readAsText(file);\n      }\n    }\n    render() {\n      return React__namespace.createElement(\n        \"div\",\n        null,\n        React__namespace.createElement(\n          Dialog$1,\n          { hidden: false, onDismiss: this.props.onDismiss, dialogContentProps: {\n            className: `sanddance-dialog ${this.props.theme}`,\n            type: base.fluentUI.DialogType.normal,\n            title: strings.dialogTitleSnapshotsLocal,\n            subText: strings.dialogSubtextSnapshotsLocal\n          } },\n          React__namespace.createElement(\n            \"section\",\n            null,\n            React__namespace.createElement(\"input\", { type: \"file\", onChange: (e) => this.readFile(e), disabled: this.state.working }),\n            this.state.fileFormatError && React__namespace.createElement(\"div\", { className: \"error\" }, this.state.fileFormatError)\n          )\n        )\n      );\n    }\n  }\n  class SnapshotImportRemote extends React__namespace.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        working: false\n      };\n    }\n    getUrlShortcut() {\n      const dataSource = util.clone(this.props.dataSource);\n      delete dataSource.snapshots;\n      dataSource.snapshotsUrl = this.state.url;\n      const dss = {\n        dataSource\n      };\n      return \"#\" + JSON.stringify(dss);\n    }\n    loadUrl() {\n      const urlError = invalidUrlError(this.state.url);\n      if (urlError) {\n        return this.setState({ urlError });\n      }\n      const { url } = this.state;\n      fetch(url).then((response) => {\n        if (response.status === 200) {\n          return response.json();\n        } else {\n          this.setState({ urlError: response.statusText });\n        }\n      }).then((snapshots) => {\n        if (validSnapshots(snapshots)) {\n          this.props.onImportSnapshot(snapshots);\n          this.props.onSnapshotsUrl(url);\n          this.setState({ working: false });\n          this.props.onDismiss();\n        } else {\n          this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n        }\n      }).catch((e) => {\n        this.setState({ urlError: e });\n      });\n    }\n    render() {\n      let shortcut;\n      if (this.props.dataSource.dataSourceType !== \"local\" && this.state.url && !invalidUrlError(this.state.url) && !this.state.urlError) {\n        shortcut = this.getUrlShortcut();\n      }\n      return React__namespace.createElement(\n        \"div\",\n        null,\n        React__namespace.createElement(\n          Dialog$1,\n          { hidden: false, onDismiss: this.props.onDismiss, dialogContentProps: {\n            className: `sanddance-dialog ${this.props.theme}`,\n            type: base.fluentUI.DialogType.normal,\n            title: strings.dialogTitleSnapshotsUrl\n          }, buttons: [\n            React__namespace.createElement(base.fluentUI.PrimaryButton, { disabled: !this.state.url || !!this.state.urlError, key: 0, onClick: (e) => this.loadUrl(), iconProps: { iconName: \"CloudDownload\" }, text: strings.dialogLoadButton })\n          ] },\n          React__namespace.createElement(\n            \"section\",\n            null,\n            React__namespace.createElement(base.fluentUI.TextField, { label: strings.labelUrl, placeholder: strings.urlInputPlaceholder, onKeyUp: (e) => e.keyCode === 13 && this.loadUrl(), onChange: (e, url) => this.setState({ url, urlError: \"\" }), value: this.state.url, disabled: this.state.working }),\n            this.state.urlError && React__namespace.createElement(\"div\", { className: \"error\" }, this.state.urlError)\n          ),\n          this.props.dataSource.dataSourceType !== \"local\" && React__namespace.createElement(\n            \"section\",\n            { className: \"tip\", style: { visibility: !invalidUrlError(this.state.url) && !this.state.urlError ? \"visible\" : \"hidden\" } },\n            strings.labelSnapshotsShortcut,\n            \" \",\n            React__namespace.createElement(\"a\", { href: shortcut, title: strings.labelLinkDescription, \"aria-label\": strings.labelLinkDescription }, strings.labelShare)\n          )\n        )\n      );\n    }\n  }\n  function SnapshotExport(props) {\n    return React__namespace.createElement(\n      Dialog$1,\n      { hidden: false, onDismiss: props.onDismiss, dialogContentProps: {\n        className: `sanddance-dialog ${props.theme} sanddance-export`,\n        type: base.fluentUI.DialogType.normal,\n        title: strings.dialogTitleSnapshotsExport\n      } },\n      React__namespace.createElement(\n        \"ul\",\n        null,\n        React__namespace.createElement(\n          \"li\",\n          null,\n          React__namespace.createElement(\"strong\", null, strings.labelSnapshotsExportHTMLTitle),\n          React__namespace.createElement(\"div\", null, strings.labelSnapshotsExportHTMLDescription),\n          React__namespace.createElement(base.fluentUI.PrimaryButton, { iconProps: { iconName: \"Download\" }, text: `${strings.buttonExport} ${strings.labelSnapshotsExportHTMLTitle}`, onClick: (e) => {\n            const clean = cleanSnapshots(props.snapshots);\n            const html = getEmbedHTML(props.explorer.state.dataContent.data, props.dataSource.displayName, clean);\n            downloadData(html, `${props.dataSource.displayName}.html`);\n          } })\n        ),\n        React__namespace.createElement(\n          \"li\",\n          null,\n          React__namespace.createElement(\"strong\", null, strings.labelSnapshotsExportMarkdownTitle),\n          React__namespace.createElement(\"div\", null, strings.labelSnapshotsExportMarkdownDescription),\n          React__namespace.createElement(base.fluentUI.PrimaryButton, { iconProps: { iconName: \"Download\" }, text: `${strings.buttonExport} ${strings.labelSnapshotsExportMarkdownTitle}`, onClick: (e) => {\n            const sections = props.snapshots.map((snapshot) => {\n              const section = [`## ${snapshot.title}`];\n              section.push(snapshot.description);\n              section.push(\"\\n\");\n              const url = `${location.origin}/#${encodeURIComponent(serializeSnapshot(snapshot))}`;\n              section.push(markdownImageLink(snapshot.title, snapshot.image, url));\n              return section.join(\"\\n\");\n            });\n            sections.unshift(`# ${props.dataSource.displayName}`);\n            downloadData(sections.join(\"\\n\\n\"), `${props.dataSource.displayName}.snapshots.md`);\n          } })\n        )\n      )\n    );\n  }\n  function getViewerOptions(darkTheme2, themeColors2) {\n    const colors2 = themeColors2 && themeColors2[darkTheme2 ? \"dark\" : \"light\"];\n    const viewerOptions = {\n      colors: Object.assign(Object.assign({}, getColorSettingsFromThemePalette(themePalettes[darkTheme2 ? \"dark-theme\" : \"\"])), colors2)\n    };\n    return viewerOptions;\n  }\n  function getSnapshotFromHash() {\n    const hash = document.location.hash && document.location.hash.substring(1);\n    if (hash) {\n      try {\n        return JSON.parse(decodeURIComponent(hash));\n      } catch (e) {\n      }\n    }\n  }\n  let snapshotOnLoad = getSnapshotFromHash();\n  if (snapshotOnLoad && snapshotOnLoad.dataSource && snapshotOnLoad.dataSource.dataSourceType === \"local\") {\n    snapshotOnLoad = null;\n  }\n  class SandDanceApp extends React__namespace.Component {\n    constructor(props) {\n      super(props);\n      this.state = {\n        compactUI: !!localStorage.getItem(\"compactUI\"),\n        dialogMode: null,\n        dataSource: snapshotOnLoad && snapshotOnLoad.dataSource || props.dataSources[0],\n        darkTheme: props.darkTheme\n      };\n      this.viewerOptions = getViewerOptions(this.state.darkTheme, props.themeColors);\n      this.handlers = {\n        hashchange: (e) => {\n          const snapshot = getSnapshotFromHash();\n          if (snapshot) {\n            this.explorer && this.explorer.calculate(() => this.hydrateSnapshot(snapshot));\n          }\n        },\n        resize: (e) => {\n          this.explorer && this.explorer.resize();\n        }\n      };\n      this.wireEventHandlers(true);\n      this.changeColorScheme(this.state.darkTheme);\n    }\n    wireEventHandlers(add2) {\n      for (const key2 in this.handlers) {\n        if (add2) {\n          window.addEventListener(key2, this.handlers[key2]);\n        } else {\n          window.removeEventListener(key2, this.handlers[key2]);\n        }\n      }\n    }\n    isSameDataSource(a2, b2) {\n      if (a2.dataSourceType === b2.dataSourceType && a2.type === b2.type && a2.id === b2.id) {\n        if (a2.dataSourceType === \"url\") {\n          return a2.dataUrl === b2.dataUrl;\n        }\n        return true;\n      }\n      return false;\n    }\n    hydrateSnapshot(snapshot, selectedSnapshotIndex = -1) {\n      if (snapshot.dataSource) {\n        if (this.isSameDataSource(snapshot.dataSource, this.state.dataSource)) {\n          if (selectedSnapshotIndex === -1) {\n            this.explorer.reviveSnapshot(snapshot);\n          } else {\n            this.explorer.reviveSnapshot(selectedSnapshotIndex);\n          }\n          if (snapshot.dataSource.snapshotsUrl && snapshot.dataSource.snapshotsUrl !== this.state.dataSource.snapshotsUrl) {\n            fetch(snapshot.dataSource.snapshotsUrl).then((response) => response.json()).then((snapshots) => {\n              if (validSnapshots(snapshots)) {\n                this.explorer.setState({ snapshots });\n                const dataSource = Object.assign({}, this.state.dataSource);\n                dataSource.snapshotsUrl = snapshot.dataSource.snapshotsUrl;\n                this.setState({ dataSource });\n              }\n            });\n          }\n        } else {\n          if (snapshot.dataSource.dataSourceType === \"local\") {\n            this.dataSourcePicker.setState({ dialogMode: \"local\" });\n            this.postLoad = (ds) => {\n              if (this.isSameDataSource(snapshot.dataSource, ds)) {\n                this.hydrateSnapshot(snapshot, selectedSnapshotIndex);\n              }\n            };\n          } else {\n            this.load(snapshot.dataSource, snapshot.insight).then(() => {\n              this.explorer.setState({ sideTabId: SideTabId.Snapshots, note: snapshot.description });\n              this.explorer.scrollSnapshotIntoView(selectedSnapshotIndex);\n            }).catch((e) => {\n              this.loadError(snapshot.dataSource);\n            });\n          }\n        }\n        return true;\n      }\n    }\n    load(dataSource, partialInsight) {\n      dataSource = clone(dataSource);\n      this.setState({ dataSource });\n      document.title = `SandDance - ${dataSource.displayName}`;\n      return this.explorer.load(dataSource, (columns) => {\n        return partialInsight || this.props.insights && this.props.insights[dataSource.id];\n      }, this.props.initialOptions && deepMerge({}, this.props.initialOptions[\"*\"], this.props.initialOptions[dataSource.id]));\n    }\n    dataSourceError(dataSource) {\n      switch (dataSource.dataSourceType) {\n        case \"local\":\n          return strings.errorDataSourceFromLocal(dataSource);\n        case \"sample\":\n        case \"url\":\n          return strings.errorDataSourceFromUrl(dataSource);\n      }\n    }\n    loadError(dataSource) {\n      const error2 = this.dataSourceError(dataSource);\n      this.explorer.setState({ errors: [error2] });\n      this.setState({ dataSource: { dataSourceType: null, id: null, type: null } });\n    }\n    updateExplorerViewerOptions(viewerOptions) {\n      this.viewerOptions = viewerOptions;\n      this.explorer && this.explorer.updateViewerOptions(this.viewerOptions);\n    }\n    getThemePalette(darkTheme2) {\n      const theme = darkTheme2 ? \"dark-theme\" : \"\";\n      return themePalettes[theme];\n    }\n    changeColorScheme(darkTheme2) {\n      this.updateExplorerViewerOptions(getViewerOptions(darkTheme2, this.props.themeColors));\n      base$3.vega.scheme(ColorScaleNone, (x2) => this.explorer.viewer.options.colors.defaultCube);\n      this.explorer && this.explorer.viewer && this.explorer.viewer.renderSameLayout(this.viewerOptions);\n      base.fluentUI.loadTheme({ palette: this.getThemePalette(darkTheme2) });\n    }\n    render() {\n      const theme = this.state.darkTheme ? \"dark-theme\" : \"\";\n      const dataSourceProps = {\n        dataSource: this.state.dataSource,\n        dataSources: this.props.dataSources,\n        changeDataSource: (dataSource) => {\n          document.location.hash = \"\";\n          return this.load(dataSource).then(() => {\n            if (this.postLoad) {\n              this.postLoad(dataSource);\n              this.postLoad = null;\n            }\n          }).catch(() => this.loadError(dataSource));\n        }\n      };\n      return React__namespace.createElement(\n        \"section\",\n        { className: \"sanddance-app\" },\n        React__namespace.createElement(Explorer, { logoClickTarget: \"_self\", logoClickUrl: \"/SandDance/\", theme, snapshotProps: {\n          modifySnapShot: (snapshot) => {\n            snapshot.dataSource = this.state.dataSource;\n          },\n          getTopActions: (snapshots) => {\n            const items = [\n              {\n                key: \"import\",\n                text: strings.menuSnapshotsImport,\n                subMenuProps: {\n                  items: [\n                    {\n                      key: \"import-local\",\n                      text: strings.menuLocal,\n                      onClick: () => this.setState({ dialogMode: \"import-local\" })\n                    },\n                    {\n                      key: \"import-remote\",\n                      text: strings.menuUrl,\n                      onClick: () => this.setState({ dialogMode: \"import-remote\" })\n                    }\n                  ]\n                }\n              },\n              {\n                key: \"export\",\n                text: strings.menuSnapshotsExportAsJSON,\n                disabled: snapshots.length === 0,\n                onClick: () => downloadSnapshotsJSON(snapshots, `${this.state.dataSource.displayName}.snapshots`)\n              },\n              {\n                key: \"export-as\",\n                text: strings.menuSnapshotsExportAs,\n                disabled: snapshots.length === 0,\n                onClick: () => this.setState({ dialogMode: \"export\" })\n              }\n            ];\n            return items;\n          },\n          getChildren: (snapshots) => React__namespace.createElement(\n            \"div\",\n            null,\n            this.state.dialogMode === \"import-local\" && React__namespace.createElement(SnapshotImportLocal, { theme, dataSource: this.state.dataSource, onImportSnapshot: (snapshots2) => this.explorer.setState({ snapshots: snapshots2 }), onDismiss: () => this.setState({ dialogMode: null }) }),\n            this.state.dialogMode === \"import-remote\" && React__namespace.createElement(SnapshotImportRemote, { theme, dataSource: this.state.dataSource, onImportSnapshot: (snapshots2) => this.explorer.setState({ snapshots: snapshots2 }), onSnapshotsUrl: (snapshotsUrl) => {\n              const dataSource = Object.assign({}, this.state.dataSource);\n              dataSource.snapshotsUrl = snapshotsUrl;\n              this.setState({ dataSource });\n            }, onDismiss: () => this.setState({ dialogMode: null }) }),\n            this.state.dialogMode === \"export\" && React__namespace.createElement(SnapshotExport, { explorer: this.explorer, dataSource: this.state.dataSource, snapshots, onDismiss: () => this.setState({ dialogMode: null }), theme })\n          ),\n          getActions: (snapshot, i) => {\n            const url = \"#\" + serializeSnapshot(snapshot);\n            let element2;\n            if (snapshot.dataSource && snapshot.dataSource.dataSourceType === \"local\") {\n              element2 = React__namespace.createElement(\"span\", { key: `link${i}` }, strings.labelLocal);\n            } else {\n              element2 = React__namespace.createElement(\"a\", { key: `link${i}`, href: url, title: strings.labelLinkDescription, \"aria-label\": strings.labelLinkDescription }, strings.labelShare);\n            }\n            return [{ element: element2 }];\n          },\n          getTitle: (insight) => `${this.state.dataSource.displayName} ${insight.chart}`,\n          getDescription: (insight) => \"\"\n          //TODO create description from filter etc.\n        }, onSnapshotClick: (snapshot, selectedSnapshotIndex) => this.hydrateSnapshot(snapshot, selectedSnapshotIndex), initialView: \"2d\", mounted: (e) => {\n          this.explorer = e;\n          this.load(this.state.dataSource, snapshotOnLoad && snapshotOnLoad.insight).catch((e3) => {\n            this.loadError(this.state.dataSource);\n          });\n          this.props.mounted(this);\n        }, dataExportHandler: (data2, datatype, displayName) => {\n          try {\n            downloadData(data2, `${displayName}.${datatype}`);\n          } catch (e) {\n            this.explorer.setState({ errors: [strings.errorDownloadFailure] });\n          }\n        }, datasetElement: React__namespace.createElement(DataSourceButton, Object.assign({ getPicker: () => this.dataSourcePicker }, dataSourceProps)), topBarButtonProps: [\n          {\n            key: \"theme\",\n            text: this.state.darkTheme ? strings.buttonThemeLight : strings.buttonThemeDark,\n            iconProps: {\n              iconName: this.state.darkTheme ? \"Sunny\" : \"ClearNight\"\n            },\n            onClick: () => {\n              const darkTheme2 = !this.state.darkTheme;\n              this.props.setTheme && this.props.setTheme(darkTheme2);\n              this.setState({ darkTheme: darkTheme2 });\n              this.changeColorScheme(darkTheme2);\n            }\n          }\n        ], viewerOptions: this.viewerOptions, compactUI: this.state.compactUI, additionalSettings: [\n          {\n            groupLabel: strings.labelPreferences,\n            children: React__namespace.createElement(base.fluentUI.Toggle, { label: strings.labelCompactUI, title: strings.labelCompactUIDescription, checked: this.state.compactUI, onChange: (e, checked) => {\n              if (checked) {\n                localStorage.setItem(\"compactUI\", \"true\");\n              } else {\n                localStorage.removeItem(\"compactUI\");\n              }\n              this.setState({ compactUI: checked });\n            } })\n          }\n        ] }),\n        React__namespace.createElement(DataSourcePicker, Object.assign({ ref: (dsp) => {\n          if (dsp && !this.dataSourcePicker)\n            this.dataSourcePicker = dsp;\n        }, theme }, dataSourceProps))\n      );\n    }\n  }\n  function accessor(fn2, fields, name) {\n    fn2.fields = fields || [];\n    fn2.fname = name;\n    return fn2;\n  }\n  function accessorName(fn2) {\n    return fn2 == null ? null : fn2.fname;\n  }\n  function accessorFields(fn2) {\n    return fn2 == null ? null : fn2.fields;\n  }\n  function getter$1(path2) {\n    return path2.length === 1 ? get1(path2[0]) : getN(path2);\n  }\n  const get1 = (field2) => function(obj2) {\n    return obj2[field2];\n  };\n  const getN = (path2) => {\n    const len2 = path2.length;\n    return function(obj2) {\n      for (let i = 0; i < len2; ++i) {\n        obj2 = obj2[path2[i]];\n      }\n      return obj2;\n    };\n  };\n  function error(message) {\n    throw Error(message);\n  }\n  function splitAccessPath(p) {\n    const path2 = [], n = p.length;\n    let q = null, b2 = 0, s2 = \"\", i, j, c2;\n    p = p + \"\";\n    function push2() {\n      path2.push(s2 + p.substring(i, j));\n      s2 = \"\";\n      i = j + 1;\n    }\n    for (i = j = 0; j < n; ++j) {\n      c2 = p[j];\n      if (c2 === \"\\\\\") {\n        s2 += p.substring(i, j++);\n        i = j;\n      } else if (c2 === q) {\n        push2();\n        q = null;\n        b2 = -1;\n      } else if (q) {\n        continue;\n      } else if (i === b2 && c2 === '\"') {\n        i = j + 1;\n        q = c2;\n      } else if (i === b2 && c2 === \"'\") {\n        i = j + 1;\n        q = c2;\n      } else if (c2 === \".\" && !b2) {\n        if (j > i) {\n          push2();\n        } else {\n          i = j + 1;\n        }\n      } else if (c2 === \"[\") {\n        if (j > i) push2();\n        b2 = i = j + 1;\n      } else if (c2 === \"]\") {\n        if (!b2) error(\"Access path missing open bracket: \" + p);\n        if (b2 > 0) push2();\n        b2 = 0;\n        i = j + 1;\n      }\n    }\n    if (b2) error(\"Access path missing closing bracket: \" + p);\n    if (q) error(\"Access path missing closing quote: \" + p);\n    if (j > i) {\n      j++;\n      push2();\n    }\n    return path2;\n  }\n  function field$1(field2, name, opt) {\n    const path2 = splitAccessPath(field2);\n    field2 = path2.length === 1 ? path2[0] : field2;\n    return accessor((opt && opt.get || getter$1)(path2), [field2], name || field2);\n  }\n  const id = field$1(\"id\");\n  const identity$2 = accessor((_) => _, [], \"identity\");\n  const zero$1 = accessor(() => 0, [], \"zero\");\n  const one$1 = accessor(() => 1, [], \"one\");\n  const truthy = accessor(() => true, [], \"true\");\n  const falsy = accessor(() => false, [], \"false\");\n  const DisallowedObjectProperties = /* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype).filter((name) => typeof Object.prototype[name] === \"function\"), \"__proto__\"]);\n  function log$1$1(method2, level, input) {\n    const args = [level].concat([].slice.call(input));\n    console[method2].apply(console, args);\n  }\n  const None$2 = 0;\n  const Error$1 = 1;\n  const Warn = 2;\n  const Info = 3;\n  const Debug = 4;\n  function logger(_, method2, handler = log$1$1) {\n    let level = _ || None$2;\n    return {\n      level(_2) {\n        if (arguments.length) {\n          level = +_2;\n          return this;\n        } else {\n          return level;\n        }\n      },\n      error() {\n        if (level >= Error$1) handler(method2 || \"error\", \"ERROR\", arguments);\n        return this;\n      },\n      warn() {\n        if (level >= Warn) handler(method2 || \"warn\", \"WARN\", arguments);\n        return this;\n      },\n      info() {\n        if (level >= Info) handler(method2 || \"log\", \"INFO\", arguments);\n        return this;\n      },\n      debug() {\n        if (level >= Debug) handler(method2 || \"log\", \"DEBUG\", arguments);\n        return this;\n      }\n    };\n  }\n  var isArray = Array.isArray;\n  function isObject(_) {\n    return _ === Object(_);\n  }\n  const isLegalKey = (key2) => key2 !== \"__proto__\";\n  function mergeConfig(...configs) {\n    return configs.reduce((out, source2) => {\n      for (const key2 in source2) {\n        if (key2 === \"signals\") {\n          out.signals = mergeNamed(out.signals, source2.signals);\n        } else {\n          const r = key2 === \"legend\" ? {\n            layout: 1\n          } : key2 === \"style\" ? true : null;\n          writeConfig(out, key2, source2[key2], r);\n        }\n      }\n      return out;\n    }, {});\n  }\n  function writeConfig(output2, key2, value2, recurse2) {\n    if (!isLegalKey(key2)) return;\n    let k, o;\n    if (isObject(value2) && !isArray(value2)) {\n      o = isObject(output2[key2]) ? output2[key2] : output2[key2] = {};\n      for (k in value2) {\n        if (recurse2 && (recurse2 === true || recurse2[k])) {\n          writeConfig(o, k, value2[k]);\n        } else if (isLegalKey(k)) {\n          o[k] = value2[k];\n        }\n      }\n    } else {\n      output2[key2] = value2;\n    }\n  }\n  function mergeNamed(a2, b2) {\n    if (a2 == null) return b2;\n    const map2 = {}, out = [];\n    function add2(_) {\n      if (!map2[_.name]) {\n        map2[_.name] = 1;\n        out.push(_);\n      }\n    }\n    b2.forEach(add2);\n    a2.forEach(add2);\n    return out;\n  }\n  function peek$1(array2) {\n    return array2[array2.length - 1];\n  }\n  function toNumber(_) {\n    return _ == null || _ === \"\" ? null : +_;\n  }\n  const exp$2 = (sign2) => (x2) => sign2 * Math.exp(x2);\n  const log$3 = (sign2) => (x2) => Math.log(sign2 * x2);\n  const symlog = (c2) => (x2) => Math.sign(x2) * Math.log1p(Math.abs(x2 / c2));\n  const symexp = (c2) => (x2) => Math.sign(x2) * Math.expm1(Math.abs(x2)) * c2;\n  const pow$3 = (exponent2) => (x2) => x2 < 0 ? -Math.pow(-x2, exponent2) : Math.pow(x2, exponent2);\n  function pan(domain2, delta, lift, ground) {\n    const d0 = lift(domain2[0]), d1 = lift(peek$1(domain2)), dd = (d1 - d0) * delta;\n    return [ground(d0 - dd), ground(d1 - dd)];\n  }\n  function panLinear(domain2, delta) {\n    return pan(domain2, delta, toNumber, identity$2);\n  }\n  function panLog(domain2, delta) {\n    var sign2 = Math.sign(domain2[0]);\n    return pan(domain2, delta, log$3(sign2), exp$2(sign2));\n  }\n  function panPow(domain2, delta, exponent2) {\n    return pan(domain2, delta, pow$3(exponent2), pow$3(1 / exponent2));\n  }\n  function panSymlog(domain2, delta, constant2) {\n    return pan(domain2, delta, symlog(constant2), symexp(constant2));\n  }\n  function zoom(domain2, anchor, scale2, lift, ground) {\n    const d0 = lift(domain2[0]), d1 = lift(peek$1(domain2)), da = anchor != null ? lift(anchor) : (d0 + d1) / 2;\n    return [ground(da + (d0 - da) * scale2), ground(da + (d1 - da) * scale2)];\n  }\n  function zoomLinear(domain2, anchor, scale2) {\n    return zoom(domain2, anchor, scale2, toNumber, identity$2);\n  }\n  function zoomLog(domain2, anchor, scale2) {\n    const sign2 = Math.sign(domain2[0]);\n    return zoom(domain2, anchor, scale2, log$3(sign2), exp$2(sign2));\n  }\n  function zoomPow(domain2, anchor, scale2, exponent2) {\n    return zoom(domain2, anchor, scale2, pow$3(exponent2), pow$3(1 / exponent2));\n  }\n  function zoomSymlog(domain2, anchor, scale2, constant2) {\n    return zoom(domain2, anchor, scale2, symlog(constant2), symexp(constant2));\n  }\n  function quarter(date2) {\n    return 1 + ~~(new Date(date2).getMonth() / 3);\n  }\n  function utcquarter(date2) {\n    return 1 + ~~(new Date(date2).getUTCMonth() / 3);\n  }\n  function array$4(_) {\n    return _ != null ? isArray(_) ? _ : [_] : [];\n  }\n  function clampRange(range2, min2, max2) {\n    let lo = range2[0], hi = range2[1], span2;\n    if (hi < lo) {\n      span2 = hi;\n      hi = lo;\n      lo = span2;\n    }\n    span2 = hi - lo;\n    return span2 >= max2 - min2 ? [min2, max2] : [lo = Math.min(Math.max(lo, min2), max2 - span2), lo + span2];\n  }\n  function isFunction(_) {\n    return typeof _ === \"function\";\n  }\n  const DESCENDING = \"descending\";\n  function compare$1(fields, orders, opt) {\n    opt = opt || {};\n    orders = array$4(orders) || [];\n    const ord = [], get2 = [], fmap = {}, gen = opt.comparator || comparator;\n    array$4(fields).forEach((f, i) => {\n      if (f == null) return;\n      ord.push(orders[i] === DESCENDING ? -1 : 1);\n      get2.push(f = isFunction(f) ? f : field$1(f, null, opt));\n      (accessorFields(f) || []).forEach((_) => fmap[_] = 1);\n    });\n    return get2.length === 0 ? null : accessor(gen(get2, ord), Object.keys(fmap));\n  }\n  const ascending$1 = (u2, v) => (u2 < v || u2 == null) && v != null ? -1 : (u2 > v || v == null) && u2 != null ? 1 : (v = v instanceof Date ? +v : v, u2 = u2 instanceof Date ? +u2 : u2) !== u2 && v === v ? -1 : v !== v && u2 === u2 ? 1 : 0;\n  const comparator = (fields, orders) => fields.length === 1 ? compare1(fields[0], orders[0]) : compareN(fields, orders, fields.length);\n  const compare1 = (field2, order) => function(a2, b2) {\n    return ascending$1(field2(a2), field2(b2)) * order;\n  };\n  const compareN = (fields, orders, n) => {\n    orders.push(0);\n    return function(a2, b2) {\n      let f, c2 = 0, i = -1;\n      while (c2 === 0 && ++i < n) {\n        f = fields[i];\n        c2 = ascending$1(f(a2), f(b2));\n      }\n      return c2 * orders[i];\n    };\n  };\n  function constant$4(_) {\n    return isFunction(_) ? _ : () => _;\n  }\n  function debounce(delay, handler) {\n    let tid;\n    return (e) => {\n      if (tid) clearTimeout(tid);\n      tid = setTimeout(() => (handler(e), tid = null), delay);\n    };\n  }\n  function extend(_) {\n    for (let x2, k, i = 1, len2 = arguments.length; i < len2; ++i) {\n      x2 = arguments[i];\n      for (k in x2) {\n        _[k] = x2[k];\n      }\n    }\n    return _;\n  }\n  function extent(array2, f) {\n    let i = 0, n, v, min2, max2;\n    if (array2 && (n = array2.length)) {\n      if (f == null) {\n        for (v = array2[i]; i < n && (v == null || v !== v); v = array2[++i]) ;\n        min2 = max2 = v;\n        for (; i < n; ++i) {\n          v = array2[i];\n          if (v != null) {\n            if (v < min2) min2 = v;\n            if (v > max2) max2 = v;\n          }\n        }\n      } else {\n        for (v = f(array2[i]); i < n && (v == null || v !== v); v = f(array2[++i])) ;\n        min2 = max2 = v;\n        for (; i < n; ++i) {\n          v = f(array2[i]);\n          if (v != null) {\n            if (v < min2) min2 = v;\n            if (v > max2) max2 = v;\n          }\n        }\n      }\n    }\n    return [min2, max2];\n  }\n  function extentIndex(array2, f) {\n    const n = array2.length;\n    let i = -1, a2, b2, c2, u2, v;\n    if (f == null) {\n      while (++i < n) {\n        b2 = array2[i];\n        if (b2 != null && b2 >= b2) {\n          a2 = c2 = b2;\n          break;\n        }\n      }\n      if (i === n) return [-1, -1];\n      u2 = v = i;\n      while (++i < n) {\n        b2 = array2[i];\n        if (b2 != null) {\n          if (a2 > b2) {\n            a2 = b2;\n            u2 = i;\n          }\n          if (c2 < b2) {\n            c2 = b2;\n            v = i;\n          }\n        }\n      }\n    } else {\n      while (++i < n) {\n        b2 = f(array2[i], i, array2);\n        if (b2 != null && b2 >= b2) {\n          a2 = c2 = b2;\n          break;\n        }\n      }\n      if (i === n) return [-1, -1];\n      u2 = v = i;\n      while (++i < n) {\n        b2 = f(array2[i], i, array2);\n        if (b2 != null) {\n          if (a2 > b2) {\n            a2 = b2;\n            u2 = i;\n          }\n          if (c2 < b2) {\n            c2 = b2;\n            v = i;\n          }\n        }\n      }\n    }\n    return [u2, v];\n  }\n  function has$1(object2, property2) {\n    return Object.hasOwn(object2, property2);\n  }\n  const NULL = {};\n  function fastmap(input) {\n    let obj2 = {}, test2;\n    function has$1$1(key2) {\n      return has$1(obj2, key2) && obj2[key2] !== NULL;\n    }\n    const map2 = {\n      size: 0,\n      empty: 0,\n      object: obj2,\n      has: has$1$1,\n      get(key2) {\n        return has$1$1(key2) ? obj2[key2] : void 0;\n      },\n      set(key2, value2) {\n        if (!has$1$1(key2)) {\n          ++map2.size;\n          if (obj2[key2] === NULL) --map2.empty;\n        }\n        obj2[key2] = value2;\n        return this;\n      },\n      delete(key2) {\n        if (has$1$1(key2)) {\n          --map2.size;\n          ++map2.empty;\n          obj2[key2] = NULL;\n        }\n        return this;\n      },\n      clear() {\n        map2.size = map2.empty = 0;\n        map2.object = obj2 = {};\n      },\n      test(_) {\n        if (arguments.length) {\n          test2 = _;\n          return map2;\n        } else {\n          return test2;\n        }\n      },\n      clean() {\n        const next = {};\n        let size = 0;\n        for (const key2 in obj2) {\n          const value2 = obj2[key2];\n          if (value2 !== NULL && (!test2 || !test2(value2))) {\n            next[key2] = value2;\n            ++size;\n          }\n        }\n        map2.size = size;\n        map2.empty = 0;\n        map2.object = obj2 = next;\n      }\n    };\n    if (input) Object.keys(input).forEach((key2) => {\n      map2.set(key2, input[key2]);\n    });\n    return map2;\n  }\n  function flush(range2, value2, threshold2, left, right, center) {\n    if (!threshold2 && threshold2 !== 0) return center;\n    const t = +threshold2;\n    let a2 = range2[0], b2 = peek$1(range2), l;\n    if (b2 < a2) {\n      l = a2;\n      a2 = b2;\n      b2 = l;\n    }\n    l = Math.abs(value2 - a2);\n    const r = Math.abs(b2 - value2);\n    return l < r && l <= t ? left : r <= t ? right : center;\n  }\n  function inherits(child, parent, members) {\n    const proto = child.prototype = Object.create(parent.prototype);\n    Object.defineProperty(proto, \"constructor\", {\n      value: child,\n      writable: true,\n      enumerable: true,\n      configurable: true\n    });\n    return extend(proto, members);\n  }\n  function inrange(value2, range2, left, right) {\n    let r0 = range2[0], r1 = range2[range2.length - 1], t;\n    if (r0 > r1) {\n      t = r0;\n      r0 = r1;\n      r1 = t;\n    }\n    left = left === void 0 || left;\n    right = right === void 0 || right;\n    return (left ? r0 <= value2 : r0 < value2) && (right ? value2 <= r1 : value2 < r1);\n  }\n  function isBoolean$1(_) {\n    return typeof _ === \"boolean\";\n  }\n  function isDate$1(_) {\n    return Object.prototype.toString.call(_) === \"[object Date]\";\n  }\n  function isIterable(_) {\n    return _ && isFunction(_[Symbol.iterator]);\n  }\n  function isNumber$1(_) {\n    return typeof _ === \"number\";\n  }\n  function isRegExp(_) {\n    return Object.prototype.toString.call(_) === \"[object RegExp]\";\n  }\n  function isString(_) {\n    return typeof _ === \"string\";\n  }\n  function key(fields, flat, opt) {\n    if (fields) {\n      fields = flat ? array$4(fields).map((f) => f.replace(/\\\\(.)/g, \"$1\")) : array$4(fields);\n    }\n    const len2 = fields && fields.length, gen = opt && opt.get || getter$1, map2 = (f) => gen(flat ? [f] : splitAccessPath(f));\n    let fn2;\n    if (!len2) {\n      fn2 = function() {\n        return \"\";\n      };\n    } else if (len2 === 1) {\n      const get2 = map2(fields[0]);\n      fn2 = function(_) {\n        return \"\" + get2(_);\n      };\n    } else {\n      const get2 = fields.map(map2);\n      fn2 = function(_) {\n        let s2 = \"\" + get2[0](_), i = 0;\n        while (++i < len2) s2 += \"|\" + get2[i](_);\n        return s2;\n      };\n    }\n    return accessor(fn2, fields, \"key\");\n  }\n  function lerp(array2, frac) {\n    const lo = array2[0], hi = peek$1(array2), f = +frac;\n    return !f ? lo : f === 1 ? hi : lo + f * (hi - lo);\n  }\n  const DEFAULT_MAX_SIZE = 1e4;\n  function lruCache(maxsize) {\n    maxsize = +maxsize || DEFAULT_MAX_SIZE;\n    let curr, prev, size;\n    const clear = () => {\n      curr = {};\n      prev = {};\n      size = 0;\n    };\n    const update2 = (key2, value2) => {\n      if (++size > maxsize) {\n        prev = curr;\n        curr = {};\n        size = 1;\n      }\n      return curr[key2] = value2;\n    };\n    clear();\n    return {\n      clear,\n      has: (key2) => has$1(curr, key2) || has$1(prev, key2),\n      get: (key2) => has$1(curr, key2) ? curr[key2] : has$1(prev, key2) ? update2(key2, prev[key2]) : void 0,\n      set: (key2, value2) => has$1(curr, key2) ? curr[key2] = value2 : update2(key2, value2)\n    };\n  }\n  function merge$2(compare2, array0, array1, output2) {\n    const n0 = array0.length, n1 = array1.length;\n    if (!n1) return array0;\n    if (!n0) return array1;\n    const merged = output2 || new array0.constructor(n0 + n1);\n    let i0 = 0, i1 = 0, i = 0;\n    for (; i0 < n0 && i1 < n1; ++i) {\n      merged[i] = compare2(array0[i0], array1[i1]) > 0 ? array1[i1++] : array0[i0++];\n    }\n    for (; i0 < n0; ++i0, ++i) {\n      merged[i] = array0[i0];\n    }\n    for (; i1 < n1; ++i1, ++i) {\n      merged[i] = array1[i1];\n    }\n    return merged;\n  }\n  function repeat(str, reps) {\n    let s2 = \"\";\n    while (--reps >= 0) s2 += str;\n    return s2;\n  }\n  function pad$1(str, length2, padchar, align) {\n    const c2 = padchar || \" \", s2 = str + \"\", n = length2 - s2.length;\n    return n <= 0 ? s2 : align === \"left\" ? repeat(c2, n) + s2 : align === \"center\" ? repeat(c2, ~~(n / 2)) + s2 + repeat(c2, Math.ceil(n / 2)) : s2 + repeat(c2, n);\n  }\n  function span(array2) {\n    return array2 && peek$1(array2) - array2[0] || 0;\n  }\n  function $(x2) {\n    return isArray(x2) ? `[${x2.map((v) => v === null ? \"null\" : $(v))}]` : isObject(x2) || isString(x2) ? (\n      // Output valid JSON and JS source strings.\n      // See https://github.com/judofyr/timeless/blob/master/posts/json-isnt-a-javascript-subset.md\n      JSON.stringify(x2).replaceAll(\"\\u2028\", \"\\\\u2028\").replaceAll(\"\\u2029\", \"\\\\u2029\")\n    ) : x2;\n  }\n  function toBoolean(_) {\n    return _ == null || _ === \"\" ? null : !_ || _ === \"false\" || _ === \"0\" ? false : !!_;\n  }\n  const defaultParser = (_) => isNumber$1(_) ? _ : isDate$1(_) ? _ : Date.parse(_);\n  function toDate(_, parser2) {\n    parser2 = parser2 || defaultParser;\n    return _ == null || _ === \"\" ? null : parser2(_);\n  }\n  function toString(_) {\n    return _ == null || _ === \"\" ? null : _ + \"\";\n  }\n  function toSet(_) {\n    const s2 = {}, n = _.length;\n    for (let i = 0; i < n; ++i) s2[_[i]] = true;\n    return s2;\n  }\n  function truncate$1(str, length2, align, ellipsis) {\n    const e = ellipsis != null ? ellipsis : \"…\", s2 = str + \"\", n = s2.length, l = Math.max(0, length2 - e.length);\n    return n <= length2 ? s2 : align === \"left\" ? e + s2.slice(n - l) : align === \"center\" ? s2.slice(0, Math.ceil(l / 2)) + e + s2.slice(n - ~~(l / 2)) : s2.slice(0, l) + e;\n  }\n  function visitArray(array2, filter2, visitor) {\n    if (array2) {\n      if (filter2) {\n        const n = array2.length;\n        for (let i = 0; i < n; ++i) {\n          const t = filter2(array2[i]);\n          if (t) visitor(t, i, array2);\n        }\n      } else {\n        array2.forEach(visitor);\n      }\n    }\n  }\n  var EOL = {}, EOF = {}, QUOTE = 34, NEWLINE = 10, RETURN = 13;\n  function objectConverter(columns) {\n    return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n      return JSON.stringify(name) + \": d[\" + i + '] || \"\"';\n    }).join(\",\") + \"}\");\n  }\n  function customConverter(columns, f) {\n    var object2 = objectConverter(columns);\n    return function(row, i) {\n      return f(object2(row), i, columns);\n    };\n  }\n  function inferColumns(rows) {\n    var columnSet = /* @__PURE__ */ Object.create(null), columns = [];\n    rows.forEach(function(row) {\n      for (var column in row) {\n        if (!(column in columnSet)) {\n          columns.push(columnSet[column] = column);\n        }\n      }\n    });\n    return columns;\n  }\n  function pad(value2, width2) {\n    var s2 = value2 + \"\", length2 = s2.length;\n    return length2 < width2 ? new Array(width2 - length2 + 1).join(0) + s2 : s2;\n  }\n  function formatYear(year) {\n    return year < 0 ? \"-\" + pad(-year, 6) : year > 9999 ? \"+\" + pad(year, 6) : pad(year, 4);\n  }\n  function formatDate(date2) {\n    var hours = date2.getUTCHours(), minutes = date2.getUTCMinutes(), seconds = date2.getUTCSeconds(), milliseconds = date2.getUTCMilliseconds();\n    return isNaN(date2) ? \"Invalid Date\" : formatYear(date2.getUTCFullYear()) + \"-\" + pad(date2.getUTCMonth() + 1, 2) + \"-\" + pad(date2.getUTCDate(), 2) + (milliseconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \".\" + pad(milliseconds, 3) + \"Z\" : seconds ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2) + \"Z\" : minutes || hours ? \"T\" + pad(hours, 2) + \":\" + pad(minutes, 2) + \"Z\" : \"\");\n  }\n  function dsvFormat(delimiter) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n\\r]\"), DELIMITER = delimiter.charCodeAt(0);\n    function parse2(text2, f) {\n      var convert2, columns, rows = parseRows(text2, function(row, i) {\n        if (convert2) return convert2(row, i - 1);\n        columns = row, convert2 = f ? customConverter(row, f) : objectConverter(row);\n      });\n      rows.columns = columns || [];\n      return rows;\n    }\n    function parseRows(text2, f) {\n      var rows = [], N = text2.length, I = 0, n = 0, t, eof = N <= 0, eol = false;\n      if (text2.charCodeAt(N - 1) === NEWLINE) --N;\n      if (text2.charCodeAt(N - 1) === RETURN) --N;\n      function token() {\n        if (eof) return EOF;\n        if (eol) return eol = false, EOL;\n        var i, j = I, c2;\n        if (text2.charCodeAt(j) === QUOTE) {\n          while (I++ < N && text2.charCodeAt(I) !== QUOTE || text2.charCodeAt(++I) === QUOTE) ;\n          if ((i = I) >= N) eof = true;\n          else if ((c2 = text2.charCodeAt(I++)) === NEWLINE) eol = true;\n          else if (c2 === RETURN) {\n            eol = true;\n            if (text2.charCodeAt(I) === NEWLINE) ++I;\n          }\n          return text2.slice(j + 1, i - 1).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          if ((c2 = text2.charCodeAt(i = I++)) === NEWLINE) eol = true;\n          else if (c2 === RETURN) {\n            eol = true;\n            if (text2.charCodeAt(I) === NEWLINE) ++I;\n          } else if (c2 !== DELIMITER) continue;\n          return text2.slice(j, i);\n        }\n        return eof = true, text2.slice(j, N);\n      }\n      while ((t = token()) !== EOF) {\n        var row = [];\n        while (t !== EOL && t !== EOF) row.push(t), t = token();\n        if (f && (row = f(row, n++)) == null) continue;\n        rows.push(row);\n      }\n      return rows;\n    }\n    function preformatBody(rows, columns) {\n      return rows.map(function(row) {\n        return columns.map(function(column) {\n          return formatValue2(row[column]);\n        }).join(delimiter);\n      });\n    }\n    function format2(rows, columns) {\n      if (columns == null) columns = inferColumns(rows);\n      return [columns.map(formatValue2).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n    }\n    function formatBody(rows, columns) {\n      if (columns == null) columns = inferColumns(rows);\n      return preformatBody(rows, columns).join(\"\\n\");\n    }\n    function formatRows(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    }\n    function formatRow(row) {\n      return row.map(formatValue2).join(delimiter);\n    }\n    function formatValue2(value2) {\n      return value2 == null ? \"\" : value2 instanceof Date ? formatDate(value2) : reFormat.test(value2 += \"\") ? '\"' + value2.replace(/\"/g, '\"\"') + '\"' : value2;\n    }\n    return {\n      parse: parse2,\n      parseRows,\n      format: format2,\n      formatBody,\n      formatRows,\n      formatRow,\n      formatValue: formatValue2\n    };\n  }\n  function identity$1(x2) {\n    return x2;\n  }\n  function transform$3(transform2) {\n    if (transform2 == null) return identity$1;\n    var x02, y02, kx = transform2.scale[0], ky = transform2.scale[1], dx = transform2.translate[0], dy = transform2.translate[1];\n    return function(input, i) {\n      if (!i) x02 = y02 = 0;\n      var j = 2, n = input.length, output2 = new Array(n);\n      output2[0] = (x02 += input[0]) * kx + dx;\n      output2[1] = (y02 += input[1]) * ky + dy;\n      while (j < n) output2[j] = input[j], ++j;\n      return output2;\n    };\n  }\n  function reverse$1(array2, n) {\n    var t, j = array2.length, i = j - n;\n    while (i < --j) t = array2[i], array2[i++] = array2[j], array2[j] = t;\n  }\n  function feature(topology, o) {\n    if (typeof o === \"string\") o = topology.objects[o];\n    return o.type === \"GeometryCollection\" ? { type: \"FeatureCollection\", features: o.geometries.map(function(o2) {\n      return feature$1(topology, o2);\n    }) } : feature$1(topology, o);\n  }\n  function feature$1(topology, o) {\n    var id2 = o.id, bbox = o.bbox, properties = o.properties == null ? {} : o.properties, geometry = object(topology, o);\n    return id2 == null && bbox == null ? { type: \"Feature\", properties, geometry } : bbox == null ? { type: \"Feature\", id: id2, properties, geometry } : { type: \"Feature\", id: id2, bbox, properties, geometry };\n  }\n  function object(topology, o) {\n    var transformPoint = transform$3(topology.transform), arcs = topology.arcs;\n    function arc2(i, points2) {\n      if (points2.length) points2.pop();\n      for (var a2 = arcs[i < 0 ? ~i : i], k = 0, n = a2.length; k < n; ++k) {\n        points2.push(transformPoint(a2[k], k));\n      }\n      if (i < 0) reverse$1(points2, n);\n    }\n    function point2(p) {\n      return transformPoint(p);\n    }\n    function line2(arcs2) {\n      var points2 = [];\n      for (var i = 0, n = arcs2.length; i < n; ++i) arc2(arcs2[i], points2);\n      if (points2.length < 2) points2.push(points2[0]);\n      return points2;\n    }\n    function ring(arcs2) {\n      var points2 = line2(arcs2);\n      while (points2.length < 4) points2.push(points2[0]);\n      return points2;\n    }\n    function polygon(arcs2) {\n      return arcs2.map(ring);\n    }\n    function geometry(o2) {\n      var type2 = o2.type, coordinates;\n      switch (type2) {\n        case \"GeometryCollection\":\n          return { type: type2, geometries: o2.geometries.map(geometry) };\n        case \"Point\":\n          coordinates = point2(o2.coordinates);\n          break;\n        case \"MultiPoint\":\n          coordinates = o2.coordinates.map(point2);\n          break;\n        case \"LineString\":\n          coordinates = line2(o2.arcs);\n          break;\n        case \"MultiLineString\":\n          coordinates = o2.arcs.map(line2);\n          break;\n        case \"Polygon\":\n          coordinates = polygon(o2.arcs);\n          break;\n        case \"MultiPolygon\":\n          coordinates = o2.arcs.map(polygon);\n          break;\n        default:\n          return null;\n      }\n      return { type: type2, coordinates };\n    }\n    return geometry(o);\n  }\n  function stitch(topology, arcs) {\n    var stitchedArcs = {}, fragmentByStart = {}, fragmentByEnd = {}, fragments = [], emptyIndex = -1;\n    arcs.forEach(function(i, j) {\n      var arc2 = topology.arcs[i < 0 ? ~i : i], t;\n      if (arc2.length < 3 && !arc2[1][0] && !arc2[1][1]) {\n        t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n      }\n    });\n    arcs.forEach(function(i) {\n      var e = ends(i), start = e[0], end = e[1], f, g;\n      if (f = fragmentByEnd[start]) {\n        delete fragmentByEnd[f.end];\n        f.push(i);\n        f.end = end;\n        if (g = fragmentByStart[end]) {\n          delete fragmentByStart[g.start];\n          var fg = g === f ? f : f.concat(g);\n          fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n        } else {\n          fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n        }\n      } else if (f = fragmentByStart[end]) {\n        delete fragmentByStart[f.start];\n        f.unshift(i);\n        f.start = start;\n        if (g = fragmentByEnd[start]) {\n          delete fragmentByEnd[g.end];\n          var gf = g === f ? f : g.concat(f);\n          fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n        } else {\n          fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n        }\n      } else {\n        f = [i];\n        fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n      }\n    });\n    function ends(i) {\n      var arc2 = topology.arcs[i < 0 ? ~i : i], p02 = arc2[0], p1;\n      if (topology.transform) p1 = [0, 0], arc2.forEach(function(dp) {\n        p1[0] += dp[0], p1[1] += dp[1];\n      });\n      else p1 = arc2[arc2.length - 1];\n      return i < 0 ? [p1, p02] : [p02, p1];\n    }\n    function flush2(fragmentByEnd2, fragmentByStart2) {\n      for (var k in fragmentByEnd2) {\n        var f = fragmentByEnd2[k];\n        delete fragmentByStart2[f.start];\n        delete f.start;\n        delete f.end;\n        f.forEach(function(i) {\n          stitchedArcs[i < 0 ? ~i : i] = 1;\n        });\n        fragments.push(f);\n      }\n    }\n    flush2(fragmentByEnd, fragmentByStart);\n    flush2(fragmentByStart, fragmentByEnd);\n    arcs.forEach(function(i) {\n      if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]);\n    });\n    return fragments;\n  }\n  function mesh(topology) {\n    return object(topology, meshArcs.apply(this, arguments));\n  }\n  function meshArcs(topology, object2, filter2) {\n    var arcs, i, n;\n    if (arguments.length > 1) arcs = extractArcs(topology, object2, filter2);\n    else for (i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i) arcs[i] = i;\n    return { type: \"MultiLineString\", arcs: stitch(topology, arcs) };\n  }\n  function extractArcs(topology, object2, filter2) {\n    var arcs = [], geomsByArc = [], geom;\n    function extract0(i) {\n      var j = i < 0 ? ~i : i;\n      (geomsByArc[j] || (geomsByArc[j] = [])).push({ i, g: geom });\n    }\n    function extract1(arcs2) {\n      arcs2.forEach(extract0);\n    }\n    function extract2(arcs2) {\n      arcs2.forEach(extract1);\n    }\n    function extract3(arcs2) {\n      arcs2.forEach(extract2);\n    }\n    function geometry(o) {\n      switch (geom = o, o.type) {\n        case \"GeometryCollection\":\n          o.geometries.forEach(geometry);\n          break;\n        case \"LineString\":\n          extract1(o.arcs);\n          break;\n        case \"MultiLineString\":\n        case \"Polygon\":\n          extract2(o.arcs);\n          break;\n        case \"MultiPolygon\":\n          extract3(o.arcs);\n          break;\n      }\n    }\n    geometry(object2);\n    geomsByArc.forEach(filter2 == null ? function(geoms) {\n      arcs.push(geoms[0].i);\n    } : function(geoms) {\n      if (filter2(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i);\n    });\n    return arcs;\n  }\n  const YEAR = \"year\";\n  const QUARTER = \"quarter\";\n  const MONTH = \"month\";\n  const WEEK = \"week\";\n  const DATE = \"date\";\n  const DAY = \"day\";\n  const DAYOFYEAR = \"dayofyear\";\n  const HOURS = \"hours\";\n  const MINUTES = \"minutes\";\n  const SECONDS = \"seconds\";\n  const MILLISECONDS = \"milliseconds\";\n  const TIME_UNITS = [YEAR, QUARTER, MONTH, WEEK, DATE, DAY, DAYOFYEAR, HOURS, MINUTES, SECONDS, MILLISECONDS];\n  const UNITS = TIME_UNITS.reduce((o, u2, i) => (o[u2] = 1 + i, o), {});\n  function timeUnits(units) {\n    const u2 = array$4(units).slice(), m2 = {};\n    if (!u2.length) error(\"Missing time unit.\");\n    u2.forEach((unit2) => {\n      if (has$1(UNITS, unit2)) {\n        m2[unit2] = 1;\n      } else {\n        error(`Invalid time unit: ${unit2}.`);\n      }\n    });\n    const numTypes = (m2[WEEK] || m2[DAY] ? 1 : 0) + (m2[QUARTER] || m2[MONTH] || m2[DATE] ? 1 : 0) + (m2[DAYOFYEAR] ? 1 : 0);\n    if (numTypes > 1) {\n      error(`Incompatible time units: ${units}`);\n    }\n    u2.sort((a2, b2) => UNITS[a2] - UNITS[b2]);\n    return u2;\n  }\n  const defaultSpecifiers = {\n    [YEAR]: \"%Y \",\n    [QUARTER]: \"Q%q \",\n    [MONTH]: \"%b \",\n    [DATE]: \"%d \",\n    [WEEK]: \"W%U \",\n    [DAY]: \"%a \",\n    [DAYOFYEAR]: \"%j \",\n    [HOURS]: \"%H:00\",\n    [MINUTES]: \"00:%M\",\n    [SECONDS]: \":%S\",\n    [MILLISECONDS]: \".%L\",\n    [`${YEAR}-${MONTH}`]: \"%Y-%m \",\n    [`${YEAR}-${MONTH}-${DATE}`]: \"%Y-%m-%d \",\n    [`${HOURS}-${MINUTES}`]: \"%H:%M\"\n  };\n  function timeUnitSpecifier(units, specifiers) {\n    const s2 = extend({}, defaultSpecifiers, specifiers), u2 = timeUnits(units), n = u2.length;\n    let fmt = \"\", start = 0, end, key2;\n    for (start = 0; start < n; ) {\n      for (end = u2.length; end > start; --end) {\n        key2 = u2.slice(start, end).join(\"-\");\n        if (s2[key2] != null) {\n          fmt += s2[key2];\n          start = end;\n          break;\n        }\n      }\n    }\n    return fmt.trim();\n  }\n  const t0 = /* @__PURE__ */ new Date();\n  function localYear(y2) {\n    t0.setFullYear(y2);\n    t0.setMonth(0);\n    t0.setDate(1);\n    t0.setHours(0, 0, 0, 0);\n    return t0;\n  }\n  function dayofyear(d2) {\n    return localDayOfYear(new Date(d2));\n  }\n  function week(d2) {\n    return localWeekNum(new Date(d2));\n  }\n  function localDayOfYear(d2) {\n    return timeDay.count(localYear(d2.getFullYear()) - 1, d2);\n  }\n  function localWeekNum(d2) {\n    return timeSunday.count(localYear(d2.getFullYear()) - 1, d2);\n  }\n  function localFirst(y2) {\n    return localYear(y2).getDay();\n  }\n  function localDate(y2, m2, d2, H, M2, S, L) {\n    if (0 <= y2 && y2 < 100) {\n      const date2 = new Date(-1, m2, d2, H, M2, S, L);\n      date2.setFullYear(y2);\n      return date2;\n    }\n    return new Date(y2, m2, d2, H, M2, S, L);\n  }\n  function utcdayofyear(d2) {\n    return utcDayOfYear(new Date(d2));\n  }\n  function utcweek(d2) {\n    return utcWeekNum(new Date(d2));\n  }\n  function utcDayOfYear(d2) {\n    const y2 = Date.UTC(d2.getUTCFullYear(), 0, 1);\n    return utcDay.count(y2 - 1, d2);\n  }\n  function utcWeekNum(d2) {\n    const y2 = Date.UTC(d2.getUTCFullYear(), 0, 1);\n    return utcSunday.count(y2 - 1, d2);\n  }\n  function utcFirst(y2) {\n    t0.setTime(Date.UTC(y2, 0, 1));\n    return t0.getUTCDay();\n  }\n  function utcDate(y2, m2, d2, H, M2, S, L) {\n    if (0 <= y2 && y2 < 100) {\n      const date2 = new Date(Date.UTC(-1, m2, d2, H, M2, S, L));\n      date2.setUTCFullYear(d2.y);\n      return date2;\n    }\n    return new Date(Date.UTC(y2, m2, d2, H, M2, S, L));\n  }\n  function floor(units, step, get2, inv, newDate2) {\n    const s2 = step || 1, b2 = peek$1(units), _ = (unit2, p, key2) => {\n      key2 = key2 || unit2;\n      return getUnit(get2[key2], inv[key2], unit2 === b2 && s2, p);\n    };\n    const t = /* @__PURE__ */ new Date(), u2 = toSet(units), y2 = u2[YEAR] ? _(YEAR) : constant$4(2012), m2 = u2[MONTH] ? _(MONTH) : u2[QUARTER] ? _(QUARTER) : zero$1, d2 = u2[WEEK] && u2[DAY] ? _(DAY, 1, WEEK + DAY) : u2[WEEK] ? _(WEEK, 1) : u2[DAY] ? _(DAY, 1) : u2[DATE] ? _(DATE, 1) : u2[DAYOFYEAR] ? _(DAYOFYEAR, 1) : one$1, H = u2[HOURS] ? _(HOURS) : zero$1, M2 = u2[MINUTES] ? _(MINUTES) : zero$1, S = u2[SECONDS] ? _(SECONDS) : zero$1, L = u2[MILLISECONDS] ? _(MILLISECONDS) : zero$1;\n    return function(v) {\n      t.setTime(+v);\n      const year = y2(t);\n      return newDate2(year, m2(t), d2(t, year), H(t), M2(t), S(t), L(t));\n    };\n  }\n  function getUnit(f, inv, step, phase) {\n    const u2 = step <= 1 ? f : phase ? (d2, y2) => phase + step * Math.floor((f(d2, y2) - phase) / step) : (d2, y2) => step * Math.floor(f(d2, y2) / step);\n    return inv ? (d2, y2) => inv(u2(d2, y2), y2) : u2;\n  }\n  function weekday(week2, day, firstDay) {\n    return day + week2 * 7 - (firstDay + 6) % 7;\n  }\n  const localGet = {\n    [YEAR]: (d2) => d2.getFullYear(),\n    [QUARTER]: (d2) => Math.floor(d2.getMonth() / 3),\n    [MONTH]: (d2) => d2.getMonth(),\n    [DATE]: (d2) => d2.getDate(),\n    [HOURS]: (d2) => d2.getHours(),\n    [MINUTES]: (d2) => d2.getMinutes(),\n    [SECONDS]: (d2) => d2.getSeconds(),\n    [MILLISECONDS]: (d2) => d2.getMilliseconds(),\n    [DAYOFYEAR]: (d2) => localDayOfYear(d2),\n    [WEEK]: (d2) => localWeekNum(d2),\n    [WEEK + DAY]: (d2, y2) => weekday(localWeekNum(d2), d2.getDay(), localFirst(y2)),\n    [DAY]: (d2, y2) => weekday(1, d2.getDay(), localFirst(y2))\n  };\n  const localInv = {\n    [QUARTER]: (q) => 3 * q,\n    [WEEK]: (w2, y2) => weekday(w2, 0, localFirst(y2))\n  };\n  function timeFloor(units, step) {\n    return floor(units, step || 1, localGet, localInv, localDate);\n  }\n  const utcGet = {\n    [YEAR]: (d2) => d2.getUTCFullYear(),\n    [QUARTER]: (d2) => Math.floor(d2.getUTCMonth() / 3),\n    [MONTH]: (d2) => d2.getUTCMonth(),\n    [DATE]: (d2) => d2.getUTCDate(),\n    [HOURS]: (d2) => d2.getUTCHours(),\n    [MINUTES]: (d2) => d2.getUTCMinutes(),\n    [SECONDS]: (d2) => d2.getUTCSeconds(),\n    [MILLISECONDS]: (d2) => d2.getUTCMilliseconds(),\n    [DAYOFYEAR]: (d2) => utcDayOfYear(d2),\n    [WEEK]: (d2) => utcWeekNum(d2),\n    [DAY]: (d2, y2) => weekday(1, d2.getUTCDay(), utcFirst(y2)),\n    [WEEK + DAY]: (d2, y2) => weekday(utcWeekNum(d2), d2.getUTCDay(), utcFirst(y2))\n  };\n  const utcInv = {\n    [QUARTER]: (q) => 3 * q,\n    [WEEK]: (w2, y2) => weekday(w2, 0, utcFirst(y2))\n  };\n  function utcFloor(units, step) {\n    return floor(units, step || 1, utcGet, utcInv, utcDate);\n  }\n  const timeIntervals = {\n    [YEAR]: timeYear,\n    [QUARTER]: timeMonth.every(3),\n    [MONTH]: timeMonth,\n    [WEEK]: timeSunday,\n    [DATE]: timeDay,\n    [DAY]: timeDay,\n    [DAYOFYEAR]: timeDay,\n    [HOURS]: timeHour,\n    [MINUTES]: timeMinute,\n    [SECONDS]: second,\n    [MILLISECONDS]: millisecond\n  };\n  const utcIntervals = {\n    [YEAR]: utcYear,\n    [QUARTER]: utcMonth.every(3),\n    [MONTH]: utcMonth,\n    [WEEK]: utcSunday,\n    [DATE]: utcDay,\n    [DAY]: utcDay,\n    [DAYOFYEAR]: utcDay,\n    [HOURS]: utcHour,\n    [MINUTES]: utcMinute,\n    [SECONDS]: second,\n    [MILLISECONDS]: millisecond\n  };\n  function timeInterval(unit2) {\n    return timeIntervals[unit2];\n  }\n  function utcInterval(unit2) {\n    return utcIntervals[unit2];\n  }\n  function offset$3(ival, date2, step) {\n    return ival ? ival.offset(date2, step) : void 0;\n  }\n  function timeOffset(unit2, date2, step) {\n    return offset$3(timeInterval(unit2), date2, step);\n  }\n  function utcOffset(unit2, date2, step) {\n    return offset$3(utcInterval(unit2), date2, step);\n  }\n  function sequence$1(ival, start, stop2, step) {\n    return ival ? ival.range(start, stop2, step) : void 0;\n  }\n  function timeSequence(unit2, start, stop2, step) {\n    return sequence$1(timeInterval(unit2), start, stop2, step);\n  }\n  function utcSequence(unit2, start, stop2, step) {\n    return sequence$1(utcInterval(unit2), start, stop2, step);\n  }\n  const durationSecond = 1e3, durationMinute = durationSecond * 60, durationHour = durationMinute * 60, durationDay = durationHour * 24, durationWeek = durationDay * 7, durationMonth = durationDay * 30, durationYear = durationDay * 365;\n  const Milli = [YEAR, MONTH, DATE, HOURS, MINUTES, SECONDS, MILLISECONDS], Seconds = Milli.slice(0, -1), Minutes = Seconds.slice(0, -1), Hours = Minutes.slice(0, -1), Day = Hours.slice(0, -1), Week = [YEAR, WEEK], Month = [YEAR, MONTH], Year = [YEAR];\n  const intervals = [[Seconds, 1, durationSecond], [Seconds, 5, 5 * durationSecond], [Seconds, 15, 15 * durationSecond], [Seconds, 30, 30 * durationSecond], [Minutes, 1, durationMinute], [Minutes, 5, 5 * durationMinute], [Minutes, 15, 15 * durationMinute], [Minutes, 30, 30 * durationMinute], [Hours, 1, durationHour], [Hours, 3, 3 * durationHour], [Hours, 6, 6 * durationHour], [Hours, 12, 12 * durationHour], [Day, 1, durationDay], [Week, 1, durationWeek], [Month, 1, durationMonth], [Month, 3, 3 * durationMonth], [Year, 1, durationYear]];\n  function bin$1(opt) {\n    const ext = opt.extent, max2 = opt.maxbins || 40, target2 = Math.abs(span(ext)) / max2;\n    let i = bisector((i2) => i2[2]).right(intervals, target2), units, step;\n    if (i === intervals.length) {\n      units = Year, step = tickStep(ext[0] / durationYear, ext[1] / durationYear, max2);\n    } else if (i) {\n      i = intervals[target2 / intervals[i - 1][2] < intervals[i][2] / target2 ? i - 1 : i];\n      units = i[0];\n      step = i[1];\n    } else {\n      units = Milli;\n      step = Math.max(tickStep(ext[0], ext[1], max2), 1);\n    }\n    return {\n      units,\n      step\n    };\n  }\n  function memoize(method2) {\n    const cache2 = {};\n    return (spec) => cache2[spec] || (cache2[spec] = method2(spec));\n  }\n  function trimZeroes(numberFormat, decimalChar) {\n    return (x2) => {\n      const str = numberFormat(x2), dec = str.indexOf(decimalChar);\n      if (dec < 0) return str;\n      let idx = rightmostDigit(str, dec);\n      const end = idx < str.length ? str.slice(idx) : \"\";\n      while (--idx > dec) if (str[idx] !== \"0\") {\n        ++idx;\n        break;\n      }\n      return str.slice(0, idx) + end;\n    };\n  }\n  function rightmostDigit(str, dec) {\n    let i = str.lastIndexOf(\"e\"), c2;\n    if (i > 0) return i;\n    for (i = str.length; --i > dec; ) {\n      c2 = str.charCodeAt(i);\n      if (c2 >= 48 && c2 <= 57) return i + 1;\n    }\n  }\n  function numberLocale(locale2) {\n    const format2 = memoize(locale2.format), formatPrefix2 = locale2.formatPrefix;\n    return {\n      format: format2,\n      formatPrefix: formatPrefix2,\n      formatFloat(spec) {\n        const s2 = formatSpecifier$1(spec || \",\");\n        if (s2.precision == null) {\n          s2.precision = 12;\n          switch (s2.type) {\n            case \"%\":\n              s2.precision -= 2;\n              break;\n            case \"e\":\n              s2.precision -= 1;\n              break;\n          }\n          return trimZeroes(\n            format2(s2),\n            // number format\n            format2(\".1f\")(1)[1]\n            // decimal point character\n          );\n        } else {\n          return format2(s2);\n        }\n      },\n      formatSpan(start, stop2, count2, specifier) {\n        specifier = formatSpecifier$1(specifier == null ? \",f\" : specifier);\n        const step = tickStep(start, stop2, count2), value2 = Math.max(Math.abs(start), Math.abs(stop2));\n        let precision;\n        if (specifier.precision == null) {\n          switch (specifier.type) {\n            case \"s\": {\n              if (!isNaN(precision = precisionPrefix(step, value2))) {\n                specifier.precision = precision;\n              }\n              return formatPrefix2(specifier, value2);\n            }\n            case \"\":\n            case \"e\":\n            case \"g\":\n            case \"p\":\n            case \"r\": {\n              if (!isNaN(precision = precisionRound(step, value2))) {\n                specifier.precision = precision - (specifier.type === \"e\");\n              }\n              break;\n            }\n            case \"f\":\n            case \"%\": {\n              if (!isNaN(precision = precisionFixed(step))) {\n                specifier.precision = precision - (specifier.type === \"%\") * 2;\n              }\n              break;\n            }\n          }\n        }\n        return format2(specifier);\n      }\n    };\n  }\n  let defaultNumberLocale;\n  resetNumberFormatDefaultLocale();\n  function resetNumberFormatDefaultLocale() {\n    return defaultNumberLocale = numberLocale({\n      format: format$4,\n      formatPrefix\n    });\n  }\n  function numberFormatLocale(definition2) {\n    return numberLocale(formatLocale$2(definition2));\n  }\n  function numberFormatDefaultLocale(definition2) {\n    return arguments.length ? defaultNumberLocale = numberFormatLocale(definition2) : defaultNumberLocale;\n  }\n  function timeMultiFormat(format2, interval2, spec) {\n    spec = spec || {};\n    if (!isObject(spec)) {\n      error(`Invalid time multi-format specifier: ${spec}`);\n    }\n    const second2 = interval2(SECONDS), minute = interval2(MINUTES), hour = interval2(HOURS), day = interval2(DATE), week2 = interval2(WEEK), month = interval2(MONTH), quarter2 = interval2(QUARTER), year = interval2(YEAR), L = format2(spec[MILLISECONDS] || \".%L\"), S = format2(spec[SECONDS] || \":%S\"), M2 = format2(spec[MINUTES] || \"%I:%M\"), H = format2(spec[HOURS] || \"%I %p\"), d2 = format2(spec[DATE] || spec[DAY] || \"%a %d\"), w2 = format2(spec[WEEK] || \"%b %d\"), m2 = format2(spec[MONTH] || \"%B\"), q = format2(spec[QUARTER] || \"%B\"), y2 = format2(spec[YEAR] || \"%Y\");\n    return (date2) => (second2(date2) < date2 ? L : minute(date2) < date2 ? S : hour(date2) < date2 ? M2 : day(date2) < date2 ? H : month(date2) < date2 ? week2(date2) < date2 ? d2 : w2 : year(date2) < date2 ? quarter2(date2) < date2 ? m2 : q : y2)(date2);\n  }\n  function timeLocale(locale2) {\n    const timeFormat2 = memoize(locale2.format), utcFormat2 = memoize(locale2.utcFormat);\n    return {\n      timeFormat: (spec) => isString(spec) ? timeFormat2(spec) : timeMultiFormat(timeFormat2, timeInterval, spec),\n      utcFormat: (spec) => isString(spec) ? utcFormat2(spec) : timeMultiFormat(utcFormat2, utcInterval, spec),\n      timeParse: memoize(locale2.parse),\n      utcParse: memoize(locale2.utcParse)\n    };\n  }\n  let defaultTimeLocale;\n  resetTimeFormatDefaultLocale();\n  function resetTimeFormatDefaultLocale() {\n    return defaultTimeLocale = timeLocale({\n      format: timeFormat$1,\n      parse: timeParse$1,\n      utcFormat: utcFormat$1,\n      utcParse: utcParse$1\n    });\n  }\n  function timeFormatLocale(definition2) {\n    return timeLocale(formatLocale$1(definition2));\n  }\n  function timeFormatDefaultLocale(definition2) {\n    return arguments.length ? defaultTimeLocale = timeFormatLocale(definition2) : defaultTimeLocale;\n  }\n  const createLocale = (number2, time2) => extend({}, number2, time2);\n  function locale(numberSpec, timeSpec) {\n    const number2 = numberSpec ? numberFormatLocale(numberSpec) : numberFormatDefaultLocale();\n    const time2 = timeSpec ? timeFormatLocale(timeSpec) : timeFormatDefaultLocale();\n    return createLocale(number2, time2);\n  }\n  function defaultLocale(numberSpec, timeSpec) {\n    const args = arguments.length;\n    if (args && args !== 2) {\n      error(\"defaultLocale expects either zero or two arguments.\");\n    }\n    return args ? createLocale(numberFormatDefaultLocale(numberSpec), timeFormatDefaultLocale(timeSpec)) : createLocale(numberFormatDefaultLocale(), timeFormatDefaultLocale());\n  }\n  function resetDefaultLocale() {\n    resetNumberFormatDefaultLocale();\n    resetTimeFormatDefaultLocale();\n    return defaultLocale();\n  }\n  const protocol_re = /^(data:|([A-Za-z]+:)?\\/\\/)/;\n  const allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i;\n  const whitespace_re = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205f\\u3000]/g;\n  const fileProtocol = \"file://\";\n  function loaderFactory(fs) {\n    return (options2) => ({\n      options: options2 || {},\n      sanitize,\n      load: load$1,\n      fileAccess: false,\n      file: fileLoader(),\n      http: httpLoader\n    });\n  }\n  async function load$1(uri, options2) {\n    const opt = await this.sanitize(uri, options2), url = opt.href;\n    return opt.localFile ? this.file(url) : this.http(url, options2?.http);\n  }\n  async function sanitize(uri, options2) {\n    options2 = extend({}, this.options, options2);\n    const fileAccess = this.fileAccess, result = {\n      href: null\n    };\n    let isFile, loadFile, base2;\n    const isAllowed = allowed_re.test(uri.replace(whitespace_re, \"\"));\n    if (uri == null || typeof uri !== \"string\" || !isAllowed) {\n      error(\"Sanitize failure, invalid URI: \" + $(uri));\n    }\n    const hasProtocol = protocol_re.test(uri);\n    if ((base2 = options2.baseURL) && !hasProtocol) {\n      if (!uri.startsWith(\"/\") && !base2.endsWith(\"/\")) {\n        uri = \"/\" + uri;\n      }\n      uri = base2 + uri;\n    }\n    loadFile = (isFile = uri.startsWith(fileProtocol)) || options2.mode === \"file\" || options2.mode !== \"http\" && !hasProtocol && fileAccess;\n    if (isFile) {\n      uri = uri.slice(fileProtocol.length);\n    } else if (uri.startsWith(\"//\")) {\n      if (options2.defaultProtocol === \"file\") {\n        uri = uri.slice(2);\n        loadFile = true;\n      } else {\n        uri = (options2.defaultProtocol || \"http\") + \":\" + uri;\n      }\n    }\n    Object.defineProperty(result, \"localFile\", {\n      value: !!loadFile\n    });\n    result.href = uri;\n    if (options2.target) {\n      result.target = options2.target + \"\";\n    }\n    if (options2.rel) {\n      result.rel = options2.rel + \"\";\n    }\n    if (options2.context === \"image\" && options2.crossOrigin) {\n      result.crossOrigin = options2.crossOrigin + \"\";\n    }\n    return result;\n  }\n  function fileLoader(fs) {\n    return fileReject;\n  }\n  async function fileReject() {\n    error(\"No file system access.\");\n  }\n  async function httpLoader(url, options2) {\n    const opt = extend({}, this.options.http, options2), type2 = options2 && options2.response, response = await fetch(url, opt);\n    return !response.ok ? error(response.status + \"\" + response.statusText) : isFunction(response[type2]) ? response[type2]() : response.text();\n  }\n  const isValid = (_) => _ != null && _ === _;\n  const isBoolean = (_) => _ === \"true\" || _ === \"false\" || _ === true || _ === false;\n  const isDate = (_) => !Number.isNaN(Date.parse(_));\n  const isNumber = (_) => !Number.isNaN(+_) && !(_ instanceof Date);\n  const isInteger = (_) => isNumber(_) && Number.isInteger(+_);\n  const typeParsers = {\n    boolean: toBoolean,\n    integer: toNumber,\n    number: toNumber,\n    date: toDate,\n    string: toString,\n    unknown: identity$2\n  };\n  const typeTests = [isBoolean, isInteger, isNumber, isDate];\n  const typeList = [\"boolean\", \"integer\", \"number\", \"date\"];\n  function inferType(values2, field2) {\n    if (!values2 || !values2.length) return \"unknown\";\n    const n = values2.length, m2 = typeTests.length, a2 = typeTests.map((_, i) => i + 1);\n    for (let i = 0, t = 0, j, value2; i < n; ++i) {\n      value2 = field2 ? values2[i][field2] : values2[i];\n      for (j = 0; j < m2; ++j) {\n        if (a2[j] && isValid(value2) && !typeTests[j](value2)) {\n          a2[j] = 0;\n          ++t;\n          if (t === typeTests.length) return \"string\";\n        }\n      }\n    }\n    return typeList[a2.reduce((u2, v) => u2 === 0 ? v : u2, 0) - 1];\n  }\n  function inferTypes(data2, fields) {\n    return fields.reduce((types2, field2) => {\n      types2[field2] = inferType(data2, field2);\n      return types2;\n    }, {});\n  }\n  function delimitedFormat(delimiter) {\n    const parse2 = function(data2, format2) {\n      const delim = {\n        delimiter\n      };\n      return dsv(data2, format2 ? extend(format2, delim) : delim);\n    };\n    parse2.responseType = \"text\";\n    return parse2;\n  }\n  function dsv(data2, format2) {\n    if (format2.header) {\n      data2 = format2.header.map($).join(format2.delimiter) + \"\\n\" + data2;\n    }\n    return dsvFormat(format2.delimiter).parse(data2 + \"\");\n  }\n  dsv.responseType = \"text\";\n  function isBuffer(_) {\n    return typeof Buffer === \"function\" && isFunction(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;\n  }\n  function json(data2, format2) {\n    const prop = format2 && format2.property ? field$1(format2.property) : identity$2;\n    return isObject(data2) && !isBuffer(data2) ? parseJSON(prop(data2), format2) : prop(JSON.parse(data2));\n  }\n  json.responseType = \"json\";\n  function parseJSON(data2, format2) {\n    if (!isArray(data2) && isIterable(data2)) {\n      data2 = [...data2];\n    }\n    return format2 && format2.copy ? JSON.parse(JSON.stringify(data2)) : data2;\n  }\n  const filters = {\n    interior: (a2, b2) => a2 !== b2,\n    exterior: (a2, b2) => a2 === b2\n  };\n  function topojson(data2, format2) {\n    let method2, object2, property2, filter2;\n    data2 = json(data2, format2);\n    if (format2 && format2.feature) {\n      method2 = feature;\n      property2 = format2.feature;\n    } else if (format2 && format2.mesh) {\n      method2 = mesh;\n      property2 = format2.mesh;\n      filter2 = filters[format2.filter];\n    } else {\n      error(\"Missing TopoJSON feature or mesh parameter.\");\n    }\n    object2 = (object2 = data2.objects[property2]) ? method2(data2, object2, filter2) : error(\"Invalid TopoJSON object: \" + property2);\n    return object2 && object2.features || [object2];\n  }\n  topojson.responseType = \"json\";\n  const format$2 = {\n    dsv,\n    csv: delimitedFormat(\",\"),\n    tsv: delimitedFormat(\"\t\"),\n    json,\n    topojson\n  };\n  function formats$1(name, reader) {\n    if (arguments.length > 1) {\n      format$2[name] = reader;\n      return this;\n    } else {\n      return has$1(format$2, name) ? format$2[name] : null;\n    }\n  }\n  function responseType(type2) {\n    const f = formats$1(type2);\n    return f && f.responseType || \"text\";\n  }\n  function read(data2, schema, timeParser, utcParser) {\n    schema = schema || {};\n    const reader = formats$1(schema.type || \"json\");\n    if (!reader) error(\"Unknown data format type: \" + schema.type);\n    data2 = reader(data2, schema);\n    if (schema.parse) parse$6(data2, schema.parse, timeParser, utcParser);\n    if (has$1(data2, \"columns\")) delete data2.columns;\n    return data2;\n  }\n  function parse$6(data2, types2, timeParser, utcParser) {\n    if (!data2.length) return;\n    const locale2 = timeFormatDefaultLocale();\n    timeParser = timeParser || locale2.timeParse;\n    utcParser = utcParser || locale2.utcParse;\n    let fields = data2.columns || Object.keys(data2[0]), datum2, field2, i, j, n, m2;\n    if (types2 === \"auto\") types2 = inferTypes(data2, fields);\n    fields = Object.keys(types2);\n    const parsers = fields.map((field3) => {\n      const type2 = types2[field3];\n      let parts, pattern;\n      if (type2 && (type2.startsWith(\"date:\") || type2.startsWith(\"utc:\"))) {\n        parts = type2.split(/:(.+)?/, 2);\n        pattern = parts[1];\n        if (pattern[0] === \"'\" && pattern[pattern.length - 1] === \"'\" || pattern[0] === '\"' && pattern[pattern.length - 1] === '\"') {\n          pattern = pattern.slice(1, -1);\n        }\n        const parse2 = parts[0] === \"utc\" ? utcParser : timeParser;\n        return parse2(pattern);\n      }\n      if (!typeParsers[type2]) {\n        throw Error(\"Illegal format pattern: \" + field3 + \":\" + type2);\n      }\n      return typeParsers[type2];\n    });\n    for (i = 0, n = data2.length, m2 = fields.length; i < n; ++i) {\n      datum2 = data2[i];\n      for (j = 0; j < m2; ++j) {\n        field2 = fields[j];\n        datum2[field2] = parsers[j](datum2[field2]);\n      }\n    }\n  }\n  const loader = loaderFactory();\n  function UniqueList(idFunc) {\n    const $2 = idFunc || identity$2, list = [], ids = {};\n    list.add = (_) => {\n      const id2 = $2(_);\n      if (!ids[id2]) {\n        ids[id2] = 1;\n        list.push(_);\n      }\n      return list;\n    };\n    list.remove = (_) => {\n      const id2 = $2(_);\n      if (ids[id2]) {\n        ids[id2] = 0;\n        const idx = list.indexOf(_);\n        if (idx >= 0) list.splice(idx, 1);\n      }\n      return list;\n    };\n    return list;\n  }\n  async function asyncCallback(df, callback) {\n    try {\n      await callback(df);\n    } catch (err) {\n      df.error(err);\n    }\n  }\n  const TUPLE_ID_KEY = Symbol(\"vega_id\");\n  let TUPLE_ID = 1;\n  function isTuple(t) {\n    return !!(t && tupleid(t));\n  }\n  function tupleid(t) {\n    return t[TUPLE_ID_KEY];\n  }\n  function setid(t, id2) {\n    t[TUPLE_ID_KEY] = id2;\n    return t;\n  }\n  function ingest$1(datum2) {\n    const t = datum2 === Object(datum2) ? datum2 : {\n      data: datum2\n    };\n    return tupleid(t) ? t : setid(t, TUPLE_ID++);\n  }\n  function derive(t) {\n    return rederive(t, ingest$1({}));\n  }\n  function rederive(t, d2) {\n    for (const k in t) d2[k] = t[k];\n    return d2;\n  }\n  function replace$1(t, d2) {\n    return setid(d2, tupleid(t));\n  }\n  function stableCompare(cmp, f) {\n    return !cmp ? null : f ? (a2, b2) => cmp(a2, b2) || tupleid(f(a2)) - tupleid(f(b2)) : (a2, b2) => cmp(a2, b2) || tupleid(a2) - tupleid(b2);\n  }\n  function isChangeSet(v) {\n    return v && v.constructor === changeset;\n  }\n  function changeset() {\n    const add2 = [], rem2 = [], mod = [], remp = [], modp = [];\n    let clean = null, reflow2 = false;\n    return {\n      constructor: changeset,\n      insert(t) {\n        const d2 = array$4(t), n = d2.length;\n        for (let i = 0; i < n; ++i) add2.push(d2[i]);\n        return this;\n      },\n      remove(t) {\n        const a2 = isFunction(t) ? remp : rem2, d2 = array$4(t), n = d2.length;\n        for (let i = 0; i < n; ++i) a2.push(d2[i]);\n        return this;\n      },\n      modify(t, field2, value2) {\n        const m2 = {\n          field: field2,\n          value: constant$4(value2)\n        };\n        if (isFunction(t)) {\n          m2.filter = t;\n          modp.push(m2);\n        } else {\n          m2.tuple = t;\n          mod.push(m2);\n        }\n        return this;\n      },\n      encode(t, set2) {\n        if (isFunction(t)) modp.push({\n          filter: t,\n          field: set2\n        });\n        else mod.push({\n          tuple: t,\n          field: set2\n        });\n        return this;\n      },\n      clean(value2) {\n        clean = value2;\n        return this;\n      },\n      reflow() {\n        reflow2 = true;\n        return this;\n      },\n      pulse(pulse2, tuples) {\n        const cur = {}, out = {};\n        let i, n, m2, f, t, id2;\n        for (i = 0, n = tuples.length; i < n; ++i) {\n          cur[tupleid(tuples[i])] = 1;\n        }\n        for (i = 0, n = rem2.length; i < n; ++i) {\n          t = rem2[i];\n          cur[tupleid(t)] = -1;\n        }\n        for (i = 0, n = remp.length; i < n; ++i) {\n          f = remp[i];\n          tuples.forEach((t4) => {\n            if (f(t4)) cur[tupleid(t4)] = -1;\n          });\n        }\n        for (i = 0, n = add2.length; i < n; ++i) {\n          t = add2[i];\n          id2 = tupleid(t);\n          if (cur[id2]) {\n            cur[id2] = 1;\n          } else {\n            pulse2.add.push(ingest$1(add2[i]));\n          }\n        }\n        for (i = 0, n = tuples.length; i < n; ++i) {\n          t = tuples[i];\n          if (cur[tupleid(t)] < 0) pulse2.rem.push(t);\n        }\n        function modify2(t4, f2, v) {\n          if (v) {\n            t4[f2] = v(t4);\n          } else {\n            pulse2.encode = f2;\n          }\n          if (!reflow2) out[tupleid(t4)] = t4;\n        }\n        for (i = 0, n = mod.length; i < n; ++i) {\n          m2 = mod[i];\n          t = m2.tuple;\n          f = m2.field;\n          id2 = cur[tupleid(t)];\n          if (id2 > 0) {\n            modify2(t, f, m2.value);\n            pulse2.modifies(f);\n          }\n        }\n        for (i = 0, n = modp.length; i < n; ++i) {\n          m2 = modp[i];\n          f = m2.filter;\n          tuples.forEach((t4) => {\n            if (f(t4) && cur[tupleid(t4)] > 0) {\n              modify2(t4, m2.field, m2.value);\n            }\n          });\n          pulse2.modifies(m2.field);\n        }\n        if (reflow2) {\n          pulse2.mod = rem2.length || remp.length ? tuples.filter((t4) => cur[tupleid(t4)] > 0) : tuples.slice();\n        } else {\n          for (id2 in out) pulse2.mod.push(out[id2]);\n        }\n        if (clean || clean == null && (rem2.length || remp.length)) {\n          pulse2.clean(true);\n        }\n        return pulse2;\n      }\n    };\n  }\n  const CACHE = \"_:mod:_\";\n  function Parameters() {\n    Object.defineProperty(this, CACHE, {\n      writable: true,\n      value: {}\n    });\n  }\n  Parameters.prototype = {\n    /**\n     * Set a parameter value. If the parameter value changes, the parameter\n     * will be recorded as modified.\n     * @param {string} name - The parameter name.\n     * @param {number} index - The index into an array-value parameter. Ignored if\n     *   the argument is undefined, null or less than zero.\n     * @param {*} value - The parameter value to set.\n     * @param {boolean} [force=false] - If true, records the parameter as modified\n     *   even if the value is unchanged.\n     * @return {Parameters} - This parameter object.\n     */\n    set(name, index2, value2, force2) {\n      const o = this, v = o[name], mod = o[CACHE];\n      if (index2 != null && index2 >= 0) {\n        if (v[index2] !== value2 || force2) {\n          v[index2] = value2;\n          mod[index2 + \":\" + name] = -1;\n          mod[name] = -1;\n        }\n      } else if (v !== value2 || force2) {\n        o[name] = value2;\n        mod[name] = isArray(value2) ? 1 + value2.length : -1;\n      }\n      return o;\n    },\n    /**\n     * Tests if one or more parameters has been modified. If invoked with no\n     * arguments, returns true if any parameter value has changed. If the first\n     * argument is array, returns trues if any parameter name in the array has\n     * changed. Otherwise, tests if the given name and optional array index has\n     * changed.\n     * @param {string} name - The parameter name to test.\n     * @param {number} [index=undefined] - The parameter array index to test.\n     * @return {boolean} - Returns true if a queried parameter was modified.\n     */\n    modified(name, index2) {\n      const mod = this[CACHE];\n      if (!arguments.length) {\n        for (const k in mod) {\n          if (mod[k]) return true;\n        }\n        return false;\n      } else if (isArray(name)) {\n        for (let k = 0; k < name.length; ++k) {\n          if (mod[name[k]]) return true;\n        }\n        return false;\n      }\n      return index2 != null && index2 >= 0 ? index2 + 1 < mod[name] || !!mod[index2 + \":\" + name] : !!mod[name];\n    },\n    /**\n     * Clears the modification records. After calling this method,\n     * all parameters are considered unmodified.\n     */\n    clear() {\n      this[CACHE] = {};\n      return this;\n    }\n  };\n  let OP_ID = 0;\n  const PULSE = \"pulse\", NO_PARAMS = new Parameters();\n  const SKIP$1$1 = 1, MODIFIED = 2;\n  function Operator(init2, update2, params2, react) {\n    this.id = ++OP_ID;\n    this.value = init2;\n    this.stamp = -1;\n    this.rank = -1;\n    this.qrank = -1;\n    this.flags = 0;\n    if (update2) {\n      this._update = update2;\n    }\n    if (params2) this.parameters(params2, react);\n  }\n  function flag(bit) {\n    return function(state) {\n      const f = this.flags;\n      if (arguments.length === 0) return !!(f & bit);\n      this.flags = state ? f | bit : f & ~bit;\n      return this;\n    };\n  }\n  Operator.prototype = {\n    /**\n     * Returns a list of target operators dependent on this operator.\n     * If this list does not exist, it is created and then returned.\n     * @return {UniqueList}\n     */\n    targets() {\n      return this._targets || (this._targets = UniqueList(id));\n    },\n    /**\n     * Sets the value of this operator.\n     * @param {*} value - the value to set.\n     * @return {Number} Returns 1 if the operator value has changed\n     *   according to strict equality, returns 0 otherwise.\n     */\n    set(value2) {\n      if (this.value !== value2) {\n        this.value = value2;\n        return 1;\n      } else {\n        return 0;\n      }\n    },\n    /**\n     * Indicates that operator evaluation should be skipped on the next pulse.\n     * This operator will still propagate incoming pulses, but its update function\n     * will not be invoked. The skip flag is reset after every pulse, so calling\n     * this method will affect processing of the next pulse only.\n     */\n    skip: flag(SKIP$1$1),\n    /**\n     * Indicates that this operator's value has been modified on its most recent\n     * pulse. Normally modification is checked via strict equality; however, in\n     * some cases it is more efficient to update the internal state of an object.\n     * In those cases, the modified flag can be used to trigger propagation. Once\n     * set, the modification flag persists across pulses until unset. The flag can\n     * be used with the last timestamp to test if a modification is recent.\n     */\n    modified: flag(MODIFIED),\n    /**\n     * Sets the parameters for this operator. The parameter values are analyzed for\n     * operator instances. If found, this operator will be added as a dependency\n     * of the parameterizing operator. Operator values are dynamically marshalled\n     * from each operator parameter prior to evaluation. If a parameter value is\n     * an array, the array will also be searched for Operator instances. However,\n     * the search does not recurse into sub-arrays or object properties.\n     * @param {object} params - A hash of operator parameters.\n     * @param {boolean} [react=true] - A flag indicating if this operator should\n     *   automatically update (react) when parameter values change. In other words,\n     *   this flag determines if the operator registers itself as a listener on\n     *   any upstream operators included in the parameters.\n     * @param {boolean} [initonly=false] - A flag indicating if this operator\n     *   should calculate an update only upon its initial evaluation, then\n     *   deregister dependencies and suppress all future update invocations.\n     * @return {Operator[]} - An array of upstream dependencies.\n     */\n    parameters(params2, react, initonly) {\n      react = react !== false;\n      const argval = this._argval = this._argval || new Parameters(), argops = this._argops = this._argops || [], deps = [];\n      let name, value2, n, i;\n      const add2 = (name2, index2, value3) => {\n        if (value3 instanceof Operator) {\n          if (value3 !== this) {\n            if (react) value3.targets().add(this);\n            deps.push(value3);\n          }\n          argops.push({\n            op: value3,\n            name: name2,\n            index: index2\n          });\n        } else {\n          argval.set(name2, index2, value3);\n        }\n      };\n      for (name in params2) {\n        value2 = params2[name];\n        if (name === PULSE) {\n          array$4(value2).forEach((op) => {\n            if (!(op instanceof Operator)) {\n              error(\"Pulse parameters must be operator instances.\");\n            } else if (op !== this) {\n              op.targets().add(this);\n              deps.push(op);\n            }\n          });\n          this.source = value2;\n        } else if (isArray(value2)) {\n          argval.set(name, -1, Array(n = value2.length));\n          for (i = 0; i < n; ++i) add2(name, i, value2[i]);\n        } else {\n          add2(name, -1, value2);\n        }\n      }\n      this.marshall().clear();\n      if (initonly) argops.initonly = true;\n      return deps;\n    },\n    /**\n     * Internal method for marshalling parameter values.\n     * Visits each operator dependency to pull the latest value.\n     * @return {Parameters} A Parameters object to pass to the update function.\n     */\n    marshall(stamp) {\n      const argval = this._argval || NO_PARAMS, argops = this._argops;\n      let item, i, op, mod;\n      if (argops) {\n        const n = argops.length;\n        for (i = 0; i < n; ++i) {\n          item = argops[i];\n          op = item.op;\n          mod = op.modified() && op.stamp === stamp;\n          argval.set(item.name, item.index, op.value, mod);\n        }\n        if (argops.initonly) {\n          for (i = 0; i < n; ++i) {\n            item = argops[i];\n            item.op.targets().remove(this);\n          }\n          this._argops = null;\n          this._update = null;\n        }\n      }\n      return argval;\n    },\n    /**\n     * Detach this operator from the dataflow.\n     * Unregisters listeners on upstream dependencies.\n     */\n    detach() {\n      const argops = this._argops;\n      let i, n, item, op;\n      if (argops) {\n        for (i = 0, n = argops.length; i < n; ++i) {\n          item = argops[i];\n          op = item.op;\n          if (op._targets) {\n            op._targets.remove(this);\n          }\n        }\n      }\n      this.pulse = null;\n      this.source = null;\n    },\n    /**\n     * Delegate method to perform operator processing.\n     * Subclasses can override this method to perform custom processing.\n     * By default, it marshalls parameters and calls the update function\n     * if that function is defined. If the update function does not\n     * change the operator value then StopPropagation is returned.\n     * If no update function is defined, this method does nothing.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return The output pulse or StopPropagation. A falsy return value\n     *   (including undefined) will let the input pulse pass through.\n     */\n    evaluate(pulse2) {\n      const update2 = this._update;\n      if (update2) {\n        const params2 = this.marshall(pulse2.stamp), v = update2.call(this, params2, pulse2);\n        params2.clear();\n        if (v !== this.value) {\n          this.value = v;\n        } else if (!this.modified()) {\n          return pulse2.StopPropagation;\n        }\n      }\n    },\n    /**\n     * Run this operator for the current pulse. If this operator has already\n     * been run at (or after) the pulse timestamp, returns StopPropagation.\n     * Internally, this method calls {@link evaluate} to perform processing.\n     * If {@link evaluate} returns a falsy value, the input pulse is returned.\n     * This method should NOT be overridden, instead overrride {@link evaluate}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return the output pulse for this operator (or StopPropagation)\n     */\n    run(pulse2) {\n      if (pulse2.stamp < this.stamp) return pulse2.StopPropagation;\n      let rv;\n      if (this.skip()) {\n        this.skip(false);\n        rv = 0;\n      } else {\n        rv = this.evaluate(pulse2);\n      }\n      return this.pulse = rv || pulse2;\n    }\n  };\n  function add$3(init2, update2, params2, react) {\n    let shift = 1, op;\n    if (init2 instanceof Operator) {\n      op = init2;\n    } else if (init2 && init2.prototype instanceof Operator) {\n      op = new init2();\n    } else if (isFunction(init2)) {\n      op = new Operator(null, init2);\n    } else {\n      shift = 0;\n      op = new Operator(init2, update2);\n    }\n    this.rank(op);\n    if (shift) {\n      react = params2;\n      params2 = update2;\n    }\n    if (params2) this.connect(op, op.parameters(params2, react));\n    this.touch(op);\n    return op;\n  }\n  function connect(target2, sources) {\n    const targetRank = target2.rank, n = sources.length;\n    for (let i = 0; i < n; ++i) {\n      if (targetRank < sources[i].rank) {\n        this.rerank(target2);\n        return;\n      }\n    }\n  }\n  let STREAM_ID = 0;\n  function EventStream(filter2, apply2, receive) {\n    this.id = ++STREAM_ID;\n    this.value = null;\n    if (receive) this.receive = receive;\n    if (filter2) this._filter = filter2;\n    if (apply2) this._apply = apply2;\n  }\n  function stream(filter2, apply2, receive) {\n    return new EventStream(filter2, apply2, receive);\n  }\n  EventStream.prototype = {\n    _filter: truthy,\n    _apply: identity$2,\n    targets() {\n      return this._targets || (this._targets = UniqueList(id));\n    },\n    consume(_) {\n      if (!arguments.length) return !!this._consume;\n      this._consume = !!_;\n      return this;\n    },\n    receive(evt) {\n      if (this._filter(evt)) {\n        const val = this.value = this._apply(evt), trg = this._targets, n = trg ? trg.length : 0;\n        for (let i = 0; i < n; ++i) trg[i].receive(val);\n        if (this._consume) {\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n      }\n    },\n    filter(filter2) {\n      const s2 = stream(filter2);\n      this.targets().add(s2);\n      return s2;\n    },\n    apply(apply2) {\n      const s2 = stream(null, apply2);\n      this.targets().add(s2);\n      return s2;\n    },\n    merge() {\n      const s2 = stream();\n      this.targets().add(s2);\n      for (let i = 0, n = arguments.length; i < n; ++i) {\n        arguments[i].targets().add(s2);\n      }\n      return s2;\n    },\n    throttle(pause) {\n      let t = -1;\n      return this.filter(() => {\n        const now2 = Date.now();\n        if (now2 - t > pause) {\n          t = now2;\n          return 1;\n        } else {\n          return 0;\n        }\n      });\n    },\n    debounce(delay) {\n      const s2 = stream();\n      this.targets().add(stream(null, null, debounce(delay, (e) => {\n        const df = e.dataflow;\n        s2.receive(e);\n        if (df && df.run) df.run();\n      })));\n      return s2;\n    },\n    between(a2, b2) {\n      let active = false;\n      a2.targets().add(stream(null, null, () => active = true));\n      b2.targets().add(stream(null, null, () => active = false));\n      return this.filter(() => active);\n    },\n    detach() {\n      this._filter = truthy;\n      this._targets = null;\n    }\n  };\n  function events$1(source2, type2, filter2, apply2) {\n    const df = this, s2 = stream(filter2, apply2), send = function(e) {\n      e.dataflow = df;\n      try {\n        s2.receive(e);\n      } catch (error2) {\n        df.error(error2);\n      } finally {\n        df.run();\n      }\n    };\n    let sources;\n    if (typeof source2 === \"string\" && typeof document !== \"undefined\") {\n      sources = document.querySelectorAll(source2);\n    } else {\n      sources = array$4(source2);\n    }\n    const n = sources.length;\n    for (let i = 0; i < n; ++i) {\n      sources[i].addEventListener(type2, send);\n    }\n    return s2;\n  }\n  function parse$5(data2, format2) {\n    const locale2 = this.locale();\n    return read(data2, format2, locale2.timeParse, locale2.utcParse);\n  }\n  function ingest(target2, data2, format2) {\n    data2 = this.parse(data2, format2);\n    return this.pulse(target2, this.changeset().insert(data2));\n  }\n  async function request(url, format2) {\n    const df = this;\n    let status = 0, data2;\n    try {\n      data2 = await df.loader().load(url, {\n        context: \"dataflow\",\n        response: responseType(format2 && format2.type)\n      });\n      try {\n        data2 = df.parse(data2, format2);\n      } catch (err) {\n        status = -2;\n        df.warn(\"Data ingestion failed\", url, err);\n      }\n    } catch (err) {\n      status = -1;\n      df.warn(\"Loading failed\", url, err);\n    }\n    return {\n      data: data2,\n      status\n    };\n  }\n  async function preload(target2, url, format2) {\n    const df = this, pending = df._pending || loadPending(df);\n    pending.requests += 1;\n    const res = await df.request(url, format2);\n    df.pulse(target2, df.changeset().remove(truthy).insert(res.data || []));\n    pending.done();\n    return res;\n  }\n  function loadPending(df) {\n    let accept;\n    const pending = new Promise((a2) => accept = a2);\n    pending.requests = 0;\n    pending.done = () => {\n      if (--pending.requests === 0) {\n        df._pending = null;\n        accept(df);\n      }\n    };\n    return df._pending = pending;\n  }\n  const SKIP$2 = {\n    skip: true\n  };\n  function on(source2, target2, update2, params2, options2) {\n    const fn2 = source2 instanceof Operator ? onOperator : onStream;\n    fn2(this, source2, target2, update2, params2, options2);\n    return this;\n  }\n  function onStream(df, stream2, target2, update2, params2, options2) {\n    const opt = extend({}, options2, SKIP$2);\n    let func, op;\n    if (!isFunction(target2)) target2 = constant$4(target2);\n    if (update2 === void 0) {\n      func = (e) => df.touch(target2(e));\n    } else if (isFunction(update2)) {\n      op = new Operator(null, update2, params2, false);\n      func = (e) => {\n        op.evaluate(e);\n        const t = target2(e), v = op.value;\n        isChangeSet(v) ? df.pulse(t, v, options2) : df.update(t, v, opt);\n      };\n    } else {\n      func = (e) => df.update(target2(e), update2, opt);\n    }\n    stream2.apply(func);\n  }\n  function onOperator(df, source2, target2, update2, params2, options2) {\n    if (update2 === void 0) {\n      source2.targets().add(target2);\n    } else {\n      const opt = options2 || {}, op = new Operator(null, updater(target2, update2), params2, false);\n      op.modified(opt.force);\n      op.rank = source2.rank;\n      source2.targets().add(op);\n      if (target2) {\n        op.skip(true);\n        op.value = target2.value;\n        op.targets().add(target2);\n        df.connect(target2, [op]);\n      }\n    }\n  }\n  function updater(target2, update2) {\n    update2 = isFunction(update2) ? update2 : constant$4(update2);\n    return target2 ? function(_, pulse2) {\n      const value2 = update2(_, pulse2);\n      if (!target2.skip()) {\n        target2.skip(value2 !== this.value).value = value2;\n      }\n      return value2;\n    } : update2;\n  }\n  function rank(op) {\n    op.rank = ++this._rank;\n  }\n  function rerank(op) {\n    const queue = [op];\n    let cur, list, i;\n    while (queue.length) {\n      this.rank(cur = queue.pop());\n      if (list = cur._targets) {\n        for (i = list.length; --i >= 0; ) {\n          queue.push(cur = list[i]);\n          if (cur === op) error(\"Cycle detected in dataflow graph.\");\n        }\n      }\n    }\n  }\n  const StopPropagation = {};\n  const ADD = 1 << 0, REM = 1 << 1, MOD$1 = 1 << 2, ADD_REM = ADD | REM, ADD_MOD = ADD | MOD$1, ALL = ADD | REM | MOD$1, REFLOW = 1 << 3, SOURCE = 1 << 4, NO_SOURCE = 1 << 5, NO_FIELDS = 1 << 6;\n  function Pulse(dataflow, stamp, encode2) {\n    this.dataflow = dataflow;\n    this.stamp = stamp == null ? -1 : stamp;\n    this.add = [];\n    this.rem = [];\n    this.mod = [];\n    this.fields = null;\n    this.encode = encode2 || null;\n  }\n  function materialize(data2, filter2) {\n    const out = [];\n    visitArray(data2, filter2, (_) => out.push(_));\n    return out;\n  }\n  function filter$1(pulse2, flags) {\n    const map2 = {};\n    pulse2.visit(flags, (t) => {\n      map2[tupleid(t)] = 1;\n    });\n    return (t) => map2[tupleid(t)] ? null : t;\n  }\n  function addFilter(a2, b2) {\n    return a2 ? (t, i) => a2(t, i) && b2(t, i) : b2;\n  }\n  Pulse.prototype = {\n    /**\n     * Sentinel value indicating pulse propagation should stop.\n     */\n    StopPropagation,\n    /**\n     * Boolean flag indicating ADD (added) tuples.\n     */\n    ADD,\n    /**\n     * Boolean flag indicating REM (removed) tuples.\n     */\n    REM,\n    /**\n     * Boolean flag indicating MOD (modified) tuples.\n     */\n    MOD: MOD$1,\n    /**\n     * Boolean flag indicating ADD (added) and REM (removed) tuples.\n     */\n    ADD_REM,\n    /**\n     * Boolean flag indicating ADD (added) and MOD (modified) tuples.\n     */\n    ADD_MOD,\n    /**\n     * Boolean flag indicating ADD, REM and MOD tuples.\n     */\n    ALL,\n    /**\n     * Boolean flag indicating all tuples in a data source\n     * except for the ADD, REM and MOD tuples.\n     */\n    REFLOW,\n    /**\n     * Boolean flag indicating a 'pass-through' to a\n     * backing data source, ignoring ADD, REM and MOD tuples.\n     */\n    SOURCE,\n    /**\n     * Boolean flag indicating that source data should be\n     * suppressed when creating a forked pulse.\n     */\n    NO_SOURCE,\n    /**\n     * Boolean flag indicating that field modifications should be\n     * suppressed when creating a forked pulse.\n     */\n    NO_FIELDS,\n    /**\n     * Creates a new pulse based on the values of this pulse.\n     * The dataflow, time stamp and field modification values are copied over.\n     * By default, new empty ADD, REM and MOD arrays are created.\n     * @param {number} flags - Integer of boolean flags indicating which (if any)\n     *   tuple arrays should be copied to the new pulse. The supported flag values\n     *   are ADD, REM and MOD. Array references are copied directly: new array\n     *   instances are not created.\n     * @return {Pulse} - The forked pulse instance.\n     * @see init\n     */\n    fork(flags) {\n      return new Pulse(this.dataflow).init(this, flags);\n    },\n    /**\n     * Creates a copy of this pulse with new materialized array\n     * instances for the ADD, REM, MOD, and SOURCE arrays.\n     * The dataflow, time stamp and field modification values are copied over.\n     * @return {Pulse} - The cloned pulse instance.\n     * @see init\n     */\n    clone() {\n      const p = this.fork(ALL);\n      p.add = p.add.slice();\n      p.rem = p.rem.slice();\n      p.mod = p.mod.slice();\n      if (p.source) p.source = p.source.slice();\n      return p.materialize(ALL | SOURCE);\n    },\n    /**\n     * Returns a pulse that adds all tuples from a backing source. This is\n     * useful for cases where operators are added to a dataflow after an\n     * upstream data pipeline has already been processed, ensuring that\n     * new operators can observe all tuples within a stream.\n     * @return {Pulse} - A pulse instance with all source tuples included\n     *   in the add array. If the current pulse already has all source\n     *   tuples in its add array, it is returned directly. If the current\n     *   pulse does not have a backing source, it is returned directly.\n     */\n    addAll() {\n      let p = this;\n      const reuse = !p.source || p.add === p.rem || !p.rem.length && p.source.length === p.add.length;\n      if (reuse) {\n        return p;\n      } else {\n        p = new Pulse(this.dataflow).init(this);\n        p.add = p.source;\n        p.rem = [];\n        return p;\n      }\n    },\n    /**\n     * Initialize this pulse based on the values of another pulse. This method\n     * is used internally by {@link fork} to initialize a new forked tuple.\n     * The dataflow, time stamp and field modification values are copied over.\n     * By default, new empty ADD, REM and MOD arrays are created.\n     * @param {Pulse} src - The source pulse to copy from.\n     * @param {number} flags - Integer of boolean flags indicating which (if any)\n     *   tuple arrays should be copied to the new pulse. The supported flag values\n     *   are ADD, REM and MOD. Array references are copied directly: new array\n     *   instances are not created. By default, source data arrays are copied\n     *   to the new pulse. Use the NO_SOURCE flag to enforce a null source.\n     * @return {Pulse} - Returns this Pulse instance.\n     */\n    init(src, flags) {\n      const p = this;\n      p.stamp = src.stamp;\n      p.encode = src.encode;\n      if (src.fields && !(flags & NO_FIELDS)) {\n        p.fields = src.fields;\n      }\n      if (flags & ADD) {\n        p.addF = src.addF;\n        p.add = src.add;\n      } else {\n        p.addF = null;\n        p.add = [];\n      }\n      if (flags & REM) {\n        p.remF = src.remF;\n        p.rem = src.rem;\n      } else {\n        p.remF = null;\n        p.rem = [];\n      }\n      if (flags & MOD$1) {\n        p.modF = src.modF;\n        p.mod = src.mod;\n      } else {\n        p.modF = null;\n        p.mod = [];\n      }\n      if (flags & NO_SOURCE) {\n        p.srcF = null;\n        p.source = null;\n      } else {\n        p.srcF = src.srcF;\n        p.source = src.source;\n        if (src.cleans) p.cleans = src.cleans;\n      }\n      return p;\n    },\n    /**\n     * Schedules a function to run after pulse propagation completes.\n     * @param {function} func - The function to run.\n     */\n    runAfter(func) {\n      this.dataflow.runAfter(func);\n    },\n    /**\n     * Indicates if tuples have been added, removed or modified.\n     * @param {number} [flags] - The tuple types (ADD, REM or MOD) to query.\n     *   Defaults to ALL, returning true if any tuple type has changed.\n     * @return {boolean} - Returns true if one or more queried tuple types have\n     *   changed, false otherwise.\n     */\n    changed(flags) {\n      const f = flags || ALL;\n      return f & ADD && this.add.length || f & REM && this.rem.length || f & MOD$1 && this.mod.length;\n    },\n    /**\n     * Forces a \"reflow\" of tuple values, such that all tuples in the backing\n     * source are added to the MOD set, unless already present in the ADD set.\n     * @param {boolean} [fork=false] - If true, returns a forked copy of this\n     *   pulse, and invokes reflow on that derived pulse.\n     * @return {Pulse} - The reflowed pulse instance.\n     */\n    reflow(fork) {\n      if (fork) return this.fork(ALL).reflow();\n      const len2 = this.add.length, src = this.source && this.source.length;\n      if (src && src !== len2) {\n        this.mod = this.source;\n        if (len2) this.filter(MOD$1, filter$1(this, ADD));\n      }\n      return this;\n    },\n    /**\n     * Get/set metadata to pulse requesting garbage collection\n     * to reclaim currently unused resources.\n     */\n    clean(value2) {\n      if (arguments.length) {\n        this.cleans = !!value2;\n        return this;\n      } else {\n        return this.cleans;\n      }\n    },\n    /**\n     * Marks one or more data field names as modified to assist dependency\n     * tracking and incremental processing by transform operators.\n     * @param {string|Array<string>} _ - The field(s) to mark as modified.\n     * @return {Pulse} - This pulse instance.\n     */\n    modifies(_) {\n      const hash = this.fields || (this.fields = {});\n      if (isArray(_)) {\n        _.forEach((f) => hash[f] = true);\n      } else {\n        hash[_] = true;\n      }\n      return this;\n    },\n    /**\n     * Checks if one or more data fields have been modified during this pulse\n     * propagation timestamp.\n     * @param {string|Array<string>} _ - The field(s) to check for modified.\n     * @param {boolean} nomod - If true, will check the modified flag even if\n     *   no mod tuples exist. If false (default), mod tuples must be present.\n     * @return {boolean} - Returns true if any of the provided fields has been\n     *   marked as modified, false otherwise.\n     */\n    modified(_, nomod) {\n      const fields = this.fields;\n      return !((nomod || this.mod.length) && fields) ? false : !arguments.length ? !!fields : isArray(_) ? _.some((f) => fields[f]) : fields[_];\n    },\n    /**\n     * Adds a filter function to one more tuple sets. Filters are applied to\n     * backing tuple arrays, to determine the actual set of tuples considered\n     * added, removed or modified. They can be used to delay materialization of\n     * a tuple set in order to avoid expensive array copies. In addition, the\n     * filter functions can serve as value transformers: unlike standard predicate\n     * function (which return boolean values), Pulse filters should return the\n     * actual tuple value to process. If a tuple set is already filtered, the\n     * new filter function will be appended into a conjuntive ('and') query.\n     * @param {number} flags - Flags indicating the tuple set(s) to filter.\n     * @param {function(*):object} filter - Filter function that will be applied\n     *   to the tuple set array, and should return a data tuple if the value\n     *   should be included in the tuple set, and falsy (or null) otherwise.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    filter(flags, filter2) {\n      const p = this;\n      if (flags & ADD) p.addF = addFilter(p.addF, filter2);\n      if (flags & REM) p.remF = addFilter(p.remF, filter2);\n      if (flags & MOD$1) p.modF = addFilter(p.modF, filter2);\n      if (flags & SOURCE) p.srcF = addFilter(p.srcF, filter2);\n      return p;\n    },\n    /**\n     * Materialize one or more tuple sets in this pulse. If the tuple set(s) have\n     * a registered filter function, it will be applied and the tuple set(s) will\n     * be replaced with materialized tuple arrays.\n     * @param {number} flags - Flags indicating the tuple set(s) to materialize.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    materialize(flags) {\n      flags = flags || ALL;\n      const p = this;\n      if (flags & ADD && p.addF) {\n        p.add = materialize(p.add, p.addF);\n        p.addF = null;\n      }\n      if (flags & REM && p.remF) {\n        p.rem = materialize(p.rem, p.remF);\n        p.remF = null;\n      }\n      if (flags & MOD$1 && p.modF) {\n        p.mod = materialize(p.mod, p.modF);\n        p.modF = null;\n      }\n      if (flags & SOURCE && p.srcF) {\n        p.source = p.source.filter(p.srcF);\n        p.srcF = null;\n      }\n      return p;\n    },\n    /**\n     * Visit one or more tuple sets in this pulse.\n     * @param {number} flags - Flags indicating the tuple set(s) to visit.\n     *   Legal values are ADD, REM, MOD and SOURCE (if a backing data source\n     *   has been set).\n     * @param {function(object):*} - Visitor function invoked per-tuple.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    visit(flags, visitor) {\n      const p = this, v = visitor;\n      if (flags & SOURCE) {\n        visitArray(p.source, p.srcF, v);\n        return p;\n      }\n      if (flags & ADD) visitArray(p.add, p.addF, v);\n      if (flags & REM) visitArray(p.rem, p.remF, v);\n      if (flags & MOD$1) visitArray(p.mod, p.modF, v);\n      const src = p.source;\n      if (flags & REFLOW && src) {\n        const sum2 = p.add.length + p.mod.length;\n        if (sum2 === src.length) ;\n        else if (sum2) {\n          visitArray(src, filter$1(p, ADD_MOD), v);\n        } else {\n          visitArray(src, p.srcF, v);\n        }\n      }\n      return p;\n    }\n  };\n  function MultiPulse(dataflow, stamp, pulses, encode2) {\n    const p = this;\n    let c2 = 0;\n    this.dataflow = dataflow;\n    this.stamp = stamp;\n    this.fields = null;\n    this.encode = encode2 || null;\n    this.pulses = pulses;\n    for (const pulse2 of pulses) {\n      if (pulse2.stamp !== stamp) continue;\n      if (pulse2.fields) {\n        const hash = p.fields || (p.fields = {});\n        for (const f in pulse2.fields) {\n          hash[f] = 1;\n        }\n      }\n      if (pulse2.changed(p.ADD)) c2 |= p.ADD;\n      if (pulse2.changed(p.REM)) c2 |= p.REM;\n      if (pulse2.changed(p.MOD)) c2 |= p.MOD;\n    }\n    this.changes = c2;\n  }\n  inherits(MultiPulse, Pulse, {\n    /**\n     * Creates a new pulse based on the values of this pulse.\n     * The dataflow, time stamp and field modification values are copied over.\n     * @return {Pulse}\n     */\n    fork(flags) {\n      const p = new Pulse(this.dataflow).init(this, flags & this.NO_FIELDS);\n      if (flags !== void 0) {\n        if (flags & p.ADD) this.visit(p.ADD, (t) => p.add.push(t));\n        if (flags & p.REM) this.visit(p.REM, (t) => p.rem.push(t));\n        if (flags & p.MOD) this.visit(p.MOD, (t) => p.mod.push(t));\n      }\n      return p;\n    },\n    changed(flags) {\n      return this.changes & flags;\n    },\n    modified(_) {\n      const p = this, fields = p.fields;\n      return !(fields && p.changes & p.MOD) ? 0 : isArray(_) ? _.some((f) => fields[f]) : fields[_];\n    },\n    filter() {\n      error(\"MultiPulse does not support filtering.\");\n    },\n    materialize() {\n      error(\"MultiPulse does not support materialization.\");\n    },\n    visit(flags, visitor) {\n      const p = this, pulses = p.pulses, n = pulses.length;\n      let i = 0;\n      if (flags & p.SOURCE) {\n        for (; i < n; ++i) {\n          pulses[i].visit(flags, visitor);\n        }\n      } else {\n        for (; i < n; ++i) {\n          if (pulses[i].stamp === p.stamp) {\n            pulses[i].visit(flags, visitor);\n          }\n        }\n      }\n      return p;\n    }\n  });\n  async function evaluate(encode2, prerun, postrun) {\n    const df = this, async = [];\n    if (df._pulse) return reentrant(df);\n    if (df._pending) await df._pending;\n    if (prerun) await asyncCallback(df, prerun);\n    if (!df._touched.length) {\n      df.debug(\"Dataflow invoked, but nothing to do.\");\n      return df;\n    }\n    const stamp = ++df._clock;\n    df._pulse = new Pulse(df, stamp, encode2);\n    df._touched.forEach((op2) => df._enqueue(op2, true));\n    df._touched = UniqueList(id);\n    let count2 = 0, op, next, error2;\n    try {\n      while (df._heap.size() > 0) {\n        op = df._heap.pop();\n        if (op.rank !== op.qrank) {\n          df._enqueue(op, true);\n          continue;\n        }\n        next = op.run(df._getPulse(op, encode2));\n        if (next.then) {\n          next = await next;\n        } else if (next.async) {\n          async.push(next.async);\n          next = StopPropagation;\n        }\n        if (next !== StopPropagation) {\n          if (op._targets) op._targets.forEach((op2) => df._enqueue(op2));\n        }\n        ++count2;\n      }\n    } catch (err) {\n      df._heap.clear();\n      error2 = err;\n    }\n    df._input = {};\n    df._pulse = null;\n    df.debug(`Pulse ${stamp}: ${count2} operators`);\n    if (error2) {\n      df._postrun = [];\n      df.error(error2);\n    }\n    if (df._postrun.length) {\n      const pr = df._postrun.sort((a2, b2) => b2.priority - a2.priority);\n      df._postrun = [];\n      for (let i = 0; i < pr.length; ++i) {\n        await asyncCallback(df, pr[i].callback);\n      }\n    }\n    if (postrun) await asyncCallback(df, postrun);\n    if (async.length) {\n      Promise.all(async).then((cb) => df.runAsync(null, () => {\n        cb.forEach((f) => {\n          try {\n            f(df);\n          } catch (err) {\n            df.error(err);\n          }\n        });\n      }));\n    }\n    return df;\n  }\n  async function runAsync(encode2, prerun, postrun) {\n    while (this._running) await this._running;\n    const clear = () => this._running = null;\n    (this._running = this.evaluate(encode2, prerun, postrun)).then(clear, clear);\n    return this._running;\n  }\n  function run(encode2, prerun, postrun) {\n    return this._pulse ? reentrant(this) : (this.evaluate(encode2, prerun, postrun), this);\n  }\n  function runAfter(callback, enqueue2, priority) {\n    if (this._pulse || enqueue2) {\n      this._postrun.push({\n        priority: priority || 0,\n        callback\n      });\n    } else {\n      try {\n        callback(this);\n      } catch (err) {\n        this.error(err);\n      }\n    }\n  }\n  function reentrant(df) {\n    df.error(\"Dataflow already running. Use runAsync() to chain invocations.\");\n    return df;\n  }\n  function enqueue(op, force2) {\n    const q = op.stamp < this._clock;\n    if (q) op.stamp = this._clock;\n    if (q || force2) {\n      op.qrank = op.rank;\n      this._heap.push(op);\n    }\n  }\n  function getPulse(op, encode2) {\n    const s2 = op.source, stamp = this._clock;\n    return s2 && isArray(s2) ? new MultiPulse(this, stamp, s2.map((_) => _.pulse), encode2) : this._input[op.id] || singlePulse(this._pulse, s2 && s2.pulse);\n  }\n  function singlePulse(p, s2) {\n    if (s2 && s2.stamp === p.stamp) {\n      return s2;\n    }\n    p = p.fork();\n    if (s2 && s2 !== StopPropagation) {\n      p.source = s2.source;\n    }\n    return p;\n  }\n  const NO_OPT = {\n    skip: false,\n    force: false\n  };\n  function touch(op, options2) {\n    const opt = options2 || NO_OPT;\n    if (this._pulse) {\n      this._enqueue(op);\n    } else {\n      this._touched.add(op);\n    }\n    if (opt.skip) op.skip(true);\n    return this;\n  }\n  function update$6(op, value2, options2) {\n    const opt = options2 || NO_OPT;\n    if (op.set(value2) || opt.force) {\n      this.touch(op, opt);\n    }\n    return this;\n  }\n  function pulse(op, changeset2, options2) {\n    this.touch(op, options2 || NO_OPT);\n    const p = new Pulse(this, this._clock + (this._pulse ? 0 : 1)), t = op.pulse && op.pulse.source || [];\n    p.target = op;\n    this._input[op.id] = changeset2.pulse(p, t);\n    return this;\n  }\n  function Heap(cmp) {\n    let nodes = [];\n    return {\n      clear: () => nodes = [],\n      size: () => nodes.length,\n      peek: () => nodes[0],\n      push: (x2) => {\n        nodes.push(x2);\n        return siftdown(nodes, 0, nodes.length - 1, cmp);\n      },\n      pop: () => {\n        const last = nodes.pop();\n        let item;\n        if (nodes.length) {\n          item = nodes[0];\n          nodes[0] = last;\n          siftup(nodes, 0, cmp);\n        } else {\n          item = last;\n        }\n        return item;\n      }\n    };\n  }\n  function siftdown(array2, start, idx, cmp) {\n    let parent, pidx;\n    const item = array2[idx];\n    while (idx > start) {\n      pidx = idx - 1 >> 1;\n      parent = array2[pidx];\n      if (cmp(item, parent) < 0) {\n        array2[idx] = parent;\n        idx = pidx;\n        continue;\n      }\n      break;\n    }\n    return array2[idx] = item;\n  }\n  function siftup(array2, idx, cmp) {\n    const start = idx, end = array2.length, item = array2[idx];\n    let cidx = (idx << 1) + 1, ridx;\n    while (cidx < end) {\n      ridx = cidx + 1;\n      if (ridx < end && cmp(array2[cidx], array2[ridx]) >= 0) {\n        cidx = ridx;\n      }\n      array2[idx] = array2[cidx];\n      idx = cidx;\n      cidx = (idx << 1) + 1;\n    }\n    array2[idx] = item;\n    return siftdown(array2, start, idx, cmp);\n  }\n  function Dataflow() {\n    this.logger(logger());\n    this.logLevel(Error$1);\n    this._clock = 0;\n    this._rank = 0;\n    this._locale = defaultLocale();\n    try {\n      this._loader = loader();\n    } catch (e) {\n    }\n    this._touched = UniqueList(id);\n    this._input = {};\n    this._pulse = null;\n    this._heap = Heap((a2, b2) => a2.qrank - b2.qrank);\n    this._postrun = [];\n  }\n  function logMethod(method2) {\n    return function() {\n      return this._log[method2].apply(this, arguments);\n    };\n  }\n  Dataflow.prototype = {\n    /**\n     * The current timestamp of this dataflow. This value reflects the\n     * timestamp of the previous dataflow run. The dataflow is initialized\n     * with a stamp value of 0. The initial run of the dataflow will have\n     * a timestap of 1, and so on. This value will match the\n     * {@link Pulse.stamp} property.\n     * @return {number} - The current timestamp value.\n     */\n    stamp() {\n      return this._clock;\n    },\n    /**\n     * Gets or sets the loader instance to use for data file loading. A\n     * loader object must provide a \"load\" method for loading files and a\n     * \"sanitize\" method for checking URL/filename validity. Both methods\n     * should accept a URI and options hash as arguments, and return a Promise\n     * that resolves to the loaded file contents (load) or a hash containing\n     * sanitized URI data with the sanitized url assigned to the \"href\" property\n     * (sanitize).\n     * @param {object} _ - The loader instance to use.\n     * @return {object|Dataflow} - If no arguments are provided, returns\n     *   the current loader instance. Otherwise returns this Dataflow instance.\n     */\n    loader(_) {\n      if (arguments.length) {\n        this._loader = _;\n        return this;\n      } else {\n        return this._loader;\n      }\n    },\n    /**\n     * Gets or sets the locale instance to use for formatting and parsing\n     * string values. The locale object should be provided by the\n     * vega-format library, and include methods such as format, timeFormat,\n     * utcFormat, timeParse, and utcParse.\n     * @param {object} _ - The locale instance to use.\n     * @return {object|Dataflow} - If no arguments are provided, returns\n     *   the current locale instance. Otherwise returns this Dataflow instance.\n     */\n    locale(_) {\n      if (arguments.length) {\n        this._locale = _;\n        return this;\n      } else {\n        return this._locale;\n      }\n    },\n    /**\n     * Get or set the logger instance used to log messages. If no arguments are\n     * provided, returns the current logger instance. Otherwise, sets the logger\n     * and return this Dataflow instance. Provided loggers must support the full\n     * API of logger objects generated by the vega-util logger method. Note that\n     * by default the log level of the new logger will be used; use the logLevel\n     * method to adjust the log level as needed.\n     */\n    logger(logger2) {\n      if (arguments.length) {\n        this._log = logger2;\n        return this;\n      } else {\n        return this._log;\n      }\n    },\n    /**\n     * Logs an error message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit error messages.\n     */\n    error: logMethod(\"error\"),\n    /**\n     * Logs a warning message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit warning messages.\n     */\n    warn: logMethod(\"warn\"),\n    /**\n     * Logs a information message. By default, logged messages are written to\n     * console output. The message will only be logged if the current log level is\n     * high enough to permit information messages.\n     */\n    info: logMethod(\"info\"),\n    /**\n     * Logs a debug message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit debug messages.\n     */\n    debug: logMethod(\"debug\"),\n    /**\n     * Get or set the current log level. If an argument is provided, it\n     * will be used as the new log level.\n     * @param {number} [level] - Should be one of None, Warn, Info\n     * @return {number} - The current log level.\n     */\n    logLevel: logMethod(\"level\"),\n    /**\n     * Empty entry threshold for garbage cleaning. Map data structures will\n     * perform cleaning once the number of empty entries exceeds this value.\n     */\n    cleanThreshold: 1e4,\n    // OPERATOR REGISTRATION\n    add: add$3,\n    connect,\n    rank,\n    rerank,\n    // OPERATOR UPDATES\n    pulse,\n    touch,\n    update: update$6,\n    changeset,\n    // DATA LOADING\n    ingest,\n    parse: parse$5,\n    preload,\n    request,\n    // EVENT HANDLING\n    events: events$1,\n    on,\n    // PULSE PROPAGATION\n    evaluate,\n    run,\n    runAsync,\n    runAfter,\n    _enqueue: enqueue,\n    _getPulse: getPulse\n  };\n  function Transform(init2, params2) {\n    Operator.call(this, init2, null, params2);\n  }\n  inherits(Transform, Operator, {\n    /**\n     * Overrides {@link Operator.evaluate} for transform operators.\n     * Internally, this method calls {@link evaluate} to perform processing.\n     * If {@link evaluate} returns a falsy value, the input pulse is returned.\n     * This method should NOT be overridden, instead overrride {@link evaluate}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return the output pulse for this operator (or StopPropagation)\n     */\n    run(pulse2) {\n      if (pulse2.stamp < this.stamp) return pulse2.StopPropagation;\n      let rv;\n      if (this.skip()) {\n        this.skip(false);\n      } else {\n        rv = this.evaluate(pulse2);\n      }\n      rv = rv || pulse2;\n      if (rv.then) {\n        rv = rv.then((_) => this.pulse = _);\n      } else if (rv !== pulse2.StopPropagation) {\n        this.pulse = rv;\n      }\n      return rv;\n    },\n    /**\n     * Overrides {@link Operator.evaluate} for transform operators.\n     * Marshalls parameter values and then invokes {@link transform}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n         value (including undefined) will let the input pulse pass through.\n    */\n    evaluate(pulse2) {\n      const params2 = this.marshall(pulse2.stamp), out = this.transform(params2, pulse2);\n      params2.clear();\n      return out;\n    },\n    /**\n     * Process incoming pulses.\n     * Subclasses should override this method to implement transforms.\n     * @param {Parameters} _ - The operator parameter values.\n     * @param {Pulse} pulse - The current dataflow pulse.\n     * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n     *   value (including undefined) will let the input pulse pass through.\n     */\n    transform() {\n    }\n  });\n  const transforms = {};\n  function definition$1(type2) {\n    const t = transform$2(type2);\n    return t && t.Definition || null;\n  }\n  function transform$2(type2) {\n    type2 = type2 && type2.toLowerCase();\n    return has$1(transforms, type2) ? transforms[type2] : null;\n  }\n  function* numbers$1(values2, valueof) {\n    if (valueof == null) {\n      for (let value2 of values2) {\n        if (value2 != null && value2 !== \"\" && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        value2 = valueof(value2, ++index2, values2);\n        if (value2 != null && value2 !== \"\" && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    }\n  }\n  function quantiles(array2, p, f) {\n    const values2 = Float64Array.from(numbers$1(array2, f));\n    values2.sort(ascending$2);\n    return p.map((_) => quantileSorted(values2, _));\n  }\n  function quartiles(array2, f) {\n    return quantiles(array2, [0.25, 0.5, 0.75], f);\n  }\n  function estimateBandwidth(array2, f) {\n    const n = array2.length, d2 = deviation(array2, f), q = quartiles(array2, f), h2 = (q[2] - q[0]) / 1.34, v = Math.min(d2, h2) || d2 || Math.abs(q[0]) || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n  }\n  function bin(_) {\n    const maxb = _.maxbins || 20, base2 = _.base || 10, logb = Math.log(base2), div = _.divide || [5, 2];\n    let min2 = _.extent[0], max2 = _.extent[1], step, level, minstep, v, i, n;\n    const span2 = _.span || max2 - min2 || Math.abs(min2) || 1;\n    if (_.step) {\n      step = _.step;\n    } else if (_.steps) {\n      v = span2 / maxb;\n      for (i = 0, n = _.steps.length; i < n && _.steps[i] < v; ++i) ;\n      step = _.steps[Math.max(0, i - 1)];\n    } else {\n      level = Math.ceil(Math.log(maxb) / logb);\n      minstep = _.minstep || 0;\n      step = Math.max(minstep, Math.pow(base2, Math.round(Math.log(span2) / logb) - level));\n      while (Math.ceil(span2 / step) > maxb) {\n        step *= base2;\n      }\n      for (i = 0, n = div.length; i < n; ++i) {\n        v = step / div[i];\n        if (v >= minstep && span2 / v <= maxb) step = v;\n      }\n    }\n    v = Math.log(step);\n    const precision = v >= 0 ? 0 : ~~(-v / logb) + 1, eps = Math.pow(base2, -precision - 1);\n    if (_.nice || _.nice === void 0) {\n      v = Math.floor(min2 / step + eps) * step;\n      min2 = min2 < v ? v - step : v;\n      max2 = Math.ceil(max2 / step) * step;\n    }\n    return {\n      start: min2,\n      stop: max2 === min2 ? min2 + step : max2,\n      step\n    };\n  }\n  var random = Math.random;\n  function setRandom(r) {\n    random = r;\n  }\n  function bootstrapCI(array2, samples, alpha, f) {\n    if (!array2.length) return [void 0, void 0];\n    const values2 = Float64Array.from(numbers$1(array2, f)), n = values2.length, m2 = samples;\n    let a2, i, j, mu;\n    for (j = 0, mu = Array(m2); j < m2; ++j) {\n      for (a2 = 0, i = 0; i < n; ++i) {\n        a2 += values2[~~(random() * n)];\n      }\n      mu[j] = a2 / n;\n    }\n    mu.sort(ascending$2);\n    return [quantile$1(mu, alpha / 2), quantile$1(mu, 1 - alpha / 2)];\n  }\n  function dotbin(array2, step, smooth, f) {\n    f = f || ((_) => _);\n    const n = array2.length, v = new Float64Array(n);\n    let i = 0, j = 1, a2 = f(array2[0]), b2 = a2, w2 = a2 + step, x2;\n    for (; j < n; ++j) {\n      x2 = f(array2[j]);\n      if (x2 >= w2) {\n        b2 = (a2 + b2) / 2;\n        for (; i < j; ++i) v[i] = b2;\n        w2 = x2 + step;\n        a2 = x2;\n      }\n      b2 = x2;\n    }\n    b2 = (a2 + b2) / 2;\n    for (; i < j; ++i) v[i] = b2;\n    return smooth ? smoothing(v, step + step / 4) : v;\n  }\n  function smoothing(v, thresh) {\n    const n = v.length;\n    let a2 = 0, b2 = 1, c2, d2;\n    while (v[a2] === v[b2]) ++b2;\n    while (b2 < n) {\n      c2 = b2 + 1;\n      while (v[b2] === v[c2]) ++c2;\n      if (v[b2] - v[b2 - 1] < thresh) {\n        d2 = b2 + (a2 + c2 - b2 - b2 >> 1);\n        while (d2 < b2) v[d2++] = v[b2];\n        while (d2 > b2) v[d2--] = v[a2];\n      }\n      a2 = b2;\n      b2 = c2;\n    }\n    return v;\n  }\n  function lcg$2(seed) {\n    return function() {\n      seed = (1103515245 * seed + 12345) % 2147483647;\n      return seed / 2147483647;\n    };\n  }\n  function integer(min2, max2) {\n    if (max2 == null) {\n      max2 = min2;\n      min2 = 0;\n    }\n    let a2, b2, d2;\n    const dist2 = {\n      min(_) {\n        if (arguments.length) {\n          a2 = _ || 0;\n          d2 = b2 - a2;\n          return dist2;\n        } else {\n          return a2;\n        }\n      },\n      max(_) {\n        if (arguments.length) {\n          b2 = _ || 0;\n          d2 = b2 - a2;\n          return dist2;\n        } else {\n          return b2;\n        }\n      },\n      sample() {\n        return a2 + Math.floor(d2 * random());\n      },\n      pdf(x2) {\n        return x2 === Math.floor(x2) && x2 >= a2 && x2 < b2 ? 1 / d2 : 0;\n      },\n      cdf(x2) {\n        const v = Math.floor(x2);\n        return v < a2 ? 0 : v >= b2 ? 1 : (v - a2 + 1) / d2;\n      },\n      icdf(p) {\n        return p >= 0 && p <= 1 ? a2 - 1 + Math.floor(p * d2) : NaN;\n      }\n    };\n    return dist2.min(min2).max(max2);\n  }\n  const SQRT2PI = Math.sqrt(2 * Math.PI);\n  const SQRT2 = Math.SQRT2;\n  let nextSample = NaN;\n  function sampleNormal(mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    let x2 = 0, y2 = 0, rds, c2;\n    if (nextSample === nextSample) {\n      x2 = nextSample;\n      nextSample = NaN;\n    } else {\n      do {\n        x2 = random() * 2 - 1;\n        y2 = random() * 2 - 1;\n        rds = x2 * x2 + y2 * y2;\n      } while (rds === 0 || rds > 1);\n      c2 = Math.sqrt(-2 * Math.log(rds) / rds);\n      x2 *= c2;\n      nextSample = y2 * c2;\n    }\n    return mean2 + x2 * stdev;\n  }\n  function densityNormal(value2, mean2, stdev) {\n    stdev = stdev == null ? 1 : stdev;\n    const z2 = (value2 - (mean2 || 0)) / stdev;\n    return Math.exp(-0.5 * z2 * z2) / (stdev * SQRT2PI);\n  }\n  function cumulativeNormal(value2, mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z2 = (value2 - mean2) / stdev, Z3 = Math.abs(z2);\n    let cd;\n    if (Z3 > 37) {\n      cd = 0;\n    } else {\n      const exp2 = Math.exp(-Z3 * Z3 / 2);\n      let sum2;\n      if (Z3 < 7.07106781186547) {\n        sum2 = 0.0352624965998911 * Z3 + 0.700383064443688;\n        sum2 = sum2 * Z3 + 6.37396220353165;\n        sum2 = sum2 * Z3 + 33.912866078383;\n        sum2 = sum2 * Z3 + 112.079291497871;\n        sum2 = sum2 * Z3 + 221.213596169931;\n        sum2 = sum2 * Z3 + 220.206867912376;\n        cd = exp2 * sum2;\n        sum2 = 0.0883883476483184 * Z3 + 1.75566716318264;\n        sum2 = sum2 * Z3 + 16.064177579207;\n        sum2 = sum2 * Z3 + 86.7807322029461;\n        sum2 = sum2 * Z3 + 296.564248779674;\n        sum2 = sum2 * Z3 + 637.333633378831;\n        sum2 = sum2 * Z3 + 793.826512519948;\n        sum2 = sum2 * Z3 + 440.413735824752;\n        cd = cd / sum2;\n      } else {\n        sum2 = Z3 + 0.65;\n        sum2 = Z3 + 4 / sum2;\n        sum2 = Z3 + 3 / sum2;\n        sum2 = Z3 + 2 / sum2;\n        sum2 = Z3 + 1 / sum2;\n        cd = exp2 / sum2 / 2.506628274631;\n      }\n    }\n    return z2 > 0 ? 1 - cd : cd;\n  }\n  function quantileNormal(p, mean2, stdev) {\n    if (p < 0 || p > 1) return NaN;\n    return (mean2 || 0) + (stdev == null ? 1 : stdev) * SQRT2 * erfinv(2 * p - 1);\n  }\n  function erfinv(x2) {\n    let w2 = -Math.log((1 - x2) * (1 + x2)), p;\n    if (w2 < 6.25) {\n      w2 -= 3.125;\n      p = -364441206401782e-35;\n      p = -16850591381820166e-35 + p * w2;\n      p = 128584807152564e-32 + p * w2;\n      p = 11157877678025181e-33 + p * w2;\n      p = -1333171662854621e-31 + p * w2;\n      p = 20972767875968562e-33 + p * w2;\n      p = 6637638134358324e-30 + p * w2;\n      p = -4054566272975207e-29 + p * w2;\n      p = -8151934197605472e-29 + p * w2;\n      p = 26335093153082323e-28 + p * w2;\n      p = -12975133253453532e-27 + p * w2;\n      p = -5415412054294628e-26 + p * w2;\n      p = 10512122733215323e-25 + p * w2;\n      p = -4112633980346984e-24 + p * w2;\n      p = -29070369957882005e-24 + p * w2;\n      p = 42347877827932404e-23 + p * w2;\n      p = -13654692000834679e-22 + p * w2;\n      p = -13882523362786469e-21 + p * w2;\n      p = 18673420803405714e-20 + p * w2;\n      p = -740702534166267e-18 + p * w2;\n      p = -0.006033670871430149 + p * w2;\n      p = 0.24015818242558962 + p * w2;\n      p = 1.6536545626831027 + p * w2;\n    } else if (w2 < 16) {\n      w2 = Math.sqrt(w2) - 3.25;\n      p = 22137376921775787e-25;\n      p = 9075656193888539e-23 + p * w2;\n      p = -27517406297064545e-23 + p * w2;\n      p = 18239629214389228e-24 + p * w2;\n      p = 15027403968909828e-22 + p * w2;\n      p = -4013867526981546e-21 + p * w2;\n      p = 29234449089955446e-22 + p * w2;\n      p = 12475304481671779e-21 + p * w2;\n      p = -47318229009055734e-21 + p * w2;\n      p = 6828485145957318e-20 + p * w2;\n      p = 24031110387097894e-21 + p * w2;\n      p = -3550375203628475e-19 + p * w2;\n      p = 9532893797373805e-19 + p * w2;\n      p = -0.0016882755560235047 + p * w2;\n      p = 0.002491442096107851 + p * w2;\n      p = -0.003751208507569241 + p * w2;\n      p = 0.005370914553590064 + p * w2;\n      p = 1.0052589676941592 + p * w2;\n      p = 3.0838856104922208 + p * w2;\n    } else if (Number.isFinite(w2)) {\n      w2 = Math.sqrt(w2) - 5;\n      p = -27109920616438573e-27;\n      p = -2555641816996525e-25 + p * w2;\n      p = 15076572693500548e-25 + p * w2;\n      p = -3789465440126737e-24 + p * w2;\n      p = 761570120807834e-23 + p * w2;\n      p = -1496002662714924e-23 + p * w2;\n      p = 2914795345090108e-23 + p * w2;\n      p = -6771199775845234e-23 + p * w2;\n      p = 22900482228026655e-23 + p * w2;\n      p = -99298272942317e-20 + p * w2;\n      p = 4526062597223154e-21 + p * w2;\n      p = -1968177810553167e-20 + p * w2;\n      p = 7599527703001776e-20 + p * w2;\n      p = -21503011930044477e-20 + p * w2;\n      p = -13871931833623122e-20 + p * w2;\n      p = 1.0103004648645344 + p * w2;\n      p = 4.849906401408584 + p * w2;\n    } else {\n      p = Infinity;\n    }\n    return p * x2;\n  }\n  function gaussian(mean2, stdev) {\n    let mu, sigma;\n    const dist2 = {\n      mean(_) {\n        if (arguments.length) {\n          mu = _ || 0;\n          return dist2;\n        } else {\n          return mu;\n        }\n      },\n      stdev(_) {\n        if (arguments.length) {\n          sigma = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return sigma;\n        }\n      },\n      sample: () => sampleNormal(mu, sigma),\n      pdf: (value2) => densityNormal(value2, mu, sigma),\n      cdf: (value2) => cumulativeNormal(value2, mu, sigma),\n      icdf: (p) => quantileNormal(p, mu, sigma)\n    };\n    return dist2.mean(mean2).stdev(stdev);\n  }\n  function kde(support, bandwidth2) {\n    const kernel = gaussian();\n    let n = 0;\n    const dist2 = {\n      data(_) {\n        if (arguments.length) {\n          support = _;\n          n = _ ? _.length : 0;\n          return dist2.bandwidth(bandwidth2);\n        } else {\n          return support;\n        }\n      },\n      bandwidth(_) {\n        if (!arguments.length) return bandwidth2;\n        bandwidth2 = _;\n        if (!bandwidth2 && support) bandwidth2 = estimateBandwidth(support);\n        return dist2;\n      },\n      sample() {\n        return support[~~(random() * n)] + bandwidth2 * kernel.sample();\n      },\n      pdf(x2) {\n        let y2 = 0, i = 0;\n        for (; i < n; ++i) {\n          y2 += kernel.pdf((x2 - support[i]) / bandwidth2);\n        }\n        return y2 / bandwidth2 / n;\n      },\n      cdf(x2) {\n        let y2 = 0, i = 0;\n        for (; i < n; ++i) {\n          y2 += kernel.cdf((x2 - support[i]) / bandwidth2);\n        }\n        return y2 / n;\n      },\n      icdf() {\n        throw Error(\"KDE icdf not supported.\");\n      }\n    };\n    return dist2.data(support);\n  }\n  function sampleLogNormal(mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    return Math.exp(mean2 + sampleNormal() * stdev);\n  }\n  function densityLogNormal(value2, mean2, stdev) {\n    if (value2 <= 0) return 0;\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z2 = (Math.log(value2) - mean2) / stdev;\n    return Math.exp(-0.5 * z2 * z2) / (stdev * SQRT2PI * value2);\n  }\n  function cumulativeLogNormal(value2, mean2, stdev) {\n    return cumulativeNormal(Math.log(value2), mean2, stdev);\n  }\n  function quantileLogNormal(p, mean2, stdev) {\n    return Math.exp(quantileNormal(p, mean2, stdev));\n  }\n  function lognormal(mean2, stdev) {\n    let mu, sigma;\n    const dist2 = {\n      mean(_) {\n        if (arguments.length) {\n          mu = _ || 0;\n          return dist2;\n        } else {\n          return mu;\n        }\n      },\n      stdev(_) {\n        if (arguments.length) {\n          sigma = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return sigma;\n        }\n      },\n      sample: () => sampleLogNormal(mu, sigma),\n      pdf: (value2) => densityLogNormal(value2, mu, sigma),\n      cdf: (value2) => cumulativeLogNormal(value2, mu, sigma),\n      icdf: (p) => quantileLogNormal(p, mu, sigma)\n    };\n    return dist2.mean(mean2).stdev(stdev);\n  }\n  function mixture$1(dists, weights) {\n    let m2 = 0, w2;\n    function normalize2(x2) {\n      const w3 = [];\n      let sum2 = 0, i;\n      for (i = 0; i < m2; ++i) {\n        sum2 += w3[i] = x2[i] == null ? 1 : +x2[i];\n      }\n      for (i = 0; i < m2; ++i) {\n        w3[i] /= sum2;\n      }\n      return w3;\n    }\n    const dist2 = {\n      weights(_) {\n        if (arguments.length) {\n          w2 = normalize2(weights = _ || []);\n          return dist2;\n        }\n        return weights;\n      },\n      distributions(_) {\n        if (arguments.length) {\n          if (_) {\n            m2 = _.length;\n            dists = _;\n          } else {\n            m2 = 0;\n            dists = [];\n          }\n          return dist2.weights(weights);\n        }\n        return dists;\n      },\n      sample() {\n        const r = random();\n        let d2 = dists[m2 - 1], v = w2[0], i = 0;\n        for (; i < m2 - 1; v += w2[++i]) {\n          if (r < v) {\n            d2 = dists[i];\n            break;\n          }\n        }\n        return d2.sample();\n      },\n      pdf(x2) {\n        let p = 0, i = 0;\n        for (; i < m2; ++i) {\n          p += w2[i] * dists[i].pdf(x2);\n        }\n        return p;\n      },\n      cdf(x2) {\n        let p = 0, i = 0;\n        for (; i < m2; ++i) {\n          p += w2[i] * dists[i].cdf(x2);\n        }\n        return p;\n      },\n      icdf() {\n        throw Error(\"Mixture icdf not supported.\");\n      }\n    };\n    return dist2.distributions(dists).weights(weights);\n  }\n  function sampleUniform(min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return min2 + (max2 - min2) * random();\n  }\n  function densityUniform(value2, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return value2 >= min2 && value2 <= max2 ? 1 / (max2 - min2) : 0;\n  }\n  function cumulativeUniform(value2, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return value2 < min2 ? 0 : value2 > max2 ? 1 : (value2 - min2) / (max2 - min2);\n  }\n  function quantileUniform(p, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return p >= 0 && p <= 1 ? min2 + p * (max2 - min2) : NaN;\n  }\n  function uniform(min2, max2) {\n    let a2, b2;\n    const dist2 = {\n      min(_) {\n        if (arguments.length) {\n          a2 = _ || 0;\n          return dist2;\n        } else {\n          return a2;\n        }\n      },\n      max(_) {\n        if (arguments.length) {\n          b2 = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return b2;\n        }\n      },\n      sample: () => sampleUniform(a2, b2),\n      pdf: (value2) => densityUniform(value2, a2, b2),\n      cdf: (value2) => cumulativeUniform(value2, a2, b2),\n      icdf: (p) => quantileUniform(p, a2, b2)\n    };\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return dist2.min(min2).max(max2);\n  }\n  function constant$3(data2, x2, y2) {\n    let mean2 = 0, n = 0;\n    for (const d2 of data2) {\n      const val = y2(d2);\n      if (x2(d2) == null || val == null || isNaN(val)) continue;\n      mean2 += (val - mean2) / ++n;\n    }\n    return {\n      coef: [mean2],\n      predict: () => mean2,\n      rSquared: 0\n    };\n  }\n  function ols(uX, uY, uXY, uX2) {\n    const delta = uX2 - uX * uX, slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta, intercept = uY - slope * uX;\n    return [intercept, slope];\n  }\n  function points(data2, x2, y2, sort2) {\n    data2 = data2.filter((d3) => {\n      let u2 = x2(d3), v = y2(d3);\n      return u2 != null && (u2 = +u2) >= u2 && v != null && (v = +v) >= v;\n    });\n    if (sort2) {\n      data2.sort((a2, b2) => x2(a2) - x2(b2));\n    }\n    const n = data2.length, X3 = new Float64Array(n), Y3 = new Float64Array(n);\n    let i = 0, ux = 0, uy = 0, xv, yv, d2;\n    for (d2 of data2) {\n      X3[i] = xv = +x2(d2);\n      Y3[i] = yv = +y2(d2);\n      ++i;\n      ux += (xv - ux) / i;\n      uy += (yv - uy) / i;\n    }\n    for (i = 0; i < n; ++i) {\n      X3[i] -= ux;\n      Y3[i] -= uy;\n    }\n    return [X3, Y3, ux, uy];\n  }\n  function visitPoints(data2, x2, y2, callback) {\n    let i = -1, u2, v;\n    for (const d2 of data2) {\n      u2 = x2(d2);\n      v = y2(d2);\n      if (u2 != null && (u2 = +u2) >= u2 && v != null && (v = +v) >= v) {\n        callback(u2, v, ++i);\n      }\n    }\n  }\n  function rSquared(data2, x2, y2, uY, predict) {\n    let SSE = 0, SST = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      const sse = dy - predict(dx), sst = dy - uY;\n      SSE += sse * sse;\n      SST += sst * sst;\n    });\n    return 1 - SSE / SST;\n  }\n  function linear(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      ++n;\n      X3 += (dx - X3) / n;\n      Y3 += (dy - Y3) / n;\n      XY += (dx * dy - XY) / n;\n      X22 += (dx * dx - X22) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] + coef[1] * x3;\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, Y3, predict)\n    };\n  }\n  function log$2(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      ++n;\n      dx = Math.log(dx);\n      X3 += (dx - X3) / n;\n      Y3 += (dy - Y3) / n;\n      XY += (dx * dy - XY) / n;\n      X22 += (dx * dx - X22) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] + coef[1] * Math.log(x3);\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, Y3, predict)\n    };\n  }\n  function exp$1(data2, x2, y2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2);\n    let YL = 0, XY = 0, XYL = 0, X2Y = 0, n = 0, dx, ly2, xy;\n    visitPoints(data2, x2, y2, (_, dy) => {\n      dx = xv[n++];\n      ly2 = Math.log(dy);\n      xy = dx * dy;\n      YL += (dy * ly2 - YL) / n;\n      XY += (xy - XY) / n;\n      XYL += (xy * ly2 - XYL) / n;\n      X2Y += (dx * xy - X2Y) / n;\n    });\n    const [c0, c1] = ols(XY / uy, YL / uy, XYL / uy, X2Y / uy), predict = (x3) => Math.exp(c0 + c1 * (x3 - ux));\n    return {\n      coef: [Math.exp(c0 - c1 * ux), c1],\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function pow$2(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, YS = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      const lx2 = Math.log(dx), ly2 = Math.log(dy);\n      ++n;\n      X3 += (lx2 - X3) / n;\n      Y3 += (ly2 - Y3) / n;\n      XY += (lx2 * ly2 - XY) / n;\n      X22 += (lx2 * lx2 - X22) / n;\n      YS += (dy - YS) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] * Math.pow(x3, coef[1]);\n    coef[0] = Math.exp(coef[0]);\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, YS, predict)\n    };\n  }\n  function quad(data2, x2, y2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2), n = xv.length;\n    let X22 = 0, X3 = 0, X4 = 0, XY = 0, X2Y = 0, i, dx, dy, x22;\n    for (i = 0; i < n; ) {\n      dx = xv[i];\n      dy = yv[i++];\n      x22 = dx * dx;\n      X22 += (x22 - X22) / i;\n      X3 += (x22 * dx - X3) / i;\n      X4 += (x22 * x22 - X4) / i;\n      XY += (dx * dy - XY) / i;\n      X2Y += (x22 * dy - X2Y) / i;\n    }\n    const X2X2 = X4 - X22 * X22, d2 = X22 * X2X2 - X3 * X3, a2 = (X2Y * X22 - XY * X3) / d2, b2 = (XY * X2X2 - X2Y * X3) / d2, c2 = -a2 * X22, predict = (x3) => {\n      x3 = x3 - ux;\n      return a2 * x3 * x3 + b2 * x3 + c2 + uy;\n    };\n    return {\n      coef: [c2 - b2 * ux + a2 * ux * ux + uy, b2 - 2 * a2 * ux, a2],\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function poly(data2, x2, y2, order) {\n    if (order === 0) return constant$3(data2, x2, y2);\n    if (order === 1) return linear(data2, x2, y2);\n    if (order === 2) return quad(data2, x2, y2);\n    const [xv, yv, ux, uy] = points(data2, x2, y2), n = xv.length, lhs = [], rhs = [], k = order + 1;\n    let i, j, l, v, c2;\n    for (i = 0; i < k; ++i) {\n      for (l = 0, v = 0; l < n; ++l) {\n        v += Math.pow(xv[l], i) * yv[l];\n      }\n      lhs.push(v);\n      c2 = new Float64Array(k);\n      for (j = 0; j < k; ++j) {\n        for (l = 0, v = 0; l < n; ++l) {\n          v += Math.pow(xv[l], i + j);\n        }\n        c2[j] = v;\n      }\n      rhs.push(c2);\n    }\n    rhs.push(lhs);\n    const coef = gaussianElimination(rhs), predict = (x3) => {\n      x3 -= ux;\n      let y3 = uy + coef[0] + coef[1] * x3 + coef[2] * x3 * x3;\n      for (i = 3; i < k; ++i) y3 += coef[i] * Math.pow(x3, i);\n      return y3;\n    };\n    return {\n      coef: uncenter(k, coef, -ux, uy),\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function uncenter(k, a2, x2, y2) {\n    const z2 = Array(k);\n    let i, j, v, c2;\n    for (i = 0; i < k; ++i) z2[i] = 0;\n    for (i = k - 1; i >= 0; --i) {\n      v = a2[i];\n      c2 = 1;\n      z2[i] += v;\n      for (j = 1; j <= i; ++j) {\n        c2 *= (i + 1 - j) / j;\n        z2[i - j] += v * Math.pow(x2, j) * c2;\n      }\n    }\n    z2[0] += y2;\n    return z2;\n  }\n  function gaussianElimination(matrix) {\n    const n = matrix.length - 1, coef = [];\n    let i, j, k, r, t;\n    for (i = 0; i < n; ++i) {\n      r = i;\n      for (j = i + 1; j < n; ++j) {\n        if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) {\n          r = j;\n        }\n      }\n      for (k = i; k < n + 1; ++k) {\n        t = matrix[k][i];\n        matrix[k][i] = matrix[k][r];\n        matrix[k][r] = t;\n      }\n      for (j = i + 1; j < n; ++j) {\n        for (k = n; k >= i; k--) {\n          matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i];\n        }\n      }\n    }\n    for (j = n - 1; j >= 0; --j) {\n      t = 0;\n      for (k = j + 1; k < n; ++k) {\n        t += matrix[k][j] * coef[k];\n      }\n      coef[j] = (matrix[n][j] - t) / matrix[j][j];\n    }\n    return coef;\n  }\n  const maxiters = 2, epsilon$6 = 1e-12;\n  function loess(data2, x2, y2, bandwidth2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2, true), n = xv.length, bw = Math.max(2, ~~(bandwidth2 * n)), yhat = new Float64Array(n), residuals = new Float64Array(n), robustWeights = new Float64Array(n).fill(1);\n    for (let iter = -1; ++iter <= maxiters; ) {\n      const interval2 = [0, bw - 1];\n      for (let i = 0; i < n; ++i) {\n        const dx = xv[i], i0 = interval2[0], i1 = interval2[1], edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;\n        let W = 0, X3 = 0, Y3 = 0, XY = 0, X22 = 0;\n        const denom = 1 / Math.abs(xv[edge] - dx || 1);\n        for (let k = i0; k <= i1; ++k) {\n          const xk = xv[k], yk = yv[k], w2 = tricube(Math.abs(dx - xk) * denom) * robustWeights[k], xkw = xk * w2;\n          W += w2;\n          X3 += xkw;\n          Y3 += yk * w2;\n          XY += yk * xkw;\n          X22 += xk * xkw;\n        }\n        const [a2, b2] = ols(X3 / W, Y3 / W, XY / W, X22 / W);\n        yhat[i] = a2 + b2 * dx;\n        residuals[i] = Math.abs(yv[i] - yhat[i]);\n        updateInterval(xv, i + 1, interval2);\n      }\n      if (iter === maxiters) {\n        break;\n      }\n      const medianResidual = median(residuals);\n      if (Math.abs(medianResidual) < epsilon$6) break;\n      for (let i = 0, arg, w2; i < n; ++i) {\n        arg = residuals[i] / (6 * medianResidual);\n        robustWeights[i] = arg >= 1 ? epsilon$6 : (w2 = 1 - arg * arg) * w2;\n      }\n    }\n    return output$1(xv, yhat, ux, uy);\n  }\n  function tricube(x2) {\n    return (x2 = 1 - x2 * x2 * x2) * x2 * x2;\n  }\n  function updateInterval(xv, i, interval2) {\n    const val = xv[i];\n    let left = interval2[0], right = interval2[1] + 1;\n    if (right >= xv.length) return;\n    while (i > left && xv[right] - val <= val - xv[left]) {\n      interval2[0] = ++left;\n      interval2[1] = right;\n      ++right;\n    }\n  }\n  function output$1(xv, yhat, ux, uy) {\n    const n = xv.length, out = [];\n    let i = 0, cnt = 0, prev = [], v;\n    for (; i < n; ++i) {\n      v = xv[i] + ux;\n      if (prev[0] === v) {\n        prev[1] += (yhat[i] - prev[1]) / ++cnt;\n      } else {\n        cnt = 0;\n        prev[1] += uy;\n        prev = [v, yhat[i]];\n        out.push(prev);\n      }\n    }\n    prev[1] += uy;\n    return out;\n  }\n  const MIN_RADIANS = 0.5 * Math.PI / 180;\n  function sampleCurve(f, extent2, minSteps, maxSteps) {\n    minSteps = minSteps || 25;\n    maxSteps = Math.max(minSteps, maxSteps || 200);\n    const point2 = (x2) => [x2, f(x2)], minX = extent2[0], maxX = extent2[1], span2 = maxX - minX, stop2 = span2 / maxSteps, prev = [point2(minX)], next = [];\n    if (minSteps === maxSteps) {\n      for (let i = 1; i < maxSteps; ++i) {\n        prev.push(point2(minX + i / minSteps * span2));\n      }\n      prev.push(point2(maxX));\n      return prev;\n    } else {\n      next.push(point2(maxX));\n      for (let i = minSteps; --i > 0; ) {\n        next.push(point2(minX + i / minSteps * span2));\n      }\n    }\n    let p02 = prev[0];\n    let p1 = next[next.length - 1];\n    const sx = 1 / span2;\n    const sy = scaleY(p02[1], next);\n    while (p1) {\n      const pm = point2((p02[0] + p1[0]) / 2);\n      const dx = pm[0] - p02[0] >= stop2;\n      if (dx && angleDelta(p02, pm, p1, sx, sy) > MIN_RADIANS) {\n        next.push(pm);\n      } else {\n        p02 = p1;\n        prev.push(p1);\n        next.pop();\n      }\n      p1 = next[next.length - 1];\n    }\n    return prev;\n  }\n  function scaleY(init2, points2) {\n    let ymin = init2;\n    let ymax = init2;\n    const n = points2.length;\n    for (let i = 0; i < n; ++i) {\n      const y2 = points2[i][1];\n      if (y2 < ymin) ymin = y2;\n      if (y2 > ymax) ymax = y2;\n    }\n    return 1 / (ymax - ymin);\n  }\n  function angleDelta(p, q, r, sx, sy) {\n    const a0 = Math.atan2(sy * (r[1] - p[1]), sx * (r[0] - p[0])), a1 = Math.atan2(sy * (q[1] - p[1]), sx * (q[0] - p[0]));\n    return Math.abs(a0 - a1);\n  }\n  function multikey(f) {\n    return (x2) => {\n      const n = f.length;\n      let i = 1, k = String(f[0](x2));\n      for (; i < n; ++i) {\n        k += \"|\" + f[i](x2);\n      }\n      return k;\n    };\n  }\n  function groupkey(fields) {\n    return !fields || !fields.length ? function() {\n      return \"\";\n    } : fields.length === 1 ? fields[0] : multikey(fields);\n  }\n  function measureName(op, field2, as) {\n    return as || op + (!field2 ? \"\" : \"_\" + field2);\n  }\n  const noop$4 = () => {\n  };\n  const base_op = {\n    init: noop$4,\n    add: noop$4,\n    rem: noop$4,\n    idx: 0\n  };\n  const AggregateOps = {\n    values: {\n      init: (m2) => m2.cell.store = true,\n      value: (m2) => m2.cell.data.values(),\n      idx: -1\n    },\n    count: {\n      value: (m2) => m2.cell.num\n    },\n    __count__: {\n      value: (m2) => m2.missing + m2.valid\n    },\n    missing: {\n      value: (m2) => m2.missing\n    },\n    valid: {\n      value: (m2) => m2.valid\n    },\n    sum: {\n      init: (m2) => m2.sum = 0,\n      value: (m2) => m2.valid ? m2.sum : void 0,\n      add: (m2, v) => m2.sum += +v,\n      rem: (m2, v) => m2.sum -= v\n    },\n    product: {\n      init: (m2) => m2.product = 1,\n      value: (m2) => m2.valid ? m2.product : void 0,\n      add: (m2, v) => m2.product *= v,\n      rem: (m2, v) => m2.product /= v\n    },\n    mean: {\n      init: (m2) => m2.mean = 0,\n      value: (m2) => m2.valid ? m2.mean : void 0,\n      add: (m2, v) => (m2.mean_d = v - m2.mean, m2.mean += m2.mean_d / m2.valid),\n      rem: (m2, v) => (m2.mean_d = v - m2.mean, m2.mean -= m2.valid ? m2.mean_d / m2.valid : m2.mean)\n    },\n    average: {\n      value: (m2) => m2.valid ? m2.mean : void 0,\n      req: [\"mean\"],\n      idx: 1\n    },\n    variance: {\n      init: (m2) => m2.dev = 0,\n      value: (m2) => m2.valid > 1 ? m2.dev / (m2.valid - 1) : void 0,\n      add: (m2, v) => m2.dev += m2.mean_d * (v - m2.mean),\n      rem: (m2, v) => m2.dev -= m2.mean_d * (v - m2.mean),\n      req: [\"mean\"],\n      idx: 1\n    },\n    variancep: {\n      value: (m2) => m2.valid > 1 ? m2.dev / m2.valid : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stdev: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / (m2.valid - 1)) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stdevp: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / m2.valid) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stderr: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / (m2.valid * (m2.valid - 1))) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    distinct: {\n      value: (m2) => m2.cell.data.distinct(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    ci0: {\n      value: (m2) => m2.cell.data.ci0(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    ci1: {\n      value: (m2) => m2.cell.data.ci1(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    median: {\n      value: (m2) => m2.cell.data.q2(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    q1: {\n      value: (m2) => m2.cell.data.q1(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    q3: {\n      value: (m2) => m2.cell.data.q3(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    min: {\n      init: (m2) => m2.min = void 0,\n      value: (m2) => m2.min = Number.isNaN(m2.min) ? m2.cell.data.min(m2.get) : m2.min,\n      add: (m2, v) => {\n        if (v < m2.min || m2.min === void 0) m2.min = v;\n      },\n      rem: (m2, v) => {\n        if (v <= m2.min) m2.min = NaN;\n      },\n      req: [\"values\"],\n      idx: 4\n    },\n    max: {\n      init: (m2) => m2.max = void 0,\n      value: (m2) => m2.max = Number.isNaN(m2.max) ? m2.cell.data.max(m2.get) : m2.max,\n      add: (m2, v) => {\n        if (v > m2.max || m2.max === void 0) m2.max = v;\n      },\n      rem: (m2, v) => {\n        if (v >= m2.max) m2.max = NaN;\n      },\n      req: [\"values\"],\n      idx: 4\n    },\n    argmin: {\n      init: (m2) => m2.argmin = void 0,\n      value: (m2) => m2.argmin || m2.cell.data.argmin(m2.get),\n      add: (m2, v, t) => {\n        if (v < m2.min) m2.argmin = t;\n      },\n      rem: (m2, v) => {\n        if (v <= m2.min) m2.argmin = void 0;\n      },\n      req: [\"min\", \"values\"],\n      idx: 3\n    },\n    argmax: {\n      init: (m2) => m2.argmax = void 0,\n      value: (m2) => m2.argmax || m2.cell.data.argmax(m2.get),\n      add: (m2, v, t) => {\n        if (v > m2.max) m2.argmax = t;\n      },\n      rem: (m2, v) => {\n        if (v >= m2.max) m2.argmax = void 0;\n      },\n      req: [\"max\", \"values\"],\n      idx: 3\n    },\n    exponential: {\n      init: (m2, r) => {\n        m2.exp = 0;\n        m2.exp_r = r;\n      },\n      value: (m2) => m2.valid ? m2.exp * (1 - m2.exp_r) / (1 - m2.exp_r ** m2.valid) : void 0,\n      add: (m2, v) => m2.exp = m2.exp_r * m2.exp + v,\n      rem: (m2, v) => m2.exp = (m2.exp - v / m2.exp_r ** (m2.valid - 1)) / m2.exp_r\n    },\n    exponentialb: {\n      value: (m2) => m2.valid ? m2.exp * (1 - m2.exp_r) : void 0,\n      req: [\"exponential\"],\n      idx: 1\n    }\n  };\n  const ValidAggregateOps = Object.keys(AggregateOps).filter((d2) => d2 !== \"__count__\");\n  function measure(key2, value2) {\n    return (out, aggregate_param) => extend({\n      name: key2,\n      aggregate_param,\n      out: out || key2\n    }, base_op, value2);\n  }\n  [...ValidAggregateOps, \"__count__\"].forEach((key2) => {\n    AggregateOps[key2] = measure(key2, AggregateOps[key2]);\n  });\n  function createMeasure(op, param2, name) {\n    return AggregateOps[op](name, param2);\n  }\n  function compareIndex(a2, b2) {\n    return a2.idx - b2.idx;\n  }\n  function resolve(agg) {\n    const map2 = {};\n    agg.forEach((a2) => map2[a2.name] = a2);\n    const getreqs = (a2) => {\n      if (!a2.req) return;\n      a2.req.forEach((key2) => {\n        if (!map2[key2]) getreqs(map2[key2] = AggregateOps[key2]());\n      });\n    };\n    agg.forEach(getreqs);\n    return Object.values(map2).sort(compareIndex);\n  }\n  function init() {\n    this.valid = 0;\n    this.missing = 0;\n    this._ops.forEach((op) => op.aggregate_param == null ? op.init(this) : op.init(this, op.aggregate_param));\n  }\n  function add$2(v, t) {\n    if (v == null || v === \"\") {\n      ++this.missing;\n      return;\n    }\n    if (v !== v) return;\n    ++this.valid;\n    this._ops.forEach((op) => op.add(this, v, t));\n  }\n  function rem(v, t) {\n    if (v == null || v === \"\") {\n      --this.missing;\n      return;\n    }\n    if (v !== v) return;\n    --this.valid;\n    this._ops.forEach((op) => op.rem(this, v, t));\n  }\n  function set$3(t) {\n    this._out.forEach((op) => t[op.out] = op.value(this));\n    return t;\n  }\n  function compileMeasures(agg, field2) {\n    const get2 = field2 || identity$2, ops2 = resolve(agg), out = agg.slice().sort(compareIndex);\n    function ctr(cell2) {\n      this._ops = ops2;\n      this._out = out;\n      this.cell = cell2;\n      this.init();\n    }\n    ctr.prototype.init = init;\n    ctr.prototype.add = add$2;\n    ctr.prototype.rem = rem;\n    ctr.prototype.set = set$3;\n    ctr.prototype.get = get2;\n    ctr.fields = agg.map((op) => op.out);\n    return ctr;\n  }\n  function TupleStore(key2) {\n    this._key = key2 ? field$1(key2) : tupleid;\n    this.reset();\n  }\n  const prototype$1 = TupleStore.prototype;\n  prototype$1.reset = function() {\n    this._add = [];\n    this._rem = [];\n    this._ext = null;\n    this._get = null;\n    this._q = null;\n  };\n  prototype$1.add = function(v) {\n    this._add.push(v);\n  };\n  prototype$1.rem = function(v) {\n    this._rem.push(v);\n  };\n  prototype$1.values = function() {\n    this._get = null;\n    if (this._rem.length === 0) return this._add;\n    const a2 = this._add, r = this._rem, k = this._key, n = a2.length, m2 = r.length, x2 = Array(n - m2), map2 = {};\n    let i, j, v;\n    for (i = 0; i < m2; ++i) {\n      map2[k(r[i])] = 1;\n    }\n    for (i = 0, j = 0; i < n; ++i) {\n      if (map2[k(v = a2[i])]) {\n        map2[k(v)] = 0;\n      } else {\n        x2[j++] = v;\n      }\n    }\n    this._rem = [];\n    return this._add = x2;\n  };\n  prototype$1.distinct = function(get2) {\n    const v = this.values(), map2 = {};\n    let n = v.length, count2 = 0, s2;\n    while (--n >= 0) {\n      s2 = get2(v[n]) + \"\";\n      if (!has$1(map2, s2)) {\n        map2[s2] = 1;\n        ++count2;\n      }\n    }\n    return count2;\n  };\n  prototype$1.extent = function(get2) {\n    if (this._get !== get2 || !this._ext) {\n      const v = this.values(), i = extentIndex(v, get2);\n      this._ext = [v[i[0]], v[i[1]]];\n      this._get = get2;\n    }\n    return this._ext;\n  };\n  prototype$1.argmin = function(get2) {\n    return this.extent(get2)[0] || {};\n  };\n  prototype$1.argmax = function(get2) {\n    return this.extent(get2)[1] || {};\n  };\n  prototype$1.min = function(get2) {\n    const m2 = this.extent(get2)[0];\n    return m2 != null ? get2(m2) : void 0;\n  };\n  prototype$1.max = function(get2) {\n    const m2 = this.extent(get2)[1];\n    return m2 != null ? get2(m2) : void 0;\n  };\n  prototype$1.quartile = function(get2) {\n    if (this._get !== get2 || !this._q) {\n      this._q = quartiles(this.values(), get2);\n      this._get = get2;\n    }\n    return this._q;\n  };\n  prototype$1.q1 = function(get2) {\n    return this.quartile(get2)[0];\n  };\n  prototype$1.q2 = function(get2) {\n    return this.quartile(get2)[1];\n  };\n  prototype$1.q3 = function(get2) {\n    return this.quartile(get2)[2];\n  };\n  prototype$1.ci = function(get2) {\n    if (this._get !== get2 || !this._ci) {\n      this._ci = bootstrapCI(this.values(), 1e3, 0.05, get2);\n      this._get = get2;\n    }\n    return this._ci;\n  };\n  prototype$1.ci0 = function(get2) {\n    return this.ci(get2)[0];\n  };\n  prototype$1.ci1 = function(get2) {\n    return this.ci(get2)[1];\n  };\n  function Aggregate$1(params2) {\n    Transform.call(this, null, params2);\n    this._adds = [];\n    this._mods = [];\n    this._alen = 0;\n    this._mlen = 0;\n    this._drop = true;\n    this._cross = false;\n    this._dims = [];\n    this._dnames = [];\n    this._measures = [];\n    this._countOnly = false;\n    this._counts = null;\n    this._prev = null;\n    this._inputs = null;\n    this._outputs = null;\n  }\n  Aggregate$1.Definition = {\n    \"type\": \"Aggregate\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidAggregateOps\n    }, {\n      \"name\": \"aggregate_params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"drop\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"cross\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(Aggregate$1, Transform, {\n    transform(_, pulse2) {\n      const aggr = this, out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), mod = _.modified();\n      aggr.stamp = out.stamp;\n      if (aggr.value && (mod || pulse2.modified(aggr._inputs, true))) {\n        aggr._prev = aggr.value;\n        aggr.value = mod ? aggr.init(_) : /* @__PURE__ */ Object.create(null);\n        pulse2.visit(pulse2.SOURCE, (t) => aggr.add(t));\n      } else {\n        aggr.value = aggr.value || aggr.init(_);\n        pulse2.visit(pulse2.REM, (t) => aggr.rem(t));\n        pulse2.visit(pulse2.ADD, (t) => aggr.add(t));\n      }\n      out.modifies(aggr._outputs);\n      aggr._drop = _.drop !== false;\n      if (_.cross && aggr._dims.length > 1) {\n        aggr._drop = false;\n        aggr.cross();\n      }\n      if (pulse2.clean() && aggr._drop) {\n        out.clean(true).runAfter(() => this.clean());\n      }\n      return aggr.changes(out);\n    },\n    cross() {\n      const aggr = this, curr = aggr.value, dims = aggr._dnames, vals = dims.map(() => ({})), n = dims.length;\n      function collect2(cells) {\n        let key2, i, t, v;\n        for (key2 in cells) {\n          t = cells[key2].tuple;\n          for (i = 0; i < n; ++i) {\n            vals[i][v = t[dims[i]]] = v;\n          }\n        }\n      }\n      collect2(aggr._prev);\n      collect2(curr);\n      function generate2(base2, tuple, index2) {\n        const name = dims[index2], v = vals[index2++];\n        for (const k in v) {\n          const key2 = base2 ? base2 + \"|\" + k : k;\n          tuple[name] = v[k];\n          if (index2 < n) generate2(key2, tuple, index2);\n          else if (!curr[key2]) aggr.cell(key2, tuple);\n        }\n      }\n      generate2(\"\", {}, 0);\n    },\n    init(_) {\n      const inputs = this._inputs = [], outputs = this._outputs = [], inputMap = {};\n      function inputVisit(get2) {\n        const fields2 = array$4(accessorFields(get2)), n2 = fields2.length;\n        let i2 = 0, f;\n        for (; i2 < n2; ++i2) {\n          if (!inputMap[f = fields2[i2]]) {\n            inputMap[f] = 1;\n            inputs.push(f);\n          }\n        }\n      }\n      this._dims = array$4(_.groupby);\n      this._dnames = this._dims.map((d2) => {\n        const dname = accessorName(d2);\n        inputVisit(d2);\n        outputs.push(dname);\n        return dname;\n      });\n      this.cellkey = _.key ? _.key : groupkey(this._dims);\n      this._countOnly = true;\n      this._counts = [];\n      this._measures = [];\n      const fields = _.fields || [null], ops2 = _.ops || [\"count\"], aggregate_params = _.aggregate_params || [null], as = _.as || [], n = fields.length, map2 = {};\n      let field2, op, aggregate_param, m2, mname, outname, i;\n      if (n !== ops2.length) {\n        error(\"Unmatched number of fields and aggregate ops.\");\n      }\n      for (i = 0; i < n; ++i) {\n        field2 = fields[i];\n        op = ops2[i];\n        aggregate_param = aggregate_params[i] || null;\n        if (field2 == null && op !== \"count\") {\n          error(\"Null aggregate field specified.\");\n        }\n        mname = accessorName(field2);\n        outname = measureName(op, mname, as[i]);\n        outputs.push(outname);\n        if (op === \"count\") {\n          this._counts.push(outname);\n          continue;\n        }\n        m2 = map2[mname];\n        if (!m2) {\n          inputVisit(field2);\n          m2 = map2[mname] = [];\n          m2.field = field2;\n          this._measures.push(m2);\n        }\n        if (op !== \"count\") this._countOnly = false;\n        m2.push(createMeasure(op, aggregate_param, outname));\n      }\n      this._measures = this._measures.map((m3) => compileMeasures(m3, m3.field));\n      return /* @__PURE__ */ Object.create(null);\n    },\n    // -- Cell Management -----\n    cellkey: groupkey(),\n    cell(key2, t) {\n      let cell2 = this.value[key2];\n      if (!cell2) {\n        cell2 = this.value[key2] = this.newcell(key2, t);\n        this._adds[this._alen++] = cell2;\n      } else if (cell2.num === 0 && this._drop && cell2.stamp < this.stamp) {\n        cell2.stamp = this.stamp;\n        this._adds[this._alen++] = cell2;\n      } else if (cell2.stamp < this.stamp) {\n        cell2.stamp = this.stamp;\n        this._mods[this._mlen++] = cell2;\n      }\n      return cell2;\n    },\n    newcell(key2, t) {\n      const cell2 = {\n        key: key2,\n        num: 0,\n        agg: null,\n        tuple: this.newtuple(t, this._prev && this._prev[key2]),\n        stamp: this.stamp,\n        store: false\n      };\n      if (!this._countOnly) {\n        const measures = this._measures, n = measures.length;\n        cell2.agg = Array(n);\n        for (let i = 0; i < n; ++i) {\n          cell2.agg[i] = new measures[i](cell2);\n        }\n      }\n      if (cell2.store) {\n        cell2.data = new TupleStore();\n      }\n      return cell2;\n    },\n    newtuple(t, p) {\n      const names = this._dnames, dims = this._dims, n = dims.length, x2 = {};\n      for (let i = 0; i < n; ++i) {\n        x2[names[i]] = dims[i](t);\n      }\n      return p ? replace$1(p.tuple, x2) : ingest$1(x2);\n    },\n    clean() {\n      const cells = this.value;\n      for (const key2 in cells) {\n        if (cells[key2].num === 0) {\n          delete cells[key2];\n        }\n      }\n    },\n    // -- Process Tuples -----\n    add(t) {\n      const key2 = this.cellkey(t), cell2 = this.cell(key2, t);\n      cell2.num += 1;\n      if (this._countOnly) return;\n      if (cell2.store) cell2.data.add(t);\n      const agg = cell2.agg;\n      for (let i = 0, n = agg.length; i < n; ++i) {\n        agg[i].add(agg[i].get(t), t);\n      }\n    },\n    rem(t) {\n      const key2 = this.cellkey(t), cell2 = this.cell(key2, t);\n      cell2.num -= 1;\n      if (this._countOnly) return;\n      if (cell2.store) cell2.data.rem(t);\n      const agg = cell2.agg;\n      for (let i = 0, n = agg.length; i < n; ++i) {\n        agg[i].rem(agg[i].get(t), t);\n      }\n    },\n    celltuple(cell2) {\n      const tuple = cell2.tuple, counts = this._counts;\n      if (cell2.store) {\n        cell2.data.values();\n      }\n      for (let i = 0, n = counts.length; i < n; ++i) {\n        tuple[counts[i]] = cell2.num;\n      }\n      if (!this._countOnly) {\n        const agg = cell2.agg;\n        for (let i = 0, n = agg.length; i < n; ++i) {\n          agg[i].set(tuple);\n        }\n      }\n      return tuple;\n    },\n    changes(out) {\n      const adds = this._adds, mods = this._mods, prev = this._prev, drop = this._drop, add2 = out.add, rem2 = out.rem, mod = out.mod;\n      let cell2, key2, i, n;\n      if (prev) for (key2 in prev) {\n        cell2 = prev[key2];\n        if (!drop || cell2.num) rem2.push(cell2.tuple);\n      }\n      for (i = 0, n = this._alen; i < n; ++i) {\n        add2.push(this.celltuple(adds[i]));\n        adds[i] = null;\n      }\n      for (i = 0, n = this._mlen; i < n; ++i) {\n        cell2 = mods[i];\n        (cell2.num === 0 && drop ? rem2 : mod).push(this.celltuple(cell2));\n        mods[i] = null;\n      }\n      this._alen = this._mlen = 0;\n      this._prev = null;\n      return out;\n    }\n  });\n  const EPSILON$1 = 1e-14;\n  function Bin(params2) {\n    Transform.call(this, null, params2);\n  }\n  Bin.Definition = {\n    \"type\": \"Bin\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"interval\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"anchor\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"maxbins\",\n      \"type\": \"number\",\n      \"default\": 20\n    }, {\n      \"name\": \"base\",\n      \"type\": \"number\",\n      \"default\": 10\n    }, {\n      \"name\": \"divide\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"default\": [5, 2]\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"span\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"minstep\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"name\",\n      \"type\": \"string\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"bin0\", \"bin1\"]\n    }]\n  };\n  inherits(Bin, Transform, {\n    transform(_, pulse2) {\n      const band2 = _.interval !== false, bins = this._bins(_), start = bins.start, step = bins.step, as = _.as || [\"bin0\", \"bin1\"], b0 = as[0], b1 = as[1];\n      let flag2;\n      if (_.modified()) {\n        pulse2 = pulse2.reflow(true);\n        flag2 = pulse2.SOURCE;\n      } else {\n        flag2 = pulse2.modified(accessorFields(_.field)) ? pulse2.ADD_MOD : pulse2.ADD;\n      }\n      pulse2.visit(flag2, band2 ? (t) => {\n        const v = bins(t);\n        t[b0] = v;\n        t[b1] = v == null ? null : start + step * (1 + (v - start) / step);\n      } : (t) => t[b0] = bins(t));\n      return pulse2.modifies(band2 ? as : b0);\n    },\n    _bins(_) {\n      if (this.value && !_.modified()) {\n        return this.value;\n      }\n      const field2 = _.field, bins = bin(_), step = bins.step;\n      let start = bins.start, stop2 = start + Math.ceil((bins.stop - start) / step) * step, a2, d2;\n      if ((a2 = _.anchor) != null) {\n        d2 = a2 - (start + step * Math.floor((a2 - start) / step));\n        start += d2;\n        stop2 += d2;\n      }\n      const f = function(t) {\n        let v = toNumber(field2(t));\n        return v == null ? null : v < start ? -Infinity : v > stop2 ? Infinity : (v = Math.max(start, Math.min(v, stop2 - step)), start + step * Math.floor(EPSILON$1 + (v - start) / step));\n      };\n      f.start = start;\n      f.stop = bins.stop;\n      f.step = step;\n      return this.value = accessor(f, accessorFields(field2), _.name || \"bin_\" + accessorName(field2));\n    }\n  });\n  function SortedList(idFunc, source2, input) {\n    const $2 = idFunc;\n    let data2 = source2 || [], add2 = input || [], rem2 = {}, cnt = 0;\n    return {\n      add: (t) => add2.push(t),\n      remove: (t) => rem2[$2(t)] = ++cnt,\n      size: () => data2.length,\n      data: (compare2, resort) => {\n        if (cnt) {\n          data2 = data2.filter((t) => !rem2[$2(t)]);\n          rem2 = {};\n          cnt = 0;\n        }\n        if (resort && compare2) {\n          data2.sort(compare2);\n        }\n        if (add2.length) {\n          data2 = compare2 ? merge$2(compare2, data2, add2.sort(compare2)) : data2.concat(add2);\n          add2 = [];\n        }\n        return data2;\n      }\n    };\n  }\n  function Collect$1(params2) {\n    Transform.call(this, [], params2);\n  }\n  Collect$1.Definition = {\n    \"type\": \"Collect\",\n    \"metadata\": {\n      \"source\": true\n    },\n    \"params\": [{\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }]\n  };\n  inherits(Collect$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.ALL), list = SortedList(tupleid, this.value, out.materialize(out.ADD).add), sort2 = _.sort, mod = pulse2.changed() || sort2 && (_.modified(\"sort\") || pulse2.modified(sort2.fields));\n      out.visit(out.REM, list.remove);\n      this.modified(mod);\n      this.value = out.source = list.data(stableCompare(sort2), mod);\n      if (pulse2.source && pulse2.source.root) {\n        this.value.root = pulse2.source.root;\n      }\n      return out;\n    }\n  });\n  function Compare$1(params2) {\n    Operator.call(this, null, update$5, params2);\n  }\n  inherits(Compare$1, Operator);\n  function update$5(_) {\n    return this.value && !_.modified() ? this.value : compare$1(_.fields, _.orders);\n  }\n  function CountPattern(params2) {\n    Transform.call(this, null, params2);\n  }\n  CountPattern.Definition = {\n    \"type\": \"CountPattern\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"case\",\n      \"type\": \"enum\",\n      \"values\": [\"upper\", \"lower\", \"mixed\"],\n      \"default\": \"mixed\"\n    }, {\n      \"name\": \"pattern\",\n      \"type\": \"string\",\n      \"default\": '[\\\\w\"]+'\n    }, {\n      \"name\": \"stopwords\",\n      \"type\": \"string\",\n      \"default\": \"\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"text\", \"count\"]\n    }]\n  };\n  function tokenize(text2, tcase, match2) {\n    switch (tcase) {\n      case \"upper\":\n        text2 = text2.toUpperCase();\n        break;\n      case \"lower\":\n        text2 = text2.toLowerCase();\n        break;\n    }\n    return text2.match(match2);\n  }\n  inherits(CountPattern, Transform, {\n    transform(_, pulse2) {\n      const process = (update2) => (tuple) => {\n        var tokens = tokenize(get2(tuple), _.case, match2) || [], t;\n        for (var i = 0, n = tokens.length; i < n; ++i) {\n          if (!stop2.test(t = tokens[i])) update2(t);\n        }\n      };\n      const init2 = this._parameterCheck(_, pulse2), counts = this._counts, match2 = this._match, stop2 = this._stop, get2 = _.field, as = _.as || [\"text\", \"count\"], add2 = process((t) => counts[t] = 1 + (counts[t] || 0)), rem2 = process((t) => counts[t] -= 1);\n      if (init2) {\n        pulse2.visit(pulse2.SOURCE, add2);\n      } else {\n        pulse2.visit(pulse2.ADD, add2);\n        pulse2.visit(pulse2.REM, rem2);\n      }\n      return this._finish(pulse2, as);\n    },\n    _parameterCheck(_, pulse2) {\n      let init2 = false;\n      if (_.modified(\"stopwords\") || !this._stop) {\n        this._stop = new RegExp(\"^\" + (_.stopwords || \"\") + \"$\", \"i\");\n        init2 = true;\n      }\n      if (_.modified(\"pattern\") || !this._match) {\n        this._match = new RegExp(_.pattern || \"[\\\\w']+\", \"g\");\n        init2 = true;\n      }\n      if (_.modified(\"field\") || pulse2.modified(_.field.fields)) {\n        init2 = true;\n      }\n      if (init2) this._counts = {};\n      return init2;\n    },\n    _finish(pulse2, as) {\n      const counts = this._counts, tuples = this._tuples || (this._tuples = {}), text2 = as[0], count2 = as[1], out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      let w2, t, c2;\n      for (w2 in counts) {\n        t = tuples[w2];\n        c2 = counts[w2] || 0;\n        if (!t && c2) {\n          tuples[w2] = t = ingest$1({});\n          t[text2] = w2;\n          t[count2] = c2;\n          out.add.push(t);\n        } else if (c2 === 0) {\n          if (t) out.rem.push(t);\n          counts[w2] = null;\n          tuples[w2] = null;\n        } else if (t[count2] !== c2) {\n          t[count2] = c2;\n          out.mod.push(t);\n        }\n      }\n      return out.modifies(as);\n    }\n  });\n  function Cross(params2) {\n    Transform.call(this, null, params2);\n  }\n  Cross.Definition = {\n    \"type\": \"Cross\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"filter\",\n      \"type\": \"expr\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"a\", \"b\"]\n    }]\n  };\n  inherits(Cross, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), as = _.as || [\"a\", \"b\"], a2 = as[0], b2 = as[1], reset2 = !this.value || pulse2.changed(pulse2.ADD_REM) || _.modified(\"as\") || _.modified(\"filter\");\n      let data2 = this.value;\n      if (reset2) {\n        if (data2) out.rem = data2;\n        data2 = pulse2.materialize(pulse2.SOURCE).source;\n        out.add = this.value = cross(data2, a2, b2, _.filter || truthy);\n      } else {\n        out.mod = data2;\n      }\n      out.source = this.value;\n      return out.modifies(as);\n    }\n  });\n  function cross(input, a2, b2, filter2) {\n    var data2 = [], t = {}, n = input.length, i = 0, j, left;\n    for (; i < n; ++i) {\n      t[a2] = left = input[i];\n      for (j = 0; j < n; ++j) {\n        t[b2] = input[j];\n        if (filter2(t)) {\n          data2.push(ingest$1(t));\n          t = {};\n          t[a2] = left;\n        }\n      }\n    }\n    return data2;\n  }\n  const Distributions = {\n    kde,\n    mixture: mixture$1,\n    normal: gaussian,\n    lognormal,\n    uniform\n  };\n  const DISTRIBUTIONS = \"distributions\", FUNCTION = \"function\", FIELD = \"field\";\n  function parse$4(def2, data2) {\n    const func = def2[FUNCTION];\n    if (!has$1(Distributions, func)) {\n      error(\"Unknown distribution function: \" + func);\n    }\n    const d2 = Distributions[func]();\n    for (const name in def2) {\n      if (name === FIELD) {\n        d2.data((def2.from || data2()).map(def2[name]));\n      } else if (name === DISTRIBUTIONS) {\n        d2[name](def2[name].map((_) => parse$4(_, data2)));\n      } else if (typeof d2[name] === FUNCTION) {\n        d2[name](def2[name]);\n      }\n    }\n    return d2;\n  }\n  function Density(params2) {\n    Transform.call(this, null, params2);\n  }\n  const distributions = [{\n    \"key\": {\n      \"function\": \"normal\"\n    },\n    \"params\": [{\n      \"name\": \"mean\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"stdev\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"lognormal\"\n    },\n    \"params\": [{\n      \"name\": \"mean\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"stdev\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"uniform\"\n    },\n    \"params\": [{\n      \"name\": \"min\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"max\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"kde\"\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"from\",\n      \"type\": \"data\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0\n    }]\n  }];\n  const mixture = {\n    \"key\": {\n      \"function\": \"mixture\"\n    },\n    \"params\": [{\n      \"name\": \"distributions\",\n      \"type\": \"param\",\n      \"array\": true,\n      \"params\": distributions\n    }, {\n      \"name\": \"weights\",\n      \"type\": \"number\",\n      \"array\": true\n    }]\n  };\n  Density.Definition = {\n    \"type\": \"Density\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"minsteps\",\n      \"type\": \"number\",\n      \"default\": 25\n    }, {\n      \"name\": \"maxsteps\",\n      \"type\": \"number\",\n      \"default\": 200\n    }, {\n      \"name\": \"method\",\n      \"type\": \"string\",\n      \"default\": \"pdf\",\n      \"values\": [\"pdf\", \"cdf\"]\n    }, {\n      \"name\": \"distribution\",\n      \"type\": \"param\",\n      \"params\": distributions.concat(mixture)\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"value\", \"density\"]\n    }]\n  };\n  inherits(Density, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const dist2 = parse$4(_.distribution, source$1(pulse2)), minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n        let method2 = _.method || \"pdf\";\n        if (method2 !== \"pdf\" && method2 !== \"cdf\") {\n          error(\"Invalid density method: \" + method2);\n        }\n        if (!_.extent && !dist2.data) {\n          error(\"Missing density extent parameter.\");\n        }\n        method2 = dist2[method2];\n        const as = _.as || [\"value\", \"density\"], domain2 = _.extent || extent(dist2.data()), values2 = sampleCurve(method2, domain2, minsteps, maxsteps).map((v) => {\n          const tuple = {};\n          tuple[as[0]] = v[0];\n          tuple[as[1]] = v[1];\n          return ingest$1(tuple);\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  function source$1(pulse2) {\n    return () => pulse2.materialize(pulse2.SOURCE).source;\n  }\n  function fieldNames(fields, as) {\n    if (!fields) return null;\n    return fields.map((f, i) => as[i] || accessorName(f));\n  }\n  function partition$1$1(data2, groupby, field2) {\n    const groups = [], get2 = (f) => f(t);\n    let map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2.map(field2));\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(field2(t));\n      }\n    }\n    return groups;\n  }\n  const Output$5 = \"bin\";\n  function DotBin(params2) {\n    Transform.call(this, null, params2);\n  }\n  DotBin.Definition = {\n    \"type\": \"DotBin\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": Output$5\n    }]\n  };\n  const autostep = (data2, field2) => span(extent(data2, field2)) / 30;\n  inherits(DotBin, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !(_.modified() || pulse2.changed())) {\n        return pulse2;\n      }\n      const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(pulse2.source, _.groupby, identity$2), smooth = _.smooth || false, field2 = _.field, step = _.step || autostep(source2, field2), sort2 = stableCompare((a2, b2) => field2(a2) - field2(b2)), as = _.as || Output$5, n = groups.length;\n      let min2 = Infinity, max2 = -Infinity, i = 0, j;\n      for (; i < n; ++i) {\n        const g = groups[i].sort(sort2);\n        j = -1;\n        for (const v of dotbin(g, step, smooth, field2)) {\n          if (v < min2) min2 = v;\n          if (v > max2) max2 = v;\n          g[++j][as] = v;\n        }\n      }\n      this.value = {\n        start: min2,\n        stop: max2,\n        step\n      };\n      return pulse2.reflow(true).modifies(as);\n    }\n  });\n  function Expression$1(params2) {\n    Operator.call(this, null, update$4, params2);\n    this.modified(true);\n  }\n  inherits(Expression$1, Operator);\n  function update$4(_) {\n    const expr2 = _.expr;\n    return this.value && !_.modified(\"expr\") ? this.value : accessor((datum2) => expr2(datum2, _), accessorFields(expr2), accessorName(expr2));\n  }\n  function Extent(params2) {\n    Transform.call(this, [void 0, void 0], params2);\n  }\n  Extent.Definition = {\n    \"type\": \"Extent\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  };\n  inherits(Extent, Transform, {\n    transform(_, pulse2) {\n      const extent2 = this.value, field2 = _.field, mod = pulse2.changed() || pulse2.modified(field2.fields) || _.modified(\"field\");\n      let min2 = extent2[0], max2 = extent2[1];\n      if (mod || min2 == null) {\n        min2 = Infinity;\n        max2 = -Infinity;\n      }\n      pulse2.visit(mod ? pulse2.SOURCE : pulse2.ADD, (t) => {\n        const v = toNumber(field2(t));\n        if (v != null) {\n          if (v < min2) min2 = v;\n          if (v > max2) max2 = v;\n        }\n      });\n      if (!Number.isFinite(min2) || !Number.isFinite(max2)) {\n        let name = accessorName(field2);\n        if (name) name = ` for field \"${name}\"`;\n        pulse2.dataflow.warn(`Infinite extent${name}: [${min2}, ${max2}]`);\n        min2 = max2 = void 0;\n      }\n      this.value = [min2, max2];\n    }\n  });\n  function Subflow(pulse2, parent) {\n    Operator.call(this, pulse2);\n    this.parent = parent;\n    this.count = 0;\n  }\n  inherits(Subflow, Operator, {\n    /**\n     * Routes pulses from this subflow to a target transform.\n     * @param {Transform} target - A transform that receives the subflow of tuples.\n     */\n    connect(target2) {\n      this.detachSubflow = target2.detachSubflow;\n      this.targets().add(target2);\n      return target2.source = this;\n    },\n    /**\n     * Add an 'add' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being added.\n     */\n    add(t) {\n      this.count += 1;\n      this.value.add.push(t);\n    },\n    /**\n     * Add a 'rem' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being removed.\n     */\n    rem(t) {\n      this.count -= 1;\n      this.value.rem.push(t);\n    },\n    /**\n     * Add a 'mod' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being modified.\n     */\n    mod(t) {\n      this.value.mod.push(t);\n    },\n    /**\n     * Re-initialize this operator's pulse value.\n     * @param {Pulse} pulse - The pulse to copy from.\n     * @see Pulse.init\n     */\n    init(pulse2) {\n      this.value.init(pulse2, pulse2.NO_SOURCE);\n    },\n    /**\n     * Evaluate this operator. This method overrides the\n     * default behavior to simply return the contained pulse value.\n     * @return {Pulse}\n     */\n    evaluate() {\n      return this.value;\n    }\n  });\n  function Facet$1(params2) {\n    Transform.call(this, {}, params2);\n    this._keys = fastmap();\n    const a2 = this._targets = [];\n    a2.active = 0;\n    a2.forEach = (f) => {\n      for (let i = 0, n = a2.active; i < n; ++i) {\n        f(a2[i], i, a2);\n      }\n    };\n  }\n  inherits(Facet$1, Transform, {\n    activate(flow) {\n      this._targets[this._targets.active++] = flow;\n    },\n    // parent argument provided by PreFacet subclass\n    subflow(key2, flow, pulse2, parent) {\n      const flows = this.value;\n      let sf = has$1(flows, key2) && flows[key2], df, p;\n      if (!sf) {\n        p = parent || (p = this._group[key2]) && p.tuple;\n        df = pulse2.dataflow;\n        sf = new Subflow(pulse2.fork(pulse2.NO_SOURCE), this);\n        df.add(sf).connect(flow(df, key2, p));\n        flows[key2] = sf;\n        this.activate(sf);\n      } else if (sf.value.stamp < pulse2.stamp) {\n        sf.init(pulse2);\n        this.activate(sf);\n      }\n      return sf;\n    },\n    clean() {\n      const flows = this.value;\n      let detached = 0;\n      for (const key2 in flows) {\n        if (flows[key2].count === 0) {\n          const detach = flows[key2].detachSubflow;\n          if (detach) detach();\n          delete flows[key2];\n          ++detached;\n        }\n      }\n      if (detached) {\n        const active = this._targets.filter((sf) => sf && sf.count > 0);\n        this.initTargets(active);\n      }\n    },\n    initTargets(act) {\n      const a2 = this._targets, n = a2.length, m2 = act ? act.length : 0;\n      let i = 0;\n      for (; i < m2; ++i) {\n        a2[i] = act[i];\n      }\n      for (; i < n && a2[i] != null; ++i) {\n        a2[i] = null;\n      }\n      a2.active = m2;\n    },\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, key2 = _.key, flow = _.subflow, cache2 = this._keys, rekey = _.modified(\"key\"), subflow = (key3) => this.subflow(key3, flow, pulse2);\n      this._group = _.group || {};\n      this.initTargets();\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t), k = cache2.get(id2);\n        if (k !== void 0) {\n          cache2.delete(id2);\n          subflow(k).rem(t);\n        }\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        const k = key2(t);\n        cache2.set(tupleid(t), k);\n        subflow(k).add(t);\n      });\n      if (rekey || pulse2.modified(key2.fields)) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          const id2 = tupleid(t), k0 = cache2.get(id2), k1 = key2(t);\n          if (k0 === k1) {\n            subflow(k1).mod(t);\n          } else {\n            cache2.set(id2, k1);\n            subflow(k0).rem(t);\n            subflow(k1).add(t);\n          }\n        });\n      } else if (pulse2.changed(pulse2.MOD)) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          subflow(cache2.get(tupleid(t))).mod(t);\n        });\n      }\n      if (rekey) {\n        pulse2.visit(pulse2.REFLOW, (t) => {\n          const id2 = tupleid(t), k0 = cache2.get(id2), k1 = key2(t);\n          if (k0 !== k1) {\n            cache2.set(id2, k1);\n            subflow(k0).rem(t);\n            subflow(k1).add(t);\n          }\n        });\n      }\n      if (pulse2.clean()) {\n        df.runAfter(() => {\n          this.clean();\n          cache2.clean();\n        });\n      } else if (cache2.empty > df.cleanThreshold) {\n        df.runAfter(cache2.clean);\n      }\n      return pulse2;\n    }\n  });\n  function Field$1(params2) {\n    Operator.call(this, null, update$3, params2);\n  }\n  inherits(Field$1, Operator);\n  function update$3(_) {\n    return this.value && !_.modified() ? this.value : isArray(_.name) ? array$4(_.name).map((f) => field$1(f)) : field$1(_.name, _.as);\n  }\n  function Filter(params2) {\n    Transform.call(this, fastmap(), params2);\n  }\n  Filter.Definition = {\n    \"type\": \"Filter\",\n    \"metadata\": {\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"expr\",\n      \"type\": \"expr\",\n      \"required\": true\n    }]\n  };\n  inherits(Filter, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, cache2 = this.value, output2 = pulse2.fork(), add2 = output2.add, rem2 = output2.rem, mod = output2.mod, test2 = _.expr;\n      let isMod = true;\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t);\n        if (!cache2.has(id2)) rem2.push(t);\n        else cache2.delete(id2);\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        if (test2(t, _)) add2.push(t);\n        else cache2.set(tupleid(t), 1);\n      });\n      function revisit(t) {\n        const id2 = tupleid(t), b2 = test2(t, _), s2 = cache2.get(id2);\n        if (b2 && s2) {\n          cache2.delete(id2);\n          add2.push(t);\n        } else if (!b2 && !s2) {\n          cache2.set(id2, 1);\n          rem2.push(t);\n        } else if (isMod && b2 && !s2) {\n          mod.push(t);\n        }\n      }\n      pulse2.visit(pulse2.MOD, revisit);\n      if (_.modified()) {\n        isMod = false;\n        pulse2.visit(pulse2.REFLOW, revisit);\n      }\n      if (cache2.empty > df.cleanThreshold) df.runAfter(cache2.clean);\n      return output2;\n    }\n  });\n  function Flatten(params2) {\n    Transform.call(this, [], params2);\n  }\n  Flatten.Definition = {\n    \"type\": \"Flatten\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"index\",\n      \"type\": \"string\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Flatten, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, as = fieldNames(fields, _.as || []), index2 = _.index || null, m2 = as.length;\n      out.rem = this.value;\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        const arrays = fields.map((f) => f(t)), maxlen = arrays.reduce((l, a2) => Math.max(l, a2.length), 0);\n        let i = 0, j, d2, v;\n        for (; i < maxlen; ++i) {\n          d2 = derive(t);\n          for (j = 0; j < m2; ++j) {\n            d2[as[j]] = (v = arrays[j][i]) == null ? null : v;\n          }\n          if (index2) {\n            d2[index2] = i;\n          }\n          out.add.push(d2);\n        }\n      });\n      this.value = out.source = out.add;\n      if (index2) out.modifies(index2);\n      return out.modifies(as);\n    }\n  });\n  function Fold(params2) {\n    Transform.call(this, [], params2);\n  }\n  Fold.Definition = {\n    \"type\": \"Fold\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"key\", \"value\"]\n    }]\n  };\n  inherits(Fold, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, fnames = fields.map(accessorName), as = _.as || [\"key\", \"value\"], k = as[0], v = as[1], n = fields.length;\n      out.rem = this.value;\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        for (let i = 0, d2; i < n; ++i) {\n          d2 = derive(t);\n          d2[k] = fnames[i];\n          d2[v] = fields[i](t);\n          out.add.push(d2);\n        }\n      });\n      this.value = out.source = out.add;\n      return out.modifies(as);\n    }\n  });\n  function Formula(params2) {\n    Transform.call(this, null, params2);\n  }\n  Formula.Definition = {\n    \"type\": \"Formula\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"expr\",\n      \"type\": \"expr\",\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"required\": true\n    }, {\n      \"name\": \"initonly\",\n      \"type\": \"boolean\"\n    }]\n  };\n  inherits(Formula, Transform, {\n    transform(_, pulse2) {\n      const func = _.expr, as = _.as, mod = _.modified(), flag2 = _.initonly ? pulse2.ADD : mod ? pulse2.SOURCE : pulse2.modified(func.fields) || pulse2.modified(as) ? pulse2.ADD_MOD : pulse2.ADD;\n      if (mod) {\n        pulse2 = pulse2.materialize().reflow(true);\n      }\n      if (!_.initonly) {\n        pulse2.modifies(as);\n      }\n      return pulse2.visit(flag2, (t) => t[as] = func(t, _));\n    }\n  });\n  function Generate(params2) {\n    Transform.call(this, [], params2);\n  }\n  inherits(Generate, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.ALL), gen = _.generator;\n      let data2 = this.value, num = _.size - data2.length, add2, rem2, t;\n      if (num > 0) {\n        for (add2 = []; --num >= 0; ) {\n          add2.push(t = ingest$1(gen(_)));\n          data2.push(t);\n        }\n        out.add = out.add.length ? out.materialize(out.ADD).add.concat(add2) : add2;\n      } else {\n        rem2 = data2.slice(0, -num);\n        out.rem = out.rem.length ? out.materialize(out.REM).rem.concat(rem2) : rem2;\n        data2 = data2.slice(-num);\n      }\n      out.source = this.value = data2;\n      return out;\n    }\n  });\n  const Methods$1 = {\n    value: \"value\",\n    median,\n    mean,\n    min: min$2,\n    max: max$2\n  };\n  const Empty$1 = [];\n  function Impute(params2) {\n    Transform.call(this, [], params2);\n  }\n  Impute.Definition = {\n    \"type\": \"Impute\",\n    \"metadata\": {\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"keyvals\",\n      \"array\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"value\",\n      \"values\": [\"value\", \"mean\", \"median\", \"max\", \"min\"]\n    }, {\n      \"name\": \"value\",\n      \"default\": 0\n    }]\n  };\n  function getValue(_) {\n    var m2 = _.method || Methods$1.value, v;\n    if (Methods$1[m2] == null) {\n      error(\"Unrecognized imputation method: \" + m2);\n    } else if (m2 === Methods$1.value) {\n      v = _.value !== void 0 ? _.value : 0;\n      return () => v;\n    } else {\n      return Methods$1[m2];\n    }\n  }\n  function getField$1(_) {\n    const f = _.field;\n    return (t) => t ? f(t) : NaN;\n  }\n  inherits(Impute, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), impute = getValue(_), field2 = getField$1(_), fName = accessorName(_.field), kName = accessorName(_.key), gNames = (_.groupby || []).map(accessorName), groups = partition$4(pulse2.source, _.groupby, _.key, _.keyvals), curr = [], prev = this.value, m2 = groups.domain.length, group2, value2, gVals, kVal, g, i, j, l, n, t;\n      for (g = 0, l = groups.length; g < l; ++g) {\n        group2 = groups[g];\n        gVals = group2.values;\n        value2 = NaN;\n        for (j = 0; j < m2; ++j) {\n          if (group2[j] != null) continue;\n          kVal = groups.domain[j];\n          t = {\n            _impute: true\n          };\n          for (i = 0, n = gVals.length; i < n; ++i) t[gNames[i]] = gVals[i];\n          t[kName] = kVal;\n          t[fName] = Number.isNaN(value2) ? value2 = impute(group2, field2) : value2;\n          curr.push(ingest$1(t));\n        }\n      }\n      if (curr.length) out.add = out.materialize(out.ADD).add.concat(curr);\n      if (prev.length) out.rem = out.materialize(out.REM).rem.concat(prev);\n      this.value = curr;\n      return out;\n    }\n  });\n  function partition$4(data2, groupby, key2, keyvals) {\n    var get2 = (f) => f(t), groups = [], domain2 = keyvals ? keyvals.slice() : [], kMap = {}, gMap = {}, gVals, gKey, group2, i, j, k, n, t;\n    domain2.forEach((k2, i2) => kMap[k2] = i2 + 1);\n    for (i = 0, n = data2.length; i < n; ++i) {\n      t = data2[i];\n      k = key2(t);\n      j = kMap[k] || (kMap[k] = domain2.push(k));\n      gKey = (gVals = groupby ? groupby.map(get2) : Empty$1) + \"\";\n      if (!(group2 = gMap[gKey])) {\n        group2 = gMap[gKey] = [];\n        groups.push(group2);\n        group2.values = gVals;\n      }\n      group2[j - 1] = t;\n    }\n    groups.domain = domain2;\n    return groups;\n  }\n  function JoinAggregate(params2) {\n    Aggregate$1.call(this, params2);\n  }\n  JoinAggregate.Definition = {\n    \"type\": \"JoinAggregate\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidAggregateOps\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(JoinAggregate, Aggregate$1, {\n    transform(_, pulse2) {\n      const aggr = this, mod = _.modified();\n      let cells;\n      if (aggr.value && (mod || pulse2.modified(aggr._inputs, true))) {\n        cells = aggr.value = mod ? aggr.init(_) : {};\n        pulse2.visit(pulse2.SOURCE, (t) => aggr.add(t));\n      } else {\n        cells = aggr.value = aggr.value || this.init(_);\n        pulse2.visit(pulse2.REM, (t) => aggr.rem(t));\n        pulse2.visit(pulse2.ADD, (t) => aggr.add(t));\n      }\n      aggr.changes();\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        extend(t, cells[aggr.cellkey(t)].tuple);\n      });\n      return pulse2.reflow(mod).modifies(this._outputs);\n    },\n    changes() {\n      const adds = this._adds, mods = this._mods;\n      let i, n;\n      for (i = 0, n = this._alen; i < n; ++i) {\n        this.celltuple(adds[i]);\n        adds[i] = null;\n      }\n      for (i = 0, n = this._mlen; i < n; ++i) {\n        this.celltuple(mods[i]);\n        mods[i] = null;\n      }\n      this._alen = this._mlen = 0;\n    }\n  });\n  function KDE(params2) {\n    Transform.call(this, null, params2);\n  }\n  KDE.Definition = {\n    \"type\": \"KDE\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"cumulative\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"counts\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"minsteps\",\n      \"type\": \"number\",\n      \"default\": 25\n    }, {\n      \"name\": \"maxsteps\",\n      \"type\": \"number\",\n      \"default\": 200\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"value\", \"density\"]\n    }]\n  };\n  inherits(KDE, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(source2, _.groupby, _.field), names = (_.groupby || []).map(accessorName), bandwidth2 = _.bandwidth, method2 = _.cumulative ? \"cdf\" : \"pdf\", as = _.as || [\"value\", \"density\"], values2 = [];\n        let domain2 = _.extent, minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n        if (method2 !== \"pdf\" && method2 !== \"cdf\") {\n          error(\"Invalid density method: \" + method2);\n        }\n        if (_.resolve === \"shared\") {\n          if (!domain2) domain2 = extent(source2, _.field);\n          minsteps = maxsteps = _.steps || maxsteps;\n        }\n        groups.forEach((g) => {\n          const density2 = kde(g, bandwidth2)[method2], scale2 = _.counts ? g.length : 1, local = domain2 || extent(g);\n          sampleCurve(density2, local, minsteps, maxsteps).forEach((v) => {\n            const t = {};\n            for (let i = 0; i < names.length; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = v[0];\n            t[as[1]] = v[1] * scale2;\n            values2.push(ingest$1(t));\n          });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  function Key$1(params2) {\n    Operator.call(this, null, update$2, params2);\n  }\n  inherits(Key$1, Operator);\n  function update$2(_) {\n    return this.value && !_.modified() ? this.value : key(_.fields, _.flat);\n  }\n  function Load$1(params2) {\n    Transform.call(this, [], params2);\n    this._pending = null;\n  }\n  inherits(Load$1, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow;\n      if (this._pending) {\n        return output(this, pulse2, this._pending);\n      }\n      if (stop(_)) return pulse2.StopPropagation;\n      if (_.values) {\n        return output(this, pulse2, df.parse(_.values, _.format));\n      } else if (_.async) {\n        const p = df.request(_.url, _.format).then((res) => {\n          this._pending = array$4(res.data);\n          return (df2) => df2.touch(this);\n        });\n        return {\n          async: p\n        };\n      } else {\n        return df.request(_.url, _.format).then((res) => output(this, pulse2, array$4(res.data)));\n      }\n    }\n  });\n  function stop(_) {\n    return _.modified(\"async\") && !(_.modified(\"values\") || _.modified(\"url\") || _.modified(\"format\"));\n  }\n  function output(op, pulse2, data2) {\n    data2.forEach(ingest$1);\n    const out = pulse2.fork(pulse2.NO_FIELDS & pulse2.NO_SOURCE);\n    out.rem = op.value;\n    op.value = out.source = out.add = data2;\n    op._pending = null;\n    if (out.rem.length) out.clean(true);\n    return out;\n  }\n  function Lookup(params2) {\n    Transform.call(this, {}, params2);\n  }\n  Lookup.Definition = {\n    \"type\": \"Lookup\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"index\",\n      \"type\": \"index\",\n      \"params\": [{\n        \"name\": \"from\",\n        \"type\": \"data\",\n        \"required\": true\n      }, {\n        \"name\": \"key\",\n        \"type\": \"field\",\n        \"required\": true\n      }]\n    }, {\n      \"name\": \"values\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }, {\n      \"name\": \"default\",\n      \"default\": null\n    }]\n  };\n  inherits(Lookup, Transform, {\n    transform(_, pulse2) {\n      const keys2 = _.fields, index2 = _.index, values2 = _.values, defaultValue = _.default == null ? null : _.default, reset2 = _.modified(), n = keys2.length;\n      let flag2 = reset2 ? pulse2.SOURCE : pulse2.ADD, out = pulse2, as = _.as, set2, m2, mods;\n      if (values2) {\n        m2 = values2.length;\n        if (n > 1 && !as) {\n          error('Multi-field lookup requires explicit \"as\" parameter.');\n        }\n        if (as && as.length !== n * m2) {\n          error('The \"as\" parameter has too few output field names.');\n        }\n        as = as || values2.map(accessorName);\n        set2 = function(t) {\n          for (var i = 0, k = 0, j, v; i < n; ++i) {\n            v = index2.get(keys2[i](t));\n            if (v == null) for (j = 0; j < m2; ++j, ++k) t[as[k]] = defaultValue;\n            else for (j = 0; j < m2; ++j, ++k) t[as[k]] = values2[j](v);\n          }\n        };\n      } else {\n        if (!as) {\n          error(\"Missing output field names.\");\n        }\n        set2 = function(t) {\n          for (var i = 0, v; i < n; ++i) {\n            v = index2.get(keys2[i](t));\n            t[as[i]] = v == null ? defaultValue : v;\n          }\n        };\n      }\n      if (reset2) {\n        out = pulse2.reflow(true);\n      } else {\n        mods = keys2.some((k) => pulse2.modified(k.fields));\n        flag2 |= mods ? pulse2.MOD : 0;\n      }\n      pulse2.visit(flag2, set2);\n      return out.modifies(as);\n    }\n  });\n  function MultiExtent$1(params2) {\n    Operator.call(this, null, update$1, params2);\n  }\n  inherits(MultiExtent$1, Operator);\n  function update$1(_) {\n    if (this.value && !_.modified()) {\n      return this.value;\n    }\n    const ext = _.extents, n = ext.length;\n    let min2 = Infinity, max2 = -Infinity, i, e;\n    for (i = 0; i < n; ++i) {\n      e = ext[i];\n      if (e[0] < min2) min2 = e[0];\n      if (e[1] > max2) max2 = e[1];\n    }\n    return [min2, max2];\n  }\n  function MultiValues$1(params2) {\n    Operator.call(this, null, update, params2);\n  }\n  inherits(MultiValues$1, Operator);\n  function update(_) {\n    return this.value && !_.modified() ? this.value : _.values.reduce((data2, _2) => data2.concat(_2), []);\n  }\n  function Params$2(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Params$2, Transform, {\n    transform(_, pulse2) {\n      this.modified(_.modified());\n      this.value = _;\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function Pivot(params2) {\n    Aggregate$1.call(this, params2);\n  }\n  Pivot.Definition = {\n    \"type\": \"Pivot\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"value\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"op\",\n      \"type\": \"enum\",\n      \"values\": ValidAggregateOps,\n      \"default\": \"sum\"\n    }, {\n      \"name\": \"limit\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(Pivot, Aggregate$1, {\n    _transform: Aggregate$1.prototype.transform,\n    transform(_, pulse2) {\n      return this._transform(aggregateParams(_, pulse2), pulse2);\n    }\n  });\n  function aggregateParams(_, pulse2) {\n    const key2 = _.field, value2 = _.value, op = (_.op === \"count\" ? \"__count__\" : _.op) || \"sum\", fields = accessorFields(key2).concat(accessorFields(value2)), keys2 = pivotKeys(key2, _.limit || 0, pulse2);\n    if (pulse2.changed()) _.set(\"__pivot__\", null, null, true);\n    return {\n      key: _.key,\n      groupby: _.groupby,\n      ops: keys2.map(() => op),\n      fields: keys2.map((k) => get$4(k, key2, value2, fields)),\n      as: keys2.map((k) => k + \"\"),\n      modified: _.modified.bind(_)\n    };\n  }\n  function get$4(k, key2, value2, fields) {\n    return accessor((d2) => key2(d2) === k ? value2(d2) : NaN, fields, k + \"\");\n  }\n  function pivotKeys(key2, limit, pulse2) {\n    const map2 = {}, list = [];\n    pulse2.visit(pulse2.SOURCE, (t) => {\n      const k = key2(t);\n      if (!map2[k]) {\n        map2[k] = 1;\n        list.push(k);\n      }\n    });\n    list.sort(ascending$1);\n    return limit ? list.slice(0, limit) : list;\n  }\n  function PreFacet$1(params2) {\n    Facet$1.call(this, params2);\n  }\n  inherits(PreFacet$1, Facet$1, {\n    transform(_, pulse2) {\n      const flow = _.subflow, field2 = _.field, subflow = (t) => this.subflow(tupleid(t), flow, pulse2, t);\n      if (_.modified(\"field\") || field2 && pulse2.modified(accessorFields(field2))) {\n        error(\"PreFacet does not support field modification.\");\n      }\n      this.initTargets();\n      if (field2) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.mod(_2));\n        });\n        pulse2.visit(pulse2.ADD, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.add(ingest$1(_2)));\n        });\n        pulse2.visit(pulse2.REM, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.rem(_2));\n        });\n      } else {\n        pulse2.visit(pulse2.MOD, (t) => subflow(t).mod(t));\n        pulse2.visit(pulse2.ADD, (t) => subflow(t).add(t));\n        pulse2.visit(pulse2.REM, (t) => subflow(t).rem(t));\n      }\n      if (pulse2.clean()) {\n        pulse2.runAfter(() => this.clean());\n      }\n      return pulse2;\n    }\n  });\n  function Project(params2) {\n    Transform.call(this, null, params2);\n  }\n  Project.Definition = {\n    \"type\": \"Project\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }]\n  };\n  inherits(Project, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, as = fieldNames(_.fields, _.as || []), derive2 = fields ? (s2, t) => project(s2, t, fields, as) : rederive;\n      let lut;\n      if (this.value) {\n        lut = this.value;\n      } else {\n        pulse2 = pulse2.addAll();\n        lut = this.value = {};\n      }\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t);\n        out.rem.push(lut[id2]);\n        lut[id2] = null;\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        const dt = derive2(t, ingest$1({}));\n        lut[tupleid(t)] = dt;\n        out.add.push(dt);\n      });\n      pulse2.visit(pulse2.MOD, (t) => {\n        out.mod.push(derive2(t, lut[tupleid(t)]));\n      });\n      return out;\n    }\n  });\n  function project(s2, t, fields, as) {\n    for (let i = 0, n = fields.length; i < n; ++i) {\n      t[as[i]] = fields[i](s2);\n    }\n    return t;\n  }\n  function Proxy$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Proxy$1, Transform, {\n    transform(_, pulse2) {\n      this.value = _.value;\n      return _.modified(\"value\") ? pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS) : pulse2.StopPropagation;\n    }\n  });\n  function Quantile$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Quantile$1.Definition = {\n    \"type\": \"Quantile\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"probs\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 0.01\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"prob\", \"value\"]\n    }]\n  };\n  const EPSILON$2 = 1e-14;\n  inherits(Quantile$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), as = _.as || [\"prob\", \"value\"];\n      if (this.value && !_.modified() && !pulse2.changed()) {\n        out.source = this.value;\n        return out;\n      }\n      const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(source2, _.groupby, _.field), names = (_.groupby || []).map(accessorName), values2 = [], step = _.step || 0.01, p = _.probs || range$3(step / 2, 1 - EPSILON$2, step), n = p.length;\n      groups.forEach((g) => {\n        const q = quantiles(g, p);\n        for (let i = 0; i < n; ++i) {\n          const t = {};\n          for (let i2 = 0; i2 < names.length; ++i2) {\n            t[names[i2]] = g.dims[i2];\n          }\n          t[as[0]] = p[i];\n          t[as[1]] = q[i];\n          values2.push(ingest$1(t));\n        }\n      });\n      if (this.value) out.rem = this.value;\n      this.value = out.add = out.source = values2;\n      return out;\n    }\n  });\n  function Relay$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Relay$1, Transform, {\n    transform(_, pulse2) {\n      let out, lut;\n      if (this.value) {\n        lut = this.value;\n      } else {\n        out = pulse2 = pulse2.addAll();\n        lut = this.value = {};\n      }\n      if (_.derive) {\n        out = pulse2.fork(pulse2.NO_SOURCE);\n        pulse2.visit(pulse2.REM, (t) => {\n          const id2 = tupleid(t);\n          out.rem.push(lut[id2]);\n          lut[id2] = null;\n        });\n        pulse2.visit(pulse2.ADD, (t) => {\n          const dt = derive(t);\n          lut[tupleid(t)] = dt;\n          out.add.push(dt);\n        });\n        pulse2.visit(pulse2.MOD, (t) => {\n          const dt = lut[tupleid(t)];\n          for (const k in t) {\n            dt[k] = t[k];\n            out.modifies(k);\n          }\n          out.mod.push(dt);\n        });\n      }\n      return out;\n    }\n  });\n  function Sample(params2) {\n    Transform.call(this, [], params2);\n    this.count = 0;\n  }\n  Sample.Definition = {\n    \"type\": \"Sample\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"default\": 1e3\n    }]\n  };\n  inherits(Sample, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), mod = _.modified(\"size\"), num = _.size, map2 = this.value.reduce((m2, t) => (m2[tupleid(t)] = 1, m2), {});\n      let res = this.value, cnt = this.count, cap = 0;\n      function update2(t) {\n        let p, idx;\n        if (res.length < num) {\n          res.push(t);\n        } else {\n          idx = ~~((cnt + 1) * random());\n          if (idx < res.length && idx >= cap) {\n            p = res[idx];\n            if (map2[tupleid(p)]) out.rem.push(p);\n            res[idx] = t;\n          }\n        }\n        ++cnt;\n      }\n      if (pulse2.rem.length) {\n        pulse2.visit(pulse2.REM, (t) => {\n          const id2 = tupleid(t);\n          if (map2[id2]) {\n            map2[id2] = -1;\n            out.rem.push(t);\n          }\n          --cnt;\n        });\n        res = res.filter((t) => map2[tupleid(t)] !== -1);\n      }\n      if ((pulse2.rem.length || mod) && res.length < num && pulse2.source) {\n        cap = cnt = res.length;\n        pulse2.visit(pulse2.SOURCE, (t) => {\n          if (!map2[tupleid(t)]) update2(t);\n        });\n        cap = -1;\n      }\n      if (mod && res.length > num) {\n        const n = res.length - num;\n        for (let i = 0; i < n; ++i) {\n          map2[tupleid(res[i])] = -1;\n          out.rem.push(res[i]);\n        }\n        res = res.slice(n);\n      }\n      if (pulse2.mod.length) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          if (map2[tupleid(t)]) out.mod.push(t);\n        });\n      }\n      if (pulse2.add.length) {\n        pulse2.visit(pulse2.ADD, update2);\n      }\n      if (pulse2.add.length || cap < 0) {\n        out.add = res.filter((t) => !map2[tupleid(t)]);\n      }\n      this.count = cnt;\n      this.value = out.source = res;\n      return out;\n    }\n  });\n  function Sequence(params2) {\n    Transform.call(this, null, params2);\n  }\n  Sequence.Definition = {\n    \"type\": \"Sequence\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"start\",\n      \"type\": \"number\",\n      \"required\": true\n    }, {\n      \"name\": \"stop\",\n      \"type\": \"number\",\n      \"required\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"data\"\n    }]\n  };\n  inherits(Sequence, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !_.modified()) return;\n      const out = pulse2.materialize().fork(pulse2.MOD), as = _.as || \"data\";\n      out.rem = this.value ? pulse2.rem.concat(this.value) : pulse2.rem;\n      this.value = range$3(_.start, _.stop, _.step || 1).map((v) => {\n        const t = {};\n        t[as] = v;\n        return ingest$1(t);\n      });\n      out.add = pulse2.add.concat(this.value);\n      return out;\n    }\n  });\n  function Sieve$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Sieve$1, Transform, {\n    transform(_, pulse2) {\n      this.value = pulse2.source;\n      return pulse2.changed() ? pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS) : pulse2.StopPropagation;\n    }\n  });\n  function TimeUnit(params2) {\n    Transform.call(this, null, params2);\n  }\n  const OUTPUT = [\"unit0\", \"unit1\"];\n  TimeUnit.Definition = {\n    \"type\": \"TimeUnit\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"interval\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"units\",\n      \"type\": \"enum\",\n      \"values\": TIME_UNITS,\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"maxbins\",\n      \"type\": \"number\",\n      \"default\": 40\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"date\",\n      \"array\": true\n    }, {\n      \"name\": \"timezone\",\n      \"type\": \"enum\",\n      \"default\": \"local\",\n      \"values\": [\"local\", \"utc\"]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": OUTPUT\n    }]\n  };\n  inherits(TimeUnit, Transform, {\n    transform(_, pulse2) {\n      const field2 = _.field, band2 = _.interval !== false, utc = _.timezone === \"utc\", floor2 = this._floor(_, pulse2), offset2 = (utc ? utcInterval : timeInterval)(floor2.unit).offset, as = _.as || OUTPUT, u0 = as[0], u1 = as[1], step = floor2.step;\n      let min2 = floor2.start || Infinity, max2 = floor2.stop || -Infinity, flag2 = pulse2.ADD;\n      if (_.modified() || pulse2.changed(pulse2.REM) || pulse2.modified(accessorFields(field2))) {\n        pulse2 = pulse2.reflow(true);\n        flag2 = pulse2.SOURCE;\n        min2 = Infinity;\n        max2 = -Infinity;\n      }\n      pulse2.visit(flag2, (t) => {\n        const v = field2(t);\n        let a2, b2;\n        if (v == null) {\n          t[u0] = null;\n          if (band2) t[u1] = null;\n        } else {\n          t[u0] = a2 = b2 = floor2(v);\n          if (band2) t[u1] = b2 = offset2(a2, step);\n          if (a2 < min2) min2 = a2;\n          if (b2 > max2) max2 = b2;\n        }\n      });\n      floor2.start = min2;\n      floor2.stop = max2;\n      return pulse2.modifies(band2 ? as : u0);\n    },\n    _floor(_, pulse2) {\n      const utc = _.timezone === \"utc\";\n      const {\n        units,\n        step\n      } = _.units ? {\n        units: _.units,\n        step: _.step || 1\n      } : bin$1({\n        extent: _.extent || extent(pulse2.materialize(pulse2.SOURCE).source, _.field),\n        maxbins: _.maxbins\n      });\n      const tunits = timeUnits(units), prev = this.value || {}, floor2 = (utc ? utcFloor : timeFloor)(tunits, step);\n      floor2.unit = peek$1(tunits);\n      floor2.units = tunits;\n      floor2.step = step;\n      floor2.start = prev.start;\n      floor2.stop = prev.stop;\n      return this.value = floor2;\n    }\n  });\n  function TupleIndex(params2) {\n    Transform.call(this, fastmap(), params2);\n  }\n  inherits(TupleIndex, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, field2 = _.field, index2 = this.value, set2 = (t) => index2.set(field2(t), t);\n      let mod = true;\n      if (_.modified(\"field\") || pulse2.modified(field2.fields)) {\n        index2.clear();\n        pulse2.visit(pulse2.SOURCE, set2);\n      } else if (pulse2.changed()) {\n        pulse2.visit(pulse2.REM, (t) => index2.delete(field2(t)));\n        pulse2.visit(pulse2.ADD, set2);\n      } else {\n        mod = false;\n      }\n      this.modified(mod);\n      if (index2.empty > df.cleanThreshold) df.runAfter(index2.clean);\n      return pulse2.fork();\n    }\n  });\n  function Values$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Values$1, Transform, {\n    transform(_, pulse2) {\n      const run2 = !this.value || _.modified(\"field\") || _.modified(\"sort\") || pulse2.changed() || _.sort && pulse2.modified(_.sort.fields);\n      if (run2) {\n        this.value = (_.sort ? pulse2.source.slice().sort(stableCompare(_.sort)) : pulse2.source).map(_.field);\n      }\n    }\n  });\n  function WindowOp(op, field2, param2, as) {\n    const fn2 = WindowOps[op](field2, param2);\n    return {\n      init: fn2.init || zero$1,\n      update: function(w2, t) {\n        t[as] = fn2.next(w2);\n      }\n    };\n  }\n  const WindowOps = {\n    row_number: function() {\n      return {\n        next: (w2) => w2.index + 1\n      };\n    },\n    rank: function() {\n      let rank2;\n      return {\n        init: () => rank2 = 1,\n        next: (w2) => {\n          const i = w2.index, data2 = w2.data;\n          return i && w2.compare(data2[i - 1], data2[i]) ? rank2 = i + 1 : rank2;\n        }\n      };\n    },\n    dense_rank: function() {\n      let drank;\n      return {\n        init: () => drank = 1,\n        next: (w2) => {\n          const i = w2.index, d2 = w2.data;\n          return i && w2.compare(d2[i - 1], d2[i]) ? ++drank : drank;\n        }\n      };\n    },\n    percent_rank: function() {\n      const rank2 = WindowOps.rank(), next = rank2.next;\n      return {\n        init: rank2.init,\n        next: (w2) => (next(w2) - 1) / (w2.data.length - 1)\n      };\n    },\n    cume_dist: function() {\n      let cume;\n      return {\n        init: () => cume = 0,\n        next: (w2) => {\n          const d2 = w2.data, c2 = w2.compare;\n          let i = w2.index;\n          if (cume < i) {\n            while (i + 1 < d2.length && !c2(d2[i], d2[i + 1])) ++i;\n            cume = i;\n          }\n          return (1 + cume) / d2.length;\n        }\n      };\n    },\n    ntile: function(field2, num) {\n      num = +num;\n      if (!(num > 0)) error(\"ntile num must be greater than zero.\");\n      const cume = WindowOps.cume_dist(), next = cume.next;\n      return {\n        init: cume.init,\n        next: (w2) => Math.ceil(num * next(w2))\n      };\n    },\n    lag: function(field2, offset2) {\n      offset2 = +offset2 || 1;\n      return {\n        next: (w2) => {\n          const i = w2.index - offset2;\n          return i >= 0 ? field2(w2.data[i]) : null;\n        }\n      };\n    },\n    lead: function(field2, offset2) {\n      offset2 = +offset2 || 1;\n      return {\n        next: (w2) => {\n          const i = w2.index + offset2, d2 = w2.data;\n          return i < d2.length ? field2(d2[i]) : null;\n        }\n      };\n    },\n    first_value: function(field2) {\n      return {\n        next: (w2) => field2(w2.data[w2.i0])\n      };\n    },\n    last_value: function(field2) {\n      return {\n        next: (w2) => field2(w2.data[w2.i1 - 1])\n      };\n    },\n    nth_value: function(field2, nth) {\n      nth = +nth;\n      if (!(nth > 0)) error(\"nth_value nth must be greater than zero.\");\n      return {\n        next: (w2) => {\n          const i = w2.i0 + (nth - 1);\n          return i < w2.i1 ? field2(w2.data[i]) : null;\n        }\n      };\n    },\n    prev_value: function(field2) {\n      let prev;\n      return {\n        init: () => prev = null,\n        next: (w2) => {\n          const v = field2(w2.data[w2.index]);\n          return v != null ? prev = v : prev;\n        }\n      };\n    },\n    next_value: function(field2) {\n      let v, i;\n      return {\n        init: () => (v = null, i = -1),\n        next: (w2) => {\n          const d2 = w2.data;\n          return w2.index <= i ? v : (i = find$2(field2, d2, w2.index)) < 0 ? (i = d2.length, v = null) : v = field2(d2[i]);\n        }\n      };\n    }\n  };\n  function find$2(field2, data2, index2) {\n    for (let n = data2.length; index2 < n; ++index2) {\n      const v = field2(data2[index2]);\n      if (v != null) return index2;\n    }\n    return -1;\n  }\n  const ValidWindowOps = Object.keys(WindowOps);\n  function WindowState(_) {\n    const ops2 = array$4(_.ops), fields = array$4(_.fields), params2 = array$4(_.params), aggregate_params = array$4(_.aggregate_params), as = array$4(_.as), outputs = this.outputs = [], windows = this.windows = [], inputs = {}, map2 = {}, counts = [], measures = [];\n    let countOnly = true;\n    function visitInputs(f) {\n      array$4(accessorFields(f)).forEach((_2) => inputs[_2] = 1);\n    }\n    visitInputs(_.sort);\n    ops2.forEach((op, i) => {\n      const field2 = fields[i], param2 = params2[i], aggregate_param = aggregate_params[i] || null, mname = accessorName(field2), name = measureName(op, mname, as[i]);\n      visitInputs(field2);\n      outputs.push(name);\n      if (has$1(WindowOps, op)) {\n        windows.push(WindowOp(op, field2, param2, name));\n      } else {\n        if (field2 == null && op !== \"count\") {\n          error(\"Null aggregate field specified.\");\n        }\n        if (op === \"count\") {\n          counts.push(name);\n          return;\n        }\n        countOnly = false;\n        let m2 = map2[mname];\n        if (!m2) {\n          m2 = map2[mname] = [];\n          m2.field = field2;\n          measures.push(m2);\n        }\n        m2.push(createMeasure(op, aggregate_param, name));\n      }\n    });\n    if (counts.length || measures.length) {\n      this.cell = cell(measures, counts, countOnly);\n    }\n    this.inputs = Object.keys(inputs);\n  }\n  const prototype = WindowState.prototype;\n  prototype.init = function() {\n    this.windows.forEach((_) => _.init());\n    if (this.cell) this.cell.init();\n  };\n  prototype.update = function(w2, t) {\n    const cell2 = this.cell, wind = this.windows, data2 = w2.data, m2 = wind && wind.length;\n    let j;\n    if (cell2) {\n      for (j = w2.p0; j < w2.i0; ++j) cell2.rem(data2[j]);\n      for (j = w2.p1; j < w2.i1; ++j) cell2.add(data2[j]);\n      cell2.set(t);\n    }\n    for (j = 0; j < m2; ++j) wind[j].update(w2, t);\n  };\n  function cell(measures, counts, countOnly) {\n    measures = measures.map((m2) => compileMeasures(m2, m2.field));\n    const cell2 = {\n      num: 0,\n      agg: null,\n      store: false,\n      count: counts\n    };\n    if (!countOnly) {\n      var n = measures.length, a2 = cell2.agg = Array(n), i = 0;\n      for (; i < n; ++i) a2[i] = new measures[i](cell2);\n    }\n    if (cell2.store) {\n      var store = cell2.data = new TupleStore();\n    }\n    cell2.add = function(t) {\n      cell2.num += 1;\n      if (countOnly) return;\n      if (store) store.add(t);\n      for (let i2 = 0; i2 < n; ++i2) {\n        a2[i2].add(a2[i2].get(t), t);\n      }\n    };\n    cell2.rem = function(t) {\n      cell2.num -= 1;\n      if (countOnly) return;\n      if (store) store.rem(t);\n      for (let i2 = 0; i2 < n; ++i2) {\n        a2[i2].rem(a2[i2].get(t), t);\n      }\n    };\n    cell2.set = function(t) {\n      let i2, n2;\n      if (store) store.values();\n      for (i2 = 0, n2 = counts.length; i2 < n2; ++i2) t[counts[i2]] = cell2.num;\n      if (!countOnly) for (i2 = 0, n2 = a2.length; i2 < n2; ++i2) a2[i2].set(t);\n    };\n    cell2.init = function() {\n      cell2.num = 0;\n      if (store) store.reset();\n      for (let i2 = 0; i2 < n; ++i2) a2[i2].init();\n    };\n    return cell2;\n  }\n  function Window(params2) {\n    Transform.call(this, {}, params2);\n    this._mlen = 0;\n    this._mods = [];\n  }\n  Window.Definition = {\n    \"type\": \"Window\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidWindowOps.concat(ValidAggregateOps)\n    }, {\n      \"name\": \"params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"aggregate_params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"frame\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [null, 0]\n    }, {\n      \"name\": \"ignorePeers\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }]\n  };\n  inherits(Window, Transform, {\n    transform(_, pulse2) {\n      this.stamp = pulse2.stamp;\n      const mod = _.modified(), cmp = stableCompare(_.sort), key2 = groupkey(_.groupby), group2 = (t) => this.group(key2(t));\n      let state = this.state;\n      if (!state || mod) {\n        state = this.state = new WindowState(_);\n      }\n      if (mod || pulse2.modified(state.inputs)) {\n        this.value = {};\n        pulse2.visit(pulse2.SOURCE, (t) => group2(t).add(t));\n      } else {\n        pulse2.visit(pulse2.REM, (t) => group2(t).remove(t));\n        pulse2.visit(pulse2.ADD, (t) => group2(t).add(t));\n      }\n      for (let i = 0, n = this._mlen; i < n; ++i) {\n        processPartition(this._mods[i], state, cmp, _);\n      }\n      this._mlen = 0;\n      this._mods = [];\n      return pulse2.reflow(mod).modifies(state.outputs);\n    },\n    group(key2) {\n      let group2 = this.value[key2];\n      if (!group2) {\n        group2 = this.value[key2] = SortedList(tupleid);\n        group2.stamp = -1;\n      }\n      if (group2.stamp < this.stamp) {\n        group2.stamp = this.stamp;\n        this._mods[this._mlen++] = group2;\n      }\n      return group2;\n    }\n  });\n  function processPartition(list, state, cmp, _) {\n    const sort2 = _.sort, range2 = sort2 && !_.ignorePeers, frame2 = _.frame || [null, 0], data2 = list.data(cmp), n = data2.length, b2 = range2 ? bisector(sort2) : null, w2 = {\n      i0: 0,\n      i1: 0,\n      p0: 0,\n      p1: 0,\n      index: 0,\n      data: data2,\n      compare: sort2 || constant$4(-1)\n    };\n    state.init();\n    for (let i = 0; i < n; ++i) {\n      setWindow(w2, frame2, i, n);\n      if (range2) adjustRange(w2, b2);\n      state.update(w2, data2[i]);\n    }\n  }\n  function setWindow(w2, f, i, n) {\n    w2.p0 = w2.i0;\n    w2.p1 = w2.i1;\n    w2.i0 = f[0] == null ? 0 : Math.max(0, i - Math.abs(f[0]));\n    w2.i1 = f[1] == null ? n : Math.min(n, i + Math.abs(f[1]) + 1);\n    w2.index = i;\n  }\n  function adjustRange(w2, bisect2) {\n    const r0 = w2.i0, r1 = w2.i1 - 1, c2 = w2.compare, d2 = w2.data, n = d2.length - 1;\n    if (r0 > 0 && !c2(d2[r0], d2[r0 - 1])) w2.i0 = bisect2.left(d2, d2[r0]);\n    if (r1 < n && !c2(d2[r1], d2[r1 + 1])) w2.i1 = bisect2.right(d2, d2[r1]);\n  }\n  const tx = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    aggregate: Aggregate$1,\n    bin: Bin,\n    collect: Collect$1,\n    compare: Compare$1,\n    countpattern: CountPattern,\n    cross: Cross,\n    density: Density,\n    dotbin: DotBin,\n    expression: Expression$1,\n    extent: Extent,\n    facet: Facet$1,\n    field: Field$1,\n    filter: Filter,\n    flatten: Flatten,\n    fold: Fold,\n    formula: Formula,\n    generate: Generate,\n    impute: Impute,\n    joinaggregate: JoinAggregate,\n    kde: KDE,\n    key: Key$1,\n    load: Load$1,\n    lookup: Lookup,\n    multiextent: MultiExtent$1,\n    multivalues: MultiValues$1,\n    params: Params$2,\n    pivot: Pivot,\n    prefacet: PreFacet$1,\n    project: Project,\n    proxy: Proxy$1,\n    quantile: Quantile$1,\n    relay: Relay$1,\n    sample: Sample,\n    sequence: Sequence,\n    sieve: Sieve$1,\n    subflow: Subflow,\n    timeunit: TimeUnit,\n    tupleindex: TupleIndex,\n    values: Values$1,\n    window: Window\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function constant$2(x2) {\n    return function constant2() {\n      return x2;\n    };\n  }\n  const abs$2 = Math.abs;\n  const atan2$1 = Math.atan2;\n  const cos$2 = Math.cos;\n  const max$1 = Math.max;\n  const min$1 = Math.min;\n  const sin$2 = Math.sin;\n  const sqrt$2 = Math.sqrt;\n  const epsilon$5 = 1e-12;\n  const pi$3 = Math.PI;\n  const halfPi$2 = pi$3 / 2;\n  const tau$3 = 2 * pi$3;\n  function acos$1(x2) {\n    return x2 > 1 ? 0 : x2 < -1 ? pi$3 : Math.acos(x2);\n  }\n  function asin$2(x2) {\n    return x2 >= 1 ? halfPi$2 : x2 <= -1 ? -halfPi$2 : Math.asin(x2);\n  }\n  const pi$2 = Math.PI, tau$2 = 2 * pi$2, epsilon$4 = 1e-6, tauEpsilon = tau$2 - epsilon$4;\n  function append$1(strings2) {\n    this._ += strings2[0];\n    for (let i = 1, n = strings2.length; i < n; ++i) {\n      this._ += arguments[i] + strings2[i];\n    }\n  }\n  function appendRound$1(digits) {\n    let d2 = Math.floor(digits);\n    if (!(d2 >= 0)) throw new Error(`invalid digits: ${digits}`);\n    if (d2 > 15) return append$1;\n    const k = 10 ** d2;\n    return function(strings2) {\n      this._ += strings2[0];\n      for (let i = 1, n = strings2.length; i < n; ++i) {\n        this._ += Math.round(arguments[i] * k) / k + strings2[i];\n      }\n    };\n  }\n  let Path$1 = class Path {\n    constructor(digits) {\n      this._x0 = this._y0 = // start of current subpath\n      this._x1 = this._y1 = null;\n      this._ = \"\";\n      this._append = digits == null ? append$1 : appendRound$1(digits);\n    }\n    moveTo(x2, y2) {\n      this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;\n    }\n    closePath() {\n      if (this._x1 !== null) {\n        this._x1 = this._x0, this._y1 = this._y0;\n        this._append`Z`;\n      }\n    }\n    lineTo(x2, y2) {\n      this._append`L${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    quadraticCurveTo(x12, y12, x2, y2) {\n      this._append`Q${+x12},${+y12},${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    bezierCurveTo(x12, y12, x2, y2, x3, y3) {\n      this._append`C${+x12},${+y12},${+x2},${+y2},${this._x1 = +x3},${this._y1 = +y3}`;\n    }\n    arcTo(x12, y12, x2, y2, r) {\n      x12 = +x12, y12 = +y12, x2 = +x2, y2 = +y2, r = +r;\n      if (r < 0) throw new Error(`negative radius: ${r}`);\n      let x02 = this._x1, y02 = this._y1, x21 = x2 - x12, y21 = y2 - y12, x01 = x02 - x12, y01 = y02 - y12, l01_2 = x01 * x01 + y01 * y01;\n      if (this._x1 === null) {\n        this._append`M${this._x1 = x12},${this._y1 = y12}`;\n      } else if (!(l01_2 > epsilon$4)) ;\n      else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$4) || !r) {\n        this._append`L${this._x1 = x12},${this._y1 = y12}`;\n      } else {\n        let x20 = x2 - x02, y20 = y2 - y02, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;\n        if (Math.abs(t01 - 1) > epsilon$4) {\n          this._append`L${x12 + t01 * x01},${y12 + t01 * y01}`;\n        }\n        this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x12 + t21 * x21},${this._y1 = y12 + t21 * y21}`;\n      }\n    }\n    arc(x2, y2, r, a0, a1, ccw) {\n      x2 = +x2, y2 = +y2, r = +r, ccw = !!ccw;\n      if (r < 0) throw new Error(`negative radius: ${r}`);\n      let dx = r * Math.cos(a0), dy = r * Math.sin(a0), x02 = x2 + dx, y02 = y2 + dy, cw2 = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;\n      if (this._x1 === null) {\n        this._append`M${x02},${y02}`;\n      } else if (Math.abs(this._x1 - x02) > epsilon$4 || Math.abs(this._y1 - y02) > epsilon$4) {\n        this._append`L${x02},${y02}`;\n      }\n      if (!r) return;\n      if (da < 0) da = da % tau$2 + tau$2;\n      if (da > tauEpsilon) {\n        this._append`A${r},${r},0,1,${cw2},${x2 - dx},${y2 - dy}A${r},${r},0,1,${cw2},${this._x1 = x02},${this._y1 = y02}`;\n      } else if (da > epsilon$4) {\n        this._append`A${r},${r},0,${+(da >= pi$2)},${cw2},${this._x1 = x2 + r * Math.cos(a1)},${this._y1 = y2 + r * Math.sin(a1)}`;\n      }\n    }\n    rect(x2, y2, w2, h2) {\n      this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${w2 = +w2}v${+h2}h${-w2}Z`;\n    }\n    toString() {\n      return this._;\n    }\n  };\n  function path$3() {\n    return new Path$1();\n  }\n  path$3.prototype = Path$1.prototype;\n  function withPath(shape2) {\n    let digits = 3;\n    shape2.digits = function(_) {\n      if (!arguments.length) return digits;\n      if (_ == null) {\n        digits = null;\n      } else {\n        const d2 = Math.floor(_);\n        if (!(d2 >= 0)) throw new RangeError(`invalid digits: ${_}`);\n        digits = d2;\n      }\n      return shape2;\n    };\n    return () => new Path$1(digits);\n  }\n  function arcInnerRadius(d2) {\n    return d2.innerRadius;\n  }\n  function arcOuterRadius(d2) {\n    return d2.outerRadius;\n  }\n  function arcStartAngle(d2) {\n    return d2.startAngle;\n  }\n  function arcEndAngle(d2) {\n    return d2.endAngle;\n  }\n  function arcPadAngle(d2) {\n    return d2 && d2.padAngle;\n  }\n  function intersect$3(x02, y02, x12, y12, x2, y2, x3, y3) {\n    var x10 = x12 - x02, y10 = y12 - y02, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10;\n    if (t * t < epsilon$5) return;\n    t = (x32 * (y02 - y2) - y32 * (x02 - x2)) / t;\n    return [x02 + t * x10, y02 + t * y10];\n  }\n  function cornerTangents(x02, y02, x12, y12, r1, rc, cw2) {\n    var x01 = x02 - x12, y01 = y02 - y12, lo = (cw2 ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x02 + ox, y11 = y02 + oy, x10 = x12 + ox, y10 = y12 + oy, x002 = (x11 + x10) / 2, y002 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D2 = x11 * y10 - x10 * y11, d3 = (dy < 0 ? -1 : 1) * sqrt$2(max$1(0, r * r * d2 - D2 * D2)), cx0 = (D2 * dy - dx * d3) / d2, cy0 = (-D2 * dx - dy * d3) / d2, cx1 = (D2 * dy + dx * d3) / d2, cy1 = (-D2 * dx + dy * d3) / d2, dx0 = cx0 - x002, dy0 = cy0 - y002, dx1 = cx1 - x002, dy1 = cy1 - y002;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return {\n      cx: cx0,\n      cy: cy0,\n      x01: -ox,\n      y01: -oy,\n      x11: cx0 * (r1 / r - 1),\n      y11: cy0 * (r1 / r - 1)\n    };\n  }\n  function arc$2$1() {\n    var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant$2(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context2 = null, path2 = withPath(arc2);\n    function arc2() {\n      var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi$2, a1 = endAngle.apply(this, arguments) - halfPi$2, da = abs$2(a1 - a0), cw2 = a1 > a0;\n      if (!context2) context2 = buffer = path2();\n      if (r1 < r0) r = r1, r1 = r0, r0 = r;\n      if (!(r1 > epsilon$5)) context2.moveTo(0, 0);\n      else if (da > tau$3 - epsilon$5) {\n        context2.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));\n        context2.arc(0, 0, r1, a0, a1, !cw2);\n        if (r0 > epsilon$5) {\n          context2.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));\n          context2.arc(0, 0, r0, a1, a0, cw2);\n        }\n      } else {\n        var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > epsilon$5 && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)), rc = min$1(abs$2(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t02, t12;\n        if (rp > epsilon$5) {\n          var p02 = asin$2(rp / r0 * sin$2(ap)), p1 = asin$2(rp / r1 * sin$2(ap));\n          if ((da0 -= p02 * 2) > epsilon$5) p02 *= cw2 ? 1 : -1, a00 += p02, a10 -= p02;\n          else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n          if ((da1 -= p1 * 2) > epsilon$5) p1 *= cw2 ? 1 : -1, a01 += p1, a11 -= p1;\n          else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n        }\n        var x01 = r1 * cos$2(a01), y01 = r1 * sin$2(a01), x10 = r0 * cos$2(a10), y10 = r0 * sin$2(a10);\n        if (rc > epsilon$5) {\n          var x11 = r1 * cos$2(a11), y11 = r1 * sin$2(a11), x002 = r0 * cos$2(a00), y002 = r0 * sin$2(a00), oc;\n          if (da < pi$3) {\n            if (oc = intersect$3(x01, y01, x002, y002, x11, y11, x10, y10)) {\n              var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2), lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);\n              rc0 = min$1(rc, (r0 - lc) / (kc - 1));\n              rc1 = min$1(rc, (r1 - lc) / (kc + 1));\n            } else {\n              rc0 = rc1 = 0;\n            }\n          }\n        }\n        if (!(da1 > epsilon$5)) context2.moveTo(x01, y01);\n        else if (rc1 > epsilon$5) {\n          t02 = cornerTangents(x002, y002, x01, y01, r1, rc1, cw2);\n          t12 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw2);\n          context2.moveTo(t02.cx + t02.x01, t02.cy + t02.y01);\n          if (rc1 < rc) context2.arc(t02.cx, t02.cy, rc1, atan2$1(t02.y01, t02.x01), atan2$1(t12.y01, t12.x01), !cw2);\n          else {\n            context2.arc(t02.cx, t02.cy, rc1, atan2$1(t02.y01, t02.x01), atan2$1(t02.y11, t02.x11), !cw2);\n            context2.arc(0, 0, r1, atan2$1(t02.cy + t02.y11, t02.cx + t02.x11), atan2$1(t12.cy + t12.y11, t12.cx + t12.x11), !cw2);\n            context2.arc(t12.cx, t12.cy, rc1, atan2$1(t12.y11, t12.x11), atan2$1(t12.y01, t12.x01), !cw2);\n          }\n        } else context2.moveTo(x01, y01), context2.arc(0, 0, r1, a01, a11, !cw2);\n        if (!(r0 > epsilon$5) || !(da0 > epsilon$5)) context2.lineTo(x10, y10);\n        else if (rc0 > epsilon$5) {\n          t02 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw2);\n          t12 = cornerTangents(x01, y01, x002, y002, r0, -rc0, cw2);\n          context2.lineTo(t02.cx + t02.x01, t02.cy + t02.y01);\n          if (rc0 < rc) context2.arc(t02.cx, t02.cy, rc0, atan2$1(t02.y01, t02.x01), atan2$1(t12.y01, t12.x01), !cw2);\n          else {\n            context2.arc(t02.cx, t02.cy, rc0, atan2$1(t02.y01, t02.x01), atan2$1(t02.y11, t02.x11), !cw2);\n            context2.arc(0, 0, r0, atan2$1(t02.cy + t02.y11, t02.cx + t02.x11), atan2$1(t12.cy + t12.y11, t12.cx + t12.x11), cw2);\n            context2.arc(t12.cx, t12.cy, rc0, atan2$1(t12.y11, t12.x11), atan2$1(t12.y01, t12.x01), !cw2);\n          }\n        } else context2.arc(0, 0, r0, a10, a00, cw2);\n      }\n      context2.closePath();\n      if (buffer) return context2 = null, buffer + \"\" || null;\n    }\n    arc2.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a2 = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$3 / 2;\n      return [cos$2(a2) * r, sin$2(a2) * r];\n    };\n    arc2.innerRadius = function(_) {\n      return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : innerRadius;\n    };\n    arc2.outerRadius = function(_) {\n      return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : outerRadius;\n    };\n    arc2.cornerRadius = function(_) {\n      return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : cornerRadius;\n    };\n    arc2.padRadius = function(_) {\n      return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant$2(+_), arc2) : padRadius;\n    };\n    arc2.startAngle = function(_) {\n      return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : startAngle;\n    };\n    arc2.endAngle = function(_) {\n      return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : endAngle;\n    };\n    arc2.padAngle = function(_) {\n      return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant$2(+_), arc2) : padAngle;\n    };\n    arc2.context = function(_) {\n      return arguments.length ? (context2 = _ == null ? null : _, arc2) : context2;\n    };\n    return arc2;\n  }\n  function array$3(x2) {\n    return typeof x2 === \"object\" && \"length\" in x2 ? x2 : Array.from(x2);\n  }\n  function Linear$1(context2) {\n    this._context = context2;\n  }\n  Linear$1.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n        // falls through\n        default:\n          this._context.lineTo(x2, y2);\n          break;\n      }\n    }\n  };\n  function curveLinear(context2) {\n    return new Linear$1(context2);\n  }\n  function x$3(p) {\n    return p[0];\n  }\n  function y$3(p) {\n    return p[1];\n  }\n  function line$2$1(x2, y2) {\n    var defined = constant$2(true), context2 = null, curve2 = curveLinear, output2 = null, path2 = withPath(line2);\n    x2 = typeof x2 === \"function\" ? x2 : x2 === void 0 ? x$3 : constant$2(x2);\n    y2 = typeof y2 === \"function\" ? y2 : y2 === void 0 ? y$3 : constant$2(y2);\n    function line2(data2) {\n      var i, n = (data2 = array$3(data2)).length, d2, defined0 = false, buffer;\n      if (context2 == null) output2 = curve2(buffer = path2());\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d2 = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) output2.lineStart();\n          else output2.lineEnd();\n        }\n        if (defined0) output2.point(+x2(d2, i, data2), +y2(d2, i, data2));\n      }\n      if (buffer) return output2 = null, buffer + \"\" || null;\n    }\n    line2.x = function(_) {\n      return arguments.length ? (x2 = typeof _ === \"function\" ? _ : constant$2(+_), line2) : x2;\n    };\n    line2.y = function(_) {\n      return arguments.length ? (y2 = typeof _ === \"function\" ? _ : constant$2(+_), line2) : y2;\n    };\n    line2.defined = function(_) {\n      return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant$2(!!_), line2) : defined;\n    };\n    line2.curve = function(_) {\n      return arguments.length ? (curve2 = _, context2 != null && (output2 = curve2(context2)), line2) : curve2;\n    };\n    line2.context = function(_) {\n      return arguments.length ? (_ == null ? context2 = output2 = null : output2 = curve2(context2 = _), line2) : context2;\n    };\n    return line2;\n  }\n  function area$2$1(x02, y02, y12) {\n    var x12 = null, defined = constant$2(true), context2 = null, curve2 = curveLinear, output2 = null, path2 = withPath(area2);\n    x02 = typeof x02 === \"function\" ? x02 : x02 === void 0 ? x$3 : constant$2(+x02);\n    y02 = typeof y02 === \"function\" ? y02 : y02 === void 0 ? constant$2(0) : constant$2(+y02);\n    y12 = typeof y12 === \"function\" ? y12 : y12 === void 0 ? y$3 : constant$2(+y12);\n    function area2(data2) {\n      var i, j, k, n = (data2 = array$3(data2)).length, d2, defined0 = false, buffer, x0z = new Array(n), y0z = new Array(n);\n      if (context2 == null) output2 = curve2(buffer = path2());\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d2 = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) {\n            j = i;\n            output2.areaStart();\n            output2.lineStart();\n          } else {\n            output2.lineEnd();\n            output2.lineStart();\n            for (k = i - 1; k >= j; --k) {\n              output2.point(x0z[k], y0z[k]);\n            }\n            output2.lineEnd();\n            output2.areaEnd();\n          }\n        }\n        if (defined0) {\n          x0z[i] = +x02(d2, i, data2), y0z[i] = +y02(d2, i, data2);\n          output2.point(x12 ? +x12(d2, i, data2) : x0z[i], y12 ? +y12(d2, i, data2) : y0z[i]);\n        }\n      }\n      if (buffer) return output2 = null, buffer + \"\" || null;\n    }\n    function arealine() {\n      return line$2$1().defined(defined).curve(curve2).context(context2);\n    }\n    area2.x = function(_) {\n      return arguments.length ? (x02 = typeof _ === \"function\" ? _ : constant$2(+_), x12 = null, area2) : x02;\n    };\n    area2.x0 = function(_) {\n      return arguments.length ? (x02 = typeof _ === \"function\" ? _ : constant$2(+_), area2) : x02;\n    };\n    area2.x1 = function(_) {\n      return arguments.length ? (x12 = _ == null ? null : typeof _ === \"function\" ? _ : constant$2(+_), area2) : x12;\n    };\n    area2.y = function(_) {\n      return arguments.length ? (y02 = typeof _ === \"function\" ? _ : constant$2(+_), y12 = null, area2) : y02;\n    };\n    area2.y0 = function(_) {\n      return arguments.length ? (y02 = typeof _ === \"function\" ? _ : constant$2(+_), area2) : y02;\n    };\n    area2.y1 = function(_) {\n      return arguments.length ? (y12 = _ == null ? null : typeof _ === \"function\" ? _ : constant$2(+_), area2) : y12;\n    };\n    area2.lineX0 = area2.lineY0 = function() {\n      return arealine().x(x02).y(y02);\n    };\n    area2.lineY1 = function() {\n      return arealine().x(x02).y(y12);\n    };\n    area2.lineX1 = function() {\n      return arealine().x(x12).y(y02);\n    };\n    area2.defined = function(_) {\n      return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant$2(!!_), area2) : defined;\n    };\n    area2.curve = function(_) {\n      return arguments.length ? (curve2 = _, context2 != null && (output2 = curve2(context2)), area2) : curve2;\n    };\n    area2.context = function(_) {\n      return arguments.length ? (_ == null ? context2 = output2 = null : output2 = curve2(context2 = _), area2) : context2;\n    };\n    return area2;\n  }\n  const circle = {\n    draw(context2, size) {\n      const r = sqrt$2(size / pi$3);\n      context2.moveTo(r, 0);\n      context2.arc(0, 0, r, 0, tau$3);\n    }\n  };\n  function Symbol$1(type2, size) {\n    let context2 = null, path2 = withPath(symbol2);\n    type2 = typeof type2 === \"function\" ? type2 : constant$2(type2 || circle);\n    size = typeof size === \"function\" ? size : constant$2(size === void 0 ? 64 : +size);\n    function symbol2() {\n      let buffer;\n      if (!context2) context2 = buffer = path2();\n      type2.apply(this, arguments).draw(context2, +size.apply(this, arguments));\n      if (buffer) return context2 = null, buffer + \"\" || null;\n    }\n    symbol2.type = function(_) {\n      return arguments.length ? (type2 = typeof _ === \"function\" ? _ : constant$2(_), symbol2) : type2;\n    };\n    symbol2.size = function(_) {\n      return arguments.length ? (size = typeof _ === \"function\" ? _ : constant$2(+_), symbol2) : size;\n    };\n    symbol2.context = function(_) {\n      return arguments.length ? (context2 = _ == null ? null : _, symbol2) : context2;\n    };\n    return symbol2;\n  }\n  function noop$3() {\n  }\n  function point$5(that, x2, y2) {\n    that._context.bezierCurveTo(\n      (2 * that._x0 + that._x1) / 3,\n      (2 * that._y0 + that._y1) / 3,\n      (that._x0 + 2 * that._x1) / 3,\n      (that._y0 + 2 * that._y1) / 3,\n      (that._x0 + 4 * that._x1 + x2) / 6,\n      (that._y0 + 4 * that._y1 + y2) / 6\n    );\n  }\n  function Basis(context2) {\n    this._context = context2;\n  }\n  Basis.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 3:\n          point$5(this, this._x1, this._y1);\n        // falls through\n        case 2:\n          this._context.lineTo(this._x1, this._y1);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);\n        // falls through\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasis(context2) {\n    return new Basis(context2);\n  }\n  function BasisClosed(context2) {\n    this._context = context2;\n  }\n  BasisClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x2, this._y2);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n          this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x2, this._y2);\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x2 = x2, this._y2 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 2:\n          this._point = 3;\n          this._x4 = x2, this._y4 = y2;\n          this._context.moveTo((this._x0 + 4 * this._x1 + x2) / 6, (this._y0 + 4 * this._y1 + y2) / 6);\n          break;\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasisClosed(context2) {\n    return new BasisClosed(context2);\n  }\n  function BasisOpen(context2) {\n    this._context = context2;\n  }\n  BasisOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          var x02 = (this._x0 + 4 * this._x1 + x2) / 6, y02 = (this._y0 + 4 * this._y1 + y2) / 6;\n          this._line ? this._context.lineTo(x02, y02) : this._context.moveTo(x02, y02);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasisOpen(context2) {\n    return new BasisOpen(context2);\n  }\n  function Bundle(context2, beta) {\n    this._basis = new Basis(context2);\n    this._beta = beta;\n  }\n  Bundle.prototype = {\n    lineStart: function() {\n      this._x = [];\n      this._y = [];\n      this._basis.lineStart();\n    },\n    lineEnd: function() {\n      var x2 = this._x, y2 = this._y, j = x2.length - 1;\n      if (j > 0) {\n        var x02 = x2[0], y02 = y2[0], dx = x2[j] - x02, dy = y2[j] - y02, i = -1, t;\n        while (++i <= j) {\n          t = i / j;\n          this._basis.point(\n            this._beta * x2[i] + (1 - this._beta) * (x02 + t * dx),\n            this._beta * y2[i] + (1 - this._beta) * (y02 + t * dy)\n          );\n        }\n      }\n      this._x = this._y = null;\n      this._basis.lineEnd();\n    },\n    point: function(x2, y2) {\n      this._x.push(+x2);\n      this._y.push(+y2);\n    }\n  };\n  const curveBundle = (function custom2(beta) {\n    function bundle2(context2) {\n      return beta === 1 ? new Basis(context2) : new Bundle(context2, beta);\n    }\n    bundle2.beta = function(beta2) {\n      return custom2(+beta2);\n    };\n    return bundle2;\n  })(0.85);\n  function point$4(that, x2, y2) {\n    that._context.bezierCurveTo(\n      that._x1 + that._k * (that._x2 - that._x0),\n      that._y1 + that._k * (that._y2 - that._y0),\n      that._x2 + that._k * (that._x1 - x2),\n      that._y2 + that._k * (that._y1 - y2),\n      that._x2,\n      that._y2\n    );\n  }\n  function Cardinal(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  Cardinal.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x2, this._y2);\n          break;\n        case 3:\n          point$4(this, this._x1, this._y1);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          this._x1 = x2, this._y1 = y2;\n          break;\n        case 2:\n          this._point = 3;\n        // falls through\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinal = (function custom2(tension) {\n    function cardinal(context2) {\n      return new Cardinal(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function CardinalClosed(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  CardinalClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.lineTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._context.moveTo(this._x4 = x2, this._y4 = y2);\n          break;\n        case 2:\n          this._point = 3;\n          this._x5 = x2, this._y5 = y2;\n          break;\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinalClosed = (function custom2(tension) {\n    function cardinal(context2) {\n      return new CardinalClosed(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function CardinalOpen(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  CardinalOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinalOpen = (function custom2(tension) {\n    function cardinal(context2) {\n      return new CardinalOpen(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function point$3(that, x2, y2) {\n    var x12 = that._x1, y12 = that._y1, x22 = that._x2, y22 = that._y2;\n    if (that._l01_a > epsilon$5) {\n      var a2 = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n      x12 = (x12 * a2 - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n      y12 = (y12 * a2 - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n    }\n    if (that._l23_a > epsilon$5) {\n      var b2 = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m2 = 3 * that._l23_a * (that._l23_a + that._l12_a);\n      x22 = (x22 * b2 + that._x1 * that._l23_2a - x2 * that._l12_2a) / m2;\n      y22 = (y22 * b2 + that._y1 * that._l23_2a - y2 * that._l12_2a) / m2;\n    }\n    that._context.bezierCurveTo(x12, y12, x22, y22, that._x2, that._y2);\n  }\n  function CatmullRom(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRom.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x2, this._y2);\n          break;\n        case 3:\n          this.point(this._x2, this._y2);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n        // falls through\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRom = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRom(context2, alpha) : new Cardinal(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function CatmullRomClosed(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRomClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.lineTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._context.moveTo(this._x4 = x2, this._y4 = y2);\n          break;\n        case 2:\n          this._point = 3;\n          this._x5 = x2, this._y5 = y2;\n          break;\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRomClosed = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRomClosed(context2, alpha) : new CardinalClosed(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function CatmullRomOpen(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRomOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRomOpen = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRomOpen(context2, alpha) : new CardinalOpen(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function LinearClosed(context2) {\n    this._context = context2;\n  }\n  LinearClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._point) this._context.closePath();\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) this._context.lineTo(x2, y2);\n      else this._point = 1, this._context.moveTo(x2, y2);\n    }\n  };\n  function curveLinearClosed(context2) {\n    return new LinearClosed(context2);\n  }\n  function sign$1(x2) {\n    return x2 < 0 ? -1 : 1;\n  }\n  function slope3(that, x2, y2) {\n    var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);\n    return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n  }\n  function slope2(that, t) {\n    var h2 = that._x1 - that._x0;\n    return h2 ? (3 * (that._y1 - that._y0) / h2 - t) / 2 : t;\n  }\n  function point$2(that, t02, t12) {\n    var x02 = that._x0, y02 = that._y0, x12 = that._x1, y12 = that._y1, dx = (x12 - x02) / 3;\n    that._context.bezierCurveTo(x02 + dx, y02 + dx * t02, x12 - dx, y12 - dx * t12, x12, y12);\n  }\n  function MonotoneX(context2) {\n    this._context = context2;\n  }\n  MonotoneX.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x1, this._y1);\n          break;\n        case 3:\n          point$2(this, this._t0, slope2(this, this._t0));\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      var t12 = NaN;\n      x2 = +x2, y2 = +y2;\n      if (x2 === this._x1 && y2 === this._y1) return;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          point$2(this, slope2(this, t12 = slope3(this, x2, y2)), t12);\n          break;\n        default:\n          point$2(this, this._t0, t12 = slope3(this, x2, y2));\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n      this._t0 = t12;\n    }\n  };\n  function MonotoneY(context2) {\n    this._context = new ReflectContext(context2);\n  }\n  (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x2, y2) {\n    MonotoneX.prototype.point.call(this, y2, x2);\n  };\n  function ReflectContext(context2) {\n    this._context = context2;\n  }\n  ReflectContext.prototype = {\n    moveTo: function(x2, y2) {\n      this._context.moveTo(y2, x2);\n    },\n    closePath: function() {\n      this._context.closePath();\n    },\n    lineTo: function(x2, y2) {\n      this._context.lineTo(y2, x2);\n    },\n    bezierCurveTo: function(x12, y12, x2, y2, x3, y3) {\n      this._context.bezierCurveTo(y12, x12, y2, x2, y3, x3);\n    }\n  };\n  function monotoneX(context2) {\n    return new MonotoneX(context2);\n  }\n  function monotoneY(context2) {\n    return new MonotoneY(context2);\n  }\n  function Natural(context2) {\n    this._context = context2;\n  }\n  Natural.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x = [];\n      this._y = [];\n    },\n    lineEnd: function() {\n      var x2 = this._x, y2 = this._y, n = x2.length;\n      if (n) {\n        this._line ? this._context.lineTo(x2[0], y2[0]) : this._context.moveTo(x2[0], y2[0]);\n        if (n === 2) {\n          this._context.lineTo(x2[1], y2[1]);\n        } else {\n          var px2 = controlPoints(x2), py2 = controlPoints(y2);\n          for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n            this._context.bezierCurveTo(px2[0][i0], py2[0][i0], px2[1][i0], py2[1][i0], x2[i1], y2[i1]);\n          }\n        }\n      }\n      if (this._line || this._line !== 0 && n === 1) this._context.closePath();\n      this._line = 1 - this._line;\n      this._x = this._y = null;\n    },\n    point: function(x2, y2) {\n      this._x.push(+x2);\n      this._y.push(+y2);\n    }\n  };\n  function controlPoints(x2) {\n    var i, n = x2.length - 1, m2, a2 = new Array(n), b2 = new Array(n), r = new Array(n);\n    a2[0] = 0, b2[0] = 2, r[0] = x2[0] + 2 * x2[1];\n    for (i = 1; i < n - 1; ++i) a2[i] = 1, b2[i] = 4, r[i] = 4 * x2[i] + 2 * x2[i + 1];\n    a2[n - 1] = 2, b2[n - 1] = 7, r[n - 1] = 8 * x2[n - 1] + x2[n];\n    for (i = 1; i < n; ++i) m2 = a2[i] / b2[i - 1], b2[i] -= m2, r[i] -= m2 * r[i - 1];\n    a2[n - 1] = r[n - 1] / b2[n - 1];\n    for (i = n - 2; i >= 0; --i) a2[i] = (r[i] - a2[i + 1]) / b2[i];\n    b2[n - 1] = (x2[n] + a2[n - 1]) / 2;\n    for (i = 0; i < n - 1; ++i) b2[i] = 2 * x2[i + 1] - a2[i + 1];\n    return [a2, b2];\n  }\n  function curveNatural(context2) {\n    return new Natural(context2);\n  }\n  function Step(context2, t) {\n    this._context = context2;\n    this._t = t;\n  }\n  Step.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x = this._y = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n        // falls through\n        default: {\n          if (this._t <= 0) {\n            this._context.lineTo(this._x, y2);\n            this._context.lineTo(x2, y2);\n          } else {\n            var x12 = this._x * (1 - this._t) + x2 * this._t;\n            this._context.lineTo(x12, this._y);\n            this._context.lineTo(x12, y2);\n          }\n          break;\n        }\n      }\n      this._x = x2, this._y = y2;\n    }\n  };\n  function curveStep(context2) {\n    return new Step(context2, 0.5);\n  }\n  function stepBefore(context2) {\n    return new Step(context2, 0);\n  }\n  function stepAfter(context2) {\n    return new Step(context2, 1);\n  }\n  function domCanvas(w2, h2) {\n    if (typeof document !== \"undefined\" && document.createElement) {\n      const c2 = document.createElement(\"canvas\");\n      if (c2 && c2.getContext) {\n        c2.width = w2;\n        c2.height = h2;\n        return c2;\n      }\n    }\n    return null;\n  }\n  const domImage = () => typeof Image !== \"undefined\" ? Image : null;\n  function colors$1(specifier) {\n    var n = specifier.length / 6 | 0, colors2 = new Array(n), i = 0;\n    while (i < n) colors2[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n    return colors2;\n  }\n  const schemeCategory10 = colors$1(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n  const schemeAccent = colors$1(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n  const schemeDark2 = colors$1(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n  const schemeObservable10 = colors$1(\"4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0\");\n  const schemePaired = colors$1(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n  const schemePastel1 = colors$1(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n  const schemePastel2 = colors$1(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n  const schemeSet1 = colors$1(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n  const schemeSet2 = colors$1(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n  const schemeSet3 = colors$1(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n  function bandSpace(count2, paddingInner, paddingOuter) {\n    const space = count2 - paddingInner + paddingOuter * 2;\n    return count2 ? space > 0 ? space : 1 : 0;\n  }\n  const Identity = \"identity\";\n  const Linear = \"linear\";\n  const Log = \"log\";\n  const Pow = \"pow\";\n  const Sqrt = \"sqrt\";\n  const Symlog = \"symlog\";\n  const Time = \"time\";\n  const UTC = \"utc\";\n  const Sequential = \"sequential\";\n  const Diverging = \"diverging\";\n  const Quantile = \"quantile\";\n  const Quantize = \"quantize\";\n  const Threshold = \"threshold\";\n  const Ordinal = \"ordinal\";\n  const Point = \"point\";\n  const Band = \"band\";\n  const BinOrdinal = \"bin-ordinal\";\n  const Continuous = \"continuous\";\n  const Discrete$1 = \"discrete\";\n  const Discretizing = \"discretizing\";\n  const Interpolating = \"interpolating\";\n  const Temporal = \"temporal\";\n  function invertRange(scale2) {\n    return function(_) {\n      let lo = _[0], hi = _[1], t;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      return [scale2.invert(lo), scale2.invert(hi)];\n    };\n  }\n  function invertRangeExtent(scale2) {\n    return function(_) {\n      const range2 = scale2.range();\n      let lo = _[0], hi = _[1], min2 = -1, max2, t, i, n;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      for (i = 0, n = range2.length; i < n; ++i) {\n        if (range2[i] >= lo && range2[i] <= hi) {\n          if (min2 < 0) min2 = i;\n          max2 = i;\n        }\n      }\n      if (min2 < 0) return void 0;\n      lo = scale2.invertExtent(range2[min2]);\n      hi = scale2.invertExtent(range2[max2]);\n      return [lo[0] === void 0 ? lo[1] : lo[0], hi[1] === void 0 ? hi[0] : hi[1]];\n    };\n  }\n  function band() {\n    const scale2 = ordinal().unknown(void 0), domain2 = scale2.domain, ordinalRange = scale2.range;\n    let range$12 = [0, 1], step, bandwidth2, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5;\n    delete scale2.unknown;\n    function rescale() {\n      const n = domain2().length, reverse2 = range$12[1] < range$12[0], stop2 = range$12[1 - reverse2], space = bandSpace(n, paddingInner, paddingOuter);\n      let start = range$12[reverse2 - 0];\n      step = (stop2 - start) / (space || 1);\n      if (round) {\n        step = Math.floor(step);\n      }\n      start += (stop2 - start - step * (n - paddingInner)) * align;\n      bandwidth2 = step * (1 - paddingInner);\n      if (round) {\n        start = Math.round(start);\n        bandwidth2 = Math.round(bandwidth2);\n      }\n      const values2 = range$3(n).map((i) => start + step * i);\n      return ordinalRange(reverse2 ? values2.reverse() : values2);\n    }\n    scale2.domain = function(_) {\n      if (arguments.length) {\n        domain2(_);\n        return rescale();\n      } else {\n        return domain2();\n      }\n    };\n    scale2.range = function(_) {\n      if (arguments.length) {\n        range$12 = [+_[0], +_[1]];\n        return rescale();\n      } else {\n        return range$12.slice();\n      }\n    };\n    scale2.rangeRound = function(_) {\n      range$12 = [+_[0], +_[1]];\n      round = true;\n      return rescale();\n    };\n    scale2.bandwidth = function() {\n      return bandwidth2;\n    };\n    scale2.step = function() {\n      return step;\n    };\n    scale2.round = function(_) {\n      if (arguments.length) {\n        round = !!_;\n        return rescale();\n      } else {\n        return round;\n      }\n    };\n    scale2.padding = function(_) {\n      if (arguments.length) {\n        paddingOuter = Math.max(0, Math.min(1, _));\n        paddingInner = paddingOuter;\n        return rescale();\n      } else {\n        return paddingInner;\n      }\n    };\n    scale2.paddingInner = function(_) {\n      if (arguments.length) {\n        paddingInner = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return paddingInner;\n      }\n    };\n    scale2.paddingOuter = function(_) {\n      if (arguments.length) {\n        paddingOuter = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return paddingOuter;\n      }\n    };\n    scale2.align = function(_) {\n      if (arguments.length) {\n        align = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return align;\n      }\n    };\n    scale2.invertRange = function(_) {\n      if (_[0] == null || _[1] == null) return;\n      const reverse2 = range$12[1] < range$12[0], values2 = reverse2 ? ordinalRange().reverse() : ordinalRange(), n = values2.length - 1;\n      let lo = +_[0], hi = +_[1], a2, b2, t;\n      if (lo !== lo || hi !== hi) return;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      if (hi < values2[0] || lo > range$12[1 - reverse2]) return;\n      a2 = Math.max(0, bisectRight$1(values2, lo) - 1);\n      b2 = lo === hi ? a2 : bisectRight$1(values2, hi) - 1;\n      if (lo - values2[a2] > bandwidth2 + 1e-10) ++a2;\n      if (reverse2) {\n        t = a2;\n        a2 = n - b2;\n        b2 = n - t;\n      }\n      return a2 > b2 ? void 0 : domain2().slice(a2, b2 + 1);\n    };\n    scale2.invert = function(_) {\n      const value2 = scale2.invertRange([_, _]);\n      return value2 ? value2[0] : value2;\n    };\n    scale2.copy = function() {\n      return band().domain(domain2()).range(range$12).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n    };\n    return rescale();\n  }\n  function pointish(scale2) {\n    const copy2 = scale2.copy;\n    scale2.padding = scale2.paddingOuter;\n    delete scale2.paddingInner;\n    scale2.copy = function() {\n      return pointish(copy2());\n    };\n    return scale2;\n  }\n  function point$1() {\n    return pointish(band().paddingInner(1));\n  }\n  var map = Array.prototype.map;\n  function numbers(_) {\n    return map.call(_, toNumber);\n  }\n  const slice$1 = Array.prototype.slice;\n  function scaleBinOrdinal() {\n    let domain2 = [], range2 = [];\n    function scale2(x2) {\n      return x2 == null || x2 !== x2 ? void 0 : range2[(bisectRight$1(domain2, x2) - 1) % range2.length];\n    }\n    scale2.domain = function(_) {\n      if (arguments.length) {\n        domain2 = numbers(_);\n        return scale2;\n      } else {\n        return domain2.slice();\n      }\n    };\n    scale2.range = function(_) {\n      if (arguments.length) {\n        range2 = slice$1.call(_);\n        return scale2;\n      } else {\n        return range2.slice();\n      }\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      return tickFormat$1(domain2[0], peek$1(domain2), count2 == null ? 10 : count2, specifier);\n    };\n    scale2.copy = function() {\n      return scaleBinOrdinal().domain(scale2.domain()).range(scale2.range());\n    };\n    return scale2;\n  }\n  const scales = /* @__PURE__ */ new Map();\n  const VEGA_SCALE = Symbol(\"vega_scale\");\n  function registerScale(scale2) {\n    scale2[VEGA_SCALE] = true;\n    return scale2;\n  }\n  function isRegisteredScale(scale2) {\n    return scale2 && scale2[VEGA_SCALE] === true;\n  }\n  function create$2(type2, constructor, metadata2) {\n    const ctr = function scale2() {\n      const s2 = constructor();\n      if (!s2.invertRange) {\n        s2.invertRange = s2.invert ? invertRange(s2) : s2.invertExtent ? invertRangeExtent(s2) : void 0;\n      }\n      s2.type = type2;\n      return registerScale(s2);\n    };\n    ctr.metadata = toSet(array$4(metadata2));\n    return ctr;\n  }\n  function scale$4(type2, scale2, metadata2) {\n    if (arguments.length > 1) {\n      scales.set(type2, create$2(type2, scale2, metadata2));\n      return this;\n    } else {\n      return isValidScaleType(type2) ? scales.get(type2) : void 0;\n    }\n  }\n  scale$4(Identity, identity$4);\n  scale$4(Linear, linear$1, Continuous);\n  scale$4(Log, log$4, [Continuous, Log]);\n  scale$4(Pow, pow$4, Continuous);\n  scale$4(Sqrt, sqrt$3, Continuous);\n  scale$4(Symlog, symlog$1, Continuous);\n  scale$4(Time, time$1, [Continuous, Temporal]);\n  scale$4(UTC, utcTime, [Continuous, Temporal]);\n  scale$4(Sequential, sequential, [Continuous, Interpolating]);\n  scale$4(`${Sequential}-${Linear}`, sequential, [Continuous, Interpolating]);\n  scale$4(`${Sequential}-${Log}`, sequentialLog, [Continuous, Interpolating, Log]);\n  scale$4(`${Sequential}-${Pow}`, sequentialPow, [Continuous, Interpolating]);\n  scale$4(`${Sequential}-${Sqrt}`, sequentialSqrt, [Continuous, Interpolating]);\n  scale$4(`${Sequential}-${Symlog}`, sequentialSymlog, [Continuous, Interpolating]);\n  scale$4(`${Diverging}-${Linear}`, diverging$1, [Continuous, Interpolating]);\n  scale$4(`${Diverging}-${Log}`, divergingLog, [Continuous, Interpolating, Log]);\n  scale$4(`${Diverging}-${Pow}`, divergingPow, [Continuous, Interpolating]);\n  scale$4(`${Diverging}-${Sqrt}`, divergingSqrt, [Continuous, Interpolating]);\n  scale$4(`${Diverging}-${Symlog}`, divergingSymlog, [Continuous, Interpolating]);\n  scale$4(Quantile, quantile, [Discretizing, Quantile]);\n  scale$4(Quantize, quantize$1, Discretizing);\n  scale$4(Threshold, threshold, Discretizing);\n  scale$4(BinOrdinal, scaleBinOrdinal, [Discrete$1, Discretizing]);\n  scale$4(Ordinal, ordinal, Discrete$1);\n  scale$4(Band, band, Discrete$1);\n  scale$4(Point, point$1, Discrete$1);\n  function isValidScaleType(type2) {\n    return scales.has(type2);\n  }\n  function hasType(key2, type2) {\n    const s2 = scales.get(key2);\n    return s2 && s2.metadata[type2];\n  }\n  function isContinuous(key2) {\n    return hasType(key2, Continuous);\n  }\n  function isDiscrete(key2) {\n    return hasType(key2, Discrete$1);\n  }\n  function isDiscretizing(key2) {\n    return hasType(key2, Discretizing);\n  }\n  function isLogarithmic(key2) {\n    return hasType(key2, Log);\n  }\n  function isTemporal(key2) {\n    return hasType(key2, Temporal);\n  }\n  function isInterpolating(key2) {\n    return hasType(key2, Interpolating);\n  }\n  function isQuantile(key2) {\n    return hasType(key2, Quantile);\n  }\n  const scaleProps = [\"clamp\", \"base\", \"constant\", \"exponent\"];\n  function interpolateRange(interpolator, range2) {\n    const start = range2[0], span2 = peek$1(range2) - start;\n    return function(i) {\n      return interpolator(start + i * span2);\n    };\n  }\n  function interpolateColors(colors2, type2, gamma2) {\n    return piecewise(interpolate(type2 || \"rgb\", gamma2), colors2);\n  }\n  function quantizeInterpolator(interpolator, count2) {\n    const samples = new Array(count2), n = count2 + 1;\n    for (let i = 0; i < count2; ) samples[i] = interpolator(++i / n);\n    return samples;\n  }\n  function scaleFraction(scale$12, min2, max2) {\n    const delta = max2 - min2;\n    let i, t, s2;\n    if (!delta || !Number.isFinite(delta)) {\n      return constant$4(0.5);\n    } else {\n      i = (t = scale$12.type).indexOf(\"-\");\n      t = i < 0 ? t : t.slice(i + 1);\n      s2 = scale$4(t)().domain([min2, max2]).range([0, 1]);\n      scaleProps.forEach((m2) => scale$12[m2] ? s2[m2](scale$12[m2]()) : 0);\n      return s2;\n    }\n  }\n  function interpolate(type2, gamma2) {\n    const interp = $$1[method(type2)];\n    return gamma2 != null && interp && interp.gamma ? interp.gamma(gamma2) : interp;\n  }\n  function method(type2) {\n    return \"interpolate\" + type2.toLowerCase().split(\"-\").map((s2) => s2[0].toUpperCase() + s2.slice(1)).join(\"\");\n  }\n  const continuous = {\n    blues: \"cfe1f2bed8eca8cee58fc1de74b2d75ba3cf4592c63181bd206fb2125ca40a4a90\",\n    greens: \"d3eecdc0e6baabdda594d3917bc77d60ba6c46ab5e329a512089430e7735036429\",\n    greys: \"e2e2e2d4d4d4c4c4c4b1b1b19d9d9d8888887575756262624d4d4d3535351e1e1e\",\n    oranges: \"fdd8b3fdc998fdb87bfda55efc9244f87f2cf06b18e4580bd14904b93d029f3303\",\n    purples: \"e2e1efd4d4e8c4c5e0b4b3d6a3a0cc928ec3827cb97566ae684ea25c3696501f8c\",\n    reds: \"fdc9b4fcb49afc9e80fc8767fa7051f6573fec3f2fdc2a25c81b1db21218970b13\",\n    blueGreen: \"d5efedc1e8e0a7ddd18bd2be70c6a958ba9144ad77319c5d2089460e7736036429\",\n    bluePurple: \"ccddecbad0e4a8c2dd9ab0d4919cc98d85be8b6db28a55a6873c99822287730f71\",\n    greenBlue: \"d3eecec5e8c3b1e1bb9bd8bb82cec269c2ca51b2cd3c9fc7288abd1675b10b60a1\",\n    orangeRed: \"fddcaffdcf9bfdc18afdad77fb9562f67d53ee6545e24932d32d1ebf130da70403\",\n    purpleBlue: \"dbdaebc8cee4b1c3de97b7d87bacd15b9fc93a90c01e7fb70b70ab056199045281\",\n    purpleBlueGreen: \"dbd8eac8cee4b0c3de93b7d872acd1549fc83892bb1c88a3097f8702736b016353\",\n    purpleRed: \"dcc9e2d3b3d7ce9eccd186c0da6bb2e14da0e23189d91e6fc61159ab07498f023a\",\n    redPurple: \"fccfccfcbec0faa9b8f98faff571a5ec539ddb3695c41b8aa908808d0179700174\",\n    yellowGreen: \"e4f4acd1eca0b9e2949ed68880c97c62bb6e47aa5e3297502083440e723b036034\",\n    yellowOrangeBrown: \"feeaa1fedd84fecc63feb746fca031f68921eb7215db5e0bc54c05ab3d038f3204\",\n    yellowOrangeRed: \"fee087fed16ffebd59fea849fd903efc7335f9522bee3423de1b20ca0b22af0225\",\n    blueOrange: \"134b852f78b35da2cb9dcae1d2e5eff2f0ebfce0bafbbf74e8932fc5690d994a07\",\n    brownBlueGreen: \"704108a0651ac79548e3c78af3e6c6eef1eac9e9e48ed1c74da79e187a72025147\",\n    purpleGreen: \"5b1667834792a67fb6c9aed3e6d6e8eff0efd9efd5aedda971bb75368e490e5e29\",\n    purpleOrange: \"4114696647968f83b7b9b4d6dadbebf3eeeafce0bafbbf74e8932fc5690d994a07\",\n    redBlue: \"8c0d25bf363adf745ef4ae91fbdbc9f2efeed2e5ef9dcae15da2cb2f78b3134b85\",\n    redGrey: \"8c0d25bf363adf745ef4ae91fcdccbfaf4f1e2e2e2c0c0c0969696646464343434\",\n    yellowGreenBlue: \"eff9bddbf1b4bde5b594d5b969c5be45b4c22c9ec02182b82163aa23479c1c3185\",\n    redYellowBlue: \"a50026d4322cf16e43fcac64fedd90faf8c1dcf1ecabd6e875abd04a74b4313695\",\n    redYellowGreen: \"a50026d4322cf16e43fcac63fedd8df9f7aed7ee8ea4d86e64bc6122964f006837\",\n    pinkYellowGreen: \"8e0152c0267edd72adf0b3d6faddedf5f3efe1f2cab6de8780bb474f9125276419\",\n    spectral: \"9e0142d13c4bf0704afcac63fedd8dfbf8b0e0f3a1a9dda269bda94288b55e4fa2\",\n    viridis: \"440154470e61481a6c482575472f7d443a834144873d4e8a39568c35608d31688e2d708e2a788e27818e23888e21918d1f988b1fa08822a8842ab07f35b77943bf7154c56866cc5d7ad1518fd744a5db36bcdf27d2e21be9e51afde725\",\n    magma: \"0000040404130b0924150e3720114b2c11603b0f704a107957157e651a80721f817f24828c29819a2e80a8327db6377ac43c75d1426fde4968e95462f1605df76f5cfa7f5efc8f65fe9f6dfeaf78febf84fece91fddea0fcedaffcfdbf\",\n    inferno: \"0000040403130c0826170c3b240c4f330a5f420a68500d6c5d126e6b176e781c6d86216b932667a12b62ae305cbb3755c73e4cd24644dd513ae65c30ed6925f3771af8850ffb9506fca50afcb519fac62df6d645f2e661f3f484fcffa4\",\n    plasma: \"0d088723069033059742039d5002a25d01a66a00a87801a88405a7900da49c179ea72198b12a90ba3488c33d80cb4779d35171da5a69e16462e76e5bed7953f2834cf68f44fa9a3dfca636fdb32ffec029fcce25f9dc24f5ea27f0f921\",\n    cividis: \"00205100235800265d002961012b65042e670831690d346b11366c16396d1c3c6e213f6e26426e2c456e31476e374a6e3c4d6e42506e47536d4c566d51586e555b6e5a5e6e5e616e62646f66676f6a6a706e6d717270717573727976737c79747f7c75827f758682768985778c8877908b78938e789691789a94789e9778a19b78a59e77a9a177aea575b2a874b6ab73bbaf71c0b26fc5b66dc9b96acebd68d3c065d8c462ddc85fe2cb5ce7cf58ebd355f0d652f3da4ff7de4cfae249fce647\",\n    rainbow: \"6e40aa883eb1a43db3bf3cafd83fa4ee4395fe4b83ff576eff6659ff7847ff8c38f3a130e2b72fcfcc36bee044aff05b8ff4576ff65b52f6673af27828ea8d1ddfa319d0b81cbecb23abd82f96e03d82e14c6edb5a5dd0664dbf6e40aa\",\n    sinebow: \"ff4040fc582af47218e78d0bd5a703bfbf00a7d5038de70b72f41858fc2a40ff402afc5818f4720be78d03d5a700bfbf03a7d50b8de71872f42a58fc4040ff582afc7218f48d0be7a703d5bf00bfd503a7e70b8df41872fc2a58ff4040\",\n    turbo: \"23171b32204a3e2a71453493493eae4b49c54a53d7485ee44569ee4074f53c7ff8378af93295f72e9ff42ba9ef28b3e926bce125c5d925cdcf27d5c629dcbc2de3b232e9a738ee9d3ff39347f68950f9805afc7765fd6e70fe667cfd5e88fc5795fb51a1f84badf545b9f140c5ec3cd0e637dae034e4d931ecd12ef4c92bfac029ffb626ffad24ffa223ff9821ff8d1fff821dff771cfd6c1af76118f05616e84b14df4111d5380fcb2f0dc0260ab61f07ac1805a313029b0f00950c00910b00\",\n    browns: \"eedbbdecca96e9b97ae4a865dc9856d18954c7784cc0673fb85536ad44339f3632\",\n    tealBlues: \"bce4d89dd3d181c3cb65b3c245a2b9368fae347da0306a932c5985\",\n    teals: \"bbdfdfa2d4d58ac9c975bcbb61b0af4da5a43799982b8b8c1e7f7f127273006667\",\n    warmGreys: \"dcd4d0cec5c1c0b8b4b3aaa7a59c9998908c8b827f7e7673726866665c5a59504e\",\n    goldGreen: \"f4d166d5ca60b6c35c98bb597cb25760a6564b9c533f8f4f33834a257740146c36\",\n    goldOrange: \"f4d166f8be5cf8aa4cf5983bf3852aef701be2621fd65322c54923b142239e3a26\",\n    goldRed: \"f4d166f6be59f9aa51fc964ef6834bee734ae56249db5247cf4244c43141b71d3e\",\n    lightGreyRed: \"efe9e6e1dad7d5cbc8c8bdb9bbaea9cd967ddc7b43e15f19df4011dc000b\",\n    lightGreyTeal: \"e4eaead6dcddc8ced2b7c2c7a6b4bc64b0bf22a6c32295c11f85be1876bc\",\n    lightMulti: \"e0f1f2c4e9d0b0de9fd0e181f6e072f6c053f3993ef77440ef4a3c\",\n    lightOrange: \"f2e7daf7d5baf9c499fab184fa9c73f68967ef7860e8645bde515bd43d5b\",\n    lightTealBlue: \"e3e9e0c0dccf9aceca7abfc859afc0389fb9328dad2f7ca0276b95255988\",\n    darkBlue: \"3232322d46681a5c930074af008cbf05a7ce25c0dd38daed50f3faffffff\",\n    darkGold: \"3c3c3c584b37725e348c7631ae8b2bcfa424ecc31ef9de30fff184ffffff\",\n    darkGreen: \"3a3a3a215748006f4d048942489e4276b340a6c63dd2d836ffeb2cffffaa\",\n    darkMulti: \"3737371f5287197d8c29a86995ce3fffe800ffffff\",\n    darkRed: \"3434347036339e3c38cc4037e75d1eec8620eeab29f0ce32ffeb2c\"\n  };\n  const discrete = {\n    accent: schemeAccent,\n    category10: schemeCategory10,\n    category20: \"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\",\n    category20b: \"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\",\n    category20c: \"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\",\n    dark2: schemeDark2,\n    observable10: schemeObservable10,\n    paired: schemePaired,\n    pastel1: schemePastel1,\n    pastel2: schemePastel2,\n    set1: schemeSet1,\n    set2: schemeSet2,\n    set3: schemeSet3,\n    tableau10: \"4c78a8f58518e4575672b7b254a24beeca3bb279a2ff9da69d755dbab0ac\",\n    tableau20: \"4c78a89ecae9f58518ffbf7954a24b88d27ab79a20f2cf5b43989483bcb6e45756ff9d9879706ebab0acd67195fcbfd2b279a2d6a5c99e765fd8b5a5\"\n  };\n  function colors(palette) {\n    if (isArray(palette)) return palette;\n    const n = palette.length / 6 | 0, c2 = new Array(n);\n    for (let i = 0; i < n; ) {\n      c2[i] = \"#\" + palette.slice(i * 6, ++i * 6);\n    }\n    return c2;\n  }\n  function apply(_, f) {\n    for (const k in _) scheme(k, f(_[k]));\n  }\n  const schemes = {};\n  apply(discrete, colors);\n  apply(continuous, (_) => interpolateColors(colors(_)));\n  function scheme(name, scheme2) {\n    name = name && name.toLowerCase();\n    if (arguments.length > 1) {\n      schemes[name] = scheme2;\n      return this;\n    } else {\n      return schemes[name];\n    }\n  }\n  const SymbolLegend = \"symbol\";\n  const DiscreteLegend = \"discrete\";\n  const GradientLegend = \"gradient\";\n  const defaultFormatter = (value2) => isArray(value2) ? value2.map((v) => String(v)) : String(value2);\n  const ascending = (a2, b2) => a2[1] - b2[1];\n  const descending = (a2, b2) => b2[1] - a2[1];\n  function tickCount(scale2, count2, minStep) {\n    let step;\n    if (isNumber$1(count2)) {\n      if (scale2.bins) {\n        count2 = Math.max(count2, scale2.bins.length);\n      }\n      if (minStep != null) {\n        count2 = Math.min(count2, Math.floor(span(scale2.domain()) / minStep || 1) + 1);\n      }\n    }\n    if (isObject(count2)) {\n      step = count2.step;\n      count2 = count2.interval;\n    }\n    if (isString(count2)) {\n      count2 = scale2.type === Time ? timeInterval(count2) : scale2.type == UTC ? utcInterval(count2) : error(\"Only time and utc scales accept interval strings.\");\n      if (step) count2 = count2.every(step);\n    }\n    return count2;\n  }\n  function validTicks(scale2, ticks2, count2) {\n    let range2 = scale2.range(), lo = range2[0], hi = peek$1(range2), cmp = ascending;\n    if (lo > hi) {\n      range2 = hi;\n      hi = lo;\n      lo = range2;\n      cmp = descending;\n    }\n    lo = Math.floor(lo);\n    hi = Math.ceil(hi);\n    ticks2 = ticks2.map((v) => [v, scale2(v)]).filter((_) => lo <= _[1] && _[1] <= hi).sort(cmp).map((_) => _[0]);\n    if (count2 > 0 && ticks2.length > 1) {\n      const endpoints = [ticks2[0], peek$1(ticks2)];\n      while (ticks2.length > count2 && ticks2.length >= 3) {\n        ticks2 = ticks2.filter((_, i) => !(i % 2));\n      }\n      if (ticks2.length < 3) {\n        ticks2 = endpoints;\n      }\n    }\n    return ticks2;\n  }\n  function tickValues(scale2, count2) {\n    return scale2.bins ? validTicks(scale2, scale2.bins, count2) : scale2.ticks ? scale2.ticks(count2) : scale2.domain();\n  }\n  function tickFormat(locale2, scale2, count2, specifier, formatType, noSkip) {\n    const type2 = scale2.type;\n    let format2 = defaultFormatter;\n    if (type2 === Time || formatType === Time) {\n      format2 = locale2.timeFormat(specifier);\n    } else if (type2 === UTC || formatType === UTC) {\n      format2 = locale2.utcFormat(specifier);\n    } else if (isLogarithmic(type2)) {\n      const varfmt = locale2.formatFloat(specifier);\n      if (noSkip || scale2.bins) {\n        format2 = varfmt;\n      } else {\n        const test2 = tickLog(scale2, count2, false);\n        format2 = (_) => test2(_) ? varfmt(_) : \"\";\n      }\n    } else if (scale2.tickFormat) {\n      const d2 = scale2.domain();\n      format2 = locale2.formatSpan(d2[0], d2[d2.length - 1], count2, specifier);\n    } else if (specifier) {\n      format2 = locale2.format(specifier);\n    }\n    return format2;\n  }\n  function tickLog(scale2, count2, values2) {\n    const ticks2 = tickValues(scale2, count2), base2 = scale2.base(), logb = Math.log(base2), k = Math.max(1, base2 * count2 / ticks2.length);\n    const test2 = (d2) => {\n      let i = d2 / Math.pow(base2, Math.round(Math.log(d2) / logb));\n      if (i * base2 < base2 - 0.5) i *= base2;\n      return i <= k;\n    };\n    return values2 ? ticks2.filter(test2) : test2;\n  }\n  const symbols$1 = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"thresholds\",\n    [Threshold]: \"domain\"\n  };\n  const formats = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"domain\"\n  };\n  function labelValues(scale2, count2) {\n    return scale2.bins ? binValues(scale2.bins) : scale2.type === Log ? tickLog(scale2, count2, true) : symbols$1[scale2.type] ? thresholdValues(scale2[symbols$1[scale2.type]]()) : tickValues(scale2, count2);\n  }\n  function thresholdFormat(locale2, scale2, specifier) {\n    const _ = scale2[formats[scale2.type]](), n = _.length;\n    let d2 = n > 1 ? _[1] - _[0] : _[0], i;\n    for (i = 1; i < n; ++i) {\n      d2 = Math.min(d2, _[i] - _[i - 1]);\n    }\n    return locale2.formatSpan(0, d2, 3 * 10, specifier);\n  }\n  function thresholdValues(thresholds) {\n    const values2 = [-Infinity].concat(thresholds);\n    values2.max = Infinity;\n    return values2;\n  }\n  function binValues(bins) {\n    const values2 = bins.slice(0, -1);\n    values2.max = peek$1(bins);\n    return values2;\n  }\n  const isDiscreteRange = (scale2) => symbols$1[scale2.type] || scale2.bins;\n  function labelFormat(locale2, scale2, count2, type2, specifier, formatType, noSkip) {\n    const format2 = formats[scale2.type] && formatType !== Time && formatType !== UTC ? thresholdFormat(locale2, scale2, specifier) : tickFormat(locale2, scale2, count2, specifier, formatType, noSkip);\n    return type2 === SymbolLegend && isDiscreteRange(scale2) ? formatRange(format2) : type2 === DiscreteLegend ? formatDiscrete(format2) : formatPoint(format2);\n  }\n  const formatRange = (format2) => (value2, index2, array2) => {\n    const limit = get$3(array2[index2 + 1], get$3(array2.max, Infinity)), lo = formatValue$1(value2, format2), hi = formatValue$1(limit, format2);\n    return lo && hi ? lo + \" – \" + hi : hi ? \"< \" + hi : \"≥ \" + lo;\n  };\n  const get$3 = (value2, dflt) => value2 != null ? value2 : dflt;\n  const formatDiscrete = (format2) => (value2, index2) => index2 ? format2(value2) : null;\n  const formatPoint = (format2) => (value2) => format2(value2);\n  const formatValue$1 = (value2, format2) => Number.isFinite(value2) ? format2(value2) : null;\n  function labelFraction(scale2) {\n    const domain2 = scale2.domain(), count2 = domain2.length - 1;\n    let lo = +domain2[0], hi = +peek$1(domain2), span2 = hi - lo;\n    if (scale2.type === Threshold) {\n      const adjust = count2 ? span2 / count2 : 0.1;\n      lo -= adjust;\n      hi += adjust;\n      span2 = hi - lo;\n    }\n    return (value2) => (value2 - lo) / span2;\n  }\n  function format$1(locale2, scale2, specifier, formatType) {\n    const type2 = formatType || scale2.type;\n    if (isString(specifier) && isTemporal(type2)) {\n      specifier = specifier.replace(/%a/g, \"%A\").replace(/%b/g, \"%B\");\n    }\n    return !specifier && type2 === Time ? locale2.timeFormat(\"%A, %d %B %Y, %X\") : !specifier && type2 === UTC ? locale2.utcFormat(\"%A, %d %B %Y, %X UTC\") : labelFormat(locale2, scale2, 5, null, specifier, formatType, true);\n  }\n  function domainCaption(locale2, scale2, opt) {\n    opt = opt || {};\n    const max2 = Math.max(3, opt.maxlen || 7), fmt = format$1(locale2, scale2, opt.format, opt.formatType);\n    if (isDiscretizing(scale2.type)) {\n      const v = labelValues(scale2).slice(1).map(fmt), n = v.length;\n      return `${n} boundar${n === 1 ? \"y\" : \"ies\"}: ${v.join(\", \")}`;\n    } else if (isDiscrete(scale2.type)) {\n      const d2 = scale2.domain(), n = d2.length, v = n > max2 ? d2.slice(0, max2 - 2).map(fmt).join(\", \") + \", ending with \" + d2.slice(-1).map(fmt) : d2.map(fmt).join(\", \");\n      return `${n} value${n === 1 ? \"\" : \"s\"}: ${v}`;\n    } else {\n      const d2 = scale2.domain();\n      return `values from ${fmt(d2[0])} to ${fmt(peek$1(d2))}`;\n    }\n  }\n  let gradient_id = 0;\n  function resetSVGGradientId() {\n    gradient_id = 0;\n  }\n  const patternPrefix = \"p_\";\n  function isGradient(value2) {\n    return value2 && value2.gradient;\n  }\n  function gradientRef(g, defs, base2) {\n    const type2 = g.gradient;\n    let id2 = g.id, prefix = type2 === \"radial\" ? patternPrefix : \"\";\n    if (!id2) {\n      id2 = g.id = \"gradient_\" + gradient_id++;\n      if (type2 === \"radial\") {\n        g.x1 = get$2(g.x1, 0.5);\n        g.y1 = get$2(g.y1, 0.5);\n        g.r1 = get$2(g.r1, 0);\n        g.x2 = get$2(g.x2, 0.5);\n        g.y2 = get$2(g.y2, 0.5);\n        g.r2 = get$2(g.r2, 0.5);\n        prefix = patternPrefix;\n      } else {\n        g.x1 = get$2(g.x1, 0);\n        g.y1 = get$2(g.y1, 0);\n        g.x2 = get$2(g.x2, 1);\n        g.y2 = get$2(g.y2, 0);\n      }\n    }\n    defs[id2] = g;\n    return \"url(\" + (base2 || \"\") + \"#\" + prefix + id2 + \")\";\n  }\n  function get$2(val, def2) {\n    return val != null ? val : def2;\n  }\n  function Gradient$1(p02, p1) {\n    var stops = [], gradient2;\n    return gradient2 = {\n      gradient: \"linear\",\n      x1: p02 ? p02[0] : 0,\n      y1: p02 ? p02[1] : 0,\n      x2: p1 ? p1[0] : 1,\n      y2: p1 ? p1[1] : 0,\n      stops,\n      stop: function(offset2, color2) {\n        stops.push({\n          offset: offset2,\n          color: color2\n        });\n        return gradient2;\n      }\n    };\n  }\n  const lookup$4 = {\n    \"basis\": {\n      curve: curveBasis\n    },\n    \"basis-closed\": {\n      curve: curveBasisClosed\n    },\n    \"basis-open\": {\n      curve: curveBasisOpen\n    },\n    \"bundle\": {\n      curve: curveBundle,\n      tension: \"beta\",\n      value: 0.85\n    },\n    \"cardinal\": {\n      curve: curveCardinal,\n      tension: \"tension\",\n      value: 0\n    },\n    \"cardinal-open\": {\n      curve: curveCardinalOpen,\n      tension: \"tension\",\n      value: 0\n    },\n    \"cardinal-closed\": {\n      curve: curveCardinalClosed,\n      tension: \"tension\",\n      value: 0\n    },\n    \"catmull-rom\": {\n      curve: curveCatmullRom,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"catmull-rom-closed\": {\n      curve: curveCatmullRomClosed,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"catmull-rom-open\": {\n      curve: curveCatmullRomOpen,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"linear\": {\n      curve: curveLinear\n    },\n    \"linear-closed\": {\n      curve: curveLinearClosed\n    },\n    \"monotone\": {\n      horizontal: monotoneY,\n      vertical: monotoneX\n    },\n    \"natural\": {\n      curve: curveNatural\n    },\n    \"step\": {\n      curve: curveStep\n    },\n    \"step-after\": {\n      curve: stepAfter\n    },\n    \"step-before\": {\n      curve: stepBefore\n    }\n  };\n  function curves(type2, orientation, tension) {\n    var entry2 = has$1(lookup$4, type2) && lookup$4[type2], curve2 = null;\n    if (entry2) {\n      curve2 = entry2.curve || entry2[orientation || \"vertical\"];\n      if (entry2.tension && tension != null) {\n        curve2 = curve2[entry2.tension](tension);\n      }\n    }\n    return curve2;\n  }\n  const paramCounts = {\n    m: 2,\n    l: 2,\n    h: 1,\n    v: 1,\n    z: 0,\n    c: 6,\n    s: 4,\n    q: 4,\n    t: 2,\n    a: 7\n  };\n  const commandPattern = /[mlhvzcsqta]([^mlhvzcsqta]+|$)/gi;\n  const numberPattern = /^[+-]?(([0-9]*\\.[0-9]+)|([0-9]+\\.)|([0-9]+))([eE][+-]?[0-9]+)?/;\n  const spacePattern = /^((\\s+,?\\s*)|(,\\s*))/;\n  const flagPattern = /^[01]/;\n  function parse$3(path2) {\n    const commands = [];\n    const matches = path2.match(commandPattern) || [];\n    matches.forEach((str) => {\n      let cmd = str[0];\n      const type2 = cmd.toLowerCase();\n      const paramCount = paramCounts[type2];\n      const params2 = parseParams(type2, paramCount, str.slice(1).trim());\n      const count2 = params2.length;\n      if (count2 < paramCount || count2 && count2 % paramCount !== 0) {\n        throw Error(\"Invalid SVG path, incorrect parameter count\");\n      }\n      commands.push([cmd, ...params2.slice(0, paramCount)]);\n      if (count2 === paramCount) {\n        return;\n      }\n      if (type2 === \"m\") {\n        cmd = cmd === \"M\" ? \"L\" : \"l\";\n      }\n      for (let i = paramCount; i < count2; i += paramCount) {\n        commands.push([cmd, ...params2.slice(i, i + paramCount)]);\n      }\n    });\n    return commands;\n  }\n  function parseParams(type2, paramCount, segment) {\n    const params2 = [];\n    for (let index2 = 0; paramCount && index2 < segment.length; ) {\n      for (let i = 0; i < paramCount; ++i) {\n        const pattern = type2 === \"a\" && (i === 3 || i === 4) ? flagPattern : numberPattern;\n        const match2 = segment.slice(index2).match(pattern);\n        if (match2 === null) {\n          throw Error(\"Invalid SVG path, incorrect parameter type\");\n        }\n        index2 += match2[0].length;\n        params2.push(+match2[0]);\n        const ws = segment.slice(index2).match(spacePattern);\n        if (ws !== null) {\n          index2 += ws[0].length;\n        }\n      }\n    }\n    return params2;\n  }\n  const DegToRad = Math.PI / 180;\n  const Epsilon = 1e-14;\n  const HalfPi = Math.PI / 2;\n  const Tau = Math.PI * 2;\n  const HalfSqrt3 = Math.sqrt(3) / 2;\n  var segmentCache = {};\n  var bezierCache = {};\n  var join$1 = [].join;\n  function segments(x2, y2, rx, ry, large, sweep, rotateX2, ox, oy) {\n    const key2 = join$1.call(arguments);\n    if (segmentCache[key2]) {\n      return segmentCache[key2];\n    }\n    const th = rotateX2 * DegToRad;\n    const sin_th = Math.sin(th);\n    const cos_th = Math.cos(th);\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n    const px2 = cos_th * (ox - x2) * 0.5 + sin_th * (oy - y2) * 0.5;\n    const py2 = cos_th * (oy - y2) * 0.5 - sin_th * (ox - x2) * 0.5;\n    let pl = px2 * px2 / (rx * rx) + py2 * py2 / (ry * ry);\n    if (pl > 1) {\n      pl = Math.sqrt(pl);\n      rx *= pl;\n      ry *= pl;\n    }\n    const a00 = cos_th / rx;\n    const a01 = sin_th / rx;\n    const a10 = -sin_th / ry;\n    const a11 = cos_th / ry;\n    const x02 = a00 * ox + a01 * oy;\n    const y02 = a10 * ox + a11 * oy;\n    const x12 = a00 * x2 + a01 * y2;\n    const y12 = a10 * x2 + a11 * y2;\n    const d2 = (x12 - x02) * (x12 - x02) + (y12 - y02) * (y12 - y02);\n    let sfactor_sq = 1 / d2 - 0.25;\n    if (sfactor_sq < 0) sfactor_sq = 0;\n    let sfactor = Math.sqrt(sfactor_sq);\n    if (sweep == large) sfactor = -sfactor;\n    const xc = 0.5 * (x02 + x12) - sfactor * (y12 - y02);\n    const yc = 0.5 * (y02 + y12) + sfactor * (x12 - x02);\n    const th0 = Math.atan2(y02 - yc, x02 - xc);\n    const th1 = Math.atan2(y12 - yc, x12 - xc);\n    let th_arc = th1 - th0;\n    if (th_arc < 0 && sweep === 1) {\n      th_arc += Tau;\n    } else if (th_arc > 0 && sweep === 0) {\n      th_arc -= Tau;\n    }\n    const segs = Math.ceil(Math.abs(th_arc / (HalfPi + 1e-3)));\n    const result = [];\n    for (let i = 0; i < segs; ++i) {\n      const th2 = th0 + i * th_arc / segs;\n      const th3 = th0 + (i + 1) * th_arc / segs;\n      result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];\n    }\n    return segmentCache[key2] = result;\n  }\n  function bezier(params2) {\n    const key2 = join$1.call(params2);\n    if (bezierCache[key2]) {\n      return bezierCache[key2];\n    }\n    var cx = params2[0], cy = params2[1], th0 = params2[2], th1 = params2[3], rx = params2[4], ry = params2[5], sin_th = params2[6], cos_th = params2[7];\n    const a00 = cos_th * rx;\n    const a01 = -sin_th * ry;\n    const a10 = sin_th * rx;\n    const a11 = cos_th * ry;\n    const cos_th0 = Math.cos(th0);\n    const sin_th0 = Math.sin(th0);\n    const cos_th1 = Math.cos(th1);\n    const sin_th1 = Math.sin(th1);\n    const th_half = 0.5 * (th1 - th0);\n    const sin_th_h2 = Math.sin(th_half * 0.5);\n    const t = 8 / 3 * sin_th_h2 * sin_th_h2 / Math.sin(th_half);\n    const x12 = cx + cos_th0 - t * sin_th0;\n    const y12 = cy + sin_th0 + t * cos_th0;\n    const x3 = cx + cos_th1;\n    const y3 = cy + sin_th1;\n    const x2 = x3 + t * sin_th1;\n    const y2 = y3 - t * cos_th1;\n    return bezierCache[key2] = [a00 * x12 + a01 * y12, a10 * x12 + a11 * y12, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3];\n  }\n  const temp = [\"l\", 0, 0, 0, 0, 0, 0, 0];\n  function scale$1$1(current, sX, sY) {\n    const c2 = temp[0] = current[0];\n    if (c2 === \"a\" || c2 === \"A\") {\n      temp[1] = sX * current[1];\n      temp[2] = sY * current[2];\n      temp[3] = current[3];\n      temp[4] = current[4];\n      temp[5] = current[5];\n      temp[6] = sX * current[6];\n      temp[7] = sY * current[7];\n    } else if (c2 === \"h\" || c2 === \"H\") {\n      temp[1] = sX * current[1];\n    } else if (c2 === \"v\" || c2 === \"V\") {\n      temp[1] = sY * current[1];\n    } else {\n      for (var i = 1, n = current.length; i < n; ++i) {\n        temp[i] = (i % 2 == 1 ? sX : sY) * current[i];\n      }\n    }\n    return temp;\n  }\n  function pathRender(context2, path2, l, t, sX, sY) {\n    var current, previous = null, x2 = 0, y2 = 0, controlX = 0, controlY = 0, tempX, tempY, tempControlX, tempControlY, anchorX = 0, anchorY = 0;\n    if (l == null) l = 0;\n    if (t == null) t = 0;\n    if (sX == null) sX = 1;\n    if (sY == null) sY = sX;\n    if (context2.beginPath) context2.beginPath();\n    for (var i = 0, len2 = path2.length; i < len2; ++i) {\n      current = path2[i];\n      if (sX !== 1 || sY !== 1) {\n        current = scale$1$1(current, sX, sY);\n      }\n      switch (current[0]) {\n        // first letter\n        case \"l\":\n          x2 += current[1];\n          y2 += current[2];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"L\":\n          x2 = current[1];\n          y2 = current[2];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"h\":\n          x2 += current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"H\":\n          x2 = current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"v\":\n          y2 += current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"V\":\n          y2 = current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"m\":\n          x2 += current[1];\n          y2 += current[2];\n          anchorX = x2;\n          anchorY = y2;\n          context2.moveTo(x2 + l, y2 + t);\n          break;\n        case \"M\":\n          x2 = current[1];\n          y2 = current[2];\n          anchorX = x2;\n          anchorY = y2;\n          context2.moveTo(x2 + l, y2 + t);\n          break;\n        case \"c\":\n          tempX = x2 + current[5];\n          tempY = y2 + current[6];\n          controlX = x2 + current[3];\n          controlY = y2 + current[4];\n          context2.bezierCurveTo(\n            x2 + current[1] + l,\n            // x1\n            y2 + current[2] + t,\n            // y1\n            controlX + l,\n            // x2\n            controlY + t,\n            // y2\n            tempX + l,\n            tempY + t\n          );\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"C\":\n          x2 = current[5];\n          y2 = current[6];\n          controlX = current[3];\n          controlY = current[4];\n          context2.bezierCurveTo(current[1] + l, current[2] + t, controlX + l, controlY + t, x2 + l, y2 + t);\n          break;\n        case \"s\":\n          tempX = x2 + current[3];\n          tempY = y2 + current[4];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.bezierCurveTo(controlX + l, controlY + t, x2 + current[1] + l, y2 + current[2] + t, tempX + l, tempY + t);\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"S\":\n          tempX = current[3];\n          tempY = current[4];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.bezierCurveTo(controlX + l, controlY + t, current[1] + l, current[2] + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = current[1];\n          controlY = current[2];\n          break;\n        case \"q\":\n          tempX = x2 + current[3];\n          tempY = y2 + current[4];\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"Q\":\n          tempX = current[3];\n          tempY = current[4];\n          context2.quadraticCurveTo(current[1] + l, current[2] + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = current[1];\n          controlY = current[2];\n          break;\n        case \"t\":\n          tempX = x2 + current[1];\n          tempY = y2 + current[2];\n          if (previous[0].match(/[QqTt]/) === null) {\n            controlX = x2;\n            controlY = y2;\n          } else if (previous[0] === \"t\") {\n            controlX = 2 * x2 - tempControlX;\n            controlY = 2 * y2 - tempControlY;\n          } else if (previous[0] === \"q\") {\n            controlX = 2 * x2 - controlX;\n            controlY = 2 * y2 - controlY;\n          }\n          tempControlX = controlX;\n          tempControlY = controlY;\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          break;\n        case \"T\":\n          tempX = current[1];\n          tempY = current[2];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"a\":\n          drawArc(context2, x2 + l, y2 + t, [current[1], current[2], current[3], current[4], current[5], current[6] + x2 + l, current[7] + y2 + t]);\n          x2 += current[6];\n          y2 += current[7];\n          break;\n        case \"A\":\n          drawArc(context2, x2 + l, y2 + t, [current[1], current[2], current[3], current[4], current[5], current[6] + l, current[7] + t]);\n          x2 = current[6];\n          y2 = current[7];\n          break;\n        case \"z\":\n        case \"Z\":\n          x2 = anchorX;\n          y2 = anchorY;\n          context2.closePath();\n          break;\n      }\n      previous = current;\n    }\n  }\n  function drawArc(context2, x2, y2, coords) {\n    const seg = segments(\n      coords[5],\n      // end x\n      coords[6],\n      // end y\n      coords[0],\n      // radius x\n      coords[1],\n      // radius y\n      coords[3],\n      // large flag\n      coords[4],\n      // sweep flag\n      coords[2],\n      // rotation\n      x2,\n      y2\n    );\n    for (let i = 0; i < seg.length; ++i) {\n      const bez = bezier(seg[i]);\n      context2.bezierCurveTo(bez[0], bez[1], bez[2], bez[3], bez[4], bez[5]);\n    }\n  }\n  const Tan30 = 0.5773502691896257;\n  const builtins = {\n    \"circle\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(r, 0);\n        context2.arc(0, 0, r, 0, Tau);\n      }\n    },\n    \"cross\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, s2 = r / 2.5;\n        context2.moveTo(-r, -s2);\n        context2.lineTo(-r, s2);\n        context2.lineTo(-s2, s2);\n        context2.lineTo(-s2, r);\n        context2.lineTo(s2, r);\n        context2.lineTo(s2, s2);\n        context2.lineTo(r, s2);\n        context2.lineTo(r, -s2);\n        context2.lineTo(s2, -s2);\n        context2.lineTo(s2, -r);\n        context2.lineTo(-s2, -r);\n        context2.lineTo(-s2, -s2);\n        context2.closePath();\n      }\n    },\n    \"diamond\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(-r, 0);\n        context2.lineTo(0, -r);\n        context2.lineTo(r, 0);\n        context2.lineTo(0, r);\n        context2.closePath();\n      }\n    },\n    \"square\": {\n      draw: function(context2, size) {\n        var w2 = Math.sqrt(size), x2 = -w2 / 2;\n        context2.rect(x2, x2, w2, w2);\n      }\n    },\n    \"arrow\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, s2 = r / 7, t = r / 2.5, v = r / 8;\n        context2.moveTo(-s2, r);\n        context2.lineTo(s2, r);\n        context2.lineTo(s2, -v);\n        context2.lineTo(t, -v);\n        context2.lineTo(0, -r);\n        context2.lineTo(-t, -v);\n        context2.lineTo(-s2, -v);\n        context2.closePath();\n      }\n    },\n    \"wedge\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30, b2 = r / 4;\n        context2.moveTo(0, -h2 - o);\n        context2.lineTo(-b2, h2 - o);\n        context2.lineTo(b2, h2 - o);\n        context2.closePath();\n      }\n    },\n    \"triangle\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30;\n        context2.moveTo(0, -h2 - o);\n        context2.lineTo(-r, h2 - o);\n        context2.lineTo(r, h2 - o);\n        context2.closePath();\n      }\n    },\n    \"triangle-up\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(0, -h2);\n        context2.lineTo(-r, h2);\n        context2.lineTo(r, h2);\n        context2.closePath();\n      }\n    },\n    \"triangle-down\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(0, h2);\n        context2.lineTo(-r, -h2);\n        context2.lineTo(r, -h2);\n        context2.closePath();\n      }\n    },\n    \"triangle-right\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(h2, 0);\n        context2.lineTo(-h2, -r);\n        context2.lineTo(-h2, r);\n        context2.closePath();\n      }\n    },\n    \"triangle-left\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(-h2, 0);\n        context2.lineTo(h2, -r);\n        context2.lineTo(h2, r);\n        context2.closePath();\n      }\n    },\n    \"stroke\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(-r, 0);\n        context2.lineTo(r, 0);\n      }\n    }\n  };\n  function symbols(_) {\n    return has$1(builtins, _) ? builtins[_] : customSymbol(_);\n  }\n  var custom = {};\n  function customSymbol(path2) {\n    if (!has$1(custom, path2)) {\n      const parsed = parse$3(path2);\n      custom[path2] = {\n        draw: function(context2, size) {\n          pathRender(context2, parsed, 0, 0, Math.sqrt(size) / 2);\n        }\n      };\n    }\n    return custom[path2];\n  }\n  const C = 0.448084975506;\n  function rectangleX(d2) {\n    return d2.x;\n  }\n  function rectangleY(d2) {\n    return d2.y;\n  }\n  function rectangleWidth(d2) {\n    return d2.width;\n  }\n  function rectangleHeight(d2) {\n    return d2.height;\n  }\n  function number$3(_) {\n    return typeof _ === \"function\" ? _ : () => +_;\n  }\n  function clamp(value2, min2, max2) {\n    return Math.max(min2, Math.min(value2, max2));\n  }\n  function vg_rect() {\n    var x2 = rectangleX, y2 = rectangleY, width2 = rectangleWidth, height2 = rectangleHeight, crTL = number$3(0), crTR = crTL, crBL = crTL, crBR = crTL, context2 = null;\n    function rectangle2(_, x02, y02) {\n      var buffer, x12 = x02 != null ? x02 : +x2.call(this, _), y12 = y02 != null ? y02 : +y2.call(this, _), w2 = +width2.call(this, _), h2 = +height2.call(this, _), s2 = Math.min(w2, h2) / 2, tl2 = clamp(+crTL.call(this, _), 0, s2), tr2 = clamp(+crTR.call(this, _), 0, s2), bl2 = clamp(+crBL.call(this, _), 0, s2), br2 = clamp(+crBR.call(this, _), 0, s2);\n      if (!context2) context2 = buffer = path$3();\n      if (tl2 <= 0 && tr2 <= 0 && bl2 <= 0 && br2 <= 0) {\n        context2.rect(x12, y12, w2, h2);\n      } else {\n        var x22 = x12 + w2, y22 = y12 + h2;\n        context2.moveTo(x12 + tl2, y12);\n        context2.lineTo(x22 - tr2, y12);\n        context2.bezierCurveTo(x22 - C * tr2, y12, x22, y12 + C * tr2, x22, y12 + tr2);\n        context2.lineTo(x22, y22 - br2);\n        context2.bezierCurveTo(x22, y22 - C * br2, x22 - C * br2, y22, x22 - br2, y22);\n        context2.lineTo(x12 + bl2, y22);\n        context2.bezierCurveTo(x12 + C * bl2, y22, x12, y22 - C * bl2, x12, y22 - bl2);\n        context2.lineTo(x12, y12 + tl2);\n        context2.bezierCurveTo(x12, y12 + C * tl2, x12 + C * tl2, y12, x12 + tl2, y12);\n        context2.closePath();\n      }\n      if (buffer) {\n        context2 = null;\n        return buffer + \"\" || null;\n      }\n    }\n    rectangle2.x = function(_) {\n      if (arguments.length) {\n        x2 = number$3(_);\n        return rectangle2;\n      } else {\n        return x2;\n      }\n    };\n    rectangle2.y = function(_) {\n      if (arguments.length) {\n        y2 = number$3(_);\n        return rectangle2;\n      } else {\n        return y2;\n      }\n    };\n    rectangle2.width = function(_) {\n      if (arguments.length) {\n        width2 = number$3(_);\n        return rectangle2;\n      } else {\n        return width2;\n      }\n    };\n    rectangle2.height = function(_) {\n      if (arguments.length) {\n        height2 = number$3(_);\n        return rectangle2;\n      } else {\n        return height2;\n      }\n    };\n    rectangle2.cornerRadius = function(tl2, tr2, br2, bl2) {\n      if (arguments.length) {\n        crTL = number$3(tl2);\n        crTR = tr2 != null ? number$3(tr2) : crTL;\n        crBR = br2 != null ? number$3(br2) : crTL;\n        crBL = bl2 != null ? number$3(bl2) : crTR;\n        return rectangle2;\n      } else {\n        return crTL;\n      }\n    };\n    rectangle2.context = function(_) {\n      if (arguments.length) {\n        context2 = _ == null ? null : _;\n        return rectangle2;\n      } else {\n        return context2;\n      }\n    };\n    return rectangle2;\n  }\n  function vg_trail() {\n    var x2, y2, size, defined, context2 = null, ready, x12, y12, r1;\n    function point2(x22, y22, w2) {\n      const r2 = w2 / 2;\n      if (ready) {\n        var ux = y12 - y22, uy = x22 - x12;\n        if (ux || uy) {\n          var ud = Math.hypot(ux, uy), rx = (ux /= ud) * r1, ry = (uy /= ud) * r1, t = Math.atan2(uy, ux);\n          context2.moveTo(x12 - rx, y12 - ry);\n          context2.lineTo(x22 - ux * r2, y22 - uy * r2);\n          context2.arc(x22, y22, r2, t - Math.PI, t);\n          context2.lineTo(x12 + rx, y12 + ry);\n          context2.arc(x12, y12, r1, t, t + Math.PI);\n        } else {\n          context2.arc(x22, y22, r2, 0, Tau);\n        }\n        context2.closePath();\n      } else {\n        ready = 1;\n      }\n      x12 = x22;\n      y12 = y22;\n      r1 = r2;\n    }\n    function trail2(data2) {\n      var i, n = data2.length, d2, defined0 = false, buffer;\n      if (context2 == null) context2 = buffer = path$3();\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d2 = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) ready = 0;\n        }\n        if (defined0) point2(+x2(d2, i, data2), +y2(d2, i, data2), +size(d2, i, data2));\n      }\n      if (buffer) {\n        context2 = null;\n        return buffer + \"\" || null;\n      }\n    }\n    trail2.x = function(_) {\n      if (arguments.length) {\n        x2 = _;\n        return trail2;\n      } else {\n        return x2;\n      }\n    };\n    trail2.y = function(_) {\n      if (arguments.length) {\n        y2 = _;\n        return trail2;\n      } else {\n        return y2;\n      }\n    };\n    trail2.size = function(_) {\n      if (arguments.length) {\n        size = _;\n        return trail2;\n      } else {\n        return size;\n      }\n    };\n    trail2.defined = function(_) {\n      if (arguments.length) {\n        defined = _;\n        return trail2;\n      } else {\n        return defined;\n      }\n    };\n    trail2.context = function(_) {\n      if (arguments.length) {\n        if (_ == null) {\n          context2 = null;\n        } else {\n          context2 = _;\n        }\n        return trail2;\n      } else {\n        return context2;\n      }\n    };\n    return trail2;\n  }\n  function value$1(a2, b2) {\n    return a2 != null ? a2 : b2;\n  }\n  const x$2 = (item) => item.x || 0, y$2 = (item) => item.y || 0, w = (item) => item.width || 0, h = (item) => item.height || 0, xw = (item) => (item.x || 0) + (item.width || 0), yh = (item) => (item.y || 0) + (item.height || 0), sa = (item) => item.startAngle || 0, ea = (item) => item.endAngle || 0, pa = (item) => item.padAngle || 0, ir = (item) => item.innerRadius || 0, or = (item) => item.outerRadius || 0, cr = (item) => item.cornerRadius || 0, tl = (item) => value$1(item.cornerRadiusTopLeft, item.cornerRadius) || 0, tr = (item) => value$1(item.cornerRadiusTopRight, item.cornerRadius) || 0, br = (item) => value$1(item.cornerRadiusBottomRight, item.cornerRadius) || 0, bl = (item) => value$1(item.cornerRadiusBottomLeft, item.cornerRadius) || 0, sz = (item) => value$1(item.size, 64), ts = (item) => item.size || 1, def = (item) => !(item.defined === false), type = (item) => symbols(item.shape || \"circle\");\n  const arcShape = arc$2$1().startAngle(sa).endAngle(ea).padAngle(pa).innerRadius(ir).outerRadius(or).cornerRadius(cr), areavShape = area$2$1().x(x$2).y1(y$2).y0(yh).defined(def), areahShape = area$2$1().y(y$2).x1(x$2).x0(xw).defined(def), lineShape = line$2$1().x(x$2).y(y$2).defined(def), rectShape = vg_rect().x(x$2).y(y$2).width(w).height(h).cornerRadius(tl, tr, br, bl), symbolShape = Symbol$1().type(type).size(sz), trailShape = vg_trail().x(x$2).y(y$2).defined(def).size(ts);\n  function hasCornerRadius(item) {\n    return item.cornerRadius || item.cornerRadiusTopLeft || item.cornerRadiusTopRight || item.cornerRadiusBottomRight || item.cornerRadiusBottomLeft;\n  }\n  function arc$1(context2, item) {\n    return arcShape.context(context2)(item);\n  }\n  function area$1(context2, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return (item.orient === \"horizontal\" ? areahShape : areavShape).curve(curves(interp, item.orient, item.tension)).context(context2)(items);\n  }\n  function line$1(context2, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return lineShape.curve(curves(interp, item.orient, item.tension)).context(context2)(items);\n  }\n  function rectangle(context2, item, x2, y2) {\n    return rectShape.context(context2)(item, x2, y2);\n  }\n  function shape$1(context2, item) {\n    return (item.mark.shape || item.shape).context(context2)(item);\n  }\n  function symbol$1(context2, item) {\n    return symbolShape.context(context2)(item);\n  }\n  function trail$1(context2, items) {\n    return trailShape.context(context2)(items);\n  }\n  var clip_id = 1;\n  function resetSVGClipId() {\n    clip_id = 1;\n  }\n  function clip$1$1(renderer, item, size) {\n    var clip2 = item.clip, defs = renderer._defs, id2 = item.clip_id || (item.clip_id = \"clip\" + clip_id++), c2 = defs.clipping[id2] || (defs.clipping[id2] = {\n      id: id2\n    });\n    if (isFunction(clip2)) {\n      c2.path = clip2(null);\n    } else if (hasCornerRadius(size)) {\n      c2.path = rectangle(null, size, 0, 0);\n    } else {\n      c2.width = size.width || 0;\n      c2.height = size.height || 0;\n    }\n    return \"url(#\" + id2 + \")\";\n  }\n  function Bounds(b2) {\n    this.clear();\n    if (b2) this.union(b2);\n  }\n  Bounds.prototype = {\n    clone() {\n      return new Bounds(this);\n    },\n    clear() {\n      this.x1 = +Number.MAX_VALUE;\n      this.y1 = +Number.MAX_VALUE;\n      this.x2 = -Number.MAX_VALUE;\n      this.y2 = -Number.MAX_VALUE;\n      return this;\n    },\n    empty() {\n      return this.x1 === +Number.MAX_VALUE && this.y1 === +Number.MAX_VALUE && this.x2 === -Number.MAX_VALUE && this.y2 === -Number.MAX_VALUE;\n    },\n    equals(b2) {\n      return this.x1 === b2.x1 && this.y1 === b2.y1 && this.x2 === b2.x2 && this.y2 === b2.y2;\n    },\n    set(x12, y12, x2, y2) {\n      if (x2 < x12) {\n        this.x2 = x12;\n        this.x1 = x2;\n      } else {\n        this.x1 = x12;\n        this.x2 = x2;\n      }\n      if (y2 < y12) {\n        this.y2 = y12;\n        this.y1 = y2;\n      } else {\n        this.y1 = y12;\n        this.y2 = y2;\n      }\n      return this;\n    },\n    add(x2, y2) {\n      if (x2 < this.x1) this.x1 = x2;\n      if (y2 < this.y1) this.y1 = y2;\n      if (x2 > this.x2) this.x2 = x2;\n      if (y2 > this.y2) this.y2 = y2;\n      return this;\n    },\n    expand(d2) {\n      this.x1 -= d2;\n      this.y1 -= d2;\n      this.x2 += d2;\n      this.y2 += d2;\n      return this;\n    },\n    round() {\n      this.x1 = Math.floor(this.x1);\n      this.y1 = Math.floor(this.y1);\n      this.x2 = Math.ceil(this.x2);\n      this.y2 = Math.ceil(this.y2);\n      return this;\n    },\n    scale(s2) {\n      this.x1 *= s2;\n      this.y1 *= s2;\n      this.x2 *= s2;\n      this.y2 *= s2;\n      return this;\n    },\n    translate(dx, dy) {\n      this.x1 += dx;\n      this.x2 += dx;\n      this.y1 += dy;\n      this.y2 += dy;\n      return this;\n    },\n    rotate(angle2, x2, y2) {\n      const p = this.rotatedPoints(angle2, x2, y2);\n      return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n    },\n    rotatedPoints(angle2, x2, y2) {\n      var {\n        x1: x12,\n        y1: y12,\n        x2: x22,\n        y2: y22\n      } = this, cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), cx = x2 - x2 * cos2 + y2 * sin2, cy = y2 - x2 * sin2 - y2 * cos2;\n      return [cos2 * x12 - sin2 * y12 + cx, sin2 * x12 + cos2 * y12 + cy, cos2 * x12 - sin2 * y22 + cx, sin2 * x12 + cos2 * y22 + cy, cos2 * x22 - sin2 * y12 + cx, sin2 * x22 + cos2 * y12 + cy, cos2 * x22 - sin2 * y22 + cx, sin2 * x22 + cos2 * y22 + cy];\n    },\n    union(b2) {\n      if (b2.x1 < this.x1) this.x1 = b2.x1;\n      if (b2.y1 < this.y1) this.y1 = b2.y1;\n      if (b2.x2 > this.x2) this.x2 = b2.x2;\n      if (b2.y2 > this.y2) this.y2 = b2.y2;\n      return this;\n    },\n    intersect(b2) {\n      if (b2.x1 > this.x1) this.x1 = b2.x1;\n      if (b2.y1 > this.y1) this.y1 = b2.y1;\n      if (b2.x2 < this.x2) this.x2 = b2.x2;\n      if (b2.y2 < this.y2) this.y2 = b2.y2;\n      return this;\n    },\n    encloses(b2) {\n      return b2 && this.x1 <= b2.x1 && this.x2 >= b2.x2 && this.y1 <= b2.y1 && this.y2 >= b2.y2;\n    },\n    alignsWith(b2) {\n      return b2 && (this.x1 == b2.x1 || this.x2 == b2.x2 || this.y1 == b2.y1 || this.y2 == b2.y2);\n    },\n    intersects(b2) {\n      return b2 && !(this.x2 < b2.x1 || this.x1 > b2.x2 || this.y2 < b2.y1 || this.y1 > b2.y2);\n    },\n    contains(x2, y2) {\n      return !(x2 < this.x1 || x2 > this.x2 || y2 < this.y1 || y2 > this.y2);\n    },\n    width() {\n      return this.x2 - this.x1;\n    },\n    height() {\n      return this.y2 - this.y1;\n    }\n  };\n  function Item(mark) {\n    this.mark = mark;\n    this.bounds = this.bounds || new Bounds();\n  }\n  function GroupItem(mark) {\n    Item.call(this, mark);\n    this.items = this.items || [];\n  }\n  inherits(GroupItem, Item);\n  class ResourceLoader {\n    constructor(customLoader) {\n      this._pending = 0;\n      this._loader = customLoader || loader();\n    }\n    pending() {\n      return this._pending;\n    }\n    sanitizeURL(uri) {\n      const loader2 = this;\n      increment(loader2);\n      return loader2._loader.sanitize(uri, {\n        context: \"href\"\n      }).then((opt) => {\n        decrement(loader2);\n        return opt;\n      }).catch(() => {\n        decrement(loader2);\n        return null;\n      });\n    }\n    loadImage(uri) {\n      const loader2 = this, Image2 = domImage();\n      increment(loader2);\n      return loader2._loader.sanitize(uri, {\n        context: \"image\"\n      }).then((opt) => {\n        const url = opt.href;\n        if (!url || !Image2) throw {\n          url\n        };\n        const img = new Image2();\n        const cors = has$1(opt, \"crossOrigin\") ? opt.crossOrigin : \"anonymous\";\n        if (cors != null) img.crossOrigin = cors;\n        img.onload = () => decrement(loader2);\n        img.onerror = () => decrement(loader2);\n        img.src = url;\n        return img;\n      }).catch((e) => {\n        decrement(loader2);\n        return {\n          complete: false,\n          width: 0,\n          height: 0,\n          src: e && e.url || \"\"\n        };\n      });\n    }\n    ready() {\n      const loader2 = this;\n      return new Promise((accept) => {\n        function poll(value2) {\n          if (!loader2.pending()) accept(value2);\n          else setTimeout(() => {\n            poll(true);\n          }, 10);\n        }\n        poll(false);\n      });\n    }\n  }\n  function increment(loader2) {\n    loader2._pending += 1;\n  }\n  function decrement(loader2) {\n    loader2._pending -= 1;\n  }\n  function boundStroke(bounds2, item, miter) {\n    if (item.stroke && item.opacity !== 0 && item.strokeOpacity !== 0) {\n      const sw = item.strokeWidth != null ? +item.strokeWidth : 1;\n      bounds2.expand(sw + (miter ? miterAdjustment(item, sw) : 0));\n    }\n    return bounds2;\n  }\n  function miterAdjustment(item, strokeWidth) {\n    return item.strokeJoin && item.strokeJoin !== \"miter\" ? 0 : strokeWidth;\n  }\n  const circleThreshold = Tau - 1e-8;\n  let bounds, lx, ly, rot, ma, mb, mc, md;\n  const add$1 = (x2, y2) => bounds.add(x2, y2);\n  const addL = (x2, y2) => add$1(lx = x2, ly = y2);\n  const addX = (x2) => add$1(x2, bounds.y1);\n  const addY = (y2) => add$1(bounds.x1, y2);\n  const px = (x2, y2) => ma * x2 + mc * y2;\n  const py = (x2, y2) => mb * x2 + md * y2;\n  const addp = (x2, y2) => add$1(px(x2, y2), py(x2, y2));\n  const addpL = (x2, y2) => addL(px(x2, y2), py(x2, y2));\n  function boundContext(_, deg) {\n    bounds = _;\n    if (deg) {\n      rot = deg * DegToRad;\n      ma = md = Math.cos(rot);\n      mb = Math.sin(rot);\n      mc = -mb;\n    } else {\n      ma = md = 1;\n      rot = mb = mc = 0;\n    }\n    return context$1;\n  }\n  const context$1 = {\n    beginPath() {\n    },\n    closePath() {\n    },\n    moveTo: addpL,\n    lineTo: addpL,\n    rect(x2, y2, w2, h2) {\n      if (rot) {\n        addp(x2 + w2, y2);\n        addp(x2 + w2, y2 + h2);\n        addp(x2, y2 + h2);\n        addpL(x2, y2);\n      } else {\n        add$1(x2 + w2, y2 + h2);\n        addL(x2, y2);\n      }\n    },\n    quadraticCurveTo(x12, y12, x2, y2) {\n      const px1 = px(x12, y12), py1 = py(x12, y12), px2 = px(x2, y2), py2 = py(x2, y2);\n      quadExtrema(lx, px1, px2, addX);\n      quadExtrema(ly, py1, py2, addY);\n      addL(px2, py2);\n    },\n    bezierCurveTo(x12, y12, x2, y2, x3, y3) {\n      const px1 = px(x12, y12), py1 = py(x12, y12), px2 = px(x2, y2), py2 = py(x2, y2), px3 = px(x3, y3), py3 = py(x3, y3);\n      cubicExtrema(lx, px1, px2, px3, addX);\n      cubicExtrema(ly, py1, py2, py3, addY);\n      addL(px3, py3);\n    },\n    arc(cx, cy, r, sa2, ea2, ccw) {\n      sa2 += rot;\n      ea2 += rot;\n      lx = r * Math.cos(ea2) + cx;\n      ly = r * Math.sin(ea2) + cy;\n      if (Math.abs(ea2 - sa2) > circleThreshold) {\n        add$1(cx - r, cy - r);\n        add$1(cx + r, cy + r);\n      } else {\n        const update2 = (a2) => add$1(r * Math.cos(a2) + cx, r * Math.sin(a2) + cy);\n        let s2, i;\n        update2(sa2);\n        update2(ea2);\n        if (ea2 !== sa2) {\n          sa2 = sa2 % Tau;\n          if (sa2 < 0) sa2 += Tau;\n          ea2 = ea2 % Tau;\n          if (ea2 < 0) ea2 += Tau;\n          if (ea2 < sa2) {\n            ccw = !ccw;\n            s2 = sa2;\n            sa2 = ea2;\n            ea2 = s2;\n          }\n          if (ccw) {\n            ea2 -= Tau;\n            s2 = sa2 - sa2 % HalfPi;\n            for (i = 0; i < 4 && s2 > ea2; ++i, s2 -= HalfPi) update2(s2);\n          } else {\n            s2 = sa2 - sa2 % HalfPi + HalfPi;\n            for (i = 0; i < 4 && s2 < ea2; ++i, s2 = s2 + HalfPi) update2(s2);\n          }\n        }\n      }\n    }\n  };\n  function quadExtrema(x02, x12, x2, cb) {\n    const t = (x02 - x12) / (x02 + x2 - 2 * x12);\n    if (0 < t && t < 1) cb(x02 + (x12 - x02) * t);\n  }\n  function cubicExtrema(x02, x12, x2, x3, cb) {\n    const a2 = x3 - x02 + 3 * x12 - 3 * x2, b2 = x02 + x2 - 2 * x12, c2 = x02 - x12;\n    let t02 = 0, t12 = 0, r;\n    if (Math.abs(a2) > Epsilon) {\n      r = b2 * b2 + c2 * a2;\n      if (r >= 0) {\n        r = Math.sqrt(r);\n        t02 = (-b2 + r) / a2;\n        t12 = (-b2 - r) / a2;\n      }\n    } else {\n      t02 = 0.5 * c2 / b2;\n    }\n    if (0 < t02 && t02 < 1) cb(cubic(t02, x02, x12, x2, x3));\n    if (0 < t12 && t12 < 1) cb(cubic(t12, x02, x12, x2, x3));\n  }\n  function cubic(t, x02, x12, x2, x3) {\n    const s2 = 1 - t, s22 = s2 * s2, t22 = t * t;\n    return s22 * s2 * x02 + 3 * s22 * t * x12 + 3 * s2 * t22 * x2 + t22 * t * x3;\n  }\n  var context$2 = (context$2 = domCanvas(1, 1)) ? context$2.getContext(\"2d\") : null;\n  const b = new Bounds();\n  function intersectPath(draw2) {\n    return function(item, brush) {\n      if (!context$2) return true;\n      draw2(context$2, item);\n      b.clear().union(item.bounds).intersect(brush).round();\n      const {\n        x1: x12,\n        y1: y12,\n        x2,\n        y2\n      } = b;\n      for (let y3 = y12; y3 <= y2; ++y3) {\n        for (let x3 = x12; x3 <= x2; ++x3) {\n          if (context$2.isPointInPath(x3, y3)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n  }\n  function intersectPoint(item, box2) {\n    return box2.contains(item.x || 0, item.y || 0);\n  }\n  function intersectRect(item, box2) {\n    const x2 = item.x || 0, y2 = item.y || 0, w2 = item.width || 0, h2 = item.height || 0;\n    return box2.intersects(b.set(x2, y2, x2 + w2, y2 + h2));\n  }\n  function intersectRule(item, box2) {\n    const x2 = item.x || 0, y2 = item.y || 0, x22 = item.x2 != null ? item.x2 : x2, y22 = item.y2 != null ? item.y2 : y2;\n    return intersectBoxLine(box2, x2, y2, x22, y22);\n  }\n  function intersectBoxLine(box2, x2, y2, u2, v) {\n    const {\n      x1: x12,\n      y1: y12,\n      x2: x22,\n      y2: y22\n    } = box2, dx = u2 - x2, dy = v - y2;\n    let t02 = 0, t12 = 1, p, q, r, e;\n    for (e = 0; e < 4; ++e) {\n      if (e === 0) {\n        p = -dx;\n        q = -(x12 - x2);\n      }\n      if (e === 1) {\n        p = dx;\n        q = x22 - x2;\n      }\n      if (e === 2) {\n        p = -dy;\n        q = -(y12 - y2);\n      }\n      if (e === 3) {\n        p = dy;\n        q = y22 - y2;\n      }\n      if (Math.abs(p) < 1e-10 && q < 0) return false;\n      r = q / p;\n      if (p < 0) {\n        if (r > t12) return false;\n        else if (r > t02) t02 = r;\n      } else if (p > 0) {\n        if (r < t02) return false;\n        else if (r < t12) t12 = r;\n      }\n    }\n    return true;\n  }\n  function blend(context2, item) {\n    context2.globalCompositeOperation = item.blend || \"source-over\";\n  }\n  function value$2(value2, dflt) {\n    return value2 == null ? dflt : value2;\n  }\n  function addStops(gradient2, stops) {\n    const n = stops.length;\n    for (let i = 0; i < n; ++i) {\n      gradient2.addColorStop(stops[i].offset, stops[i].color);\n    }\n    return gradient2;\n  }\n  function gradient$1(context2, spec, bounds2) {\n    const w2 = bounds2.width(), h2 = bounds2.height();\n    let gradient2;\n    if (spec.gradient === \"radial\") {\n      gradient2 = context2.createRadialGradient(bounds2.x1 + value$2(spec.x1, 0.5) * w2, bounds2.y1 + value$2(spec.y1, 0.5) * h2, Math.max(w2, h2) * value$2(spec.r1, 0), bounds2.x1 + value$2(spec.x2, 0.5) * w2, bounds2.y1 + value$2(spec.y2, 0.5) * h2, Math.max(w2, h2) * value$2(spec.r2, 0.5));\n    } else {\n      const x12 = value$2(spec.x1, 0), y12 = value$2(spec.y1, 0), x2 = value$2(spec.x2, 1), y2 = value$2(spec.y2, 0);\n      if (x12 === x2 || y12 === y2 || w2 === h2) {\n        gradient2 = context2.createLinearGradient(bounds2.x1 + x12 * w2, bounds2.y1 + y12 * h2, bounds2.x1 + x2 * w2, bounds2.y1 + y2 * h2);\n      } else {\n        const image2 = domCanvas(Math.ceil(w2), Math.ceil(h2)), ictx = image2.getContext(\"2d\");\n        ictx.scale(w2, h2);\n        ictx.fillStyle = addStops(ictx.createLinearGradient(x12, y12, x2, y2), spec.stops);\n        ictx.fillRect(0, 0, w2, h2);\n        return context2.createPattern(image2, \"no-repeat\");\n      }\n    }\n    return addStops(gradient2, spec.stops);\n  }\n  function color$1(context2, item, value2) {\n    return isGradient(value2) ? gradient$1(context2, value2, item.bounds) : value2;\n  }\n  function fill(context2, item, opacity2) {\n    opacity2 *= item.fillOpacity == null ? 1 : item.fillOpacity;\n    if (opacity2 > 0) {\n      context2.globalAlpha = opacity2;\n      context2.fillStyle = color$1(context2, item, item.fill);\n      return true;\n    } else {\n      return false;\n    }\n  }\n  var Empty = [];\n  function stroke(context2, item, opacity2) {\n    var lw = (lw = item.strokeWidth) != null ? lw : 1;\n    if (lw <= 0) return false;\n    opacity2 *= item.strokeOpacity == null ? 1 : item.strokeOpacity;\n    if (opacity2 > 0) {\n      context2.globalAlpha = opacity2;\n      context2.strokeStyle = color$1(context2, item, item.stroke);\n      context2.lineWidth = lw;\n      context2.lineCap = item.strokeCap || \"butt\";\n      context2.lineJoin = item.strokeJoin || \"miter\";\n      context2.miterLimit = item.strokeMiterLimit || 10;\n      if (context2.setLineDash) {\n        context2.setLineDash(item.strokeDash || Empty);\n        context2.lineDashOffset = item.strokeDashOffset || 0;\n      }\n      return true;\n    } else {\n      return false;\n    }\n  }\n  function compare(a2, b2) {\n    return a2.zindex - b2.zindex || a2.index - b2.index;\n  }\n  function zorder(scene) {\n    if (!scene.zdirty) return scene.zitems;\n    var items = scene.items, output2 = [], item, i, n;\n    for (i = 0, n = items.length; i < n; ++i) {\n      item = items[i];\n      item.index = i;\n      if (item.zindex) output2.push(item);\n    }\n    scene.zdirty = false;\n    return scene.zitems = output2.sort(compare);\n  }\n  function visit(scene, visitor) {\n    var items = scene.items, i, n;\n    if (!items || !items.length) return;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        if (!items[i].zindex) visitor(items[i]);\n      }\n      items = zitems;\n    }\n    for (i = 0, n = items.length; i < n; ++i) {\n      visitor(items[i]);\n    }\n  }\n  function pickVisit(scene, visitor) {\n    var items = scene.items, hit2, i;\n    if (!items || !items.length) return null;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) items = zitems;\n    for (i = items.length; --i >= 0; ) {\n      if (hit2 = visitor(items[i])) return hit2;\n    }\n    if (items === zitems) {\n      for (items = scene.items, i = items.length; --i >= 0; ) {\n        if (!items[i].zindex) {\n          if (hit2 = visitor(items[i])) return hit2;\n        }\n      }\n    }\n    return null;\n  }\n  function drawAll(path2) {\n    return function(context2, scene, bounds2) {\n      visit(scene, (item) => {\n        if (!bounds2 || bounds2.intersects(item.bounds)) {\n          drawPath(path2, context2, item, item);\n        }\n      });\n    };\n  }\n  function drawOne(path2) {\n    return function(context2, scene, bounds2) {\n      if (scene.items.length && (!bounds2 || bounds2.intersects(scene.bounds))) {\n        drawPath(path2, context2, scene.items[0], scene.items);\n      }\n    };\n  }\n  function drawPath(path2, context2, item, items) {\n    var opacity2 = item.opacity == null ? 1 : item.opacity;\n    if (opacity2 === 0) return;\n    if (path2(context2, items)) return;\n    blend(context2, item);\n    if (item.fill && fill(context2, item, opacity2)) {\n      context2.fill();\n    }\n    if (item.stroke && stroke(context2, item, opacity2)) {\n      context2.stroke();\n    }\n  }\n  function pick$1(test2) {\n    test2 = test2 || truthy;\n    return function(context2, scene, x2, y2, gx, gy) {\n      x2 *= context2.pixelRatio;\n      y2 *= context2.pixelRatio;\n      return pickVisit(scene, (item) => {\n        const b2 = item.bounds;\n        if (b2 && !b2.contains(gx, gy) || !b2) return;\n        if (test2(context2, item, x2, y2, gx, gy)) return item;\n      });\n    };\n  }\n  function hitPath(path2, filled) {\n    return function(context2, o, x2, y2) {\n      var item = Array.isArray(o) ? o[0] : o, fill2 = filled == null ? item.fill : filled, stroke2 = item.stroke && context2.isPointInStroke, lw, lc;\n      if (stroke2) {\n        lw = item.strokeWidth;\n        lc = item.strokeCap;\n        context2.lineWidth = lw != null ? lw : 1;\n        context2.lineCap = lc != null ? lc : \"butt\";\n      }\n      return path2(context2, o) ? false : fill2 && context2.isPointInPath(x2, y2) || stroke2 && context2.isPointInStroke(x2, y2);\n    };\n  }\n  function pickPath(path2) {\n    return pick$1(hitPath(path2));\n  }\n  function translate$1(x2, y2) {\n    return \"translate(\" + x2 + \",\" + y2 + \")\";\n  }\n  function rotate(a2) {\n    return \"rotate(\" + a2 + \")\";\n  }\n  function scale$3(scaleX, scaleY2) {\n    return \"scale(\" + scaleX + \",\" + scaleY2 + \")\";\n  }\n  function translateItem(item) {\n    return translate$1(item.x || 0, item.y || 0);\n  }\n  function rotateItem(item) {\n    return translate$1(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\");\n  }\n  function transformItem(item) {\n    return translate$1(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\") + (item.scaleX || item.scaleY ? \" \" + scale$3(item.scaleX || 1, item.scaleY || 1) : \"\");\n  }\n  function markItemPath(type2, shape2, isect) {\n    function attr2(emit2, item) {\n      emit2(\"transform\", rotateItem(item));\n      emit2(\"d\", shape2(null, item));\n    }\n    function bound2(bounds2, item) {\n      shape2(boundContext(bounds2, item.angle), item);\n      return boundStroke(bounds2, item).translate(item.x || 0, item.y || 0);\n    }\n    function draw2(context2, item) {\n      var x2 = item.x || 0, y2 = item.y || 0, a2 = item.angle || 0;\n      context2.translate(x2, y2);\n      if (a2) context2.rotate(a2 *= DegToRad);\n      context2.beginPath();\n      shape2(context2, item);\n      if (a2) context2.rotate(-a2);\n      context2.translate(-x2, -y2);\n    }\n    return {\n      type: type2,\n      tag: \"path\",\n      nested: false,\n      attr: attr2,\n      bound: bound2,\n      draw: drawAll(draw2),\n      pick: pickPath(draw2),\n      isect: isect || intersectPath(draw2)\n    };\n  }\n  var arc$2 = markItemPath(\"arc\", arc$1);\n  function pickArea(a2, p) {\n    var v = a2[0].orient === \"horizontal\" ? p[1] : p[0], z2 = a2[0].orient === \"horizontal\" ? \"y\" : \"x\", i = a2.length, min2 = Infinity, hit2, d2;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      d2 = Math.abs(a2[i][z2] - v);\n      if (d2 < min2) {\n        min2 = d2;\n        hit2 = a2[i];\n      }\n    }\n    return hit2;\n  }\n  function pickLine(a2, p) {\n    var t = Math.pow(a2[0].strokeWidth || 1, 2), i = a2.length, dx, dy, dd;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      dx = a2[i].x - p[0];\n      dy = a2[i].y - p[1];\n      dd = dx * dx + dy * dy;\n      if (dd < t) return a2[i];\n    }\n    return null;\n  }\n  function pickTrail(a2, p) {\n    var i = a2.length, dx, dy, dd;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      dx = a2[i].x - p[0];\n      dy = a2[i].y - p[1];\n      dd = dx * dx + dy * dy;\n      dx = a2[i].size || 1;\n      if (dd < dx * dx) return a2[i];\n    }\n    return null;\n  }\n  function markMultiItemPath(type2, shape2, tip) {\n    function attr2(emit2, item) {\n      var items = item.mark.items;\n      if (items.length) emit2(\"d\", shape2(null, items));\n    }\n    function bound2(bounds2, mark) {\n      var items = mark.items;\n      if (items.length === 0) {\n        return bounds2;\n      } else {\n        shape2(boundContext(bounds2), items);\n        return boundStroke(bounds2, items[0]);\n      }\n    }\n    function draw2(context2, items) {\n      context2.beginPath();\n      shape2(context2, items);\n    }\n    const hit2 = hitPath(draw2);\n    function pick2(context2, scene, x2, y2, gx, gy) {\n      var items = scene.items, b2 = scene.bounds;\n      if (!items || !items.length || b2 && !b2.contains(gx, gy)) {\n        return null;\n      }\n      x2 *= context2.pixelRatio;\n      y2 *= context2.pixelRatio;\n      return hit2(context2, items, x2, y2) ? items[0] : null;\n    }\n    return {\n      type: type2,\n      tag: \"path\",\n      nested: true,\n      attr: attr2,\n      bound: bound2,\n      draw: drawOne(draw2),\n      pick: pick2,\n      isect: intersectPoint,\n      tip\n    };\n  }\n  var area$2 = markMultiItemPath(\"area\", area$1, pickArea);\n  function clip$2(context2, scene) {\n    var clip2 = scene.clip;\n    context2.save();\n    if (isFunction(clip2)) {\n      context2.beginPath();\n      clip2(context2);\n      context2.clip();\n    } else {\n      clipGroup(context2, scene.group);\n    }\n  }\n  function clipGroup(context2, group2) {\n    context2.beginPath();\n    hasCornerRadius(group2) ? rectangle(context2, group2, 0, 0) : context2.rect(0, 0, group2.width || 0, group2.height || 0);\n    context2.clip();\n  }\n  function offset$1(item) {\n    const sw = value$2(item.strokeWidth, 1);\n    return item.strokeOffset != null ? item.strokeOffset : item.stroke && sw > 0.5 && sw < 1.5 ? 0.5 - Math.abs(sw - 1) : 0;\n  }\n  function attr$5(emit2, item) {\n    emit2(\"transform\", translateItem(item));\n  }\n  function emitRectangle(emit2, item) {\n    const off = offset$1(item);\n    emit2(\"d\", rectangle(null, item, off, off));\n  }\n  function background$1(emit2, item) {\n    emit2(\"class\", \"background\");\n    emit2(\"aria-hidden\", true);\n    emitRectangle(emit2, item);\n  }\n  function foreground(emit2, item) {\n    emit2(\"class\", \"foreground\");\n    emit2(\"aria-hidden\", true);\n    if (item.strokeForeground) {\n      emitRectangle(emit2, item);\n    } else {\n      emit2(\"d\", \"\");\n    }\n  }\n  function content(emit2, item, renderer) {\n    const url = item.clip ? clip$1$1(renderer, item, item) : null;\n    emit2(\"clip-path\", url);\n  }\n  function bound$5(bounds2, group2) {\n    if (!group2.clip && group2.items) {\n      const items = group2.items, m2 = items.length;\n      for (let j = 0; j < m2; ++j) {\n        bounds2.union(items[j].bounds);\n      }\n    }\n    if ((group2.clip || group2.width || group2.height) && !group2.noBound) {\n      bounds2.add(0, 0).add(group2.width || 0, group2.height || 0);\n    }\n    boundStroke(bounds2, group2);\n    return bounds2.translate(group2.x || 0, group2.y || 0);\n  }\n  function rectanglePath(context2, group2, x2, y2) {\n    const off = offset$1(group2);\n    context2.beginPath();\n    rectangle(context2, group2, (x2 || 0) + off, (y2 || 0) + off);\n  }\n  const hitBackground = hitPath(rectanglePath);\n  const hitForeground = hitPath(rectanglePath, false);\n  const hitCorner = hitPath(rectanglePath, true);\n  function draw$4(context2, scene, bounds2, markTypes) {\n    visit(scene, (group2) => {\n      const gx = group2.x || 0, gy = group2.y || 0, fore = group2.strokeForeground, opacity2 = group2.opacity == null ? 1 : group2.opacity;\n      if ((group2.stroke || group2.fill) && opacity2) {\n        rectanglePath(context2, group2, gx, gy);\n        blend(context2, group2);\n        if (group2.fill && fill(context2, group2, opacity2)) {\n          context2.fill();\n        }\n        if (group2.stroke && !fore && stroke(context2, group2, opacity2)) {\n          context2.stroke();\n        }\n      }\n      context2.save();\n      context2.translate(gx, gy);\n      if (group2.clip) clipGroup(context2, group2);\n      if (bounds2) bounds2.translate(-gx, -gy);\n      visit(group2, (item) => {\n        if (item.marktype === \"group\" || markTypes == null || markTypes.includes(item.marktype)) {\n          this.draw(context2, item, bounds2, markTypes);\n        }\n      });\n      if (bounds2) bounds2.translate(gx, gy);\n      context2.restore();\n      if (fore && group2.stroke && opacity2) {\n        rectanglePath(context2, group2, gx, gy);\n        blend(context2, group2);\n        if (stroke(context2, group2, opacity2)) {\n          context2.stroke();\n        }\n      }\n    });\n  }\n  function pick(context2, scene, x2, y2, gx, gy) {\n    if (scene.bounds && !scene.bounds.contains(gx, gy) || !scene.items) {\n      return null;\n    }\n    const cx = x2 * context2.pixelRatio, cy = y2 * context2.pixelRatio;\n    return pickVisit(scene, (group2) => {\n      let hit2, dx, dy;\n      const b2 = group2.bounds;\n      if (b2 && !b2.contains(gx, gy)) return;\n      dx = group2.x || 0;\n      dy = group2.y || 0;\n      const dw = dx + (group2.width || 0), dh = dy + (group2.height || 0), c2 = group2.clip;\n      if (c2 && (gx < dx || gx > dw || gy < dy || gy > dh)) return;\n      context2.save();\n      context2.translate(dx, dy);\n      dx = gx - dx;\n      dy = gy - dy;\n      if (c2 && hasCornerRadius(group2) && !hitCorner(context2, group2, cx, cy)) {\n        context2.restore();\n        return null;\n      }\n      const fore = group2.strokeForeground, ix = scene.interactive !== false;\n      if (ix && fore && group2.stroke && hitForeground(context2, group2, cx, cy)) {\n        context2.restore();\n        return group2;\n      }\n      hit2 = pickVisit(group2, (mark) => pickMark(mark, dx, dy) ? this.pick(mark, x2, y2, dx, dy) : null);\n      if (!hit2 && ix && (group2.fill || !fore && group2.stroke) && hitBackground(context2, group2, cx, cy)) {\n        hit2 = group2;\n      }\n      context2.restore();\n      return hit2 || null;\n    });\n  }\n  function pickMark(mark, x2, y2) {\n    return (mark.interactive !== false || mark.marktype === \"group\") && mark.bounds && mark.bounds.contains(x2, y2);\n  }\n  var group = {\n    type: \"group\",\n    tag: \"g\",\n    nested: false,\n    attr: attr$5,\n    bound: bound$5,\n    draw: draw$4,\n    pick,\n    isect: intersectRect,\n    content,\n    background: background$1,\n    foreground\n  };\n  var metadata = {\n    \"xmlns\": \"http://www.w3.org/2000/svg\",\n    \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n    \"version\": \"1.1\"\n  };\n  function getImage(item, renderer) {\n    var image2 = item.image;\n    if (!image2 || item.url && item.url !== image2.url) {\n      image2 = {\n        complete: false,\n        width: 0,\n        height: 0\n      };\n      renderer.loadImage(item.url).then((image3) => {\n        item.image = image3;\n        item.image.url = item.url;\n      });\n    }\n    return image2;\n  }\n  function imageWidth(item, image2) {\n    return item.width != null ? item.width : !image2 || !image2.width ? 0 : item.aspect !== false && item.height ? item.height * image2.width / image2.height : image2.width;\n  }\n  function imageHeight(item, image2) {\n    return item.height != null ? item.height : !image2 || !image2.height ? 0 : item.aspect !== false && item.width ? item.width * image2.height / image2.width : image2.height;\n  }\n  function imageXOffset(align, w2) {\n    return align === \"center\" ? w2 / 2 : align === \"right\" ? w2 : 0;\n  }\n  function imageYOffset(baseline2, h2) {\n    return baseline2 === \"middle\" ? h2 / 2 : baseline2 === \"bottom\" ? h2 : 0;\n  }\n  function attr$4(emit2, item, renderer) {\n    const img = getImage(item, renderer), w2 = imageWidth(item, img), h2 = imageHeight(item, img), x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2), i = !img.src && img.toDataURL ? img.toDataURL() : img.src || \"\";\n    emit2(\"href\", i, metadata[\"xmlns:xlink\"], \"xlink:href\");\n    emit2(\"transform\", translate$1(x2, y2));\n    emit2(\"width\", w2);\n    emit2(\"height\", h2);\n    emit2(\"preserveAspectRatio\", item.aspect === false ? \"none\" : \"xMidYMid\");\n  }\n  function bound$4(bounds2, item) {\n    const img = item.image, w2 = imageWidth(item, img), h2 = imageHeight(item, img), x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2);\n    return bounds2.set(x2, y2, x2 + w2, y2 + h2);\n  }\n  function draw$3(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      if (bounds2 && !bounds2.intersects(item.bounds)) return;\n      const img = getImage(item, this);\n      let w2 = imageWidth(item, img);\n      let h2 = imageHeight(item, img);\n      if (w2 === 0 || h2 === 0) return;\n      let x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2), opacity2, ar0, ar1, t;\n      if (item.aspect !== false) {\n        ar0 = img.width / img.height;\n        ar1 = item.width / item.height;\n        if (ar0 === ar0 && ar1 === ar1 && ar0 !== ar1) {\n          if (ar1 < ar0) {\n            t = w2 / ar0;\n            y2 += (h2 - t) / 2;\n            h2 = t;\n          } else {\n            t = h2 * ar0;\n            x2 += (w2 - t) / 2;\n            w2 = t;\n          }\n        }\n      }\n      if (img.complete || img.toDataURL) {\n        blend(context2, item);\n        context2.globalAlpha = (opacity2 = item.opacity) != null ? opacity2 : 1;\n        context2.imageSmoothingEnabled = item.smooth !== false;\n        context2.drawImage(img, x2, y2, w2, h2);\n      }\n    });\n  }\n  var image = {\n    type: \"image\",\n    tag: \"image\",\n    nested: false,\n    attr: attr$4,\n    bound: bound$4,\n    draw: draw$3,\n    pick: pick$1(),\n    isect: truthy,\n    // bounds check is sufficient\n    get: getImage,\n    xOffset: imageXOffset,\n    yOffset: imageYOffset\n  };\n  var line$2 = markMultiItemPath(\"line\", line$1, pickLine);\n  function attr$3(emit2, item) {\n    var sx = item.scaleX || 1, sy = item.scaleY || 1;\n    if (sx !== 1 || sy !== 1) {\n      emit2(\"vector-effect\", \"non-scaling-stroke\");\n    }\n    emit2(\"transform\", transformItem(item));\n    emit2(\"d\", item.path);\n  }\n  function path$1(context2, item) {\n    var path2 = item.path;\n    if (path2 == null) return true;\n    var x2 = item.x || 0, y2 = item.y || 0, sx = item.scaleX || 1, sy = item.scaleY || 1, a2 = (item.angle || 0) * DegToRad, cache2 = item.pathCache;\n    if (!cache2 || cache2.path !== path2) {\n      (item.pathCache = cache2 = parse$3(path2)).path = path2;\n    }\n    if (a2 && context2.rotate && context2.translate) {\n      context2.translate(x2, y2);\n      context2.rotate(a2);\n      pathRender(context2, cache2, 0, 0, sx, sy);\n      context2.rotate(-a2);\n      context2.translate(-x2, -y2);\n    } else {\n      pathRender(context2, cache2, x2, y2, sx, sy);\n    }\n  }\n  function bound$3(bounds2, item) {\n    return path$1(boundContext(bounds2, item.angle), item) ? bounds2.set(0, 0, 0, 0) : boundStroke(bounds2, item, true);\n  }\n  var path$2 = {\n    type: \"path\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$3,\n    bound: bound$3,\n    draw: drawAll(path$1),\n    pick: pickPath(path$1),\n    isect: intersectPath(path$1)\n  };\n  function attr$2(emit2, item) {\n    emit2(\"d\", rectangle(null, item));\n  }\n  function bound$2(bounds2, item) {\n    var x2, y2;\n    return boundStroke(bounds2.set(x2 = item.x || 0, y2 = item.y || 0, x2 + item.width || 0, y2 + item.height || 0), item);\n  }\n  function draw$2(context2, item) {\n    context2.beginPath();\n    rectangle(context2, item);\n  }\n  var rect = {\n    type: \"rect\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$2,\n    bound: bound$2,\n    draw: drawAll(draw$2),\n    pick: pickPath(draw$2),\n    isect: intersectRect\n  };\n  function attr$1(emit2, item) {\n    emit2(\"transform\", translateItem(item));\n    emit2(\"x2\", item.x2 != null ? item.x2 - (item.x || 0) : 0);\n    emit2(\"y2\", item.y2 != null ? item.y2 - (item.y || 0) : 0);\n  }\n  function bound$1(bounds2, item) {\n    var x12, y12;\n    return boundStroke(bounds2.set(x12 = item.x || 0, y12 = item.y || 0, item.x2 != null ? item.x2 : x12, item.y2 != null ? item.y2 : y12), item);\n  }\n  function path(context2, item, opacity2) {\n    var x12, y12, x2, y2;\n    if (item.stroke && stroke(context2, item, opacity2)) {\n      x12 = item.x || 0;\n      y12 = item.y || 0;\n      x2 = item.x2 != null ? item.x2 : x12;\n      y2 = item.y2 != null ? item.y2 : y12;\n      context2.beginPath();\n      context2.moveTo(x12, y12);\n      context2.lineTo(x2, y2);\n      return true;\n    }\n    return false;\n  }\n  function draw$1(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      if (bounds2 && !bounds2.intersects(item.bounds)) return;\n      var opacity2 = item.opacity == null ? 1 : item.opacity;\n      if (opacity2 && path(context2, item, opacity2)) {\n        blend(context2, item);\n        context2.stroke();\n      }\n    });\n  }\n  function hit$1(context2, item, x2, y2) {\n    if (!context2.isPointInStroke) return false;\n    return path(context2, item, 1) && context2.isPointInStroke(x2, y2);\n  }\n  var rule$1 = {\n    type: \"rule\",\n    tag: \"line\",\n    nested: false,\n    attr: attr$1,\n    bound: bound$1,\n    draw: draw$1,\n    pick: pick$1(hit$1),\n    isect: intersectRule\n  };\n  var shape = markItemPath(\"shape\", shape$1);\n  var symbol = markItemPath(\"symbol\", symbol$1, intersectPoint);\n  const widthCache = lruCache();\n  var textMetrics = {\n    height: fontSize,\n    measureWidth,\n    estimateWidth,\n    width: estimateWidth,\n    canvas: useCanvas\n  };\n  useCanvas(true);\n  function useCanvas(use2) {\n    textMetrics.width = use2 && context$2 ? measureWidth : estimateWidth;\n  }\n  function estimateWidth(item, text2) {\n    return _estimateWidth(textValue(item, text2), fontSize(item));\n  }\n  function _estimateWidth(text2, currentFontHeight) {\n    return ~~(0.8 * text2.length * currentFontHeight);\n  }\n  function measureWidth(item, text2) {\n    return fontSize(item) <= 0 || !(text2 = textValue(item, text2)) ? 0 : _measureWidth(text2, font(item));\n  }\n  function _measureWidth(text2, currentFont) {\n    const key2 = `(${currentFont}) ${text2}`;\n    let width2 = widthCache.get(key2);\n    if (width2 === void 0) {\n      context$2.font = currentFont;\n      width2 = context$2.measureText(text2).width;\n      widthCache.set(key2, width2);\n    }\n    return width2;\n  }\n  function fontSize(item) {\n    return item.fontSize != null ? +item.fontSize || 0 : 11;\n  }\n  function lineHeight(item) {\n    return item.lineHeight != null ? item.lineHeight : fontSize(item) + 2;\n  }\n  function lineArray(_) {\n    return isArray(_) ? _.length > 1 ? _ : _[0] : _;\n  }\n  function textLines(item) {\n    return lineArray(item.lineBreak && item.text && !isArray(item.text) ? item.text.split(item.lineBreak) : item.text);\n  }\n  function multiLineOffset(item) {\n    const tl2 = textLines(item);\n    return (isArray(tl2) ? tl2.length - 1 : 0) * lineHeight(item);\n  }\n  function textValue(item, line2) {\n    const text2 = line2 == null ? \"\" : (line2 + \"\").trim();\n    return item.limit > 0 && text2.length ? truncate(item, text2) : text2;\n  }\n  function widthGetter(item) {\n    if (textMetrics.width === measureWidth) {\n      const currentFont = font(item);\n      return (text2) => _measureWidth(text2, currentFont);\n    } else if (textMetrics.width === estimateWidth) {\n      const currentFontHeight = fontSize(item);\n      return (text2) => _estimateWidth(text2, currentFontHeight);\n    } else {\n      return (text2) => textMetrics.width(item, text2);\n    }\n  }\n  function truncate(item, text2) {\n    var limit = +item.limit, width2 = widthGetter(item);\n    if (width2(text2) < limit) return text2;\n    var ellipsis = item.ellipsis || \"…\", rtl = item.dir === \"rtl\", lo = 0, hi = text2.length, mid;\n    limit -= width2(ellipsis);\n    if (rtl) {\n      while (lo < hi) {\n        mid = lo + hi >>> 1;\n        if (width2(text2.slice(mid)) > limit) lo = mid + 1;\n        else hi = mid;\n      }\n      return ellipsis + text2.slice(lo);\n    } else {\n      while (lo < hi) {\n        mid = 1 + (lo + hi >>> 1);\n        if (width2(text2.slice(0, mid)) < limit) lo = mid;\n        else hi = mid - 1;\n      }\n      return text2.slice(0, lo) + ellipsis;\n    }\n  }\n  function fontFamily(item, quote) {\n    var font2 = item.font;\n    return (quote && font2 ? String(font2).replace(/\"/g, \"'\") : font2) || \"sans-serif\";\n  }\n  function font(item, quote) {\n    return (item.fontStyle ? item.fontStyle + \" \" : \"\") + (item.fontVariant ? item.fontVariant + \" \" : \"\") + (item.fontWeight ? item.fontWeight + \" \" : \"\") + fontSize(item) + \"px \" + fontFamily(item, quote);\n  }\n  function offset$2(item) {\n    var baseline2 = item.baseline, h2 = fontSize(item);\n    return Math.round(baseline2 === \"top\" ? 0.79 * h2 : baseline2 === \"middle\" ? 0.3 * h2 : baseline2 === \"bottom\" ? -0.21 * h2 : baseline2 === \"line-top\" ? 0.29 * h2 + 0.5 * lineHeight(item) : baseline2 === \"line-bottom\" ? 0.29 * h2 - 0.5 * lineHeight(item) : 0);\n  }\n  const textAlign = {\n    \"left\": \"start\",\n    \"center\": \"middle\",\n    \"right\": \"end\"\n  };\n  const tempBounds$1 = new Bounds();\n  function anchorPoint(item) {\n    var x2 = item.x || 0, y2 = item.y || 0, r = item.radius || 0, t;\n    if (r) {\n      t = (item.theta || 0) - HalfPi;\n      x2 += r * Math.cos(t);\n      y2 += r * Math.sin(t);\n    }\n    tempBounds$1.x1 = x2;\n    tempBounds$1.y1 = y2;\n    return tempBounds$1;\n  }\n  function attr(emit2, item) {\n    var dx = item.dx || 0, dy = (item.dy || 0) + offset$2(item), p = anchorPoint(item), x2 = p.x1, y2 = p.y1, a2 = item.angle || 0, t;\n    emit2(\"text-anchor\", textAlign[item.align] || \"start\");\n    if (a2) {\n      t = translate$1(x2, y2) + \" \" + rotate(a2);\n      if (dx || dy) t += \" \" + translate$1(dx, dy);\n    } else {\n      t = translate$1(x2 + dx, y2 + dy);\n    }\n    emit2(\"transform\", t);\n  }\n  function bound(bounds2, item, mode) {\n    var h2 = textMetrics.height(item), a2 = item.align, p = anchorPoint(item), x2 = p.x1, y2 = p.y1, dx = item.dx || 0, dy = (item.dy || 0) + offset$2(item) - Math.round(0.8 * h2), tl2 = textLines(item), w2;\n    if (isArray(tl2)) {\n      h2 += lineHeight(item) * (tl2.length - 1);\n      w2 = tl2.reduce((w3, t) => Math.max(w3, textMetrics.width(item, t)), 0);\n    } else {\n      w2 = textMetrics.width(item, tl2);\n    }\n    if (a2 === \"center\") {\n      dx -= w2 / 2;\n    } else if (a2 === \"right\") {\n      dx -= w2;\n    } else ;\n    bounds2.set(dx += x2, dy += y2, dx + w2, dy + h2);\n    if (item.angle && !mode) {\n      bounds2.rotate(item.angle * DegToRad, x2, y2);\n    } else if (mode === 2) {\n      return bounds2.rotatedPoints(item.angle * DegToRad, x2, y2);\n    }\n    return bounds2;\n  }\n  function draw$5(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      var opacity2 = item.opacity == null ? 1 : item.opacity, p, x2, y2, i, lh, tl2, str;\n      if (bounds2 && !bounds2.intersects(item.bounds) || // bounds check\n      opacity2 === 0 || item.fontSize <= 0 || item.text == null || item.text.length === 0) return;\n      context2.font = font(item);\n      context2.textAlign = item.align || \"left\";\n      p = anchorPoint(item);\n      x2 = p.x1, y2 = p.y1;\n      if (item.angle) {\n        context2.save();\n        context2.translate(x2, y2);\n        context2.rotate(item.angle * DegToRad);\n        x2 = y2 = 0;\n      }\n      x2 += item.dx || 0;\n      y2 += (item.dy || 0) + offset$2(item);\n      tl2 = textLines(item);\n      blend(context2, item);\n      if (isArray(tl2)) {\n        lh = lineHeight(item);\n        for (i = 0; i < tl2.length; ++i) {\n          str = textValue(item, tl2[i]);\n          if (item.fill && fill(context2, item, opacity2)) {\n            context2.fillText(str, x2, y2);\n          }\n          if (item.stroke && stroke(context2, item, opacity2)) {\n            context2.strokeText(str, x2, y2);\n          }\n          y2 += lh;\n        }\n      } else {\n        str = textValue(item, tl2);\n        if (item.fill && fill(context2, item, opacity2)) {\n          context2.fillText(str, x2, y2);\n        }\n        if (item.stroke && stroke(context2, item, opacity2)) {\n          context2.strokeText(str, x2, y2);\n        }\n      }\n      if (item.angle) context2.restore();\n    });\n  }\n  function hit(context2, item, x2, y2, gx, gy) {\n    if (item.fontSize <= 0) return false;\n    if (!item.angle) return true;\n    var p = anchorPoint(item), ax = p.x1, ay = p.y1, b2 = bound(tempBounds$1, item, 1), a2 = -item.angle * DegToRad, cos2 = Math.cos(a2), sin2 = Math.sin(a2), px2 = cos2 * gx - sin2 * gy + (ax - cos2 * ax + sin2 * ay), py2 = sin2 * gx + cos2 * gy + (ay - sin2 * ax - cos2 * ay);\n    return b2.contains(px2, py2);\n  }\n  function intersectText(item, box2) {\n    const p = bound(tempBounds$1, item, 2);\n    return intersectBoxLine(box2, p[0], p[1], p[2], p[3]) || intersectBoxLine(box2, p[0], p[1], p[4], p[5]) || intersectBoxLine(box2, p[4], p[5], p[6], p[7]) || intersectBoxLine(box2, p[2], p[3], p[6], p[7]);\n  }\n  var text = {\n    type: \"text\",\n    tag: \"text\",\n    nested: false,\n    attr,\n    bound,\n    draw: draw$5,\n    pick: pick$1(hit),\n    isect: intersectText\n  };\n  var trail = markMultiItemPath(\"trail\", trail$1, pickTrail);\n  var Marks = {\n    arc: arc$2,\n    area: area$2,\n    group,\n    image,\n    line: line$2,\n    path: path$2,\n    rect,\n    rule: rule$1,\n    shape,\n    symbol,\n    text,\n    trail\n  };\n  function boundItem$1(item, func, opt) {\n    var type2 = Marks[item.mark.marktype], bound2 = func || type2.bound;\n    if (type2.nested) item = item.mark;\n    return bound2(item.bounds || (item.bounds = new Bounds()), item, opt);\n  }\n  var DUMMY = {\n    mark: null\n  };\n  function boundMark(mark, bounds2, opt) {\n    var type2 = Marks[mark.marktype], bound2 = type2.bound, items = mark.items, hasItems = items && items.length, i, n, item, b2;\n    if (type2.nested) {\n      if (hasItems) {\n        item = items[0];\n      } else {\n        DUMMY.mark = mark;\n        item = DUMMY;\n      }\n      b2 = boundItem$1(item, bound2, opt);\n      bounds2 = bounds2 && bounds2.union(b2) || b2;\n      return bounds2;\n    }\n    bounds2 = bounds2 || mark.bounds && mark.bounds.clear() || new Bounds();\n    if (hasItems) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        bounds2.union(boundItem$1(items[i], bound2, opt));\n      }\n    }\n    return mark.bounds = bounds2;\n  }\n  const keys$1 = [\n    \"marktype\",\n    \"name\",\n    \"role\",\n    \"interactive\",\n    \"clip\",\n    \"items\",\n    \"zindex\",\n    \"x\",\n    \"y\",\n    \"width\",\n    \"height\",\n    \"align\",\n    \"baseline\",\n    // layout\n    \"fill\",\n    \"fillOpacity\",\n    \"opacity\",\n    \"blend\",\n    // fill\n    \"stroke\",\n    \"strokeOpacity\",\n    \"strokeWidth\",\n    \"strokeCap\",\n    // stroke\n    \"strokeDash\",\n    \"strokeDashOffset\",\n    // stroke dash\n    \"strokeForeground\",\n    \"strokeOffset\",\n    // group\n    \"startAngle\",\n    \"endAngle\",\n    \"innerRadius\",\n    \"outerRadius\",\n    // arc\n    \"cornerRadius\",\n    \"padAngle\",\n    // arc, rect\n    \"cornerRadiusTopLeft\",\n    \"cornerRadiusTopRight\",\n    // rect, group\n    \"cornerRadiusBottomLeft\",\n    \"cornerRadiusBottomRight\",\n    \"interpolate\",\n    \"tension\",\n    \"orient\",\n    \"defined\",\n    // area, line\n    \"url\",\n    \"aspect\",\n    \"smooth\",\n    // image\n    \"path\",\n    \"scaleX\",\n    \"scaleY\",\n    // path\n    \"x2\",\n    \"y2\",\n    // rule\n    \"size\",\n    \"shape\",\n    // symbol\n    \"text\",\n    \"angle\",\n    \"theta\",\n    \"radius\",\n    \"dir\",\n    \"dx\",\n    \"dy\",\n    // text\n    \"ellipsis\",\n    \"limit\",\n    \"lineBreak\",\n    \"lineHeight\",\n    \"font\",\n    \"fontSize\",\n    \"fontWeight\",\n    \"fontStyle\",\n    \"fontVariant\",\n    // font\n    \"description\",\n    \"aria\",\n    \"ariaRole\",\n    \"ariaRoleDescription\"\n    // aria\n  ];\n  function sceneToJSON(scene, indent) {\n    return JSON.stringify(scene, keys$1, indent);\n  }\n  function sceneFromJSON(json2) {\n    const scene = typeof json2 === \"string\" ? JSON.parse(json2) : json2;\n    return initialize$1(scene);\n  }\n  function initialize$1(scene) {\n    var type2 = scene.marktype, items = scene.items, parent, i, n;\n    if (items) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        parent = type2 ? \"mark\" : \"group\";\n        items[i][parent] = scene;\n        if (items[i].zindex) items[i][parent].zdirty = true;\n        if (\"group\" === (type2 || parent)) initialize$1(items[i]);\n      }\n    }\n    if (type2) boundMark(scene);\n    return scene;\n  }\n  class Scenegraph {\n    constructor(scene) {\n      if (arguments.length) {\n        this.root = sceneFromJSON(scene);\n      } else {\n        this.root = createMark({\n          marktype: \"group\",\n          name: \"root\",\n          role: \"frame\"\n        });\n        this.root.items = [new GroupItem(this.root)];\n      }\n    }\n    toJSON(indent) {\n      return sceneToJSON(this.root, indent || 0);\n    }\n    mark(markdef, group2, index2) {\n      group2 = group2 || this.root.items[0];\n      const mark = createMark(markdef, group2);\n      group2.items[index2] = mark;\n      if (mark.zindex) mark.group.zdirty = true;\n      return mark;\n    }\n  }\n  function createMark(def2, group2) {\n    const mark = {\n      bounds: new Bounds(),\n      clip: !!def2.clip,\n      group: group2,\n      interactive: def2.interactive === false ? false : true,\n      items: [],\n      marktype: def2.marktype,\n      name: def2.name || void 0,\n      role: def2.role || void 0,\n      zindex: def2.zindex || 0\n    };\n    if (def2.aria != null) {\n      mark.aria = def2.aria;\n    }\n    if (def2.description) {\n      mark.description = def2.description;\n    }\n    return mark;\n  }\n  function domCreate(doc, tag, ns) {\n    if (!doc && typeof document !== \"undefined\" && document.createElement) {\n      doc = document;\n    }\n    return doc ? ns ? doc.createElementNS(ns, tag) : doc.createElement(tag) : null;\n  }\n  function domFind(el, tag) {\n    tag = tag.toLowerCase();\n    var nodes = el.childNodes, i = 0, n = nodes.length;\n    for (; i < n; ++i) if (nodes[i].tagName.toLowerCase() === tag) {\n      return nodes[i];\n    }\n  }\n  function domChild(el, index2, tag, ns) {\n    var a2 = el.childNodes[index2], b2;\n    if (!a2 || a2.tagName.toLowerCase() !== tag.toLowerCase()) {\n      b2 = a2 || null;\n      a2 = domCreate(el.ownerDocument, tag, ns);\n      el.insertBefore(a2, b2);\n    }\n    return a2;\n  }\n  function domClear(el, index2) {\n    var nodes = el.childNodes, curr = nodes.length;\n    while (curr > index2) el.removeChild(nodes[--curr]);\n    return el;\n  }\n  function cssClass(mark) {\n    return \"mark-\" + mark.marktype + (mark.role ? \" role-\" + mark.role : \"\") + (mark.name ? \" \" + mark.name : \"\");\n  }\n  function point(event2, el) {\n    const rect2 = el.getBoundingClientRect();\n    return [event2.clientX - rect2.left - (el.clientLeft || 0), event2.clientY - rect2.top - (el.clientTop || 0)];\n  }\n  function resolveItem(item, event2, el, origin) {\n    var mark = item && item.mark, mdef, p;\n    if (mark && (mdef = Marks[mark.marktype]).tip) {\n      p = point(event2, el);\n      p[0] -= origin[0];\n      p[1] -= origin[1];\n      while (item = item.mark.group) {\n        p[0] -= item.x || 0;\n        p[1] -= item.y || 0;\n      }\n      item = mdef.tip(mark.items, p);\n    }\n    return item;\n  }\n  class Handler {\n    /**\n     * Create a new Handler instance.\n     * @param {object} [customLoader] - Optional loader instance for\n     *   href URL sanitization. If not specified, a standard loader\n     *   instance will be generated.\n     * @param {function} [customTooltip] - Optional tooltip handler\n     *   function for custom tooltip display.\n     * @constructor\n     */\n    constructor(customLoader, customTooltip) {\n      this._active = null;\n      this._handlers = {};\n      this._loader = customLoader || loader();\n      this._tooltip = customTooltip || defaultTooltip$1;\n    }\n    /**\n     * Initialize a new Handler instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {object} [obj] - Optional context object that should serve as\n     *   the \"this\" context for event callbacks.\n     * @return {Handler} - This handler instance.\n     */\n    initialize(el, origin, obj2) {\n      this._el = el;\n      this._obj = obj2 || null;\n      return this.origin(origin);\n    }\n    /**\n     * Returns the parent container element for a visualization.\n     * @return {DOMElement} - The containing DOM element.\n     */\n    element() {\n      return this._el;\n    }\n    /**\n     * Returns the scene element (e.g., canvas or SVG) of the visualization\n     * Subclasses must override if the first child is not the scene element.\n     * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n     */\n    canvas() {\n      return this._el && this._el.firstChild;\n    }\n    /**\n     * Get / set the origin coordinates of the visualization.\n     */\n    origin(origin) {\n      if (arguments.length) {\n        this._origin = origin || [0, 0];\n        return this;\n      } else {\n        return this._origin.slice();\n      }\n    }\n    /**\n     * Get / set the scenegraph root.\n     */\n    scene(scene) {\n      if (!arguments.length) return this._scene;\n      this._scene = scene;\n      return this;\n    }\n    /**\n     * Add an event handler. Subclasses should override this method.\n     */\n    on() {\n    }\n    /**\n     * Remove an event handler. Subclasses should override this method.\n     */\n    off() {\n    }\n    /**\n     * Utility method for finding the array index of an event handler.\n     * @param {Array} h - An array of registered event handlers.\n     * @param {string} type - The event type.\n     * @param {function} handler - The event handler instance to find.\n     * @return {number} - The handler's array index or -1 if not registered.\n     */\n    _handlerIndex(h2, type2, handler) {\n      for (let i = h2 ? h2.length : 0; --i >= 0; ) {\n        if (h2[i].type === type2 && (!handler || h2[i].handler === handler)) {\n          return i;\n        }\n      }\n      return -1;\n    }\n    /**\n     * Returns an array with registered event handlers.\n     * @param {string} [type] - The event type to query. Any annotations\n     *   are ignored; for example, for the argument \"click.foo\", \".foo\" will\n     *   be ignored and the method returns all \"click\" handlers. If type is\n     *   null or unspecified, this method returns handlers for all types.\n     * @return {Array} - A new array containing all registered event handlers.\n     */\n    handlers(type2) {\n      const h2 = this._handlers, a2 = [];\n      if (type2) {\n        a2.push(...h2[this.eventName(type2)]);\n      } else {\n        for (const k in h2) {\n          a2.push(...h2[k]);\n        }\n      }\n      return a2;\n    }\n    /**\n     * Parses an event name string to return the specific event type.\n     * For example, given \"click.foo\" returns \"click\"\n     * @param {string} name - The input event type string.\n     * @return {string} - A string with the event type only.\n     */\n    eventName(name) {\n      const i = name.indexOf(\".\");\n      return i < 0 ? name : name.slice(0, i);\n    }\n    /**\n     * Handle hyperlink navigation in response to an item.href value.\n     * @param {Event} event - The event triggering hyperlink navigation.\n     * @param {Item} item - The scenegraph item.\n     * @param {string} href - The URL to navigate to.\n     */\n    handleHref(event2, item, href2) {\n      this._loader.sanitize(href2, {\n        context: \"href\"\n      }).then((opt) => {\n        const e = new MouseEvent(event2.type, event2), a2 = domCreate(null, \"a\");\n        for (const name in opt) a2.setAttribute(name, opt[name]);\n        a2.dispatchEvent(e);\n      }).catch(() => {\n      });\n    }\n    /**\n     * Handle tooltip display in response to an item.tooltip value.\n     * @param {Event} event - The event triggering tooltip display.\n     * @param {Item} item - The scenegraph item.\n     * @param {boolean} show - A boolean flag indicating whether\n     *   to show or hide a tooltip for the given item.\n     */\n    handleTooltip(event2, item, show) {\n      if (item && item.tooltip != null) {\n        item = resolveItem(item, event2, this.canvas(), this._origin);\n        const value2 = show && item && item.tooltip || null;\n        this._tooltip.call(this._obj, this, event2, item, value2);\n      }\n    }\n    /**\n     * Returns the size of a scenegraph item and its position relative\n     * to the viewport.\n     * @param {Item} item - The scenegraph item.\n     * @return {object} - A bounding box object (compatible with the\n     *   DOMRect type) consisting of x, y, width, heigh, top, left,\n     *   right, and bottom properties.\n     */\n    getItemBoundingClientRect(item) {\n      const el = this.canvas();\n      if (!el) return;\n      const rect2 = el.getBoundingClientRect(), origin = this._origin, bounds2 = item.bounds, width2 = bounds2.width(), height2 = bounds2.height();\n      let x2 = bounds2.x1 + origin[0] + rect2.left, y2 = bounds2.y1 + origin[1] + rect2.top;\n      while (item.mark && (item = item.mark.group)) {\n        x2 += item.x || 0;\n        y2 += item.y || 0;\n      }\n      return {\n        x: x2,\n        y: y2,\n        width: width2,\n        height: height2,\n        left: x2,\n        top: y2,\n        right: x2 + width2,\n        bottom: y2 + height2\n      };\n    }\n  }\n  function defaultTooltip$1(handler, event2, item, value2) {\n    handler.element().setAttribute(\"title\", value2 || \"\");\n  }\n  class Renderer {\n    /**\n     * Create a new Renderer instance.\n     * @param {object} [loader] - Optional loader instance for\n     *   image and href URL sanitization. If not specified, a\n     *   standard loader instance will be generated.\n     * @constructor\n     */\n    constructor(loader2) {\n      this._el = null;\n      this._bgcolor = null;\n      this._loader = new ResourceLoader(loader2);\n    }\n    /**\n     * Initialize a new Renderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {Renderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._el = el;\n      return this.resize(width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Returns the parent container element for a visualization.\n     * @return {DOMElement} - The containing DOM element.\n     */\n    element() {\n      return this._el;\n    }\n    /**\n     * Returns the scene element (e.g., canvas or SVG) of the visualization\n     * Subclasses must override if the first child is not the scene element.\n     * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n     */\n    canvas() {\n      return this._el && this._el.firstChild;\n    }\n    /**\n     * Get / set the background color.\n     */\n    background(bgcolor) {\n      if (arguments.length === 0) return this._bgcolor;\n      this._bgcolor = bgcolor;\n      return this;\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {Renderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      this._width = width2;\n      this._height = height2;\n      this._origin = origin || [0, 0];\n      this._scale = scaleFactor || 1;\n      return this;\n    }\n    /**\n     * Report a dirty item whose bounds should be redrawn.\n     * This base class method does nothing. Subclasses that perform\n     * incremental should implement this method.\n     * @param {Item} item - The dirty item whose bounds should be redrawn.\n     */\n    dirty() {\n    }\n    /**\n     * Render an input scenegraph, potentially with a set of dirty items.\n     * This method will perform an immediate rendering with available resources.\n     * The renderer may also need to perform image loading to perform a complete\n     * render. This process can lead to asynchronous re-rendering of the scene\n     * after this method returns. To receive notification when rendering is\n     * complete, use the renderAsync method instead.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     * @return {Renderer} - This renderer instance.\n     */\n    render(scene, markTypes) {\n      const r = this;\n      r._call = function() {\n        r._render(scene, markTypes);\n      };\n      r._call();\n      r._call = null;\n      return r;\n    }\n    /**\n     * Internal rendering method. Renderer subclasses should override this\n     * method to actually perform rendering.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render() {\n    }\n    /**\n     * Asynchronous rendering method. Similar to render, but returns a Promise\n     * that resolves when all rendering is completed. Sometimes a renderer must\n     * perform image loading to get a complete rendering. The returned\n     * Promise will not resolve until this process completes.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     * @return {Promise} - A Promise that resolves when rendering is complete.\n     */\n    renderAsync(scene, markTypes) {\n      const r = this.render(scene, markTypes);\n      return this._ready ? this._ready.then(() => r) : Promise.resolve(r);\n    }\n    /**\n     * Internal method for asynchronous resource loading.\n     * Proxies method calls to the ImageLoader, and tracks loading\n     * progress to invoke a re-render once complete.\n     * @param {string} method - The method name to invoke on the ImageLoader.\n     * @param {string} uri - The URI for the requested resource.\n     * @return {Promise} - A Promise that resolves to the requested resource.\n     */\n    _load(method2, uri) {\n      var r = this, p = r._loader[method2](uri);\n      if (!r._ready) {\n        const call = r._call;\n        r._ready = r._loader.ready().then((redraw) => {\n          if (redraw) call();\n          r._ready = null;\n        });\n      }\n      return p;\n    }\n    /**\n     * Sanitize a URL to include as a hyperlink in the rendered scene.\n     * This method proxies a call to ImageLoader.sanitizeURL, but also tracks\n     * image loading progress and invokes a re-render once complete.\n     * @param {string} uri - The URI string to sanitize.\n     * @return {Promise} - A Promise that resolves to the sanitized URL.\n     */\n    sanitizeURL(uri) {\n      return this._load(\"sanitizeURL\", uri);\n    }\n    /**\n     * Requests an image to include in the rendered scene.\n     * This method proxies a call to ImageLoader.loadImage, but also tracks\n     * image loading progress and invokes a re-render once complete.\n     * @param {string} uri - The URI string of the image.\n     * @return {Promise} - A Promise that resolves to the loaded Image.\n     */\n    loadImage(uri) {\n      return this._load(\"loadImage\", uri);\n    }\n  }\n  const KeyDownEvent = \"keydown\";\n  const KeyPressEvent = \"keypress\";\n  const KeyUpEvent = \"keyup\";\n  const DragEnterEvent = \"dragenter\";\n  const DragLeaveEvent = \"dragleave\";\n  const DragOverEvent = \"dragover\";\n  const PointerDownEvent = \"pointerdown\";\n  const PointerUpEvent = \"pointerup\";\n  const PointerMoveEvent = \"pointermove\";\n  const PointerOutEvent = \"pointerout\";\n  const PointerOverEvent = \"pointerover\";\n  const MouseDownEvent = \"mousedown\";\n  const MouseUpEvent = \"mouseup\";\n  const MouseMoveEvent = \"mousemove\";\n  const MouseOutEvent = \"mouseout\";\n  const MouseOverEvent = \"mouseover\";\n  const ClickEvent = \"click\";\n  const DoubleClickEvent = \"dblclick\";\n  const WheelEvent = \"wheel\";\n  const MouseWheelEvent = \"mousewheel\";\n  const TouchStartEvent = \"touchstart\";\n  const TouchMoveEvent = \"touchmove\";\n  const TouchEndEvent = \"touchend\";\n  const Events = [KeyDownEvent, KeyPressEvent, KeyUpEvent, DragEnterEvent, DragLeaveEvent, DragOverEvent, PointerDownEvent, PointerUpEvent, PointerMoveEvent, PointerOutEvent, PointerOverEvent, MouseDownEvent, MouseUpEvent, MouseMoveEvent, MouseOutEvent, MouseOverEvent, ClickEvent, DoubleClickEvent, WheelEvent, MouseWheelEvent, TouchStartEvent, TouchMoveEvent, TouchEndEvent];\n  const TooltipShowEvent = PointerMoveEvent;\n  const TooltipHideEvent = MouseOutEvent;\n  const HrefEvent = ClickEvent;\n  class CanvasHandler extends Handler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n      this._down = null;\n      this._touch = null;\n      this._first = true;\n      this._events = {};\n      this.events = Events;\n      this.pointermove = move([PointerMoveEvent, MouseMoveEvent], [PointerOverEvent, MouseOverEvent], [PointerOutEvent, MouseOutEvent]);\n      this.dragover = move([DragOverEvent], [DragEnterEvent], [DragLeaveEvent]), this.pointerout = inactive([PointerOutEvent, MouseOutEvent]);\n      this.dragleave = inactive([DragLeaveEvent]);\n    }\n    initialize(el, origin, obj2) {\n      this._canvas = el && domFind(el, \"canvas\");\n      [ClickEvent, MouseDownEvent, PointerDownEvent, PointerMoveEvent, PointerOutEvent, DragLeaveEvent].forEach((type2) => eventListenerCheck(this, type2));\n      return super.initialize(el, origin, obj2);\n    }\n    // return the backing canvas instance\n    canvas() {\n      return this._canvas;\n    }\n    // retrieve the current canvas context\n    context() {\n      return this._canvas.getContext(\"2d\");\n    }\n    // to keep old versions of firefox happy\n    DOMMouseScroll(evt) {\n      this.fire(MouseWheelEvent, evt);\n    }\n    pointerdown(evt) {\n      this._down = this._active;\n      this.fire(PointerDownEvent, evt);\n    }\n    mousedown(evt) {\n      this._down = this._active;\n      this.fire(MouseDownEvent, evt);\n    }\n    click(evt) {\n      if (this._down === this._active) {\n        this.fire(ClickEvent, evt);\n        this._down = null;\n      }\n    }\n    touchstart(evt) {\n      this._touch = this.pickEvent(evt.changedTouches[0]);\n      if (this._first) {\n        this._active = this._touch;\n        this._first = false;\n      }\n      this.fire(TouchStartEvent, evt, true);\n    }\n    touchmove(evt) {\n      this.fire(TouchMoveEvent, evt, true);\n    }\n    touchend(evt) {\n      this.fire(TouchEndEvent, evt, true);\n      this._touch = null;\n    }\n    // fire an event\n    fire(type2, evt, touch2) {\n      const a2 = touch2 ? this._touch : this._active, h2 = this._handlers[type2];\n      evt.vegaType = type2;\n      if (type2 === HrefEvent && a2 && a2.href) {\n        this.handleHref(evt, a2, a2.href);\n      } else if (type2 === TooltipShowEvent || type2 === TooltipHideEvent) {\n        this.handleTooltip(evt, a2, type2 !== TooltipHideEvent);\n      }\n      if (h2) {\n        for (let i = 0, len2 = h2.length; i < len2; ++i) {\n          h2[i].handler.call(this._obj, evt, a2);\n        }\n      }\n    }\n    // add an event handler\n    on(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers, i = this._handlerIndex(h2[name], type2, handler);\n      if (i < 0) {\n        eventListenerCheck(this, type2);\n        (h2[name] || (h2[name] = [])).push({\n          type: type2,\n          handler\n        });\n      }\n      return this;\n    }\n    // remove an event handler\n    off(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers[name], i = this._handlerIndex(h2, type2, handler);\n      if (i >= 0) {\n        h2.splice(i, 1);\n      }\n      return this;\n    }\n    pickEvent(evt) {\n      const p = point(evt, this._canvas), o = this._origin;\n      return this.pick(this._scene, p[0], p[1], p[0] - o[0], p[1] - o[1]);\n    }\n    // find the scenegraph item at the current pointer position\n    // x, y -- the absolute x, y pointer coordinates on the canvas element\n    // gx, gy -- the relative coordinates within the current group\n    pick(scene, x2, y2, gx, gy) {\n      const g = this.context(), mark = Marks[scene.marktype];\n      return mark.pick.call(this, g, scene, x2, y2, gx, gy);\n    }\n  }\n  const eventBundle = (type2) => type2 === TouchStartEvent || type2 === TouchMoveEvent || type2 === TouchEndEvent ? [TouchStartEvent, TouchMoveEvent, TouchEndEvent] : [type2];\n  function eventListenerCheck(handler, type2) {\n    eventBundle(type2).forEach((_) => addEventListener(handler, _));\n  }\n  function addEventListener(handler, type2) {\n    const canvas = handler.canvas();\n    if (canvas && !handler._events[type2]) {\n      handler._events[type2] = 1;\n      canvas.addEventListener(type2, handler[type2] ? (evt) => handler[type2](evt) : (evt) => handler.fire(type2, evt));\n    }\n  }\n  function fireAll(handler, types2, event2) {\n    types2.forEach((type2) => handler.fire(type2, event2));\n  }\n  function move(moveEvents, overEvents, outEvents) {\n    return function(evt) {\n      const a2 = this._active, p = this.pickEvent(evt);\n      if (p === a2) {\n        fireAll(this, moveEvents, evt);\n      } else {\n        if (!a2 || !a2.exit) {\n          fireAll(this, outEvents, evt);\n        }\n        this._active = p;\n        fireAll(this, overEvents, evt);\n        fireAll(this, moveEvents, evt);\n      }\n    };\n  }\n  function inactive(types2) {\n    return function(evt) {\n      fireAll(this, types2, evt);\n      this._active = null;\n    };\n  }\n  function devicePixelRatio$1() {\n    return typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1;\n  }\n  function resize(canvas, width2, height2, origin, scaleFactor, opt) {\n    const inDOM = typeof HTMLElement !== \"undefined\" && canvas instanceof HTMLElement && canvas.parentNode != null, context2 = canvas.getContext(\"2d\"), ratio = inDOM ? devicePixelRatio$1() : scaleFactor;\n    canvas.width = width2 * ratio;\n    canvas.height = height2 * ratio;\n    for (const key2 in opt) {\n      context2[key2] = opt[key2];\n    }\n    if (inDOM && ratio !== 1) {\n      canvas.style.width = width2 + \"px\";\n      canvas.style.height = height2 + \"px\";\n    }\n    context2.pixelRatio = ratio;\n    context2.setTransform(ratio, 0, 0, ratio, ratio * origin[0], ratio * origin[1]);\n    return canvas;\n  }\n  class CanvasRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._options = {};\n      this._redraw = false;\n      this._dirty = new Bounds();\n      this._tempb = new Bounds();\n    }\n    initialize(el, width2, height2, origin, scaleFactor, options2) {\n      this._options = options2 || {};\n      this._canvas = this._options.externalContext ? null : domCanvas(1, 1, this._options.type);\n      if (el && this._canvas) {\n        domClear(el, 0).appendChild(this._canvas);\n        this._canvas.setAttribute(\"class\", \"marks\");\n      }\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      if (this._canvas) {\n        resize(this._canvas, this._width, this._height, this._origin, this._scale, this._options.context);\n      } else {\n        const ctx = this._options.externalContext;\n        if (!ctx) error(\"CanvasRenderer is missing a valid canvas or context\");\n        ctx.scale(this._scale, this._scale);\n        ctx.translate(this._origin[0], this._origin[1]);\n      }\n      this._redraw = true;\n      return this;\n    }\n    canvas() {\n      return this._canvas;\n    }\n    context() {\n      return this._options.externalContext || (this._canvas ? this._canvas.getContext(\"2d\") : null);\n    }\n    dirty(item) {\n      const b2 = this._tempb.clear().union(item.bounds);\n      let g = item.mark.group;\n      while (g) {\n        b2.translate(g.x || 0, g.y || 0);\n        g = g.mark.group;\n      }\n      this._dirty.union(b2);\n    }\n    _render(scene, markTypes) {\n      const g = this.context(), o = this._origin, w2 = this._width, h2 = this._height, db = this._dirty, vb = viewBounds(o, w2, h2);\n      g.save();\n      const b2 = this._redraw || db.empty() ? (this._redraw = false, vb.expand(1)) : clipToBounds(g, vb.intersect(db), o);\n      this.clear(-o[0], -o[1], w2, h2);\n      this.draw(g, scene, b2, markTypes);\n      g.restore();\n      db.clear();\n      return this;\n    }\n    draw(ctx, scene, bounds2, markTypes) {\n      if (scene.marktype !== \"group\" && markTypes != null && !markTypes.includes(scene.marktype)) {\n        return;\n      }\n      const mark = Marks[scene.marktype];\n      if (scene.clip) clip$2(ctx, scene);\n      mark.draw.call(this, ctx, scene, bounds2, markTypes);\n      if (scene.clip) ctx.restore();\n    }\n    clear(x2, y2, w2, h2) {\n      const opt = this._options, g = this.context();\n      if (opt.type !== \"pdf\" && !opt.externalContext) {\n        g.clearRect(x2, y2, w2, h2);\n      }\n      if (this._bgcolor != null) {\n        g.fillStyle = this._bgcolor;\n        g.fillRect(x2, y2, w2, h2);\n      }\n    }\n  }\n  const viewBounds = (origin, width2, height2) => new Bounds().set(0, 0, width2, height2).translate(-origin[0], -origin[1]);\n  function clipToBounds(g, b2, origin) {\n    b2.expand(1).round();\n    if (g.pixelRatio % 1) {\n      b2.scale(g.pixelRatio).round().scale(1 / g.pixelRatio);\n    }\n    b2.translate(-(origin[0] % 1), -(origin[1] % 1));\n    g.beginPath();\n    g.rect(b2.x1, b2.y1, b2.width(), b2.height());\n    g.clip();\n    return b2;\n  }\n  class SVGHandler extends Handler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n      const h2 = this;\n      h2._hrefHandler = listener(h2, (evt, item) => {\n        if (item && item.href) h2.handleHref(evt, item, item.href);\n      });\n      h2._tooltipHandler = listener(h2, (evt, item) => {\n        h2.handleTooltip(evt, item, evt.type !== TooltipHideEvent);\n      });\n    }\n    initialize(el, origin, obj2) {\n      let svg = this._svg;\n      if (svg) {\n        svg.removeEventListener(HrefEvent, this._hrefHandler);\n        svg.removeEventListener(TooltipShowEvent, this._tooltipHandler);\n        svg.removeEventListener(TooltipHideEvent, this._tooltipHandler);\n      }\n      this._svg = svg = el && domFind(el, \"svg\");\n      if (svg) {\n        svg.addEventListener(HrefEvent, this._hrefHandler);\n        svg.addEventListener(TooltipShowEvent, this._tooltipHandler);\n        svg.addEventListener(TooltipHideEvent, this._tooltipHandler);\n      }\n      return super.initialize(el, origin, obj2);\n    }\n    canvas() {\n      return this._svg;\n    }\n    // add an event handler\n    on(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers, i = this._handlerIndex(h2[name], type2, handler);\n      if (i < 0) {\n        const x2 = {\n          type: type2,\n          handler,\n          listener: listener(this, handler)\n        };\n        (h2[name] || (h2[name] = [])).push(x2);\n        if (this._svg) {\n          this._svg.addEventListener(name, x2.listener);\n        }\n      }\n      return this;\n    }\n    // remove an event handler\n    off(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers[name], i = this._handlerIndex(h2, type2, handler);\n      if (i >= 0) {\n        if (this._svg) {\n          this._svg.removeEventListener(name, h2[i].listener);\n        }\n        h2.splice(i, 1);\n      }\n      return this;\n    }\n  }\n  const listener = (context2, handler) => (evt) => {\n    let item = evt.target.__data__;\n    item = Array.isArray(item) ? item[0] : item;\n    evt.vegaType = evt.type;\n    handler.call(context2._obj, evt, item);\n  };\n  const ARIA_HIDDEN = \"aria-hidden\";\n  const ARIA_LABEL = \"aria-label\";\n  const ARIA_ROLE = \"role\";\n  const ARIA_ROLEDESCRIPTION = \"aria-roledescription\";\n  const GRAPHICS_OBJECT = \"graphics-object\";\n  const GRAPHICS_SYMBOL = \"graphics-symbol\";\n  const bundle = (role, roledesc, label2) => ({\n    [ARIA_ROLE]: role,\n    [ARIA_ROLEDESCRIPTION]: roledesc,\n    [ARIA_LABEL]: label2 || void 0\n  });\n  const AriaIgnore = toSet([\"axis-domain\", \"axis-grid\", \"axis-label\", \"axis-tick\", \"axis-title\", \"legend-band\", \"legend-entry\", \"legend-gradient\", \"legend-label\", \"legend-title\", \"legend-symbol\", \"title\"]);\n  const AriaGuides = {\n    \"axis\": {\n      desc: \"axis\",\n      caption: axisCaption\n    },\n    \"legend\": {\n      desc: \"legend\",\n      caption: legendCaption\n    },\n    \"title-text\": {\n      desc: \"title\",\n      caption: (item) => `Title text '${titleCaption(item)}'`\n    },\n    \"title-subtitle\": {\n      desc: \"subtitle\",\n      caption: (item) => `Subtitle text '${titleCaption(item)}'`\n    }\n  };\n  const AriaEncode = {\n    ariaRole: ARIA_ROLE,\n    ariaRoleDescription: ARIA_ROLEDESCRIPTION,\n    description: ARIA_LABEL\n  };\n  function ariaItemAttributes(emit2, item) {\n    const hide = item.aria === false;\n    emit2(ARIA_HIDDEN, hide || void 0);\n    if (hide || item.description == null) {\n      for (const prop in AriaEncode) {\n        emit2(AriaEncode[prop], void 0);\n      }\n    } else {\n      const type2 = item.mark.marktype;\n      emit2(ARIA_LABEL, item.description);\n      emit2(ARIA_ROLE, item.ariaRole || (type2 === \"group\" ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL));\n      emit2(ARIA_ROLEDESCRIPTION, item.ariaRoleDescription || `${type2} mark`);\n    }\n  }\n  function ariaMarkAttributes(mark) {\n    return mark.aria === false ? {\n      [ARIA_HIDDEN]: true\n    } : AriaIgnore[mark.role] ? null : AriaGuides[mark.role] ? ariaGuide(mark, AriaGuides[mark.role]) : ariaMark(mark);\n  }\n  function ariaMark(mark) {\n    const type2 = mark.marktype;\n    const recurse2 = type2 === \"group\" || type2 === \"text\" || mark.items.some((_) => _.description != null && _.aria !== false);\n    return bundle(recurse2 ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL, `${type2} mark container`, mark.description);\n  }\n  function ariaGuide(mark, opt) {\n    try {\n      const item = mark.items[0], caption = opt.caption || (() => \"\");\n      return bundle(opt.role || GRAPHICS_SYMBOL, opt.desc, item.description || caption(item));\n    } catch (err) {\n      return null;\n    }\n  }\n  function titleCaption(item) {\n    return array$4(item.text).join(\" \");\n  }\n  function axisCaption(item) {\n    const datum2 = item.datum, orient = item.orient, title = datum2.title ? extractTitle(item) : null, ctx = item.context, scale2 = ctx.scales[datum2.scale].value, locale2 = ctx.dataflow.locale(), type2 = scale2.type, xy = orient === \"left\" || orient === \"right\" ? \"Y\" : \"X\";\n    return `${xy}-axis` + (title ? ` titled '${title}'` : \"\") + ` for a ${isDiscrete(type2) ? \"discrete\" : type2} scale with ${domainCaption(locale2, scale2, item)}`;\n  }\n  function legendCaption(item) {\n    const datum2 = item.datum, title = datum2.title ? extractTitle(item) : null, type2 = `${datum2.type || \"\"} legend`.trim(), scales2 = datum2.scales, props = Object.keys(scales2), ctx = item.context, scale2 = ctx.scales[scales2[props[0]]].value, locale2 = ctx.dataflow.locale();\n    return capitalize(type2) + (title ? ` titled '${title}'` : \"\") + ` for ${channelCaption(props)} with ${domainCaption(locale2, scale2, item)}`;\n  }\n  function extractTitle(item) {\n    try {\n      return array$4(peek$1(item.items).items[0].text).join(\" \");\n    } catch (err) {\n      return null;\n    }\n  }\n  function channelCaption(props) {\n    props = props.map((p) => p + (p === \"fill\" || p === \"stroke\" ? \" color\" : \"\"));\n    return props.length < 2 ? props[0] : props.slice(0, -1).join(\", \") + \" and \" + peek$1(props);\n  }\n  function capitalize(s2) {\n    return s2.length ? s2[0].toUpperCase() + s2.slice(1) : s2;\n  }\n  const innerText = (val) => (val + \"\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n  const attrText = (val) => innerText(val).replace(/\"/g, \"&quot;\").replace(/\\t/g, \"&#x9;\").replace(/\\n/g, \"&#xA;\").replace(/\\r/g, \"&#xD;\");\n  function markup() {\n    let buf = \"\", outer = \"\", inner = \"\";\n    const stack = [], clear = () => outer = inner = \"\", push2 = (tag) => {\n      if (outer) {\n        buf += `${outer}>${inner}`;\n        clear();\n      }\n      stack.push(tag);\n    }, attr2 = (name, value2) => {\n      if (value2 != null) outer += ` ${name}=\"${attrText(value2)}\"`;\n      return m2;\n    }, m2 = {\n      open(tag, ...attrs) {\n        push2(tag);\n        outer = \"<\" + tag;\n        for (const set2 of attrs) {\n          for (const key2 in set2) attr2(key2, set2[key2]);\n        }\n        return m2;\n      },\n      close() {\n        const tag = stack.pop();\n        if (outer) {\n          buf += outer + (inner ? `>${inner}</${tag}>` : \"/>\");\n        } else {\n          buf += `</${tag}>`;\n        }\n        clear();\n        return m2;\n      },\n      attr: attr2,\n      text: (t) => (inner += innerText(t), m2),\n      toString: () => buf\n    };\n    return m2;\n  }\n  const serializeXML = (node) => _serialize(markup(), node) + \"\";\n  function _serialize(m2, node) {\n    m2.open(node.tagName);\n    if (node.hasAttributes()) {\n      const attrs = node.attributes, n = attrs.length;\n      for (let i = 0; i < n; ++i) {\n        m2.attr(attrs[i].name, attrs[i].value);\n      }\n    }\n    if (node.hasChildNodes()) {\n      const children2 = node.childNodes;\n      for (const child of children2) {\n        child.nodeType === 3 ? m2.text(child.nodeValue) : _serialize(m2, child);\n      }\n    }\n    return m2.close();\n  }\n  const stylesAttr = {\n    fill: \"fill\",\n    fillOpacity: \"fill-opacity\",\n    stroke: \"stroke\",\n    strokeOpacity: \"stroke-opacity\",\n    strokeWidth: \"stroke-width\",\n    strokeCap: \"stroke-linecap\",\n    strokeJoin: \"stroke-linejoin\",\n    strokeDash: \"stroke-dasharray\",\n    strokeDashOffset: \"stroke-dashoffset\",\n    strokeMiterLimit: \"stroke-miterlimit\",\n    opacity: \"opacity\"\n  };\n  const stylesCss = {\n    blend: \"mix-blend-mode\"\n  };\n  const rootAttributes = {\n    \"fill\": \"none\",\n    \"stroke-miterlimit\": 10\n  };\n  const RootIndex = 0, xmlns = \"http://www.w3.org/2000/xmlns/\", svgns = metadata.xmlns;\n  class SVGRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._dirtyID = 0;\n      this._dirty = [];\n      this._svg = null;\n      this._root = null;\n      this._defs = null;\n    }\n    /**\n     * Initialize a new SVGRenderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._defs = {};\n      this._clearDefs();\n      if (el) {\n        this._svg = domChild(el, 0, \"svg\", svgns);\n        this._svg.setAttributeNS(xmlns, \"xmlns\", svgns);\n        this._svg.setAttributeNS(xmlns, \"xmlns:xlink\", metadata[\"xmlns:xlink\"]);\n        this._svg.setAttribute(\"version\", metadata[\"version\"]);\n        this._svg.setAttribute(\"class\", \"marks\");\n        domClear(el, 1);\n        this._root = domChild(this._svg, RootIndex, \"g\", svgns);\n        setAttributes(this._root, rootAttributes);\n        domClear(this._svg, RootIndex + 1);\n      }\n      this.background(this._bgcolor);\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Get / set the background color.\n     */\n    background(bgcolor) {\n      if (arguments.length && this._svg) {\n        this._svg.style.setProperty(\"background-color\", bgcolor);\n      }\n      return super.background(...arguments);\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      if (this._svg) {\n        setAttributes(this._svg, {\n          width: this._width * this._scale,\n          height: this._height * this._scale,\n          viewBox: `0 0 ${this._width} ${this._height}`\n        });\n        this._root.setAttribute(\"transform\", `translate(${this._origin})`);\n      }\n      this._dirty = [];\n      return this;\n    }\n    /**\n     * Returns the SVG element of the visualization.\n     * @return {DOMElement} - The SVG element.\n     */\n    canvas() {\n      return this._svg;\n    }\n    /**\n     * Returns an SVG text string for the rendered content,\n     * or null if this renderer is currently headless.\n     */\n    svg() {\n      const svg = this._svg, bg = this._bgcolor;\n      if (!svg) return null;\n      let node;\n      if (bg) {\n        svg.removeAttribute(\"style\");\n        node = domChild(svg, RootIndex, \"rect\", svgns);\n        setAttributes(node, {\n          width: this._width,\n          height: this._height,\n          fill: bg\n        });\n      }\n      const text2 = serializeXML(svg);\n      if (bg) {\n        svg.removeChild(node);\n        this._svg.style.setProperty(\"background-color\", bg);\n      }\n      return text2;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render(scene, markTypes) {\n      if (this._dirtyCheck()) {\n        if (this._dirtyAll) this._clearDefs();\n        this.mark(this._root, scene, void 0, markTypes);\n        domClear(this._root, 1);\n      }\n      this.defs();\n      this._dirty = [];\n      ++this._dirtyID;\n      return this;\n    }\n    // -- Manage rendering of items marked as dirty --\n    /**\n     * Flag a mark item as dirty.\n     * @param {Item} item - The mark item.\n     */\n    dirty(item) {\n      if (item.dirty !== this._dirtyID) {\n        item.dirty = this._dirtyID;\n        this._dirty.push(item);\n      }\n    }\n    /**\n     * Check if a mark item is considered dirty.\n     * @param {Item} item - The mark item.\n     */\n    isDirty(item) {\n      return this._dirtyAll || !item._svg || !item._svg.ownerSVGElement || item.dirty === this._dirtyID;\n    }\n    /**\n     * Internal method to check dirty status and, if possible,\n     * make targetted updates without a full rendering pass.\n     */\n    _dirtyCheck() {\n      this._dirtyAll = true;\n      const items = this._dirty;\n      if (!items.length || !this._dirtyID) return true;\n      const id2 = ++this._dirtyID;\n      let item, mark, type2, mdef, i, n, o;\n      for (i = 0, n = items.length; i < n; ++i) {\n        item = items[i];\n        mark = item.mark;\n        if (mark.marktype !== type2) {\n          type2 = mark.marktype;\n          mdef = Marks[type2];\n        }\n        if (mark.zdirty && mark.dirty !== id2) {\n          this._dirtyAll = false;\n          dirtyParents(item, id2);\n          mark.items.forEach((i2) => {\n            i2.dirty = id2;\n          });\n        }\n        if (mark.zdirty) continue;\n        if (item.exit) {\n          if (mdef.nested && mark.items.length) {\n            o = mark.items[0];\n            if (o._svg) this._update(mdef, o._svg, o);\n          } else if (item._svg) {\n            o = item._svg.parentNode;\n            if (o) o.removeChild(item._svg);\n          }\n          item._svg = null;\n          continue;\n        }\n        item = mdef.nested ? mark.items[0] : item;\n        if (item._update === id2) continue;\n        if (!item._svg || !item._svg.ownerSVGElement) {\n          this._dirtyAll = false;\n          dirtyParents(item, id2);\n        } else {\n          this._update(mdef, item._svg, item);\n        }\n        item._update = id2;\n      }\n      return !this._dirtyAll;\n    }\n    // -- Construct & maintain scenegraph to SVG mapping ---\n    /**\n     * Render a set of mark items.\n     * @param {SVGElement} el - The parent element in the SVG tree.\n     * @param {object} scene - The mark parent to render.\n     * @param {SVGElement} prev - The previous sibling in the SVG tree.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    mark(el, scene, prev, markTypes) {\n      if (!this.isDirty(scene)) {\n        return scene._svg;\n      }\n      const svg = this._svg, markType2 = scene.marktype, mdef = Marks[markType2], events2 = scene.interactive === false ? \"none\" : null, isGroup = mdef.tag === \"g\";\n      const parent = bind$1(scene, el, prev, \"g\", svg);\n      if (markType2 !== \"group\" && markTypes != null && !markTypes.includes(markType2)) {\n        domClear(parent, 0);\n        return scene._svg;\n      }\n      parent.setAttribute(\"class\", cssClass(scene));\n      const aria = ariaMarkAttributes(scene);\n      for (const key2 in aria) setAttribute(parent, key2, aria[key2]);\n      if (!isGroup) {\n        setAttribute(parent, \"pointer-events\", events2);\n      }\n      setAttribute(parent, \"clip-path\", scene.clip ? clip$1$1(this, scene, scene.group) : null);\n      let sibling = null, i = 0;\n      const process = (item) => {\n        const dirty = this.isDirty(item), node = bind$1(item, parent, sibling, mdef.tag, svg);\n        if (dirty) {\n          this._update(mdef, node, item);\n          if (isGroup) recurse(this, node, item, markTypes);\n        }\n        sibling = node;\n        ++i;\n      };\n      if (mdef.nested) {\n        if (scene.items.length) process(scene.items[0]);\n      } else {\n        visit(scene, process);\n      }\n      domClear(parent, i);\n      return parent;\n    }\n    /**\n     * Update the attributes of an SVG element for a mark item.\n     * @param {object} mdef - The mark definition object\n     * @param {SVGElement} el - The SVG element.\n     * @param {Item} item - The mark item.\n     */\n    _update(mdef, el, item) {\n      element$1 = el;\n      values = el.__values__;\n      ariaItemAttributes(emit, item);\n      mdef.attr(emit, item, this);\n      const extra = mark_extras[mdef.type];\n      if (extra) extra.call(this, mdef, el, item);\n      if (element$1) this.style(element$1, item);\n    }\n    /**\n     * Update the presentation attributes of an SVG element for a mark item.\n     * @param {SVGElement} el - The SVG element.\n     * @param {Item} item - The mark item.\n     */\n    style(el, item) {\n      if (item == null) return;\n      for (const prop in stylesAttr) {\n        let value2 = prop === \"font\" ? fontFamily(item) : item[prop];\n        if (value2 === values[prop]) continue;\n        const name = stylesAttr[prop];\n        if (value2 == null) {\n          el.removeAttribute(name);\n        } else {\n          if (isGradient(value2)) {\n            value2 = gradientRef(value2, this._defs.gradient, href());\n          }\n          el.setAttribute(name, value2 + \"\");\n        }\n        values[prop] = value2;\n      }\n      for (const prop in stylesCss) {\n        setStyle(el, stylesCss[prop], item[prop]);\n      }\n    }\n    /**\n     * Render SVG defs, as needed.\n     * Must be called *after* marks have been processed to ensure the\n     * collected state is current and accurate.\n     */\n    defs() {\n      const svg = this._svg, defs = this._defs;\n      let el = defs.el, index2 = 0;\n      for (const id2 in defs.gradient) {\n        if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n        index2 = updateGradient(el, defs.gradient[id2], index2);\n      }\n      for (const id2 in defs.clipping) {\n        if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n        index2 = updateClipping(el, defs.clipping[id2], index2);\n      }\n      if (el) {\n        index2 === 0 ? (svg.removeChild(el), defs.el = null) : domClear(el, index2);\n      }\n    }\n    /**\n     * Clear defs caches.\n     */\n    _clearDefs() {\n      const def2 = this._defs;\n      def2.gradient = {};\n      def2.clipping = {};\n    }\n  }\n  function dirtyParents(item, id2) {\n    for (; item && item.dirty !== id2; item = item.mark.group) {\n      item.dirty = id2;\n      if (item.mark && item.mark.dirty !== id2) {\n        item.mark.dirty = id2;\n      } else return;\n    }\n  }\n  function updateGradient(el, grad, index2) {\n    let i, n, stop2;\n    if (grad.gradient === \"radial\") {\n      let pt = domChild(el, index2++, \"pattern\", svgns);\n      setAttributes(pt, {\n        id: patternPrefix + grad.id,\n        viewBox: \"0,0,1,1\",\n        width: \"100%\",\n        height: \"100%\",\n        preserveAspectRatio: \"xMidYMid slice\"\n      });\n      pt = domChild(pt, 0, \"rect\", svgns);\n      setAttributes(pt, {\n        width: 1,\n        height: 1,\n        fill: `url(${href()}#${grad.id})`\n      });\n      el = domChild(el, index2++, \"radialGradient\", svgns);\n      setAttributes(el, {\n        id: grad.id,\n        fx: grad.x1,\n        fy: grad.y1,\n        fr: grad.r1,\n        cx: grad.x2,\n        cy: grad.y2,\n        r: grad.r2\n      });\n    } else {\n      el = domChild(el, index2++, \"linearGradient\", svgns);\n      setAttributes(el, {\n        id: grad.id,\n        x1: grad.x1,\n        x2: grad.x2,\n        y1: grad.y1,\n        y2: grad.y2\n      });\n    }\n    for (i = 0, n = grad.stops.length; i < n; ++i) {\n      stop2 = domChild(el, i, \"stop\", svgns);\n      stop2.setAttribute(\"offset\", grad.stops[i].offset);\n      stop2.setAttribute(\"stop-color\", grad.stops[i].color);\n    }\n    domClear(el, i);\n    return index2;\n  }\n  function updateClipping(el, clip2, index2) {\n    let mask;\n    el = domChild(el, index2, \"clipPath\", svgns);\n    el.setAttribute(\"id\", clip2.id);\n    if (clip2.path) {\n      mask = domChild(el, 0, \"path\", svgns);\n      mask.setAttribute(\"d\", clip2.path);\n    } else {\n      mask = domChild(el, 0, \"rect\", svgns);\n      setAttributes(mask, {\n        x: 0,\n        y: 0,\n        width: clip2.width,\n        height: clip2.height\n      });\n    }\n    domClear(el, 1);\n    return index2 + 1;\n  }\n  function recurse(renderer, el, group2, markTypes) {\n    el = el.lastChild.previousSibling;\n    let prev, idx = 0;\n    visit(group2, (item) => {\n      prev = renderer.mark(el, item, prev, markTypes);\n      ++idx;\n    });\n    domClear(el, 1 + idx);\n  }\n  function bind$1(item, el, sibling, tag, svg) {\n    let node = item._svg, doc;\n    if (!node) {\n      doc = el.ownerDocument;\n      node = domCreate(doc, tag, svgns);\n      item._svg = node;\n      if (item.mark) {\n        node.__data__ = item;\n        node.__values__ = {\n          fill: \"default\"\n        };\n        if (tag === \"g\") {\n          const bg = domCreate(doc, \"path\", svgns);\n          node.appendChild(bg);\n          bg.__data__ = item;\n          const cg = domCreate(doc, \"g\", svgns);\n          node.appendChild(cg);\n          cg.__data__ = item;\n          const fg = domCreate(doc, \"path\", svgns);\n          node.appendChild(fg);\n          fg.__data__ = item;\n          fg.__values__ = {\n            fill: \"default\"\n          };\n        }\n      }\n    }\n    if (node.ownerSVGElement !== svg || siblingCheck(node, sibling)) {\n      el.insertBefore(node, sibling ? sibling.nextSibling : el.firstChild);\n    }\n    return node;\n  }\n  function siblingCheck(node, sibling) {\n    return node.parentNode && node.parentNode.childNodes.length > 1 && node.previousSibling != sibling;\n  }\n  let element$1 = null, values = null;\n  const mark_extras = {\n    group(mdef, el, item) {\n      const fg = element$1 = el.childNodes[2];\n      values = fg.__values__;\n      mdef.foreground(emit, item, this);\n      values = el.__values__;\n      element$1 = el.childNodes[1];\n      mdef.content(emit, item, this);\n      const bg = element$1 = el.childNodes[0];\n      mdef.background(emit, item, this);\n      const value2 = item.mark.interactive === false ? \"none\" : null;\n      if (value2 !== values.events) {\n        setAttribute(fg, \"pointer-events\", value2);\n        setAttribute(bg, \"pointer-events\", value2);\n        values.events = value2;\n      }\n      if (item.strokeForeground && item.stroke) {\n        const fill2 = item.fill;\n        setAttribute(fg, \"display\", null);\n        this.style(bg, item);\n        setAttribute(bg, \"stroke\", null);\n        if (fill2) item.fill = null;\n        values = fg.__values__;\n        this.style(fg, item);\n        if (fill2) item.fill = fill2;\n        element$1 = null;\n      } else {\n        setAttribute(fg, \"display\", \"none\");\n      }\n    },\n    image(mdef, el, item) {\n      if (item.smooth === false) {\n        setStyle(el, \"image-rendering\", \"optimizeSpeed\");\n        setStyle(el, \"image-rendering\", \"pixelated\");\n      } else {\n        setStyle(el, \"image-rendering\", null);\n      }\n    },\n    text(mdef, el, item) {\n      const tl2 = textLines(item);\n      let key2, value2, doc, lh;\n      if (isArray(tl2)) {\n        value2 = tl2.map((_) => textValue(item, _));\n        key2 = value2.join(\"\\n\");\n        if (key2 !== values.text) {\n          domClear(el, 0);\n          doc = el.ownerDocument;\n          lh = lineHeight(item);\n          value2.forEach((t, i) => {\n            const ts2 = domCreate(doc, \"tspan\", svgns);\n            ts2.__data__ = item;\n            ts2.textContent = t;\n            if (i) {\n              ts2.setAttribute(\"x\", 0);\n              ts2.setAttribute(\"dy\", lh);\n            }\n            el.appendChild(ts2);\n          });\n          values.text = key2;\n        }\n      } else {\n        value2 = textValue(item, tl2);\n        if (value2 !== values.text) {\n          el.textContent = value2;\n          values.text = value2;\n        }\n      }\n      setAttribute(el, \"font-family\", fontFamily(item));\n      setAttribute(el, \"font-size\", fontSize(item) + \"px\");\n      setAttribute(el, \"font-style\", item.fontStyle);\n      setAttribute(el, \"font-variant\", item.fontVariant);\n      setAttribute(el, \"font-weight\", item.fontWeight);\n    }\n  };\n  function emit(name, value2, ns) {\n    if (value2 === values[name]) return;\n    if (ns) {\n      setAttributeNS(element$1, name, value2, ns);\n    } else {\n      setAttribute(element$1, name, value2);\n    }\n    values[name] = value2;\n  }\n  function setStyle(el, name, value2) {\n    if (value2 !== values[name]) {\n      if (value2 == null) {\n        el.style.removeProperty(name);\n      } else {\n        el.style.setProperty(name, value2 + \"\");\n      }\n      values[name] = value2;\n    }\n  }\n  function setAttributes(el, attrs) {\n    for (const key2 in attrs) {\n      setAttribute(el, key2, attrs[key2]);\n    }\n  }\n  function setAttribute(el, name, value2) {\n    if (value2 != null) {\n      el.setAttribute(name, value2);\n    } else {\n      el.removeAttribute(name);\n    }\n  }\n  function setAttributeNS(el, name, value2, ns) {\n    if (value2 != null) {\n      el.setAttributeNS(ns, name, value2);\n    } else {\n      el.removeAttributeNS(ns, name);\n    }\n  }\n  function href() {\n    let loc;\n    return typeof window === \"undefined\" ? \"\" : (loc = window.location).hash ? loc.href.slice(0, -loc.hash.length) : loc.href;\n  }\n  class SVGStringRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._text = null;\n      this._defs = {\n        gradient: {},\n        clipping: {}\n      };\n    }\n    /**\n     * Returns the rendered SVG text string,\n     * or null if rendering has not yet occurred.\n     */\n    svg() {\n      return this._text;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     */\n    _render(scene) {\n      const m2 = markup();\n      m2.open(\"svg\", extend({}, metadata, {\n        class: \"marks\",\n        width: this._width * this._scale,\n        height: this._height * this._scale,\n        viewBox: `0 0 ${this._width} ${this._height}`\n      }));\n      const bg = this._bgcolor;\n      if (bg && bg !== \"transparent\" && bg !== \"none\") {\n        m2.open(\"rect\", {\n          width: this._width,\n          height: this._height,\n          fill: bg\n        }).close();\n      }\n      m2.open(\"g\", rootAttributes, {\n        transform: \"translate(\" + this._origin + \")\"\n      });\n      this.mark(m2, scene);\n      m2.close();\n      this.defs(m2);\n      this._text = m2.close() + \"\";\n      return this;\n    }\n    /**\n     * Render a set of mark items.\n     * @param {object} m - The markup context.\n     * @param {object} scene - The mark parent to render.\n     */\n    mark(m2, scene) {\n      const mdef = Marks[scene.marktype], tag = mdef.tag, attrList = [ariaItemAttributes, mdef.attr];\n      m2.open(\"g\", {\n        \"class\": cssClass(scene),\n        \"clip-path\": scene.clip ? clip$1$1(this, scene, scene.group) : null\n      }, ariaMarkAttributes(scene), {\n        \"pointer-events\": tag !== \"g\" && scene.interactive === false ? \"none\" : null\n      });\n      const process = (item) => {\n        const href2 = this.href(item);\n        if (href2) m2.open(\"a\", href2);\n        m2.open(tag, this.attr(scene, item, attrList, tag !== \"g\" ? tag : null));\n        if (tag === \"text\") {\n          const tl2 = textLines(item);\n          if (isArray(tl2)) {\n            const attrs = {\n              x: 0,\n              dy: lineHeight(item)\n            };\n            for (let i = 0; i < tl2.length; ++i) {\n              m2.open(\"tspan\", i ? attrs : null).text(textValue(item, tl2[i])).close();\n            }\n          } else {\n            m2.text(textValue(item, tl2));\n          }\n        } else if (tag === \"g\") {\n          const fore = item.strokeForeground, fill2 = item.fill, stroke2 = item.stroke;\n          if (fore && stroke2) {\n            item.stroke = null;\n          }\n          m2.open(\"path\", this.attr(scene, item, mdef.background, \"bgrect\")).close();\n          m2.open(\"g\", this.attr(scene, item, mdef.content));\n          visit(item, (scene2) => this.mark(m2, scene2));\n          m2.close();\n          if (fore && stroke2) {\n            if (fill2) item.fill = null;\n            item.stroke = stroke2;\n            m2.open(\"path\", this.attr(scene, item, mdef.foreground, \"bgrect\")).close();\n            if (fill2) item.fill = fill2;\n          } else {\n            m2.open(\"path\", this.attr(scene, item, mdef.foreground, \"bgfore\")).close();\n          }\n        }\n        m2.close();\n        if (href2) m2.close();\n      };\n      if (mdef.nested) {\n        if (scene.items && scene.items.length) process(scene.items[0]);\n      } else {\n        visit(scene, process);\n      }\n      return m2.close();\n    }\n    /**\n     * Get href attributes for a hyperlinked mark item.\n     * @param {Item} item - The mark item.\n     */\n    href(item) {\n      const href2 = item.href;\n      let attr2;\n      if (href2) {\n        if (attr2 = this._hrefs && this._hrefs[href2]) {\n          return attr2;\n        } else {\n          this.sanitizeURL(href2).then((attr3) => {\n            attr3[\"xlink:href\"] = attr3.href;\n            attr3.href = null;\n            (this._hrefs || (this._hrefs = {}))[href2] = attr3;\n          });\n        }\n      }\n      return null;\n    }\n    /**\n     * Get an object of SVG attributes for a mark item.\n     * @param {object} scene - The mark parent.\n     * @param {Item} item - The mark item.\n     * @param {array|function} attrs - One or more attribute emitters.\n     * @param {string} tag - The tag being rendered.\n     */\n    attr(scene, item, attrs, tag) {\n      const object2 = {}, emit2 = (name, value2, ns, prefixed) => {\n        object2[prefixed || name] = value2;\n      };\n      if (Array.isArray(attrs)) {\n        attrs.forEach((fn2) => fn2(emit2, item, this));\n      } else {\n        attrs(emit2, item, this);\n      }\n      if (tag) {\n        style(object2, item, scene, tag, this._defs);\n      }\n      return object2;\n    }\n    /**\n     * Render SVG defs, as needed.\n     * Must be called *after* marks have been processed to ensure the\n     * collected state is current and accurate.\n     * @param {object} m - The markup context.\n     */\n    defs(m2) {\n      const gradient2 = this._defs.gradient, clipping = this._defs.clipping, count2 = Object.keys(gradient2).length + Object.keys(clipping).length;\n      if (count2 === 0) return;\n      m2.open(\"defs\");\n      for (const id2 in gradient2) {\n        const def2 = gradient2[id2], stops = def2.stops;\n        if (def2.gradient === \"radial\") {\n          m2.open(\"pattern\", {\n            id: patternPrefix + id2,\n            viewBox: \"0,0,1,1\",\n            width: \"100%\",\n            height: \"100%\",\n            preserveAspectRatio: \"xMidYMid slice\"\n          });\n          m2.open(\"rect\", {\n            width: \"1\",\n            height: \"1\",\n            fill: \"url(#\" + id2 + \")\"\n          }).close();\n          m2.close();\n          m2.open(\"radialGradient\", {\n            id: id2,\n            fx: def2.x1,\n            fy: def2.y1,\n            fr: def2.r1,\n            cx: def2.x2,\n            cy: def2.y2,\n            r: def2.r2\n          });\n        } else {\n          m2.open(\"linearGradient\", {\n            id: id2,\n            x1: def2.x1,\n            x2: def2.x2,\n            y1: def2.y1,\n            y2: def2.y2\n          });\n        }\n        for (let i = 0; i < stops.length; ++i) {\n          m2.open(\"stop\", {\n            offset: stops[i].offset,\n            \"stop-color\": stops[i].color\n          }).close();\n        }\n        m2.close();\n      }\n      for (const id2 in clipping) {\n        const def2 = clipping[id2];\n        m2.open(\"clipPath\", {\n          id: id2\n        });\n        if (def2.path) {\n          m2.open(\"path\", {\n            d: def2.path\n          }).close();\n        } else {\n          m2.open(\"rect\", {\n            x: 0,\n            y: 0,\n            width: def2.width,\n            height: def2.height\n          }).close();\n        }\n        m2.close();\n      }\n      m2.close();\n    }\n  }\n  function style(s2, item, scene, tag, defs) {\n    let styleList;\n    if (item == null) return s2;\n    if (tag === \"bgrect\" && scene.interactive === false) {\n      s2[\"pointer-events\"] = \"none\";\n    }\n    if (tag === \"bgfore\") {\n      if (scene.interactive === false) {\n        s2[\"pointer-events\"] = \"none\";\n      }\n      s2.display = \"none\";\n      if (item.fill !== null) return s2;\n    }\n    if (tag === \"image\" && item.smooth === false) {\n      styleList = [\"image-rendering: optimizeSpeed;\", \"image-rendering: pixelated;\"];\n    }\n    if (tag === \"text\") {\n      s2[\"font-family\"] = fontFamily(item);\n      s2[\"font-size\"] = fontSize(item) + \"px\";\n      s2[\"font-style\"] = item.fontStyle;\n      s2[\"font-variant\"] = item.fontVariant;\n      s2[\"font-weight\"] = item.fontWeight;\n    }\n    for (const prop in stylesAttr) {\n      let value2 = item[prop];\n      const name = stylesAttr[prop];\n      if (value2 === \"transparent\" && (name === \"fill\" || name === \"stroke\")) ;\n      else if (value2 != null) {\n        if (isGradient(value2)) {\n          value2 = gradientRef(value2, defs.gradient, \"\");\n        }\n        s2[name] = value2;\n      }\n    }\n    for (const prop in stylesCss) {\n      const value2 = item[prop];\n      if (value2 != null) {\n        styleList = styleList || [];\n        styleList.push(`${stylesCss[prop]}: ${value2};`);\n      }\n    }\n    if (styleList) {\n      s2.style = styleList.join(\" \");\n    }\n    return s2;\n  }\n  const OPTS = {\n    svgMarkTypes: [\"text\"],\n    svgOnTop: true,\n    debug: false\n  };\n  function setHybridRendererOptions(options2) {\n    OPTS[\"svgMarkTypes\"] = options2.svgMarkTypes ?? [\"text\"];\n    OPTS[\"svgOnTop\"] = options2.svgOnTop ?? true;\n    OPTS[\"debug\"] = options2.debug ?? false;\n  }\n  class HybridRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._svgRenderer = new SVGRenderer(loader2);\n      this._canvasRenderer = new CanvasRenderer(loader2);\n    }\n    /**\n     * Initialize a new HybridRenderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {HybridRenderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._root_el = domChild(el, 0, \"div\");\n      const bottomEl = domChild(this._root_el, 0, \"div\");\n      const topEl = domChild(this._root_el, 1, \"div\");\n      this._root_el.style.position = \"relative\";\n      if (!OPTS.debug) {\n        bottomEl.style.height = \"100%\";\n        topEl.style.position = \"absolute\";\n        topEl.style.top = \"0\";\n        topEl.style.left = \"0\";\n        topEl.style.height = \"100%\";\n        topEl.style.width = \"100%\";\n      }\n      this._svgEl = OPTS.svgOnTop ? topEl : bottomEl;\n      this._canvasEl = OPTS.svgOnTop ? bottomEl : topEl;\n      this._svgEl.style.pointerEvents = \"none\";\n      this._canvasRenderer.initialize(this._canvasEl, width2, height2, origin, scaleFactor);\n      this._svgRenderer.initialize(this._svgEl, width2, height2, origin, scaleFactor);\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Flag a mark item as dirty.\n     * @param {Item} item - The mark item.\n     */\n    dirty(item) {\n      if (OPTS.svgMarkTypes.includes(item.mark.marktype)) {\n        this._svgRenderer.dirty(item);\n      } else {\n        this._canvasRenderer.dirty(item);\n      }\n      return this;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render(scene, markTypes) {\n      const allMarkTypes = markTypes ?? [\"arc\", \"area\", \"image\", \"line\", \"path\", \"rect\", \"rule\", \"shape\", \"symbol\", \"text\", \"trail\"];\n      const canvasMarkTypes = allMarkTypes.filter((m2) => !OPTS.svgMarkTypes.includes(m2));\n      this._svgRenderer.render(scene, OPTS.svgMarkTypes);\n      this._canvasRenderer.render(scene, canvasMarkTypes);\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      this._svgRenderer.resize(width2, height2, origin, scaleFactor);\n      this._canvasRenderer.resize(width2, height2, origin, scaleFactor);\n      return this;\n    }\n    background(bgcolor) {\n      if (OPTS.svgOnTop) {\n        this._canvasRenderer.background(bgcolor);\n      } else {\n        this._svgRenderer.background(bgcolor);\n      }\n      return this;\n    }\n  }\n  class HybridHandler extends CanvasHandler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n    }\n    initialize(el, origin, obj2) {\n      const canvas = domChild(domChild(el, 0, \"div\"), OPTS.svgOnTop ? 0 : 1, \"div\");\n      return super.initialize(canvas, origin, obj2);\n    }\n  }\n  const Canvas = \"canvas\";\n  const Hybrid = \"hybrid\";\n  const PNG = \"png\";\n  const SVG = \"svg\";\n  const None$1 = \"none\";\n  const RenderType = {\n    Canvas,\n    PNG,\n    SVG,\n    Hybrid,\n    None: None$1\n  };\n  const modules = {};\n  modules[Canvas] = modules[PNG] = {\n    renderer: CanvasRenderer,\n    headless: CanvasRenderer,\n    handler: CanvasHandler\n  };\n  modules[SVG] = {\n    renderer: SVGRenderer,\n    headless: SVGStringRenderer,\n    handler: SVGHandler\n  };\n  modules[Hybrid] = {\n    renderer: HybridRenderer,\n    headless: HybridRenderer,\n    handler: HybridHandler\n  };\n  modules[None$1] = {};\n  function renderModule(name, _) {\n    name = String(name || \"\").toLowerCase();\n    if (arguments.length > 1) {\n      modules[name] = _;\n      return this;\n    } else {\n      return modules[name];\n    }\n  }\n  function intersect$2(scene, bounds2, filter2) {\n    const hits = [], box2 = new Bounds().union(bounds2), type2 = scene.marktype;\n    return type2 ? intersectMark(scene, box2, filter2, hits) : type2 === \"group\" ? intersectGroup(scene, box2, filter2, hits) : error(\"Intersect scene must be mark node or group item.\");\n  }\n  function intersectMark(mark, box2, filter2, hits) {\n    if (visitMark(mark, box2, filter2)) {\n      const items = mark.items, type2 = mark.marktype, n = items.length;\n      let i = 0;\n      if (type2 === \"group\") {\n        for (; i < n; ++i) {\n          intersectGroup(items[i], box2, filter2, hits);\n        }\n      } else {\n        for (const test2 = Marks[type2].isect; i < n; ++i) {\n          const item = items[i];\n          if (intersectItem(item, box2, test2)) hits.push(item);\n        }\n      }\n    }\n    return hits;\n  }\n  function visitMark(mark, box2, filter2) {\n    return mark.bounds && box2.intersects(mark.bounds) && (mark.marktype === \"group\" || mark.interactive !== false && (!filter2 || filter2(mark)));\n  }\n  function intersectGroup(group2, box2, filter2, hits) {\n    if (filter2 && filter2(group2.mark) && intersectItem(group2, box2, Marks.group.isect)) {\n      hits.push(group2);\n    }\n    const marks = group2.items, n = marks && marks.length;\n    if (n) {\n      const x2 = group2.x || 0, y2 = group2.y || 0;\n      box2.translate(-x2, -y2);\n      for (let i = 0; i < n; ++i) {\n        intersectMark(marks[i], box2, filter2, hits);\n      }\n      box2.translate(x2, y2);\n    }\n    return hits;\n  }\n  function intersectItem(item, box2, test2) {\n    const bounds2 = item.bounds;\n    return box2.encloses(bounds2) || box2.intersects(bounds2) && test2(item, box2);\n  }\n  const clipBounds = new Bounds();\n  function boundClip(mark) {\n    const clip2 = mark.clip;\n    if (isFunction(clip2)) {\n      clip2(boundContext(clipBounds.clear()));\n    } else if (clip2) {\n      clipBounds.set(0, 0, mark.group.width, mark.group.height);\n    } else return;\n    mark.bounds.intersect(clipBounds);\n  }\n  const TOLERANCE = 1e-9;\n  function sceneEqual(a2, b2, key2) {\n    return a2 === b2 ? true : key2 === \"path\" ? pathEqual(a2, b2) : a2 instanceof Date && b2 instanceof Date ? +a2 === +b2 : isNumber$1(a2) && isNumber$1(b2) ? Math.abs(a2 - b2) <= TOLERANCE : !a2 || !b2 || !isObject(a2) && !isObject(b2) ? a2 == b2 : objectEqual(a2, b2);\n  }\n  function pathEqual(a2, b2) {\n    return sceneEqual(parse$3(a2), parse$3(b2));\n  }\n  function objectEqual(a2, b2) {\n    var ka = Object.keys(a2), kb = Object.keys(b2), key2, i;\n    if (ka.length !== kb.length) return false;\n    ka.sort();\n    kb.sort();\n    for (i = ka.length - 1; i >= 0; i--) {\n      if (ka[i] != kb[i]) return false;\n    }\n    for (i = ka.length - 1; i >= 0; i--) {\n      key2 = ka[i];\n      if (!sceneEqual(a2[key2], b2[key2], key2)) return false;\n    }\n    return typeof a2 === typeof b2;\n  }\n  function resetSVGDefIds() {\n    resetSVGClipId();\n    resetSVGGradientId();\n  }\n  const Top$1 = \"top\";\n  const Left$1 = \"left\";\n  const Right$1 = \"right\";\n  const Bottom$1 = \"bottom\";\n  const TopLeft = \"top-left\";\n  const TopRight = \"top-right\";\n  const BottomLeft = \"bottom-left\";\n  const BottomRight = \"bottom-right\";\n  const Start$1 = \"start\";\n  const Middle$1 = \"middle\";\n  const End$1 = \"end\";\n  const X = \"x\";\n  const Y = \"y\";\n  const Group = \"group\";\n  const AxisRole$1 = \"axis\";\n  const TitleRole$1 = \"title\";\n  const FrameRole$1 = \"frame\";\n  const ScopeRole$1 = \"scope\";\n  const LegendRole$1 = \"legend\";\n  const RowHeader = \"row-header\";\n  const RowFooter = \"row-footer\";\n  const RowTitle = \"row-title\";\n  const ColHeader = \"column-header\";\n  const ColFooter = \"column-footer\";\n  const ColTitle = \"column-title\";\n  const Padding$1 = \"padding\";\n  const Symbols$1 = \"symbol\";\n  const Fit = \"fit\";\n  const FitX = \"fit-x\";\n  const FitY = \"fit-y\";\n  const Pad = \"pad\";\n  const None = \"none\";\n  const All = \"all\";\n  const Each = \"each\";\n  const Flush = \"flush\";\n  const Column = \"column\";\n  const Row = \"row\";\n  function Bound$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Bound$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow, mark = _.mark, type2 = mark.marktype, entry2 = Marks[type2], bound2 = entry2.bound;\n      let markBounds = mark.bounds, rebound;\n      if (entry2.nested) {\n        if (mark.items.length) view.dirty(mark.items[0]);\n        markBounds = boundItem(mark, bound2);\n        mark.items.forEach((item) => {\n          item.bounds.clear().union(markBounds);\n        });\n      } else if (type2 === Group || _.modified()) {\n        pulse2.visit(pulse2.MOD, (item) => view.dirty(item));\n        markBounds.clear();\n        mark.items.forEach((item) => markBounds.union(boundItem(item, bound2)));\n        switch (mark.role) {\n          case AxisRole$1:\n          case LegendRole$1:\n          case TitleRole$1:\n            pulse2.reflow();\n        }\n      } else {\n        rebound = pulse2.changed(pulse2.REM);\n        pulse2.visit(pulse2.ADD, (item) => {\n          markBounds.union(boundItem(item, bound2));\n        });\n        pulse2.visit(pulse2.MOD, (item) => {\n          rebound = rebound || markBounds.alignsWith(item.bounds);\n          view.dirty(item);\n          markBounds.union(boundItem(item, bound2));\n        });\n        if (rebound) {\n          markBounds.clear();\n          mark.items.forEach((item) => markBounds.union(item.bounds));\n        }\n      }\n      boundClip(mark);\n      return pulse2.modifies(\"bounds\");\n    }\n  });\n  function boundItem(item, bound2, opt) {\n    return bound2(item.bounds.clear(), item, opt);\n  }\n  const COUNTER_NAME = \":vega_identifier:\";\n  function Identifier$1(params2) {\n    Transform.call(this, 0, params2);\n  }\n  Identifier$1.Definition = {\n    \"type\": \"Identifier\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"required\": true\n    }]\n  };\n  inherits(Identifier$1, Transform, {\n    transform(_, pulse2) {\n      const counter = getCounter(pulse2.dataflow), as = _.as;\n      let id2 = counter.value;\n      pulse2.visit(pulse2.ADD, (t) => t[as] = t[as] || ++id2);\n      counter.set(this.value = id2);\n      return pulse2;\n    }\n  });\n  function getCounter(view) {\n    return view._signals[COUNTER_NAME] || (view._signals[COUNTER_NAME] = view.add(0));\n  }\n  function Mark$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Mark$1, Transform, {\n    transform(_, pulse2) {\n      let mark = this.value;\n      if (!mark) {\n        mark = pulse2.dataflow.scenegraph().mark(_.markdef, lookup$1$1(_), _.index);\n        mark.group.context = _.context;\n        if (!_.context.group) _.context.group = mark.group;\n        mark.source = this.source;\n        mark.clip = _.clip;\n        mark.interactive = _.interactive;\n        this.value = mark;\n      }\n      const Init = mark.marktype === Group ? GroupItem : Item;\n      pulse2.visit(pulse2.ADD, (item) => Init.call(item, mark));\n      if (_.modified(\"clip\") || _.modified(\"interactive\")) {\n        mark.clip = _.clip;\n        mark.interactive = !!_.interactive;\n        mark.zdirty = true;\n        pulse2.reflow();\n      }\n      mark.items = pulse2.source;\n      return pulse2;\n    }\n  });\n  function lookup$1$1(_) {\n    const g = _.groups, p = _.parent;\n    return g && g.size === 1 ? g.get(Object.keys(g.object)[0]) : g && p ? g.lookup(p) : null;\n  }\n  function Overlap$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  const methods = {\n    parity: (items) => items.filter((item, i) => i % 2 ? item.opacity = 0 : 1),\n    greedy: (items, sep) => {\n      let a2;\n      return items.filter((b2, i) => !i || !intersect$1(a2.bounds, b2.bounds, sep) ? (a2 = b2, 1) : b2.opacity = 0);\n    }\n  };\n  const intersect$1 = (a2, b2, sep) => sep > Math.max(b2.x1 - a2.x2, a2.x1 - b2.x2, b2.y1 - a2.y2, a2.y1 - b2.y2);\n  const hasOverlap = (items, pad2) => {\n    for (var i = 1, n = items.length, a2 = items[0].bounds, b2; i < n; a2 = b2, ++i) {\n      if (intersect$1(a2, b2 = items[i].bounds, pad2)) return true;\n    }\n  };\n  const hasBounds = (item) => {\n    const b2 = item.bounds;\n    return b2.width() > 1 && b2.height() > 1;\n  };\n  const boundTest = (scale2, orient, tolerance) => {\n    var range2 = scale2.range(), b2 = new Bounds();\n    if (orient === Top$1 || orient === Bottom$1) {\n      b2.set(range2[0], -Infinity, range2[1], Infinity);\n    } else {\n      b2.set(-Infinity, range2[0], Infinity, range2[1]);\n    }\n    b2.expand(tolerance || 1);\n    return (item) => b2.encloses(item.bounds);\n  };\n  const reset = (source2) => {\n    source2.forEach((item) => item.opacity = 1);\n    return source2;\n  };\n  const reflow = (pulse2, _) => pulse2.reflow(_.modified()).modifies(\"opacity\");\n  inherits(Overlap$1, Transform, {\n    transform(_, pulse2) {\n      const reduce = methods[_.method] || methods.parity, sep = _.separation || 0;\n      let source2 = pulse2.materialize(pulse2.SOURCE).source, items, test2;\n      if (!source2 || !source2.length) return;\n      if (!_.method) {\n        if (_.modified(\"method\")) {\n          reset(source2);\n          pulse2 = reflow(pulse2, _);\n        }\n        return pulse2;\n      }\n      source2 = source2.filter(hasBounds);\n      if (!source2.length) return;\n      if (_.sort) {\n        source2 = source2.slice().sort(_.sort);\n      }\n      items = reset(source2);\n      pulse2 = reflow(pulse2, _);\n      if (items.length >= 3 && hasOverlap(items, sep)) {\n        do {\n          items = reduce(items, sep);\n        } while (items.length >= 3 && hasOverlap(items, sep));\n        if (items.length < 3 && !peek$1(source2).opacity) {\n          if (items.length > 1) peek$1(items).opacity = 0;\n          peek$1(source2).opacity = 1;\n        }\n      }\n      if (_.boundScale && _.boundTolerance >= 0) {\n        test2 = boundTest(_.boundScale, _.boundOrient, +_.boundTolerance);\n        source2.forEach((item) => {\n          if (!test2(item)) item.opacity = 0;\n        });\n      }\n      const bounds2 = items[0].mark.bounds.clear();\n      source2.forEach((item) => {\n        if (item.opacity) bounds2.union(item.bounds);\n      });\n      return pulse2;\n    }\n  });\n  function Render$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Render$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow;\n      pulse2.visit(pulse2.ALL, (item) => view.dirty(item));\n      if (pulse2.fields && pulse2.fields[\"zindex\"]) {\n        const item = pulse2.source && pulse2.source[0];\n        if (item) item.mark.zdirty = true;\n      }\n    }\n  });\n  const tempBounds = new Bounds();\n  function set$2(item, property2, value2) {\n    return item[property2] === value2 ? 0 : (item[property2] = value2, 1);\n  }\n  function isYAxis(mark) {\n    var orient = mark.items[0].orient;\n    return orient === Left$1 || orient === Right$1;\n  }\n  function axisIndices(datum2) {\n    let index2 = +datum2.grid;\n    return [\n      datum2.ticks ? index2++ : -1,\n      // ticks index\n      datum2.labels ? index2++ : -1,\n      // labels index\n      index2 + +datum2.domain\n      // title index\n    ];\n  }\n  function axisLayout(view, axis, width2, height2) {\n    var item = axis.items[0], datum2 = item.datum, delta = item.translate != null ? item.translate : 0.5, orient = item.orient, indices = axisIndices(datum2), range2 = item.range, offset2 = item.offset, position2 = item.position, minExtent = item.minExtent, maxExtent = item.maxExtent, title = datum2.title && item.items[indices[2]].items[0], titlePadding = item.titlePadding, bounds2 = item.bounds, dl = title && multiLineOffset(title), x2 = 0, y2 = 0, i, s2;\n    tempBounds.clear().union(bounds2);\n    bounds2.clear();\n    if ((i = indices[0]) > -1) bounds2.union(item.items[i].bounds);\n    if ((i = indices[1]) > -1) bounds2.union(item.items[i].bounds);\n    switch (orient) {\n      case Top$1:\n        x2 = position2 || 0;\n        y2 = -offset2;\n        s2 = Math.max(minExtent, Math.min(maxExtent, -bounds2.y1));\n        bounds2.add(0, -s2).add(range2, 0);\n        if (title) axisTitleLayout(view, title, s2, titlePadding, dl, 0, -1, bounds2);\n        break;\n      case Left$1:\n        x2 = -offset2;\n        y2 = position2 || 0;\n        s2 = Math.max(minExtent, Math.min(maxExtent, -bounds2.x1));\n        bounds2.add(-s2, 0).add(0, range2);\n        if (title) axisTitleLayout(view, title, s2, titlePadding, dl, 1, -1, bounds2);\n        break;\n      case Right$1:\n        x2 = width2 + offset2;\n        y2 = position2 || 0;\n        s2 = Math.max(minExtent, Math.min(maxExtent, bounds2.x2));\n        bounds2.add(0, 0).add(s2, range2);\n        if (title) axisTitleLayout(view, title, s2, titlePadding, dl, 1, 1, bounds2);\n        break;\n      case Bottom$1:\n        x2 = position2 || 0;\n        y2 = height2 + offset2;\n        s2 = Math.max(minExtent, Math.min(maxExtent, bounds2.y2));\n        bounds2.add(0, 0).add(range2, s2);\n        if (title) axisTitleLayout(view, title, s2, titlePadding, 0, 0, 1, bounds2);\n        break;\n      default:\n        x2 = item.x;\n        y2 = item.y;\n    }\n    boundStroke(bounds2.translate(x2, y2), item);\n    if (set$2(item, \"x\", x2 + delta) | set$2(item, \"y\", y2 + delta)) {\n      item.bounds = tempBounds;\n      view.dirty(item);\n      item.bounds = bounds2;\n      view.dirty(item);\n    }\n    return item.mark.bounds.clear().union(bounds2);\n  }\n  function axisTitleLayout(view, title, offset2, pad2, dl, isYAxis2, sign2, bounds2) {\n    const b2 = title.bounds;\n    if (title.auto) {\n      const v = sign2 * (offset2 + dl + pad2);\n      let dx = 0, dy = 0;\n      view.dirty(title);\n      isYAxis2 ? dx = (title.x || 0) - (title.x = v) : dy = (title.y || 0) - (title.y = v);\n      title.mark.bounds.clear().union(b2.translate(-dx, -dy));\n      view.dirty(title);\n    }\n    bounds2.union(b2);\n  }\n  const min = (a2, b2) => Math.floor(Math.min(a2, b2));\n  const max = (a2, b2) => Math.ceil(Math.max(a2, b2));\n  function gridLayoutGroups(group2) {\n    var groups = group2.items, n = groups.length, i = 0, mark, items;\n    const views = {\n      marks: [],\n      rowheaders: [],\n      rowfooters: [],\n      colheaders: [],\n      colfooters: [],\n      rowtitle: null,\n      coltitle: null\n    };\n    for (; i < n; ++i) {\n      mark = groups[i];\n      items = mark.items;\n      if (mark.marktype === Group) {\n        switch (mark.role) {\n          case AxisRole$1:\n          case LegendRole$1:\n          case TitleRole$1:\n            break;\n          case RowHeader:\n            views.rowheaders.push(...items);\n            break;\n          case RowFooter:\n            views.rowfooters.push(...items);\n            break;\n          case ColHeader:\n            views.colheaders.push(...items);\n            break;\n          case ColFooter:\n            views.colfooters.push(...items);\n            break;\n          case RowTitle:\n            views.rowtitle = items[0];\n            break;\n          case ColTitle:\n            views.coltitle = items[0];\n            break;\n          default:\n            views.marks.push(...items);\n        }\n      }\n    }\n    return views;\n  }\n  function bboxFlush(item) {\n    return new Bounds().set(0, 0, item.width || 0, item.height || 0);\n  }\n  function bboxFull(item) {\n    const b2 = item.bounds.clone();\n    return b2.empty() ? b2.set(0, 0, 0, 0) : b2.translate(-(item.x || 0), -(item.y || 0));\n  }\n  function get$1(opt, key2, d2) {\n    const v = isObject(opt) ? opt[key2] : opt;\n    return v != null ? v : d2 !== void 0 ? d2 : 0;\n  }\n  function offsetValue$1(v) {\n    return v < 0 ? Math.ceil(-v) : 0;\n  }\n  function gridLayout(view, groups, opt) {\n    var dirty = !opt.nodirty, bbox = opt.bounds === Flush ? bboxFlush : bboxFull, bounds2 = tempBounds.set(0, 0, 0, 0), alignCol = get$1(opt.align, Column), alignRow = get$1(opt.align, Row), padCol = get$1(opt.padding, Column), padRow = get$1(opt.padding, Row), ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), n = groups.length, xOffset = Array(n), xExtent = Array(ncols), xMax = 0, yOffset = Array(n), yExtent = Array(nrows), yMax = 0, dx = Array(n), dy = Array(n), boxes = Array(n), m2, i, c2, r, b2, g, px2, py2, x2, y2, offset2;\n    for (i = 0; i < ncols; ++i) xExtent[i] = 0;\n    for (i = 0; i < nrows; ++i) yExtent[i] = 0;\n    for (i = 0; i < n; ++i) {\n      g = groups[i];\n      b2 = boxes[i] = bbox(g);\n      g.x = g.x || 0;\n      dx[i] = 0;\n      g.y = g.y || 0;\n      dy[i] = 0;\n      c2 = i % ncols;\n      r = ~~(i / ncols);\n      xMax = Math.max(xMax, px2 = Math.ceil(b2.x2));\n      yMax = Math.max(yMax, py2 = Math.ceil(b2.y2));\n      xExtent[c2] = Math.max(xExtent[c2], px2);\n      yExtent[r] = Math.max(yExtent[r], py2);\n      xOffset[i] = padCol + offsetValue$1(b2.x1);\n      yOffset[i] = padRow + offsetValue$1(b2.y1);\n      if (dirty) view.dirty(groups[i]);\n    }\n    for (i = 0; i < n; ++i) {\n      if (i % ncols === 0) xOffset[i] = 0;\n      if (i < ncols) yOffset[i] = 0;\n    }\n    if (alignCol === Each) {\n      for (c2 = 1; c2 < ncols; ++c2) {\n        for (offset2 = 0, i = c2; i < n; i += ncols) {\n          if (offset2 < xOffset[i]) offset2 = xOffset[i];\n        }\n        for (i = c2; i < n; i += ncols) {\n          xOffset[i] = offset2 + xExtent[c2 - 1];\n        }\n      }\n    } else if (alignCol === All) {\n      for (offset2 = 0, i = 0; i < n; ++i) {\n        if (i % ncols && offset2 < xOffset[i]) offset2 = xOffset[i];\n      }\n      for (i = 0; i < n; ++i) {\n        if (i % ncols) xOffset[i] = offset2 + xMax;\n      }\n    } else {\n      for (alignCol = false, c2 = 1; c2 < ncols; ++c2) {\n        for (i = c2; i < n; i += ncols) {\n          xOffset[i] += xExtent[c2 - 1];\n        }\n      }\n    }\n    if (alignRow === Each) {\n      for (r = 1; r < nrows; ++r) {\n        for (offset2 = 0, i = r * ncols, m2 = i + ncols; i < m2; ++i) {\n          if (offset2 < yOffset[i]) offset2 = yOffset[i];\n        }\n        for (i = r * ncols; i < m2; ++i) {\n          yOffset[i] = offset2 + yExtent[r - 1];\n        }\n      }\n    } else if (alignRow === All) {\n      for (offset2 = 0, i = ncols; i < n; ++i) {\n        if (offset2 < yOffset[i]) offset2 = yOffset[i];\n      }\n      for (i = ncols; i < n; ++i) {\n        yOffset[i] = offset2 + yMax;\n      }\n    } else {\n      for (alignRow = false, r = 1; r < nrows; ++r) {\n        for (i = r * ncols, m2 = i + ncols; i < m2; ++i) {\n          yOffset[i] += yExtent[r - 1];\n        }\n      }\n    }\n    for (x2 = 0, i = 0; i < n; ++i) {\n      x2 = xOffset[i] + (i % ncols ? x2 : 0);\n      dx[i] += x2 - groups[i].x;\n    }\n    for (c2 = 0; c2 < ncols; ++c2) {\n      for (y2 = 0, i = c2; i < n; i += ncols) {\n        y2 += yOffset[i];\n        dy[i] += y2 - groups[i].y;\n      }\n    }\n    if (alignCol && get$1(opt.center, Column) && nrows > 1) {\n      for (i = 0; i < n; ++i) {\n        b2 = alignCol === All ? xMax : xExtent[i % ncols];\n        x2 = b2 - boxes[i].x2 - groups[i].x - dx[i];\n        if (x2 > 0) dx[i] += x2 / 2;\n      }\n    }\n    if (alignRow && get$1(opt.center, Row) && ncols !== 1) {\n      for (i = 0; i < n; ++i) {\n        b2 = alignRow === All ? yMax : yExtent[~~(i / ncols)];\n        y2 = b2 - boxes[i].y2 - groups[i].y - dy[i];\n        if (y2 > 0) dy[i] += y2 / 2;\n      }\n    }\n    for (i = 0; i < n; ++i) {\n      bounds2.union(boxes[i].translate(dx[i], dy[i]));\n    }\n    x2 = get$1(opt.anchor, X);\n    y2 = get$1(opt.anchor, Y);\n    switch (get$1(opt.anchor, Column)) {\n      case End$1:\n        x2 -= bounds2.width();\n        break;\n      case Middle$1:\n        x2 -= bounds2.width() / 2;\n    }\n    switch (get$1(opt.anchor, Row)) {\n      case End$1:\n        y2 -= bounds2.height();\n        break;\n      case Middle$1:\n        y2 -= bounds2.height() / 2;\n    }\n    x2 = Math.round(x2);\n    y2 = Math.round(y2);\n    bounds2.clear();\n    for (i = 0; i < n; ++i) {\n      groups[i].mark.bounds.clear();\n    }\n    for (i = 0; i < n; ++i) {\n      g = groups[i];\n      g.x += dx[i] += x2;\n      g.y += dy[i] += y2;\n      bounds2.union(g.mark.bounds.union(g.bounds.translate(dx[i], dy[i])));\n      if (dirty) view.dirty(g);\n    }\n    return bounds2;\n  }\n  function trellisLayout(view, group2, opt) {\n    var views = gridLayoutGroups(group2), groups = views.marks, bbox = opt.bounds === Flush ? boundFlush : boundFull, off = opt.offset, ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), cells = nrows * ncols, x2, y2, x22, y22, anchor, band2, offset2;\n    const bounds2 = gridLayout(view, groups, opt);\n    if (bounds2.empty()) bounds2.set(0, 0, 0, 0);\n    if (views.rowheaders) {\n      band2 = get$1(opt.headerBand, Row, null);\n      x2 = layoutHeaders(view, views.rowheaders, groups, ncols, nrows, -get$1(off, \"rowHeader\"), min, 0, bbox, \"x1\", 0, ncols, 1, band2);\n    }\n    if (views.colheaders) {\n      band2 = get$1(opt.headerBand, Column, null);\n      y2 = layoutHeaders(view, views.colheaders, groups, ncols, ncols, -get$1(off, \"columnHeader\"), min, 1, bbox, \"y1\", 0, 1, ncols, band2);\n    }\n    if (views.rowfooters) {\n      band2 = get$1(opt.footerBand, Row, null);\n      x22 = layoutHeaders(view, views.rowfooters, groups, ncols, nrows, get$1(off, \"rowFooter\"), max, 0, bbox, \"x2\", ncols - 1, ncols, 1, band2);\n    }\n    if (views.colfooters) {\n      band2 = get$1(opt.footerBand, Column, null);\n      y22 = layoutHeaders(view, views.colfooters, groups, ncols, ncols, get$1(off, \"columnFooter\"), max, 1, bbox, \"y2\", cells - ncols, 1, ncols, band2);\n    }\n    if (views.rowtitle) {\n      anchor = get$1(opt.titleAnchor, Row);\n      offset2 = get$1(off, \"rowTitle\");\n      offset2 = anchor === End$1 ? x22 + offset2 : x2 - offset2;\n      band2 = get$1(opt.titleBand, Row, 0.5);\n      layoutTitle(view, views.rowtitle, offset2, 0, bounds2, band2);\n    }\n    if (views.coltitle) {\n      anchor = get$1(opt.titleAnchor, Column);\n      offset2 = get$1(off, \"columnTitle\");\n      offset2 = anchor === End$1 ? y22 + offset2 : y2 - offset2;\n      band2 = get$1(opt.titleBand, Column, 0.5);\n      layoutTitle(view, views.coltitle, offset2, 1, bounds2, band2);\n    }\n  }\n  function boundFlush(item, field2) {\n    return field2 === \"x1\" ? item.x || 0 : field2 === \"y1\" ? item.y || 0 : field2 === \"x2\" ? (item.x || 0) + (item.width || 0) : field2 === \"y2\" ? (item.y || 0) + (item.height || 0) : void 0;\n  }\n  function boundFull(item, field2) {\n    return item.bounds[field2];\n  }\n  function layoutHeaders(view, headers, groups, ncols, limit, offset2, agg, isX2, bound2, bf, start, stride, back, band2) {\n    var n = groups.length, init2 = 0, edge = 0, i, j, k, m2, b2, h2, g, x2, y2;\n    if (!n) return init2;\n    for (i = start; i < n; i += stride) {\n      if (groups[i]) init2 = agg(init2, bound2(groups[i], bf));\n    }\n    if (!headers.length) return init2;\n    if (headers.length > limit) {\n      view.warn(\"Grid headers exceed limit: \" + limit);\n      headers = headers.slice(0, limit);\n    }\n    init2 += offset2;\n    for (j = 0, m2 = headers.length; j < m2; ++j) {\n      view.dirty(headers[j]);\n      headers[j].mark.bounds.clear();\n    }\n    for (i = start, j = 0, m2 = headers.length; j < m2; ++j, i += stride) {\n      h2 = headers[j];\n      b2 = h2.mark.bounds;\n      for (k = i; k >= 0 && (g = groups[k]) == null; k -= back) ;\n      if (isX2) {\n        x2 = band2 == null ? g.x : Math.round(g.bounds.x1 + band2 * g.bounds.width());\n        y2 = init2;\n      } else {\n        x2 = init2;\n        y2 = band2 == null ? g.y : Math.round(g.bounds.y1 + band2 * g.bounds.height());\n      }\n      b2.union(h2.bounds.translate(x2 - (h2.x || 0), y2 - (h2.y || 0)));\n      h2.x = x2;\n      h2.y = y2;\n      view.dirty(h2);\n      edge = agg(edge, b2[bf]);\n    }\n    return edge;\n  }\n  function layoutTitle(view, g, offset2, isX2, bounds2, band2) {\n    if (!g) return;\n    view.dirty(g);\n    var x2 = offset2, y2 = offset2;\n    isX2 ? x2 = Math.round(bounds2.x1 + band2 * bounds2.width()) : y2 = Math.round(bounds2.y1 + band2 * bounds2.height());\n    g.bounds.translate(x2 - (g.x || 0), y2 - (g.y || 0));\n    g.mark.bounds.clear().union(g.bounds);\n    g.x = x2;\n    g.y = y2;\n    view.dirty(g);\n  }\n  function lookup$3(config, orient) {\n    const opt = config[orient] || {};\n    return (key2, d2) => opt[key2] != null ? opt[key2] : config[key2] != null ? config[key2] : d2;\n  }\n  function offsets(legends, value2) {\n    let max2 = -Infinity;\n    legends.forEach((item) => {\n      if (item.offset != null) max2 = Math.max(max2, item.offset);\n    });\n    return max2 > -Infinity ? max2 : value2;\n  }\n  function legendParams(g, orient, config, xb, yb, w2, h2) {\n    const _ = lookup$3(config, orient), offset2 = offsets(g, _(\"offset\", 0)), anchor = _(\"anchor\", Start$1), mult2 = anchor === End$1 ? 1 : anchor === Middle$1 ? 0.5 : 0;\n    const p = {\n      align: Each,\n      bounds: _(\"bounds\", Flush),\n      columns: _(\"direction\") === \"vertical\" ? 1 : g.length,\n      padding: _(\"margin\", 8),\n      center: _(\"center\"),\n      nodirty: true\n    };\n    switch (orient) {\n      case Left$1:\n        p.anchor = {\n          x: Math.floor(xb.x1) - offset2,\n          column: End$1,\n          y: mult2 * (h2 || xb.height() + 2 * xb.y1),\n          row: anchor\n        };\n        break;\n      case Right$1:\n        p.anchor = {\n          x: Math.ceil(xb.x2) + offset2,\n          y: mult2 * (h2 || xb.height() + 2 * xb.y1),\n          row: anchor\n        };\n        break;\n      case Top$1:\n        p.anchor = {\n          y: Math.floor(yb.y1) - offset2,\n          row: End$1,\n          x: mult2 * (w2 || yb.width() + 2 * yb.x1),\n          column: anchor\n        };\n        break;\n      case Bottom$1:\n        p.anchor = {\n          y: Math.ceil(yb.y2) + offset2,\n          x: mult2 * (w2 || yb.width() + 2 * yb.x1),\n          column: anchor\n        };\n        break;\n      case TopLeft:\n        p.anchor = {\n          x: offset2,\n          y: offset2\n        };\n        break;\n      case TopRight:\n        p.anchor = {\n          x: w2 - offset2,\n          y: offset2,\n          column: End$1\n        };\n        break;\n      case BottomLeft:\n        p.anchor = {\n          x: offset2,\n          y: h2 - offset2,\n          row: End$1\n        };\n        break;\n      case BottomRight:\n        p.anchor = {\n          x: w2 - offset2,\n          y: h2 - offset2,\n          column: End$1,\n          row: End$1\n        };\n        break;\n    }\n    return p;\n  }\n  function legendLayout(view, legend2) {\n    var item = legend2.items[0], datum2 = item.datum, orient = item.orient, bounds2 = item.bounds, x2 = item.x, y2 = item.y, w2, h2;\n    item._bounds ? item._bounds.clear().union(bounds2) : item._bounds = bounds2.clone();\n    bounds2.clear();\n    legendGroupLayout(view, item, item.items[0].items[0]);\n    bounds2 = legendBounds(item, bounds2);\n    w2 = 2 * item.padding;\n    h2 = 2 * item.padding;\n    if (!bounds2.empty()) {\n      w2 = Math.ceil(bounds2.width() + w2);\n      h2 = Math.ceil(bounds2.height() + h2);\n    }\n    if (datum2.type === Symbols$1) {\n      legendEntryLayout(item.items[0].items[0].items[0].items);\n    }\n    if (orient !== None) {\n      item.x = x2 = 0;\n      item.y = y2 = 0;\n    }\n    item.width = w2;\n    item.height = h2;\n    boundStroke(bounds2.set(x2, y2, x2 + w2, y2 + h2), item);\n    item.mark.bounds.clear().union(bounds2);\n    return item;\n  }\n  function legendBounds(item, b2) {\n    item.items.forEach((_) => b2.union(_.bounds));\n    b2.x1 = item.padding;\n    b2.y1 = item.padding;\n    return b2;\n  }\n  function legendGroupLayout(view, item, entry2) {\n    var pad2 = item.padding, ex = pad2 - entry2.x, ey = pad2 - entry2.y;\n    if (!item.datum.title) {\n      if (ex || ey) translate(view, entry2, ex, ey);\n    } else {\n      var title = item.items[1].items[0], anchor = title.anchor, tpad = item.titlePadding || 0, tx2 = pad2 - title.x, ty2 = pad2 - title.y;\n      switch (title.orient) {\n        case Left$1:\n          ex += Math.ceil(title.bounds.width()) + tpad;\n          break;\n        case Right$1:\n        case Bottom$1:\n          break;\n        default:\n          ey += title.bounds.height() + tpad;\n      }\n      if (ex || ey) translate(view, entry2, ex, ey);\n      switch (title.orient) {\n        case Left$1:\n          ty2 += legendTitleOffset(item, entry2, title, anchor, 1, 1);\n          break;\n        case Right$1:\n          tx2 += legendTitleOffset(item, entry2, title, End$1, 0, 0) + tpad;\n          ty2 += legendTitleOffset(item, entry2, title, anchor, 1, 1);\n          break;\n        case Bottom$1:\n          tx2 += legendTitleOffset(item, entry2, title, anchor, 0, 0);\n          ty2 += legendTitleOffset(item, entry2, title, End$1, -1, 0, 1) + tpad;\n          break;\n        default:\n          tx2 += legendTitleOffset(item, entry2, title, anchor, 0, 0);\n      }\n      if (tx2 || ty2) translate(view, title, tx2, ty2);\n      if ((tx2 = Math.round(title.bounds.x1 - pad2)) < 0) {\n        translate(view, entry2, -tx2, 0);\n        translate(view, title, -tx2, 0);\n      }\n    }\n  }\n  function legendTitleOffset(item, entry2, title, anchor, y2, lr, noBar) {\n    const grad = item.datum.type !== \"symbol\", vgrad = title.datum.vgrad, e = grad && (lr || !vgrad) && !noBar ? entry2.items[0] : entry2, s2 = e.bounds[y2 ? \"y2\" : \"x2\"] - item.padding, u2 = vgrad && lr ? s2 : 0, v = vgrad && lr ? 0 : s2, o = y2 <= 0 ? 0 : multiLineOffset(title);\n    return Math.round(anchor === Start$1 ? u2 : anchor === End$1 ? v - o : 0.5 * (s2 - o));\n  }\n  function translate(view, item, dx, dy) {\n    item.x += dx;\n    item.y += dy;\n    item.bounds.translate(dx, dy);\n    item.mark.bounds.translate(dx, dy);\n    view.dirty(item);\n  }\n  function legendEntryLayout(entries) {\n    const widths = entries.reduce((w2, g) => {\n      w2[g.column] = Math.max(g.bounds.x2 - g.x, w2[g.column] || 0);\n      return w2;\n    }, {});\n    entries.forEach((g) => {\n      g.width = widths[g.column];\n      g.height = g.bounds.y2 - g.y;\n    });\n  }\n  function titleLayout(view, mark, width2, height2, viewBounds2) {\n    var group2 = mark.items[0], frame2 = group2.frame, orient = group2.orient, anchor = group2.anchor, offset2 = group2.offset, padding2 = group2.padding, title = group2.items[0].items[0], subtitle = group2.items[1] && group2.items[1].items[0], end = orient === Left$1 || orient === Right$1 ? height2 : width2, start = 0, x2 = 0, y2 = 0, sx = 0, sy = 0, pos;\n    if (frame2 !== Group) {\n      orient === Left$1 ? (start = viewBounds2.y2, end = viewBounds2.y1) : orient === Right$1 ? (start = viewBounds2.y1, end = viewBounds2.y2) : (start = viewBounds2.x1, end = viewBounds2.x2);\n    } else if (orient === Left$1) {\n      start = height2, end = 0;\n    }\n    pos = anchor === Start$1 ? start : anchor === End$1 ? end : (start + end) / 2;\n    if (subtitle && subtitle.text) {\n      switch (orient) {\n        case Top$1:\n        case Bottom$1:\n          sy = title.bounds.height() + padding2;\n          break;\n        case Left$1:\n          sx = title.bounds.width() + padding2;\n          break;\n        case Right$1:\n          sx = -title.bounds.width() - padding2;\n          break;\n      }\n      tempBounds.clear().union(subtitle.bounds);\n      tempBounds.translate(sx - (subtitle.x || 0), sy - (subtitle.y || 0));\n      if (set$2(subtitle, \"x\", sx) | set$2(subtitle, \"y\", sy)) {\n        view.dirty(subtitle);\n        subtitle.bounds.clear().union(tempBounds);\n        subtitle.mark.bounds.clear().union(tempBounds);\n        view.dirty(subtitle);\n      }\n      tempBounds.clear().union(subtitle.bounds);\n    } else {\n      tempBounds.clear();\n    }\n    tempBounds.union(title.bounds);\n    switch (orient) {\n      case Top$1:\n        x2 = pos;\n        y2 = viewBounds2.y1 - tempBounds.height() - offset2;\n        break;\n      case Left$1:\n        x2 = viewBounds2.x1 - tempBounds.width() - offset2;\n        y2 = pos;\n        break;\n      case Right$1:\n        x2 = viewBounds2.x2 + tempBounds.width() + offset2;\n        y2 = pos;\n        break;\n      case Bottom$1:\n        x2 = pos;\n        y2 = viewBounds2.y2 + offset2;\n        break;\n      default:\n        x2 = group2.x;\n        y2 = group2.y;\n    }\n    if (set$2(group2, \"x\", x2) | set$2(group2, \"y\", y2)) {\n      tempBounds.translate(x2, y2);\n      view.dirty(group2);\n      group2.bounds.clear().union(tempBounds);\n      mark.bounds.clear().union(tempBounds);\n      view.dirty(group2);\n    }\n    return group2.bounds;\n  }\n  function ViewLayout$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(ViewLayout$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow;\n      _.mark.items.forEach((group2) => {\n        if (_.layout) trellisLayout(view, group2, _.layout);\n        layoutGroup(view, group2, _);\n      });\n      return shouldReflow(_.mark.group) ? pulse2.reflow() : pulse2;\n    }\n  });\n  function shouldReflow(group2) {\n    return group2 && group2.mark.role !== \"legend-entry\";\n  }\n  function layoutGroup(view, group2, _) {\n    var items = group2.items, width2 = Math.max(0, group2.width || 0), height2 = Math.max(0, group2.height || 0), viewBounds2 = new Bounds().set(0, 0, width2, height2), xBounds = viewBounds2.clone(), yBounds = viewBounds2.clone(), legends = [], title, mark, orient, b2, i, n;\n    for (i = 0, n = items.length; i < n; ++i) {\n      mark = items[i];\n      switch (mark.role) {\n        case AxisRole$1:\n          b2 = isYAxis(mark) ? xBounds : yBounds;\n          b2.union(axisLayout(view, mark, width2, height2));\n          break;\n        case TitleRole$1:\n          title = mark;\n          break;\n        case LegendRole$1:\n          legends.push(legendLayout(view, mark));\n          break;\n        case FrameRole$1:\n        case ScopeRole$1:\n        case RowHeader:\n        case RowFooter:\n        case RowTitle:\n        case ColHeader:\n        case ColFooter:\n        case ColTitle:\n          xBounds.union(mark.bounds);\n          yBounds.union(mark.bounds);\n          break;\n        default:\n          viewBounds2.union(mark.bounds);\n      }\n    }\n    if (legends.length) {\n      const l = {};\n      legends.forEach((item) => {\n        orient = item.orient || Right$1;\n        if (orient !== None) (l[orient] || (l[orient] = [])).push(item);\n      });\n      for (const orient2 in l) {\n        const g = l[orient2];\n        gridLayout(view, g, legendParams(g, orient2, _.legends, xBounds, yBounds, width2, height2));\n      }\n      legends.forEach((item) => {\n        const b3 = item.bounds;\n        if (!b3.equals(item._bounds)) {\n          item.bounds = item._bounds;\n          view.dirty(item);\n          item.bounds = b3;\n          view.dirty(item);\n        }\n        if (_.autosize && (_.autosize.type === Fit || _.autosize.type === FitX || _.autosize.type === FitY)) {\n          switch (item.orient) {\n            case Left$1:\n            case Right$1:\n              viewBounds2.add(b3.x1, 0).add(b3.x2, 0);\n              break;\n            case Top$1:\n            case Bottom$1:\n              viewBounds2.add(0, b3.y1).add(0, b3.y2);\n          }\n        } else {\n          viewBounds2.union(b3);\n        }\n      });\n    }\n    viewBounds2.union(xBounds).union(yBounds);\n    if (title) {\n      viewBounds2.union(titleLayout(view, title, width2, height2, viewBounds2));\n    }\n    if (group2.clip) {\n      viewBounds2.set(0, 0, group2.width || 0, group2.height || 0);\n    }\n    viewSizeLayout(view, group2, viewBounds2, _);\n  }\n  function viewSizeLayout(view, group2, viewBounds2, _) {\n    const auto = _.autosize || {}, type2 = auto.type;\n    if (view._autosize < 1 || !type2) return;\n    let viewWidth2 = view._width, viewHeight2 = view._height, width2 = Math.max(0, group2.width || 0), left = Math.max(0, Math.ceil(-viewBounds2.x1)), height2 = Math.max(0, group2.height || 0), top = Math.max(0, Math.ceil(-viewBounds2.y1));\n    const right = Math.max(0, Math.ceil(viewBounds2.x2 - width2)), bottom = Math.max(0, Math.ceil(viewBounds2.y2 - height2));\n    if (auto.contains === Padding$1) {\n      const padding2 = view.padding();\n      viewWidth2 -= padding2.left + padding2.right;\n      viewHeight2 -= padding2.top + padding2.bottom;\n    }\n    if (type2 === None) {\n      left = 0;\n      top = 0;\n      width2 = viewWidth2;\n      height2 = viewHeight2;\n    } else if (type2 === Fit) {\n      width2 = Math.max(0, viewWidth2 - left - right);\n      height2 = Math.max(0, viewHeight2 - top - bottom);\n    } else if (type2 === FitX) {\n      width2 = Math.max(0, viewWidth2 - left - right);\n      viewHeight2 = height2 + top + bottom;\n    } else if (type2 === FitY) {\n      viewWidth2 = width2 + left + right;\n      height2 = Math.max(0, viewHeight2 - top - bottom);\n    } else if (type2 === Pad) {\n      viewWidth2 = width2 + left + right;\n      viewHeight2 = height2 + top + bottom;\n    }\n    view._resizeView(viewWidth2, viewHeight2, width2, height2, [left, top], auto.resize);\n  }\n  const vtx = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    bound: Bound$1,\n    identifier: Identifier$1,\n    mark: Mark$1,\n    overlap: Overlap$1,\n    render: Render$1,\n    viewlayout: ViewLayout$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function AxisTicks$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(AxisTicks$1, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var locale2 = pulse2.dataflow.locale(), out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), ticks2 = this.value, scale2 = _.scale, tally = _.count == null ? _.values ? _.values.length : 10 : _.count, count2 = tickCount(scale2, tally, _.minstep), format2 = _.format || tickFormat(locale2, scale2, count2, _.formatSpecifier, _.formatType, !!_.values), values2 = _.values ? validTicks(scale2, _.values, count2) : tickValues(scale2, count2);\n      if (ticks2) out.rem = ticks2;\n      ticks2 = values2.map((value2, i) => ingest$1({\n        index: i / (values2.length - 1 || 1),\n        value: value2,\n        label: format2(value2)\n      }));\n      if (_.extra && ticks2.length) {\n        ticks2.push(ingest$1({\n          index: -1,\n          extra: {\n            value: ticks2[0].value\n          },\n          label: \"\"\n        }));\n      }\n      out.source = ticks2;\n      out.add = ticks2;\n      this.value = ticks2;\n      return out;\n    }\n  });\n  function DataJoin$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  function defaultItemCreate() {\n    return ingest$1({});\n  }\n  function newMap(key2) {\n    const map2 = fastmap().test((t) => t.exit);\n    map2.lookup = (t) => map2.get(key2(t));\n    return map2;\n  }\n  inherits(DataJoin$1, Transform, {\n    transform(_, pulse2) {\n      var df = pulse2.dataflow, out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), item = _.item || defaultItemCreate, key2 = _.key || tupleid, map2 = this.value;\n      if (isArray(out.encode)) {\n        out.encode = null;\n      }\n      if (map2 && (_.modified(\"key\") || pulse2.modified(key2))) {\n        error(\"DataJoin does not support modified key function or fields.\");\n      }\n      if (!map2) {\n        pulse2 = pulse2.addAll();\n        this.value = map2 = newMap(key2);\n      }\n      pulse2.visit(pulse2.ADD, (t) => {\n        const k = key2(t);\n        let x2 = map2.get(k);\n        if (x2) {\n          if (x2.exit) {\n            map2.empty--;\n            out.add.push(x2);\n          } else {\n            out.mod.push(x2);\n          }\n        } else {\n          x2 = item(t);\n          map2.set(k, x2);\n          out.add.push(x2);\n        }\n        x2.datum = t;\n        x2.exit = false;\n      });\n      pulse2.visit(pulse2.MOD, (t) => {\n        const k = key2(t), x2 = map2.get(k);\n        if (x2) {\n          x2.datum = t;\n          out.mod.push(x2);\n        }\n      });\n      pulse2.visit(pulse2.REM, (t) => {\n        const k = key2(t), x2 = map2.get(k);\n        if (t === x2.datum && !x2.exit) {\n          out.rem.push(x2);\n          x2.exit = true;\n          ++map2.empty;\n        }\n      });\n      if (pulse2.changed(pulse2.ADD_MOD)) out.modifies(\"datum\");\n      if (pulse2.clean() || _.clean && map2.empty > df.cleanThreshold) {\n        df.runAfter(map2.clean);\n      }\n      return out;\n    }\n  });\n  function Encode$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Encode$1, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ADD_REM), fmod = _.mod || false, encoders = _.encoders, encode2 = pulse2.encode;\n      if (isArray(encode2)) {\n        if (out.changed() || encode2.every((e) => encoders[e])) {\n          encode2 = encode2[0];\n          out.encode = null;\n        } else {\n          return pulse2.StopPropagation;\n        }\n      }\n      var reenter = encode2 === \"enter\", update2 = encoders.update || falsy, enter = encoders.enter || falsy, exit = encoders.exit || falsy, set2 = (encode2 && !reenter ? encoders[encode2] : update2) || falsy;\n      if (pulse2.changed(pulse2.ADD)) {\n        pulse2.visit(pulse2.ADD, (t) => {\n          enter(t, _);\n          update2(t, _);\n        });\n        out.modifies(enter.output);\n        out.modifies(update2.output);\n        if (set2 !== falsy && set2 !== update2) {\n          pulse2.visit(pulse2.ADD, (t) => {\n            set2(t, _);\n          });\n          out.modifies(set2.output);\n        }\n      }\n      if (pulse2.changed(pulse2.REM) && exit !== falsy) {\n        pulse2.visit(pulse2.REM, (t) => {\n          exit(t, _);\n        });\n        out.modifies(exit.output);\n      }\n      if (reenter || set2 !== falsy) {\n        const flag2 = pulse2.MOD | (_.modified() ? pulse2.REFLOW : 0);\n        if (reenter) {\n          pulse2.visit(flag2, (t) => {\n            const mod = enter(t, _) || fmod;\n            if (set2(t, _) || mod) out.mod.push(t);\n          });\n          if (out.mod.length) out.modifies(enter.output);\n        } else {\n          pulse2.visit(flag2, (t) => {\n            if (set2(t, _) || fmod) out.mod.push(t);\n          });\n        }\n        if (out.mod.length) out.modifies(set2.output);\n      }\n      return out.changed() ? out : pulse2.StopPropagation;\n    }\n  });\n  function LegendEntries$1(params2) {\n    Transform.call(this, [], params2);\n  }\n  inherits(LegendEntries$1, Transform, {\n    transform(_, pulse2) {\n      if (this.value != null && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var locale2 = pulse2.dataflow.locale(), out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), items = this.value, type2 = _.type || SymbolLegend, scale2 = _.scale, limit = +_.limit, count2 = tickCount(scale2, _.count == null ? 5 : _.count, _.minstep), lskip = !!_.values || type2 === SymbolLegend, format2 = _.format || labelFormat(locale2, scale2, count2, type2, _.formatSpecifier, _.formatType, lskip), values2 = _.values || labelValues(scale2, count2), domain2, fraction, size, offset2, ellipsis;\n      if (items) out.rem = items;\n      if (type2 === SymbolLegend) {\n        if (limit && values2.length > limit) {\n          pulse2.dataflow.warn(\"Symbol legend count exceeds limit, filtering items.\");\n          items = values2.slice(0, limit - 1);\n          ellipsis = true;\n        } else {\n          items = values2;\n        }\n        if (isFunction(size = _.size)) {\n          if (!_.values && scale2(items[0]) === 0) {\n            items = items.slice(1);\n          }\n          offset2 = items.reduce((max2, value2) => Math.max(max2, size(value2, _)), 0);\n        } else {\n          size = constant$4(offset2 = size || 8);\n        }\n        items = items.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, items),\n          value: value2,\n          offset: offset2,\n          size: size(value2, _)\n        }));\n        if (ellipsis) {\n          ellipsis = values2[items.length];\n          items.push(ingest$1({\n            index: items.length,\n            label: `…${values2.length - items.length} entries`,\n            value: ellipsis,\n            offset: offset2,\n            size: size(ellipsis, _)\n          }));\n        }\n      } else if (type2 === GradientLegend) {\n        domain2 = scale2.domain(), fraction = scaleFraction(scale2, domain2[0], peek$1(domain2));\n        if (values2.length < 3 && !_.values && domain2[0] !== peek$1(domain2)) {\n          values2 = [domain2[0], peek$1(domain2)];\n        }\n        items = values2.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, values2),\n          value: value2,\n          perc: fraction(value2)\n        }));\n      } else {\n        size = values2.length - 1;\n        fraction = labelFraction(scale2);\n        items = values2.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, values2),\n          value: value2,\n          perc: index2 ? fraction(value2) : 0,\n          perc2: index2 === size ? 1 : fraction(values2[index2 + 1])\n        }));\n      }\n      out.source = items;\n      out.add = items;\n      this.value = items;\n      return out;\n    }\n  });\n  const sourceX = (t) => t.source.x;\n  const sourceY = (t) => t.source.y;\n  const targetX = (t) => t.target.x;\n  const targetY = (t) => t.target.y;\n  function LinkPath(params2) {\n    Transform.call(this, {}, params2);\n  }\n  LinkPath.Definition = {\n    \"type\": \"LinkPath\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"sourceX\",\n      \"type\": \"field\",\n      \"default\": \"source.x\"\n    }, {\n      \"name\": \"sourceY\",\n      \"type\": \"field\",\n      \"default\": \"source.y\"\n    }, {\n      \"name\": \"targetX\",\n      \"type\": \"field\",\n      \"default\": \"target.x\"\n    }, {\n      \"name\": \"targetY\",\n      \"type\": \"field\",\n      \"default\": \"target.y\"\n    }, {\n      \"name\": \"orient\",\n      \"type\": \"enum\",\n      \"default\": \"vertical\",\n      \"values\": [\"horizontal\", \"vertical\", \"radial\"]\n    }, {\n      \"name\": \"shape\",\n      \"type\": \"enum\",\n      \"default\": \"line\",\n      \"values\": [\"line\", \"arc\", \"curve\", \"diagonal\", \"orthogonal\"]\n    }, {\n      \"name\": \"require\",\n      \"type\": \"signal\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  inherits(LinkPath, Transform, {\n    transform(_, pulse2) {\n      var sx = _.sourceX || sourceX, sy = _.sourceY || sourceY, tx2 = _.targetX || targetX, ty2 = _.targetY || targetY, as = _.as || \"path\", orient = _.orient || \"vertical\", shape2 = _.shape || \"line\", path2 = Paths.get(shape2 + \"-\" + orient) || Paths.get(shape2);\n      if (!path2) {\n        error(\"LinkPath unsupported type: \" + _.shape + (_.orient ? \"-\" + _.orient : \"\"));\n      }\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        t[as] = path2(sx(t), sy(t), tx2(t), ty2(t));\n      });\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  const line = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"L\" + tx2 + \",\" + ty2;\n  const lineR = (sa2, sr, ta, tr2) => line(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const arc = (sx, sy, tx2, ty2) => {\n    var dx = tx2 - sx, dy = ty2 - sy, rr = Math.hypot(dx, dy) / 2, ra = 180 * Math.atan2(dy, dx) / Math.PI;\n    return \"M\" + sx + \",\" + sy + \"A\" + rr + \",\" + rr + \" \" + ra + \" 0 1 \" + tx2 + \",\" + ty2;\n  };\n  const arcR = (sa2, sr, ta, tr2) => arc(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const curve = (sx, sy, tx2, ty2) => {\n    const dx = tx2 - sx, dy = ty2 - sy, ix = 0.2 * (dx + dy), iy = 0.2 * (dy - dx);\n    return \"M\" + sx + \",\" + sy + \"C\" + (sx + ix) + \",\" + (sy + iy) + \" \" + (tx2 + iy) + \",\" + (ty2 - ix) + \" \" + tx2 + \",\" + ty2;\n  };\n  const curveR = (sa2, sr, ta, tr2) => curve(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const orthoX = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"V\" + ty2 + \"H\" + tx2;\n  const orthoY = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"H\" + tx2 + \"V\" + ty2;\n  const orthoR = (sa2, sr, ta, tr2) => {\n    const sc = Math.cos(sa2), ss = Math.sin(sa2), tc = Math.cos(ta), ts2 = Math.sin(ta), sf = Math.abs(ta - sa2) > Math.PI ? ta <= sa2 : ta > sa2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"A\" + sr + \",\" + sr + \" 0 0,\" + (sf ? 1 : 0) + \" \" + sr * tc + \",\" + sr * ts2 + \"L\" + tr2 * tc + \",\" + tr2 * ts2;\n  };\n  const diagonalX = (sx, sy, tx2, ty2) => {\n    const m2 = (sx + tx2) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + m2 + \",\" + sy + \" \" + m2 + \",\" + ty2 + \" \" + tx2 + \",\" + ty2;\n  };\n  const diagonalY = (sx, sy, tx2, ty2) => {\n    const m2 = (sy + ty2) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + sx + \",\" + m2 + \" \" + tx2 + \",\" + m2 + \" \" + tx2 + \",\" + ty2;\n  };\n  const diagonalR = (sa2, sr, ta, tr2) => {\n    const sc = Math.cos(sa2), ss = Math.sin(sa2), tc = Math.cos(ta), ts2 = Math.sin(ta), mr = (sr + tr2) / 2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"C\" + mr * sc + \",\" + mr * ss + \" \" + mr * tc + \",\" + mr * ts2 + \" \" + tr2 * tc + \",\" + tr2 * ts2;\n  };\n  const Paths = fastmap({\n    \"line\": line,\n    \"line-radial\": lineR,\n    \"arc\": arc,\n    \"arc-radial\": arcR,\n    \"curve\": curve,\n    \"curve-radial\": curveR,\n    \"orthogonal-horizontal\": orthoX,\n    \"orthogonal-vertical\": orthoY,\n    \"orthogonal-radial\": orthoR,\n    \"diagonal-horizontal\": diagonalX,\n    \"diagonal-vertical\": diagonalY,\n    \"diagonal-radial\": diagonalR\n  });\n  function Pie(params2) {\n    Transform.call(this, null, params2);\n  }\n  Pie.Definition = {\n    \"type\": \"Pie\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"startAngle\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"endAngle\",\n      \"type\": \"number\",\n      \"default\": 6.283185307179586\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"startAngle\", \"endAngle\"]\n    }]\n  };\n  inherits(Pie, Transform, {\n    transform(_, pulse2) {\n      var as = _.as || [\"startAngle\", \"endAngle\"], startAngle = as[0], endAngle = as[1], field2 = _.field || one$1, start = _.startAngle || 0, stop2 = _.endAngle != null ? _.endAngle : 2 * Math.PI, data2 = pulse2.source, values2 = data2.map(field2), n = values2.length, a2 = start, k = (stop2 - start) / sum$1(values2), index2 = range$3(n), i, t, v;\n      if (_.sort) {\n        index2.sort((a3, b2) => values2[a3] - values2[b2]);\n      }\n      for (i = 0; i < n; ++i) {\n        v = values2[index2[i]];\n        t = data2[index2[i]];\n        t[startAngle] = a2;\n        t[endAngle] = a2 += v * k;\n      }\n      this.value = values2;\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  const DEFAULT_COUNT = 5;\n  function includeZero(scale2) {\n    const type2 = scale2.type;\n    return !scale2.bins && (type2 === Linear || type2 === Pow || type2 === Sqrt);\n  }\n  function includePad(type2) {\n    return isContinuous(type2) && type2 !== Sequential;\n  }\n  const SKIP$1 = toSet([\"set\", \"modified\", \"clear\", \"type\", \"scheme\", \"schemeExtent\", \"schemeCount\", \"domain\", \"domainMin\", \"domainMid\", \"domainMax\", \"domainRaw\", \"domainImplicit\", \"nice\", \"zero\", \"bins\", \"range\", \"rangeStep\", \"round\", \"reverse\", \"interpolate\", \"interpolateGamma\"]);\n  function Scale$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Scale$1, Transform, {\n    transform(_, pulse2) {\n      var df = pulse2.dataflow, scale$12 = this.value, key2 = scaleKey(_);\n      if (!scale$12 || key2 !== scale$12.type) {\n        this.value = scale$12 = scale$4(key2)();\n      }\n      for (key2 in _) if (!SKIP$1[key2]) {\n        if (key2 === \"padding\" && includePad(scale$12.type)) continue;\n        isFunction(scale$12[key2]) ? scale$12[key2](_[key2]) : df.warn(\"Unsupported scale property: \" + key2);\n      }\n      configureRange(scale$12, _, configureBins(scale$12, _, configureDomain(scale$12, _, df)));\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function scaleKey(_) {\n    var t = _.type, d2 = \"\", n;\n    if (t === Sequential) return Sequential + \"-\" + Linear;\n    if (isContinuousColor(_)) {\n      n = _.rawDomain ? _.rawDomain.length : _.domain ? _.domain.length + +(_.domainMid != null) : 0;\n      d2 = n === 2 ? Sequential + \"-\" : n === 3 ? Diverging + \"-\" : \"\";\n    }\n    return (d2 + t || Linear).toLowerCase();\n  }\n  function isContinuousColor(_) {\n    const t = _.type;\n    return isContinuous(t) && t !== Time && t !== UTC && (_.scheme || _.range && _.range.length && _.range.every(isString));\n  }\n  function configureDomain(scale2, _, df) {\n    const raw = rawDomain(scale2, _.domainRaw, df);\n    if (raw > -1) return raw;\n    var domain2 = _.domain, type2 = scale2.type, zero2 = _.zero || _.zero === void 0 && includeZero(scale2), n, mid;\n    if (!domain2) return 0;\n    if (zero2 || _.domainMin != null || _.domainMax != null || _.domainMid != null) {\n      n = (domain2 = domain2.slice()).length - 1 || 1;\n      if (zero2) {\n        if (domain2[0] > 0) domain2[0] = 0;\n        if (domain2[n] < 0) domain2[n] = 0;\n      }\n      if (_.domainMin != null) domain2[0] = _.domainMin;\n      if (_.domainMax != null) domain2[n] = _.domainMax;\n      if (_.domainMid != null) {\n        mid = _.domainMid;\n        const i = mid > domain2[n] ? n + 1 : mid < domain2[0] ? 0 : n;\n        if (i !== n) df.warn(\"Scale domainMid exceeds domain min or max.\", mid);\n        domain2.splice(i, 0, mid);\n      }\n    }\n    if (includePad(type2) && _.padding && domain2[0] !== peek$1(domain2)) {\n      domain2 = padDomain(type2, domain2, _.range, _.padding, _.exponent, _.constant);\n    }\n    scale2.domain(domainCheck(type2, domain2, df));\n    if (type2 === Ordinal) {\n      scale2.unknown(_.domainImplicit ? implicit : void 0);\n    }\n    if (_.nice && scale2.nice) {\n      scale2.nice(_.nice !== true && tickCount(scale2, _.nice) || null);\n    }\n    return domain2.length;\n  }\n  function rawDomain(scale2, raw, df) {\n    if (raw) {\n      scale2.domain(domainCheck(scale2.type, raw, df));\n      return raw.length;\n    } else {\n      return -1;\n    }\n  }\n  function padDomain(type2, domain2, range2, pad2, exponent2, constant2) {\n    var span2 = Math.abs(peek$1(range2) - range2[0]), frac = span2 / (span2 - 2 * pad2), d2 = type2 === Log ? zoomLog(domain2, null, frac) : type2 === Sqrt ? zoomPow(domain2, null, frac, 0.5) : type2 === Pow ? zoomPow(domain2, null, frac, exponent2 || 1) : type2 === Symlog ? zoomSymlog(domain2, null, frac, constant2 || 1) : zoomLinear(domain2, null, frac);\n    domain2 = domain2.slice();\n    domain2[0] = d2[0];\n    domain2[domain2.length - 1] = d2[1];\n    return domain2;\n  }\n  function domainCheck(type2, domain2, df) {\n    if (isLogarithmic(type2)) {\n      var s2 = Math.abs(domain2.reduce((s3, v) => s3 + (v < 0 ? -1 : v > 0 ? 1 : 0), 0));\n      if (s2 !== domain2.length) {\n        df.warn(\"Log scale domain includes zero: \" + $(domain2));\n      }\n    }\n    return domain2;\n  }\n  function configureBins(scale2, _, count2) {\n    let bins = _.bins;\n    if (bins && !isArray(bins)) {\n      const domain2 = scale2.domain(), lo = domain2[0], hi = peek$1(domain2), step = bins.step;\n      let start = bins.start == null ? lo : bins.start, stop2 = bins.stop == null ? hi : bins.stop;\n      if (!step) error(\"Scale bins parameter missing step property.\");\n      if (start < lo) start = step * Math.ceil(lo / step);\n      if (stop2 > hi) stop2 = step * Math.floor(hi / step);\n      bins = range$3(start, stop2 + step / 2, step);\n    }\n    if (bins) {\n      scale2.bins = bins;\n    } else if (scale2.bins) {\n      delete scale2.bins;\n    }\n    if (scale2.type === BinOrdinal) {\n      if (!bins) {\n        scale2.bins = scale2.domain();\n      } else if (!_.domain && !_.domainRaw) {\n        scale2.domain(bins);\n        count2 = bins.length;\n      }\n    }\n    return count2;\n  }\n  function configureRange(scale2, _, count2) {\n    var type2 = scale2.type, round = _.round || false, range2 = _.range;\n    if (_.rangeStep != null) {\n      range2 = configureRangeStep(type2, _, count2);\n    } else if (_.scheme) {\n      range2 = configureScheme(type2, _, count2);\n      if (isFunction(range2)) {\n        if (scale2.interpolator) {\n          return scale2.interpolator(range2);\n        } else {\n          error(`Scale type ${type2} does not support interpolating color schemes.`);\n        }\n      }\n    }\n    if (range2 && isInterpolating(type2)) {\n      return scale2.interpolator(interpolateColors(flip(range2, _.reverse), _.interpolate, _.interpolateGamma));\n    }\n    if (range2 && _.interpolate && scale2.interpolate) {\n      scale2.interpolate(interpolate(_.interpolate, _.interpolateGamma));\n    } else if (isFunction(scale2.round)) {\n      scale2.round(round);\n    } else if (isFunction(scale2.rangeRound)) {\n      scale2.interpolate(round ? interpolateRound : interpolate$1);\n    }\n    if (range2) scale2.range(flip(range2, _.reverse));\n  }\n  function configureRangeStep(type2, _, count2) {\n    if (type2 !== Band && type2 !== Point) {\n      error(\"Only band and point scales support rangeStep.\");\n    }\n    var outer = (_.paddingOuter != null ? _.paddingOuter : _.padding) || 0, inner = type2 === Point ? 1 : (_.paddingInner != null ? _.paddingInner : _.padding) || 0;\n    return [0, _.rangeStep * bandSpace(count2, inner, outer)];\n  }\n  function configureScheme(type2, _, count2) {\n    var extent2 = _.schemeExtent, name, scheme$1;\n    if (isArray(_.scheme)) {\n      scheme$1 = interpolateColors(_.scheme, _.interpolate, _.interpolateGamma);\n    } else {\n      name = _.scheme.toLowerCase();\n      scheme$1 = scheme(name);\n      if (!scheme$1) error(`Unrecognized scheme name: ${_.scheme}`);\n    }\n    count2 = type2 === Threshold ? count2 + 1 : type2 === BinOrdinal ? count2 - 1 : type2 === Quantile || type2 === Quantize ? +_.schemeCount || DEFAULT_COUNT : count2;\n    return isInterpolating(type2) ? adjustScheme(scheme$1, extent2, _.reverse) : isFunction(scheme$1) ? quantizeInterpolator(adjustScheme(scheme$1, extent2), count2) : type2 === Ordinal ? scheme$1 : scheme$1.slice(0, count2);\n  }\n  function adjustScheme(scheme2, extent2, reverse2) {\n    return isFunction(scheme2) && (extent2 || reverse2) ? interpolateRange(scheme2, flip(extent2 || [0, 1], reverse2)) : scheme2;\n  }\n  function flip(array2, reverse2) {\n    return reverse2 ? array2.slice().reverse() : array2;\n  }\n  function SortItems$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(SortItems$1, Transform, {\n    transform(_, pulse2) {\n      const mod = _.modified(\"sort\") || pulse2.changed(pulse2.ADD) || pulse2.modified(_.sort.fields) || pulse2.modified(\"datum\");\n      if (mod) pulse2.source.sort(stableCompare(_.sort));\n      this.modified(mod);\n      return pulse2;\n    }\n  });\n  const Zero = \"zero\", Center$1 = \"center\", Normalize = \"normalize\", DefOutput = [\"y0\", \"y1\"];\n  function Stack(params2) {\n    Transform.call(this, null, params2);\n  }\n  Stack.Definition = {\n    \"type\": \"Stack\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"offset\",\n      \"type\": \"enum\",\n      \"default\": Zero,\n      \"values\": [Zero, Center$1, Normalize]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": DefOutput\n    }]\n  };\n  inherits(Stack, Transform, {\n    transform(_, pulse2) {\n      var as = _.as || DefOutput, y02 = as[0], y12 = as[1], sort2 = stableCompare(_.sort), field2 = _.field || one$1, stack = _.offset === Center$1 ? stackCenter : _.offset === Normalize ? stackNormalize : stackZero, groups, i, n, max2;\n      groups = partition$3(pulse2.source, _.groupby, sort2, field2);\n      for (i = 0, n = groups.length, max2 = groups.max; i < n; ++i) {\n        stack(groups[i], max2, field2, y02, y12);\n      }\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  function stackCenter(group2, max2, field2, y02, y12) {\n    var last = (max2 - group2.sum) / 2, m2 = group2.length, j = 0, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      t[y02] = last;\n      t[y12] = last += Math.abs(field2(t));\n    }\n  }\n  function stackNormalize(group2, max2, field2, y02, y12) {\n    var scale2 = 1 / group2.sum, last = 0, m2 = group2.length, j = 0, v = 0, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      t[y02] = last;\n      t[y12] = last = scale2 * (v += Math.abs(field2(t)));\n    }\n  }\n  function stackZero(group2, max2, field2, y02, y12) {\n    var lastPos = 0, lastNeg = 0, m2 = group2.length, j = 0, v, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      v = +field2(t);\n      if (v < 0) {\n        t[y02] = lastNeg;\n        t[y12] = lastNeg += v;\n      } else {\n        t[y02] = lastPos;\n        t[y12] = lastPos += v;\n      }\n    }\n  }\n  function partition$3(data2, groupby, sort2, field2) {\n    var groups = [], get2 = (f) => f(t), map2, i, n, m2, t, k, g, s2, max2;\n    if (groupby == null) {\n      groups.push(data2.slice());\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    for (k = 0, max2 = 0, m2 = groups.length; k < m2; ++k) {\n      g = groups[k];\n      for (i = 0, s2 = 0, n = g.length; i < n; ++i) {\n        s2 += Math.abs(field2(g[i]));\n      }\n      g.sum = s2;\n      if (s2 > max2) max2 = s2;\n      if (sort2) g.sort(sort2);\n    }\n    groups.max = max2;\n    return groups;\n  }\n  const encode$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    axisticks: AxisTicks$1,\n    datajoin: DataJoin$1,\n    encode: Encode$1,\n    legendentries: LegendEntries$1,\n    linkpath: LinkPath,\n    pie: Pie,\n    scale: Scale$1,\n    sortitems: SortItems$1,\n    stack: Stack\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var epsilon$3 = 1e-6;\n  var epsilon2 = 1e-12;\n  var pi$1 = Math.PI;\n  var halfPi$1 = pi$1 / 2;\n  var quarterPi = pi$1 / 4;\n  var tau$1 = pi$1 * 2;\n  var degrees = 180 / pi$1;\n  var radians = pi$1 / 180;\n  var abs$1 = Math.abs;\n  var atan = Math.atan;\n  var atan2 = Math.atan2;\n  var cos$1 = Math.cos;\n  var ceil = Math.ceil;\n  var exp = Math.exp;\n  var hypot = Math.hypot;\n  var log$1 = Math.log;\n  var pow$1 = Math.pow;\n  var sin$1 = Math.sin;\n  var sign = Math.sign || function(x2) {\n    return x2 > 0 ? 1 : x2 < 0 ? -1 : 0;\n  };\n  var sqrt$1 = Math.sqrt;\n  var tan = Math.tan;\n  function acos(x2) {\n    return x2 > 1 ? 0 : x2 < -1 ? pi$1 : Math.acos(x2);\n  }\n  function asin$1(x2) {\n    return x2 > 1 ? halfPi$1 : x2 < -1 ? -halfPi$1 : Math.asin(x2);\n  }\n  function noop$2() {\n  }\n  function streamGeometry(geometry, stream2) {\n    if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n      streamGeometryType[geometry.type](geometry, stream2);\n    }\n  }\n  var streamObjectType = {\n    Feature: function(object2, stream2) {\n      streamGeometry(object2.geometry, stream2);\n    },\n    FeatureCollection: function(object2, stream2) {\n      var features = object2.features, i = -1, n = features.length;\n      while (++i < n) streamGeometry(features[i].geometry, stream2);\n    }\n  };\n  var streamGeometryType = {\n    Sphere: function(object2, stream2) {\n      stream2.sphere();\n    },\n    Point: function(object2, stream2) {\n      object2 = object2.coordinates;\n      stream2.point(object2[0], object2[1], object2[2]);\n    },\n    MultiPoint: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object2 = coordinates[i], stream2.point(object2[0], object2[1], object2[2]);\n    },\n    LineString: function(object2, stream2) {\n      streamLine(object2.coordinates, stream2, 0);\n    },\n    MultiLineString: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) streamLine(coordinates[i], stream2, 0);\n    },\n    Polygon: function(object2, stream2) {\n      streamPolygon(object2.coordinates, stream2);\n    },\n    MultiPolygon: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) streamPolygon(coordinates[i], stream2);\n    },\n    GeometryCollection: function(object2, stream2) {\n      var geometries = object2.geometries, i = -1, n = geometries.length;\n      while (++i < n) streamGeometry(geometries[i], stream2);\n    }\n  };\n  function streamLine(coordinates, stream2, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    stream2.lineStart();\n    while (++i < n) coordinate = coordinates[i], stream2.point(coordinate[0], coordinate[1], coordinate[2]);\n    stream2.lineEnd();\n  }\n  function streamPolygon(coordinates, stream2) {\n    var i = -1, n = coordinates.length;\n    stream2.polygonStart();\n    while (++i < n) streamLine(coordinates[i], stream2, 1);\n    stream2.polygonEnd();\n  }\n  function geoStream(object2, stream2) {\n    if (object2 && streamObjectType.hasOwnProperty(object2.type)) {\n      streamObjectType[object2.type](object2, stream2);\n    } else {\n      streamGeometry(object2, stream2);\n    }\n  }\n  var areaRingSum$1 = new Adder();\n  var areaSum$1 = new Adder(), lambda00$2, phi00$2, lambda0$1, cosPhi0, sinPhi0;\n  var areaStream$1 = {\n    point: noop$2,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: function() {\n      areaRingSum$1 = new Adder();\n      areaStream$1.lineStart = areaRingStart$1;\n      areaStream$1.lineEnd = areaRingEnd$1;\n    },\n    polygonEnd: function() {\n      var areaRing = +areaRingSum$1;\n      areaSum$1.add(areaRing < 0 ? tau$1 + areaRing : areaRing);\n      this.lineStart = this.lineEnd = this.point = noop$2;\n    },\n    sphere: function() {\n      areaSum$1.add(tau$1);\n    }\n  };\n  function areaRingStart$1() {\n    areaStream$1.point = areaPointFirst$1;\n  }\n  function areaRingEnd$1() {\n    areaPoint$1(lambda00$2, phi00$2);\n  }\n  function areaPointFirst$1(lambda, phi2) {\n    areaStream$1.point = areaPoint$1;\n    lambda00$2 = lambda, phi00$2 = phi2;\n    lambda *= radians, phi2 *= radians;\n    lambda0$1 = lambda, cosPhi0 = cos$1(phi2 = phi2 / 2 + quarterPi), sinPhi0 = sin$1(phi2);\n  }\n  function areaPoint$1(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    phi2 = phi2 / 2 + quarterPi;\n    var dLambda = lambda - lambda0$1, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos$1(phi2), sinPhi = sin$1(phi2), k = sinPhi0 * sinPhi, u2 = cosPhi0 * cosPhi + k * cos$1(adLambda), v = k * sdLambda * sin$1(adLambda);\n    areaRingSum$1.add(atan2(v, u2));\n    lambda0$1 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n  }\n  function geoArea$1(object2) {\n    areaSum$1 = new Adder();\n    geoStream(object2, areaStream$1);\n    return areaSum$1 * 2;\n  }\n  function spherical(cartesian2) {\n    return [atan2(cartesian2[1], cartesian2[0]), asin$1(cartesian2[2])];\n  }\n  function cartesian(spherical2) {\n    var lambda = spherical2[0], phi2 = spherical2[1], cosPhi = cos$1(phi2);\n    return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi2)];\n  }\n  function cartesianDot(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];\n  }\n  function cartesianCross(a2, b2) {\n    return [a2[1] * b2[2] - a2[2] * b2[1], a2[2] * b2[0] - a2[0] * b2[2], a2[0] * b2[1] - a2[1] * b2[0]];\n  }\n  function cartesianAddInPlace(a2, b2) {\n    a2[0] += b2[0], a2[1] += b2[1], a2[2] += b2[2];\n  }\n  function cartesianScale(vector, k) {\n    return [vector[0] * k, vector[1] * k, vector[2] * k];\n  }\n  function cartesianNormalizeInPlace(d2) {\n    var l = sqrt$1(d2[0] * d2[0] + d2[1] * d2[1] + d2[2] * d2[2]);\n    d2[0] /= l, d2[1] /= l, d2[2] /= l;\n  }\n  var lambda0, phi0, lambda1, phi1, lambda2, lambda00$1, phi00$1, p0, deltaSum, ranges, range$2;\n  var boundsStream$1 = {\n    point: boundsPoint$1,\n    lineStart: boundsLineStart,\n    lineEnd: boundsLineEnd,\n    polygonStart: function() {\n      boundsStream$1.point = boundsRingPoint;\n      boundsStream$1.lineStart = boundsRingStart;\n      boundsStream$1.lineEnd = boundsRingEnd;\n      deltaSum = new Adder();\n      areaStream$1.polygonStart();\n    },\n    polygonEnd: function() {\n      areaStream$1.polygonEnd();\n      boundsStream$1.point = boundsPoint$1;\n      boundsStream$1.lineStart = boundsLineStart;\n      boundsStream$1.lineEnd = boundsLineEnd;\n      if (areaRingSum$1 < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n      else if (deltaSum > epsilon$3) phi1 = 90;\n      else if (deltaSum < -epsilon$3) phi0 = -90;\n      range$2[0] = lambda0, range$2[1] = lambda1;\n    },\n    sphere: function() {\n      lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n    }\n  };\n  function boundsPoint$1(lambda, phi2) {\n    ranges.push(range$2 = [lambda0 = lambda, lambda1 = lambda]);\n    if (phi2 < phi0) phi0 = phi2;\n    if (phi2 > phi1) phi1 = phi2;\n  }\n  function linePoint(lambda, phi2) {\n    var p = cartesian([lambda * radians, phi2 * radians]);\n    if (p0) {\n      var normal = cartesianCross(p0, p), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal);\n      cartesianNormalizeInPlace(inflection);\n      inflection = spherical(inflection);\n      var delta = lambda - lambda2, sign2 = delta > 0 ? 1 : -1, lambdai = inflection[0] * degrees * sign2, phii, antimeridian = abs$1(delta) > 180;\n      if (antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {\n        phii = inflection[1] * degrees;\n        if (phii > phi1) phi1 = phii;\n      } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {\n        phii = -inflection[1] * degrees;\n        if (phii < phi0) phi0 = phii;\n      } else {\n        if (phi2 < phi0) phi0 = phi2;\n        if (phi2 > phi1) phi1 = phi2;\n      }\n      if (antimeridian) {\n        if (lambda < lambda2) {\n          if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n        } else {\n          if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        }\n      } else {\n        if (lambda1 >= lambda0) {\n          if (lambda < lambda0) lambda0 = lambda;\n          if (lambda > lambda1) lambda1 = lambda;\n        } else {\n          if (lambda > lambda2) {\n            if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n          } else {\n            if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n          }\n        }\n      }\n    } else {\n      ranges.push(range$2 = [lambda0 = lambda, lambda1 = lambda]);\n    }\n    if (phi2 < phi0) phi0 = phi2;\n    if (phi2 > phi1) phi1 = phi2;\n    p0 = p, lambda2 = lambda;\n  }\n  function boundsLineStart() {\n    boundsStream$1.point = linePoint;\n  }\n  function boundsLineEnd() {\n    range$2[0] = lambda0, range$2[1] = lambda1;\n    boundsStream$1.point = boundsPoint$1;\n    p0 = null;\n  }\n  function boundsRingPoint(lambda, phi2) {\n    if (p0) {\n      var delta = lambda - lambda2;\n      deltaSum.add(abs$1(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n    } else {\n      lambda00$1 = lambda, phi00$1 = phi2;\n    }\n    areaStream$1.point(lambda, phi2);\n    linePoint(lambda, phi2);\n  }\n  function boundsRingStart() {\n    areaStream$1.lineStart();\n  }\n  function boundsRingEnd() {\n    boundsRingPoint(lambda00$1, phi00$1);\n    areaStream$1.lineEnd();\n    if (abs$1(deltaSum) > epsilon$3) lambda0 = -(lambda1 = 180);\n    range$2[0] = lambda0, range$2[1] = lambda1;\n    p0 = null;\n  }\n  function angle(lambda02, lambda12) {\n    return (lambda12 -= lambda02) < 0 ? lambda12 + 360 : lambda12;\n  }\n  function rangeCompare(a2, b2) {\n    return a2[0] - b2[0];\n  }\n  function rangeContains(range2, x2) {\n    return range2[0] <= range2[1] ? range2[0] <= x2 && x2 <= range2[1] : x2 < range2[0] || range2[1] < x2;\n  }\n  function geoBounds$1(feature2) {\n    var i, n, a2, b2, merged, deltaMax, delta;\n    phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n    ranges = [];\n    geoStream(feature2, boundsStream$1);\n    if (n = ranges.length) {\n      ranges.sort(rangeCompare);\n      for (i = 1, a2 = ranges[0], merged = [a2]; i < n; ++i) {\n        b2 = ranges[i];\n        if (rangeContains(a2, b2[0]) || rangeContains(a2, b2[1])) {\n          if (angle(a2[0], b2[1]) > angle(a2[0], a2[1])) a2[1] = b2[1];\n          if (angle(b2[0], a2[1]) > angle(a2[0], a2[1])) a2[0] = b2[0];\n        } else {\n          merged.push(a2 = b2);\n        }\n      }\n      for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a2 = merged[n]; i <= n; a2 = b2, ++i) {\n        b2 = merged[i];\n        if ((delta = angle(a2[1], b2[0])) > deltaMax) deltaMax = delta, lambda0 = b2[0], lambda1 = a2[1];\n      }\n    }\n    ranges = range$2 = null;\n    return lambda0 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0, phi0], [lambda1, phi1]];\n  }\n  var W0, W1, X0$1, Y0$1, Z0$1, X1$1, Y1$1, Z1$1, X2$1, Y2$1, Z2$1, lambda00, phi00, x0$4, y0$4, z0;\n  var centroidStream$1 = {\n    sphere: noop$2,\n    point: centroidPoint$1,\n    lineStart: centroidLineStart$1,\n    lineEnd: centroidLineEnd$1,\n    polygonStart: function() {\n      centroidStream$1.lineStart = centroidRingStart$1;\n      centroidStream$1.lineEnd = centroidRingEnd$1;\n    },\n    polygonEnd: function() {\n      centroidStream$1.lineStart = centroidLineStart$1;\n      centroidStream$1.lineEnd = centroidLineEnd$1;\n    }\n  };\n  function centroidPoint$1(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2);\n    centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi2));\n  }\n  function centroidPointCartesian(x2, y2, z2) {\n    ++W0;\n    X0$1 += (x2 - X0$1) / W0;\n    Y0$1 += (y2 - Y0$1) / W0;\n    Z0$1 += (z2 - Z0$1) / W0;\n  }\n  function centroidLineStart$1() {\n    centroidStream$1.point = centroidLinePointFirst;\n  }\n  function centroidLinePointFirst(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2);\n    x0$4 = cosPhi * cos$1(lambda);\n    y0$4 = cosPhi * sin$1(lambda);\n    z0 = sin$1(phi2);\n    centroidStream$1.point = centroidLinePoint;\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidLinePoint(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2), x2 = cosPhi * cos$1(lambda), y2 = cosPhi * sin$1(lambda), z2 = sin$1(phi2), w2 = atan2(sqrt$1((w2 = y0$4 * z2 - z0 * y2) * w2 + (w2 = z0 * x2 - x0$4 * z2) * w2 + (w2 = x0$4 * y2 - y0$4 * x2) * w2), x0$4 * x2 + y0$4 * y2 + z0 * z2);\n    W1 += w2;\n    X1$1 += w2 * (x0$4 + (x0$4 = x2));\n    Y1$1 += w2 * (y0$4 + (y0$4 = y2));\n    Z1$1 += w2 * (z0 + (z0 = z2));\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidLineEnd$1() {\n    centroidStream$1.point = centroidPoint$1;\n  }\n  function centroidRingStart$1() {\n    centroidStream$1.point = centroidRingPointFirst;\n  }\n  function centroidRingEnd$1() {\n    centroidRingPoint(lambda00, phi00);\n    centroidStream$1.point = centroidPoint$1;\n  }\n  function centroidRingPointFirst(lambda, phi2) {\n    lambda00 = lambda, phi00 = phi2;\n    lambda *= radians, phi2 *= radians;\n    centroidStream$1.point = centroidRingPoint;\n    var cosPhi = cos$1(phi2);\n    x0$4 = cosPhi * cos$1(lambda);\n    y0$4 = cosPhi * sin$1(lambda);\n    z0 = sin$1(phi2);\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidRingPoint(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2), x2 = cosPhi * cos$1(lambda), y2 = cosPhi * sin$1(lambda), z2 = sin$1(phi2), cx = y0$4 * z2 - z0 * y2, cy = z0 * x2 - x0$4 * z2, cz = x0$4 * y2 - y0$4 * x2, m2 = hypot(cx, cy, cz), w2 = asin$1(m2), v = m2 && -w2 / m2;\n    X2$1.add(v * cx);\n    Y2$1.add(v * cy);\n    Z2$1.add(v * cz);\n    W1 += w2;\n    X1$1 += w2 * (x0$4 + (x0$4 = x2));\n    Y1$1 += w2 * (y0$4 + (y0$4 = y2));\n    Z1$1 += w2 * (z0 + (z0 = z2));\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function geoCentroid$1(object2) {\n    W0 = W1 = X0$1 = Y0$1 = Z0$1 = X1$1 = Y1$1 = Z1$1 = 0;\n    X2$1 = new Adder();\n    Y2$1 = new Adder();\n    Z2$1 = new Adder();\n    geoStream(object2, centroidStream$1);\n    var x2 = +X2$1, y2 = +Y2$1, z2 = +Z2$1, m2 = hypot(x2, y2, z2);\n    if (m2 < epsilon2) {\n      x2 = X1$1, y2 = Y1$1, z2 = Z1$1;\n      if (W1 < epsilon$3) x2 = X0$1, y2 = Y0$1, z2 = Z0$1;\n      m2 = hypot(x2, y2, z2);\n      if (m2 < epsilon2) return [NaN, NaN];\n    }\n    return [atan2(y2, x2) * degrees, asin$1(z2 / m2) * degrees];\n  }\n  function compose(a2, b2) {\n    function compose2(x2, y2) {\n      return x2 = a2(x2, y2), b2(x2[0], x2[1]);\n    }\n    if (a2.invert && b2.invert) compose2.invert = function(x2, y2) {\n      return x2 = b2.invert(x2, y2), x2 && a2.invert(x2[0], x2[1]);\n    };\n    return compose2;\n  }\n  function rotationIdentity(lambda, phi2) {\n    if (abs$1(lambda) > pi$1) lambda -= Math.round(lambda / tau$1) * tau$1;\n    return [lambda, phi2];\n  }\n  rotationIdentity.invert = rotationIdentity;\n  function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n    return (deltaLambda %= tau$1) ? deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;\n  }\n  function forwardRotationLambda(deltaLambda) {\n    return function(lambda, phi2) {\n      lambda += deltaLambda;\n      if (abs$1(lambda) > pi$1) lambda -= Math.round(lambda / tau$1) * tau$1;\n      return [lambda, phi2];\n    };\n  }\n  function rotationLambda(deltaLambda) {\n    var rotation2 = forwardRotationLambda(deltaLambda);\n    rotation2.invert = forwardRotationLambda(-deltaLambda);\n    return rotation2;\n  }\n  function rotationPhiGamma(deltaPhi, deltaGamma) {\n    var cosDeltaPhi = cos$1(deltaPhi), sinDeltaPhi = sin$1(deltaPhi), cosDeltaGamma = cos$1(deltaGamma), sinDeltaGamma = sin$1(deltaGamma);\n    function rotation2(lambda, phi2) {\n      var cosPhi = cos$1(phi2), x2 = cos$1(lambda) * cosPhi, y2 = sin$1(lambda) * cosPhi, z2 = sin$1(phi2), k = z2 * cosDeltaPhi + x2 * sinDeltaPhi;\n      return [\n        atan2(y2 * cosDeltaGamma - k * sinDeltaGamma, x2 * cosDeltaPhi - z2 * sinDeltaPhi),\n        asin$1(k * cosDeltaGamma + y2 * sinDeltaGamma)\n      ];\n    }\n    rotation2.invert = function(lambda, phi2) {\n      var cosPhi = cos$1(phi2), x2 = cos$1(lambda) * cosPhi, y2 = sin$1(lambda) * cosPhi, z2 = sin$1(phi2), k = z2 * cosDeltaGamma - y2 * sinDeltaGamma;\n      return [\n        atan2(y2 * cosDeltaGamma + z2 * sinDeltaGamma, x2 * cosDeltaPhi + k * sinDeltaPhi),\n        asin$1(k * cosDeltaPhi - x2 * sinDeltaPhi)\n      ];\n    };\n    return rotation2;\n  }\n  function rotation(rotate2) {\n    rotate2 = rotateRadians(rotate2[0] * radians, rotate2[1] * radians, rotate2.length > 2 ? rotate2[2] * radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate2(coordinates[0] * radians, coordinates[1] * radians);\n      return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate2.invert(coordinates[0] * radians, coordinates[1] * radians);\n      return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n    };\n    return forward;\n  }\n  function circleStream(stream2, radius2, delta, direction, t02, t12) {\n    if (!delta) return;\n    var cosRadius = cos$1(radius2), sinRadius = sin$1(radius2), step = direction * delta;\n    if (t02 == null) {\n      t02 = radius2 + direction * tau$1;\n      t12 = radius2 - step / 2;\n    } else {\n      t02 = circleRadius(cosRadius, t02);\n      t12 = circleRadius(cosRadius, t12);\n      if (direction > 0 ? t02 < t12 : t02 > t12) t02 += direction * tau$1;\n    }\n    for (var point2, t = t02; direction > 0 ? t > t12 : t < t12; t -= step) {\n      point2 = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);\n      stream2.point(point2[0], point2[1]);\n    }\n  }\n  function circleRadius(cosRadius, point2) {\n    point2 = cartesian(point2), point2[0] -= cosRadius;\n    cartesianNormalizeInPlace(point2);\n    var radius2 = acos(-point2[1]);\n    return ((-point2[2] < 0 ? -radius2 : radius2) + tau$1 - epsilon$3) % tau$1;\n  }\n  function clipBuffer() {\n    var lines = [], line2;\n    return {\n      point: function(x2, y2, m2) {\n        line2.push([x2, y2, m2]);\n      },\n      lineStart: function() {\n        lines.push(line2 = []);\n      },\n      lineEnd: noop$2,\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      },\n      result: function() {\n        var result = lines;\n        lines = [];\n        line2 = null;\n        return result;\n      }\n    };\n  }\n  function pointEqual(a2, b2) {\n    return abs$1(a2[0] - b2[0]) < epsilon$3 && abs$1(a2[1] - b2[1]) < epsilon$3;\n  }\n  function Intersection(point2, points2, other, entry2) {\n    this.x = point2;\n    this.z = points2;\n    this.o = other;\n    this.e = entry2;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function clipRejoin(segments2, compareIntersection2, startInside, interpolate2, stream2) {\n    var subject = [], clip2 = [], i, n;\n    segments2.forEach(function(segment) {\n      if ((n2 = segment.length - 1) <= 0) return;\n      var n2, p02 = segment[0], p1 = segment[n2], x2;\n      if (pointEqual(p02, p1)) {\n        if (!p02[2] && !p1[2]) {\n          stream2.lineStart();\n          for (i = 0; i < n2; ++i) stream2.point((p02 = segment[i])[0], p02[1]);\n          stream2.lineEnd();\n          return;\n        }\n        p1[0] += 2 * epsilon$3;\n      }\n      subject.push(x2 = new Intersection(p02, segment, null, true));\n      clip2.push(x2.o = new Intersection(p02, null, x2, false));\n      subject.push(x2 = new Intersection(p1, segment, null, false));\n      clip2.push(x2.o = new Intersection(p1, null, x2, true));\n    });\n    if (!subject.length) return;\n    clip2.sort(compareIntersection2);\n    link(subject);\n    link(clip2);\n    for (i = 0, n = clip2.length; i < n; ++i) {\n      clip2[i].e = startInside = !startInside;\n    }\n    var start = subject[0], points2, point2;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points2 = current.z;\n      stream2.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (i = 0, n = points2.length; i < n; ++i) stream2.point((point2 = points2[i])[0], point2[1]);\n          } else {\n            interpolate2(current.x, current.n.x, 1, stream2);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points2 = current.p.z;\n            for (i = points2.length - 1; i >= 0; --i) stream2.point((point2 = points2[i])[0], point2[1]);\n          } else {\n            interpolate2(current.x, current.p.x, -1, stream2);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points2 = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      stream2.lineEnd();\n    }\n  }\n  function link(array2) {\n    if (!(n = array2.length)) return;\n    var n, i = 0, a2 = array2[0], b2;\n    while (++i < n) {\n      a2.n = b2 = array2[i];\n      b2.p = a2;\n      a2 = b2;\n    }\n    a2.n = b2 = array2[0];\n    b2.p = a2;\n  }\n  function longitude(point2) {\n    return abs$1(point2[0]) <= pi$1 ? point2[0] : sign(point2[0]) * ((abs$1(point2[0]) + pi$1) % tau$1 - pi$1);\n  }\n  function polygonContains(polygon, point2) {\n    var lambda = longitude(point2), phi2 = point2[1], sinPhi = sin$1(phi2), normal = [sin$1(lambda), -cos$1(lambda), 0], angle2 = 0, winding = 0;\n    var sum2 = new Adder();\n    if (sinPhi === 1) phi2 = halfPi$1 + epsilon$3;\n    else if (sinPhi === -1) phi2 = -halfPi$1 - epsilon$3;\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      if (!(m2 = (ring = polygon[i]).length)) continue;\n      var ring, m2, point0 = ring[m2 - 1], lambda02 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi02 = sin$1(phi02), cosPhi02 = cos$1(phi02);\n      for (var j = 0; j < m2; ++j, lambda02 = lambda12, sinPhi02 = sinPhi1, cosPhi02 = cosPhi1, point0 = point1) {\n        var point1 = ring[j], lambda12 = longitude(point1), phi12 = point1[1] / 2 + quarterPi, sinPhi1 = sin$1(phi12), cosPhi1 = cos$1(phi12), delta = lambda12 - lambda02, sign2 = delta >= 0 ? 1 : -1, absDelta = sign2 * delta, antimeridian = absDelta > pi$1, k = sinPhi02 * sinPhi1;\n        sum2.add(atan2(k * sign2 * sin$1(absDelta), cosPhi02 * cosPhi1 + k * cos$1(absDelta)));\n        angle2 += antimeridian ? delta + sign2 * tau$1 : delta;\n        if (antimeridian ^ lambda02 >= lambda ^ lambda12 >= lambda) {\n          var arc2 = cartesianCross(cartesian(point0), cartesian(point1));\n          cartesianNormalizeInPlace(arc2);\n          var intersection2 = cartesianCross(normal, arc2);\n          cartesianNormalizeInPlace(intersection2);\n          var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection2[2]);\n          if (phi2 > phiArc || phi2 === phiArc && (arc2[0] || arc2[1])) {\n            winding += antimeridian ^ delta >= 0 ? 1 : -1;\n          }\n        }\n      }\n    }\n    return (angle2 < -epsilon$3 || angle2 < epsilon$3 && sum2 < -epsilon2) ^ winding & 1;\n  }\n  function clip$1(pointVisible, clipLine2, interpolate2, start) {\n    return function(sink) {\n      var line2 = clipLine2(sink), ringBuffer = clipBuffer(), ringSink = clipLine2(ringBuffer), polygonStarted = false, polygon, segments2, ring;\n      var clip2 = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart: function() {\n          clip2.point = pointRing;\n          clip2.lineStart = ringStart;\n          clip2.lineEnd = ringEnd;\n          segments2 = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip2.point = point2;\n          clip2.lineStart = lineStart;\n          clip2.lineEnd = lineEnd;\n          segments2 = merge$4(segments2);\n          var startInside = polygonContains(polygon, start);\n          if (segments2.length) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            clipRejoin(segments2, compareIntersection, startInside, interpolate2, sink);\n          } else if (startInside) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            sink.lineStart();\n            interpolate2(null, null, 1, sink);\n            sink.lineEnd();\n          }\n          if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n          segments2 = polygon = null;\n        },\n        sphere: function() {\n          sink.polygonStart();\n          sink.lineStart();\n          interpolate2(null, null, 1, sink);\n          sink.lineEnd();\n          sink.polygonEnd();\n        }\n      };\n      function point2(lambda, phi2) {\n        if (pointVisible(lambda, phi2)) sink.point(lambda, phi2);\n      }\n      function pointLine(lambda, phi2) {\n        line2.point(lambda, phi2);\n      }\n      function lineStart() {\n        clip2.point = pointLine;\n        line2.lineStart();\n      }\n      function lineEnd() {\n        clip2.point = point2;\n        line2.lineEnd();\n      }\n      function pointRing(lambda, phi2) {\n        ring.push([lambda, phi2]);\n        ringSink.point(lambda, phi2);\n      }\n      function ringStart() {\n        ringSink.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringSink.lineEnd();\n        var clean = ringSink.clean(), ringSegments = ringBuffer.result(), i, n = ringSegments.length, m2, segment, point3;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          if ((m2 = segment.length - 1) > 0) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            sink.lineStart();\n            for (i = 0; i < m2; ++i) sink.point((point3 = segment[i])[0], point3[1]);\n            sink.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments2.push(ringSegments.filter(validSegment));\n      }\n      return clip2;\n    };\n  }\n  function validSegment(segment) {\n    return segment.length > 1;\n  }\n  function compareIntersection(a2, b2) {\n    return ((a2 = a2.x)[0] < 0 ? a2[1] - halfPi$1 - epsilon$3 : halfPi$1 - a2[1]) - ((b2 = b2.x)[0] < 0 ? b2[1] - halfPi$1 - epsilon$3 : halfPi$1 - b2[1]);\n  }\n  const clipAntimeridian = clip$1(\n    function() {\n      return true;\n    },\n    clipAntimeridianLine,\n    clipAntimeridianInterpolate,\n    [-pi$1, -halfPi$1]\n  );\n  function clipAntimeridianLine(stream2) {\n    var lambda02 = NaN, phi02 = NaN, sign0 = NaN, clean;\n    return {\n      lineStart: function() {\n        stream2.lineStart();\n        clean = 1;\n      },\n      point: function(lambda12, phi12) {\n        var sign1 = lambda12 > 0 ? pi$1 : -pi$1, delta = abs$1(lambda12 - lambda02);\n        if (abs$1(delta - pi$1) < epsilon$3) {\n          stream2.point(lambda02, phi02 = (phi02 + phi12) / 2 > 0 ? halfPi$1 : -halfPi$1);\n          stream2.point(sign0, phi02);\n          stream2.lineEnd();\n          stream2.lineStart();\n          stream2.point(sign1, phi02);\n          stream2.point(lambda12, phi02);\n          clean = 0;\n        } else if (sign0 !== sign1 && delta >= pi$1) {\n          if (abs$1(lambda02 - sign0) < epsilon$3) lambda02 -= sign0 * epsilon$3;\n          if (abs$1(lambda12 - sign1) < epsilon$3) lambda12 -= sign1 * epsilon$3;\n          phi02 = clipAntimeridianIntersect(lambda02, phi02, lambda12, phi12);\n          stream2.point(sign0, phi02);\n          stream2.lineEnd();\n          stream2.lineStart();\n          stream2.point(sign1, phi02);\n          clean = 0;\n        }\n        stream2.point(lambda02 = lambda12, phi02 = phi12);\n        sign0 = sign1;\n      },\n      lineEnd: function() {\n        stream2.lineEnd();\n        lambda02 = phi02 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function clipAntimeridianIntersect(lambda02, phi02, lambda12, phi12) {\n    var cosPhi02, cosPhi1, sinLambda0Lambda1 = sin$1(lambda02 - lambda12);\n    return abs$1(sinLambda0Lambda1) > epsilon$3 ? atan((sin$1(phi02) * (cosPhi1 = cos$1(phi12)) * sin$1(lambda12) - sin$1(phi12) * (cosPhi02 = cos$1(phi02)) * sin$1(lambda02)) / (cosPhi02 * cosPhi1 * sinLambda0Lambda1)) : (phi02 + phi12) / 2;\n  }\n  function clipAntimeridianInterpolate(from, to, direction, stream2) {\n    var phi2;\n    if (from == null) {\n      phi2 = direction * halfPi$1;\n      stream2.point(-pi$1, phi2);\n      stream2.point(0, phi2);\n      stream2.point(pi$1, phi2);\n      stream2.point(pi$1, 0);\n      stream2.point(pi$1, -phi2);\n      stream2.point(0, -phi2);\n      stream2.point(-pi$1, -phi2);\n      stream2.point(-pi$1, 0);\n      stream2.point(-pi$1, phi2);\n    } else if (abs$1(from[0] - to[0]) > epsilon$3) {\n      var lambda = from[0] < to[0] ? pi$1 : -pi$1;\n      phi2 = direction * lambda / 2;\n      stream2.point(-lambda, phi2);\n      stream2.point(0, phi2);\n      stream2.point(lambda, phi2);\n    } else {\n      stream2.point(to[0], to[1]);\n    }\n  }\n  function clipCircle(radius2) {\n    var cr2 = cos$1(radius2), delta = 2 * radians, smallRadius = cr2 > 0, notHemisphere = abs$1(cr2) > epsilon$3;\n    function interpolate2(from, to, direction, stream2) {\n      circleStream(stream2, radius2, delta, direction, from, to);\n    }\n    function visible(lambda, phi2) {\n      return cos$1(lambda) * cos$1(phi2) > cr2;\n    }\n    function clipLine2(stream2) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(lambda, phi2) {\n          var point1 = [lambda, phi2], point2, v = visible(lambda, phi2), c2 = smallRadius ? v ? 0 : code(lambda, phi2) : v ? code(lambda + (lambda < 0 ? pi$1 : -pi$1), phi2) : 0;\n          if (!point0 && (v00 = v0 = v)) stream2.lineStart();\n          if (v !== v0) {\n            point2 = intersect2(point0, point1);\n            if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2))\n              point1[2] = 1;\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              stream2.lineStart();\n              point2 = intersect2(point1, point0);\n              stream2.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect2(point0, point1);\n              stream2.point(point2[0], point2[1], 2);\n              stream2.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c2 & c0) && (t = intersect2(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                stream2.lineStart();\n                stream2.point(t[0][0], t[0][1]);\n                stream2.point(t[1][0], t[1][1]);\n                stream2.lineEnd();\n              } else {\n                stream2.point(t[1][0], t[1][1]);\n                stream2.lineEnd();\n                stream2.lineStart();\n                stream2.point(t[0][0], t[0][1], 3);\n              }\n            }\n          }\n          if (v && (!point0 || !pointEqual(point0, point1))) {\n            stream2.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c2;\n        },\n        lineEnd: function() {\n          if (v0) stream2.lineEnd();\n          point0 = null;\n        },\n        // Rejoin first and last segments if there were intersections and the first\n        // and last points were visible.\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect2(a2, b2, two) {\n      var pa2 = cartesian(a2), pb = cartesian(b2);\n      var n1 = [1, 0, 0], n2 = cartesianCross(pa2, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a2;\n      var c1 = cr2 * n2n2 / determinant, c2 = -cr2 * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A5 = cartesianScale(n1, c1), B2 = cartesianScale(n2, c2);\n      cartesianAddInPlace(A5, B2);\n      var u2 = n1xn2, w2 = cartesianDot(A5, u2), uu = cartesianDot(u2, u2), t22 = w2 * w2 - uu * (cartesianDot(A5, A5) - 1);\n      if (t22 < 0) return;\n      var t = sqrt$1(t22), q = cartesianScale(u2, (-w2 - t) / uu);\n      cartesianAddInPlace(q, A5);\n      q = spherical(q);\n      if (!two) return q;\n      var lambda02 = a2[0], lambda12 = b2[0], phi02 = a2[1], phi12 = b2[1], z2;\n      if (lambda12 < lambda02) z2 = lambda02, lambda02 = lambda12, lambda12 = z2;\n      var delta2 = lambda12 - lambda02, polar = abs$1(delta2 - pi$1) < epsilon$3, meridian = polar || delta2 < epsilon$3;\n      if (!polar && phi12 < phi02) z2 = phi02, phi02 = phi12, phi12 = z2;\n      if (meridian ? polar ? phi02 + phi12 > 0 ^ q[1] < (abs$1(q[0] - lambda02) < epsilon$3 ? phi02 : phi12) : phi02 <= q[1] && q[1] <= phi12 : delta2 > pi$1 ^ (lambda02 <= q[0] && q[0] <= lambda12)) {\n        var q1 = cartesianScale(u2, (-w2 + t) / uu);\n        cartesianAddInPlace(q1, A5);\n        return [q, spherical(q1)];\n      }\n    }\n    function code(lambda, phi2) {\n      var r = smallRadius ? radius2 : pi$1 - radius2, code2 = 0;\n      if (lambda < -r) code2 |= 1;\n      else if (lambda > r) code2 |= 2;\n      if (phi2 < -r) code2 |= 4;\n      else if (phi2 > r) code2 |= 8;\n      return code2;\n    }\n    return clip$1(visible, clipLine2, interpolate2, smallRadius ? [0, -radius2] : [-pi$1, radius2 - pi$1]);\n  }\n  function clipLine(a2, b2, x02, y02, x12, y12) {\n    var ax = a2[0], ay = a2[1], bx = b2[0], by = b2[1], t02 = 0, t12 = 1, dx = bx - ax, dy = by - ay, r;\n    r = x02 - ax;\n    if (!dx && r > 0) return;\n    r /= dx;\n    if (dx < 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    } else if (dx > 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    }\n    r = x12 - ax;\n    if (!dx && r < 0) return;\n    r /= dx;\n    if (dx < 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    } else if (dx > 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    }\n    r = y02 - ay;\n    if (!dy && r > 0) return;\n    r /= dy;\n    if (dy < 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    } else if (dy > 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    }\n    r = y12 - ay;\n    if (!dy && r < 0) return;\n    r /= dy;\n    if (dy < 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    } else if (dy > 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    }\n    if (t02 > 0) a2[0] = ax + t02 * dx, a2[1] = ay + t02 * dy;\n    if (t12 < 1) b2[0] = ax + t12 * dx, b2[1] = ay + t12 * dy;\n    return true;\n  }\n  var clipMax = 1e9, clipMin = -clipMax;\n  function clipRectangle(x02, y02, x12, y12) {\n    function visible(x2, y2) {\n      return x02 <= x2 && x2 <= x12 && y02 <= y2 && y2 <= y12;\n    }\n    function interpolate2(from, to, direction, stream2) {\n      var a2 = 0, a1 = 0;\n      if (from == null || (a2 = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {\n        do\n          stream2.point(a2 === 0 || a2 === 3 ? x02 : x12, a2 > 1 ? y12 : y02);\n        while ((a2 = (a2 + direction + 4) % 4) !== a1);\n      } else {\n        stream2.point(to[0], to[1]);\n      }\n    }\n    function corner(p, direction) {\n      return abs$1(p[0] - x02) < epsilon$3 ? direction > 0 ? 0 : 3 : abs$1(p[0] - x12) < epsilon$3 ? direction > 0 ? 2 : 1 : abs$1(p[1] - y02) < epsilon$3 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compareIntersection2(a2, b2) {\n      return comparePoint(a2.x, b2.x);\n    }\n    function comparePoint(a2, b2) {\n      var ca = corner(a2, 1), cb = corner(b2, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b2[1] - a2[1] : ca === 1 ? a2[0] - b2[0] : ca === 2 ? a2[1] - b2[1] : b2[0] - a2[0];\n    }\n    return function(stream2) {\n      var activeStream = stream2, bufferStream = clipBuffer(), segments2, polygon, ring, x__, y__, v__, x_, y_, v_, first, clean;\n      var clipStream = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart,\n        polygonEnd\n      };\n      function point2(x2, y2) {\n        if (visible(x2, y2)) activeStream.point(x2, y2);\n      }\n      function polygonInside() {\n        var winding = 0;\n        for (var i = 0, n = polygon.length; i < n; ++i) {\n          for (var ring2 = polygon[i], j = 1, m2 = ring2.length, point3 = ring2[0], a0, a1, b0 = point3[0], b1 = point3[1]; j < m2; ++j) {\n            a0 = b0, a1 = b1, point3 = ring2[j], b0 = point3[0], b1 = point3[1];\n            if (a1 <= y12) {\n              if (b1 > y12 && (b0 - a0) * (y12 - a1) > (b1 - a1) * (x02 - a0)) ++winding;\n            } else {\n              if (b1 <= y12 && (b0 - a0) * (y12 - a1) < (b1 - a1) * (x02 - a0)) --winding;\n            }\n          }\n        }\n        return winding;\n      }\n      function polygonStart() {\n        activeStream = bufferStream, segments2 = [], polygon = [], clean = true;\n      }\n      function polygonEnd() {\n        var startInside = polygonInside(), cleanInside = clean && startInside, visible2 = (segments2 = merge$4(segments2)).length;\n        if (cleanInside || visible2) {\n          stream2.polygonStart();\n          if (cleanInside) {\n            stream2.lineStart();\n            interpolate2(null, null, 1, stream2);\n            stream2.lineEnd();\n          }\n          if (visible2) {\n            clipRejoin(segments2, compareIntersection2, startInside, interpolate2, stream2);\n          }\n          stream2.polygonEnd();\n        }\n        activeStream = stream2, segments2 = polygon = ring = null;\n      }\n      function lineStart() {\n        clipStream.point = linePoint2;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments2) {\n          linePoint2(x__, y__);\n          if (v__ && v_) bufferStream.rejoin();\n          segments2.push(bufferStream.result());\n        }\n        clipStream.point = point2;\n        if (v_) activeStream.lineEnd();\n      }\n      function linePoint2(x2, y2) {\n        var v = visible(x2, y2);\n        if (polygon) ring.push([x2, y2]);\n        if (first) {\n          x__ = x2, y__ = y2, v__ = v;\n          first = false;\n          if (v) {\n            activeStream.lineStart();\n            activeStream.point(x2, y2);\n          }\n        } else {\n          if (v && v_) activeStream.point(x2, y2);\n          else {\n            var a2 = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], b2 = [x2 = Math.max(clipMin, Math.min(clipMax, x2)), y2 = Math.max(clipMin, Math.min(clipMax, y2))];\n            if (clipLine(a2, b2, x02, y02, x12, y12)) {\n              if (!v_) {\n                activeStream.lineStart();\n                activeStream.point(a2[0], a2[1]);\n              }\n              activeStream.point(b2[0], b2[1]);\n              if (!v) activeStream.lineEnd();\n              clean = false;\n            } else if (v) {\n              activeStream.lineStart();\n              activeStream.point(x2, y2);\n              clean = false;\n            }\n          }\n        }\n        x_ = x2, y_ = y2, v_ = v;\n      }\n      return clipStream;\n    };\n  }\n  function graticuleX(y02, y12, dy) {\n    var y2 = range$3(y02, y12 - epsilon$3, dy).concat(y12);\n    return function(x2) {\n      return y2.map(function(y3) {\n        return [x2, y3];\n      });\n    };\n  }\n  function graticuleY(x02, x12, dx) {\n    var x2 = range$3(x02, x12 - epsilon$3, dx).concat(x12);\n    return function(y2) {\n      return x2.map(function(x3) {\n        return [x3, y2];\n      });\n    };\n  }\n  function graticule() {\n    var x12, x02, X12, X02, y12, y02, Y12, Y02, dx = 10, dy = dx, DX = 90, DY = 360, x2, y2, X3, Y3, precision = 2.5;\n    function graticule2() {\n      return { type: \"MultiLineString\", coordinates: lines() };\n    }\n    function lines() {\n      return range$3(ceil(X02 / DX) * DX, X12, DX).map(X3).concat(range$3(ceil(Y02 / DY) * DY, Y12, DY).map(Y3)).concat(range$3(ceil(x02 / dx) * dx, x12, dx).filter(function(x3) {\n        return abs$1(x3 % DX) > epsilon$3;\n      }).map(x2)).concat(range$3(ceil(y02 / dy) * dy, y12, dy).filter(function(y3) {\n        return abs$1(y3 % DY) > epsilon$3;\n      }).map(y2));\n    }\n    graticule2.lines = function() {\n      return lines().map(function(coordinates) {\n        return { type: \"LineString\", coordinates };\n      });\n    };\n    graticule2.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [\n          X3(X02).concat(\n            Y3(Y12).slice(1),\n            X3(X12).reverse().slice(1),\n            Y3(Y02).reverse().slice(1)\n          )\n        ]\n      };\n    };\n    graticule2.extent = function(_) {\n      if (!arguments.length) return graticule2.extentMinor();\n      return graticule2.extentMajor(_).extentMinor(_);\n    };\n    graticule2.extentMajor = function(_) {\n      if (!arguments.length) return [[X02, Y02], [X12, Y12]];\n      X02 = +_[0][0], X12 = +_[1][0];\n      Y02 = +_[0][1], Y12 = +_[1][1];\n      if (X02 > X12) _ = X02, X02 = X12, X12 = _;\n      if (Y02 > Y12) _ = Y02, Y02 = Y12, Y12 = _;\n      return graticule2.precision(precision);\n    };\n    graticule2.extentMinor = function(_) {\n      if (!arguments.length) return [[x02, y02], [x12, y12]];\n      x02 = +_[0][0], x12 = +_[1][0];\n      y02 = +_[0][1], y12 = +_[1][1];\n      if (x02 > x12) _ = x02, x02 = x12, x12 = _;\n      if (y02 > y12) _ = y02, y02 = y12, y12 = _;\n      return graticule2.precision(precision);\n    };\n    graticule2.step = function(_) {\n      if (!arguments.length) return graticule2.stepMinor();\n      return graticule2.stepMajor(_).stepMinor(_);\n    };\n    graticule2.stepMajor = function(_) {\n      if (!arguments.length) return [DX, DY];\n      DX = +_[0], DY = +_[1];\n      return graticule2;\n    };\n    graticule2.stepMinor = function(_) {\n      if (!arguments.length) return [dx, dy];\n      dx = +_[0], dy = +_[1];\n      return graticule2;\n    };\n    graticule2.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x2 = graticuleX(y02, y12, 90);\n      y2 = graticuleY(x02, x12, precision);\n      X3 = graticuleX(Y02, Y12, 90);\n      Y3 = graticuleY(X02, X12, precision);\n      return graticule2;\n    };\n    return graticule2.extentMajor([[-180, -90 + epsilon$3], [180, 90 - epsilon$3]]).extentMinor([[-180, -80 - epsilon$3], [180, 80 + epsilon$3]]);\n  }\n  const identity = (x2) => x2;\n  var areaSum = new Adder(), areaRingSum = new Adder(), x00$2, y00$2, x0$3, y0$3;\n  var areaStream = {\n    point: noop$2,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: function() {\n      areaStream.lineStart = areaRingStart;\n      areaStream.lineEnd = areaRingEnd;\n    },\n    polygonEnd: function() {\n      areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$2;\n      areaSum.add(abs$1(areaRingSum));\n      areaRingSum = new Adder();\n    },\n    result: function() {\n      var area2 = areaSum / 2;\n      areaSum = new Adder();\n      return area2;\n    }\n  };\n  function areaRingStart() {\n    areaStream.point = areaPointFirst;\n  }\n  function areaPointFirst(x2, y2) {\n    areaStream.point = areaPoint;\n    x00$2 = x0$3 = x2, y00$2 = y0$3 = y2;\n  }\n  function areaPoint(x2, y2) {\n    areaRingSum.add(y0$3 * x2 - x0$3 * y2);\n    x0$3 = x2, y0$3 = y2;\n  }\n  function areaRingEnd() {\n    areaPoint(x00$2, y00$2);\n  }\n  var x0$2 = Infinity, y0$2 = x0$2, x1 = -x0$2, y1 = x1;\n  var boundsStream = {\n    point: boundsPoint,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: noop$2,\n    polygonEnd: noop$2,\n    result: function() {\n      var bounds2 = [[x0$2, y0$2], [x1, y1]];\n      x1 = y1 = -(y0$2 = x0$2 = Infinity);\n      return bounds2;\n    }\n  };\n  function boundsPoint(x2, y2) {\n    if (x2 < x0$2) x0$2 = x2;\n    if (x2 > x1) x1 = x2;\n    if (y2 < y0$2) y0$2 = y2;\n    if (y2 > y1) y1 = y2;\n  }\n  var X0 = 0, Y0 = 0, Z0 = 0, X1 = 0, Y1 = 0, Z1 = 0, X2 = 0, Y2 = 0, Z2 = 0, x00$1, y00$1, x0$1, y0$1;\n  var centroidStream = {\n    point: centroidPoint,\n    lineStart: centroidLineStart,\n    lineEnd: centroidLineEnd,\n    polygonStart: function() {\n      centroidStream.lineStart = centroidRingStart;\n      centroidStream.lineEnd = centroidRingEnd;\n    },\n    polygonEnd: function() {\n      centroidStream.point = centroidPoint;\n      centroidStream.lineStart = centroidLineStart;\n      centroidStream.lineEnd = centroidLineEnd;\n    },\n    result: function() {\n      var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];\n      X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;\n      return centroid;\n    }\n  };\n  function centroidPoint(x2, y2) {\n    X0 += x2;\n    Y0 += y2;\n    ++Z0;\n  }\n  function centroidLineStart() {\n    centroidStream.point = centroidPointFirstLine;\n  }\n  function centroidPointFirstLine(x2, y2) {\n    centroidStream.point = centroidPointLine;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function centroidPointLine(x2, y2) {\n    var dx = x2 - x0$1, dy = y2 - y0$1, z2 = sqrt$1(dx * dx + dy * dy);\n    X1 += z2 * (x0$1 + x2) / 2;\n    Y1 += z2 * (y0$1 + y2) / 2;\n    Z1 += z2;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function centroidLineEnd() {\n    centroidStream.point = centroidPoint;\n  }\n  function centroidRingStart() {\n    centroidStream.point = centroidPointFirstRing;\n  }\n  function centroidRingEnd() {\n    centroidPointRing(x00$1, y00$1);\n  }\n  function centroidPointFirstRing(x2, y2) {\n    centroidStream.point = centroidPointRing;\n    centroidPoint(x00$1 = x0$1 = x2, y00$1 = y0$1 = y2);\n  }\n  function centroidPointRing(x2, y2) {\n    var dx = x2 - x0$1, dy = y2 - y0$1, z2 = sqrt$1(dx * dx + dy * dy);\n    X1 += z2 * (x0$1 + x2) / 2;\n    Y1 += z2 * (y0$1 + y2) / 2;\n    Z1 += z2;\n    z2 = y0$1 * x2 - x0$1 * y2;\n    X2 += z2 * (x0$1 + x2);\n    Y2 += z2 * (y0$1 + y2);\n    Z2 += z2 * 3;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function PathContext(context2) {\n    this._context = context2;\n  }\n  PathContext.prototype = {\n    _radius: 4.5,\n    pointRadius: function(_) {\n      return this._radius = _, this;\n    },\n    polygonStart: function() {\n      this._line = 0;\n    },\n    polygonEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line === 0) this._context.closePath();\n      this._point = NaN;\n    },\n    point: function(x2, y2) {\n      switch (this._point) {\n        case 0: {\n          this._context.moveTo(x2, y2);\n          this._point = 1;\n          break;\n        }\n        case 1: {\n          this._context.lineTo(x2, y2);\n          break;\n        }\n        default: {\n          this._context.moveTo(x2 + this._radius, y2);\n          this._context.arc(x2, y2, this._radius, 0, tau$1);\n          break;\n        }\n      }\n    },\n    result: noop$2\n  };\n  var lengthSum = new Adder(), lengthRing, x00, y00, x0, y0;\n  var lengthStream = {\n    point: noop$2,\n    lineStart: function() {\n      lengthStream.point = lengthPointFirst;\n    },\n    lineEnd: function() {\n      if (lengthRing) lengthPoint(x00, y00);\n      lengthStream.point = noop$2;\n    },\n    polygonStart: function() {\n      lengthRing = true;\n    },\n    polygonEnd: function() {\n      lengthRing = null;\n    },\n    result: function() {\n      var length2 = +lengthSum;\n      lengthSum = new Adder();\n      return length2;\n    }\n  };\n  function lengthPointFirst(x2, y2) {\n    lengthStream.point = lengthPoint;\n    x00 = x0 = x2, y00 = y0 = y2;\n  }\n  function lengthPoint(x2, y2) {\n    x0 -= x2, y0 -= y2;\n    lengthSum.add(sqrt$1(x0 * x0 + y0 * y0));\n    x0 = x2, y0 = y2;\n  }\n  let cacheDigits, cacheAppend, cacheRadius, cacheCircle;\n  class PathString {\n    constructor(digits) {\n      this._append = digits == null ? append : appendRound(digits);\n      this._radius = 4.5;\n      this._ = \"\";\n    }\n    pointRadius(_) {\n      this._radius = +_;\n      return this;\n    }\n    polygonStart() {\n      this._line = 0;\n    }\n    polygonEnd() {\n      this._line = NaN;\n    }\n    lineStart() {\n      this._point = 0;\n    }\n    lineEnd() {\n      if (this._line === 0) this._ += \"Z\";\n      this._point = NaN;\n    }\n    point(x2, y2) {\n      switch (this._point) {\n        case 0: {\n          this._append`M${x2},${y2}`;\n          this._point = 1;\n          break;\n        }\n        case 1: {\n          this._append`L${x2},${y2}`;\n          break;\n        }\n        default: {\n          this._append`M${x2},${y2}`;\n          if (this._radius !== cacheRadius || this._append !== cacheAppend) {\n            const r = this._radius;\n            const s2 = this._;\n            this._ = \"\";\n            this._append`m0,${r}a${r},${r} 0 1,1 0,${-2 * r}a${r},${r} 0 1,1 0,${2 * r}z`;\n            cacheRadius = r;\n            cacheAppend = this._append;\n            cacheCircle = this._;\n            this._ = s2;\n          }\n          this._ += cacheCircle;\n          break;\n        }\n      }\n    }\n    result() {\n      const result = this._;\n      this._ = \"\";\n      return result.length ? result : null;\n    }\n  }\n  function append(strings2) {\n    let i = 1;\n    this._ += strings2[0];\n    for (const j = strings2.length; i < j; ++i) {\n      this._ += arguments[i] + strings2[i];\n    }\n  }\n  function appendRound(digits) {\n    const d2 = Math.floor(digits);\n    if (!(d2 >= 0)) throw new RangeError(`invalid digits: ${digits}`);\n    if (d2 > 15) return append;\n    if (d2 !== cacheDigits) {\n      const k = 10 ** d2;\n      cacheDigits = d2;\n      cacheAppend = function append2(strings2) {\n        let i = 1;\n        this._ += strings2[0];\n        for (const j = strings2.length; i < j; ++i) {\n          this._ += Math.round(arguments[i] * k) / k + strings2[i];\n        }\n      };\n    }\n    return cacheAppend;\n  }\n  function geoPath(projection2, context2) {\n    let digits = 3, pointRadius = 4.5, projectionStream, contextStream;\n    function path2(object2) {\n      if (object2) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        geoStream(object2, projectionStream(contextStream));\n      }\n      return contextStream.result();\n    }\n    path2.area = function(object2) {\n      geoStream(object2, projectionStream(areaStream));\n      return areaStream.result();\n    };\n    path2.measure = function(object2) {\n      geoStream(object2, projectionStream(lengthStream));\n      return lengthStream.result();\n    };\n    path2.bounds = function(object2) {\n      geoStream(object2, projectionStream(boundsStream));\n      return boundsStream.result();\n    };\n    path2.centroid = function(object2) {\n      geoStream(object2, projectionStream(centroidStream));\n      return centroidStream.result();\n    };\n    path2.projection = function(_) {\n      if (!arguments.length) return projection2;\n      projectionStream = _ == null ? (projection2 = null, identity) : (projection2 = _).stream;\n      return path2;\n    };\n    path2.context = function(_) {\n      if (!arguments.length) return context2;\n      contextStream = _ == null ? (context2 = null, new PathString(digits)) : new PathContext(context2 = _);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return path2;\n    };\n    path2.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path2;\n    };\n    path2.digits = function(_) {\n      if (!arguments.length) return digits;\n      if (_ == null) digits = null;\n      else {\n        const d2 = Math.floor(_);\n        if (!(d2 >= 0)) throw new RangeError(`invalid digits: ${_}`);\n        digits = d2;\n      }\n      if (context2 === null) contextStream = new PathString(digits);\n      return path2;\n    };\n    return path2.projection(projection2).digits(digits).context(context2);\n  }\n  function transformer(methods2) {\n    return function(stream2) {\n      var s2 = new TransformStream();\n      for (var key2 in methods2) s2[key2] = methods2[key2];\n      s2.stream = stream2;\n      return s2;\n    };\n  }\n  function TransformStream() {\n  }\n  TransformStream.prototype = {\n    constructor: TransformStream,\n    point: function(x2, y2) {\n      this.stream.point(x2, y2);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function fit$1(projection2, fitBounds, object2) {\n    var clip2 = projection2.clipExtent && projection2.clipExtent();\n    projection2.scale(150).translate([0, 0]);\n    if (clip2 != null) projection2.clipExtent(null);\n    geoStream(object2, projection2.stream(boundsStream));\n    fitBounds(boundsStream.result());\n    if (clip2 != null) projection2.clipExtent(clip2);\n    return projection2;\n  }\n  function fitExtent(projection2, extent2, object2) {\n    return fit$1(projection2, function(b2) {\n      var w2 = extent2[1][0] - extent2[0][0], h2 = extent2[1][1] - extent2[0][1], k = Math.min(w2 / (b2[1][0] - b2[0][0]), h2 / (b2[1][1] - b2[0][1])), x2 = +extent2[0][0] + (w2 - k * (b2[1][0] + b2[0][0])) / 2, y2 = +extent2[0][1] + (h2 - k * (b2[1][1] + b2[0][1])) / 2;\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  function fitSize(projection2, size, object2) {\n    return fitExtent(projection2, [[0, 0], size], object2);\n  }\n  function fitWidth(projection2, width2, object2) {\n    return fit$1(projection2, function(b2) {\n      var w2 = +width2, k = w2 / (b2[1][0] - b2[0][0]), x2 = (w2 - k * (b2[1][0] + b2[0][0])) / 2, y2 = -k * b2[0][1];\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  function fitHeight(projection2, height2, object2) {\n    return fit$1(projection2, function(b2) {\n      var h2 = +height2, k = h2 / (b2[1][1] - b2[0][1]), x2 = -k * b2[0][0], y2 = (h2 - k * (b2[1][1] + b2[0][1])) / 2;\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  var maxDepth = 16, cosMinDistance = cos$1(30 * radians);\n  function resample(project2, delta2) {\n    return +delta2 ? resample$1(project2, delta2) : resampleNone(project2);\n  }\n  function resampleNone(project2) {\n    return transformer({\n      point: function(x2, y2) {\n        x2 = project2(x2, y2);\n        this.stream.point(x2[0], x2[1]);\n      }\n    });\n  }\n  function resample$1(project2, delta2) {\n    function resampleLineTo(x02, y02, lambda02, a0, b0, c0, x12, y12, lambda12, a1, b1, c1, depth, stream2) {\n      var dx = x12 - x02, dy = y12 - y02, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * delta2 && depth--) {\n        var a2 = a0 + a1, b2 = b0 + b1, c2 = c0 + c1, m2 = sqrt$1(a2 * a2 + b2 * b2 + c2 * c2), phi2 = asin$1(c2 /= m2), lambda22 = abs$1(abs$1(c2) - 1) < epsilon$3 || abs$1(lambda02 - lambda12) < epsilon$3 ? (lambda02 + lambda12) / 2 : atan2(b2, a2), p = project2(lambda22, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x02, dy2 = y2 - y02, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > delta2 || abs$1((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x02, y02, lambda02, a0, b0, c0, x2, y2, lambda22, a2 /= m2, b2 /= m2, c2, depth, stream2);\n          stream2.point(x2, y2);\n          resampleLineTo(x2, y2, lambda22, a2, b2, c2, x12, y12, lambda12, a1, b1, c1, depth, stream2);\n        }\n      }\n    }\n    return function(stream2) {\n      var lambda002, x002, y002, a00, b00, c00, lambda02, x02, y02, a0, b0, c0;\n      var resampleStream = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart: function() {\n          stream2.polygonStart();\n          resampleStream.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream2.polygonEnd();\n          resampleStream.lineStart = lineStart;\n        }\n      };\n      function point2(x2, y2) {\n        x2 = project2(x2, y2);\n        stream2.point(x2[0], x2[1]);\n      }\n      function lineStart() {\n        x02 = NaN;\n        resampleStream.point = linePoint2;\n        stream2.lineStart();\n      }\n      function linePoint2(lambda, phi2) {\n        var c2 = cartesian([lambda, phi2]), p = project2(lambda, phi2);\n        resampleLineTo(x02, y02, lambda02, a0, b0, c0, x02 = p[0], y02 = p[1], lambda02 = lambda, a0 = c2[0], b0 = c2[1], c0 = c2[2], maxDepth, stream2);\n        stream2.point(x02, y02);\n      }\n      function lineEnd() {\n        resampleStream.point = point2;\n        stream2.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resampleStream.point = ringPoint;\n        resampleStream.lineEnd = ringEnd;\n      }\n      function ringPoint(lambda, phi2) {\n        linePoint2(lambda002 = lambda, phi2), x002 = x02, y002 = y02, a00 = a0, b00 = b0, c00 = c0;\n        resampleStream.point = linePoint2;\n      }\n      function ringEnd() {\n        resampleLineTo(x02, y02, lambda02, a0, b0, c0, x002, y002, lambda002, a00, b00, c00, maxDepth, stream2);\n        resampleStream.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resampleStream;\n    };\n  }\n  var transformRadians = transformer({\n    point: function(x2, y2) {\n      this.stream.point(x2 * radians, y2 * radians);\n    }\n  });\n  function transformRotate(rotate2) {\n    return transformer({\n      point: function(x2, y2) {\n        var r = rotate2(x2, y2);\n        return this.stream.point(r[0], r[1]);\n      }\n    });\n  }\n  function scaleTranslate(k, dx, dy, sx, sy) {\n    function transform2(x2, y2) {\n      x2 *= sx;\n      y2 *= sy;\n      return [dx + k * x2, dy - k * y2];\n    }\n    transform2.invert = function(x2, y2) {\n      return [(x2 - dx) / k * sx, (dy - y2) / k * sy];\n    };\n    return transform2;\n  }\n  function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n    if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n    var cosAlpha = cos$1(alpha), sinAlpha = sin$1(alpha), a2 = cosAlpha * k, b2 = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;\n    function transform2(x2, y2) {\n      x2 *= sx;\n      y2 *= sy;\n      return [a2 * x2 - b2 * y2 + dx, dy - b2 * x2 - a2 * y2];\n    }\n    transform2.invert = function(x2, y2) {\n      return [sx * (ai * x2 - bi * y2 + ci), sy * (fi - bi * x2 - ai * y2)];\n    };\n    return transform2;\n  }\n  function projection$1(project2) {\n    return projectionMutator(function() {\n      return project2;\n    })();\n  }\n  function projectionMutator(projectAt) {\n    var project2, k = 150, x2 = 480, y2 = 250, lambda = 0, phi2 = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate2, alpha = 0, sx = 1, sy = 1, theta = null, preclip = clipAntimeridian, x02 = null, y02, x12, y12, postclip = identity, delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache2, cacheStream;\n    function projection2(point2) {\n      return projectRotateTransform(point2[0] * radians, point2[1] * radians);\n    }\n    function invert2(point2) {\n      point2 = projectRotateTransform.invert(point2[0], point2[1]);\n      return point2 && [point2[0] * degrees, point2[1] * degrees];\n    }\n    projection2.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = transformRadians(transformRotate(rotate2)(preclip(projectResample(postclip(cacheStream = stream2)))));\n    };\n    projection2.preclip = function(_) {\n      return arguments.length ? (preclip = _, theta = void 0, reset2()) : preclip;\n    };\n    projection2.postclip = function(_) {\n      return arguments.length ? (postclip = _, x02 = y02 = x12 = y12 = null, reset2()) : postclip;\n    };\n    projection2.clipAngle = function(_) {\n      return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset2()) : theta * degrees;\n    };\n    projection2.clipExtent = function(_) {\n      return arguments.length ? (postclip = _ == null ? (x02 = y02 = x12 = y12 = null, identity) : clipRectangle(x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset2()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    projection2.scale = function(_) {\n      return arguments.length ? (k = +_, recenter()) : k;\n    };\n    projection2.translate = function(_) {\n      return arguments.length ? (x2 = +_[0], y2 = +_[1], recenter()) : [x2, y2];\n    };\n    projection2.center = function(_) {\n      return arguments.length ? (lambda = _[0] % 360 * radians, phi2 = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi2 * degrees];\n    };\n    projection2.rotate = function(_) {\n      return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n    };\n    projection2.angle = function(_) {\n      return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n    };\n    projection2.reflectX = function(_) {\n      return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n    };\n    projection2.reflectY = function(_) {\n      return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n    };\n    projection2.precision = function(_) {\n      return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset2()) : sqrt$1(delta2);\n    };\n    projection2.fitExtent = function(extent2, object2) {\n      return fitExtent(projection2, extent2, object2);\n    };\n    projection2.fitSize = function(size, object2) {\n      return fitSize(projection2, size, object2);\n    };\n    projection2.fitWidth = function(width2, object2) {\n      return fitWidth(projection2, width2, object2);\n    };\n    projection2.fitHeight = function(height2, object2) {\n      return fitHeight(projection2, height2, object2);\n    };\n    function recenter() {\n      var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project2(lambda, phi2)), transform2 = scaleTranslateRotate(k, x2 - center[0], y2 - center[1], sx, sy, alpha);\n      rotate2 = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n      projectTransform = compose(project2, transform2);\n      projectRotateTransform = compose(rotate2, projectTransform);\n      projectResample = resample(projectTransform, delta2);\n      return reset2();\n    }\n    function reset2() {\n      cache2 = cacheStream = null;\n      return projection2;\n    }\n    return function() {\n      project2 = projectAt.apply(this, arguments);\n      projection2.invert = project2.invert && invert2;\n      return recenter();\n    };\n  }\n  function conicProjection(projectAt) {\n    var phi02 = 0, phi12 = pi$1 / 3, m2 = projectionMutator(projectAt), p = m2(phi02, phi12);\n    p.parallels = function(_) {\n      return arguments.length ? m2(phi02 = _[0] * radians, phi12 = _[1] * radians) : [phi02 * degrees, phi12 * degrees];\n    };\n    return p;\n  }\n  function cylindricalEqualAreaRaw(phi02) {\n    var cosPhi02 = cos$1(phi02);\n    function forward(lambda, phi2) {\n      return [lambda * cosPhi02, sin$1(phi2) / cosPhi02];\n    }\n    forward.invert = function(x2, y2) {\n      return [x2 / cosPhi02, asin$1(y2 * cosPhi02)];\n    };\n    return forward;\n  }\n  function conicEqualAreaRaw(y02, y12) {\n    var sy0 = sin$1(y02), n = (sy0 + sin$1(y12)) / 2;\n    if (abs$1(n) < epsilon$3) return cylindricalEqualAreaRaw(y02);\n    var c2 = 1 + sy0 * (2 * n - sy0), r0 = sqrt$1(c2) / n;\n    function project2(x2, y2) {\n      var r = sqrt$1(c2 - 2 * n * sin$1(y2)) / n;\n      return [r * sin$1(x2 *= n), r0 - r * cos$1(x2)];\n    }\n    project2.invert = function(x2, y2) {\n      var r0y = r0 - y2, l = atan2(x2, abs$1(r0y)) * sign(r0y);\n      if (r0y * n < 0)\n        l -= pi$1 * sign(x2) * sign(r0y);\n      return [l / n, asin$1((c2 - (x2 * x2 + r0y * r0y) * n * n) / (2 * n))];\n    };\n    return project2;\n  }\n  function geoConicEqualArea() {\n    return conicProjection(conicEqualAreaRaw).scale(155.424).center([0, 33.6442]);\n  }\n  function geoAlbers() {\n    return geoConicEqualArea().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]);\n  }\n  function multiplex(streams) {\n    var n = streams.length;\n    return {\n      point: function(x2, y2) {\n        var i = -1;\n        while (++i < n) streams[i].point(x2, y2);\n      },\n      sphere: function() {\n        var i = -1;\n        while (++i < n) streams[i].sphere();\n      },\n      lineStart: function() {\n        var i = -1;\n        while (++i < n) streams[i].lineStart();\n      },\n      lineEnd: function() {\n        var i = -1;\n        while (++i < n) streams[i].lineEnd();\n      },\n      polygonStart: function() {\n        var i = -1;\n        while (++i < n) streams[i].polygonStart();\n      },\n      polygonEnd: function() {\n        var i = -1;\n        while (++i < n) streams[i].polygonEnd();\n      }\n    };\n  }\n  function geoAlbersUsa() {\n    var cache2, cacheStream, lower48 = geoAlbers(), lower48Point, alaska = geoConicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, hawaii = geoConicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, point2, pointStream = { point: function(x2, y2) {\n      point2 = [x2, y2];\n    } };\n    function albersUsa(coordinates) {\n      var x2 = coordinates[0], y2 = coordinates[1];\n      return point2 = null, (lower48Point.point(x2, y2), point2) || (alaskaPoint.point(x2, y2), point2) || (hawaiiPoint.point(x2, y2), point2);\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x2 = (coordinates[0] - t[0]) / k, y2 = (coordinates[1] - t[1]) / k;\n      return (y2 >= 0.12 && y2 < 0.234 && x2 >= -0.425 && x2 < -0.214 ? alaska : y2 >= 0.166 && y2 < 0.234 && x2 >= -0.214 && x2 < -0.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = multiplex([lower48.stream(cacheStream = stream2), alaska.stream(stream2), hawaii.stream(stream2)]);\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n      return reset2();\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x2 = +_[0], y2 = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([[x2 - 0.455 * k, y2 - 0.238 * k], [x2 + 0.455 * k, y2 + 0.238 * k]]).stream(pointStream);\n      alaskaPoint = alaska.translate([x2 - 0.307 * k, y2 + 0.201 * k]).clipExtent([[x2 - 0.425 * k + epsilon$3, y2 + 0.12 * k + epsilon$3], [x2 - 0.214 * k - epsilon$3, y2 + 0.234 * k - epsilon$3]]).stream(pointStream);\n      hawaiiPoint = hawaii.translate([x2 - 0.205 * k, y2 + 0.212 * k]).clipExtent([[x2 - 0.214 * k + epsilon$3, y2 + 0.166 * k + epsilon$3], [x2 - 0.115 * k - epsilon$3, y2 + 0.234 * k - epsilon$3]]).stream(pointStream);\n      return reset2();\n    };\n    albersUsa.fitExtent = function(extent2, object2) {\n      return fitExtent(albersUsa, extent2, object2);\n    };\n    albersUsa.fitSize = function(size, object2) {\n      return fitSize(albersUsa, size, object2);\n    };\n    albersUsa.fitWidth = function(width2, object2) {\n      return fitWidth(albersUsa, width2, object2);\n    };\n    albersUsa.fitHeight = function(height2, object2) {\n      return fitHeight(albersUsa, height2, object2);\n    };\n    function reset2() {\n      cache2 = cacheStream = null;\n      return albersUsa;\n    }\n    return albersUsa.scale(1070);\n  }\n  function azimuthalRaw(scale2) {\n    return function(x2, y2) {\n      var cx = cos$1(x2), cy = cos$1(y2), k = scale2(cx * cy);\n      if (k === Infinity) return [2, 0];\n      return [\n        k * cy * sin$1(x2),\n        k * sin$1(y2)\n      ];\n    };\n  }\n  function azimuthalInvert(angle2) {\n    return function(x2, y2) {\n      var z2 = sqrt$1(x2 * x2 + y2 * y2), c2 = angle2(z2), sc = sin$1(c2), cc = cos$1(c2);\n      return [\n        atan2(x2 * sc, z2 * cc),\n        asin$1(z2 && y2 * sc / z2)\n      ];\n    };\n  }\n  var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\n    return sqrt$1(2 / (1 + cxcy));\n  });\n  azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z2) {\n    return 2 * asin$1(z2 / 2);\n  });\n  function geoAzimuthalEqualArea() {\n    return projection$1(azimuthalEqualAreaRaw).scale(124.75).clipAngle(180 - 1e-3);\n  }\n  var azimuthalEquidistantRaw = azimuthalRaw(function(c2) {\n    return (c2 = acos(c2)) && c2 / sin$1(c2);\n  });\n  azimuthalEquidistantRaw.invert = azimuthalInvert(function(z2) {\n    return z2;\n  });\n  function geoAzimuthalEquidistant() {\n    return projection$1(azimuthalEquidistantRaw).scale(79.4188).clipAngle(180 - 1e-3);\n  }\n  function mercatorRaw(lambda, phi2) {\n    return [lambda, log$1(tan((halfPi$1 + phi2) / 2))];\n  }\n  mercatorRaw.invert = function(x2, y2) {\n    return [x2, 2 * atan(exp(y2)) - halfPi$1];\n  };\n  function geoMercator() {\n    return mercatorProjection(mercatorRaw).scale(961 / tau$1);\n  }\n  function mercatorProjection(project2) {\n    var m2 = projection$1(project2), center = m2.center, scale2 = m2.scale, translate2 = m2.translate, clipExtent = m2.clipExtent, x02 = null, y02, x12, y12;\n    m2.scale = function(_) {\n      return arguments.length ? (scale2(_), reclip()) : scale2();\n    };\n    m2.translate = function(_) {\n      return arguments.length ? (translate2(_), reclip()) : translate2();\n    };\n    m2.center = function(_) {\n      return arguments.length ? (center(_), reclip()) : center();\n    };\n    m2.clipExtent = function(_) {\n      return arguments.length ? (_ == null ? x02 = y02 = x12 = y12 = null : (x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reclip()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    function reclip() {\n      var k = pi$1 * scale2(), t = m2(rotation(m2.rotate()).invert([0, 0]));\n      return clipExtent(x02 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project2 === mercatorRaw ? [[Math.max(t[0] - k, x02), y02], [Math.min(t[0] + k, x12), y12]] : [[x02, Math.max(t[1] - k, y02)], [x12, Math.min(t[1] + k, y12)]]);\n    }\n    return reclip();\n  }\n  function tany(y2) {\n    return tan((halfPi$1 + y2) / 2);\n  }\n  function conicConformalRaw(y02, y12) {\n    var cy0 = cos$1(y02), n = y02 === y12 ? sin$1(y02) : log$1(cy0 / cos$1(y12)) / log$1(tany(y12) / tany(y02)), f = cy0 * pow$1(tany(y02), n) / n;\n    if (!n) return mercatorRaw;\n    function project2(x2, y2) {\n      if (f > 0) {\n        if (y2 < -halfPi$1 + epsilon$3) y2 = -halfPi$1 + epsilon$3;\n      } else {\n        if (y2 > halfPi$1 - epsilon$3) y2 = halfPi$1 - epsilon$3;\n      }\n      var r = f / pow$1(tany(y2), n);\n      return [r * sin$1(n * x2), f - r * cos$1(n * x2)];\n    }\n    project2.invert = function(x2, y2) {\n      var fy = f - y2, r = sign(n) * sqrt$1(x2 * x2 + fy * fy), l = atan2(x2, abs$1(fy)) * sign(fy);\n      if (fy * n < 0)\n        l -= pi$1 * sign(x2) * sign(fy);\n      return [l / n, 2 * atan(pow$1(f / r, 1 / n)) - halfPi$1];\n    };\n    return project2;\n  }\n  function geoConicConformal() {\n    return conicProjection(conicConformalRaw).scale(109.5).parallels([30, 30]);\n  }\n  function equirectangularRaw(lambda, phi2) {\n    return [lambda, phi2];\n  }\n  equirectangularRaw.invert = equirectangularRaw;\n  function geoEquirectangular() {\n    return projection$1(equirectangularRaw).scale(152.63);\n  }\n  function conicEquidistantRaw(y02, y12) {\n    var cy0 = cos$1(y02), n = y02 === y12 ? sin$1(y02) : (cy0 - cos$1(y12)) / (y12 - y02), g = cy0 / n + y02;\n    if (abs$1(n) < epsilon$3) return equirectangularRaw;\n    function project2(x2, y2) {\n      var gy = g - y2, nx = n * x2;\n      return [gy * sin$1(nx), g - gy * cos$1(nx)];\n    }\n    project2.invert = function(x2, y2) {\n      var gy = g - y2, l = atan2(x2, abs$1(gy)) * sign(gy);\n      if (gy * n < 0)\n        l -= pi$1 * sign(x2) * sign(gy);\n      return [l / n, g - sign(n) * sqrt$1(x2 * x2 + gy * gy)];\n    };\n    return project2;\n  }\n  function geoConicEquidistant() {\n    return conicProjection(conicEquidistantRaw).scale(131.154).center([0, 13.9389]);\n  }\n  var A1 = 1.340264, A2 = -0.081106, A3 = 893e-6, A4 = 3796e-6, M = sqrt$1(3) / 2, iterations = 12;\n  function equalEarthRaw(lambda, phi2) {\n    var l = asin$1(M * sin$1(phi2)), l2 = l * l, l6 = l2 * l2 * l2;\n    return [\n      lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n      l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n    ];\n  }\n  equalEarthRaw.invert = function(x2, y2) {\n    var l = y2, l2 = l * l, l6 = l2 * l2 * l2;\n    for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n      fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y2;\n      fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n      l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n      if (abs$1(delta) < epsilon2) break;\n    }\n    return [\n      M * x2 * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),\n      asin$1(sin$1(l) / M)\n    ];\n  };\n  function geoEqualEarth() {\n    return projection$1(equalEarthRaw).scale(177.158);\n  }\n  function gnomonicRaw(x2, y2) {\n    var cy = cos$1(y2), k = cos$1(x2) * cy;\n    return [cy * sin$1(x2) / k, sin$1(y2) / k];\n  }\n  gnomonicRaw.invert = azimuthalInvert(atan);\n  function geoGnomonic() {\n    return projection$1(gnomonicRaw).scale(144.049).clipAngle(60);\n  }\n  function geoIdentity() {\n    var k = 1, tx2 = 0, ty2 = 0, sx = 1, sy = 1, alpha = 0, ca, sa2, x02 = null, y02, x12, y12, kx = 1, ky = 1, transform2 = transformer({\n      point: function(x2, y2) {\n        var p = projection2([x2, y2]);\n        this.stream.point(p[0], p[1]);\n      }\n    }), postclip = identity, cache2, cacheStream;\n    function reset2() {\n      kx = k * sx;\n      ky = k * sy;\n      cache2 = cacheStream = null;\n      return projection2;\n    }\n    function projection2(p) {\n      var x2 = p[0] * kx, y2 = p[1] * ky;\n      if (alpha) {\n        var t = y2 * ca - x2 * sa2;\n        x2 = x2 * ca + y2 * sa2;\n        y2 = t;\n      }\n      return [x2 + tx2, y2 + ty2];\n    }\n    projection2.invert = function(p) {\n      var x2 = p[0] - tx2, y2 = p[1] - ty2;\n      if (alpha) {\n        var t = y2 * ca + x2 * sa2;\n        x2 = x2 * ca - y2 * sa2;\n        y2 = t;\n      }\n      return [x2 / kx, y2 / ky];\n    };\n    projection2.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = transform2(postclip(cacheStream = stream2));\n    };\n    projection2.postclip = function(_) {\n      return arguments.length ? (postclip = _, x02 = y02 = x12 = y12 = null, reset2()) : postclip;\n    };\n    projection2.clipExtent = function(_) {\n      return arguments.length ? (postclip = _ == null ? (x02 = y02 = x12 = y12 = null, identity) : clipRectangle(x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset2()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    projection2.scale = function(_) {\n      return arguments.length ? (k = +_, reset2()) : k;\n    };\n    projection2.translate = function(_) {\n      return arguments.length ? (tx2 = +_[0], ty2 = +_[1], reset2()) : [tx2, ty2];\n    };\n    projection2.angle = function(_) {\n      return arguments.length ? (alpha = _ % 360 * radians, sa2 = sin$1(alpha), ca = cos$1(alpha), reset2()) : alpha * degrees;\n    };\n    projection2.reflectX = function(_) {\n      return arguments.length ? (sx = _ ? -1 : 1, reset2()) : sx < 0;\n    };\n    projection2.reflectY = function(_) {\n      return arguments.length ? (sy = _ ? -1 : 1, reset2()) : sy < 0;\n    };\n    projection2.fitExtent = function(extent2, object2) {\n      return fitExtent(projection2, extent2, object2);\n    };\n    projection2.fitSize = function(size, object2) {\n      return fitSize(projection2, size, object2);\n    };\n    projection2.fitWidth = function(width2, object2) {\n      return fitWidth(projection2, width2, object2);\n    };\n    projection2.fitHeight = function(height2, object2) {\n      return fitHeight(projection2, height2, object2);\n    };\n    return projection2;\n  }\n  function naturalEarth1Raw(lambda, phi2) {\n    var phi22 = phi2 * phi2, phi4 = phi22 * phi22;\n    return [\n      lambda * (0.8707 - 0.131979 * phi22 + phi4 * (-0.013791 + phi4 * (3971e-6 * phi22 - 1529e-6 * phi4))),\n      phi2 * (1.007226 + phi22 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi22 - 5916e-6 * phi4)))\n    ];\n  }\n  naturalEarth1Raw.invert = function(x2, y2) {\n    var phi2 = y2, i = 25, delta;\n    do {\n      var phi22 = phi2 * phi2, phi4 = phi22 * phi22;\n      phi2 -= delta = (phi2 * (1.007226 + phi22 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi22 - 5916e-6 * phi4))) - y2) / (1.007226 + phi22 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi22 - 5916e-6 * 11 * phi4)));\n    } while (abs$1(delta) > epsilon$3 && --i > 0);\n    return [\n      x2 / (0.8707 + (phi22 = phi2 * phi2) * (-0.131979 + phi22 * (-0.013791 + phi22 * phi22 * phi22 * (3971e-6 - 1529e-6 * phi22)))),\n      phi2\n    ];\n  };\n  function geoNaturalEarth1() {\n    return projection$1(naturalEarth1Raw).scale(175.295);\n  }\n  function orthographicRaw(x2, y2) {\n    return [cos$1(y2) * sin$1(x2), sin$1(y2)];\n  }\n  orthographicRaw.invert = azimuthalInvert(asin$1);\n  function geoOrthographic() {\n    return projection$1(orthographicRaw).scale(249.5).clipAngle(90 + epsilon$3);\n  }\n  function stereographicRaw(x2, y2) {\n    var cy = cos$1(y2), k = 1 + cos$1(x2) * cy;\n    return [cy * sin$1(x2) / k, sin$1(y2) / k];\n  }\n  stereographicRaw.invert = azimuthalInvert(function(z2) {\n    return 2 * atan(z2);\n  });\n  function geoStereographic() {\n    return projection$1(stereographicRaw).scale(250).clipAngle(142);\n  }\n  function transverseMercatorRaw(lambda, phi2) {\n    return [log$1(tan((halfPi$1 + phi2) / 2)), -lambda];\n  }\n  transverseMercatorRaw.invert = function(x2, y2) {\n    return [-y2, 2 * atan(exp(x2)) - halfPi$1];\n  };\n  function geoTransverseMercator() {\n    var m2 = mercatorProjection(transverseMercatorRaw), center = m2.center, rotate2 = m2.rotate;\n    m2.center = function(_) {\n      return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);\n    };\n    m2.rotate = function(_) {\n      return arguments.length ? rotate2([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate2(), [_[0], _[1], _[2] - 90]);\n    };\n    return rotate2([0, 0, 90]).scale(159.155);\n  }\n  var abs = Math.abs;\n  var cos = Math.cos;\n  var sin = Math.sin;\n  var epsilon$2 = 1e-6;\n  var pi = Math.PI;\n  var halfPi = pi / 2;\n  var sqrt2 = sqrt(2);\n  function asin(x2) {\n    return x2 > 1 ? halfPi : x2 < -1 ? -halfPi : Math.asin(x2);\n  }\n  function sqrt(x2) {\n    return x2 > 0 ? Math.sqrt(x2) : 0;\n  }\n  function mollweideBromleyTheta(cp, phi2) {\n    var cpsinPhi = cp * sin(phi2), i = 30, delta;\n    do\n      phi2 -= delta = (phi2 + sin(phi2) - cpsinPhi) / (1 + cos(phi2));\n    while (abs(delta) > epsilon$2 && --i > 0);\n    return phi2 / 2;\n  }\n  function mollweideBromleyRaw(cx, cy, cp) {\n    function forward(lambda, phi2) {\n      return [cx * lambda * cos(phi2 = mollweideBromleyTheta(cp, phi2)), cy * sin(phi2)];\n    }\n    forward.invert = function(x2, y2) {\n      return y2 = asin(y2 / cy), [x2 / (cx * cos(y2)), asin((2 * y2 + sin(2 * y2)) / cp)];\n    };\n    return forward;\n  }\n  var mollweideRaw = mollweideBromleyRaw(sqrt2 / halfPi, sqrt2, pi);\n  function geoMollweide() {\n    return projection$1(mollweideRaw).scale(169.529);\n  }\n  const defaultPath = geoPath();\n  const projectionProperties = [\n    // standard properties in d3-geo\n    \"clipAngle\",\n    \"clipExtent\",\n    \"scale\",\n    \"translate\",\n    \"center\",\n    \"rotate\",\n    \"parallels\",\n    \"precision\",\n    \"reflectX\",\n    \"reflectY\",\n    // extended properties in d3-geo-projections\n    \"coefficient\",\n    \"distance\",\n    \"fraction\",\n    \"lobes\",\n    \"parallel\",\n    \"radius\",\n    \"ratio\",\n    \"spacing\",\n    \"tilt\"\n  ];\n  function create$1(type2, constructor) {\n    return function projection2() {\n      const p = constructor();\n      p.type = type2;\n      p.path = geoPath().projection(p);\n      p.copy = p.copy || function() {\n        const c2 = projection2();\n        projectionProperties.forEach((prop) => {\n          if (p[prop]) c2[prop](p[prop]());\n        });\n        c2.path.pointRadius(p.path.pointRadius());\n        return c2;\n      };\n      return registerScale(p);\n    };\n  }\n  function projection(type2, proj) {\n    if (!type2 || typeof type2 !== \"string\") {\n      throw new Error(\"Projection type must be a name string.\");\n    }\n    type2 = type2.toLowerCase();\n    if (arguments.length > 1) {\n      projections[type2] = create$1(type2, proj);\n      return this;\n    } else {\n      return projections[type2] || null;\n    }\n  }\n  function getProjectionPath(proj) {\n    return proj && proj.path || defaultPath;\n  }\n  const projections = {\n    // base d3-geo projection types\n    albers: geoAlbers,\n    albersusa: geoAlbersUsa,\n    azimuthalequalarea: geoAzimuthalEqualArea,\n    azimuthalequidistant: geoAzimuthalEquidistant,\n    conicconformal: geoConicConformal,\n    conicequalarea: geoConicEqualArea,\n    conicequidistant: geoConicEquidistant,\n    equalEarth: geoEqualEarth,\n    equirectangular: geoEquirectangular,\n    gnomonic: geoGnomonic,\n    identity: geoIdentity,\n    mercator: geoMercator,\n    mollweide: geoMollweide,\n    naturalEarth1: geoNaturalEarth1,\n    orthographic: geoOrthographic,\n    stereographic: geoStereographic,\n    transversemercator: geoTransverseMercator\n  };\n  for (const key2 in projections) {\n    projection(key2, projections[key2]);\n  }\n  function noop$1() {\n  }\n  const cases = [[], [[[1, 1.5], [0.5, 1]]], [[[1.5, 1], [1, 1.5]]], [[[1.5, 1], [0.5, 1]]], [[[1, 0.5], [1.5, 1]]], [[[1, 1.5], [0.5, 1]], [[1, 0.5], [1.5, 1]]], [[[1, 0.5], [1, 1.5]]], [[[1, 0.5], [0.5, 1]]], [[[0.5, 1], [1, 0.5]]], [[[1, 1.5], [1, 0.5]]], [[[0.5, 1], [1, 0.5]], [[1.5, 1], [1, 1.5]]], [[[1.5, 1], [1, 0.5]]], [[[0.5, 1], [1.5, 1]]], [[[1, 1.5], [1.5, 1]]], [[[0.5, 1], [1, 1.5]]], []];\n  function contours() {\n    var dx = 1, dy = 1, smooth = smoothLinear;\n    function contours2(values2, tz) {\n      return tz.map((value2) => contour(values2, value2));\n    }\n    function contour(values2, value2) {\n      var polygons = [], holes = [];\n      isorings(values2, value2, (ring) => {\n        smooth(ring, values2, value2);\n        if (area(ring) > 0) polygons.push([ring]);\n        else holes.push(ring);\n      });\n      holes.forEach((hole) => {\n        for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\n          if (contains((polygon = polygons[i])[0], hole) !== -1) {\n            polygon.push(hole);\n            return;\n          }\n        }\n      });\n      return {\n        type: \"MultiPolygon\",\n        value: value2,\n        coordinates: polygons\n      };\n    }\n    function isorings(values2, value2, callback) {\n      var fragmentByStart = [], fragmentByEnd = [], x2, y2, t02, t12, t22, t32;\n      x2 = y2 = -1;\n      t12 = values2[0] >= value2;\n      cases[t12 << 1].forEach(stitch2);\n      while (++x2 < dx - 1) {\n        t02 = t12, t12 = values2[x2 + 1] >= value2;\n        cases[t02 | t12 << 1].forEach(stitch2);\n      }\n      cases[t12 << 0].forEach(stitch2);\n      while (++y2 < dy - 1) {\n        x2 = -1;\n        t12 = values2[y2 * dx + dx] >= value2;\n        t22 = values2[y2 * dx] >= value2;\n        cases[t12 << 1 | t22 << 2].forEach(stitch2);\n        while (++x2 < dx - 1) {\n          t02 = t12, t12 = values2[y2 * dx + dx + x2 + 1] >= value2;\n          t32 = t22, t22 = values2[y2 * dx + x2 + 1] >= value2;\n          cases[t02 | t12 << 1 | t22 << 2 | t32 << 3].forEach(stitch2);\n        }\n        cases[t12 | t22 << 3].forEach(stitch2);\n      }\n      x2 = -1;\n      t22 = values2[y2 * dx] >= value2;\n      cases[t22 << 2].forEach(stitch2);\n      while (++x2 < dx - 1) {\n        t32 = t22, t22 = values2[y2 * dx + x2 + 1] >= value2;\n        cases[t22 << 2 | t32 << 3].forEach(stitch2);\n      }\n      cases[t22 << 3].forEach(stitch2);\n      function stitch2(line2) {\n        var start = [line2[0][0] + x2, line2[0][1] + y2], end = [line2[1][0] + x2, line2[1][1] + y2], startIndex = index2(start), endIndex = index2(end), f, g;\n        if (f = fragmentByEnd[startIndex]) {\n          if (g = fragmentByStart[endIndex]) {\n            delete fragmentByEnd[f.end];\n            delete fragmentByStart[g.start];\n            if (f === g) {\n              f.ring.push(end);\n              callback(f.ring);\n            } else {\n              fragmentByStart[f.start] = fragmentByEnd[g.end] = {\n                start: f.start,\n                end: g.end,\n                ring: f.ring.concat(g.ring)\n              };\n            }\n          } else {\n            delete fragmentByEnd[f.end];\n            f.ring.push(end);\n            fragmentByEnd[f.end = endIndex] = f;\n          }\n        } else if (f = fragmentByStart[endIndex]) {\n          if (g = fragmentByEnd[startIndex]) {\n            delete fragmentByStart[f.start];\n            delete fragmentByEnd[g.end];\n            if (f === g) {\n              f.ring.push(end);\n              callback(f.ring);\n            } else {\n              fragmentByStart[g.start] = fragmentByEnd[f.end] = {\n                start: g.start,\n                end: f.end,\n                ring: g.ring.concat(f.ring)\n              };\n            }\n          } else {\n            delete fragmentByStart[f.start];\n            f.ring.unshift(start);\n            fragmentByStart[f.start = startIndex] = f;\n          }\n        } else {\n          fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {\n            start: startIndex,\n            end: endIndex,\n            ring: [start, end]\n          };\n        }\n      }\n    }\n    function index2(point2) {\n      return point2[0] * 2 + point2[1] * (dx + 1) * 4;\n    }\n    function smoothLinear(ring, values2, value2) {\n      ring.forEach((point2) => {\n        var x2 = point2[0], y2 = point2[1], xt = x2 | 0, yt = y2 | 0, v0, v1 = values2[yt * dx + xt];\n        if (x2 > 0 && x2 < dx && xt === x2) {\n          v0 = values2[yt * dx + xt - 1];\n          point2[0] = x2 + (value2 - v0) / (v1 - v0) - 0.5;\n        }\n        if (y2 > 0 && y2 < dy && yt === y2) {\n          v0 = values2[(yt - 1) * dx + xt];\n          point2[1] = y2 + (value2 - v0) / (v1 - v0) - 0.5;\n        }\n      });\n    }\n    contours2.contour = contour;\n    contours2.size = function(_) {\n      if (!arguments.length) return [dx, dy];\n      var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]);\n      if (!(_0 >= 0 && _1 >= 0)) error(\"invalid size\");\n      return dx = _0, dy = _1, contours2;\n    };\n    contours2.smooth = function(_) {\n      return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours2) : smooth === smoothLinear;\n    };\n    return contours2;\n  }\n  function area(ring) {\n    var i = 0, n = ring.length, area2 = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n    while (++i < n) area2 += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n    return area2;\n  }\n  function contains(ring, hole) {\n    var i = -1, n = hole.length, c2;\n    while (++i < n) if (c2 = ringContains(ring, hole[i])) return c2;\n    return 0;\n  }\n  function ringContains(ring, point2) {\n    var x2 = point2[0], y2 = point2[1], contains2 = -1;\n    for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\n      var pi2 = ring[i], xi = pi2[0], yi = pi2[1], pj = ring[j], xj = pj[0], yj = pj[1];\n      if (segmentContains(pi2, pj, point2)) return 0;\n      if (yi > y2 !== yj > y2 && x2 < (xj - xi) * (y2 - yi) / (yj - yi) + xi) contains2 = -contains2;\n    }\n    return contains2;\n  }\n  function segmentContains(a2, b2, c2) {\n    var i;\n    return collinear$1(a2, b2, c2) && within(a2[i = +(a2[0] === b2[0])], c2[i], b2[i]);\n  }\n  function collinear$1(a2, b2, c2) {\n    return (b2[0] - a2[0]) * (c2[1] - a2[1]) === (c2[0] - a2[0]) * (b2[1] - a2[1]);\n  }\n  function within(p, q, r) {\n    return p <= q && q <= r || r <= q && q <= p;\n  }\n  function quantize(k, nice2, zero2) {\n    return function(values2) {\n      var ex = extent(values2), start = zero2 ? Math.min(ex[0], 0) : ex[0], stop2 = ex[1], span2 = stop2 - start, step = nice2 ? tickStep(start, stop2, k) : span2 / (k + 1);\n      return range$3(start + step, stop2, step);\n    };\n  }\n  function Isocontour(params2) {\n    Transform.call(this, null, params2);\n  }\n  Isocontour.Definition = {\n    \"type\": \"Isocontour\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"thresholds\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"levels\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"zero\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"scale\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"translate\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"default\": \"contour\"\n    }]\n  };\n  inherits(Isocontour, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), source2 = pulse2.materialize(pulse2.SOURCE).source, field2 = _.field || identity$2, contour = contours().smooth(_.smooth !== false), tz = _.thresholds || levels(source2, field2, _), as = _.as === null ? null : _.as || \"contour\", values2 = [];\n      source2.forEach((t) => {\n        const grid2 = field2(t);\n        const paths = contour.size([grid2.width, grid2.height])(grid2.values, isArray(tz) ? tz : tz(grid2.values));\n        transformPaths(paths, grid2, t, _);\n        paths.forEach((p) => {\n          values2.push(rederive(t, ingest$1(as != null ? {\n            [as]: p\n          } : p)));\n        });\n      });\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = values2;\n      return out;\n    }\n  });\n  function levels(values2, f, _) {\n    const q = quantize(_.levels || 10, _.nice, _.zero !== false);\n    return _.resolve !== \"shared\" ? q : q(values2.map((t) => max$2(f(t).values)));\n  }\n  function transformPaths(paths, grid2, datum2, _) {\n    let s2 = _.scale || grid2.scale, t = _.translate || grid2.translate;\n    if (isFunction(s2)) s2 = s2(datum2, _);\n    if (isFunction(t)) t = t(datum2, _);\n    if ((s2 === 1 || s2 == null) && !t) return;\n    const sx = (isNumber$1(s2) ? s2 : s2[0]) || 1, sy = (isNumber$1(s2) ? s2 : s2[1]) || 1, tx2 = t && t[0] || 0, ty2 = t && t[1] || 0;\n    paths.forEach(transform$1(grid2, sx, sy, tx2, ty2));\n  }\n  function transform$1(grid2, sx, sy, tx2, ty2) {\n    const x12 = grid2.x1 || 0, y12 = grid2.y1 || 0, flip2 = sx * sy < 0;\n    function transformPolygon(coordinates) {\n      coordinates.forEach(transformRing);\n    }\n    function transformRing(coordinates) {\n      if (flip2) coordinates.reverse();\n      coordinates.forEach(transformPoint);\n    }\n    function transformPoint(coordinates) {\n      coordinates[0] = (coordinates[0] - x12) * sx + tx2;\n      coordinates[1] = (coordinates[1] - y12) * sy + ty2;\n    }\n    return function(geometry) {\n      geometry.coordinates.forEach(transformPolygon);\n      return geometry;\n    };\n  }\n  function radius(bw, data2, f) {\n    const v = bw >= 0 ? bw : estimateBandwidth(data2, f);\n    return Math.round((Math.sqrt(4 * v * v + 1) - 1) / 2);\n  }\n  function number$2(_) {\n    return isFunction(_) ? _ : constant$4(+_);\n  }\n  function density2D() {\n    var x2 = (d2) => d2[0], y2 = (d2) => d2[1], weight = one$1, bandwidth2 = [-1, -1], dx = 960, dy = 500, k = 2;\n    function density2(data2, counts) {\n      const rx = radius(bandwidth2[0], data2, x2) >> k, ry = radius(bandwidth2[1], data2, y2) >> k, ox = rx ? rx + 2 : 0, oy = ry ? ry + 2 : 0, n = 2 * ox + (dx >> k), m2 = 2 * oy + (dy >> k), values0 = new Float32Array(n * m2), values1 = new Float32Array(n * m2);\n      let values2 = values0;\n      data2.forEach((d2) => {\n        const xi = ox + (+x2(d2) >> k), yi = oy + (+y2(d2) >> k);\n        if (xi >= 0 && xi < n && yi >= 0 && yi < m2) {\n          values0[xi + yi * n] += +weight(d2);\n        }\n      });\n      if (rx > 0 && ry > 0) {\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n      } else if (rx > 0) {\n        blurX(n, m2, values0, values1, rx);\n        blurX(n, m2, values1, values0, rx);\n        blurX(n, m2, values0, values1, rx);\n        values2 = values1;\n      } else if (ry > 0) {\n        blurY(n, m2, values0, values1, ry);\n        blurY(n, m2, values1, values0, ry);\n        blurY(n, m2, values0, values1, ry);\n        values2 = values1;\n      }\n      const s2 = counts ? Math.pow(2, -2 * k) : 1 / sum$1(values2);\n      for (let i = 0, sz2 = n * m2; i < sz2; ++i) values2[i] *= s2;\n      return {\n        values: values2,\n        scale: 1 << k,\n        width: n,\n        height: m2,\n        x1: ox,\n        y1: oy,\n        x2: ox + (dx >> k),\n        y2: oy + (dy >> k)\n      };\n    }\n    density2.x = function(_) {\n      return arguments.length ? (x2 = number$2(_), density2) : x2;\n    };\n    density2.y = function(_) {\n      return arguments.length ? (y2 = number$2(_), density2) : y2;\n    };\n    density2.weight = function(_) {\n      return arguments.length ? (weight = number$2(_), density2) : weight;\n    };\n    density2.size = function(_) {\n      if (!arguments.length) return [dx, dy];\n      var _0 = +_[0], _1 = +_[1];\n      if (!(_0 >= 0 && _1 >= 0)) error(\"invalid size\");\n      return dx = _0, dy = _1, density2;\n    };\n    density2.cellSize = function(_) {\n      if (!arguments.length) return 1 << k;\n      if (!((_ = +_) >= 1)) error(\"invalid cell size\");\n      k = Math.floor(Math.log(_) / Math.LN2);\n      return density2;\n    };\n    density2.bandwidth = function(_) {\n      if (!arguments.length) return bandwidth2;\n      _ = array$4(_);\n      if (_.length === 1) _ = [+_[0], +_[0]];\n      if (_.length !== 2) error(\"invalid bandwidth\");\n      return bandwidth2 = _, density2;\n    };\n    return density2;\n  }\n  function blurX(n, m2, source2, target2, r) {\n    const w2 = (r << 1) + 1;\n    for (let j = 0; j < m2; ++j) {\n      for (let i = 0, sr = 0; i < n + r; ++i) {\n        if (i < n) {\n          sr += source2[i + j * n];\n        }\n        if (i >= r) {\n          if (i >= w2) {\n            sr -= source2[i - w2 + j * n];\n          }\n          target2[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w2 - i, w2);\n        }\n      }\n    }\n  }\n  function blurY(n, m2, source2, target2, r) {\n    const w2 = (r << 1) + 1;\n    for (let i = 0; i < n; ++i) {\n      for (let j = 0, sr = 0; j < m2 + r; ++j) {\n        if (j < m2) {\n          sr += source2[i + j * n];\n        }\n        if (j >= r) {\n          if (j >= w2) {\n            sr -= source2[i + (j - w2) * n];\n          }\n          target2[i + (j - r) * n] = sr / Math.min(j + 1, m2 - 1 + w2 - j, w2);\n        }\n      }\n    }\n  }\n  function KDE2D(params2) {\n    Transform.call(this, null, params2);\n  }\n  KDE2D.Definition = {\n    \"type\": \"KDE2D\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"weight\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"cellSize\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"counts\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"grid\"\n    }]\n  };\n  const PARAMS = [\"x\", \"y\", \"weight\", \"size\", \"cellSize\", \"bandwidth\"];\n  function params(obj2, _) {\n    PARAMS.forEach((param2) => _[param2] != null ? obj2[param2](_[param2]) : 0);\n    return obj2;\n  }\n  inherits(KDE2D, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) return pulse2.StopPropagation;\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$2(source2, _.groupby), names = (_.groupby || []).map(accessorName), kde2 = params(density2D(), _), as = _.as || \"grid\", values2 = [];\n      function set2(t, vals) {\n        for (let i = 0; i < names.length; ++i) t[names[i]] = vals[i];\n        return t;\n      }\n      values2 = groups.map((g) => ingest$1(set2({\n        [as]: kde2(g, _.counts)\n      }, g.dims)));\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = values2;\n      return out;\n    }\n  });\n  function partition$2(data2, groupby) {\n    var groups = [], get2 = (f) => f(t), map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2);\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    return groups;\n  }\n  function Contour(params2) {\n    Transform.call(this, null, params2);\n  }\n  Contour.Definition = {\n    \"type\": \"Contour\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"values\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"x\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"weight\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"cellSize\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"count\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"thresholds\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }]\n  };\n  inherits(Contour, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), contour = contours().smooth(_.smooth !== false), values2 = _.values, thresh = _.thresholds || quantize(_.count || 10, _.nice, !!values2), size = _.size, grid2, post;\n      if (!values2) {\n        values2 = pulse2.materialize(pulse2.SOURCE).source;\n        grid2 = params(density2D(), _)(values2, true);\n        post = transform$1(grid2, grid2.scale || 1, grid2.scale || 1, 0, 0);\n        size = [grid2.width, grid2.height];\n        values2 = grid2.values;\n      }\n      thresh = isArray(thresh) ? thresh : thresh(values2);\n      values2 = contour.size(size)(values2, thresh);\n      if (post) values2.forEach(post);\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = (values2 || []).map(ingest$1);\n      return out;\n    }\n  });\n  const Feature = \"Feature\";\n  const FeatureCollection = \"FeatureCollection\";\n  const MultiPoint = \"MultiPoint\";\n  function GeoJSON(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoJSON.Definition = {\n    \"type\": \"GeoJSON\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"geojson\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(GeoJSON, Transform, {\n    transform(_, pulse2) {\n      var features = this._features, points2 = this._points, fields = _.fields, lon = fields && fields[0], lat = fields && fields[1], geojson = _.geojson || !fields && identity$2, flag2 = pulse2.ADD, mod;\n      mod = _.modified() || pulse2.changed(pulse2.REM) || pulse2.modified(accessorFields(geojson)) || lon && pulse2.modified(accessorFields(lon)) || lat && pulse2.modified(accessorFields(lat));\n      if (!this.value || mod) {\n        flag2 = pulse2.SOURCE;\n        this._features = features = [];\n        this._points = points2 = [];\n      }\n      if (geojson) {\n        pulse2.visit(flag2, (t) => features.push(geojson(t)));\n      }\n      if (lon && lat) {\n        pulse2.visit(flag2, (t) => {\n          var x2 = lon(t), y2 = lat(t);\n          if (x2 != null && y2 != null && (x2 = +x2) === x2 && (y2 = +y2) === y2) {\n            points2.push([x2, y2]);\n          }\n        });\n        features = features.concat({\n          type: Feature,\n          geometry: {\n            type: MultiPoint,\n            coordinates: points2\n          }\n        });\n      }\n      this.value = {\n        type: FeatureCollection,\n        features\n      };\n    }\n  });\n  function GeoPath(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoPath.Definition = {\n    \"type\": \"GeoPath\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\"\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"pointRadius\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  inherits(GeoPath, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), path2 = this.value, field2 = _.field || identity$2, as = _.as || \"path\", flag2 = out.SOURCE;\n      if (!path2 || _.modified()) {\n        this.value = path2 = getProjectionPath(_.projection);\n        out.materialize().reflow();\n      } else {\n        flag2 = field2 === identity$2 || pulse2.modified(field2.fields) ? out.ADD_MOD : out.ADD;\n      }\n      const prev = initPath(path2, _.pointRadius);\n      out.visit(flag2, (t) => t[as] = path2(field2(t)));\n      path2.pointRadius(prev);\n      return out.modifies(as);\n    }\n  });\n  function initPath(path2, pointRadius) {\n    const prev = path2.pointRadius();\n    path2.context(null);\n    if (pointRadius != null) {\n      path2.pointRadius(pointRadius);\n    }\n    return prev;\n  }\n  function GeoPoint(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoPoint.Definition = {\n    \"type\": \"GeoPoint\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\",\n      \"required\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"x\", \"y\"]\n    }]\n  };\n  inherits(GeoPoint, Transform, {\n    transform(_, pulse2) {\n      var proj = _.projection, lon = _.fields[0], lat = _.fields[1], as = _.as || [\"x\", \"y\"], x2 = as[0], y2 = as[1], mod;\n      function set2(t) {\n        const xy = proj([lon(t), lat(t)]);\n        if (xy) {\n          t[x2] = xy[0];\n          t[y2] = xy[1];\n        } else {\n          t[x2] = void 0;\n          t[y2] = void 0;\n        }\n      }\n      if (_.modified()) {\n        pulse2 = pulse2.materialize().reflow(true).visit(pulse2.SOURCE, set2);\n      } else {\n        mod = pulse2.modified(lon.fields) || pulse2.modified(lat.fields);\n        pulse2.visit(mod ? pulse2.ADD_MOD : pulse2.ADD, set2);\n      }\n      return pulse2.modifies(as);\n    }\n  });\n  function GeoShape(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoShape.Definition = {\n    \"type\": \"GeoShape\",\n    \"metadata\": {\n      \"modifies\": true,\n      \"nomod\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\"\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"default\": \"datum\"\n    }, {\n      \"name\": \"pointRadius\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"shape\"\n    }]\n  };\n  inherits(GeoShape, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), shape2 = this.value, as = _.as || \"shape\", flag2 = out.ADD;\n      if (!shape2 || _.modified()) {\n        this.value = shape2 = shapeGenerator(getProjectionPath(_.projection), _.field || field$1(\"datum\"), _.pointRadius);\n        out.materialize().reflow();\n        flag2 = out.SOURCE;\n      }\n      out.visit(flag2, (t) => t[as] = shape2);\n      return out.modifies(as);\n    }\n  });\n  function shapeGenerator(path2, field2, pointRadius) {\n    const shape2 = pointRadius == null ? (_) => path2(field2(_)) : (_) => {\n      var prev = path2.pointRadius(), value2 = path2.pointRadius(pointRadius)(field2(_));\n      path2.pointRadius(prev);\n      return value2;\n    };\n    shape2.context = (_) => {\n      path2.context(_);\n      return shape2;\n    };\n    return shape2;\n  }\n  function Graticule(params2) {\n    Transform.call(this, [], params2);\n    this.generator = graticule();\n  }\n  Graticule.Definition = {\n    \"type\": \"Graticule\",\n    \"metadata\": {\n      \"changes\": true,\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"extent\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"extentMajor\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"extentMinor\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"stepMajor\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [90, 360]\n    }, {\n      \"name\": \"stepMinor\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [10, 10]\n    }, {\n      \"name\": \"precision\",\n      \"type\": \"number\",\n      \"default\": 2.5\n    }]\n  };\n  inherits(Graticule, Transform, {\n    transform(_, pulse2) {\n      var src = this.value, gen = this.generator, t;\n      if (!src.length || _.modified()) {\n        for (const prop in _) {\n          if (isFunction(gen[prop])) {\n            gen[prop](_[prop]);\n          }\n        }\n      }\n      t = gen();\n      if (src.length) {\n        pulse2.mod.push(replace$1(src[0], t));\n      } else {\n        pulse2.add.push(ingest$1(t));\n      }\n      src[0] = t;\n      return pulse2;\n    }\n  });\n  function Heatmap(params2) {\n    Transform.call(this, null, params2);\n  }\n  Heatmap.Definition = {\n    \"type\": \"heatmap\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"color\",\n      \"type\": \"string\",\n      \"expr\": true\n    }, {\n      \"name\": \"opacity\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"image\"\n    }]\n  };\n  inherits(Heatmap, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var source2 = pulse2.materialize(pulse2.SOURCE).source, shared = _.resolve === \"shared\", field2 = _.field || identity$2, opacity2 = opacity_(_.opacity, _), color2 = color_(_.color, _), as = _.as || \"image\", obj2 = {\n        $x: 0,\n        $y: 0,\n        $value: 0,\n        $max: shared ? max$2(source2.map((t) => max$2(field2(t).values))) : 0\n      };\n      source2.forEach((t) => {\n        const v = field2(t);\n        const o = extend({}, t, obj2);\n        if (!shared) o.$max = max$2(v.values || []);\n        t[as] = toCanvas(v, o, color2.dep ? color2 : constant$4(color2(o)), opacity2.dep ? opacity2 : constant$4(opacity2(o)));\n      });\n      return pulse2.reflow(true).modifies(as);\n    }\n  });\n  function color_(color2, _) {\n    let f;\n    if (isFunction(color2)) {\n      f = (obj2) => rgb$1(color2(obj2, _));\n      f.dep = dependency(color2);\n    } else {\n      f = constant$4(rgb$1(color2 || \"#888\"));\n    }\n    return f;\n  }\n  function opacity_(opacity2, _) {\n    let f;\n    if (isFunction(opacity2)) {\n      f = (obj2) => opacity2(obj2, _);\n      f.dep = dependency(opacity2);\n    } else if (opacity2) {\n      f = constant$4(opacity2);\n    } else {\n      f = (obj2) => obj2.$value / obj2.$max || 0;\n      f.dep = true;\n    }\n    return f;\n  }\n  function dependency(f) {\n    if (!isFunction(f)) return false;\n    const set2 = toSet(accessorFields(f));\n    return set2.$x || set2.$y || set2.$value || set2.$max;\n  }\n  function toCanvas(grid2, obj2, color2, opacity2) {\n    const n = grid2.width, m2 = grid2.height, x12 = grid2.x1 || 0, y12 = grid2.y1 || 0, x2 = grid2.x2 || n, y2 = grid2.y2 || m2, val = grid2.values, value2 = val ? (i) => val[i] : zero$1, can = domCanvas(x2 - x12, y2 - y12), ctx = can.getContext(\"2d\"), img = ctx.getImageData(0, 0, x2 - x12, y2 - y12), pix = img.data;\n    for (let j = y12, k = 0; j < y2; ++j) {\n      obj2.$y = j - y12;\n      for (let i = x12, r = j * n; i < x2; ++i, k += 4) {\n        obj2.$x = i - x12;\n        obj2.$value = value2(i + r);\n        const v = color2(obj2);\n        pix[k + 0] = v.r;\n        pix[k + 1] = v.g;\n        pix[k + 2] = v.b;\n        pix[k + 3] = ~~(255 * opacity2(obj2));\n      }\n    }\n    ctx.putImageData(img, 0, 0);\n    return can;\n  }\n  function Projection$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Projection$1, Transform, {\n    transform(_, pulse2) {\n      let proj = this.value;\n      if (!proj || _.modified(\"type\")) {\n        this.value = proj = create(_.type);\n        projectionProperties.forEach((prop) => {\n          if (_[prop] != null) set$1(proj, prop, _[prop]);\n        });\n      } else {\n        projectionProperties.forEach((prop) => {\n          if (_.modified(prop)) set$1(proj, prop, _[prop]);\n        });\n      }\n      if (_.pointRadius != null) proj.path.pointRadius(_.pointRadius);\n      if (_.fit) fit(proj, _);\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function fit(proj, _) {\n    const data2 = collectGeoJSON(_.fit);\n    _.extent ? proj.fitExtent(_.extent, data2) : _.size ? proj.fitSize(_.size, data2) : 0;\n  }\n  function create(type2) {\n    const constructor = projection((type2 || \"mercator\").toLowerCase());\n    if (!constructor) error(\"Unrecognized projection type: \" + type2);\n    return constructor();\n  }\n  function set$1(proj, key2, value2) {\n    if (isFunction(proj[key2])) proj[key2](value2);\n  }\n  function collectGeoJSON(data2) {\n    data2 = array$4(data2);\n    return data2.length === 1 ? data2[0] : {\n      type: FeatureCollection,\n      features: data2.reduce((a2, f) => a2.concat(featurize(f)), [])\n    };\n  }\n  function featurize(f) {\n    return f.type === FeatureCollection ? f.features : array$4(f).filter((d2) => d2 != null).map((d2) => d2.type === Feature ? d2 : {\n      type: Feature,\n      geometry: d2\n    });\n  }\n  const geo = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    contour: Contour,\n    geojson: GeoJSON,\n    geopath: GeoPath,\n    geopoint: GeoPoint,\n    geoshape: GeoShape,\n    graticule: Graticule,\n    heatmap: Heatmap,\n    isocontour: Isocontour,\n    kde2d: KDE2D,\n    projection: Projection$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function forceCenter(x2, y2) {\n    var nodes, strength = 1;\n    if (x2 == null) x2 = 0;\n    if (y2 == null) y2 = 0;\n    function force2() {\n      var i, n = nodes.length, node, sx = 0, sy = 0;\n      for (i = 0; i < n; ++i) {\n        node = nodes[i], sx += node.x, sy += node.y;\n      }\n      for (sx = (sx / n - x2) * strength, sy = (sy / n - y2) * strength, i = 0; i < n; ++i) {\n        node = nodes[i], node.x -= sx, node.y -= sy;\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n    };\n    force2.x = function(_) {\n      return arguments.length ? (x2 = +_, force2) : x2;\n    };\n    force2.y = function(_) {\n      return arguments.length ? (y2 = +_, force2) : y2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = +_, force2) : strength;\n    };\n    return force2;\n  }\n  function tree_add(d2) {\n    const x2 = +this._x.call(null, d2), y2 = +this._y.call(null, d2);\n    return add(this.cover(x2, y2), x2, y2, d2);\n  }\n  function add(tree2, x2, y2, d2) {\n    if (isNaN(x2) || isNaN(y2)) return tree2;\n    var parent, node = tree2._root, leaf = { data: d2 }, x02 = tree2._x0, y02 = tree2._y0, x12 = tree2._x1, y12 = tree2._y1, xm, ym, xp, yp, right, bottom, i, j;\n    if (!node) return tree2._root = leaf, tree2;\n    while (node.length) {\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n      if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree2;\n    }\n    xp = +tree2._x.call(null, node.data);\n    yp = +tree2._y.call(null, node.data);\n    if (x2 === xp && y2 === yp) return leaf.next = node, parent ? parent[i] = leaf : tree2._root = leaf, tree2;\n    do {\n      parent = parent ? parent[i] = new Array(4) : tree2._root = new Array(4);\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n    } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));\n    return parent[j] = node, parent[i] = leaf, tree2;\n  }\n  function addAll(data2) {\n    var d2, i, n = data2.length, x2, y2, xz = new Array(n), yz = new Array(n), x02 = Infinity, y02 = Infinity, x12 = -Infinity, y12 = -Infinity;\n    for (i = 0; i < n; ++i) {\n      if (isNaN(x2 = +this._x.call(null, d2 = data2[i])) || isNaN(y2 = +this._y.call(null, d2))) continue;\n      xz[i] = x2;\n      yz[i] = y2;\n      if (x2 < x02) x02 = x2;\n      if (x2 > x12) x12 = x2;\n      if (y2 < y02) y02 = y2;\n      if (y2 > y12) y12 = y2;\n    }\n    if (x02 > x12 || y02 > y12) return this;\n    this.cover(x02, y02).cover(x12, y12);\n    for (i = 0; i < n; ++i) {\n      add(this, xz[i], yz[i], data2[i]);\n    }\n    return this;\n  }\n  function tree_cover(x2, y2) {\n    if (isNaN(x2 = +x2) || isNaN(y2 = +y2)) return this;\n    var x02 = this._x0, y02 = this._y0, x12 = this._x1, y12 = this._y1;\n    if (isNaN(x02)) {\n      x12 = (x02 = Math.floor(x2)) + 1;\n      y12 = (y02 = Math.floor(y2)) + 1;\n    } else {\n      var z2 = x12 - x02 || 1, node = this._root, parent, i;\n      while (x02 > x2 || x2 >= x12 || y02 > y2 || y2 >= y12) {\n        i = (y2 < y02) << 1 | x2 < x02;\n        parent = new Array(4), parent[i] = node, node = parent, z2 *= 2;\n        switch (i) {\n          case 0:\n            x12 = x02 + z2, y12 = y02 + z2;\n            break;\n          case 1:\n            x02 = x12 - z2, y12 = y02 + z2;\n            break;\n          case 2:\n            x12 = x02 + z2, y02 = y12 - z2;\n            break;\n          case 3:\n            x02 = x12 - z2, y02 = y12 - z2;\n            break;\n        }\n      }\n      if (this._root && this._root.length) this._root = node;\n    }\n    this._x0 = x02;\n    this._y0 = y02;\n    this._x1 = x12;\n    this._y1 = y12;\n    return this;\n  }\n  function tree_data() {\n    var data2 = [];\n    this.visit(function(node) {\n      if (!node.length) do\n        data2.push(node.data);\n      while (node = node.next);\n    });\n    return data2;\n  }\n  function tree_extent(_) {\n    return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]];\n  }\n  function Quad(node, x02, y02, x12, y12) {\n    this.node = node;\n    this.x0 = x02;\n    this.y0 = y02;\n    this.x1 = x12;\n    this.y1 = y12;\n  }\n  function tree_find(x2, y2, radius2) {\n    var data2, x02 = this._x0, y02 = this._y0, x12, y12, x22, y22, x3 = this._x1, y3 = this._y1, quads = [], node = this._root, q, i;\n    if (node) quads.push(new Quad(node, x02, y02, x3, y3));\n    if (radius2 == null) radius2 = Infinity;\n    else {\n      x02 = x2 - radius2, y02 = y2 - radius2;\n      x3 = x2 + radius2, y3 = y2 + radius2;\n      radius2 *= radius2;\n    }\n    while (q = quads.pop()) {\n      if (!(node = q.node) || (x12 = q.x0) > x3 || (y12 = q.y0) > y3 || (x22 = q.x1) < x02 || (y22 = q.y1) < y02) continue;\n      if (node.length) {\n        var xm = (x12 + x22) / 2, ym = (y12 + y22) / 2;\n        quads.push(\n          new Quad(node[3], xm, ym, x22, y22),\n          new Quad(node[2], x12, ym, xm, y22),\n          new Quad(node[1], xm, y12, x22, ym),\n          new Quad(node[0], x12, y12, xm, ym)\n        );\n        if (i = (y2 >= ym) << 1 | x2 >= xm) {\n          q = quads[quads.length - 1];\n          quads[quads.length - 1] = quads[quads.length - 1 - i];\n          quads[quads.length - 1 - i] = q;\n        }\n      } else {\n        var dx = x2 - +this._x.call(null, node.data), dy = y2 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;\n        if (d2 < radius2) {\n          var d3 = Math.sqrt(radius2 = d2);\n          x02 = x2 - d3, y02 = y2 - d3;\n          x3 = x2 + d3, y3 = y2 + d3;\n          data2 = node.data;\n        }\n      }\n    }\n    return data2;\n  }\n  function tree_remove(d2) {\n    if (isNaN(x2 = +this._x.call(null, d2)) || isNaN(y2 = +this._y.call(null, d2))) return this;\n    var parent, node = this._root, retainer, previous, next, x02 = this._x0, y02 = this._y0, x12 = this._x1, y12 = this._y1, x2, y2, xm, ym, right, bottom, i, j;\n    if (!node) return this;\n    if (node.length) while (true) {\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n      if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n      if (!node.length) break;\n      if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) retainer = parent, j = i;\n    }\n    while (node.data !== d2) if (!(previous = node, node = node.next)) return this;\n    if (next = node.next) delete node.next;\n    if (previous) return next ? previous.next = next : delete previous.next, this;\n    if (!parent) return this._root = next, this;\n    next ? parent[i] = next : delete parent[i];\n    if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {\n      if (retainer) retainer[j] = node;\n      else this._root = node;\n    }\n    return this;\n  }\n  function removeAll(data2) {\n    for (var i = 0, n = data2.length; i < n; ++i) this.remove(data2[i]);\n    return this;\n  }\n  function tree_root() {\n    return this._root;\n  }\n  function tree_size() {\n    var size = 0;\n    this.visit(function(node) {\n      if (!node.length) do\n        ++size;\n      while (node = node.next);\n    });\n    return size;\n  }\n  function tree_visit(callback) {\n    var quads = [], q, node = this._root, child, x02, y02, x12, y12;\n    if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n    while (q = quads.pop()) {\n      if (!callback(node = q.node, x02 = q.x0, y02 = q.y0, x12 = q.x1, y12 = q.y1) && node.length) {\n        var xm = (x02 + x12) / 2, ym = (y02 + y12) / 2;\n        if (child = node[3]) quads.push(new Quad(child, xm, ym, x12, y12));\n        if (child = node[2]) quads.push(new Quad(child, x02, ym, xm, y12));\n        if (child = node[1]) quads.push(new Quad(child, xm, y02, x12, ym));\n        if (child = node[0]) quads.push(new Quad(child, x02, y02, xm, ym));\n      }\n    }\n    return this;\n  }\n  function tree_visitAfter(callback) {\n    var quads = [], next = [], q;\n    if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n    while (q = quads.pop()) {\n      var node = q.node;\n      if (node.length) {\n        var child, x02 = q.x0, y02 = q.y0, x12 = q.x1, y12 = q.y1, xm = (x02 + x12) / 2, ym = (y02 + y12) / 2;\n        if (child = node[0]) quads.push(new Quad(child, x02, y02, xm, ym));\n        if (child = node[1]) quads.push(new Quad(child, xm, y02, x12, ym));\n        if (child = node[2]) quads.push(new Quad(child, x02, ym, xm, y12));\n        if (child = node[3]) quads.push(new Quad(child, xm, ym, x12, y12));\n      }\n      next.push(q);\n    }\n    while (q = next.pop()) {\n      callback(q.node, q.x0, q.y0, q.x1, q.y1);\n    }\n    return this;\n  }\n  function defaultX(d2) {\n    return d2[0];\n  }\n  function tree_x(_) {\n    return arguments.length ? (this._x = _, this) : this._x;\n  }\n  function defaultY(d2) {\n    return d2[1];\n  }\n  function tree_y(_) {\n    return arguments.length ? (this._y = _, this) : this._y;\n  }\n  function quadtree(nodes, x2, y2) {\n    var tree2 = new Quadtree(x2 == null ? defaultX : x2, y2 == null ? defaultY : y2, NaN, NaN, NaN, NaN);\n    return nodes == null ? tree2 : tree2.addAll(nodes);\n  }\n  function Quadtree(x2, y2, x02, y02, x12, y12) {\n    this._x = x2;\n    this._y = y2;\n    this._x0 = x02;\n    this._y0 = y02;\n    this._x1 = x12;\n    this._y1 = y12;\n    this._root = void 0;\n  }\n  function leaf_copy(leaf) {\n    var copy2 = { data: leaf.data }, next = copy2;\n    while (leaf = leaf.next) next = next.next = { data: leaf.data };\n    return copy2;\n  }\n  var treeProto = quadtree.prototype = Quadtree.prototype;\n  treeProto.copy = function() {\n    var copy2 = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child;\n    if (!node) return copy2;\n    if (!node.length) return copy2._root = leaf_copy(node), copy2;\n    nodes = [{ source: node, target: copy2._root = new Array(4) }];\n    while (node = nodes.pop()) {\n      for (var i = 0; i < 4; ++i) {\n        if (child = node.source[i]) {\n          if (child.length) nodes.push({ source: child, target: node.target[i] = new Array(4) });\n          else node.target[i] = leaf_copy(child);\n        }\n      }\n    }\n    return copy2;\n  };\n  treeProto.add = tree_add;\n  treeProto.addAll = addAll;\n  treeProto.cover = tree_cover;\n  treeProto.data = tree_data;\n  treeProto.extent = tree_extent;\n  treeProto.find = tree_find;\n  treeProto.remove = tree_remove;\n  treeProto.removeAll = removeAll;\n  treeProto.root = tree_root;\n  treeProto.size = tree_size;\n  treeProto.visit = tree_visit;\n  treeProto.visitAfter = tree_visitAfter;\n  treeProto.x = tree_x;\n  treeProto.y = tree_y;\n  function constant$1(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  function jiggle(random2) {\n    return (random2() - 0.5) * 1e-6;\n  }\n  function x$1(d2) {\n    return d2.x + d2.vx;\n  }\n  function y$1(d2) {\n    return d2.y + d2.vy;\n  }\n  function forceCollide(radius2) {\n    var nodes, radii, random2, strength = 1, iterations2 = 1;\n    if (typeof radius2 !== \"function\") radius2 = constant$1(radius2 == null ? 1 : +radius2);\n    function force2() {\n      var i, n = nodes.length, tree2, node, xi, yi, ri, ri2;\n      for (var k = 0; k < iterations2; ++k) {\n        tree2 = quadtree(nodes, x$1, y$1).visitAfter(prepare2);\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          ri = radii[node.index], ri2 = ri * ri;\n          xi = node.x + node.vx;\n          yi = node.y + node.vy;\n          tree2.visit(apply2);\n        }\n      }\n      function apply2(quad2, x02, y02, x12, y12) {\n        var data2 = quad2.data, rj = quad2.r, r = ri + rj;\n        if (data2) {\n          if (data2.index > node.index) {\n            var x2 = xi - data2.x - data2.vx, y2 = yi - data2.y - data2.vy, l = x2 * x2 + y2 * y2;\n            if (l < r * r) {\n              if (x2 === 0) x2 = jiggle(random2), l += x2 * x2;\n              if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n              l = (r - (l = Math.sqrt(l))) / l * strength;\n              node.vx += (x2 *= l) * (r = (rj *= rj) / (ri2 + rj));\n              node.vy += (y2 *= l) * r;\n              data2.vx -= x2 * (r = 1 - r);\n              data2.vy -= y2 * r;\n            }\n          }\n          return;\n        }\n        return x02 > xi + r || x12 < xi - r || y02 > yi + r || y12 < yi - r;\n      }\n    }\n    function prepare2(quad2) {\n      if (quad2.data) return quad2.r = radii[quad2.data.index];\n      for (var i = quad2.r = 0; i < 4; ++i) {\n        if (quad2[i] && quad2[i].r > quad2.r) {\n          quad2.r = quad2[i].r;\n        }\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, node;\n      radii = new Array(n);\n      for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius2(node, i, nodes);\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.iterations = function(_) {\n      return arguments.length ? (iterations2 = +_, force2) : iterations2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = +_, force2) : strength;\n    };\n    force2.radius = function(_) {\n      return arguments.length ? (radius2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : radius2;\n    };\n    return force2;\n  }\n  function index$1(d2) {\n    return d2.index;\n  }\n  function find$1(nodeById, nodeId) {\n    var node = nodeById.get(nodeId);\n    if (!node) throw new Error(\"node not found: \" + nodeId);\n    return node;\n  }\n  function forceLink(links) {\n    var id2 = index$1, strength = defaultStrength, strengths, distance2 = constant$1(30), distances, nodes, count2, bias, random2, iterations2 = 1;\n    if (links == null) links = [];\n    function defaultStrength(link2) {\n      return 1 / Math.min(count2[link2.source.index], count2[link2.target.index]);\n    }\n    function force2(alpha) {\n      for (var k = 0, n = links.length; k < iterations2; ++k) {\n        for (var i = 0, link2, source2, target2, x2, y2, l, b2; i < n; ++i) {\n          link2 = links[i], source2 = link2.source, target2 = link2.target;\n          x2 = target2.x + target2.vx - source2.x - source2.vx || jiggle(random2);\n          y2 = target2.y + target2.vy - source2.y - source2.vy || jiggle(random2);\n          l = Math.sqrt(x2 * x2 + y2 * y2);\n          l = (l - distances[i]) / l * alpha * strengths[i];\n          x2 *= l, y2 *= l;\n          target2.vx -= x2 * (b2 = bias[i]);\n          target2.vy -= y2 * b2;\n          source2.vx += x2 * (b2 = 1 - b2);\n          source2.vy += y2 * b2;\n        }\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d2, i2) => [id2(d2, i2, nodes), d2])), link2;\n      for (i = 0, count2 = new Array(n); i < m2; ++i) {\n        link2 = links[i], link2.index = i;\n        if (typeof link2.source !== \"object\") link2.source = find$1(nodeById, link2.source);\n        if (typeof link2.target !== \"object\") link2.target = find$1(nodeById, link2.target);\n        count2[link2.source.index] = (count2[link2.source.index] || 0) + 1;\n        count2[link2.target.index] = (count2[link2.target.index] || 0) + 1;\n      }\n      for (i = 0, bias = new Array(m2); i < m2; ++i) {\n        link2 = links[i], bias[i] = count2[link2.source.index] / (count2[link2.source.index] + count2[link2.target.index]);\n      }\n      strengths = new Array(m2), initializeStrength();\n      distances = new Array(m2), initializeDistance();\n    }\n    function initializeStrength() {\n      if (!nodes) return;\n      for (var i = 0, n = links.length; i < n; ++i) {\n        strengths[i] = +strength(links[i], i, links);\n      }\n    }\n    function initializeDistance() {\n      if (!nodes) return;\n      for (var i = 0, n = links.length; i < n; ++i) {\n        distances[i] = +distance2(links[i], i, links);\n      }\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.links = function(_) {\n      return arguments.length ? (links = _, initialize2(), force2) : links;\n    };\n    force2.id = function(_) {\n      return arguments.length ? (id2 = _, force2) : id2;\n    };\n    force2.iterations = function(_) {\n      return arguments.length ? (iterations2 = +_, force2) : iterations2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initializeStrength(), force2) : strength;\n    };\n    force2.distance = function(_) {\n      return arguments.length ? (distance2 = typeof _ === \"function\" ? _ : constant$1(+_), initializeDistance(), force2) : distance2;\n    };\n    return force2;\n  }\n  var noop = { value: () => {\n  } };\n  function dispatch() {\n    for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n      if (!(t = arguments[i] + \"\") || t in _ || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n      _[t] = [];\n    }\n    return new Dispatch(_);\n  }\n  function Dispatch(_) {\n    this._ = _;\n  }\n  function parseTypenames(typenames, types2) {\n    return typenames.trim().split(/^|\\s+/).map(function(t) {\n      var name = \"\", i = t.indexOf(\".\");\n      if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n      if (t && !types2.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n      return { type: t, name };\n    });\n  }\n  Dispatch.prototype = dispatch.prototype = {\n    constructor: Dispatch,\n    on: function(typename, callback) {\n      var _ = this._, T = parseTypenames(typename + \"\", _), t, i = -1, n = T.length;\n      if (arguments.length < 2) {\n        while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n        return;\n      }\n      if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n      while (++i < n) {\n        if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n        else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n      }\n      return this;\n    },\n    copy: function() {\n      var copy2 = {}, _ = this._;\n      for (var t in _) copy2[t] = _[t].slice();\n      return new Dispatch(copy2);\n    },\n    call: function(type2, that) {\n      if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n      if (!this._.hasOwnProperty(type2)) throw new Error(\"unknown type: \" + type2);\n      for (t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n    },\n    apply: function(type2, that, args) {\n      if (!this._.hasOwnProperty(type2)) throw new Error(\"unknown type: \" + type2);\n      for (var t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n    }\n  };\n  function get(type2, name) {\n    for (var i = 0, n = type2.length, c2; i < n; ++i) {\n      if ((c2 = type2[i]).name === name) {\n        return c2.value;\n      }\n    }\n  }\n  function set(type2, name, callback) {\n    for (var i = 0, n = type2.length; i < n; ++i) {\n      if (type2[i].name === name) {\n        type2[i] = noop, type2 = type2.slice(0, i).concat(type2.slice(i + 1));\n        break;\n      }\n    }\n    if (callback != null) type2.push({ name, value: callback });\n    return type2;\n  }\n  var frame = 0, timeout = 0, interval$1 = 0, pokeDelay = 1e3, taskHead, taskTail, clockLast = 0, clockNow = 0, clockSkew = 0, clock = typeof performance === \"object\" && performance.now ? performance : Date, setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {\n    setTimeout(f, 17);\n  };\n  function now() {\n    return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n  }\n  function clearNow() {\n    clockNow = 0;\n  }\n  function Timer$1() {\n    this._call = this._time = this._next = null;\n  }\n  Timer$1.prototype = timer$1.prototype = {\n    constructor: Timer$1,\n    restart: function(callback, delay, time2) {\n      if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n      time2 = (time2 == null ? now() : +time2) + (delay == null ? 0 : +delay);\n      if (!this._next && taskTail !== this) {\n        if (taskTail) taskTail._next = this;\n        else taskHead = this;\n        taskTail = this;\n      }\n      this._call = callback;\n      this._time = time2;\n      sleep();\n    },\n    stop: function() {\n      if (this._call) {\n        this._call = null;\n        this._time = Infinity;\n        sleep();\n      }\n    }\n  };\n  function timer$1(callback, delay, time2) {\n    var t = new Timer$1();\n    t.restart(callback, delay, time2);\n    return t;\n  }\n  function timerFlush() {\n    now();\n    ++frame;\n    var t = taskHead, e;\n    while (t) {\n      if ((e = clockNow - t._time) >= 0) t._call.call(void 0, e);\n      t = t._next;\n    }\n    --frame;\n  }\n  function wake() {\n    clockNow = (clockLast = clock.now()) + clockSkew;\n    frame = timeout = 0;\n    try {\n      timerFlush();\n    } finally {\n      frame = 0;\n      nap();\n      clockNow = 0;\n    }\n  }\n  function poke() {\n    var now2 = clock.now(), delay = now2 - clockLast;\n    if (delay > pokeDelay) clockSkew -= delay, clockLast = now2;\n  }\n  function nap() {\n    var t02, t12 = taskHead, t22, time2 = Infinity;\n    while (t12) {\n      if (t12._call) {\n        if (time2 > t12._time) time2 = t12._time;\n        t02 = t12, t12 = t12._next;\n      } else {\n        t22 = t12._next, t12._next = null;\n        t12 = t02 ? t02._next = t22 : taskHead = t22;\n      }\n    }\n    taskTail = t02;\n    sleep(time2);\n  }\n  function sleep(time2) {\n    if (frame) return;\n    if (timeout) timeout = clearTimeout(timeout);\n    var delay = time2 - clockNow;\n    if (delay > 24) {\n      if (time2 < Infinity) timeout = setTimeout(wake, time2 - clock.now() - clockSkew);\n      if (interval$1) interval$1 = clearInterval(interval$1);\n    } else {\n      if (!interval$1) clockLast = clock.now(), interval$1 = setInterval(poke, pokeDelay);\n      frame = 1, setFrame(wake);\n    }\n  }\n  function interval(callback, delay, time2) {\n    var t = new Timer$1(), total = delay;\n    if (delay == null) return t.restart(callback, delay, time2), t;\n    t._restart = t.restart;\n    t.restart = function(callback2, delay2, time3) {\n      delay2 = +delay2, time3 = time3 == null ? now() : +time3;\n      t._restart(function tick(elapsed) {\n        elapsed += total;\n        t._restart(tick, total += delay2, time3);\n        callback2(elapsed);\n      }, delay2, time3);\n    };\n    t.restart(callback, delay, time2);\n    return t;\n  }\n  const a$1 = 1664525;\n  const c$1 = 1013904223;\n  const m$1 = 4294967296;\n  function lcg$1() {\n    let s2 = 1;\n    return () => (s2 = (a$1 * s2 + c$1) % m$1) / m$1;\n  }\n  function x(d2) {\n    return d2.x;\n  }\n  function y(d2) {\n    return d2.y;\n  }\n  var initialRadius = 10, initialAngle = Math.PI * (3 - Math.sqrt(5));\n  function forceSimulation(nodes) {\n    var simulation2, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer$1(step), event2 = dispatch(\"tick\", \"end\"), random2 = lcg$1();\n    if (nodes == null) nodes = [];\n    function step() {\n      tick();\n      event2.call(\"tick\", simulation2);\n      if (alpha < alphaMin) {\n        stepper.stop();\n        event2.call(\"end\", simulation2);\n      }\n    }\n    function tick(iterations2) {\n      var i, n = nodes.length, node;\n      if (iterations2 === void 0) iterations2 = 1;\n      for (var k = 0; k < iterations2; ++k) {\n        alpha += (alphaTarget - alpha) * alphaDecay;\n        forces.forEach(function(force2) {\n          force2(alpha);\n        });\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          if (node.fx == null) node.x += node.vx *= velocityDecay;\n          else node.x = node.fx, node.vx = 0;\n          if (node.fy == null) node.y += node.vy *= velocityDecay;\n          else node.y = node.fy, node.vy = 0;\n        }\n      }\n      return simulation2;\n    }\n    function initializeNodes() {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.index = i;\n        if (node.fx != null) node.x = node.fx;\n        if (node.fy != null) node.y = node.fy;\n        if (isNaN(node.x) || isNaN(node.y)) {\n          var radius2 = initialRadius * Math.sqrt(0.5 + i), angle2 = i * initialAngle;\n          node.x = radius2 * Math.cos(angle2);\n          node.y = radius2 * Math.sin(angle2);\n        }\n        if (isNaN(node.vx) || isNaN(node.vy)) {\n          node.vx = node.vy = 0;\n        }\n      }\n    }\n    function initializeForce(force2) {\n      if (force2.initialize) force2.initialize(nodes, random2);\n      return force2;\n    }\n    initializeNodes();\n    return simulation2 = {\n      tick,\n      restart: function() {\n        return stepper.restart(step), simulation2;\n      },\n      stop: function() {\n        return stepper.stop(), simulation2;\n      },\n      nodes: function(_) {\n        return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation2) : nodes;\n      },\n      alpha: function(_) {\n        return arguments.length ? (alpha = +_, simulation2) : alpha;\n      },\n      alphaMin: function(_) {\n        return arguments.length ? (alphaMin = +_, simulation2) : alphaMin;\n      },\n      alphaDecay: function(_) {\n        return arguments.length ? (alphaDecay = +_, simulation2) : +alphaDecay;\n      },\n      alphaTarget: function(_) {\n        return arguments.length ? (alphaTarget = +_, simulation2) : alphaTarget;\n      },\n      velocityDecay: function(_) {\n        return arguments.length ? (velocityDecay = 1 - _, simulation2) : 1 - velocityDecay;\n      },\n      randomSource: function(_) {\n        return arguments.length ? (random2 = _, forces.forEach(initializeForce), simulation2) : random2;\n      },\n      force: function(name, _) {\n        return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation2) : forces.get(name);\n      },\n      find: function(x2, y2, radius2) {\n        var i = 0, n = nodes.length, dx, dy, d2, node, closest;\n        if (radius2 == null) radius2 = Infinity;\n        else radius2 *= radius2;\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          dx = x2 - node.x;\n          dy = y2 - node.y;\n          d2 = dx * dx + dy * dy;\n          if (d2 < radius2) closest = node, radius2 = d2;\n        }\n        return closest;\n      },\n      on: function(name, _) {\n        return arguments.length > 1 ? (event2.on(name, _), simulation2) : event2.on(name);\n      }\n    };\n  }\n  function forceManyBody() {\n    var nodes, node, random2, alpha, strength = constant$1(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81;\n    function force2(_) {\n      var i, n = nodes.length, tree2 = quadtree(nodes, x, y).visitAfter(accumulate);\n      for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree2.visit(apply2);\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, node2;\n      strengths = new Array(n);\n      for (i = 0; i < n; ++i) node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes);\n    }\n    function accumulate(quad2) {\n      var strength2 = 0, q, c2, weight = 0, x2, y2, i;\n      if (quad2.length) {\n        for (x2 = y2 = i = 0; i < 4; ++i) {\n          if ((q = quad2[i]) && (c2 = Math.abs(q.value))) {\n            strength2 += q.value, weight += c2, x2 += c2 * q.x, y2 += c2 * q.y;\n          }\n        }\n        quad2.x = x2 / weight;\n        quad2.y = y2 / weight;\n      } else {\n        q = quad2;\n        q.x = q.data.x;\n        q.y = q.data.y;\n        do\n          strength2 += strengths[q.data.index];\n        while (q = q.next);\n      }\n      quad2.value = strength2;\n    }\n    function apply2(quad2, x12, _, x2) {\n      if (!quad2.value) return true;\n      var x3 = quad2.x - node.x, y2 = quad2.y - node.y, w2 = x2 - x12, l = x3 * x3 + y2 * y2;\n      if (w2 * w2 / theta2 < l) {\n        if (l < distanceMax2) {\n          if (x3 === 0) x3 = jiggle(random2), l += x3 * x3;\n          if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n          if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n          node.vx += x3 * quad2.value * alpha / l;\n          node.vy += y2 * quad2.value * alpha / l;\n        }\n        return true;\n      } else if (quad2.length || l >= distanceMax2) return;\n      if (quad2.data !== node || quad2.next) {\n        if (x3 === 0) x3 = jiggle(random2), l += x3 * x3;\n        if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n        if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n      }\n      do\n        if (quad2.data !== node) {\n          w2 = strengths[quad2.data.index] * alpha / l;\n          node.vx += x3 * w2;\n          node.vy += y2 * w2;\n        }\n      while (quad2 = quad2.next);\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.distanceMin = function(_) {\n      return arguments.length ? (distanceMin2 = _ * _, force2) : Math.sqrt(distanceMin2);\n    };\n    force2.distanceMax = function(_) {\n      return arguments.length ? (distanceMax2 = _ * _, force2) : Math.sqrt(distanceMax2);\n    };\n    force2.theta = function(_) {\n      return arguments.length ? (theta2 = _ * _, force2) : Math.sqrt(theta2);\n    };\n    return force2;\n  }\n  function forceX(x2) {\n    var strength = constant$1(0.1), nodes, strengths, xz;\n    if (typeof x2 !== \"function\") x2 = constant$1(x2 == null ? 0 : +x2);\n    function force2(alpha) {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length;\n      strengths = new Array(n);\n      xz = new Array(n);\n      for (i = 0; i < n; ++i) {\n        strengths[i] = isNaN(xz[i] = +x2(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.x = function(_) {\n      return arguments.length ? (x2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : x2;\n    };\n    return force2;\n  }\n  function forceY(y2) {\n    var strength = constant$1(0.1), nodes, strengths, yz;\n    if (typeof y2 !== \"function\") y2 = constant$1(y2 == null ? 0 : +y2);\n    function force2(alpha) {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length;\n      strengths = new Array(n);\n      yz = new Array(n);\n      for (i = 0; i < n; ++i) {\n        strengths[i] = isNaN(yz[i] = +y2(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.y = function(_) {\n      return arguments.length ? (y2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : y2;\n    };\n    return force2;\n  }\n  const ForceMap = {\n    center: forceCenter,\n    collide: forceCollide,\n    nbody: forceManyBody,\n    link: forceLink,\n    x: forceX,\n    y: forceY\n  };\n  const Forces = \"forces\", ForceParams = [\"alpha\", \"alphaMin\", \"alphaTarget\", \"velocityDecay\", \"forces\"], ForceConfig = [\"static\", \"iterations\"], ForceOutput = [\"x\", \"y\", \"vx\", \"vy\"];\n  function Force(params2) {\n    Transform.call(this, null, params2);\n  }\n  Force.Definition = {\n    \"type\": \"Force\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"static\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"restart\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"iterations\",\n      \"type\": \"number\",\n      \"default\": 300\n    }, {\n      \"name\": \"alpha\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"alphaMin\",\n      \"type\": \"number\",\n      \"default\": 1e-3\n    }, {\n      \"name\": \"alphaTarget\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"velocityDecay\",\n      \"type\": \"number\",\n      \"default\": 0.4\n    }, {\n      \"name\": \"forces\",\n      \"type\": \"param\",\n      \"array\": true,\n      \"params\": [{\n        \"key\": {\n          \"force\": \"center\"\n        },\n        \"params\": [{\n          \"name\": \"x\",\n          \"type\": \"number\",\n          \"default\": 0\n        }, {\n          \"name\": \"y\",\n          \"type\": \"number\",\n          \"default\": 0\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"collide\"\n        },\n        \"params\": [{\n          \"name\": \"radius\",\n          \"type\": \"number\",\n          \"expr\": true\n        }, {\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.7\n        }, {\n          \"name\": \"iterations\",\n          \"type\": \"number\",\n          \"default\": 1\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"nbody\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": -30,\n          \"expr\": true\n        }, {\n          \"name\": \"theta\",\n          \"type\": \"number\",\n          \"default\": 0.9\n        }, {\n          \"name\": \"distanceMin\",\n          \"type\": \"number\",\n          \"default\": 1\n        }, {\n          \"name\": \"distanceMax\",\n          \"type\": \"number\"\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"link\"\n        },\n        \"params\": [{\n          \"name\": \"links\",\n          \"type\": \"data\"\n        }, {\n          \"name\": \"id\",\n          \"type\": \"field\"\n        }, {\n          \"name\": \"distance\",\n          \"type\": \"number\",\n          \"default\": 30,\n          \"expr\": true\n        }, {\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"expr\": true\n        }, {\n          \"name\": \"iterations\",\n          \"type\": \"number\",\n          \"default\": 1\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"x\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.1\n        }, {\n          \"name\": \"x\",\n          \"type\": \"field\"\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"y\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.1\n        }, {\n          \"name\": \"y\",\n          \"type\": \"field\"\n        }]\n      }]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"modify\": false,\n      \"default\": ForceOutput\n    }]\n  };\n  inherits(Force, Transform, {\n    transform(_, pulse2) {\n      var sim = this.value, change2 = pulse2.changed(pulse2.ADD_REM), params2 = _.modified(ForceParams), iters = _.iterations || 300;\n      if (!sim) {\n        this.value = sim = simulation(pulse2.source, _);\n        sim.on(\"tick\", rerun(pulse2.dataflow, this));\n        if (!_.static) {\n          change2 = true;\n          sim.tick();\n        }\n        pulse2.modifies(\"index\");\n      } else {\n        if (change2) {\n          pulse2.modifies(\"index\");\n          sim.nodes(pulse2.source);\n        }\n        if (params2 || pulse2.changed(pulse2.MOD)) {\n          setup(sim, _, 0, pulse2);\n        }\n      }\n      if (params2 || change2 || _.modified(ForceConfig) || pulse2.changed() && _.restart) {\n        sim.alpha(Math.max(sim.alpha(), _.alpha || 1)).alphaDecay(1 - Math.pow(sim.alphaMin(), 1 / iters));\n        if (_.static) {\n          for (sim.stop(); --iters >= 0; ) sim.tick();\n        } else {\n          if (sim.stopped()) sim.restart();\n          if (!change2) return pulse2.StopPropagation;\n        }\n      }\n      return this.finish(_, pulse2);\n    },\n    finish(_, pulse2) {\n      const dataflow = pulse2.dataflow;\n      for (let args = this._argops, j = 0, m2 = args.length, arg; j < m2; ++j) {\n        arg = args[j];\n        if (arg.name !== Forces || arg.op._argval.force !== \"link\") {\n          continue;\n        }\n        for (var ops2 = arg.op._argops, i = 0, n = ops2.length, op; i < n; ++i) {\n          if (ops2[i].name === \"links\" && (op = ops2[i].op.source)) {\n            dataflow.pulse(op, dataflow.changeset().reflow());\n            break;\n          }\n        }\n      }\n      return pulse2.reflow(_.modified()).modifies(ForceOutput);\n    }\n  });\n  function rerun(df, op) {\n    return () => df.touch(op).run();\n  }\n  function simulation(nodes, _) {\n    const sim = forceSimulation(nodes), stop2 = sim.stop, restart = sim.restart;\n    let stopped = false;\n    sim.stopped = () => stopped;\n    sim.restart = () => (stopped = false, restart());\n    sim.stop = () => (stopped = true, stop2());\n    return setup(sim, _, true).on(\"end\", () => stopped = true);\n  }\n  function setup(sim, _, init2, pulse2) {\n    var f = array$4(_.forces), i, n, p, name;\n    for (i = 0, n = ForceParams.length; i < n; ++i) {\n      p = ForceParams[i];\n      if (p !== Forces && _.modified(p)) sim[p](_[p]);\n    }\n    for (i = 0, n = f.length; i < n; ++i) {\n      name = Forces + i;\n      p = init2 || _.modified(Forces, i) ? getForce(f[i]) : pulse2 && modified(f[i], pulse2) ? sim.force(name) : null;\n      if (p) sim.force(name, p);\n    }\n    for (n = sim.numForces || 0; i < n; ++i) {\n      sim.force(Forces + i, null);\n    }\n    sim.numForces = f.length;\n    return sim;\n  }\n  function modified(f, pulse2) {\n    var k, v;\n    for (k in f) {\n      if (isFunction(v = f[k]) && pulse2.modified(accessorFields(v))) return 1;\n    }\n    return 0;\n  }\n  function getForce(_) {\n    var f, p;\n    if (!has$1(ForceMap, _.force)) {\n      error(\"Unrecognized force: \" + _.force);\n    }\n    f = ForceMap[_.force]();\n    for (p in _) {\n      if (isFunction(f[p])) setForceParam(f[p], _[p], _);\n    }\n    return f;\n  }\n  function setForceParam(f, v, _) {\n    f(isFunction(v) ? (d2) => v(d2, _) : v);\n  }\n  const force = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    force: Force\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function defaultSeparation$2(a2, b2) {\n    return a2.parent === b2.parent ? 1 : 2;\n  }\n  function meanX(children2) {\n    return children2.reduce(meanXReduce, 0) / children2.length;\n  }\n  function meanXReduce(x2, c2) {\n    return x2 + c2.x;\n  }\n  function maxY(children2) {\n    return 1 + children2.reduce(maxYReduce, 0);\n  }\n  function maxYReduce(y2, c2) {\n    return Math.max(y2, c2.y);\n  }\n  function leafLeft(node) {\n    var children2;\n    while (children2 = node.children) node = children2[0];\n    return node;\n  }\n  function leafRight(node) {\n    var children2;\n    while (children2 = node.children) node = children2[children2.length - 1];\n    return node;\n  }\n  function cluster() {\n    var separation = defaultSeparation$2, dx = 1, dy = 1, nodeSize = false;\n    function cluster2(root) {\n      var previousNode, x2 = 0;\n      root.eachAfter(function(node) {\n        var children2 = node.children;\n        if (children2) {\n          node.x = meanX(children2);\n          node.y = maxY(children2);\n        } else {\n          node.x = previousNode ? x2 += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = leafLeft(root), right = leafRight(root), x02 = left.x - separation(left, right) / 2, x12 = right.x + separation(right, left) / 2;\n      return root.eachAfter(nodeSize ? function(node) {\n        node.x = (node.x - root.x) * dx;\n        node.y = (root.y - node.y) * dy;\n      } : function(node) {\n        node.x = (node.x - x02) / (x12 - x02) * dx;\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n      });\n    }\n    cluster2.separation = function(x2) {\n      return arguments.length ? (separation = x2, cluster2) : separation;\n    };\n    cluster2.size = function(x2) {\n      return arguments.length ? (nodeSize = false, dx = +x2[0], dy = +x2[1], cluster2) : nodeSize ? null : [dx, dy];\n    };\n    cluster2.nodeSize = function(x2) {\n      return arguments.length ? (nodeSize = true, dx = +x2[0], dy = +x2[1], cluster2) : nodeSize ? [dx, dy] : null;\n    };\n    return cluster2;\n  }\n  function count(node) {\n    var sum2 = 0, children2 = node.children, i = children2 && children2.length;\n    if (!i) sum2 = 1;\n    else while (--i >= 0) sum2 += children2[i].value;\n    node.value = sum2;\n  }\n  function node_count() {\n    return this.eachAfter(count);\n  }\n  function node_each(callback, that) {\n    let index2 = -1;\n    for (const node of this) {\n      callback.call(that, node, ++index2, this);\n    }\n    return this;\n  }\n  function node_eachBefore(callback, that) {\n    var node = this, nodes = [node], children2, i, index2 = -1;\n    while (node = nodes.pop()) {\n      callback.call(that, node, ++index2, this);\n      if (children2 = node.children) {\n        for (i = children2.length - 1; i >= 0; --i) {\n          nodes.push(children2[i]);\n        }\n      }\n    }\n    return this;\n  }\n  function node_eachAfter(callback, that) {\n    var node = this, nodes = [node], next = [], children2, i, n, index2 = -1;\n    while (node = nodes.pop()) {\n      next.push(node);\n      if (children2 = node.children) {\n        for (i = 0, n = children2.length; i < n; ++i) {\n          nodes.push(children2[i]);\n        }\n      }\n    }\n    while (node = next.pop()) {\n      callback.call(that, node, ++index2, this);\n    }\n    return this;\n  }\n  function node_find(callback, that) {\n    let index2 = -1;\n    for (const node of this) {\n      if (callback.call(that, node, ++index2, this)) {\n        return node;\n      }\n    }\n  }\n  function node_sum(value2) {\n    return this.eachAfter(function(node) {\n      var sum2 = +value2(node.data) || 0, children2 = node.children, i = children2 && children2.length;\n      while (--i >= 0) sum2 += children2[i].value;\n      node.value = sum2;\n    });\n  }\n  function node_sort(compare2) {\n    return this.eachBefore(function(node) {\n      if (node.children) {\n        node.children.sort(compare2);\n      }\n    });\n  }\n  function node_path(end) {\n    var start = this, ancestor = leastCommonAncestor(start, end), nodes = [start];\n    while (start !== ancestor) {\n      start = start.parent;\n      nodes.push(start);\n    }\n    var k = nodes.length;\n    while (end !== ancestor) {\n      nodes.splice(k, 0, end);\n      end = end.parent;\n    }\n    return nodes;\n  }\n  function leastCommonAncestor(a2, b2) {\n    if (a2 === b2) return a2;\n    var aNodes = a2.ancestors(), bNodes = b2.ancestors(), c2 = null;\n    a2 = aNodes.pop();\n    b2 = bNodes.pop();\n    while (a2 === b2) {\n      c2 = a2;\n      a2 = aNodes.pop();\n      b2 = bNodes.pop();\n    }\n    return c2;\n  }\n  function node_ancestors() {\n    var node = this, nodes = [node];\n    while (node = node.parent) {\n      nodes.push(node);\n    }\n    return nodes;\n  }\n  function node_descendants() {\n    return Array.from(this);\n  }\n  function node_leaves() {\n    var leaves = [];\n    this.eachBefore(function(node) {\n      if (!node.children) {\n        leaves.push(node);\n      }\n    });\n    return leaves;\n  }\n  function node_links() {\n    var root = this, links = [];\n    root.each(function(node) {\n      if (node !== root) {\n        links.push({ source: node.parent, target: node });\n      }\n    });\n    return links;\n  }\n  function* node_iterator() {\n    var node = this, current, next = [node], children2, i, n;\n    do {\n      current = next.reverse(), next = [];\n      while (node = current.pop()) {\n        yield node;\n        if (children2 = node.children) {\n          for (i = 0, n = children2.length; i < n; ++i) {\n            next.push(children2[i]);\n          }\n        }\n      }\n    } while (next.length);\n  }\n  function hierarchy(data2, children2) {\n    if (data2 instanceof Map) {\n      data2 = [void 0, data2];\n      if (children2 === void 0) children2 = mapChildren;\n    } else if (children2 === void 0) {\n      children2 = objectChildren;\n    }\n    var root = new Node$2(data2), node, nodes = [root], child, childs, i, n;\n    while (node = nodes.pop()) {\n      if ((childs = children2(node.data)) && (n = (childs = Array.from(childs)).length)) {\n        node.children = childs;\n        for (i = n - 1; i >= 0; --i) {\n          nodes.push(child = childs[i] = new Node$2(childs[i]));\n          child.parent = node;\n          child.depth = node.depth + 1;\n        }\n      }\n    }\n    return root.eachBefore(computeHeight);\n  }\n  function node_copy() {\n    return hierarchy(this).eachBefore(copyData);\n  }\n  function objectChildren(d2) {\n    return d2.children;\n  }\n  function mapChildren(d2) {\n    return Array.isArray(d2) ? d2[1] : null;\n  }\n  function copyData(node) {\n    if (node.data.value !== void 0) node.value = node.data.value;\n    node.data = node.data.data;\n  }\n  function computeHeight(node) {\n    var height2 = 0;\n    do\n      node.height = height2;\n    while ((node = node.parent) && node.height < ++height2);\n  }\n  function Node$2(data2) {\n    this.data = data2;\n    this.depth = this.height = 0;\n    this.parent = null;\n  }\n  Node$2.prototype = hierarchy.prototype = {\n    constructor: Node$2,\n    count: node_count,\n    each: node_each,\n    eachAfter: node_eachAfter,\n    eachBefore: node_eachBefore,\n    find: node_find,\n    sum: node_sum,\n    sort: node_sort,\n    path: node_path,\n    ancestors: node_ancestors,\n    descendants: node_descendants,\n    leaves: node_leaves,\n    links: node_links,\n    copy: node_copy,\n    [Symbol.iterator]: node_iterator\n  };\n  function optional(f) {\n    return f == null ? null : required(f);\n  }\n  function required(f) {\n    if (typeof f !== \"function\") throw new Error();\n    return f;\n  }\n  function constantZero() {\n    return 0;\n  }\n  function constant(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  const a = 1664525;\n  const c = 1013904223;\n  const m = 4294967296;\n  function lcg() {\n    let s2 = 1;\n    return () => (s2 = (a * s2 + c) % m) / m;\n  }\n  function array$2(x2) {\n    return typeof x2 === \"object\" && \"length\" in x2 ? x2 : Array.from(x2);\n  }\n  function shuffle(array2, random2) {\n    let m2 = array2.length, t, i;\n    while (m2) {\n      i = random2() * m2-- | 0;\n      t = array2[m2];\n      array2[m2] = array2[i];\n      array2[i] = t;\n    }\n    return array2;\n  }\n  function packEncloseRandom(circles, random2) {\n    var i = 0, n = (circles = shuffle(Array.from(circles), random2)).length, B2 = [], p, e;\n    while (i < n) {\n      p = circles[i];\n      if (e && enclosesWeak(e, p)) ++i;\n      else e = encloseBasis(B2 = extendBasis(B2, p)), i = 0;\n    }\n    return e;\n  }\n  function extendBasis(B2, p) {\n    var i, j;\n    if (enclosesWeakAll(p, B2)) return [p];\n    for (i = 0; i < B2.length; ++i) {\n      if (enclosesNot(p, B2[i]) && enclosesWeakAll(encloseBasis2(B2[i], p), B2)) {\n        return [B2[i], p];\n      }\n    }\n    for (i = 0; i < B2.length - 1; ++i) {\n      for (j = i + 1; j < B2.length; ++j) {\n        if (enclosesNot(encloseBasis2(B2[i], B2[j]), p) && enclosesNot(encloseBasis2(B2[i], p), B2[j]) && enclosesNot(encloseBasis2(B2[j], p), B2[i]) && enclosesWeakAll(encloseBasis3(B2[i], B2[j], p), B2)) {\n          return [B2[i], B2[j], p];\n        }\n      }\n    }\n    throw new Error();\n  }\n  function enclosesNot(a2, b2) {\n    var dr = a2.r - b2.r, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr < 0 || dr * dr < dx * dx + dy * dy;\n  }\n  function enclosesWeak(a2, b2) {\n    var dr = a2.r - b2.r + Math.max(a2.r, b2.r, 1) * 1e-9, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n  }\n  function enclosesWeakAll(a2, B2) {\n    for (var i = 0; i < B2.length; ++i) {\n      if (!enclosesWeak(a2, B2[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function encloseBasis(B2) {\n    switch (B2.length) {\n      case 1:\n        return encloseBasis1(B2[0]);\n      case 2:\n        return encloseBasis2(B2[0], B2[1]);\n      case 3:\n        return encloseBasis3(B2[0], B2[1], B2[2]);\n    }\n  }\n  function encloseBasis1(a2) {\n    return {\n      x: a2.x,\n      y: a2.y,\n      r: a2.r\n    };\n  }\n  function encloseBasis2(a2, b2) {\n    var x12 = a2.x, y12 = a2.y, r1 = a2.r, x2 = b2.x, y2 = b2.y, r2 = b2.r, x21 = x2 - x12, y21 = y2 - y12, r21 = r2 - r1, l = Math.sqrt(x21 * x21 + y21 * y21);\n    return {\n      x: (x12 + x2 + x21 / l * r21) / 2,\n      y: (y12 + y2 + y21 / l * r21) / 2,\n      r: (l + r1 + r2) / 2\n    };\n  }\n  function encloseBasis3(a2, b2, c2) {\n    var x12 = a2.x, y12 = a2.y, r1 = a2.r, x2 = b2.x, y2 = b2.y, r2 = b2.r, x3 = c2.x, y3 = c2.y, r3 = c2.r, a22 = x12 - x2, a3 = x12 - x3, b22 = y12 - y2, b3 = y12 - y3, c22 = r2 - r1, c3 = r3 - r1, d1 = x12 * x12 + y12 * y12 - r1 * r1, d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, ab = a3 * b22 - a22 * b3, xa = (b22 * d3 - b3 * d2) / (ab * 2) - x12, xb = (b3 * c22 - b22 * c3) / ab, ya = (a3 * d2 - a22 * d3) / (ab * 2) - y12, yb = (a22 * c3 - a3 * c22) / ab, A5 = xb * xb + yb * yb - 1, B2 = 2 * (r1 + xa * xb + ya * yb), C3 = xa * xa + ya * ya - r1 * r1, r = -(Math.abs(A5) > 1e-6 ? (B2 + Math.sqrt(B2 * B2 - 4 * A5 * C3)) / (2 * A5) : C3 / B2);\n    return {\n      x: x12 + xa + xb * r,\n      y: y12 + ya + yb * r,\n      r\n    };\n  }\n  function place(b2, a2, c2) {\n    var dx = b2.x - a2.x, x2, a22, dy = b2.y - a2.y, y2, b22, d2 = dx * dx + dy * dy;\n    if (d2) {\n      a22 = a2.r + c2.r, a22 *= a22;\n      b22 = b2.r + c2.r, b22 *= b22;\n      if (a22 > b22) {\n        x2 = (d2 + b22 - a22) / (2 * d2);\n        y2 = Math.sqrt(Math.max(0, b22 / d2 - x2 * x2));\n        c2.x = b2.x - x2 * dx - y2 * dy;\n        c2.y = b2.y - x2 * dy + y2 * dx;\n      } else {\n        x2 = (d2 + a22 - b22) / (2 * d2);\n        y2 = Math.sqrt(Math.max(0, a22 / d2 - x2 * x2));\n        c2.x = a2.x + x2 * dx - y2 * dy;\n        c2.y = a2.y + x2 * dy + y2 * dx;\n      }\n    } else {\n      c2.x = a2.x + c2.r;\n      c2.y = a2.y;\n    }\n  }\n  function intersects(a2, b2) {\n    var dr = a2.r + b2.r - 1e-6, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n  }\n  function score(node) {\n    var a2 = node._, b2 = node.next._, ab = a2.r + b2.r, dx = (a2.x * b2.r + b2.x * a2.r) / ab, dy = (a2.y * b2.r + b2.y * a2.r) / ab;\n    return dx * dx + dy * dy;\n  }\n  function Node$1(circle2) {\n    this._ = circle2;\n    this.next = null;\n    this.previous = null;\n  }\n  function packSiblingsRandom(circles, random2) {\n    if (!(n = (circles = array$2(circles)).length)) return 0;\n    var a2, b2, c2, n, aa, ca, i, j, k, sj, sk;\n    a2 = circles[0], a2.x = 0, a2.y = 0;\n    if (!(n > 1)) return a2.r;\n    b2 = circles[1], a2.x = -b2.r, b2.x = a2.r, b2.y = 0;\n    if (!(n > 2)) return a2.r + b2.r;\n    place(b2, a2, c2 = circles[2]);\n    a2 = new Node$1(a2), b2 = new Node$1(b2), c2 = new Node$1(c2);\n    a2.next = c2.previous = b2;\n    b2.next = a2.previous = c2;\n    c2.next = b2.previous = a2;\n    pack: for (i = 3; i < n; ++i) {\n      place(a2._, b2._, c2 = circles[i]), c2 = new Node$1(c2);\n      j = b2.next, k = a2.previous, sj = b2._.r, sk = a2._.r;\n      do {\n        if (sj <= sk) {\n          if (intersects(j._, c2._)) {\n            b2 = j, a2.next = b2, b2.previous = a2, --i;\n            continue pack;\n          }\n          sj += j._.r, j = j.next;\n        } else {\n          if (intersects(k._, c2._)) {\n            a2 = k, a2.next = b2, b2.previous = a2, --i;\n            continue pack;\n          }\n          sk += k._.r, k = k.previous;\n        }\n      } while (j !== k.next);\n      c2.previous = a2, c2.next = b2, a2.next = b2.previous = b2 = c2;\n      aa = score(a2);\n      while ((c2 = c2.next) !== b2) {\n        if ((ca = score(c2)) < aa) {\n          a2 = c2, aa = ca;\n        }\n      }\n      b2 = a2.next;\n    }\n    a2 = [b2._], c2 = b2;\n    while ((c2 = c2.next) !== b2) a2.push(c2._);\n    c2 = packEncloseRandom(a2, random2);\n    for (i = 0; i < n; ++i) a2 = circles[i], a2.x -= c2.x, a2.y -= c2.y;\n    return c2.r;\n  }\n  function defaultRadius(d2) {\n    return Math.sqrt(d2.value);\n  }\n  function pack() {\n    var radius2 = null, dx = 1, dy = 1, padding2 = constantZero;\n    function pack2(root) {\n      const random2 = lcg();\n      root.x = dx / 2, root.y = dy / 2;\n      if (radius2) {\n        root.eachBefore(radiusLeaf(radius2)).eachAfter(packChildrenRandom(padding2, 0.5, random2)).eachBefore(translateChild(1));\n      } else {\n        root.eachBefore(radiusLeaf(defaultRadius)).eachAfter(packChildrenRandom(constantZero, 1, random2)).eachAfter(packChildrenRandom(padding2, root.r / Math.min(dx, dy), random2)).eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n      }\n      return root;\n    }\n    pack2.radius = function(x2) {\n      return arguments.length ? (radius2 = optional(x2), pack2) : radius2;\n    };\n    pack2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], pack2) : [dx, dy];\n    };\n    pack2.padding = function(x2) {\n      return arguments.length ? (padding2 = typeof x2 === \"function\" ? x2 : constant(+x2), pack2) : padding2;\n    };\n    return pack2;\n  }\n  function radiusLeaf(radius2) {\n    return function(node) {\n      if (!node.children) {\n        node.r = Math.max(0, +radius2(node) || 0);\n      }\n    };\n  }\n  function packChildrenRandom(padding2, k, random2) {\n    return function(node) {\n      if (children2 = node.children) {\n        var children2, i, n = children2.length, r = padding2(node) * k || 0, e;\n        if (r) for (i = 0; i < n; ++i) children2[i].r += r;\n        e = packSiblingsRandom(children2, random2);\n        if (r) for (i = 0; i < n; ++i) children2[i].r -= r;\n        node.r = e + r;\n      }\n    };\n  }\n  function translateChild(k) {\n    return function(node) {\n      var parent = node.parent;\n      node.r *= k;\n      if (parent) {\n        node.x = parent.x + k * node.x;\n        node.y = parent.y + k * node.y;\n      }\n    };\n  }\n  function roundNode(node) {\n    node.x0 = Math.round(node.x0);\n    node.y0 = Math.round(node.y0);\n    node.x1 = Math.round(node.x1);\n    node.y1 = Math.round(node.y1);\n  }\n  function treemapDice(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (x12 - x02) / parent.value;\n    while (++i < n) {\n      node = nodes[i], node.y0 = y02, node.y1 = y12;\n      node.x0 = x02, node.x1 = x02 += node.value * k;\n    }\n  }\n  function partition$1() {\n    var dx = 1, dy = 1, padding2 = 0, round = false;\n    function partition2(root) {\n      var n = root.height + 1;\n      root.x0 = root.y0 = padding2;\n      root.x1 = dx;\n      root.y1 = dy / n;\n      root.eachBefore(positionNode(dy, n));\n      if (round) root.eachBefore(roundNode);\n      return root;\n    }\n    function positionNode(dy2, n) {\n      return function(node) {\n        if (node.children) {\n          treemapDice(node, node.x0, dy2 * (node.depth + 1) / n, node.x1, dy2 * (node.depth + 2) / n);\n        }\n        var x02 = node.x0, y02 = node.y0, x12 = node.x1 - padding2, y12 = node.y1 - padding2;\n        if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n        if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n        node.x0 = x02;\n        node.y0 = y02;\n        node.x1 = x12;\n        node.y1 = y12;\n      };\n    }\n    partition2.round = function(x2) {\n      return arguments.length ? (round = !!x2, partition2) : round;\n    };\n    partition2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], partition2) : [dx, dy];\n    };\n    partition2.padding = function(x2) {\n      return arguments.length ? (padding2 = +x2, partition2) : padding2;\n    };\n    return partition2;\n  }\n  var preroot = { depth: -1 }, ambiguous = {}, imputed = {};\n  function defaultId(d2) {\n    return d2.id;\n  }\n  function defaultParentId(d2) {\n    return d2.parentId;\n  }\n  function stratify() {\n    var id2 = defaultId, parentId = defaultParentId, path2;\n    function stratify2(data2) {\n      var nodes = Array.from(data2), currentId = id2, currentParentId = parentId, n, d2, i, root, parent, node, nodeId, nodeKey, nodeByKey = /* @__PURE__ */ new Map();\n      if (path2 != null) {\n        const I = nodes.map((d3, i2) => normalize(path2(d3, i2, data2)));\n        const P = I.map(parentof);\n        const S = new Set(I).add(\"\");\n        for (const i2 of P) {\n          if (!S.has(i2)) {\n            S.add(i2);\n            I.push(i2);\n            P.push(parentof(i2));\n            nodes.push(imputed);\n          }\n        }\n        currentId = (_, i2) => I[i2];\n        currentParentId = (_, i2) => P[i2];\n      }\n      for (i = 0, n = nodes.length; i < n; ++i) {\n        d2 = nodes[i], node = nodes[i] = new Node$2(d2);\n        if ((nodeId = currentId(d2, i, data2)) != null && (nodeId += \"\")) {\n          nodeKey = node.id = nodeId;\n          nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node);\n        }\n        if ((nodeId = currentParentId(d2, i, data2)) != null && (nodeId += \"\")) {\n          node.parent = nodeId;\n        }\n      }\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        if (nodeId = node.parent) {\n          parent = nodeByKey.get(nodeId);\n          if (!parent) throw new Error(\"missing: \" + nodeId);\n          if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n          if (parent.children) parent.children.push(node);\n          else parent.children = [node];\n          node.parent = parent;\n        } else {\n          if (root) throw new Error(\"multiple roots\");\n          root = node;\n        }\n      }\n      if (!root) throw new Error(\"no root\");\n      if (path2 != null) {\n        while (root.data === imputed && root.children.length === 1) {\n          root = root.children[0], --n;\n        }\n        for (let i2 = nodes.length - 1; i2 >= 0; --i2) {\n          node = nodes[i2];\n          if (node.data !== imputed) break;\n          node.data = null;\n        }\n      }\n      root.parent = preroot;\n      root.eachBefore(function(node2) {\n        node2.depth = node2.parent.depth + 1;\n        --n;\n      }).eachBefore(computeHeight);\n      root.parent = null;\n      if (n > 0) throw new Error(\"cycle\");\n      return root;\n    }\n    stratify2.id = function(x2) {\n      return arguments.length ? (id2 = optional(x2), stratify2) : id2;\n    };\n    stratify2.parentId = function(x2) {\n      return arguments.length ? (parentId = optional(x2), stratify2) : parentId;\n    };\n    stratify2.path = function(x2) {\n      return arguments.length ? (path2 = optional(x2), stratify2) : path2;\n    };\n    return stratify2;\n  }\n  function normalize(path2) {\n    path2 = `${path2}`;\n    let i = path2.length;\n    if (slash(path2, i - 1) && !slash(path2, i - 2)) path2 = path2.slice(0, -1);\n    return path2[0] === \"/\" ? path2 : `/${path2}`;\n  }\n  function parentof(path2) {\n    let i = path2.length;\n    if (i < 2) return \"\";\n    while (--i > 1) if (slash(path2, i)) break;\n    return path2.slice(0, i);\n  }\n  function slash(path2, i) {\n    if (path2[i] === \"/\") {\n      let k = 0;\n      while (i > 0 && path2[--i] === \"\\\\\") ++k;\n      if ((k & 1) === 0) return true;\n    }\n    return false;\n  }\n  function defaultSeparation$1(a2, b2) {\n    return a2.parent === b2.parent ? 1 : 2;\n  }\n  function nextLeft(v) {\n    var children2 = v.children;\n    return children2 ? children2[0] : v.t;\n  }\n  function nextRight(v) {\n    var children2 = v.children;\n    return children2 ? children2[children2.length - 1] : v.t;\n  }\n  function moveSubtree(wm, wp, shift) {\n    var change2 = shift / (wp.i - wm.i);\n    wp.c -= change2;\n    wp.s += shift;\n    wm.c += change2;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function executeShifts(v) {\n    var shift = 0, change2 = 0, children2 = v.children, i = children2.length, w2;\n    while (--i >= 0) {\n      w2 = children2[i];\n      w2.z += shift;\n      w2.m += shift;\n      shift += w2.s + (change2 += w2.c);\n    }\n  }\n  function nextAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  function TreeNode(node, i) {\n    this._ = node;\n    this.parent = null;\n    this.children = null;\n    this.A = null;\n    this.a = this;\n    this.z = 0;\n    this.m = 0;\n    this.c = 0;\n    this.s = 0;\n    this.t = null;\n    this.i = i;\n  }\n  TreeNode.prototype = Object.create(Node$2.prototype);\n  function treeRoot(root) {\n    var tree2 = new TreeNode(root, 0), node, nodes = [tree2], child, children2, i, n;\n    while (node = nodes.pop()) {\n      if (children2 = node._.children) {\n        node.children = new Array(n = children2.length);\n        for (i = n - 1; i >= 0; --i) {\n          nodes.push(child = node.children[i] = new TreeNode(children2[i], i));\n          child.parent = node;\n        }\n      }\n    }\n    (tree2.parent = new TreeNode(null, 0)).children = [tree2];\n    return tree2;\n  }\n  function tree$1() {\n    var separation = defaultSeparation$1, dx = 1, dy = 1, nodeSize = null;\n    function tree2(root) {\n      var t = treeRoot(root);\n      t.eachAfter(firstWalk), t.parent.m = -t.z;\n      t.eachBefore(secondWalk);\n      if (nodeSize) root.eachBefore(sizeNode);\n      else {\n        var left = root, right = root, bottom = root;\n        root.eachBefore(function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var s2 = left === right ? 1 : separation(left, right) / 2, tx2 = s2 - left.x, kx = dx / (right.x + s2 + tx2), ky = dy / (bottom.depth || 1);\n        root.eachBefore(function(node) {\n          node.x = (node.x + tx2) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return root;\n    }\n    function firstWalk(v) {\n      var children2 = v.children, siblings = v.parent.children, w2 = v.i ? siblings[v.i - 1] : null;\n      if (children2) {\n        executeShifts(v);\n        var midpoint = (children2[0].z + children2[children2.length - 1].z) / 2;\n        if (w2) {\n          v.z = w2.z + separation(v._, w2._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w2) {\n        v.z = w2.z + separation(v._, w2._);\n      }\n      v.parent.A = apportion(v, w2, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w2, ancestor) {\n      if (w2) {\n        var vip = v, vop = v, vim = w2, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n          vom = nextLeft(vom);\n          vop = nextRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !nextRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !nextLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= dx;\n      node.y = node.depth * dy;\n    }\n    tree2.separation = function(x2) {\n      return arguments.length ? (separation = x2, tree2) : separation;\n    };\n    tree2.size = function(x2) {\n      return arguments.length ? (nodeSize = false, dx = +x2[0], dy = +x2[1], tree2) : nodeSize ? null : [dx, dy];\n    };\n    tree2.nodeSize = function(x2) {\n      return arguments.length ? (nodeSize = true, dx = +x2[0], dy = +x2[1], tree2) : nodeSize ? [dx, dy] : null;\n    };\n    return tree2;\n  }\n  function treemapSlice(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (y12 - y02) / parent.value;\n    while (++i < n) {\n      node = nodes[i], node.x0 = x02, node.x1 = x12;\n      node.y0 = y02, node.y1 = y02 += node.value * k;\n    }\n  }\n  var phi = (1 + Math.sqrt(5)) / 2;\n  function squarifyRatio(ratio, parent, x02, y02, x12, y12) {\n    var rows = [], nodes = parent.children, row, nodeValue, i0 = 0, i1 = 0, n = nodes.length, dx, dy, value2 = parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta;\n    while (i0 < n) {\n      dx = x12 - x02, dy = y12 - y02;\n      do\n        sumValue = nodes[i1++].value;\n      while (!sumValue && i1 < n);\n      minValue = maxValue = sumValue;\n      alpha = Math.max(dy / dx, dx / dy) / (value2 * ratio);\n      beta = sumValue * sumValue * alpha;\n      minRatio = Math.max(maxValue / beta, beta / minValue);\n      for (; i1 < n; ++i1) {\n        sumValue += nodeValue = nodes[i1].value;\n        if (nodeValue < minValue) minValue = nodeValue;\n        if (nodeValue > maxValue) maxValue = nodeValue;\n        beta = sumValue * sumValue * alpha;\n        newRatio = Math.max(maxValue / beta, beta / minValue);\n        if (newRatio > minRatio) {\n          sumValue -= nodeValue;\n          break;\n        }\n        minRatio = newRatio;\n      }\n      rows.push(row = { value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1) });\n      if (row.dice) treemapDice(row, x02, y02, x12, value2 ? y02 += dy * sumValue / value2 : y12);\n      else treemapSlice(row, x02, y02, value2 ? x02 += dx * sumValue / value2 : x12, y12);\n      value2 -= sumValue, i0 = i1;\n    }\n    return rows;\n  }\n  const treemapSquarify = (function custom2(ratio) {\n    function squarify(parent, x02, y02, x12, y12) {\n      squarifyRatio(ratio, parent, x02, y02, x12, y12);\n    }\n    squarify.ratio = function(x2) {\n      return custom2((x2 = +x2) > 1 ? x2 : 1);\n    };\n    return squarify;\n  })(phi);\n  function treemap() {\n    var tile = treemapSquarify, round = false, dx = 1, dy = 1, paddingStack = [0], paddingInner = constantZero, paddingTop = constantZero, paddingRight = constantZero, paddingBottom = constantZero, paddingLeft = constantZero;\n    function treemap2(root) {\n      root.x0 = root.y0 = 0;\n      root.x1 = dx;\n      root.y1 = dy;\n      root.eachBefore(positionNode);\n      paddingStack = [0];\n      if (round) root.eachBefore(roundNode);\n      return root;\n    }\n    function positionNode(node) {\n      var p = paddingStack[node.depth], x02 = node.x0 + p, y02 = node.y0 + p, x12 = node.x1 - p, y12 = node.y1 - p;\n      if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n      if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n      node.x0 = x02;\n      node.y0 = y02;\n      node.x1 = x12;\n      node.y1 = y12;\n      if (node.children) {\n        p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n        x02 += paddingLeft(node) - p;\n        y02 += paddingTop(node) - p;\n        x12 -= paddingRight(node) - p;\n        y12 -= paddingBottom(node) - p;\n        if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n        if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n        tile(node, x02, y02, x12, y12);\n      }\n    }\n    treemap2.round = function(x2) {\n      return arguments.length ? (round = !!x2, treemap2) : round;\n    };\n    treemap2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], treemap2) : [dx, dy];\n    };\n    treemap2.tile = function(x2) {\n      return arguments.length ? (tile = required(x2), treemap2) : tile;\n    };\n    treemap2.padding = function(x2) {\n      return arguments.length ? treemap2.paddingInner(x2).paddingOuter(x2) : treemap2.paddingInner();\n    };\n    treemap2.paddingInner = function(x2) {\n      return arguments.length ? (paddingInner = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingInner;\n    };\n    treemap2.paddingOuter = function(x2) {\n      return arguments.length ? treemap2.paddingTop(x2).paddingRight(x2).paddingBottom(x2).paddingLeft(x2) : treemap2.paddingTop();\n    };\n    treemap2.paddingTop = function(x2) {\n      return arguments.length ? (paddingTop = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingTop;\n    };\n    treemap2.paddingRight = function(x2) {\n      return arguments.length ? (paddingRight = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingRight;\n    };\n    treemap2.paddingBottom = function(x2) {\n      return arguments.length ? (paddingBottom = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingBottom;\n    };\n    treemap2.paddingLeft = function(x2) {\n      return arguments.length ? (paddingLeft = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingLeft;\n    };\n    return treemap2;\n  }\n  function treemapBinary(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, i, n = nodes.length, sum2, sums = new Array(n + 1);\n    for (sums[0] = sum2 = i = 0; i < n; ++i) {\n      sums[i + 1] = sum2 += nodes[i].value;\n    }\n    partition2(0, n, parent.value, x02, y02, x12, y12);\n    function partition2(i2, j, value2, x03, y03, x13, y13) {\n      if (i2 >= j - 1) {\n        var node = nodes[i2];\n        node.x0 = x03, node.y0 = y03;\n        node.x1 = x13, node.y1 = y13;\n        return;\n      }\n      var valueOffset = sums[i2], valueTarget = value2 / 2 + valueOffset, k = i2 + 1, hi = j - 1;\n      while (k < hi) {\n        var mid = k + hi >>> 1;\n        if (sums[mid] < valueTarget) k = mid + 1;\n        else hi = mid;\n      }\n      if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i2 + 1 < k) --k;\n      var valueLeft = sums[k] - valueOffset, valueRight = value2 - valueLeft;\n      if (x13 - x03 > y13 - y03) {\n        var xk = value2 ? (x03 * valueRight + x13 * valueLeft) / value2 : x13;\n        partition2(i2, k, valueLeft, x03, y03, xk, y13);\n        partition2(k, j, valueRight, xk, y03, x13, y13);\n      } else {\n        var yk = value2 ? (y03 * valueRight + y13 * valueLeft) / value2 : y13;\n        partition2(i2, k, valueLeft, x03, y03, x13, yk);\n        partition2(k, j, valueRight, x03, yk, x13, y13);\n      }\n    }\n  }\n  function treemapSliceDice(parent, x02, y02, x12, y12) {\n    (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x02, y02, x12, y12);\n  }\n  const treemapResquarify = (function custom2(ratio) {\n    function resquarify(parent, x02, y02, x12, y12) {\n      if ((rows = parent._squarify) && rows.ratio === ratio) {\n        var rows, row, nodes, i, j = -1, n, m2 = rows.length, value2 = parent.value;\n        while (++j < m2) {\n          row = rows[j], nodes = row.children;\n          for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n          if (row.dice) treemapDice(row, x02, y02, x12, value2 ? y02 += (y12 - y02) * row.value / value2 : y12);\n          else treemapSlice(row, x02, y02, value2 ? x02 += (x12 - x02) * row.value / value2 : x12, y12);\n          value2 -= row.value;\n        }\n      } else {\n        parent._squarify = rows = squarifyRatio(ratio, parent, x02, y02, x12, y12);\n        rows.ratio = ratio;\n      }\n    }\n    resquarify.ratio = function(x2) {\n      return custom2((x2 = +x2) > 1 ? x2 : 1);\n    };\n    return resquarify;\n  })(phi);\n  function lookup$2(tree2, key2, filter2) {\n    const map2 = {};\n    tree2.each((node) => {\n      const t = node.data;\n      if (filter2(t)) map2[key2(t)] = node;\n    });\n    tree2.lookup = map2;\n    return tree2;\n  }\n  function Nest(params2) {\n    Transform.call(this, null, params2);\n  }\n  Nest.Definition = {\n    \"type\": \"Nest\",\n    \"metadata\": {\n      \"treesource\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"keys\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"generate\",\n      \"type\": \"boolean\"\n    }]\n  };\n  const children$1 = (n) => n.values;\n  inherits(Nest, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source) {\n        error(\"Nest transform requires an upstream data source.\");\n      }\n      var gen = _.generate, mod = _.modified(), out = pulse2.clone(), tree2 = this.value;\n      if (!tree2 || mod || pulse2.changed()) {\n        if (tree2) {\n          tree2.each((node) => {\n            if (node.children && isTuple(node.data)) {\n              out.rem.push(node.data);\n            }\n          });\n        }\n        this.value = tree2 = hierarchy({\n          values: array$4(_.keys).reduce((n, k) => {\n            n.key(k);\n            return n;\n          }, nest()).entries(out.source)\n        }, children$1);\n        if (gen) {\n          tree2.each((node) => {\n            if (node.children) {\n              node = ingest$1(node.data);\n              out.add.push(node);\n              out.source.push(node);\n            }\n          });\n        }\n        lookup$2(tree2, tupleid, tupleid);\n      }\n      out.source.root = tree2;\n      return out;\n    }\n  });\n  function nest() {\n    const keys2 = [], nest2 = {\n      entries: (array2) => entries(apply2(array2, 0), 0),\n      key: (d2) => (keys2.push(d2), nest2)\n    };\n    function apply2(array2, depth) {\n      if (depth >= keys2.length) {\n        return array2;\n      }\n      const n = array2.length, key2 = keys2[depth++], valuesByKey = {}, result = {};\n      let i = -1, keyValue, value2, values2;\n      while (++i < n) {\n        keyValue = key2(value2 = array2[i]) + \"\";\n        if (values2 = valuesByKey[keyValue]) {\n          values2.push(value2);\n        } else {\n          valuesByKey[keyValue] = [value2];\n        }\n      }\n      for (keyValue in valuesByKey) {\n        result[keyValue] = apply2(valuesByKey[keyValue], depth);\n      }\n      return result;\n    }\n    function entries(map2, depth) {\n      if (++depth > keys2.length) return map2;\n      const array2 = [];\n      for (const key2 in map2) {\n        array2.push({\n          key: key2,\n          values: entries(map2[key2], depth)\n        });\n      }\n      return array2;\n    }\n    return nest2;\n  }\n  function HierarchyLayout(params2) {\n    Transform.call(this, null, params2);\n  }\n  const defaultSeparation = (a2, b2) => a2.parent === b2.parent ? 1 : 2;\n  inherits(HierarchyLayout, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source || !pulse2.source.root) {\n        error(this.constructor.name + \" transform requires a backing tree data source.\");\n      }\n      const layout = this.layout(_.method), fields = this.fields, root = pulse2.source.root, as = _.as || fields;\n      if (_.field) root.sum(_.field);\n      else root.count();\n      if (_.sort) root.sort(stableCompare(_.sort, (d2) => d2.data));\n      setParams(layout, this.params, _);\n      if (layout.separation) {\n        layout.separation(_.separation !== false ? defaultSeparation : one$1);\n      }\n      try {\n        this.value = layout(root);\n      } catch (err) {\n        error(err);\n      }\n      root.each((node) => setFields(node, fields, as));\n      return pulse2.reflow(_.modified()).modifies(as).modifies(\"leaf\");\n    }\n  });\n  function setParams(layout, params2, _) {\n    for (let p, i = 0, n = params2.length; i < n; ++i) {\n      p = params2[i];\n      if (p in _) layout[p](_[p]);\n    }\n  }\n  function setFields(node, fields, as) {\n    const t = node.data, n = fields.length - 1;\n    for (let i = 0; i < n; ++i) {\n      t[as[i]] = node[fields[i]];\n    }\n    t[as[n]] = node.children ? node.children.length : 0;\n  }\n  const Output$3 = [\"x\", \"y\", \"r\", \"depth\", \"children\"];\n  function Pack(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Pack.Definition = {\n    \"type\": \"Pack\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"radius\",\n      \"type\": \"field\",\n      \"default\": null\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$3.length,\n      \"default\": Output$3\n    }]\n  };\n  inherits(Pack, HierarchyLayout, {\n    layout: pack,\n    params: [\"radius\", \"size\", \"padding\"],\n    fields: Output$3\n  });\n  const Output$2 = [\"x0\", \"y0\", \"x1\", \"y1\", \"depth\", \"children\"];\n  function Partition(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Partition.Definition = {\n    \"type\": \"Partition\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"round\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$2.length,\n      \"default\": Output$2\n    }]\n  };\n  inherits(Partition, HierarchyLayout, {\n    layout: partition$1,\n    params: [\"size\", \"round\", \"padding\"],\n    fields: Output$2\n  });\n  function Stratify(params2) {\n    Transform.call(this, null, params2);\n  }\n  Stratify.Definition = {\n    \"type\": \"Stratify\",\n    \"metadata\": {\n      \"treesource\": true\n    },\n    \"params\": [{\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"parentKey\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  };\n  inherits(Stratify, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source) {\n        error(\"Stratify transform requires an upstream data source.\");\n      }\n      let tree2 = this.value;\n      const mod = _.modified(), out = pulse2.fork(pulse2.ALL).materialize(pulse2.SOURCE), run2 = !tree2 || mod || pulse2.changed(pulse2.ADD_REM) || pulse2.modified(_.key.fields) || pulse2.modified(_.parentKey.fields);\n      out.source = out.source.slice();\n      if (run2) {\n        tree2 = out.source.length ? lookup$2(stratify().id(_.key).parentId(_.parentKey)(out.source), _.key, truthy) : lookup$2(stratify()([{}]), _.key, _.key);\n      }\n      out.source.root = this.value = tree2;\n      return out;\n    }\n  });\n  const Layouts = {\n    tidy: tree$1,\n    cluster\n  };\n  const Output$1$1 = [\"x\", \"y\", \"depth\", \"children\"];\n  function Tree(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Tree.Definition = {\n    \"type\": \"Tree\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"tidy\",\n      \"values\": [\"tidy\", \"cluster\"]\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"nodeSize\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"separation\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$1$1.length,\n      \"default\": Output$1$1\n    }]\n  };\n  inherits(Tree, HierarchyLayout, {\n    /**\n     * Tree layout generator. Supports both 'tidy' and 'cluster' layouts.\n     */\n    layout(method2) {\n      const m2 = method2 || \"tidy\";\n      if (has$1(Layouts, m2)) return Layouts[m2]();\n      else error(\"Unrecognized Tree layout method: \" + m2);\n    },\n    params: [\"size\", \"nodeSize\"],\n    fields: Output$1$1\n  });\n  function TreeLinks(params2) {\n    Transform.call(this, [], params2);\n  }\n  TreeLinks.Definition = {\n    \"type\": \"TreeLinks\",\n    \"metadata\": {\n      \"tree\": true,\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": []\n  };\n  inherits(TreeLinks, Transform, {\n    transform(_, pulse2) {\n      const links = this.value, tree2 = pulse2.source && pulse2.source.root, out = pulse2.fork(pulse2.NO_SOURCE), lut = {};\n      if (!tree2) error(\"TreeLinks transform requires a tree data source.\");\n      if (pulse2.changed(pulse2.ADD_REM)) {\n        out.rem = links;\n        pulse2.visit(pulse2.SOURCE, (t) => lut[tupleid(t)] = 1);\n        tree2.each((node) => {\n          const t = node.data, p = node.parent && node.parent.data;\n          if (p && lut[tupleid(t)] && lut[tupleid(p)]) {\n            out.add.push(ingest$1({\n              source: p,\n              target: t\n            }));\n          }\n        });\n        this.value = out.add;\n      } else if (pulse2.changed(pulse2.MOD)) {\n        pulse2.visit(pulse2.MOD, (t) => lut[tupleid(t)] = 1);\n        links.forEach((link2) => {\n          if (lut[tupleid(link2.source)] || lut[tupleid(link2.target)]) {\n            out.mod.push(link2);\n          }\n        });\n      }\n      return out;\n    }\n  });\n  const Tiles = {\n    binary: treemapBinary,\n    dice: treemapDice,\n    slice: treemapSlice,\n    slicedice: treemapSliceDice,\n    squarify: treemapSquarify,\n    resquarify: treemapResquarify\n  };\n  const Output$4 = [\"x0\", \"y0\", \"x1\", \"y1\", \"depth\", \"children\"];\n  function Treemap(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Treemap.Definition = {\n    \"type\": \"Treemap\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"squarify\",\n      \"values\": [\"squarify\", \"resquarify\", \"binary\", \"dice\", \"slice\", \"slicedice\"]\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingInner\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingOuter\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingTop\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingRight\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingBottom\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingLeft\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"ratio\",\n      \"type\": \"number\",\n      \"default\": 1.618033988749895\n    }, {\n      \"name\": \"round\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$4.length,\n      \"default\": Output$4\n    }]\n  };\n  inherits(Treemap, HierarchyLayout, {\n    /**\n     * Treemap layout generator. Adds 'method' and 'ratio' parameters\n     * to configure the underlying tile method.\n     */\n    layout() {\n      const x2 = treemap();\n      x2.ratio = (_) => {\n        const t = x2.tile();\n        if (t.ratio) x2.tile(t.ratio(_));\n      };\n      x2.method = (_) => {\n        if (has$1(Tiles, _)) x2.tile(Tiles[_]);\n        else error(\"Unrecognized Treemap layout method: \" + _);\n      };\n      return x2;\n    },\n    params: [\"method\", \"ratio\", \"size\", \"round\", \"padding\", \"paddingInner\", \"paddingOuter\", \"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"],\n    fields: Output$4\n  });\n  const tree = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    nest: Nest,\n    pack: Pack,\n    partition: Partition,\n    stratify: Stratify,\n    tree: Tree,\n    treelinks: TreeLinks,\n    treemap: Treemap\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const ALPHA_MASK = 4278190080;\n  function baseBitmaps($2, data2) {\n    const bitmap = $2.bitmap();\n    (data2 || []).forEach((d2) => bitmap.set($2(d2.boundary[0]), $2(d2.boundary[3])));\n    return [bitmap, void 0];\n  }\n  function markBitmaps($2, baseMark, avoidMarks, labelInside, isGroupArea) {\n    const width2 = $2.width, height2 = $2.height, border = labelInside || isGroupArea, context2 = domCanvas(width2, height2).getContext(\"2d\"), baseMarkContext = domCanvas(width2, height2).getContext(\"2d\"), strokeContext = border && domCanvas(width2, height2).getContext(\"2d\");\n    avoidMarks.forEach((items) => draw(context2, items, false));\n    draw(baseMarkContext, baseMark, false);\n    if (border) {\n      draw(strokeContext, baseMark, true);\n    }\n    const buffer = getBuffer(context2, width2, height2), baseMarkBuffer = getBuffer(baseMarkContext, width2, height2), strokeBuffer = border && getBuffer(strokeContext, width2, height2), layer1 = $2.bitmap(), layer2 = border && $2.bitmap();\n    let x2, y2, u2, v, index2, alpha, strokeAlpha, baseMarkAlpha;\n    for (y2 = 0; y2 < height2; ++y2) {\n      for (x2 = 0; x2 < width2; ++x2) {\n        index2 = y2 * width2 + x2;\n        alpha = buffer[index2] & ALPHA_MASK;\n        baseMarkAlpha = baseMarkBuffer[index2] & ALPHA_MASK;\n        strokeAlpha = border && strokeBuffer[index2] & ALPHA_MASK;\n        if (alpha || strokeAlpha || baseMarkAlpha) {\n          u2 = $2(x2);\n          v = $2(y2);\n          if (!isGroupArea && (alpha || baseMarkAlpha)) layer1.set(u2, v);\n          if (border && (alpha || strokeAlpha)) layer2.set(u2, v);\n        }\n      }\n    }\n    return [layer1, layer2];\n  }\n  function getBuffer(context2, width2, height2) {\n    return new Uint32Array(context2.getImageData(0, 0, width2, height2).data.buffer);\n  }\n  function draw(context2, items, interior) {\n    if (!items.length) return;\n    const type2 = items[0].mark.marktype;\n    if (type2 === \"group\") {\n      items.forEach((group2) => {\n        group2.items.forEach((mark) => draw(context2, mark.items, interior));\n      });\n    } else {\n      Marks[type2].draw(context2, {\n        items: interior ? items.map(prepare) : items\n      });\n    }\n  }\n  function prepare(source2) {\n    const item = rederive(source2, {});\n    if (item.stroke && item.strokeOpacity !== 0 || item.fill && item.fillOpacity !== 0) {\n      return {\n        ...item,\n        strokeOpacity: 1,\n        stroke: \"#000\",\n        fillOpacity: 0\n      };\n    }\n    return item;\n  }\n  const DIV = 5, MOD = 31, SIZE = 32, RIGHT0 = new Uint32Array(SIZE + 1), RIGHT1 = new Uint32Array(SIZE + 1);\n  RIGHT1[0] = 0;\n  RIGHT0[0] = ~RIGHT1[0];\n  for (let i = 1; i <= SIZE; ++i) {\n    RIGHT1[i] = RIGHT1[i - 1] << 1 | 1;\n    RIGHT0[i] = ~RIGHT1[i];\n  }\n  function Bitmap(w2, h2) {\n    const array2 = new Uint32Array(~~((w2 * h2 + SIZE) / SIZE));\n    function _set(index2, mask) {\n      array2[index2] |= mask;\n    }\n    function _clear(index2, mask) {\n      array2[index2] &= mask;\n    }\n    return {\n      array: array2,\n      get: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        return array2[index2 >>> DIV] & 1 << (index2 & MOD);\n      },\n      set: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        _set(index2 >>> DIV, 1 << (index2 & MOD));\n      },\n      clear: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        _clear(index2 >>> DIV, ~(1 << (index2 & MOD)));\n      },\n      getRange: (x2, y2, x22, y22) => {\n        let r = y22, start, end, indexStart, indexEnd;\n        for (; r >= y2; --r) {\n          start = r * w2 + x2;\n          end = r * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            if (array2[indexStart] & RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]) {\n              return true;\n            }\n          } else {\n            if (array2[indexStart] & RIGHT0[start & MOD]) return true;\n            if (array2[indexEnd] & RIGHT1[(end & MOD) + 1]) return true;\n            for (let i = indexStart + 1; i < indexEnd; ++i) {\n              if (array2[i]) return true;\n            }\n          }\n        }\n        return false;\n      },\n      setRange: (x2, y2, x22, y22) => {\n        let start, end, indexStart, indexEnd, i;\n        for (; y2 <= y22; ++y2) {\n          start = y2 * w2 + x2;\n          end = y2 * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            _set(indexStart, RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]);\n          } else {\n            _set(indexStart, RIGHT0[start & MOD]);\n            _set(indexEnd, RIGHT1[(end & MOD) + 1]);\n            for (i = indexStart + 1; i < indexEnd; ++i) _set(i, 4294967295);\n          }\n        }\n      },\n      clearRange: (x2, y2, x22, y22) => {\n        let start, end, indexStart, indexEnd, i;\n        for (; y2 <= y22; ++y2) {\n          start = y2 * w2 + x2;\n          end = y2 * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            _clear(indexStart, RIGHT1[start & MOD] | RIGHT0[(end & MOD) + 1]);\n          } else {\n            _clear(indexStart, RIGHT1[start & MOD]);\n            _clear(indexEnd, RIGHT0[(end & MOD) + 1]);\n            for (i = indexStart + 1; i < indexEnd; ++i) _clear(i, 0);\n          }\n        }\n      },\n      outOfBounds: (x2, y2, x22, y22) => x2 < 0 || y2 < 0 || y22 >= h2 || x22 >= w2\n    };\n  }\n  function scaler(width2, height2, padding2) {\n    const ratio = Math.max(1, Math.sqrt(width2 * height2 / 1e6)), w2 = ~~((width2 + 2 * padding2 + ratio) / ratio), h2 = ~~((height2 + 2 * padding2 + ratio) / ratio), scale2 = (_) => ~~((_ + padding2) / ratio);\n    scale2.invert = (_) => _ * ratio - padding2;\n    scale2.bitmap = () => Bitmap(w2, h2);\n    scale2.ratio = ratio;\n    scale2.padding = padding2;\n    scale2.width = width2;\n    scale2.height = height2;\n    return scale2;\n  }\n  function placeAreaLabelNaive($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height;\n    return function(d2) {\n      const items = d2.datum.datum.items[markIndex].items, n = items.length, textHeight = d2.datum.fontSize, textWidth = textMetrics.width(d2.datum, d2.datum.text);\n      let maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, areaWidth;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        x3 = (x12 + x2) / 2;\n        y3 = (y12 + y2) / 2;\n        areaWidth = Math.abs(x2 - x12 + y2 - y12);\n        if (areaWidth >= maxAreaWidth) {\n          maxAreaWidth = areaWidth;\n          d2.x = x3;\n          d2.y = y3;\n        }\n      }\n      x3 = textWidth / 2;\n      y3 = textHeight / 2;\n      x12 = d2.x - x3;\n      x2 = d2.x + x3;\n      y12 = d2.y - y3;\n      y2 = d2.y + y3;\n      d2.align = \"center\";\n      if (x12 < 0 && x2 <= width2) {\n        d2.align = \"left\";\n      } else if (0 <= x12 && width2 < x2) {\n        d2.align = \"right\";\n      }\n      d2.baseline = \"middle\";\n      if (y12 < 0 && y2 <= height2) {\n        d2.baseline = \"top\";\n      } else if (0 <= y12 && height2 < y2) {\n        d2.baseline = \"bottom\";\n      }\n      return true;\n    };\n  }\n  function outOfBounds(x2, y2, textWidth, textHeight, width2, height2) {\n    let r = textWidth / 2;\n    return x2 - r < 0 || x2 + r > width2 || y2 - (r = textHeight / 2) < 0 || y2 + r > height2;\n  }\n  function collision($2, x2, y2, textHeight, textWidth, h2, bm0, bm1) {\n    const w2 = textWidth * h2 / (textHeight * 2), x12 = $2(x2 - w2), x22 = $2(x2 + w2), y12 = $2(y2 - (h2 = h2 / 2)), y22 = $2(y2 + h2);\n    return bm0.outOfBounds(x12, y12, x22, y22) || bm0.getRange(x12, y12, x22, y22) || bm1 && bm1.getRange(x12, y12, x22, y22);\n  }\n  function placeAreaLabelReducedSearch($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1];\n    function tryLabel(_x, _y, maxSize, textWidth, textHeight) {\n      const x2 = $2.invert(_x), y2 = $2.invert(_y);\n      let lo = maxSize, hi = height2, mid;\n      if (!outOfBounds(x2, y2, textWidth, textHeight, width2, height2) && !collision($2, x2, y2, textHeight, textWidth, lo, bm0, bm1) && !collision($2, x2, y2, textHeight, textWidth, textHeight, bm0, null)) {\n        while (hi - lo >= 1) {\n          mid = (lo + hi) / 2;\n          if (collision($2, x2, y2, textHeight, textWidth, mid, bm0, bm1)) {\n            hi = mid;\n          } else {\n            lo = mid;\n          }\n        }\n        if (lo > maxSize) {\n          return [x2, y2, lo, true];\n        }\n      }\n    }\n    return function(d2) {\n      const items = d2.datum.datum.items[markIndex].items, n = items.length, textHeight = d2.datum.fontSize, textWidth = textMetrics.width(d2.datum, d2.datum.text);\n      let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, _x, _y, _x1, _xMid, _x2, _y1, _yMid, _y2, areaWidth, result, swapTmp;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        if (x12 > x2) {\n          swapTmp = x12;\n          x12 = x2;\n          x2 = swapTmp;\n        }\n        if (y12 > y2) {\n          swapTmp = y12;\n          y12 = y2;\n          y2 = swapTmp;\n        }\n        _x1 = $2(x12);\n        _x2 = $2(x2);\n        _xMid = ~~((_x1 + _x2) / 2);\n        _y1 = $2(y12);\n        _y2 = $2(y2);\n        _yMid = ~~((_y1 + _y2) / 2);\n        for (_x = _xMid; _x >= _x1; --_x) {\n          for (_y = _yMid; _y >= _y1; --_y) {\n            result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n            if (result) {\n              [d2.x, d2.y, maxSize, labelPlaced] = result;\n            }\n          }\n        }\n        for (_x = _xMid; _x <= _x2; ++_x) {\n          for (_y = _yMid; _y <= _y2; ++_y) {\n            result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n            if (result) {\n              [d2.x, d2.y, maxSize, labelPlaced] = result;\n            }\n          }\n        }\n        if (!labelPlaced && !avoidBaseMark) {\n          areaWidth = Math.abs(x2 - x12 + y2 - y12);\n          x3 = (x12 + x2) / 2;\n          y3 = (y12 + y2) / 2;\n          if (areaWidth >= maxAreaWidth && !outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            maxAreaWidth = areaWidth;\n            d2.x = x3;\n            d2.y = y3;\n            labelPlaced2 = true;\n          }\n        }\n      }\n      if (labelPlaced || labelPlaced2) {\n        x3 = textWidth / 2;\n        y3 = textHeight / 2;\n        bm0.setRange($2(d2.x - x3), $2(d2.y - y3), $2(d2.x + x3), $2(d2.y + y3));\n        d2.align = \"center\";\n        d2.baseline = \"middle\";\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n  const X_DIR = [-1, -1, 1, 1];\n  const Y_DIR = [-1, 1, -1, 1];\n  function placeAreaLabelFloodFill($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1], bm2 = $2.bitmap();\n    return function(d2) {\n      const items = d2.datum.datum.items[markIndex].items, n = items.length, textHeight = d2.datum.fontSize, textWidth = textMetrics.width(d2.datum, d2.datum.text), stack = [];\n      let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, _x, _y, lo, hi, mid, areaWidth;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        stack.push([$2((x12 + x2) / 2), $2((y12 + y2) / 2)]);\n        while (stack.length) {\n          [_x, _y] = stack.pop();\n          if (bm0.get(_x, _y) || bm1.get(_x, _y) || bm2.get(_x, _y)) continue;\n          bm2.set(_x, _y);\n          for (let j = 0; j < 4; ++j) {\n            x3 = _x + X_DIR[j];\n            y3 = _y + Y_DIR[j];\n            if (!bm2.outOfBounds(x3, y3, x3, y3)) stack.push([x3, y3]);\n          }\n          x3 = $2.invert(_x);\n          y3 = $2.invert(_y);\n          lo = maxSize;\n          hi = height2;\n          if (!outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, lo, bm0, bm1) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            while (hi - lo >= 1) {\n              mid = (lo + hi) / 2;\n              if (collision($2, x3, y3, textHeight, textWidth, mid, bm0, bm1)) {\n                hi = mid;\n              } else {\n                lo = mid;\n              }\n            }\n            if (lo > maxSize) {\n              d2.x = x3;\n              d2.y = y3;\n              maxSize = lo;\n              labelPlaced = true;\n            }\n          }\n        }\n        if (!labelPlaced && !avoidBaseMark) {\n          areaWidth = Math.abs(x2 - x12 + y2 - y12);\n          x3 = (x12 + x2) / 2;\n          y3 = (y12 + y2) / 2;\n          if (areaWidth >= maxAreaWidth && !outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            maxAreaWidth = areaWidth;\n            d2.x = x3;\n            d2.y = y3;\n            labelPlaced2 = true;\n          }\n        }\n      }\n      if (labelPlaced || labelPlaced2) {\n        x3 = textWidth / 2;\n        y3 = textHeight / 2;\n        bm0.setRange($2(d2.x - x3), $2(d2.y - y3), $2(d2.x + x3), $2(d2.y + y3));\n        d2.align = \"center\";\n        d2.baseline = \"middle\";\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n  const Aligns = [\"right\", \"center\", \"left\"], Baselines = [\"bottom\", \"middle\", \"top\"];\n  function placeMarkLabel($2, bitmaps, anchors, offsets2) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1], n = offsets2.length;\n    return function(d2) {\n      const boundary = d2.boundary, textHeight = d2.datum.fontSize;\n      if (boundary[2] < 0 || boundary[5] < 0 || boundary[0] > width2 || boundary[3] > height2) {\n        return false;\n      }\n      let textWidth = d2.textWidth ?? 0, dx, dy, isInside, sizeFactor, insideFactor, x12, x2, y12, y2, xc, yc, _x1, _x2, _y1, _y2;\n      for (let i = 0; i < n; ++i) {\n        dx = (anchors[i] & 3) - 1;\n        dy = (anchors[i] >>> 2 & 3) - 1;\n        isInside = dx === 0 && dy === 0 || offsets2[i] < 0;\n        sizeFactor = dx && dy ? Math.SQRT1_2 : 1;\n        insideFactor = offsets2[i] < 0 ? -1 : 1;\n        x12 = boundary[1 + dx] + offsets2[i] * dx * sizeFactor;\n        yc = boundary[4 + dy] + insideFactor * textHeight * dy / 2 + offsets2[i] * dy * sizeFactor;\n        y12 = yc - textHeight / 2;\n        y2 = yc + textHeight / 2;\n        _x1 = $2(x12);\n        _y1 = $2(y12);\n        _y2 = $2(y2);\n        if (!textWidth) {\n          if (!test(_x1, _x1, _y1, _y2, bm0, bm1, x12, x12, y12, y2, boundary, isInside)) {\n            continue;\n          } else {\n            textWidth = textMetrics.width(d2.datum, d2.datum.text);\n          }\n        }\n        xc = x12 + insideFactor * textWidth * dx / 2;\n        x12 = xc - textWidth / 2;\n        x2 = xc + textWidth / 2;\n        _x1 = $2(x12);\n        _x2 = $2(x2);\n        if (test(_x1, _x2, _y1, _y2, bm0, bm1, x12, x2, y12, y2, boundary, isInside)) {\n          d2.x = !dx ? xc : dx * insideFactor < 0 ? x2 : x12;\n          d2.y = !dy ? yc : dy * insideFactor < 0 ? y2 : y12;\n          d2.align = Aligns[dx * insideFactor + 1];\n          d2.baseline = Baselines[dy * insideFactor + 1];\n          bm0.setRange(_x1, _y1, _x2, _y2);\n          return true;\n        }\n      }\n      return false;\n    };\n  }\n  function test(_x1, _x2, _y1, _y2, bm0, bm1, x12, x2, y12, y2, boundary, isInside) {\n    return !(bm0.outOfBounds(_x1, _y1, _x2, _y2) || (isInside && bm1 || bm0).getRange(_x1, _y1, _x2, _y2));\n  }\n  const TOP = 0, MIDDLE = 4, BOTTOM = 8, LEFT = 0, CENTER = 1, RIGHT = 2;\n  const anchorCode = {\n    \"top-left\": TOP + LEFT,\n    \"top\": TOP + CENTER,\n    \"top-right\": TOP + RIGHT,\n    \"left\": MIDDLE + LEFT,\n    \"middle\": MIDDLE + CENTER,\n    \"right\": MIDDLE + RIGHT,\n    \"bottom-left\": BOTTOM + LEFT,\n    \"bottom\": BOTTOM + CENTER,\n    \"bottom-right\": BOTTOM + RIGHT\n  };\n  const placeAreaLabel = {\n    \"naive\": placeAreaLabelNaive,\n    \"reduced-search\": placeAreaLabelReducedSearch,\n    \"floodfill\": placeAreaLabelFloodFill\n  };\n  function labelLayout(texts, size, compare2, offset2, anchor, avoidMarks, avoidBaseMark, lineAnchor, markIndex, padding2, method2) {\n    if (!texts.length) return texts;\n    const positions2 = Math.max(offset2.length, anchor.length), offsets2 = getOffsets(offset2, positions2), anchors = getAnchors(anchor, positions2), marktype = markType(texts[0].datum), grouptype = marktype === \"group\" && texts[0].datum.items[markIndex].marktype, isGroupArea = grouptype === \"area\", boundary = markBoundary(marktype, grouptype, lineAnchor, markIndex), infPadding = padding2 === null || padding2 === Infinity, isNaiveGroupArea = isGroupArea && method2 === \"naive\";\n    let maxTextWidth = -1, maxTextHeight = -1;\n    const data2 = texts.map((d2) => {\n      const textWidth = infPadding ? textMetrics.width(d2, d2.text) : void 0;\n      maxTextWidth = Math.max(maxTextWidth, textWidth);\n      maxTextHeight = Math.max(maxTextHeight, d2.fontSize);\n      return {\n        datum: d2,\n        opacity: 0,\n        x: void 0,\n        y: void 0,\n        align: void 0,\n        baseline: void 0,\n        boundary: boundary(d2),\n        textWidth\n      };\n    });\n    padding2 = padding2 === null || padding2 === Infinity ? Math.max(maxTextWidth, maxTextHeight) + Math.max(...offset2) : padding2;\n    const $2 = scaler(size[0], size[1], padding2);\n    let bitmaps;\n    if (!isNaiveGroupArea) {\n      if (compare2) {\n        data2.sort((a2, b2) => compare2(a2.datum, b2.datum));\n      }\n      let labelInside = false;\n      for (let i = 0; i < anchors.length && !labelInside; ++i) {\n        labelInside = anchors[i] === 5 || offsets2[i] < 0;\n      }\n      const baseMark = (marktype && avoidBaseMark || isGroupArea) && texts.map((d2) => d2.datum);\n      bitmaps = avoidMarks.length || baseMark ? markBitmaps($2, baseMark || [], avoidMarks, labelInside, isGroupArea) : baseBitmaps($2, avoidBaseMark && data2);\n    }\n    const place2 = isGroupArea ? placeAreaLabel[method2]($2, bitmaps, avoidBaseMark, markIndex) : placeMarkLabel($2, bitmaps, anchors, offsets2);\n    data2.forEach((d2) => d2.opacity = +place2(d2));\n    return data2;\n  }\n  function getOffsets(_, count2) {\n    const offsets2 = new Float64Array(count2), n = _.length;\n    for (let i = 0; i < n; ++i) offsets2[i] = _[i] || 0;\n    for (let i = n; i < count2; ++i) offsets2[i] = offsets2[n - 1];\n    return offsets2;\n  }\n  function getAnchors(_, count2) {\n    const anchors = new Int8Array(count2), n = _.length;\n    for (let i = 0; i < n; ++i) anchors[i] |= anchorCode[_[i]];\n    for (let i = n; i < count2; ++i) anchors[i] = anchors[n - 1];\n    return anchors;\n  }\n  function markType(item) {\n    return item && item.mark && item.mark.marktype;\n  }\n  function markBoundary(marktype, grouptype, lineAnchor, markIndex) {\n    const xy = (d2) => [d2.x, d2.x, d2.x, d2.y, d2.y, d2.y];\n    if (!marktype) {\n      return xy;\n    } else if (marktype === \"line\" || marktype === \"area\") {\n      return (d2) => xy(d2.datum);\n    } else if (grouptype === \"line\") {\n      return (d2) => {\n        const items = d2.datum.items[markIndex].items;\n        return xy(items.length ? items[lineAnchor === \"start\" ? 0 : items.length - 1] : {\n          x: NaN,\n          y: NaN\n        });\n      };\n    } else {\n      return (d2) => {\n        const b2 = d2.datum.bounds;\n        return [b2.x1, (b2.x1 + b2.x2) / 2, b2.x2, b2.y1, (b2.y1 + b2.y2) / 2, b2.y2];\n      };\n    }\n  }\n  const Output$1 = [\"x\", \"y\", \"opacity\", \"align\", \"baseline\"];\n  const Anchors = [\"top-left\", \"left\", \"bottom-left\", \"top\", \"bottom\", \"top-right\", \"right\", \"bottom-right\"];\n  function Label$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Label$1.Definition = {\n    type: \"Label\",\n    metadata: {\n      modifies: true\n    },\n    params: [{\n      name: \"size\",\n      type: \"number\",\n      array: true,\n      length: 2,\n      required: true\n    }, {\n      name: \"sort\",\n      type: \"compare\"\n    }, {\n      name: \"anchor\",\n      type: \"string\",\n      array: true,\n      default: Anchors\n    }, {\n      name: \"offset\",\n      type: \"number\",\n      array: true,\n      default: [1]\n    }, {\n      name: \"padding\",\n      type: \"number\",\n      default: 0,\n      null: true\n    }, {\n      name: \"lineAnchor\",\n      type: \"string\",\n      values: [\"start\", \"end\"],\n      default: \"end\"\n    }, {\n      name: \"markIndex\",\n      type: \"number\",\n      default: 0\n    }, {\n      name: \"avoidBaseMark\",\n      type: \"boolean\",\n      default: true\n    }, {\n      name: \"avoidMarks\",\n      type: \"data\",\n      array: true\n    }, {\n      name: \"method\",\n      type: \"string\",\n      default: \"naive\"\n    }, {\n      name: \"as\",\n      type: \"string\",\n      array: true,\n      length: Output$1.length,\n      default: Output$1\n    }]\n  };\n  inherits(Label$1, Transform, {\n    transform(_, pulse2) {\n      function modp(param2) {\n        const p = _[param2];\n        return isFunction(p) && pulse2.modified(p.fields);\n      }\n      const mod = _.modified();\n      if (!(mod || pulse2.changed(pulse2.ADD_REM) || modp(\"sort\"))) return;\n      if (!_.size || _.size.length !== 2) {\n        error(\"Size parameter should be specified as a [width, height] array.\");\n      }\n      const as = _.as || Output$1;\n      labelLayout(pulse2.materialize(pulse2.SOURCE).source || [], _.size, _.sort, array$4(_.offset == null ? 1 : _.offset), array$4(_.anchor || Anchors), _.avoidMarks || [], _.avoidBaseMark !== false, _.lineAnchor || \"end\", _.markIndex || 0, _.padding === void 0 ? 0 : _.padding, _.method || \"naive\").forEach((l) => {\n        const t = l.datum;\n        t[as[0]] = l.x;\n        t[as[1]] = l.y;\n        t[as[2]] = l.opacity;\n        t[as[3]] = l.align;\n        t[as[4]] = l.baseline;\n      });\n      return pulse2.reflow(mod).modifies(as);\n    }\n  });\n  const label = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    label: Label$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function partition(data2, groupby) {\n    var groups = [], get2 = function(f) {\n      return f(t);\n    }, map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2);\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    return groups;\n  }\n  function Loess(params2) {\n    Transform.call(this, null, params2);\n  }\n  Loess.Definition = {\n    \"type\": \"Loess\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0.3\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Loess, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition(source2, _.groupby), names = (_.groupby || []).map(accessorName), m2 = names.length, as = _.as || [accessorName(_.x), accessorName(_.y)], values2 = [];\n        groups.forEach((g) => {\n          loess(g, _.x, _.y, _.bandwidth || 0.3).forEach((p) => {\n            const t = {};\n            for (let i = 0; i < m2; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = p[0];\n            t[as[1]] = p[1];\n            values2.push(ingest$1(t));\n          });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  const Methods = {\n    constant: constant$3,\n    linear,\n    log: log$2,\n    exp: exp$1,\n    pow: pow$2,\n    quad,\n    poly\n  };\n  const degreesOfFreedom = (method2, order) => method2 === \"poly\" ? order : method2 === \"quad\" ? 2 : 1;\n  function Regression(params2) {\n    Transform.call(this, null, params2);\n  }\n  Regression.Definition = {\n    \"type\": \"Regression\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"method\",\n      \"type\": \"string\",\n      \"default\": \"linear\",\n      \"values\": Object.keys(Methods)\n    }, {\n      \"name\": \"order\",\n      \"type\": \"number\",\n      \"default\": 3\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"params\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Regression, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition(source2, _.groupby), names = (_.groupby || []).map(accessorName), method2 = _.method || \"linear\", order = _.order == null ? 3 : _.order, dof = degreesOfFreedom(method2, order), as = _.as || [accessorName(_.x), accessorName(_.y)], fit2 = Methods[method2], values2 = [];\n        let domain2 = _.extent;\n        if (!has$1(Methods, method2)) {\n          error(\"Invalid regression method: \" + method2);\n        }\n        if (domain2 != null) {\n          if (method2 === \"log\" && domain2[0] <= 0) {\n            pulse2.dataflow.warn(\"Ignoring extent with values <= 0 for log regression.\");\n            domain2 = null;\n          }\n        }\n        groups.forEach((g) => {\n          const n = g.length;\n          if (n <= dof) {\n            pulse2.dataflow.warn(\"Skipping regression with more parameters than data points.\");\n            return;\n          }\n          const model = fit2(g, _.x, _.y, order);\n          if (_.params) {\n            values2.push(ingest$1({\n              keys: g.dims,\n              coef: model.coef,\n              rSquared: model.rSquared\n            }));\n            return;\n          }\n          const dom = domain2 || extent(g, _.x), add2 = (p) => {\n            const t = {};\n            for (let i = 0; i < names.length; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = p[0];\n            t[as[1]] = p[1];\n            values2.push(ingest$1(t));\n          };\n          if (method2 === \"linear\" || method2 === \"constant\") {\n            dom.forEach((x2) => add2([x2, model.predict(x2)]));\n          } else {\n            sampleCurve(model.predict, dom, 25, 200).forEach(add2);\n          }\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  const reg = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    loess: Loess,\n    regression: Regression\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const epsilon$1 = 11102230246251565e-32;\n  const splitter = 134217729;\n  const resulterrbound = (3 + 8 * epsilon$1) * epsilon$1;\n  function sum(elen, e, flen, f, h2) {\n    let Q, Qnew, hh, bvirt;\n    let enow = e[0];\n    let fnow = f[0];\n    let eindex = 0;\n    let findex = 0;\n    if (fnow > enow === fnow > -enow) {\n      Q = enow;\n      enow = e[++eindex];\n    } else {\n      Q = fnow;\n      fnow = f[++findex];\n    }\n    let hindex = 0;\n    if (eindex < elen && findex < flen) {\n      if (fnow > enow === fnow > -enow) {\n        Qnew = enow + Q;\n        hh = Q - (Qnew - enow);\n        enow = e[++eindex];\n      } else {\n        Qnew = fnow + Q;\n        hh = Q - (Qnew - fnow);\n        fnow = f[++findex];\n      }\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n      while (eindex < elen && findex < flen) {\n        if (fnow > enow === fnow > -enow) {\n          Qnew = Q + enow;\n          bvirt = Qnew - Q;\n          hh = Q - (Qnew - bvirt) + (enow - bvirt);\n          enow = e[++eindex];\n        } else {\n          Qnew = Q + fnow;\n          bvirt = Qnew - Q;\n          hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n          fnow = f[++findex];\n        }\n        Q = Qnew;\n        if (hh !== 0) {\n          h2[hindex++] = hh;\n        }\n      }\n    }\n    while (eindex < elen) {\n      Qnew = Q + enow;\n      bvirt = Qnew - Q;\n      hh = Q - (Qnew - bvirt) + (enow - bvirt);\n      enow = e[++eindex];\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n    }\n    while (findex < flen) {\n      Qnew = Q + fnow;\n      bvirt = Qnew - Q;\n      hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n      fnow = f[++findex];\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n    }\n    if (Q !== 0 || hindex === 0) {\n      h2[hindex++] = Q;\n    }\n    return hindex;\n  }\n  function estimate(elen, e) {\n    let Q = e[0];\n    for (let i = 1; i < elen; i++) Q += e[i];\n    return Q;\n  }\n  function vec(n) {\n    return new Float64Array(n);\n  }\n  const ccwerrboundA = (3 + 16 * epsilon$1) * epsilon$1;\n  const ccwerrboundB = (2 + 12 * epsilon$1) * epsilon$1;\n  const ccwerrboundC = (9 + 64 * epsilon$1) * epsilon$1 * epsilon$1;\n  const B = vec(4);\n  const C1 = vec(8);\n  const C2 = vec(12);\n  const D = vec(16);\n  const u = vec(4);\n  function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n    let acxtail, acytail, bcxtail, bcytail;\n    let bvirt, c2, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t12, t02, u3;\n    const acx = ax - cx;\n    const bcx = bx - cx;\n    const acy = ay - cy;\n    const bcy = by - cy;\n    s1 = acx * bcy;\n    c2 = splitter * acx;\n    ahi = c2 - (c2 - acx);\n    alo = acx - ahi;\n    c2 = splitter * bcy;\n    bhi = c2 - (c2 - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acy * bcx;\n    c2 = splitter * acy;\n    ahi = c2 - (c2 - acy);\n    alo = acy - ahi;\n    c2 = splitter * bcx;\n    bhi = c2 - (c2 - bcx);\n    blo = bcx - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    B[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    B[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    B[3] = u3;\n    let det = estimate(4, B);\n    let errbound = ccwerrboundB * detsum;\n    if (det >= errbound || -det >= errbound) {\n      return det;\n    }\n    bvirt = ax - acx;\n    acxtail = ax - (acx + bvirt) + (bvirt - cx);\n    bvirt = bx - bcx;\n    bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n    bvirt = ay - acy;\n    acytail = ay - (acy + bvirt) + (bvirt - cy);\n    bvirt = by - bcy;\n    bcytail = by - (bcy + bvirt) + (bvirt - cy);\n    if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n      return det;\n    }\n    errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n    det += acx * bcytail + bcy * acxtail - (acy * bcxtail + bcx * acytail);\n    if (det >= errbound || -det >= errbound) return det;\n    s1 = acxtail * bcy;\n    c2 = splitter * acxtail;\n    ahi = c2 - (c2 - acxtail);\n    alo = acxtail - ahi;\n    c2 = splitter * bcy;\n    bhi = c2 - (c2 - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acytail * bcx;\n    c2 = splitter * acytail;\n    ahi = c2 - (c2 - acytail);\n    alo = acytail - ahi;\n    c2 = splitter * bcx;\n    bhi = c2 - (c2 - bcx);\n    blo = bcx - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C1len = sum(4, B, 4, u, C1);\n    s1 = acx * bcytail;\n    c2 = splitter * acx;\n    ahi = c2 - (c2 - acx);\n    alo = acx - ahi;\n    c2 = splitter * bcytail;\n    bhi = c2 - (c2 - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acy * bcxtail;\n    c2 = splitter * acy;\n    ahi = c2 - (c2 - acy);\n    alo = acy - ahi;\n    c2 = splitter * bcxtail;\n    bhi = c2 - (c2 - bcxtail);\n    blo = bcxtail - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C2len = sum(C1len, C1, 4, u, C2);\n    s1 = acxtail * bcytail;\n    c2 = splitter * acxtail;\n    ahi = c2 - (c2 - acxtail);\n    alo = acxtail - ahi;\n    c2 = splitter * bcytail;\n    bhi = c2 - (c2 - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acytail * bcxtail;\n    c2 = splitter * acytail;\n    ahi = c2 - (c2 - acytail);\n    alo = acytail - ahi;\n    c2 = splitter * bcxtail;\n    bhi = c2 - (c2 - bcxtail);\n    blo = bcxtail - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const Dlen = sum(C2len, C2, 4, u, D);\n    return D[Dlen - 1];\n  }\n  function orient2d(ax, ay, bx, by, cx, cy) {\n    const detleft = (ay - cy) * (bx - cx);\n    const detright = (ax - cx) * (by - cy);\n    const det = detleft - detright;\n    const detsum = Math.abs(detleft + detright);\n    if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n    return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n  }\n  const EPSILON = Math.pow(2, -52);\n  const EDGE_STACK = new Uint32Array(512);\n  class Delaunator {\n    static from(points2, getX = defaultGetX, getY = defaultGetY) {\n      const n = points2.length;\n      const coords = new Float64Array(n * 2);\n      for (let i = 0; i < n; i++) {\n        const p = points2[i];\n        coords[2 * i] = getX(p);\n        coords[2 * i + 1] = getY(p);\n      }\n      return new Delaunator(coords);\n    }\n    constructor(coords) {\n      const n = coords.length >> 1;\n      if (n > 0 && typeof coords[0] !== \"number\") throw new Error(\"Expected coords to contain numbers.\");\n      this.coords = coords;\n      const maxTriangles = Math.max(2 * n - 5, 0);\n      this._triangles = new Uint32Array(maxTriangles * 3);\n      this._halfedges = new Int32Array(maxTriangles * 3);\n      this._hashSize = Math.ceil(Math.sqrt(n));\n      this._hullPrev = new Uint32Array(n);\n      this._hullNext = new Uint32Array(n);\n      this._hullTri = new Uint32Array(n);\n      this._hullHash = new Int32Array(this._hashSize);\n      this._ids = new Uint32Array(n);\n      this._dists = new Float64Array(n);\n      this.update();\n    }\n    update() {\n      const { coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash } = this;\n      const n = coords.length >> 1;\n      let minX = Infinity;\n      let minY = Infinity;\n      let maxX = -Infinity;\n      let maxY2 = -Infinity;\n      for (let i = 0; i < n; i++) {\n        const x2 = coords[2 * i];\n        const y2 = coords[2 * i + 1];\n        if (x2 < minX) minX = x2;\n        if (y2 < minY) minY = y2;\n        if (x2 > maxX) maxX = x2;\n        if (y2 > maxY2) maxY2 = y2;\n        this._ids[i] = i;\n      }\n      const cx = (minX + maxX) / 2;\n      const cy = (minY + maxY2) / 2;\n      let i0, i1, i2;\n      for (let i = 0, minDist = Infinity; i < n; i++) {\n        const d2 = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);\n        if (d2 < minDist) {\n          i0 = i;\n          minDist = d2;\n        }\n      }\n      const i0x = coords[2 * i0];\n      const i0y = coords[2 * i0 + 1];\n      for (let i = 0, minDist = Infinity; i < n; i++) {\n        if (i === i0) continue;\n        const d2 = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);\n        if (d2 < minDist && d2 > 0) {\n          i1 = i;\n          minDist = d2;\n        }\n      }\n      let i1x = coords[2 * i1];\n      let i1y = coords[2 * i1 + 1];\n      let minRadius = Infinity;\n      for (let i = 0; i < n; i++) {\n        if (i === i0 || i === i1) continue;\n        const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);\n        if (r < minRadius) {\n          i2 = i;\n          minRadius = r;\n        }\n      }\n      let i2x = coords[2 * i2];\n      let i2y = coords[2 * i2 + 1];\n      if (minRadius === Infinity) {\n        for (let i = 0; i < n; i++) {\n          this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];\n        }\n        quicksort(this._ids, this._dists, 0, n - 1);\n        const hull = new Uint32Array(n);\n        let j = 0;\n        for (let i = 0, d0 = -Infinity; i < n; i++) {\n          const id2 = this._ids[i];\n          const d2 = this._dists[id2];\n          if (d2 > d0) {\n            hull[j++] = id2;\n            d0 = d2;\n          }\n        }\n        this.hull = hull.subarray(0, j);\n        this.triangles = new Uint32Array(0);\n        this.halfedges = new Uint32Array(0);\n        return;\n      }\n      if (orient2d(i0x, i0y, i1x, i1y, i2x, i2y) < 0) {\n        const i = i1;\n        const x2 = i1x;\n        const y2 = i1y;\n        i1 = i2;\n        i1x = i2x;\n        i1y = i2y;\n        i2 = i;\n        i2x = x2;\n        i2y = y2;\n      }\n      const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n      this._cx = center.x;\n      this._cy = center.y;\n      for (let i = 0; i < n; i++) {\n        this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);\n      }\n      quicksort(this._ids, this._dists, 0, n - 1);\n      this._hullStart = i0;\n      let hullSize = 3;\n      hullNext[i0] = hullPrev[i2] = i1;\n      hullNext[i1] = hullPrev[i0] = i2;\n      hullNext[i2] = hullPrev[i1] = i0;\n      hullTri[i0] = 0;\n      hullTri[i1] = 1;\n      hullTri[i2] = 2;\n      hullHash.fill(-1);\n      hullHash[this._hashKey(i0x, i0y)] = i0;\n      hullHash[this._hashKey(i1x, i1y)] = i1;\n      hullHash[this._hashKey(i2x, i2y)] = i2;\n      this.trianglesLen = 0;\n      this._addTriangle(i0, i1, i2, -1, -1, -1);\n      for (let k = 0, xp, yp; k < this._ids.length; k++) {\n        const i = this._ids[k];\n        const x2 = coords[2 * i];\n        const y2 = coords[2 * i + 1];\n        if (k > 0 && Math.abs(x2 - xp) <= EPSILON && Math.abs(y2 - yp) <= EPSILON) continue;\n        xp = x2;\n        yp = y2;\n        if (i === i0 || i === i1 || i === i2) continue;\n        let start = 0;\n        for (let j = 0, key2 = this._hashKey(x2, y2); j < this._hashSize; j++) {\n          start = hullHash[(key2 + j) % this._hashSize];\n          if (start !== -1 && start !== hullNext[start]) break;\n        }\n        start = hullPrev[start];\n        let e = start, q;\n        while (q = hullNext[e], orient2d(x2, y2, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]) >= 0) {\n          e = q;\n          if (e === start) {\n            e = -1;\n            break;\n          }\n        }\n        if (e === -1) continue;\n        let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n        hullTri[i] = this._legalize(t + 2);\n        hullTri[e] = t;\n        hullSize++;\n        let n2 = hullNext[e];\n        while (q = hullNext[n2], orient2d(x2, y2, coords[2 * n2], coords[2 * n2 + 1], coords[2 * q], coords[2 * q + 1]) < 0) {\n          t = this._addTriangle(n2, i, q, hullTri[i], -1, hullTri[n2]);\n          hullTri[i] = this._legalize(t + 2);\n          hullNext[n2] = n2;\n          hullSize--;\n          n2 = q;\n        }\n        if (e === start) {\n          while (q = hullPrev[e], orient2d(x2, y2, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]) < 0) {\n            t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n            this._legalize(t + 2);\n            hullTri[q] = t;\n            hullNext[e] = e;\n            hullSize--;\n            e = q;\n          }\n        }\n        this._hullStart = hullPrev[i] = e;\n        hullNext[e] = hullPrev[n2] = i;\n        hullNext[i] = n2;\n        hullHash[this._hashKey(x2, y2)] = i;\n        hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n      }\n      this.hull = new Uint32Array(hullSize);\n      for (let i = 0, e = this._hullStart; i < hullSize; i++) {\n        this.hull[i] = e;\n        e = hullNext[e];\n      }\n      this.triangles = this._triangles.subarray(0, this.trianglesLen);\n      this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n    }\n    _hashKey(x2, y2) {\n      return Math.floor(pseudoAngle(x2 - this._cx, y2 - this._cy) * this._hashSize) % this._hashSize;\n    }\n    _legalize(a2) {\n      const { _triangles: triangles, _halfedges: halfedges, coords } = this;\n      let i = 0;\n      let ar = 0;\n      while (true) {\n        const b2 = halfedges[a2];\n        const a0 = a2 - a2 % 3;\n        ar = a0 + (a2 + 2) % 3;\n        if (b2 === -1) {\n          if (i === 0) break;\n          a2 = EDGE_STACK[--i];\n          continue;\n        }\n        const b0 = b2 - b2 % 3;\n        const al = a0 + (a2 + 1) % 3;\n        const bl2 = b0 + (b2 + 2) % 3;\n        const p02 = triangles[ar];\n        const pr = triangles[a2];\n        const pl = triangles[al];\n        const p1 = triangles[bl2];\n        const illegal = inCircle(\n          coords[2 * p02],\n          coords[2 * p02 + 1],\n          coords[2 * pr],\n          coords[2 * pr + 1],\n          coords[2 * pl],\n          coords[2 * pl + 1],\n          coords[2 * p1],\n          coords[2 * p1 + 1]\n        );\n        if (illegal) {\n          triangles[a2] = p1;\n          triangles[b2] = p02;\n          const hbl = halfedges[bl2];\n          if (hbl === -1) {\n            let e = this._hullStart;\n            do {\n              if (this._hullTri[e] === bl2) {\n                this._hullTri[e] = a2;\n                break;\n              }\n              e = this._hullPrev[e];\n            } while (e !== this._hullStart);\n          }\n          this._link(a2, hbl);\n          this._link(b2, halfedges[ar]);\n          this._link(ar, bl2);\n          const br2 = b0 + (b2 + 1) % 3;\n          if (i < EDGE_STACK.length) {\n            EDGE_STACK[i++] = br2;\n          }\n        } else {\n          if (i === 0) break;\n          a2 = EDGE_STACK[--i];\n        }\n      }\n      return ar;\n    }\n    _link(a2, b2) {\n      this._halfedges[a2] = b2;\n      if (b2 !== -1) this._halfedges[b2] = a2;\n    }\n    // add a new triangle given vertex indices and adjacent half-edge ids\n    _addTriangle(i0, i1, i2, a2, b2, c2) {\n      const t = this.trianglesLen;\n      this._triangles[t] = i0;\n      this._triangles[t + 1] = i1;\n      this._triangles[t + 2] = i2;\n      this._link(t, a2);\n      this._link(t + 1, b2);\n      this._link(t + 2, c2);\n      this.trianglesLen += 3;\n      return t;\n    }\n  }\n  function pseudoAngle(dx, dy) {\n    const p = dx / (Math.abs(dx) + Math.abs(dy));\n    return (dy > 0 ? 3 - p : 1 + p) / 4;\n  }\n  function dist(ax, ay, bx, by) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return dx * dx + dy * dy;\n  }\n  function inCircle(ax, ay, bx, by, cx, cy, px2, py2) {\n    const dx = ax - px2;\n    const dy = ay - py2;\n    const ex = bx - px2;\n    const ey = by - py2;\n    const fx = cx - px2;\n    const fy = cy - py2;\n    const ap = dx * dx + dy * dy;\n    const bp = ex * ex + ey * ey;\n    const cp = fx * fx + fy * fy;\n    return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n  }\n  function circumradius(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl2 = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d2 = 0.5 / (dx * ey - dy * ex);\n    const x2 = (ey * bl2 - dy * cl) * d2;\n    const y2 = (dx * cl - ex * bl2) * d2;\n    return x2 * x2 + y2 * y2;\n  }\n  function circumcenter(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl2 = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d2 = 0.5 / (dx * ey - dy * ex);\n    const x2 = ax + (ey * bl2 - dy * cl) * d2;\n    const y2 = ay + (dx * cl - ex * bl2) * d2;\n    return { x: x2, y: y2 };\n  }\n  function quicksort(ids, dists, left, right) {\n    if (right - left <= 20) {\n      for (let i = left + 1; i <= right; i++) {\n        const temp2 = ids[i];\n        const tempDist = dists[temp2];\n        let j = i - 1;\n        while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--];\n        ids[j + 1] = temp2;\n      }\n    } else {\n      const median2 = left + right >> 1;\n      let i = left + 1;\n      let j = right;\n      swap(ids, median2, i);\n      if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n      if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n      if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n      const temp2 = ids[i];\n      const tempDist = dists[temp2];\n      while (true) {\n        do\n          i++;\n        while (dists[ids[i]] < tempDist);\n        do\n          j--;\n        while (dists[ids[j]] > tempDist);\n        if (j < i) break;\n        swap(ids, i, j);\n      }\n      ids[left + 1] = ids[j];\n      ids[j] = temp2;\n      if (right - i + 1 >= j - left) {\n        quicksort(ids, dists, i, right);\n        quicksort(ids, dists, left, j - 1);\n      } else {\n        quicksort(ids, dists, left, j - 1);\n        quicksort(ids, dists, i, right);\n      }\n    }\n  }\n  function swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n  }\n  function defaultGetX(p) {\n    return p[0];\n  }\n  function defaultGetY(p) {\n    return p[1];\n  }\n  const epsilon = 1e-6;\n  class Path {\n    constructor() {\n      this._x0 = this._y0 = // start of current subpath\n      this._x1 = this._y1 = null;\n      this._ = \"\";\n    }\n    moveTo(x2, y2) {\n      this._ += `M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;\n    }\n    closePath() {\n      if (this._x1 !== null) {\n        this._x1 = this._x0, this._y1 = this._y0;\n        this._ += \"Z\";\n      }\n    }\n    lineTo(x2, y2) {\n      this._ += `L${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    arc(x2, y2, r) {\n      x2 = +x2, y2 = +y2, r = +r;\n      const x02 = x2 + r;\n      const y02 = y2;\n      if (r < 0) throw new Error(\"negative radius\");\n      if (this._x1 === null) this._ += `M${x02},${y02}`;\n      else if (Math.abs(this._x1 - x02) > epsilon || Math.abs(this._y1 - y02) > epsilon) this._ += \"L\" + x02 + \",\" + y02;\n      if (!r) return;\n      this._ += `A${r},${r},0,1,1,${x2 - r},${y2}A${r},${r},0,1,1,${this._x1 = x02},${this._y1 = y02}`;\n    }\n    rect(x2, y2, w2, h2) {\n      this._ += `M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${+w2}v${+h2}h${-w2}Z`;\n    }\n    value() {\n      return this._ || null;\n    }\n  }\n  class Polygon {\n    constructor() {\n      this._ = [];\n    }\n    moveTo(x2, y2) {\n      this._.push([x2, y2]);\n    }\n    closePath() {\n      this._.push(this._[0].slice());\n    }\n    lineTo(x2, y2) {\n      this._.push([x2, y2]);\n    }\n    value() {\n      return this._.length ? this._ : null;\n    }\n  }\n  let Voronoi$1 = class Voronoi {\n    constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) {\n      if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error(\"invalid bounds\");\n      this.delaunay = delaunay;\n      this._circumcenters = new Float64Array(delaunay.points.length * 2);\n      this.vectors = new Float64Array(delaunay.points.length * 2);\n      this.xmax = xmax, this.xmin = xmin;\n      this.ymax = ymax, this.ymin = ymin;\n      this._init();\n    }\n    update() {\n      this.delaunay.update();\n      this._init();\n      return this;\n    }\n    _init() {\n      const { delaunay: { points: points2, hull, triangles }, vectors } = this;\n      let bx, by;\n      const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);\n      for (let i = 0, j = 0, n = triangles.length, x2, y2; i < n; i += 3, j += 2) {\n        const t12 = triangles[i] * 2;\n        const t22 = triangles[i + 1] * 2;\n        const t32 = triangles[i + 2] * 2;\n        const x13 = points2[t12];\n        const y13 = points2[t12 + 1];\n        const x22 = points2[t22];\n        const y22 = points2[t22 + 1];\n        const x3 = points2[t32];\n        const y3 = points2[t32 + 1];\n        const dx = x22 - x13;\n        const dy = y22 - y13;\n        const ex = x3 - x13;\n        const ey = y3 - y13;\n        const ab = (dx * ey - dy * ex) * 2;\n        if (Math.abs(ab) < 1e-9) {\n          if (bx === void 0) {\n            bx = by = 0;\n            for (const i2 of hull) bx += points2[i2 * 2], by += points2[i2 * 2 + 1];\n            bx /= hull.length, by /= hull.length;\n          }\n          const a2 = 1e9 * Math.sign((bx - x13) * ey - (by - y13) * ex);\n          x2 = (x13 + x3) / 2 - a2 * ey;\n          y2 = (y13 + y3) / 2 + a2 * ex;\n        } else {\n          const d2 = 1 / ab;\n          const bl2 = dx * dx + dy * dy;\n          const cl = ex * ex + ey * ey;\n          x2 = x13 + (ey * bl2 - dy * cl) * d2;\n          y2 = y13 + (dx * cl - ex * bl2) * d2;\n        }\n        circumcenters[j] = x2;\n        circumcenters[j + 1] = y2;\n      }\n      let h2 = hull[hull.length - 1];\n      let p02, p1 = h2 * 4;\n      let x02, x12 = points2[2 * h2];\n      let y02, y12 = points2[2 * h2 + 1];\n      vectors.fill(0);\n      for (let i = 0; i < hull.length; ++i) {\n        h2 = hull[i];\n        p02 = p1, x02 = x12, y02 = y12;\n        p1 = h2 * 4, x12 = points2[2 * h2], y12 = points2[2 * h2 + 1];\n        vectors[p02 + 2] = vectors[p1] = y02 - y12;\n        vectors[p02 + 3] = vectors[p1 + 1] = x12 - x02;\n      }\n    }\n    render(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { delaunay: { halfedges, inedges, hull }, circumcenters, vectors } = this;\n      if (hull.length <= 1) return null;\n      for (let i = 0, n = halfedges.length; i < n; ++i) {\n        const j = halfedges[i];\n        if (j < i) continue;\n        const ti = Math.floor(i / 3) * 2;\n        const tj = Math.floor(j / 3) * 2;\n        const xi = circumcenters[ti];\n        const yi = circumcenters[ti + 1];\n        const xj = circumcenters[tj];\n        const yj = circumcenters[tj + 1];\n        this._renderSegment(xi, yi, xj, yj, context2);\n      }\n      let h0, h1 = hull[hull.length - 1];\n      for (let i = 0; i < hull.length; ++i) {\n        h0 = h1, h1 = hull[i];\n        const t = Math.floor(inedges[h1] / 3) * 2;\n        const x2 = circumcenters[t];\n        const y2 = circumcenters[t + 1];\n        const v = h0 * 4;\n        const p = this._project(x2, y2, vectors[v + 2], vectors[v + 3]);\n        if (p) this._renderSegment(x2, y2, p[0], p[1], context2);\n      }\n      return buffer && buffer.value();\n    }\n    renderBounds(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      context2.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin);\n      return buffer && buffer.value();\n    }\n    renderCell(i, context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const points2 = this._clip(i);\n      if (points2 === null || !points2.length) return;\n      context2.moveTo(points2[0], points2[1]);\n      let n = points2.length;\n      while (points2[0] === points2[n - 2] && points2[1] === points2[n - 1] && n > 1) n -= 2;\n      for (let i2 = 2; i2 < n; i2 += 2) {\n        if (points2[i2] !== points2[i2 - 2] || points2[i2 + 1] !== points2[i2 - 1])\n          context2.lineTo(points2[i2], points2[i2 + 1]);\n      }\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    *cellPolygons() {\n      const { delaunay: { points: points2 } } = this;\n      for (let i = 0, n = points2.length / 2; i < n; ++i) {\n        const cell2 = this.cellPolygon(i);\n        if (cell2) cell2.index = i, yield cell2;\n      }\n    }\n    cellPolygon(i) {\n      const polygon = new Polygon();\n      this.renderCell(i, polygon);\n      return polygon.value();\n    }\n    _renderSegment(x02, y02, x12, y12, context2) {\n      let S;\n      const c0 = this._regioncode(x02, y02);\n      const c1 = this._regioncode(x12, y12);\n      if (c0 === 0 && c1 === 0) {\n        context2.moveTo(x02, y02);\n        context2.lineTo(x12, y12);\n      } else if (S = this._clipSegment(x02, y02, x12, y12, c0, c1)) {\n        context2.moveTo(S[0], S[1]);\n        context2.lineTo(S[2], S[3]);\n      }\n    }\n    contains(i, x2, y2) {\n      if ((x2 = +x2, x2 !== x2) || (y2 = +y2, y2 !== y2)) return false;\n      return this.delaunay._step(i, x2, y2) === i;\n    }\n    *neighbors(i) {\n      const ci = this._clip(i);\n      if (ci) for (const j of this.delaunay.neighbors(i)) {\n        const cj = this._clip(j);\n        if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) {\n          for (let aj = 0, lj = cj.length; aj < lj; aj += 2) {\n            if (ci[ai] === cj[aj] && ci[ai + 1] === cj[aj + 1] && ci[(ai + 2) % li] === cj[(aj + lj - 2) % lj] && ci[(ai + 3) % li] === cj[(aj + lj - 1) % lj]) {\n              yield j;\n              break loop;\n            }\n          }\n        }\n      }\n    }\n    _cell(i) {\n      const { circumcenters, delaunay: { inedges, halfedges, triangles } } = this;\n      const e0 = inedges[i];\n      if (e0 === -1) return null;\n      const points2 = [];\n      let e = e0;\n      do {\n        const t = Math.floor(e / 3);\n        points2.push(circumcenters[t * 2], circumcenters[t * 2 + 1]);\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) break;\n        e = halfedges[e];\n      } while (e !== e0 && e !== -1);\n      return points2;\n    }\n    _clip(i) {\n      if (i === 0 && this.delaunay.hull.length === 1) {\n        return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n      }\n      const points2 = this._cell(i);\n      if (points2 === null) return null;\n      const { vectors: V } = this;\n      const v = i * 4;\n      return this._simplify(V[v] || V[v + 1] ? this._clipInfinite(i, points2, V[v], V[v + 1], V[v + 2], V[v + 3]) : this._clipFinite(i, points2));\n    }\n    _clipFinite(i, points2) {\n      const n = points2.length;\n      let P = null;\n      let x02, y02, x12 = points2[n - 2], y12 = points2[n - 1];\n      let c0, c1 = this._regioncode(x12, y12);\n      let e0, e1 = 0;\n      for (let j = 0; j < n; j += 2) {\n        x02 = x12, y02 = y12, x12 = points2[j], y12 = points2[j + 1];\n        c0 = c1, c1 = this._regioncode(x12, y12);\n        if (c0 === 0 && c1 === 0) {\n          e0 = e1, e1 = 0;\n          if (P) P.push(x12, y12);\n          else P = [x12, y12];\n        } else {\n          let S, sx0, sy0, sx1, sy1;\n          if (c0 === 0) {\n            if ((S = this._clipSegment(x02, y02, x12, y12, c0, c1)) === null) continue;\n            [sx0, sy0, sx1, sy1] = S;\n          } else {\n            if ((S = this._clipSegment(x12, y12, x02, y02, c1, c0)) === null) continue;\n            [sx1, sy1, sx0, sy0] = S;\n            e0 = e1, e1 = this._edgecode(sx0, sy0);\n            if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n            if (P) P.push(sx0, sy0);\n            else P = [sx0, sy0];\n          }\n          e0 = e1, e1 = this._edgecode(sx1, sy1);\n          if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n          if (P) P.push(sx1, sy1);\n          else P = [sx1, sy1];\n        }\n      }\n      if (P) {\n        e0 = e1, e1 = this._edgecode(P[0], P[1]);\n        if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n      } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n        return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n      }\n      return P;\n    }\n    _clipSegment(x02, y02, x12, y12, c0, c1) {\n      const flip2 = c0 < c1;\n      if (flip2) [x02, y02, x12, y12, c0, c1] = [x12, y12, x02, y02, c1, c0];\n      while (true) {\n        if (c0 === 0 && c1 === 0) return flip2 ? [x12, y12, x02, y02] : [x02, y02, x12, y12];\n        if (c0 & c1) return null;\n        let x2, y2, c2 = c0 || c1;\n        if (c2 & 8) x2 = x02 + (x12 - x02) * (this.ymax - y02) / (y12 - y02), y2 = this.ymax;\n        else if (c2 & 4) x2 = x02 + (x12 - x02) * (this.ymin - y02) / (y12 - y02), y2 = this.ymin;\n        else if (c2 & 2) y2 = y02 + (y12 - y02) * (this.xmax - x02) / (x12 - x02), x2 = this.xmax;\n        else y2 = y02 + (y12 - y02) * (this.xmin - x02) / (x12 - x02), x2 = this.xmin;\n        if (c0) x02 = x2, y02 = y2, c0 = this._regioncode(x02, y02);\n        else x12 = x2, y12 = y2, c1 = this._regioncode(x12, y12);\n      }\n    }\n    _clipInfinite(i, points2, vx0, vy0, vxn, vyn) {\n      let P = Array.from(points2), p;\n      if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]);\n      if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]);\n      if (P = this._clipFinite(i, P)) {\n        for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) {\n          c0 = c1, c1 = this._edgecode(P[j], P[j + 1]);\n          if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length;\n        }\n      } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n        P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax];\n      }\n      return P;\n    }\n    _edge(i, e0, e1, P, j) {\n      while (e0 !== e1) {\n        let x2, y2;\n        switch (e0) {\n          case 5:\n            e0 = 4;\n            continue;\n          // top-left\n          case 4:\n            e0 = 6, x2 = this.xmax, y2 = this.ymin;\n            break;\n          // top\n          case 6:\n            e0 = 2;\n            continue;\n          // top-right\n          case 2:\n            e0 = 10, x2 = this.xmax, y2 = this.ymax;\n            break;\n          // right\n          case 10:\n            e0 = 8;\n            continue;\n          // bottom-right\n          case 8:\n            e0 = 9, x2 = this.xmin, y2 = this.ymax;\n            break;\n          // bottom\n          case 9:\n            e0 = 1;\n            continue;\n          // bottom-left\n          case 1:\n            e0 = 5, x2 = this.xmin, y2 = this.ymin;\n            break;\n        }\n        if ((P[j] !== x2 || P[j + 1] !== y2) && this.contains(i, x2, y2)) {\n          P.splice(j, 0, x2, y2), j += 2;\n        }\n      }\n      return j;\n    }\n    _project(x02, y02, vx, vy) {\n      let t = Infinity, c2, x2, y2;\n      if (vy < 0) {\n        if (y02 <= this.ymin) return null;\n        if ((c2 = (this.ymin - y02) / vy) < t) y2 = this.ymin, x2 = x02 + (t = c2) * vx;\n      } else if (vy > 0) {\n        if (y02 >= this.ymax) return null;\n        if ((c2 = (this.ymax - y02) / vy) < t) y2 = this.ymax, x2 = x02 + (t = c2) * vx;\n      }\n      if (vx > 0) {\n        if (x02 >= this.xmax) return null;\n        if ((c2 = (this.xmax - x02) / vx) < t) x2 = this.xmax, y2 = y02 + (t = c2) * vy;\n      } else if (vx < 0) {\n        if (x02 <= this.xmin) return null;\n        if ((c2 = (this.xmin - x02) / vx) < t) x2 = this.xmin, y2 = y02 + (t = c2) * vy;\n      }\n      return [x2, y2];\n    }\n    _edgecode(x2, y2) {\n      return (x2 === this.xmin ? 1 : x2 === this.xmax ? 2 : 0) | (y2 === this.ymin ? 4 : y2 === this.ymax ? 8 : 0);\n    }\n    _regioncode(x2, y2) {\n      return (x2 < this.xmin ? 1 : x2 > this.xmax ? 2 : 0) | (y2 < this.ymin ? 4 : y2 > this.ymax ? 8 : 0);\n    }\n    _simplify(P) {\n      if (P && P.length > 4) {\n        for (let i = 0; i < P.length; i += 2) {\n          const j = (i + 2) % P.length, k = (i + 4) % P.length;\n          if (P[i] === P[j] && P[j] === P[k] || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) {\n            P.splice(j, 2), i -= 2;\n          }\n        }\n        if (!P.length) P = null;\n      }\n      return P;\n    }\n  };\n  const tau = 2 * Math.PI, pow = Math.pow;\n  function pointX(p) {\n    return p[0];\n  }\n  function pointY(p) {\n    return p[1];\n  }\n  function collinear(d2) {\n    const { triangles, coords } = d2;\n    for (let i = 0; i < triangles.length; i += 3) {\n      const a2 = 2 * triangles[i], b2 = 2 * triangles[i + 1], c2 = 2 * triangles[i + 2], cross2 = (coords[c2] - coords[a2]) * (coords[b2 + 1] - coords[a2 + 1]) - (coords[b2] - coords[a2]) * (coords[c2 + 1] - coords[a2 + 1]);\n      if (cross2 > 1e-10) return false;\n    }\n    return true;\n  }\n  function jitter(x2, y2, r) {\n    return [x2 + Math.sin(x2 + y2) * r, y2 + Math.cos(x2 - y2) * r];\n  }\n  class Delaunay {\n    static from(points2, fx = pointX, fy = pointY, that) {\n      return new Delaunay(\"length\" in points2 ? flatArray(points2, fx, fy, that) : Float64Array.from(flatIterable(points2, fx, fy, that)));\n    }\n    constructor(points2) {\n      this._delaunator = new Delaunator(points2);\n      this.inedges = new Int32Array(points2.length / 2);\n      this._hullIndex = new Int32Array(points2.length / 2);\n      this.points = this._delaunator.coords;\n      this._init();\n    }\n    update() {\n      this._delaunator.update();\n      this._init();\n      return this;\n    }\n    _init() {\n      const d2 = this._delaunator, points2 = this.points;\n      if (d2.hull && d2.hull.length > 2 && collinear(d2)) {\n        this.collinear = Int32Array.from({ length: points2.length / 2 }, (_, i) => i).sort((i, j) => points2[2 * i] - points2[2 * j] || points2[2 * i + 1] - points2[2 * j + 1]);\n        const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds2 = [points2[2 * e], points2[2 * e + 1], points2[2 * f], points2[2 * f + 1]], r = 1e-8 * Math.hypot(bounds2[3] - bounds2[1], bounds2[2] - bounds2[0]);\n        for (let i = 0, n = points2.length / 2; i < n; ++i) {\n          const p = jitter(points2[2 * i], points2[2 * i + 1], r);\n          points2[2 * i] = p[0];\n          points2[2 * i + 1] = p[1];\n        }\n        this._delaunator = new Delaunator(points2);\n      } else {\n        delete this.collinear;\n      }\n      const halfedges = this.halfedges = this._delaunator.halfedges;\n      const hull = this.hull = this._delaunator.hull;\n      const triangles = this.triangles = this._delaunator.triangles;\n      const inedges = this.inedges.fill(-1);\n      const hullIndex = this._hullIndex.fill(-1);\n      for (let e = 0, n = halfedges.length; e < n; ++e) {\n        const p = triangles[e % 3 === 2 ? e - 2 : e + 1];\n        if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e;\n      }\n      for (let i = 0, n = hull.length; i < n; ++i) {\n        hullIndex[hull[i]] = i;\n      }\n      if (hull.length <= 2 && hull.length > 0) {\n        this.triangles = new Int32Array(3).fill(-1);\n        this.halfedges = new Int32Array(3).fill(-1);\n        this.triangles[0] = hull[0];\n        inedges[hull[0]] = 1;\n        if (hull.length === 2) {\n          inedges[hull[1]] = 0;\n          this.triangles[1] = hull[1];\n          this.triangles[2] = hull[1];\n        }\n      }\n    }\n    voronoi(bounds2) {\n      return new Voronoi$1(this, bounds2);\n    }\n    *neighbors(i) {\n      const { inedges, hull, _hullIndex, halfedges, triangles, collinear: collinear2 } = this;\n      if (collinear2) {\n        const l = collinear2.indexOf(i);\n        if (l > 0) yield collinear2[l - 1];\n        if (l < collinear2.length - 1) yield collinear2[l + 1];\n        return;\n      }\n      const e0 = inedges[i];\n      if (e0 === -1) return;\n      let e = e0, p02 = -1;\n      do {\n        yield p02 = triangles[e];\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) return;\n        e = halfedges[e];\n        if (e === -1) {\n          const p = hull[(_hullIndex[i] + 1) % hull.length];\n          if (p !== p02) yield p;\n          return;\n        }\n      } while (e !== e0);\n    }\n    find(x2, y2, i = 0) {\n      if ((x2 = +x2, x2 !== x2) || (y2 = +y2, y2 !== y2)) return -1;\n      const i0 = i;\n      let c2;\n      while ((c2 = this._step(i, x2, y2)) >= 0 && c2 !== i && c2 !== i0) i = c2;\n      return c2;\n    }\n    _step(i, x2, y2) {\n      const { inedges, hull, _hullIndex, halfedges, triangles, points: points2 } = this;\n      if (inedges[i] === -1 || !points2.length) return (i + 1) % (points2.length >> 1);\n      let c2 = i;\n      let dc = pow(x2 - points2[i * 2], 2) + pow(y2 - points2[i * 2 + 1], 2);\n      const e0 = inedges[i];\n      let e = e0;\n      do {\n        let t = triangles[e];\n        const dt = pow(x2 - points2[t * 2], 2) + pow(y2 - points2[t * 2 + 1], 2);\n        if (dt < dc) dc = dt, c2 = t;\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) break;\n        e = halfedges[e];\n        if (e === -1) {\n          e = hull[(_hullIndex[i] + 1) % hull.length];\n          if (e !== t) {\n            if (pow(x2 - points2[e * 2], 2) + pow(y2 - points2[e * 2 + 1], 2) < dc) return e;\n          }\n          break;\n        }\n      } while (e !== e0);\n      return c2;\n    }\n    render(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2, halfedges, triangles } = this;\n      for (let i = 0, n = halfedges.length; i < n; ++i) {\n        const j = halfedges[i];\n        if (j < i) continue;\n        const ti = triangles[i] * 2;\n        const tj = triangles[j] * 2;\n        context2.moveTo(points2[ti], points2[ti + 1]);\n        context2.lineTo(points2[tj], points2[tj + 1]);\n      }\n      this.renderHull(context2);\n      return buffer && buffer.value();\n    }\n    renderPoints(context2, r) {\n      if (r === void 0 && (!context2 || typeof context2.moveTo !== \"function\")) r = context2, context2 = null;\n      r = r == void 0 ? 2 : +r;\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2 } = this;\n      for (let i = 0, n = points2.length; i < n; i += 2) {\n        const x2 = points2[i], y2 = points2[i + 1];\n        context2.moveTo(x2 + r, y2);\n        context2.arc(x2, y2, r, 0, tau);\n      }\n      return buffer && buffer.value();\n    }\n    renderHull(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { hull, points: points2 } = this;\n      const h2 = hull[0] * 2, n = hull.length;\n      context2.moveTo(points2[h2], points2[h2 + 1]);\n      for (let i = 1; i < n; ++i) {\n        const h3 = 2 * hull[i];\n        context2.lineTo(points2[h3], points2[h3 + 1]);\n      }\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    hullPolygon() {\n      const polygon = new Polygon();\n      this.renderHull(polygon);\n      return polygon.value();\n    }\n    renderTriangle(i, context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2, triangles } = this;\n      const t02 = triangles[i *= 3] * 2;\n      const t12 = triangles[i + 1] * 2;\n      const t22 = triangles[i + 2] * 2;\n      context2.moveTo(points2[t02], points2[t02 + 1]);\n      context2.lineTo(points2[t12], points2[t12 + 1]);\n      context2.lineTo(points2[t22], points2[t22 + 1]);\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    *trianglePolygons() {\n      const { triangles } = this;\n      for (let i = 0, n = triangles.length / 3; i < n; ++i) {\n        yield this.trianglePolygon(i);\n      }\n    }\n    trianglePolygon(i) {\n      const polygon = new Polygon();\n      this.renderTriangle(i, polygon);\n      return polygon.value();\n    }\n  }\n  function flatArray(points2, fx, fy, that) {\n    const n = points2.length;\n    const array2 = new Float64Array(n * 2);\n    for (let i = 0; i < n; ++i) {\n      const p = points2[i];\n      array2[i * 2] = fx.call(that, p, i, points2);\n      array2[i * 2 + 1] = fy.call(that, p, i, points2);\n    }\n    return array2;\n  }\n  function* flatIterable(points2, fx, fy, that) {\n    let i = 0;\n    for (const p of points2) {\n      yield fx.call(that, p, i, points2);\n      yield fy.call(that, p, i, points2);\n      ++i;\n    }\n  }\n  function Voronoi(params2) {\n    Transform.call(this, null, params2);\n  }\n  Voronoi.Definition = {\n    \"type\": \"Voronoi\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [[-1e5, -1e5], [1e5, 1e5]],\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  const defaultExtent = [-1e5, -1e5, 1e5, 1e5];\n  inherits(Voronoi, Transform, {\n    transform(_, pulse2) {\n      const as = _.as || \"path\", data2 = pulse2.source;\n      if (!data2 || !data2.length) return pulse2;\n      let s2 = _.size;\n      s2 = s2 ? [0, 0, s2[0], s2[1]] : (s2 = _.extent) ? [s2[0][0], s2[0][1], s2[1][0], s2[1][1]] : defaultExtent;\n      const voronoi2 = this.value = Delaunay.from(data2, _.x, _.y).voronoi(s2);\n      for (let i = 0, n = data2.length; i < n; ++i) {\n        const polygon = voronoi2.cellPolygon(i);\n        data2[i][as] = polygon && !isPoint(polygon) ? toPathString(polygon) : null;\n      }\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  function toPathString(p) {\n    const x2 = p[0][0], y2 = p[0][1];\n    let n = p.length - 1;\n    for (; p[n][0] === x2 && p[n][1] === y2; --n) ;\n    return \"M\" + p.slice(0, n + 1).join(\"L\") + \"Z\";\n  }\n  function isPoint(p) {\n    return p.length === 2 && p[0][0] === p[1][0] && p[0][1] === p[1][1];\n  }\n  const voronoi = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    voronoi: Voronoi\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var cloudRadians = Math.PI / 180, cw = 1 << 11 >> 5, ch = 1 << 11;\n  function cloud() {\n    var size = [256, 256], text2, font2, fontSize2, fontStyle, fontWeight, rotate2, padding2, spiral = archimedeanSpiral, words = [], random2 = Math.random, cloud2 = {};\n    cloud2.layout = function() {\n      var contextAndRatio = getContext2(domCanvas()), board = zeroArray((size[0] >> 5) * size[1]), bounds2 = null, n = words.length, i = -1, tags = [], data2 = words.map((d3) => ({\n        text: text2(d3),\n        font: font2(d3),\n        style: fontStyle(d3),\n        weight: fontWeight(d3),\n        rotate: rotate2(d3),\n        size: ~~(fontSize2(d3) + 1e-14),\n        padding: padding2(d3),\n        xoff: 0,\n        yoff: 0,\n        x1: 0,\n        y1: 0,\n        x0: 0,\n        y0: 0,\n        hasText: false,\n        sprite: null,\n        datum: d3\n      })).sort((a2, b2) => b2.size - a2.size);\n      while (++i < n) {\n        var d2 = data2[i];\n        d2.x = size[0] * (random2() + 0.5) >> 1;\n        d2.y = size[1] * (random2() + 0.5) >> 1;\n        cloudSprite(contextAndRatio, d2, data2, i);\n        if (d2.hasText && place2(board, d2, bounds2)) {\n          tags.push(d2);\n          if (bounds2) cloudBounds(bounds2, d2);\n          else bounds2 = [{\n            x: d2.x + d2.x0,\n            y: d2.y + d2.y0\n          }, {\n            x: d2.x + d2.x1,\n            y: d2.y + d2.y1\n          }];\n          d2.x -= size[0] >> 1;\n          d2.y -= size[1] >> 1;\n        }\n      }\n      return tags;\n    };\n    function getContext2(canvas) {\n      canvas.width = canvas.height = 1;\n      var ratio = Math.sqrt(canvas.getContext(\"2d\").getImageData(0, 0, 1, 1).data.length >> 2);\n      canvas.width = (cw << 5) / ratio;\n      canvas.height = ch / ratio;\n      var context2 = canvas.getContext(\"2d\");\n      context2.fillStyle = context2.strokeStyle = \"red\";\n      context2.textAlign = \"center\";\n      return {\n        context: context2,\n        ratio\n      };\n    }\n    function place2(board, tag, bounds2) {\n      var startX = tag.x, startY = tag.y, maxDelta = Math.hypot(size[0], size[1]), s2 = spiral(size), dt = random2() < 0.5 ? 1 : -1, t = -dt, dxdy, dx, dy;\n      while (dxdy = s2(t += dt)) {\n        dx = ~~dxdy[0];\n        dy = ~~dxdy[1];\n        if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break;\n        tag.x = startX + dx;\n        tag.y = startY + dy;\n        if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue;\n        if (!bounds2 || !cloudCollide(tag, board, size[0])) {\n          if (!bounds2 || collideRects(tag, bounds2)) {\n            var sprite = tag.sprite, w2 = tag.width >> 5, sw = size[0] >> 5, lx2 = tag.x - (w2 << 4), sx = lx2 & 127, msx = 32 - sx, h2 = tag.y1 - tag.y0, x2 = (tag.y + tag.y0) * sw + (lx2 >> 5), last;\n            for (var j = 0; j < h2; j++) {\n              last = 0;\n              for (var i = 0; i <= w2; i++) {\n                board[x2 + i] |= last << msx | (i < w2 ? (last = sprite[j * w2 + i]) >>> sx : 0);\n              }\n              x2 += sw;\n            }\n            tag.sprite = null;\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n    cloud2.words = function(_) {\n      if (arguments.length) {\n        words = _;\n        return cloud2;\n      } else {\n        return words;\n      }\n    };\n    cloud2.size = function(_) {\n      if (arguments.length) {\n        size = [+_[0], +_[1]];\n        return cloud2;\n      } else {\n        return size;\n      }\n    };\n    cloud2.font = function(_) {\n      if (arguments.length) {\n        font2 = functor(_);\n        return cloud2;\n      } else {\n        return font2;\n      }\n    };\n    cloud2.fontStyle = function(_) {\n      if (arguments.length) {\n        fontStyle = functor(_);\n        return cloud2;\n      } else {\n        return fontStyle;\n      }\n    };\n    cloud2.fontWeight = function(_) {\n      if (arguments.length) {\n        fontWeight = functor(_);\n        return cloud2;\n      } else {\n        return fontWeight;\n      }\n    };\n    cloud2.rotate = function(_) {\n      if (arguments.length) {\n        rotate2 = functor(_);\n        return cloud2;\n      } else {\n        return rotate2;\n      }\n    };\n    cloud2.text = function(_) {\n      if (arguments.length) {\n        text2 = functor(_);\n        return cloud2;\n      } else {\n        return text2;\n      }\n    };\n    cloud2.spiral = function(_) {\n      if (arguments.length) {\n        spiral = spirals[_] || _;\n        return cloud2;\n      } else {\n        return spiral;\n      }\n    };\n    cloud2.fontSize = function(_) {\n      if (arguments.length) {\n        fontSize2 = functor(_);\n        return cloud2;\n      } else {\n        return fontSize2;\n      }\n    };\n    cloud2.padding = function(_) {\n      if (arguments.length) {\n        padding2 = functor(_);\n        return cloud2;\n      } else {\n        return padding2;\n      }\n    };\n    cloud2.random = function(_) {\n      if (arguments.length) {\n        random2 = _;\n        return cloud2;\n      } else {\n        return random2;\n      }\n    };\n    return cloud2;\n  }\n  function cloudSprite(contextAndRatio, d2, data2, di) {\n    if (d2.sprite) return;\n    var c2 = contextAndRatio.context, ratio = contextAndRatio.ratio;\n    c2.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);\n    var x2 = 0, y2 = 0, maxh = 0, n = data2.length, w2, w32, h2, i, j;\n    --di;\n    while (++di < n) {\n      d2 = data2[di];\n      c2.save();\n      c2.font = d2.style + \" \" + d2.weight + \" \" + ~~((d2.size + 1) / ratio) + \"px \" + d2.font;\n      w2 = c2.measureText(d2.text + \"m\").width * ratio;\n      h2 = d2.size << 1;\n      if (d2.rotate) {\n        var sr = Math.sin(d2.rotate * cloudRadians), cr2 = Math.cos(d2.rotate * cloudRadians), wcr = w2 * cr2, wsr = w2 * sr, hcr = h2 * cr2, hsr = h2 * sr;\n        w2 = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 31 >> 5 << 5;\n        h2 = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));\n      } else {\n        w2 = w2 + 31 >> 5 << 5;\n      }\n      if (h2 > maxh) maxh = h2;\n      if (x2 + w2 >= cw << 5) {\n        x2 = 0;\n        y2 += maxh;\n        maxh = 0;\n      }\n      if (y2 + h2 >= ch) break;\n      c2.translate((x2 + (w2 >> 1)) / ratio, (y2 + (h2 >> 1)) / ratio);\n      if (d2.rotate) c2.rotate(d2.rotate * cloudRadians);\n      c2.fillText(d2.text, 0, 0);\n      if (d2.padding) {\n        c2.lineWidth = 2 * d2.padding;\n        c2.strokeText(d2.text, 0, 0);\n      }\n      c2.restore();\n      d2.width = w2;\n      d2.height = h2;\n      d2.xoff = x2;\n      d2.yoff = y2;\n      d2.x1 = w2 >> 1;\n      d2.y1 = h2 >> 1;\n      d2.x0 = -d2.x1;\n      d2.y0 = -d2.y1;\n      d2.hasText = true;\n      x2 += w2;\n    }\n    var pixels = c2.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, sprite = [];\n    while (--di >= 0) {\n      d2 = data2[di];\n      if (!d2.hasText) continue;\n      w2 = d2.width;\n      w32 = w2 >> 5;\n      h2 = d2.y1 - d2.y0;\n      for (i = 0; i < h2 * w32; i++) sprite[i] = 0;\n      x2 = d2.xoff;\n      if (x2 == null) return;\n      y2 = d2.yoff;\n      var seen = 0, seenRow = -1;\n      for (j = 0; j < h2; j++) {\n        for (i = 0; i < w2; i++) {\n          var k = w32 * j + (i >> 5), m2 = pixels[(y2 + j) * (cw << 5) + (x2 + i) << 2] ? 1 << 31 - i % 32 : 0;\n          sprite[k] |= m2;\n          seen |= m2;\n        }\n        if (seen) seenRow = j;\n        else {\n          d2.y0++;\n          h2--;\n          j--;\n          y2++;\n        }\n      }\n      d2.y1 = d2.y0 + seenRow;\n      d2.sprite = sprite.slice(0, (d2.y1 - d2.y0) * w32);\n    }\n  }\n  function cloudCollide(tag, board, sw) {\n    sw >>= 5;\n    var sprite = tag.sprite, w2 = tag.width >> 5, lx2 = tag.x - (w2 << 4), sx = lx2 & 127, msx = 32 - sx, h2 = tag.y1 - tag.y0, x2 = (tag.y + tag.y0) * sw + (lx2 >> 5), last;\n    for (var j = 0; j < h2; j++) {\n      last = 0;\n      for (var i = 0; i <= w2; i++) {\n        if ((last << msx | (i < w2 ? (last = sprite[j * w2 + i]) >>> sx : 0)) & board[x2 + i]) return true;\n      }\n      x2 += sw;\n    }\n    return false;\n  }\n  function cloudBounds(bounds2, d2) {\n    var b0 = bounds2[0], b1 = bounds2[1];\n    if (d2.x + d2.x0 < b0.x) b0.x = d2.x + d2.x0;\n    if (d2.y + d2.y0 < b0.y) b0.y = d2.y + d2.y0;\n    if (d2.x + d2.x1 > b1.x) b1.x = d2.x + d2.x1;\n    if (d2.y + d2.y1 > b1.y) b1.y = d2.y + d2.y1;\n  }\n  function collideRects(a2, b2) {\n    return a2.x + a2.x1 > b2[0].x && a2.x + a2.x0 < b2[1].x && a2.y + a2.y1 > b2[0].y && a2.y + a2.y0 < b2[1].y;\n  }\n  function archimedeanSpiral(size) {\n    var e = size[0] / size[1];\n    return function(t) {\n      return [e * (t *= 0.1) * Math.cos(t), t * Math.sin(t)];\n    };\n  }\n  function rectangularSpiral(size) {\n    var dy = 4, dx = dy * size[0] / size[1], x2 = 0, y2 = 0;\n    return function(t) {\n      var sign2 = t < 0 ? -1 : 1;\n      switch (Math.sqrt(1 + 4 * sign2 * t) - sign2 & 3) {\n        case 0:\n          x2 += dx;\n          break;\n        case 1:\n          y2 += dy;\n          break;\n        case 2:\n          x2 -= dx;\n          break;\n        default:\n          y2 -= dy;\n          break;\n      }\n      return [x2, y2];\n    };\n  }\n  function zeroArray(n) {\n    var a2 = [], i = -1;\n    while (++i < n) a2[i] = 0;\n    return a2;\n  }\n  function functor(d2) {\n    return typeof d2 === \"function\" ? d2 : function() {\n      return d2;\n    };\n  }\n  var spirals = {\n    archimedean: archimedeanSpiral,\n    rectangular: rectangularSpiral\n  };\n  const Output = [\"x\", \"y\", \"font\", \"fontSize\", \"fontStyle\", \"fontWeight\", \"angle\"];\n  const Params$1 = [\"text\", \"font\", \"rotate\", \"fontSize\", \"fontStyle\", \"fontWeight\"];\n  function Wordcloud(params2) {\n    Transform.call(this, cloud(), params2);\n  }\n  Wordcloud.Definition = {\n    \"type\": \"Wordcloud\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"font\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"sans-serif\"\n    }, {\n      \"name\": \"fontStyle\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"normal\"\n    }, {\n      \"name\": \"fontWeight\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"normal\"\n    }, {\n      \"name\": \"fontSize\",\n      \"type\": \"number\",\n      \"expr\": true,\n      \"default\": 14\n    }, {\n      \"name\": \"fontSizeRange\",\n      \"type\": \"number\",\n      \"array\": \"nullable\",\n      \"default\": [10, 50]\n    }, {\n      \"name\": \"rotate\",\n      \"type\": \"number\",\n      \"expr\": true,\n      \"default\": 0\n    }, {\n      \"name\": \"text\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"spiral\",\n      \"type\": \"string\",\n      \"values\": [\"archimedean\", \"rectangular\"]\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 7,\n      \"default\": Output\n    }]\n  };\n  inherits(Wordcloud, Transform, {\n    transform(_, pulse2) {\n      if (_.size && !(_.size[0] && _.size[1])) {\n        error(\"Wordcloud size dimensions must be non-zero.\");\n      }\n      function modp(param2) {\n        const p = _[param2];\n        return isFunction(p) && pulse2.modified(p.fields);\n      }\n      const mod = _.modified();\n      if (!(mod || pulse2.changed(pulse2.ADD_REM) || Params$1.some(modp))) return;\n      const data2 = pulse2.materialize(pulse2.SOURCE).source, layout = this.value, as = _.as || Output;\n      let fontSize2 = _.fontSize || 14, range2;\n      isFunction(fontSize2) ? range2 = _.fontSizeRange : fontSize2 = constant$4(fontSize2);\n      if (range2) {\n        const fsize = fontSize2, sizeScale = scale$4(\"sqrt\")().domain(extent(data2, fsize)).range(range2);\n        fontSize2 = (x2) => sizeScale(fsize(x2));\n      }\n      data2.forEach((t) => {\n        t[as[0]] = NaN;\n        t[as[1]] = NaN;\n        t[as[3]] = 0;\n      });\n      const words = layout.words(data2).text(_.text).size(_.size || [500, 500]).padding(_.padding || 1).spiral(_.spiral || \"archimedean\").rotate(_.rotate || 0).font(_.font || \"sans-serif\").fontStyle(_.fontStyle || \"normal\").fontWeight(_.fontWeight || \"normal\").fontSize(fontSize2).random(random).layout();\n      const size = layout.size(), dx = size[0] >> 1, dy = size[1] >> 1, n = words.length;\n      for (let i = 0, w2, t; i < n; ++i) {\n        w2 = words[i];\n        t = w2.datum;\n        t[as[0]] = w2.x + dx;\n        t[as[1]] = w2.y + dy;\n        t[as[2]] = w2.font;\n        t[as[3]] = w2.size;\n        t[as[4]] = w2.style;\n        t[as[5]] = w2.weight;\n        t[as[6]] = w2.rotate;\n      }\n      return pulse2.reflow(mod).modifies(as);\n    }\n  });\n  const wordcloud = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    wordcloud: Wordcloud\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const array8 = (n) => new Uint8Array(n);\n  const array16 = (n) => new Uint16Array(n);\n  const array32 = (n) => new Uint32Array(n);\n  function Bitmaps() {\n    let width2 = 8, data2 = [], seen = array32(0), curr = array$1(0, width2), prev = array$1(0, width2);\n    return {\n      data: () => data2,\n      seen: () => seen = lengthen(seen, data2.length),\n      add(array2) {\n        for (let i = 0, j = data2.length, n = array2.length, t; i < n; ++i) {\n          t = array2[i];\n          t._index = j++;\n          data2.push(t);\n        }\n      },\n      remove(num, map2) {\n        const n = data2.length, copy2 = Array(n - num), reindex = data2;\n        let t, i, j;\n        for (i = 0; !map2[i] && i < n; ++i) {\n          copy2[i] = data2[i];\n          reindex[i] = i;\n        }\n        for (j = i; i < n; ++i) {\n          t = data2[i];\n          if (!map2[i]) {\n            reindex[i] = j;\n            curr[j] = curr[i];\n            prev[j] = prev[i];\n            copy2[j] = t;\n            t._index = j++;\n          } else {\n            reindex[i] = -1;\n          }\n          curr[i] = 0;\n        }\n        data2 = copy2;\n        return reindex;\n      },\n      size: () => data2.length,\n      curr: () => curr,\n      prev: () => prev,\n      reset: (k) => prev[k] = curr[k],\n      all: () => width2 < 257 ? 255 : width2 < 65537 ? 65535 : 4294967295,\n      set(k, one2) {\n        curr[k] |= one2;\n      },\n      clear(k, one2) {\n        curr[k] &= ~one2;\n      },\n      resize(n, m2) {\n        const k = curr.length;\n        if (n > k || m2 > width2) {\n          width2 = Math.max(m2, width2);\n          curr = array$1(n, width2, curr);\n          prev = array$1(n, width2);\n        }\n      }\n    };\n  }\n  function lengthen(array2, length2, copy2) {\n    if (array2.length >= length2) return array2;\n    copy2 = copy2 || new array2.constructor(length2);\n    copy2.set(array2);\n    return copy2;\n  }\n  function array$1(n, m2, array2) {\n    const copy2 = (m2 < 257 ? array8 : m2 < 65537 ? array16 : array32)(n);\n    if (array2) copy2.set(array2);\n    return copy2;\n  }\n  function Dimension(index2, i, query) {\n    const bit = 1 << i;\n    return {\n      one: bit,\n      zero: ~bit,\n      range: query.slice(),\n      bisect: index2.bisect,\n      index: index2.index,\n      size: index2.size,\n      onAdd(added, curr) {\n        const dim = this, range2 = dim.bisect(dim.range, added.value), idx = added.index, lo = range2[0], hi = range2[1], n1 = idx.length;\n        let i2;\n        for (i2 = 0; i2 < lo; ++i2) curr[idx[i2]] |= bit;\n        for (i2 = hi; i2 < n1; ++i2) curr[idx[i2]] |= bit;\n        return dim;\n      }\n    };\n  }\n  function SortedIndex() {\n    let index2 = array32(0), value2 = [], size = 0;\n    function insert2(key2, data2, base2) {\n      if (!data2.length) return [];\n      const n0 = size, n1 = data2.length, addi = array32(n1);\n      let addv = Array(n1), oldv, oldi, i;\n      for (i = 0; i < n1; ++i) {\n        addv[i] = key2(data2[i]);\n        addi[i] = i;\n      }\n      addv = sort$1(addv, addi);\n      if (n0) {\n        oldv = value2;\n        oldi = index2;\n        value2 = Array(n0 + n1);\n        index2 = array32(n0 + n1);\n        merge$1(base2, oldv, oldi, n0, addv, addi, n1, value2, index2);\n      } else {\n        if (base2 > 0) for (i = 0; i < n1; ++i) {\n          addi[i] += base2;\n        }\n        value2 = addv;\n        index2 = addi;\n      }\n      size = n0 + n1;\n      return {\n        index: addi,\n        value: addv\n      };\n    }\n    function remove2(num, map2) {\n      const n = size;\n      let idx, i, j;\n      for (i = 0; !map2[index2[i]] && i < n; ++i) ;\n      for (j = i; i < n; ++i) {\n        if (!map2[idx = index2[i]]) {\n          index2[j] = idx;\n          value2[j] = value2[i];\n          ++j;\n        }\n      }\n      size = n - num;\n    }\n    function reindex(map2) {\n      for (let i = 0, n = size; i < n; ++i) {\n        index2[i] = map2[index2[i]];\n      }\n    }\n    function bisect2(range2, array2) {\n      let n;\n      if (array2) {\n        n = array2.length;\n      } else {\n        array2 = value2;\n        n = size;\n      }\n      return [bisectLeft$1(array2, range2[0], 0, n), bisectRight$1(array2, range2[1], 0, n)];\n    }\n    return {\n      insert: insert2,\n      remove: remove2,\n      bisect: bisect2,\n      reindex,\n      index: () => index2,\n      size: () => size\n    };\n  }\n  function sort$1(values2, index2) {\n    values2.sort.call(index2, (a2, b2) => {\n      const x2 = values2[a2], y2 = values2[b2];\n      return x2 < y2 ? -1 : x2 > y2 ? 1 : 0;\n    });\n    return permute(values2, index2);\n  }\n  function merge$1(base2, value0, index0, n0, value1, index1, n1, value2, index2) {\n    let i0 = 0, i1 = 0, i;\n    for (i = 0; i0 < n0 && i1 < n1; ++i) {\n      if (value0[i0] < value1[i1]) {\n        value2[i] = value0[i0];\n        index2[i] = index0[i0++];\n      } else {\n        value2[i] = value1[i1];\n        index2[i] = index1[i1++] + base2;\n      }\n    }\n    for (; i0 < n0; ++i0, ++i) {\n      value2[i] = value0[i0];\n      index2[i] = index0[i0];\n    }\n    for (; i1 < n1; ++i1, ++i) {\n      value2[i] = value1[i1];\n      index2[i] = index1[i1] + base2;\n    }\n  }\n  function CrossFilter(params2) {\n    Transform.call(this, Bitmaps(), params2);\n    this._indices = null;\n    this._dims = null;\n  }\n  CrossFilter.Definition = {\n    \"type\": \"CrossFilter\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"query\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"required\": true,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }]\n  };\n  inherits(CrossFilter, Transform, {\n    transform(_, pulse2) {\n      if (!this._dims) {\n        return this.init(_, pulse2);\n      } else {\n        var init2 = _.modified(\"fields\") || _.fields.some((f) => pulse2.modified(f.fields));\n        return init2 ? this.reinit(_, pulse2) : this.eval(_, pulse2);\n      }\n    },\n    init(_, pulse2) {\n      const fields = _.fields, query = _.query, indices = this._indices = {}, dims = this._dims = [], m2 = query.length;\n      let i = 0, key2, index2;\n      for (; i < m2; ++i) {\n        key2 = fields[i].fname;\n        index2 = indices[key2] || (indices[key2] = SortedIndex());\n        dims.push(Dimension(index2, i, query[i]));\n      }\n      return this.eval(_, pulse2);\n    },\n    reinit(_, pulse2) {\n      const output2 = pulse2.materialize().fork(), fields = _.fields, query = _.query, indices = this._indices, dims = this._dims, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), out = output2.rem = output2.add, mod = output2.mod, m2 = query.length, adds = {};\n      let add2, index2, key2, mods, remMap, modMap, i, n, f;\n      prev.set(curr);\n      if (pulse2.rem.length) {\n        remMap = this.remove(_, pulse2, output2);\n      }\n      if (pulse2.add.length) {\n        bits.add(pulse2.add);\n      }\n      if (pulse2.mod.length) {\n        modMap = {};\n        for (mods = pulse2.mod, i = 0, n = mods.length; i < n; ++i) {\n          modMap[mods[i]._index] = 1;\n        }\n      }\n      for (i = 0; i < m2; ++i) {\n        f = fields[i];\n        if (!dims[i] || _.modified(\"fields\", i) || pulse2.modified(f.fields)) {\n          key2 = f.fname;\n          if (!(add2 = adds[key2])) {\n            indices[key2] = index2 = SortedIndex();\n            adds[key2] = add2 = index2.insert(f, pulse2.source, 0);\n          }\n          dims[i] = Dimension(index2, i, query[i]).onAdd(add2, curr);\n        }\n      }\n      for (i = 0, n = bits.data().length; i < n; ++i) {\n        if (remMap[i]) {\n          continue;\n        } else if (prev[i] !== curr[i]) {\n          out.push(i);\n        } else if (modMap[i] && curr[i] !== all) {\n          mod.push(i);\n        }\n      }\n      bits.mask = (1 << m2) - 1;\n      return output2;\n    },\n    eval(_, pulse2) {\n      const output2 = pulse2.materialize().fork(), m2 = this._dims.length;\n      let mask = 0;\n      if (pulse2.rem.length) {\n        this.remove(_, pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      if (_.modified(\"query\") && !_.modified(\"fields\")) {\n        mask |= this.update(_, pulse2, output2);\n      }\n      if (pulse2.add.length) {\n        this.insert(_, pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      if (pulse2.mod.length) {\n        this.modify(pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      this.value.mask = mask;\n      return output2;\n    },\n    insert(_, pulse2, output2) {\n      const tuples = pulse2.add, bits = this.value, dims = this._dims, indices = this._indices, fields = _.fields, adds = {}, out = output2.add, n = bits.size() + tuples.length, m2 = dims.length;\n      let k = bits.size(), j, key2, add2;\n      bits.resize(n, m2);\n      bits.add(tuples);\n      const curr = bits.curr(), prev = bits.prev(), all = bits.all();\n      for (j = 0; j < m2; ++j) {\n        key2 = fields[j].fname;\n        add2 = adds[key2] || (adds[key2] = indices[key2].insert(fields[j], tuples, k));\n        dims[j].onAdd(add2, curr);\n      }\n      for (; k < n; ++k) {\n        prev[k] = all;\n        if (curr[k] !== all) out.push(k);\n      }\n    },\n    modify(pulse2, output2) {\n      const out = output2.mod, bits = this.value, curr = bits.curr(), all = bits.all(), tuples = pulse2.mod;\n      let i, n, k;\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        k = tuples[i]._index;\n        if (curr[k] !== all) out.push(k);\n      }\n    },\n    remove(_, pulse2, output2) {\n      const indices = this._indices, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), map2 = {}, out = output2.rem, tuples = pulse2.rem;\n      let i, n, k, f;\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        k = tuples[i]._index;\n        map2[k] = 1;\n        prev[k] = f = curr[k];\n        curr[k] = all;\n        if (f !== all) out.push(k);\n      }\n      for (k in indices) {\n        indices[k].remove(n, map2);\n      }\n      this.reindex(pulse2, n, map2);\n      return map2;\n    },\n    // reindex filters and indices after propagation completes\n    reindex(pulse2, num, map2) {\n      const indices = this._indices, bits = this.value;\n      pulse2.runAfter(() => {\n        const indexMap = bits.remove(num, map2);\n        for (const key2 in indices) indices[key2].reindex(indexMap);\n      });\n    },\n    update(_, pulse2, output2) {\n      const dims = this._dims, query = _.query, stamp = pulse2.stamp, m2 = dims.length;\n      let mask = 0, i, q;\n      output2.filters = 0;\n      for (q = 0; q < m2; ++q) {\n        if (_.modified(\"query\", q)) {\n          i = q;\n          ++mask;\n        }\n      }\n      if (mask === 1) {\n        mask = dims[i].one;\n        this.incrementOne(dims[i], query[i], output2.add, output2.rem);\n      } else {\n        for (q = 0, mask = 0; q < m2; ++q) {\n          if (!_.modified(\"query\", q)) continue;\n          mask |= dims[q].one;\n          this.incrementAll(dims[q], query[q], stamp, output2.add);\n          output2.rem = output2.add;\n        }\n      }\n      return mask;\n    },\n    incrementAll(dim, query, stamp, out) {\n      const bits = this.value, seen = bits.seen(), curr = bits.curr(), prev = bits.prev(), index2 = dim.index(), old = dim.bisect(dim.range), range2 = dim.bisect(query), lo1 = range2[0], hi1 = range2[1], lo0 = old[0], hi0 = old[1], one2 = dim.one;\n      let i, j, k;\n      if (lo1 < lo0) {\n        for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      } else if (lo1 > lo0) {\n        for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      }\n      if (hi1 > hi0) {\n        for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      } else if (hi1 < hi0) {\n        for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      }\n      dim.range = query.slice();\n    },\n    incrementOne(dim, query, add2, rem2) {\n      const bits = this.value, curr = bits.curr(), index2 = dim.index(), old = dim.bisect(dim.range), range2 = dim.bisect(query), lo1 = range2[0], hi1 = range2[1], lo0 = old[0], hi0 = old[1], one2 = dim.one;\n      let i, j, k;\n      if (lo1 < lo0) {\n        for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          add2.push(k);\n        }\n      } else if (lo1 > lo0) {\n        for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          rem2.push(k);\n        }\n      }\n      if (hi1 > hi0) {\n        for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          add2.push(k);\n        }\n      } else if (hi1 < hi0) {\n        for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          rem2.push(k);\n        }\n      }\n      dim.range = query.slice();\n    }\n  });\n  function ResolveFilter(params2) {\n    Transform.call(this, null, params2);\n  }\n  ResolveFilter.Definition = {\n    \"type\": \"ResolveFilter\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"ignore\",\n      \"type\": \"number\",\n      \"required\": true,\n      \"description\": \"A bit mask indicating which filters to ignore.\"\n    }, {\n      \"name\": \"filter\",\n      \"type\": \"object\",\n      \"required\": true,\n      \"description\": \"Per-tuple filter bitmaps from a CrossFilter transform.\"\n    }]\n  };\n  inherits(ResolveFilter, Transform, {\n    transform(_, pulse2) {\n      const ignore = ~(_.ignore || 0), bitmap = _.filter, mask = bitmap.mask;\n      if ((mask & ignore) === 0) return pulse2.StopPropagation;\n      const output2 = pulse2.fork(pulse2.ALL), data2 = bitmap.data(), curr = bitmap.curr(), prev = bitmap.prev(), pass = (k) => !(curr[k] & ignore) ? data2[k] : null;\n      output2.filter(output2.MOD, pass);\n      if (!(mask & mask - 1)) {\n        output2.filter(output2.ADD, pass);\n        output2.filter(output2.REM, (k) => (curr[k] & ignore) === mask ? data2[k] : null);\n      } else {\n        output2.filter(output2.ADD, (k) => {\n          const c2 = curr[k] & ignore, f = !c2 && c2 ^ prev[k] & ignore;\n          return f ? data2[k] : null;\n        });\n        output2.filter(output2.REM, (k) => {\n          const c2 = curr[k] & ignore, f = c2 && !(c2 ^ (c2 ^ prev[k] & ignore));\n          return f ? data2[k] : null;\n        });\n      }\n      return output2.filter(output2.SOURCE, (t) => pass(t._index));\n    }\n  });\n  const xf = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    crossfilter: CrossFilter,\n    resolvefilter: ResolveFilter\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const RawCode = \"RawCode\";\n  const Literal = \"Literal\";\n  const Property = \"Property\";\n  const Identifier = \"Identifier\";\n  const ArrayExpression = \"ArrayExpression\";\n  const BinaryExpression = \"BinaryExpression\";\n  const CallExpression = \"CallExpression\";\n  const ConditionalExpression = \"ConditionalExpression\";\n  const LogicalExpression = \"LogicalExpression\";\n  const MemberExpression = \"MemberExpression\";\n  const ObjectExpression = \"ObjectExpression\";\n  const UnaryExpression = \"UnaryExpression\";\n  function ASTNode(type2) {\n    this.type = type2;\n  }\n  ASTNode.prototype.visit = function(visitor) {\n    let c2, i, n;\n    if (visitor(this)) return 1;\n    for (c2 = children(this), i = 0, n = c2.length; i < n; ++i) {\n      if (c2[i].visit(visitor)) return 1;\n    }\n  };\n  function children(node) {\n    switch (node.type) {\n      case ArrayExpression:\n        return node.elements;\n      case BinaryExpression:\n      case LogicalExpression:\n        return [node.left, node.right];\n      case CallExpression:\n        return [node.callee].concat(node.arguments);\n      case ConditionalExpression:\n        return [node.test, node.consequent, node.alternate];\n      case MemberExpression:\n        return [node.object, node.property];\n      case ObjectExpression:\n        return node.properties;\n      case Property:\n        return [node.key, node.value];\n      case UnaryExpression:\n        return [node.argument];\n      case Identifier:\n      case Literal:\n      case RawCode:\n      default:\n        return [];\n    }\n  }\n  var TokenName, source, index, length, lookahead;\n  var TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\n  TokenName = {};\n  TokenName[TokenBooleanLiteral] = \"Boolean\";\n  TokenName[TokenEOF] = \"<end>\";\n  TokenName[TokenIdentifier] = \"Identifier\";\n  TokenName[TokenKeyword] = \"Keyword\";\n  TokenName[TokenNullLiteral] = \"Null\";\n  TokenName[TokenNumericLiteral] = \"Numeric\";\n  TokenName[TokenPunctuator] = \"Punctuator\";\n  TokenName[TokenStringLiteral] = \"String\";\n  TokenName[TokenRegularExpression] = \"RegularExpression\";\n  var SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\";\n  var MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\n  var ILLEGAL$1 = \"ILLEGAL\", DISABLED = \"Disabled.\";\n  var RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), RegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\");\n  function assert(condition, message) {\n    if (!condition) {\n      throw new Error(\"ASSERT: \" + message);\n    }\n  }\n  function isDecimalDigit(ch2) {\n    return ch2 >= 48 && ch2 <= 57;\n  }\n  function isHexDigit(ch2) {\n    return \"0123456789abcdefABCDEF\".includes(ch2);\n  }\n  function isOctalDigit(ch2) {\n    return \"01234567\".includes(ch2);\n  }\n  function isWhiteSpace(ch2) {\n    return ch2 === 32 || ch2 === 9 || ch2 === 11 || ch2 === 12 || ch2 === 160 || ch2 >= 5760 && [5760, 6158, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8239, 8287, 12288, 65279].includes(ch2);\n  }\n  function isLineTerminator(ch2) {\n    return ch2 === 10 || ch2 === 13 || ch2 === 8232 || ch2 === 8233;\n  }\n  function isIdentifierStart(ch2) {\n    return ch2 === 36 || ch2 === 95 || // $ (dollar) and _ (underscore)\n    ch2 >= 65 && ch2 <= 90 || // A..Z\n    ch2 >= 97 && ch2 <= 122 || // a..z\n    ch2 === 92 || // \\ (backslash)\n    ch2 >= 128 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch2));\n  }\n  function isIdentifierPart(ch2) {\n    return ch2 === 36 || ch2 === 95 || // $ (dollar) and _ (underscore)\n    ch2 >= 65 && ch2 <= 90 || // A..Z\n    ch2 >= 97 && ch2 <= 122 || // a..z\n    ch2 >= 48 && ch2 <= 57 || // 0..9\n    ch2 === 92 || // \\ (backslash)\n    ch2 >= 128 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch2));\n  }\n  const keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n  };\n  function skipComment() {\n    while (index < length) {\n      const ch2 = source.charCodeAt(index);\n      if (isWhiteSpace(ch2) || isLineTerminator(ch2)) {\n        ++index;\n      } else {\n        break;\n      }\n    }\n  }\n  function scanHexEscape(prefix) {\n    var i, len2, ch2, code = 0;\n    len2 = prefix === \"u\" ? 4 : 2;\n    for (i = 0; i < len2; ++i) {\n      if (index < length && isHexDigit(source[index])) {\n        ch2 = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch2.toLowerCase());\n      } else {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n    }\n    return String.fromCharCode(code);\n  }\n  function scanUnicodeCodePointEscape() {\n    var ch2, code, cu1, cu2;\n    ch2 = source[index];\n    code = 0;\n    if (ch2 === \"}\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    while (index < length) {\n      ch2 = source[index++];\n      if (!isHexDigit(ch2)) {\n        break;\n      }\n      code = code * 16 + \"0123456789abcdef\".indexOf(ch2.toLowerCase());\n    }\n    if (code > 1114111 || ch2 !== \"}\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (code <= 65535) {\n      return String.fromCharCode(code);\n    }\n    cu1 = (code - 65536 >> 10) + 55296;\n    cu2 = (code - 65536 & 1023) + 56320;\n    return String.fromCharCode(cu1, cu2);\n  }\n  function getEscapedIdentifier() {\n    var ch2, id2;\n    ch2 = source.charCodeAt(index++);\n    id2 = String.fromCharCode(ch2);\n    if (ch2 === 92) {\n      if (source.charCodeAt(index) !== 117) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n      ++index;\n      ch2 = scanHexEscape(\"u\");\n      if (!ch2 || ch2 === \"\\\\\" || !isIdentifierStart(ch2.charCodeAt(0))) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n      id2 = ch2;\n    }\n    while (index < length) {\n      ch2 = source.charCodeAt(index);\n      if (!isIdentifierPart(ch2)) {\n        break;\n      }\n      ++index;\n      id2 += String.fromCharCode(ch2);\n      if (ch2 === 92) {\n        id2 = id2.substr(0, id2.length - 1);\n        if (source.charCodeAt(index) !== 117) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n        ++index;\n        ch2 = scanHexEscape(\"u\");\n        if (!ch2 || ch2 === \"\\\\\" || !isIdentifierPart(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n        id2 += ch2;\n      }\n    }\n    return id2;\n  }\n  function getIdentifier() {\n    var start, ch2;\n    start = index++;\n    while (index < length) {\n      ch2 = source.charCodeAt(index);\n      if (ch2 === 92) {\n        index = start;\n        return getEscapedIdentifier();\n      }\n      if (isIdentifierPart(ch2)) {\n        ++index;\n      } else {\n        break;\n      }\n    }\n    return source.slice(start, index);\n  }\n  function scanIdentifier() {\n    var start, id2, type2;\n    start = index;\n    id2 = source.charCodeAt(index) === 92 ? getEscapedIdentifier() : getIdentifier();\n    if (id2.length === 1) {\n      type2 = TokenIdentifier;\n    } else if (keywords.hasOwnProperty(id2)) {\n      type2 = TokenKeyword;\n    } else if (id2 === \"null\") {\n      type2 = TokenNullLiteral;\n    } else if (id2 === \"true\" || id2 === \"false\") {\n      type2 = TokenBooleanLiteral;\n    } else {\n      type2 = TokenIdentifier;\n    }\n    return {\n      type: type2,\n      value: id2,\n      start,\n      end: index\n    };\n  }\n  function scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch (code) {\n      // Check for most common single-character punctuators.\n      case 46:\n      // . dot\n      case 40:\n      // ( open bracket\n      case 41:\n      // ) close bracket\n      case 59:\n      // ; semicolon\n      case 44:\n      // , comma\n      case 123:\n      // { open curly brace\n      case 125:\n      // } close curly brace\n      case 91:\n      // [\n      case 93:\n      // ]\n      case 58:\n      // :\n      case 63:\n      // ?\n      case 126:\n        ++index;\n        return {\n          type: TokenPunctuator,\n          value: String.fromCharCode(code),\n          start,\n          end: index\n        };\n      default:\n        code2 = source.charCodeAt(index + 1);\n        if (code2 === 61) {\n          switch (code) {\n            case 43:\n            // +\n            case 45:\n            // -\n            case 47:\n            // /\n            case 60:\n            // <\n            case 62:\n            // >\n            case 94:\n            // ^\n            case 124:\n            // |\n            case 37:\n            // %\n            case 38:\n            // &\n            case 42:\n              index += 2;\n              return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code) + String.fromCharCode(code2),\n                start,\n                end: index\n              };\n            case 33:\n            // !\n            case 61:\n              index += 2;\n              if (source.charCodeAt(index) === 61) {\n                ++index;\n              }\n              return {\n                type: TokenPunctuator,\n                value: source.slice(start, index),\n                start,\n                end: index\n              };\n          }\n        }\n    }\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n      index += 4;\n      return {\n        type: TokenPunctuator,\n        value: ch4,\n        start,\n        end: index\n      };\n    }\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n      index += 3;\n      return {\n        type: TokenPunctuator,\n        value: ch3,\n        start,\n        end: index\n      };\n    }\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".includes(ch1) || ch2 === \"=>\") {\n      index += 2;\n      return {\n        type: TokenPunctuator,\n        value: ch2,\n        start,\n        end: index\n      };\n    }\n    if (ch2 === \"//\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (\"<>=!+-*%&|^/\".includes(ch1)) {\n      ++index;\n      return {\n        type: TokenPunctuator,\n        value: ch1,\n        start,\n        end: index\n      };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n  }\n  function scanHexLiteral(start) {\n    let number2 = \"\";\n    while (index < length) {\n      if (!isHexDigit(source[index])) {\n        break;\n      }\n      number2 += source[index++];\n    }\n    if (number2.length === 0) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseInt(\"0x\" + number2, 16),\n      start,\n      end: index\n    };\n  }\n  function scanOctalLiteral(start) {\n    let number2 = \"0\" + source[index++];\n    while (index < length) {\n      if (!isOctalDigit(source[index])) {\n        break;\n      }\n      number2 += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseInt(number2, 8),\n      octal: true,\n      start,\n      end: index\n    };\n  }\n  function scanNumericLiteral() {\n    var number2, start, ch2;\n    ch2 = source[index];\n    assert(isDecimalDigit(ch2.charCodeAt(0)) || ch2 === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number2 = \"\";\n    if (ch2 !== \".\") {\n      number2 = source[index++];\n      ch2 = source[index];\n      if (number2 === \"0\") {\n        if (ch2 === \"x\" || ch2 === \"X\") {\n          ++index;\n          return scanHexLiteral(start);\n        }\n        if (isOctalDigit(ch2)) {\n          return scanOctalLiteral(start);\n        }\n        if (ch2 && isDecimalDigit(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n      }\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number2 += source[index++];\n      }\n      ch2 = source[index];\n    }\n    if (ch2 === \".\") {\n      number2 += source[index++];\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number2 += source[index++];\n      }\n      ch2 = source[index];\n    }\n    if (ch2 === \"e\" || ch2 === \"E\") {\n      number2 += source[index++];\n      ch2 = source[index];\n      if (ch2 === \"+\" || ch2 === \"-\") {\n        number2 += source[index++];\n      }\n      if (isDecimalDigit(source.charCodeAt(index))) {\n        while (isDecimalDigit(source.charCodeAt(index))) {\n          number2 += source[index++];\n        }\n      } else {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseFloat(number2),\n      start,\n      end: index\n    };\n  }\n  function scanStringLiteral() {\n    var str = \"\", quote, start, ch2, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while (index < length) {\n      ch2 = source[index++];\n      if (ch2 === quote) {\n        quote = \"\";\n        break;\n      } else if (ch2 === \"\\\\\") {\n        ch2 = source[index++];\n        if (!ch2 || !isLineTerminator(ch2.charCodeAt(0))) {\n          switch (ch2) {\n            case \"u\":\n            case \"x\":\n              if (source[index] === \"{\") {\n                ++index;\n                str += scanUnicodeCodePointEscape();\n              } else {\n                str += scanHexEscape(ch2);\n              }\n              break;\n            case \"n\":\n              str += \"\\n\";\n              break;\n            case \"r\":\n              str += \"\\r\";\n              break;\n            case \"t\":\n              str += \"\t\";\n              break;\n            case \"b\":\n              str += \"\\b\";\n              break;\n            case \"f\":\n              str += \"\\f\";\n              break;\n            case \"v\":\n              str += \"\\v\";\n              break;\n            default:\n              if (isOctalDigit(ch2)) {\n                code = \"01234567\".indexOf(ch2);\n                if (code !== 0) {\n                  octal = true;\n                }\n                if (index < length && isOctalDigit(source[index])) {\n                  octal = true;\n                  code = code * 8 + \"01234567\".indexOf(source[index++]);\n                  if (\"0123\".includes(ch2) && index < length && isOctalDigit(source[index])) {\n                    code = code * 8 + \"01234567\".indexOf(source[index++]);\n                  }\n                }\n                str += String.fromCharCode(code);\n              } else {\n                str += ch2;\n              }\n              break;\n          }\n        } else {\n          if (ch2 === \"\\r\" && source[index] === \"\\n\") {\n            ++index;\n          }\n        }\n      } else if (isLineTerminator(ch2.charCodeAt(0))) {\n        break;\n      } else {\n        str += ch2;\n      }\n    }\n    if (quote !== \"\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenStringLiteral,\n      value: str,\n      octal,\n      start,\n      end: index\n    };\n  }\n  function testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.includes(\"u\")) {\n      tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1) => {\n        if (parseInt($1, 16) <= 1114111) {\n          return \"x\";\n        }\n        throwError({}, MessageInvalidRegExp);\n      }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n    }\n    try {\n      new RegExp(tmp);\n    } catch (e) {\n      throwError({}, MessageInvalidRegExp);\n    }\n    try {\n      return new RegExp(pattern, flags);\n    } catch (exception) {\n      return null;\n    }\n  }\n  function scanRegExpBody() {\n    var ch2, str, classMarker, terminated, body;\n    ch2 = source[index];\n    assert(ch2 === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while (index < length) {\n      ch2 = source[index++];\n      str += ch2;\n      if (ch2 === \"\\\\\") {\n        ch2 = source[index++];\n        if (isLineTerminator(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnterminatedRegExp);\n        }\n        str += ch2;\n      } else if (isLineTerminator(ch2.charCodeAt(0))) {\n        throwError({}, MessageUnterminatedRegExp);\n      } else if (classMarker) {\n        if (ch2 === \"]\") {\n          classMarker = false;\n        }\n      } else {\n        if (ch2 === \"/\") {\n          terminated = true;\n          break;\n        } else if (ch2 === \"[\") {\n          classMarker = true;\n        }\n      }\n    }\n    if (!terminated) {\n      throwError({}, MessageUnterminatedRegExp);\n    }\n    body = str.substr(1, str.length - 2);\n    return {\n      value: body,\n      literal: str\n    };\n  }\n  function scanRegExpFlags() {\n    var ch2, str, flags;\n    str = \"\";\n    flags = \"\";\n    while (index < length) {\n      ch2 = source[index];\n      if (!isIdentifierPart(ch2.charCodeAt(0))) {\n        break;\n      }\n      ++index;\n      if (ch2 === \"\\\\\" && index < length) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      } else {\n        flags += ch2;\n        str += ch2;\n      }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) {\n      throwError({}, MessageInvalidRegExp, flags);\n    }\n    return {\n      value: flags,\n      literal: str\n    };\n  }\n  function scanRegExp() {\n    var start, body, flags, value2;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value2 = testRegExp(body.value, flags.value);\n    return {\n      literal: body.literal + flags.literal,\n      value: value2,\n      regex: {\n        pattern: body.value,\n        flags: flags.value\n      },\n      start,\n      end: index\n    };\n  }\n  function isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n  }\n  function advance() {\n    skipComment();\n    if (index >= length) {\n      return {\n        type: TokenEOF,\n        start: index,\n        end: index\n      };\n    }\n    const ch2 = source.charCodeAt(index);\n    if (isIdentifierStart(ch2)) {\n      return scanIdentifier();\n    }\n    if (ch2 === 40 || ch2 === 41 || ch2 === 59) {\n      return scanPunctuator();\n    }\n    if (ch2 === 39 || ch2 === 34) {\n      return scanStringLiteral();\n    }\n    if (ch2 === 46) {\n      if (isDecimalDigit(source.charCodeAt(index + 1))) {\n        return scanNumericLiteral();\n      }\n      return scanPunctuator();\n    }\n    if (isDecimalDigit(ch2)) {\n      return scanNumericLiteral();\n    }\n    return scanPunctuator();\n  }\n  function lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n  }\n  function peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n  }\n  function finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n  }\n  function finishBinaryExpression(operator2, left, right) {\n    const node = new ASTNode(operator2 === \"||\" || operator2 === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator2;\n    node.left = left;\n    node.right = right;\n    return node;\n  }\n  function finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n  }\n  function finishConditionalExpression(test2, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test2;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n  }\n  function finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n  }\n  function finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n      if (node.raw === \"//\") {\n        node.raw = \"/(?:)/\";\n      }\n      node.regex = token.regex;\n    }\n    return node;\n  }\n  function finishMemberExpression(accessor2, object2, property2) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor2 === \"[\";\n    node.object = object2;\n    node.property = property2;\n    if (!node.computed) property2.member = true;\n    return node;\n  }\n  function finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n  }\n  function finishProperty(kind, key2, value2) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key2;\n    node.value = value2;\n    node.kind = kind;\n    return node;\n  }\n  function finishUnaryExpression(operator2, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator2;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n  }\n  function throwError(token, messageFormat) {\n    var error2, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index2) => {\n      assert(index2 < args.length, \"Message reference must be in range\");\n      return args[index2];\n    });\n    error2 = new Error(msg);\n    error2.index = index;\n    error2.description = msg;\n    throw error2;\n  }\n  function throwUnexpected(token) {\n    if (token.type === TokenEOF) {\n      throwError(token, MessageUnexpectedEOS);\n    }\n    if (token.type === TokenNumericLiteral) {\n      throwError(token, MessageUnexpectedNumber);\n    }\n    if (token.type === TokenStringLiteral) {\n      throwError(token, MessageUnexpectedString);\n    }\n    if (token.type === TokenIdentifier) {\n      throwError(token, MessageUnexpectedIdentifier);\n    }\n    if (token.type === TokenKeyword) {\n      throwError(token, MessageUnexpectedReserved);\n    }\n    throwError(token, MessageUnexpectedToken, token.value);\n  }\n  function expect(value2) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value2) {\n      throwUnexpected(token);\n    }\n  }\n  function match(value2) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value2;\n  }\n  function matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n  }\n  function parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while (!match(\"]\")) {\n      if (match(\",\")) {\n        lex();\n        elements.push(null);\n      } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) {\n          expect(\",\");\n        }\n      }\n    }\n    lex();\n    return finishArrayExpression(elements);\n  }\n  function parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex();\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n      if (token.octal) {\n        throwError(token, MessageStrictOctalLiteral);\n      }\n      return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n  }\n  function parseObjectProperty() {\n    var token, key2, id2, value2;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n      id2 = parseObjectPropertyKey();\n      expect(\":\");\n      value2 = parseConditionalExpression();\n      return finishProperty(\"init\", id2, value2);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) {\n      throwUnexpected(token);\n    } else {\n      key2 = parseObjectPropertyKey();\n      expect(\":\");\n      value2 = parseConditionalExpression();\n      return finishProperty(\"init\", key2, value2);\n    }\n  }\n  function parseObjectInitialiser() {\n    var properties = [], property2, name, key2, map2 = {}, toString2 = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while (!match(\"}\")) {\n      property2 = parseObjectProperty();\n      if (property2.key.type === SyntaxIdentifier) {\n        name = property2.key.name;\n      } else {\n        name = toString2(property2.key.value);\n      }\n      key2 = \"$\" + name;\n      if (Object.prototype.hasOwnProperty.call(map2, key2)) {\n        throwError({}, MessageStrictDuplicateProperty);\n      } else {\n        map2[key2] = true;\n      }\n      properties.push(property2);\n      if (!match(\"}\")) {\n        expect(\",\");\n      }\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n  }\n  function parseGroupExpression() {\n    expect(\"(\");\n    const expr2 = parseExpression();\n    expect(\")\");\n    return expr2;\n  }\n  const legalKeywords = {\n    \"if\": 1\n  };\n  function parsePrimaryExpression() {\n    var type2, token, expr2;\n    if (match(\"(\")) {\n      return parseGroupExpression();\n    }\n    if (match(\"[\")) {\n      return parseArrayInitialiser();\n    }\n    if (match(\"{\")) {\n      return parseObjectInitialiser();\n    }\n    type2 = lookahead.type;\n    index = lookahead.start;\n    if (type2 === TokenIdentifier || legalKeywords[lookahead.value]) {\n      expr2 = finishIdentifier(lex().value);\n    } else if (type2 === TokenStringLiteral || type2 === TokenNumericLiteral) {\n      if (lookahead.octal) {\n        throwError(lookahead, MessageStrictOctalLiteral);\n      }\n      expr2 = finishLiteral(lex());\n    } else if (type2 === TokenKeyword) {\n      throw new Error(DISABLED);\n    } else if (type2 === TokenBooleanLiteral) {\n      token = lex();\n      token.value = token.value === \"true\";\n      expr2 = finishLiteral(token);\n    } else if (type2 === TokenNullLiteral) {\n      token = lex();\n      token.value = null;\n      expr2 = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n      expr2 = finishLiteral(scanRegExp());\n      peek();\n    } else {\n      throwUnexpected(lex());\n    }\n    return expr2;\n  }\n  function parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) {\n      while (index < length) {\n        args.push(parseConditionalExpression());\n        if (match(\")\")) {\n          break;\n        }\n        expect(\",\");\n      }\n    }\n    expect(\")\");\n    return args;\n  }\n  function parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) {\n      throwUnexpected(token);\n    }\n    return finishIdentifier(token.value);\n  }\n  function parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n  }\n  function parseComputedMember() {\n    expect(\"[\");\n    const expr2 = parseExpression();\n    expect(\"]\");\n    return expr2;\n  }\n  function parseLeftHandSideExpressionAllowCall() {\n    var expr2, args, property2;\n    expr2 = parsePrimaryExpression();\n    for (; ; ) {\n      if (match(\".\")) {\n        property2 = parseNonComputedMember();\n        expr2 = finishMemberExpression(\".\", expr2, property2);\n      } else if (match(\"(\")) {\n        args = parseArguments();\n        expr2 = finishCallExpression(expr2, args);\n      } else if (match(\"[\")) {\n        property2 = parseComputedMember();\n        expr2 = finishMemberExpression(\"[\", expr2, property2);\n      } else {\n        break;\n      }\n    }\n    return expr2;\n  }\n  function parsePostfixExpression() {\n    const expr2 = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n      if (match(\"++\") || match(\"--\")) {\n        throw new Error(DISABLED);\n      }\n    }\n    return expr2;\n  }\n  function parseUnaryExpression() {\n    var token, expr2;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) {\n      expr2 = parsePostfixExpression();\n    } else if (match(\"++\") || match(\"--\")) {\n      throw new Error(DISABLED);\n    } else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n      token = lex();\n      expr2 = parseUnaryExpression();\n      expr2 = finishUnaryExpression(token.value, expr2);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) {\n      throw new Error(DISABLED);\n    } else {\n      expr2 = parsePostfixExpression();\n    }\n    return expr2;\n  }\n  function binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) {\n      return 0;\n    }\n    switch (token.value) {\n      case \"||\":\n        prec = 1;\n        break;\n      case \"&&\":\n        prec = 2;\n        break;\n      case \"|\":\n        prec = 3;\n        break;\n      case \"^\":\n        prec = 4;\n        break;\n      case \"&\":\n        prec = 5;\n        break;\n      case \"==\":\n      case \"!=\":\n      case \"===\":\n      case \"!==\":\n        prec = 6;\n        break;\n      case \"<\":\n      case \">\":\n      case \"<=\":\n      case \">=\":\n      case \"instanceof\":\n      case \"in\":\n        prec = 7;\n        break;\n      case \"<<\":\n      case \">>\":\n      case \">>>\":\n        prec = 8;\n        break;\n      case \"+\":\n      case \"-\":\n        prec = 9;\n        break;\n      case \"*\":\n      case \"/\":\n      case \"%\":\n        prec = 11;\n        break;\n    }\n    return prec;\n  }\n  function parseBinaryExpression() {\n    var marker, markers, expr2, token, prec, stack, right, operator2, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) {\n      return left;\n    }\n    token.prec = prec;\n    lex();\n    markers = [marker, lookahead];\n    right = parseUnaryExpression();\n    stack = [left, token, right];\n    while ((prec = binaryPrecedence(lookahead)) > 0) {\n      while (stack.length > 2 && prec <= stack[stack.length - 2].prec) {\n        right = stack.pop();\n        operator2 = stack.pop().value;\n        left = stack.pop();\n        markers.pop();\n        expr2 = finishBinaryExpression(operator2, left, right);\n        stack.push(expr2);\n      }\n      token = lex();\n      token.prec = prec;\n      stack.push(token);\n      markers.push(lookahead);\n      expr2 = parseUnaryExpression();\n      stack.push(expr2);\n    }\n    i = stack.length - 1;\n    expr2 = stack[i];\n    markers.pop();\n    while (i > 1) {\n      markers.pop();\n      expr2 = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr2);\n      i -= 2;\n    }\n    return expr2;\n  }\n  function parseConditionalExpression() {\n    var expr2, consequent, alternate;\n    expr2 = parseBinaryExpression();\n    if (match(\"?\")) {\n      lex();\n      consequent = parseConditionalExpression();\n      expect(\":\");\n      alternate = parseConditionalExpression();\n      expr2 = finishConditionalExpression(expr2, consequent, alternate);\n    }\n    return expr2;\n  }\n  function parseExpression() {\n    const expr2 = parseConditionalExpression();\n    if (match(\",\")) {\n      throw new Error(DISABLED);\n    }\n    return expr2;\n  }\n  function parser$1(code) {\n    source = code;\n    index = 0;\n    length = source.length;\n    lookahead = null;\n    peek();\n    const expr2 = parseExpression();\n    if (lookahead.type !== TokenEOF) {\n      throw new Error(\"Unexpect token after expression.\");\n    }\n    return expr2;\n  }\n  var Constants = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n  };\n  function Functions(codegen2) {\n    function fncall(name, args, cast, type2) {\n      let obj2 = codegen2(args[0]);\n      if (cast) {\n        obj2 = cast + \"(\" + obj2 + \")\";\n        if (cast.lastIndexOf(\"new \", 0) === 0) obj2 = \"(\" + obj2 + \")\";\n      }\n      return obj2 + \".\" + name + (type2 < 0 ? \"\" : type2 === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen2).join(\",\") + \")\");\n    }\n    function fn2(name, cast, type2) {\n      return (args) => fncall(name, args, cast, type2);\n    }\n    const DATE2 = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n      // MATH functions\n      isNaN: \"Number.isNaN\",\n      isFinite: \"Number.isFinite\",\n      abs: \"Math.abs\",\n      acos: \"Math.acos\",\n      asin: \"Math.asin\",\n      atan: \"Math.atan\",\n      atan2: \"Math.atan2\",\n      ceil: \"Math.ceil\",\n      cos: \"Math.cos\",\n      exp: \"Math.exp\",\n      floor: \"Math.floor\",\n      hypot: \"Math.hypot\",\n      log: \"Math.log\",\n      max: \"Math.max\",\n      min: \"Math.min\",\n      pow: \"Math.pow\",\n      random: \"Math.random\",\n      round: \"Math.round\",\n      sin: \"Math.sin\",\n      sqrt: \"Math.sqrt\",\n      tan: \"Math.tan\",\n      clamp: function(args) {\n        if (args.length < 3) error(\"Missing arguments to clamp function.\");\n        if (args.length > 3) error(\"Too many arguments to clamp function.\");\n        const a2 = args.map(codegen2);\n        return \"Math.max(\" + a2[1] + \", Math.min(\" + a2[2] + \",\" + a2[0] + \"))\";\n      },\n      // DATE functions\n      now: \"Date.now\",\n      utc: \"Date.UTC\",\n      datetime: DATE2,\n      date: fn2(\"getDate\", DATE2, 0),\n      day: fn2(\"getDay\", DATE2, 0),\n      year: fn2(\"getFullYear\", DATE2, 0),\n      month: fn2(\"getMonth\", DATE2, 0),\n      hours: fn2(\"getHours\", DATE2, 0),\n      minutes: fn2(\"getMinutes\", DATE2, 0),\n      seconds: fn2(\"getSeconds\", DATE2, 0),\n      milliseconds: fn2(\"getMilliseconds\", DATE2, 0),\n      time: fn2(\"getTime\", DATE2, 0),\n      timezoneoffset: fn2(\"getTimezoneOffset\", DATE2, 0),\n      utcdate: fn2(\"getUTCDate\", DATE2, 0),\n      utcday: fn2(\"getUTCDay\", DATE2, 0),\n      utcyear: fn2(\"getUTCFullYear\", DATE2, 0),\n      utcmonth: fn2(\"getUTCMonth\", DATE2, 0),\n      utchours: fn2(\"getUTCHours\", DATE2, 0),\n      utcminutes: fn2(\"getUTCMinutes\", DATE2, 0),\n      utcseconds: fn2(\"getUTCSeconds\", DATE2, 0),\n      utcmilliseconds: fn2(\"getUTCMilliseconds\", DATE2, 0),\n      // sequence functions\n      length: fn2(\"length\", null, -1),\n      // STRING functions\n      parseFloat: \"parseFloat\",\n      parseInt: \"parseInt\",\n      upper: fn2(\"toUpperCase\", STRING, 0),\n      lower: fn2(\"toLowerCase\", STRING, 0),\n      substring: fn2(\"substring\", STRING),\n      split: fn2(\"split\", STRING),\n      trim: fn2(\"trim\", STRING, 0),\n      // base64 encode/decode\n      btoa: \"btoa\",\n      atob: \"atob\",\n      // REGEXP functions\n      regexp: REGEXP,\n      test: fn2(\"test\", REGEXP),\n      // Control Flow functions\n      if: function(args) {\n        if (args.length < 3) error(\"Missing arguments to if function.\");\n        if (args.length > 3) error(\"Too many arguments to if function.\");\n        const a2 = args.map(codegen2);\n        return \"(\" + a2[0] + \"?\" + a2[1] + \":\" + a2[2] + \")\";\n      }\n    };\n  }\n  function stripQuotes(s2) {\n    const n = s2 && s2.length - 1;\n    return n && (s2[0] === '\"' && s2[n] === '\"' || s2[0] === \"'\" && s2[n] === \"'\") ? s2.slice(1, -1) : s2;\n  }\n  function codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? toSet(opt.allowed) : {}, forbidden = opt.forbidden ? toSet(opt.forbidden) : {}, constants2 = opt.constants || Constants, functions = (opt.functions || Functions)(visit2), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = isFunction(globalvar) ? globalvar : (id2) => `${globalvar}[\"${id2}\"]`;\n    /* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype).filter((name) => typeof Object.prototype[name] === \"function\"), \"__proto__\"]);\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit2(ast) {\n      if (isString(ast)) return ast;\n      const generator = Generators[ast.type];\n      if (generator == null) error(\"Unsupported type: \" + ast.type);\n      return generator(ast);\n    }\n    const Generators = {\n      Literal: (n) => n.raw,\n      Identifier: (n) => {\n        const id2 = n.name;\n        if (memberDepth > 0) {\n          return id2;\n        } else if (has$1(forbidden, id2)) {\n          return error(\"Illegal identifier: \" + id2);\n        } else if (has$1(constants2, id2)) {\n          return constants2[id2];\n        } else if (has$1(allowed, id2)) {\n          return id2;\n        } else {\n          globals[id2] = 1;\n          return outputGlobal(id2);\n        }\n      },\n      MemberExpression: (n) => {\n        const d2 = !n.computed, o = visit2(n.object);\n        if (d2) memberDepth += 1;\n        const p = visit2(n.property);\n        if (o === fieldvar) {\n          fields[stripQuotes(p)] = 1;\n        }\n        if (d2) memberDepth -= 1;\n        return o + (d2 ? \".\" + p : \"[\" + p + \"]\");\n      },\n      CallExpression: (n) => {\n        if (n.callee.type !== \"Identifier\") {\n          error(\"Illegal callee type: \" + n.callee.type);\n        }\n        const callee = n.callee.name, args = n.arguments, fn2 = has$1(functions, callee) && functions[callee];\n        if (!fn2) error(\"Unrecognized function: \" + callee);\n        return isFunction(fn2) ? fn2(args) : fn2 + \"(\" + args.map(visit2).join(\",\") + \")\";\n      },\n      ArrayExpression: (n) => \"[\" + n.elements.map(visit2).join(\",\") + \"]\",\n      BinaryExpression: (n) => \"(\" + visit2(n.left) + \" \" + n.operator + \" \" + visit2(n.right) + \")\",\n      UnaryExpression: (n) => \"(\" + n.operator + visit2(n.argument) + \")\",\n      ConditionalExpression: (n) => \"(\" + visit2(n.test) + \"?\" + visit2(n.consequent) + \":\" + visit2(n.alternate) + \")\",\n      LogicalExpression: (n) => \"(\" + visit2(n.left) + n.operator + visit2(n.right) + \")\",\n      ObjectExpression: (n) => {\n        for (const prop of n.properties) {\n          const keyName = prop.key.name;\n          if (DisallowedObjectProperties.has(keyName)) {\n            error(\"Illegal property: \" + keyName);\n          }\n        }\n        return \"{\" + n.properties.map(visit2).join(\",\") + \"}\";\n      },\n      Property: (n) => {\n        memberDepth += 1;\n        const k = visit2(n.key);\n        memberDepth -= 1;\n        return k + \":\" + visit2(n.value);\n      }\n    };\n    function codegen2(ast) {\n      const result = {\n        code: visit2(ast),\n        globals: Object.keys(globals),\n        fields: Object.keys(fields)\n      };\n      globals = {};\n      fields = {};\n      return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants2;\n    return codegen2;\n  }\n  const SELECTION_GETTER = Symbol(\"vega_selection_getter\");\n  function getter(f) {\n    if (!f.getter || !f.getter[SELECTION_GETTER]) {\n      f.getter = field$1(f.field);\n      f.getter[SELECTION_GETTER] = true;\n    }\n    return f.getter;\n  }\n  const Intersect = \"intersect\";\n  const Union = \"union\";\n  const VlMulti = \"vlMulti\";\n  const VlPoint = \"vlPoint\";\n  const Or = \"or\";\n  const And = \"and\";\n  const SelectionId = \"_vgsid_\";\n  const $selectionId = field$1(SelectionId);\n  const TYPE_ENUM = \"E\", TYPE_RANGE_INC = \"R\", TYPE_RANGE_EXC = \"R-E\", TYPE_RANGE_LE = \"R-LE\", TYPE_RANGE_RE = \"R-RE\", TYPE_PRED_LT = \"E-LT\", TYPE_PRED_LTE = \"E-LTE\", TYPE_PRED_GT = \"E-GT\", TYPE_PRED_GTE = \"E-GTE\", TYPE_PRED_VALID = \"E-VALID\", TYPE_PRED_ONE_OF = \"E-ONE\", UNIT_INDEX = \"index:unit\";\n  function testPoint(datum2, entry2) {\n    var fields = entry2.fields, values2 = entry2.values, n = fields.length, i = 0, dval, f;\n    for (; i < n; ++i) {\n      f = fields[i];\n      dval = getter(f)(datum2);\n      if (isDate$1(dval)) dval = toNumber(dval);\n      if (isDate$1(values2[i])) values2[i] = toNumber(values2[i]);\n      if (isArray(values2[i]) && isDate$1(values2[i][0])) values2[i] = values2[i].map(toNumber);\n      if (f.type === TYPE_ENUM) {\n        if (isArray(values2[i]) ? !values2[i].includes(dval) : dval !== values2[i]) {\n          return false;\n        }\n      } else {\n        if (f.type === TYPE_RANGE_INC) {\n          if (!inrange(dval, values2[i])) return false;\n        } else if (f.type === TYPE_RANGE_RE) {\n          if (!inrange(dval, values2[i], true, false)) return false;\n        } else if (f.type === TYPE_RANGE_EXC) {\n          if (!inrange(dval, values2[i], false, false)) return false;\n        } else if (f.type === TYPE_RANGE_LE) {\n          if (!inrange(dval, values2[i], false, true)) return false;\n        } else if (f.type === TYPE_PRED_LT) {\n          if (dval >= values2[i]) return false;\n        } else if (f.type === TYPE_PRED_LTE) {\n          if (dval > values2[i]) return false;\n        } else if (f.type === TYPE_PRED_GT) {\n          if (dval <= values2[i]) return false;\n        } else if (f.type === TYPE_PRED_GTE) {\n          if (dval < values2[i]) return false;\n        } else if (f.type === TYPE_PRED_VALID) {\n          if (dval === null || isNaN(dval)) return false;\n        } else if (f.type === TYPE_PRED_ONE_OF) {\n          if (values2[i].indexOf(dval) === -1) return false;\n        }\n      }\n    }\n    return true;\n  }\n  function selectionTest(name, datum2, op) {\n    var data2 = this.context.data[name], entries = data2 ? data2.values.value : [], unitIdx = data2 ? data2[UNIT_INDEX] && data2[UNIT_INDEX].value : void 0, intersect2 = op === Intersect, n = entries.length, i = 0, entry2, miss, count2, unit2, b2;\n    for (; i < n; ++i) {\n      entry2 = entries[i];\n      if (unitIdx && intersect2) {\n        miss = miss || {};\n        count2 = miss[unit2 = entry2.unit] || 0;\n        if (count2 === -1) continue;\n        b2 = testPoint(datum2, entry2);\n        miss[unit2] = b2 ? -1 : ++count2;\n        if (b2 && unitIdx.size === 1) return true;\n        if (!b2 && count2 === unitIdx.get(unit2).count) return false;\n      } else {\n        b2 = testPoint(datum2, entry2);\n        if (intersect2 ^ b2) return b2;\n      }\n    }\n    return n && intersect2;\n  }\n  const bisect = bisector($selectionId), bisectLeft = bisect.left, bisectRight = bisect.right;\n  function selectionIdTest(name, datum2, op) {\n    const data2 = this.context.data[name], entries = data2 ? data2.values.value : [], unitIdx = data2 ? data2[UNIT_INDEX] && data2[UNIT_INDEX].value : void 0, intersect2 = op === Intersect, value2 = $selectionId(datum2), index2 = bisectLeft(entries, value2);\n    if (index2 === entries.length) return false;\n    if ($selectionId(entries[index2]) !== value2) return false;\n    if (unitIdx && intersect2) {\n      if (unitIdx.size === 1) return true;\n      if (bisectRight(entries, value2) - index2 < unitIdx.size) return false;\n    }\n    return true;\n  }\n  function selectionTuples(array2, base2) {\n    if (!isArray(array2)) {\n      error(\"First argument to selectionTuples must be an array.\");\n    }\n    if (!isObject(base2)) {\n      error(\"Second argument to selectionTuples must be an object.\");\n    }\n    return array2.map((x2) => extend(base2.fields ? {\n      values: base2.fields.map((f) => getter(f)(x2.datum))\n    } : {\n      [SelectionId]: $selectionId(x2.datum)\n    }, base2));\n  }\n  function selectionResolve(name, op, isMulti, vl5) {\n    var data2 = this.context.data[name], entries = data2 ? data2.values.value : [], resolved = {}, multiRes = {}, types2 = {}, entry2, fields, values2, unit2, field2, value2, res, resUnit, type2, union2, n = entries.length, i = 0, j, m2;\n    for (; i < n; ++i) {\n      entry2 = entries[i];\n      unit2 = entry2.unit;\n      fields = entry2.fields;\n      values2 = entry2.values;\n      if (fields && values2) {\n        for (j = 0, m2 = fields.length; j < m2; ++j) {\n          field2 = fields[j];\n          res = resolved[field2.field] || (resolved[field2.field] = {});\n          resUnit = res[unit2] || (res[unit2] = []);\n          types2[field2.field] = type2 = field2.type.charAt(0);\n          union2 = ops[`${type2}_union`];\n          res[unit2] = union2(resUnit, array$4(values2[j]));\n        }\n        if (isMulti) {\n          resUnit = multiRes[unit2] || (multiRes[unit2] = []);\n          resUnit.push(array$4(values2).reduce((obj2, curr, j2) => (obj2[fields[j2].field] = curr, obj2), {}));\n        }\n      } else {\n        field2 = SelectionId;\n        value2 = $selectionId(entry2);\n        res = resolved[field2] || (resolved[field2] = {});\n        resUnit = res[unit2] || (res[unit2] = []);\n        resUnit.push(value2);\n        if (isMulti) {\n          resUnit = multiRes[unit2] || (multiRes[unit2] = []);\n          resUnit.push({\n            [SelectionId]: value2\n          });\n        }\n      }\n    }\n    op = op || Union;\n    if (resolved[SelectionId]) {\n      resolved[SelectionId] = ops[`${SelectionId}_${op}`](...Object.values(resolved[SelectionId]));\n    } else {\n      Object.keys(resolved).forEach((field3) => {\n        resolved[field3] = Object.keys(resolved[field3]).map((unit3) => resolved[field3][unit3]).reduce((acc, curr) => acc === void 0 ? curr : ops[`${types2[field3]}_${op}`](acc, curr));\n      });\n    }\n    entries = Object.keys(multiRes);\n    if (isMulti && entries.length) {\n      const key2 = vl5 ? VlPoint : VlMulti;\n      resolved[key2] = op === Union ? {\n        [Or]: entries.reduce((acc, k) => (acc.push(...multiRes[k]), acc), [])\n      } : {\n        [And]: entries.map((k) => ({\n          [Or]: multiRes[k]\n        }))\n      };\n    }\n    return resolved;\n  }\n  var ops = {\n    [`${SelectionId}_union`]: union,\n    [`${SelectionId}_intersect`]: intersection,\n    E_union: function(base2, value2) {\n      if (!base2.length) return value2;\n      var i = 0, n = value2.length;\n      for (; i < n; ++i) if (!base2.includes(value2[i])) base2.push(value2[i]);\n      return base2;\n    },\n    E_intersect: function(base2, value2) {\n      return !base2.length ? value2 : base2.filter((v) => value2.includes(v));\n    },\n    R_union: function(base2, value2) {\n      var lo = toNumber(value2[0]), hi = toNumber(value2[1]);\n      if (lo > hi) {\n        lo = value2[1];\n        hi = value2[0];\n      }\n      if (!base2.length) return [lo, hi];\n      if (base2[0] > lo) base2[0] = lo;\n      if (base2[1] < hi) base2[1] = hi;\n      return base2;\n    },\n    R_intersect: function(base2, value2) {\n      var lo = toNumber(value2[0]), hi = toNumber(value2[1]);\n      if (lo > hi) {\n        lo = value2[1];\n        hi = value2[0];\n      }\n      if (!base2.length) return [lo, hi];\n      if (hi < base2[0] || base2[1] < lo) {\n        return [];\n      } else {\n        if (base2[0] < lo) base2[0] = lo;\n        if (base2[1] > hi) base2[1] = hi;\n      }\n      return base2;\n    }\n  };\n  const DataPrefix$1 = \":\", IndexPrefix$1 = \"@\";\n  function selectionVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) error(\"First argument to selection functions must be a string literal.\");\n    const data2 = args[0].value, op = args.length >= 2 && peek$1(args).value, field2 = \"unit\", indexName = IndexPrefix$1 + field2, dataName = DataPrefix$1 + data2;\n    if (op === Intersect && !has$1(params2, indexName)) {\n      params2[indexName] = scope.getData(data2).indataRef(scope, field2);\n    }\n    if (!has$1(params2, dataName)) {\n      params2[dataName] = scope.getData(data2).tuplesRef();\n    }\n  }\n  function data$1(name) {\n    const data2 = this.context.data[name];\n    return data2 ? data2.values.value : [];\n  }\n  function indata(name, field2, value2) {\n    const index2 = this.context.data[name][\"index:\" + field2], entry2 = index2 ? index2.value.get(value2) : void 0;\n    return entry2 ? entry2.count : entry2;\n  }\n  function setdata(name, tuples) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input;\n    df.pulse(input, df.changeset().remove(truthy).insert(tuples));\n    return 1;\n  }\n  function encode(item, name, retval) {\n    if (item) {\n      const df = this.context.dataflow, target2 = item.mark.source;\n      df.pulse(target2, df.changeset().encode(item, name));\n    }\n    return retval !== void 0 ? retval : item;\n  }\n  const wrap = (method2) => function(value2, spec) {\n    const locale2 = this.context.dataflow.locale();\n    return value2 === null ? \"null\" : locale2[method2](spec)(value2);\n  };\n  const format = wrap(\"format\");\n  const timeFormat = wrap(\"timeFormat\");\n  const utcFormat = wrap(\"utcFormat\");\n  const timeParse = wrap(\"timeParse\");\n  const utcParse = wrap(\"utcParse\");\n  const dateObj = new Date(2e3, 0, 1);\n  function time(month, day, specifier) {\n    if (!Number.isInteger(month) || !Number.isInteger(day)) return \"\";\n    dateObj.setYear(2e3);\n    dateObj.setMonth(month);\n    dateObj.setDate(day);\n    return timeFormat.call(this, dateObj, specifier);\n  }\n  function monthFormat(month) {\n    return time.call(this, month, 1, \"%B\");\n  }\n  function monthAbbrevFormat(month) {\n    return time.call(this, month, 1, \"%b\");\n  }\n  function dayFormat(day) {\n    return time.call(this, 0, 2 + day, \"%A\");\n  }\n  function dayAbbrevFormat(day) {\n    return time.call(this, 0, 2 + day, \"%a\");\n  }\n  const DataPrefix = \":\";\n  const IndexPrefix = \"@\";\n  const ScalePrefix = \"%\";\n  const SignalPrefix = \"$\";\n  function dataVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) {\n      error(\"First argument to data functions must be a string literal.\");\n    }\n    const data2 = args[0].value, dataName = DataPrefix + data2;\n    if (!has$1(dataName, params2)) {\n      try {\n        params2[dataName] = scope.getData(data2).tuplesRef();\n      } catch (err) {\n      }\n    }\n  }\n  function indataVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) error(\"First argument to indata must be a string literal.\");\n    if (args[1].type !== Literal) error(\"Second argument to indata must be a string literal.\");\n    const data2 = args[0].value, field2 = args[1].value, indexName = IndexPrefix + field2;\n    if (!has$1(indexName, params2)) {\n      params2[indexName] = scope.getData(data2).indataRef(scope, field2);\n    }\n  }\n  function scaleVisitor(name, args, scope, params2) {\n    if (args[0].type === Literal) {\n      addScaleDependency(scope, params2, args[0].value);\n    } else {\n      for (name in scope.scales) {\n        addScaleDependency(scope, params2, name);\n      }\n    }\n  }\n  function addScaleDependency(scope, params2, name) {\n    const scaleName = ScalePrefix + name;\n    if (!has$1(params2, scaleName)) {\n      try {\n        params2[scaleName] = scope.scaleRef(name);\n      } catch (err) {\n      }\n    }\n  }\n  function getScale(nameOrFunction, ctx) {\n    if (isString(nameOrFunction)) {\n      const maybeScale = ctx.scales[nameOrFunction];\n      return maybeScale && isRegisteredScale(maybeScale.value) ? maybeScale.value : void 0;\n    } else if (isFunction(nameOrFunction)) {\n      return isRegisteredScale(nameOrFunction) ? nameOrFunction : void 0;\n    }\n    return void 0;\n  }\n  function internalScaleFunctions(codegen2, fnctx, visitors) {\n    fnctx.__bandwidth = (s2) => s2 && s2.bandwidth ? s2.bandwidth() : 0;\n    visitors._bandwidth = scaleVisitor;\n    visitors._range = scaleVisitor;\n    visitors._scale = scaleVisitor;\n    const ref2 = (arg) => \"_[\" + (arg.type === Literal ? $(ScalePrefix + arg.value) : $(ScalePrefix) + \"+\" + codegen2(arg)) + \"]\";\n    return {\n      _bandwidth: (args) => `this.__bandwidth(${ref2(args[0])})`,\n      _range: (args) => `${ref2(args[0])}.range()`,\n      _scale: (args) => `${ref2(args[0])}(${codegen2(args[1])})`\n    };\n  }\n  function geoMethod(methodName, globalMethod) {\n    return function(projection2, geojson, group2) {\n      if (projection2) {\n        const p = getScale(projection2, (group2 || this).context);\n        return p && p.path[methodName](geojson);\n      } else {\n        return globalMethod(geojson);\n      }\n    };\n  }\n  const geoArea = geoMethod(\"area\", geoArea$1);\n  const geoBounds = geoMethod(\"bounds\", geoBounds$1);\n  const geoCentroid = geoMethod(\"centroid\", geoCentroid$1);\n  function geoScale(projection2, group2) {\n    const p = getScale(projection2, (group2 || this).context);\n    return p && p.scale();\n  }\n  function inScope(item) {\n    const group2 = this.context.group;\n    let value2 = false;\n    if (group2) while (item) {\n      if (item === group2) {\n        value2 = true;\n        break;\n      }\n      item = item.mark.group;\n    }\n    return value2;\n  }\n  function log(df, method2, args) {\n    try {\n      df[method2].apply(df, [\"EXPRESSION\"].concat([].slice.call(args)));\n    } catch (err) {\n      df.warn(err);\n    }\n    return args[args.length - 1];\n  }\n  function warn() {\n    return log(this.context.dataflow, \"warn\", arguments);\n  }\n  function info() {\n    return log(this.context.dataflow, \"info\", arguments);\n  }\n  function debug() {\n    return log(this.context.dataflow, \"debug\", arguments);\n  }\n  function channel_luminance_value(channelValue) {\n    const val = channelValue / 255;\n    if (val <= 0.03928) {\n      return val / 12.92;\n    }\n    return Math.pow((val + 0.055) / 1.055, 2.4);\n  }\n  function luminance(color2) {\n    const c2 = rgb$1(color2), r = channel_luminance_value(c2.r), g = channel_luminance_value(c2.g), b2 = channel_luminance_value(c2.b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b2;\n  }\n  function contrast(color1, color2) {\n    const lum1 = luminance(color1), lum2 = luminance(color2), lumL = Math.max(lum1, lum2), lumD = Math.min(lum1, lum2);\n    return (lumL + 0.05) / (lumD + 0.05);\n  }\n  function merge() {\n    const args = [].slice.call(arguments);\n    args.unshift({});\n    return extend(...args);\n  }\n  function equal(a2, b2) {\n    return a2 === b2 || a2 !== a2 && b2 !== b2 ? true : isArray(a2) ? isArray(b2) && a2.length === b2.length ? equalArray(a2, b2) : false : isObject(a2) && isObject(b2) ? equalObject(a2, b2) : false;\n  }\n  function equalArray(a2, b2) {\n    for (let i = 0, n = a2.length; i < n; ++i) {\n      if (!equal(a2[i], b2[i])) return false;\n    }\n    return true;\n  }\n  function equalObject(a2, b2) {\n    for (const key2 in a2) {\n      if (!equal(a2[key2], b2[key2])) return false;\n    }\n    return true;\n  }\n  function removePredicate(props) {\n    return (_) => equalObject(props, _);\n  }\n  function modify(name, insert2, remove2, toggle, modify2, values2) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input, stamp = df.stamp();\n    let changes = data2.changes, predicate, key2;\n    if (df._trigger === false || !(input.value.length || insert2 || toggle)) {\n      return 0;\n    }\n    if (!changes || changes.stamp < stamp) {\n      data2.changes = changes = df.changeset();\n      changes.stamp = stamp;\n      df.runAfter(() => {\n        data2.modified = true;\n        df.pulse(input, changes).run();\n      }, true, 1);\n    }\n    if (remove2) {\n      predicate = remove2 === true ? truthy : isArray(remove2) || isTuple(remove2) ? remove2 : removePredicate(remove2);\n      changes.remove(predicate);\n    }\n    if (insert2) {\n      changes.insert(insert2);\n    }\n    if (toggle) {\n      predicate = removePredicate(toggle);\n      if (input.value.some(predicate)) {\n        changes.remove(predicate);\n      } else {\n        changes.insert(toggle);\n      }\n    }\n    if (modify2) {\n      for (key2 in values2) {\n        changes.modify(modify2, key2, values2[key2]);\n      }\n    }\n    return 1;\n  }\n  function pinchDistance(event2) {\n    const t = event2.touches, dx = t[0].clientX - t[1].clientX, dy = t[0].clientY - t[1].clientY;\n    return Math.hypot(dx, dy);\n  }\n  function pinchAngle(event2) {\n    const t = event2.touches;\n    return Math.atan2(t[0].clientY - t[1].clientY, t[0].clientX - t[1].clientX);\n  }\n  const accessors = {};\n  function pluck(data2, name) {\n    const accessor2 = accessors[name] || (accessors[name] = field$1(name));\n    return isArray(data2) ? data2.map(accessor2) : accessor2(data2);\n  }\n  function array(seq) {\n    return isArray(seq) || ArrayBuffer.isView(seq) ? seq : null;\n  }\n  function sequence(seq) {\n    return array(seq) || (isString(seq) ? seq : null);\n  }\n  function join(seq, ...args) {\n    return array(seq).join(...args);\n  }\n  function indexof(seq, ...args) {\n    return sequence(seq).indexOf(...args);\n  }\n  function lastindexof(seq, ...args) {\n    return sequence(seq).lastIndexOf(...args);\n  }\n  function slice(seq, ...args) {\n    return sequence(seq).slice(...args);\n  }\n  function replace(str, pattern, repl) {\n    if (isFunction(repl)) error(\"Function argument passed to replace.\");\n    if (!isString(pattern) && !isRegExp(pattern)) error(\"Please pass a string or RegExp argument to replace.\");\n    return String(str).replace(pattern, repl);\n  }\n  function reverse(seq) {\n    return array(seq).slice().reverse();\n  }\n  function sort(seq) {\n    return array(seq).slice().sort(ascending$1);\n  }\n  function bandspace(count2, paddingInner, paddingOuter) {\n    return bandSpace(count2 || 0, paddingInner || 0, paddingOuter || 0);\n  }\n  function bandwidth(name, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 && s2.bandwidth ? s2.bandwidth() : 0;\n  }\n  function copy(name, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 ? s2.copy() : void 0;\n  }\n  function domain(name, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 ? s2.domain() : [];\n  }\n  function invert(name, range2, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return !s2 ? void 0 : isArray(range2) ? (s2.invertRange || s2.invert)(range2) : (s2.invert || s2.invertExtent)(range2);\n  }\n  function range$1(name, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 && s2.range ? s2.range() : [];\n  }\n  function scale$2(name, value2, group2) {\n    const s2 = getScale(name, (group2 || this).context);\n    return s2 ? s2(value2) : void 0;\n  }\n  function scaleGradient(scale2, p02, p1, count2, group2) {\n    scale2 = getScale(scale2, (group2 || this).context);\n    const gradient2 = Gradient$1(p02, p1);\n    let stops = scale2.domain(), min2 = stops[0], max2 = peek$1(stops), fraction = identity$2;\n    if (!(max2 - min2)) {\n      scale2 = (scale2.interpolator ? scale$4(\"sequential\")().interpolator(scale2.interpolator()) : scale$4(\"linear\")().interpolate(scale2.interpolate()).range(scale2.range())).domain([min2 = 0, max2 = 1]);\n    } else {\n      fraction = scaleFraction(scale2, min2, max2);\n    }\n    if (scale2.ticks) {\n      stops = scale2.ticks(+count2 || 15);\n      if (min2 !== stops[0]) stops.unshift(min2);\n      if (max2 !== peek$1(stops)) stops.push(max2);\n    }\n    stops.forEach((_) => gradient2.stop(fraction(_), scale2(_)));\n    return gradient2;\n  }\n  function geoShape(projection2, geojson, group2) {\n    const p = getScale(projection2, (group2 || this).context);\n    return function(context2) {\n      return p ? p.path.context(context2)(geojson) : \"\";\n    };\n  }\n  function pathShape(path2) {\n    let p = null;\n    return function(context2) {\n      return context2 ? pathRender(context2, p = p || parse$3(path2)) : path2;\n    };\n  }\n  const datum = (d2) => d2.data;\n  function treeNodes(name, context2) {\n    const tree2 = data$1.call(context2, name);\n    return tree2.root && tree2.root.lookup || {};\n  }\n  function treePath(name, source2, target2) {\n    const nodes = treeNodes(name, this), s2 = nodes[source2], t = nodes[target2];\n    return s2 && t ? s2.path(t).map(datum) : void 0;\n  }\n  function treeAncestors(name, node) {\n    const n = treeNodes(name, this)[node];\n    return n ? n.ancestors().map(datum) : void 0;\n  }\n  const _window = () => typeof window !== \"undefined\" && window || null;\n  function screen() {\n    const w2 = _window();\n    return w2 ? w2.screen : {};\n  }\n  function windowSize() {\n    const w2 = _window();\n    return w2 ? [w2.innerWidth, w2.innerHeight] : [void 0, void 0];\n  }\n  function containerSize() {\n    const view = this.context.dataflow, el = view.container && view.container();\n    return el ? [el.clientWidth, el.clientHeight] : [void 0, void 0];\n  }\n  function intersect(b2, opt, group2) {\n    if (!b2) return [];\n    const [u2, v] = b2, box2 = new Bounds().set(u2[0], u2[1], v[0], v[1]), scene = group2 || this.context.dataflow.scenegraph().root;\n    return intersect$2(scene, box2, filter(opt));\n  }\n  function filter(opt) {\n    let p = null;\n    if (opt) {\n      const types2 = array$4(opt.marktype), names = array$4(opt.markname);\n      p = (_) => (!types2.length || types2.some((t) => _.marktype === t)) && (!names.length || names.some((s2) => _.name === s2));\n    }\n    return p;\n  }\n  function lassoAppend(lasso, x2, y2, minDist = 5) {\n    lasso = array$4(lasso);\n    const last = lasso[lasso.length - 1];\n    return last === void 0 || Math.hypot(last[0] - x2, last[1] - y2) > minDist ? [...lasso, [x2, y2]] : lasso;\n  }\n  function lassoPath(lasso) {\n    return array$4(lasso).reduce((svg, [x2, y2], i) => {\n      return svg += i == 0 ? `M ${x2},${y2} ` : i === lasso.length - 1 ? \" Z\" : `L ${x2},${y2} `;\n    }, \"\");\n  }\n  function intersectLasso(markname, pixelLasso, unit2) {\n    const {\n      x: x2,\n      y: y2,\n      mark\n    } = unit2;\n    const bb = new Bounds().set(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER);\n    for (const [px2, py2] of pixelLasso) {\n      if (px2 < bb.x1) bb.x1 = px2;\n      if (px2 > bb.x2) bb.x2 = px2;\n      if (py2 < bb.y1) bb.y1 = py2;\n      if (py2 > bb.y2) bb.y2 = py2;\n    }\n    bb.translate(x2, y2);\n    const intersection2 = intersect([[bb.x1, bb.y1], [bb.x2, bb.y2]], markname, mark);\n    return intersection2.filter((tuple) => pointInPolygon(tuple.x, tuple.y, pixelLasso));\n  }\n  function pointInPolygon(testx, testy, polygon) {\n    let intersections = 0;\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n      const [prevX, prevY] = polygon[j];\n      const [x2, y2] = polygon[i];\n      if (y2 > testy != prevY > testy && testx < (prevX - x2) * (testy - y2) / (prevY - y2) + x2) {\n        intersections++;\n      }\n    }\n    return intersections & 1;\n  }\n  const functionContext = {\n    random() {\n      return random();\n    },\n    // override default\n    cumulativeNormal,\n    cumulativeLogNormal,\n    cumulativeUniform,\n    densityNormal,\n    densityLogNormal,\n    densityUniform,\n    quantileNormal,\n    quantileLogNormal,\n    quantileUniform,\n    sampleNormal,\n    sampleLogNormal,\n    sampleUniform,\n    isArray,\n    isBoolean: isBoolean$1,\n    isDate: isDate$1,\n    isDefined(_) {\n      return _ !== void 0;\n    },\n    isNumber: isNumber$1,\n    isObject,\n    isRegExp,\n    isString,\n    isTuple,\n    isValid(_) {\n      return _ != null && _ === _;\n    },\n    toBoolean,\n    toDate(_) {\n      return toDate(_);\n    },\n    // suppress extra arguments\n    toNumber,\n    toString,\n    indexof,\n    join,\n    lastindexof,\n    replace,\n    reverse,\n    sort,\n    slice,\n    flush,\n    lerp,\n    merge,\n    pad: pad$1,\n    peek: peek$1,\n    pluck,\n    span,\n    inrange,\n    truncate: truncate$1,\n    rgb: rgb$1,\n    lab: lab$1,\n    hcl: hcl$1,\n    hsl: hsl$1,\n    luminance,\n    contrast,\n    sequence: range$3,\n    format,\n    utcFormat,\n    utcParse,\n    utcOffset,\n    utcSequence,\n    timeFormat,\n    timeParse,\n    timeOffset,\n    timeSequence,\n    timeUnitSpecifier,\n    monthFormat,\n    monthAbbrevFormat,\n    dayFormat,\n    dayAbbrevFormat,\n    quarter,\n    utcquarter,\n    week,\n    utcweek,\n    dayofyear,\n    utcdayofyear,\n    warn,\n    info,\n    debug,\n    extent(_) {\n      return extent(_);\n    },\n    // suppress extra arguments\n    inScope,\n    intersect,\n    clampRange,\n    pinchDistance,\n    pinchAngle,\n    screen,\n    containerSize,\n    windowSize,\n    bandspace,\n    setdata,\n    pathShape,\n    panLinear,\n    panLog,\n    panPow,\n    panSymlog,\n    zoomLinear,\n    zoomLog,\n    zoomPow,\n    zoomSymlog,\n    encode,\n    modify,\n    lassoAppend,\n    lassoPath,\n    intersectLasso\n  };\n  const eventFunctions = [\"view\", \"item\", \"group\", \"xy\", \"x\", \"y\"], eventPrefix = \"event.vega.\", thisPrefix = \"this.\", astVisitors = {};\n  const codegenParams = {\n    forbidden: [\"_\"],\n    allowed: [\"datum\", \"event\", \"item\"],\n    fieldvar: \"datum\",\n    globalvar: (id2) => `_[${$(SignalPrefix + id2)}]`,\n    functions: buildFunctions,\n    constants: Constants,\n    visitors: astVisitors\n  };\n  const codeGenerator = codegen(codegenParams);\n  function buildFunctions(codegen2) {\n    const fn2 = Functions(codegen2);\n    eventFunctions.forEach((name) => fn2[name] = eventPrefix + name);\n    for (const name in functionContext) {\n      fn2[name] = thisPrefix + name;\n    }\n    extend(fn2, internalScaleFunctions(codegen2, functionContext, astVisitors));\n    return fn2;\n  }\n  function expressionFunction(name, fn2, visitor) {\n    if (arguments.length === 1) {\n      return functionContext[name];\n    }\n    functionContext[name] = fn2;\n    if (visitor) astVisitors[name] = visitor;\n    if (codeGenerator) codeGenerator.functions[name] = thisPrefix + name;\n    return this;\n  }\n  expressionFunction(\"bandwidth\", bandwidth, scaleVisitor);\n  expressionFunction(\"copy\", copy, scaleVisitor);\n  expressionFunction(\"domain\", domain, scaleVisitor);\n  expressionFunction(\"range\", range$1, scaleVisitor);\n  expressionFunction(\"invert\", invert, scaleVisitor);\n  expressionFunction(\"scale\", scale$2, scaleVisitor);\n  expressionFunction(\"gradient\", scaleGradient, scaleVisitor);\n  expressionFunction(\"geoArea\", geoArea, scaleVisitor);\n  expressionFunction(\"geoBounds\", geoBounds, scaleVisitor);\n  expressionFunction(\"geoCentroid\", geoCentroid, scaleVisitor);\n  expressionFunction(\"geoShape\", geoShape, scaleVisitor);\n  expressionFunction(\"geoScale\", geoScale, scaleVisitor);\n  expressionFunction(\"indata\", indata, indataVisitor);\n  expressionFunction(\"data\", data$1, dataVisitor);\n  expressionFunction(\"treePath\", treePath, dataVisitor);\n  expressionFunction(\"treeAncestors\", treeAncestors, dataVisitor);\n  expressionFunction(\"vlSelectionTest\", selectionTest, selectionVisitor);\n  expressionFunction(\"vlSelectionIdTest\", selectionIdTest, selectionVisitor);\n  expressionFunction(\"vlSelectionResolve\", selectionResolve, selectionVisitor);\n  expressionFunction(\"vlSelectionTuples\", selectionTuples);\n  function parser(expr2, scope) {\n    const params2 = {};\n    let ast;\n    try {\n      expr2 = isString(expr2) ? expr2 : $(expr2) + \"\";\n      ast = parser$1(expr2);\n    } catch (err) {\n      error(\"Expression parse error: \" + expr2);\n    }\n    ast.visit((node) => {\n      if (node.type !== CallExpression) return;\n      const name = node.callee.name, visit2 = codegenParams.visitors[name];\n      if (visit2) visit2(name, node.arguments, scope, params2);\n    });\n    const gen = codeGenerator(ast);\n    gen.globals.forEach((name) => {\n      const signalName = SignalPrefix + name;\n      if (!has$1(params2, signalName) && scope.getSignal(name)) {\n        params2[signalName] = scope.signalRef(name);\n      }\n    });\n    return {\n      $expr: extend({\n        code: gen.code\n      }, scope.options.ast ? {\n        ast\n      } : null),\n      $fields: gen.fields,\n      $params: params2\n    };\n  }\n  function parse$2(spec) {\n    const ctx = this, operators = spec.operators || [];\n    if (spec.background) {\n      ctx.background = spec.background;\n    }\n    if (spec.eventConfig) {\n      ctx.eventConfig = spec.eventConfig;\n    }\n    if (spec.locale) {\n      ctx.locale = spec.locale;\n    }\n    operators.forEach((entry2) => ctx.parseOperator(entry2));\n    operators.forEach((entry2) => ctx.parseOperatorParameters(entry2));\n    (spec.streams || []).forEach((entry2) => ctx.parseStream(entry2));\n    (spec.updates || []).forEach((entry2) => ctx.parseUpdate(entry2));\n    return ctx.resolve();\n  }\n  const Skip$2 = toSet([\"rule\"]), Swap = toSet([\"group\", \"image\", \"rect\"]);\n  function adjustSpatial(encode2, marktype) {\n    let code = \"\";\n    if (Skip$2[marktype]) return code;\n    if (encode2.x2) {\n      if (encode2.x) {\n        if (Swap[marktype]) {\n          code += \"if(o.x>o.x2)$=o.x,o.x=o.x2,o.x2=$;\";\n        }\n        code += \"o.width=o.x2-o.x;\";\n      } else {\n        code += \"o.x=o.x2-(o.width||0);\";\n      }\n    }\n    if (encode2.xc) {\n      code += \"o.x=o.xc-(o.width||0)/2;\";\n    }\n    if (encode2.y2) {\n      if (encode2.y) {\n        if (Swap[marktype]) {\n          code += \"if(o.y>o.y2)$=o.y,o.y=o.y2,o.y2=$;\";\n        }\n        code += \"o.height=o.y2-o.y;\";\n      } else {\n        code += \"o.y=o.y2-(o.height||0);\";\n      }\n    }\n    if (encode2.yc) {\n      code += \"o.y=o.yc-(o.height||0)/2;\";\n    }\n    return code;\n  }\n  function canonicalType(type2) {\n    return (type2 + \"\").toLowerCase();\n  }\n  function isOperator(type2) {\n    return canonicalType(type2) === \"operator\";\n  }\n  function isCollect(type2) {\n    return canonicalType(type2) === \"collect\";\n  }\n  function expression(ctx, args, code) {\n    if (!code.endsWith(\";\")) {\n      code = \"return(\" + code + \");\";\n    }\n    const fn2 = Function(...args.concat(code));\n    return ctx && ctx.functions ? fn2.bind(ctx.functions) : fn2;\n  }\n  function _compare(u2, v, lt, gt) {\n    return `((u = ${u2}) < (v = ${v}) || u == null) && v != null ? ${lt}\n  : (u > v || v == null) && u != null ? ${gt}\n  : ((v = v instanceof Date ? +v : v), (u = u instanceof Date ? +u : u)) !== u && v === v ? ${lt}\n  : v !== v && u === u ? ${gt} : `;\n  }\n  var expressionCodegen = {\n    /**\n     * Parse an expression used to update an operator value.\n     */\n    operator: (ctx, expr2) => expression(ctx, [\"_\"], expr2.code),\n    /**\n     * Parse an expression provided as an operator parameter value.\n     */\n    parameter: (ctx, expr2) => expression(ctx, [\"datum\", \"_\"], expr2.code),\n    /**\n     * Parse an expression applied to an event stream.\n     */\n    event: (ctx, expr2) => expression(ctx, [\"event\"], expr2.code),\n    /**\n     * Parse an expression used to handle an event-driven operator update.\n     */\n    handler: (ctx, expr2) => {\n      const code = `var datum=event.item&&event.item.datum;return ${expr2.code};`;\n      return expression(ctx, [\"_\", \"event\"], code);\n    },\n    /**\n     * Parse an expression that performs visual encoding.\n     */\n    encode: (ctx, encode2) => {\n      const {\n        marktype,\n        channels\n      } = encode2;\n      let code = \"var o=item,datum=o.datum,m=0,$;\";\n      for (const name in channels) {\n        const o = \"o[\" + $(name) + \"]\";\n        code += `$=${channels[name].code};if(${o}!==$)${o}=$,m=1;`;\n      }\n      code += adjustSpatial(channels, marktype);\n      code += \"return m;\";\n      return expression(ctx, [\"item\", \"_\"], code);\n    },\n    /**\n     * Optimized code generators for access and comparison.\n     */\n    codegen: {\n      get(path2) {\n        const ref2 = `[${path2.map($).join(\"][\")}]`;\n        const get2 = Function(\"_\", `return _${ref2};`);\n        get2.path = ref2;\n        return get2;\n      },\n      comparator(fields, orders) {\n        let t;\n        const map2 = (f, i) => {\n          const o = orders[i];\n          let u2, v;\n          if (f.path) {\n            u2 = `a${f.path}`;\n            v = `b${f.path}`;\n          } else {\n            (t = t || {})[\"f\" + i] = f;\n            u2 = `this.f${i}(a)`;\n            v = `this.f${i}(b)`;\n          }\n          return _compare(u2, v, -o, o);\n        };\n        const fn2 = Function(\"a\", \"b\", \"var u, v; return \" + fields.map(map2).join(\"\") + \"0;\");\n        return t ? fn2.bind(t) : fn2;\n      }\n    }\n  };\n  function parseOperator(spec) {\n    const ctx = this;\n    if (isOperator(spec.type) || !spec.type) {\n      ctx.operator(spec, spec.update ? ctx.operatorExpression(spec.update) : null);\n    } else {\n      ctx.transform(spec, spec.type);\n    }\n  }\n  function parseOperatorParameters(spec) {\n    const ctx = this;\n    if (spec.params) {\n      const op = ctx.get(spec.id);\n      if (!op) error(\"Invalid operator id: \" + spec.id);\n      ctx.dataflow.connect(op, op.parameters(ctx.parseParameters(spec.params), spec.react, spec.initonly));\n    }\n  }\n  function parseParameters$1(spec, params2) {\n    params2 = params2 || {};\n    const ctx = this;\n    for (const key2 in spec) {\n      const value2 = spec[key2];\n      params2[key2] = isArray(value2) ? value2.map((v) => parseParameter$2(v, ctx, params2)) : parseParameter$2(value2, ctx, params2);\n    }\n    return params2;\n  }\n  function parseParameter$2(spec, ctx, params2) {\n    if (!spec || !isObject(spec)) return spec;\n    for (let i = 0, n = PARSERS.length, p; i < n; ++i) {\n      p = PARSERS[i];\n      if (has$1(spec, p.key)) {\n        return p.parse(spec, ctx, params2);\n      }\n    }\n    return spec;\n  }\n  var PARSERS = [{\n    key: \"$ref\",\n    parse: getOperator\n  }, {\n    key: \"$key\",\n    parse: getKey\n  }, {\n    key: \"$expr\",\n    parse: getExpression\n  }, {\n    key: \"$field\",\n    parse: getField\n  }, {\n    key: \"$encode\",\n    parse: getEncode\n  }, {\n    key: \"$compare\",\n    parse: getCompare\n  }, {\n    key: \"$context\",\n    parse: getContext\n  }, {\n    key: \"$subflow\",\n    parse: getSubflow\n  }, {\n    key: \"$tupleid\",\n    parse: getTupleId\n  }];\n  function getOperator(_, ctx) {\n    return ctx.get(_.$ref) || error(\"Operator not defined: \" + _.$ref);\n  }\n  function getExpression(_, ctx, params2) {\n    if (_.$params) {\n      ctx.parseParameters(_.$params, params2);\n    }\n    const k = \"e:\" + _.$expr.code;\n    return ctx.fn[k] || (ctx.fn[k] = accessor(ctx.parameterExpression(_.$expr), _.$fields));\n  }\n  function getKey(_, ctx) {\n    const k = \"k:\" + _.$key + \"_\" + !!_.$flat;\n    return ctx.fn[k] || (ctx.fn[k] = key(_.$key, _.$flat, ctx.expr.codegen));\n  }\n  function getField(_, ctx) {\n    if (!_.$field) return null;\n    const k = \"f:\" + _.$field + \"_\" + _.$name;\n    return ctx.fn[k] || (ctx.fn[k] = field$1(_.$field, _.$name, ctx.expr.codegen));\n  }\n  function getCompare(_, ctx) {\n    const k = \"c:\" + _.$compare + \"_\" + _.$order, c2 = array$4(_.$compare).map((_2) => _2 && _2.$tupleid ? tupleid : _2);\n    return ctx.fn[k] || (ctx.fn[k] = compare$1(c2, _.$order, ctx.expr.codegen));\n  }\n  function getEncode(_, ctx) {\n    const spec = _.$encode, encode2 = {};\n    for (const name in spec) {\n      const enc = spec[name];\n      encode2[name] = accessor(ctx.encodeExpression(enc.$expr), enc.$fields);\n      encode2[name].output = enc.$output;\n    }\n    return encode2;\n  }\n  function getContext(_, ctx) {\n    return ctx;\n  }\n  function getSubflow(_, ctx) {\n    const spec = _.$subflow;\n    return function(dataflow, key2, parent) {\n      const subctx = ctx.fork().parse(spec), op = subctx.get(spec.operators[0].id), p = subctx.signals.parent;\n      if (p) p.set(parent);\n      op.detachSubflow = () => ctx.detach(subctx);\n      return op;\n    };\n  }\n  function getTupleId() {\n    return tupleid;\n  }\n  function parseStream$2(spec) {\n    var ctx = this, filter2 = spec.filter != null ? ctx.eventExpression(spec.filter) : void 0, stream2 = spec.stream != null ? ctx.get(spec.stream) : void 0, args;\n    if (spec.source) {\n      stream2 = ctx.events(spec.source, spec.type, filter2);\n    } else if (spec.merge) {\n      args = spec.merge.map((_) => ctx.get(_));\n      stream2 = args[0].merge.apply(args[0], args.slice(1));\n    }\n    if (spec.between) {\n      args = spec.between.map((_) => ctx.get(_));\n      stream2 = stream2.between(args[0], args[1]);\n    }\n    if (spec.filter) {\n      stream2 = stream2.filter(filter2);\n    }\n    if (spec.throttle != null) {\n      stream2 = stream2.throttle(+spec.throttle);\n    }\n    if (spec.debounce != null) {\n      stream2 = stream2.debounce(+spec.debounce);\n    }\n    if (stream2 == null) {\n      error(\"Invalid stream definition: \" + JSON.stringify(spec));\n    }\n    if (spec.consume) stream2.consume(true);\n    ctx.stream(spec, stream2);\n  }\n  function parseUpdate$1(spec) {\n    var ctx = this, srcid = isObject(srcid = spec.source) ? srcid.$ref : srcid, source2 = ctx.get(srcid), target2 = null, update2 = spec.update, params2 = void 0;\n    if (!source2) error(\"Source not defined: \" + spec.source);\n    target2 = spec.target && spec.target.$expr ? ctx.eventExpression(spec.target.$expr) : ctx.get(spec.target);\n    if (update2 && update2.$expr) {\n      if (update2.$params) {\n        params2 = ctx.parseParameters(update2.$params);\n      }\n      update2 = ctx.handlerExpression(update2.$expr);\n    }\n    ctx.update(spec, source2, target2, update2, params2);\n  }\n  const SKIP = {\n    skip: true\n  };\n  function getState$1(options2) {\n    var ctx = this, state = {};\n    if (options2.signals) {\n      var signals = state.signals = {};\n      Object.keys(ctx.signals).forEach((key2) => {\n        const op = ctx.signals[key2];\n        if (options2.signals(key2, op)) {\n          signals[key2] = op.value;\n        }\n      });\n    }\n    if (options2.data) {\n      var data2 = state.data = {};\n      Object.keys(ctx.data).forEach((key2) => {\n        const dataset = ctx.data[key2];\n        if (options2.data(key2, dataset)) {\n          data2[key2] = dataset.input.value;\n        }\n      });\n    }\n    if (ctx.subcontext && options2.recurse !== false) {\n      state.subcontext = ctx.subcontext.map((ctx2) => ctx2.getState(options2));\n    }\n    return state;\n  }\n  function setState$1(state) {\n    var ctx = this, df = ctx.dataflow, data2 = state.data, signals = state.signals;\n    Object.keys(signals || {}).forEach((key2) => {\n      df.update(ctx.signals[key2], signals[key2], SKIP);\n    });\n    Object.keys(data2 || {}).forEach((key2) => {\n      df.pulse(ctx.data[key2].input, df.changeset().remove(truthy).insert(data2[key2]));\n    });\n    (state.subcontext || []).forEach((substate, i) => {\n      const subctx = ctx.subcontext[i];\n      if (subctx) subctx.setState(substate);\n    });\n  }\n  function context(df, transforms2, functions, expr2) {\n    return new Context(df, transforms2, functions, expr2);\n  }\n  function Context(df, transforms2, functions, expr2) {\n    this.dataflow = df;\n    this.transforms = transforms2;\n    this.events = df.events.bind(df);\n    this.expr = expr2 || expressionCodegen, this.signals = {};\n    this.scales = {};\n    this.nodes = {};\n    this.data = {};\n    this.fn = {};\n    if (functions) {\n      this.functions = Object.create(functions);\n      this.functions.context = this;\n    }\n  }\n  function Subcontext(ctx) {\n    this.dataflow = ctx.dataflow;\n    this.transforms = ctx.transforms;\n    this.events = ctx.events;\n    this.expr = ctx.expr;\n    this.signals = Object.create(ctx.signals);\n    this.scales = Object.create(ctx.scales);\n    this.nodes = Object.create(ctx.nodes);\n    this.data = Object.create(ctx.data);\n    this.fn = Object.create(ctx.fn);\n    if (ctx.functions) {\n      this.functions = Object.create(ctx.functions);\n      this.functions.context = this;\n    }\n  }\n  Context.prototype = Subcontext.prototype = {\n    fork() {\n      const ctx = new Subcontext(this);\n      (this.subcontext || (this.subcontext = [])).push(ctx);\n      return ctx;\n    },\n    detach(ctx) {\n      this.subcontext = this.subcontext.filter((c2) => c2 !== ctx);\n      const keys2 = Object.keys(ctx.nodes);\n      for (const key2 of keys2) ctx.nodes[key2]._targets = null;\n      for (const key2 of keys2) ctx.nodes[key2].detach();\n      ctx.nodes = null;\n    },\n    get(id2) {\n      return this.nodes[id2];\n    },\n    set(id2, node) {\n      return this.nodes[id2] = node;\n    },\n    add(spec, op) {\n      const ctx = this, df = ctx.dataflow, data2 = spec.value;\n      ctx.set(spec.id, op);\n      if (isCollect(spec.type) && data2) {\n        if (data2.$ingest) {\n          df.ingest(op, data2.$ingest, data2.$format);\n        } else if (data2.$request) {\n          df.preload(op, data2.$request, data2.$format);\n        } else {\n          df.pulse(op, df.changeset().insert(data2));\n        }\n      }\n      if (spec.root) {\n        ctx.root = op;\n      }\n      if (spec.parent) {\n        let p = ctx.get(spec.parent.$ref);\n        if (p) {\n          df.connect(p, [op]);\n          op.targets().add(p);\n        } else {\n          (ctx.unresolved = ctx.unresolved || []).push(() => {\n            p = ctx.get(spec.parent.$ref);\n            df.connect(p, [op]);\n            op.targets().add(p);\n          });\n        }\n      }\n      if (spec.signal) {\n        ctx.signals[spec.signal] = op;\n      }\n      if (spec.scale) {\n        ctx.scales[spec.scale] = op;\n      }\n      if (spec.data) {\n        for (const name in spec.data) {\n          const data3 = ctx.data[name] || (ctx.data[name] = {});\n          spec.data[name].forEach((role) => data3[role] = op);\n        }\n      }\n    },\n    resolve() {\n      (this.unresolved || []).forEach((fn2) => fn2());\n      delete this.unresolved;\n      return this;\n    },\n    operator(spec, update2) {\n      this.add(spec, this.dataflow.add(spec.value, update2));\n    },\n    transform(spec, type2) {\n      this.add(spec, this.dataflow.add(this.transforms[canonicalType(type2)]));\n    },\n    stream(spec, stream2) {\n      this.set(spec.id, stream2);\n    },\n    update(spec, stream2, target2, update2, params2) {\n      this.dataflow.on(stream2, target2, update2, params2, spec.options);\n    },\n    // expression parsing\n    operatorExpression(expr2) {\n      return this.expr.operator(this, expr2);\n    },\n    parameterExpression(expr2) {\n      return this.expr.parameter(this, expr2);\n    },\n    eventExpression(expr2) {\n      return this.expr.event(this, expr2);\n    },\n    handlerExpression(expr2) {\n      return this.expr.handler(this, expr2);\n    },\n    encodeExpression(encode2) {\n      return this.expr.encode(this, encode2);\n    },\n    // parse methods\n    parse: parse$2,\n    parseOperator,\n    parseOperatorParameters,\n    parseParameters: parseParameters$1,\n    parseStream: parseStream$2,\n    parseUpdate: parseUpdate$1,\n    // state methods\n    getState: getState$1,\n    setState: setState$1\n  };\n  function initializeAria(view) {\n    const el = view.container();\n    if (el) {\n      el.setAttribute(\"role\", \"graphics-document\");\n      el.setAttribute(\"aria-roleDescription\", \"visualization\");\n      ariaLabel(el, view.description());\n    }\n  }\n  function ariaLabel(el, desc) {\n    if (el) desc == null ? el.removeAttribute(\"aria-label\") : el.setAttribute(\"aria-label\", desc);\n  }\n  function background(view) {\n    view.add(null, (_) => {\n      view._background = _.bg;\n      view._resize = 1;\n      return _.bg;\n    }, {\n      bg: view._signals.background\n    });\n  }\n  const Default = \"default\";\n  function cursor(view) {\n    const cursor2 = view._signals.cursor || (view._signals.cursor = view.add({\n      user: Default,\n      item: null\n    }));\n    view.on(view.events(\"view\", \"pointermove\"), cursor2, (_, event2) => {\n      const value2 = cursor2.value, user = value2 ? isString(value2) ? value2 : value2.user : Default, item = event2.item && event2.item.cursor || null;\n      return value2 && user === value2.user && item == value2.item ? value2 : {\n        user,\n        item\n      };\n    });\n    view.add(null, function(_) {\n      let user = _.cursor, item = this.value;\n      if (!isString(user)) {\n        item = user.item;\n        user = user.user;\n      }\n      setCursor(view, user && user !== Default ? user : item || user);\n      return item;\n    }, {\n      cursor: cursor2\n    });\n  }\n  function setCursor(view, cursor2) {\n    const el = view.globalCursor() ? typeof document !== \"undefined\" && document.body : view.container();\n    if (el) {\n      return cursor2 == null ? el.style.removeProperty(\"cursor\") : el.style.cursor = cursor2;\n    }\n  }\n  function dataref(view, name) {\n    var data2 = view._runtime.data;\n    if (!has$1(data2, name)) {\n      error(\"Unrecognized data set: \" + name);\n    }\n    return data2[name];\n  }\n  function data(name, values2) {\n    return arguments.length < 2 ? dataref(this, name).values.value : change.call(this, name, changeset().remove(truthy).insert(values2));\n  }\n  function change(name, changes) {\n    if (!isChangeSet(changes)) {\n      error(\"Second argument to changes must be a changeset.\");\n    }\n    const dataset = dataref(this, name);\n    dataset.modified = true;\n    return this.pulse(dataset.input, changes);\n  }\n  function insert(name, _) {\n    return change.call(this, name, changeset().insert(_));\n  }\n  function remove(name, _) {\n    return change.call(this, name, changeset().remove(_));\n  }\n  function width(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewWidth + padding2.left + padding2.right);\n  }\n  function height(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewHeight + padding2.top + padding2.bottom);\n  }\n  function offset(view) {\n    var padding2 = view.padding(), origin = view._origin;\n    return [padding2.left + origin[0], padding2.top + origin[1]];\n  }\n  function resizeRenderer(view) {\n    var origin = offset(view), w2 = width(view), h2 = height(view);\n    view._renderer.background(view.background());\n    view._renderer.resize(w2, h2, origin);\n    view._handler.origin(origin);\n    view._resizeListeners.forEach((handler) => {\n      try {\n        handler(w2, h2);\n      } catch (error2) {\n        view.error(error2);\n      }\n    });\n  }\n  function eventExtend(view, event2, item) {\n    var r = view._renderer, el = r && r.canvas(), p, e, translate2;\n    if (el) {\n      translate2 = offset(view);\n      e = event2.changedTouches ? event2.changedTouches[0] : event2;\n      p = point(e, el);\n      p[0] -= translate2[0];\n      p[1] -= translate2[1];\n    }\n    event2.dataflow = view;\n    event2.item = item;\n    event2.vega = extension(view, item, p);\n    return event2;\n  }\n  function extension(view, item, point2) {\n    const itemGroup = item ? item.mark.marktype === \"group\" ? item : item.mark.group : null;\n    function group2(name) {\n      var g = itemGroup, i;\n      if (name) for (i = item; i; i = i.mark.group) {\n        if (i.mark.name === name) {\n          g = i;\n          break;\n        }\n      }\n      return g && g.mark && g.mark.interactive ? g : {};\n    }\n    function xy(item2) {\n      if (!item2) return point2;\n      if (isString(item2)) item2 = group2(item2);\n      const p = point2.slice();\n      while (item2) {\n        p[0] -= item2.x || 0;\n        p[1] -= item2.y || 0;\n        item2 = item2.mark && item2.mark.group;\n      }\n      return p;\n    }\n    return {\n      view: constant$4(view),\n      item: constant$4(item || {}),\n      group: group2,\n      xy,\n      x: (item2) => xy(item2)[0],\n      y: (item2) => xy(item2)[1]\n    };\n  }\n  const VIEW$1 = \"view\", TIMER = \"timer\", WINDOW = \"window\", NO_TRAP = {\n    trap: false\n  };\n  function initializeEventConfig(config) {\n    const events2 = extend({\n      defaults: {}\n    }, config);\n    const unpack = (obj2, keys2) => {\n      keys2.forEach((k) => {\n        if (isArray(obj2[k])) obj2[k] = toSet(obj2[k]);\n      });\n    };\n    unpack(events2.defaults, [\"prevent\", \"allow\"]);\n    unpack(events2, [\"view\", \"window\", \"selector\"]);\n    return events2;\n  }\n  function trackEventListener(view, sources, type2, handler) {\n    view._eventListeners.push({\n      type: type2,\n      sources: array$4(sources),\n      handler\n    });\n  }\n  function prevent(view, type2) {\n    var def2 = view._eventConfig.defaults, prevent2 = def2.prevent, allow = def2.allow;\n    return prevent2 === false || allow === true ? false : prevent2 === true || allow === false ? true : prevent2 ? prevent2[type2] : allow ? !allow[type2] : view.preventDefault();\n  }\n  function permit(view, key2, type2) {\n    const rule2 = view._eventConfig && view._eventConfig[key2];\n    if (rule2 === false || isObject(rule2) && !rule2[type2]) {\n      view.warn(`Blocked ${key2} ${type2} event listener.`);\n      return false;\n    }\n    return true;\n  }\n  function events(source2, type2, filter2) {\n    var view = this, s2 = new EventStream(filter2), send = function(e, item) {\n      view.runAsync(null, () => {\n        if (source2 === VIEW$1 && prevent(view, type2)) {\n          e.preventDefault();\n        }\n        s2.receive(eventExtend(view, e, item));\n      });\n    }, sources;\n    if (source2 === TIMER) {\n      if (permit(view, \"timer\", type2)) {\n        view.timer(send, type2);\n      }\n    } else if (source2 === VIEW$1) {\n      if (permit(view, \"view\", type2)) {\n        view.addEventListener(type2, send, NO_TRAP);\n      }\n    } else {\n      if (source2 === WINDOW) {\n        if (permit(view, \"window\", type2) && typeof window !== \"undefined\") {\n          sources = [window];\n        }\n      } else if (typeof document !== \"undefined\") {\n        if (permit(view, \"selector\", type2)) {\n          sources = Array.from(document.querySelectorAll(source2));\n        }\n      }\n      if (!sources) {\n        view.warn(\"Can not resolve event source: \" + source2);\n      } else {\n        for (var i = 0, n = sources.length; i < n; ++i) {\n          sources[i].addEventListener(type2, send);\n        }\n        trackEventListener(view, sources, type2, send);\n      }\n    }\n    return s2;\n  }\n  function itemFilter(event2) {\n    return event2.item;\n  }\n  function markTarget(event2) {\n    return event2.item.mark.source;\n  }\n  function invoke(name) {\n    return function(_, event2) {\n      return event2.vega.view().changeset().encode(event2.item, name);\n    };\n  }\n  function hover(hoverSet, leaveSet) {\n    hoverSet = [hoverSet || \"hover\"];\n    leaveSet = [leaveSet || \"update\", hoverSet[0]];\n    this.on(this.events(\"view\", \"pointerover\", itemFilter), markTarget, invoke(hoverSet));\n    this.on(this.events(\"view\", \"pointerout\", itemFilter), markTarget, invoke(leaveSet));\n    return this;\n  }\n  function finalize() {\n    var tooltip = this._tooltip, timers = this._timers, handlers = this._handler.handlers(), listeners = this._eventListeners, n, m2, e, h2, t;\n    n = timers.length;\n    while (--n >= 0) {\n      timers[n].stop();\n    }\n    n = listeners.length;\n    while (--n >= 0) {\n      e = listeners[n];\n      m2 = e.sources.length;\n      while (--m2 >= 0) {\n        e.sources[m2].removeEventListener(e.type, e.handler);\n      }\n    }\n    if (tooltip) {\n      tooltip.call(this, this._handler, null, null, null);\n    }\n    n = handlers.length;\n    while (--n >= 0) {\n      t = handlers[n].type;\n      h2 = handlers[n].handler;\n      this._handler.off(t, h2);\n    }\n    return this;\n  }\n  function element(tag, attr2, text2) {\n    const el = document.createElement(tag);\n    for (const key2 in attr2) el.setAttribute(key2, attr2[key2]);\n    if (text2 != null) el.textContent = text2;\n    return el;\n  }\n  const BindClass = \"vega-bind\", NameClass = \"vega-bind-name\", RadioClass = \"vega-bind-radio\";\n  function bind(view, el, binding) {\n    if (!el) return;\n    const param2 = binding.param;\n    let bind2 = binding.state;\n    if (!bind2) {\n      bind2 = binding.state = {\n        elements: null,\n        active: false,\n        set: null,\n        update: (value2) => {\n          if (value2 != view.signal(param2.signal)) {\n            view.runAsync(null, () => {\n              bind2.source = true;\n              view.signal(param2.signal, value2);\n            });\n          }\n        }\n      };\n      if (param2.debounce) {\n        bind2.update = debounce(param2.debounce, bind2.update);\n      }\n    }\n    const create2 = param2.input == null && param2.element ? target : generate;\n    create2(bind2, el, param2, view);\n    if (!bind2.active) {\n      view.on(view._signals[param2.signal], null, () => {\n        bind2.source ? bind2.source = false : bind2.set(view.signal(param2.signal));\n      });\n      bind2.active = true;\n    }\n    return bind2;\n  }\n  function target(bind2, node, param2, view) {\n    const type2 = param2.event || \"input\";\n    const handler = () => bind2.update(node.value);\n    view.signal(param2.signal, node.value);\n    node.addEventListener(type2, handler);\n    trackEventListener(view, node, type2, handler);\n    bind2.set = (value2) => {\n      node.value = value2;\n      node.dispatchEvent(event(type2));\n    };\n  }\n  function event(type2) {\n    return typeof Event !== \"undefined\" ? new Event(type2) : {\n      type: type2\n    };\n  }\n  function generate(bind2, el, param2, view) {\n    const value2 = view.signal(param2.signal);\n    const div = element(\"div\", {\n      \"class\": BindClass\n    });\n    const wrapper = param2.input === \"radio\" ? div : div.appendChild(element(\"label\"));\n    wrapper.appendChild(element(\"span\", {\n      \"class\": NameClass\n    }, param2.name || param2.signal));\n    el.appendChild(div);\n    let input = form;\n    switch (param2.input) {\n      case \"checkbox\":\n        input = checkbox;\n        break;\n      case \"select\":\n        input = select;\n        break;\n      case \"radio\":\n        input = radio;\n        break;\n      case \"range\":\n        input = range;\n        break;\n    }\n    input(bind2, wrapper, param2, value2);\n  }\n  function form(bind2, el, param2, value2) {\n    const node = element(\"input\");\n    for (const key2 in param2) {\n      if (key2 !== \"signal\" && key2 !== \"element\") {\n        node.setAttribute(key2 === \"input\" ? \"type\" : key2, param2[key2]);\n      }\n    }\n    node.setAttribute(\"name\", param2.signal);\n    node.value = value2;\n    el.appendChild(node);\n    node.addEventListener(\"input\", () => bind2.update(node.value));\n    bind2.elements = [node];\n    bind2.set = (value3) => node.value = value3;\n  }\n  function checkbox(bind2, el, param2, value2) {\n    const attr2 = {\n      type: \"checkbox\",\n      name: param2.signal\n    };\n    if (value2) attr2.checked = true;\n    const node = element(\"input\", attr2);\n    el.appendChild(node);\n    node.addEventListener(\"change\", () => bind2.update(node.checked));\n    bind2.elements = [node];\n    bind2.set = (value3) => node.checked = !!value3 || null;\n  }\n  function select(bind2, el, param2, value2) {\n    const node = element(\"select\", {\n      name: param2.signal\n    }), labels = param2.labels || [];\n    param2.options.forEach((option, i) => {\n      const attr2 = {\n        value: option\n      };\n      if (valuesEqual(option, value2)) attr2.selected = true;\n      node.appendChild(element(\"option\", attr2, (labels[i] || option) + \"\"));\n    });\n    el.appendChild(node);\n    node.addEventListener(\"change\", () => {\n      bind2.update(param2.options[node.selectedIndex]);\n    });\n    bind2.elements = [node];\n    bind2.set = (value3) => {\n      for (let i = 0, n = param2.options.length; i < n; ++i) {\n        if (valuesEqual(param2.options[i], value3)) {\n          node.selectedIndex = i;\n          return;\n        }\n      }\n    };\n  }\n  function radio(bind2, el, param2, value2) {\n    const group2 = element(\"span\", {\n      \"class\": RadioClass\n    }), labels = param2.labels || [];\n    el.appendChild(group2);\n    bind2.elements = param2.options.map((option, i) => {\n      const attr2 = {\n        type: \"radio\",\n        name: param2.signal,\n        value: option\n      };\n      if (valuesEqual(option, value2)) attr2.checked = true;\n      const input = element(\"input\", attr2);\n      input.addEventListener(\"change\", () => bind2.update(option));\n      const label2 = element(\"label\", {}, (labels[i] || option) + \"\");\n      label2.prepend(input);\n      group2.appendChild(label2);\n      return input;\n    });\n    bind2.set = (value3) => {\n      const nodes = bind2.elements, n = nodes.length;\n      for (let i = 0; i < n; ++i) {\n        if (valuesEqual(nodes[i].value, value3)) nodes[i].checked = true;\n      }\n    };\n  }\n  function range(bind2, el, param2, value2) {\n    value2 = value2 !== void 0 ? value2 : (+param2.max + +param2.min) / 2;\n    const max2 = param2.max != null ? param2.max : Math.max(100, +value2) || 100, min2 = param2.min || Math.min(0, max2, +value2) || 0, step = param2.step || tickStep(min2, max2, 100);\n    const node = element(\"input\", {\n      type: \"range\",\n      name: param2.signal,\n      min: min2,\n      max: max2,\n      step\n    });\n    node.value = value2;\n    const span2 = element(\"span\", {}, +value2);\n    el.appendChild(node);\n    el.appendChild(span2);\n    const update2 = () => {\n      span2.textContent = node.value;\n      bind2.update(+node.value);\n    };\n    node.addEventListener(\"input\", update2);\n    node.addEventListener(\"change\", update2);\n    bind2.elements = [node];\n    bind2.set = (value3) => {\n      node.value = value3;\n      span2.textContent = value3;\n    };\n  }\n  function valuesEqual(a2, b2) {\n    return a2 === b2 || a2 + \"\" === b2 + \"\";\n  }\n  function initializeRenderer(view, r, el, constructor, scaleFactor, opt) {\n    r = r || new constructor(view.loader());\n    return r.initialize(el, width(view), height(view), offset(view), scaleFactor, opt).background(view.background());\n  }\n  function trap(view, fn2) {\n    return !fn2 ? null : function() {\n      try {\n        fn2.apply(this, arguments);\n      } catch (error2) {\n        view.error(error2);\n      }\n    };\n  }\n  function initializeHandler(view, prevHandler, el, constructor) {\n    const handler = new constructor(view.loader(), trap(view, view.tooltip())).scene(view.scenegraph().root).initialize(el, offset(view), view);\n    if (prevHandler) {\n      prevHandler.handlers().forEach((h2) => {\n        handler.on(h2.type, h2.handler);\n      });\n    }\n    return handler;\n  }\n  function initialize(el, elBind) {\n    const view = this, type2 = view._renderType, config = view._eventConfig.bind, module2 = renderModule(type2);\n    el = view._el = el ? lookup$1(view, el, true) : null;\n    initializeAria(view);\n    if (!module2) view.error(\"Unrecognized renderer type: \" + type2);\n    const Handler2 = module2.handler || CanvasHandler, Renderer2 = el ? module2.renderer : module2.headless;\n    view._renderer = !Renderer2 ? null : initializeRenderer(view, view._renderer, el, Renderer2);\n    view._handler = initializeHandler(view, view._handler, el, Handler2);\n    view._redraw = true;\n    if (el && config !== \"none\") {\n      elBind = elBind ? view._elBind = lookup$1(view, elBind, true) : el.appendChild(element(\"form\", {\n        \"class\": \"vega-bindings\"\n      }));\n      view._bind.forEach((_) => {\n        if (_.param.element && config !== \"container\") {\n          _.element = lookup$1(view, _.param.element, !!_.param.input);\n        }\n      });\n      view._bind.forEach((_) => {\n        bind(view, _.element || elBind, _);\n      });\n    }\n    return view;\n  }\n  function lookup$1(view, el, clear) {\n    if (typeof el === \"string\") {\n      if (typeof document !== \"undefined\") {\n        el = document.querySelector(el);\n        if (!el) {\n          view.error(\"Signal bind element not found: \" + el);\n          return null;\n        }\n      } else {\n        view.error(\"DOM document instance not found.\");\n        return null;\n      }\n    }\n    if (el && clear) {\n      try {\n        el.textContent = \"\";\n      } catch (e) {\n        el = null;\n        view.error(e);\n      }\n    }\n    return el;\n  }\n  const number$1 = (_) => +_ || 0;\n  const paddingObject$1 = (_) => ({\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  });\n  function padding(_) {\n    return isObject(_) ? {\n      top: number$1(_.top),\n      bottom: number$1(_.bottom),\n      left: number$1(_.left),\n      right: number$1(_.right)\n    } : paddingObject$1(number$1(_));\n  }\n  async function renderHeadless(view, type2, scaleFactor, opt) {\n    const module2 = renderModule(type2), ctr = module2 && module2.headless;\n    if (!ctr) error(\"Unrecognized renderer type: \" + type2);\n    await view.runAsync();\n    return initializeRenderer(view, null, null, ctr, scaleFactor, opt).renderAsync(view._scenegraph.root);\n  }\n  async function renderToImageURL(type2, scaleFactor) {\n    if (type2 !== RenderType.Canvas && type2 !== RenderType.SVG && type2 !== RenderType.PNG) {\n      error(\"Unrecognized image type: \" + type2);\n    }\n    const r = await renderHeadless(this, type2, scaleFactor);\n    return type2 === RenderType.SVG ? toBlobURL(r.svg(), \"image/svg+xml\") : r.canvas().toDataURL(\"image/png\");\n  }\n  function toBlobURL(data2, mime) {\n    const blob = new Blob([data2], {\n      type: mime\n    });\n    return window.URL.createObjectURL(blob);\n  }\n  async function renderToCanvas(scaleFactor, opt) {\n    const r = await renderHeadless(this, RenderType.Canvas, scaleFactor, opt);\n    return r.canvas();\n  }\n  async function renderToSVG(scaleFactor) {\n    const r = await renderHeadless(this, RenderType.SVG, scaleFactor);\n    return r.svg();\n  }\n  function runtime(view, spec, expr2) {\n    return context(view, transforms, functionContext, expr2).parse(spec);\n  }\n  function scale$1(name) {\n    var scales2 = this._runtime.scales;\n    if (!has$1(scales2, name)) {\n      error(\"Unrecognized scale or projection: \" + name);\n    }\n    return scales2[name].value;\n  }\n  var Width = \"width\", Height = \"height\", Padding = \"padding\", Skip$1 = {\n    skip: true\n  };\n  function viewWidth(view, width2) {\n    var a2 = view.autosize(), p = view.padding();\n    return width2 - (a2 && a2.contains === Padding ? p.left + p.right : 0);\n  }\n  function viewHeight(view, height2) {\n    var a2 = view.autosize(), p = view.padding();\n    return height2 - (a2 && a2.contains === Padding ? p.top + p.bottom : 0);\n  }\n  function initializeResize(view) {\n    var s2 = view._signals, w2 = s2[Width], h2 = s2[Height], p = s2[Padding];\n    function resetSize() {\n      view._autosize = view._resize = 1;\n    }\n    view._resizeWidth = view.add(null, (_) => {\n      view._width = _.size;\n      view._viewWidth = viewWidth(view, _.size);\n      resetSize();\n    }, {\n      size: w2\n    });\n    view._resizeHeight = view.add(null, (_) => {\n      view._height = _.size;\n      view._viewHeight = viewHeight(view, _.size);\n      resetSize();\n    }, {\n      size: h2\n    });\n    const resizePadding = view.add(null, resetSize, {\n      pad: p\n    });\n    view._resizeWidth.rank = w2.rank + 1;\n    view._resizeHeight.rank = h2.rank + 1;\n    resizePadding.rank = p.rank + 1;\n  }\n  function resizeView(viewWidth2, viewHeight2, width2, height2, origin, auto) {\n    this.runAfter((view) => {\n      let rerun2 = 0;\n      view._autosize = 0;\n      if (view.width() !== width2) {\n        rerun2 = 1;\n        view.signal(Width, width2, Skip$1);\n        view._resizeWidth.skip(true);\n      }\n      if (view.height() !== height2) {\n        rerun2 = 1;\n        view.signal(Height, height2, Skip$1);\n        view._resizeHeight.skip(true);\n      }\n      if (view._viewWidth !== viewWidth2) {\n        view._resize = 1;\n        view._viewWidth = viewWidth2;\n      }\n      if (view._viewHeight !== viewHeight2) {\n        view._resize = 1;\n        view._viewHeight = viewHeight2;\n      }\n      if (view._origin[0] !== origin[0] || view._origin[1] !== origin[1]) {\n        view._resize = 1;\n        view._origin = origin;\n      }\n      if (rerun2) view.run(\"enter\");\n      if (auto) view.runAfter((v) => v.resize());\n    }, false, 1);\n  }\n  function getState(options2) {\n    return this._runtime.getState(options2 || {\n      data: dataTest,\n      signals: signalTest,\n      recurse: true\n    });\n  }\n  function dataTest(name, data2) {\n    return data2.modified && isArray(data2.input.value) && !name.startsWith(\"_:vega:_\");\n  }\n  function signalTest(name, op) {\n    return !(name === \"parent\" || op instanceof transforms.proxy);\n  }\n  function setState(state) {\n    this.runAsync(null, (v) => {\n      v._trigger = false;\n      v._runtime.setState(state);\n    }, (v) => {\n      v._trigger = true;\n    });\n    return this;\n  }\n  function timer(callback, delay) {\n    function tick(elapsed) {\n      callback({\n        timestamp: Date.now(),\n        elapsed\n      });\n    }\n    this._timers.push(interval(tick, delay));\n  }\n  function defaultTooltip(handler, event2, item, value2) {\n    const el = handler.element();\n    if (el) el.setAttribute(\"title\", formatTooltip(value2));\n  }\n  function formatTooltip(value2) {\n    return value2 == null ? \"\" : isArray(value2) ? formatArray(value2) : isObject(value2) && !isDate$1(value2) ? formatObject(value2) : value2 + \"\";\n  }\n  function formatObject(obj2) {\n    return Object.keys(obj2).map((key2) => {\n      const v = obj2[key2];\n      return key2 + \": \" + (isArray(v) ? formatArray(v) : formatValue(v));\n    }).join(\"\\n\");\n  }\n  function formatArray(value2) {\n    return \"[\" + value2.map(formatValue).join(\", \") + \"]\";\n  }\n  function formatValue(value2) {\n    return isArray(value2) ? \"[…]\" : isObject(value2) && !isDate$1(value2) ? \"{…}\" : value2;\n  }\n  function watchPixelRatio() {\n    if (this.renderer() === \"canvas\" && this._renderer._canvas) {\n      let remove2 = null;\n      const updatePixelRatio = () => {\n        if (remove2 != null) {\n          remove2();\n        }\n        const media = matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n        media.addEventListener(\"change\", updatePixelRatio);\n        remove2 = () => {\n          media.removeEventListener(\"change\", updatePixelRatio);\n        };\n        this._renderer._canvas.getContext(\"2d\").pixelRatio = window.devicePixelRatio || 1;\n        this._redraw = true;\n        this._resize = 1;\n        this.resize().runAsync();\n      };\n      updatePixelRatio();\n    }\n  }\n  function View$1(spec, options2) {\n    const view = this;\n    options2 = options2 || {};\n    Dataflow.call(view);\n    if (options2.loader) view.loader(options2.loader);\n    if (options2.logger) view.logger(options2.logger);\n    if (options2.logLevel != null) view.logLevel(options2.logLevel);\n    if (options2.locale || spec.locale) {\n      const loc = extend({}, spec.locale, options2.locale);\n      view.locale(locale(loc.number, loc.time));\n    }\n    view._el = null;\n    view._elBind = null;\n    view._renderType = options2.renderer || RenderType.Canvas;\n    view._scenegraph = new Scenegraph();\n    const root = view._scenegraph.root;\n    view._renderer = null;\n    view._tooltip = options2.tooltip || defaultTooltip, view._redraw = true;\n    view._handler = new CanvasHandler().scene(root);\n    view._globalCursor = false;\n    view._preventDefault = false;\n    view._timers = [];\n    view._eventListeners = [];\n    view._resizeListeners = [];\n    view._eventConfig = initializeEventConfig(spec.eventConfig);\n    view.globalCursor(view._eventConfig.globalCursor);\n    const ctx = runtime(view, spec, options2.expr);\n    view._runtime = ctx;\n    view._signals = ctx.signals;\n    view._bind = (spec.bindings || []).map((_) => ({\n      state: null,\n      param: extend({}, _)\n    }));\n    if (ctx.root) ctx.root.set(root);\n    root.source = ctx.data.root.input;\n    view.pulse(ctx.data.root.input, view.changeset().insert(root.items));\n    view._width = view.width();\n    view._height = view.height();\n    view._viewWidth = viewWidth(view, view._width);\n    view._viewHeight = viewHeight(view, view._height);\n    view._origin = [0, 0];\n    view._resize = 0;\n    view._autosize = 1;\n    initializeResize(view);\n    background(view);\n    cursor(view);\n    view.description(spec.description);\n    if (options2.hover) view.hover();\n    if (options2.container) view.initialize(options2.container, options2.bind);\n    if (options2.watchPixelRatio) view._watchPixelRatio();\n  }\n  function lookupSignal(view, name) {\n    return has$1(view._signals, name) ? view._signals[name] : error(\"Unrecognized signal name: \" + $(name));\n  }\n  function findOperatorHandler(op, handler) {\n    const h2 = (op._targets || []).filter((op2) => op2._update && op2._update.handler === handler);\n    return h2.length ? h2[0] : null;\n  }\n  function addOperatorListener(view, name, op, handler) {\n    let h2 = findOperatorHandler(op, handler);\n    if (!h2) {\n      h2 = trap(view, () => handler(name, op.value));\n      h2.handler = handler;\n      view.on(op, null, h2);\n    }\n    return view;\n  }\n  function removeOperatorListener(view, op, handler) {\n    const h2 = findOperatorHandler(op, handler);\n    if (h2) op._targets.remove(h2);\n    return view;\n  }\n  inherits(View$1, Dataflow, {\n    // -- DATAFLOW / RENDERING ----\n    async evaluate(encode2, prerun, postrun) {\n      await Dataflow.prototype.evaluate.call(this, encode2, prerun);\n      if (this._redraw || this._resize) {\n        try {\n          if (this._renderer) {\n            if (this._resize) {\n              this._resize = 0;\n              resizeRenderer(this);\n            }\n            await this._renderer.renderAsync(this._scenegraph.root);\n          }\n          this._redraw = false;\n        } catch (e) {\n          this.error(e);\n        }\n      }\n      if (postrun) asyncCallback(this, postrun);\n      return this;\n    },\n    dirty(item) {\n      this._redraw = true;\n      this._renderer && this._renderer.dirty(item);\n    },\n    // -- GET / SET ----\n    description(text2) {\n      if (arguments.length) {\n        const desc = text2 != null ? text2 + \"\" : null;\n        if (desc !== this._desc) ariaLabel(this._el, this._desc = desc);\n        return this;\n      }\n      return this._desc;\n    },\n    container() {\n      return this._el;\n    },\n    scenegraph() {\n      return this._scenegraph;\n    },\n    origin() {\n      return this._origin.slice();\n    },\n    signal(name, value2, options2) {\n      const op = lookupSignal(this, name);\n      return arguments.length === 1 ? op.value : this.update(op, value2, options2);\n    },\n    width(_) {\n      return arguments.length ? this.signal(\"width\", _) : this.signal(\"width\");\n    },\n    height(_) {\n      return arguments.length ? this.signal(\"height\", _) : this.signal(\"height\");\n    },\n    padding(_) {\n      return arguments.length ? this.signal(\"padding\", padding(_)) : padding(this.signal(\"padding\"));\n    },\n    autosize(_) {\n      return arguments.length ? this.signal(\"autosize\", _) : this.signal(\"autosize\");\n    },\n    background(_) {\n      return arguments.length ? this.signal(\"background\", _) : this.signal(\"background\");\n    },\n    renderer(type2) {\n      if (!arguments.length) return this._renderType;\n      if (!renderModule(type2)) error(\"Unrecognized renderer type: \" + type2);\n      if (type2 !== this._renderType) {\n        this._renderType = type2;\n        this._resetRenderer();\n      }\n      return this;\n    },\n    tooltip(handler) {\n      if (!arguments.length) return this._tooltip;\n      if (handler !== this._tooltip) {\n        this._tooltip = handler;\n        this._resetRenderer();\n      }\n      return this;\n    },\n    loader(loader2) {\n      if (!arguments.length) return this._loader;\n      if (loader2 !== this._loader) {\n        Dataflow.prototype.loader.call(this, loader2);\n        this._resetRenderer();\n      }\n      return this;\n    },\n    resize() {\n      this._autosize = 1;\n      return this.touch(lookupSignal(this, \"autosize\"));\n    },\n    _resetRenderer() {\n      if (this._renderer) {\n        this._renderer = null;\n        this.initialize(this._el, this._elBind);\n      }\n    },\n    // -- SIZING ----\n    _resizeView: resizeView,\n    // -- EVENT HANDLING ----\n    addEventListener(type2, handler, options2) {\n      let callback = handler;\n      if (!(options2 && options2.trap === false)) {\n        callback = trap(this, handler);\n        callback.raw = handler;\n      }\n      this._handler.on(type2, callback);\n      return this;\n    },\n    removeEventListener(type2, handler) {\n      var handlers = this._handler.handlers(type2), i = handlers.length, h2, t;\n      while (--i >= 0) {\n        t = handlers[i].type;\n        h2 = handlers[i].handler;\n        if (type2 === t && (handler === h2 || handler === h2.raw)) {\n          this._handler.off(t, h2);\n          break;\n        }\n      }\n      return this;\n    },\n    addResizeListener(handler) {\n      const l = this._resizeListeners;\n      if (!l.includes(handler)) {\n        l.push(handler);\n      }\n      return this;\n    },\n    removeResizeListener(handler) {\n      var l = this._resizeListeners, i = l.indexOf(handler);\n      if (i >= 0) {\n        l.splice(i, 1);\n      }\n      return this;\n    },\n    addSignalListener(name, handler) {\n      return addOperatorListener(this, name, lookupSignal(this, name), handler);\n    },\n    removeSignalListener(name, handler) {\n      return removeOperatorListener(this, lookupSignal(this, name), handler);\n    },\n    addDataListener(name, handler) {\n      return addOperatorListener(this, name, dataref(this, name).values, handler);\n    },\n    removeDataListener(name, handler) {\n      return removeOperatorListener(this, dataref(this, name).values, handler);\n    },\n    globalCursor(_) {\n      if (arguments.length) {\n        if (this._globalCursor !== !!_) {\n          const prev = setCursor(this, null);\n          this._globalCursor = !!_;\n          if (prev) setCursor(this, prev);\n        }\n        return this;\n      } else {\n        return this._globalCursor;\n      }\n    },\n    preventDefault(_) {\n      if (arguments.length) {\n        this._preventDefault = _;\n        return this;\n      } else {\n        return this._preventDefault;\n      }\n    },\n    timer,\n    events,\n    finalize,\n    hover,\n    // -- DATA ----\n    data,\n    change,\n    insert,\n    remove,\n    // -- SCALES --\n    scale: scale$1,\n    // -- INITIALIZATION ----\n    initialize,\n    // -- HEADLESS RENDERING ----\n    toImageURL: renderToImageURL,\n    toCanvas: renderToCanvas,\n    toSVG: renderToSVG,\n    // -- SAVE / RESTORE STATE ----\n    getState,\n    setState,\n    // RE-RENDER ON ZOOM\n    _watchPixelRatio: watchPixelRatio\n  });\n  const VIEW = \"view\", LBRACK = \"[\", RBRACK = \"]\", LBRACE = \"{\", RBRACE = \"}\", COLON = \":\", COMMA = \",\", NAME = \"@\", GT = \">\", ILLEGAL = /[[\\]{}]/, DEFAULT_MARKS = {\n    \"*\": 1,\n    arc: 1,\n    area: 1,\n    group: 1,\n    image: 1,\n    line: 1,\n    path: 1,\n    rect: 1,\n    rule: 1,\n    shape: 1,\n    symbol: 1,\n    text: 1,\n    trail: 1\n  };\n  let DEFAULT_SOURCE, MARKS;\n  function eventSelector(selector, source2, marks) {\n    DEFAULT_SOURCE = source2 || VIEW;\n    MARKS = marks || DEFAULT_MARKS;\n    return parseMerge(selector.trim()).map(parseSelector);\n  }\n  function isMarkType(type2) {\n    return MARKS[type2];\n  }\n  function find(s2, i, endChar, pushChar, popChar) {\n    const n = s2.length;\n    let count2 = 0, c2;\n    for (; i < n; ++i) {\n      c2 = s2[i];\n      if (!count2 && c2 === endChar) return i;\n      else if (popChar && popChar.includes(c2)) --count2;\n      else if (pushChar && pushChar.includes(c2)) ++count2;\n    }\n    return i;\n  }\n  function parseMerge(s2) {\n    const output2 = [], n = s2.length;\n    let start = 0, i = 0;\n    while (i < n) {\n      i = find(s2, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n      output2.push(s2.substring(start, i).trim());\n      start = ++i;\n    }\n    if (output2.length === 0) {\n      throw \"Empty event selector: \" + s2;\n    }\n    return output2;\n  }\n  function parseSelector(s2) {\n    return s2[0] === \"[\" ? parseBetween(s2) : parseStream$1(s2);\n  }\n  function parseBetween(s2) {\n    const n = s2.length;\n    let i = 1, b2;\n    i = find(s2, i, RBRACK, LBRACK, RBRACK);\n    if (i === n) {\n      throw \"Empty between selector: \" + s2;\n    }\n    b2 = parseMerge(s2.substring(1, i));\n    if (b2.length !== 2) {\n      throw \"Between selector must have two elements: \" + s2;\n    }\n    s2 = s2.slice(i + 1).trim();\n    if (s2[0] !== GT) {\n      throw \"Expected '>' after between selector: \" + s2;\n    }\n    b2 = b2.map(parseSelector);\n    const stream2 = parseSelector(s2.slice(1).trim());\n    if (stream2.between) {\n      return {\n        between: b2,\n        stream: stream2\n      };\n    } else {\n      stream2.between = b2;\n    }\n    return stream2;\n  }\n  function parseStream$1(s2) {\n    const stream2 = {\n      source: DEFAULT_SOURCE\n    }, source2 = [];\n    let throttle = [0, 0], markname = 0, start = 0, n = s2.length, i = 0, j, filter2;\n    if (s2[n - 1] === RBRACE) {\n      i = s2.lastIndexOf(LBRACE);\n      if (i >= 0) {\n        try {\n          throttle = parseThrottle(s2.substring(i + 1, n - 1));\n        } catch (e) {\n          throw \"Invalid throttle specification: \" + s2;\n        }\n        s2 = s2.slice(0, i).trim();\n        n = s2.length;\n      } else throw \"Unmatched right brace: \" + s2;\n      i = 0;\n    }\n    if (!n) throw s2;\n    if (s2[0] === NAME) markname = ++i;\n    j = find(s2, i, COLON);\n    if (j < n) {\n      source2.push(s2.substring(start, j).trim());\n      start = i = ++j;\n    }\n    i = find(s2, i, LBRACK);\n    if (i === n) {\n      source2.push(s2.substring(start, n).trim());\n    } else {\n      source2.push(s2.substring(start, i).trim());\n      filter2 = [];\n      start = ++i;\n      if (start === n) throw \"Unmatched left bracket: \" + s2;\n    }\n    while (i < n) {\n      i = find(s2, i, RBRACK);\n      if (i === n) throw \"Unmatched left bracket: \" + s2;\n      filter2.push(s2.substring(start, i).trim());\n      if (i < n - 1 && s2[++i] !== LBRACK) throw \"Expected left bracket: \" + s2;\n      start = ++i;\n    }\n    if (!(n = source2.length) || ILLEGAL.test(source2[n - 1])) {\n      throw \"Invalid event selector: \" + s2;\n    }\n    if (n > 1) {\n      stream2.type = source2[1];\n      if (markname) {\n        stream2.markname = source2[0].slice(1);\n      } else if (isMarkType(source2[0])) {\n        stream2.marktype = source2[0];\n      } else {\n        stream2.source = source2[0];\n      }\n    } else {\n      stream2.type = source2[0];\n    }\n    if (stream2.type.slice(-1) === \"!\") {\n      stream2.consume = true;\n      stream2.type = stream2.type.slice(0, -1);\n    }\n    if (filter2 != null) stream2.filter = filter2;\n    if (throttle[0]) stream2.throttle = throttle[0];\n    if (throttle[1]) stream2.debounce = throttle[1];\n    return stream2;\n  }\n  function parseThrottle(s2) {\n    const a2 = s2.split(COMMA);\n    if (!s2.length || a2.length > 2) throw s2;\n    return a2.map((_) => {\n      const x2 = +_;\n      if (x2 !== x2) throw s2;\n      return x2;\n    });\n  }\n  function parseAutosize(spec) {\n    return isObject(spec) ? spec : {\n      type: spec || \"pad\"\n    };\n  }\n  const number = (_) => +_ || 0;\n  const paddingObject = (_) => ({\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  });\n  function parsePadding(spec) {\n    return !isObject(spec) ? paddingObject(number(spec)) : spec.signal ? spec : {\n      top: number(spec.top),\n      bottom: number(spec.bottom),\n      left: number(spec.left),\n      right: number(spec.right)\n    };\n  }\n  const encoder = (_) => isObject(_) && !isArray(_) ? extend({}, _) : {\n    value: _\n  };\n  function addEncode(object2, name, value2, set2) {\n    if (value2 != null) {\n      const isEncoder = isObject(value2) && !isArray(value2) || isArray(value2) && value2.length && isObject(value2[0]);\n      if (isEncoder) {\n        object2.update[name] = value2;\n      } else {\n        object2[set2 || \"enter\"][name] = {\n          value: value2\n        };\n      }\n      return 1;\n    } else {\n      return 0;\n    }\n  }\n  function addEncoders(object2, enter, update2) {\n    for (const name in enter) {\n      addEncode(object2, name, enter[name]);\n    }\n    for (const name in update2) {\n      addEncode(object2, name, update2[name], \"update\");\n    }\n  }\n  function extendEncode(encode2, extra, skip) {\n    for (const name in extra) {\n      if (skip && has$1(skip, name)) continue;\n      encode2[name] = extend(encode2[name] || {}, extra[name]);\n    }\n    return encode2;\n  }\n  function has(key2, encode2) {\n    return encode2 && (encode2.enter && encode2.enter[key2] || encode2.update && encode2.update[key2]);\n  }\n  const MarkRole = \"mark\";\n  const FrameRole = \"frame\";\n  const ScopeRole = \"scope\";\n  const AxisRole = \"axis\";\n  const AxisDomainRole = \"axis-domain\";\n  const AxisGridRole = \"axis-grid\";\n  const AxisLabelRole = \"axis-label\";\n  const AxisTickRole = \"axis-tick\";\n  const AxisTitleRole = \"axis-title\";\n  const LegendRole = \"legend\";\n  const LegendBandRole = \"legend-band\";\n  const LegendEntryRole = \"legend-entry\";\n  const LegendGradientRole = \"legend-gradient\";\n  const LegendLabelRole = \"legend-label\";\n  const LegendSymbolRole = \"legend-symbol\";\n  const LegendTitleRole = \"legend-title\";\n  const TitleRole = \"title\";\n  const TitleTextRole = \"title-text\";\n  const TitleSubtitleRole = \"title-subtitle\";\n  function applyDefaults(encode2, type2, role, style2, config) {\n    const defaults2 = {}, enter = {};\n    let update2, key2, skip, props;\n    key2 = \"lineBreak\";\n    if (type2 === \"text\" && config[key2] != null && !has(key2, encode2)) {\n      applyDefault(defaults2, key2, config[key2]);\n    }\n    if (role == \"legend\" || String(role).startsWith(\"axis\")) {\n      role = null;\n    }\n    props = role === FrameRole ? config.group : role === MarkRole ? extend({}, config.mark, config[type2]) : null;\n    for (key2 in props) {\n      skip = has(key2, encode2) || (key2 === \"fill\" || key2 === \"stroke\") && (has(\"fill\", encode2) || has(\"stroke\", encode2));\n      if (!skip) applyDefault(defaults2, key2, props[key2]);\n    }\n    array$4(style2).forEach((name) => {\n      const props2 = config.style && config.style[name];\n      for (const key3 in props2) {\n        if (!has(key3, encode2)) {\n          applyDefault(defaults2, key3, props2[key3]);\n        }\n      }\n    });\n    encode2 = extend({}, encode2);\n    for (key2 in defaults2) {\n      props = defaults2[key2];\n      if (props.signal) {\n        (update2 = update2 || {})[key2] = props;\n      } else {\n        enter[key2] = props;\n      }\n    }\n    encode2.enter = extend(enter, encode2.enter);\n    if (update2) encode2.update = extend(update2, encode2.update);\n    return encode2;\n  }\n  function applyDefault(defaults2, key2, value2) {\n    defaults2[key2] = value2 && value2.signal ? {\n      signal: value2.signal\n    } : {\n      value: value2\n    };\n  }\n  const scaleRef = (scale2) => isString(scale2) ? $(scale2) : scale2.signal ? `(${scale2.signal})` : field(scale2);\n  function entry$1(enc) {\n    if (enc.gradient != null) {\n      return gradient(enc);\n    }\n    let value2 = enc.signal ? `(${enc.signal})` : enc.color ? color(enc.color) : enc.field != null ? field(enc.field) : enc.value !== void 0 ? $(enc.value) : void 0;\n    if (enc.scale != null) {\n      value2 = scale(enc, value2);\n    }\n    if (value2 === void 0) {\n      value2 = null;\n    }\n    if (enc.exponent != null) {\n      value2 = `pow(${value2},${property(enc.exponent)})`;\n    }\n    if (enc.mult != null) {\n      value2 += `*${property(enc.mult)}`;\n    }\n    if (enc.offset != null) {\n      value2 += `+${property(enc.offset)}`;\n    }\n    if (enc.round) {\n      value2 = `round(${value2})`;\n    }\n    return value2;\n  }\n  const _color = (type2, x2, y2, z2) => `(${type2}(${[x2, y2, z2].map(entry$1).join(\",\")})+'')`;\n  function color(enc) {\n    return enc.c ? _color(\"hcl\", enc.h, enc.c, enc.l) : enc.h || enc.s ? _color(\"hsl\", enc.h, enc.s, enc.l) : enc.l || enc.a ? _color(\"lab\", enc.l, enc.a, enc.b) : enc.r || enc.g || enc.b ? _color(\"rgb\", enc.r, enc.g, enc.b) : null;\n  }\n  function gradient(enc) {\n    const args = [enc.start, enc.stop, enc.count].map((_) => _ == null ? null : $(_));\n    while (args.length && peek$1(args) == null) args.pop();\n    args.unshift(scaleRef(enc.gradient));\n    return `gradient(${args.join(\",\")})`;\n  }\n  function property(property2) {\n    return isObject(property2) ? \"(\" + entry$1(property2) + \")\" : property2;\n  }\n  function field(ref2) {\n    return resolveField(isObject(ref2) ? ref2 : {\n      datum: ref2\n    });\n  }\n  function resolveField(ref2) {\n    let object2, level, field2;\n    if (ref2.signal) {\n      object2 = \"datum\";\n      field2 = ref2.signal;\n    } else if (ref2.group || ref2.parent) {\n      level = Math.max(1, ref2.level || 1);\n      object2 = \"item\";\n      while (level-- > 0) {\n        object2 += \".mark.group\";\n      }\n      if (ref2.parent) {\n        field2 = ref2.parent;\n        object2 += \".datum\";\n      } else {\n        field2 = ref2.group;\n      }\n    } else if (ref2.datum) {\n      object2 = \"datum\";\n      field2 = ref2.datum;\n    } else {\n      error(\"Invalid field reference: \" + $(ref2));\n    }\n    if (!ref2.signal) {\n      field2 = isString(field2) ? splitAccessPath(field2).map($).join(\"][\") : resolveField(field2);\n    }\n    return object2 + \"[\" + field2 + \"]\";\n  }\n  function scale(enc, value2) {\n    const scale2 = scaleRef(enc.scale);\n    if (enc.range != null) {\n      value2 = `lerp(_range(${scale2}), ${+enc.range})`;\n    } else {\n      if (value2 !== void 0) value2 = `_scale(${scale2}, ${value2})`;\n      if (enc.band) {\n        value2 = (value2 ? value2 + \"+\" : \"\") + `_bandwidth(${scale2})` + (+enc.band === 1 ? \"\" : \"*\" + property(enc.band));\n        if (enc.extra) {\n          value2 = `(datum.extra ? _scale(${scale2}, datum.extra.value) : ${value2})`;\n        }\n      }\n      if (value2 == null) value2 = \"0\";\n    }\n    return value2;\n  }\n  function rule(enc) {\n    let code = \"\";\n    enc.forEach((rule2) => {\n      const value2 = entry$1(rule2);\n      code += rule2.test ? `(${rule2.test})?${value2}:` : value2;\n    });\n    if (peek$1(code) === \":\") {\n      code += \"null\";\n    }\n    return code;\n  }\n  function parseEncode(encode2, type2, role, style2, scope, params2) {\n    const enc = {};\n    params2 = params2 || {};\n    params2.encoders = {\n      $encode: enc\n    };\n    encode2 = applyDefaults(encode2, type2, role, style2, scope.config);\n    for (const key2 in encode2) {\n      enc[key2] = parseBlock(encode2[key2], type2, params2, scope);\n    }\n    return params2;\n  }\n  function parseBlock(block, marktype, params2, scope) {\n    const channels = {}, fields = {};\n    for (const name in block) {\n      if (block[name] != null) {\n        channels[name] = parse$1(expr(block[name]), scope, params2, fields);\n      }\n    }\n    return {\n      $expr: {\n        marktype,\n        channels\n      },\n      $fields: Object.keys(fields),\n      $output: Object.keys(block)\n    };\n  }\n  function expr(enc) {\n    return isArray(enc) ? rule(enc) : entry$1(enc);\n  }\n  function parse$1(code, scope, params2, fields) {\n    const expr2 = parser(code, scope);\n    expr2.$fields.forEach((name) => fields[name] = 1);\n    extend(params2, expr2.$params);\n    return expr2.$expr;\n  }\n  const OUTER = \"outer\", OUTER_INVALID = [\"value\", \"update\", \"init\", \"react\", \"bind\"];\n  function outerError(prefix, name) {\n    error(prefix + ' for \"outer\" push: ' + $(name));\n  }\n  function parseSignal(signal, scope) {\n    const name = signal.name;\n    if (signal.push === OUTER) {\n      if (!scope.signals[name]) outerError(\"No prior signal definition\", name);\n      OUTER_INVALID.forEach((prop) => {\n        if (signal[prop] !== void 0) outerError(\"Invalid property \", prop);\n      });\n    } else {\n      const op = scope.addSignal(name, signal.value);\n      if (signal.react === false) op.react = false;\n      if (signal.bind) scope.addBinding(name, signal.bind);\n    }\n  }\n  function Entry(type2, value2, params2, parent) {\n    this.id = -1;\n    this.type = type2;\n    this.value = value2;\n    this.params = params2;\n    if (parent) this.parent = parent;\n  }\n  function entry(type2, value2, params2, parent) {\n    return new Entry(type2, value2, params2, parent);\n  }\n  function operator(value2, params2) {\n    return entry(\"operator\", value2, params2);\n  }\n  function ref(op) {\n    const ref2 = {\n      $ref: op.id\n    };\n    if (op.id < 0) (op.refs = op.refs || []).push(ref2);\n    return ref2;\n  }\n  function fieldRef$1(field2, name) {\n    return name ? {\n      $field: field2,\n      $name: name\n    } : {\n      $field: field2\n    };\n  }\n  const keyFieldRef = fieldRef$1(\"key\");\n  function compareRef(fields, orders) {\n    return {\n      $compare: fields,\n      $order: orders\n    };\n  }\n  function keyRef(fields, flat) {\n    const ref2 = {\n      $key: fields\n    };\n    if (flat) ref2.$flat = true;\n    return ref2;\n  }\n  const Ascending = \"ascending\";\n  const Descending = \"descending\";\n  function sortKey(sort2) {\n    return !isObject(sort2) ? \"\" : (sort2.order === Descending ? \"-\" : \"+\") + aggrField(sort2.op, sort2.field);\n  }\n  function aggrField(op, field2) {\n    return (op && op.signal ? \"$\" + op.signal : op || \"\") + (op && field2 ? \"_\" : \"\") + (field2 && field2.signal ? \"$\" + field2.signal : field2 || \"\");\n  }\n  const Scope$1 = \"scope\";\n  const View = \"view\";\n  function isSignal(_) {\n    return _ && _.signal;\n  }\n  function isExpr$1(_) {\n    return _ && _.expr;\n  }\n  function hasSignal(_) {\n    if (isSignal(_)) return true;\n    if (isObject(_)) for (const key2 in _) {\n      if (hasSignal(_[key2])) return true;\n    }\n    return false;\n  }\n  function value(specValue, defaultValue) {\n    return specValue != null ? specValue : defaultValue;\n  }\n  function deref(v) {\n    return v && v.signal || v;\n  }\n  const Timer = \"timer\";\n  function parseStream(stream2, scope) {\n    const method2 = stream2.merge ? mergeStream : stream2.stream ? nestedStream : stream2.type ? eventStream : error(\"Invalid stream specification: \" + $(stream2));\n    return method2(stream2, scope);\n  }\n  function eventSource(source2) {\n    return source2 === Scope$1 ? View : source2 || View;\n  }\n  function mergeStream(stream2, scope) {\n    const list = stream2.merge.map((s2) => parseStream(s2, scope)), entry2 = streamParameters({\n      merge: list\n    }, stream2, scope);\n    return scope.addStream(entry2).id;\n  }\n  function nestedStream(stream2, scope) {\n    const id2 = parseStream(stream2.stream, scope), entry2 = streamParameters({\n      stream: id2\n    }, stream2, scope);\n    return scope.addStream(entry2).id;\n  }\n  function eventStream(stream2, scope) {\n    let id2;\n    if (stream2.type === Timer) {\n      id2 = scope.event(Timer, stream2.throttle);\n      stream2 = {\n        between: stream2.between,\n        filter: stream2.filter\n      };\n    } else {\n      id2 = scope.event(eventSource(stream2.source), stream2.type);\n    }\n    const entry2 = streamParameters({\n      stream: id2\n    }, stream2, scope);\n    return Object.keys(entry2).length === 1 ? id2 : scope.addStream(entry2).id;\n  }\n  function streamParameters(entry2, stream2, scope) {\n    let param2 = stream2.between;\n    if (param2) {\n      if (param2.length !== 2) {\n        error('Stream \"between\" parameter must have 2 entries: ' + $(stream2));\n      }\n      entry2.between = [parseStream(param2[0], scope), parseStream(param2[1], scope)];\n    }\n    param2 = stream2.filter ? [].concat(stream2.filter) : [];\n    if (stream2.marktype || stream2.markname || stream2.markrole) {\n      param2.push(filterMark(stream2.marktype, stream2.markname, stream2.markrole));\n    }\n    if (stream2.source === Scope$1) {\n      param2.push(\"inScope(event.item)\");\n    }\n    if (param2.length) {\n      entry2.filter = parser(\"(\" + param2.join(\")&&(\") + \")\", scope).$expr;\n    }\n    if ((param2 = stream2.throttle) != null) {\n      entry2.throttle = +param2;\n    }\n    if ((param2 = stream2.debounce) != null) {\n      entry2.debounce = +param2;\n    }\n    if (stream2.consume) {\n      entry2.consume = true;\n    }\n    return entry2;\n  }\n  function filterMark(type2, name, role) {\n    const item = \"event.item\";\n    return item + (type2 && type2 !== \"*\" ? \"&&\" + item + \".mark.marktype==='\" + type2 + \"'\" : \"\") + (role ? \"&&\" + item + \".mark.role==='\" + role + \"'\" : \"\") + (name ? \"&&\" + item + \".mark.name==='\" + name + \"'\" : \"\");\n  }\n  const OP_VALUE_EXPR = {\n    code: \"_.$value\",\n    ast: {\n      type: \"Identifier\",\n      value: \"value\"\n    }\n  };\n  function parseUpdate(spec, scope, target2) {\n    const encode2 = spec.encode, entry2 = {\n      target: target2\n    };\n    let events2 = spec.events, update2 = spec.update, sources = [];\n    if (!events2) {\n      error(\"Signal update missing events specification.\");\n    }\n    if (isString(events2)) {\n      events2 = eventSelector(events2, scope.isSubscope() ? Scope$1 : View);\n    }\n    events2 = array$4(events2).filter((s2) => s2.signal || s2.scale ? (sources.push(s2), 0) : 1);\n    if (sources.length > 1) {\n      sources = [mergeSources(sources)];\n    }\n    if (events2.length) {\n      sources.push(events2.length > 1 ? {\n        merge: events2\n      } : events2[0]);\n    }\n    if (encode2 != null) {\n      if (update2) error(\"Signal encode and update are mutually exclusive.\");\n      update2 = \"encode(item(),\" + $(encode2) + \")\";\n    }\n    entry2.update = isString(update2) ? parser(update2, scope) : update2.expr != null ? parser(update2.expr, scope) : update2.value != null ? update2.value : update2.signal != null ? {\n      $expr: OP_VALUE_EXPR,\n      $params: {\n        $value: scope.signalRef(update2.signal)\n      }\n    } : error(\"Invalid signal update specification.\");\n    if (spec.force) {\n      entry2.options = {\n        force: true\n      };\n    }\n    sources.forEach((source2) => scope.addUpdate(extend(streamSource(source2, scope), entry2)));\n  }\n  function streamSource(stream2, scope) {\n    return {\n      source: stream2.signal ? scope.signalRef(stream2.signal) : stream2.scale ? scope.scaleRef(stream2.scale) : parseStream(stream2, scope)\n    };\n  }\n  function mergeSources(sources) {\n    return {\n      signal: \"[\" + sources.map((s2) => s2.scale ? 'scale(\"' + s2.scale + '\")' : s2.signal) + \"]\"\n    };\n  }\n  function parseSignalUpdates(signal, scope) {\n    const op = scope.getSignal(signal.name);\n    let expr2 = signal.update;\n    if (signal.init) {\n      if (expr2) {\n        error(\"Signals can not include both init and update expressions.\");\n      } else {\n        expr2 = signal.init;\n        op.initonly = true;\n      }\n    }\n    if (expr2) {\n      expr2 = parser(expr2, scope);\n      op.update = expr2.$expr;\n      op.params = expr2.$params;\n    }\n    if (signal.on) {\n      signal.on.forEach((_) => parseUpdate(_, scope, op.id));\n    }\n  }\n  const transform = (name) => (params2, value2, parent) => entry(name, value2, params2 || void 0, parent);\n  const Aggregate = transform(\"aggregate\");\n  const AxisTicks = transform(\"axisticks\");\n  const Bound = transform(\"bound\");\n  const Collect = transform(\"collect\");\n  const Compare = transform(\"compare\");\n  const DataJoin = transform(\"datajoin\");\n  const Encode = transform(\"encode\");\n  const Expression = transform(\"expression\");\n  const Facet = transform(\"facet\");\n  const Field = transform(\"field\");\n  const Key = transform(\"key\");\n  const LegendEntries = transform(\"legendentries\");\n  const Load = transform(\"load\");\n  const Mark = transform(\"mark\");\n  const MultiExtent = transform(\"multiextent\");\n  const MultiValues = transform(\"multivalues\");\n  const Overlap = transform(\"overlap\");\n  const Params = transform(\"params\");\n  const PreFacet = transform(\"prefacet\");\n  const Projection = transform(\"projection\");\n  const Proxy = transform(\"proxy\");\n  const Relay = transform(\"relay\");\n  const Render = transform(\"render\");\n  const Scale = transform(\"scale\");\n  const Sieve = transform(\"sieve\");\n  const SortItems = transform(\"sortitems\");\n  const ViewLayout = transform(\"viewlayout\");\n  const Values = transform(\"values\");\n  let FIELD_REF_ID = 0;\n  const MULTIDOMAIN_SORT_OPS = {\n    min: \"min\",\n    max: \"max\",\n    count: \"sum\"\n  };\n  function initScale(spec, scope) {\n    const type2 = spec.type || \"linear\";\n    if (!isValidScaleType(type2)) {\n      error(\"Unrecognized scale type: \" + $(type2));\n    }\n    scope.addScale(spec.name, {\n      type: type2,\n      domain: void 0\n    });\n  }\n  function parseScale(spec, scope) {\n    const params2 = scope.getScale(spec.name).params;\n    let key2;\n    params2.domain = parseScaleDomain(spec.domain, spec, scope);\n    if (spec.range != null) {\n      params2.range = parseScaleRange(spec, scope, params2);\n    }\n    if (spec.interpolate != null) {\n      parseScaleInterpolate(spec.interpolate, params2);\n    }\n    if (spec.nice != null) {\n      params2.nice = parseScaleNice(spec.nice, scope);\n    }\n    if (spec.bins != null) {\n      params2.bins = parseScaleBins(spec.bins, scope);\n    }\n    for (key2 in spec) {\n      if (has$1(params2, key2) || key2 === \"name\") continue;\n      params2[key2] = parseLiteral(spec[key2], scope);\n    }\n  }\n  function parseLiteral(v, scope) {\n    return !isObject(v) ? v : v.signal ? scope.signalRef(v.signal) : error(\"Unsupported object: \" + $(v));\n  }\n  function parseArray(v, scope) {\n    return v.signal ? scope.signalRef(v.signal) : v.map((v2) => parseLiteral(v2, scope));\n  }\n  function dataLookupError(name) {\n    error(\"Can not find data set: \" + $(name));\n  }\n  function parseScaleDomain(domain2, spec, scope) {\n    if (!domain2) {\n      if (spec.domainMin != null || spec.domainMax != null) {\n        error(\"No scale domain defined for domainMin/domainMax to override.\");\n      }\n      return;\n    }\n    return domain2.signal ? scope.signalRef(domain2.signal) : (isArray(domain2) ? explicitDomain : domain2.fields ? multipleDomain : singularDomain)(domain2, spec, scope);\n  }\n  function explicitDomain(domain2, spec, scope) {\n    return domain2.map((v) => parseLiteral(v, scope));\n  }\n  function singularDomain(domain2, spec, scope) {\n    const data2 = scope.getData(domain2.data);\n    if (!data2) dataLookupError(domain2.data);\n    return isDiscrete(spec.type) ? data2.valuesRef(scope, domain2.field, parseSort(domain2.sort, false)) : isQuantile(spec.type) ? data2.domainRef(scope, domain2.field) : data2.extentRef(scope, domain2.field);\n  }\n  function multipleDomain(domain2, spec, scope) {\n    const data2 = domain2.data, fields = domain2.fields.reduce((dom, d2) => {\n      d2 = isString(d2) ? {\n        data: data2,\n        field: d2\n      } : isArray(d2) || d2.signal ? fieldRef(d2, scope) : d2;\n      dom.push(d2);\n      return dom;\n    }, []);\n    return (isDiscrete(spec.type) ? ordinalMultipleDomain : isQuantile(spec.type) ? quantileMultipleDomain : numericMultipleDomain)(domain2, scope, fields);\n  }\n  function fieldRef(data2, scope) {\n    const name = \"_:vega:_\" + FIELD_REF_ID++, coll = Collect({});\n    if (isArray(data2)) {\n      coll.value = {\n        $ingest: data2\n      };\n    } else if (data2.signal) {\n      const code = \"setdata(\" + $(name) + \",\" + data2.signal + \")\";\n      coll.params.input = scope.signalRef(code);\n    }\n    scope.addDataPipeline(name, [coll, Sieve({})]);\n    return {\n      data: name,\n      field: \"data\"\n    };\n  }\n  function ordinalMultipleDomain(domain2, scope, fields) {\n    const sort2 = parseSort(domain2.sort, true);\n    let a2, v;\n    const counts = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.countsRef(scope, f.field, sort2);\n    });\n    const p = {\n      groupby: keyFieldRef,\n      pulse: counts\n    };\n    if (sort2) {\n      a2 = sort2.op || \"count\";\n      v = sort2.field ? aggrField(a2, sort2.field) : \"count\";\n      p.ops = [MULTIDOMAIN_SORT_OPS[a2]];\n      p.fields = [scope.fieldRef(v)];\n      p.as = [v];\n    }\n    a2 = scope.add(Aggregate(p));\n    const c2 = scope.add(Collect({\n      pulse: ref(a2)\n    }));\n    v = scope.add(Values({\n      field: keyFieldRef,\n      sort: scope.sortRef(sort2),\n      pulse: ref(c2)\n    }));\n    return ref(v);\n  }\n  function parseSort(sort2, multidomain) {\n    if (sort2) {\n      if (!sort2.field && !sort2.op) {\n        if (isObject(sort2)) sort2.field = \"key\";\n        else sort2 = {\n          field: \"key\"\n        };\n      } else if (!sort2.field && sort2.op !== \"count\") {\n        error(\"No field provided for sort aggregate op: \" + sort2.op);\n      } else if (multidomain && sort2.field) {\n        if (sort2.op && !MULTIDOMAIN_SORT_OPS[sort2.op]) {\n          error(\"Multiple domain scales can not be sorted using \" + sort2.op);\n        }\n      }\n    }\n    return sort2;\n  }\n  function quantileMultipleDomain(domain2, scope, fields) {\n    const values2 = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.domainRef(scope, f.field);\n    });\n    return ref(scope.add(MultiValues({\n      values: values2\n    })));\n  }\n  function numericMultipleDomain(domain2, scope, fields) {\n    const extents = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.extentRef(scope, f.field);\n    });\n    return ref(scope.add(MultiExtent({\n      extents\n    })));\n  }\n  function parseScaleBins(v, scope) {\n    return v.signal || isArray(v) ? parseArray(v, scope) : scope.objectProperty(v);\n  }\n  function parseScaleNice(nice2, scope) {\n    return nice2.signal ? scope.signalRef(nice2.signal) : isObject(nice2) ? {\n      interval: parseLiteral(nice2.interval),\n      step: parseLiteral(nice2.step)\n    } : parseLiteral(nice2);\n  }\n  function parseScaleInterpolate(interpolate2, params2) {\n    params2.interpolate = parseLiteral(interpolate2.type || interpolate2);\n    if (interpolate2.gamma != null) {\n      params2.interpolateGamma = parseLiteral(interpolate2.gamma);\n    }\n  }\n  function parseScaleRange(spec, scope, params2) {\n    const config = scope.config.range;\n    let range2 = spec.range;\n    if (range2.signal) {\n      return scope.signalRef(range2.signal);\n    } else if (isString(range2)) {\n      if (config && has$1(config, range2)) {\n        spec = extend({}, spec, {\n          range: config[range2]\n        });\n        return parseScaleRange(spec, scope, params2);\n      } else if (range2 === \"width\") {\n        range2 = [0, {\n          signal: \"width\"\n        }];\n      } else if (range2 === \"height\") {\n        range2 = isDiscrete(spec.type) ? [0, {\n          signal: \"height\"\n        }] : [{\n          signal: \"height\"\n        }, 0];\n      } else {\n        error(\"Unrecognized scale range value: \" + $(range2));\n      }\n    } else if (range2.scheme) {\n      params2.scheme = isArray(range2.scheme) ? parseArray(range2.scheme, scope) : parseLiteral(range2.scheme, scope);\n      if (range2.extent) params2.schemeExtent = parseArray(range2.extent, scope);\n      if (range2.count) params2.schemeCount = parseLiteral(range2.count, scope);\n      return;\n    } else if (range2.step) {\n      params2.rangeStep = parseLiteral(range2.step, scope);\n      return;\n    } else if (isDiscrete(spec.type) && !isArray(range2)) {\n      return parseScaleDomain(range2, spec, scope);\n    } else if (!isArray(range2)) {\n      error(\"Unsupported range type: \" + $(range2));\n    }\n    return range2.map((v) => (isArray(v) ? parseArray : parseLiteral)(v, scope));\n  }\n  function parseProjection(proj, scope) {\n    const config = scope.config.projection || {}, params2 = {};\n    for (const name in proj) {\n      if (name === \"name\") continue;\n      params2[name] = parseParameter$1(proj[name], name, scope);\n    }\n    for (const name in config) {\n      if (params2[name] == null) {\n        params2[name] = parseParameter$1(config[name], name, scope);\n      }\n    }\n    scope.addProjection(proj.name, params2);\n  }\n  function parseParameter$1(_, name, scope) {\n    return isArray(_) ? _.map((_2) => parseParameter$1(_2, name, scope)) : !isObject(_) ? _ : _.signal ? scope.signalRef(_.signal) : name === \"fit\" ? _ : error(\"Unsupported parameter object: \" + $(_));\n  }\n  const Top = \"top\";\n  const Left = \"left\";\n  const Right = \"right\";\n  const Bottom = \"bottom\";\n  const Center = \"center\";\n  const Vertical = \"vertical\";\n  const Start = \"start\";\n  const Middle = \"middle\";\n  const End = \"end\";\n  const Index = \"index\";\n  const Label = \"label\";\n  const Offset = \"offset\";\n  const Perc = \"perc\";\n  const Perc2 = \"perc2\";\n  const Value = \"value\";\n  const GuideLabelStyle = \"guide-label\";\n  const GuideTitleStyle = \"guide-title\";\n  const GroupTitleStyle = \"group-title\";\n  const GroupSubtitleStyle = \"group-subtitle\";\n  const Symbols = \"symbol\";\n  const Gradient = \"gradient\";\n  const Discrete = \"discrete\";\n  const Size = \"size\";\n  const Shape = \"shape\";\n  const Fill = \"fill\";\n  const Stroke = \"stroke\";\n  const StrokeWidth = \"strokeWidth\";\n  const StrokeDash = \"strokeDash\";\n  const Opacity = \"opacity\";\n  const LegendScales = [Size, Shape, Fill, Stroke, StrokeWidth, StrokeDash, Opacity];\n  const Skip = {\n    name: 1,\n    style: 1,\n    interactive: 1\n  };\n  const zero = {\n    value: 0\n  };\n  const one = {\n    value: 1\n  };\n  const GroupMark = \"group\";\n  const RectMark = \"rect\";\n  const RuleMark = \"rule\";\n  const SymbolMark = \"symbol\";\n  const TextMark = \"text\";\n  function guideGroup(mark) {\n    mark.type = GroupMark;\n    mark.interactive = mark.interactive || false;\n    return mark;\n  }\n  function lookup(spec, config) {\n    const _ = (name, dflt) => value(spec[name], value(config[name], dflt));\n    _.isVertical = (s2) => Vertical === value(spec.direction, config.direction || (s2 ? config.symbolDirection : config.gradientDirection));\n    _.gradientLength = () => value(spec.gradientLength, config.gradientLength || config.gradientWidth);\n    _.gradientThickness = () => value(spec.gradientThickness, config.gradientThickness || config.gradientHeight);\n    _.entryColumns = () => value(spec.columns, value(config.columns, +_.isVertical(true)));\n    return _;\n  }\n  function getEncoding(name, encode2) {\n    const v = encode2 && (encode2.update && encode2.update[name] || encode2.enter && encode2.enter[name]);\n    return v && v.signal ? v : v ? v.value : null;\n  }\n  function getStyle(name, scope, style2) {\n    const s2 = scope.config.style[style2];\n    return s2 && s2[name];\n  }\n  function anchorExpr(s2, e, m2) {\n    return `item.anchor === '${Start}' ? ${s2} : item.anchor === '${End}' ? ${e} : ${m2}`;\n  }\n  const alignExpr$1 = anchorExpr($(Left), $(Right), $(Center));\n  function tickBand(_) {\n    const v = _(\"tickBand\");\n    let offset2 = _(\"tickOffset\"), band2, extra;\n    if (!v) {\n      band2 = _(\"bandPosition\");\n      extra = _(\"tickExtra\");\n    } else if (v.signal) {\n      band2 = {\n        signal: `(${v.signal}) === 'extent' ? 1 : 0.5`\n      };\n      extra = {\n        signal: `(${v.signal}) === 'extent'`\n      };\n      if (!isObject(offset2)) {\n        offset2 = {\n          signal: `(${v.signal}) === 'extent' ? 0 : ${offset2}`\n        };\n      }\n    } else if (v === \"extent\") {\n      band2 = 1;\n      extra = true;\n      offset2 = 0;\n    } else {\n      band2 = 0.5;\n      extra = false;\n    }\n    return {\n      extra,\n      band: band2,\n      offset: offset2\n    };\n  }\n  function extendOffset(value2, offset2) {\n    return !offset2 ? value2 : !value2 ? offset2 : !isObject(value2) ? {\n      value: value2,\n      offset: offset2\n    } : Object.assign({}, value2, {\n      offset: extendOffset(value2.offset, offset2)\n    });\n  }\n  function guideMark(mark, extras) {\n    if (extras) {\n      mark.name = extras.name;\n      mark.style = extras.style || mark.style;\n      mark.interactive = !!extras.interactive;\n      mark.encode = extendEncode(mark.encode, extras, Skip);\n    } else {\n      mark.interactive = false;\n    }\n    return mark;\n  }\n  function legendGradient(spec, scale2, config, userEncode) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length2 = _.gradientLength();\n    let enter, start, stop2, width2, height2;\n    if (vertical) {\n      start = [0, 1];\n      stop2 = [0, 0];\n      width2 = thickness;\n      height2 = length2;\n    } else {\n      start = [0, 0];\n      stop2 = [1, 0];\n      width2 = length2;\n      height2 = thickness;\n    }\n    const encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: zero,\n        y: zero,\n        width: encoder(width2),\n        height: encoder(height2)\n      },\n      update: extend({}, enter, {\n        opacity: one,\n        fill: {\n          gradient: scale2,\n          start,\n          stop: stop2\n        }\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gradientStrokeColor\"),\n      strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n      type: RectMark,\n      role: LegendGradientRole,\n      encode: encode2\n    }, userEncode);\n  }\n  function legendGradientDiscrete(spec, scale2, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length2 = _.gradientLength();\n    let u2, v, uu, vv, adjust = \"\";\n    vertical ? (u2 = \"y\", uu = \"y2\", v = \"x\", vv = \"width\", adjust = \"1-\") : (u2 = \"x\", uu = \"x2\", v = \"y\", vv = \"height\");\n    const enter = {\n      opacity: zero,\n      fill: {\n        scale: scale2,\n        field: Value\n      }\n    };\n    enter[u2] = {\n      signal: adjust + \"datum.\" + Perc,\n      mult: length2\n    };\n    enter[v] = zero;\n    enter[uu] = {\n      signal: adjust + \"datum.\" + Perc2,\n      mult: length2\n    };\n    enter[vv] = encoder(thickness);\n    const encode2 = {\n      enter,\n      update: extend({}, enter, {\n        opacity: one\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gradientStrokeColor\"),\n      strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n      type: RectMark,\n      role: LegendBandRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  const alignExpr = `datum.${Perc}<=0?\"${Left}\":datum.${Perc}>=1?\"${Right}\":\"${Center}\"`, baselineExpr = `datum.${Perc}<=0?\"${Bottom}\":datum.${Perc}>=1?\"${Top}\":\"${Middle}\"`;\n  function legendGradientLabels(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = encoder(_.gradientThickness()), length2 = _.gradientLength();\n    let overlap = _(\"labelOverlap\"), enter, update2, u2, v, adjust = \"\";\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        }\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontStyle: _(\"labelFontStyle\"),\n      fontWeight: _(\"labelFontWeight\"),\n      limit: value(spec.labelLimit, config.gradientLabelLimit)\n    });\n    if (vertical) {\n      enter.align = {\n        value: \"left\"\n      };\n      enter.baseline = update2.baseline = {\n        signal: baselineExpr\n      };\n      u2 = \"y\";\n      v = \"x\";\n      adjust = \"1-\";\n    } else {\n      enter.align = update2.align = {\n        signal: alignExpr\n      };\n      enter.baseline = {\n        value: \"top\"\n      };\n      u2 = \"x\";\n      v = \"y\";\n    }\n    enter[u2] = update2[u2] = {\n      signal: adjust + \"datum.\" + Perc,\n      mult: length2\n    };\n    enter[v] = update2[v] = thickness;\n    thickness.offset = value(spec.labelOffset, config.gradientLabelOffset) || 0;\n    overlap = overlap ? {\n      separation: _(\"labelSeparation\"),\n      method: overlap,\n      order: \"datum.\" + Index\n    } : void 0;\n    return guideMark({\n      type: TextMark,\n      role: LegendLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: dataRef,\n      encode: encode2,\n      overlap\n    }, userEncode);\n  }\n  function legendSymbolGroups(spec, config, userEncode, dataRef, columns) {\n    const _ = lookup(spec, config), entries = userEncode.entries, interactive2 = !!(entries && entries.interactive), name = entries ? entries.name : void 0, height2 = _(\"clipHeight\"), symbolOffset = _(\"symbolOffset\"), valueRef = {\n      data: \"value\"\n    }, xSignal = `(${columns}) ? datum.${Offset} : datum.${Size}`, yEncode = height2 ? encoder(height2) : {\n      field: Size\n    }, index2 = `datum.${Index}`, ncols = `max(1, ${columns})`;\n    let encode2, enter, update2, nrows, sort2;\n    yEncode.mult = 0.5;\n    encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: {\n          signal: xSignal,\n          mult: 0.5,\n          offset: symbolOffset\n        },\n        y: yEncode\n      },\n      update: update2 = {\n        opacity: one,\n        x: enter.x,\n        y: enter.y\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    let baseFill = null, baseStroke = null;\n    if (!spec.fill) {\n      baseFill = config.symbolBaseFillColor;\n      baseStroke = config.symbolBaseStrokeColor;\n    }\n    addEncoders(encode2, {\n      fill: _(\"symbolFillColor\", baseFill),\n      shape: _(\"symbolType\"),\n      size: _(\"symbolSize\"),\n      stroke: _(\"symbolStrokeColor\", baseStroke),\n      strokeDash: _(\"symbolDash\"),\n      strokeDashOffset: _(\"symbolDashOffset\"),\n      strokeWidth: _(\"symbolStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"symbolOpacity\")\n    });\n    LegendScales.forEach((scale2) => {\n      if (spec[scale2]) {\n        update2[scale2] = enter[scale2] = {\n          scale: spec[scale2],\n          field: Value\n        };\n      }\n    });\n    const symbols2 = guideMark({\n      type: SymbolMark,\n      role: LegendSymbolRole,\n      key: Value,\n      from: valueRef,\n      clip: height2 ? true : void 0,\n      encode: encode2\n    }, userEncode.symbols);\n    const labelOffset = encoder(symbolOffset);\n    labelOffset.offset = _(\"labelOffset\");\n    encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: {\n          signal: xSignal,\n          offset: labelOffset\n        },\n        y: yEncode\n      },\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        },\n        x: enter.x,\n        y: enter.y\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      align: _(\"labelAlign\"),\n      baseline: _(\"labelBaseline\"),\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontStyle: _(\"labelFontStyle\"),\n      fontWeight: _(\"labelFontWeight\"),\n      limit: _(\"labelLimit\")\n    });\n    const labels = guideMark({\n      type: TextMark,\n      role: LegendLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: valueRef,\n      encode: encode2\n    }, userEncode.labels);\n    encode2 = {\n      enter: {\n        noBound: {\n          value: !height2\n        },\n        // ignore width/height in bounds calc\n        width: zero,\n        height: height2 ? encoder(height2) : zero,\n        opacity: zero\n      },\n      exit: {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one,\n        row: {\n          signal: null\n        },\n        column: {\n          signal: null\n        }\n      }\n    };\n    if (_.isVertical(true)) {\n      nrows = `ceil(item.mark.items.length / ${ncols})`;\n      update2.row.signal = `${index2}%${nrows}`;\n      update2.column.signal = `floor(${index2} / ${nrows})`;\n      sort2 = {\n        field: [\"row\", index2]\n      };\n    } else {\n      update2.row.signal = `floor(${index2} / ${ncols})`;\n      update2.column.signal = `${index2} % ${ncols}`;\n      sort2 = {\n        field: index2\n      };\n    }\n    update2.column.signal = `(${columns})?${update2.column.signal}:${index2}`;\n    dataRef = {\n      facet: {\n        data: dataRef,\n        name: \"value\",\n        groupby: Index\n      }\n    };\n    return guideGroup({\n      role: ScopeRole,\n      from: dataRef,\n      encode: extendEncode(encode2, entries, Skip),\n      marks: [symbols2, labels],\n      name,\n      interactive: interactive2,\n      sort: sort2\n    });\n  }\n  function legendSymbolLayout(spec, config) {\n    const _ = lookup(spec, config);\n    return {\n      align: _(\"gridAlign\"),\n      columns: _.entryColumns(),\n      center: {\n        row: true,\n        column: false\n      },\n      padding: {\n        row: _(\"rowPadding\"),\n        column: _(\"columnPadding\")\n      }\n    };\n  }\n  const isL = 'item.orient === \"left\"', isR = 'item.orient === \"right\"', isLR = `(${isL} || ${isR})`, isVG = `datum.vgrad && ${isLR}`, baseline = anchorExpr('\"top\"', '\"bottom\"', '\"middle\"'), alignFlip = anchorExpr('\"right\"', '\"left\"', '\"center\"'), exprAlign = `datum.vgrad && ${isR} ? (${alignFlip}) : (${isLR} && !(datum.vgrad && ${isL})) ? \"left\" : ${alignExpr$1}`, exprAnchor = `item._anchor || (${isLR} ? \"middle\" : \"start\")`, exprAngle = `${isVG} ? (${isL} ? -90 : 90) : 0`, exprBaseline = `${isLR} ? (datum.vgrad ? (${isR} ? \"bottom\" : \"top\") : ${baseline}) : \"top\"`;\n  function legendTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config);\n    const encode2 = {\n      enter: {\n        opacity: zero\n      },\n      update: {\n        opacity: one,\n        x: {\n          field: {\n            group: \"padding\"\n          }\n        },\n        y: {\n          field: {\n            group: \"padding\"\n          }\n        }\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      orient: _(\"titleOrient\"),\n      _anchor: _(\"titleAnchor\"),\n      anchor: {\n        signal: exprAnchor\n      },\n      angle: {\n        signal: exprAngle\n      },\n      align: {\n        signal: exprAlign\n      },\n      baseline: {\n        signal: exprBaseline\n      },\n      text: spec.title,\n      fill: _(\"titleColor\"),\n      fillOpacity: _(\"titleOpacity\"),\n      font: _(\"titleFont\"),\n      fontSize: _(\"titleFontSize\"),\n      fontStyle: _(\"titleFontStyle\"),\n      fontWeight: _(\"titleFontWeight\"),\n      limit: _(\"titleLimit\"),\n      lineHeight: _(\"titleLineHeight\")\n    }, {\n      // require update\n      align: _(\"titleAlign\"),\n      baseline: _(\"titleBaseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: LegendTitleRole,\n      style: GuideTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function clip(clip2, scope) {\n    let expr2;\n    if (isObject(clip2)) {\n      if (clip2.signal) {\n        expr2 = clip2.signal;\n      } else if (clip2.path) {\n        expr2 = \"pathShape(\" + param(clip2.path) + \")\";\n      } else if (clip2.sphere) {\n        expr2 = \"geoShape(\" + param(clip2.sphere) + ', {type: \"Sphere\"})';\n      }\n    }\n    return expr2 ? scope.signalRef(expr2) : !!clip2;\n  }\n  function param(value2) {\n    return isObject(value2) && value2.signal ? value2.signal : $(value2);\n  }\n  function getRole(spec) {\n    const role = spec.role || \"\";\n    return role.startsWith(\"axis\") || role.startsWith(\"legend\") || role.startsWith(\"title\") ? role : spec.type === GroupMark ? ScopeRole : role || MarkRole;\n  }\n  function definition(spec) {\n    return {\n      marktype: spec.type,\n      name: spec.name || void 0,\n      role: spec.role || getRole(spec),\n      zindex: +spec.zindex || void 0,\n      aria: spec.aria,\n      description: spec.description\n    };\n  }\n  function interactive(spec, scope) {\n    return spec && spec.signal ? scope.signalRef(spec.signal) : spec === false ? false : true;\n  }\n  function parseTransform(spec, scope) {\n    const def2 = definition$1(spec.type);\n    if (!def2) error(\"Unrecognized transform type: \" + $(spec.type));\n    const t = entry(def2.type.toLowerCase(), null, parseParameters(def2, spec, scope));\n    if (spec.signal) scope.addSignal(spec.signal, scope.proxy(t));\n    t.metadata = def2.metadata || {};\n    return t;\n  }\n  function parseParameters(def2, spec, scope) {\n    const params2 = {}, n = def2.params.length;\n    for (let i = 0; i < n; ++i) {\n      const pdef = def2.params[i];\n      params2[pdef.name] = parseParameter(pdef, spec, scope);\n    }\n    return params2;\n  }\n  function parseParameter(def2, spec, scope) {\n    const type2 = def2.type, value2 = spec[def2.name];\n    if (type2 === \"index\") {\n      return parseIndexParameter(def2, spec, scope);\n    } else if (value2 === void 0) {\n      if (def2.required) {\n        error(\"Missing required \" + $(spec.type) + \" parameter: \" + $(def2.name));\n      }\n      return;\n    } else if (type2 === \"param\") {\n      return parseSubParameters(def2, spec, scope);\n    } else if (type2 === \"projection\") {\n      return scope.projectionRef(spec[def2.name]);\n    }\n    return def2.array && !isSignal(value2) ? value2.map((v) => parameterValue(def2, v, scope)) : parameterValue(def2, value2, scope);\n  }\n  function parameterValue(def2, value2, scope) {\n    const type2 = def2.type;\n    if (isSignal(value2)) {\n      return isExpr(type2) ? error(\"Expression references can not be signals.\") : isField(type2) ? scope.fieldRef(value2) : isCompare(type2) ? scope.compareRef(value2) : scope.signalRef(value2.signal);\n    } else {\n      const expr2 = def2.expr || isField(type2);\n      return expr2 && outerExpr(value2) ? scope.exprRef(value2.expr, value2.as) : expr2 && outerField(value2) ? fieldRef$1(value2.field, value2.as) : isExpr(type2) ? parser(value2, scope) : isData(type2) ? ref(scope.getData(value2).values) : isField(type2) ? fieldRef$1(value2) : isCompare(type2) ? scope.compareRef(value2) : value2;\n    }\n  }\n  function parseIndexParameter(def2, spec, scope) {\n    if (!isString(spec.from)) {\n      error('Lookup \"from\" parameter must be a string literal.');\n    }\n    return scope.getData(spec.from).lookupRef(scope, spec.key);\n  }\n  function parseSubParameters(def2, spec, scope) {\n    const value2 = spec[def2.name];\n    if (def2.array) {\n      if (!isArray(value2)) {\n        error(\"Expected an array of sub-parameters. Instead: \" + $(value2));\n      }\n      return value2.map((v) => parseSubParameter(def2, v, scope));\n    } else {\n      return parseSubParameter(def2, value2, scope);\n    }\n  }\n  function parseSubParameter(def2, value2, scope) {\n    const n = def2.params.length;\n    let pdef;\n    for (let i = 0; i < n; ++i) {\n      pdef = def2.params[i];\n      for (const k in pdef.key) {\n        if (pdef.key[k] !== value2[k]) {\n          pdef = null;\n          break;\n        }\n      }\n      if (pdef) break;\n    }\n    if (!pdef) error(\"Unsupported parameter: \" + $(value2));\n    const params2 = extend(parseParameters(pdef, value2, scope), pdef.key);\n    return ref(scope.add(Params(params2)));\n  }\n  const outerExpr = (_) => _ && _.expr;\n  const outerField = (_) => _ && _.field;\n  const isData = (_) => _ === \"data\";\n  const isExpr = (_) => _ === \"expr\";\n  const isField = (_) => _ === \"field\";\n  const isCompare = (_) => _ === \"compare\";\n  function parseData$1(from, group2, scope) {\n    let facet, key2, op, dataRef, parent;\n    if (!from) {\n      dataRef = ref(scope.add(Collect(null, [{}])));\n    } else if (facet = from.facet) {\n      if (!group2) error(\"Only group marks can be faceted.\");\n      if (facet.field != null) {\n        dataRef = parent = getDataRef(facet, scope);\n      } else {\n        if (!from.data) {\n          op = parseTransform(extend({\n            type: \"aggregate\",\n            groupby: array$4(facet.groupby)\n          }, facet.aggregate), scope);\n          op.params.key = scope.keyRef(facet.groupby);\n          op.params.pulse = getDataRef(facet, scope);\n          dataRef = parent = ref(scope.add(op));\n        } else {\n          parent = ref(scope.getData(from.data).aggregate);\n        }\n        key2 = scope.keyRef(facet.groupby, true);\n      }\n    }\n    if (!dataRef) {\n      dataRef = getDataRef(from, scope);\n    }\n    return {\n      key: key2,\n      pulse: dataRef,\n      parent\n    };\n  }\n  function getDataRef(from, scope) {\n    return from.$ref ? from : from.data && from.data.$ref ? from.data : ref(scope.getData(from.data).output);\n  }\n  function DataScope(scope, input, output2, values2, aggr) {\n    this.scope = scope;\n    this.input = input;\n    this.output = output2;\n    this.values = values2;\n    this.aggregate = aggr;\n    this.index = {};\n  }\n  DataScope.fromEntries = function(scope, entries) {\n    const n = entries.length, values2 = entries[n - 1], output2 = entries[n - 2];\n    let input = entries[0], aggr = null, i = 1;\n    if (input && input.type === \"load\") {\n      input = entries[1];\n    }\n    scope.add(entries[0]);\n    for (; i < n; ++i) {\n      entries[i].params.pulse = ref(entries[i - 1]);\n      scope.add(entries[i]);\n      if (entries[i].type === \"aggregate\") aggr = entries[i];\n    }\n    return new DataScope(scope, input, output2, values2, aggr);\n  };\n  function fieldKey(field2) {\n    return isString(field2) ? field2 : null;\n  }\n  function addSortField(scope, p, sort2) {\n    const as = aggrField(sort2.op, sort2.field);\n    let s2;\n    if (p.ops) {\n      for (let i = 0, n = p.as.length; i < n; ++i) {\n        if (p.as[i] === as) return;\n      }\n    } else {\n      p.ops = [\"count\"];\n      p.fields = [null];\n      p.as = [\"count\"];\n    }\n    if (sort2.op) {\n      p.ops.push((s2 = sort2.op.signal) ? scope.signalRef(s2) : sort2.op);\n      p.fields.push(scope.fieldRef(sort2.field));\n      p.as.push(as);\n    }\n  }\n  function cache(scope, ds, name, optype, field2, counts, index2) {\n    const cache2 = ds[name] || (ds[name] = {}), sort2 = sortKey(counts);\n    let k = fieldKey(field2), v, op;\n    if (k != null) {\n      scope = ds.scope;\n      k = k + (sort2 ? \"|\" + sort2 : \"\");\n      v = cache2[k];\n    }\n    if (!v) {\n      const params2 = counts ? {\n        field: keyFieldRef,\n        pulse: ds.countsRef(scope, field2, counts)\n      } : {\n        field: scope.fieldRef(field2),\n        pulse: ref(ds.output)\n      };\n      if (sort2) params2.sort = scope.sortRef(counts);\n      op = scope.add(entry(optype, void 0, params2));\n      if (index2) ds.index[field2] = op;\n      v = ref(op);\n      if (k != null) cache2[k] = v;\n    }\n    return v;\n  }\n  DataScope.prototype = {\n    countsRef(scope, field2, sort2) {\n      const ds = this, cache2 = ds.counts || (ds.counts = {}), k = fieldKey(field2);\n      let v, a2, p;\n      if (k != null) {\n        scope = ds.scope;\n        v = cache2[k];\n      }\n      if (!v) {\n        p = {\n          groupby: scope.fieldRef(field2, \"key\"),\n          pulse: ref(ds.output)\n        };\n        if (sort2 && sort2.field) addSortField(scope, p, sort2);\n        a2 = scope.add(Aggregate(p));\n        v = scope.add(Collect({\n          pulse: ref(a2)\n        }));\n        v = {\n          agg: a2,\n          ref: ref(v)\n        };\n        if (k != null) cache2[k] = v;\n      } else if (sort2 && sort2.field) {\n        addSortField(scope, v.agg.params, sort2);\n      }\n      return v.ref;\n    },\n    tuplesRef() {\n      return ref(this.values);\n    },\n    extentRef(scope, field2) {\n      return cache(scope, this, \"extent\", \"extent\", field2, false);\n    },\n    domainRef(scope, field2) {\n      return cache(scope, this, \"domain\", \"values\", field2, false);\n    },\n    valuesRef(scope, field2, sort2) {\n      return cache(scope, this, \"vals\", \"values\", field2, sort2 || true);\n    },\n    lookupRef(scope, field2) {\n      return cache(scope, this, \"lookup\", \"tupleindex\", field2, false);\n    },\n    indataRef(scope, field2) {\n      return cache(scope, this, \"indata\", \"tupleindex\", field2, true, true);\n    }\n  };\n  function parseFacet(spec, scope, group2) {\n    const facet = spec.from.facet, name = facet.name, data2 = getDataRef(facet, scope);\n    let op;\n    if (!facet.name) {\n      error(\"Facet must have a name: \" + $(facet));\n    }\n    if (!facet.data) {\n      error(\"Facet must reference a data set: \" + $(facet));\n    }\n    if (facet.field) {\n      op = scope.add(PreFacet({\n        field: scope.fieldRef(facet.field),\n        pulse: data2\n      }));\n    } else if (facet.groupby) {\n      op = scope.add(Facet({\n        key: scope.keyRef(facet.groupby),\n        group: ref(scope.proxy(group2.parent)),\n        pulse: data2\n      }));\n    } else {\n      error(\"Facet must specify groupby or field: \" + $(facet));\n    }\n    const subscope = scope.fork(), source2 = subscope.add(Collect()), values2 = subscope.add(Sieve({\n      pulse: ref(source2)\n    }));\n    subscope.addData(name, new DataScope(subscope, source2, source2, values2));\n    subscope.addSignal(\"parent\", null);\n    op.params.subflow = {\n      $subflow: subscope.parse(spec).toRuntime()\n    };\n  }\n  function parseSubflow(spec, scope, input) {\n    const op = scope.add(PreFacet({\n      pulse: input.pulse\n    })), subscope = scope.fork();\n    subscope.add(Sieve());\n    subscope.addSignal(\"parent\", null);\n    op.params.subflow = {\n      $subflow: subscope.parse(spec).toRuntime()\n    };\n  }\n  function parseTrigger(spec, scope, name) {\n    const remove2 = spec.remove, insert2 = spec.insert, toggle = spec.toggle, modify2 = spec.modify, values2 = spec.values, op = scope.add(operator());\n    const update2 = \"if(\" + spec.trigger + ',modify(\"' + name + '\",' + [insert2, remove2, toggle, modify2, values2].map((_) => _ == null ? \"null\" : _).join(\",\") + \"),0)\";\n    const expr2 = parser(update2, scope);\n    op.update = expr2.$expr;\n    op.params = expr2.$params;\n  }\n  function parseMark(spec, scope) {\n    const role = getRole(spec), group2 = spec.type === GroupMark, facet = spec.from && spec.from.facet, overlap = spec.overlap;\n    let layout = spec.layout || role === ScopeRole || role === FrameRole, ops2, op, store, enc, name, layoutRef, boundRef;\n    const nested = role === MarkRole || layout || facet;\n    const input = parseData$1(spec.from, group2, scope);\n    op = scope.add(DataJoin({\n      key: input.key || (spec.key ? fieldRef$1(spec.key) : void 0),\n      pulse: input.pulse,\n      clean: !group2\n    }));\n    const joinRef = ref(op);\n    op = store = scope.add(Collect({\n      pulse: joinRef\n    }));\n    op = scope.add(Mark({\n      markdef: definition(spec),\n      interactive: interactive(spec.interactive, scope),\n      clip: clip(spec.clip, scope),\n      context: {\n        $context: true\n      },\n      groups: scope.lookup(),\n      parent: scope.signals.parent ? scope.signalRef(\"parent\") : null,\n      index: scope.markpath(),\n      pulse: ref(op)\n    }));\n    const markRef = ref(op);\n    op = enc = scope.add(Encode(parseEncode(spec.encode, spec.type, role, spec.style, scope, {\n      mod: false,\n      pulse: markRef\n    })));\n    op.params.parent = scope.encode();\n    if (spec.transform) {\n      spec.transform.forEach((_) => {\n        const tx2 = parseTransform(_, scope), md2 = tx2.metadata;\n        if (md2.generates || md2.changes) {\n          error(\"Mark transforms should not generate new data.\");\n        }\n        if (!md2.nomod) enc.params.mod = true;\n        tx2.params.pulse = ref(op);\n        scope.add(op = tx2);\n      });\n    }\n    if (spec.sort) {\n      op = scope.add(SortItems({\n        sort: scope.compareRef(spec.sort),\n        pulse: ref(op)\n      }));\n    }\n    const encodeRef = ref(op);\n    if (facet || layout) {\n      layout = scope.add(ViewLayout({\n        layout: scope.objectProperty(spec.layout),\n        legends: scope.legends,\n        mark: markRef,\n        pulse: encodeRef\n      }));\n      layoutRef = ref(layout);\n    }\n    const bound2 = scope.add(Bound({\n      mark: markRef,\n      pulse: layoutRef || encodeRef\n    }));\n    boundRef = ref(bound2);\n    if (group2) {\n      if (nested) {\n        ops2 = scope.operators;\n        ops2.pop();\n        if (layout) ops2.pop();\n      }\n      scope.pushState(encodeRef, layoutRef || boundRef, joinRef);\n      facet ? parseFacet(spec, scope, input) : nested ? parseSubflow(spec, scope, input) : scope.parse(spec);\n      scope.popState();\n      if (nested) {\n        if (layout) ops2.push(layout);\n        ops2.push(bound2);\n      }\n    }\n    if (overlap) {\n      boundRef = parseOverlap(overlap, boundRef, scope);\n    }\n    const render = scope.add(Render({\n      pulse: boundRef\n    })), sieve = scope.add(Sieve({\n      pulse: ref(render)\n    }, void 0, scope.parent()));\n    if (spec.name != null) {\n      name = spec.name;\n      scope.addData(name, new DataScope(scope, store, render, sieve));\n      if (spec.on) spec.on.forEach((on2) => {\n        if (on2.insert || on2.remove || on2.toggle) {\n          error(\"Marks only support modify triggers.\");\n        }\n        parseTrigger(on2, scope, name);\n      });\n    }\n  }\n  function parseOverlap(overlap, source2, scope) {\n    const method2 = overlap.method, bound2 = overlap.bound, sep = overlap.separation;\n    const params2 = {\n      separation: isSignal(sep) ? scope.signalRef(sep.signal) : sep,\n      method: isSignal(method2) ? scope.signalRef(method2.signal) : method2,\n      pulse: source2\n    };\n    if (overlap.order) {\n      params2.sort = scope.compareRef({\n        field: overlap.order\n      });\n    }\n    if (bound2) {\n      const tol = bound2.tolerance;\n      params2.boundTolerance = isSignal(tol) ? scope.signalRef(tol.signal) : +tol;\n      params2.boundScale = scope.scaleRef(bound2.scale);\n      params2.boundOrient = bound2.orient;\n    }\n    return ref(scope.add(Overlap(params2)));\n  }\n  function parseLegend(spec, scope) {\n    const config = scope.config.legend, encode2 = spec.encode || {}, _ = lookup(spec, config), legendEncode = encode2.legend || {}, name = legendEncode.name || void 0, interactive2 = legendEncode.interactive, style2 = legendEncode.style, scales2 = {};\n    let scale2 = 0, entryLayout, params2, children2;\n    LegendScales.forEach((s2) => spec[s2] ? (scales2[s2] = spec[s2], scale2 = scale2 || spec[s2]) : 0);\n    if (!scale2) error(\"Missing valid scale for legend.\");\n    const type2 = legendType(spec, scope.scaleType(scale2));\n    const datum2 = {\n      title: spec.title != null,\n      scales: scales2,\n      type: type2,\n      vgrad: type2 !== \"symbol\" && _.isVertical()\n    };\n    const dataRef = ref(scope.add(Collect(null, [datum2])));\n    const entryEncode = {\n      enter: {\n        x: {\n          value: 0\n        },\n        y: {\n          value: 0\n        }\n      }\n    };\n    const entryRef = ref(scope.add(LegendEntries(params2 = {\n      type: type2,\n      scale: scope.scaleRef(scale2),\n      count: scope.objectProperty(_(\"tickCount\")),\n      limit: scope.property(_(\"symbolLimit\")),\n      values: scope.objectProperty(spec.values),\n      minstep: scope.property(spec.tickMinStep),\n      formatType: scope.property(spec.formatType),\n      formatSpecifier: scope.property(spec.format)\n    })));\n    if (type2 === Gradient) {\n      children2 = [legendGradient(spec, scale2, config, encode2.gradient), legendGradientLabels(spec, config, encode2.labels, entryRef)];\n      params2.count = params2.count || scope.signalRef(`max(2,2*floor((${deref(_.gradientLength())})/100))`);\n    } else if (type2 === Discrete) {\n      children2 = [legendGradientDiscrete(spec, scale2, config, encode2.gradient, entryRef), legendGradientLabels(spec, config, encode2.labels, entryRef)];\n    } else {\n      entryLayout = legendSymbolLayout(spec, config);\n      children2 = [legendSymbolGroups(spec, config, encode2, entryRef, deref(entryLayout.columns))];\n      params2.size = sizeExpression(spec, scope, children2[0].marks);\n    }\n    children2 = [guideGroup({\n      role: LegendEntryRole,\n      from: dataRef,\n      encode: entryEncode,\n      marks: children2,\n      layout: entryLayout,\n      interactive: interactive2\n    })];\n    if (datum2.title) {\n      children2.push(legendTitle(spec, config, encode2.title, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: LegendRole,\n      from: dataRef,\n      encode: extendEncode(buildLegendEncode(_, spec, config), legendEncode, Skip),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function legendType(spec, scaleType) {\n    let type2 = spec.type || Symbols;\n    if (!spec.type && scaleCount(spec) === 1 && (spec.fill || spec.stroke)) {\n      type2 = isContinuous(scaleType) ? Gradient : isDiscretizing(scaleType) ? Discrete : Symbols;\n    }\n    return type2 !== Gradient ? type2 : isDiscretizing(scaleType) ? Discrete : Gradient;\n  }\n  function scaleCount(spec) {\n    return LegendScales.reduce((count2, type2) => count2 + (spec[type2] ? 1 : 0), 0);\n  }\n  function buildLegendEncode(_, spec, config) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      offset: _(\"offset\"),\n      padding: _(\"padding\"),\n      titlePadding: _(\"titlePadding\"),\n      cornerRadius: _(\"cornerRadius\"),\n      fill: _(\"fillColor\"),\n      stroke: _(\"strokeColor\"),\n      strokeWidth: config.strokeWidth,\n      strokeDash: config.strokeDash,\n      x: _(\"legendX\"),\n      y: _(\"legendY\"),\n      // accessibility support\n      format: spec.format,\n      formatType: spec.formatType\n    });\n    return encode2;\n  }\n  function sizeExpression(spec, scope, marks) {\n    const size = deref(getChannel(\"size\", spec, marks)), strokeWidth = deref(getChannel(\"strokeWidth\", spec, marks)), fontSize2 = deref(getFontSize(marks[1].encode, scope, GuideLabelStyle));\n    return parser(`max(ceil(sqrt(${size})+${strokeWidth}),${fontSize2})`, scope);\n  }\n  function getChannel(name, spec, marks) {\n    return spec[name] ? `scale(\"${spec[name]}\",datum)` : getEncoding(name, marks[0].encode);\n  }\n  function getFontSize(encode2, scope, style2) {\n    return getEncoding(\"fontSize\", encode2) || getStyle(\"fontSize\", scope, style2);\n  }\n  const angleExpr = `item.orient===\"${Left}\"?-90:item.orient===\"${Right}\"?90:0`;\n  function parseTitle(spec, scope) {\n    spec = isString(spec) ? {\n      text: spec\n    } : spec;\n    const _ = lookup(spec, scope.config.title), encode2 = spec.encode || {}, userEncode = encode2.group || {}, name = userEncode.name || void 0, interactive2 = userEncode.interactive, style2 = userEncode.style, children2 = [];\n    const datum2 = {}, dataRef = ref(scope.add(Collect(null, [datum2])));\n    children2.push(buildTitle(spec, _, titleEncode(spec), dataRef));\n    if (spec.subtitle) {\n      children2.push(buildSubTitle(spec, _, encode2.subtitle, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: TitleRole,\n      from: dataRef,\n      encode: groupEncode(_, userEncode),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function titleEncode(spec) {\n    const encode2 = spec.encode;\n    return encode2 && encode2.title || extend({\n      name: spec.name,\n      interactive: spec.interactive,\n      style: spec.style\n    }, encode2);\n  }\n  function groupEncode(_, userEncode) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      anchor: _(\"anchor\"),\n      align: {\n        signal: alignExpr$1\n      },\n      angle: {\n        signal: angleExpr\n      },\n      limit: _(\"limit\"),\n      frame: _(\"frame\"),\n      offset: _(\"offset\") || 0,\n      padding: _(\"subtitlePadding\")\n    });\n    return extendEncode(encode2, userEncode, Skip);\n  }\n  function buildTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n      value: 0\n    }, text2 = spec.text, encode2 = {\n      enter: {\n        opacity: zero2\n      },\n      update: {\n        opacity: {\n          value: 1\n        }\n      },\n      exit: {\n        opacity: zero2\n      }\n    };\n    addEncoders(encode2, {\n      text: text2,\n      align: {\n        signal: \"item.mark.group.align\"\n      },\n      angle: {\n        signal: \"item.mark.group.angle\"\n      },\n      limit: {\n        signal: \"item.mark.group.limit\"\n      },\n      baseline: \"top\",\n      dx: _(\"dx\"),\n      dy: _(\"dy\"),\n      fill: _(\"color\"),\n      font: _(\"font\"),\n      fontSize: _(\"fontSize\"),\n      fontStyle: _(\"fontStyle\"),\n      fontWeight: _(\"fontWeight\"),\n      lineHeight: _(\"lineHeight\")\n    }, {\n      // update\n      align: _(\"align\"),\n      angle: _(\"angle\"),\n      baseline: _(\"baseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: TitleTextRole,\n      style: GroupTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function buildSubTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n      value: 0\n    }, text2 = spec.subtitle, encode2 = {\n      enter: {\n        opacity: zero2\n      },\n      update: {\n        opacity: {\n          value: 1\n        }\n      },\n      exit: {\n        opacity: zero2\n      }\n    };\n    addEncoders(encode2, {\n      text: text2,\n      align: {\n        signal: \"item.mark.group.align\"\n      },\n      angle: {\n        signal: \"item.mark.group.angle\"\n      },\n      limit: {\n        signal: \"item.mark.group.limit\"\n      },\n      baseline: \"top\",\n      dx: _(\"dx\"),\n      dy: _(\"dy\"),\n      fill: _(\"subtitleColor\"),\n      font: _(\"subtitleFont\"),\n      fontSize: _(\"subtitleFontSize\"),\n      fontStyle: _(\"subtitleFontStyle\"),\n      fontWeight: _(\"subtitleFontWeight\"),\n      lineHeight: _(\"subtitleLineHeight\")\n    }, {\n      // update\n      align: _(\"align\"),\n      angle: _(\"angle\"),\n      baseline: _(\"baseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: TitleSubtitleRole,\n      style: GroupSubtitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function parseData(data2, scope) {\n    const transforms2 = [];\n    if (data2.transform) {\n      data2.transform.forEach((tx2) => {\n        transforms2.push(parseTransform(tx2, scope));\n      });\n    }\n    if (data2.on) {\n      data2.on.forEach((on2) => {\n        parseTrigger(on2, scope, data2.name);\n      });\n    }\n    scope.addDataPipeline(data2.name, analyze(data2, scope, transforms2));\n  }\n  function analyze(data2, scope, ops2) {\n    const output2 = [];\n    let source2 = null, modify2 = false, generate2 = false, upstream, i, n, t, m2;\n    if (data2.values) {\n      if (isSignal(data2.values) || hasSignal(data2.format)) {\n        output2.push(load(scope, data2));\n        output2.push(source2 = collect());\n      } else {\n        output2.push(source2 = collect({\n          $ingest: data2.values,\n          $format: data2.format\n        }));\n      }\n    } else if (data2.url) {\n      if (hasSignal(data2.url) || hasSignal(data2.format)) {\n        output2.push(load(scope, data2));\n        output2.push(source2 = collect());\n      } else {\n        output2.push(source2 = collect({\n          $request: data2.url,\n          $format: data2.format\n        }));\n      }\n    } else if (data2.source) {\n      source2 = upstream = array$4(data2.source).map((d2) => ref(scope.getData(d2).output));\n      output2.push(null);\n    }\n    for (i = 0, n = ops2.length; i < n; ++i) {\n      t = ops2[i];\n      m2 = t.metadata;\n      if (!source2 && !m2.source) {\n        output2.push(source2 = collect());\n      }\n      output2.push(t);\n      if (m2.generates) generate2 = true;\n      if (m2.modifies && !generate2) modify2 = true;\n      if (m2.source) source2 = t;\n      else if (m2.changes) source2 = null;\n    }\n    if (upstream) {\n      n = upstream.length - 1;\n      output2[0] = Relay({\n        derive: modify2,\n        pulse: n ? upstream : upstream[0]\n      });\n      if (modify2 || n) {\n        output2.splice(1, 0, collect());\n      }\n    }\n    if (!source2) output2.push(collect());\n    output2.push(Sieve({}));\n    return output2;\n  }\n  function collect(values2) {\n    const s2 = Collect({}, values2);\n    s2.metadata = {\n      source: true\n    };\n    return s2;\n  }\n  function load(scope, data2) {\n    return Load({\n      url: data2.url ? scope.property(data2.url) : void 0,\n      async: data2.async ? scope.property(data2.async) : void 0,\n      values: data2.values ? scope.property(data2.values) : void 0,\n      format: scope.objectProperty(data2.format)\n    });\n  }\n  const isX = (orient) => orient === Bottom || orient === Top;\n  const getSign = (orient, a2, b2) => isSignal(orient) ? ifLeftTopExpr(orient.signal, a2, b2) : orient === Left || orient === Top ? a2 : b2;\n  const ifX = (orient, a2, b2) => isSignal(orient) ? ifXEnc(orient.signal, a2, b2) : isX(orient) ? a2 : b2;\n  const ifY = (orient, a2, b2) => isSignal(orient) ? ifYEnc(orient.signal, a2, b2) : isX(orient) ? b2 : a2;\n  const ifTop = (orient, a2, b2) => isSignal(orient) ? ifTopExpr(orient.signal, a2, b2) : orient === Top ? {\n    value: a2\n  } : {\n    value: b2\n  };\n  const ifRight = (orient, a2, b2) => isSignal(orient) ? ifRightExpr(orient.signal, a2, b2) : orient === Right ? {\n    value: a2\n  } : {\n    value: b2\n  };\n  const ifXEnc = ($orient, a2, b2) => ifEnc(`${$orient} === '${Top}' || ${$orient} === '${Bottom}'`, a2, b2);\n  const ifYEnc = ($orient, a2, b2) => ifEnc(`${$orient} !== '${Top}' && ${$orient} !== '${Bottom}'`, a2, b2);\n  const ifLeftTopExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Left}' || ${$orient} === '${Top}'`, a2, b2);\n  const ifTopExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Top}'`, a2, b2);\n  const ifRightExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Right}'`, a2, b2);\n  const ifEnc = (test2, a2, b2) => {\n    a2 = a2 != null ? encoder(a2) : a2;\n    b2 = b2 != null ? encoder(b2) : b2;\n    if (isSimple(a2) && isSimple(b2)) {\n      a2 = a2 ? a2.signal || $(a2.value) : null;\n      b2 = b2 ? b2.signal || $(b2.value) : null;\n      return {\n        signal: `${test2} ? (${a2}) : (${b2})`\n      };\n    } else {\n      return [extend({\n        test: test2\n      }, a2)].concat(b2 || []);\n    }\n  };\n  const isSimple = (enc) => enc == null || Object.keys(enc).length === 1;\n  const ifExpr = (test2, a2, b2) => ({\n    signal: `${test2} ? (${toExpr(a2)}) : (${toExpr(b2)})`\n  });\n  const ifOrient = ($orient, t, b2, l, r) => ({\n    signal: (l != null ? `${$orient} === '${Left}' ? (${toExpr(l)}) : ` : \"\") + (b2 != null ? `${$orient} === '${Bottom}' ? (${toExpr(b2)}) : ` : \"\") + (r != null ? `${$orient} === '${Right}' ? (${toExpr(r)}) : ` : \"\") + (t != null ? `${$orient} === '${Top}' ? (${toExpr(t)}) : ` : \"\") + \"(null)\"\n  });\n  const toExpr = (v) => isSignal(v) ? v.signal : v == null ? null : $(v);\n  const mult = (sign2, value2) => value2 === 0 ? 0 : isSignal(sign2) ? {\n    signal: `(${sign2.signal}) * ${value2}`\n  } : {\n    value: sign2 * value2\n  };\n  const patch = (value2, base2) => {\n    const s2 = value2.signal;\n    return s2 && s2.endsWith(\"(null)\") ? {\n      signal: s2.slice(0, -6) + base2.signal\n    } : value2;\n  };\n  function fallback(prop, config, axisConfig2, style2) {\n    let styleProp;\n    if (config && has$1(config, prop)) {\n      return config[prop];\n    } else if (has$1(axisConfig2, prop)) {\n      return axisConfig2[prop];\n    } else if (prop.startsWith(\"title\")) {\n      switch (prop) {\n        case \"titleColor\":\n          styleProp = \"fill\";\n          break;\n        case \"titleFont\":\n        case \"titleFontSize\":\n        case \"titleFontWeight\":\n          styleProp = prop[5].toLowerCase() + prop.slice(6);\n      }\n      return style2[GuideTitleStyle][styleProp];\n    } else if (prop.startsWith(\"label\")) {\n      switch (prop) {\n        case \"labelColor\":\n          styleProp = \"fill\";\n          break;\n        case \"labelFont\":\n        case \"labelFontSize\":\n          styleProp = prop[5].toLowerCase() + prop.slice(6);\n      }\n      return style2[GuideLabelStyle][styleProp];\n    }\n    return null;\n  }\n  function keys(objects) {\n    const map2 = {};\n    for (const obj2 of objects) {\n      if (!obj2) continue;\n      for (const key2 in obj2) map2[key2] = 1;\n    }\n    return Object.keys(map2);\n  }\n  function axisConfig(spec, scope) {\n    var config = scope.config, style2 = config.style, axis = config.axis, band2 = scope.scaleType(spec.scale) === \"band\" && config.axisBand, orient = spec.orient, xy, or2, key2;\n    if (isSignal(orient)) {\n      const xyKeys = keys([config.axisX, config.axisY]), orientKeys = keys([config.axisTop, config.axisBottom, config.axisLeft, config.axisRight]);\n      xy = {};\n      for (key2 of xyKeys) {\n        xy[key2] = ifX(orient, fallback(key2, config.axisX, axis, style2), fallback(key2, config.axisY, axis, style2));\n      }\n      or2 = {};\n      for (key2 of orientKeys) {\n        or2[key2] = ifOrient(orient.signal, fallback(key2, config.axisTop, axis, style2), fallback(key2, config.axisBottom, axis, style2), fallback(key2, config.axisLeft, axis, style2), fallback(key2, config.axisRight, axis, style2));\n      }\n    } else {\n      xy = orient === Top || orient === Bottom ? config.axisX : config.axisY;\n      or2 = config[\"axis\" + orient[0].toUpperCase() + orient.slice(1)];\n    }\n    const result = xy || or2 || band2 ? extend({}, axis, xy, or2, band2) : axis;\n    return result;\n  }\n  function axisDomain(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient;\n    let enter, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"domainColor\"),\n      strokeCap: _(\"domainCap\"),\n      strokeDash: _(\"domainDash\"),\n      strokeDashOffset: _(\"domainDashOffset\"),\n      strokeWidth: _(\"domainWidth\"),\n      strokeOpacity: _(\"domainOpacity\")\n    });\n    const pos0 = position(spec, 0);\n    const pos1 = position(spec, 1);\n    enter.x = update2.x = ifX(orient, pos0, zero);\n    enter.x2 = update2.x2 = ifX(orient, pos1);\n    enter.y = update2.y = ifY(orient, pos0, zero);\n    enter.y2 = update2.y2 = ifY(orient, pos1);\n    return guideMark({\n      type: RuleMark,\n      role: AxisDomainRole,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function position(spec, pos) {\n    return {\n      scale: spec.scale,\n      range: pos\n    };\n  }\n  function axisGrid(spec, config, userEncode, dataRef, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, vscale = spec.gridScale, sign2 = getSign(orient, 1, -1), offset2 = offsetValue(spec.offset, sign2);\n    let enter, exit, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: exit = {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gridColor\"),\n      strokeCap: _(\"gridCap\"),\n      strokeDash: _(\"gridDash\"),\n      strokeDashOffset: _(\"gridDashOffset\"),\n      strokeOpacity: _(\"gridOpacity\"),\n      strokeWidth: _(\"gridWidth\")\n    });\n    const tickPos = {\n      scale: spec.scale,\n      field: Value,\n      band: band2.band,\n      extra: band2.extra,\n      offset: band2.offset,\n      round: _(\"tickRound\")\n    };\n    const sz2 = ifX(orient, {\n      signal: \"height\"\n    }, {\n      signal: \"width\"\n    });\n    const gridStart = vscale ? {\n      scale: vscale,\n      range: 0,\n      mult: sign2,\n      offset: offset2\n    } : {\n      value: 0,\n      offset: offset2\n    };\n    const gridEnd = vscale ? {\n      scale: vscale,\n      range: 1,\n      mult: sign2,\n      offset: offset2\n    } : extend(sz2, {\n      mult: sign2,\n      offset: offset2\n    });\n    enter.x = update2.x = ifX(orient, tickPos, gridStart);\n    enter.y = update2.y = ifY(orient, tickPos, gridStart);\n    enter.x2 = update2.x2 = ifY(orient, gridEnd);\n    enter.y2 = update2.y2 = ifX(orient, gridEnd);\n    exit.x = ifX(orient, tickPos);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n      type: RuleMark,\n      role: AxisGridRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function offsetValue(offset2, sign2) {\n    if (sign2 === 1) ;\n    else if (!isObject(offset2)) {\n      offset2 = isSignal(sign2) ? {\n        signal: `(${sign2.signal}) * (${offset2 || 0})`\n      } : sign2 * (offset2 || 0);\n    } else {\n      let entry2 = offset2 = extend({}, offset2);\n      while (entry2.mult != null) {\n        if (!isObject(entry2.mult)) {\n          entry2.mult = isSignal(sign2) ? {\n            signal: `(${entry2.mult}) * (${sign2.signal})`\n          } : entry2.mult * sign2;\n          return offset2;\n        } else {\n          entry2 = entry2.mult = extend({}, entry2.mult);\n        }\n      }\n      entry2.mult = sign2;\n    }\n    return offset2;\n  }\n  function axisTicks(spec, config, userEncode, dataRef, size, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, sign2 = getSign(orient, -1, 1);\n    let enter, exit, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: exit = {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"tickColor\"),\n      strokeCap: _(\"tickCap\"),\n      strokeDash: _(\"tickDash\"),\n      strokeDashOffset: _(\"tickDashOffset\"),\n      strokeOpacity: _(\"tickOpacity\"),\n      strokeWidth: _(\"tickWidth\")\n    });\n    const tickSize = encoder(size);\n    tickSize.mult = sign2;\n    const tickPos = {\n      scale: spec.scale,\n      field: Value,\n      band: band2.band,\n      extra: band2.extra,\n      offset: band2.offset,\n      round: _(\"tickRound\")\n    };\n    update2.y = enter.y = ifX(orient, zero, tickPos);\n    update2.y2 = enter.y2 = ifX(orient, tickSize);\n    exit.x = ifX(orient, tickPos);\n    update2.x = enter.x = ifY(orient, zero, tickPos);\n    update2.x2 = enter.x2 = ifY(orient, tickSize);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n      type: RuleMark,\n      role: AxisTickRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function flushExpr(scale2, threshold2, a2, b2, c2) {\n    return {\n      signal: 'flush(range(\"' + scale2 + '\"), scale(\"' + scale2 + '\", datum.value), ' + threshold2 + \",\" + a2 + \",\" + b2 + \",\" + c2 + \")\"\n    };\n  }\n  function axisLabels(spec, config, userEncode, dataRef, size, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, scale2 = spec.scale, sign2 = getSign(orient, -1, 1), flush2 = deref(_(\"labelFlush\")), flushOffset = deref(_(\"labelFlushOffset\")), labelAlign = _(\"labelAlign\"), labelBaseline = _(\"labelBaseline\");\n    let flushOn = flush2 === 0 || !!flush2, update2;\n    const tickSize = encoder(size);\n    tickSize.mult = sign2;\n    tickSize.offset = encoder(_(\"labelPadding\") || 0);\n    tickSize.offset.mult = sign2;\n    const tickPos = {\n      scale: scale2,\n      field: Value,\n      band: 0.5,\n      offset: extendOffset(band2.offset, _(\"labelOffset\"))\n    };\n    const align = ifX(orient, flushOn ? flushExpr(scale2, flush2, '\"left\"', '\"right\"', '\"center\"') : {\n      value: \"center\"\n    }, ifRight(orient, \"left\", \"right\"));\n    const baseline2 = ifX(orient, ifTop(orient, \"bottom\", \"top\"), flushOn ? flushExpr(scale2, flush2, '\"top\"', '\"bottom\"', '\"middle\"') : {\n      value: \"middle\"\n    });\n    const offsetExpr = flushExpr(scale2, flush2, `-(${flushOffset})`, flushOffset, 0);\n    flushOn = flushOn && flushOffset;\n    const enter = {\n      opacity: zero,\n      x: ifX(orient, tickPos, tickSize),\n      y: ifY(orient, tickPos, tickSize)\n    };\n    const encode2 = {\n      enter,\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        },\n        x: enter.x,\n        y: enter.y,\n        align,\n        baseline: baseline2\n      },\n      exit: {\n        opacity: zero,\n        x: enter.x,\n        y: enter.y\n      }\n    };\n    addEncoders(encode2, {\n      dx: !labelAlign && flushOn ? ifX(orient, offsetExpr) : null,\n      dy: !labelBaseline && flushOn ? ifY(orient, offsetExpr) : null\n    });\n    addEncoders(encode2, {\n      angle: _(\"labelAngle\"),\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontWeight: _(\"labelFontWeight\"),\n      fontStyle: _(\"labelFontStyle\"),\n      limit: _(\"labelLimit\"),\n      lineHeight: _(\"labelLineHeight\")\n    }, {\n      align: labelAlign,\n      baseline: labelBaseline\n    });\n    const bound2 = _(\"labelBound\");\n    let overlap = _(\"labelOverlap\");\n    overlap = overlap || bound2 ? {\n      separation: _(\"labelSeparation\"),\n      method: overlap,\n      order: \"datum.index\",\n      bound: bound2 ? {\n        scale: scale2,\n        orient,\n        tolerance: bound2\n      } : null\n    } : void 0;\n    if (update2.align !== align) {\n      update2.align = patch(update2.align, align);\n    }\n    if (update2.baseline !== baseline2) {\n      update2.baseline = patch(update2.baseline, baseline2);\n    }\n    return guideMark({\n      type: TextMark,\n      role: AxisLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: dataRef,\n      encode: encode2,\n      overlap\n    }, userEncode);\n  }\n  function axisTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient, sign2 = getSign(orient, -1, 1);\n    let enter, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero,\n        anchor: encoder(_(\"titleAnchor\", null)),\n        align: {\n          signal: alignExpr$1\n        }\n      },\n      update: update2 = extend({}, enter, {\n        opacity: one,\n        text: encoder(spec.title)\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    const titlePos = {\n      signal: `lerp(range(\"${spec.scale}\"), ${anchorExpr(0, 1, 0.5)})`\n    };\n    update2.x = ifX(orient, titlePos);\n    update2.y = ifY(orient, titlePos);\n    enter.angle = ifX(orient, zero, mult(sign2, 90));\n    enter.baseline = ifX(orient, ifTop(orient, Bottom, Top), {\n      value: Bottom\n    });\n    update2.angle = enter.angle;\n    update2.baseline = enter.baseline;\n    addEncoders(encode2, {\n      fill: _(\"titleColor\"),\n      fillOpacity: _(\"titleOpacity\"),\n      font: _(\"titleFont\"),\n      fontSize: _(\"titleFontSize\"),\n      fontStyle: _(\"titleFontStyle\"),\n      fontWeight: _(\"titleFontWeight\"),\n      limit: _(\"titleLimit\"),\n      lineHeight: _(\"titleLineHeight\")\n    }, {\n      // require update\n      align: _(\"titleAlign\"),\n      angle: _(\"titleAngle\"),\n      baseline: _(\"titleBaseline\")\n    });\n    autoLayout(_, orient, encode2, userEncode);\n    encode2.update.align = patch(encode2.update.align, enter.align);\n    encode2.update.angle = patch(encode2.update.angle, enter.angle);\n    encode2.update.baseline = patch(encode2.update.baseline, enter.baseline);\n    return guideMark({\n      type: TextMark,\n      role: AxisTitleRole,\n      style: GuideTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function autoLayout(_, orient, encode2, userEncode) {\n    const auto = (value2, dim) => value2 != null ? (encode2.update[dim] = patch(encoder(value2), encode2.update[dim]), false) : !has(dim, userEncode) ? true : false;\n    const autoY = auto(_(\"titleX\"), \"x\"), autoX = auto(_(\"titleY\"), \"y\");\n    encode2.enter.auto = autoX === autoY ? encoder(autoX) : ifX(orient, encoder(autoX), encoder(autoY));\n  }\n  function parseAxis(spec, scope) {\n    const config = axisConfig(spec, scope), encode2 = spec.encode || {}, axisEncode = encode2.axis || {}, name = axisEncode.name || void 0, interactive2 = axisEncode.interactive, style2 = axisEncode.style, _ = lookup(spec, config), band2 = tickBand(_);\n    const datum2 = {\n      scale: spec.scale,\n      ticks: !!_(\"ticks\"),\n      labels: !!_(\"labels\"),\n      grid: !!_(\"grid\"),\n      domain: !!_(\"domain\"),\n      title: spec.title != null\n    };\n    const dataRef = ref(scope.add(Collect({}, [datum2])));\n    const ticksRef = ref(scope.add(AxisTicks({\n      scale: scope.scaleRef(spec.scale),\n      extra: scope.property(band2.extra),\n      count: scope.objectProperty(spec.tickCount),\n      values: scope.objectProperty(spec.values),\n      minstep: scope.property(spec.tickMinStep),\n      formatType: scope.property(spec.formatType),\n      formatSpecifier: scope.property(spec.format)\n    })));\n    const children2 = [];\n    let size;\n    if (datum2.grid) {\n      children2.push(axisGrid(spec, config, encode2.grid, ticksRef, band2));\n    }\n    if (datum2.ticks) {\n      size = _(\"tickSize\");\n      children2.push(axisTicks(spec, config, encode2.ticks, ticksRef, size, band2));\n    }\n    if (datum2.labels) {\n      size = datum2.ticks ? size : 0;\n      children2.push(axisLabels(spec, config, encode2.labels, ticksRef, size, band2));\n    }\n    if (datum2.domain) {\n      children2.push(axisDomain(spec, config, encode2.domain, dataRef));\n    }\n    if (datum2.title) {\n      children2.push(axisTitle(spec, config, encode2.title, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: AxisRole,\n      from: dataRef,\n      encode: extendEncode(buildAxisEncode(_, spec), axisEncode, Skip),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function buildAxisEncode(_, spec) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      offset: _(\"offset\") || 0,\n      position: value(spec.position, 0),\n      titlePadding: _(\"titlePadding\"),\n      minExtent: _(\"minExtent\"),\n      maxExtent: _(\"maxExtent\"),\n      range: {\n        signal: `abs(span(range(\"${spec.scale}\")))`\n      },\n      translate: _(\"translate\"),\n      // accessibility support\n      format: spec.format,\n      formatType: spec.formatType\n    });\n    return encode2;\n  }\n  function parseScope(spec, scope, preprocessed) {\n    const signals = array$4(spec.signals), scales2 = array$4(spec.scales);\n    if (!preprocessed) signals.forEach((_) => parseSignal(_, scope));\n    array$4(spec.projections).forEach((_) => parseProjection(_, scope));\n    scales2.forEach((_) => initScale(_, scope));\n    array$4(spec.data).forEach((_) => parseData(_, scope));\n    scales2.forEach((_) => parseScale(_, scope));\n    (preprocessed || signals).forEach((_) => parseSignalUpdates(_, scope));\n    array$4(spec.axes).forEach((_) => parseAxis(_, scope));\n    array$4(spec.marks).forEach((_) => parseMark(_, scope));\n    array$4(spec.legends).forEach((_) => parseLegend(_, scope));\n    if (spec.title) parseTitle(spec.title, scope);\n    scope.parseLambdas();\n    return scope;\n  }\n  const rootEncode = (spec) => extendEncode({\n    enter: {\n      x: {\n        value: 0\n      },\n      y: {\n        value: 0\n      }\n    },\n    update: {\n      width: {\n        signal: \"width\"\n      },\n      height: {\n        signal: \"height\"\n      }\n    }\n  }, spec);\n  function parseView(spec, scope) {\n    const config = scope.config;\n    const root = ref(scope.root = scope.add(operator()));\n    const signals = collectSignals(spec, config);\n    signals.forEach((_) => parseSignal(_, scope));\n    scope.description = spec.description || config.description;\n    scope.eventConfig = config.events;\n    scope.legends = scope.objectProperty(config.legend && config.legend.layout);\n    scope.locale = config.locale;\n    const input = scope.add(Collect());\n    const encode2 = scope.add(Encode(parseEncode(rootEncode(spec.encode), GroupMark, FrameRole, spec.style, scope, {\n      pulse: ref(input)\n    })));\n    const parent = scope.add(ViewLayout({\n      layout: scope.objectProperty(spec.layout),\n      legends: scope.legends,\n      autosize: scope.signalRef(\"autosize\"),\n      mark: root,\n      pulse: ref(encode2)\n    }));\n    scope.operators.pop();\n    scope.pushState(ref(encode2), ref(parent), null);\n    parseScope(spec, scope, signals);\n    scope.operators.push(parent);\n    let op = scope.add(Bound({\n      mark: root,\n      pulse: ref(parent)\n    }));\n    op = scope.add(Render({\n      pulse: ref(op)\n    }));\n    op = scope.add(Sieve({\n      pulse: ref(op)\n    }));\n    scope.addData(\"root\", new DataScope(scope, input, input, op));\n    return scope;\n  }\n  function signalObject(name, value2) {\n    return value2 && value2.signal ? {\n      name,\n      update: value2.signal\n    } : {\n      name,\n      value: value2\n    };\n  }\n  function collectSignals(spec, config) {\n    const _ = (name) => value(spec[name], config[name]), signals = [signalObject(\"background\", _(\"background\")), signalObject(\"autosize\", parseAutosize(_(\"autosize\"))), signalObject(\"padding\", parsePadding(_(\"padding\"))), signalObject(\"width\", _(\"width\") || 0), signalObject(\"height\", _(\"height\") || 0)], pre = signals.reduce((p, s2) => (p[s2.name] = s2, p), {}), map2 = {};\n    array$4(spec.signals).forEach((s2) => {\n      if (has$1(pre, s2.name)) {\n        s2 = extend(pre[s2.name], s2);\n      } else {\n        signals.push(s2);\n      }\n      map2[s2.name] = s2;\n    });\n    array$4(config.signals).forEach((s2) => {\n      if (!has$1(map2, s2.name) && !has$1(pre, s2.name)) {\n        signals.push(s2);\n      }\n    });\n    return signals;\n  }\n  function Scope(config, options2) {\n    this.config = config || {};\n    this.options = options2 || {};\n    this.bindings = [];\n    this.field = {};\n    this.signals = {};\n    this.lambdas = {};\n    this.scales = {};\n    this.events = {};\n    this.data = {};\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this.eventConfig = null;\n    this.locale = null;\n    this._id = 0;\n    this._subid = 0;\n    this._nextsub = [0];\n    this._parent = [];\n    this._encode = [];\n    this._lookup = [];\n    this._markpath = [];\n  }\n  function Subscope(scope) {\n    this.config = scope.config;\n    this.options = scope.options;\n    this.legends = scope.legends;\n    this.field = Object.create(scope.field);\n    this.signals = Object.create(scope.signals);\n    this.lambdas = Object.create(scope.lambdas);\n    this.scales = Object.create(scope.scales);\n    this.events = Object.create(scope.events);\n    this.data = Object.create(scope.data);\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this._id = 0;\n    this._subid = ++scope._nextsub[0];\n    this._nextsub = scope._nextsub;\n    this._parent = scope._parent.slice();\n    this._encode = scope._encode.slice();\n    this._lookup = scope._lookup.slice();\n    this._markpath = scope._markpath;\n  }\n  Scope.prototype = Subscope.prototype = {\n    parse(spec) {\n      return parseScope(spec, this);\n    },\n    fork() {\n      return new Subscope(this);\n    },\n    isSubscope() {\n      return this._subid > 0;\n    },\n    toRuntime() {\n      this.finish();\n      return {\n        description: this.description,\n        operators: this.operators,\n        streams: this.streams,\n        updates: this.updates,\n        bindings: this.bindings,\n        eventConfig: this.eventConfig,\n        locale: this.locale\n      };\n    },\n    id() {\n      return (this._subid ? this._subid + \":\" : 0) + this._id++;\n    },\n    add(op) {\n      this.operators.push(op);\n      op.id = this.id();\n      if (op.refs) {\n        op.refs.forEach((ref2) => {\n          ref2.$ref = op.id;\n        });\n        op.refs = null;\n      }\n      return op;\n    },\n    proxy(op) {\n      const vref = op instanceof Entry ? ref(op) : op;\n      return this.add(Proxy({\n        value: vref\n      }));\n    },\n    addStream(stream2) {\n      this.streams.push(stream2);\n      stream2.id = this.id();\n      return stream2;\n    },\n    addUpdate(update2) {\n      this.updates.push(update2);\n      return update2;\n    },\n    // Apply metadata\n    finish() {\n      let name, ds;\n      if (this.root) this.root.root = true;\n      for (name in this.signals) {\n        this.signals[name].signal = name;\n      }\n      for (name in this.scales) {\n        this.scales[name].scale = name;\n      }\n      function annotate(op, name2, type2) {\n        let data2, list;\n        if (op) {\n          data2 = op.data || (op.data = {});\n          list = data2[name2] || (data2[name2] = []);\n          list.push(type2);\n        }\n      }\n      for (name in this.data) {\n        ds = this.data[name];\n        annotate(ds.input, name, \"input\");\n        annotate(ds.output, name, \"output\");\n        annotate(ds.values, name, \"values\");\n        for (const field2 in ds.index) {\n          annotate(ds.index[field2], name, \"index:\" + field2);\n        }\n      }\n      return this;\n    },\n    // ----\n    pushState(encode2, parent, lookup2) {\n      this._encode.push(ref(this.add(Sieve({\n        pulse: encode2\n      }))));\n      this._parent.push(parent);\n      this._lookup.push(lookup2 ? ref(this.proxy(lookup2)) : null);\n      this._markpath.push(-1);\n    },\n    popState() {\n      this._encode.pop();\n      this._parent.pop();\n      this._lookup.pop();\n      this._markpath.pop();\n    },\n    parent() {\n      return peek$1(this._parent);\n    },\n    encode() {\n      return peek$1(this._encode);\n    },\n    lookup() {\n      return peek$1(this._lookup);\n    },\n    markpath() {\n      const p = this._markpath;\n      return ++p[p.length - 1];\n    },\n    // ----\n    fieldRef(field2, name) {\n      if (isString(field2)) return fieldRef$1(field2, name);\n      if (!field2.signal) {\n        error(\"Unsupported field reference: \" + $(field2));\n      }\n      const s2 = field2.signal;\n      let f = this.field[s2];\n      if (!f) {\n        const params2 = {\n          name: this.signalRef(s2)\n        };\n        if (name) params2.as = name;\n        this.field[s2] = f = ref(this.add(Field(params2)));\n      }\n      return f;\n    },\n    compareRef(cmp) {\n      let signal = false;\n      const check = (_) => isSignal(_) ? (signal = true, this.signalRef(_.signal)) : isExpr$1(_) ? (signal = true, this.exprRef(_.expr)) : _;\n      const fields = array$4(cmp.field).map(check), orders = array$4(cmp.order).map(check);\n      return signal ? ref(this.add(Compare({\n        fields,\n        orders\n      }))) : compareRef(fields, orders);\n    },\n    keyRef(fields, flat) {\n      let signal = false;\n      const check = (_) => isSignal(_) ? (signal = true, ref(sig[_.signal])) : _;\n      const sig = this.signals;\n      fields = array$4(fields).map(check);\n      return signal ? ref(this.add(Key({\n        fields,\n        flat\n      }))) : keyRef(fields, flat);\n    },\n    sortRef(sort2) {\n      if (!sort2) return sort2;\n      const a2 = aggrField(sort2.op, sort2.field), o = sort2.order || Ascending;\n      return o.signal ? ref(this.add(Compare({\n        fields: a2,\n        orders: this.signalRef(o.signal)\n      }))) : compareRef(a2, o);\n    },\n    // ----\n    event(source2, type2) {\n      const key2 = source2 + \":\" + type2;\n      if (!this.events[key2]) {\n        const id2 = this.id();\n        this.streams.push({\n          id: id2,\n          source: source2,\n          type: type2\n        });\n        this.events[key2] = id2;\n      }\n      return this.events[key2];\n    },\n    // ----\n    hasOwnSignal(name) {\n      return has$1(this.signals, name);\n    },\n    addSignal(name, value2) {\n      if (this.hasOwnSignal(name)) {\n        error(\"Duplicate signal name: \" + $(name));\n      }\n      const op = value2 instanceof Entry ? value2 : this.add(operator(value2));\n      return this.signals[name] = op;\n    },\n    getSignal(name) {\n      if (!this.signals[name]) {\n        error(\"Unrecognized signal name: \" + $(name));\n      }\n      return this.signals[name];\n    },\n    signalRef(s2) {\n      if (this.signals[s2]) {\n        return ref(this.signals[s2]);\n      } else if (!has$1(this.lambdas, s2)) {\n        this.lambdas[s2] = this.add(operator(null));\n      }\n      return ref(this.lambdas[s2]);\n    },\n    parseLambdas() {\n      const code = Object.keys(this.lambdas);\n      for (let i = 0, n = code.length; i < n; ++i) {\n        const s2 = code[i], e = parser(s2, this), op = this.lambdas[s2];\n        op.params = e.$params;\n        op.update = e.$expr;\n      }\n    },\n    property(spec) {\n      return spec && spec.signal ? this.signalRef(spec.signal) : spec;\n    },\n    objectProperty(spec) {\n      return !spec || !isObject(spec) ? spec : this.signalRef(spec.signal || propertyLambda(spec));\n    },\n    exprRef(code, name) {\n      const params2 = {\n        expr: parser(code, this)\n      };\n      if (name) params2.expr.$name = name;\n      return ref(this.add(Expression(params2)));\n    },\n    addBinding(name, bind2) {\n      if (!this.bindings) {\n        error(\"Nested signals do not support binding: \" + $(name));\n      }\n      this.bindings.push(extend({\n        signal: name\n      }, bind2));\n    },\n    // ----\n    addScaleProj(name, transform2) {\n      if (has$1(this.scales, name)) {\n        error(\"Duplicate scale or projection name: \" + $(name));\n      }\n      this.scales[name] = this.add(transform2);\n    },\n    addScale(name, params2) {\n      this.addScaleProj(name, Scale(params2));\n    },\n    addProjection(name, params2) {\n      this.addScaleProj(name, Projection(params2));\n    },\n    getScale(name) {\n      if (!this.scales[name]) {\n        error(\"Unrecognized scale name: \" + $(name));\n      }\n      return this.scales[name];\n    },\n    scaleRef(name) {\n      return ref(this.getScale(name));\n    },\n    scaleType(name) {\n      return this.getScale(name).params.type;\n    },\n    projectionRef(name) {\n      return this.scaleRef(name);\n    },\n    projectionType(name) {\n      return this.scaleType(name);\n    },\n    // ----\n    addData(name, dataScope) {\n      if (has$1(this.data, name)) {\n        error(\"Duplicate data set name: \" + $(name));\n      }\n      return this.data[name] = dataScope;\n    },\n    getData(name) {\n      if (!this.data[name]) {\n        error(\"Undefined data set name: \" + $(name));\n      }\n      return this.data[name];\n    },\n    addDataPipeline(name, entries) {\n      if (has$1(this.data, name)) {\n        error(\"Duplicate data set name: \" + $(name));\n      }\n      return this.addData(name, DataScope.fromEntries(this, entries));\n    }\n  };\n  function propertyLambda(spec) {\n    return (isArray(spec) ? arrayLambda : objectLambda)(spec);\n  }\n  function arrayLambda(array2) {\n    const n = array2.length;\n    let code = \"[\";\n    for (let i = 0; i < n; ++i) {\n      const value2 = array2[i];\n      code += (i > 0 ? \",\" : \"\") + (isObject(value2) ? value2.signal || propertyLambda(value2) : $(value2));\n    }\n    return code + \"]\";\n  }\n  function objectLambda(obj2) {\n    let code = \"{\", i = 0, key2, value2;\n    for (key2 in obj2) {\n      value2 = obj2[key2];\n      code += (++i > 1 ? \",\" : \"\") + $(key2) + \":\" + (isObject(value2) ? value2.signal || propertyLambda(value2) : $(value2));\n    }\n    return code + \"}\";\n  }\n  function defaults() {\n    const defaultFont = \"sans-serif\", defaultSymbolSize = 30, defaultStrokeWidth = 2, defaultColor = \"#4c78a8\", black = \"#000\", gray = \"#888\", lightGray = \"#ddd\";\n    return {\n      // default visualization description\n      description: \"Vega visualization\",\n      // default padding around visualization\n      padding: 0,\n      // default for automatic sizing; options: 'none', 'pad', 'fit'\n      // or provide an object (e.g., {'type': 'pad', 'resize': true})\n      autosize: \"pad\",\n      // default view background color\n      // covers the entire view component\n      background: null,\n      // default event handling configuration\n      // preventDefault for view-sourced event types except 'wheel'\n      events: {\n        defaults: {\n          allow: [\"wheel\"]\n        }\n      },\n      // defaults for top-level group marks\n      // accepts mark properties (fill, stroke, etc)\n      // covers the data rectangle within group width/height\n      group: null,\n      // defaults for basic mark types\n      // each subset accepts mark properties (fill, stroke, etc)\n      mark: null,\n      arc: {\n        fill: defaultColor\n      },\n      area: {\n        fill: defaultColor\n      },\n      image: null,\n      line: {\n        stroke: defaultColor,\n        strokeWidth: defaultStrokeWidth\n      },\n      path: {\n        stroke: defaultColor\n      },\n      rect: {\n        fill: defaultColor\n      },\n      rule: {\n        stroke: black\n      },\n      shape: {\n        stroke: defaultColor\n      },\n      symbol: {\n        fill: defaultColor,\n        size: 64\n      },\n      text: {\n        fill: black,\n        font: defaultFont,\n        fontSize: 11\n      },\n      trail: {\n        fill: defaultColor,\n        size: defaultStrokeWidth\n      },\n      // style definitions\n      style: {\n        // axis & legend labels\n        \"guide-label\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 10\n        },\n        // axis & legend titles\n        \"guide-title\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 11,\n          fontWeight: \"bold\"\n        },\n        // headers, including chart title\n        \"group-title\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 13,\n          fontWeight: \"bold\"\n        },\n        // chart subtitle\n        \"group-subtitle\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 12\n        },\n        // defaults for styled point marks in Vega-Lite\n        point: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth,\n          shape: \"circle\"\n        },\n        circle: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth\n        },\n        square: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth,\n          shape: \"square\"\n        },\n        // defaults for styled group marks in Vega-Lite\n        cell: {\n          fill: \"transparent\",\n          stroke: lightGray\n        },\n        view: {\n          fill: \"transparent\"\n        }\n      },\n      // defaults for title\n      title: {\n        orient: \"top\",\n        anchor: \"middle\",\n        offset: 4,\n        subtitlePadding: 3\n      },\n      // defaults for axes\n      axis: {\n        minExtent: 0,\n        maxExtent: 200,\n        bandPosition: 0.5,\n        domain: true,\n        domainWidth: 1,\n        domainColor: gray,\n        grid: false,\n        gridWidth: 1,\n        gridColor: lightGray,\n        labels: true,\n        labelAngle: 0,\n        labelLimit: 180,\n        labelOffset: 0,\n        labelPadding: 2,\n        ticks: true,\n        tickColor: gray,\n        tickOffset: 0,\n        tickRound: true,\n        tickSize: 5,\n        tickWidth: 1,\n        titlePadding: 4\n      },\n      // correction for centering bias\n      axisBand: {\n        tickOffset: -0.5\n      },\n      // defaults for cartographic projection\n      projection: {\n        type: \"mercator\"\n      },\n      // defaults for legends\n      legend: {\n        orient: \"right\",\n        padding: 0,\n        gridAlign: \"each\",\n        columnPadding: 10,\n        rowPadding: 2,\n        symbolDirection: \"vertical\",\n        gradientDirection: \"vertical\",\n        gradientLength: 200,\n        gradientThickness: 16,\n        gradientStrokeColor: lightGray,\n        gradientStrokeWidth: 0,\n        gradientLabelOffset: 2,\n        labelAlign: \"left\",\n        labelBaseline: \"middle\",\n        labelLimit: 160,\n        labelOffset: 4,\n        labelOverlap: true,\n        symbolLimit: 30,\n        symbolType: \"circle\",\n        symbolSize: 100,\n        symbolOffset: 0,\n        symbolStrokeWidth: 1.5,\n        symbolBaseFillColor: \"transparent\",\n        symbolBaseStrokeColor: gray,\n        titleLimit: 180,\n        titleOrient: \"top\",\n        titlePadding: 5,\n        layout: {\n          offset: 18,\n          direction: \"horizontal\",\n          left: {\n            direction: \"vertical\"\n          },\n          right: {\n            direction: \"vertical\"\n          }\n        }\n      },\n      // defaults for scale ranges\n      range: {\n        category: {\n          scheme: \"tableau10\"\n        },\n        ordinal: {\n          scheme: \"blues\"\n        },\n        heatmap: {\n          scheme: \"yellowgreenblue\"\n        },\n        ramp: {\n          scheme: \"blues\"\n        },\n        diverging: {\n          scheme: \"blueorange\",\n          extent: [1, 0]\n        },\n        symbol: [\"circle\", \"square\", \"triangle-up\", \"cross\", \"diamond\", \"triangle-right\", \"triangle-down\", \"triangle-left\"]\n      }\n    };\n  }\n  function parse(spec, config, options2) {\n    if (!isObject(spec)) {\n      error(\"Input Vega specification must be an object.\");\n    }\n    config = mergeConfig(defaults(), config, spec.config);\n    return parseView(spec, new Scope(config, options2)).toRuntime();\n  }\n  var version$1 = \"6.2.0\";\n  extend(transforms, tx, vtx, encode$1, geo, force, label, tree, reg, voronoi, wordcloud, xf);\n  const version = version$1;\n  const vega = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Bounds,\n    CanvasHandler,\n    CanvasRenderer,\n    DATE,\n    DAY,\n    DAYOFYEAR,\n    Dataflow,\n    Debug,\n    DisallowedObjectProperties,\n    Error: Error$1,\n    EventStream,\n    Gradient: Gradient$1,\n    GroupItem,\n    HOURS,\n    Handler,\n    HybridHandler,\n    HybridRenderer,\n    Info,\n    Item,\n    MILLISECONDS,\n    MINUTES,\n    MONTH,\n    Marks,\n    MultiPulse,\n    None: None$2,\n    Operator,\n    Parameters,\n    Pulse,\n    QUARTER,\n    RenderType,\n    Renderer,\n    ResourceLoader,\n    SECONDS,\n    SVGHandler,\n    SVGRenderer,\n    SVGStringRenderer,\n    Scenegraph,\n    TIME_UNITS,\n    Transform,\n    View: View$1,\n    WEEK,\n    Warn,\n    YEAR,\n    accessor,\n    accessorFields,\n    accessorName,\n    array: array$4,\n    ascending: ascending$1,\n    bandwidthNRD: estimateBandwidth,\n    bin,\n    bootstrapCI,\n    boundClip,\n    boundContext,\n    boundItem: boundItem$1,\n    boundMark,\n    boundStroke,\n    changeset,\n    clampRange,\n    codegenExpression: codegen,\n    compare: compare$1,\n    constant: constant$4,\n    cumulativeLogNormal,\n    cumulativeNormal,\n    cumulativeUniform,\n    dayofyear,\n    debounce,\n    defaultLocale,\n    definition: definition$1,\n    densityLogNormal,\n    densityNormal,\n    densityUniform,\n    domChild,\n    domClear,\n    domCreate,\n    domFind,\n    dotbin,\n    error,\n    expressionFunction,\n    extend,\n    extent,\n    extentIndex,\n    falsy,\n    fastmap,\n    field: field$1,\n    flush,\n    font,\n    fontFamily,\n    fontSize,\n    format: format$2,\n    formatLocale: numberFormatDefaultLocale,\n    formats: formats$1,\n    hasOwnProperty: has$1,\n    id,\n    identity: identity$2,\n    inferType,\n    inferTypes,\n    ingest: ingest$1,\n    inherits,\n    inrange,\n    interpolate,\n    interpolateColors,\n    interpolateRange,\n    intersect: intersect$2,\n    intersectBoxLine,\n    intersectPath,\n    intersectPoint,\n    intersectRule,\n    isArray,\n    isBoolean: isBoolean$1,\n    isDate: isDate$1,\n    isFunction,\n    isIterable,\n    isNumber: isNumber$1,\n    isObject,\n    isRegExp,\n    isString,\n    isTuple,\n    key,\n    lerp,\n    lineHeight,\n    loader,\n    locale,\n    logger,\n    lruCache,\n    markup,\n    merge: merge$2,\n    mergeConfig,\n    multiLineOffset,\n    one: one$1,\n    pad: pad$1,\n    panLinear,\n    panLog,\n    panPow,\n    panSymlog,\n    parse,\n    parseExpression: parser$1,\n    parseSelector: eventSelector,\n    path: path$3,\n    pathCurves: curves,\n    pathEqual,\n    pathParse: parse$3,\n    pathRectangle: vg_rect,\n    pathRender,\n    pathSymbols: symbols,\n    pathTrail: vg_trail,\n    peek: peek$1,\n    point,\n    projection,\n    quantileLogNormal,\n    quantileNormal,\n    quantileUniform,\n    quantiles,\n    quantizeInterpolator,\n    quarter,\n    quartiles,\n    get random() {\n      return random;\n    },\n    randomInteger: integer,\n    randomKDE: kde,\n    randomLCG: lcg$2,\n    randomLogNormal: lognormal,\n    randomMixture: mixture$1,\n    randomNormal: gaussian,\n    randomUniform: uniform,\n    read,\n    regressionConstant: constant$3,\n    regressionExp: exp$1,\n    regressionLinear: linear,\n    regressionLoess: loess,\n    regressionLog: log$2,\n    regressionPoly: poly,\n    regressionPow: pow$2,\n    regressionQuad: quad,\n    renderModule,\n    repeat,\n    resetDefaultLocale,\n    resetSVGDefIds,\n    responseType,\n    runtimeContext: context,\n    sampleCurve,\n    sampleLogNormal,\n    sampleNormal,\n    sampleUniform,\n    scale: scale$4,\n    sceneEqual,\n    sceneFromJSON,\n    scenePickVisit: pickVisit,\n    sceneToJSON,\n    sceneVisit: visit,\n    sceneZOrder: zorder,\n    scheme,\n    serializeXML,\n    setHybridRendererOptions,\n    setRandom,\n    span,\n    splitAccessPath,\n    stringValue: $,\n    textMetrics,\n    timeBin: bin$1,\n    timeFloor,\n    timeFormatLocale: timeFormatDefaultLocale,\n    timeInterval,\n    timeOffset,\n    timeSequence,\n    timeUnitSpecifier,\n    timeUnits,\n    toBoolean,\n    toDate,\n    toNumber,\n    toSet,\n    toString,\n    transform: transform$2,\n    transforms,\n    truncate: truncate$1,\n    truthy,\n    tupleid,\n    typeParsers,\n    utcFloor,\n    utcInterval,\n    utcOffset,\n    utcSequence,\n    utcdayofyear,\n    utcquarter,\n    utcweek,\n    version,\n    visitArray,\n    week,\n    writeConfig,\n    zero: zero$1,\n    zoomLinear,\n    zoomLog,\n    zoomPow,\n    zoomSymlog\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  use$1(fluentUI, vega);\n  const staticContent = Array.from(document.querySelectorAll(\"a.sanddance-app-static-content\"));\n  const dataSets = staticContent.filter((f) => f.id).map((n) => {\n    const forData = staticContent.filter((f) => f.dataset[\"for\"] === n.id)[0];\n    return {\n      dataSourceType: \"sample\",\n      id: n.id,\n      displayName: n.dataset[\"displayName\"],\n      dataUrl: n.href,\n      type: n.dataset[\"type\"],\n      snapshotsUrl: forData ? forData.href : null\n    };\n  });\n  let explorer;\n  const undef = \"undefined\";\n  ReactDOM__namespace.render(React__namespace.createElement(SandDanceApp, { setTheme: typeof setTheme !== undef && setTheme, darkTheme: typeof darkTheme !== undef && darkTheme, insights: typeof insights !== undef && insights, initialOptions: typeof options !== undef && options, themeColors: typeof themeColors !== undef && themeColors, dataSources: dataSets, mounted: (app) => {\n    explorer = app.explorer;\n  } }), document.getElementById(\"app\"));\n  const z = \"z\".charCodeAt(0);\n  const Z = \"Z\".charCodeAt(0);\n  document.onkeyup = (e) => {\n    if (e.ctrlKey && (e.keyCode === z || e.keyCode === Z)) {\n      if (e.shiftKey) {\n        explorer.redo();\n      } else {\n        explorer.undo();\n      }\n    }\n  };\n  window[\"SandDanceApp\"] = { explorer, SandDanceExplorer };\n}));\n"
  },
  {
    "path": "docs/tests/v4/es6/js/sanddance-test-es6.js",
    "content": "(function(factory) {\n  typeof define === \"function\" && define.amd ? define(factory) : factory();\n})((function() {\n  \"use strict\";\n  function accessor(fn2, fields, name) {\n    fn2.fields = fields || [];\n    fn2.fname = name;\n    return fn2;\n  }\n  function accessorName(fn2) {\n    return fn2 == null ? null : fn2.fname;\n  }\n  function accessorFields(fn2) {\n    return fn2 == null ? null : fn2.fields;\n  }\n  function getter$1(path2) {\n    return path2.length === 1 ? get1(path2[0]) : getN(path2);\n  }\n  const get1 = (field2) => function(obj2) {\n    return obj2[field2];\n  };\n  const getN = (path2) => {\n    const len2 = path2.length;\n    return function(obj2) {\n      for (let i = 0; i < len2; ++i) {\n        obj2 = obj2[path2[i]];\n      }\n      return obj2;\n    };\n  };\n  function error(message) {\n    throw Error(message);\n  }\n  function splitAccessPath(p) {\n    const path2 = [], n = p.length;\n    let q = null, b2 = 0, s = \"\", i, j, c2;\n    p = p + \"\";\n    function push2() {\n      path2.push(s + p.substring(i, j));\n      s = \"\";\n      i = j + 1;\n    }\n    for (i = j = 0; j < n; ++j) {\n      c2 = p[j];\n      if (c2 === \"\\\\\") {\n        s += p.substring(i, j++);\n        i = j;\n      } else if (c2 === q) {\n        push2();\n        q = null;\n        b2 = -1;\n      } else if (q) {\n        continue;\n      } else if (i === b2 && c2 === '\"') {\n        i = j + 1;\n        q = c2;\n      } else if (i === b2 && c2 === \"'\") {\n        i = j + 1;\n        q = c2;\n      } else if (c2 === \".\" && !b2) {\n        if (j > i) {\n          push2();\n        } else {\n          i = j + 1;\n        }\n      } else if (c2 === \"[\") {\n        if (j > i) push2();\n        b2 = i = j + 1;\n      } else if (c2 === \"]\") {\n        if (!b2) error(\"Access path missing open bracket: \" + p);\n        if (b2 > 0) push2();\n        b2 = 0;\n        i = j + 1;\n      }\n    }\n    if (b2) error(\"Access path missing closing bracket: \" + p);\n    if (q) error(\"Access path missing closing quote: \" + p);\n    if (j > i) {\n      j++;\n      push2();\n    }\n    return path2;\n  }\n  function field$1(field2, name, opt) {\n    const path2 = splitAccessPath(field2);\n    field2 = path2.length === 1 ? path2[0] : field2;\n    return accessor((opt && opt.get || getter$1)(path2), [field2], name || field2);\n  }\n  const id = field$1(\"id\");\n  const identity$7 = accessor((_) => _, [], \"identity\");\n  const zero$3 = accessor(() => 0, [], \"zero\");\n  const one$2 = accessor(() => 1, [], \"one\");\n  const truthy = accessor(() => true, [], \"true\");\n  const falsy = accessor(() => false, [], \"false\");\n  const DisallowedObjectProperties = /* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype).filter((name) => typeof Object.prototype[name] === \"function\"), \"__proto__\"]);\n  function log$1$1(method2, level, input) {\n    const args = [level].concat([].slice.call(input));\n    console[method2].apply(console, args);\n  }\n  const None$2 = 0;\n  const Error$1 = 1;\n  const Warn = 2;\n  const Info = 3;\n  const Debug = 4;\n  function logger(_, method2, handler = log$1$1) {\n    let level = _ || None$2;\n    return {\n      level(_2) {\n        if (arguments.length) {\n          level = +_2;\n          return this;\n        } else {\n          return level;\n        }\n      },\n      error() {\n        if (level >= Error$1) handler(method2 || \"error\", \"ERROR\", arguments);\n        return this;\n      },\n      warn() {\n        if (level >= Warn) handler(method2 || \"warn\", \"WARN\", arguments);\n        return this;\n      },\n      info() {\n        if (level >= Info) handler(method2 || \"log\", \"INFO\", arguments);\n        return this;\n      },\n      debug() {\n        if (level >= Debug) handler(method2 || \"log\", \"DEBUG\", arguments);\n        return this;\n      }\n    };\n  }\n  var isArray = Array.isArray;\n  function isObject$1(_) {\n    return _ === Object(_);\n  }\n  const isLegalKey = (key2) => key2 !== \"__proto__\";\n  function mergeConfig(...configs) {\n    return configs.reduce((out, source2) => {\n      for (const key2 in source2) {\n        if (key2 === \"signals\") {\n          out.signals = mergeNamed(out.signals, source2.signals);\n        } else {\n          const r = key2 === \"legend\" ? {\n            layout: 1\n          } : key2 === \"style\" ? true : null;\n          writeConfig(out, key2, source2[key2], r);\n        }\n      }\n      return out;\n    }, {});\n  }\n  function writeConfig(output2, key2, value2, recurse2) {\n    if (!isLegalKey(key2)) return;\n    let k, o;\n    if (isObject$1(value2) && !isArray(value2)) {\n      o = isObject$1(output2[key2]) ? output2[key2] : output2[key2] = {};\n      for (k in value2) {\n        if (recurse2 && (recurse2 === true || recurse2[k])) {\n          writeConfig(o, k, value2[k]);\n        } else if (isLegalKey(k)) {\n          o[k] = value2[k];\n        }\n      }\n    } else {\n      output2[key2] = value2;\n    }\n  }\n  function mergeNamed(a2, b2) {\n    if (a2 == null) return b2;\n    const map2 = {}, out = [];\n    function add2(_) {\n      if (!map2[_.name]) {\n        map2[_.name] = 1;\n        out.push(_);\n      }\n    }\n    b2.forEach(add2);\n    a2.forEach(add2);\n    return out;\n  }\n  function peek$1(array2) {\n    return array2[array2.length - 1];\n  }\n  function toNumber(_) {\n    return _ == null || _ === \"\" ? null : +_;\n  }\n  const exp$2 = (sign2) => (x2) => sign2 * Math.exp(x2);\n  const log$4 = (sign2) => (x2) => Math.log(sign2 * x2);\n  const symlog$1 = (c2) => (x2) => Math.sign(x2) * Math.log1p(Math.abs(x2 / c2));\n  const symexp = (c2) => (x2) => Math.sign(x2) * Math.expm1(Math.abs(x2)) * c2;\n  const pow$4 = (exponent2) => (x2) => x2 < 0 ? -Math.pow(-x2, exponent2) : Math.pow(x2, exponent2);\n  function pan(domain2, delta, lift, ground) {\n    const d0 = lift(domain2[0]), d1 = lift(peek$1(domain2)), dd = (d1 - d0) * delta;\n    return [ground(d0 - dd), ground(d1 - dd)];\n  }\n  function panLinear(domain2, delta) {\n    return pan(domain2, delta, toNumber, identity$7);\n  }\n  function panLog(domain2, delta) {\n    var sign2 = Math.sign(domain2[0]);\n    return pan(domain2, delta, log$4(sign2), exp$2(sign2));\n  }\n  function panPow(domain2, delta, exponent2) {\n    return pan(domain2, delta, pow$4(exponent2), pow$4(1 / exponent2));\n  }\n  function panSymlog(domain2, delta, constant2) {\n    return pan(domain2, delta, symlog$1(constant2), symexp(constant2));\n  }\n  function zoom$1(domain2, anchor, scale2, lift, ground) {\n    const d0 = lift(domain2[0]), d1 = lift(peek$1(domain2)), da = anchor != null ? lift(anchor) : (d0 + d1) / 2;\n    return [ground(da + (d0 - da) * scale2), ground(da + (d1 - da) * scale2)];\n  }\n  function zoomLinear(domain2, anchor, scale2) {\n    return zoom$1(domain2, anchor, scale2, toNumber, identity$7);\n  }\n  function zoomLog(domain2, anchor, scale2) {\n    const sign2 = Math.sign(domain2[0]);\n    return zoom$1(domain2, anchor, scale2, log$4(sign2), exp$2(sign2));\n  }\n  function zoomPow(domain2, anchor, scale2, exponent2) {\n    return zoom$1(domain2, anchor, scale2, pow$4(exponent2), pow$4(1 / exponent2));\n  }\n  function zoomSymlog(domain2, anchor, scale2, constant2) {\n    return zoom$1(domain2, anchor, scale2, symlog$1(constant2), symexp(constant2));\n  }\n  function quarter(date2) {\n    return 1 + ~~(new Date(date2).getMonth() / 3);\n  }\n  function utcquarter(date2) {\n    return 1 + ~~(new Date(date2).getUTCMonth() / 3);\n  }\n  function array$5(_) {\n    return _ != null ? isArray(_) ? _ : [_] : [];\n  }\n  function clampRange(range2, min2, max2) {\n    let lo = range2[0], hi = range2[1], span2;\n    if (hi < lo) {\n      span2 = hi;\n      hi = lo;\n      lo = span2;\n    }\n    span2 = hi - lo;\n    return span2 >= max2 - min2 ? [min2, max2] : [lo = Math.min(Math.max(lo, min2), max2 - span2), lo + span2];\n  }\n  function isFunction(_) {\n    return typeof _ === \"function\";\n  }\n  const DESCENDING = \"descending\";\n  function compare$2(fields, orders, opt) {\n    opt = opt || {};\n    orders = array$5(orders) || [];\n    const ord = [], get2 = [], fmap = {}, gen = opt.comparator || comparator;\n    array$5(fields).forEach((f, i) => {\n      if (f == null) return;\n      ord.push(orders[i] === DESCENDING ? -1 : 1);\n      get2.push(f = isFunction(f) ? f : field$1(f, null, opt));\n      (accessorFields(f) || []).forEach((_) => fmap[_] = 1);\n    });\n    return get2.length === 0 ? null : accessor(gen(get2, ord), Object.keys(fmap));\n  }\n  const ascending$2 = (u2, v) => (u2 < v || u2 == null) && v != null ? -1 : (u2 > v || v == null) && u2 != null ? 1 : (v = v instanceof Date ? +v : v, u2 = u2 instanceof Date ? +u2 : u2) !== u2 && v === v ? -1 : v !== v && u2 === u2 ? 1 : 0;\n  const comparator = (fields, orders) => fields.length === 1 ? compare1(fields[0], orders[0]) : compareN(fields, orders, fields.length);\n  const compare1 = (field2, order) => function(a2, b2) {\n    return ascending$2(field2(a2), field2(b2)) * order;\n  };\n  const compareN = (fields, orders, n) => {\n    orders.push(0);\n    return function(a2, b2) {\n      let f, c2 = 0, i = -1;\n      while (c2 === 0 && ++i < n) {\n        f = fields[i];\n        c2 = ascending$2(f(a2), f(b2));\n      }\n      return c2 * orders[i];\n    };\n  };\n  function constant$5(_) {\n    return isFunction(_) ? _ : () => _;\n  }\n  function debounce$1(delay, handler) {\n    let tid;\n    return (e) => {\n      if (tid) clearTimeout(tid);\n      tid = setTimeout(() => (handler(e), tid = null), delay);\n    };\n  }\n  function extend$1(_) {\n    for (let x2, k, i = 1, len2 = arguments.length; i < len2; ++i) {\n      x2 = arguments[i];\n      for (k in x2) {\n        _[k] = x2[k];\n      }\n    }\n    return _;\n  }\n  function extent(array2, f) {\n    let i = 0, n, v, min2, max2;\n    if (array2 && (n = array2.length)) {\n      if (f == null) {\n        for (v = array2[i]; i < n && (v == null || v !== v); v = array2[++i]) ;\n        min2 = max2 = v;\n        for (; i < n; ++i) {\n          v = array2[i];\n          if (v != null) {\n            if (v < min2) min2 = v;\n            if (v > max2) max2 = v;\n          }\n        }\n      } else {\n        for (v = f(array2[i]); i < n && (v == null || v !== v); v = f(array2[++i])) ;\n        min2 = max2 = v;\n        for (; i < n; ++i) {\n          v = f(array2[i]);\n          if (v != null) {\n            if (v < min2) min2 = v;\n            if (v > max2) max2 = v;\n          }\n        }\n      }\n    }\n    return [min2, max2];\n  }\n  function extentIndex(array2, f) {\n    const n = array2.length;\n    let i = -1, a2, b2, c2, u2, v;\n    if (f == null) {\n      while (++i < n) {\n        b2 = array2[i];\n        if (b2 != null && b2 >= b2) {\n          a2 = c2 = b2;\n          break;\n        }\n      }\n      if (i === n) return [-1, -1];\n      u2 = v = i;\n      while (++i < n) {\n        b2 = array2[i];\n        if (b2 != null) {\n          if (a2 > b2) {\n            a2 = b2;\n            u2 = i;\n          }\n          if (c2 < b2) {\n            c2 = b2;\n            v = i;\n          }\n        }\n      }\n    } else {\n      while (++i < n) {\n        b2 = f(array2[i], i, array2);\n        if (b2 != null && b2 >= b2) {\n          a2 = c2 = b2;\n          break;\n        }\n      }\n      if (i === n) return [-1, -1];\n      u2 = v = i;\n      while (++i < n) {\n        b2 = f(array2[i], i, array2);\n        if (b2 != null) {\n          if (a2 > b2) {\n            a2 = b2;\n            u2 = i;\n          }\n          if (c2 < b2) {\n            c2 = b2;\n            v = i;\n          }\n        }\n      }\n    }\n    return [u2, v];\n  }\n  function has$1(object2, property2) {\n    return Object.hasOwn(object2, property2);\n  }\n  const NULL = {};\n  function fastmap(input) {\n    let obj2 = {}, test2;\n    function has$1$1(key2) {\n      return has$1(obj2, key2) && obj2[key2] !== NULL;\n    }\n    const map2 = {\n      size: 0,\n      empty: 0,\n      object: obj2,\n      has: has$1$1,\n      get(key2) {\n        return has$1$1(key2) ? obj2[key2] : void 0;\n      },\n      set(key2, value2) {\n        if (!has$1$1(key2)) {\n          ++map2.size;\n          if (obj2[key2] === NULL) --map2.empty;\n        }\n        obj2[key2] = value2;\n        return this;\n      },\n      delete(key2) {\n        if (has$1$1(key2)) {\n          --map2.size;\n          ++map2.empty;\n          obj2[key2] = NULL;\n        }\n        return this;\n      },\n      clear() {\n        map2.size = map2.empty = 0;\n        map2.object = obj2 = {};\n      },\n      test(_) {\n        if (arguments.length) {\n          test2 = _;\n          return map2;\n        } else {\n          return test2;\n        }\n      },\n      clean() {\n        const next = {};\n        let size2 = 0;\n        for (const key2 in obj2) {\n          const value2 = obj2[key2];\n          if (value2 !== NULL && (!test2 || !test2(value2))) {\n            next[key2] = value2;\n            ++size2;\n          }\n        }\n        map2.size = size2;\n        map2.empty = 0;\n        map2.object = obj2 = next;\n      }\n    };\n    if (input) Object.keys(input).forEach((key2) => {\n      map2.set(key2, input[key2]);\n    });\n    return map2;\n  }\n  function flush(range2, value2, threshold2, left, right, center) {\n    if (!threshold2 && threshold2 !== 0) return center;\n    const t = +threshold2;\n    let a2 = range2[0], b2 = peek$1(range2), l;\n    if (b2 < a2) {\n      l = a2;\n      a2 = b2;\n      b2 = l;\n    }\n    l = Math.abs(value2 - a2);\n    const r = Math.abs(b2 - value2);\n    return l < r && l <= t ? left : r <= t ? right : center;\n  }\n  function inherits(child, parent, members) {\n    const proto = child.prototype = Object.create(parent.prototype);\n    Object.defineProperty(proto, \"constructor\", {\n      value: child,\n      writable: true,\n      enumerable: true,\n      configurable: true\n    });\n    return extend$1(proto, members);\n  }\n  function inrange(value2, range2, left, right) {\n    let r0 = range2[0], r1 = range2[range2.length - 1], t;\n    if (r0 > r1) {\n      t = r0;\n      r0 = r1;\n      r1 = t;\n    }\n    left = left === void 0 || left;\n    right = right === void 0 || right;\n    return (left ? r0 <= value2 : r0 < value2) && (right ? value2 <= r1 : value2 < r1);\n  }\n  function isBoolean$1(_) {\n    return typeof _ === \"boolean\";\n  }\n  function isDate$1(_) {\n    return Object.prototype.toString.call(_) === \"[object Date]\";\n  }\n  function isIterable(_) {\n    return _ && isFunction(_[Symbol.iterator]);\n  }\n  function isNumber$1(_) {\n    return typeof _ === \"number\";\n  }\n  function isRegExp(_) {\n    return Object.prototype.toString.call(_) === \"[object RegExp]\";\n  }\n  function isString(_) {\n    return typeof _ === \"string\";\n  }\n  function key$2(fields, flat, opt) {\n    if (fields) {\n      fields = flat ? array$5(fields).map((f) => f.replace(/\\\\(.)/g, \"$1\")) : array$5(fields);\n    }\n    const len2 = fields && fields.length, gen = opt && opt.get || getter$1, map2 = (f) => gen(flat ? [f] : splitAccessPath(f));\n    let fn2;\n    if (!len2) {\n      fn2 = function() {\n        return \"\";\n      };\n    } else if (len2 === 1) {\n      const get2 = map2(fields[0]);\n      fn2 = function(_) {\n        return \"\" + get2(_);\n      };\n    } else {\n      const get2 = fields.map(map2);\n      fn2 = function(_) {\n        let s = \"\" + get2[0](_), i = 0;\n        while (++i < len2) s += \"|\" + get2[i](_);\n        return s;\n      };\n    }\n    return accessor(fn2, fields, \"key\");\n  }\n  function lerp$1(array2, frac) {\n    const lo = array2[0], hi = peek$1(array2), f = +frac;\n    return !f ? lo : f === 1 ? hi : lo + f * (hi - lo);\n  }\n  const DEFAULT_MAX_SIZE = 1e4;\n  function lruCache(maxsize) {\n    maxsize = +maxsize || DEFAULT_MAX_SIZE;\n    let curr, prev, size2;\n    const clear = () => {\n      curr = {};\n      prev = {};\n      size2 = 0;\n    };\n    const update2 = (key2, value2) => {\n      if (++size2 > maxsize) {\n        prev = curr;\n        curr = {};\n        size2 = 1;\n      }\n      return curr[key2] = value2;\n    };\n    clear();\n    return {\n      clear,\n      has: (key2) => has$1(curr, key2) || has$1(prev, key2),\n      get: (key2) => has$1(curr, key2) ? curr[key2] : has$1(prev, key2) ? update2(key2, prev[key2]) : void 0,\n      set: (key2, value2) => has$1(curr, key2) ? curr[key2] = value2 : update2(key2, value2)\n    };\n  }\n  function merge$3(compare2, array0, array1, output2) {\n    const n0 = array0.length, n1 = array1.length;\n    if (!n1) return array0;\n    if (!n0) return array1;\n    const merged = output2 || new array0.constructor(n0 + n1);\n    let i0 = 0, i1 = 0, i = 0;\n    for (; i0 < n0 && i1 < n1; ++i) {\n      merged[i] = compare2(array0[i0], array1[i1]) > 0 ? array1[i1++] : array0[i0++];\n    }\n    for (; i0 < n0; ++i0, ++i) {\n      merged[i] = array0[i0];\n    }\n    for (; i1 < n1; ++i1, ++i) {\n      merged[i] = array1[i1];\n    }\n    return merged;\n  }\n  function repeat(str, reps) {\n    let s = \"\";\n    while (--reps >= 0) s += str;\n    return s;\n  }\n  function pad$2(str, length2, padchar, align) {\n    const c2 = padchar || \" \", s = str + \"\", n = length2 - s.length;\n    return n <= 0 ? s : align === \"left\" ? repeat(c2, n) + s : align === \"center\" ? repeat(c2, ~~(n / 2)) + s + repeat(c2, Math.ceil(n / 2)) : s + repeat(c2, n);\n  }\n  function span(array2) {\n    return array2 && peek$1(array2) - array2[0] || 0;\n  }\n  function $(x2) {\n    return isArray(x2) ? `[${x2.map((v) => v === null ? \"null\" : $(v))}]` : isObject$1(x2) || isString(x2) ? (\n      // Output valid JSON and JS source strings.\n      // See https://github.com/judofyr/timeless/blob/master/posts/json-isnt-a-javascript-subset.md\n      JSON.stringify(x2).replaceAll(\"\\u2028\", \"\\\\u2028\").replaceAll(\"\\u2029\", \"\\\\u2029\")\n    ) : x2;\n  }\n  function toBoolean(_) {\n    return _ == null || _ === \"\" ? null : !_ || _ === \"false\" || _ === \"0\" ? false : !!_;\n  }\n  const defaultParser = (_) => isNumber$1(_) ? _ : isDate$1(_) ? _ : Date.parse(_);\n  function toDate(_, parser2) {\n    parser2 = parser2 || defaultParser;\n    return _ == null || _ === \"\" ? null : parser2(_);\n  }\n  function toString(_) {\n    return _ == null || _ === \"\" ? null : _ + \"\";\n  }\n  function toSet(_) {\n    const s = {}, n = _.length;\n    for (let i = 0; i < n; ++i) s[_[i]] = true;\n    return s;\n  }\n  function truncate$1(str, length2, align, ellipsis) {\n    const e = ellipsis != null ? ellipsis : \"…\", s = str + \"\", n = s.length, l = Math.max(0, length2 - e.length);\n    return n <= length2 ? s : align === \"left\" ? e + s.slice(n - l) : align === \"center\" ? s.slice(0, Math.ceil(l / 2)) + e + s.slice(n - ~~(l / 2)) : s.slice(0, l) + e;\n  }\n  function visitArray(array2, filter2, visitor) {\n    if (array2) {\n      if (filter2) {\n        const n = array2.length;\n        for (let i = 0; i < n; ++i) {\n          const t = filter2(array2[i]);\n          if (t) visitor(t, i, array2);\n        }\n      } else {\n        array2.forEach(visitor);\n      }\n    }\n  }\n  var EOL = {}, EOF = {}, QUOTE = 34, NEWLINE = 10, RETURN = 13;\n  function objectConverter(columns) {\n    return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n      return JSON.stringify(name) + \": d[\" + i + '] || \"\"';\n    }).join(\",\") + \"}\");\n  }\n  function customConverter(columns, f) {\n    var object2 = objectConverter(columns);\n    return function(row, i) {\n      return f(object2(row), i, columns);\n    };\n  }\n  function inferColumns(rows) {\n    var columnSet = /* @__PURE__ */ Object.create(null), columns = [];\n    rows.forEach(function(row) {\n      for (var column in row) {\n        if (!(column in columnSet)) {\n          columns.push(columnSet[column] = column);\n        }\n      }\n    });\n    return columns;\n  }\n  function pad$1(value2, width2) {\n    var s = value2 + \"\", length2 = s.length;\n    return length2 < width2 ? new Array(width2 - length2 + 1).join(0) + s : s;\n  }\n  function formatYear$1(year) {\n    return year < 0 ? \"-\" + pad$1(-year, 6) : year > 9999 ? \"+\" + pad$1(year, 6) : pad$1(year, 4);\n  }\n  function formatDate(date2) {\n    var hours = date2.getUTCHours(), minutes = date2.getUTCMinutes(), seconds = date2.getUTCSeconds(), milliseconds = date2.getUTCMilliseconds();\n    return isNaN(date2) ? \"Invalid Date\" : formatYear$1(date2.getUTCFullYear()) + \"-\" + pad$1(date2.getUTCMonth() + 1, 2) + \"-\" + pad$1(date2.getUTCDate(), 2) + (milliseconds ? \"T\" + pad$1(hours, 2) + \":\" + pad$1(minutes, 2) + \":\" + pad$1(seconds, 2) + \".\" + pad$1(milliseconds, 3) + \"Z\" : seconds ? \"T\" + pad$1(hours, 2) + \":\" + pad$1(minutes, 2) + \":\" + pad$1(seconds, 2) + \"Z\" : minutes || hours ? \"T\" + pad$1(hours, 2) + \":\" + pad$1(minutes, 2) + \"Z\" : \"\");\n  }\n  function dsvFormat(delimiter) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n\\r]\"), DELIMITER = delimiter.charCodeAt(0);\n    function parse2(text2, f) {\n      var convert2, columns, rows = parseRows(text2, function(row, i) {\n        if (convert2) return convert2(row, i - 1);\n        columns = row, convert2 = f ? customConverter(row, f) : objectConverter(row);\n      });\n      rows.columns = columns || [];\n      return rows;\n    }\n    function parseRows(text2, f) {\n      var rows = [], N = text2.length, I = 0, n = 0, t, eof = N <= 0, eol = false;\n      if (text2.charCodeAt(N - 1) === NEWLINE) --N;\n      if (text2.charCodeAt(N - 1) === RETURN) --N;\n      function token() {\n        if (eof) return EOF;\n        if (eol) return eol = false, EOL;\n        var i, j = I, c2;\n        if (text2.charCodeAt(j) === QUOTE) {\n          while (I++ < N && text2.charCodeAt(I) !== QUOTE || text2.charCodeAt(++I) === QUOTE) ;\n          if ((i = I) >= N) eof = true;\n          else if ((c2 = text2.charCodeAt(I++)) === NEWLINE) eol = true;\n          else if (c2 === RETURN) {\n            eol = true;\n            if (text2.charCodeAt(I) === NEWLINE) ++I;\n          }\n          return text2.slice(j + 1, i - 1).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          if ((c2 = text2.charCodeAt(i = I++)) === NEWLINE) eol = true;\n          else if (c2 === RETURN) {\n            eol = true;\n            if (text2.charCodeAt(I) === NEWLINE) ++I;\n          } else if (c2 !== DELIMITER) continue;\n          return text2.slice(j, i);\n        }\n        return eof = true, text2.slice(j, N);\n      }\n      while ((t = token()) !== EOF) {\n        var row = [];\n        while (t !== EOL && t !== EOF) row.push(t), t = token();\n        if (f && (row = f(row, n++)) == null) continue;\n        rows.push(row);\n      }\n      return rows;\n    }\n    function preformatBody(rows, columns) {\n      return rows.map(function(row) {\n        return columns.map(function(column) {\n          return formatValue2(row[column]);\n        }).join(delimiter);\n      });\n    }\n    function format2(rows, columns) {\n      if (columns == null) columns = inferColumns(rows);\n      return [columns.map(formatValue2).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n    }\n    function formatBody(rows, columns) {\n      if (columns == null) columns = inferColumns(rows);\n      return preformatBody(rows, columns).join(\"\\n\");\n    }\n    function formatRows(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    }\n    function formatRow(row) {\n      return row.map(formatValue2).join(delimiter);\n    }\n    function formatValue2(value2) {\n      return value2 == null ? \"\" : value2 instanceof Date ? formatDate(value2) : reFormat.test(value2 += \"\") ? '\"' + value2.replace(/\"/g, '\"\"') + '\"' : value2;\n    }\n    return {\n      parse: parse2,\n      parseRows,\n      format: format2,\n      formatBody,\n      formatRows,\n      formatRow,\n      formatValue: formatValue2\n    };\n  }\n  function identity$6(x2) {\n    return x2;\n  }\n  function transform$3(transform2) {\n    if (transform2 == null) return identity$6;\n    var x02, y02, kx = transform2.scale[0], ky = transform2.scale[1], dx = transform2.translate[0], dy = transform2.translate[1];\n    return function(input, i) {\n      if (!i) x02 = y02 = 0;\n      var j = 2, n = input.length, output2 = new Array(n);\n      output2[0] = (x02 += input[0]) * kx + dx;\n      output2[1] = (y02 += input[1]) * ky + dy;\n      while (j < n) output2[j] = input[j], ++j;\n      return output2;\n    };\n  }\n  function reverse$1(array2, n) {\n    var t, j = array2.length, i = j - n;\n    while (i < --j) t = array2[i], array2[i++] = array2[j], array2[j] = t;\n  }\n  function feature(topology, o) {\n    if (typeof o === \"string\") o = topology.objects[o];\n    return o.type === \"GeometryCollection\" ? { type: \"FeatureCollection\", features: o.geometries.map(function(o2) {\n      return feature$1(topology, o2);\n    }) } : feature$1(topology, o);\n  }\n  function feature$1(topology, o) {\n    var id2 = o.id, bbox = o.bbox, properties = o.properties == null ? {} : o.properties, geometry = object$1(topology, o);\n    return id2 == null && bbox == null ? { type: \"Feature\", properties, geometry } : bbox == null ? { type: \"Feature\", id: id2, properties, geometry } : { type: \"Feature\", id: id2, bbox, properties, geometry };\n  }\n  function object$1(topology, o) {\n    var transformPoint = transform$3(topology.transform), arcs = topology.arcs;\n    function arc2(i, points2) {\n      if (points2.length) points2.pop();\n      for (var a2 = arcs[i < 0 ? ~i : i], k = 0, n = a2.length; k < n; ++k) {\n        points2.push(transformPoint(a2[k], k));\n      }\n      if (i < 0) reverse$1(points2, n);\n    }\n    function point2(p) {\n      return transformPoint(p);\n    }\n    function line2(arcs2) {\n      var points2 = [];\n      for (var i = 0, n = arcs2.length; i < n; ++i) arc2(arcs2[i], points2);\n      if (points2.length < 2) points2.push(points2[0]);\n      return points2;\n    }\n    function ring(arcs2) {\n      var points2 = line2(arcs2);\n      while (points2.length < 4) points2.push(points2[0]);\n      return points2;\n    }\n    function polygon(arcs2) {\n      return arcs2.map(ring);\n    }\n    function geometry(o2) {\n      var type2 = o2.type, coordinates;\n      switch (type2) {\n        case \"GeometryCollection\":\n          return { type: type2, geometries: o2.geometries.map(geometry) };\n        case \"Point\":\n          coordinates = point2(o2.coordinates);\n          break;\n        case \"MultiPoint\":\n          coordinates = o2.coordinates.map(point2);\n          break;\n        case \"LineString\":\n          coordinates = line2(o2.arcs);\n          break;\n        case \"MultiLineString\":\n          coordinates = o2.arcs.map(line2);\n          break;\n        case \"Polygon\":\n          coordinates = polygon(o2.arcs);\n          break;\n        case \"MultiPolygon\":\n          coordinates = o2.arcs.map(polygon);\n          break;\n        default:\n          return null;\n      }\n      return { type: type2, coordinates };\n    }\n    return geometry(o);\n  }\n  function stitch(topology, arcs) {\n    var stitchedArcs = {}, fragmentByStart = {}, fragmentByEnd = {}, fragments = [], emptyIndex = -1;\n    arcs.forEach(function(i, j) {\n      var arc2 = topology.arcs[i < 0 ? ~i : i], t;\n      if (arc2.length < 3 && !arc2[1][0] && !arc2[1][1]) {\n        t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n      }\n    });\n    arcs.forEach(function(i) {\n      var e = ends(i), start = e[0], end = e[1], f, g;\n      if (f = fragmentByEnd[start]) {\n        delete fragmentByEnd[f.end];\n        f.push(i);\n        f.end = end;\n        if (g = fragmentByStart[end]) {\n          delete fragmentByStart[g.start];\n          var fg = g === f ? f : f.concat(g);\n          fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n        } else {\n          fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n        }\n      } else if (f = fragmentByStart[end]) {\n        delete fragmentByStart[f.start];\n        f.unshift(i);\n        f.start = start;\n        if (g = fragmentByEnd[start]) {\n          delete fragmentByEnd[g.end];\n          var gf = g === f ? f : g.concat(f);\n          fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n        } else {\n          fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n        }\n      } else {\n        f = [i];\n        fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n      }\n    });\n    function ends(i) {\n      var arc2 = topology.arcs[i < 0 ? ~i : i], p02 = arc2[0], p1;\n      if (topology.transform) p1 = [0, 0], arc2.forEach(function(dp) {\n        p1[0] += dp[0], p1[1] += dp[1];\n      });\n      else p1 = arc2[arc2.length - 1];\n      return i < 0 ? [p1, p02] : [p02, p1];\n    }\n    function flush2(fragmentByEnd2, fragmentByStart2) {\n      for (var k in fragmentByEnd2) {\n        var f = fragmentByEnd2[k];\n        delete fragmentByStart2[f.start];\n        delete f.start;\n        delete f.end;\n        f.forEach(function(i) {\n          stitchedArcs[i < 0 ? ~i : i] = 1;\n        });\n        fragments.push(f);\n      }\n    }\n    flush2(fragmentByEnd, fragmentByStart);\n    flush2(fragmentByStart, fragmentByEnd);\n    arcs.forEach(function(i) {\n      if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]);\n    });\n    return fragments;\n  }\n  function mesh(topology) {\n    return object$1(topology, meshArcs.apply(this, arguments));\n  }\n  function meshArcs(topology, object2, filter2) {\n    var arcs, i, n;\n    if (arguments.length > 1) arcs = extractArcs(topology, object2, filter2);\n    else for (i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i) arcs[i] = i;\n    return { type: \"MultiLineString\", arcs: stitch(topology, arcs) };\n  }\n  function extractArcs(topology, object2, filter2) {\n    var arcs = [], geomsByArc = [], geom;\n    function extract0(i) {\n      var j = i < 0 ? ~i : i;\n      (geomsByArc[j] || (geomsByArc[j] = [])).push({ i, g: geom });\n    }\n    function extract1(arcs2) {\n      arcs2.forEach(extract0);\n    }\n    function extract2(arcs2) {\n      arcs2.forEach(extract1);\n    }\n    function extract3(arcs2) {\n      arcs2.forEach(extract2);\n    }\n    function geometry(o) {\n      switch (geom = o, o.type) {\n        case \"GeometryCollection\":\n          o.geometries.forEach(geometry);\n          break;\n        case \"LineString\":\n          extract1(o.arcs);\n          break;\n        case \"MultiLineString\":\n        case \"Polygon\":\n          extract2(o.arcs);\n          break;\n        case \"MultiPolygon\":\n          extract3(o.arcs);\n          break;\n      }\n    }\n    geometry(object2);\n    geomsByArc.forEach(filter2 == null ? function(geoms) {\n      arcs.push(geoms[0].i);\n    } : function(geoms) {\n      if (filter2(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i);\n    });\n    return arcs;\n  }\n  function ascending$1(a2, b2) {\n    return a2 == null || b2 == null ? NaN : a2 < b2 ? -1 : a2 > b2 ? 1 : a2 >= b2 ? 0 : NaN;\n  }\n  function descending$1(a2, b2) {\n    return a2 == null || b2 == null ? NaN : b2 < a2 ? -1 : b2 > a2 ? 1 : b2 >= a2 ? 0 : NaN;\n  }\n  function bisector(f) {\n    let compare12, compare2, delta;\n    if (f.length !== 2) {\n      compare12 = ascending$1;\n      compare2 = (d, x2) => ascending$1(f(d), x2);\n      delta = (d, x2) => f(d) - x2;\n    } else {\n      compare12 = f === ascending$1 || f === descending$1 ? f : zero$2;\n      compare2 = f;\n      delta = f;\n    }\n    function left(a2, x2, lo = 0, hi = a2.length) {\n      if (lo < hi) {\n        if (compare12(x2, x2) !== 0) return hi;\n        do {\n          const mid = lo + hi >>> 1;\n          if (compare2(a2[mid], x2) < 0) lo = mid + 1;\n          else hi = mid;\n        } while (lo < hi);\n      }\n      return lo;\n    }\n    function right(a2, x2, lo = 0, hi = a2.length) {\n      if (lo < hi) {\n        if (compare12(x2, x2) !== 0) return hi;\n        do {\n          const mid = lo + hi >>> 1;\n          if (compare2(a2[mid], x2) <= 0) lo = mid + 1;\n          else hi = mid;\n        } while (lo < hi);\n      }\n      return lo;\n    }\n    function center(a2, x2, lo = 0, hi = a2.length) {\n      const i = left(a2, x2, lo, hi - 1);\n      return i > lo && delta(a2[i - 1], x2) > -delta(a2[i], x2) ? i - 1 : i;\n    }\n    return { left, center, right };\n  }\n  function zero$2() {\n    return 0;\n  }\n  function number$6(x2) {\n    return x2 === null ? NaN : +x2;\n  }\n  function* numbers$2(values2, valueof) {\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    }\n  }\n  const ascendingBisect = bisector(ascending$1);\n  const bisectRight$1 = ascendingBisect.right;\n  const bisectLeft$1 = ascendingBisect.left;\n  bisector(number$6).center;\n  function variance(values2, valueof) {\n    let count2 = 0;\n    let delta;\n    let mean2 = 0;\n    let sum2 = 0;\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          delta = value2 - mean2;\n          mean2 += delta / ++count2;\n          sum2 += delta * (value2 - mean2);\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          delta = value2 - mean2;\n          mean2 += delta / ++count2;\n          sum2 += delta * (value2 - mean2);\n        }\n      }\n    }\n    if (count2 > 1) return sum2 / (count2 - 1);\n  }\n  function deviation(values2, valueof) {\n    const v = variance(values2, valueof);\n    return v ? Math.sqrt(v) : v;\n  }\n  class Adder {\n    constructor() {\n      this._partials = new Float64Array(32);\n      this._n = 0;\n    }\n    add(x2) {\n      const p = this._partials;\n      let i = 0;\n      for (let j = 0; j < this._n && j < 32; j++) {\n        const y2 = p[j], hi = x2 + y2, lo = Math.abs(x2) < Math.abs(y2) ? x2 - (hi - y2) : y2 - (hi - x2);\n        if (lo) p[i++] = lo;\n        x2 = hi;\n      }\n      p[i] = x2;\n      this._n = i + 1;\n      return this;\n    }\n    valueOf() {\n      const p = this._partials;\n      let n = this._n, x2, y2, lo, hi = 0;\n      if (n > 0) {\n        hi = p[--n];\n        while (n > 0) {\n          x2 = hi;\n          y2 = p[--n];\n          hi = x2 + y2;\n          lo = y2 - (hi - x2);\n          if (lo) break;\n        }\n        if (n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0)) {\n          y2 = lo * 2;\n          x2 = hi + y2;\n          if (y2 == x2 - hi) hi = x2;\n        }\n      }\n      return hi;\n    }\n  }\n  class InternMap extends Map {\n    constructor(entries, key2 = keyof) {\n      super();\n      Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key2 } });\n      if (entries != null) for (const [key3, value2] of entries) this.set(key3, value2);\n    }\n    get(key2) {\n      return super.get(intern_get(this, key2));\n    }\n    has(key2) {\n      return super.has(intern_get(this, key2));\n    }\n    set(key2, value2) {\n      return super.set(intern_set(this, key2), value2);\n    }\n    delete(key2) {\n      return super.delete(intern_delete(this, key2));\n    }\n  }\n  class InternSet extends Set {\n    constructor(values2, key2 = keyof) {\n      super();\n      Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key2 } });\n      if (values2 != null) for (const value2 of values2) this.add(value2);\n    }\n    has(value2) {\n      return super.has(intern_get(this, value2));\n    }\n    add(value2) {\n      return super.add(intern_set(this, value2));\n    }\n    delete(value2) {\n      return super.delete(intern_delete(this, value2));\n    }\n  }\n  function intern_get({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    return _intern.has(key2) ? _intern.get(key2) : value2;\n  }\n  function intern_set({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    if (_intern.has(key2)) return _intern.get(key2);\n    _intern.set(key2, value2);\n    return value2;\n  }\n  function intern_delete({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    if (_intern.has(key2)) {\n      value2 = _intern.get(key2);\n      _intern.delete(key2);\n    }\n    return value2;\n  }\n  function keyof(value2) {\n    return value2 !== null && typeof value2 === \"object\" ? value2.valueOf() : value2;\n  }\n  function permute(source2, keys2) {\n    return Array.from(keys2, (key2) => source2[key2]);\n  }\n  function compareDefined(compare2 = ascending$1) {\n    if (compare2 === ascending$1) return ascendingDefined;\n    if (typeof compare2 !== \"function\") throw new TypeError(\"compare is not a function\");\n    return (a2, b2) => {\n      const x2 = compare2(a2, b2);\n      if (x2 || x2 === 0) return x2;\n      return (compare2(b2, b2) === 0) - (compare2(a2, a2) === 0);\n    };\n  }\n  function ascendingDefined(a2, b2) {\n    return (a2 == null || !(a2 >= a2)) - (b2 == null || !(b2 >= b2)) || (a2 < b2 ? -1 : a2 > b2 ? 1 : 0);\n  }\n  const e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);\n  function tickSpec(start, stop2, count2) {\n    const step = (stop2 - start) / Math.max(0, count2), power = Math.floor(Math.log10(step)), error2 = step / Math.pow(10, power), factor = error2 >= e10 ? 10 : error2 >= e5 ? 5 : error2 >= e2 ? 2 : 1;\n    let i1, i2, inc;\n    if (power < 0) {\n      inc = Math.pow(10, -power) / factor;\n      i1 = Math.round(start * inc);\n      i2 = Math.round(stop2 * inc);\n      if (i1 / inc < start) ++i1;\n      if (i2 / inc > stop2) --i2;\n      inc = -inc;\n    } else {\n      inc = Math.pow(10, power) * factor;\n      i1 = Math.round(start / inc);\n      i2 = Math.round(stop2 / inc);\n      if (i1 * inc < start) ++i1;\n      if (i2 * inc > stop2) --i2;\n    }\n    if (i2 < i1 && 0.5 <= count2 && count2 < 2) return tickSpec(start, stop2, count2 * 2);\n    return [i1, i2, inc];\n  }\n  function ticks(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    if (!(count2 > 0)) return [];\n    if (start === stop2) return [start];\n    const reverse2 = stop2 < start, [i1, i2, inc] = reverse2 ? tickSpec(stop2, start, count2) : tickSpec(start, stop2, count2);\n    if (!(i2 >= i1)) return [];\n    const n = i2 - i1 + 1, ticks2 = new Array(n);\n    if (reverse2) {\n      if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) / -inc;\n      else for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) * inc;\n    } else {\n      if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) / -inc;\n      else for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) * inc;\n    }\n    return ticks2;\n  }\n  function tickIncrement(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    return tickSpec(start, stop2, count2)[2];\n  }\n  function tickStep(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    const reverse2 = stop2 < start, inc = reverse2 ? tickIncrement(stop2, start, count2) : tickIncrement(start, stop2, count2);\n    return (reverse2 ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n  }\n  function max$3(values2, valueof) {\n    let max2;\n    if (valueof === void 0) {\n      for (const value2 of values2) {\n        if (value2 != null && (max2 < value2 || max2 === void 0 && value2 >= value2)) {\n          max2 = value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (max2 < value2 || max2 === void 0 && value2 >= value2)) {\n          max2 = value2;\n        }\n      }\n    }\n    return max2;\n  }\n  function min$3(values2, valueof) {\n    let min2;\n    if (valueof === void 0) {\n      for (const value2 of values2) {\n        if (value2 != null && (min2 > value2 || min2 === void 0 && value2 >= value2)) {\n          min2 = value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (min2 > value2 || min2 === void 0 && value2 >= value2)) {\n          min2 = value2;\n        }\n      }\n    }\n    return min2;\n  }\n  function quickselect(array2, k, left = 0, right = Infinity, compare2) {\n    k = Math.floor(k);\n    left = Math.floor(Math.max(0, left));\n    right = Math.floor(Math.min(array2.length - 1, right));\n    if (!(left <= k && k <= right)) return array2;\n    compare2 = compare2 === void 0 ? ascendingDefined : compareDefined(compare2);\n    while (right > left) {\n      if (right - left > 600) {\n        const n = right - left + 1;\n        const m2 = k - left + 1;\n        const z = Math.log(n);\n        const s = 0.5 * Math.exp(2 * z / 3);\n        const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m2 - n / 2 < 0 ? -1 : 1);\n        const newLeft = Math.max(left, Math.floor(k - m2 * s / n + sd));\n        const newRight = Math.min(right, Math.floor(k + (n - m2) * s / n + sd));\n        quickselect(array2, k, newLeft, newRight, compare2);\n      }\n      const t = array2[k];\n      let i = left;\n      let j = right;\n      swap$1(array2, left, k);\n      if (compare2(array2[right], t) > 0) swap$1(array2, left, right);\n      while (i < j) {\n        swap$1(array2, i, j), ++i, --j;\n        while (compare2(array2[i], t) < 0) ++i;\n        while (compare2(array2[j], t) > 0) --j;\n      }\n      if (compare2(array2[left], t) === 0) swap$1(array2, left, j);\n      else ++j, swap$1(array2, j, right);\n      if (j <= k) left = j + 1;\n      if (k <= j) right = j - 1;\n    }\n    return array2;\n  }\n  function swap$1(array2, i, j) {\n    const t = array2[i];\n    array2[i] = array2[j];\n    array2[j] = t;\n  }\n  function quantile$1(values2, p, valueof) {\n    values2 = Float64Array.from(numbers$2(values2, valueof));\n    if (!(n = values2.length) || isNaN(p = +p)) return;\n    if (p <= 0 || n < 2) return min$3(values2);\n    if (p >= 1) return max$3(values2);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = max$3(quickselect(values2, i0).subarray(0, i0 + 1)), value1 = min$3(values2.subarray(i0 + 1));\n    return value0 + (value1 - value0) * (i - i0);\n  }\n  function quantileSorted(values2, p, valueof = number$6) {\n    if (!(n = values2.length) || isNaN(p = +p)) return;\n    if (p <= 0 || n < 2) return +valueof(values2[0], 0, values2);\n    if (p >= 1) return +valueof(values2[n - 1], n - 1, values2);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values2[i0], i0, values2), value1 = +valueof(values2[i0 + 1], i0 + 1, values2);\n    return value0 + (value1 - value0) * (i - i0);\n  }\n  function mean(values2, valueof) {\n    let count2 = 0;\n    let sum2 = 0;\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          ++count2, sum2 += value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          ++count2, sum2 += value2;\n        }\n      }\n    }\n    if (count2) return sum2 / count2;\n  }\n  function median(values2, valueof) {\n    return quantile$1(values2, 0.5, valueof);\n  }\n  function* flatten$1(arrays) {\n    for (const array2 of arrays) {\n      yield* array2;\n    }\n  }\n  function merge$2(arrays) {\n    return Array.from(flatten$1(arrays));\n  }\n  function range$3(start, stop2, step) {\n    start = +start, stop2 = +stop2, step = (n = arguments.length) < 2 ? (stop2 = start, start = 0, 1) : n < 3 ? 1 : +step;\n    var i = -1, n = Math.max(0, Math.ceil((stop2 - start) / step)) | 0, range2 = new Array(n);\n    while (++i < n) {\n      range2[i] = start + i * step;\n    }\n    return range2;\n  }\n  function sum$1(values2, valueof) {\n    let sum2 = 0;\n    {\n      for (let value2 of values2) {\n        if (value2 = +value2) {\n          sum2 += value2;\n        }\n      }\n    }\n    return sum2;\n  }\n  function intersection(values2, ...others) {\n    values2 = new InternSet(values2);\n    others = others.map(set$8);\n    out: for (const value2 of values2) {\n      for (const other of others) {\n        if (!other.has(value2)) {\n          values2.delete(value2);\n          continue out;\n        }\n      }\n    }\n    return values2;\n  }\n  function set$8(values2) {\n    return values2 instanceof InternSet ? values2 : new InternSet(values2);\n  }\n  function union(...others) {\n    const set2 = new InternSet();\n    for (const other of others) {\n      for (const o of other) {\n        set2.add(o);\n      }\n    }\n    return set2;\n  }\n  function formatDecimal(x2) {\n    return Math.abs(x2 = Math.round(x2)) >= 1e21 ? x2.toLocaleString(\"en\").replace(/,/g, \"\") : x2.toString(10);\n  }\n  function formatDecimalParts(x2, p) {\n    if ((i = (x2 = p ? x2.toExponential(p - 1) : x2.toExponential()).indexOf(\"e\")) < 0) return null;\n    var i, coefficient = x2.slice(0, i);\n    return [\n      coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n      +x2.slice(i + 1)\n    ];\n  }\n  function exponent(x2) {\n    return x2 = formatDecimalParts(Math.abs(x2)), x2 ? x2[1] : NaN;\n  }\n  function formatGroup(grouping, thousands) {\n    return function(value2, width2) {\n      var i = value2.length, t = [], j = 0, g = grouping[0], length2 = 0;\n      while (i > 0 && g > 0) {\n        if (length2 + g + 1 > width2) g = Math.max(1, width2 - length2);\n        t.push(value2.substring(i -= g, i + g));\n        if ((length2 += g + 1) > width2) break;\n        g = grouping[j = (j + 1) % grouping.length];\n      }\n      return t.reverse().join(thousands);\n    };\n  }\n  function formatNumerals(numerals) {\n    return function(value2) {\n      return value2.replace(/[0-9]/g, function(i) {\n        return numerals[+i];\n      });\n    };\n  }\n  var re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n  function formatSpecifier(specifier) {\n    if (!(match2 = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match2;\n    return new FormatSpecifier({\n      fill: match2[1],\n      align: match2[2],\n      sign: match2[3],\n      symbol: match2[4],\n      zero: match2[5],\n      width: match2[6],\n      comma: match2[7],\n      precision: match2[8] && match2[8].slice(1),\n      trim: match2[9],\n      type: match2[10]\n    });\n  }\n  formatSpecifier.prototype = FormatSpecifier.prototype;\n  function FormatSpecifier(specifier) {\n    this.fill = specifier.fill === void 0 ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === void 0 ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === void 0 ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === void 0 ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === void 0 ? void 0 : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === void 0 ? \"\" : specifier.type + \"\";\n  }\n  FormatSpecifier.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === void 0 ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === void 0 ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n  };\n  function formatTrim(s) {\n    out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n      switch (s[i]) {\n        case \".\":\n          i0 = i1 = i;\n          break;\n        case \"0\":\n          if (i0 === 0) i0 = i;\n          i1 = i;\n          break;\n        default:\n          if (!+s[i]) break out;\n          if (i0 > 0) i0 = 0;\n          break;\n      }\n    }\n    return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n  }\n  var prefixExponent;\n  function formatPrefixAuto(x2, p) {\n    var d = formatDecimalParts(x2, p);\n    if (!d) return x2 + \"\";\n    var coefficient = d[0], exponent2 = d[1], i = exponent2 - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent2 / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x2, Math.max(0, p + i - 1))[0];\n  }\n  function formatRounded(x2, p) {\n    var d = formatDecimalParts(x2, p);\n    if (!d) return x2 + \"\";\n    var coefficient = d[0], exponent2 = d[1];\n    return exponent2 < 0 ? \"0.\" + new Array(-exponent2).join(\"0\") + coefficient : coefficient.length > exponent2 + 1 ? coefficient.slice(0, exponent2 + 1) + \".\" + coefficient.slice(exponent2 + 1) : coefficient + new Array(exponent2 - coefficient.length + 2).join(\"0\");\n  }\n  const formatTypes = {\n    \"%\": (x2, p) => (x2 * 100).toFixed(p),\n    \"b\": (x2) => Math.round(x2).toString(2),\n    \"c\": (x2) => x2 + \"\",\n    \"d\": formatDecimal,\n    \"e\": (x2, p) => x2.toExponential(p),\n    \"f\": (x2, p) => x2.toFixed(p),\n    \"g\": (x2, p) => x2.toPrecision(p),\n    \"o\": (x2) => Math.round(x2).toString(8),\n    \"p\": (x2, p) => formatRounded(x2 * 100, p),\n    \"r\": formatRounded,\n    \"s\": formatPrefixAuto,\n    \"X\": (x2) => Math.round(x2).toString(16).toUpperCase(),\n    \"x\": (x2) => Math.round(x2).toString(16)\n  };\n  function identity$5(x2) {\n    return x2;\n  }\n  var map$2 = Array.prototype.map, prefixes = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n  function formatLocale$1(locale2) {\n    var group2 = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity$5 : formatGroup(map$2.call(locale2.grouping, Number), locale2.thousands + \"\"), currencyPrefix = locale2.currency === void 0 ? \"\" : locale2.currency[0] + \"\", currencySuffix = locale2.currency === void 0 ? \"\" : locale2.currency[1] + \"\", decimal = locale2.decimal === void 0 ? \".\" : locale2.decimal + \"\", numerals = locale2.numerals === void 0 ? identity$5 : formatNumerals(map$2.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? \"%\" : locale2.percent + \"\", minus = locale2.minus === void 0 ? \"−\" : locale2.minus + \"\", nan = locale2.nan === void 0 ? \"NaN\" : locale2.nan + \"\";\n    function newFormat(specifier) {\n      specifier = formatSpecifier(specifier);\n      var fill2 = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol2 = specifier.symbol, zero2 = specifier.zero, width2 = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type;\n      if (type2 === \"n\") comma = true, type2 = \"g\";\n      else if (!formatTypes[type2]) precision === void 0 && (precision = 12), trim = true, type2 = \"g\";\n      if (zero2 || fill2 === \"0\" && align === \"=\") zero2 = true, fill2 = \"0\", align = \"=\";\n      var prefix = symbol2 === \"$\" ? currencyPrefix : symbol2 === \"#\" && /[boxX]/.test(type2) ? \"0\" + type2.toLowerCase() : \"\", suffix = symbol2 === \"$\" ? currencySuffix : /[%p]/.test(type2) ? percent : \"\";\n      var formatType = formatTypes[type2], maybeSuffix = /[defgprs%]/.test(type2);\n      precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n      function format2(value2) {\n        var valuePrefix = prefix, valueSuffix = suffix, i, n, c2;\n        if (type2 === \"c\") {\n          valueSuffix = formatType(value2) + valueSuffix;\n          value2 = \"\";\n        } else {\n          value2 = +value2;\n          var valueNegative = value2 < 0 || 1 / value2 < 0;\n          value2 = isNaN(value2) ? nan : formatType(Math.abs(value2), precision);\n          if (trim) value2 = formatTrim(value2);\n          if (valueNegative && +value2 === 0 && sign2 !== \"+\") valueNegative = false;\n          valuePrefix = (valueNegative ? sign2 === \"(\" ? sign2 : minus : sign2 === \"-\" || sign2 === \"(\" ? \"\" : sign2) + valuePrefix;\n          valueSuffix = (type2 === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign2 === \"(\" ? \")\" : \"\");\n          if (maybeSuffix) {\n            i = -1, n = value2.length;\n            while (++i < n) {\n              if (c2 = value2.charCodeAt(i), 48 > c2 || c2 > 57) {\n                valueSuffix = (c2 === 46 ? decimal + value2.slice(i + 1) : value2.slice(i)) + valueSuffix;\n                value2 = value2.slice(0, i);\n                break;\n              }\n            }\n          }\n        }\n        if (comma && !zero2) value2 = group2(value2, Infinity);\n        var length2 = valuePrefix.length + value2.length + valueSuffix.length, padding2 = length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) : \"\";\n        if (comma && zero2) value2 = group2(padding2 + value2, padding2.length ? width2 - valueSuffix.length : Infinity), padding2 = \"\";\n        switch (align) {\n          case \"<\":\n            value2 = valuePrefix + value2 + valueSuffix + padding2;\n            break;\n          case \"=\":\n            value2 = valuePrefix + padding2 + value2 + valueSuffix;\n            break;\n          case \"^\":\n            value2 = padding2.slice(0, length2 = padding2.length >> 1) + valuePrefix + value2 + valueSuffix + padding2.slice(length2);\n            break;\n          default:\n            value2 = padding2 + valuePrefix + value2 + valueSuffix;\n            break;\n        }\n        return numerals(value2);\n      }\n      format2.toString = function() {\n        return specifier + \"\";\n      };\n      return format2;\n    }\n    function formatPrefix2(specifier, value2) {\n      var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent(value2) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];\n      return function(value3) {\n        return f(k * value3) + prefix;\n      };\n    }\n    return {\n      format: newFormat,\n      formatPrefix: formatPrefix2\n    };\n  }\n  var locale$2;\n  var format$3;\n  var formatPrefix;\n  defaultLocale$2({\n    thousands: \",\",\n    grouping: [3],\n    currency: [\"$\", \"\"]\n  });\n  function defaultLocale$2(definition2) {\n    locale$2 = formatLocale$1(definition2);\n    format$3 = locale$2.format;\n    formatPrefix = locale$2.formatPrefix;\n    return locale$2;\n  }\n  function precisionFixed(step) {\n    return Math.max(0, -exponent(Math.abs(step)));\n  }\n  function precisionPrefix(step, value2) {\n    return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value2) / 3))) * 3 - exponent(Math.abs(step)));\n  }\n  function precisionRound(step, max2) {\n    step = Math.abs(step), max2 = Math.abs(max2) - step;\n    return Math.max(0, exponent(max2) - exponent(step)) + 1;\n  }\n  const t0$2 = /* @__PURE__ */ new Date(), t1$1 = /* @__PURE__ */ new Date();\n  function timeInterval$1(floori, offseti, count2, field2) {\n    function interval2(date2) {\n      return floori(date2 = arguments.length === 0 ? /* @__PURE__ */ new Date() : /* @__PURE__ */ new Date(+date2)), date2;\n    }\n    interval2.floor = (date2) => {\n      return floori(date2 = /* @__PURE__ */ new Date(+date2)), date2;\n    };\n    interval2.ceil = (date2) => {\n      return floori(date2 = new Date(date2 - 1)), offseti(date2, 1), floori(date2), date2;\n    };\n    interval2.round = (date2) => {\n      const d0 = interval2(date2), d1 = interval2.ceil(date2);\n      return date2 - d0 < d1 - date2 ? d0 : d1;\n    };\n    interval2.offset = (date2, step) => {\n      return offseti(date2 = /* @__PURE__ */ new Date(+date2), step == null ? 1 : Math.floor(step)), date2;\n    };\n    interval2.range = (start, stop2, step) => {\n      const range2 = [];\n      start = interval2.ceil(start);\n      step = step == null ? 1 : Math.floor(step);\n      if (!(start < stop2) || !(step > 0)) return range2;\n      let previous;\n      do\n        range2.push(previous = /* @__PURE__ */ new Date(+start)), offseti(start, step), floori(start);\n      while (previous < start && start < stop2);\n      return range2;\n    };\n    interval2.filter = (test2) => {\n      return timeInterval$1((date2) => {\n        if (date2 >= date2) while (floori(date2), !test2(date2)) date2.setTime(date2 - 1);\n      }, (date2, step) => {\n        if (date2 >= date2) {\n          if (step < 0) while (++step <= 0) {\n            while (offseti(date2, -1), !test2(date2)) {\n            }\n          }\n          else while (--step >= 0) {\n            while (offseti(date2, 1), !test2(date2)) {\n            }\n          }\n        }\n      });\n    };\n    if (count2) {\n      interval2.count = (start, end) => {\n        t0$2.setTime(+start), t1$1.setTime(+end);\n        floori(t0$2), floori(t1$1);\n        return Math.floor(count2(t0$2, t1$1));\n      };\n      interval2.every = (step) => {\n        step = Math.floor(step);\n        return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval2 : interval2.filter(field2 ? (d) => field2(d) % step === 0 : (d) => interval2.count(0, d) % step === 0);\n      };\n    }\n    return interval2;\n  }\n  const millisecond = timeInterval$1(() => {\n  }, (date2, step) => {\n    date2.setTime(+date2 + step);\n  }, (start, end) => {\n    return end - start;\n  });\n  millisecond.every = (k) => {\n    k = Math.floor(k);\n    if (!isFinite(k) || !(k > 0)) return null;\n    if (!(k > 1)) return millisecond;\n    return timeInterval$1((date2) => {\n      date2.setTime(Math.floor(date2 / k) * k);\n    }, (date2, step) => {\n      date2.setTime(+date2 + step * k);\n    }, (start, end) => {\n      return (end - start) / k;\n    });\n  };\n  millisecond.range;\n  const durationSecond$1 = 1e3;\n  const durationMinute$1 = durationSecond$1 * 60;\n  const durationHour$1 = durationMinute$1 * 60;\n  const durationDay$1 = durationHour$1 * 24;\n  const durationWeek$1 = durationDay$1 * 7;\n  const durationMonth$1 = durationDay$1 * 30;\n  const durationYear$1 = durationDay$1 * 365;\n  const second = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds());\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationSecond$1);\n  }, (start, end) => {\n    return (end - start) / durationSecond$1;\n  }, (date2) => {\n    return date2.getUTCSeconds();\n  });\n  second.range;\n  const timeMinute = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond$1);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationMinute$1);\n  }, (start, end) => {\n    return (end - start) / durationMinute$1;\n  }, (date2) => {\n    return date2.getMinutes();\n  });\n  timeMinute.range;\n  const utcMinute = timeInterval$1((date2) => {\n    date2.setUTCSeconds(0, 0);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationMinute$1);\n  }, (start, end) => {\n    return (end - start) / durationMinute$1;\n  }, (date2) => {\n    return date2.getUTCMinutes();\n  });\n  utcMinute.range;\n  const timeHour = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond$1 - date2.getMinutes() * durationMinute$1);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationHour$1);\n  }, (start, end) => {\n    return (end - start) / durationHour$1;\n  }, (date2) => {\n    return date2.getHours();\n  });\n  timeHour.range;\n  const utcHour = timeInterval$1((date2) => {\n    date2.setUTCMinutes(0, 0, 0);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationHour$1);\n  }, (start, end) => {\n    return (end - start) / durationHour$1;\n  }, (date2) => {\n    return date2.getUTCHours();\n  });\n  utcHour.range;\n  const timeDay = timeInterval$1(\n    (date2) => date2.setHours(0, 0, 0, 0),\n    (date2, step) => date2.setDate(date2.getDate() + step),\n    (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1,\n    (date2) => date2.getDate() - 1\n  );\n  timeDay.range;\n  const utcDay = timeInterval$1((date2) => {\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCDate(date2.getUTCDate() + step);\n  }, (start, end) => {\n    return (end - start) / durationDay$1;\n  }, (date2) => {\n    return date2.getUTCDate() - 1;\n  });\n  utcDay.range;\n  const unixDay = timeInterval$1((date2) => {\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCDate(date2.getUTCDate() + step);\n  }, (start, end) => {\n    return (end - start) / durationDay$1;\n  }, (date2) => {\n    return Math.floor(date2 / durationDay$1);\n  });\n  unixDay.range;\n  function timeWeekday(i) {\n    return timeInterval$1((date2) => {\n      date2.setDate(date2.getDate() - (date2.getDay() + 7 - i) % 7);\n      date2.setHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setDate(date2.getDate() + step * 7);\n    }, (start, end) => {\n      return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1;\n    });\n  }\n  const timeSunday = timeWeekday(0);\n  const timeMonday = timeWeekday(1);\n  const timeTuesday = timeWeekday(2);\n  const timeWednesday = timeWeekday(3);\n  const timeThursday = timeWeekday(4);\n  const timeFriday = timeWeekday(5);\n  const timeSaturday = timeWeekday(6);\n  timeSunday.range;\n  timeMonday.range;\n  timeTuesday.range;\n  timeWednesday.range;\n  timeThursday.range;\n  timeFriday.range;\n  timeSaturday.range;\n  function utcWeekday(i) {\n    return timeInterval$1((date2) => {\n      date2.setUTCDate(date2.getUTCDate() - (date2.getUTCDay() + 7 - i) % 7);\n      date2.setUTCHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setUTCDate(date2.getUTCDate() + step * 7);\n    }, (start, end) => {\n      return (end - start) / durationWeek$1;\n    });\n  }\n  const utcSunday = utcWeekday(0);\n  const utcMonday = utcWeekday(1);\n  const utcTuesday = utcWeekday(2);\n  const utcWednesday = utcWeekday(3);\n  const utcThursday = utcWeekday(4);\n  const utcFriday = utcWeekday(5);\n  const utcSaturday = utcWeekday(6);\n  utcSunday.range;\n  utcMonday.range;\n  utcTuesday.range;\n  utcWednesday.range;\n  utcThursday.range;\n  utcFriday.range;\n  utcSaturday.range;\n  const timeMonth = timeInterval$1((date2) => {\n    date2.setDate(1);\n    date2.setHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setMonth(date2.getMonth() + step);\n  }, (start, end) => {\n    return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n  }, (date2) => {\n    return date2.getMonth();\n  });\n  timeMonth.range;\n  const utcMonth = timeInterval$1((date2) => {\n    date2.setUTCDate(1);\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCMonth(date2.getUTCMonth() + step);\n  }, (start, end) => {\n    return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n  }, (date2) => {\n    return date2.getUTCMonth();\n  });\n  utcMonth.range;\n  const timeYear = timeInterval$1((date2) => {\n    date2.setMonth(0, 1);\n    date2.setHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setFullYear(date2.getFullYear() + step);\n  }, (start, end) => {\n    return end.getFullYear() - start.getFullYear();\n  }, (date2) => {\n    return date2.getFullYear();\n  });\n  timeYear.every = (k) => {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval$1((date2) => {\n      date2.setFullYear(Math.floor(date2.getFullYear() / k) * k);\n      date2.setMonth(0, 1);\n      date2.setHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setFullYear(date2.getFullYear() + step * k);\n    });\n  };\n  timeYear.range;\n  const utcYear = timeInterval$1((date2) => {\n    date2.setUTCMonth(0, 1);\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCFullYear(date2.getUTCFullYear() + step);\n  }, (start, end) => {\n    return end.getUTCFullYear() - start.getUTCFullYear();\n  }, (date2) => {\n    return date2.getUTCFullYear();\n  });\n  utcYear.every = (k) => {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval$1((date2) => {\n      date2.setUTCFullYear(Math.floor(date2.getUTCFullYear() / k) * k);\n      date2.setUTCMonth(0, 1);\n      date2.setUTCHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setUTCFullYear(date2.getUTCFullYear() + step * k);\n    });\n  };\n  utcYear.range;\n  function ticker(year, month, week2, day, hour, minute) {\n    const tickIntervals = [\n      [second, 1, durationSecond$1],\n      [second, 5, 5 * durationSecond$1],\n      [second, 15, 15 * durationSecond$1],\n      [second, 30, 30 * durationSecond$1],\n      [minute, 1, durationMinute$1],\n      [minute, 5, 5 * durationMinute$1],\n      [minute, 15, 15 * durationMinute$1],\n      [minute, 30, 30 * durationMinute$1],\n      [hour, 1, durationHour$1],\n      [hour, 3, 3 * durationHour$1],\n      [hour, 6, 6 * durationHour$1],\n      [hour, 12, 12 * durationHour$1],\n      [day, 1, durationDay$1],\n      [day, 2, 2 * durationDay$1],\n      [week2, 1, durationWeek$1],\n      [month, 1, durationMonth$1],\n      [month, 3, 3 * durationMonth$1],\n      [year, 1, durationYear$1]\n    ];\n    function ticks2(start, stop2, count2) {\n      const reverse2 = stop2 < start;\n      if (reverse2) [start, stop2] = [stop2, start];\n      const interval2 = count2 && typeof count2.range === \"function\" ? count2 : tickInterval(start, stop2, count2);\n      const ticks3 = interval2 ? interval2.range(start, +stop2 + 1) : [];\n      return reverse2 ? ticks3.reverse() : ticks3;\n    }\n    function tickInterval(start, stop2, count2) {\n      const target2 = Math.abs(stop2 - start) / count2;\n      const i = bisector(([, , step2]) => step2).right(tickIntervals, target2);\n      if (i === tickIntervals.length) return year.every(tickStep(start / durationYear$1, stop2 / durationYear$1, count2));\n      if (i === 0) return millisecond.every(Math.max(tickStep(start, stop2, count2), 1));\n      const [t, step] = tickIntervals[target2 / tickIntervals[i - 1][2] < tickIntervals[i][2] / target2 ? i - 1 : i];\n      return t.every(step);\n    }\n    return [ticks2, tickInterval];\n  }\n  const [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\n  const [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n  const YEAR = \"year\";\n  const QUARTER = \"quarter\";\n  const MONTH = \"month\";\n  const WEEK = \"week\";\n  const DATE = \"date\";\n  const DAY = \"day\";\n  const DAYOFYEAR = \"dayofyear\";\n  const HOURS = \"hours\";\n  const MINUTES = \"minutes\";\n  const SECONDS = \"seconds\";\n  const MILLISECONDS = \"milliseconds\";\n  const TIME_UNITS = [YEAR, QUARTER, MONTH, WEEK, DATE, DAY, DAYOFYEAR, HOURS, MINUTES, SECONDS, MILLISECONDS];\n  const UNITS = TIME_UNITS.reduce((o, u2, i) => (o[u2] = 1 + i, o), {});\n  function timeUnits(units) {\n    const u2 = array$5(units).slice(), m2 = {};\n    if (!u2.length) error(\"Missing time unit.\");\n    u2.forEach((unit2) => {\n      if (has$1(UNITS, unit2)) {\n        m2[unit2] = 1;\n      } else {\n        error(`Invalid time unit: ${unit2}.`);\n      }\n    });\n    const numTypes = (m2[WEEK] || m2[DAY] ? 1 : 0) + (m2[QUARTER] || m2[MONTH] || m2[DATE] ? 1 : 0) + (m2[DAYOFYEAR] ? 1 : 0);\n    if (numTypes > 1) {\n      error(`Incompatible time units: ${units}`);\n    }\n    u2.sort((a2, b2) => UNITS[a2] - UNITS[b2]);\n    return u2;\n  }\n  const defaultSpecifiers = {\n    [YEAR]: \"%Y \",\n    [QUARTER]: \"Q%q \",\n    [MONTH]: \"%b \",\n    [DATE]: \"%d \",\n    [WEEK]: \"W%U \",\n    [DAY]: \"%a \",\n    [DAYOFYEAR]: \"%j \",\n    [HOURS]: \"%H:00\",\n    [MINUTES]: \"00:%M\",\n    [SECONDS]: \":%S\",\n    [MILLISECONDS]: \".%L\",\n    [`${YEAR}-${MONTH}`]: \"%Y-%m \",\n    [`${YEAR}-${MONTH}-${DATE}`]: \"%Y-%m-%d \",\n    [`${HOURS}-${MINUTES}`]: \"%H:%M\"\n  };\n  function timeUnitSpecifier(units, specifiers) {\n    const s = extend$1({}, defaultSpecifiers, specifiers), u2 = timeUnits(units), n = u2.length;\n    let fmt = \"\", start = 0, end, key2;\n    for (start = 0; start < n; ) {\n      for (end = u2.length; end > start; --end) {\n        key2 = u2.slice(start, end).join(\"-\");\n        if (s[key2] != null) {\n          fmt += s[key2];\n          start = end;\n          break;\n        }\n      }\n    }\n    return fmt.trim();\n  }\n  const t0$1 = /* @__PURE__ */ new Date();\n  function localYear(y2) {\n    t0$1.setFullYear(y2);\n    t0$1.setMonth(0);\n    t0$1.setDate(1);\n    t0$1.setHours(0, 0, 0, 0);\n    return t0$1;\n  }\n  function dayofyear(d) {\n    return localDayOfYear(new Date(d));\n  }\n  function week(d) {\n    return localWeekNum(new Date(d));\n  }\n  function localDayOfYear(d) {\n    return timeDay.count(localYear(d.getFullYear()) - 1, d);\n  }\n  function localWeekNum(d) {\n    return timeSunday.count(localYear(d.getFullYear()) - 1, d);\n  }\n  function localFirst(y2) {\n    return localYear(y2).getDay();\n  }\n  function localDate$1(y2, m2, d, H, M2, S, L) {\n    if (0 <= y2 && y2 < 100) {\n      const date2 = new Date(-1, m2, d, H, M2, S, L);\n      date2.setFullYear(y2);\n      return date2;\n    }\n    return new Date(y2, m2, d, H, M2, S, L);\n  }\n  function utcdayofyear(d) {\n    return utcDayOfYear(new Date(d));\n  }\n  function utcweek(d) {\n    return utcWeekNum(new Date(d));\n  }\n  function utcDayOfYear(d) {\n    const y2 = Date.UTC(d.getUTCFullYear(), 0, 1);\n    return utcDay.count(y2 - 1, d);\n  }\n  function utcWeekNum(d) {\n    const y2 = Date.UTC(d.getUTCFullYear(), 0, 1);\n    return utcSunday.count(y2 - 1, d);\n  }\n  function utcFirst(y2) {\n    t0$1.setTime(Date.UTC(y2, 0, 1));\n    return t0$1.getUTCDay();\n  }\n  function utcDate$1(y2, m2, d, H, M2, S, L) {\n    if (0 <= y2 && y2 < 100) {\n      const date2 = new Date(Date.UTC(-1, m2, d, H, M2, S, L));\n      date2.setUTCFullYear(d.y);\n      return date2;\n    }\n    return new Date(Date.UTC(y2, m2, d, H, M2, S, L));\n  }\n  function floor(units, step, get2, inv, newDate2) {\n    const s = step || 1, b2 = peek$1(units), _ = (unit2, p, key2) => {\n      key2 = key2 || unit2;\n      return getUnit(get2[key2], inv[key2], unit2 === b2 && s, p);\n    };\n    const t = /* @__PURE__ */ new Date(), u2 = toSet(units), y2 = u2[YEAR] ? _(YEAR) : constant$5(2012), m2 = u2[MONTH] ? _(MONTH) : u2[QUARTER] ? _(QUARTER) : zero$3, d = u2[WEEK] && u2[DAY] ? _(DAY, 1, WEEK + DAY) : u2[WEEK] ? _(WEEK, 1) : u2[DAY] ? _(DAY, 1) : u2[DATE] ? _(DATE, 1) : u2[DAYOFYEAR] ? _(DAYOFYEAR, 1) : one$2, H = u2[HOURS] ? _(HOURS) : zero$3, M2 = u2[MINUTES] ? _(MINUTES) : zero$3, S = u2[SECONDS] ? _(SECONDS) : zero$3, L = u2[MILLISECONDS] ? _(MILLISECONDS) : zero$3;\n    return function(v) {\n      t.setTime(+v);\n      const year = y2(t);\n      return newDate2(year, m2(t), d(t, year), H(t), M2(t), S(t), L(t));\n    };\n  }\n  function getUnit(f, inv, step, phase) {\n    const u2 = step <= 1 ? f : phase ? (d, y2) => phase + step * Math.floor((f(d, y2) - phase) / step) : (d, y2) => step * Math.floor(f(d, y2) / step);\n    return inv ? (d, y2) => inv(u2(d, y2), y2) : u2;\n  }\n  function weekday(week2, day, firstDay) {\n    return day + week2 * 7 - (firstDay + 6) % 7;\n  }\n  const localGet = {\n    [YEAR]: (d) => d.getFullYear(),\n    [QUARTER]: (d) => Math.floor(d.getMonth() / 3),\n    [MONTH]: (d) => d.getMonth(),\n    [DATE]: (d) => d.getDate(),\n    [HOURS]: (d) => d.getHours(),\n    [MINUTES]: (d) => d.getMinutes(),\n    [SECONDS]: (d) => d.getSeconds(),\n    [MILLISECONDS]: (d) => d.getMilliseconds(),\n    [DAYOFYEAR]: (d) => localDayOfYear(d),\n    [WEEK]: (d) => localWeekNum(d),\n    [WEEK + DAY]: (d, y2) => weekday(localWeekNum(d), d.getDay(), localFirst(y2)),\n    [DAY]: (d, y2) => weekday(1, d.getDay(), localFirst(y2))\n  };\n  const localInv = {\n    [QUARTER]: (q) => 3 * q,\n    [WEEK]: (w2, y2) => weekday(w2, 0, localFirst(y2))\n  };\n  function timeFloor(units, step) {\n    return floor(units, step || 1, localGet, localInv, localDate$1);\n  }\n  const utcGet = {\n    [YEAR]: (d) => d.getUTCFullYear(),\n    [QUARTER]: (d) => Math.floor(d.getUTCMonth() / 3),\n    [MONTH]: (d) => d.getUTCMonth(),\n    [DATE]: (d) => d.getUTCDate(),\n    [HOURS]: (d) => d.getUTCHours(),\n    [MINUTES]: (d) => d.getUTCMinutes(),\n    [SECONDS]: (d) => d.getUTCSeconds(),\n    [MILLISECONDS]: (d) => d.getUTCMilliseconds(),\n    [DAYOFYEAR]: (d) => utcDayOfYear(d),\n    [WEEK]: (d) => utcWeekNum(d),\n    [DAY]: (d, y2) => weekday(1, d.getUTCDay(), utcFirst(y2)),\n    [WEEK + DAY]: (d, y2) => weekday(utcWeekNum(d), d.getUTCDay(), utcFirst(y2))\n  };\n  const utcInv = {\n    [QUARTER]: (q) => 3 * q,\n    [WEEK]: (w2, y2) => weekday(w2, 0, utcFirst(y2))\n  };\n  function utcFloor(units, step) {\n    return floor(units, step || 1, utcGet, utcInv, utcDate$1);\n  }\n  const timeIntervals = {\n    [YEAR]: timeYear,\n    [QUARTER]: timeMonth.every(3),\n    [MONTH]: timeMonth,\n    [WEEK]: timeSunday,\n    [DATE]: timeDay,\n    [DAY]: timeDay,\n    [DAYOFYEAR]: timeDay,\n    [HOURS]: timeHour,\n    [MINUTES]: timeMinute,\n    [SECONDS]: second,\n    [MILLISECONDS]: millisecond\n  };\n  const utcIntervals = {\n    [YEAR]: utcYear,\n    [QUARTER]: utcMonth.every(3),\n    [MONTH]: utcMonth,\n    [WEEK]: utcSunday,\n    [DATE]: utcDay,\n    [DAY]: utcDay,\n    [DAYOFYEAR]: utcDay,\n    [HOURS]: utcHour,\n    [MINUTES]: utcMinute,\n    [SECONDS]: second,\n    [MILLISECONDS]: millisecond\n  };\n  function timeInterval(unit2) {\n    return timeIntervals[unit2];\n  }\n  function utcInterval(unit2) {\n    return utcIntervals[unit2];\n  }\n  function offset$3(ival, date2, step) {\n    return ival ? ival.offset(date2, step) : void 0;\n  }\n  function timeOffset(unit2, date2, step) {\n    return offset$3(timeInterval(unit2), date2, step);\n  }\n  function utcOffset(unit2, date2, step) {\n    return offset$3(utcInterval(unit2), date2, step);\n  }\n  function sequence$1(ival, start, stop2, step) {\n    return ival ? ival.range(start, stop2, step) : void 0;\n  }\n  function timeSequence(unit2, start, stop2, step) {\n    return sequence$1(timeInterval(unit2), start, stop2, step);\n  }\n  function utcSequence(unit2, start, stop2, step) {\n    return sequence$1(utcInterval(unit2), start, stop2, step);\n  }\n  const durationSecond = 1e3, durationMinute = durationSecond * 60, durationHour = durationMinute * 60, durationDay = durationHour * 24, durationWeek = durationDay * 7, durationMonth = durationDay * 30, durationYear = durationDay * 365;\n  const Milli = [YEAR, MONTH, DATE, HOURS, MINUTES, SECONDS, MILLISECONDS], Seconds = Milli.slice(0, -1), Minutes = Seconds.slice(0, -1), Hours = Minutes.slice(0, -1), Day = Hours.slice(0, -1), Week = [YEAR, WEEK], Month = [YEAR, MONTH], Year = [YEAR];\n  const intervals = [[Seconds, 1, durationSecond], [Seconds, 5, 5 * durationSecond], [Seconds, 15, 15 * durationSecond], [Seconds, 30, 30 * durationSecond], [Minutes, 1, durationMinute], [Minutes, 5, 5 * durationMinute], [Minutes, 15, 15 * durationMinute], [Minutes, 30, 30 * durationMinute], [Hours, 1, durationHour], [Hours, 3, 3 * durationHour], [Hours, 6, 6 * durationHour], [Hours, 12, 12 * durationHour], [Day, 1, durationDay], [Week, 1, durationWeek], [Month, 1, durationMonth], [Month, 3, 3 * durationMonth], [Year, 1, durationYear]];\n  function bin$1(opt) {\n    const ext = opt.extent, max2 = opt.maxbins || 40, target2 = Math.abs(span(ext)) / max2;\n    let i = bisector((i2) => i2[2]).right(intervals, target2), units, step;\n    if (i === intervals.length) {\n      units = Year, step = tickStep(ext[0] / durationYear, ext[1] / durationYear, max2);\n    } else if (i) {\n      i = intervals[target2 / intervals[i - 1][2] < intervals[i][2] / target2 ? i - 1 : i];\n      units = i[0];\n      step = i[1];\n    } else {\n      units = Milli;\n      step = Math.max(tickStep(ext[0], ext[1], max2), 1);\n    }\n    return {\n      units,\n      step\n    };\n  }\n  function localDate(d) {\n    if (0 <= d.y && d.y < 100) {\n      var date2 = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n      date2.setFullYear(d.y);\n      return date2;\n    }\n    return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n  }\n  function utcDate(d) {\n    if (0 <= d.y && d.y < 100) {\n      var date2 = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n      date2.setUTCFullYear(d.y);\n      return date2;\n    }\n    return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n  }\n  function newDate(y2, m2, d) {\n    return { y: y2, m: m2, d, H: 0, M: 0, S: 0, L: 0 };\n  }\n  function formatLocale(locale2) {\n    var locale_dateTime = locale2.dateTime, locale_date = locale2.date, locale_time = locale2.time, locale_periods = locale2.periods, locale_weekdays = locale2.days, locale_shortWeekdays = locale2.shortDays, locale_months = locale2.months, locale_shortMonths = locale2.shortMonths;\n    var periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths);\n    var formats2 = {\n      \"a\": formatShortWeekday,\n      \"A\": formatWeekday,\n      \"b\": formatShortMonth,\n      \"B\": formatMonth,\n      \"c\": null,\n      \"d\": formatDayOfMonth,\n      \"e\": formatDayOfMonth,\n      \"f\": formatMicroseconds,\n      \"g\": formatYearISO,\n      \"G\": formatFullYearISO,\n      \"H\": formatHour24,\n      \"I\": formatHour12,\n      \"j\": formatDayOfYear,\n      \"L\": formatMilliseconds,\n      \"m\": formatMonthNumber,\n      \"M\": formatMinutes,\n      \"p\": formatPeriod,\n      \"q\": formatQuarter,\n      \"Q\": formatUnixTimestamp,\n      \"s\": formatUnixTimestampSeconds,\n      \"S\": formatSeconds,\n      \"u\": formatWeekdayNumberMonday,\n      \"U\": formatWeekNumberSunday,\n      \"V\": formatWeekNumberISO,\n      \"w\": formatWeekdayNumberSunday,\n      \"W\": formatWeekNumberMonday,\n      \"x\": null,\n      \"X\": null,\n      \"y\": formatYear,\n      \"Y\": formatFullYear,\n      \"Z\": formatZone,\n      \"%\": formatLiteralPercent\n    };\n    var utcFormats = {\n      \"a\": formatUTCShortWeekday,\n      \"A\": formatUTCWeekday,\n      \"b\": formatUTCShortMonth,\n      \"B\": formatUTCMonth,\n      \"c\": null,\n      \"d\": formatUTCDayOfMonth,\n      \"e\": formatUTCDayOfMonth,\n      \"f\": formatUTCMicroseconds,\n      \"g\": formatUTCYearISO,\n      \"G\": formatUTCFullYearISO,\n      \"H\": formatUTCHour24,\n      \"I\": formatUTCHour12,\n      \"j\": formatUTCDayOfYear,\n      \"L\": formatUTCMilliseconds,\n      \"m\": formatUTCMonthNumber,\n      \"M\": formatUTCMinutes,\n      \"p\": formatUTCPeriod,\n      \"q\": formatUTCQuarter,\n      \"Q\": formatUnixTimestamp,\n      \"s\": formatUnixTimestampSeconds,\n      \"S\": formatUTCSeconds,\n      \"u\": formatUTCWeekdayNumberMonday,\n      \"U\": formatUTCWeekNumberSunday,\n      \"V\": formatUTCWeekNumberISO,\n      \"w\": formatUTCWeekdayNumberSunday,\n      \"W\": formatUTCWeekNumberMonday,\n      \"x\": null,\n      \"X\": null,\n      \"y\": formatUTCYear,\n      \"Y\": formatUTCFullYear,\n      \"Z\": formatUTCZone,\n      \"%\": formatLiteralPercent\n    };\n    var parses = {\n      \"a\": parseShortWeekday,\n      \"A\": parseWeekday,\n      \"b\": parseShortMonth,\n      \"B\": parseMonth,\n      \"c\": parseLocaleDateTime,\n      \"d\": parseDayOfMonth,\n      \"e\": parseDayOfMonth,\n      \"f\": parseMicroseconds,\n      \"g\": parseYear,\n      \"G\": parseFullYear,\n      \"H\": parseHour24,\n      \"I\": parseHour24,\n      \"j\": parseDayOfYear,\n      \"L\": parseMilliseconds,\n      \"m\": parseMonthNumber,\n      \"M\": parseMinutes,\n      \"p\": parsePeriod,\n      \"q\": parseQuarter,\n      \"Q\": parseUnixTimestamp,\n      \"s\": parseUnixTimestampSeconds,\n      \"S\": parseSeconds,\n      \"u\": parseWeekdayNumberMonday,\n      \"U\": parseWeekNumberSunday,\n      \"V\": parseWeekNumberISO,\n      \"w\": parseWeekdayNumberSunday,\n      \"W\": parseWeekNumberMonday,\n      \"x\": parseLocaleDate,\n      \"X\": parseLocaleTime,\n      \"y\": parseYear,\n      \"Y\": parseFullYear,\n      \"Z\": parseZone,\n      \"%\": parseLiteralPercent\n    };\n    formats2.x = newFormat(locale_date, formats2);\n    formats2.X = newFormat(locale_time, formats2);\n    formats2.c = newFormat(locale_dateTime, formats2);\n    utcFormats.x = newFormat(locale_date, utcFormats);\n    utcFormats.X = newFormat(locale_time, utcFormats);\n    utcFormats.c = newFormat(locale_dateTime, utcFormats);\n    function newFormat(specifier, formats3) {\n      return function(date2) {\n        var string2 = [], i = -1, j = 0, n = specifier.length, c2, pad2, format2;\n        if (!(date2 instanceof Date)) date2 = /* @__PURE__ */ new Date(+date2);\n        while (++i < n) {\n          if (specifier.charCodeAt(i) === 37) {\n            string2.push(specifier.slice(j, i));\n            if ((pad2 = pads[c2 = specifier.charAt(++i)]) != null) c2 = specifier.charAt(++i);\n            else pad2 = c2 === \"e\" ? \" \" : \"0\";\n            if (format2 = formats3[c2]) c2 = format2(date2, pad2);\n            string2.push(c2);\n            j = i + 1;\n          }\n        }\n        string2.push(specifier.slice(j, i));\n        return string2.join(\"\");\n      };\n    }\n    function newParse(specifier, Z) {\n      return function(string2) {\n        var d = newDate(1900, void 0, 1), i = parseSpecifier(d, specifier, string2 += \"\", 0), week2, day;\n        if (i != string2.length) return null;\n        if (\"Q\" in d) return new Date(d.Q);\n        if (\"s\" in d) return new Date(d.s * 1e3 + (\"L\" in d ? d.L : 0));\n        if (Z && !(\"Z\" in d)) d.Z = 0;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        if (d.m === void 0) d.m = \"q\" in d ? d.q : 0;\n        if (\"V\" in d) {\n          if (d.V < 1 || d.V > 53) return null;\n          if (!(\"w\" in d)) d.w = 1;\n          if (\"Z\" in d) {\n            week2 = utcDate(newDate(d.y, 0, 1)), day = week2.getUTCDay();\n            week2 = day > 4 || day === 0 ? utcMonday.ceil(week2) : utcMonday(week2);\n            week2 = utcDay.offset(week2, (d.V - 1) * 7);\n            d.y = week2.getUTCFullYear();\n            d.m = week2.getUTCMonth();\n            d.d = week2.getUTCDate() + (d.w + 6) % 7;\n          } else {\n            week2 = localDate(newDate(d.y, 0, 1)), day = week2.getDay();\n            week2 = day > 4 || day === 0 ? timeMonday.ceil(week2) : timeMonday(week2);\n            week2 = timeDay.offset(week2, (d.V - 1) * 7);\n            d.y = week2.getFullYear();\n            d.m = week2.getMonth();\n            d.d = week2.getDate() + (d.w + 6) % 7;\n          }\n        } else if (\"W\" in d || \"U\" in d) {\n          if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n          day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n          d.m = 0;\n          d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n        }\n        if (\"Z\" in d) {\n          d.H += d.Z / 100 | 0;\n          d.M += d.Z % 100;\n          return utcDate(d);\n        }\n        return localDate(d);\n      };\n    }\n    function parseSpecifier(d, specifier, string2, j) {\n      var i = 0, n = specifier.length, m2 = string2.length, c2, parse2;\n      while (i < n) {\n        if (j >= m2) return -1;\n        c2 = specifier.charCodeAt(i++);\n        if (c2 === 37) {\n          c2 = specifier.charAt(i++);\n          parse2 = parses[c2 in pads ? specifier.charAt(i++) : c2];\n          if (!parse2 || (j = parse2(d, string2, j)) < 0) return -1;\n        } else if (c2 != string2.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    function parsePeriod(d, string2, i) {\n      var n = periodRe.exec(string2.slice(i));\n      return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortWeekday(d, string2, i) {\n      var n = shortWeekdayRe.exec(string2.slice(i));\n      return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseWeekday(d, string2, i) {\n      var n = weekdayRe.exec(string2.slice(i));\n      return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortMonth(d, string2, i) {\n      var n = shortMonthRe.exec(string2.slice(i));\n      return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseMonth(d, string2, i) {\n      var n = monthRe.exec(string2.slice(i));\n      return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseLocaleDateTime(d, string2, i) {\n      return parseSpecifier(d, locale_dateTime, string2, i);\n    }\n    function parseLocaleDate(d, string2, i) {\n      return parseSpecifier(d, locale_date, string2, i);\n    }\n    function parseLocaleTime(d, string2, i) {\n      return parseSpecifier(d, locale_time, string2, i);\n    }\n    function formatShortWeekday(d) {\n      return locale_shortWeekdays[d.getDay()];\n    }\n    function formatWeekday(d) {\n      return locale_weekdays[d.getDay()];\n    }\n    function formatShortMonth(d) {\n      return locale_shortMonths[d.getMonth()];\n    }\n    function formatMonth(d) {\n      return locale_months[d.getMonth()];\n    }\n    function formatPeriod(d) {\n      return locale_periods[+(d.getHours() >= 12)];\n    }\n    function formatQuarter(d) {\n      return 1 + ~~(d.getMonth() / 3);\n    }\n    function formatUTCShortWeekday(d) {\n      return locale_shortWeekdays[d.getUTCDay()];\n    }\n    function formatUTCWeekday(d) {\n      return locale_weekdays[d.getUTCDay()];\n    }\n    function formatUTCShortMonth(d) {\n      return locale_shortMonths[d.getUTCMonth()];\n    }\n    function formatUTCMonth(d) {\n      return locale_months[d.getUTCMonth()];\n    }\n    function formatUTCPeriod(d) {\n      return locale_periods[+(d.getUTCHours() >= 12)];\n    }\n    function formatUTCQuarter(d) {\n      return 1 + ~~(d.getUTCMonth() / 3);\n    }\n    return {\n      format: function(specifier) {\n        var f = newFormat(specifier += \"\", formats2);\n        f.toString = function() {\n          return specifier;\n        };\n        return f;\n      },\n      parse: function(specifier) {\n        var p = newParse(specifier += \"\", false);\n        p.toString = function() {\n          return specifier;\n        };\n        return p;\n      },\n      utcFormat: function(specifier) {\n        var f = newFormat(specifier += \"\", utcFormats);\n        f.toString = function() {\n          return specifier;\n        };\n        return f;\n      },\n      utcParse: function(specifier) {\n        var p = newParse(specifier += \"\", true);\n        p.toString = function() {\n          return specifier;\n        };\n        return p;\n      }\n    };\n  }\n  var pads = { \"-\": \"\", \"_\": \" \", \"0\": \"0\" }, numberRe = /^\\s*\\d+/, percentRe = /^%/, requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n  function pad(value2, fill2, width2) {\n    var sign2 = value2 < 0 ? \"-\" : \"\", string2 = (sign2 ? -value2 : value2) + \"\", length2 = string2.length;\n    return sign2 + (length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) + string2 : string2);\n  }\n  function requote(s) {\n    return s.replace(requoteRe, \"\\\\$&\");\n  }\n  function formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n  }\n  function formatLookup(names) {\n    return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n  }\n  function parseWeekdayNumberSunday(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d.w = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekdayNumberMonday(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d.u = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberSunday(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.U = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberISO(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.V = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberMonday(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.W = +n[0], i + n[0].length) : -1;\n  }\n  function parseFullYear(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 4));\n    return n ? (d.y = +n[0], i + n[0].length) : -1;\n  }\n  function parseYear(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2e3), i + n[0].length) : -1;\n  }\n  function parseZone(d, string2, i) {\n    var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string2.slice(i, i + 6));\n    return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n  }\n  function parseQuarter(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n  }\n  function parseMonthNumber(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function parseDayOfMonth(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.d = +n[0], i + n[0].length) : -1;\n  }\n  function parseDayOfYear(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 3));\n    return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n  }\n  function parseHour24(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.H = +n[0], i + n[0].length) : -1;\n  }\n  function parseMinutes(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.M = +n[0], i + n[0].length) : -1;\n  }\n  function parseSeconds(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.S = +n[0], i + n[0].length) : -1;\n  }\n  function parseMilliseconds(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 3));\n    return n ? (d.L = +n[0], i + n[0].length) : -1;\n  }\n  function parseMicroseconds(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 6));\n    return n ? (d.L = Math.floor(n[0] / 1e3), i + n[0].length) : -1;\n  }\n  function parseLiteralPercent(d, string2, i) {\n    var n = percentRe.exec(string2.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function parseUnixTimestamp(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i));\n    return n ? (d.Q = +n[0], i + n[0].length) : -1;\n  }\n  function parseUnixTimestampSeconds(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i));\n    return n ? (d.s = +n[0], i + n[0].length) : -1;\n  }\n  function formatDayOfMonth(d, p) {\n    return pad(d.getDate(), p, 2);\n  }\n  function formatHour24(d, p) {\n    return pad(d.getHours(), p, 2);\n  }\n  function formatHour12(d, p) {\n    return pad(d.getHours() % 12 || 12, p, 2);\n  }\n  function formatDayOfYear(d, p) {\n    return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n  }\n  function formatMilliseconds(d, p) {\n    return pad(d.getMilliseconds(), p, 3);\n  }\n  function formatMicroseconds(d, p) {\n    return formatMilliseconds(d, p) + \"000\";\n  }\n  function formatMonthNumber(d, p) {\n    return pad(d.getMonth() + 1, p, 2);\n  }\n  function formatMinutes(d, p) {\n    return pad(d.getMinutes(), p, 2);\n  }\n  function formatSeconds(d, p) {\n    return pad(d.getSeconds(), p, 2);\n  }\n  function formatWeekdayNumberMonday(d) {\n    var day = d.getDay();\n    return day === 0 ? 7 : day;\n  }\n  function formatWeekNumberSunday(d, p) {\n    return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n  }\n  function dISO(d) {\n    var day = d.getDay();\n    return day >= 4 || day === 0 ? timeThursday(d) : timeThursday.ceil(d);\n  }\n  function formatWeekNumberISO(d, p) {\n    d = dISO(d);\n    return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n  }\n  function formatWeekdayNumberSunday(d) {\n    return d.getDay();\n  }\n  function formatWeekNumberMonday(d, p) {\n    return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n  }\n  function formatYear(d, p) {\n    return pad(d.getFullYear() % 100, p, 2);\n  }\n  function formatYearISO(d, p) {\n    d = dISO(d);\n    return pad(d.getFullYear() % 100, p, 2);\n  }\n  function formatFullYear(d, p) {\n    return pad(d.getFullYear() % 1e4, p, 4);\n  }\n  function formatFullYearISO(d, p) {\n    var day = d.getDay();\n    d = day >= 4 || day === 0 ? timeThursday(d) : timeThursday.ceil(d);\n    return pad(d.getFullYear() % 1e4, p, 4);\n  }\n  function formatZone(d) {\n    var z = d.getTimezoneOffset();\n    return (z > 0 ? \"-\" : (z *= -1, \"+\")) + pad(z / 60 | 0, \"0\", 2) + pad(z % 60, \"0\", 2);\n  }\n  function formatUTCDayOfMonth(d, p) {\n    return pad(d.getUTCDate(), p, 2);\n  }\n  function formatUTCHour24(d, p) {\n    return pad(d.getUTCHours(), p, 2);\n  }\n  function formatUTCHour12(d, p) {\n    return pad(d.getUTCHours() % 12 || 12, p, 2);\n  }\n  function formatUTCDayOfYear(d, p) {\n    return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n  }\n  function formatUTCMilliseconds(d, p) {\n    return pad(d.getUTCMilliseconds(), p, 3);\n  }\n  function formatUTCMicroseconds(d, p) {\n    return formatUTCMilliseconds(d, p) + \"000\";\n  }\n  function formatUTCMonthNumber(d, p) {\n    return pad(d.getUTCMonth() + 1, p, 2);\n  }\n  function formatUTCMinutes(d, p) {\n    return pad(d.getUTCMinutes(), p, 2);\n  }\n  function formatUTCSeconds(d, p) {\n    return pad(d.getUTCSeconds(), p, 2);\n  }\n  function formatUTCWeekdayNumberMonday(d) {\n    var dow = d.getUTCDay();\n    return dow === 0 ? 7 : dow;\n  }\n  function formatUTCWeekNumberSunday(d, p) {\n    return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n  }\n  function UTCdISO(d) {\n    var day = d.getUTCDay();\n    return day >= 4 || day === 0 ? utcThursday(d) : utcThursday.ceil(d);\n  }\n  function formatUTCWeekNumberISO(d, p) {\n    d = UTCdISO(d);\n    return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n  }\n  function formatUTCWeekdayNumberSunday(d) {\n    return d.getUTCDay();\n  }\n  function formatUTCWeekNumberMonday(d, p) {\n    return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n  }\n  function formatUTCYear(d, p) {\n    return pad(d.getUTCFullYear() % 100, p, 2);\n  }\n  function formatUTCYearISO(d, p) {\n    d = UTCdISO(d);\n    return pad(d.getUTCFullYear() % 100, p, 2);\n  }\n  function formatUTCFullYear(d, p) {\n    return pad(d.getUTCFullYear() % 1e4, p, 4);\n  }\n  function formatUTCFullYearISO(d, p) {\n    var day = d.getUTCDay();\n    d = day >= 4 || day === 0 ? utcThursday(d) : utcThursday.ceil(d);\n    return pad(d.getUTCFullYear() % 1e4, p, 4);\n  }\n  function formatUTCZone() {\n    return \"+0000\";\n  }\n  function formatLiteralPercent() {\n    return \"%\";\n  }\n  function formatUnixTimestamp(d) {\n    return +d;\n  }\n  function formatUnixTimestampSeconds(d) {\n    return Math.floor(+d / 1e3);\n  }\n  var locale$1;\n  var timeFormat$1;\n  var timeParse$1;\n  var utcFormat$1;\n  var utcParse$1;\n  defaultLocale$1({\n    dateTime: \"%x, %X\",\n    date: \"%-m/%-d/%Y\",\n    time: \"%-I:%M:%S %p\",\n    periods: [\"AM\", \"PM\"],\n    days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n    shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n    months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n    shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n  });\n  function defaultLocale$1(definition2) {\n    locale$1 = formatLocale(definition2);\n    timeFormat$1 = locale$1.format;\n    timeParse$1 = locale$1.parse;\n    utcFormat$1 = locale$1.utcFormat;\n    utcParse$1 = locale$1.utcParse;\n    return locale$1;\n  }\n  function memoize(method2) {\n    const cache2 = {};\n    return (spec) => cache2[spec] || (cache2[spec] = method2(spec));\n  }\n  function trimZeroes(numberFormat, decimalChar) {\n    return (x2) => {\n      const str = numberFormat(x2), dec = str.indexOf(decimalChar);\n      if (dec < 0) return str;\n      let idx = rightmostDigit(str, dec);\n      const end = idx < str.length ? str.slice(idx) : \"\";\n      while (--idx > dec) if (str[idx] !== \"0\") {\n        ++idx;\n        break;\n      }\n      return str.slice(0, idx) + end;\n    };\n  }\n  function rightmostDigit(str, dec) {\n    let i = str.lastIndexOf(\"e\"), c2;\n    if (i > 0) return i;\n    for (i = str.length; --i > dec; ) {\n      c2 = str.charCodeAt(i);\n      if (c2 >= 48 && c2 <= 57) return i + 1;\n    }\n  }\n  function numberLocale(locale2) {\n    const format2 = memoize(locale2.format), formatPrefix2 = locale2.formatPrefix;\n    return {\n      format: format2,\n      formatPrefix: formatPrefix2,\n      formatFloat(spec) {\n        const s = formatSpecifier(spec || \",\");\n        if (s.precision == null) {\n          s.precision = 12;\n          switch (s.type) {\n            case \"%\":\n              s.precision -= 2;\n              break;\n            case \"e\":\n              s.precision -= 1;\n              break;\n          }\n          return trimZeroes(\n            format2(s),\n            // number format\n            format2(\".1f\")(1)[1]\n            // decimal point character\n          );\n        } else {\n          return format2(s);\n        }\n      },\n      formatSpan(start, stop2, count2, specifier) {\n        specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n        const step = tickStep(start, stop2, count2), value2 = Math.max(Math.abs(start), Math.abs(stop2));\n        let precision;\n        if (specifier.precision == null) {\n          switch (specifier.type) {\n            case \"s\": {\n              if (!isNaN(precision = precisionPrefix(step, value2))) {\n                specifier.precision = precision;\n              }\n              return formatPrefix2(specifier, value2);\n            }\n            case \"\":\n            case \"e\":\n            case \"g\":\n            case \"p\":\n            case \"r\": {\n              if (!isNaN(precision = precisionRound(step, value2))) {\n                specifier.precision = precision - (specifier.type === \"e\");\n              }\n              break;\n            }\n            case \"f\":\n            case \"%\": {\n              if (!isNaN(precision = precisionFixed(step))) {\n                specifier.precision = precision - (specifier.type === \"%\") * 2;\n              }\n              break;\n            }\n          }\n        }\n        return format2(specifier);\n      }\n    };\n  }\n  let defaultNumberLocale;\n  resetNumberFormatDefaultLocale();\n  function resetNumberFormatDefaultLocale() {\n    return defaultNumberLocale = numberLocale({\n      format: format$3,\n      formatPrefix\n    });\n  }\n  function numberFormatLocale(definition2) {\n    return numberLocale(formatLocale$1(definition2));\n  }\n  function numberFormatDefaultLocale(definition2) {\n    return arguments.length ? defaultNumberLocale = numberFormatLocale(definition2) : defaultNumberLocale;\n  }\n  function timeMultiFormat(format2, interval2, spec) {\n    spec = spec || {};\n    if (!isObject$1(spec)) {\n      error(`Invalid time multi-format specifier: ${spec}`);\n    }\n    const second2 = interval2(SECONDS), minute = interval2(MINUTES), hour = interval2(HOURS), day = interval2(DATE), week2 = interval2(WEEK), month = interval2(MONTH), quarter2 = interval2(QUARTER), year = interval2(YEAR), L = format2(spec[MILLISECONDS] || \".%L\"), S = format2(spec[SECONDS] || \":%S\"), M2 = format2(spec[MINUTES] || \"%I:%M\"), H = format2(spec[HOURS] || \"%I %p\"), d = format2(spec[DATE] || spec[DAY] || \"%a %d\"), w2 = format2(spec[WEEK] || \"%b %d\"), m2 = format2(spec[MONTH] || \"%B\"), q = format2(spec[QUARTER] || \"%B\"), y2 = format2(spec[YEAR] || \"%Y\");\n    return (date2) => (second2(date2) < date2 ? L : minute(date2) < date2 ? S : hour(date2) < date2 ? M2 : day(date2) < date2 ? H : month(date2) < date2 ? week2(date2) < date2 ? d : w2 : year(date2) < date2 ? quarter2(date2) < date2 ? m2 : q : y2)(date2);\n  }\n  function timeLocale(locale2) {\n    const timeFormat2 = memoize(locale2.format), utcFormat2 = memoize(locale2.utcFormat);\n    return {\n      timeFormat: (spec) => isString(spec) ? timeFormat2(spec) : timeMultiFormat(timeFormat2, timeInterval, spec),\n      utcFormat: (spec) => isString(spec) ? utcFormat2(spec) : timeMultiFormat(utcFormat2, utcInterval, spec),\n      timeParse: memoize(locale2.parse),\n      utcParse: memoize(locale2.utcParse)\n    };\n  }\n  let defaultTimeLocale;\n  resetTimeFormatDefaultLocale();\n  function resetTimeFormatDefaultLocale() {\n    return defaultTimeLocale = timeLocale({\n      format: timeFormat$1,\n      parse: timeParse$1,\n      utcFormat: utcFormat$1,\n      utcParse: utcParse$1\n    });\n  }\n  function timeFormatLocale(definition2) {\n    return timeLocale(formatLocale(definition2));\n  }\n  function timeFormatDefaultLocale(definition2) {\n    return arguments.length ? defaultTimeLocale = timeFormatLocale(definition2) : defaultTimeLocale;\n  }\n  const createLocale = (number2, time2) => extend$1({}, number2, time2);\n  function locale(numberSpec, timeSpec) {\n    const number2 = numberSpec ? numberFormatLocale(numberSpec) : numberFormatDefaultLocale();\n    const time2 = timeSpec ? timeFormatLocale(timeSpec) : timeFormatDefaultLocale();\n    return createLocale(number2, time2);\n  }\n  function defaultLocale(numberSpec, timeSpec) {\n    const args = arguments.length;\n    if (args && args !== 2) {\n      error(\"defaultLocale expects either zero or two arguments.\");\n    }\n    return args ? createLocale(numberFormatDefaultLocale(numberSpec), timeFormatDefaultLocale(timeSpec)) : createLocale(numberFormatDefaultLocale(), timeFormatDefaultLocale());\n  }\n  function resetDefaultLocale() {\n    resetNumberFormatDefaultLocale();\n    resetTimeFormatDefaultLocale();\n    return defaultLocale();\n  }\n  const protocol_re = /^(data:|([A-Za-z]+:)?\\/\\/)/;\n  const allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i;\n  const whitespace_re = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205f\\u3000]/g;\n  const fileProtocol = \"file://\";\n  function loaderFactory(fs) {\n    return (options) => ({\n      options: options || {},\n      sanitize,\n      load: load$1,\n      fileAccess: false,\n      file: fileLoader(),\n      http: httpLoader\n    });\n  }\n  async function load$1(uri, options) {\n    const opt = await this.sanitize(uri, options), url = opt.href;\n    return opt.localFile ? this.file(url) : this.http(url, options?.http);\n  }\n  async function sanitize(uri, options) {\n    options = extend$1({}, this.options, options);\n    const fileAccess = this.fileAccess, result = {\n      href: null\n    };\n    let isFile, loadFile, base2;\n    const isAllowed = allowed_re.test(uri.replace(whitespace_re, \"\"));\n    if (uri == null || typeof uri !== \"string\" || !isAllowed) {\n      error(\"Sanitize failure, invalid URI: \" + $(uri));\n    }\n    const hasProtocol = protocol_re.test(uri);\n    if ((base2 = options.baseURL) && !hasProtocol) {\n      if (!uri.startsWith(\"/\") && !base2.endsWith(\"/\")) {\n        uri = \"/\" + uri;\n      }\n      uri = base2 + uri;\n    }\n    loadFile = (isFile = uri.startsWith(fileProtocol)) || options.mode === \"file\" || options.mode !== \"http\" && !hasProtocol && fileAccess;\n    if (isFile) {\n      uri = uri.slice(fileProtocol.length);\n    } else if (uri.startsWith(\"//\")) {\n      if (options.defaultProtocol === \"file\") {\n        uri = uri.slice(2);\n        loadFile = true;\n      } else {\n        uri = (options.defaultProtocol || \"http\") + \":\" + uri;\n      }\n    }\n    Object.defineProperty(result, \"localFile\", {\n      value: !!loadFile\n    });\n    result.href = uri;\n    if (options.target) {\n      result.target = options.target + \"\";\n    }\n    if (options.rel) {\n      result.rel = options.rel + \"\";\n    }\n    if (options.context === \"image\" && options.crossOrigin) {\n      result.crossOrigin = options.crossOrigin + \"\";\n    }\n    return result;\n  }\n  function fileLoader(fs) {\n    return fileReject;\n  }\n  async function fileReject() {\n    error(\"No file system access.\");\n  }\n  async function httpLoader(url, options) {\n    const opt = extend$1({}, this.options.http, options), type2 = options && options.response, response = await fetch(url, opt);\n    return !response.ok ? error(response.status + \"\" + response.statusText) : isFunction(response[type2]) ? response[type2]() : response.text();\n  }\n  const isValid = (_) => _ != null && _ === _;\n  const isBoolean = (_) => _ === \"true\" || _ === \"false\" || _ === true || _ === false;\n  const isDate = (_) => !Number.isNaN(Date.parse(_));\n  const isNumber = (_) => !Number.isNaN(+_) && !(_ instanceof Date);\n  const isInteger = (_) => isNumber(_) && Number.isInteger(+_);\n  const typeParsers = {\n    boolean: toBoolean,\n    integer: toNumber,\n    number: toNumber,\n    date: toDate,\n    string: toString,\n    unknown: identity$7\n  };\n  const typeTests = [isBoolean, isInteger, isNumber, isDate];\n  const typeList = [\"boolean\", \"integer\", \"number\", \"date\"];\n  function inferType(values2, field2) {\n    if (!values2 || !values2.length) return \"unknown\";\n    const n = values2.length, m2 = typeTests.length, a2 = typeTests.map((_, i) => i + 1);\n    for (let i = 0, t = 0, j, value2; i < n; ++i) {\n      value2 = field2 ? values2[i][field2] : values2[i];\n      for (j = 0; j < m2; ++j) {\n        if (a2[j] && isValid(value2) && !typeTests[j](value2)) {\n          a2[j] = 0;\n          ++t;\n          if (t === typeTests.length) return \"string\";\n        }\n      }\n    }\n    return typeList[a2.reduce((u2, v) => u2 === 0 ? v : u2, 0) - 1];\n  }\n  function inferTypes(data2, fields) {\n    return fields.reduce((types, field2) => {\n      types[field2] = inferType(data2, field2);\n      return types;\n    }, {});\n  }\n  function delimitedFormat(delimiter) {\n    const parse2 = function(data2, format2) {\n      const delim = {\n        delimiter\n      };\n      return dsv(data2, format2 ? extend$1(format2, delim) : delim);\n    };\n    parse2.responseType = \"text\";\n    return parse2;\n  }\n  function dsv(data2, format2) {\n    if (format2.header) {\n      data2 = format2.header.map($).join(format2.delimiter) + \"\\n\" + data2;\n    }\n    return dsvFormat(format2.delimiter).parse(data2 + \"\");\n  }\n  dsv.responseType = \"text\";\n  function isBuffer(_) {\n    return typeof Buffer === \"function\" && isFunction(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;\n  }\n  function json(data2, format2) {\n    const prop = format2 && format2.property ? field$1(format2.property) : identity$7;\n    return isObject$1(data2) && !isBuffer(data2) ? parseJSON(prop(data2), format2) : prop(JSON.parse(data2));\n  }\n  json.responseType = \"json\";\n  function parseJSON(data2, format2) {\n    if (!isArray(data2) && isIterable(data2)) {\n      data2 = [...data2];\n    }\n    return format2 && format2.copy ? JSON.parse(JSON.stringify(data2)) : data2;\n  }\n  const filters = {\n    interior: (a2, b2) => a2 !== b2,\n    exterior: (a2, b2) => a2 === b2\n  };\n  function topojson(data2, format2) {\n    let method2, object2, property2, filter2;\n    data2 = json(data2, format2);\n    if (format2 && format2.feature) {\n      method2 = feature;\n      property2 = format2.feature;\n    } else if (format2 && format2.mesh) {\n      method2 = mesh;\n      property2 = format2.mesh;\n      filter2 = filters[format2.filter];\n    } else {\n      error(\"Missing TopoJSON feature or mesh parameter.\");\n    }\n    object2 = (object2 = data2.objects[property2]) ? method2(data2, object2, filter2) : error(\"Invalid TopoJSON object: \" + property2);\n    return object2 && object2.features || [object2];\n  }\n  topojson.responseType = \"json\";\n  const format$2 = {\n    dsv,\n    csv: delimitedFormat(\",\"),\n    tsv: delimitedFormat(\"\t\"),\n    json,\n    topojson\n  };\n  function formats$1(name, reader) {\n    if (arguments.length > 1) {\n      format$2[name] = reader;\n      return this;\n    } else {\n      return has$1(format$2, name) ? format$2[name] : null;\n    }\n  }\n  function responseType(type2) {\n    const f = formats$1(type2);\n    return f && f.responseType || \"text\";\n  }\n  function read(data2, schema, timeParser, utcParser) {\n    schema = schema || {};\n    const reader = formats$1(schema.type || \"json\");\n    if (!reader) error(\"Unknown data format type: \" + schema.type);\n    data2 = reader(data2, schema);\n    if (schema.parse) parse$6(data2, schema.parse, timeParser, utcParser);\n    if (has$1(data2, \"columns\")) delete data2.columns;\n    return data2;\n  }\n  function parse$6(data2, types, timeParser, utcParser) {\n    if (!data2.length) return;\n    const locale2 = timeFormatDefaultLocale();\n    timeParser = timeParser || locale2.timeParse;\n    utcParser = utcParser || locale2.utcParse;\n    let fields = data2.columns || Object.keys(data2[0]), datum2, field2, i, j, n, m2;\n    if (types === \"auto\") types = inferTypes(data2, fields);\n    fields = Object.keys(types);\n    const parsers = fields.map((field3) => {\n      const type2 = types[field3];\n      let parts, pattern;\n      if (type2 && (type2.startsWith(\"date:\") || type2.startsWith(\"utc:\"))) {\n        parts = type2.split(/:(.+)?/, 2);\n        pattern = parts[1];\n        if (pattern[0] === \"'\" && pattern[pattern.length - 1] === \"'\" || pattern[0] === '\"' && pattern[pattern.length - 1] === '\"') {\n          pattern = pattern.slice(1, -1);\n        }\n        const parse2 = parts[0] === \"utc\" ? utcParser : timeParser;\n        return parse2(pattern);\n      }\n      if (!typeParsers[type2]) {\n        throw Error(\"Illegal format pattern: \" + field3 + \":\" + type2);\n      }\n      return typeParsers[type2];\n    });\n    for (i = 0, n = data2.length, m2 = fields.length; i < n; ++i) {\n      datum2 = data2[i];\n      for (j = 0; j < m2; ++j) {\n        field2 = fields[j];\n        datum2[field2] = parsers[j](datum2[field2]);\n      }\n    }\n  }\n  const loader = loaderFactory();\n  function UniqueList(idFunc) {\n    const $2 = idFunc || identity$7, list = [], ids = {};\n    list.add = (_) => {\n      const id2 = $2(_);\n      if (!ids[id2]) {\n        ids[id2] = 1;\n        list.push(_);\n      }\n      return list;\n    };\n    list.remove = (_) => {\n      const id2 = $2(_);\n      if (ids[id2]) {\n        ids[id2] = 0;\n        const idx = list.indexOf(_);\n        if (idx >= 0) list.splice(idx, 1);\n      }\n      return list;\n    };\n    return list;\n  }\n  async function asyncCallback(df, callback) {\n    try {\n      await callback(df);\n    } catch (err) {\n      df.error(err);\n    }\n  }\n  const TUPLE_ID_KEY = Symbol(\"vega_id\");\n  let TUPLE_ID = 1;\n  function isTuple(t) {\n    return !!(t && tupleid(t));\n  }\n  function tupleid(t) {\n    return t[TUPLE_ID_KEY];\n  }\n  function setid(t, id2) {\n    t[TUPLE_ID_KEY] = id2;\n    return t;\n  }\n  function ingest$1(datum2) {\n    const t = datum2 === Object(datum2) ? datum2 : {\n      data: datum2\n    };\n    return tupleid(t) ? t : setid(t, TUPLE_ID++);\n  }\n  function derive(t) {\n    return rederive(t, ingest$1({}));\n  }\n  function rederive(t, d) {\n    for (const k in t) d[k] = t[k];\n    return d;\n  }\n  function replace$1(t, d) {\n    return setid(d, tupleid(t));\n  }\n  function stableCompare(cmp, f) {\n    return !cmp ? null : f ? (a2, b2) => cmp(a2, b2) || tupleid(f(a2)) - tupleid(f(b2)) : (a2, b2) => cmp(a2, b2) || tupleid(a2) - tupleid(b2);\n  }\n  function isChangeSet(v) {\n    return v && v.constructor === changeset;\n  }\n  function changeset() {\n    const add2 = [], rem2 = [], mod = [], remp = [], modp = [];\n    let clean = null, reflow2 = false;\n    return {\n      constructor: changeset,\n      insert(t) {\n        const d = array$5(t), n = d.length;\n        for (let i = 0; i < n; ++i) add2.push(d[i]);\n        return this;\n      },\n      remove(t) {\n        const a2 = isFunction(t) ? remp : rem2, d = array$5(t), n = d.length;\n        for (let i = 0; i < n; ++i) a2.push(d[i]);\n        return this;\n      },\n      modify(t, field2, value2) {\n        const m2 = {\n          field: field2,\n          value: constant$5(value2)\n        };\n        if (isFunction(t)) {\n          m2.filter = t;\n          modp.push(m2);\n        } else {\n          m2.tuple = t;\n          mod.push(m2);\n        }\n        return this;\n      },\n      encode(t, set2) {\n        if (isFunction(t)) modp.push({\n          filter: t,\n          field: set2\n        });\n        else mod.push({\n          tuple: t,\n          field: set2\n        });\n        return this;\n      },\n      clean(value2) {\n        clean = value2;\n        return this;\n      },\n      reflow() {\n        reflow2 = true;\n        return this;\n      },\n      pulse(pulse2, tuples) {\n        const cur = {}, out = {};\n        let i, n, m2, f, t, id2;\n        for (i = 0, n = tuples.length; i < n; ++i) {\n          cur[tupleid(tuples[i])] = 1;\n        }\n        for (i = 0, n = rem2.length; i < n; ++i) {\n          t = rem2[i];\n          cur[tupleid(t)] = -1;\n        }\n        for (i = 0, n = remp.length; i < n; ++i) {\n          f = remp[i];\n          tuples.forEach((t4) => {\n            if (f(t4)) cur[tupleid(t4)] = -1;\n          });\n        }\n        for (i = 0, n = add2.length; i < n; ++i) {\n          t = add2[i];\n          id2 = tupleid(t);\n          if (cur[id2]) {\n            cur[id2] = 1;\n          } else {\n            pulse2.add.push(ingest$1(add2[i]));\n          }\n        }\n        for (i = 0, n = tuples.length; i < n; ++i) {\n          t = tuples[i];\n          if (cur[tupleid(t)] < 0) pulse2.rem.push(t);\n        }\n        function modify2(t4, f2, v) {\n          if (v) {\n            t4[f2] = v(t4);\n          } else {\n            pulse2.encode = f2;\n          }\n          if (!reflow2) out[tupleid(t4)] = t4;\n        }\n        for (i = 0, n = mod.length; i < n; ++i) {\n          m2 = mod[i];\n          t = m2.tuple;\n          f = m2.field;\n          id2 = cur[tupleid(t)];\n          if (id2 > 0) {\n            modify2(t, f, m2.value);\n            pulse2.modifies(f);\n          }\n        }\n        for (i = 0, n = modp.length; i < n; ++i) {\n          m2 = modp[i];\n          f = m2.filter;\n          tuples.forEach((t4) => {\n            if (f(t4) && cur[tupleid(t4)] > 0) {\n              modify2(t4, m2.field, m2.value);\n            }\n          });\n          pulse2.modifies(m2.field);\n        }\n        if (reflow2) {\n          pulse2.mod = rem2.length || remp.length ? tuples.filter((t4) => cur[tupleid(t4)] > 0) : tuples.slice();\n        } else {\n          for (id2 in out) pulse2.mod.push(out[id2]);\n        }\n        if (clean || clean == null && (rem2.length || remp.length)) {\n          pulse2.clean(true);\n        }\n        return pulse2;\n      }\n    };\n  }\n  const CACHE = \"_:mod:_\";\n  function Parameters() {\n    Object.defineProperty(this, CACHE, {\n      writable: true,\n      value: {}\n    });\n  }\n  Parameters.prototype = {\n    /**\n     * Set a parameter value. If the parameter value changes, the parameter\n     * will be recorded as modified.\n     * @param {string} name - The parameter name.\n     * @param {number} index - The index into an array-value parameter. Ignored if\n     *   the argument is undefined, null or less than zero.\n     * @param {*} value - The parameter value to set.\n     * @param {boolean} [force=false] - If true, records the parameter as modified\n     *   even if the value is unchanged.\n     * @return {Parameters} - This parameter object.\n     */\n    set(name, index2, value2, force2) {\n      const o = this, v = o[name], mod = o[CACHE];\n      if (index2 != null && index2 >= 0) {\n        if (v[index2] !== value2 || force2) {\n          v[index2] = value2;\n          mod[index2 + \":\" + name] = -1;\n          mod[name] = -1;\n        }\n      } else if (v !== value2 || force2) {\n        o[name] = value2;\n        mod[name] = isArray(value2) ? 1 + value2.length : -1;\n      }\n      return o;\n    },\n    /**\n     * Tests if one or more parameters has been modified. If invoked with no\n     * arguments, returns true if any parameter value has changed. If the first\n     * argument is array, returns trues if any parameter name in the array has\n     * changed. Otherwise, tests if the given name and optional array index has\n     * changed.\n     * @param {string} name - The parameter name to test.\n     * @param {number} [index=undefined] - The parameter array index to test.\n     * @return {boolean} - Returns true if a queried parameter was modified.\n     */\n    modified(name, index2) {\n      const mod = this[CACHE];\n      if (!arguments.length) {\n        for (const k in mod) {\n          if (mod[k]) return true;\n        }\n        return false;\n      } else if (isArray(name)) {\n        for (let k = 0; k < name.length; ++k) {\n          if (mod[name[k]]) return true;\n        }\n        return false;\n      }\n      return index2 != null && index2 >= 0 ? index2 + 1 < mod[name] || !!mod[index2 + \":\" + name] : !!mod[name];\n    },\n    /**\n     * Clears the modification records. After calling this method,\n     * all parameters are considered unmodified.\n     */\n    clear() {\n      this[CACHE] = {};\n      return this;\n    }\n  };\n  let OP_ID = 0;\n  const PULSE = \"pulse\", NO_PARAMS = new Parameters();\n  const SKIP$1$1 = 1, MODIFIED = 2;\n  function Operator(init2, update2, params2, react) {\n    this.id = ++OP_ID;\n    this.value = init2;\n    this.stamp = -1;\n    this.rank = -1;\n    this.qrank = -1;\n    this.flags = 0;\n    if (update2) {\n      this._update = update2;\n    }\n    if (params2) this.parameters(params2, react);\n  }\n  function flag(bit) {\n    return function(state) {\n      const f = this.flags;\n      if (arguments.length === 0) return !!(f & bit);\n      this.flags = state ? f | bit : f & ~bit;\n      return this;\n    };\n  }\n  Operator.prototype = {\n    /**\n     * Returns a list of target operators dependent on this operator.\n     * If this list does not exist, it is created and then returned.\n     * @return {UniqueList}\n     */\n    targets() {\n      return this._targets || (this._targets = UniqueList(id));\n    },\n    /**\n     * Sets the value of this operator.\n     * @param {*} value - the value to set.\n     * @return {Number} Returns 1 if the operator value has changed\n     *   according to strict equality, returns 0 otherwise.\n     */\n    set(value2) {\n      if (this.value !== value2) {\n        this.value = value2;\n        return 1;\n      } else {\n        return 0;\n      }\n    },\n    /**\n     * Indicates that operator evaluation should be skipped on the next pulse.\n     * This operator will still propagate incoming pulses, but its update function\n     * will not be invoked. The skip flag is reset after every pulse, so calling\n     * this method will affect processing of the next pulse only.\n     */\n    skip: flag(SKIP$1$1),\n    /**\n     * Indicates that this operator's value has been modified on its most recent\n     * pulse. Normally modification is checked via strict equality; however, in\n     * some cases it is more efficient to update the internal state of an object.\n     * In those cases, the modified flag can be used to trigger propagation. Once\n     * set, the modification flag persists across pulses until unset. The flag can\n     * be used with the last timestamp to test if a modification is recent.\n     */\n    modified: flag(MODIFIED),\n    /**\n     * Sets the parameters for this operator. The parameter values are analyzed for\n     * operator instances. If found, this operator will be added as a dependency\n     * of the parameterizing operator. Operator values are dynamically marshalled\n     * from each operator parameter prior to evaluation. If a parameter value is\n     * an array, the array will also be searched for Operator instances. However,\n     * the search does not recurse into sub-arrays or object properties.\n     * @param {object} params - A hash of operator parameters.\n     * @param {boolean} [react=true] - A flag indicating if this operator should\n     *   automatically update (react) when parameter values change. In other words,\n     *   this flag determines if the operator registers itself as a listener on\n     *   any upstream operators included in the parameters.\n     * @param {boolean} [initonly=false] - A flag indicating if this operator\n     *   should calculate an update only upon its initial evaluation, then\n     *   deregister dependencies and suppress all future update invocations.\n     * @return {Operator[]} - An array of upstream dependencies.\n     */\n    parameters(params2, react, initonly) {\n      react = react !== false;\n      const argval = this._argval = this._argval || new Parameters(), argops = this._argops = this._argops || [], deps = [];\n      let name, value2, n, i;\n      const add2 = (name2, index2, value3) => {\n        if (value3 instanceof Operator) {\n          if (value3 !== this) {\n            if (react) value3.targets().add(this);\n            deps.push(value3);\n          }\n          argops.push({\n            op: value3,\n            name: name2,\n            index: index2\n          });\n        } else {\n          argval.set(name2, index2, value3);\n        }\n      };\n      for (name in params2) {\n        value2 = params2[name];\n        if (name === PULSE) {\n          array$5(value2).forEach((op) => {\n            if (!(op instanceof Operator)) {\n              error(\"Pulse parameters must be operator instances.\");\n            } else if (op !== this) {\n              op.targets().add(this);\n              deps.push(op);\n            }\n          });\n          this.source = value2;\n        } else if (isArray(value2)) {\n          argval.set(name, -1, Array(n = value2.length));\n          for (i = 0; i < n; ++i) add2(name, i, value2[i]);\n        } else {\n          add2(name, -1, value2);\n        }\n      }\n      this.marshall().clear();\n      if (initonly) argops.initonly = true;\n      return deps;\n    },\n    /**\n     * Internal method for marshalling parameter values.\n     * Visits each operator dependency to pull the latest value.\n     * @return {Parameters} A Parameters object to pass to the update function.\n     */\n    marshall(stamp) {\n      const argval = this._argval || NO_PARAMS, argops = this._argops;\n      let item, i, op, mod;\n      if (argops) {\n        const n = argops.length;\n        for (i = 0; i < n; ++i) {\n          item = argops[i];\n          op = item.op;\n          mod = op.modified() && op.stamp === stamp;\n          argval.set(item.name, item.index, op.value, mod);\n        }\n        if (argops.initonly) {\n          for (i = 0; i < n; ++i) {\n            item = argops[i];\n            item.op.targets().remove(this);\n          }\n          this._argops = null;\n          this._update = null;\n        }\n      }\n      return argval;\n    },\n    /**\n     * Detach this operator from the dataflow.\n     * Unregisters listeners on upstream dependencies.\n     */\n    detach() {\n      const argops = this._argops;\n      let i, n, item, op;\n      if (argops) {\n        for (i = 0, n = argops.length; i < n; ++i) {\n          item = argops[i];\n          op = item.op;\n          if (op._targets) {\n            op._targets.remove(this);\n          }\n        }\n      }\n      this.pulse = null;\n      this.source = null;\n    },\n    /**\n     * Delegate method to perform operator processing.\n     * Subclasses can override this method to perform custom processing.\n     * By default, it marshalls parameters and calls the update function\n     * if that function is defined. If the update function does not\n     * change the operator value then StopPropagation is returned.\n     * If no update function is defined, this method does nothing.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return The output pulse or StopPropagation. A falsy return value\n     *   (including undefined) will let the input pulse pass through.\n     */\n    evaluate(pulse2) {\n      const update2 = this._update;\n      if (update2) {\n        const params2 = this.marshall(pulse2.stamp), v = update2.call(this, params2, pulse2);\n        params2.clear();\n        if (v !== this.value) {\n          this.value = v;\n        } else if (!this.modified()) {\n          return pulse2.StopPropagation;\n        }\n      }\n    },\n    /**\n     * Run this operator for the current pulse. If this operator has already\n     * been run at (or after) the pulse timestamp, returns StopPropagation.\n     * Internally, this method calls {@link evaluate} to perform processing.\n     * If {@link evaluate} returns a falsy value, the input pulse is returned.\n     * This method should NOT be overridden, instead overrride {@link evaluate}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return the output pulse for this operator (or StopPropagation)\n     */\n    run(pulse2) {\n      if (pulse2.stamp < this.stamp) return pulse2.StopPropagation;\n      let rv;\n      if (this.skip()) {\n        this.skip(false);\n        rv = 0;\n      } else {\n        rv = this.evaluate(pulse2);\n      }\n      return this.pulse = rv || pulse2;\n    }\n  };\n  function add$4(init2, update2, params2, react) {\n    let shift = 1, op;\n    if (init2 instanceof Operator) {\n      op = init2;\n    } else if (init2 && init2.prototype instanceof Operator) {\n      op = new init2();\n    } else if (isFunction(init2)) {\n      op = new Operator(null, init2);\n    } else {\n      shift = 0;\n      op = new Operator(init2, update2);\n    }\n    this.rank(op);\n    if (shift) {\n      react = params2;\n      params2 = update2;\n    }\n    if (params2) this.connect(op, op.parameters(params2, react));\n    this.touch(op);\n    return op;\n  }\n  function connect(target2, sources) {\n    const targetRank = target2.rank, n = sources.length;\n    for (let i = 0; i < n; ++i) {\n      if (targetRank < sources[i].rank) {\n        this.rerank(target2);\n        return;\n      }\n    }\n  }\n  let STREAM_ID = 0;\n  function EventStream(filter2, apply2, receive) {\n    this.id = ++STREAM_ID;\n    this.value = null;\n    if (receive) this.receive = receive;\n    if (filter2) this._filter = filter2;\n    if (apply2) this._apply = apply2;\n  }\n  function stream(filter2, apply2, receive) {\n    return new EventStream(filter2, apply2, receive);\n  }\n  EventStream.prototype = {\n    _filter: truthy,\n    _apply: identity$7,\n    targets() {\n      return this._targets || (this._targets = UniqueList(id));\n    },\n    consume(_) {\n      if (!arguments.length) return !!this._consume;\n      this._consume = !!_;\n      return this;\n    },\n    receive(evt) {\n      if (this._filter(evt)) {\n        const val = this.value = this._apply(evt), trg = this._targets, n = trg ? trg.length : 0;\n        for (let i = 0; i < n; ++i) trg[i].receive(val);\n        if (this._consume) {\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n      }\n    },\n    filter(filter2) {\n      const s = stream(filter2);\n      this.targets().add(s);\n      return s;\n    },\n    apply(apply2) {\n      const s = stream(null, apply2);\n      this.targets().add(s);\n      return s;\n    },\n    merge() {\n      const s = stream();\n      this.targets().add(s);\n      for (let i = 0, n = arguments.length; i < n; ++i) {\n        arguments[i].targets().add(s);\n      }\n      return s;\n    },\n    throttle(pause) {\n      let t = -1;\n      return this.filter(() => {\n        const now2 = Date.now();\n        if (now2 - t > pause) {\n          t = now2;\n          return 1;\n        } else {\n          return 0;\n        }\n      });\n    },\n    debounce(delay) {\n      const s = stream();\n      this.targets().add(stream(null, null, debounce$1(delay, (e) => {\n        const df = e.dataflow;\n        s.receive(e);\n        if (df && df.run) df.run();\n      })));\n      return s;\n    },\n    between(a2, b2) {\n      let active = false;\n      a2.targets().add(stream(null, null, () => active = true));\n      b2.targets().add(stream(null, null, () => active = false));\n      return this.filter(() => active);\n    },\n    detach() {\n      this._filter = truthy;\n      this._targets = null;\n    }\n  };\n  function events$1(source2, type2, filter2, apply2) {\n    const df = this, s = stream(filter2, apply2), send = function(e) {\n      e.dataflow = df;\n      try {\n        s.receive(e);\n      } catch (error2) {\n        df.error(error2);\n      } finally {\n        df.run();\n      }\n    };\n    let sources;\n    if (typeof source2 === \"string\" && typeof document !== \"undefined\") {\n      sources = document.querySelectorAll(source2);\n    } else {\n      sources = array$5(source2);\n    }\n    const n = sources.length;\n    for (let i = 0; i < n; ++i) {\n      sources[i].addEventListener(type2, send);\n    }\n    return s;\n  }\n  function parse$5(data2, format2) {\n    const locale2 = this.locale();\n    return read(data2, format2, locale2.timeParse, locale2.utcParse);\n  }\n  function ingest(target2, data2, format2) {\n    data2 = this.parse(data2, format2);\n    return this.pulse(target2, this.changeset().insert(data2));\n  }\n  async function request(url, format2) {\n    const df = this;\n    let status = 0, data2;\n    try {\n      data2 = await df.loader().load(url, {\n        context: \"dataflow\",\n        response: responseType(format2 && format2.type)\n      });\n      try {\n        data2 = df.parse(data2, format2);\n      } catch (err) {\n        status = -2;\n        df.warn(\"Data ingestion failed\", url, err);\n      }\n    } catch (err) {\n      status = -1;\n      df.warn(\"Loading failed\", url, err);\n    }\n    return {\n      data: data2,\n      status\n    };\n  }\n  async function preload(target2, url, format2) {\n    const df = this, pending = df._pending || loadPending(df);\n    pending.requests += 1;\n    const res = await df.request(url, format2);\n    df.pulse(target2, df.changeset().remove(truthy).insert(res.data || []));\n    pending.done();\n    return res;\n  }\n  function loadPending(df) {\n    let accept;\n    const pending = new Promise((a2) => accept = a2);\n    pending.requests = 0;\n    pending.done = () => {\n      if (--pending.requests === 0) {\n        df._pending = null;\n        accept(df);\n      }\n    };\n    return df._pending = pending;\n  }\n  const SKIP$2 = {\n    skip: true\n  };\n  function on(source2, target2, update2, params2, options) {\n    const fn2 = source2 instanceof Operator ? onOperator : onStream;\n    fn2(this, source2, target2, update2, params2, options);\n    return this;\n  }\n  function onStream(df, stream2, target2, update2, params2, options) {\n    const opt = extend$1({}, options, SKIP$2);\n    let func, op;\n    if (!isFunction(target2)) target2 = constant$5(target2);\n    if (update2 === void 0) {\n      func = (e) => df.touch(target2(e));\n    } else if (isFunction(update2)) {\n      op = new Operator(null, update2, params2, false);\n      func = (e) => {\n        op.evaluate(e);\n        const t = target2(e), v = op.value;\n        isChangeSet(v) ? df.pulse(t, v, options) : df.update(t, v, opt);\n      };\n    } else {\n      func = (e) => df.update(target2(e), update2, opt);\n    }\n    stream2.apply(func);\n  }\n  function onOperator(df, source2, target2, update2, params2, options) {\n    if (update2 === void 0) {\n      source2.targets().add(target2);\n    } else {\n      const opt = options || {}, op = new Operator(null, updater(target2, update2), params2, false);\n      op.modified(opt.force);\n      op.rank = source2.rank;\n      source2.targets().add(op);\n      if (target2) {\n        op.skip(true);\n        op.value = target2.value;\n        op.targets().add(target2);\n        df.connect(target2, [op]);\n      }\n    }\n  }\n  function updater(target2, update2) {\n    update2 = isFunction(update2) ? update2 : constant$5(update2);\n    return target2 ? function(_, pulse2) {\n      const value2 = update2(_, pulse2);\n      if (!target2.skip()) {\n        target2.skip(value2 !== this.value).value = value2;\n      }\n      return value2;\n    } : update2;\n  }\n  function rank(op) {\n    op.rank = ++this._rank;\n  }\n  function rerank(op) {\n    const queue = [op];\n    let cur, list, i;\n    while (queue.length) {\n      this.rank(cur = queue.pop());\n      if (list = cur._targets) {\n        for (i = list.length; --i >= 0; ) {\n          queue.push(cur = list[i]);\n          if (cur === op) error(\"Cycle detected in dataflow graph.\");\n        }\n      }\n    }\n  }\n  const StopPropagation = {};\n  const ADD = 1 << 0, REM = 1 << 1, MOD$1 = 1 << 2, ADD_REM = ADD | REM, ADD_MOD = ADD | MOD$1, ALL = ADD | REM | MOD$1, REFLOW = 1 << 3, SOURCE = 1 << 4, NO_SOURCE = 1 << 5, NO_FIELDS = 1 << 6;\n  function Pulse(dataflow, stamp, encode2) {\n    this.dataflow = dataflow;\n    this.stamp = stamp == null ? -1 : stamp;\n    this.add = [];\n    this.rem = [];\n    this.mod = [];\n    this.fields = null;\n    this.encode = encode2 || null;\n  }\n  function materialize(data2, filter2) {\n    const out = [];\n    visitArray(data2, filter2, (_) => out.push(_));\n    return out;\n  }\n  function filter$1(pulse2, flags) {\n    const map2 = {};\n    pulse2.visit(flags, (t) => {\n      map2[tupleid(t)] = 1;\n    });\n    return (t) => map2[tupleid(t)] ? null : t;\n  }\n  function addFilter(a2, b2) {\n    return a2 ? (t, i) => a2(t, i) && b2(t, i) : b2;\n  }\n  Pulse.prototype = {\n    /**\n     * Sentinel value indicating pulse propagation should stop.\n     */\n    StopPropagation,\n    /**\n     * Boolean flag indicating ADD (added) tuples.\n     */\n    ADD,\n    /**\n     * Boolean flag indicating REM (removed) tuples.\n     */\n    REM,\n    /**\n     * Boolean flag indicating MOD (modified) tuples.\n     */\n    MOD: MOD$1,\n    /**\n     * Boolean flag indicating ADD (added) and REM (removed) tuples.\n     */\n    ADD_REM,\n    /**\n     * Boolean flag indicating ADD (added) and MOD (modified) tuples.\n     */\n    ADD_MOD,\n    /**\n     * Boolean flag indicating ADD, REM and MOD tuples.\n     */\n    ALL,\n    /**\n     * Boolean flag indicating all tuples in a data source\n     * except for the ADD, REM and MOD tuples.\n     */\n    REFLOW,\n    /**\n     * Boolean flag indicating a 'pass-through' to a\n     * backing data source, ignoring ADD, REM and MOD tuples.\n     */\n    SOURCE,\n    /**\n     * Boolean flag indicating that source data should be\n     * suppressed when creating a forked pulse.\n     */\n    NO_SOURCE,\n    /**\n     * Boolean flag indicating that field modifications should be\n     * suppressed when creating a forked pulse.\n     */\n    NO_FIELDS,\n    /**\n     * Creates a new pulse based on the values of this pulse.\n     * The dataflow, time stamp and field modification values are copied over.\n     * By default, new empty ADD, REM and MOD arrays are created.\n     * @param {number} flags - Integer of boolean flags indicating which (if any)\n     *   tuple arrays should be copied to the new pulse. The supported flag values\n     *   are ADD, REM and MOD. Array references are copied directly: new array\n     *   instances are not created.\n     * @return {Pulse} - The forked pulse instance.\n     * @see init\n     */\n    fork(flags) {\n      return new Pulse(this.dataflow).init(this, flags);\n    },\n    /**\n     * Creates a copy of this pulse with new materialized array\n     * instances for the ADD, REM, MOD, and SOURCE arrays.\n     * The dataflow, time stamp and field modification values are copied over.\n     * @return {Pulse} - The cloned pulse instance.\n     * @see init\n     */\n    clone() {\n      const p = this.fork(ALL);\n      p.add = p.add.slice();\n      p.rem = p.rem.slice();\n      p.mod = p.mod.slice();\n      if (p.source) p.source = p.source.slice();\n      return p.materialize(ALL | SOURCE);\n    },\n    /**\n     * Returns a pulse that adds all tuples from a backing source. This is\n     * useful for cases where operators are added to a dataflow after an\n     * upstream data pipeline has already been processed, ensuring that\n     * new operators can observe all tuples within a stream.\n     * @return {Pulse} - A pulse instance with all source tuples included\n     *   in the add array. If the current pulse already has all source\n     *   tuples in its add array, it is returned directly. If the current\n     *   pulse does not have a backing source, it is returned directly.\n     */\n    addAll() {\n      let p = this;\n      const reuse = !p.source || p.add === p.rem || !p.rem.length && p.source.length === p.add.length;\n      if (reuse) {\n        return p;\n      } else {\n        p = new Pulse(this.dataflow).init(this);\n        p.add = p.source;\n        p.rem = [];\n        return p;\n      }\n    },\n    /**\n     * Initialize this pulse based on the values of another pulse. This method\n     * is used internally by {@link fork} to initialize a new forked tuple.\n     * The dataflow, time stamp and field modification values are copied over.\n     * By default, new empty ADD, REM and MOD arrays are created.\n     * @param {Pulse} src - The source pulse to copy from.\n     * @param {number} flags - Integer of boolean flags indicating which (if any)\n     *   tuple arrays should be copied to the new pulse. The supported flag values\n     *   are ADD, REM and MOD. Array references are copied directly: new array\n     *   instances are not created. By default, source data arrays are copied\n     *   to the new pulse. Use the NO_SOURCE flag to enforce a null source.\n     * @return {Pulse} - Returns this Pulse instance.\n     */\n    init(src, flags) {\n      const p = this;\n      p.stamp = src.stamp;\n      p.encode = src.encode;\n      if (src.fields && !(flags & NO_FIELDS)) {\n        p.fields = src.fields;\n      }\n      if (flags & ADD) {\n        p.addF = src.addF;\n        p.add = src.add;\n      } else {\n        p.addF = null;\n        p.add = [];\n      }\n      if (flags & REM) {\n        p.remF = src.remF;\n        p.rem = src.rem;\n      } else {\n        p.remF = null;\n        p.rem = [];\n      }\n      if (flags & MOD$1) {\n        p.modF = src.modF;\n        p.mod = src.mod;\n      } else {\n        p.modF = null;\n        p.mod = [];\n      }\n      if (flags & NO_SOURCE) {\n        p.srcF = null;\n        p.source = null;\n      } else {\n        p.srcF = src.srcF;\n        p.source = src.source;\n        if (src.cleans) p.cleans = src.cleans;\n      }\n      return p;\n    },\n    /**\n     * Schedules a function to run after pulse propagation completes.\n     * @param {function} func - The function to run.\n     */\n    runAfter(func) {\n      this.dataflow.runAfter(func);\n    },\n    /**\n     * Indicates if tuples have been added, removed or modified.\n     * @param {number} [flags] - The tuple types (ADD, REM or MOD) to query.\n     *   Defaults to ALL, returning true if any tuple type has changed.\n     * @return {boolean} - Returns true if one or more queried tuple types have\n     *   changed, false otherwise.\n     */\n    changed(flags) {\n      const f = flags || ALL;\n      return f & ADD && this.add.length || f & REM && this.rem.length || f & MOD$1 && this.mod.length;\n    },\n    /**\n     * Forces a \"reflow\" of tuple values, such that all tuples in the backing\n     * source are added to the MOD set, unless already present in the ADD set.\n     * @param {boolean} [fork=false] - If true, returns a forked copy of this\n     *   pulse, and invokes reflow on that derived pulse.\n     * @return {Pulse} - The reflowed pulse instance.\n     */\n    reflow(fork) {\n      if (fork) return this.fork(ALL).reflow();\n      const len2 = this.add.length, src = this.source && this.source.length;\n      if (src && src !== len2) {\n        this.mod = this.source;\n        if (len2) this.filter(MOD$1, filter$1(this, ADD));\n      }\n      return this;\n    },\n    /**\n     * Get/set metadata to pulse requesting garbage collection\n     * to reclaim currently unused resources.\n     */\n    clean(value2) {\n      if (arguments.length) {\n        this.cleans = !!value2;\n        return this;\n      } else {\n        return this.cleans;\n      }\n    },\n    /**\n     * Marks one or more data field names as modified to assist dependency\n     * tracking and incremental processing by transform operators.\n     * @param {string|Array<string>} _ - The field(s) to mark as modified.\n     * @return {Pulse} - This pulse instance.\n     */\n    modifies(_) {\n      const hash = this.fields || (this.fields = {});\n      if (isArray(_)) {\n        _.forEach((f) => hash[f] = true);\n      } else {\n        hash[_] = true;\n      }\n      return this;\n    },\n    /**\n     * Checks if one or more data fields have been modified during this pulse\n     * propagation timestamp.\n     * @param {string|Array<string>} _ - The field(s) to check for modified.\n     * @param {boolean} nomod - If true, will check the modified flag even if\n     *   no mod tuples exist. If false (default), mod tuples must be present.\n     * @return {boolean} - Returns true if any of the provided fields has been\n     *   marked as modified, false otherwise.\n     */\n    modified(_, nomod) {\n      const fields = this.fields;\n      return !((nomod || this.mod.length) && fields) ? false : !arguments.length ? !!fields : isArray(_) ? _.some((f) => fields[f]) : fields[_];\n    },\n    /**\n     * Adds a filter function to one more tuple sets. Filters are applied to\n     * backing tuple arrays, to determine the actual set of tuples considered\n     * added, removed or modified. They can be used to delay materialization of\n     * a tuple set in order to avoid expensive array copies. In addition, the\n     * filter functions can serve as value transformers: unlike standard predicate\n     * function (which return boolean values), Pulse filters should return the\n     * actual tuple value to process. If a tuple set is already filtered, the\n     * new filter function will be appended into a conjuntive ('and') query.\n     * @param {number} flags - Flags indicating the tuple set(s) to filter.\n     * @param {function(*):object} filter - Filter function that will be applied\n     *   to the tuple set array, and should return a data tuple if the value\n     *   should be included in the tuple set, and falsy (or null) otherwise.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    filter(flags, filter2) {\n      const p = this;\n      if (flags & ADD) p.addF = addFilter(p.addF, filter2);\n      if (flags & REM) p.remF = addFilter(p.remF, filter2);\n      if (flags & MOD$1) p.modF = addFilter(p.modF, filter2);\n      if (flags & SOURCE) p.srcF = addFilter(p.srcF, filter2);\n      return p;\n    },\n    /**\n     * Materialize one or more tuple sets in this pulse. If the tuple set(s) have\n     * a registered filter function, it will be applied and the tuple set(s) will\n     * be replaced with materialized tuple arrays.\n     * @param {number} flags - Flags indicating the tuple set(s) to materialize.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    materialize(flags) {\n      flags = flags || ALL;\n      const p = this;\n      if (flags & ADD && p.addF) {\n        p.add = materialize(p.add, p.addF);\n        p.addF = null;\n      }\n      if (flags & REM && p.remF) {\n        p.rem = materialize(p.rem, p.remF);\n        p.remF = null;\n      }\n      if (flags & MOD$1 && p.modF) {\n        p.mod = materialize(p.mod, p.modF);\n        p.modF = null;\n      }\n      if (flags & SOURCE && p.srcF) {\n        p.source = p.source.filter(p.srcF);\n        p.srcF = null;\n      }\n      return p;\n    },\n    /**\n     * Visit one or more tuple sets in this pulse.\n     * @param {number} flags - Flags indicating the tuple set(s) to visit.\n     *   Legal values are ADD, REM, MOD and SOURCE (if a backing data source\n     *   has been set).\n     * @param {function(object):*} - Visitor function invoked per-tuple.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    visit(flags, visitor) {\n      const p = this, v = visitor;\n      if (flags & SOURCE) {\n        visitArray(p.source, p.srcF, v);\n        return p;\n      }\n      if (flags & ADD) visitArray(p.add, p.addF, v);\n      if (flags & REM) visitArray(p.rem, p.remF, v);\n      if (flags & MOD$1) visitArray(p.mod, p.modF, v);\n      const src = p.source;\n      if (flags & REFLOW && src) {\n        const sum2 = p.add.length + p.mod.length;\n        if (sum2 === src.length) ;\n        else if (sum2) {\n          visitArray(src, filter$1(p, ADD_MOD), v);\n        } else {\n          visitArray(src, p.srcF, v);\n        }\n      }\n      return p;\n    }\n  };\n  function MultiPulse(dataflow, stamp, pulses, encode2) {\n    const p = this;\n    let c2 = 0;\n    this.dataflow = dataflow;\n    this.stamp = stamp;\n    this.fields = null;\n    this.encode = encode2 || null;\n    this.pulses = pulses;\n    for (const pulse2 of pulses) {\n      if (pulse2.stamp !== stamp) continue;\n      if (pulse2.fields) {\n        const hash = p.fields || (p.fields = {});\n        for (const f in pulse2.fields) {\n          hash[f] = 1;\n        }\n      }\n      if (pulse2.changed(p.ADD)) c2 |= p.ADD;\n      if (pulse2.changed(p.REM)) c2 |= p.REM;\n      if (pulse2.changed(p.MOD)) c2 |= p.MOD;\n    }\n    this.changes = c2;\n  }\n  inherits(MultiPulse, Pulse, {\n    /**\n     * Creates a new pulse based on the values of this pulse.\n     * The dataflow, time stamp and field modification values are copied over.\n     * @return {Pulse}\n     */\n    fork(flags) {\n      const p = new Pulse(this.dataflow).init(this, flags & this.NO_FIELDS);\n      if (flags !== void 0) {\n        if (flags & p.ADD) this.visit(p.ADD, (t) => p.add.push(t));\n        if (flags & p.REM) this.visit(p.REM, (t) => p.rem.push(t));\n        if (flags & p.MOD) this.visit(p.MOD, (t) => p.mod.push(t));\n      }\n      return p;\n    },\n    changed(flags) {\n      return this.changes & flags;\n    },\n    modified(_) {\n      const p = this, fields = p.fields;\n      return !(fields && p.changes & p.MOD) ? 0 : isArray(_) ? _.some((f) => fields[f]) : fields[_];\n    },\n    filter() {\n      error(\"MultiPulse does not support filtering.\");\n    },\n    materialize() {\n      error(\"MultiPulse does not support materialization.\");\n    },\n    visit(flags, visitor) {\n      const p = this, pulses = p.pulses, n = pulses.length;\n      let i = 0;\n      if (flags & p.SOURCE) {\n        for (; i < n; ++i) {\n          pulses[i].visit(flags, visitor);\n        }\n      } else {\n        for (; i < n; ++i) {\n          if (pulses[i].stamp === p.stamp) {\n            pulses[i].visit(flags, visitor);\n          }\n        }\n      }\n      return p;\n    }\n  });\n  async function evaluate(encode2, prerun, postrun) {\n    const df = this, async = [];\n    if (df._pulse) return reentrant(df);\n    if (df._pending) await df._pending;\n    if (prerun) await asyncCallback(df, prerun);\n    if (!df._touched.length) {\n      df.debug(\"Dataflow invoked, but nothing to do.\");\n      return df;\n    }\n    const stamp = ++df._clock;\n    df._pulse = new Pulse(df, stamp, encode2);\n    df._touched.forEach((op2) => df._enqueue(op2, true));\n    df._touched = UniqueList(id);\n    let count2 = 0, op, next, error2;\n    try {\n      while (df._heap.size() > 0) {\n        op = df._heap.pop();\n        if (op.rank !== op.qrank) {\n          df._enqueue(op, true);\n          continue;\n        }\n        next = op.run(df._getPulse(op, encode2));\n        if (next.then) {\n          next = await next;\n        } else if (next.async) {\n          async.push(next.async);\n          next = StopPropagation;\n        }\n        if (next !== StopPropagation) {\n          if (op._targets) op._targets.forEach((op2) => df._enqueue(op2));\n        }\n        ++count2;\n      }\n    } catch (err) {\n      df._heap.clear();\n      error2 = err;\n    }\n    df._input = {};\n    df._pulse = null;\n    df.debug(`Pulse ${stamp}: ${count2} operators`);\n    if (error2) {\n      df._postrun = [];\n      df.error(error2);\n    }\n    if (df._postrun.length) {\n      const pr = df._postrun.sort((a2, b2) => b2.priority - a2.priority);\n      df._postrun = [];\n      for (let i = 0; i < pr.length; ++i) {\n        await asyncCallback(df, pr[i].callback);\n      }\n    }\n    if (postrun) await asyncCallback(df, postrun);\n    if (async.length) {\n      Promise.all(async).then((cb) => df.runAsync(null, () => {\n        cb.forEach((f) => {\n          try {\n            f(df);\n          } catch (err) {\n            df.error(err);\n          }\n        });\n      }));\n    }\n    return df;\n  }\n  async function runAsync(encode2, prerun, postrun) {\n    while (this._running) await this._running;\n    const clear = () => this._running = null;\n    (this._running = this.evaluate(encode2, prerun, postrun)).then(clear, clear);\n    return this._running;\n  }\n  function run(encode2, prerun, postrun) {\n    return this._pulse ? reentrant(this) : (this.evaluate(encode2, prerun, postrun), this);\n  }\n  function runAfter(callback, enqueue2, priority) {\n    if (this._pulse || enqueue2) {\n      this._postrun.push({\n        priority: priority || 0,\n        callback\n      });\n    } else {\n      try {\n        callback(this);\n      } catch (err) {\n        this.error(err);\n      }\n    }\n  }\n  function reentrant(df) {\n    df.error(\"Dataflow already running. Use runAsync() to chain invocations.\");\n    return df;\n  }\n  function enqueue(op, force2) {\n    const q = op.stamp < this._clock;\n    if (q) op.stamp = this._clock;\n    if (q || force2) {\n      op.qrank = op.rank;\n      this._heap.push(op);\n    }\n  }\n  function getPulse(op, encode2) {\n    const s = op.source, stamp = this._clock;\n    return s && isArray(s) ? new MultiPulse(this, stamp, s.map((_) => _.pulse), encode2) : this._input[op.id] || singlePulse(this._pulse, s && s.pulse);\n  }\n  function singlePulse(p, s) {\n    if (s && s.stamp === p.stamp) {\n      return s;\n    }\n    p = p.fork();\n    if (s && s !== StopPropagation) {\n      p.source = s.source;\n    }\n    return p;\n  }\n  const NO_OPT = {\n    skip: false,\n    force: false\n  };\n  function touch(op, options) {\n    const opt = options || NO_OPT;\n    if (this._pulse) {\n      this._enqueue(op);\n    } else {\n      this._touched.add(op);\n    }\n    if (opt.skip) op.skip(true);\n    return this;\n  }\n  function update$6(op, value2, options) {\n    const opt = options || NO_OPT;\n    if (op.set(value2) || opt.force) {\n      this.touch(op, opt);\n    }\n    return this;\n  }\n  function pulse(op, changeset2, options) {\n    this.touch(op, options || NO_OPT);\n    const p = new Pulse(this, this._clock + (this._pulse ? 0 : 1)), t = op.pulse && op.pulse.source || [];\n    p.target = op;\n    this._input[op.id] = changeset2.pulse(p, t);\n    return this;\n  }\n  function Heap(cmp) {\n    let nodes = [];\n    return {\n      clear: () => nodes = [],\n      size: () => nodes.length,\n      peek: () => nodes[0],\n      push: (x2) => {\n        nodes.push(x2);\n        return siftdown(nodes, 0, nodes.length - 1, cmp);\n      },\n      pop: () => {\n        const last = nodes.pop();\n        let item;\n        if (nodes.length) {\n          item = nodes[0];\n          nodes[0] = last;\n          siftup(nodes, 0, cmp);\n        } else {\n          item = last;\n        }\n        return item;\n      }\n    };\n  }\n  function siftdown(array2, start, idx, cmp) {\n    let parent, pidx;\n    const item = array2[idx];\n    while (idx > start) {\n      pidx = idx - 1 >> 1;\n      parent = array2[pidx];\n      if (cmp(item, parent) < 0) {\n        array2[idx] = parent;\n        idx = pidx;\n        continue;\n      }\n      break;\n    }\n    return array2[idx] = item;\n  }\n  function siftup(array2, idx, cmp) {\n    const start = idx, end = array2.length, item = array2[idx];\n    let cidx = (idx << 1) + 1, ridx;\n    while (cidx < end) {\n      ridx = cidx + 1;\n      if (ridx < end && cmp(array2[cidx], array2[ridx]) >= 0) {\n        cidx = ridx;\n      }\n      array2[idx] = array2[cidx];\n      idx = cidx;\n      cidx = (idx << 1) + 1;\n    }\n    array2[idx] = item;\n    return siftdown(array2, start, idx, cmp);\n  }\n  function Dataflow() {\n    this.logger(logger());\n    this.logLevel(Error$1);\n    this._clock = 0;\n    this._rank = 0;\n    this._locale = defaultLocale();\n    try {\n      this._loader = loader();\n    } catch (e) {\n    }\n    this._touched = UniqueList(id);\n    this._input = {};\n    this._pulse = null;\n    this._heap = Heap((a2, b2) => a2.qrank - b2.qrank);\n    this._postrun = [];\n  }\n  function logMethod(method2) {\n    return function() {\n      return this._log[method2].apply(this, arguments);\n    };\n  }\n  Dataflow.prototype = {\n    /**\n     * The current timestamp of this dataflow. This value reflects the\n     * timestamp of the previous dataflow run. The dataflow is initialized\n     * with a stamp value of 0. The initial run of the dataflow will have\n     * a timestap of 1, and so on. This value will match the\n     * {@link Pulse.stamp} property.\n     * @return {number} - The current timestamp value.\n     */\n    stamp() {\n      return this._clock;\n    },\n    /**\n     * Gets or sets the loader instance to use for data file loading. A\n     * loader object must provide a \"load\" method for loading files and a\n     * \"sanitize\" method for checking URL/filename validity. Both methods\n     * should accept a URI and options hash as arguments, and return a Promise\n     * that resolves to the loaded file contents (load) or a hash containing\n     * sanitized URI data with the sanitized url assigned to the \"href\" property\n     * (sanitize).\n     * @param {object} _ - The loader instance to use.\n     * @return {object|Dataflow} - If no arguments are provided, returns\n     *   the current loader instance. Otherwise returns this Dataflow instance.\n     */\n    loader(_) {\n      if (arguments.length) {\n        this._loader = _;\n        return this;\n      } else {\n        return this._loader;\n      }\n    },\n    /**\n     * Gets or sets the locale instance to use for formatting and parsing\n     * string values. The locale object should be provided by the\n     * vega-format library, and include methods such as format, timeFormat,\n     * utcFormat, timeParse, and utcParse.\n     * @param {object} _ - The locale instance to use.\n     * @return {object|Dataflow} - If no arguments are provided, returns\n     *   the current locale instance. Otherwise returns this Dataflow instance.\n     */\n    locale(_) {\n      if (arguments.length) {\n        this._locale = _;\n        return this;\n      } else {\n        return this._locale;\n      }\n    },\n    /**\n     * Get or set the logger instance used to log messages. If no arguments are\n     * provided, returns the current logger instance. Otherwise, sets the logger\n     * and return this Dataflow instance. Provided loggers must support the full\n     * API of logger objects generated by the vega-util logger method. Note that\n     * by default the log level of the new logger will be used; use the logLevel\n     * method to adjust the log level as needed.\n     */\n    logger(logger2) {\n      if (arguments.length) {\n        this._log = logger2;\n        return this;\n      } else {\n        return this._log;\n      }\n    },\n    /**\n     * Logs an error message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit error messages.\n     */\n    error: logMethod(\"error\"),\n    /**\n     * Logs a warning message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit warning messages.\n     */\n    warn: logMethod(\"warn\"),\n    /**\n     * Logs a information message. By default, logged messages are written to\n     * console output. The message will only be logged if the current log level is\n     * high enough to permit information messages.\n     */\n    info: logMethod(\"info\"),\n    /**\n     * Logs a debug message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit debug messages.\n     */\n    debug: logMethod(\"debug\"),\n    /**\n     * Get or set the current log level. If an argument is provided, it\n     * will be used as the new log level.\n     * @param {number} [level] - Should be one of None, Warn, Info\n     * @return {number} - The current log level.\n     */\n    logLevel: logMethod(\"level\"),\n    /**\n     * Empty entry threshold for garbage cleaning. Map data structures will\n     * perform cleaning once the number of empty entries exceeds this value.\n     */\n    cleanThreshold: 1e4,\n    // OPERATOR REGISTRATION\n    add: add$4,\n    connect,\n    rank,\n    rerank,\n    // OPERATOR UPDATES\n    pulse,\n    touch,\n    update: update$6,\n    changeset,\n    // DATA LOADING\n    ingest,\n    parse: parse$5,\n    preload,\n    request,\n    // EVENT HANDLING\n    events: events$1,\n    on,\n    // PULSE PROPAGATION\n    evaluate,\n    run,\n    runAsync,\n    runAfter,\n    _enqueue: enqueue,\n    _getPulse: getPulse\n  };\n  function Transform(init2, params2) {\n    Operator.call(this, init2, null, params2);\n  }\n  inherits(Transform, Operator, {\n    /**\n     * Overrides {@link Operator.evaluate} for transform operators.\n     * Internally, this method calls {@link evaluate} to perform processing.\n     * If {@link evaluate} returns a falsy value, the input pulse is returned.\n     * This method should NOT be overridden, instead overrride {@link evaluate}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return the output pulse for this operator (or StopPropagation)\n     */\n    run(pulse2) {\n      if (pulse2.stamp < this.stamp) return pulse2.StopPropagation;\n      let rv;\n      if (this.skip()) {\n        this.skip(false);\n      } else {\n        rv = this.evaluate(pulse2);\n      }\n      rv = rv || pulse2;\n      if (rv.then) {\n        rv = rv.then((_) => this.pulse = _);\n      } else if (rv !== pulse2.StopPropagation) {\n        this.pulse = rv;\n      }\n      return rv;\n    },\n    /**\n     * Overrides {@link Operator.evaluate} for transform operators.\n     * Marshalls parameter values and then invokes {@link transform}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n         value (including undefined) will let the input pulse pass through.\n    */\n    evaluate(pulse2) {\n      const params2 = this.marshall(pulse2.stamp), out = this.transform(params2, pulse2);\n      params2.clear();\n      return out;\n    },\n    /**\n     * Process incoming pulses.\n     * Subclasses should override this method to implement transforms.\n     * @param {Parameters} _ - The operator parameter values.\n     * @param {Pulse} pulse - The current dataflow pulse.\n     * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n     *   value (including undefined) will let the input pulse pass through.\n     */\n    transform() {\n    }\n  });\n  const transforms = {};\n  function definition$1(type2) {\n    const t = transform$2(type2);\n    return t && t.Definition || null;\n  }\n  function transform$2(type2) {\n    type2 = type2 && type2.toLowerCase();\n    return has$1(transforms, type2) ? transforms[type2] : null;\n  }\n  function* numbers$1(values2, valueof) {\n    if (valueof == null) {\n      for (let value2 of values2) {\n        if (value2 != null && value2 !== \"\" && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        value2 = valueof(value2, ++index2, values2);\n        if (value2 != null && value2 !== \"\" && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    }\n  }\n  function quantiles(array2, p, f) {\n    const values2 = Float64Array.from(numbers$1(array2, f));\n    values2.sort(ascending$1);\n    return p.map((_) => quantileSorted(values2, _));\n  }\n  function quartiles(array2, f) {\n    return quantiles(array2, [0.25, 0.5, 0.75], f);\n  }\n  function estimateBandwidth(array2, f) {\n    const n = array2.length, d = deviation(array2, f), q = quartiles(array2, f), h2 = (q[2] - q[0]) / 1.34, v = Math.min(d, h2) || d || Math.abs(q[0]) || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n  }\n  function bin(_) {\n    const maxb = _.maxbins || 20, base2 = _.base || 10, logb = Math.log(base2), div = _.divide || [5, 2];\n    let min2 = _.extent[0], max2 = _.extent[1], step, level, minstep, v, i, n;\n    const span2 = _.span || max2 - min2 || Math.abs(min2) || 1;\n    if (_.step) {\n      step = _.step;\n    } else if (_.steps) {\n      v = span2 / maxb;\n      for (i = 0, n = _.steps.length; i < n && _.steps[i] < v; ++i) ;\n      step = _.steps[Math.max(0, i - 1)];\n    } else {\n      level = Math.ceil(Math.log(maxb) / logb);\n      minstep = _.minstep || 0;\n      step = Math.max(minstep, Math.pow(base2, Math.round(Math.log(span2) / logb) - level));\n      while (Math.ceil(span2 / step) > maxb) {\n        step *= base2;\n      }\n      for (i = 0, n = div.length; i < n; ++i) {\n        v = step / div[i];\n        if (v >= minstep && span2 / v <= maxb) step = v;\n      }\n    }\n    v = Math.log(step);\n    const precision = v >= 0 ? 0 : ~~(-v / logb) + 1, eps = Math.pow(base2, -precision - 1);\n    if (_.nice || _.nice === void 0) {\n      v = Math.floor(min2 / step + eps) * step;\n      min2 = min2 < v ? v - step : v;\n      max2 = Math.ceil(max2 / step) * step;\n    }\n    return {\n      start: min2,\n      stop: max2 === min2 ? min2 + step : max2,\n      step\n    };\n  }\n  var random = Math.random;\n  function setRandom(r) {\n    random = r;\n  }\n  function bootstrapCI(array2, samples, alpha, f) {\n    if (!array2.length) return [void 0, void 0];\n    const values2 = Float64Array.from(numbers$1(array2, f)), n = values2.length, m2 = samples;\n    let a2, i, j, mu;\n    for (j = 0, mu = Array(m2); j < m2; ++j) {\n      for (a2 = 0, i = 0; i < n; ++i) {\n        a2 += values2[~~(random() * n)];\n      }\n      mu[j] = a2 / n;\n    }\n    mu.sort(ascending$1);\n    return [quantile$1(mu, alpha / 2), quantile$1(mu, 1 - alpha / 2)];\n  }\n  function dotbin(array2, step, smooth, f) {\n    f = f || ((_) => _);\n    const n = array2.length, v = new Float64Array(n);\n    let i = 0, j = 1, a2 = f(array2[0]), b2 = a2, w2 = a2 + step, x2;\n    for (; j < n; ++j) {\n      x2 = f(array2[j]);\n      if (x2 >= w2) {\n        b2 = (a2 + b2) / 2;\n        for (; i < j; ++i) v[i] = b2;\n        w2 = x2 + step;\n        a2 = x2;\n      }\n      b2 = x2;\n    }\n    b2 = (a2 + b2) / 2;\n    for (; i < j; ++i) v[i] = b2;\n    return smooth ? smoothing(v, step + step / 4) : v;\n  }\n  function smoothing(v, thresh) {\n    const n = v.length;\n    let a2 = 0, b2 = 1, c2, d;\n    while (v[a2] === v[b2]) ++b2;\n    while (b2 < n) {\n      c2 = b2 + 1;\n      while (v[b2] === v[c2]) ++c2;\n      if (v[b2] - v[b2 - 1] < thresh) {\n        d = b2 + (a2 + c2 - b2 - b2 >> 1);\n        while (d < b2) v[d++] = v[b2];\n        while (d > b2) v[d--] = v[a2];\n      }\n      a2 = b2;\n      b2 = c2;\n    }\n    return v;\n  }\n  function lcg$2(seed) {\n    return function() {\n      seed = (1103515245 * seed + 12345) % 2147483647;\n      return seed / 2147483647;\n    };\n  }\n  function integer(min2, max2) {\n    if (max2 == null) {\n      max2 = min2;\n      min2 = 0;\n    }\n    let a2, b2, d;\n    const dist2 = {\n      min(_) {\n        if (arguments.length) {\n          a2 = _ || 0;\n          d = b2 - a2;\n          return dist2;\n        } else {\n          return a2;\n        }\n      },\n      max(_) {\n        if (arguments.length) {\n          b2 = _ || 0;\n          d = b2 - a2;\n          return dist2;\n        } else {\n          return b2;\n        }\n      },\n      sample() {\n        return a2 + Math.floor(d * random());\n      },\n      pdf(x2) {\n        return x2 === Math.floor(x2) && x2 >= a2 && x2 < b2 ? 1 / d : 0;\n      },\n      cdf(x2) {\n        const v = Math.floor(x2);\n        return v < a2 ? 0 : v >= b2 ? 1 : (v - a2 + 1) / d;\n      },\n      icdf(p) {\n        return p >= 0 && p <= 1 ? a2 - 1 + Math.floor(p * d) : NaN;\n      }\n    };\n    return dist2.min(min2).max(max2);\n  }\n  const SQRT2PI = Math.sqrt(2 * Math.PI);\n  const SQRT2 = Math.SQRT2;\n  let nextSample = NaN;\n  function sampleNormal(mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    let x2 = 0, y2 = 0, rds, c2;\n    if (nextSample === nextSample) {\n      x2 = nextSample;\n      nextSample = NaN;\n    } else {\n      do {\n        x2 = random() * 2 - 1;\n        y2 = random() * 2 - 1;\n        rds = x2 * x2 + y2 * y2;\n      } while (rds === 0 || rds > 1);\n      c2 = Math.sqrt(-2 * Math.log(rds) / rds);\n      x2 *= c2;\n      nextSample = y2 * c2;\n    }\n    return mean2 + x2 * stdev;\n  }\n  function densityNormal(value2, mean2, stdev) {\n    stdev = stdev == null ? 1 : stdev;\n    const z = (value2 - (mean2 || 0)) / stdev;\n    return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI);\n  }\n  function cumulativeNormal(value2, mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z = (value2 - mean2) / stdev, Z = Math.abs(z);\n    let cd;\n    if (Z > 37) {\n      cd = 0;\n    } else {\n      const exp2 = Math.exp(-Z * Z / 2);\n      let sum2;\n      if (Z < 7.07106781186547) {\n        sum2 = 0.0352624965998911 * Z + 0.700383064443688;\n        sum2 = sum2 * Z + 6.37396220353165;\n        sum2 = sum2 * Z + 33.912866078383;\n        sum2 = sum2 * Z + 112.079291497871;\n        sum2 = sum2 * Z + 221.213596169931;\n        sum2 = sum2 * Z + 220.206867912376;\n        cd = exp2 * sum2;\n        sum2 = 0.0883883476483184 * Z + 1.75566716318264;\n        sum2 = sum2 * Z + 16.064177579207;\n        sum2 = sum2 * Z + 86.7807322029461;\n        sum2 = sum2 * Z + 296.564248779674;\n        sum2 = sum2 * Z + 637.333633378831;\n        sum2 = sum2 * Z + 793.826512519948;\n        sum2 = sum2 * Z + 440.413735824752;\n        cd = cd / sum2;\n      } else {\n        sum2 = Z + 0.65;\n        sum2 = Z + 4 / sum2;\n        sum2 = Z + 3 / sum2;\n        sum2 = Z + 2 / sum2;\n        sum2 = Z + 1 / sum2;\n        cd = exp2 / sum2 / 2.506628274631;\n      }\n    }\n    return z > 0 ? 1 - cd : cd;\n  }\n  function quantileNormal(p, mean2, stdev) {\n    if (p < 0 || p > 1) return NaN;\n    return (mean2 || 0) + (stdev == null ? 1 : stdev) * SQRT2 * erfinv(2 * p - 1);\n  }\n  function erfinv(x2) {\n    let w2 = -Math.log((1 - x2) * (1 + x2)), p;\n    if (w2 < 6.25) {\n      w2 -= 3.125;\n      p = -364441206401782e-35;\n      p = -16850591381820166e-35 + p * w2;\n      p = 128584807152564e-32 + p * w2;\n      p = 11157877678025181e-33 + p * w2;\n      p = -1333171662854621e-31 + p * w2;\n      p = 20972767875968562e-33 + p * w2;\n      p = 6637638134358324e-30 + p * w2;\n      p = -4054566272975207e-29 + p * w2;\n      p = -8151934197605472e-29 + p * w2;\n      p = 26335093153082323e-28 + p * w2;\n      p = -12975133253453532e-27 + p * w2;\n      p = -5415412054294628e-26 + p * w2;\n      p = 10512122733215323e-25 + p * w2;\n      p = -4112633980346984e-24 + p * w2;\n      p = -29070369957882005e-24 + p * w2;\n      p = 42347877827932404e-23 + p * w2;\n      p = -13654692000834679e-22 + p * w2;\n      p = -13882523362786469e-21 + p * w2;\n      p = 18673420803405714e-20 + p * w2;\n      p = -740702534166267e-18 + p * w2;\n      p = -0.006033670871430149 + p * w2;\n      p = 0.24015818242558962 + p * w2;\n      p = 1.6536545626831027 + p * w2;\n    } else if (w2 < 16) {\n      w2 = Math.sqrt(w2) - 3.25;\n      p = 22137376921775787e-25;\n      p = 9075656193888539e-23 + p * w2;\n      p = -27517406297064545e-23 + p * w2;\n      p = 18239629214389228e-24 + p * w2;\n      p = 15027403968909828e-22 + p * w2;\n      p = -4013867526981546e-21 + p * w2;\n      p = 29234449089955446e-22 + p * w2;\n      p = 12475304481671779e-21 + p * w2;\n      p = -47318229009055734e-21 + p * w2;\n      p = 6828485145957318e-20 + p * w2;\n      p = 24031110387097894e-21 + p * w2;\n      p = -3550375203628475e-19 + p * w2;\n      p = 9532893797373805e-19 + p * w2;\n      p = -0.0016882755560235047 + p * w2;\n      p = 0.002491442096107851 + p * w2;\n      p = -0.003751208507569241 + p * w2;\n      p = 0.005370914553590064 + p * w2;\n      p = 1.0052589676941592 + p * w2;\n      p = 3.0838856104922208 + p * w2;\n    } else if (Number.isFinite(w2)) {\n      w2 = Math.sqrt(w2) - 5;\n      p = -27109920616438573e-27;\n      p = -2555641816996525e-25 + p * w2;\n      p = 15076572693500548e-25 + p * w2;\n      p = -3789465440126737e-24 + p * w2;\n      p = 761570120807834e-23 + p * w2;\n      p = -1496002662714924e-23 + p * w2;\n      p = 2914795345090108e-23 + p * w2;\n      p = -6771199775845234e-23 + p * w2;\n      p = 22900482228026655e-23 + p * w2;\n      p = -99298272942317e-20 + p * w2;\n      p = 4526062597223154e-21 + p * w2;\n      p = -1968177810553167e-20 + p * w2;\n      p = 7599527703001776e-20 + p * w2;\n      p = -21503011930044477e-20 + p * w2;\n      p = -13871931833623122e-20 + p * w2;\n      p = 1.0103004648645344 + p * w2;\n      p = 4.849906401408584 + p * w2;\n    } else {\n      p = Infinity;\n    }\n    return p * x2;\n  }\n  function gaussian(mean2, stdev) {\n    let mu, sigma;\n    const dist2 = {\n      mean(_) {\n        if (arguments.length) {\n          mu = _ || 0;\n          return dist2;\n        } else {\n          return mu;\n        }\n      },\n      stdev(_) {\n        if (arguments.length) {\n          sigma = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return sigma;\n        }\n      },\n      sample: () => sampleNormal(mu, sigma),\n      pdf: (value2) => densityNormal(value2, mu, sigma),\n      cdf: (value2) => cumulativeNormal(value2, mu, sigma),\n      icdf: (p) => quantileNormal(p, mu, sigma)\n    };\n    return dist2.mean(mean2).stdev(stdev);\n  }\n  function kde(support, bandwidth2) {\n    const kernel = gaussian();\n    let n = 0;\n    const dist2 = {\n      data(_) {\n        if (arguments.length) {\n          support = _;\n          n = _ ? _.length : 0;\n          return dist2.bandwidth(bandwidth2);\n        } else {\n          return support;\n        }\n      },\n      bandwidth(_) {\n        if (!arguments.length) return bandwidth2;\n        bandwidth2 = _;\n        if (!bandwidth2 && support) bandwidth2 = estimateBandwidth(support);\n        return dist2;\n      },\n      sample() {\n        return support[~~(random() * n)] + bandwidth2 * kernel.sample();\n      },\n      pdf(x2) {\n        let y2 = 0, i = 0;\n        for (; i < n; ++i) {\n          y2 += kernel.pdf((x2 - support[i]) / bandwidth2);\n        }\n        return y2 / bandwidth2 / n;\n      },\n      cdf(x2) {\n        let y2 = 0, i = 0;\n        for (; i < n; ++i) {\n          y2 += kernel.cdf((x2 - support[i]) / bandwidth2);\n        }\n        return y2 / n;\n      },\n      icdf() {\n        throw Error(\"KDE icdf not supported.\");\n      }\n    };\n    return dist2.data(support);\n  }\n  function sampleLogNormal(mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    return Math.exp(mean2 + sampleNormal() * stdev);\n  }\n  function densityLogNormal(value2, mean2, stdev) {\n    if (value2 <= 0) return 0;\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z = (Math.log(value2) - mean2) / stdev;\n    return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI * value2);\n  }\n  function cumulativeLogNormal(value2, mean2, stdev) {\n    return cumulativeNormal(Math.log(value2), mean2, stdev);\n  }\n  function quantileLogNormal(p, mean2, stdev) {\n    return Math.exp(quantileNormal(p, mean2, stdev));\n  }\n  function lognormal(mean2, stdev) {\n    let mu, sigma;\n    const dist2 = {\n      mean(_) {\n        if (arguments.length) {\n          mu = _ || 0;\n          return dist2;\n        } else {\n          return mu;\n        }\n      },\n      stdev(_) {\n        if (arguments.length) {\n          sigma = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return sigma;\n        }\n      },\n      sample: () => sampleLogNormal(mu, sigma),\n      pdf: (value2) => densityLogNormal(value2, mu, sigma),\n      cdf: (value2) => cumulativeLogNormal(value2, mu, sigma),\n      icdf: (p) => quantileLogNormal(p, mu, sigma)\n    };\n    return dist2.mean(mean2).stdev(stdev);\n  }\n  function mixture$1(dists, weights) {\n    let m2 = 0, w2;\n    function normalize2(x2) {\n      const w3 = [];\n      let sum2 = 0, i;\n      for (i = 0; i < m2; ++i) {\n        sum2 += w3[i] = x2[i] == null ? 1 : +x2[i];\n      }\n      for (i = 0; i < m2; ++i) {\n        w3[i] /= sum2;\n      }\n      return w3;\n    }\n    const dist2 = {\n      weights(_) {\n        if (arguments.length) {\n          w2 = normalize2(weights = _ || []);\n          return dist2;\n        }\n        return weights;\n      },\n      distributions(_) {\n        if (arguments.length) {\n          if (_) {\n            m2 = _.length;\n            dists = _;\n          } else {\n            m2 = 0;\n            dists = [];\n          }\n          return dist2.weights(weights);\n        }\n        return dists;\n      },\n      sample() {\n        const r = random();\n        let d = dists[m2 - 1], v = w2[0], i = 0;\n        for (; i < m2 - 1; v += w2[++i]) {\n          if (r < v) {\n            d = dists[i];\n            break;\n          }\n        }\n        return d.sample();\n      },\n      pdf(x2) {\n        let p = 0, i = 0;\n        for (; i < m2; ++i) {\n          p += w2[i] * dists[i].pdf(x2);\n        }\n        return p;\n      },\n      cdf(x2) {\n        let p = 0, i = 0;\n        for (; i < m2; ++i) {\n          p += w2[i] * dists[i].cdf(x2);\n        }\n        return p;\n      },\n      icdf() {\n        throw Error(\"Mixture icdf not supported.\");\n      }\n    };\n    return dist2.distributions(dists).weights(weights);\n  }\n  function sampleUniform(min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return min2 + (max2 - min2) * random();\n  }\n  function densityUniform(value2, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return value2 >= min2 && value2 <= max2 ? 1 / (max2 - min2) : 0;\n  }\n  function cumulativeUniform(value2, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return value2 < min2 ? 0 : value2 > max2 ? 1 : (value2 - min2) / (max2 - min2);\n  }\n  function quantileUniform(p, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return p >= 0 && p <= 1 ? min2 + p * (max2 - min2) : NaN;\n  }\n  function uniform(min2, max2) {\n    let a2, b2;\n    const dist2 = {\n      min(_) {\n        if (arguments.length) {\n          a2 = _ || 0;\n          return dist2;\n        } else {\n          return a2;\n        }\n      },\n      max(_) {\n        if (arguments.length) {\n          b2 = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return b2;\n        }\n      },\n      sample: () => sampleUniform(a2, b2),\n      pdf: (value2) => densityUniform(value2, a2, b2),\n      cdf: (value2) => cumulativeUniform(value2, a2, b2),\n      icdf: (p) => quantileUniform(p, a2, b2)\n    };\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return dist2.min(min2).max(max2);\n  }\n  function constant$4(data2, x2, y2) {\n    let mean2 = 0, n = 0;\n    for (const d of data2) {\n      const val = y2(d);\n      if (x2(d) == null || val == null || isNaN(val)) continue;\n      mean2 += (val - mean2) / ++n;\n    }\n    return {\n      coef: [mean2],\n      predict: () => mean2,\n      rSquared: 0\n    };\n  }\n  function ols(uX, uY, uXY, uX2) {\n    const delta = uX2 - uX * uX, slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta, intercept = uY - slope * uX;\n    return [intercept, slope];\n  }\n  function points(data2, x2, y2, sort2) {\n    data2 = data2.filter((d2) => {\n      let u2 = x2(d2), v = y2(d2);\n      return u2 != null && (u2 = +u2) >= u2 && v != null && (v = +v) >= v;\n    });\n    if (sort2) {\n      data2.sort((a2, b2) => x2(a2) - x2(b2));\n    }\n    const n = data2.length, X3 = new Float64Array(n), Y3 = new Float64Array(n);\n    let i = 0, ux = 0, uy = 0, xv, yv, d;\n    for (d of data2) {\n      X3[i] = xv = +x2(d);\n      Y3[i] = yv = +y2(d);\n      ++i;\n      ux += (xv - ux) / i;\n      uy += (yv - uy) / i;\n    }\n    for (i = 0; i < n; ++i) {\n      X3[i] -= ux;\n      Y3[i] -= uy;\n    }\n    return [X3, Y3, ux, uy];\n  }\n  function visitPoints(data2, x2, y2, callback) {\n    let i = -1, u2, v;\n    for (const d of data2) {\n      u2 = x2(d);\n      v = y2(d);\n      if (u2 != null && (u2 = +u2) >= u2 && v != null && (v = +v) >= v) {\n        callback(u2, v, ++i);\n      }\n    }\n  }\n  function rSquared(data2, x2, y2, uY, predict) {\n    let SSE = 0, SST = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      const sse = dy - predict(dx), sst = dy - uY;\n      SSE += sse * sse;\n      SST += sst * sst;\n    });\n    return 1 - SSE / SST;\n  }\n  function linear$2(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      ++n;\n      X3 += (dx - X3) / n;\n      Y3 += (dy - Y3) / n;\n      XY += (dx * dy - XY) / n;\n      X22 += (dx * dx - X22) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] + coef[1] * x3;\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, Y3, predict)\n    };\n  }\n  function log$3(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      ++n;\n      dx = Math.log(dx);\n      X3 += (dx - X3) / n;\n      Y3 += (dy - Y3) / n;\n      XY += (dx * dy - XY) / n;\n      X22 += (dx * dx - X22) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] + coef[1] * Math.log(x3);\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, Y3, predict)\n    };\n  }\n  function exp$1(data2, x2, y2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2);\n    let YL = 0, XY = 0, XYL = 0, X2Y = 0, n = 0, dx, ly2, xy;\n    visitPoints(data2, x2, y2, (_, dy) => {\n      dx = xv[n++];\n      ly2 = Math.log(dy);\n      xy = dx * dy;\n      YL += (dy * ly2 - YL) / n;\n      XY += (xy - XY) / n;\n      XYL += (xy * ly2 - XYL) / n;\n      X2Y += (dx * xy - X2Y) / n;\n    });\n    const [c0, c1] = ols(XY / uy, YL / uy, XYL / uy, X2Y / uy), predict = (x3) => Math.exp(c0 + c1 * (x3 - ux));\n    return {\n      coef: [Math.exp(c0 - c1 * ux), c1],\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function pow$3(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, YS = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      const lx2 = Math.log(dx), ly2 = Math.log(dy);\n      ++n;\n      X3 += (lx2 - X3) / n;\n      Y3 += (ly2 - Y3) / n;\n      XY += (lx2 * ly2 - XY) / n;\n      X22 += (lx2 * lx2 - X22) / n;\n      YS += (dy - YS) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] * Math.pow(x3, coef[1]);\n    coef[0] = Math.exp(coef[0]);\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, YS, predict)\n    };\n  }\n  function quad(data2, x2, y2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2), n = xv.length;\n    let X22 = 0, X3 = 0, X4 = 0, XY = 0, X2Y = 0, i, dx, dy, x22;\n    for (i = 0; i < n; ) {\n      dx = xv[i];\n      dy = yv[i++];\n      x22 = dx * dx;\n      X22 += (x22 - X22) / i;\n      X3 += (x22 * dx - X3) / i;\n      X4 += (x22 * x22 - X4) / i;\n      XY += (dx * dy - XY) / i;\n      X2Y += (x22 * dy - X2Y) / i;\n    }\n    const X2X2 = X4 - X22 * X22, d = X22 * X2X2 - X3 * X3, a2 = (X2Y * X22 - XY * X3) / d, b2 = (XY * X2X2 - X2Y * X3) / d, c2 = -a2 * X22, predict = (x3) => {\n      x3 = x3 - ux;\n      return a2 * x3 * x3 + b2 * x3 + c2 + uy;\n    };\n    return {\n      coef: [c2 - b2 * ux + a2 * ux * ux + uy, b2 - 2 * a2 * ux, a2],\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function poly(data2, x2, y2, order) {\n    if (order === 0) return constant$4(data2, x2, y2);\n    if (order === 1) return linear$2(data2, x2, y2);\n    if (order === 2) return quad(data2, x2, y2);\n    const [xv, yv, ux, uy] = points(data2, x2, y2), n = xv.length, lhs = [], rhs = [], k = order + 1;\n    let i, j, l, v, c2;\n    for (i = 0; i < k; ++i) {\n      for (l = 0, v = 0; l < n; ++l) {\n        v += Math.pow(xv[l], i) * yv[l];\n      }\n      lhs.push(v);\n      c2 = new Float64Array(k);\n      for (j = 0; j < k; ++j) {\n        for (l = 0, v = 0; l < n; ++l) {\n          v += Math.pow(xv[l], i + j);\n        }\n        c2[j] = v;\n      }\n      rhs.push(c2);\n    }\n    rhs.push(lhs);\n    const coef = gaussianElimination(rhs), predict = (x3) => {\n      x3 -= ux;\n      let y3 = uy + coef[0] + coef[1] * x3 + coef[2] * x3 * x3;\n      for (i = 3; i < k; ++i) y3 += coef[i] * Math.pow(x3, i);\n      return y3;\n    };\n    return {\n      coef: uncenter(k, coef, -ux, uy),\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function uncenter(k, a2, x2, y2) {\n    const z = Array(k);\n    let i, j, v, c2;\n    for (i = 0; i < k; ++i) z[i] = 0;\n    for (i = k - 1; i >= 0; --i) {\n      v = a2[i];\n      c2 = 1;\n      z[i] += v;\n      for (j = 1; j <= i; ++j) {\n        c2 *= (i + 1 - j) / j;\n        z[i - j] += v * Math.pow(x2, j) * c2;\n      }\n    }\n    z[0] += y2;\n    return z;\n  }\n  function gaussianElimination(matrix) {\n    const n = matrix.length - 1, coef = [];\n    let i, j, k, r, t;\n    for (i = 0; i < n; ++i) {\n      r = i;\n      for (j = i + 1; j < n; ++j) {\n        if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) {\n          r = j;\n        }\n      }\n      for (k = i; k < n + 1; ++k) {\n        t = matrix[k][i];\n        matrix[k][i] = matrix[k][r];\n        matrix[k][r] = t;\n      }\n      for (j = i + 1; j < n; ++j) {\n        for (k = n; k >= i; k--) {\n          matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i];\n        }\n      }\n    }\n    for (j = n - 1; j >= 0; --j) {\n      t = 0;\n      for (k = j + 1; k < n; ++k) {\n        t += matrix[k][j] * coef[k];\n      }\n      coef[j] = (matrix[n][j] - t) / matrix[j][j];\n    }\n    return coef;\n  }\n  const maxiters = 2, epsilon$6 = 1e-12;\n  function loess(data2, x2, y2, bandwidth2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2, true), n = xv.length, bw = Math.max(2, ~~(bandwidth2 * n)), yhat = new Float64Array(n), residuals = new Float64Array(n), robustWeights = new Float64Array(n).fill(1);\n    for (let iter = -1; ++iter <= maxiters; ) {\n      const interval2 = [0, bw - 1];\n      for (let i = 0; i < n; ++i) {\n        const dx = xv[i], i0 = interval2[0], i1 = interval2[1], edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;\n        let W = 0, X3 = 0, Y3 = 0, XY = 0, X22 = 0;\n        const denom = 1 / Math.abs(xv[edge] - dx || 1);\n        for (let k = i0; k <= i1; ++k) {\n          const xk = xv[k], yk = yv[k], w2 = tricube(Math.abs(dx - xk) * denom) * robustWeights[k], xkw = xk * w2;\n          W += w2;\n          X3 += xkw;\n          Y3 += yk * w2;\n          XY += yk * xkw;\n          X22 += xk * xkw;\n        }\n        const [a2, b2] = ols(X3 / W, Y3 / W, XY / W, X22 / W);\n        yhat[i] = a2 + b2 * dx;\n        residuals[i] = Math.abs(yv[i] - yhat[i]);\n        updateInterval(xv, i + 1, interval2);\n      }\n      if (iter === maxiters) {\n        break;\n      }\n      const medianResidual = median(residuals);\n      if (Math.abs(medianResidual) < epsilon$6) break;\n      for (let i = 0, arg, w2; i < n; ++i) {\n        arg = residuals[i] / (6 * medianResidual);\n        robustWeights[i] = arg >= 1 ? epsilon$6 : (w2 = 1 - arg * arg) * w2;\n      }\n    }\n    return output$1(xv, yhat, ux, uy);\n  }\n  function tricube(x2) {\n    return (x2 = 1 - x2 * x2 * x2) * x2 * x2;\n  }\n  function updateInterval(xv, i, interval2) {\n    const val = xv[i];\n    let left = interval2[0], right = interval2[1] + 1;\n    if (right >= xv.length) return;\n    while (i > left && xv[right] - val <= val - xv[left]) {\n      interval2[0] = ++left;\n      interval2[1] = right;\n      ++right;\n    }\n  }\n  function output$1(xv, yhat, ux, uy) {\n    const n = xv.length, out = [];\n    let i = 0, cnt = 0, prev = [], v;\n    for (; i < n; ++i) {\n      v = xv[i] + ux;\n      if (prev[0] === v) {\n        prev[1] += (yhat[i] - prev[1]) / ++cnt;\n      } else {\n        cnt = 0;\n        prev[1] += uy;\n        prev = [v, yhat[i]];\n        out.push(prev);\n      }\n    }\n    prev[1] += uy;\n    return out;\n  }\n  const MIN_RADIANS = 0.5 * Math.PI / 180;\n  function sampleCurve(f, extent2, minSteps, maxSteps) {\n    minSteps = minSteps || 25;\n    maxSteps = Math.max(minSteps, maxSteps || 200);\n    const point2 = (x2) => [x2, f(x2)], minX = extent2[0], maxX = extent2[1], span2 = maxX - minX, stop2 = span2 / maxSteps, prev = [point2(minX)], next = [];\n    if (minSteps === maxSteps) {\n      for (let i = 1; i < maxSteps; ++i) {\n        prev.push(point2(minX + i / minSteps * span2));\n      }\n      prev.push(point2(maxX));\n      return prev;\n    } else {\n      next.push(point2(maxX));\n      for (let i = minSteps; --i > 0; ) {\n        next.push(point2(minX + i / minSteps * span2));\n      }\n    }\n    let p02 = prev[0];\n    let p1 = next[next.length - 1];\n    const sx = 1 / span2;\n    const sy = scaleY(p02[1], next);\n    while (p1) {\n      const pm = point2((p02[0] + p1[0]) / 2);\n      const dx = pm[0] - p02[0] >= stop2;\n      if (dx && angleDelta(p02, pm, p1, sx, sy) > MIN_RADIANS) {\n        next.push(pm);\n      } else {\n        p02 = p1;\n        prev.push(p1);\n        next.pop();\n      }\n      p1 = next[next.length - 1];\n    }\n    return prev;\n  }\n  function scaleY(init2, points2) {\n    let ymin = init2;\n    let ymax = init2;\n    const n = points2.length;\n    for (let i = 0; i < n; ++i) {\n      const y2 = points2[i][1];\n      if (y2 < ymin) ymin = y2;\n      if (y2 > ymax) ymax = y2;\n    }\n    return 1 / (ymax - ymin);\n  }\n  function angleDelta(p, q, r, sx, sy) {\n    const a0 = Math.atan2(sy * (r[1] - p[1]), sx * (r[0] - p[0])), a1 = Math.atan2(sy * (q[1] - p[1]), sx * (q[0] - p[0]));\n    return Math.abs(a0 - a1);\n  }\n  function multikey(f) {\n    return (x2) => {\n      const n = f.length;\n      let i = 1, k = String(f[0](x2));\n      for (; i < n; ++i) {\n        k += \"|\" + f[i](x2);\n      }\n      return k;\n    };\n  }\n  function groupkey(fields) {\n    return !fields || !fields.length ? function() {\n      return \"\";\n    } : fields.length === 1 ? fields[0] : multikey(fields);\n  }\n  function measureName(op, field2, as) {\n    return as || op + (!field2 ? \"\" : \"_\" + field2);\n  }\n  const noop$4 = () => {\n  };\n  const base_op = {\n    init: noop$4,\n    add: noop$4,\n    rem: noop$4,\n    idx: 0\n  };\n  const AggregateOps = {\n    values: {\n      init: (m2) => m2.cell.store = true,\n      value: (m2) => m2.cell.data.values(),\n      idx: -1\n    },\n    count: {\n      value: (m2) => m2.cell.num\n    },\n    __count__: {\n      value: (m2) => m2.missing + m2.valid\n    },\n    missing: {\n      value: (m2) => m2.missing\n    },\n    valid: {\n      value: (m2) => m2.valid\n    },\n    sum: {\n      init: (m2) => m2.sum = 0,\n      value: (m2) => m2.valid ? m2.sum : void 0,\n      add: (m2, v) => m2.sum += +v,\n      rem: (m2, v) => m2.sum -= v\n    },\n    product: {\n      init: (m2) => m2.product = 1,\n      value: (m2) => m2.valid ? m2.product : void 0,\n      add: (m2, v) => m2.product *= v,\n      rem: (m2, v) => m2.product /= v\n    },\n    mean: {\n      init: (m2) => m2.mean = 0,\n      value: (m2) => m2.valid ? m2.mean : void 0,\n      add: (m2, v) => (m2.mean_d = v - m2.mean, m2.mean += m2.mean_d / m2.valid),\n      rem: (m2, v) => (m2.mean_d = v - m2.mean, m2.mean -= m2.valid ? m2.mean_d / m2.valid : m2.mean)\n    },\n    average: {\n      value: (m2) => m2.valid ? m2.mean : void 0,\n      req: [\"mean\"],\n      idx: 1\n    },\n    variance: {\n      init: (m2) => m2.dev = 0,\n      value: (m2) => m2.valid > 1 ? m2.dev / (m2.valid - 1) : void 0,\n      add: (m2, v) => m2.dev += m2.mean_d * (v - m2.mean),\n      rem: (m2, v) => m2.dev -= m2.mean_d * (v - m2.mean),\n      req: [\"mean\"],\n      idx: 1\n    },\n    variancep: {\n      value: (m2) => m2.valid > 1 ? m2.dev / m2.valid : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stdev: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / (m2.valid - 1)) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stdevp: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / m2.valid) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stderr: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / (m2.valid * (m2.valid - 1))) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    distinct: {\n      value: (m2) => m2.cell.data.distinct(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    ci0: {\n      value: (m2) => m2.cell.data.ci0(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    ci1: {\n      value: (m2) => m2.cell.data.ci1(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    median: {\n      value: (m2) => m2.cell.data.q2(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    q1: {\n      value: (m2) => m2.cell.data.q1(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    q3: {\n      value: (m2) => m2.cell.data.q3(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    min: {\n      init: (m2) => m2.min = void 0,\n      value: (m2) => m2.min = Number.isNaN(m2.min) ? m2.cell.data.min(m2.get) : m2.min,\n      add: (m2, v) => {\n        if (v < m2.min || m2.min === void 0) m2.min = v;\n      },\n      rem: (m2, v) => {\n        if (v <= m2.min) m2.min = NaN;\n      },\n      req: [\"values\"],\n      idx: 4\n    },\n    max: {\n      init: (m2) => m2.max = void 0,\n      value: (m2) => m2.max = Number.isNaN(m2.max) ? m2.cell.data.max(m2.get) : m2.max,\n      add: (m2, v) => {\n        if (v > m2.max || m2.max === void 0) m2.max = v;\n      },\n      rem: (m2, v) => {\n        if (v >= m2.max) m2.max = NaN;\n      },\n      req: [\"values\"],\n      idx: 4\n    },\n    argmin: {\n      init: (m2) => m2.argmin = void 0,\n      value: (m2) => m2.argmin || m2.cell.data.argmin(m2.get),\n      add: (m2, v, t) => {\n        if (v < m2.min) m2.argmin = t;\n      },\n      rem: (m2, v) => {\n        if (v <= m2.min) m2.argmin = void 0;\n      },\n      req: [\"min\", \"values\"],\n      idx: 3\n    },\n    argmax: {\n      init: (m2) => m2.argmax = void 0,\n      value: (m2) => m2.argmax || m2.cell.data.argmax(m2.get),\n      add: (m2, v, t) => {\n        if (v > m2.max) m2.argmax = t;\n      },\n      rem: (m2, v) => {\n        if (v >= m2.max) m2.argmax = void 0;\n      },\n      req: [\"max\", \"values\"],\n      idx: 3\n    },\n    exponential: {\n      init: (m2, r) => {\n        m2.exp = 0;\n        m2.exp_r = r;\n      },\n      value: (m2) => m2.valid ? m2.exp * (1 - m2.exp_r) / (1 - m2.exp_r ** m2.valid) : void 0,\n      add: (m2, v) => m2.exp = m2.exp_r * m2.exp + v,\n      rem: (m2, v) => m2.exp = (m2.exp - v / m2.exp_r ** (m2.valid - 1)) / m2.exp_r\n    },\n    exponentialb: {\n      value: (m2) => m2.valid ? m2.exp * (1 - m2.exp_r) : void 0,\n      req: [\"exponential\"],\n      idx: 1\n    }\n  };\n  const ValidAggregateOps = Object.keys(AggregateOps).filter((d) => d !== \"__count__\");\n  function measure(key2, value2) {\n    return (out, aggregate_param) => extend$1({\n      name: key2,\n      aggregate_param,\n      out: out || key2\n    }, base_op, value2);\n  }\n  [...ValidAggregateOps, \"__count__\"].forEach((key2) => {\n    AggregateOps[key2] = measure(key2, AggregateOps[key2]);\n  });\n  function createMeasure(op, param2, name) {\n    return AggregateOps[op](name, param2);\n  }\n  function compareIndex(a2, b2) {\n    return a2.idx - b2.idx;\n  }\n  function resolve(agg) {\n    const map2 = {};\n    agg.forEach((a2) => map2[a2.name] = a2);\n    const getreqs = (a2) => {\n      if (!a2.req) return;\n      a2.req.forEach((key2) => {\n        if (!map2[key2]) getreqs(map2[key2] = AggregateOps[key2]());\n      });\n    };\n    agg.forEach(getreqs);\n    return Object.values(map2).sort(compareIndex);\n  }\n  function init$1() {\n    this.valid = 0;\n    this.missing = 0;\n    this._ops.forEach((op) => op.aggregate_param == null ? op.init(this) : op.init(this, op.aggregate_param));\n  }\n  function add$3(v, t) {\n    if (v == null || v === \"\") {\n      ++this.missing;\n      return;\n    }\n    if (v !== v) return;\n    ++this.valid;\n    this._ops.forEach((op) => op.add(this, v, t));\n  }\n  function rem(v, t) {\n    if (v == null || v === \"\") {\n      --this.missing;\n      return;\n    }\n    if (v !== v) return;\n    --this.valid;\n    this._ops.forEach((op) => op.rem(this, v, t));\n  }\n  function set$7(t) {\n    this._out.forEach((op) => t[op.out] = op.value(this));\n    return t;\n  }\n  function compileMeasures(agg, field2) {\n    const get2 = field2 || identity$7, ops2 = resolve(agg), out = agg.slice().sort(compareIndex);\n    function ctr(cell2) {\n      this._ops = ops2;\n      this._out = out;\n      this.cell = cell2;\n      this.init();\n    }\n    ctr.prototype.init = init$1;\n    ctr.prototype.add = add$3;\n    ctr.prototype.rem = rem;\n    ctr.prototype.set = set$7;\n    ctr.prototype.get = get2;\n    ctr.fields = agg.map((op) => op.out);\n    return ctr;\n  }\n  function TupleStore(key2) {\n    this._key = key2 ? field$1(key2) : tupleid;\n    this.reset();\n  }\n  const prototype$1 = TupleStore.prototype;\n  prototype$1.reset = function() {\n    this._add = [];\n    this._rem = [];\n    this._ext = null;\n    this._get = null;\n    this._q = null;\n  };\n  prototype$1.add = function(v) {\n    this._add.push(v);\n  };\n  prototype$1.rem = function(v) {\n    this._rem.push(v);\n  };\n  prototype$1.values = function() {\n    this._get = null;\n    if (this._rem.length === 0) return this._add;\n    const a2 = this._add, r = this._rem, k = this._key, n = a2.length, m2 = r.length, x2 = Array(n - m2), map2 = {};\n    let i, j, v;\n    for (i = 0; i < m2; ++i) {\n      map2[k(r[i])] = 1;\n    }\n    for (i = 0, j = 0; i < n; ++i) {\n      if (map2[k(v = a2[i])]) {\n        map2[k(v)] = 0;\n      } else {\n        x2[j++] = v;\n      }\n    }\n    this._rem = [];\n    return this._add = x2;\n  };\n  prototype$1.distinct = function(get2) {\n    const v = this.values(), map2 = {};\n    let n = v.length, count2 = 0, s;\n    while (--n >= 0) {\n      s = get2(v[n]) + \"\";\n      if (!has$1(map2, s)) {\n        map2[s] = 1;\n        ++count2;\n      }\n    }\n    return count2;\n  };\n  prototype$1.extent = function(get2) {\n    if (this._get !== get2 || !this._ext) {\n      const v = this.values(), i = extentIndex(v, get2);\n      this._ext = [v[i[0]], v[i[1]]];\n      this._get = get2;\n    }\n    return this._ext;\n  };\n  prototype$1.argmin = function(get2) {\n    return this.extent(get2)[0] || {};\n  };\n  prototype$1.argmax = function(get2) {\n    return this.extent(get2)[1] || {};\n  };\n  prototype$1.min = function(get2) {\n    const m2 = this.extent(get2)[0];\n    return m2 != null ? get2(m2) : void 0;\n  };\n  prototype$1.max = function(get2) {\n    const m2 = this.extent(get2)[1];\n    return m2 != null ? get2(m2) : void 0;\n  };\n  prototype$1.quartile = function(get2) {\n    if (this._get !== get2 || !this._q) {\n      this._q = quartiles(this.values(), get2);\n      this._get = get2;\n    }\n    return this._q;\n  };\n  prototype$1.q1 = function(get2) {\n    return this.quartile(get2)[0];\n  };\n  prototype$1.q2 = function(get2) {\n    return this.quartile(get2)[1];\n  };\n  prototype$1.q3 = function(get2) {\n    return this.quartile(get2)[2];\n  };\n  prototype$1.ci = function(get2) {\n    if (this._get !== get2 || !this._ci) {\n      this._ci = bootstrapCI(this.values(), 1e3, 0.05, get2);\n      this._get = get2;\n    }\n    return this._ci;\n  };\n  prototype$1.ci0 = function(get2) {\n    return this.ci(get2)[0];\n  };\n  prototype$1.ci1 = function(get2) {\n    return this.ci(get2)[1];\n  };\n  function Aggregate$1(params2) {\n    Transform.call(this, null, params2);\n    this._adds = [];\n    this._mods = [];\n    this._alen = 0;\n    this._mlen = 0;\n    this._drop = true;\n    this._cross = false;\n    this._dims = [];\n    this._dnames = [];\n    this._measures = [];\n    this._countOnly = false;\n    this._counts = null;\n    this._prev = null;\n    this._inputs = null;\n    this._outputs = null;\n  }\n  Aggregate$1.Definition = {\n    \"type\": \"Aggregate\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidAggregateOps\n    }, {\n      \"name\": \"aggregate_params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"drop\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"cross\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(Aggregate$1, Transform, {\n    transform(_, pulse2) {\n      const aggr = this, out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), mod = _.modified();\n      aggr.stamp = out.stamp;\n      if (aggr.value && (mod || pulse2.modified(aggr._inputs, true))) {\n        aggr._prev = aggr.value;\n        aggr.value = mod ? aggr.init(_) : /* @__PURE__ */ Object.create(null);\n        pulse2.visit(pulse2.SOURCE, (t) => aggr.add(t));\n      } else {\n        aggr.value = aggr.value || aggr.init(_);\n        pulse2.visit(pulse2.REM, (t) => aggr.rem(t));\n        pulse2.visit(pulse2.ADD, (t) => aggr.add(t));\n      }\n      out.modifies(aggr._outputs);\n      aggr._drop = _.drop !== false;\n      if (_.cross && aggr._dims.length > 1) {\n        aggr._drop = false;\n        aggr.cross();\n      }\n      if (pulse2.clean() && aggr._drop) {\n        out.clean(true).runAfter(() => this.clean());\n      }\n      return aggr.changes(out);\n    },\n    cross() {\n      const aggr = this, curr = aggr.value, dims = aggr._dnames, vals = dims.map(() => ({})), n = dims.length;\n      function collect2(cells) {\n        let key2, i, t, v;\n        for (key2 in cells) {\n          t = cells[key2].tuple;\n          for (i = 0; i < n; ++i) {\n            vals[i][v = t[dims[i]]] = v;\n          }\n        }\n      }\n      collect2(aggr._prev);\n      collect2(curr);\n      function generate2(base2, tuple, index2) {\n        const name = dims[index2], v = vals[index2++];\n        for (const k in v) {\n          const key2 = base2 ? base2 + \"|\" + k : k;\n          tuple[name] = v[k];\n          if (index2 < n) generate2(key2, tuple, index2);\n          else if (!curr[key2]) aggr.cell(key2, tuple);\n        }\n      }\n      generate2(\"\", {}, 0);\n    },\n    init(_) {\n      const inputs = this._inputs = [], outputs = this._outputs = [], inputMap = {};\n      function inputVisit(get2) {\n        const fields2 = array$5(accessorFields(get2)), n2 = fields2.length;\n        let i2 = 0, f;\n        for (; i2 < n2; ++i2) {\n          if (!inputMap[f = fields2[i2]]) {\n            inputMap[f] = 1;\n            inputs.push(f);\n          }\n        }\n      }\n      this._dims = array$5(_.groupby);\n      this._dnames = this._dims.map((d) => {\n        const dname = accessorName(d);\n        inputVisit(d);\n        outputs.push(dname);\n        return dname;\n      });\n      this.cellkey = _.key ? _.key : groupkey(this._dims);\n      this._countOnly = true;\n      this._counts = [];\n      this._measures = [];\n      const fields = _.fields || [null], ops2 = _.ops || [\"count\"], aggregate_params = _.aggregate_params || [null], as = _.as || [], n = fields.length, map2 = {};\n      let field2, op, aggregate_param, m2, mname, outname, i;\n      if (n !== ops2.length) {\n        error(\"Unmatched number of fields and aggregate ops.\");\n      }\n      for (i = 0; i < n; ++i) {\n        field2 = fields[i];\n        op = ops2[i];\n        aggregate_param = aggregate_params[i] || null;\n        if (field2 == null && op !== \"count\") {\n          error(\"Null aggregate field specified.\");\n        }\n        mname = accessorName(field2);\n        outname = measureName(op, mname, as[i]);\n        outputs.push(outname);\n        if (op === \"count\") {\n          this._counts.push(outname);\n          continue;\n        }\n        m2 = map2[mname];\n        if (!m2) {\n          inputVisit(field2);\n          m2 = map2[mname] = [];\n          m2.field = field2;\n          this._measures.push(m2);\n        }\n        if (op !== \"count\") this._countOnly = false;\n        m2.push(createMeasure(op, aggregate_param, outname));\n      }\n      this._measures = this._measures.map((m3) => compileMeasures(m3, m3.field));\n      return /* @__PURE__ */ Object.create(null);\n    },\n    // -- Cell Management -----\n    cellkey: groupkey(),\n    cell(key2, t) {\n      let cell2 = this.value[key2];\n      if (!cell2) {\n        cell2 = this.value[key2] = this.newcell(key2, t);\n        this._adds[this._alen++] = cell2;\n      } else if (cell2.num === 0 && this._drop && cell2.stamp < this.stamp) {\n        cell2.stamp = this.stamp;\n        this._adds[this._alen++] = cell2;\n      } else if (cell2.stamp < this.stamp) {\n        cell2.stamp = this.stamp;\n        this._mods[this._mlen++] = cell2;\n      }\n      return cell2;\n    },\n    newcell(key2, t) {\n      const cell2 = {\n        key: key2,\n        num: 0,\n        agg: null,\n        tuple: this.newtuple(t, this._prev && this._prev[key2]),\n        stamp: this.stamp,\n        store: false\n      };\n      if (!this._countOnly) {\n        const measures = this._measures, n = measures.length;\n        cell2.agg = Array(n);\n        for (let i = 0; i < n; ++i) {\n          cell2.agg[i] = new measures[i](cell2);\n        }\n      }\n      if (cell2.store) {\n        cell2.data = new TupleStore();\n      }\n      return cell2;\n    },\n    newtuple(t, p) {\n      const names = this._dnames, dims = this._dims, n = dims.length, x2 = {};\n      for (let i = 0; i < n; ++i) {\n        x2[names[i]] = dims[i](t);\n      }\n      return p ? replace$1(p.tuple, x2) : ingest$1(x2);\n    },\n    clean() {\n      const cells = this.value;\n      for (const key2 in cells) {\n        if (cells[key2].num === 0) {\n          delete cells[key2];\n        }\n      }\n    },\n    // -- Process Tuples -----\n    add(t) {\n      const key2 = this.cellkey(t), cell2 = this.cell(key2, t);\n      cell2.num += 1;\n      if (this._countOnly) return;\n      if (cell2.store) cell2.data.add(t);\n      const agg = cell2.agg;\n      for (let i = 0, n = agg.length; i < n; ++i) {\n        agg[i].add(agg[i].get(t), t);\n      }\n    },\n    rem(t) {\n      const key2 = this.cellkey(t), cell2 = this.cell(key2, t);\n      cell2.num -= 1;\n      if (this._countOnly) return;\n      if (cell2.store) cell2.data.rem(t);\n      const agg = cell2.agg;\n      for (let i = 0, n = agg.length; i < n; ++i) {\n        agg[i].rem(agg[i].get(t), t);\n      }\n    },\n    celltuple(cell2) {\n      const tuple = cell2.tuple, counts = this._counts;\n      if (cell2.store) {\n        cell2.data.values();\n      }\n      for (let i = 0, n = counts.length; i < n; ++i) {\n        tuple[counts[i]] = cell2.num;\n      }\n      if (!this._countOnly) {\n        const agg = cell2.agg;\n        for (let i = 0, n = agg.length; i < n; ++i) {\n          agg[i].set(tuple);\n        }\n      }\n      return tuple;\n    },\n    changes(out) {\n      const adds = this._adds, mods = this._mods, prev = this._prev, drop = this._drop, add2 = out.add, rem2 = out.rem, mod = out.mod;\n      let cell2, key2, i, n;\n      if (prev) for (key2 in prev) {\n        cell2 = prev[key2];\n        if (!drop || cell2.num) rem2.push(cell2.tuple);\n      }\n      for (i = 0, n = this._alen; i < n; ++i) {\n        add2.push(this.celltuple(adds[i]));\n        adds[i] = null;\n      }\n      for (i = 0, n = this._mlen; i < n; ++i) {\n        cell2 = mods[i];\n        (cell2.num === 0 && drop ? rem2 : mod).push(this.celltuple(cell2));\n        mods[i] = null;\n      }\n      this._alen = this._mlen = 0;\n      this._prev = null;\n      return out;\n    }\n  });\n  const EPSILON$1$1 = 1e-14;\n  function Bin(params2) {\n    Transform.call(this, null, params2);\n  }\n  Bin.Definition = {\n    \"type\": \"Bin\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"interval\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"anchor\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"maxbins\",\n      \"type\": \"number\",\n      \"default\": 20\n    }, {\n      \"name\": \"base\",\n      \"type\": \"number\",\n      \"default\": 10\n    }, {\n      \"name\": \"divide\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"default\": [5, 2]\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"span\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"minstep\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"name\",\n      \"type\": \"string\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"bin0\", \"bin1\"]\n    }]\n  };\n  inherits(Bin, Transform, {\n    transform(_, pulse2) {\n      const band2 = _.interval !== false, bins = this._bins(_), start = bins.start, step = bins.step, as = _.as || [\"bin0\", \"bin1\"], b0 = as[0], b1 = as[1];\n      let flag2;\n      if (_.modified()) {\n        pulse2 = pulse2.reflow(true);\n        flag2 = pulse2.SOURCE;\n      } else {\n        flag2 = pulse2.modified(accessorFields(_.field)) ? pulse2.ADD_MOD : pulse2.ADD;\n      }\n      pulse2.visit(flag2, band2 ? (t) => {\n        const v = bins(t);\n        t[b0] = v;\n        t[b1] = v == null ? null : start + step * (1 + (v - start) / step);\n      } : (t) => t[b0] = bins(t));\n      return pulse2.modifies(band2 ? as : b0);\n    },\n    _bins(_) {\n      if (this.value && !_.modified()) {\n        return this.value;\n      }\n      const field2 = _.field, bins = bin(_), step = bins.step;\n      let start = bins.start, stop2 = start + Math.ceil((bins.stop - start) / step) * step, a2, d;\n      if ((a2 = _.anchor) != null) {\n        d = a2 - (start + step * Math.floor((a2 - start) / step));\n        start += d;\n        stop2 += d;\n      }\n      const f = function(t) {\n        let v = toNumber(field2(t));\n        return v == null ? null : v < start ? -Infinity : v > stop2 ? Infinity : (v = Math.max(start, Math.min(v, stop2 - step)), start + step * Math.floor(EPSILON$1$1 + (v - start) / step));\n      };\n      f.start = start;\n      f.stop = bins.stop;\n      f.step = step;\n      return this.value = accessor(f, accessorFields(field2), _.name || \"bin_\" + accessorName(field2));\n    }\n  });\n  function SortedList(idFunc, source2, input) {\n    const $2 = idFunc;\n    let data2 = source2 || [], add2 = input || [], rem2 = {}, cnt = 0;\n    return {\n      add: (t) => add2.push(t),\n      remove: (t) => rem2[$2(t)] = ++cnt,\n      size: () => data2.length,\n      data: (compare2, resort) => {\n        if (cnt) {\n          data2 = data2.filter((t) => !rem2[$2(t)]);\n          rem2 = {};\n          cnt = 0;\n        }\n        if (resort && compare2) {\n          data2.sort(compare2);\n        }\n        if (add2.length) {\n          data2 = compare2 ? merge$3(compare2, data2, add2.sort(compare2)) : data2.concat(add2);\n          add2 = [];\n        }\n        return data2;\n      }\n    };\n  }\n  function Collect$1(params2) {\n    Transform.call(this, [], params2);\n  }\n  Collect$1.Definition = {\n    \"type\": \"Collect\",\n    \"metadata\": {\n      \"source\": true\n    },\n    \"params\": [{\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }]\n  };\n  inherits(Collect$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.ALL), list = SortedList(tupleid, this.value, out.materialize(out.ADD).add), sort2 = _.sort, mod = pulse2.changed() || sort2 && (_.modified(\"sort\") || pulse2.modified(sort2.fields));\n      out.visit(out.REM, list.remove);\n      this.modified(mod);\n      this.value = out.source = list.data(stableCompare(sort2), mod);\n      if (pulse2.source && pulse2.source.root) {\n        this.value.root = pulse2.source.root;\n      }\n      return out;\n    }\n  });\n  function Compare$1(params2) {\n    Operator.call(this, null, update$5, params2);\n  }\n  inherits(Compare$1, Operator);\n  function update$5(_) {\n    return this.value && !_.modified() ? this.value : compare$2(_.fields, _.orders);\n  }\n  function CountPattern(params2) {\n    Transform.call(this, null, params2);\n  }\n  CountPattern.Definition = {\n    \"type\": \"CountPattern\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"case\",\n      \"type\": \"enum\",\n      \"values\": [\"upper\", \"lower\", \"mixed\"],\n      \"default\": \"mixed\"\n    }, {\n      \"name\": \"pattern\",\n      \"type\": \"string\",\n      \"default\": '[\\\\w\"]+'\n    }, {\n      \"name\": \"stopwords\",\n      \"type\": \"string\",\n      \"default\": \"\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"text\", \"count\"]\n    }]\n  };\n  function tokenize(text2, tcase, match2) {\n    switch (tcase) {\n      case \"upper\":\n        text2 = text2.toUpperCase();\n        break;\n      case \"lower\":\n        text2 = text2.toLowerCase();\n        break;\n    }\n    return text2.match(match2);\n  }\n  inherits(CountPattern, Transform, {\n    transform(_, pulse2) {\n      const process = (update2) => (tuple) => {\n        var tokens = tokenize(get2(tuple), _.case, match2) || [], t;\n        for (var i = 0, n = tokens.length; i < n; ++i) {\n          if (!stop2.test(t = tokens[i])) update2(t);\n        }\n      };\n      const init2 = this._parameterCheck(_, pulse2), counts = this._counts, match2 = this._match, stop2 = this._stop, get2 = _.field, as = _.as || [\"text\", \"count\"], add2 = process((t) => counts[t] = 1 + (counts[t] || 0)), rem2 = process((t) => counts[t] -= 1);\n      if (init2) {\n        pulse2.visit(pulse2.SOURCE, add2);\n      } else {\n        pulse2.visit(pulse2.ADD, add2);\n        pulse2.visit(pulse2.REM, rem2);\n      }\n      return this._finish(pulse2, as);\n    },\n    _parameterCheck(_, pulse2) {\n      let init2 = false;\n      if (_.modified(\"stopwords\") || !this._stop) {\n        this._stop = new RegExp(\"^\" + (_.stopwords || \"\") + \"$\", \"i\");\n        init2 = true;\n      }\n      if (_.modified(\"pattern\") || !this._match) {\n        this._match = new RegExp(_.pattern || \"[\\\\w']+\", \"g\");\n        init2 = true;\n      }\n      if (_.modified(\"field\") || pulse2.modified(_.field.fields)) {\n        init2 = true;\n      }\n      if (init2) this._counts = {};\n      return init2;\n    },\n    _finish(pulse2, as) {\n      const counts = this._counts, tuples = this._tuples || (this._tuples = {}), text2 = as[0], count2 = as[1], out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      let w2, t, c2;\n      for (w2 in counts) {\n        t = tuples[w2];\n        c2 = counts[w2] || 0;\n        if (!t && c2) {\n          tuples[w2] = t = ingest$1({});\n          t[text2] = w2;\n          t[count2] = c2;\n          out.add.push(t);\n        } else if (c2 === 0) {\n          if (t) out.rem.push(t);\n          counts[w2] = null;\n          tuples[w2] = null;\n        } else if (t[count2] !== c2) {\n          t[count2] = c2;\n          out.mod.push(t);\n        }\n      }\n      return out.modifies(as);\n    }\n  });\n  function Cross$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Cross$1.Definition = {\n    \"type\": \"Cross\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"filter\",\n      \"type\": \"expr\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"a\", \"b\"]\n    }]\n  };\n  inherits(Cross$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), as = _.as || [\"a\", \"b\"], a2 = as[0], b2 = as[1], reset2 = !this.value || pulse2.changed(pulse2.ADD_REM) || _.modified(\"as\") || _.modified(\"filter\");\n      let data2 = this.value;\n      if (reset2) {\n        if (data2) out.rem = data2;\n        data2 = pulse2.materialize(pulse2.SOURCE).source;\n        out.add = this.value = cross$1(data2, a2, b2, _.filter || truthy);\n      } else {\n        out.mod = data2;\n      }\n      out.source = this.value;\n      return out.modifies(as);\n    }\n  });\n  function cross$1(input, a2, b2, filter2) {\n    var data2 = [], t = {}, n = input.length, i = 0, j, left;\n    for (; i < n; ++i) {\n      t[a2] = left = input[i];\n      for (j = 0; j < n; ++j) {\n        t[b2] = input[j];\n        if (filter2(t)) {\n          data2.push(ingest$1(t));\n          t = {};\n          t[a2] = left;\n        }\n      }\n    }\n    return data2;\n  }\n  const Distributions = {\n    kde,\n    mixture: mixture$1,\n    normal: gaussian,\n    lognormal,\n    uniform\n  };\n  const DISTRIBUTIONS = \"distributions\", FUNCTION = \"function\", FIELD = \"field\";\n  function parse$4(def2, data2) {\n    const func = def2[FUNCTION];\n    if (!has$1(Distributions, func)) {\n      error(\"Unknown distribution function: \" + func);\n    }\n    const d = Distributions[func]();\n    for (const name in def2) {\n      if (name === FIELD) {\n        d.data((def2.from || data2()).map(def2[name]));\n      } else if (name === DISTRIBUTIONS) {\n        d[name](def2[name].map((_) => parse$4(_, data2)));\n      } else if (typeof d[name] === FUNCTION) {\n        d[name](def2[name]);\n      }\n    }\n    return d;\n  }\n  function Density(params2) {\n    Transform.call(this, null, params2);\n  }\n  const distributions = [{\n    \"key\": {\n      \"function\": \"normal\"\n    },\n    \"params\": [{\n      \"name\": \"mean\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"stdev\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"lognormal\"\n    },\n    \"params\": [{\n      \"name\": \"mean\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"stdev\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"uniform\"\n    },\n    \"params\": [{\n      \"name\": \"min\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"max\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"kde\"\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"from\",\n      \"type\": \"data\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0\n    }]\n  }];\n  const mixture = {\n    \"key\": {\n      \"function\": \"mixture\"\n    },\n    \"params\": [{\n      \"name\": \"distributions\",\n      \"type\": \"param\",\n      \"array\": true,\n      \"params\": distributions\n    }, {\n      \"name\": \"weights\",\n      \"type\": \"number\",\n      \"array\": true\n    }]\n  };\n  Density.Definition = {\n    \"type\": \"Density\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"minsteps\",\n      \"type\": \"number\",\n      \"default\": 25\n    }, {\n      \"name\": \"maxsteps\",\n      \"type\": \"number\",\n      \"default\": 200\n    }, {\n      \"name\": \"method\",\n      \"type\": \"string\",\n      \"default\": \"pdf\",\n      \"values\": [\"pdf\", \"cdf\"]\n    }, {\n      \"name\": \"distribution\",\n      \"type\": \"param\",\n      \"params\": distributions.concat(mixture)\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"value\", \"density\"]\n    }]\n  };\n  inherits(Density, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const dist2 = parse$4(_.distribution, source$1(pulse2)), minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n        let method2 = _.method || \"pdf\";\n        if (method2 !== \"pdf\" && method2 !== \"cdf\") {\n          error(\"Invalid density method: \" + method2);\n        }\n        if (!_.extent && !dist2.data) {\n          error(\"Missing density extent parameter.\");\n        }\n        method2 = dist2[method2];\n        const as = _.as || [\"value\", \"density\"], domain2 = _.extent || extent(dist2.data()), values2 = sampleCurve(method2, domain2, minsteps, maxsteps).map((v) => {\n          const tuple = {};\n          tuple[as[0]] = v[0];\n          tuple[as[1]] = v[1];\n          return ingest$1(tuple);\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  function source$1(pulse2) {\n    return () => pulse2.materialize(pulse2.SOURCE).source;\n  }\n  function fieldNames(fields, as) {\n    if (!fields) return null;\n    return fields.map((f, i) => as[i] || accessorName(f));\n  }\n  function partition$1$1(data2, groupby, field2) {\n    const groups = [], get2 = (f) => f(t);\n    let map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2.map(field2));\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(field2(t));\n      }\n    }\n    return groups;\n  }\n  const Output$5 = \"bin\";\n  function DotBin(params2) {\n    Transform.call(this, null, params2);\n  }\n  DotBin.Definition = {\n    \"type\": \"DotBin\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": Output$5\n    }]\n  };\n  const autostep = (data2, field2) => span(extent(data2, field2)) / 30;\n  inherits(DotBin, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !(_.modified() || pulse2.changed())) {\n        return pulse2;\n      }\n      const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(pulse2.source, _.groupby, identity$7), smooth = _.smooth || false, field2 = _.field, step = _.step || autostep(source2, field2), sort2 = stableCompare((a2, b2) => field2(a2) - field2(b2)), as = _.as || Output$5, n = groups.length;\n      let min2 = Infinity, max2 = -Infinity, i = 0, j;\n      for (; i < n; ++i) {\n        const g = groups[i].sort(sort2);\n        j = -1;\n        for (const v of dotbin(g, step, smooth, field2)) {\n          if (v < min2) min2 = v;\n          if (v > max2) max2 = v;\n          g[++j][as] = v;\n        }\n      }\n      this.value = {\n        start: min2,\n        stop: max2,\n        step\n      };\n      return pulse2.reflow(true).modifies(as);\n    }\n  });\n  function Expression$1(params2) {\n    Operator.call(this, null, update$4, params2);\n    this.modified(true);\n  }\n  inherits(Expression$1, Operator);\n  function update$4(_) {\n    const expr2 = _.expr;\n    return this.value && !_.modified(\"expr\") ? this.value : accessor((datum2) => expr2(datum2, _), accessorFields(expr2), accessorName(expr2));\n  }\n  function Extent(params2) {\n    Transform.call(this, [void 0, void 0], params2);\n  }\n  Extent.Definition = {\n    \"type\": \"Extent\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  };\n  inherits(Extent, Transform, {\n    transform(_, pulse2) {\n      const extent2 = this.value, field2 = _.field, mod = pulse2.changed() || pulse2.modified(field2.fields) || _.modified(\"field\");\n      let min2 = extent2[0], max2 = extent2[1];\n      if (mod || min2 == null) {\n        min2 = Infinity;\n        max2 = -Infinity;\n      }\n      pulse2.visit(mod ? pulse2.SOURCE : pulse2.ADD, (t) => {\n        const v = toNumber(field2(t));\n        if (v != null) {\n          if (v < min2) min2 = v;\n          if (v > max2) max2 = v;\n        }\n      });\n      if (!Number.isFinite(min2) || !Number.isFinite(max2)) {\n        let name = accessorName(field2);\n        if (name) name = ` for field \"${name}\"`;\n        pulse2.dataflow.warn(`Infinite extent${name}: [${min2}, ${max2}]`);\n        min2 = max2 = void 0;\n      }\n      this.value = [min2, max2];\n    }\n  });\n  function Subflow(pulse2, parent) {\n    Operator.call(this, pulse2);\n    this.parent = parent;\n    this.count = 0;\n  }\n  inherits(Subflow, Operator, {\n    /**\n     * Routes pulses from this subflow to a target transform.\n     * @param {Transform} target - A transform that receives the subflow of tuples.\n     */\n    connect(target2) {\n      this.detachSubflow = target2.detachSubflow;\n      this.targets().add(target2);\n      return target2.source = this;\n    },\n    /**\n     * Add an 'add' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being added.\n     */\n    add(t) {\n      this.count += 1;\n      this.value.add.push(t);\n    },\n    /**\n     * Add a 'rem' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being removed.\n     */\n    rem(t) {\n      this.count -= 1;\n      this.value.rem.push(t);\n    },\n    /**\n     * Add a 'mod' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being modified.\n     */\n    mod(t) {\n      this.value.mod.push(t);\n    },\n    /**\n     * Re-initialize this operator's pulse value.\n     * @param {Pulse} pulse - The pulse to copy from.\n     * @see Pulse.init\n     */\n    init(pulse2) {\n      this.value.init(pulse2, pulse2.NO_SOURCE);\n    },\n    /**\n     * Evaluate this operator. This method overrides the\n     * default behavior to simply return the contained pulse value.\n     * @return {Pulse}\n     */\n    evaluate() {\n      return this.value;\n    }\n  });\n  function Facet$1(params2) {\n    Transform.call(this, {}, params2);\n    this._keys = fastmap();\n    const a2 = this._targets = [];\n    a2.active = 0;\n    a2.forEach = (f) => {\n      for (let i = 0, n = a2.active; i < n; ++i) {\n        f(a2[i], i, a2);\n      }\n    };\n  }\n  inherits(Facet$1, Transform, {\n    activate(flow) {\n      this._targets[this._targets.active++] = flow;\n    },\n    // parent argument provided by PreFacet subclass\n    subflow(key2, flow, pulse2, parent) {\n      const flows = this.value;\n      let sf = has$1(flows, key2) && flows[key2], df, p;\n      if (!sf) {\n        p = parent || (p = this._group[key2]) && p.tuple;\n        df = pulse2.dataflow;\n        sf = new Subflow(pulse2.fork(pulse2.NO_SOURCE), this);\n        df.add(sf).connect(flow(df, key2, p));\n        flows[key2] = sf;\n        this.activate(sf);\n      } else if (sf.value.stamp < pulse2.stamp) {\n        sf.init(pulse2);\n        this.activate(sf);\n      }\n      return sf;\n    },\n    clean() {\n      const flows = this.value;\n      let detached = 0;\n      for (const key2 in flows) {\n        if (flows[key2].count === 0) {\n          const detach = flows[key2].detachSubflow;\n          if (detach) detach();\n          delete flows[key2];\n          ++detached;\n        }\n      }\n      if (detached) {\n        const active = this._targets.filter((sf) => sf && sf.count > 0);\n        this.initTargets(active);\n      }\n    },\n    initTargets(act) {\n      const a2 = this._targets, n = a2.length, m2 = act ? act.length : 0;\n      let i = 0;\n      for (; i < m2; ++i) {\n        a2[i] = act[i];\n      }\n      for (; i < n && a2[i] != null; ++i) {\n        a2[i] = null;\n      }\n      a2.active = m2;\n    },\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, key2 = _.key, flow = _.subflow, cache2 = this._keys, rekey = _.modified(\"key\"), subflow = (key3) => this.subflow(key3, flow, pulse2);\n      this._group = _.group || {};\n      this.initTargets();\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t), k = cache2.get(id2);\n        if (k !== void 0) {\n          cache2.delete(id2);\n          subflow(k).rem(t);\n        }\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        const k = key2(t);\n        cache2.set(tupleid(t), k);\n        subflow(k).add(t);\n      });\n      if (rekey || pulse2.modified(key2.fields)) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          const id2 = tupleid(t), k0 = cache2.get(id2), k1 = key2(t);\n          if (k0 === k1) {\n            subflow(k1).mod(t);\n          } else {\n            cache2.set(id2, k1);\n            subflow(k0).rem(t);\n            subflow(k1).add(t);\n          }\n        });\n      } else if (pulse2.changed(pulse2.MOD)) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          subflow(cache2.get(tupleid(t))).mod(t);\n        });\n      }\n      if (rekey) {\n        pulse2.visit(pulse2.REFLOW, (t) => {\n          const id2 = tupleid(t), k0 = cache2.get(id2), k1 = key2(t);\n          if (k0 !== k1) {\n            cache2.set(id2, k1);\n            subflow(k0).rem(t);\n            subflow(k1).add(t);\n          }\n        });\n      }\n      if (pulse2.clean()) {\n        df.runAfter(() => {\n          this.clean();\n          cache2.clean();\n        });\n      } else if (cache2.empty > df.cleanThreshold) {\n        df.runAfter(cache2.clean);\n      }\n      return pulse2;\n    }\n  });\n  function Field$1(params2) {\n    Operator.call(this, null, update$3, params2);\n  }\n  inherits(Field$1, Operator);\n  function update$3(_) {\n    return this.value && !_.modified() ? this.value : isArray(_.name) ? array$5(_.name).map((f) => field$1(f)) : field$1(_.name, _.as);\n  }\n  function Filter(params2) {\n    Transform.call(this, fastmap(), params2);\n  }\n  Filter.Definition = {\n    \"type\": \"Filter\",\n    \"metadata\": {\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"expr\",\n      \"type\": \"expr\",\n      \"required\": true\n    }]\n  };\n  inherits(Filter, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, cache2 = this.value, output2 = pulse2.fork(), add2 = output2.add, rem2 = output2.rem, mod = output2.mod, test2 = _.expr;\n      let isMod = true;\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t);\n        if (!cache2.has(id2)) rem2.push(t);\n        else cache2.delete(id2);\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        if (test2(t, _)) add2.push(t);\n        else cache2.set(tupleid(t), 1);\n      });\n      function revisit(t) {\n        const id2 = tupleid(t), b2 = test2(t, _), s = cache2.get(id2);\n        if (b2 && s) {\n          cache2.delete(id2);\n          add2.push(t);\n        } else if (!b2 && !s) {\n          cache2.set(id2, 1);\n          rem2.push(t);\n        } else if (isMod && b2 && !s) {\n          mod.push(t);\n        }\n      }\n      pulse2.visit(pulse2.MOD, revisit);\n      if (_.modified()) {\n        isMod = false;\n        pulse2.visit(pulse2.REFLOW, revisit);\n      }\n      if (cache2.empty > df.cleanThreshold) df.runAfter(cache2.clean);\n      return output2;\n    }\n  });\n  function Flatten(params2) {\n    Transform.call(this, [], params2);\n  }\n  Flatten.Definition = {\n    \"type\": \"Flatten\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"index\",\n      \"type\": \"string\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Flatten, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, as = fieldNames(fields, _.as || []), index2 = _.index || null, m2 = as.length;\n      out.rem = this.value;\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        const arrays = fields.map((f) => f(t)), maxlen = arrays.reduce((l, a2) => Math.max(l, a2.length), 0);\n        let i = 0, j, d, v;\n        for (; i < maxlen; ++i) {\n          d = derive(t);\n          for (j = 0; j < m2; ++j) {\n            d[as[j]] = (v = arrays[j][i]) == null ? null : v;\n          }\n          if (index2) {\n            d[index2] = i;\n          }\n          out.add.push(d);\n        }\n      });\n      this.value = out.source = out.add;\n      if (index2) out.modifies(index2);\n      return out.modifies(as);\n    }\n  });\n  function Fold(params2) {\n    Transform.call(this, [], params2);\n  }\n  Fold.Definition = {\n    \"type\": \"Fold\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"key\", \"value\"]\n    }]\n  };\n  inherits(Fold, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, fnames = fields.map(accessorName), as = _.as || [\"key\", \"value\"], k = as[0], v = as[1], n = fields.length;\n      out.rem = this.value;\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        for (let i = 0, d; i < n; ++i) {\n          d = derive(t);\n          d[k] = fnames[i];\n          d[v] = fields[i](t);\n          out.add.push(d);\n        }\n      });\n      this.value = out.source = out.add;\n      return out.modifies(as);\n    }\n  });\n  function Formula(params2) {\n    Transform.call(this, null, params2);\n  }\n  Formula.Definition = {\n    \"type\": \"Formula\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"expr\",\n      \"type\": \"expr\",\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"required\": true\n    }, {\n      \"name\": \"initonly\",\n      \"type\": \"boolean\"\n    }]\n  };\n  inherits(Formula, Transform, {\n    transform(_, pulse2) {\n      const func = _.expr, as = _.as, mod = _.modified(), flag2 = _.initonly ? pulse2.ADD : mod ? pulse2.SOURCE : pulse2.modified(func.fields) || pulse2.modified(as) ? pulse2.ADD_MOD : pulse2.ADD;\n      if (mod) {\n        pulse2 = pulse2.materialize().reflow(true);\n      }\n      if (!_.initonly) {\n        pulse2.modifies(as);\n      }\n      return pulse2.visit(flag2, (t) => t[as] = func(t, _));\n    }\n  });\n  function Generate(params2) {\n    Transform.call(this, [], params2);\n  }\n  inherits(Generate, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.ALL), gen = _.generator;\n      let data2 = this.value, num = _.size - data2.length, add2, rem2, t;\n      if (num > 0) {\n        for (add2 = []; --num >= 0; ) {\n          add2.push(t = ingest$1(gen(_)));\n          data2.push(t);\n        }\n        out.add = out.add.length ? out.materialize(out.ADD).add.concat(add2) : add2;\n      } else {\n        rem2 = data2.slice(0, -num);\n        out.rem = out.rem.length ? out.materialize(out.REM).rem.concat(rem2) : rem2;\n        data2 = data2.slice(-num);\n      }\n      out.source = this.value = data2;\n      return out;\n    }\n  });\n  const Methods$1 = {\n    value: \"value\",\n    median,\n    mean,\n    min: min$3,\n    max: max$3\n  };\n  const Empty$1 = [];\n  function Impute(params2) {\n    Transform.call(this, [], params2);\n  }\n  Impute.Definition = {\n    \"type\": \"Impute\",\n    \"metadata\": {\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"keyvals\",\n      \"array\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"value\",\n      \"values\": [\"value\", \"mean\", \"median\", \"max\", \"min\"]\n    }, {\n      \"name\": \"value\",\n      \"default\": 0\n    }]\n  };\n  function getValue(_) {\n    var m2 = _.method || Methods$1.value, v;\n    if (Methods$1[m2] == null) {\n      error(\"Unrecognized imputation method: \" + m2);\n    } else if (m2 === Methods$1.value) {\n      v = _.value !== void 0 ? _.value : 0;\n      return () => v;\n    } else {\n      return Methods$1[m2];\n    }\n  }\n  function getField$1(_) {\n    const f = _.field;\n    return (t) => t ? f(t) : NaN;\n  }\n  inherits(Impute, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), impute = getValue(_), field2 = getField$1(_), fName = accessorName(_.field), kName = accessorName(_.key), gNames = (_.groupby || []).map(accessorName), groups = partition$4(pulse2.source, _.groupby, _.key, _.keyvals), curr = [], prev = this.value, m2 = groups.domain.length, group2, value2, gVals, kVal, g, i, j, l, n, t;\n      for (g = 0, l = groups.length; g < l; ++g) {\n        group2 = groups[g];\n        gVals = group2.values;\n        value2 = NaN;\n        for (j = 0; j < m2; ++j) {\n          if (group2[j] != null) continue;\n          kVal = groups.domain[j];\n          t = {\n            _impute: true\n          };\n          for (i = 0, n = gVals.length; i < n; ++i) t[gNames[i]] = gVals[i];\n          t[kName] = kVal;\n          t[fName] = Number.isNaN(value2) ? value2 = impute(group2, field2) : value2;\n          curr.push(ingest$1(t));\n        }\n      }\n      if (curr.length) out.add = out.materialize(out.ADD).add.concat(curr);\n      if (prev.length) out.rem = out.materialize(out.REM).rem.concat(prev);\n      this.value = curr;\n      return out;\n    }\n  });\n  function partition$4(data2, groupby, key2, keyvals) {\n    var get2 = (f) => f(t), groups = [], domain2 = keyvals ? keyvals.slice() : [], kMap = {}, gMap = {}, gVals, gKey, group2, i, j, k, n, t;\n    domain2.forEach((k2, i2) => kMap[k2] = i2 + 1);\n    for (i = 0, n = data2.length; i < n; ++i) {\n      t = data2[i];\n      k = key2(t);\n      j = kMap[k] || (kMap[k] = domain2.push(k));\n      gKey = (gVals = groupby ? groupby.map(get2) : Empty$1) + \"\";\n      if (!(group2 = gMap[gKey])) {\n        group2 = gMap[gKey] = [];\n        groups.push(group2);\n        group2.values = gVals;\n      }\n      group2[j - 1] = t;\n    }\n    groups.domain = domain2;\n    return groups;\n  }\n  function JoinAggregate(params2) {\n    Aggregate$1.call(this, params2);\n  }\n  JoinAggregate.Definition = {\n    \"type\": \"JoinAggregate\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidAggregateOps\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(JoinAggregate, Aggregate$1, {\n    transform(_, pulse2) {\n      const aggr = this, mod = _.modified();\n      let cells;\n      if (aggr.value && (mod || pulse2.modified(aggr._inputs, true))) {\n        cells = aggr.value = mod ? aggr.init(_) : {};\n        pulse2.visit(pulse2.SOURCE, (t) => aggr.add(t));\n      } else {\n        cells = aggr.value = aggr.value || this.init(_);\n        pulse2.visit(pulse2.REM, (t) => aggr.rem(t));\n        pulse2.visit(pulse2.ADD, (t) => aggr.add(t));\n      }\n      aggr.changes();\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        extend$1(t, cells[aggr.cellkey(t)].tuple);\n      });\n      return pulse2.reflow(mod).modifies(this._outputs);\n    },\n    changes() {\n      const adds = this._adds, mods = this._mods;\n      let i, n;\n      for (i = 0, n = this._alen; i < n; ++i) {\n        this.celltuple(adds[i]);\n        adds[i] = null;\n      }\n      for (i = 0, n = this._mlen; i < n; ++i) {\n        this.celltuple(mods[i]);\n        mods[i] = null;\n      }\n      this._alen = this._mlen = 0;\n    }\n  });\n  function KDE(params2) {\n    Transform.call(this, null, params2);\n  }\n  KDE.Definition = {\n    \"type\": \"KDE\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"cumulative\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"counts\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"minsteps\",\n      \"type\": \"number\",\n      \"default\": 25\n    }, {\n      \"name\": \"maxsteps\",\n      \"type\": \"number\",\n      \"default\": 200\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"value\", \"density\"]\n    }]\n  };\n  inherits(KDE, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(source2, _.groupby, _.field), names = (_.groupby || []).map(accessorName), bandwidth2 = _.bandwidth, method2 = _.cumulative ? \"cdf\" : \"pdf\", as = _.as || [\"value\", \"density\"], values2 = [];\n        let domain2 = _.extent, minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n        if (method2 !== \"pdf\" && method2 !== \"cdf\") {\n          error(\"Invalid density method: \" + method2);\n        }\n        if (_.resolve === \"shared\") {\n          if (!domain2) domain2 = extent(source2, _.field);\n          minsteps = maxsteps = _.steps || maxsteps;\n        }\n        groups.forEach((g) => {\n          const density2 = kde(g, bandwidth2)[method2], scale2 = _.counts ? g.length : 1, local = domain2 || extent(g);\n          sampleCurve(density2, local, minsteps, maxsteps).forEach((v) => {\n            const t = {};\n            for (let i = 0; i < names.length; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = v[0];\n            t[as[1]] = v[1] * scale2;\n            values2.push(ingest$1(t));\n          });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  function Key$1(params2) {\n    Operator.call(this, null, update$2, params2);\n  }\n  inherits(Key$1, Operator);\n  function update$2(_) {\n    return this.value && !_.modified() ? this.value : key$2(_.fields, _.flat);\n  }\n  function Load$1(params2) {\n    Transform.call(this, [], params2);\n    this._pending = null;\n  }\n  inherits(Load$1, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow;\n      if (this._pending) {\n        return output(this, pulse2, this._pending);\n      }\n      if (stop(_)) return pulse2.StopPropagation;\n      if (_.values) {\n        return output(this, pulse2, df.parse(_.values, _.format));\n      } else if (_.async) {\n        const p = df.request(_.url, _.format).then((res) => {\n          this._pending = array$5(res.data);\n          return (df2) => df2.touch(this);\n        });\n        return {\n          async: p\n        };\n      } else {\n        return df.request(_.url, _.format).then((res) => output(this, pulse2, array$5(res.data)));\n      }\n    }\n  });\n  function stop(_) {\n    return _.modified(\"async\") && !(_.modified(\"values\") || _.modified(\"url\") || _.modified(\"format\"));\n  }\n  function output(op, pulse2, data2) {\n    data2.forEach(ingest$1);\n    const out = pulse2.fork(pulse2.NO_FIELDS & pulse2.NO_SOURCE);\n    out.rem = op.value;\n    op.value = out.source = out.add = data2;\n    op._pending = null;\n    if (out.rem.length) out.clean(true);\n    return out;\n  }\n  function Lookup(params2) {\n    Transform.call(this, {}, params2);\n  }\n  Lookup.Definition = {\n    \"type\": \"Lookup\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"index\",\n      \"type\": \"index\",\n      \"params\": [{\n        \"name\": \"from\",\n        \"type\": \"data\",\n        \"required\": true\n      }, {\n        \"name\": \"key\",\n        \"type\": \"field\",\n        \"required\": true\n      }]\n    }, {\n      \"name\": \"values\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }, {\n      \"name\": \"default\",\n      \"default\": null\n    }]\n  };\n  inherits(Lookup, Transform, {\n    transform(_, pulse2) {\n      const keys2 = _.fields, index2 = _.index, values2 = _.values, defaultValue = _.default == null ? null : _.default, reset2 = _.modified(), n = keys2.length;\n      let flag2 = reset2 ? pulse2.SOURCE : pulse2.ADD, out = pulse2, as = _.as, set2, m2, mods;\n      if (values2) {\n        m2 = values2.length;\n        if (n > 1 && !as) {\n          error('Multi-field lookup requires explicit \"as\" parameter.');\n        }\n        if (as && as.length !== n * m2) {\n          error('The \"as\" parameter has too few output field names.');\n        }\n        as = as || values2.map(accessorName);\n        set2 = function(t) {\n          for (var i = 0, k = 0, j, v; i < n; ++i) {\n            v = index2.get(keys2[i](t));\n            if (v == null) for (j = 0; j < m2; ++j, ++k) t[as[k]] = defaultValue;\n            else for (j = 0; j < m2; ++j, ++k) t[as[k]] = values2[j](v);\n          }\n        };\n      } else {\n        if (!as) {\n          error(\"Missing output field names.\");\n        }\n        set2 = function(t) {\n          for (var i = 0, v; i < n; ++i) {\n            v = index2.get(keys2[i](t));\n            t[as[i]] = v == null ? defaultValue : v;\n          }\n        };\n      }\n      if (reset2) {\n        out = pulse2.reflow(true);\n      } else {\n        mods = keys2.some((k) => pulse2.modified(k.fields));\n        flag2 |= mods ? pulse2.MOD : 0;\n      }\n      pulse2.visit(flag2, set2);\n      return out.modifies(as);\n    }\n  });\n  function MultiExtent$1(params2) {\n    Operator.call(this, null, update$1, params2);\n  }\n  inherits(MultiExtent$1, Operator);\n  function update$1(_) {\n    if (this.value && !_.modified()) {\n      return this.value;\n    }\n    const ext = _.extents, n = ext.length;\n    let min2 = Infinity, max2 = -Infinity, i, e;\n    for (i = 0; i < n; ++i) {\n      e = ext[i];\n      if (e[0] < min2) min2 = e[0];\n      if (e[1] > max2) max2 = e[1];\n    }\n    return [min2, max2];\n  }\n  function MultiValues$1(params2) {\n    Operator.call(this, null, update, params2);\n  }\n  inherits(MultiValues$1, Operator);\n  function update(_) {\n    return this.value && !_.modified() ? this.value : _.values.reduce((data2, _2) => data2.concat(_2), []);\n  }\n  function Params$2(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Params$2, Transform, {\n    transform(_, pulse2) {\n      this.modified(_.modified());\n      this.value = _;\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function Pivot(params2) {\n    Aggregate$1.call(this, params2);\n  }\n  Pivot.Definition = {\n    \"type\": \"Pivot\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"value\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"op\",\n      \"type\": \"enum\",\n      \"values\": ValidAggregateOps,\n      \"default\": \"sum\"\n    }, {\n      \"name\": \"limit\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(Pivot, Aggregate$1, {\n    _transform: Aggregate$1.prototype.transform,\n    transform(_, pulse2) {\n      return this._transform(aggregateParams(_, pulse2), pulse2);\n    }\n  });\n  function aggregateParams(_, pulse2) {\n    const key2 = _.field, value2 = _.value, op = (_.op === \"count\" ? \"__count__\" : _.op) || \"sum\", fields = accessorFields(key2).concat(accessorFields(value2)), keys2 = pivotKeys(key2, _.limit || 0, pulse2);\n    if (pulse2.changed()) _.set(\"__pivot__\", null, null, true);\n    return {\n      key: _.key,\n      groupby: _.groupby,\n      ops: keys2.map(() => op),\n      fields: keys2.map((k) => get$4(k, key2, value2, fields)),\n      as: keys2.map((k) => k + \"\"),\n      modified: _.modified.bind(_)\n    };\n  }\n  function get$4(k, key2, value2, fields) {\n    return accessor((d) => key2(d) === k ? value2(d) : NaN, fields, k + \"\");\n  }\n  function pivotKeys(key2, limit, pulse2) {\n    const map2 = {}, list = [];\n    pulse2.visit(pulse2.SOURCE, (t) => {\n      const k = key2(t);\n      if (!map2[k]) {\n        map2[k] = 1;\n        list.push(k);\n      }\n    });\n    list.sort(ascending$2);\n    return limit ? list.slice(0, limit) : list;\n  }\n  function PreFacet$1(params2) {\n    Facet$1.call(this, params2);\n  }\n  inherits(PreFacet$1, Facet$1, {\n    transform(_, pulse2) {\n      const flow = _.subflow, field2 = _.field, subflow = (t) => this.subflow(tupleid(t), flow, pulse2, t);\n      if (_.modified(\"field\") || field2 && pulse2.modified(accessorFields(field2))) {\n        error(\"PreFacet does not support field modification.\");\n      }\n      this.initTargets();\n      if (field2) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.mod(_2));\n        });\n        pulse2.visit(pulse2.ADD, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.add(ingest$1(_2)));\n        });\n        pulse2.visit(pulse2.REM, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.rem(_2));\n        });\n      } else {\n        pulse2.visit(pulse2.MOD, (t) => subflow(t).mod(t));\n        pulse2.visit(pulse2.ADD, (t) => subflow(t).add(t));\n        pulse2.visit(pulse2.REM, (t) => subflow(t).rem(t));\n      }\n      if (pulse2.clean()) {\n        pulse2.runAfter(() => this.clean());\n      }\n      return pulse2;\n    }\n  });\n  function Project(params2) {\n    Transform.call(this, null, params2);\n  }\n  Project.Definition = {\n    \"type\": \"Project\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }]\n  };\n  inherits(Project, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, as = fieldNames(_.fields, _.as || []), derive2 = fields ? (s, t) => project(s, t, fields, as) : rederive;\n      let lut;\n      if (this.value) {\n        lut = this.value;\n      } else {\n        pulse2 = pulse2.addAll();\n        lut = this.value = {};\n      }\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t);\n        out.rem.push(lut[id2]);\n        lut[id2] = null;\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        const dt = derive2(t, ingest$1({}));\n        lut[tupleid(t)] = dt;\n        out.add.push(dt);\n      });\n      pulse2.visit(pulse2.MOD, (t) => {\n        out.mod.push(derive2(t, lut[tupleid(t)]));\n      });\n      return out;\n    }\n  });\n  function project(s, t, fields, as) {\n    for (let i = 0, n = fields.length; i < n; ++i) {\n      t[as[i]] = fields[i](s);\n    }\n    return t;\n  }\n  function Proxy$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Proxy$1, Transform, {\n    transform(_, pulse2) {\n      this.value = _.value;\n      return _.modified(\"value\") ? pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS) : pulse2.StopPropagation;\n    }\n  });\n  function Quantile$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Quantile$1.Definition = {\n    \"type\": \"Quantile\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"probs\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 0.01\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"prob\", \"value\"]\n    }]\n  };\n  const EPSILON$2 = 1e-14;\n  inherits(Quantile$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), as = _.as || [\"prob\", \"value\"];\n      if (this.value && !_.modified() && !pulse2.changed()) {\n        out.source = this.value;\n        return out;\n      }\n      const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(source2, _.groupby, _.field), names = (_.groupby || []).map(accessorName), values2 = [], step = _.step || 0.01, p = _.probs || range$3(step / 2, 1 - EPSILON$2, step), n = p.length;\n      groups.forEach((g) => {\n        const q = quantiles(g, p);\n        for (let i = 0; i < n; ++i) {\n          const t = {};\n          for (let i2 = 0; i2 < names.length; ++i2) {\n            t[names[i2]] = g.dims[i2];\n          }\n          t[as[0]] = p[i];\n          t[as[1]] = q[i];\n          values2.push(ingest$1(t));\n        }\n      });\n      if (this.value) out.rem = this.value;\n      this.value = out.add = out.source = values2;\n      return out;\n    }\n  });\n  function Relay$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Relay$1, Transform, {\n    transform(_, pulse2) {\n      let out, lut;\n      if (this.value) {\n        lut = this.value;\n      } else {\n        out = pulse2 = pulse2.addAll();\n        lut = this.value = {};\n      }\n      if (_.derive) {\n        out = pulse2.fork(pulse2.NO_SOURCE);\n        pulse2.visit(pulse2.REM, (t) => {\n          const id2 = tupleid(t);\n          out.rem.push(lut[id2]);\n          lut[id2] = null;\n        });\n        pulse2.visit(pulse2.ADD, (t) => {\n          const dt = derive(t);\n          lut[tupleid(t)] = dt;\n          out.add.push(dt);\n        });\n        pulse2.visit(pulse2.MOD, (t) => {\n          const dt = lut[tupleid(t)];\n          for (const k in t) {\n            dt[k] = t[k];\n            out.modifies(k);\n          }\n          out.mod.push(dt);\n        });\n      }\n      return out;\n    }\n  });\n  function Sample(params2) {\n    Transform.call(this, [], params2);\n    this.count = 0;\n  }\n  Sample.Definition = {\n    \"type\": \"Sample\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"default\": 1e3\n    }]\n  };\n  inherits(Sample, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), mod = _.modified(\"size\"), num = _.size, map2 = this.value.reduce((m2, t) => (m2[tupleid(t)] = 1, m2), {});\n      let res = this.value, cnt = this.count, cap = 0;\n      function update2(t) {\n        let p, idx;\n        if (res.length < num) {\n          res.push(t);\n        } else {\n          idx = ~~((cnt + 1) * random());\n          if (idx < res.length && idx >= cap) {\n            p = res[idx];\n            if (map2[tupleid(p)]) out.rem.push(p);\n            res[idx] = t;\n          }\n        }\n        ++cnt;\n      }\n      if (pulse2.rem.length) {\n        pulse2.visit(pulse2.REM, (t) => {\n          const id2 = tupleid(t);\n          if (map2[id2]) {\n            map2[id2] = -1;\n            out.rem.push(t);\n          }\n          --cnt;\n        });\n        res = res.filter((t) => map2[tupleid(t)] !== -1);\n      }\n      if ((pulse2.rem.length || mod) && res.length < num && pulse2.source) {\n        cap = cnt = res.length;\n        pulse2.visit(pulse2.SOURCE, (t) => {\n          if (!map2[tupleid(t)]) update2(t);\n        });\n        cap = -1;\n      }\n      if (mod && res.length > num) {\n        const n = res.length - num;\n        for (let i = 0; i < n; ++i) {\n          map2[tupleid(res[i])] = -1;\n          out.rem.push(res[i]);\n        }\n        res = res.slice(n);\n      }\n      if (pulse2.mod.length) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          if (map2[tupleid(t)]) out.mod.push(t);\n        });\n      }\n      if (pulse2.add.length) {\n        pulse2.visit(pulse2.ADD, update2);\n      }\n      if (pulse2.add.length || cap < 0) {\n        out.add = res.filter((t) => !map2[tupleid(t)]);\n      }\n      this.count = cnt;\n      this.value = out.source = res;\n      return out;\n    }\n  });\n  function Sequence(params2) {\n    Transform.call(this, null, params2);\n  }\n  Sequence.Definition = {\n    \"type\": \"Sequence\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"start\",\n      \"type\": \"number\",\n      \"required\": true\n    }, {\n      \"name\": \"stop\",\n      \"type\": \"number\",\n      \"required\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"data\"\n    }]\n  };\n  inherits(Sequence, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !_.modified()) return;\n      const out = pulse2.materialize().fork(pulse2.MOD), as = _.as || \"data\";\n      out.rem = this.value ? pulse2.rem.concat(this.value) : pulse2.rem;\n      this.value = range$3(_.start, _.stop, _.step || 1).map((v) => {\n        const t = {};\n        t[as] = v;\n        return ingest$1(t);\n      });\n      out.add = pulse2.add.concat(this.value);\n      return out;\n    }\n  });\n  function Sieve$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Sieve$1, Transform, {\n    transform(_, pulse2) {\n      this.value = pulse2.source;\n      return pulse2.changed() ? pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS) : pulse2.StopPropagation;\n    }\n  });\n  function TimeUnit(params2) {\n    Transform.call(this, null, params2);\n  }\n  const OUTPUT = [\"unit0\", \"unit1\"];\n  TimeUnit.Definition = {\n    \"type\": \"TimeUnit\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"interval\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"units\",\n      \"type\": \"enum\",\n      \"values\": TIME_UNITS,\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"maxbins\",\n      \"type\": \"number\",\n      \"default\": 40\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"date\",\n      \"array\": true\n    }, {\n      \"name\": \"timezone\",\n      \"type\": \"enum\",\n      \"default\": \"local\",\n      \"values\": [\"local\", \"utc\"]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": OUTPUT\n    }]\n  };\n  inherits(TimeUnit, Transform, {\n    transform(_, pulse2) {\n      const field2 = _.field, band2 = _.interval !== false, utc = _.timezone === \"utc\", floor2 = this._floor(_, pulse2), offset2 = (utc ? utcInterval : timeInterval)(floor2.unit).offset, as = _.as || OUTPUT, u0 = as[0], u1 = as[1], step = floor2.step;\n      let min2 = floor2.start || Infinity, max2 = floor2.stop || -Infinity, flag2 = pulse2.ADD;\n      if (_.modified() || pulse2.changed(pulse2.REM) || pulse2.modified(accessorFields(field2))) {\n        pulse2 = pulse2.reflow(true);\n        flag2 = pulse2.SOURCE;\n        min2 = Infinity;\n        max2 = -Infinity;\n      }\n      pulse2.visit(flag2, (t) => {\n        const v = field2(t);\n        let a2, b2;\n        if (v == null) {\n          t[u0] = null;\n          if (band2) t[u1] = null;\n        } else {\n          t[u0] = a2 = b2 = floor2(v);\n          if (band2) t[u1] = b2 = offset2(a2, step);\n          if (a2 < min2) min2 = a2;\n          if (b2 > max2) max2 = b2;\n        }\n      });\n      floor2.start = min2;\n      floor2.stop = max2;\n      return pulse2.modifies(band2 ? as : u0);\n    },\n    _floor(_, pulse2) {\n      const utc = _.timezone === \"utc\";\n      const {\n        units,\n        step\n      } = _.units ? {\n        units: _.units,\n        step: _.step || 1\n      } : bin$1({\n        extent: _.extent || extent(pulse2.materialize(pulse2.SOURCE).source, _.field),\n        maxbins: _.maxbins\n      });\n      const tunits = timeUnits(units), prev = this.value || {}, floor2 = (utc ? utcFloor : timeFloor)(tunits, step);\n      floor2.unit = peek$1(tunits);\n      floor2.units = tunits;\n      floor2.step = step;\n      floor2.start = prev.start;\n      floor2.stop = prev.stop;\n      return this.value = floor2;\n    }\n  });\n  function TupleIndex(params2) {\n    Transform.call(this, fastmap(), params2);\n  }\n  inherits(TupleIndex, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, field2 = _.field, index2 = this.value, set2 = (t) => index2.set(field2(t), t);\n      let mod = true;\n      if (_.modified(\"field\") || pulse2.modified(field2.fields)) {\n        index2.clear();\n        pulse2.visit(pulse2.SOURCE, set2);\n      } else if (pulse2.changed()) {\n        pulse2.visit(pulse2.REM, (t) => index2.delete(field2(t)));\n        pulse2.visit(pulse2.ADD, set2);\n      } else {\n        mod = false;\n      }\n      this.modified(mod);\n      if (index2.empty > df.cleanThreshold) df.runAfter(index2.clean);\n      return pulse2.fork();\n    }\n  });\n  function Values$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Values$1, Transform, {\n    transform(_, pulse2) {\n      const run2 = !this.value || _.modified(\"field\") || _.modified(\"sort\") || pulse2.changed() || _.sort && pulse2.modified(_.sort.fields);\n      if (run2) {\n        this.value = (_.sort ? pulse2.source.slice().sort(stableCompare(_.sort)) : pulse2.source).map(_.field);\n      }\n    }\n  });\n  function WindowOp(op, field2, param2, as) {\n    const fn2 = WindowOps[op](field2, param2);\n    return {\n      init: fn2.init || zero$3,\n      update: function(w2, t) {\n        t[as] = fn2.next(w2);\n      }\n    };\n  }\n  const WindowOps = {\n    row_number: function() {\n      return {\n        next: (w2) => w2.index + 1\n      };\n    },\n    rank: function() {\n      let rank2;\n      return {\n        init: () => rank2 = 1,\n        next: (w2) => {\n          const i = w2.index, data2 = w2.data;\n          return i && w2.compare(data2[i - 1], data2[i]) ? rank2 = i + 1 : rank2;\n        }\n      };\n    },\n    dense_rank: function() {\n      let drank;\n      return {\n        init: () => drank = 1,\n        next: (w2) => {\n          const i = w2.index, d = w2.data;\n          return i && w2.compare(d[i - 1], d[i]) ? ++drank : drank;\n        }\n      };\n    },\n    percent_rank: function() {\n      const rank2 = WindowOps.rank(), next = rank2.next;\n      return {\n        init: rank2.init,\n        next: (w2) => (next(w2) - 1) / (w2.data.length - 1)\n      };\n    },\n    cume_dist: function() {\n      let cume;\n      return {\n        init: () => cume = 0,\n        next: (w2) => {\n          const d = w2.data, c2 = w2.compare;\n          let i = w2.index;\n          if (cume < i) {\n            while (i + 1 < d.length && !c2(d[i], d[i + 1])) ++i;\n            cume = i;\n          }\n          return (1 + cume) / d.length;\n        }\n      };\n    },\n    ntile: function(field2, num) {\n      num = +num;\n      if (!(num > 0)) error(\"ntile num must be greater than zero.\");\n      const cume = WindowOps.cume_dist(), next = cume.next;\n      return {\n        init: cume.init,\n        next: (w2) => Math.ceil(num * next(w2))\n      };\n    },\n    lag: function(field2, offset2) {\n      offset2 = +offset2 || 1;\n      return {\n        next: (w2) => {\n          const i = w2.index - offset2;\n          return i >= 0 ? field2(w2.data[i]) : null;\n        }\n      };\n    },\n    lead: function(field2, offset2) {\n      offset2 = +offset2 || 1;\n      return {\n        next: (w2) => {\n          const i = w2.index + offset2, d = w2.data;\n          return i < d.length ? field2(d[i]) : null;\n        }\n      };\n    },\n    first_value: function(field2) {\n      return {\n        next: (w2) => field2(w2.data[w2.i0])\n      };\n    },\n    last_value: function(field2) {\n      return {\n        next: (w2) => field2(w2.data[w2.i1 - 1])\n      };\n    },\n    nth_value: function(field2, nth) {\n      nth = +nth;\n      if (!(nth > 0)) error(\"nth_value nth must be greater than zero.\");\n      return {\n        next: (w2) => {\n          const i = w2.i0 + (nth - 1);\n          return i < w2.i1 ? field2(w2.data[i]) : null;\n        }\n      };\n    },\n    prev_value: function(field2) {\n      let prev;\n      return {\n        init: () => prev = null,\n        next: (w2) => {\n          const v = field2(w2.data[w2.index]);\n          return v != null ? prev = v : prev;\n        }\n      };\n    },\n    next_value: function(field2) {\n      let v, i;\n      return {\n        init: () => (v = null, i = -1),\n        next: (w2) => {\n          const d = w2.data;\n          return w2.index <= i ? v : (i = find$2(field2, d, w2.index)) < 0 ? (i = d.length, v = null) : v = field2(d[i]);\n        }\n      };\n    }\n  };\n  function find$2(field2, data2, index2) {\n    for (let n = data2.length; index2 < n; ++index2) {\n      const v = field2(data2[index2]);\n      if (v != null) return index2;\n    }\n    return -1;\n  }\n  const ValidWindowOps = Object.keys(WindowOps);\n  function WindowState(_) {\n    const ops2 = array$5(_.ops), fields = array$5(_.fields), params2 = array$5(_.params), aggregate_params = array$5(_.aggregate_params), as = array$5(_.as), outputs = this.outputs = [], windows = this.windows = [], inputs = {}, map2 = {}, counts = [], measures = [];\n    let countOnly = true;\n    function visitInputs(f) {\n      array$5(accessorFields(f)).forEach((_2) => inputs[_2] = 1);\n    }\n    visitInputs(_.sort);\n    ops2.forEach((op, i) => {\n      const field2 = fields[i], param2 = params2[i], aggregate_param = aggregate_params[i] || null, mname = accessorName(field2), name = measureName(op, mname, as[i]);\n      visitInputs(field2);\n      outputs.push(name);\n      if (has$1(WindowOps, op)) {\n        windows.push(WindowOp(op, field2, param2, name));\n      } else {\n        if (field2 == null && op !== \"count\") {\n          error(\"Null aggregate field specified.\");\n        }\n        if (op === \"count\") {\n          counts.push(name);\n          return;\n        }\n        countOnly = false;\n        let m2 = map2[mname];\n        if (!m2) {\n          m2 = map2[mname] = [];\n          m2.field = field2;\n          measures.push(m2);\n        }\n        m2.push(createMeasure(op, aggregate_param, name));\n      }\n    });\n    if (counts.length || measures.length) {\n      this.cell = cell(measures, counts, countOnly);\n    }\n    this.inputs = Object.keys(inputs);\n  }\n  const prototype = WindowState.prototype;\n  prototype.init = function() {\n    this.windows.forEach((_) => _.init());\n    if (this.cell) this.cell.init();\n  };\n  prototype.update = function(w2, t) {\n    const cell2 = this.cell, wind = this.windows, data2 = w2.data, m2 = wind && wind.length;\n    let j;\n    if (cell2) {\n      for (j = w2.p0; j < w2.i0; ++j) cell2.rem(data2[j]);\n      for (j = w2.p1; j < w2.i1; ++j) cell2.add(data2[j]);\n      cell2.set(t);\n    }\n    for (j = 0; j < m2; ++j) wind[j].update(w2, t);\n  };\n  function cell(measures, counts, countOnly) {\n    measures = measures.map((m2) => compileMeasures(m2, m2.field));\n    const cell2 = {\n      num: 0,\n      agg: null,\n      store: false,\n      count: counts\n    };\n    if (!countOnly) {\n      var n = measures.length, a2 = cell2.agg = Array(n), i = 0;\n      for (; i < n; ++i) a2[i] = new measures[i](cell2);\n    }\n    if (cell2.store) {\n      var store = cell2.data = new TupleStore();\n    }\n    cell2.add = function(t) {\n      cell2.num += 1;\n      if (countOnly) return;\n      if (store) store.add(t);\n      for (let i2 = 0; i2 < n; ++i2) {\n        a2[i2].add(a2[i2].get(t), t);\n      }\n    };\n    cell2.rem = function(t) {\n      cell2.num -= 1;\n      if (countOnly) return;\n      if (store) store.rem(t);\n      for (let i2 = 0; i2 < n; ++i2) {\n        a2[i2].rem(a2[i2].get(t), t);\n      }\n    };\n    cell2.set = function(t) {\n      let i2, n2;\n      if (store) store.values();\n      for (i2 = 0, n2 = counts.length; i2 < n2; ++i2) t[counts[i2]] = cell2.num;\n      if (!countOnly) for (i2 = 0, n2 = a2.length; i2 < n2; ++i2) a2[i2].set(t);\n    };\n    cell2.init = function() {\n      cell2.num = 0;\n      if (store) store.reset();\n      for (let i2 = 0; i2 < n; ++i2) a2[i2].init();\n    };\n    return cell2;\n  }\n  function Window(params2) {\n    Transform.call(this, {}, params2);\n    this._mlen = 0;\n    this._mods = [];\n  }\n  Window.Definition = {\n    \"type\": \"Window\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidWindowOps.concat(ValidAggregateOps)\n    }, {\n      \"name\": \"params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"aggregate_params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"frame\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [null, 0]\n    }, {\n      \"name\": \"ignorePeers\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }]\n  };\n  inherits(Window, Transform, {\n    transform(_, pulse2) {\n      this.stamp = pulse2.stamp;\n      const mod = _.modified(), cmp = stableCompare(_.sort), key2 = groupkey(_.groupby), group2 = (t) => this.group(key2(t));\n      let state = this.state;\n      if (!state || mod) {\n        state = this.state = new WindowState(_);\n      }\n      if (mod || pulse2.modified(state.inputs)) {\n        this.value = {};\n        pulse2.visit(pulse2.SOURCE, (t) => group2(t).add(t));\n      } else {\n        pulse2.visit(pulse2.REM, (t) => group2(t).remove(t));\n        pulse2.visit(pulse2.ADD, (t) => group2(t).add(t));\n      }\n      for (let i = 0, n = this._mlen; i < n; ++i) {\n        processPartition(this._mods[i], state, cmp, _);\n      }\n      this._mlen = 0;\n      this._mods = [];\n      return pulse2.reflow(mod).modifies(state.outputs);\n    },\n    group(key2) {\n      let group2 = this.value[key2];\n      if (!group2) {\n        group2 = this.value[key2] = SortedList(tupleid);\n        group2.stamp = -1;\n      }\n      if (group2.stamp < this.stamp) {\n        group2.stamp = this.stamp;\n        this._mods[this._mlen++] = group2;\n      }\n      return group2;\n    }\n  });\n  function processPartition(list, state, cmp, _) {\n    const sort2 = _.sort, range2 = sort2 && !_.ignorePeers, frame2 = _.frame || [null, 0], data2 = list.data(cmp), n = data2.length, b2 = range2 ? bisector(sort2) : null, w2 = {\n      i0: 0,\n      i1: 0,\n      p0: 0,\n      p1: 0,\n      index: 0,\n      data: data2,\n      compare: sort2 || constant$5(-1)\n    };\n    state.init();\n    for (let i = 0; i < n; ++i) {\n      setWindow(w2, frame2, i, n);\n      if (range2) adjustRange(w2, b2);\n      state.update(w2, data2[i]);\n    }\n  }\n  function setWindow(w2, f, i, n) {\n    w2.p0 = w2.i0;\n    w2.p1 = w2.i1;\n    w2.i0 = f[0] == null ? 0 : Math.max(0, i - Math.abs(f[0]));\n    w2.i1 = f[1] == null ? n : Math.min(n, i + Math.abs(f[1]) + 1);\n    w2.index = i;\n  }\n  function adjustRange(w2, bisect2) {\n    const r0 = w2.i0, r1 = w2.i1 - 1, c2 = w2.compare, d = w2.data, n = d.length - 1;\n    if (r0 > 0 && !c2(d[r0], d[r0 - 1])) w2.i0 = bisect2.left(d, d[r0]);\n    if (r1 < n && !c2(d[r1], d[r1 + 1])) w2.i1 = bisect2.right(d, d[r1]);\n  }\n  const tx = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    aggregate: Aggregate$1,\n    bin: Bin,\n    collect: Collect$1,\n    compare: Compare$1,\n    countpattern: CountPattern,\n    cross: Cross$1,\n    density: Density,\n    dotbin: DotBin,\n    expression: Expression$1,\n    extent: Extent,\n    facet: Facet$1,\n    field: Field$1,\n    filter: Filter,\n    flatten: Flatten,\n    fold: Fold,\n    formula: Formula,\n    generate: Generate,\n    impute: Impute,\n    joinaggregate: JoinAggregate,\n    kde: KDE,\n    key: Key$1,\n    load: Load$1,\n    lookup: Lookup,\n    multiextent: MultiExtent$1,\n    multivalues: MultiValues$1,\n    params: Params$2,\n    pivot: Pivot,\n    prefacet: PreFacet$1,\n    project: Project,\n    proxy: Proxy$1,\n    quantile: Quantile$1,\n    relay: Relay$1,\n    sample: Sample,\n    sequence: Sequence,\n    sieve: Sieve$1,\n    subflow: Subflow,\n    timeunit: TimeUnit,\n    tupleindex: TupleIndex,\n    values: Values$1,\n    window: Window\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function constant$3(x2) {\n    return function constant2() {\n      return x2;\n    };\n  }\n  const abs$2 = Math.abs;\n  const atan2$1 = Math.atan2;\n  const cos$2 = Math.cos;\n  const max$2 = Math.max;\n  const min$2 = Math.min;\n  const sin$2 = Math.sin;\n  const sqrt$3 = Math.sqrt;\n  const epsilon$5 = 1e-12;\n  const pi$3 = Math.PI;\n  const halfPi$2 = pi$3 / 2;\n  const tau$3 = 2 * pi$3;\n  function acos$1(x2) {\n    return x2 > 1 ? 0 : x2 < -1 ? pi$3 : Math.acos(x2);\n  }\n  function asin$2(x2) {\n    return x2 >= 1 ? halfPi$2 : x2 <= -1 ? -halfPi$2 : Math.asin(x2);\n  }\n  const pi$2 = Math.PI, tau$2 = 2 * pi$2, epsilon$4 = 1e-6, tauEpsilon = tau$2 - epsilon$4;\n  function append$1(strings) {\n    this._ += strings[0];\n    for (let i = 1, n = strings.length; i < n; ++i) {\n      this._ += arguments[i] + strings[i];\n    }\n  }\n  function appendRound$1(digits) {\n    let d = Math.floor(digits);\n    if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n    if (d > 15) return append$1;\n    const k = 10 ** d;\n    return function(strings) {\n      this._ += strings[0];\n      for (let i = 1, n = strings.length; i < n; ++i) {\n        this._ += Math.round(arguments[i] * k) / k + strings[i];\n      }\n    };\n  }\n  let Path$1 = class Path {\n    constructor(digits) {\n      this._x0 = this._y0 = // start of current subpath\n      this._x1 = this._y1 = null;\n      this._ = \"\";\n      this._append = digits == null ? append$1 : appendRound$1(digits);\n    }\n    moveTo(x2, y2) {\n      this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;\n    }\n    closePath() {\n      if (this._x1 !== null) {\n        this._x1 = this._x0, this._y1 = this._y0;\n        this._append`Z`;\n      }\n    }\n    lineTo(x2, y2) {\n      this._append`L${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    quadraticCurveTo(x12, y12, x2, y2) {\n      this._append`Q${+x12},${+y12},${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    bezierCurveTo(x12, y12, x2, y2, x3, y3) {\n      this._append`C${+x12},${+y12},${+x2},${+y2},${this._x1 = +x3},${this._y1 = +y3}`;\n    }\n    arcTo(x12, y12, x2, y2, r) {\n      x12 = +x12, y12 = +y12, x2 = +x2, y2 = +y2, r = +r;\n      if (r < 0) throw new Error(`negative radius: ${r}`);\n      let x02 = this._x1, y02 = this._y1, x21 = x2 - x12, y21 = y2 - y12, x01 = x02 - x12, y01 = y02 - y12, l01_2 = x01 * x01 + y01 * y01;\n      if (this._x1 === null) {\n        this._append`M${this._x1 = x12},${this._y1 = y12}`;\n      } else if (!(l01_2 > epsilon$4)) ;\n      else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$4) || !r) {\n        this._append`L${this._x1 = x12},${this._y1 = y12}`;\n      } else {\n        let x20 = x2 - x02, y20 = y2 - y02, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;\n        if (Math.abs(t01 - 1) > epsilon$4) {\n          this._append`L${x12 + t01 * x01},${y12 + t01 * y01}`;\n        }\n        this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x12 + t21 * x21},${this._y1 = y12 + t21 * y21}`;\n      }\n    }\n    arc(x2, y2, r, a0, a1, ccw) {\n      x2 = +x2, y2 = +y2, r = +r, ccw = !!ccw;\n      if (r < 0) throw new Error(`negative radius: ${r}`);\n      let dx = r * Math.cos(a0), dy = r * Math.sin(a0), x02 = x2 + dx, y02 = y2 + dy, cw2 = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;\n      if (this._x1 === null) {\n        this._append`M${x02},${y02}`;\n      } else if (Math.abs(this._x1 - x02) > epsilon$4 || Math.abs(this._y1 - y02) > epsilon$4) {\n        this._append`L${x02},${y02}`;\n      }\n      if (!r) return;\n      if (da < 0) da = da % tau$2 + tau$2;\n      if (da > tauEpsilon) {\n        this._append`A${r},${r},0,1,${cw2},${x2 - dx},${y2 - dy}A${r},${r},0,1,${cw2},${this._x1 = x02},${this._y1 = y02}`;\n      } else if (da > epsilon$4) {\n        this._append`A${r},${r},0,${+(da >= pi$2)},${cw2},${this._x1 = x2 + r * Math.cos(a1)},${this._y1 = y2 + r * Math.sin(a1)}`;\n      }\n    }\n    rect(x2, y2, w2, h2) {\n      this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${w2 = +w2}v${+h2}h${-w2}Z`;\n    }\n    toString() {\n      return this._;\n    }\n  };\n  function path$3() {\n    return new Path$1();\n  }\n  path$3.prototype = Path$1.prototype;\n  function withPath(shape2) {\n    let digits = 3;\n    shape2.digits = function(_) {\n      if (!arguments.length) return digits;\n      if (_ == null) {\n        digits = null;\n      } else {\n        const d = Math.floor(_);\n        if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n        digits = d;\n      }\n      return shape2;\n    };\n    return () => new Path$1(digits);\n  }\n  function arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function arcPadAngle(d) {\n    return d && d.padAngle;\n  }\n  function intersect$3(x02, y02, x12, y12, x2, y2, x3, y3) {\n    var x10 = x12 - x02, y10 = y12 - y02, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10;\n    if (t * t < epsilon$5) return;\n    t = (x32 * (y02 - y2) - y32 * (x02 - x2)) / t;\n    return [x02 + t * x10, y02 + t * y10];\n  }\n  function cornerTangents(x02, y02, x12, y12, r1, rc, cw2) {\n    var x01 = x02 - x12, y01 = y02 - y12, lo = (cw2 ? rc : -rc) / sqrt$3(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x02 + ox, y11 = y02 + oy, x10 = x12 + ox, y10 = y12 + oy, x002 = (x11 + x10) / 2, y002 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D2 = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * sqrt$3(max$2(0, r * r * d2 - D2 * D2)), cx0 = (D2 * dy - dx * d) / d2, cy0 = (-D2 * dx - dy * d) / d2, cx1 = (D2 * dy + dx * d) / d2, cy1 = (-D2 * dx + dy * d) / d2, dx0 = cx0 - x002, dy0 = cy0 - y002, dx1 = cx1 - x002, dy1 = cy1 - y002;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return {\n      cx: cx0,\n      cy: cy0,\n      x01: -ox,\n      y01: -oy,\n      x11: cx0 * (r1 / r - 1),\n      y11: cy0 * (r1 / r - 1)\n    };\n  }\n  function arc$2$1() {\n    var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant$3(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context2 = null, path2 = withPath(arc2);\n    function arc2() {\n      var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi$2, a1 = endAngle.apply(this, arguments) - halfPi$2, da = abs$2(a1 - a0), cw2 = a1 > a0;\n      if (!context2) context2 = buffer = path2();\n      if (r1 < r0) r = r1, r1 = r0, r0 = r;\n      if (!(r1 > epsilon$5)) context2.moveTo(0, 0);\n      else if (da > tau$3 - epsilon$5) {\n        context2.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));\n        context2.arc(0, 0, r1, a0, a1, !cw2);\n        if (r0 > epsilon$5) {\n          context2.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));\n          context2.arc(0, 0, r0, a1, a0, cw2);\n        }\n      } else {\n        var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > epsilon$5 && (padRadius ? +padRadius.apply(this, arguments) : sqrt$3(r0 * r0 + r1 * r1)), rc = min$2(abs$2(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t02, t12;\n        if (rp > epsilon$5) {\n          var p02 = asin$2(rp / r0 * sin$2(ap)), p1 = asin$2(rp / r1 * sin$2(ap));\n          if ((da0 -= p02 * 2) > epsilon$5) p02 *= cw2 ? 1 : -1, a00 += p02, a10 -= p02;\n          else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n          if ((da1 -= p1 * 2) > epsilon$5) p1 *= cw2 ? 1 : -1, a01 += p1, a11 -= p1;\n          else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n        }\n        var x01 = r1 * cos$2(a01), y01 = r1 * sin$2(a01), x10 = r0 * cos$2(a10), y10 = r0 * sin$2(a10);\n        if (rc > epsilon$5) {\n          var x11 = r1 * cos$2(a11), y11 = r1 * sin$2(a11), x002 = r0 * cos$2(a00), y002 = r0 * sin$2(a00), oc;\n          if (da < pi$3) {\n            if (oc = intersect$3(x01, y01, x002, y002, x11, y11, x10, y10)) {\n              var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$3(ax * ax + ay * ay) * sqrt$3(bx * bx + by * by))) / 2), lc = sqrt$3(oc[0] * oc[0] + oc[1] * oc[1]);\n              rc0 = min$2(rc, (r0 - lc) / (kc - 1));\n              rc1 = min$2(rc, (r1 - lc) / (kc + 1));\n            } else {\n              rc0 = rc1 = 0;\n            }\n          }\n        }\n        if (!(da1 > epsilon$5)) context2.moveTo(x01, y01);\n        else if (rc1 > epsilon$5) {\n          t02 = cornerTangents(x002, y002, x01, y01, r1, rc1, cw2);\n          t12 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw2);\n          context2.moveTo(t02.cx + t02.x01, t02.cy + t02.y01);\n          if (rc1 < rc) context2.arc(t02.cx, t02.cy, rc1, atan2$1(t02.y01, t02.x01), atan2$1(t12.y01, t12.x01), !cw2);\n          else {\n            context2.arc(t02.cx, t02.cy, rc1, atan2$1(t02.y01, t02.x01), atan2$1(t02.y11, t02.x11), !cw2);\n            context2.arc(0, 0, r1, atan2$1(t02.cy + t02.y11, t02.cx + t02.x11), atan2$1(t12.cy + t12.y11, t12.cx + t12.x11), !cw2);\n            context2.arc(t12.cx, t12.cy, rc1, atan2$1(t12.y11, t12.x11), atan2$1(t12.y01, t12.x01), !cw2);\n          }\n        } else context2.moveTo(x01, y01), context2.arc(0, 0, r1, a01, a11, !cw2);\n        if (!(r0 > epsilon$5) || !(da0 > epsilon$5)) context2.lineTo(x10, y10);\n        else if (rc0 > epsilon$5) {\n          t02 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw2);\n          t12 = cornerTangents(x01, y01, x002, y002, r0, -rc0, cw2);\n          context2.lineTo(t02.cx + t02.x01, t02.cy + t02.y01);\n          if (rc0 < rc) context2.arc(t02.cx, t02.cy, rc0, atan2$1(t02.y01, t02.x01), atan2$1(t12.y01, t12.x01), !cw2);\n          else {\n            context2.arc(t02.cx, t02.cy, rc0, atan2$1(t02.y01, t02.x01), atan2$1(t02.y11, t02.x11), !cw2);\n            context2.arc(0, 0, r0, atan2$1(t02.cy + t02.y11, t02.cx + t02.x11), atan2$1(t12.cy + t12.y11, t12.cx + t12.x11), cw2);\n            context2.arc(t12.cx, t12.cy, rc0, atan2$1(t12.y11, t12.x11), atan2$1(t12.y01, t12.x01), !cw2);\n          }\n        } else context2.arc(0, 0, r0, a10, a00, cw2);\n      }\n      context2.closePath();\n      if (buffer) return context2 = null, buffer + \"\" || null;\n    }\n    arc2.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a2 = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$3 / 2;\n      return [cos$2(a2) * r, sin$2(a2) * r];\n    };\n    arc2.innerRadius = function(_) {\n      return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : innerRadius;\n    };\n    arc2.outerRadius = function(_) {\n      return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : outerRadius;\n    };\n    arc2.cornerRadius = function(_) {\n      return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : cornerRadius;\n    };\n    arc2.padRadius = function(_) {\n      return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant$3(+_), arc2) : padRadius;\n    };\n    arc2.startAngle = function(_) {\n      return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : startAngle;\n    };\n    arc2.endAngle = function(_) {\n      return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : endAngle;\n    };\n    arc2.padAngle = function(_) {\n      return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : padAngle;\n    };\n    arc2.context = function(_) {\n      return arguments.length ? (context2 = _ == null ? null : _, arc2) : context2;\n    };\n    return arc2;\n  }\n  function array$4(x2) {\n    return typeof x2 === \"object\" && \"length\" in x2 ? x2 : Array.from(x2);\n  }\n  function Linear$1(context2) {\n    this._context = context2;\n  }\n  Linear$1.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n        // falls through\n        default:\n          this._context.lineTo(x2, y2);\n          break;\n      }\n    }\n  };\n  function curveLinear(context2) {\n    return new Linear$1(context2);\n  }\n  function x$3(p) {\n    return p[0];\n  }\n  function y$3(p) {\n    return p[1];\n  }\n  function line$2$1(x2, y2) {\n    var defined = constant$3(true), context2 = null, curve2 = curveLinear, output2 = null, path2 = withPath(line2);\n    x2 = typeof x2 === \"function\" ? x2 : x2 === void 0 ? x$3 : constant$3(x2);\n    y2 = typeof y2 === \"function\" ? y2 : y2 === void 0 ? y$3 : constant$3(y2);\n    function line2(data2) {\n      var i, n = (data2 = array$4(data2)).length, d, defined0 = false, buffer;\n      if (context2 == null) output2 = curve2(buffer = path2());\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) output2.lineStart();\n          else output2.lineEnd();\n        }\n        if (defined0) output2.point(+x2(d, i, data2), +y2(d, i, data2));\n      }\n      if (buffer) return output2 = null, buffer + \"\" || null;\n    }\n    line2.x = function(_) {\n      return arguments.length ? (x2 = typeof _ === \"function\" ? _ : constant$3(+_), line2) : x2;\n    };\n    line2.y = function(_) {\n      return arguments.length ? (y2 = typeof _ === \"function\" ? _ : constant$3(+_), line2) : y2;\n    };\n    line2.defined = function(_) {\n      return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant$3(!!_), line2) : defined;\n    };\n    line2.curve = function(_) {\n      return arguments.length ? (curve2 = _, context2 != null && (output2 = curve2(context2)), line2) : curve2;\n    };\n    line2.context = function(_) {\n      return arguments.length ? (_ == null ? context2 = output2 = null : output2 = curve2(context2 = _), line2) : context2;\n    };\n    return line2;\n  }\n  function area$2$1(x02, y02, y12) {\n    var x12 = null, defined = constant$3(true), context2 = null, curve2 = curveLinear, output2 = null, path2 = withPath(area2);\n    x02 = typeof x02 === \"function\" ? x02 : x02 === void 0 ? x$3 : constant$3(+x02);\n    y02 = typeof y02 === \"function\" ? y02 : y02 === void 0 ? constant$3(0) : constant$3(+y02);\n    y12 = typeof y12 === \"function\" ? y12 : y12 === void 0 ? y$3 : constant$3(+y12);\n    function area2(data2) {\n      var i, j, k, n = (data2 = array$4(data2)).length, d, defined0 = false, buffer, x0z = new Array(n), y0z = new Array(n);\n      if (context2 == null) output2 = curve2(buffer = path2());\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) {\n            j = i;\n            output2.areaStart();\n            output2.lineStart();\n          } else {\n            output2.lineEnd();\n            output2.lineStart();\n            for (k = i - 1; k >= j; --k) {\n              output2.point(x0z[k], y0z[k]);\n            }\n            output2.lineEnd();\n            output2.areaEnd();\n          }\n        }\n        if (defined0) {\n          x0z[i] = +x02(d, i, data2), y0z[i] = +y02(d, i, data2);\n          output2.point(x12 ? +x12(d, i, data2) : x0z[i], y12 ? +y12(d, i, data2) : y0z[i]);\n        }\n      }\n      if (buffer) return output2 = null, buffer + \"\" || null;\n    }\n    function arealine() {\n      return line$2$1().defined(defined).curve(curve2).context(context2);\n    }\n    area2.x = function(_) {\n      return arguments.length ? (x02 = typeof _ === \"function\" ? _ : constant$3(+_), x12 = null, area2) : x02;\n    };\n    area2.x0 = function(_) {\n      return arguments.length ? (x02 = typeof _ === \"function\" ? _ : constant$3(+_), area2) : x02;\n    };\n    area2.x1 = function(_) {\n      return arguments.length ? (x12 = _ == null ? null : typeof _ === \"function\" ? _ : constant$3(+_), area2) : x12;\n    };\n    area2.y = function(_) {\n      return arguments.length ? (y02 = typeof _ === \"function\" ? _ : constant$3(+_), y12 = null, area2) : y02;\n    };\n    area2.y0 = function(_) {\n      return arguments.length ? (y02 = typeof _ === \"function\" ? _ : constant$3(+_), area2) : y02;\n    };\n    area2.y1 = function(_) {\n      return arguments.length ? (y12 = _ == null ? null : typeof _ === \"function\" ? _ : constant$3(+_), area2) : y12;\n    };\n    area2.lineX0 = area2.lineY0 = function() {\n      return arealine().x(x02).y(y02);\n    };\n    area2.lineY1 = function() {\n      return arealine().x(x02).y(y12);\n    };\n    area2.lineX1 = function() {\n      return arealine().x(x12).y(y02);\n    };\n    area2.defined = function(_) {\n      return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant$3(!!_), area2) : defined;\n    };\n    area2.curve = function(_) {\n      return arguments.length ? (curve2 = _, context2 != null && (output2 = curve2(context2)), area2) : curve2;\n    };\n    area2.context = function(_) {\n      return arguments.length ? (_ == null ? context2 = output2 = null : output2 = curve2(context2 = _), area2) : context2;\n    };\n    return area2;\n  }\n  const circle = {\n    draw(context2, size2) {\n      const r = sqrt$3(size2 / pi$3);\n      context2.moveTo(r, 0);\n      context2.arc(0, 0, r, 0, tau$3);\n    }\n  };\n  function Symbol$1(type2, size2) {\n    let context2 = null, path2 = withPath(symbol2);\n    type2 = typeof type2 === \"function\" ? type2 : constant$3(type2 || circle);\n    size2 = typeof size2 === \"function\" ? size2 : constant$3(size2 === void 0 ? 64 : +size2);\n    function symbol2() {\n      let buffer;\n      if (!context2) context2 = buffer = path2();\n      type2.apply(this, arguments).draw(context2, +size2.apply(this, arguments));\n      if (buffer) return context2 = null, buffer + \"\" || null;\n    }\n    symbol2.type = function(_) {\n      return arguments.length ? (type2 = typeof _ === \"function\" ? _ : constant$3(_), symbol2) : type2;\n    };\n    symbol2.size = function(_) {\n      return arguments.length ? (size2 = typeof _ === \"function\" ? _ : constant$3(+_), symbol2) : size2;\n    };\n    symbol2.context = function(_) {\n      return arguments.length ? (context2 = _ == null ? null : _, symbol2) : context2;\n    };\n    return symbol2;\n  }\n  function noop$3() {\n  }\n  function point$5(that, x2, y2) {\n    that._context.bezierCurveTo(\n      (2 * that._x0 + that._x1) / 3,\n      (2 * that._y0 + that._y1) / 3,\n      (that._x0 + 2 * that._x1) / 3,\n      (that._y0 + 2 * that._y1) / 3,\n      (that._x0 + 4 * that._x1 + x2) / 6,\n      (that._y0 + 4 * that._y1 + y2) / 6\n    );\n  }\n  function Basis(context2) {\n    this._context = context2;\n  }\n  Basis.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 3:\n          point$5(this, this._x1, this._y1);\n        // falls through\n        case 2:\n          this._context.lineTo(this._x1, this._y1);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);\n        // falls through\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasis(context2) {\n    return new Basis(context2);\n  }\n  function BasisClosed(context2) {\n    this._context = context2;\n  }\n  BasisClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x2, this._y2);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n          this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x2, this._y2);\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x2 = x2, this._y2 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 2:\n          this._point = 3;\n          this._x4 = x2, this._y4 = y2;\n          this._context.moveTo((this._x0 + 4 * this._x1 + x2) / 6, (this._y0 + 4 * this._y1 + y2) / 6);\n          break;\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasisClosed(context2) {\n    return new BasisClosed(context2);\n  }\n  function BasisOpen(context2) {\n    this._context = context2;\n  }\n  BasisOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          var x02 = (this._x0 + 4 * this._x1 + x2) / 6, y02 = (this._y0 + 4 * this._y1 + y2) / 6;\n          this._line ? this._context.lineTo(x02, y02) : this._context.moveTo(x02, y02);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasisOpen(context2) {\n    return new BasisOpen(context2);\n  }\n  function Bundle(context2, beta) {\n    this._basis = new Basis(context2);\n    this._beta = beta;\n  }\n  Bundle.prototype = {\n    lineStart: function() {\n      this._x = [];\n      this._y = [];\n      this._basis.lineStart();\n    },\n    lineEnd: function() {\n      var x2 = this._x, y2 = this._y, j = x2.length - 1;\n      if (j > 0) {\n        var x02 = x2[0], y02 = y2[0], dx = x2[j] - x02, dy = y2[j] - y02, i = -1, t;\n        while (++i <= j) {\n          t = i / j;\n          this._basis.point(\n            this._beta * x2[i] + (1 - this._beta) * (x02 + t * dx),\n            this._beta * y2[i] + (1 - this._beta) * (y02 + t * dy)\n          );\n        }\n      }\n      this._x = this._y = null;\n      this._basis.lineEnd();\n    },\n    point: function(x2, y2) {\n      this._x.push(+x2);\n      this._y.push(+y2);\n    }\n  };\n  const curveBundle = (function custom2(beta) {\n    function bundle2(context2) {\n      return beta === 1 ? new Basis(context2) : new Bundle(context2, beta);\n    }\n    bundle2.beta = function(beta2) {\n      return custom2(+beta2);\n    };\n    return bundle2;\n  })(0.85);\n  function point$4(that, x2, y2) {\n    that._context.bezierCurveTo(\n      that._x1 + that._k * (that._x2 - that._x0),\n      that._y1 + that._k * (that._y2 - that._y0),\n      that._x2 + that._k * (that._x1 - x2),\n      that._y2 + that._k * (that._y1 - y2),\n      that._x2,\n      that._y2\n    );\n  }\n  function Cardinal(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  Cardinal.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x2, this._y2);\n          break;\n        case 3:\n          point$4(this, this._x1, this._y1);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          this._x1 = x2, this._y1 = y2;\n          break;\n        case 2:\n          this._point = 3;\n        // falls through\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinal = (function custom2(tension) {\n    function cardinal(context2) {\n      return new Cardinal(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function CardinalClosed(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  CardinalClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.lineTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._context.moveTo(this._x4 = x2, this._y4 = y2);\n          break;\n        case 2:\n          this._point = 3;\n          this._x5 = x2, this._y5 = y2;\n          break;\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinalClosed = (function custom2(tension) {\n    function cardinal(context2) {\n      return new CardinalClosed(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function CardinalOpen(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  CardinalOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinalOpen = (function custom2(tension) {\n    function cardinal(context2) {\n      return new CardinalOpen(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function point$3(that, x2, y2) {\n    var x12 = that._x1, y12 = that._y1, x22 = that._x2, y22 = that._y2;\n    if (that._l01_a > epsilon$5) {\n      var a2 = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n      x12 = (x12 * a2 - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n      y12 = (y12 * a2 - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n    }\n    if (that._l23_a > epsilon$5) {\n      var b2 = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m2 = 3 * that._l23_a * (that._l23_a + that._l12_a);\n      x22 = (x22 * b2 + that._x1 * that._l23_2a - x2 * that._l12_2a) / m2;\n      y22 = (y22 * b2 + that._y1 * that._l23_2a - y2 * that._l12_2a) / m2;\n    }\n    that._context.bezierCurveTo(x12, y12, x22, y22, that._x2, that._y2);\n  }\n  function CatmullRom(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRom.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x2, this._y2);\n          break;\n        case 3:\n          this.point(this._x2, this._y2);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n        // falls through\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRom = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRom(context2, alpha) : new Cardinal(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function CatmullRomClosed(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRomClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.lineTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._context.moveTo(this._x4 = x2, this._y4 = y2);\n          break;\n        case 2:\n          this._point = 3;\n          this._x5 = x2, this._y5 = y2;\n          break;\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRomClosed = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRomClosed(context2, alpha) : new CardinalClosed(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function CatmullRomOpen(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRomOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRomOpen = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRomOpen(context2, alpha) : new CardinalOpen(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function LinearClosed(context2) {\n    this._context = context2;\n  }\n  LinearClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._point) this._context.closePath();\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) this._context.lineTo(x2, y2);\n      else this._point = 1, this._context.moveTo(x2, y2);\n    }\n  };\n  function curveLinearClosed(context2) {\n    return new LinearClosed(context2);\n  }\n  function sign$1(x2) {\n    return x2 < 0 ? -1 : 1;\n  }\n  function slope3(that, x2, y2) {\n    var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);\n    return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n  }\n  function slope2(that, t) {\n    var h2 = that._x1 - that._x0;\n    return h2 ? (3 * (that._y1 - that._y0) / h2 - t) / 2 : t;\n  }\n  function point$2(that, t02, t12) {\n    var x02 = that._x0, y02 = that._y0, x12 = that._x1, y12 = that._y1, dx = (x12 - x02) / 3;\n    that._context.bezierCurveTo(x02 + dx, y02 + dx * t02, x12 - dx, y12 - dx * t12, x12, y12);\n  }\n  function MonotoneX(context2) {\n    this._context = context2;\n  }\n  MonotoneX.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x1, this._y1);\n          break;\n        case 3:\n          point$2(this, this._t0, slope2(this, this._t0));\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      var t12 = NaN;\n      x2 = +x2, y2 = +y2;\n      if (x2 === this._x1 && y2 === this._y1) return;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          point$2(this, slope2(this, t12 = slope3(this, x2, y2)), t12);\n          break;\n        default:\n          point$2(this, this._t0, t12 = slope3(this, x2, y2));\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n      this._t0 = t12;\n    }\n  };\n  function MonotoneY(context2) {\n    this._context = new ReflectContext(context2);\n  }\n  (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x2, y2) {\n    MonotoneX.prototype.point.call(this, y2, x2);\n  };\n  function ReflectContext(context2) {\n    this._context = context2;\n  }\n  ReflectContext.prototype = {\n    moveTo: function(x2, y2) {\n      this._context.moveTo(y2, x2);\n    },\n    closePath: function() {\n      this._context.closePath();\n    },\n    lineTo: function(x2, y2) {\n      this._context.lineTo(y2, x2);\n    },\n    bezierCurveTo: function(x12, y12, x2, y2, x3, y3) {\n      this._context.bezierCurveTo(y12, x12, y2, x2, y3, x3);\n    }\n  };\n  function monotoneX(context2) {\n    return new MonotoneX(context2);\n  }\n  function monotoneY(context2) {\n    return new MonotoneY(context2);\n  }\n  function Natural(context2) {\n    this._context = context2;\n  }\n  Natural.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x = [];\n      this._y = [];\n    },\n    lineEnd: function() {\n      var x2 = this._x, y2 = this._y, n = x2.length;\n      if (n) {\n        this._line ? this._context.lineTo(x2[0], y2[0]) : this._context.moveTo(x2[0], y2[0]);\n        if (n === 2) {\n          this._context.lineTo(x2[1], y2[1]);\n        } else {\n          var px2 = controlPoints(x2), py2 = controlPoints(y2);\n          for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n            this._context.bezierCurveTo(px2[0][i0], py2[0][i0], px2[1][i0], py2[1][i0], x2[i1], y2[i1]);\n          }\n        }\n      }\n      if (this._line || this._line !== 0 && n === 1) this._context.closePath();\n      this._line = 1 - this._line;\n      this._x = this._y = null;\n    },\n    point: function(x2, y2) {\n      this._x.push(+x2);\n      this._y.push(+y2);\n    }\n  };\n  function controlPoints(x2) {\n    var i, n = x2.length - 1, m2, a2 = new Array(n), b2 = new Array(n), r = new Array(n);\n    a2[0] = 0, b2[0] = 2, r[0] = x2[0] + 2 * x2[1];\n    for (i = 1; i < n - 1; ++i) a2[i] = 1, b2[i] = 4, r[i] = 4 * x2[i] + 2 * x2[i + 1];\n    a2[n - 1] = 2, b2[n - 1] = 7, r[n - 1] = 8 * x2[n - 1] + x2[n];\n    for (i = 1; i < n; ++i) m2 = a2[i] / b2[i - 1], b2[i] -= m2, r[i] -= m2 * r[i - 1];\n    a2[n - 1] = r[n - 1] / b2[n - 1];\n    for (i = n - 2; i >= 0; --i) a2[i] = (r[i] - a2[i + 1]) / b2[i];\n    b2[n - 1] = (x2[n] + a2[n - 1]) / 2;\n    for (i = 0; i < n - 1; ++i) b2[i] = 2 * x2[i + 1] - a2[i + 1];\n    return [a2, b2];\n  }\n  function curveNatural(context2) {\n    return new Natural(context2);\n  }\n  function Step(context2, t) {\n    this._context = context2;\n    this._t = t;\n  }\n  Step.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x = this._y = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n        // falls through\n        default: {\n          if (this._t <= 0) {\n            this._context.lineTo(this._x, y2);\n            this._context.lineTo(x2, y2);\n          } else {\n            var x12 = this._x * (1 - this._t) + x2 * this._t;\n            this._context.lineTo(x12, this._y);\n            this._context.lineTo(x12, y2);\n          }\n          break;\n        }\n      }\n      this._x = x2, this._y = y2;\n    }\n  };\n  function curveStep(context2) {\n    return new Step(context2, 0.5);\n  }\n  function stepBefore(context2) {\n    return new Step(context2, 0);\n  }\n  function stepAfter(context2) {\n    return new Step(context2, 1);\n  }\n  function domCanvas(w2, h2) {\n    if (typeof document !== \"undefined\" && document.createElement) {\n      const c2 = document.createElement(\"canvas\");\n      if (c2 && c2.getContext) {\n        c2.width = w2;\n        c2.height = h2;\n        return c2;\n      }\n    }\n    return null;\n  }\n  const domImage = () => typeof Image !== \"undefined\" ? Image : null;\n  function initRange(domain2, range2) {\n    switch (arguments.length) {\n      case 0:\n        break;\n      case 1:\n        this.range(domain2);\n        break;\n      default:\n        this.range(range2).domain(domain2);\n        break;\n    }\n    return this;\n  }\n  function initInterpolator(domain2, interpolator) {\n    switch (arguments.length) {\n      case 0:\n        break;\n      case 1: {\n        if (typeof domain2 === \"function\") this.interpolator(domain2);\n        else this.range(domain2);\n        break;\n      }\n      default: {\n        this.domain(domain2);\n        if (typeof interpolator === \"function\") this.interpolator(interpolator);\n        else this.range(interpolator);\n        break;\n      }\n    }\n    return this;\n  }\n  const implicit = Symbol(\"implicit\");\n  function ordinal() {\n    var index2 = new InternMap(), domain2 = [], range2 = [], unknown = implicit;\n    function scale2(d) {\n      let i = index2.get(d);\n      if (i === void 0) {\n        if (unknown !== implicit) return unknown;\n        index2.set(d, i = domain2.push(d) - 1);\n      }\n      return range2[i % range2.length];\n    }\n    scale2.domain = function(_) {\n      if (!arguments.length) return domain2.slice();\n      domain2 = [], index2 = new InternMap();\n      for (const value2 of _) {\n        if (index2.has(value2)) continue;\n        index2.set(value2, domain2.push(value2) - 1);\n      }\n      return scale2;\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), scale2) : range2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return ordinal(domain2, range2).unknown(unknown);\n    };\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function define2(constructor, factory, prototype2) {\n    constructor.prototype = factory.prototype = prototype2;\n    prototype2.constructor = constructor;\n  }\n  function extend(parent, definition2) {\n    var prototype2 = Object.create(parent.prototype);\n    for (var key2 in definition2) prototype2[key2] = definition2[key2];\n    return prototype2;\n  }\n  function Color$1() {\n  }\n  var darker = 0.7;\n  var brighter = 1 / darker;\n  var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`), reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`), reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`), reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`), reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`), reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n  var named = {\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  };\n  define2(Color$1, color$2, {\n    copy(channels) {\n      return Object.assign(new this.constructor(), this, channels);\n    },\n    displayable() {\n      return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    // Deprecated! Use color.formatHex.\n    formatHex: color_formatHex,\n    formatHex8: color_formatHex8,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n  });\n  function color_formatHex() {\n    return this.rgb().formatHex();\n  }\n  function color_formatHex8() {\n    return this.rgb().formatHex8();\n  }\n  function color_formatHsl() {\n    return hslConvert(this).formatHsl();\n  }\n  function color_formatRgb() {\n    return this.rgb().formatRgb();\n  }\n  function color$2(format2) {\n    var m2, l;\n    format2 = (format2 + \"\").trim().toLowerCase();\n    return (m2 = reHex.exec(format2)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format2)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format2)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format2)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format2)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n  }\n  function rgbn(n) {\n    return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1);\n  }\n  function rgba(r, g, b2, a2) {\n    if (a2 <= 0) r = g = b2 = NaN;\n    return new Rgb(r, g, b2, a2);\n  }\n  function rgbConvert(o) {\n    if (!(o instanceof Color$1)) o = color$2(o);\n    if (!o) return new Rgb();\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n  }\n  function rgb$1(r, g, b2, opacity2) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b2, opacity2 == null ? 1 : opacity2);\n  }\n  function Rgb(r, g, b2, opacity2) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b2;\n    this.opacity = +opacity2;\n  }\n  define2(Rgb, rgb$1, extend(Color$1, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb() {\n      return this;\n    },\n    clamp() {\n      return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n    },\n    displayable() {\n      return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);\n    },\n    hex: rgb_formatHex,\n    // Deprecated! Use color.formatHex.\n    formatHex: rgb_formatHex,\n    formatHex8: rgb_formatHex8,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n  }));\n  function rgb_formatHex() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n  }\n  function rgb_formatHex8() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n  }\n  function rgb_formatRgb() {\n    const a2 = clampa(this.opacity);\n    return `${a2 === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a2 === 1 ? \")\" : `, ${a2})`}`;\n  }\n  function clampa(opacity2) {\n    return isNaN(opacity2) ? 1 : Math.max(0, Math.min(1, opacity2));\n  }\n  function clampi(value2) {\n    return Math.max(0, Math.min(255, Math.round(value2) || 0));\n  }\n  function hex(value2) {\n    value2 = clampi(value2);\n    return (value2 < 16 ? \"0\" : \"\") + value2.toString(16);\n  }\n  function hsla(h2, s, l, a2) {\n    if (a2 <= 0) h2 = s = l = NaN;\n    else if (l <= 0 || l >= 1) h2 = s = NaN;\n    else if (s <= 0) h2 = NaN;\n    return new Hsl(h2, s, l, a2);\n  }\n  function hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color$1)) o = color$2(o);\n    if (!o) return new Hsl();\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b2 = o.b / 255, min2 = Math.min(r, g, b2), max2 = Math.max(r, g, b2), h2 = NaN, s = max2 - min2, l = (max2 + min2) / 2;\n    if (s) {\n      if (r === max2) h2 = (g - b2) / s + (g < b2) * 6;\n      else if (g === max2) h2 = (b2 - r) / s + 2;\n      else h2 = (r - g) / s + 4;\n      s /= l < 0.5 ? max2 + min2 : 2 - max2 - min2;\n      h2 *= 60;\n    } else {\n      s = l > 0 && l < 1 ? 0 : h2;\n    }\n    return new Hsl(h2, s, l, o.opacity);\n  }\n  function hsl$1(h2, s, l, opacity2) {\n    return arguments.length === 1 ? hslConvert(h2) : new Hsl(h2, s, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Hsl(h2, s, l, opacity2) {\n    this.h = +h2;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  define2(Hsl, hsl$1, extend(Color$1, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h2 = this.h % 360 + (this.h < 0) * 360, s = isNaN(h2) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n      return new Rgb(\n        hsl2rgb(h2 >= 240 ? h2 - 240 : h2 + 120, m1, m2),\n        hsl2rgb(h2, m1, m2),\n        hsl2rgb(h2 < 120 ? h2 + 240 : h2 - 120, m1, m2),\n        this.opacity\n      );\n    },\n    clamp() {\n      return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n    },\n    displayable() {\n      return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);\n    },\n    formatHsl() {\n      const a2 = clampa(this.opacity);\n      return `${a2 === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a2 === 1 ? \")\" : `, ${a2})`}`;\n    }\n  }));\n  function clamph(value2) {\n    value2 = (value2 || 0) % 360;\n    return value2 < 0 ? value2 + 360 : value2;\n  }\n  function clampt(value2) {\n    return Math.max(0, Math.min(1, value2 || 0));\n  }\n  function hsl2rgb(h2, m1, m2) {\n    return (h2 < 60 ? m1 + (m2 - m1) * h2 / 60 : h2 < 180 ? m2 : h2 < 240 ? m1 + (m2 - m1) * (240 - h2) / 60 : m1) * 255;\n  }\n  const radians$1 = Math.PI / 180;\n  const degrees$2 = 180 / Math.PI;\n  const K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1;\n  function labConvert(o) {\n    if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n    if (o instanceof Hcl) return hcl2lab(o);\n    if (!(o instanceof Rgb)) o = rgbConvert(o);\n    var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b2 = rgb2lrgb(o.b), y2 = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b2) / Yn), x2, z;\n    if (r === g && g === b2) x2 = z = y2;\n    else {\n      x2 = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b2) / Xn);\n      z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b2) / Zn);\n    }\n    return new Lab(116 * y2 - 16, 500 * (x2 - y2), 200 * (y2 - z), o.opacity);\n  }\n  function lab$1(l, a2, b2, opacity2) {\n    return arguments.length === 1 ? labConvert(l) : new Lab(l, a2, b2, opacity2 == null ? 1 : opacity2);\n  }\n  function Lab(l, a2, b2, opacity2) {\n    this.l = +l;\n    this.a = +a2;\n    this.b = +b2;\n    this.opacity = +opacity2;\n  }\n  define2(Lab, lab$1, extend(Color$1, {\n    brighter(k) {\n      return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    darker(k) {\n      return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    rgb() {\n      var y2 = (this.l + 16) / 116, x2 = isNaN(this.a) ? y2 : y2 + this.a / 500, z = isNaN(this.b) ? y2 : y2 - this.b / 200;\n      x2 = Xn * lab2xyz(x2);\n      y2 = Yn * lab2xyz(y2);\n      z = Zn * lab2xyz(z);\n      return new Rgb(\n        lrgb2rgb(3.1338561 * x2 - 1.6168667 * y2 - 0.4906146 * z),\n        lrgb2rgb(-0.9787684 * x2 + 1.9161415 * y2 + 0.033454 * z),\n        lrgb2rgb(0.0719453 * x2 - 0.2289914 * y2 + 1.4052427 * z),\n        this.opacity\n      );\n    }\n  }));\n  function xyz2lab(t) {\n    return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n  }\n  function lab2xyz(t) {\n    return t > t1 ? t * t * t : t2 * (t - t0);\n  }\n  function lrgb2rgb(x2) {\n    return 255 * (x2 <= 31308e-7 ? 12.92 * x2 : 1.055 * Math.pow(x2, 1 / 2.4) - 0.055);\n  }\n  function rgb2lrgb(x2) {\n    return (x2 /= 255) <= 0.04045 ? x2 / 12.92 : Math.pow((x2 + 0.055) / 1.055, 2.4);\n  }\n  function hclConvert(o) {\n    if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n    if (!(o instanceof Lab)) o = labConvert(o);\n    if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n    var h2 = Math.atan2(o.b, o.a) * degrees$2;\n    return new Hcl(h2 < 0 ? h2 + 360 : h2, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n  }\n  function hcl$1(h2, c2, l, opacity2) {\n    return arguments.length === 1 ? hclConvert(h2) : new Hcl(h2, c2, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Hcl(h2, c2, l, opacity2) {\n    this.h = +h2;\n    this.c = +c2;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  function hcl2lab(o) {\n    if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n    var h2 = o.h * radians$1;\n    return new Lab(o.l, Math.cos(h2) * o.c, Math.sin(h2) * o.c, o.opacity);\n  }\n  define2(Hcl, hcl$1, extend(Color$1, {\n    brighter(k) {\n      return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n    },\n    darker(k) {\n      return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n    },\n    rgb() {\n      return hcl2lab(this).rgb();\n    }\n  }));\n  var A = -0.14861, B$1 = 1.78277, C$1 = -0.29227, D$1 = -0.90649, E = 1.97294, ED = E * D$1, EB = E * B$1, BC_DA = B$1 * C$1 - D$1 * A;\n  function cubehelixConvert(o) {\n    if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Rgb)) o = rgbConvert(o);\n    var r = o.r / 255, g = o.g / 255, b2 = o.b / 255, l = (BC_DA * b2 + ED * r - EB * g) / (BC_DA + ED - EB), bl2 = b2 - l, k = (E * (g - l) - C$1 * bl2) / D$1, s = Math.sqrt(k * k + bl2 * bl2) / (E * l * (1 - l)), h2 = s ? Math.atan2(k, bl2) * degrees$2 - 120 : NaN;\n    return new Cubehelix(h2 < 0 ? h2 + 360 : h2, s, l, o.opacity);\n  }\n  function cubehelix$1(h2, s, l, opacity2) {\n    return arguments.length === 1 ? cubehelixConvert(h2) : new Cubehelix(h2, s, l, opacity2 == null ? 1 : opacity2);\n  }\n  function Cubehelix(h2, s, l, opacity2) {\n    this.h = +h2;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity2;\n  }\n  define2(Cubehelix, cubehelix$1, extend(Color$1, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h2 = isNaN(this.h) ? 0 : (this.h + 120) * radians$1, l = +this.l, a2 = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh2 = Math.cos(h2), sinh2 = Math.sin(h2);\n      return new Rgb(\n        255 * (l + a2 * (A * cosh2 + B$1 * sinh2)),\n        255 * (l + a2 * (C$1 * cosh2 + D$1 * sinh2)),\n        255 * (l + a2 * (E * cosh2)),\n        this.opacity\n      );\n    }\n  }));\n  function basis(t12, v0, v1, v2, v3) {\n    var t22 = t12 * t12, t32 = t22 * t12;\n    return ((1 - 3 * t12 + 3 * t22 - t32) * v0 + (4 - 6 * t22 + 3 * t32) * v1 + (1 + 3 * t12 + 3 * t22 - 3 * t32) * v2 + t32 * v3) / 6;\n  }\n  function basis$1(values2) {\n    var n = values2.length - 1;\n    return function(t) {\n      var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values2[i], v2 = values2[i + 1], v0 = i > 0 ? values2[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values2[i + 2] : 2 * v2 - v1;\n      return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n  }\n  function basisClosed(values2) {\n    var n = values2.length;\n    return function(t) {\n      var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values2[(i + n - 1) % n], v1 = values2[i % n], v2 = values2[(i + 1) % n], v3 = values2[(i + 2) % n];\n      return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n  }\n  const constant$2 = (x2) => () => x2;\n  function linear$1(a2, d) {\n    return function(t) {\n      return a2 + t * d;\n    };\n  }\n  function exponential(a2, b2, y2) {\n    return a2 = Math.pow(a2, y2), b2 = Math.pow(b2, y2) - a2, y2 = 1 / y2, function(t) {\n      return Math.pow(a2 + t * b2, y2);\n    };\n  }\n  function hue$1(a2, b2) {\n    var d = b2 - a2;\n    return d ? linear$1(a2, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$2(isNaN(a2) ? b2 : a2);\n  }\n  function gamma(y2) {\n    return (y2 = +y2) === 1 ? nogamma : function(a2, b2) {\n      return b2 - a2 ? exponential(a2, b2, y2) : constant$2(isNaN(a2) ? b2 : a2);\n    };\n  }\n  function nogamma(a2, b2) {\n    var d = b2 - a2;\n    return d ? linear$1(a2, d) : constant$2(isNaN(a2) ? b2 : a2);\n  }\n  const rgb = (function rgbGamma(y2) {\n    var color2 = gamma(y2);\n    function rgb2(start, end) {\n      var r = color2((start = rgb$1(start)).r, (end = rgb$1(end)).r), g = color2(start.g, end.g), b2 = color2(start.b, end.b), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.r = r(t);\n        start.g = g(t);\n        start.b = b2(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    }\n    rgb2.gamma = rgbGamma;\n    return rgb2;\n  })(1);\n  function rgbSpline(spline) {\n    return function(colors2) {\n      var n = colors2.length, r = new Array(n), g = new Array(n), b2 = new Array(n), i, color2;\n      for (i = 0; i < n; ++i) {\n        color2 = rgb$1(colors2[i]);\n        r[i] = color2.r || 0;\n        g[i] = color2.g || 0;\n        b2[i] = color2.b || 0;\n      }\n      r = spline(r);\n      g = spline(g);\n      b2 = spline(b2);\n      color2.opacity = 1;\n      return function(t) {\n        color2.r = r(t);\n        color2.g = g(t);\n        color2.b = b2(t);\n        return color2 + \"\";\n      };\n    };\n  }\n  var rgbBasis = rgbSpline(basis$1);\n  var rgbBasisClosed = rgbSpline(basisClosed);\n  function numberArray(a2, b2) {\n    if (!b2) b2 = [];\n    var n = a2 ? Math.min(b2.length, a2.length) : 0, c2 = b2.slice(), i;\n    return function(t) {\n      for (i = 0; i < n; ++i) c2[i] = a2[i] * (1 - t) + b2[i] * t;\n      return c2;\n    };\n  }\n  function isNumberArray(x2) {\n    return ArrayBuffer.isView(x2) && !(x2 instanceof DataView);\n  }\n  function array$3(a2, b2) {\n    return (isNumberArray(b2) ? numberArray : genericArray)(a2, b2);\n  }\n  function genericArray(a2, b2) {\n    var nb = b2 ? b2.length : 0, na = a2 ? Math.min(nb, a2.length) : 0, x2 = new Array(na), c2 = new Array(nb), i;\n    for (i = 0; i < na; ++i) x2[i] = interpolate$1(a2[i], b2[i]);\n    for (; i < nb; ++i) c2[i] = b2[i];\n    return function(t) {\n      for (i = 0; i < na; ++i) c2[i] = x2[i](t);\n      return c2;\n    };\n  }\n  function date$1(a2, b2) {\n    var d = /* @__PURE__ */ new Date();\n    return a2 = +a2, b2 = +b2, function(t) {\n      return d.setTime(a2 * (1 - t) + b2 * t), d;\n    };\n  }\n  function interpolateNumber(a2, b2) {\n    return a2 = +a2, b2 = +b2, function(t) {\n      return a2 * (1 - t) + b2 * t;\n    };\n  }\n  function object(a2, b2) {\n    var i = {}, c2 = {}, k;\n    if (a2 === null || typeof a2 !== \"object\") a2 = {};\n    if (b2 === null || typeof b2 !== \"object\") b2 = {};\n    for (k in b2) {\n      if (k in a2) {\n        i[k] = interpolate$1(a2[k], b2[k]);\n      } else {\n        c2[k] = b2[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c2[k] = i[k](t);\n      return c2;\n    };\n  }\n  var reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, reB = new RegExp(reA.source, \"g\");\n  function zero$1(b2) {\n    return function() {\n      return b2;\n    };\n  }\n  function one$1(b2) {\n    return function(t) {\n      return b2(t) + \"\";\n    };\n  }\n  function string(a2, b2) {\n    var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a2 = a2 + \"\", b2 = b2 + \"\";\n    while ((am = reA.exec(a2)) && (bm = reB.exec(b2))) {\n      if ((bs = bm.index) > bi) {\n        bs = b2.slice(bi, bs);\n        if (s[i]) s[i] += bs;\n        else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm;\n        else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({ i, x: interpolateNumber(am, bm) });\n      }\n      bi = reB.lastIndex;\n    }\n    if (bi < b2.length) {\n      bs = b2.slice(bi);\n      if (s[i]) s[i] += bs;\n      else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? one$1(q[0].x) : zero$1(b2) : (b2 = q.length, function(t) {\n      for (var i2 = 0, o; i2 < b2; ++i2) s[(o = q[i2]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  function interpolate$1(a2, b2) {\n    var t = typeof b2, c2;\n    return b2 == null || t === \"boolean\" ? constant$2(b2) : (t === \"number\" ? interpolateNumber : t === \"string\" ? (c2 = color$2(b2)) ? (b2 = c2, rgb) : string : b2 instanceof color$2 ? rgb : b2 instanceof Date ? date$1 : isNumberArray(b2) ? numberArray : Array.isArray(b2) ? genericArray : typeof b2.valueOf !== \"function\" && typeof b2.toString !== \"function\" || isNaN(b2) ? object : interpolateNumber)(a2, b2);\n  }\n  function discrete$1(range2) {\n    var n = range2.length;\n    return function(t) {\n      return range2[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n    };\n  }\n  function hue(a2, b2) {\n    var i = hue$1(+a2, +b2);\n    return function(t) {\n      var x2 = i(t);\n      return x2 - 360 * Math.floor(x2 / 360);\n    };\n  }\n  function interpolateRound(a2, b2) {\n    return a2 = +a2, b2 = +b2, function(t) {\n      return Math.round(a2 * (1 - t) + b2 * t);\n    };\n  }\n  var degrees$1 = 180 / Math.PI;\n  var identity$4 = {\n    translateX: 0,\n    translateY: 0,\n    rotate: 0,\n    skewX: 0,\n    scaleX: 1,\n    scaleY: 1\n  };\n  function decompose(a2, b2, c2, d, e, f) {\n    var scaleX, scaleY2, skewX;\n    if (scaleX = Math.sqrt(a2 * a2 + b2 * b2)) a2 /= scaleX, b2 /= scaleX;\n    if (skewX = a2 * c2 + b2 * d) c2 -= a2 * skewX, d -= b2 * skewX;\n    if (scaleY2 = Math.sqrt(c2 * c2 + d * d)) c2 /= scaleY2, d /= scaleY2, skewX /= scaleY2;\n    if (a2 * d < b2 * c2) a2 = -a2, b2 = -b2, skewX = -skewX, scaleX = -scaleX;\n    return {\n      translateX: e,\n      translateY: f,\n      rotate: Math.atan2(b2, a2) * degrees$1,\n      skewX: Math.atan(skewX) * degrees$1,\n      scaleX,\n      scaleY: scaleY2\n    };\n  }\n  var svgNode;\n  function parseCss(value2) {\n    const m2 = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value2 + \"\");\n    return m2.isIdentity ? identity$4 : decompose(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f);\n  }\n  function parseSvg(value2) {\n    if (value2 == null) return identity$4;\n    if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n    svgNode.setAttribute(\"transform\", value2);\n    if (!(value2 = svgNode.transform.baseVal.consolidate())) return identity$4;\n    value2 = value2.matrix;\n    return decompose(value2.a, value2.b, value2.c, value2.d, value2.e, value2.f);\n  }\n  function interpolateTransform(parse2, pxComma, pxParen, degParen) {\n    function pop(s) {\n      return s.length ? s.pop() + \" \" : \"\";\n    }\n    function translate2(xa, ya, xb, yb, s, q) {\n      if (xa !== xb || ya !== yb) {\n        var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n        q.push({ i: i - 4, x: interpolateNumber(xa, xb) }, { i: i - 2, x: interpolateNumber(ya, yb) });\n      } else if (xb || yb) {\n        s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n      }\n    }\n    function rotate2(a2, b2, s, q) {\n      if (a2 !== b2) {\n        if (a2 - b2 > 180) b2 += 360;\n        else if (b2 - a2 > 180) a2 += 360;\n        q.push({ i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: interpolateNumber(a2, b2) });\n      } else if (b2) {\n        s.push(pop(s) + \"rotate(\" + b2 + degParen);\n      }\n    }\n    function skewX(a2, b2, s, q) {\n      if (a2 !== b2) {\n        q.push({ i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: interpolateNumber(a2, b2) });\n      } else if (b2) {\n        s.push(pop(s) + \"skewX(\" + b2 + degParen);\n      }\n    }\n    function scale2(xa, ya, xb, yb, s, q) {\n      if (xa !== xb || ya !== yb) {\n        var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n        q.push({ i: i - 4, x: interpolateNumber(xa, xb) }, { i: i - 2, x: interpolateNumber(ya, yb) });\n      } else if (xb !== 1 || yb !== 1) {\n        s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n      }\n    }\n    return function(a2, b2) {\n      var s = [], q = [];\n      a2 = parse2(a2), b2 = parse2(b2);\n      translate2(a2.translateX, a2.translateY, b2.translateX, b2.translateY, s, q);\n      rotate2(a2.rotate, b2.rotate, s, q);\n      skewX(a2.skewX, b2.skewX, s, q);\n      scale2(a2.scaleX, a2.scaleY, b2.scaleX, b2.scaleY, s, q);\n      a2 = b2 = null;\n      return function(t) {\n        var i = -1, n = q.length, o;\n        while (++i < n) s[(o = q[i]).i] = o.x(t);\n        return s.join(\"\");\n      };\n    };\n  }\n  var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\n  var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n  var epsilon2$1 = 1e-12;\n  function cosh(x2) {\n    return ((x2 = Math.exp(x2)) + 1 / x2) / 2;\n  }\n  function sinh(x2) {\n    return ((x2 = Math.exp(x2)) - 1 / x2) / 2;\n  }\n  function tanh(x2) {\n    return ((x2 = Math.exp(2 * x2)) - 1) / (x2 + 1);\n  }\n  const zoom = (function zoomRho(rho, rho2, rho4) {\n    function zoom2(p02, p1) {\n      var ux0 = p02[0], uy0 = p02[1], w0 = p02[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n      if (d2 < epsilon2$1) {\n        S = Math.log(w1 / w0) / rho;\n        i = function(t) {\n          return [\n            ux0 + t * dx,\n            uy0 + t * dy,\n            w0 * Math.exp(rho * t * S)\n          ];\n        };\n      } else {\n        var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n        S = (r1 - r0) / rho;\n        i = function(t) {\n          var s = t * S, coshr0 = cosh(r0), u2 = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n          return [\n            ux0 + u2 * dx,\n            uy0 + u2 * dy,\n            w0 * coshr0 / cosh(rho * s + r0)\n          ];\n        };\n      }\n      i.duration = S * 1e3 * rho / Math.SQRT2;\n      return i;\n    }\n    zoom2.rho = function(_) {\n      var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n      return zoomRho(_1, _2, _4);\n    };\n    return zoom2;\n  })(Math.SQRT2, 2, 4);\n  function hsl(hue2) {\n    return function(start, end) {\n      var h2 = hue2((start = hsl$1(start)).h, (end = hsl$1(end)).h), s = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h2(t);\n        start.s = s(t);\n        start.l = l(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    };\n  }\n  const hsl_default = hsl(hue$1);\n  var hslLong = hsl(nogamma);\n  function lab(start, end) {\n    var l = nogamma((start = lab$1(start)).l, (end = lab$1(end)).l), a2 = nogamma(start.a, end.a), b2 = nogamma(start.b, end.b), opacity2 = nogamma(start.opacity, end.opacity);\n    return function(t) {\n      start.l = l(t);\n      start.a = a2(t);\n      start.b = b2(t);\n      start.opacity = opacity2(t);\n      return start + \"\";\n    };\n  }\n  function hcl(hue2) {\n    return function(start, end) {\n      var h2 = hue2((start = hcl$1(start)).h, (end = hcl$1(end)).h), c2 = nogamma(start.c, end.c), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h2(t);\n        start.c = c2(t);\n        start.l = l(t);\n        start.opacity = opacity2(t);\n        return start + \"\";\n      };\n    };\n  }\n  const hcl_default = hcl(hue$1);\n  var hclLong = hcl(nogamma);\n  function cubehelix(hue2) {\n    return (function cubehelixGamma(y2) {\n      y2 = +y2;\n      function cubehelix2(start, end) {\n        var h2 = hue2((start = cubehelix$1(start)).h, (end = cubehelix$1(end)).h), s = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity2 = nogamma(start.opacity, end.opacity);\n        return function(t) {\n          start.h = h2(t);\n          start.s = s(t);\n          start.l = l(Math.pow(t, y2));\n          start.opacity = opacity2(t);\n          return start + \"\";\n        };\n      }\n      cubehelix2.gamma = cubehelixGamma;\n      return cubehelix2;\n    })(1);\n  }\n  const cubehelix_default = cubehelix(hue$1);\n  var cubehelixLong = cubehelix(nogamma);\n  function piecewise(interpolate2, values2) {\n    if (values2 === void 0) values2 = interpolate2, interpolate2 = interpolate$1;\n    var i = 0, n = values2.length - 1, v = values2[0], I = new Array(n < 0 ? 0 : n);\n    while (i < n) I[i] = interpolate2(v, v = values2[++i]);\n    return function(t) {\n      var i2 = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n      return I[i2](t - i2);\n    };\n  }\n  function quantize$2(interpolator, n) {\n    var samples = new Array(n);\n    for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n    return samples;\n  }\n  const $$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    interpolate: interpolate$1,\n    interpolateArray: array$3,\n    interpolateBasis: basis$1,\n    interpolateBasisClosed: basisClosed,\n    interpolateCubehelix: cubehelix_default,\n    interpolateCubehelixLong: cubehelixLong,\n    interpolateDate: date$1,\n    interpolateDiscrete: discrete$1,\n    interpolateHcl: hcl_default,\n    interpolateHclLong: hclLong,\n    interpolateHsl: hsl_default,\n    interpolateHslLong: hslLong,\n    interpolateHue: hue,\n    interpolateLab: lab,\n    interpolateNumber,\n    interpolateNumberArray: numberArray,\n    interpolateObject: object,\n    interpolateRgb: rgb,\n    interpolateRgbBasis: rgbBasis,\n    interpolateRgbBasisClosed: rgbBasisClosed,\n    interpolateRound,\n    interpolateString: string,\n    interpolateTransformCss,\n    interpolateTransformSvg,\n    interpolateZoom: zoom,\n    piecewise,\n    quantize: quantize$2\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function constants(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  function number$5(x2) {\n    return +x2;\n  }\n  var unit = [0, 1];\n  function identity$3(x2) {\n    return x2;\n  }\n  function normalize$4(a2, b2) {\n    return (b2 -= a2 = +a2) ? function(x2) {\n      return (x2 - a2) / b2;\n    } : constants(isNaN(b2) ? NaN : 0.5);\n  }\n  function clamper(a2, b2) {\n    var t;\n    if (a2 > b2) t = a2, a2 = b2, b2 = t;\n    return function(x2) {\n      return Math.max(a2, Math.min(b2, x2));\n    };\n  }\n  function bimap(domain2, range2, interpolate2) {\n    var d0 = domain2[0], d1 = domain2[1], r0 = range2[0], r1 = range2[1];\n    if (d1 < d0) d0 = normalize$4(d1, d0), r0 = interpolate2(r1, r0);\n    else d0 = normalize$4(d0, d1), r0 = interpolate2(r0, r1);\n    return function(x2) {\n      return r0(d0(x2));\n    };\n  }\n  function polymap(domain2, range2, interpolate2) {\n    var j = Math.min(domain2.length, range2.length) - 1, d = new Array(j), r = new Array(j), i = -1;\n    if (domain2[j] < domain2[0]) {\n      domain2 = domain2.slice().reverse();\n      range2 = range2.slice().reverse();\n    }\n    while (++i < j) {\n      d[i] = normalize$4(domain2[i], domain2[i + 1]);\n      r[i] = interpolate2(range2[i], range2[i + 1]);\n    }\n    return function(x2) {\n      var i2 = bisectRight$1(domain2, x2, 1, j) - 1;\n      return r[i2](d[i2](x2));\n    };\n  }\n  function copy$7(source2, target2) {\n    return target2.domain(source2.domain()).range(source2.range()).interpolate(source2.interpolate()).clamp(source2.clamp()).unknown(source2.unknown());\n  }\n  function transformer$3() {\n    var domain2 = unit, range2 = unit, interpolate2 = interpolate$1, transform2, untransform, unknown, clamp2 = identity$3, piecewise2, output2, input;\n    function rescale() {\n      var n = Math.min(domain2.length, range2.length);\n      if (clamp2 !== identity$3) clamp2 = clamper(domain2[0], domain2[n - 1]);\n      piecewise2 = n > 2 ? polymap : bimap;\n      output2 = input = null;\n      return scale2;\n    }\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : (output2 || (output2 = piecewise2(domain2.map(transform2), range2, interpolate2)))(transform2(clamp2(x2)));\n    }\n    scale2.invert = function(y2) {\n      return clamp2(untransform((input || (input = piecewise2(range2, domain2.map(transform2), interpolateNumber)))(y2)));\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2 = Array.from(_, number$5), rescale()) : domain2.slice();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();\n    };\n    scale2.rangeRound = function(_) {\n      return range2 = Array.from(_), interpolate2 = interpolateRound, rescale();\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = _ ? true : identity$3, rescale()) : clamp2 !== identity$3;\n    };\n    scale2.interpolate = function(_) {\n      return arguments.length ? (interpolate2 = _, rescale()) : interpolate2;\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t, u2) {\n      transform2 = t, untransform = u2;\n      return rescale();\n    };\n  }\n  function continuous$1() {\n    return transformer$3()(identity$3, identity$3);\n  }\n  function tickFormat$1(start, stop2, count2, specifier) {\n    var step = tickStep(start, stop2, count2), precision;\n    specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n    switch (specifier.type) {\n      case \"s\": {\n        var value2 = Math.max(Math.abs(start), Math.abs(stop2));\n        if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value2))) specifier.precision = precision;\n        return formatPrefix(specifier, value2);\n      }\n      case \"\":\n      case \"e\":\n      case \"g\":\n      case \"p\":\n      case \"r\": {\n        if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop2))))) specifier.precision = precision - (specifier.type === \"e\");\n        break;\n      }\n      case \"f\":\n      case \"%\": {\n        if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n        break;\n      }\n    }\n    return format$3(specifier);\n  }\n  function linearish(scale2) {\n    var domain2 = scale2.domain;\n    scale2.ticks = function(count2) {\n      var d = domain2();\n      return ticks(d[0], d[d.length - 1], count2 == null ? 10 : count2);\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      var d = domain2();\n      return tickFormat$1(d[0], d[d.length - 1], count2 == null ? 10 : count2, specifier);\n    };\n    scale2.nice = function(count2) {\n      if (count2 == null) count2 = 10;\n      var d = domain2();\n      var i0 = 0;\n      var i1 = d.length - 1;\n      var start = d[i0];\n      var stop2 = d[i1];\n      var prestep;\n      var step;\n      var maxIter = 10;\n      if (stop2 < start) {\n        step = start, start = stop2, stop2 = step;\n        step = i0, i0 = i1, i1 = step;\n      }\n      while (maxIter-- > 0) {\n        step = tickIncrement(start, stop2, count2);\n        if (step === prestep) {\n          d[i0] = start;\n          d[i1] = stop2;\n          return domain2(d);\n        } else if (step > 0) {\n          start = Math.floor(start / step) * step;\n          stop2 = Math.ceil(stop2 / step) * step;\n        } else if (step < 0) {\n          start = Math.ceil(start * step) / step;\n          stop2 = Math.floor(stop2 * step) / step;\n        } else {\n          break;\n        }\n        prestep = step;\n      }\n      return scale2;\n    };\n    return scale2;\n  }\n  function linear() {\n    var scale2 = continuous$1();\n    scale2.copy = function() {\n      return copy$7(scale2, linear());\n    };\n    initRange.apply(scale2, arguments);\n    return linearish(scale2);\n  }\n  function identity$2(domain2) {\n    var unknown;\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : x2;\n    }\n    scale2.invert = scale2;\n    scale2.domain = scale2.range = function(_) {\n      return arguments.length ? (domain2 = Array.from(_, number$5), scale2) : domain2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return identity$2(domain2).unknown(unknown);\n    };\n    domain2 = arguments.length ? Array.from(domain2, number$5) : [0, 1];\n    return linearish(scale2);\n  }\n  function nice(domain2, interval2) {\n    domain2 = domain2.slice();\n    var i0 = 0, i1 = domain2.length - 1, x02 = domain2[i0], x12 = domain2[i1], t;\n    if (x12 < x02) {\n      t = i0, i0 = i1, i1 = t;\n      t = x02, x02 = x12, x12 = t;\n    }\n    domain2[i0] = interval2.floor(x02);\n    domain2[i1] = interval2.ceil(x12);\n    return domain2;\n  }\n  function transformLog(x2) {\n    return Math.log(x2);\n  }\n  function transformExp(x2) {\n    return Math.exp(x2);\n  }\n  function transformLogn(x2) {\n    return -Math.log(-x2);\n  }\n  function transformExpn(x2) {\n    return -Math.exp(-x2);\n  }\n  function pow10(x2) {\n    return isFinite(x2) ? +(\"1e\" + x2) : x2 < 0 ? 0 : x2;\n  }\n  function powp(base2) {\n    return base2 === 10 ? pow10 : base2 === Math.E ? Math.exp : (x2) => Math.pow(base2, x2);\n  }\n  function logp(base2) {\n    return base2 === Math.E ? Math.log : base2 === 10 && Math.log10 || base2 === 2 && Math.log2 || (base2 = Math.log(base2), (x2) => Math.log(x2) / base2);\n  }\n  function reflect(f) {\n    return (x2, k) => -f(-x2, k);\n  }\n  function loggish(transform2) {\n    const scale2 = transform2(transformLog, transformExp);\n    const domain2 = scale2.domain;\n    let base2 = 10;\n    let logs;\n    let pows;\n    function rescale() {\n      logs = logp(base2), pows = powp(base2);\n      if (domain2()[0] < 0) {\n        logs = reflect(logs), pows = reflect(pows);\n        transform2(transformLogn, transformExpn);\n      } else {\n        transform2(transformLog, transformExp);\n      }\n      return scale2;\n    }\n    scale2.base = function(_) {\n      return arguments.length ? (base2 = +_, rescale()) : base2;\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2(_), rescale()) : domain2();\n    };\n    scale2.ticks = (count2) => {\n      const d = domain2();\n      let u2 = d[0];\n      let v = d[d.length - 1];\n      const r = v < u2;\n      if (r) [u2, v] = [v, u2];\n      let i = logs(u2);\n      let j = logs(v);\n      let k;\n      let t;\n      const n = count2 == null ? 10 : +count2;\n      let z = [];\n      if (!(base2 % 1) && j - i < n) {\n        i = Math.floor(i), j = Math.ceil(j);\n        if (u2 > 0) for (; i <= j; ++i) {\n          for (k = 1; k < base2; ++k) {\n            t = i < 0 ? k / pows(-i) : k * pows(i);\n            if (t < u2) continue;\n            if (t > v) break;\n            z.push(t);\n          }\n        }\n        else for (; i <= j; ++i) {\n          for (k = base2 - 1; k >= 1; --k) {\n            t = i > 0 ? k / pows(-i) : k * pows(i);\n            if (t < u2) continue;\n            if (t > v) break;\n            z.push(t);\n          }\n        }\n        if (z.length * 2 < n) z = ticks(u2, v, n);\n      } else {\n        z = ticks(i, j, Math.min(j - i, n)).map(pows);\n      }\n      return r ? z.reverse() : z;\n    };\n    scale2.tickFormat = (count2, specifier) => {\n      if (count2 == null) count2 = 10;\n      if (specifier == null) specifier = base2 === 10 ? \"s\" : \",\";\n      if (typeof specifier !== \"function\") {\n        if (!(base2 % 1) && (specifier = formatSpecifier(specifier)).precision == null) specifier.trim = true;\n        specifier = format$3(specifier);\n      }\n      if (count2 === Infinity) return specifier;\n      const k = Math.max(1, base2 * count2 / scale2.ticks().length);\n      return (d) => {\n        let i = d / pows(Math.round(logs(d)));\n        if (i * base2 < base2 - 0.5) i *= base2;\n        return i <= k ? specifier(d) : \"\";\n      };\n    };\n    scale2.nice = () => {\n      return domain2(nice(domain2(), {\n        floor: (x2) => pows(Math.floor(logs(x2))),\n        ceil: (x2) => pows(Math.ceil(logs(x2)))\n      }));\n    };\n    return scale2;\n  }\n  function log$2() {\n    const scale2 = loggish(transformer$3()).domain([1, 10]);\n    scale2.copy = () => copy$7(scale2, log$2()).base(scale2.base());\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function transformSymlog(c2) {\n    return function(x2) {\n      return Math.sign(x2) * Math.log1p(Math.abs(x2 / c2));\n    };\n  }\n  function transformSymexp(c2) {\n    return function(x2) {\n      return Math.sign(x2) * Math.expm1(Math.abs(x2)) * c2;\n    };\n  }\n  function symlogish(transform2) {\n    var c2 = 1, scale2 = transform2(transformSymlog(c2), transformSymexp(c2));\n    scale2.constant = function(_) {\n      return arguments.length ? transform2(transformSymlog(c2 = +_), transformSymexp(c2)) : c2;\n    };\n    return linearish(scale2);\n  }\n  function symlog() {\n    var scale2 = symlogish(transformer$3());\n    scale2.copy = function() {\n      return copy$7(scale2, symlog()).constant(scale2.constant());\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function transformPow(exponent2) {\n    return function(x2) {\n      return x2 < 0 ? -Math.pow(-x2, exponent2) : Math.pow(x2, exponent2);\n    };\n  }\n  function transformSqrt(x2) {\n    return x2 < 0 ? -Math.sqrt(-x2) : Math.sqrt(x2);\n  }\n  function transformSquare(x2) {\n    return x2 < 0 ? -x2 * x2 : x2 * x2;\n  }\n  function powish(transform2) {\n    var scale2 = transform2(identity$3, identity$3), exponent2 = 1;\n    function rescale() {\n      return exponent2 === 1 ? transform2(identity$3, identity$3) : exponent2 === 0.5 ? transform2(transformSqrt, transformSquare) : transform2(transformPow(exponent2), transformPow(1 / exponent2));\n    }\n    scale2.exponent = function(_) {\n      return arguments.length ? (exponent2 = +_, rescale()) : exponent2;\n    };\n    return linearish(scale2);\n  }\n  function pow$2() {\n    var scale2 = powish(transformer$3());\n    scale2.copy = function() {\n      return copy$7(scale2, pow$2()).exponent(scale2.exponent());\n    };\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function sqrt$2() {\n    return pow$2.apply(null, arguments).exponent(0.5);\n  }\n  function quantile() {\n    var domain2 = [], range2 = [], thresholds = [], unknown;\n    function rescale() {\n      var i = 0, n = Math.max(1, range2.length);\n      thresholds = new Array(n - 1);\n      while (++i < n) thresholds[i - 1] = quantileSorted(domain2, i / n);\n      return scale2;\n    }\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : range2[bisectRight$1(thresholds, x2)];\n    }\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return i < 0 ? [NaN, NaN] : [\n        i > 0 ? thresholds[i - 1] : domain2[0],\n        i < thresholds.length ? thresholds[i] : domain2[domain2.length - 1]\n      ];\n    };\n    scale2.domain = function(_) {\n      if (!arguments.length) return domain2.slice();\n      domain2 = [];\n      for (let d of _) if (d != null && !isNaN(d = +d)) domain2.push(d);\n      domain2.sort(ascending$1);\n      return rescale();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.quantiles = function() {\n      return thresholds.slice();\n    };\n    scale2.copy = function() {\n      return quantile().domain(domain2).range(range2).unknown(unknown);\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function quantize$1() {\n    var x02 = 0, x12 = 1, n = 1, domain2 = [0.5], range2 = [0, 1], unknown;\n    function scale2(x2) {\n      return x2 != null && x2 <= x2 ? range2[bisectRight$1(domain2, x2, 0, n)] : unknown;\n    }\n    function rescale() {\n      var i = -1;\n      domain2 = new Array(n);\n      while (++i < n) domain2[i] = ((i + 1) * x12 - (i - n) * x02) / (n + 1);\n      return scale2;\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12] = _, x02 = +x02, x12 = +x12, rescale()) : [x02, x12];\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (n = (range2 = Array.from(_)).length - 1, rescale()) : range2.slice();\n    };\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return i < 0 ? [NaN, NaN] : i < 1 ? [x02, domain2[0]] : i >= n ? [domain2[n - 1], x12] : [domain2[i - 1], domain2[i]];\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : scale2;\n    };\n    scale2.thresholds = function() {\n      return domain2.slice();\n    };\n    scale2.copy = function() {\n      return quantize$1().domain([x02, x12]).range(range2).unknown(unknown);\n    };\n    return initRange.apply(linearish(scale2), arguments);\n  }\n  function threshold() {\n    var domain2 = [0.5], range2 = [0, 1], unknown, n = 1;\n    function scale2(x2) {\n      return x2 != null && x2 <= x2 ? range2[bisectRight$1(domain2, x2, 0, n)] : unknown;\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2 = Array.from(_), n = Math.min(domain2.length, range2.length - 1), scale2) : domain2.slice();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), n = Math.min(domain2.length, range2.length - 1), scale2) : range2.slice();\n    };\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return [domain2[i - 1], domain2[i]];\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return threshold().domain(domain2).range(range2).unknown(unknown);\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function date(t) {\n    return new Date(t);\n  }\n  function number$4(t) {\n    return t instanceof Date ? +t : +/* @__PURE__ */ new Date(+t);\n  }\n  function calendar(ticks2, tickInterval, year, month, week2, day, hour, minute, second2, format2) {\n    var scale2 = continuous$1(), invert2 = scale2.invert, domain2 = scale2.domain;\n    var formatMillisecond = format2(\".%L\"), formatSecond = format2(\":%S\"), formatMinute = format2(\"%I:%M\"), formatHour = format2(\"%I %p\"), formatDay = format2(\"%a %d\"), formatWeek = format2(\"%b %d\"), formatMonth = format2(\"%B\"), formatYear2 = format2(\"%Y\");\n    function tickFormat2(date2) {\n      return (second2(date2) < date2 ? formatMillisecond : minute(date2) < date2 ? formatSecond : hour(date2) < date2 ? formatMinute : day(date2) < date2 ? formatHour : month(date2) < date2 ? week2(date2) < date2 ? formatDay : formatWeek : year(date2) < date2 ? formatMonth : formatYear2)(date2);\n    }\n    scale2.invert = function(y2) {\n      return new Date(invert2(y2));\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? domain2(Array.from(_, number$4)) : domain2().map(date);\n    };\n    scale2.ticks = function(interval2) {\n      var d = domain2();\n      return ticks2(d[0], d[d.length - 1], interval2 == null ? 10 : interval2);\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      return specifier == null ? tickFormat2 : format2(specifier);\n    };\n    scale2.nice = function(interval2) {\n      var d = domain2();\n      if (!interval2 || typeof interval2.range !== \"function\") interval2 = tickInterval(d[0], d[d.length - 1], interval2 == null ? 10 : interval2);\n      return interval2 ? domain2(nice(d, interval2)) : scale2;\n    };\n    scale2.copy = function() {\n      return copy$7(scale2, calendar(ticks2, tickInterval, year, month, week2, day, hour, minute, second2, format2));\n    };\n    return scale2;\n  }\n  function time$1() {\n    return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute, second, timeFormat$1).domain([new Date(2e3, 0, 1), new Date(2e3, 0, 2)]), arguments);\n  }\n  function utcTime() {\n    return initRange.apply(calendar(utcTicks, utcTickInterval, utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, utcFormat$1).domain([Date.UTC(2e3, 0, 1), Date.UTC(2e3, 0, 2)]), arguments);\n  }\n  function transformer$2() {\n    var x02 = 0, x12 = 1, t02, t12, k10, transform2, interpolator = identity$3, clamp2 = false, unknown;\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : interpolator(k10 === 0 ? 0.5 : (x2 = (transform2(x2) - t02) * k10, clamp2 ? Math.max(0, Math.min(1, x2)) : x2));\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12] = _, t02 = transform2(x02 = +x02), t12 = transform2(x12 = +x12), k10 = t02 === t12 ? 0 : 1 / (t12 - t02), scale2) : [x02, x12];\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = !!_, scale2) : clamp2;\n    };\n    scale2.interpolator = function(_) {\n      return arguments.length ? (interpolator = _, scale2) : interpolator;\n    };\n    function range2(interpolate2) {\n      return function(_) {\n        var r0, r1;\n        return arguments.length ? ([r0, r1] = _, interpolator = interpolate2(r0, r1), scale2) : [interpolator(0), interpolator(1)];\n      };\n    }\n    scale2.range = range2(interpolate$1);\n    scale2.rangeRound = range2(interpolateRound);\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t) {\n      transform2 = t, t02 = t(x02), t12 = t(x12), k10 = t02 === t12 ? 0 : 1 / (t12 - t02);\n      return scale2;\n    };\n  }\n  function copy$6(source2, target2) {\n    return target2.domain(source2.domain()).interpolator(source2.interpolator()).clamp(source2.clamp()).unknown(source2.unknown());\n  }\n  function sequential() {\n    var scale2 = linearish(transformer$2()(identity$3));\n    scale2.copy = function() {\n      return copy$6(scale2, sequential());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialLog() {\n    var scale2 = loggish(transformer$2()).domain([1, 10]);\n    scale2.copy = function() {\n      return copy$6(scale2, sequentialLog()).base(scale2.base());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialSymlog() {\n    var scale2 = symlogish(transformer$2());\n    scale2.copy = function() {\n      return copy$6(scale2, sequentialSymlog()).constant(scale2.constant());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialPow() {\n    var scale2 = powish(transformer$2());\n    scale2.copy = function() {\n      return copy$6(scale2, sequentialPow()).exponent(scale2.exponent());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialSqrt() {\n    return sequentialPow.apply(null, arguments).exponent(0.5);\n  }\n  function transformer$1() {\n    var x02 = 0, x12 = 0.5, x2 = 1, s = 1, t02, t12, t22, k10, k21, interpolator = identity$3, transform2, clamp2 = false, unknown;\n    function scale2(x3) {\n      return isNaN(x3 = +x3) ? unknown : (x3 = 0.5 + ((x3 = +transform2(x3)) - t12) * (s * x3 < s * t12 ? k10 : k21), interpolator(clamp2 ? Math.max(0, Math.min(1, x3)) : x3));\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12, x2] = _, t02 = transform2(x02 = +x02), t12 = transform2(x12 = +x12), t22 = transform2(x2 = +x2), k10 = t02 === t12 ? 0 : 0.5 / (t12 - t02), k21 = t12 === t22 ? 0 : 0.5 / (t22 - t12), s = t12 < t02 ? -1 : 1, scale2) : [x02, x12, x2];\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = !!_, scale2) : clamp2;\n    };\n    scale2.interpolator = function(_) {\n      return arguments.length ? (interpolator = _, scale2) : interpolator;\n    };\n    function range2(interpolate2) {\n      return function(_) {\n        var r0, r1, r2;\n        return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate2, [r0, r1, r2]), scale2) : [interpolator(0), interpolator(0.5), interpolator(1)];\n      };\n    }\n    scale2.range = range2(interpolate$1);\n    scale2.rangeRound = range2(interpolateRound);\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t) {\n      transform2 = t, t02 = t(x02), t12 = t(x12), t22 = t(x2), k10 = t02 === t12 ? 0 : 0.5 / (t12 - t02), k21 = t12 === t22 ? 0 : 0.5 / (t22 - t12), s = t12 < t02 ? -1 : 1;\n      return scale2;\n    };\n  }\n  function diverging() {\n    var scale2 = linearish(transformer$1()(identity$3));\n    scale2.copy = function() {\n      return copy$6(scale2, diverging());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingLog() {\n    var scale2 = loggish(transformer$1()).domain([0.1, 1, 10]);\n    scale2.copy = function() {\n      return copy$6(scale2, divergingLog()).base(scale2.base());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingSymlog() {\n    var scale2 = symlogish(transformer$1());\n    scale2.copy = function() {\n      return copy$6(scale2, divergingSymlog()).constant(scale2.constant());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingPow() {\n    var scale2 = powish(transformer$1());\n    scale2.copy = function() {\n      return copy$6(scale2, divergingPow()).exponent(scale2.exponent());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingSqrt() {\n    return divergingPow.apply(null, arguments).exponent(0.5);\n  }\n  function colors$1(specifier) {\n    var n = specifier.length / 6 | 0, colors2 = new Array(n), i = 0;\n    while (i < n) colors2[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n    return colors2;\n  }\n  const schemeCategory10 = colors$1(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n  const schemeAccent = colors$1(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n  const schemeDark2 = colors$1(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n  const schemeObservable10 = colors$1(\"4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0\");\n  const schemePaired = colors$1(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n  const schemePastel1 = colors$1(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n  const schemePastel2 = colors$1(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n  const schemeSet1 = colors$1(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n  const schemeSet2 = colors$1(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n  const schemeSet3 = colors$1(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n  function bandSpace(count2, paddingInner, paddingOuter) {\n    const space = count2 - paddingInner + paddingOuter * 2;\n    return count2 ? space > 0 ? space : 1 : 0;\n  }\n  const Identity = \"identity\";\n  const Linear = \"linear\";\n  const Log$1 = \"log\";\n  const Pow = \"pow\";\n  const Sqrt = \"sqrt\";\n  const Symlog = \"symlog\";\n  const Time = \"time\";\n  const UTC = \"utc\";\n  const Sequential = \"sequential\";\n  const Diverging = \"diverging\";\n  const Quantile = \"quantile\";\n  const Quantize = \"quantize\";\n  const Threshold = \"threshold\";\n  const Ordinal = \"ordinal\";\n  const Point = \"point\";\n  const Band$1 = \"band\";\n  const BinOrdinal = \"bin-ordinal\";\n  const Continuous = \"continuous\";\n  const Discrete$1 = \"discrete\";\n  const Discretizing = \"discretizing\";\n  const Interpolating = \"interpolating\";\n  const Temporal = \"temporal\";\n  function invertRange(scale2) {\n    return function(_) {\n      let lo = _[0], hi = _[1], t;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      return [scale2.invert(lo), scale2.invert(hi)];\n    };\n  }\n  function invertRangeExtent(scale2) {\n    return function(_) {\n      const range2 = scale2.range();\n      let lo = _[0], hi = _[1], min2 = -1, max2, t, i, n;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      for (i = 0, n = range2.length; i < n; ++i) {\n        if (range2[i] >= lo && range2[i] <= hi) {\n          if (min2 < 0) min2 = i;\n          max2 = i;\n        }\n      }\n      if (min2 < 0) return void 0;\n      lo = scale2.invertExtent(range2[min2]);\n      hi = scale2.invertExtent(range2[max2]);\n      return [lo[0] === void 0 ? lo[1] : lo[0], hi[1] === void 0 ? hi[0] : hi[1]];\n    };\n  }\n  function band() {\n    const scale2 = ordinal().unknown(void 0), domain2 = scale2.domain, ordinalRange = scale2.range;\n    let range$12 = [0, 1], step, bandwidth2, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5;\n    delete scale2.unknown;\n    function rescale() {\n      const n = domain2().length, reverse2 = range$12[1] < range$12[0], stop2 = range$12[1 - reverse2], space = bandSpace(n, paddingInner, paddingOuter);\n      let start = range$12[reverse2 - 0];\n      step = (stop2 - start) / (space || 1);\n      if (round) {\n        step = Math.floor(step);\n      }\n      start += (stop2 - start - step * (n - paddingInner)) * align;\n      bandwidth2 = step * (1 - paddingInner);\n      if (round) {\n        start = Math.round(start);\n        bandwidth2 = Math.round(bandwidth2);\n      }\n      const values2 = range$3(n).map((i) => start + step * i);\n      return ordinalRange(reverse2 ? values2.reverse() : values2);\n    }\n    scale2.domain = function(_) {\n      if (arguments.length) {\n        domain2(_);\n        return rescale();\n      } else {\n        return domain2();\n      }\n    };\n    scale2.range = function(_) {\n      if (arguments.length) {\n        range$12 = [+_[0], +_[1]];\n        return rescale();\n      } else {\n        return range$12.slice();\n      }\n    };\n    scale2.rangeRound = function(_) {\n      range$12 = [+_[0], +_[1]];\n      round = true;\n      return rescale();\n    };\n    scale2.bandwidth = function() {\n      return bandwidth2;\n    };\n    scale2.step = function() {\n      return step;\n    };\n    scale2.round = function(_) {\n      if (arguments.length) {\n        round = !!_;\n        return rescale();\n      } else {\n        return round;\n      }\n    };\n    scale2.padding = function(_) {\n      if (arguments.length) {\n        paddingOuter = Math.max(0, Math.min(1, _));\n        paddingInner = paddingOuter;\n        return rescale();\n      } else {\n        return paddingInner;\n      }\n    };\n    scale2.paddingInner = function(_) {\n      if (arguments.length) {\n        paddingInner = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return paddingInner;\n      }\n    };\n    scale2.paddingOuter = function(_) {\n      if (arguments.length) {\n        paddingOuter = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return paddingOuter;\n      }\n    };\n    scale2.align = function(_) {\n      if (arguments.length) {\n        align = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return align;\n      }\n    };\n    scale2.invertRange = function(_) {\n      if (_[0] == null || _[1] == null) return;\n      const reverse2 = range$12[1] < range$12[0], values2 = reverse2 ? ordinalRange().reverse() : ordinalRange(), n = values2.length - 1;\n      let lo = +_[0], hi = +_[1], a2, b2, t;\n      if (lo !== lo || hi !== hi) return;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      if (hi < values2[0] || lo > range$12[1 - reverse2]) return;\n      a2 = Math.max(0, bisectRight$1(values2, lo) - 1);\n      b2 = lo === hi ? a2 : bisectRight$1(values2, hi) - 1;\n      if (lo - values2[a2] > bandwidth2 + 1e-10) ++a2;\n      if (reverse2) {\n        t = a2;\n        a2 = n - b2;\n        b2 = n - t;\n      }\n      return a2 > b2 ? void 0 : domain2().slice(a2, b2 + 1);\n    };\n    scale2.invert = function(_) {\n      const value2 = scale2.invertRange([_, _]);\n      return value2 ? value2[0] : value2;\n    };\n    scale2.copy = function() {\n      return band().domain(domain2()).range(range$12).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n    };\n    return rescale();\n  }\n  function pointish(scale2) {\n    const copy2 = scale2.copy;\n    scale2.padding = scale2.paddingOuter;\n    delete scale2.paddingInner;\n    scale2.copy = function() {\n      return pointish(copy2());\n    };\n    return scale2;\n  }\n  function point$1() {\n    return pointish(band().paddingInner(1));\n  }\n  var map$1 = Array.prototype.map;\n  function numbers(_) {\n    return map$1.call(_, toNumber);\n  }\n  const slice$1 = Array.prototype.slice;\n  function scaleBinOrdinal() {\n    let domain2 = [], range2 = [];\n    function scale2(x2) {\n      return x2 == null || x2 !== x2 ? void 0 : range2[(bisectRight$1(domain2, x2) - 1) % range2.length];\n    }\n    scale2.domain = function(_) {\n      if (arguments.length) {\n        domain2 = numbers(_);\n        return scale2;\n      } else {\n        return domain2.slice();\n      }\n    };\n    scale2.range = function(_) {\n      if (arguments.length) {\n        range2 = slice$1.call(_);\n        return scale2;\n      } else {\n        return range2.slice();\n      }\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      return tickFormat$1(domain2[0], peek$1(domain2), count2 == null ? 10 : count2, specifier);\n    };\n    scale2.copy = function() {\n      return scaleBinOrdinal().domain(scale2.domain()).range(scale2.range());\n    };\n    return scale2;\n  }\n  const scales = /* @__PURE__ */ new Map();\n  const VEGA_SCALE = Symbol(\"vega_scale\");\n  function registerScale(scale2) {\n    scale2[VEGA_SCALE] = true;\n    return scale2;\n  }\n  function isRegisteredScale(scale2) {\n    return scale2 && scale2[VEGA_SCALE] === true;\n  }\n  function create$8(type2, constructor, metadata2) {\n    const ctr = function scale2() {\n      const s = constructor();\n      if (!s.invertRange) {\n        s.invertRange = s.invert ? invertRange(s) : s.invertExtent ? invertRangeExtent(s) : void 0;\n      }\n      s.type = type2;\n      return registerScale(s);\n    };\n    ctr.metadata = toSet(array$5(metadata2));\n    return ctr;\n  }\n  function scale$6(type2, scale2, metadata2) {\n    if (arguments.length > 1) {\n      scales.set(type2, create$8(type2, scale2, metadata2));\n      return this;\n    } else {\n      return isValidScaleType(type2) ? scales.get(type2) : void 0;\n    }\n  }\n  scale$6(Identity, identity$2);\n  scale$6(Linear, linear, Continuous);\n  scale$6(Log$1, log$2, [Continuous, Log$1]);\n  scale$6(Pow, pow$2, Continuous);\n  scale$6(Sqrt, sqrt$2, Continuous);\n  scale$6(Symlog, symlog, Continuous);\n  scale$6(Time, time$1, [Continuous, Temporal]);\n  scale$6(UTC, utcTime, [Continuous, Temporal]);\n  scale$6(Sequential, sequential, [Continuous, Interpolating]);\n  scale$6(`${Sequential}-${Linear}`, sequential, [Continuous, Interpolating]);\n  scale$6(`${Sequential}-${Log$1}`, sequentialLog, [Continuous, Interpolating, Log$1]);\n  scale$6(`${Sequential}-${Pow}`, sequentialPow, [Continuous, Interpolating]);\n  scale$6(`${Sequential}-${Sqrt}`, sequentialSqrt, [Continuous, Interpolating]);\n  scale$6(`${Sequential}-${Symlog}`, sequentialSymlog, [Continuous, Interpolating]);\n  scale$6(`${Diverging}-${Linear}`, diverging, [Continuous, Interpolating]);\n  scale$6(`${Diverging}-${Log$1}`, divergingLog, [Continuous, Interpolating, Log$1]);\n  scale$6(`${Diverging}-${Pow}`, divergingPow, [Continuous, Interpolating]);\n  scale$6(`${Diverging}-${Sqrt}`, divergingSqrt, [Continuous, Interpolating]);\n  scale$6(`${Diverging}-${Symlog}`, divergingSymlog, [Continuous, Interpolating]);\n  scale$6(Quantile, quantile, [Discretizing, Quantile]);\n  scale$6(Quantize, quantize$1, Discretizing);\n  scale$6(Threshold, threshold, Discretizing);\n  scale$6(BinOrdinal, scaleBinOrdinal, [Discrete$1, Discretizing]);\n  scale$6(Ordinal, ordinal, Discrete$1);\n  scale$6(Band$1, band, Discrete$1);\n  scale$6(Point, point$1, Discrete$1);\n  function isValidScaleType(type2) {\n    return scales.has(type2);\n  }\n  function hasType(key2, type2) {\n    const s = scales.get(key2);\n    return s && s.metadata[type2];\n  }\n  function isContinuous(key2) {\n    return hasType(key2, Continuous);\n  }\n  function isDiscrete(key2) {\n    return hasType(key2, Discrete$1);\n  }\n  function isDiscretizing(key2) {\n    return hasType(key2, Discretizing);\n  }\n  function isLogarithmic(key2) {\n    return hasType(key2, Log$1);\n  }\n  function isTemporal(key2) {\n    return hasType(key2, Temporal);\n  }\n  function isInterpolating(key2) {\n    return hasType(key2, Interpolating);\n  }\n  function isQuantile(key2) {\n    return hasType(key2, Quantile);\n  }\n  const scaleProps = [\"clamp\", \"base\", \"constant\", \"exponent\"];\n  function interpolateRange(interpolator, range2) {\n    const start = range2[0], span2 = peek$1(range2) - start;\n    return function(i) {\n      return interpolator(start + i * span2);\n    };\n  }\n  function interpolateColors(colors2, type2, gamma2) {\n    return piecewise(interpolate(type2 || \"rgb\", gamma2), colors2);\n  }\n  function quantizeInterpolator(interpolator, count2) {\n    const samples = new Array(count2), n = count2 + 1;\n    for (let i = 0; i < count2; ) samples[i] = interpolator(++i / n);\n    return samples;\n  }\n  function scaleFraction(scale$12, min2, max2) {\n    const delta = max2 - min2;\n    let i, t, s;\n    if (!delta || !Number.isFinite(delta)) {\n      return constant$5(0.5);\n    } else {\n      i = (t = scale$12.type).indexOf(\"-\");\n      t = i < 0 ? t : t.slice(i + 1);\n      s = scale$6(t)().domain([min2, max2]).range([0, 1]);\n      scaleProps.forEach((m2) => scale$12[m2] ? s[m2](scale$12[m2]()) : 0);\n      return s;\n    }\n  }\n  function interpolate(type2, gamma2) {\n    const interp = $$1[method(type2)];\n    return gamma2 != null && interp && interp.gamma ? interp.gamma(gamma2) : interp;\n  }\n  function method(type2) {\n    return \"interpolate\" + type2.toLowerCase().split(\"-\").map((s) => s[0].toUpperCase() + s.slice(1)).join(\"\");\n  }\n  const continuous = {\n    blues: \"cfe1f2bed8eca8cee58fc1de74b2d75ba3cf4592c63181bd206fb2125ca40a4a90\",\n    greens: \"d3eecdc0e6baabdda594d3917bc77d60ba6c46ab5e329a512089430e7735036429\",\n    greys: \"e2e2e2d4d4d4c4c4c4b1b1b19d9d9d8888887575756262624d4d4d3535351e1e1e\",\n    oranges: \"fdd8b3fdc998fdb87bfda55efc9244f87f2cf06b18e4580bd14904b93d029f3303\",\n    purples: \"e2e1efd4d4e8c4c5e0b4b3d6a3a0cc928ec3827cb97566ae684ea25c3696501f8c\",\n    reds: \"fdc9b4fcb49afc9e80fc8767fa7051f6573fec3f2fdc2a25c81b1db21218970b13\",\n    blueGreen: \"d5efedc1e8e0a7ddd18bd2be70c6a958ba9144ad77319c5d2089460e7736036429\",\n    bluePurple: \"ccddecbad0e4a8c2dd9ab0d4919cc98d85be8b6db28a55a6873c99822287730f71\",\n    greenBlue: \"d3eecec5e8c3b1e1bb9bd8bb82cec269c2ca51b2cd3c9fc7288abd1675b10b60a1\",\n    orangeRed: \"fddcaffdcf9bfdc18afdad77fb9562f67d53ee6545e24932d32d1ebf130da70403\",\n    purpleBlue: \"dbdaebc8cee4b1c3de97b7d87bacd15b9fc93a90c01e7fb70b70ab056199045281\",\n    purpleBlueGreen: \"dbd8eac8cee4b0c3de93b7d872acd1549fc83892bb1c88a3097f8702736b016353\",\n    purpleRed: \"dcc9e2d3b3d7ce9eccd186c0da6bb2e14da0e23189d91e6fc61159ab07498f023a\",\n    redPurple: \"fccfccfcbec0faa9b8f98faff571a5ec539ddb3695c41b8aa908808d0179700174\",\n    yellowGreen: \"e4f4acd1eca0b9e2949ed68880c97c62bb6e47aa5e3297502083440e723b036034\",\n    yellowOrangeBrown: \"feeaa1fedd84fecc63feb746fca031f68921eb7215db5e0bc54c05ab3d038f3204\",\n    yellowOrangeRed: \"fee087fed16ffebd59fea849fd903efc7335f9522bee3423de1b20ca0b22af0225\",\n    blueOrange: \"134b852f78b35da2cb9dcae1d2e5eff2f0ebfce0bafbbf74e8932fc5690d994a07\",\n    brownBlueGreen: \"704108a0651ac79548e3c78af3e6c6eef1eac9e9e48ed1c74da79e187a72025147\",\n    purpleGreen: \"5b1667834792a67fb6c9aed3e6d6e8eff0efd9efd5aedda971bb75368e490e5e29\",\n    purpleOrange: \"4114696647968f83b7b9b4d6dadbebf3eeeafce0bafbbf74e8932fc5690d994a07\",\n    redBlue: \"8c0d25bf363adf745ef4ae91fbdbc9f2efeed2e5ef9dcae15da2cb2f78b3134b85\",\n    redGrey: \"8c0d25bf363adf745ef4ae91fcdccbfaf4f1e2e2e2c0c0c0969696646464343434\",\n    yellowGreenBlue: \"eff9bddbf1b4bde5b594d5b969c5be45b4c22c9ec02182b82163aa23479c1c3185\",\n    redYellowBlue: \"a50026d4322cf16e43fcac64fedd90faf8c1dcf1ecabd6e875abd04a74b4313695\",\n    redYellowGreen: \"a50026d4322cf16e43fcac63fedd8df9f7aed7ee8ea4d86e64bc6122964f006837\",\n    pinkYellowGreen: \"8e0152c0267edd72adf0b3d6faddedf5f3efe1f2cab6de8780bb474f9125276419\",\n    spectral: \"9e0142d13c4bf0704afcac63fedd8dfbf8b0e0f3a1a9dda269bda94288b55e4fa2\",\n    viridis: \"440154470e61481a6c482575472f7d443a834144873d4e8a39568c35608d31688e2d708e2a788e27818e23888e21918d1f988b1fa08822a8842ab07f35b77943bf7154c56866cc5d7ad1518fd744a5db36bcdf27d2e21be9e51afde725\",\n    magma: \"0000040404130b0924150e3720114b2c11603b0f704a107957157e651a80721f817f24828c29819a2e80a8327db6377ac43c75d1426fde4968e95462f1605df76f5cfa7f5efc8f65fe9f6dfeaf78febf84fece91fddea0fcedaffcfdbf\",\n    inferno: \"0000040403130c0826170c3b240c4f330a5f420a68500d6c5d126e6b176e781c6d86216b932667a12b62ae305cbb3755c73e4cd24644dd513ae65c30ed6925f3771af8850ffb9506fca50afcb519fac62df6d645f2e661f3f484fcffa4\",\n    plasma: \"0d088723069033059742039d5002a25d01a66a00a87801a88405a7900da49c179ea72198b12a90ba3488c33d80cb4779d35171da5a69e16462e76e5bed7953f2834cf68f44fa9a3dfca636fdb32ffec029fcce25f9dc24f5ea27f0f921\",\n    cividis: \"00205100235800265d002961012b65042e670831690d346b11366c16396d1c3c6e213f6e26426e2c456e31476e374a6e3c4d6e42506e47536d4c566d51586e555b6e5a5e6e5e616e62646f66676f6a6a706e6d717270717573727976737c79747f7c75827f758682768985778c8877908b78938e789691789a94789e9778a19b78a59e77a9a177aea575b2a874b6ab73bbaf71c0b26fc5b66dc9b96acebd68d3c065d8c462ddc85fe2cb5ce7cf58ebd355f0d652f3da4ff7de4cfae249fce647\",\n    rainbow: \"6e40aa883eb1a43db3bf3cafd83fa4ee4395fe4b83ff576eff6659ff7847ff8c38f3a130e2b72fcfcc36bee044aff05b8ff4576ff65b52f6673af27828ea8d1ddfa319d0b81cbecb23abd82f96e03d82e14c6edb5a5dd0664dbf6e40aa\",\n    sinebow: \"ff4040fc582af47218e78d0bd5a703bfbf00a7d5038de70b72f41858fc2a40ff402afc5818f4720be78d03d5a700bfbf03a7d50b8de71872f42a58fc4040ff582afc7218f48d0be7a703d5bf00bfd503a7e70b8df41872fc2a58ff4040\",\n    turbo: \"23171b32204a3e2a71453493493eae4b49c54a53d7485ee44569ee4074f53c7ff8378af93295f72e9ff42ba9ef28b3e926bce125c5d925cdcf27d5c629dcbc2de3b232e9a738ee9d3ff39347f68950f9805afc7765fd6e70fe667cfd5e88fc5795fb51a1f84badf545b9f140c5ec3cd0e637dae034e4d931ecd12ef4c92bfac029ffb626ffad24ffa223ff9821ff8d1fff821dff771cfd6c1af76118f05616e84b14df4111d5380fcb2f0dc0260ab61f07ac1805a313029b0f00950c00910b00\",\n    browns: \"eedbbdecca96e9b97ae4a865dc9856d18954c7784cc0673fb85536ad44339f3632\",\n    tealBlues: \"bce4d89dd3d181c3cb65b3c245a2b9368fae347da0306a932c5985\",\n    teals: \"bbdfdfa2d4d58ac9c975bcbb61b0af4da5a43799982b8b8c1e7f7f127273006667\",\n    warmGreys: \"dcd4d0cec5c1c0b8b4b3aaa7a59c9998908c8b827f7e7673726866665c5a59504e\",\n    goldGreen: \"f4d166d5ca60b6c35c98bb597cb25760a6564b9c533f8f4f33834a257740146c36\",\n    goldOrange: \"f4d166f8be5cf8aa4cf5983bf3852aef701be2621fd65322c54923b142239e3a26\",\n    goldRed: \"f4d166f6be59f9aa51fc964ef6834bee734ae56249db5247cf4244c43141b71d3e\",\n    lightGreyRed: \"efe9e6e1dad7d5cbc8c8bdb9bbaea9cd967ddc7b43e15f19df4011dc000b\",\n    lightGreyTeal: \"e4eaead6dcddc8ced2b7c2c7a6b4bc64b0bf22a6c32295c11f85be1876bc\",\n    lightMulti: \"e0f1f2c4e9d0b0de9fd0e181f6e072f6c053f3993ef77440ef4a3c\",\n    lightOrange: \"f2e7daf7d5baf9c499fab184fa9c73f68967ef7860e8645bde515bd43d5b\",\n    lightTealBlue: \"e3e9e0c0dccf9aceca7abfc859afc0389fb9328dad2f7ca0276b95255988\",\n    darkBlue: \"3232322d46681a5c930074af008cbf05a7ce25c0dd38daed50f3faffffff\",\n    darkGold: \"3c3c3c584b37725e348c7631ae8b2bcfa424ecc31ef9de30fff184ffffff\",\n    darkGreen: \"3a3a3a215748006f4d048942489e4276b340a6c63dd2d836ffeb2cffffaa\",\n    darkMulti: \"3737371f5287197d8c29a86995ce3fffe800ffffff\",\n    darkRed: \"3434347036339e3c38cc4037e75d1eec8620eeab29f0ce32ffeb2c\"\n  };\n  const discrete = {\n    accent: schemeAccent,\n    category10: schemeCategory10,\n    category20: \"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\",\n    category20b: \"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\",\n    category20c: \"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\",\n    dark2: schemeDark2,\n    observable10: schemeObservable10,\n    paired: schemePaired,\n    pastel1: schemePastel1,\n    pastel2: schemePastel2,\n    set1: schemeSet1,\n    set2: schemeSet2,\n    set3: schemeSet3,\n    tableau10: \"4c78a8f58518e4575672b7b254a24beeca3bb279a2ff9da69d755dbab0ac\",\n    tableau20: \"4c78a89ecae9f58518ffbf7954a24b88d27ab79a20f2cf5b43989483bcb6e45756ff9d9879706ebab0acd67195fcbfd2b279a2d6a5c99e765fd8b5a5\"\n  };\n  function colors(palette) {\n    if (isArray(palette)) return palette;\n    const n = palette.length / 6 | 0, c2 = new Array(n);\n    for (let i = 0; i < n; ) {\n      c2[i] = \"#\" + palette.slice(i * 6, ++i * 6);\n    }\n    return c2;\n  }\n  function apply(_, f) {\n    for (const k in _) scheme(k, f(_[k]));\n  }\n  const schemes = {};\n  apply(discrete, colors);\n  apply(continuous, (_) => interpolateColors(colors(_)));\n  function scheme(name, scheme2) {\n    name = name && name.toLowerCase();\n    if (arguments.length > 1) {\n      schemes[name] = scheme2;\n      return this;\n    } else {\n      return schemes[name];\n    }\n  }\n  const SymbolLegend = \"symbol\";\n  const DiscreteLegend = \"discrete\";\n  const GradientLegend = \"gradient\";\n  const defaultFormatter = (value2) => isArray(value2) ? value2.map((v) => String(v)) : String(value2);\n  const ascending = (a2, b2) => a2[1] - b2[1];\n  const descending = (a2, b2) => b2[1] - a2[1];\n  function tickCount(scale2, count2, minStep) {\n    let step;\n    if (isNumber$1(count2)) {\n      if (scale2.bins) {\n        count2 = Math.max(count2, scale2.bins.length);\n      }\n      if (minStep != null) {\n        count2 = Math.min(count2, Math.floor(span(scale2.domain()) / minStep || 1) + 1);\n      }\n    }\n    if (isObject$1(count2)) {\n      step = count2.step;\n      count2 = count2.interval;\n    }\n    if (isString(count2)) {\n      count2 = scale2.type === Time ? timeInterval(count2) : scale2.type == UTC ? utcInterval(count2) : error(\"Only time and utc scales accept interval strings.\");\n      if (step) count2 = count2.every(step);\n    }\n    return count2;\n  }\n  function validTicks(scale2, ticks2, count2) {\n    let range2 = scale2.range(), lo = range2[0], hi = peek$1(range2), cmp = ascending;\n    if (lo > hi) {\n      range2 = hi;\n      hi = lo;\n      lo = range2;\n      cmp = descending;\n    }\n    lo = Math.floor(lo);\n    hi = Math.ceil(hi);\n    ticks2 = ticks2.map((v) => [v, scale2(v)]).filter((_) => lo <= _[1] && _[1] <= hi).sort(cmp).map((_) => _[0]);\n    if (count2 > 0 && ticks2.length > 1) {\n      const endpoints = [ticks2[0], peek$1(ticks2)];\n      while (ticks2.length > count2 && ticks2.length >= 3) {\n        ticks2 = ticks2.filter((_, i) => !(i % 2));\n      }\n      if (ticks2.length < 3) {\n        ticks2 = endpoints;\n      }\n    }\n    return ticks2;\n  }\n  function tickValues(scale2, count2) {\n    return scale2.bins ? validTicks(scale2, scale2.bins, count2) : scale2.ticks ? scale2.ticks(count2) : scale2.domain();\n  }\n  function tickFormat(locale2, scale2, count2, specifier, formatType, noSkip) {\n    const type2 = scale2.type;\n    let format2 = defaultFormatter;\n    if (type2 === Time || formatType === Time) {\n      format2 = locale2.timeFormat(specifier);\n    } else if (type2 === UTC || formatType === UTC) {\n      format2 = locale2.utcFormat(specifier);\n    } else if (isLogarithmic(type2)) {\n      const varfmt = locale2.formatFloat(specifier);\n      if (noSkip || scale2.bins) {\n        format2 = varfmt;\n      } else {\n        const test2 = tickLog(scale2, count2, false);\n        format2 = (_) => test2(_) ? varfmt(_) : \"\";\n      }\n    } else if (scale2.tickFormat) {\n      const d = scale2.domain();\n      format2 = locale2.formatSpan(d[0], d[d.length - 1], count2, specifier);\n    } else if (specifier) {\n      format2 = locale2.format(specifier);\n    }\n    return format2;\n  }\n  function tickLog(scale2, count2, values2) {\n    const ticks2 = tickValues(scale2, count2), base2 = scale2.base(), logb = Math.log(base2), k = Math.max(1, base2 * count2 / ticks2.length);\n    const test2 = (d) => {\n      let i = d / Math.pow(base2, Math.round(Math.log(d) / logb));\n      if (i * base2 < base2 - 0.5) i *= base2;\n      return i <= k;\n    };\n    return values2 ? ticks2.filter(test2) : test2;\n  }\n  const symbols$1 = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"thresholds\",\n    [Threshold]: \"domain\"\n  };\n  const formats = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"domain\"\n  };\n  function labelValues(scale2, count2) {\n    return scale2.bins ? binValues(scale2.bins) : scale2.type === Log$1 ? tickLog(scale2, count2, true) : symbols$1[scale2.type] ? thresholdValues(scale2[symbols$1[scale2.type]]()) : tickValues(scale2, count2);\n  }\n  function thresholdFormat(locale2, scale2, specifier) {\n    const _ = scale2[formats[scale2.type]](), n = _.length;\n    let d = n > 1 ? _[1] - _[0] : _[0], i;\n    for (i = 1; i < n; ++i) {\n      d = Math.min(d, _[i] - _[i - 1]);\n    }\n    return locale2.formatSpan(0, d, 3 * 10, specifier);\n  }\n  function thresholdValues(thresholds) {\n    const values2 = [-Infinity].concat(thresholds);\n    values2.max = Infinity;\n    return values2;\n  }\n  function binValues(bins) {\n    const values2 = bins.slice(0, -1);\n    values2.max = peek$1(bins);\n    return values2;\n  }\n  const isDiscreteRange = (scale2) => symbols$1[scale2.type] || scale2.bins;\n  function labelFormat(locale2, scale2, count2, type2, specifier, formatType, noSkip) {\n    const format2 = formats[scale2.type] && formatType !== Time && formatType !== UTC ? thresholdFormat(locale2, scale2, specifier) : tickFormat(locale2, scale2, count2, specifier, formatType, noSkip);\n    return type2 === SymbolLegend && isDiscreteRange(scale2) ? formatRange(format2) : type2 === DiscreteLegend ? formatDiscrete(format2) : formatPoint(format2);\n  }\n  const formatRange = (format2) => (value2, index2, array2) => {\n    const limit = get$3(array2[index2 + 1], get$3(array2.max, Infinity)), lo = formatValue$1(value2, format2), hi = formatValue$1(limit, format2);\n    return lo && hi ? lo + \" – \" + hi : hi ? \"< \" + hi : \"≥ \" + lo;\n  };\n  const get$3 = (value2, dflt) => value2 != null ? value2 : dflt;\n  const formatDiscrete = (format2) => (value2, index2) => index2 ? format2(value2) : null;\n  const formatPoint = (format2) => (value2) => format2(value2);\n  const formatValue$1 = (value2, format2) => Number.isFinite(value2) ? format2(value2) : null;\n  function labelFraction(scale2) {\n    const domain2 = scale2.domain(), count2 = domain2.length - 1;\n    let lo = +domain2[0], hi = +peek$1(domain2), span2 = hi - lo;\n    if (scale2.type === Threshold) {\n      const adjust = count2 ? span2 / count2 : 0.1;\n      lo -= adjust;\n      hi += adjust;\n      span2 = hi - lo;\n    }\n    return (value2) => (value2 - lo) / span2;\n  }\n  function format$1(locale2, scale2, specifier, formatType) {\n    const type2 = formatType || scale2.type;\n    if (isString(specifier) && isTemporal(type2)) {\n      specifier = specifier.replace(/%a/g, \"%A\").replace(/%b/g, \"%B\");\n    }\n    return !specifier && type2 === Time ? locale2.timeFormat(\"%A, %d %B %Y, %X\") : !specifier && type2 === UTC ? locale2.utcFormat(\"%A, %d %B %Y, %X UTC\") : labelFormat(locale2, scale2, 5, null, specifier, formatType, true);\n  }\n  function domainCaption(locale2, scale2, opt) {\n    opt = opt || {};\n    const max2 = Math.max(3, opt.maxlen || 7), fmt = format$1(locale2, scale2, opt.format, opt.formatType);\n    if (isDiscretizing(scale2.type)) {\n      const v = labelValues(scale2).slice(1).map(fmt), n = v.length;\n      return `${n} boundar${n === 1 ? \"y\" : \"ies\"}: ${v.join(\", \")}`;\n    } else if (isDiscrete(scale2.type)) {\n      const d = scale2.domain(), n = d.length, v = n > max2 ? d.slice(0, max2 - 2).map(fmt).join(\", \") + \", ending with \" + d.slice(-1).map(fmt) : d.map(fmt).join(\", \");\n      return `${n} value${n === 1 ? \"\" : \"s\"}: ${v}`;\n    } else {\n      const d = scale2.domain();\n      return `values from ${fmt(d[0])} to ${fmt(peek$1(d))}`;\n    }\n  }\n  let gradient_id = 0;\n  function resetSVGGradientId() {\n    gradient_id = 0;\n  }\n  const patternPrefix = \"p_\";\n  function isGradient(value2) {\n    return value2 && value2.gradient;\n  }\n  function gradientRef(g, defs, base2) {\n    const type2 = g.gradient;\n    let id2 = g.id, prefix = type2 === \"radial\" ? patternPrefix : \"\";\n    if (!id2) {\n      id2 = g.id = \"gradient_\" + gradient_id++;\n      if (type2 === \"radial\") {\n        g.x1 = get$2(g.x1, 0.5);\n        g.y1 = get$2(g.y1, 0.5);\n        g.r1 = get$2(g.r1, 0);\n        g.x2 = get$2(g.x2, 0.5);\n        g.y2 = get$2(g.y2, 0.5);\n        g.r2 = get$2(g.r2, 0.5);\n        prefix = patternPrefix;\n      } else {\n        g.x1 = get$2(g.x1, 0);\n        g.y1 = get$2(g.y1, 0);\n        g.x2 = get$2(g.x2, 1);\n        g.y2 = get$2(g.y2, 0);\n      }\n    }\n    defs[id2] = g;\n    return \"url(\" + (base2 || \"\") + \"#\" + prefix + id2 + \")\";\n  }\n  function get$2(val, def2) {\n    return val != null ? val : def2;\n  }\n  function Gradient$1(p02, p1) {\n    var stops = [], gradient2;\n    return gradient2 = {\n      gradient: \"linear\",\n      x1: p02 ? p02[0] : 0,\n      y1: p02 ? p02[1] : 0,\n      x2: p1 ? p1[0] : 1,\n      y2: p1 ? p1[1] : 0,\n      stops,\n      stop: function(offset2, color2) {\n        stops.push({\n          offset: offset2,\n          color: color2\n        });\n        return gradient2;\n      }\n    };\n  }\n  const lookup$4 = {\n    \"basis\": {\n      curve: curveBasis\n    },\n    \"basis-closed\": {\n      curve: curveBasisClosed\n    },\n    \"basis-open\": {\n      curve: curveBasisOpen\n    },\n    \"bundle\": {\n      curve: curveBundle,\n      tension: \"beta\",\n      value: 0.85\n    },\n    \"cardinal\": {\n      curve: curveCardinal,\n      tension: \"tension\",\n      value: 0\n    },\n    \"cardinal-open\": {\n      curve: curveCardinalOpen,\n      tension: \"tension\",\n      value: 0\n    },\n    \"cardinal-closed\": {\n      curve: curveCardinalClosed,\n      tension: \"tension\",\n      value: 0\n    },\n    \"catmull-rom\": {\n      curve: curveCatmullRom,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"catmull-rom-closed\": {\n      curve: curveCatmullRomClosed,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"catmull-rom-open\": {\n      curve: curveCatmullRomOpen,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"linear\": {\n      curve: curveLinear\n    },\n    \"linear-closed\": {\n      curve: curveLinearClosed\n    },\n    \"monotone\": {\n      horizontal: monotoneY,\n      vertical: monotoneX\n    },\n    \"natural\": {\n      curve: curveNatural\n    },\n    \"step\": {\n      curve: curveStep\n    },\n    \"step-after\": {\n      curve: stepAfter\n    },\n    \"step-before\": {\n      curve: stepBefore\n    }\n  };\n  function curves(type2, orientation, tension) {\n    var entry2 = has$1(lookup$4, type2) && lookup$4[type2], curve2 = null;\n    if (entry2) {\n      curve2 = entry2.curve || entry2[orientation || \"vertical\"];\n      if (entry2.tension && tension != null) {\n        curve2 = curve2[entry2.tension](tension);\n      }\n    }\n    return curve2;\n  }\n  const paramCounts = {\n    m: 2,\n    l: 2,\n    h: 1,\n    v: 1,\n    z: 0,\n    c: 6,\n    s: 4,\n    q: 4,\n    t: 2,\n    a: 7\n  };\n  const commandPattern = /[mlhvzcsqta]([^mlhvzcsqta]+|$)/gi;\n  const numberPattern = /^[+-]?(([0-9]*\\.[0-9]+)|([0-9]+\\.)|([0-9]+))([eE][+-]?[0-9]+)?/;\n  const spacePattern = /^((\\s+,?\\s*)|(,\\s*))/;\n  const flagPattern = /^[01]/;\n  function parse$3(path2) {\n    const commands = [];\n    const matches = path2.match(commandPattern) || [];\n    matches.forEach((str) => {\n      let cmd = str[0];\n      const type2 = cmd.toLowerCase();\n      const paramCount = paramCounts[type2];\n      const params2 = parseParams(type2, paramCount, str.slice(1).trim());\n      const count2 = params2.length;\n      if (count2 < paramCount || count2 && count2 % paramCount !== 0) {\n        throw Error(\"Invalid SVG path, incorrect parameter count\");\n      }\n      commands.push([cmd, ...params2.slice(0, paramCount)]);\n      if (count2 === paramCount) {\n        return;\n      }\n      if (type2 === \"m\") {\n        cmd = cmd === \"M\" ? \"L\" : \"l\";\n      }\n      for (let i = paramCount; i < count2; i += paramCount) {\n        commands.push([cmd, ...params2.slice(i, i + paramCount)]);\n      }\n    });\n    return commands;\n  }\n  function parseParams(type2, paramCount, segment) {\n    const params2 = [];\n    for (let index2 = 0; paramCount && index2 < segment.length; ) {\n      for (let i = 0; i < paramCount; ++i) {\n        const pattern = type2 === \"a\" && (i === 3 || i === 4) ? flagPattern : numberPattern;\n        const match2 = segment.slice(index2).match(pattern);\n        if (match2 === null) {\n          throw Error(\"Invalid SVG path, incorrect parameter type\");\n        }\n        index2 += match2[0].length;\n        params2.push(+match2[0]);\n        const ws = segment.slice(index2).match(spacePattern);\n        if (ws !== null) {\n          index2 += ws[0].length;\n        }\n      }\n    }\n    return params2;\n  }\n  const DegToRad = Math.PI / 180;\n  const Epsilon = 1e-14;\n  const HalfPi = Math.PI / 2;\n  const Tau = Math.PI * 2;\n  const HalfSqrt3 = Math.sqrt(3) / 2;\n  var segmentCache = {};\n  var bezierCache = {};\n  var join$1 = [].join;\n  function segments(x2, y2, rx, ry, large, sweep, rotateX2, ox, oy) {\n    const key2 = join$1.call(arguments);\n    if (segmentCache[key2]) {\n      return segmentCache[key2];\n    }\n    const th = rotateX2 * DegToRad;\n    const sin_th = Math.sin(th);\n    const cos_th = Math.cos(th);\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n    const px2 = cos_th * (ox - x2) * 0.5 + sin_th * (oy - y2) * 0.5;\n    const py2 = cos_th * (oy - y2) * 0.5 - sin_th * (ox - x2) * 0.5;\n    let pl = px2 * px2 / (rx * rx) + py2 * py2 / (ry * ry);\n    if (pl > 1) {\n      pl = Math.sqrt(pl);\n      rx *= pl;\n      ry *= pl;\n    }\n    const a00 = cos_th / rx;\n    const a01 = sin_th / rx;\n    const a10 = -sin_th / ry;\n    const a11 = cos_th / ry;\n    const x02 = a00 * ox + a01 * oy;\n    const y02 = a10 * ox + a11 * oy;\n    const x12 = a00 * x2 + a01 * y2;\n    const y12 = a10 * x2 + a11 * y2;\n    const d = (x12 - x02) * (x12 - x02) + (y12 - y02) * (y12 - y02);\n    let sfactor_sq = 1 / d - 0.25;\n    if (sfactor_sq < 0) sfactor_sq = 0;\n    let sfactor = Math.sqrt(sfactor_sq);\n    if (sweep == large) sfactor = -sfactor;\n    const xc = 0.5 * (x02 + x12) - sfactor * (y12 - y02);\n    const yc = 0.5 * (y02 + y12) + sfactor * (x12 - x02);\n    const th0 = Math.atan2(y02 - yc, x02 - xc);\n    const th1 = Math.atan2(y12 - yc, x12 - xc);\n    let th_arc = th1 - th0;\n    if (th_arc < 0 && sweep === 1) {\n      th_arc += Tau;\n    } else if (th_arc > 0 && sweep === 0) {\n      th_arc -= Tau;\n    }\n    const segs = Math.ceil(Math.abs(th_arc / (HalfPi + 1e-3)));\n    const result = [];\n    for (let i = 0; i < segs; ++i) {\n      const th2 = th0 + i * th_arc / segs;\n      const th3 = th0 + (i + 1) * th_arc / segs;\n      result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];\n    }\n    return segmentCache[key2] = result;\n  }\n  function bezier(params2) {\n    const key2 = join$1.call(params2);\n    if (bezierCache[key2]) {\n      return bezierCache[key2];\n    }\n    var cx = params2[0], cy = params2[1], th0 = params2[2], th1 = params2[3], rx = params2[4], ry = params2[5], sin_th = params2[6], cos_th = params2[7];\n    const a00 = cos_th * rx;\n    const a01 = -sin_th * ry;\n    const a10 = sin_th * rx;\n    const a11 = cos_th * ry;\n    const cos_th0 = Math.cos(th0);\n    const sin_th0 = Math.sin(th0);\n    const cos_th1 = Math.cos(th1);\n    const sin_th1 = Math.sin(th1);\n    const th_half = 0.5 * (th1 - th0);\n    const sin_th_h2 = Math.sin(th_half * 0.5);\n    const t = 8 / 3 * sin_th_h2 * sin_th_h2 / Math.sin(th_half);\n    const x12 = cx + cos_th0 - t * sin_th0;\n    const y12 = cy + sin_th0 + t * cos_th0;\n    const x3 = cx + cos_th1;\n    const y3 = cy + sin_th1;\n    const x2 = x3 + t * sin_th1;\n    const y2 = y3 - t * cos_th1;\n    return bezierCache[key2] = [a00 * x12 + a01 * y12, a10 * x12 + a11 * y12, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3];\n  }\n  const temp = [\"l\", 0, 0, 0, 0, 0, 0, 0];\n  function scale$1$1(current, sX, sY) {\n    const c2 = temp[0] = current[0];\n    if (c2 === \"a\" || c2 === \"A\") {\n      temp[1] = sX * current[1];\n      temp[2] = sY * current[2];\n      temp[3] = current[3];\n      temp[4] = current[4];\n      temp[5] = current[5];\n      temp[6] = sX * current[6];\n      temp[7] = sY * current[7];\n    } else if (c2 === \"h\" || c2 === \"H\") {\n      temp[1] = sX * current[1];\n    } else if (c2 === \"v\" || c2 === \"V\") {\n      temp[1] = sY * current[1];\n    } else {\n      for (var i = 1, n = current.length; i < n; ++i) {\n        temp[i] = (i % 2 == 1 ? sX : sY) * current[i];\n      }\n    }\n    return temp;\n  }\n  function pathRender(context2, path2, l, t, sX, sY) {\n    var current, previous = null, x2 = 0, y2 = 0, controlX = 0, controlY = 0, tempX, tempY, tempControlX, tempControlY, anchorX = 0, anchorY = 0;\n    if (l == null) l = 0;\n    if (t == null) t = 0;\n    if (sX == null) sX = 1;\n    if (sY == null) sY = sX;\n    if (context2.beginPath) context2.beginPath();\n    for (var i = 0, len2 = path2.length; i < len2; ++i) {\n      current = path2[i];\n      if (sX !== 1 || sY !== 1) {\n        current = scale$1$1(current, sX, sY);\n      }\n      switch (current[0]) {\n        // first letter\n        case \"l\":\n          x2 += current[1];\n          y2 += current[2];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"L\":\n          x2 = current[1];\n          y2 = current[2];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"h\":\n          x2 += current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"H\":\n          x2 = current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"v\":\n          y2 += current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"V\":\n          y2 = current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"m\":\n          x2 += current[1];\n          y2 += current[2];\n          anchorX = x2;\n          anchorY = y2;\n          context2.moveTo(x2 + l, y2 + t);\n          break;\n        case \"M\":\n          x2 = current[1];\n          y2 = current[2];\n          anchorX = x2;\n          anchorY = y2;\n          context2.moveTo(x2 + l, y2 + t);\n          break;\n        case \"c\":\n          tempX = x2 + current[5];\n          tempY = y2 + current[6];\n          controlX = x2 + current[3];\n          controlY = y2 + current[4];\n          context2.bezierCurveTo(\n            x2 + current[1] + l,\n            // x1\n            y2 + current[2] + t,\n            // y1\n            controlX + l,\n            // x2\n            controlY + t,\n            // y2\n            tempX + l,\n            tempY + t\n          );\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"C\":\n          x2 = current[5];\n          y2 = current[6];\n          controlX = current[3];\n          controlY = current[4];\n          context2.bezierCurveTo(current[1] + l, current[2] + t, controlX + l, controlY + t, x2 + l, y2 + t);\n          break;\n        case \"s\":\n          tempX = x2 + current[3];\n          tempY = y2 + current[4];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.bezierCurveTo(controlX + l, controlY + t, x2 + current[1] + l, y2 + current[2] + t, tempX + l, tempY + t);\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"S\":\n          tempX = current[3];\n          tempY = current[4];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.bezierCurveTo(controlX + l, controlY + t, current[1] + l, current[2] + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = current[1];\n          controlY = current[2];\n          break;\n        case \"q\":\n          tempX = x2 + current[3];\n          tempY = y2 + current[4];\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"Q\":\n          tempX = current[3];\n          tempY = current[4];\n          context2.quadraticCurveTo(current[1] + l, current[2] + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = current[1];\n          controlY = current[2];\n          break;\n        case \"t\":\n          tempX = x2 + current[1];\n          tempY = y2 + current[2];\n          if (previous[0].match(/[QqTt]/) === null) {\n            controlX = x2;\n            controlY = y2;\n          } else if (previous[0] === \"t\") {\n            controlX = 2 * x2 - tempControlX;\n            controlY = 2 * y2 - tempControlY;\n          } else if (previous[0] === \"q\") {\n            controlX = 2 * x2 - controlX;\n            controlY = 2 * y2 - controlY;\n          }\n          tempControlX = controlX;\n          tempControlY = controlY;\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          break;\n        case \"T\":\n          tempX = current[1];\n          tempY = current[2];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"a\":\n          drawArc(context2, x2 + l, y2 + t, [current[1], current[2], current[3], current[4], current[5], current[6] + x2 + l, current[7] + y2 + t]);\n          x2 += current[6];\n          y2 += current[7];\n          break;\n        case \"A\":\n          drawArc(context2, x2 + l, y2 + t, [current[1], current[2], current[3], current[4], current[5], current[6] + l, current[7] + t]);\n          x2 = current[6];\n          y2 = current[7];\n          break;\n        case \"z\":\n        case \"Z\":\n          x2 = anchorX;\n          y2 = anchorY;\n          context2.closePath();\n          break;\n      }\n      previous = current;\n    }\n  }\n  function drawArc(context2, x2, y2, coords) {\n    const seg = segments(\n      coords[5],\n      // end x\n      coords[6],\n      // end y\n      coords[0],\n      // radius x\n      coords[1],\n      // radius y\n      coords[3],\n      // large flag\n      coords[4],\n      // sweep flag\n      coords[2],\n      // rotation\n      x2,\n      y2\n    );\n    for (let i = 0; i < seg.length; ++i) {\n      const bez = bezier(seg[i]);\n      context2.bezierCurveTo(bez[0], bez[1], bez[2], bez[3], bez[4], bez[5]);\n    }\n  }\n  const Tan30 = 0.5773502691896257;\n  const builtins = {\n    \"circle\": {\n      draw: function(context2, size2) {\n        const r = Math.sqrt(size2) / 2;\n        context2.moveTo(r, 0);\n        context2.arc(0, 0, r, 0, Tau);\n      }\n    },\n    \"cross\": {\n      draw: function(context2, size2) {\n        var r = Math.sqrt(size2) / 2, s = r / 2.5;\n        context2.moveTo(-r, -s);\n        context2.lineTo(-r, s);\n        context2.lineTo(-s, s);\n        context2.lineTo(-s, r);\n        context2.lineTo(s, r);\n        context2.lineTo(s, s);\n        context2.lineTo(r, s);\n        context2.lineTo(r, -s);\n        context2.lineTo(s, -s);\n        context2.lineTo(s, -r);\n        context2.lineTo(-s, -r);\n        context2.lineTo(-s, -s);\n        context2.closePath();\n      }\n    },\n    \"diamond\": {\n      draw: function(context2, size2) {\n        const r = Math.sqrt(size2) / 2;\n        context2.moveTo(-r, 0);\n        context2.lineTo(0, -r);\n        context2.lineTo(r, 0);\n        context2.lineTo(0, r);\n        context2.closePath();\n      }\n    },\n    \"square\": {\n      draw: function(context2, size2) {\n        var w2 = Math.sqrt(size2), x2 = -w2 / 2;\n        context2.rect(x2, x2, w2, w2);\n      }\n    },\n    \"arrow\": {\n      draw: function(context2, size2) {\n        var r = Math.sqrt(size2) / 2, s = r / 7, t = r / 2.5, v = r / 8;\n        context2.moveTo(-s, r);\n        context2.lineTo(s, r);\n        context2.lineTo(s, -v);\n        context2.lineTo(t, -v);\n        context2.lineTo(0, -r);\n        context2.lineTo(-t, -v);\n        context2.lineTo(-s, -v);\n        context2.closePath();\n      }\n    },\n    \"wedge\": {\n      draw: function(context2, size2) {\n        var r = Math.sqrt(size2) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30, b2 = r / 4;\n        context2.moveTo(0, -h2 - o);\n        context2.lineTo(-b2, h2 - o);\n        context2.lineTo(b2, h2 - o);\n        context2.closePath();\n      }\n    },\n    \"triangle\": {\n      draw: function(context2, size2) {\n        var r = Math.sqrt(size2) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30;\n        context2.moveTo(0, -h2 - o);\n        context2.lineTo(-r, h2 - o);\n        context2.lineTo(r, h2 - o);\n        context2.closePath();\n      }\n    },\n    \"triangle-up\": {\n      draw: function(context2, size2) {\n        var r = Math.sqrt(size2) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(0, -h2);\n        context2.lineTo(-r, h2);\n        context2.lineTo(r, h2);\n        context2.closePath();\n      }\n    },\n    \"triangle-down\": {\n      draw: function(context2, size2) {\n        var r = Math.sqrt(size2) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(0, h2);\n        context2.lineTo(-r, -h2);\n        context2.lineTo(r, -h2);\n        context2.closePath();\n      }\n    },\n    \"triangle-right\": {\n      draw: function(context2, size2) {\n        var r = Math.sqrt(size2) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(h2, 0);\n        context2.lineTo(-h2, -r);\n        context2.lineTo(-h2, r);\n        context2.closePath();\n      }\n    },\n    \"triangle-left\": {\n      draw: function(context2, size2) {\n        var r = Math.sqrt(size2) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(-h2, 0);\n        context2.lineTo(h2, -r);\n        context2.lineTo(h2, r);\n        context2.closePath();\n      }\n    },\n    \"stroke\": {\n      draw: function(context2, size2) {\n        const r = Math.sqrt(size2) / 2;\n        context2.moveTo(-r, 0);\n        context2.lineTo(r, 0);\n      }\n    }\n  };\n  function symbols(_) {\n    return has$1(builtins, _) ? builtins[_] : customSymbol(_);\n  }\n  var custom = {};\n  function customSymbol(path2) {\n    if (!has$1(custom, path2)) {\n      const parsed = parse$3(path2);\n      custom[path2] = {\n        draw: function(context2, size2) {\n          pathRender(context2, parsed, 0, 0, Math.sqrt(size2) / 2);\n        }\n      };\n    }\n    return custom[path2];\n  }\n  const C = 0.448084975506;\n  function rectangleX(d) {\n    return d.x;\n  }\n  function rectangleY(d) {\n    return d.y;\n  }\n  function rectangleWidth(d) {\n    return d.width;\n  }\n  function rectangleHeight(d) {\n    return d.height;\n  }\n  function number$3(_) {\n    return typeof _ === \"function\" ? _ : () => +_;\n  }\n  function clamp(value2, min2, max2) {\n    return Math.max(min2, Math.min(value2, max2));\n  }\n  function vg_rect() {\n    var x2 = rectangleX, y2 = rectangleY, width2 = rectangleWidth, height2 = rectangleHeight, crTL = number$3(0), crTR = crTL, crBL = crTL, crBR = crTL, context2 = null;\n    function rectangle2(_, x02, y02) {\n      var buffer, x12 = x02 != null ? x02 : +x2.call(this, _), y12 = y02 != null ? y02 : +y2.call(this, _), w2 = +width2.call(this, _), h2 = +height2.call(this, _), s = Math.min(w2, h2) / 2, tl2 = clamp(+crTL.call(this, _), 0, s), tr2 = clamp(+crTR.call(this, _), 0, s), bl2 = clamp(+crBL.call(this, _), 0, s), br2 = clamp(+crBR.call(this, _), 0, s);\n      if (!context2) context2 = buffer = path$3();\n      if (tl2 <= 0 && tr2 <= 0 && bl2 <= 0 && br2 <= 0) {\n        context2.rect(x12, y12, w2, h2);\n      } else {\n        var x22 = x12 + w2, y22 = y12 + h2;\n        context2.moveTo(x12 + tl2, y12);\n        context2.lineTo(x22 - tr2, y12);\n        context2.bezierCurveTo(x22 - C * tr2, y12, x22, y12 + C * tr2, x22, y12 + tr2);\n        context2.lineTo(x22, y22 - br2);\n        context2.bezierCurveTo(x22, y22 - C * br2, x22 - C * br2, y22, x22 - br2, y22);\n        context2.lineTo(x12 + bl2, y22);\n        context2.bezierCurveTo(x12 + C * bl2, y22, x12, y22 - C * bl2, x12, y22 - bl2);\n        context2.lineTo(x12, y12 + tl2);\n        context2.bezierCurveTo(x12, y12 + C * tl2, x12 + C * tl2, y12, x12 + tl2, y12);\n        context2.closePath();\n      }\n      if (buffer) {\n        context2 = null;\n        return buffer + \"\" || null;\n      }\n    }\n    rectangle2.x = function(_) {\n      if (arguments.length) {\n        x2 = number$3(_);\n        return rectangle2;\n      } else {\n        return x2;\n      }\n    };\n    rectangle2.y = function(_) {\n      if (arguments.length) {\n        y2 = number$3(_);\n        return rectangle2;\n      } else {\n        return y2;\n      }\n    };\n    rectangle2.width = function(_) {\n      if (arguments.length) {\n        width2 = number$3(_);\n        return rectangle2;\n      } else {\n        return width2;\n      }\n    };\n    rectangle2.height = function(_) {\n      if (arguments.length) {\n        height2 = number$3(_);\n        return rectangle2;\n      } else {\n        return height2;\n      }\n    };\n    rectangle2.cornerRadius = function(tl2, tr2, br2, bl2) {\n      if (arguments.length) {\n        crTL = number$3(tl2);\n        crTR = tr2 != null ? number$3(tr2) : crTL;\n        crBR = br2 != null ? number$3(br2) : crTL;\n        crBL = bl2 != null ? number$3(bl2) : crTR;\n        return rectangle2;\n      } else {\n        return crTL;\n      }\n    };\n    rectangle2.context = function(_) {\n      if (arguments.length) {\n        context2 = _ == null ? null : _;\n        return rectangle2;\n      } else {\n        return context2;\n      }\n    };\n    return rectangle2;\n  }\n  function vg_trail() {\n    var x2, y2, size2, defined, context2 = null, ready, x12, y12, r1;\n    function point2(x22, y22, w2) {\n      const r2 = w2 / 2;\n      if (ready) {\n        var ux = y12 - y22, uy = x22 - x12;\n        if (ux || uy) {\n          var ud = Math.hypot(ux, uy), rx = (ux /= ud) * r1, ry = (uy /= ud) * r1, t = Math.atan2(uy, ux);\n          context2.moveTo(x12 - rx, y12 - ry);\n          context2.lineTo(x22 - ux * r2, y22 - uy * r2);\n          context2.arc(x22, y22, r2, t - Math.PI, t);\n          context2.lineTo(x12 + rx, y12 + ry);\n          context2.arc(x12, y12, r1, t, t + Math.PI);\n        } else {\n          context2.arc(x22, y22, r2, 0, Tau);\n        }\n        context2.closePath();\n      } else {\n        ready = 1;\n      }\n      x12 = x22;\n      y12 = y22;\n      r1 = r2;\n    }\n    function trail2(data2) {\n      var i, n = data2.length, d, defined0 = false, buffer;\n      if (context2 == null) context2 = buffer = path$3();\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) ready = 0;\n        }\n        if (defined0) point2(+x2(d, i, data2), +y2(d, i, data2), +size2(d, i, data2));\n      }\n      if (buffer) {\n        context2 = null;\n        return buffer + \"\" || null;\n      }\n    }\n    trail2.x = function(_) {\n      if (arguments.length) {\n        x2 = _;\n        return trail2;\n      } else {\n        return x2;\n      }\n    };\n    trail2.y = function(_) {\n      if (arguments.length) {\n        y2 = _;\n        return trail2;\n      } else {\n        return y2;\n      }\n    };\n    trail2.size = function(_) {\n      if (arguments.length) {\n        size2 = _;\n        return trail2;\n      } else {\n        return size2;\n      }\n    };\n    trail2.defined = function(_) {\n      if (arguments.length) {\n        defined = _;\n        return trail2;\n      } else {\n        return defined;\n      }\n    };\n    trail2.context = function(_) {\n      if (arguments.length) {\n        if (_ == null) {\n          context2 = null;\n        } else {\n          context2 = _;\n        }\n        return trail2;\n      } else {\n        return context2;\n      }\n    };\n    return trail2;\n  }\n  function value$1(a2, b2) {\n    return a2 != null ? a2 : b2;\n  }\n  const x$2 = (item) => item.x || 0, y$2 = (item) => item.y || 0, w = (item) => item.width || 0, h = (item) => item.height || 0, xw = (item) => (item.x || 0) + (item.width || 0), yh = (item) => (item.y || 0) + (item.height || 0), sa = (item) => item.startAngle || 0, ea = (item) => item.endAngle || 0, pa = (item) => item.padAngle || 0, ir = (item) => item.innerRadius || 0, or = (item) => item.outerRadius || 0, cr = (item) => item.cornerRadius || 0, tl = (item) => value$1(item.cornerRadiusTopLeft, item.cornerRadius) || 0, tr = (item) => value$1(item.cornerRadiusTopRight, item.cornerRadius) || 0, br = (item) => value$1(item.cornerRadiusBottomRight, item.cornerRadius) || 0, bl = (item) => value$1(item.cornerRadiusBottomLeft, item.cornerRadius) || 0, sz = (item) => value$1(item.size, 64), ts = (item) => item.size || 1, def = (item) => !(item.defined === false), type = (item) => symbols(item.shape || \"circle\");\n  const arcShape = arc$2$1().startAngle(sa).endAngle(ea).padAngle(pa).innerRadius(ir).outerRadius(or).cornerRadius(cr), areavShape = area$2$1().x(x$2).y1(y$2).y0(yh).defined(def), areahShape = area$2$1().y(y$2).x1(x$2).x0(xw).defined(def), lineShape = line$2$1().x(x$2).y(y$2).defined(def), rectShape = vg_rect().x(x$2).y(y$2).width(w).height(h).cornerRadius(tl, tr, br, bl), symbolShape = Symbol$1().type(type).size(sz), trailShape = vg_trail().x(x$2).y(y$2).defined(def).size(ts);\n  function hasCornerRadius(item) {\n    return item.cornerRadius || item.cornerRadiusTopLeft || item.cornerRadiusTopRight || item.cornerRadiusBottomRight || item.cornerRadiusBottomLeft;\n  }\n  function arc$1(context2, item) {\n    return arcShape.context(context2)(item);\n  }\n  function area$1(context2, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return (item.orient === \"horizontal\" ? areahShape : areavShape).curve(curves(interp, item.orient, item.tension)).context(context2)(items);\n  }\n  function line$1(context2, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return lineShape.curve(curves(interp, item.orient, item.tension)).context(context2)(items);\n  }\n  function rectangle(context2, item, x2, y2) {\n    return rectShape.context(context2)(item, x2, y2);\n  }\n  function shape$1(context2, item) {\n    return (item.mark.shape || item.shape).context(context2)(item);\n  }\n  function symbol$1(context2, item) {\n    return symbolShape.context(context2)(item);\n  }\n  function trail$1(context2, items) {\n    return trailShape.context(context2)(items);\n  }\n  var clip_id = 1;\n  function resetSVGClipId() {\n    clip_id = 1;\n  }\n  function clip$1$1(renderer, item, size2) {\n    var clip2 = item.clip, defs = renderer._defs, id2 = item.clip_id || (item.clip_id = \"clip\" + clip_id++), c2 = defs.clipping[id2] || (defs.clipping[id2] = {\n      id: id2\n    });\n    if (isFunction(clip2)) {\n      c2.path = clip2(null);\n    } else if (hasCornerRadius(size2)) {\n      c2.path = rectangle(null, size2, 0, 0);\n    } else {\n      c2.width = size2.width || 0;\n      c2.height = size2.height || 0;\n    }\n    return \"url(#\" + id2 + \")\";\n  }\n  function Bounds(b2) {\n    this.clear();\n    if (b2) this.union(b2);\n  }\n  Bounds.prototype = {\n    clone() {\n      return new Bounds(this);\n    },\n    clear() {\n      this.x1 = +Number.MAX_VALUE;\n      this.y1 = +Number.MAX_VALUE;\n      this.x2 = -Number.MAX_VALUE;\n      this.y2 = -Number.MAX_VALUE;\n      return this;\n    },\n    empty() {\n      return this.x1 === +Number.MAX_VALUE && this.y1 === +Number.MAX_VALUE && this.x2 === -Number.MAX_VALUE && this.y2 === -Number.MAX_VALUE;\n    },\n    equals(b2) {\n      return this.x1 === b2.x1 && this.y1 === b2.y1 && this.x2 === b2.x2 && this.y2 === b2.y2;\n    },\n    set(x12, y12, x2, y2) {\n      if (x2 < x12) {\n        this.x2 = x12;\n        this.x1 = x2;\n      } else {\n        this.x1 = x12;\n        this.x2 = x2;\n      }\n      if (y2 < y12) {\n        this.y2 = y12;\n        this.y1 = y2;\n      } else {\n        this.y1 = y12;\n        this.y2 = y2;\n      }\n      return this;\n    },\n    add(x2, y2) {\n      if (x2 < this.x1) this.x1 = x2;\n      if (y2 < this.y1) this.y1 = y2;\n      if (x2 > this.x2) this.x2 = x2;\n      if (y2 > this.y2) this.y2 = y2;\n      return this;\n    },\n    expand(d) {\n      this.x1 -= d;\n      this.y1 -= d;\n      this.x2 += d;\n      this.y2 += d;\n      return this;\n    },\n    round() {\n      this.x1 = Math.floor(this.x1);\n      this.y1 = Math.floor(this.y1);\n      this.x2 = Math.ceil(this.x2);\n      this.y2 = Math.ceil(this.y2);\n      return this;\n    },\n    scale(s) {\n      this.x1 *= s;\n      this.y1 *= s;\n      this.x2 *= s;\n      this.y2 *= s;\n      return this;\n    },\n    translate(dx, dy) {\n      this.x1 += dx;\n      this.x2 += dx;\n      this.y1 += dy;\n      this.y2 += dy;\n      return this;\n    },\n    rotate(angle2, x2, y2) {\n      const p = this.rotatedPoints(angle2, x2, y2);\n      return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n    },\n    rotatedPoints(angle2, x2, y2) {\n      var {\n        x1: x12,\n        y1: y12,\n        x2: x22,\n        y2: y22\n      } = this, cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), cx = x2 - x2 * cos2 + y2 * sin2, cy = y2 - x2 * sin2 - y2 * cos2;\n      return [cos2 * x12 - sin2 * y12 + cx, sin2 * x12 + cos2 * y12 + cy, cos2 * x12 - sin2 * y22 + cx, sin2 * x12 + cos2 * y22 + cy, cos2 * x22 - sin2 * y12 + cx, sin2 * x22 + cos2 * y12 + cy, cos2 * x22 - sin2 * y22 + cx, sin2 * x22 + cos2 * y22 + cy];\n    },\n    union(b2) {\n      if (b2.x1 < this.x1) this.x1 = b2.x1;\n      if (b2.y1 < this.y1) this.y1 = b2.y1;\n      if (b2.x2 > this.x2) this.x2 = b2.x2;\n      if (b2.y2 > this.y2) this.y2 = b2.y2;\n      return this;\n    },\n    intersect(b2) {\n      if (b2.x1 > this.x1) this.x1 = b2.x1;\n      if (b2.y1 > this.y1) this.y1 = b2.y1;\n      if (b2.x2 < this.x2) this.x2 = b2.x2;\n      if (b2.y2 < this.y2) this.y2 = b2.y2;\n      return this;\n    },\n    encloses(b2) {\n      return b2 && this.x1 <= b2.x1 && this.x2 >= b2.x2 && this.y1 <= b2.y1 && this.y2 >= b2.y2;\n    },\n    alignsWith(b2) {\n      return b2 && (this.x1 == b2.x1 || this.x2 == b2.x2 || this.y1 == b2.y1 || this.y2 == b2.y2);\n    },\n    intersects(b2) {\n      return b2 && !(this.x2 < b2.x1 || this.x1 > b2.x2 || this.y2 < b2.y1 || this.y1 > b2.y2);\n    },\n    contains(x2, y2) {\n      return !(x2 < this.x1 || x2 > this.x2 || y2 < this.y1 || y2 > this.y2);\n    },\n    width() {\n      return this.x2 - this.x1;\n    },\n    height() {\n      return this.y2 - this.y1;\n    }\n  };\n  function Item(mark) {\n    this.mark = mark;\n    this.bounds = this.bounds || new Bounds();\n  }\n  function GroupItem(mark) {\n    Item.call(this, mark);\n    this.items = this.items || [];\n  }\n  inherits(GroupItem, Item);\n  class ResourceLoader {\n    constructor(customLoader) {\n      this._pending = 0;\n      this._loader = customLoader || loader();\n    }\n    pending() {\n      return this._pending;\n    }\n    sanitizeURL(uri) {\n      const loader2 = this;\n      increment$1(loader2);\n      return loader2._loader.sanitize(uri, {\n        context: \"href\"\n      }).then((opt) => {\n        decrement(loader2);\n        return opt;\n      }).catch(() => {\n        decrement(loader2);\n        return null;\n      });\n    }\n    loadImage(uri) {\n      const loader2 = this, Image2 = domImage();\n      increment$1(loader2);\n      return loader2._loader.sanitize(uri, {\n        context: \"image\"\n      }).then((opt) => {\n        const url = opt.href;\n        if (!url || !Image2) throw {\n          url\n        };\n        const img = new Image2();\n        const cors = has$1(opt, \"crossOrigin\") ? opt.crossOrigin : \"anonymous\";\n        if (cors != null) img.crossOrigin = cors;\n        img.onload = () => decrement(loader2);\n        img.onerror = () => decrement(loader2);\n        img.src = url;\n        return img;\n      }).catch((e) => {\n        decrement(loader2);\n        return {\n          complete: false,\n          width: 0,\n          height: 0,\n          src: e && e.url || \"\"\n        };\n      });\n    }\n    ready() {\n      const loader2 = this;\n      return new Promise((accept) => {\n        function poll(value2) {\n          if (!loader2.pending()) accept(value2);\n          else setTimeout(() => {\n            poll(true);\n          }, 10);\n        }\n        poll(false);\n      });\n    }\n  }\n  function increment$1(loader2) {\n    loader2._pending += 1;\n  }\n  function decrement(loader2) {\n    loader2._pending -= 1;\n  }\n  function boundStroke(bounds2, item, miter) {\n    if (item.stroke && item.opacity !== 0 && item.strokeOpacity !== 0) {\n      const sw = item.strokeWidth != null ? +item.strokeWidth : 1;\n      bounds2.expand(sw + (miter ? miterAdjustment(item, sw) : 0));\n    }\n    return bounds2;\n  }\n  function miterAdjustment(item, strokeWidth) {\n    return item.strokeJoin && item.strokeJoin !== \"miter\" ? 0 : strokeWidth;\n  }\n  const circleThreshold = Tau - 1e-8;\n  let bounds, lx, ly, rot, ma, mb, mc, md;\n  const add$2 = (x2, y2) => bounds.add(x2, y2);\n  const addL = (x2, y2) => add$2(lx = x2, ly = y2);\n  const addX = (x2) => add$2(x2, bounds.y1);\n  const addY = (y2) => add$2(bounds.x1, y2);\n  const px = (x2, y2) => ma * x2 + mc * y2;\n  const py = (x2, y2) => mb * x2 + md * y2;\n  const addp = (x2, y2) => add$2(px(x2, y2), py(x2, y2));\n  const addpL = (x2, y2) => addL(px(x2, y2), py(x2, y2));\n  function boundContext(_, deg) {\n    bounds = _;\n    if (deg) {\n      rot = deg * DegToRad;\n      ma = md = Math.cos(rot);\n      mb = Math.sin(rot);\n      mc = -mb;\n    } else {\n      ma = md = 1;\n      rot = mb = mc = 0;\n    }\n    return context$1;\n  }\n  const context$1 = {\n    beginPath() {\n    },\n    closePath() {\n    },\n    moveTo: addpL,\n    lineTo: addpL,\n    rect(x2, y2, w2, h2) {\n      if (rot) {\n        addp(x2 + w2, y2);\n        addp(x2 + w2, y2 + h2);\n        addp(x2, y2 + h2);\n        addpL(x2, y2);\n      } else {\n        add$2(x2 + w2, y2 + h2);\n        addL(x2, y2);\n      }\n    },\n    quadraticCurveTo(x12, y12, x2, y2) {\n      const px1 = px(x12, y12), py1 = py(x12, y12), px2 = px(x2, y2), py2 = py(x2, y2);\n      quadExtrema(lx, px1, px2, addX);\n      quadExtrema(ly, py1, py2, addY);\n      addL(px2, py2);\n    },\n    bezierCurveTo(x12, y12, x2, y2, x3, y3) {\n      const px1 = px(x12, y12), py1 = py(x12, y12), px2 = px(x2, y2), py2 = py(x2, y2), px3 = px(x3, y3), py3 = py(x3, y3);\n      cubicExtrema(lx, px1, px2, px3, addX);\n      cubicExtrema(ly, py1, py2, py3, addY);\n      addL(px3, py3);\n    },\n    arc(cx, cy, r, sa2, ea2, ccw) {\n      sa2 += rot;\n      ea2 += rot;\n      lx = r * Math.cos(ea2) + cx;\n      ly = r * Math.sin(ea2) + cy;\n      if (Math.abs(ea2 - sa2) > circleThreshold) {\n        add$2(cx - r, cy - r);\n        add$2(cx + r, cy + r);\n      } else {\n        const update2 = (a2) => add$2(r * Math.cos(a2) + cx, r * Math.sin(a2) + cy);\n        let s, i;\n        update2(sa2);\n        update2(ea2);\n        if (ea2 !== sa2) {\n          sa2 = sa2 % Tau;\n          if (sa2 < 0) sa2 += Tau;\n          ea2 = ea2 % Tau;\n          if (ea2 < 0) ea2 += Tau;\n          if (ea2 < sa2) {\n            ccw = !ccw;\n            s = sa2;\n            sa2 = ea2;\n            ea2 = s;\n          }\n          if (ccw) {\n            ea2 -= Tau;\n            s = sa2 - sa2 % HalfPi;\n            for (i = 0; i < 4 && s > ea2; ++i, s -= HalfPi) update2(s);\n          } else {\n            s = sa2 - sa2 % HalfPi + HalfPi;\n            for (i = 0; i < 4 && s < ea2; ++i, s = s + HalfPi) update2(s);\n          }\n        }\n      }\n    }\n  };\n  function quadExtrema(x02, x12, x2, cb) {\n    const t = (x02 - x12) / (x02 + x2 - 2 * x12);\n    if (0 < t && t < 1) cb(x02 + (x12 - x02) * t);\n  }\n  function cubicExtrema(x02, x12, x2, x3, cb) {\n    const a2 = x3 - x02 + 3 * x12 - 3 * x2, b2 = x02 + x2 - 2 * x12, c2 = x02 - x12;\n    let t02 = 0, t12 = 0, r;\n    if (Math.abs(a2) > Epsilon) {\n      r = b2 * b2 + c2 * a2;\n      if (r >= 0) {\n        r = Math.sqrt(r);\n        t02 = (-b2 + r) / a2;\n        t12 = (-b2 - r) / a2;\n      }\n    } else {\n      t02 = 0.5 * c2 / b2;\n    }\n    if (0 < t02 && t02 < 1) cb(cubic(t02, x02, x12, x2, x3));\n    if (0 < t12 && t12 < 1) cb(cubic(t12, x02, x12, x2, x3));\n  }\n  function cubic(t, x02, x12, x2, x3) {\n    const s = 1 - t, s2 = s * s, t22 = t * t;\n    return s2 * s * x02 + 3 * s2 * t * x12 + 3 * s * t22 * x2 + t22 * t * x3;\n  }\n  var context$2 = (context$2 = domCanvas(1, 1)) ? context$2.getContext(\"2d\") : null;\n  const b = new Bounds();\n  function intersectPath(draw2) {\n    return function(item, brush) {\n      if (!context$2) return true;\n      draw2(context$2, item);\n      b.clear().union(item.bounds).intersect(brush).round();\n      const {\n        x1: x12,\n        y1: y12,\n        x2,\n        y2\n      } = b;\n      for (let y3 = y12; y3 <= y2; ++y3) {\n        for (let x3 = x12; x3 <= x2; ++x3) {\n          if (context$2.isPointInPath(x3, y3)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n  }\n  function intersectPoint(item, box2) {\n    return box2.contains(item.x || 0, item.y || 0);\n  }\n  function intersectRect(item, box2) {\n    const x2 = item.x || 0, y2 = item.y || 0, w2 = item.width || 0, h2 = item.height || 0;\n    return box2.intersects(b.set(x2, y2, x2 + w2, y2 + h2));\n  }\n  function intersectRule(item, box2) {\n    const x2 = item.x || 0, y2 = item.y || 0, x22 = item.x2 != null ? item.x2 : x2, y22 = item.y2 != null ? item.y2 : y2;\n    return intersectBoxLine(box2, x2, y2, x22, y22);\n  }\n  function intersectBoxLine(box2, x2, y2, u2, v) {\n    const {\n      x1: x12,\n      y1: y12,\n      x2: x22,\n      y2: y22\n    } = box2, dx = u2 - x2, dy = v - y2;\n    let t02 = 0, t12 = 1, p, q, r, e;\n    for (e = 0; e < 4; ++e) {\n      if (e === 0) {\n        p = -dx;\n        q = -(x12 - x2);\n      }\n      if (e === 1) {\n        p = dx;\n        q = x22 - x2;\n      }\n      if (e === 2) {\n        p = -dy;\n        q = -(y12 - y2);\n      }\n      if (e === 3) {\n        p = dy;\n        q = y22 - y2;\n      }\n      if (Math.abs(p) < 1e-10 && q < 0) return false;\n      r = q / p;\n      if (p < 0) {\n        if (r > t12) return false;\n        else if (r > t02) t02 = r;\n      } else if (p > 0) {\n        if (r < t02) return false;\n        else if (r < t12) t12 = r;\n      }\n    }\n    return true;\n  }\n  function blend(context2, item) {\n    context2.globalCompositeOperation = item.blend || \"source-over\";\n  }\n  function value$2(value2, dflt) {\n    return value2 == null ? dflt : value2;\n  }\n  function addStops(gradient2, stops) {\n    const n = stops.length;\n    for (let i = 0; i < n; ++i) {\n      gradient2.addColorStop(stops[i].offset, stops[i].color);\n    }\n    return gradient2;\n  }\n  function gradient$1(context2, spec, bounds2) {\n    const w2 = bounds2.width(), h2 = bounds2.height();\n    let gradient2;\n    if (spec.gradient === \"radial\") {\n      gradient2 = context2.createRadialGradient(bounds2.x1 + value$2(spec.x1, 0.5) * w2, bounds2.y1 + value$2(spec.y1, 0.5) * h2, Math.max(w2, h2) * value$2(spec.r1, 0), bounds2.x1 + value$2(spec.x2, 0.5) * w2, bounds2.y1 + value$2(spec.y2, 0.5) * h2, Math.max(w2, h2) * value$2(spec.r2, 0.5));\n    } else {\n      const x12 = value$2(spec.x1, 0), y12 = value$2(spec.y1, 0), x2 = value$2(spec.x2, 1), y2 = value$2(spec.y2, 0);\n      if (x12 === x2 || y12 === y2 || w2 === h2) {\n        gradient2 = context2.createLinearGradient(bounds2.x1 + x12 * w2, bounds2.y1 + y12 * h2, bounds2.x1 + x2 * w2, bounds2.y1 + y2 * h2);\n      } else {\n        const image2 = domCanvas(Math.ceil(w2), Math.ceil(h2)), ictx = image2.getContext(\"2d\");\n        ictx.scale(w2, h2);\n        ictx.fillStyle = addStops(ictx.createLinearGradient(x12, y12, x2, y2), spec.stops);\n        ictx.fillRect(0, 0, w2, h2);\n        return context2.createPattern(image2, \"no-repeat\");\n      }\n    }\n    return addStops(gradient2, spec.stops);\n  }\n  function color$1(context2, item, value2) {\n    return isGradient(value2) ? gradient$1(context2, value2, item.bounds) : value2;\n  }\n  function fill$1(context2, item, opacity2) {\n    opacity2 *= item.fillOpacity == null ? 1 : item.fillOpacity;\n    if (opacity2 > 0) {\n      context2.globalAlpha = opacity2;\n      context2.fillStyle = color$1(context2, item, item.fill);\n      return true;\n    } else {\n      return false;\n    }\n  }\n  var Empty = [];\n  function stroke(context2, item, opacity2) {\n    var lw = (lw = item.strokeWidth) != null ? lw : 1;\n    if (lw <= 0) return false;\n    opacity2 *= item.strokeOpacity == null ? 1 : item.strokeOpacity;\n    if (opacity2 > 0) {\n      context2.globalAlpha = opacity2;\n      context2.strokeStyle = color$1(context2, item, item.stroke);\n      context2.lineWidth = lw;\n      context2.lineCap = item.strokeCap || \"butt\";\n      context2.lineJoin = item.strokeJoin || \"miter\";\n      context2.miterLimit = item.strokeMiterLimit || 10;\n      if (context2.setLineDash) {\n        context2.setLineDash(item.strokeDash || Empty);\n        context2.lineDashOffset = item.strokeDashOffset || 0;\n      }\n      return true;\n    } else {\n      return false;\n    }\n  }\n  function compare$1(a2, b2) {\n    return a2.zindex - b2.zindex || a2.index - b2.index;\n  }\n  function zorder(scene) {\n    if (!scene.zdirty) return scene.zitems;\n    var items = scene.items, output2 = [], item, i, n;\n    for (i = 0, n = items.length; i < n; ++i) {\n      item = items[i];\n      item.index = i;\n      if (item.zindex) output2.push(item);\n    }\n    scene.zdirty = false;\n    return scene.zitems = output2.sort(compare$1);\n  }\n  function visit(scene, visitor) {\n    var items = scene.items, i, n;\n    if (!items || !items.length) return;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        if (!items[i].zindex) visitor(items[i]);\n      }\n      items = zitems;\n    }\n    for (i = 0, n = items.length; i < n; ++i) {\n      visitor(items[i]);\n    }\n  }\n  function pickVisit(scene, visitor) {\n    var items = scene.items, hit2, i;\n    if (!items || !items.length) return null;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) items = zitems;\n    for (i = items.length; --i >= 0; ) {\n      if (hit2 = visitor(items[i])) return hit2;\n    }\n    if (items === zitems) {\n      for (items = scene.items, i = items.length; --i >= 0; ) {\n        if (!items[i].zindex) {\n          if (hit2 = visitor(items[i])) return hit2;\n        }\n      }\n    }\n    return null;\n  }\n  function drawAll(path2) {\n    return function(context2, scene, bounds2) {\n      visit(scene, (item) => {\n        if (!bounds2 || bounds2.intersects(item.bounds)) {\n          drawPath(path2, context2, item, item);\n        }\n      });\n    };\n  }\n  function drawOne(path2) {\n    return function(context2, scene, bounds2) {\n      if (scene.items.length && (!bounds2 || bounds2.intersects(scene.bounds))) {\n        drawPath(path2, context2, scene.items[0], scene.items);\n      }\n    };\n  }\n  function drawPath(path2, context2, item, items) {\n    var opacity2 = item.opacity == null ? 1 : item.opacity;\n    if (opacity2 === 0) return;\n    if (path2(context2, items)) return;\n    blend(context2, item);\n    if (item.fill && fill$1(context2, item, opacity2)) {\n      context2.fill();\n    }\n    if (item.stroke && stroke(context2, item, opacity2)) {\n      context2.stroke();\n    }\n  }\n  function pick$1(test2) {\n    test2 = test2 || truthy;\n    return function(context2, scene, x2, y2, gx, gy) {\n      x2 *= context2.pixelRatio;\n      y2 *= context2.pixelRatio;\n      return pickVisit(scene, (item) => {\n        const b2 = item.bounds;\n        if (b2 && !b2.contains(gx, gy) || !b2) return;\n        if (test2(context2, item, x2, y2, gx, gy)) return item;\n      });\n    };\n  }\n  function hitPath(path2, filled) {\n    return function(context2, o, x2, y2) {\n      var item = Array.isArray(o) ? o[0] : o, fill2 = filled == null ? item.fill : filled, stroke2 = item.stroke && context2.isPointInStroke, lw, lc;\n      if (stroke2) {\n        lw = item.strokeWidth;\n        lc = item.strokeCap;\n        context2.lineWidth = lw != null ? lw : 1;\n        context2.lineCap = lc != null ? lc : \"butt\";\n      }\n      return path2(context2, o) ? false : fill2 && context2.isPointInPath(x2, y2) || stroke2 && context2.isPointInStroke(x2, y2);\n    };\n  }\n  function pickPath(path2) {\n    return pick$1(hitPath(path2));\n  }\n  function translate$2(x2, y2) {\n    return \"translate(\" + x2 + \",\" + y2 + \")\";\n  }\n  function rotate(a2) {\n    return \"rotate(\" + a2 + \")\";\n  }\n  function scale$5(scaleX, scaleY2) {\n    return \"scale(\" + scaleX + \",\" + scaleY2 + \")\";\n  }\n  function translateItem(item) {\n    return translate$2(item.x || 0, item.y || 0);\n  }\n  function rotateItem(item) {\n    return translate$2(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\");\n  }\n  function transformItem(item) {\n    return translate$2(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\") + (item.scaleX || item.scaleY ? \" \" + scale$5(item.scaleX || 1, item.scaleY || 1) : \"\");\n  }\n  function markItemPath(type2, shape2, isect) {\n    function attr2(emit2, item) {\n      emit2(\"transform\", rotateItem(item));\n      emit2(\"d\", shape2(null, item));\n    }\n    function bound2(bounds2, item) {\n      shape2(boundContext(bounds2, item.angle), item);\n      return boundStroke(bounds2, item).translate(item.x || 0, item.y || 0);\n    }\n    function draw2(context2, item) {\n      var x2 = item.x || 0, y2 = item.y || 0, a2 = item.angle || 0;\n      context2.translate(x2, y2);\n      if (a2) context2.rotate(a2 *= DegToRad);\n      context2.beginPath();\n      shape2(context2, item);\n      if (a2) context2.rotate(-a2);\n      context2.translate(-x2, -y2);\n    }\n    return {\n      type: type2,\n      tag: \"path\",\n      nested: false,\n      attr: attr2,\n      bound: bound2,\n      draw: drawAll(draw2),\n      pick: pickPath(draw2),\n      isect: isect || intersectPath(draw2)\n    };\n  }\n  var arc$2 = markItemPath(\"arc\", arc$1);\n  function pickArea(a2, p) {\n    var v = a2[0].orient === \"horizontal\" ? p[1] : p[0], z = a2[0].orient === \"horizontal\" ? \"y\" : \"x\", i = a2.length, min2 = Infinity, hit2, d;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      d = Math.abs(a2[i][z] - v);\n      if (d < min2) {\n        min2 = d;\n        hit2 = a2[i];\n      }\n    }\n    return hit2;\n  }\n  function pickLine(a2, p) {\n    var t = Math.pow(a2[0].strokeWidth || 1, 2), i = a2.length, dx, dy, dd;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      dx = a2[i].x - p[0];\n      dy = a2[i].y - p[1];\n      dd = dx * dx + dy * dy;\n      if (dd < t) return a2[i];\n    }\n    return null;\n  }\n  function pickTrail(a2, p) {\n    var i = a2.length, dx, dy, dd;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      dx = a2[i].x - p[0];\n      dy = a2[i].y - p[1];\n      dd = dx * dx + dy * dy;\n      dx = a2[i].size || 1;\n      if (dd < dx * dx) return a2[i];\n    }\n    return null;\n  }\n  function markMultiItemPath(type2, shape2, tip) {\n    function attr2(emit2, item) {\n      var items = item.mark.items;\n      if (items.length) emit2(\"d\", shape2(null, items));\n    }\n    function bound2(bounds2, mark) {\n      var items = mark.items;\n      if (items.length === 0) {\n        return bounds2;\n      } else {\n        shape2(boundContext(bounds2), items);\n        return boundStroke(bounds2, items[0]);\n      }\n    }\n    function draw2(context2, items) {\n      context2.beginPath();\n      shape2(context2, items);\n    }\n    const hit2 = hitPath(draw2);\n    function pick2(context2, scene, x2, y2, gx, gy) {\n      var items = scene.items, b2 = scene.bounds;\n      if (!items || !items.length || b2 && !b2.contains(gx, gy)) {\n        return null;\n      }\n      x2 *= context2.pixelRatio;\n      y2 *= context2.pixelRatio;\n      return hit2(context2, items, x2, y2) ? items[0] : null;\n    }\n    return {\n      type: type2,\n      tag: \"path\",\n      nested: true,\n      attr: attr2,\n      bound: bound2,\n      draw: drawOne(draw2),\n      pick: pick2,\n      isect: intersectPoint,\n      tip\n    };\n  }\n  var area$2 = markMultiItemPath(\"area\", area$1, pickArea);\n  function clip$2(context2, scene) {\n    var clip2 = scene.clip;\n    context2.save();\n    if (isFunction(clip2)) {\n      context2.beginPath();\n      clip2(context2);\n      context2.clip();\n    } else {\n      clipGroup(context2, scene.group);\n    }\n  }\n  function clipGroup(context2, group2) {\n    context2.beginPath();\n    hasCornerRadius(group2) ? rectangle(context2, group2, 0, 0) : context2.rect(0, 0, group2.width || 0, group2.height || 0);\n    context2.clip();\n  }\n  function offset$1(item) {\n    const sw = value$2(item.strokeWidth, 1);\n    return item.strokeOffset != null ? item.strokeOffset : item.stroke && sw > 0.5 && sw < 1.5 ? 0.5 - Math.abs(sw - 1) : 0;\n  }\n  function attr$5(emit2, item) {\n    emit2(\"transform\", translateItem(item));\n  }\n  function emitRectangle(emit2, item) {\n    const off = offset$1(item);\n    emit2(\"d\", rectangle(null, item, off, off));\n  }\n  function background$1(emit2, item) {\n    emit2(\"class\", \"background\");\n    emit2(\"aria-hidden\", true);\n    emitRectangle(emit2, item);\n  }\n  function foreground(emit2, item) {\n    emit2(\"class\", \"foreground\");\n    emit2(\"aria-hidden\", true);\n    if (item.strokeForeground) {\n      emitRectangle(emit2, item);\n    } else {\n      emit2(\"d\", \"\");\n    }\n  }\n  function content(emit2, item, renderer) {\n    const url = item.clip ? clip$1$1(renderer, item, item) : null;\n    emit2(\"clip-path\", url);\n  }\n  function bound$5(bounds2, group2) {\n    if (!group2.clip && group2.items) {\n      const items = group2.items, m2 = items.length;\n      for (let j = 0; j < m2; ++j) {\n        bounds2.union(items[j].bounds);\n      }\n    }\n    if ((group2.clip || group2.width || group2.height) && !group2.noBound) {\n      bounds2.add(0, 0).add(group2.width || 0, group2.height || 0);\n    }\n    boundStroke(bounds2, group2);\n    return bounds2.translate(group2.x || 0, group2.y || 0);\n  }\n  function rectanglePath(context2, group2, x2, y2) {\n    const off = offset$1(group2);\n    context2.beginPath();\n    rectangle(context2, group2, (x2 || 0) + off, (y2 || 0) + off);\n  }\n  const hitBackground = hitPath(rectanglePath);\n  const hitForeground = hitPath(rectanglePath, false);\n  const hitCorner = hitPath(rectanglePath, true);\n  function draw$4(context2, scene, bounds2, markTypes) {\n    visit(scene, (group2) => {\n      const gx = group2.x || 0, gy = group2.y || 0, fore = group2.strokeForeground, opacity2 = group2.opacity == null ? 1 : group2.opacity;\n      if ((group2.stroke || group2.fill) && opacity2) {\n        rectanglePath(context2, group2, gx, gy);\n        blend(context2, group2);\n        if (group2.fill && fill$1(context2, group2, opacity2)) {\n          context2.fill();\n        }\n        if (group2.stroke && !fore && stroke(context2, group2, opacity2)) {\n          context2.stroke();\n        }\n      }\n      context2.save();\n      context2.translate(gx, gy);\n      if (group2.clip) clipGroup(context2, group2);\n      if (bounds2) bounds2.translate(-gx, -gy);\n      visit(group2, (item) => {\n        if (item.marktype === \"group\" || markTypes == null || markTypes.includes(item.marktype)) {\n          this.draw(context2, item, bounds2, markTypes);\n        }\n      });\n      if (bounds2) bounds2.translate(gx, gy);\n      context2.restore();\n      if (fore && group2.stroke && opacity2) {\n        rectanglePath(context2, group2, gx, gy);\n        blend(context2, group2);\n        if (stroke(context2, group2, opacity2)) {\n          context2.stroke();\n        }\n      }\n    });\n  }\n  function pick(context2, scene, x2, y2, gx, gy) {\n    if (scene.bounds && !scene.bounds.contains(gx, gy) || !scene.items) {\n      return null;\n    }\n    const cx = x2 * context2.pixelRatio, cy = y2 * context2.pixelRatio;\n    return pickVisit(scene, (group2) => {\n      let hit2, dx, dy;\n      const b2 = group2.bounds;\n      if (b2 && !b2.contains(gx, gy)) return;\n      dx = group2.x || 0;\n      dy = group2.y || 0;\n      const dw = dx + (group2.width || 0), dh = dy + (group2.height || 0), c2 = group2.clip;\n      if (c2 && (gx < dx || gx > dw || gy < dy || gy > dh)) return;\n      context2.save();\n      context2.translate(dx, dy);\n      dx = gx - dx;\n      dy = gy - dy;\n      if (c2 && hasCornerRadius(group2) && !hitCorner(context2, group2, cx, cy)) {\n        context2.restore();\n        return null;\n      }\n      const fore = group2.strokeForeground, ix = scene.interactive !== false;\n      if (ix && fore && group2.stroke && hitForeground(context2, group2, cx, cy)) {\n        context2.restore();\n        return group2;\n      }\n      hit2 = pickVisit(group2, (mark) => pickMark(mark, dx, dy) ? this.pick(mark, x2, y2, dx, dy) : null);\n      if (!hit2 && ix && (group2.fill || !fore && group2.stroke) && hitBackground(context2, group2, cx, cy)) {\n        hit2 = group2;\n      }\n      context2.restore();\n      return hit2 || null;\n    });\n  }\n  function pickMark(mark, x2, y2) {\n    return (mark.interactive !== false || mark.marktype === \"group\") && mark.bounds && mark.bounds.contains(x2, y2);\n  }\n  var group$1 = {\n    type: \"group\",\n    tag: \"g\",\n    nested: false,\n    attr: attr$5,\n    bound: bound$5,\n    draw: draw$4,\n    pick,\n    isect: intersectRect,\n    content,\n    background: background$1,\n    foreground\n  };\n  var metadata = {\n    \"xmlns\": \"http://www.w3.org/2000/svg\",\n    \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n    \"version\": \"1.1\"\n  };\n  function getImage(item, renderer) {\n    var image2 = item.image;\n    if (!image2 || item.url && item.url !== image2.url) {\n      image2 = {\n        complete: false,\n        width: 0,\n        height: 0\n      };\n      renderer.loadImage(item.url).then((image3) => {\n        item.image = image3;\n        item.image.url = item.url;\n      });\n    }\n    return image2;\n  }\n  function imageWidth(item, image2) {\n    return item.width != null ? item.width : !image2 || !image2.width ? 0 : item.aspect !== false && item.height ? item.height * image2.width / image2.height : image2.width;\n  }\n  function imageHeight(item, image2) {\n    return item.height != null ? item.height : !image2 || !image2.height ? 0 : item.aspect !== false && item.width ? item.width * image2.height / image2.width : image2.height;\n  }\n  function imageXOffset(align, w2) {\n    return align === \"center\" ? w2 / 2 : align === \"right\" ? w2 : 0;\n  }\n  function imageYOffset(baseline2, h2) {\n    return baseline2 === \"middle\" ? h2 / 2 : baseline2 === \"bottom\" ? h2 : 0;\n  }\n  function attr$4(emit2, item, renderer) {\n    const img = getImage(item, renderer), w2 = imageWidth(item, img), h2 = imageHeight(item, img), x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2), i = !img.src && img.toDataURL ? img.toDataURL() : img.src || \"\";\n    emit2(\"href\", i, metadata[\"xmlns:xlink\"], \"xlink:href\");\n    emit2(\"transform\", translate$2(x2, y2));\n    emit2(\"width\", w2);\n    emit2(\"height\", h2);\n    emit2(\"preserveAspectRatio\", item.aspect === false ? \"none\" : \"xMidYMid\");\n  }\n  function bound$4(bounds2, item) {\n    const img = item.image, w2 = imageWidth(item, img), h2 = imageHeight(item, img), x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2);\n    return bounds2.set(x2, y2, x2 + w2, y2 + h2);\n  }\n  function draw$3(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      if (bounds2 && !bounds2.intersects(item.bounds)) return;\n      const img = getImage(item, this);\n      let w2 = imageWidth(item, img);\n      let h2 = imageHeight(item, img);\n      if (w2 === 0 || h2 === 0) return;\n      let x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2), opacity2, ar0, ar1, t;\n      if (item.aspect !== false) {\n        ar0 = img.width / img.height;\n        ar1 = item.width / item.height;\n        if (ar0 === ar0 && ar1 === ar1 && ar0 !== ar1) {\n          if (ar1 < ar0) {\n            t = w2 / ar0;\n            y2 += (h2 - t) / 2;\n            h2 = t;\n          } else {\n            t = h2 * ar0;\n            x2 += (w2 - t) / 2;\n            w2 = t;\n          }\n        }\n      }\n      if (img.complete || img.toDataURL) {\n        blend(context2, item);\n        context2.globalAlpha = (opacity2 = item.opacity) != null ? opacity2 : 1;\n        context2.imageSmoothingEnabled = item.smooth !== false;\n        context2.drawImage(img, x2, y2, w2, h2);\n      }\n    });\n  }\n  var image = {\n    type: \"image\",\n    tag: \"image\",\n    nested: false,\n    attr: attr$4,\n    bound: bound$4,\n    draw: draw$3,\n    pick: pick$1(),\n    isect: truthy,\n    // bounds check is sufficient\n    get: getImage,\n    xOffset: imageXOffset,\n    yOffset: imageYOffset\n  };\n  var line$2 = markMultiItemPath(\"line\", line$1, pickLine);\n  function attr$3(emit2, item) {\n    var sx = item.scaleX || 1, sy = item.scaleY || 1;\n    if (sx !== 1 || sy !== 1) {\n      emit2(\"vector-effect\", \"non-scaling-stroke\");\n    }\n    emit2(\"transform\", transformItem(item));\n    emit2(\"d\", item.path);\n  }\n  function path$1(context2, item) {\n    var path2 = item.path;\n    if (path2 == null) return true;\n    var x2 = item.x || 0, y2 = item.y || 0, sx = item.scaleX || 1, sy = item.scaleY || 1, a2 = (item.angle || 0) * DegToRad, cache2 = item.pathCache;\n    if (!cache2 || cache2.path !== path2) {\n      (item.pathCache = cache2 = parse$3(path2)).path = path2;\n    }\n    if (a2 && context2.rotate && context2.translate) {\n      context2.translate(x2, y2);\n      context2.rotate(a2);\n      pathRender(context2, cache2, 0, 0, sx, sy);\n      context2.rotate(-a2);\n      context2.translate(-x2, -y2);\n    } else {\n      pathRender(context2, cache2, x2, y2, sx, sy);\n    }\n  }\n  function bound$3(bounds2, item) {\n    return path$1(boundContext(bounds2, item.angle), item) ? bounds2.set(0, 0, 0, 0) : boundStroke(bounds2, item, true);\n  }\n  var path$2 = {\n    type: \"path\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$3,\n    bound: bound$3,\n    draw: drawAll(path$1),\n    pick: pickPath(path$1),\n    isect: intersectPath(path$1)\n  };\n  function attr$2(emit2, item) {\n    emit2(\"d\", rectangle(null, item));\n  }\n  function bound$2(bounds2, item) {\n    var x2, y2;\n    return boundStroke(bounds2.set(x2 = item.x || 0, y2 = item.y || 0, x2 + item.width || 0, y2 + item.height || 0), item);\n  }\n  function draw$2(context2, item) {\n    context2.beginPath();\n    rectangle(context2, item);\n  }\n  var rect = {\n    type: \"rect\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$2,\n    bound: bound$2,\n    draw: drawAll(draw$2),\n    pick: pickPath(draw$2),\n    isect: intersectRect\n  };\n  function attr$1(emit2, item) {\n    emit2(\"transform\", translateItem(item));\n    emit2(\"x2\", item.x2 != null ? item.x2 - (item.x || 0) : 0);\n    emit2(\"y2\", item.y2 != null ? item.y2 - (item.y || 0) : 0);\n  }\n  function bound$1(bounds2, item) {\n    var x12, y12;\n    return boundStroke(bounds2.set(x12 = item.x || 0, y12 = item.y || 0, item.x2 != null ? item.x2 : x12, item.y2 != null ? item.y2 : y12), item);\n  }\n  function path(context2, item, opacity2) {\n    var x12, y12, x2, y2;\n    if (item.stroke && stroke(context2, item, opacity2)) {\n      x12 = item.x || 0;\n      y12 = item.y || 0;\n      x2 = item.x2 != null ? item.x2 : x12;\n      y2 = item.y2 != null ? item.y2 : y12;\n      context2.beginPath();\n      context2.moveTo(x12, y12);\n      context2.lineTo(x2, y2);\n      return true;\n    }\n    return false;\n  }\n  function draw$1(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      if (bounds2 && !bounds2.intersects(item.bounds)) return;\n      var opacity2 = item.opacity == null ? 1 : item.opacity;\n      if (opacity2 && path(context2, item, opacity2)) {\n        blend(context2, item);\n        context2.stroke();\n      }\n    });\n  }\n  function hit$1(context2, item, x2, y2) {\n    if (!context2.isPointInStroke) return false;\n    return path(context2, item, 1) && context2.isPointInStroke(x2, y2);\n  }\n  var rule$1 = {\n    type: \"rule\",\n    tag: \"line\",\n    nested: false,\n    attr: attr$1,\n    bound: bound$1,\n    draw: draw$1,\n    pick: pick$1(hit$1),\n    isect: intersectRule\n  };\n  var shape = markItemPath(\"shape\", shape$1);\n  var symbol = markItemPath(\"symbol\", symbol$1, intersectPoint);\n  const widthCache = lruCache();\n  var textMetrics = {\n    height: fontSize,\n    measureWidth,\n    estimateWidth,\n    width: estimateWidth,\n    canvas: useCanvas\n  };\n  useCanvas(true);\n  function useCanvas(use2) {\n    textMetrics.width = use2 && context$2 ? measureWidth : estimateWidth;\n  }\n  function estimateWidth(item, text2) {\n    return _estimateWidth(textValue(item, text2), fontSize(item));\n  }\n  function _estimateWidth(text2, currentFontHeight) {\n    return ~~(0.8 * text2.length * currentFontHeight);\n  }\n  function measureWidth(item, text2) {\n    return fontSize(item) <= 0 || !(text2 = textValue(item, text2)) ? 0 : _measureWidth(text2, font(item));\n  }\n  function _measureWidth(text2, currentFont) {\n    const key2 = `(${currentFont}) ${text2}`;\n    let width2 = widthCache.get(key2);\n    if (width2 === void 0) {\n      context$2.font = currentFont;\n      width2 = context$2.measureText(text2).width;\n      widthCache.set(key2, width2);\n    }\n    return width2;\n  }\n  function fontSize(item) {\n    return item.fontSize != null ? +item.fontSize || 0 : 11;\n  }\n  function lineHeight(item) {\n    return item.lineHeight != null ? item.lineHeight : fontSize(item) + 2;\n  }\n  function lineArray(_) {\n    return isArray(_) ? _.length > 1 ? _ : _[0] : _;\n  }\n  function textLines(item) {\n    return lineArray(item.lineBreak && item.text && !isArray(item.text) ? item.text.split(item.lineBreak) : item.text);\n  }\n  function multiLineOffset(item) {\n    const tl2 = textLines(item);\n    return (isArray(tl2) ? tl2.length - 1 : 0) * lineHeight(item);\n  }\n  function textValue(item, line2) {\n    const text2 = line2 == null ? \"\" : (line2 + \"\").trim();\n    return item.limit > 0 && text2.length ? truncate(item, text2) : text2;\n  }\n  function widthGetter(item) {\n    if (textMetrics.width === measureWidth) {\n      const currentFont = font(item);\n      return (text2) => _measureWidth(text2, currentFont);\n    } else if (textMetrics.width === estimateWidth) {\n      const currentFontHeight = fontSize(item);\n      return (text2) => _estimateWidth(text2, currentFontHeight);\n    } else {\n      return (text2) => textMetrics.width(item, text2);\n    }\n  }\n  function truncate(item, text2) {\n    var limit = +item.limit, width2 = widthGetter(item);\n    if (width2(text2) < limit) return text2;\n    var ellipsis = item.ellipsis || \"…\", rtl = item.dir === \"rtl\", lo = 0, hi = text2.length, mid;\n    limit -= width2(ellipsis);\n    if (rtl) {\n      while (lo < hi) {\n        mid = lo + hi >>> 1;\n        if (width2(text2.slice(mid)) > limit) lo = mid + 1;\n        else hi = mid;\n      }\n      return ellipsis + text2.slice(lo);\n    } else {\n      while (lo < hi) {\n        mid = 1 + (lo + hi >>> 1);\n        if (width2(text2.slice(0, mid)) < limit) lo = mid;\n        else hi = mid - 1;\n      }\n      return text2.slice(0, lo) + ellipsis;\n    }\n  }\n  function fontFamily(item, quote) {\n    var font2 = item.font;\n    return (quote && font2 ? String(font2).replace(/\"/g, \"'\") : font2) || \"sans-serif\";\n  }\n  function font(item, quote) {\n    return (item.fontStyle ? item.fontStyle + \" \" : \"\") + (item.fontVariant ? item.fontVariant + \" \" : \"\") + (item.fontWeight ? item.fontWeight + \" \" : \"\") + fontSize(item) + \"px \" + fontFamily(item, quote);\n  }\n  function offset$2(item) {\n    var baseline2 = item.baseline, h2 = fontSize(item);\n    return Math.round(baseline2 === \"top\" ? 0.79 * h2 : baseline2 === \"middle\" ? 0.3 * h2 : baseline2 === \"bottom\" ? -0.21 * h2 : baseline2 === \"line-top\" ? 0.29 * h2 + 0.5 * lineHeight(item) : baseline2 === \"line-bottom\" ? 0.29 * h2 - 0.5 * lineHeight(item) : 0);\n  }\n  const textAlign = {\n    \"left\": \"start\",\n    \"center\": \"middle\",\n    \"right\": \"end\"\n  };\n  const tempBounds$1 = new Bounds();\n  function anchorPoint(item) {\n    var x2 = item.x || 0, y2 = item.y || 0, r = item.radius || 0, t;\n    if (r) {\n      t = (item.theta || 0) - HalfPi;\n      x2 += r * Math.cos(t);\n      y2 += r * Math.sin(t);\n    }\n    tempBounds$1.x1 = x2;\n    tempBounds$1.y1 = y2;\n    return tempBounds$1;\n  }\n  function attr(emit2, item) {\n    var dx = item.dx || 0, dy = (item.dy || 0) + offset$2(item), p = anchorPoint(item), x2 = p.x1, y2 = p.y1, a2 = item.angle || 0, t;\n    emit2(\"text-anchor\", textAlign[item.align] || \"start\");\n    if (a2) {\n      t = translate$2(x2, y2) + \" \" + rotate(a2);\n      if (dx || dy) t += \" \" + translate$2(dx, dy);\n    } else {\n      t = translate$2(x2 + dx, y2 + dy);\n    }\n    emit2(\"transform\", t);\n  }\n  function bound(bounds2, item, mode) {\n    var h2 = textMetrics.height(item), a2 = item.align, p = anchorPoint(item), x2 = p.x1, y2 = p.y1, dx = item.dx || 0, dy = (item.dy || 0) + offset$2(item) - Math.round(0.8 * h2), tl2 = textLines(item), w2;\n    if (isArray(tl2)) {\n      h2 += lineHeight(item) * (tl2.length - 1);\n      w2 = tl2.reduce((w3, t) => Math.max(w3, textMetrics.width(item, t)), 0);\n    } else {\n      w2 = textMetrics.width(item, tl2);\n    }\n    if (a2 === \"center\") {\n      dx -= w2 / 2;\n    } else if (a2 === \"right\") {\n      dx -= w2;\n    } else ;\n    bounds2.set(dx += x2, dy += y2, dx + w2, dy + h2);\n    if (item.angle && !mode) {\n      bounds2.rotate(item.angle * DegToRad, x2, y2);\n    } else if (mode === 2) {\n      return bounds2.rotatedPoints(item.angle * DegToRad, x2, y2);\n    }\n    return bounds2;\n  }\n  function draw$5(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      var opacity2 = item.opacity == null ? 1 : item.opacity, p, x2, y2, i, lh, tl2, str;\n      if (bounds2 && !bounds2.intersects(item.bounds) || // bounds check\n      opacity2 === 0 || item.fontSize <= 0 || item.text == null || item.text.length === 0) return;\n      context2.font = font(item);\n      context2.textAlign = item.align || \"left\";\n      p = anchorPoint(item);\n      x2 = p.x1, y2 = p.y1;\n      if (item.angle) {\n        context2.save();\n        context2.translate(x2, y2);\n        context2.rotate(item.angle * DegToRad);\n        x2 = y2 = 0;\n      }\n      x2 += item.dx || 0;\n      y2 += (item.dy || 0) + offset$2(item);\n      tl2 = textLines(item);\n      blend(context2, item);\n      if (isArray(tl2)) {\n        lh = lineHeight(item);\n        for (i = 0; i < tl2.length; ++i) {\n          str = textValue(item, tl2[i]);\n          if (item.fill && fill$1(context2, item, opacity2)) {\n            context2.fillText(str, x2, y2);\n          }\n          if (item.stroke && stroke(context2, item, opacity2)) {\n            context2.strokeText(str, x2, y2);\n          }\n          y2 += lh;\n        }\n      } else {\n        str = textValue(item, tl2);\n        if (item.fill && fill$1(context2, item, opacity2)) {\n          context2.fillText(str, x2, y2);\n        }\n        if (item.stroke && stroke(context2, item, opacity2)) {\n          context2.strokeText(str, x2, y2);\n        }\n      }\n      if (item.angle) context2.restore();\n    });\n  }\n  function hit(context2, item, x2, y2, gx, gy) {\n    if (item.fontSize <= 0) return false;\n    if (!item.angle) return true;\n    var p = anchorPoint(item), ax = p.x1, ay = p.y1, b2 = bound(tempBounds$1, item, 1), a2 = -item.angle * DegToRad, cos2 = Math.cos(a2), sin2 = Math.sin(a2), px2 = cos2 * gx - sin2 * gy + (ax - cos2 * ax + sin2 * ay), py2 = sin2 * gx + cos2 * gy + (ay - sin2 * ax - cos2 * ay);\n    return b2.contains(px2, py2);\n  }\n  function intersectText(item, box2) {\n    const p = bound(tempBounds$1, item, 2);\n    return intersectBoxLine(box2, p[0], p[1], p[2], p[3]) || intersectBoxLine(box2, p[0], p[1], p[4], p[5]) || intersectBoxLine(box2, p[4], p[5], p[6], p[7]) || intersectBoxLine(box2, p[2], p[3], p[6], p[7]);\n  }\n  var text = {\n    type: \"text\",\n    tag: \"text\",\n    nested: false,\n    attr,\n    bound,\n    draw: draw$5,\n    pick: pick$1(hit),\n    isect: intersectText\n  };\n  var trail = markMultiItemPath(\"trail\", trail$1, pickTrail);\n  var Marks = {\n    arc: arc$2,\n    area: area$2,\n    group: group$1,\n    image,\n    line: line$2,\n    path: path$2,\n    rect,\n    rule: rule$1,\n    shape,\n    symbol,\n    text,\n    trail\n  };\n  function boundItem$1(item, func, opt) {\n    var type2 = Marks[item.mark.marktype], bound2 = func || type2.bound;\n    if (type2.nested) item = item.mark;\n    return bound2(item.bounds || (item.bounds = new Bounds()), item, opt);\n  }\n  var DUMMY = {\n    mark: null\n  };\n  function boundMark(mark, bounds2, opt) {\n    var type2 = Marks[mark.marktype], bound2 = type2.bound, items = mark.items, hasItems = items && items.length, i, n, item, b2;\n    if (type2.nested) {\n      if (hasItems) {\n        item = items[0];\n      } else {\n        DUMMY.mark = mark;\n        item = DUMMY;\n      }\n      b2 = boundItem$1(item, bound2, opt);\n      bounds2 = bounds2 && bounds2.union(b2) || b2;\n      return bounds2;\n    }\n    bounds2 = bounds2 || mark.bounds && mark.bounds.clear() || new Bounds();\n    if (hasItems) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        bounds2.union(boundItem$1(items[i], bound2, opt));\n      }\n    }\n    return mark.bounds = bounds2;\n  }\n  const keys$1 = [\n    \"marktype\",\n    \"name\",\n    \"role\",\n    \"interactive\",\n    \"clip\",\n    \"items\",\n    \"zindex\",\n    \"x\",\n    \"y\",\n    \"width\",\n    \"height\",\n    \"align\",\n    \"baseline\",\n    // layout\n    \"fill\",\n    \"fillOpacity\",\n    \"opacity\",\n    \"blend\",\n    // fill\n    \"stroke\",\n    \"strokeOpacity\",\n    \"strokeWidth\",\n    \"strokeCap\",\n    // stroke\n    \"strokeDash\",\n    \"strokeDashOffset\",\n    // stroke dash\n    \"strokeForeground\",\n    \"strokeOffset\",\n    // group\n    \"startAngle\",\n    \"endAngle\",\n    \"innerRadius\",\n    \"outerRadius\",\n    // arc\n    \"cornerRadius\",\n    \"padAngle\",\n    // arc, rect\n    \"cornerRadiusTopLeft\",\n    \"cornerRadiusTopRight\",\n    // rect, group\n    \"cornerRadiusBottomLeft\",\n    \"cornerRadiusBottomRight\",\n    \"interpolate\",\n    \"tension\",\n    \"orient\",\n    \"defined\",\n    // area, line\n    \"url\",\n    \"aspect\",\n    \"smooth\",\n    // image\n    \"path\",\n    \"scaleX\",\n    \"scaleY\",\n    // path\n    \"x2\",\n    \"y2\",\n    // rule\n    \"size\",\n    \"shape\",\n    // symbol\n    \"text\",\n    \"angle\",\n    \"theta\",\n    \"radius\",\n    \"dir\",\n    \"dx\",\n    \"dy\",\n    // text\n    \"ellipsis\",\n    \"limit\",\n    \"lineBreak\",\n    \"lineHeight\",\n    \"font\",\n    \"fontSize\",\n    \"fontWeight\",\n    \"fontStyle\",\n    \"fontVariant\",\n    // font\n    \"description\",\n    \"aria\",\n    \"ariaRole\",\n    \"ariaRoleDescription\"\n    // aria\n  ];\n  function sceneToJSON(scene, indent) {\n    return JSON.stringify(scene, keys$1, indent);\n  }\n  function sceneFromJSON(json2) {\n    const scene = typeof json2 === \"string\" ? JSON.parse(json2) : json2;\n    return initialize$1(scene);\n  }\n  function initialize$1(scene) {\n    var type2 = scene.marktype, items = scene.items, parent, i, n;\n    if (items) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        parent = type2 ? \"mark\" : \"group\";\n        items[i][parent] = scene;\n        if (items[i].zindex) items[i][parent].zdirty = true;\n        if (\"group\" === (type2 || parent)) initialize$1(items[i]);\n      }\n    }\n    if (type2) boundMark(scene);\n    return scene;\n  }\n  class Scenegraph {\n    constructor(scene) {\n      if (arguments.length) {\n        this.root = sceneFromJSON(scene);\n      } else {\n        this.root = createMark({\n          marktype: \"group\",\n          name: \"root\",\n          role: \"frame\"\n        });\n        this.root.items = [new GroupItem(this.root)];\n      }\n    }\n    toJSON(indent) {\n      return sceneToJSON(this.root, indent || 0);\n    }\n    mark(markdef, group2, index2) {\n      group2 = group2 || this.root.items[0];\n      const mark = createMark(markdef, group2);\n      group2.items[index2] = mark;\n      if (mark.zindex) mark.group.zdirty = true;\n      return mark;\n    }\n  }\n  function createMark(def2, group2) {\n    const mark = {\n      bounds: new Bounds(),\n      clip: !!def2.clip,\n      group: group2,\n      interactive: def2.interactive === false ? false : true,\n      items: [],\n      marktype: def2.marktype,\n      name: def2.name || void 0,\n      role: def2.role || void 0,\n      zindex: def2.zindex || 0\n    };\n    if (def2.aria != null) {\n      mark.aria = def2.aria;\n    }\n    if (def2.description) {\n      mark.description = def2.description;\n    }\n    return mark;\n  }\n  function domCreate(doc, tag, ns) {\n    if (!doc && typeof document !== \"undefined\" && document.createElement) {\n      doc = document;\n    }\n    return doc ? ns ? doc.createElementNS(ns, tag) : doc.createElement(tag) : null;\n  }\n  function domFind(el, tag) {\n    tag = tag.toLowerCase();\n    var nodes = el.childNodes, i = 0, n = nodes.length;\n    for (; i < n; ++i) if (nodes[i].tagName.toLowerCase() === tag) {\n      return nodes[i];\n    }\n  }\n  function domChild(el, index2, tag, ns) {\n    var a2 = el.childNodes[index2], b2;\n    if (!a2 || a2.tagName.toLowerCase() !== tag.toLowerCase()) {\n      b2 = a2 || null;\n      a2 = domCreate(el.ownerDocument, tag, ns);\n      el.insertBefore(a2, b2);\n    }\n    return a2;\n  }\n  function domClear(el, index2) {\n    var nodes = el.childNodes, curr = nodes.length;\n    while (curr > index2) el.removeChild(nodes[--curr]);\n    return el;\n  }\n  function cssClass(mark) {\n    return \"mark-\" + mark.marktype + (mark.role ? \" role-\" + mark.role : \"\") + (mark.name ? \" \" + mark.name : \"\");\n  }\n  function point(event2, el) {\n    const rect2 = el.getBoundingClientRect();\n    return [event2.clientX - rect2.left - (el.clientLeft || 0), event2.clientY - rect2.top - (el.clientTop || 0)];\n  }\n  function resolveItem(item, event2, el, origin) {\n    var mark = item && item.mark, mdef, p;\n    if (mark && (mdef = Marks[mark.marktype]).tip) {\n      p = point(event2, el);\n      p[0] -= origin[0];\n      p[1] -= origin[1];\n      while (item = item.mark.group) {\n        p[0] -= item.x || 0;\n        p[1] -= item.y || 0;\n      }\n      item = mdef.tip(mark.items, p);\n    }\n    return item;\n  }\n  class Handler {\n    /**\n     * Create a new Handler instance.\n     * @param {object} [customLoader] - Optional loader instance for\n     *   href URL sanitization. If not specified, a standard loader\n     *   instance will be generated.\n     * @param {function} [customTooltip] - Optional tooltip handler\n     *   function for custom tooltip display.\n     * @constructor\n     */\n    constructor(customLoader, customTooltip) {\n      this._active = null;\n      this._handlers = {};\n      this._loader = customLoader || loader();\n      this._tooltip = customTooltip || defaultTooltip$1;\n    }\n    /**\n     * Initialize a new Handler instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {object} [obj] - Optional context object that should serve as\n     *   the \"this\" context for event callbacks.\n     * @return {Handler} - This handler instance.\n     */\n    initialize(el, origin, obj2) {\n      this._el = el;\n      this._obj = obj2 || null;\n      return this.origin(origin);\n    }\n    /**\n     * Returns the parent container element for a visualization.\n     * @return {DOMElement} - The containing DOM element.\n     */\n    element() {\n      return this._el;\n    }\n    /**\n     * Returns the scene element (e.g., canvas or SVG) of the visualization\n     * Subclasses must override if the first child is not the scene element.\n     * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n     */\n    canvas() {\n      return this._el && this._el.firstChild;\n    }\n    /**\n     * Get / set the origin coordinates of the visualization.\n     */\n    origin(origin) {\n      if (arguments.length) {\n        this._origin = origin || [0, 0];\n        return this;\n      } else {\n        return this._origin.slice();\n      }\n    }\n    /**\n     * Get / set the scenegraph root.\n     */\n    scene(scene) {\n      if (!arguments.length) return this._scene;\n      this._scene = scene;\n      return this;\n    }\n    /**\n     * Add an event handler. Subclasses should override this method.\n     */\n    on() {\n    }\n    /**\n     * Remove an event handler. Subclasses should override this method.\n     */\n    off() {\n    }\n    /**\n     * Utility method for finding the array index of an event handler.\n     * @param {Array} h - An array of registered event handlers.\n     * @param {string} type - The event type.\n     * @param {function} handler - The event handler instance to find.\n     * @return {number} - The handler's array index or -1 if not registered.\n     */\n    _handlerIndex(h2, type2, handler) {\n      for (let i = h2 ? h2.length : 0; --i >= 0; ) {\n        if (h2[i].type === type2 && (!handler || h2[i].handler === handler)) {\n          return i;\n        }\n      }\n      return -1;\n    }\n    /**\n     * Returns an array with registered event handlers.\n     * @param {string} [type] - The event type to query. Any annotations\n     *   are ignored; for example, for the argument \"click.foo\", \".foo\" will\n     *   be ignored and the method returns all \"click\" handlers. If type is\n     *   null or unspecified, this method returns handlers for all types.\n     * @return {Array} - A new array containing all registered event handlers.\n     */\n    handlers(type2) {\n      const h2 = this._handlers, a2 = [];\n      if (type2) {\n        a2.push(...h2[this.eventName(type2)]);\n      } else {\n        for (const k in h2) {\n          a2.push(...h2[k]);\n        }\n      }\n      return a2;\n    }\n    /**\n     * Parses an event name string to return the specific event type.\n     * For example, given \"click.foo\" returns \"click\"\n     * @param {string} name - The input event type string.\n     * @return {string} - A string with the event type only.\n     */\n    eventName(name) {\n      const i = name.indexOf(\".\");\n      return i < 0 ? name : name.slice(0, i);\n    }\n    /**\n     * Handle hyperlink navigation in response to an item.href value.\n     * @param {Event} event - The event triggering hyperlink navigation.\n     * @param {Item} item - The scenegraph item.\n     * @param {string} href - The URL to navigate to.\n     */\n    handleHref(event2, item, href2) {\n      this._loader.sanitize(href2, {\n        context: \"href\"\n      }).then((opt) => {\n        const e = new MouseEvent(event2.type, event2), a2 = domCreate(null, \"a\");\n        for (const name in opt) a2.setAttribute(name, opt[name]);\n        a2.dispatchEvent(e);\n      }).catch(() => {\n      });\n    }\n    /**\n     * Handle tooltip display in response to an item.tooltip value.\n     * @param {Event} event - The event triggering tooltip display.\n     * @param {Item} item - The scenegraph item.\n     * @param {boolean} show - A boolean flag indicating whether\n     *   to show or hide a tooltip for the given item.\n     */\n    handleTooltip(event2, item, show) {\n      if (item && item.tooltip != null) {\n        item = resolveItem(item, event2, this.canvas(), this._origin);\n        const value2 = show && item && item.tooltip || null;\n        this._tooltip.call(this._obj, this, event2, item, value2);\n      }\n    }\n    /**\n     * Returns the size of a scenegraph item and its position relative\n     * to the viewport.\n     * @param {Item} item - The scenegraph item.\n     * @return {object} - A bounding box object (compatible with the\n     *   DOMRect type) consisting of x, y, width, heigh, top, left,\n     *   right, and bottom properties.\n     */\n    getItemBoundingClientRect(item) {\n      const el = this.canvas();\n      if (!el) return;\n      const rect2 = el.getBoundingClientRect(), origin = this._origin, bounds2 = item.bounds, width2 = bounds2.width(), height2 = bounds2.height();\n      let x2 = bounds2.x1 + origin[0] + rect2.left, y2 = bounds2.y1 + origin[1] + rect2.top;\n      while (item.mark && (item = item.mark.group)) {\n        x2 += item.x || 0;\n        y2 += item.y || 0;\n      }\n      return {\n        x: x2,\n        y: y2,\n        width: width2,\n        height: height2,\n        left: x2,\n        top: y2,\n        right: x2 + width2,\n        bottom: y2 + height2\n      };\n    }\n  }\n  function defaultTooltip$1(handler, event2, item, value2) {\n    handler.element().setAttribute(\"title\", value2 || \"\");\n  }\n  class Renderer {\n    /**\n     * Create a new Renderer instance.\n     * @param {object} [loader] - Optional loader instance for\n     *   image and href URL sanitization. If not specified, a\n     *   standard loader instance will be generated.\n     * @constructor\n     */\n    constructor(loader2) {\n      this._el = null;\n      this._bgcolor = null;\n      this._loader = new ResourceLoader(loader2);\n    }\n    /**\n     * Initialize a new Renderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {Renderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._el = el;\n      return this.resize(width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Returns the parent container element for a visualization.\n     * @return {DOMElement} - The containing DOM element.\n     */\n    element() {\n      return this._el;\n    }\n    /**\n     * Returns the scene element (e.g., canvas or SVG) of the visualization\n     * Subclasses must override if the first child is not the scene element.\n     * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n     */\n    canvas() {\n      return this._el && this._el.firstChild;\n    }\n    /**\n     * Get / set the background color.\n     */\n    background(bgcolor) {\n      if (arguments.length === 0) return this._bgcolor;\n      this._bgcolor = bgcolor;\n      return this;\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {Renderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      this._width = width2;\n      this._height = height2;\n      this._origin = origin || [0, 0];\n      this._scale = scaleFactor || 1;\n      return this;\n    }\n    /**\n     * Report a dirty item whose bounds should be redrawn.\n     * This base class method does nothing. Subclasses that perform\n     * incremental should implement this method.\n     * @param {Item} item - The dirty item whose bounds should be redrawn.\n     */\n    dirty() {\n    }\n    /**\n     * Render an input scenegraph, potentially with a set of dirty items.\n     * This method will perform an immediate rendering with available resources.\n     * The renderer may also need to perform image loading to perform a complete\n     * render. This process can lead to asynchronous re-rendering of the scene\n     * after this method returns. To receive notification when rendering is\n     * complete, use the renderAsync method instead.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     * @return {Renderer} - This renderer instance.\n     */\n    render(scene, markTypes) {\n      const r = this;\n      r._call = function() {\n        r._render(scene, markTypes);\n      };\n      r._call();\n      r._call = null;\n      return r;\n    }\n    /**\n     * Internal rendering method. Renderer subclasses should override this\n     * method to actually perform rendering.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render() {\n    }\n    /**\n     * Asynchronous rendering method. Similar to render, but returns a Promise\n     * that resolves when all rendering is completed. Sometimes a renderer must\n     * perform image loading to get a complete rendering. The returned\n     * Promise will not resolve until this process completes.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     * @return {Promise} - A Promise that resolves when rendering is complete.\n     */\n    renderAsync(scene, markTypes) {\n      const r = this.render(scene, markTypes);\n      return this._ready ? this._ready.then(() => r) : Promise.resolve(r);\n    }\n    /**\n     * Internal method for asynchronous resource loading.\n     * Proxies method calls to the ImageLoader, and tracks loading\n     * progress to invoke a re-render once complete.\n     * @param {string} method - The method name to invoke on the ImageLoader.\n     * @param {string} uri - The URI for the requested resource.\n     * @return {Promise} - A Promise that resolves to the requested resource.\n     */\n    _load(method2, uri) {\n      var r = this, p = r._loader[method2](uri);\n      if (!r._ready) {\n        const call = r._call;\n        r._ready = r._loader.ready().then((redraw) => {\n          if (redraw) call();\n          r._ready = null;\n        });\n      }\n      return p;\n    }\n    /**\n     * Sanitize a URL to include as a hyperlink in the rendered scene.\n     * This method proxies a call to ImageLoader.sanitizeURL, but also tracks\n     * image loading progress and invokes a re-render once complete.\n     * @param {string} uri - The URI string to sanitize.\n     * @return {Promise} - A Promise that resolves to the sanitized URL.\n     */\n    sanitizeURL(uri) {\n      return this._load(\"sanitizeURL\", uri);\n    }\n    /**\n     * Requests an image to include in the rendered scene.\n     * This method proxies a call to ImageLoader.loadImage, but also tracks\n     * image loading progress and invokes a re-render once complete.\n     * @param {string} uri - The URI string of the image.\n     * @return {Promise} - A Promise that resolves to the loaded Image.\n     */\n    loadImage(uri) {\n      return this._load(\"loadImage\", uri);\n    }\n  }\n  const KeyDownEvent = \"keydown\";\n  const KeyPressEvent = \"keypress\";\n  const KeyUpEvent = \"keyup\";\n  const DragEnterEvent = \"dragenter\";\n  const DragLeaveEvent = \"dragleave\";\n  const DragOverEvent = \"dragover\";\n  const PointerDownEvent = \"pointerdown\";\n  const PointerUpEvent = \"pointerup\";\n  const PointerMoveEvent = \"pointermove\";\n  const PointerOutEvent = \"pointerout\";\n  const PointerOverEvent = \"pointerover\";\n  const MouseDownEvent = \"mousedown\";\n  const MouseUpEvent = \"mouseup\";\n  const MouseMoveEvent = \"mousemove\";\n  const MouseOutEvent = \"mouseout\";\n  const MouseOverEvent = \"mouseover\";\n  const ClickEvent = \"click\";\n  const DoubleClickEvent = \"dblclick\";\n  const WheelEvent = \"wheel\";\n  const MouseWheelEvent = \"mousewheel\";\n  const TouchStartEvent = \"touchstart\";\n  const TouchMoveEvent = \"touchmove\";\n  const TouchEndEvent = \"touchend\";\n  const Events = [KeyDownEvent, KeyPressEvent, KeyUpEvent, DragEnterEvent, DragLeaveEvent, DragOverEvent, PointerDownEvent, PointerUpEvent, PointerMoveEvent, PointerOutEvent, PointerOverEvent, MouseDownEvent, MouseUpEvent, MouseMoveEvent, MouseOutEvent, MouseOverEvent, ClickEvent, DoubleClickEvent, WheelEvent, MouseWheelEvent, TouchStartEvent, TouchMoveEvent, TouchEndEvent];\n  const TooltipShowEvent = PointerMoveEvent;\n  const TooltipHideEvent = MouseOutEvent;\n  const HrefEvent = ClickEvent;\n  class CanvasHandler extends Handler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n      this._down = null;\n      this._touch = null;\n      this._first = true;\n      this._events = {};\n      this.events = Events;\n      this.pointermove = move([PointerMoveEvent, MouseMoveEvent], [PointerOverEvent, MouseOverEvent], [PointerOutEvent, MouseOutEvent]);\n      this.dragover = move([DragOverEvent], [DragEnterEvent], [DragLeaveEvent]), this.pointerout = inactive([PointerOutEvent, MouseOutEvent]);\n      this.dragleave = inactive([DragLeaveEvent]);\n    }\n    initialize(el, origin, obj2) {\n      this._canvas = el && domFind(el, \"canvas\");\n      [ClickEvent, MouseDownEvent, PointerDownEvent, PointerMoveEvent, PointerOutEvent, DragLeaveEvent].forEach((type2) => eventListenerCheck(this, type2));\n      return super.initialize(el, origin, obj2);\n    }\n    // return the backing canvas instance\n    canvas() {\n      return this._canvas;\n    }\n    // retrieve the current canvas context\n    context() {\n      return this._canvas.getContext(\"2d\");\n    }\n    // to keep old versions of firefox happy\n    DOMMouseScroll(evt) {\n      this.fire(MouseWheelEvent, evt);\n    }\n    pointerdown(evt) {\n      this._down = this._active;\n      this.fire(PointerDownEvent, evt);\n    }\n    mousedown(evt) {\n      this._down = this._active;\n      this.fire(MouseDownEvent, evt);\n    }\n    click(evt) {\n      if (this._down === this._active) {\n        this.fire(ClickEvent, evt);\n        this._down = null;\n      }\n    }\n    touchstart(evt) {\n      this._touch = this.pickEvent(evt.changedTouches[0]);\n      if (this._first) {\n        this._active = this._touch;\n        this._first = false;\n      }\n      this.fire(TouchStartEvent, evt, true);\n    }\n    touchmove(evt) {\n      this.fire(TouchMoveEvent, evt, true);\n    }\n    touchend(evt) {\n      this.fire(TouchEndEvent, evt, true);\n      this._touch = null;\n    }\n    // fire an event\n    fire(type2, evt, touch2) {\n      const a2 = touch2 ? this._touch : this._active, h2 = this._handlers[type2];\n      evt.vegaType = type2;\n      if (type2 === HrefEvent && a2 && a2.href) {\n        this.handleHref(evt, a2, a2.href);\n      } else if (type2 === TooltipShowEvent || type2 === TooltipHideEvent) {\n        this.handleTooltip(evt, a2, type2 !== TooltipHideEvent);\n      }\n      if (h2) {\n        for (let i = 0, len2 = h2.length; i < len2; ++i) {\n          h2[i].handler.call(this._obj, evt, a2);\n        }\n      }\n    }\n    // add an event handler\n    on(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers, i = this._handlerIndex(h2[name], type2, handler);\n      if (i < 0) {\n        eventListenerCheck(this, type2);\n        (h2[name] || (h2[name] = [])).push({\n          type: type2,\n          handler\n        });\n      }\n      return this;\n    }\n    // remove an event handler\n    off(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers[name], i = this._handlerIndex(h2, type2, handler);\n      if (i >= 0) {\n        h2.splice(i, 1);\n      }\n      return this;\n    }\n    pickEvent(evt) {\n      const p = point(evt, this._canvas), o = this._origin;\n      return this.pick(this._scene, p[0], p[1], p[0] - o[0], p[1] - o[1]);\n    }\n    // find the scenegraph item at the current pointer position\n    // x, y -- the absolute x, y pointer coordinates on the canvas element\n    // gx, gy -- the relative coordinates within the current group\n    pick(scene, x2, y2, gx, gy) {\n      const g = this.context(), mark = Marks[scene.marktype];\n      return mark.pick.call(this, g, scene, x2, y2, gx, gy);\n    }\n  }\n  const eventBundle = (type2) => type2 === TouchStartEvent || type2 === TouchMoveEvent || type2 === TouchEndEvent ? [TouchStartEvent, TouchMoveEvent, TouchEndEvent] : [type2];\n  function eventListenerCheck(handler, type2) {\n    eventBundle(type2).forEach((_) => addEventListener(handler, _));\n  }\n  function addEventListener(handler, type2) {\n    const canvas = handler.canvas();\n    if (canvas && !handler._events[type2]) {\n      handler._events[type2] = 1;\n      canvas.addEventListener(type2, handler[type2] ? (evt) => handler[type2](evt) : (evt) => handler.fire(type2, evt));\n    }\n  }\n  function fireAll(handler, types, event2) {\n    types.forEach((type2) => handler.fire(type2, event2));\n  }\n  function move(moveEvents, overEvents, outEvents) {\n    return function(evt) {\n      const a2 = this._active, p = this.pickEvent(evt);\n      if (p === a2) {\n        fireAll(this, moveEvents, evt);\n      } else {\n        if (!a2 || !a2.exit) {\n          fireAll(this, outEvents, evt);\n        }\n        this._active = p;\n        fireAll(this, overEvents, evt);\n        fireAll(this, moveEvents, evt);\n      }\n    };\n  }\n  function inactive(types) {\n    return function(evt) {\n      fireAll(this, types, evt);\n      this._active = null;\n    };\n  }\n  function devicePixelRatio$1() {\n    return typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1;\n  }\n  function resize(canvas, width2, height2, origin, scaleFactor, opt) {\n    const inDOM = typeof HTMLElement !== \"undefined\" && canvas instanceof HTMLElement && canvas.parentNode != null, context2 = canvas.getContext(\"2d\"), ratio = inDOM ? devicePixelRatio$1() : scaleFactor;\n    canvas.width = width2 * ratio;\n    canvas.height = height2 * ratio;\n    for (const key2 in opt) {\n      context2[key2] = opt[key2];\n    }\n    if (inDOM && ratio !== 1) {\n      canvas.style.width = width2 + \"px\";\n      canvas.style.height = height2 + \"px\";\n    }\n    context2.pixelRatio = ratio;\n    context2.setTransform(ratio, 0, 0, ratio, ratio * origin[0], ratio * origin[1]);\n    return canvas;\n  }\n  class CanvasRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._options = {};\n      this._redraw = false;\n      this._dirty = new Bounds();\n      this._tempb = new Bounds();\n    }\n    initialize(el, width2, height2, origin, scaleFactor, options) {\n      this._options = options || {};\n      this._canvas = this._options.externalContext ? null : domCanvas(1, 1, this._options.type);\n      if (el && this._canvas) {\n        domClear(el, 0).appendChild(this._canvas);\n        this._canvas.setAttribute(\"class\", \"marks\");\n      }\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      if (this._canvas) {\n        resize(this._canvas, this._width, this._height, this._origin, this._scale, this._options.context);\n      } else {\n        const ctx = this._options.externalContext;\n        if (!ctx) error(\"CanvasRenderer is missing a valid canvas or context\");\n        ctx.scale(this._scale, this._scale);\n        ctx.translate(this._origin[0], this._origin[1]);\n      }\n      this._redraw = true;\n      return this;\n    }\n    canvas() {\n      return this._canvas;\n    }\n    context() {\n      return this._options.externalContext || (this._canvas ? this._canvas.getContext(\"2d\") : null);\n    }\n    dirty(item) {\n      const b2 = this._tempb.clear().union(item.bounds);\n      let g = item.mark.group;\n      while (g) {\n        b2.translate(g.x || 0, g.y || 0);\n        g = g.mark.group;\n      }\n      this._dirty.union(b2);\n    }\n    _render(scene, markTypes) {\n      const g = this.context(), o = this._origin, w2 = this._width, h2 = this._height, db = this._dirty, vb = viewBounds(o, w2, h2);\n      g.save();\n      const b2 = this._redraw || db.empty() ? (this._redraw = false, vb.expand(1)) : clipToBounds(g, vb.intersect(db), o);\n      this.clear(-o[0], -o[1], w2, h2);\n      this.draw(g, scene, b2, markTypes);\n      g.restore();\n      db.clear();\n      return this;\n    }\n    draw(ctx, scene, bounds2, markTypes) {\n      if (scene.marktype !== \"group\" && markTypes != null && !markTypes.includes(scene.marktype)) {\n        return;\n      }\n      const mark = Marks[scene.marktype];\n      if (scene.clip) clip$2(ctx, scene);\n      mark.draw.call(this, ctx, scene, bounds2, markTypes);\n      if (scene.clip) ctx.restore();\n    }\n    clear(x2, y2, w2, h2) {\n      const opt = this._options, g = this.context();\n      if (opt.type !== \"pdf\" && !opt.externalContext) {\n        g.clearRect(x2, y2, w2, h2);\n      }\n      if (this._bgcolor != null) {\n        g.fillStyle = this._bgcolor;\n        g.fillRect(x2, y2, w2, h2);\n      }\n    }\n  }\n  const viewBounds = (origin, width2, height2) => new Bounds().set(0, 0, width2, height2).translate(-origin[0], -origin[1]);\n  function clipToBounds(g, b2, origin) {\n    b2.expand(1).round();\n    if (g.pixelRatio % 1) {\n      b2.scale(g.pixelRatio).round().scale(1 / g.pixelRatio);\n    }\n    b2.translate(-(origin[0] % 1), -(origin[1] % 1));\n    g.beginPath();\n    g.rect(b2.x1, b2.y1, b2.width(), b2.height());\n    g.clip();\n    return b2;\n  }\n  class SVGHandler extends Handler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n      const h2 = this;\n      h2._hrefHandler = listener(h2, (evt, item) => {\n        if (item && item.href) h2.handleHref(evt, item, item.href);\n      });\n      h2._tooltipHandler = listener(h2, (evt, item) => {\n        h2.handleTooltip(evt, item, evt.type !== TooltipHideEvent);\n      });\n    }\n    initialize(el, origin, obj2) {\n      let svg = this._svg;\n      if (svg) {\n        svg.removeEventListener(HrefEvent, this._hrefHandler);\n        svg.removeEventListener(TooltipShowEvent, this._tooltipHandler);\n        svg.removeEventListener(TooltipHideEvent, this._tooltipHandler);\n      }\n      this._svg = svg = el && domFind(el, \"svg\");\n      if (svg) {\n        svg.addEventListener(HrefEvent, this._hrefHandler);\n        svg.addEventListener(TooltipShowEvent, this._tooltipHandler);\n        svg.addEventListener(TooltipHideEvent, this._tooltipHandler);\n      }\n      return super.initialize(el, origin, obj2);\n    }\n    canvas() {\n      return this._svg;\n    }\n    // add an event handler\n    on(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers, i = this._handlerIndex(h2[name], type2, handler);\n      if (i < 0) {\n        const x2 = {\n          type: type2,\n          handler,\n          listener: listener(this, handler)\n        };\n        (h2[name] || (h2[name] = [])).push(x2);\n        if (this._svg) {\n          this._svg.addEventListener(name, x2.listener);\n        }\n      }\n      return this;\n    }\n    // remove an event handler\n    off(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers[name], i = this._handlerIndex(h2, type2, handler);\n      if (i >= 0) {\n        if (this._svg) {\n          this._svg.removeEventListener(name, h2[i].listener);\n        }\n        h2.splice(i, 1);\n      }\n      return this;\n    }\n  }\n  const listener = (context2, handler) => (evt) => {\n    let item = evt.target.__data__;\n    item = Array.isArray(item) ? item[0] : item;\n    evt.vegaType = evt.type;\n    handler.call(context2._obj, evt, item);\n  };\n  const ARIA_HIDDEN = \"aria-hidden\";\n  const ARIA_LABEL = \"aria-label\";\n  const ARIA_ROLE = \"role\";\n  const ARIA_ROLEDESCRIPTION = \"aria-roledescription\";\n  const GRAPHICS_OBJECT = \"graphics-object\";\n  const GRAPHICS_SYMBOL = \"graphics-symbol\";\n  const bundle = (role, roledesc, label2) => ({\n    [ARIA_ROLE]: role,\n    [ARIA_ROLEDESCRIPTION]: roledesc,\n    [ARIA_LABEL]: label2 || void 0\n  });\n  const AriaIgnore = toSet([\"axis-domain\", \"axis-grid\", \"axis-label\", \"axis-tick\", \"axis-title\", \"legend-band\", \"legend-entry\", \"legend-gradient\", \"legend-label\", \"legend-title\", \"legend-symbol\", \"title\"]);\n  const AriaGuides = {\n    \"axis\": {\n      desc: \"axis\",\n      caption: axisCaption\n    },\n    \"legend\": {\n      desc: \"legend\",\n      caption: legendCaption\n    },\n    \"title-text\": {\n      desc: \"title\",\n      caption: (item) => `Title text '${titleCaption(item)}'`\n    },\n    \"title-subtitle\": {\n      desc: \"subtitle\",\n      caption: (item) => `Subtitle text '${titleCaption(item)}'`\n    }\n  };\n  const AriaEncode = {\n    ariaRole: ARIA_ROLE,\n    ariaRoleDescription: ARIA_ROLEDESCRIPTION,\n    description: ARIA_LABEL\n  };\n  function ariaItemAttributes(emit2, item) {\n    const hide = item.aria === false;\n    emit2(ARIA_HIDDEN, hide || void 0);\n    if (hide || item.description == null) {\n      for (const prop in AriaEncode) {\n        emit2(AriaEncode[prop], void 0);\n      }\n    } else {\n      const type2 = item.mark.marktype;\n      emit2(ARIA_LABEL, item.description);\n      emit2(ARIA_ROLE, item.ariaRole || (type2 === \"group\" ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL));\n      emit2(ARIA_ROLEDESCRIPTION, item.ariaRoleDescription || `${type2} mark`);\n    }\n  }\n  function ariaMarkAttributes(mark) {\n    return mark.aria === false ? {\n      [ARIA_HIDDEN]: true\n    } : AriaIgnore[mark.role] ? null : AriaGuides[mark.role] ? ariaGuide(mark, AriaGuides[mark.role]) : ariaMark(mark);\n  }\n  function ariaMark(mark) {\n    const type2 = mark.marktype;\n    const recurse2 = type2 === \"group\" || type2 === \"text\" || mark.items.some((_) => _.description != null && _.aria !== false);\n    return bundle(recurse2 ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL, `${type2} mark container`, mark.description);\n  }\n  function ariaGuide(mark, opt) {\n    try {\n      const item = mark.items[0], caption = opt.caption || (() => \"\");\n      return bundle(opt.role || GRAPHICS_SYMBOL, opt.desc, item.description || caption(item));\n    } catch (err) {\n      return null;\n    }\n  }\n  function titleCaption(item) {\n    return array$5(item.text).join(\" \");\n  }\n  function axisCaption(item) {\n    const datum2 = item.datum, orient = item.orient, title = datum2.title ? extractTitle(item) : null, ctx = item.context, scale2 = ctx.scales[datum2.scale].value, locale2 = ctx.dataflow.locale(), type2 = scale2.type, xy = orient === \"left\" || orient === \"right\" ? \"Y\" : \"X\";\n    return `${xy}-axis` + (title ? ` titled '${title}'` : \"\") + ` for a ${isDiscrete(type2) ? \"discrete\" : type2} scale with ${domainCaption(locale2, scale2, item)}`;\n  }\n  function legendCaption(item) {\n    const datum2 = item.datum, title = datum2.title ? extractTitle(item) : null, type2 = `${datum2.type || \"\"} legend`.trim(), scales2 = datum2.scales, props = Object.keys(scales2), ctx = item.context, scale2 = ctx.scales[scales2[props[0]]].value, locale2 = ctx.dataflow.locale();\n    return capitalize(type2) + (title ? ` titled '${title}'` : \"\") + ` for ${channelCaption(props)} with ${domainCaption(locale2, scale2, item)}`;\n  }\n  function extractTitle(item) {\n    try {\n      return array$5(peek$1(item.items).items[0].text).join(\" \");\n    } catch (err) {\n      return null;\n    }\n  }\n  function channelCaption(props) {\n    props = props.map((p) => p + (p === \"fill\" || p === \"stroke\" ? \" color\" : \"\"));\n    return props.length < 2 ? props[0] : props.slice(0, -1).join(\", \") + \" and \" + peek$1(props);\n  }\n  function capitalize(s) {\n    return s.length ? s[0].toUpperCase() + s.slice(1) : s;\n  }\n  const innerText = (val) => (val + \"\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n  const attrText = (val) => innerText(val).replace(/\"/g, \"&quot;\").replace(/\\t/g, \"&#x9;\").replace(/\\n/g, \"&#xA;\").replace(/\\r/g, \"&#xD;\");\n  function markup() {\n    let buf = \"\", outer = \"\", inner = \"\";\n    const stack = [], clear = () => outer = inner = \"\", push2 = (tag) => {\n      if (outer) {\n        buf += `${outer}>${inner}`;\n        clear();\n      }\n      stack.push(tag);\n    }, attr2 = (name, value2) => {\n      if (value2 != null) outer += ` ${name}=\"${attrText(value2)}\"`;\n      return m2;\n    }, m2 = {\n      open(tag, ...attrs) {\n        push2(tag);\n        outer = \"<\" + tag;\n        for (const set2 of attrs) {\n          for (const key2 in set2) attr2(key2, set2[key2]);\n        }\n        return m2;\n      },\n      close() {\n        const tag = stack.pop();\n        if (outer) {\n          buf += outer + (inner ? `>${inner}</${tag}>` : \"/>\");\n        } else {\n          buf += `</${tag}>`;\n        }\n        clear();\n        return m2;\n      },\n      attr: attr2,\n      text: (t) => (inner += innerText(t), m2),\n      toString: () => buf\n    };\n    return m2;\n  }\n  const serializeXML = (node) => _serialize(markup(), node) + \"\";\n  function _serialize(m2, node) {\n    m2.open(node.tagName);\n    if (node.hasAttributes()) {\n      const attrs = node.attributes, n = attrs.length;\n      for (let i = 0; i < n; ++i) {\n        m2.attr(attrs[i].name, attrs[i].value);\n      }\n    }\n    if (node.hasChildNodes()) {\n      const children2 = node.childNodes;\n      for (const child of children2) {\n        child.nodeType === 3 ? m2.text(child.nodeValue) : _serialize(m2, child);\n      }\n    }\n    return m2.close();\n  }\n  const stylesAttr = {\n    fill: \"fill\",\n    fillOpacity: \"fill-opacity\",\n    stroke: \"stroke\",\n    strokeOpacity: \"stroke-opacity\",\n    strokeWidth: \"stroke-width\",\n    strokeCap: \"stroke-linecap\",\n    strokeJoin: \"stroke-linejoin\",\n    strokeDash: \"stroke-dasharray\",\n    strokeDashOffset: \"stroke-dashoffset\",\n    strokeMiterLimit: \"stroke-miterlimit\",\n    opacity: \"opacity\"\n  };\n  const stylesCss = {\n    blend: \"mix-blend-mode\"\n  };\n  const rootAttributes = {\n    \"fill\": \"none\",\n    \"stroke-miterlimit\": 10\n  };\n  const RootIndex = 0, xmlns = \"http://www.w3.org/2000/xmlns/\", svgns = metadata.xmlns;\n  class SVGRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._dirtyID = 0;\n      this._dirty = [];\n      this._svg = null;\n      this._root = null;\n      this._defs = null;\n    }\n    /**\n     * Initialize a new SVGRenderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._defs = {};\n      this._clearDefs();\n      if (el) {\n        this._svg = domChild(el, 0, \"svg\", svgns);\n        this._svg.setAttributeNS(xmlns, \"xmlns\", svgns);\n        this._svg.setAttributeNS(xmlns, \"xmlns:xlink\", metadata[\"xmlns:xlink\"]);\n        this._svg.setAttribute(\"version\", metadata[\"version\"]);\n        this._svg.setAttribute(\"class\", \"marks\");\n        domClear(el, 1);\n        this._root = domChild(this._svg, RootIndex, \"g\", svgns);\n        setAttributes(this._root, rootAttributes);\n        domClear(this._svg, RootIndex + 1);\n      }\n      this.background(this._bgcolor);\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Get / set the background color.\n     */\n    background(bgcolor) {\n      if (arguments.length && this._svg) {\n        this._svg.style.setProperty(\"background-color\", bgcolor);\n      }\n      return super.background(...arguments);\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      if (this._svg) {\n        setAttributes(this._svg, {\n          width: this._width * this._scale,\n          height: this._height * this._scale,\n          viewBox: `0 0 ${this._width} ${this._height}`\n        });\n        this._root.setAttribute(\"transform\", `translate(${this._origin})`);\n      }\n      this._dirty = [];\n      return this;\n    }\n    /**\n     * Returns the SVG element of the visualization.\n     * @return {DOMElement} - The SVG element.\n     */\n    canvas() {\n      return this._svg;\n    }\n    /**\n     * Returns an SVG text string for the rendered content,\n     * or null if this renderer is currently headless.\n     */\n    svg() {\n      const svg = this._svg, bg = this._bgcolor;\n      if (!svg) return null;\n      let node;\n      if (bg) {\n        svg.removeAttribute(\"style\");\n        node = domChild(svg, RootIndex, \"rect\", svgns);\n        setAttributes(node, {\n          width: this._width,\n          height: this._height,\n          fill: bg\n        });\n      }\n      const text2 = serializeXML(svg);\n      if (bg) {\n        svg.removeChild(node);\n        this._svg.style.setProperty(\"background-color\", bg);\n      }\n      return text2;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render(scene, markTypes) {\n      if (this._dirtyCheck()) {\n        if (this._dirtyAll) this._clearDefs();\n        this.mark(this._root, scene, void 0, markTypes);\n        domClear(this._root, 1);\n      }\n      this.defs();\n      this._dirty = [];\n      ++this._dirtyID;\n      return this;\n    }\n    // -- Manage rendering of items marked as dirty --\n    /**\n     * Flag a mark item as dirty.\n     * @param {Item} item - The mark item.\n     */\n    dirty(item) {\n      if (item.dirty !== this._dirtyID) {\n        item.dirty = this._dirtyID;\n        this._dirty.push(item);\n      }\n    }\n    /**\n     * Check if a mark item is considered dirty.\n     * @param {Item} item - The mark item.\n     */\n    isDirty(item) {\n      return this._dirtyAll || !item._svg || !item._svg.ownerSVGElement || item.dirty === this._dirtyID;\n    }\n    /**\n     * Internal method to check dirty status and, if possible,\n     * make targetted updates without a full rendering pass.\n     */\n    _dirtyCheck() {\n      this._dirtyAll = true;\n      const items = this._dirty;\n      if (!items.length || !this._dirtyID) return true;\n      const id2 = ++this._dirtyID;\n      let item, mark, type2, mdef, i, n, o;\n      for (i = 0, n = items.length; i < n; ++i) {\n        item = items[i];\n        mark = item.mark;\n        if (mark.marktype !== type2) {\n          type2 = mark.marktype;\n          mdef = Marks[type2];\n        }\n        if (mark.zdirty && mark.dirty !== id2) {\n          this._dirtyAll = false;\n          dirtyParents(item, id2);\n          mark.items.forEach((i2) => {\n            i2.dirty = id2;\n          });\n        }\n        if (mark.zdirty) continue;\n        if (item.exit) {\n          if (mdef.nested && mark.items.length) {\n            o = mark.items[0];\n            if (o._svg) this._update(mdef, o._svg, o);\n          } else if (item._svg) {\n            o = item._svg.parentNode;\n            if (o) o.removeChild(item._svg);\n          }\n          item._svg = null;\n          continue;\n        }\n        item = mdef.nested ? mark.items[0] : item;\n        if (item._update === id2) continue;\n        if (!item._svg || !item._svg.ownerSVGElement) {\n          this._dirtyAll = false;\n          dirtyParents(item, id2);\n        } else {\n          this._update(mdef, item._svg, item);\n        }\n        item._update = id2;\n      }\n      return !this._dirtyAll;\n    }\n    // -- Construct & maintain scenegraph to SVG mapping ---\n    /**\n     * Render a set of mark items.\n     * @param {SVGElement} el - The parent element in the SVG tree.\n     * @param {object} scene - The mark parent to render.\n     * @param {SVGElement} prev - The previous sibling in the SVG tree.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    mark(el, scene, prev, markTypes) {\n      if (!this.isDirty(scene)) {\n        return scene._svg;\n      }\n      const svg = this._svg, markType2 = scene.marktype, mdef = Marks[markType2], events2 = scene.interactive === false ? \"none\" : null, isGroup = mdef.tag === \"g\";\n      const parent = bind$1(scene, el, prev, \"g\", svg);\n      if (markType2 !== \"group\" && markTypes != null && !markTypes.includes(markType2)) {\n        domClear(parent, 0);\n        return scene._svg;\n      }\n      parent.setAttribute(\"class\", cssClass(scene));\n      const aria = ariaMarkAttributes(scene);\n      for (const key2 in aria) setAttribute$1(parent, key2, aria[key2]);\n      if (!isGroup) {\n        setAttribute$1(parent, \"pointer-events\", events2);\n      }\n      setAttribute$1(parent, \"clip-path\", scene.clip ? clip$1$1(this, scene, scene.group) : null);\n      let sibling = null, i = 0;\n      const process = (item) => {\n        const dirty = this.isDirty(item), node = bind$1(item, parent, sibling, mdef.tag, svg);\n        if (dirty) {\n          this._update(mdef, node, item);\n          if (isGroup) recurse(this, node, item, markTypes);\n        }\n        sibling = node;\n        ++i;\n      };\n      if (mdef.nested) {\n        if (scene.items.length) process(scene.items[0]);\n      } else {\n        visit(scene, process);\n      }\n      domClear(parent, i);\n      return parent;\n    }\n    /**\n     * Update the attributes of an SVG element for a mark item.\n     * @param {object} mdef - The mark definition object\n     * @param {SVGElement} el - The SVG element.\n     * @param {Item} item - The mark item.\n     */\n    _update(mdef, el, item) {\n      element$1 = el;\n      values = el.__values__;\n      ariaItemAttributes(emit, item);\n      mdef.attr(emit, item, this);\n      const extra = mark_extras[mdef.type];\n      if (extra) extra.call(this, mdef, el, item);\n      if (element$1) this.style(element$1, item);\n    }\n    /**\n     * Update the presentation attributes of an SVG element for a mark item.\n     * @param {SVGElement} el - The SVG element.\n     * @param {Item} item - The mark item.\n     */\n    style(el, item) {\n      if (item == null) return;\n      for (const prop in stylesAttr) {\n        let value2 = prop === \"font\" ? fontFamily(item) : item[prop];\n        if (value2 === values[prop]) continue;\n        const name = stylesAttr[prop];\n        if (value2 == null) {\n          el.removeAttribute(name);\n        } else {\n          if (isGradient(value2)) {\n            value2 = gradientRef(value2, this._defs.gradient, href());\n          }\n          el.setAttribute(name, value2 + \"\");\n        }\n        values[prop] = value2;\n      }\n      for (const prop in stylesCss) {\n        setStyle(el, stylesCss[prop], item[prop]);\n      }\n    }\n    /**\n     * Render SVG defs, as needed.\n     * Must be called *after* marks have been processed to ensure the\n     * collected state is current and accurate.\n     */\n    defs() {\n      const svg = this._svg, defs = this._defs;\n      let el = defs.el, index2 = 0;\n      for (const id2 in defs.gradient) {\n        if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n        index2 = updateGradient(el, defs.gradient[id2], index2);\n      }\n      for (const id2 in defs.clipping) {\n        if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n        index2 = updateClipping(el, defs.clipping[id2], index2);\n      }\n      if (el) {\n        index2 === 0 ? (svg.removeChild(el), defs.el = null) : domClear(el, index2);\n      }\n    }\n    /**\n     * Clear defs caches.\n     */\n    _clearDefs() {\n      const def2 = this._defs;\n      def2.gradient = {};\n      def2.clipping = {};\n    }\n  }\n  function dirtyParents(item, id2) {\n    for (; item && item.dirty !== id2; item = item.mark.group) {\n      item.dirty = id2;\n      if (item.mark && item.mark.dirty !== id2) {\n        item.mark.dirty = id2;\n      } else return;\n    }\n  }\n  function updateGradient(el, grad, index2) {\n    let i, n, stop2;\n    if (grad.gradient === \"radial\") {\n      let pt = domChild(el, index2++, \"pattern\", svgns);\n      setAttributes(pt, {\n        id: patternPrefix + grad.id,\n        viewBox: \"0,0,1,1\",\n        width: \"100%\",\n        height: \"100%\",\n        preserveAspectRatio: \"xMidYMid slice\"\n      });\n      pt = domChild(pt, 0, \"rect\", svgns);\n      setAttributes(pt, {\n        width: 1,\n        height: 1,\n        fill: `url(${href()}#${grad.id})`\n      });\n      el = domChild(el, index2++, \"radialGradient\", svgns);\n      setAttributes(el, {\n        id: grad.id,\n        fx: grad.x1,\n        fy: grad.y1,\n        fr: grad.r1,\n        cx: grad.x2,\n        cy: grad.y2,\n        r: grad.r2\n      });\n    } else {\n      el = domChild(el, index2++, \"linearGradient\", svgns);\n      setAttributes(el, {\n        id: grad.id,\n        x1: grad.x1,\n        x2: grad.x2,\n        y1: grad.y1,\n        y2: grad.y2\n      });\n    }\n    for (i = 0, n = grad.stops.length; i < n; ++i) {\n      stop2 = domChild(el, i, \"stop\", svgns);\n      stop2.setAttribute(\"offset\", grad.stops[i].offset);\n      stop2.setAttribute(\"stop-color\", grad.stops[i].color);\n    }\n    domClear(el, i);\n    return index2;\n  }\n  function updateClipping(el, clip2, index2) {\n    let mask;\n    el = domChild(el, index2, \"clipPath\", svgns);\n    el.setAttribute(\"id\", clip2.id);\n    if (clip2.path) {\n      mask = domChild(el, 0, \"path\", svgns);\n      mask.setAttribute(\"d\", clip2.path);\n    } else {\n      mask = domChild(el, 0, \"rect\", svgns);\n      setAttributes(mask, {\n        x: 0,\n        y: 0,\n        width: clip2.width,\n        height: clip2.height\n      });\n    }\n    domClear(el, 1);\n    return index2 + 1;\n  }\n  function recurse(renderer, el, group2, markTypes) {\n    el = el.lastChild.previousSibling;\n    let prev, idx = 0;\n    visit(group2, (item) => {\n      prev = renderer.mark(el, item, prev, markTypes);\n      ++idx;\n    });\n    domClear(el, 1 + idx);\n  }\n  function bind$1(item, el, sibling, tag, svg) {\n    let node = item._svg, doc;\n    if (!node) {\n      doc = el.ownerDocument;\n      node = domCreate(doc, tag, svgns);\n      item._svg = node;\n      if (item.mark) {\n        node.__data__ = item;\n        node.__values__ = {\n          fill: \"default\"\n        };\n        if (tag === \"g\") {\n          const bg = domCreate(doc, \"path\", svgns);\n          node.appendChild(bg);\n          bg.__data__ = item;\n          const cg = domCreate(doc, \"g\", svgns);\n          node.appendChild(cg);\n          cg.__data__ = item;\n          const fg = domCreate(doc, \"path\", svgns);\n          node.appendChild(fg);\n          fg.__data__ = item;\n          fg.__values__ = {\n            fill: \"default\"\n          };\n        }\n      }\n    }\n    if (node.ownerSVGElement !== svg || siblingCheck(node, sibling)) {\n      el.insertBefore(node, sibling ? sibling.nextSibling : el.firstChild);\n    }\n    return node;\n  }\n  function siblingCheck(node, sibling) {\n    return node.parentNode && node.parentNode.childNodes.length > 1 && node.previousSibling != sibling;\n  }\n  let element$1 = null, values = null;\n  const mark_extras = {\n    group(mdef, el, item) {\n      const fg = element$1 = el.childNodes[2];\n      values = fg.__values__;\n      mdef.foreground(emit, item, this);\n      values = el.__values__;\n      element$1 = el.childNodes[1];\n      mdef.content(emit, item, this);\n      const bg = element$1 = el.childNodes[0];\n      mdef.background(emit, item, this);\n      const value2 = item.mark.interactive === false ? \"none\" : null;\n      if (value2 !== values.events) {\n        setAttribute$1(fg, \"pointer-events\", value2);\n        setAttribute$1(bg, \"pointer-events\", value2);\n        values.events = value2;\n      }\n      if (item.strokeForeground && item.stroke) {\n        const fill2 = item.fill;\n        setAttribute$1(fg, \"display\", null);\n        this.style(bg, item);\n        setAttribute$1(bg, \"stroke\", null);\n        if (fill2) item.fill = null;\n        values = fg.__values__;\n        this.style(fg, item);\n        if (fill2) item.fill = fill2;\n        element$1 = null;\n      } else {\n        setAttribute$1(fg, \"display\", \"none\");\n      }\n    },\n    image(mdef, el, item) {\n      if (item.smooth === false) {\n        setStyle(el, \"image-rendering\", \"optimizeSpeed\");\n        setStyle(el, \"image-rendering\", \"pixelated\");\n      } else {\n        setStyle(el, \"image-rendering\", null);\n      }\n    },\n    text(mdef, el, item) {\n      const tl2 = textLines(item);\n      let key2, value2, doc, lh;\n      if (isArray(tl2)) {\n        value2 = tl2.map((_) => textValue(item, _));\n        key2 = value2.join(\"\\n\");\n        if (key2 !== values.text) {\n          domClear(el, 0);\n          doc = el.ownerDocument;\n          lh = lineHeight(item);\n          value2.forEach((t, i) => {\n            const ts2 = domCreate(doc, \"tspan\", svgns);\n            ts2.__data__ = item;\n            ts2.textContent = t;\n            if (i) {\n              ts2.setAttribute(\"x\", 0);\n              ts2.setAttribute(\"dy\", lh);\n            }\n            el.appendChild(ts2);\n          });\n          values.text = key2;\n        }\n      } else {\n        value2 = textValue(item, tl2);\n        if (value2 !== values.text) {\n          el.textContent = value2;\n          values.text = value2;\n        }\n      }\n      setAttribute$1(el, \"font-family\", fontFamily(item));\n      setAttribute$1(el, \"font-size\", fontSize(item) + \"px\");\n      setAttribute$1(el, \"font-style\", item.fontStyle);\n      setAttribute$1(el, \"font-variant\", item.fontVariant);\n      setAttribute$1(el, \"font-weight\", item.fontWeight);\n    }\n  };\n  function emit(name, value2, ns) {\n    if (value2 === values[name]) return;\n    if (ns) {\n      setAttributeNS(element$1, name, value2, ns);\n    } else {\n      setAttribute$1(element$1, name, value2);\n    }\n    values[name] = value2;\n  }\n  function setStyle(el, name, value2) {\n    if (value2 !== values[name]) {\n      if (value2 == null) {\n        el.style.removeProperty(name);\n      } else {\n        el.style.setProperty(name, value2 + \"\");\n      }\n      values[name] = value2;\n    }\n  }\n  function setAttributes(el, attrs) {\n    for (const key2 in attrs) {\n      setAttribute$1(el, key2, attrs[key2]);\n    }\n  }\n  function setAttribute$1(el, name, value2) {\n    if (value2 != null) {\n      el.setAttribute(name, value2);\n    } else {\n      el.removeAttribute(name);\n    }\n  }\n  function setAttributeNS(el, name, value2, ns) {\n    if (value2 != null) {\n      el.setAttributeNS(ns, name, value2);\n    } else {\n      el.removeAttributeNS(ns, name);\n    }\n  }\n  function href() {\n    let loc;\n    return typeof window === \"undefined\" ? \"\" : (loc = window.location).hash ? loc.href.slice(0, -loc.hash.length) : loc.href;\n  }\n  class SVGStringRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._text = null;\n      this._defs = {\n        gradient: {},\n        clipping: {}\n      };\n    }\n    /**\n     * Returns the rendered SVG text string,\n     * or null if rendering has not yet occurred.\n     */\n    svg() {\n      return this._text;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     */\n    _render(scene) {\n      const m2 = markup();\n      m2.open(\"svg\", extend$1({}, metadata, {\n        class: \"marks\",\n        width: this._width * this._scale,\n        height: this._height * this._scale,\n        viewBox: `0 0 ${this._width} ${this._height}`\n      }));\n      const bg = this._bgcolor;\n      if (bg && bg !== \"transparent\" && bg !== \"none\") {\n        m2.open(\"rect\", {\n          width: this._width,\n          height: this._height,\n          fill: bg\n        }).close();\n      }\n      m2.open(\"g\", rootAttributes, {\n        transform: \"translate(\" + this._origin + \")\"\n      });\n      this.mark(m2, scene);\n      m2.close();\n      this.defs(m2);\n      this._text = m2.close() + \"\";\n      return this;\n    }\n    /**\n     * Render a set of mark items.\n     * @param {object} m - The markup context.\n     * @param {object} scene - The mark parent to render.\n     */\n    mark(m2, scene) {\n      const mdef = Marks[scene.marktype], tag = mdef.tag, attrList = [ariaItemAttributes, mdef.attr];\n      m2.open(\"g\", {\n        \"class\": cssClass(scene),\n        \"clip-path\": scene.clip ? clip$1$1(this, scene, scene.group) : null\n      }, ariaMarkAttributes(scene), {\n        \"pointer-events\": tag !== \"g\" && scene.interactive === false ? \"none\" : null\n      });\n      const process = (item) => {\n        const href2 = this.href(item);\n        if (href2) m2.open(\"a\", href2);\n        m2.open(tag, this.attr(scene, item, attrList, tag !== \"g\" ? tag : null));\n        if (tag === \"text\") {\n          const tl2 = textLines(item);\n          if (isArray(tl2)) {\n            const attrs = {\n              x: 0,\n              dy: lineHeight(item)\n            };\n            for (let i = 0; i < tl2.length; ++i) {\n              m2.open(\"tspan\", i ? attrs : null).text(textValue(item, tl2[i])).close();\n            }\n          } else {\n            m2.text(textValue(item, tl2));\n          }\n        } else if (tag === \"g\") {\n          const fore = item.strokeForeground, fill2 = item.fill, stroke2 = item.stroke;\n          if (fore && stroke2) {\n            item.stroke = null;\n          }\n          m2.open(\"path\", this.attr(scene, item, mdef.background, \"bgrect\")).close();\n          m2.open(\"g\", this.attr(scene, item, mdef.content));\n          visit(item, (scene2) => this.mark(m2, scene2));\n          m2.close();\n          if (fore && stroke2) {\n            if (fill2) item.fill = null;\n            item.stroke = stroke2;\n            m2.open(\"path\", this.attr(scene, item, mdef.foreground, \"bgrect\")).close();\n            if (fill2) item.fill = fill2;\n          } else {\n            m2.open(\"path\", this.attr(scene, item, mdef.foreground, \"bgfore\")).close();\n          }\n        }\n        m2.close();\n        if (href2) m2.close();\n      };\n      if (mdef.nested) {\n        if (scene.items && scene.items.length) process(scene.items[0]);\n      } else {\n        visit(scene, process);\n      }\n      return m2.close();\n    }\n    /**\n     * Get href attributes for a hyperlinked mark item.\n     * @param {Item} item - The mark item.\n     */\n    href(item) {\n      const href2 = item.href;\n      let attr2;\n      if (href2) {\n        if (attr2 = this._hrefs && this._hrefs[href2]) {\n          return attr2;\n        } else {\n          this.sanitizeURL(href2).then((attr3) => {\n            attr3[\"xlink:href\"] = attr3.href;\n            attr3.href = null;\n            (this._hrefs || (this._hrefs = {}))[href2] = attr3;\n          });\n        }\n      }\n      return null;\n    }\n    /**\n     * Get an object of SVG attributes for a mark item.\n     * @param {object} scene - The mark parent.\n     * @param {Item} item - The mark item.\n     * @param {array|function} attrs - One or more attribute emitters.\n     * @param {string} tag - The tag being rendered.\n     */\n    attr(scene, item, attrs, tag) {\n      const object2 = {}, emit2 = (name, value2, ns, prefixed) => {\n        object2[prefixed || name] = value2;\n      };\n      if (Array.isArray(attrs)) {\n        attrs.forEach((fn2) => fn2(emit2, item, this));\n      } else {\n        attrs(emit2, item, this);\n      }\n      if (tag) {\n        style(object2, item, scene, tag, this._defs);\n      }\n      return object2;\n    }\n    /**\n     * Render SVG defs, as needed.\n     * Must be called *after* marks have been processed to ensure the\n     * collected state is current and accurate.\n     * @param {object} m - The markup context.\n     */\n    defs(m2) {\n      const gradient2 = this._defs.gradient, clipping = this._defs.clipping, count2 = Object.keys(gradient2).length + Object.keys(clipping).length;\n      if (count2 === 0) return;\n      m2.open(\"defs\");\n      for (const id2 in gradient2) {\n        const def2 = gradient2[id2], stops = def2.stops;\n        if (def2.gradient === \"radial\") {\n          m2.open(\"pattern\", {\n            id: patternPrefix + id2,\n            viewBox: \"0,0,1,1\",\n            width: \"100%\",\n            height: \"100%\",\n            preserveAspectRatio: \"xMidYMid slice\"\n          });\n          m2.open(\"rect\", {\n            width: \"1\",\n            height: \"1\",\n            fill: \"url(#\" + id2 + \")\"\n          }).close();\n          m2.close();\n          m2.open(\"radialGradient\", {\n            id: id2,\n            fx: def2.x1,\n            fy: def2.y1,\n            fr: def2.r1,\n            cx: def2.x2,\n            cy: def2.y2,\n            r: def2.r2\n          });\n        } else {\n          m2.open(\"linearGradient\", {\n            id: id2,\n            x1: def2.x1,\n            x2: def2.x2,\n            y1: def2.y1,\n            y2: def2.y2\n          });\n        }\n        for (let i = 0; i < stops.length; ++i) {\n          m2.open(\"stop\", {\n            offset: stops[i].offset,\n            \"stop-color\": stops[i].color\n          }).close();\n        }\n        m2.close();\n      }\n      for (const id2 in clipping) {\n        const def2 = clipping[id2];\n        m2.open(\"clipPath\", {\n          id: id2\n        });\n        if (def2.path) {\n          m2.open(\"path\", {\n            d: def2.path\n          }).close();\n        } else {\n          m2.open(\"rect\", {\n            x: 0,\n            y: 0,\n            width: def2.width,\n            height: def2.height\n          }).close();\n        }\n        m2.close();\n      }\n      m2.close();\n    }\n  }\n  function style(s, item, scene, tag, defs) {\n    let styleList;\n    if (item == null) return s;\n    if (tag === \"bgrect\" && scene.interactive === false) {\n      s[\"pointer-events\"] = \"none\";\n    }\n    if (tag === \"bgfore\") {\n      if (scene.interactive === false) {\n        s[\"pointer-events\"] = \"none\";\n      }\n      s.display = \"none\";\n      if (item.fill !== null) return s;\n    }\n    if (tag === \"image\" && item.smooth === false) {\n      styleList = [\"image-rendering: optimizeSpeed;\", \"image-rendering: pixelated;\"];\n    }\n    if (tag === \"text\") {\n      s[\"font-family\"] = fontFamily(item);\n      s[\"font-size\"] = fontSize(item) + \"px\";\n      s[\"font-style\"] = item.fontStyle;\n      s[\"font-variant\"] = item.fontVariant;\n      s[\"font-weight\"] = item.fontWeight;\n    }\n    for (const prop in stylesAttr) {\n      let value2 = item[prop];\n      const name = stylesAttr[prop];\n      if (value2 === \"transparent\" && (name === \"fill\" || name === \"stroke\")) ;\n      else if (value2 != null) {\n        if (isGradient(value2)) {\n          value2 = gradientRef(value2, defs.gradient, \"\");\n        }\n        s[name] = value2;\n      }\n    }\n    for (const prop in stylesCss) {\n      const value2 = item[prop];\n      if (value2 != null) {\n        styleList = styleList || [];\n        styleList.push(`${stylesCss[prop]}: ${value2};`);\n      }\n    }\n    if (styleList) {\n      s.style = styleList.join(\" \");\n    }\n    return s;\n  }\n  const OPTS = {\n    svgMarkTypes: [\"text\"],\n    svgOnTop: true,\n    debug: false\n  };\n  function setHybridRendererOptions(options) {\n    OPTS[\"svgMarkTypes\"] = options.svgMarkTypes ?? [\"text\"];\n    OPTS[\"svgOnTop\"] = options.svgOnTop ?? true;\n    OPTS[\"debug\"] = options.debug ?? false;\n  }\n  class HybridRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._svgRenderer = new SVGRenderer(loader2);\n      this._canvasRenderer = new CanvasRenderer(loader2);\n    }\n    /**\n     * Initialize a new HybridRenderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {HybridRenderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._root_el = domChild(el, 0, \"div\");\n      const bottomEl = domChild(this._root_el, 0, \"div\");\n      const topEl = domChild(this._root_el, 1, \"div\");\n      this._root_el.style.position = \"relative\";\n      if (!OPTS.debug) {\n        bottomEl.style.height = \"100%\";\n        topEl.style.position = \"absolute\";\n        topEl.style.top = \"0\";\n        topEl.style.left = \"0\";\n        topEl.style.height = \"100%\";\n        topEl.style.width = \"100%\";\n      }\n      this._svgEl = OPTS.svgOnTop ? topEl : bottomEl;\n      this._canvasEl = OPTS.svgOnTop ? bottomEl : topEl;\n      this._svgEl.style.pointerEvents = \"none\";\n      this._canvasRenderer.initialize(this._canvasEl, width2, height2, origin, scaleFactor);\n      this._svgRenderer.initialize(this._svgEl, width2, height2, origin, scaleFactor);\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Flag a mark item as dirty.\n     * @param {Item} item - The mark item.\n     */\n    dirty(item) {\n      if (OPTS.svgMarkTypes.includes(item.mark.marktype)) {\n        this._svgRenderer.dirty(item);\n      } else {\n        this._canvasRenderer.dirty(item);\n      }\n      return this;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render(scene, markTypes) {\n      const allMarkTypes = markTypes ?? [\"arc\", \"area\", \"image\", \"line\", \"path\", \"rect\", \"rule\", \"shape\", \"symbol\", \"text\", \"trail\"];\n      const canvasMarkTypes = allMarkTypes.filter((m2) => !OPTS.svgMarkTypes.includes(m2));\n      this._svgRenderer.render(scene, OPTS.svgMarkTypes);\n      this._canvasRenderer.render(scene, canvasMarkTypes);\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      this._svgRenderer.resize(width2, height2, origin, scaleFactor);\n      this._canvasRenderer.resize(width2, height2, origin, scaleFactor);\n      return this;\n    }\n    background(bgcolor) {\n      if (OPTS.svgOnTop) {\n        this._canvasRenderer.background(bgcolor);\n      } else {\n        this._svgRenderer.background(bgcolor);\n      }\n      return this;\n    }\n  }\n  class HybridHandler extends CanvasHandler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n    }\n    initialize(el, origin, obj2) {\n      const canvas = domChild(domChild(el, 0, \"div\"), OPTS.svgOnTop ? 0 : 1, \"div\");\n      return super.initialize(canvas, origin, obj2);\n    }\n  }\n  const Canvas = \"canvas\";\n  const Hybrid = \"hybrid\";\n  const PNG = \"png\";\n  const SVG = \"svg\";\n  const None$1 = \"none\";\n  const RenderType = {\n    Canvas,\n    PNG,\n    SVG,\n    Hybrid,\n    None: None$1\n  };\n  const modules = {};\n  modules[Canvas] = modules[PNG] = {\n    renderer: CanvasRenderer,\n    headless: CanvasRenderer,\n    handler: CanvasHandler\n  };\n  modules[SVG] = {\n    renderer: SVGRenderer,\n    headless: SVGStringRenderer,\n    handler: SVGHandler\n  };\n  modules[Hybrid] = {\n    renderer: HybridRenderer,\n    headless: HybridRenderer,\n    handler: HybridHandler\n  };\n  modules[None$1] = {};\n  function renderModule(name, _) {\n    name = String(name || \"\").toLowerCase();\n    if (arguments.length > 1) {\n      modules[name] = _;\n      return this;\n    } else {\n      return modules[name];\n    }\n  }\n  function intersect$2(scene, bounds2, filter2) {\n    const hits = [], box2 = new Bounds().union(bounds2), type2 = scene.marktype;\n    return type2 ? intersectMark(scene, box2, filter2, hits) : type2 === \"group\" ? intersectGroup(scene, box2, filter2, hits) : error(\"Intersect scene must be mark node or group item.\");\n  }\n  function intersectMark(mark, box2, filter2, hits) {\n    if (visitMark(mark, box2, filter2)) {\n      const items = mark.items, type2 = mark.marktype, n = items.length;\n      let i = 0;\n      if (type2 === \"group\") {\n        for (; i < n; ++i) {\n          intersectGroup(items[i], box2, filter2, hits);\n        }\n      } else {\n        for (const test2 = Marks[type2].isect; i < n; ++i) {\n          const item = items[i];\n          if (intersectItem(item, box2, test2)) hits.push(item);\n        }\n      }\n    }\n    return hits;\n  }\n  function visitMark(mark, box2, filter2) {\n    return mark.bounds && box2.intersects(mark.bounds) && (mark.marktype === \"group\" || mark.interactive !== false && (!filter2 || filter2(mark)));\n  }\n  function intersectGroup(group2, box2, filter2, hits) {\n    if (filter2 && filter2(group2.mark) && intersectItem(group2, box2, Marks.group.isect)) {\n      hits.push(group2);\n    }\n    const marks = group2.items, n = marks && marks.length;\n    if (n) {\n      const x2 = group2.x || 0, y2 = group2.y || 0;\n      box2.translate(-x2, -y2);\n      for (let i = 0; i < n; ++i) {\n        intersectMark(marks[i], box2, filter2, hits);\n      }\n      box2.translate(x2, y2);\n    }\n    return hits;\n  }\n  function intersectItem(item, box2, test2) {\n    const bounds2 = item.bounds;\n    return box2.encloses(bounds2) || box2.intersects(bounds2) && test2(item, box2);\n  }\n  const clipBounds = new Bounds();\n  function boundClip(mark) {\n    const clip2 = mark.clip;\n    if (isFunction(clip2)) {\n      clip2(boundContext(clipBounds.clear()));\n    } else if (clip2) {\n      clipBounds.set(0, 0, mark.group.width, mark.group.height);\n    } else return;\n    mark.bounds.intersect(clipBounds);\n  }\n  const TOLERANCE = 1e-9;\n  function sceneEqual(a2, b2, key2) {\n    return a2 === b2 ? true : key2 === \"path\" ? pathEqual(a2, b2) : a2 instanceof Date && b2 instanceof Date ? +a2 === +b2 : isNumber$1(a2) && isNumber$1(b2) ? Math.abs(a2 - b2) <= TOLERANCE : !a2 || !b2 || !isObject$1(a2) && !isObject$1(b2) ? a2 == b2 : objectEqual(a2, b2);\n  }\n  function pathEqual(a2, b2) {\n    return sceneEqual(parse$3(a2), parse$3(b2));\n  }\n  function objectEqual(a2, b2) {\n    var ka = Object.keys(a2), kb = Object.keys(b2), key2, i;\n    if (ka.length !== kb.length) return false;\n    ka.sort();\n    kb.sort();\n    for (i = ka.length - 1; i >= 0; i--) {\n      if (ka[i] != kb[i]) return false;\n    }\n    for (i = ka.length - 1; i >= 0; i--) {\n      key2 = ka[i];\n      if (!sceneEqual(a2[key2], b2[key2], key2)) return false;\n    }\n    return typeof a2 === typeof b2;\n  }\n  function resetSVGDefIds() {\n    resetSVGClipId();\n    resetSVGGradientId();\n  }\n  const Top$1 = \"top\";\n  const Left$1 = \"left\";\n  const Right$1 = \"right\";\n  const Bottom$1 = \"bottom\";\n  const TopLeft = \"top-left\";\n  const TopRight = \"top-right\";\n  const BottomLeft = \"bottom-left\";\n  const BottomRight = \"bottom-right\";\n  const Start$1 = \"start\";\n  const Middle$1 = \"middle\";\n  const End$1 = \"end\";\n  const X = \"x\";\n  const Y = \"y\";\n  const Group = \"group\";\n  const AxisRole$1 = \"axis\";\n  const TitleRole$1 = \"title\";\n  const FrameRole$1 = \"frame\";\n  const ScopeRole$1 = \"scope\";\n  const LegendRole$1 = \"legend\";\n  const RowHeader = \"row-header\";\n  const RowFooter = \"row-footer\";\n  const RowTitle = \"row-title\";\n  const ColHeader = \"column-header\";\n  const ColFooter = \"column-footer\";\n  const ColTitle = \"column-title\";\n  const Padding$1 = \"padding\";\n  const Symbols$1 = \"symbol\";\n  const Fit = \"fit\";\n  const FitX = \"fit-x\";\n  const FitY = \"fit-y\";\n  const Pad = \"pad\";\n  const None = \"none\";\n  const All = \"all\";\n  const Each = \"each\";\n  const Flush = \"flush\";\n  const Column = \"column\";\n  const Row = \"row\";\n  function Bound$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Bound$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow, mark = _.mark, type2 = mark.marktype, entry2 = Marks[type2], bound2 = entry2.bound;\n      let markBounds = mark.bounds, rebound;\n      if (entry2.nested) {\n        if (mark.items.length) view.dirty(mark.items[0]);\n        markBounds = boundItem(mark, bound2);\n        mark.items.forEach((item) => {\n          item.bounds.clear().union(markBounds);\n        });\n      } else if (type2 === Group || _.modified()) {\n        pulse2.visit(pulse2.MOD, (item) => view.dirty(item));\n        markBounds.clear();\n        mark.items.forEach((item) => markBounds.union(boundItem(item, bound2)));\n        switch (mark.role) {\n          case AxisRole$1:\n          case LegendRole$1:\n          case TitleRole$1:\n            pulse2.reflow();\n        }\n      } else {\n        rebound = pulse2.changed(pulse2.REM);\n        pulse2.visit(pulse2.ADD, (item) => {\n          markBounds.union(boundItem(item, bound2));\n        });\n        pulse2.visit(pulse2.MOD, (item) => {\n          rebound = rebound || markBounds.alignsWith(item.bounds);\n          view.dirty(item);\n          markBounds.union(boundItem(item, bound2));\n        });\n        if (rebound) {\n          markBounds.clear();\n          mark.items.forEach((item) => markBounds.union(item.bounds));\n        }\n      }\n      boundClip(mark);\n      return pulse2.modifies(\"bounds\");\n    }\n  });\n  function boundItem(item, bound2, opt) {\n    return bound2(item.bounds.clear(), item, opt);\n  }\n  const COUNTER_NAME = \":vega_identifier:\";\n  function Identifier$1(params2) {\n    Transform.call(this, 0, params2);\n  }\n  Identifier$1.Definition = {\n    \"type\": \"Identifier\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"required\": true\n    }]\n  };\n  inherits(Identifier$1, Transform, {\n    transform(_, pulse2) {\n      const counter = getCounter(pulse2.dataflow), as = _.as;\n      let id2 = counter.value;\n      pulse2.visit(pulse2.ADD, (t) => t[as] = t[as] || ++id2);\n      counter.set(this.value = id2);\n      return pulse2;\n    }\n  });\n  function getCounter(view) {\n    return view._signals[COUNTER_NAME] || (view._signals[COUNTER_NAME] = view.add(0));\n  }\n  function Mark$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Mark$1, Transform, {\n    transform(_, pulse2) {\n      let mark = this.value;\n      if (!mark) {\n        mark = pulse2.dataflow.scenegraph().mark(_.markdef, lookup$1$1(_), _.index);\n        mark.group.context = _.context;\n        if (!_.context.group) _.context.group = mark.group;\n        mark.source = this.source;\n        mark.clip = _.clip;\n        mark.interactive = _.interactive;\n        this.value = mark;\n      }\n      const Init = mark.marktype === Group ? GroupItem : Item;\n      pulse2.visit(pulse2.ADD, (item) => Init.call(item, mark));\n      if (_.modified(\"clip\") || _.modified(\"interactive\")) {\n        mark.clip = _.clip;\n        mark.interactive = !!_.interactive;\n        mark.zdirty = true;\n        pulse2.reflow();\n      }\n      mark.items = pulse2.source;\n      return pulse2;\n    }\n  });\n  function lookup$1$1(_) {\n    const g = _.groups, p = _.parent;\n    return g && g.size === 1 ? g.get(Object.keys(g.object)[0]) : g && p ? g.lookup(p) : null;\n  }\n  function Overlap$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  const methods = {\n    parity: (items) => items.filter((item, i) => i % 2 ? item.opacity = 0 : 1),\n    greedy: (items, sep) => {\n      let a2;\n      return items.filter((b2, i) => !i || !intersect$1(a2.bounds, b2.bounds, sep) ? (a2 = b2, 1) : b2.opacity = 0);\n    }\n  };\n  const intersect$1 = (a2, b2, sep) => sep > Math.max(b2.x1 - a2.x2, a2.x1 - b2.x2, b2.y1 - a2.y2, a2.y1 - b2.y2);\n  const hasOverlap = (items, pad2) => {\n    for (var i = 1, n = items.length, a2 = items[0].bounds, b2; i < n; a2 = b2, ++i) {\n      if (intersect$1(a2, b2 = items[i].bounds, pad2)) return true;\n    }\n  };\n  const hasBounds = (item) => {\n    const b2 = item.bounds;\n    return b2.width() > 1 && b2.height() > 1;\n  };\n  const boundTest = (scale2, orient, tolerance) => {\n    var range2 = scale2.range(), b2 = new Bounds();\n    if (orient === Top$1 || orient === Bottom$1) {\n      b2.set(range2[0], -Infinity, range2[1], Infinity);\n    } else {\n      b2.set(-Infinity, range2[0], Infinity, range2[1]);\n    }\n    b2.expand(tolerance || 1);\n    return (item) => b2.encloses(item.bounds);\n  };\n  const reset = (source2) => {\n    source2.forEach((item) => item.opacity = 1);\n    return source2;\n  };\n  const reflow = (pulse2, _) => pulse2.reflow(_.modified()).modifies(\"opacity\");\n  inherits(Overlap$1, Transform, {\n    transform(_, pulse2) {\n      const reduce = methods[_.method] || methods.parity, sep = _.separation || 0;\n      let source2 = pulse2.materialize(pulse2.SOURCE).source, items, test2;\n      if (!source2 || !source2.length) return;\n      if (!_.method) {\n        if (_.modified(\"method\")) {\n          reset(source2);\n          pulse2 = reflow(pulse2, _);\n        }\n        return pulse2;\n      }\n      source2 = source2.filter(hasBounds);\n      if (!source2.length) return;\n      if (_.sort) {\n        source2 = source2.slice().sort(_.sort);\n      }\n      items = reset(source2);\n      pulse2 = reflow(pulse2, _);\n      if (items.length >= 3 && hasOverlap(items, sep)) {\n        do {\n          items = reduce(items, sep);\n        } while (items.length >= 3 && hasOverlap(items, sep));\n        if (items.length < 3 && !peek$1(source2).opacity) {\n          if (items.length > 1) peek$1(items).opacity = 0;\n          peek$1(source2).opacity = 1;\n        }\n      }\n      if (_.boundScale && _.boundTolerance >= 0) {\n        test2 = boundTest(_.boundScale, _.boundOrient, +_.boundTolerance);\n        source2.forEach((item) => {\n          if (!test2(item)) item.opacity = 0;\n        });\n      }\n      const bounds2 = items[0].mark.bounds.clear();\n      source2.forEach((item) => {\n        if (item.opacity) bounds2.union(item.bounds);\n      });\n      return pulse2;\n    }\n  });\n  function Render$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Render$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow;\n      pulse2.visit(pulse2.ALL, (item) => view.dirty(item));\n      if (pulse2.fields && pulse2.fields[\"zindex\"]) {\n        const item = pulse2.source && pulse2.source[0];\n        if (item) item.mark.zdirty = true;\n      }\n    }\n  });\n  const tempBounds = new Bounds();\n  function set$6(item, property2, value2) {\n    return item[property2] === value2 ? 0 : (item[property2] = value2, 1);\n  }\n  function isYAxis(mark) {\n    var orient = mark.items[0].orient;\n    return orient === Left$1 || orient === Right$1;\n  }\n  function axisIndices(datum2) {\n    let index2 = +datum2.grid;\n    return [\n      datum2.ticks ? index2++ : -1,\n      // ticks index\n      datum2.labels ? index2++ : -1,\n      // labels index\n      index2 + +datum2.domain\n      // title index\n    ];\n  }\n  function axisLayout(view, axis, width2, height2) {\n    var item = axis.items[0], datum2 = item.datum, delta = item.translate != null ? item.translate : 0.5, orient = item.orient, indices = axisIndices(datum2), range2 = item.range, offset2 = item.offset, position2 = item.position, minExtent = item.minExtent, maxExtent = item.maxExtent, title = datum2.title && item.items[indices[2]].items[0], titlePadding = item.titlePadding, bounds2 = item.bounds, dl = title && multiLineOffset(title), x2 = 0, y2 = 0, i, s;\n    tempBounds.clear().union(bounds2);\n    bounds2.clear();\n    if ((i = indices[0]) > -1) bounds2.union(item.items[i].bounds);\n    if ((i = indices[1]) > -1) bounds2.union(item.items[i].bounds);\n    switch (orient) {\n      case Top$1:\n        x2 = position2 || 0;\n        y2 = -offset2;\n        s = Math.max(minExtent, Math.min(maxExtent, -bounds2.y1));\n        bounds2.add(0, -s).add(range2, 0);\n        if (title) axisTitleLayout(view, title, s, titlePadding, dl, 0, -1, bounds2);\n        break;\n      case Left$1:\n        x2 = -offset2;\n        y2 = position2 || 0;\n        s = Math.max(minExtent, Math.min(maxExtent, -bounds2.x1));\n        bounds2.add(-s, 0).add(0, range2);\n        if (title) axisTitleLayout(view, title, s, titlePadding, dl, 1, -1, bounds2);\n        break;\n      case Right$1:\n        x2 = width2 + offset2;\n        y2 = position2 || 0;\n        s = Math.max(minExtent, Math.min(maxExtent, bounds2.x2));\n        bounds2.add(0, 0).add(s, range2);\n        if (title) axisTitleLayout(view, title, s, titlePadding, dl, 1, 1, bounds2);\n        break;\n      case Bottom$1:\n        x2 = position2 || 0;\n        y2 = height2 + offset2;\n        s = Math.max(minExtent, Math.min(maxExtent, bounds2.y2));\n        bounds2.add(0, 0).add(range2, s);\n        if (title) axisTitleLayout(view, title, s, titlePadding, 0, 0, 1, bounds2);\n        break;\n      default:\n        x2 = item.x;\n        y2 = item.y;\n    }\n    boundStroke(bounds2.translate(x2, y2), item);\n    if (set$6(item, \"x\", x2 + delta) | set$6(item, \"y\", y2 + delta)) {\n      item.bounds = tempBounds;\n      view.dirty(item);\n      item.bounds = bounds2;\n      view.dirty(item);\n    }\n    return item.mark.bounds.clear().union(bounds2);\n  }\n  function axisTitleLayout(view, title, offset2, pad2, dl, isYAxis2, sign2, bounds2) {\n    const b2 = title.bounds;\n    if (title.auto) {\n      const v = sign2 * (offset2 + dl + pad2);\n      let dx = 0, dy = 0;\n      view.dirty(title);\n      isYAxis2 ? dx = (title.x || 0) - (title.x = v) : dy = (title.y || 0) - (title.y = v);\n      title.mark.bounds.clear().union(b2.translate(-dx, -dy));\n      view.dirty(title);\n    }\n    bounds2.union(b2);\n  }\n  const min$1 = (a2, b2) => Math.floor(Math.min(a2, b2));\n  const max$1 = (a2, b2) => Math.ceil(Math.max(a2, b2));\n  function gridLayoutGroups(group2) {\n    var groups = group2.items, n = groups.length, i = 0, mark, items;\n    const views = {\n      marks: [],\n      rowheaders: [],\n      rowfooters: [],\n      colheaders: [],\n      colfooters: [],\n      rowtitle: null,\n      coltitle: null\n    };\n    for (; i < n; ++i) {\n      mark = groups[i];\n      items = mark.items;\n      if (mark.marktype === Group) {\n        switch (mark.role) {\n          case AxisRole$1:\n          case LegendRole$1:\n          case TitleRole$1:\n            break;\n          case RowHeader:\n            views.rowheaders.push(...items);\n            break;\n          case RowFooter:\n            views.rowfooters.push(...items);\n            break;\n          case ColHeader:\n            views.colheaders.push(...items);\n            break;\n          case ColFooter:\n            views.colfooters.push(...items);\n            break;\n          case RowTitle:\n            views.rowtitle = items[0];\n            break;\n          case ColTitle:\n            views.coltitle = items[0];\n            break;\n          default:\n            views.marks.push(...items);\n        }\n      }\n    }\n    return views;\n  }\n  function bboxFlush(item) {\n    return new Bounds().set(0, 0, item.width || 0, item.height || 0);\n  }\n  function bboxFull(item) {\n    const b2 = item.bounds.clone();\n    return b2.empty() ? b2.set(0, 0, 0, 0) : b2.translate(-(item.x || 0), -(item.y || 0));\n  }\n  function get$1(opt, key2, d) {\n    const v = isObject$1(opt) ? opt[key2] : opt;\n    return v != null ? v : d !== void 0 ? d : 0;\n  }\n  function offsetValue$1(v) {\n    return v < 0 ? Math.ceil(-v) : 0;\n  }\n  function gridLayout(view, groups, opt) {\n    var dirty = !opt.nodirty, bbox = opt.bounds === Flush ? bboxFlush : bboxFull, bounds2 = tempBounds.set(0, 0, 0, 0), alignCol = get$1(opt.align, Column), alignRow = get$1(opt.align, Row), padCol = get$1(opt.padding, Column), padRow = get$1(opt.padding, Row), ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), n = groups.length, xOffset = Array(n), xExtent = Array(ncols), xMax = 0, yOffset = Array(n), yExtent = Array(nrows), yMax = 0, dx = Array(n), dy = Array(n), boxes = Array(n), m2, i, c2, r, b2, g, px2, py2, x2, y2, offset2;\n    for (i = 0; i < ncols; ++i) xExtent[i] = 0;\n    for (i = 0; i < nrows; ++i) yExtent[i] = 0;\n    for (i = 0; i < n; ++i) {\n      g = groups[i];\n      b2 = boxes[i] = bbox(g);\n      g.x = g.x || 0;\n      dx[i] = 0;\n      g.y = g.y || 0;\n      dy[i] = 0;\n      c2 = i % ncols;\n      r = ~~(i / ncols);\n      xMax = Math.max(xMax, px2 = Math.ceil(b2.x2));\n      yMax = Math.max(yMax, py2 = Math.ceil(b2.y2));\n      xExtent[c2] = Math.max(xExtent[c2], px2);\n      yExtent[r] = Math.max(yExtent[r], py2);\n      xOffset[i] = padCol + offsetValue$1(b2.x1);\n      yOffset[i] = padRow + offsetValue$1(b2.y1);\n      if (dirty) view.dirty(groups[i]);\n    }\n    for (i = 0; i < n; ++i) {\n      if (i % ncols === 0) xOffset[i] = 0;\n      if (i < ncols) yOffset[i] = 0;\n    }\n    if (alignCol === Each) {\n      for (c2 = 1; c2 < ncols; ++c2) {\n        for (offset2 = 0, i = c2; i < n; i += ncols) {\n          if (offset2 < xOffset[i]) offset2 = xOffset[i];\n        }\n        for (i = c2; i < n; i += ncols) {\n          xOffset[i] = offset2 + xExtent[c2 - 1];\n        }\n      }\n    } else if (alignCol === All) {\n      for (offset2 = 0, i = 0; i < n; ++i) {\n        if (i % ncols && offset2 < xOffset[i]) offset2 = xOffset[i];\n      }\n      for (i = 0; i < n; ++i) {\n        if (i % ncols) xOffset[i] = offset2 + xMax;\n      }\n    } else {\n      for (alignCol = false, c2 = 1; c2 < ncols; ++c2) {\n        for (i = c2; i < n; i += ncols) {\n          xOffset[i] += xExtent[c2 - 1];\n        }\n      }\n    }\n    if (alignRow === Each) {\n      for (r = 1; r < nrows; ++r) {\n        for (offset2 = 0, i = r * ncols, m2 = i + ncols; i < m2; ++i) {\n          if (offset2 < yOffset[i]) offset2 = yOffset[i];\n        }\n        for (i = r * ncols; i < m2; ++i) {\n          yOffset[i] = offset2 + yExtent[r - 1];\n        }\n      }\n    } else if (alignRow === All) {\n      for (offset2 = 0, i = ncols; i < n; ++i) {\n        if (offset2 < yOffset[i]) offset2 = yOffset[i];\n      }\n      for (i = ncols; i < n; ++i) {\n        yOffset[i] = offset2 + yMax;\n      }\n    } else {\n      for (alignRow = false, r = 1; r < nrows; ++r) {\n        for (i = r * ncols, m2 = i + ncols; i < m2; ++i) {\n          yOffset[i] += yExtent[r - 1];\n        }\n      }\n    }\n    for (x2 = 0, i = 0; i < n; ++i) {\n      x2 = xOffset[i] + (i % ncols ? x2 : 0);\n      dx[i] += x2 - groups[i].x;\n    }\n    for (c2 = 0; c2 < ncols; ++c2) {\n      for (y2 = 0, i = c2; i < n; i += ncols) {\n        y2 += yOffset[i];\n        dy[i] += y2 - groups[i].y;\n      }\n    }\n    if (alignCol && get$1(opt.center, Column) && nrows > 1) {\n      for (i = 0; i < n; ++i) {\n        b2 = alignCol === All ? xMax : xExtent[i % ncols];\n        x2 = b2 - boxes[i].x2 - groups[i].x - dx[i];\n        if (x2 > 0) dx[i] += x2 / 2;\n      }\n    }\n    if (alignRow && get$1(opt.center, Row) && ncols !== 1) {\n      for (i = 0; i < n; ++i) {\n        b2 = alignRow === All ? yMax : yExtent[~~(i / ncols)];\n        y2 = b2 - boxes[i].y2 - groups[i].y - dy[i];\n        if (y2 > 0) dy[i] += y2 / 2;\n      }\n    }\n    for (i = 0; i < n; ++i) {\n      bounds2.union(boxes[i].translate(dx[i], dy[i]));\n    }\n    x2 = get$1(opt.anchor, X);\n    y2 = get$1(opt.anchor, Y);\n    switch (get$1(opt.anchor, Column)) {\n      case End$1:\n        x2 -= bounds2.width();\n        break;\n      case Middle$1:\n        x2 -= bounds2.width() / 2;\n    }\n    switch (get$1(opt.anchor, Row)) {\n      case End$1:\n        y2 -= bounds2.height();\n        break;\n      case Middle$1:\n        y2 -= bounds2.height() / 2;\n    }\n    x2 = Math.round(x2);\n    y2 = Math.round(y2);\n    bounds2.clear();\n    for (i = 0; i < n; ++i) {\n      groups[i].mark.bounds.clear();\n    }\n    for (i = 0; i < n; ++i) {\n      g = groups[i];\n      g.x += dx[i] += x2;\n      g.y += dy[i] += y2;\n      bounds2.union(g.mark.bounds.union(g.bounds.translate(dx[i], dy[i])));\n      if (dirty) view.dirty(g);\n    }\n    return bounds2;\n  }\n  function trellisLayout(view, group2, opt) {\n    var views = gridLayoutGroups(group2), groups = views.marks, bbox = opt.bounds === Flush ? boundFlush : boundFull, off = opt.offset, ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), cells = nrows * ncols, x2, y2, x22, y22, anchor, band2, offset2;\n    const bounds2 = gridLayout(view, groups, opt);\n    if (bounds2.empty()) bounds2.set(0, 0, 0, 0);\n    if (views.rowheaders) {\n      band2 = get$1(opt.headerBand, Row, null);\n      x2 = layoutHeaders(view, views.rowheaders, groups, ncols, nrows, -get$1(off, \"rowHeader\"), min$1, 0, bbox, \"x1\", 0, ncols, 1, band2);\n    }\n    if (views.colheaders) {\n      band2 = get$1(opt.headerBand, Column, null);\n      y2 = layoutHeaders(view, views.colheaders, groups, ncols, ncols, -get$1(off, \"columnHeader\"), min$1, 1, bbox, \"y1\", 0, 1, ncols, band2);\n    }\n    if (views.rowfooters) {\n      band2 = get$1(opt.footerBand, Row, null);\n      x22 = layoutHeaders(view, views.rowfooters, groups, ncols, nrows, get$1(off, \"rowFooter\"), max$1, 0, bbox, \"x2\", ncols - 1, ncols, 1, band2);\n    }\n    if (views.colfooters) {\n      band2 = get$1(opt.footerBand, Column, null);\n      y22 = layoutHeaders(view, views.colfooters, groups, ncols, ncols, get$1(off, \"columnFooter\"), max$1, 1, bbox, \"y2\", cells - ncols, 1, ncols, band2);\n    }\n    if (views.rowtitle) {\n      anchor = get$1(opt.titleAnchor, Row);\n      offset2 = get$1(off, \"rowTitle\");\n      offset2 = anchor === End$1 ? x22 + offset2 : x2 - offset2;\n      band2 = get$1(opt.titleBand, Row, 0.5);\n      layoutTitle(view, views.rowtitle, offset2, 0, bounds2, band2);\n    }\n    if (views.coltitle) {\n      anchor = get$1(opt.titleAnchor, Column);\n      offset2 = get$1(off, \"columnTitle\");\n      offset2 = anchor === End$1 ? y22 + offset2 : y2 - offset2;\n      band2 = get$1(opt.titleBand, Column, 0.5);\n      layoutTitle(view, views.coltitle, offset2, 1, bounds2, band2);\n    }\n  }\n  function boundFlush(item, field2) {\n    return field2 === \"x1\" ? item.x || 0 : field2 === \"y1\" ? item.y || 0 : field2 === \"x2\" ? (item.x || 0) + (item.width || 0) : field2 === \"y2\" ? (item.y || 0) + (item.height || 0) : void 0;\n  }\n  function boundFull(item, field2) {\n    return item.bounds[field2];\n  }\n  function layoutHeaders(view, headers, groups, ncols, limit, offset2, agg, isX2, bound2, bf, start, stride, back, band2) {\n    var n = groups.length, init2 = 0, edge = 0, i, j, k, m2, b2, h2, g, x2, y2;\n    if (!n) return init2;\n    for (i = start; i < n; i += stride) {\n      if (groups[i]) init2 = agg(init2, bound2(groups[i], bf));\n    }\n    if (!headers.length) return init2;\n    if (headers.length > limit) {\n      view.warn(\"Grid headers exceed limit: \" + limit);\n      headers = headers.slice(0, limit);\n    }\n    init2 += offset2;\n    for (j = 0, m2 = headers.length; j < m2; ++j) {\n      view.dirty(headers[j]);\n      headers[j].mark.bounds.clear();\n    }\n    for (i = start, j = 0, m2 = headers.length; j < m2; ++j, i += stride) {\n      h2 = headers[j];\n      b2 = h2.mark.bounds;\n      for (k = i; k >= 0 && (g = groups[k]) == null; k -= back) ;\n      if (isX2) {\n        x2 = band2 == null ? g.x : Math.round(g.bounds.x1 + band2 * g.bounds.width());\n        y2 = init2;\n      } else {\n        x2 = init2;\n        y2 = band2 == null ? g.y : Math.round(g.bounds.y1 + band2 * g.bounds.height());\n      }\n      b2.union(h2.bounds.translate(x2 - (h2.x || 0), y2 - (h2.y || 0)));\n      h2.x = x2;\n      h2.y = y2;\n      view.dirty(h2);\n      edge = agg(edge, b2[bf]);\n    }\n    return edge;\n  }\n  function layoutTitle(view, g, offset2, isX2, bounds2, band2) {\n    if (!g) return;\n    view.dirty(g);\n    var x2 = offset2, y2 = offset2;\n    isX2 ? x2 = Math.round(bounds2.x1 + band2 * bounds2.width()) : y2 = Math.round(bounds2.y1 + band2 * bounds2.height());\n    g.bounds.translate(x2 - (g.x || 0), y2 - (g.y || 0));\n    g.mark.bounds.clear().union(g.bounds);\n    g.x = x2;\n    g.y = y2;\n    view.dirty(g);\n  }\n  function lookup$3(config, orient) {\n    const opt = config[orient] || {};\n    return (key2, d) => opt[key2] != null ? opt[key2] : config[key2] != null ? config[key2] : d;\n  }\n  function offsets(legends, value2) {\n    let max2 = -Infinity;\n    legends.forEach((item) => {\n      if (item.offset != null) max2 = Math.max(max2, item.offset);\n    });\n    return max2 > -Infinity ? max2 : value2;\n  }\n  function legendParams(g, orient, config, xb, yb, w2, h2) {\n    const _ = lookup$3(config, orient), offset2 = offsets(g, _(\"offset\", 0)), anchor = _(\"anchor\", Start$1), mult2 = anchor === End$1 ? 1 : anchor === Middle$1 ? 0.5 : 0;\n    const p = {\n      align: Each,\n      bounds: _(\"bounds\", Flush),\n      columns: _(\"direction\") === \"vertical\" ? 1 : g.length,\n      padding: _(\"margin\", 8),\n      center: _(\"center\"),\n      nodirty: true\n    };\n    switch (orient) {\n      case Left$1:\n        p.anchor = {\n          x: Math.floor(xb.x1) - offset2,\n          column: End$1,\n          y: mult2 * (h2 || xb.height() + 2 * xb.y1),\n          row: anchor\n        };\n        break;\n      case Right$1:\n        p.anchor = {\n          x: Math.ceil(xb.x2) + offset2,\n          y: mult2 * (h2 || xb.height() + 2 * xb.y1),\n          row: anchor\n        };\n        break;\n      case Top$1:\n        p.anchor = {\n          y: Math.floor(yb.y1) - offset2,\n          row: End$1,\n          x: mult2 * (w2 || yb.width() + 2 * yb.x1),\n          column: anchor\n        };\n        break;\n      case Bottom$1:\n        p.anchor = {\n          y: Math.ceil(yb.y2) + offset2,\n          x: mult2 * (w2 || yb.width() + 2 * yb.x1),\n          column: anchor\n        };\n        break;\n      case TopLeft:\n        p.anchor = {\n          x: offset2,\n          y: offset2\n        };\n        break;\n      case TopRight:\n        p.anchor = {\n          x: w2 - offset2,\n          y: offset2,\n          column: End$1\n        };\n        break;\n      case BottomLeft:\n        p.anchor = {\n          x: offset2,\n          y: h2 - offset2,\n          row: End$1\n        };\n        break;\n      case BottomRight:\n        p.anchor = {\n          x: w2 - offset2,\n          y: h2 - offset2,\n          column: End$1,\n          row: End$1\n        };\n        break;\n    }\n    return p;\n  }\n  function legendLayout(view, legend2) {\n    var item = legend2.items[0], datum2 = item.datum, orient = item.orient, bounds2 = item.bounds, x2 = item.x, y2 = item.y, w2, h2;\n    item._bounds ? item._bounds.clear().union(bounds2) : item._bounds = bounds2.clone();\n    bounds2.clear();\n    legendGroupLayout(view, item, item.items[0].items[0]);\n    bounds2 = legendBounds(item, bounds2);\n    w2 = 2 * item.padding;\n    h2 = 2 * item.padding;\n    if (!bounds2.empty()) {\n      w2 = Math.ceil(bounds2.width() + w2);\n      h2 = Math.ceil(bounds2.height() + h2);\n    }\n    if (datum2.type === Symbols$1) {\n      legendEntryLayout(item.items[0].items[0].items[0].items);\n    }\n    if (orient !== None) {\n      item.x = x2 = 0;\n      item.y = y2 = 0;\n    }\n    item.width = w2;\n    item.height = h2;\n    boundStroke(bounds2.set(x2, y2, x2 + w2, y2 + h2), item);\n    item.mark.bounds.clear().union(bounds2);\n    return item;\n  }\n  function legendBounds(item, b2) {\n    item.items.forEach((_) => b2.union(_.bounds));\n    b2.x1 = item.padding;\n    b2.y1 = item.padding;\n    return b2;\n  }\n  function legendGroupLayout(view, item, entry2) {\n    var pad2 = item.padding, ex = pad2 - entry2.x, ey = pad2 - entry2.y;\n    if (!item.datum.title) {\n      if (ex || ey) translate$1(view, entry2, ex, ey);\n    } else {\n      var title = item.items[1].items[0], anchor = title.anchor, tpad = item.titlePadding || 0, tx2 = pad2 - title.x, ty2 = pad2 - title.y;\n      switch (title.orient) {\n        case Left$1:\n          ex += Math.ceil(title.bounds.width()) + tpad;\n          break;\n        case Right$1:\n        case Bottom$1:\n          break;\n        default:\n          ey += title.bounds.height() + tpad;\n      }\n      if (ex || ey) translate$1(view, entry2, ex, ey);\n      switch (title.orient) {\n        case Left$1:\n          ty2 += legendTitleOffset(item, entry2, title, anchor, 1, 1);\n          break;\n        case Right$1:\n          tx2 += legendTitleOffset(item, entry2, title, End$1, 0, 0) + tpad;\n          ty2 += legendTitleOffset(item, entry2, title, anchor, 1, 1);\n          break;\n        case Bottom$1:\n          tx2 += legendTitleOffset(item, entry2, title, anchor, 0, 0);\n          ty2 += legendTitleOffset(item, entry2, title, End$1, -1, 0, 1) + tpad;\n          break;\n        default:\n          tx2 += legendTitleOffset(item, entry2, title, anchor, 0, 0);\n      }\n      if (tx2 || ty2) translate$1(view, title, tx2, ty2);\n      if ((tx2 = Math.round(title.bounds.x1 - pad2)) < 0) {\n        translate$1(view, entry2, -tx2, 0);\n        translate$1(view, title, -tx2, 0);\n      }\n    }\n  }\n  function legendTitleOffset(item, entry2, title, anchor, y2, lr, noBar) {\n    const grad = item.datum.type !== \"symbol\", vgrad = title.datum.vgrad, e = grad && (lr || !vgrad) && !noBar ? entry2.items[0] : entry2, s = e.bounds[y2 ? \"y2\" : \"x2\"] - item.padding, u2 = vgrad && lr ? s : 0, v = vgrad && lr ? 0 : s, o = y2 <= 0 ? 0 : multiLineOffset(title);\n    return Math.round(anchor === Start$1 ? u2 : anchor === End$1 ? v - o : 0.5 * (s - o));\n  }\n  function translate$1(view, item, dx, dy) {\n    item.x += dx;\n    item.y += dy;\n    item.bounds.translate(dx, dy);\n    item.mark.bounds.translate(dx, dy);\n    view.dirty(item);\n  }\n  function legendEntryLayout(entries) {\n    const widths = entries.reduce((w2, g) => {\n      w2[g.column] = Math.max(g.bounds.x2 - g.x, w2[g.column] || 0);\n      return w2;\n    }, {});\n    entries.forEach((g) => {\n      g.width = widths[g.column];\n      g.height = g.bounds.y2 - g.y;\n    });\n  }\n  function titleLayout(view, mark, width2, height2, viewBounds2) {\n    var group2 = mark.items[0], frame2 = group2.frame, orient = group2.orient, anchor = group2.anchor, offset2 = group2.offset, padding2 = group2.padding, title = group2.items[0].items[0], subtitle = group2.items[1] && group2.items[1].items[0], end = orient === Left$1 || orient === Right$1 ? height2 : width2, start = 0, x2 = 0, y2 = 0, sx = 0, sy = 0, pos;\n    if (frame2 !== Group) {\n      orient === Left$1 ? (start = viewBounds2.y2, end = viewBounds2.y1) : orient === Right$1 ? (start = viewBounds2.y1, end = viewBounds2.y2) : (start = viewBounds2.x1, end = viewBounds2.x2);\n    } else if (orient === Left$1) {\n      start = height2, end = 0;\n    }\n    pos = anchor === Start$1 ? start : anchor === End$1 ? end : (start + end) / 2;\n    if (subtitle && subtitle.text) {\n      switch (orient) {\n        case Top$1:\n        case Bottom$1:\n          sy = title.bounds.height() + padding2;\n          break;\n        case Left$1:\n          sx = title.bounds.width() + padding2;\n          break;\n        case Right$1:\n          sx = -title.bounds.width() - padding2;\n          break;\n      }\n      tempBounds.clear().union(subtitle.bounds);\n      tempBounds.translate(sx - (subtitle.x || 0), sy - (subtitle.y || 0));\n      if (set$6(subtitle, \"x\", sx) | set$6(subtitle, \"y\", sy)) {\n        view.dirty(subtitle);\n        subtitle.bounds.clear().union(tempBounds);\n        subtitle.mark.bounds.clear().union(tempBounds);\n        view.dirty(subtitle);\n      }\n      tempBounds.clear().union(subtitle.bounds);\n    } else {\n      tempBounds.clear();\n    }\n    tempBounds.union(title.bounds);\n    switch (orient) {\n      case Top$1:\n        x2 = pos;\n        y2 = viewBounds2.y1 - tempBounds.height() - offset2;\n        break;\n      case Left$1:\n        x2 = viewBounds2.x1 - tempBounds.width() - offset2;\n        y2 = pos;\n        break;\n      case Right$1:\n        x2 = viewBounds2.x2 + tempBounds.width() + offset2;\n        y2 = pos;\n        break;\n      case Bottom$1:\n        x2 = pos;\n        y2 = viewBounds2.y2 + offset2;\n        break;\n      default:\n        x2 = group2.x;\n        y2 = group2.y;\n    }\n    if (set$6(group2, \"x\", x2) | set$6(group2, \"y\", y2)) {\n      tempBounds.translate(x2, y2);\n      view.dirty(group2);\n      group2.bounds.clear().union(tempBounds);\n      mark.bounds.clear().union(tempBounds);\n      view.dirty(group2);\n    }\n    return group2.bounds;\n  }\n  function ViewLayout$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(ViewLayout$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow;\n      _.mark.items.forEach((group2) => {\n        if (_.layout) trellisLayout(view, group2, _.layout);\n        layoutGroup(view, group2, _);\n      });\n      return shouldReflow(_.mark.group) ? pulse2.reflow() : pulse2;\n    }\n  });\n  function shouldReflow(group2) {\n    return group2 && group2.mark.role !== \"legend-entry\";\n  }\n  function layoutGroup(view, group2, _) {\n    var items = group2.items, width2 = Math.max(0, group2.width || 0), height2 = Math.max(0, group2.height || 0), viewBounds2 = new Bounds().set(0, 0, width2, height2), xBounds = viewBounds2.clone(), yBounds = viewBounds2.clone(), legends = [], title, mark, orient, b2, i, n;\n    for (i = 0, n = items.length; i < n; ++i) {\n      mark = items[i];\n      switch (mark.role) {\n        case AxisRole$1:\n          b2 = isYAxis(mark) ? xBounds : yBounds;\n          b2.union(axisLayout(view, mark, width2, height2));\n          break;\n        case TitleRole$1:\n          title = mark;\n          break;\n        case LegendRole$1:\n          legends.push(legendLayout(view, mark));\n          break;\n        case FrameRole$1:\n        case ScopeRole$1:\n        case RowHeader:\n        case RowFooter:\n        case RowTitle:\n        case ColHeader:\n        case ColFooter:\n        case ColTitle:\n          xBounds.union(mark.bounds);\n          yBounds.union(mark.bounds);\n          break;\n        default:\n          viewBounds2.union(mark.bounds);\n      }\n    }\n    if (legends.length) {\n      const l = {};\n      legends.forEach((item) => {\n        orient = item.orient || Right$1;\n        if (orient !== None) (l[orient] || (l[orient] = [])).push(item);\n      });\n      for (const orient2 in l) {\n        const g = l[orient2];\n        gridLayout(view, g, legendParams(g, orient2, _.legends, xBounds, yBounds, width2, height2));\n      }\n      legends.forEach((item) => {\n        const b3 = item.bounds;\n        if (!b3.equals(item._bounds)) {\n          item.bounds = item._bounds;\n          view.dirty(item);\n          item.bounds = b3;\n          view.dirty(item);\n        }\n        if (_.autosize && (_.autosize.type === Fit || _.autosize.type === FitX || _.autosize.type === FitY)) {\n          switch (item.orient) {\n            case Left$1:\n            case Right$1:\n              viewBounds2.add(b3.x1, 0).add(b3.x2, 0);\n              break;\n            case Top$1:\n            case Bottom$1:\n              viewBounds2.add(0, b3.y1).add(0, b3.y2);\n          }\n        } else {\n          viewBounds2.union(b3);\n        }\n      });\n    }\n    viewBounds2.union(xBounds).union(yBounds);\n    if (title) {\n      viewBounds2.union(titleLayout(view, title, width2, height2, viewBounds2));\n    }\n    if (group2.clip) {\n      viewBounds2.set(0, 0, group2.width || 0, group2.height || 0);\n    }\n    viewSizeLayout(view, group2, viewBounds2, _);\n  }\n  function viewSizeLayout(view, group2, viewBounds2, _) {\n    const auto = _.autosize || {}, type2 = auto.type;\n    if (view._autosize < 1 || !type2) return;\n    let viewWidth2 = view._width, viewHeight2 = view._height, width2 = Math.max(0, group2.width || 0), left = Math.max(0, Math.ceil(-viewBounds2.x1)), height2 = Math.max(0, group2.height || 0), top = Math.max(0, Math.ceil(-viewBounds2.y1));\n    const right = Math.max(0, Math.ceil(viewBounds2.x2 - width2)), bottom = Math.max(0, Math.ceil(viewBounds2.y2 - height2));\n    if (auto.contains === Padding$1) {\n      const padding2 = view.padding();\n      viewWidth2 -= padding2.left + padding2.right;\n      viewHeight2 -= padding2.top + padding2.bottom;\n    }\n    if (type2 === None) {\n      left = 0;\n      top = 0;\n      width2 = viewWidth2;\n      height2 = viewHeight2;\n    } else if (type2 === Fit) {\n      width2 = Math.max(0, viewWidth2 - left - right);\n      height2 = Math.max(0, viewHeight2 - top - bottom);\n    } else if (type2 === FitX) {\n      width2 = Math.max(0, viewWidth2 - left - right);\n      viewHeight2 = height2 + top + bottom;\n    } else if (type2 === FitY) {\n      viewWidth2 = width2 + left + right;\n      height2 = Math.max(0, viewHeight2 - top - bottom);\n    } else if (type2 === Pad) {\n      viewWidth2 = width2 + left + right;\n      viewHeight2 = height2 + top + bottom;\n    }\n    view._resizeView(viewWidth2, viewHeight2, width2, height2, [left, top], auto.resize);\n  }\n  const vtx = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    bound: Bound$1,\n    identifier: Identifier$1,\n    mark: Mark$1,\n    overlap: Overlap$1,\n    render: Render$1,\n    viewlayout: ViewLayout$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function AxisTicks$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(AxisTicks$1, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var locale2 = pulse2.dataflow.locale(), out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), ticks2 = this.value, scale2 = _.scale, tally = _.count == null ? _.values ? _.values.length : 10 : _.count, count2 = tickCount(scale2, tally, _.minstep), format2 = _.format || tickFormat(locale2, scale2, count2, _.formatSpecifier, _.formatType, !!_.values), values2 = _.values ? validTicks(scale2, _.values, count2) : tickValues(scale2, count2);\n      if (ticks2) out.rem = ticks2;\n      ticks2 = values2.map((value2, i) => ingest$1({\n        index: i / (values2.length - 1 || 1),\n        value: value2,\n        label: format2(value2)\n      }));\n      if (_.extra && ticks2.length) {\n        ticks2.push(ingest$1({\n          index: -1,\n          extra: {\n            value: ticks2[0].value\n          },\n          label: \"\"\n        }));\n      }\n      out.source = ticks2;\n      out.add = ticks2;\n      this.value = ticks2;\n      return out;\n    }\n  });\n  function DataJoin$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  function defaultItemCreate() {\n    return ingest$1({});\n  }\n  function newMap(key2) {\n    const map2 = fastmap().test((t) => t.exit);\n    map2.lookup = (t) => map2.get(key2(t));\n    return map2;\n  }\n  inherits(DataJoin$1, Transform, {\n    transform(_, pulse2) {\n      var df = pulse2.dataflow, out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), item = _.item || defaultItemCreate, key2 = _.key || tupleid, map2 = this.value;\n      if (isArray(out.encode)) {\n        out.encode = null;\n      }\n      if (map2 && (_.modified(\"key\") || pulse2.modified(key2))) {\n        error(\"DataJoin does not support modified key function or fields.\");\n      }\n      if (!map2) {\n        pulse2 = pulse2.addAll();\n        this.value = map2 = newMap(key2);\n      }\n      pulse2.visit(pulse2.ADD, (t) => {\n        const k = key2(t);\n        let x2 = map2.get(k);\n        if (x2) {\n          if (x2.exit) {\n            map2.empty--;\n            out.add.push(x2);\n          } else {\n            out.mod.push(x2);\n          }\n        } else {\n          x2 = item(t);\n          map2.set(k, x2);\n          out.add.push(x2);\n        }\n        x2.datum = t;\n        x2.exit = false;\n      });\n      pulse2.visit(pulse2.MOD, (t) => {\n        const k = key2(t), x2 = map2.get(k);\n        if (x2) {\n          x2.datum = t;\n          out.mod.push(x2);\n        }\n      });\n      pulse2.visit(pulse2.REM, (t) => {\n        const k = key2(t), x2 = map2.get(k);\n        if (t === x2.datum && !x2.exit) {\n          out.rem.push(x2);\n          x2.exit = true;\n          ++map2.empty;\n        }\n      });\n      if (pulse2.changed(pulse2.ADD_MOD)) out.modifies(\"datum\");\n      if (pulse2.clean() || _.clean && map2.empty > df.cleanThreshold) {\n        df.runAfter(map2.clean);\n      }\n      return out;\n    }\n  });\n  function Encode$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Encode$1, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ADD_REM), fmod = _.mod || false, encoders = _.encoders, encode2 = pulse2.encode;\n      if (isArray(encode2)) {\n        if (out.changed() || encode2.every((e) => encoders[e])) {\n          encode2 = encode2[0];\n          out.encode = null;\n        } else {\n          return pulse2.StopPropagation;\n        }\n      }\n      var reenter = encode2 === \"enter\", update2 = encoders.update || falsy, enter = encoders.enter || falsy, exit = encoders.exit || falsy, set2 = (encode2 && !reenter ? encoders[encode2] : update2) || falsy;\n      if (pulse2.changed(pulse2.ADD)) {\n        pulse2.visit(pulse2.ADD, (t) => {\n          enter(t, _);\n          update2(t, _);\n        });\n        out.modifies(enter.output);\n        out.modifies(update2.output);\n        if (set2 !== falsy && set2 !== update2) {\n          pulse2.visit(pulse2.ADD, (t) => {\n            set2(t, _);\n          });\n          out.modifies(set2.output);\n        }\n      }\n      if (pulse2.changed(pulse2.REM) && exit !== falsy) {\n        pulse2.visit(pulse2.REM, (t) => {\n          exit(t, _);\n        });\n        out.modifies(exit.output);\n      }\n      if (reenter || set2 !== falsy) {\n        const flag2 = pulse2.MOD | (_.modified() ? pulse2.REFLOW : 0);\n        if (reenter) {\n          pulse2.visit(flag2, (t) => {\n            const mod = enter(t, _) || fmod;\n            if (set2(t, _) || mod) out.mod.push(t);\n          });\n          if (out.mod.length) out.modifies(enter.output);\n        } else {\n          pulse2.visit(flag2, (t) => {\n            if (set2(t, _) || fmod) out.mod.push(t);\n          });\n        }\n        if (out.mod.length) out.modifies(set2.output);\n      }\n      return out.changed() ? out : pulse2.StopPropagation;\n    }\n  });\n  function LegendEntries$1(params2) {\n    Transform.call(this, [], params2);\n  }\n  inherits(LegendEntries$1, Transform, {\n    transform(_, pulse2) {\n      if (this.value != null && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var locale2 = pulse2.dataflow.locale(), out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), items = this.value, type2 = _.type || SymbolLegend, scale2 = _.scale, limit = +_.limit, count2 = tickCount(scale2, _.count == null ? 5 : _.count, _.minstep), lskip = !!_.values || type2 === SymbolLegend, format2 = _.format || labelFormat(locale2, scale2, count2, type2, _.formatSpecifier, _.formatType, lskip), values2 = _.values || labelValues(scale2, count2), domain2, fraction, size2, offset2, ellipsis;\n      if (items) out.rem = items;\n      if (type2 === SymbolLegend) {\n        if (limit && values2.length > limit) {\n          pulse2.dataflow.warn(\"Symbol legend count exceeds limit, filtering items.\");\n          items = values2.slice(0, limit - 1);\n          ellipsis = true;\n        } else {\n          items = values2;\n        }\n        if (isFunction(size2 = _.size)) {\n          if (!_.values && scale2(items[0]) === 0) {\n            items = items.slice(1);\n          }\n          offset2 = items.reduce((max2, value2) => Math.max(max2, size2(value2, _)), 0);\n        } else {\n          size2 = constant$5(offset2 = size2 || 8);\n        }\n        items = items.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, items),\n          value: value2,\n          offset: offset2,\n          size: size2(value2, _)\n        }));\n        if (ellipsis) {\n          ellipsis = values2[items.length];\n          items.push(ingest$1({\n            index: items.length,\n            label: `…${values2.length - items.length} entries`,\n            value: ellipsis,\n            offset: offset2,\n            size: size2(ellipsis, _)\n          }));\n        }\n      } else if (type2 === GradientLegend) {\n        domain2 = scale2.domain(), fraction = scaleFraction(scale2, domain2[0], peek$1(domain2));\n        if (values2.length < 3 && !_.values && domain2[0] !== peek$1(domain2)) {\n          values2 = [domain2[0], peek$1(domain2)];\n        }\n        items = values2.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, values2),\n          value: value2,\n          perc: fraction(value2)\n        }));\n      } else {\n        size2 = values2.length - 1;\n        fraction = labelFraction(scale2);\n        items = values2.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, values2),\n          value: value2,\n          perc: index2 ? fraction(value2) : 0,\n          perc2: index2 === size2 ? 1 : fraction(values2[index2 + 1])\n        }));\n      }\n      out.source = items;\n      out.add = items;\n      this.value = items;\n      return out;\n    }\n  });\n  const sourceX = (t) => t.source.x;\n  const sourceY = (t) => t.source.y;\n  const targetX = (t) => t.target.x;\n  const targetY = (t) => t.target.y;\n  function LinkPath(params2) {\n    Transform.call(this, {}, params2);\n  }\n  LinkPath.Definition = {\n    \"type\": \"LinkPath\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"sourceX\",\n      \"type\": \"field\",\n      \"default\": \"source.x\"\n    }, {\n      \"name\": \"sourceY\",\n      \"type\": \"field\",\n      \"default\": \"source.y\"\n    }, {\n      \"name\": \"targetX\",\n      \"type\": \"field\",\n      \"default\": \"target.x\"\n    }, {\n      \"name\": \"targetY\",\n      \"type\": \"field\",\n      \"default\": \"target.y\"\n    }, {\n      \"name\": \"orient\",\n      \"type\": \"enum\",\n      \"default\": \"vertical\",\n      \"values\": [\"horizontal\", \"vertical\", \"radial\"]\n    }, {\n      \"name\": \"shape\",\n      \"type\": \"enum\",\n      \"default\": \"line\",\n      \"values\": [\"line\", \"arc\", \"curve\", \"diagonal\", \"orthogonal\"]\n    }, {\n      \"name\": \"require\",\n      \"type\": \"signal\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  inherits(LinkPath, Transform, {\n    transform(_, pulse2) {\n      var sx = _.sourceX || sourceX, sy = _.sourceY || sourceY, tx2 = _.targetX || targetX, ty2 = _.targetY || targetY, as = _.as || \"path\", orient = _.orient || \"vertical\", shape2 = _.shape || \"line\", path2 = Paths.get(shape2 + \"-\" + orient) || Paths.get(shape2);\n      if (!path2) {\n        error(\"LinkPath unsupported type: \" + _.shape + (_.orient ? \"-\" + _.orient : \"\"));\n      }\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        t[as] = path2(sx(t), sy(t), tx2(t), ty2(t));\n      });\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  const line = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"L\" + tx2 + \",\" + ty2;\n  const lineR = (sa2, sr, ta, tr2) => line(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const arc = (sx, sy, tx2, ty2) => {\n    var dx = tx2 - sx, dy = ty2 - sy, rr = Math.hypot(dx, dy) / 2, ra = 180 * Math.atan2(dy, dx) / Math.PI;\n    return \"M\" + sx + \",\" + sy + \"A\" + rr + \",\" + rr + \" \" + ra + \" 0 1 \" + tx2 + \",\" + ty2;\n  };\n  const arcR = (sa2, sr, ta, tr2) => arc(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const curve = (sx, sy, tx2, ty2) => {\n    const dx = tx2 - sx, dy = ty2 - sy, ix = 0.2 * (dx + dy), iy = 0.2 * (dy - dx);\n    return \"M\" + sx + \",\" + sy + \"C\" + (sx + ix) + \",\" + (sy + iy) + \" \" + (tx2 + iy) + \",\" + (ty2 - ix) + \" \" + tx2 + \",\" + ty2;\n  };\n  const curveR = (sa2, sr, ta, tr2) => curve(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const orthoX = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"V\" + ty2 + \"H\" + tx2;\n  const orthoY = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"H\" + tx2 + \"V\" + ty2;\n  const orthoR = (sa2, sr, ta, tr2) => {\n    const sc = Math.cos(sa2), ss = Math.sin(sa2), tc = Math.cos(ta), ts2 = Math.sin(ta), sf = Math.abs(ta - sa2) > Math.PI ? ta <= sa2 : ta > sa2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"A\" + sr + \",\" + sr + \" 0 0,\" + (sf ? 1 : 0) + \" \" + sr * tc + \",\" + sr * ts2 + \"L\" + tr2 * tc + \",\" + tr2 * ts2;\n  };\n  const diagonalX = (sx, sy, tx2, ty2) => {\n    const m2 = (sx + tx2) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + m2 + \",\" + sy + \" \" + m2 + \",\" + ty2 + \" \" + tx2 + \",\" + ty2;\n  };\n  const diagonalY = (sx, sy, tx2, ty2) => {\n    const m2 = (sy + ty2) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + sx + \",\" + m2 + \" \" + tx2 + \",\" + m2 + \" \" + tx2 + \",\" + ty2;\n  };\n  const diagonalR = (sa2, sr, ta, tr2) => {\n    const sc = Math.cos(sa2), ss = Math.sin(sa2), tc = Math.cos(ta), ts2 = Math.sin(ta), mr = (sr + tr2) / 2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"C\" + mr * sc + \",\" + mr * ss + \" \" + mr * tc + \",\" + mr * ts2 + \" \" + tr2 * tc + \",\" + tr2 * ts2;\n  };\n  const Paths = fastmap({\n    \"line\": line,\n    \"line-radial\": lineR,\n    \"arc\": arc,\n    \"arc-radial\": arcR,\n    \"curve\": curve,\n    \"curve-radial\": curveR,\n    \"orthogonal-horizontal\": orthoX,\n    \"orthogonal-vertical\": orthoY,\n    \"orthogonal-radial\": orthoR,\n    \"diagonal-horizontal\": diagonalX,\n    \"diagonal-vertical\": diagonalY,\n    \"diagonal-radial\": diagonalR\n  });\n  function Pie(params2) {\n    Transform.call(this, null, params2);\n  }\n  Pie.Definition = {\n    \"type\": \"Pie\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"startAngle\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"endAngle\",\n      \"type\": \"number\",\n      \"default\": 6.283185307179586\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"startAngle\", \"endAngle\"]\n    }]\n  };\n  inherits(Pie, Transform, {\n    transform(_, pulse2) {\n      var as = _.as || [\"startAngle\", \"endAngle\"], startAngle = as[0], endAngle = as[1], field2 = _.field || one$2, start = _.startAngle || 0, stop2 = _.endAngle != null ? _.endAngle : 2 * Math.PI, data2 = pulse2.source, values2 = data2.map(field2), n = values2.length, a2 = start, k = (stop2 - start) / sum$1(values2), index2 = range$3(n), i, t, v;\n      if (_.sort) {\n        index2.sort((a3, b2) => values2[a3] - values2[b2]);\n      }\n      for (i = 0; i < n; ++i) {\n        v = values2[index2[i]];\n        t = data2[index2[i]];\n        t[startAngle] = a2;\n        t[endAngle] = a2 += v * k;\n      }\n      this.value = values2;\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  const DEFAULT_COUNT = 5;\n  function includeZero(scale2) {\n    const type2 = scale2.type;\n    return !scale2.bins && (type2 === Linear || type2 === Pow || type2 === Sqrt);\n  }\n  function includePad(type2) {\n    return isContinuous(type2) && type2 !== Sequential;\n  }\n  const SKIP$1 = toSet([\"set\", \"modified\", \"clear\", \"type\", \"scheme\", \"schemeExtent\", \"schemeCount\", \"domain\", \"domainMin\", \"domainMid\", \"domainMax\", \"domainRaw\", \"domainImplicit\", \"nice\", \"zero\", \"bins\", \"range\", \"rangeStep\", \"round\", \"reverse\", \"interpolate\", \"interpolateGamma\"]);\n  function Scale$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Scale$1, Transform, {\n    transform(_, pulse2) {\n      var df = pulse2.dataflow, scale$12 = this.value, key2 = scaleKey(_);\n      if (!scale$12 || key2 !== scale$12.type) {\n        this.value = scale$12 = scale$6(key2)();\n      }\n      for (key2 in _) if (!SKIP$1[key2]) {\n        if (key2 === \"padding\" && includePad(scale$12.type)) continue;\n        isFunction(scale$12[key2]) ? scale$12[key2](_[key2]) : df.warn(\"Unsupported scale property: \" + key2);\n      }\n      configureRange(scale$12, _, configureBins(scale$12, _, configureDomain(scale$12, _, df)));\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function scaleKey(_) {\n    var t = _.type, d = \"\", n;\n    if (t === Sequential) return Sequential + \"-\" + Linear;\n    if (isContinuousColor(_)) {\n      n = _.rawDomain ? _.rawDomain.length : _.domain ? _.domain.length + +(_.domainMid != null) : 0;\n      d = n === 2 ? Sequential + \"-\" : n === 3 ? Diverging + \"-\" : \"\";\n    }\n    return (d + t || Linear).toLowerCase();\n  }\n  function isContinuousColor(_) {\n    const t = _.type;\n    return isContinuous(t) && t !== Time && t !== UTC && (_.scheme || _.range && _.range.length && _.range.every(isString));\n  }\n  function configureDomain(scale2, _, df) {\n    const raw = rawDomain(scale2, _.domainRaw, df);\n    if (raw > -1) return raw;\n    var domain2 = _.domain, type2 = scale2.type, zero2 = _.zero || _.zero === void 0 && includeZero(scale2), n, mid;\n    if (!domain2) return 0;\n    if (zero2 || _.domainMin != null || _.domainMax != null || _.domainMid != null) {\n      n = (domain2 = domain2.slice()).length - 1 || 1;\n      if (zero2) {\n        if (domain2[0] > 0) domain2[0] = 0;\n        if (domain2[n] < 0) domain2[n] = 0;\n      }\n      if (_.domainMin != null) domain2[0] = _.domainMin;\n      if (_.domainMax != null) domain2[n] = _.domainMax;\n      if (_.domainMid != null) {\n        mid = _.domainMid;\n        const i = mid > domain2[n] ? n + 1 : mid < domain2[0] ? 0 : n;\n        if (i !== n) df.warn(\"Scale domainMid exceeds domain min or max.\", mid);\n        domain2.splice(i, 0, mid);\n      }\n    }\n    if (includePad(type2) && _.padding && domain2[0] !== peek$1(domain2)) {\n      domain2 = padDomain(type2, domain2, _.range, _.padding, _.exponent, _.constant);\n    }\n    scale2.domain(domainCheck(type2, domain2, df));\n    if (type2 === Ordinal) {\n      scale2.unknown(_.domainImplicit ? implicit : void 0);\n    }\n    if (_.nice && scale2.nice) {\n      scale2.nice(_.nice !== true && tickCount(scale2, _.nice) || null);\n    }\n    return domain2.length;\n  }\n  function rawDomain(scale2, raw, df) {\n    if (raw) {\n      scale2.domain(domainCheck(scale2.type, raw, df));\n      return raw.length;\n    } else {\n      return -1;\n    }\n  }\n  function padDomain(type2, domain2, range2, pad2, exponent2, constant2) {\n    var span2 = Math.abs(peek$1(range2) - range2[0]), frac = span2 / (span2 - 2 * pad2), d = type2 === Log$1 ? zoomLog(domain2, null, frac) : type2 === Sqrt ? zoomPow(domain2, null, frac, 0.5) : type2 === Pow ? zoomPow(domain2, null, frac, exponent2 || 1) : type2 === Symlog ? zoomSymlog(domain2, null, frac, constant2 || 1) : zoomLinear(domain2, null, frac);\n    domain2 = domain2.slice();\n    domain2[0] = d[0];\n    domain2[domain2.length - 1] = d[1];\n    return domain2;\n  }\n  function domainCheck(type2, domain2, df) {\n    if (isLogarithmic(type2)) {\n      var s = Math.abs(domain2.reduce((s2, v) => s2 + (v < 0 ? -1 : v > 0 ? 1 : 0), 0));\n      if (s !== domain2.length) {\n        df.warn(\"Log scale domain includes zero: \" + $(domain2));\n      }\n    }\n    return domain2;\n  }\n  function configureBins(scale2, _, count2) {\n    let bins = _.bins;\n    if (bins && !isArray(bins)) {\n      const domain2 = scale2.domain(), lo = domain2[0], hi = peek$1(domain2), step = bins.step;\n      let start = bins.start == null ? lo : bins.start, stop2 = bins.stop == null ? hi : bins.stop;\n      if (!step) error(\"Scale bins parameter missing step property.\");\n      if (start < lo) start = step * Math.ceil(lo / step);\n      if (stop2 > hi) stop2 = step * Math.floor(hi / step);\n      bins = range$3(start, stop2 + step / 2, step);\n    }\n    if (bins) {\n      scale2.bins = bins;\n    } else if (scale2.bins) {\n      delete scale2.bins;\n    }\n    if (scale2.type === BinOrdinal) {\n      if (!bins) {\n        scale2.bins = scale2.domain();\n      } else if (!_.domain && !_.domainRaw) {\n        scale2.domain(bins);\n        count2 = bins.length;\n      }\n    }\n    return count2;\n  }\n  function configureRange(scale2, _, count2) {\n    var type2 = scale2.type, round = _.round || false, range2 = _.range;\n    if (_.rangeStep != null) {\n      range2 = configureRangeStep(type2, _, count2);\n    } else if (_.scheme) {\n      range2 = configureScheme(type2, _, count2);\n      if (isFunction(range2)) {\n        if (scale2.interpolator) {\n          return scale2.interpolator(range2);\n        } else {\n          error(`Scale type ${type2} does not support interpolating color schemes.`);\n        }\n      }\n    }\n    if (range2 && isInterpolating(type2)) {\n      return scale2.interpolator(interpolateColors(flip(range2, _.reverse), _.interpolate, _.interpolateGamma));\n    }\n    if (range2 && _.interpolate && scale2.interpolate) {\n      scale2.interpolate(interpolate(_.interpolate, _.interpolateGamma));\n    } else if (isFunction(scale2.round)) {\n      scale2.round(round);\n    } else if (isFunction(scale2.rangeRound)) {\n      scale2.interpolate(round ? interpolateRound : interpolate$1);\n    }\n    if (range2) scale2.range(flip(range2, _.reverse));\n  }\n  function configureRangeStep(type2, _, count2) {\n    if (type2 !== Band$1 && type2 !== Point) {\n      error(\"Only band and point scales support rangeStep.\");\n    }\n    var outer = (_.paddingOuter != null ? _.paddingOuter : _.padding) || 0, inner = type2 === Point ? 1 : (_.paddingInner != null ? _.paddingInner : _.padding) || 0;\n    return [0, _.rangeStep * bandSpace(count2, inner, outer)];\n  }\n  function configureScheme(type2, _, count2) {\n    var extent2 = _.schemeExtent, name, scheme$1;\n    if (isArray(_.scheme)) {\n      scheme$1 = interpolateColors(_.scheme, _.interpolate, _.interpolateGamma);\n    } else {\n      name = _.scheme.toLowerCase();\n      scheme$1 = scheme(name);\n      if (!scheme$1) error(`Unrecognized scheme name: ${_.scheme}`);\n    }\n    count2 = type2 === Threshold ? count2 + 1 : type2 === BinOrdinal ? count2 - 1 : type2 === Quantile || type2 === Quantize ? +_.schemeCount || DEFAULT_COUNT : count2;\n    return isInterpolating(type2) ? adjustScheme(scheme$1, extent2, _.reverse) : isFunction(scheme$1) ? quantizeInterpolator(adjustScheme(scheme$1, extent2), count2) : type2 === Ordinal ? scheme$1 : scheme$1.slice(0, count2);\n  }\n  function adjustScheme(scheme2, extent2, reverse2) {\n    return isFunction(scheme2) && (extent2 || reverse2) ? interpolateRange(scheme2, flip(extent2 || [0, 1], reverse2)) : scheme2;\n  }\n  function flip(array2, reverse2) {\n    return reverse2 ? array2.slice().reverse() : array2;\n  }\n  function SortItems$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(SortItems$1, Transform, {\n    transform(_, pulse2) {\n      const mod = _.modified(\"sort\") || pulse2.changed(pulse2.ADD) || pulse2.modified(_.sort.fields) || pulse2.modified(\"datum\");\n      if (mod) pulse2.source.sort(stableCompare(_.sort));\n      this.modified(mod);\n      return pulse2;\n    }\n  });\n  const Zero = \"zero\", Center$1 = \"center\", Normalize = \"normalize\", DefOutput = [\"y0\", \"y1\"];\n  function Stack$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Stack$1.Definition = {\n    \"type\": \"Stack\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"offset\",\n      \"type\": \"enum\",\n      \"default\": Zero,\n      \"values\": [Zero, Center$1, Normalize]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": DefOutput\n    }]\n  };\n  inherits(Stack$1, Transform, {\n    transform(_, pulse2) {\n      var as = _.as || DefOutput, y02 = as[0], y12 = as[1], sort2 = stableCompare(_.sort), field2 = _.field || one$2, stack = _.offset === Center$1 ? stackCenter : _.offset === Normalize ? stackNormalize : stackZero, groups, i, n, max2;\n      groups = partition$3(pulse2.source, _.groupby, sort2, field2);\n      for (i = 0, n = groups.length, max2 = groups.max; i < n; ++i) {\n        stack(groups[i], max2, field2, y02, y12);\n      }\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  function stackCenter(group2, max2, field2, y02, y12) {\n    var last = (max2 - group2.sum) / 2, m2 = group2.length, j = 0, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      t[y02] = last;\n      t[y12] = last += Math.abs(field2(t));\n    }\n  }\n  function stackNormalize(group2, max2, field2, y02, y12) {\n    var scale2 = 1 / group2.sum, last = 0, m2 = group2.length, j = 0, v = 0, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      t[y02] = last;\n      t[y12] = last = scale2 * (v += Math.abs(field2(t)));\n    }\n  }\n  function stackZero(group2, max2, field2, y02, y12) {\n    var lastPos = 0, lastNeg = 0, m2 = group2.length, j = 0, v, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      v = +field2(t);\n      if (v < 0) {\n        t[y02] = lastNeg;\n        t[y12] = lastNeg += v;\n      } else {\n        t[y02] = lastPos;\n        t[y12] = lastPos += v;\n      }\n    }\n  }\n  function partition$3(data2, groupby, sort2, field2) {\n    var groups = [], get2 = (f) => f(t), map2, i, n, m2, t, k, g, s, max2;\n    if (groupby == null) {\n      groups.push(data2.slice());\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    for (k = 0, max2 = 0, m2 = groups.length; k < m2; ++k) {\n      g = groups[k];\n      for (i = 0, s = 0, n = g.length; i < n; ++i) {\n        s += Math.abs(field2(g[i]));\n      }\n      g.sum = s;\n      if (s > max2) max2 = s;\n      if (sort2) g.sort(sort2);\n    }\n    groups.max = max2;\n    return groups;\n  }\n  const encode$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    axisticks: AxisTicks$1,\n    datajoin: DataJoin$1,\n    encode: Encode$1,\n    legendentries: LegendEntries$1,\n    linkpath: LinkPath,\n    pie: Pie,\n    scale: Scale$1,\n    sortitems: SortItems$1,\n    stack: Stack$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var epsilon$3 = 1e-6;\n  var epsilon2 = 1e-12;\n  var pi$1 = Math.PI;\n  var halfPi$1 = pi$1 / 2;\n  var quarterPi = pi$1 / 4;\n  var tau$1 = pi$1 * 2;\n  var degrees = 180 / pi$1;\n  var radians = pi$1 / 180;\n  var abs$1 = Math.abs;\n  var atan = Math.atan;\n  var atan2 = Math.atan2;\n  var cos$1 = Math.cos;\n  var ceil = Math.ceil;\n  var exp = Math.exp;\n  var hypot = Math.hypot;\n  var log$1 = Math.log;\n  var pow$1 = Math.pow;\n  var sin$1 = Math.sin;\n  var sign = Math.sign || function(x2) {\n    return x2 > 0 ? 1 : x2 < 0 ? -1 : 0;\n  };\n  var sqrt$1 = Math.sqrt;\n  var tan = Math.tan;\n  function acos(x2) {\n    return x2 > 1 ? 0 : x2 < -1 ? pi$1 : Math.acos(x2);\n  }\n  function asin$1(x2) {\n    return x2 > 1 ? halfPi$1 : x2 < -1 ? -halfPi$1 : Math.asin(x2);\n  }\n  function noop$2() {\n  }\n  function streamGeometry(geometry, stream2) {\n    if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n      streamGeometryType[geometry.type](geometry, stream2);\n    }\n  }\n  var streamObjectType = {\n    Feature: function(object2, stream2) {\n      streamGeometry(object2.geometry, stream2);\n    },\n    FeatureCollection: function(object2, stream2) {\n      var features = object2.features, i = -1, n = features.length;\n      while (++i < n) streamGeometry(features[i].geometry, stream2);\n    }\n  };\n  var streamGeometryType = {\n    Sphere: function(object2, stream2) {\n      stream2.sphere();\n    },\n    Point: function(object2, stream2) {\n      object2 = object2.coordinates;\n      stream2.point(object2[0], object2[1], object2[2]);\n    },\n    MultiPoint: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object2 = coordinates[i], stream2.point(object2[0], object2[1], object2[2]);\n    },\n    LineString: function(object2, stream2) {\n      streamLine(object2.coordinates, stream2, 0);\n    },\n    MultiLineString: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) streamLine(coordinates[i], stream2, 0);\n    },\n    Polygon: function(object2, stream2) {\n      streamPolygon(object2.coordinates, stream2);\n    },\n    MultiPolygon: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) streamPolygon(coordinates[i], stream2);\n    },\n    GeometryCollection: function(object2, stream2) {\n      var geometries = object2.geometries, i = -1, n = geometries.length;\n      while (++i < n) streamGeometry(geometries[i], stream2);\n    }\n  };\n  function streamLine(coordinates, stream2, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    stream2.lineStart();\n    while (++i < n) coordinate = coordinates[i], stream2.point(coordinate[0], coordinate[1], coordinate[2]);\n    stream2.lineEnd();\n  }\n  function streamPolygon(coordinates, stream2) {\n    var i = -1, n = coordinates.length;\n    stream2.polygonStart();\n    while (++i < n) streamLine(coordinates[i], stream2, 1);\n    stream2.polygonEnd();\n  }\n  function geoStream(object2, stream2) {\n    if (object2 && streamObjectType.hasOwnProperty(object2.type)) {\n      streamObjectType[object2.type](object2, stream2);\n    } else {\n      streamGeometry(object2, stream2);\n    }\n  }\n  var areaRingSum$1 = new Adder();\n  var areaSum$1 = new Adder(), lambda00$2, phi00$2, lambda0$1, cosPhi0, sinPhi0;\n  var areaStream$1 = {\n    point: noop$2,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: function() {\n      areaRingSum$1 = new Adder();\n      areaStream$1.lineStart = areaRingStart$1;\n      areaStream$1.lineEnd = areaRingEnd$1;\n    },\n    polygonEnd: function() {\n      var areaRing = +areaRingSum$1;\n      areaSum$1.add(areaRing < 0 ? tau$1 + areaRing : areaRing);\n      this.lineStart = this.lineEnd = this.point = noop$2;\n    },\n    sphere: function() {\n      areaSum$1.add(tau$1);\n    }\n  };\n  function areaRingStart$1() {\n    areaStream$1.point = areaPointFirst$1;\n  }\n  function areaRingEnd$1() {\n    areaPoint$1(lambda00$2, phi00$2);\n  }\n  function areaPointFirst$1(lambda, phi2) {\n    areaStream$1.point = areaPoint$1;\n    lambda00$2 = lambda, phi00$2 = phi2;\n    lambda *= radians, phi2 *= radians;\n    lambda0$1 = lambda, cosPhi0 = cos$1(phi2 = phi2 / 2 + quarterPi), sinPhi0 = sin$1(phi2);\n  }\n  function areaPoint$1(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    phi2 = phi2 / 2 + quarterPi;\n    var dLambda = lambda - lambda0$1, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos$1(phi2), sinPhi = sin$1(phi2), k = sinPhi0 * sinPhi, u2 = cosPhi0 * cosPhi + k * cos$1(adLambda), v = k * sdLambda * sin$1(adLambda);\n    areaRingSum$1.add(atan2(v, u2));\n    lambda0$1 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n  }\n  function geoArea$1(object2) {\n    areaSum$1 = new Adder();\n    geoStream(object2, areaStream$1);\n    return areaSum$1 * 2;\n  }\n  function spherical(cartesian2) {\n    return [atan2(cartesian2[1], cartesian2[0]), asin$1(cartesian2[2])];\n  }\n  function cartesian(spherical2) {\n    var lambda = spherical2[0], phi2 = spherical2[1], cosPhi = cos$1(phi2);\n    return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi2)];\n  }\n  function cartesianDot(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];\n  }\n  function cartesianCross(a2, b2) {\n    return [a2[1] * b2[2] - a2[2] * b2[1], a2[2] * b2[0] - a2[0] * b2[2], a2[0] * b2[1] - a2[1] * b2[0]];\n  }\n  function cartesianAddInPlace(a2, b2) {\n    a2[0] += b2[0], a2[1] += b2[1], a2[2] += b2[2];\n  }\n  function cartesianScale(vector, k) {\n    return [vector[0] * k, vector[1] * k, vector[2] * k];\n  }\n  function cartesianNormalizeInPlace(d) {\n    var l = sqrt$1(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l, d[1] /= l, d[2] /= l;\n  }\n  var lambda0, phi0, lambda1, phi1, lambda2, lambda00$1, phi00$1, p0, deltaSum, ranges, range$2;\n  var boundsStream$1 = {\n    point: boundsPoint$1,\n    lineStart: boundsLineStart,\n    lineEnd: boundsLineEnd,\n    polygonStart: function() {\n      boundsStream$1.point = boundsRingPoint;\n      boundsStream$1.lineStart = boundsRingStart;\n      boundsStream$1.lineEnd = boundsRingEnd;\n      deltaSum = new Adder();\n      areaStream$1.polygonStart();\n    },\n    polygonEnd: function() {\n      areaStream$1.polygonEnd();\n      boundsStream$1.point = boundsPoint$1;\n      boundsStream$1.lineStart = boundsLineStart;\n      boundsStream$1.lineEnd = boundsLineEnd;\n      if (areaRingSum$1 < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n      else if (deltaSum > epsilon$3) phi1 = 90;\n      else if (deltaSum < -epsilon$3) phi0 = -90;\n      range$2[0] = lambda0, range$2[1] = lambda1;\n    },\n    sphere: function() {\n      lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n    }\n  };\n  function boundsPoint$1(lambda, phi2) {\n    ranges.push(range$2 = [lambda0 = lambda, lambda1 = lambda]);\n    if (phi2 < phi0) phi0 = phi2;\n    if (phi2 > phi1) phi1 = phi2;\n  }\n  function linePoint(lambda, phi2) {\n    var p = cartesian([lambda * radians, phi2 * radians]);\n    if (p0) {\n      var normal = cartesianCross(p0, p), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal);\n      cartesianNormalizeInPlace(inflection);\n      inflection = spherical(inflection);\n      var delta = lambda - lambda2, sign2 = delta > 0 ? 1 : -1, lambdai = inflection[0] * degrees * sign2, phii, antimeridian = abs$1(delta) > 180;\n      if (antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {\n        phii = inflection[1] * degrees;\n        if (phii > phi1) phi1 = phii;\n      } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {\n        phii = -inflection[1] * degrees;\n        if (phii < phi0) phi0 = phii;\n      } else {\n        if (phi2 < phi0) phi0 = phi2;\n        if (phi2 > phi1) phi1 = phi2;\n      }\n      if (antimeridian) {\n        if (lambda < lambda2) {\n          if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n        } else {\n          if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        }\n      } else {\n        if (lambda1 >= lambda0) {\n          if (lambda < lambda0) lambda0 = lambda;\n          if (lambda > lambda1) lambda1 = lambda;\n        } else {\n          if (lambda > lambda2) {\n            if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n          } else {\n            if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n          }\n        }\n      }\n    } else {\n      ranges.push(range$2 = [lambda0 = lambda, lambda1 = lambda]);\n    }\n    if (phi2 < phi0) phi0 = phi2;\n    if (phi2 > phi1) phi1 = phi2;\n    p0 = p, lambda2 = lambda;\n  }\n  function boundsLineStart() {\n    boundsStream$1.point = linePoint;\n  }\n  function boundsLineEnd() {\n    range$2[0] = lambda0, range$2[1] = lambda1;\n    boundsStream$1.point = boundsPoint$1;\n    p0 = null;\n  }\n  function boundsRingPoint(lambda, phi2) {\n    if (p0) {\n      var delta = lambda - lambda2;\n      deltaSum.add(abs$1(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n    } else {\n      lambda00$1 = lambda, phi00$1 = phi2;\n    }\n    areaStream$1.point(lambda, phi2);\n    linePoint(lambda, phi2);\n  }\n  function boundsRingStart() {\n    areaStream$1.lineStart();\n  }\n  function boundsRingEnd() {\n    boundsRingPoint(lambda00$1, phi00$1);\n    areaStream$1.lineEnd();\n    if (abs$1(deltaSum) > epsilon$3) lambda0 = -(lambda1 = 180);\n    range$2[0] = lambda0, range$2[1] = lambda1;\n    p0 = null;\n  }\n  function angle(lambda02, lambda12) {\n    return (lambda12 -= lambda02) < 0 ? lambda12 + 360 : lambda12;\n  }\n  function rangeCompare(a2, b2) {\n    return a2[0] - b2[0];\n  }\n  function rangeContains(range2, x2) {\n    return range2[0] <= range2[1] ? range2[0] <= x2 && x2 <= range2[1] : x2 < range2[0] || range2[1] < x2;\n  }\n  function geoBounds$1(feature2) {\n    var i, n, a2, b2, merged, deltaMax, delta;\n    phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n    ranges = [];\n    geoStream(feature2, boundsStream$1);\n    if (n = ranges.length) {\n      ranges.sort(rangeCompare);\n      for (i = 1, a2 = ranges[0], merged = [a2]; i < n; ++i) {\n        b2 = ranges[i];\n        if (rangeContains(a2, b2[0]) || rangeContains(a2, b2[1])) {\n          if (angle(a2[0], b2[1]) > angle(a2[0], a2[1])) a2[1] = b2[1];\n          if (angle(b2[0], a2[1]) > angle(a2[0], a2[1])) a2[0] = b2[0];\n        } else {\n          merged.push(a2 = b2);\n        }\n      }\n      for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a2 = merged[n]; i <= n; a2 = b2, ++i) {\n        b2 = merged[i];\n        if ((delta = angle(a2[1], b2[0])) > deltaMax) deltaMax = delta, lambda0 = b2[0], lambda1 = a2[1];\n      }\n    }\n    ranges = range$2 = null;\n    return lambda0 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0, phi0], [lambda1, phi1]];\n  }\n  var W0, W1, X0$1, Y0$1, Z0$1, X1$1, Y1$1, Z1$1, X2$1, Y2$1, Z2$1, lambda00, phi00, x0$4, y0$4, z0;\n  var centroidStream$1 = {\n    sphere: noop$2,\n    point: centroidPoint$1,\n    lineStart: centroidLineStart$1,\n    lineEnd: centroidLineEnd$1,\n    polygonStart: function() {\n      centroidStream$1.lineStart = centroidRingStart$1;\n      centroidStream$1.lineEnd = centroidRingEnd$1;\n    },\n    polygonEnd: function() {\n      centroidStream$1.lineStart = centroidLineStart$1;\n      centroidStream$1.lineEnd = centroidLineEnd$1;\n    }\n  };\n  function centroidPoint$1(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2);\n    centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi2));\n  }\n  function centroidPointCartesian(x2, y2, z) {\n    ++W0;\n    X0$1 += (x2 - X0$1) / W0;\n    Y0$1 += (y2 - Y0$1) / W0;\n    Z0$1 += (z - Z0$1) / W0;\n  }\n  function centroidLineStart$1() {\n    centroidStream$1.point = centroidLinePointFirst;\n  }\n  function centroidLinePointFirst(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2);\n    x0$4 = cosPhi * cos$1(lambda);\n    y0$4 = cosPhi * sin$1(lambda);\n    z0 = sin$1(phi2);\n    centroidStream$1.point = centroidLinePoint;\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidLinePoint(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2), x2 = cosPhi * cos$1(lambda), y2 = cosPhi * sin$1(lambda), z = sin$1(phi2), w2 = atan2(sqrt$1((w2 = y0$4 * z - z0 * y2) * w2 + (w2 = z0 * x2 - x0$4 * z) * w2 + (w2 = x0$4 * y2 - y0$4 * x2) * w2), x0$4 * x2 + y0$4 * y2 + z0 * z);\n    W1 += w2;\n    X1$1 += w2 * (x0$4 + (x0$4 = x2));\n    Y1$1 += w2 * (y0$4 + (y0$4 = y2));\n    Z1$1 += w2 * (z0 + (z0 = z));\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidLineEnd$1() {\n    centroidStream$1.point = centroidPoint$1;\n  }\n  function centroidRingStart$1() {\n    centroidStream$1.point = centroidRingPointFirst;\n  }\n  function centroidRingEnd$1() {\n    centroidRingPoint(lambda00, phi00);\n    centroidStream$1.point = centroidPoint$1;\n  }\n  function centroidRingPointFirst(lambda, phi2) {\n    lambda00 = lambda, phi00 = phi2;\n    lambda *= radians, phi2 *= radians;\n    centroidStream$1.point = centroidRingPoint;\n    var cosPhi = cos$1(phi2);\n    x0$4 = cosPhi * cos$1(lambda);\n    y0$4 = cosPhi * sin$1(lambda);\n    z0 = sin$1(phi2);\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidRingPoint(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2), x2 = cosPhi * cos$1(lambda), y2 = cosPhi * sin$1(lambda), z = sin$1(phi2), cx = y0$4 * z - z0 * y2, cy = z0 * x2 - x0$4 * z, cz = x0$4 * y2 - y0$4 * x2, m2 = hypot(cx, cy, cz), w2 = asin$1(m2), v = m2 && -w2 / m2;\n    X2$1.add(v * cx);\n    Y2$1.add(v * cy);\n    Z2$1.add(v * cz);\n    W1 += w2;\n    X1$1 += w2 * (x0$4 + (x0$4 = x2));\n    Y1$1 += w2 * (y0$4 + (y0$4 = y2));\n    Z1$1 += w2 * (z0 + (z0 = z));\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function geoCentroid$1(object2) {\n    W0 = W1 = X0$1 = Y0$1 = Z0$1 = X1$1 = Y1$1 = Z1$1 = 0;\n    X2$1 = new Adder();\n    Y2$1 = new Adder();\n    Z2$1 = new Adder();\n    geoStream(object2, centroidStream$1);\n    var x2 = +X2$1, y2 = +Y2$1, z = +Z2$1, m2 = hypot(x2, y2, z);\n    if (m2 < epsilon2) {\n      x2 = X1$1, y2 = Y1$1, z = Z1$1;\n      if (W1 < epsilon$3) x2 = X0$1, y2 = Y0$1, z = Z0$1;\n      m2 = hypot(x2, y2, z);\n      if (m2 < epsilon2) return [NaN, NaN];\n    }\n    return [atan2(y2, x2) * degrees, asin$1(z / m2) * degrees];\n  }\n  function compose(a2, b2) {\n    function compose2(x2, y2) {\n      return x2 = a2(x2, y2), b2(x2[0], x2[1]);\n    }\n    if (a2.invert && b2.invert) compose2.invert = function(x2, y2) {\n      return x2 = b2.invert(x2, y2), x2 && a2.invert(x2[0], x2[1]);\n    };\n    return compose2;\n  }\n  function rotationIdentity(lambda, phi2) {\n    if (abs$1(lambda) > pi$1) lambda -= Math.round(lambda / tau$1) * tau$1;\n    return [lambda, phi2];\n  }\n  rotationIdentity.invert = rotationIdentity;\n  function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n    return (deltaLambda %= tau$1) ? deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;\n  }\n  function forwardRotationLambda(deltaLambda) {\n    return function(lambda, phi2) {\n      lambda += deltaLambda;\n      if (abs$1(lambda) > pi$1) lambda -= Math.round(lambda / tau$1) * tau$1;\n      return [lambda, phi2];\n    };\n  }\n  function rotationLambda(deltaLambda) {\n    var rotation2 = forwardRotationLambda(deltaLambda);\n    rotation2.invert = forwardRotationLambda(-deltaLambda);\n    return rotation2;\n  }\n  function rotationPhiGamma(deltaPhi, deltaGamma) {\n    var cosDeltaPhi = cos$1(deltaPhi), sinDeltaPhi = sin$1(deltaPhi), cosDeltaGamma = cos$1(deltaGamma), sinDeltaGamma = sin$1(deltaGamma);\n    function rotation2(lambda, phi2) {\n      var cosPhi = cos$1(phi2), x2 = cos$1(lambda) * cosPhi, y2 = sin$1(lambda) * cosPhi, z = sin$1(phi2), k = z * cosDeltaPhi + x2 * sinDeltaPhi;\n      return [\n        atan2(y2 * cosDeltaGamma - k * sinDeltaGamma, x2 * cosDeltaPhi - z * sinDeltaPhi),\n        asin$1(k * cosDeltaGamma + y2 * sinDeltaGamma)\n      ];\n    }\n    rotation2.invert = function(lambda, phi2) {\n      var cosPhi = cos$1(phi2), x2 = cos$1(lambda) * cosPhi, y2 = sin$1(lambda) * cosPhi, z = sin$1(phi2), k = z * cosDeltaGamma - y2 * sinDeltaGamma;\n      return [\n        atan2(y2 * cosDeltaGamma + z * sinDeltaGamma, x2 * cosDeltaPhi + k * sinDeltaPhi),\n        asin$1(k * cosDeltaPhi - x2 * sinDeltaPhi)\n      ];\n    };\n    return rotation2;\n  }\n  function rotation(rotate2) {\n    rotate2 = rotateRadians(rotate2[0] * radians, rotate2[1] * radians, rotate2.length > 2 ? rotate2[2] * radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate2(coordinates[0] * radians, coordinates[1] * radians);\n      return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate2.invert(coordinates[0] * radians, coordinates[1] * radians);\n      return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n    };\n    return forward;\n  }\n  function circleStream(stream2, radius2, delta, direction, t02, t12) {\n    if (!delta) return;\n    var cosRadius = cos$1(radius2), sinRadius = sin$1(radius2), step = direction * delta;\n    if (t02 == null) {\n      t02 = radius2 + direction * tau$1;\n      t12 = radius2 - step / 2;\n    } else {\n      t02 = circleRadius(cosRadius, t02);\n      t12 = circleRadius(cosRadius, t12);\n      if (direction > 0 ? t02 < t12 : t02 > t12) t02 += direction * tau$1;\n    }\n    for (var point2, t = t02; direction > 0 ? t > t12 : t < t12; t -= step) {\n      point2 = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);\n      stream2.point(point2[0], point2[1]);\n    }\n  }\n  function circleRadius(cosRadius, point2) {\n    point2 = cartesian(point2), point2[0] -= cosRadius;\n    cartesianNormalizeInPlace(point2);\n    var radius2 = acos(-point2[1]);\n    return ((-point2[2] < 0 ? -radius2 : radius2) + tau$1 - epsilon$3) % tau$1;\n  }\n  function clipBuffer() {\n    var lines = [], line2;\n    return {\n      point: function(x2, y2, m2) {\n        line2.push([x2, y2, m2]);\n      },\n      lineStart: function() {\n        lines.push(line2 = []);\n      },\n      lineEnd: noop$2,\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      },\n      result: function() {\n        var result = lines;\n        lines = [];\n        line2 = null;\n        return result;\n      }\n    };\n  }\n  function pointEqual(a2, b2) {\n    return abs$1(a2[0] - b2[0]) < epsilon$3 && abs$1(a2[1] - b2[1]) < epsilon$3;\n  }\n  function Intersection(point2, points2, other, entry2) {\n    this.x = point2;\n    this.z = points2;\n    this.o = other;\n    this.e = entry2;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function clipRejoin(segments2, compareIntersection2, startInside, interpolate2, stream2) {\n    var subject = [], clip2 = [], i, n;\n    segments2.forEach(function(segment) {\n      if ((n2 = segment.length - 1) <= 0) return;\n      var n2, p02 = segment[0], p1 = segment[n2], x2;\n      if (pointEqual(p02, p1)) {\n        if (!p02[2] && !p1[2]) {\n          stream2.lineStart();\n          for (i = 0; i < n2; ++i) stream2.point((p02 = segment[i])[0], p02[1]);\n          stream2.lineEnd();\n          return;\n        }\n        p1[0] += 2 * epsilon$3;\n      }\n      subject.push(x2 = new Intersection(p02, segment, null, true));\n      clip2.push(x2.o = new Intersection(p02, null, x2, false));\n      subject.push(x2 = new Intersection(p1, segment, null, false));\n      clip2.push(x2.o = new Intersection(p1, null, x2, true));\n    });\n    if (!subject.length) return;\n    clip2.sort(compareIntersection2);\n    link(subject);\n    link(clip2);\n    for (i = 0, n = clip2.length; i < n; ++i) {\n      clip2[i].e = startInside = !startInside;\n    }\n    var start = subject[0], points2, point2;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points2 = current.z;\n      stream2.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (i = 0, n = points2.length; i < n; ++i) stream2.point((point2 = points2[i])[0], point2[1]);\n          } else {\n            interpolate2(current.x, current.n.x, 1, stream2);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points2 = current.p.z;\n            for (i = points2.length - 1; i >= 0; --i) stream2.point((point2 = points2[i])[0], point2[1]);\n          } else {\n            interpolate2(current.x, current.p.x, -1, stream2);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points2 = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      stream2.lineEnd();\n    }\n  }\n  function link(array2) {\n    if (!(n = array2.length)) return;\n    var n, i = 0, a2 = array2[0], b2;\n    while (++i < n) {\n      a2.n = b2 = array2[i];\n      b2.p = a2;\n      a2 = b2;\n    }\n    a2.n = b2 = array2[0];\n    b2.p = a2;\n  }\n  function longitude(point2) {\n    return abs$1(point2[0]) <= pi$1 ? point2[0] : sign(point2[0]) * ((abs$1(point2[0]) + pi$1) % tau$1 - pi$1);\n  }\n  function polygonContains(polygon, point2) {\n    var lambda = longitude(point2), phi2 = point2[1], sinPhi = sin$1(phi2), normal = [sin$1(lambda), -cos$1(lambda), 0], angle2 = 0, winding = 0;\n    var sum2 = new Adder();\n    if (sinPhi === 1) phi2 = halfPi$1 + epsilon$3;\n    else if (sinPhi === -1) phi2 = -halfPi$1 - epsilon$3;\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      if (!(m2 = (ring = polygon[i]).length)) continue;\n      var ring, m2, point0 = ring[m2 - 1], lambda02 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi02 = sin$1(phi02), cosPhi02 = cos$1(phi02);\n      for (var j = 0; j < m2; ++j, lambda02 = lambda12, sinPhi02 = sinPhi1, cosPhi02 = cosPhi1, point0 = point1) {\n        var point1 = ring[j], lambda12 = longitude(point1), phi12 = point1[1] / 2 + quarterPi, sinPhi1 = sin$1(phi12), cosPhi1 = cos$1(phi12), delta = lambda12 - lambda02, sign2 = delta >= 0 ? 1 : -1, absDelta = sign2 * delta, antimeridian = absDelta > pi$1, k = sinPhi02 * sinPhi1;\n        sum2.add(atan2(k * sign2 * sin$1(absDelta), cosPhi02 * cosPhi1 + k * cos$1(absDelta)));\n        angle2 += antimeridian ? delta + sign2 * tau$1 : delta;\n        if (antimeridian ^ lambda02 >= lambda ^ lambda12 >= lambda) {\n          var arc2 = cartesianCross(cartesian(point0), cartesian(point1));\n          cartesianNormalizeInPlace(arc2);\n          var intersection2 = cartesianCross(normal, arc2);\n          cartesianNormalizeInPlace(intersection2);\n          var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection2[2]);\n          if (phi2 > phiArc || phi2 === phiArc && (arc2[0] || arc2[1])) {\n            winding += antimeridian ^ delta >= 0 ? 1 : -1;\n          }\n        }\n      }\n    }\n    return (angle2 < -epsilon$3 || angle2 < epsilon$3 && sum2 < -epsilon2) ^ winding & 1;\n  }\n  function clip$1(pointVisible, clipLine2, interpolate2, start) {\n    return function(sink) {\n      var line2 = clipLine2(sink), ringBuffer = clipBuffer(), ringSink = clipLine2(ringBuffer), polygonStarted = false, polygon, segments2, ring;\n      var clip2 = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart: function() {\n          clip2.point = pointRing;\n          clip2.lineStart = ringStart;\n          clip2.lineEnd = ringEnd;\n          segments2 = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip2.point = point2;\n          clip2.lineStart = lineStart;\n          clip2.lineEnd = lineEnd;\n          segments2 = merge$2(segments2);\n          var startInside = polygonContains(polygon, start);\n          if (segments2.length) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            clipRejoin(segments2, compareIntersection, startInside, interpolate2, sink);\n          } else if (startInside) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            sink.lineStart();\n            interpolate2(null, null, 1, sink);\n            sink.lineEnd();\n          }\n          if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n          segments2 = polygon = null;\n        },\n        sphere: function() {\n          sink.polygonStart();\n          sink.lineStart();\n          interpolate2(null, null, 1, sink);\n          sink.lineEnd();\n          sink.polygonEnd();\n        }\n      };\n      function point2(lambda, phi2) {\n        if (pointVisible(lambda, phi2)) sink.point(lambda, phi2);\n      }\n      function pointLine(lambda, phi2) {\n        line2.point(lambda, phi2);\n      }\n      function lineStart() {\n        clip2.point = pointLine;\n        line2.lineStart();\n      }\n      function lineEnd() {\n        clip2.point = point2;\n        line2.lineEnd();\n      }\n      function pointRing(lambda, phi2) {\n        ring.push([lambda, phi2]);\n        ringSink.point(lambda, phi2);\n      }\n      function ringStart() {\n        ringSink.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringSink.lineEnd();\n        var clean = ringSink.clean(), ringSegments = ringBuffer.result(), i, n = ringSegments.length, m2, segment, point3;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          if ((m2 = segment.length - 1) > 0) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            sink.lineStart();\n            for (i = 0; i < m2; ++i) sink.point((point3 = segment[i])[0], point3[1]);\n            sink.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments2.push(ringSegments.filter(validSegment));\n      }\n      return clip2;\n    };\n  }\n  function validSegment(segment) {\n    return segment.length > 1;\n  }\n  function compareIntersection(a2, b2) {\n    return ((a2 = a2.x)[0] < 0 ? a2[1] - halfPi$1 - epsilon$3 : halfPi$1 - a2[1]) - ((b2 = b2.x)[0] < 0 ? b2[1] - halfPi$1 - epsilon$3 : halfPi$1 - b2[1]);\n  }\n  const clipAntimeridian = clip$1(\n    function() {\n      return true;\n    },\n    clipAntimeridianLine,\n    clipAntimeridianInterpolate,\n    [-pi$1, -halfPi$1]\n  );\n  function clipAntimeridianLine(stream2) {\n    var lambda02 = NaN, phi02 = NaN, sign0 = NaN, clean;\n    return {\n      lineStart: function() {\n        stream2.lineStart();\n        clean = 1;\n      },\n      point: function(lambda12, phi12) {\n        var sign1 = lambda12 > 0 ? pi$1 : -pi$1, delta = abs$1(lambda12 - lambda02);\n        if (abs$1(delta - pi$1) < epsilon$3) {\n          stream2.point(lambda02, phi02 = (phi02 + phi12) / 2 > 0 ? halfPi$1 : -halfPi$1);\n          stream2.point(sign0, phi02);\n          stream2.lineEnd();\n          stream2.lineStart();\n          stream2.point(sign1, phi02);\n          stream2.point(lambda12, phi02);\n          clean = 0;\n        } else if (sign0 !== sign1 && delta >= pi$1) {\n          if (abs$1(lambda02 - sign0) < epsilon$3) lambda02 -= sign0 * epsilon$3;\n          if (abs$1(lambda12 - sign1) < epsilon$3) lambda12 -= sign1 * epsilon$3;\n          phi02 = clipAntimeridianIntersect(lambda02, phi02, lambda12, phi12);\n          stream2.point(sign0, phi02);\n          stream2.lineEnd();\n          stream2.lineStart();\n          stream2.point(sign1, phi02);\n          clean = 0;\n        }\n        stream2.point(lambda02 = lambda12, phi02 = phi12);\n        sign0 = sign1;\n      },\n      lineEnd: function() {\n        stream2.lineEnd();\n        lambda02 = phi02 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function clipAntimeridianIntersect(lambda02, phi02, lambda12, phi12) {\n    var cosPhi02, cosPhi1, sinLambda0Lambda1 = sin$1(lambda02 - lambda12);\n    return abs$1(sinLambda0Lambda1) > epsilon$3 ? atan((sin$1(phi02) * (cosPhi1 = cos$1(phi12)) * sin$1(lambda12) - sin$1(phi12) * (cosPhi02 = cos$1(phi02)) * sin$1(lambda02)) / (cosPhi02 * cosPhi1 * sinLambda0Lambda1)) : (phi02 + phi12) / 2;\n  }\n  function clipAntimeridianInterpolate(from, to, direction, stream2) {\n    var phi2;\n    if (from == null) {\n      phi2 = direction * halfPi$1;\n      stream2.point(-pi$1, phi2);\n      stream2.point(0, phi2);\n      stream2.point(pi$1, phi2);\n      stream2.point(pi$1, 0);\n      stream2.point(pi$1, -phi2);\n      stream2.point(0, -phi2);\n      stream2.point(-pi$1, -phi2);\n      stream2.point(-pi$1, 0);\n      stream2.point(-pi$1, phi2);\n    } else if (abs$1(from[0] - to[0]) > epsilon$3) {\n      var lambda = from[0] < to[0] ? pi$1 : -pi$1;\n      phi2 = direction * lambda / 2;\n      stream2.point(-lambda, phi2);\n      stream2.point(0, phi2);\n      stream2.point(lambda, phi2);\n    } else {\n      stream2.point(to[0], to[1]);\n    }\n  }\n  function clipCircle(radius2) {\n    var cr2 = cos$1(radius2), delta = 2 * radians, smallRadius = cr2 > 0, notHemisphere = abs$1(cr2) > epsilon$3;\n    function interpolate2(from, to, direction, stream2) {\n      circleStream(stream2, radius2, delta, direction, from, to);\n    }\n    function visible(lambda, phi2) {\n      return cos$1(lambda) * cos$1(phi2) > cr2;\n    }\n    function clipLine2(stream2) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(lambda, phi2) {\n          var point1 = [lambda, phi2], point2, v = visible(lambda, phi2), c2 = smallRadius ? v ? 0 : code(lambda, phi2) : v ? code(lambda + (lambda < 0 ? pi$1 : -pi$1), phi2) : 0;\n          if (!point0 && (v00 = v0 = v)) stream2.lineStart();\n          if (v !== v0) {\n            point2 = intersect2(point0, point1);\n            if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2))\n              point1[2] = 1;\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              stream2.lineStart();\n              point2 = intersect2(point1, point0);\n              stream2.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect2(point0, point1);\n              stream2.point(point2[0], point2[1], 2);\n              stream2.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c2 & c0) && (t = intersect2(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                stream2.lineStart();\n                stream2.point(t[0][0], t[0][1]);\n                stream2.point(t[1][0], t[1][1]);\n                stream2.lineEnd();\n              } else {\n                stream2.point(t[1][0], t[1][1]);\n                stream2.lineEnd();\n                stream2.lineStart();\n                stream2.point(t[0][0], t[0][1], 3);\n              }\n            }\n          }\n          if (v && (!point0 || !pointEqual(point0, point1))) {\n            stream2.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c2;\n        },\n        lineEnd: function() {\n          if (v0) stream2.lineEnd();\n          point0 = null;\n        },\n        // Rejoin first and last segments if there were intersections and the first\n        // and last points were visible.\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect2(a2, b2, two) {\n      var pa2 = cartesian(a2), pb = cartesian(b2);\n      var n1 = [1, 0, 0], n2 = cartesianCross(pa2, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a2;\n      var c1 = cr2 * n2n2 / determinant, c2 = -cr2 * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A5 = cartesianScale(n1, c1), B2 = cartesianScale(n2, c2);\n      cartesianAddInPlace(A5, B2);\n      var u2 = n1xn2, w2 = cartesianDot(A5, u2), uu = cartesianDot(u2, u2), t22 = w2 * w2 - uu * (cartesianDot(A5, A5) - 1);\n      if (t22 < 0) return;\n      var t = sqrt$1(t22), q = cartesianScale(u2, (-w2 - t) / uu);\n      cartesianAddInPlace(q, A5);\n      q = spherical(q);\n      if (!two) return q;\n      var lambda02 = a2[0], lambda12 = b2[0], phi02 = a2[1], phi12 = b2[1], z;\n      if (lambda12 < lambda02) z = lambda02, lambda02 = lambda12, lambda12 = z;\n      var delta2 = lambda12 - lambda02, polar = abs$1(delta2 - pi$1) < epsilon$3, meridian = polar || delta2 < epsilon$3;\n      if (!polar && phi12 < phi02) z = phi02, phi02 = phi12, phi12 = z;\n      if (meridian ? polar ? phi02 + phi12 > 0 ^ q[1] < (abs$1(q[0] - lambda02) < epsilon$3 ? phi02 : phi12) : phi02 <= q[1] && q[1] <= phi12 : delta2 > pi$1 ^ (lambda02 <= q[0] && q[0] <= lambda12)) {\n        var q1 = cartesianScale(u2, (-w2 + t) / uu);\n        cartesianAddInPlace(q1, A5);\n        return [q, spherical(q1)];\n      }\n    }\n    function code(lambda, phi2) {\n      var r = smallRadius ? radius2 : pi$1 - radius2, code2 = 0;\n      if (lambda < -r) code2 |= 1;\n      else if (lambda > r) code2 |= 2;\n      if (phi2 < -r) code2 |= 4;\n      else if (phi2 > r) code2 |= 8;\n      return code2;\n    }\n    return clip$1(visible, clipLine2, interpolate2, smallRadius ? [0, -radius2] : [-pi$1, radius2 - pi$1]);\n  }\n  function clipLine(a2, b2, x02, y02, x12, y12) {\n    var ax = a2[0], ay = a2[1], bx = b2[0], by = b2[1], t02 = 0, t12 = 1, dx = bx - ax, dy = by - ay, r;\n    r = x02 - ax;\n    if (!dx && r > 0) return;\n    r /= dx;\n    if (dx < 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    } else if (dx > 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    }\n    r = x12 - ax;\n    if (!dx && r < 0) return;\n    r /= dx;\n    if (dx < 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    } else if (dx > 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    }\n    r = y02 - ay;\n    if (!dy && r > 0) return;\n    r /= dy;\n    if (dy < 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    } else if (dy > 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    }\n    r = y12 - ay;\n    if (!dy && r < 0) return;\n    r /= dy;\n    if (dy < 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    } else if (dy > 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    }\n    if (t02 > 0) a2[0] = ax + t02 * dx, a2[1] = ay + t02 * dy;\n    if (t12 < 1) b2[0] = ax + t12 * dx, b2[1] = ay + t12 * dy;\n    return true;\n  }\n  var clipMax = 1e9, clipMin = -clipMax;\n  function clipRectangle(x02, y02, x12, y12) {\n    function visible(x2, y2) {\n      return x02 <= x2 && x2 <= x12 && y02 <= y2 && y2 <= y12;\n    }\n    function interpolate2(from, to, direction, stream2) {\n      var a2 = 0, a1 = 0;\n      if (from == null || (a2 = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {\n        do\n          stream2.point(a2 === 0 || a2 === 3 ? x02 : x12, a2 > 1 ? y12 : y02);\n        while ((a2 = (a2 + direction + 4) % 4) !== a1);\n      } else {\n        stream2.point(to[0], to[1]);\n      }\n    }\n    function corner(p, direction) {\n      return abs$1(p[0] - x02) < epsilon$3 ? direction > 0 ? 0 : 3 : abs$1(p[0] - x12) < epsilon$3 ? direction > 0 ? 2 : 1 : abs$1(p[1] - y02) < epsilon$3 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compareIntersection2(a2, b2) {\n      return comparePoint(a2.x, b2.x);\n    }\n    function comparePoint(a2, b2) {\n      var ca = corner(a2, 1), cb = corner(b2, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b2[1] - a2[1] : ca === 1 ? a2[0] - b2[0] : ca === 2 ? a2[1] - b2[1] : b2[0] - a2[0];\n    }\n    return function(stream2) {\n      var activeStream = stream2, bufferStream = clipBuffer(), segments2, polygon, ring, x__, y__, v__, x_, y_, v_, first, clean;\n      var clipStream = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart,\n        polygonEnd\n      };\n      function point2(x2, y2) {\n        if (visible(x2, y2)) activeStream.point(x2, y2);\n      }\n      function polygonInside() {\n        var winding = 0;\n        for (var i = 0, n = polygon.length; i < n; ++i) {\n          for (var ring2 = polygon[i], j = 1, m2 = ring2.length, point3 = ring2[0], a0, a1, b0 = point3[0], b1 = point3[1]; j < m2; ++j) {\n            a0 = b0, a1 = b1, point3 = ring2[j], b0 = point3[0], b1 = point3[1];\n            if (a1 <= y12) {\n              if (b1 > y12 && (b0 - a0) * (y12 - a1) > (b1 - a1) * (x02 - a0)) ++winding;\n            } else {\n              if (b1 <= y12 && (b0 - a0) * (y12 - a1) < (b1 - a1) * (x02 - a0)) --winding;\n            }\n          }\n        }\n        return winding;\n      }\n      function polygonStart() {\n        activeStream = bufferStream, segments2 = [], polygon = [], clean = true;\n      }\n      function polygonEnd() {\n        var startInside = polygonInside(), cleanInside = clean && startInside, visible2 = (segments2 = merge$2(segments2)).length;\n        if (cleanInside || visible2) {\n          stream2.polygonStart();\n          if (cleanInside) {\n            stream2.lineStart();\n            interpolate2(null, null, 1, stream2);\n            stream2.lineEnd();\n          }\n          if (visible2) {\n            clipRejoin(segments2, compareIntersection2, startInside, interpolate2, stream2);\n          }\n          stream2.polygonEnd();\n        }\n        activeStream = stream2, segments2 = polygon = ring = null;\n      }\n      function lineStart() {\n        clipStream.point = linePoint2;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments2) {\n          linePoint2(x__, y__);\n          if (v__ && v_) bufferStream.rejoin();\n          segments2.push(bufferStream.result());\n        }\n        clipStream.point = point2;\n        if (v_) activeStream.lineEnd();\n      }\n      function linePoint2(x2, y2) {\n        var v = visible(x2, y2);\n        if (polygon) ring.push([x2, y2]);\n        if (first) {\n          x__ = x2, y__ = y2, v__ = v;\n          first = false;\n          if (v) {\n            activeStream.lineStart();\n            activeStream.point(x2, y2);\n          }\n        } else {\n          if (v && v_) activeStream.point(x2, y2);\n          else {\n            var a2 = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], b2 = [x2 = Math.max(clipMin, Math.min(clipMax, x2)), y2 = Math.max(clipMin, Math.min(clipMax, y2))];\n            if (clipLine(a2, b2, x02, y02, x12, y12)) {\n              if (!v_) {\n                activeStream.lineStart();\n                activeStream.point(a2[0], a2[1]);\n              }\n              activeStream.point(b2[0], b2[1]);\n              if (!v) activeStream.lineEnd();\n              clean = false;\n            } else if (v) {\n              activeStream.lineStart();\n              activeStream.point(x2, y2);\n              clean = false;\n            }\n          }\n        }\n        x_ = x2, y_ = y2, v_ = v;\n      }\n      return clipStream;\n    };\n  }\n  function graticuleX(y02, y12, dy) {\n    var y2 = range$3(y02, y12 - epsilon$3, dy).concat(y12);\n    return function(x2) {\n      return y2.map(function(y3) {\n        return [x2, y3];\n      });\n    };\n  }\n  function graticuleY(x02, x12, dx) {\n    var x2 = range$3(x02, x12 - epsilon$3, dx).concat(x12);\n    return function(y2) {\n      return x2.map(function(x3) {\n        return [x3, y2];\n      });\n    };\n  }\n  function graticule() {\n    var x12, x02, X12, X02, y12, y02, Y12, Y02, dx = 10, dy = dx, DX = 90, DY = 360, x2, y2, X3, Y3, precision = 2.5;\n    function graticule2() {\n      return { type: \"MultiLineString\", coordinates: lines() };\n    }\n    function lines() {\n      return range$3(ceil(X02 / DX) * DX, X12, DX).map(X3).concat(range$3(ceil(Y02 / DY) * DY, Y12, DY).map(Y3)).concat(range$3(ceil(x02 / dx) * dx, x12, dx).filter(function(x3) {\n        return abs$1(x3 % DX) > epsilon$3;\n      }).map(x2)).concat(range$3(ceil(y02 / dy) * dy, y12, dy).filter(function(y3) {\n        return abs$1(y3 % DY) > epsilon$3;\n      }).map(y2));\n    }\n    graticule2.lines = function() {\n      return lines().map(function(coordinates) {\n        return { type: \"LineString\", coordinates };\n      });\n    };\n    graticule2.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [\n          X3(X02).concat(\n            Y3(Y12).slice(1),\n            X3(X12).reverse().slice(1),\n            Y3(Y02).reverse().slice(1)\n          )\n        ]\n      };\n    };\n    graticule2.extent = function(_) {\n      if (!arguments.length) return graticule2.extentMinor();\n      return graticule2.extentMajor(_).extentMinor(_);\n    };\n    graticule2.extentMajor = function(_) {\n      if (!arguments.length) return [[X02, Y02], [X12, Y12]];\n      X02 = +_[0][0], X12 = +_[1][0];\n      Y02 = +_[0][1], Y12 = +_[1][1];\n      if (X02 > X12) _ = X02, X02 = X12, X12 = _;\n      if (Y02 > Y12) _ = Y02, Y02 = Y12, Y12 = _;\n      return graticule2.precision(precision);\n    };\n    graticule2.extentMinor = function(_) {\n      if (!arguments.length) return [[x02, y02], [x12, y12]];\n      x02 = +_[0][0], x12 = +_[1][0];\n      y02 = +_[0][1], y12 = +_[1][1];\n      if (x02 > x12) _ = x02, x02 = x12, x12 = _;\n      if (y02 > y12) _ = y02, y02 = y12, y12 = _;\n      return graticule2.precision(precision);\n    };\n    graticule2.step = function(_) {\n      if (!arguments.length) return graticule2.stepMinor();\n      return graticule2.stepMajor(_).stepMinor(_);\n    };\n    graticule2.stepMajor = function(_) {\n      if (!arguments.length) return [DX, DY];\n      DX = +_[0], DY = +_[1];\n      return graticule2;\n    };\n    graticule2.stepMinor = function(_) {\n      if (!arguments.length) return [dx, dy];\n      dx = +_[0], dy = +_[1];\n      return graticule2;\n    };\n    graticule2.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x2 = graticuleX(y02, y12, 90);\n      y2 = graticuleY(x02, x12, precision);\n      X3 = graticuleX(Y02, Y12, 90);\n      Y3 = graticuleY(X02, X12, precision);\n      return graticule2;\n    };\n    return graticule2.extentMajor([[-180, -90 + epsilon$3], [180, 90 - epsilon$3]]).extentMinor([[-180, -80 - epsilon$3], [180, 80 + epsilon$3]]);\n  }\n  const identity$1 = (x2) => x2;\n  var areaSum = new Adder(), areaRingSum = new Adder(), x00$2, y00$2, x0$3, y0$3;\n  var areaStream = {\n    point: noop$2,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: function() {\n      areaStream.lineStart = areaRingStart;\n      areaStream.lineEnd = areaRingEnd;\n    },\n    polygonEnd: function() {\n      areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$2;\n      areaSum.add(abs$1(areaRingSum));\n      areaRingSum = new Adder();\n    },\n    result: function() {\n      var area2 = areaSum / 2;\n      areaSum = new Adder();\n      return area2;\n    }\n  };\n  function areaRingStart() {\n    areaStream.point = areaPointFirst;\n  }\n  function areaPointFirst(x2, y2) {\n    areaStream.point = areaPoint;\n    x00$2 = x0$3 = x2, y00$2 = y0$3 = y2;\n  }\n  function areaPoint(x2, y2) {\n    areaRingSum.add(y0$3 * x2 - x0$3 * y2);\n    x0$3 = x2, y0$3 = y2;\n  }\n  function areaRingEnd() {\n    areaPoint(x00$2, y00$2);\n  }\n  var x0$2 = Infinity, y0$2 = x0$2, x1 = -x0$2, y1 = x1;\n  var boundsStream = {\n    point: boundsPoint,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: noop$2,\n    polygonEnd: noop$2,\n    result: function() {\n      var bounds2 = [[x0$2, y0$2], [x1, y1]];\n      x1 = y1 = -(y0$2 = x0$2 = Infinity);\n      return bounds2;\n    }\n  };\n  function boundsPoint(x2, y2) {\n    if (x2 < x0$2) x0$2 = x2;\n    if (x2 > x1) x1 = x2;\n    if (y2 < y0$2) y0$2 = y2;\n    if (y2 > y1) y1 = y2;\n  }\n  var X0 = 0, Y0 = 0, Z0 = 0, X1 = 0, Y1 = 0, Z1 = 0, X2 = 0, Y2 = 0, Z2 = 0, x00$1, y00$1, x0$1, y0$1;\n  var centroidStream = {\n    point: centroidPoint,\n    lineStart: centroidLineStart,\n    lineEnd: centroidLineEnd,\n    polygonStart: function() {\n      centroidStream.lineStart = centroidRingStart;\n      centroidStream.lineEnd = centroidRingEnd;\n    },\n    polygonEnd: function() {\n      centroidStream.point = centroidPoint;\n      centroidStream.lineStart = centroidLineStart;\n      centroidStream.lineEnd = centroidLineEnd;\n    },\n    result: function() {\n      var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];\n      X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;\n      return centroid;\n    }\n  };\n  function centroidPoint(x2, y2) {\n    X0 += x2;\n    Y0 += y2;\n    ++Z0;\n  }\n  function centroidLineStart() {\n    centroidStream.point = centroidPointFirstLine;\n  }\n  function centroidPointFirstLine(x2, y2) {\n    centroidStream.point = centroidPointLine;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function centroidPointLine(x2, y2) {\n    var dx = x2 - x0$1, dy = y2 - y0$1, z = sqrt$1(dx * dx + dy * dy);\n    X1 += z * (x0$1 + x2) / 2;\n    Y1 += z * (y0$1 + y2) / 2;\n    Z1 += z;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function centroidLineEnd() {\n    centroidStream.point = centroidPoint;\n  }\n  function centroidRingStart() {\n    centroidStream.point = centroidPointFirstRing;\n  }\n  function centroidRingEnd() {\n    centroidPointRing(x00$1, y00$1);\n  }\n  function centroidPointFirstRing(x2, y2) {\n    centroidStream.point = centroidPointRing;\n    centroidPoint(x00$1 = x0$1 = x2, y00$1 = y0$1 = y2);\n  }\n  function centroidPointRing(x2, y2) {\n    var dx = x2 - x0$1, dy = y2 - y0$1, z = sqrt$1(dx * dx + dy * dy);\n    X1 += z * (x0$1 + x2) / 2;\n    Y1 += z * (y0$1 + y2) / 2;\n    Z1 += z;\n    z = y0$1 * x2 - x0$1 * y2;\n    X2 += z * (x0$1 + x2);\n    Y2 += z * (y0$1 + y2);\n    Z2 += z * 3;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function PathContext(context2) {\n    this._context = context2;\n  }\n  PathContext.prototype = {\n    _radius: 4.5,\n    pointRadius: function(_) {\n      return this._radius = _, this;\n    },\n    polygonStart: function() {\n      this._line = 0;\n    },\n    polygonEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line === 0) this._context.closePath();\n      this._point = NaN;\n    },\n    point: function(x2, y2) {\n      switch (this._point) {\n        case 0: {\n          this._context.moveTo(x2, y2);\n          this._point = 1;\n          break;\n        }\n        case 1: {\n          this._context.lineTo(x2, y2);\n          break;\n        }\n        default: {\n          this._context.moveTo(x2 + this._radius, y2);\n          this._context.arc(x2, y2, this._radius, 0, tau$1);\n          break;\n        }\n      }\n    },\n    result: noop$2\n  };\n  var lengthSum = new Adder(), lengthRing, x00, y00, x0, y0;\n  var lengthStream = {\n    point: noop$2,\n    lineStart: function() {\n      lengthStream.point = lengthPointFirst;\n    },\n    lineEnd: function() {\n      if (lengthRing) lengthPoint(x00, y00);\n      lengthStream.point = noop$2;\n    },\n    polygonStart: function() {\n      lengthRing = true;\n    },\n    polygonEnd: function() {\n      lengthRing = null;\n    },\n    result: function() {\n      var length2 = +lengthSum;\n      lengthSum = new Adder();\n      return length2;\n    }\n  };\n  function lengthPointFirst(x2, y2) {\n    lengthStream.point = lengthPoint;\n    x00 = x0 = x2, y00 = y0 = y2;\n  }\n  function lengthPoint(x2, y2) {\n    x0 -= x2, y0 -= y2;\n    lengthSum.add(sqrt$1(x0 * x0 + y0 * y0));\n    x0 = x2, y0 = y2;\n  }\n  let cacheDigits, cacheAppend, cacheRadius, cacheCircle;\n  class PathString {\n    constructor(digits) {\n      this._append = digits == null ? append : appendRound(digits);\n      this._radius = 4.5;\n      this._ = \"\";\n    }\n    pointRadius(_) {\n      this._radius = +_;\n      return this;\n    }\n    polygonStart() {\n      this._line = 0;\n    }\n    polygonEnd() {\n      this._line = NaN;\n    }\n    lineStart() {\n      this._point = 0;\n    }\n    lineEnd() {\n      if (this._line === 0) this._ += \"Z\";\n      this._point = NaN;\n    }\n    point(x2, y2) {\n      switch (this._point) {\n        case 0: {\n          this._append`M${x2},${y2}`;\n          this._point = 1;\n          break;\n        }\n        case 1: {\n          this._append`L${x2},${y2}`;\n          break;\n        }\n        default: {\n          this._append`M${x2},${y2}`;\n          if (this._radius !== cacheRadius || this._append !== cacheAppend) {\n            const r = this._radius;\n            const s = this._;\n            this._ = \"\";\n            this._append`m0,${r}a${r},${r} 0 1,1 0,${-2 * r}a${r},${r} 0 1,1 0,${2 * r}z`;\n            cacheRadius = r;\n            cacheAppend = this._append;\n            cacheCircle = this._;\n            this._ = s;\n          }\n          this._ += cacheCircle;\n          break;\n        }\n      }\n    }\n    result() {\n      const result = this._;\n      this._ = \"\";\n      return result.length ? result : null;\n    }\n  }\n  function append(strings) {\n    let i = 1;\n    this._ += strings[0];\n    for (const j = strings.length; i < j; ++i) {\n      this._ += arguments[i] + strings[i];\n    }\n  }\n  function appendRound(digits) {\n    const d = Math.floor(digits);\n    if (!(d >= 0)) throw new RangeError(`invalid digits: ${digits}`);\n    if (d > 15) return append;\n    if (d !== cacheDigits) {\n      const k = 10 ** d;\n      cacheDigits = d;\n      cacheAppend = function append2(strings) {\n        let i = 1;\n        this._ += strings[0];\n        for (const j = strings.length; i < j; ++i) {\n          this._ += Math.round(arguments[i] * k) / k + strings[i];\n        }\n      };\n    }\n    return cacheAppend;\n  }\n  function geoPath(projection2, context2) {\n    let digits = 3, pointRadius = 4.5, projectionStream, contextStream;\n    function path2(object2) {\n      if (object2) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        geoStream(object2, projectionStream(contextStream));\n      }\n      return contextStream.result();\n    }\n    path2.area = function(object2) {\n      geoStream(object2, projectionStream(areaStream));\n      return areaStream.result();\n    };\n    path2.measure = function(object2) {\n      geoStream(object2, projectionStream(lengthStream));\n      return lengthStream.result();\n    };\n    path2.bounds = function(object2) {\n      geoStream(object2, projectionStream(boundsStream));\n      return boundsStream.result();\n    };\n    path2.centroid = function(object2) {\n      geoStream(object2, projectionStream(centroidStream));\n      return centroidStream.result();\n    };\n    path2.projection = function(_) {\n      if (!arguments.length) return projection2;\n      projectionStream = _ == null ? (projection2 = null, identity$1) : (projection2 = _).stream;\n      return path2;\n    };\n    path2.context = function(_) {\n      if (!arguments.length) return context2;\n      contextStream = _ == null ? (context2 = null, new PathString(digits)) : new PathContext(context2 = _);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return path2;\n    };\n    path2.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path2;\n    };\n    path2.digits = function(_) {\n      if (!arguments.length) return digits;\n      if (_ == null) digits = null;\n      else {\n        const d = Math.floor(_);\n        if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n        digits = d;\n      }\n      if (context2 === null) contextStream = new PathString(digits);\n      return path2;\n    };\n    return path2.projection(projection2).digits(digits).context(context2);\n  }\n  function transformer(methods2) {\n    return function(stream2) {\n      var s = new TransformStream();\n      for (var key2 in methods2) s[key2] = methods2[key2];\n      s.stream = stream2;\n      return s;\n    };\n  }\n  function TransformStream() {\n  }\n  TransformStream.prototype = {\n    constructor: TransformStream,\n    point: function(x2, y2) {\n      this.stream.point(x2, y2);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function fit$1(projection2, fitBounds, object2) {\n    var clip2 = projection2.clipExtent && projection2.clipExtent();\n    projection2.scale(150).translate([0, 0]);\n    if (clip2 != null) projection2.clipExtent(null);\n    geoStream(object2, projection2.stream(boundsStream));\n    fitBounds(boundsStream.result());\n    if (clip2 != null) projection2.clipExtent(clip2);\n    return projection2;\n  }\n  function fitExtent(projection2, extent2, object2) {\n    return fit$1(projection2, function(b2) {\n      var w2 = extent2[1][0] - extent2[0][0], h2 = extent2[1][1] - extent2[0][1], k = Math.min(w2 / (b2[1][0] - b2[0][0]), h2 / (b2[1][1] - b2[0][1])), x2 = +extent2[0][0] + (w2 - k * (b2[1][0] + b2[0][0])) / 2, y2 = +extent2[0][1] + (h2 - k * (b2[1][1] + b2[0][1])) / 2;\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  function fitSize(projection2, size2, object2) {\n    return fitExtent(projection2, [[0, 0], size2], object2);\n  }\n  function fitWidth(projection2, width2, object2) {\n    return fit$1(projection2, function(b2) {\n      var w2 = +width2, k = w2 / (b2[1][0] - b2[0][0]), x2 = (w2 - k * (b2[1][0] + b2[0][0])) / 2, y2 = -k * b2[0][1];\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  function fitHeight(projection2, height2, object2) {\n    return fit$1(projection2, function(b2) {\n      var h2 = +height2, k = h2 / (b2[1][1] - b2[0][1]), x2 = -k * b2[0][0], y2 = (h2 - k * (b2[1][1] + b2[0][1])) / 2;\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  var maxDepth = 16, cosMinDistance = cos$1(30 * radians);\n  function resample(project2, delta2) {\n    return +delta2 ? resample$1(project2, delta2) : resampleNone(project2);\n  }\n  function resampleNone(project2) {\n    return transformer({\n      point: function(x2, y2) {\n        x2 = project2(x2, y2);\n        this.stream.point(x2[0], x2[1]);\n      }\n    });\n  }\n  function resample$1(project2, delta2) {\n    function resampleLineTo(x02, y02, lambda02, a0, b0, c0, x12, y12, lambda12, a1, b1, c1, depth, stream2) {\n      var dx = x12 - x02, dy = y12 - y02, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * delta2 && depth--) {\n        var a2 = a0 + a1, b2 = b0 + b1, c2 = c0 + c1, m2 = sqrt$1(a2 * a2 + b2 * b2 + c2 * c2), phi2 = asin$1(c2 /= m2), lambda22 = abs$1(abs$1(c2) - 1) < epsilon$3 || abs$1(lambda02 - lambda12) < epsilon$3 ? (lambda02 + lambda12) / 2 : atan2(b2, a2), p = project2(lambda22, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x02, dy2 = y2 - y02, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > delta2 || abs$1((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x02, y02, lambda02, a0, b0, c0, x2, y2, lambda22, a2 /= m2, b2 /= m2, c2, depth, stream2);\n          stream2.point(x2, y2);\n          resampleLineTo(x2, y2, lambda22, a2, b2, c2, x12, y12, lambda12, a1, b1, c1, depth, stream2);\n        }\n      }\n    }\n    return function(stream2) {\n      var lambda002, x002, y002, a00, b00, c00, lambda02, x02, y02, a0, b0, c0;\n      var resampleStream = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart: function() {\n          stream2.polygonStart();\n          resampleStream.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream2.polygonEnd();\n          resampleStream.lineStart = lineStart;\n        }\n      };\n      function point2(x2, y2) {\n        x2 = project2(x2, y2);\n        stream2.point(x2[0], x2[1]);\n      }\n      function lineStart() {\n        x02 = NaN;\n        resampleStream.point = linePoint2;\n        stream2.lineStart();\n      }\n      function linePoint2(lambda, phi2) {\n        var c2 = cartesian([lambda, phi2]), p = project2(lambda, phi2);\n        resampleLineTo(x02, y02, lambda02, a0, b0, c0, x02 = p[0], y02 = p[1], lambda02 = lambda, a0 = c2[0], b0 = c2[1], c0 = c2[2], maxDepth, stream2);\n        stream2.point(x02, y02);\n      }\n      function lineEnd() {\n        resampleStream.point = point2;\n        stream2.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resampleStream.point = ringPoint;\n        resampleStream.lineEnd = ringEnd;\n      }\n      function ringPoint(lambda, phi2) {\n        linePoint2(lambda002 = lambda, phi2), x002 = x02, y002 = y02, a00 = a0, b00 = b0, c00 = c0;\n        resampleStream.point = linePoint2;\n      }\n      function ringEnd() {\n        resampleLineTo(x02, y02, lambda02, a0, b0, c0, x002, y002, lambda002, a00, b00, c00, maxDepth, stream2);\n        resampleStream.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resampleStream;\n    };\n  }\n  var transformRadians = transformer({\n    point: function(x2, y2) {\n      this.stream.point(x2 * radians, y2 * radians);\n    }\n  });\n  function transformRotate(rotate2) {\n    return transformer({\n      point: function(x2, y2) {\n        var r = rotate2(x2, y2);\n        return this.stream.point(r[0], r[1]);\n      }\n    });\n  }\n  function scaleTranslate(k, dx, dy, sx, sy) {\n    function transform2(x2, y2) {\n      x2 *= sx;\n      y2 *= sy;\n      return [dx + k * x2, dy - k * y2];\n    }\n    transform2.invert = function(x2, y2) {\n      return [(x2 - dx) / k * sx, (dy - y2) / k * sy];\n    };\n    return transform2;\n  }\n  function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n    if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n    var cosAlpha = cos$1(alpha), sinAlpha = sin$1(alpha), a2 = cosAlpha * k, b2 = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;\n    function transform2(x2, y2) {\n      x2 *= sx;\n      y2 *= sy;\n      return [a2 * x2 - b2 * y2 + dx, dy - b2 * x2 - a2 * y2];\n    }\n    transform2.invert = function(x2, y2) {\n      return [sx * (ai * x2 - bi * y2 + ci), sy * (fi - bi * x2 - ai * y2)];\n    };\n    return transform2;\n  }\n  function projection$1(project2) {\n    return projectionMutator(function() {\n      return project2;\n    })();\n  }\n  function projectionMutator(projectAt) {\n    var project2, k = 150, x2 = 480, y2 = 250, lambda = 0, phi2 = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate2, alpha = 0, sx = 1, sy = 1, theta = null, preclip = clipAntimeridian, x02 = null, y02, x12, y12, postclip = identity$1, delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache2, cacheStream;\n    function projection2(point2) {\n      return projectRotateTransform(point2[0] * radians, point2[1] * radians);\n    }\n    function invert2(point2) {\n      point2 = projectRotateTransform.invert(point2[0], point2[1]);\n      return point2 && [point2[0] * degrees, point2[1] * degrees];\n    }\n    projection2.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = transformRadians(transformRotate(rotate2)(preclip(projectResample(postclip(cacheStream = stream2)))));\n    };\n    projection2.preclip = function(_) {\n      return arguments.length ? (preclip = _, theta = void 0, reset2()) : preclip;\n    };\n    projection2.postclip = function(_) {\n      return arguments.length ? (postclip = _, x02 = y02 = x12 = y12 = null, reset2()) : postclip;\n    };\n    projection2.clipAngle = function(_) {\n      return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset2()) : theta * degrees;\n    };\n    projection2.clipExtent = function(_) {\n      return arguments.length ? (postclip = _ == null ? (x02 = y02 = x12 = y12 = null, identity$1) : clipRectangle(x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset2()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    projection2.scale = function(_) {\n      return arguments.length ? (k = +_, recenter()) : k;\n    };\n    projection2.translate = function(_) {\n      return arguments.length ? (x2 = +_[0], y2 = +_[1], recenter()) : [x2, y2];\n    };\n    projection2.center = function(_) {\n      return arguments.length ? (lambda = _[0] % 360 * radians, phi2 = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi2 * degrees];\n    };\n    projection2.rotate = function(_) {\n      return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n    };\n    projection2.angle = function(_) {\n      return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n    };\n    projection2.reflectX = function(_) {\n      return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n    };\n    projection2.reflectY = function(_) {\n      return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n    };\n    projection2.precision = function(_) {\n      return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset2()) : sqrt$1(delta2);\n    };\n    projection2.fitExtent = function(extent2, object2) {\n      return fitExtent(projection2, extent2, object2);\n    };\n    projection2.fitSize = function(size2, object2) {\n      return fitSize(projection2, size2, object2);\n    };\n    projection2.fitWidth = function(width2, object2) {\n      return fitWidth(projection2, width2, object2);\n    };\n    projection2.fitHeight = function(height2, object2) {\n      return fitHeight(projection2, height2, object2);\n    };\n    function recenter() {\n      var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project2(lambda, phi2)), transform2 = scaleTranslateRotate(k, x2 - center[0], y2 - center[1], sx, sy, alpha);\n      rotate2 = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n      projectTransform = compose(project2, transform2);\n      projectRotateTransform = compose(rotate2, projectTransform);\n      projectResample = resample(projectTransform, delta2);\n      return reset2();\n    }\n    function reset2() {\n      cache2 = cacheStream = null;\n      return projection2;\n    }\n    return function() {\n      project2 = projectAt.apply(this, arguments);\n      projection2.invert = project2.invert && invert2;\n      return recenter();\n    };\n  }\n  function conicProjection(projectAt) {\n    var phi02 = 0, phi12 = pi$1 / 3, m2 = projectionMutator(projectAt), p = m2(phi02, phi12);\n    p.parallels = function(_) {\n      return arguments.length ? m2(phi02 = _[0] * radians, phi12 = _[1] * radians) : [phi02 * degrees, phi12 * degrees];\n    };\n    return p;\n  }\n  function cylindricalEqualAreaRaw(phi02) {\n    var cosPhi02 = cos$1(phi02);\n    function forward(lambda, phi2) {\n      return [lambda * cosPhi02, sin$1(phi2) / cosPhi02];\n    }\n    forward.invert = function(x2, y2) {\n      return [x2 / cosPhi02, asin$1(y2 * cosPhi02)];\n    };\n    return forward;\n  }\n  function conicEqualAreaRaw(y02, y12) {\n    var sy0 = sin$1(y02), n = (sy0 + sin$1(y12)) / 2;\n    if (abs$1(n) < epsilon$3) return cylindricalEqualAreaRaw(y02);\n    var c2 = 1 + sy0 * (2 * n - sy0), r0 = sqrt$1(c2) / n;\n    function project2(x2, y2) {\n      var r = sqrt$1(c2 - 2 * n * sin$1(y2)) / n;\n      return [r * sin$1(x2 *= n), r0 - r * cos$1(x2)];\n    }\n    project2.invert = function(x2, y2) {\n      var r0y = r0 - y2, l = atan2(x2, abs$1(r0y)) * sign(r0y);\n      if (r0y * n < 0)\n        l -= pi$1 * sign(x2) * sign(r0y);\n      return [l / n, asin$1((c2 - (x2 * x2 + r0y * r0y) * n * n) / (2 * n))];\n    };\n    return project2;\n  }\n  function geoConicEqualArea() {\n    return conicProjection(conicEqualAreaRaw).scale(155.424).center([0, 33.6442]);\n  }\n  function geoAlbers() {\n    return geoConicEqualArea().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]);\n  }\n  function multiplex(streams) {\n    var n = streams.length;\n    return {\n      point: function(x2, y2) {\n        var i = -1;\n        while (++i < n) streams[i].point(x2, y2);\n      },\n      sphere: function() {\n        var i = -1;\n        while (++i < n) streams[i].sphere();\n      },\n      lineStart: function() {\n        var i = -1;\n        while (++i < n) streams[i].lineStart();\n      },\n      lineEnd: function() {\n        var i = -1;\n        while (++i < n) streams[i].lineEnd();\n      },\n      polygonStart: function() {\n        var i = -1;\n        while (++i < n) streams[i].polygonStart();\n      },\n      polygonEnd: function() {\n        var i = -1;\n        while (++i < n) streams[i].polygonEnd();\n      }\n    };\n  }\n  function geoAlbersUsa() {\n    var cache2, cacheStream, lower48 = geoAlbers(), lower48Point, alaska = geoConicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, hawaii = geoConicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, point2, pointStream = { point: function(x2, y2) {\n      point2 = [x2, y2];\n    } };\n    function albersUsa(coordinates) {\n      var x2 = coordinates[0], y2 = coordinates[1];\n      return point2 = null, (lower48Point.point(x2, y2), point2) || (alaskaPoint.point(x2, y2), point2) || (hawaiiPoint.point(x2, y2), point2);\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x2 = (coordinates[0] - t[0]) / k, y2 = (coordinates[1] - t[1]) / k;\n      return (y2 >= 0.12 && y2 < 0.234 && x2 >= -0.425 && x2 < -0.214 ? alaska : y2 >= 0.166 && y2 < 0.234 && x2 >= -0.214 && x2 < -0.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = multiplex([lower48.stream(cacheStream = stream2), alaska.stream(stream2), hawaii.stream(stream2)]);\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n      return reset2();\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x2 = +_[0], y2 = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([[x2 - 0.455 * k, y2 - 0.238 * k], [x2 + 0.455 * k, y2 + 0.238 * k]]).stream(pointStream);\n      alaskaPoint = alaska.translate([x2 - 0.307 * k, y2 + 0.201 * k]).clipExtent([[x2 - 0.425 * k + epsilon$3, y2 + 0.12 * k + epsilon$3], [x2 - 0.214 * k - epsilon$3, y2 + 0.234 * k - epsilon$3]]).stream(pointStream);\n      hawaiiPoint = hawaii.translate([x2 - 0.205 * k, y2 + 0.212 * k]).clipExtent([[x2 - 0.214 * k + epsilon$3, y2 + 0.166 * k + epsilon$3], [x2 - 0.115 * k - epsilon$3, y2 + 0.234 * k - epsilon$3]]).stream(pointStream);\n      return reset2();\n    };\n    albersUsa.fitExtent = function(extent2, object2) {\n      return fitExtent(albersUsa, extent2, object2);\n    };\n    albersUsa.fitSize = function(size2, object2) {\n      return fitSize(albersUsa, size2, object2);\n    };\n    albersUsa.fitWidth = function(width2, object2) {\n      return fitWidth(albersUsa, width2, object2);\n    };\n    albersUsa.fitHeight = function(height2, object2) {\n      return fitHeight(albersUsa, height2, object2);\n    };\n    function reset2() {\n      cache2 = cacheStream = null;\n      return albersUsa;\n    }\n    return albersUsa.scale(1070);\n  }\n  function azimuthalRaw(scale2) {\n    return function(x2, y2) {\n      var cx = cos$1(x2), cy = cos$1(y2), k = scale2(cx * cy);\n      if (k === Infinity) return [2, 0];\n      return [\n        k * cy * sin$1(x2),\n        k * sin$1(y2)\n      ];\n    };\n  }\n  function azimuthalInvert(angle2) {\n    return function(x2, y2) {\n      var z = sqrt$1(x2 * x2 + y2 * y2), c2 = angle2(z), sc = sin$1(c2), cc = cos$1(c2);\n      return [\n        atan2(x2 * sc, z * cc),\n        asin$1(z && y2 * sc / z)\n      ];\n    };\n  }\n  var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\n    return sqrt$1(2 / (1 + cxcy));\n  });\n  azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {\n    return 2 * asin$1(z / 2);\n  });\n  function geoAzimuthalEqualArea() {\n    return projection$1(azimuthalEqualAreaRaw).scale(124.75).clipAngle(180 - 1e-3);\n  }\n  var azimuthalEquidistantRaw = azimuthalRaw(function(c2) {\n    return (c2 = acos(c2)) && c2 / sin$1(c2);\n  });\n  azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {\n    return z;\n  });\n  function geoAzimuthalEquidistant() {\n    return projection$1(azimuthalEquidistantRaw).scale(79.4188).clipAngle(180 - 1e-3);\n  }\n  function mercatorRaw(lambda, phi2) {\n    return [lambda, log$1(tan((halfPi$1 + phi2) / 2))];\n  }\n  mercatorRaw.invert = function(x2, y2) {\n    return [x2, 2 * atan(exp(y2)) - halfPi$1];\n  };\n  function geoMercator() {\n    return mercatorProjection(mercatorRaw).scale(961 / tau$1);\n  }\n  function mercatorProjection(project2) {\n    var m2 = projection$1(project2), center = m2.center, scale2 = m2.scale, translate2 = m2.translate, clipExtent = m2.clipExtent, x02 = null, y02, x12, y12;\n    m2.scale = function(_) {\n      return arguments.length ? (scale2(_), reclip()) : scale2();\n    };\n    m2.translate = function(_) {\n      return arguments.length ? (translate2(_), reclip()) : translate2();\n    };\n    m2.center = function(_) {\n      return arguments.length ? (center(_), reclip()) : center();\n    };\n    m2.clipExtent = function(_) {\n      return arguments.length ? (_ == null ? x02 = y02 = x12 = y12 = null : (x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reclip()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    function reclip() {\n      var k = pi$1 * scale2(), t = m2(rotation(m2.rotate()).invert([0, 0]));\n      return clipExtent(x02 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project2 === mercatorRaw ? [[Math.max(t[0] - k, x02), y02], [Math.min(t[0] + k, x12), y12]] : [[x02, Math.max(t[1] - k, y02)], [x12, Math.min(t[1] + k, y12)]]);\n    }\n    return reclip();\n  }\n  function tany(y2) {\n    return tan((halfPi$1 + y2) / 2);\n  }\n  function conicConformalRaw(y02, y12) {\n    var cy0 = cos$1(y02), n = y02 === y12 ? sin$1(y02) : log$1(cy0 / cos$1(y12)) / log$1(tany(y12) / tany(y02)), f = cy0 * pow$1(tany(y02), n) / n;\n    if (!n) return mercatorRaw;\n    function project2(x2, y2) {\n      if (f > 0) {\n        if (y2 < -halfPi$1 + epsilon$3) y2 = -halfPi$1 + epsilon$3;\n      } else {\n        if (y2 > halfPi$1 - epsilon$3) y2 = halfPi$1 - epsilon$3;\n      }\n      var r = f / pow$1(tany(y2), n);\n      return [r * sin$1(n * x2), f - r * cos$1(n * x2)];\n    }\n    project2.invert = function(x2, y2) {\n      var fy = f - y2, r = sign(n) * sqrt$1(x2 * x2 + fy * fy), l = atan2(x2, abs$1(fy)) * sign(fy);\n      if (fy * n < 0)\n        l -= pi$1 * sign(x2) * sign(fy);\n      return [l / n, 2 * atan(pow$1(f / r, 1 / n)) - halfPi$1];\n    };\n    return project2;\n  }\n  function geoConicConformal() {\n    return conicProjection(conicConformalRaw).scale(109.5).parallels([30, 30]);\n  }\n  function equirectangularRaw(lambda, phi2) {\n    return [lambda, phi2];\n  }\n  equirectangularRaw.invert = equirectangularRaw;\n  function geoEquirectangular() {\n    return projection$1(equirectangularRaw).scale(152.63);\n  }\n  function conicEquidistantRaw(y02, y12) {\n    var cy0 = cos$1(y02), n = y02 === y12 ? sin$1(y02) : (cy0 - cos$1(y12)) / (y12 - y02), g = cy0 / n + y02;\n    if (abs$1(n) < epsilon$3) return equirectangularRaw;\n    function project2(x2, y2) {\n      var gy = g - y2, nx = n * x2;\n      return [gy * sin$1(nx), g - gy * cos$1(nx)];\n    }\n    project2.invert = function(x2, y2) {\n      var gy = g - y2, l = atan2(x2, abs$1(gy)) * sign(gy);\n      if (gy * n < 0)\n        l -= pi$1 * sign(x2) * sign(gy);\n      return [l / n, g - sign(n) * sqrt$1(x2 * x2 + gy * gy)];\n    };\n    return project2;\n  }\n  function geoConicEquidistant() {\n    return conicProjection(conicEquidistantRaw).scale(131.154).center([0, 13.9389]);\n  }\n  var A1 = 1.340264, A2 = -0.081106, A3 = 893e-6, A4 = 3796e-6, M = sqrt$1(3) / 2, iterations = 12;\n  function equalEarthRaw(lambda, phi2) {\n    var l = asin$1(M * sin$1(phi2)), l2 = l * l, l6 = l2 * l2 * l2;\n    return [\n      lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n      l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n    ];\n  }\n  equalEarthRaw.invert = function(x2, y2) {\n    var l = y2, l2 = l * l, l6 = l2 * l2 * l2;\n    for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n      fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y2;\n      fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n      l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n      if (abs$1(delta) < epsilon2) break;\n    }\n    return [\n      M * x2 * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),\n      asin$1(sin$1(l) / M)\n    ];\n  };\n  function geoEqualEarth() {\n    return projection$1(equalEarthRaw).scale(177.158);\n  }\n  function gnomonicRaw(x2, y2) {\n    var cy = cos$1(y2), k = cos$1(x2) * cy;\n    return [cy * sin$1(x2) / k, sin$1(y2) / k];\n  }\n  gnomonicRaw.invert = azimuthalInvert(atan);\n  function geoGnomonic() {\n    return projection$1(gnomonicRaw).scale(144.049).clipAngle(60);\n  }\n  function geoIdentity() {\n    var k = 1, tx2 = 0, ty2 = 0, sx = 1, sy = 1, alpha = 0, ca, sa2, x02 = null, y02, x12, y12, kx = 1, ky = 1, transform2 = transformer({\n      point: function(x2, y2) {\n        var p = projection2([x2, y2]);\n        this.stream.point(p[0], p[1]);\n      }\n    }), postclip = identity$1, cache2, cacheStream;\n    function reset2() {\n      kx = k * sx;\n      ky = k * sy;\n      cache2 = cacheStream = null;\n      return projection2;\n    }\n    function projection2(p) {\n      var x2 = p[0] * kx, y2 = p[1] * ky;\n      if (alpha) {\n        var t = y2 * ca - x2 * sa2;\n        x2 = x2 * ca + y2 * sa2;\n        y2 = t;\n      }\n      return [x2 + tx2, y2 + ty2];\n    }\n    projection2.invert = function(p) {\n      var x2 = p[0] - tx2, y2 = p[1] - ty2;\n      if (alpha) {\n        var t = y2 * ca + x2 * sa2;\n        x2 = x2 * ca - y2 * sa2;\n        y2 = t;\n      }\n      return [x2 / kx, y2 / ky];\n    };\n    projection2.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = transform2(postclip(cacheStream = stream2));\n    };\n    projection2.postclip = function(_) {\n      return arguments.length ? (postclip = _, x02 = y02 = x12 = y12 = null, reset2()) : postclip;\n    };\n    projection2.clipExtent = function(_) {\n      return arguments.length ? (postclip = _ == null ? (x02 = y02 = x12 = y12 = null, identity$1) : clipRectangle(x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset2()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    projection2.scale = function(_) {\n      return arguments.length ? (k = +_, reset2()) : k;\n    };\n    projection2.translate = function(_) {\n      return arguments.length ? (tx2 = +_[0], ty2 = +_[1], reset2()) : [tx2, ty2];\n    };\n    projection2.angle = function(_) {\n      return arguments.length ? (alpha = _ % 360 * radians, sa2 = sin$1(alpha), ca = cos$1(alpha), reset2()) : alpha * degrees;\n    };\n    projection2.reflectX = function(_) {\n      return arguments.length ? (sx = _ ? -1 : 1, reset2()) : sx < 0;\n    };\n    projection2.reflectY = function(_) {\n      return arguments.length ? (sy = _ ? -1 : 1, reset2()) : sy < 0;\n    };\n    projection2.fitExtent = function(extent2, object2) {\n      return fitExtent(projection2, extent2, object2);\n    };\n    projection2.fitSize = function(size2, object2) {\n      return fitSize(projection2, size2, object2);\n    };\n    projection2.fitWidth = function(width2, object2) {\n      return fitWidth(projection2, width2, object2);\n    };\n    projection2.fitHeight = function(height2, object2) {\n      return fitHeight(projection2, height2, object2);\n    };\n    return projection2;\n  }\n  function naturalEarth1Raw(lambda, phi2) {\n    var phi22 = phi2 * phi2, phi4 = phi22 * phi22;\n    return [\n      lambda * (0.8707 - 0.131979 * phi22 + phi4 * (-0.013791 + phi4 * (3971e-6 * phi22 - 1529e-6 * phi4))),\n      phi2 * (1.007226 + phi22 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi22 - 5916e-6 * phi4)))\n    ];\n  }\n  naturalEarth1Raw.invert = function(x2, y2) {\n    var phi2 = y2, i = 25, delta;\n    do {\n      var phi22 = phi2 * phi2, phi4 = phi22 * phi22;\n      phi2 -= delta = (phi2 * (1.007226 + phi22 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi22 - 5916e-6 * phi4))) - y2) / (1.007226 + phi22 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi22 - 5916e-6 * 11 * phi4)));\n    } while (abs$1(delta) > epsilon$3 && --i > 0);\n    return [\n      x2 / (0.8707 + (phi22 = phi2 * phi2) * (-0.131979 + phi22 * (-0.013791 + phi22 * phi22 * phi22 * (3971e-6 - 1529e-6 * phi22)))),\n      phi2\n    ];\n  };\n  function geoNaturalEarth1() {\n    return projection$1(naturalEarth1Raw).scale(175.295);\n  }\n  function orthographicRaw(x2, y2) {\n    return [cos$1(y2) * sin$1(x2), sin$1(y2)];\n  }\n  orthographicRaw.invert = azimuthalInvert(asin$1);\n  function geoOrthographic() {\n    return projection$1(orthographicRaw).scale(249.5).clipAngle(90 + epsilon$3);\n  }\n  function stereographicRaw(x2, y2) {\n    var cy = cos$1(y2), k = 1 + cos$1(x2) * cy;\n    return [cy * sin$1(x2) / k, sin$1(y2) / k];\n  }\n  stereographicRaw.invert = azimuthalInvert(function(z) {\n    return 2 * atan(z);\n  });\n  function geoStereographic() {\n    return projection$1(stereographicRaw).scale(250).clipAngle(142);\n  }\n  function transverseMercatorRaw(lambda, phi2) {\n    return [log$1(tan((halfPi$1 + phi2) / 2)), -lambda];\n  }\n  transverseMercatorRaw.invert = function(x2, y2) {\n    return [-y2, 2 * atan(exp(x2)) - halfPi$1];\n  };\n  function geoTransverseMercator() {\n    var m2 = mercatorProjection(transverseMercatorRaw), center = m2.center, rotate2 = m2.rotate;\n    m2.center = function(_) {\n      return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);\n    };\n    m2.rotate = function(_) {\n      return arguments.length ? rotate2([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate2(), [_[0], _[1], _[2] - 90]);\n    };\n    return rotate2([0, 0, 90]).scale(159.155);\n  }\n  var abs = Math.abs;\n  var cos = Math.cos;\n  var sin = Math.sin;\n  var epsilon$2 = 1e-6;\n  var pi = Math.PI;\n  var halfPi = pi / 2;\n  var sqrt2 = sqrt(2);\n  function asin(x2) {\n    return x2 > 1 ? halfPi : x2 < -1 ? -halfPi : Math.asin(x2);\n  }\n  function sqrt(x2) {\n    return x2 > 0 ? Math.sqrt(x2) : 0;\n  }\n  function mollweideBromleyTheta(cp, phi2) {\n    var cpsinPhi = cp * sin(phi2), i = 30, delta;\n    do\n      phi2 -= delta = (phi2 + sin(phi2) - cpsinPhi) / (1 + cos(phi2));\n    while (abs(delta) > epsilon$2 && --i > 0);\n    return phi2 / 2;\n  }\n  function mollweideBromleyRaw(cx, cy, cp) {\n    function forward(lambda, phi2) {\n      return [cx * lambda * cos(phi2 = mollweideBromleyTheta(cp, phi2)), cy * sin(phi2)];\n    }\n    forward.invert = function(x2, y2) {\n      return y2 = asin(y2 / cy), [x2 / (cx * cos(y2)), asin((2 * y2 + sin(2 * y2)) / cp)];\n    };\n    return forward;\n  }\n  var mollweideRaw = mollweideBromleyRaw(sqrt2 / halfPi, sqrt2, pi);\n  function geoMollweide() {\n    return projection$1(mollweideRaw).scale(169.529);\n  }\n  const defaultPath = geoPath();\n  const projectionProperties = [\n    // standard properties in d3-geo\n    \"clipAngle\",\n    \"clipExtent\",\n    \"scale\",\n    \"translate\",\n    \"center\",\n    \"rotate\",\n    \"parallels\",\n    \"precision\",\n    \"reflectX\",\n    \"reflectY\",\n    // extended properties in d3-geo-projections\n    \"coefficient\",\n    \"distance\",\n    \"fraction\",\n    \"lobes\",\n    \"parallel\",\n    \"radius\",\n    \"ratio\",\n    \"spacing\",\n    \"tilt\"\n  ];\n  function create$7(type2, constructor) {\n    return function projection2() {\n      const p = constructor();\n      p.type = type2;\n      p.path = geoPath().projection(p);\n      p.copy = p.copy || function() {\n        const c2 = projection2();\n        projectionProperties.forEach((prop) => {\n          if (p[prop]) c2[prop](p[prop]());\n        });\n        c2.path.pointRadius(p.path.pointRadius());\n        return c2;\n      };\n      return registerScale(p);\n    };\n  }\n  function projection(type2, proj) {\n    if (!type2 || typeof type2 !== \"string\") {\n      throw new Error(\"Projection type must be a name string.\");\n    }\n    type2 = type2.toLowerCase();\n    if (arguments.length > 1) {\n      projections[type2] = create$7(type2, proj);\n      return this;\n    } else {\n      return projections[type2] || null;\n    }\n  }\n  function getProjectionPath(proj) {\n    return proj && proj.path || defaultPath;\n  }\n  const projections = {\n    // base d3-geo projection types\n    albers: geoAlbers,\n    albersusa: geoAlbersUsa,\n    azimuthalequalarea: geoAzimuthalEqualArea,\n    azimuthalequidistant: geoAzimuthalEquidistant,\n    conicconformal: geoConicConformal,\n    conicequalarea: geoConicEqualArea,\n    conicequidistant: geoConicEquidistant,\n    equalEarth: geoEqualEarth,\n    equirectangular: geoEquirectangular,\n    gnomonic: geoGnomonic,\n    identity: geoIdentity,\n    mercator: geoMercator,\n    mollweide: geoMollweide,\n    naturalEarth1: geoNaturalEarth1,\n    orthographic: geoOrthographic,\n    stereographic: geoStereographic,\n    transversemercator: geoTransverseMercator\n  };\n  for (const key2 in projections) {\n    projection(key2, projections[key2]);\n  }\n  function noop$1() {\n  }\n  const cases = [[], [[[1, 1.5], [0.5, 1]]], [[[1.5, 1], [1, 1.5]]], [[[1.5, 1], [0.5, 1]]], [[[1, 0.5], [1.5, 1]]], [[[1, 1.5], [0.5, 1]], [[1, 0.5], [1.5, 1]]], [[[1, 0.5], [1, 1.5]]], [[[1, 0.5], [0.5, 1]]], [[[0.5, 1], [1, 0.5]]], [[[1, 1.5], [1, 0.5]]], [[[0.5, 1], [1, 0.5]], [[1.5, 1], [1, 1.5]]], [[[1.5, 1], [1, 0.5]]], [[[0.5, 1], [1.5, 1]]], [[[1, 1.5], [1.5, 1]]], [[[0.5, 1], [1, 1.5]]], []];\n  function contours() {\n    var dx = 1, dy = 1, smooth = smoothLinear;\n    function contours2(values2, tz) {\n      return tz.map((value2) => contour(values2, value2));\n    }\n    function contour(values2, value2) {\n      var polygons = [], holes = [];\n      isorings(values2, value2, (ring) => {\n        smooth(ring, values2, value2);\n        if (area(ring) > 0) polygons.push([ring]);\n        else holes.push(ring);\n      });\n      holes.forEach((hole) => {\n        for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\n          if (contains((polygon = polygons[i])[0], hole) !== -1) {\n            polygon.push(hole);\n            return;\n          }\n        }\n      });\n      return {\n        type: \"MultiPolygon\",\n        value: value2,\n        coordinates: polygons\n      };\n    }\n    function isorings(values2, value2, callback) {\n      var fragmentByStart = [], fragmentByEnd = [], x2, y2, t02, t12, t22, t32;\n      x2 = y2 = -1;\n      t12 = values2[0] >= value2;\n      cases[t12 << 1].forEach(stitch2);\n      while (++x2 < dx - 1) {\n        t02 = t12, t12 = values2[x2 + 1] >= value2;\n        cases[t02 | t12 << 1].forEach(stitch2);\n      }\n      cases[t12 << 0].forEach(stitch2);\n      while (++y2 < dy - 1) {\n        x2 = -1;\n        t12 = values2[y2 * dx + dx] >= value2;\n        t22 = values2[y2 * dx] >= value2;\n        cases[t12 << 1 | t22 << 2].forEach(stitch2);\n        while (++x2 < dx - 1) {\n          t02 = t12, t12 = values2[y2 * dx + dx + x2 + 1] >= value2;\n          t32 = t22, t22 = values2[y2 * dx + x2 + 1] >= value2;\n          cases[t02 | t12 << 1 | t22 << 2 | t32 << 3].forEach(stitch2);\n        }\n        cases[t12 | t22 << 3].forEach(stitch2);\n      }\n      x2 = -1;\n      t22 = values2[y2 * dx] >= value2;\n      cases[t22 << 2].forEach(stitch2);\n      while (++x2 < dx - 1) {\n        t32 = t22, t22 = values2[y2 * dx + x2 + 1] >= value2;\n        cases[t22 << 2 | t32 << 3].forEach(stitch2);\n      }\n      cases[t22 << 3].forEach(stitch2);\n      function stitch2(line2) {\n        var start = [line2[0][0] + x2, line2[0][1] + y2], end = [line2[1][0] + x2, line2[1][1] + y2], startIndex = index2(start), endIndex = index2(end), f, g;\n        if (f = fragmentByEnd[startIndex]) {\n          if (g = fragmentByStart[endIndex]) {\n            delete fragmentByEnd[f.end];\n            delete fragmentByStart[g.start];\n            if (f === g) {\n              f.ring.push(end);\n              callback(f.ring);\n            } else {\n              fragmentByStart[f.start] = fragmentByEnd[g.end] = {\n                start: f.start,\n                end: g.end,\n                ring: f.ring.concat(g.ring)\n              };\n            }\n          } else {\n            delete fragmentByEnd[f.end];\n            f.ring.push(end);\n            fragmentByEnd[f.end = endIndex] = f;\n          }\n        } else if (f = fragmentByStart[endIndex]) {\n          if (g = fragmentByEnd[startIndex]) {\n            delete fragmentByStart[f.start];\n            delete fragmentByEnd[g.end];\n            if (f === g) {\n              f.ring.push(end);\n              callback(f.ring);\n            } else {\n              fragmentByStart[g.start] = fragmentByEnd[f.end] = {\n                start: g.start,\n                end: f.end,\n                ring: g.ring.concat(f.ring)\n              };\n            }\n          } else {\n            delete fragmentByStart[f.start];\n            f.ring.unshift(start);\n            fragmentByStart[f.start = startIndex] = f;\n          }\n        } else {\n          fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {\n            start: startIndex,\n            end: endIndex,\n            ring: [start, end]\n          };\n        }\n      }\n    }\n    function index2(point2) {\n      return point2[0] * 2 + point2[1] * (dx + 1) * 4;\n    }\n    function smoothLinear(ring, values2, value2) {\n      ring.forEach((point2) => {\n        var x2 = point2[0], y2 = point2[1], xt = x2 | 0, yt = y2 | 0, v0, v1 = values2[yt * dx + xt];\n        if (x2 > 0 && x2 < dx && xt === x2) {\n          v0 = values2[yt * dx + xt - 1];\n          point2[0] = x2 + (value2 - v0) / (v1 - v0) - 0.5;\n        }\n        if (y2 > 0 && y2 < dy && yt === y2) {\n          v0 = values2[(yt - 1) * dx + xt];\n          point2[1] = y2 + (value2 - v0) / (v1 - v0) - 0.5;\n        }\n      });\n    }\n    contours2.contour = contour;\n    contours2.size = function(_) {\n      if (!arguments.length) return [dx, dy];\n      var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]);\n      if (!(_0 >= 0 && _1 >= 0)) error(\"invalid size\");\n      return dx = _0, dy = _1, contours2;\n    };\n    contours2.smooth = function(_) {\n      return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours2) : smooth === smoothLinear;\n    };\n    return contours2;\n  }\n  function area(ring) {\n    var i = 0, n = ring.length, area2 = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n    while (++i < n) area2 += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n    return area2;\n  }\n  function contains(ring, hole) {\n    var i = -1, n = hole.length, c2;\n    while (++i < n) if (c2 = ringContains(ring, hole[i])) return c2;\n    return 0;\n  }\n  function ringContains(ring, point2) {\n    var x2 = point2[0], y2 = point2[1], contains2 = -1;\n    for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\n      var pi2 = ring[i], xi = pi2[0], yi = pi2[1], pj = ring[j], xj = pj[0], yj = pj[1];\n      if (segmentContains(pi2, pj, point2)) return 0;\n      if (yi > y2 !== yj > y2 && x2 < (xj - xi) * (y2 - yi) / (yj - yi) + xi) contains2 = -contains2;\n    }\n    return contains2;\n  }\n  function segmentContains(a2, b2, c2) {\n    var i;\n    return collinear$1(a2, b2, c2) && within(a2[i = +(a2[0] === b2[0])], c2[i], b2[i]);\n  }\n  function collinear$1(a2, b2, c2) {\n    return (b2[0] - a2[0]) * (c2[1] - a2[1]) === (c2[0] - a2[0]) * (b2[1] - a2[1]);\n  }\n  function within(p, q, r) {\n    return p <= q && q <= r || r <= q && q <= p;\n  }\n  function quantize(k, nice2, zero2) {\n    return function(values2) {\n      var ex = extent(values2), start = zero2 ? Math.min(ex[0], 0) : ex[0], stop2 = ex[1], span2 = stop2 - start, step = nice2 ? tickStep(start, stop2, k) : span2 / (k + 1);\n      return range$3(start + step, stop2, step);\n    };\n  }\n  function Isocontour(params2) {\n    Transform.call(this, null, params2);\n  }\n  Isocontour.Definition = {\n    \"type\": \"Isocontour\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"thresholds\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"levels\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"zero\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"scale\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"translate\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"default\": \"contour\"\n    }]\n  };\n  inherits(Isocontour, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), source2 = pulse2.materialize(pulse2.SOURCE).source, field2 = _.field || identity$7, contour = contours().smooth(_.smooth !== false), tz = _.thresholds || levels(source2, field2, _), as = _.as === null ? null : _.as || \"contour\", values2 = [];\n      source2.forEach((t) => {\n        const grid2 = field2(t);\n        const paths = contour.size([grid2.width, grid2.height])(grid2.values, isArray(tz) ? tz : tz(grid2.values));\n        transformPaths(paths, grid2, t, _);\n        paths.forEach((p) => {\n          values2.push(rederive(t, ingest$1(as != null ? {\n            [as]: p\n          } : p)));\n        });\n      });\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = values2;\n      return out;\n    }\n  });\n  function levels(values2, f, _) {\n    const q = quantize(_.levels || 10, _.nice, _.zero !== false);\n    return _.resolve !== \"shared\" ? q : q(values2.map((t) => max$3(f(t).values)));\n  }\n  function transformPaths(paths, grid2, datum2, _) {\n    let s = _.scale || grid2.scale, t = _.translate || grid2.translate;\n    if (isFunction(s)) s = s(datum2, _);\n    if (isFunction(t)) t = t(datum2, _);\n    if ((s === 1 || s == null) && !t) return;\n    const sx = (isNumber$1(s) ? s : s[0]) || 1, sy = (isNumber$1(s) ? s : s[1]) || 1, tx2 = t && t[0] || 0, ty2 = t && t[1] || 0;\n    paths.forEach(transform$1(grid2, sx, sy, tx2, ty2));\n  }\n  function transform$1(grid2, sx, sy, tx2, ty2) {\n    const x12 = grid2.x1 || 0, y12 = grid2.y1 || 0, flip2 = sx * sy < 0;\n    function transformPolygon(coordinates) {\n      coordinates.forEach(transformRing);\n    }\n    function transformRing(coordinates) {\n      if (flip2) coordinates.reverse();\n      coordinates.forEach(transformPoint);\n    }\n    function transformPoint(coordinates) {\n      coordinates[0] = (coordinates[0] - x12) * sx + tx2;\n      coordinates[1] = (coordinates[1] - y12) * sy + ty2;\n    }\n    return function(geometry) {\n      geometry.coordinates.forEach(transformPolygon);\n      return geometry;\n    };\n  }\n  function radius(bw, data2, f) {\n    const v = bw >= 0 ? bw : estimateBandwidth(data2, f);\n    return Math.round((Math.sqrt(4 * v * v + 1) - 1) / 2);\n  }\n  function number$2(_) {\n    return isFunction(_) ? _ : constant$5(+_);\n  }\n  function density2D() {\n    var x2 = (d) => d[0], y2 = (d) => d[1], weight = one$2, bandwidth2 = [-1, -1], dx = 960, dy = 500, k = 2;\n    function density2(data2, counts) {\n      const rx = radius(bandwidth2[0], data2, x2) >> k, ry = radius(bandwidth2[1], data2, y2) >> k, ox = rx ? rx + 2 : 0, oy = ry ? ry + 2 : 0, n = 2 * ox + (dx >> k), m2 = 2 * oy + (dy >> k), values0 = new Float32Array(n * m2), values1 = new Float32Array(n * m2);\n      let values2 = values0;\n      data2.forEach((d) => {\n        const xi = ox + (+x2(d) >> k), yi = oy + (+y2(d) >> k);\n        if (xi >= 0 && xi < n && yi >= 0 && yi < m2) {\n          values0[xi + yi * n] += +weight(d);\n        }\n      });\n      if (rx > 0 && ry > 0) {\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n      } else if (rx > 0) {\n        blurX(n, m2, values0, values1, rx);\n        blurX(n, m2, values1, values0, rx);\n        blurX(n, m2, values0, values1, rx);\n        values2 = values1;\n      } else if (ry > 0) {\n        blurY(n, m2, values0, values1, ry);\n        blurY(n, m2, values1, values0, ry);\n        blurY(n, m2, values0, values1, ry);\n        values2 = values1;\n      }\n      const s = counts ? Math.pow(2, -2 * k) : 1 / sum$1(values2);\n      for (let i = 0, sz2 = n * m2; i < sz2; ++i) values2[i] *= s;\n      return {\n        values: values2,\n        scale: 1 << k,\n        width: n,\n        height: m2,\n        x1: ox,\n        y1: oy,\n        x2: ox + (dx >> k),\n        y2: oy + (dy >> k)\n      };\n    }\n    density2.x = function(_) {\n      return arguments.length ? (x2 = number$2(_), density2) : x2;\n    };\n    density2.y = function(_) {\n      return arguments.length ? (y2 = number$2(_), density2) : y2;\n    };\n    density2.weight = function(_) {\n      return arguments.length ? (weight = number$2(_), density2) : weight;\n    };\n    density2.size = function(_) {\n      if (!arguments.length) return [dx, dy];\n      var _0 = +_[0], _1 = +_[1];\n      if (!(_0 >= 0 && _1 >= 0)) error(\"invalid size\");\n      return dx = _0, dy = _1, density2;\n    };\n    density2.cellSize = function(_) {\n      if (!arguments.length) return 1 << k;\n      if (!((_ = +_) >= 1)) error(\"invalid cell size\");\n      k = Math.floor(Math.log(_) / Math.LN2);\n      return density2;\n    };\n    density2.bandwidth = function(_) {\n      if (!arguments.length) return bandwidth2;\n      _ = array$5(_);\n      if (_.length === 1) _ = [+_[0], +_[0]];\n      if (_.length !== 2) error(\"invalid bandwidth\");\n      return bandwidth2 = _, density2;\n    };\n    return density2;\n  }\n  function blurX(n, m2, source2, target2, r) {\n    const w2 = (r << 1) + 1;\n    for (let j = 0; j < m2; ++j) {\n      for (let i = 0, sr = 0; i < n + r; ++i) {\n        if (i < n) {\n          sr += source2[i + j * n];\n        }\n        if (i >= r) {\n          if (i >= w2) {\n            sr -= source2[i - w2 + j * n];\n          }\n          target2[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w2 - i, w2);\n        }\n      }\n    }\n  }\n  function blurY(n, m2, source2, target2, r) {\n    const w2 = (r << 1) + 1;\n    for (let i = 0; i < n; ++i) {\n      for (let j = 0, sr = 0; j < m2 + r; ++j) {\n        if (j < m2) {\n          sr += source2[i + j * n];\n        }\n        if (j >= r) {\n          if (j >= w2) {\n            sr -= source2[i + (j - w2) * n];\n          }\n          target2[i + (j - r) * n] = sr / Math.min(j + 1, m2 - 1 + w2 - j, w2);\n        }\n      }\n    }\n  }\n  function KDE2D(params2) {\n    Transform.call(this, null, params2);\n  }\n  KDE2D.Definition = {\n    \"type\": \"KDE2D\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"weight\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"cellSize\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"counts\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"grid\"\n    }]\n  };\n  const PARAMS = [\"x\", \"y\", \"weight\", \"size\", \"cellSize\", \"bandwidth\"];\n  function params(obj2, _) {\n    PARAMS.forEach((param2) => _[param2] != null ? obj2[param2](_[param2]) : 0);\n    return obj2;\n  }\n  inherits(KDE2D, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) return pulse2.StopPropagation;\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$2(source2, _.groupby), names = (_.groupby || []).map(accessorName), kde2 = params(density2D(), _), as = _.as || \"grid\", values2 = [];\n      function set2(t, vals) {\n        for (let i = 0; i < names.length; ++i) t[names[i]] = vals[i];\n        return t;\n      }\n      values2 = groups.map((g) => ingest$1(set2({\n        [as]: kde2(g, _.counts)\n      }, g.dims)));\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = values2;\n      return out;\n    }\n  });\n  function partition$2(data2, groupby) {\n    var groups = [], get2 = (f) => f(t), map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2);\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    return groups;\n  }\n  function Contour(params2) {\n    Transform.call(this, null, params2);\n  }\n  Contour.Definition = {\n    \"type\": \"Contour\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"values\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"x\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"weight\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"cellSize\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"count\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"thresholds\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }]\n  };\n  inherits(Contour, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), contour = contours().smooth(_.smooth !== false), values2 = _.values, thresh = _.thresholds || quantize(_.count || 10, _.nice, !!values2), size2 = _.size, grid2, post;\n      if (!values2) {\n        values2 = pulse2.materialize(pulse2.SOURCE).source;\n        grid2 = params(density2D(), _)(values2, true);\n        post = transform$1(grid2, grid2.scale || 1, grid2.scale || 1, 0, 0);\n        size2 = [grid2.width, grid2.height];\n        values2 = grid2.values;\n      }\n      thresh = isArray(thresh) ? thresh : thresh(values2);\n      values2 = contour.size(size2)(values2, thresh);\n      if (post) values2.forEach(post);\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = (values2 || []).map(ingest$1);\n      return out;\n    }\n  });\n  const Feature = \"Feature\";\n  const FeatureCollection = \"FeatureCollection\";\n  const MultiPoint = \"MultiPoint\";\n  function GeoJSON(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoJSON.Definition = {\n    \"type\": \"GeoJSON\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"geojson\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(GeoJSON, Transform, {\n    transform(_, pulse2) {\n      var features = this._features, points2 = this._points, fields = _.fields, lon = fields && fields[0], lat = fields && fields[1], geojson = _.geojson || !fields && identity$7, flag2 = pulse2.ADD, mod;\n      mod = _.modified() || pulse2.changed(pulse2.REM) || pulse2.modified(accessorFields(geojson)) || lon && pulse2.modified(accessorFields(lon)) || lat && pulse2.modified(accessorFields(lat));\n      if (!this.value || mod) {\n        flag2 = pulse2.SOURCE;\n        this._features = features = [];\n        this._points = points2 = [];\n      }\n      if (geojson) {\n        pulse2.visit(flag2, (t) => features.push(geojson(t)));\n      }\n      if (lon && lat) {\n        pulse2.visit(flag2, (t) => {\n          var x2 = lon(t), y2 = lat(t);\n          if (x2 != null && y2 != null && (x2 = +x2) === x2 && (y2 = +y2) === y2) {\n            points2.push([x2, y2]);\n          }\n        });\n        features = features.concat({\n          type: Feature,\n          geometry: {\n            type: MultiPoint,\n            coordinates: points2\n          }\n        });\n      }\n      this.value = {\n        type: FeatureCollection,\n        features\n      };\n    }\n  });\n  function GeoPath(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoPath.Definition = {\n    \"type\": \"GeoPath\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\"\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"pointRadius\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  inherits(GeoPath, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), path2 = this.value, field2 = _.field || identity$7, as = _.as || \"path\", flag2 = out.SOURCE;\n      if (!path2 || _.modified()) {\n        this.value = path2 = getProjectionPath(_.projection);\n        out.materialize().reflow();\n      } else {\n        flag2 = field2 === identity$7 || pulse2.modified(field2.fields) ? out.ADD_MOD : out.ADD;\n      }\n      const prev = initPath(path2, _.pointRadius);\n      out.visit(flag2, (t) => t[as] = path2(field2(t)));\n      path2.pointRadius(prev);\n      return out.modifies(as);\n    }\n  });\n  function initPath(path2, pointRadius) {\n    const prev = path2.pointRadius();\n    path2.context(null);\n    if (pointRadius != null) {\n      path2.pointRadius(pointRadius);\n    }\n    return prev;\n  }\n  function GeoPoint(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoPoint.Definition = {\n    \"type\": \"GeoPoint\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\",\n      \"required\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"x\", \"y\"]\n    }]\n  };\n  inherits(GeoPoint, Transform, {\n    transform(_, pulse2) {\n      var proj = _.projection, lon = _.fields[0], lat = _.fields[1], as = _.as || [\"x\", \"y\"], x2 = as[0], y2 = as[1], mod;\n      function set2(t) {\n        const xy = proj([lon(t), lat(t)]);\n        if (xy) {\n          t[x2] = xy[0];\n          t[y2] = xy[1];\n        } else {\n          t[x2] = void 0;\n          t[y2] = void 0;\n        }\n      }\n      if (_.modified()) {\n        pulse2 = pulse2.materialize().reflow(true).visit(pulse2.SOURCE, set2);\n      } else {\n        mod = pulse2.modified(lon.fields) || pulse2.modified(lat.fields);\n        pulse2.visit(mod ? pulse2.ADD_MOD : pulse2.ADD, set2);\n      }\n      return pulse2.modifies(as);\n    }\n  });\n  function GeoShape(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoShape.Definition = {\n    \"type\": \"GeoShape\",\n    \"metadata\": {\n      \"modifies\": true,\n      \"nomod\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\"\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"default\": \"datum\"\n    }, {\n      \"name\": \"pointRadius\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"shape\"\n    }]\n  };\n  inherits(GeoShape, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), shape2 = this.value, as = _.as || \"shape\", flag2 = out.ADD;\n      if (!shape2 || _.modified()) {\n        this.value = shape2 = shapeGenerator(getProjectionPath(_.projection), _.field || field$1(\"datum\"), _.pointRadius);\n        out.materialize().reflow();\n        flag2 = out.SOURCE;\n      }\n      out.visit(flag2, (t) => t[as] = shape2);\n      return out.modifies(as);\n    }\n  });\n  function shapeGenerator(path2, field2, pointRadius) {\n    const shape2 = pointRadius == null ? (_) => path2(field2(_)) : (_) => {\n      var prev = path2.pointRadius(), value2 = path2.pointRadius(pointRadius)(field2(_));\n      path2.pointRadius(prev);\n      return value2;\n    };\n    shape2.context = (_) => {\n      path2.context(_);\n      return shape2;\n    };\n    return shape2;\n  }\n  function Graticule(params2) {\n    Transform.call(this, [], params2);\n    this.generator = graticule();\n  }\n  Graticule.Definition = {\n    \"type\": \"Graticule\",\n    \"metadata\": {\n      \"changes\": true,\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"extent\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"extentMajor\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"extentMinor\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"stepMajor\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [90, 360]\n    }, {\n      \"name\": \"stepMinor\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [10, 10]\n    }, {\n      \"name\": \"precision\",\n      \"type\": \"number\",\n      \"default\": 2.5\n    }]\n  };\n  inherits(Graticule, Transform, {\n    transform(_, pulse2) {\n      var src = this.value, gen = this.generator, t;\n      if (!src.length || _.modified()) {\n        for (const prop in _) {\n          if (isFunction(gen[prop])) {\n            gen[prop](_[prop]);\n          }\n        }\n      }\n      t = gen();\n      if (src.length) {\n        pulse2.mod.push(replace$1(src[0], t));\n      } else {\n        pulse2.add.push(ingest$1(t));\n      }\n      src[0] = t;\n      return pulse2;\n    }\n  });\n  function Heatmap(params2) {\n    Transform.call(this, null, params2);\n  }\n  Heatmap.Definition = {\n    \"type\": \"heatmap\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"color\",\n      \"type\": \"string\",\n      \"expr\": true\n    }, {\n      \"name\": \"opacity\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"image\"\n    }]\n  };\n  inherits(Heatmap, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var source2 = pulse2.materialize(pulse2.SOURCE).source, shared = _.resolve === \"shared\", field2 = _.field || identity$7, opacity2 = opacity_(_.opacity, _), color2 = color_(_.color, _), as = _.as || \"image\", obj2 = {\n        $x: 0,\n        $y: 0,\n        $value: 0,\n        $max: shared ? max$3(source2.map((t) => max$3(field2(t).values))) : 0\n      };\n      source2.forEach((t) => {\n        const v = field2(t);\n        const o = extend$1({}, t, obj2);\n        if (!shared) o.$max = max$3(v.values || []);\n        t[as] = toCanvas(v, o, color2.dep ? color2 : constant$5(color2(o)), opacity2.dep ? opacity2 : constant$5(opacity2(o)));\n      });\n      return pulse2.reflow(true).modifies(as);\n    }\n  });\n  function color_(color2, _) {\n    let f;\n    if (isFunction(color2)) {\n      f = (obj2) => rgb$1(color2(obj2, _));\n      f.dep = dependency(color2);\n    } else {\n      f = constant$5(rgb$1(color2 || \"#888\"));\n    }\n    return f;\n  }\n  function opacity_(opacity2, _) {\n    let f;\n    if (isFunction(opacity2)) {\n      f = (obj2) => opacity2(obj2, _);\n      f.dep = dependency(opacity2);\n    } else if (opacity2) {\n      f = constant$5(opacity2);\n    } else {\n      f = (obj2) => obj2.$value / obj2.$max || 0;\n      f.dep = true;\n    }\n    return f;\n  }\n  function dependency(f) {\n    if (!isFunction(f)) return false;\n    const set2 = toSet(accessorFields(f));\n    return set2.$x || set2.$y || set2.$value || set2.$max;\n  }\n  function toCanvas(grid2, obj2, color2, opacity2) {\n    const n = grid2.width, m2 = grid2.height, x12 = grid2.x1 || 0, y12 = grid2.y1 || 0, x2 = grid2.x2 || n, y2 = grid2.y2 || m2, val = grid2.values, value2 = val ? (i) => val[i] : zero$3, can = domCanvas(x2 - x12, y2 - y12), ctx = can.getContext(\"2d\"), img = ctx.getImageData(0, 0, x2 - x12, y2 - y12), pix = img.data;\n    for (let j = y12, k = 0; j < y2; ++j) {\n      obj2.$y = j - y12;\n      for (let i = x12, r = j * n; i < x2; ++i, k += 4) {\n        obj2.$x = i - x12;\n        obj2.$value = value2(i + r);\n        const v = color2(obj2);\n        pix[k + 0] = v.r;\n        pix[k + 1] = v.g;\n        pix[k + 2] = v.b;\n        pix[k + 3] = ~~(255 * opacity2(obj2));\n      }\n    }\n    ctx.putImageData(img, 0, 0);\n    return can;\n  }\n  function Projection$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Projection$1, Transform, {\n    transform(_, pulse2) {\n      let proj = this.value;\n      if (!proj || _.modified(\"type\")) {\n        this.value = proj = create$6(_.type);\n        projectionProperties.forEach((prop) => {\n          if (_[prop] != null) set$5(proj, prop, _[prop]);\n        });\n      } else {\n        projectionProperties.forEach((prop) => {\n          if (_.modified(prop)) set$5(proj, prop, _[prop]);\n        });\n      }\n      if (_.pointRadius != null) proj.path.pointRadius(_.pointRadius);\n      if (_.fit) fit(proj, _);\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function fit(proj, _) {\n    const data2 = collectGeoJSON(_.fit);\n    _.extent ? proj.fitExtent(_.extent, data2) : _.size ? proj.fitSize(_.size, data2) : 0;\n  }\n  function create$6(type2) {\n    const constructor = projection((type2 || \"mercator\").toLowerCase());\n    if (!constructor) error(\"Unrecognized projection type: \" + type2);\n    return constructor();\n  }\n  function set$5(proj, key2, value2) {\n    if (isFunction(proj[key2])) proj[key2](value2);\n  }\n  function collectGeoJSON(data2) {\n    data2 = array$5(data2);\n    return data2.length === 1 ? data2[0] : {\n      type: FeatureCollection,\n      features: data2.reduce((a2, f) => a2.concat(featurize(f)), [])\n    };\n  }\n  function featurize(f) {\n    return f.type === FeatureCollection ? f.features : array$5(f).filter((d) => d != null).map((d) => d.type === Feature ? d : {\n      type: Feature,\n      geometry: d\n    });\n  }\n  const geo = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    contour: Contour,\n    geojson: GeoJSON,\n    geopath: GeoPath,\n    geopoint: GeoPoint,\n    geoshape: GeoShape,\n    graticule: Graticule,\n    heatmap: Heatmap,\n    isocontour: Isocontour,\n    kde2d: KDE2D,\n    projection: Projection$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function forceCenter(x2, y2) {\n    var nodes, strength = 1;\n    if (x2 == null) x2 = 0;\n    if (y2 == null) y2 = 0;\n    function force2() {\n      var i, n = nodes.length, node, sx = 0, sy = 0;\n      for (i = 0; i < n; ++i) {\n        node = nodes[i], sx += node.x, sy += node.y;\n      }\n      for (sx = (sx / n - x2) * strength, sy = (sy / n - y2) * strength, i = 0; i < n; ++i) {\n        node = nodes[i], node.x -= sx, node.y -= sy;\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n    };\n    force2.x = function(_) {\n      return arguments.length ? (x2 = +_, force2) : x2;\n    };\n    force2.y = function(_) {\n      return arguments.length ? (y2 = +_, force2) : y2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = +_, force2) : strength;\n    };\n    return force2;\n  }\n  function tree_add(d) {\n    const x2 = +this._x.call(null, d), y2 = +this._y.call(null, d);\n    return add$1(this.cover(x2, y2), x2, y2, d);\n  }\n  function add$1(tree2, x2, y2, d) {\n    if (isNaN(x2) || isNaN(y2)) return tree2;\n    var parent, node = tree2._root, leaf = { data: d }, x02 = tree2._x0, y02 = tree2._y0, x12 = tree2._x1, y12 = tree2._y1, xm, ym, xp, yp, right, bottom, i, j;\n    if (!node) return tree2._root = leaf, tree2;\n    while (node.length) {\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n      if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree2;\n    }\n    xp = +tree2._x.call(null, node.data);\n    yp = +tree2._y.call(null, node.data);\n    if (x2 === xp && y2 === yp) return leaf.next = node, parent ? parent[i] = leaf : tree2._root = leaf, tree2;\n    do {\n      parent = parent ? parent[i] = new Array(4) : tree2._root = new Array(4);\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n    } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));\n    return parent[j] = node, parent[i] = leaf, tree2;\n  }\n  function addAll(data2) {\n    var d, i, n = data2.length, x2, y2, xz = new Array(n), yz = new Array(n), x02 = Infinity, y02 = Infinity, x12 = -Infinity, y12 = -Infinity;\n    for (i = 0; i < n; ++i) {\n      if (isNaN(x2 = +this._x.call(null, d = data2[i])) || isNaN(y2 = +this._y.call(null, d))) continue;\n      xz[i] = x2;\n      yz[i] = y2;\n      if (x2 < x02) x02 = x2;\n      if (x2 > x12) x12 = x2;\n      if (y2 < y02) y02 = y2;\n      if (y2 > y12) y12 = y2;\n    }\n    if (x02 > x12 || y02 > y12) return this;\n    this.cover(x02, y02).cover(x12, y12);\n    for (i = 0; i < n; ++i) {\n      add$1(this, xz[i], yz[i], data2[i]);\n    }\n    return this;\n  }\n  function tree_cover(x2, y2) {\n    if (isNaN(x2 = +x2) || isNaN(y2 = +y2)) return this;\n    var x02 = this._x0, y02 = this._y0, x12 = this._x1, y12 = this._y1;\n    if (isNaN(x02)) {\n      x12 = (x02 = Math.floor(x2)) + 1;\n      y12 = (y02 = Math.floor(y2)) + 1;\n    } else {\n      var z = x12 - x02 || 1, node = this._root, parent, i;\n      while (x02 > x2 || x2 >= x12 || y02 > y2 || y2 >= y12) {\n        i = (y2 < y02) << 1 | x2 < x02;\n        parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n        switch (i) {\n          case 0:\n            x12 = x02 + z, y12 = y02 + z;\n            break;\n          case 1:\n            x02 = x12 - z, y12 = y02 + z;\n            break;\n          case 2:\n            x12 = x02 + z, y02 = y12 - z;\n            break;\n          case 3:\n            x02 = x12 - z, y02 = y12 - z;\n            break;\n        }\n      }\n      if (this._root && this._root.length) this._root = node;\n    }\n    this._x0 = x02;\n    this._y0 = y02;\n    this._x1 = x12;\n    this._y1 = y12;\n    return this;\n  }\n  function tree_data() {\n    var data2 = [];\n    this.visit(function(node) {\n      if (!node.length) do\n        data2.push(node.data);\n      while (node = node.next);\n    });\n    return data2;\n  }\n  function tree_extent(_) {\n    return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]];\n  }\n  function Quad$3(node, x02, y02, x12, y12) {\n    this.node = node;\n    this.x0 = x02;\n    this.y0 = y02;\n    this.x1 = x12;\n    this.y1 = y12;\n  }\n  function tree_find(x2, y2, radius2) {\n    var data2, x02 = this._x0, y02 = this._y0, x12, y12, x22, y22, x3 = this._x1, y3 = this._y1, quads = [], node = this._root, q, i;\n    if (node) quads.push(new Quad$3(node, x02, y02, x3, y3));\n    if (radius2 == null) radius2 = Infinity;\n    else {\n      x02 = x2 - radius2, y02 = y2 - radius2;\n      x3 = x2 + radius2, y3 = y2 + radius2;\n      radius2 *= radius2;\n    }\n    while (q = quads.pop()) {\n      if (!(node = q.node) || (x12 = q.x0) > x3 || (y12 = q.y0) > y3 || (x22 = q.x1) < x02 || (y22 = q.y1) < y02) continue;\n      if (node.length) {\n        var xm = (x12 + x22) / 2, ym = (y12 + y22) / 2;\n        quads.push(\n          new Quad$3(node[3], xm, ym, x22, y22),\n          new Quad$3(node[2], x12, ym, xm, y22),\n          new Quad$3(node[1], xm, y12, x22, ym),\n          new Quad$3(node[0], x12, y12, xm, ym)\n        );\n        if (i = (y2 >= ym) << 1 | x2 >= xm) {\n          q = quads[quads.length - 1];\n          quads[quads.length - 1] = quads[quads.length - 1 - i];\n          quads[quads.length - 1 - i] = q;\n        }\n      } else {\n        var dx = x2 - +this._x.call(null, node.data), dy = y2 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;\n        if (d2 < radius2) {\n          var d = Math.sqrt(radius2 = d2);\n          x02 = x2 - d, y02 = y2 - d;\n          x3 = x2 + d, y3 = y2 + d;\n          data2 = node.data;\n        }\n      }\n    }\n    return data2;\n  }\n  function tree_remove(d) {\n    if (isNaN(x2 = +this._x.call(null, d)) || isNaN(y2 = +this._y.call(null, d))) return this;\n    var parent, node = this._root, retainer, previous, next, x02 = this._x0, y02 = this._y0, x12 = this._x1, y12 = this._y1, x2, y2, xm, ym, right, bottom, i, j;\n    if (!node) return this;\n    if (node.length) while (true) {\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n      if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n      if (!node.length) break;\n      if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) retainer = parent, j = i;\n    }\n    while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n    if (next = node.next) delete node.next;\n    if (previous) return next ? previous.next = next : delete previous.next, this;\n    if (!parent) return this._root = next, this;\n    next ? parent[i] = next : delete parent[i];\n    if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {\n      if (retainer) retainer[j] = node;\n      else this._root = node;\n    }\n    return this;\n  }\n  function removeAll(data2) {\n    for (var i = 0, n = data2.length; i < n; ++i) this.remove(data2[i]);\n    return this;\n  }\n  function tree_root() {\n    return this._root;\n  }\n  function tree_size() {\n    var size2 = 0;\n    this.visit(function(node) {\n      if (!node.length) do\n        ++size2;\n      while (node = node.next);\n    });\n    return size2;\n  }\n  function tree_visit(callback) {\n    var quads = [], q, node = this._root, child, x02, y02, x12, y12;\n    if (node) quads.push(new Quad$3(node, this._x0, this._y0, this._x1, this._y1));\n    while (q = quads.pop()) {\n      if (!callback(node = q.node, x02 = q.x0, y02 = q.y0, x12 = q.x1, y12 = q.y1) && node.length) {\n        var xm = (x02 + x12) / 2, ym = (y02 + y12) / 2;\n        if (child = node[3]) quads.push(new Quad$3(child, xm, ym, x12, y12));\n        if (child = node[2]) quads.push(new Quad$3(child, x02, ym, xm, y12));\n        if (child = node[1]) quads.push(new Quad$3(child, xm, y02, x12, ym));\n        if (child = node[0]) quads.push(new Quad$3(child, x02, y02, xm, ym));\n      }\n    }\n    return this;\n  }\n  function tree_visitAfter(callback) {\n    var quads = [], next = [], q;\n    if (this._root) quads.push(new Quad$3(this._root, this._x0, this._y0, this._x1, this._y1));\n    while (q = quads.pop()) {\n      var node = q.node;\n      if (node.length) {\n        var child, x02 = q.x0, y02 = q.y0, x12 = q.x1, y12 = q.y1, xm = (x02 + x12) / 2, ym = (y02 + y12) / 2;\n        if (child = node[0]) quads.push(new Quad$3(child, x02, y02, xm, ym));\n        if (child = node[1]) quads.push(new Quad$3(child, xm, y02, x12, ym));\n        if (child = node[2]) quads.push(new Quad$3(child, x02, ym, xm, y12));\n        if (child = node[3]) quads.push(new Quad$3(child, xm, ym, x12, y12));\n      }\n      next.push(q);\n    }\n    while (q = next.pop()) {\n      callback(q.node, q.x0, q.y0, q.x1, q.y1);\n    }\n    return this;\n  }\n  function defaultX(d) {\n    return d[0];\n  }\n  function tree_x(_) {\n    return arguments.length ? (this._x = _, this) : this._x;\n  }\n  function defaultY(d) {\n    return d[1];\n  }\n  function tree_y(_) {\n    return arguments.length ? (this._y = _, this) : this._y;\n  }\n  function quadtree(nodes, x2, y2) {\n    var tree2 = new Quadtree(x2 == null ? defaultX : x2, y2 == null ? defaultY : y2, NaN, NaN, NaN, NaN);\n    return nodes == null ? tree2 : tree2.addAll(nodes);\n  }\n  function Quadtree(x2, y2, x02, y02, x12, y12) {\n    this._x = x2;\n    this._y = y2;\n    this._x0 = x02;\n    this._y0 = y02;\n    this._x1 = x12;\n    this._y1 = y12;\n    this._root = void 0;\n  }\n  function leaf_copy(leaf) {\n    var copy2 = { data: leaf.data }, next = copy2;\n    while (leaf = leaf.next) next = next.next = { data: leaf.data };\n    return copy2;\n  }\n  var treeProto = quadtree.prototype = Quadtree.prototype;\n  treeProto.copy = function() {\n    var copy2 = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child;\n    if (!node) return copy2;\n    if (!node.length) return copy2._root = leaf_copy(node), copy2;\n    nodes = [{ source: node, target: copy2._root = new Array(4) }];\n    while (node = nodes.pop()) {\n      for (var i = 0; i < 4; ++i) {\n        if (child = node.source[i]) {\n          if (child.length) nodes.push({ source: child, target: node.target[i] = new Array(4) });\n          else node.target[i] = leaf_copy(child);\n        }\n      }\n    }\n    return copy2;\n  };\n  treeProto.add = tree_add;\n  treeProto.addAll = addAll;\n  treeProto.cover = tree_cover;\n  treeProto.data = tree_data;\n  treeProto.extent = tree_extent;\n  treeProto.find = tree_find;\n  treeProto.remove = tree_remove;\n  treeProto.removeAll = removeAll;\n  treeProto.root = tree_root;\n  treeProto.size = tree_size;\n  treeProto.visit = tree_visit;\n  treeProto.visitAfter = tree_visitAfter;\n  treeProto.x = tree_x;\n  treeProto.y = tree_y;\n  function constant$1(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  function jiggle(random2) {\n    return (random2() - 0.5) * 1e-6;\n  }\n  function x$1(d) {\n    return d.x + d.vx;\n  }\n  function y$1(d) {\n    return d.y + d.vy;\n  }\n  function forceCollide(radius2) {\n    var nodes, radii, random2, strength = 1, iterations2 = 1;\n    if (typeof radius2 !== \"function\") radius2 = constant$1(radius2 == null ? 1 : +radius2);\n    function force2() {\n      var i, n = nodes.length, tree2, node, xi, yi, ri, ri2;\n      for (var k = 0; k < iterations2; ++k) {\n        tree2 = quadtree(nodes, x$1, y$1).visitAfter(prepare2);\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          ri = radii[node.index], ri2 = ri * ri;\n          xi = node.x + node.vx;\n          yi = node.y + node.vy;\n          tree2.visit(apply2);\n        }\n      }\n      function apply2(quad2, x02, y02, x12, y12) {\n        var data2 = quad2.data, rj = quad2.r, r = ri + rj;\n        if (data2) {\n          if (data2.index > node.index) {\n            var x2 = xi - data2.x - data2.vx, y2 = yi - data2.y - data2.vy, l = x2 * x2 + y2 * y2;\n            if (l < r * r) {\n              if (x2 === 0) x2 = jiggle(random2), l += x2 * x2;\n              if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n              l = (r - (l = Math.sqrt(l))) / l * strength;\n              node.vx += (x2 *= l) * (r = (rj *= rj) / (ri2 + rj));\n              node.vy += (y2 *= l) * r;\n              data2.vx -= x2 * (r = 1 - r);\n              data2.vy -= y2 * r;\n            }\n          }\n          return;\n        }\n        return x02 > xi + r || x12 < xi - r || y02 > yi + r || y12 < yi - r;\n      }\n    }\n    function prepare2(quad2) {\n      if (quad2.data) return quad2.r = radii[quad2.data.index];\n      for (var i = quad2.r = 0; i < 4; ++i) {\n        if (quad2[i] && quad2[i].r > quad2.r) {\n          quad2.r = quad2[i].r;\n        }\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, node;\n      radii = new Array(n);\n      for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius2(node, i, nodes);\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.iterations = function(_) {\n      return arguments.length ? (iterations2 = +_, force2) : iterations2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = +_, force2) : strength;\n    };\n    force2.radius = function(_) {\n      return arguments.length ? (radius2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : radius2;\n    };\n    return force2;\n  }\n  function index$1(d) {\n    return d.index;\n  }\n  function find$1(nodeById, nodeId) {\n    var node = nodeById.get(nodeId);\n    if (!node) throw new Error(\"node not found: \" + nodeId);\n    return node;\n  }\n  function forceLink(links) {\n    var id2 = index$1, strength = defaultStrength, strengths, distance2 = constant$1(30), distances, nodes, count2, bias, random2, iterations2 = 1;\n    if (links == null) links = [];\n    function defaultStrength(link2) {\n      return 1 / Math.min(count2[link2.source.index], count2[link2.target.index]);\n    }\n    function force2(alpha) {\n      for (var k = 0, n = links.length; k < iterations2; ++k) {\n        for (var i = 0, link2, source2, target2, x2, y2, l, b2; i < n; ++i) {\n          link2 = links[i], source2 = link2.source, target2 = link2.target;\n          x2 = target2.x + target2.vx - source2.x - source2.vx || jiggle(random2);\n          y2 = target2.y + target2.vy - source2.y - source2.vy || jiggle(random2);\n          l = Math.sqrt(x2 * x2 + y2 * y2);\n          l = (l - distances[i]) / l * alpha * strengths[i];\n          x2 *= l, y2 *= l;\n          target2.vx -= x2 * (b2 = bias[i]);\n          target2.vy -= y2 * b2;\n          source2.vx += x2 * (b2 = 1 - b2);\n          source2.vy += y2 * b2;\n        }\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d, i2) => [id2(d, i2, nodes), d])), link2;\n      for (i = 0, count2 = new Array(n); i < m2; ++i) {\n        link2 = links[i], link2.index = i;\n        if (typeof link2.source !== \"object\") link2.source = find$1(nodeById, link2.source);\n        if (typeof link2.target !== \"object\") link2.target = find$1(nodeById, link2.target);\n        count2[link2.source.index] = (count2[link2.source.index] || 0) + 1;\n        count2[link2.target.index] = (count2[link2.target.index] || 0) + 1;\n      }\n      for (i = 0, bias = new Array(m2); i < m2; ++i) {\n        link2 = links[i], bias[i] = count2[link2.source.index] / (count2[link2.source.index] + count2[link2.target.index]);\n      }\n      strengths = new Array(m2), initializeStrength();\n      distances = new Array(m2), initializeDistance();\n    }\n    function initializeStrength() {\n      if (!nodes) return;\n      for (var i = 0, n = links.length; i < n; ++i) {\n        strengths[i] = +strength(links[i], i, links);\n      }\n    }\n    function initializeDistance() {\n      if (!nodes) return;\n      for (var i = 0, n = links.length; i < n; ++i) {\n        distances[i] = +distance2(links[i], i, links);\n      }\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.links = function(_) {\n      return arguments.length ? (links = _, initialize2(), force2) : links;\n    };\n    force2.id = function(_) {\n      return arguments.length ? (id2 = _, force2) : id2;\n    };\n    force2.iterations = function(_) {\n      return arguments.length ? (iterations2 = +_, force2) : iterations2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initializeStrength(), force2) : strength;\n    };\n    force2.distance = function(_) {\n      return arguments.length ? (distance2 = typeof _ === \"function\" ? _ : constant$1(+_), initializeDistance(), force2) : distance2;\n    };\n    return force2;\n  }\n  var noop = { value: () => {\n  } };\n  function dispatch() {\n    for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n      if (!(t = arguments[i] + \"\") || t in _ || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n      _[t] = [];\n    }\n    return new Dispatch(_);\n  }\n  function Dispatch(_) {\n    this._ = _;\n  }\n  function parseTypenames(typenames, types) {\n    return typenames.trim().split(/^|\\s+/).map(function(t) {\n      var name = \"\", i = t.indexOf(\".\");\n      if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n      if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n      return { type: t, name };\n    });\n  }\n  Dispatch.prototype = dispatch.prototype = {\n    constructor: Dispatch,\n    on: function(typename, callback) {\n      var _ = this._, T = parseTypenames(typename + \"\", _), t, i = -1, n = T.length;\n      if (arguments.length < 2) {\n        while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n        return;\n      }\n      if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n      while (++i < n) {\n        if (t = (typename = T[i]).type) _[t] = set$4(_[t], typename.name, callback);\n        else if (callback == null) for (t in _) _[t] = set$4(_[t], typename.name, null);\n      }\n      return this;\n    },\n    copy: function() {\n      var copy2 = {}, _ = this._;\n      for (var t in _) copy2[t] = _[t].slice();\n      return new Dispatch(copy2);\n    },\n    call: function(type2, that) {\n      if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n      if (!this._.hasOwnProperty(type2)) throw new Error(\"unknown type: \" + type2);\n      for (t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n    },\n    apply: function(type2, that, args) {\n      if (!this._.hasOwnProperty(type2)) throw new Error(\"unknown type: \" + type2);\n      for (var t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n    }\n  };\n  function get(type2, name) {\n    for (var i = 0, n = type2.length, c2; i < n; ++i) {\n      if ((c2 = type2[i]).name === name) {\n        return c2.value;\n      }\n    }\n  }\n  function set$4(type2, name, callback) {\n    for (var i = 0, n = type2.length; i < n; ++i) {\n      if (type2[i].name === name) {\n        type2[i] = noop, type2 = type2.slice(0, i).concat(type2.slice(i + 1));\n        break;\n      }\n    }\n    if (callback != null) type2.push({ name, value: callback });\n    return type2;\n  }\n  var frame = 0, timeout = 0, interval$1 = 0, pokeDelay = 1e3, taskHead, taskTail, clockLast = 0, clockNow = 0, clockSkew = 0, clock = typeof performance === \"object\" && performance.now ? performance : Date, setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {\n    setTimeout(f, 17);\n  };\n  function now() {\n    return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n  }\n  function clearNow() {\n    clockNow = 0;\n  }\n  function Timer$1() {\n    this._call = this._time = this._next = null;\n  }\n  Timer$1.prototype = timer$1.prototype = {\n    constructor: Timer$1,\n    restart: function(callback, delay, time2) {\n      if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n      time2 = (time2 == null ? now() : +time2) + (delay == null ? 0 : +delay);\n      if (!this._next && taskTail !== this) {\n        if (taskTail) taskTail._next = this;\n        else taskHead = this;\n        taskTail = this;\n      }\n      this._call = callback;\n      this._time = time2;\n      sleep();\n    },\n    stop: function() {\n      if (this._call) {\n        this._call = null;\n        this._time = Infinity;\n        sleep();\n      }\n    }\n  };\n  function timer$1(callback, delay, time2) {\n    var t = new Timer$1();\n    t.restart(callback, delay, time2);\n    return t;\n  }\n  function timerFlush() {\n    now();\n    ++frame;\n    var t = taskHead, e;\n    while (t) {\n      if ((e = clockNow - t._time) >= 0) t._call.call(void 0, e);\n      t = t._next;\n    }\n    --frame;\n  }\n  function wake() {\n    clockNow = (clockLast = clock.now()) + clockSkew;\n    frame = timeout = 0;\n    try {\n      timerFlush();\n    } finally {\n      frame = 0;\n      nap();\n      clockNow = 0;\n    }\n  }\n  function poke() {\n    var now2 = clock.now(), delay = now2 - clockLast;\n    if (delay > pokeDelay) clockSkew -= delay, clockLast = now2;\n  }\n  function nap() {\n    var t02, t12 = taskHead, t22, time2 = Infinity;\n    while (t12) {\n      if (t12._call) {\n        if (time2 > t12._time) time2 = t12._time;\n        t02 = t12, t12 = t12._next;\n      } else {\n        t22 = t12._next, t12._next = null;\n        t12 = t02 ? t02._next = t22 : taskHead = t22;\n      }\n    }\n    taskTail = t02;\n    sleep(time2);\n  }\n  function sleep(time2) {\n    if (frame) return;\n    if (timeout) timeout = clearTimeout(timeout);\n    var delay = time2 - clockNow;\n    if (delay > 24) {\n      if (time2 < Infinity) timeout = setTimeout(wake, time2 - clock.now() - clockSkew);\n      if (interval$1) interval$1 = clearInterval(interval$1);\n    } else {\n      if (!interval$1) clockLast = clock.now(), interval$1 = setInterval(poke, pokeDelay);\n      frame = 1, setFrame(wake);\n    }\n  }\n  function interval(callback, delay, time2) {\n    var t = new Timer$1(), total = delay;\n    if (delay == null) return t.restart(callback, delay, time2), t;\n    t._restart = t.restart;\n    t.restart = function(callback2, delay2, time3) {\n      delay2 = +delay2, time3 = time3 == null ? now() : +time3;\n      t._restart(function tick(elapsed) {\n        elapsed += total;\n        t._restart(tick, total += delay2, time3);\n        callback2(elapsed);\n      }, delay2, time3);\n    };\n    t.restart(callback, delay, time2);\n    return t;\n  }\n  const a$1 = 1664525;\n  const c$1 = 1013904223;\n  const m$1 = 4294967296;\n  function lcg$1() {\n    let s = 1;\n    return () => (s = (a$1 * s + c$1) % m$1) / m$1;\n  }\n  function x(d) {\n    return d.x;\n  }\n  function y(d) {\n    return d.y;\n  }\n  var initialRadius = 10, initialAngle = Math.PI * (3 - Math.sqrt(5));\n  function forceSimulation(nodes) {\n    var simulation2, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer$1(step), event2 = dispatch(\"tick\", \"end\"), random2 = lcg$1();\n    if (nodes == null) nodes = [];\n    function step() {\n      tick();\n      event2.call(\"tick\", simulation2);\n      if (alpha < alphaMin) {\n        stepper.stop();\n        event2.call(\"end\", simulation2);\n      }\n    }\n    function tick(iterations2) {\n      var i, n = nodes.length, node;\n      if (iterations2 === void 0) iterations2 = 1;\n      for (var k = 0; k < iterations2; ++k) {\n        alpha += (alphaTarget - alpha) * alphaDecay;\n        forces.forEach(function(force2) {\n          force2(alpha);\n        });\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          if (node.fx == null) node.x += node.vx *= velocityDecay;\n          else node.x = node.fx, node.vx = 0;\n          if (node.fy == null) node.y += node.vy *= velocityDecay;\n          else node.y = node.fy, node.vy = 0;\n        }\n      }\n      return simulation2;\n    }\n    function initializeNodes() {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.index = i;\n        if (node.fx != null) node.x = node.fx;\n        if (node.fy != null) node.y = node.fy;\n        if (isNaN(node.x) || isNaN(node.y)) {\n          var radius2 = initialRadius * Math.sqrt(0.5 + i), angle2 = i * initialAngle;\n          node.x = radius2 * Math.cos(angle2);\n          node.y = radius2 * Math.sin(angle2);\n        }\n        if (isNaN(node.vx) || isNaN(node.vy)) {\n          node.vx = node.vy = 0;\n        }\n      }\n    }\n    function initializeForce(force2) {\n      if (force2.initialize) force2.initialize(nodes, random2);\n      return force2;\n    }\n    initializeNodes();\n    return simulation2 = {\n      tick,\n      restart: function() {\n        return stepper.restart(step), simulation2;\n      },\n      stop: function() {\n        return stepper.stop(), simulation2;\n      },\n      nodes: function(_) {\n        return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation2) : nodes;\n      },\n      alpha: function(_) {\n        return arguments.length ? (alpha = +_, simulation2) : alpha;\n      },\n      alphaMin: function(_) {\n        return arguments.length ? (alphaMin = +_, simulation2) : alphaMin;\n      },\n      alphaDecay: function(_) {\n        return arguments.length ? (alphaDecay = +_, simulation2) : +alphaDecay;\n      },\n      alphaTarget: function(_) {\n        return arguments.length ? (alphaTarget = +_, simulation2) : alphaTarget;\n      },\n      velocityDecay: function(_) {\n        return arguments.length ? (velocityDecay = 1 - _, simulation2) : 1 - velocityDecay;\n      },\n      randomSource: function(_) {\n        return arguments.length ? (random2 = _, forces.forEach(initializeForce), simulation2) : random2;\n      },\n      force: function(name, _) {\n        return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation2) : forces.get(name);\n      },\n      find: function(x2, y2, radius2) {\n        var i = 0, n = nodes.length, dx, dy, d2, node, closest;\n        if (radius2 == null) radius2 = Infinity;\n        else radius2 *= radius2;\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          dx = x2 - node.x;\n          dy = y2 - node.y;\n          d2 = dx * dx + dy * dy;\n          if (d2 < radius2) closest = node, radius2 = d2;\n        }\n        return closest;\n      },\n      on: function(name, _) {\n        return arguments.length > 1 ? (event2.on(name, _), simulation2) : event2.on(name);\n      }\n    };\n  }\n  function forceManyBody() {\n    var nodes, node, random2, alpha, strength = constant$1(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81;\n    function force2(_) {\n      var i, n = nodes.length, tree2 = quadtree(nodes, x, y).visitAfter(accumulate);\n      for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree2.visit(apply2);\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, node2;\n      strengths = new Array(n);\n      for (i = 0; i < n; ++i) node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes);\n    }\n    function accumulate(quad2) {\n      var strength2 = 0, q, c2, weight = 0, x2, y2, i;\n      if (quad2.length) {\n        for (x2 = y2 = i = 0; i < 4; ++i) {\n          if ((q = quad2[i]) && (c2 = Math.abs(q.value))) {\n            strength2 += q.value, weight += c2, x2 += c2 * q.x, y2 += c2 * q.y;\n          }\n        }\n        quad2.x = x2 / weight;\n        quad2.y = y2 / weight;\n      } else {\n        q = quad2;\n        q.x = q.data.x;\n        q.y = q.data.y;\n        do\n          strength2 += strengths[q.data.index];\n        while (q = q.next);\n      }\n      quad2.value = strength2;\n    }\n    function apply2(quad2, x12, _, x2) {\n      if (!quad2.value) return true;\n      var x3 = quad2.x - node.x, y2 = quad2.y - node.y, w2 = x2 - x12, l = x3 * x3 + y2 * y2;\n      if (w2 * w2 / theta2 < l) {\n        if (l < distanceMax2) {\n          if (x3 === 0) x3 = jiggle(random2), l += x3 * x3;\n          if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n          if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n          node.vx += x3 * quad2.value * alpha / l;\n          node.vy += y2 * quad2.value * alpha / l;\n        }\n        return true;\n      } else if (quad2.length || l >= distanceMax2) return;\n      if (quad2.data !== node || quad2.next) {\n        if (x3 === 0) x3 = jiggle(random2), l += x3 * x3;\n        if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n        if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n      }\n      do\n        if (quad2.data !== node) {\n          w2 = strengths[quad2.data.index] * alpha / l;\n          node.vx += x3 * w2;\n          node.vy += y2 * w2;\n        }\n      while (quad2 = quad2.next);\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.distanceMin = function(_) {\n      return arguments.length ? (distanceMin2 = _ * _, force2) : Math.sqrt(distanceMin2);\n    };\n    force2.distanceMax = function(_) {\n      return arguments.length ? (distanceMax2 = _ * _, force2) : Math.sqrt(distanceMax2);\n    };\n    force2.theta = function(_) {\n      return arguments.length ? (theta2 = _ * _, force2) : Math.sqrt(theta2);\n    };\n    return force2;\n  }\n  function forceX(x2) {\n    var strength = constant$1(0.1), nodes, strengths, xz;\n    if (typeof x2 !== \"function\") x2 = constant$1(x2 == null ? 0 : +x2);\n    function force2(alpha) {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length;\n      strengths = new Array(n);\n      xz = new Array(n);\n      for (i = 0; i < n; ++i) {\n        strengths[i] = isNaN(xz[i] = +x2(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.x = function(_) {\n      return arguments.length ? (x2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : x2;\n    };\n    return force2;\n  }\n  function forceY(y2) {\n    var strength = constant$1(0.1), nodes, strengths, yz;\n    if (typeof y2 !== \"function\") y2 = constant$1(y2 == null ? 0 : +y2);\n    function force2(alpha) {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length;\n      strengths = new Array(n);\n      yz = new Array(n);\n      for (i = 0; i < n; ++i) {\n        strengths[i] = isNaN(yz[i] = +y2(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.y = function(_) {\n      return arguments.length ? (y2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : y2;\n    };\n    return force2;\n  }\n  const ForceMap = {\n    center: forceCenter,\n    collide: forceCollide,\n    nbody: forceManyBody,\n    link: forceLink,\n    x: forceX,\n    y: forceY\n  };\n  const Forces = \"forces\", ForceParams = [\"alpha\", \"alphaMin\", \"alphaTarget\", \"velocityDecay\", \"forces\"], ForceConfig = [\"static\", \"iterations\"], ForceOutput = [\"x\", \"y\", \"vx\", \"vy\"];\n  function Force(params2) {\n    Transform.call(this, null, params2);\n  }\n  Force.Definition = {\n    \"type\": \"Force\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"static\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"restart\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"iterations\",\n      \"type\": \"number\",\n      \"default\": 300\n    }, {\n      \"name\": \"alpha\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"alphaMin\",\n      \"type\": \"number\",\n      \"default\": 1e-3\n    }, {\n      \"name\": \"alphaTarget\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"velocityDecay\",\n      \"type\": \"number\",\n      \"default\": 0.4\n    }, {\n      \"name\": \"forces\",\n      \"type\": \"param\",\n      \"array\": true,\n      \"params\": [{\n        \"key\": {\n          \"force\": \"center\"\n        },\n        \"params\": [{\n          \"name\": \"x\",\n          \"type\": \"number\",\n          \"default\": 0\n        }, {\n          \"name\": \"y\",\n          \"type\": \"number\",\n          \"default\": 0\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"collide\"\n        },\n        \"params\": [{\n          \"name\": \"radius\",\n          \"type\": \"number\",\n          \"expr\": true\n        }, {\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.7\n        }, {\n          \"name\": \"iterations\",\n          \"type\": \"number\",\n          \"default\": 1\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"nbody\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": -30,\n          \"expr\": true\n        }, {\n          \"name\": \"theta\",\n          \"type\": \"number\",\n          \"default\": 0.9\n        }, {\n          \"name\": \"distanceMin\",\n          \"type\": \"number\",\n          \"default\": 1\n        }, {\n          \"name\": \"distanceMax\",\n          \"type\": \"number\"\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"link\"\n        },\n        \"params\": [{\n          \"name\": \"links\",\n          \"type\": \"data\"\n        }, {\n          \"name\": \"id\",\n          \"type\": \"field\"\n        }, {\n          \"name\": \"distance\",\n          \"type\": \"number\",\n          \"default\": 30,\n          \"expr\": true\n        }, {\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"expr\": true\n        }, {\n          \"name\": \"iterations\",\n          \"type\": \"number\",\n          \"default\": 1\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"x\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.1\n        }, {\n          \"name\": \"x\",\n          \"type\": \"field\"\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"y\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.1\n        }, {\n          \"name\": \"y\",\n          \"type\": \"field\"\n        }]\n      }]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"modify\": false,\n      \"default\": ForceOutput\n    }]\n  };\n  inherits(Force, Transform, {\n    transform(_, pulse2) {\n      var sim = this.value, change2 = pulse2.changed(pulse2.ADD_REM), params2 = _.modified(ForceParams), iters = _.iterations || 300;\n      if (!sim) {\n        this.value = sim = simulation(pulse2.source, _);\n        sim.on(\"tick\", rerun(pulse2.dataflow, this));\n        if (!_.static) {\n          change2 = true;\n          sim.tick();\n        }\n        pulse2.modifies(\"index\");\n      } else {\n        if (change2) {\n          pulse2.modifies(\"index\");\n          sim.nodes(pulse2.source);\n        }\n        if (params2 || pulse2.changed(pulse2.MOD)) {\n          setup(sim, _, 0, pulse2);\n        }\n      }\n      if (params2 || change2 || _.modified(ForceConfig) || pulse2.changed() && _.restart) {\n        sim.alpha(Math.max(sim.alpha(), _.alpha || 1)).alphaDecay(1 - Math.pow(sim.alphaMin(), 1 / iters));\n        if (_.static) {\n          for (sim.stop(); --iters >= 0; ) sim.tick();\n        } else {\n          if (sim.stopped()) sim.restart();\n          if (!change2) return pulse2.StopPropagation;\n        }\n      }\n      return this.finish(_, pulse2);\n    },\n    finish(_, pulse2) {\n      const dataflow = pulse2.dataflow;\n      for (let args = this._argops, j = 0, m2 = args.length, arg; j < m2; ++j) {\n        arg = args[j];\n        if (arg.name !== Forces || arg.op._argval.force !== \"link\") {\n          continue;\n        }\n        for (var ops2 = arg.op._argops, i = 0, n = ops2.length, op; i < n; ++i) {\n          if (ops2[i].name === \"links\" && (op = ops2[i].op.source)) {\n            dataflow.pulse(op, dataflow.changeset().reflow());\n            break;\n          }\n        }\n      }\n      return pulse2.reflow(_.modified()).modifies(ForceOutput);\n    }\n  });\n  function rerun(df, op) {\n    return () => df.touch(op).run();\n  }\n  function simulation(nodes, _) {\n    const sim = forceSimulation(nodes), stop2 = sim.stop, restart = sim.restart;\n    let stopped = false;\n    sim.stopped = () => stopped;\n    sim.restart = () => (stopped = false, restart());\n    sim.stop = () => (stopped = true, stop2());\n    return setup(sim, _, true).on(\"end\", () => stopped = true);\n  }\n  function setup(sim, _, init2, pulse2) {\n    var f = array$5(_.forces), i, n, p, name;\n    for (i = 0, n = ForceParams.length; i < n; ++i) {\n      p = ForceParams[i];\n      if (p !== Forces && _.modified(p)) sim[p](_[p]);\n    }\n    for (i = 0, n = f.length; i < n; ++i) {\n      name = Forces + i;\n      p = init2 || _.modified(Forces, i) ? getForce(f[i]) : pulse2 && modified(f[i], pulse2) ? sim.force(name) : null;\n      if (p) sim.force(name, p);\n    }\n    for (n = sim.numForces || 0; i < n; ++i) {\n      sim.force(Forces + i, null);\n    }\n    sim.numForces = f.length;\n    return sim;\n  }\n  function modified(f, pulse2) {\n    var k, v;\n    for (k in f) {\n      if (isFunction(v = f[k]) && pulse2.modified(accessorFields(v))) return 1;\n    }\n    return 0;\n  }\n  function getForce(_) {\n    var f, p;\n    if (!has$1(ForceMap, _.force)) {\n      error(\"Unrecognized force: \" + _.force);\n    }\n    f = ForceMap[_.force]();\n    for (p in _) {\n      if (isFunction(f[p])) setForceParam(f[p], _[p], _);\n    }\n    return f;\n  }\n  function setForceParam(f, v, _) {\n    f(isFunction(v) ? (d) => v(d, _) : v);\n  }\n  const force = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    force: Force\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function defaultSeparation$2(a2, b2) {\n    return a2.parent === b2.parent ? 1 : 2;\n  }\n  function meanX(children2) {\n    return children2.reduce(meanXReduce, 0) / children2.length;\n  }\n  function meanXReduce(x2, c2) {\n    return x2 + c2.x;\n  }\n  function maxY(children2) {\n    return 1 + children2.reduce(maxYReduce, 0);\n  }\n  function maxYReduce(y2, c2) {\n    return Math.max(y2, c2.y);\n  }\n  function leafLeft(node) {\n    var children2;\n    while (children2 = node.children) node = children2[0];\n    return node;\n  }\n  function leafRight(node) {\n    var children2;\n    while (children2 = node.children) node = children2[children2.length - 1];\n    return node;\n  }\n  function cluster() {\n    var separation = defaultSeparation$2, dx = 1, dy = 1, nodeSize = false;\n    function cluster2(root) {\n      var previousNode, x2 = 0;\n      root.eachAfter(function(node) {\n        var children2 = node.children;\n        if (children2) {\n          node.x = meanX(children2);\n          node.y = maxY(children2);\n        } else {\n          node.x = previousNode ? x2 += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = leafLeft(root), right = leafRight(root), x02 = left.x - separation(left, right) / 2, x12 = right.x + separation(right, left) / 2;\n      return root.eachAfter(nodeSize ? function(node) {\n        node.x = (node.x - root.x) * dx;\n        node.y = (root.y - node.y) * dy;\n      } : function(node) {\n        node.x = (node.x - x02) / (x12 - x02) * dx;\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n      });\n    }\n    cluster2.separation = function(x2) {\n      return arguments.length ? (separation = x2, cluster2) : separation;\n    };\n    cluster2.size = function(x2) {\n      return arguments.length ? (nodeSize = false, dx = +x2[0], dy = +x2[1], cluster2) : nodeSize ? null : [dx, dy];\n    };\n    cluster2.nodeSize = function(x2) {\n      return arguments.length ? (nodeSize = true, dx = +x2[0], dy = +x2[1], cluster2) : nodeSize ? [dx, dy] : null;\n    };\n    return cluster2;\n  }\n  function count(node) {\n    var sum2 = 0, children2 = node.children, i = children2 && children2.length;\n    if (!i) sum2 = 1;\n    else while (--i >= 0) sum2 += children2[i].value;\n    node.value = sum2;\n  }\n  function node_count() {\n    return this.eachAfter(count);\n  }\n  function node_each(callback, that) {\n    let index2 = -1;\n    for (const node of this) {\n      callback.call(that, node, ++index2, this);\n    }\n    return this;\n  }\n  function node_eachBefore(callback, that) {\n    var node = this, nodes = [node], children2, i, index2 = -1;\n    while (node = nodes.pop()) {\n      callback.call(that, node, ++index2, this);\n      if (children2 = node.children) {\n        for (i = children2.length - 1; i >= 0; --i) {\n          nodes.push(children2[i]);\n        }\n      }\n    }\n    return this;\n  }\n  function node_eachAfter(callback, that) {\n    var node = this, nodes = [node], next = [], children2, i, n, index2 = -1;\n    while (node = nodes.pop()) {\n      next.push(node);\n      if (children2 = node.children) {\n        for (i = 0, n = children2.length; i < n; ++i) {\n          nodes.push(children2[i]);\n        }\n      }\n    }\n    while (node = next.pop()) {\n      callback.call(that, node, ++index2, this);\n    }\n    return this;\n  }\n  function node_find(callback, that) {\n    let index2 = -1;\n    for (const node of this) {\n      if (callback.call(that, node, ++index2, this)) {\n        return node;\n      }\n    }\n  }\n  function node_sum(value2) {\n    return this.eachAfter(function(node) {\n      var sum2 = +value2(node.data) || 0, children2 = node.children, i = children2 && children2.length;\n      while (--i >= 0) sum2 += children2[i].value;\n      node.value = sum2;\n    });\n  }\n  function node_sort(compare2) {\n    return this.eachBefore(function(node) {\n      if (node.children) {\n        node.children.sort(compare2);\n      }\n    });\n  }\n  function node_path(end) {\n    var start = this, ancestor = leastCommonAncestor(start, end), nodes = [start];\n    while (start !== ancestor) {\n      start = start.parent;\n      nodes.push(start);\n    }\n    var k = nodes.length;\n    while (end !== ancestor) {\n      nodes.splice(k, 0, end);\n      end = end.parent;\n    }\n    return nodes;\n  }\n  function leastCommonAncestor(a2, b2) {\n    if (a2 === b2) return a2;\n    var aNodes = a2.ancestors(), bNodes = b2.ancestors(), c2 = null;\n    a2 = aNodes.pop();\n    b2 = bNodes.pop();\n    while (a2 === b2) {\n      c2 = a2;\n      a2 = aNodes.pop();\n      b2 = bNodes.pop();\n    }\n    return c2;\n  }\n  function node_ancestors() {\n    var node = this, nodes = [node];\n    while (node = node.parent) {\n      nodes.push(node);\n    }\n    return nodes;\n  }\n  function node_descendants() {\n    return Array.from(this);\n  }\n  function node_leaves() {\n    var leaves = [];\n    this.eachBefore(function(node) {\n      if (!node.children) {\n        leaves.push(node);\n      }\n    });\n    return leaves;\n  }\n  function node_links() {\n    var root = this, links = [];\n    root.each(function(node) {\n      if (node !== root) {\n        links.push({ source: node.parent, target: node });\n      }\n    });\n    return links;\n  }\n  function* node_iterator() {\n    var node = this, current, next = [node], children2, i, n;\n    do {\n      current = next.reverse(), next = [];\n      while (node = current.pop()) {\n        yield node;\n        if (children2 = node.children) {\n          for (i = 0, n = children2.length; i < n; ++i) {\n            next.push(children2[i]);\n          }\n        }\n      }\n    } while (next.length);\n  }\n  function hierarchy(data2, children2) {\n    if (data2 instanceof Map) {\n      data2 = [void 0, data2];\n      if (children2 === void 0) children2 = mapChildren;\n    } else if (children2 === void 0) {\n      children2 = objectChildren;\n    }\n    var root = new Node$2(data2), node, nodes = [root], child, childs, i, n;\n    while (node = nodes.pop()) {\n      if ((childs = children2(node.data)) && (n = (childs = Array.from(childs)).length)) {\n        node.children = childs;\n        for (i = n - 1; i >= 0; --i) {\n          nodes.push(child = childs[i] = new Node$2(childs[i]));\n          child.parent = node;\n          child.depth = node.depth + 1;\n        }\n      }\n    }\n    return root.eachBefore(computeHeight);\n  }\n  function node_copy() {\n    return hierarchy(this).eachBefore(copyData);\n  }\n  function objectChildren(d) {\n    return d.children;\n  }\n  function mapChildren(d) {\n    return Array.isArray(d) ? d[1] : null;\n  }\n  function copyData(node) {\n    if (node.data.value !== void 0) node.value = node.data.value;\n    node.data = node.data.data;\n  }\n  function computeHeight(node) {\n    var height2 = 0;\n    do\n      node.height = height2;\n    while ((node = node.parent) && node.height < ++height2);\n  }\n  function Node$2(data2) {\n    this.data = data2;\n    this.depth = this.height = 0;\n    this.parent = null;\n  }\n  Node$2.prototype = hierarchy.prototype = {\n    constructor: Node$2,\n    count: node_count,\n    each: node_each,\n    eachAfter: node_eachAfter,\n    eachBefore: node_eachBefore,\n    find: node_find,\n    sum: node_sum,\n    sort: node_sort,\n    path: node_path,\n    ancestors: node_ancestors,\n    descendants: node_descendants,\n    leaves: node_leaves,\n    links: node_links,\n    copy: node_copy,\n    [Symbol.iterator]: node_iterator\n  };\n  function optional(f) {\n    return f == null ? null : required(f);\n  }\n  function required(f) {\n    if (typeof f !== \"function\") throw new Error();\n    return f;\n  }\n  function constantZero() {\n    return 0;\n  }\n  function constant(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  const a = 1664525;\n  const c = 1013904223;\n  const m = 4294967296;\n  function lcg() {\n    let s = 1;\n    return () => (s = (a * s + c) % m) / m;\n  }\n  function array$2(x2) {\n    return typeof x2 === \"object\" && \"length\" in x2 ? x2 : Array.from(x2);\n  }\n  function shuffle(array2, random2) {\n    let m2 = array2.length, t, i;\n    while (m2) {\n      i = random2() * m2-- | 0;\n      t = array2[m2];\n      array2[m2] = array2[i];\n      array2[i] = t;\n    }\n    return array2;\n  }\n  function packEncloseRandom(circles, random2) {\n    var i = 0, n = (circles = shuffle(Array.from(circles), random2)).length, B2 = [], p, e;\n    while (i < n) {\n      p = circles[i];\n      if (e && enclosesWeak(e, p)) ++i;\n      else e = encloseBasis(B2 = extendBasis(B2, p)), i = 0;\n    }\n    return e;\n  }\n  function extendBasis(B2, p) {\n    var i, j;\n    if (enclosesWeakAll(p, B2)) return [p];\n    for (i = 0; i < B2.length; ++i) {\n      if (enclosesNot(p, B2[i]) && enclosesWeakAll(encloseBasis2(B2[i], p), B2)) {\n        return [B2[i], p];\n      }\n    }\n    for (i = 0; i < B2.length - 1; ++i) {\n      for (j = i + 1; j < B2.length; ++j) {\n        if (enclosesNot(encloseBasis2(B2[i], B2[j]), p) && enclosesNot(encloseBasis2(B2[i], p), B2[j]) && enclosesNot(encloseBasis2(B2[j], p), B2[i]) && enclosesWeakAll(encloseBasis3(B2[i], B2[j], p), B2)) {\n          return [B2[i], B2[j], p];\n        }\n      }\n    }\n    throw new Error();\n  }\n  function enclosesNot(a2, b2) {\n    var dr = a2.r - b2.r, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr < 0 || dr * dr < dx * dx + dy * dy;\n  }\n  function enclosesWeak(a2, b2) {\n    var dr = a2.r - b2.r + Math.max(a2.r, b2.r, 1) * 1e-9, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n  }\n  function enclosesWeakAll(a2, B2) {\n    for (var i = 0; i < B2.length; ++i) {\n      if (!enclosesWeak(a2, B2[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function encloseBasis(B2) {\n    switch (B2.length) {\n      case 1:\n        return encloseBasis1(B2[0]);\n      case 2:\n        return encloseBasis2(B2[0], B2[1]);\n      case 3:\n        return encloseBasis3(B2[0], B2[1], B2[2]);\n    }\n  }\n  function encloseBasis1(a2) {\n    return {\n      x: a2.x,\n      y: a2.y,\n      r: a2.r\n    };\n  }\n  function encloseBasis2(a2, b2) {\n    var x12 = a2.x, y12 = a2.y, r1 = a2.r, x2 = b2.x, y2 = b2.y, r2 = b2.r, x21 = x2 - x12, y21 = y2 - y12, r21 = r2 - r1, l = Math.sqrt(x21 * x21 + y21 * y21);\n    return {\n      x: (x12 + x2 + x21 / l * r21) / 2,\n      y: (y12 + y2 + y21 / l * r21) / 2,\n      r: (l + r1 + r2) / 2\n    };\n  }\n  function encloseBasis3(a2, b2, c2) {\n    var x12 = a2.x, y12 = a2.y, r1 = a2.r, x2 = b2.x, y2 = b2.y, r2 = b2.r, x3 = c2.x, y3 = c2.y, r3 = c2.r, a22 = x12 - x2, a3 = x12 - x3, b22 = y12 - y2, b3 = y12 - y3, c22 = r2 - r1, c3 = r3 - r1, d1 = x12 * x12 + y12 * y12 - r1 * r1, d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, ab = a3 * b22 - a22 * b3, xa = (b22 * d3 - b3 * d2) / (ab * 2) - x12, xb = (b3 * c22 - b22 * c3) / ab, ya = (a3 * d2 - a22 * d3) / (ab * 2) - y12, yb = (a22 * c3 - a3 * c22) / ab, A5 = xb * xb + yb * yb - 1, B2 = 2 * (r1 + xa * xb + ya * yb), C3 = xa * xa + ya * ya - r1 * r1, r = -(Math.abs(A5) > 1e-6 ? (B2 + Math.sqrt(B2 * B2 - 4 * A5 * C3)) / (2 * A5) : C3 / B2);\n    return {\n      x: x12 + xa + xb * r,\n      y: y12 + ya + yb * r,\n      r\n    };\n  }\n  function place(b2, a2, c2) {\n    var dx = b2.x - a2.x, x2, a22, dy = b2.y - a2.y, y2, b22, d2 = dx * dx + dy * dy;\n    if (d2) {\n      a22 = a2.r + c2.r, a22 *= a22;\n      b22 = b2.r + c2.r, b22 *= b22;\n      if (a22 > b22) {\n        x2 = (d2 + b22 - a22) / (2 * d2);\n        y2 = Math.sqrt(Math.max(0, b22 / d2 - x2 * x2));\n        c2.x = b2.x - x2 * dx - y2 * dy;\n        c2.y = b2.y - x2 * dy + y2 * dx;\n      } else {\n        x2 = (d2 + a22 - b22) / (2 * d2);\n        y2 = Math.sqrt(Math.max(0, a22 / d2 - x2 * x2));\n        c2.x = a2.x + x2 * dx - y2 * dy;\n        c2.y = a2.y + x2 * dy + y2 * dx;\n      }\n    } else {\n      c2.x = a2.x + c2.r;\n      c2.y = a2.y;\n    }\n  }\n  function intersects(a2, b2) {\n    var dr = a2.r + b2.r - 1e-6, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n  }\n  function score(node) {\n    var a2 = node._, b2 = node.next._, ab = a2.r + b2.r, dx = (a2.x * b2.r + b2.x * a2.r) / ab, dy = (a2.y * b2.r + b2.y * a2.r) / ab;\n    return dx * dx + dy * dy;\n  }\n  function Node$1(circle2) {\n    this._ = circle2;\n    this.next = null;\n    this.previous = null;\n  }\n  function packSiblingsRandom(circles, random2) {\n    if (!(n = (circles = array$2(circles)).length)) return 0;\n    var a2, b2, c2, n, aa, ca, i, j, k, sj, sk;\n    a2 = circles[0], a2.x = 0, a2.y = 0;\n    if (!(n > 1)) return a2.r;\n    b2 = circles[1], a2.x = -b2.r, b2.x = a2.r, b2.y = 0;\n    if (!(n > 2)) return a2.r + b2.r;\n    place(b2, a2, c2 = circles[2]);\n    a2 = new Node$1(a2), b2 = new Node$1(b2), c2 = new Node$1(c2);\n    a2.next = c2.previous = b2;\n    b2.next = a2.previous = c2;\n    c2.next = b2.previous = a2;\n    pack: for (i = 3; i < n; ++i) {\n      place(a2._, b2._, c2 = circles[i]), c2 = new Node$1(c2);\n      j = b2.next, k = a2.previous, sj = b2._.r, sk = a2._.r;\n      do {\n        if (sj <= sk) {\n          if (intersects(j._, c2._)) {\n            b2 = j, a2.next = b2, b2.previous = a2, --i;\n            continue pack;\n          }\n          sj += j._.r, j = j.next;\n        } else {\n          if (intersects(k._, c2._)) {\n            a2 = k, a2.next = b2, b2.previous = a2, --i;\n            continue pack;\n          }\n          sk += k._.r, k = k.previous;\n        }\n      } while (j !== k.next);\n      c2.previous = a2, c2.next = b2, a2.next = b2.previous = b2 = c2;\n      aa = score(a2);\n      while ((c2 = c2.next) !== b2) {\n        if ((ca = score(c2)) < aa) {\n          a2 = c2, aa = ca;\n        }\n      }\n      b2 = a2.next;\n    }\n    a2 = [b2._], c2 = b2;\n    while ((c2 = c2.next) !== b2) a2.push(c2._);\n    c2 = packEncloseRandom(a2, random2);\n    for (i = 0; i < n; ++i) a2 = circles[i], a2.x -= c2.x, a2.y -= c2.y;\n    return c2.r;\n  }\n  function defaultRadius(d) {\n    return Math.sqrt(d.value);\n  }\n  function pack() {\n    var radius2 = null, dx = 1, dy = 1, padding2 = constantZero;\n    function pack2(root) {\n      const random2 = lcg();\n      root.x = dx / 2, root.y = dy / 2;\n      if (radius2) {\n        root.eachBefore(radiusLeaf(radius2)).eachAfter(packChildrenRandom(padding2, 0.5, random2)).eachBefore(translateChild(1));\n      } else {\n        root.eachBefore(radiusLeaf(defaultRadius)).eachAfter(packChildrenRandom(constantZero, 1, random2)).eachAfter(packChildrenRandom(padding2, root.r / Math.min(dx, dy), random2)).eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n      }\n      return root;\n    }\n    pack2.radius = function(x2) {\n      return arguments.length ? (radius2 = optional(x2), pack2) : radius2;\n    };\n    pack2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], pack2) : [dx, dy];\n    };\n    pack2.padding = function(x2) {\n      return arguments.length ? (padding2 = typeof x2 === \"function\" ? x2 : constant(+x2), pack2) : padding2;\n    };\n    return pack2;\n  }\n  function radiusLeaf(radius2) {\n    return function(node) {\n      if (!node.children) {\n        node.r = Math.max(0, +radius2(node) || 0);\n      }\n    };\n  }\n  function packChildrenRandom(padding2, k, random2) {\n    return function(node) {\n      if (children2 = node.children) {\n        var children2, i, n = children2.length, r = padding2(node) * k || 0, e;\n        if (r) for (i = 0; i < n; ++i) children2[i].r += r;\n        e = packSiblingsRandom(children2, random2);\n        if (r) for (i = 0; i < n; ++i) children2[i].r -= r;\n        node.r = e + r;\n      }\n    };\n  }\n  function translateChild(k) {\n    return function(node) {\n      var parent = node.parent;\n      node.r *= k;\n      if (parent) {\n        node.x = parent.x + k * node.x;\n        node.y = parent.y + k * node.y;\n      }\n    };\n  }\n  function roundNode(node) {\n    node.x0 = Math.round(node.x0);\n    node.y0 = Math.round(node.y0);\n    node.x1 = Math.round(node.x1);\n    node.y1 = Math.round(node.y1);\n  }\n  function treemapDice(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (x12 - x02) / parent.value;\n    while (++i < n) {\n      node = nodes[i], node.y0 = y02, node.y1 = y12;\n      node.x0 = x02, node.x1 = x02 += node.value * k;\n    }\n  }\n  function partition$1() {\n    var dx = 1, dy = 1, padding2 = 0, round = false;\n    function partition2(root) {\n      var n = root.height + 1;\n      root.x0 = root.y0 = padding2;\n      root.x1 = dx;\n      root.y1 = dy / n;\n      root.eachBefore(positionNode(dy, n));\n      if (round) root.eachBefore(roundNode);\n      return root;\n    }\n    function positionNode(dy2, n) {\n      return function(node) {\n        if (node.children) {\n          treemapDice(node, node.x0, dy2 * (node.depth + 1) / n, node.x1, dy2 * (node.depth + 2) / n);\n        }\n        var x02 = node.x0, y02 = node.y0, x12 = node.x1 - padding2, y12 = node.y1 - padding2;\n        if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n        if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n        node.x0 = x02;\n        node.y0 = y02;\n        node.x1 = x12;\n        node.y1 = y12;\n      };\n    }\n    partition2.round = function(x2) {\n      return arguments.length ? (round = !!x2, partition2) : round;\n    };\n    partition2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], partition2) : [dx, dy];\n    };\n    partition2.padding = function(x2) {\n      return arguments.length ? (padding2 = +x2, partition2) : padding2;\n    };\n    return partition2;\n  }\n  var preroot = { depth: -1 }, ambiguous = {}, imputed = {};\n  function defaultId(d) {\n    return d.id;\n  }\n  function defaultParentId(d) {\n    return d.parentId;\n  }\n  function stratify() {\n    var id2 = defaultId, parentId = defaultParentId, path2;\n    function stratify2(data2) {\n      var nodes = Array.from(data2), currentId = id2, currentParentId = parentId, n, d, i, root, parent, node, nodeId, nodeKey, nodeByKey = /* @__PURE__ */ new Map();\n      if (path2 != null) {\n        const I = nodes.map((d2, i2) => normalize$3(path2(d2, i2, data2)));\n        const P = I.map(parentof);\n        const S = new Set(I).add(\"\");\n        for (const i2 of P) {\n          if (!S.has(i2)) {\n            S.add(i2);\n            I.push(i2);\n            P.push(parentof(i2));\n            nodes.push(imputed);\n          }\n        }\n        currentId = (_, i2) => I[i2];\n        currentParentId = (_, i2) => P[i2];\n      }\n      for (i = 0, n = nodes.length; i < n; ++i) {\n        d = nodes[i], node = nodes[i] = new Node$2(d);\n        if ((nodeId = currentId(d, i, data2)) != null && (nodeId += \"\")) {\n          nodeKey = node.id = nodeId;\n          nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node);\n        }\n        if ((nodeId = currentParentId(d, i, data2)) != null && (nodeId += \"\")) {\n          node.parent = nodeId;\n        }\n      }\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        if (nodeId = node.parent) {\n          parent = nodeByKey.get(nodeId);\n          if (!parent) throw new Error(\"missing: \" + nodeId);\n          if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n          if (parent.children) parent.children.push(node);\n          else parent.children = [node];\n          node.parent = parent;\n        } else {\n          if (root) throw new Error(\"multiple roots\");\n          root = node;\n        }\n      }\n      if (!root) throw new Error(\"no root\");\n      if (path2 != null) {\n        while (root.data === imputed && root.children.length === 1) {\n          root = root.children[0], --n;\n        }\n        for (let i2 = nodes.length - 1; i2 >= 0; --i2) {\n          node = nodes[i2];\n          if (node.data !== imputed) break;\n          node.data = null;\n        }\n      }\n      root.parent = preroot;\n      root.eachBefore(function(node2) {\n        node2.depth = node2.parent.depth + 1;\n        --n;\n      }).eachBefore(computeHeight);\n      root.parent = null;\n      if (n > 0) throw new Error(\"cycle\");\n      return root;\n    }\n    stratify2.id = function(x2) {\n      return arguments.length ? (id2 = optional(x2), stratify2) : id2;\n    };\n    stratify2.parentId = function(x2) {\n      return arguments.length ? (parentId = optional(x2), stratify2) : parentId;\n    };\n    stratify2.path = function(x2) {\n      return arguments.length ? (path2 = optional(x2), stratify2) : path2;\n    };\n    return stratify2;\n  }\n  function normalize$3(path2) {\n    path2 = `${path2}`;\n    let i = path2.length;\n    if (slash(path2, i - 1) && !slash(path2, i - 2)) path2 = path2.slice(0, -1);\n    return path2[0] === \"/\" ? path2 : `/${path2}`;\n  }\n  function parentof(path2) {\n    let i = path2.length;\n    if (i < 2) return \"\";\n    while (--i > 1) if (slash(path2, i)) break;\n    return path2.slice(0, i);\n  }\n  function slash(path2, i) {\n    if (path2[i] === \"/\") {\n      let k = 0;\n      while (i > 0 && path2[--i] === \"\\\\\") ++k;\n      if ((k & 1) === 0) return true;\n    }\n    return false;\n  }\n  function defaultSeparation$1(a2, b2) {\n    return a2.parent === b2.parent ? 1 : 2;\n  }\n  function nextLeft(v) {\n    var children2 = v.children;\n    return children2 ? children2[0] : v.t;\n  }\n  function nextRight(v) {\n    var children2 = v.children;\n    return children2 ? children2[children2.length - 1] : v.t;\n  }\n  function moveSubtree(wm, wp, shift) {\n    var change2 = shift / (wp.i - wm.i);\n    wp.c -= change2;\n    wp.s += shift;\n    wm.c += change2;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function executeShifts(v) {\n    var shift = 0, change2 = 0, children2 = v.children, i = children2.length, w2;\n    while (--i >= 0) {\n      w2 = children2[i];\n      w2.z += shift;\n      w2.m += shift;\n      shift += w2.s + (change2 += w2.c);\n    }\n  }\n  function nextAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  function TreeNode(node, i) {\n    this._ = node;\n    this.parent = null;\n    this.children = null;\n    this.A = null;\n    this.a = this;\n    this.z = 0;\n    this.m = 0;\n    this.c = 0;\n    this.s = 0;\n    this.t = null;\n    this.i = i;\n  }\n  TreeNode.prototype = Object.create(Node$2.prototype);\n  function treeRoot(root) {\n    var tree2 = new TreeNode(root, 0), node, nodes = [tree2], child, children2, i, n;\n    while (node = nodes.pop()) {\n      if (children2 = node._.children) {\n        node.children = new Array(n = children2.length);\n        for (i = n - 1; i >= 0; --i) {\n          nodes.push(child = node.children[i] = new TreeNode(children2[i], i));\n          child.parent = node;\n        }\n      }\n    }\n    (tree2.parent = new TreeNode(null, 0)).children = [tree2];\n    return tree2;\n  }\n  function tree$1() {\n    var separation = defaultSeparation$1, dx = 1, dy = 1, nodeSize = null;\n    function tree2(root) {\n      var t = treeRoot(root);\n      t.eachAfter(firstWalk), t.parent.m = -t.z;\n      t.eachBefore(secondWalk);\n      if (nodeSize) root.eachBefore(sizeNode);\n      else {\n        var left = root, right = root, bottom = root;\n        root.eachBefore(function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var s = left === right ? 1 : separation(left, right) / 2, tx2 = s - left.x, kx = dx / (right.x + s + tx2), ky = dy / (bottom.depth || 1);\n        root.eachBefore(function(node) {\n          node.x = (node.x + tx2) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return root;\n    }\n    function firstWalk(v) {\n      var children2 = v.children, siblings = v.parent.children, w2 = v.i ? siblings[v.i - 1] : null;\n      if (children2) {\n        executeShifts(v);\n        var midpoint = (children2[0].z + children2[children2.length - 1].z) / 2;\n        if (w2) {\n          v.z = w2.z + separation(v._, w2._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w2) {\n        v.z = w2.z + separation(v._, w2._);\n      }\n      v.parent.A = apportion(v, w2, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w2, ancestor) {\n      if (w2) {\n        var vip = v, vop = v, vim = w2, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n          vom = nextLeft(vom);\n          vop = nextRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !nextRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !nextLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= dx;\n      node.y = node.depth * dy;\n    }\n    tree2.separation = function(x2) {\n      return arguments.length ? (separation = x2, tree2) : separation;\n    };\n    tree2.size = function(x2) {\n      return arguments.length ? (nodeSize = false, dx = +x2[0], dy = +x2[1], tree2) : nodeSize ? null : [dx, dy];\n    };\n    tree2.nodeSize = function(x2) {\n      return arguments.length ? (nodeSize = true, dx = +x2[0], dy = +x2[1], tree2) : nodeSize ? [dx, dy] : null;\n    };\n    return tree2;\n  }\n  function treemapSlice(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (y12 - y02) / parent.value;\n    while (++i < n) {\n      node = nodes[i], node.x0 = x02, node.x1 = x12;\n      node.y0 = y02, node.y1 = y02 += node.value * k;\n    }\n  }\n  var phi = (1 + Math.sqrt(5)) / 2;\n  function squarifyRatio(ratio, parent, x02, y02, x12, y12) {\n    var rows = [], nodes = parent.children, row, nodeValue, i0 = 0, i1 = 0, n = nodes.length, dx, dy, value2 = parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta;\n    while (i0 < n) {\n      dx = x12 - x02, dy = y12 - y02;\n      do\n        sumValue = nodes[i1++].value;\n      while (!sumValue && i1 < n);\n      minValue = maxValue = sumValue;\n      alpha = Math.max(dy / dx, dx / dy) / (value2 * ratio);\n      beta = sumValue * sumValue * alpha;\n      minRatio = Math.max(maxValue / beta, beta / minValue);\n      for (; i1 < n; ++i1) {\n        sumValue += nodeValue = nodes[i1].value;\n        if (nodeValue < minValue) minValue = nodeValue;\n        if (nodeValue > maxValue) maxValue = nodeValue;\n        beta = sumValue * sumValue * alpha;\n        newRatio = Math.max(maxValue / beta, beta / minValue);\n        if (newRatio > minRatio) {\n          sumValue -= nodeValue;\n          break;\n        }\n        minRatio = newRatio;\n      }\n      rows.push(row = { value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1) });\n      if (row.dice) treemapDice(row, x02, y02, x12, value2 ? y02 += dy * sumValue / value2 : y12);\n      else treemapSlice(row, x02, y02, value2 ? x02 += dx * sumValue / value2 : x12, y12);\n      value2 -= sumValue, i0 = i1;\n    }\n    return rows;\n  }\n  const treemapSquarify = (function custom2(ratio) {\n    function squarify(parent, x02, y02, x12, y12) {\n      squarifyRatio(ratio, parent, x02, y02, x12, y12);\n    }\n    squarify.ratio = function(x2) {\n      return custom2((x2 = +x2) > 1 ? x2 : 1);\n    };\n    return squarify;\n  })(phi);\n  function treemap$1() {\n    var tile = treemapSquarify, round = false, dx = 1, dy = 1, paddingStack = [0], paddingInner = constantZero, paddingTop = constantZero, paddingRight = constantZero, paddingBottom = constantZero, paddingLeft = constantZero;\n    function treemap2(root) {\n      root.x0 = root.y0 = 0;\n      root.x1 = dx;\n      root.y1 = dy;\n      root.eachBefore(positionNode);\n      paddingStack = [0];\n      if (round) root.eachBefore(roundNode);\n      return root;\n    }\n    function positionNode(node) {\n      var p = paddingStack[node.depth], x02 = node.x0 + p, y02 = node.y0 + p, x12 = node.x1 - p, y12 = node.y1 - p;\n      if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n      if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n      node.x0 = x02;\n      node.y0 = y02;\n      node.x1 = x12;\n      node.y1 = y12;\n      if (node.children) {\n        p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n        x02 += paddingLeft(node) - p;\n        y02 += paddingTop(node) - p;\n        x12 -= paddingRight(node) - p;\n        y12 -= paddingBottom(node) - p;\n        if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n        if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n        tile(node, x02, y02, x12, y12);\n      }\n    }\n    treemap2.round = function(x2) {\n      return arguments.length ? (round = !!x2, treemap2) : round;\n    };\n    treemap2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], treemap2) : [dx, dy];\n    };\n    treemap2.tile = function(x2) {\n      return arguments.length ? (tile = required(x2), treemap2) : tile;\n    };\n    treemap2.padding = function(x2) {\n      return arguments.length ? treemap2.paddingInner(x2).paddingOuter(x2) : treemap2.paddingInner();\n    };\n    treemap2.paddingInner = function(x2) {\n      return arguments.length ? (paddingInner = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingInner;\n    };\n    treemap2.paddingOuter = function(x2) {\n      return arguments.length ? treemap2.paddingTop(x2).paddingRight(x2).paddingBottom(x2).paddingLeft(x2) : treemap2.paddingTop();\n    };\n    treemap2.paddingTop = function(x2) {\n      return arguments.length ? (paddingTop = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingTop;\n    };\n    treemap2.paddingRight = function(x2) {\n      return arguments.length ? (paddingRight = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingRight;\n    };\n    treemap2.paddingBottom = function(x2) {\n      return arguments.length ? (paddingBottom = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingBottom;\n    };\n    treemap2.paddingLeft = function(x2) {\n      return arguments.length ? (paddingLeft = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingLeft;\n    };\n    return treemap2;\n  }\n  function treemapBinary(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, i, n = nodes.length, sum2, sums = new Array(n + 1);\n    for (sums[0] = sum2 = i = 0; i < n; ++i) {\n      sums[i + 1] = sum2 += nodes[i].value;\n    }\n    partition2(0, n, parent.value, x02, y02, x12, y12);\n    function partition2(i2, j, value2, x03, y03, x13, y13) {\n      if (i2 >= j - 1) {\n        var node = nodes[i2];\n        node.x0 = x03, node.y0 = y03;\n        node.x1 = x13, node.y1 = y13;\n        return;\n      }\n      var valueOffset = sums[i2], valueTarget = value2 / 2 + valueOffset, k = i2 + 1, hi = j - 1;\n      while (k < hi) {\n        var mid = k + hi >>> 1;\n        if (sums[mid] < valueTarget) k = mid + 1;\n        else hi = mid;\n      }\n      if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i2 + 1 < k) --k;\n      var valueLeft = sums[k] - valueOffset, valueRight = value2 - valueLeft;\n      if (x13 - x03 > y13 - y03) {\n        var xk = value2 ? (x03 * valueRight + x13 * valueLeft) / value2 : x13;\n        partition2(i2, k, valueLeft, x03, y03, xk, y13);\n        partition2(k, j, valueRight, xk, y03, x13, y13);\n      } else {\n        var yk = value2 ? (y03 * valueRight + y13 * valueLeft) / value2 : y13;\n        partition2(i2, k, valueLeft, x03, y03, x13, yk);\n        partition2(k, j, valueRight, x03, yk, x13, y13);\n      }\n    }\n  }\n  function treemapSliceDice(parent, x02, y02, x12, y12) {\n    (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x02, y02, x12, y12);\n  }\n  const treemapResquarify = (function custom2(ratio) {\n    function resquarify(parent, x02, y02, x12, y12) {\n      if ((rows = parent._squarify) && rows.ratio === ratio) {\n        var rows, row, nodes, i, j = -1, n, m2 = rows.length, value2 = parent.value;\n        while (++j < m2) {\n          row = rows[j], nodes = row.children;\n          for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n          if (row.dice) treemapDice(row, x02, y02, x12, value2 ? y02 += (y12 - y02) * row.value / value2 : y12);\n          else treemapSlice(row, x02, y02, value2 ? x02 += (x12 - x02) * row.value / value2 : x12, y12);\n          value2 -= row.value;\n        }\n      } else {\n        parent._squarify = rows = squarifyRatio(ratio, parent, x02, y02, x12, y12);\n        rows.ratio = ratio;\n      }\n    }\n    resquarify.ratio = function(x2) {\n      return custom2((x2 = +x2) > 1 ? x2 : 1);\n    };\n    return resquarify;\n  })(phi);\n  function lookup$2(tree2, key2, filter2) {\n    const map2 = {};\n    tree2.each((node) => {\n      const t = node.data;\n      if (filter2(t)) map2[key2(t)] = node;\n    });\n    tree2.lookup = map2;\n    return tree2;\n  }\n  function Nest(params2) {\n    Transform.call(this, null, params2);\n  }\n  Nest.Definition = {\n    \"type\": \"Nest\",\n    \"metadata\": {\n      \"treesource\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"keys\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"generate\",\n      \"type\": \"boolean\"\n    }]\n  };\n  const children$1 = (n) => n.values;\n  inherits(Nest, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source) {\n        error(\"Nest transform requires an upstream data source.\");\n      }\n      var gen = _.generate, mod = _.modified(), out = pulse2.clone(), tree2 = this.value;\n      if (!tree2 || mod || pulse2.changed()) {\n        if (tree2) {\n          tree2.each((node) => {\n            if (node.children && isTuple(node.data)) {\n              out.rem.push(node.data);\n            }\n          });\n        }\n        this.value = tree2 = hierarchy({\n          values: array$5(_.keys).reduce((n, k) => {\n            n.key(k);\n            return n;\n          }, nest()).entries(out.source)\n        }, children$1);\n        if (gen) {\n          tree2.each((node) => {\n            if (node.children) {\n              node = ingest$1(node.data);\n              out.add.push(node);\n              out.source.push(node);\n            }\n          });\n        }\n        lookup$2(tree2, tupleid, tupleid);\n      }\n      out.source.root = tree2;\n      return out;\n    }\n  });\n  function nest() {\n    const keys2 = [], nest2 = {\n      entries: (array2) => entries(apply2(array2, 0), 0),\n      key: (d) => (keys2.push(d), nest2)\n    };\n    function apply2(array2, depth) {\n      if (depth >= keys2.length) {\n        return array2;\n      }\n      const n = array2.length, key2 = keys2[depth++], valuesByKey = {}, result = {};\n      let i = -1, keyValue, value2, values2;\n      while (++i < n) {\n        keyValue = key2(value2 = array2[i]) + \"\";\n        if (values2 = valuesByKey[keyValue]) {\n          values2.push(value2);\n        } else {\n          valuesByKey[keyValue] = [value2];\n        }\n      }\n      for (keyValue in valuesByKey) {\n        result[keyValue] = apply2(valuesByKey[keyValue], depth);\n      }\n      return result;\n    }\n    function entries(map2, depth) {\n      if (++depth > keys2.length) return map2;\n      const array2 = [];\n      for (const key2 in map2) {\n        array2.push({\n          key: key2,\n          values: entries(map2[key2], depth)\n        });\n      }\n      return array2;\n    }\n    return nest2;\n  }\n  function HierarchyLayout(params2) {\n    Transform.call(this, null, params2);\n  }\n  const defaultSeparation = (a2, b2) => a2.parent === b2.parent ? 1 : 2;\n  inherits(HierarchyLayout, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source || !pulse2.source.root) {\n        error(this.constructor.name + \" transform requires a backing tree data source.\");\n      }\n      const layout = this.layout(_.method), fields = this.fields, root = pulse2.source.root, as = _.as || fields;\n      if (_.field) root.sum(_.field);\n      else root.count();\n      if (_.sort) root.sort(stableCompare(_.sort, (d) => d.data));\n      setParams(layout, this.params, _);\n      if (layout.separation) {\n        layout.separation(_.separation !== false ? defaultSeparation : one$2);\n      }\n      try {\n        this.value = layout(root);\n      } catch (err) {\n        error(err);\n      }\n      root.each((node) => setFields(node, fields, as));\n      return pulse2.reflow(_.modified()).modifies(as).modifies(\"leaf\");\n    }\n  });\n  function setParams(layout, params2, _) {\n    for (let p, i = 0, n = params2.length; i < n; ++i) {\n      p = params2[i];\n      if (p in _) layout[p](_[p]);\n    }\n  }\n  function setFields(node, fields, as) {\n    const t = node.data, n = fields.length - 1;\n    for (let i = 0; i < n; ++i) {\n      t[as[i]] = node[fields[i]];\n    }\n    t[as[n]] = node.children ? node.children.length : 0;\n  }\n  const Output$3 = [\"x\", \"y\", \"r\", \"depth\", \"children\"];\n  function Pack(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Pack.Definition = {\n    \"type\": \"Pack\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"radius\",\n      \"type\": \"field\",\n      \"default\": null\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$3.length,\n      \"default\": Output$3\n    }]\n  };\n  inherits(Pack, HierarchyLayout, {\n    layout: pack,\n    params: [\"radius\", \"size\", \"padding\"],\n    fields: Output$3\n  });\n  const Output$2 = [\"x0\", \"y0\", \"x1\", \"y1\", \"depth\", \"children\"];\n  function Partition(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Partition.Definition = {\n    \"type\": \"Partition\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"round\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$2.length,\n      \"default\": Output$2\n    }]\n  };\n  inherits(Partition, HierarchyLayout, {\n    layout: partition$1,\n    params: [\"size\", \"round\", \"padding\"],\n    fields: Output$2\n  });\n  function Stratify(params2) {\n    Transform.call(this, null, params2);\n  }\n  Stratify.Definition = {\n    \"type\": \"Stratify\",\n    \"metadata\": {\n      \"treesource\": true\n    },\n    \"params\": [{\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"parentKey\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  };\n  inherits(Stratify, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source) {\n        error(\"Stratify transform requires an upstream data source.\");\n      }\n      let tree2 = this.value;\n      const mod = _.modified(), out = pulse2.fork(pulse2.ALL).materialize(pulse2.SOURCE), run2 = !tree2 || mod || pulse2.changed(pulse2.ADD_REM) || pulse2.modified(_.key.fields) || pulse2.modified(_.parentKey.fields);\n      out.source = out.source.slice();\n      if (run2) {\n        tree2 = out.source.length ? lookup$2(stratify().id(_.key).parentId(_.parentKey)(out.source), _.key, truthy) : lookup$2(stratify()([{}]), _.key, _.key);\n      }\n      out.source.root = this.value = tree2;\n      return out;\n    }\n  });\n  const Layouts = {\n    tidy: tree$1,\n    cluster\n  };\n  const Output$1$1 = [\"x\", \"y\", \"depth\", \"children\"];\n  function Tree(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Tree.Definition = {\n    \"type\": \"Tree\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"tidy\",\n      \"values\": [\"tidy\", \"cluster\"]\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"nodeSize\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"separation\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$1$1.length,\n      \"default\": Output$1$1\n    }]\n  };\n  inherits(Tree, HierarchyLayout, {\n    /**\n     * Tree layout generator. Supports both 'tidy' and 'cluster' layouts.\n     */\n    layout(method2) {\n      const m2 = method2 || \"tidy\";\n      if (has$1(Layouts, m2)) return Layouts[m2]();\n      else error(\"Unrecognized Tree layout method: \" + m2);\n    },\n    params: [\"size\", \"nodeSize\"],\n    fields: Output$1$1\n  });\n  function TreeLinks(params2) {\n    Transform.call(this, [], params2);\n  }\n  TreeLinks.Definition = {\n    \"type\": \"TreeLinks\",\n    \"metadata\": {\n      \"tree\": true,\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": []\n  };\n  inherits(TreeLinks, Transform, {\n    transform(_, pulse2) {\n      const links = this.value, tree2 = pulse2.source && pulse2.source.root, out = pulse2.fork(pulse2.NO_SOURCE), lut = {};\n      if (!tree2) error(\"TreeLinks transform requires a tree data source.\");\n      if (pulse2.changed(pulse2.ADD_REM)) {\n        out.rem = links;\n        pulse2.visit(pulse2.SOURCE, (t) => lut[tupleid(t)] = 1);\n        tree2.each((node) => {\n          const t = node.data, p = node.parent && node.parent.data;\n          if (p && lut[tupleid(t)] && lut[tupleid(p)]) {\n            out.add.push(ingest$1({\n              source: p,\n              target: t\n            }));\n          }\n        });\n        this.value = out.add;\n      } else if (pulse2.changed(pulse2.MOD)) {\n        pulse2.visit(pulse2.MOD, (t) => lut[tupleid(t)] = 1);\n        links.forEach((link2) => {\n          if (lut[tupleid(link2.source)] || lut[tupleid(link2.target)]) {\n            out.mod.push(link2);\n          }\n        });\n      }\n      return out;\n    }\n  });\n  const Tiles = {\n    binary: treemapBinary,\n    dice: treemapDice,\n    slice: treemapSlice,\n    slicedice: treemapSliceDice,\n    squarify: treemapSquarify,\n    resquarify: treemapResquarify\n  };\n  const Output$4 = [\"x0\", \"y0\", \"x1\", \"y1\", \"depth\", \"children\"];\n  function Treemap$1(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Treemap$1.Definition = {\n    \"type\": \"Treemap\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"squarify\",\n      \"values\": [\"squarify\", \"resquarify\", \"binary\", \"dice\", \"slice\", \"slicedice\"]\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingInner\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingOuter\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingTop\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingRight\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingBottom\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingLeft\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"ratio\",\n      \"type\": \"number\",\n      \"default\": 1.618033988749895\n    }, {\n      \"name\": \"round\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$4.length,\n      \"default\": Output$4\n    }]\n  };\n  inherits(Treemap$1, HierarchyLayout, {\n    /**\n     * Treemap layout generator. Adds 'method' and 'ratio' parameters\n     * to configure the underlying tile method.\n     */\n    layout() {\n      const x2 = treemap$1();\n      x2.ratio = (_) => {\n        const t = x2.tile();\n        if (t.ratio) x2.tile(t.ratio(_));\n      };\n      x2.method = (_) => {\n        if (has$1(Tiles, _)) x2.tile(Tiles[_]);\n        else error(\"Unrecognized Treemap layout method: \" + _);\n      };\n      return x2;\n    },\n    params: [\"method\", \"ratio\", \"size\", \"round\", \"padding\", \"paddingInner\", \"paddingOuter\", \"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"],\n    fields: Output$4\n  });\n  const tree = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    nest: Nest,\n    pack: Pack,\n    partition: Partition,\n    stratify: Stratify,\n    tree: Tree,\n    treelinks: TreeLinks,\n    treemap: Treemap$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const ALPHA_MASK = 4278190080;\n  function baseBitmaps($2, data2) {\n    const bitmap = $2.bitmap();\n    (data2 || []).forEach((d) => bitmap.set($2(d.boundary[0]), $2(d.boundary[3])));\n    return [bitmap, void 0];\n  }\n  function markBitmaps($2, baseMark, avoidMarks, labelInside, isGroupArea) {\n    const width2 = $2.width, height2 = $2.height, border = labelInside || isGroupArea, context2 = domCanvas(width2, height2).getContext(\"2d\"), baseMarkContext = domCanvas(width2, height2).getContext(\"2d\"), strokeContext = border && domCanvas(width2, height2).getContext(\"2d\");\n    avoidMarks.forEach((items) => draw(context2, items, false));\n    draw(baseMarkContext, baseMark, false);\n    if (border) {\n      draw(strokeContext, baseMark, true);\n    }\n    const buffer = getBuffer(context2, width2, height2), baseMarkBuffer = getBuffer(baseMarkContext, width2, height2), strokeBuffer = border && getBuffer(strokeContext, width2, height2), layer1 = $2.bitmap(), layer2 = border && $2.bitmap();\n    let x2, y2, u2, v, index2, alpha, strokeAlpha, baseMarkAlpha;\n    for (y2 = 0; y2 < height2; ++y2) {\n      for (x2 = 0; x2 < width2; ++x2) {\n        index2 = y2 * width2 + x2;\n        alpha = buffer[index2] & ALPHA_MASK;\n        baseMarkAlpha = baseMarkBuffer[index2] & ALPHA_MASK;\n        strokeAlpha = border && strokeBuffer[index2] & ALPHA_MASK;\n        if (alpha || strokeAlpha || baseMarkAlpha) {\n          u2 = $2(x2);\n          v = $2(y2);\n          if (!isGroupArea && (alpha || baseMarkAlpha)) layer1.set(u2, v);\n          if (border && (alpha || strokeAlpha)) layer2.set(u2, v);\n        }\n      }\n    }\n    return [layer1, layer2];\n  }\n  function getBuffer(context2, width2, height2) {\n    return new Uint32Array(context2.getImageData(0, 0, width2, height2).data.buffer);\n  }\n  function draw(context2, items, interior) {\n    if (!items.length) return;\n    const type2 = items[0].mark.marktype;\n    if (type2 === \"group\") {\n      items.forEach((group2) => {\n        group2.items.forEach((mark) => draw(context2, mark.items, interior));\n      });\n    } else {\n      Marks[type2].draw(context2, {\n        items: interior ? items.map(prepare) : items\n      });\n    }\n  }\n  function prepare(source2) {\n    const item = rederive(source2, {});\n    if (item.stroke && item.strokeOpacity !== 0 || item.fill && item.fillOpacity !== 0) {\n      return {\n        ...item,\n        strokeOpacity: 1,\n        stroke: \"#000\",\n        fillOpacity: 0\n      };\n    }\n    return item;\n  }\n  const DIV = 5, MOD = 31, SIZE = 32, RIGHT0 = new Uint32Array(SIZE + 1), RIGHT1 = new Uint32Array(SIZE + 1);\n  RIGHT1[0] = 0;\n  RIGHT0[0] = ~RIGHT1[0];\n  for (let i = 1; i <= SIZE; ++i) {\n    RIGHT1[i] = RIGHT1[i - 1] << 1 | 1;\n    RIGHT0[i] = ~RIGHT1[i];\n  }\n  function Bitmap(w2, h2) {\n    const array2 = new Uint32Array(~~((w2 * h2 + SIZE) / SIZE));\n    function _set(index2, mask) {\n      array2[index2] |= mask;\n    }\n    function _clear(index2, mask) {\n      array2[index2] &= mask;\n    }\n    return {\n      array: array2,\n      get: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        return array2[index2 >>> DIV] & 1 << (index2 & MOD);\n      },\n      set: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        _set(index2 >>> DIV, 1 << (index2 & MOD));\n      },\n      clear: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        _clear(index2 >>> DIV, ~(1 << (index2 & MOD)));\n      },\n      getRange: (x2, y2, x22, y22) => {\n        let r = y22, start, end, indexStart, indexEnd;\n        for (; r >= y2; --r) {\n          start = r * w2 + x2;\n          end = r * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            if (array2[indexStart] & RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]) {\n              return true;\n            }\n          } else {\n            if (array2[indexStart] & RIGHT0[start & MOD]) return true;\n            if (array2[indexEnd] & RIGHT1[(end & MOD) + 1]) return true;\n            for (let i = indexStart + 1; i < indexEnd; ++i) {\n              if (array2[i]) return true;\n            }\n          }\n        }\n        return false;\n      },\n      setRange: (x2, y2, x22, y22) => {\n        let start, end, indexStart, indexEnd, i;\n        for (; y2 <= y22; ++y2) {\n          start = y2 * w2 + x2;\n          end = y2 * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            _set(indexStart, RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]);\n          } else {\n            _set(indexStart, RIGHT0[start & MOD]);\n            _set(indexEnd, RIGHT1[(end & MOD) + 1]);\n            for (i = indexStart + 1; i < indexEnd; ++i) _set(i, 4294967295);\n          }\n        }\n      },\n      clearRange: (x2, y2, x22, y22) => {\n        let start, end, indexStart, indexEnd, i;\n        for (; y2 <= y22; ++y2) {\n          start = y2 * w2 + x2;\n          end = y2 * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            _clear(indexStart, RIGHT1[start & MOD] | RIGHT0[(end & MOD) + 1]);\n          } else {\n            _clear(indexStart, RIGHT1[start & MOD]);\n            _clear(indexEnd, RIGHT0[(end & MOD) + 1]);\n            for (i = indexStart + 1; i < indexEnd; ++i) _clear(i, 0);\n          }\n        }\n      },\n      outOfBounds: (x2, y2, x22, y22) => x2 < 0 || y2 < 0 || y22 >= h2 || x22 >= w2\n    };\n  }\n  function scaler(width2, height2, padding2) {\n    const ratio = Math.max(1, Math.sqrt(width2 * height2 / 1e6)), w2 = ~~((width2 + 2 * padding2 + ratio) / ratio), h2 = ~~((height2 + 2 * padding2 + ratio) / ratio), scale2 = (_) => ~~((_ + padding2) / ratio);\n    scale2.invert = (_) => _ * ratio - padding2;\n    scale2.bitmap = () => Bitmap(w2, h2);\n    scale2.ratio = ratio;\n    scale2.padding = padding2;\n    scale2.width = width2;\n    scale2.height = height2;\n    return scale2;\n  }\n  function placeAreaLabelNaive($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height;\n    return function(d) {\n      const items = d.datum.datum.items[markIndex].items, n = items.length, textHeight = d.datum.fontSize, textWidth = textMetrics.width(d.datum, d.datum.text);\n      let maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, areaWidth;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        x3 = (x12 + x2) / 2;\n        y3 = (y12 + y2) / 2;\n        areaWidth = Math.abs(x2 - x12 + y2 - y12);\n        if (areaWidth >= maxAreaWidth) {\n          maxAreaWidth = areaWidth;\n          d.x = x3;\n          d.y = y3;\n        }\n      }\n      x3 = textWidth / 2;\n      y3 = textHeight / 2;\n      x12 = d.x - x3;\n      x2 = d.x + x3;\n      y12 = d.y - y3;\n      y2 = d.y + y3;\n      d.align = \"center\";\n      if (x12 < 0 && x2 <= width2) {\n        d.align = \"left\";\n      } else if (0 <= x12 && width2 < x2) {\n        d.align = \"right\";\n      }\n      d.baseline = \"middle\";\n      if (y12 < 0 && y2 <= height2) {\n        d.baseline = \"top\";\n      } else if (0 <= y12 && height2 < y2) {\n        d.baseline = \"bottom\";\n      }\n      return true;\n    };\n  }\n  function outOfBounds(x2, y2, textWidth, textHeight, width2, height2) {\n    let r = textWidth / 2;\n    return x2 - r < 0 || x2 + r > width2 || y2 - (r = textHeight / 2) < 0 || y2 + r > height2;\n  }\n  function collision($2, x2, y2, textHeight, textWidth, h2, bm0, bm1) {\n    const w2 = textWidth * h2 / (textHeight * 2), x12 = $2(x2 - w2), x22 = $2(x2 + w2), y12 = $2(y2 - (h2 = h2 / 2)), y22 = $2(y2 + h2);\n    return bm0.outOfBounds(x12, y12, x22, y22) || bm0.getRange(x12, y12, x22, y22) || bm1 && bm1.getRange(x12, y12, x22, y22);\n  }\n  function placeAreaLabelReducedSearch($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1];\n    function tryLabel(_x, _y, maxSize, textWidth, textHeight) {\n      const x2 = $2.invert(_x), y2 = $2.invert(_y);\n      let lo = maxSize, hi = height2, mid;\n      if (!outOfBounds(x2, y2, textWidth, textHeight, width2, height2) && !collision($2, x2, y2, textHeight, textWidth, lo, bm0, bm1) && !collision($2, x2, y2, textHeight, textWidth, textHeight, bm0, null)) {\n        while (hi - lo >= 1) {\n          mid = (lo + hi) / 2;\n          if (collision($2, x2, y2, textHeight, textWidth, mid, bm0, bm1)) {\n            hi = mid;\n          } else {\n            lo = mid;\n          }\n        }\n        if (lo > maxSize) {\n          return [x2, y2, lo, true];\n        }\n      }\n    }\n    return function(d) {\n      const items = d.datum.datum.items[markIndex].items, n = items.length, textHeight = d.datum.fontSize, textWidth = textMetrics.width(d.datum, d.datum.text);\n      let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, _x, _y, _x1, _xMid, _x2, _y1, _yMid, _y2, areaWidth, result, swapTmp;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        if (x12 > x2) {\n          swapTmp = x12;\n          x12 = x2;\n          x2 = swapTmp;\n        }\n        if (y12 > y2) {\n          swapTmp = y12;\n          y12 = y2;\n          y2 = swapTmp;\n        }\n        _x1 = $2(x12);\n        _x2 = $2(x2);\n        _xMid = ~~((_x1 + _x2) / 2);\n        _y1 = $2(y12);\n        _y2 = $2(y2);\n        _yMid = ~~((_y1 + _y2) / 2);\n        for (_x = _xMid; _x >= _x1; --_x) {\n          for (_y = _yMid; _y >= _y1; --_y) {\n            result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n            if (result) {\n              [d.x, d.y, maxSize, labelPlaced] = result;\n            }\n          }\n        }\n        for (_x = _xMid; _x <= _x2; ++_x) {\n          for (_y = _yMid; _y <= _y2; ++_y) {\n            result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n            if (result) {\n              [d.x, d.y, maxSize, labelPlaced] = result;\n            }\n          }\n        }\n        if (!labelPlaced && !avoidBaseMark) {\n          areaWidth = Math.abs(x2 - x12 + y2 - y12);\n          x3 = (x12 + x2) / 2;\n          y3 = (y12 + y2) / 2;\n          if (areaWidth >= maxAreaWidth && !outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            maxAreaWidth = areaWidth;\n            d.x = x3;\n            d.y = y3;\n            labelPlaced2 = true;\n          }\n        }\n      }\n      if (labelPlaced || labelPlaced2) {\n        x3 = textWidth / 2;\n        y3 = textHeight / 2;\n        bm0.setRange($2(d.x - x3), $2(d.y - y3), $2(d.x + x3), $2(d.y + y3));\n        d.align = \"center\";\n        d.baseline = \"middle\";\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n  const X_DIR = [-1, -1, 1, 1];\n  const Y_DIR = [-1, 1, -1, 1];\n  function placeAreaLabelFloodFill($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1], bm2 = $2.bitmap();\n    return function(d) {\n      const items = d.datum.datum.items[markIndex].items, n = items.length, textHeight = d.datum.fontSize, textWidth = textMetrics.width(d.datum, d.datum.text), stack = [];\n      let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, _x, _y, lo, hi, mid, areaWidth;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        stack.push([$2((x12 + x2) / 2), $2((y12 + y2) / 2)]);\n        while (stack.length) {\n          [_x, _y] = stack.pop();\n          if (bm0.get(_x, _y) || bm1.get(_x, _y) || bm2.get(_x, _y)) continue;\n          bm2.set(_x, _y);\n          for (let j = 0; j < 4; ++j) {\n            x3 = _x + X_DIR[j];\n            y3 = _y + Y_DIR[j];\n            if (!bm2.outOfBounds(x3, y3, x3, y3)) stack.push([x3, y3]);\n          }\n          x3 = $2.invert(_x);\n          y3 = $2.invert(_y);\n          lo = maxSize;\n          hi = height2;\n          if (!outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, lo, bm0, bm1) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            while (hi - lo >= 1) {\n              mid = (lo + hi) / 2;\n              if (collision($2, x3, y3, textHeight, textWidth, mid, bm0, bm1)) {\n                hi = mid;\n              } else {\n                lo = mid;\n              }\n            }\n            if (lo > maxSize) {\n              d.x = x3;\n              d.y = y3;\n              maxSize = lo;\n              labelPlaced = true;\n            }\n          }\n        }\n        if (!labelPlaced && !avoidBaseMark) {\n          areaWidth = Math.abs(x2 - x12 + y2 - y12);\n          x3 = (x12 + x2) / 2;\n          y3 = (y12 + y2) / 2;\n          if (areaWidth >= maxAreaWidth && !outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            maxAreaWidth = areaWidth;\n            d.x = x3;\n            d.y = y3;\n            labelPlaced2 = true;\n          }\n        }\n      }\n      if (labelPlaced || labelPlaced2) {\n        x3 = textWidth / 2;\n        y3 = textHeight / 2;\n        bm0.setRange($2(d.x - x3), $2(d.y - y3), $2(d.x + x3), $2(d.y + y3));\n        d.align = \"center\";\n        d.baseline = \"middle\";\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n  const Aligns = [\"right\", \"center\", \"left\"], Baselines = [\"bottom\", \"middle\", \"top\"];\n  function placeMarkLabel($2, bitmaps, anchors, offsets2) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1], n = offsets2.length;\n    return function(d) {\n      const boundary = d.boundary, textHeight = d.datum.fontSize;\n      if (boundary[2] < 0 || boundary[5] < 0 || boundary[0] > width2 || boundary[3] > height2) {\n        return false;\n      }\n      let textWidth = d.textWidth ?? 0, dx, dy, isInside, sizeFactor, insideFactor, x12, x2, y12, y2, xc, yc, _x1, _x2, _y1, _y2;\n      for (let i = 0; i < n; ++i) {\n        dx = (anchors[i] & 3) - 1;\n        dy = (anchors[i] >>> 2 & 3) - 1;\n        isInside = dx === 0 && dy === 0 || offsets2[i] < 0;\n        sizeFactor = dx && dy ? Math.SQRT1_2 : 1;\n        insideFactor = offsets2[i] < 0 ? -1 : 1;\n        x12 = boundary[1 + dx] + offsets2[i] * dx * sizeFactor;\n        yc = boundary[4 + dy] + insideFactor * textHeight * dy / 2 + offsets2[i] * dy * sizeFactor;\n        y12 = yc - textHeight / 2;\n        y2 = yc + textHeight / 2;\n        _x1 = $2(x12);\n        _y1 = $2(y12);\n        _y2 = $2(y2);\n        if (!textWidth) {\n          if (!test(_x1, _x1, _y1, _y2, bm0, bm1, x12, x12, y12, y2, boundary, isInside)) {\n            continue;\n          } else {\n            textWidth = textMetrics.width(d.datum, d.datum.text);\n          }\n        }\n        xc = x12 + insideFactor * textWidth * dx / 2;\n        x12 = xc - textWidth / 2;\n        x2 = xc + textWidth / 2;\n        _x1 = $2(x12);\n        _x2 = $2(x2);\n        if (test(_x1, _x2, _y1, _y2, bm0, bm1, x12, x2, y12, y2, boundary, isInside)) {\n          d.x = !dx ? xc : dx * insideFactor < 0 ? x2 : x12;\n          d.y = !dy ? yc : dy * insideFactor < 0 ? y2 : y12;\n          d.align = Aligns[dx * insideFactor + 1];\n          d.baseline = Baselines[dy * insideFactor + 1];\n          bm0.setRange(_x1, _y1, _x2, _y2);\n          return true;\n        }\n      }\n      return false;\n    };\n  }\n  function test(_x1, _x2, _y1, _y2, bm0, bm1, x12, x2, y12, y2, boundary, isInside) {\n    return !(bm0.outOfBounds(_x1, _y1, _x2, _y2) || (isInside && bm1 || bm0).getRange(_x1, _y1, _x2, _y2));\n  }\n  const TOP = 0, MIDDLE = 4, BOTTOM = 8, LEFT = 0, CENTER = 1, RIGHT = 2;\n  const anchorCode = {\n    \"top-left\": TOP + LEFT,\n    \"top\": TOP + CENTER,\n    \"top-right\": TOP + RIGHT,\n    \"left\": MIDDLE + LEFT,\n    \"middle\": MIDDLE + CENTER,\n    \"right\": MIDDLE + RIGHT,\n    \"bottom-left\": BOTTOM + LEFT,\n    \"bottom\": BOTTOM + CENTER,\n    \"bottom-right\": BOTTOM + RIGHT\n  };\n  const placeAreaLabel = {\n    \"naive\": placeAreaLabelNaive,\n    \"reduced-search\": placeAreaLabelReducedSearch,\n    \"floodfill\": placeAreaLabelFloodFill\n  };\n  function labelLayout(texts, size2, compare2, offset2, anchor, avoidMarks, avoidBaseMark, lineAnchor, markIndex, padding2, method2) {\n    if (!texts.length) return texts;\n    const positions = Math.max(offset2.length, anchor.length), offsets2 = getOffsets(offset2, positions), anchors = getAnchors(anchor, positions), marktype = markType(texts[0].datum), grouptype = marktype === \"group\" && texts[0].datum.items[markIndex].marktype, isGroupArea = grouptype === \"area\", boundary = markBoundary(marktype, grouptype, lineAnchor, markIndex), infPadding = padding2 === null || padding2 === Infinity, isNaiveGroupArea = isGroupArea && method2 === \"naive\";\n    let maxTextWidth = -1, maxTextHeight = -1;\n    const data2 = texts.map((d) => {\n      const textWidth = infPadding ? textMetrics.width(d, d.text) : void 0;\n      maxTextWidth = Math.max(maxTextWidth, textWidth);\n      maxTextHeight = Math.max(maxTextHeight, d.fontSize);\n      return {\n        datum: d,\n        opacity: 0,\n        x: void 0,\n        y: void 0,\n        align: void 0,\n        baseline: void 0,\n        boundary: boundary(d),\n        textWidth\n      };\n    });\n    padding2 = padding2 === null || padding2 === Infinity ? Math.max(maxTextWidth, maxTextHeight) + Math.max(...offset2) : padding2;\n    const $2 = scaler(size2[0], size2[1], padding2);\n    let bitmaps;\n    if (!isNaiveGroupArea) {\n      if (compare2) {\n        data2.sort((a2, b2) => compare2(a2.datum, b2.datum));\n      }\n      let labelInside = false;\n      for (let i = 0; i < anchors.length && !labelInside; ++i) {\n        labelInside = anchors[i] === 5 || offsets2[i] < 0;\n      }\n      const baseMark = (marktype && avoidBaseMark || isGroupArea) && texts.map((d) => d.datum);\n      bitmaps = avoidMarks.length || baseMark ? markBitmaps($2, baseMark || [], avoidMarks, labelInside, isGroupArea) : baseBitmaps($2, avoidBaseMark && data2);\n    }\n    const place2 = isGroupArea ? placeAreaLabel[method2]($2, bitmaps, avoidBaseMark, markIndex) : placeMarkLabel($2, bitmaps, anchors, offsets2);\n    data2.forEach((d) => d.opacity = +place2(d));\n    return data2;\n  }\n  function getOffsets(_, count2) {\n    const offsets2 = new Float64Array(count2), n = _.length;\n    for (let i = 0; i < n; ++i) offsets2[i] = _[i] || 0;\n    for (let i = n; i < count2; ++i) offsets2[i] = offsets2[n - 1];\n    return offsets2;\n  }\n  function getAnchors(_, count2) {\n    const anchors = new Int8Array(count2), n = _.length;\n    for (let i = 0; i < n; ++i) anchors[i] |= anchorCode[_[i]];\n    for (let i = n; i < count2; ++i) anchors[i] = anchors[n - 1];\n    return anchors;\n  }\n  function markType(item) {\n    return item && item.mark && item.mark.marktype;\n  }\n  function markBoundary(marktype, grouptype, lineAnchor, markIndex) {\n    const xy = (d) => [d.x, d.x, d.x, d.y, d.y, d.y];\n    if (!marktype) {\n      return xy;\n    } else if (marktype === \"line\" || marktype === \"area\") {\n      return (d) => xy(d.datum);\n    } else if (grouptype === \"line\") {\n      return (d) => {\n        const items = d.datum.items[markIndex].items;\n        return xy(items.length ? items[lineAnchor === \"start\" ? 0 : items.length - 1] : {\n          x: NaN,\n          y: NaN\n        });\n      };\n    } else {\n      return (d) => {\n        const b2 = d.datum.bounds;\n        return [b2.x1, (b2.x1 + b2.x2) / 2, b2.x2, b2.y1, (b2.y1 + b2.y2) / 2, b2.y2];\n      };\n    }\n  }\n  const Output$1 = [\"x\", \"y\", \"opacity\", \"align\", \"baseline\"];\n  const Anchors = [\"top-left\", \"left\", \"bottom-left\", \"top\", \"bottom\", \"top-right\", \"right\", \"bottom-right\"];\n  function Label$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Label$1.Definition = {\n    type: \"Label\",\n    metadata: {\n      modifies: true\n    },\n    params: [{\n      name: \"size\",\n      type: \"number\",\n      array: true,\n      length: 2,\n      required: true\n    }, {\n      name: \"sort\",\n      type: \"compare\"\n    }, {\n      name: \"anchor\",\n      type: \"string\",\n      array: true,\n      default: Anchors\n    }, {\n      name: \"offset\",\n      type: \"number\",\n      array: true,\n      default: [1]\n    }, {\n      name: \"padding\",\n      type: \"number\",\n      default: 0,\n      null: true\n    }, {\n      name: \"lineAnchor\",\n      type: \"string\",\n      values: [\"start\", \"end\"],\n      default: \"end\"\n    }, {\n      name: \"markIndex\",\n      type: \"number\",\n      default: 0\n    }, {\n      name: \"avoidBaseMark\",\n      type: \"boolean\",\n      default: true\n    }, {\n      name: \"avoidMarks\",\n      type: \"data\",\n      array: true\n    }, {\n      name: \"method\",\n      type: \"string\",\n      default: \"naive\"\n    }, {\n      name: \"as\",\n      type: \"string\",\n      array: true,\n      length: Output$1.length,\n      default: Output$1\n    }]\n  };\n  inherits(Label$1, Transform, {\n    transform(_, pulse2) {\n      function modp(param2) {\n        const p = _[param2];\n        return isFunction(p) && pulse2.modified(p.fields);\n      }\n      const mod = _.modified();\n      if (!(mod || pulse2.changed(pulse2.ADD_REM) || modp(\"sort\"))) return;\n      if (!_.size || _.size.length !== 2) {\n        error(\"Size parameter should be specified as a [width, height] array.\");\n      }\n      const as = _.as || Output$1;\n      labelLayout(pulse2.materialize(pulse2.SOURCE).source || [], _.size, _.sort, array$5(_.offset == null ? 1 : _.offset), array$5(_.anchor || Anchors), _.avoidMarks || [], _.avoidBaseMark !== false, _.lineAnchor || \"end\", _.markIndex || 0, _.padding === void 0 ? 0 : _.padding, _.method || \"naive\").forEach((l) => {\n        const t = l.datum;\n        t[as[0]] = l.x;\n        t[as[1]] = l.y;\n        t[as[2]] = l.opacity;\n        t[as[3]] = l.align;\n        t[as[4]] = l.baseline;\n      });\n      return pulse2.reflow(mod).modifies(as);\n    }\n  });\n  const label = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    label: Label$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function partition(data2, groupby) {\n    var groups = [], get2 = function(f) {\n      return f(t);\n    }, map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2);\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    return groups;\n  }\n  function Loess(params2) {\n    Transform.call(this, null, params2);\n  }\n  Loess.Definition = {\n    \"type\": \"Loess\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0.3\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Loess, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition(source2, _.groupby), names = (_.groupby || []).map(accessorName), m2 = names.length, as = _.as || [accessorName(_.x), accessorName(_.y)], values2 = [];\n        groups.forEach((g) => {\n          loess(g, _.x, _.y, _.bandwidth || 0.3).forEach((p) => {\n            const t = {};\n            for (let i = 0; i < m2; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = p[0];\n            t[as[1]] = p[1];\n            values2.push(ingest$1(t));\n          });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  const Methods = {\n    constant: constant$4,\n    linear: linear$2,\n    log: log$3,\n    exp: exp$1,\n    pow: pow$3,\n    quad,\n    poly\n  };\n  const degreesOfFreedom = (method2, order) => method2 === \"poly\" ? order : method2 === \"quad\" ? 2 : 1;\n  function Regression(params2) {\n    Transform.call(this, null, params2);\n  }\n  Regression.Definition = {\n    \"type\": \"Regression\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"method\",\n      \"type\": \"string\",\n      \"default\": \"linear\",\n      \"values\": Object.keys(Methods)\n    }, {\n      \"name\": \"order\",\n      \"type\": \"number\",\n      \"default\": 3\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"params\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Regression, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition(source2, _.groupby), names = (_.groupby || []).map(accessorName), method2 = _.method || \"linear\", order = _.order == null ? 3 : _.order, dof = degreesOfFreedom(method2, order), as = _.as || [accessorName(_.x), accessorName(_.y)], fit2 = Methods[method2], values2 = [];\n        let domain2 = _.extent;\n        if (!has$1(Methods, method2)) {\n          error(\"Invalid regression method: \" + method2);\n        }\n        if (domain2 != null) {\n          if (method2 === \"log\" && domain2[0] <= 0) {\n            pulse2.dataflow.warn(\"Ignoring extent with values <= 0 for log regression.\");\n            domain2 = null;\n          }\n        }\n        groups.forEach((g) => {\n          const n = g.length;\n          if (n <= dof) {\n            pulse2.dataflow.warn(\"Skipping regression with more parameters than data points.\");\n            return;\n          }\n          const model = fit2(g, _.x, _.y, order);\n          if (_.params) {\n            values2.push(ingest$1({\n              keys: g.dims,\n              coef: model.coef,\n              rSquared: model.rSquared\n            }));\n            return;\n          }\n          const dom = domain2 || extent(g, _.x), add2 = (p) => {\n            const t = {};\n            for (let i = 0; i < names.length; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = p[0];\n            t[as[1]] = p[1];\n            values2.push(ingest$1(t));\n          };\n          if (method2 === \"linear\" || method2 === \"constant\") {\n            dom.forEach((x2) => add2([x2, model.predict(x2)]));\n          } else {\n            sampleCurve(model.predict, dom, 25, 200).forEach(add2);\n          }\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  const reg = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    loess: Loess,\n    regression: Regression\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const epsilon$1 = 11102230246251565e-32;\n  const splitter = 134217729;\n  const resulterrbound = (3 + 8 * epsilon$1) * epsilon$1;\n  function sum(elen, e, flen, f, h2) {\n    let Q, Qnew, hh, bvirt;\n    let enow = e[0];\n    let fnow = f[0];\n    let eindex = 0;\n    let findex = 0;\n    if (fnow > enow === fnow > -enow) {\n      Q = enow;\n      enow = e[++eindex];\n    } else {\n      Q = fnow;\n      fnow = f[++findex];\n    }\n    let hindex = 0;\n    if (eindex < elen && findex < flen) {\n      if (fnow > enow === fnow > -enow) {\n        Qnew = enow + Q;\n        hh = Q - (Qnew - enow);\n        enow = e[++eindex];\n      } else {\n        Qnew = fnow + Q;\n        hh = Q - (Qnew - fnow);\n        fnow = f[++findex];\n      }\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n      while (eindex < elen && findex < flen) {\n        if (fnow > enow === fnow > -enow) {\n          Qnew = Q + enow;\n          bvirt = Qnew - Q;\n          hh = Q - (Qnew - bvirt) + (enow - bvirt);\n          enow = e[++eindex];\n        } else {\n          Qnew = Q + fnow;\n          bvirt = Qnew - Q;\n          hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n          fnow = f[++findex];\n        }\n        Q = Qnew;\n        if (hh !== 0) {\n          h2[hindex++] = hh;\n        }\n      }\n    }\n    while (eindex < elen) {\n      Qnew = Q + enow;\n      bvirt = Qnew - Q;\n      hh = Q - (Qnew - bvirt) + (enow - bvirt);\n      enow = e[++eindex];\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n    }\n    while (findex < flen) {\n      Qnew = Q + fnow;\n      bvirt = Qnew - Q;\n      hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n      fnow = f[++findex];\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n    }\n    if (Q !== 0 || hindex === 0) {\n      h2[hindex++] = Q;\n    }\n    return hindex;\n  }\n  function estimate(elen, e) {\n    let Q = e[0];\n    for (let i = 1; i < elen; i++) Q += e[i];\n    return Q;\n  }\n  function vec(n) {\n    return new Float64Array(n);\n  }\n  const ccwerrboundA = (3 + 16 * epsilon$1) * epsilon$1;\n  const ccwerrboundB = (2 + 12 * epsilon$1) * epsilon$1;\n  const ccwerrboundC = (9 + 64 * epsilon$1) * epsilon$1 * epsilon$1;\n  const B = vec(4);\n  const C1 = vec(8);\n  const C2 = vec(12);\n  const D = vec(16);\n  const u = vec(4);\n  function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n    let acxtail, acytail, bcxtail, bcytail;\n    let bvirt, c2, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t12, t02, u3;\n    const acx = ax - cx;\n    const bcx = bx - cx;\n    const acy = ay - cy;\n    const bcy = by - cy;\n    s1 = acx * bcy;\n    c2 = splitter * acx;\n    ahi = c2 - (c2 - acx);\n    alo = acx - ahi;\n    c2 = splitter * bcy;\n    bhi = c2 - (c2 - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acy * bcx;\n    c2 = splitter * acy;\n    ahi = c2 - (c2 - acy);\n    alo = acy - ahi;\n    c2 = splitter * bcx;\n    bhi = c2 - (c2 - bcx);\n    blo = bcx - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    B[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    B[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    B[3] = u3;\n    let det = estimate(4, B);\n    let errbound = ccwerrboundB * detsum;\n    if (det >= errbound || -det >= errbound) {\n      return det;\n    }\n    bvirt = ax - acx;\n    acxtail = ax - (acx + bvirt) + (bvirt - cx);\n    bvirt = bx - bcx;\n    bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n    bvirt = ay - acy;\n    acytail = ay - (acy + bvirt) + (bvirt - cy);\n    bvirt = by - bcy;\n    bcytail = by - (bcy + bvirt) + (bvirt - cy);\n    if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n      return det;\n    }\n    errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n    det += acx * bcytail + bcy * acxtail - (acy * bcxtail + bcx * acytail);\n    if (det >= errbound || -det >= errbound) return det;\n    s1 = acxtail * bcy;\n    c2 = splitter * acxtail;\n    ahi = c2 - (c2 - acxtail);\n    alo = acxtail - ahi;\n    c2 = splitter * bcy;\n    bhi = c2 - (c2 - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acytail * bcx;\n    c2 = splitter * acytail;\n    ahi = c2 - (c2 - acytail);\n    alo = acytail - ahi;\n    c2 = splitter * bcx;\n    bhi = c2 - (c2 - bcx);\n    blo = bcx - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C1len = sum(4, B, 4, u, C1);\n    s1 = acx * bcytail;\n    c2 = splitter * acx;\n    ahi = c2 - (c2 - acx);\n    alo = acx - ahi;\n    c2 = splitter * bcytail;\n    bhi = c2 - (c2 - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acy * bcxtail;\n    c2 = splitter * acy;\n    ahi = c2 - (c2 - acy);\n    alo = acy - ahi;\n    c2 = splitter * bcxtail;\n    bhi = c2 - (c2 - bcxtail);\n    blo = bcxtail - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C2len = sum(C1len, C1, 4, u, C2);\n    s1 = acxtail * bcytail;\n    c2 = splitter * acxtail;\n    ahi = c2 - (c2 - acxtail);\n    alo = acxtail - ahi;\n    c2 = splitter * bcytail;\n    bhi = c2 - (c2 - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acytail * bcxtail;\n    c2 = splitter * acytail;\n    ahi = c2 - (c2 - acytail);\n    alo = acytail - ahi;\n    c2 = splitter * bcxtail;\n    bhi = c2 - (c2 - bcxtail);\n    blo = bcxtail - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const Dlen = sum(C2len, C2, 4, u, D);\n    return D[Dlen - 1];\n  }\n  function orient2d(ax, ay, bx, by, cx, cy) {\n    const detleft = (ay - cy) * (bx - cx);\n    const detright = (ax - cx) * (by - cy);\n    const det = detleft - detright;\n    const detsum = Math.abs(detleft + detright);\n    if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n    return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n  }\n  const EPSILON$1 = Math.pow(2, -52);\n  const EDGE_STACK = new Uint32Array(512);\n  class Delaunator {\n    static from(points2, getX = defaultGetX, getY = defaultGetY) {\n      const n = points2.length;\n      const coords = new Float64Array(n * 2);\n      for (let i = 0; i < n; i++) {\n        const p = points2[i];\n        coords[2 * i] = getX(p);\n        coords[2 * i + 1] = getY(p);\n      }\n      return new Delaunator(coords);\n    }\n    constructor(coords) {\n      const n = coords.length >> 1;\n      if (n > 0 && typeof coords[0] !== \"number\") throw new Error(\"Expected coords to contain numbers.\");\n      this.coords = coords;\n      const maxTriangles = Math.max(2 * n - 5, 0);\n      this._triangles = new Uint32Array(maxTriangles * 3);\n      this._halfedges = new Int32Array(maxTriangles * 3);\n      this._hashSize = Math.ceil(Math.sqrt(n));\n      this._hullPrev = new Uint32Array(n);\n      this._hullNext = new Uint32Array(n);\n      this._hullTri = new Uint32Array(n);\n      this._hullHash = new Int32Array(this._hashSize);\n      this._ids = new Uint32Array(n);\n      this._dists = new Float64Array(n);\n      this.update();\n    }\n    update() {\n      const { coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash } = this;\n      const n = coords.length >> 1;\n      let minX = Infinity;\n      let minY = Infinity;\n      let maxX = -Infinity;\n      let maxY2 = -Infinity;\n      for (let i = 0; i < n; i++) {\n        const x2 = coords[2 * i];\n        const y2 = coords[2 * i + 1];\n        if (x2 < minX) minX = x2;\n        if (y2 < minY) minY = y2;\n        if (x2 > maxX) maxX = x2;\n        if (y2 > maxY2) maxY2 = y2;\n        this._ids[i] = i;\n      }\n      const cx = (minX + maxX) / 2;\n      const cy = (minY + maxY2) / 2;\n      let i0, i1, i2;\n      for (let i = 0, minDist = Infinity; i < n; i++) {\n        const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);\n        if (d < minDist) {\n          i0 = i;\n          minDist = d;\n        }\n      }\n      const i0x = coords[2 * i0];\n      const i0y = coords[2 * i0 + 1];\n      for (let i = 0, minDist = Infinity; i < n; i++) {\n        if (i === i0) continue;\n        const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);\n        if (d < minDist && d > 0) {\n          i1 = i;\n          minDist = d;\n        }\n      }\n      let i1x = coords[2 * i1];\n      let i1y = coords[2 * i1 + 1];\n      let minRadius = Infinity;\n      for (let i = 0; i < n; i++) {\n        if (i === i0 || i === i1) continue;\n        const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);\n        if (r < minRadius) {\n          i2 = i;\n          minRadius = r;\n        }\n      }\n      let i2x = coords[2 * i2];\n      let i2y = coords[2 * i2 + 1];\n      if (minRadius === Infinity) {\n        for (let i = 0; i < n; i++) {\n          this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];\n        }\n        quicksort(this._ids, this._dists, 0, n - 1);\n        const hull = new Uint32Array(n);\n        let j = 0;\n        for (let i = 0, d0 = -Infinity; i < n; i++) {\n          const id2 = this._ids[i];\n          const d = this._dists[id2];\n          if (d > d0) {\n            hull[j++] = id2;\n            d0 = d;\n          }\n        }\n        this.hull = hull.subarray(0, j);\n        this.triangles = new Uint32Array(0);\n        this.halfedges = new Uint32Array(0);\n        return;\n      }\n      if (orient2d(i0x, i0y, i1x, i1y, i2x, i2y) < 0) {\n        const i = i1;\n        const x2 = i1x;\n        const y2 = i1y;\n        i1 = i2;\n        i1x = i2x;\n        i1y = i2y;\n        i2 = i;\n        i2x = x2;\n        i2y = y2;\n      }\n      const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n      this._cx = center.x;\n      this._cy = center.y;\n      for (let i = 0; i < n; i++) {\n        this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);\n      }\n      quicksort(this._ids, this._dists, 0, n - 1);\n      this._hullStart = i0;\n      let hullSize = 3;\n      hullNext[i0] = hullPrev[i2] = i1;\n      hullNext[i1] = hullPrev[i0] = i2;\n      hullNext[i2] = hullPrev[i1] = i0;\n      hullTri[i0] = 0;\n      hullTri[i1] = 1;\n      hullTri[i2] = 2;\n      hullHash.fill(-1);\n      hullHash[this._hashKey(i0x, i0y)] = i0;\n      hullHash[this._hashKey(i1x, i1y)] = i1;\n      hullHash[this._hashKey(i2x, i2y)] = i2;\n      this.trianglesLen = 0;\n      this._addTriangle(i0, i1, i2, -1, -1, -1);\n      for (let k = 0, xp, yp; k < this._ids.length; k++) {\n        const i = this._ids[k];\n        const x2 = coords[2 * i];\n        const y2 = coords[2 * i + 1];\n        if (k > 0 && Math.abs(x2 - xp) <= EPSILON$1 && Math.abs(y2 - yp) <= EPSILON$1) continue;\n        xp = x2;\n        yp = y2;\n        if (i === i0 || i === i1 || i === i2) continue;\n        let start = 0;\n        for (let j = 0, key2 = this._hashKey(x2, y2); j < this._hashSize; j++) {\n          start = hullHash[(key2 + j) % this._hashSize];\n          if (start !== -1 && start !== hullNext[start]) break;\n        }\n        start = hullPrev[start];\n        let e = start, q;\n        while (q = hullNext[e], orient2d(x2, y2, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]) >= 0) {\n          e = q;\n          if (e === start) {\n            e = -1;\n            break;\n          }\n        }\n        if (e === -1) continue;\n        let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n        hullTri[i] = this._legalize(t + 2);\n        hullTri[e] = t;\n        hullSize++;\n        let n2 = hullNext[e];\n        while (q = hullNext[n2], orient2d(x2, y2, coords[2 * n2], coords[2 * n2 + 1], coords[2 * q], coords[2 * q + 1]) < 0) {\n          t = this._addTriangle(n2, i, q, hullTri[i], -1, hullTri[n2]);\n          hullTri[i] = this._legalize(t + 2);\n          hullNext[n2] = n2;\n          hullSize--;\n          n2 = q;\n        }\n        if (e === start) {\n          while (q = hullPrev[e], orient2d(x2, y2, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]) < 0) {\n            t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n            this._legalize(t + 2);\n            hullTri[q] = t;\n            hullNext[e] = e;\n            hullSize--;\n            e = q;\n          }\n        }\n        this._hullStart = hullPrev[i] = e;\n        hullNext[e] = hullPrev[n2] = i;\n        hullNext[i] = n2;\n        hullHash[this._hashKey(x2, y2)] = i;\n        hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n      }\n      this.hull = new Uint32Array(hullSize);\n      for (let i = 0, e = this._hullStart; i < hullSize; i++) {\n        this.hull[i] = e;\n        e = hullNext[e];\n      }\n      this.triangles = this._triangles.subarray(0, this.trianglesLen);\n      this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n    }\n    _hashKey(x2, y2) {\n      return Math.floor(pseudoAngle(x2 - this._cx, y2 - this._cy) * this._hashSize) % this._hashSize;\n    }\n    _legalize(a2) {\n      const { _triangles: triangles, _halfedges: halfedges, coords } = this;\n      let i = 0;\n      let ar = 0;\n      while (true) {\n        const b2 = halfedges[a2];\n        const a0 = a2 - a2 % 3;\n        ar = a0 + (a2 + 2) % 3;\n        if (b2 === -1) {\n          if (i === 0) break;\n          a2 = EDGE_STACK[--i];\n          continue;\n        }\n        const b0 = b2 - b2 % 3;\n        const al = a0 + (a2 + 1) % 3;\n        const bl2 = b0 + (b2 + 2) % 3;\n        const p02 = triangles[ar];\n        const pr = triangles[a2];\n        const pl = triangles[al];\n        const p1 = triangles[bl2];\n        const illegal = inCircle(\n          coords[2 * p02],\n          coords[2 * p02 + 1],\n          coords[2 * pr],\n          coords[2 * pr + 1],\n          coords[2 * pl],\n          coords[2 * pl + 1],\n          coords[2 * p1],\n          coords[2 * p1 + 1]\n        );\n        if (illegal) {\n          triangles[a2] = p1;\n          triangles[b2] = p02;\n          const hbl = halfedges[bl2];\n          if (hbl === -1) {\n            let e = this._hullStart;\n            do {\n              if (this._hullTri[e] === bl2) {\n                this._hullTri[e] = a2;\n                break;\n              }\n              e = this._hullPrev[e];\n            } while (e !== this._hullStart);\n          }\n          this._link(a2, hbl);\n          this._link(b2, halfedges[ar]);\n          this._link(ar, bl2);\n          const br2 = b0 + (b2 + 1) % 3;\n          if (i < EDGE_STACK.length) {\n            EDGE_STACK[i++] = br2;\n          }\n        } else {\n          if (i === 0) break;\n          a2 = EDGE_STACK[--i];\n        }\n      }\n      return ar;\n    }\n    _link(a2, b2) {\n      this._halfedges[a2] = b2;\n      if (b2 !== -1) this._halfedges[b2] = a2;\n    }\n    // add a new triangle given vertex indices and adjacent half-edge ids\n    _addTriangle(i0, i1, i2, a2, b2, c2) {\n      const t = this.trianglesLen;\n      this._triangles[t] = i0;\n      this._triangles[t + 1] = i1;\n      this._triangles[t + 2] = i2;\n      this._link(t, a2);\n      this._link(t + 1, b2);\n      this._link(t + 2, c2);\n      this.trianglesLen += 3;\n      return t;\n    }\n  }\n  function pseudoAngle(dx, dy) {\n    const p = dx / (Math.abs(dx) + Math.abs(dy));\n    return (dy > 0 ? 3 - p : 1 + p) / 4;\n  }\n  function dist(ax, ay, bx, by) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return dx * dx + dy * dy;\n  }\n  function inCircle(ax, ay, bx, by, cx, cy, px2, py2) {\n    const dx = ax - px2;\n    const dy = ay - py2;\n    const ex = bx - px2;\n    const ey = by - py2;\n    const fx = cx - px2;\n    const fy = cy - py2;\n    const ap = dx * dx + dy * dy;\n    const bp = ex * ex + ey * ey;\n    const cp = fx * fx + fy * fy;\n    return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n  }\n  function circumradius(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl2 = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n    const x2 = (ey * bl2 - dy * cl) * d;\n    const y2 = (dx * cl - ex * bl2) * d;\n    return x2 * x2 + y2 * y2;\n  }\n  function circumcenter(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl2 = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n    const x2 = ax + (ey * bl2 - dy * cl) * d;\n    const y2 = ay + (dx * cl - ex * bl2) * d;\n    return { x: x2, y: y2 };\n  }\n  function quicksort(ids, dists, left, right) {\n    if (right - left <= 20) {\n      for (let i = left + 1; i <= right; i++) {\n        const temp2 = ids[i];\n        const tempDist = dists[temp2];\n        let j = i - 1;\n        while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--];\n        ids[j + 1] = temp2;\n      }\n    } else {\n      const median2 = left + right >> 1;\n      let i = left + 1;\n      let j = right;\n      swap(ids, median2, i);\n      if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n      if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n      if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n      const temp2 = ids[i];\n      const tempDist = dists[temp2];\n      while (true) {\n        do\n          i++;\n        while (dists[ids[i]] < tempDist);\n        do\n          j--;\n        while (dists[ids[j]] > tempDist);\n        if (j < i) break;\n        swap(ids, i, j);\n      }\n      ids[left + 1] = ids[j];\n      ids[j] = temp2;\n      if (right - i + 1 >= j - left) {\n        quicksort(ids, dists, i, right);\n        quicksort(ids, dists, left, j - 1);\n      } else {\n        quicksort(ids, dists, left, j - 1);\n        quicksort(ids, dists, i, right);\n      }\n    }\n  }\n  function swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n  }\n  function defaultGetX(p) {\n    return p[0];\n  }\n  function defaultGetY(p) {\n    return p[1];\n  }\n  const epsilon = 1e-6;\n  class Path {\n    constructor() {\n      this._x0 = this._y0 = // start of current subpath\n      this._x1 = this._y1 = null;\n      this._ = \"\";\n    }\n    moveTo(x2, y2) {\n      this._ += `M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;\n    }\n    closePath() {\n      if (this._x1 !== null) {\n        this._x1 = this._x0, this._y1 = this._y0;\n        this._ += \"Z\";\n      }\n    }\n    lineTo(x2, y2) {\n      this._ += `L${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    arc(x2, y2, r) {\n      x2 = +x2, y2 = +y2, r = +r;\n      const x02 = x2 + r;\n      const y02 = y2;\n      if (r < 0) throw new Error(\"negative radius\");\n      if (this._x1 === null) this._ += `M${x02},${y02}`;\n      else if (Math.abs(this._x1 - x02) > epsilon || Math.abs(this._y1 - y02) > epsilon) this._ += \"L\" + x02 + \",\" + y02;\n      if (!r) return;\n      this._ += `A${r},${r},0,1,1,${x2 - r},${y2}A${r},${r},0,1,1,${this._x1 = x02},${this._y1 = y02}`;\n    }\n    rect(x2, y2, w2, h2) {\n      this._ += `M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${+w2}v${+h2}h${-w2}Z`;\n    }\n    value() {\n      return this._ || null;\n    }\n  }\n  class Polygon {\n    constructor() {\n      this._ = [];\n    }\n    moveTo(x2, y2) {\n      this._.push([x2, y2]);\n    }\n    closePath() {\n      this._.push(this._[0].slice());\n    }\n    lineTo(x2, y2) {\n      this._.push([x2, y2]);\n    }\n    value() {\n      return this._.length ? this._ : null;\n    }\n  }\n  let Voronoi$1 = class Voronoi {\n    constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) {\n      if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error(\"invalid bounds\");\n      this.delaunay = delaunay;\n      this._circumcenters = new Float64Array(delaunay.points.length * 2);\n      this.vectors = new Float64Array(delaunay.points.length * 2);\n      this.xmax = xmax, this.xmin = xmin;\n      this.ymax = ymax, this.ymin = ymin;\n      this._init();\n    }\n    update() {\n      this.delaunay.update();\n      this._init();\n      return this;\n    }\n    _init() {\n      const { delaunay: { points: points2, hull, triangles }, vectors } = this;\n      let bx, by;\n      const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);\n      for (let i = 0, j = 0, n = triangles.length, x2, y2; i < n; i += 3, j += 2) {\n        const t12 = triangles[i] * 2;\n        const t22 = triangles[i + 1] * 2;\n        const t32 = triangles[i + 2] * 2;\n        const x13 = points2[t12];\n        const y13 = points2[t12 + 1];\n        const x22 = points2[t22];\n        const y22 = points2[t22 + 1];\n        const x3 = points2[t32];\n        const y3 = points2[t32 + 1];\n        const dx = x22 - x13;\n        const dy = y22 - y13;\n        const ex = x3 - x13;\n        const ey = y3 - y13;\n        const ab = (dx * ey - dy * ex) * 2;\n        if (Math.abs(ab) < 1e-9) {\n          if (bx === void 0) {\n            bx = by = 0;\n            for (const i2 of hull) bx += points2[i2 * 2], by += points2[i2 * 2 + 1];\n            bx /= hull.length, by /= hull.length;\n          }\n          const a2 = 1e9 * Math.sign((bx - x13) * ey - (by - y13) * ex);\n          x2 = (x13 + x3) / 2 - a2 * ey;\n          y2 = (y13 + y3) / 2 + a2 * ex;\n        } else {\n          const d = 1 / ab;\n          const bl2 = dx * dx + dy * dy;\n          const cl = ex * ex + ey * ey;\n          x2 = x13 + (ey * bl2 - dy * cl) * d;\n          y2 = y13 + (dx * cl - ex * bl2) * d;\n        }\n        circumcenters[j] = x2;\n        circumcenters[j + 1] = y2;\n      }\n      let h2 = hull[hull.length - 1];\n      let p02, p1 = h2 * 4;\n      let x02, x12 = points2[2 * h2];\n      let y02, y12 = points2[2 * h2 + 1];\n      vectors.fill(0);\n      for (let i = 0; i < hull.length; ++i) {\n        h2 = hull[i];\n        p02 = p1, x02 = x12, y02 = y12;\n        p1 = h2 * 4, x12 = points2[2 * h2], y12 = points2[2 * h2 + 1];\n        vectors[p02 + 2] = vectors[p1] = y02 - y12;\n        vectors[p02 + 3] = vectors[p1 + 1] = x12 - x02;\n      }\n    }\n    render(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { delaunay: { halfedges, inedges, hull }, circumcenters, vectors } = this;\n      if (hull.length <= 1) return null;\n      for (let i = 0, n = halfedges.length; i < n; ++i) {\n        const j = halfedges[i];\n        if (j < i) continue;\n        const ti = Math.floor(i / 3) * 2;\n        const tj = Math.floor(j / 3) * 2;\n        const xi = circumcenters[ti];\n        const yi = circumcenters[ti + 1];\n        const xj = circumcenters[tj];\n        const yj = circumcenters[tj + 1];\n        this._renderSegment(xi, yi, xj, yj, context2);\n      }\n      let h0, h1 = hull[hull.length - 1];\n      for (let i = 0; i < hull.length; ++i) {\n        h0 = h1, h1 = hull[i];\n        const t = Math.floor(inedges[h1] / 3) * 2;\n        const x2 = circumcenters[t];\n        const y2 = circumcenters[t + 1];\n        const v = h0 * 4;\n        const p = this._project(x2, y2, vectors[v + 2], vectors[v + 3]);\n        if (p) this._renderSegment(x2, y2, p[0], p[1], context2);\n      }\n      return buffer && buffer.value();\n    }\n    renderBounds(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      context2.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin);\n      return buffer && buffer.value();\n    }\n    renderCell(i, context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const points2 = this._clip(i);\n      if (points2 === null || !points2.length) return;\n      context2.moveTo(points2[0], points2[1]);\n      let n = points2.length;\n      while (points2[0] === points2[n - 2] && points2[1] === points2[n - 1] && n > 1) n -= 2;\n      for (let i2 = 2; i2 < n; i2 += 2) {\n        if (points2[i2] !== points2[i2 - 2] || points2[i2 + 1] !== points2[i2 - 1])\n          context2.lineTo(points2[i2], points2[i2 + 1]);\n      }\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    *cellPolygons() {\n      const { delaunay: { points: points2 } } = this;\n      for (let i = 0, n = points2.length / 2; i < n; ++i) {\n        const cell2 = this.cellPolygon(i);\n        if (cell2) cell2.index = i, yield cell2;\n      }\n    }\n    cellPolygon(i) {\n      const polygon = new Polygon();\n      this.renderCell(i, polygon);\n      return polygon.value();\n    }\n    _renderSegment(x02, y02, x12, y12, context2) {\n      let S;\n      const c0 = this._regioncode(x02, y02);\n      const c1 = this._regioncode(x12, y12);\n      if (c0 === 0 && c1 === 0) {\n        context2.moveTo(x02, y02);\n        context2.lineTo(x12, y12);\n      } else if (S = this._clipSegment(x02, y02, x12, y12, c0, c1)) {\n        context2.moveTo(S[0], S[1]);\n        context2.lineTo(S[2], S[3]);\n      }\n    }\n    contains(i, x2, y2) {\n      if ((x2 = +x2, x2 !== x2) || (y2 = +y2, y2 !== y2)) return false;\n      return this.delaunay._step(i, x2, y2) === i;\n    }\n    *neighbors(i) {\n      const ci = this._clip(i);\n      if (ci) for (const j of this.delaunay.neighbors(i)) {\n        const cj = this._clip(j);\n        if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) {\n          for (let aj = 0, lj = cj.length; aj < lj; aj += 2) {\n            if (ci[ai] === cj[aj] && ci[ai + 1] === cj[aj + 1] && ci[(ai + 2) % li] === cj[(aj + lj - 2) % lj] && ci[(ai + 3) % li] === cj[(aj + lj - 1) % lj]) {\n              yield j;\n              break loop;\n            }\n          }\n        }\n      }\n    }\n    _cell(i) {\n      const { circumcenters, delaunay: { inedges, halfedges, triangles } } = this;\n      const e0 = inedges[i];\n      if (e0 === -1) return null;\n      const points2 = [];\n      let e = e0;\n      do {\n        const t = Math.floor(e / 3);\n        points2.push(circumcenters[t * 2], circumcenters[t * 2 + 1]);\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) break;\n        e = halfedges[e];\n      } while (e !== e0 && e !== -1);\n      return points2;\n    }\n    _clip(i) {\n      if (i === 0 && this.delaunay.hull.length === 1) {\n        return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n      }\n      const points2 = this._cell(i);\n      if (points2 === null) return null;\n      const { vectors: V } = this;\n      const v = i * 4;\n      return this._simplify(V[v] || V[v + 1] ? this._clipInfinite(i, points2, V[v], V[v + 1], V[v + 2], V[v + 3]) : this._clipFinite(i, points2));\n    }\n    _clipFinite(i, points2) {\n      const n = points2.length;\n      let P = null;\n      let x02, y02, x12 = points2[n - 2], y12 = points2[n - 1];\n      let c0, c1 = this._regioncode(x12, y12);\n      let e0, e1 = 0;\n      for (let j = 0; j < n; j += 2) {\n        x02 = x12, y02 = y12, x12 = points2[j], y12 = points2[j + 1];\n        c0 = c1, c1 = this._regioncode(x12, y12);\n        if (c0 === 0 && c1 === 0) {\n          e0 = e1, e1 = 0;\n          if (P) P.push(x12, y12);\n          else P = [x12, y12];\n        } else {\n          let S, sx0, sy0, sx1, sy1;\n          if (c0 === 0) {\n            if ((S = this._clipSegment(x02, y02, x12, y12, c0, c1)) === null) continue;\n            [sx0, sy0, sx1, sy1] = S;\n          } else {\n            if ((S = this._clipSegment(x12, y12, x02, y02, c1, c0)) === null) continue;\n            [sx1, sy1, sx0, sy0] = S;\n            e0 = e1, e1 = this._edgecode(sx0, sy0);\n            if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n            if (P) P.push(sx0, sy0);\n            else P = [sx0, sy0];\n          }\n          e0 = e1, e1 = this._edgecode(sx1, sy1);\n          if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n          if (P) P.push(sx1, sy1);\n          else P = [sx1, sy1];\n        }\n      }\n      if (P) {\n        e0 = e1, e1 = this._edgecode(P[0], P[1]);\n        if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n      } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n        return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n      }\n      return P;\n    }\n    _clipSegment(x02, y02, x12, y12, c0, c1) {\n      const flip2 = c0 < c1;\n      if (flip2) [x02, y02, x12, y12, c0, c1] = [x12, y12, x02, y02, c1, c0];\n      while (true) {\n        if (c0 === 0 && c1 === 0) return flip2 ? [x12, y12, x02, y02] : [x02, y02, x12, y12];\n        if (c0 & c1) return null;\n        let x2, y2, c2 = c0 || c1;\n        if (c2 & 8) x2 = x02 + (x12 - x02) * (this.ymax - y02) / (y12 - y02), y2 = this.ymax;\n        else if (c2 & 4) x2 = x02 + (x12 - x02) * (this.ymin - y02) / (y12 - y02), y2 = this.ymin;\n        else if (c2 & 2) y2 = y02 + (y12 - y02) * (this.xmax - x02) / (x12 - x02), x2 = this.xmax;\n        else y2 = y02 + (y12 - y02) * (this.xmin - x02) / (x12 - x02), x2 = this.xmin;\n        if (c0) x02 = x2, y02 = y2, c0 = this._regioncode(x02, y02);\n        else x12 = x2, y12 = y2, c1 = this._regioncode(x12, y12);\n      }\n    }\n    _clipInfinite(i, points2, vx0, vy0, vxn, vyn) {\n      let P = Array.from(points2), p;\n      if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]);\n      if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]);\n      if (P = this._clipFinite(i, P)) {\n        for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) {\n          c0 = c1, c1 = this._edgecode(P[j], P[j + 1]);\n          if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length;\n        }\n      } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n        P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax];\n      }\n      return P;\n    }\n    _edge(i, e0, e1, P, j) {\n      while (e0 !== e1) {\n        let x2, y2;\n        switch (e0) {\n          case 5:\n            e0 = 4;\n            continue;\n          // top-left\n          case 4:\n            e0 = 6, x2 = this.xmax, y2 = this.ymin;\n            break;\n          // top\n          case 6:\n            e0 = 2;\n            continue;\n          // top-right\n          case 2:\n            e0 = 10, x2 = this.xmax, y2 = this.ymax;\n            break;\n          // right\n          case 10:\n            e0 = 8;\n            continue;\n          // bottom-right\n          case 8:\n            e0 = 9, x2 = this.xmin, y2 = this.ymax;\n            break;\n          // bottom\n          case 9:\n            e0 = 1;\n            continue;\n          // bottom-left\n          case 1:\n            e0 = 5, x2 = this.xmin, y2 = this.ymin;\n            break;\n        }\n        if ((P[j] !== x2 || P[j + 1] !== y2) && this.contains(i, x2, y2)) {\n          P.splice(j, 0, x2, y2), j += 2;\n        }\n      }\n      return j;\n    }\n    _project(x02, y02, vx, vy) {\n      let t = Infinity, c2, x2, y2;\n      if (vy < 0) {\n        if (y02 <= this.ymin) return null;\n        if ((c2 = (this.ymin - y02) / vy) < t) y2 = this.ymin, x2 = x02 + (t = c2) * vx;\n      } else if (vy > 0) {\n        if (y02 >= this.ymax) return null;\n        if ((c2 = (this.ymax - y02) / vy) < t) y2 = this.ymax, x2 = x02 + (t = c2) * vx;\n      }\n      if (vx > 0) {\n        if (x02 >= this.xmax) return null;\n        if ((c2 = (this.xmax - x02) / vx) < t) x2 = this.xmax, y2 = y02 + (t = c2) * vy;\n      } else if (vx < 0) {\n        if (x02 <= this.xmin) return null;\n        if ((c2 = (this.xmin - x02) / vx) < t) x2 = this.xmin, y2 = y02 + (t = c2) * vy;\n      }\n      return [x2, y2];\n    }\n    _edgecode(x2, y2) {\n      return (x2 === this.xmin ? 1 : x2 === this.xmax ? 2 : 0) | (y2 === this.ymin ? 4 : y2 === this.ymax ? 8 : 0);\n    }\n    _regioncode(x2, y2) {\n      return (x2 < this.xmin ? 1 : x2 > this.xmax ? 2 : 0) | (y2 < this.ymin ? 4 : y2 > this.ymax ? 8 : 0);\n    }\n    _simplify(P) {\n      if (P && P.length > 4) {\n        for (let i = 0; i < P.length; i += 2) {\n          const j = (i + 2) % P.length, k = (i + 4) % P.length;\n          if (P[i] === P[j] && P[j] === P[k] || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) {\n            P.splice(j, 2), i -= 2;\n          }\n        }\n        if (!P.length) P = null;\n      }\n      return P;\n    }\n  };\n  const tau = 2 * Math.PI, pow = Math.pow;\n  function pointX(p) {\n    return p[0];\n  }\n  function pointY(p) {\n    return p[1];\n  }\n  function collinear(d) {\n    const { triangles, coords } = d;\n    for (let i = 0; i < triangles.length; i += 3) {\n      const a2 = 2 * triangles[i], b2 = 2 * triangles[i + 1], c2 = 2 * triangles[i + 2], cross2 = (coords[c2] - coords[a2]) * (coords[b2 + 1] - coords[a2 + 1]) - (coords[b2] - coords[a2]) * (coords[c2 + 1] - coords[a2 + 1]);\n      if (cross2 > 1e-10) return false;\n    }\n    return true;\n  }\n  function jitter(x2, y2, r) {\n    return [x2 + Math.sin(x2 + y2) * r, y2 + Math.cos(x2 - y2) * r];\n  }\n  class Delaunay {\n    static from(points2, fx = pointX, fy = pointY, that) {\n      return new Delaunay(\"length\" in points2 ? flatArray(points2, fx, fy, that) : Float64Array.from(flatIterable(points2, fx, fy, that)));\n    }\n    constructor(points2) {\n      this._delaunator = new Delaunator(points2);\n      this.inedges = new Int32Array(points2.length / 2);\n      this._hullIndex = new Int32Array(points2.length / 2);\n      this.points = this._delaunator.coords;\n      this._init();\n    }\n    update() {\n      this._delaunator.update();\n      this._init();\n      return this;\n    }\n    _init() {\n      const d = this._delaunator, points2 = this.points;\n      if (d.hull && d.hull.length > 2 && collinear(d)) {\n        this.collinear = Int32Array.from({ length: points2.length / 2 }, (_, i) => i).sort((i, j) => points2[2 * i] - points2[2 * j] || points2[2 * i + 1] - points2[2 * j + 1]);\n        const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds2 = [points2[2 * e], points2[2 * e + 1], points2[2 * f], points2[2 * f + 1]], r = 1e-8 * Math.hypot(bounds2[3] - bounds2[1], bounds2[2] - bounds2[0]);\n        for (let i = 0, n = points2.length / 2; i < n; ++i) {\n          const p = jitter(points2[2 * i], points2[2 * i + 1], r);\n          points2[2 * i] = p[0];\n          points2[2 * i + 1] = p[1];\n        }\n        this._delaunator = new Delaunator(points2);\n      } else {\n        delete this.collinear;\n      }\n      const halfedges = this.halfedges = this._delaunator.halfedges;\n      const hull = this.hull = this._delaunator.hull;\n      const triangles = this.triangles = this._delaunator.triangles;\n      const inedges = this.inedges.fill(-1);\n      const hullIndex = this._hullIndex.fill(-1);\n      for (let e = 0, n = halfedges.length; e < n; ++e) {\n        const p = triangles[e % 3 === 2 ? e - 2 : e + 1];\n        if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e;\n      }\n      for (let i = 0, n = hull.length; i < n; ++i) {\n        hullIndex[hull[i]] = i;\n      }\n      if (hull.length <= 2 && hull.length > 0) {\n        this.triangles = new Int32Array(3).fill(-1);\n        this.halfedges = new Int32Array(3).fill(-1);\n        this.triangles[0] = hull[0];\n        inedges[hull[0]] = 1;\n        if (hull.length === 2) {\n          inedges[hull[1]] = 0;\n          this.triangles[1] = hull[1];\n          this.triangles[2] = hull[1];\n        }\n      }\n    }\n    voronoi(bounds2) {\n      return new Voronoi$1(this, bounds2);\n    }\n    *neighbors(i) {\n      const { inedges, hull, _hullIndex, halfedges, triangles, collinear: collinear2 } = this;\n      if (collinear2) {\n        const l = collinear2.indexOf(i);\n        if (l > 0) yield collinear2[l - 1];\n        if (l < collinear2.length - 1) yield collinear2[l + 1];\n        return;\n      }\n      const e0 = inedges[i];\n      if (e0 === -1) return;\n      let e = e0, p02 = -1;\n      do {\n        yield p02 = triangles[e];\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) return;\n        e = halfedges[e];\n        if (e === -1) {\n          const p = hull[(_hullIndex[i] + 1) % hull.length];\n          if (p !== p02) yield p;\n          return;\n        }\n      } while (e !== e0);\n    }\n    find(x2, y2, i = 0) {\n      if ((x2 = +x2, x2 !== x2) || (y2 = +y2, y2 !== y2)) return -1;\n      const i0 = i;\n      let c2;\n      while ((c2 = this._step(i, x2, y2)) >= 0 && c2 !== i && c2 !== i0) i = c2;\n      return c2;\n    }\n    _step(i, x2, y2) {\n      const { inedges, hull, _hullIndex, halfedges, triangles, points: points2 } = this;\n      if (inedges[i] === -1 || !points2.length) return (i + 1) % (points2.length >> 1);\n      let c2 = i;\n      let dc = pow(x2 - points2[i * 2], 2) + pow(y2 - points2[i * 2 + 1], 2);\n      const e0 = inedges[i];\n      let e = e0;\n      do {\n        let t = triangles[e];\n        const dt = pow(x2 - points2[t * 2], 2) + pow(y2 - points2[t * 2 + 1], 2);\n        if (dt < dc) dc = dt, c2 = t;\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) break;\n        e = halfedges[e];\n        if (e === -1) {\n          e = hull[(_hullIndex[i] + 1) % hull.length];\n          if (e !== t) {\n            if (pow(x2 - points2[e * 2], 2) + pow(y2 - points2[e * 2 + 1], 2) < dc) return e;\n          }\n          break;\n        }\n      } while (e !== e0);\n      return c2;\n    }\n    render(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2, halfedges, triangles } = this;\n      for (let i = 0, n = halfedges.length; i < n; ++i) {\n        const j = halfedges[i];\n        if (j < i) continue;\n        const ti = triangles[i] * 2;\n        const tj = triangles[j] * 2;\n        context2.moveTo(points2[ti], points2[ti + 1]);\n        context2.lineTo(points2[tj], points2[tj + 1]);\n      }\n      this.renderHull(context2);\n      return buffer && buffer.value();\n    }\n    renderPoints(context2, r) {\n      if (r === void 0 && (!context2 || typeof context2.moveTo !== \"function\")) r = context2, context2 = null;\n      r = r == void 0 ? 2 : +r;\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2 } = this;\n      for (let i = 0, n = points2.length; i < n; i += 2) {\n        const x2 = points2[i], y2 = points2[i + 1];\n        context2.moveTo(x2 + r, y2);\n        context2.arc(x2, y2, r, 0, tau);\n      }\n      return buffer && buffer.value();\n    }\n    renderHull(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { hull, points: points2 } = this;\n      const h2 = hull[0] * 2, n = hull.length;\n      context2.moveTo(points2[h2], points2[h2 + 1]);\n      for (let i = 1; i < n; ++i) {\n        const h3 = 2 * hull[i];\n        context2.lineTo(points2[h3], points2[h3 + 1]);\n      }\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    hullPolygon() {\n      const polygon = new Polygon();\n      this.renderHull(polygon);\n      return polygon.value();\n    }\n    renderTriangle(i, context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2, triangles } = this;\n      const t02 = triangles[i *= 3] * 2;\n      const t12 = triangles[i + 1] * 2;\n      const t22 = triangles[i + 2] * 2;\n      context2.moveTo(points2[t02], points2[t02 + 1]);\n      context2.lineTo(points2[t12], points2[t12 + 1]);\n      context2.lineTo(points2[t22], points2[t22 + 1]);\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    *trianglePolygons() {\n      const { triangles } = this;\n      for (let i = 0, n = triangles.length / 3; i < n; ++i) {\n        yield this.trianglePolygon(i);\n      }\n    }\n    trianglePolygon(i) {\n      const polygon = new Polygon();\n      this.renderTriangle(i, polygon);\n      return polygon.value();\n    }\n  }\n  function flatArray(points2, fx, fy, that) {\n    const n = points2.length;\n    const array2 = new Float64Array(n * 2);\n    for (let i = 0; i < n; ++i) {\n      const p = points2[i];\n      array2[i * 2] = fx.call(that, p, i, points2);\n      array2[i * 2 + 1] = fy.call(that, p, i, points2);\n    }\n    return array2;\n  }\n  function* flatIterable(points2, fx, fy, that) {\n    let i = 0;\n    for (const p of points2) {\n      yield fx.call(that, p, i, points2);\n      yield fy.call(that, p, i, points2);\n      ++i;\n    }\n  }\n  function Voronoi(params2) {\n    Transform.call(this, null, params2);\n  }\n  Voronoi.Definition = {\n    \"type\": \"Voronoi\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [[-1e5, -1e5], [1e5, 1e5]],\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  const defaultExtent = [-1e5, -1e5, 1e5, 1e5];\n  inherits(Voronoi, Transform, {\n    transform(_, pulse2) {\n      const as = _.as || \"path\", data2 = pulse2.source;\n      if (!data2 || !data2.length) return pulse2;\n      let s = _.size;\n      s = s ? [0, 0, s[0], s[1]] : (s = _.extent) ? [s[0][0], s[0][1], s[1][0], s[1][1]] : defaultExtent;\n      const voronoi2 = this.value = Delaunay.from(data2, _.x, _.y).voronoi(s);\n      for (let i = 0, n = data2.length; i < n; ++i) {\n        const polygon = voronoi2.cellPolygon(i);\n        data2[i][as] = polygon && !isPoint(polygon) ? toPathString(polygon) : null;\n      }\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  function toPathString(p) {\n    const x2 = p[0][0], y2 = p[0][1];\n    let n = p.length - 1;\n    for (; p[n][0] === x2 && p[n][1] === y2; --n) ;\n    return \"M\" + p.slice(0, n + 1).join(\"L\") + \"Z\";\n  }\n  function isPoint(p) {\n    return p.length === 2 && p[0][0] === p[1][0] && p[0][1] === p[1][1];\n  }\n  const voronoi = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    voronoi: Voronoi\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var cloudRadians = Math.PI / 180, cw = 1 << 11 >> 5, ch = 1 << 11;\n  function cloud() {\n    var size2 = [256, 256], text2, font2, fontSize2, fontStyle, fontWeight, rotate2, padding2, spiral = archimedeanSpiral, words = [], random2 = Math.random, cloud2 = {};\n    cloud2.layout = function() {\n      var contextAndRatio = getContext2(domCanvas()), board = zeroArray((size2[0] >> 5) * size2[1]), bounds2 = null, n = words.length, i = -1, tags = [], data2 = words.map((d2) => ({\n        text: text2(d2),\n        font: font2(d2),\n        style: fontStyle(d2),\n        weight: fontWeight(d2),\n        rotate: rotate2(d2),\n        size: ~~(fontSize2(d2) + 1e-14),\n        padding: padding2(d2),\n        xoff: 0,\n        yoff: 0,\n        x1: 0,\n        y1: 0,\n        x0: 0,\n        y0: 0,\n        hasText: false,\n        sprite: null,\n        datum: d2\n      })).sort((a2, b2) => b2.size - a2.size);\n      while (++i < n) {\n        var d = data2[i];\n        d.x = size2[0] * (random2() + 0.5) >> 1;\n        d.y = size2[1] * (random2() + 0.5) >> 1;\n        cloudSprite(contextAndRatio, d, data2, i);\n        if (d.hasText && place2(board, d, bounds2)) {\n          tags.push(d);\n          if (bounds2) cloudBounds(bounds2, d);\n          else bounds2 = [{\n            x: d.x + d.x0,\n            y: d.y + d.y0\n          }, {\n            x: d.x + d.x1,\n            y: d.y + d.y1\n          }];\n          d.x -= size2[0] >> 1;\n          d.y -= size2[1] >> 1;\n        }\n      }\n      return tags;\n    };\n    function getContext2(canvas) {\n      canvas.width = canvas.height = 1;\n      var ratio = Math.sqrt(canvas.getContext(\"2d\").getImageData(0, 0, 1, 1).data.length >> 2);\n      canvas.width = (cw << 5) / ratio;\n      canvas.height = ch / ratio;\n      var context2 = canvas.getContext(\"2d\");\n      context2.fillStyle = context2.strokeStyle = \"red\";\n      context2.textAlign = \"center\";\n      return {\n        context: context2,\n        ratio\n      };\n    }\n    function place2(board, tag, bounds2) {\n      var startX = tag.x, startY = tag.y, maxDelta = Math.hypot(size2[0], size2[1]), s = spiral(size2), dt = random2() < 0.5 ? 1 : -1, t = -dt, dxdy, dx, dy;\n      while (dxdy = s(t += dt)) {\n        dx = ~~dxdy[0];\n        dy = ~~dxdy[1];\n        if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break;\n        tag.x = startX + dx;\n        tag.y = startY + dy;\n        if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || tag.x + tag.x1 > size2[0] || tag.y + tag.y1 > size2[1]) continue;\n        if (!bounds2 || !cloudCollide(tag, board, size2[0])) {\n          if (!bounds2 || collideRects(tag, bounds2)) {\n            var sprite = tag.sprite, w2 = tag.width >> 5, sw = size2[0] >> 5, lx2 = tag.x - (w2 << 4), sx = lx2 & 127, msx = 32 - sx, h2 = tag.y1 - tag.y0, x2 = (tag.y + tag.y0) * sw + (lx2 >> 5), last;\n            for (var j = 0; j < h2; j++) {\n              last = 0;\n              for (var i = 0; i <= w2; i++) {\n                board[x2 + i] |= last << msx | (i < w2 ? (last = sprite[j * w2 + i]) >>> sx : 0);\n              }\n              x2 += sw;\n            }\n            tag.sprite = null;\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n    cloud2.words = function(_) {\n      if (arguments.length) {\n        words = _;\n        return cloud2;\n      } else {\n        return words;\n      }\n    };\n    cloud2.size = function(_) {\n      if (arguments.length) {\n        size2 = [+_[0], +_[1]];\n        return cloud2;\n      } else {\n        return size2;\n      }\n    };\n    cloud2.font = function(_) {\n      if (arguments.length) {\n        font2 = functor(_);\n        return cloud2;\n      } else {\n        return font2;\n      }\n    };\n    cloud2.fontStyle = function(_) {\n      if (arguments.length) {\n        fontStyle = functor(_);\n        return cloud2;\n      } else {\n        return fontStyle;\n      }\n    };\n    cloud2.fontWeight = function(_) {\n      if (arguments.length) {\n        fontWeight = functor(_);\n        return cloud2;\n      } else {\n        return fontWeight;\n      }\n    };\n    cloud2.rotate = function(_) {\n      if (arguments.length) {\n        rotate2 = functor(_);\n        return cloud2;\n      } else {\n        return rotate2;\n      }\n    };\n    cloud2.text = function(_) {\n      if (arguments.length) {\n        text2 = functor(_);\n        return cloud2;\n      } else {\n        return text2;\n      }\n    };\n    cloud2.spiral = function(_) {\n      if (arguments.length) {\n        spiral = spirals[_] || _;\n        return cloud2;\n      } else {\n        return spiral;\n      }\n    };\n    cloud2.fontSize = function(_) {\n      if (arguments.length) {\n        fontSize2 = functor(_);\n        return cloud2;\n      } else {\n        return fontSize2;\n      }\n    };\n    cloud2.padding = function(_) {\n      if (arguments.length) {\n        padding2 = functor(_);\n        return cloud2;\n      } else {\n        return padding2;\n      }\n    };\n    cloud2.random = function(_) {\n      if (arguments.length) {\n        random2 = _;\n        return cloud2;\n      } else {\n        return random2;\n      }\n    };\n    return cloud2;\n  }\n  function cloudSprite(contextAndRatio, d, data2, di) {\n    if (d.sprite) return;\n    var c2 = contextAndRatio.context, ratio = contextAndRatio.ratio;\n    c2.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);\n    var x2 = 0, y2 = 0, maxh = 0, n = data2.length, w2, w32, h2, i, j;\n    --di;\n    while (++di < n) {\n      d = data2[di];\n      c2.save();\n      c2.font = d.style + \" \" + d.weight + \" \" + ~~((d.size + 1) / ratio) + \"px \" + d.font;\n      w2 = c2.measureText(d.text + \"m\").width * ratio;\n      h2 = d.size << 1;\n      if (d.rotate) {\n        var sr = Math.sin(d.rotate * cloudRadians), cr2 = Math.cos(d.rotate * cloudRadians), wcr = w2 * cr2, wsr = w2 * sr, hcr = h2 * cr2, hsr = h2 * sr;\n        w2 = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 31 >> 5 << 5;\n        h2 = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));\n      } else {\n        w2 = w2 + 31 >> 5 << 5;\n      }\n      if (h2 > maxh) maxh = h2;\n      if (x2 + w2 >= cw << 5) {\n        x2 = 0;\n        y2 += maxh;\n        maxh = 0;\n      }\n      if (y2 + h2 >= ch) break;\n      c2.translate((x2 + (w2 >> 1)) / ratio, (y2 + (h2 >> 1)) / ratio);\n      if (d.rotate) c2.rotate(d.rotate * cloudRadians);\n      c2.fillText(d.text, 0, 0);\n      if (d.padding) {\n        c2.lineWidth = 2 * d.padding;\n        c2.strokeText(d.text, 0, 0);\n      }\n      c2.restore();\n      d.width = w2;\n      d.height = h2;\n      d.xoff = x2;\n      d.yoff = y2;\n      d.x1 = w2 >> 1;\n      d.y1 = h2 >> 1;\n      d.x0 = -d.x1;\n      d.y0 = -d.y1;\n      d.hasText = true;\n      x2 += w2;\n    }\n    var pixels = c2.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, sprite = [];\n    while (--di >= 0) {\n      d = data2[di];\n      if (!d.hasText) continue;\n      w2 = d.width;\n      w32 = w2 >> 5;\n      h2 = d.y1 - d.y0;\n      for (i = 0; i < h2 * w32; i++) sprite[i] = 0;\n      x2 = d.xoff;\n      if (x2 == null) return;\n      y2 = d.yoff;\n      var seen = 0, seenRow = -1;\n      for (j = 0; j < h2; j++) {\n        for (i = 0; i < w2; i++) {\n          var k = w32 * j + (i >> 5), m2 = pixels[(y2 + j) * (cw << 5) + (x2 + i) << 2] ? 1 << 31 - i % 32 : 0;\n          sprite[k] |= m2;\n          seen |= m2;\n        }\n        if (seen) seenRow = j;\n        else {\n          d.y0++;\n          h2--;\n          j--;\n          y2++;\n        }\n      }\n      d.y1 = d.y0 + seenRow;\n      d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32);\n    }\n  }\n  function cloudCollide(tag, board, sw) {\n    sw >>= 5;\n    var sprite = tag.sprite, w2 = tag.width >> 5, lx2 = tag.x - (w2 << 4), sx = lx2 & 127, msx = 32 - sx, h2 = tag.y1 - tag.y0, x2 = (tag.y + tag.y0) * sw + (lx2 >> 5), last;\n    for (var j = 0; j < h2; j++) {\n      last = 0;\n      for (var i = 0; i <= w2; i++) {\n        if ((last << msx | (i < w2 ? (last = sprite[j * w2 + i]) >>> sx : 0)) & board[x2 + i]) return true;\n      }\n      x2 += sw;\n    }\n    return false;\n  }\n  function cloudBounds(bounds2, d) {\n    var b0 = bounds2[0], b1 = bounds2[1];\n    if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0;\n    if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0;\n    if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1;\n    if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1;\n  }\n  function collideRects(a2, b2) {\n    return a2.x + a2.x1 > b2[0].x && a2.x + a2.x0 < b2[1].x && a2.y + a2.y1 > b2[0].y && a2.y + a2.y0 < b2[1].y;\n  }\n  function archimedeanSpiral(size2) {\n    var e = size2[0] / size2[1];\n    return function(t) {\n      return [e * (t *= 0.1) * Math.cos(t), t * Math.sin(t)];\n    };\n  }\n  function rectangularSpiral(size2) {\n    var dy = 4, dx = dy * size2[0] / size2[1], x2 = 0, y2 = 0;\n    return function(t) {\n      var sign2 = t < 0 ? -1 : 1;\n      switch (Math.sqrt(1 + 4 * sign2 * t) - sign2 & 3) {\n        case 0:\n          x2 += dx;\n          break;\n        case 1:\n          y2 += dy;\n          break;\n        case 2:\n          x2 -= dx;\n          break;\n        default:\n          y2 -= dy;\n          break;\n      }\n      return [x2, y2];\n    };\n  }\n  function zeroArray(n) {\n    var a2 = [], i = -1;\n    while (++i < n) a2[i] = 0;\n    return a2;\n  }\n  function functor(d) {\n    return typeof d === \"function\" ? d : function() {\n      return d;\n    };\n  }\n  var spirals = {\n    archimedean: archimedeanSpiral,\n    rectangular: rectangularSpiral\n  };\n  const Output = [\"x\", \"y\", \"font\", \"fontSize\", \"fontStyle\", \"fontWeight\", \"angle\"];\n  const Params$1 = [\"text\", \"font\", \"rotate\", \"fontSize\", \"fontStyle\", \"fontWeight\"];\n  function Wordcloud(params2) {\n    Transform.call(this, cloud(), params2);\n  }\n  Wordcloud.Definition = {\n    \"type\": \"Wordcloud\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"font\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"sans-serif\"\n    }, {\n      \"name\": \"fontStyle\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"normal\"\n    }, {\n      \"name\": \"fontWeight\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"normal\"\n    }, {\n      \"name\": \"fontSize\",\n      \"type\": \"number\",\n      \"expr\": true,\n      \"default\": 14\n    }, {\n      \"name\": \"fontSizeRange\",\n      \"type\": \"number\",\n      \"array\": \"nullable\",\n      \"default\": [10, 50]\n    }, {\n      \"name\": \"rotate\",\n      \"type\": \"number\",\n      \"expr\": true,\n      \"default\": 0\n    }, {\n      \"name\": \"text\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"spiral\",\n      \"type\": \"string\",\n      \"values\": [\"archimedean\", \"rectangular\"]\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 7,\n      \"default\": Output\n    }]\n  };\n  inherits(Wordcloud, Transform, {\n    transform(_, pulse2) {\n      if (_.size && !(_.size[0] && _.size[1])) {\n        error(\"Wordcloud size dimensions must be non-zero.\");\n      }\n      function modp(param2) {\n        const p = _[param2];\n        return isFunction(p) && pulse2.modified(p.fields);\n      }\n      const mod = _.modified();\n      if (!(mod || pulse2.changed(pulse2.ADD_REM) || Params$1.some(modp))) return;\n      const data2 = pulse2.materialize(pulse2.SOURCE).source, layout = this.value, as = _.as || Output;\n      let fontSize2 = _.fontSize || 14, range2;\n      isFunction(fontSize2) ? range2 = _.fontSizeRange : fontSize2 = constant$5(fontSize2);\n      if (range2) {\n        const fsize = fontSize2, sizeScale = scale$6(\"sqrt\")().domain(extent(data2, fsize)).range(range2);\n        fontSize2 = (x2) => sizeScale(fsize(x2));\n      }\n      data2.forEach((t) => {\n        t[as[0]] = NaN;\n        t[as[1]] = NaN;\n        t[as[3]] = 0;\n      });\n      const words = layout.words(data2).text(_.text).size(_.size || [500, 500]).padding(_.padding || 1).spiral(_.spiral || \"archimedean\").rotate(_.rotate || 0).font(_.font || \"sans-serif\").fontStyle(_.fontStyle || \"normal\").fontWeight(_.fontWeight || \"normal\").fontSize(fontSize2).random(random).layout();\n      const size2 = layout.size(), dx = size2[0] >> 1, dy = size2[1] >> 1, n = words.length;\n      for (let i = 0, w2, t; i < n; ++i) {\n        w2 = words[i];\n        t = w2.datum;\n        t[as[0]] = w2.x + dx;\n        t[as[1]] = w2.y + dy;\n        t[as[2]] = w2.font;\n        t[as[3]] = w2.size;\n        t[as[4]] = w2.style;\n        t[as[5]] = w2.weight;\n        t[as[6]] = w2.rotate;\n      }\n      return pulse2.reflow(mod).modifies(as);\n    }\n  });\n  const wordcloud = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    wordcloud: Wordcloud\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const array8 = (n) => new Uint8Array(n);\n  const array16 = (n) => new Uint16Array(n);\n  const array32 = (n) => new Uint32Array(n);\n  function Bitmaps() {\n    let width2 = 8, data2 = [], seen = array32(0), curr = array$1(0, width2), prev = array$1(0, width2);\n    return {\n      data: () => data2,\n      seen: () => seen = lengthen(seen, data2.length),\n      add(array2) {\n        for (let i = 0, j = data2.length, n = array2.length, t; i < n; ++i) {\n          t = array2[i];\n          t._index = j++;\n          data2.push(t);\n        }\n      },\n      remove(num, map2) {\n        const n = data2.length, copy2 = Array(n - num), reindex = data2;\n        let t, i, j;\n        for (i = 0; !map2[i] && i < n; ++i) {\n          copy2[i] = data2[i];\n          reindex[i] = i;\n        }\n        for (j = i; i < n; ++i) {\n          t = data2[i];\n          if (!map2[i]) {\n            reindex[i] = j;\n            curr[j] = curr[i];\n            prev[j] = prev[i];\n            copy2[j] = t;\n            t._index = j++;\n          } else {\n            reindex[i] = -1;\n          }\n          curr[i] = 0;\n        }\n        data2 = copy2;\n        return reindex;\n      },\n      size: () => data2.length,\n      curr: () => curr,\n      prev: () => prev,\n      reset: (k) => prev[k] = curr[k],\n      all: () => width2 < 257 ? 255 : width2 < 65537 ? 65535 : 4294967295,\n      set(k, one2) {\n        curr[k] |= one2;\n      },\n      clear(k, one2) {\n        curr[k] &= ~one2;\n      },\n      resize(n, m2) {\n        const k = curr.length;\n        if (n > k || m2 > width2) {\n          width2 = Math.max(m2, width2);\n          curr = array$1(n, width2, curr);\n          prev = array$1(n, width2);\n        }\n      }\n    };\n  }\n  function lengthen(array2, length2, copy2) {\n    if (array2.length >= length2) return array2;\n    copy2 = copy2 || new array2.constructor(length2);\n    copy2.set(array2);\n    return copy2;\n  }\n  function array$1(n, m2, array2) {\n    const copy2 = (m2 < 257 ? array8 : m2 < 65537 ? array16 : array32)(n);\n    if (array2) copy2.set(array2);\n    return copy2;\n  }\n  function Dimension(index2, i, query) {\n    const bit = 1 << i;\n    return {\n      one: bit,\n      zero: ~bit,\n      range: query.slice(),\n      bisect: index2.bisect,\n      index: index2.index,\n      size: index2.size,\n      onAdd(added, curr) {\n        const dim = this, range2 = dim.bisect(dim.range, added.value), idx = added.index, lo = range2[0], hi = range2[1], n1 = idx.length;\n        let i2;\n        for (i2 = 0; i2 < lo; ++i2) curr[idx[i2]] |= bit;\n        for (i2 = hi; i2 < n1; ++i2) curr[idx[i2]] |= bit;\n        return dim;\n      }\n    };\n  }\n  function SortedIndex() {\n    let index2 = array32(0), value2 = [], size2 = 0;\n    function insert2(key2, data2, base2) {\n      if (!data2.length) return [];\n      const n0 = size2, n1 = data2.length, addi = array32(n1);\n      let addv = Array(n1), oldv, oldi, i;\n      for (i = 0; i < n1; ++i) {\n        addv[i] = key2(data2[i]);\n        addi[i] = i;\n      }\n      addv = sort$1(addv, addi);\n      if (n0) {\n        oldv = value2;\n        oldi = index2;\n        value2 = Array(n0 + n1);\n        index2 = array32(n0 + n1);\n        merge$1(base2, oldv, oldi, n0, addv, addi, n1, value2, index2);\n      } else {\n        if (base2 > 0) for (i = 0; i < n1; ++i) {\n          addi[i] += base2;\n        }\n        value2 = addv;\n        index2 = addi;\n      }\n      size2 = n0 + n1;\n      return {\n        index: addi,\n        value: addv\n      };\n    }\n    function remove2(num, map2) {\n      const n = size2;\n      let idx, i, j;\n      for (i = 0; !map2[index2[i]] && i < n; ++i) ;\n      for (j = i; i < n; ++i) {\n        if (!map2[idx = index2[i]]) {\n          index2[j] = idx;\n          value2[j] = value2[i];\n          ++j;\n        }\n      }\n      size2 = n - num;\n    }\n    function reindex(map2) {\n      for (let i = 0, n = size2; i < n; ++i) {\n        index2[i] = map2[index2[i]];\n      }\n    }\n    function bisect2(range2, array2) {\n      let n;\n      if (array2) {\n        n = array2.length;\n      } else {\n        array2 = value2;\n        n = size2;\n      }\n      return [bisectLeft$1(array2, range2[0], 0, n), bisectRight$1(array2, range2[1], 0, n)];\n    }\n    return {\n      insert: insert2,\n      remove: remove2,\n      bisect: bisect2,\n      reindex,\n      index: () => index2,\n      size: () => size2\n    };\n  }\n  function sort$1(values2, index2) {\n    values2.sort.call(index2, (a2, b2) => {\n      const x2 = values2[a2], y2 = values2[b2];\n      return x2 < y2 ? -1 : x2 > y2 ? 1 : 0;\n    });\n    return permute(values2, index2);\n  }\n  function merge$1(base2, value0, index0, n0, value1, index1, n1, value2, index2) {\n    let i0 = 0, i1 = 0, i;\n    for (i = 0; i0 < n0 && i1 < n1; ++i) {\n      if (value0[i0] < value1[i1]) {\n        value2[i] = value0[i0];\n        index2[i] = index0[i0++];\n      } else {\n        value2[i] = value1[i1];\n        index2[i] = index1[i1++] + base2;\n      }\n    }\n    for (; i0 < n0; ++i0, ++i) {\n      value2[i] = value0[i0];\n      index2[i] = index0[i0];\n    }\n    for (; i1 < n1; ++i1, ++i) {\n      value2[i] = value1[i1];\n      index2[i] = index1[i1] + base2;\n    }\n  }\n  function CrossFilter(params2) {\n    Transform.call(this, Bitmaps(), params2);\n    this._indices = null;\n    this._dims = null;\n  }\n  CrossFilter.Definition = {\n    \"type\": \"CrossFilter\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"query\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"required\": true,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }]\n  };\n  inherits(CrossFilter, Transform, {\n    transform(_, pulse2) {\n      if (!this._dims) {\n        return this.init(_, pulse2);\n      } else {\n        var init2 = _.modified(\"fields\") || _.fields.some((f) => pulse2.modified(f.fields));\n        return init2 ? this.reinit(_, pulse2) : this.eval(_, pulse2);\n      }\n    },\n    init(_, pulse2) {\n      const fields = _.fields, query = _.query, indices = this._indices = {}, dims = this._dims = [], m2 = query.length;\n      let i = 0, key2, index2;\n      for (; i < m2; ++i) {\n        key2 = fields[i].fname;\n        index2 = indices[key2] || (indices[key2] = SortedIndex());\n        dims.push(Dimension(index2, i, query[i]));\n      }\n      return this.eval(_, pulse2);\n    },\n    reinit(_, pulse2) {\n      const output2 = pulse2.materialize().fork(), fields = _.fields, query = _.query, indices = this._indices, dims = this._dims, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), out = output2.rem = output2.add, mod = output2.mod, m2 = query.length, adds = {};\n      let add2, index2, key2, mods, remMap, modMap, i, n, f;\n      prev.set(curr);\n      if (pulse2.rem.length) {\n        remMap = this.remove(_, pulse2, output2);\n      }\n      if (pulse2.add.length) {\n        bits.add(pulse2.add);\n      }\n      if (pulse2.mod.length) {\n        modMap = {};\n        for (mods = pulse2.mod, i = 0, n = mods.length; i < n; ++i) {\n          modMap[mods[i]._index] = 1;\n        }\n      }\n      for (i = 0; i < m2; ++i) {\n        f = fields[i];\n        if (!dims[i] || _.modified(\"fields\", i) || pulse2.modified(f.fields)) {\n          key2 = f.fname;\n          if (!(add2 = adds[key2])) {\n            indices[key2] = index2 = SortedIndex();\n            adds[key2] = add2 = index2.insert(f, pulse2.source, 0);\n          }\n          dims[i] = Dimension(index2, i, query[i]).onAdd(add2, curr);\n        }\n      }\n      for (i = 0, n = bits.data().length; i < n; ++i) {\n        if (remMap[i]) {\n          continue;\n        } else if (prev[i] !== curr[i]) {\n          out.push(i);\n        } else if (modMap[i] && curr[i] !== all) {\n          mod.push(i);\n        }\n      }\n      bits.mask = (1 << m2) - 1;\n      return output2;\n    },\n    eval(_, pulse2) {\n      const output2 = pulse2.materialize().fork(), m2 = this._dims.length;\n      let mask = 0;\n      if (pulse2.rem.length) {\n        this.remove(_, pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      if (_.modified(\"query\") && !_.modified(\"fields\")) {\n        mask |= this.update(_, pulse2, output2);\n      }\n      if (pulse2.add.length) {\n        this.insert(_, pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      if (pulse2.mod.length) {\n        this.modify(pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      this.value.mask = mask;\n      return output2;\n    },\n    insert(_, pulse2, output2) {\n      const tuples = pulse2.add, bits = this.value, dims = this._dims, indices = this._indices, fields = _.fields, adds = {}, out = output2.add, n = bits.size() + tuples.length, m2 = dims.length;\n      let k = bits.size(), j, key2, add2;\n      bits.resize(n, m2);\n      bits.add(tuples);\n      const curr = bits.curr(), prev = bits.prev(), all = bits.all();\n      for (j = 0; j < m2; ++j) {\n        key2 = fields[j].fname;\n        add2 = adds[key2] || (adds[key2] = indices[key2].insert(fields[j], tuples, k));\n        dims[j].onAdd(add2, curr);\n      }\n      for (; k < n; ++k) {\n        prev[k] = all;\n        if (curr[k] !== all) out.push(k);\n      }\n    },\n    modify(pulse2, output2) {\n      const out = output2.mod, bits = this.value, curr = bits.curr(), all = bits.all(), tuples = pulse2.mod;\n      let i, n, k;\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        k = tuples[i]._index;\n        if (curr[k] !== all) out.push(k);\n      }\n    },\n    remove(_, pulse2, output2) {\n      const indices = this._indices, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), map2 = {}, out = output2.rem, tuples = pulse2.rem;\n      let i, n, k, f;\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        k = tuples[i]._index;\n        map2[k] = 1;\n        prev[k] = f = curr[k];\n        curr[k] = all;\n        if (f !== all) out.push(k);\n      }\n      for (k in indices) {\n        indices[k].remove(n, map2);\n      }\n      this.reindex(pulse2, n, map2);\n      return map2;\n    },\n    // reindex filters and indices after propagation completes\n    reindex(pulse2, num, map2) {\n      const indices = this._indices, bits = this.value;\n      pulse2.runAfter(() => {\n        const indexMap = bits.remove(num, map2);\n        for (const key2 in indices) indices[key2].reindex(indexMap);\n      });\n    },\n    update(_, pulse2, output2) {\n      const dims = this._dims, query = _.query, stamp = pulse2.stamp, m2 = dims.length;\n      let mask = 0, i, q;\n      output2.filters = 0;\n      for (q = 0; q < m2; ++q) {\n        if (_.modified(\"query\", q)) {\n          i = q;\n          ++mask;\n        }\n      }\n      if (mask === 1) {\n        mask = dims[i].one;\n        this.incrementOne(dims[i], query[i], output2.add, output2.rem);\n      } else {\n        for (q = 0, mask = 0; q < m2; ++q) {\n          if (!_.modified(\"query\", q)) continue;\n          mask |= dims[q].one;\n          this.incrementAll(dims[q], query[q], stamp, output2.add);\n          output2.rem = output2.add;\n        }\n      }\n      return mask;\n    },\n    incrementAll(dim, query, stamp, out) {\n      const bits = this.value, seen = bits.seen(), curr = bits.curr(), prev = bits.prev(), index2 = dim.index(), old = dim.bisect(dim.range), range2 = dim.bisect(query), lo1 = range2[0], hi1 = range2[1], lo0 = old[0], hi0 = old[1], one2 = dim.one;\n      let i, j, k;\n      if (lo1 < lo0) {\n        for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      } else if (lo1 > lo0) {\n        for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      }\n      if (hi1 > hi0) {\n        for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      } else if (hi1 < hi0) {\n        for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      }\n      dim.range = query.slice();\n    },\n    incrementOne(dim, query, add2, rem2) {\n      const bits = this.value, curr = bits.curr(), index2 = dim.index(), old = dim.bisect(dim.range), range2 = dim.bisect(query), lo1 = range2[0], hi1 = range2[1], lo0 = old[0], hi0 = old[1], one2 = dim.one;\n      let i, j, k;\n      if (lo1 < lo0) {\n        for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          add2.push(k);\n        }\n      } else if (lo1 > lo0) {\n        for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          rem2.push(k);\n        }\n      }\n      if (hi1 > hi0) {\n        for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          add2.push(k);\n        }\n      } else if (hi1 < hi0) {\n        for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          rem2.push(k);\n        }\n      }\n      dim.range = query.slice();\n    }\n  });\n  function ResolveFilter(params2) {\n    Transform.call(this, null, params2);\n  }\n  ResolveFilter.Definition = {\n    \"type\": \"ResolveFilter\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"ignore\",\n      \"type\": \"number\",\n      \"required\": true,\n      \"description\": \"A bit mask indicating which filters to ignore.\"\n    }, {\n      \"name\": \"filter\",\n      \"type\": \"object\",\n      \"required\": true,\n      \"description\": \"Per-tuple filter bitmaps from a CrossFilter transform.\"\n    }]\n  };\n  inherits(ResolveFilter, Transform, {\n    transform(_, pulse2) {\n      const ignore = ~(_.ignore || 0), bitmap = _.filter, mask = bitmap.mask;\n      if ((mask & ignore) === 0) return pulse2.StopPropagation;\n      const output2 = pulse2.fork(pulse2.ALL), data2 = bitmap.data(), curr = bitmap.curr(), prev = bitmap.prev(), pass = (k) => !(curr[k] & ignore) ? data2[k] : null;\n      output2.filter(output2.MOD, pass);\n      if (!(mask & mask - 1)) {\n        output2.filter(output2.ADD, pass);\n        output2.filter(output2.REM, (k) => (curr[k] & ignore) === mask ? data2[k] : null);\n      } else {\n        output2.filter(output2.ADD, (k) => {\n          const c2 = curr[k] & ignore, f = !c2 && c2 ^ prev[k] & ignore;\n          return f ? data2[k] : null;\n        });\n        output2.filter(output2.REM, (k) => {\n          const c2 = curr[k] & ignore, f = c2 && !(c2 ^ (c2 ^ prev[k] & ignore));\n          return f ? data2[k] : null;\n        });\n      }\n      return output2.filter(output2.SOURCE, (t) => pass(t._index));\n    }\n  });\n  const xf = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    crossfilter: CrossFilter,\n    resolvefilter: ResolveFilter\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const RawCode = \"RawCode\";\n  const Literal = \"Literal\";\n  const Property = \"Property\";\n  const Identifier = \"Identifier\";\n  const ArrayExpression = \"ArrayExpression\";\n  const BinaryExpression = \"BinaryExpression\";\n  const CallExpression = \"CallExpression\";\n  const ConditionalExpression = \"ConditionalExpression\";\n  const LogicalExpression = \"LogicalExpression\";\n  const MemberExpression = \"MemberExpression\";\n  const ObjectExpression = \"ObjectExpression\";\n  const UnaryExpression = \"UnaryExpression\";\n  function ASTNode(type2) {\n    this.type = type2;\n  }\n  ASTNode.prototype.visit = function(visitor) {\n    let c2, i, n;\n    if (visitor(this)) return 1;\n    for (c2 = children(this), i = 0, n = c2.length; i < n; ++i) {\n      if (c2[i].visit(visitor)) return 1;\n    }\n  };\n  function children(node) {\n    switch (node.type) {\n      case ArrayExpression:\n        return node.elements;\n      case BinaryExpression:\n      case LogicalExpression:\n        return [node.left, node.right];\n      case CallExpression:\n        return [node.callee].concat(node.arguments);\n      case ConditionalExpression:\n        return [node.test, node.consequent, node.alternate];\n      case MemberExpression:\n        return [node.object, node.property];\n      case ObjectExpression:\n        return node.properties;\n      case Property:\n        return [node.key, node.value];\n      case UnaryExpression:\n        return [node.argument];\n      case Identifier:\n      case Literal:\n      case RawCode:\n      default:\n        return [];\n    }\n  }\n  var TokenName, source, index, length$1, lookahead;\n  var TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\n  TokenName = {};\n  TokenName[TokenBooleanLiteral] = \"Boolean\";\n  TokenName[TokenEOF] = \"<end>\";\n  TokenName[TokenIdentifier] = \"Identifier\";\n  TokenName[TokenKeyword] = \"Keyword\";\n  TokenName[TokenNullLiteral] = \"Null\";\n  TokenName[TokenNumericLiteral] = \"Numeric\";\n  TokenName[TokenPunctuator] = \"Punctuator\";\n  TokenName[TokenStringLiteral] = \"String\";\n  TokenName[TokenRegularExpression] = \"RegularExpression\";\n  var SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\";\n  var MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\n  var ILLEGAL$1 = \"ILLEGAL\", DISABLED = \"Disabled.\";\n  var RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), RegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\");\n  function assert(condition, message) {\n    if (!condition) {\n      throw new Error(\"ASSERT: \" + message);\n    }\n  }\n  function isDecimalDigit(ch2) {\n    return ch2 >= 48 && ch2 <= 57;\n  }\n  function isHexDigit(ch2) {\n    return \"0123456789abcdefABCDEF\".includes(ch2);\n  }\n  function isOctalDigit(ch2) {\n    return \"01234567\".includes(ch2);\n  }\n  function isWhiteSpace(ch2) {\n    return ch2 === 32 || ch2 === 9 || ch2 === 11 || ch2 === 12 || ch2 === 160 || ch2 >= 5760 && [5760, 6158, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8239, 8287, 12288, 65279].includes(ch2);\n  }\n  function isLineTerminator(ch2) {\n    return ch2 === 10 || ch2 === 13 || ch2 === 8232 || ch2 === 8233;\n  }\n  function isIdentifierStart(ch2) {\n    return ch2 === 36 || ch2 === 95 || // $ (dollar) and _ (underscore)\n    ch2 >= 65 && ch2 <= 90 || // A..Z\n    ch2 >= 97 && ch2 <= 122 || // a..z\n    ch2 === 92 || // \\ (backslash)\n    ch2 >= 128 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch2));\n  }\n  function isIdentifierPart(ch2) {\n    return ch2 === 36 || ch2 === 95 || // $ (dollar) and _ (underscore)\n    ch2 >= 65 && ch2 <= 90 || // A..Z\n    ch2 >= 97 && ch2 <= 122 || // a..z\n    ch2 >= 48 && ch2 <= 57 || // 0..9\n    ch2 === 92 || // \\ (backslash)\n    ch2 >= 128 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch2));\n  }\n  const keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n  };\n  function skipComment() {\n    while (index < length$1) {\n      const ch2 = source.charCodeAt(index);\n      if (isWhiteSpace(ch2) || isLineTerminator(ch2)) {\n        ++index;\n      } else {\n        break;\n      }\n    }\n  }\n  function scanHexEscape(prefix) {\n    var i, len2, ch2, code = 0;\n    len2 = prefix === \"u\" ? 4 : 2;\n    for (i = 0; i < len2; ++i) {\n      if (index < length$1 && isHexDigit(source[index])) {\n        ch2 = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch2.toLowerCase());\n      } else {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n    }\n    return String.fromCharCode(code);\n  }\n  function scanUnicodeCodePointEscape() {\n    var ch2, code, cu1, cu2;\n    ch2 = source[index];\n    code = 0;\n    if (ch2 === \"}\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    while (index < length$1) {\n      ch2 = source[index++];\n      if (!isHexDigit(ch2)) {\n        break;\n      }\n      code = code * 16 + \"0123456789abcdef\".indexOf(ch2.toLowerCase());\n    }\n    if (code > 1114111 || ch2 !== \"}\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (code <= 65535) {\n      return String.fromCharCode(code);\n    }\n    cu1 = (code - 65536 >> 10) + 55296;\n    cu2 = (code - 65536 & 1023) + 56320;\n    return String.fromCharCode(cu1, cu2);\n  }\n  function getEscapedIdentifier() {\n    var ch2, id2;\n    ch2 = source.charCodeAt(index++);\n    id2 = String.fromCharCode(ch2);\n    if (ch2 === 92) {\n      if (source.charCodeAt(index) !== 117) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n      ++index;\n      ch2 = scanHexEscape(\"u\");\n      if (!ch2 || ch2 === \"\\\\\" || !isIdentifierStart(ch2.charCodeAt(0))) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n      id2 = ch2;\n    }\n    while (index < length$1) {\n      ch2 = source.charCodeAt(index);\n      if (!isIdentifierPart(ch2)) {\n        break;\n      }\n      ++index;\n      id2 += String.fromCharCode(ch2);\n      if (ch2 === 92) {\n        id2 = id2.substr(0, id2.length - 1);\n        if (source.charCodeAt(index) !== 117) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n        ++index;\n        ch2 = scanHexEscape(\"u\");\n        if (!ch2 || ch2 === \"\\\\\" || !isIdentifierPart(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n        id2 += ch2;\n      }\n    }\n    return id2;\n  }\n  function getIdentifier() {\n    var start, ch2;\n    start = index++;\n    while (index < length$1) {\n      ch2 = source.charCodeAt(index);\n      if (ch2 === 92) {\n        index = start;\n        return getEscapedIdentifier();\n      }\n      if (isIdentifierPart(ch2)) {\n        ++index;\n      } else {\n        break;\n      }\n    }\n    return source.slice(start, index);\n  }\n  function scanIdentifier() {\n    var start, id2, type2;\n    start = index;\n    id2 = source.charCodeAt(index) === 92 ? getEscapedIdentifier() : getIdentifier();\n    if (id2.length === 1) {\n      type2 = TokenIdentifier;\n    } else if (keywords.hasOwnProperty(id2)) {\n      type2 = TokenKeyword;\n    } else if (id2 === \"null\") {\n      type2 = TokenNullLiteral;\n    } else if (id2 === \"true\" || id2 === \"false\") {\n      type2 = TokenBooleanLiteral;\n    } else {\n      type2 = TokenIdentifier;\n    }\n    return {\n      type: type2,\n      value: id2,\n      start,\n      end: index\n    };\n  }\n  function scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch (code) {\n      // Check for most common single-character punctuators.\n      case 46:\n      // . dot\n      case 40:\n      // ( open bracket\n      case 41:\n      // ) close bracket\n      case 59:\n      // ; semicolon\n      case 44:\n      // , comma\n      case 123:\n      // { open curly brace\n      case 125:\n      // } close curly brace\n      case 91:\n      // [\n      case 93:\n      // ]\n      case 58:\n      // :\n      case 63:\n      // ?\n      case 126:\n        ++index;\n        return {\n          type: TokenPunctuator,\n          value: String.fromCharCode(code),\n          start,\n          end: index\n        };\n      default:\n        code2 = source.charCodeAt(index + 1);\n        if (code2 === 61) {\n          switch (code) {\n            case 43:\n            // +\n            case 45:\n            // -\n            case 47:\n            // /\n            case 60:\n            // <\n            case 62:\n            // >\n            case 94:\n            // ^\n            case 124:\n            // |\n            case 37:\n            // %\n            case 38:\n            // &\n            case 42:\n              index += 2;\n              return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code) + String.fromCharCode(code2),\n                start,\n                end: index\n              };\n            case 33:\n            // !\n            case 61:\n              index += 2;\n              if (source.charCodeAt(index) === 61) {\n                ++index;\n              }\n              return {\n                type: TokenPunctuator,\n                value: source.slice(start, index),\n                start,\n                end: index\n              };\n          }\n        }\n    }\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n      index += 4;\n      return {\n        type: TokenPunctuator,\n        value: ch4,\n        start,\n        end: index\n      };\n    }\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n      index += 3;\n      return {\n        type: TokenPunctuator,\n        value: ch3,\n        start,\n        end: index\n      };\n    }\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".includes(ch1) || ch2 === \"=>\") {\n      index += 2;\n      return {\n        type: TokenPunctuator,\n        value: ch2,\n        start,\n        end: index\n      };\n    }\n    if (ch2 === \"//\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (\"<>=!+-*%&|^/\".includes(ch1)) {\n      ++index;\n      return {\n        type: TokenPunctuator,\n        value: ch1,\n        start,\n        end: index\n      };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n  }\n  function scanHexLiteral(start) {\n    let number2 = \"\";\n    while (index < length$1) {\n      if (!isHexDigit(source[index])) {\n        break;\n      }\n      number2 += source[index++];\n    }\n    if (number2.length === 0) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseInt(\"0x\" + number2, 16),\n      start,\n      end: index\n    };\n  }\n  function scanOctalLiteral(start) {\n    let number2 = \"0\" + source[index++];\n    while (index < length$1) {\n      if (!isOctalDigit(source[index])) {\n        break;\n      }\n      number2 += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseInt(number2, 8),\n      octal: true,\n      start,\n      end: index\n    };\n  }\n  function scanNumericLiteral() {\n    var number2, start, ch2;\n    ch2 = source[index];\n    assert(isDecimalDigit(ch2.charCodeAt(0)) || ch2 === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number2 = \"\";\n    if (ch2 !== \".\") {\n      number2 = source[index++];\n      ch2 = source[index];\n      if (number2 === \"0\") {\n        if (ch2 === \"x\" || ch2 === \"X\") {\n          ++index;\n          return scanHexLiteral(start);\n        }\n        if (isOctalDigit(ch2)) {\n          return scanOctalLiteral(start);\n        }\n        if (ch2 && isDecimalDigit(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n      }\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number2 += source[index++];\n      }\n      ch2 = source[index];\n    }\n    if (ch2 === \".\") {\n      number2 += source[index++];\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number2 += source[index++];\n      }\n      ch2 = source[index];\n    }\n    if (ch2 === \"e\" || ch2 === \"E\") {\n      number2 += source[index++];\n      ch2 = source[index];\n      if (ch2 === \"+\" || ch2 === \"-\") {\n        number2 += source[index++];\n      }\n      if (isDecimalDigit(source.charCodeAt(index))) {\n        while (isDecimalDigit(source.charCodeAt(index))) {\n          number2 += source[index++];\n        }\n      } else {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseFloat(number2),\n      start,\n      end: index\n    };\n  }\n  function scanStringLiteral() {\n    var str = \"\", quote, start, ch2, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while (index < length$1) {\n      ch2 = source[index++];\n      if (ch2 === quote) {\n        quote = \"\";\n        break;\n      } else if (ch2 === \"\\\\\") {\n        ch2 = source[index++];\n        if (!ch2 || !isLineTerminator(ch2.charCodeAt(0))) {\n          switch (ch2) {\n            case \"u\":\n            case \"x\":\n              if (source[index] === \"{\") {\n                ++index;\n                str += scanUnicodeCodePointEscape();\n              } else {\n                str += scanHexEscape(ch2);\n              }\n              break;\n            case \"n\":\n              str += \"\\n\";\n              break;\n            case \"r\":\n              str += \"\\r\";\n              break;\n            case \"t\":\n              str += \"\t\";\n              break;\n            case \"b\":\n              str += \"\\b\";\n              break;\n            case \"f\":\n              str += \"\\f\";\n              break;\n            case \"v\":\n              str += \"\\v\";\n              break;\n            default:\n              if (isOctalDigit(ch2)) {\n                code = \"01234567\".indexOf(ch2);\n                if (code !== 0) {\n                  octal = true;\n                }\n                if (index < length$1 && isOctalDigit(source[index])) {\n                  octal = true;\n                  code = code * 8 + \"01234567\".indexOf(source[index++]);\n                  if (\"0123\".includes(ch2) && index < length$1 && isOctalDigit(source[index])) {\n                    code = code * 8 + \"01234567\".indexOf(source[index++]);\n                  }\n                }\n                str += String.fromCharCode(code);\n              } else {\n                str += ch2;\n              }\n              break;\n          }\n        } else {\n          if (ch2 === \"\\r\" && source[index] === \"\\n\") {\n            ++index;\n          }\n        }\n      } else if (isLineTerminator(ch2.charCodeAt(0))) {\n        break;\n      } else {\n        str += ch2;\n      }\n    }\n    if (quote !== \"\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenStringLiteral,\n      value: str,\n      octal,\n      start,\n      end: index\n    };\n  }\n  function testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.includes(\"u\")) {\n      tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1) => {\n        if (parseInt($1, 16) <= 1114111) {\n          return \"x\";\n        }\n        throwError({}, MessageInvalidRegExp);\n      }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n    }\n    try {\n      new RegExp(tmp);\n    } catch (e) {\n      throwError({}, MessageInvalidRegExp);\n    }\n    try {\n      return new RegExp(pattern, flags);\n    } catch (exception) {\n      return null;\n    }\n  }\n  function scanRegExpBody() {\n    var ch2, str, classMarker, terminated, body;\n    ch2 = source[index];\n    assert(ch2 === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while (index < length$1) {\n      ch2 = source[index++];\n      str += ch2;\n      if (ch2 === \"\\\\\") {\n        ch2 = source[index++];\n        if (isLineTerminator(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnterminatedRegExp);\n        }\n        str += ch2;\n      } else if (isLineTerminator(ch2.charCodeAt(0))) {\n        throwError({}, MessageUnterminatedRegExp);\n      } else if (classMarker) {\n        if (ch2 === \"]\") {\n          classMarker = false;\n        }\n      } else {\n        if (ch2 === \"/\") {\n          terminated = true;\n          break;\n        } else if (ch2 === \"[\") {\n          classMarker = true;\n        }\n      }\n    }\n    if (!terminated) {\n      throwError({}, MessageUnterminatedRegExp);\n    }\n    body = str.substr(1, str.length - 2);\n    return {\n      value: body,\n      literal: str\n    };\n  }\n  function scanRegExpFlags() {\n    var ch2, str, flags;\n    str = \"\";\n    flags = \"\";\n    while (index < length$1) {\n      ch2 = source[index];\n      if (!isIdentifierPart(ch2.charCodeAt(0))) {\n        break;\n      }\n      ++index;\n      if (ch2 === \"\\\\\" && index < length$1) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      } else {\n        flags += ch2;\n        str += ch2;\n      }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) {\n      throwError({}, MessageInvalidRegExp, flags);\n    }\n    return {\n      value: flags,\n      literal: str\n    };\n  }\n  function scanRegExp() {\n    var start, body, flags, value2;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value2 = testRegExp(body.value, flags.value);\n    return {\n      literal: body.literal + flags.literal,\n      value: value2,\n      regex: {\n        pattern: body.value,\n        flags: flags.value\n      },\n      start,\n      end: index\n    };\n  }\n  function isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n  }\n  function advance() {\n    skipComment();\n    if (index >= length$1) {\n      return {\n        type: TokenEOF,\n        start: index,\n        end: index\n      };\n    }\n    const ch2 = source.charCodeAt(index);\n    if (isIdentifierStart(ch2)) {\n      return scanIdentifier();\n    }\n    if (ch2 === 40 || ch2 === 41 || ch2 === 59) {\n      return scanPunctuator();\n    }\n    if (ch2 === 39 || ch2 === 34) {\n      return scanStringLiteral();\n    }\n    if (ch2 === 46) {\n      if (isDecimalDigit(source.charCodeAt(index + 1))) {\n        return scanNumericLiteral();\n      }\n      return scanPunctuator();\n    }\n    if (isDecimalDigit(ch2)) {\n      return scanNumericLiteral();\n    }\n    return scanPunctuator();\n  }\n  function lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n  }\n  function peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n  }\n  function finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n  }\n  function finishBinaryExpression(operator2, left, right) {\n    const node = new ASTNode(operator2 === \"||\" || operator2 === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator2;\n    node.left = left;\n    node.right = right;\n    return node;\n  }\n  function finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n  }\n  function finishConditionalExpression(test2, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test2;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n  }\n  function finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n  }\n  function finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n      if (node.raw === \"//\") {\n        node.raw = \"/(?:)/\";\n      }\n      node.regex = token.regex;\n    }\n    return node;\n  }\n  function finishMemberExpression(accessor2, object2, property2) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor2 === \"[\";\n    node.object = object2;\n    node.property = property2;\n    if (!node.computed) property2.member = true;\n    return node;\n  }\n  function finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n  }\n  function finishProperty(kind, key2, value2) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key2;\n    node.value = value2;\n    node.kind = kind;\n    return node;\n  }\n  function finishUnaryExpression(operator2, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator2;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n  }\n  function throwError(token, messageFormat) {\n    var error2, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index2) => {\n      assert(index2 < args.length, \"Message reference must be in range\");\n      return args[index2];\n    });\n    error2 = new Error(msg);\n    error2.index = index;\n    error2.description = msg;\n    throw error2;\n  }\n  function throwUnexpected(token) {\n    if (token.type === TokenEOF) {\n      throwError(token, MessageUnexpectedEOS);\n    }\n    if (token.type === TokenNumericLiteral) {\n      throwError(token, MessageUnexpectedNumber);\n    }\n    if (token.type === TokenStringLiteral) {\n      throwError(token, MessageUnexpectedString);\n    }\n    if (token.type === TokenIdentifier) {\n      throwError(token, MessageUnexpectedIdentifier);\n    }\n    if (token.type === TokenKeyword) {\n      throwError(token, MessageUnexpectedReserved);\n    }\n    throwError(token, MessageUnexpectedToken, token.value);\n  }\n  function expect(value2) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value2) {\n      throwUnexpected(token);\n    }\n  }\n  function match(value2) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value2;\n  }\n  function matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n  }\n  function parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while (!match(\"]\")) {\n      if (match(\",\")) {\n        lex();\n        elements.push(null);\n      } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) {\n          expect(\",\");\n        }\n      }\n    }\n    lex();\n    return finishArrayExpression(elements);\n  }\n  function parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex();\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n      if (token.octal) {\n        throwError(token, MessageStrictOctalLiteral);\n      }\n      return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n  }\n  function parseObjectProperty() {\n    var token, key2, id2, value2;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n      id2 = parseObjectPropertyKey();\n      expect(\":\");\n      value2 = parseConditionalExpression();\n      return finishProperty(\"init\", id2, value2);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) {\n      throwUnexpected(token);\n    } else {\n      key2 = parseObjectPropertyKey();\n      expect(\":\");\n      value2 = parseConditionalExpression();\n      return finishProperty(\"init\", key2, value2);\n    }\n  }\n  function parseObjectInitialiser() {\n    var properties = [], property2, name, key2, map2 = {}, toString2 = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while (!match(\"}\")) {\n      property2 = parseObjectProperty();\n      if (property2.key.type === SyntaxIdentifier) {\n        name = property2.key.name;\n      } else {\n        name = toString2(property2.key.value);\n      }\n      key2 = \"$\" + name;\n      if (Object.prototype.hasOwnProperty.call(map2, key2)) {\n        throwError({}, MessageStrictDuplicateProperty);\n      } else {\n        map2[key2] = true;\n      }\n      properties.push(property2);\n      if (!match(\"}\")) {\n        expect(\",\");\n      }\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n  }\n  function parseGroupExpression() {\n    expect(\"(\");\n    const expr2 = parseExpression();\n    expect(\")\");\n    return expr2;\n  }\n  const legalKeywords = {\n    \"if\": 1\n  };\n  function parsePrimaryExpression() {\n    var type2, token, expr2;\n    if (match(\"(\")) {\n      return parseGroupExpression();\n    }\n    if (match(\"[\")) {\n      return parseArrayInitialiser();\n    }\n    if (match(\"{\")) {\n      return parseObjectInitialiser();\n    }\n    type2 = lookahead.type;\n    index = lookahead.start;\n    if (type2 === TokenIdentifier || legalKeywords[lookahead.value]) {\n      expr2 = finishIdentifier(lex().value);\n    } else if (type2 === TokenStringLiteral || type2 === TokenNumericLiteral) {\n      if (lookahead.octal) {\n        throwError(lookahead, MessageStrictOctalLiteral);\n      }\n      expr2 = finishLiteral(lex());\n    } else if (type2 === TokenKeyword) {\n      throw new Error(DISABLED);\n    } else if (type2 === TokenBooleanLiteral) {\n      token = lex();\n      token.value = token.value === \"true\";\n      expr2 = finishLiteral(token);\n    } else if (type2 === TokenNullLiteral) {\n      token = lex();\n      token.value = null;\n      expr2 = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n      expr2 = finishLiteral(scanRegExp());\n      peek();\n    } else {\n      throwUnexpected(lex());\n    }\n    return expr2;\n  }\n  function parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) {\n      while (index < length$1) {\n        args.push(parseConditionalExpression());\n        if (match(\")\")) {\n          break;\n        }\n        expect(\",\");\n      }\n    }\n    expect(\")\");\n    return args;\n  }\n  function parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) {\n      throwUnexpected(token);\n    }\n    return finishIdentifier(token.value);\n  }\n  function parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n  }\n  function parseComputedMember() {\n    expect(\"[\");\n    const expr2 = parseExpression();\n    expect(\"]\");\n    return expr2;\n  }\n  function parseLeftHandSideExpressionAllowCall() {\n    var expr2, args, property2;\n    expr2 = parsePrimaryExpression();\n    for (; ; ) {\n      if (match(\".\")) {\n        property2 = parseNonComputedMember();\n        expr2 = finishMemberExpression(\".\", expr2, property2);\n      } else if (match(\"(\")) {\n        args = parseArguments();\n        expr2 = finishCallExpression(expr2, args);\n      } else if (match(\"[\")) {\n        property2 = parseComputedMember();\n        expr2 = finishMemberExpression(\"[\", expr2, property2);\n      } else {\n        break;\n      }\n    }\n    return expr2;\n  }\n  function parsePostfixExpression() {\n    const expr2 = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n      if (match(\"++\") || match(\"--\")) {\n        throw new Error(DISABLED);\n      }\n    }\n    return expr2;\n  }\n  function parseUnaryExpression() {\n    var token, expr2;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) {\n      expr2 = parsePostfixExpression();\n    } else if (match(\"++\") || match(\"--\")) {\n      throw new Error(DISABLED);\n    } else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n      token = lex();\n      expr2 = parseUnaryExpression();\n      expr2 = finishUnaryExpression(token.value, expr2);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) {\n      throw new Error(DISABLED);\n    } else {\n      expr2 = parsePostfixExpression();\n    }\n    return expr2;\n  }\n  function binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) {\n      return 0;\n    }\n    switch (token.value) {\n      case \"||\":\n        prec = 1;\n        break;\n      case \"&&\":\n        prec = 2;\n        break;\n      case \"|\":\n        prec = 3;\n        break;\n      case \"^\":\n        prec = 4;\n        break;\n      case \"&\":\n        prec = 5;\n        break;\n      case \"==\":\n      case \"!=\":\n      case \"===\":\n      case \"!==\":\n        prec = 6;\n        break;\n      case \"<\":\n      case \">\":\n      case \"<=\":\n      case \">=\":\n      case \"instanceof\":\n      case \"in\":\n        prec = 7;\n        break;\n      case \"<<\":\n      case \">>\":\n      case \">>>\":\n        prec = 8;\n        break;\n      case \"+\":\n      case \"-\":\n        prec = 9;\n        break;\n      case \"*\":\n      case \"/\":\n      case \"%\":\n        prec = 11;\n        break;\n    }\n    return prec;\n  }\n  function parseBinaryExpression() {\n    var marker, markers, expr2, token, prec, stack, right, operator2, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) {\n      return left;\n    }\n    token.prec = prec;\n    lex();\n    markers = [marker, lookahead];\n    right = parseUnaryExpression();\n    stack = [left, token, right];\n    while ((prec = binaryPrecedence(lookahead)) > 0) {\n      while (stack.length > 2 && prec <= stack[stack.length - 2].prec) {\n        right = stack.pop();\n        operator2 = stack.pop().value;\n        left = stack.pop();\n        markers.pop();\n        expr2 = finishBinaryExpression(operator2, left, right);\n        stack.push(expr2);\n      }\n      token = lex();\n      token.prec = prec;\n      stack.push(token);\n      markers.push(lookahead);\n      expr2 = parseUnaryExpression();\n      stack.push(expr2);\n    }\n    i = stack.length - 1;\n    expr2 = stack[i];\n    markers.pop();\n    while (i > 1) {\n      markers.pop();\n      expr2 = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr2);\n      i -= 2;\n    }\n    return expr2;\n  }\n  function parseConditionalExpression() {\n    var expr2, consequent, alternate;\n    expr2 = parseBinaryExpression();\n    if (match(\"?\")) {\n      lex();\n      consequent = parseConditionalExpression();\n      expect(\":\");\n      alternate = parseConditionalExpression();\n      expr2 = finishConditionalExpression(expr2, consequent, alternate);\n    }\n    return expr2;\n  }\n  function parseExpression() {\n    const expr2 = parseConditionalExpression();\n    if (match(\",\")) {\n      throw new Error(DISABLED);\n    }\n    return expr2;\n  }\n  function parser$1(code) {\n    source = code;\n    index = 0;\n    length$1 = source.length;\n    lookahead = null;\n    peek();\n    const expr2 = parseExpression();\n    if (lookahead.type !== TokenEOF) {\n      throw new Error(\"Unexpect token after expression.\");\n    }\n    return expr2;\n  }\n  var Constants$1 = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n  };\n  function Functions(codegen2) {\n    function fncall(name, args, cast, type2) {\n      let obj2 = codegen2(args[0]);\n      if (cast) {\n        obj2 = cast + \"(\" + obj2 + \")\";\n        if (cast.lastIndexOf(\"new \", 0) === 0) obj2 = \"(\" + obj2 + \")\";\n      }\n      return obj2 + \".\" + name + (type2 < 0 ? \"\" : type2 === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen2).join(\",\") + \")\");\n    }\n    function fn2(name, cast, type2) {\n      return (args) => fncall(name, args, cast, type2);\n    }\n    const DATE2 = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n      // MATH functions\n      isNaN: \"Number.isNaN\",\n      isFinite: \"Number.isFinite\",\n      abs: \"Math.abs\",\n      acos: \"Math.acos\",\n      asin: \"Math.asin\",\n      atan: \"Math.atan\",\n      atan2: \"Math.atan2\",\n      ceil: \"Math.ceil\",\n      cos: \"Math.cos\",\n      exp: \"Math.exp\",\n      floor: \"Math.floor\",\n      hypot: \"Math.hypot\",\n      log: \"Math.log\",\n      max: \"Math.max\",\n      min: \"Math.min\",\n      pow: \"Math.pow\",\n      random: \"Math.random\",\n      round: \"Math.round\",\n      sin: \"Math.sin\",\n      sqrt: \"Math.sqrt\",\n      tan: \"Math.tan\",\n      clamp: function(args) {\n        if (args.length < 3) error(\"Missing arguments to clamp function.\");\n        if (args.length > 3) error(\"Too many arguments to clamp function.\");\n        const a2 = args.map(codegen2);\n        return \"Math.max(\" + a2[1] + \", Math.min(\" + a2[2] + \",\" + a2[0] + \"))\";\n      },\n      // DATE functions\n      now: \"Date.now\",\n      utc: \"Date.UTC\",\n      datetime: DATE2,\n      date: fn2(\"getDate\", DATE2, 0),\n      day: fn2(\"getDay\", DATE2, 0),\n      year: fn2(\"getFullYear\", DATE2, 0),\n      month: fn2(\"getMonth\", DATE2, 0),\n      hours: fn2(\"getHours\", DATE2, 0),\n      minutes: fn2(\"getMinutes\", DATE2, 0),\n      seconds: fn2(\"getSeconds\", DATE2, 0),\n      milliseconds: fn2(\"getMilliseconds\", DATE2, 0),\n      time: fn2(\"getTime\", DATE2, 0),\n      timezoneoffset: fn2(\"getTimezoneOffset\", DATE2, 0),\n      utcdate: fn2(\"getUTCDate\", DATE2, 0),\n      utcday: fn2(\"getUTCDay\", DATE2, 0),\n      utcyear: fn2(\"getUTCFullYear\", DATE2, 0),\n      utcmonth: fn2(\"getUTCMonth\", DATE2, 0),\n      utchours: fn2(\"getUTCHours\", DATE2, 0),\n      utcminutes: fn2(\"getUTCMinutes\", DATE2, 0),\n      utcseconds: fn2(\"getUTCSeconds\", DATE2, 0),\n      utcmilliseconds: fn2(\"getUTCMilliseconds\", DATE2, 0),\n      // sequence functions\n      length: fn2(\"length\", null, -1),\n      // STRING functions\n      parseFloat: \"parseFloat\",\n      parseInt: \"parseInt\",\n      upper: fn2(\"toUpperCase\", STRING, 0),\n      lower: fn2(\"toLowerCase\", STRING, 0),\n      substring: fn2(\"substring\", STRING),\n      split: fn2(\"split\", STRING),\n      trim: fn2(\"trim\", STRING, 0),\n      // base64 encode/decode\n      btoa: \"btoa\",\n      atob: \"atob\",\n      // REGEXP functions\n      regexp: REGEXP,\n      test: fn2(\"test\", REGEXP),\n      // Control Flow functions\n      if: function(args) {\n        if (args.length < 3) error(\"Missing arguments to if function.\");\n        if (args.length > 3) error(\"Too many arguments to if function.\");\n        const a2 = args.map(codegen2);\n        return \"(\" + a2[0] + \"?\" + a2[1] + \":\" + a2[2] + \")\";\n      }\n    };\n  }\n  function stripQuotes(s) {\n    const n = s && s.length - 1;\n    return n && (s[0] === '\"' && s[n] === '\"' || s[0] === \"'\" && s[n] === \"'\") ? s.slice(1, -1) : s;\n  }\n  function codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? toSet(opt.allowed) : {}, forbidden = opt.forbidden ? toSet(opt.forbidden) : {}, constants2 = opt.constants || Constants$1, functions = (opt.functions || Functions)(visit2), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = isFunction(globalvar) ? globalvar : (id2) => `${globalvar}[\"${id2}\"]`;\n    /* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype).filter((name) => typeof Object.prototype[name] === \"function\"), \"__proto__\"]);\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit2(ast) {\n      if (isString(ast)) return ast;\n      const generator = Generators[ast.type];\n      if (generator == null) error(\"Unsupported type: \" + ast.type);\n      return generator(ast);\n    }\n    const Generators = {\n      Literal: (n) => n.raw,\n      Identifier: (n) => {\n        const id2 = n.name;\n        if (memberDepth > 0) {\n          return id2;\n        } else if (has$1(forbidden, id2)) {\n          return error(\"Illegal identifier: \" + id2);\n        } else if (has$1(constants2, id2)) {\n          return constants2[id2];\n        } else if (has$1(allowed, id2)) {\n          return id2;\n        } else {\n          globals[id2] = 1;\n          return outputGlobal(id2);\n        }\n      },\n      MemberExpression: (n) => {\n        const d = !n.computed, o = visit2(n.object);\n        if (d) memberDepth += 1;\n        const p = visit2(n.property);\n        if (o === fieldvar) {\n          fields[stripQuotes(p)] = 1;\n        }\n        if (d) memberDepth -= 1;\n        return o + (d ? \".\" + p : \"[\" + p + \"]\");\n      },\n      CallExpression: (n) => {\n        if (n.callee.type !== \"Identifier\") {\n          error(\"Illegal callee type: \" + n.callee.type);\n        }\n        const callee = n.callee.name, args = n.arguments, fn2 = has$1(functions, callee) && functions[callee];\n        if (!fn2) error(\"Unrecognized function: \" + callee);\n        return isFunction(fn2) ? fn2(args) : fn2 + \"(\" + args.map(visit2).join(\",\") + \")\";\n      },\n      ArrayExpression: (n) => \"[\" + n.elements.map(visit2).join(\",\") + \"]\",\n      BinaryExpression: (n) => \"(\" + visit2(n.left) + \" \" + n.operator + \" \" + visit2(n.right) + \")\",\n      UnaryExpression: (n) => \"(\" + n.operator + visit2(n.argument) + \")\",\n      ConditionalExpression: (n) => \"(\" + visit2(n.test) + \"?\" + visit2(n.consequent) + \":\" + visit2(n.alternate) + \")\",\n      LogicalExpression: (n) => \"(\" + visit2(n.left) + n.operator + visit2(n.right) + \")\",\n      ObjectExpression: (n) => {\n        for (const prop of n.properties) {\n          const keyName = prop.key.name;\n          if (DisallowedObjectProperties.has(keyName)) {\n            error(\"Illegal property: \" + keyName);\n          }\n        }\n        return \"{\" + n.properties.map(visit2).join(\",\") + \"}\";\n      },\n      Property: (n) => {\n        memberDepth += 1;\n        const k = visit2(n.key);\n        memberDepth -= 1;\n        return k + \":\" + visit2(n.value);\n      }\n    };\n    function codegen2(ast) {\n      const result = {\n        code: visit2(ast),\n        globals: Object.keys(globals),\n        fields: Object.keys(fields)\n      };\n      globals = {};\n      fields = {};\n      return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants2;\n    return codegen2;\n  }\n  const SELECTION_GETTER = Symbol(\"vega_selection_getter\");\n  function getter(f) {\n    if (!f.getter || !f.getter[SELECTION_GETTER]) {\n      f.getter = field$1(f.field);\n      f.getter[SELECTION_GETTER] = true;\n    }\n    return f.getter;\n  }\n  const Intersect = \"intersect\";\n  const Union = \"union\";\n  const VlMulti = \"vlMulti\";\n  const VlPoint = \"vlPoint\";\n  const Or = \"or\";\n  const And = \"and\";\n  const SelectionId = \"_vgsid_\";\n  const $selectionId = field$1(SelectionId);\n  const TYPE_ENUM = \"E\", TYPE_RANGE_INC = \"R\", TYPE_RANGE_EXC = \"R-E\", TYPE_RANGE_LE = \"R-LE\", TYPE_RANGE_RE = \"R-RE\", TYPE_PRED_LT = \"E-LT\", TYPE_PRED_LTE = \"E-LTE\", TYPE_PRED_GT = \"E-GT\", TYPE_PRED_GTE = \"E-GTE\", TYPE_PRED_VALID = \"E-VALID\", TYPE_PRED_ONE_OF = \"E-ONE\", UNIT_INDEX = \"index:unit\";\n  function testPoint(datum2, entry2) {\n    var fields = entry2.fields, values2 = entry2.values, n = fields.length, i = 0, dval, f;\n    for (; i < n; ++i) {\n      f = fields[i];\n      dval = getter(f)(datum2);\n      if (isDate$1(dval)) dval = toNumber(dval);\n      if (isDate$1(values2[i])) values2[i] = toNumber(values2[i]);\n      if (isArray(values2[i]) && isDate$1(values2[i][0])) values2[i] = values2[i].map(toNumber);\n      if (f.type === TYPE_ENUM) {\n        if (isArray(values2[i]) ? !values2[i].includes(dval) : dval !== values2[i]) {\n          return false;\n        }\n      } else {\n        if (f.type === TYPE_RANGE_INC) {\n          if (!inrange(dval, values2[i])) return false;\n        } else if (f.type === TYPE_RANGE_RE) {\n          if (!inrange(dval, values2[i], true, false)) return false;\n        } else if (f.type === TYPE_RANGE_EXC) {\n          if (!inrange(dval, values2[i], false, false)) return false;\n        } else if (f.type === TYPE_RANGE_LE) {\n          if (!inrange(dval, values2[i], false, true)) return false;\n        } else if (f.type === TYPE_PRED_LT) {\n          if (dval >= values2[i]) return false;\n        } else if (f.type === TYPE_PRED_LTE) {\n          if (dval > values2[i]) return false;\n        } else if (f.type === TYPE_PRED_GT) {\n          if (dval <= values2[i]) return false;\n        } else if (f.type === TYPE_PRED_GTE) {\n          if (dval < values2[i]) return false;\n        } else if (f.type === TYPE_PRED_VALID) {\n          if (dval === null || isNaN(dval)) return false;\n        } else if (f.type === TYPE_PRED_ONE_OF) {\n          if (values2[i].indexOf(dval) === -1) return false;\n        }\n      }\n    }\n    return true;\n  }\n  function selectionTest(name, datum2, op) {\n    var data2 = this.context.data[name], entries = data2 ? data2.values.value : [], unitIdx = data2 ? data2[UNIT_INDEX] && data2[UNIT_INDEX].value : void 0, intersect2 = op === Intersect, n = entries.length, i = 0, entry2, miss, count2, unit2, b2;\n    for (; i < n; ++i) {\n      entry2 = entries[i];\n      if (unitIdx && intersect2) {\n        miss = miss || {};\n        count2 = miss[unit2 = entry2.unit] || 0;\n        if (count2 === -1) continue;\n        b2 = testPoint(datum2, entry2);\n        miss[unit2] = b2 ? -1 : ++count2;\n        if (b2 && unitIdx.size === 1) return true;\n        if (!b2 && count2 === unitIdx.get(unit2).count) return false;\n      } else {\n        b2 = testPoint(datum2, entry2);\n        if (intersect2 ^ b2) return b2;\n      }\n    }\n    return n && intersect2;\n  }\n  const bisect = bisector($selectionId), bisectLeft = bisect.left, bisectRight = bisect.right;\n  function selectionIdTest(name, datum2, op) {\n    const data2 = this.context.data[name], entries = data2 ? data2.values.value : [], unitIdx = data2 ? data2[UNIT_INDEX] && data2[UNIT_INDEX].value : void 0, intersect2 = op === Intersect, value2 = $selectionId(datum2), index2 = bisectLeft(entries, value2);\n    if (index2 === entries.length) return false;\n    if ($selectionId(entries[index2]) !== value2) return false;\n    if (unitIdx && intersect2) {\n      if (unitIdx.size === 1) return true;\n      if (bisectRight(entries, value2) - index2 < unitIdx.size) return false;\n    }\n    return true;\n  }\n  function selectionTuples(array2, base2) {\n    if (!isArray(array2)) {\n      error(\"First argument to selectionTuples must be an array.\");\n    }\n    if (!isObject$1(base2)) {\n      error(\"Second argument to selectionTuples must be an object.\");\n    }\n    return array2.map((x2) => extend$1(base2.fields ? {\n      values: base2.fields.map((f) => getter(f)(x2.datum))\n    } : {\n      [SelectionId]: $selectionId(x2.datum)\n    }, base2));\n  }\n  function selectionResolve(name, op, isMulti, vl5) {\n    var data2 = this.context.data[name], entries = data2 ? data2.values.value : [], resolved = {}, multiRes = {}, types = {}, entry2, fields, values2, unit2, field2, value2, res, resUnit, type2, union2, n = entries.length, i = 0, j, m2;\n    for (; i < n; ++i) {\n      entry2 = entries[i];\n      unit2 = entry2.unit;\n      fields = entry2.fields;\n      values2 = entry2.values;\n      if (fields && values2) {\n        for (j = 0, m2 = fields.length; j < m2; ++j) {\n          field2 = fields[j];\n          res = resolved[field2.field] || (resolved[field2.field] = {});\n          resUnit = res[unit2] || (res[unit2] = []);\n          types[field2.field] = type2 = field2.type.charAt(0);\n          union2 = ops[`${type2}_union`];\n          res[unit2] = union2(resUnit, array$5(values2[j]));\n        }\n        if (isMulti) {\n          resUnit = multiRes[unit2] || (multiRes[unit2] = []);\n          resUnit.push(array$5(values2).reduce((obj2, curr, j2) => (obj2[fields[j2].field] = curr, obj2), {}));\n        }\n      } else {\n        field2 = SelectionId;\n        value2 = $selectionId(entry2);\n        res = resolved[field2] || (resolved[field2] = {});\n        resUnit = res[unit2] || (res[unit2] = []);\n        resUnit.push(value2);\n        if (isMulti) {\n          resUnit = multiRes[unit2] || (multiRes[unit2] = []);\n          resUnit.push({\n            [SelectionId]: value2\n          });\n        }\n      }\n    }\n    op = op || Union;\n    if (resolved[SelectionId]) {\n      resolved[SelectionId] = ops[`${SelectionId}_${op}`](...Object.values(resolved[SelectionId]));\n    } else {\n      Object.keys(resolved).forEach((field3) => {\n        resolved[field3] = Object.keys(resolved[field3]).map((unit3) => resolved[field3][unit3]).reduce((acc, curr) => acc === void 0 ? curr : ops[`${types[field3]}_${op}`](acc, curr));\n      });\n    }\n    entries = Object.keys(multiRes);\n    if (isMulti && entries.length) {\n      const key2 = vl5 ? VlPoint : VlMulti;\n      resolved[key2] = op === Union ? {\n        [Or]: entries.reduce((acc, k) => (acc.push(...multiRes[k]), acc), [])\n      } : {\n        [And]: entries.map((k) => ({\n          [Or]: multiRes[k]\n        }))\n      };\n    }\n    return resolved;\n  }\n  var ops = {\n    [`${SelectionId}_union`]: union,\n    [`${SelectionId}_intersect`]: intersection,\n    E_union: function(base2, value2) {\n      if (!base2.length) return value2;\n      var i = 0, n = value2.length;\n      for (; i < n; ++i) if (!base2.includes(value2[i])) base2.push(value2[i]);\n      return base2;\n    },\n    E_intersect: function(base2, value2) {\n      return !base2.length ? value2 : base2.filter((v) => value2.includes(v));\n    },\n    R_union: function(base2, value2) {\n      var lo = toNumber(value2[0]), hi = toNumber(value2[1]);\n      if (lo > hi) {\n        lo = value2[1];\n        hi = value2[0];\n      }\n      if (!base2.length) return [lo, hi];\n      if (base2[0] > lo) base2[0] = lo;\n      if (base2[1] < hi) base2[1] = hi;\n      return base2;\n    },\n    R_intersect: function(base2, value2) {\n      var lo = toNumber(value2[0]), hi = toNumber(value2[1]);\n      if (lo > hi) {\n        lo = value2[1];\n        hi = value2[0];\n      }\n      if (!base2.length) return [lo, hi];\n      if (hi < base2[0] || base2[1] < lo) {\n        return [];\n      } else {\n        if (base2[0] < lo) base2[0] = lo;\n        if (base2[1] > hi) base2[1] = hi;\n      }\n      return base2;\n    }\n  };\n  const DataPrefix$1 = \":\", IndexPrefix$1 = \"@\";\n  function selectionVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) error(\"First argument to selection functions must be a string literal.\");\n    const data2 = args[0].value, op = args.length >= 2 && peek$1(args).value, field2 = \"unit\", indexName = IndexPrefix$1 + field2, dataName = DataPrefix$1 + data2;\n    if (op === Intersect && !has$1(params2, indexName)) {\n      params2[indexName] = scope.getData(data2).indataRef(scope, field2);\n    }\n    if (!has$1(params2, dataName)) {\n      params2[dataName] = scope.getData(data2).tuplesRef();\n    }\n  }\n  function data$2(name) {\n    const data2 = this.context.data[name];\n    return data2 ? data2.values.value : [];\n  }\n  function indata(name, field2, value2) {\n    const index2 = this.context.data[name][\"index:\" + field2], entry2 = index2 ? index2.value.get(value2) : void 0;\n    return entry2 ? entry2.count : entry2;\n  }\n  function setdata(name, tuples) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input;\n    df.pulse(input, df.changeset().remove(truthy).insert(tuples));\n    return 1;\n  }\n  function encode(item, name, retval) {\n    if (item) {\n      const df = this.context.dataflow, target2 = item.mark.source;\n      df.pulse(target2, df.changeset().encode(item, name));\n    }\n    return retval !== void 0 ? retval : item;\n  }\n  const wrap = (method2) => function(value2, spec) {\n    const locale2 = this.context.dataflow.locale();\n    return value2 === null ? \"null\" : locale2[method2](spec)(value2);\n  };\n  const format = wrap(\"format\");\n  const timeFormat = wrap(\"timeFormat\");\n  const utcFormat = wrap(\"utcFormat\");\n  const timeParse = wrap(\"timeParse\");\n  const utcParse = wrap(\"utcParse\");\n  const dateObj = new Date(2e3, 0, 1);\n  function time(month, day, specifier) {\n    if (!Number.isInteger(month) || !Number.isInteger(day)) return \"\";\n    dateObj.setYear(2e3);\n    dateObj.setMonth(month);\n    dateObj.setDate(day);\n    return timeFormat.call(this, dateObj, specifier);\n  }\n  function monthFormat(month) {\n    return time.call(this, month, 1, \"%B\");\n  }\n  function monthAbbrevFormat(month) {\n    return time.call(this, month, 1, \"%b\");\n  }\n  function dayFormat(day) {\n    return time.call(this, 0, 2 + day, \"%A\");\n  }\n  function dayAbbrevFormat(day) {\n    return time.call(this, 0, 2 + day, \"%a\");\n  }\n  const DataPrefix = \":\";\n  const IndexPrefix = \"@\";\n  const ScalePrefix = \"%\";\n  const SignalPrefix = \"$\";\n  function dataVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) {\n      error(\"First argument to data functions must be a string literal.\");\n    }\n    const data2 = args[0].value, dataName = DataPrefix + data2;\n    if (!has$1(dataName, params2)) {\n      try {\n        params2[dataName] = scope.getData(data2).tuplesRef();\n      } catch (err) {\n      }\n    }\n  }\n  function indataVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) error(\"First argument to indata must be a string literal.\");\n    if (args[1].type !== Literal) error(\"Second argument to indata must be a string literal.\");\n    const data2 = args[0].value, field2 = args[1].value, indexName = IndexPrefix + field2;\n    if (!has$1(indexName, params2)) {\n      params2[indexName] = scope.getData(data2).indataRef(scope, field2);\n    }\n  }\n  function scaleVisitor(name, args, scope, params2) {\n    if (args[0].type === Literal) {\n      addScaleDependency(scope, params2, args[0].value);\n    } else {\n      for (name in scope.scales) {\n        addScaleDependency(scope, params2, name);\n      }\n    }\n  }\n  function addScaleDependency(scope, params2, name) {\n    const scaleName = ScalePrefix + name;\n    if (!has$1(params2, scaleName)) {\n      try {\n        params2[scaleName] = scope.scaleRef(name);\n      } catch (err) {\n      }\n    }\n  }\n  function getScale(nameOrFunction, ctx) {\n    if (isString(nameOrFunction)) {\n      const maybeScale = ctx.scales[nameOrFunction];\n      return maybeScale && isRegisteredScale(maybeScale.value) ? maybeScale.value : void 0;\n    } else if (isFunction(nameOrFunction)) {\n      return isRegisteredScale(nameOrFunction) ? nameOrFunction : void 0;\n    }\n    return void 0;\n  }\n  function internalScaleFunctions(codegen2, fnctx, visitors) {\n    fnctx.__bandwidth = (s) => s && s.bandwidth ? s.bandwidth() : 0;\n    visitors._bandwidth = scaleVisitor;\n    visitors._range = scaleVisitor;\n    visitors._scale = scaleVisitor;\n    const ref2 = (arg) => \"_[\" + (arg.type === Literal ? $(ScalePrefix + arg.value) : $(ScalePrefix) + \"+\" + codegen2(arg)) + \"]\";\n    return {\n      _bandwidth: (args) => `this.__bandwidth(${ref2(args[0])})`,\n      _range: (args) => `${ref2(args[0])}.range()`,\n      _scale: (args) => `${ref2(args[0])}(${codegen2(args[1])})`\n    };\n  }\n  function geoMethod(methodName, globalMethod) {\n    return function(projection2, geojson, group2) {\n      if (projection2) {\n        const p = getScale(projection2, (group2 || this).context);\n        return p && p.path[methodName](geojson);\n      } else {\n        return globalMethod(geojson);\n      }\n    };\n  }\n  const geoArea = geoMethod(\"area\", geoArea$1);\n  const geoBounds = geoMethod(\"bounds\", geoBounds$1);\n  const geoCentroid = geoMethod(\"centroid\", geoCentroid$1);\n  function geoScale(projection2, group2) {\n    const p = getScale(projection2, (group2 || this).context);\n    return p && p.scale();\n  }\n  function inScope(item) {\n    const group2 = this.context.group;\n    let value2 = false;\n    if (group2) while (item) {\n      if (item === group2) {\n        value2 = true;\n        break;\n      }\n      item = item.mark.group;\n    }\n    return value2;\n  }\n  function log(df, method2, args) {\n    try {\n      df[method2].apply(df, [\"EXPRESSION\"].concat([].slice.call(args)));\n    } catch (err) {\n      df.warn(err);\n    }\n    return args[args.length - 1];\n  }\n  function warn() {\n    return log(this.context.dataflow, \"warn\", arguments);\n  }\n  function info() {\n    return log(this.context.dataflow, \"info\", arguments);\n  }\n  function debug() {\n    return log(this.context.dataflow, \"debug\", arguments);\n  }\n  function channel_luminance_value(channelValue) {\n    const val = channelValue / 255;\n    if (val <= 0.03928) {\n      return val / 12.92;\n    }\n    return Math.pow((val + 0.055) / 1.055, 2.4);\n  }\n  function luminance(color2) {\n    const c2 = rgb$1(color2), r = channel_luminance_value(c2.r), g = channel_luminance_value(c2.g), b2 = channel_luminance_value(c2.b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b2;\n  }\n  function contrast(color1, color2) {\n    const lum1 = luminance(color1), lum2 = luminance(color2), lumL = Math.max(lum1, lum2), lumD = Math.min(lum1, lum2);\n    return (lumL + 0.05) / (lumD + 0.05);\n  }\n  function merge() {\n    const args = [].slice.call(arguments);\n    args.unshift({});\n    return extend$1(...args);\n  }\n  function equal(a2, b2) {\n    return a2 === b2 || a2 !== a2 && b2 !== b2 ? true : isArray(a2) ? isArray(b2) && a2.length === b2.length ? equalArray(a2, b2) : false : isObject$1(a2) && isObject$1(b2) ? equalObject(a2, b2) : false;\n  }\n  function equalArray(a2, b2) {\n    for (let i = 0, n = a2.length; i < n; ++i) {\n      if (!equal(a2[i], b2[i])) return false;\n    }\n    return true;\n  }\n  function equalObject(a2, b2) {\n    for (const key2 in a2) {\n      if (!equal(a2[key2], b2[key2])) return false;\n    }\n    return true;\n  }\n  function removePredicate(props) {\n    return (_) => equalObject(props, _);\n  }\n  function modify(name, insert2, remove2, toggle, modify2, values2) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input, stamp = df.stamp();\n    let changes = data2.changes, predicate, key2;\n    if (df._trigger === false || !(input.value.length || insert2 || toggle)) {\n      return 0;\n    }\n    if (!changes || changes.stamp < stamp) {\n      data2.changes = changes = df.changeset();\n      changes.stamp = stamp;\n      df.runAfter(() => {\n        data2.modified = true;\n        df.pulse(input, changes).run();\n      }, true, 1);\n    }\n    if (remove2) {\n      predicate = remove2 === true ? truthy : isArray(remove2) || isTuple(remove2) ? remove2 : removePredicate(remove2);\n      changes.remove(predicate);\n    }\n    if (insert2) {\n      changes.insert(insert2);\n    }\n    if (toggle) {\n      predicate = removePredicate(toggle);\n      if (input.value.some(predicate)) {\n        changes.remove(predicate);\n      } else {\n        changes.insert(toggle);\n      }\n    }\n    if (modify2) {\n      for (key2 in values2) {\n        changes.modify(modify2, key2, values2[key2]);\n      }\n    }\n    return 1;\n  }\n  function pinchDistance(event2) {\n    const t = event2.touches, dx = t[0].clientX - t[1].clientX, dy = t[0].clientY - t[1].clientY;\n    return Math.hypot(dx, dy);\n  }\n  function pinchAngle(event2) {\n    const t = event2.touches;\n    return Math.atan2(t[0].clientY - t[1].clientY, t[0].clientX - t[1].clientX);\n  }\n  const accessors = {};\n  function pluck(data2, name) {\n    const accessor2 = accessors[name] || (accessors[name] = field$1(name));\n    return isArray(data2) ? data2.map(accessor2) : accessor2(data2);\n  }\n  function array(seq) {\n    return isArray(seq) || ArrayBuffer.isView(seq) ? seq : null;\n  }\n  function sequence(seq) {\n    return array(seq) || (isString(seq) ? seq : null);\n  }\n  function join(seq, ...args) {\n    return array(seq).join(...args);\n  }\n  function indexof(seq, ...args) {\n    return sequence(seq).indexOf(...args);\n  }\n  function lastindexof(seq, ...args) {\n    return sequence(seq).lastIndexOf(...args);\n  }\n  function slice(seq, ...args) {\n    return sequence(seq).slice(...args);\n  }\n  function replace(str, pattern, repl) {\n    if (isFunction(repl)) error(\"Function argument passed to replace.\");\n    if (!isString(pattern) && !isRegExp(pattern)) error(\"Please pass a string or RegExp argument to replace.\");\n    return String(str).replace(pattern, repl);\n  }\n  function reverse(seq) {\n    return array(seq).slice().reverse();\n  }\n  function sort(seq) {\n    return array(seq).slice().sort(ascending$2);\n  }\n  function bandspace(count2, paddingInner, paddingOuter) {\n    return bandSpace(count2 || 0, paddingInner || 0, paddingOuter || 0);\n  }\n  function bandwidth(name, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s && s.bandwidth ? s.bandwidth() : 0;\n  }\n  function copy$5(name, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s ? s.copy() : void 0;\n  }\n  function domain(name, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s ? s.domain() : [];\n  }\n  function invert$2(name, range2, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return !s ? void 0 : isArray(range2) ? (s.invertRange || s.invert)(range2) : (s.invert || s.invertExtent)(range2);\n  }\n  function range$1(name, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s && s.range ? s.range() : [];\n  }\n  function scale$4(name, value2, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s ? s(value2) : void 0;\n  }\n  function scaleGradient(scale2, p02, p1, count2, group2) {\n    scale2 = getScale(scale2, (group2 || this).context);\n    const gradient2 = Gradient$1(p02, p1);\n    let stops = scale2.domain(), min2 = stops[0], max2 = peek$1(stops), fraction = identity$7;\n    if (!(max2 - min2)) {\n      scale2 = (scale2.interpolator ? scale$6(\"sequential\")().interpolator(scale2.interpolator()) : scale$6(\"linear\")().interpolate(scale2.interpolate()).range(scale2.range())).domain([min2 = 0, max2 = 1]);\n    } else {\n      fraction = scaleFraction(scale2, min2, max2);\n    }\n    if (scale2.ticks) {\n      stops = scale2.ticks(+count2 || 15);\n      if (min2 !== stops[0]) stops.unshift(min2);\n      if (max2 !== peek$1(stops)) stops.push(max2);\n    }\n    stops.forEach((_) => gradient2.stop(fraction(_), scale2(_)));\n    return gradient2;\n  }\n  function geoShape(projection2, geojson, group2) {\n    const p = getScale(projection2, (group2 || this).context);\n    return function(context2) {\n      return p ? p.path.context(context2)(geojson) : \"\";\n    };\n  }\n  function pathShape(path2) {\n    let p = null;\n    return function(context2) {\n      return context2 ? pathRender(context2, p = p || parse$3(path2)) : path2;\n    };\n  }\n  const datum = (d) => d.data;\n  function treeNodes(name, context2) {\n    const tree2 = data$2.call(context2, name);\n    return tree2.root && tree2.root.lookup || {};\n  }\n  function treePath(name, source2, target2) {\n    const nodes = treeNodes(name, this), s = nodes[source2], t = nodes[target2];\n    return s && t ? s.path(t).map(datum) : void 0;\n  }\n  function treeAncestors(name, node) {\n    const n = treeNodes(name, this)[node];\n    return n ? n.ancestors().map(datum) : void 0;\n  }\n  const _window = () => typeof window !== \"undefined\" && window || null;\n  function screen() {\n    const w2 = _window();\n    return w2 ? w2.screen : {};\n  }\n  function windowSize() {\n    const w2 = _window();\n    return w2 ? [w2.innerWidth, w2.innerHeight] : [void 0, void 0];\n  }\n  function containerSize() {\n    const view = this.context.dataflow, el = view.container && view.container();\n    return el ? [el.clientWidth, el.clientHeight] : [void 0, void 0];\n  }\n  function intersect(b2, opt, group2) {\n    if (!b2) return [];\n    const [u2, v] = b2, box2 = new Bounds().set(u2[0], u2[1], v[0], v[1]), scene = group2 || this.context.dataflow.scenegraph().root;\n    return intersect$2(scene, box2, filter(opt));\n  }\n  function filter(opt) {\n    let p = null;\n    if (opt) {\n      const types = array$5(opt.marktype), names = array$5(opt.markname);\n      p = (_) => (!types.length || types.some((t) => _.marktype === t)) && (!names.length || names.some((s) => _.name === s));\n    }\n    return p;\n  }\n  function lassoAppend(lasso, x2, y2, minDist = 5) {\n    lasso = array$5(lasso);\n    const last = lasso[lasso.length - 1];\n    return last === void 0 || Math.hypot(last[0] - x2, last[1] - y2) > minDist ? [...lasso, [x2, y2]] : lasso;\n  }\n  function lassoPath(lasso) {\n    return array$5(lasso).reduce((svg, [x2, y2], i) => {\n      return svg += i == 0 ? `M ${x2},${y2} ` : i === lasso.length - 1 ? \" Z\" : `L ${x2},${y2} `;\n    }, \"\");\n  }\n  function intersectLasso(markname, pixelLasso, unit2) {\n    const {\n      x: x2,\n      y: y2,\n      mark\n    } = unit2;\n    const bb = new Bounds().set(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER);\n    for (const [px2, py2] of pixelLasso) {\n      if (px2 < bb.x1) bb.x1 = px2;\n      if (px2 > bb.x2) bb.x2 = px2;\n      if (py2 < bb.y1) bb.y1 = py2;\n      if (py2 > bb.y2) bb.y2 = py2;\n    }\n    bb.translate(x2, y2);\n    const intersection2 = intersect([[bb.x1, bb.y1], [bb.x2, bb.y2]], markname, mark);\n    return intersection2.filter((tuple) => pointInPolygon(tuple.x, tuple.y, pixelLasso));\n  }\n  function pointInPolygon(testx, testy, polygon) {\n    let intersections = 0;\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n      const [prevX, prevY] = polygon[j];\n      const [x2, y2] = polygon[i];\n      if (y2 > testy != prevY > testy && testx < (prevX - x2) * (testy - y2) / (prevY - y2) + x2) {\n        intersections++;\n      }\n    }\n    return intersections & 1;\n  }\n  const functionContext = {\n    random() {\n      return random();\n    },\n    // override default\n    cumulativeNormal,\n    cumulativeLogNormal,\n    cumulativeUniform,\n    densityNormal,\n    densityLogNormal,\n    densityUniform,\n    quantileNormal,\n    quantileLogNormal,\n    quantileUniform,\n    sampleNormal,\n    sampleLogNormal,\n    sampleUniform,\n    isArray,\n    isBoolean: isBoolean$1,\n    isDate: isDate$1,\n    isDefined(_) {\n      return _ !== void 0;\n    },\n    isNumber: isNumber$1,\n    isObject: isObject$1,\n    isRegExp,\n    isString,\n    isTuple,\n    isValid(_) {\n      return _ != null && _ === _;\n    },\n    toBoolean,\n    toDate(_) {\n      return toDate(_);\n    },\n    // suppress extra arguments\n    toNumber,\n    toString,\n    indexof,\n    join,\n    lastindexof,\n    replace,\n    reverse,\n    sort,\n    slice,\n    flush,\n    lerp: lerp$1,\n    merge,\n    pad: pad$2,\n    peek: peek$1,\n    pluck,\n    span,\n    inrange,\n    truncate: truncate$1,\n    rgb: rgb$1,\n    lab: lab$1,\n    hcl: hcl$1,\n    hsl: hsl$1,\n    luminance,\n    contrast,\n    sequence: range$3,\n    format,\n    utcFormat,\n    utcParse,\n    utcOffset,\n    utcSequence,\n    timeFormat,\n    timeParse,\n    timeOffset,\n    timeSequence,\n    timeUnitSpecifier,\n    monthFormat,\n    monthAbbrevFormat,\n    dayFormat,\n    dayAbbrevFormat,\n    quarter,\n    utcquarter,\n    week,\n    utcweek,\n    dayofyear,\n    utcdayofyear,\n    warn,\n    info,\n    debug,\n    extent(_) {\n      return extent(_);\n    },\n    // suppress extra arguments\n    inScope,\n    intersect,\n    clampRange,\n    pinchDistance,\n    pinchAngle,\n    screen,\n    containerSize,\n    windowSize,\n    bandspace,\n    setdata,\n    pathShape,\n    panLinear,\n    panLog,\n    panPow,\n    panSymlog,\n    zoomLinear,\n    zoomLog,\n    zoomPow,\n    zoomSymlog,\n    encode,\n    modify,\n    lassoAppend,\n    lassoPath,\n    intersectLasso\n  };\n  const eventFunctions = [\"view\", \"item\", \"group\", \"xy\", \"x\", \"y\"], eventPrefix = \"event.vega.\", thisPrefix = \"this.\", astVisitors = {};\n  const codegenParams = {\n    forbidden: [\"_\"],\n    allowed: [\"datum\", \"event\", \"item\"],\n    fieldvar: \"datum\",\n    globalvar: (id2) => `_[${$(SignalPrefix + id2)}]`,\n    functions: buildFunctions,\n    constants: Constants$1,\n    visitors: astVisitors\n  };\n  const codeGenerator = codegen(codegenParams);\n  function buildFunctions(codegen2) {\n    const fn2 = Functions(codegen2);\n    eventFunctions.forEach((name) => fn2[name] = eventPrefix + name);\n    for (const name in functionContext) {\n      fn2[name] = thisPrefix + name;\n    }\n    extend$1(fn2, internalScaleFunctions(codegen2, functionContext, astVisitors));\n    return fn2;\n  }\n  function expressionFunction(name, fn2, visitor) {\n    if (arguments.length === 1) {\n      return functionContext[name];\n    }\n    functionContext[name] = fn2;\n    if (visitor) astVisitors[name] = visitor;\n    if (codeGenerator) codeGenerator.functions[name] = thisPrefix + name;\n    return this;\n  }\n  expressionFunction(\"bandwidth\", bandwidth, scaleVisitor);\n  expressionFunction(\"copy\", copy$5, scaleVisitor);\n  expressionFunction(\"domain\", domain, scaleVisitor);\n  expressionFunction(\"range\", range$1, scaleVisitor);\n  expressionFunction(\"invert\", invert$2, scaleVisitor);\n  expressionFunction(\"scale\", scale$4, scaleVisitor);\n  expressionFunction(\"gradient\", scaleGradient, scaleVisitor);\n  expressionFunction(\"geoArea\", geoArea, scaleVisitor);\n  expressionFunction(\"geoBounds\", geoBounds, scaleVisitor);\n  expressionFunction(\"geoCentroid\", geoCentroid, scaleVisitor);\n  expressionFunction(\"geoShape\", geoShape, scaleVisitor);\n  expressionFunction(\"geoScale\", geoScale, scaleVisitor);\n  expressionFunction(\"indata\", indata, indataVisitor);\n  expressionFunction(\"data\", data$2, dataVisitor);\n  expressionFunction(\"treePath\", treePath, dataVisitor);\n  expressionFunction(\"treeAncestors\", treeAncestors, dataVisitor);\n  expressionFunction(\"vlSelectionTest\", selectionTest, selectionVisitor);\n  expressionFunction(\"vlSelectionIdTest\", selectionIdTest, selectionVisitor);\n  expressionFunction(\"vlSelectionResolve\", selectionResolve, selectionVisitor);\n  expressionFunction(\"vlSelectionTuples\", selectionTuples);\n  function parser(expr2, scope) {\n    const params2 = {};\n    let ast;\n    try {\n      expr2 = isString(expr2) ? expr2 : $(expr2) + \"\";\n      ast = parser$1(expr2);\n    } catch (err) {\n      error(\"Expression parse error: \" + expr2);\n    }\n    ast.visit((node) => {\n      if (node.type !== CallExpression) return;\n      const name = node.callee.name, visit2 = codegenParams.visitors[name];\n      if (visit2) visit2(name, node.arguments, scope, params2);\n    });\n    const gen = codeGenerator(ast);\n    gen.globals.forEach((name) => {\n      const signalName = SignalPrefix + name;\n      if (!has$1(params2, signalName) && scope.getSignal(name)) {\n        params2[signalName] = scope.signalRef(name);\n      }\n    });\n    return {\n      $expr: extend$1({\n        code: gen.code\n      }, scope.options.ast ? {\n        ast\n      } : null),\n      $fields: gen.fields,\n      $params: params2\n    };\n  }\n  function parse$2(spec) {\n    const ctx = this, operators = spec.operators || [];\n    if (spec.background) {\n      ctx.background = spec.background;\n    }\n    if (spec.eventConfig) {\n      ctx.eventConfig = spec.eventConfig;\n    }\n    if (spec.locale) {\n      ctx.locale = spec.locale;\n    }\n    operators.forEach((entry2) => ctx.parseOperator(entry2));\n    operators.forEach((entry2) => ctx.parseOperatorParameters(entry2));\n    (spec.streams || []).forEach((entry2) => ctx.parseStream(entry2));\n    (spec.updates || []).forEach((entry2) => ctx.parseUpdate(entry2));\n    return ctx.resolve();\n  }\n  const Skip$2 = toSet([\"rule\"]), Swap = toSet([\"group\", \"image\", \"rect\"]);\n  function adjustSpatial(encode2, marktype) {\n    let code = \"\";\n    if (Skip$2[marktype]) return code;\n    if (encode2.x2) {\n      if (encode2.x) {\n        if (Swap[marktype]) {\n          code += \"if(o.x>o.x2)$=o.x,o.x=o.x2,o.x2=$;\";\n        }\n        code += \"o.width=o.x2-o.x;\";\n      } else {\n        code += \"o.x=o.x2-(o.width||0);\";\n      }\n    }\n    if (encode2.xc) {\n      code += \"o.x=o.xc-(o.width||0)/2;\";\n    }\n    if (encode2.y2) {\n      if (encode2.y) {\n        if (Swap[marktype]) {\n          code += \"if(o.y>o.y2)$=o.y,o.y=o.y2,o.y2=$;\";\n        }\n        code += \"o.height=o.y2-o.y;\";\n      } else {\n        code += \"o.y=o.y2-(o.height||0);\";\n      }\n    }\n    if (encode2.yc) {\n      code += \"o.y=o.yc-(o.height||0)/2;\";\n    }\n    return code;\n  }\n  function canonicalType(type2) {\n    return (type2 + \"\").toLowerCase();\n  }\n  function isOperator(type2) {\n    return canonicalType(type2) === \"operator\";\n  }\n  function isCollect(type2) {\n    return canonicalType(type2) === \"collect\";\n  }\n  function expression(ctx, args, code) {\n    if (!code.endsWith(\";\")) {\n      code = \"return(\" + code + \");\";\n    }\n    const fn2 = Function(...args.concat(code));\n    return ctx && ctx.functions ? fn2.bind(ctx.functions) : fn2;\n  }\n  function _compare(u2, v, lt, gt) {\n    return `((u = ${u2}) < (v = ${v}) || u == null) && v != null ? ${lt}\n  : (u > v || v == null) && u != null ? ${gt}\n  : ((v = v instanceof Date ? +v : v), (u = u instanceof Date ? +u : u)) !== u && v === v ? ${lt}\n  : v !== v && u === u ? ${gt} : `;\n  }\n  var expressionCodegen = {\n    /**\n     * Parse an expression used to update an operator value.\n     */\n    operator: (ctx, expr2) => expression(ctx, [\"_\"], expr2.code),\n    /**\n     * Parse an expression provided as an operator parameter value.\n     */\n    parameter: (ctx, expr2) => expression(ctx, [\"datum\", \"_\"], expr2.code),\n    /**\n     * Parse an expression applied to an event stream.\n     */\n    event: (ctx, expr2) => expression(ctx, [\"event\"], expr2.code),\n    /**\n     * Parse an expression used to handle an event-driven operator update.\n     */\n    handler: (ctx, expr2) => {\n      const code = `var datum=event.item&&event.item.datum;return ${expr2.code};`;\n      return expression(ctx, [\"_\", \"event\"], code);\n    },\n    /**\n     * Parse an expression that performs visual encoding.\n     */\n    encode: (ctx, encode2) => {\n      const {\n        marktype,\n        channels\n      } = encode2;\n      let code = \"var o=item,datum=o.datum,m=0,$;\";\n      for (const name in channels) {\n        const o = \"o[\" + $(name) + \"]\";\n        code += `$=${channels[name].code};if(${o}!==$)${o}=$,m=1;`;\n      }\n      code += adjustSpatial(channels, marktype);\n      code += \"return m;\";\n      return expression(ctx, [\"item\", \"_\"], code);\n    },\n    /**\n     * Optimized code generators for access and comparison.\n     */\n    codegen: {\n      get(path2) {\n        const ref2 = `[${path2.map($).join(\"][\")}]`;\n        const get2 = Function(\"_\", `return _${ref2};`);\n        get2.path = ref2;\n        return get2;\n      },\n      comparator(fields, orders) {\n        let t;\n        const map2 = (f, i) => {\n          const o = orders[i];\n          let u2, v;\n          if (f.path) {\n            u2 = `a${f.path}`;\n            v = `b${f.path}`;\n          } else {\n            (t = t || {})[\"f\" + i] = f;\n            u2 = `this.f${i}(a)`;\n            v = `this.f${i}(b)`;\n          }\n          return _compare(u2, v, -o, o);\n        };\n        const fn2 = Function(\"a\", \"b\", \"var u, v; return \" + fields.map(map2).join(\"\") + \"0;\");\n        return t ? fn2.bind(t) : fn2;\n      }\n    }\n  };\n  function parseOperator(spec) {\n    const ctx = this;\n    if (isOperator(spec.type) || !spec.type) {\n      ctx.operator(spec, spec.update ? ctx.operatorExpression(spec.update) : null);\n    } else {\n      ctx.transform(spec, spec.type);\n    }\n  }\n  function parseOperatorParameters(spec) {\n    const ctx = this;\n    if (spec.params) {\n      const op = ctx.get(spec.id);\n      if (!op) error(\"Invalid operator id: \" + spec.id);\n      ctx.dataflow.connect(op, op.parameters(ctx.parseParameters(spec.params), spec.react, spec.initonly));\n    }\n  }\n  function parseParameters$1(spec, params2) {\n    params2 = params2 || {};\n    const ctx = this;\n    for (const key2 in spec) {\n      const value2 = spec[key2];\n      params2[key2] = isArray(value2) ? value2.map((v) => parseParameter$2(v, ctx, params2)) : parseParameter$2(value2, ctx, params2);\n    }\n    return params2;\n  }\n  function parseParameter$2(spec, ctx, params2) {\n    if (!spec || !isObject$1(spec)) return spec;\n    for (let i = 0, n = PARSERS.length, p; i < n; ++i) {\n      p = PARSERS[i];\n      if (has$1(spec, p.key)) {\n        return p.parse(spec, ctx, params2);\n      }\n    }\n    return spec;\n  }\n  var PARSERS = [{\n    key: \"$ref\",\n    parse: getOperator\n  }, {\n    key: \"$key\",\n    parse: getKey\n  }, {\n    key: \"$expr\",\n    parse: getExpression\n  }, {\n    key: \"$field\",\n    parse: getField\n  }, {\n    key: \"$encode\",\n    parse: getEncode\n  }, {\n    key: \"$compare\",\n    parse: getCompare\n  }, {\n    key: \"$context\",\n    parse: getContext\n  }, {\n    key: \"$subflow\",\n    parse: getSubflow\n  }, {\n    key: \"$tupleid\",\n    parse: getTupleId\n  }];\n  function getOperator(_, ctx) {\n    return ctx.get(_.$ref) || error(\"Operator not defined: \" + _.$ref);\n  }\n  function getExpression(_, ctx, params2) {\n    if (_.$params) {\n      ctx.parseParameters(_.$params, params2);\n    }\n    const k = \"e:\" + _.$expr.code;\n    return ctx.fn[k] || (ctx.fn[k] = accessor(ctx.parameterExpression(_.$expr), _.$fields));\n  }\n  function getKey(_, ctx) {\n    const k = \"k:\" + _.$key + \"_\" + !!_.$flat;\n    return ctx.fn[k] || (ctx.fn[k] = key$2(_.$key, _.$flat, ctx.expr.codegen));\n  }\n  function getField(_, ctx) {\n    if (!_.$field) return null;\n    const k = \"f:\" + _.$field + \"_\" + _.$name;\n    return ctx.fn[k] || (ctx.fn[k] = field$1(_.$field, _.$name, ctx.expr.codegen));\n  }\n  function getCompare(_, ctx) {\n    const k = \"c:\" + _.$compare + \"_\" + _.$order, c2 = array$5(_.$compare).map((_2) => _2 && _2.$tupleid ? tupleid : _2);\n    return ctx.fn[k] || (ctx.fn[k] = compare$2(c2, _.$order, ctx.expr.codegen));\n  }\n  function getEncode(_, ctx) {\n    const spec = _.$encode, encode2 = {};\n    for (const name in spec) {\n      const enc = spec[name];\n      encode2[name] = accessor(ctx.encodeExpression(enc.$expr), enc.$fields);\n      encode2[name].output = enc.$output;\n    }\n    return encode2;\n  }\n  function getContext(_, ctx) {\n    return ctx;\n  }\n  function getSubflow(_, ctx) {\n    const spec = _.$subflow;\n    return function(dataflow, key2, parent) {\n      const subctx = ctx.fork().parse(spec), op = subctx.get(spec.operators[0].id), p = subctx.signals.parent;\n      if (p) p.set(parent);\n      op.detachSubflow = () => ctx.detach(subctx);\n      return op;\n    };\n  }\n  function getTupleId() {\n    return tupleid;\n  }\n  function parseStream$2(spec) {\n    var ctx = this, filter2 = spec.filter != null ? ctx.eventExpression(spec.filter) : void 0, stream2 = spec.stream != null ? ctx.get(spec.stream) : void 0, args;\n    if (spec.source) {\n      stream2 = ctx.events(spec.source, spec.type, filter2);\n    } else if (spec.merge) {\n      args = spec.merge.map((_) => ctx.get(_));\n      stream2 = args[0].merge.apply(args[0], args.slice(1));\n    }\n    if (spec.between) {\n      args = spec.between.map((_) => ctx.get(_));\n      stream2 = stream2.between(args[0], args[1]);\n    }\n    if (spec.filter) {\n      stream2 = stream2.filter(filter2);\n    }\n    if (spec.throttle != null) {\n      stream2 = stream2.throttle(+spec.throttle);\n    }\n    if (spec.debounce != null) {\n      stream2 = stream2.debounce(+spec.debounce);\n    }\n    if (stream2 == null) {\n      error(\"Invalid stream definition: \" + JSON.stringify(spec));\n    }\n    if (spec.consume) stream2.consume(true);\n    ctx.stream(spec, stream2);\n  }\n  function parseUpdate$1(spec) {\n    var ctx = this, srcid = isObject$1(srcid = spec.source) ? srcid.$ref : srcid, source2 = ctx.get(srcid), target2 = null, update2 = spec.update, params2 = void 0;\n    if (!source2) error(\"Source not defined: \" + spec.source);\n    target2 = spec.target && spec.target.$expr ? ctx.eventExpression(spec.target.$expr) : ctx.get(spec.target);\n    if (update2 && update2.$expr) {\n      if (update2.$params) {\n        params2 = ctx.parseParameters(update2.$params);\n      }\n      update2 = ctx.handlerExpression(update2.$expr);\n    }\n    ctx.update(spec, source2, target2, update2, params2);\n  }\n  const SKIP = {\n    skip: true\n  };\n  function getState$1(options) {\n    var ctx = this, state = {};\n    if (options.signals) {\n      var signals = state.signals = {};\n      Object.keys(ctx.signals).forEach((key2) => {\n        const op = ctx.signals[key2];\n        if (options.signals(key2, op)) {\n          signals[key2] = op.value;\n        }\n      });\n    }\n    if (options.data) {\n      var data2 = state.data = {};\n      Object.keys(ctx.data).forEach((key2) => {\n        const dataset = ctx.data[key2];\n        if (options.data(key2, dataset)) {\n          data2[key2] = dataset.input.value;\n        }\n      });\n    }\n    if (ctx.subcontext && options.recurse !== false) {\n      state.subcontext = ctx.subcontext.map((ctx2) => ctx2.getState(options));\n    }\n    return state;\n  }\n  function setState$1(state) {\n    var ctx = this, df = ctx.dataflow, data2 = state.data, signals = state.signals;\n    Object.keys(signals || {}).forEach((key2) => {\n      df.update(ctx.signals[key2], signals[key2], SKIP);\n    });\n    Object.keys(data2 || {}).forEach((key2) => {\n      df.pulse(ctx.data[key2].input, df.changeset().remove(truthy).insert(data2[key2]));\n    });\n    (state.subcontext || []).forEach((substate, i) => {\n      const subctx = ctx.subcontext[i];\n      if (subctx) subctx.setState(substate);\n    });\n  }\n  function context(df, transforms2, functions, expr2) {\n    return new Context(df, transforms2, functions, expr2);\n  }\n  function Context(df, transforms2, functions, expr2) {\n    this.dataflow = df;\n    this.transforms = transforms2;\n    this.events = df.events.bind(df);\n    this.expr = expr2 || expressionCodegen, this.signals = {};\n    this.scales = {};\n    this.nodes = {};\n    this.data = {};\n    this.fn = {};\n    if (functions) {\n      this.functions = Object.create(functions);\n      this.functions.context = this;\n    }\n  }\n  function Subcontext(ctx) {\n    this.dataflow = ctx.dataflow;\n    this.transforms = ctx.transforms;\n    this.events = ctx.events;\n    this.expr = ctx.expr;\n    this.signals = Object.create(ctx.signals);\n    this.scales = Object.create(ctx.scales);\n    this.nodes = Object.create(ctx.nodes);\n    this.data = Object.create(ctx.data);\n    this.fn = Object.create(ctx.fn);\n    if (ctx.functions) {\n      this.functions = Object.create(ctx.functions);\n      this.functions.context = this;\n    }\n  }\n  Context.prototype = Subcontext.prototype = {\n    fork() {\n      const ctx = new Subcontext(this);\n      (this.subcontext || (this.subcontext = [])).push(ctx);\n      return ctx;\n    },\n    detach(ctx) {\n      this.subcontext = this.subcontext.filter((c2) => c2 !== ctx);\n      const keys2 = Object.keys(ctx.nodes);\n      for (const key2 of keys2) ctx.nodes[key2]._targets = null;\n      for (const key2 of keys2) ctx.nodes[key2].detach();\n      ctx.nodes = null;\n    },\n    get(id2) {\n      return this.nodes[id2];\n    },\n    set(id2, node) {\n      return this.nodes[id2] = node;\n    },\n    add(spec, op) {\n      const ctx = this, df = ctx.dataflow, data2 = spec.value;\n      ctx.set(spec.id, op);\n      if (isCollect(spec.type) && data2) {\n        if (data2.$ingest) {\n          df.ingest(op, data2.$ingest, data2.$format);\n        } else if (data2.$request) {\n          df.preload(op, data2.$request, data2.$format);\n        } else {\n          df.pulse(op, df.changeset().insert(data2));\n        }\n      }\n      if (spec.root) {\n        ctx.root = op;\n      }\n      if (spec.parent) {\n        let p = ctx.get(spec.parent.$ref);\n        if (p) {\n          df.connect(p, [op]);\n          op.targets().add(p);\n        } else {\n          (ctx.unresolved = ctx.unresolved || []).push(() => {\n            p = ctx.get(spec.parent.$ref);\n            df.connect(p, [op]);\n            op.targets().add(p);\n          });\n        }\n      }\n      if (spec.signal) {\n        ctx.signals[spec.signal] = op;\n      }\n      if (spec.scale) {\n        ctx.scales[spec.scale] = op;\n      }\n      if (spec.data) {\n        for (const name in spec.data) {\n          const data3 = ctx.data[name] || (ctx.data[name] = {});\n          spec.data[name].forEach((role) => data3[role] = op);\n        }\n      }\n    },\n    resolve() {\n      (this.unresolved || []).forEach((fn2) => fn2());\n      delete this.unresolved;\n      return this;\n    },\n    operator(spec, update2) {\n      this.add(spec, this.dataflow.add(spec.value, update2));\n    },\n    transform(spec, type2) {\n      this.add(spec, this.dataflow.add(this.transforms[canonicalType(type2)]));\n    },\n    stream(spec, stream2) {\n      this.set(spec.id, stream2);\n    },\n    update(spec, stream2, target2, update2, params2) {\n      this.dataflow.on(stream2, target2, update2, params2, spec.options);\n    },\n    // expression parsing\n    operatorExpression(expr2) {\n      return this.expr.operator(this, expr2);\n    },\n    parameterExpression(expr2) {\n      return this.expr.parameter(this, expr2);\n    },\n    eventExpression(expr2) {\n      return this.expr.event(this, expr2);\n    },\n    handlerExpression(expr2) {\n      return this.expr.handler(this, expr2);\n    },\n    encodeExpression(encode2) {\n      return this.expr.encode(this, encode2);\n    },\n    // parse methods\n    parse: parse$2,\n    parseOperator,\n    parseOperatorParameters,\n    parseParameters: parseParameters$1,\n    parseStream: parseStream$2,\n    parseUpdate: parseUpdate$1,\n    // state methods\n    getState: getState$1,\n    setState: setState$1\n  };\n  function initializeAria(view) {\n    const el = view.container();\n    if (el) {\n      el.setAttribute(\"role\", \"graphics-document\");\n      el.setAttribute(\"aria-roleDescription\", \"visualization\");\n      ariaLabel(el, view.description());\n    }\n  }\n  function ariaLabel(el, desc) {\n    if (el) desc == null ? el.removeAttribute(\"aria-label\") : el.setAttribute(\"aria-label\", desc);\n  }\n  function background(view) {\n    view.add(null, (_) => {\n      view._background = _.bg;\n      view._resize = 1;\n      return _.bg;\n    }, {\n      bg: view._signals.background\n    });\n  }\n  const Default = \"default\";\n  function cursor(view) {\n    const cursor2 = view._signals.cursor || (view._signals.cursor = view.add({\n      user: Default,\n      item: null\n    }));\n    view.on(view.events(\"view\", \"pointermove\"), cursor2, (_, event2) => {\n      const value2 = cursor2.value, user = value2 ? isString(value2) ? value2 : value2.user : Default, item = event2.item && event2.item.cursor || null;\n      return value2 && user === value2.user && item == value2.item ? value2 : {\n        user,\n        item\n      };\n    });\n    view.add(null, function(_) {\n      let user = _.cursor, item = this.value;\n      if (!isString(user)) {\n        item = user.item;\n        user = user.user;\n      }\n      setCursor(view, user && user !== Default ? user : item || user);\n      return item;\n    }, {\n      cursor: cursor2\n    });\n  }\n  function setCursor(view, cursor2) {\n    const el = view.globalCursor() ? typeof document !== \"undefined\" && document.body : view.container();\n    if (el) {\n      return cursor2 == null ? el.style.removeProperty(\"cursor\") : el.style.cursor = cursor2;\n    }\n  }\n  function dataref(view, name) {\n    var data2 = view._runtime.data;\n    if (!has$1(data2, name)) {\n      error(\"Unrecognized data set: \" + name);\n    }\n    return data2[name];\n  }\n  function data$1(name, values2) {\n    return arguments.length < 2 ? dataref(this, name).values.value : change.call(this, name, changeset().remove(truthy).insert(values2));\n  }\n  function change(name, changes) {\n    if (!isChangeSet(changes)) {\n      error(\"Second argument to changes must be a changeset.\");\n    }\n    const dataset = dataref(this, name);\n    dataset.modified = true;\n    return this.pulse(dataset.input, changes);\n  }\n  function insert(name, _) {\n    return change.call(this, name, changeset().insert(_));\n  }\n  function remove(name, _) {\n    return change.call(this, name, changeset().remove(_));\n  }\n  function width(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewWidth + padding2.left + padding2.right);\n  }\n  function height(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewHeight + padding2.top + padding2.bottom);\n  }\n  function offset(view) {\n    var padding2 = view.padding(), origin = view._origin;\n    return [padding2.left + origin[0], padding2.top + origin[1]];\n  }\n  function resizeRenderer(view) {\n    var origin = offset(view), w2 = width(view), h2 = height(view);\n    view._renderer.background(view.background());\n    view._renderer.resize(w2, h2, origin);\n    view._handler.origin(origin);\n    view._resizeListeners.forEach((handler) => {\n      try {\n        handler(w2, h2);\n      } catch (error2) {\n        view.error(error2);\n      }\n    });\n  }\n  function eventExtend(view, event2, item) {\n    var r = view._renderer, el = r && r.canvas(), p, e, translate2;\n    if (el) {\n      translate2 = offset(view);\n      e = event2.changedTouches ? event2.changedTouches[0] : event2;\n      p = point(e, el);\n      p[0] -= translate2[0];\n      p[1] -= translate2[1];\n    }\n    event2.dataflow = view;\n    event2.item = item;\n    event2.vega = extension(view, item, p);\n    return event2;\n  }\n  function extension(view, item, point2) {\n    const itemGroup = item ? item.mark.marktype === \"group\" ? item : item.mark.group : null;\n    function group2(name) {\n      var g = itemGroup, i;\n      if (name) for (i = item; i; i = i.mark.group) {\n        if (i.mark.name === name) {\n          g = i;\n          break;\n        }\n      }\n      return g && g.mark && g.mark.interactive ? g : {};\n    }\n    function xy(item2) {\n      if (!item2) return point2;\n      if (isString(item2)) item2 = group2(item2);\n      const p = point2.slice();\n      while (item2) {\n        p[0] -= item2.x || 0;\n        p[1] -= item2.y || 0;\n        item2 = item2.mark && item2.mark.group;\n      }\n      return p;\n    }\n    return {\n      view: constant$5(view),\n      item: constant$5(item || {}),\n      group: group2,\n      xy,\n      x: (item2) => xy(item2)[0],\n      y: (item2) => xy(item2)[1]\n    };\n  }\n  const VIEW$1 = \"view\", TIMER = \"timer\", WINDOW = \"window\", NO_TRAP = {\n    trap: false\n  };\n  function initializeEventConfig(config) {\n    const events2 = extend$1({\n      defaults: {}\n    }, config);\n    const unpack = (obj2, keys2) => {\n      keys2.forEach((k) => {\n        if (isArray(obj2[k])) obj2[k] = toSet(obj2[k]);\n      });\n    };\n    unpack(events2.defaults, [\"prevent\", \"allow\"]);\n    unpack(events2, [\"view\", \"window\", \"selector\"]);\n    return events2;\n  }\n  function trackEventListener(view, sources, type2, handler) {\n    view._eventListeners.push({\n      type: type2,\n      sources: array$5(sources),\n      handler\n    });\n  }\n  function prevent(view, type2) {\n    var def2 = view._eventConfig.defaults, prevent2 = def2.prevent, allow = def2.allow;\n    return prevent2 === false || allow === true ? false : prevent2 === true || allow === false ? true : prevent2 ? prevent2[type2] : allow ? !allow[type2] : view.preventDefault();\n  }\n  function permit(view, key2, type2) {\n    const rule2 = view._eventConfig && view._eventConfig[key2];\n    if (rule2 === false || isObject$1(rule2) && !rule2[type2]) {\n      view.warn(`Blocked ${key2} ${type2} event listener.`);\n      return false;\n    }\n    return true;\n  }\n  function events(source2, type2, filter2) {\n    var view = this, s = new EventStream(filter2), send = function(e, item) {\n      view.runAsync(null, () => {\n        if (source2 === VIEW$1 && prevent(view, type2)) {\n          e.preventDefault();\n        }\n        s.receive(eventExtend(view, e, item));\n      });\n    }, sources;\n    if (source2 === TIMER) {\n      if (permit(view, \"timer\", type2)) {\n        view.timer(send, type2);\n      }\n    } else if (source2 === VIEW$1) {\n      if (permit(view, \"view\", type2)) {\n        view.addEventListener(type2, send, NO_TRAP);\n      }\n    } else {\n      if (source2 === WINDOW) {\n        if (permit(view, \"window\", type2) && typeof window !== \"undefined\") {\n          sources = [window];\n        }\n      } else if (typeof document !== \"undefined\") {\n        if (permit(view, \"selector\", type2)) {\n          sources = Array.from(document.querySelectorAll(source2));\n        }\n      }\n      if (!sources) {\n        view.warn(\"Can not resolve event source: \" + source2);\n      } else {\n        for (var i = 0, n = sources.length; i < n; ++i) {\n          sources[i].addEventListener(type2, send);\n        }\n        trackEventListener(view, sources, type2, send);\n      }\n    }\n    return s;\n  }\n  function itemFilter(event2) {\n    return event2.item;\n  }\n  function markTarget(event2) {\n    return event2.item.mark.source;\n  }\n  function invoke(name) {\n    return function(_, event2) {\n      return event2.vega.view().changeset().encode(event2.item, name);\n    };\n  }\n  function hover(hoverSet, leaveSet) {\n    hoverSet = [hoverSet || \"hover\"];\n    leaveSet = [leaveSet || \"update\", hoverSet[0]];\n    this.on(this.events(\"view\", \"pointerover\", itemFilter), markTarget, invoke(hoverSet));\n    this.on(this.events(\"view\", \"pointerout\", itemFilter), markTarget, invoke(leaveSet));\n    return this;\n  }\n  function finalize() {\n    var tooltip = this._tooltip, timers = this._timers, handlers = this._handler.handlers(), listeners = this._eventListeners, n, m2, e, h2, t;\n    n = timers.length;\n    while (--n >= 0) {\n      timers[n].stop();\n    }\n    n = listeners.length;\n    while (--n >= 0) {\n      e = listeners[n];\n      m2 = e.sources.length;\n      while (--m2 >= 0) {\n        e.sources[m2].removeEventListener(e.type, e.handler);\n      }\n    }\n    if (tooltip) {\n      tooltip.call(this, this._handler, null, null, null);\n    }\n    n = handlers.length;\n    while (--n >= 0) {\n      t = handlers[n].type;\n      h2 = handlers[n].handler;\n      this._handler.off(t, h2);\n    }\n    return this;\n  }\n  function element(tag, attr2, text2) {\n    const el = document.createElement(tag);\n    for (const key2 in attr2) el.setAttribute(key2, attr2[key2]);\n    if (text2 != null) el.textContent = text2;\n    return el;\n  }\n  const BindClass = \"vega-bind\", NameClass = \"vega-bind-name\", RadioClass = \"vega-bind-radio\";\n  function bind(view, el, binding) {\n    if (!el) return;\n    const param2 = binding.param;\n    let bind2 = binding.state;\n    if (!bind2) {\n      bind2 = binding.state = {\n        elements: null,\n        active: false,\n        set: null,\n        update: (value2) => {\n          if (value2 != view.signal(param2.signal)) {\n            view.runAsync(null, () => {\n              bind2.source = true;\n              view.signal(param2.signal, value2);\n            });\n          }\n        }\n      };\n      if (param2.debounce) {\n        bind2.update = debounce$1(param2.debounce, bind2.update);\n      }\n    }\n    const create2 = param2.input == null && param2.element ? target : generate;\n    create2(bind2, el, param2, view);\n    if (!bind2.active) {\n      view.on(view._signals[param2.signal], null, () => {\n        bind2.source ? bind2.source = false : bind2.set(view.signal(param2.signal));\n      });\n      bind2.active = true;\n    }\n    return bind2;\n  }\n  function target(bind2, node, param2, view) {\n    const type2 = param2.event || \"input\";\n    const handler = () => bind2.update(node.value);\n    view.signal(param2.signal, node.value);\n    node.addEventListener(type2, handler);\n    trackEventListener(view, node, type2, handler);\n    bind2.set = (value2) => {\n      node.value = value2;\n      node.dispatchEvent(event(type2));\n    };\n  }\n  function event(type2) {\n    return typeof Event !== \"undefined\" ? new Event(type2) : {\n      type: type2\n    };\n  }\n  function generate(bind2, el, param2, view) {\n    const value2 = view.signal(param2.signal);\n    const div = element(\"div\", {\n      \"class\": BindClass\n    });\n    const wrapper = param2.input === \"radio\" ? div : div.appendChild(element(\"label\"));\n    wrapper.appendChild(element(\"span\", {\n      \"class\": NameClass\n    }, param2.name || param2.signal));\n    el.appendChild(div);\n    let input = form;\n    switch (param2.input) {\n      case \"checkbox\":\n        input = checkbox;\n        break;\n      case \"select\":\n        input = select;\n        break;\n      case \"radio\":\n        input = radio;\n        break;\n      case \"range\":\n        input = range;\n        break;\n    }\n    input(bind2, wrapper, param2, value2);\n  }\n  function form(bind2, el, param2, value2) {\n    const node = element(\"input\");\n    for (const key2 in param2) {\n      if (key2 !== \"signal\" && key2 !== \"element\") {\n        node.setAttribute(key2 === \"input\" ? \"type\" : key2, param2[key2]);\n      }\n    }\n    node.setAttribute(\"name\", param2.signal);\n    node.value = value2;\n    el.appendChild(node);\n    node.addEventListener(\"input\", () => bind2.update(node.value));\n    bind2.elements = [node];\n    bind2.set = (value3) => node.value = value3;\n  }\n  function checkbox(bind2, el, param2, value2) {\n    const attr2 = {\n      type: \"checkbox\",\n      name: param2.signal\n    };\n    if (value2) attr2.checked = true;\n    const node = element(\"input\", attr2);\n    el.appendChild(node);\n    node.addEventListener(\"change\", () => bind2.update(node.checked));\n    bind2.elements = [node];\n    bind2.set = (value3) => node.checked = !!value3 || null;\n  }\n  function select(bind2, el, param2, value2) {\n    const node = element(\"select\", {\n      name: param2.signal\n    }), labels = param2.labels || [];\n    param2.options.forEach((option, i) => {\n      const attr2 = {\n        value: option\n      };\n      if (valuesEqual(option, value2)) attr2.selected = true;\n      node.appendChild(element(\"option\", attr2, (labels[i] || option) + \"\"));\n    });\n    el.appendChild(node);\n    node.addEventListener(\"change\", () => {\n      bind2.update(param2.options[node.selectedIndex]);\n    });\n    bind2.elements = [node];\n    bind2.set = (value3) => {\n      for (let i = 0, n = param2.options.length; i < n; ++i) {\n        if (valuesEqual(param2.options[i], value3)) {\n          node.selectedIndex = i;\n          return;\n        }\n      }\n    };\n  }\n  function radio(bind2, el, param2, value2) {\n    const group2 = element(\"span\", {\n      \"class\": RadioClass\n    }), labels = param2.labels || [];\n    el.appendChild(group2);\n    bind2.elements = param2.options.map((option, i) => {\n      const attr2 = {\n        type: \"radio\",\n        name: param2.signal,\n        value: option\n      };\n      if (valuesEqual(option, value2)) attr2.checked = true;\n      const input = element(\"input\", attr2);\n      input.addEventListener(\"change\", () => bind2.update(option));\n      const label2 = element(\"label\", {}, (labels[i] || option) + \"\");\n      label2.prepend(input);\n      group2.appendChild(label2);\n      return input;\n    });\n    bind2.set = (value3) => {\n      const nodes = bind2.elements, n = nodes.length;\n      for (let i = 0; i < n; ++i) {\n        if (valuesEqual(nodes[i].value, value3)) nodes[i].checked = true;\n      }\n    };\n  }\n  function range(bind2, el, param2, value2) {\n    value2 = value2 !== void 0 ? value2 : (+param2.max + +param2.min) / 2;\n    const max2 = param2.max != null ? param2.max : Math.max(100, +value2) || 100, min2 = param2.min || Math.min(0, max2, +value2) || 0, step = param2.step || tickStep(min2, max2, 100);\n    const node = element(\"input\", {\n      type: \"range\",\n      name: param2.signal,\n      min: min2,\n      max: max2,\n      step\n    });\n    node.value = value2;\n    const span2 = element(\"span\", {}, +value2);\n    el.appendChild(node);\n    el.appendChild(span2);\n    const update2 = () => {\n      span2.textContent = node.value;\n      bind2.update(+node.value);\n    };\n    node.addEventListener(\"input\", update2);\n    node.addEventListener(\"change\", update2);\n    bind2.elements = [node];\n    bind2.set = (value3) => {\n      node.value = value3;\n      span2.textContent = value3;\n    };\n  }\n  function valuesEqual(a2, b2) {\n    return a2 === b2 || a2 + \"\" === b2 + \"\";\n  }\n  function initializeRenderer(view, r, el, constructor, scaleFactor, opt) {\n    r = r || new constructor(view.loader());\n    return r.initialize(el, width(view), height(view), offset(view), scaleFactor, opt).background(view.background());\n  }\n  function trap(view, fn2) {\n    return !fn2 ? null : function() {\n      try {\n        fn2.apply(this, arguments);\n      } catch (error2) {\n        view.error(error2);\n      }\n    };\n  }\n  function initializeHandler(view, prevHandler, el, constructor) {\n    const handler = new constructor(view.loader(), trap(view, view.tooltip())).scene(view.scenegraph().root).initialize(el, offset(view), view);\n    if (prevHandler) {\n      prevHandler.handlers().forEach((h2) => {\n        handler.on(h2.type, h2.handler);\n      });\n    }\n    return handler;\n  }\n  function initialize(el, elBind) {\n    const view = this, type2 = view._renderType, config = view._eventConfig.bind, module = renderModule(type2);\n    el = view._el = el ? lookup$1(view, el, true) : null;\n    initializeAria(view);\n    if (!module) view.error(\"Unrecognized renderer type: \" + type2);\n    const Handler2 = module.handler || CanvasHandler, Renderer2 = el ? module.renderer : module.headless;\n    view._renderer = !Renderer2 ? null : initializeRenderer(view, view._renderer, el, Renderer2);\n    view._handler = initializeHandler(view, view._handler, el, Handler2);\n    view._redraw = true;\n    if (el && config !== \"none\") {\n      elBind = elBind ? view._elBind = lookup$1(view, elBind, true) : el.appendChild(element(\"form\", {\n        \"class\": \"vega-bindings\"\n      }));\n      view._bind.forEach((_) => {\n        if (_.param.element && config !== \"container\") {\n          _.element = lookup$1(view, _.param.element, !!_.param.input);\n        }\n      });\n      view._bind.forEach((_) => {\n        bind(view, _.element || elBind, _);\n      });\n    }\n    return view;\n  }\n  function lookup$1(view, el, clear) {\n    if (typeof el === \"string\") {\n      if (typeof document !== \"undefined\") {\n        el = document.querySelector(el);\n        if (!el) {\n          view.error(\"Signal bind element not found: \" + el);\n          return null;\n        }\n      } else {\n        view.error(\"DOM document instance not found.\");\n        return null;\n      }\n    }\n    if (el && clear) {\n      try {\n        el.textContent = \"\";\n      } catch (e) {\n        el = null;\n        view.error(e);\n      }\n    }\n    return el;\n  }\n  const number$1 = (_) => +_ || 0;\n  const paddingObject$1 = (_) => ({\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  });\n  function padding(_) {\n    return isObject$1(_) ? {\n      top: number$1(_.top),\n      bottom: number$1(_.bottom),\n      left: number$1(_.left),\n      right: number$1(_.right)\n    } : paddingObject$1(number$1(_));\n  }\n  async function renderHeadless(view, type2, scaleFactor, opt) {\n    const module = renderModule(type2), ctr = module && module.headless;\n    if (!ctr) error(\"Unrecognized renderer type: \" + type2);\n    await view.runAsync();\n    return initializeRenderer(view, null, null, ctr, scaleFactor, opt).renderAsync(view._scenegraph.root);\n  }\n  async function renderToImageURL(type2, scaleFactor) {\n    if (type2 !== RenderType.Canvas && type2 !== RenderType.SVG && type2 !== RenderType.PNG) {\n      error(\"Unrecognized image type: \" + type2);\n    }\n    const r = await renderHeadless(this, type2, scaleFactor);\n    return type2 === RenderType.SVG ? toBlobURL(r.svg(), \"image/svg+xml\") : r.canvas().toDataURL(\"image/png\");\n  }\n  function toBlobURL(data2, mime) {\n    const blob = new Blob([data2], {\n      type: mime\n    });\n    return window.URL.createObjectURL(blob);\n  }\n  async function renderToCanvas(scaleFactor, opt) {\n    const r = await renderHeadless(this, RenderType.Canvas, scaleFactor, opt);\n    return r.canvas();\n  }\n  async function renderToSVG(scaleFactor) {\n    const r = await renderHeadless(this, RenderType.SVG, scaleFactor);\n    return r.svg();\n  }\n  function runtime(view, spec, expr2) {\n    return context(view, transforms, functionContext, expr2).parse(spec);\n  }\n  function scale$3(name) {\n    var scales2 = this._runtime.scales;\n    if (!has$1(scales2, name)) {\n      error(\"Unrecognized scale or projection: \" + name);\n    }\n    return scales2[name].value;\n  }\n  var Width = \"width\", Height = \"height\", Padding = \"padding\", Skip$1 = {\n    skip: true\n  };\n  function viewWidth(view, width2) {\n    var a2 = view.autosize(), p = view.padding();\n    return width2 - (a2 && a2.contains === Padding ? p.left + p.right : 0);\n  }\n  function viewHeight(view, height2) {\n    var a2 = view.autosize(), p = view.padding();\n    return height2 - (a2 && a2.contains === Padding ? p.top + p.bottom : 0);\n  }\n  function initializeResize(view) {\n    var s = view._signals, w2 = s[Width], h2 = s[Height], p = s[Padding];\n    function resetSize() {\n      view._autosize = view._resize = 1;\n    }\n    view._resizeWidth = view.add(null, (_) => {\n      view._width = _.size;\n      view._viewWidth = viewWidth(view, _.size);\n      resetSize();\n    }, {\n      size: w2\n    });\n    view._resizeHeight = view.add(null, (_) => {\n      view._height = _.size;\n      view._viewHeight = viewHeight(view, _.size);\n      resetSize();\n    }, {\n      size: h2\n    });\n    const resizePadding = view.add(null, resetSize, {\n      pad: p\n    });\n    view._resizeWidth.rank = w2.rank + 1;\n    view._resizeHeight.rank = h2.rank + 1;\n    resizePadding.rank = p.rank + 1;\n  }\n  function resizeView(viewWidth2, viewHeight2, width2, height2, origin, auto) {\n    this.runAfter((view) => {\n      let rerun2 = 0;\n      view._autosize = 0;\n      if (view.width() !== width2) {\n        rerun2 = 1;\n        view.signal(Width, width2, Skip$1);\n        view._resizeWidth.skip(true);\n      }\n      if (view.height() !== height2) {\n        rerun2 = 1;\n        view.signal(Height, height2, Skip$1);\n        view._resizeHeight.skip(true);\n      }\n      if (view._viewWidth !== viewWidth2) {\n        view._resize = 1;\n        view._viewWidth = viewWidth2;\n      }\n      if (view._viewHeight !== viewHeight2) {\n        view._resize = 1;\n        view._viewHeight = viewHeight2;\n      }\n      if (view._origin[0] !== origin[0] || view._origin[1] !== origin[1]) {\n        view._resize = 1;\n        view._origin = origin;\n      }\n      if (rerun2) view.run(\"enter\");\n      if (auto) view.runAfter((v) => v.resize());\n    }, false, 1);\n  }\n  function getState(options) {\n    return this._runtime.getState(options || {\n      data: dataTest,\n      signals: signalTest,\n      recurse: true\n    });\n  }\n  function dataTest(name, data2) {\n    return data2.modified && isArray(data2.input.value) && !name.startsWith(\"_:vega:_\");\n  }\n  function signalTest(name, op) {\n    return !(name === \"parent\" || op instanceof transforms.proxy);\n  }\n  function setState(state) {\n    this.runAsync(null, (v) => {\n      v._trigger = false;\n      v._runtime.setState(state);\n    }, (v) => {\n      v._trigger = true;\n    });\n    return this;\n  }\n  function timer(callback, delay) {\n    function tick(elapsed) {\n      callback({\n        timestamp: Date.now(),\n        elapsed\n      });\n    }\n    this._timers.push(interval(tick, delay));\n  }\n  function defaultTooltip(handler, event2, item, value2) {\n    const el = handler.element();\n    if (el) el.setAttribute(\"title\", formatTooltip(value2));\n  }\n  function formatTooltip(value2) {\n    return value2 == null ? \"\" : isArray(value2) ? formatArray(value2) : isObject$1(value2) && !isDate$1(value2) ? formatObject(value2) : value2 + \"\";\n  }\n  function formatObject(obj2) {\n    return Object.keys(obj2).map((key2) => {\n      const v = obj2[key2];\n      return key2 + \": \" + (isArray(v) ? formatArray(v) : formatValue(v));\n    }).join(\"\\n\");\n  }\n  function formatArray(value2) {\n    return \"[\" + value2.map(formatValue).join(\", \") + \"]\";\n  }\n  function formatValue(value2) {\n    return isArray(value2) ? \"[…]\" : isObject$1(value2) && !isDate$1(value2) ? \"{…}\" : value2;\n  }\n  function watchPixelRatio() {\n    if (this.renderer() === \"canvas\" && this._renderer._canvas) {\n      let remove2 = null;\n      const updatePixelRatio = () => {\n        if (remove2 != null) {\n          remove2();\n        }\n        const media = matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n        media.addEventListener(\"change\", updatePixelRatio);\n        remove2 = () => {\n          media.removeEventListener(\"change\", updatePixelRatio);\n        };\n        this._renderer._canvas.getContext(\"2d\").pixelRatio = window.devicePixelRatio || 1;\n        this._redraw = true;\n        this._resize = 1;\n        this.resize().runAsync();\n      };\n      updatePixelRatio();\n    }\n  }\n  function View$1(spec, options) {\n    const view = this;\n    options = options || {};\n    Dataflow.call(view);\n    if (options.loader) view.loader(options.loader);\n    if (options.logger) view.logger(options.logger);\n    if (options.logLevel != null) view.logLevel(options.logLevel);\n    if (options.locale || spec.locale) {\n      const loc = extend$1({}, spec.locale, options.locale);\n      view.locale(locale(loc.number, loc.time));\n    }\n    view._el = null;\n    view._elBind = null;\n    view._renderType = options.renderer || RenderType.Canvas;\n    view._scenegraph = new Scenegraph();\n    const root = view._scenegraph.root;\n    view._renderer = null;\n    view._tooltip = options.tooltip || defaultTooltip, view._redraw = true;\n    view._handler = new CanvasHandler().scene(root);\n    view._globalCursor = false;\n    view._preventDefault = false;\n    view._timers = [];\n    view._eventListeners = [];\n    view._resizeListeners = [];\n    view._eventConfig = initializeEventConfig(spec.eventConfig);\n    view.globalCursor(view._eventConfig.globalCursor);\n    const ctx = runtime(view, spec, options.expr);\n    view._runtime = ctx;\n    view._signals = ctx.signals;\n    view._bind = (spec.bindings || []).map((_) => ({\n      state: null,\n      param: extend$1({}, _)\n    }));\n    if (ctx.root) ctx.root.set(root);\n    root.source = ctx.data.root.input;\n    view.pulse(ctx.data.root.input, view.changeset().insert(root.items));\n    view._width = view.width();\n    view._height = view.height();\n    view._viewWidth = viewWidth(view, view._width);\n    view._viewHeight = viewHeight(view, view._height);\n    view._origin = [0, 0];\n    view._resize = 0;\n    view._autosize = 1;\n    initializeResize(view);\n    background(view);\n    cursor(view);\n    view.description(spec.description);\n    if (options.hover) view.hover();\n    if (options.container) view.initialize(options.container, options.bind);\n    if (options.watchPixelRatio) view._watchPixelRatio();\n  }\n  function lookupSignal(view, name) {\n    return has$1(view._signals, name) ? view._signals[name] : error(\"Unrecognized signal name: \" + $(name));\n  }\n  function findOperatorHandler(op, handler) {\n    const h2 = (op._targets || []).filter((op2) => op2._update && op2._update.handler === handler);\n    return h2.length ? h2[0] : null;\n  }\n  function addOperatorListener(view, name, op, handler) {\n    let h2 = findOperatorHandler(op, handler);\n    if (!h2) {\n      h2 = trap(view, () => handler(name, op.value));\n      h2.handler = handler;\n      view.on(op, null, h2);\n    }\n    return view;\n  }\n  function removeOperatorListener(view, op, handler) {\n    const h2 = findOperatorHandler(op, handler);\n    if (h2) op._targets.remove(h2);\n    return view;\n  }\n  inherits(View$1, Dataflow, {\n    // -- DATAFLOW / RENDERING ----\n    async evaluate(encode2, prerun, postrun) {\n      await Dataflow.prototype.evaluate.call(this, encode2, prerun);\n      if (this._redraw || this._resize) {\n        try {\n          if (this._renderer) {\n            if (this._resize) {\n              this._resize = 0;\n              resizeRenderer(this);\n            }\n            await this._renderer.renderAsync(this._scenegraph.root);\n          }\n          this._redraw = false;\n        } catch (e) {\n          this.error(e);\n        }\n      }\n      if (postrun) asyncCallback(this, postrun);\n      return this;\n    },\n    dirty(item) {\n      this._redraw = true;\n      this._renderer && this._renderer.dirty(item);\n    },\n    // -- GET / SET ----\n    description(text2) {\n      if (arguments.length) {\n        const desc = text2 != null ? text2 + \"\" : null;\n        if (desc !== this._desc) ariaLabel(this._el, this._desc = desc);\n        return this;\n      }\n      return this._desc;\n    },\n    container() {\n      return this._el;\n    },\n    scenegraph() {\n      return this._scenegraph;\n    },\n    origin() {\n      return this._origin.slice();\n    },\n    signal(name, value2, options) {\n      const op = lookupSignal(this, name);\n      return arguments.length === 1 ? op.value : this.update(op, value2, options);\n    },\n    width(_) {\n      return arguments.length ? this.signal(\"width\", _) : this.signal(\"width\");\n    },\n    height(_) {\n      return arguments.length ? this.signal(\"height\", _) : this.signal(\"height\");\n    },\n    padding(_) {\n      return arguments.length ? this.signal(\"padding\", padding(_)) : padding(this.signal(\"padding\"));\n    },\n    autosize(_) {\n      return arguments.length ? this.signal(\"autosize\", _) : this.signal(\"autosize\");\n    },\n    background(_) {\n      return arguments.length ? this.signal(\"background\", _) : this.signal(\"background\");\n    },\n    renderer(type2) {\n      if (!arguments.length) return this._renderType;\n      if (!renderModule(type2)) error(\"Unrecognized renderer type: \" + type2);\n      if (type2 !== this._renderType) {\n        this._renderType = type2;\n        this._resetRenderer();\n      }\n      return this;\n    },\n    tooltip(handler) {\n      if (!arguments.length) return this._tooltip;\n      if (handler !== this._tooltip) {\n        this._tooltip = handler;\n        this._resetRenderer();\n      }\n      return this;\n    },\n    loader(loader2) {\n      if (!arguments.length) return this._loader;\n      if (loader2 !== this._loader) {\n        Dataflow.prototype.loader.call(this, loader2);\n        this._resetRenderer();\n      }\n      return this;\n    },\n    resize() {\n      this._autosize = 1;\n      return this.touch(lookupSignal(this, \"autosize\"));\n    },\n    _resetRenderer() {\n      if (this._renderer) {\n        this._renderer = null;\n        this.initialize(this._el, this._elBind);\n      }\n    },\n    // -- SIZING ----\n    _resizeView: resizeView,\n    // -- EVENT HANDLING ----\n    addEventListener(type2, handler, options) {\n      let callback = handler;\n      if (!(options && options.trap === false)) {\n        callback = trap(this, handler);\n        callback.raw = handler;\n      }\n      this._handler.on(type2, callback);\n      return this;\n    },\n    removeEventListener(type2, handler) {\n      var handlers = this._handler.handlers(type2), i = handlers.length, h2, t;\n      while (--i >= 0) {\n        t = handlers[i].type;\n        h2 = handlers[i].handler;\n        if (type2 === t && (handler === h2 || handler === h2.raw)) {\n          this._handler.off(t, h2);\n          break;\n        }\n      }\n      return this;\n    },\n    addResizeListener(handler) {\n      const l = this._resizeListeners;\n      if (!l.includes(handler)) {\n        l.push(handler);\n      }\n      return this;\n    },\n    removeResizeListener(handler) {\n      var l = this._resizeListeners, i = l.indexOf(handler);\n      if (i >= 0) {\n        l.splice(i, 1);\n      }\n      return this;\n    },\n    addSignalListener(name, handler) {\n      return addOperatorListener(this, name, lookupSignal(this, name), handler);\n    },\n    removeSignalListener(name, handler) {\n      return removeOperatorListener(this, lookupSignal(this, name), handler);\n    },\n    addDataListener(name, handler) {\n      return addOperatorListener(this, name, dataref(this, name).values, handler);\n    },\n    removeDataListener(name, handler) {\n      return removeOperatorListener(this, dataref(this, name).values, handler);\n    },\n    globalCursor(_) {\n      if (arguments.length) {\n        if (this._globalCursor !== !!_) {\n          const prev = setCursor(this, null);\n          this._globalCursor = !!_;\n          if (prev) setCursor(this, prev);\n        }\n        return this;\n      } else {\n        return this._globalCursor;\n      }\n    },\n    preventDefault(_) {\n      if (arguments.length) {\n        this._preventDefault = _;\n        return this;\n      } else {\n        return this._preventDefault;\n      }\n    },\n    timer,\n    events,\n    finalize,\n    hover,\n    // -- DATA ----\n    data: data$1,\n    change,\n    insert,\n    remove,\n    // -- SCALES --\n    scale: scale$3,\n    // -- INITIALIZATION ----\n    initialize,\n    // -- HEADLESS RENDERING ----\n    toImageURL: renderToImageURL,\n    toCanvas: renderToCanvas,\n    toSVG: renderToSVG,\n    // -- SAVE / RESTORE STATE ----\n    getState,\n    setState,\n    // RE-RENDER ON ZOOM\n    _watchPixelRatio: watchPixelRatio\n  });\n  const VIEW = \"view\", LBRACK = \"[\", RBRACK = \"]\", LBRACE = \"{\", RBRACE = \"}\", COLON = \":\", COMMA = \",\", NAME = \"@\", GT = \">\", ILLEGAL = /[[\\]{}]/, DEFAULT_MARKS = {\n    \"*\": 1,\n    arc: 1,\n    area: 1,\n    group: 1,\n    image: 1,\n    line: 1,\n    path: 1,\n    rect: 1,\n    rule: 1,\n    shape: 1,\n    symbol: 1,\n    text: 1,\n    trail: 1\n  };\n  let DEFAULT_SOURCE, MARKS;\n  function eventSelector(selector, source2, marks) {\n    DEFAULT_SOURCE = source2 || VIEW;\n    MARKS = marks || DEFAULT_MARKS;\n    return parseMerge(selector.trim()).map(parseSelector);\n  }\n  function isMarkType(type2) {\n    return MARKS[type2];\n  }\n  function find(s, i, endChar, pushChar, popChar) {\n    const n = s.length;\n    let count2 = 0, c2;\n    for (; i < n; ++i) {\n      c2 = s[i];\n      if (!count2 && c2 === endChar) return i;\n      else if (popChar && popChar.includes(c2)) --count2;\n      else if (pushChar && pushChar.includes(c2)) ++count2;\n    }\n    return i;\n  }\n  function parseMerge(s) {\n    const output2 = [], n = s.length;\n    let start = 0, i = 0;\n    while (i < n) {\n      i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n      output2.push(s.substring(start, i).trim());\n      start = ++i;\n    }\n    if (output2.length === 0) {\n      throw \"Empty event selector: \" + s;\n    }\n    return output2;\n  }\n  function parseSelector(s) {\n    return s[0] === \"[\" ? parseBetween(s) : parseStream$1(s);\n  }\n  function parseBetween(s) {\n    const n = s.length;\n    let i = 1, b2;\n    i = find(s, i, RBRACK, LBRACK, RBRACK);\n    if (i === n) {\n      throw \"Empty between selector: \" + s;\n    }\n    b2 = parseMerge(s.substring(1, i));\n    if (b2.length !== 2) {\n      throw \"Between selector must have two elements: \" + s;\n    }\n    s = s.slice(i + 1).trim();\n    if (s[0] !== GT) {\n      throw \"Expected '>' after between selector: \" + s;\n    }\n    b2 = b2.map(parseSelector);\n    const stream2 = parseSelector(s.slice(1).trim());\n    if (stream2.between) {\n      return {\n        between: b2,\n        stream: stream2\n      };\n    } else {\n      stream2.between = b2;\n    }\n    return stream2;\n  }\n  function parseStream$1(s) {\n    const stream2 = {\n      source: DEFAULT_SOURCE\n    }, source2 = [];\n    let throttle = [0, 0], markname = 0, start = 0, n = s.length, i = 0, j, filter2;\n    if (s[n - 1] === RBRACE) {\n      i = s.lastIndexOf(LBRACE);\n      if (i >= 0) {\n        try {\n          throttle = parseThrottle(s.substring(i + 1, n - 1));\n        } catch (e) {\n          throw \"Invalid throttle specification: \" + s;\n        }\n        s = s.slice(0, i).trim();\n        n = s.length;\n      } else throw \"Unmatched right brace: \" + s;\n      i = 0;\n    }\n    if (!n) throw s;\n    if (s[0] === NAME) markname = ++i;\n    j = find(s, i, COLON);\n    if (j < n) {\n      source2.push(s.substring(start, j).trim());\n      start = i = ++j;\n    }\n    i = find(s, i, LBRACK);\n    if (i === n) {\n      source2.push(s.substring(start, n).trim());\n    } else {\n      source2.push(s.substring(start, i).trim());\n      filter2 = [];\n      start = ++i;\n      if (start === n) throw \"Unmatched left bracket: \" + s;\n    }\n    while (i < n) {\n      i = find(s, i, RBRACK);\n      if (i === n) throw \"Unmatched left bracket: \" + s;\n      filter2.push(s.substring(start, i).trim());\n      if (i < n - 1 && s[++i] !== LBRACK) throw \"Expected left bracket: \" + s;\n      start = ++i;\n    }\n    if (!(n = source2.length) || ILLEGAL.test(source2[n - 1])) {\n      throw \"Invalid event selector: \" + s;\n    }\n    if (n > 1) {\n      stream2.type = source2[1];\n      if (markname) {\n        stream2.markname = source2[0].slice(1);\n      } else if (isMarkType(source2[0])) {\n        stream2.marktype = source2[0];\n      } else {\n        stream2.source = source2[0];\n      }\n    } else {\n      stream2.type = source2[0];\n    }\n    if (stream2.type.slice(-1) === \"!\") {\n      stream2.consume = true;\n      stream2.type = stream2.type.slice(0, -1);\n    }\n    if (filter2 != null) stream2.filter = filter2;\n    if (throttle[0]) stream2.throttle = throttle[0];\n    if (throttle[1]) stream2.debounce = throttle[1];\n    return stream2;\n  }\n  function parseThrottle(s) {\n    const a2 = s.split(COMMA);\n    if (!s.length || a2.length > 2) throw s;\n    return a2.map((_) => {\n      const x2 = +_;\n      if (x2 !== x2) throw s;\n      return x2;\n    });\n  }\n  function parseAutosize(spec) {\n    return isObject$1(spec) ? spec : {\n      type: spec || \"pad\"\n    };\n  }\n  const number = (_) => +_ || 0;\n  const paddingObject = (_) => ({\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  });\n  function parsePadding(spec) {\n    return !isObject$1(spec) ? paddingObject(number(spec)) : spec.signal ? spec : {\n      top: number(spec.top),\n      bottom: number(spec.bottom),\n      left: number(spec.left),\n      right: number(spec.right)\n    };\n  }\n  const encoder = (_) => isObject$1(_) && !isArray(_) ? extend$1({}, _) : {\n    value: _\n  };\n  function addEncode(object2, name, value2, set2) {\n    if (value2 != null) {\n      const isEncoder = isObject$1(value2) && !isArray(value2) || isArray(value2) && value2.length && isObject$1(value2[0]);\n      if (isEncoder) {\n        object2.update[name] = value2;\n      } else {\n        object2[set2 || \"enter\"][name] = {\n          value: value2\n        };\n      }\n      return 1;\n    } else {\n      return 0;\n    }\n  }\n  function addEncoders(object2, enter, update2) {\n    for (const name in enter) {\n      addEncode(object2, name, enter[name]);\n    }\n    for (const name in update2) {\n      addEncode(object2, name, update2[name], \"update\");\n    }\n  }\n  function extendEncode(encode2, extra, skip) {\n    for (const name in extra) {\n      if (skip && has$1(skip, name)) continue;\n      encode2[name] = extend$1(encode2[name] || {}, extra[name]);\n    }\n    return encode2;\n  }\n  function has(key2, encode2) {\n    return encode2 && (encode2.enter && encode2.enter[key2] || encode2.update && encode2.update[key2]);\n  }\n  const MarkRole = \"mark\";\n  const FrameRole = \"frame\";\n  const ScopeRole = \"scope\";\n  const AxisRole = \"axis\";\n  const AxisDomainRole = \"axis-domain\";\n  const AxisGridRole = \"axis-grid\";\n  const AxisLabelRole = \"axis-label\";\n  const AxisTickRole = \"axis-tick\";\n  const AxisTitleRole = \"axis-title\";\n  const LegendRole = \"legend\";\n  const LegendBandRole = \"legend-band\";\n  const LegendEntryRole = \"legend-entry\";\n  const LegendGradientRole = \"legend-gradient\";\n  const LegendLabelRole = \"legend-label\";\n  const LegendSymbolRole = \"legend-symbol\";\n  const LegendTitleRole = \"legend-title\";\n  const TitleRole = \"title\";\n  const TitleTextRole = \"title-text\";\n  const TitleSubtitleRole = \"title-subtitle\";\n  function applyDefaults(encode2, type2, role, style2, config) {\n    const defaults2 = {}, enter = {};\n    let update2, key2, skip, props;\n    key2 = \"lineBreak\";\n    if (type2 === \"text\" && config[key2] != null && !has(key2, encode2)) {\n      applyDefault(defaults2, key2, config[key2]);\n    }\n    if (role == \"legend\" || String(role).startsWith(\"axis\")) {\n      role = null;\n    }\n    props = role === FrameRole ? config.group : role === MarkRole ? extend$1({}, config.mark, config[type2]) : null;\n    for (key2 in props) {\n      skip = has(key2, encode2) || (key2 === \"fill\" || key2 === \"stroke\") && (has(\"fill\", encode2) || has(\"stroke\", encode2));\n      if (!skip) applyDefault(defaults2, key2, props[key2]);\n    }\n    array$5(style2).forEach((name) => {\n      const props2 = config.style && config.style[name];\n      for (const key3 in props2) {\n        if (!has(key3, encode2)) {\n          applyDefault(defaults2, key3, props2[key3]);\n        }\n      }\n    });\n    encode2 = extend$1({}, encode2);\n    for (key2 in defaults2) {\n      props = defaults2[key2];\n      if (props.signal) {\n        (update2 = update2 || {})[key2] = props;\n      } else {\n        enter[key2] = props;\n      }\n    }\n    encode2.enter = extend$1(enter, encode2.enter);\n    if (update2) encode2.update = extend$1(update2, encode2.update);\n    return encode2;\n  }\n  function applyDefault(defaults2, key2, value2) {\n    defaults2[key2] = value2 && value2.signal ? {\n      signal: value2.signal\n    } : {\n      value: value2\n    };\n  }\n  const scaleRef = (scale2) => isString(scale2) ? $(scale2) : scale2.signal ? `(${scale2.signal})` : field(scale2);\n  function entry$1(enc) {\n    if (enc.gradient != null) {\n      return gradient(enc);\n    }\n    let value2 = enc.signal ? `(${enc.signal})` : enc.color ? color(enc.color) : enc.field != null ? field(enc.field) : enc.value !== void 0 ? $(enc.value) : void 0;\n    if (enc.scale != null) {\n      value2 = scale$2(enc, value2);\n    }\n    if (value2 === void 0) {\n      value2 = null;\n    }\n    if (enc.exponent != null) {\n      value2 = `pow(${value2},${property(enc.exponent)})`;\n    }\n    if (enc.mult != null) {\n      value2 += `*${property(enc.mult)}`;\n    }\n    if (enc.offset != null) {\n      value2 += `+${property(enc.offset)}`;\n    }\n    if (enc.round) {\n      value2 = `round(${value2})`;\n    }\n    return value2;\n  }\n  const _color = (type2, x2, y2, z) => `(${type2}(${[x2, y2, z].map(entry$1).join(\",\")})+'')`;\n  function color(enc) {\n    return enc.c ? _color(\"hcl\", enc.h, enc.c, enc.l) : enc.h || enc.s ? _color(\"hsl\", enc.h, enc.s, enc.l) : enc.l || enc.a ? _color(\"lab\", enc.l, enc.a, enc.b) : enc.r || enc.g || enc.b ? _color(\"rgb\", enc.r, enc.g, enc.b) : null;\n  }\n  function gradient(enc) {\n    const args = [enc.start, enc.stop, enc.count].map((_) => _ == null ? null : $(_));\n    while (args.length && peek$1(args) == null) args.pop();\n    args.unshift(scaleRef(enc.gradient));\n    return `gradient(${args.join(\",\")})`;\n  }\n  function property(property2) {\n    return isObject$1(property2) ? \"(\" + entry$1(property2) + \")\" : property2;\n  }\n  function field(ref2) {\n    return resolveField(isObject$1(ref2) ? ref2 : {\n      datum: ref2\n    });\n  }\n  function resolveField(ref2) {\n    let object2, level, field2;\n    if (ref2.signal) {\n      object2 = \"datum\";\n      field2 = ref2.signal;\n    } else if (ref2.group || ref2.parent) {\n      level = Math.max(1, ref2.level || 1);\n      object2 = \"item\";\n      while (level-- > 0) {\n        object2 += \".mark.group\";\n      }\n      if (ref2.parent) {\n        field2 = ref2.parent;\n        object2 += \".datum\";\n      } else {\n        field2 = ref2.group;\n      }\n    } else if (ref2.datum) {\n      object2 = \"datum\";\n      field2 = ref2.datum;\n    } else {\n      error(\"Invalid field reference: \" + $(ref2));\n    }\n    if (!ref2.signal) {\n      field2 = isString(field2) ? splitAccessPath(field2).map($).join(\"][\") : resolveField(field2);\n    }\n    return object2 + \"[\" + field2 + \"]\";\n  }\n  function scale$2(enc, value2) {\n    const scale2 = scaleRef(enc.scale);\n    if (enc.range != null) {\n      value2 = `lerp(_range(${scale2}), ${+enc.range})`;\n    } else {\n      if (value2 !== void 0) value2 = `_scale(${scale2}, ${value2})`;\n      if (enc.band) {\n        value2 = (value2 ? value2 + \"+\" : \"\") + `_bandwidth(${scale2})` + (+enc.band === 1 ? \"\" : \"*\" + property(enc.band));\n        if (enc.extra) {\n          value2 = `(datum.extra ? _scale(${scale2}, datum.extra.value) : ${value2})`;\n        }\n      }\n      if (value2 == null) value2 = \"0\";\n    }\n    return value2;\n  }\n  function rule(enc) {\n    let code = \"\";\n    enc.forEach((rule2) => {\n      const value2 = entry$1(rule2);\n      code += rule2.test ? `(${rule2.test})?${value2}:` : value2;\n    });\n    if (peek$1(code) === \":\") {\n      code += \"null\";\n    }\n    return code;\n  }\n  function parseEncode(encode2, type2, role, style2, scope, params2) {\n    const enc = {};\n    params2 = params2 || {};\n    params2.encoders = {\n      $encode: enc\n    };\n    encode2 = applyDefaults(encode2, type2, role, style2, scope.config);\n    for (const key2 in encode2) {\n      enc[key2] = parseBlock(encode2[key2], type2, params2, scope);\n    }\n    return params2;\n  }\n  function parseBlock(block, marktype, params2, scope) {\n    const channels = {}, fields = {};\n    for (const name in block) {\n      if (block[name] != null) {\n        channels[name] = parse$1(expr(block[name]), scope, params2, fields);\n      }\n    }\n    return {\n      $expr: {\n        marktype,\n        channels\n      },\n      $fields: Object.keys(fields),\n      $output: Object.keys(block)\n    };\n  }\n  function expr(enc) {\n    return isArray(enc) ? rule(enc) : entry$1(enc);\n  }\n  function parse$1(code, scope, params2, fields) {\n    const expr2 = parser(code, scope);\n    expr2.$fields.forEach((name) => fields[name] = 1);\n    extend$1(params2, expr2.$params);\n    return expr2.$expr;\n  }\n  const OUTER = \"outer\", OUTER_INVALID = [\"value\", \"update\", \"init\", \"react\", \"bind\"];\n  function outerError(prefix, name) {\n    error(prefix + ' for \"outer\" push: ' + $(name));\n  }\n  function parseSignal(signal, scope) {\n    const name = signal.name;\n    if (signal.push === OUTER) {\n      if (!scope.signals[name]) outerError(\"No prior signal definition\", name);\n      OUTER_INVALID.forEach((prop) => {\n        if (signal[prop] !== void 0) outerError(\"Invalid property \", prop);\n      });\n    } else {\n      const op = scope.addSignal(name, signal.value);\n      if (signal.react === false) op.react = false;\n      if (signal.bind) scope.addBinding(name, signal.bind);\n    }\n  }\n  function Entry(type2, value2, params2, parent) {\n    this.id = -1;\n    this.type = type2;\n    this.value = value2;\n    this.params = params2;\n    if (parent) this.parent = parent;\n  }\n  function entry(type2, value2, params2, parent) {\n    return new Entry(type2, value2, params2, parent);\n  }\n  function operator(value2, params2) {\n    return entry(\"operator\", value2, params2);\n  }\n  function ref(op) {\n    const ref2 = {\n      $ref: op.id\n    };\n    if (op.id < 0) (op.refs = op.refs || []).push(ref2);\n    return ref2;\n  }\n  function fieldRef$1(field2, name) {\n    return name ? {\n      $field: field2,\n      $name: name\n    } : {\n      $field: field2\n    };\n  }\n  const keyFieldRef = fieldRef$1(\"key\");\n  function compareRef(fields, orders) {\n    return {\n      $compare: fields,\n      $order: orders\n    };\n  }\n  function keyRef(fields, flat) {\n    const ref2 = {\n      $key: fields\n    };\n    if (flat) ref2.$flat = true;\n    return ref2;\n  }\n  const Ascending = \"ascending\";\n  const Descending = \"descending\";\n  function sortKey(sort2) {\n    return !isObject$1(sort2) ? \"\" : (sort2.order === Descending ? \"-\" : \"+\") + aggrField(sort2.op, sort2.field);\n  }\n  function aggrField(op, field2) {\n    return (op && op.signal ? \"$\" + op.signal : op || \"\") + (op && field2 ? \"_\" : \"\") + (field2 && field2.signal ? \"$\" + field2.signal : field2 || \"\");\n  }\n  const Scope$1 = \"scope\";\n  const View = \"view\";\n  function isSignal(_) {\n    return _ && _.signal;\n  }\n  function isExpr$1(_) {\n    return _ && _.expr;\n  }\n  function hasSignal(_) {\n    if (isSignal(_)) return true;\n    if (isObject$1(_)) for (const key2 in _) {\n      if (hasSignal(_[key2])) return true;\n    }\n    return false;\n  }\n  function value(specValue, defaultValue) {\n    return specValue != null ? specValue : defaultValue;\n  }\n  function deref(v) {\n    return v && v.signal || v;\n  }\n  const Timer = \"timer\";\n  function parseStream(stream2, scope) {\n    const method2 = stream2.merge ? mergeStream : stream2.stream ? nestedStream : stream2.type ? eventStream : error(\"Invalid stream specification: \" + $(stream2));\n    return method2(stream2, scope);\n  }\n  function eventSource(source2) {\n    return source2 === Scope$1 ? View : source2 || View;\n  }\n  function mergeStream(stream2, scope) {\n    const list = stream2.merge.map((s) => parseStream(s, scope)), entry2 = streamParameters({\n      merge: list\n    }, stream2, scope);\n    return scope.addStream(entry2).id;\n  }\n  function nestedStream(stream2, scope) {\n    const id2 = parseStream(stream2.stream, scope), entry2 = streamParameters({\n      stream: id2\n    }, stream2, scope);\n    return scope.addStream(entry2).id;\n  }\n  function eventStream(stream2, scope) {\n    let id2;\n    if (stream2.type === Timer) {\n      id2 = scope.event(Timer, stream2.throttle);\n      stream2 = {\n        between: stream2.between,\n        filter: stream2.filter\n      };\n    } else {\n      id2 = scope.event(eventSource(stream2.source), stream2.type);\n    }\n    const entry2 = streamParameters({\n      stream: id2\n    }, stream2, scope);\n    return Object.keys(entry2).length === 1 ? id2 : scope.addStream(entry2).id;\n  }\n  function streamParameters(entry2, stream2, scope) {\n    let param2 = stream2.between;\n    if (param2) {\n      if (param2.length !== 2) {\n        error('Stream \"between\" parameter must have 2 entries: ' + $(stream2));\n      }\n      entry2.between = [parseStream(param2[0], scope), parseStream(param2[1], scope)];\n    }\n    param2 = stream2.filter ? [].concat(stream2.filter) : [];\n    if (stream2.marktype || stream2.markname || stream2.markrole) {\n      param2.push(filterMark(stream2.marktype, stream2.markname, stream2.markrole));\n    }\n    if (stream2.source === Scope$1) {\n      param2.push(\"inScope(event.item)\");\n    }\n    if (param2.length) {\n      entry2.filter = parser(\"(\" + param2.join(\")&&(\") + \")\", scope).$expr;\n    }\n    if ((param2 = stream2.throttle) != null) {\n      entry2.throttle = +param2;\n    }\n    if ((param2 = stream2.debounce) != null) {\n      entry2.debounce = +param2;\n    }\n    if (stream2.consume) {\n      entry2.consume = true;\n    }\n    return entry2;\n  }\n  function filterMark(type2, name, role) {\n    const item = \"event.item\";\n    return item + (type2 && type2 !== \"*\" ? \"&&\" + item + \".mark.marktype==='\" + type2 + \"'\" : \"\") + (role ? \"&&\" + item + \".mark.role==='\" + role + \"'\" : \"\") + (name ? \"&&\" + item + \".mark.name==='\" + name + \"'\" : \"\");\n  }\n  const OP_VALUE_EXPR = {\n    code: \"_.$value\",\n    ast: {\n      type: \"Identifier\",\n      value: \"value\"\n    }\n  };\n  function parseUpdate(spec, scope, target2) {\n    const encode2 = spec.encode, entry2 = {\n      target: target2\n    };\n    let events2 = spec.events, update2 = spec.update, sources = [];\n    if (!events2) {\n      error(\"Signal update missing events specification.\");\n    }\n    if (isString(events2)) {\n      events2 = eventSelector(events2, scope.isSubscope() ? Scope$1 : View);\n    }\n    events2 = array$5(events2).filter((s) => s.signal || s.scale ? (sources.push(s), 0) : 1);\n    if (sources.length > 1) {\n      sources = [mergeSources(sources)];\n    }\n    if (events2.length) {\n      sources.push(events2.length > 1 ? {\n        merge: events2\n      } : events2[0]);\n    }\n    if (encode2 != null) {\n      if (update2) error(\"Signal encode and update are mutually exclusive.\");\n      update2 = \"encode(item(),\" + $(encode2) + \")\";\n    }\n    entry2.update = isString(update2) ? parser(update2, scope) : update2.expr != null ? parser(update2.expr, scope) : update2.value != null ? update2.value : update2.signal != null ? {\n      $expr: OP_VALUE_EXPR,\n      $params: {\n        $value: scope.signalRef(update2.signal)\n      }\n    } : error(\"Invalid signal update specification.\");\n    if (spec.force) {\n      entry2.options = {\n        force: true\n      };\n    }\n    sources.forEach((source2) => scope.addUpdate(extend$1(streamSource(source2, scope), entry2)));\n  }\n  function streamSource(stream2, scope) {\n    return {\n      source: stream2.signal ? scope.signalRef(stream2.signal) : stream2.scale ? scope.scaleRef(stream2.scale) : parseStream(stream2, scope)\n    };\n  }\n  function mergeSources(sources) {\n    return {\n      signal: \"[\" + sources.map((s) => s.scale ? 'scale(\"' + s.scale + '\")' : s.signal) + \"]\"\n    };\n  }\n  function parseSignalUpdates(signal, scope) {\n    const op = scope.getSignal(signal.name);\n    let expr2 = signal.update;\n    if (signal.init) {\n      if (expr2) {\n        error(\"Signals can not include both init and update expressions.\");\n      } else {\n        expr2 = signal.init;\n        op.initonly = true;\n      }\n    }\n    if (expr2) {\n      expr2 = parser(expr2, scope);\n      op.update = expr2.$expr;\n      op.params = expr2.$params;\n    }\n    if (signal.on) {\n      signal.on.forEach((_) => parseUpdate(_, scope, op.id));\n    }\n  }\n  const transform = (name) => (params2, value2, parent) => entry(name, value2, params2 || void 0, parent);\n  const Aggregate = transform(\"aggregate\");\n  const AxisTicks = transform(\"axisticks\");\n  const Bound = transform(\"bound\");\n  const Collect = transform(\"collect\");\n  const Compare = transform(\"compare\");\n  const DataJoin = transform(\"datajoin\");\n  const Encode = transform(\"encode\");\n  const Expression = transform(\"expression\");\n  const Facet = transform(\"facet\");\n  const Field = transform(\"field\");\n  const Key = transform(\"key\");\n  const LegendEntries = transform(\"legendentries\");\n  const Load = transform(\"load\");\n  const Mark = transform(\"mark\");\n  const MultiExtent = transform(\"multiextent\");\n  const MultiValues = transform(\"multivalues\");\n  const Overlap = transform(\"overlap\");\n  const Params = transform(\"params\");\n  const PreFacet = transform(\"prefacet\");\n  const Projection = transform(\"projection\");\n  const Proxy = transform(\"proxy\");\n  const Relay = transform(\"relay\");\n  const Render = transform(\"render\");\n  const Scale = transform(\"scale\");\n  const Sieve = transform(\"sieve\");\n  const SortItems = transform(\"sortitems\");\n  const ViewLayout = transform(\"viewlayout\");\n  const Values = transform(\"values\");\n  let FIELD_REF_ID = 0;\n  const MULTIDOMAIN_SORT_OPS = {\n    min: \"min\",\n    max: \"max\",\n    count: \"sum\"\n  };\n  function initScale(spec, scope) {\n    const type2 = spec.type || \"linear\";\n    if (!isValidScaleType(type2)) {\n      error(\"Unrecognized scale type: \" + $(type2));\n    }\n    scope.addScale(spec.name, {\n      type: type2,\n      domain: void 0\n    });\n  }\n  function parseScale(spec, scope) {\n    const params2 = scope.getScale(spec.name).params;\n    let key2;\n    params2.domain = parseScaleDomain(spec.domain, spec, scope);\n    if (spec.range != null) {\n      params2.range = parseScaleRange(spec, scope, params2);\n    }\n    if (spec.interpolate != null) {\n      parseScaleInterpolate(spec.interpolate, params2);\n    }\n    if (spec.nice != null) {\n      params2.nice = parseScaleNice(spec.nice, scope);\n    }\n    if (spec.bins != null) {\n      params2.bins = parseScaleBins(spec.bins, scope);\n    }\n    for (key2 in spec) {\n      if (has$1(params2, key2) || key2 === \"name\") continue;\n      params2[key2] = parseLiteral(spec[key2], scope);\n    }\n  }\n  function parseLiteral(v, scope) {\n    return !isObject$1(v) ? v : v.signal ? scope.signalRef(v.signal) : error(\"Unsupported object: \" + $(v));\n  }\n  function parseArray(v, scope) {\n    return v.signal ? scope.signalRef(v.signal) : v.map((v2) => parseLiteral(v2, scope));\n  }\n  function dataLookupError(name) {\n    error(\"Can not find data set: \" + $(name));\n  }\n  function parseScaleDomain(domain2, spec, scope) {\n    if (!domain2) {\n      if (spec.domainMin != null || spec.domainMax != null) {\n        error(\"No scale domain defined for domainMin/domainMax to override.\");\n      }\n      return;\n    }\n    return domain2.signal ? scope.signalRef(domain2.signal) : (isArray(domain2) ? explicitDomain : domain2.fields ? multipleDomain : singularDomain)(domain2, spec, scope);\n  }\n  function explicitDomain(domain2, spec, scope) {\n    return domain2.map((v) => parseLiteral(v, scope));\n  }\n  function singularDomain(domain2, spec, scope) {\n    const data2 = scope.getData(domain2.data);\n    if (!data2) dataLookupError(domain2.data);\n    return isDiscrete(spec.type) ? data2.valuesRef(scope, domain2.field, parseSort(domain2.sort, false)) : isQuantile(spec.type) ? data2.domainRef(scope, domain2.field) : data2.extentRef(scope, domain2.field);\n  }\n  function multipleDomain(domain2, spec, scope) {\n    const data2 = domain2.data, fields = domain2.fields.reduce((dom, d) => {\n      d = isString(d) ? {\n        data: data2,\n        field: d\n      } : isArray(d) || d.signal ? fieldRef(d, scope) : d;\n      dom.push(d);\n      return dom;\n    }, []);\n    return (isDiscrete(spec.type) ? ordinalMultipleDomain : isQuantile(spec.type) ? quantileMultipleDomain : numericMultipleDomain)(domain2, scope, fields);\n  }\n  function fieldRef(data2, scope) {\n    const name = \"_:vega:_\" + FIELD_REF_ID++, coll = Collect({});\n    if (isArray(data2)) {\n      coll.value = {\n        $ingest: data2\n      };\n    } else if (data2.signal) {\n      const code = \"setdata(\" + $(name) + \",\" + data2.signal + \")\";\n      coll.params.input = scope.signalRef(code);\n    }\n    scope.addDataPipeline(name, [coll, Sieve({})]);\n    return {\n      data: name,\n      field: \"data\"\n    };\n  }\n  function ordinalMultipleDomain(domain2, scope, fields) {\n    const sort2 = parseSort(domain2.sort, true);\n    let a2, v;\n    const counts = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.countsRef(scope, f.field, sort2);\n    });\n    const p = {\n      groupby: keyFieldRef,\n      pulse: counts\n    };\n    if (sort2) {\n      a2 = sort2.op || \"count\";\n      v = sort2.field ? aggrField(a2, sort2.field) : \"count\";\n      p.ops = [MULTIDOMAIN_SORT_OPS[a2]];\n      p.fields = [scope.fieldRef(v)];\n      p.as = [v];\n    }\n    a2 = scope.add(Aggregate(p));\n    const c2 = scope.add(Collect({\n      pulse: ref(a2)\n    }));\n    v = scope.add(Values({\n      field: keyFieldRef,\n      sort: scope.sortRef(sort2),\n      pulse: ref(c2)\n    }));\n    return ref(v);\n  }\n  function parseSort(sort2, multidomain) {\n    if (sort2) {\n      if (!sort2.field && !sort2.op) {\n        if (isObject$1(sort2)) sort2.field = \"key\";\n        else sort2 = {\n          field: \"key\"\n        };\n      } else if (!sort2.field && sort2.op !== \"count\") {\n        error(\"No field provided for sort aggregate op: \" + sort2.op);\n      } else if (multidomain && sort2.field) {\n        if (sort2.op && !MULTIDOMAIN_SORT_OPS[sort2.op]) {\n          error(\"Multiple domain scales can not be sorted using \" + sort2.op);\n        }\n      }\n    }\n    return sort2;\n  }\n  function quantileMultipleDomain(domain2, scope, fields) {\n    const values2 = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.domainRef(scope, f.field);\n    });\n    return ref(scope.add(MultiValues({\n      values: values2\n    })));\n  }\n  function numericMultipleDomain(domain2, scope, fields) {\n    const extents = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.extentRef(scope, f.field);\n    });\n    return ref(scope.add(MultiExtent({\n      extents\n    })));\n  }\n  function parseScaleBins(v, scope) {\n    return v.signal || isArray(v) ? parseArray(v, scope) : scope.objectProperty(v);\n  }\n  function parseScaleNice(nice2, scope) {\n    return nice2.signal ? scope.signalRef(nice2.signal) : isObject$1(nice2) ? {\n      interval: parseLiteral(nice2.interval),\n      step: parseLiteral(nice2.step)\n    } : parseLiteral(nice2);\n  }\n  function parseScaleInterpolate(interpolate2, params2) {\n    params2.interpolate = parseLiteral(interpolate2.type || interpolate2);\n    if (interpolate2.gamma != null) {\n      params2.interpolateGamma = parseLiteral(interpolate2.gamma);\n    }\n  }\n  function parseScaleRange(spec, scope, params2) {\n    const config = scope.config.range;\n    let range2 = spec.range;\n    if (range2.signal) {\n      return scope.signalRef(range2.signal);\n    } else if (isString(range2)) {\n      if (config && has$1(config, range2)) {\n        spec = extend$1({}, spec, {\n          range: config[range2]\n        });\n        return parseScaleRange(spec, scope, params2);\n      } else if (range2 === \"width\") {\n        range2 = [0, {\n          signal: \"width\"\n        }];\n      } else if (range2 === \"height\") {\n        range2 = isDiscrete(spec.type) ? [0, {\n          signal: \"height\"\n        }] : [{\n          signal: \"height\"\n        }, 0];\n      } else {\n        error(\"Unrecognized scale range value: \" + $(range2));\n      }\n    } else if (range2.scheme) {\n      params2.scheme = isArray(range2.scheme) ? parseArray(range2.scheme, scope) : parseLiteral(range2.scheme, scope);\n      if (range2.extent) params2.schemeExtent = parseArray(range2.extent, scope);\n      if (range2.count) params2.schemeCount = parseLiteral(range2.count, scope);\n      return;\n    } else if (range2.step) {\n      params2.rangeStep = parseLiteral(range2.step, scope);\n      return;\n    } else if (isDiscrete(spec.type) && !isArray(range2)) {\n      return parseScaleDomain(range2, spec, scope);\n    } else if (!isArray(range2)) {\n      error(\"Unsupported range type: \" + $(range2));\n    }\n    return range2.map((v) => (isArray(v) ? parseArray : parseLiteral)(v, scope));\n  }\n  function parseProjection(proj, scope) {\n    const config = scope.config.projection || {}, params2 = {};\n    for (const name in proj) {\n      if (name === \"name\") continue;\n      params2[name] = parseParameter$1(proj[name], name, scope);\n    }\n    for (const name in config) {\n      if (params2[name] == null) {\n        params2[name] = parseParameter$1(config[name], name, scope);\n      }\n    }\n    scope.addProjection(proj.name, params2);\n  }\n  function parseParameter$1(_, name, scope) {\n    return isArray(_) ? _.map((_2) => parseParameter$1(_2, name, scope)) : !isObject$1(_) ? _ : _.signal ? scope.signalRef(_.signal) : name === \"fit\" ? _ : error(\"Unsupported parameter object: \" + $(_));\n  }\n  const Top = \"top\";\n  const Left = \"left\";\n  const Right = \"right\";\n  const Bottom = \"bottom\";\n  const Center = \"center\";\n  const Vertical = \"vertical\";\n  const Start = \"start\";\n  const Middle = \"middle\";\n  const End = \"end\";\n  const Index = \"index\";\n  const Label = \"label\";\n  const Offset = \"offset\";\n  const Perc = \"perc\";\n  const Perc2 = \"perc2\";\n  const Value = \"value\";\n  const GuideLabelStyle = \"guide-label\";\n  const GuideTitleStyle = \"guide-title\";\n  const GroupTitleStyle = \"group-title\";\n  const GroupSubtitleStyle = \"group-subtitle\";\n  const Symbols = \"symbol\";\n  const Gradient = \"gradient\";\n  const Discrete = \"discrete\";\n  const Size = \"size\";\n  const Shape = \"shape\";\n  const Fill = \"fill\";\n  const Stroke = \"stroke\";\n  const StrokeWidth = \"strokeWidth\";\n  const StrokeDash = \"strokeDash\";\n  const Opacity = \"opacity\";\n  const LegendScales = [Size, Shape, Fill, Stroke, StrokeWidth, StrokeDash, Opacity];\n  const Skip = {\n    name: 1,\n    style: 1,\n    interactive: 1\n  };\n  const zero = {\n    value: 0\n  };\n  const one = {\n    value: 1\n  };\n  const GroupMark = \"group\";\n  const RectMark = \"rect\";\n  const RuleMark = \"rule\";\n  const SymbolMark = \"symbol\";\n  const TextMark = \"text\";\n  function guideGroup(mark) {\n    mark.type = GroupMark;\n    mark.interactive = mark.interactive || false;\n    return mark;\n  }\n  function lookup(spec, config) {\n    const _ = (name, dflt) => value(spec[name], value(config[name], dflt));\n    _.isVertical = (s) => Vertical === value(spec.direction, config.direction || (s ? config.symbolDirection : config.gradientDirection));\n    _.gradientLength = () => value(spec.gradientLength, config.gradientLength || config.gradientWidth);\n    _.gradientThickness = () => value(spec.gradientThickness, config.gradientThickness || config.gradientHeight);\n    _.entryColumns = () => value(spec.columns, value(config.columns, +_.isVertical(true)));\n    return _;\n  }\n  function getEncoding(name, encode2) {\n    const v = encode2 && (encode2.update && encode2.update[name] || encode2.enter && encode2.enter[name]);\n    return v && v.signal ? v : v ? v.value : null;\n  }\n  function getStyle(name, scope, style2) {\n    const s = scope.config.style[style2];\n    return s && s[name];\n  }\n  function anchorExpr(s, e, m2) {\n    return `item.anchor === '${Start}' ? ${s} : item.anchor === '${End}' ? ${e} : ${m2}`;\n  }\n  const alignExpr$1 = anchorExpr($(Left), $(Right), $(Center));\n  function tickBand(_) {\n    const v = _(\"tickBand\");\n    let offset2 = _(\"tickOffset\"), band2, extra;\n    if (!v) {\n      band2 = _(\"bandPosition\");\n      extra = _(\"tickExtra\");\n    } else if (v.signal) {\n      band2 = {\n        signal: `(${v.signal}) === 'extent' ? 1 : 0.5`\n      };\n      extra = {\n        signal: `(${v.signal}) === 'extent'`\n      };\n      if (!isObject$1(offset2)) {\n        offset2 = {\n          signal: `(${v.signal}) === 'extent' ? 0 : ${offset2}`\n        };\n      }\n    } else if (v === \"extent\") {\n      band2 = 1;\n      extra = true;\n      offset2 = 0;\n    } else {\n      band2 = 0.5;\n      extra = false;\n    }\n    return {\n      extra,\n      band: band2,\n      offset: offset2\n    };\n  }\n  function extendOffset(value2, offset2) {\n    return !offset2 ? value2 : !value2 ? offset2 : !isObject$1(value2) ? {\n      value: value2,\n      offset: offset2\n    } : Object.assign({}, value2, {\n      offset: extendOffset(value2.offset, offset2)\n    });\n  }\n  function guideMark(mark, extras) {\n    if (extras) {\n      mark.name = extras.name;\n      mark.style = extras.style || mark.style;\n      mark.interactive = !!extras.interactive;\n      mark.encode = extendEncode(mark.encode, extras, Skip);\n    } else {\n      mark.interactive = false;\n    }\n    return mark;\n  }\n  function legendGradient(spec, scale2, config, userEncode) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length2 = _.gradientLength();\n    let enter, start, stop2, width2, height2;\n    if (vertical) {\n      start = [0, 1];\n      stop2 = [0, 0];\n      width2 = thickness;\n      height2 = length2;\n    } else {\n      start = [0, 0];\n      stop2 = [1, 0];\n      width2 = length2;\n      height2 = thickness;\n    }\n    const encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: zero,\n        y: zero,\n        width: encoder(width2),\n        height: encoder(height2)\n      },\n      update: extend$1({}, enter, {\n        opacity: one,\n        fill: {\n          gradient: scale2,\n          start,\n          stop: stop2\n        }\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gradientStrokeColor\"),\n      strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n      type: RectMark,\n      role: LegendGradientRole,\n      encode: encode2\n    }, userEncode);\n  }\n  function legendGradientDiscrete(spec, scale2, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length2 = _.gradientLength();\n    let u2, v, uu, vv, adjust = \"\";\n    vertical ? (u2 = \"y\", uu = \"y2\", v = \"x\", vv = \"width\", adjust = \"1-\") : (u2 = \"x\", uu = \"x2\", v = \"y\", vv = \"height\");\n    const enter = {\n      opacity: zero,\n      fill: {\n        scale: scale2,\n        field: Value\n      }\n    };\n    enter[u2] = {\n      signal: adjust + \"datum.\" + Perc,\n      mult: length2\n    };\n    enter[v] = zero;\n    enter[uu] = {\n      signal: adjust + \"datum.\" + Perc2,\n      mult: length2\n    };\n    enter[vv] = encoder(thickness);\n    const encode2 = {\n      enter,\n      update: extend$1({}, enter, {\n        opacity: one\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gradientStrokeColor\"),\n      strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n      type: RectMark,\n      role: LegendBandRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  const alignExpr = `datum.${Perc}<=0?\"${Left}\":datum.${Perc}>=1?\"${Right}\":\"${Center}\"`, baselineExpr = `datum.${Perc}<=0?\"${Bottom}\":datum.${Perc}>=1?\"${Top}\":\"${Middle}\"`;\n  function legendGradientLabels(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = encoder(_.gradientThickness()), length2 = _.gradientLength();\n    let overlap = _(\"labelOverlap\"), enter, update2, u2, v, adjust = \"\";\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        }\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontStyle: _(\"labelFontStyle\"),\n      fontWeight: _(\"labelFontWeight\"),\n      limit: value(spec.labelLimit, config.gradientLabelLimit)\n    });\n    if (vertical) {\n      enter.align = {\n        value: \"left\"\n      };\n      enter.baseline = update2.baseline = {\n        signal: baselineExpr\n      };\n      u2 = \"y\";\n      v = \"x\";\n      adjust = \"1-\";\n    } else {\n      enter.align = update2.align = {\n        signal: alignExpr\n      };\n      enter.baseline = {\n        value: \"top\"\n      };\n      u2 = \"x\";\n      v = \"y\";\n    }\n    enter[u2] = update2[u2] = {\n      signal: adjust + \"datum.\" + Perc,\n      mult: length2\n    };\n    enter[v] = update2[v] = thickness;\n    thickness.offset = value(spec.labelOffset, config.gradientLabelOffset) || 0;\n    overlap = overlap ? {\n      separation: _(\"labelSeparation\"),\n      method: overlap,\n      order: \"datum.\" + Index\n    } : void 0;\n    return guideMark({\n      type: TextMark,\n      role: LegendLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: dataRef,\n      encode: encode2,\n      overlap\n    }, userEncode);\n  }\n  function legendSymbolGroups(spec, config, userEncode, dataRef, columns) {\n    const _ = lookup(spec, config), entries = userEncode.entries, interactive2 = !!(entries && entries.interactive), name = entries ? entries.name : void 0, height2 = _(\"clipHeight\"), symbolOffset = _(\"symbolOffset\"), valueRef = {\n      data: \"value\"\n    }, xSignal = `(${columns}) ? datum.${Offset} : datum.${Size}`, yEncode = height2 ? encoder(height2) : {\n      field: Size\n    }, index2 = `datum.${Index}`, ncols = `max(1, ${columns})`;\n    let encode2, enter, update2, nrows, sort2;\n    yEncode.mult = 0.5;\n    encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: {\n          signal: xSignal,\n          mult: 0.5,\n          offset: symbolOffset\n        },\n        y: yEncode\n      },\n      update: update2 = {\n        opacity: one,\n        x: enter.x,\n        y: enter.y\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    let baseFill = null, baseStroke = null;\n    if (!spec.fill) {\n      baseFill = config.symbolBaseFillColor;\n      baseStroke = config.symbolBaseStrokeColor;\n    }\n    addEncoders(encode2, {\n      fill: _(\"symbolFillColor\", baseFill),\n      shape: _(\"symbolType\"),\n      size: _(\"symbolSize\"),\n      stroke: _(\"symbolStrokeColor\", baseStroke),\n      strokeDash: _(\"symbolDash\"),\n      strokeDashOffset: _(\"symbolDashOffset\"),\n      strokeWidth: _(\"symbolStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"symbolOpacity\")\n    });\n    LegendScales.forEach((scale2) => {\n      if (spec[scale2]) {\n        update2[scale2] = enter[scale2] = {\n          scale: spec[scale2],\n          field: Value\n        };\n      }\n    });\n    const symbols2 = guideMark({\n      type: SymbolMark,\n      role: LegendSymbolRole,\n      key: Value,\n      from: valueRef,\n      clip: height2 ? true : void 0,\n      encode: encode2\n    }, userEncode.symbols);\n    const labelOffset = encoder(symbolOffset);\n    labelOffset.offset = _(\"labelOffset\");\n    encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: {\n          signal: xSignal,\n          offset: labelOffset\n        },\n        y: yEncode\n      },\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        },\n        x: enter.x,\n        y: enter.y\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      align: _(\"labelAlign\"),\n      baseline: _(\"labelBaseline\"),\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontStyle: _(\"labelFontStyle\"),\n      fontWeight: _(\"labelFontWeight\"),\n      limit: _(\"labelLimit\")\n    });\n    const labels = guideMark({\n      type: TextMark,\n      role: LegendLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: valueRef,\n      encode: encode2\n    }, userEncode.labels);\n    encode2 = {\n      enter: {\n        noBound: {\n          value: !height2\n        },\n        // ignore width/height in bounds calc\n        width: zero,\n        height: height2 ? encoder(height2) : zero,\n        opacity: zero\n      },\n      exit: {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one,\n        row: {\n          signal: null\n        },\n        column: {\n          signal: null\n        }\n      }\n    };\n    if (_.isVertical(true)) {\n      nrows = `ceil(item.mark.items.length / ${ncols})`;\n      update2.row.signal = `${index2}%${nrows}`;\n      update2.column.signal = `floor(${index2} / ${nrows})`;\n      sort2 = {\n        field: [\"row\", index2]\n      };\n    } else {\n      update2.row.signal = `floor(${index2} / ${ncols})`;\n      update2.column.signal = `${index2} % ${ncols}`;\n      sort2 = {\n        field: index2\n      };\n    }\n    update2.column.signal = `(${columns})?${update2.column.signal}:${index2}`;\n    dataRef = {\n      facet: {\n        data: dataRef,\n        name: \"value\",\n        groupby: Index\n      }\n    };\n    return guideGroup({\n      role: ScopeRole,\n      from: dataRef,\n      encode: extendEncode(encode2, entries, Skip),\n      marks: [symbols2, labels],\n      name,\n      interactive: interactive2,\n      sort: sort2\n    });\n  }\n  function legendSymbolLayout(spec, config) {\n    const _ = lookup(spec, config);\n    return {\n      align: _(\"gridAlign\"),\n      columns: _.entryColumns(),\n      center: {\n        row: true,\n        column: false\n      },\n      padding: {\n        row: _(\"rowPadding\"),\n        column: _(\"columnPadding\")\n      }\n    };\n  }\n  const isL = 'item.orient === \"left\"', isR = 'item.orient === \"right\"', isLR = `(${isL} || ${isR})`, isVG = `datum.vgrad && ${isLR}`, baseline = anchorExpr('\"top\"', '\"bottom\"', '\"middle\"'), alignFlip = anchorExpr('\"right\"', '\"left\"', '\"center\"'), exprAlign = `datum.vgrad && ${isR} ? (${alignFlip}) : (${isLR} && !(datum.vgrad && ${isL})) ? \"left\" : ${alignExpr$1}`, exprAnchor = `item._anchor || (${isLR} ? \"middle\" : \"start\")`, exprAngle = `${isVG} ? (${isL} ? -90 : 90) : 0`, exprBaseline = `${isLR} ? (datum.vgrad ? (${isR} ? \"bottom\" : \"top\") : ${baseline}) : \"top\"`;\n  function legendTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config);\n    const encode2 = {\n      enter: {\n        opacity: zero\n      },\n      update: {\n        opacity: one,\n        x: {\n          field: {\n            group: \"padding\"\n          }\n        },\n        y: {\n          field: {\n            group: \"padding\"\n          }\n        }\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      orient: _(\"titleOrient\"),\n      _anchor: _(\"titleAnchor\"),\n      anchor: {\n        signal: exprAnchor\n      },\n      angle: {\n        signal: exprAngle\n      },\n      align: {\n        signal: exprAlign\n      },\n      baseline: {\n        signal: exprBaseline\n      },\n      text: spec.title,\n      fill: _(\"titleColor\"),\n      fillOpacity: _(\"titleOpacity\"),\n      font: _(\"titleFont\"),\n      fontSize: _(\"titleFontSize\"),\n      fontStyle: _(\"titleFontStyle\"),\n      fontWeight: _(\"titleFontWeight\"),\n      limit: _(\"titleLimit\"),\n      lineHeight: _(\"titleLineHeight\")\n    }, {\n      // require update\n      align: _(\"titleAlign\"),\n      baseline: _(\"titleBaseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: LegendTitleRole,\n      style: GuideTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function clip(clip2, scope) {\n    let expr2;\n    if (isObject$1(clip2)) {\n      if (clip2.signal) {\n        expr2 = clip2.signal;\n      } else if (clip2.path) {\n        expr2 = \"pathShape(\" + param(clip2.path) + \")\";\n      } else if (clip2.sphere) {\n        expr2 = \"geoShape(\" + param(clip2.sphere) + ', {type: \"Sphere\"})';\n      }\n    }\n    return expr2 ? scope.signalRef(expr2) : !!clip2;\n  }\n  function param(value2) {\n    return isObject$1(value2) && value2.signal ? value2.signal : $(value2);\n  }\n  function getRole(spec) {\n    const role = spec.role || \"\";\n    return role.startsWith(\"axis\") || role.startsWith(\"legend\") || role.startsWith(\"title\") ? role : spec.type === GroupMark ? ScopeRole : role || MarkRole;\n  }\n  function definition(spec) {\n    return {\n      marktype: spec.type,\n      name: spec.name || void 0,\n      role: spec.role || getRole(spec),\n      zindex: +spec.zindex || void 0,\n      aria: spec.aria,\n      description: spec.description\n    };\n  }\n  function interactive(spec, scope) {\n    return spec && spec.signal ? scope.signalRef(spec.signal) : spec === false ? false : true;\n  }\n  function parseTransform(spec, scope) {\n    const def2 = definition$1(spec.type);\n    if (!def2) error(\"Unrecognized transform type: \" + $(spec.type));\n    const t = entry(def2.type.toLowerCase(), null, parseParameters(def2, spec, scope));\n    if (spec.signal) scope.addSignal(spec.signal, scope.proxy(t));\n    t.metadata = def2.metadata || {};\n    return t;\n  }\n  function parseParameters(def2, spec, scope) {\n    const params2 = {}, n = def2.params.length;\n    for (let i = 0; i < n; ++i) {\n      const pdef = def2.params[i];\n      params2[pdef.name] = parseParameter(pdef, spec, scope);\n    }\n    return params2;\n  }\n  function parseParameter(def2, spec, scope) {\n    const type2 = def2.type, value2 = spec[def2.name];\n    if (type2 === \"index\") {\n      return parseIndexParameter(def2, spec, scope);\n    } else if (value2 === void 0) {\n      if (def2.required) {\n        error(\"Missing required \" + $(spec.type) + \" parameter: \" + $(def2.name));\n      }\n      return;\n    } else if (type2 === \"param\") {\n      return parseSubParameters(def2, spec, scope);\n    } else if (type2 === \"projection\") {\n      return scope.projectionRef(spec[def2.name]);\n    }\n    return def2.array && !isSignal(value2) ? value2.map((v) => parameterValue(def2, v, scope)) : parameterValue(def2, value2, scope);\n  }\n  function parameterValue(def2, value2, scope) {\n    const type2 = def2.type;\n    if (isSignal(value2)) {\n      return isExpr(type2) ? error(\"Expression references can not be signals.\") : isField(type2) ? scope.fieldRef(value2) : isCompare(type2) ? scope.compareRef(value2) : scope.signalRef(value2.signal);\n    } else {\n      const expr2 = def2.expr || isField(type2);\n      return expr2 && outerExpr(value2) ? scope.exprRef(value2.expr, value2.as) : expr2 && outerField(value2) ? fieldRef$1(value2.field, value2.as) : isExpr(type2) ? parser(value2, scope) : isData(type2) ? ref(scope.getData(value2).values) : isField(type2) ? fieldRef$1(value2) : isCompare(type2) ? scope.compareRef(value2) : value2;\n    }\n  }\n  function parseIndexParameter(def2, spec, scope) {\n    if (!isString(spec.from)) {\n      error('Lookup \"from\" parameter must be a string literal.');\n    }\n    return scope.getData(spec.from).lookupRef(scope, spec.key);\n  }\n  function parseSubParameters(def2, spec, scope) {\n    const value2 = spec[def2.name];\n    if (def2.array) {\n      if (!isArray(value2)) {\n        error(\"Expected an array of sub-parameters. Instead: \" + $(value2));\n      }\n      return value2.map((v) => parseSubParameter(def2, v, scope));\n    } else {\n      return parseSubParameter(def2, value2, scope);\n    }\n  }\n  function parseSubParameter(def2, value2, scope) {\n    const n = def2.params.length;\n    let pdef;\n    for (let i = 0; i < n; ++i) {\n      pdef = def2.params[i];\n      for (const k in pdef.key) {\n        if (pdef.key[k] !== value2[k]) {\n          pdef = null;\n          break;\n        }\n      }\n      if (pdef) break;\n    }\n    if (!pdef) error(\"Unsupported parameter: \" + $(value2));\n    const params2 = extend$1(parseParameters(pdef, value2, scope), pdef.key);\n    return ref(scope.add(Params(params2)));\n  }\n  const outerExpr = (_) => _ && _.expr;\n  const outerField = (_) => _ && _.field;\n  const isData = (_) => _ === \"data\";\n  const isExpr = (_) => _ === \"expr\";\n  const isField = (_) => _ === \"field\";\n  const isCompare = (_) => _ === \"compare\";\n  function parseData$1(from, group2, scope) {\n    let facet, key2, op, dataRef, parent;\n    if (!from) {\n      dataRef = ref(scope.add(Collect(null, [{}])));\n    } else if (facet = from.facet) {\n      if (!group2) error(\"Only group marks can be faceted.\");\n      if (facet.field != null) {\n        dataRef = parent = getDataRef(facet, scope);\n      } else {\n        if (!from.data) {\n          op = parseTransform(extend$1({\n            type: \"aggregate\",\n            groupby: array$5(facet.groupby)\n          }, facet.aggregate), scope);\n          op.params.key = scope.keyRef(facet.groupby);\n          op.params.pulse = getDataRef(facet, scope);\n          dataRef = parent = ref(scope.add(op));\n        } else {\n          parent = ref(scope.getData(from.data).aggregate);\n        }\n        key2 = scope.keyRef(facet.groupby, true);\n      }\n    }\n    if (!dataRef) {\n      dataRef = getDataRef(from, scope);\n    }\n    return {\n      key: key2,\n      pulse: dataRef,\n      parent\n    };\n  }\n  function getDataRef(from, scope) {\n    return from.$ref ? from : from.data && from.data.$ref ? from.data : ref(scope.getData(from.data).output);\n  }\n  function DataScope$1(scope, input, output2, values2, aggr) {\n    this.scope = scope;\n    this.input = input;\n    this.output = output2;\n    this.values = values2;\n    this.aggregate = aggr;\n    this.index = {};\n  }\n  DataScope$1.fromEntries = function(scope, entries) {\n    const n = entries.length, values2 = entries[n - 1], output2 = entries[n - 2];\n    let input = entries[0], aggr = null, i = 1;\n    if (input && input.type === \"load\") {\n      input = entries[1];\n    }\n    scope.add(entries[0]);\n    for (; i < n; ++i) {\n      entries[i].params.pulse = ref(entries[i - 1]);\n      scope.add(entries[i]);\n      if (entries[i].type === \"aggregate\") aggr = entries[i];\n    }\n    return new DataScope$1(scope, input, output2, values2, aggr);\n  };\n  function fieldKey(field2) {\n    return isString(field2) ? field2 : null;\n  }\n  function addSortField(scope, p, sort2) {\n    const as = aggrField(sort2.op, sort2.field);\n    let s;\n    if (p.ops) {\n      for (let i = 0, n = p.as.length; i < n; ++i) {\n        if (p.as[i] === as) return;\n      }\n    } else {\n      p.ops = [\"count\"];\n      p.fields = [null];\n      p.as = [\"count\"];\n    }\n    if (sort2.op) {\n      p.ops.push((s = sort2.op.signal) ? scope.signalRef(s) : sort2.op);\n      p.fields.push(scope.fieldRef(sort2.field));\n      p.as.push(as);\n    }\n  }\n  function cache(scope, ds, name, optype, field2, counts, index2) {\n    const cache2 = ds[name] || (ds[name] = {}), sort2 = sortKey(counts);\n    let k = fieldKey(field2), v, op;\n    if (k != null) {\n      scope = ds.scope;\n      k = k + (sort2 ? \"|\" + sort2 : \"\");\n      v = cache2[k];\n    }\n    if (!v) {\n      const params2 = counts ? {\n        field: keyFieldRef,\n        pulse: ds.countsRef(scope, field2, counts)\n      } : {\n        field: scope.fieldRef(field2),\n        pulse: ref(ds.output)\n      };\n      if (sort2) params2.sort = scope.sortRef(counts);\n      op = scope.add(entry(optype, void 0, params2));\n      if (index2) ds.index[field2] = op;\n      v = ref(op);\n      if (k != null) cache2[k] = v;\n    }\n    return v;\n  }\n  DataScope$1.prototype = {\n    countsRef(scope, field2, sort2) {\n      const ds = this, cache2 = ds.counts || (ds.counts = {}), k = fieldKey(field2);\n      let v, a2, p;\n      if (k != null) {\n        scope = ds.scope;\n        v = cache2[k];\n      }\n      if (!v) {\n        p = {\n          groupby: scope.fieldRef(field2, \"key\"),\n          pulse: ref(ds.output)\n        };\n        if (sort2 && sort2.field) addSortField(scope, p, sort2);\n        a2 = scope.add(Aggregate(p));\n        v = scope.add(Collect({\n          pulse: ref(a2)\n        }));\n        v = {\n          agg: a2,\n          ref: ref(v)\n        };\n        if (k != null) cache2[k] = v;\n      } else if (sort2 && sort2.field) {\n        addSortField(scope, v.agg.params, sort2);\n      }\n      return v.ref;\n    },\n    tuplesRef() {\n      return ref(this.values);\n    },\n    extentRef(scope, field2) {\n      return cache(scope, this, \"extent\", \"extent\", field2, false);\n    },\n    domainRef(scope, field2) {\n      return cache(scope, this, \"domain\", \"values\", field2, false);\n    },\n    valuesRef(scope, field2, sort2) {\n      return cache(scope, this, \"vals\", \"values\", field2, sort2 || true);\n    },\n    lookupRef(scope, field2) {\n      return cache(scope, this, \"lookup\", \"tupleindex\", field2, false);\n    },\n    indataRef(scope, field2) {\n      return cache(scope, this, \"indata\", \"tupleindex\", field2, true, true);\n    }\n  };\n  function parseFacet(spec, scope, group2) {\n    const facet = spec.from.facet, name = facet.name, data2 = getDataRef(facet, scope);\n    let op;\n    if (!facet.name) {\n      error(\"Facet must have a name: \" + $(facet));\n    }\n    if (!facet.data) {\n      error(\"Facet must reference a data set: \" + $(facet));\n    }\n    if (facet.field) {\n      op = scope.add(PreFacet({\n        field: scope.fieldRef(facet.field),\n        pulse: data2\n      }));\n    } else if (facet.groupby) {\n      op = scope.add(Facet({\n        key: scope.keyRef(facet.groupby),\n        group: ref(scope.proxy(group2.parent)),\n        pulse: data2\n      }));\n    } else {\n      error(\"Facet must specify groupby or field: \" + $(facet));\n    }\n    const subscope = scope.fork(), source2 = subscope.add(Collect()), values2 = subscope.add(Sieve({\n      pulse: ref(source2)\n    }));\n    subscope.addData(name, new DataScope$1(subscope, source2, source2, values2));\n    subscope.addSignal(\"parent\", null);\n    op.params.subflow = {\n      $subflow: subscope.parse(spec).toRuntime()\n    };\n  }\n  function parseSubflow(spec, scope, input) {\n    const op = scope.add(PreFacet({\n      pulse: input.pulse\n    })), subscope = scope.fork();\n    subscope.add(Sieve());\n    subscope.addSignal(\"parent\", null);\n    op.params.subflow = {\n      $subflow: subscope.parse(spec).toRuntime()\n    };\n  }\n  function parseTrigger(spec, scope, name) {\n    const remove2 = spec.remove, insert2 = spec.insert, toggle = spec.toggle, modify2 = spec.modify, values2 = spec.values, op = scope.add(operator());\n    const update2 = \"if(\" + spec.trigger + ',modify(\"' + name + '\",' + [insert2, remove2, toggle, modify2, values2].map((_) => _ == null ? \"null\" : _).join(\",\") + \"),0)\";\n    const expr2 = parser(update2, scope);\n    op.update = expr2.$expr;\n    op.params = expr2.$params;\n  }\n  function parseMark(spec, scope) {\n    const role = getRole(spec), group2 = spec.type === GroupMark, facet = spec.from && spec.from.facet, overlap = spec.overlap;\n    let layout = spec.layout || role === ScopeRole || role === FrameRole, ops2, op, store, enc, name, layoutRef, boundRef;\n    const nested = role === MarkRole || layout || facet;\n    const input = parseData$1(spec.from, group2, scope);\n    op = scope.add(DataJoin({\n      key: input.key || (spec.key ? fieldRef$1(spec.key) : void 0),\n      pulse: input.pulse,\n      clean: !group2\n    }));\n    const joinRef = ref(op);\n    op = store = scope.add(Collect({\n      pulse: joinRef\n    }));\n    op = scope.add(Mark({\n      markdef: definition(spec),\n      interactive: interactive(spec.interactive, scope),\n      clip: clip(spec.clip, scope),\n      context: {\n        $context: true\n      },\n      groups: scope.lookup(),\n      parent: scope.signals.parent ? scope.signalRef(\"parent\") : null,\n      index: scope.markpath(),\n      pulse: ref(op)\n    }));\n    const markRef = ref(op);\n    op = enc = scope.add(Encode(parseEncode(spec.encode, spec.type, role, spec.style, scope, {\n      mod: false,\n      pulse: markRef\n    })));\n    op.params.parent = scope.encode();\n    if (spec.transform) {\n      spec.transform.forEach((_) => {\n        const tx2 = parseTransform(_, scope), md2 = tx2.metadata;\n        if (md2.generates || md2.changes) {\n          error(\"Mark transforms should not generate new data.\");\n        }\n        if (!md2.nomod) enc.params.mod = true;\n        tx2.params.pulse = ref(op);\n        scope.add(op = tx2);\n      });\n    }\n    if (spec.sort) {\n      op = scope.add(SortItems({\n        sort: scope.compareRef(spec.sort),\n        pulse: ref(op)\n      }));\n    }\n    const encodeRef = ref(op);\n    if (facet || layout) {\n      layout = scope.add(ViewLayout({\n        layout: scope.objectProperty(spec.layout),\n        legends: scope.legends,\n        mark: markRef,\n        pulse: encodeRef\n      }));\n      layoutRef = ref(layout);\n    }\n    const bound2 = scope.add(Bound({\n      mark: markRef,\n      pulse: layoutRef || encodeRef\n    }));\n    boundRef = ref(bound2);\n    if (group2) {\n      if (nested) {\n        ops2 = scope.operators;\n        ops2.pop();\n        if (layout) ops2.pop();\n      }\n      scope.pushState(encodeRef, layoutRef || boundRef, joinRef);\n      facet ? parseFacet(spec, scope, input) : nested ? parseSubflow(spec, scope, input) : scope.parse(spec);\n      scope.popState();\n      if (nested) {\n        if (layout) ops2.push(layout);\n        ops2.push(bound2);\n      }\n    }\n    if (overlap) {\n      boundRef = parseOverlap(overlap, boundRef, scope);\n    }\n    const render = scope.add(Render({\n      pulse: boundRef\n    })), sieve = scope.add(Sieve({\n      pulse: ref(render)\n    }, void 0, scope.parent()));\n    if (spec.name != null) {\n      name = spec.name;\n      scope.addData(name, new DataScope$1(scope, store, render, sieve));\n      if (spec.on) spec.on.forEach((on2) => {\n        if (on2.insert || on2.remove || on2.toggle) {\n          error(\"Marks only support modify triggers.\");\n        }\n        parseTrigger(on2, scope, name);\n      });\n    }\n  }\n  function parseOverlap(overlap, source2, scope) {\n    const method2 = overlap.method, bound2 = overlap.bound, sep = overlap.separation;\n    const params2 = {\n      separation: isSignal(sep) ? scope.signalRef(sep.signal) : sep,\n      method: isSignal(method2) ? scope.signalRef(method2.signal) : method2,\n      pulse: source2\n    };\n    if (overlap.order) {\n      params2.sort = scope.compareRef({\n        field: overlap.order\n      });\n    }\n    if (bound2) {\n      const tol = bound2.tolerance;\n      params2.boundTolerance = isSignal(tol) ? scope.signalRef(tol.signal) : +tol;\n      params2.boundScale = scope.scaleRef(bound2.scale);\n      params2.boundOrient = bound2.orient;\n    }\n    return ref(scope.add(Overlap(params2)));\n  }\n  function parseLegend(spec, scope) {\n    const config = scope.config.legend, encode2 = spec.encode || {}, _ = lookup(spec, config), legendEncode = encode2.legend || {}, name = legendEncode.name || void 0, interactive2 = legendEncode.interactive, style2 = legendEncode.style, scales2 = {};\n    let scale2 = 0, entryLayout, params2, children2;\n    LegendScales.forEach((s) => spec[s] ? (scales2[s] = spec[s], scale2 = scale2 || spec[s]) : 0);\n    if (!scale2) error(\"Missing valid scale for legend.\");\n    const type2 = legendType(spec, scope.scaleType(scale2));\n    const datum2 = {\n      title: spec.title != null,\n      scales: scales2,\n      type: type2,\n      vgrad: type2 !== \"symbol\" && _.isVertical()\n    };\n    const dataRef = ref(scope.add(Collect(null, [datum2])));\n    const entryEncode = {\n      enter: {\n        x: {\n          value: 0\n        },\n        y: {\n          value: 0\n        }\n      }\n    };\n    const entryRef = ref(scope.add(LegendEntries(params2 = {\n      type: type2,\n      scale: scope.scaleRef(scale2),\n      count: scope.objectProperty(_(\"tickCount\")),\n      limit: scope.property(_(\"symbolLimit\")),\n      values: scope.objectProperty(spec.values),\n      minstep: scope.property(spec.tickMinStep),\n      formatType: scope.property(spec.formatType),\n      formatSpecifier: scope.property(spec.format)\n    })));\n    if (type2 === Gradient) {\n      children2 = [legendGradient(spec, scale2, config, encode2.gradient), legendGradientLabels(spec, config, encode2.labels, entryRef)];\n      params2.count = params2.count || scope.signalRef(`max(2,2*floor((${deref(_.gradientLength())})/100))`);\n    } else if (type2 === Discrete) {\n      children2 = [legendGradientDiscrete(spec, scale2, config, encode2.gradient, entryRef), legendGradientLabels(spec, config, encode2.labels, entryRef)];\n    } else {\n      entryLayout = legendSymbolLayout(spec, config);\n      children2 = [legendSymbolGroups(spec, config, encode2, entryRef, deref(entryLayout.columns))];\n      params2.size = sizeExpression(spec, scope, children2[0].marks);\n    }\n    children2 = [guideGroup({\n      role: LegendEntryRole,\n      from: dataRef,\n      encode: entryEncode,\n      marks: children2,\n      layout: entryLayout,\n      interactive: interactive2\n    })];\n    if (datum2.title) {\n      children2.push(legendTitle(spec, config, encode2.title, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: LegendRole,\n      from: dataRef,\n      encode: extendEncode(buildLegendEncode(_, spec, config), legendEncode, Skip),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function legendType(spec, scaleType) {\n    let type2 = spec.type || Symbols;\n    if (!spec.type && scaleCount(spec) === 1 && (spec.fill || spec.stroke)) {\n      type2 = isContinuous(scaleType) ? Gradient : isDiscretizing(scaleType) ? Discrete : Symbols;\n    }\n    return type2 !== Gradient ? type2 : isDiscretizing(scaleType) ? Discrete : Gradient;\n  }\n  function scaleCount(spec) {\n    return LegendScales.reduce((count2, type2) => count2 + (spec[type2] ? 1 : 0), 0);\n  }\n  function buildLegendEncode(_, spec, config) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      offset: _(\"offset\"),\n      padding: _(\"padding\"),\n      titlePadding: _(\"titlePadding\"),\n      cornerRadius: _(\"cornerRadius\"),\n      fill: _(\"fillColor\"),\n      stroke: _(\"strokeColor\"),\n      strokeWidth: config.strokeWidth,\n      strokeDash: config.strokeDash,\n      x: _(\"legendX\"),\n      y: _(\"legendY\"),\n      // accessibility support\n      format: spec.format,\n      formatType: spec.formatType\n    });\n    return encode2;\n  }\n  function sizeExpression(spec, scope, marks) {\n    const size2 = deref(getChannel(\"size\", spec, marks)), strokeWidth = deref(getChannel(\"strokeWidth\", spec, marks)), fontSize2 = deref(getFontSize(marks[1].encode, scope, GuideLabelStyle));\n    return parser(`max(ceil(sqrt(${size2})+${strokeWidth}),${fontSize2})`, scope);\n  }\n  function getChannel(name, spec, marks) {\n    return spec[name] ? `scale(\"${spec[name]}\",datum)` : getEncoding(name, marks[0].encode);\n  }\n  function getFontSize(encode2, scope, style2) {\n    return getEncoding(\"fontSize\", encode2) || getStyle(\"fontSize\", scope, style2);\n  }\n  const angleExpr = `item.orient===\"${Left}\"?-90:item.orient===\"${Right}\"?90:0`;\n  function parseTitle(spec, scope) {\n    spec = isString(spec) ? {\n      text: spec\n    } : spec;\n    const _ = lookup(spec, scope.config.title), encode2 = spec.encode || {}, userEncode = encode2.group || {}, name = userEncode.name || void 0, interactive2 = userEncode.interactive, style2 = userEncode.style, children2 = [];\n    const datum2 = {}, dataRef = ref(scope.add(Collect(null, [datum2])));\n    children2.push(buildTitle(spec, _, titleEncode(spec), dataRef));\n    if (spec.subtitle) {\n      children2.push(buildSubTitle(spec, _, encode2.subtitle, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: TitleRole,\n      from: dataRef,\n      encode: groupEncode(_, userEncode),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function titleEncode(spec) {\n    const encode2 = spec.encode;\n    return encode2 && encode2.title || extend$1({\n      name: spec.name,\n      interactive: spec.interactive,\n      style: spec.style\n    }, encode2);\n  }\n  function groupEncode(_, userEncode) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      anchor: _(\"anchor\"),\n      align: {\n        signal: alignExpr$1\n      },\n      angle: {\n        signal: angleExpr\n      },\n      limit: _(\"limit\"),\n      frame: _(\"frame\"),\n      offset: _(\"offset\") || 0,\n      padding: _(\"subtitlePadding\")\n    });\n    return extendEncode(encode2, userEncode, Skip);\n  }\n  function buildTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n      value: 0\n    }, text2 = spec.text, encode2 = {\n      enter: {\n        opacity: zero2\n      },\n      update: {\n        opacity: {\n          value: 1\n        }\n      },\n      exit: {\n        opacity: zero2\n      }\n    };\n    addEncoders(encode2, {\n      text: text2,\n      align: {\n        signal: \"item.mark.group.align\"\n      },\n      angle: {\n        signal: \"item.mark.group.angle\"\n      },\n      limit: {\n        signal: \"item.mark.group.limit\"\n      },\n      baseline: \"top\",\n      dx: _(\"dx\"),\n      dy: _(\"dy\"),\n      fill: _(\"color\"),\n      font: _(\"font\"),\n      fontSize: _(\"fontSize\"),\n      fontStyle: _(\"fontStyle\"),\n      fontWeight: _(\"fontWeight\"),\n      lineHeight: _(\"lineHeight\")\n    }, {\n      // update\n      align: _(\"align\"),\n      angle: _(\"angle\"),\n      baseline: _(\"baseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: TitleTextRole,\n      style: GroupTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function buildSubTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n      value: 0\n    }, text2 = spec.subtitle, encode2 = {\n      enter: {\n        opacity: zero2\n      },\n      update: {\n        opacity: {\n          value: 1\n        }\n      },\n      exit: {\n        opacity: zero2\n      }\n    };\n    addEncoders(encode2, {\n      text: text2,\n      align: {\n        signal: \"item.mark.group.align\"\n      },\n      angle: {\n        signal: \"item.mark.group.angle\"\n      },\n      limit: {\n        signal: \"item.mark.group.limit\"\n      },\n      baseline: \"top\",\n      dx: _(\"dx\"),\n      dy: _(\"dy\"),\n      fill: _(\"subtitleColor\"),\n      font: _(\"subtitleFont\"),\n      fontSize: _(\"subtitleFontSize\"),\n      fontStyle: _(\"subtitleFontStyle\"),\n      fontWeight: _(\"subtitleFontWeight\"),\n      lineHeight: _(\"subtitleLineHeight\")\n    }, {\n      // update\n      align: _(\"align\"),\n      angle: _(\"angle\"),\n      baseline: _(\"baseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: TitleSubtitleRole,\n      style: GroupSubtitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function parseData(data2, scope) {\n    const transforms2 = [];\n    if (data2.transform) {\n      data2.transform.forEach((tx2) => {\n        transforms2.push(parseTransform(tx2, scope));\n      });\n    }\n    if (data2.on) {\n      data2.on.forEach((on2) => {\n        parseTrigger(on2, scope, data2.name);\n      });\n    }\n    scope.addDataPipeline(data2.name, analyze(data2, scope, transforms2));\n  }\n  function analyze(data2, scope, ops2) {\n    const output2 = [];\n    let source2 = null, modify2 = false, generate2 = false, upstream, i, n, t, m2;\n    if (data2.values) {\n      if (isSignal(data2.values) || hasSignal(data2.format)) {\n        output2.push(load(scope, data2));\n        output2.push(source2 = collect());\n      } else {\n        output2.push(source2 = collect({\n          $ingest: data2.values,\n          $format: data2.format\n        }));\n      }\n    } else if (data2.url) {\n      if (hasSignal(data2.url) || hasSignal(data2.format)) {\n        output2.push(load(scope, data2));\n        output2.push(source2 = collect());\n      } else {\n        output2.push(source2 = collect({\n          $request: data2.url,\n          $format: data2.format\n        }));\n      }\n    } else if (data2.source) {\n      source2 = upstream = array$5(data2.source).map((d) => ref(scope.getData(d).output));\n      output2.push(null);\n    }\n    for (i = 0, n = ops2.length; i < n; ++i) {\n      t = ops2[i];\n      m2 = t.metadata;\n      if (!source2 && !m2.source) {\n        output2.push(source2 = collect());\n      }\n      output2.push(t);\n      if (m2.generates) generate2 = true;\n      if (m2.modifies && !generate2) modify2 = true;\n      if (m2.source) source2 = t;\n      else if (m2.changes) source2 = null;\n    }\n    if (upstream) {\n      n = upstream.length - 1;\n      output2[0] = Relay({\n        derive: modify2,\n        pulse: n ? upstream : upstream[0]\n      });\n      if (modify2 || n) {\n        output2.splice(1, 0, collect());\n      }\n    }\n    if (!source2) output2.push(collect());\n    output2.push(Sieve({}));\n    return output2;\n  }\n  function collect(values2) {\n    const s = Collect({}, values2);\n    s.metadata = {\n      source: true\n    };\n    return s;\n  }\n  function load(scope, data2) {\n    return Load({\n      url: data2.url ? scope.property(data2.url) : void 0,\n      async: data2.async ? scope.property(data2.async) : void 0,\n      values: data2.values ? scope.property(data2.values) : void 0,\n      format: scope.objectProperty(data2.format)\n    });\n  }\n  const isX = (orient) => orient === Bottom || orient === Top;\n  const getSign = (orient, a2, b2) => isSignal(orient) ? ifLeftTopExpr(orient.signal, a2, b2) : orient === Left || orient === Top ? a2 : b2;\n  const ifX = (orient, a2, b2) => isSignal(orient) ? ifXEnc(orient.signal, a2, b2) : isX(orient) ? a2 : b2;\n  const ifY = (orient, a2, b2) => isSignal(orient) ? ifYEnc(orient.signal, a2, b2) : isX(orient) ? b2 : a2;\n  const ifTop = (orient, a2, b2) => isSignal(orient) ? ifTopExpr(orient.signal, a2, b2) : orient === Top ? {\n    value: a2\n  } : {\n    value: b2\n  };\n  const ifRight = (orient, a2, b2) => isSignal(orient) ? ifRightExpr(orient.signal, a2, b2) : orient === Right ? {\n    value: a2\n  } : {\n    value: b2\n  };\n  const ifXEnc = ($orient, a2, b2) => ifEnc(`${$orient} === '${Top}' || ${$orient} === '${Bottom}'`, a2, b2);\n  const ifYEnc = ($orient, a2, b2) => ifEnc(`${$orient} !== '${Top}' && ${$orient} !== '${Bottom}'`, a2, b2);\n  const ifLeftTopExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Left}' || ${$orient} === '${Top}'`, a2, b2);\n  const ifTopExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Top}'`, a2, b2);\n  const ifRightExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Right}'`, a2, b2);\n  const ifEnc = (test2, a2, b2) => {\n    a2 = a2 != null ? encoder(a2) : a2;\n    b2 = b2 != null ? encoder(b2) : b2;\n    if (isSimple(a2) && isSimple(b2)) {\n      a2 = a2 ? a2.signal || $(a2.value) : null;\n      b2 = b2 ? b2.signal || $(b2.value) : null;\n      return {\n        signal: `${test2} ? (${a2}) : (${b2})`\n      };\n    } else {\n      return [extend$1({\n        test: test2\n      }, a2)].concat(b2 || []);\n    }\n  };\n  const isSimple = (enc) => enc == null || Object.keys(enc).length === 1;\n  const ifExpr = (test2, a2, b2) => ({\n    signal: `${test2} ? (${toExpr(a2)}) : (${toExpr(b2)})`\n  });\n  const ifOrient = ($orient, t, b2, l, r) => ({\n    signal: (l != null ? `${$orient} === '${Left}' ? (${toExpr(l)}) : ` : \"\") + (b2 != null ? `${$orient} === '${Bottom}' ? (${toExpr(b2)}) : ` : \"\") + (r != null ? `${$orient} === '${Right}' ? (${toExpr(r)}) : ` : \"\") + (t != null ? `${$orient} === '${Top}' ? (${toExpr(t)}) : ` : \"\") + \"(null)\"\n  });\n  const toExpr = (v) => isSignal(v) ? v.signal : v == null ? null : $(v);\n  const mult = (sign2, value2) => value2 === 0 ? 0 : isSignal(sign2) ? {\n    signal: `(${sign2.signal}) * ${value2}`\n  } : {\n    value: sign2 * value2\n  };\n  const patch = (value2, base2) => {\n    const s = value2.signal;\n    return s && s.endsWith(\"(null)\") ? {\n      signal: s.slice(0, -6) + base2.signal\n    } : value2;\n  };\n  function fallback(prop, config, axisConfig2, style2) {\n    let styleProp;\n    if (config && has$1(config, prop)) {\n      return config[prop];\n    } else if (has$1(axisConfig2, prop)) {\n      return axisConfig2[prop];\n    } else if (prop.startsWith(\"title\")) {\n      switch (prop) {\n        case \"titleColor\":\n          styleProp = \"fill\";\n          break;\n        case \"titleFont\":\n        case \"titleFontSize\":\n        case \"titleFontWeight\":\n          styleProp = prop[5].toLowerCase() + prop.slice(6);\n      }\n      return style2[GuideTitleStyle][styleProp];\n    } else if (prop.startsWith(\"label\")) {\n      switch (prop) {\n        case \"labelColor\":\n          styleProp = \"fill\";\n          break;\n        case \"labelFont\":\n        case \"labelFontSize\":\n          styleProp = prop[5].toLowerCase() + prop.slice(6);\n      }\n      return style2[GuideLabelStyle][styleProp];\n    }\n    return null;\n  }\n  function keys(objects) {\n    const map2 = {};\n    for (const obj2 of objects) {\n      if (!obj2) continue;\n      for (const key2 in obj2) map2[key2] = 1;\n    }\n    return Object.keys(map2);\n  }\n  function axisConfig(spec, scope) {\n    var config = scope.config, style2 = config.style, axis = config.axis, band2 = scope.scaleType(spec.scale) === \"band\" && config.axisBand, orient = spec.orient, xy, or2, key2;\n    if (isSignal(orient)) {\n      const xyKeys = keys([config.axisX, config.axisY]), orientKeys = keys([config.axisTop, config.axisBottom, config.axisLeft, config.axisRight]);\n      xy = {};\n      for (key2 of xyKeys) {\n        xy[key2] = ifX(orient, fallback(key2, config.axisX, axis, style2), fallback(key2, config.axisY, axis, style2));\n      }\n      or2 = {};\n      for (key2 of orientKeys) {\n        or2[key2] = ifOrient(orient.signal, fallback(key2, config.axisTop, axis, style2), fallback(key2, config.axisBottom, axis, style2), fallback(key2, config.axisLeft, axis, style2), fallback(key2, config.axisRight, axis, style2));\n      }\n    } else {\n      xy = orient === Top || orient === Bottom ? config.axisX : config.axisY;\n      or2 = config[\"axis\" + orient[0].toUpperCase() + orient.slice(1)];\n    }\n    const result = xy || or2 || band2 ? extend$1({}, axis, xy, or2, band2) : axis;\n    return result;\n  }\n  function axisDomain(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient;\n    let enter, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"domainColor\"),\n      strokeCap: _(\"domainCap\"),\n      strokeDash: _(\"domainDash\"),\n      strokeDashOffset: _(\"domainDashOffset\"),\n      strokeWidth: _(\"domainWidth\"),\n      strokeOpacity: _(\"domainOpacity\")\n    });\n    const pos0 = position(spec, 0);\n    const pos1 = position(spec, 1);\n    enter.x = update2.x = ifX(orient, pos0, zero);\n    enter.x2 = update2.x2 = ifX(orient, pos1);\n    enter.y = update2.y = ifY(orient, pos0, zero);\n    enter.y2 = update2.y2 = ifY(orient, pos1);\n    return guideMark({\n      type: RuleMark,\n      role: AxisDomainRole,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function position(spec, pos) {\n    return {\n      scale: spec.scale,\n      range: pos\n    };\n  }\n  function axisGrid(spec, config, userEncode, dataRef, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, vscale = spec.gridScale, sign2 = getSign(orient, 1, -1), offset2 = offsetValue(spec.offset, sign2);\n    let enter, exit, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: exit = {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gridColor\"),\n      strokeCap: _(\"gridCap\"),\n      strokeDash: _(\"gridDash\"),\n      strokeDashOffset: _(\"gridDashOffset\"),\n      strokeOpacity: _(\"gridOpacity\"),\n      strokeWidth: _(\"gridWidth\")\n    });\n    const tickPos = {\n      scale: spec.scale,\n      field: Value,\n      band: band2.band,\n      extra: band2.extra,\n      offset: band2.offset,\n      round: _(\"tickRound\")\n    };\n    const sz2 = ifX(orient, {\n      signal: \"height\"\n    }, {\n      signal: \"width\"\n    });\n    const gridStart = vscale ? {\n      scale: vscale,\n      range: 0,\n      mult: sign2,\n      offset: offset2\n    } : {\n      value: 0,\n      offset: offset2\n    };\n    const gridEnd = vscale ? {\n      scale: vscale,\n      range: 1,\n      mult: sign2,\n      offset: offset2\n    } : extend$1(sz2, {\n      mult: sign2,\n      offset: offset2\n    });\n    enter.x = update2.x = ifX(orient, tickPos, gridStart);\n    enter.y = update2.y = ifY(orient, tickPos, gridStart);\n    enter.x2 = update2.x2 = ifY(orient, gridEnd);\n    enter.y2 = update2.y2 = ifX(orient, gridEnd);\n    exit.x = ifX(orient, tickPos);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n      type: RuleMark,\n      role: AxisGridRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function offsetValue(offset2, sign2) {\n    if (sign2 === 1) ;\n    else if (!isObject$1(offset2)) {\n      offset2 = isSignal(sign2) ? {\n        signal: `(${sign2.signal}) * (${offset2 || 0})`\n      } : sign2 * (offset2 || 0);\n    } else {\n      let entry2 = offset2 = extend$1({}, offset2);\n      while (entry2.mult != null) {\n        if (!isObject$1(entry2.mult)) {\n          entry2.mult = isSignal(sign2) ? {\n            signal: `(${entry2.mult}) * (${sign2.signal})`\n          } : entry2.mult * sign2;\n          return offset2;\n        } else {\n          entry2 = entry2.mult = extend$1({}, entry2.mult);\n        }\n      }\n      entry2.mult = sign2;\n    }\n    return offset2;\n  }\n  function axisTicks(spec, config, userEncode, dataRef, size2, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, sign2 = getSign(orient, -1, 1);\n    let enter, exit, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: exit = {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"tickColor\"),\n      strokeCap: _(\"tickCap\"),\n      strokeDash: _(\"tickDash\"),\n      strokeDashOffset: _(\"tickDashOffset\"),\n      strokeOpacity: _(\"tickOpacity\"),\n      strokeWidth: _(\"tickWidth\")\n    });\n    const tickSize = encoder(size2);\n    tickSize.mult = sign2;\n    const tickPos = {\n      scale: spec.scale,\n      field: Value,\n      band: band2.band,\n      extra: band2.extra,\n      offset: band2.offset,\n      round: _(\"tickRound\")\n    };\n    update2.y = enter.y = ifX(orient, zero, tickPos);\n    update2.y2 = enter.y2 = ifX(orient, tickSize);\n    exit.x = ifX(orient, tickPos);\n    update2.x = enter.x = ifY(orient, zero, tickPos);\n    update2.x2 = enter.x2 = ifY(orient, tickSize);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n      type: RuleMark,\n      role: AxisTickRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function flushExpr(scale2, threshold2, a2, b2, c2) {\n    return {\n      signal: 'flush(range(\"' + scale2 + '\"), scale(\"' + scale2 + '\", datum.value), ' + threshold2 + \",\" + a2 + \",\" + b2 + \",\" + c2 + \")\"\n    };\n  }\n  function axisLabels(spec, config, userEncode, dataRef, size2, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, scale2 = spec.scale, sign2 = getSign(orient, -1, 1), flush2 = deref(_(\"labelFlush\")), flushOffset = deref(_(\"labelFlushOffset\")), labelAlign = _(\"labelAlign\"), labelBaseline = _(\"labelBaseline\");\n    let flushOn = flush2 === 0 || !!flush2, update2;\n    const tickSize = encoder(size2);\n    tickSize.mult = sign2;\n    tickSize.offset = encoder(_(\"labelPadding\") || 0);\n    tickSize.offset.mult = sign2;\n    const tickPos = {\n      scale: scale2,\n      field: Value,\n      band: 0.5,\n      offset: extendOffset(band2.offset, _(\"labelOffset\"))\n    };\n    const align = ifX(orient, flushOn ? flushExpr(scale2, flush2, '\"left\"', '\"right\"', '\"center\"') : {\n      value: \"center\"\n    }, ifRight(orient, \"left\", \"right\"));\n    const baseline2 = ifX(orient, ifTop(orient, \"bottom\", \"top\"), flushOn ? flushExpr(scale2, flush2, '\"top\"', '\"bottom\"', '\"middle\"') : {\n      value: \"middle\"\n    });\n    const offsetExpr = flushExpr(scale2, flush2, `-(${flushOffset})`, flushOffset, 0);\n    flushOn = flushOn && flushOffset;\n    const enter = {\n      opacity: zero,\n      x: ifX(orient, tickPos, tickSize),\n      y: ifY(orient, tickPos, tickSize)\n    };\n    const encode2 = {\n      enter,\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        },\n        x: enter.x,\n        y: enter.y,\n        align,\n        baseline: baseline2\n      },\n      exit: {\n        opacity: zero,\n        x: enter.x,\n        y: enter.y\n      }\n    };\n    addEncoders(encode2, {\n      dx: !labelAlign && flushOn ? ifX(orient, offsetExpr) : null,\n      dy: !labelBaseline && flushOn ? ifY(orient, offsetExpr) : null\n    });\n    addEncoders(encode2, {\n      angle: _(\"labelAngle\"),\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontWeight: _(\"labelFontWeight\"),\n      fontStyle: _(\"labelFontStyle\"),\n      limit: _(\"labelLimit\"),\n      lineHeight: _(\"labelLineHeight\")\n    }, {\n      align: labelAlign,\n      baseline: labelBaseline\n    });\n    const bound2 = _(\"labelBound\");\n    let overlap = _(\"labelOverlap\");\n    overlap = overlap || bound2 ? {\n      separation: _(\"labelSeparation\"),\n      method: overlap,\n      order: \"datum.index\",\n      bound: bound2 ? {\n        scale: scale2,\n        orient,\n        tolerance: bound2\n      } : null\n    } : void 0;\n    if (update2.align !== align) {\n      update2.align = patch(update2.align, align);\n    }\n    if (update2.baseline !== baseline2) {\n      update2.baseline = patch(update2.baseline, baseline2);\n    }\n    return guideMark({\n      type: TextMark,\n      role: AxisLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: dataRef,\n      encode: encode2,\n      overlap\n    }, userEncode);\n  }\n  function axisTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient, sign2 = getSign(orient, -1, 1);\n    let enter, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero,\n        anchor: encoder(_(\"titleAnchor\", null)),\n        align: {\n          signal: alignExpr$1\n        }\n      },\n      update: update2 = extend$1({}, enter, {\n        opacity: one,\n        text: encoder(spec.title)\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    const titlePos = {\n      signal: `lerp(range(\"${spec.scale}\"), ${anchorExpr(0, 1, 0.5)})`\n    };\n    update2.x = ifX(orient, titlePos);\n    update2.y = ifY(orient, titlePos);\n    enter.angle = ifX(orient, zero, mult(sign2, 90));\n    enter.baseline = ifX(orient, ifTop(orient, Bottom, Top), {\n      value: Bottom\n    });\n    update2.angle = enter.angle;\n    update2.baseline = enter.baseline;\n    addEncoders(encode2, {\n      fill: _(\"titleColor\"),\n      fillOpacity: _(\"titleOpacity\"),\n      font: _(\"titleFont\"),\n      fontSize: _(\"titleFontSize\"),\n      fontStyle: _(\"titleFontStyle\"),\n      fontWeight: _(\"titleFontWeight\"),\n      limit: _(\"titleLimit\"),\n      lineHeight: _(\"titleLineHeight\")\n    }, {\n      // require update\n      align: _(\"titleAlign\"),\n      angle: _(\"titleAngle\"),\n      baseline: _(\"titleBaseline\")\n    });\n    autoLayout(_, orient, encode2, userEncode);\n    encode2.update.align = patch(encode2.update.align, enter.align);\n    encode2.update.angle = patch(encode2.update.angle, enter.angle);\n    encode2.update.baseline = patch(encode2.update.baseline, enter.baseline);\n    return guideMark({\n      type: TextMark,\n      role: AxisTitleRole,\n      style: GuideTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function autoLayout(_, orient, encode2, userEncode) {\n    const auto = (value2, dim) => value2 != null ? (encode2.update[dim] = patch(encoder(value2), encode2.update[dim]), false) : !has(dim, userEncode) ? true : false;\n    const autoY = auto(_(\"titleX\"), \"x\"), autoX = auto(_(\"titleY\"), \"y\");\n    encode2.enter.auto = autoX === autoY ? encoder(autoX) : ifX(orient, encoder(autoX), encoder(autoY));\n  }\n  function parseAxis(spec, scope) {\n    const config = axisConfig(spec, scope), encode2 = spec.encode || {}, axisEncode = encode2.axis || {}, name = axisEncode.name || void 0, interactive2 = axisEncode.interactive, style2 = axisEncode.style, _ = lookup(spec, config), band2 = tickBand(_);\n    const datum2 = {\n      scale: spec.scale,\n      ticks: !!_(\"ticks\"),\n      labels: !!_(\"labels\"),\n      grid: !!_(\"grid\"),\n      domain: !!_(\"domain\"),\n      title: spec.title != null\n    };\n    const dataRef = ref(scope.add(Collect({}, [datum2])));\n    const ticksRef = ref(scope.add(AxisTicks({\n      scale: scope.scaleRef(spec.scale),\n      extra: scope.property(band2.extra),\n      count: scope.objectProperty(spec.tickCount),\n      values: scope.objectProperty(spec.values),\n      minstep: scope.property(spec.tickMinStep),\n      formatType: scope.property(spec.formatType),\n      formatSpecifier: scope.property(spec.format)\n    })));\n    const children2 = [];\n    let size2;\n    if (datum2.grid) {\n      children2.push(axisGrid(spec, config, encode2.grid, ticksRef, band2));\n    }\n    if (datum2.ticks) {\n      size2 = _(\"tickSize\");\n      children2.push(axisTicks(spec, config, encode2.ticks, ticksRef, size2, band2));\n    }\n    if (datum2.labels) {\n      size2 = datum2.ticks ? size2 : 0;\n      children2.push(axisLabels(spec, config, encode2.labels, ticksRef, size2, band2));\n    }\n    if (datum2.domain) {\n      children2.push(axisDomain(spec, config, encode2.domain, dataRef));\n    }\n    if (datum2.title) {\n      children2.push(axisTitle(spec, config, encode2.title, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: AxisRole,\n      from: dataRef,\n      encode: extendEncode(buildAxisEncode(_, spec), axisEncode, Skip),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function buildAxisEncode(_, spec) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      offset: _(\"offset\") || 0,\n      position: value(spec.position, 0),\n      titlePadding: _(\"titlePadding\"),\n      minExtent: _(\"minExtent\"),\n      maxExtent: _(\"maxExtent\"),\n      range: {\n        signal: `abs(span(range(\"${spec.scale}\")))`\n      },\n      translate: _(\"translate\"),\n      // accessibility support\n      format: spec.format,\n      formatType: spec.formatType\n    });\n    return encode2;\n  }\n  function parseScope(spec, scope, preprocessed) {\n    const signals = array$5(spec.signals), scales2 = array$5(spec.scales);\n    if (!preprocessed) signals.forEach((_) => parseSignal(_, scope));\n    array$5(spec.projections).forEach((_) => parseProjection(_, scope));\n    scales2.forEach((_) => initScale(_, scope));\n    array$5(spec.data).forEach((_) => parseData(_, scope));\n    scales2.forEach((_) => parseScale(_, scope));\n    (preprocessed || signals).forEach((_) => parseSignalUpdates(_, scope));\n    array$5(spec.axes).forEach((_) => parseAxis(_, scope));\n    array$5(spec.marks).forEach((_) => parseMark(_, scope));\n    array$5(spec.legends).forEach((_) => parseLegend(_, scope));\n    if (spec.title) parseTitle(spec.title, scope);\n    scope.parseLambdas();\n    return scope;\n  }\n  const rootEncode = (spec) => extendEncode({\n    enter: {\n      x: {\n        value: 0\n      },\n      y: {\n        value: 0\n      }\n    },\n    update: {\n      width: {\n        signal: \"width\"\n      },\n      height: {\n        signal: \"height\"\n      }\n    }\n  }, spec);\n  function parseView(spec, scope) {\n    const config = scope.config;\n    const root = ref(scope.root = scope.add(operator()));\n    const signals = collectSignals(spec, config);\n    signals.forEach((_) => parseSignal(_, scope));\n    scope.description = spec.description || config.description;\n    scope.eventConfig = config.events;\n    scope.legends = scope.objectProperty(config.legend && config.legend.layout);\n    scope.locale = config.locale;\n    const input = scope.add(Collect());\n    const encode2 = scope.add(Encode(parseEncode(rootEncode(spec.encode), GroupMark, FrameRole, spec.style, scope, {\n      pulse: ref(input)\n    })));\n    const parent = scope.add(ViewLayout({\n      layout: scope.objectProperty(spec.layout),\n      legends: scope.legends,\n      autosize: scope.signalRef(\"autosize\"),\n      mark: root,\n      pulse: ref(encode2)\n    }));\n    scope.operators.pop();\n    scope.pushState(ref(encode2), ref(parent), null);\n    parseScope(spec, scope, signals);\n    scope.operators.push(parent);\n    let op = scope.add(Bound({\n      mark: root,\n      pulse: ref(parent)\n    }));\n    op = scope.add(Render({\n      pulse: ref(op)\n    }));\n    op = scope.add(Sieve({\n      pulse: ref(op)\n    }));\n    scope.addData(\"root\", new DataScope$1(scope, input, input, op));\n    return scope;\n  }\n  function signalObject(name, value2) {\n    return value2 && value2.signal ? {\n      name,\n      update: value2.signal\n    } : {\n      name,\n      value: value2\n    };\n  }\n  function collectSignals(spec, config) {\n    const _ = (name) => value(spec[name], config[name]), signals = [signalObject(\"background\", _(\"background\")), signalObject(\"autosize\", parseAutosize(_(\"autosize\"))), signalObject(\"padding\", parsePadding(_(\"padding\"))), signalObject(\"width\", _(\"width\") || 0), signalObject(\"height\", _(\"height\") || 0)], pre = signals.reduce((p, s) => (p[s.name] = s, p), {}), map2 = {};\n    array$5(spec.signals).forEach((s) => {\n      if (has$1(pre, s.name)) {\n        s = extend$1(pre[s.name], s);\n      } else {\n        signals.push(s);\n      }\n      map2[s.name] = s;\n    });\n    array$5(config.signals).forEach((s) => {\n      if (!has$1(map2, s.name) && !has$1(pre, s.name)) {\n        signals.push(s);\n      }\n    });\n    return signals;\n  }\n  function Scope(config, options) {\n    this.config = config || {};\n    this.options = options || {};\n    this.bindings = [];\n    this.field = {};\n    this.signals = {};\n    this.lambdas = {};\n    this.scales = {};\n    this.events = {};\n    this.data = {};\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this.eventConfig = null;\n    this.locale = null;\n    this._id = 0;\n    this._subid = 0;\n    this._nextsub = [0];\n    this._parent = [];\n    this._encode = [];\n    this._lookup = [];\n    this._markpath = [];\n  }\n  function Subscope(scope) {\n    this.config = scope.config;\n    this.options = scope.options;\n    this.legends = scope.legends;\n    this.field = Object.create(scope.field);\n    this.signals = Object.create(scope.signals);\n    this.lambdas = Object.create(scope.lambdas);\n    this.scales = Object.create(scope.scales);\n    this.events = Object.create(scope.events);\n    this.data = Object.create(scope.data);\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this._id = 0;\n    this._subid = ++scope._nextsub[0];\n    this._nextsub = scope._nextsub;\n    this._parent = scope._parent.slice();\n    this._encode = scope._encode.slice();\n    this._lookup = scope._lookup.slice();\n    this._markpath = scope._markpath;\n  }\n  Scope.prototype = Subscope.prototype = {\n    parse(spec) {\n      return parseScope(spec, this);\n    },\n    fork() {\n      return new Subscope(this);\n    },\n    isSubscope() {\n      return this._subid > 0;\n    },\n    toRuntime() {\n      this.finish();\n      return {\n        description: this.description,\n        operators: this.operators,\n        streams: this.streams,\n        updates: this.updates,\n        bindings: this.bindings,\n        eventConfig: this.eventConfig,\n        locale: this.locale\n      };\n    },\n    id() {\n      return (this._subid ? this._subid + \":\" : 0) + this._id++;\n    },\n    add(op) {\n      this.operators.push(op);\n      op.id = this.id();\n      if (op.refs) {\n        op.refs.forEach((ref2) => {\n          ref2.$ref = op.id;\n        });\n        op.refs = null;\n      }\n      return op;\n    },\n    proxy(op) {\n      const vref = op instanceof Entry ? ref(op) : op;\n      return this.add(Proxy({\n        value: vref\n      }));\n    },\n    addStream(stream2) {\n      this.streams.push(stream2);\n      stream2.id = this.id();\n      return stream2;\n    },\n    addUpdate(update2) {\n      this.updates.push(update2);\n      return update2;\n    },\n    // Apply metadata\n    finish() {\n      let name, ds;\n      if (this.root) this.root.root = true;\n      for (name in this.signals) {\n        this.signals[name].signal = name;\n      }\n      for (name in this.scales) {\n        this.scales[name].scale = name;\n      }\n      function annotate(op, name2, type2) {\n        let data2, list;\n        if (op) {\n          data2 = op.data || (op.data = {});\n          list = data2[name2] || (data2[name2] = []);\n          list.push(type2);\n        }\n      }\n      for (name in this.data) {\n        ds = this.data[name];\n        annotate(ds.input, name, \"input\");\n        annotate(ds.output, name, \"output\");\n        annotate(ds.values, name, \"values\");\n        for (const field2 in ds.index) {\n          annotate(ds.index[field2], name, \"index:\" + field2);\n        }\n      }\n      return this;\n    },\n    // ----\n    pushState(encode2, parent, lookup2) {\n      this._encode.push(ref(this.add(Sieve({\n        pulse: encode2\n      }))));\n      this._parent.push(parent);\n      this._lookup.push(lookup2 ? ref(this.proxy(lookup2)) : null);\n      this._markpath.push(-1);\n    },\n    popState() {\n      this._encode.pop();\n      this._parent.pop();\n      this._lookup.pop();\n      this._markpath.pop();\n    },\n    parent() {\n      return peek$1(this._parent);\n    },\n    encode() {\n      return peek$1(this._encode);\n    },\n    lookup() {\n      return peek$1(this._lookup);\n    },\n    markpath() {\n      const p = this._markpath;\n      return ++p[p.length - 1];\n    },\n    // ----\n    fieldRef(field2, name) {\n      if (isString(field2)) return fieldRef$1(field2, name);\n      if (!field2.signal) {\n        error(\"Unsupported field reference: \" + $(field2));\n      }\n      const s = field2.signal;\n      let f = this.field[s];\n      if (!f) {\n        const params2 = {\n          name: this.signalRef(s)\n        };\n        if (name) params2.as = name;\n        this.field[s] = f = ref(this.add(Field(params2)));\n      }\n      return f;\n    },\n    compareRef(cmp) {\n      let signal = false;\n      const check = (_) => isSignal(_) ? (signal = true, this.signalRef(_.signal)) : isExpr$1(_) ? (signal = true, this.exprRef(_.expr)) : _;\n      const fields = array$5(cmp.field).map(check), orders = array$5(cmp.order).map(check);\n      return signal ? ref(this.add(Compare({\n        fields,\n        orders\n      }))) : compareRef(fields, orders);\n    },\n    keyRef(fields, flat) {\n      let signal = false;\n      const check = (_) => isSignal(_) ? (signal = true, ref(sig[_.signal])) : _;\n      const sig = this.signals;\n      fields = array$5(fields).map(check);\n      return signal ? ref(this.add(Key({\n        fields,\n        flat\n      }))) : keyRef(fields, flat);\n    },\n    sortRef(sort2) {\n      if (!sort2) return sort2;\n      const a2 = aggrField(sort2.op, sort2.field), o = sort2.order || Ascending;\n      return o.signal ? ref(this.add(Compare({\n        fields: a2,\n        orders: this.signalRef(o.signal)\n      }))) : compareRef(a2, o);\n    },\n    // ----\n    event(source2, type2) {\n      const key2 = source2 + \":\" + type2;\n      if (!this.events[key2]) {\n        const id2 = this.id();\n        this.streams.push({\n          id: id2,\n          source: source2,\n          type: type2\n        });\n        this.events[key2] = id2;\n      }\n      return this.events[key2];\n    },\n    // ----\n    hasOwnSignal(name) {\n      return has$1(this.signals, name);\n    },\n    addSignal(name, value2) {\n      if (this.hasOwnSignal(name)) {\n        error(\"Duplicate signal name: \" + $(name));\n      }\n      const op = value2 instanceof Entry ? value2 : this.add(operator(value2));\n      return this.signals[name] = op;\n    },\n    getSignal(name) {\n      if (!this.signals[name]) {\n        error(\"Unrecognized signal name: \" + $(name));\n      }\n      return this.signals[name];\n    },\n    signalRef(s) {\n      if (this.signals[s]) {\n        return ref(this.signals[s]);\n      } else if (!has$1(this.lambdas, s)) {\n        this.lambdas[s] = this.add(operator(null));\n      }\n      return ref(this.lambdas[s]);\n    },\n    parseLambdas() {\n      const code = Object.keys(this.lambdas);\n      for (let i = 0, n = code.length; i < n; ++i) {\n        const s = code[i], e = parser(s, this), op = this.lambdas[s];\n        op.params = e.$params;\n        op.update = e.$expr;\n      }\n    },\n    property(spec) {\n      return spec && spec.signal ? this.signalRef(spec.signal) : spec;\n    },\n    objectProperty(spec) {\n      return !spec || !isObject$1(spec) ? spec : this.signalRef(spec.signal || propertyLambda(spec));\n    },\n    exprRef(code, name) {\n      const params2 = {\n        expr: parser(code, this)\n      };\n      if (name) params2.expr.$name = name;\n      return ref(this.add(Expression(params2)));\n    },\n    addBinding(name, bind2) {\n      if (!this.bindings) {\n        error(\"Nested signals do not support binding: \" + $(name));\n      }\n      this.bindings.push(extend$1({\n        signal: name\n      }, bind2));\n    },\n    // ----\n    addScaleProj(name, transform2) {\n      if (has$1(this.scales, name)) {\n        error(\"Duplicate scale or projection name: \" + $(name));\n      }\n      this.scales[name] = this.add(transform2);\n    },\n    addScale(name, params2) {\n      this.addScaleProj(name, Scale(params2));\n    },\n    addProjection(name, params2) {\n      this.addScaleProj(name, Projection(params2));\n    },\n    getScale(name) {\n      if (!this.scales[name]) {\n        error(\"Unrecognized scale name: \" + $(name));\n      }\n      return this.scales[name];\n    },\n    scaleRef(name) {\n      return ref(this.getScale(name));\n    },\n    scaleType(name) {\n      return this.getScale(name).params.type;\n    },\n    projectionRef(name) {\n      return this.scaleRef(name);\n    },\n    projectionType(name) {\n      return this.scaleType(name);\n    },\n    // ----\n    addData(name, dataScope) {\n      if (has$1(this.data, name)) {\n        error(\"Duplicate data set name: \" + $(name));\n      }\n      return this.data[name] = dataScope;\n    },\n    getData(name) {\n      if (!this.data[name]) {\n        error(\"Undefined data set name: \" + $(name));\n      }\n      return this.data[name];\n    },\n    addDataPipeline(name, entries) {\n      if (has$1(this.data, name)) {\n        error(\"Duplicate data set name: \" + $(name));\n      }\n      return this.addData(name, DataScope$1.fromEntries(this, entries));\n    }\n  };\n  function propertyLambda(spec) {\n    return (isArray(spec) ? arrayLambda : objectLambda)(spec);\n  }\n  function arrayLambda(array2) {\n    const n = array2.length;\n    let code = \"[\";\n    for (let i = 0; i < n; ++i) {\n      const value2 = array2[i];\n      code += (i > 0 ? \",\" : \"\") + (isObject$1(value2) ? value2.signal || propertyLambda(value2) : $(value2));\n    }\n    return code + \"]\";\n  }\n  function objectLambda(obj2) {\n    let code = \"{\", i = 0, key2, value2;\n    for (key2 in obj2) {\n      value2 = obj2[key2];\n      code += (++i > 1 ? \",\" : \"\") + $(key2) + \":\" + (isObject$1(value2) ? value2.signal || propertyLambda(value2) : $(value2));\n    }\n    return code + \"}\";\n  }\n  function defaults$1() {\n    const defaultFont = \"sans-serif\", defaultSymbolSize = 30, defaultStrokeWidth = 2, defaultColor = \"#4c78a8\", black = \"#000\", gray = \"#888\", lightGray = \"#ddd\";\n    return {\n      // default visualization description\n      description: \"Vega visualization\",\n      // default padding around visualization\n      padding: 0,\n      // default for automatic sizing; options: 'none', 'pad', 'fit'\n      // or provide an object (e.g., {'type': 'pad', 'resize': true})\n      autosize: \"pad\",\n      // default view background color\n      // covers the entire view component\n      background: null,\n      // default event handling configuration\n      // preventDefault for view-sourced event types except 'wheel'\n      events: {\n        defaults: {\n          allow: [\"wheel\"]\n        }\n      },\n      // defaults for top-level group marks\n      // accepts mark properties (fill, stroke, etc)\n      // covers the data rectangle within group width/height\n      group: null,\n      // defaults for basic mark types\n      // each subset accepts mark properties (fill, stroke, etc)\n      mark: null,\n      arc: {\n        fill: defaultColor\n      },\n      area: {\n        fill: defaultColor\n      },\n      image: null,\n      line: {\n        stroke: defaultColor,\n        strokeWidth: defaultStrokeWidth\n      },\n      path: {\n        stroke: defaultColor\n      },\n      rect: {\n        fill: defaultColor\n      },\n      rule: {\n        stroke: black\n      },\n      shape: {\n        stroke: defaultColor\n      },\n      symbol: {\n        fill: defaultColor,\n        size: 64\n      },\n      text: {\n        fill: black,\n        font: defaultFont,\n        fontSize: 11\n      },\n      trail: {\n        fill: defaultColor,\n        size: defaultStrokeWidth\n      },\n      // style definitions\n      style: {\n        // axis & legend labels\n        \"guide-label\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 10\n        },\n        // axis & legend titles\n        \"guide-title\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 11,\n          fontWeight: \"bold\"\n        },\n        // headers, including chart title\n        \"group-title\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 13,\n          fontWeight: \"bold\"\n        },\n        // chart subtitle\n        \"group-subtitle\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 12\n        },\n        // defaults for styled point marks in Vega-Lite\n        point: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth,\n          shape: \"circle\"\n        },\n        circle: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth\n        },\n        square: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth,\n          shape: \"square\"\n        },\n        // defaults for styled group marks in Vega-Lite\n        cell: {\n          fill: \"transparent\",\n          stroke: lightGray\n        },\n        view: {\n          fill: \"transparent\"\n        }\n      },\n      // defaults for title\n      title: {\n        orient: \"top\",\n        anchor: \"middle\",\n        offset: 4,\n        subtitlePadding: 3\n      },\n      // defaults for axes\n      axis: {\n        minExtent: 0,\n        maxExtent: 200,\n        bandPosition: 0.5,\n        domain: true,\n        domainWidth: 1,\n        domainColor: gray,\n        grid: false,\n        gridWidth: 1,\n        gridColor: lightGray,\n        labels: true,\n        labelAngle: 0,\n        labelLimit: 180,\n        labelOffset: 0,\n        labelPadding: 2,\n        ticks: true,\n        tickColor: gray,\n        tickOffset: 0,\n        tickRound: true,\n        tickSize: 5,\n        tickWidth: 1,\n        titlePadding: 4\n      },\n      // correction for centering bias\n      axisBand: {\n        tickOffset: -0.5\n      },\n      // defaults for cartographic projection\n      projection: {\n        type: \"mercator\"\n      },\n      // defaults for legends\n      legend: {\n        orient: \"right\",\n        padding: 0,\n        gridAlign: \"each\",\n        columnPadding: 10,\n        rowPadding: 2,\n        symbolDirection: \"vertical\",\n        gradientDirection: \"vertical\",\n        gradientLength: 200,\n        gradientThickness: 16,\n        gradientStrokeColor: lightGray,\n        gradientStrokeWidth: 0,\n        gradientLabelOffset: 2,\n        labelAlign: \"left\",\n        labelBaseline: \"middle\",\n        labelLimit: 160,\n        labelOffset: 4,\n        labelOverlap: true,\n        symbolLimit: 30,\n        symbolType: \"circle\",\n        symbolSize: 100,\n        symbolOffset: 0,\n        symbolStrokeWidth: 1.5,\n        symbolBaseFillColor: \"transparent\",\n        symbolBaseStrokeColor: gray,\n        titleLimit: 180,\n        titleOrient: \"top\",\n        titlePadding: 5,\n        layout: {\n          offset: 18,\n          direction: \"horizontal\",\n          left: {\n            direction: \"vertical\"\n          },\n          right: {\n            direction: \"vertical\"\n          }\n        }\n      },\n      // defaults for scale ranges\n      range: {\n        category: {\n          scheme: \"tableau10\"\n        },\n        ordinal: {\n          scheme: \"blues\"\n        },\n        heatmap: {\n          scheme: \"yellowgreenblue\"\n        },\n        ramp: {\n          scheme: \"blues\"\n        },\n        diverging: {\n          scheme: \"blueorange\",\n          extent: [1, 0]\n        },\n        symbol: [\"circle\", \"square\", \"triangle-up\", \"cross\", \"diamond\", \"triangle-right\", \"triangle-down\", \"triangle-left\"]\n      }\n    };\n  }\n  function parse(spec, config, options) {\n    if (!isObject$1(spec)) {\n      error(\"Input Vega specification must be an object.\");\n    }\n    config = mergeConfig(defaults$1(), config, spec.config);\n    return parseView(spec, new Scope(config, options)).toRuntime();\n  }\n  var version$1 = \"6.2.0\";\n  extend$1(transforms, tx, vtx, encode$1, geo, force, label, tree, reg, voronoi, wordcloud, xf);\n  const version = version$1;\n  const vega$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Bounds,\n    CanvasHandler,\n    CanvasRenderer,\n    DATE,\n    DAY,\n    DAYOFYEAR,\n    Dataflow,\n    Debug,\n    DisallowedObjectProperties,\n    Error: Error$1,\n    EventStream,\n    Gradient: Gradient$1,\n    GroupItem,\n    HOURS,\n    Handler,\n    HybridHandler,\n    HybridRenderer,\n    Info,\n    Item,\n    MILLISECONDS,\n    MINUTES,\n    MONTH,\n    Marks,\n    MultiPulse,\n    None: None$2,\n    Operator,\n    Parameters,\n    Pulse,\n    QUARTER,\n    RenderType,\n    Renderer,\n    ResourceLoader,\n    SECONDS,\n    SVGHandler,\n    SVGRenderer,\n    SVGStringRenderer,\n    Scenegraph,\n    TIME_UNITS,\n    Transform,\n    View: View$1,\n    WEEK,\n    Warn,\n    YEAR,\n    accessor,\n    accessorFields,\n    accessorName,\n    array: array$5,\n    ascending: ascending$2,\n    bandwidthNRD: estimateBandwidth,\n    bin,\n    bootstrapCI,\n    boundClip,\n    boundContext,\n    boundItem: boundItem$1,\n    boundMark,\n    boundStroke,\n    changeset,\n    clampRange,\n    codegenExpression: codegen,\n    compare: compare$2,\n    constant: constant$5,\n    cumulativeLogNormal,\n    cumulativeNormal,\n    cumulativeUniform,\n    dayofyear,\n    debounce: debounce$1,\n    defaultLocale,\n    definition: definition$1,\n    densityLogNormal,\n    densityNormal,\n    densityUniform,\n    domChild,\n    domClear,\n    domCreate,\n    domFind,\n    dotbin,\n    error,\n    expressionFunction,\n    extend: extend$1,\n    extent,\n    extentIndex,\n    falsy,\n    fastmap,\n    field: field$1,\n    flush,\n    font,\n    fontFamily,\n    fontSize,\n    format: format$2,\n    formatLocale: numberFormatDefaultLocale,\n    formats: formats$1,\n    hasOwnProperty: has$1,\n    id,\n    identity: identity$7,\n    inferType,\n    inferTypes,\n    ingest: ingest$1,\n    inherits,\n    inrange,\n    interpolate,\n    interpolateColors,\n    interpolateRange,\n    intersect: intersect$2,\n    intersectBoxLine,\n    intersectPath,\n    intersectPoint,\n    intersectRule,\n    isArray,\n    isBoolean: isBoolean$1,\n    isDate: isDate$1,\n    isFunction,\n    isIterable,\n    isNumber: isNumber$1,\n    isObject: isObject$1,\n    isRegExp,\n    isString,\n    isTuple,\n    key: key$2,\n    lerp: lerp$1,\n    lineHeight,\n    loader,\n    locale,\n    logger,\n    lruCache,\n    markup,\n    merge: merge$3,\n    mergeConfig,\n    multiLineOffset,\n    one: one$2,\n    pad: pad$2,\n    panLinear,\n    panLog,\n    panPow,\n    panSymlog,\n    parse,\n    parseExpression: parser$1,\n    parseSelector: eventSelector,\n    path: path$3,\n    pathCurves: curves,\n    pathEqual,\n    pathParse: parse$3,\n    pathRectangle: vg_rect,\n    pathRender,\n    pathSymbols: symbols,\n    pathTrail: vg_trail,\n    peek: peek$1,\n    point,\n    projection,\n    quantileLogNormal,\n    quantileNormal,\n    quantileUniform,\n    quantiles,\n    quantizeInterpolator,\n    quarter,\n    quartiles,\n    get random() {\n      return random;\n    },\n    randomInteger: integer,\n    randomKDE: kde,\n    randomLCG: lcg$2,\n    randomLogNormal: lognormal,\n    randomMixture: mixture$1,\n    randomNormal: gaussian,\n    randomUniform: uniform,\n    read,\n    regressionConstant: constant$4,\n    regressionExp: exp$1,\n    regressionLinear: linear$2,\n    regressionLoess: loess,\n    regressionLog: log$3,\n    regressionPoly: poly,\n    regressionPow: pow$3,\n    regressionQuad: quad,\n    renderModule,\n    repeat,\n    resetDefaultLocale,\n    resetSVGDefIds,\n    responseType,\n    runtimeContext: context,\n    sampleCurve,\n    sampleLogNormal,\n    sampleNormal,\n    sampleUniform,\n    scale: scale$6,\n    sceneEqual,\n    sceneFromJSON,\n    scenePickVisit: pickVisit,\n    sceneToJSON,\n    sceneVisit: visit,\n    sceneZOrder: zorder,\n    scheme,\n    serializeXML,\n    setHybridRendererOptions,\n    setRandom,\n    span,\n    splitAccessPath,\n    stringValue: $,\n    textMetrics,\n    timeBin: bin$1,\n    timeFloor,\n    timeFormatLocale: timeFormatDefaultLocale,\n    timeInterval,\n    timeOffset,\n    timeSequence,\n    timeUnitSpecifier,\n    timeUnits,\n    toBoolean,\n    toDate,\n    toNumber,\n    toSet,\n    toString,\n    transform: transform$2,\n    transforms,\n    truncate: truncate$1,\n    truthy,\n    tupleid,\n    typeParsers,\n    utcFloor,\n    utcInterval,\n    utcOffset,\n    utcSequence,\n    utcdayofyear,\n    utcquarter,\n    utcweek,\n    version,\n    visitArray,\n    week,\n    writeConfig,\n    zero: zero$3,\n    zoomLinear,\n    zoomLog,\n    zoomPow,\n    zoomSymlog\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const FieldNames = {\n    Active: \"__SandDance__Active\",\n    Collapsed: \"__SandDance__Collapsed\",\n    Contains: \"__SandDance__Contains\",\n    Count: \"__SandDance__Count\",\n    Sum: \"__SandDance__Sum\",\n    SumOfCount: \"__SandDance__CountSum\",\n    SumOfSum: \"__SandDance__SumSum\",\n    Selected: \"__SandDance__Selected\",\n    First: \"__SandDance__First\",\n    Last: \"__SandDance__Last\",\n    Top: \"__SandDance__Top\",\n    TopColor: \"__SandDance__TopColor\",\n    TopIndex: \"__SandDance__TopIndex\",\n    PowerBISelectionId: \"__SandDance__PowerBISelectionId\",\n    FacetSearch: \"__SandDance__FacetSearch\",\n    FacetTitle: \"__SandDance__FacetTitle\",\n    Ordinal: \"__SandDance__Ordinal\",\n    WrapCol: \"__SandDance__WrapCol\",\n    WrapRow: \"__SandDance__WrapRow\",\n    Value: \"__SandDance__Value\",\n    OffsetX: \"__SandDance__X\",\n    OffsetY: \"__SandDance__Y\",\n    OffsetHeight: \"__SandDance__H\",\n    OffsetWidth: \"__SandDance__W\"\n  };\n  const ScaleNames = {\n    Color: \"scale_color\"\n  };\n  const SignalNames = {\n    ViewportWidth: \"ViewportWidth\",\n    ViewportHeight: \"ViewportHeight\",\n    MinCellWidth: \"MinCellWidth\",\n    MinCellHeight: \"MinCellHeight\",\n    PlotOffsetLeft: \"PlotOffsetLeft\",\n    PlotOffsetTop: \"PlotOffsetTop\",\n    PlotOffsetBottom: \"PlotOffsetBottom\",\n    PlotOffsetRight: \"PlotOffsetRight\",\n    PlotHeightIn: \"PlotHeightIn\",\n    PlotWidthIn: \"PlotWidthIn\",\n    PlotHeightOut: \"PlotHeightOut\",\n    PlotWidthOut: \"PlotWidthOut\",\n    ColorBinCount: \"RoleColor_BinCountSignal\",\n    ColorReverse: \"RoleColor_ReverseSignal\",\n    FacetAxesAdjustX: \"RoleFacet_AxesAdjustSignalX\",\n    FacetAxesAdjustY: \"RoleFacet_AxesAdjustSignalY\",\n    FacetBins: \"RoleFacet_BinsSignal\",\n    FacetVBins: \"RoleFacetV_BinsSignal\",\n    FacetPaddingTop: \"FacetPaddingTop\",\n    FacetPaddingBottom: \"FacetPaddingBottom\",\n    FacetPaddingLeft: \"FacetPaddingLeft\",\n    MarkOpacity: \"Mark_OpacitySignal\",\n    PointScale: \"Chart_PointScaleSignal\",\n    TextAngleX: \"Text_AngleXSignal\",\n    TextAngleY: \"Text_AngleYSignal\",\n    TextScale: \"Text_ScaleSignal\",\n    TextSize: \"Text_SizeSignal\",\n    TextTitleSize: \"Text_TitleSizeSignal\",\n    TreeMapMethod: \"Chart_TreeMapMethodSignal\",\n    XBins: \"RoleX_BinsSignal\",\n    YBins: \"RoleY_BinsSignal\",\n    ZHeight: \"RoleZ_HeightSignal\",\n    ZGrounded: \"RoleZ_Grounded\",\n    ZProportion: \"RoleZ_ProportionSignal\"\n  };\n  const Other = \"__Other\";\n  const ColorScaleNone = \"none\";\n  const defaultBins = 10;\n  const maxbins = 100;\n  const minBarBandWidth = 15;\n  const minFacetWidth = 140;\n  const minFacetHeight = 180;\n  const facetPaddingLeft = 40;\n  const facetPaddingTop = 40;\n  const facetPaddingBottom = 40;\n  const facetPaddingRight = 40;\n  const axesLabelLimit = 100;\n  const axesTitleLimit = 100;\n  const axesTitlePaddingX = 30;\n  const axesTitlePaddingY = 60;\n  const axesTitlePaddingFacetX = 69;\n  const axesTitlePaddingFacetY = 92;\n  const axesOffsetX = 120;\n  const axesOffsetY = 120;\n  const scatterSizedDiv = 20;\n  const debounce = 250;\n  function allowNoneForSize(specContext) {\n    switch (specContext.insight.totalStyle) {\n      case \"sum-strip\":\n      case \"sum-strip-percent\":\n      case \"sum-treemap\":\n        return false;\n      default:\n        return true;\n    }\n  }\n  function barchartH(specContext) {\n    var _a, _b, _c, _d;\n    const { insight: insight2, specColumns, specViewOptions } = specContext;\n    const { language } = specViewOptions;\n    const showAxes = !insight2.hideAxes;\n    const bandProps = {\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes\n    };\n    const x2 = { title: null };\n    const axisScales = {\n      x: x2,\n      y: { title: (_a = specColumns.y) === null || _a === void 0 ? void 0 : _a.name },\n      z: { title: (_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.name }\n    };\n    const layouts = [{\n      layoutType: \"Band\",\n      props: bandProps\n    }];\n    const { totalStyle, view } = insight2;\n    if (totalStyle === \"sum-strip-percent\") {\n      x2.aggregate = \"percent\";\n      x2.title = language.percent;\n      const stripProps = {\n        addPercentageScale: true,\n        sortOrder: \"ascending\",\n        orientation: \"horizontal\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes,\n        view\n      };\n      layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n      });\n    } else {\n      const aggProps = {\n        niceScale: true,\n        dock: \"left\",\n        globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n        globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n        sumBy: specColumns.size,\n        showAxes\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props: aggProps\n      });\n      switch (totalStyle) {\n        case \"sum-treemap\": {\n          x2.aggregate = \"sum\";\n          x2.title = language.sum;\n          const treemapProps = {\n            corner: \"top-left\",\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Treemap\",\n            props: treemapProps\n          });\n          break;\n        }\n        case \"sum-strip\": {\n          x2.aggregate = \"sum\";\n          x2.title = language.sum;\n          const stripProps = {\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        case \"count-strip\": {\n          x2.aggregate = \"count\";\n          x2.title = language.count;\n          const stripProps = {\n            sortOrder: \"ascending\",\n            orientation: \"horizontal\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        default: {\n          x2.aggregate = \"count\";\n          x2.title = language.count;\n          const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: \"down-right\",\n            z: specColumns.z,\n            maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n            maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Square\",\n            props: squareProps\n          });\n          break;\n        }\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: true,\n        percentage: true,\n        roles: [\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_c = specColumns.y) === null || _c === void 0 ? void 0 : _c.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_d = specColumns.z) === null || _d === void 0 ? void 0 : _d.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function barchartV(specContext) {\n    var _a, _b;\n    const { insight: insight2, specColumns, specViewOptions } = specContext;\n    const { language } = specViewOptions;\n    const showAxes = !insight2.hideAxes;\n    const bandProps = {\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes\n    };\n    const y2 = { title: null };\n    const axisScales = {\n      x: { title: specColumns.x && specColumns.x.name },\n      y: y2,\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [{\n      layoutType: \"Band\",\n      props: bandProps\n    }];\n    const { totalStyle, view } = insight2;\n    if (totalStyle === \"sum-strip-percent\") {\n      y2.aggregate = \"percent\";\n      y2.title = language.percent;\n      const stripProps = {\n        addPercentageScale: true,\n        sortOrder: \"descending\",\n        orientation: \"vertical\",\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes,\n        view\n      };\n      layouts.push({\n        layoutType: \"Strip\",\n        props: stripProps\n      });\n    } else {\n      const aggProps = {\n        niceScale: true,\n        dock: \"bottom\",\n        globalAggregateMaxExtentSignal: \"aggMaxExtent\",\n        globalAggregateMaxExtentScaledSignal: \"aggMaxExtentScaled\",\n        sumBy: specColumns.size,\n        showAxes\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props: aggProps\n      });\n      switch (totalStyle) {\n        case \"sum-treemap\": {\n          y2.aggregate = \"sum\";\n          y2.title = language.sum;\n          const treemapProps = {\n            corner: \"bottom-left\",\n            size: specColumns.size,\n            treeMapMethod: specViewOptions.language.treeMapMethod,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Treemap\",\n            props: treemapProps\n          });\n          break;\n        }\n        case \"sum-strip\": {\n          y2.aggregate = \"sum\";\n          y2.title = language.sum;\n          const stripProps = {\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        case \"count-strip\": {\n          y2.aggregate = \"count\";\n          y2.title = language.count;\n          const stripProps = {\n            sortOrder: \"descending\",\n            orientation: \"vertical\",\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Strip\",\n            props: stripProps\n          });\n          break;\n        }\n        default: {\n          y2.aggregate = \"count\";\n          y2.title = language.count;\n          const squareProps = {\n            sortBy: specColumns.sort,\n            fillDirection: \"right-up\",\n            z: specColumns.z,\n            maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n            maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n            showAxes,\n            view\n          };\n          layouts.push({\n            layoutType: \"Square\",\n            props: squareProps\n          });\n          break;\n        }\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: true,\n        percentage: true,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_b = specColumns.z) === null || _b === void 0 ? void 0 : _b.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function density(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n    const { insight: insight2, specColumns, specViewOptions } = specContext;\n    const axisScales = {\n      x: { title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name },\n      y: { title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name },\n      z: { title: (_c = specColumns.z) === null || _c === void 0 ? void 0 : _c.name }\n    };\n    const backgroundImage = ((_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.quantitative) && ((_f = insight2.backgroundImage) === null || _f === void 0 ? void 0 : _f.extents) && insight2.backgroundImage;\n    const showAxes = !(backgroundImage || insight2.hideAxes);\n    const hBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom }\n    };\n    const vBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left }\n    };\n    const aggProps = {\n      onBuild: null,\n      aggregation: null,\n      sumBy: specColumns.size\n    };\n    const layouts = [\n      {\n        layoutType: \"Band\",\n        props: vBandProps\n      },\n      {\n        layoutType: \"Band\",\n        props: hBandProps\n      },\n      {\n        layoutType: \"AggregateSquare\",\n        props: aggProps\n      }\n    ];\n    const { totalStyle, view } = insight2;\n    switch (totalStyle) {\n      case \"sum-treemap\": {\n        aggProps.aggregation = \"sum\";\n        const treemapProps = {\n          corner: \"bottom-left\",\n          size: specColumns.size,\n          treeMapMethod: specViewOptions.language.treeMapMethod,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Treemap\",\n          props: treemapProps\n        });\n        break;\n      }\n      case \"sum-strip\": {\n        aggProps.aggregation = \"sum\";\n        const stripProps = {\n          sortOrder: \"ascending\",\n          orientation: \"vertical\",\n          size: specColumns.size,\n          sort: specColumns.sort,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Strip\",\n          props: stripProps\n        });\n        break;\n      }\n      case \"count-strip\": {\n        aggProps.aggregation = \"count\";\n        const stripProps = {\n          sortOrder: \"ascending\",\n          orientation: \"vertical\",\n          sort: specColumns.sort,\n          z: specColumns.z,\n          showAxes,\n          view\n        };\n        layouts.push({\n          layoutType: \"Strip\",\n          props: stripProps\n        });\n        break;\n      }\n      default: {\n        aggProps.aggregation = \"count\";\n        const squareProps = {\n          sortBy: specColumns.sort,\n          fillDirection: \"right-down\",\n          z: specColumns.z,\n          maxGroupedUnits: null,\n          maxGroupedFillSize: null,\n          showAxes,\n          view\n        };\n        aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled) => {\n          squareProps.maxGroupedUnits = aggMaxExtent;\n          squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n        };\n        layouts.push({\n          layoutType: \"Square\",\n          props: squareProps\n        });\n        break;\n      }\n    }\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: true,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            allowNone: allowNoneForSize,\n            excludeCategoric: true,\n            signals: [SignalNames.TreeMapMethod]\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function grid(specContext) {\n    var _a;\n    const { insight: insight2, specColumns } = specContext;\n    const { view } = insight2;\n    const squareProps = {\n      sortBy: specColumns.sort,\n      fillDirection: \"right-down\",\n      z: specColumns.z,\n      collapseYHeight: true,\n      showAxes: !insight2.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    return {\n      axisScales,\n      layouts: [\n        {\n          layoutType: \"Square\",\n          props: squareProps\n        }\n      ],\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"z\",\n            axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function scatterplot(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _j;\n    const { insight: insight2, specColumns, specViewOptions } = specContext;\n    const backgroundImageExtents = ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative) && ((_c = insight2.backgroundImage) === null || _c === void 0 ? void 0 : _c.extents);\n    const scatterProps = {\n      x: specColumns.x,\n      y: specColumns.y,\n      z: specColumns.z,\n      size: specColumns.size,\n      scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n      zGrounded: specViewOptions.language.zGrounded,\n      backgroundImageExtents,\n      showAxes: !(backgroundImageExtents || insight2.hideAxes),\n      view: insight2.view\n    };\n    const axisScales = {\n      x: { title: (_d = specColumns.x) === null || _d === void 0 ? void 0 : _d.name },\n      y: { title: (_e = specColumns.y) === null || _e === void 0 ? void 0 : _e.name },\n      z: { title: (_f = specColumns.z) === null || _f === void 0 ? void 0 : _f.name }\n    };\n    return {\n      axisScales,\n      layouts: [\n        {\n          layoutType: \"Scatter\",\n          props: scatterProps\n        }\n      ],\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"x\",\n            axisSelection: ((_g = specColumns.x) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\"\n          },\n          {\n            role: \"y\",\n            axisSelection: ((_h = specColumns.y) === null || _h === void 0 ? void 0 : _h.quantitative) ? \"range\" : \"exact\"\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_j = specColumns.z) === null || _j === void 0 ? void 0 : _j.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: false\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"size\",\n            excludeCategoric: true,\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ],\n        signals: [SignalNames.PointScale, SignalNames.ZGrounded]\n      }\n    };\n  }\n  function stacks(specContext) {\n    var _a, _b, _c, _d, _e, _f, _g;\n    const { insight: insight2, specColumns, specViewOptions } = specContext;\n    const axisScales = {\n      x: { title: (_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.name },\n      y: { title: (_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.name },\n      z: { title: specViewOptions.language.count }\n    };\n    const backgroundImage = ((_c = specColumns.x) === null || _c === void 0 ? void 0 : _c.quantitative) && ((_d = specColumns.y) === null || _d === void 0 ? void 0 : _d.quantitative) && ((_e = insight2.backgroundImage) === null || _e === void 0 ? void 0 : _e.extents) && insight2.backgroundImage;\n    const showAxes = !(backgroundImage || insight2.hideAxes);\n    const hBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"horizontal\",\n      groupby: {\n        column: specColumns.y,\n        defaultBins,\n        maxbinsSignalName: SignalNames.YBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom }\n    };\n    const vBandProps = {\n      excludeEncodingRuleMap: true,\n      orientation: \"vertical\",\n      groupby: {\n        column: specColumns.x,\n        defaultBins,\n        maxbinsSignalName: SignalNames.XBins,\n        maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n        maxbins\n      },\n      minBandWidth: minBarBandWidth,\n      showAxes,\n      outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left }\n    };\n    const stackProps = {\n      sort: specColumns.sort,\n      showAxes\n    };\n    return {\n      axisScales,\n      customZScale: true,\n      layouts: [\n        {\n          layoutType: \"Band\",\n          props: vBandProps\n        },\n        {\n          layoutType: \"Band\",\n          props: hBandProps\n        },\n        {\n          layoutType: \"Stack\",\n          props: stackProps\n        }\n      ],\n      specCapabilities: {\n        backgroundImage: true,\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"x\",\n            binnable: true,\n            axisSelection: ((_f = specColumns.x) === null || _f === void 0 ? void 0 : _f.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.XBins]\n          },\n          {\n            role: \"y\",\n            binnable: true,\n            axisSelection: ((_g = specColumns.y) === null || _g === void 0 ? void 0 : _g.quantitative) ? \"range\" : \"exact\",\n            axisSelectionBetweenTicks: true,\n            signals: [SignalNames.YBins]\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function strips(specContext) {\n    var _a;\n    const { insight: insight2, specColumns } = specContext;\n    const { view } = insight2;\n    const stripProps = {\n      sortOrder: \"ascending\",\n      orientation: \"vertical\",\n      size: specColumns.size,\n      sort: specColumns.sort,\n      z: specColumns.z,\n      showAxes: !insight2.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n      axisScales.y = {\n        title: null,\n        aggregate: specColumns.size ? \"sum\" : \"count\"\n      };\n      const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n      const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n      const props = {\n        dock: \"top\",\n        niceScale: false,\n        globalAggregateMaxExtentScaledSignal,\n        globalAggregateMaxExtentSignal,\n        sumBy: specColumns.size,\n        showAxes: false\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props\n      });\n    }\n    layouts.push({\n      layoutType: \"Strip\",\n      props: stripProps\n    });\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"size\",\n            allowNone: true,\n            //size by none is a count\n            excludeCategoric: true\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"sort\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ]\n      }\n    };\n  }\n  function treemap(specContext) {\n    var _a;\n    const { insight: insight2, specColumns, specViewOptions } = specContext;\n    const { view } = insight2;\n    const treemapProps = {\n      corner: \"top-left\",\n      group: specColumns.group,\n      size: specColumns.size,\n      treeMapMethod: specViewOptions.language.treeMapMethod,\n      z: specColumns.z,\n      showAxes: !insight2.hideAxes,\n      view\n    };\n    const axisScales = {\n      z: { title: specColumns.z && specColumns.z.name }\n    };\n    const layouts = [];\n    if (specColumns.facet) {\n      axisScales.y = {\n        title: null,\n        aggregate: \"sum\"\n      };\n      const globalAggregateMaxExtentScaledSignal = \"globalAggregateMaxExtentScaledSignal\";\n      const globalAggregateMaxExtentSignal = \"globalAggregateMaxExtentSignal\";\n      const props = {\n        dock: \"top\",\n        niceScale: false,\n        globalAggregateMaxExtentScaledSignal,\n        globalAggregateMaxExtentSignal,\n        sumBy: specColumns.size,\n        showAxes: false\n      };\n      layouts.push({\n        layoutType: \"AggregateContainer\",\n        props\n      });\n    }\n    layouts.push({\n      layoutType: \"Treemap\",\n      props: treemapProps\n    });\n    return {\n      axisScales,\n      layouts,\n      specCapabilities: {\n        countsAndSums: false,\n        roles: [\n          {\n            role: \"size\",\n            excludeCategoric: true\n          },\n          {\n            role: \"group\",\n            allowNone: true\n          },\n          {\n            role: \"z\",\n            axisSelection: ((_a = specColumns.z) === null || _a === void 0 ? void 0 : _a.quantitative) ? \"range\" : \"exact\",\n            allowNone: true,\n            disabled: view === \"2d\"\n          },\n          {\n            role: \"color\",\n            allowNone: true\n          },\n          {\n            role: \"facet\",\n            allowNone: true,\n            signals: [SignalNames.FacetBins]\n          },\n          {\n            role: \"facetV\",\n            allowNone: true,\n            signals: [SignalNames.FacetVBins]\n          }\n        ],\n        signals: [SignalNames.TreeMapMethod]\n      }\n    };\n  }\n  function getFacetLayout(facetStyle, facetColumn, facetVColumn, axisTextColor) {\n    let layoutPair;\n    const groupby = facetColumn;\n    const plotPadding = {\n      x: 0,\n      y: 0\n    };\n    let facetPadding;\n    switch (facetStyle) {\n      case \"cross\": {\n        const props = {\n          axisTextColor,\n          colRowTitles: true,\n          groupbyX: groupby,\n          groupbyY: facetVColumn\n        };\n        layoutPair = {\n          layoutType: \"Cross\",\n          props\n        };\n        facetPadding = {\n          bottom: facetPaddingBottom,\n          left: facetPaddingLeft,\n          top: 0\n        };\n        plotPadding.y = facetPaddingTop;\n        plotPadding.x = facetPaddingRight;\n        break;\n      }\n      case \"wrap\":\n      default: {\n        const props = {\n          axisTextColor,\n          cellTitles: true,\n          groupby\n        };\n        layoutPair = {\n          layoutType: \"Wrap\",\n          props\n        };\n        facetPadding = {\n          bottom: facetPaddingBottom,\n          left: facetPaddingLeft,\n          top: facetPaddingTop\n        };\n        break;\n      }\n    }\n    const facetLayout = {\n      facetPadding,\n      plotPadding\n    };\n    return {\n      layoutPair,\n      facetLayout\n    };\n  }\n  const map = {\n    barchart: barchartV,\n    barchartH,\n    barchartV,\n    density,\n    grid,\n    scatterplot,\n    stacks,\n    strips,\n    treemap\n  };\n  function getSpecBuilderPropsForChart(specContext) {\n    const { insight: insight2, specColumns, specViewOptions } = specContext;\n    const fn2 = map[insight2.chart];\n    if (fn2) {\n      const props = fn2(specContext);\n      if (insight2.columns.facet) {\n        const discreteFacetColumn = {\n          column: specColumns.facet,\n          defaultBins,\n          maxbins,\n          maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n          maxbinsSignalName: SignalNames.FacetBins\n        };\n        const discreteFacetVColumn = {\n          column: specColumns.facetV,\n          defaultBins,\n          maxbins,\n          maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n          maxbinsSignalName: SignalNames.FacetVBins\n        };\n        const { facetLayout, layoutPair } = getFacetLayout(insight2.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n        props.layouts.unshift(layoutPair);\n        props.facetLayout = facetLayout;\n        props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n      }\n      return props;\n    }\n  }\n  function isColor(cssColorSpecifier) {\n    return !!color$2(cssColorSpecifier);\n  }\n  function checkIsColorData(data2, column) {\n    if (!column.stats.hasColorData) {\n      column.isColorData = false;\n      return;\n    }\n    for (let i = 0; i < data2.length; i++) {\n      if (!isColor(data2[i][column.name])) {\n        column.isColorData = false;\n        return;\n      }\n    }\n    column.isColorData = true;\n  }\n  function isQuantitative(column) {\n    return column.type === \"number\" || column.type === \"integer\";\n  }\n  function detectNegative(columnName, data2) {\n    for (let i = 1; i < data2.length; i++) {\n      const value2 = columnName == null ? data2[i] : data2[i][columnName];\n      if (value2 < 0)\n        return true;\n    }\n    return false;\n  }\n  function detectSequentialColumn(columnName, data2) {\n    if (data2.length < 2)\n      return false;\n    for (let i = 1; i < data2.length; i++) {\n      const curr = columnName == null ? data2[i] : data2[i][columnName];\n      const prev = columnName == null ? data2[i - 1] : data2[i - 1][columnName];\n      if (curr !== prev + 1)\n        return false;\n    }\n    return true;\n  }\n  function getStats(data2, ...args) {\n    let columnName;\n    let columnType;\n    let columnQuantitative;\n    let distinctValuesCallback;\n    if (args.length <= 2) {\n      const column = args[0];\n      columnName = column.name;\n      columnType = column.type;\n      columnQuantitative = column.quantitative;\n      distinctValuesCallback = args[1];\n    } else {\n      columnName = args[0];\n      columnType = args[1];\n      columnQuantitative = args[2];\n      distinctValuesCallback = args[3];\n    }\n    const distinctMap = {};\n    const stats = {\n      nonNull: 0,\n      distinctValueCount: null,\n      max: null,\n      mean: null,\n      min: null\n    };\n    const columnIsString = columnType === \"string\";\n    let sum2 = 0;\n    for (let i = 0; i < data2.length; i++) {\n      const row = data2[i];\n      const value2 = columnName == null ? row : row[columnName];\n      if (columnIsString) {\n        if (value2 !== \"\") {\n          stats.nonNull++;\n        }\n      } else if (value2 != null) {\n        stats.nonNull++;\n      }\n      const num = +value2;\n      distinctMap[value2] = true;\n      if (!isNaN(num)) {\n        if (stats.max === null || num > stats.max) {\n          stats.max = num;\n        }\n        if (stats.min === null || num < stats.min) {\n          stats.min = num;\n        }\n        sum2 += num;\n      }\n      if ((columnType === \"date\" || columnIsString) && !stats.hasColorData && isColor(value2)) {\n        stats.hasColorData = true;\n      }\n    }\n    if (columnQuantitative) {\n      stats.mean = data2.length > 0 && sum2 / data2.length;\n      stats.hasNegative = detectNegative(columnName, data2);\n      if (columnType === \"integer\") {\n        stats.isSequential = detectSequentialColumn(columnName, data2);\n      }\n    }\n    const distinctValues = Object.keys(distinctMap);\n    if (distinctValuesCallback) {\n      distinctValues.sort();\n      distinctValuesCallback(distinctValues);\n    }\n    stats.distinctValueCount = distinctValues.length;\n    return stats;\n  }\n  function getColumnsFromData(inferTypesFn, data2, columnTypes) {\n    const sample = data2[0];\n    const fields = sample ? Object.keys(sample) : [];\n    const inferences = Object.assign(Object.assign({}, inferTypesFn(data2, fields)), columnTypes);\n    const columns = fields.map((name) => {\n      const column = {\n        name,\n        type: inferences[name]\n      };\n      return column;\n    });\n    inferAll(columns, data2);\n    return columns;\n  }\n  function inferAll(columns, data2) {\n    columns.forEach((column) => {\n      if (column) {\n        if (typeof column.quantitative !== \"boolean\") {\n          column.quantitative = isQuantitative(column);\n        }\n        if (!column.stats) {\n          column.stats = getStats(data2, column);\n        }\n        if ((column.type === \"date\" || column.type === \"string\") && typeof column.isColorData !== \"boolean\") {\n          checkIsColorData(data2, column);\n        }\n      }\n    });\n  }\n  let Table$2 = class Table {\n    constructor(columns, rows, maxWidth = 80, underlineHeaders = false, align = \"right\") {\n      this.columns = columns;\n      this.rows = rows;\n      this.maxWidth = maxWidth;\n      this.underlineHeaders = underlineHeaders;\n      this.align = align;\n      this.columnWidths = this.columns.map((col, idx) => Math.max(col.length, ...this.rows.map((row) => {\n        var _a;\n        return ((_a = row[idx]) === null || _a === void 0 ? void 0 : _a.length) || 0;\n      })));\n    }\n    createSpaces(num) {\n      return \" \".repeat(num);\n    }\n    groupColumns() {\n      let cumulativeWidth = 0;\n      const columnGroups = [];\n      let currentGroup = [];\n      this.columns.forEach((col, idx) => {\n        const columnSpace = this.columnWidths[idx] + 1;\n        if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n          columnGroups.push(currentGroup);\n          cumulativeWidth = columnSpace;\n          currentGroup = [col];\n        } else {\n          cumulativeWidth += columnSpace;\n          currentGroup.push(col);\n        }\n      });\n      if (currentGroup.length > 0) {\n        columnGroups.push(currentGroup);\n      }\n      return columnGroups;\n    }\n    formatRow(row, group2) {\n      return group2.map((col) => {\n        const idx = this.columns.indexOf(col);\n        const cellValue = row[idx] == null ? \"\" : row[idx].toString();\n        return this.align === \"right\" ? cellValue.padStart(this.columnWidths[idx], \" \") : cellValue.padEnd(this.columnWidths[idx], \" \");\n      }).join(this.createSpaces(1));\n    }\n    formatHeader(group2) {\n      return group2.map((col) => {\n        const idx = this.columns.indexOf(col);\n        return this.align === \"right\" ? col.padStart(this.columnWidths[idx], \" \") : col.padEnd(this.columnWidths[idx], \" \");\n      }).join(this.createSpaces(1));\n    }\n    underlineHeader(group2) {\n      return group2.map((col) => \"-\".repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n    }\n    render() {\n      const output2 = [];\n      const columnGroups = this.groupColumns();\n      columnGroups.forEach((group2, groupIndex) => {\n        const headerRow = this.formatHeader(group2);\n        let section = headerRow + (groupIndex < columnGroups.length - 1 ? \" \\\\\" : \"\") + \"\\n\";\n        if (this.underlineHeaders) {\n          section += this.underlineHeader(group2) + \"\\n\";\n        }\n        this.rows.forEach((row) => {\n          section += this.formatRow(row, group2) + \"\\n\";\n        });\n        output2.push(section);\n        if (groupIndex < columnGroups.length - 1) {\n          output2.push(\"\\n\");\n        }\n      });\n      return output2.join(\"\");\n    }\n  };\n  var pandasSimulation;\n  (function(pandasSimulation2) {\n    const typeMapping = {\n      boolean: \"bool\",\n      number: \"float64\",\n      // Assuming 'number' is used for floating-point numbers\n      date: \"datetime64[ns]\",\n      string: \"object\",\n      integer: \"int64\"\n    };\n    function head(columns, data2, maxWidth = 80) {\n      const numRows = 5;\n      const top = data2.slice(0, numRows);\n      const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n      const columnNames = [\"\"].concat(columns.map((col) => col.name));\n      const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map((col) => {\n        var _a;\n        return ((_a = row[col.name]) === null || _a === void 0 ? void 0 : _a.toString()) || \"\";\n      })));\n      const table = new Table$2(columnNames, rows, maxWidth, false, \"right\");\n      return table.render();\n    }\n    pandasSimulation2.head = head;\n    function info2(columns, data2, maxWidth = 80) {\n      const numRows = data2.length;\n      const output2 = [];\n      output2.push(\"<class 'pandas.core.frame.DataFrame'>\");\n      output2.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n      output2.push(`Data columns (total ${columns.length} columns):\n`);\n      const columnHeaders = [\"#\", \"Column\", \"Non-Null Count\", \"Dtype\"];\n      const rows = columns.map((col, idx) => {\n        const nonNullCount = col.stats.nonNull.toString();\n        const dtype = typeMapping[col.type] || \"unknown\";\n        return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n      });\n      const table = new Table$2(columnHeaders, rows, maxWidth, true, \"left\");\n      output2.push(table.render());\n      const memoryUsage = columns.reduce((total, col) => {\n        var _a;\n        const exampleValue = (_a = data2.find((row) => row[col.name] != null)) === null || _a === void 0 ? void 0 : _a[col.name];\n        if (exampleValue == null)\n          return total;\n        const size2 = new Blob([exampleValue.toString()]).size;\n        return total + size2 * numRows;\n      }, 0);\n      output2.push(`\ndtypes: ${columns.filter((col) => col.type === \"number\").length} float64, ${columns.filter((col) => col.type === \"integer\").length} int64, ${columns.filter((col) => col.type === \"string\").length} object`);\n      output2.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n      return output2.join(\"\\n\");\n    }\n    pandasSimulation2.info = info2;\n  })(pandasSimulation || (pandasSimulation = {}));\n  function getSpecColumns(insight2, columns) {\n    function getColumnByName(name) {\n      return columns.filter((c2) => c2.name === name)[0];\n    }\n    return {\n      color: getColumnByName(insight2.columns && insight2.columns.color),\n      facet: getColumnByName(insight2.columns && insight2.columns.facet),\n      facetV: getColumnByName(insight2.columns && insight2.columns.facetV),\n      group: getColumnByName(insight2.columns && insight2.columns.group),\n      size: getColumnByName(insight2.columns && insight2.columns.size),\n      sort: getColumnByName(insight2.columns && insight2.columns.sort),\n      uid: getColumnByName(insight2.columns && insight2.columns.uid),\n      x: getColumnByName(insight2.columns && insight2.columns.x),\n      y: getColumnByName(insight2.columns && insight2.columns.y),\n      z: getColumnByName(insight2.columns && insight2.columns.z)\n    };\n  }\n  function addAxes(scope, ...axes) {\n    if (!axes || !axes.length)\n      return;\n    if (!scope.axes)\n      scope.axes = [];\n    scope.axes.push(...axes.filter(Boolean));\n  }\n  function addData(scope, ...datas) {\n    if (!datas || !datas.length)\n      return;\n    if (!scope.data)\n      scope.data = [];\n    scope.data.push(...datas.filter(Boolean));\n  }\n  function addMarks(scope, ...marks) {\n    if (!marks || !marks.length)\n      return;\n    if (!scope.marks)\n      scope.marks = [];\n    scope.marks.push(...marks.filter(Boolean));\n  }\n  function addScales(scope, ...scales2) {\n    if (!scales2 || !scales2.length)\n      return;\n    if (!scope.scales)\n      scope.scales = [];\n    scope.scales.push(...scales2.filter(Boolean));\n  }\n  function addSignals(scope, ...signals) {\n    if (!signals || !signals.length)\n      return;\n    if (!scope.signals)\n      scope.signals = [];\n    scope.signals.push(...signals.filter(Boolean));\n  }\n  function addTransforms(data2, ...transforms2) {\n    if (!transforms2 || !transforms2.length)\n      return;\n    if (!data2.transform)\n      data2.transform = [];\n    data2.transform.push(...transforms2.filter(Boolean));\n  }\n  function getDataByName(data2, dataName) {\n    for (let i = 0; i < data2.length; i++) {\n      if (data2[i].name === dataName)\n        return { data: data2[i], index: i };\n    }\n  }\n  function getGroupBy(groupings) {\n    const groupby = groupings.map((g) => g.groupby);\n    return groupby.reduce((acc, val) => acc.concat(val), []);\n  }\n  function addOffsets(...offsets2) {\n    return offsets2.filter(Boolean).join(\" + \");\n  }\n  function addGlobalAxes(props) {\n    const { axesOffsets, axisScales, axesScopes, axesTitlePadding, allGlobalScales, globalScope, labelBaseline, plotOffsetSignals, specColumns, specViewOptions } = props;\n    const { scope } = globalScope;\n    allGlobalScales.forEach((globalScales) => {\n      const { scales: scales2 } = globalScales;\n      for (const xyz in scales2) {\n        const _scales = scales2[xyz];\n        if (_scales) {\n          addScales(scope, ..._scales);\n          let { showAxes } = globalScales;\n          let zindex = void 0;\n          if (xyz === \"z\") {\n            showAxes = false;\n            if (props.view === \"3d\" && specViewOptions.zAxisOptions && !props.hideZAxis) {\n              if (specViewOptions.zAxisOptions.showZAxis) {\n                showAxes = true;\n                zindex = specViewOptions.zAxisOptions.zIndex;\n              }\n            }\n          }\n          if (showAxes && axisScales) {\n            const axisScale = axisScales[xyz];\n            if (axisScale) {\n              const lineColor = specViewOptions.colors.axisLine;\n              const horizontal = xyz === \"x\";\n              const column = specColumns[xyz] || { quantitative: true };\n              const title = axisScale.title;\n              const props2 = {\n                title,\n                horizontal,\n                column,\n                specViewOptions,\n                lineColor,\n                titlePadding: axesTitlePadding[xyz],\n                labelBaseline: labelBaseline[xyz],\n                zindex\n              };\n              axesScopes[\"main\"].forEach((a2) => addAxes(a2.scope, createAxis(Object.assign(Object.assign({}, props2), { scale: a2.scale || _scales[0], showTitle: a2.title, showLabels: a2.labels, showLines: a2.lines }))));\n              if (axesScopes[xyz]) {\n                axesScopes[xyz].forEach((a2) => addAxes(a2.scope, createAxis(Object.assign(Object.assign({}, props2), { scale: a2.scale || _scales[0], showTitle: a2.title, showLabels: a2.labels, showLines: a2.lines }))));\n              }\n              if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                const plotOffsetSignal = plotOffsetSignals[xyz];\n                plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n              }\n            }\n          }\n        }\n      }\n    });\n  }\n  function createAxis(props) {\n    const { column, horizontal, labelBaseline, lineColor, scale: scale2, showLabels, showTitle, showLines, specViewOptions, title, titlePadding, zindex } = props;\n    const axis = Object.assign(Object.assign(Object.assign(Object.assign({ zindex, scale: scale2.name, orient: horizontal ? \"bottom\" : \"left\", domain: showLines, ticks: showLines }, showLines && {\n      domainColor: lineColor,\n      tickColor: lineColor,\n      tickSize: specViewOptions.tickSize\n    }), showTitle && {\n      title,\n      titleAlign: horizontal ? \"left\" : \"right\",\n      titleAngle: {\n        signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY\n      },\n      titleColor: specViewOptions.colors.axisText,\n      titleFontSize: {\n        signal: SignalNames.TextTitleSize\n      },\n      titleLimit: axesTitleLimit,\n      titlePadding\n    }), { labels: showLabels }), showLabels && {\n      labelAlign: horizontal ? \"left\" : \"right\",\n      labelBaseline,\n      labelAngle: {\n        signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY\n      },\n      labelColor: specViewOptions.colors.axisText,\n      labelFontSize: {\n        signal: SignalNames.TextSize\n      },\n      labelLimit: axesLabelLimit\n    });\n    if (column.quantitative) {\n      axis.format = \"~r\";\n    }\n    return axis;\n  }\n  function safeFieldName(field2) {\n    return field2.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\").replace(/\"/g, '\\\\\"').replace(/\\./g, \"\\\\.\").replace(/\\[/g, \"\\\\[\").replace(/\\]/g, \"\\\\]\");\n  }\n  function exprSafeFieldName(field2) {\n    return field2.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, \"\");\n  }\n  function linearScale(scaleName, domain2, range2, reverse2, zero2, nice2 = true) {\n    const scale2 = {\n      name: scaleName,\n      type: \"linear\",\n      range: range2,\n      round: true,\n      reverse: reverse2,\n      domain: domain2,\n      zero: zero2,\n      nice: nice2\n    };\n    return scale2;\n  }\n  function pointScale(scaleName, data2, range2, field2, reverse2) {\n    const scale2 = {\n      name: scaleName,\n      type: \"point\",\n      range: range2,\n      domain: {\n        data: data2,\n        field: safeFieldName(field2),\n        sort: true\n      },\n      padding: 0.5\n    };\n    if (reverse2 !== void 0) {\n      scale2.reverse = reverse2;\n    }\n    return scale2;\n  }\n  function binnableColorScale(scaleName, colorBin, data2, field2, scheme2) {\n    scheme2 = scheme2 || ColorScaleNone;\n    const domain2 = {\n      data: data2,\n      field: safeFieldName(field2)\n    };\n    const range2 = {\n      scheme: scheme2\n    };\n    const reverse2 = { signal: SignalNames.ColorReverse };\n    if (colorBin !== \"continuous\") {\n      range2.count = { signal: SignalNames.ColorBinCount };\n    }\n    switch (colorBin) {\n      case \"continuous\": {\n        const sequentialScale = {\n          name: scaleName,\n          type: \"linear\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return sequentialScale;\n      }\n      case \"quantile\": {\n        const quantileScale = {\n          name: scaleName,\n          type: \"quantile\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return quantileScale;\n      }\n      default: {\n        const quantizeScale = {\n          name: scaleName,\n          type: \"quantize\",\n          domain: domain2,\n          range: range2,\n          reverse: reverse2\n        };\n        return quantizeScale;\n      }\n    }\n  }\n  const defaultZProportion = 0.6;\n  function textSignals(context2, heightSignal) {\n    const { specViewOptions } = context2;\n    const signals = [\n      {\n        name: SignalNames.ZProportion,\n        value: defaultZProportion,\n        bind: {\n          name: specViewOptions.language.zScaleProportion,\n          debounce,\n          input: \"range\",\n          min: 0.1,\n          max: 2,\n          step: 0.1\n        }\n      },\n      {\n        name: SignalNames.ZHeight,\n        update: `${heightSignal} * ${SignalNames.ZProportion}`\n      },\n      {\n        name: SignalNames.TextScale,\n        value: 1.2,\n        bind: {\n          name: specViewOptions.language.textScaleSignal,\n          debounce,\n          input: \"range\",\n          min: 0.5,\n          max: 2,\n          step: 0.1\n        }\n      },\n      {\n        name: SignalNames.TextSize,\n        update: `${SignalNames.TextScale} * 10`\n      },\n      {\n        name: SignalNames.TextTitleSize,\n        update: `${SignalNames.TextScale} * 15`\n      },\n      {\n        name: SignalNames.TextAngleX,\n        value: 30,\n        bind: {\n          name: specViewOptions.language.xAxisTextAngleSignal,\n          debounce,\n          input: \"range\",\n          min: 0,\n          max: 90,\n          step: 1\n        }\n      },\n      {\n        name: SignalNames.TextAngleY,\n        value: 0,\n        bind: {\n          name: specViewOptions.language.yAxisTextAngleSignal,\n          debounce,\n          input: \"range\",\n          min: -90,\n          max: 0,\n          step: 1\n        }\n      },\n      {\n        name: SignalNames.MarkOpacity,\n        value: 1,\n        bind: {\n          name: specViewOptions.language.markOpacitySignal,\n          debounce,\n          input: \"range\",\n          min: 0.1,\n          max: 1,\n          step: 0.05\n        }\n      }\n    ];\n    return signals;\n  }\n  function colorBinCountSignal(context2) {\n    const { specViewOptions } = context2;\n    const signal = {\n      name: SignalNames.ColorBinCount,\n      value: 7,\n      bind: {\n        name: specViewOptions.language.colorBinCount,\n        debounce,\n        input: \"range\",\n        min: 1,\n        max: specViewOptions.maxLegends + 1,\n        step: 1\n      }\n    };\n    return signal;\n  }\n  function colorReverseSignal(context2) {\n    const { specViewOptions } = context2;\n    const signal = {\n      name: SignalNames.ColorReverse,\n      value: false,\n      bind: {\n        name: specViewOptions.language.colorReverse,\n        input: \"checkbox\"\n      }\n    };\n    return signal;\n  }\n  function modifySignal(s, fn2, update2) {\n    s.update = `${fn2}((${s.update}), (${update2}))`;\n  }\n  function legend(column, fill2) {\n    const legend2 = {\n      orient: \"none\",\n      title: column.name,\n      fill: fill2,\n      encode: {\n        symbols: {\n          update: {\n            shape: {\n              value: \"square\"\n            }\n          }\n        }\n      }\n    };\n    if (column.quantitative) {\n      legend2.type = \"symbol\";\n      legend2.format = \"~r\";\n    }\n    return legend2;\n  }\n  function getLegends(context2, fill2) {\n    const { specColumns, insight: insight2 } = context2;\n    if (specColumns.color && !insight2.hideLegend && !insight2.directColor && !specColumns.color.isColorData) {\n      return [legend(specColumns.color, fill2)];\n    }\n  }\n  function topLookup(column, count2, source2, legend2, lookupName, fieldName, indexName) {\n    const data2 = [\n      {\n        name: lookupName,\n        source: source2,\n        transform: [\n          {\n            type: \"aggregate\",\n            groupby: [safeFieldName(column.name)]\n          },\n          {\n            type: \"window\",\n            ops: [\"count\"],\n            as: [indexName]\n          },\n          {\n            type: \"filter\",\n            expr: `datum[${JSON.stringify(indexName)}] <= ${count2}`\n          }\n        ]\n      },\n      {\n        name: legend2,\n        source: source2,\n        transform: [\n          {\n            type: \"lookup\",\n            from: lookupName,\n            key: safeFieldName(column.name),\n            fields: [column.name].map(safeFieldName),\n            values: [column.name].map(safeFieldName),\n            as: [fieldName]\n          },\n          {\n            type: \"formula\",\n            expr: `datum[${JSON.stringify(fieldName)}] == null ? '${Other}' : datum[${JSON.stringify(fieldName)}]`,\n            as: fieldName\n          }\n        ]\n      }\n    ];\n    return data2;\n  }\n  function addColor(props) {\n    const { colorReverseSignalName, dataName, scope, legendDataName, scaleName, specContext, topLookupName } = props;\n    let colorDataName = dataName;\n    const { insight: insight2, specColumns, specViewOptions } = specContext;\n    const legends = getLegends(specContext, scaleName);\n    if (legends) {\n      scope.legends = legends;\n    }\n    const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n    if (categoricalColor) {\n      addData(scope, ...topLookup(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, FieldNames.TopColor, FieldNames.TopIndex));\n      colorDataName = legendDataName;\n    }\n    if (specColumns.color && !specColumns.color.isColorData && !insight2.directColor) {\n      if (specColumns.color.quantitative) {\n        addScales(scope, binnableColorScale(scaleName, insight2.colorBin, dataName, specColumns.color.name, insight2.scheme));\n      } else {\n        addScales(scope, {\n          name: scaleName,\n          type: \"ordinal\",\n          domain: {\n            data: colorDataName,\n            field: FieldNames.TopColor,\n            sort: true\n          },\n          range: {\n            scheme: insight2.scheme || ColorScaleNone\n          },\n          reverse: { signal: colorReverseSignalName }\n        });\n      }\n    }\n    addSignals(scope, colorBinCountSignal(specContext), colorReverseSignal(specContext));\n    return { topColorField: FieldNames.TopColor, colorDataName };\n  }\n  function addFacetColRowTitles(globalScope, colTitleSource, rowTitleSource, sizeSignals, axisTextColor) {\n    const titleSignal = `parent[${JSON.stringify(FieldNames.FacetTitle)}]`;\n    const index2 = `datum[${JSON.stringify(FieldNames.Ordinal)}] - 1`;\n    const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index2);\n    const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index2);\n    addMarks(globalScope, col.header, row.footer);\n    addMarks(col.header, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"center\"\n          },\n          baseline: {\n            value: \"middle\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          x: {\n            signal: `${sizeSignals.layoutWidth} / 2`\n          },\n          limit: {\n            signal: sizeSignals.layoutWidth\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          text: {\n            signal: titleSignal\n          }\n        }\n      }\n    });\n    addMarks(row.footer, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"left\"\n          },\n          baseline: {\n            value: \"middle\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          y: {\n            signal: `${sizeSignals.layoutHeight} / 2`\n          },\n          limit: {\n            signal: SignalNames.PlotOffsetRight\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          text: {\n            signal: titleSignal\n          }\n        }\n      }\n    });\n  }\n  function addFacetCellTitles(scope, sizeSignals, axisTextColor) {\n    addMarks(scope, {\n      type: \"text\",\n      encode: {\n        enter: {\n          align: {\n            value: \"center\"\n          },\n          baseline: {\n            value: \"bottom\"\n          },\n          fill: {\n            value: axisTextColor\n          }\n        },\n        update: {\n          metaData: {\n            signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`\n          },\n          x: {\n            signal: `(${sizeSignals.layoutWidth}) / 2`\n          },\n          text: {\n            signal: `parent[${JSON.stringify(FieldNames.FacetTitle)}]`\n          },\n          fontSize: {\n            signal: SignalNames.TextSize\n          },\n          limit: {\n            signal: sizeSignals.layoutWidth\n          },\n          y: {\n            signal: `-${SignalNames.FacetPaddingTop} / 2`\n          }\n        }\n      }\n    });\n  }\n  function addFacetAxesGroupMarks(props) {\n    const { colSeqName, colTitleScale, globalScope, facetScope, plotScope, rowSeqName, rowTitleScale } = props;\n    const { sizeSignals } = facetScope;\n    const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n    const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n    const index2 = \"datum.data\";\n    const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index2);\n    const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index2);\n    addData(globalScope, colSequence, rowSequence);\n    addMarks(globalScope, col.footer, row.header);\n    addScales(globalScope, colTitleScale, rowTitleScale);\n    const map2 = {\n      main: [\n        {\n          scope: facetScope.facetScope,\n          lines: true,\n          labels: false,\n          title: false\n        }\n      ],\n      x: [\n        {\n          scope: col.footer,\n          lines: true,\n          labels: true,\n          title: false\n        },\n        {\n          scope: plotScope,\n          scale: colTitleScale,\n          lines: false,\n          labels: false,\n          title: true\n        }\n      ],\n      y: [\n        {\n          scope: row.header,\n          lines: true,\n          labels: true,\n          title: false\n        },\n        {\n          scope: plotScope,\n          scale: rowTitleScale,\n          lines: false,\n          labels: false,\n          title: true\n        }\n      ]\n    };\n    return map2;\n  }\n  function facetRowHeaderFooter(data2, sizeSignals, index2) {\n    const rowFn = (xSignal) => {\n      return {\n        type: \"group\",\n        from: { data: data2 },\n        encode: {\n          update: {\n            x: { signal: xSignal },\n            y: {\n              signal: `${SignalNames.PlotOffsetTop} + ${SignalNames.FacetPaddingTop} + (${index2}) * (${sizeSignals.layoutHeight} + ${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`\n            },\n            height: { signal: sizeSignals.layoutHeight }\n          }\n        }\n      };\n    };\n    const header = rowFn(SignalNames.PlotOffsetLeft);\n    const footer = rowFn(`${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetRight} / 2`);\n    return { header, footer };\n  }\n  function facetColumnHeaderFooter(data2, sizeSignals, index2) {\n    const colFn = (ySignal) => {\n      return {\n        type: \"group\",\n        from: { data: data2 },\n        encode: {\n          update: {\n            x: {\n              signal: `(${index2}) * (${sizeSignals.layoutWidth} + ${SignalNames.FacetPaddingLeft}) + ${SignalNames.FacetPaddingLeft} + ${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}`\n            },\n            y: { signal: `${ySignal} - ${SignalNames.FacetAxesAdjustY}` },\n            width: { signal: sizeSignals.layoutWidth }\n          }\n        }\n      };\n    };\n    const header = colFn(`${SignalNames.PlotOffsetTop} / 2`);\n    const footer = colFn(`${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut}`);\n    return { header, footer };\n  }\n  function createSequence(dataName, countSignal) {\n    return {\n      name: dataName,\n      transform: [\n        {\n          type: \"sequence\",\n          start: 0,\n          stop: {\n            signal: countSignal\n          }\n        }\n      ]\n    };\n  }\n  function fill(context2, colorFieldName, scale2) {\n    const { specColumns, insight: insight2, specViewOptions } = context2;\n    const colorColumn = specColumns.color;\n    return colorColumn ? colorColumn.isColorData || insight2.directColor ? {\n      field: safeFieldName(colorColumn.name)\n    } : {\n      scale: scale2,\n      field: colorColumn.quantitative ? safeFieldName(colorColumn.name) : colorFieldName\n    } : {\n      value: specViewOptions.colors.defaultCube\n    };\n  }\n  function opacity(context2) {\n    const result = {\n      signal: SignalNames.MarkOpacity\n    };\n    return result;\n  }\n  class GlobalScope {\n    constructor(props) {\n      const { dataName, markGroup, scope, signals } = props;\n      this.scope = scope;\n      this._markGroup = markGroup;\n      this.signals = signals;\n      this.data = getDataByName(scope.data, dataName).data;\n      this._markDataName = dataName;\n      this.offsets = {\n        x: \"0\",\n        y: \"0\",\n        h: SignalNames.PlotHeightIn,\n        w: SignalNames.PlotWidthIn\n      };\n      this.sizeSignals = {\n        layoutHeight: SignalNames.PlotHeightIn,\n        layoutWidth: SignalNames.PlotWidthIn\n      };\n      this.zSize = SignalNames.PlotHeightIn;\n    }\n    get markDataName() {\n      return this._markDataName;\n    }\n    setMarkDataName(markDataName) {\n      this._markDataName = markDataName;\n    }\n    get markGroup() {\n      return this._markGroup;\n    }\n    setMarkGroup(markGroup) {\n      this._markGroup = markGroup;\n    }\n  }\n  class Layout {\n    constructor(props) {\n      this.props = props;\n      this.id = props.id;\n    }\n    getGrouping() {\n      return null;\n    }\n    getAggregateSumOp() {\n      return null;\n    }\n    build() {\n      throw \"Not implemented\";\n    }\n  }\n  function testForCollapseSelection() {\n    return `datum.${FieldNames.Collapsed}`;\n  }\n  class AggregateContainer extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const a2 = this.aggregation = this.getAggregation();\n      const p = this.prefix = `agg_${this.id}`;\n      this.names = {\n        barCount: `${p}_count`,\n        aggregateField: `${p}_aggregate_value`,\n        globalAggregateExtentSignal: `${p}_${a2}_extent`,\n        scale: `scale_${p}`,\n        extentData: `data_${p}_extent`,\n        offsets: `data_${p}_offsets`\n      };\n    }\n    getAggregateSumOp() {\n      if (this.aggregation === \"sum\") {\n        const fieldOp = {\n          field: safeFieldName(this.props.sumBy.name),\n          op: \"sum\",\n          as: FieldNames.Sum\n        };\n        return fieldOp;\n      }\n    }\n    build() {\n      const { aggregation, names, props } = this;\n      const { dock, globalScope, groupings, niceScale, parentScope, showAxes } = props;\n      addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n        type: \"extent\",\n        field: safeFieldName(names.aggregateField),\n        signal: names.globalAggregateExtentSignal\n      });\n      addSignals(globalScope.scope, {\n        name: props.globalAggregateMaxExtentSignal,\n        update: `${names.globalAggregateExtentSignal}[1]`\n      });\n      const horizontal = dock === \"left\";\n      const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n      const offsets2 = {\n        x: parentScope.offsets.x,\n        y: addOffsets(parentScope.offsets.y, dock === \"bottom\" ? groupScaled : \"\"),\n        h: horizontal ? parentScope.offsets.h : dock === \"top\" ? groupScaled : `${parentScope.offsets.h} - ${groupScaled}`,\n        w: horizontal ? groupScaled : parentScope.offsets.w\n      };\n      const scale2 = {\n        type: \"linear\",\n        name: names.scale,\n        domain: [\n          0,\n          {\n            signal: props.globalAggregateMaxExtentSignal\n          }\n        ],\n        range: horizontal ? [\n          0,\n          {\n            signal: parentScope.sizeSignals.layoutWidth\n          }\n        ] : [\n          {\n            signal: parentScope.sizeSignals.layoutHeight\n          },\n          0\n        ],\n        nice: niceScale,\n        zero: true,\n        reverse: dock === \"top\"\n      };\n      const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n      addSignals(globalScope.scope, {\n        name: props.globalAggregateMaxExtentScaledSignal,\n        update: dock === \"bottom\" ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}` : globalAggregateMaxExtentScaledValue\n      });\n      return {\n        offsets: offsets2,\n        sizeSignals: horizontal ? {\n          layoutHeight: parentScope.sizeSignals.layoutHeight,\n          layoutWidth: null\n        } : {\n          layoutHeight: null,\n          layoutWidth: parentScope.sizeSignals.layoutWidth\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? [scale2] : void 0,\n            y: horizontal ? void 0 : [scale2]\n          }\n        },\n        encodingRuleMap: horizontal ? {\n          x: [{\n            test: testForCollapseSelection(),\n            signal: parentScope.offsets.x\n          }],\n          width: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        } : {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: dock === \"top\" ? parentScope.offsets.y : addOffsets(parentScope.offsets.y, parentScope.offsets.h)\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n    getTransforms(aggregation, groupby) {\n      const trans = {\n        type: \"joinaggregate\",\n        groupby: groupby.map(safeFieldName),\n        ops: [aggregation]\n      };\n      if (aggregation === \"sum\") {\n        trans.fields = [this.props.sumBy.name].map(safeFieldName);\n      }\n      return trans;\n    }\n    getAggregation() {\n      const { props } = this;\n      let s;\n      if (props.dock === \"left\") {\n        s = props.axesScales.x;\n      } else {\n        s = props.axesScales.y;\n      }\n      switch (s.aggregate) {\n        case \"sum\":\n          return \"sum\";\n        default:\n          return \"count\";\n      }\n    }\n  }\n  class AggregateSquare extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const a2 = this.props.aggregation;\n      const p = this.prefix = `agg_${this.id}`;\n      this.names = {\n        barCount: `${p}_count`,\n        aggregateField: `${p}_aggregate_value`,\n        globalAggregateExtentSignal: `${p}_${a2}_extent`,\n        extentData: `data_${p}_extent`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { aggregation, globalScope, groupings, onBuild, parentScope } = props;\n      const { sizeSignals } = parentScope;\n      addTransforms(globalScope.data, Object.assign(Object.assign({}, this.getTransforms(aggregation, getGroupBy(groupings))), { as: [names.aggregateField] }), {\n        type: \"extent\",\n        field: safeFieldName(names.aggregateField),\n        signal: names.globalAggregateExtentSignal\n      });\n      const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n      const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n      const squareMaxArea = `(${[squareMaxSide, squareMaxSide].join(\" * \")})`;\n      const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n      const squareArea = `(${[squareMaxArea, shrinkRatio].join(\" * \")})`;\n      const squareSide = `sqrt(${squareArea})`;\n      const localAggregateMaxExtentScaled = squareSide;\n      onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n        y: addOffsets(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n        h: squareSide,\n        w: squareSide\n      };\n      return {\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        encodingRuleMap: {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: offsets2.y\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n    getTransforms(aggregation, groupby) {\n      const trans = {\n        type: \"joinaggregate\",\n        groupby: groupby.map(safeFieldName),\n        ops: [aggregation]\n      };\n      if (aggregation === \"sum\") {\n        trans.fields = [this.props.sumBy.name].map(safeFieldName);\n      }\n      return trans;\n    }\n  }\n  function dataExtent(column, signal) {\n    return {\n      type: \"extent\",\n      field: safeFieldName(column.name),\n      signal\n    };\n  }\n  function binnable(prefix, domainDataName, discreteColumn, outerSignalExtents) {\n    const { column, defaultBins: defaultBins2, maxbins: maxbins2, maxbinsSignalDisplayName, maxbinsSignalName } = discreteColumn;\n    if (column.quantitative) {\n      const field2 = `${prefix}_bin_${exprSafeFieldName(column.name)}`;\n      const fieldEnd = `${field2}_end`;\n      const binSignal = `${field2}_bins`;\n      const dataExtentSignal = `${field2}_bin_extent`;\n      const dataExtentSpanSignal = `${field2}_bin_extent_span`;\n      const outerSignal = `${field2}_outer_extent`;\n      domainDataName = `${field2}_sequence`;\n      const extentTransform = dataExtent(column, dataExtentSignal);\n      let imageSignal;\n      if (outerSignalExtents) {\n        imageSignal = outerExtentSignal(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n      }\n      const maxbinsSignal = {\n        name: maxbinsSignalName,\n        value: defaultBins2,\n        bind: {\n          name: maxbinsSignalDisplayName,\n          debounce,\n          input: \"range\",\n          min: 1,\n          max: maxbins2,\n          step: 1\n        }\n      };\n      const extentSignal = (imageSignal === null || imageSignal === void 0 ? void 0 : imageSignal.name) || dataExtentSignal;\n      const binTransform = {\n        type: \"bin\",\n        field: safeFieldName(column.name),\n        as: [\n          field2,\n          fieldEnd\n        ],\n        signal: binSignal,\n        extent: {\n          signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`\n          //add a tiny bit to the upper extent to force the extra bin - https://github.com/vega/vega/issues/2899\n        },\n        minstep: shouldBeIntegralBinStep(column) ? 1 : 0,\n        maxbins: {\n          signal: maxbinsSignalName\n        }\n      };\n      const dataSequence = {\n        name: domainDataName,\n        transform: [\n          {\n            type: \"sequence\",\n            start: {\n              signal: `${binSignal}.start`\n            },\n            stop: {\n              signal: `${binSignal}.stop`\n            },\n            step: {\n              signal: `${binSignal}.step`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.data\",\n            as: field2\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data + ${binSignal}.step`,\n            as: fieldEnd\n          },\n          {\n            type: \"window\",\n            ops: [\"row_number\"],\n            as: [FieldNames.Ordinal]\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data === ${binSignal}.start`,\n            as: FieldNames.First\n          },\n          {\n            type: \"formula\",\n            expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n            as: FieldNames.Last\n          },\n          {\n            // when there is only one bin, use only first sequence element\n            type: \"filter\",\n            expr: `${dataExtentSpanSignal} === 0 ? datum[${JSON.stringify(FieldNames.First)}] : true`\n          }\n        ]\n      };\n      const signals = [\n        maxbinsSignal,\n        {\n          name: dataExtentSpanSignal,\n          update: `${extentSignal}[1] - ${extentSignal}[0]`\n        }\n      ];\n      if (imageSignal) {\n        signals.push(imageSignal);\n      }\n      const augmentBinnable = {\n        discreteColumn,\n        native: false,\n        transforms: [extentTransform, binTransform],\n        fields: [field2, fieldEnd],\n        binSignal,\n        extentSignal,\n        dataSequence,\n        domainDataName,\n        signals,\n        fullScaleDataname: dataSequence.name\n      };\n      return augmentBinnable;\n    } else {\n      const nativeBinnable = {\n        discreteColumn,\n        native: true,\n        fields: [column.name],\n        domainDataName,\n        fullScaleDataname: domainDataName\n      };\n      return nativeBinnable;\n    }\n  }\n  function outerExtentSignal(name, min2, max2, dataExtent2) {\n    return {\n      name,\n      update: `[min(${min2}, ${dataExtent2}[0]), max(${max2}, ${dataExtent2}[1])]`\n    };\n  }\n  function shouldBeIntegralBinStep(column) {\n    return column.quantitative && (column.type === \"integer\" && column.stats.max - column.stats.min <= 7);\n  }\n  const bandScaleLinearSuffix = \"_linear\";\n  class Band extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `band_${this.id}`;\n      this.names = {\n        xScale: `scale_${p}_x`,\n        yScale: `scale_${p}_y`,\n        bandWidth: `${p}_bandwidth`,\n        accumulative: `${p}_accumulative`\n      };\n      this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n    }\n    getGrouping() {\n      return this.bin.fields;\n    }\n    build() {\n      const { bin: bin2, names, props } = this;\n      const { globalScope, minBandWidth, orientation, parentScope, showAxes } = props;\n      const binField = bin2.fields[0];\n      if (bin2.native === false) {\n        addSignals(globalScope.scope, ...bin2.signals);\n        addTransforms(globalScope.data, ...bin2.transforms);\n        addData(globalScope.scope, bin2.dataSequence);\n      }\n      addData(globalScope.scope, {\n        name: names.accumulative,\n        source: bin2.fullScaleDataname,\n        transform: [\n          {\n            type: \"aggregate\",\n            groupby: this.getGrouping().map(safeFieldName),\n            ops: [\"count\"]\n          }\n        ]\n      });\n      const horizontal = orientation === \"horizontal\";\n      const minCellSignal = horizontal ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n      modifySignal(minCellSignal, \"max\", `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n      addSignals(globalScope.scope, {\n        name: names.bandWidth,\n        update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`\n      });\n      const scale2 = this.getScale(bin2, horizontal);\n      if (props.outerSignalExtents && bin2.native === false) {\n        addScales(globalScope.scope, linearScale(scale2.name + bandScaleLinearSuffix, { signal: bin2.extentSignal }, scale2.range, scale2.reverse, false, false));\n      }\n      let encodingRuleMap;\n      if (!props.excludeEncodingRuleMap) {\n        encodingRuleMap = horizontal ? {\n          x: [\n            {\n              test: testForCollapseSelection(),\n              signal: parentScope.offsets.x\n            }\n          ],\n          width: [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            }\n          ]\n        } : {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: addOffsets(parentScope.offsets.y, parentScope.offsets.h)\n            }\n          ],\n          height: [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            }\n          ]\n        };\n      }\n      return {\n        offsets: this.getOffset(horizontal, binField),\n        sizeSignals: horizontal ? {\n          layoutHeight: names.bandWidth,\n          layoutWidth: parentScope.sizeSignals.layoutWidth\n        } : {\n          layoutHeight: parentScope.sizeSignals.layoutHeight,\n          layoutWidth: names.bandWidth\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? void 0 : [scale2],\n            y: horizontal ? [scale2] : void 0\n          }\n        },\n        encodingRuleMap\n      };\n    }\n    getOffset(horizontal, binField) {\n      const { names, props } = this;\n      const { parentScope } = props;\n      return {\n        x: addOffsets(parentScope.offsets.x, horizontal ? \"\" : `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`),\n        y: addOffsets(parentScope.offsets.y, horizontal ? `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])` : \"\"),\n        h: horizontal ? names.bandWidth : parentScope.offsets.h,\n        w: horizontal ? parentScope.offsets.w : names.bandWidth\n      };\n    }\n    getScale(bin2, horizontal) {\n      const { names } = this;\n      const { parentScope } = this.props;\n      const binField = safeFieldName(bin2.fields[0]);\n      let bandScale;\n      if (horizontal) {\n        bandScale = {\n          type: \"band\",\n          name: names.yScale,\n          range: [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutHeight\n            }\n          ],\n          padding: 0.1,\n          domain: {\n            data: bin2.domainDataName,\n            field: binField,\n            sort: true\n          },\n          reverse: true\n        };\n      } else {\n        bandScale = {\n          type: \"band\",\n          name: names.xScale,\n          range: [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutWidth\n            }\n          ],\n          padding: 0.1,\n          domain: {\n            data: bin2.domainDataName,\n            field: binField,\n            sort: true\n          }\n        };\n      }\n      return bandScale;\n    }\n  }\n  function displayBin(bin2) {\n    const val = (index2) => `datum[${JSON.stringify(bin2.fields[index2])}]`;\n    return bin2.discreteColumn.column.quantitative ? `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')` : val(0);\n  }\n  function obj(nameValues, clause) {\n    return `{${nameValues.join()}}`;\n  }\n  function serializeAsVegaExpression(bin2, firstFieldName, lastFieldName, clause) {\n    if (bin2.discreteColumn.column.quantitative) {\n      const low = [\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'>='\",\n        `value:datum[${JSON.stringify(bin2.fields[0])}]`\n      ];\n      const high = [\n        \"clause:'&&'\",\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'<'\",\n        `value:datum[${JSON.stringify(bin2.fields[1])}]`\n      ];\n      return obj([\n        `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`\n      ]);\n    } else {\n      const exact = [\n        `name:${JSON.stringify(bin2.discreteColumn.column.name)}`,\n        \"operator:'=='\",\n        `value:datum[${JSON.stringify(bin2.fields[0])}]`\n      ];\n      return obj([\n        `expressions:[${obj(exact)}]`\n      ]);\n    }\n  }\n  function createOrdinals(source2, prefix, binFields, sortOrder) {\n    const _binFields = binFields.map(safeFieldName);\n    const dataName = `${prefix}_bin_order`;\n    const data2 = {\n      name: dataName,\n      source: source2,\n      transform: [\n        {\n          type: \"aggregate\",\n          groupby: _binFields\n        },\n        {\n          type: \"collect\",\n          sort: {\n            field: _binFields,\n            order: _binFields.map((f) => sortOrder)\n          }\n        },\n        {\n          type: \"window\",\n          ops: [\"row_number\"],\n          as: [FieldNames.Ordinal]\n        }\n      ]\n    };\n    return {\n      data: data2,\n      scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields)\n    };\n  }\n  function ordinalScale(dataName, scaleName, binFields) {\n    return {\n      type: \"ordinal\",\n      name: scaleName,\n      domain: {\n        data: dataName,\n        field: safeFieldName(binFields[0])\n      },\n      range: {\n        data: dataName,\n        field: FieldNames.Ordinal\n      }\n    };\n  }\n  class Cross extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `cross_${this.id}`;\n      this.binX = binnable(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n      this.binY = binnable(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n      this.names = {\n        facetDataName: `data_${p}_facet`,\n        searchUnion: `data_${p}_search`,\n        dimScale: `scale_${p}`,\n        dimCount: `${p}_count`,\n        dimCategorical: `data_${p}_cat`,\n        dimCellSize: `${p}_cell_size`,\n        dimCellSizeCalc: `${p}_cell_calc`\n      };\n    }\n    getGrouping() {\n      return this.binX.fields.concat(this.binY.fields);\n    }\n    build() {\n      const { binX, binY, names, prefix, props } = this;\n      const { axisTextColor, colRowTitles, globalScope, parentScope } = props;\n      const titles = { x: { dataName: null, quantitative: null }, y: { dataName: null, quantitative: null } };\n      const dx = {\n        dim: \"x\",\n        bin: binX,\n        sortOrder: \"ascending\",\n        size: parentScope.sizeSignals.layoutWidth,\n        layout: parentScope.sizeSignals.layoutWidth,\n        min: globalScope.signals.minCellWidth.name,\n        out: globalScope.signals.plotWidthOut,\n        offset: SignalNames.FacetPaddingLeft,\n        padding: SignalNames.FacetPaddingLeft,\n        dataOut: null,\n        scaleName: null,\n        position: null\n      };\n      const dy = {\n        dim: \"y\",\n        bin: binY,\n        sortOrder: \"ascending\",\n        size: parentScope.sizeSignals.layoutHeight,\n        layout: parentScope.sizeSignals.layoutHeight,\n        min: globalScope.signals.minCellHeight.name,\n        out: globalScope.signals.plotHeightOut,\n        offset: SignalNames.FacetPaddingTop,\n        padding: `(${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n        dataOut: null,\n        scaleName: null,\n        position: null\n      };\n      const dimensions = [dx, dy];\n      dimensions.forEach((d) => {\n        const { bin: bin2, dim, padding: padding2, sortOrder } = d;\n        let data2;\n        let dataName;\n        let countSignal;\n        let scale2;\n        const titleSource = titles[dim];\n        if (bin2.native === false) {\n          addSignals(globalScope.scope, ...bin2.signals);\n          addTransforms(globalScope.data, ...bin2.transforms);\n          addData(globalScope.scope, bin2.dataSequence);\n          addTransforms(bin2.dataSequence, {\n            type: \"formula\",\n            expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin2.fields[0])}, datum[${JSON.stringify(bin2.fields[0])}])`,\n            as: FieldNames.Contains\n          });\n          data2 = bin2.dataSequence;\n          dataName = bin2.dataSequence.name;\n          countSignal = `length(data(${JSON.stringify(dataName)}))`;\n          scale2 = ordinalScale(dataName, `${names.dimScale}_${dim}`, bin2.fields);\n          titleSource.dataName = bin2.dataSequence.name;\n        } else {\n          dataName = globalScope.markDataName;\n          const ord = createOrdinals(dataName, `${prefix}_${dim}`, bin2.fields, sortOrder);\n          data2 = ord.data;\n          addData(globalScope.scope, ord.data);\n          countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n          scale2 = ord.scale;\n          titleSource.dataName = ord.data.name;\n        }\n        titleSource.quantitative = bin2.discreteColumn.column.quantitative;\n        d.dataOut = data2;\n        d.scaleName = scale2.name;\n        addTransforms(data2, {\n          type: \"formula\",\n          expr: serializeAsVegaExpression(bin2, FieldNames.First, FieldNames.Last),\n          as: FieldNames.FacetSearch\n        }, {\n          type: \"formula\",\n          expr: displayBin(bin2),\n          as: FieldNames.FacetTitle\n        });\n        addScales(globalScope.scope, scale2);\n        const count2 = `${names.dimCount}_${dim}`;\n        const calc = `${names.dimCellSizeCalc}_${dim}`;\n        const size2 = `${names.dimCellSize}_${dim}`;\n        addSignals(globalScope.scope, { name: count2, update: countSignal });\n        addSignals(globalScope.scope, {\n          name: calc,\n          update: `${d.layout} / ${count2}`\n        }, {\n          name: size2,\n          update: `max(${d.min}, (${calc} - ${padding2}))`\n        });\n        modifySignal(d.out, \"max\", `((${size2} + ${padding2}) * ${count2})`);\n        d.position = this.dimensionOffset(d);\n      });\n      const groupRow = {\n        type: \"group\",\n        encode: {\n          update: {\n            y: {\n              signal: dy.position\n            }\n          }\n        },\n        from: {\n          data: dy.dataOut.name\n        },\n        data: [\n          {\n            name: names.searchUnion,\n            source: dx.dataOut.name,\n            transform: [\n              {\n                type: \"formula\",\n                expr: `[datum[${JSON.stringify(FieldNames.FacetSearch)}], merge(parent[${JSON.stringify(FieldNames.FacetSearch)}], { clause: '&&'})]`,\n                as: FieldNames.FacetSearch\n              }\n            ]\n          }\n        ]\n      };\n      const groupCol = {\n        style: \"cell\",\n        name: prefix,\n        type: \"group\",\n        encode: {\n          update: {\n            height: {\n              signal: `${names.dimCellSize}_y`\n            },\n            width: {\n              signal: `${names.dimCellSize}_x`\n            },\n            x: {\n              signal: dx.position\n            }\n          }\n        },\n        from: {\n          data: names.searchUnion\n        }\n      };\n      addMarks(globalScope.markGroup, groupRow);\n      addMarks(groupRow, groupCol);\n      const offsets2 = {\n        x: this.dimensionOffset(dx),\n        y: this.dimensionOffset(dy),\n        h: `${names.dimCellSize}_y`,\n        w: `${names.dimCellSize}_x`\n      };\n      const sizeSignals = {\n        layoutHeight: `${names.dimCellSize}_y`,\n        layoutWidth: `${names.dimCellSize}_x`,\n        colCount: `${names.dimCount}_x`,\n        rowCount: `${names.dimCount}_y`\n      };\n      if (colRowTitles) {\n        addFacetColRowTitles(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n      }\n      return {\n        facetScope: groupCol,\n        offsets: offsets2,\n        sizeSignals,\n        titles\n      };\n    }\n    dimensionOffset(d) {\n      const { names } = this;\n      return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n    }\n  }\n  let Scatter$1 = class Scatter extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `scatter_${this.id}`;\n      this.names = {\n        aggregateData: `data_${p}_aggregate`,\n        markData: `data_${p}_mark`,\n        xDataExtent: `${p}_xDataExtent`,\n        yDataExtent: `${p}_yDataExtent`,\n        xExtent: `${p}_xExtent`,\n        yExtent: `${p}_yExtent`,\n        sizeExtent: `${p}_sizeExtent`,\n        sizeRange: `${p}_sizeRange`,\n        sizeScale: `${p}_sizeScale`,\n        xScale: `scale_${p}_x`,\n        yScale: `scale_${p}_y`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { backgroundImageExtents, globalScope, parentScope, scatterPointScaleDisplay, showAxes, size: size2, view, x: x2, y: y2, z, zGrounded } = props;\n      const qsize = size2 && size2.quantitative && size2;\n      addSignals(globalScope.scope, {\n        name: SignalNames.PointScale,\n        value: 5,\n        bind: {\n          name: scatterPointScaleDisplay,\n          debounce,\n          input: \"range\",\n          min: 1,\n          max: 10,\n          step: 0.1\n        }\n      }, {\n        name: SignalNames.ZGrounded,\n        value: false,\n        bind: {\n          name: zGrounded,\n          input: \"checkbox\"\n        }\n      });\n      if (backgroundImageExtents) {\n        addTransforms(globalScope.data, dataExtent(x2, names.xDataExtent), dataExtent(y2, names.yDataExtent));\n        const xSignal = outerExtentSignal(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n        const ySignal = outerExtentSignal(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n        addSignals(globalScope.scope, xSignal, ySignal);\n      }\n      if (qsize) {\n        addTransforms(globalScope.data, {\n          type: \"extent\",\n          field: safeFieldName(qsize.name),\n          signal: names.sizeExtent\n        });\n        addScales(globalScope.scope, {\n          name: names.sizeScale,\n          type: \"pow\",\n          exponent: 0.5,\n          domain: [0, { signal: `${names.sizeExtent}[1]` }],\n          range: [0, { signal: names.sizeRange }]\n        });\n        addSignals(globalScope.scope, {\n          name: names.sizeRange,\n          update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${scatterSizedDiv}`\n        });\n      }\n      addData(globalScope.scope, {\n        name: names.markData,\n        source: globalScope.markDataName,\n        transform: [x2, y2, z].map((c2) => {\n          if (!c2 || !c2.quantitative)\n            return;\n          const t = {\n            type: \"filter\",\n            expr: `isValid(datum[${JSON.stringify(c2.name)}])`\n          };\n          return t;\n        }).filter(Boolean)\n      });\n      globalScope.setMarkDataName(names.markData);\n      const globalScales = { showAxes, scales: {} };\n      const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n      const sizeValueSignal = qsize ? `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${SignalNames.PointScale}` : SignalNames.PointScale;\n      const update2 = Object.assign({ height: [\n        {\n          test: testForCollapseSelection(),\n          value: 0\n        },\n        {\n          signal: sizeValueSignal\n        }\n      ], width: {\n        signal: sizeValueSignal\n      } }, z && {\n        z: [\n          {\n            test: testForCollapseSelection(),\n            value: 0\n          },\n          {\n            signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`\n          }\n        ],\n        zindex: [\n          {\n            signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`\n          }\n        ],\n        depth: [\n          {\n            test: testForCollapseSelection(),\n            value: 0\n          },\n          {\n            signal: view === \"3d\" ? `${SignalNames.ZGrounded} ? ${zValue} : ${sizeValueSignal}` : \"0\"\n          }\n        ]\n      });\n      const columnSignals = [\n        {\n          column: x2,\n          xyz: \"x\",\n          scaleName: names.xScale,\n          domain: backgroundImageExtents ? {\n            signal: names.xExtent\n          } : {\n            data: globalScope.data.name,\n            field: safeFieldName(x2.name)\n          },\n          reverse: false,\n          signal: parentScope.sizeSignals.layoutWidth\n        },\n        {\n          column: y2,\n          xyz: \"y\",\n          scaleName: names.yScale,\n          domain: backgroundImageExtents ? {\n            signal: names.yExtent\n          } : {\n            data: globalScope.data.name,\n            field: safeFieldName(y2.name)\n          },\n          reverse: true,\n          signal: parentScope.sizeSignals.layoutHeight\n        },\n        {\n          column: z,\n          xyz: \"z\",\n          scaleName: names.zScale,\n          domain: {\n            data: globalScope.data.name,\n            field: z ? safeFieldName(z.name) : null\n          },\n          reverse: false,\n          signal: view === \"3d\" ? `(${globalScope.zSize}) * ${SignalNames.ZProportion}` : `10 * ${SignalNames.ZProportion}`\n        }\n      ];\n      columnSignals.forEach((cs) => {\n        const { column, domain: domain2, reverse: reverse2, scaleName, signal, xyz } = cs;\n        if (!column)\n          return;\n        let scale2;\n        if (column.quantitative) {\n          scale2 = linearScale(scaleName, domain2, [0, { signal }], reverse2, false, showAxes);\n          if (shouldBeIntegralBinStep(column)) {\n            scale2.bins = { step: 1 };\n          }\n        } else {\n          scale2 = pointScale(scaleName, globalScope.data.name, [0, { signal }], column.name, reverse2);\n        }\n        globalScales.scales[xyz] = [scale2];\n      });\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: globalScope.markDataName },\n        encode: { update: update2 }\n      };\n      addMarks(globalScope.markGroup, mark);\n      return {\n        offsets: {\n          x: addOffsets(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x2.name)}])`),\n          y: addOffsets(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y2.name)}]) - ${sizeValueSignal}`),\n          h: sizeValueSignal,\n          w: sizeValueSignal\n        },\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        globalScales,\n        mark,\n        encodingRuleMap: {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: addOffsets(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight)\n            }\n          ]\n        }\n      };\n    }\n  };\n  function addZScale(z, zSize, dataName, zScaleName) {\n    if (z) {\n      const zRange = [0, { signal: `(${zSize}) * ${SignalNames.ZProportion}` }];\n      const scale2 = z.quantitative ? linearScale(zScaleName, {\n        data: dataName,\n        field: safeFieldName(z.name)\n      }, zRange, false, true) : pointScale(zScaleName, dataName, zRange, z.name, false);\n      return scale2;\n    }\n  }\n  class Square extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `square_${this.id}`;\n      this.names = {\n        bandWidth: this.getBandWidth(),\n        maxGroupField: `${p}_max_group`,\n        maxGroupSignal: `${p}_max_grouping`,\n        stack0: `${p}_stack0`,\n        stack1: `${p}_stack1`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { fillDirection, globalScope, groupings, parentScope, collapseYHeight, showAxes, sortBy, view, z } = props;\n      const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n      addTransforms(globalScope.data, Object.assign({ type: \"stack\", groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sortBy && {\n        sort: {\n          field: safeFieldName(sortBy.name),\n          order: \"ascending\"\n        }\n      }));\n      const { gap, levelSize, size: size2, squaresPerBand } = this.addSignals();\n      const heightSignal = {\n        signal: fillDirection === \"down-right\" ? size2 : levelSize\n      };\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: {\n          data: globalScope.markDataName\n        },\n        encode: {\n          update: Object.assign({ height: collapseYHeight ? [\n            {\n              test: testForCollapseSelection(),\n              value: 0\n            },\n            heightSignal\n          ] : heightSignal, width: {\n            signal: fillDirection === \"down-right\" ? levelSize : size2\n          } }, z && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      const { tx: tx2, ty: ty2 } = this.transformXY(gap, levelSize, squaresPerBand);\n      return Object.assign(Object.assign(Object.assign({}, z && {\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        }\n      }), { offsets: {\n        x: addOffsets(parentScope.offsets.x, tx2.expr),\n        y: addOffsets(parentScope.offsets.y, ty2.expr),\n        h: size2,\n        w: size2\n      }, mark, sizeSignals: {\n        layoutHeight: size2,\n        layoutWidth: size2\n      } }), collapseYHeight && {\n        encodingRuleMap: {\n          y: [\n            {\n              test: testForCollapseSelection(),\n              signal: parentScope.offsets.y\n            }\n          ]\n        }\n      });\n    }\n    getBandWidth() {\n      const { offsets: offsets2 } = this.props.parentScope;\n      switch (this.props.fillDirection) {\n        case \"down-right\":\n          return offsets2.h;\n        default:\n          return offsets2.w;\n      }\n    }\n    addSignals() {\n      const { names, props } = this;\n      const { fillDirection, globalScope, groupings, parentScope } = props;\n      let { maxGroupedFillSize, maxGroupedUnits } = props;\n      if (!maxGroupedUnits) {\n        if (groupings) {\n          addTransforms(globalScope.data, {\n            type: \"joinaggregate\",\n            groupby: getGroupBy(groupings).map(safeFieldName),\n            ops: [\"count\"],\n            as: [names.maxGroupField]\n          }, {\n            type: \"extent\",\n            field: names.maxGroupField,\n            signal: names.maxGroupSignal\n          });\n          maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n        } else {\n          maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n        }\n      }\n      if (!maxGroupedFillSize) {\n        maxGroupedFillSize = fillDirection === \"down-right\" ? parentScope.offsets.w : parentScope.offsets.h;\n      }\n      const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n      const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n      const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n      const size2 = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n      const levels2 = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n      const levelSize = `(((${maxGroupedFillSize}) / ${levels2}) - ${gap})`;\n      return { gap, levelSize, size: size2, squaresPerBand };\n    }\n    transformXY(gap, levelSize, squaresPerBand) {\n      const { names, prefix } = this;\n      const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n      const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n      const { fillDirection, parentScope } = this.props;\n      const tx2 = {\n        type: \"formula\",\n        expr: null,\n        as: `${prefix}_${FieldNames.OffsetX}`\n      };\n      const ty2 = {\n        type: \"formula\",\n        expr: null,\n        as: `${prefix}_${FieldNames.OffsetY}`\n      };\n      switch (fillDirection) {\n        case \"down-right\": {\n          tx2.expr = `${level} * (${levelSize} + ${gap})`;\n          ty2.expr = compartment;\n          break;\n        }\n        case \"right-up\": {\n          tx2.expr = compartment;\n          ty2.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n          break;\n        }\n        case \"right-down\":\n        default: {\n          tx2.expr = compartment;\n          ty2.expr = `${level} * (${levelSize} + ${gap})`;\n          break;\n        }\n      }\n      return { tx: tx2, ty: ty2 };\n    }\n  }\n  class Stack extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `stack_${this.id}`;\n      this.names = {\n        cube: `${p}_cube`,\n        globalDataName: `data_${p}_count`,\n        globalExtent: `${p}_global_extent`,\n        levelDataName: `data_${p}_level`,\n        count: `${p}_count`,\n        stack0: `${p}_stack0`,\n        stack1: `${p}_stack1`,\n        sequence: `data_${p}_sequence`,\n        sides: `${p}_sides`,\n        size: `${p}_size`,\n        squared: `${p}_squared`,\n        maxCount: `${p}_maxCount`,\n        maxLevels: `${p}_maxLevels`,\n        zScale: `${p}_zScale`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { globalScope, groupings, parentScope, showAxes, sort: sort2 } = props;\n      const { sizeSignals } = parentScope;\n      addTransforms(globalScope.data, {\n        type: \"joinaggregate\",\n        groupby: getGroupBy(groupings).map(safeFieldName),\n        ops: [\"count\"],\n        as: [names.count]\n      }, {\n        type: \"extent\",\n        field: names.count,\n        signal: names.globalExtent\n      }, Object.assign({ type: \"stack\", groupby: getGroupBy(groupings).map(safeFieldName), as: [names.stack0, names.stack1] }, sort2 && {\n        sort: {\n          field: safeFieldName(sort2.name),\n          order: \"ascending\"\n        }\n      }));\n      addData(globalScope.scope, {\n        name: names.sequence,\n        transform: [\n          {\n            type: \"sequence\",\n            start: 1,\n            stop: {\n              signal: `sqrt(${names.globalExtent}[1])`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.data * datum.data\",\n            as: \"squared\"\n          },\n          {\n            type: \"formula\",\n            expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n            as: \"maxlevels\"\n          },\n          {\n            type: \"formula\",\n            expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n            as: \"side\"\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.side * datum.maxlevels + datum.maxlevels - 1\",\n            as: \"sidecubeheight\"\n          },\n          {\n            type: \"formula\",\n            expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n            as: \"heightmatch\"\n          },\n          {\n            type: \"collect\",\n            sort: {\n              field: \"heightmatch\",\n              order: \"ascending\"\n            }\n          },\n          {\n            type: \"window\",\n            ops: [\"row_number\"]\n          },\n          {\n            type: \"filter\",\n            expr: \"datum.row_number === 1\"\n          }\n        ]\n      });\n      addSignals(globalScope.scope, {\n        name: names.size,\n        update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`\n      }, {\n        name: names.squared,\n        update: `data('${names.sequence}')[0].squared`\n      }, {\n        name: names.sides,\n        update: `sqrt(${names.squared})`\n      }, {\n        name: names.cube,\n        update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`\n      }, {\n        name: names.maxLevels,\n        update: `data('${names.sequence}')[0].maxlevels`\n      }, {\n        name: names.maxCount,\n        update: `${names.maxLevels} * ${names.squared}`\n      });\n      const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n      const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n      const cubeX = `(${layerOrdinal} % ${names.sides})`;\n      const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n      const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n      const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n        y: addOffsets(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n        h: names.size,\n        w: names.size\n      };\n      const mark = {\n        type: \"rect\",\n        from: { data: this.names.levelDataName },\n        encode: {\n          update: {\n            z: {\n              signal: `${zLevel} * (${names.cube} + 1)`\n            },\n            height: {\n              signal: names.cube\n            },\n            width: {\n              signal: names.cube\n            },\n            depth: {\n              signal: names.cube\n            }\n          }\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      const zScale = {\n        type: \"linear\",\n        name: names.zScale,\n        domain: [\n          0,\n          {\n            signal: names.maxCount\n          }\n        ],\n        range: [\n          0,\n          {\n            signal: `${names.maxLevels} * (${names.cube} + 1) - 1`\n          }\n        ],\n        nice: false\n      };\n      return {\n        offsets: offsets2,\n        mark,\n        sizeSignals: {\n          layoutHeight: names.size,\n          layoutWidth: names.size\n        },\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        },\n        encodingRuleMap: {\n          y: [{\n            test: testForCollapseSelection(),\n            signal: parentScope.offsets.y\n          }],\n          z: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }],\n          depth: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }],\n          height: [{\n            test: testForCollapseSelection(),\n            value: 0\n          }]\n        }\n      };\n    }\n  }\n  class Strip extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `strip_${this.id}`;\n      this.names = {\n        firstField: `${p}${FieldNames.First}`,\n        lastField: `${p}${FieldNames.Last}`,\n        valueField: `${p}${FieldNames.Value}`,\n        scale: `scale_${p}`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, prefix, props } = this;\n      const { addPercentageScale, globalScope, groupings, orientation, showAxes, size: size2, sort: sort2, sortOrder, parentScope, view, z } = props;\n      const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n      const horizontal = orientation === \"horizontal\";\n      const transform2 = [];\n      if (sort2) {\n        transform2.push({\n          type: \"collect\",\n          sort: {\n            field: safeFieldName(sort2.name),\n            order: sortOrder\n          }\n        });\n      }\n      let stackField;\n      if (size2) {\n        stackField = size2.name;\n        transform2.push({\n          type: \"filter\",\n          expr: `datum[${JSON.stringify(size2.name)}] > 0`\n        });\n      } else {\n        stackField = names.valueField;\n        transform2.push({\n          type: \"formula\",\n          expr: \"1\",\n          as: stackField\n        });\n      }\n      const stackTransform = {\n        type: \"stack\",\n        field: safeFieldName(stackField),\n        offset: \"normalize\",\n        as: [names.firstField, names.lastField]\n      };\n      if (groupings.length) {\n        stackTransform.groupby = getGroupBy(groupings).map(safeFieldName);\n      }\n      transform2.push(stackTransform);\n      addTransforms(globalScope.data, ...transform2);\n      const span2 = [names.lastField, names.firstField].map((f) => `datum[${JSON.stringify(f)}]`).join(\" - \");\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, horizontal ? `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})` : \"\"),\n        y: addOffsets(parentScope.offsets.y, horizontal ? \"\" : `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`),\n        h: horizontal ? parentScope.offsets.h : `(${span2}) * (${parentScope.offsets.h})`,\n        w: horizontal ? `(${span2}) * (${parentScope.offsets.w})` : parentScope.offsets.w\n      };\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: globalScope.markDataName },\n        encode: {\n          update: Object.assign({ height: {\n            signal: offsets2.h\n          }, width: {\n            signal: offsets2.w\n          } }, z && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(globalScope.markGroup, mark);\n      let percentageScale;\n      if (addPercentageScale) {\n        percentageScale = [{\n          type: \"linear\",\n          name: names.scale,\n          domain: [0, 100],\n          range: horizontal ? [\n            0,\n            {\n              signal: parentScope.sizeSignals.layoutWidth\n            }\n          ] : [\n            {\n              signal: parentScope.sizeSignals.layoutHeight\n            },\n            0\n          ]\n        }];\n      }\n      return {\n        globalScales: {\n          showAxes,\n          scales: {\n            x: horizontal ? percentageScale : void 0,\n            y: horizontal ? void 0 : percentageScale,\n            z: zScale && [zScale]\n          }\n        },\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        },\n        mark\n      };\n    }\n  }\n  class Treemap extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `treemap_${this.id}`;\n      this.names = {\n        dataName: `data_${p}`,\n        dataHeightWidth: `data_${p}_hw`,\n        dataExtents: `data_${p}_extents`,\n        dataFacet: `data_${p}_facet`,\n        dataFacetMark: `data_${p}_facetMark`,\n        fieldChildren: `${p}_children`,\n        fieldDepth: `${p}_depth`,\n        fieldX0: `${p}_x0`,\n        fieldX1: `${p}_x1`,\n        fieldY0: `${p}_y0`,\n        fieldY1: `${p}_y1`,\n        fieldHeight: `${p}_h`,\n        fieldWidth: `${p}_w`,\n        heightExtent: `${p}_heightExtent`,\n        widthExtent: `${p}_widthExtent`,\n        zScale: `scale_${p}_z`\n      };\n    }\n    build() {\n      const { names, props } = this;\n      const { globalScope, parentScope, showAxes, treeMapMethod, z } = props;\n      const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n      const offsets2 = {\n        x: addOffsets(parentScope.offsets.x, fn(names.fieldX0)),\n        y: addOffsets(parentScope.offsets.y, fn(names.fieldY0)),\n        h: subtract$1(names.fieldY1, names.fieldY0),\n        w: subtract$1(names.fieldX1, names.fieldX0)\n      };\n      const mark = this.transformedMark(offsets2);\n      addSignals(globalScope.scope, {\n        name: SignalNames.TreeMapMethod,\n        value: \"squarify\",\n        bind: {\n          name: treeMapMethod,\n          input: \"select\",\n          options: [\n            \"squarify\",\n            \"binary\"\n          ]\n        }\n      });\n      return Object.assign(Object.assign({}, z && {\n        globalScales: {\n          showAxes,\n          scales: {\n            z: [zScale]\n          }\n        }\n      }), {\n        mark,\n        offsets: offsets2,\n        sizeSignals: {\n          layoutHeight: null,\n          layoutWidth: null\n        }\n      });\n    }\n    transformedMark(offsets2) {\n      const { names, props } = this;\n      const { globalScope, groupings, parentScope } = props;\n      if (groupings.length) {\n        addData(globalScope.scope, {\n          name: names.dataHeightWidth,\n          source: globalScope.markDataName,\n          transform: [\n            {\n              type: \"formula\",\n              expr: parentScope.offsets.h,\n              as: names.fieldHeight\n            },\n            {\n              type: \"formula\",\n              expr: parentScope.offsets.w,\n              as: names.fieldWidth\n            }\n          ]\n        });\n        const treemapData = {\n          name: names.dataFacetMark,\n          source: names.dataFacet\n        };\n        const facets = {\n          type: \"group\",\n          from: {\n            facet: {\n              name: names.dataFacet,\n              data: names.dataHeightWidth,\n              groupby: getGroupBy(groupings).map(safeFieldName)\n            }\n          },\n          data: [\n            {\n              name: names.dataExtents,\n              source: names.dataFacet,\n              transform: [\n                {\n                  type: \"extent\",\n                  field: names.fieldHeight,\n                  signal: names.heightExtent\n                },\n                {\n                  type: \"extent\",\n                  field: names.fieldWidth,\n                  signal: names.widthExtent\n                }\n              ]\n            },\n            treemapData\n          ]\n        };\n        globalScope.setMarkDataName(names.dataFacetMark);\n        addMarks(globalScope.markGroup, facets);\n        globalScope.setMarkGroup(facets);\n        this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n        return this.addMark(offsets2, facets, globalScope.markDataName);\n      } else {\n        this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n        return this.addMark(offsets2, globalScope.markGroup, globalScope.markDataName);\n      }\n    }\n    addMark(offsets2, markParent, markDataName) {\n      const { names, prefix, props } = this;\n      const { view, z } = props;\n      const mark = {\n        name: prefix,\n        type: \"rect\",\n        from: { data: markDataName },\n        encode: {\n          update: Object.assign({ width: {\n            signal: offsets2.w\n          }, height: {\n            signal: offsets2.h\n          } }, z && {\n            z: { value: 0 },\n            depth: [\n              {\n                test: testForCollapseSelection(),\n                value: 0\n              },\n              view === \"3d\" ? {\n                scale: names.zScale,\n                field: safeFieldName(z.name)\n              } : {\n                value: 0\n              }\n            ]\n          })\n        }\n      };\n      addMarks(markParent, mark);\n      return mark;\n    }\n    treemapTransform(treemapData, widthSignal, heightSignal) {\n      const { names, props } = this;\n      const { group: group2, size: size2 } = props;\n      addTransforms(treemapData, {\n        type: \"filter\",\n        expr: `datum[${JSON.stringify(size2.name)}] > 0`\n      }, {\n        type: \"nest\",\n        keys: [group2 && group2.name || \"__NONE__\"]\n      }, {\n        type: \"treemap\",\n        field: safeFieldName(size2.name),\n        sort: { field: \"value\", order: \"descending\" },\n        round: true,\n        method: { signal: SignalNames.TreeMapMethod },\n        paddingInner: 1,\n        paddingOuter: 0,\n        size: [\n          { signal: widthSignal },\n          { signal: heightSignal }\n        ],\n        as: [\n          names.fieldX0,\n          names.fieldY0,\n          names.fieldX1,\n          names.fieldY1,\n          names.fieldDepth,\n          names.fieldChildren\n        ]\n      });\n    }\n  }\n  function fn(n) {\n    return `datum[${JSON.stringify(n)}]`;\n  }\n  function subtract$1(...fields) {\n    return fields.map((n) => fn(n)).join(\" - \");\n  }\n  class Wrap extends Layout {\n    constructor(props) {\n      super(props);\n      this.props = props;\n      const p = this.prefix = `wrap_${this.id}`;\n      this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n      this.names = {\n        outputData: `data_${p}_out`,\n        rowColumnDataName: `data_${p}_row_col`,\n        cellHeight: `${p}_cellHeight`,\n        cellWidth: `${p}_cellWidth`,\n        fits: `${p}_fits`,\n        target: `${p}_target`,\n        minArea: `${p}_minArea`,\n        aspect: `${p}_aspect`,\n        minAspect: `${p}_minAspect`,\n        idealAspect: `${p}_idealAspect`,\n        dataLength: `${p}_dataLength`,\n        rxc0: `${p}_rxc0`,\n        rxc1: `${p}_rxc1`,\n        rxc2: `${p}_rxc2`,\n        rxc: `${p}_rxc`,\n        growColCount: `${p}_growColCount`,\n        growCellWidth: `${p}_growCellWidth`,\n        fitsArea: `${p}_fitsArea`,\n        colCount: `${p}_colCount`\n      };\n    }\n    getGrouping() {\n      return this.bin.fields;\n    }\n    build() {\n      const { bin: bin2, names, prefix, props } = this;\n      const { axisTextColor, cellTitles, globalScope, parentScope } = props;\n      let ordinalBinData;\n      if (bin2.native === false) {\n        addSignals(globalScope.scope, ...bin2.signals);\n        addTransforms(globalScope.data, ...bin2.transforms);\n        addData(globalScope.scope, bin2.dataSequence);\n        addTransforms(bin2.dataSequence, {\n          type: \"formula\",\n          expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin2.fields[0])}, datum[${JSON.stringify(bin2.fields[0])}])`,\n          as: FieldNames.Contains\n        });\n        ordinalBinData = bin2.dataSequence.name;\n      } else {\n        const ord = createOrdinals(globalScope.data.name, prefix, bin2.fields, \"ascending\");\n        addData(globalScope.scope, ord.data);\n        ordinalBinData = ord.data.name;\n      }\n      addData(globalScope.scope, {\n        name: names.rxc0,\n        transform: [\n          {\n            type: \"sequence\",\n            start: 1,\n            stop: {\n              signal: `ceil(sqrt(${names.dataLength})) + 1`\n            }\n          },\n          {\n            type: \"formula\",\n            expr: `ceil(${names.dataLength} / datum.data)`,\n            as: \"complement\"\n          }\n        ]\n      }, {\n        name: names.rxc1,\n        source: names.rxc0,\n        transform: [\n          {\n            type: \"project\",\n            fields: [\"data\"],\n            as: [\"cols\"]\n          }\n        ]\n      }, {\n        name: names.rxc2,\n        source: names.rxc0,\n        transform: [\n          {\n            type: \"project\",\n            fields: [\"complement\"],\n            as: [\"cols\"]\n          }\n        ]\n      }, {\n        name: names.rxc,\n        source: [names.rxc1, names.rxc2],\n        transform: [\n          {\n            type: \"formula\",\n            expr: `ceil(${names.dataLength} / datum.cols)`,\n            as: \"rows\"\n          },\n          {\n            type: \"formula\",\n            expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n            as: \"cellw\"\n          },\n          {\n            type: \"formula\",\n            expr: `datum.cols === 1 ? max(datum.cellw, ${SignalNames.MinCellWidth}) : datum.cellw`,\n            as: \"cellw\"\n          },\n          {\n            type: \"formula\",\n            expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n            as: \"cellh\"\n          },\n          {\n            type: \"formula\",\n            expr: `datum.rows === 1 ? max(datum.cellh, ${SignalNames.MinCellHeight}) : datum.cellh`,\n            as: \"cellh\"\n          },\n          {\n            type: \"formula\",\n            expr: `(datum.cellw >= ${SignalNames.MinCellWidth} && datum.cellh >= ${SignalNames.MinCellHeight})`,\n            as: \"meetsmin\"\n          },\n          {\n            type: \"filter\",\n            expr: \"datum.meetsmin\"\n          },\n          {\n            type: \"formula\",\n            expr: \"datum.cellw / datum.cellh\",\n            as: names.aspect\n          },\n          {\n            type: \"formula\",\n            expr: `abs(datum.${names.aspect} - ${names.target})`,\n            as: names.idealAspect\n          },\n          {\n            type: \"formula\",\n            expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n            as: \"coverage\"\n          },\n          {\n            type: \"collect\",\n            sort: {\n              field: [names.idealAspect, \"coverage\"],\n              order: [\"ascending\", \"descending\"]\n            }\n          }\n        ]\n      }, {\n        name: names.rowColumnDataName,\n        source: ordinalBinData,\n        transform: [\n          {\n            type: \"formula\",\n            expr: `floor((datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) / ${names.colCount})`,\n            as: FieldNames.WrapRow\n          },\n          {\n            type: \"formula\",\n            expr: `(datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) % ${names.colCount}`,\n            as: FieldNames.WrapCol\n          },\n          {\n            type: \"formula\",\n            expr: serializeAsVegaExpression(bin2, FieldNames.First, FieldNames.Last),\n            as: FieldNames.FacetSearch\n          },\n          {\n            type: \"formula\",\n            expr: displayBin(bin2),\n            as: FieldNames.FacetTitle\n          }\n        ]\n      });\n      const dataOut = {\n        name: names.outputData,\n        source: globalScope.data.name,\n        transform: [\n          {\n            type: \"lookup\",\n            from: names.rowColumnDataName,\n            key: safeFieldName(bin2.fields[0]),\n            fields: [bin2.fields[0]].map(safeFieldName),\n            values: [FieldNames.WrapRow, FieldNames.WrapCol]\n          }\n        ]\n      };\n      addData(globalScope.scope, dataOut);\n      globalScope.setMarkDataName(names.outputData);\n      addSignals(globalScope.scope, {\n        name: names.minAspect,\n        update: `${SignalNames.MinCellWidth} / ${SignalNames.MinCellHeight}`\n      }, {\n        name: names.target,\n        update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`\n      }, {\n        name: names.minArea,\n        update: `${SignalNames.MinCellWidth}*${SignalNames.MinCellHeight}`\n      }, {\n        name: names.aspect,\n        update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`\n      }, {\n        name: names.dataLength,\n        update: `data(${JSON.stringify(ordinalBinData)}).length`\n      }, {\n        name: names.growColCount,\n        update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${SignalNames.MinCellWidth}), 1)`\n      }, {\n        name: names.growCellWidth,\n        update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`\n      }, {\n        name: names.fitsArea,\n        update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`\n      }, {\n        name: names.fits,\n        update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`\n      }, {\n        name: names.colCount,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`\n      }, {\n        name: names.cellWidth,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`\n      }, {\n        name: names.cellHeight,\n        update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${SignalNames.MinCellHeight}`\n      });\n      modifySignal(globalScope.signals.plotHeightOut, \"max\", `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n      modifySignal(globalScope.signals.plotWidthOut, \"max\", `(${names.cellWidth} * ${names.colCount})`);\n      const signalH = [names.cellHeight, SignalNames.FacetPaddingTop, SignalNames.FacetPaddingBottom].join(\" - \");\n      const signalW = [names.cellWidth, SignalNames.FacetPaddingLeft].join(\" - \");\n      const signalX = addOffsets(parentScope.offsets.x, `datum[${JSON.stringify(FieldNames.WrapCol)}] * ${names.cellWidth}`, SignalNames.FacetPaddingLeft);\n      const signalY = addOffsets(parentScope.offsets.y, `datum[${JSON.stringify(FieldNames.WrapRow)}] * ${names.cellHeight}`, SignalNames.FacetPaddingTop);\n      const update2 = {\n        height: {\n          signal: signalH\n        },\n        width: {\n          signal: signalW\n        },\n        x: {\n          signal: signalX\n        },\n        y: {\n          signal: signalY\n        }\n      };\n      const offsets2 = {\n        x: signalX,\n        y: signalY,\n        h: signalH,\n        w: signalW\n      };\n      const group2 = {\n        style: \"cell\",\n        name: prefix,\n        type: \"group\",\n        from: {\n          data: names.rowColumnDataName\n        },\n        encode: { update: update2 }\n      };\n      addMarks(globalScope.markGroup, group2);\n      const sizeSignals = {\n        layoutHeight: `(${names.cellHeight} - ${SignalNames.FacetPaddingTop} - ${SignalNames.FacetPaddingBottom})`,\n        layoutWidth: `(${names.cellWidth} - ${SignalNames.FacetPaddingLeft})`,\n        colCount: names.colCount,\n        rowCount: `ceil(${names.dataLength} / ${names.colCount})`\n      };\n      if (cellTitles) {\n        addFacetCellTitles(group2, sizeSignals, axisTextColor);\n      }\n      return {\n        facetScope: group2,\n        sizeSignals,\n        offsets: offsets2\n      };\n    }\n  }\n  const layoutClasses = {\n    AggregateContainer,\n    AggregateSquare,\n    Band,\n    Cross,\n    Scatter: Scatter$1,\n    Square,\n    Stack,\n    Strip,\n    Treemap,\n    Wrap\n  };\n  function getImageMark(backgroundImage, allGlobalScales) {\n    const xScale = allGlobalScales.filter((s) => s.scales.x)[0].scales.x[0];\n    const yScale = allGlobalScales.filter((s) => s.scales.y)[0].scales.y[0];\n    const [xScaleName, yScaleName] = [xScale, yScale].map((s) => s.name + (xScale.type === \"band\" ? bandScaleLinearSuffix : \"\"));\n    return {\n      type: \"image\",\n      encode: {\n        update: {\n          url: {\n            value: backgroundImage.url\n          },\n          aspect: {\n            value: false\n          },\n          baseline: {\n            value: \"bottom\"\n          },\n          height: {\n            signal: getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top)\n          },\n          y: {\n            signal: getScaledValue(yScaleName, backgroundImage.extents.bottom)\n          },\n          width: {\n            signal: getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left)\n          },\n          x: {\n            signal: getScaledValue(xScaleName, backgroundImage.extents.left)\n          }\n        }\n      }\n    };\n  }\n  function getScaledSpan(scaleName, low, high) {\n    return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n  }\n  function getScaledValue(scaleName, value2) {\n    return `scale('${scaleName}', ${value2})`;\n  }\n  class SpecBuilder {\n    constructor(props, specContext) {\n      this.props = props;\n      this.specContext = specContext;\n      this.globalSignals = {\n        facetAxesAdjustX: { name: SignalNames.FacetAxesAdjustX, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingLeft.toString() : \"0\" },\n        facetAxesAdjustY: { name: SignalNames.FacetAxesAdjustY, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingBottom.toString() : \"0\" },\n        minCellWidth: {\n          name: SignalNames.MinCellWidth,\n          update: `${minFacetWidth}`\n        },\n        minCellHeight: { name: SignalNames.MinCellHeight, update: `${minFacetHeight}` },\n        plotOffsetLeft: { name: SignalNames.PlotOffsetLeft, update: \"0\" },\n        plotOffsetTop: { name: SignalNames.PlotOffsetTop, update: \"0\" },\n        plotOffsetBottom: { name: SignalNames.PlotOffsetBottom, update: \"0\" },\n        plotOffsetRight: { name: SignalNames.PlotOffsetRight, update: \"0\" },\n        plotHeightOut: { name: SignalNames.PlotHeightOut, update: SignalNames.PlotHeightIn },\n        plotWidthOut: { name: SignalNames.PlotWidthOut, update: SignalNames.PlotWidthIn }\n      };\n    }\n    validate() {\n      const { specContext } = this;\n      const { specCapabilities } = this.props;\n      const { roles } = specCapabilities;\n      const required2 = roles.filter((r) => {\n        switch (typeof r.allowNone) {\n          case \"boolean\":\n            return !r.allowNone;\n          case \"undefined\":\n            return true;\n          case \"function\":\n            return !r.allowNone(specContext);\n        }\n      });\n      const numeric = roles.filter((r) => r.excludeCategoric);\n      const errors = required2.map((r) => {\n        if (specContext.specColumns[r.role]) {\n          return null;\n        } else {\n          return `Field ${r.role} is required.`;\n        }\n      }).concat(numeric.map((r) => {\n        if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) {\n          return `Field ${r.role} must be quantitative.`;\n        } else {\n          return null;\n        }\n      })).filter(Boolean);\n      const { backgroundImage } = specContext.insight;\n      if (backgroundImage && !backgroundImage.extents) {\n        errors.push(\"BackgroundImage must have extents.\");\n      }\n      return errors;\n    }\n    build() {\n      var _a, _b;\n      const { globalSignals, specContext } = this;\n      const { facetLayout, specCapabilities } = this.props;\n      const { insight: insight2, specColumns, specViewOptions } = specContext;\n      const dataName = \"data_source\";\n      const { vegaSpec, groupMark } = this.initSpec(dataName);\n      const { topColorField, colorDataName } = addColor({\n        scope: vegaSpec,\n        dataName,\n        specContext,\n        scaleName: ScaleNames.Color,\n        legendDataName: \"data_legend\",\n        topLookupName: \"data_topcolorlookup\",\n        colorReverseSignalName: SignalNames.ColorReverse\n      });\n      const globalScope = new GlobalScope({\n        dataName: colorDataName,\n        markGroup: groupMark,\n        scope: vegaSpec,\n        signals: globalSignals\n      });\n      if (facetLayout) {\n        addSignals(vegaSpec, {\n          name: SignalNames.FacetPaddingBottom,\n          update: `${facetLayout.facetPadding.bottom}`\n        }, {\n          name: SignalNames.FacetPaddingLeft,\n          update: `${facetLayout.facetPadding.left}`\n        }, {\n          name: SignalNames.FacetPaddingTop,\n          update: `${facetLayout.facetPadding.top}`\n        });\n        globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n        globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n      }\n      const { firstScope, finalScope, specResult, allGlobalScales, allEncodingRules } = this.iterateLayouts(globalScope, (i, innerScope) => {\n        if (facetLayout && i === 0) {\n          globalScope.zSize = innerScope.offsets.h;\n        }\n      });\n      if (specResult) {\n        return specResult;\n      }\n      if (allGlobalScales.length > 0) {\n        const plotHeightOut = globalSignals.plotHeightOut.name;\n        const plotWidthOut = globalSignals.plotWidthOut.name;\n        const colTitleScale = {\n          type: \"linear\",\n          name: \"scale_facet_col_title\",\n          domain: [0, 1],\n          range: [0, { signal: plotWidthOut }]\n        };\n        const rowTitleScale = {\n          type: \"linear\",\n          name: \"scale_facet_row_title\",\n          domain: [0, 1],\n          range: [{ signal: plotHeightOut }, 0]\n        };\n        const facetScope = facetLayout ? firstScope : null;\n        const backgroundGroup = facetLayout ? facetScope.facetScope : groupMark;\n        if (insight2.backgroundImage && specCapabilities.backgroundImage && ((_a = specColumns.x) === null || _a === void 0 ? void 0 : _a.quantitative) && ((_b = specColumns.y) === null || _b === void 0 ? void 0 : _b.quantitative)) {\n          if (!backgroundGroup.marks) {\n            backgroundGroup.marks = [];\n          }\n          const imageMark = getImageMark(insight2.backgroundImage, allGlobalScales);\n          backgroundGroup.marks.unshift(imageMark);\n        }\n        const axesScopes = facetLayout ? addFacetAxesGroupMarks({\n          globalScope: globalScope.scope,\n          plotScope: groupMark,\n          facetScope,\n          colTitleScale,\n          rowTitleScale,\n          colSeqName: \"data_FacetCellColTitles\",\n          rowSeqName: \"data_FacetCellRowTitles\"\n        }) : {\n          main: [{\n            scope: groupMark,\n            lines: true,\n            labels: true,\n            title: true\n          }]\n        };\n        addGlobalAxes({\n          globalScope,\n          allGlobalScales,\n          axisScales: this.props.axisScales,\n          plotOffsetSignals: { x: globalSignals.plotOffsetLeft, y: globalSignals.plotOffsetBottom },\n          axesOffsets: { x: axesOffsetX, y: axesOffsetY },\n          axesTitlePadding: facetLayout ? { x: axesTitlePaddingFacetX, y: axesTitlePaddingFacetY } : { x: axesTitlePaddingX, y: axesTitlePaddingY },\n          labelBaseline: { x: \"top\", y: \"middle\" },\n          specColumns,\n          specViewOptions,\n          axesScopes,\n          hideZAxis: !!facetLayout,\n          view: insight2.view\n        });\n      }\n      if (finalScope.mark) {\n        const { update: update2 } = finalScope.mark.encode;\n        const outputDataName = \"output\";\n        finalScope.mark.from.data = outputDataName;\n        addData(globalScope.markGroup, {\n          name: outputDataName,\n          source: globalScope.markDataName,\n          transform: [\n            {\n              type: \"formula\",\n              expr: finalScope.offsets.x,\n              as: FieldNames.OffsetX\n            },\n            {\n              type: \"formula\",\n              expr: finalScope.offsets.y,\n              as: FieldNames.OffsetY\n            }\n          ]\n        });\n        update2.x = {\n          field: FieldNames.OffsetX\n        };\n        update2.y = {\n          field: FieldNames.OffsetY\n        };\n        allEncodingRules.forEach((map2) => {\n          for (const key2 in map2) {\n            if (update2[key2]) {\n              const arrIn = map2[key2];\n              if (!Array.isArray(update2[key2])) {\n                const value2 = update2[key2];\n                const arrOut = [];\n                update2[key2] = arrOut;\n                arrIn.forEach((rule2) => arrOut.push(rule2));\n                arrOut.push(value2);\n              } else {\n                const arrOut = update2[key2];\n                arrIn.forEach((rule2) => arrOut.unshift(rule2));\n              }\n            }\n          }\n        });\n        update2.fill = fill(specContext, topColorField, ScaleNames.Color);\n        update2.opacity = opacity();\n      }\n      return {\n        specCapabilities,\n        vegaSpec\n      };\n    }\n    initSpec(dataName) {\n      const { globalSignals } = this;\n      const { facetAxesAdjustX, facetAxesAdjustY, minCellWidth, minCellHeight, plotOffsetLeft, plotOffsetBottom, plotOffsetTop, plotOffsetRight, plotHeightOut, plotWidthOut } = globalSignals;\n      const { specContext } = this;\n      const { insight: insight2 } = specContext;\n      const groupMark = {\n        type: \"group\",\n        //style: 'cell',\n        encode: {\n          update: {\n            x: { signal: `${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}` },\n            y: { signal: SignalNames.PlotOffsetTop },\n            height: { signal: `${SignalNames.PlotHeightOut} - ${SignalNames.FacetAxesAdjustY}` },\n            width: { signal: `${SignalNames.PlotWidthOut} + ${SignalNames.FacetAxesAdjustX}` }\n          }\n        }\n      };\n      const inputDataname = \"input\";\n      const vegaSpec = {\n        $schema: \"https://vega.github.io/schema/vega/v5.json\",\n        //style: 'cell',\n        data: [{ name: inputDataname }, { name: dataName, source: inputDataname, transform: [] }],\n        marks: [groupMark],\n        signals: textSignals(specContext, SignalNames.ViewportHeight).concat([\n          minCellWidth,\n          minCellHeight,\n          {\n            name: SignalNames.ViewportHeight,\n            update: `max(${SignalNames.MinCellHeight}, ${insight2.size.height})`\n          },\n          {\n            name: SignalNames.ViewportWidth,\n            update: `max(${SignalNames.MinCellWidth}, ${insight2.size.width})`\n          },\n          plotOffsetLeft,\n          plotOffsetTop,\n          plotOffsetBottom,\n          plotOffsetRight,\n          facetAxesAdjustX,\n          facetAxesAdjustY,\n          {\n            name: SignalNames.PlotHeightIn,\n            update: `${SignalNames.ViewportHeight} - ${SignalNames.PlotOffsetBottom} + ${SignalNames.FacetAxesAdjustY}`\n          },\n          {\n            name: SignalNames.PlotWidthIn,\n            update: `${SignalNames.ViewportWidth} - ${SignalNames.PlotOffsetLeft} - ${SignalNames.PlotOffsetRight}`\n          },\n          plotHeightOut,\n          plotWidthOut,\n          {\n            name: \"height\",\n            update: `${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut} + ${SignalNames.PlotOffsetBottom} - ${SignalNames.FacetAxesAdjustY}`\n          },\n          {\n            name: \"width\",\n            update: `${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotOffsetRight}`\n          }\n        ])\n      };\n      return { vegaSpec, groupMark };\n    }\n    iterateLayouts(globalScope, onLayoutBuild) {\n      let specResult;\n      let parentScope = {\n        sizeSignals: globalScope.sizeSignals,\n        offsets: globalScope.offsets\n      };\n      let firstScope;\n      let childScope;\n      const groupings = [];\n      const { layouts, specCapabilities } = this.props;\n      const allGlobalScales = [];\n      const allEncodingRules = [];\n      for (let i = 0; i < layouts.length; i++) {\n        if (!parentScope)\n          continue;\n        const buildProps = {\n          globalScope,\n          parentScope,\n          axesScales: this.props.axisScales,\n          groupings,\n          id: i\n        };\n        const layout = this.createLayout(layouts[i], buildProps);\n        try {\n          childScope = layout.build();\n          childScope.id = i;\n          const groupby = layout.getGrouping();\n          if (groupby) {\n            groupings.push({\n              id: i,\n              groupby,\n              fieldOps: [\n                { field: null, op: \"count\", as: FieldNames.Count }\n              ]\n            });\n          }\n          const sumOp = layout.getAggregateSumOp();\n          if (sumOp) {\n            groupings[groupings.length - 1].fieldOps.push(sumOp);\n          }\n          onLayoutBuild(i, childScope);\n        } catch (e) {\n          specResult = {\n            errors: [e.stack],\n            specCapabilities,\n            vegaSpec: null\n          };\n          break;\n        }\n        if (childScope && childScope.globalScales) {\n          allGlobalScales.push(childScope.globalScales);\n        }\n        if (childScope.encodingRuleMap) {\n          allEncodingRules.push(childScope.encodingRuleMap);\n        }\n        if (i === 0) {\n          firstScope = childScope;\n        }\n        parentScope = childScope;\n      }\n      return { firstScope, finalScope: parentScope, specResult, allGlobalScales, allEncodingRules };\n    }\n    createLayout(layoutPair, buildProps) {\n      const { layoutType, props } = layoutPair;\n      const layoutBuildProps = Object.assign(Object.assign({}, props), buildProps);\n      const layoutClass = layoutClasses[layoutType];\n      const layout = new layoutClass(layoutBuildProps);\n      layout.id = buildProps.id;\n      return layout;\n    }\n  }\n  function build(specContext, currData) {\n    const { specColumns } = specContext;\n    const columns = [\n      specColumns.color,\n      specColumns.facet,\n      specColumns.facetV,\n      specColumns.group,\n      specColumns.size,\n      specColumns.sort,\n      specColumns.x,\n      specColumns.y,\n      specColumns.z\n    ];\n    inferAll(columns, currData);\n    const specBuilderProps = getSpecBuilderPropsForChart(specContext);\n    const specBuilder = new SpecBuilder(specBuilderProps, specContext);\n    let specResult;\n    if (specBuilder) {\n      try {\n        const errors = specBuilder.validate();\n        if (errors.length) {\n          specResult = {\n            errors,\n            specCapabilities: specBuilderProps.specCapabilities,\n            vegaSpec: null\n          };\n        } else {\n          specResult = specBuilder.build();\n        }\n      } catch (e) {\n        specResult = {\n          specCapabilities: null,\n          vegaSpec: null,\n          errors: [e.stack]\n        };\n      }\n      if (!specResult.errors) {\n        const data0 = specResult.vegaSpec.data[0];\n        data0.values = currData;\n      }\n    } else {\n      specResult = {\n        specCapabilities: null,\n        vegaSpec: null,\n        errors: [`could not build spec for ${specContext.insight.chart}`]\n      };\n    }\n    return specResult;\n  }\n  const GL_ORDINAL = \"GL_ORDINAL\";\n  function isSearchExpressionGroup(search) {\n    if (!search) {\n      return false;\n    }\n    return !!search.expressions;\n  }\n  function createGroupFromExpression(input) {\n    const output2 = {\n      expressions: [input]\n    };\n    return output2;\n  }\n  function ensureSearchExpressionGroupArray(search) {\n    if (Array.isArray(search)) {\n      return [...search];\n    } else if (isSearchExpressionGroup(search)) {\n      return [search];\n    } else {\n      return [createGroupFromExpression(search)];\n    }\n  }\n  const expressionKeys = Object.keys({\n    clause: null,\n    name: null,\n    operator: null,\n    value: null\n  });\n  function compareExpression(a2, b2) {\n    if (a2 && b2) {\n      for (let k = 0; k < expressionKeys.length; k++) {\n        const key2 = expressionKeys[k];\n        if (a2[key2] != b2[key2])\n          return false;\n      }\n    } else {\n      return !a2 && !b2;\n    }\n    return true;\n  }\n  const groupKeys = Object.keys({\n    clause: null\n  });\n  function compareGroup(a2, b2) {\n    for (let k = 0; k < groupKeys.length; k++) {\n      const key2 = groupKeys[k];\n      if (a2[key2] != b2[key2])\n        return false;\n    }\n    if (!a2.expressions && !b2.expressions)\n      return true;\n    if (!a2.expressions || !b2.expressions)\n      return false;\n    if (a2.expressions.length != b2.expressions.length)\n      return false;\n    for (let i = 0; i < a2.expressions.length; i++) {\n      if (!compareExpression(a2.expressions[i], b2.expressions[i]))\n        return false;\n    }\n    return true;\n  }\n  function compare(a2, b2) {\n    if (a2 == b2)\n      return true;\n    if (!a2 || !b2)\n      return false;\n    const arrs = [a2, b2].map(ensureSearchExpressionGroupArray);\n    const [arrA, arrB] = arrs;\n    if (arrA.length != arrB.length)\n      return false;\n    for (let i = 0; i < arrA.length; i++) {\n      if (!compareGroup(arrA[i], arrB[i]))\n        return false;\n    }\n    return true;\n  }\n  function valueToBoolean(value2) {\n    if (typeof value2 === \"string\") {\n      switch (value2.toLowerCase()) {\n        case \"true\":\n          return true;\n        case \"false\":\n          return false;\n      }\n    }\n    return !!value2;\n  }\n  function valueToString(value2) {\n    if (value2 == null) {\n      return \"\";\n    }\n    switch (typeof value2) {\n      case \"string\":\n        return value2;\n      case \"boolean\":\n      case \"number\":\n        return value2.toString();\n    }\n    return \"\";\n  }\n  function isStringOperation(ex) {\n    switch (ex.operator) {\n      case \"contains\":\n      case \"!contains\":\n      case \"starts\":\n      case \"!starts\":\n        return true;\n    }\n    return false;\n  }\n  function isnullorEmpty(value2) {\n    if (value2 == null)\n      return true;\n    if (typeof value2 === \"string\" && value2.length === 0)\n      return true;\n    return false;\n  }\n  class Exec {\n    constructor(search, columns) {\n      this.columns = columns;\n      this.groups = ensureSearchExpressionGroupArray(search).map((g) => {\n        const expressions = g.expressions.filter(Boolean);\n        expressions.forEach((ex) => {\n          ex.column = this.getColumn(ex.name);\n          ex.valueBool = valueToBoolean(ex.value);\n          ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n          ex.stringOperation = isStringOperation(ex);\n        });\n        const group2 = Object.assign(Object.assign({}, g), { expressions });\n        return group2;\n      });\n    }\n    getColumn(name) {\n      for (let i = 0; i < this.columns.length; i++) {\n        if (this.columns[i].name == name) {\n          return this.columns[i];\n        }\n      }\n    }\n    runExpressionOnColumn(datum2, ex) {\n      const actualDataValue = datum2[ex.name];\n      if (ex.operator === \"isnullorEmpty\") {\n        return isnullorEmpty(actualDataValue);\n      } else if (ex.operator === \"!isnullorEmpty\") {\n        return !isnullorEmpty(actualDataValue);\n      }\n      let dataValue = actualDataValue;\n      let expressionValue = ex.value;\n      if (ex.column) {\n        if (ex.column.type === \"string\" || ex.stringOperation) {\n          dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n          expressionValue = ex.valueLow;\n        } else if (ex.column.type === \"boolean\") {\n          dataValue = valueToBoolean(actualDataValue);\n          expressionValue = ex.valueBool;\n        } else if (ex.column.quantitative) {\n          dataValue = +actualDataValue;\n          expressionValue = +ex.value;\n        }\n      }\n      switch (ex.operator) {\n        case \"!=\":\n          return dataValue != expressionValue;\n        case \"<\":\n          return dataValue < expressionValue;\n        case \"<=\":\n          return dataValue <= expressionValue;\n        case \"==\":\n          return dataValue == expressionValue;\n        case \">\":\n          return dataValue > expressionValue;\n        case \">=\":\n          return dataValue >= expressionValue;\n        case \"contains\":\n          return dataValue.indexOf(expressionValue) >= 0;\n        case \"!contains\":\n          return dataValue.indexOf(expressionValue) < 0;\n        case \"starts\":\n          return dataValue.indexOf(expressionValue) == 0;\n        case \"!starts\":\n          return dataValue.indexOf(expressionValue) !== 0;\n      }\n    }\n    runExpression(datum2, ex) {\n      if (ex.name == null) {\n        const group2 = {\n          expressions: this.columns.map((column, i) => {\n            const ex2 = Object.assign(Object.assign({}, ex), { column, name: column.name });\n            if (i) {\n              ex2.clause = \"||\";\n            }\n            return ex2;\n          })\n        };\n        return this.runGroup(datum2, group2);\n      } else {\n        return this.runExpressionOnColumn(datum2, ex);\n      }\n    }\n    runGroup(datum2, group2) {\n      let accumulator = this.runExpression(datum2, group2.expressions[0]);\n      for (let i = 1; i < group2.expressions.length; i++) {\n        const ex = group2.expressions[i];\n        switch (ex.clause) {\n          case \"&&\":\n            accumulator = accumulator && this.runExpression(datum2, ex);\n            break;\n          case \"||\":\n            accumulator = accumulator || this.runExpression(datum2, ex);\n            break;\n        }\n      }\n      return accumulator;\n    }\n    run(datum2) {\n      let accumulator = this.runGroup(datum2, this.groups[0]);\n      for (let i = 1; i < this.groups.length; i++) {\n        const group2 = this.groups[i];\n        switch (group2.clause) {\n          case \"&&\":\n            accumulator = accumulator && this.runGroup(datum2, group2);\n            break;\n          case \"||\":\n            accumulator = accumulator || this.runGroup(datum2, group2);\n            break;\n        }\n      }\n      return accumulator;\n    }\n  }\n  function invertSearchExpressionGroup(input) {\n    const output2 = {\n      expressions: input.expressions.map(invertSearchExpression)\n    };\n    if (input.clause) {\n      output2.clause = invertedClauses[input.clause];\n    }\n    return output2;\n  }\n  const invertedOperators = {\n    \"!=\": \"==\",\n    \"==\": \"!=\",\n    \"<\": \">=\",\n    \">=\": \"<\",\n    \"<=\": \">\",\n    \">\": \"<=\",\n    \"!contains\": \"contains\",\n    \"contains\": \"!contains\",\n    \"!isnullorEmpty\": \"isnullorEmpty\",\n    \"isnullorEmpty\": \"!isnullorEmpty\",\n    \"!starts\": \"starts\",\n    \"starts\": \"!starts\"\n  };\n  const invertedClauses = {\n    \"&&\": \"||\",\n    \"||\": \"&&\"\n  };\n  function invertSearchExpression(input) {\n    const operator2 = invertedOperators[input.operator];\n    const output2 = Object.assign(Object.assign({}, input), { operator: operator2 });\n    if (input.clause) {\n      output2.clause = invertedClauses[input.clause];\n    }\n    return output2;\n  }\n  function invert$1(search) {\n    if (Array.isArray(search)) {\n      return search.map(invertSearchExpressionGroup);\n    } else if (isSearchExpressionGroup(search)) {\n      return invertSearchExpressionGroup(search);\n    } else {\n      return invertSearchExpression(search);\n    }\n  }\n  function narrow(a2, b2) {\n    if (!a2) {\n      return b2;\n    }\n    const arrs = [a2, b2].map(ensureSearchExpressionGroupArray);\n    const [arrA, arrB] = arrs;\n    arrB[0].clause = \"&&\";\n    return arrA.concat(arrB);\n  }\n  const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n  function decamelize(str, separator = \"-\") {\n    return str.replace(/([a-z\\d])([A-Z])/g, \"$1\" + separator + \"$2\").replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, \"$1\" + separator + \"$2\").toLowerCase();\n  }\n  function createElement(tag, attrs, ...children2) {\n    if (typeof tag === \"function\") {\n      const fn2 = tag;\n      let props = attrs;\n      if (props === null || props === void 0) {\n        props = { children: children2 };\n      } else {\n        props.children = children2;\n      }\n      return fn2(props);\n    } else {\n      const ns = tag === \"svg\" ? SVG_NAMESPACE : null;\n      const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n      const map2 = attrs;\n      let ref2;\n      for (let name in map2) {\n        if (name && map2.hasOwnProperty(name)) {\n          let value2 = map2[name];\n          if (name === \"className\" && value2 !== void 0) {\n            setAttribute(el, ns, \"class\", value2.toString());\n          } else if (name === \"disabled\" && !value2) ;\n          else if (value2 === null || value2 === void 0) {\n            continue;\n          } else if (value2 === true) {\n            setAttribute(el, ns, name, name);\n          } else if (typeof value2 === \"function\") {\n            if (name === \"ref\") {\n              ref2 = value2;\n            } else {\n              el[name.toLowerCase()] = value2;\n            }\n          } else if (typeof value2 === \"object\") {\n            setAttribute(el, ns, name, flatten(value2));\n          } else {\n            setAttribute(el, ns, name, value2.toString());\n          }\n        }\n      }\n      if (children2 && children2.length > 0) {\n        appendChildren(el, children2);\n      }\n      if (ref2) {\n        ref2(el);\n      }\n      return el;\n    }\n  }\n  function setAttribute(el, ns, name, value2) {\n    if (ns) {\n      el.setAttributeNS(null, name, value2);\n    } else {\n      el.setAttribute(name, value2);\n    }\n  }\n  function flatten(o) {\n    const arr = [];\n    for (let prop in o)\n      arr.push(`${decamelize(prop, \"-\")}:${o[prop]}`);\n    return arr.join(\";\");\n  }\n  function isInsideForeignObject(element2) {\n    let current = element2;\n    while (current) {\n      if (current.tagName.toLowerCase() === \"foreignobject\") {\n        return true;\n      }\n      current = current.parentElement;\n    }\n    return false;\n  }\n  function recreateWithSvgNamespace(element2) {\n    const svgElement = document.createElementNS(SVG_NAMESPACE, element2.tagName.toLowerCase());\n    for (let i = 0; i < element2.attributes.length; i++) {\n      const attr2 = element2.attributes[i];\n      svgElement.setAttributeNS(null, attr2.name, attr2.value);\n    }\n    const eventProperties = [\n      \"onclick\",\n      \"onmousedown\",\n      \"onmouseup\",\n      \"onmouseover\",\n      \"onmouseout\",\n      \"onmousemove\",\n      \"onkeydown\",\n      \"onkeyup\",\n      \"onkeypress\",\n      \"onfocus\",\n      \"onblur\"\n    ];\n    for (const prop of eventProperties) {\n      if (element2[prop]) {\n        svgElement[prop] = element2[prop];\n      }\n    }\n    for (let i = 0; i < element2.childNodes.length; i++) {\n      const child = element2.childNodes[i];\n      if (child.nodeType === Node.ELEMENT_NODE) {\n        svgElement.appendChild(recreateWithSvgNamespace(child));\n      } else {\n        svgElement.appendChild(child.cloneNode(true));\n      }\n    }\n    return svgElement;\n  }\n  function addChild(parentElement, child) {\n    if (child === null || child === void 0 || typeof child === \"boolean\") {\n      return;\n    } else if (Array.isArray(child)) {\n      appendChildren(parentElement, child);\n    } else if (isElement(child)) {\n      const childEl = child;\n      if (parentElement.namespaceURI === SVG_NAMESPACE && childEl.namespaceURI !== SVG_NAMESPACE && childEl.tagName.toLowerCase() !== \"foreignobject\" && !isInsideForeignObject(parentElement)) {\n        const recreated = recreateWithSvgNamespace(childEl);\n        parentElement.appendChild(recreated);\n      } else {\n        parentElement.appendChild(childEl);\n      }\n    } else {\n      parentElement.appendChild(document.createTextNode(child.toString()));\n    }\n  }\n  function appendChildren(parentElement, children2) {\n    children2.forEach((child) => addChild(parentElement, child));\n  }\n  function isElement(el) {\n    return !!el.nodeType;\n  }\n  function mount(element2, container) {\n    container.innerHTML = \"\";\n    if (element2) {\n      addChild(container, element2);\n    }\n  }\n  function findElementByChildPositions(childPositions, container) {\n    let element2 = container || document.body;\n    let childPosition;\n    while (element2 && childPositions.length) {\n      childPosition = childPositions.shift();\n      element2 = element2.children.item(childPosition);\n    }\n    if (element2) {\n      return element2;\n    }\n  }\n  function focusActiveElement(element2, activeElementInfo) {\n    element2.focus();\n    element2.scrollTop = activeElementInfo.scrollTop;\n    const input = element2;\n    if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) {\n      input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n    }\n  }\n  function setActiveElement(activeElementInfo, container) {\n    if (activeElementInfo) {\n      const element2 = findElementByChildPositions(activeElementInfo.childPositions, container);\n      if (element2) {\n        focusActiveElement(element2, activeElementInfo);\n      }\n    }\n  }\n  function getActiveElementInfo(container) {\n    let element2 = document.activeElement;\n    const { scrollTop, selectionDirection, selectionEnd, selectionStart } = element2;\n    const activeElementInfo = {\n      childPositions: [],\n      scrollTop,\n      selectionDirection,\n      selectionEnd,\n      selectionStart\n    };\n    while (element2 && element2 !== document.body && element2 !== container) {\n      activeElementInfo.childPositions.unshift(getChildPosition(element2));\n      element2 = element2.parentElement;\n    }\n    if ((element2 === document.body || element2 === container) && activeElementInfo.childPositions.length)\n      return activeElementInfo;\n  }\n  function getChildPosition(element2) {\n    let childPosition = 0;\n    while (element2 = element2.previousElementSibling)\n      childPosition++;\n    return childPosition;\n  }\n  const KeyCodes = {\n    ENTER: \"Enter\"\n  };\n  const Table$1 = (props) => {\n    return createElement(\n      \"table\",\n      { className: props.className },\n      props.children,\n      props.rows.map((row, i) => createElement(\"tr\", { className: props.rowClassName || \"\", onClick: (e) => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: (e) => {\n        if (e.key === KeyCodes.ENTER && props.onRowClick) {\n          props.onRowClick(e, i);\n        }\n      } }, row.cells.map((cell2, i2) => createElement(\"td\", { className: cell2.className || \"\", title: cell2.title || \"\" }, cell2.content))))\n    );\n  };\n  const controls = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Table: Table$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var EPSILON = 1e-6;\n  var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\n  function setMatrixArrayType(type2) {\n    ARRAY_TYPE = type2;\n  }\n  function create$5() {\n    var out = new ARRAY_TYPE(9);\n    if (ARRAY_TYPE != Float32Array) {\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[5] = 0;\n      out[6] = 0;\n      out[7] = 0;\n    }\n    out[0] = 1;\n    out[4] = 1;\n    out[8] = 1;\n    return out;\n  }\n  function fromMat4(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[4];\n    out[4] = a2[5];\n    out[5] = a2[6];\n    out[6] = a2[8];\n    out[7] = a2[9];\n    out[8] = a2[10];\n    return out;\n  }\n  function fromValues$5(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n  }\n  function fromQuat$1(out, q) {\n    var x2 = q[0], y2 = q[1], z = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z2 = z + z;\n    var xx = x2 * x22;\n    var yx = y2 * x22;\n    var yy = y2 * y22;\n    var zx = z * x22;\n    var zy = z * y22;\n    var zz = z * z2;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z2;\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n    return out;\n  }\n  function create$4() {\n    var out = new ARRAY_TYPE(16);\n    if (ARRAY_TYPE != Float32Array) {\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n    }\n    out[0] = 1;\n    out[5] = 1;\n    out[10] = 1;\n    out[15] = 1;\n    return out;\n  }\n  function copy$4(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    out[4] = a2[4];\n    out[5] = a2[5];\n    out[6] = a2[6];\n    out[7] = a2[7];\n    out[8] = a2[8];\n    out[9] = a2[9];\n    out[10] = a2[10];\n    out[11] = a2[11];\n    out[12] = a2[12];\n    out[13] = a2[13];\n    out[14] = a2[14];\n    out[15] = a2[15];\n    return out;\n  }\n  function fromValues$4(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n  }\n  function identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function invert(out, a2) {\n    var a00 = a2[0], a01 = a2[1], a02 = a2[2], a03 = a2[3];\n    var a10 = a2[4], a11 = a2[5], a12 = a2[6], a13 = a2[7];\n    var a20 = a2[8], a21 = a2[9], a22 = a2[10], a23 = a2[11];\n    var a30 = a2[12], a31 = a2[13], a32 = a2[14], a33 = a2[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32;\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) {\n      return null;\n    }\n    det = 1 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n    return out;\n  }\n  function multiply$2(out, a2, b2) {\n    var a00 = a2[0], a01 = a2[1], a02 = a2[2], a03 = a2[3];\n    var a10 = a2[4], a11 = a2[5], a12 = a2[6], a13 = a2[7];\n    var a20 = a2[8], a21 = a2[9], a22 = a2[10], a23 = a2[11];\n    var a30 = a2[12], a31 = a2[13], a32 = a2[14], a33 = a2[15];\n    var b0 = b2[0], b1 = b2[1], b22 = b2[2], b3 = b2[3];\n    out[0] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[4];\n    b1 = b2[5];\n    b22 = b2[6];\n    b3 = b2[7];\n    out[4] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[8];\n    b1 = b2[9];\n    b22 = b2[10];\n    b3 = b2[11];\n    out[8] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[12];\n    b1 = b2[13];\n    b22 = b2[14];\n    b3 = b2[15];\n    out[12] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    return out;\n  }\n  function translate(out, a2, v) {\n    var x2 = v[0], y2 = v[1], z = v[2];\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    if (a2 === out) {\n      out[12] = a2[0] * x2 + a2[4] * y2 + a2[8] * z + a2[12];\n      out[13] = a2[1] * x2 + a2[5] * y2 + a2[9] * z + a2[13];\n      out[14] = a2[2] * x2 + a2[6] * y2 + a2[10] * z + a2[14];\n      out[15] = a2[3] * x2 + a2[7] * y2 + a2[11] * z + a2[15];\n    } else {\n      a00 = a2[0];\n      a01 = a2[1];\n      a02 = a2[2];\n      a03 = a2[3];\n      a10 = a2[4];\n      a11 = a2[5];\n      a12 = a2[6];\n      a13 = a2[7];\n      a20 = a2[8];\n      a21 = a2[9];\n      a22 = a2[10];\n      a23 = a2[11];\n      out[0] = a00;\n      out[1] = a01;\n      out[2] = a02;\n      out[3] = a03;\n      out[4] = a10;\n      out[5] = a11;\n      out[6] = a12;\n      out[7] = a13;\n      out[8] = a20;\n      out[9] = a21;\n      out[10] = a22;\n      out[11] = a23;\n      out[12] = a00 * x2 + a10 * y2 + a20 * z + a2[12];\n      out[13] = a01 * x2 + a11 * y2 + a21 * z + a2[13];\n      out[14] = a02 * x2 + a12 * y2 + a22 * z + a2[14];\n      out[15] = a03 * x2 + a13 * y2 + a23 * z + a2[15];\n    }\n    return out;\n  }\n  function scale$1(out, a2, v) {\n    var x2 = v[0], y2 = v[1], z = v[2];\n    out[0] = a2[0] * x2;\n    out[1] = a2[1] * x2;\n    out[2] = a2[2] * x2;\n    out[3] = a2[3] * x2;\n    out[4] = a2[4] * y2;\n    out[5] = a2[5] * y2;\n    out[6] = a2[6] * y2;\n    out[7] = a2[7] * y2;\n    out[8] = a2[8] * z;\n    out[9] = a2[9] * z;\n    out[10] = a2[10] * z;\n    out[11] = a2[11] * z;\n    out[12] = a2[12];\n    out[13] = a2[13];\n    out[14] = a2[14];\n    out[15] = a2[15];\n    return out;\n  }\n  function fromScaling(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function fromRotationTranslationScale(out, q, v, s) {\n    var x2 = q[0], y2 = q[1], z = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z2 = z + z;\n    var xx = x2 * x22;\n    var xy = x2 * y22;\n    var xz = x2 * z2;\n    var yy = y2 * y22;\n    var yz = y2 * z2;\n    var zz = z * z2;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz2 = s[2];\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz2;\n    out[9] = (yz - wx) * sz2;\n    out[10] = (1 - (xx + yy)) * sz2;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n  }\n  function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n    var x2 = q[0], y2 = q[1], z = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z2 = z + z;\n    var xx = x2 * x22;\n    var xy = x2 * y22;\n    var xz = x2 * z2;\n    var yy = y2 * y22;\n    var yz = y2 * z2;\n    var zz = z * z2;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz2 = s[2];\n    var ox = o[0];\n    var oy = o[1];\n    var oz = o[2];\n    var out0 = (1 - (yy + zz)) * sx;\n    var out1 = (xy + wz) * sx;\n    var out2 = (xz - wy) * sx;\n    var out4 = (xy - wz) * sy;\n    var out5 = (1 - (xx + zz)) * sy;\n    var out6 = (yz + wx) * sy;\n    var out8 = (xz + wy) * sz2;\n    var out9 = (yz - wx) * sz2;\n    var out10 = (1 - (xx + yy)) * sz2;\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = 0;\n    out[4] = out4;\n    out[5] = out5;\n    out[6] = out6;\n    out[7] = 0;\n    out[8] = out8;\n    out[9] = out9;\n    out[10] = out10;\n    out[11] = 0;\n    out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n    out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n    out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n    out[15] = 1;\n    return out;\n  }\n  function fromQuat(out, q) {\n    var x2 = q[0], y2 = q[1], z = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z2 = z + z;\n    var xx = x2 * x22;\n    var yx = y2 * x22;\n    var yy = y2 * y22;\n    var zx = z * x22;\n    var zy = z * y22;\n    var zz = z * z2;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z2;\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function frustum(out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left);\n    var tb = 1 / (top - bottom);\n    var nf = 1 / (near - far);\n    out[0] = near * 2 * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = near * 2 * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = far * near * 2 * nf;\n    out[15] = 0;\n    return out;\n  }\n  function perspectiveNO(out, fovy, aspect, near, far) {\n    var f = 1 / Math.tan(fovy / 2);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n      var nf = 1 / (near - far);\n      out[10] = (far + near) * nf;\n      out[14] = 2 * far * near * nf;\n    } else {\n      out[10] = -1;\n      out[14] = -2 * near;\n    }\n    return out;\n  }\n  var perspective = perspectiveNO;\n  function lookAt(out, eye, center, up) {\n    var x02, x12, x2, y02, y12, y2, z02, z1, z2, len2;\n    var eyex = eye[0];\n    var eyey = eye[1];\n    var eyez = eye[2];\n    var upx = up[0];\n    var upy = up[1];\n    var upz = up[2];\n    var centerx = center[0];\n    var centery = center[1];\n    var centerz = center[2];\n    if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) {\n      return identity(out);\n    }\n    z02 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n    len2 = 1 / Math.sqrt(z02 * z02 + z1 * z1 + z2 * z2);\n    z02 *= len2;\n    z1 *= len2;\n    z2 *= len2;\n    x02 = upy * z2 - upz * z1;\n    x12 = upz * z02 - upx * z2;\n    x2 = upx * z1 - upy * z02;\n    len2 = Math.sqrt(x02 * x02 + x12 * x12 + x2 * x2);\n    if (!len2) {\n      x02 = 0;\n      x12 = 0;\n      x2 = 0;\n    } else {\n      len2 = 1 / len2;\n      x02 *= len2;\n      x12 *= len2;\n      x2 *= len2;\n    }\n    y02 = z1 * x2 - z2 * x12;\n    y12 = z2 * x02 - z02 * x2;\n    y2 = z02 * x12 - z1 * x02;\n    len2 = Math.sqrt(y02 * y02 + y12 * y12 + y2 * y2);\n    if (!len2) {\n      y02 = 0;\n      y12 = 0;\n      y2 = 0;\n    } else {\n      len2 = 1 / len2;\n      y02 *= len2;\n      y12 *= len2;\n      y2 *= len2;\n    }\n    out[0] = x02;\n    out[1] = y02;\n    out[2] = z02;\n    out[3] = 0;\n    out[4] = x12;\n    out[5] = y12;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x02 * eyex + x12 * eyey + x2 * eyez);\n    out[13] = -(y02 * eyex + y12 * eyey + y2 * eyez);\n    out[14] = -(z02 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n    return out;\n  }\n  var mul = multiply$2;\n  function create$3() {\n    var out = new ARRAY_TYPE(3);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    return out;\n  }\n  function clone$4(a2) {\n    var out = new ARRAY_TYPE(3);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    return out;\n  }\n  function length(a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z = a2[2];\n    return Math.sqrt(x2 * x2 + y2 * y2 + z * z);\n  }\n  function fromValues$3(x2, y2, z) {\n    var out = new ARRAY_TYPE(3);\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z;\n    return out;\n  }\n  function copy$3(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    return out;\n  }\n  function set$3(out, x2, y2, z) {\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z;\n    return out;\n  }\n  function add(out, a2, b2) {\n    out[0] = a2[0] + b2[0];\n    out[1] = a2[1] + b2[1];\n    out[2] = a2[2] + b2[2];\n    return out;\n  }\n  function subtract(out, a2, b2) {\n    out[0] = a2[0] - b2[0];\n    out[1] = a2[1] - b2[1];\n    out[2] = a2[2] - b2[2];\n    return out;\n  }\n  function multiply$1(out, a2, b2) {\n    out[0] = a2[0] * b2[0];\n    out[1] = a2[1] * b2[1];\n    out[2] = a2[2] * b2[2];\n    return out;\n  }\n  function min(out, a2, b2) {\n    out[0] = Math.min(a2[0], b2[0]);\n    out[1] = Math.min(a2[1], b2[1]);\n    out[2] = Math.min(a2[2], b2[2]);\n    return out;\n  }\n  function max(out, a2, b2) {\n    out[0] = Math.max(a2[0], b2[0]);\n    out[1] = Math.max(a2[1], b2[1]);\n    out[2] = Math.max(a2[2], b2[2]);\n    return out;\n  }\n  function scale(out, a2, b2) {\n    out[0] = a2[0] * b2;\n    out[1] = a2[1] * b2;\n    out[2] = a2[2] * b2;\n    return out;\n  }\n  function scaleAndAdd(out, a2, b2, scale2) {\n    out[0] = a2[0] + b2[0] * scale2;\n    out[1] = a2[1] + b2[1] * scale2;\n    out[2] = a2[2] + b2[2] * scale2;\n    return out;\n  }\n  function distance(a2, b2) {\n    var x2 = b2[0] - a2[0];\n    var y2 = b2[1] - a2[1];\n    var z = b2[2] - a2[2];\n    return Math.sqrt(x2 * x2 + y2 * y2 + z * z);\n  }\n  function squaredDistance(a2, b2) {\n    var x2 = b2[0] - a2[0];\n    var y2 = b2[1] - a2[1];\n    var z = b2[2] - a2[2];\n    return x2 * x2 + y2 * y2 + z * z;\n  }\n  function squaredLength(a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z = a2[2];\n    return x2 * x2 + y2 * y2 + z * z;\n  }\n  function negate(out, a2) {\n    out[0] = -a2[0];\n    out[1] = -a2[1];\n    out[2] = -a2[2];\n    return out;\n  }\n  function normalize$2(out, a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z = a2[2];\n    var len2 = x2 * x2 + y2 * y2 + z * z;\n    if (len2 > 0) {\n      len2 = 1 / Math.sqrt(len2);\n    }\n    out[0] = a2[0] * len2;\n    out[1] = a2[1] * len2;\n    out[2] = a2[2] * len2;\n    return out;\n  }\n  function dot$1(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];\n  }\n  function cross(out, a2, b2) {\n    var ax = a2[0], ay = a2[1], az = a2[2];\n    var bx = b2[0], by = b2[1], bz = b2[2];\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n  }\n  function lerp(out, a2, b2, t) {\n    var ax = a2[0];\n    var ay = a2[1];\n    var az = a2[2];\n    out[0] = ax + t * (b2[0] - ax);\n    out[1] = ay + t * (b2[1] - ay);\n    out[2] = az + t * (b2[2] - az);\n    return out;\n  }\n  function transformMat4$2(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z = a2[2];\n    var w2 = m2[3] * x2 + m2[7] * y2 + m2[11] * z + m2[15];\n    w2 = w2 || 1;\n    out[0] = (m2[0] * x2 + m2[4] * y2 + m2[8] * z + m2[12]) / w2;\n    out[1] = (m2[1] * x2 + m2[5] * y2 + m2[9] * z + m2[13]) / w2;\n    out[2] = (m2[2] * x2 + m2[6] * y2 + m2[10] * z + m2[14]) / w2;\n    return out;\n  }\n  function transformMat3(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z = a2[2];\n    out[0] = x2 * m2[0] + y2 * m2[3] + z * m2[6];\n    out[1] = x2 * m2[1] + y2 * m2[4] + z * m2[7];\n    out[2] = x2 * m2[2] + y2 * m2[5] + z * m2[8];\n    return out;\n  }\n  function transformQuat(out, a2, q) {\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3];\n    var vx = a2[0], vy = a2[1], vz = a2[2];\n    var tx2 = qy * vz - qz * vy;\n    var ty2 = qz * vx - qx * vz;\n    var tz = qx * vy - qy * vx;\n    tx2 = tx2 + tx2;\n    ty2 = ty2 + ty2;\n    tz = tz + tz;\n    out[0] = vx + qw * tx2 + qy * tz - qz * ty2;\n    out[1] = vy + qw * ty2 + qz * tx2 - qx * tz;\n    out[2] = vz + qw * tz + qx * ty2 - qy * tx2;\n    return out;\n  }\n  function exactEquals$1(a2, b2) {\n    return a2[0] === b2[0] && a2[1] === b2[1] && a2[2] === b2[2];\n  }\n  function equals$2(a2, b2) {\n    var a0 = a2[0], a1 = a2[1], a22 = a2[2];\n    var b0 = b2[0], b1 = b2[1], b22 = b2[2];\n    return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a22 - b22) <= EPSILON * Math.max(1, Math.abs(a22), Math.abs(b22));\n  }\n  var len = length;\n  (function() {\n    var vec2 = create$3();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 3;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        vec2[2] = a2[i + 2];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n        a2[i + 2] = vec2[2];\n      }\n      return a2;\n    };\n  })();\n  function create$2() {\n    var out = new ARRAY_TYPE(4);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n    }\n    return out;\n  }\n  function clone$3(a2) {\n    var out = new ARRAY_TYPE(4);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function fromValues$2(x2, y2, z, w2) {\n    var out = new ARRAY_TYPE(4);\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z;\n    out[3] = w2;\n    return out;\n  }\n  function copy$2(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function set$2(out, x2, y2, z, w2) {\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z;\n    out[3] = w2;\n    return out;\n  }\n  function normalize$1(out, a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z = a2[2];\n    var w2 = a2[3];\n    var len2 = x2 * x2 + y2 * y2 + z * z + w2 * w2;\n    if (len2 > 0) {\n      len2 = 1 / Math.sqrt(len2);\n    }\n    out[0] = x2 * len2;\n    out[1] = y2 * len2;\n    out[2] = z * len2;\n    out[3] = w2 * len2;\n    return out;\n  }\n  function dot(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2] + a2[3] * b2[3];\n  }\n  function transformMat4$1(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z = a2[2], w2 = a2[3];\n    out[0] = m2[0] * x2 + m2[4] * y2 + m2[8] * z + m2[12] * w2;\n    out[1] = m2[1] * x2 + m2[5] * y2 + m2[9] * z + m2[13] * w2;\n    out[2] = m2[2] * x2 + m2[6] * y2 + m2[10] * z + m2[14] * w2;\n    out[3] = m2[3] * x2 + m2[7] * y2 + m2[11] * z + m2[15] * w2;\n    return out;\n  }\n  function exactEquals(a2, b2) {\n    return a2[0] === b2[0] && a2[1] === b2[1] && a2[2] === b2[2] && a2[3] === b2[3];\n  }\n  (function() {\n    var vec2 = create$2();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 4;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        vec2[2] = a2[i + 2];\n        vec2[3] = a2[i + 3];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n        a2[i + 2] = vec2[2];\n        a2[i + 3] = vec2[3];\n      }\n      return a2;\n    };\n  })();\n  function create$1() {\n    var out = new ARRAY_TYPE(4);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    out[3] = 1;\n    return out;\n  }\n  function setAxisAngle(out, axis, rad) {\n    rad = rad * 0.5;\n    var s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n  }\n  function multiply(out, a2, b2) {\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = b2[0], by = b2[1], bz = b2[2], bw = b2[3];\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n  }\n  function rotateX(out, a2, rad) {\n    rad *= 0.5;\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n  }\n  function rotateY(out, a2, rad) {\n    rad *= 0.5;\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var by = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n  }\n  function slerp(out, a2, b2, t) {\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = b2[0], by = b2[1], bz = b2[2], bw = b2[3];\n    var omega, cosom, sinom, scale0, scale1;\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    if (cosom < 0) {\n      cosom = -cosom;\n      bx = -bx;\n      by = -by;\n      bz = -bz;\n      bw = -bw;\n    }\n    if (1 - cosom > EPSILON) {\n      omega = Math.acos(cosom);\n      sinom = Math.sin(omega);\n      scale0 = Math.sin((1 - t) * omega) / sinom;\n      scale1 = Math.sin(t * omega) / sinom;\n    } else {\n      scale0 = 1 - t;\n      scale1 = t;\n    }\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    return out;\n  }\n  function conjugate(out, a2) {\n    out[0] = -a2[0];\n    out[1] = -a2[1];\n    out[2] = -a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function fromMat3(out, m2) {\n    var fTrace = m2[0] + m2[4] + m2[8];\n    var fRoot;\n    if (fTrace > 0) {\n      fRoot = Math.sqrt(fTrace + 1);\n      out[3] = 0.5 * fRoot;\n      fRoot = 0.5 / fRoot;\n      out[0] = (m2[5] - m2[7]) * fRoot;\n      out[1] = (m2[6] - m2[2]) * fRoot;\n      out[2] = (m2[1] - m2[3]) * fRoot;\n    } else {\n      var i = 0;\n      if (m2[4] > m2[0]) i = 1;\n      if (m2[8] > m2[i * 3 + i]) i = 2;\n      var j = (i + 1) % 3;\n      var k = (i + 2) % 3;\n      fRoot = Math.sqrt(m2[i * 3 + i] - m2[j * 3 + j] - m2[k * 3 + k] + 1);\n      out[i] = 0.5 * fRoot;\n      fRoot = 0.5 / fRoot;\n      out[3] = (m2[j * 3 + k] - m2[k * 3 + j]) * fRoot;\n      out[j] = (m2[j * 3 + i] + m2[i * 3 + j]) * fRoot;\n      out[k] = (m2[k * 3 + i] + m2[i * 3 + k]) * fRoot;\n    }\n    return out;\n  }\n  var clone$2 = clone$3;\n  var fromValues$1 = fromValues$2;\n  var copy$1 = copy$2;\n  var set$1 = set$2;\n  var normalize = normalize$1;\n  function equals$1(a2, b2) {\n    return Math.abs(dot(a2, b2)) >= 1 - EPSILON;\n  }\n  var rotationTo = (function() {\n    var tmpvec3 = create$3();\n    var xUnitVec3 = fromValues$3(1, 0, 0);\n    var yUnitVec3 = fromValues$3(0, 1, 0);\n    return function(out, a2, b2) {\n      var dot2 = dot$1(a2, b2);\n      if (dot2 < -0.999999) {\n        cross(tmpvec3, xUnitVec3, a2);\n        if (len(tmpvec3) < 1e-6) cross(tmpvec3, yUnitVec3, a2);\n        normalize$2(tmpvec3, tmpvec3);\n        setAxisAngle(out, tmpvec3, Math.PI);\n        return out;\n      } else if (dot2 > 0.999999) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 1;\n        return out;\n      } else {\n        cross(tmpvec3, a2, b2);\n        out[0] = tmpvec3[0];\n        out[1] = tmpvec3[1];\n        out[2] = tmpvec3[2];\n        out[3] = 1 + dot2;\n        return normalize(out, out);\n      }\n    };\n  })();\n  (function() {\n    var temp1 = create$1();\n    var temp2 = create$1();\n    return function(out, a2, b2, c2, d, t) {\n      slerp(temp1, a2, d, t);\n      slerp(temp2, b2, c2, t);\n      slerp(out, temp1, temp2, 2 * t * (1 - t));\n      return out;\n    };\n  })();\n  (function() {\n    var matr = create$5();\n    return function(out, view, right, up) {\n      matr[0] = right[0];\n      matr[3] = right[1];\n      matr[6] = right[2];\n      matr[1] = up[0];\n      matr[4] = up[1];\n      matr[7] = up[2];\n      matr[2] = -view[0];\n      matr[5] = -view[1];\n      matr[8] = -view[2];\n      return normalize(out, fromMat3(out, matr));\n    };\n  })();\n  function create() {\n    var out = new ARRAY_TYPE(2);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n    }\n    return out;\n  }\n  function clone$1(a2) {\n    var out = new ARRAY_TYPE(2);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    return out;\n  }\n  function fromValues(x2, y2) {\n    var out = new ARRAY_TYPE(2);\n    out[0] = x2;\n    out[1] = y2;\n    return out;\n  }\n  function copy(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    return out;\n  }\n  function set(out, x2, y2) {\n    out[0] = x2;\n    out[1] = y2;\n    return out;\n  }\n  function transformMat4(out, a2, m2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    out[0] = m2[0] * x2 + m2[4] * y2 + m2[12];\n    out[1] = m2[1] * x2 + m2[5] * y2 + m2[13];\n    return out;\n  }\n  function equals(a2, b2) {\n    var a0 = a2[0], a1 = a2[1];\n    var b0 = b2[0], b1 = b2[1];\n    return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1));\n  }\n  (function() {\n    var vec2 = create();\n    return function(a2, stride, offset2, count2, fn2, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 2;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        fn2(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n      }\n      return a2;\n    };\n  })();\n  class Constants {\n  }\n  Constants.TWO_PI = 6.283185307179586;\n  Constants.PI = 3.141592653589793;\n  Constants.PI_OVER_TWO = 1.5707963267948966;\n  Constants.PI_OVER_THREE = 1.0471975511965976;\n  Constants.PI_OVER_FOUR = 0.7853981633974483;\n  Constants.PI_OVER_SIX = 0.5235987755982988;\n  Constants.LOG_2 = 0.6931471805599453;\n  Constants.RADIANS_PER_DEGREE = 0.017453292519943295;\n  Constants.DEGREES_PER_RADIAN = 57.29577951308232;\n  Constants.ROOT_TWO = 1.4142135623730951;\n  Constants.ROOT_TWO_OVER_TWO = 0.7071067811865476;\n  Constants.ROOT_THREE = 1.7320508075688772;\n  Constants.ROOT_THREE_OVER_TWO = 0.8660254037844386;\n  Constants.ROOT_THREE_OVER_THREE = 0.5773502691896257;\n  Constants.VECTOR2_ZERO = fromValues(0, 0);\n  Constants.VECTOR2_ONE = fromValues(1, 1);\n  Constants.VECTOR2_UNITX = fromValues(1, 0);\n  Constants.VECTOR2_UNITY = fromValues(0, 1);\n  Constants.VECTOR3_ZERO = fromValues$3(0, 0, 0);\n  Constants.VECTOR3_ONE = fromValues$3(1, 1, 1);\n  Constants.VECTOR3_UNITX = fromValues$3(1, 0, 0);\n  Constants.VECTOR3_UNITY = fromValues$3(0, 1, 0);\n  Constants.VECTOR3_UNITZ = fromValues$3(0, 0, 1);\n  Constants.VECTOR3_REFLECTX = fromValues$3(1, -1, -1);\n  Constants.VECTOR3_REFLECTY = fromValues$3(-1, 1, -1);\n  Constants.VECTOR3_REFLECTZ = fromValues$3(-1, -1, 1);\n  Constants.VECTOR4_ZERO = fromValues$2(0, 0, 0, 0);\n  Constants.VECTOR4_ONE = fromValues$2(1, 1, 1, 1);\n  Constants.VECTOR4_UNITX = fromValues$2(1, 0, 0, 0);\n  Constants.VECTOR4_UNITY = fromValues$2(0, 1, 0, 0);\n  Constants.VECTOR4_UNITZ = fromValues$2(0, 0, 1, 0);\n  Constants.VECTOR4_UNITW = fromValues$2(0, 0, 0, 1);\n  Constants.MAT3_IDENTITY = create$5();\n  Constants.MAT4_IDENTITY = create$4();\n  Constants.MAT4_ROTATION_MINUS_90 = fromValues$4(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  Constants.QUAT_IDENTITY = create$1();\n  Constants.QUAT_ROTATEX_PLUS_90 = fromValues$1(Constants.ROOT_TWO_OVER_TWO, 0, 0, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEX_MINUS_90 = fromValues$1(-Constants.ROOT_TWO_OVER_TWO, 0, 0, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEY_PLUS_90 = fromValues$1(0, Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEY_MINUS_90 = fromValues$1(0, -Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEZ_PLUS_90 = fromValues$1(0, 0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEZ_MINUS_90 = fromValues$1(0, 0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO);\n  Constants.MILLISECONDS_PER_DAY = 864e5;\n  class MathHelper {\n    static simpleLinearRegression(points2) {\n      const n = points2.length;\n      let sumX = 0;\n      let sumY = 0;\n      let sumXY = 0;\n      let sumXX = 0;\n      for (let i = 0; i < n; i++) {\n        sumX += points2[i].x;\n        sumY += points2[i].y;\n        sumXY += points2[i].x * points2[i].y;\n        sumXX += points2[i].x * points2[i].x;\n      }\n      const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n      const yIntercept = (sumY - slope * sumX) / n;\n      return { slope, yIntercept };\n    }\n    static clamp(value2, min2, max2) {\n      return Math.max(Math.min(value2, max2), min2);\n    }\n    static lerp(value1, value2, amount) {\n      return value1 + (value2 - value1) * amount;\n    }\n    static normalize(value2, min2, max2, from = 0, to = 1) {\n      return max2 - min2 == 0 ? 0 : Math.max(Math.min((to - from) * (value2 - min2) / (max2 - min2) + from, to), from);\n    }\n    static splitExponent(value2, result) {\n      let exponent2 = Math.round(Math.log10(Math.abs(value2)));\n      let coefficient = value2 / Math.pow(10, exponent2);\n      if (coefficient < 1) {\n        coefficient *= 10;\n        exponent2--;\n      }\n      result[0] = coefficient;\n      result[1] = exponent2;\n    }\n    static combineExponent(mantissa, exponent2) {\n      return mantissa * Math.pow(10, exponent2);\n    }\n    static isPowerOf2(value2) {\n      return (value2 & value2 - 1) == 0;\n    }\n  }\n  class PseudoRandom {\n    constructor(seed) {\n      this._seed = seed % 2147483647;\n      if (this._seed <= 0)\n        this._seed += 2147483646;\n    }\n    next() {\n      return this._seed = this._seed * 16807 % 2147483647;\n    }\n    nextFloat() {\n      return (this.next() - 1) / 2147483646;\n    }\n    nextInteger(min2, max2) {\n      return Math.floor(this.nextFloat() * (max2 - min2 + 1) + min2);\n    }\n  }\n  class AngleHelper {\n    static degreesToRadians(degrees2) {\n      return degrees2 * Constants.RADIANS_PER_DEGREE;\n    }\n    static radiansToDegrees(radians2) {\n      return radians2 * Constants.DEGREES_PER_RADIAN;\n    }\n    static wrapAngle(angle2) {\n      if (angle2 > Constants.PI)\n        angle2 = angle2 - Constants.TWO_PI;\n      else if (angle2 < -Constants.PI)\n        angle2 += Constants.TWO_PI;\n      return angle2;\n    }\n    static sphericalToCartesian(altitude, longitude2, latitude, result) {\n      latitude = AngleHelper.degreesToRadians(latitude);\n      longitude2 = AngleHelper.degreesToRadians(longitude2);\n      const scale2 = Math.cos(latitude);\n      result[0] = altitude * scale2 * Math.sin(longitude2);\n      result[1] = altitude * Math.sin(latitude);\n      result[2] = altitude * scale2 * Math.cos(longitude2);\n    }\n    static cartesianToSpherical(x2, y2, z, result) {\n      result[0] = Math.atan2(x2, z);\n      result[1] = Math.asin(y2);\n    }\n    static angleBetweenVectors(from, to) {\n      if (exactEquals$1(from, to)) {\n        return 0;\n      } else {\n        const dot2 = MathHelper.clamp(dot$1(from, to), -1, 1);\n        return Math.acos(dot2);\n      }\n    }\n    static signedAngleBetweenVectors(from, to, up) {\n      if (exactEquals$1(from, to)) {\n        return 0;\n      } else {\n        const dot2 = MathHelper.clamp(dot$1(from, to), -1, 1);\n        let angle2 = Math.acos(dot2);\n        cross(AngleHelper._vec3, from, to);\n        if (dot$1(AngleHelper._vec3, up) < 0) {\n          angle2 = -angle2;\n        }\n        return angle2;\n      }\n    }\n  }\n  AngleHelper._vec3 = create$3();\n  class CameraBase {\n    getView(view) {\n      this.getPosition(view.position);\n    }\n    setView(view, isSmooth) {\n      this.setPosition(view.position, isSmooth);\n    }\n    lerpView(from, to, time2) {\n      lerp(this._vec3, from.position, to.position, time2);\n      this.setPosition(this._vec3, false);\n    }\n    get vMatrices() {\n      return this._vMatrices;\n    }\n    get inverseVMatrices() {\n      return this._inverseVMatrices;\n    }\n    get mvMatrices() {\n      return this._mvMatrices;\n    }\n    get pMatrices() {\n      return this._pMatrices;\n    }\n    get inversePMatrices() {\n      return this._inversePMatrices;\n    }\n    get pickVMatrix() {\n      return this._pickVMatrix;\n    }\n    get rMatrix() {\n      return this._mat3;\n    }\n    getOrbit(value2) {\n      copy$1(value2, this._orbitRotation);\n    }\n    setOrbit(value2, isSmooth) {\n      copy$1(this._orbitRotation, value2);\n      if (!isSmooth) {\n        copy$1(this._smoothedOrbitRotation, value2);\n      }\n    }\n    getPosition(value2) {\n      copy$3(value2, this._cameraPosition);\n    }\n    setPosition(value2, isSmooth) {\n      copy$3(this._cameraPosition, value2);\n      if (!isSmooth) {\n        copy$3(this._smoothedCameraPosition, value2);\n      }\n    }\n    constructor(core) {\n      this._core = core;\n      this._vec3 = create$3();\n      this._quat = create$1();\n      this._mat3 = create$5();\n      this._right = create$3();\n      this._up = create$3();\n      this._forward = create$3();\n      this._modelManipulationOrigin = create$3();\n      this.modelPosition = create$3();\n      this.modelScale = create$3();\n      this.modelRotation = create$1();\n      this._orbitRotation = create$1();\n      this._orbitDirection = create$1();\n      this._smoothedOrbitRotation = create$1();\n      this._smoothedCameraPosition = create$3();\n      this._smoothedCameraRotation = create$1();\n      this._cameraPosition = create$3();\n      this._cameraRotation = create$1();\n      this._combinedPosition = create$3();\n      this._combinedRotation = create$1();\n      this._leftToRightEye = create$3();\n      this._pickVMatrix = create$4();\n      this._eyePositions = [create$3(), create$3()];\n      this._vMatrices = [create$4(), create$4()];\n      this._mvMatrices = [create$4(), create$4()];\n      this._pMatrices = [create$4(), create$4()];\n      this._inverseVMatrices = [create$4(), create$4()];\n      this._inversePMatrices = [create$4(), create$4()];\n    }\n    reset(isSmooth) {\n      copy$3(this._cameraPosition, Constants.VECTOR3_ZERO);\n      copy$1(this._cameraRotation, Constants.QUAT_IDENTITY);\n      copy$1(this._orbitRotation, Constants.QUAT_IDENTITY);\n      if (!isSmooth) {\n        this.syncSmooth();\n      }\n    }\n    update(elapsedTime) {\n      let amount = Math.min(elapsedTime * this._core.config.positionSmoothing, 1);\n      lerp(this._smoothedCameraPosition, this._smoothedCameraPosition, this._cameraPosition, amount);\n      amount = Math.min(elapsedTime * this._core.config.rotationSmoothing, 1);\n      slerp(this._smoothedCameraRotation, this._smoothedCameraRotation, this._cameraRotation, amount);\n      slerp(this._smoothedOrbitRotation, this._smoothedOrbitRotation, this._orbitRotation, amount);\n      const epsilon3 = 1e-6;\n      let x2;\n      let y2;\n      let z;\n      let w2;\n      x2 = this._smoothedCameraPosition[0] - this._cameraPosition[0];\n      y2 = this._smoothedCameraPosition[1] - this._cameraPosition[1];\n      z = this._smoothedCameraPosition[2] - this._cameraPosition[2];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z) < epsilon3) {\n        copy$3(this._smoothedCameraPosition, this._cameraPosition);\n      }\n      x2 = this._smoothedCameraRotation[0] - this._cameraRotation[0];\n      y2 = this._smoothedCameraRotation[1] - this._cameraRotation[1];\n      z = this._smoothedCameraRotation[2] - this._cameraRotation[2];\n      w2 = this._smoothedCameraRotation[3] - this._cameraRotation[3];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z) < epsilon3 && Math.abs(w2) < epsilon3) {\n        copy$1(this._smoothedCameraRotation, this._cameraRotation);\n      }\n      x2 = this._smoothedOrbitRotation[0] - this._orbitRotation[0];\n      y2 = this._smoothedOrbitRotation[1] - this._orbitRotation[1];\n      z = this._smoothedOrbitRotation[2] - this._orbitRotation[2];\n      w2 = this._smoothedOrbitRotation[3] - this._orbitRotation[3];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z) < epsilon3 && Math.abs(w2) < epsilon3) {\n        copy$1(this._smoothedOrbitRotation, this._orbitRotation);\n      }\n      normalize(this._smoothedCameraRotation, this._smoothedCameraRotation);\n      normalize(this._smoothedOrbitRotation, this._smoothedOrbitRotation);\n      conjugate(this._orbitDirection, this._smoothedOrbitRotation);\n      transformMat4$2(this._modelManipulationOrigin, this.modelManipulationOrigin, this.modelMMatrix);\n      subtract(this._vec3, this._smoothedCameraPosition, this._modelManipulationOrigin);\n      transformQuat(this._combinedPosition, this._vec3, this._orbitDirection);\n      add(this._combinedPosition, this._combinedPosition, this._modelManipulationOrigin);\n      multiply(this._combinedRotation, this._orbitDirection, this._smoothedCameraRotation);\n      fromQuat$1(this._mat3, this._combinedRotation);\n      this._right[0] = this._mat3[0];\n      this._right[1] = this._mat3[1];\n      this._right[2] = this._mat3[2];\n      this._up[0] = this._mat3[3];\n      this._up[1] = this._mat3[4];\n      this._up[2] = this._mat3[5];\n      this._forward[0] = this._mat3[6];\n      this._forward[1] = this._mat3[7];\n      this._forward[2] = this._mat3[8];\n      const view = this._vMatrices[0];\n      view[0] = this._right[0];\n      view[1] = this._up[0];\n      view[2] = this._forward[0];\n      view[4] = this._right[1];\n      view[5] = this._up[1];\n      view[6] = this._forward[1];\n      view[8] = this._right[2];\n      view[9] = this._up[2];\n      view[10] = this._forward[2];\n      view[12] = -dot$1(this._right, this._combinedPosition);\n      view[13] = -dot$1(this._up, this._combinedPosition);\n      view[14] = -dot$1(this._forward, this._combinedPosition);\n      const aspectRatio = this.width / this.height;\n      if (this._core.config.stereoMode == StereoMode.none) {\n        if (this._core.config.tilesX != 1 || this._core.config.tilesY != 1) {\n          const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n          const bottom = -top;\n          const left = -aspectRatio * top;\n          const right = aspectRatio * top;\n          const width2 = right - left;\n          const height2 = top - bottom;\n          const tileWidth = width2 / this._core.config.tilesX;\n          const tileHeight = height2 / this._core.config.tilesY;\n          frustum(this._pMatrices[0], left + this._core.config.tileOffsetX * tileWidth, left + (this._core.config.tileOffsetX + 1) * tileWidth, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY - 1) * tileHeight, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY) * tileHeight, this._core.config.nearPlane, this._core.config.farPlane);\n        } else {\n          perspective(this.pMatrices[0], this._core.config.fov, aspectRatio, this._core.config.nearPlane, this._core.config.farPlane);\n        }\n        multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n        invert(this._inverseVMatrices[0], this.vMatrices[0]);\n        invert(this._inversePMatrices[0], this.pMatrices[0]);\n      } else {\n        cross(this._leftToRightEye, this._forward, this._up);\n        normalize$2(this._leftToRightEye, this._leftToRightEye);\n        scaleAndAdd(this._eyePositions[0], this._combinedPosition, this._leftToRightEye, -this._core.config.ipd);\n        scaleAndAdd(this._eyePositions[1], this._combinedPosition, this._leftToRightEye, this._core.config.ipd);\n        this._vMatrices[0][12] += this._core.config.ipd * 0.5;\n        copy$4(this._vMatrices[1], this._vMatrices[0]);\n        this._vMatrices[1][12] -= this._core.config.ipd;\n        const frustumShift = this._core.config.ipd * 0.5 * this._core.config.nearPlane / this._core.config.screenDistance;\n        const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n        const bottom = -top;\n        let left = -aspectRatio * top + frustumShift;\n        let right = aspectRatio * top + frustumShift;\n        frustum(this._pMatrices[0], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n        left = -aspectRatio * top - frustumShift;\n        right = aspectRatio * top - frustumShift;\n        frustum(this._pMatrices[1], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n        multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n        multiply$2(this._mvMatrices[1], this._vMatrices[1], this.modelMMatrix);\n        invert(this._inverseVMatrices[0], this._vMatrices[0]);\n        invert(this._inversePMatrices[0], this._pMatrices[0]);\n        copy$4(this._inverseVMatrices[1], this._inverseVMatrices[0]);\n        this._inverseVMatrices[1][12] += this._core.config.ipd;\n        invert(this._inversePMatrices[1], this._pMatrices[1]);\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`cam off ${this._cameraPosition[0] < 0 ? \"\" : \" \"}${this._cameraPosition[0].toFixed(3)},${this._cameraPosition[1] < 0 ? \"\" : \" \"}${this._cameraPosition[1].toFixed(3)},${this._cameraPosition[2] < 0 ? \"\" : \" \"}${this._cameraPosition[2].toFixed(3)}`);\n        this._core.debugText.addLine(`cam pos ${this._combinedPosition[0] < 0 ? \"\" : \" \"}${this._combinedPosition[0].toFixed(3)},${this._combinedPosition[1] < 0 ? \"\" : \" \"}${this._combinedPosition[1].toFixed(3)},${this._combinedPosition[2] < 0 ? \"\" : \" \"}${this._combinedPosition[2].toFixed(3)}`);\n        this._core.debugText.addLine(`cam rot ${this._combinedRotation[0] < 0 ? \"\" : \" \"}${this._combinedRotation[0].toFixed(3)},${this._combinedRotation[1] < 0 ? \"\" : \" \"}${this._combinedRotation[1].toFixed(3)},${this._combinedRotation[2] < 0 ? \"\" : \" \"}${this._combinedRotation[2].toFixed(3)},${this._combinedRotation[3] < 0 ? \"\" : \" \"}${this._combinedRotation[3].toFixed(3)}`);\n      }\n    }\n    _zoom(direction, distance2) {\n      scaleAndAdd(this._cameraPosition, this._cameraPosition, direction, distance2);\n    }\n    rotate(translationDelta) {\n    }\n    zoom(zoomDelta, x2, y2) {\n      this.unproject(this._vec3, x2, y2, 1);\n      normalize$2(this._vec3, this._vec3);\n      const distance$1 = zoomDelta * distance(this._combinedPosition, this.modelPosition);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      this._zoom(this._vec3, distance$1);\n    }\n    _twist(axis, angle2) {\n    }\n    twist(angle2, x2, y2) {\n    }\n    updatePickVMatrix(x2, y2) {\n      this.unproject(this._vec3, x2, y2, 1);\n      lookAt(this._pickVMatrix, this._combinedPosition, this._vec3, this._up);\n    }\n    syncSmooth() {\n      copy$3(this._smoothedCameraPosition, this._cameraPosition);\n      copy$1(this._smoothedCameraRotation, this._cameraRotation);\n      copy$1(this._smoothedOrbitRotation, this._orbitRotation);\n    }\n    updateModelManipulationOrigin(from, to) {\n      const a2 = create$3();\n      const b2 = create$3();\n      const c2 = create$3();\n      const d = create$3();\n      transformMat4$2(a2, from, this.modelMMatrix);\n      transformMat4$2(b2, to, this.modelMMatrix);\n      subtract(a2, this._cameraPosition, a2);\n      subtract(b2, this._cameraPosition, b2);\n      transformQuat(c2, a2, this._orbitDirection);\n      transformQuat(d, b2, this._orbitDirection);\n      subtract(c2, c2, a2);\n      subtract(d, d, b2);\n      subtract(this._vec3, c2, d);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      add(this._cameraPosition, this._cameraPosition, this._vec3);\n      add(this._smoothedCameraPosition, this._smoothedCameraPosition, this._vec3);\n    }\n    unproject(position2, x2, y2, z) {\n      set$3(position2, 2 * x2 / this.width - 1, 1 - 2 * y2 / this.height, z);\n      transformMat4$2(position2, position2, this._inversePMatrices[0]);\n      transformMat4$2(position2, position2, this._inverseVMatrices[0]);\n    }\n    translate(translationDelta) {\n      const distance$1 = distance(this.modelPosition, this._combinedPosition);\n      const height2 = 2 * Math.tan(this._core.config.fov / 2) * distance$1 / this.height;\n      set$3(this._vec3, height2 * translationDelta[0], -height2 * translationDelta[1], 0);\n      transformQuat(this._vec3, this._vec3, this._combinedRotation);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      subtract(this._cameraPosition, this._cameraPosition, this._vec3);\n    }\n  }\n  class AltAzimuthCamera extends CameraBase {\n    getView(view) {\n      super.getView(view);\n      view.altitude = this.altitude;\n      view.azimuth = this.azimuth;\n      view.fov = this._core.config.fov;\n    }\n    setView(view, isSmooth) {\n      super.setView(view, isSmooth);\n      this.setAltAzimuth(view.altitude, view.azimuth, isSmooth);\n      this._core.config.fov = view.fov;\n    }\n    lerpView(from, to, time2) {\n      super.lerpView(from, to, time2);\n      this.setAltAzimuth(MathHelper.lerp(from.altitude, to.altitude, time2), MathHelper.lerp(from.azimuth, to.azimuth, time2), false);\n      this._core.config.fov = MathHelper.lerp(from.fov, to.fov, time2);\n    }\n    update(elapsedTime) {\n      super.update(elapsedTime);\n      if (this._core.config.isDebugVisible) {\n        const altitude = AngleHelper.radiansToDegrees(this.altitude);\n        const azimuth = AngleHelper.radiansToDegrees(this.azimuth);\n        this._core.debugText.addLine(`cam alt ${altitude < 0 ? \"\" : \" \"}${altitude.toFixed(1)}`);\n        this._core.debugText.addLine(`cam azi ${azimuth < 0 ? \"\" : \" \"}${azimuth.toFixed(1)}`);\n      }\n    }\n    get altitude() {\n      transformQuat(this._up, Constants.VECTOR3_UNITY, this._combinedRotation);\n      transformQuat(this._right, Constants.VECTOR3_UNITX, this._combinedRotation);\n      return -AngleHelper.signedAngleBetweenVectors(Constants.VECTOR3_UNITY, this._up, this._right);\n    }\n    get azimuth() {\n      transformQuat(this._up, Constants.VECTOR3_UNITY, this._combinedRotation);\n      transformQuat(this._right, Constants.VECTOR3_UNITX, this._combinedRotation);\n      return -AngleHelper.signedAngleBetweenVectors(Constants.VECTOR3_UNITX, this._right, this._up);\n    }\n    setAltAzimuth(altitude, azimuth, isSmooth) {\n      setAxisAngle(this._quat, Constants.VECTOR3_UNITX, altitude);\n      multiply(this._orbitRotation, this._quat, Constants.QUAT_IDENTITY);\n      setAxisAngle(this._quat, Constants.VECTOR3_UNITY, azimuth);\n      multiply(this._orbitRotation, this._orbitRotation, this._quat);\n      if (!isSmooth) {\n        this.syncSmooth();\n      }\n    }\n    rotate(translationDelta) {\n      const length2 = Math.min(this.width, this.height);\n      let angle2 = translationDelta[1] * Constants.PI / length2;\n      setAxisAngle(this._quat, Constants.VECTOR3_UNITX, angle2);\n      multiply(this._orbitRotation, this._quat, this._orbitRotation);\n      angle2 = translationDelta[0] * Constants.PI / length2;\n      setAxisAngle(this._quat, Constants.VECTOR3_UNITY, angle2);\n      multiply(this._orbitRotation, this._orbitRotation, this._quat);\n    }\n  }\n  let Config$2 = class Config {\n    constructor(core) {\n      this.reset();\n    }\n    reset() {\n      this.isDebugVisible = false;\n      this.logLevel = LogLevel.warn;\n      this.shaderPath = \"shaders\";\n      this.fontPath = \"fonts\";\n      this.modelDistance = 0.5;\n      this.modelSize = 0.25;\n      this.stereoMode = StereoMode.none;\n      this.ipd = 0.06;\n      this.screenDistance = 0.5;\n      this.fov = AngleHelper.degreesToRadians(30);\n      this.nearPlane = 0.01;\n      this.farPlane = 100;\n      this.pickWidth = 512;\n      this.pickHeight = 512;\n      this.pickHoldDelay = 1e3;\n      this.pickSelectDelay = 100;\n      this.resizeMinimumDelay = 250;\n      this.rotationSmoothing = 0.02;\n      this.positionSmoothing = 0.02;\n      this.focusSmoothing = 0.01;\n      this.scaleSmoothing = 0.02;\n      this.mouseWheelZoomScale = -2e-3;\n      this.mouseWheelRotationScale = -2e-3;\n      this.dragToleranceSquared = 100;\n      this.manipulatorMinRelativeDistanceSquared = 100;\n      this.isMultiTouchEnabled = true;\n      this.isMultiTouchZoomEnabled = true;\n      this.isMultiTouchTwistEnabled = true;\n      this.isMultiTouchRotateEnabled = true;\n      this.isMultiTouchTranslateEnabled = true;\n      this.multiTouchZoomScale = 1;\n      this.cameraMinDistance = 0.1;\n      this.cameraMaxDistance = 10;\n      this.xrControllerRayColor = fromValues$3(0.5, 0.5, 0.5);\n      this.xrControllerProfile = \"windows-mixed-reality\";\n      this.xrControllerHandedness = \"right\";\n      this.paletteColor = new Uint8Array([128, 128, 128, 0]);\n      this.textColor = create$3();\n      this.textHoverColor = create$3();\n      this.textBorderColor = create$3();\n      this.textBorderWidth = 24 / 255;\n      this.identityRotation = Constants.VECTOR3_UNITY;\n      this.axesTextLabelMaxGlyphs = 32;\n      this.axesTextColor = create$3();\n      this.axesTextBorderColor = create$3();\n      this.axesTextHoverColor = create$3();\n      this.axesTextLabelMajorSize = 0.03;\n      this.axesTextLabelMinorSize = 0.02;\n      this.axesTextTitleMaxGlyphs = 127;\n      this.axesTextTitleSize = 0.05;\n      this.axesTextHeadingMaxGlyphs = 128;\n      this.axesTextHeadingSize = 0.075;\n      this.axesTextTitleLineHeight = 1.5;\n      this.axesTextHeadingLineHeight = 1.5;\n      this.axesTextLabelLineHeight = 1.5;\n      this.axesGridMajorThickness = 2e-4;\n      this.axesGridMinorThickness = 1e-4;\n      this.axesGridZeroThickness = 2e-3;\n      this.axesGridPickDivisionHeight = 0.025;\n      this.axesGridBackgroundColor = create$3();\n      this.axesGridHighlightColor = create$3();\n      this.axesGridMinorColor = create$3();\n      this.axesGridMajorColor = create$3();\n      this.axesGridZeroColor = create$3();\n      this.axesGridDefaultDivisions = 10;\n      this.keyTitleMaxGlyphs = 64;\n      this.keyLabelMaxGlyphs = 64;\n      this.selectionColor = create$3();\n      this.hoverColor = create$3();\n      this.activeColor = create$3();\n      this.highlightMode = HighlightMode.color;\n      this.lassoThickness = 4;\n      this.lassoDashWidth = 2;\n      this.lassoColor = create$3();\n      this.minCubifiedTreeMapSlice = 0.01;\n      this.sdfBuffer = 192;\n      this.sdfBorder = 0;\n      this.forceDirectIsEnabled = false;\n      this.forceDirectAttraction = 1;\n      this.forceDirectRepulsion = 1;\n      this.forceDirectGravity = 1;\n      this.forceDirectInterval = 0.1;\n      this.forceDirectMaxDistance = 0.1;\n      this.forceDirectTheta = 1;\n      this.forceDirectIterationsPerLayout = 1;\n      this.forceDirectEdgeWeightPower = 1;\n      this.forceDirectLockX = false;\n      this.forceDirectLockY = false;\n      this.forceDirectLockZ = false;\n      this.transitionDuration = 400;\n      this.transitionStaggering = 100;\n      this.transitionView = true;\n      this.isTransitionPickingEnabled = false;\n      this.backgroundColor = create$2();\n      this.theme = Theme.light;\n      this.ambientColor = create$3();\n      this.renderMode = RenderMode.color;\n      this.tilesX = 1;\n      this.tilesY = 1;\n      this.tileOffsetX = 0;\n      this.tileOffsetY = 0;\n    }\n    get theme() {\n      return this._theme;\n    }\n    set theme(value2) {\n      if (this._theme != value2) {\n        this._theme = value2;\n        switch (value2) {\n          case Theme.dark:\n            set$2(this.backgroundColor, 0, 0, 0, 1);\n            set$3(this.textColor, 0.9, 0.9, 0.9);\n            set$3(this.textHoverColor, 1, 1, 1);\n            set$3(this.textBorderColor, 0, 0, 0);\n            set$3(this.axesTextColor, 0.9, 0.9, 0.9);\n            set$3(this.axesTextBorderColor, 0, 0, 0);\n            set$3(this.axesTextHoverColor, 1, 1, 1);\n            set$3(this.axesGridBackgroundColor, 0.02, 0.02, 0.02);\n            set$3(this.axesGridHighlightColor, 0.04, 0.04, 0.04);\n            set$3(this.axesGridMinorColor, 0.05, 0.05, 0.05);\n            set$3(this.axesGridMajorColor, 0.1, 0.1, 0.1);\n            set$3(this.axesGridZeroColor, 0.05, 0.1, 0.1);\n            set$3(this.selectionColor, 1, 1, 0);\n            set$3(this.hoverColor, 1, 0, 1);\n            set$3(this.activeColor, 0, 1, 1);\n            set$3(this.lassoColor, 0.9, 0.9, 0.9);\n            break;\n          case Theme.light:\n            set$2(this.backgroundColor, 1, 1, 1, 1);\n            set$3(this.textColor, 0, 0, 0);\n            set$3(this.textHoverColor, 0.1, 0.1, 0.1);\n            set$3(this.textBorderColor, 1, 1, 1);\n            set$3(this.axesTextColor, 0, 0, 0);\n            set$3(this.axesTextBorderColor, 1, 1, 1);\n            set$3(this.axesTextHoverColor, 0.1, 0.1, 0.1);\n            set$3(this.axesGridBackgroundColor, 1, 1, 1);\n            set$3(this.axesGridHighlightColor, 0.925, 0.925, 0.925);\n            set$3(this.axesGridMinorColor, 0.9, 0.9, 0.9);\n            set$3(this.axesGridMajorColor, 0.8, 0.8, 0.8);\n            set$3(this.axesGridZeroColor, 0.7, 0.9, 0.9);\n            set$3(this.selectionColor, 1, 1, 0);\n            set$3(this.hoverColor, 1, 0, 1);\n            set$3(this.activeColor, 0, 1, 1);\n            set$3(this.lassoColor, 0.1, 0.1, 0.1);\n            break;\n        }\n        if (this.themeChangedCallback) {\n          this.themeChangedCallback(this._theme);\n        }\n      }\n    }\n  };\n  class DebugText {\n    get text() {\n      return this._text;\n    }\n    constructor() {\n      this.clear();\n    }\n    clear() {\n      this._text = \"\";\n    }\n    addLine(value2) {\n      this._text += value2 + \"\\n\";\n    }\n  }\n  class Fps {\n    get frameCounter() {\n      return this._frameCounter;\n    }\n    get totalFrames() {\n      return this._totalFrames;\n    }\n    constructor(core) {\n      this._core = core;\n      this._totalFrames = 0;\n      this.reset();\n    }\n    update(elapsedTime) {\n      this._elapsedTime += elapsedTime;\n      if (this._elapsedTime > 1e3) {\n        this._elapsedTime -= 1e3;\n        this._fps = this._frameCounter;\n        this._frameCounter = 0;\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`fps      ${this._fps}`);\n      }\n    }\n    render() {\n      this._frameCounter++;\n      this._totalFrames++;\n    }\n    reset() {\n      this._fps = 0;\n      this._frameCounter = 0;\n      this._elapsedTime = 0;\n    }\n  }\n  const PaletteType = {\n    sequentialsinglehue: \"sequentialsinglehue\",\n    sequentialmultihue: \"sequentialmultihue\",\n    diverging: \"diverging\",\n    qualitative: \"qualitative\"\n  };\n  class PaletteResources {\n    constructor() {\n      this.palettes = {\n        \"blues\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 251, 255, 222, 235, 247, 198, 219, 239, 158, 202, 225, 107, 174, 214, 66, 146, 198, 33, 113, 181, 8, 81, 156, 8, 48, 107]) },\n        \"greens\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 252, 245, 229, 245, 224, 199, 233, 192, 161, 217, 155, 116, 196, 118, 65, 171, 93, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n        \"greys\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 255, 255, 240, 240, 240, 217, 217, 217, 189, 189, 189, 150, 150, 150, 115, 115, 115, 82, 82, 82, 37, 37, 37, 0, 0, 0]) },\n        \"oranges\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 235, 254, 230, 206, 253, 208, 162, 253, 174, 107, 253, 141, 60, 241, 105, 19, 217, 72, 1, 166, 54, 3, 127, 39, 4]) },\n        \"purples\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([252, 251, 253, 239, 237, 245, 218, 218, 235, 188, 189, 220, 158, 154, 200, 128, 125, 186, 106, 81, 163, 84, 39, 143, 63, 0, 125]) },\n        \"reds\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 240, 254, 224, 210, 252, 187, 161, 252, 146, 114, 251, 106, 74, 239, 59, 44, 203, 24, 29, 165, 15, 21, 103, 0, 13]) },\n        \"viridis\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([72, 37, 117, 65, 68, 135, 53, 96, 141, 42, 120, 142, 33, 145, 141, 34, 168, 132, 67, 191, 113, 122, 209, 81, 188, 223, 39]) },\n        \"inferno\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([23, 12, 59, 66, 10, 104, 107, 23, 110, 147, 38, 103, 187, 55, 85, 221, 81, 58, 243, 119, 26, 252, 165, 10, 246, 214, 69]) },\n        \"magma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([21, 14, 55, 59, 15, 112, 101, 26, 128, 140, 41, 129, 182, 55, 122, 222, 73, 104, 247, 111, 92, 254, 159, 109, 254, 206, 145]) },\n        \"plasma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([66, 3, 157, 106, 0, 168, 144, 13, 164, 177, 42, 144, 203, 71, 121, 225, 100, 98, 242, 131, 76, 252, 166, 54, 252, 206, 37]) },\n        \"bluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 229, 245, 249, 204, 236, 230, 153, 216, 201, 102, 194, 164, 65, 174, 118, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n        \"bluepurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 224, 236, 244, 191, 211, 230, 158, 188, 218, 140, 150, 198, 140, 107, 177, 136, 65, 157, 129, 15, 124, 77, 0, 75]) },\n        \"greenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 240, 224, 243, 219, 204, 235, 197, 168, 221, 181, 123, 204, 196, 78, 179, 211, 43, 140, 190, 8, 104, 172, 8, 64, 129]) },\n        \"orangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 236, 254, 232, 200, 253, 212, 158, 253, 187, 132, 252, 141, 89, 239, 101, 72, 215, 48, 31, 179, 0, 0, 127, 0, 0]) },\n        \"purpleblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 231, 242, 208, 209, 230, 166, 189, 219, 116, 169, 207, 54, 144, 192, 5, 112, 176, 4, 90, 141, 2, 56, 88]) },\n        \"purplebluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 226, 240, 208, 209, 230, 166, 189, 219, 103, 169, 207, 54, 144, 192, 2, 129, 138, 1, 108, 89, 1, 70, 54]) },\n        \"purplered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 244, 249, 231, 225, 239, 212, 185, 218, 201, 148, 199, 223, 101, 176, 231, 41, 138, 206, 18, 86, 152, 0, 67, 103, 0, 31]) },\n        \"redpurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 243, 253, 224, 221, 252, 197, 192, 250, 159, 181, 247, 104, 161, 221, 52, 151, 174, 1, 126, 122, 1, 119, 73, 0, 106]) },\n        \"yellowgreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 247, 252, 185, 217, 240, 163, 173, 221, 142, 120, 198, 121, 65, 171, 93, 35, 132, 67, 0, 104, 55, 0, 69, 41]) },\n        \"yellowgreenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 217, 237, 248, 177, 199, 233, 180, 127, 205, 187, 65, 182, 196, 29, 145, 192, 34, 94, 168, 37, 52, 148, 8, 29, 88]) },\n        \"yelloworangebrown\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 255, 247, 188, 254, 227, 145, 254, 196, 79, 254, 153, 41, 236, 112, 20, 204, 76, 2, 153, 52, 4, 102, 37, 6]) },\n        \"yelloworangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 204, 255, 237, 160, 254, 217, 118, 254, 178, 76, 253, 141, 60, 252, 78, 42, 227, 26, 28, 189, 0, 38, 128, 0, 38]) },\n        \"brownbluegreen\": { type: PaletteType.diverging, colors: new Uint8Array([84, 48, 5, 140, 81, 10, 191, 129, 45, 223, 194, 125, 246, 232, 195, 245, 245, 245, 199, 234, 229, 128, 205, 193, 53, 151, 143, 1, 102, 94, 0, 60, 48]) },\n        \"pinkyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([142, 1, 82, 197, 27, 125, 222, 119, 174, 241, 182, 218, 253, 224, 239, 247, 247, 247, 230, 245, 208, 184, 225, 134, 127, 188, 65, 77, 146, 33, 39, 100, 25]) },\n        \"purplegreen\": { type: PaletteType.diverging, colors: new Uint8Array([64, 0, 75, 118, 42, 131, 153, 112, 171, 194, 165, 207, 231, 212, 232, 247, 247, 247, 217, 240, 211, 166, 219, 160, 90, 174, 97, 27, 120, 55, 0, 68, 27]) },\n        \"purpleorange\": { type: PaletteType.diverging, colors: new Uint8Array([127, 59, 8, 179, 88, 6, 224, 130, 20, 253, 184, 99, 254, 224, 182, 247, 247, 247, 216, 218, 235, 178, 171, 210, 128, 115, 172, 84, 39, 136, 45, 0, 75]) },\n        \"redblue\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 247, 247, 247, 209, 229, 240, 146, 197, 222, 67, 147, 195, 33, 102, 172, 5, 48, 97]) },\n        \"redgrey\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 255, 255, 255, 224, 224, 224, 186, 186, 186, 135, 135, 135, 77, 77, 77, 26, 26, 26]) },\n        \"redyellowblue\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 144, 255, 255, 191, 224, 243, 248, 171, 217, 233, 116, 173, 209, 69, 117, 180, 49, 54, 149]) },\n        \"redyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 217, 239, 139, 166, 217, 106, 102, 189, 99, 26, 152, 80, 0, 104, 55]) },\n        \"spectral\": { type: PaletteType.diverging, colors: new Uint8Array([158, 1, 66, 213, 62, 79, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 230, 245, 152, 171, 221, 164, 102, 194, 165, 50, 136, 189, 94, 79, 162]) },\n        \"accent\": { type: PaletteType.qualitative, colors: new Uint8Array([127, 201, 127, 190, 174, 212, 253, 192, 134, 255, 255, 153, 56, 108, 176, 240, 2, 127, 191, 91, 23, 102, 102, 102]) },\n        \"category10\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 255, 127, 14, 44, 160, 44, 214, 39, 40, 148, 103, 189, 140, 86, 75, 227, 119, 194, 127, 127, 127, 188, 189, 34, 23, 190, 207]) },\n        \"category20\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 174, 199, 232, 255, 127, 14, 255, 187, 120, 44, 160, 44, 152, 223, 138, 214, 39, 40, 255, 152, 150, 148, 103, 189, 197, 176, 213, 140, 86, 75, 196, 156, 148, 227, 119, 194, 247, 182, 210, 127, 127, 127, 199, 199, 199, 188, 189, 34, 219, 219, 141, 23, 190, 207, 158, 218, 229]) },\n        \"dark2\": { type: PaletteType.qualitative, colors: new Uint8Array([27, 158, 119, 217, 95, 2, 117, 112, 179, 231, 41, 138, 102, 166, 30, 230, 171, 2, 166, 118, 29, 102, 102, 102]) },\n        \"paired\": { type: PaletteType.qualitative, colors: new Uint8Array([166, 206, 227, 31, 120, 180, 178, 223, 138, 51, 160, 44, 251, 154, 153, 227, 26, 28, 253, 191, 111, 255, 127, 0, 202, 178, 214, 106, 61, 154, 255, 255, 153, 177, 89, 40]) },\n        \"pastel1\": { type: PaletteType.qualitative, colors: new Uint8Array([251, 180, 174, 179, 205, 227, 204, 235, 197, 222, 203, 228, 254, 217, 166, 255, 255, 204, 229, 216, 189, 253, 218, 236, 242, 242, 242]) },\n        \"pastel2\": { type: PaletteType.qualitative, colors: new Uint8Array([179, 226, 205, 253, 205, 172, 203, 213, 232, 244, 202, 228, 230, 245, 201, 255, 242, 174, 241, 226, 204, 204, 204, 204]) },\n        \"set1\": { type: PaletteType.qualitative, colors: new Uint8Array([228, 26, 28, 55, 126, 184, 77, 175, 74, 152, 78, 163, 255, 127, 0, 255, 255, 51, 166, 86, 40, 247, 129, 191, 153, 153, 153]) },\n        \"set2\": { type: PaletteType.qualitative, colors: new Uint8Array([102, 194, 165, 252, 141, 98, 141, 160, 203, 231, 138, 195, 166, 216, 84, 255, 217, 47, 229, 196, 148, 179, 179, 179]) },\n        \"set3\": { type: PaletteType.qualitative, colors: new Uint8Array([141, 211, 199, 255, 255, 179, 190, 186, 218, 251, 128, 114, 128, 177, 211, 253, 180, 98, 179, 222, 105, 252, 205, 229, 217, 217, 217, 188, 128, 189, 204, 235, 197, 255, 237, 111]) }\n      };\n    }\n  }\n  class PaletteBase {\n    get colors() {\n      return this._colors;\n    }\n    set colors(value2) {\n      if (this._colors != value2) {\n        this._colors = value2;\n        this._changed = true;\n      }\n    }\n    constructor() {\n      this._colors = null;\n    }\n    copyFrom(palette) {\n      if (palette.colors) {\n        this.colors = new Uint8Array(palette.colors);\n      } else {\n        this.colors = null;\n      }\n    }\n    update() {\n    }\n  }\n  let Palette$2 = class Palette extends PaletteBase {\n  };\n  class PositionVertex {\n    static getPosition(buffer, index2, value2) {\n      const offset2 = index2 * PositionVertex.SIZE;\n      set$3(value2, buffer[offset2], buffer[offset2 + 1], buffer[offset2 + 2]);\n    }\n    static setPosition(buffer, index2, value2) {\n      const offset2 = index2 * PositionVertex.SIZE;\n      buffer[offset2] = value2[0];\n      buffer[offset2 + 1] = value2[1];\n      buffer[offset2 + 2] = value2[2];\n    }\n  }\n  PositionVertex.SIZE = 3;\n  PositionVertex.SIZE_BYTES = 12;\n  class PositionColorVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getColor(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      set$3(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255);\n    }\n    static setColor(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n    }\n  }\n  PositionColorVertex.SIZE_BYTES = 16;\n  PositionColorVertex.POSITION_OFFSET_BYTES = 0;\n  PositionColorVertex.COLOR_OFFSET_BYTES = 12;\n  class PositionTextureVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n  }\n  PositionTextureVertex.SIZE_BYTES = 16;\n  PositionTextureVertex.POSITION_OFFSET_BYTES = 0;\n  PositionTextureVertex.TEX_COORD_OFFSET_BYTES = 12;\n  class PositionTexturePickVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$2(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n  }\n  PositionTexturePickVertex.SIZE_BYTES = 20;\n  PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES = 0;\n  PositionTexturePickVertex.POSITION_OFFSET_BYTES = 4;\n  PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES = 16;\n  class PositionNormalTextureVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getNormal(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      set$3(value2, bufferView.getInt8(offset2) / 127, bufferView.getInt8(offset2 + 1) / 127, bufferView.getInt8(offset2 + 2) / 127);\n    }\n    static setNormal(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      bufferView.setInt8(offset2, value2[0] * 127);\n      bufferView.setInt8(offset2 + 1, value2[1] * 127);\n      bufferView.setInt8(offset2 + 2, value2[2] * 127);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n  }\n  PositionNormalTextureVertex.SIZE_BYTES = 20;\n  PositionNormalTextureVertex.POSITION_OFFSET_BYTES = 0;\n  PositionNormalTextureVertex.NORMAL_OFFSET_BYTES = 12;\n  PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES = 16;\n  class PickGridVertex {\n    static getTranslation(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setTranslation(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getNormal(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      set$3(value2, bufferView.getInt8(offset2) / 127, bufferView.getInt8(offset2 + 1) / 127, bufferView.getInt8(offset2 + 2) / 127);\n    }\n    static setNormal(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      bufferView.setInt8(offset2, value2[0] * 127);\n      bufferView.setInt8(offset2 + 1, value2[1] * 127);\n      bufferView.setInt8(offset2 + 2, value2[2] * 127);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$2(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n    static getBounds(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.BOUNDS_OFFSET_BYTES;\n      set$2(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535, bufferView.getUint16(offset2 + 4, true) / 65535, bufferView.getUint16(offset2 + 6, true) / 65535);\n    }\n    static setBounds(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.BOUNDS_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n      bufferView.setUint16(offset2 + 4, value2[2] * 65535, true);\n      bufferView.setUint16(offset2 + 6, value2[3] * 65535, true);\n    }\n  }\n  PickGridVertex.SIZE_BYTES = 32;\n  PickGridVertex.TRANSLATION_OFFSET_BYTES = 0;\n  PickGridVertex.NORMAL_OFFSET_BYTES = 12;\n  PickGridVertex.ID_COLOR_OFFSET_BYTES = 16;\n  PickGridVertex.TEX_COORD_OFFSET_BYTES = 20;\n  PickGridVertex.BOUNDS_OFFSET_BYTES = 24;\n  class UnitVertex {\n    static getIdHover(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.ID_HOVER_OFFSET_BYTES, true);\n    }\n    static setIdHover(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.ID_HOVER_OFFSET_BYTES, value2, true);\n    }\n    static copyIdHover(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ID_HOVER_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ID_HOVER_OFFSET_BYTES, true), true);\n    }\n    static getTranslation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setTranslation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static copyTranslation(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TRANSLATION_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TRANSLATION_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      set(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255);\n    }\n    static setColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n    }\n    static copyColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.COLOR_OFFSET_BYTES;\n      toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n      toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n    }\n    static getOrder(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ORDER_OFFSET_BYTES;\n      set(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true));\n    }\n    static setOrder(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ORDER_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n    }\n    static copyOrder(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ORDER_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ORDER_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n    }\n    static getScale(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SCALE_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setScale(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SCALE_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static copyScale(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SCALE_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SCALE_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getRotation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ROTATION_OFFSET_BYTES;\n      set$1(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true), bufferView.getFloat32(offset2 + 12, true));\n    }\n    static setRotation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ROTATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n      bufferView.setFloat32(offset2 + 12, value2[3], true);\n    }\n    static copyRotation(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ROTATION_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ROTATION_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n      toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TEXCOORD_OFFSET_BYTES;\n      set$1(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true), bufferView.getFloat32(offset2 + 12, true));\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TEXCOORD_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n      bufferView.setFloat32(offset2 + 12, value2[3], true);\n    }\n    static copyTexCoord(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TEXCOORD_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TEXCOORD_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n      toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$2(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static getSelected(bufferView, index2) {\n      return bufferView.getInt8(UnitVertex.SIZE_BYTES * index2 + this.SELECTED_OFFSET_BYTES) / 127;\n    }\n    static setSelected(bufferView, index2, value2) {\n      bufferView.setInt8(UnitVertex.SIZE_BYTES * index2 + this.SELECTED_OFFSET_BYTES, value2 * 127);\n    }\n    static copySelected(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setInt8(UnitVertex.SIZE_BYTES * toIndex + this.SELECTED_OFFSET_BYTES, fromBufferView.getInt8(UnitVertex.SIZE_BYTES * fromIndex + this.SELECTED_OFFSET_BYTES));\n    }\n    static getRounding(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.ROUNDING_OFFSET_BYTES, true);\n    }\n    static setRounding(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.ROUNDING_OFFSET_BYTES, value2, true);\n    }\n    static copyRounding(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ROUNDING_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ROUNDING_OFFSET_BYTES, true), true);\n    }\n    static getParameter1(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_1_OFFSET_BYTES, true);\n    }\n    static setParameter1(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_1_OFFSET_BYTES, value2, true);\n    }\n    static copyParameter1(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_1_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_1_OFFSET_BYTES, true), true);\n    }\n    static getParameter2(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_2_OFFSET_BYTES, true);\n    }\n    static setParameter2(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_2_OFFSET_BYTES, value2, true);\n    }\n    static copyParameter2(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_2_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_2_OFFSET_BYTES, true), true);\n    }\n    static getMaterial(bufferView, index2) {\n      return bufferView.getUint16(UnitVertex.SIZE_BYTES * index2 + this.MATERIAL_OFFSET_BYTES);\n    }\n    static setMaterial(bufferView, index2, value2) {\n      bufferView.setUint16(UnitVertex.SIZE_BYTES * index2 + this.MATERIAL_OFFSET_BYTES, value2);\n    }\n    static copyMaterial(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint16(UnitVertex.SIZE_BYTES * toIndex + this.MATERIAL_OFFSET_BYTES, fromBufferView.getUint16(UnitVertex.SIZE_BYTES * fromIndex + this.MATERIAL_OFFSET_BYTES, true), true);\n    }\n    static getTexture(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.TEXTURE_OFFSET_BYTES);\n    }\n    static setTexture(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.TEXTURE_OFFSET_BYTES, value2);\n    }\n    static copyTexture(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.TEXTURE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.TEXTURE_OFFSET_BYTES));\n    }\n    static getSdfBuffer(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BUFFER_OFFSET_BYTES);\n    }\n    static setSdfBuffer(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BUFFER_OFFSET_BYTES, value2);\n    }\n    static copySdfBuffer(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BUFFER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BUFFER_OFFSET_BYTES));\n    }\n    static getSdfBorder(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BORDER_OFFSET_BYTES);\n    }\n    static setSdfBorder(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BORDER_OFFSET_BYTES, value2);\n    }\n    static copySdfBorder(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BORDER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BORDER_OFFSET_BYTES));\n    }\n    static getMatId(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.MAT_TYPE_OFFSET_BYTES);\n    }\n    static setMatId(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.MAT_TYPE_OFFSET_BYTES, value2);\n    }\n    static copyMatId(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_TYPE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_TYPE_OFFSET_BYTES));\n    }\n    static getMatColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_COLOR_OFFSET_BYTES;\n      value2[0] = bufferView.getUint16(offset2) / 255;\n      value2[1] = bufferView.getUint16(offset2 + 2) / 255;\n      value2[2] = bufferView.getUint16(offset2 + 4) / 255;\n    }\n    static setMatColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_COLOR_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 255);\n      bufferView.setUint16(offset2 + 2, value2[1] * 255);\n      bufferView.setUint16(offset2 + 4, value2[2] * 255);\n    }\n    static copyMatColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.MAT_COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.MAT_COLOR_OFFSET_BYTES;\n      toBufferView.setUint16(toOffset, fromBufferView.getUint16(fromOffset));\n      toBufferView.setUint16(toOffset + 2, fromBufferView.getUint16(fromOffset + 2));\n      toBufferView.setUint16(toOffset + 4, fromBufferView.getUint16(fromOffset + 4));\n    }\n    static getMatFuzz(bufferView, index2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_FUZZ_OFFSET_BYTES;\n      return bufferView.getUint8(offset2) / 255;\n    }\n    static setMatFuzz(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_FUZZ_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2 * 255);\n    }\n    static copyMatFuzz(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_FUZZ_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_FUZZ_OFFSET_BYTES));\n    }\n    static getMatGloss(bufferView, index2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_GLOSS_OFFSET_BYTES;\n      return bufferView.getUint8(offset2) / 255;\n    }\n    static setMatGloss(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_GLOSS_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2 * 255);\n    }\n    static copyMatGloss(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_GLOSS_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_GLOSS_OFFSET_BYTES));\n    }\n    static getMatDensity(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_DENSITY_OFFSET_BYTES, true);\n    }\n    static setMatDensity(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_DENSITY_OFFSET_BYTES, value2, true);\n    }\n    static copyMatDensity(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_DENSITY_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_DENSITY_OFFSET_BYTES, true), true);\n    }\n    static getMatRefractiveIndex(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true);\n    }\n    static setMatRefractiveIndex(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, value2, true);\n    }\n    static copyMatRefractiveIndex(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true), true);\n    }\n    static getSegColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SEG_COLOR_OFFSET_BYTES;\n      value2[0] = bufferView.getUint8(offset2) / 255;\n      value2[1] = bufferView.getUint8(offset2 + 1) / 255;\n      value2[2] = bufferView.getUint8(offset2 + 2) / 255;\n      value2[3] = bufferView.getUint8(offset2 + 3) / 255;\n    }\n    static setSegColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SEG_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static copySegColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SEG_COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SEG_COLOR_OFFSET_BYTES;\n      toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n      toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n      toBufferView.setUint8(toOffset + 2, fromBufferView.getUint8(fromOffset + 2));\n      toBufferView.setUint8(toOffset + 3, fromBufferView.getUint8(fromOffset + 3));\n    }\n  }\n  UnitVertex.SIZE_BYTES = 120;\n  UnitVertex.ID_HOVER_OFFSET_BYTES = 0;\n  UnitVertex.ID_COLOR_OFFSET_BYTES = 4;\n  UnitVertex.ORDER_OFFSET_BYTES = 8;\n  UnitVertex.STAGGER_ORDER_OFFSET_BYTES = 12;\n  UnitVertex.SELECTED_OFFSET_BYTES = 80;\n  UnitVertex.TRANSLATION_OFFSET_BYTES = 16;\n  UnitVertex.COLOR_OFFSET_BYTES = 28;\n  UnitVertex.MATERIAL_OFFSET_BYTES = 30;\n  UnitVertex.SCALE_OFFSET_BYTES = 32;\n  UnitVertex.ROUNDING_OFFSET_BYTES = 44;\n  UnitVertex.ROTATION_OFFSET_BYTES = 48;\n  UnitVertex.TEXCOORD_OFFSET_BYTES = 64;\n  UnitVertex.TEXTURE_OFFSET_BYTES = 81;\n  UnitVertex.SDF_BUFFER_OFFSET_BYTES = 82;\n  UnitVertex.SDF_BORDER_OFFSET_BYTES = 83;\n  UnitVertex.PARAMETER_1_OFFSET_BYTES = 84;\n  UnitVertex.PARAMETER_2_OFFSET_BYTES = 88;\n  UnitVertex.MAT_TYPE_OFFSET_BYTES = 92;\n  UnitVertex.MAT_COLOR_OFFSET_BYTES = 112;\n  UnitVertex.MAT_FUZZ_OFFSET_BYTES = 96;\n  UnitVertex.MAT_GLOSS_OFFSET_BYTES = 97;\n  UnitVertex.MAT_DENSITY_OFFSET_BYTES = 100;\n  UnitVertex.MAT_REFRACTIVE_INDEX_OFFSET_BYTES = 104;\n  UnitVertex.SEG_COLOR_OFFSET_BYTES = 108;\n  class ObjMesh {\n  }\n  class ObjHelper {\n    constructor(core) {\n      this._core = core;\n    }\n    read(data2) {\n      const start = window.performance.now();\n      const indices = [];\n      const positions = [];\n      const normals = [];\n      const texCoords = [];\n      const meshes = [];\n      const indexOffsets = [];\n      const indexCounts = [];\n      const faceLookup = {};\n      const lines = data2.split(\"\\n\");\n      let faceCount = 0;\n      for (let i = 0; i < lines.length; i++) {\n        const parts = lines[i].trim().split(\" \");\n        if (parts.length > 0) {\n          switch (parts[0]) {\n            case \"o\":\n              meshes.push(parts[1]);\n              indexOffsets.push(indices.length);\n              break;\n            case \"v\":\n              positions.push(parseFloat(parts[1]));\n              positions.push(parseFloat(parts[2]));\n              positions.push(parseFloat(parts[3]));\n              break;\n            case \"vt\":\n              texCoords.push(parseFloat(parts[1]));\n              texCoords.push(parseFloat(parts[2]));\n              break;\n            case \"vn\":\n              normals.push(parseFloat(parts[1]));\n              normals.push(parseFloat(parts[2]));\n              normals.push(parseFloat(parts[3]));\n              break;\n            case \"f\":\n              for (let i2 = 0; i2 < parts.length - 1; i2++) {\n                const part = parts[i2 + 1];\n                if (faceLookup[part] == void 0) {\n                  faceLookup[part] = faceCount++;\n                }\n                indices.push(faceLookup[part]);\n              }\n              break;\n          }\n        }\n      }\n      for (let i = 0; i < meshes.length - 1; i++) {\n        indexCounts.push(indexOffsets[i + 1] - indexOffsets[i]);\n      }\n      indexCounts.push(indices.length - indexOffsets[meshes.length - 1]);\n      const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * Object.keys(faceLookup).length);\n      const dataView = new DataView(vertices);\n      let minX = Number.MAX_VALUE;\n      let minY = Number.MAX_VALUE;\n      let minZ2 = Number.MAX_VALUE;\n      let maxX = -Number.MAX_VALUE;\n      let maxY2 = -Number.MAX_VALUE;\n      let maxZ = -Number.MAX_VALUE;\n      const faces = Object.keys(faceLookup);\n      const _vec2 = create();\n      const _vec3 = create$3();\n      let hasTexCoords, hasNormals;\n      if (faces.length > 0) {\n        const faceParts = faces[0].split(\"/\");\n        hasTexCoords = faceParts.length > 1 && !isNaN(parseInt(faceParts[1]));\n        hasNormals = faceParts.length > 2 && !isNaN(parseInt(faceParts[2]));\n      }\n      for (let i = 0; i < faces.length; i++) {\n        const faceParts = faces[i].split(\"/\");\n        let index2 = (parseInt(faceParts[0]) - 1) * 3;\n        const x2 = positions[index2];\n        const y2 = positions[index2 + 1];\n        const z = positions[index2 + 2];\n        set$3(_vec3, x2, y2, z);\n        PositionNormalTextureVertex.setPosition(dataView, i, _vec3);\n        minX = Math.min(x2, minX);\n        minY = Math.min(y2, minY);\n        minZ2 = Math.min(z, minZ2);\n        maxX = Math.max(x2, maxX);\n        maxY2 = Math.max(y2, maxY2);\n        maxZ = Math.max(z, maxZ);\n        if (hasNormals) {\n          index2 = (parseInt(faceParts[2]) - 1) * 3;\n          set$3(_vec3, normals[index2], normals[index2 + 1], normals[index2 + 2]);\n          PositionNormalTextureVertex.setNormal(dataView, i, _vec3);\n        }\n        if (hasTexCoords) {\n          index2 = (parseInt(faceParts[1]) - 1) * 2;\n          set(_vec2, texCoords[index2], texCoords[index2 + 1]);\n          PositionNormalTextureVertex.setTexCoord(dataView, i, _vec2);\n        }\n      }\n      const originX = (minX + maxX) / 2;\n      const originY = (minY + maxY2) / 2;\n      const originZ = (minZ2 + maxZ) / 2;\n      const objMesh = new ObjMesh();\n      objMesh.vertices = vertices;\n      objMesh.indices = new Uint16Array(indices);\n      objMesh.meshes = meshes;\n      objMesh.indexOffsets = indexOffsets;\n      objMesh.indexCounts = indexCounts;\n      objMesh.indexCount = indices.length;\n      objMesh.minX = minX;\n      objMesh.minY = minY;\n      objMesh.minZ = minZ2;\n      objMesh.maxX = maxX;\n      objMesh.maxY = maxY2;\n      objMesh.maxZ = maxZ;\n      objMesh.originX = originX;\n      objMesh.originY = originY;\n      objMesh.originZ = originZ;\n      this._core.log.write(LogLevel.info, `obj loaded ${Math.round(window.performance.now() - start)}ms`);\n      return objMesh;\n    }\n  }\n  class Cube {\n  }\n  Cube.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5\n  ]);\n  Cube.INDICES = new Uint16Array([5, 4, 1, 0, 3, 4, 7, 5, 6, 1, 2, 3, 6, 7]);\n  Cube.CUBE_MAP_INDICES = new Uint16Array([2, 3, 1, 0, 4, 3, 7, 2, 6, 1, 5, 4, 6, 7]);\n  Cube.FACE_NORMALS = [\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, -1, 0),\n    fromValues$3(-1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Cube.FACE_POSITIONS = [\n    fromValues$3(0, 0.5, 0),\n    fromValues$3(0.5, 0, 0),\n    fromValues$3(0, -0.5, 0),\n    fromValues$3(-0.5, 0, 0),\n    fromValues$3(0, 0, 0.5),\n    fromValues$3(0, 0, -0.5)\n  ];\n  Cube.FACE_ROTATIONS = [\n    fromValues$5(1, 0, 0, 0, 0, -1, 0, 1, 0),\n    fromValues$5(0, 0, -1, 0, 1, 0, 1, 0, 0),\n    fromValues$5(1, 0, 0, 0, 0, 1, 0, -1, 0),\n    fromValues$5(0, 0, 1, 0, 1, 0, -1, 0, 0),\n    fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n  ];\n  Cube.EDGE_POSITIONS = [\n    fromValues$3(0, 0.5, 0.5),\n    fromValues$3(0.5, 0.5, 0),\n    fromValues$3(0, 0.5, -0.5),\n    fromValues$3(-0.5, 0.5, 0),\n    fromValues$3(0, -0.5, 0.5),\n    fromValues$3(0.5, -0.5, 0),\n    fromValues$3(0, -0.5, -0.5),\n    fromValues$3(-0.5, -0.5, 0),\n    fromValues$3(0.5, 0, 0.5),\n    fromValues$3(0.5, 0, -0.5),\n    fromValues$3(-0.5, 0, -0.5),\n    fromValues$3(-0.5, 0, 0.5)\n  ];\n  Cube.EDGE_NORMALS = [\n    fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO)\n  ];\n  Cube.EDGE_CORNERS = [\n    [0, 1],\n    [1, 5],\n    [4, 5],\n    [0, 4],\n    [2, 3],\n    [2, 6],\n    [6, 7],\n    [3, 7],\n    [1, 2],\n    [5, 6],\n    [4, 7],\n    [0, 3]\n  ];\n  Cube.EDGE_FACES = [\n    [0, 4],\n    [0, 1],\n    [0, 5],\n    [0, 3],\n    [2, 4],\n    [2, 1],\n    [2, 5],\n    [2, 3],\n    [1, 4],\n    [1, 5],\n    [3, 5],\n    [3, 4]\n  ];\n  Cube.EDGE_AXIS = [\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    1,\n    1,\n    1,\n    1\n  ];\n  Cube.AXIS_EDGES = [\n    [0, 2, 4, 6],\n    [8, 9, 10, 11],\n    [1, 3, 5, 7]\n  ];\n  Cube.AXIS_FACES = [\n    [1, 3],\n    [0, 2],\n    [4, 5]\n  ];\n  Cube.OPPOSITE_FACES = [\n    2,\n    3,\n    0,\n    1,\n    5,\n    4\n  ];\n  Cube.EDGE_POSITIVES = [\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0)\n  ];\n  Cube.EDGE_FORWARDS = [\n    fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO)\n  ];\n  let ControllerVisual$1 = class ControllerVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(controller) {\n      this.controller = controller;\n    }\n  };\n  class Controller {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get texture() {\n      return this._texture;\n    }\n    get rayMMatrix() {\n      return this._rayMMatrix;\n    }\n    get rayIndexCount() {\n      return this._rayIndexCount;\n    }\n    get rayVertices() {\n      return this._rayVertices;\n    }\n    get rayIndices() {\n      return this._rayIndices;\n    }\n    constructor(core, options) {\n      this._cubeObj = `o Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 -1.000000\nv 1.000000 1.000000 -0.999999\nv 0.999999 1.000000 1.000001\nv -1.000000 1.000000 1.000000\nv -1.000000 1.000000 -1.000000\nvt 1.000000 0.333333\nvt 1.000000 0.666667\nvt 0.666667 0.666667\nvt 0.666667 0.333333\nvt 0.666667 0.000000\nvt 0.000000 0.333333\nvt 0.000000 0.000000\nvt 0.333333 0.000000\nvt 0.333333 1.000000\nvt 0.000000 1.000000\nvt 0.000000 0.666667\nvt 0.333333 0.333333\nvt 0.333333 0.666667\nvt 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.000000 0.000000 1.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\ns off\nf 2/1/1 3/2/1 4/3/1\nf 8/1/2 7/4/2 6/5/2\nf 5/6/3 6/7/3 2/8/3\nf 6/8/4 7/5/4 3/4/4\nf 3/9/5 7/10/5 8/11/5\nf 1/12/6 4/13/6 8/11/6\nf 1/4/1 2/1/1 4/3/1\nf 5/14/2 8/1/2 6/5/2\nf 1/12/3 5/6/3 2/8/3\nf 2/12/4 6/8/4 3/4/4\nf 4/13/5 3/9/5 8/11/5\nf 5/6/6 1/12/6 8/11/6`;\n      this._core = core;\n      this._obj = options.obj;\n      this._texture = options.texture || new ImageData(new Uint8ClampedArray([0, 0, 0, 255]), 1, 1);\n    }\n    initialize() {\n      const _vec3 = create$3();\n      this._mMatrix = create$4();\n      const objMesh = new ObjHelper(this._core).read(this._obj || this._cubeObj);\n      if (!this._obj) {\n        this.useRayPose = true;\n        const modelThickness = 0.02;\n        const modelLength = 0.1;\n        set$3(_vec3, modelThickness, modelThickness, modelLength);\n        fromScaling(this._mMatrix, _vec3);\n        set$3(_vec3, 0, 0, 1);\n        translate(this._mMatrix, this._mMatrix, _vec3);\n      }\n      this._vertices = objMesh.vertices;\n      this._indices = objMesh.indices;\n      this._indexCount = objMesh.indexCount;\n      this._rayMMatrix = create$4();\n      const rayVertices = Cube.POSITIONS;\n      this._rayVertices = new ArrayBuffer(PositionColorVertex.SIZE_BYTES * rayVertices.length / PositionVertex.SIZE);\n      const rayVerticesView = new DataView(this._rayVertices);\n      const rayIndices = Cube.INDICES;\n      this._rayIndices = new Uint16Array(rayIndices);\n      const rayVertexCount = rayVertices.length / PositionVertex.SIZE;\n      this._rayIndexCount = rayIndices.length;\n      for (let i = 0; i < rayVertexCount; i++) {\n        set$3(_vec3, rayVertices[i * PositionVertex.SIZE], rayVertices[i * PositionVertex.SIZE + 1], rayVertices[i * PositionVertex.SIZE + 2]);\n        PositionColorVertex.setPosition(rayVerticesView, i, _vec3);\n        PositionColorVertex.setColor(rayVerticesView, i, this._core.config.xrControllerRayColor);\n      }\n      const rayThickness = 25e-4;\n      const rayLength = 10;\n      set$3(_vec3, rayThickness, rayThickness, rayLength);\n      fromScaling(this._rayMMatrix, _vec3);\n      set$3(_vec3, 0, 0, -0.5);\n      translate(this._rayMMatrix, this._rayMMatrix, _vec3);\n      this._isInitialized = true;\n      this._core.log.write(LogLevel.info, \"controller initialized\");\n    }\n    update(elapsedTime) {\n    }\n  }\n  class MatrixHelper {\n    static fieldOfViewFromProjectionMatrix(p) {\n      return 2 * Math.atan(1 / p[5]);\n    }\n  }\n  class AxesVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(axes) {\n      this.axes = axes;\n    }\n  }\n  class AxesBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    set vMatrix(value2) {\n      this._vMatrix = value2;\n    }\n    pickGrid(id2) {\n      const offset2 = id2 * 3;\n      return {\n        divisionX: this._pickGrid[offset2] - 1,\n        divisionY: this._pickGrid[offset2 + 1] - 1,\n        divisionZ: this._pickGrid[offset2 + 2] - 1\n      };\n    }\n    pickTitle(id2) {\n      return { axis: this._pickTitle[id2] };\n    }\n    pickLabel(id2) {\n      const offset2 = id2 * 2;\n      return {\n        axis: this._pickLabel[offset2],\n        label: this._pickLabel[offset2 + 1]\n      };\n    }\n    pickHeading(id2) {\n      return { axis: this._pickHeading[id2] };\n    }\n    getFromValues(index2) {\n      return this._fromValues[index2];\n    }\n    setFromValues(index2, value2) {\n      if (this._fromValues[index2] != value2) {\n        this._fromValues[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getToValues(index2) {\n      return this._toValues[index2];\n    }\n    setToValues(index2, value2) {\n      if (this._toValues[index2] != value2) {\n        this._toValues[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get font() {\n      return this._font;\n    }\n    set font(value2) {\n      if (this._font != value2) {\n        this._font = value2;\n        this._hasChanged = true;\n      }\n    }\n    get gridPickDivisionHeight() {\n      return this._gridPickDivisionHeight;\n    }\n    set gridPickDivisionHeight(value2) {\n      if (this._gridPickDivisionHeight != value2) {\n        this._gridPickDivisionHeight = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core) {\n      this._core = core;\n      this._mMatrix = create$4();\n      this._mvMatrix = create$4();\n      this._textMetric = { maxTop: 0, width: 0, maxHeight: 0 };\n      this._gridPickDivisionHeight = core.config.axesGridPickDivisionHeight;\n      this.textBorderWidth = core.config.textBorderWidth;\n      this.gamma = 0;\n      this.gridMajorThickness = core.config.axesGridMajorThickness;\n      this.gridMinorThickness = core.config.axesGridMinorThickness;\n      this.gridZeroThickness = core.config.axesGridZeroThickness;\n      this._font = core.font;\n      this.isGridPickingEnabled = false;\n    }\n    update(elapsedTime) {\n    }\n  }\n  let Quad$2 = class Quad {\n    static positions(transform2) {\n      const positions = new Float32Array(12);\n      const position2 = create$3();\n      for (let i = 0; i < 4; i++) {\n        set$3(position2, this.POSITIONS[i * 3], this.POSITIONS[i * 3 + 1], this.POSITIONS[i * 3 + 2]);\n        transformMat4$2(position2, position2, transform2);\n        positions[i * 3] = position2[0];\n        positions[i * 3 + 1] = position2[1];\n        positions[i * 3 + 2] = position2[2];\n      }\n      return positions;\n    }\n    static textured(transform2, texTransform = Constants.MAT4_IDENTITY) {\n      const positions = this.positions(transform2);\n      const texCoords = this.TEX_COORDS;\n      const vertices = new ArrayBuffer(PositionTextureVertex.SIZE_BYTES * positions.length / 3);\n      const verticesView = new DataView(vertices);\n      const position2 = create$3();\n      const texCoord = create();\n      for (let i = 0; i < positions.length / PositionVertex.SIZE; i++) {\n        set$3(position2, positions[i * PositionVertex.SIZE], positions[i * PositionVertex.SIZE + 1], positions[i * PositionVertex.SIZE + 2]);\n        set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n        transformMat4(texCoord, texCoord, texTransform);\n        PositionTextureVertex.setPosition(verticesView, i, position2);\n        PositionTextureVertex.setTexCoord(verticesView, i, texCoord);\n      }\n      return verticesView;\n    }\n    static normalTextured(transform2, texTransform = Constants.MAT4_IDENTITY) {\n      const positions = this.positions(transform2);\n      const texCoords = this.TEX_COORDS;\n      const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * positions.length / 3);\n      const verticesView = new DataView(vertices);\n      const position2 = create$3();\n      const texCoord = create();\n      const normal3 = create$3();\n      const normal4 = create$2();\n      for (let i = 0; i < positions.length / PositionVertex.SIZE; i++) {\n        set$3(position2, positions[i * PositionVertex.SIZE], positions[i * PositionVertex.SIZE + 1], positions[i * PositionVertex.SIZE + 2]);\n        set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n        transformMat4(texCoord, texCoord, texTransform);\n        PositionNormalTextureVertex.setPosition(verticesView, i, position2);\n        set$2(normal4, 0, 0, 1, 0);\n        transformMat4$1(normal4, normal4, transform2);\n        set$3(normal3, normal4[0], normal4[1], normal4[2]);\n        normalize$2(normal3, normal3);\n        PositionNormalTextureVertex.setNormal(verticesView, i, normal3);\n        PositionNormalTextureVertex.setTexCoord(verticesView, i, texCoord);\n      }\n      return verticesView;\n    }\n  };\n  Quad$2.FACE_NORMALS = [\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Quad$2.FACE_ROTATIONS = [\n    fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n  ];\n  Quad$2.EDGE_POSITIONS = [\n    fromValues$3(0, 0.5, 0),\n    fromValues$3(0.5, 0, 0),\n    fromValues$3(0, -0.5, 0),\n    fromValues$3(-0.5, 0, 0)\n  ];\n  Quad$2.EDGE_NORMALS = [\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, -1, 0),\n    fromValues$3(-1, 0, 0)\n  ];\n  Quad$2.EDGE_POSITIVES = [\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 1, 0)\n  ];\n  Quad$2.EDGE_FORWARDS = [\n    fromValues$3(0, 0, -1),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Quad$2.AXIS_EDGES = [\n    [0, 2],\n    [1, 3]\n  ];\n  Quad$2.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0,\n    0.5,\n    0.5,\n    0,\n    -0.5,\n    -0.5,\n    0,\n    0.5,\n    -0.5,\n    0\n  ]);\n  Quad$2.INDICES = new Uint16Array([0, 2, 1, 1, 2, 3]);\n  Quad$2.TEX_COORDS = new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]);\n  class TextHelper {\n    static truncate(text2, length2) {\n      return text2.length > length2 ? `${text2.substr(0, length2 - 1)}…` : text2;\n    }\n    static measure(font2, text2, size2) {\n      size2.width = 0;\n      let maxDescent = 0;\n      for (const char of text2) {\n        let glyph = font2.glyphs[char];\n        if (!glyph) {\n          font2.addGlyph(char);\n          glyph = font2.glyphs[char];\n        }\n        size2.width += glyph.advance;\n        size2.maxTop = Math.max(glyph.top, size2.maxTop);\n        maxDescent = Math.max(glyph.height - glyph.top, maxDescent);\n      }\n      size2.maxHeight = size2.maxTop + maxDescent;\n    }\n    static wrap(font2, text2, maxWidth) {\n      const lines = [];\n      let width2 = 0;\n      let start = 0;\n      let lastBreakingChar = -1;\n      let widthAfterLastBreakingChar = 0;\n      for (let i = 0; i < text2.length; i++) {\n        let char = text2.charAt(i);\n        let glyph = font2.glyphs[char];\n        if (!glyph) {\n          font2.addGlyph(char);\n          glyph = font2.glyphs[char];\n        }\n        width2 += glyph.advance;\n        if (char == \" \" || char == \"-\") {\n          widthAfterLastBreakingChar = width2;\n          lastBreakingChar = i;\n        }\n        if (width2 > maxWidth) {\n          if (lastBreakingChar == -1) {\n            lines.push(text2.substring(start, i));\n            start = i;\n            width2 += glyph.advance;\n          } else {\n            lines.push(text2.substring(start, lastBreakingChar));\n            start = lastBreakingChar + 1;\n            width2 -= widthAfterLastBreakingChar;\n            widthAfterLastBreakingChar = 0;\n            lastBreakingChar = -1;\n          }\n        }\n      }\n      lines.push(text2.substring(start, text2.length));\n      return lines;\n    }\n    static addString(font2, text2, vertices, indices, index2, position2, scale2, offset2, rotation2, idColor) {\n      for (const char of text2) {\n        this.addGlyph(font2, char, vertices, indices, index2++, position2, scale2, offset2, rotation2, idColor);\n      }\n    }\n    static addGlyph(font2, char, vertices, indices, index2, position2, scale2, offset2, rotation2, idColor) {\n      let glyph = font2.glyphs[char];\n      if (!glyph) {\n        font2.addGlyph(char);\n        glyph = font2.glyphs[char];\n      }\n      const vertexOffset = index2 * 4;\n      const width2 = glyph.width * scale2;\n      const height2 = glyph.height * scale2;\n      const top = glyph.top * scale2;\n      const border = font2.border * scale2;\n      const x02 = offset2[0] - border;\n      const x12 = offset2[0] + width2 + border;\n      const y02 = offset2[1] + top + border;\n      const y12 = offset2[1] + top - height2 - border;\n      const z02 = offset2[2];\n      set$3(this._topLeft, x02, y02, z02);\n      set$3(this._topRight, x12, y02, z02);\n      set$3(this._bottomLeft, x02, y12, z02);\n      set$3(this._bottomRight, x12, y12, z02);\n      if (rotation2) {\n        transformQuat(this._topLeft, this._topLeft, rotation2);\n        transformQuat(this._topRight, this._topRight, rotation2);\n        transformQuat(this._bottomLeft, this._bottomLeft, rotation2);\n        transformQuat(this._bottomRight, this._bottomRight, rotation2);\n      }\n      add(this._vec3, this._topLeft, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset, this._vec3);\n      add(this._vec3, this._topRight, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 1, this._vec3);\n      add(this._vec3, this._bottomLeft, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 2, this._vec3);\n      add(this._vec3, this._bottomRight, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 3, this._vec3);\n      set(this._vec2, glyph.u0, glyph.v0);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset, this._vec2);\n      set(this._vec2, glyph.u1, glyph.v0);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 1, this._vec2);\n      set(this._vec2, glyph.u0, glyph.v1);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 2, this._vec2);\n      set(this._vec2, glyph.u1, glyph.v1);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 3, this._vec2);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 1, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 2, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 3, idColor);\n      offset2[0] += glyph.advance * scale2;\n      const indexTemplate = Quad$2.INDICES;\n      const indexOffset = index2 * 6;\n      for (let i = 0; i < 6; i++) {\n        indices[indexOffset + i] = indexTemplate[i] + vertexOffset;\n      }\n    }\n  }\n  TextHelper._vec2 = create();\n  TextHelper._vec3 = create$3();\n  TextHelper._topLeft = create$3();\n  TextHelper._topRight = create$3();\n  TextHelper._bottomLeft = create$3();\n  TextHelper._bottomRight = create$3();\n  class PickHelper {\n    static nextPickId() {\n      return this._pickId++;\n    }\n    static encodeNumber(number2, type2, color2) {\n      const encoded = number2 | PickHelper.encodeType(type2);\n      PickHelper.float32ToVec4(encoded, color2);\n    }\n    static decodeNumber(color2) {\n      return color2[0] + (color2[1] << 8) + (color2[2] << 16);\n    }\n    static encodeVec3(vec3, type2, color2) {\n      const encoded = vec3[0] | vec3[1] << 8 | vec3[2] << 16 | PickHelper.encodeType(type2);\n      PickHelper.float32ToVec4(encoded, color2);\n    }\n    static decodeVec3(color2, axes) {\n      axes[0] = color2[0];\n      axes[1] = color2[1];\n      axes[2] = color2[2];\n    }\n    static encodeType(type2) {\n      return type2 << 24;\n    }\n    static decodeType(color2) {\n      return color2[3];\n    }\n    static float32ToVec4(number2, color2) {\n      color2[0] = ((number2 & 255) >>> 0) / 255;\n      color2[1] = ((number2 & 65280) >>> 8) / 255;\n      color2[2] = ((number2 & 16711680) >>> 16) / 255;\n      color2[3] = ((number2 & 4278190080) >>> 24) / 255;\n    }\n    static uint8ArrayToNumber(color2) {\n      return color2[0] + (color2[1] << 8) + (color2[2] << 16) + (color2[3] << 24);\n    }\n  }\n  PickHelper._pickId = 1;\n  class Cartesian3dAxes extends AxesBase {\n    get size() {\n      return this._size;\n    }\n    get isDiscreteX() {\n      return this._isDiscrete[0];\n    }\n    set isDiscreteX(value2) {\n      if (value2 != this._isDiscrete[0]) {\n        this._isDiscrete[0] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteY() {\n      return this._isDiscrete[1];\n    }\n    set isDiscreteY(value2) {\n      if (value2 != this._isDiscrete[1]) {\n        this._isDiscrete[1] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteZ() {\n      return this._isDiscrete[2];\n    }\n    set isDiscreteZ(value2) {\n      if (value2 != this._isDiscrete[2]) {\n        this._isDiscrete[2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (value2 != this._minBoundsZ) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (value2 != this._minBoundsZ) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsOutsideEdge(index2) {\n      return this._isOutsideEdge[index2];\n    }\n    getIsForwardFace(index2) {\n      return this._isForwardFace[index2];\n    }\n    get textVertices() {\n      return this._textVertices;\n    }\n    get textIndices() {\n      return this._textIndices;\n    }\n    getLabelMMatrix(index2) {\n      return this._labelMMatrices[index2];\n    }\n    setLabelPositions(index2, value2) {\n      if (this._labelPositions[index2] != value2) {\n        this._labelPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabels(index2, value2) {\n      if (this._labels[index2] != value2) {\n        this._labels[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabelSizes(index2, value2) {\n      if (this._labelSizes[index2] != value2) {\n        this._labelSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getLabelOrientation(index2) {\n      return this._orientations[index2];\n    }\n    setLabelOrientation(index2, orientation) {\n      if (this._orientations[index2] != orientation) {\n        this._orientations[index2] = orientation;\n        this._hasChanged = true;\n      }\n    }\n    getTitleIndexCount(index2) {\n      return this._titleIndexCounts[index2];\n    }\n    getTitleIndexOffset(index2) {\n      return this._titleIndexOffsets[index2];\n    }\n    getTitleMMatrix(index2) {\n      return this._titleMMatrices[index2];\n    }\n    setTitle(index2, value2) {\n      if (this._titles[index2] != value2) {\n        this._titles[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setTitleSize(index2, value2) {\n      if (this._titleSizes[index2] != value2) {\n        this._titleSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getHeadingIndexCount(index2) {\n      return this._headingIndexCounts[index2];\n    }\n    getHeadingIndexOffset(index2) {\n      return this._headingIndexOffsets[index2];\n    }\n    getHeadingMMatrix(index2) {\n      return this._headingMMatrices[index2];\n    }\n    setHeading(index2, value2) {\n      if (this._headings[index2] != value2) {\n        this._headings[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setHeadingSize(index2, value2) {\n      if (this._headingSizes[index2] != value2) {\n        this._headingSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsLeftToRightHorizontal(index2) {\n      return this._isLeftToRightHorizontal[index2];\n    }\n    getIsLeftToRightVertical(index2) {\n      return this._isLeftToRightVertical[index2];\n    }\n    getAxesLeftToRightIndexCount(index2) {\n      return this._axesLeftToRightIndexCounts[index2];\n    }\n    getAxesRightToLeftIndexCount(index2) {\n      return this._axesRightToLeftIndexCounts[index2];\n    }\n    getAxesLeftToRightIndexOffset(index2) {\n      return this._axesLeftToRightIndexOffsets[index2];\n    }\n    getAxesRightToLeftIndexOffset(index2) {\n      return this._axesRightToLeftIndexOffsets[index2];\n    }\n    get gridVertices() {\n      return this._gridVertices;\n    }\n    get gridIndices() {\n      return this._gridIndices;\n    }\n    getGridTicksIndexCount(index2) {\n      return this._gridTicksIndexCounts[index2];\n    }\n    getGridTicksIndexOffset(index2) {\n      return this._gridTicksIndexOffsets[index2];\n    }\n    getGridFaceIndexCount(index2) {\n      return this._gridFaceIndexCounts[index2];\n    }\n    getGridFaceIndexOffset(index2) {\n      return this._gridFaceIndexOffsets[index2];\n    }\n    getGridTicksMMatrix(index2) {\n      return this._gridTicksMMatrices[index2];\n    }\n    getGridFaceMMatrix(index2) {\n      return this._gridFaceMMatrices[index2];\n    }\n    getGridTicksScale(index2) {\n      return this._gridTicksScales[index2];\n    }\n    getGridFaceZero(index2) {\n      return this._gridFaceZeros[index2];\n    }\n    getGridTicksZero(index2) {\n      return this._gridTicksZeros[index2];\n    }\n    getGridFaceMinorGridlines(index2) {\n      return this._gridFaceMinorGridlines[index2];\n    }\n    getGridTicksMinorGridlines(index2) {\n      return this._gridTicksMinorGridlines[index2];\n    }\n    setTickPositions(index2, value2) {\n      if (this._gridTicksPositions[index2] != value2) {\n        this._gridTicksPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingX() {\n      return this._scalingX;\n    }\n    set scalingX(value2) {\n      if (value2 != this._scalingX) {\n        this._scalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingY() {\n      return this._scalingY;\n    }\n    set scalingY(value2) {\n      if (value2 != this._scalingY) {\n        this._scalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingZ() {\n      return this._scalingZ;\n    }\n    set scalingZ(value2) {\n      if (value2 != this._scalingZ) {\n        this._scalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offset[12];\n    }\n    set offsetX(value2) {\n      if (value2 != this._offset[12]) {\n        this._offset[12] = value2;\n      }\n    }\n    get offsetY() {\n      return this._offset[13];\n    }\n    set offsetY(value2) {\n      if (value2 != this._offset[13]) {\n        this._offset[13] = value2;\n      }\n    }\n    get offsetZ() {\n      return this._offset[14];\n    }\n    set offsetZ(value2) {\n      if (value2 != this._offset[14]) {\n        this._offset[14] = value2;\n      }\n    }\n    constructor(core) {\n      super(core);\n      this._size = create$3();\n      this._translation = create$3();\n      this._normal = create$3();\n      this._forward = create$3();\n      this._right = create$3();\n      this._up = create$3();\n      this._texCoord = create();\n      this._bounds = create$2();\n      this._vec3 = create$3();\n      this._vec4 = create$2();\n      this._mat3 = create$5();\n      this._isDiscrete = [false, false, false];\n      this._minBoundsX = 0;\n      this._minBoundsY = 0;\n      this._minBoundsZ = 0;\n      this._maxBoundsX = 0;\n      this._maxBoundsY = 0;\n      this._maxBoundsZ = 0;\n      this._isForwardFace = [];\n      this._isForwardEdge = [];\n      this._isOutsideEdge = [];\n      for (let i = 0; i < 6; i++) {\n        this._isForwardFace.push(false);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._isForwardEdge.push(false);\n        this._isOutsideEdge.push(false);\n      }\n      this._textOffset = create$3();\n      this._textPosition = create$3();\n      this._distances = [];\n      for (let i = 0; i < 12; i++) {\n        this._distances.push(0);\n      }\n      this._labelPositions = [];\n      this._labels = [];\n      this._labelSizes = [];\n      this._maxLabelSize = [];\n      this._axesLeftToRightIndexCounts = [];\n      this._axesRightToLeftIndexCounts = [];\n      this._axesLeftToRightIndexOffsets = [];\n      this._axesRightToLeftIndexOffsets = [];\n      this._labelMMatrices = [];\n      this._orientations = [];\n      for (let i = 0; i < 3; i++) {\n        this._maxLabelSize.push(create());\n        this._orientations.push(AxesTextOrientation.parallel);\n        this._axesLeftToRightIndexCounts.push(0);\n        this._axesRightToLeftIndexCounts.push(0);\n        this._axesLeftToRightIndexOffsets.push(0);\n        this._axesRightToLeftIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._labelMMatrices.push(create$4());\n      }\n      this._titles = [];\n      this._titleSizes = [];\n      this._titleIndexCounts = [];\n      this._titleIndexOffsets = [];\n      this._titleMMatrices = [];\n      for (let i = 0; i < 3; i++) {\n        this._titles.push(null);\n        this._titleSizes.push(core.config.axesTextTitleSize);\n        this._titleIndexCounts.push(0);\n        this._titleIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._titleMMatrices.push(create$4());\n      }\n      this._headings = [];\n      this._headingSizes = [];\n      this._headingIndexCounts = [];\n      this._headingIndexOffsets = [];\n      this._headingMMatrices = [];\n      this.isHeadingVisible = [];\n      for (let i = 0; i < 3; i++) {\n        this._headings.push(null);\n        this._headingSizes.push(core.config.axesTextHeadingSize);\n        this._headingIndexCounts.push(0);\n        this._headingIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._headingMMatrices.push(create$4());\n        this.isHeadingVisible.push(true);\n      }\n      this.isEdgeVisible = [];\n      this._edgePosition = create$3();\n      this._edgePositive = create$3();\n      this._edgeNormal = create$3();\n      this._edgeNormalTemp = create$3();\n      this._edgePositiveTemp = create$3();\n      this._isLeftToRightHorizontal = [];\n      this._isLeftToRightVertical = [];\n      this._edgeHorizontalRight = [];\n      this._edgeHorizontalUp = [];\n      this._edgeHorizontalForward = [];\n      this._edgeVerticalRight = [];\n      this._edgeVerticalUp = [];\n      this._edgeVerticalForward = [];\n      for (let i = 0; i < 12; i++) {\n        this.isEdgeVisible.push(true);\n        this._isLeftToRightHorizontal.push(false);\n        this._isLeftToRightVertical.push(false);\n        this._edgeHorizontalRight.push(create$3());\n        this._edgeHorizontalUp.push(create$3());\n        this._edgeHorizontalForward.push(create$3());\n        this._edgeVerticalRight.push(create$3());\n        this._edgeVerticalUp.push(create$3());\n        this._edgeVerticalForward.push(create$3());\n      }\n      this.isFaceVisible = [];\n      for (let i = 0; i < 6; i++) {\n        this.isFaceVisible.push(true);\n      }\n      this.arePickDivisionsVisible = [];\n      this.areFacesVisible = [];\n      this._indexTemplate = Quad$2.INDICES;\n      this.zero = create$3();\n      this._gridTicksZeros = [];\n      this._gridFaceZeros = [];\n      this.minorGridlines = fromValues$3(1, 1, 1);\n      this._gridTicksMinorGridlines = [];\n      this._gridFaceMinorGridlines = [];\n      this._gridTicksPositions = [];\n      this._gridTicksScales = [];\n      this._gridTicksIndexCounts = [];\n      this._gridTicksIndexOffsets = [];\n      this._gridFaceScale = create$3();\n      this._gridFaceIndexCounts = [];\n      this._gridFaceIndexOffsets = [];\n      this._gridFaceMMatrices = [];\n      this._gridTicksMMatrices = [];\n      this._gridTicksRotations = [];\n      for (let i = 0; i < 3; i++) {\n        this.arePickDivisionsVisible.push(true);\n        this.areFacesVisible.push(true);\n        this._gridTicksZeros.push(create());\n        this._gridFaceZeros.push(create());\n        this._gridTicksMinorGridlines.push(create());\n        this._gridFaceMinorGridlines.push(create());\n        this._gridTicksScales.push(create$3());\n        this._gridTicksIndexCounts.push(0);\n        this._gridTicksIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 6; i++) {\n        this._gridFaceIndexCounts.push(0);\n        this._gridFaceIndexOffsets.push(0);\n        this._gridFaceMMatrices.push(create$4());\n      }\n      for (let i = 0; i < 12; i++) {\n        this._gridTicksMMatrices.push(create$4());\n        this._gridTicksRotations.push(create$4());\n        const _mat4 = this._gridTicksRotations[i];\n        _mat4[0] = Cube.EDGE_POSITIVES[i][0];\n        _mat4[1] = Cube.EDGE_POSITIVES[i][1];\n        _mat4[2] = Cube.EDGE_POSITIVES[i][2];\n        _mat4[4] = Cube.EDGE_NORMALS[i][0];\n        _mat4[5] = Cube.EDGE_NORMALS[i][1];\n        _mat4[6] = Cube.EDGE_NORMALS[i][2];\n        cross(this._vec3, Cube.EDGE_POSITIVES[i], Cube.EDGE_NORMALS[i]);\n        _mat4[8] = this._vec3[0];\n        _mat4[9] = this._vec3[1];\n        _mat4[10] = this._vec3[2];\n      }\n      this._fromValues = [null, null, null];\n      this._toValues = [null, null, null];\n      this.isDivisionPickingEnabled = [false, false, false];\n      this.isLabelPickingEnabled = [false, false, false];\n      this.isTitlePickingEnabled = [false, false, false];\n      this.isHeadingPickingEnabled = [false, false, false];\n      this.isAxisReversed = [false, false, false];\n      this._scalingX = 1;\n      this._scalingY = 1;\n      this._scalingZ = 1;\n      this._offset = create$4();\n    }\n    initialize() {\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this.isInitialized) {\n        if (this._hasChanged) {\n          const start = window.performance.now();\n          this._hasChanged = false;\n          set$3(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, this._maxBoundsZ - this._minBoundsZ);\n          const maxBounds = Math.max(this._size[0], Math.max(this._size[1], this._size[2]));\n          this._size[0] *= this._scalingX / maxBounds;\n          this._size[1] *= this._scalingY / maxBounds;\n          this._size[2] *= this._scalingZ / maxBounds;\n          this._updateGrids(this._size);\n          this._updateText(this._size);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n          this._core.log.write(LogLevel.info, `cartesian3d updated ${Math.round(window.performance.now() - start)}ms`);\n        }\n        multiply$2(this._mMatrix, this.mMatrix, this._offset);\n        this._mvMatrix = create$4();\n        multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n        fromMat4(this._mat3, this._mvMatrix);\n        for (let faceId = 0; faceId < 6; faceId++) {\n          multiply$1(this._vec3, Cube.FACE_POSITIONS[faceId], this._size);\n          transformMat4$2(this._forward, this._vec3, this._mvMatrix);\n          transformMat3(this._normal, Cube.FACE_NORMALS[faceId], this._mat3);\n          this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n        }\n        this._forward[0] = this._mat3[2];\n        this._forward[1] = this._mat3[5];\n        this._forward[2] = this._mat3[8];\n        for (let edgeId = 0; edgeId < 12; edgeId++) {\n          const faceIds = Cube.EDGE_FACES[edgeId];\n          const forward1 = this._isForwardFace[faceIds[0]];\n          const forward2 = this._isForwardFace[faceIds[1]];\n          const outsideEdge = forward1 != forward2;\n          this._isOutsideEdge[edgeId] = outsideEdge;\n          if (outsideEdge) {\n            this._isForwardEdge[edgeId] = dot$1(Cube.EDGE_FORWARDS[edgeId], this._forward) < 0;\n          }\n          this._distances[edgeId] = 0;\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          if (this.arePickDivisionsVisible[axisId]) {\n            set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n            set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n            const gridTicksScale = this._gridTicksScales[axisId];\n            for (let edge = 0; edge < 4; edge++) {\n              const edgeId = Cube.AXIS_EDGES[axisId][edge];\n              if (this._isOutsideEdge[edgeId] && this.isEdgeVisible[edgeId]) {\n                let distance2 = this._distances[edgeId];\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n                scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n                translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                if (!this._isForwardEdge[edgeId]) {\n                  scale$1(gridTicksMMatrix, gridTicksMMatrix, Constants.VECTOR3_REFLECTX);\n                }\n                scale$1(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                this._distances[edgeId] = distance2;\n              }\n            }\n          }\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          if (this.areFacesVisible[axisId]) {\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            set(this._gridFaceZeros[axisId], this.zero[axisId2], this.zero[axisId3]);\n            set(this._gridFaceMinorGridlines[axisId], this.minorGridlines[axisId2], this.minorGridlines[axisId3]);\n            for (let face = 0; face < 2; face++) {\n              const faceId = Cube.AXIS_FACES[axisId][face];\n              if (this._isForwardFace[faceId]) {\n                const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                scale$1(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                if (this._size[axisId] > 0) {\n                  translate(gridFaceMMatrix, gridFaceMMatrix, Cube.FACE_POSITIONS[faceId]);\n                }\n              }\n            }\n          }\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (this._isOutsideEdge[edgeId]) {\n              multiply$1(this._edgePosition, Cube.EDGE_POSITIONS[edgeId], this._size);\n              transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n              normalize$2(this._forward, this._edgePosition);\n              negate(this._forward, this._forward);\n              cross(this._right, Constants.VECTOR3_UNITY, this._forward);\n              normalize$2(this._right, this._right);\n              cross(this._up, this._forward, this._right);\n              transformMat3(this._edgeNormal, Cube.EDGE_NORMALS[edgeId], this._mat3);\n              transformMat3(this._edgePositive, Cube.EDGE_POSITIVES[edgeId], this._mat3);\n              copy$3(this._edgeNormalTemp, this._edgeNormal);\n              copy$3(this._edgePositiveTemp, this._edgePositive);\n              const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n              const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n              const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n              if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n                copy$3(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n              } else {\n                negate(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n                negate(this._edgeNormalTemp, this._edgeNormalTemp);\n              }\n              if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n                this._isLeftToRightHorizontal[edgeId] = true;\n                copy$3(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n              } else {\n                this._isLeftToRightHorizontal[edgeId] = false;\n                negate(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n                negate(this._edgePositiveTemp, this._edgePositiveTemp);\n              }\n              cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n              if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n                this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                negate(edgeHorizontalRight, edgeHorizontalRight);\n              }\n              cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n              const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n              const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n              const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n              if (dot$1(this._edgeNormal, this._right) < 0) {\n                copy$3(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n              } else {\n                negate(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n                negate(this._edgeNormal, this._edgeNormal);\n              }\n              if (dot$1(this._edgePositive, this._up) < 0) {\n                this._isLeftToRightVertical[edgeId] = true;\n                copy$3(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n              } else {\n                this._isLeftToRightVertical[edgeId] = false;\n                negate(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n                negate(this._edgePositive, this._edgePositive);\n              }\n              cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n              if (dot$1(edgeVerticalForward, this._forward) < 0) {\n                this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                negate(edgeVerticalRight, edgeVerticalRight);\n              }\n              cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n              if (this.isEdgeVisible[edgeId]) {\n                if (this._labels[axisId]) {\n                  this._updateLabels(axisId, edgeId);\n                }\n                if (this._titles[axisId]) {\n                  this._updateTitle(axisId, edgeId);\n                }\n              }\n              if (this.isHeadingVisible[edgeId]) {\n                this._updateHeading(axisId, edgeId);\n              }\n            }\n          }\n        }\n      }\n    }\n    _updateLabels(axisId, edgeId) {\n      const orientation = this._orientations[axisId];\n      let distance2 = this._distances[edgeId];\n      let maxLabelSize = this._maxLabelSize[axisId][1];\n      if (orientation == AxesTextOrientation.parallel)\n        maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n      distance2 += maxLabelSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const labelMMatrix = this._labelMMatrices[edgeId];\n      labelMMatrix[12] = this._vec3[0];\n      labelMMatrix[13] = this._vec3[1];\n      labelMMatrix[14] = this._vec3[2];\n      if (orientation == AxesTextOrientation.parallel) {\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      } else {\n        const right = this._edgeVerticalRight[edgeId];\n        const up = this._edgeVerticalUp[edgeId];\n        const forward = this._edgeVerticalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      }\n      multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n      if (orientation == AxesTextOrientation.perpendicular) {\n        multiply$2(labelMMatrix, labelMMatrix, Constants.MAT4_ROTATION_MINUS_90);\n      }\n      distance2 += maxLabelSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateTitle(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n      distance2 += titleTextSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const titleMMatrix = this._titleMMatrices[edgeId];\n      titleMMatrix[12] = this._vec3[0];\n      titleMMatrix[13] = this._vec3[1];\n      titleMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      titleMMatrix[0] = right[0];\n      titleMMatrix[1] = right[1];\n      titleMMatrix[2] = right[2];\n      titleMMatrix[4] = up[0];\n      titleMMatrix[5] = up[1];\n      titleMMatrix[6] = up[2];\n      titleMMatrix[8] = forward[0];\n      titleMMatrix[9] = forward[1];\n      titleMMatrix[10] = forward[2];\n      multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n      distance2 += titleTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateHeading(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n      distance2 += headingTextSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const headingMMatrix = this._headingMMatrices[edgeId];\n      headingMMatrix[12] = this._vec3[0];\n      headingMMatrix[13] = this._vec3[1];\n      headingMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      headingMMatrix[0] = right[0];\n      headingMMatrix[1] = right[1];\n      headingMMatrix[2] = right[2];\n      headingMMatrix[4] = up[0];\n      headingMMatrix[5] = up[1];\n      headingMMatrix[6] = up[2];\n      headingMMatrix[8] = forward[0];\n      headingMMatrix[9] = forward[1];\n      headingMMatrix[10] = forward[2];\n      multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n      distance2 += headingTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateGrids(size2) {\n      let offset2 = 0;\n      this.pickGridLookup = {};\n      this._pickGrid = [];\n      const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n      const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n      const zDivisions = this._gridTicksPositions[2] ? this._gridTicksPositions[2].length - 1 : 0;\n      const count2 = 2 * (xDivisions * yDivisions) + 2 * (xDivisions * zDivisions) + 2 * (yDivisions * zDivisions) + xDivisions + yDivisions + zDivisions;\n      const byteLength = PickGridVertex.SIZE_BYTES * count2 * 4;\n      if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n        this._gridVertices = new ArrayBuffer(byteLength);\n        this._gridVerticesView = new DataView(this._gridVertices);\n        this._gridIndices = new Uint16Array(count2 * 6);\n      }\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const width2 = size2[axisId];\n        set$3(this._gridTicksScales[axisId], width2, this._gridPickDivisionHeight, 1);\n        offset2 = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset2);\n        for (let face = 0; face < 2; face++) {\n          const faceId = Cube.AXIS_FACES[axisId][face];\n          offset2 = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset2);\n        }\n        this._gridFaceScale[axisId] = size2[axisId] == 0 ? 1 : size2[axisId];\n      }\n    }\n    _updateText(size2) {\n      let glyphOffset = 0;\n      let count2 = 0;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const labels = this._labels[axisId];\n        if (labels) {\n          for (let i = 0; i < labels.length; i++) {\n            count2 += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n          }\n        }\n        const title = this._titles[axisId];\n        if (title) {\n          count2 += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n        }\n        const heading = this._headings[axisId];\n        if (heading) {\n          count2 += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n      }\n      const byteLength = PositionTexturePickVertex.SIZE_BYTES * count2 * 4;\n      if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n        this._textVertices = new ArrayBuffer(byteLength);\n        this._textVerticesView = new DataView(this._textVertices);\n        this._textIndices = new Uint16Array(count2 * 6);\n      }\n      this.pickLabelLookup = {};\n      this._pickLabel = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._labels[axisId]) {\n          const width2 = size2[axisId];\n          const maxLabelSize = this._maxLabelSize[axisId];\n          const orientation = this._orientations[axisId];\n          set(maxLabelSize, 0, 0);\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateLeftToRightAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateRightToLeftAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesLeftToRightIndexCounts[axisId] = 0;\n          this._axesRightToLeftIndexCounts[axisId] = 0;\n          this._maxLabelSize[axisId][0] = 0;\n          this._maxLabelSize[axisId][1] = 0;\n        }\n      }\n      this.pickTitleLookup = {};\n      this._pickTitle = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._titles[axisId]) {\n          set$3(this._textPosition, 0, 0, 0);\n          set$3(this._textOffset, 0, 0, 0);\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n          const scale2 = this._titleSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n          this.pickTitleLookup[pickId] = this._pickTitle.length;\n          this._pickTitle.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          this._titleIndexCounts[axisId] = 0;\n        }\n      }\n      this.pickHeadingLookup = {};\n      this._pickHeading = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._headings[axisId]) {\n          set$3(this._textPosition, 0, 0, 0);\n          set$3(this._textOffset, 0, 0, 0);\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n          const scale2 = this._headingSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n          this.pickHeadingLookup[pickId] = this._pickHeading.length;\n          this._pickHeading.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          this._headingIndexCounts[axisId] = 0;\n        }\n      }\n    }\n    _updateLeftToRightAxisLabels(axisId, size2, maxSize, glyphOffset, orientation, labels, positions, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions[label2] : positions[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$3(this._textPosition, (position2 - 0.5) * size2, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = position2 == 0 ? 0 : position2 == 1 ? -width2 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            maxSize[0] = Math.max(width2, maxSize[0]);\n            maxSize[1] = Math.max(lineHeight2, maxSize[1]);\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$3(this._textPosition, 0, (position2 - 0.5) * size2, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = position2 == 0 ? 0 : position2 == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n            }\n            maxSize[0] = Math.max(lineHeight2, maxSize[0]);\n            maxSize[1] = Math.max(width2, maxSize[1]);\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size2, maxSize, glyphOffset, orientation, labels, positions, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions[label2] : positions[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$3(this._textPosition, (0.5 - position2) * size2, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = label2 == 0 ? -width2 : label2 == labels.length - 1 ? 0 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$3(this._textPosition, 0, (0.5 - position2) * size2, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = label2 == 0 ? -maxGlyphTop : label2 == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n            }\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset2) {\n      this._gridTicksIndexOffsets[axisId] = offset2 * 6;\n      if (this._gridTicksPositions[axisId]) {\n        const axes = create$3();\n        const positions = this._gridTicksPositions[axisId];\n        const isAxisReversed = this.isAxisReversed[axisId];\n        let vertexOffset = offset2 * 4;\n        for (let position2 = 0; position2 < positions.length - 1; position2++) {\n          const left = isAxisReversed ? 1 - positions[position2 + 1] - 0.5 : positions[position2] - 0.5;\n          const right = isAxisReversed ? 1 - positions[position2] - 0.5 : positions[position2 + 1] - 0.5;\n          axes[axisId] = position2 + 1;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n          this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n          this._pickGrid.push(axes[0]);\n          this._pickGrid.push(axes[1]);\n          this._pickGrid.push(axes[2]);\n          let indexOffset = offset2 * 6;\n          for (let j = 0; j < this._indexTemplate.length; j++) {\n            indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n          }\n          set$2(this._bounds, left + 0.5, 0, right + 0.5, 1);\n          this._translation[0] = left;\n          this._translation[1] = 0.5;\n          this._translation[2] = 0;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 1;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = left;\n          this._translation[1] = -0.5;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 0;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          offset2++;\n        }\n      }\n      this._gridTicksIndexCounts[axisId] = offset2 * 6 - this._gridTicksIndexOffsets[axisId];\n      return offset2;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset2) {\n      set$3(this._translation, 0, 0, 0);\n      this._gridFaceIndexOffsets[faceId] = offset2 * 6;\n      const axisId2 = axisId == 0 ? 1 : 0;\n      const axisId3 = axisId == 2 ? 1 : 2;\n      if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n        const axes = create$3();\n        negate(this._normal, Cube.FACE_NORMALS[faceId]);\n        const positions2 = this._gridTicksPositions[axisId2];\n        const positions3 = this._gridTicksPositions[axisId3];\n        const isAxisReversed2 = this.isAxisReversed[axisId2];\n        const isAxisReversed3 = this.isAxisReversed[axisId3];\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId2] = position2 + 1;\n          let vertexOffset = offset2 * 4;\n          for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n            const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n            const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n            axes[axisId3] = position3 + 1;\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n            this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n            this._pickGrid.push(axes[0]);\n            this._pickGrid.push(axes[1]);\n            this._pickGrid.push(axes[2]);\n            let indexOffset = offset2 * 6;\n            for (let i = 0; i < this._indexTemplate.length; i++) {\n              indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n            }\n            set$2(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = max3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = max3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = min3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = min3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            offset2++;\n          }\n        }\n      }\n      this._gridFaceIndexCounts[faceId] = offset2 * 6 - this._gridFaceIndexOffsets[faceId];\n      return offset2;\n    }\n  }\n  class Cartesian2dAxes extends AxesBase {\n    get size() {\n      return this._size;\n    }\n    get isDiscreteX() {\n      return this._isDiscrete[0];\n    }\n    set isDiscreteX(value2) {\n      if (value2 != this._isDiscrete[0]) {\n        this._isDiscrete[0] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteY() {\n      return this._isDiscrete[1];\n    }\n    set isDiscreteY(value2) {\n      if (value2 != this._isDiscrete[1]) {\n        this._isDiscrete[1] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsOutsideEdge(index2) {\n      return this._isOutsideEdge[index2];\n    }\n    getIsForwardFace(index2) {\n      return this._isForwardFace[index2];\n    }\n    get textVertices() {\n      return this._textVertices;\n    }\n    get textIndices() {\n      return this._textIndices;\n    }\n    getLabelMMatrix(index2) {\n      return this._labelMMatrices[index2];\n    }\n    setLabelPositions(index2, value2) {\n      if (this._labelPositions[index2] != value2) {\n        this._labelPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabels(index2, value2) {\n      if (this._labels[index2] != value2) {\n        this._labels[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabelSizes(index2, value2) {\n      if (this._labelSizes[index2] != value2) {\n        this._labelSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getLabelOrientation(index2) {\n      return this._orientations[index2];\n    }\n    setLabelOrientation(index2, orientation) {\n      if (this._orientations[index2] != orientation) {\n        this._orientations[index2] = orientation;\n        this._hasChanged = true;\n      }\n    }\n    getTitleIndexCount(index2) {\n      return this._titleIndexCounts[index2];\n    }\n    getTitleIndexOffset(index2) {\n      return this._titleIndexOffsets[index2];\n    }\n    getTitleMMatrix(index2) {\n      return this._titleMMatrices[index2];\n    }\n    setTitle(index2, value2) {\n      if (this._titles[index2] != value2) {\n        this._titles[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setTitleSize(index2, value2) {\n      if (this._titleSizes[index2] != value2) {\n        this._titleSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getHeadingIndexCount(index2) {\n      return this._headingIndexCounts[index2];\n    }\n    getHeadingIndexOffset(index2) {\n      return this._headingIndexOffsets[index2];\n    }\n    getHeadingMMatrix(index2) {\n      return this._headingMMatrices[index2];\n    }\n    setHeading(index2, value2) {\n      if (this._headings[index2] != value2) {\n        this._headings[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setHeadingSize(index2, value2) {\n      if (this._headingSizes[index2] != value2) {\n        this._headingSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsLeftToRightHorizontal(index2) {\n      return this._isLeftToRightHorizontal[index2];\n    }\n    getIsLeftToRightVertical(index2) {\n      return this._isLeftToRightVertical[index2];\n    }\n    getAxesLeftToRightIndexCount(index2) {\n      return this._axesLeftToRightIndexCounts[index2];\n    }\n    getAxesRightToLeftIndexCount(index2) {\n      return this._axesRightToLeftIndexCounts[index2];\n    }\n    getAxesLeftToRightIndexOffset(index2) {\n      return this._axesLeftToRightIndexOffsets[index2];\n    }\n    getAxesRightToLeftIndexOffset(index2) {\n      return this._axesRightToLeftIndexOffsets[index2];\n    }\n    get gridVertices() {\n      return this._gridVertices;\n    }\n    get gridIndices() {\n      return this._gridIndices;\n    }\n    getGridTicksIndexCount(index2) {\n      return this._gridTicksIndexCounts[index2];\n    }\n    getGridTicksIndexOffset(index2) {\n      return this._gridTicksIndexOffsets[index2];\n    }\n    getGridFaceIndexCount(index2) {\n      return this._gridFaceIndexCounts[index2];\n    }\n    getGridFaceIndexOffset(index2) {\n      return this._gridFaceIndexOffsets[index2];\n    }\n    getGridTicksMMatrix(index2) {\n      return this._gridTicksMMatrices[index2];\n    }\n    getGridFaceMMatrix(index2) {\n      return this._gridFaceMMatrices[index2];\n    }\n    getGridTicksScale(index2) {\n      return this._gridTicksScales[index2];\n    }\n    getGridTicksZero(index2) {\n      return this._gridTicksZeros[index2];\n    }\n    get gridFaceZero() {\n      return this._gridFaceZeros;\n    }\n    get gridFaceMinorGridlines() {\n      return this._gridFaceMinorGridlines;\n    }\n    getGridTicksMinorGridlines(index2) {\n      return this._gridTicksMinorGridlines[index2];\n    }\n    setTickPositions(index2, value2) {\n      if (this._gridTicksPositions[index2] != value2) {\n        this._gridTicksPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingX() {\n      return this._scalingX;\n    }\n    set scalingX(value2) {\n      if (value2 != this._scalingX) {\n        this._scalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingY() {\n      return this._scalingY;\n    }\n    set scalingY(value2) {\n      if (value2 != this._scalingY) {\n        this._scalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offset[12];\n    }\n    set offsetX(value2) {\n      if (value2 != this._offset[12]) {\n        this._offset[12] = value2;\n      }\n    }\n    get offsetY() {\n      return this._offset[13];\n    }\n    set offsetY(value2) {\n      if (value2 != this._offset[13]) {\n        this._offset[13] = value2;\n      }\n    }\n    set rotation(value2) {\n      if (this._rotation != value2) {\n        this._rotation = value2;\n        this._rMatrix = create$4();\n        fromQuat(this._rMatrix, value2);\n      }\n    }\n    constructor(core) {\n      super(core);\n      this._size = create$3();\n      this._translation = create$3();\n      this._normal = create$3();\n      this._forward = create$3();\n      this._right = create$3();\n      this._up = create$3();\n      this._texCoord = create();\n      this._bounds = create$2();\n      this._vec3 = create$3();\n      this._vec4 = create$2();\n      this._mat3 = create$5();\n      this._isDiscrete = [false, false];\n      this._minBoundsX = 0;\n      this._minBoundsY = 0;\n      this._maxBoundsX = 0;\n      this._maxBoundsY = 0;\n      this._isForwardFace = [];\n      this._isForwardEdge = [];\n      this._isOutsideEdge = [];\n      for (let i = 0; i < 2; i++) {\n        this._isForwardFace.push(false);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._isForwardEdge.push(false);\n        this._isOutsideEdge.push(false);\n      }\n      this._textOffset = create$3();\n      this._textPosition = create$3();\n      this._distances = [];\n      for (let i = 0; i < 4; i++) {\n        this._distances.push(0);\n      }\n      this._labelPositions = [];\n      this._labels = [];\n      this._labelSizes = [];\n      this._maxLabelSize = [];\n      this._axesLeftToRightIndexCounts = [];\n      this._axesRightToLeftIndexCounts = [];\n      this._axesLeftToRightIndexOffsets = [];\n      this._axesRightToLeftIndexOffsets = [];\n      this._labelMMatrices = [];\n      this._orientations = [];\n      for (let i = 0; i < 2; i++) {\n        this._maxLabelSize.push(create());\n        this._orientations.push(AxesTextOrientation.parallel);\n        this._axesLeftToRightIndexCounts.push(0);\n        this._axesRightToLeftIndexCounts.push(0);\n        this._axesLeftToRightIndexOffsets.push(0);\n        this._axesRightToLeftIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._labelMMatrices.push(create$4());\n      }\n      this._titles = [];\n      this._titleSizes = [];\n      this._titleIndexCounts = [];\n      this._titleIndexOffsets = [];\n      this._titleMMatrices = [];\n      for (let i = 0; i < 2; i++) {\n        this._titles.push(null);\n        this._titleSizes.push(core.config.axesTextTitleSize);\n        this._titleIndexCounts.push(0);\n        this._titleIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._titleMMatrices.push(create$4());\n      }\n      this._headings = [];\n      this._headingSizes = [];\n      this._headingIndexCounts = [];\n      this._headingIndexOffsets = [];\n      this._headingMMatrices = [];\n      this.isHeadingVisible = [];\n      for (let i = 0; i < 2; i++) {\n        this._headings.push(null);\n        this._headingSizes.push(core.config.axesTextHeadingSize);\n        this._headingIndexCounts.push(0);\n        this._headingIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._headingMMatrices.push(create$4());\n        this.isHeadingVisible.push(true);\n      }\n      this.isEdgeVisible = [];\n      this._edgePosition = create$3();\n      this._edgePositive = create$3();\n      this._edgeNormal = create$3();\n      this._edgeNormalTemp = create$3();\n      this._edgePositiveTemp = create$3();\n      this._isLeftToRightHorizontal = [];\n      this._isLeftToRightVertical = [];\n      this._edgeHorizontalRight = [];\n      this._edgeHorizontalUp = [];\n      this._edgeHorizontalForward = [];\n      this._edgeVerticalRight = [];\n      this._edgeVerticalUp = [];\n      this._edgeVerticalForward = [];\n      for (let i = 0; i < 4; i++) {\n        this.isEdgeVisible.push(true);\n        this._isLeftToRightHorizontal.push(false);\n        this._isLeftToRightVertical.push(false);\n        this._edgeHorizontalRight.push(create$3());\n        this._edgeHorizontalUp.push(create$3());\n        this._edgeHorizontalForward.push(create$3());\n        this._edgeVerticalRight.push(create$3());\n        this._edgeVerticalUp.push(create$3());\n        this._edgeVerticalForward.push(create$3());\n      }\n      this.isFaceVisible = [];\n      for (let i = 0; i < 2; i++) {\n        this.isFaceVisible.push(true);\n      }\n      this.arePickDivisionsVisible = [];\n      this.areFacesVisible = [];\n      this._indexTemplate = Quad$2.INDICES;\n      this.zero = create$3();\n      this._gridTicksZeros = [];\n      this._gridFaceZeros = create();\n      this.minorGridlines = fromValues$3(1, 1, 1);\n      this._gridTicksMinorGridlines = [];\n      this._gridFaceMinorGridlines = create();\n      this._gridTicksPositions = [];\n      this._gridTicksScales = [];\n      this._gridTicksIndexCounts = [];\n      this._gridTicksIndexOffsets = [];\n      this._gridFaceScale = create$3();\n      this._gridFaceIndexCounts = [];\n      this._gridFaceIndexOffsets = [];\n      this._gridFaceMMatrices = [];\n      this._gridTicksMMatrices = [];\n      this._gridTicksRotations = [];\n      for (let i = 0; i < 2; i++) {\n        this.arePickDivisionsVisible.push(true);\n        this.areFacesVisible.push(true);\n        this._gridTicksZeros.push(create());\n        this._gridTicksMinorGridlines.push(create());\n        this._gridTicksScales.push(create$3());\n        this._gridTicksIndexCounts.push(0);\n        this._gridTicksIndexOffsets.push(0);\n        this._gridFaceIndexCounts.push(0);\n        this._gridFaceIndexOffsets.push(0);\n        this._gridFaceMMatrices.push(create$4());\n      }\n      for (let i = 0; i < 4; i++) {\n        this._gridTicksMMatrices.push(create$4());\n        this._gridTicksRotations.push(create$4());\n        const _mat4 = this._gridTicksRotations[i];\n        _mat4[0] = Quad$2.EDGE_POSITIVES[i][0];\n        _mat4[1] = Quad$2.EDGE_POSITIVES[i][1];\n        _mat4[2] = Quad$2.EDGE_POSITIVES[i][2];\n        _mat4[4] = Quad$2.EDGE_NORMALS[i][0];\n        _mat4[5] = Quad$2.EDGE_NORMALS[i][1];\n        _mat4[6] = Quad$2.EDGE_NORMALS[i][2];\n        cross(this._vec3, Quad$2.EDGE_POSITIVES[i], Quad$2.EDGE_NORMALS[i]);\n        _mat4[8] = this._vec3[0];\n        _mat4[9] = this._vec3[1];\n        _mat4[10] = this._vec3[2];\n      }\n      this._fromValues = [null, null];\n      this._toValues = [null, null];\n      this.isDivisionPickingEnabled = [false, false];\n      this.isLabelPickingEnabled = [false, false];\n      this.isTitlePickingEnabled = [false, false];\n      this.isHeadingPickingEnabled = [false, false];\n      this.isAxisReversed = [false, false];\n      this._scalingX = 1;\n      this._scalingY = 1;\n      this._offset = create$4();\n    }\n    initialize() {\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this.isInitialized) {\n        if (this._hasChanged) {\n          const start = window.performance.now();\n          this._hasChanged = false;\n          set$3(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, 0);\n          const maxBounds = Math.max(this._size[0], this._size[1]);\n          this._size[0] *= this._scalingX / maxBounds;\n          this._size[1] *= this._scalingY / maxBounds;\n          this._updateGrids(this._size);\n          this._updateText(this._size);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n          this._core.log.write(LogLevel.info, `cartesian2d updated ${Math.round(window.performance.now() - start)}ms`);\n        }\n        if (this._rMatrix) {\n          mul(this._mMatrix, this.mMatrix, this._rMatrix);\n          mul(this._mMatrix, this._mMatrix, this._offset);\n        } else {\n          multiply$2(this._mMatrix, this.mMatrix, this._offset);\n        }\n        this._mvMatrix = create$4();\n        multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n        fromMat4(this._mat3, this._mvMatrix);\n        for (let faceId = 0; faceId < 2; faceId++) {\n          transformMat4$2(this._forward, Constants.VECTOR3_ZERO, this._mvMatrix);\n          transformMat3(this._normal, Quad$2.FACE_NORMALS[faceId], this._mat3);\n          this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n        }\n        this._forward[0] = this._mat3[2];\n        this._forward[1] = this._mat3[5];\n        this._forward[2] = this._mat3[8];\n        for (let edgeId = 0; edgeId < 4; edgeId++) {\n          this._isForwardEdge[edgeId] = dot$1(Quad$2.EDGE_FORWARDS[edgeId], this._forward) < 0;\n          this._distances[edgeId] = 0;\n        }\n        for (let axisId = 0; axisId < 2; axisId++) {\n          if (this.arePickDivisionsVisible[axisId]) {\n            set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n            set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n            const gridTicksScale = this._gridTicksScales[axisId];\n            for (let edge = 0; edge < 2; edge++) {\n              const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n              if (this.isEdgeVisible[edgeId]) {\n                let distance2 = this._distances[edgeId];\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n                scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance2);\n                translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                if (!this._isForwardEdge[edgeId]) {\n                  scale$1(gridTicksMMatrix, gridTicksMMatrix, Constants.VECTOR3_REFLECTX);\n                }\n                scale$1(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                this._distances[edgeId] = distance2;\n              }\n            }\n          }\n        }\n        set(this._gridFaceZeros, this.zero[0], this.zero[1]);\n        set(this._gridFaceMinorGridlines, this.minorGridlines[0], this.minorGridlines[1]);\n        for (let faceId = 0; faceId < 2; faceId++) {\n          if (this._isForwardFace[faceId]) {\n            const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n            scale$1(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n          }\n        }\n        for (let axisId = 0; axisId < 2; axisId++) {\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n            multiply$1(this._edgePosition, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n            transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n            normalize$2(this._forward, this._edgePosition);\n            negate(this._forward, this._forward);\n            cross(this._right, Constants.VECTOR3_UNITY, this._forward);\n            normalize$2(this._right, this._right);\n            cross(this._up, this._forward, this._right);\n            transformMat3(this._edgeNormal, Quad$2.EDGE_NORMALS[edgeId], this._mat3);\n            transformMat3(this._edgePositive, Quad$2.EDGE_POSITIVES[edgeId], this._mat3);\n            copy$3(this._edgeNormalTemp, this._edgeNormal);\n            copy$3(this._edgePositiveTemp, this._edgePositive);\n            const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n            const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n            const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n            if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n              copy$3(edgeHorizontalUp, Quad$2.EDGE_NORMALS[edgeId]);\n            } else {\n              negate(edgeHorizontalUp, Quad$2.EDGE_NORMALS[edgeId]);\n              negate(this._edgeNormalTemp, this._edgeNormalTemp);\n            }\n            if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n              this._isLeftToRightHorizontal[edgeId] = true;\n              copy$3(edgeHorizontalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n            } else {\n              this._isLeftToRightHorizontal[edgeId] = false;\n              negate(edgeHorizontalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n              negate(this._edgePositiveTemp, this._edgePositiveTemp);\n            }\n            cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n            if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n              this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n              negate(edgeHorizontalRight, edgeHorizontalRight);\n            }\n            cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n            const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n            const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n            const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n            if (dot$1(this._edgeNormal, this._right) < 0) {\n              copy$3(edgeVerticalUp, Quad$2.EDGE_NORMALS[edgeId]);\n            } else {\n              negate(edgeVerticalUp, Quad$2.EDGE_NORMALS[edgeId]);\n              negate(this._edgeNormal, this._edgeNormal);\n            }\n            if (dot$1(this._edgePositive, this._up) < 0) {\n              this._isLeftToRightVertical[edgeId] = true;\n              copy$3(edgeVerticalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n            } else {\n              this._isLeftToRightVertical[edgeId] = false;\n              negate(edgeVerticalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n              negate(this._edgePositive, this._edgePositive);\n            }\n            cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n            if (dot$1(edgeVerticalForward, this._forward) < 0) {\n              this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n              negate(edgeVerticalRight, edgeVerticalRight);\n            }\n            cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n            if (this.isEdgeVisible[edgeId]) {\n              if (this._labels[axisId]) {\n                this._updateLabels(axisId, edgeId);\n              }\n              if (this._titles[axisId]) {\n                this._updateTitle(axisId, edgeId);\n              }\n            }\n            if (this.isHeadingVisible[edgeId]) {\n              this._updateHeading(axisId, edgeId);\n            }\n          }\n        }\n      }\n    }\n    _updateLabels(axisId, edgeId) {\n      const orientation = this._orientations[axisId];\n      let distance2 = this._distances[edgeId];\n      let maxLabelSize = this._maxLabelSize[axisId][1];\n      if (orientation == AxesTextOrientation.parallel)\n        maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n      distance2 += maxLabelSize * 0.5;\n      multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance2);\n      const labelMMatrix = this._labelMMatrices[edgeId];\n      labelMMatrix[12] = this._vec3[0];\n      labelMMatrix[13] = this._vec3[1];\n      labelMMatrix[14] = this._vec3[2];\n      if (orientation == AxesTextOrientation.parallel) {\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      } else {\n        const right = this._edgeVerticalRight[edgeId];\n        const up = this._edgeVerticalUp[edgeId];\n        const forward = this._edgeVerticalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      }\n      multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n      if (orientation == AxesTextOrientation.perpendicular) {\n        multiply$2(labelMMatrix, labelMMatrix, Constants.MAT4_ROTATION_MINUS_90);\n      }\n      distance2 += maxLabelSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateTitle(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n      distance2 += titleTextSize * 0.5;\n      multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance2);\n      const titleMMatrix = this._titleMMatrices[edgeId];\n      titleMMatrix[12] = this._vec3[0];\n      titleMMatrix[13] = this._vec3[1];\n      titleMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      titleMMatrix[0] = right[0];\n      titleMMatrix[1] = right[1];\n      titleMMatrix[2] = right[2];\n      titleMMatrix[4] = up[0];\n      titleMMatrix[5] = up[1];\n      titleMMatrix[6] = up[2];\n      titleMMatrix[8] = forward[0];\n      titleMMatrix[9] = forward[1];\n      titleMMatrix[10] = forward[2];\n      multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n      distance2 += titleTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateHeading(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n      distance2 += headingTextSize * 0.5;\n      multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance2);\n      const headingMMatrix = this._headingMMatrices[edgeId];\n      headingMMatrix[12] = this._vec3[0];\n      headingMMatrix[13] = this._vec3[1];\n      headingMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      headingMMatrix[0] = right[0];\n      headingMMatrix[1] = right[1];\n      headingMMatrix[2] = right[2];\n      headingMMatrix[4] = up[0];\n      headingMMatrix[5] = up[1];\n      headingMMatrix[6] = up[2];\n      headingMMatrix[8] = forward[0];\n      headingMMatrix[9] = forward[1];\n      headingMMatrix[10] = forward[2];\n      multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n      distance2 += headingTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateGrids(size2) {\n      let offset2 = 0;\n      this.pickGridLookup = {};\n      this._pickGrid = [];\n      const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n      const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n      const count2 = 2 * (xDivisions * yDivisions) + xDivisions + yDivisions;\n      const byteLength = PickGridVertex.SIZE_BYTES * count2 * 4;\n      if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n        this._gridVertices = new ArrayBuffer(byteLength);\n        this._gridVerticesView = new DataView(this._gridVertices);\n        this._gridIndices = new Uint16Array(count2 * 6);\n      }\n      for (let axisId2 = 0; axisId2 < 2; axisId2++) {\n        const width2 = size2[axisId2];\n        set$3(this._gridTicksScales[axisId2], width2, this._gridPickDivisionHeight, 1);\n        offset2 = this._updateGridTicks(axisId2, this._gridVerticesView, this._gridIndices, offset2);\n        this._gridFaceScale[axisId2] = size2[axisId2] == 0 ? 1 : size2[axisId2];\n      }\n      const axisId = 2;\n      this._gridFaceScale[axisId] = 1;\n      for (let faceId = 0; faceId < 2; faceId++) {\n        offset2 = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset2);\n      }\n    }\n    _updateText(size2) {\n      let glyphOffset = 0;\n      let count2 = 0;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const labels = this._labels[axisId];\n        if (labels) {\n          for (let i = 0; i < labels.length; i++) {\n            count2 += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n          }\n        }\n        const title = this._titles[axisId];\n        if (title) {\n          count2 += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n        }\n        const heading = this._headings[axisId];\n        if (heading) {\n          count2 += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n      }\n      const byteLength = PositionTexturePickVertex.SIZE_BYTES * count2 * 4;\n      if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n        this._textVertices = new ArrayBuffer(byteLength);\n        this._textVerticesView = new DataView(this._textVertices);\n        this._textIndices = new Uint16Array(count2 * 6);\n      }\n      this.pickLabelLookup = {};\n      this._pickLabel = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._labels[axisId]) {\n          const width2 = size2[axisId];\n          const maxLabelSize = this._maxLabelSize[axisId];\n          const orientation = this._orientations[axisId];\n          set(maxLabelSize, 0, 0);\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateLeftToRightAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateRightToLeftAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesLeftToRightIndexCounts[axisId] = 0;\n          this._axesRightToLeftIndexCounts[axisId] = 0;\n          this._maxLabelSize[axisId][0] = 0;\n          this._maxLabelSize[axisId][1] = 0;\n        }\n      }\n      this.pickTitleLookup = {};\n      this._pickTitle = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._titles[axisId]) {\n          set$3(this._textPosition, 0, 0, 0);\n          set$3(this._textOffset, 0, 0, 0);\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n          const scale2 = this._titleSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n          this.pickTitleLookup[pickId] = this._pickTitle.length;\n          this._pickTitle.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          this._titleIndexCounts[axisId] = 0;\n        }\n      }\n      this.pickHeadingLookup = {};\n      this._pickHeading = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._headings[axisId]) {\n          set$3(this._textPosition, 0, 0, 0);\n          set$3(this._textOffset, 0, 0, 0);\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n          const scale2 = this._headingSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n          this.pickHeadingLookup[pickId] = this._pickHeading.length;\n          this._pickHeading.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          this._headingIndexCounts[axisId] = 0;\n        }\n      }\n    }\n    _updateLeftToRightAxisLabels(axisId, size2, maxSize, glyphOffset, orientation, labels, positions, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions[label2] : positions[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$3(this._textPosition, (position2 - 0.5) * size2, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = position2 == 0 ? 0 : position2 == 1 ? -width2 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            maxSize[0] = Math.max(width2, maxSize[0]);\n            maxSize[1] = Math.max(lineHeight2, maxSize[1]);\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$3(this._textPosition, 0, (position2 - 0.5) * size2, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = position2 == 0 ? 0 : position2 == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n            }\n            maxSize[0] = Math.max(lineHeight2, maxSize[0]);\n            maxSize[1] = Math.max(width2, maxSize[1]);\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size2, maxSize, glyphOffset, orientation, labels, positions, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions[label2] : positions[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$3(this._textPosition, (0.5 - position2) * size2, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = label2 == 0 ? -width2 : label2 == labels.length - 1 ? 0 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$3(this._textPosition, 0, (0.5 - position2) * size2, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = label2 == 0 ? -maxGlyphTop : label2 == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n            }\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset2) {\n      this._gridTicksIndexOffsets[axisId] = offset2 * 6;\n      if (this._gridTicksPositions[axisId]) {\n        const axes = create$3();\n        const positions = this._gridTicksPositions[axisId];\n        const isAxisReversed = this.isAxisReversed[axisId];\n        let vertexOffset = offset2 * 4;\n        for (let position2 = 0; position2 < positions.length - 1; position2++) {\n          const left = isAxisReversed ? 1 - positions[position2 + 1] - 0.5 : positions[position2] - 0.5;\n          const right = isAxisReversed ? 1 - positions[position2] - 0.5 : positions[position2 + 1] - 0.5;\n          axes[axisId] = position2 + 1;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n          this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n          this._pickGrid.push(axes[0]);\n          this._pickGrid.push(axes[1]);\n          this._pickGrid.push(axes[2]);\n          let indexOffset = offset2 * 6;\n          for (let j = 0; j < this._indexTemplate.length; j++) {\n            indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n          }\n          set$2(this._bounds, left + 0.5, 0, right + 0.5, 1);\n          this._translation[0] = left;\n          this._translation[1] = 0.5;\n          this._translation[2] = 0;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 1;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = left;\n          this._translation[1] = -0.5;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 0;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          offset2++;\n        }\n      }\n      this._gridTicksIndexCounts[axisId] = offset2 * 6 - this._gridTicksIndexOffsets[axisId];\n      return offset2;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset2) {\n      set$3(this._translation, 0, 0, 0);\n      this._gridFaceIndexOffsets[faceId] = offset2 * 6;\n      const axisId2 = axisId == 0 ? 1 : 0;\n      const axisId3 = axisId == 2 ? 1 : 2;\n      if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n        const axes = create$3();\n        negate(this._normal, Quad$2.FACE_NORMALS[faceId]);\n        const positions2 = this._gridTicksPositions[axisId2];\n        const positions3 = this._gridTicksPositions[axisId3];\n        const isAxisReversed2 = this.isAxisReversed[axisId2];\n        const isAxisReversed3 = this.isAxisReversed[axisId3];\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId2] = position2 + 1;\n          let vertexOffset = offset2 * 4;\n          for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n            const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n            const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n            axes[axisId3] = position3 + 1;\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n            this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n            this._pickGrid.push(axes[0]);\n            this._pickGrid.push(axes[1]);\n            this._pickGrid.push(axes[2]);\n            let indexOffset = offset2 * 6;\n            for (let i = 0; i < this._indexTemplate.length; i++) {\n              indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n            }\n            set$2(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = max3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = max3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = min3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = min3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            offset2++;\n          }\n        }\n      }\n      this._gridFaceIndexCounts[faceId] = offset2 * 6 - this._gridFaceIndexOffsets[faceId];\n      return offset2;\n    }\n  }\n  class Glyph {\n    toJSON() {\n      return {\n        key: this.key,\n        char: this.char,\n        width: this.width,\n        height: this.height,\n        top: this.top,\n        left: this.left,\n        advance: this.advance,\n        u0: this.u0,\n        v0: this.v0,\n        u1: this.u1,\n        v1: this.v1\n      };\n    }\n  }\n  let FontVisual$2 = class FontVisual {\n    update() {\n    }\n    constructor(font2) {\n      this.font = font2;\n    }\n  };\n  class Font {\n    get atlas() {\n      return this._rasterizer.fontAtlas;\n    }\n    get count() {\n      return this._chars.size;\n    }\n    constructor(core, rasterizer) {\n      this._core = core;\n      this._rasterizer = rasterizer;\n      this._chars = /* @__PURE__ */ new Set();\n      this._previousSize = 0;\n      this.glyphs = {};\n    }\n    addGlyph(char) {\n      if (!this._chars.has(char)) {\n        this._chars.add(char);\n        this._rasterizer.draw(char);\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._core.log.write(LogLevel.info, `${this.name} added ${this._chars.size - this._previousSize} new glyphs`);\n        this._previousSize = this._chars.size;\n        if (this.hasChangedCallback) {\n          this.hasChangedCallback();\n        }\n      }\n    }\n    toJSON() {\n      const glyphs = [];\n      for (let key2 in this.glyphs) {\n        const glyph = this.glyphs[key2];\n        glyphs.push(glyph.toJSON());\n      }\n      return {\n        name: this.name,\n        size: this.size,\n        border: this.border,\n        glyphs,\n        edgeValue: this.edgeValue\n      };\n    }\n  }\n  class FontAtlas {\n    constructor(width2, height2) {\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = width2;\n      canvas.height = height2;\n      const context2 = canvas.getContext(\"2d\");\n      context2.clearRect(0, 0, width2, height2);\n      this.imageData = context2.getImageData(0, 0, width2, height2);\n      this.x = 0;\n      this.top = new Uint16Array(width2);\n    }\n  }\n  class FontRasterizer {\n    get font() {\n      return this._font;\n    }\n    get fontAtlas() {\n      return this._fontAtlas;\n    }\n    constructor(core, options) {\n      let start = performance.now();\n      this._core = core;\n      this._fontAtlas = options.fontAtlas;\n      this._fontSize = options.fontSize;\n      this._border = options.border;\n      this._fontFamily = options.fontFamily;\n      this._fontWeight = options.fontWeight;\n      this._fontStyle = options.fontStyle;\n      this._baseline = options.baseline;\n      this._maxDistance = options.maxDistance;\n      this._edgeValue = options.edgeValue;\n      this._font = new Font(core, this);\n      this._font.name = `${this._fontFamily}${this._fontSize}${this._fontWeight == \"normal\" ? \"\" : this._fontWeight}${this._fontStyle == \"normal\" ? \"\" : this._fontStyle}`.replace(/[^a-z0-9,]/ig, \"\").toLowerCase();\n      this._font.size = this._fontSize;\n      this._font.border = this._border;\n      this._font.edgeValue = this._edgeValue;\n      const glyphRasterizerOptions = {\n        baseline: this._baseline,\n        border: this._border,\n        edgeValue: this._edgeValue,\n        fontFamily: this._fontFamily,\n        fontSize: this._fontSize,\n        fontStyle: this._fontStyle,\n        fontWeight: this._fontWeight,\n        maxDistance: this._maxDistance\n      };\n      this._glyphRasterizer = new GlyphRasterizer(core, glyphRasterizerOptions);\n      this._core.log.write(LogLevel.info, `font rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n      const glyph = this._glyphRasterizer.draw(char);\n      const texWidth = glyph.width + 2 * this._border;\n      const texHeight = glyph.height + 2 * this._border;\n      const width2 = this._fontAtlas.imageData.width;\n      const height2 = this._fontAtlas.imageData.height;\n      if (this._fontAtlas.x + texWidth > width2) {\n        this._fontAtlas.x = 0;\n      }\n      let y2 = 0;\n      for (let x2 = this._fontAtlas.x; x2 < this._fontAtlas.x + texWidth; x2++) {\n        y2 = Math.max(y2, this._fontAtlas.top[x2]);\n      }\n      if (y2 + texHeight > height2) {\n        this._core.log.write(LogLevel.warn, `${this._font.name} height overflow`);\n      }\n      for (let x2 = this._fontAtlas.x; x2 < this._fontAtlas.x + texWidth; x2++) {\n        this._fontAtlas.top[x2] = y2 + texHeight;\n      }\n      glyph.u0 = this._fontAtlas.x / width2;\n      glyph.v0 = y2 / height2;\n      glyph.u1 = (this._fontAtlas.x + texWidth) / width2;\n      glyph.v1 = (y2 + texHeight) / height2;\n      this._font.glyphs[char] = glyph;\n      for (let i = 0; i < glyph.distances.length; i++) {\n        const distance2 = glyph.distances[i];\n        const dataX = i % texWidth;\n        const dataY = Math.floor(i / texWidth);\n        const offset2 = (this._fontAtlas.x + dataX + (y2 + dataY) * width2) * 4;\n        this._fontAtlas.imageData.data[offset2 + 0] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 1] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 2] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 3] = 255;\n      }\n      this._fontAtlas.x += texWidth;\n    }\n  }\n  class GlyphRasterizer {\n    constructor(core, options) {\n      let start = performance.now();\n      this._core = core;\n      this._fontSize = options.fontSize;\n      this._border = options.border;\n      this._fontFamily = options.fontFamily;\n      this._fontWeight = options.fontWeight;\n      this._fontStyle = options.fontStyle;\n      this._baseline = options.baseline;\n      this._maxDistance = options.maxDistance;\n      this._edgeValue = options.edgeValue;\n      this._size = this._fontSize + this._border * 2;\n      this._size += this._border * 2;\n      this._gridOuter = new Float64Array(this._size * this._size);\n      this._gridInner = new Float64Array(this._size * this._size);\n      this._f = new Float64Array(this._size);\n      this._z = new Float64Array(this._size + 1);\n      this._v = new Uint16Array(this._size);\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = canvas.height = this._size;\n      this._context = canvas.getContext(\"2d\", { willReadFrequently: true });\n      this._context.font = `${this._fontStyle} ${this._fontWeight} ${this._fontSize}px ${this._fontFamily} `;\n      this._context.textBaseline = this._baseline;\n      this._context.textAlign = \"left\";\n      this._context.fillStyle = \"black\";\n      this._core.log.write(LogLevel.info, `glyph rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n      const textMetrics2 = this._context.measureText(char);\n      const glyphLeft = 0;\n      const glyphTop = Math.floor(textMetrics2.actualBoundingBoxAscent);\n      let glyphWidth = Math.ceil(textMetrics2.actualBoundingBoxRight);\n      let glyphHeight = Math.ceil(textMetrics2.actualBoundingBoxAscent) + Math.ceil(textMetrics2.actualBoundingBoxDescent);\n      glyphWidth = Math.min(this._size - this._border, glyphWidth);\n      glyphHeight = Math.min(this._size - this._border, glyphHeight);\n      const width2 = glyphWidth + 2 * this._border;\n      const height2 = glyphHeight + 2 * this._border;\n      const length2 = width2 * height2;\n      const distances = new Uint8ClampedArray(length2);\n      const gradientsX = new Uint8ClampedArray(length2);\n      const gradientsY = new Uint8ClampedArray(length2);\n      const pixels = new Uint8ClampedArray(length2);\n      const glyph = new Glyph();\n      glyph.char = char;\n      glyph.key = char.codePointAt(0);\n      glyph.distances = distances;\n      glyph.gradientsX = gradientsX;\n      glyph.gradientsY = gradientsY;\n      glyph.pixels = pixels;\n      glyph.width = glyphWidth;\n      glyph.height = glyphHeight;\n      glyph.top = glyphTop;\n      glyph.left = glyphLeft;\n      glyph.advance = textMetrics2.width;\n      if (glyphWidth == 0 || glyphHeight == 0) {\n        return glyph;\n      }\n      this._context.clearRect(this._border, this._border, glyphWidth, glyphHeight);\n      this._context.fillText(char, this._border, this._border + glyphTop);\n      const imgData = this._context.getImageData(this._border, this._border, glyphWidth, glyphHeight);\n      for (let i = 0; i < length2; i++) {\n        this._gridOuter[i] = Number.MAX_VALUE;\n        this._gridInner[i] = 0;\n      }\n      for (let y2 = 0; y2 < glyphHeight; y2++) {\n        for (let x2 = 0; x2 < glyphWidth; x2++) {\n          const a2 = imgData.data[4 * (y2 * glyphWidth + x2) + 3] / 255;\n          if (a2 > 0) {\n            const j = (y2 + this._border) * width2 + x2 + this._border;\n            if (a2 == 1) {\n              this._gridOuter[j] = 0;\n              this._gridInner[j] = Number.MAX_VALUE;\n            } else {\n              const d = 0.5 - a2;\n              this._gridOuter[j] = d > 0 ? d * d : 0;\n              this._gridInner[j] = d < 0 ? d * d : 0;\n              pixels[j] = 255;\n            }\n          }\n        }\n      }\n      this._edt(this._gridOuter, 0, 0, width2, height2, width2, this._f, this._v, this._z);\n      this._edt(this._gridInner, this._border, this._border, glyphWidth, glyphHeight, width2, this._f, this._v, this._z);\n      const distances2 = new Float32Array(length2);\n      for (let i = 0; i < length2; i++) {\n        const distance2 = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n        distances[i] = Math.round(this._edgeValue - distance2 * 255 / this._maxDistance);\n        distances2[i] = distance2;\n      }\n      for (let i = 0; i < length2; i++) {\n        const x2 = i % width2;\n        const y2 = Math.floor(i / width2);\n        const d = distances2[i];\n        const sign2 = d < 0 ? -1 : 1;\n        const x02 = x2 > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n        const x12 = x2 < width2 - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n        const y02 = y2 > 0 ? distances2[i - width2] : Number.MAX_VALUE;\n        const y12 = y2 < height2 - 1 ? distances2[i + width2] : Number.MAX_VALUE;\n        let gradientX = sign2 * x02 < sign2 * x12 ? d - x02 : x12 - d;\n        let gradientY = sign2 * y02 < sign2 * y12 ? y02 - d : d - y12;\n        gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 255);\n        gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 255);\n      }\n      return glyph;\n    }\n    _edt(data2, x02, y02, width2, height2, gridSize, f, v, z) {\n      for (let x2 = x02; x2 < x02 + width2; x2++)\n        this._edt1d(data2, y02 * gridSize + x2, gridSize, height2, f, v, z);\n      for (let y2 = y02; y2 < y02 + height2; y2++)\n        this._edt1d(data2, y2 * gridSize + x02, 1, width2, f, v, z);\n    }\n    _edt1d(grid2, offset2, stride, n, f, v, z) {\n      v[0] = 0;\n      z[0] = -Number.MAX_VALUE;\n      z[1] = Number.MAX_VALUE;\n      f[0] = grid2[offset2];\n      for (let q = 1, k = 0, s = 0; q < n; q++) {\n        f[q] = grid2[offset2 + q * stride];\n        const q2 = q * q;\n        do {\n          const r = v[k];\n          s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n        } while (s <= z[k] && --k > -1);\n        k++;\n        v[k] = q;\n        z[k] = s;\n        z[k + 1] = Number.MAX_VALUE;\n      }\n      for (let q = 0, k = 0; q < n; q++) {\n        while (z[k + 1] < q) {\n          k++;\n        }\n        const r = v[k];\n        const qr = q - r;\n        grid2[offset2 + q * stride] = f[r] + qr * qr;\n      }\n    }\n  }\n  class ManipulationProcessor {\n    get manipulators() {\n      return this._manipulators;\n    }\n    get count() {\n      return this._count;\n    }\n    get isDragging() {\n      return this._isDragging;\n    }\n    constructor(core) {\n      this._core = core;\n      this._count = 0;\n      this._centroid = create$3();\n      this._previousCentroid = create$3();\n      this._relativePositionToCentroid = create$3();\n      this._directionToCentroid = create$3();\n      this._previousDirectionToCentroid = create$3();\n      this._manipulators = {};\n      this._removedManipulators = [];\n      this.cumulativeTranslation = create$3();\n      this.translationDelta = create$3();\n      this.centroid = create$3();\n      this.maxScale = Number.MAX_VALUE;\n      this.twistAxis = fromValues$3(0, 0, 1);\n      this.initialize();\n    }\n    update(elapsedTime, manipulators) {\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        if (!manipulators[manipulator.id]) {\n          if (this.removeManipulator) {\n            this.removeManipulator(manipulator);\n          }\n          this._removedManipulators.push(manipulator.id);\n        }\n      }\n      if (this._removedManipulators.length > 0) {\n        for (let i = 0; i < this._removedManipulators.length; i++) {\n          delete this._manipulators[this._removedManipulators[i]];\n          this._count--;\n        }\n        this._removedManipulators = [];\n      }\n      for (const key2 in manipulators) {\n        const manipulator = manipulators[key2];\n        if (!this._manipulators[manipulator.id]) {\n          if (!this.addManipulator || this.addManipulator(manipulator)) {\n            copy$3(manipulator.initialPosition, manipulator.position);\n            this._manipulators[manipulator.id] = manipulator;\n            this._count++;\n          }\n        }\n      }\n      set$3(this.translationDelta, 0, 0, 0);\n      this.scaleDelta = 0;\n      this.twistDelta = 0;\n      if (this._count > 0) {\n        if (this._previousCount > 0) {\n          if (this.prepareManipulation) {\n            this.prepareManipulation();\n          }\n          this._process();\n          if (this.processManipulation) {\n            this.processManipulation(elapsedTime);\n          }\n        } else {\n          this.initialize();\n          if (this.beginManipulation) {\n            this.beginManipulation();\n          }\n        }\n      } else {\n        if (this._previousCount > 0) {\n          if (this.endManipulation) {\n            this.endManipulation();\n          }\n        }\n      }\n      this._isDragging = this._count == 1 && squaredLength(this.cumulativeTranslation) > this._core.config.dragToleranceSquared || this._count > 1;\n      this._previousCount = this._count;\n    }\n    initialize() {\n      set$3(this.centroid, 0, 0, 0);\n      set$3(this.cumulativeTranslation, 0, 0, 0);\n      this.cumulativeScale = 1;\n      this.cumulativeTwist = 0;\n    }\n    _process() {\n      if (this._previousCount > 0) {\n        let persisted = 0;\n        for (const key2 in this._manipulators) {\n          const manipulator = this._manipulators[key2];\n          if (manipulator.isPersisted) {\n            persisted++;\n          }\n        }\n        const removed = this._previousCount - persisted;\n        if (persisted > 0) {\n          if (removed > 0) {\n            copy$3(this._centroid, this._previousCentroid);\n          } else {\n            set$3(this._centroid, 0, 0, 0);\n            for (const key2 in this._manipulators) {\n              const manipulator = this._manipulators[key2];\n              if (manipulator.isPersisted) {\n                add(this._centroid, this._centroid, manipulator.position);\n              }\n            }\n            scale(this._centroid, this._centroid, 1 / persisted);\n          }\n          for (const key2 in this._manipulators) {\n            const manipulator = this._manipulators[key2];\n            if (manipulator.isPersisted) {\n              manipulator.maxTranslationSquared = Math.max(manipulator.maxTranslationSquared, squaredDistance(manipulator.position, manipulator.initialPosition));\n              add(this.translationDelta, this.translationDelta, manipulator.position);\n              subtract(this.translationDelta, this.translationDelta, manipulator.previousPosition);\n              subtract(this._relativePositionToCentroid, manipulator.position, this._centroid);\n              const distanceToCentroidSquared = squaredLength(this._relativePositionToCentroid);\n              if (distanceToCentroidSquared < this._core.config.manipulatorMinRelativeDistanceSquared) {\n                this.scaleDelta += 1;\n              } else {\n                const distanceToCentroid = Math.sqrt(distanceToCentroidSquared);\n                const previousDistanceToCentroidSquared = squaredLength(manipulator.previousPositionRelativeToCentroid);\n                const previousDistanceToCentroid = Math.sqrt(previousDistanceToCentroidSquared);\n                this.scaleDelta += distanceToCentroid / previousDistanceToCentroid;\n                scale(this._directionToCentroid, this._relativePositionToCentroid, 1 / distanceToCentroid);\n                scale(this._previousDirectionToCentroid, manipulator.previousPositionRelativeToCentroid, 1 / previousDistanceToCentroid);\n                this.twistDelta += AngleHelper.signedAngleBetweenVectors(this._previousDirectionToCentroid, this._directionToCentroid, this.twistAxis);\n              }\n            }\n          }\n          scale(this.translationDelta, this.translationDelta, 1 / persisted);\n          add(this.cumulativeTranslation, this.cumulativeTranslation, this.translationDelta);\n          this.scaleDelta /= persisted;\n          this.cumulativeScale = MathHelper.clamp(this.cumulativeScale * this.scaleDelta, this.minScale, this.maxScale);\n          this.scaleDelta -= 1;\n          this.twistDelta /= persisted;\n          this.cumulativeTwist += this.twistDelta;\n        }\n      }\n      set$3(this.centroid, 0, 0, 0);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        add(this.centroid, this.centroid, manipulator.position);\n      }\n      scale(this.centroid, this.centroid, 1 / this._count);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        subtract(manipulator.positionRelativeToCentroid, manipulator.position, this.centroid);\n      }\n      copy$3(this._previousCentroid, this.centroid);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        manipulator.isPersisted = true;\n        copy$3(manipulator.previousPosition, manipulator.position);\n        copy$3(manipulator.previousRotationAxis, manipulator.rotationAxis);\n        copy$3(manipulator.previousPositionRelativeToCentroid, manipulator.positionRelativeToCentroid);\n      }\n    }\n  }\n  class MouseWheel {\n    constructor(core) {\n      this._core = core;\n      this._previousTotal = 0;\n      this.total = 0;\n    }\n    initialize(element2) {\n      element2.addEventListener(\"wheel\", (e) => {\n        e.preventDefault();\n        const wheelEvent = e;\n        this.total += wheelEvent.deltaY;\n      }, { passive: false });\n    }\n    update(elapsedTime) {\n      const total = this.total;\n      this.delta = total - this._previousTotal;\n      this._previousTotal = total;\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`mse whl ${this.total < 0 ? \"\" : \" \"}${Math.round(this.total)}`);\n      }\n    }\n  }\n  class Manipulator {\n    constructor() {\n      this.pickedIndex = 0;\n      this.maxTranslationSquared = 0;\n      this.initialPosition = create$3();\n      this.position = create$3();\n      this.previousPosition = create$3();\n      this.holdOrigin = create$3();\n      this.positionRelativeToCentroid = create$3();\n      this.previousPositionRelativeToCentroid = create$3();\n      this.rotationAxis = create$3();\n      this.previousRotationAxis = create$3();\n    }\n  }\n  class Pointers {\n    get hoverX() {\n      return this._hoverX;\n    }\n    get hoverY() {\n      return this._hoverY;\n    }\n    get hoverId() {\n      return this._hoverId;\n    }\n    constructor(core, manipulators) {\n      this._core = core;\n      this._manipulators = manipulators;\n    }\n    initialize(element2) {\n      this._element = element2;\n      element2.addEventListener(\"pointerdown\", (e) => this._handlePointerDown(e), { passive: true });\n      element2.addEventListener(\"pointermove\", (e) => this._handlePointerMove(e), { passive: true });\n      element2.addEventListener(\"pointerup\", (e) => this._handlePointerUp(e), { passive: true });\n      element2.addEventListener(\"pointercancel\", (e) => this._handlePointerCancel(e), { passive: true });\n      element2.addEventListener(\"pointerleave\", (e) => this._handlePointerLeave(e), { passive: true });\n      element2.addEventListener(\"pointerout\", (e) => this._handlePointerOut(e), { passive: true });\n    }\n    update(elapsedTime) {\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`pen rot  ${(this._tiltX | 0).toFixed(3)},${(this._tiltY | 0).toFixed(3)},${(this._twist | 0).toFixed(3)}`);\n        this._core.debugText.addLine(`hov pos  ${this.hoverX ? `${this.hoverX.toFixed(3)},${this.hoverY.toFixed(3)}px` : \"\"}`);\n      }\n    }\n    _handlePointerDown(e) {\n      this._element.focus();\n      const devicePixelRatio2 = this._core.renderer.devicePixelRatio;\n      const manipulator = new Manipulator();\n      const id2 = e.pointerId;\n      const x2 = e.offsetX * devicePixelRatio2;\n      const y2 = e.offsetY * devicePixelRatio2;\n      manipulator.id = id2;\n      manipulator.position[0] = x2;\n      manipulator.position[1] = y2;\n      manipulator.type = e.pointerType;\n      manipulator.button = e.button;\n      manipulator.shiftKey = e.shiftKey;\n      manipulator.ctrlKey = e.ctrlKey;\n      manipulator.altKey = e.altKey;\n      manipulator.event = e;\n      this._manipulators[id2] = manipulator;\n      this._hoverId = id2;\n      this._hoverX = x2;\n      this._hoverY = y2;\n    }\n    _handlePointerMove(e) {\n      const devicePixelRatio2 = this._core.renderer.devicePixelRatio;\n      const x2 = e.offsetX * devicePixelRatio2;\n      const y2 = e.offsetY * devicePixelRatio2;\n      const id2 = e.pointerId;\n      const manipulator = this._manipulators[id2];\n      if (manipulator) {\n        manipulator.position[0] = x2;\n        manipulator.position[1] = y2;\n        manipulator.event = e;\n      }\n      switch (e.pointerType) {\n        case \"mouse\":\n          this._hoverId = id2;\n          this._hoverX = x2;\n          this._hoverY = y2;\n          break;\n        case \"pen\":\n          this._hoverId = id2;\n          this._hoverX = x2;\n          this._hoverY = y2;\n          this._tiltX = e.tiltX;\n          this._tiltY = e.tiltY;\n          this._twist = e.twist;\n          break;\n      }\n    }\n    _handlePointerUp(e) {\n      const manipulator = this._manipulators[e.pointerId];\n      if (manipulator) {\n        manipulator.event = e;\n      }\n      this._remove(e.pointerId);\n    }\n    _handlePointerCancel(e) {\n      this._remove(e.pointerId);\n    }\n    _handlePointerLeave(e) {\n      this._resetHover();\n      this._remove(e.pointerId);\n    }\n    _handlePointerOut(e) {\n      this._resetHover();\n      this._remove(e.pointerId);\n    }\n    _resetHover() {\n      this._hoverId = null;\n      this._hoverX = null;\n      this._hoverY = null;\n    }\n    _remove(pointerId) {\n      const manipulator = this._manipulators[pointerId];\n      if (manipulator) {\n        delete this._manipulators[pointerId];\n      }\n    }\n  }\n  class AnimationHelper {\n    static smoothStep(value2) {\n      return value2 * value2 * (3 - 2 * value2);\n    }\n    static damp(value2, target2, threshold2, dampening) {\n      if (Math.abs(target2) < threshold2) {\n        return MathHelper.lerp(value2, 0, dampening);\n      } else {\n        return MathHelper.lerp(value2, target2, dampening);\n      }\n    }\n  }\n  class Keyboard {\n    constructor(core) {\n      this._core = core;\n      this._pressedKeys = /* @__PURE__ */ new Set();\n      this._previousPressedKeys = /* @__PURE__ */ new Set();\n    }\n    initialize(element2) {\n      element2.addEventListener(\"keydown\", (e) => {\n        this._handleKeyDown(e);\n      }, false);\n      element2.addEventListener(\"keyup\", (e) => {\n        this._handleKeyUp(e);\n      }, false);\n    }\n    update(elapsedTime) {\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`key tot  ${this._pressedKeys.size}`);\n      }\n    }\n    isKeyDown(key2) {\n      return this._pressedKeys.has(key2);\n    }\n    wasKeyReleased(key2) {\n      if (this._pressedKeys.has(key2)) {\n        if (!this._previousPressedKeys.has(key2)) {\n          this._previousPressedKeys.add(key2);\n          return true;\n        }\n      } else {\n        this._previousPressedKeys.delete(key2);\n      }\n      return false;\n    }\n    _handleKeyDown(e) {\n      const keyboardEvent = e;\n      const key2 = keyboardEvent.key;\n      if (!this._pressedKeys.has(key2)) {\n        this._pressedKeys.add(key2);\n      }\n    }\n    _handleKeyUp(e) {\n      const keyboardEvent = e;\n      const key2 = keyboardEvent.key;\n      if (this._pressedKeys.has(key2)) {\n        this._pressedKeys.delete(key2);\n      }\n    }\n  }\n  class Manager {\n    constructor(core) {\n      this._manipulators = {};\n      this._core = core;\n      this._vec3 = create$3();\n      this._manipulationProcessor = new ManipulationProcessor(core);\n      this._manipulators = {};\n      this._pointers = new Pointers(core, this._manipulators);\n      this._pointers.initialize(core.container);\n      this._mouseWheel = new MouseWheel(core);\n      this._mouseWheel.initialize(core.container);\n      this._keyboard = new Keyboard(core);\n      this._keyboard.initialize(core.container);\n      this.isPickingEnabled = true;\n      this.mouseWheelZoomScale = this._core.config.mouseWheelZoomScale;\n      this.mouseWheelRotationScale = this._core.config.mouseWheelRotationScale;\n      this.multiTouchZoomScale = this._core.config.multiTouchZoomScale;\n      this.pickHoldDelay = this._core.config.pickHoldDelay;\n      this.pickSelectDelay = this._core.config.pickSelectDelay;\n      const rightButton2 = 2;\n      this.singleTouchAction = (manipulator) => {\n        if (manipulator.type == \"mouse\" && manipulator.button == rightButton2 || manipulator.shiftKey || manipulator.ctrlKey) {\n          return SingleTouchAction.translate;\n        } else if (manipulator.altKey || manipulator.type == \"pen\" && manipulator.button == rightButton2) {\n          return SingleTouchAction.lasso;\n        } else {\n          return SingleTouchAction.rotate;\n        }\n      };\n      this.mouseWheelAction = (keyboard) => {\n        if (this._keyboard.isKeyDown(\"Control\")) {\n          return MouseWheelAction.rotateY;\n        } else {\n          return MouseWheelAction.zoom;\n        }\n      };\n      this.lassoPickType = PickType.data;\n      this._thumbstickX = 0;\n      this._previousControllerButtonPressed = [false, false, false, false];\n      this._quat0 = create$1();\n      this._quat1 = create$1();\n    }\n    update(elapsedTime, xrFrame) {\n      if (xrFrame) {\n        const inputSources = this._core.webXRSession.inputSources;\n        if (inputSources.length > 0 && this._core.renderer.controllers.length > 0) {\n          const inputSource = inputSources[0];\n          const controllerVisual = this._core.renderer.controllers[0];\n          if (inputSource.gripSpace && inputSource.targetRayMode == \"tracked-pointer\") {\n            const gripPose = xrFrame.getPose(inputSource.gripSpace, this._core.renderer.webXRReferenceSpace);\n            if (gripPose) {\n              controllerVisual.mMatrix = gripPose.transform.matrix;\n            }\n            const gamepad = inputSource.gamepad;\n            this._core.renderer.isPickingEnabled = false;\n            const rayPose = xrFrame.getPose(inputSource.targetRaySpace, this._core.renderer.webXRReferenceSpace);\n            if (rayPose) {\n              controllerVisual.rayMMatrix = rayPose.transform.matrix;\n              if (gamepad.buttons[0].value > 0 && this.isPickingEnabled) {\n                this._core.renderer.pickVMatrix = rayPose.transform.inverse.matrix;\n                this._core.renderer.isPickingEnabled = true;\n              }\n            }\n            const threshold2 = 0.2;\n            const dampening = Math.min(0.015 * elapsedTime, 1);\n            this._thumbstickX = AnimationHelper.damp(this._thumbstickX, gamepad.axes[2], threshold2, dampening);\n            if (this._thumbstickX != 0) {\n              setAxisAngle(this._quat0, Constants.VECTOR3_UNITY, 0.01 * this._thumbstickX * elapsedTime);\n              this._core.getModelRotation(this._quat1);\n              multiply(this._quat1, this._quat0, this._quat1);\n              this._core.setModelRotation(this._quat1, true);\n            }\n            if (gamepad.buttons[2].pressed) {\n              if (!this._previousControllerButtonPressed[2]) {\n                this._previousControllerButtonPressed[2] = true;\n                if (this.controllerButtonPressedCallback) {\n                  this.controllerButtonPressedCallback(2);\n                }\n              }\n            } else {\n              this._previousControllerButtonPressed[2] = false;\n            }\n          }\n        }\n      } else {\n        const camera = this._core.camera;\n        this._manipulationProcessor.update(elapsedTime, this._manipulators);\n        this._pointers.update(elapsedTime);\n        this._mouseWheel.update(elapsedTime);\n        this._keyboard.update(elapsedTime);\n        if (this._mouseWheel.delta != 0) {\n          switch (this.mouseWheelAction(this._keyboard)) {\n            case MouseWheelAction.zoom:\n              if (this._pointers.hoverX, this._pointers.hoverY) {\n                camera.zoom(this._mouseWheel.delta * this.mouseWheelZoomScale, this._pointers.hoverX, this._pointers.hoverY);\n              }\n              break;\n            case MouseWheelAction.rotateY:\n              setAxisAngle(this._quat0, Constants.VECTOR3_UNITY, this._mouseWheel.delta * this.mouseWheelRotationScale);\n              camera.getOrbit(this._quat1);\n              multiply(this._quat1, this._quat1, this._quat0);\n              camera.setOrbit(this._quat1, true);\n              break;\n          }\n        }\n        const count2 = this._manipulationProcessor.count;\n        if (count2 == 0) {\n          if (this._isLassoPicking) {\n            this._isLassoPicking = false;\n            this._core.renderer.isLassoPicking = false;\n            const x02 = Math.min(this._lassoX0, this._lassoX1);\n            const y02 = Math.min(this._lassoY0, this._lassoY1);\n            const x12 = Math.max(this._lassoX0, this._lassoX1);\n            const y12 = Math.max(this._lassoY0, this._lassoY1);\n            if (x12 - x02 > 0 && y12 - y02 > 0) {\n              const sets = this._core.pickLasso(x02, y02, x12, y12, this.lassoPickType);\n              const result = {\n                x0: x02,\n                y0: y02,\n                x1: x12,\n                y1: y12,\n                pickType: this.lassoPickType,\n                ids: sets,\n                manipulator: this._manipulator\n              };\n              this.pickLassoCallback(result);\n            }\n          }\n        } else if (count2 == 1) {\n          const translationDelta = this._manipulationProcessor.translationDelta;\n          if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n            const manipulators = this._manipulationProcessor.manipulators;\n            for (const key2 in manipulators) {\n              const manipulator = manipulators[key2];\n              switch (this.singleTouchAction(manipulator)) {\n                case SingleTouchAction.rotate:\n                  camera.rotate(translationDelta);\n                  break;\n                case SingleTouchAction.translate:\n                  camera.translate(translationDelta);\n                  break;\n                case SingleTouchAction.lasso:\n                  if (this.pickLassoCallback) {\n                    if (!this._isLassoPicking) {\n                      this._isLassoPicking = true;\n                      this._core.renderer.isLassoPicking = true;\n                      this._lassoX0 = manipulator.position[0];\n                      this._lassoY0 = manipulator.position[1];\n                    }\n                    this._lassoX1 = manipulator.position[0];\n                    this._lassoY1 = manipulator.position[1];\n                    this._core.renderer.lassoX0 = Math.min(this._lassoX0, this._lassoX1);\n                    this._core.renderer.lassoY0 = Math.min(this._lassoY0, this._lassoY1);\n                    this._core.renderer.lassoX1 = Math.max(this._lassoX0, this._lassoX1);\n                    this._core.renderer.lassoY1 = Math.max(this._lassoY0, this._lassoY1);\n                  }\n                  break;\n              }\n              break;\n            }\n          }\n        } else {\n          const translationDelta = this._manipulationProcessor.translationDelta;\n          const camera2 = this._core.camera;\n          if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n            camera2.translate(translationDelta);\n          }\n          if (this._manipulationProcessor.scaleDelta != 0) {\n            const distance2 = this._manipulationProcessor.scaleDelta * this.multiTouchZoomScale;\n            camera2.zoom(distance2, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n          }\n          if (this._manipulationProcessor.twistDelta != 0) {\n            camera2.twist(this._manipulationProcessor.twistDelta, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n          }\n        }\n        if (this.isPickingEnabled && !this._manipulationProcessor.isDragging && !this._isLassoPicking) {\n          const camera2 = this._core.camera;\n          const renderer = this._core.renderer;\n          if (renderer.isCapturingPickImage) {\n            camera2.updatePickVMatrix(renderer.width / 2, renderer.height / 2);\n            renderer.pickVMatrix = camera2.pickVMatrix;\n            renderer.isPickingEnabled = true;\n            this._pickedTime = 0;\n          } else if (this._pointers.hoverId > -1) {\n            const pickingX = this._pointers.hoverX;\n            const pickingY = this._pointers.hoverY;\n            camera2.updatePickVMatrix(pickingX, pickingY);\n            renderer.pickVMatrix = camera2.pickVMatrix;\n            renderer.isPickingEnabled = true;\n            if (this._pickedId != renderer.pickedId) {\n              this._pickedId = renderer.pickedId;\n              this._pickedTime = 0;\n            } else {\n              if (this._manipulationProcessor.count == 1) {\n                this._pickedTime += elapsedTime;\n                for (const key2 in this._manipulators) {\n                  this._manipulator = this._manipulators[key2];\n                  break;\n                }\n              }\n            }\n            if (this._pickedTime > 0) {\n              switch (renderer.pickedType) {\n                case PickType.data:\n                  if (this._pickedTime > this.pickHoldDelay) {\n                    renderer.getVertexPosition(this._vec3, this._pickedId);\n                    this._core.setModelManipulationOrigin(this._vec3);\n                    this._pickedTime = 0;\n                  } else if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.transitionBuffers.length; i++) {\n                        const transitionBuffer = renderer.transitionBuffers[i];\n                        const id2 = transitionBuffer.pickIdLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = {\n                            transitionBuffer: i,\n                            id: id2,\n                            manipulator: this._manipulator\n                          };\n                          this._core.log.write(LogLevel.info, `picked id ${result.id}, transition buffer ${i}`);\n                          if (this.pickItemCallback) {\n                            this.pickItemCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.label:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.labelSets.length; i++) {\n                        const labelSet = renderer.labelSets[i].label;\n                        const id2 = labelSet.pickIdLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = {\n                            label: id2,\n                            set: i,\n                            manipulator: this._manipulator\n                          };\n                          this._core.log.write(LogLevel.info, `picked label ${result.label}, set ${result.set}`);\n                          if (this.pickLabelSetCallback) {\n                            this.pickLabelSetCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesDivision:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickGridLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickGrid(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked division (${result.divisionX}, ${result.divisionY}, ${result.divisionZ}), axes ${result.axes}`);\n                          if (this.pickAxesGridCallback) {\n                            this.pickAxesGridCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesTitle:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickTitleLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickTitle(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked title ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesTitleCallback) {\n                            this.pickAxesTitleCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesLabel:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickLabelLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickLabel(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked label ${result.label}, axis ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesLabelCallback) {\n                            this.pickAxesLabelCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesHeading:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickHeadingLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickHeading(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked heading ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesHeadingCallback) {\n                            this.pickAxesHeadingCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n              }\n            }\n          } else {\n            renderer.isPickingEnabled = false;\n            this._pickedTime = 0;\n          }\n        } else {\n          this._core.renderer.isPickingEnabled = false;\n          this._pickedTime = 0;\n        }\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`man tot  ${this._manipulationProcessor.count}`);\n        this._core.debugText.addLine(`pck key  ${this._core.renderer.pickedId}`);\n      }\n    }\n  }\n  class Log {\n    constructor(core) {\n      this._core = core;\n    }\n    write(level, value2) {\n      if (level >= this._core.config.logLevel) {\n        switch (level) {\n          case LogLevel.trace:\n            console.trace(value2);\n            break;\n          case LogLevel.debug:\n            console.debug(value2);\n            break;\n          case LogLevel.info:\n            console.info(value2);\n            break;\n          case LogLevel.warn:\n            console.warn(value2);\n            break;\n          case LogLevel.error:\n            console.error(value2);\n            break;\n        }\n      }\n    }\n  }\n  var __awaiter$4 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class Core {\n    get container() {\n      return this._container;\n    }\n    get started() {\n      return this._started;\n    }\n    get debugText() {\n      return this._debugText;\n    }\n    get log() {\n      return this._log;\n    }\n    get totalFrames() {\n      return this._fps.totalFrames;\n    }\n    get camera() {\n      return this._camera;\n    }\n    set camera(value2) {\n      this._camera = value2;\n    }\n    getModelRotation(value2) {\n      copy$1(value2, this._modelRotation);\n    }\n    setModelRotation(value2, isSmooth) {\n      copy$1(this._modelRotation, value2);\n      if (!isSmooth) {\n        copy$1(this._smoothedModelRotation, this._modelRotation);\n      }\n    }\n    getModelScale() {\n      return this._modelScale[0];\n    }\n    setModelScale(value2, isSmooth) {\n      set$3(this._modelScale, value2, value2, value2);\n      if (!isSmooth) {\n        copy$3(this._smoothedModelScale, this._modelScale);\n      }\n    }\n    getModelManipulationOrigin(value2) {\n      copy$3(value2, this._modelManipulationOrigin);\n    }\n    setModelManipulationOrigin(value2) {\n      this._updateManipulationOrigin(value2);\n    }\n    getModelPosition(value2) {\n      copy$3(value2, this._modelPosition);\n    }\n    setModelPosition(value2, isSmooth) {\n      copy$3(this._modelPosition, value2);\n      if (!isSmooth) {\n        copy$3(this._smoothedModelPosition, this._modelPosition);\n      }\n    }\n    get webXRSession() {\n      return this._webXRSession;\n    }\n    get renderer() {\n      return this._renderer;\n    }\n    set renderer(renderer) {\n      if (this._renderer == renderer) {\n        return;\n      }\n      if (this._renderer) {\n        this.stop();\n        this._renderer.remove();\n      }\n      if (!renderer.isInitialized) {\n        renderer.initialize(this);\n      }\n      if (this._renderer) {\n        renderer.transitionTime = this._renderer.transitionTime;\n        for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n          const previousTransitionBuffer = this._renderer.transitionBuffers[i];\n          const transitionBuffer = renderer.createTransitionBuffer(previousTransitionBuffer.currentBuffer.ids);\n          transitionBuffer.copyFrom(previousTransitionBuffer);\n          renderer.transitionBuffers.push(transitionBuffer);\n        }\n        const currentAxes = this._renderer.currentAxes;\n        if (currentAxes) {\n          renderer.currentAxes = [];\n          for (let i = 0; i < currentAxes.length; i++) {\n            const axesVisual = currentAxes[i];\n            const axes = axesVisual.axes;\n            if (axes instanceof Cartesian3dAxes) {\n              const cartesian3dAxesVisual = renderer.createCartesian3dAxesVisual(axes);\n              renderer.currentAxes.push(cartesian3dAxesVisual);\n            } else if (axes instanceof Cartesian2dAxes) {\n              renderer.currentAxes.push(renderer.createCartesian2dAxesVisual(axes));\n            }\n          }\n        }\n        const labelSets = this._renderer.labelSets;\n        if (labelSets) {\n          renderer.labelSets = [];\n          for (let i = 0; i < labelSets.length; i++) {\n            renderer.labelSets.push(renderer.createLabelSetVisual(labelSets[i].label));\n          }\n        }\n        const images = this._renderer.images;\n        if (images) {\n          renderer.images = [];\n          for (let i = 0; i < images.length; i++) {\n            renderer.images.push(renderer.createImageVisual(images[i].image));\n          }\n        }\n        const fonts = this._renderer.fonts;\n        if (fonts) {\n          for (const key2 in fonts) {\n            const font2 = fonts[key2].font;\n            renderer.fonts[font2.name] = renderer.createFontVisual(font2);\n          }\n        }\n      } else {\n        renderer.fonts[this._font.name] = renderer.createFontVisual(this._font);\n      }\n      if (this._renderer) {\n        this._renderer.finalize();\n      }\n      this._renderer = renderer;\n      this._fps.reset();\n      this.start();\n    }\n    get font() {\n      return this._font;\n    }\n    get paletteResources() {\n      return this._paletteResources;\n    }\n    get config() {\n      return this._config;\n    }\n    get inputManager() {\n      return this._inputManager;\n    }\n    constructor(options) {\n      setMatrixArrayType(Array);\n      this._vec3 = create$3();\n      this._quat = create$1();\n      this._mat4 = create$4();\n      this._container = options && options.container ? options.container : document.body;\n      this._config = new Config$2(this);\n      this._log = new Log(this);\n      this._debugText = new DebugText();\n      this._inputManager = options && options.useInputManager === false ? null : new Manager(this);\n      const fontRasterizerOptions = options && options.fontRasterizerOptions ? options.fontRasterizerOptions : {\n        fontAtlas: new FontAtlas(256, 512),\n        fontSize: 24,\n        border: 3,\n        fontFamily: '\"segoe ui semibold\", sans-serif',\n        fontWeight: \"normal\",\n        fontStyle: \"normal\",\n        baseline: \"alphabetic\",\n        maxDistance: 8,\n        edgeValue: 192\n      };\n      const fontRasterizer = new FontRasterizer(this, fontRasterizerOptions);\n      this._font = fontRasterizer.font;\n      this._paletteResources = new PaletteResources();\n      this._previousTime = 0;\n      this._fps = new Fps(this);\n      this._modelMMatrix = create$4();\n      this._modelPosition = create$3();\n      this._modelRotation = create$1();\n      this._modelScale = create$3();\n      this._smoothedModelPosition = create$3();\n      this._smoothedModelRotation = create$1();\n      this._smoothedModelScale = create$3();\n      this._modelManipulationOrigin = create$3();\n      this._camera = new AltAzimuthCamera(this);\n      this.resetModel(false);\n    }\n    getView(view) {\n      this.getModelPosition(view.position);\n      this.getModelRotation(view.rotation);\n      view.scale = this.getModelScale();\n    }\n    setView(view, isSmooth) {\n      this.setModelPosition(view.position, isSmooth);\n      this.setModelRotation(view.rotation, isSmooth);\n      this.setModelScale(view.scale, isSmooth);\n    }\n    lerpView(from, to, time2) {\n      lerp(this._vec3, from.position, to.position, time2);\n      this.setModelPosition(this._vec3, false);\n      slerp(this._quat, from.rotation, to.rotation, time2);\n      this.setModelRotation(this._quat, false);\n      this.setModelScale(MathHelper.lerp(from.scale, to.scale, time2), false);\n    }\n    resetModel(isSmooth) {\n      set$3(this._modelPosition, 0, 0, -this._config.modelDistance);\n      set$3(this._modelScale, this._config.modelSize, this._config.modelSize, this._config.modelSize);\n      set$1(this._modelRotation, 0, 0, 0, 1);\n      if (!isSmooth) {\n        this._syncSmooth();\n      }\n    }\n    resetManipulationOrigin() {\n      if (!exactEquals$1(this._modelManipulationOrigin, Constants.VECTOR3_ZERO)) {\n        this._updateManipulationOrigin(Constants.VECTOR3_ZERO);\n      }\n    }\n    reset(isSmooth) {\n      this.resetModel(isSmooth);\n      this.resetManipulationOrigin();\n      this._camera.reset(isSmooth);\n    }\n    start() {\n      if (!this._started && this._renderer) {\n        this._windowAnimationFrame = window.requestAnimationFrame((currentTime) => this._tick(currentTime));\n        this._started = true;\n        this._log.write(LogLevel.info, \"render loop started\");\n        if (this.startCallback) {\n          this.startCallback();\n        }\n      }\n    }\n    stop() {\n      if (this._started) {\n        this._started = false;\n        if (this._windowAnimationFrame != null) {\n          window.cancelAnimationFrame(this._windowAnimationFrame);\n          this._windowAnimationFrame = null;\n          this._log.write(LogLevel.info, \"render loop stopped\");\n        }\n        if (this.stopCallback) {\n          this.stopCallback();\n        }\n      }\n    }\n    checkWebXRSupport() {\n      const xrSystem = navigator.xr;\n      if (xrSystem) {\n        xrSystem.isSessionSupported(\"immersive-vr\").then((supported) => {\n          if (supported) {\n            this._log.write(LogLevel.info, \"WebXR supported\");\n            if (this.webXRSupportedCallback) {\n              this.webXRSupportedCallback();\n            }\n          }\n        });\n      }\n    }\n    requestWebXRSession() {\n      if (this._webXRSession) {\n        this._webXRSession.end();\n      } else {\n        navigator.xr.requestSession(\"immersive-vr\").then((session) => this._webXRSessionStarted(session));\n      }\n    }\n    _webXRSessionStarted(session) {\n      if (this.webXRSessionStartedCallback) {\n        this.webXRSessionStartedCallback();\n      }\n      this._webXRSession = session;\n      session.onend = () => this._webXRSessionEnded();\n      this._renderer.initializeWebXR(session).then(() => {\n        if (this._windowAnimationFrame) {\n          window.cancelAnimationFrame(this._windowAnimationFrame);\n          this._windowAnimationFrame = null;\n        }\n        session.requestAnimationFrame((currentTime, xrframe) => this._tick(currentTime, xrframe));\n      });\n      session.oninputsourceschange = (event2) => this._webXRInputSourcesChanged(event2);\n    }\n    _webXRSessionEnded() {\n      if (this.webXRSessionEndedCallback) {\n        this.webXRSessionEndedCallback();\n      }\n      this._webXRSession = null;\n      this._renderer.controllers.length = 0;\n      this.start();\n    }\n    _webXRInputSourcesChanged(event2) {\n      if (event2.added.length > 0) {\n        const added = event2.added[0];\n        if (added.targetRayMode == \"tracked-pointer\") {\n          const profiles = added.profiles;\n          const handedness = added.handedness;\n          if (this.webXRInputSourceRequestCallback) {\n            this.webXRInputSourceRequestCallback(profiles, handedness, (response) => {\n              const options = {\n                profiles,\n                handedness,\n                obj: response.obj,\n                texture: response.texture\n              };\n              const controller = new Controller(this, options);\n              this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n            }, (e) => {\n              this._log.write(LogLevel.error, e);\n            });\n          } else {\n            const options = {};\n            const controller = new Controller(this, options);\n            this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n          }\n        }\n      }\n      if (event2.removed.length > 0) {\n        this.renderer.controllers.length = 0;\n      }\n    }\n    _tick(currentTime, xrFrame) {\n      return __awaiter$4(this, void 0, void 0, function* () {\n        let elapsedTime = currentTime - this._previousTime;\n        this._previousTime = currentTime;\n        if (elapsedTime > 0) {\n          this.update(elapsedTime, xrFrame);\n          yield this.render(elapsedTime, xrFrame);\n        }\n        if (xrFrame) {\n          xrFrame.session.requestAnimationFrame((currentTime2, xrframe) => this._tick(currentTime2, xrframe));\n        } else if (this._started) {\n          this._windowAnimationFrame = window.requestAnimationFrame((currentTime2) => this._tick(currentTime2));\n        }\n      });\n    }\n    update(elapsedTime, xrFrame) {\n      this._renderer.setSize(elapsedTime);\n      if (this.updateCallback) {\n        this.updateCallback(elapsedTime, xrFrame);\n      }\n      if (this._config.isDebugVisible) {\n        this._debugText.clear();\n      }\n      this._fps.update(elapsedTime);\n      if (this._inputManager) {\n        this._inputManager.isPickingEnabled = this._config.isTransitionPickingEnabled || this._renderer.transitionTime == 1;\n        this._inputManager.update(elapsedTime, xrFrame);\n      }\n      let amount = Math.min(elapsedTime * this._config.positionSmoothing, 1);\n      lerp(this._smoothedModelPosition, this._smoothedModelPosition, this._modelPosition, amount);\n      amount = Math.min(elapsedTime * this._config.rotationSmoothing, 1);\n      slerp(this._smoothedModelRotation, this._smoothedModelRotation, this._modelRotation, amount);\n      amount = Math.min(elapsedTime * this._config.scaleSmoothing, 1);\n      lerp(this._smoothedModelScale, this._smoothedModelScale, this._modelScale, amount);\n      fromRotationTranslationScaleOrigin(this._modelMMatrix, this._smoothedModelRotation, this._smoothedModelPosition, this._smoothedModelScale, this._modelManipulationOrigin);\n      this._renderer.mMatrix = this._modelMMatrix;\n      if (this._config.isDebugVisible) {\n        this._debugText.addLine(`mod pos ${this._smoothedModelPosition[0] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[0].toFixed(3)},${this._smoothedModelPosition[1] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[1].toFixed(3)},${this._smoothedModelPosition[2] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[2].toFixed(3)}`);\n        this._debugText.addLine(`mod rot ${this._smoothedModelRotation[0] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[0].toFixed(3)},${this._smoothedModelRotation[1] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[1].toFixed(3)},${this._smoothedModelRotation[2] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[2].toFixed(3)},${this._smoothedModelRotation[3] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[3].toFixed(3)}`);\n        this._debugText.addLine(`mod siz  ${this._smoothedModelScale[0].toFixed(3)}`);\n        this._debugText.addLine(`man ori ${this._modelManipulationOrigin[0] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[0].toFixed(3)},${this._modelManipulationOrigin[1] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[1].toFixed(3)},${this._modelManipulationOrigin[2] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[2].toFixed(3)}`);\n        this._debugText.addLine(`scr dst  ${this._config.screenDistance.toFixed(3)}`);\n        this._debugText.addLine(`cam fov  ${Math.round(AngleHelper.radiansToDegrees(this._config.fov))}`);\n        this._debugText.addLine(`tbf tot  ${this._renderer.transitionBuffers.length}`);\n      }\n      if (!xrFrame) {\n        this._camera.width = this._renderer.width;\n        this._camera.height = this._renderer.height;\n        this._camera.modelMMatrix = this._modelMMatrix;\n        this._camera.modelPosition = this._smoothedModelPosition;\n        this._camera.modelRotation = this._smoothedModelRotation;\n        this._camera.modelScale = this._smoothedModelScale;\n        this._camera.modelManipulationOrigin = this._modelManipulationOrigin;\n        this._camera.update(elapsedTime);\n        this._renderer.vMatrices = this._camera.vMatrices;\n        this._renderer.mvMatrices = this._camera.mvMatrices;\n        this._renderer.pMatrices = this._camera.pMatrices;\n        this._renderer.inverseVMatrices = this._camera.inverseVMatrices;\n        this._renderer.inversePMatrices = this._camera.inversePMatrices;\n      }\n      this._renderer.prepare(xrFrame);\n      if (!xrFrame && this._config.stereoMode == StereoMode.none) {\n        this._renderer.pickPMatrix = this._camera.pMatrices[0];\n      } else {\n        const fov = MatrixHelper.fieldOfViewFromProjectionMatrix(this._renderer.pMatrices[0]);\n        perspective(this._mat4, fov, this._renderer.width / this._renderer.height, this._config.nearPlane, this._config.farPlane);\n        this._renderer.pickPMatrix = this._mat4;\n      }\n      if (this._renderer.isInitialized) {\n        this._renderer.update(elapsedTime);\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$4(this, void 0, void 0, function* () {\n        this._fps.render();\n        if (this._renderer.isInitialized) {\n          yield this._renderer.render(elapsedTime, xrFrame);\n          if (this.afterRenderCallback) {\n            this.afterRenderCallback();\n          }\n        }\n      });\n    }\n    _syncSmooth() {\n      copy$3(this._smoothedModelPosition, this._modelPosition);\n      copy$3(this._smoothedModelScale, this._modelScale);\n      copy$1(this._smoothedModelRotation, this._modelRotation);\n    }\n    _updateManipulationOrigin(position2) {\n      this._log.write(LogLevel.info, `manipulation origin ${position2[0].toFixed(3)},${position2[1].toFixed(3)},${position2[2].toFixed(3)}`);\n      this._camera.updateModelManipulationOrigin(this._modelManipulationOrigin, position2);\n      copy$3(this._modelManipulationOrigin, position2);\n      transformMat4$2(this._vec3, this._modelManipulationOrigin, this._modelMMatrix);\n      subtract(this._modelPosition, this._vec3, this._modelManipulationOrigin);\n      copy$3(this._smoothedModelPosition, this._modelPosition);\n      if (this.manipulationOriginChangedCallback) {\n        const result = {\n          x: position2[0],\n          y: position2[1],\n          z: position2[2]\n        };\n        this.manipulationOriginChangedCallback(result);\n      }\n    }\n    pickLasso(x02, y02, x12, y12, pickType) {\n      const inverseMMatrix = create$4();\n      invert(inverseMMatrix, this._modelMMatrix);\n      const sets = [];\n      const nearPositions = [create$3(), create$3(), create$3(), create$3()];\n      const farPositions = [create$3(), create$3(), create$3(), create$3()];\n      const directions = [create$3(), create$3(), create$3(), create$3()];\n      this._camera.unproject(nearPositions[0], x02, y12, -1);\n      this._camera.unproject(farPositions[0], x02, y12, 1);\n      this._camera.unproject(nearPositions[1], x12, y12, -1);\n      this._camera.unproject(farPositions[1], x12, y12, 1);\n      this._camera.unproject(nearPositions[2], x12, y02, -1);\n      this._camera.unproject(farPositions[2], x12, y02, 1);\n      this._camera.unproject(nearPositions[3], x02, y02, -1);\n      this._camera.unproject(farPositions[3], x02, y02, 1);\n      for (let i = 0; i < 4; i++) {\n        transformMat4$2(nearPositions[i], nearPositions[i], inverseMMatrix);\n        transformMat4$2(farPositions[i], farPositions[i], inverseMMatrix);\n        subtract(directions[i], farPositions[i], nearPositions[i]);\n        normalize$2(directions[i], directions[i]);\n      }\n      const normals = [create$3(), create$3(), create$3(), create$3()];\n      const d = [];\n      for (let i = 0; i < 4; i++) {\n        cross(normals[i], directions[(i + 1) % 4], directions[i]);\n        normalize$2(normals[i], normals[i]);\n        d.push(-dot$1(normals[i], nearPositions[i]));\n      }\n      if (pickType == PickType.data) {\n        const translation = create$3();\n        for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n          const transitionBuffer = this._renderer.transitionBuffers[i];\n          const set2 = /* @__PURE__ */ new Set();\n          if (transitionBuffer.isVisible) {\n            const start = window.performance.now();\n            const currentBuffer = transitionBuffer.currentBuffer;\n            const lookup2 = currentBuffer.lookup;\n            for (let j = 0; j < currentBuffer.length; j++) {\n              const id2 = currentBuffer.ids[j];\n              const index2 = lookup2[id2];\n              if (index2 != null) {\n                UnitVertex.getTranslation(currentBuffer.dataView, index2, translation);\n                let isInside = true;\n                for (let k = 0; k < 4; k++) {\n                  let distance2 = dot$1(normals[k], translation);\n                  distance2 += d[k];\n                  if (distance2 < 0) {\n                    isInside = false;\n                    break;\n                  }\n                }\n                if (isInside) {\n                  set2.add(id2);\n                }\n              }\n            }\n            if (set2.size > 0) {\n              this._log.write(LogLevel.info, `lasso transition buffer ${i} picked ${set2.size} ${Math.round(window.performance.now() - start)}ms`);\n            }\n          }\n          sets.push(set2);\n        }\n      }\n      return sets;\n    }\n  }\n  const StereoMode = {\n    none: \"none\",\n    split: \"split\",\n    anaglyph: \"anaglyph\",\n    left: \"left\",\n    right: \"right\"\n  };\n  const HorizontalAlignment = {\n    left: \"left\",\n    center: \"center\",\n    right: \"right\"\n  };\n  const VerticalAlignment = {\n    top: \"top\",\n    center: \"center\",\n    bottom: \"bottom\"\n  };\n  const AxesTextOrientation = {\n    parallel: \"parallel\",\n    perpendicular: \"perpendicular\"\n  };\n  const AxesVisibility = {\n    none: \"none\",\n    current: \"current\",\n    previous: \"previous\"\n  };\n  const PickType = {\n    none: 0,\n    data: 1,\n    label: 2,\n    axesDivision: 3,\n    axesTitle: 4,\n    axesLabel: 5,\n    axesHeading: 6\n  };\n  const Theme = {\n    dark: \"dark\",\n    light: \"light\"\n  };\n  const HighlightMode = {\n    luminance: \"luminance\",\n    color: \"color\"\n  };\n  const UnitType = {\n    block: \"block\",\n    blockSdf: \"blockSdf\",\n    sphere: \"sphere\",\n    sphereSdf: \"sphereSdf\",\n    cylinder: \"cylinder\",\n    cylinderSdf: \"cylinderSdf\",\n    hexPrism: \"hexPrism\",\n    hexPrismSdf: \"hexPrismSdf\",\n    sdf: \"sdf\",\n    disk: \"disk\",\n    ringSdf: \"ringSdf\"\n  };\n  const SingleTouchAction = {\n    translate: \"translate\",\n    rotate: \"rotate\",\n    lasso: \"lasso\"\n  };\n  const MouseWheelAction = {\n    zoom: \"zoom\",\n    rotateY: \"rotateY\"\n  };\n  const LogLevel = {\n    trace: 0,\n    debug: 1,\n    info: 2,\n    warn: 3,\n    error: 4\n  };\n  const Edge3D = {\n    topFront: 0,\n    topRight: 1,\n    topBack: 2,\n    bottomRight: 5,\n    frontRight: 8,\n    backRight: 9\n  };\n  const RenderMode = {\n    color: \"color\"\n  };\n  let LabelSetVisual$2 = class LabelSetVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(labelSet) {\n      this.label = labelSet;\n    }\n  };\n  class LabelBase {\n    get material() {\n      return this._material;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get verticesView() {\n      return this._verticesView;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get materialType() {\n      return this._materialType;\n    }\n    get materialColor() {\n      return this._materialColor;\n    }\n    get materialFuzz() {\n      return this._materialFuzz;\n    }\n    get materialGloss() {\n      return this._materialGloss;\n    }\n    get segmentColor() {\n      return this._segmentColor;\n    }\n    get scale() {\n      return this._scale;\n    }\n    set scale(value2) {\n      if (this._scale != value2) {\n        this._scale = value2;\n        this._hasChanged = true;\n      }\n    }\n    get font() {\n      return this._font;\n    }\n    set font(value2) {\n      if (this._font != value2) {\n        this._font = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotation() {\n      return this._rotation;\n    }\n    set rotation(value2) {\n      if (this._rotation != value2) {\n        this._rotation = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseX(value2) {\n      if (this._reverseX != value2) {\n        this._reverseX = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseY(value2) {\n      if (this._reverseY != value2) {\n        this._reverseY = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseZ(value2) {\n      if (this._reverseZ != value2) {\n        this._reverseZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get horizontalAlignment() {\n      return this._horizontalAlignment;\n    }\n    set horizontalAlignment(value2) {\n      if (this._horizontalAlignment != value2) {\n        this._horizontalAlignment = value2;\n        this._hasChanged = true;\n      }\n    }\n    get verticalAlignment() {\n      return this._verticalAlignment;\n    }\n    set verticalAlignment(value2) {\n      if (this._verticalAlignment != value2) {\n        this._verticalAlignment = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offsetX;\n    }\n    set offsetX(value2) {\n      if (this._offsetX != value2) {\n        this._offsetX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetY() {\n      return this._offsetY;\n    }\n    set offsetY(value2) {\n      if (this._offsetY != value2) {\n        this._offsetY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetZ() {\n      return this._offsetZ;\n    }\n    set offsetZ(value2) {\n      if (this._offsetZ != value2) {\n        this._offsetZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxGlyphTop() {\n      return this._maxGlyphTop;\n    }\n    set maxGlyphTop(value2) {\n      if (this._maxGlyphTop != value2) {\n        this._maxGlyphTop = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxGlyphHeight() {\n      return this._maxGlyphHeight;\n    }\n    set maxGlyphHeight(value2) {\n      if (this._maxGlyphHeight != value2) {\n        this._maxGlyphHeight = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options) {\n      this._core = core;\n      this._offset = create$3();\n      this._vec3 = create$3();\n      this._vec4 = create$2();\n      this._mMatrix = create$4();\n      this._indexCount = 0;\n      this._maxGlyphs = options.maxGlyphs;\n      this._textMetric = { width: 0, maxHeight: 0, maxTop: 0 };\n      this.scale = options.scale ? options.scale : 1;\n      this.offsetX = options.offsetX ? options.offsetX : 0;\n      this.offsetY = options.offsetY ? options.offsetY : 0;\n      this.offsetZ = options.offsetZ ? options.offsetZ : 0;\n      this.reverseX = options.reverseX;\n      this.reverseY = options.reverseY;\n      this.reverseZ = options.reverseZ;\n      this.rotation = options.rotation;\n      this.maxGlyphTop = options.maxGlyphTop;\n      this.horizontalAlignment = options.horizontalAlignment === void 0 ? HorizontalAlignment.center : options.horizontalAlignment;\n      this.verticalAlignment = options.verticalAlignment === void 0 ? VerticalAlignment.center : options.verticalAlignment;\n      this._material = options.material;\n      this.borderWidth = core.config.textBorderWidth;\n      this.gamma = 0;\n      this._materialType = options.materialType || 0;\n      this._materialColor = options.materialColor || core.config.textColor;\n      this._materialFuzz = options.materialFuzz || 0;\n      this._materialGloss = options.materialGloss || 0;\n      this._segmentColor = options.segmentColor;\n    }\n    initialize() {\n      this._vertices = new ArrayBuffer(PositionTexturePickVertex.SIZE_BYTES * this._maxGlyphs * 4);\n      this._verticesView = new DataView(this._vertices);\n      this._indices = new Uint32Array(this._maxGlyphs * 6);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n  }\n  class LabelSet extends LabelBase {\n    get materials() {\n      return this._materials;\n    }\n    get materialTypes() {\n      return this._materialTypes;\n    }\n    get materialColors() {\n      return this._materialColors;\n    }\n    get materialFuzzes() {\n      return this._materialFuzzes;\n    }\n    get materialGlosses() {\n      return this._materialGlosses;\n    }\n    get segmentColors() {\n      return this._segmentColors;\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (this._minBoundsX != value2) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (this._minBoundsY != value2) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (this._minBoundsZ != value2) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (this._maxBoundsX != value2) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (this._maxBoundsY != value2) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (this._maxBoundsZ != value2) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsX() {\n      return this._positionsX;\n    }\n    set positionsX(value2) {\n      if (this._positionsX != value2) {\n        this._positionsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsY() {\n      return this._positionsY;\n    }\n    set positionsY(value2) {\n      if (this._positionsY != value2) {\n        this._positionsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsZ() {\n      return this._positionsZ;\n    }\n    set positionsZ(value2) {\n      if (this._positionsZ != value2) {\n        this._positionsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingX() {\n      return this._positionScalingX;\n    }\n    set positionScalingX(value2) {\n      if (this._positionScalingX != value2) {\n        this._positionScalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingY() {\n      return this._positionScalingY;\n    }\n    set positionScalingY(value2) {\n      if (this._positionScalingY != value2) {\n        this._positionScalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingZ() {\n      return this._positionScalingZ;\n    }\n    set positionScalingZ(value2) {\n      if (this._positionScalingZ != value2) {\n        this._positionScalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotations() {\n      return this._rotations;\n    }\n    set rotations(value2) {\n      if (this._rotations != value2) {\n        this._rotations = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsX() {\n      return this._offsetsX;\n    }\n    set offsetsX(value2) {\n      if (this._offsetsX != value2) {\n        this._offsetsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsY() {\n      return this._offsetsY;\n    }\n    set offsetsY(value2) {\n      if (this._offsetsY != value2) {\n        this._offsetsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsZ() {\n      return this._offsetsZ;\n    }\n    set offsetsZ(value2) {\n      if (this._offsetsZ != value2) {\n        this._offsetsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingX() {\n      return this._offsetScalingX;\n    }\n    set offsetScalingX(value2) {\n      if (this._offsetScalingX != value2) {\n        this._offsetScalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingY() {\n      return this._offsetScalingY;\n    }\n    set offsetScalingY(value2) {\n      if (this._offsetScalingY != value2) {\n        this._offsetScalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingZ() {\n      return this._offsetScalingZ;\n    }\n    set offsetScalingZ(value2) {\n      if (this._offsetScalingZ != value2) {\n        this._offsetScalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get text() {\n      return this._text;\n    }\n    set text(value2) {\n      if (this._text != value2) {\n        this._text = value2;\n        this._hasChanged = true;\n      }\n    }\n    get horizontalAlignments() {\n      return this._horizontalAlignments;\n    }\n    set horizontalAlignments(value2) {\n      if (this._horizontalAlignments != value2) {\n        this._horizontalAlignments = value2;\n        this._hasChanged = true;\n      }\n    }\n    get verticalAlignments() {\n      return this._verticalAlignments;\n    }\n    set verticalAlignments(value2) {\n      if (this._verticalAlignments != value2) {\n        this._verticalAlignments = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scales() {\n      return this._scales;\n    }\n    set scales(value2) {\n      if (this._scales != value2) {\n        this._scales = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalesScaling() {\n      return this._scalesScaling;\n    }\n    set scalesScaling(value2) {\n      if (this._scalesScaling != value2) {\n        this._scalesScaling = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options) {\n      super(core, options);\n      this._quat = create$1();\n      this._materials = options.materials;\n      this._materialType = options.materialType;\n      this._materialColor = options.materialColors ? null : options.materialColor || core.config.textColor;\n      this._materialColors = options.materialColors;\n      this.minBoundsX = options.minBoundsX ? options.minBoundsX : 0;\n      this.minBoundsY = options.minBoundsY ? options.minBoundsY : 0;\n      this.minBoundsZ = options.minBoundsZ ? options.minBoundsZ : 0;\n      this.maxBoundsX = options.maxBoundsX ? options.maxBoundsX : 1;\n      this.maxBoundsY = options.maxBoundsY ? options.maxBoundsY : 1;\n      this.maxBoundsZ = options.maxBoundsZ ? options.maxBoundsZ : 1;\n      this._font = options.font || core.font;\n      this.text = options.text;\n      this.positionsX = options.positionsX;\n      this.positionsY = options.positionsY;\n      this.positionsZ = options.positionsZ;\n      this.positionScalingX = options.positionScalingX ? options.positionScalingX : 1;\n      this.positionScalingY = options.positionScalingY ? options.positionScalingY : 1;\n      this.positionScalingZ = options.positionScalingZ ? options.positionScalingZ : 1;\n      this.rotations = options.rotations;\n      this.offsetsX = options.offsetsX;\n      this.offsetsY = options.offsetsY;\n      this.offsetsZ = options.offsetsZ;\n      this.offsetScalingX = options.offsetScalingX ? options.offsetScalingX : 1;\n      this.offsetScalingY = options.offsetScalingY ? options.offsetScalingY : 1;\n      this.offsetScalingZ = options.offsetScalingZ ? options.offsetScalingZ : 1;\n      if (options.horizontalAlignments)\n        this.horizontalAlignments = options.horizontalAlignments;\n      if (options.verticalAlignments)\n        this.verticalAlignments = options.verticalAlignments;\n      if (options.scales)\n        this.scales = options.scales;\n      this.scalesScaling = options.scalesScaling ? options.scalesScaling : 1;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.pickIdLookup = {};\n        if (!this._text) {\n          this._indexCount = 0;\n        } else {\n          const start = window.performance.now();\n          const modelSizeX = this._maxBoundsX - this._minBoundsX;\n          const modelSizeY = this._maxBoundsY - this._minBoundsY;\n          const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n          const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n          const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n          const modelOriginX = (this._minBoundsX + this._maxBoundsX) / 2;\n          const modelOriginY = (this._minBoundsY + this._maxBoundsY) / 2;\n          const modelOriginZ = (this._minBoundsZ + this._maxBoundsZ) / 2;\n          if (this._rotation) {\n            set$1(this._quat, this._rotation[0], this._rotation[1], this._rotation[2], this._rotation[3]);\n          }\n          let glyphs = 0;\n          for (let i = 0; i < this._text.length; i++) {\n            const offsetX = (this._offsetsX ? this._offsetsX[i] / 2 : this._offsetX) * boundsScaling * this._offsetScalingX;\n            const offsetY = (this._offsetsY ? this._offsetsY[i] / 2 : this._offsetY) * boundsScaling * this._offsetScalingY;\n            const offsetZ = (this._offsetsZ ? this._offsetsZ[i] / 2 : this._offsetZ) * boundsScaling * this._offsetScalingZ;\n            const text2 = TextHelper.truncate(this._text[i], this._maxGlyphs - glyphs);\n            const scale2 = (this._scales ? this._scales[i] * this._scalesScaling : this._scale) * boundsScaling / this._font.size;\n            TextHelper.measure(this._font, text2, this._textMetric);\n            const width2 = this._textMetric.width * scale2;\n            const lineHeight2 = this._font.size * scale2;\n            const maxGlyphTop = (this._maxGlyphTop ? this._maxGlyphTop : this._textMetric.maxTop) * scale2;\n            const horizontalAlignment = this._horizontalAlignments ? this._horizontalAlignments[i] : this._horizontalAlignment;\n            switch (horizontalAlignment) {\n              case HorizontalAlignment.left:\n                this._offset[0] = offsetX;\n                break;\n              case HorizontalAlignment.center:\n                this._offset[0] = offsetX - width2 / 2;\n                break;\n              case HorizontalAlignment.right:\n                this._offset[0] = offsetX - width2;\n                break;\n            }\n            const verticalAlignment = this._verticalAlignments ? this._verticalAlignments[i] : this._verticalAlignment;\n            switch (verticalAlignment) {\n              case VerticalAlignment.top:\n                this._offset[1] = offsetY - lineHeight2 / 2;\n                break;\n              case VerticalAlignment.center:\n                this._offset[1] = offsetY;\n                break;\n              case VerticalAlignment.bottom:\n                this._offset[1] = offsetY + lineHeight2 / 2;\n                break;\n            }\n            this._offset[1] -= maxGlyphTop / 2;\n            this._offset[2] = offsetZ;\n            let positionX = this.positionsX ? this.positionsX[i] * this.positionScalingX : 0;\n            let positionY = this.positionsY ? this.positionsY[i] * this.positionScalingY : 0;\n            let positionZ = this.positionsZ ? this.positionsZ[i] * this.positionScalingZ : 0;\n            if (this._reverseX) {\n              positionX = this.minBoundsX + this.maxBoundsX - positionX;\n            }\n            if (this._reverseY) {\n              positionY = this.minBoundsY + this.maxBoundsY - positionY;\n            }\n            if (this._reverseZ) {\n              positionZ = this.minBoundsZ + this.maxBoundsZ - positionZ;\n            }\n            set$3(this._vec3, (positionX - modelOriginX) * boundsScaling, (positionY - modelOriginY) * boundsScaling, (positionZ - modelOriginZ) * boundsScaling);\n            if (this._rotations) {\n              set$1(this._quat, this._rotations[i * 4], this._rotations[i * 4 + 1], this._rotations[i * 4 + 2], this._rotations[i * 4 + 3]);\n            }\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.label, this._vec4);\n            this.pickIdLookup[pickId] = i;\n            TextHelper.addString(this._font, text2, this._verticesView, this._indices, glyphs, this._vec3, scale2, this._offset, this._rotation || this._rotations ? this._quat : null, this._vec4);\n            glyphs += text2.length;\n            if (glyphs >= this._maxGlyphs) {\n              glyphs = this._maxGlyphs;\n              break;\n            }\n          }\n          this._indexCount = glyphs * 6;\n          this._core.log.write(LogLevel.info, `label set updated ${Math.round(window.performance.now() - start)}ms`);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n        }\n      }\n    }\n  }\n  let ImageVisual$2 = class ImageVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(image2) {\n      this.image = image2;\n    }\n  };\n  class ImageBase {\n    get material() {\n      return this._material;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get imageData() {\n      return this._imageData;\n    }\n    set imageData(value2) {\n      if (this._imageData != value2) {\n        this._imageData = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotation() {\n      return this._rotation;\n    }\n    set rotation(value2) {\n      if (!equals$1(this._rotation, value2)) {\n        copy$1(this._rotation, value2);\n        this._hasChanged = true;\n      }\n    }\n    get position() {\n      return this._position;\n    }\n    set position(value2) {\n      if (!equals$2(this._position, value2)) {\n        copy$3(this._position, value2);\n        this._hasChanged = true;\n      }\n    }\n    get texCoord0() {\n      return this._texCoord0;\n    }\n    set texCoord0(value2) {\n      if (!equals(this._texCoord0, value2)) {\n        copy(this._texCoord0, value2);\n        this._hasChanged = true;\n      }\n    }\n    get texCoord1() {\n      return this._texCoord1;\n    }\n    set texCoord1(value2) {\n      if (!equals(this._texCoord1, value2)) {\n        copy(this._texCoord1, value2);\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (this._minBoundsX != value2) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (this._minBoundsY != value2) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (this._minBoundsZ != value2) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (this._maxBoundsX != value2) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (this._maxBoundsY != value2) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (this._maxBoundsZ != value2) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options) {\n      this._core = core;\n      this._mMatrix = create$4();\n      this._origin = create$3();\n      this._translation = create$3();\n      this._scale = create$3();\n      this._transform = create$4();\n      this._imageData = options.imageData;\n      this._minBoundsX = options.minBoundsX === void 0 ? 0 : options.minBoundsX;\n      this._minBoundsY = options.minBoundsY === void 0 ? 0 : options.minBoundsY;\n      this._minBoundsZ = options.minBoundsZ === void 0 ? 0 : options.minBoundsZ;\n      this._maxBoundsX = options.maxBoundsX === void 0 ? 1 : options.maxBoundsX;\n      this._maxBoundsY = options.maxBoundsY === void 0 ? 1 : options.maxBoundsY;\n      this._maxBoundsZ = options.maxBoundsZ === void 0 ? 1 : options.maxBoundsZ;\n      this._position = options.position ? clone$4(options.position) : create$3();\n      this._rotation = options.rotation ? clone$2(options.rotation) : create$1();\n      this._texCoord0 = options.texCoord0 ? clone$1(options.texCoord0) : fromValues(0, 0);\n      this._texCoord1 = options.texCoord1 ? clone$1(options.texCoord1) : fromValues(1, 1);\n      this._material = options.material === void 0 ? -1 : options.material;\n      this._hasChanged = true;\n    }\n  }\n  class ImageQuad extends ImageBase {\n    get width() {\n      return this._width;\n    }\n    set width(value2) {\n      if (this._width != value2) {\n        this._width = value2;\n        this._hasChanged = true;\n      }\n    }\n    get height() {\n      return this._height;\n    }\n    set height(value2) {\n      if (this._height != value2) {\n        this._height = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options) {\n      super(core, options);\n      this._width = options.width === void 0 ? 1 : options.width;\n      this._height = options.height === void 0 ? 1 : options.height;\n      this._texTransform = create$4();\n      translate(this._texTransform, this._texTransform, fromValues$3(0, 1, 0));\n      scale$1(this._texTransform, this._texTransform, fromValues$3(1, -1, 1));\n    }\n    initialize() {\n      this._vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * 4);\n      this._indices = Quad$2.INDICES;\n      this._indexCount = this._indices.length;\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        const modelSizeX = this._maxBoundsX - this._minBoundsX;\n        const modelSizeY = this._maxBoundsY - this._minBoundsY;\n        const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n        const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n        const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n        set$3(this._origin, (this._minBoundsX + this._maxBoundsX) / 2, (this._minBoundsY + this._maxBoundsY) / 2, (this._minBoundsZ + this._maxBoundsZ) / 2);\n        subtract(this._translation, this._position, this._origin);\n        scale(this._translation, this._translation, boundsScaling);\n        set$3(this._scale, this._width, this._height, 1);\n        scale(this._scale, this._scale, boundsScaling);\n        fromRotationTranslationScale(this._transform, this._rotation, this._translation, this._scale);\n        this._verticesView = Quad$2.normalTextured(this._transform, this._texTransform);\n        this._vertices = this._verticesView.buffer;\n        if (this.hasChangedCallback) {\n          this.hasChangedCallback();\n        }\n      }\n    }\n  }\n  class BoundsHelper {\n    static rotateBounds(minBounds, maxBounds, rotation2, rotatedMinBounds, rotatedMaxBounds, offset2) {\n      const sizeX = maxBounds[0] - minBounds[0];\n      const sizeY = maxBounds[1] - minBounds[1];\n      const sizeZ = maxBounds[2] - minBounds[2];\n      const min$12 = rotatedMinBounds;\n      const max$12 = rotatedMaxBounds;\n      set$3(min$12, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n      set$3(max$12, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n      const vertices = Cube.POSITIONS;\n      const position2 = create$3();\n      for (let i = 0; i < 8; i++) {\n        set$3(position2, vertices[i * 3] * sizeX, vertices[i * 3 + 1] * sizeY, vertices[i * 3 + 2] * sizeZ);\n        add(position2, position2, offset2);\n        transformQuat(position2, position2, rotation2);\n        subtract(position2, position2, offset2);\n        min(min$12, min$12, position2);\n        max(max$12, max$12, position2);\n      }\n      add(position2, minBounds, maxBounds);\n      scale(position2, position2, 0.5);\n      add(min$12, min$12, position2);\n      add(max$12, max$12, position2);\n    }\n    static cylinder(pa2, pb, radius2, minBounds, maxBounds) {\n      const a2 = create$3();\n      subtract(a2, pb, pa2);\n      const aa = dot$1(a2, a2);\n      const ex = radius2 * Math.sqrt(1 - a2[0] * a2[0] / aa);\n      const ey = radius2 * Math.sqrt(1 - a2[1] * a2[1] / aa);\n      const ez = radius2 * Math.sqrt(1 - a2[2] * a2[2] / aa);\n      minBounds[0] = Math.min(pa2[0] - ex, pb[0] - ex);\n      minBounds[1] = Math.min(pa2[1] - ey, pb[1] - ey);\n      minBounds[2] = Math.min(pa2[2] - ez, pb[2] - ez);\n      maxBounds[0] = Math.max(pa2[0] + ex, pb[0] + ex);\n      maxBounds[1] = Math.max(pa2[1] + ey, pb[1] + ey);\n      maxBounds[2] = Math.max(pa2[2] + ez, pb[2] + ez);\n    }\n  }\n  class LayoutBase {\n    get facetScaling() {\n      return this._facetScaling;\n    }\n    offsetX(facetCoordX) {\n      return ((facetCoordX + 0.5) / this._facetsX - 0.5) * (this.maxModelBoundsX - this.minModelBoundsX) / this._maxBounds;\n    }\n    offsetY(facetCoordY) {\n      return ((facetCoordY + 0.5) / this._facetsY - 0.5) * (this.maxModelBoundsY - this.minModelBoundsY) / this._maxBounds;\n    }\n    offsetZ(facetCoordZ) {\n      return ((facetCoordZ + 0.5) / this._facetsZ - 0.5) * (this.maxModelBoundsZ - this.minModelBoundsZ) / this._maxBounds;\n    }\n    constructor(core) {\n      this._core = core;\n      this.modelOriginX = 0;\n      this.modelOriginY = 0;\n      this.modelOriginZ = 0;\n      this.minModelBoundsX = 0;\n      this.minModelBoundsY = 0;\n      this.minModelBoundsZ = 0;\n      this.maxModelBoundsX = 0;\n      this.maxModelBoundsY = 0;\n      this.maxModelBoundsZ = 0;\n      this.minLayoutBoundsX = 0;\n      this.minLayoutBoundsY = 0;\n      this.minLayoutBoundsZ = 0;\n      this.maxLayoutBoundsX = 0;\n      this.maxLayoutBoundsY = 0;\n      this.maxLayoutBoundsZ = 0;\n      this._facetSpacingX = 0;\n      this._facetSpacingY = 0;\n      this._facetSpacingZ = 0;\n      this._facetSizeX = 0;\n      this._facetSizeY = 0;\n      this._facetSizeZ = 0;\n      this._facetsX = 1;\n      this._facetsY = 1;\n      this._facetsZ = 1;\n    }\n    _updateModelBounds(options) {\n      this.minModelBoundsX = options.minBoundsX === void 0 ? this.minLayoutBoundsX : options.minBoundsX;\n      this.minModelBoundsY = options.minBoundsY === void 0 ? this.minLayoutBoundsY : options.minBoundsY;\n      this.minModelBoundsZ = options.minBoundsZ === void 0 ? this.minLayoutBoundsZ : options.minBoundsZ;\n      this.maxModelBoundsX = options.maxBoundsX === void 0 ? this.maxLayoutBoundsX : options.maxBoundsX;\n      this.maxModelBoundsY = options.maxBoundsY === void 0 ? this.maxLayoutBoundsY : options.maxBoundsY;\n      this.maxModelBoundsZ = options.maxBoundsZ === void 0 ? this.maxLayoutBoundsZ : options.maxBoundsZ;\n      this._isFacetted = options.facetsX !== void 0 && options.facetsX > 1 && options.facetCoordsX != null || options.facetsY !== void 0 && options.facetsY > 1 && options.facetCoordsY != null || options.facetsZ !== void 0 && options.facetsZ > 1 && options.facetCoordsZ != null;\n      this._facetSpacingX = options.facetSpacingX === void 0 ? 0 : options.facetSpacingX;\n      this._facetSpacingY = options.facetSpacingY === void 0 ? 0 : options.facetSpacingY;\n      this._facetSpacingZ = options.facetSpacingZ === void 0 ? 0 : options.facetSpacingZ;\n      let modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n      let modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n      let modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n      const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n      this._facetSizeX = modelSizeX;\n      this._facetSizeY = modelSizeY;\n      this._facetSizeZ = modelSizeZ;\n      this._facetsX = options.facetCoordsX ? options.facetsX : 1;\n      this._facetsY = options.facetCoordsY ? options.facetsY : 1;\n      this._facetsZ = options.facetCoordsZ ? options.facetsZ : 1;\n      this.minModelBoundsX -= this._facetSizeX * this._facetSpacingX / 2;\n      this.minModelBoundsY -= this._facetSizeY * this._facetSpacingY / 2;\n      this.minModelBoundsZ -= this._facetSizeZ * this._facetSpacingZ / 2;\n      this.maxModelBoundsX = this.minModelBoundsX + this._facetsX * this._facetSizeX * (1 + this._facetSpacingX);\n      this.maxModelBoundsY = this.minModelBoundsY + this._facetsY * this._facetSizeY * (1 + this._facetSpacingY);\n      this.maxModelBoundsZ = this.minModelBoundsZ + this._facetsZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n      this.modelOriginX = (this.minModelBoundsX + this.maxModelBoundsX) / 2;\n      this.modelOriginY = (this.minModelBoundsY + this.maxModelBoundsY) / 2;\n      this.modelOriginZ = (this.minModelBoundsZ + this.maxModelBoundsZ) / 2;\n      modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n      modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n      modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n      this._maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n      this._boundsScaling = this._maxBounds == 0 ? 1 : 1 / this._maxBounds;\n      this._facetScaling = maxBounds / this._maxBounds;\n    }\n    resetCumulativeLayoutBounds() {\n      this.minCumulativeLayoutBoundsX = void 0;\n      this.minCumulativeLayoutBoundsY = void 0;\n      this.minCumulativeLayoutBoundsZ = void 0;\n      this.maxCumulativeLayoutBoundsX = void 0;\n      this.maxCumulativeLayoutBoundsY = void 0;\n      this.maxCumulativeLayoutBoundsZ = void 0;\n    }\n    _updateCumulativeLayoutBounds() {\n      this.minCumulativeLayoutBoundsX = this.minCumulativeLayoutBoundsX === void 0 ? this.minLayoutBoundsX : Math.min(this.minCumulativeLayoutBoundsX, this.minLayoutBoundsX);\n      this.minCumulativeLayoutBoundsY = this.minCumulativeLayoutBoundsY === void 0 ? this.minLayoutBoundsY : Math.min(this.minCumulativeLayoutBoundsY, this.minLayoutBoundsY);\n      this.minCumulativeLayoutBoundsZ = this.minCumulativeLayoutBoundsZ === void 0 ? this.minLayoutBoundsZ : Math.min(this.minCumulativeLayoutBoundsZ, this.minLayoutBoundsZ);\n      this.maxCumulativeLayoutBoundsX = this.maxCumulativeLayoutBoundsX === void 0 ? this.maxLayoutBoundsX : Math.max(this.maxCumulativeLayoutBoundsX, this.maxLayoutBoundsX);\n      this.maxCumulativeLayoutBoundsY = this.maxCumulativeLayoutBoundsY === void 0 ? this.maxLayoutBoundsY : Math.max(this.maxCumulativeLayoutBoundsY, this.maxLayoutBoundsY);\n      this.maxCumulativeLayoutBoundsZ = this.maxCumulativeLayoutBoundsZ === void 0 ? this.maxLayoutBoundsZ : Math.max(this.maxCumulativeLayoutBoundsZ, this.maxLayoutBoundsZ);\n    }\n    unitToModelSize(unitSize) {\n      return unitSize / this._boundsScaling;\n    }\n    unitToModelPositionX(unitPositionX) {\n      return this.unitToModelSize(unitPositionX) + this.modelOriginX;\n    }\n    unitToModelPositionY(unitPositionY) {\n      return this.unitToModelSize(unitPositionY) + this.modelOriginY;\n    }\n    unitToModelPositionZ(unitPositionZ) {\n      return this.unitToModelSize(unitPositionZ) + this.modelOriginZ;\n    }\n    unitToModelPosition(unitPosition, modelPosition) {\n      modelPosition[0] = this.unitToModelPositionX(unitPosition[0]);\n      modelPosition[1] = this.unitToModelPositionY(unitPosition[1]);\n      modelPosition[2] = this.unitToModelPositionZ(unitPosition[2]);\n    }\n    modelToUnitSize(modelSize) {\n      return modelSize * this._boundsScaling;\n    }\n    modelToUnitPositionX(modelPositionX) {\n      return (modelPositionX - this.modelOriginX) * this._boundsScaling;\n    }\n    modelToUnitPositionY(modelPositionY) {\n      return (modelPositionY - this.modelOriginY) * this._boundsScaling;\n    }\n    modelToUnitPositionZ(modelPositionZ) {\n      return (modelPositionZ - this.modelOriginZ) * this._boundsScaling;\n    }\n    modelToUnitPosition(modelPosition, unitPosition) {\n      unitPosition[0] = this.modelToUnitPositionX(modelPosition[0]);\n      unitPosition[1] = this.modelToUnitPositionY(modelPosition[1]);\n      unitPosition[2] = this.modelToUnitPositionZ(modelPosition[2]);\n    }\n    inclusiveUnitBounds(buffer, ids, unitType, offset2, count2, minBounds, maxBounds) {\n      set$3(minBounds, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n      set$3(maxBounds, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n      const unitScale = create$3();\n      const unitRotation = create$1();\n      const unitTranslation = create$3();\n      const lookup2 = buffer.lookup;\n      const dataView = buffer.dataView;\n      let minBounds0;\n      let maxBounds0;\n      let minBounds1;\n      let maxBounds1;\n      switch (unitType) {\n        case UnitType.sphere:\n        case UnitType.sphereSdf:\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            const radius2 = unitScale[0] / 2;\n            minBounds[0] = Math.min(minBounds[0], unitTranslation[0] - radius2);\n            minBounds[1] = Math.min(minBounds[1], unitTranslation[1] - radius2);\n            minBounds[2] = Math.min(minBounds[2], unitTranslation[2] - radius2);\n            maxBounds[0] = Math.max(maxBounds[0], unitTranslation[0] + radius2);\n            maxBounds[1] = Math.max(maxBounds[1], unitTranslation[1] + radius2);\n            maxBounds[2] = Math.max(maxBounds[2], unitTranslation[2] + radius2);\n          }\n          break;\n        case UnitType.hexPrism:\n        case UnitType.hexPrismSdf:\n        case UnitType.block:\n        case UnitType.blockSdf:\n          minBounds0 = create$3();\n          maxBounds0 = create$3();\n          minBounds1 = create$3();\n          maxBounds1 = create$3();\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getRotation(dataView, index2, unitRotation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            minBounds0[0] = unitTranslation[0] - unitScale[0] / 2;\n            minBounds0[1] = unitTranslation[1] - unitScale[1] / 2;\n            minBounds0[2] = unitTranslation[2] - unitScale[2] / 2;\n            maxBounds0[0] = unitTranslation[0] + unitScale[0] / 2;\n            maxBounds0[1] = unitTranslation[1] + unitScale[1] / 2;\n            maxBounds0[2] = unitTranslation[2] + unitScale[2] / 2;\n            BoundsHelper.rotateBounds(minBounds0, maxBounds0, unitRotation, minBounds1, maxBounds1, Constants.VECTOR3_ZERO);\n            min(minBounds, minBounds, minBounds1);\n            max(maxBounds, maxBounds, maxBounds1);\n          }\n          break;\n        case UnitType.cylinder:\n        case UnitType.cylinderSdf:\n          minBounds0 = create$3();\n          maxBounds0 = create$3();\n          const pa2 = create$3();\n          const pb = create$3();\n          const identityRotation = Constants.VECTOR3_UNITY;\n          let ca;\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getRotation(dataView, index2, unitRotation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            const length2 = unitScale[1];\n            const radius2 = Math.max(unitScale[0], unitScale[2]);\n            if (length2 != 0 && radius2 != 0) {\n              if (equals$1(unitRotation, Constants.QUAT_IDENTITY)) {\n                ca = identityRotation;\n              } else {\n                ca = create$3();\n                transformQuat(ca, identityRotation, unitRotation);\n              }\n              scaleAndAdd(pa2, unitTranslation, ca, -length2 * 0.5);\n              scaleAndAdd(pb, unitTranslation, ca, length2 * 0.5);\n              BoundsHelper.cylinder(pa2, pb, radius2, minBounds0, maxBounds0);\n              min(minBounds, minBounds, minBounds0);\n              max(maxBounds, maxBounds, maxBounds0);\n            }\n          }\n          break;\n      }\n    }\n  }\n  class Scatter extends LayoutBase {\n    layout(buffer, ids, options) {\n      const start = window.performance.now();\n      const offset2 = options.offset === void 0 ? 0 : options.offset;\n      const count2 = options.count === void 0 ? ids.length : options.count;\n      const positionScalingX = options.positionScalingX === void 0 ? 1 : options.positionScalingX;\n      const positionScalingY = options.positionScalingY === void 0 ? 1 : options.positionScalingY;\n      const positionScalingZ = options.positionScalingZ === void 0 ? 1 : options.positionScalingZ;\n      if (!this._positions || this._positions.length < buffer.length * 3) {\n        this._positions = new Float32Array(buffer.length * 3);\n      }\n      this.minLayoutBoundsX = Number.MAX_VALUE;\n      this.minLayoutBoundsY = Number.MAX_VALUE;\n      this.minLayoutBoundsZ = Number.MAX_VALUE;\n      this.maxLayoutBoundsX = -Number.MAX_VALUE;\n      this.maxLayoutBoundsY = -Number.MAX_VALUE;\n      this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = lookup2[id2];\n        let positionX = options.positionsX ? options.positionsX[id2] * positionScalingX : 0;\n        let positionY = options.positionsY ? options.positionsY[id2] * positionScalingY : 0;\n        let positionZ = options.positionsZ ? options.positionsZ[id2] * positionScalingZ : 0;\n        this._positions[index2 * 3] = positionX;\n        this._positions[index2 * 3 + 1] = positionY;\n        this._positions[index2 * 3 + 2] = positionZ;\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, positionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, positionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, positionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, positionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, positionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, positionZ);\n      }\n      this._updateCumulativeLayoutBounds();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n      const start = window.performance.now();\n      const offset2 = options.offset === void 0 ? 0 : options.offset;\n      const count2 = options.count === void 0 ? ids.length : options.count;\n      const dataView = buffer.dataView;\n      const _vec2 = create();\n      const _vec3 = create$3();\n      const _vec4 = create$2();\n      const _quat = create$1();\n      const sizeScalingX = options.sizeScaling === void 0 ? options.sizeScalingX === void 0 ? 1 : options.sizeScalingX : options.sizeScaling;\n      const sizeScalingY = options.sizeScaling === void 0 ? options.sizeScalingY === void 0 ? 1 : options.sizeScalingY : options.sizeScaling;\n      const sizeScalingZ = options.sizeScaling === void 0 ? options.sizeScalingZ === void 0 ? 1 : options.sizeScalingZ : options.sizeScaling;\n      const sizesX = options.sizes ? options.sizes : options.sizesX;\n      const sizesY = options.sizes ? options.sizes : options.sizesY;\n      const sizesZ = options.sizes ? options.sizes : options.sizesZ;\n      const minSize = options.minSize === void 0 ? 0 : options.minSize;\n      const minColor = options.minColor === void 0 ? 0 : options.minColor;\n      const maxColor = options.maxColor === void 0 ? 1 : options.maxColor;\n      const minOrder = options.minOrder === void 0 ? 0 : options.minOrder;\n      const maxOrder = options.maxOrder === void 0 ? 1 : options.maxOrder;\n      const orderReverse = options.orderReverse === void 0 ? false : options.orderReverse;\n      const minStaggerOrder = options.minStaggerOrder === void 0 ? 0 : options.minStaggerOrder;\n      const maxStaggerOrder = options.maxStaggerOrder === void 0 ? 1 : options.maxStaggerOrder;\n      const staggerOrderReverse = options.staggerOrderReverse === void 0 ? false : options.staggerOrderReverse;\n      const reverseX = options.reverseX === void 0 ? false : options.reverseX;\n      const reverseY = options.reverseY === void 0 ? false : options.reverseY;\n      const reverseZ = options.reverseZ === void 0 ? false : options.reverseZ;\n      this._updateModelBounds(options);\n      if (options.rotation) {\n        _quat[0] = options.rotation[0];\n        _quat[1] = options.rotation[1];\n        _quat[2] = options.rotation[2];\n        _quat[3] = options.rotation[3];\n      } else {\n        rotationTo(_quat, this._core.config.identityRotation, Constants.VECTOR3_UNITY);\n      }\n      if (options.texCoord) {\n        _vec4[0] = options.texCoord[0];\n        _vec4[1] = options.texCoord[1];\n        _vec4[2] = options.texCoord[2];\n        _vec4[3] = options.texCoord[3];\n      }\n      const lookup2 = buffer.lookup;\n      const selection = options.selected && options.selected.size > 0;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = lookup2[id2];\n        let positionX = this._positions[index2 * 3];\n        let positionY = this._positions[index2 * 3 + 1];\n        let positionZ = this._positions[index2 * 3 + 2];\n        if (this._isFacetted) {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n          }\n          const facetX = options.facetCoordsX ? options.facetCoordsX[id2] : 0;\n          const facetY = options.facetCoordsY ? options.facetCoordsY[id2] : 0;\n          const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id2] : 0;\n          positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n          positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n          positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        } else {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n          }\n        }\n        _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n        _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n        _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n        UnitVertex.setTranslation(dataView, index2, _vec3);\n        _vec3[0] = Math.max((sizesX ? Math.abs(sizesX[id2]) : 1) * sizeScalingX, minSize) * this._boundsScaling;\n        _vec3[1] = Math.max((sizesY ? Math.abs(sizesY[id2]) : 1) * sizeScalingY, minSize) * this._boundsScaling;\n        _vec3[2] = Math.max((sizesZ ? Math.abs(sizesZ[id2]) : 1) * sizeScalingZ, minSize) * this._boundsScaling;\n        UnitVertex.setScale(dataView, index2, _vec3);\n        if (options.rotations) {\n          _quat[0] = options.rotations[id2 * 4];\n          _quat[1] = options.rotations[id2 * 4 + 1];\n          _quat[2] = options.rotations[id2 * 4 + 2];\n          _quat[3] = options.rotations[id2 * 4 + 3];\n          UnitVertex.setRotation(dataView, index2, _quat);\n        } else {\n          UnitVertex.setRotation(dataView, index2, _quat);\n        }\n        if (options.colors) {\n          const size2 = 1 / (maxColor - minColor + 1);\n          const color2 = MathHelper.normalize(options.colors[id2], minColor, maxColor, size2 / 2, 1 - size2 / 2);\n          if (options.colors1) {\n            const color1 = MathHelper.normalize(options.colors1[id2], minColor, maxColor, size2 / 2, 1 - size2 / 2);\n            set(_vec2, color2, color1);\n          } else {\n            set(_vec2, color2, color2);\n          }\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else {\n          UnitVertex.setColor(dataView, index2, Constants.VECTOR2_ONE);\n        }\n        UnitVertex.setIdHover(dataView, index2, options.hover ? options.hover[id2] : id2);\n        UnitVertex.setSelected(dataView, index2, selection ? options.selected.has(id2) ? 1 : -1 : 0);\n        if (options.order !== void 0) {\n          const order = MathHelper.normalize(options.order[id2], minOrder, maxOrder, 0, 1);\n          _vec2[0] = orderReverse ? 1 - order : order;\n        } else {\n          _vec2[0] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        if (options.staggerOrder !== void 0) {\n          _vec2[1] = options.staggerOrder;\n        } else if (options.staggerOrders) {\n          const stagger = MathHelper.normalize(options.staggerOrders[id2], minStaggerOrder, maxStaggerOrder, 0, 1);\n          _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n        } else {\n          _vec2[1] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        UnitVertex.setOrder(dataView, index2, _vec2);\n        UnitVertex.setMaterial(dataView, index2, options.material ? options.material : options.materials ? options.materials[id2] : 0);\n        UnitVertex.setRounding(dataView, index2, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id2] * this._boundsScaling : 0);\n        UnitVertex.setParameter1(dataView, index2, options.parameter1 ? options.parameter1 : options.parameters1 ? options.parameters1[id2] : 0);\n        UnitVertex.setParameter2(dataView, index2, options.parameter2 ? options.parameter2 : options.parameters2 ? options.parameters2[id2] : 0);\n        UnitVertex.setSdfBuffer(dataView, index2, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id2] : this._core.config.sdfBuffer);\n        UnitVertex.setSdfBorder(dataView, index2, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id2] : this._core.config.sdfBorder);\n        if (options.texCoords) {\n          _vec4[0] = options.texCoords[id2 * 4];\n          _vec4[1] = options.texCoords[id2 * 4 + 1];\n          _vec4[2] = options.texCoords[id2 * 4 + 2];\n          _vec4[3] = options.texCoords[id2 * 4 + 3];\n          UnitVertex.setTexCoord(dataView, index2, _vec4);\n        } else {\n          UnitVertex.setTexCoord(dataView, index2, _vec4);\n        }\n        UnitVertex.setMatId(dataView, index2, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id2] : 0);\n        UnitVertex.setMatColor(dataView, index2, options.materialColor ? options.materialColor : options.materialColors ? [options.materialColors[id2 * 3], options.materialColors[id2 * 3 + 1], options.materialColors[id2 * 3 + 2]] : [0, 0, 0]);\n        UnitVertex.setMatFuzz(dataView, index2, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id2] : 0);\n        UnitVertex.setMatGloss(dataView, index2, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id2] : 0);\n        UnitVertex.setMatDensity(dataView, index2, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id2] : 0);\n        UnitVertex.setMatRefractiveIndex(dataView, index2, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id2] : 0);\n        UnitVertex.setSegColor(dataView, index2, options.segmentColor ? options.segmentColor : options.segmentColors ? [options.segmentColors[id2 * 4], options.segmentColors[id2 * 4 + 1], options.segmentColors[id2 * 4 + 2], options.segmentColors[id2 * 4 + 3]] : [buffer.idColors[id2 * 4], buffer.idColors[id2 * 4 + 1], buffer.idColors[id2 * 4 + 2], buffer.idColors[id2 * 4 + 3]]);\n      }\n      buffer.update();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  fromValues$3(0.2126, 0.7152, 0.0722);\n  create$3();\n  create$3();\n  class PathHelper {\n    static getFilenameWithoutExtension(path2) {\n      const dot2 = path2.lastIndexOf(\".\");\n      if (dot2 == -1) {\n        return path2;\n      } else {\n        const start = path2.lastIndexOf(\"/\") == -1 ? 0 : path2.lastIndexOf(\"/\") + 1;\n        return path2.substring(start, dot2);\n      }\n    }\n    static getExtension(path2) {\n      const dot2 = path2.lastIndexOf(\".\");\n      if (dot2 == -1 || dot2 == path2.length - 1) {\n        return null;\n      } else {\n        return path2.substring(dot2 + 1, path2.length);\n      }\n    }\n    static getFilename(path2) {\n      if (path2.lastIndexOf(\"/\") == -1) {\n        return path2;\n      } else {\n        const start = path2.lastIndexOf(\"/\") + 1;\n        return path2.substring(start, path2.length);\n      }\n    }\n    static getPath(path2) {\n      if (path2.lastIndexOf(\"/\") == -1) {\n        return \"\";\n      } else {\n        return path2.substring(0, path2.lastIndexOf(\"/\"));\n      }\n    }\n    static combine(first, second2) {\n      const seperator = first.lastIndexOf(\"/\") == first.length - 1;\n      if (second2.indexOf(\"/\") == 0) {\n        if (seperator) {\n          return first.substring(0, first.length - 1) + second2;\n        } else {\n          return first + second2;\n        }\n      } else {\n        if (seperator) {\n          return first + second2;\n        } else {\n          return first + \"/\" + second2;\n        }\n      }\n    }\n  }\n  class TextureHelper {\n    static create(gl, width2, height2, format2, type2, filter2, bytes, internalFormat = format2) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter2);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter2);\n      gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width2, height2, 0, format2, type2, bytes);\n      return texture;\n    }\n    static fromImage(gl, image2, mipmaps, filter2) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image2);\n      if (mipmaps && MathHelper.isPowerOf2(image2.width) && MathHelper.isPowerOf2(image2.height))\n        gl.generateMipmap(gl.TEXTURE_2D);\n      else {\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter2);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter2);\n      }\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      return texture;\n    }\n    static cubemapFromImages(gl, images) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n      const targets = [\n        gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n        gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n        gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n      ];\n      for (let i = 0; i < 6; i++) {\n        gl.texImage2D(targets[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, images[i]);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      }\n      gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n      gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n      return texture;\n    }\n  }\n  class Line extends LayoutBase {\n    layout(buffer, ids, fromIds, toIds, options) {\n      const start = window.performance.now();\n      const offset2 = options.offset === void 0 ? 0 : options.offset;\n      const count2 = options.count === void 0 ? ids.length : options.count;\n      const positionScalingX = options.positionScalingX === void 0 ? 1 : options.positionScalingX;\n      const positionScalingY = options.positionScalingY === void 0 ? 1 : options.positionScalingY;\n      const positionScalingZ = options.positionScalingZ === void 0 ? 1 : options.positionScalingZ;\n      const sizeScalingX = options.sizeScaling === void 0 ? options.sizeScalingX === void 0 ? 1 : options.sizeScalingX : options.sizeScaling;\n      const sizeScalingY = options.sizeScaling === void 0 ? options.sizeScalingY === void 0 ? 1 : options.sizeScalingY : options.sizeScaling;\n      const sizeScalingZ = options.sizeScaling === void 0 ? options.sizeScalingZ === void 0 ? 1 : options.sizeScalingZ : options.sizeScaling;\n      const minSize = options.minSize === void 0 ? 0 : options.minSize;\n      const offsetScaling = options.offsetScaling === void 0 ? 1 : options.offsetScaling;\n      if (!this._positions || this._positions.length < buffer.length * 3) {\n        this._positions = new Float32Array(buffer.length * 3);\n        this._sizes = new Float32Array(buffer.length * 3);\n        this._rotations = new Float32Array(buffer.length * 4);\n      }\n      this.minLayoutBoundsX = Number.MAX_VALUE;\n      this.minLayoutBoundsY = Number.MAX_VALUE;\n      this.minLayoutBoundsZ = Number.MAX_VALUE;\n      this.maxLayoutBoundsX = -Number.MAX_VALUE;\n      this.maxLayoutBoundsY = -Number.MAX_VALUE;\n      this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n      const _vec3 = create$3();\n      const _quat = create$1();\n      const direction = create$3();\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const fromId = fromIds[id2];\n        const toId = toIds[id2];\n        const index2 = lookup2[id2];\n        let toPositionX = options.positionsX ? options.positionsX[toId] * positionScalingX : 0;\n        let toPositionY = options.positionsY ? options.positionsY[toId] * positionScalingY : 0;\n        let toPositionZ = options.positionsZ ? options.positionsZ[toId] * positionScalingZ : 0;\n        let fromPositionX = options.positionsX ? options.positionsX[fromId] * positionScalingX : 0;\n        let fromPositionY = options.positionsY ? options.positionsY[fromId] * positionScalingY : 0;\n        let fromPositionZ = options.positionsZ ? options.positionsZ[fromId] * positionScalingZ : 0;\n        if (fromId == toId) {\n          this._sizes[index2 * 3] = 0;\n          this._sizes[index2 * 3 + 1] = 0;\n          this._sizes[index2 * 3 + 2] = 0;\n          this._rotations[index2 * 4] = 0;\n          this._rotations[index2 * 4 + 1] = 0;\n          this._rotations[index2 * 4 + 2] = 0;\n          this._rotations[index2 * 4 + 3] = 1;\n        } else {\n          direction[0] = toPositionX - fromPositionX;\n          direction[1] = toPositionY - fromPositionY;\n          direction[2] = toPositionZ - fromPositionZ;\n          let length$12 = length(direction);\n          scale(direction, direction, 1 / length$12);\n          rotationTo(_quat, this._core.config.identityRotation, direction);\n          this._rotations[index2 * 4] = _quat[0];\n          this._rotations[index2 * 4 + 1] = _quat[1];\n          this._rotations[index2 * 4 + 2] = _quat[2];\n          this._rotations[index2 * 4 + 3] = _quat[3];\n          if (options.offsets) {\n            const fromOffset = options.offsets[fromId] * offsetScaling / 2;\n            const toOffset = options.offsets[toId] * offsetScaling / 2;\n            toPositionX -= direction[0] * toOffset;\n            toPositionY -= direction[1] * toOffset;\n            toPositionZ -= direction[2] * toOffset;\n            fromPositionX += direction[0] * fromOffset;\n            fromPositionY += direction[1] * fromOffset;\n            fromPositionZ += direction[2] * fromOffset;\n            length$12 = Math.max(length$12 - toOffset - fromOffset, minSize);\n          }\n          this._sizes[index2 * 3 + 1] = Math.max(length$12 * sizeScalingY, minSize);\n          if (options.lineSizes) {\n            this._sizes[index2 * 3] = Math.max(options.lineSizes[id2] * sizeScalingX, minSize);\n            this._sizes[index2 * 3 + 2] = Math.max(options.lineSizes[id2] * sizeScalingZ, minSize);\n          } else if (options.endSizes) {\n            this._sizes[index2 * 3] = Math.max(options.endSizes[fromId] * sizeScalingX, minSize);\n            this._sizes[index2 * 3 + 2] = Math.max(options.endSizes[toId] * sizeScalingZ, minSize);\n          } else {\n            this._sizes[index2 * 3] = sizeScalingX;\n            this._sizes[index2 * 3 + 2] = sizeScalingZ;\n          }\n        }\n        _vec3[0] = (fromPositionX + toPositionX) / 2;\n        _vec3[1] = (fromPositionY + toPositionY) / 2;\n        _vec3[2] = (fromPositionZ + toPositionZ) / 2;\n        this._positions[index2 * 3] = _vec3[0];\n        this._positions[index2 * 3 + 1] = _vec3[1];\n        this._positions[index2 * 3 + 2] = _vec3[2];\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, fromPositionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, fromPositionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, fromPositionZ);\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, toPositionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, toPositionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, toPositionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, fromPositionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, fromPositionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, fromPositionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, toPositionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, toPositionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, toPositionZ);\n      }\n      this._updateCumulativeLayoutBounds();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, fromIds, toIds, options) {\n      const start = window.performance.now();\n      const offset2 = options.offset === void 0 ? 0 : options.offset;\n      const count2 = options.count === void 0 ? ids.length : options.count;\n      const dataView = buffer.dataView;\n      const _vec2 = create();\n      const _vec3 = create$3();\n      const _quat = create$1();\n      const endMinColor = options.endMinColor === void 0 ? 0 : options.endMinColor;\n      const endMaxColor = options.endMaxColor === void 0 ? 1 : options.endMaxColor;\n      const lineMinColor = options.lineMinColor === void 0 ? 0 : options.lineMinColor;\n      const lineMaxColor = options.lineMaxColor === void 0 ? 1 : options.lineMaxColor;\n      const minOrder = options.minOrder === void 0 ? 0 : options.minOrder;\n      const maxOrder = options.maxOrder === void 0 ? 1 : options.maxOrder;\n      const orderReverse = options.orderReverse === void 0 ? false : options.orderReverse;\n      const minStaggerOrder = options.minStaggerOrder === void 0 ? 0 : options.minStaggerOrder;\n      const maxStaggerOrder = options.maxStaggerOrder === void 0 ? 1 : options.maxStaggerOrder;\n      const staggerOrderReverse = options.staggerOrderReverse === void 0 ? false : options.staggerOrderReverse;\n      const reverseX = options.reverseX === void 0 ? false : options.reverseX;\n      const reverseY = options.reverseY === void 0 ? false : options.reverseY;\n      const reverseZ = options.reverseZ === void 0 ? false : options.reverseZ;\n      this._updateModelBounds(options);\n      const lookup2 = buffer.lookup;\n      const selection = options.selected && options.selected.size > 0;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const fromId = fromIds[id2];\n        const toId = toIds[id2];\n        const index2 = lookup2[id2];\n        let positionX = this._positions[index2 * 3];\n        let positionY = this._positions[index2 * 3 + 1];\n        let positionZ = this._positions[index2 * 3 + 2];\n        if (this._isFacetted) {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n          }\n          const facetX = options.facetCoordsX ? options.facetCoordsX[id2] : 0;\n          const facetY = options.facetCoordsY ? options.facetCoordsY[id2] : 0;\n          const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id2] : 0;\n          positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n          positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n          positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        } else {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n          }\n        }\n        _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n        _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n        _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n        UnitVertex.setTranslation(dataView, index2, _vec3);\n        _vec3[0] = this._sizes[index2 * 3] * this._boundsScaling;\n        _vec3[1] = this._sizes[index2 * 3 + 1] * this._boundsScaling;\n        _vec3[2] = this._sizes[index2 * 3 + 2] * this._boundsScaling;\n        UnitVertex.setScale(dataView, index2, _vec3);\n        _quat[0] = this._rotations[index2 * 4];\n        _quat[1] = this._rotations[index2 * 4 + 1];\n        _quat[2] = this._rotations[index2 * 4 + 2];\n        _quat[3] = this._rotations[index2 * 4 + 3];\n        if (reverseX) {\n          _quat[1] = -_quat[1];\n          _quat[2] = -_quat[2];\n        }\n        if (reverseY) {\n          _quat[0] = -_quat[0];\n          _quat[2] = -_quat[2];\n        }\n        if (reverseZ) {\n          _quat[0] = -_quat[0];\n          _quat[1] = -_quat[1];\n        }\n        UnitVertex.setRotation(dataView, index2, _quat);\n        let size2;\n        if (options.endColors) {\n          size2 = 1 / (endMaxColor - endMinColor + 1);\n          const fromColor = MathHelper.normalize(options.endColors[fromId], endMinColor, endMaxColor, size2 / 2, 1 - size2 / 2);\n          const toColor = MathHelper.normalize(options.endColors[toId], endMinColor, endMaxColor, size2 / 2, 1 - size2 / 2);\n          set(_vec2, fromColor, toColor);\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else if (options.lineColors) {\n          size2 = 1 / (lineMaxColor - lineMinColor + 1);\n          const color2 = MathHelper.normalize(options.lineColors[id2], lineMinColor, lineMaxColor, size2 / 2, 1 - size2 / 2);\n          set(_vec2, color2, color2);\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else {\n          UnitVertex.setColor(dataView, index2, Constants.VECTOR2_ONE);\n        }\n        UnitVertex.setIdHover(dataView, index2, options.hover ? options.hover[id2] : id2);\n        UnitVertex.setSelected(dataView, index2, selection ? options.selected.has(id2) ? 1 : -1 : 0);\n        if (options.order !== void 0) {\n          const order = MathHelper.normalize(options.order[id2], minOrder, maxOrder, 0, 1);\n          _vec2[0] = orderReverse ? 1 - order : order;\n        } else {\n          _vec2[0] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        if (options.staggerOrder !== void 0) {\n          _vec2[1] = options.staggerOrder;\n        } else if (options.staggerOrders) {\n          const stagger = MathHelper.normalize(options.staggerOrders[id2], minStaggerOrder, maxStaggerOrder, 0, 1);\n          _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n        } else {\n          _vec2[1] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        UnitVertex.setOrder(dataView, index2, _vec2);\n        UnitVertex.setMaterial(dataView, index2, options.material ? options.material : options.materials ? options.materials[id2] : 0);\n        UnitVertex.setRounding(dataView, index2, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id2] * this._boundsScaling : 0);\n        UnitVertex.setSdfBuffer(dataView, index2, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id2] : this._core.config.sdfBuffer);\n        UnitVertex.setSdfBorder(dataView, index2, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id2] : this._core.config.sdfBorder);\n        UnitVertex.setMatId(dataView, index2, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id2] : 0);\n        UnitVertex.setMatColor(dataView, index2, options.materialColor ? options.materialColor : options.materialColors ? [options.materialColors[id2 * 3], options.materialColors[id2 * 3 + 1], options.materialColors[id2 * 3 + 2]] : [0, 0, 0]);\n        UnitVertex.setMatFuzz(dataView, index2, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id2] : 0);\n        UnitVertex.setMatGloss(dataView, index2, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id2] : 0);\n        UnitVertex.setMatDensity(dataView, index2, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id2] : 0);\n        UnitVertex.setMatRefractiveIndex(dataView, index2, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id2] : 0);\n        UnitVertex.setSegColor(dataView, index2, options.segmentColor ? options.segmentColor : options.segmentColors ? [options.segmentColors[id2 * 4], options.segmentColors[id2 * 4 + 1], options.segmentColors[id2 * 4 + 2], options.segmentColors[id2 * 4 + 3]] : [buffer.idColors[id2 * 4], buffer.idColors[id2 * 4 + 1], buffer.idColors[id2 * 4 + 2], buffer.idColors[id2 * 4 + 3]]);\n      }\n      buffer.update();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  class AtlasBase {\n    get imageData() {\n      return this._imageData;\n    }\n    set imageData(value2) {\n      if (this._imageData != value2) {\n        this._imageData = value2;\n        this._changed = true;\n      }\n    }\n    constructor() {\n      this._imageData = null;\n    }\n    copyFrom(atlas) {\n      if (atlas.imageData) {\n        this._imageData = atlas.imageData;\n        this._changed = true;\n      } else {\n        this.imageData = null;\n      }\n    }\n    update() {\n    }\n  }\n  let Atlas$2 = class Atlas extends AtlasBase {\n  };\n  class BufferBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get ids() {\n      return this._ids;\n    }\n    get dataView() {\n      return this._dataView;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get lookup() {\n      return this._lookup;\n    }\n    get length() {\n      return this._length;\n    }\n    get selected() {\n      return this._selected;\n    }\n    constructor(core, ids) {\n      this._core = core;\n      this._ids = ids;\n      this._length = ids.length;\n      this._vertices = new ArrayBuffer(this._length * UnitVertex.SIZE_BYTES);\n      this._dataView = new DataView(this._vertices);\n      this._selected = /* @__PURE__ */ new Set();\n      this.from = 0;\n      this.to = 1;\n      this.unitType = UnitType.block;\n      this._lookup = {};\n      for (let i = 0; i < this._length; i++) {\n        const id2 = ids[i];\n        this._lookup[id2] = i;\n        UnitVertex.setRotation(this._dataView, i, Constants.QUAT_IDENTITY);\n      }\n    }\n    createShared() {\n      const buffer = Object.create(this);\n      buffer._vertices = new ArrayBuffer(buffer._vertices.byteLength);\n      buffer._dataView = new DataView(buffer._vertices);\n      return buffer;\n    }\n    copyFrom(buffer) {\n      const start = window.performance.now();\n      const fromDataView = buffer.dataView;\n      const toDataView = this._dataView;\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < this._length; i++) {\n        const index2 = lookup2[this._ids[i]];\n        if (index2 != null) {\n          UnitVertex.copyIdHover(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTranslation(fromDataView, index2, toDataView, i);\n          UnitVertex.copyScale(fromDataView, index2, toDataView, i);\n          UnitVertex.copyRotation(fromDataView, index2, toDataView, i);\n          UnitVertex.copyColor(fromDataView, index2, toDataView, i);\n          UnitVertex.copySelected(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMaterial(fromDataView, index2, toDataView, i);\n          UnitVertex.copyRounding(fromDataView, index2, toDataView, i);\n          UnitVertex.copyOrder(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTexCoord(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTexture(fromDataView, index2, toDataView, i);\n          UnitVertex.copySdfBuffer(fromDataView, index2, toDataView, i);\n          UnitVertex.copySdfBorder(fromDataView, index2, toDataView, i);\n          UnitVertex.copyParameter1(fromDataView, index2, toDataView, i);\n          UnitVertex.copyParameter2(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatId(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatColor(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatFuzz(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatRefractiveIndex(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatGloss(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatDensity(fromDataView, index2, toDataView, i);\n          UnitVertex.copySegColor(fromDataView, index2, toDataView, i);\n        } else {\n          UnitVertex.setRotation(toDataView, i, Constants.QUAT_IDENTITY);\n        }\n      }\n      this.unitType = buffer.unitType;\n      this._selected = buffer.selected;\n      this._core.log.write(LogLevel.info, `buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update() {\n    }\n    updateSelection(options) {\n      const start = window.performance.now();\n      const ids = options && options.ids ? options.ids : this._ids;\n      const offset2 = options && options.offset !== void 0 ? options.offset : 0;\n      const count2 = options && options.count !== void 0 ? options.count : ids.length;\n      const selection = this._selected.size > 0;\n      const dataView = this._dataView;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = this._lookup[id2];\n        UnitVertex.setSelected(dataView, index2, selection ? this._selected.has(id2) ? 1 : -1 : 0);\n      }\n      this.update();\n      this._core.log.write(LogLevel.info, `buffer update selection ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  class TransitionBufferBase {\n    get pickIdLookup() {\n      return this._pickIdLookup;\n    }\n    get currentBuffer() {\n      return this._isBuffer1Current ? this._buffer1 : this._buffer2;\n    }\n    get previousBuffer() {\n      return this._isBuffer1Current ? this._buffer2 : this._buffer1;\n    }\n    get currentPalette() {\n      return this._isBuffer1Current ? this._palette1 : this._palette2;\n    }\n    get previousPalette() {\n      return this._isBuffer1Current ? this._palette2 : this._palette1;\n    }\n    get currentAtlas() {\n      return this._isBuffer1Current ? this._atlas1 : this._atlas2;\n    }\n    get previousAtlas() {\n      return this._isBuffer1Current ? this._atlas2 : this._atlas1;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get length() {\n      return this._length;\n    }\n    constructor(core, ids, bufferType, paletteType, atlasType) {\n      this.bufferType = bufferType;\n      this.paletteType = paletteType;\n      this.atlasType = atlasType;\n      this._core = core;\n      this._length = ids.length;\n      this.id = TransitionBufferBase._id++;\n      this.isVisible = true;\n      this.transitionTime = 1;\n      this.activeId = -1;\n      const start = window.performance.now();\n      this._buffer1 = new bufferType(core, ids);\n      this._buffer2 = this._buffer1.createShared();\n      this._palette1 = new paletteType();\n      this._palette2 = new paletteType();\n      this._atlas1 = new atlasType();\n      this._atlas2 = new atlasType();\n      this.isPickingEnabled = true;\n      this._pickIdLookup = {};\n      const dataView1 = this._buffer1.dataView;\n      const dataView2 = this._buffer2.dataView;\n      const _vec4 = create$2();\n      this.idColors = new Float32Array(this._length * 4);\n      this._buffer1.idColors = this.idColors;\n      this._buffer2.idColors = this.idColors;\n      for (let i = 0; i < this._length; i++) {\n        const id2 = ids[i];\n        const pickId = PickHelper.nextPickId();\n        this._pickIdLookup[pickId] = id2;\n        PickHelper.encodeNumber(pickId, PickType.data, _vec4);\n        this.idColors[i * 4] = _vec4[0];\n        this.idColors[i * 4 + 1] = _vec4[1];\n        this.idColors[i * 4 + 2] = _vec4[2];\n        this.idColors[i * 4 + 3] = _vec4[3];\n        UnitVertex.setIdColor(dataView1, i, _vec4);\n        UnitVertex.setIdColor(dataView2, i, _vec4);\n      }\n      this._core.log.write(LogLevel.info, `transition buffer created ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    swap() {\n      this._isBuffer1Current = !this._isBuffer1Current;\n    }\n    copyFrom(transitionBuffer) {\n      const start = window.performance.now();\n      this.key = transitionBuffer.key;\n      this.isVisible = transitionBuffer.isVisible;\n      this.transitionTime = transitionBuffer.transitionTime;\n      this.isPickingEnabled = transitionBuffer.isPickingEnabled;\n      this.unitType = transitionBuffer.unitType;\n      this.activeId = transitionBuffer.activeId;\n      this.currentBuffer.copyFrom(transitionBuffer.currentBuffer);\n      this.previousBuffer.copyFrom(transitionBuffer.previousBuffer);\n      this.currentBuffer.update();\n      this.previousBuffer.update();\n      this.currentPalette.copyFrom(transitionBuffer.currentPalette);\n      this.previousPalette.copyFrom(transitionBuffer.previousPalette);\n      this.currentAtlas.copyFrom(transitionBuffer.currentAtlas);\n      this.previousAtlas.copyFrom(transitionBuffer.previousAtlas);\n      this._core.log.write(LogLevel.info, `transition buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  TransitionBufferBase._id = 1;\n  let Buffer$3 = class Buffer extends BufferBase {\n    constructor(core, ids) {\n      super(core, ids);\n    }\n  };\n  let TransitionBuffer$2 = class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$3, Palette$2, Atlas$2);\n    }\n  };\n  class DebugAxes {\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    initialize() {\n      let vertexOffset = 0;\n      let indexOffset = 0;\n      const axisVertices = Cube.POSITIONS;\n      const axisIndices2 = Cube.INDICES;\n      this._vertices = new ArrayBuffer(3 * PositionColorVertex.SIZE_BYTES * axisVertices.length / PositionVertex.SIZE);\n      const verticesView = new DataView(this._vertices);\n      this._indices = new Uint16Array(3 * axisIndices2.length + 4);\n      const vertexCount = axisVertices.length / PositionVertex.SIZE;\n      const indexCount = axisIndices2.length;\n      const transform2 = create$4();\n      const length2 = 1;\n      const width2 = 0.01;\n      transform2[0] = length2;\n      transform2[5] = width2;\n      transform2[10] = width2;\n      transform2[12] = 0.5;\n      transform2[13] = 0;\n      transform2[14] = 0;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants.VECTOR3_UNITX, transform2, vertexOffset, indexOffset);\n      indexOffset += indexCount;\n      this._indices[indexOffset++] = axisIndices2[indexCount - 1] + vertexOffset;\n      vertexOffset += vertexCount;\n      this._indices[indexOffset++] = axisIndices2[0] + vertexOffset;\n      transform2[0] = width2;\n      transform2[5] = length2;\n      transform2[10] = width2;\n      transform2[12] = 0;\n      transform2[13] = 0.5;\n      transform2[14] = 0;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants.VECTOR3_UNITY, transform2, vertexOffset, indexOffset);\n      indexOffset += indexCount;\n      this._indices[indexOffset++] = axisIndices2[indexCount - 1] + vertexOffset;\n      vertexOffset += vertexCount;\n      this._indices[indexOffset++] = axisIndices2[0] + vertexOffset;\n      transform2[0] = width2;\n      transform2[5] = width2;\n      transform2[10] = length2;\n      transform2[12] = 0;\n      transform2[13] = 0;\n      transform2[14] = 0.5;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants.VECTOR3_UNITZ, transform2, vertexOffset, indexOffset);\n      this._indexCount = this._indices.length;\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    _createAxis(axisVertices, axisIndices2, verticesView, indices, color2, transform2, vertexOffset, indexOffset) {\n      const position2 = create$3();\n      const vertexCount = axisVertices.length / PositionVertex.SIZE;\n      const indexCount = axisIndices2.length;\n      for (let i = 0; i < vertexCount; i++) {\n        set$3(position2, axisVertices[i * PositionVertex.SIZE], axisVertices[i * PositionVertex.SIZE + 1], axisVertices[i * PositionVertex.SIZE + 2]);\n        transformMat4$2(position2, position2, transform2);\n        PositionColorVertex.setPosition(verticesView, vertexOffset + i, position2);\n        PositionColorVertex.setColor(verticesView, vertexOffset + i, color2);\n      }\n      for (let i = 0; i < indexCount; i++) {\n        indices[indexOffset + i] = axisIndices2[i] + vertexOffset;\n      }\n    }\n  }\n  var __awaiter$3 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class RendererConfig {\n    reset() {\n    }\n  }\n  class RendererBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get config() {\n      return this._config;\n    }\n    get devicePixelRatio() {\n      return this._devicePixelRatio;\n    }\n    get width() {\n      return this._canvas.width;\n    }\n    set width(value2) {\n      this._options.width = value2;\n    }\n    get height() {\n      return this._canvas.height;\n    }\n    set height(value2) {\n      this._options.height = value2;\n    }\n    get webXRReferenceSpace() {\n      return this._webXRReferenceSpace;\n    }\n    get pickedType() {\n      return this._pickedType;\n    }\n    get pickedId() {\n      return this._pickedId;\n    }\n    get isCapturingPickImage() {\n      return this._isCapturingPickImage;\n    }\n    capturePickImage() {\n      this._isCapturingPickImage = true;\n    }\n    get backgroundColor() {\n      return this._backgroundColor;\n    }\n    set backgroundColor(value2) {\n      if (!exactEquals(value2, this._backgroundColor)) {\n        this._backgroundColor = value2;\n      }\n    }\n    get ambientColor() {\n      return this._ambientColor;\n    }\n    set ambientColor(value2) {\n      if (!exactEquals$1(value2, this._ambientColor)) {\n        this._ambientColor = value2;\n      }\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    swapAxes() {\n      this._isAxes1Current = !this._isAxes1Current;\n    }\n    createCartesian2dAxesVisual(axes) {\n      return new AxesVisual(axes);\n    }\n    createCartesian3dAxesVisual(axes) {\n      return new AxesVisual(axes);\n    }\n    _createDebugAxesVisual(debugAxes) {\n      return null;\n    }\n    createLabelSetVisual(labelSet) {\n      return new LabelSetVisual$2(labelSet);\n    }\n    createControllerVisual(controller) {\n      return new ControllerVisual$1(controller);\n    }\n    createTransitionBuffer(ids) {\n      return new TransitionBuffer$2(this._core, ids);\n    }\n    createImageVisual(image2) {\n      return new ImageVisual$2(image2);\n    }\n    createFontVisual(font2) {\n      return new FontVisual$2(font2);\n    }\n    constructor(options) {\n      this._options = options;\n      this.fonts = {};\n    }\n    get isWebXRSupported() {\n      return false;\n    }\n    initialize(core) {\n      this._core = core;\n      this._canvas = document.createElement(\"canvas\");\n      const contextmenu = this._options && this._options.contextmenu;\n      if (!contextmenu) {\n        this._canvas.addEventListener(\"contextmenu\", (e) => {\n          e.preventDefault();\n        });\n      }\n      this._canvas.tabIndex = this._core.container.tabIndex;\n      this._canvas.style.display = \"block\";\n      this._canvas.style.touchAction = \"none\";\n      this._core.container.appendChild(this._canvas);\n      this._mvMatrices = [create$4(), create$4()];\n      this.pickPMatrix = create$4();\n      this.axesVisibility = AxesVisibility.current;\n      this._debugAxes = new DebugAxes();\n      this._debugAxesVisual = this._createDebugAxesVisual(this._debugAxes);\n      this.transitionTime = 1;\n      this.transitionBuffers = [];\n      this.areLabelsVisible = true;\n      this.labelSets = [];\n      this.controllers = [];\n      this.areImagesVisible = true;\n      this.images = [];\n      this._viewports = [new DOMRect(), new DOMRect()];\n      this.isPickingEnabled = false;\n      this._pickedType = PickType.none;\n      this._pickedId = 0;\n      this._lassoMMatrix = create$4();\n      this._lassoThickness = create();\n      this._resizeMinimumDelay = -1;\n      this._previousResizeWidth = -1;\n      this._previousResizeHeight = -1;\n    }\n    remove() {\n      this._core.container.removeChild(this._canvas);\n    }\n    finalize() {\n      this._isInitialized = false;\n    }\n    setSize(elapsedTime) {\n      if (this._options && this._options.width && this._options.height) {\n        this._devicePixelRatio = 1;\n        this._resizeWidth = this._options.width;\n        this._resizeHeight = this._options.height;\n      } else {\n        this._devicePixelRatio = window.devicePixelRatio || 1;\n        this._resizeWidth = this._core.container.clientWidth * devicePixelRatio;\n        this._resizeHeight = this._core.container.clientHeight * devicePixelRatio;\n      }\n      if (this._resizeWidth != this._previousResizeWidth || this._resizeHeight != this._previousResizeHeight) {\n        this._previousResizeWidth = this._resizeWidth;\n        this._previousResizeHeight = this._resizeHeight;\n        this._isResizing = true;\n        this._resizeElapsedTime = elapsedTime;\n      }\n      if (this._isResizing) {\n        if (this._resizeElapsedTime > this._resizeMinimumDelay && this._isInitialized) {\n          this._isResizing = false;\n          this._resizeMinimumDelay = this._core.config.resizeMinimumDelay;\n          this._resize(this._resizeWidth, this._resizeHeight);\n        } else {\n          this._resizeElapsedTime += elapsedTime;\n        }\n      }\n    }\n    _resize(width2, height2) {\n      this._canvas.style.width = `${Math.floor(width2 / this._devicePixelRatio)}px`;\n      this._canvas.style.height = `${Math.floor(height2 / this._devicePixelRatio)}px`;\n      width2 = Math.floor(width2);\n      height2 = Math.floor(height2);\n      this._canvas.width = width2;\n      this._canvas.height = height2;\n    }\n    update(elapsedTime) {\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        if (transitionBuffer.isVisible) {\n          const previous = transitionBuffer.previousPalette;\n          const current = transitionBuffer.currentPalette;\n          if (previous) {\n            previous.update();\n          }\n          if (current) {\n            current.update();\n          }\n        }\n      }\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        if (transitionBuffer.isVisible) {\n          const previous = transitionBuffer.previousAtlas;\n          const current = transitionBuffer.currentAtlas;\n          if (previous) {\n            previous.update();\n          }\n          if (current) {\n            current.update();\n          }\n        }\n      }\n      if (this._core.config.isDebugVisible) {\n        if (this._debugAxesVisual) {\n          this._debugAxesVisual.mMatrix = this.mMatrix;\n          this._debugAxesVisual.vMatrices = this.vMatrices;\n          this._debugAxesVisual.pMatrices = this.pMatrices;\n          this._debugAxesVisual.viewports = this._viewports;\n          this._debugAxesVisual.viewportOffset = this._viewportOffset;\n          this._debugAxesVisual.viewportCount = this._viewportCount;\n        }\n      }\n      if (this.areLabelsVisible) {\n        for (let i = 0; i < this.labelSets.length; i++) {\n          const labelSetVisual = this.labelSets[i];\n          if (labelSetVisual.isVisible) {\n            this.labelSets[i].label.update(elapsedTime);\n            labelSetVisual.mMatrix = this.mMatrix;\n            labelSetVisual.vMatrices = this.vMatrices;\n            labelSetVisual.pMatrices = this.pMatrices;\n            labelSetVisual.isPickingEnabled = this.isPickingEnabled;\n            labelSetVisual.pickPMatrix = this.pickPMatrix;\n            labelSetVisual.pickVMatrix = this.pickVMatrix;\n            labelSetVisual.viewports = this._viewports;\n            labelSetVisual.viewportOffset = this._viewportOffset;\n            labelSetVisual.viewportCount = this._viewportCount;\n            labelSetVisual.update(elapsedTime);\n          }\n        }\n      }\n      if (this.areImagesVisible) {\n        for (let i = 0; i < this.images.length; i++) {\n          const imageVisual = this.images[i];\n          if (imageVisual && imageVisual.isVisible) {\n            const image2 = this.images[i].image;\n            image2.update(elapsedTime);\n            imageVisual.mMatrix = this.mMatrix;\n            imageVisual.vMatrices = this.vMatrices;\n            imageVisual.pMatrices = this.pMatrices;\n            imageVisual.isPickingEnabled = this.isPickingEnabled;\n            imageVisual.pickPMatrix = this.pickPMatrix;\n            imageVisual.pickVMatrix = this.pickVMatrix;\n            imageVisual.viewports = this._viewports;\n            imageVisual.viewportOffset = this._viewportOffset;\n            imageVisual.viewportCount = this._viewportCount;\n            imageVisual.update(elapsedTime);\n          }\n        }\n      }\n      for (let i = 0; i < this.controllers.length; i++) {\n        const controllerVisual = this.controllers[i];\n        if (controllerVisual.isVisible) {\n          const controller = this.controllers[i].controller;\n          controller.update(elapsedTime);\n          controllerVisual.vMatrices = this.vMatrices;\n          controllerVisual.inverseVMatrices = this.vMatrices;\n          controllerVisual.pMatrices = this.pMatrices;\n          controllerVisual.viewports = this._viewports;\n          controllerVisual.viewportOffset = this._viewportOffset;\n          controllerVisual.viewportCount = this._viewportCount;\n          controllerVisual.update(elapsedTime);\n        }\n      }\n      const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n      if (axesVisuals) {\n        for (let i = 0; i < axesVisuals.length; i++) {\n          const axesVisual = axesVisuals[i];\n          if (axesVisual.isVisible) {\n            const axes = axesVisual.axes;\n            axes.mMatrix = this.mMatrix;\n            axes.vMatrix = this.vMatrices[0];\n            axes.update(elapsedTime);\n            axesVisual.vMatrices = this.vMatrices;\n            axesVisual.pMatrices = this.pMatrices;\n            axesVisual.isPickingEnabled = this.isPickingEnabled;\n            axesVisual.pickPMatrix = this.pickPMatrix;\n            axesVisual.pickVMatrix = this.pickVMatrix;\n            axesVisual.viewports = this._viewports;\n            axesVisual.viewportOffset = this._viewportOffset;\n            axesVisual.viewportCount = this._viewportCount;\n            axesVisual.update(elapsedTime);\n          }\n        }\n      }\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        const font2 = fontVisual.font;\n        font2.update();\n        fontVisual.update();\n      }\n    }\n    getVertexPosition(position2, pickedId) {\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        const id2 = transitionBuffer.pickIdLookup[pickedId];\n        if (id2 > -1) {\n          const index2 = transitionBuffer.currentBuffer.lookup[id2];\n          const dataView = transitionBuffer.currentBuffer.dataView;\n          UnitVertex.getTranslation(dataView, index2, position2);\n          break;\n        }\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$3(this, void 0, void 0, function* () {\n      });\n    }\n    prepare(xrFrame) {\n    }\n    initializeWebXR(session) {\n      return null;\n    }\n  }\n  let Quad$1 = class Quad {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const _vec3 = fromValues$3(2, 2, 2);\n      const _mat4 = create$4();\n      fromScaling(_mat4, _vec3);\n      const vertices = Quad$2.positions(_mat4);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$2.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  let Atlas$1 = class Atlas extends AtlasBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([255, 255, 255, 255]));\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._imageData) {\n        this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Palette$1 = class Palette extends PaletteBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._colors) {\n        const colors2 = new Uint8Array(this._colors);\n        for (let i = 0; i < colors2.length; i++) {\n          colors2[i] = Math.pow(colors2[i] / 255, 2.2) * 255;\n        }\n        this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors2);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Buffer$2 = class Buffer extends BufferBase {\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update() {\n      if (this._isInitialized) {\n        const start = window.performance.now();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n        this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n      }\n    }\n  };\n  let TransitionBuffer$1 = class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$2, Palette$1, Atlas$1);\n    }\n    initializeContext(gl) {\n      this._buffer1.initializeContext(gl);\n      this._buffer2.initializeContext(gl);\n      this._palette1.initializeContext(this._core, gl);\n      this._palette2.initializeContext(this._core, gl);\n      this._atlas1.initializeContext(this._core, gl);\n      this._atlas2.initializeContext(this._core, gl);\n      this._isInitialized = true;\n    }\n  };\n  let Config$1 = class Config extends RendererConfig {\n    constructor() {\n      super();\n      this.reset();\n    }\n    reset() {\n      this.specularIntensity = 0.15;\n      this.specularPower = 150;\n      this.lightPosition = fromValues$3(-0.5, 0.5, 0);\n      this.ambient = 0.01;\n      const _quat1 = create$1();\n      const _quat2 = create$1();\n      let angle2 = AngleHelper.degreesToRadians(15);\n      setAxisAngle(_quat1, Constants.VECTOR3_UNITX, angle2);\n      multiply(_quat2, _quat1, _quat2);\n      angle2 = AngleHelper.degreesToRadians(-15);\n      setAxisAngle(_quat1, Constants.VECTOR3_UNITY, angle2);\n      multiply(_quat2, _quat2, _quat1);\n      this.directionToLight = create$3();\n      transformQuat(this.directionToLight, Constants.VECTOR3_UNITZ, _quat2);\n      this.halfAngle = create$3();\n      add(this.halfAngle, Constants.VECTOR3_UNITZ, this.directionToLight);\n      normalize$2(this.halfAngle, this.halfAngle);\n      this.isFxaaEnabled = false;\n    }\n  };\n  let Resources$1 = class Resources {\n    bindFramebuffer(framebuffer) {\n      if (this.framebuffer != framebuffer) {\n        this.framebuffer = framebuffer;\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n      }\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this.framebuffer = this._gl.createFramebuffer();\n      this.ANGLE_instanced_arrays = gl.getExtension(\"ANGLE_instanced_arrays\");\n      this.OES_standard_derivatives = gl.getExtension(\"OES_standard_derivatives\");\n      this.EXT_frag_depth = gl.getExtension(\"EXT_frag_depth\");\n      this.OES_element_index_uint = gl.getExtension(\"OES_element_index_uint\");\n      this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n  };\n  Resources$1.glsl = {\n    \"anaglyph.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nconst vec3 LEFT_MASK = vec3(1.0, 0.0, 0.0);\\nconst vec3 RIGHT_MASK = vec3(0.0, 1.0, 1.0);\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 color = LEFT_MASK * dot(texture2D(uSampler1, texCoords).rgb, LUMINANCE);\\ncolor += RIGHT_MASK * dot(texture2D(uSampler2, texCoords).rgb, LUMINANCE);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n',\n    \"color.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec3 vColor;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(vColor, GAMMA), 1.0);\\n}\\n',\n    \"color.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec3 aColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying lowp vec3 vColor;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvColor = aColor;\\n}\\n\",\n    \"lasso.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\ngl_FragColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n',\n    \"lasso.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"model.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform sampler2D uSampler;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(texture2D(uSampler, vTexCoord).xyz, GAMMA), 1.0);\\nvec3 color = texture2D(uSampler, vTexCoord).xyz;\\nfloat ambient = 0.01;\\nvec3 normal = normalize(vNormal);\\nfloat diffuse = 0.5 * max(dot(uDirectionToLight, normal), 0.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (ambient + diffuse);\\ncolor += specular;\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n',\n    \"model.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nvTexCoord = aTexCoord;\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(aNormal, 0.0));\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\n}\\n\",\n    \"pickgrid.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#define Derivatives\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nuniform vec3 uDirectionToLight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick)\\n{\\ngl_FragColor = vColor;\\n}\\nelse\\n{\\nvec2 buffer;\\n#ifdef Derivatives\\nbuffer = fwidth(vTexCoord);\\n#else\\nbuffer = vec2(0.002);\\n#endif\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nfloat diffuse = 0.2 * max(dot(uDirectionToLight, vNormal), 0.0);\\nfloat ambient = 0.8;\\ncolor.xyz *= (ambient + diffuse);\\ncolor.xyz = pow(color.xyz, GAMMA);\\ngl_FragColor = color;\\n}\\n}\\n',\n    \"pickgrid.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec4 aIdColor;\\nattribute mediump vec2 aTexCoord;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#define Derivatives\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse {\\nfloat distance = texture2D(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\ngl_FragColor = vec4(pow(mix(uBorderColor, mix(uColor, uHoverColor, vHover), value), GAMMA), 1.0);\\n}\\n}\\n',\n    \"sdftext.vertex.fx\": \"#version 100\\nattribute lowp vec4 aIdColor;\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nif (uPick) {\\ngl_FragColor = vec4(0.0);\\n}\\nelse {\\ngl_FragColor = vec4(texture2D(uSampler, vTexCoord).xyz, 1.0);\\n}\\n}\\n\",\n    \"texture.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": '#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void)\\n{\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n',\n    \"unitblock.vertex.fx\": '#version 100\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitcylinder.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - sqrt(h1);\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - sqrt(h2);\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unitcylinder.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unithexprism.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform mat4 uVMatrix;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nvec4 iHexPrism( in vec3 ro, in vec3 rd, in float ra, in float he )\\n{\\nconst vec3 n1 = vec3( 1.0,0.0,0.0);\\nconst vec3 n2 = vec3( 0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n3 = vec3(-0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n4 = vec3( 0.0,1.0,0.0);\\nvec3 t1 = vec3((vec2(ra,-ra)-dot(ro,n1))/dot(rd,n1), 1.0);\\nvec3 t2 = vec3((vec2(ra,-ra)-dot(ro,n2))/dot(rd,n2), 1.0);\\nvec3 t3 = vec3((vec2(ra,-ra)-dot(ro,n3))/dot(rd,n3), 1.0);\\nvec3 t4 = vec3((vec2(he,-he)-dot(ro,n4))/dot(rd,n4), 1.0);\\nif( t1.y<t1.x ) t1=vec3(t1.yx,-1.0);\\nif( t2.y<t2.x ) t2=vec3(t2.yx,-1.0);\\nif( t3.y<t3.x ) t3=vec3(t3.yx,-1.0);\\nif( t4.y<t4.x ) t4=vec3(t4.yx,-1.0);\\nvec4 tN=vec4(t1.x,t1.z*n1);\\nif( t2.x>tN.x ) tN=vec4(t2.x,t2.z*n2);\\nif( t3.x>tN.x ) tN=vec4(t3.x,t3.z*n3);\\nif( t4.x>tN.x ) tN=vec4(t4.x,t4.z*n4);\\nfloat tF = min(min(t1.y,t2.y),min(t3.y,t4.y));\\nif( tN.x>tF || tF<0.0) return vec4(-1.0);\\nreturn tN;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = -vViewCenter;\\nmat3 rot = mat3(uVMatrix);\\nvec3 rdd = rd * rot;\\nvec3 roo = ro * rot;\\nvec4 tnor = iHexPrism(roo, rdd, vRadius * vScaling, vHeight * vScaling);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = rot * tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unithexprism.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvRadius = 0.0;\\nvHeight = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvRadius = scale.x * ROOT_THREE_OVER_TWO;\\nvHeight = scale.y;\\nvec3 position = aPosition;\\nposition.y *= scale.y;\\nposition.z *= scale.x;\\nposition.x *= scale.x * ROOT_THREE_OVER_TWO;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvScaling = length(uMMatrix[0].xyz) / 2.0;\\n}\\n}\\n',\n    \"unitsdf.fragment.fx\": '#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform vec3\t uBackgroundColor;\\nuniform float \t uBuffer;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nfloat distance = mix(texture2D(uPreviousSampler1, vPreviousTexCoord).r, texture2D(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer) {\\ndiscard;\\n}\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\nfloat uGamma = 0.0;\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer + gamma, uBuffer, distance);\\ngl_FragColor = vec4(mix(color, uBackgroundColor, value), 1.0);\\n}\\n}\\n',\n    \"unitsdf.vertex.fx\": '#version 100\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute mediump vec4 aTexCoord;\\nattribute mediump vec4 aPreviousTexCoord;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n',\n    \"unitsphere.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat sphIntersect(in vec3 ro, in vec3 rd, in vec4 sph)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot(oc, rd);\\nfloat c = dot(oc, oc) - sph.w * sph.w;\\nfloat h = b * b - c;\\nif (h < 0.0) return -1.0;\\nreturn -b - sqrt(h);\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unitsphere.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute lowp float aColor;\\nattribute lowp float aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump float vRadius;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec4 translation = vec4(mix(aPreviousTranslation, aTranslation, animation), 1.0);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * translation).xyz;\\ntranslation.xyz += aPosition * scale;\\nvViewPosition = (mvMatrix * translation).xyz;\\ngl_Position = uPMatrix * vec4(vViewPosition, 1.0);\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n',\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nmat3 transpose(in mat3 mat) {\\nvec3 i0 = mat[0];\\nvec3 i1 = mat[1];\\nvec3 i2 = mat[2];\\nreturn mat3\\n(\\nvec3(i0.x, i1.x, i2.x),\\nvec3(i0.y, i1.y, i2.y),\\nvec3(i0.z, i1.z, i2.z)\\n);\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n  };\n  let ShaderBase$1 = class ShaderBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    set vertexBuffer(value2) {\n      if (this._vertexBuffer != value2) {\n        this._vertexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    set indexBuffer(value2) {\n      if (this._indexBuffer != value2) {\n        this._indexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    constructor(core, main) {\n      this._core = core;\n      this._main = main;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n      const program = this._gl.createProgram();\n      this._gl.attachShader(program, vs);\n      this._gl.attachShader(program, fs);\n      this._gl.linkProgram(program);\n      if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n      }\n      return program;\n    }\n    _compileShader(source2, type2) {\n      const shader = this._gl.createShader(type2);\n      this._gl.shaderSource(shader, source2);\n      this._gl.compileShader(shader);\n      if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n      }\n      return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n      const remove2 = `#define ${directive}`;\n      const index2 = shaderSource.indexOf(remove2);\n      shaderSource = index2 == -1 ? shaderSource : shaderSource.substring(0, index2) + shaderSource.substring(index2 + remove2.length);\n      return shaderSource;\n    }\n    prepare() {\n      if (this._program != this._main.shaderResources.currentProgram) {\n        if (this._main.shaderResources.currentShader) {\n          this._main.shaderResources.currentShader.disableProgram();\n        }\n        this.enableProgram(this._program);\n        this.updateBuffers();\n        this.updateTextures();\n      } else {\n        if (this._haveBuffersChanged) {\n          this.updateBuffers();\n        }\n        if (this._haveTexturesChanged) {\n          this.updateTextures();\n        }\n      }\n    }\n    apply() {\n    }\n    applyModel() {\n    }\n    applyView() {\n    }\n    enableProgram(program) {\n      this._gl.useProgram(program);\n      this._main.shaderResources.currentProgram = program;\n      this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n      this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n      this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n      this._main.shaderResources.currentShader = null;\n      this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n      callback(this._includesFromFile(Resources$1.glsl[vsName]), this._includesFromFile(Resources$1.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n      this._sourceFromUrl(vsName, (vsSource) => {\n        this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n          this._sourceFromUrl(fsName, (fsSource) => {\n            this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n              callback(vsIncSource, fsIncSource);\n            });\n          });\n        });\n      });\n    }\n    _sourceFromUrl(url, callback) {\n      const request2 = new XMLHttpRequest();\n      request2.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n      request2.onreadystatechange = () => {\n        if (request2.readyState == XMLHttpRequest.DONE && request2.status == 200) {\n          callback(request2.responseText);\n        }\n      };\n      request2.send();\n    }\n    _includesFromFile(source2) {\n      let index2 = 0;\n      do {\n        index2 = source2.indexOf(\"#include\", index2);\n        if (index2 != -1) {\n          const start = source2.indexOf('\"', index2);\n          const end = source2.indexOf('\"', start + 1);\n          const name = source2.substring(start + 1, end);\n          const inc = Resources$1.glsl[name];\n          source2 = source2.substring(0, index2) + inc + source2.substring(end + 1);\n        }\n      } while (index2 != -1);\n      return source2;\n    }\n    _includesFromUrl(source2, index2, callback) {\n      index2 = source2.indexOf(\"#include\", index2);\n      if (index2 != -1) {\n        const start = source2.indexOf('\"', index2);\n        const end = source2.indexOf('\"', start + 1);\n        const name = source2.substring(start + 1, end);\n        this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n          source2 = source2.substring(0, index2) + include + source2.substring(end + 1);\n          this._includesFromUrl(source2, index2, callback);\n        });\n      } else {\n        callback(source2);\n      }\n    }\n  };\n  class Color extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"color.vertex.fx\", \"color.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionColorVertex.SIZE_BYTES, PositionColorVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 3, this._gl.UNSIGNED_BYTE, true, PositionColorVertex.SIZE_BYTES, PositionColorVertex.COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  }\n  let Texture$1 = class Texture extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  };\n  let Lasso$3 = class Lasso extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n      this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  class Model extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"model.vertex.fx\", \"model.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n    }\n    applyView() {\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  let SdfText$1 = class SdfText extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n      this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n      this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n      this._gl.uniform1f(this._gammaUniform, this.gamma);\n      this._gl.uniform1f(this._bufferUniform, this.buffer);\n      this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  };\n  let PickGrid$1 = class PickGrid extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n      this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n      this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n      this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n      this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n      this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n      this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n      this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n      this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n      this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n      this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n      this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n      this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n      this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n      this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n      this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n      this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n      this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n      this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n      this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n      this._gl.uniform2fv(this._zeroUniform, this.zero);\n      this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._boundsAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  let UnitShader$1 = class UnitShader extends ShaderBase$1 {\n    get paletteTexture() {\n      return this._paletteTexture;\n    }\n    set paletteTexture(value2) {\n      if (this._paletteTexture != value2) {\n        this._paletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousPaletteTexture() {\n      return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value2) {\n      if (this._previousPaletteTexture != value2) {\n        this._previousPaletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get sdfTexture() {\n      return this._sdfTexture;\n    }\n    set sdfTexture(value2) {\n      if (this._sdfTexture != value2) {\n        this._sdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousSdfTexture() {\n      return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value2) {\n      if (this._previousSdfTexture != value2) {\n        this._previousSdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    set instanceBuffer(value2) {\n      if (this._instanceBuffer != value2) {\n        this._instanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    set previousInstanceBuffer(value2) {\n      if (this._previousInstanceBuffer != value2) {\n        this._previousInstanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    initializeData() {\n      this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n      this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n      this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n      this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n      this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n      this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n      this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n      this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n      this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n      this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n      this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n      this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n      this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._ambientUniform = gl.getUniformLocation(this._program, \"uAmbient\");\n      this._activeColorUniform = gl.getUniformLocation(this._program, \"uActiveColor\");\n      this._selectedColorUniform = gl.getUniformLocation(this._program, \"uSelectedColor\");\n      this._highlightModeUniform = gl.getUniformLocation(this._program, \"uHighlightMode\");\n      const vertices = Cube.POSITIONS;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Cube.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this.indexCount = indices.length;\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._updateCurrentBuffer();\n      this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n      this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._translationAttribute);\n      this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._scaleAttribute);\n      this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._selectedAttribute);\n      this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 1);\n      this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      if (this._previousInstanceBuffer != this._instanceBuffer) {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n      }\n      this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n      this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n      this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1f(this._timeUniform, this.time);\n      this._gl.uniform1f(this._durationUniform, this.duration);\n      this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n      this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n      this._gl.uniform1i(this._previousSampler0Uniform, 0);\n      this._gl.uniform1i(this._sampler0Uniform, 1);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n      this._gl.uniform1f(this._ambientUniform, this.ambient);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._activeColorUniform, this.activeColor);\n      this._gl.uniform3fv(this._selectedColorUniform, this.selectedColor);\n      this._gl.uniform1f(this._hoverUniform, this.hover);\n      this._gl.uniform1f(this._activeUniform, this.active);\n      this._gl.uniform1f(this._highlightModeUniform, this.highlightMode == HighlightMode.luminance ? 0 : 1);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n    }\n    updateTextures() {\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 0);\n    }\n  };\n  let UnitBlock$1 = class UnitBlock extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            vsSource = this._removeDirective(vsSource, \"Derivatives\");\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  };\n  let UnitSphere$1 = class UnitSphere extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n  };\n  let UnitCylinder$1 = class UnitCylinder extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  };\n  class UnitHexPrism extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unithexprism.vertex.fx\", \"unithexprism.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  }\n  let UnitSdf$1 = class UnitSdf extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            vsSource = this._removeDirective(vsSource, \"Derivatives\");\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n      this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n      this._sdfBufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._sdfBackgroundColorUniform = gl.getUniformLocation(this._program, \"uBackgroundColor\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n      super.apply();\n      this._gl.uniform1i(this._previousSampler1Uniform, 2);\n      this._gl.uniform1i(this._sampler1Uniform, 3);\n      this._gl.uniform1f(this._sdfBufferUniform, this.sdfBuffer);\n      this._gl.uniform3fv(this._sdfBackgroundColorUniform, this.sdfBackgroundColor);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 0);\n    }\n  };\n  class Anaglyph extends ShaderBase$1 {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"anaglyph.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n    }\n  }\n  class DebugAxesVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.colorShader.isInitialized;\n    }\n    constructor(core, main, debugAxes) {\n      this._main = main;\n      this._debugAxes = debugAxes;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._debugAxes.isInitialized) {\n        this._debugAxes.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._debugAxes.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._debugAxes.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const colorShader = this._main.colorShader;\n        const shaderResources = this._main.shaderResources;\n        colorShader.vertexBuffer = this._vertexBuffer;\n        colorShader.indexBuffer = this._indexBuffer;\n        colorShader.prepare();\n        colorShader.mMatrix = this.mMatrix;\n        colorShader.apply();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          colorShader.vMatrix = this.vMatrices[viewport];\n          colorShader.pMatrix = this.pMatrices[viewport];\n          colorShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._debugAxes.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  }\n  let AxesVisualBase$1 = class AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get axes() {\n      return this._axes;\n    }\n    constructor(core) {\n      this._core = core;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._renderGrid();\n        this._renderText();\n      }\n    }\n    _renderGrid() {\n    }\n    _renderText() {\n    }\n  };\n  let Cartesian2dVisual$1 = class Cartesian2dVisual extends AxesVisualBase$1 {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian2dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 2; edge++) {\n          const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n          if (axes.isEdgeVisible[edgeId]) {\n            if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n              indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n              indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n            } else {\n              indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n              indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n            }\n            if (indexCount > 0) {\n              shader.mMatrix = axes.getLabelMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n            indexCount = axes.getTitleIndexCount(axisId);\n            if (indexCount > 0) {\n              indexOffset = axes.getTitleIndexOffset(axisId);\n              shader.mMatrix = axes.getTitleMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n          indexCount = axes.getHeadingIndexCount(axisId);\n          if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n            indexOffset = axes.getHeadingIndexOffset(axisId);\n            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n            shader.applyModel();\n            shader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n              const viewport = i + this.viewportOffset;\n              shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n              this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n              shader.vMatrix = this.vMatrices[viewport];\n              shader.pMatrix = this.pMatrices[viewport];\n              shader.applyView();\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n              shader.isPickShader = true;\n              shader.pMatrix = this.pickPMatrix;\n              shader.vMatrix = this.pickVMatrix;\n              shader.applyView();\n              shaderResources.bindFramebuffer(this.pickFramebuffer);\n              this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.directionToLight = Constants.VECTOR3_UNITZ;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width3 = gridTicksScale[0];\n          const height3 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n            if (axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width3, height3);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size2 = axes.size;\n      const axisId2 = 0;\n      const axisId3 = 1;\n      const width2 = size2[axisId2];\n      const height2 = size2[axisId3];\n      gridShader.zero = axes.gridFaceZero;\n      gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n      for (let face = 0; face < 2; face++) {\n        const faceId = face;\n        if (axes.getIsForwardFace(faceId)) {\n          this._renderGridFace(faceId, width2, height2);\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, this._axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, this._axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  };\n  let Cartesian3dVisual$1 = class Cartesian3dVisual extends AxesVisualBase$1 {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian3dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 4; edge++) {\n          const edgeId = Cube.AXIS_EDGES[axisId][edge];\n          if (axes.getIsOutsideEdge(edgeId)) {\n            if (axes.isEdgeVisible[edgeId]) {\n              if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n              } else {\n                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n              }\n              if (indexCount > 0) {\n                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n              indexCount = axes.getTitleIndexCount(axisId);\n              if (indexCount > 0) {\n                indexOffset = axes.getTitleIndexOffset(axisId);\n                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n            }\n            indexCount = axes.getHeadingIndexCount(axisId);\n            if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n              indexOffset = axes.getHeadingIndexOffset(axisId);\n              shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.directionToLight = Constants.VECTOR3_UNITZ;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width2 = gridTicksScale[0];\n          const height2 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size2 = axes.size;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.areFacesVisible[axisId]) {\n          const axisId2 = axisId == 0 ? 1 : 0;\n          const axisId3 = axisId == 2 ? 1 : 2;\n          const width2 = size2[axisId2];\n          const height2 = size2[axisId3];\n          gridShader.zero = axes.getGridFaceZero(axisId);\n          gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n          for (let face = 0; face < 2; face++) {\n            const faceId = Cube.AXIS_FACES[axisId][face];\n            if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n              this._renderGridFace(faceId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  };\n  class ControllerVisual {\n    get isInitialized() {\n      return this._isInitialized && this._modelShader.isInitialized && this._colorShader.isInitialized;\n    }\n    get controller() {\n      return this._controller;\n    }\n    constructor(core, main, controller) {\n      this._core = core;\n      this._main = main;\n      this._mMatrix = create$4();\n      this._vec3 = create$3();\n      this._controller = controller;\n      this._modelShader = main.modelShader;\n      this._colorShader = main.colorShader;\n      this.mMatrix = create$4();\n      this.rayMMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._controller.isInitialized) {\n        this._controller.initialize();\n      }\n      this._initialize(gl);\n    }\n    _initialize(gl) {\n      this._gl = gl;\n      this.modelTexture = TextureHelper.fromImage(gl, this._controller.texture, false, gl.LINEAR);\n      this._modelVertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._modelVertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._controller.vertices, gl.STATIC_DRAW);\n      this._modelIndexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._modelIndexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.indices, gl.STATIC_DRAW);\n      this._rayVertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._rayVertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._controller.rayVertices, gl.STATIC_DRAW);\n      this._rayIndexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._rayIndexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.rayIndices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._modelShader.vertexBuffer = this._modelVertexBuffer;\n        this._modelShader.indexBuffer = this._modelIndexBuffer;\n        this._modelShader.texture2D = this.modelTexture;\n        this._modelShader.prepare();\n        multiply$2(this._mMatrix, this._controller.useRayPose ? this.rayMMatrix : this.mMatrix, this._controller.mMatrix);\n        this._modelShader.mMatrix = this._mMatrix;\n        this._modelShader.specularPower = 10;\n        this._modelShader.specularIntensity = 0.01;\n        this._modelShader.apply();\n        this._modelShader.applyModel();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          this._modelShader.directionToLight = Constants.VECTOR3_UNITZ;\n          this._modelShader.halfAngle = Constants.VECTOR3_UNITZ;\n          this._modelShader.vMatrix = this.vMatrices[viewport];\n          this._modelShader.pMatrix = this.pMatrices[viewport];\n          this._modelShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._controller.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this.isRayVisible) {\n          this._colorShader.vertexBuffer = this._rayVertexBuffer;\n          this._colorShader.indexBuffer = this._rayIndexBuffer;\n          this._colorShader.prepare();\n          multiply$2(this._mMatrix, this.rayMMatrix, this._controller.rayMMatrix);\n          this._colorShader.mMatrix = this._mMatrix;\n          this._colorShader.apply();\n          this._colorShader.applyModel();\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            this._colorShader.vMatrix = this.vMatrices[viewport];\n            this._colorShader.pMatrix = this.pMatrices[viewport];\n            this._colorShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._controller.rayIndexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      }\n    }\n  }\n  let ImageVisual$1 = class ImageVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n      return this._image;\n    }\n    constructor(core, main, image2) {\n      this._core = core;\n      this._main = main;\n      this._image = image2;\n      this._image.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this.mMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._image.isInitialized) {\n        this._image.initialize();\n      }\n      this._gl = gl;\n      if (this._image.imageData) {\n        this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n      }\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const textureShader = this._main.textureShader;\n        const shaderResources = this._main.shaderResources;\n        textureShader.vertexBuffer = this._vertexBuffer;\n        textureShader.indexBuffer = this._indexBuffer;\n        textureShader.texture2D = this.texture;\n        textureShader.prepare();\n        textureShader.mMatrix = this.mMatrix;\n        textureShader.isPickShader = false;\n        textureShader.apply();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          textureShader.vMatrix = this.vMatrices[viewport];\n          textureShader.pMatrix = this.pMatrices[viewport];\n          textureShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this.isPickingEnabled) {\n          textureShader.isPickShader = true;\n          textureShader.vMatrix = this.pickVMatrix;\n          textureShader.pMatrix = this.pickPMatrix;\n          textureShader.applyView();\n          shaderResources.bindFramebuffer(this.pickFramebuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  };\n  let LabelVisualBase$1 = class LabelVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label2) {\n      this._core = core;\n      this._main = main;\n      this._label = label2;\n      this._label.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this._mMatrix = create$4();\n      this.mMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._label.isInitialized) {\n        this._label.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const indexCount = this._label.indexCount;\n        if (indexCount > 0) {\n          const shader = this._main.sdfTextShader;\n          const fontVisual = this._main.fonts[this._label.font.name];\n          shader.vertexBuffer = this._vertexBuffer;\n          shader.indexBuffer = this._indexBuffer;\n          shader.texture2D = fontVisual.texture;\n          shader.prepare();\n          shader.gamma = this._label.gamma;\n          shader.buffer = fontVisual.font.edgeValue / 255;\n          shader.borderWidth = this._label.borderWidth;\n          shader.color = this._label.color || this._core.config.textColor;\n          shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n          shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n          shader.pickedIdColor = this.pickedIdColor;\n          shader.apply();\n          multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n          shader.mMatrix = this._mMatrix;\n          shader.applyModel();\n          shader.isPickShader = false;\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            shader.vMatrix = this.vMatrices[viewport];\n            shader.pMatrix = this.pMatrices[viewport];\n            shader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n          }\n          if (this.isPickingEnabled) {\n            shader.isPickShader = true;\n            shader.pMatrix = this.pickPMatrix;\n            shader.vMatrix = this.pickVMatrix;\n            shader.applyView();\n            this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n          }\n        }\n      }\n    }\n  };\n  let LabelVisual$1 = class LabelVisual extends LabelVisualBase$1 {\n    get label() {\n      return this._label;\n    }\n    set text(value2) {\n      this._label.text = value2;\n    }\n    get text() {\n      return this._label.text;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  };\n  let LabelSetVisual$1 = class LabelSetVisual extends LabelVisualBase$1 {\n    get label() {\n      return this._label;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  };\n  let FontVisual$1 = class FontVisual {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get font() {\n      return this._font;\n    }\n    constructor(core, font2) {\n      this._core = core;\n      this._font = font2;\n      font2.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._isInitialized = true;\n      if (this._font.count > 0) {\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n        this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n      }\n    }\n  };\n  let Lasso$2 = class Lasso {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const vertices = Quad$2.textured(Constants.MAT4_IDENTITY);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$2.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  var __awaiter$2 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  let Main$1 = class Main extends RendererBase {\n    get shaderResources() {\n      return this._shaderResources;\n    }\n    get colorShader() {\n      return this._colorShader;\n    }\n    get textureShader() {\n      return this._textureShader;\n    }\n    get lassoShader() {\n      return this._lassoShader;\n    }\n    get modelShader() {\n      return this._modelShader;\n    }\n    get sdfTextShader() {\n      return this._sdfTextShader;\n    }\n    get gridShader() {\n      return this._gridShader;\n    }\n    get blockShader() {\n      return this._blockShader;\n    }\n    get sphereShader() {\n      return this._sphereShader;\n    }\n    get cyclinderShader() {\n      return this._cylinderShader;\n    }\n    get hexPrismShader() {\n      return this._hexPrismShader;\n    }\n    get sdfShader() {\n      return this._sdfShader;\n    }\n    get anaglyphShader() {\n      return this._anaglyphShader;\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    get config() {\n      return this._config;\n    }\n    constructor(options) {\n      super(options);\n      this._config = new Config$1();\n      this._quad = new Quad$1();\n      this._lasso = new Lasso$2();\n      this._pickedPixels = new Uint8Array(4);\n      this._pickedIdColor = create$2();\n      this._mat3 = create$5();\n      this._directionToCamera = create$3();\n      this._directionToLight = create$3();\n      this._halfAngle = create$3();\n      this._cameraPosition = create$3();\n      this._modelPosition = create$3();\n      this.depthEnabled = true;\n    }\n    get isSupported() {\n      return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    get isWebXRSupported() {\n      return true;\n    }\n    initialize(core) {\n      super.initialize(core);\n      this._shaderResources = new Resources$1();\n      this._colorShader = new Color(this._core, this);\n      this._textureShader = new Texture$1(this._core, this);\n      this._lassoShader = new Lasso$3(this._core, this);\n      this._modelShader = new Model(this._core, this);\n      this._sdfTextShader = new SdfText$1(this._core, this);\n      this._gridShader = new PickGrid$1(this._core, this);\n      this._anaglyphShader = new Anaglyph(this._core, this);\n      this._blockShader = new UnitBlock$1(this._core, this);\n      this._sphereShader = new UnitSphere$1(this._core, this);\n      this._cylinderShader = new UnitCylinder$1(this._core, this);\n      this._hexPrismShader = new UnitHexPrism(this._core, this);\n      this._sdfShader = new UnitSdf$1(this._core, this);\n      this._initializeContext(this._createContext(this._canvas));\n      this._canvas.addEventListener(\"webglcontextlost\", (event2) => {\n        this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n        this._isInitialized = false;\n        event2.preventDefault();\n      }, false);\n      this._canvas.addEventListener(\"webglcontextrestored\", () => {\n        this._initializeContext(this._createContext(this._canvas));\n        this._isInitialized = true;\n        this._core.log.write(LogLevel.info, \"WebGL context restored\");\n      }, false);\n      this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n      this._gl = gl;\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        fontVisual.initializeContext(gl);\n      }\n      this._shaderResources.initializeContext(this._gl);\n      this._colorShader.initializeContext(this._gl);\n      this._textureShader.initializeContext(this._gl);\n      this._lassoShader.initializeContext(this._gl);\n      this._modelShader.initializeContext(this._gl);\n      this._sdfTextShader.initializeContext(this._gl);\n      this._gridShader.initializeContext(this._gl);\n      this._anaglyphShader.initializeContext(this._gl);\n      this._blockShader.initializeContext(this._gl);\n      this._sphereShader.initializeContext(this._gl);\n      this._cylinderShader.initializeContext(this._gl);\n      this._hexPrismShader.initializeContext(this._gl);\n      this._sdfShader.initializeContext(this._gl);\n      this._quad.initializeContext(this._gl);\n      this._lasso.initializeContext(this._gl);\n      this._debugAxesVisual.initializeContext(this._gl);\n      this._framebuffers = [null, null];\n      const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, this._core.config.pickWidth, this._core.config.pickHeight);\n      const framebuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(framebuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._pickFrameBuffer = framebuffer;\n      this._anaglyphTextures = [null, null];\n      this.anaglyphFramebuffers = [null, null];\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        this.transitionBuffers[i].initializeContext(this._gl);\n      }\n      if (this._axes1) {\n        for (let i = 0; i < this._axes1.length; i++) {\n          this._axes1[i].initializeContext(this._gl);\n        }\n      }\n      if (this._axes2) {\n        for (let i = 0; i < this._axes2.length; i++) {\n          this._axes2[i].initializeContext(this._gl);\n        }\n      }\n      for (let i = 0; i < this.labelSets.length; i++) {\n        this.labelSets[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.images.length; i++) {\n        this.images[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.controllers.length; i++) {\n        this.controllers[i].initializeContext(this._gl);\n      }\n    }\n    _resize(width2, height2) {\n      super._resize(width2, height2);\n      for (let i = 0; i < 2; i++) {\n        const texture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        const renderBuffer = this._gl.createRenderbuffer();\n        this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n        this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, width2, height2);\n        const framebuffer = this._gl.createFramebuffer();\n        this._shaderResources.bindFramebuffer(framebuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n        this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n        this._anaglyphTextures[i] = texture;\n        this.anaglyphFramebuffers[i] = framebuffer;\n      }\n      this._core.log.write(LogLevel.info, `buffers resized ${width2},${height2}`);\n    }\n    _createContext(canvas) {\n      const antialias = this._options ? this._options.antialias === void 0 ? true : this._options.antialias : true;\n      const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === void 0 ? false : this._options.preserveDrawingBuffer : false;\n      return canvas.getContext(\"webgl\", {\n        stencil: true,\n        alpha: true,\n        antialias,\n        preserveDrawingBuffer\n      });\n    }\n    initializeWebXR(session) {\n      const promise = new Promise((resolve2, reject) => {\n        this._gl.makeXRCompatible().then(() => {\n          session.updateRenderState({\n            baseLayer: new XRWebGLLayer(session, this._gl),\n            depthNear: this._core.config.nearPlane,\n            depthFar: this._core.config.farPlane\n          });\n          session.requestReferenceSpace(\"local\").then((refSpace) => {\n            this._webXRReferenceSpace = refSpace;\n            resolve2();\n          });\n        });\n      });\n      return promise;\n    }\n    prepare(xrFrame) {\n      if (xrFrame) {\n        const pose = xrFrame.getViewerPose(this._webXRReferenceSpace);\n        if (pose) {\n          const glLayer = xrFrame.session.renderState.baseLayer;\n          for (let i = 0; i < pose.views.length; i++) {\n            const view = pose.views[i];\n            this.vMatrices[i] = view.transform.inverse.matrix;\n            this.inverseVMatrices[i] = view.transform.matrix;\n            multiply$2(this._mvMatrices[i], this.vMatrices[i], this.mMatrix);\n            this.mvMatrices[i] = this._mvMatrices[i];\n            this.pMatrices[i] = view.projectionMatrix;\n            const viewport = glLayer.getViewport(view);\n            this._viewports[i].x = viewport.x;\n            this._viewports[i].y = viewport.y;\n            this._viewports[i].width = viewport.width;\n            this._viewports[i].height = viewport.height;\n            this._framebuffers[i] = glLayer.framebuffer;\n          }\n        }\n        this._viewportOffset = 0;\n        this._viewportCount = 2;\n      } else {\n        let viewport;\n        switch (this._core.config.stereoMode) {\n          case StereoMode.none:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 1;\n            this._framebuffers[0] = null;\n            break;\n          case StereoMode.left:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 1;\n            this._framebuffers[0] = null;\n            break;\n          case StereoMode.right:\n            viewport = this._viewports[1];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 1;\n            this._viewportCount = 1;\n            this._framebuffers[1] = null;\n            break;\n          case StereoMode.anaglyph:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            viewport = this._viewports[1];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n            this._framebuffers[0] = this.anaglyphFramebuffers[0];\n            this._framebuffers[1] = this.anaglyphFramebuffers[1];\n            break;\n          case StereoMode.split:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width / 2;\n            viewport.height = this._canvas.height;\n            viewport = this._viewports[1];\n            viewport.x = this._canvas.width / 2;\n            viewport.y = 0;\n            viewport.width = this._canvas.width / 2;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n            this._framebuffers[0] = null;\n            this._framebuffers[1] = null;\n            break;\n        }\n      }\n    }\n    createTransitionBuffer(ids) {\n      const buffer = new TransitionBuffer$1(this._core, ids);\n      buffer.initializeContext(this._gl);\n      return buffer;\n    }\n    createControllerVisual(controller) {\n      const visual = new ControllerVisual(this._core, this, controller);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian2dAxesVisual(axes) {\n      const visual = new Cartesian2dVisual$1(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n      const visual = new Cartesian3dVisual$1(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    _createDebugAxesVisual(debugAxes) {\n      return new DebugAxesVisual(this._core, this, debugAxes);\n    }\n    _createLabelVisual(label2) {\n      return new LabelVisual$1(this._core, this, label2);\n    }\n    createLabelSetVisual(labelSet) {\n      const visual = new LabelSetVisual$1(this._core, this, labelSet);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createImageVisual(image2) {\n      const visual = new ImageVisual$1(this._core, this, image2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createFontVisual(font2) {\n      const visual = new FontVisual$1(this._core, font2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    getDataUrl(mimeType) {\n      return this._canvas.toDataURL(mimeType);\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$2(this, void 0, void 0, function* () {\n        if (this.depthEnabled) {\n          this._gl.enable(this._gl.DEPTH_TEST);\n        } else {\n          this._gl.disable(this._gl.DEPTH_TEST);\n        }\n        this._gl.enable(this._gl.CULL_FACE);\n        this._gl.disable(this._gl.BLEND);\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.clearColor(0, 0, 0, 0);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n        this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], backgroundColor[3]);\n        if (xrFrame) {\n          const glLayer = xrFrame.session.renderState.baseLayer;\n          this._shaderResources.bindFramebuffer(glLayer.framebuffer);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        } else if (this._core.config.stereoMode == StereoMode.anaglyph) {\n          for (let i = 0; i < 2; i++) {\n            this._shaderResources.bindFramebuffer(this.anaglyphFramebuffers[i]);\n            this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n          }\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        } else {\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        if (this._core.config.isDebugVisible) {\n          this._debugAxesVisual.framebuffers = this._framebuffers;\n          this._debugAxesVisual.render(elapsedTime, xrFrame);\n        }\n        const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n        if (axesVisuals) {\n          for (let i = 0; i < axesVisuals.length; i++) {\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n              axesVisual.pickedIdColor = this._pickedIdColor;\n              axesVisual.pickFramebuffer = this._pickFrameBuffer;\n              axesVisual.framebuffers = this._framebuffers;\n              axesVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        for (let i = 0; i < this.transitionBuffers.length; i++) {\n          const transitionBuffer = this.transitionBuffers[i];\n          if (transitionBuffer.isVisible) {\n            this._renderTransitionBuffer(xrFrame, transitionBuffer);\n          }\n        }\n        if (this.areLabelsVisible) {\n          for (let i = 0; i < this.labelSets.length; i++) {\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n              labelSetVisual.pickedIdColor = this._pickedIdColor;\n              labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n              labelSetVisual.framebuffers = this._framebuffers;\n              labelSetVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        if (this.areImagesVisible) {\n          for (let i = 0; i < this.images.length; i++) {\n            const imageVisual = this.images[i];\n            if (imageVisual.isVisible) {\n              imageVisual.framebuffers = this._framebuffers;\n              imageVisual.pickFramebuffer = this._pickFrameBuffer;\n              imageVisual.isPickingEnabled = this.isPickingEnabled;\n              imageVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        for (let i = 0; i < this.controllers.length; i++) {\n          const controllerVisual = this.controllers[i];\n          if (controllerVisual.isVisible) {\n            controllerVisual.isRayVisible = this.isPickingEnabled;\n            controllerVisual.framebuffers = this._framebuffers;\n            controllerVisual.render(elapsedTime, xrFrame);\n          }\n        }\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n          this._pickedType = PickHelper.decodeType(this._pickedPixels);\n          set$2(this._pickedIdColor, this._pickedPixels[0] / 255, this._pickedPixels[1] / 255, this._pickedPixels[2] / 255, this._pickedPixels[3] / 255);\n          this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n          if (this._isCapturingPickImage && this.capturePickImageCallback) {\n            this._isCapturingPickImage = false;\n            const data2 = new Uint8ClampedArray(this._core.config.pickWidth * this._core.config.pickHeight * 4);\n            this._gl.readPixels(0, 0, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, data2);\n            for (let i = 0; i < data2.length / 4; i++) {\n              if (data2[i * 4 + 3] == PickType.data) {\n                data2[i * 4 + 3] = 255;\n              } else {\n                data2[i * 4] = 0;\n                data2[i * 4 + 1] = 0;\n                data2[i * 4 + 2] = 0;\n                data2[i * 4 + 3] = 0;\n              }\n            }\n            const length2 = this._core.config.pickWidth * this._core.config.pickHeight * 4;\n            const row = this._core.config.pickWidth * 4;\n            const end = (this._core.config.pickHeight - 1) * row;\n            const flipped = new Uint8ClampedArray(length2);\n            for (let i = 0; i < length2; i += row) {\n              flipped.set(data2.subarray(i, i + row), end - i);\n            }\n            this.capturePickImageCallback(flipped, this._core.config.pickWidth, this._core.config.pickHeight);\n          }\n        } else {\n          set$2(this._pickedIdColor, 0, 0, 0, 0);\n          this._pickedId = 0;\n        }\n        if (this.isLassoPicking && this._lassoShader.isInitialized) {\n          this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n          this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n          const lassoWidth = this.lassoX1 - this.lassoX0;\n          const lassoHeight = this.lassoY1 - this.lassoY0;\n          this._lassoShader.prepare();\n          this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n          this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n          this._lassoShader.apply();\n          const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewportIndex = i + this._viewportOffset;\n            this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n            const viewport = this._viewports[viewportIndex];\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n            this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n            this._lassoMMatrix[10] = 1;\n            this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n            this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n            this._lassoShader.mMatrix = this._lassoMMatrix;\n            set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n            this._lassoShader.thickness = this._lassoThickness;\n            this._lassoShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n        if (this._core.config.stereoMode == StereoMode.anaglyph && this._anaglyphShader.isInitialized && this._quad.isInitialized) {\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.viewport(this._viewports[0].x, this._viewports[0].y, this._viewports[0].width, this._viewports[0].height);\n          this._anaglyphShader.vertexBuffer = this._quad.vertexBuffer;\n          this._anaglyphShader.indexBuffer = this._quad.indexBuffer;\n          this._anaglyphShader.texture2D1 = this._anaglyphTextures[0];\n          this._anaglyphShader.texture2D2 = this._anaglyphTextures[1];\n          this._anaglyphShader.prepare();\n          this._anaglyphShader.viewport = this._viewports[0];\n          this._anaglyphShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      });\n    }\n    _renderTransitionBuffer(xrFrame, transitionBuffer) {\n      const currentBuffer = transitionBuffer.currentBuffer;\n      const previousBuffer = transitionBuffer.previousBuffer;\n      const currentPalette = transitionBuffer.currentPalette;\n      const previousPalette = transitionBuffer.previousPalette;\n      const currentAtlas = transitionBuffer.currentAtlas;\n      const previousAtlas = transitionBuffer.previousAtlas;\n      const unitType = transitionBuffer.unitType === void 0 ? currentBuffer.unitType : transitionBuffer.unitType;\n      const id2 = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n      const hoverId = id2 > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id2) : -1;\n      const activeId = transitionBuffer.activeId;\n      if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf || unitType == UnitType.ringSdf)) {\n        this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._blockShader.prepare();\n        this._blockShader.mMatrix = this.mMatrix;\n        this._blockShader.time = this.transitionTime;\n        this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._blockShader.rangeMin = 0;\n        this._blockShader.rangeMax = transitionBuffer.length - 1;\n        this._blockShader.hover = hoverId;\n        this._blockShader.active = activeId;\n        this._blockShader.selectedColor = this._core.config.selectionColor;\n        this._blockShader.hoverColor = this._core.config.hoverColor;\n        this._blockShader.activeColor = this._core.config.activeColor;\n        this._blockShader.highlightMode = this._core.config.highlightMode;\n        this._blockShader.specularPower = this._config.specularPower;\n        this._blockShader.specularIntensity = this._config.specularIntensity;\n        this._blockShader.ambient = this._config.ambient;\n        this._blockShader.apply();\n        this._blockShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._blockShader.directionToLight = this._directionToLight;\n            this._blockShader.halfAngle = this._halfAngle;\n          } else {\n            this._blockShader.directionToLight = this._config.directionToLight;\n            this._blockShader.halfAngle = this._config.halfAngle;\n          }\n          this._blockShader.vMatrix = vMatrix;\n          this._blockShader.pMatrix = this.pMatrices[viewport];\n          this._blockShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._blockShader.isPickShader = true;\n          this._blockShader.pMatrix = this.pickPMatrix;\n          this._blockShader.vMatrix = this.pickVMatrix;\n          this._blockShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf || unitType == UnitType.disk)) {\n        this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sphereShader.prepare();\n        this._sphereShader.mMatrix = this.mMatrix;\n        this._sphereShader.time = this.transitionTime;\n        this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sphereShader.rangeMin = 0;\n        this._sphereShader.rangeMax = transitionBuffer.length - 1;\n        this._sphereShader.hover = hoverId;\n        this._sphereShader.active = activeId;\n        this._sphereShader.selectedColor = this._core.config.selectionColor;\n        this._sphereShader.hoverColor = this._core.config.hoverColor;\n        this._sphereShader.activeColor = this._core.config.activeColor;\n        this._sphereShader.highlightMode = this._core.config.highlightMode;\n        this._sphereShader.specularPower = this._config.specularPower;\n        this._sphereShader.specularIntensity = this._config.specularIntensity;\n        this._sphereShader.ambient = this._config.ambient;\n        this._sphereShader.apply();\n        this._sphereShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._sphereShader.directionToLight = this._directionToLight;\n            this._sphereShader.halfAngle = this._halfAngle;\n          } else {\n            this._sphereShader.directionToLight = this._config.directionToLight;\n            this._sphereShader.halfAngle = this._config.halfAngle;\n          }\n          this._sphereShader.vMatrix = vMatrix;\n          this._sphereShader.pMatrix = this.pMatrices[viewport];\n          this._sphereShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._sphereShader.isPickShader = true;\n          this._sphereShader.pMatrix = this.pickPMatrix;\n          this._sphereShader.vMatrix = this.pickVMatrix;\n          this._sphereShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n        this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._cylinderShader.prepare();\n        this._cylinderShader.mMatrix = this.mMatrix;\n        this._cylinderShader.time = this.transitionTime;\n        this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._cylinderShader.rangeMin = 0;\n        this._cylinderShader.rangeMax = transitionBuffer.length - 1;\n        this._cylinderShader.hover = hoverId;\n        this._cylinderShader.active = activeId;\n        this._cylinderShader.selectedColor = this._core.config.selectionColor;\n        this._cylinderShader.hoverColor = this._core.config.hoverColor;\n        this._cylinderShader.activeColor = this._core.config.activeColor;\n        this._cylinderShader.highlightMode = this._core.config.highlightMode;\n        this._cylinderShader.specularPower = this._config.specularPower;\n        this._cylinderShader.specularIntensity = this._config.specularIntensity;\n        this._cylinderShader.ambient = this._config.ambient;\n        this._cylinderShader.apply();\n        this._cylinderShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._cylinderShader.directionToLight = this._directionToLight;\n            this._cylinderShader.halfAngle = this._halfAngle;\n          } else {\n            this._cylinderShader.directionToLight = this._config.directionToLight;\n            this._cylinderShader.halfAngle = this._config.halfAngle;\n          }\n          this._cylinderShader.vMatrix = vMatrix;\n          this._cylinderShader.pMatrix = this.pMatrices[viewport];\n          this._cylinderShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._cylinderShader.isPickShader = true;\n          this._cylinderShader.pMatrix = this.pickPMatrix;\n          this._cylinderShader.vMatrix = this.pickVMatrix;\n          this._cylinderShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._hexPrismShader.isInitialized && (unitType == UnitType.hexPrism || unitType == UnitType.hexPrismSdf)) {\n        this._hexPrismShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._hexPrismShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._hexPrismShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._hexPrismShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._hexPrismShader.prepare();\n        this._hexPrismShader.mMatrix = this.mMatrix;\n        this._hexPrismShader.time = this.transitionTime;\n        this._hexPrismShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._hexPrismShader.rangeMin = 0;\n        this._hexPrismShader.rangeMax = transitionBuffer.length - 1;\n        this._hexPrismShader.hover = hoverId;\n        this._hexPrismShader.active = activeId;\n        this._hexPrismShader.selectedColor = this._core.config.selectionColor;\n        this._hexPrismShader.hoverColor = this._core.config.hoverColor;\n        this._hexPrismShader.activeColor = this._core.config.activeColor;\n        this._hexPrismShader.highlightMode = this._core.config.highlightMode;\n        this._hexPrismShader.specularPower = this._config.specularPower;\n        this._hexPrismShader.specularIntensity = this._config.specularIntensity;\n        this._hexPrismShader.ambient = this._config.ambient;\n        this._hexPrismShader.apply();\n        this._hexPrismShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._hexPrismShader.directionToLight = this._directionToLight;\n            this._hexPrismShader.halfAngle = this._halfAngle;\n          } else {\n            this._hexPrismShader.directionToLight = this._config.directionToLight;\n            this._hexPrismShader.halfAngle = this._config.halfAngle;\n          }\n          this._hexPrismShader.vMatrix = vMatrix;\n          this._hexPrismShader.pMatrix = this.pMatrices[viewport];\n          this._hexPrismShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._hexPrismShader.isPickShader = true;\n          this._hexPrismShader.pMatrix = this.pickPMatrix;\n          this._hexPrismShader.vMatrix = this.pickVMatrix;\n          this._hexPrismShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n        this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n        this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n        this._sdfShader.prepare();\n        this._sdfShader.mMatrix = this.mMatrix;\n        this._sdfShader.time = this.transitionTime;\n        this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sdfShader.rangeMin = 0;\n        this._sdfShader.rangeMax = transitionBuffer.length - 1;\n        this._sdfShader.hover = hoverId;\n        this._sdfShader.active = activeId;\n        this._sdfShader.selectedColor = this._core.config.selectionColor;\n        this._sdfShader.hoverColor = this._core.config.hoverColor;\n        this._sdfShader.activeColor = this._core.config.activeColor;\n        this._sdfShader.highlightMode = this._core.config.highlightMode;\n        this._sdfShader.sdfBuffer = (this.sdfBuffer || this._core.config.sdfBuffer) / 255;\n        this._sdfShader.sdfBackgroundColor = this.sdfBackgroundColor || fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n        this._sdfShader.specularPower = this._config.specularPower;\n        this._sdfShader.specularIntensity = this._config.specularIntensity;\n        this._sdfShader.ambient = this._config.ambient;\n        this._sdfShader.apply();\n        this._sdfShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._sdfShader.directionToLight = this._directionToLight;\n            this._sdfShader.halfAngle = this._halfAngle;\n          } else {\n            this._sdfShader.directionToLight = this._config.directionToLight;\n            this._sdfShader.halfAngle = this._config.halfAngle;\n          }\n          this._sdfShader.vMatrix = vMatrix;\n          this._sdfShader.pMatrix = this.pMatrices[viewport];\n          this._sdfShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._sdfShader.isPickShader = true;\n          this._sdfShader.pMatrix = this.pickPMatrix;\n          this._sdfShader.vMatrix = this.pickVMatrix;\n          this._sdfShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      }\n    }\n  };\n  class Quad {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const _vec3 = fromValues$3(2, 2, 2);\n      const _mat4 = create$4();\n      fromScaling(_mat4, _vec3);\n      const vertices = Quad$2.positions(_mat4);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$2.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  }\n  class Atlas extends AtlasBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([255, 255, 255, 255]));\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._imageData) {\n        this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n      } else {\n        this._texture = null;\n      }\n    }\n  }\n  class Palette extends PaletteBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._colors) {\n        const colors2 = new Uint8Array(this._colors);\n        for (let i = 0; i < colors2.length; i++) {\n          colors2[i] = Math.pow(colors2[i] / 255, 2.2) * 255;\n        }\n        this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors2);\n      } else {\n        this._texture = null;\n      }\n    }\n  }\n  let Buffer$1 = class Buffer extends BufferBase {\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    constructor(core, ids) {\n      super(core, ids);\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update() {\n      if (this._isInitialized) {\n        const start = window.performance.now();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n        this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n      }\n    }\n  };\n  class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$1, Palette, Atlas);\n    }\n    initializeContext(gl) {\n      this._buffer1.initializeContext(gl);\n      this._buffer2.initializeContext(gl);\n      this._palette1.initializeContext(this._core, gl);\n      this._palette2.initializeContext(this._core, gl);\n      this._atlas1.initializeContext(this._core, gl);\n      this._atlas2.initializeContext(this._core, gl);\n      this._isInitialized = true;\n    }\n  }\n  class Config extends RendererConfig {\n    get keyLightAltitude() {\n      return this._keyLightAltitude;\n    }\n    set keyLightAltitude(value2) {\n      this._keyLightAltitude = value2;\n      this._updateLights();\n    }\n    get keyLightAzimuth() {\n      return this._keyLightAzimuth;\n    }\n    set keyLightAzimuth(value2) {\n      this._keyLightAzimuth = value2;\n      this._updateLights();\n    }\n    get keyLightDistance() {\n      return this._keyLightDistance;\n    }\n    set keyLightDistance(value2) {\n      this._keyLightDistance = value2;\n      this._updateLights();\n    }\n    get fillLight1Altitude() {\n      return this._fillLight1Altitude;\n    }\n    set fillLight1Altitude(value2) {\n      this._fillLight1Altitude = value2;\n      this._updateLights();\n    }\n    get fillLight1Azimuth() {\n      return this._fillLight1Azimuth;\n    }\n    set fillLight1Azimuth(value2) {\n      this._fillLight1Azimuth = value2;\n      this._updateLights();\n    }\n    get fillLight2Altitude() {\n      return this._fillLight2Altitude;\n    }\n    set fillLight2Altitude(value2) {\n      this._fillLight2Altitude = value2;\n      this._updateLights();\n    }\n    get fillLight2Azimuth() {\n      return this._fillLight2Azimuth;\n    }\n    set fillLight2Azimuth(value2) {\n      this._fillLight2Azimuth = value2;\n      this._updateLights();\n    }\n    constructor() {\n      super();\n      this._rotation = create$1();\n      this.keyLightPosition = create$3();\n      this.fillLight1Position = create$3();\n      this.fillLight2Position = create$3();\n      this.reset();\n    }\n    _updateLights() {\n      this._updateLight(this._keyLightAltitude, this._keyLightAzimuth, this._keyLightDistance, this.keyLightPosition);\n      this._updateLight(this._fillLight1Altitude, this._fillLight1Azimuth, 1, this.fillLight1Position);\n      this._updateLight(this._fillLight2Altitude, this._fillLight2Azimuth, 1, this.fillLight2Position);\n    }\n    _updateLight(altitude, azimuth, distance2, position2) {\n      rotateY(this._rotation, Constants.QUAT_IDENTITY, AngleHelper.degreesToRadians(azimuth));\n      rotateX(this._rotation, this._rotation, AngleHelper.degreesToRadians(-altitude));\n      transformQuat(position2, Constants.VECTOR3_UNITZ, this._rotation);\n      scale(position2, position2, distance2);\n    }\n    reset() {\n      this.isSsaoEnabled = true;\n      this.ssaoWidth = 1024;\n      this.ssaoHeight = 1024;\n      this.ssaoBlurEnabled = true;\n      this.ssaoKernelSize = 8;\n      this.ssaoNoiseSize = 4;\n      this.ssaoRadius = 0.02;\n      this.ssaoPower = 1;\n      this.isShadowEnabled = true;\n      this.shadowWidth = 1024;\n      this.shadowHeight = 1024;\n      this.isDofEnabled = false;\n      this.dofAutoFocus = true;\n      this.dofFocusDistance = 0.5;\n      this.dofFocusRange = 0.5;\n      this.dofMaxBackgroundBlur = 0.75;\n      this.isBloomEnabled = false;\n      this.bloomIntensity = 2;\n      this.specularIntensity = 0.15;\n      this.specularPower = 150;\n      this.ambientIntensity = 0.1;\n      this.materialIntensity = 0.5;\n      this.keyLightIntensity = 1.5;\n      this.fillLight1Intensity = 0.25;\n      this.fillLight2Intensity = 0.25;\n      this._keyLightAltitude = 30;\n      this._keyLightAzimuth = -45;\n      this._keyLightDistance = 1;\n      this._fillLight1Altitude = 30;\n      this._fillLight1Azimuth = 45;\n      this._fillLight2Altitude = 30;\n      this._fillLight2Azimuth = -135;\n      this._updateLights();\n      this.isFxaaEnabled = false;\n    }\n  }\n  class Resources {\n    bindFramebuffer(framebuffer) {\n      if (this.framebuffer != framebuffer) {\n        this.framebuffer = framebuffer;\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n      }\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this.framebuffer = this._gl.createFramebuffer();\n      this.OES_texture_float = gl.getExtension(\"OES_texture_float\");\n      this.OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n      this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n  }\n  Resources.glsl = {\n    \"background.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\ngl_FragDepth = 0.99999;\\nmyPosition = vec4(0.0, 0.0, -FAR_PLANE, 0.0);\\nmyColor = vec4(uColor, 1.0);\\nmyNormal = vec4(0.0, 0.0, 1.0, 0.0);\\n}\\n',\n    \"box.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nfloat result = 0.0;\\nfor (int x = -2; x < 2; x++)\\n{\\nfor (int y = -2; y < 2; y++)\\n{\\nvec2 offset = vec2(float(x) + 0.5, float(y) + 0.5) * texelSize;\\nresult += texture(uSampler, texCoords + offset).r;\\n}\\n}\\nresult /= 16.0;\\nmyOutputColor = vec4(vec3(result), 1.0);\\n}\\n\",\n    \"bright.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec4 color = texture(uSampler, texCoords);\\nmyOutputColor = vec4(color.rgb * color.a, 1.0);\\n}\\n\",\n    \"combine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform float uIntensity;\\nout vec4 myOutputColor;\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 bloom =\\ntexture(uSampler2, texCoords).rgb +\\ntexture(uSampler3, texCoords).rgb +\\ntexture(uSampler4, texCoords).rgb +\\ntexture(uSampler5, texCoords).rgb;\\nbloom *= uIntensity;\\nvec3 color = texture(uSampler1, texCoords).rgb;\\ncolor += bloom;\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"deferred.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform mat4 uInverseVMatrix;\\nuniform mat4 uShadowVMatrix;\\nuniform mat4 uShadowPMatrix;\\nuniform bool uShadow;\\nuniform bool uSsao;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform vec3 uKeyLightHalfAngle;\\nuniform vec3 uDirectionToKeyLight;\\nuniform vec3 uDirectionToFillLight1;\\nuniform vec3 uDirectionToFillLight2;\\nuniform vec2 uShadowMapSize;\\nuniform float uKeyLightIntensity;\\nuniform float uFillLight1Intensity;\\nuniform float uFillLight2Intensity;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbientIntensity;\\nuniform float uMaterialIntensity;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec4 position = texture(uSampler1, texCoords);\\nvec4 color = texture(uSampler2, texCoords);\\nvec4 normal = texture(uSampler3, texCoords);\\nfloat shadow;\\nif (uShadow)\\n{\\nvec4 positionWorld = uInverseVMatrix * vec4(position.xyz, 1.0);\\nvec4 positionShadowView = uShadowVMatrix * positionWorld;\\nvec4 positionShadowViewProjection = uShadowPMatrix * positionShadowView;\\nvec3 projCoords = positionShadowViewProjection.xyz / positionShadowViewProjection.w;\\nprojCoords = projCoords * 0.5 + 0.5;\\nfloat minProjCoords = min(projCoords.x, projCoords.y);\\nfloat maxProjCoords = max(projCoords.x, projCoords.y);\\nif (minProjCoords < 0.0 || maxProjCoords > 1.0)\\n{\\nshadow = 1.0;\\n}\\nelse\\n{\\nfloat currentDepth = projCoords.z;\\nfloat bias = 0.0;\\nvec2 texelSize = 1.0 / uShadowMapSize;\\nfor(int x = -1; x <= 1; ++x)\\n{\\nfor(int y = -1; y <= 1; ++y)\\n{\\nfloat pcfDepth = texture(uSampler5, projCoords.xy + vec2(x, y) * texelSize).r;\\nshadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;\\n}\\n}\\nshadow /= 9.0;\\nshadow = clamp(1.0 - shadow, 0.0, 1.0);\\n}\\n}\\nelse\\n{\\nshadow = 1.0;\\n}\\nfloat ssao = uSsao ? texture(uSampler4, texCoords).r : 1.0;\\nfloat diffuseIntensity = clamp(dot(normal.rgb, uDirectionToKeyLight), 0.0, 1.0) * uKeyLightIntensity * shadow;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight1), 0.0, 1.0) * uFillLight1Intensity * ssao;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight2), 0.0, 1.0) * uFillLight2Intensity * ssao;\\nvec3 diffuse = color.rgb * diffuseIntensity * uMaterialIntensity;\\nvec3 ambient = uAmbientIntensity * color.rgb * ssao;\\nvec3 emissive = color.w * color.rgb;\\nfloat specular = normal.w * clamp(pow(clamp(dot(normal.rgb, uKeyLightHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity * uKeyLightIntensity * shadow, 0.0, 1.0);\\nvec3 result = min(ambient + diffuse + specular + emissive, 1.0);\\nresult = pow(result, GAMMA);\\nmyOutputColor = vec4(result, position.w);\\n}\\n',\n    \"dofblur.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uNearFocusDepth;\\nuniform float uFarFocusDepth;\\nuniform float uMaxBackgroundBlur;\\nout vec4 myOutputColor;\\nfloat circleOfConfusion(in float depth )\\n{\\nfloat f;\\nif (depth < uFocusDepth)\\n{\\nf = (depth - uFocusDepth) / (uFocusDepth - uNearFocusDepth);\\nf = clamp(f, -1.0, 0.0);\\n}\\nelse\\n{\\nf = (depth - uFocusDepth) / (uFarFocusDepth - uFocusDepth);\\nf = clamp(f, 0.0, uMaxBackgroundBlur);\\n}\\nreturn f * 0.5 + 0.5;\\n}\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nvec4 color = texture(uSampler1, texCoords);\\nfloat depth = -texture(uSampler2, texCoords).z;\\nfloat coc = circleOfConfusion(depth);\\nmyOutputColor = vec4(coc);\\n}\\n\",\n    \"dofcombine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uAperture;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nout vec4 myOutputColor;\\nconst float MAX_CIRCLE_OF_CONFUSION = 3.0;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec2 texelSizeLow = texelSize * 4.0;\\nconst int NUM_TAPS = 13;\\nvec2 samples[NUM_TAPS];\\nsamples[0] = vec2(-0.326212,-0.405810);\\nsamples[1] = vec2(-0.840144,-0.073580);\\nsamples[2] = vec2(-0.695914, 0.457137);\\nsamples[3] = vec2(-0.203345, 0.620716);\\nsamples[4] = vec2( 0.962340,-0.194983);\\nsamples[5] = vec2( 0.473434,-0.480026);\\nsamples[6] = vec2( 0.519456, 0.767022);\\nsamples[7] = vec2( 0.185461,-0.893124);\\nsamples[8] = vec2( 0.507431, 0.064425);\\nsamples[9] = vec2( 0.896420, 0.412458);\\nsamples[10] = vec2(-0.321940,-0.932615);\\nsamples[11] = vec2(-0.791559,-0.597710);\\nsamples[12] = vec2( 0.000000, 0.000000);\\nconst float maxCoC = 5.0;\\nconst float radiusScale = 0.5;\\nvec4 cOut = texture(uSampler1, texCoords);\\nfloat coc = texture(uSampler2, texCoords).r;\\nfloat centerDepth = coc;\\nfloat discRadius = abs(coc * 2.0 - 1.0) * maxCoC;\\nfloat discRadiusLow = discRadius * radiusScale;\\ncOut = vec4(0.0);\\nfloat acc = 0.0;\\nfor (int t = 0; t < NUM_TAPS; t++)\\n{\\nvec2 coordLow = texCoords + (texelSizeLow * samples[t] * discRadiusLow);\\nvec2 coordHigh = texCoords + (texelSize * samples[t] * discRadius);\\nvec4 tapLow = texture(uSampler1, coordLow);\\nvec4 tapHigh = texture(uSampler1, coordHigh);\\nfloat cocLow = texture(uSampler2, coordLow).r;\\nfloat cocHigh = texture(uSampler2, coordHigh).r;\\nfloat tapBlur = abs(cocHigh * 2.0 - 1.0);\\nvec4 tap = mix(tapHigh, tapLow, tapBlur);\\nfloat cocBlur = mix(cocHigh, cocLow, tapBlur);\\ncocBlur = (cocBlur >= centerDepth) ? 1.0 : abs(cocBlur * 2.0 - 1.0);\\ncOut += tap * cocBlur;\\nacc += cocBlur;\\n}\\nvec4 result = cOut / acc;\\nmyOutputColor = result;\\n}\\n\",\n    \"downsample.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nmyOutputColor = texture(uSampler, texCoords);\\n}\\n\",\n    \"fxaa.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nconst float FXAA_SPAN_MAX = 8.0;\\nconst float FXAA_REDUCE_MUL = 1.0 / 8.0;\\nconst float FXAA_REDUCE_MIN = 1.0 / 128.0;\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec3 color = texture(uSampler, texCoords).rgb;\\nvec3 colorNW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorNE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorSW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y + texelSize.y)).rgb;\\nvec3 colorSE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y + texelSize.y)).rgb;\\nfloat luminance = dot(color, LUMINANCE);\\nfloat luminanceNW = dot(colorNW, LUMINANCE);\\nfloat luminanceNE = dot(colorNE, LUMINANCE);\\nfloat luminanceSW = dot(colorSW, LUMINANCE);\\nfloat luminanceSE = dot(colorSE, LUMINANCE);\\nfloat luminanceMin = min(luminance, min(min(luminanceNW, luminanceNE), min(luminanceSW, luminanceSE)));\\nfloat luminanceMax = max(luminance, max(max(luminanceNW, luminanceNE), max(luminanceSW, luminanceSE)));\\nvec2 dir = vec2(luminanceSW + luminanceSE - luminanceNW - luminanceNE, luminanceNW + luminanceSW - luminanceNE - luminanceSE);\\nfloat dirReduce = max((luminanceNW + luminanceNE + luminanceSW + luminanceSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\\nfloat rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\\ndir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texelSize;\\nvec3 colorA = 0.5 * (\\ntexture(uSampler, texCoords.xy + dir * (1.0/3.0 - 0.5)).rgb +\\ntexture(uSampler, texCoords.xy + dir * (2.0/3.0 - 0.5)).rgb);\\nvec3 colorB = colorA * 0.5 + 0.25 * (\\ntexture(uSampler, texCoords.xy - dir * 0.5).rgb +\\ntexture(uSampler, texCoords.xy + dir * 0.5).rgb);\\nluminance = dot(colorB, LUMINANCE);\\nif (luminance < luminanceMin || luminance > luminanceMax)\\n{\\nmyOutputColor = vec4(colorA, 1.0);\\n}\\nelse\\n{\\nmyOutputColor = vec4(colorB, 1.0);\\n}\\n}\\n',\n    \"gaussian.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nuniform bool uHorizontal;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec2 texelSize = vec2(1.0) / uResolution;\\nconst int NUM_WEIGHTS = 3;\\nfloat weights[NUM_WEIGHTS];\\nweights[0] = 0.2270270270;\\nweights[1] = 0.3162162162;\\nweights[2] = 0.0702702703;\\nfloat offsets[NUM_WEIGHTS];\\noffsets[0] = 0.0;\\noffsets[1] = 1.3846153846;\\noffsets[2] = 3.2307692308;\\nvec3 color = texture(uSampler, texCoords).rgb * weights[0];\\nif (uHorizontal)\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\n}\\n}\\nelse\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\n}\\n}\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"lasso.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nin mediump vec2 vTexCoord;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\nmyOutputColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n',\n    \"lasso.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nout mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"pickgrid.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nin lowp vec4 vColor;\\nin mediump vec2 vTexCoord;\\nin mediump vec4 vBounds;\\nin mediump vec3 vNormal;\\nin vec3 vViewPosition;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void) {\\nif (uPick)\\n{\\nmyPosition = vColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec2 buffer = fwidth(vTexCoord);\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\nmyColor.xyz = color.xyz;\\n}\\n}\\n',\n    \"pickgrid.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin lowp vec4 aIdColor;\\nin mediump vec2 aTexCoord;\\nin mediump vec3 aNormal;\\nin mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nout lowp vec4 vColor;\\nout mediump vec2 vTexCoord;\\nout mediump vec4 vBounds;\\nout mediump vec3 vNormal;\\nout vec3 vViewPosition;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nin lowp vec4 vIdColor;\\nin lowp float vHover;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick) {\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nfloat distance = texture(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth)\\n{\\ndiscard;\\n}\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, mix(uColor, uHoverColor, vHover), value);\\nmyPosition.xyz = vViewPosition;\\nmyNormal.xyz = vNormal;\\nmyColor.w = 1.0;\\nmyPosition.w = 0.0;\\nmyNormal.w = 0.0;\\n}\\n}\\n\",\n    \"sdftext.vertex.fx\": \"#version 300 es\\nin lowp vec4 aIdColor;\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nout vec3 vViewPosition;\\nout vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nout lowp vec4 vIdColor;\\nout lowp float vHover;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(0.0, 0.0, 1.0, 0.0));\\nvec4 viewPosition = mvMatrix* vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"ssao.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nconst int SSAO_KERNEL_SIZE = 8;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform mat4 uPMatrix;\\nuniform vec4 uViewport;\\nuniform float uSsaoNoiseSize;\\nuniform float uSsaoRadius;\\nuniform float uSsaoPower;\\nuniform vec3 uSsaoKernel[SSAO_KERNEL_SIZE];\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 position = texture(uSampler1, texCoords).rgb;\\nvec3 normal = texture(uSampler2, texCoords).rgb;\\nfloat occlusion = 0.0;\\nvec2 noiseScale = uViewport.zw / uSsaoNoiseSize;\\nvec3 randomVec = texture(uSampler3, texCoords * noiseScale).rgb;\\nvec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));\\nvec3 bitangent = cross(normal, tangent);\\nmat3 tbn = mat3(tangent, bitangent, normal);\\nfor(int i = 0; i < SSAO_KERNEL_SIZE; i++)\\n{\\nvec3 mySample = tbn * uSsaoKernel[i];\\nmySample = position + mySample * uSsaoRadius;\\nvec4 offset = vec4(mySample, 1.0);\\noffset = uPMatrix * offset;\\noffset.xy /= offset.w;\\noffset.xy = offset.xy * 0.5 + 0.5;\\nfloat sampleDepth = texture(uSampler1, offset.xy).z;\\nfloat rangeCheck = abs(position.z - sampleDepth) > uSsaoRadius ? 0.0 : 1.0;\\nocclusion += (sampleDepth < mySample.z ? 0.0 : 1.0) * rangeCheck;\\n}\\nocclusion /= float(SSAO_KERNEL_SIZE);\\nocclusion = pow(1.0 - occlusion, uSsaoPower);\\nmyOutputColor = vec4(occlusion, 0.0, 0.0, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform sampler2D uSampler;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nmyPosition.xyz = vViewPosition;\\nmyColor.xyz = pow(texture(uSampler, vTexCoord).xyz, INV_GAMMA);\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\n}\\n',\n    \"texture.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec3 aNormal;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nout vec3 vViewPosition;\\nout mediump vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitblock.vertex.fx\": '#version 300 es\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitcylinder.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec4 vCircle1;\\nin vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w, uShadow ? -1.0 : 1.0);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitcylinder.vertex.fx\": '#version 300 es\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout vec3 vViewPosition;\\nout vec4 vCircle1;\\nout vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitsdf.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec2 vTexCoord;\\nin mediump vec2 vPreviousTexCoord;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nfloat uBorderWidth = 0.0 / 255.0;\\nfloat uBuffer = 192.0 / 255.0;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat distance = mix(texture(uPreviousSampler1, vPreviousTexCoord).r, texture(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat uGamma = 0.0;\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, color, value);\\n}\\n}\\n',\n    \"unitsdf.vertex.fx\": '#version 300 es\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin mediump vec4 aTexCoord;\\nin mediump vec4 aPreviousTexCoord;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout mediump vec2 vTexCoord;\\nout mediump vec2 vPreviousTexCoord;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n',\n    \"unitsphere.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec3 vViewCenter;\\nin mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s, uShadow ? -1.0 : 1.0);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitsphere.vertex.fx\": '#version 300 es\\n#include \"common.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin lowp float aColor;\\nin lowp float aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump float vRadius;\\nout vec3 vViewPosition;\\nout vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\ntranslation.xyz += aPosition * scale;\\nvec4 viewPosition = mvMatrix * vec4(translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n',\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\n\",\n    \"intersect.include.fx\": \"float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph, in float shadow)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot( oc, rd );\\nfloat c = dot( oc, oc ) - sph.w*sph.w;\\nfloat h = b*b - c;\\nif( h<0.0 ) return -1.0;\\nreturn -b - shadow * sqrt( h );\\n}\\nfloat roundedboxIntersect( in vec3 ro, in vec3 rd, in vec3 size, in float rad )\\n{\\nvec3 m = 1.0/rd;\\nvec3 n = m*ro;\\nvec3 k = abs(m)*(size+rad);\\nvec3 t1 = -n - k;\\nvec3 t2 = -n + k;\\nfloat tN = max( max( t1.x, t1.y ), t1.z );\\nfloat tF = min( min( t2.x, t2.y ), t2.z );\\nif( tN > tF || tF < 0.0) return -1.0;\\nfloat t = tN;\\nvec3 pos = ro+t*rd;\\nvec3 s = sign(pos);\\nro *= s;\\nrd *= s;\\npos *= s;\\npos -= size;\\npos = max( pos.xyz, pos.yzx );\\nif( min(min(pos.x,pos.y),pos.z)<0.0 ) return t;\\nvec3 oc = ro - size;\\nvec3 dd = rd*rd;\\nvec3 oo = oc*oc;\\nvec3 od = oc*rd;\\nfloat ra2 = rad*rad;\\nt = 1e20;\\n{\\nfloat b = od.x + od.y + od.z;\\nfloat c = oo.x + oo.y + oo.z - ra2;\\nfloat h = b*b - c;\\nif( h>0.0 ) t = -b-sqrt(h);\\n}\\n{\\nfloat a = dd.y + dd.z;\\nfloat b = od.y + od.z;\\nfloat c = oo.y + oo.z - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.x+rd.x*h)<size.x ) t = h;\\n}\\n}\\n{\\nfloat a = dd.z + dd.x;\\nfloat b = od.z + od.x;\\nfloat c = oo.z + oo.x - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.y+rd.y*h)<size.y ) t = h;\\n}\\n}\\n{\\nfloat a = dd.x + dd.y;\\nfloat b = od.x + od.y;\\nfloat c = oo.x + oo.y - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.z+rd.z*h)<size.z ) t = h;\\n}\\n}\\nif( t>1e19 ) t=-1.0;\\nreturn t;\\n}\\nvec3 roundedboxNormal( in vec3 pos, in vec3 siz, in float rad )\\n{\\nreturn sign(pos)*normalize(max(abs(pos)-siz,0.0));\\n}\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - shadow * sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-shadow * sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - shadow * sqrt( h1 );\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - shadow * sqrt( h2 );\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n  };\n  class ShaderBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    set vertexBuffer(value2) {\n      if (this._vertexBuffer != value2) {\n        this._vertexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    set indexBuffer(value2) {\n      if (this._indexBuffer != value2) {\n        this._indexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    constructor(core, main) {\n      this._core = core;\n      this._main = main;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n      const program = this._gl.createProgram();\n      this._gl.attachShader(program, vs);\n      this._gl.attachShader(program, fs);\n      this._gl.linkProgram(program);\n      if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n      }\n      return program;\n    }\n    _compileShader(source2, type2) {\n      const shader = this._gl.createShader(type2);\n      this._gl.shaderSource(shader, source2);\n      this._gl.compileShader(shader);\n      if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n      }\n      return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n      const remove2 = `#define ${directive}`;\n      const index2 = shaderSource.indexOf(remove2);\n      shaderSource = index2 == -1 ? shaderSource : shaderSource.substring(0, index2) + shaderSource.substring(index2 + remove2.length);\n      return shaderSource;\n    }\n    prepare() {\n      if (this._program != this._main.shaderResources.currentProgram) {\n        if (this._main.shaderResources.currentShader) {\n          this._main.shaderResources.currentShader.disableProgram();\n        }\n        this.enableProgram(this._program);\n        this.updateBuffers();\n        this.updateTextures();\n      } else {\n        if (this._haveBuffersChanged) {\n          this.updateBuffers();\n        }\n        if (this._haveTexturesChanged) {\n          this.updateTextures();\n        }\n      }\n    }\n    apply() {\n    }\n    applyModel() {\n    }\n    applyView() {\n    }\n    enableProgram(program) {\n      this._gl.useProgram(program);\n      this._main.shaderResources.currentProgram = program;\n      this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n      this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n      this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n      this._main.shaderResources.currentShader = null;\n      this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n      callback(this._includesFromFile(Resources.glsl[vsName]), this._includesFromFile(Resources.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n      this._sourceFromUrl(vsName, (vsSource) => {\n        this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n          this._sourceFromUrl(fsName, (fsSource) => {\n            this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n              callback(vsIncSource, fsIncSource);\n            });\n          });\n        });\n      });\n    }\n    _sourceFromUrl(url, callback) {\n      const request2 = new XMLHttpRequest();\n      request2.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n      request2.onreadystatechange = () => {\n        if (request2.readyState == XMLHttpRequest.DONE && request2.status == 200) {\n          callback(request2.responseText);\n        }\n      };\n      request2.send();\n    }\n    _includesFromFile(source2) {\n      let index2 = 0;\n      do {\n        index2 = source2.indexOf(\"#include\", index2);\n        if (index2 != -1) {\n          const start = source2.indexOf('\"', index2);\n          const end = source2.indexOf('\"', start + 1);\n          const name = source2.substring(start + 1, end);\n          const inc = Resources.glsl[name];\n          source2 = source2.substring(0, index2) + inc + source2.substring(end + 1);\n        }\n      } while (index2 != -1);\n      return source2;\n    }\n    _includesFromUrl(source2, index2, callback) {\n      index2 = source2.indexOf(\"#include\", index2);\n      if (index2 != -1) {\n        const start = source2.indexOf('\"', index2);\n        const end = source2.indexOf('\"', start + 1);\n        const name = source2.substring(start + 1, end);\n        this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n          source2 = source2.substring(0, index2) + include + source2.substring(end + 1);\n          this._includesFromUrl(source2, index2, callback);\n        });\n      } else {\n        callback(source2);\n      }\n    }\n  }\n  class Texture extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  let Lasso$1 = class Lasso extends ShaderBase {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n      this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  class SdfText extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n      this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n      this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n      this._gl.uniform1f(this._gammaUniform, this.gamma);\n      this._gl.uniform1f(this._bufferUniform, this.buffer);\n      this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class PickGrid extends ShaderBase {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n      this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n      this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n      this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n      this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n      this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n      this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n      this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n      this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n      this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n      this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n      this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n      this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n      this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n      this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n      this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n      this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n      this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n      this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n      this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n      this._gl.uniform2fv(this._zeroUniform, this.zero);\n      this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._boundsAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  }\n  class UnitShader extends ShaderBase {\n    get paletteTexture() {\n      return this._paletteTexture;\n    }\n    set paletteTexture(value2) {\n      if (this._paletteTexture != value2) {\n        this._paletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousPaletteTexture() {\n      return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value2) {\n      if (this._previousPaletteTexture != value2) {\n        this._previousPaletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get sdfTexture() {\n      return this._sdfTexture;\n    }\n    set sdfTexture(value2) {\n      if (this._sdfTexture != value2) {\n        this._sdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousSdfTexture() {\n      return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value2) {\n      if (this._previousSdfTexture != value2) {\n        this._previousSdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    set instanceBuffer(value2) {\n      if (this._instanceBuffer != value2) {\n        this._instanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    set previousInstanceBuffer(value2) {\n      if (this._previousInstanceBuffer != value2) {\n        this._previousInstanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    initializeData() {\n      this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n      this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n      this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n      this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n      this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n      this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n      this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n      this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n      this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n      this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n      this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n      this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n      this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n      const vertices = Cube.POSITIONS;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Cube.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this.indexCount = indices.length;\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._updateCurrentBuffer();\n      this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n      this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._idAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._idColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._translationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._translationAttribute);\n      this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._scaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._scaleAttribute);\n      this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._selectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._selectedAttribute);\n      this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._orderAttribute, 1);\n      this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n      if (this._previousInstanceBuffer != this._instanceBuffer) {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n      }\n      this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n      this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousScaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n      this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1f(this._timeUniform, this.time);\n      this._gl.uniform1f(this._durationUniform, this.duration);\n      this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n      this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n      this._gl.uniform1i(this._previousSampler0Uniform, 0);\n      this._gl.uniform1i(this._sampler0Uniform, 1);\n      this._gl.uniform1f(this._hoverUniform, this.hover);\n      this._gl.uniform1f(this._activeUniform, this.active);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniform1i(this._shadowUniform, this.isShadowMap ? 1 : 0);\n    }\n    updateTextures() {\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._translationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._scaleAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousScaleAttribute, 0);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 0);\n      this._gl.vertexAttribDivisor(this._selectedAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 0);\n      this._gl.vertexAttribDivisor(this._orderAttribute, 0);\n      this._gl.vertexAttribDivisor(this._idAttribute, 0);\n      this._gl.vertexAttribDivisor(this._idColorAttribute, 0);\n    }\n  }\n  class UnitBlock extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n  }\n  class UnitSphere extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n  }\n  class UnitCylinder extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n  }\n  class UnitSdf extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n      this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._texCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n      super.apply();\n      this._gl.uniform1i(this._previousSampler1Uniform, 2);\n      this._gl.uniform1i(this._sampler1Uniform, 3);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._texCoordAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 0);\n    }\n  }\n  class Background extends ShaderBase {\n    constructor(core, main) {\n      super(core, main);\n      this._quad = new Quad();\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      this._quad.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"background.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._isInitialized = true;\n      this._vao = gl.createVertexArray();\n      gl.bindVertexArray(this._vao);\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._quad.vertexBuffer);\n      gl.vertexAttribPointer(this._positionAttribute, 3, gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      gl.enableVertexAttribArray(this._positionAttribute);\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._quad.indexBuffer);\n      gl.bindVertexArray(null);\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindVertexArray(this._vao);\n    }\n  }\n  class Ssao extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"ssao.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._ssaoNoiseSizeUniform = gl.getUniformLocation(this._program, \"uSsaoNoiseSize\");\n      this._ssaoRadiusUniform = gl.getUniformLocation(this._program, \"uSsaoRadius\");\n      this._ssaoPowerUniform = gl.getUniformLocation(this._program, \"uSsaoPower\");\n      this._ssaoKernelUniform = gl.getUniformLocation(this._program, \"uSsaoKernel\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._ssaoNoiseSizeUniform, this.ssaoNoiseSize);\n      this._gl.uniform1f(this._ssaoRadiusUniform, this.ssaoRadius);\n      this._gl.uniform1f(this._ssaoPowerUniform, this.ssaoPower);\n      this._gl.uniform3fv(this._ssaoKernelUniform, this.ssaoKernel);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n  }\n  class Box extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"box.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Deferred extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D4() {\n      return this._texture2D4;\n    }\n    set texture2D4(value2) {\n      if (this._texture2D4 != value2) {\n        this._texture2D4 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D5() {\n      return this._texture2D5;\n    }\n    set texture2D5(value2) {\n      if (this._texture2D5 != value2) {\n        this._texture2D5 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    constructor(core, main) {\n      super(core, main);\n      this.directionToKeyLight = create$3();\n      this.directionToFillLight1 = create$3();\n      this.directionToFillLight2 = create$3();\n      this.keyLightHalfAngle = create$3();\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"deferred.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n      this._ssaoUniform = gl.getUniformLocation(this._program, \"uSsao\");\n      this._inverseVMatrixUniform = gl.getUniformLocation(this._program, \"uInverseVMatrix\");\n      this._shadowVMatrixUniform = gl.getUniformLocation(this._program, \"uShadowVMatrix\");\n      this._shadowPMatrixUniform = gl.getUniformLocation(this._program, \"uShadowPMatrix\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n      this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._shadowMapSizeUniform = gl.getUniformLocation(this._program, \"uShadowMapSize\");\n      this._keyLightHalfAngleUniform = gl.getUniformLocation(this._program, \"uKeyLightHalfAngle\");\n      this._directionToKeyLightUniform = gl.getUniformLocation(this._program, \"uDirectionToKeyLight\");\n      this._directionToFillLight1Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight1\");\n      this._directionToFillLight2Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight2\");\n      this._keyLightIntensityUniform = gl.getUniformLocation(this._program, \"uKeyLightIntensity\");\n      this._fillLight1IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight1Intensity\");\n      this._fillLight2IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight2Intensity\");\n      this._ambientIntensityUniform = gl.getUniformLocation(this._program, \"uAmbientIntensity\");\n      this._materialIntensityUniform = gl.getUniformLocation(this._program, \"uMaterialIntensity\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._shadowUniform, this.isShadowEnabled ? 1 : 0);\n      this._gl.uniform1i(this._ssaoUniform, this.isSsaoEnabled ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._inverseVMatrixUniform, false, this.inverseVMatrix);\n      this._gl.uniformMatrix4fv(this._shadowVMatrixUniform, false, this.shadowVMatrix);\n      this._gl.uniformMatrix4fv(this._shadowPMatrixUniform, false, this.shadowPMatrix);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform1i(this._samplerUniform4, 3);\n      this._gl.uniform1i(this._samplerUniform5, 4);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform2f(this._shadowMapSizeUniform, this.shadowMapWidth, this.shadowMapHeight);\n      this._gl.uniform1f(this._keyLightIntensityUniform, this.keyLightIntensity);\n      this._gl.uniform1f(this._fillLight1IntensityUniform, this.fillLight1Intensity);\n      this._gl.uniform1f(this._fillLight2IntensityUniform, this.fillLight2Intensity);\n      this._gl.uniform1f(this._ambientIntensityUniform, this.ambientIntensity);\n      this._gl.uniform1f(this._materialIntensityUniform, this.materialIntensity);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n      this._gl.uniform3fv(this._directionToKeyLightUniform, this.directionToKeyLight);\n      this._gl.uniform3fv(this._directionToFillLight1Uniform, this.directionToFillLight1);\n      this._gl.uniform3fv(this._directionToFillLight2Uniform, this.directionToFillLight2);\n      this._gl.uniform3fv(this._keyLightHalfAngleUniform, this.keyLightHalfAngle);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n      this._gl.activeTexture(this._gl.TEXTURE4);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n  }\n  class Combine extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D4() {\n      return this._texture2D4;\n    }\n    set texture2D4(value2) {\n      if (this._texture2D4 != value2) {\n        this._texture2D4 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D5() {\n      return this._texture2D5;\n    }\n    set texture2D5(value2) {\n      if (this._texture2D5 != value2) {\n        this._texture2D5 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"combine.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._intensityUniform = gl.getUniformLocation(this._program, \"uIntensity\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n      this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n      this._gl.uniform1f(this._intensityUniform, this.intensity);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform1i(this._samplerUniform4, 3);\n      this._gl.uniform1i(this._samplerUniform5, 4);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n      this._gl.activeTexture(this._gl.TEXTURE4);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n  }\n  class DofBlur extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"dofblur.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n      this._nearFocusDepthUniform = gl.getUniformLocation(this._program, \"uNearFocusDepth\");\n      this._farFocusDepthUniform = gl.getUniformLocation(this._program, \"uFarFocusDepth\");\n      this._maxBackgroundBlurUniform = gl.getUniformLocation(this._program, \"uMaxBackgroundBlur\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n      this._gl.uniform1f(this._nearFocusDepthUniform, this.nearFocusDepth);\n      this._gl.uniform1f(this._farFocusDepthUniform, this.farFocusDepth);\n      this._gl.uniform1f(this._maxBackgroundBlurUniform, this.maxBackgroundBlur);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n    }\n  }\n  class Downsample extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"downsample.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Gaussian extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"gaussian.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n      this._horizontalUniform = gl.getUniformLocation(this._program, \"uHorizontal\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n      this._gl.uniform1i(this._horizontalUniform, this.horizontal ? 1 : 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class DofCombine extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"dofcombine.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n      this._apertureUniform = gl.getUniformLocation(this._program, \"uAperture\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n      this._gl.uniform1f(this._apertureUniform, this.aperture);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n  }\n  class Fxaa extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"fxaa.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Bright extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"bright.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get axes() {\n      return this._axes;\n    }\n    constructor(core) {\n      this._core = core;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._renderGrid();\n        this._renderText();\n      }\n    }\n    _renderGrid() {\n    }\n    _renderText() {\n    }\n  }\n  class Cartesian2dVisual extends AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian2dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 2; edge++) {\n          const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n          if (axes.isEdgeVisible[edgeId]) {\n            if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n              indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n              indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n            } else {\n              indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n              indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n            }\n            if (indexCount > 0) {\n              shader.mMatrix = axes.getLabelMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n            indexCount = axes.getTitleIndexCount(axisId);\n            if (indexCount > 0) {\n              indexOffset = axes.getTitleIndexOffset(axisId);\n              shader.mMatrix = axes.getTitleMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n          indexCount = axes.getHeadingIndexCount(axisId);\n          if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n            indexOffset = axes.getHeadingIndexOffset(axisId);\n            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n            shader.applyModel();\n            shader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n              const viewport = i + this.viewportOffset;\n              this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n              shader.vMatrix = this.vMatrices[viewport];\n              shader.pMatrix = this.pMatrices[viewport];\n              shader.applyView();\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n              shader.isPickShader = true;\n              shader.pMatrix = this.pickPMatrix;\n              shader.vMatrix = this.pickVMatrix;\n              shader.applyView();\n              shaderResources.bindFramebuffer(this.pickFramebuffer);\n              this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const gridShader = this._main.gridShader;\n      const axes = this._axes;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width3 = gridTicksScale[0];\n          const height3 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n            if (axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width3, height3);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size2 = axes.size;\n      const axisId2 = 0;\n      const axisId3 = 1;\n      const width2 = size2[axisId2];\n      const height2 = size2[axisId3];\n      gridShader.zero = axes.gridFaceZero;\n      gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n      for (let face = 0; face < 2; face++) {\n        const faceId = face;\n        if (axes.getIsForwardFace(faceId)) {\n          this._renderGridFace(faceId, width2, height2);\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  }\n  class Cartesian3dVisual extends AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian3dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 4; edge++) {\n          const edgeId = Cube.AXIS_EDGES[axisId][edge];\n          if (axes.getIsOutsideEdge(edgeId)) {\n            if (axes.isEdgeVisible[edgeId]) {\n              if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n              } else {\n                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n              }\n              if (indexCount > 0) {\n                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n              indexCount = axes.getTitleIndexCount(axisId);\n              if (indexCount > 0) {\n                indexOffset = axes.getTitleIndexOffset(axisId);\n                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n            }\n            indexCount = axes.getHeadingIndexCount(axisId);\n            if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n              indexOffset = axes.getHeadingIndexOffset(axisId);\n              shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width2 = gridTicksScale[0];\n          const height2 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size2 = axes.size;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.areFacesVisible[axisId]) {\n          const axisId2 = axisId == 0 ? 1 : 0;\n          const axisId3 = axisId == 2 ? 1 : 2;\n          const width2 = size2[axisId2];\n          const height2 = size2[axisId3];\n          gridShader.zero = axes.getGridFaceZero(axisId);\n          gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n          for (let face = 0; face < 2; face++) {\n            const faceId = Cube.AXIS_FACES[axisId][face];\n            if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n              this._renderGridFace(faceId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  }\n  class FontVisual {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get font() {\n      return this._font;\n    }\n    constructor(core, font2) {\n      this._core = core;\n      this._font = font2;\n      font2.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._isInitialized = true;\n      if (this._font.count > 0) {\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n        this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n      }\n    }\n  }\n  class LabelVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label2) {\n      this._core = core;\n      this._main = main;\n      this._label = label2;\n      this._label.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this._mMatrix = create$4();\n      this.mMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._label.isInitialized) {\n        this._label.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const indexCount = this._label.indexCount;\n        if (indexCount > 0) {\n          const shader = this._main.sdfTextShader;\n          const fontVisual = this._main.fonts[this._label.font.name];\n          shader.vertexBuffer = this._vertexBuffer;\n          shader.indexBuffer = this._indexBuffer;\n          shader.texture2D = fontVisual.texture;\n          shader.prepare();\n          shader.gamma = this._label.gamma;\n          shader.buffer = fontVisual.font.edgeValue / 255;\n          shader.borderWidth = this._label.borderWidth;\n          shader.color = this._label.color || this._core.config.textColor;\n          shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n          shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n          shader.pickedIdColor = this.pickedIdColor;\n          shader.apply();\n          multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n          shader.mMatrix = this._mMatrix;\n          shader.applyModel();\n          shader.isPickShader = false;\n          this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            shader.vMatrix = this.vMatrices[viewport];\n            shader.pMatrix = this.pMatrices[viewport];\n            shader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n          if (this.isPickingEnabled) {\n            shader.isPickShader = true;\n            shader.pMatrix = this.pickPMatrix;\n            shader.vMatrix = this.pickVMatrix;\n            shader.applyView();\n            this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      }\n    }\n  }\n  class LabelVisual extends LabelVisualBase {\n    get label() {\n      return this._label;\n    }\n    set text(value2) {\n      this._label.text = value2;\n    }\n    get text() {\n      return this._label.text;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  }\n  class LabelSetVisual extends LabelVisualBase {\n    get label() {\n      return this._label;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  }\n  class ImageVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n      return this._image;\n    }\n    constructor(core, main, image2) {\n      this._core = core;\n      this._main = main;\n      this._image = image2;\n      this._image.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this.mMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._image.isInitialized) {\n        this._image.initialize();\n      }\n      this._gl = gl;\n      if (this._image.imageData) {\n        this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n      }\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const textureShader = this._main.textureShader;\n        textureShader.vertexBuffer = this._vertexBuffer;\n        textureShader.indexBuffer = this._indexBuffer;\n        textureShader.texture2D = this.texture;\n        textureShader.prepare();\n        textureShader.mMatrix = this.mMatrix;\n        textureShader.apply();\n        this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          textureShader.vMatrix = this.vMatrices[viewport];\n          textureShader.pMatrix = this.pMatrices[viewport];\n          textureShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  }\n  class Lasso {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const vertices = Quad$2.textured(Constants.MAT4_IDENTITY);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$2.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  }\n  var __awaiter$1 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class Main extends RendererBase {\n    get shaderResources() {\n      return this._shaderResources;\n    }\n    get textureShader() {\n      return this._textureShader;\n    }\n    get lassoShader() {\n      return this._lassoShader;\n    }\n    get sdfTextShader() {\n      return this._sdfTextShader;\n    }\n    get gridShader() {\n      return this._gridShader;\n    }\n    get blockShader() {\n      return this._blockShader;\n    }\n    get sphereShader() {\n      return this._sphereShader;\n    }\n    get cyclinderShader() {\n      return this._cylinderShader;\n    }\n    get sdfShader() {\n      return this._sdfShader;\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    get config() {\n      return this._config;\n    }\n    constructor(options) {\n      super(options);\n      this._config = new Config();\n      this._quad = new Quad();\n      this._lasso = new Lasso();\n      this._pickedPixels = new Uint8Array(4);\n      this._pickedIdColor = create$2();\n      this._position = create$3();\n      this._direction = create$3();\n      this._cameraRotation = create$5();\n      this._cameraPosition = create$3();\n      this._modelPosition = create$3();\n      this._modelManipulationOrigin = create$3();\n      this._shadowVMatrix = create$4();\n      this._shadowPMatrix = create$4();\n    }\n    get isSupported() {\n      return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    initialize(core) {\n      super.initialize(core);\n      this._shaderResources = new Resources();\n      this._textureShader = new Texture(core, this);\n      this._lassoShader = new Lasso$1(core, this);\n      this._sdfTextShader = new SdfText(core, this);\n      this._gridShader = new PickGrid(core, this);\n      this._blockShader = new UnitBlock(core, this);\n      this._sphereShader = new UnitSphere(core, this);\n      this._cylinderShader = new UnitCylinder(core, this);\n      this._sdfShader = new UnitSdf(core, this);\n      this._backgroundShader = new Background(core, this);\n      this._ssaoShader = new Ssao(core, this);\n      this._boxShader = new Box(core, this);\n      this._deferredShader = new Deferred(core, this);\n      this._combineShader = new Combine(core, this);\n      this._dofBlurShader = new DofBlur(core, this);\n      this._downsampleShader = new Downsample(core, this);\n      this._gaussianShader = new Gaussian(core, this);\n      this._dofCombineShader = new DofCombine(core, this);\n      this._fxaaShader = new Fxaa(core, this);\n      this._brightPassShader = new Bright(core, this);\n      this._initializeContext(this._createContext(this._canvas));\n      this._canvas.addEventListener(\"webglcontextlost\", (event2) => {\n        this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n        event2.preventDefault();\n      }, false);\n      this._canvas.addEventListener(\"webglcontextrestored\", () => {\n        this._initializeContext(this._createContext(this._canvas));\n        this._core.log.write(LogLevel.info, \"WebGL context restored\");\n      }, false);\n      this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n      this._gl = gl;\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        fontVisual.initializeContext(gl);\n      }\n      this._ssaoSampleKernel = new Float32Array(this._config.ssaoKernelSize * 3);\n      const random2 = new PseudoRandom(0);\n      const _vec3 = create$3();\n      for (let i = 0; i < this._config.ssaoKernelSize; i++) {\n        _vec3[0] = random2.nextFloat() * 2 - 1;\n        _vec3[1] = random2.nextFloat() * 2 - 1;\n        _vec3[2] = random2.nextFloat();\n        normalize$2(_vec3, _vec3);\n        scale(_vec3, _vec3, random2.nextFloat());\n        let scale$12 = i / this._config.ssaoKernelSize;\n        scale$12 = MathHelper.lerp(0.1, 1, scale$12 * scale$12);\n        scale(_vec3, _vec3, scale$12);\n        this._ssaoSampleKernel[i * 3] = _vec3[0];\n        this._ssaoSampleKernel[i * 3 + 1] = _vec3[1];\n        this._ssaoSampleKernel[i * 3 + 2] = _vec3[2];\n      }\n      const noise = new Float32Array(this._config.ssaoNoiseSize * this._config.ssaoNoiseSize * 4);\n      _vec3[2] = 0;\n      for (let i = 0; i < this._config.ssaoNoiseSize * this._config.ssaoNoiseSize; i++) {\n        _vec3[0] = random2.nextFloat() * 2 - 1;\n        _vec3[1] = random2.nextFloat() * 2 - 1;\n        normalize$2(_vec3, _vec3);\n        noise[i * 4] = _vec3[0];\n        noise[i * 4 + 1] = _vec3[1];\n      }\n      this._ssaoNoiseTexture = this._gl.createTexture();\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._ssaoNoiseTexture);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST);\n      this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA32F, this._config.ssaoNoiseSize, this._config.ssaoNoiseSize, 0, this._gl.RGBA, this._gl.FLOAT, noise);\n      this._ssaoWidth = -1;\n      this._ssaoHeight = -1;\n      this._shadowWidth = -1;\n      this._shadowHeight = -1;\n      this._shaderResources.initializeContext(this._gl);\n      this._textureShader.initializeContext(this._gl);\n      this._lassoShader.initializeContext(this._gl);\n      this._sdfTextShader.initializeContext(this._gl);\n      this._gridShader.initializeContext(this._gl);\n      this._blockShader.initializeContext(this._gl);\n      this._sphereShader.initializeContext(this._gl);\n      this._cylinderShader.initializeContext(this._gl);\n      this._sdfShader.initializeContext(this._gl);\n      this._backgroundShader.initializeContext(this._gl);\n      this._ssaoShader.initializeContext(this._gl);\n      this._boxShader.initializeContext(this._gl);\n      this._deferredShader.initializeContext(this._gl);\n      this._combineShader.initializeContext(this._gl);\n      this._dofBlurShader.initializeContext(this._gl);\n      this._downsampleShader.initializeContext(this._gl);\n      this._gaussianShader.initializeContext(this._gl);\n      this._dofCombineShader.initializeContext(this._gl);\n      this._fxaaShader.initializeContext(this._gl);\n      this._brightPassShader.initializeContext(this._gl);\n      this._quad.initializeContext(this._gl);\n      this._lasso.initializeContext(this._gl);\n      this._framebuffers = [null, null];\n      const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, this._core.config.pickWidth, this._core.config.pickHeight);\n      const framebuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(framebuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._pickFrameBuffer = framebuffer;\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        this.transitionBuffers[i].initializeContext(this._gl);\n      }\n      if (this._axes1) {\n        for (let i = 0; i < this._axes1.length; i++) {\n          this._axes1[i].initializeContext(this._gl);\n        }\n      }\n      if (this._axes2) {\n        for (let i = 0; i < this._axes2.length; i++) {\n          this._axes2[i].initializeContext(this._gl);\n        }\n      }\n      for (let i = 0; i < this.labelSets.length; i++) {\n        this.labelSets[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.images.length; i++) {\n        this.images[i].initializeContext(this._gl);\n      }\n    }\n    _resize(width2, height2) {\n      super._resize(width2, height2);\n      this._positionTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.NEAREST, null, this._gl.RGBA32F);\n      this._colorTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._normalTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._geometryFrameBuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._positionTexture, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT1, this._gl.TEXTURE_2D, this._colorTexture, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT2, this._gl.TEXTURE_2D, this._normalTexture, 0);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, width2, height2);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.drawBuffers([this._gl.COLOR_ATTACHMENT0, this._gl.COLOR_ATTACHMENT1, this._gl.COLOR_ATTACHMENT2]);\n      this._postProcessTexture1 = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessDepthTexture = TextureHelper.create(this._gl, width2, height2, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n      this._postProcessFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture1, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._postProcessDepthTexture, 0);\n      this._postProcessTexture2 = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture2, 0);\n      this._postProcessDofTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RED, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.R32F);\n      this._postProcessDofFrameBuffer = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessDofTexture, 0);\n      const widthHalf = Math.round(width2 / 2);\n      const heightHalf = Math.round(height2 / 2);\n      this._postProcessHalfTexture1 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessHalfFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture1, 0);\n      this._postProcessHalfTexture2 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessHalfFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture2, 0);\n      const widthQuarter = Math.round(widthHalf / 2);\n      const heightQuarter = Math.round(heightHalf / 2);\n      this._postProcessQuarterTexture1 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessQuarterFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture1, 0);\n      this._postProcessQuarterTexture2 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessQuarterFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture2, 0);\n      const widthEighth = Math.round(widthQuarter / 2);\n      const heightEighth = Math.round(heightQuarter / 2);\n      this._postProcessEighthTexture1 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessEighthFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture1, 0);\n      this._postProcessEighthTexture2 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessEighthFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture2, 0);\n      const widthSixteenth = Math.round(widthEighth / 2);\n      const hgeightSixteenth = Math.round(heightEighth / 2);\n      this._postProcessSixteenthTexture1 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessSixteenthFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture1, 0);\n      this._postProcessSixteenthTexture2 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessSixteenthFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture2, 0);\n      this._core.log.write(LogLevel.info, `buffers resized ${width2},${height2}`);\n    }\n    _createContext(canvas) {\n      let supported = false;\n      const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === void 0 ? false : this._options.preserveDrawingBuffer : false;\n      const options = {\n        stencil: true,\n        alpha: false,\n        antialias: false,\n        preserveDrawingBuffer\n      };\n      const gl = canvas.getContext(\"webgl2\", options);\n      if (gl) {\n        const OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n        const EXT_color_buffer_float = gl.getExtension(\"EXT_color_buffer_float\");\n        if (OES_texture_float_linear && EXT_color_buffer_float && gl.MAX_DRAW_BUFFERS > 3) {\n          const texture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.FLOAT, gl.LINEAR, null, gl.RGBA32F);\n          const framebuffer = gl.createFramebuffer();\n          gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n          gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n          const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n          if (status == gl.FRAMEBUFFER_COMPLETE) {\n            supported = true;\n          }\n          gl.bindTexture(gl.TEXTURE_2D, null);\n        }\n      }\n      return supported ? gl : null;\n    }\n    prepare() {\n      let viewport;\n      switch (this._core.config.stereoMode) {\n        case StereoMode.none:\n          viewport = this._viewports[0];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 0;\n          this._viewportCount = 1;\n          break;\n        case StereoMode.left:\n          viewport = this._viewports[0];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 0;\n          this._viewportCount = 1;\n          break;\n        case StereoMode.right:\n          viewport = this._viewports[1];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 1;\n          this._viewportCount = 1;\n          break;\n      }\n    }\n    createTransitionBuffer(ids) {\n      const buffer = new TransitionBuffer(this._core, ids);\n      buffer.initializeContext(this._gl);\n      return buffer;\n    }\n    createCartesian2dAxesVisual(axes) {\n      const visual = new Cartesian2dVisual(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n      const visual = new Cartesian3dVisual(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    _createLabelVisual(label2) {\n      return new LabelVisual(this._core, this, label2);\n    }\n    createLabelSetVisual(labelSet) {\n      const visual = new LabelSetVisual(this._core, this, labelSet);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createImageVisual(image2) {\n      const visual = new ImageVisual(this._core, this, image2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createFontVisual(font2) {\n      const visual = new FontVisual(this._core, font2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    getDataUrl(mimeType) {\n      return this._canvas.toDataURL(mimeType);\n    }\n    update(elapsedTime) {\n      super.update(elapsedTime);\n      if (this._shadowWidth != this._config.shadowWidth || this._shadowHeight != this._config.shadowHeight) {\n        this._shadowWidth = this._config.shadowWidth;\n        this._shadowHeight = this._config.shadowHeight;\n        this._shadowColorTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        this._shadowDepthTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n        this._shadowFrameBuffer = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._shadowFrameBuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._shadowColorTexture, 0);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._shadowDepthTexture, 0);\n        this._core.log.write(LogLevel.info, `shadow map resized ${this._shadowWidth},${this._shadowHeight}`);\n      }\n      if (this._ssaoWidth != this._config.ssaoWidth || this._ssaoHeight != this._config.ssaoHeight) {\n        this._ssaoWidth = this._config.ssaoWidth;\n        this._ssaoHeight = this._config.ssaoHeight;\n        this._ssaoTexture1 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n        this._ssaoFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture1, 0);\n        this._ssaoTexture2 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n        this._ssaoFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture2, 0);\n        this._core.log.write(LogLevel.info, `ssao map resized ${this._ssaoWidth},${this._ssaoHeight}`);\n      }\n      if (this._config.isDofEnabled && this._config.dofAutoFocus) {\n        this._core.getModelManipulationOrigin(this._modelManipulationOrigin);\n        this._core.getModelPosition(this._modelPosition);\n        add(this._position, this._modelManipulationOrigin, this._modelPosition);\n        this._core.camera.getPosition(this._cameraPosition);\n        subtract(this._position, this._position, this._cameraPosition);\n        const distance2 = -this._position[2];\n        const amount = Math.min(elapsedTime * this._core.config.focusSmoothing, 1);\n        this._config.dofFocusDistance = MathHelper.lerp(this._config.dofFocusDistance, distance2, amount);\n      }\n    }\n    render(elapsedTime) {\n      return __awaiter$1(this, void 0, void 0, function* () {\n        this._gl.enable(this._gl.DEPTH_TEST);\n        this._gl.enable(this._gl.CULL_FACE);\n        this._gl.cullFace(this._gl.BACK);\n        this._gl.disable(this._gl.BLEND);\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.clearColor(0, 0, 0, 0);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n        this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1);\n        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT | this._gl.STENCIL_BUFFER_BIT);\n        if (this.config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.clear(this._gl.DEPTH_BUFFER_BIT);\n          perspective(this._shadowPMatrix, AngleHelper.degreesToRadians(30), this._config.shadowWidth / this._config.shadowHeight, this._core.config.nearPlane, this._core.config.farPlane);\n          set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n          fromMat4(this._cameraRotation, this.inverseVMatrices[0]);\n          transformMat3(this._position, this._config.keyLightPosition, this._cameraRotation);\n          add(this._position, this._position, this._modelPosition);\n          lookAt(this._shadowVMatrix, this._position, this._modelPosition, Constants.VECTOR3_UNITY);\n        }\n        for (let i = 0; i < this.transitionBuffers.length; i++) {\n          const transitionBuffer = this.transitionBuffers[i];\n          if (transitionBuffer.isVisible) {\n            this._renderTransitionBuffer(transitionBuffer);\n          }\n        }\n        const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n        if (axesVisuals) {\n          for (let i = 0; i < axesVisuals.length; i++) {\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n              axesVisual.pickedIdColor = this._pickedIdColor;\n              axesVisual.pickFramebuffer = this._pickFrameBuffer;\n              axesVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              axesVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this.areLabelsVisible) {\n          for (let i = 0; i < this.labelSets.length; i++) {\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n              labelSetVisual.pickedIdColor = this._pickedIdColor;\n              labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n              labelSetVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              labelSetVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this.areImagesVisible) {\n          for (let i = 0; i < this.images.length; i++) {\n            const imageVisual = this.images[i];\n            if (imageVisual.isVisible) {\n              imageVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              imageVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this._backgroundShader.isInitialized) {\n          this._backgroundShader.prepare();\n          this._backgroundShader.color = fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n          this._backgroundShader.apply();\n          this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewport = i + this._viewportOffset;\n            this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n          this._gl.bindVertexArray(null);\n        }\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n          this._pickedType = PickHelper.decodeType(this._pickedPixels);\n          set$2(this._pickedIdColor, this._pickedPixels[0] / 255, this._pickedPixels[1] / 255, this._pickedPixels[2] / 255, this._pickedPixels[3] / 255);\n          this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n        } else {\n          set$2(this._pickedIdColor, 0, 0, 0, 0);\n          this._pickedId = 0;\n        }\n        if (this.transitionBuffers.length > 0 && this._quad.isInitialized) {\n          const viewport = this._viewportOffset;\n          this._postProcess(this.vMatrices[viewport], this.inverseVMatrices[viewport], this.pMatrices[viewport], this._viewports[viewport]);\n        }\n        if (this.isLassoPicking && this._lassoShader.isInitialized) {\n          this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n          this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n          const lassoWidth = this.lassoX1 - this.lassoX0;\n          const lassoHeight = this.lassoY1 - this.lassoY0;\n          this._lassoShader.prepare();\n          this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n          this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n          this._lassoShader.apply();\n          const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewportIndex = i + this._viewportOffset;\n            this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n            const viewport = this._viewports[viewportIndex];\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n            this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n            this._lassoMMatrix[10] = 1;\n            this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n            this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n            this._lassoShader.mMatrix = this._lassoMMatrix;\n            set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n            this._lassoShader.thickness = this._lassoThickness;\n            this._lassoShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      });\n    }\n    _renderTransitionBuffer(transitionBuffer) {\n      const currentBuffer = transitionBuffer.currentBuffer;\n      const previousBuffer = transitionBuffer.previousBuffer;\n      const currentPalette = transitionBuffer.currentPalette;\n      const previousPalette = transitionBuffer.previousPalette;\n      const currentAtlas = transitionBuffer.currentAtlas;\n      const previousAtlas = transitionBuffer.previousAtlas;\n      const unitType = transitionBuffer.unitType === void 0 ? currentBuffer.unitType : transitionBuffer.unitType;\n      const id2 = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n      const hoverId = id2 > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id2) : -1;\n      const activeId = transitionBuffer.activeId;\n      if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf)) {\n        this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._blockShader.prepare();\n        this._blockShader.mMatrix = this.mMatrix;\n        this._blockShader.time = this.transitionTime;\n        this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._blockShader.rangeMin = currentBuffer.from;\n        this._blockShader.rangeMax = currentBuffer.to;\n        this._blockShader.hover = hoverId;\n        this._blockShader.active = activeId;\n        this._blockShader.specularPower = this._config.specularPower;\n        this._blockShader.specularIntensity = this._config.specularIntensity;\n        this._blockShader.apply();\n        this._blockShader.isPickShader = false;\n        this._blockShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._blockShader.vMatrix = this.vMatrices[viewport];\n          this._blockShader.pMatrix = this.pMatrices[viewport];\n          this._blockShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._gl.cullFace(this._gl.FRONT);\n          this._blockShader.isPickShader = false;\n          this._blockShader.isShadowMap = true;\n          this._blockShader.vMatrix = this._shadowVMatrix;\n          this._blockShader.pMatrix = this._shadowPMatrix;\n          this._blockShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n          this._gl.cullFace(this._gl.BACK);\n        }\n        if (this.isPickingEnabled) {\n          this._blockShader.isPickShader = true;\n          this._blockShader.isShadowMap = false;\n          this._blockShader.pMatrix = this.pickPMatrix;\n          this._blockShader.vMatrix = this.pickVMatrix;\n          this._blockShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf)) {\n        this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sphereShader.prepare();\n        this._sphereShader.mMatrix = this.mMatrix;\n        this._sphereShader.time = this.transitionTime;\n        this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sphereShader.rangeMin = currentBuffer.from;\n        this._sphereShader.rangeMax = currentBuffer.to;\n        this._sphereShader.hover = hoverId;\n        this._sphereShader.active = activeId;\n        this._sphereShader.specularPower = this._config.specularPower;\n        this._sphereShader.specularIntensity = this._config.specularIntensity;\n        this._sphereShader.apply();\n        this._sphereShader.isPickShader = false;\n        this._sphereShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._sphereShader.vMatrix = this.vMatrices[viewport];\n          this._sphereShader.pMatrix = this.pMatrices[viewport];\n          this._sphereShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._sphereShader.isPickShader = false;\n          this._sphereShader.isShadowMap = true;\n          this._sphereShader.vMatrix = this._shadowVMatrix;\n          this._sphereShader.pMatrix = this._shadowPMatrix;\n          this._sphereShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n        }\n        if (this.isPickingEnabled) {\n          this._sphereShader.isPickShader = true;\n          this._sphereShader.isShadowMap = false;\n          this._sphereShader.pMatrix = this.pickPMatrix;\n          this._sphereShader.vMatrix = this.pickVMatrix;\n          this._sphereShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n        this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._cylinderShader.prepare();\n        this._cylinderShader.mMatrix = this.mMatrix;\n        this._cylinderShader.time = this.transitionTime;\n        this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._cylinderShader.rangeMin = currentBuffer.from;\n        this._cylinderShader.rangeMax = currentBuffer.to;\n        this._cylinderShader.hover = hoverId;\n        this._cylinderShader.active = activeId;\n        this._cylinderShader.specularPower = this._config.specularPower;\n        this._cylinderShader.specularIntensity = this._config.specularIntensity;\n        this._cylinderShader.apply();\n        this._cylinderShader.isPickShader = false;\n        this._cylinderShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._cylinderShader.vMatrix = this.vMatrices[viewport];\n          this._cylinderShader.pMatrix = this.pMatrices[viewport];\n          this._cylinderShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._cylinderShader.isPickShader = false;\n          this._cylinderShader.isShadowMap = true;\n          this._cylinderShader.vMatrix = this._shadowVMatrix;\n          this._cylinderShader.pMatrix = this._shadowPMatrix;\n          this._cylinderShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n        }\n        if (this.isPickingEnabled) {\n          this._cylinderShader.isPickShader = true;\n          this._cylinderShader.isShadowMap = false;\n          this._cylinderShader.pMatrix = this.pickPMatrix;\n          this._cylinderShader.vMatrix = this.pickVMatrix;\n          this._cylinderShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n        this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n        this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n        this._sdfShader.prepare();\n        this._sdfShader.mMatrix = this.mMatrix;\n        this._sdfShader.time = this.transitionTime;\n        this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sdfShader.rangeMin = currentBuffer.from;\n        this._sdfShader.rangeMax = currentBuffer.to;\n        this._sdfShader.hover = hoverId;\n        this._sdfShader.active = activeId;\n        this._sdfShader.specularPower = this._config.specularPower;\n        this._sdfShader.specularIntensity = this._config.specularIntensity;\n        this._sdfShader.apply();\n        this._sdfShader.isPickShader = false;\n        this._sdfShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._sdfShader.vMatrix = this.vMatrices[viewport];\n          this._sdfShader.pMatrix = this.pMatrices[viewport];\n          this._sdfShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._gl.cullFace(this._gl.FRONT);\n          this._sdfShader.isPickShader = false;\n          this._sdfShader.isShadowMap = true;\n          this._sdfShader.vMatrix = this._shadowVMatrix;\n          this._sdfShader.pMatrix = this._shadowPMatrix;\n          this._sdfShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n          this._gl.cullFace(this._gl.BACK);\n        }\n        if (this.isPickingEnabled) {\n          this._sdfShader.isPickShader = true;\n          this._sdfShader.isShadowMap = false;\n          this._sdfShader.pMatrix = this.pickPMatrix;\n          this._sdfShader.vMatrix = this.pickVMatrix;\n          this._sdfShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      }\n    }\n    _postProcess(vMatrix, inverseVMatrix, pMatrix, viewport) {\n      if (this._deferredShader.isInitialized) {\n        this._gl.disable(this._gl.DEPTH_TEST);\n        let ssaoTexture;\n        if (this._config.isSsaoEnabled && this._ssaoShader.isInitialized) {\n          this._gl.viewport(0, 0, this._config.ssaoWidth, this._config.ssaoHeight);\n          ssaoTexture = this._ssaoTexture1;\n          this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer1);\n          this._ssaoShader.vertexBuffer = this._quad.vertexBuffer;\n          this._ssaoShader.indexBuffer = this._quad.indexBuffer;\n          this._ssaoShader.texture2D1 = this._positionTexture;\n          this._ssaoShader.texture2D2 = this._normalTexture;\n          this._ssaoShader.texture2D3 = this._ssaoNoiseTexture;\n          this._ssaoShader.prepare();\n          this._ssaoShader.pMatrix = pMatrix;\n          this._ssaoShader.ssaoNoiseSize = this._config.ssaoNoiseSize;\n          this._ssaoShader.ssaoRadius = this._config.ssaoRadius;\n          this._ssaoShader.ssaoPower = this._config.ssaoPower;\n          this._ssaoShader.ssaoKernel = this._ssaoSampleKernel;\n          this._ssaoShader.left = 0;\n          this._ssaoShader.top = 0;\n          this._ssaoShader.width = this._config.ssaoWidth;\n          this._ssaoShader.height = this._config.ssaoHeight;\n          this._ssaoShader.apply();\n          this._ssaoShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          if (this._config.ssaoBlurEnabled && this._boxShader.isInitialized) {\n            ssaoTexture = this._ssaoTexture2;\n            this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer2);\n            this._boxShader.vertexBuffer = this._quad.vertexBuffer;\n            this._boxShader.indexBuffer = this._quad.indexBuffer;\n            this._boxShader.texture2D = this._ssaoTexture1;\n            this._boxShader.prepare();\n            this._boxShader.left = 0;\n            this._boxShader.top = 0;\n            this._boxShader.width = this._config.ssaoWidth;\n            this._boxShader.height = this._config.ssaoHeight;\n            this._boxShader.apply();\n            this._boxShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n        this._gl.viewport(viewport.left, viewport.top, viewport.width, viewport.height);\n        let postProcessFrameBuffer = this._postProcessFrameBuffer1;\n        this._shaderResources.bindFramebuffer(postProcessFrameBuffer);\n        this._deferredShader.vertexBuffer = this._quad.vertexBuffer;\n        this._deferredShader.indexBuffer = this._quad.indexBuffer;\n        this._deferredShader.texture2D1 = this._positionTexture;\n        this._deferredShader.texture2D2 = this._colorTexture;\n        this._deferredShader.texture2D3 = this._normalTexture;\n        this._deferredShader.texture2D4 = this._config.isSsaoEnabled ? ssaoTexture : null;\n        this._deferredShader.texture2D5 = this._shadowDepthTexture;\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n        this._deferredShader.prepare();\n        this._deferredShader.isShadowEnabled = this._config.isShadowEnabled;\n        this._deferredShader.isSsaoEnabled = this._config.isSsaoEnabled;\n        this._deferredShader.inverseVMatrix = inverseVMatrix;\n        this._deferredShader.shadowVMatrix = this._shadowVMatrix;\n        this._deferredShader.shadowPMatrix = this._shadowPMatrix;\n        this._deferredShader.vMatrix = vMatrix;\n        this._deferredShader.keyLightIntensity = this._config.keyLightIntensity;\n        this._deferredShader.fillLight1Intensity = this._config.fillLight1Intensity;\n        this._deferredShader.fillLight2Intensity = this._config.fillLight2Intensity;\n        this._core.camera.getPosition(this._cameraPosition);\n        fromMat4(this._cameraRotation, vMatrix);\n        set$3(this._position, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n        normalize$2(this._deferredShader.directionToKeyLight, this._config.keyLightPosition);\n        subtract(this._direction, this._cameraPosition, this._position);\n        normalize$2(this._direction, this._direction);\n        add(this._deferredShader.keyLightHalfAngle, this._direction, this._deferredShader.directionToKeyLight);\n        normalize$2(this._deferredShader.keyLightHalfAngle, this._deferredShader.keyLightHalfAngle);\n        copy$3(this._deferredShader.directionToFillLight1, this._config.fillLight1Position);\n        copy$3(this._deferredShader.directionToFillLight2, this._config.fillLight2Position);\n        this._deferredShader.left = viewport.left;\n        this._deferredShader.top = viewport.top;\n        this._deferredShader.width = viewport.width;\n        this._deferredShader.height = viewport.height;\n        this._deferredShader.shadowMapWidth = this._config.shadowWidth;\n        this._deferredShader.shadowMapHeight = this._config.shadowHeight;\n        this._deferredShader.ambientIntensity = this._config.ambientIntensity;\n        this._deferredShader.materialIntensity = this._config.materialIntensity;\n        this._deferredShader.specularPower = this._config.specularPower;\n        this._deferredShader.specularIntensity = this._config.specularIntensity;\n        this._deferredShader.apply();\n        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        const widthHalf = Math.round(viewport.width / 2);\n        const heightHalf = Math.round(viewport.height / 2);\n        const widthQuarter = Math.round(widthHalf / 2);\n        const heightQuarter = Math.round(heightHalf / 2);\n        const widthEighth = Math.round(widthQuarter / 2);\n        const heightEighth = Math.round(heightQuarter / 2);\n        const widthSixteenth = Math.round(widthEighth / 2);\n        const heightSixteenth = Math.round(heightEighth / 2);\n        if (this._config.isDofEnabled && this._dofBlurShader.isInitialized && this._dofCombineShader.isInitialized) {\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n          this._dofBlurShader.vertexBuffer = this._quad.vertexBuffer;\n          this._dofBlurShader.indexBuffer = this._quad.indexBuffer;\n          this._dofBlurShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._dofBlurShader.texture2D2 = this._positionTexture;\n          this._dofBlurShader.prepare();\n          this._dofBlurShader.focusDepth = this._config.dofFocusDistance;\n          this._dofBlurShader.nearFocusDepth = this._config.dofFocusDistance - this._config.dofFocusRange / 2;\n          this._dofBlurShader.farFocusDepth = this._config.dofFocusDistance + this._config.dofFocusRange / 2;\n          this._dofBlurShader.maxBackgroundBlur = this._config.dofMaxBackgroundBlur;\n          this._dofBlurShader.left = viewport.left;\n          this._dofBlurShader.top = viewport.top;\n          this._dofBlurShader.width = viewport.width;\n          this._dofBlurShader.height = viewport.height;\n          this._dofBlurShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n          this._dofCombineShader.vertexBuffer = this._quad.vertexBuffer;\n          this._dofCombineShader.indexBuffer = this._quad.indexBuffer;\n          this._dofCombineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._dofCombineShader.texture2D2 = this._postProcessDofTexture;\n          this._dofCombineShader.prepare();\n          this._dofCombineShader.focusDepth = this._config.dofFocusDistance;\n          this._dofCombineShader.left = viewport.left;\n          this._dofCombineShader.top = viewport.top;\n          this._dofCombineShader.width = viewport.width;\n          this._dofCombineShader.height = viewport.height;\n          this._dofCombineShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this._config.isBloomEnabled && this._brightPassShader.isInitialized && this._gaussianShader.isInitialized) {\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthHalf;\n          this._brightPassShader.height = heightHalf;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessHalfTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthQuarter;\n          this._brightPassShader.height = heightQuarter;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessQuarterTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthEighth;\n          this._brightPassShader.height = heightEighth;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessEighthTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthSixteenth;\n          this._brightPassShader.height = heightSixteenth;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessHalfTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthHalf;\n          this._gaussianShader.height = heightHalf;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessHalfTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessQuarterTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthQuarter;\n          this._gaussianShader.height = heightQuarter;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessQuarterTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessEighthTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthEighth;\n          this._gaussianShader.height = heightEighth;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessEighthTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessSixteenthTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthSixteenth;\n          this._gaussianShader.height = heightSixteenth;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessSixteenthTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this._config.isFxaaEnabled && this._fxaaShader.isInitialized) {\n          postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n          this._fxaaShader.vertexBuffer = this._quad.vertexBuffer;\n          this._fxaaShader.indexBuffer = this._quad.indexBuffer;\n          this._fxaaShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._fxaaShader.prepare();\n          this._fxaaShader.left = viewport.left;\n          this._fxaaShader.top = viewport.top;\n          this._fxaaShader.width = viewport.width;\n          this._fxaaShader.height = viewport.height;\n          this._fxaaShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        this._shaderResources.bindFramebuffer(null);\n        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n        this._combineShader.vertexBuffer = this._quad.vertexBuffer;\n        this._combineShader.indexBuffer = this._quad.indexBuffer;\n        this._combineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n        if (this._config.isBloomEnabled) {\n          this._combineShader.texture2D2 = this._postProcessHalfTexture1;\n          this._combineShader.texture2D3 = this._postProcessQuarterTexture1;\n          this._combineShader.texture2D4 = this._postProcessEighthTexture1;\n          this._combineShader.texture2D5 = this._postProcessSixteenthTexture1;\n        } else {\n          this._combineShader.texture2D2 = null;\n          this._combineShader.texture2D3 = null;\n          this._combineShader.texture2D4 = null;\n          this._combineShader.texture2D5 = null;\n        }\n        this._combineShader.prepare();\n        this._combineShader.viewport = viewport;\n        this._combineShader.intensity = this._config.bloomIntensity;\n        this._combineShader.apply();\n        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n      }\n    }\n  }\n  (function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  });\n  class MaterialBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * MaterialBufferData.SIZE);\n      this.TYPE_OFFSET = 0 / 4;\n      this.FUZZ_OFFSET = 4 / 4;\n      this.REFRACTIVE_INDEX_OFFSET = 8 / 4;\n      this.TEXTURE_ID_OFFSET = 12 / 4;\n      this.COLOR_OFFSET = 16 / 4;\n      this.GLOSSINESS_OFFSET = 28 / 4;\n      this.ID_COLOR_OFFSET = 32 / 4;\n      this.DENSITY_OFFSET = 48 / 4;\n    }\n    getType(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getFuzz(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.FUZZ_OFFSET];\n    }\n    setFuzz(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.FUZZ_OFFSET] = value2;\n    }\n    getRefractiveIndex(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.REFRACTIVE_INDEX_OFFSET];\n    }\n    setRefractiveIndex(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.REFRACTIVE_INDEX_OFFSET] = value2;\n    }\n    getTextureId(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.TEXTURE_ID_OFFSET];\n    }\n    setTextureId(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.TEXTURE_ID_OFFSET] = value2;\n    }\n    getColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getGlossiness(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.GLOSSINESS_OFFSET];\n    }\n    setGlossiness(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.GLOSSINESS_OFFSET] = value2;\n    }\n    getDensity(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.DENSITY_OFFSET];\n    }\n    setDensity(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.DENSITY_OFFSET] = value2;\n    }\n    getIdColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.ID_COLOR_OFFSET;\n      set$2(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setIdColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.ID_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  MaterialBufferData.SIZE = 64 / 4;\n  class TextureBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * TextureBufferData.SIZE);\n      this.COLOR0_OFFSET = 0 / 4;\n      this.TYPE_OFFSET = 12 / 4;\n      this.COLOR1_OFFSET = 16 / 4;\n      this.SIZE0_OFFSET = 32 / 4;\n      this.SIZE1_OFFSET = 48 / 4;\n      this.CLIP_OFFSET = 64 / 4;\n      this.OFFSET_OFFSET = 80 / 4;\n    }\n    getType(index2) {\n      return this[TextureBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[TextureBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getColor0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR0_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getColor1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR1_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      set$2(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setSize0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getSize1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      set$2(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setSize1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getClip(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.CLIP_OFFSET;\n      set$2(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setClip(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.CLIP_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getOffset(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.OFFSET_OFFSET;\n      set(value2, this[offset2], this[offset2 + 1]);\n    }\n    setOffset(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.OFFSET_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n  }\n  TextureBufferData.SIZE = 96 / 4;\n  class HittableBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * HittableBufferData.SIZE);\n      this.CENTER0_OFFSET = 0 / 4;\n      this.TYPE_OFFSET = 12 / 4;\n      this.SIZE0_OFFSET = 16 / 4;\n      this.MATERIAL_ID_OFFSET = 28 / 4;\n      this.ROTATION0_OFFSET = 32 / 4;\n      this.ROTATION1_OFFSET = 48 / 4;\n      this.TEXCOORD0_OFFSET = 64 / 4;\n      this.TEXCOORD1_OFFSET = 72 / 4;\n      this.CENTER1_OFFSET = 80 / 4;\n      this.ROUNDING_OFFSET = 92 / 4;\n      this.SIZE1_OFFSET = 96 / 4;\n      this.BOUNDARY_TYPE_OFFSET = 108 / 4;\n      this.TIME0_OFFSET = 112 / 4;\n      this.TIME1_OFFSET = 116 / 4;\n      this.TEX_ID_OFFSET = 120 / 4;\n      this.SDF_BUFFER_OFFSET = 124 / 4;\n      this.SDF_BORDER_OFFSET = 128 / 4;\n      this.PARAMETER_1_OFFSET = 132 / 4;\n      this.PARAMETER_2_OFFSET = 136 / 4;\n      this.MATERIAL_FUZZ_OFFSET = 140 / 4;\n      this.MATERIAL_GLOSS_OFFSET = 144 / 4;\n      this.MATERIAL_DENSITY_OFFSET = 148 / 4;\n      this.MATERIAL_REFRACTIVE_INDEX_OFFSET = 152 / 4;\n      this.MATERIAL_COLOR_OFFSET = 160 / 4;\n      this.MATERIAL_TYPE_ID_OFFSET = 172 / 4;\n      this.SEGMENT_COLOR_OFFSET = 176 / 4;\n      this.TEXTURE_TYPE_ID_OFFSET = 192 / 4;\n      this.TEXTURE_ID_OFFSET = 196 / 4;\n    }\n    getType(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getCenter0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER0_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getCenter1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER1_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getTime0(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TIME0_OFFSET];\n    }\n    setTime0(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TIME0_OFFSET] = value2;\n    }\n    getTime1(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TIME1_OFFSET];\n    }\n    setTime1(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TIME1_OFFSET] = value2;\n    }\n    getSize0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getRotation0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION0_OFFSET;\n      set$1(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getRotation1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION1_OFFSET;\n      set$1(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getTexCoord0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD0_OFFSET;\n      set(value2, this[offset2], this[offset2 + 1]);\n    }\n    setTexCoord0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n    getTexCoord1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD1_OFFSET;\n      set(value2, this[offset2], this[offset2 + 1]);\n    }\n    setTexCoord1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n    getRounding(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.ROUNDING_OFFSET];\n    }\n    setRounding(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.ROUNDING_OFFSET] = value2;\n    }\n    getParameter1(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.PARAMETER_1_OFFSET];\n    }\n    setParameter1(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.PARAMETER_1_OFFSET] = value2;\n    }\n    getParameter2(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.PARAMETER_2_OFFSET];\n    }\n    setParameter2(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.PARAMETER_2_OFFSET] = value2;\n    }\n    getBoundaryType(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.BOUNDARY_TYPE_OFFSET];\n    }\n    setBoundaryType(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.BOUNDARY_TYPE_OFFSET] = value2;\n    }\n    getTexId(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TEX_ID_OFFSET];\n    }\n    setTexId(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TEX_ID_OFFSET] = value2;\n    }\n    getSdfBuffer(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.SDF_BUFFER_OFFSET];\n    }\n    setSdfBuffer(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.SDF_BUFFER_OFFSET] = value2;\n    }\n    getSdfBorder(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.SDF_BORDER_OFFSET];\n    }\n    setSdfBorder(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.SDF_BORDER_OFFSET] = value2;\n    }\n    getMaterialTypeId(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_TYPE_ID_OFFSET];\n    }\n    setMaterialTypeId(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_TYPE_ID_OFFSET] = value2;\n    }\n    getMaterialFuzz(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_FUZZ_OFFSET];\n    }\n    setMaterialFuzz(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_FUZZ_OFFSET] = value2;\n    }\n    getMaterialDensity(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_DENSITY_OFFSET];\n    }\n    setMaterialDensity(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_DENSITY_OFFSET] = value2;\n    }\n    getMaterialGloss(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_GLOSS_OFFSET];\n    }\n    setMaterialGloss(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_GLOSS_OFFSET] = value2;\n    }\n    getMaterialRefractiveIndex(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_REFRACTIVE_INDEX_OFFSET];\n    }\n    setMaterialRefractiveIndex(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_REFRACTIVE_INDEX_OFFSET] = value2;\n    }\n    getMaterialColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.MATERIAL_COLOR_OFFSET;\n      value2[0] = this[offset2];\n      value2[1] = this[offset2 + 1];\n      value2[2] = this[offset2 + 2];\n    }\n    setMaterialColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.MATERIAL_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSegmentColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SEGMENT_COLOR_OFFSET;\n      value2[0] = this[offset2];\n      value2[1] = this[offset2 + 1];\n      value2[2] = this[offset2 + 2];\n      value2[3] = this[offset2 + 3];\n    }\n    setSegmentColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SEGMENT_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  HittableBufferData.SIZE = 208 / 4;\n  class ComputeUniformBufferData extends Float32Array {\n    constructor() {\n      super(ComputeUniformBufferData.SIZE);\n      this.POSITION_OFFSET = 0 / 4;\n      this.WIDTH_OFFSET = 12 / 4;\n      this.RIGHT_OFFSET = 16 / 4;\n      this.HEIGHT_OFFSET = 28 / 4;\n      this.UP_OFFSET = 32 / 4;\n      this.SEED_OFFSET = 44 / 4;\n      this.FORWARD_OFFSET = 48 / 4;\n      this.FOV_OFFSET = 60 / 4;\n      this.BACKGROUND_COLOR_OFFSET = 64 / 4;\n      this.TIME0_OFFSET = 76 / 4;\n      this.AMBIENT_COLOR_OFFSET = 80 / 4;\n      this.TIME1_OFFSET = 92 / 4;\n      this.TILES_X = 96 / 4;\n      this.TILES_Y = 100 / 4;\n      this.TILE_OFFSET_X = 104 / 4;\n      this.TILE_OFFSET_Y = 108 / 4;\n      this.LOOKAT_OFFSET = 112 / 4;\n      this.APERTURE_OFFSET = 124 / 4;\n      this.FOCUS_DISTANCE_OFFSET = 128 / 4;\n      this.RAYS_PER_FRAME_OFFSET = 132 / 4;\n    }\n    getFocusDistance() {\n      return this[this.FOCUS_DISTANCE_OFFSET];\n    }\n    setFocusDistance(value2) {\n      this[this.FOCUS_DISTANCE_OFFSET] = value2;\n    }\n    getWidth() {\n      return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value2) {\n      this[this.WIDTH_OFFSET] = value2;\n    }\n    getHeight() {\n      return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value2) {\n      this[this.HEIGHT_OFFSET] = value2;\n    }\n    getSeed() {\n      return this[this.SEED_OFFSET];\n    }\n    setSeed(value2) {\n      this[this.SEED_OFFSET] = value2;\n    }\n    getRaysPerFrame() {\n      return this[this.RAYS_PER_FRAME_OFFSET];\n    }\n    setRaysPerFrame(value2) {\n      this[this.RAYS_PER_FRAME_OFFSET] = value2;\n    }\n    getFieldOfView() {\n      return this[this.FOV_OFFSET];\n    }\n    setFieldOfView(value2) {\n      this[this.FOV_OFFSET] = value2;\n    }\n    getAperture() {\n      return this[this.APERTURE_OFFSET];\n    }\n    setAperture(value2) {\n      this[this.APERTURE_OFFSET] = value2;\n    }\n    getPosition(value2) {\n      set$3(value2, this[this.POSITION_OFFSET], this[this.POSITION_OFFSET + 1], this[this.POSITION_OFFSET + 2]);\n    }\n    setPosition(value2) {\n      this[this.POSITION_OFFSET] = value2[0];\n      this[this.POSITION_OFFSET + 1] = value2[1];\n      this[this.POSITION_OFFSET + 2] = value2[2];\n    }\n    getRight(value2) {\n      set$3(value2, this[this.RIGHT_OFFSET], this[this.RIGHT_OFFSET + 1], this[this.RIGHT_OFFSET + 2]);\n    }\n    setRight(value2) {\n      this[this.RIGHT_OFFSET] = value2[0];\n      this[this.RIGHT_OFFSET + 1] = value2[1];\n      this[this.RIGHT_OFFSET + 2] = value2[2];\n    }\n    getUp(value2) {\n      set$3(value2, this[this.UP_OFFSET], this[this.UP_OFFSET + 1], this[this.UP_OFFSET + 2]);\n    }\n    setUp(value2) {\n      this[this.UP_OFFSET] = value2[0];\n      this[this.UP_OFFSET + 1] = value2[1];\n      this[this.UP_OFFSET + 2] = value2[2];\n    }\n    getForward(value2) {\n      set$3(value2, this[this.FORWARD_OFFSET], this[this.FORWARD_OFFSET + 1], this[this.FORWARD_OFFSET + 2]);\n    }\n    setForward(value2) {\n      this[this.FORWARD_OFFSET] = value2[0];\n      this[this.FORWARD_OFFSET + 1] = value2[1];\n      this[this.FORWARD_OFFSET + 2] = value2[2];\n    }\n    getBackgroundColor(value2) {\n      set$2(value2, this[this.BACKGROUND_COLOR_OFFSET], this[this.BACKGROUND_COLOR_OFFSET + 1], this[this.BACKGROUND_COLOR_OFFSET + 2], this[this.BACKGROUND_COLOR_OFFSET + 3]);\n    }\n    setBackgroundColor(value2) {\n      this[this.BACKGROUND_COLOR_OFFSET] = value2[0];\n      this[this.BACKGROUND_COLOR_OFFSET + 1] = value2[1];\n      this[this.BACKGROUND_COLOR_OFFSET + 2] = value2[2];\n      this[this.BACKGROUND_COLOR_OFFSET + 3] = value2[3];\n    }\n    getAmbientColor(value2) {\n      set$3(value2, this[this.AMBIENT_COLOR_OFFSET], this[this.AMBIENT_COLOR_OFFSET + 1], this[this.AMBIENT_COLOR_OFFSET + 2]);\n    }\n    setAmbientColor(value2) {\n      this[this.AMBIENT_COLOR_OFFSET] = value2[0];\n      this[this.AMBIENT_COLOR_OFFSET + 1] = value2[1];\n      this[this.AMBIENT_COLOR_OFFSET + 2] = value2[2];\n    }\n    getTime0() {\n      return this[this.TIME0_OFFSET];\n    }\n    setTime0(value2) {\n      this[this.TIME0_OFFSET] = value2;\n    }\n    getTime1() {\n      return this[this.TIME1_OFFSET];\n    }\n    setTime1(value2) {\n      this[this.TIME1_OFFSET] = value2;\n    }\n    getTilesX() {\n      return this[this.TILES_X];\n    }\n    setTilesX(value2) {\n      this[this.TILES_X] = value2;\n    }\n    getTilesY() {\n      return this[this.TILES_Y];\n    }\n    setTilesY(value2) {\n      this[this.TILES_Y] = value2;\n    }\n    getTileOffsetX() {\n      return this[this.TILE_OFFSET_X];\n    }\n    setTileOffsetX(value2) {\n      this[this.TILE_OFFSET_X] = value2;\n    }\n    getTileOffsetY() {\n      return this[this.TILE_OFFSET_Y];\n    }\n    setTileOffsetY(value2) {\n      this[this.TILE_OFFSET_Y] = value2;\n    }\n    getLookAt(value2) {\n      set$3(value2, this[this.LOOKAT_OFFSET], this[this.LOOKAT_OFFSET + 1], this[this.LOOKAT_OFFSET + 2]);\n    }\n    setLookAt(value2) {\n      this[this.LOOKAT_OFFSET] = value2[0];\n      this[this.LOOKAT_OFFSET + 1] = value2[1];\n      this[this.LOOKAT_OFFSET + 2] = value2[2];\n    }\n  }\n  ComputeUniformBufferData.SIZE = 144 / 4;\n  class FullscreenQuadUniformBufferData extends Float32Array {\n    constructor() {\n      super(FullscreenQuadUniformBufferData.SIZE);\n      this.WIDTH_OFFSET = 0 / 4;\n      this.HEIGHT_OFFSET = 4 / 4;\n      this.SPP_OFFSET = 8 / 4;\n      this.EXPOSURE_OFFSET = 12 / 4;\n      this.MIN_DEPTH_OFFSET = 16 / 4;\n      this.MAX_DEPTH_OFFSET = 20 / 4;\n      this.EDGE_NORMAL_OFFSET = 24 / 4;\n      this.EDGE_DEPTH_OFFSET = 28 / 4;\n      this.EDGE_FOREGROUND_OFFSET = 32 / 4;\n      this.EDGE_BACKGROUND_OFFSET = 48 / 4;\n    }\n    getWidth() {\n      return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value2) {\n      this[this.WIDTH_OFFSET] = value2;\n    }\n    getHeight() {\n      return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value2) {\n      this[this.HEIGHT_OFFSET] = value2;\n    }\n    getSamplesPerPixel() {\n      return this[this.SPP_OFFSET];\n    }\n    setSamplesPerPixel(value2) {\n      this[this.SPP_OFFSET] = value2;\n    }\n    getExposure() {\n      return this[this.EXPOSURE_OFFSET];\n    }\n    setExposure(value2) {\n      this[this.EXPOSURE_OFFSET] = value2;\n    }\n    getMinDepth() {\n      return this[this.MIN_DEPTH_OFFSET];\n    }\n    setMinDepth(value2) {\n      this[this.MIN_DEPTH_OFFSET] = value2;\n    }\n    getMaxDepth() {\n      return this[this.MAX_DEPTH_OFFSET];\n    }\n    setMaxDepth(value2) {\n      this[this.MAX_DEPTH_OFFSET] = value2;\n    }\n    getEdgeDepth() {\n      return this[this.EDGE_DEPTH_OFFSET];\n    }\n    setEdgeDepth(value2) {\n      this[this.EDGE_DEPTH_OFFSET] = value2;\n    }\n    getEdgeNormal() {\n      return this[this.EDGE_NORMAL_OFFSET];\n    }\n    setEdgeNormal(value2) {\n      this[this.EDGE_NORMAL_OFFSET] = value2;\n    }\n    getEdgeForeground(value2) {\n      set$2(value2, this[this.EDGE_FOREGROUND_OFFSET], this[this.EDGE_FOREGROUND_OFFSET + 1], this[this.EDGE_FOREGROUND_OFFSET + 2], this[this.EDGE_FOREGROUND_OFFSET + 3]);\n    }\n    setEdgeForeground(value2) {\n      this[this.EDGE_FOREGROUND_OFFSET] = value2[0];\n      this[this.EDGE_FOREGROUND_OFFSET + 1] = value2[1];\n      this[this.EDGE_FOREGROUND_OFFSET + 2] = value2[2];\n      this[this.EDGE_FOREGROUND_OFFSET + 3] = value2[3];\n    }\n    getEdgeBackground(value2) {\n      set$2(value2, this[this.EDGE_BACKGROUND_OFFSET], this[this.EDGE_BACKGROUND_OFFSET + 1], this[this.EDGE_BACKGROUND_OFFSET + 2], this[this.EDGE_BACKGROUND_OFFSET + 3]);\n    }\n    setEdgeBackground(value2) {\n      this[this.EDGE_BACKGROUND_OFFSET] = value2[0];\n      this[this.EDGE_BACKGROUND_OFFSET + 1] = value2[1];\n      this[this.EDGE_BACKGROUND_OFFSET + 2] = value2[2];\n      this[this.EDGE_BACKGROUND_OFFSET + 3] = value2[3];\n    }\n  }\n  FullscreenQuadUniformBufferData.SIZE = 64 / 4;\n  class LinearBVHNodeBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * LinearBVHNodeBufferData.SIZE);\n      this.CENTER_OFFSET = 0 / 4;\n      this.SIZE_OFFSET = 16 / 4;\n      this.PRIMITIVES_OFFSET_OFFSET = 12 / 4;\n      this.SECOND_CHILD_OFFSET_OFFSET = 28 / 4;\n      this.N_PRIMITIVES_OFFSET = 32 / 4;\n      this.AXIS_OFFSET = 36 / 4;\n    }\n    getCenter(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getPrimitivesOffset(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.PRIMITIVES_OFFSET_OFFSET];\n    }\n    setPrimitivesOffset(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.PRIMITIVES_OFFSET_OFFSET] = value2;\n    }\n    getSecondChildOffset(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.SECOND_CHILD_OFFSET_OFFSET];\n    }\n    setSecondChildOffset(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.SECOND_CHILD_OFFSET_OFFSET] = value2;\n    }\n    getNPrimitives(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.N_PRIMITIVES_OFFSET];\n    }\n    setNPrimitives(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.N_PRIMITIVES_OFFSET] = value2;\n    }\n    getAxis(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.AXIS_OFFSET];\n    }\n    setAxis(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.AXIS_OFFSET] = value2;\n    }\n  }\n  LinearBVHNodeBufferData.SIZE = 48 / 4;\n  class LightBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * LightBufferData.SIZE);\n      this.ROTATION_OFFSET = 0 / 4;\n      this.CENTER_OFFSET = 16 / 4;\n      this.TYPE_OFFSET = 28 / 4;\n      this.SIZE_OFFSET = 32 / 4;\n      this.COLOR_OFFSET = 48 / 4;\n    }\n    getType(index2) {\n      return this[LightBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[LightBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getCenter(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getColor(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getRotation(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.ROTATION_OFFSET;\n      set$1(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.ROTATION_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  LightBufferData.SIZE = 64 / 4;\n  (function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  });\n  function concat(...args) {\n    return args.reduce((p, c2) => c2 ? p.concat(c2) : p, []);\n  }\n  function allTruthy(...args) {\n    return args.reduce((p, c2) => c2 ? p.concat(c2) : p, []).filter(Boolean);\n  }\n  function push$1(arr, items) {\n    arr.push.apply(arr, items);\n  }\n  function addEl(tagName, parentElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n  }\n  function addDiv(parentElement, className2) {\n    const div = addEl(\"div\", parentElement);\n    if (className2) {\n      div.className = className2;\n    }\n    return div;\n  }\n  function outerSize$1(el) {\n    const cs = getComputedStyle(el);\n    const height2 = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width2 = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return { height: height2, width: width2 };\n  }\n  var isMergeableObject = function isMergeableObject2(value2) {\n    return isNonNullObject(value2) && !isSpecial(value2);\n  };\n  function isNonNullObject(value2) {\n    return !!value2 && typeof value2 === \"object\";\n  }\n  function isSpecial(value2) {\n    var stringValue = Object.prototype.toString.call(value2);\n    return stringValue === \"[object RegExp]\" || stringValue === \"[object Date]\" || isReactElement(value2);\n  }\n  var canUseSymbol = typeof Symbol === \"function\" && Symbol.for;\n  var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for(\"react.element\") : 60103;\n  function isReactElement(value2) {\n    return value2.$$typeof === REACT_ELEMENT_TYPE;\n  }\n  function emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n  }\n  function cloneUnlessOtherwiseSpecified(value2, options) {\n    return options.clone !== false && options.isMergeableObject(value2) ? deepmerge$1(emptyTarget(value2), value2, options) : value2;\n  }\n  function defaultArrayMerge(target2, source2, options) {\n    return target2.concat(source2).map(function(element2) {\n      return cloneUnlessOtherwiseSpecified(element2, options);\n    });\n  }\n  function mergeObject(target2, source2, options) {\n    var destination = {};\n    if (options.isMergeableObject(target2)) {\n      Object.keys(target2).forEach(function(key2) {\n        destination[key2] = cloneUnlessOtherwiseSpecified(target2[key2], options);\n      });\n    }\n    Object.keys(source2).forEach(function(key2) {\n      if (!options.isMergeableObject(source2[key2]) || !target2[key2]) {\n        destination[key2] = cloneUnlessOtherwiseSpecified(source2[key2], options);\n      } else {\n        destination[key2] = deepmerge$1(target2[key2], source2[key2], options);\n      }\n    });\n    return destination;\n  }\n  function deepmerge$1(target2, source2, options) {\n    options = options || {};\n    options.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    options.isMergeableObject = options.isMergeableObject || isMergeableObject;\n    var sourceIsArray = Array.isArray(source2);\n    var targetIsArray = Array.isArray(target2);\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n    if (!sourceAndTargetTypesMatch) {\n      return cloneUnlessOtherwiseSpecified(source2, options);\n    } else if (sourceIsArray) {\n      return options.arrayMerge(target2, source2, options);\n    } else {\n      return mergeObject(target2, source2, options);\n    }\n  }\n  deepmerge$1.all = function deepmergeAll(array2, options) {\n    if (!Array.isArray(array2)) {\n      throw new Error(\"first argument should be an array\");\n    }\n    return array2.reduce(function(prev, next) {\n      return deepmerge$1(prev, next, options);\n    }, {});\n  };\n  var deepmerge_1 = deepmerge$1;\n  const _deepmerge = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    default: deepmerge_1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function isObject(o) {\n    return Object.prototype.toString.call(o) === \"[object Object]\";\n  }\n  function isPlainObject(o) {\n    var ctor, prot;\n    if (isObject(o) === false) return false;\n    ctor = o.constructor;\n    if (ctor === void 0) return true;\n    prot = ctor.prototype;\n    if (isObject(prot) === false) return false;\n    if (prot.hasOwnProperty(\"isPrototypeOf\") === false) {\n      return false;\n    }\n    return true;\n  }\n  const deepmerge = deepmerge_1 || _deepmerge;\n  function clone(objectToClone) {\n    if (!objectToClone)\n      return objectToClone;\n    return deepmerge.all([objectToClone]);\n  }\n  const dontMerge = (destination, source2) => source2;\n  function deepMerge(...objectsToMerge) {\n    const objects = objectsToMerge.filter(Boolean);\n    return deepmerge.all(objects, { arrayMerge: dontMerge, isMergeableObject: isPlainObject });\n  }\n  function rgbToDeckglColor(c2) {\n    return [c2.r, c2.g, c2.b, c2.opacity * 255];\n  }\n  function colorIsEqual(a2, b2) {\n    if (a2.length !== b2.length)\n      return false;\n    for (let i = 0; i < a2.length; i++) {\n      if (a2[i] !== b2[i])\n        return false;\n    }\n    return true;\n  }\n  function colorFromString(cssColorSpecifier) {\n    if (cssColorSpecifier) {\n      const dc = color$2(cssColorSpecifier);\n      if (dc) {\n        const c2 = dc.rgb();\n        return rgbToDeckglColor(c2);\n      }\n    }\n  }\n  function colorToString(color2) {\n    const c2 = [...color2];\n    if (c2.length > 3) {\n      c2[3] /= 255;\n    }\n    return `rgba(${c2.join(\",\")})`;\n  }\n  function desaturate(color2, value2) {\n    const rgb2 = rgb$1(color2[0], color2[1], color2[2], color2[3] / 255);\n    const hslColor = hsl$1(rgb2);\n    hslColor.s = value2;\n    const c2 = hslColor.rgb();\n    return rgbToDeckglColor(c2);\n  }\n  const util = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    addDiv,\n    addEl,\n    allTruthy,\n    clone,\n    colorFromString,\n    colorIsEqual,\n    colorToString,\n    concat,\n    createElement,\n    deepMerge,\n    desaturate,\n    getActiveElementInfo,\n    mount,\n    outerSize: outerSize$1,\n    push: push$1,\n    setActiveElement\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const minHeight = \"100px\";\n  const minWidth = \"100px\";\n  const defaultPresenterStyle$1 = {\n    cssPrefix: \"vega-morphcharts-\",\n    defaultCubeColor: [128, 128, 128, 255],\n    highlightColor: [0, 0, 0, 255]\n  };\n  const defaultPresenterConfig = {\n    onCubeClick: (e, cube) => {\n    },\n    onCubeHover: (e, cube) => {\n    },\n    transitionDurations: {\n      position: 600,\n      stagger: 600,\n      view: 600\n    },\n    renderer: {\n      advanced: false,\n      advancedOptions: {},\n      basicOptions: {\n        antialias: true\n      }\n    }\n  };\n  function createStage(view) {\n    const stage = {\n      view,\n      cubeData: [],\n      pathData: [],\n      axes: {\n        x: [],\n        y: [],\n        z: []\n      },\n      gridLines: [],\n      textData: [],\n      legend: {\n        rows: {}\n      },\n      facets: []\n    };\n    return stage;\n  }\n  const groupStrokeWidth = 1;\n  const lineZ = 0;\n  const defaultView$1 = \"2d\";\n  const minZ = 0.5;\n  const min3dDepth = 0.05;\n  const minPixelSize = 0.5;\n  const zAxisEncodeColor = [7, 7, 7, 255];\n  const zAxisOutColor = [0, 0, 0, 255];\n  function defaultOnAxisItem(vegaItem, stageItem, stage, currAxis) {\n    if (colorIsEqual(stageItem.color, zAxisEncodeColor)) {\n      stageItem.color = zAxisOutColor;\n      if (currAxis.axisRole !== \"z\") {\n        const previousAxisRole = removeCurrentAxes(stage, currAxis);\n        if (previousAxisRole) {\n          currAxis.axisRole = \"z\";\n          stage.axes.z.push(currAxis);\n        }\n      }\n    }\n  }\n  function removeCurrentAxes(stage, currAxis) {\n    for (const axisRole in stage.axes) {\n      const axes = stage.axes[axisRole];\n      for (let i = 0; i < axes.length; i++) {\n        if (axes[i] === currAxis) {\n          axes.splice(i, 1);\n          return axisRole;\n        }\n      }\n    }\n  }\n  const defaults = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    createStage,\n    defaultOnAxisItem,\n    defaultPresenterConfig,\n    defaultPresenterStyle: defaultPresenterStyle$1,\n    defaultView: defaultView$1,\n    groupStrokeWidth,\n    lineZ,\n    min3dDepth,\n    minHeight,\n    minPixelSize,\n    minWidth,\n    minZ\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const vega = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null\n  };\n  const base = {\n    vega\n  };\n  function use$1(vega2) {\n    base.vega = vega2;\n  }\n  var PresenterElement;\n  (function(PresenterElement2) {\n    PresenterElement2[PresenterElement2[\"root\"] = 0] = \"root\";\n    PresenterElement2[PresenterElement2[\"gl\"] = 1] = \"gl\";\n    PresenterElement2[PresenterElement2[\"panel\"] = 2] = \"panel\";\n    PresenterElement2[PresenterElement2[\"legend\"] = 3] = \"legend\";\n    PresenterElement2[PresenterElement2[\"vegaControls\"] = 4] = \"vegaControls\";\n  })(PresenterElement || (PresenterElement = {}));\n  const LegendView = (props) => {\n    const rows = [];\n    const addRow = (row, i) => {\n      const fn2 = symbolMap[row.symbol.shape];\n      let jsx;\n      if (fn2) {\n        jsx = fn2(row.symbol);\n      } else {\n        jsx = createElement(\"span\", null, \"x\");\n      }\n      rows.push({\n        cells: [\n          { className: \"symbol\", content: jsx },\n          { className: \"label\", content: row.label, title: row.label }\n        ]\n      });\n    };\n    const sorted = Object.keys(props.legend.rows).sort((a2, b2) => +a2 - +b2);\n    sorted.forEach((i) => addRow(props.legend.rows[i]));\n    if (sorted.length) {\n      return createElement(Table$1, { rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\n        \"tr\",\n        { onClick: (e) => props.onClick(e, props.legend, null) },\n        createElement(\"th\", { colSpan: 2 }, props.legend.title)\n      ));\n    }\n  };\n  const symbolMap = {\n    square: function(symbol2) {\n      return createElement(\"div\", { style: {\n        height: `${symbol2.bounds.y2 - symbol2.bounds.y1}px`,\n        width: `${symbol2.bounds.x2 - symbol2.bounds.x1}px`,\n        backgroundColor: symbol2.fill,\n        borderColor: symbol2.fill\n      } });\n    }\n  };\n  function initializePanel(presenter) {\n    const rootDiv = createElement(\n      \"div\",\n      { className: className(PresenterElement.root, presenter) },\n      createElement(\"div\", { className: className(PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n      createElement(\n        \"div\",\n        { className: className(PresenterElement.panel, presenter) },\n        createElement(\"div\", { className: className(PresenterElement.vegaControls, presenter) }),\n        createElement(\"div\", { className: className(PresenterElement.legend, presenter) })\n      )\n    );\n    mount(rootDiv, presenter.el);\n  }\n  function className(type2, presenter) {\n    return `${presenter.style.cssPrefix}${PresenterElement[type2]}`;\n  }\n  function patchCubeArray(allocatedSize, empty, cubes) {\n    const patched = new Array(allocatedSize);\n    patched.fill(empty);\n    cubes.forEach((cube) => patched[cube.ordinal] = cube);\n    return patched;\n  }\n  const legendMap = {\n    \"legend-title\": function(legend2, textItem) {\n      legend2.title = textItem.text;\n    },\n    \"legend-symbol\": function(legend2, symbol2) {\n      const { bounds: bounds2, fill: fill2, shape: shape2 } = symbol2;\n      const legendRowSymbol = { bounds: bounds2, fill: fill2, shape: shape2 };\n      const i = symbol2.datum.index;\n      legend2.rows[i] = legend2.rows[i] || {};\n      legend2.rows[i].symbol = legendRowSymbol;\n    },\n    \"legend-label\": function(legend2, label2) {\n      const i = label2.datum.index;\n      legend2.rows[i] = legend2.rows[i] || {};\n      const row = legend2.rows[i];\n      row.label = label2.text;\n      row.value = label2.datum.value;\n    }\n  };\n  const markStager$5 = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(item) {\n      const fn2 = legendMap[item.mark.role];\n      if (fn2) {\n        fn2(stage.legend, item);\n      }\n    });\n  };\n  const markStager$4 = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(item) {\n      const { bounds: bounds2, height: height2, url, width: width2 } = item;\n      let { x1: x12, x2: x22, y1: y12, y2: y22 } = bounds2;\n      x12 += x2;\n      x22 += x2;\n      y12 += y2;\n      y22 += y2;\n      if (!stage.backgroundImages) {\n        stage.backgroundImages = [];\n      }\n      stage.backgroundImages.push({ bounds: { x1: x12, x2: x22, y1: y12, y2: y22 }, height: height2, url, width: width2 });\n    });\n  };\n  const markStager$3 = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(item) {\n      const noZ = item.z === void 0;\n      const z = noZ ? 0 : (item.z || 0) + minZ;\n      const depth = (noZ ? 0 : item.depth || 0) + min3dDepth;\n      const ty2 = -1;\n      const ordinal2 = options.assignCubeOrdinal(item.datum);\n      if (ordinal2 > options.maxOrdinal) {\n        options.maxOrdinal = ordinal2;\n      }\n      if (ordinal2 === void 0) ;\n      else {\n        const cube = {\n          ordinal: ordinal2,\n          size: [item.width, item.height, depth],\n          position: [x2 + (+item.x || 0), ty2 * (y2 + (+item.y || 0)) - +item.height, z],\n          color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n        };\n        cube.color[3] = item.opacity === void 0 ? 255 : 255 * item.opacity;\n        stage.cubeData.push(cube);\n      }\n    });\n  };\n  const markStager$2 = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(item) {\n      const x12 = item.x || 0;\n      const y12 = item.y || 0;\n      const x22 = item.x2 != null ? item.x2 : x12;\n      const y22 = item.y2 != null ? item.y2 : y12;\n      const lineItem = styledLine(x12 + x2, y12 + y2, x22 + x2, y22 + y2, item.stroke, item.strokeWidth);\n      const { currAxis } = options;\n      if (options.modifyAxis) {\n        options.modifyAxis(item, lineItem, stage, currAxis);\n      }\n      if (item.mark.role === \"axis-tick\") {\n        currAxis.ticks.push(lineItem);\n      } else if (item.mark.role === \"axis-domain\") {\n        currAxis.domain = lineItem;\n      } else {\n        stage.gridLines.push(lineItem);\n      }\n    });\n  };\n  function styledLine(x12, y12, x2, y2, stroke2, strokeWidth) {\n    const line2 = {\n      sourcePosition: [x12, -y12, lineZ],\n      //-1 = change direction of y from SVG to GL\n      targetPosition: [x2, -y2, lineZ],\n      color: colorFromString(stroke2),\n      strokeWidth\n    };\n    return line2;\n  }\n  function box(gx, gy, height2, width2, stroke2, strokeWidth, diagonals = false) {\n    const lines = [\n      styledLine(gx, gy, gx + width2, gy, stroke2, strokeWidth),\n      styledLine(gx + width2, gy, gx + width2, gy + height2, stroke2, strokeWidth),\n      styledLine(gx + width2, gy + height2, gx, gy + height2, stroke2, strokeWidth),\n      styledLine(gx, gy + height2, gx, gy, stroke2, strokeWidth)\n    ];\n    if (diagonals) {\n      lines.push(styledLine(gx, gy, gx + width2, gy + height2, stroke2, strokeWidth));\n      lines.push(styledLine(gx, gy + height2, gx + width2, gy, stroke2, strokeWidth));\n    }\n    return lines;\n  }\n  const ty = -1;\n  const markStager$1 = (options, stage, scene, x2, y2, groupType) => {\n    const g = Object.assign({ opacity: 1, strokeOpacity: 1, strokeWidth: 1 }, scene.items[0]);\n    const path2 = {\n      strokeWidth: g.strokeWidth,\n      strokeColor: colorFromString(g.stroke),\n      positions: scene.items.map((it) => [\n        it.x,\n        ty * it.y,\n        it.z || 0\n      ])\n    };\n    path2.strokeColor[3] *= g.strokeOpacity;\n    path2.strokeColor[3] *= g.opacity;\n    stage.pathData.push(path2);\n  };\n  const markStager = (options, stage, scene, x2, y2, groupType) => {\n    const ty2 = -1;\n    base.vega.sceneVisit(scene, function(item) {\n      if (!item.text)\n        return;\n      const size2 = item.fontSize;\n      const yOffset = 0;\n      const textItem = {\n        color: colorFromString(item.fill),\n        text: item.limit === void 0 ? item.text : base.vega.truncate(item.text, item.limit, \"right\", item.ellipsis || \"...\"),\n        //use dots instead of unicode ellipsis for\n        position: [x2 + (item.x || 0), ty2 * (y2 + (item.y || 0) + yOffset), 0],\n        size: size2,\n        angle: convertAngle(item.angle),\n        //textAnchor: convertAlignment(item.align),\n        //alignmentBaseline,\n        metaData: item.metaData\n      };\n      const { currAxis } = options;\n      if (options.modifyAxis) {\n        options.modifyAxis(item, textItem, stage, currAxis);\n      }\n      if (item.mark.role === \"axis-label\") {\n        const tickText = textItem;\n        tickText.value = item.datum.value;\n        currAxis.tickText.push(tickText);\n      } else if (item.mark.role === \"axis-title\") {\n        currAxis.title = textItem;\n      } else {\n        stage.textData.push(textItem);\n      }\n    });\n  };\n  function convertAngle(vegaTextAngle) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n      return 360 - vegaTextAngle;\n    }\n    return 0;\n  }\n  var GroupType;\n  (function(GroupType2) {\n    GroupType2[GroupType2[\"none\"] = 0] = \"none\";\n    GroupType2[GroupType2[\"legend\"] = 1] = \"legend\";\n    GroupType2[GroupType2[\"xAxis\"] = 2] = \"xAxis\";\n    GroupType2[GroupType2[\"yAxis\"] = 3] = \"yAxis\";\n    GroupType2[GroupType2[\"zAxis\"] = 4] = \"zAxis\";\n  })(GroupType || (GroupType = {}));\n  function getAxisGroupType(item, options) {\n    const axisItem = item;\n    const axisMark = axisItem === null || axisItem === void 0 ? void 0 : axisItem.mark;\n    if ((axisMark === null || axisMark === void 0 ? void 0 : axisMark.zindex) === options.zAxisZindex && options.zAxisZindex !== void 0) {\n      return GroupType.zAxis;\n    }\n    switch (axisItem.orient) {\n      case \"bottom\":\n      case \"top\":\n        return GroupType.xAxis;\n      case \"left\":\n      case \"right\":\n        return GroupType.yAxis;\n    }\n  }\n  function convertGroupRole(item, options) {\n    if (item.mark.role === \"legend\")\n      return GroupType.legend;\n    if (item.mark.role === \"axis\") {\n      const groupType = getAxisGroupType(item, options);\n      if (groupType !== void 0) {\n        return groupType;\n      }\n    }\n  }\n  const group = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(g) {\n      const gx = g.x || 0, gy = g.y || 0;\n      if (g.context && g.context.background && !stage.backgroundColor) {\n        stage.backgroundColor = colorFromString(g.context.background);\n      }\n      if (g.stroke) {\n        const facetRect = {\n          datum: g.datum,\n          lines: box(gx + x2, gy + y2, g.height, g.width, g.stroke, groupStrokeWidth)\n        };\n        stage.facets.push(facetRect);\n      }\n      groupType = convertGroupRole(g, options) || groupType;\n      setCurrentAxis(options, stage, groupType);\n      base.vega.sceneVisit(g, function(item) {\n        mainStager(options, stage, item, gx + x2, gy + y2, groupType);\n      });\n    });\n  };\n  function setCurrentAxis(options, stage, groupType) {\n    let axisRole;\n    switch (groupType) {\n      case GroupType.xAxis:\n        axisRole = \"x\";\n        break;\n      case GroupType.yAxis:\n        axisRole = \"y\";\n        break;\n      case GroupType.zAxis:\n        axisRole = \"z\";\n        break;\n      default:\n        return;\n    }\n    options.currAxis = {\n      axisRole,\n      domain: null,\n      tickText: [],\n      ticks: []\n    };\n    stage.axes[axisRole].push(options.currAxis);\n  }\n  const markStagers = {\n    group,\n    legend: markStager$5,\n    image: markStager$4,\n    rect: markStager$3,\n    rule: markStager$2,\n    line: markStager$1,\n    text: markStager\n  };\n  const mainStager = (options, stage, scene, x2, y2, groupType) => {\n    if (scene.marktype !== \"group\" && groupType === GroupType.legend) {\n      markStager$5(options, stage, scene);\n    } else {\n      const markStager2 = markStagers[scene.marktype];\n      if (markStager2) {\n        markStager2(options, stage, scene, x2, y2, groupType);\n      }\n    }\n  };\n  function sceneToStage(options, stage, scene) {\n    mainStager(options, stage, scene, 0, 0, null);\n    sortAxis(stage.axes.x, 0);\n    sortAxis(stage.axes.y, 1);\n    sortAxis(stage.axes.z, 1);\n  }\n  function sortAxis(axes, dim) {\n    axes.forEach((axis) => {\n      if (axis.domain)\n        orderDomain(axis.domain, dim);\n      axis.ticks.sort((a2, b2) => a2.sourcePosition[dim] - b2.sourcePosition[dim]);\n      axis.tickText.sort((a2, b2) => a2.position[dim] - b2.position[dim]);\n    });\n  }\n  function orderDomain(domain2, dim) {\n    if (domain2.sourcePosition[dim] > domain2.targetPosition[dim]) {\n      const temp2 = domain2.targetPosition;\n      domain2.targetPosition = domain2.sourcePosition;\n      domain2.sourcePosition = temp2;\n    }\n  }\n  function outerBounds(b1, b2) {\n    if (!b1 && !b2)\n      return;\n    if (!b1)\n      return b2;\n    if (!b2)\n      return b1;\n    const minProps = [\n      \"minBoundsX\",\n      \"minBoundsY\",\n      \"minBoundsZ\"\n    ];\n    const maxProps = [\n      \"maxBoundsX\",\n      \"maxBoundsY\",\n      \"maxBoundsZ\"\n    ];\n    const result = {};\n    minProps.forEach((p) => result[p] = notNull(Math.min, b1[p], b2[p]));\n    maxProps.forEach((p) => result[p] = notNull(Math.max, b1[p], b2[p]));\n    return result;\n  }\n  function notNull(fn2, v1, v2) {\n    if (v1 == null && v2 == null)\n      return null;\n    if (v1 == null)\n      return v2;\n    if (v2 == null)\n      return v1;\n    return fn2(v1, v2);\n  }\n  function increment(b2, minBoundsX, minBoundsY, minBoundsZ, maxBoundsX, maxBoundsY, maxBoundsZ) {\n    return outerBounds(b2, {\n      minBoundsX,\n      minBoundsY,\n      minBoundsZ,\n      maxBoundsX,\n      maxBoundsY,\n      maxBoundsZ\n    });\n  }\n  const createAxesLayer = (props) => {\n    const { config, height: height2, ref: ref2, stage } = props;\n    const { core } = ref2;\n    const { renderer } = core;\n    const { x: x2, y: y2, z } = stage.axes;\n    const xyz = [...x2, ...y2, ...z];\n    renderer.currentAxes = [];\n    if (!xyz.length) {\n      renderer.axesVisibility = AxesVisibility.none;\n      return;\n    }\n    renderer.axesVisibility = AxesVisibility.current;\n    const correlation = new AxesCorrelation(stage, 3);\n    const { axesSets, labels } = correlation;\n    const grid2 = correlation.getGrid();\n    if (grid2.byColumn[0]) {\n      grid2.byColumn[0].forEach((row) => {\n        row.axesSet.showFacetTitleY = true;\n      });\n      grid2.byRow[0].forEach((col) => {\n        col.axesSet.showFacetTitleX = true;\n      });\n    }\n    if (grid2.rows > 1) {\n      const { byRow } = grid2;\n      byRow[0].forEach(({ axesSet }, col) => {\n        if (!axesSet.y) {\n          if (byRow[1][col].axesSet) {\n            byRow[1][col].axesSet.x.tickText = axesSet.x.tickText;\n            byRow[1][col].axesSet.showFacetTitleX = axesSet.showFacetTitleX;\n            delete axesSet.x;\n          }\n        }\n      });\n    }\n    let bounds2;\n    const allAxesSetBounds = [];\n    let anyZ = false;\n    for (let i = 0; i < axesSets.length; i++) {\n      if (axesSets[i].z) {\n        anyZ = true;\n        break;\n      }\n    }\n    const is3d = stage.view === \"3d\" && anyZ;\n    axesSets.forEach((axesSet) => {\n      if (!axesSet.x && !axesSet.y)\n        return;\n      const axesSetBounds = {\n        axesSet,\n        maxBoundsX: null,\n        maxBoundsY: null,\n        maxBoundsZ: null,\n        minBoundsX: null,\n        minBoundsY: null,\n        minBoundsZ: null\n      };\n      if (is3d) {\n        const zBounds = getDomainBounds(1, axesSet.z);\n        axesSetBounds.minBoundsZ = -zBounds.maxBounds;\n        axesSetBounds.maxBoundsZ = -zBounds.minBounds;\n      }\n      const yBounds = getDomainBounds(1, axesSet.y);\n      axesSetBounds.minBoundsY = yBounds.minBounds;\n      axesSetBounds.maxBoundsY = yBounds.maxBounds;\n      axesSetBounds.y = yBounds.minBounds;\n      axesSetBounds.h = yBounds.maxBounds - yBounds.minBounds;\n      const xBounds = getDomainBounds(0, axesSet.x);\n      axesSetBounds.minBoundsX = xBounds.minBounds;\n      axesSetBounds.maxBoundsX = xBounds.maxBounds;\n      axesSetBounds.x = xBounds.minBounds;\n      axesSetBounds.w = xBounds.maxBounds - xBounds.minBounds;\n      allAxesSetBounds.push(axesSetBounds);\n      bounds2 = outerBounds(bounds2, axesSetBounds);\n    });\n    const facetLabelX = labels.filter((label2) => label2.axisRole === \"x\")[0];\n    const facetLabelY = labels.filter((label2) => label2.axisRole === \"y\")[0];\n    core.inputManager.pickAxesTitleCallback = ({ axis, axes, manipulator }) => {\n      const axesSet = axesSets[axes];\n      let a2;\n      let f;\n      switch (axis) {\n        case 0: {\n          a2 = axesSet.x;\n          f = facetLabelX;\n          break;\n        }\n        case 1: {\n          a2 = axesSet.y;\n          f = facetLabelY;\n          break;\n        }\n        case 2: {\n          a2 = axesSet.z;\n          break;\n        }\n      }\n      if (a2) {\n        config.onTextClick(manipulator.event, a2.title || f.title);\n      }\n    };\n    allAxesSetBounds.forEach((axesSetBounds) => {\n      const { axesSet } = axesSetBounds;\n      if (!axesSet.x && !axesSet.y)\n        return;\n      const cartesian2 = new (is3d ? Cartesian3dAxes : Cartesian2dAxes)(core);\n      cartesian2.isDivisionPickingEnabled = [false, false, false];\n      cartesian2.arePickDivisionsVisible = [false, false, false];\n      cartesian2.isLabelPickingEnabled = [false, false, false];\n      cartesian2.isTitlePickingEnabled = [false, false, false];\n      cartesian2.isGridPickingEnabled = false;\n      cartesian2.isHeadingPickingEnabled = [false, false, false];\n      createAxes(cartesian2, 0, 0, axesSet.x, AxesTextOrientation.perpendicular, height2, props, axesSet.showFacetTitleX && facetLabelX);\n      createAxes(cartesian2, 1, 1, axesSet.y, AxesTextOrientation.perpendicular, height2, props, axesSet.showFacetTitleY && facetLabelY);\n      if (is3d) {\n        createAxes(cartesian2, 1, 2, axesSet.z, AxesTextOrientation.perpendicular, height2, props);\n      }\n      configCartesianAxes(is3d, bounds2, cartesian2);\n      const { maxBoundsX, maxBoundsY, minBoundsX, minBoundsY } = bounds2;\n      const w2 = maxBoundsX - minBoundsX;\n      const h2 = maxBoundsY - minBoundsY;\n      cartesian2.scalingX = axesSetBounds.w / w2;\n      cartesian2.scalingY = axesSetBounds.h / h2;\n      cartesian2.offsetX = (axesSetBounds.x - minBoundsX + axesSetBounds.w / 2) / w2 - 0.5;\n      cartesian2.offsetY = (axesSetBounds.y - minBoundsY + axesSetBounds.h / 2) / h2 - 0.5;\n      const aspect = h2 / w2;\n      if (aspect > 1) {\n        cartesian2.offsetX /= aspect;\n      } else {\n        cartesian2.offsetY *= aspect;\n      }\n      const axes = is3d ? renderer.createCartesian3dAxesVisual(cartesian2) : renderer.createCartesian2dAxesVisual(cartesian2);\n      renderer.currentAxes.push(axes);\n      props.config.onAxesComplete && props.config.onAxesComplete(cartesian2);\n    });\n    return { bounds: bounds2 };\n  };\n  const nullDomain = {\n    sourcePosition: [0, 0, 0],\n    targetPosition: [0, 0, 0]\n  };\n  class AxesCorrelation {\n    constructor(stage, dimensions) {\n      this.dimensions = dimensions;\n      const { x: x2, y: y2, z } = stage.axes;\n      this.axesSets = [];\n      this.labels = [];\n      [x2, y2, z].forEach((axes) => {\n        axes.forEach((axis) => {\n          if (this.axesSets.length === 0) {\n            this.initialize(axis);\n          } else {\n            this.correlate(axis);\n          }\n        });\n      });\n    }\n    getGrid() {\n      const mapCols = {};\n      const mapRows = {};\n      this.axesSets.forEach((axesSet) => {\n        var _a;\n        const domain2 = (_a = axesSet === null || axesSet === void 0 ? void 0 : axesSet.x) === null || _a === void 0 ? void 0 : _a.domain;\n        if (!domain2)\n          return;\n        const col = domain2.sourcePosition[0].toString();\n        const row = domain2.sourcePosition[1].toString();\n        if (!mapCols[col]) {\n          mapCols[col] = {};\n        }\n        mapCols[col][row] = axesSet;\n        mapRows[row] = null;\n      });\n      const colKeys = Object.keys(mapCols).sort((a2, b2) => +a2 - +b2);\n      const rowKeys = Object.keys(mapRows).sort((a2, b2) => +a2 - +b2);\n      return {\n        cols: colKeys.length,\n        rows: rowKeys.length,\n        byColumn: colKeys.map((colKey) => rowKeys.map((rowKey) => {\n          return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] };\n        })),\n        byRow: rowKeys.map((rowKey) => colKeys.map((colKey) => {\n          return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] };\n        }))\n      };\n    }\n    initialize(axis) {\n      if (!axis.domain) {\n        this.labels.push(axis);\n        return;\n      }\n      const axesSet = {};\n      axesSet[axis.axisRole] = axis;\n      this.axesSets.push(axesSet);\n    }\n    correlate(axis) {\n      if (!axis.domain) {\n        this.labels.push(axis);\n        return;\n      }\n      for (let i = 0; i < this.axesSets.length; i++) {\n        const axesSet = this.axesSets[i];\n        for (const axisRole in axesSet) {\n          const test2 = axesSet[axisRole];\n          if (this.matchDomains(axis.domain, test2.domain)) {\n            if (!axesSet[axis.axisRole] || !axesSet[axis.axisRole].tickText.length && axis.tickText.length) {\n              axesSet[axis.axisRole] = axis;\n            }\n            return;\n          }\n        }\n      }\n      this.initialize(axis);\n    }\n    matchDomains(a2, b2) {\n      if (this.matchPoint(a2.sourcePosition, b2.sourcePosition))\n        return true;\n      if (this.matchPoint(a2.sourcePosition, b2.targetPosition))\n        return true;\n      if (this.matchPoint(a2.targetPosition, b2.targetPosition))\n        return true;\n      if (this.matchPoint(a2.targetPosition, b2.sourcePosition))\n        return true;\n      return false;\n    }\n    matchPoint(a2, b2) {\n      for (let i = 0; i < this.dimensions; i++) {\n        if (a2[i] !== b2[i])\n          return false;\n      }\n      return true;\n    }\n  }\n  function createAxes(cartesian2, dim2d, dim3d, axis, orientation, height2, props, facetLabel) {\n    const domain2 = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n    const { tickPositions, tickText, textPos, textSize } = convertAxis(axis, domain2, dim2d, height2);\n    if (axis.axisRole === \"z\") {\n      tickPositions.forEach((t, i) => tickPositions[i] = 1 - t);\n      textPos.forEach((t, i) => textPos[i] = 1 - t);\n      tickText.reverse();\n      tickPositions.reverse();\n      textPos.reverse();\n    }\n    cartesian2.setTickPositions(dim3d, tickPositions);\n    cartesian2.zero[dim3d] = 0;\n    cartesian2.setLabelPositions(dim3d, textPos);\n    cartesian2.setLabels(dim3d, tickText);\n    cartesian2.setLabelSizes(dim3d, textSize);\n    const title = (axis === null || axis === void 0 ? void 0 : axis.title) || (facetLabel === null || facetLabel === void 0 ? void 0 : facetLabel.title);\n    if (title === null || title === void 0 ? void 0 : title.text) {\n      cartesian2.setTitle(dim3d, title.text);\n      cartesian2.setTitleSize(dim3d, title.size / height2);\n    }\n    cartesian2.setLabelOrientation(dim3d, orientation);\n    props.config.onAxisConfig && props.config.onAxisConfig(cartesian2, dim3d, axis);\n    return {\n      tickText\n    };\n  }\n  function configCartesianAxes(is3d, bounds2, cartesian2) {\n    if (is3d) {\n      cartesian2.isEdgeVisible[Edge3D.topBack] = false;\n    }\n    cartesian2.isEdgeVisible[Edge3D.backRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.bottomRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.frontRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.topFront] = false;\n    cartesian2.isEdgeVisible[Edge3D.topRight] = false;\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds2;\n    cartesian2.minBoundsX = minBoundsX;\n    cartesian2.maxBoundsX = maxBoundsX;\n    cartesian2.minBoundsY = minBoundsY;\n    cartesian2.maxBoundsY = maxBoundsY;\n    if (is3d) {\n      cartesian2.minBoundsZ = minBoundsZ;\n      cartesian2.maxBoundsZ = maxBoundsZ;\n    }\n  }\n  function getDomainBounds(dim2d, axis) {\n    const domain2 = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n    const minBounds = domain2.sourcePosition[dim2d];\n    const maxBounds = domain2.targetPosition[dim2d];\n    return {\n      maxBounds,\n      minBounds\n    };\n  }\n  function convertAxis(axis, domain2, dim, height2) {\n    const start = domain2.sourcePosition[dim];\n    const span2 = domain2.targetPosition[dim] - start;\n    const tickPositions = axis ? axis.ticks.map((t) => (t.sourcePosition[dim] - start) / span2) : [];\n    const tickText = axis ? axis.tickText.map((t) => t.text) : [];\n    const textPos = axis ? axis.tickText.map((t) => (t.position[dim] - start) / span2) : [];\n    const textSize = axis ? axis.tickText.map((t) => t.size / height2) : [];\n    if (tickPositions.length) {\n      if (tickPositions[0] !== 0) {\n        tickPositions[0] = 0;\n      }\n      if (tickPositions[tickPositions.length - 1] !== 1) {\n        tickPositions[tickPositions.length - 1] = 1;\n      }\n    }\n    return {\n      tickPositions,\n      tickText,\n      textPos,\n      textSize\n    };\n  }\n  class ColorMap {\n    constructor(quant = 5) {\n      this.quant = quant;\n      this.colorMap = {};\n      this.colorArray = [];\n    }\n    getColorKey(rgbaColor) {\n      const color2 = rgbaColor.slice(0, 3).map((e) => Math.floor(e / this.quant) * this.quant);\n      color2[3] = rgbaColor[3];\n      return JSON.stringify(color2);\n    }\n    registerColor(rgbaColor) {\n      const colorKey = this.getColorKey(rgbaColor);\n      if (!this.colorMap[colorKey]) {\n        this.colorMap[colorKey] = {\n          index: this.colorArray.length,\n          rgbaColor\n        };\n        this.colorArray.push(rgbaColor);\n      }\n      return this.colorMap[colorKey].index;\n    }\n    getPalette() {\n      return {\n        palette: new Uint8Array(this.colorArray.flat()),\n        maxColor: this.colorArray.length - 1\n      };\n    }\n  }\n  function convert$3(newColor) {\n    const c2 = colorFromString(newColor).slice(0, 3);\n    return c2.map((v) => v / 255);\n  }\n  function colorConfig(ref2, colors2) {\n    if (!colors2)\n      return;\n    const { config } = ref2.core;\n    config.activeColor = convert$3(colors2.activeItemColor);\n    config.backgroundColor = new Float32Array(convert$3(colors2.backgroundColor));\n    config.textColor = convert$3(colors2.textColor);\n    config.textBorderColor = convert$3(colors2.textBorderColor);\n    config.axesTextColor = convert$3(colors2.axesTextLabelColor);\n    config.axesGridBackgroundColor = convert$3(colors2.axesGridBackgroundColor);\n    config.axesGridHighlightColor = convert$3(colors2.axesGridHighlightColor);\n    config.axesGridMinorColor = convert$3(colors2.axesGridMinorColor);\n    config.axesGridMajorColor = convert$3(colors2.axesGridMajorColor);\n    config.axesGridZeroColor = convert$3(colors2.axesGridZeroColor);\n    ref2.core.renderer[\"_theme\"] = null;\n  }\n  const key$1 = \"cube\";\n  const createCubeLayer = (props) => {\n    const { ref: ref2, stage } = props;\n    const { core } = ref2;\n    const scatter = new Scatter(core);\n    const { ids, colors: colors2, positionsX, positionsY, positionsZ, sizesX, sizesY, sizesZ, bounds: bounds2, maxColor, palette } = convert$2(stage);\n    if (!ids.length)\n      return;\n    const { renderer } = core;\n    let cubeTransitionBuffer = renderer.transitionBuffers.find((t) => t.key === key$1);\n    if (!cubeTransitionBuffer) {\n      cubeTransitionBuffer = renderer.createTransitionBuffer(ids);\n      cubeTransitionBuffer.key = key$1;\n      renderer.transitionBuffers.push(cubeTransitionBuffer);\n    } else {\n      cubeTransitionBuffer.swap();\n    }\n    scatter.layout(cubeTransitionBuffer.currentBuffer, ids, {\n      positionsX,\n      positionsY,\n      positionsZ\n    });\n    const layer = {\n      positionsX,\n      positionsY,\n      positionsZ,\n      update: (newBounds, selected, stagger) => {\n        const { colors: colors3, maxColor: maxColor2, minColor, palette: palette2 } = layer.unitColorMap;\n        const currCubeTransitionBuffer = core.renderer.transitionBuffers.find((t) => t.key === key$1);\n        currCubeTransitionBuffer.currentBuffer.unitType = UnitType.block;\n        currCubeTransitionBuffer.currentPalette.colors = palette2;\n        let options = Object.assign({\n          selected,\n          colors: colors3,\n          minColor,\n          maxColor: maxColor2,\n          sizesX,\n          sizesY,\n          sizesZ\n        }, newBounds);\n        if (stagger === null || stagger === void 0 ? void 0 : stagger.staggerOrders) {\n          const { maxStaggerOrder, minStaggerOrder, staggerOrders } = stagger;\n          options = Object.assign(Object.assign({}, options), {\n            maxStaggerOrder,\n            minStaggerOrder,\n            staggerOrders\n          });\n        }\n        scatter.update(currCubeTransitionBuffer.currentBuffer, ids, options);\n      },\n      bounds: bounds2,\n      unitColorMap: {\n        colors: colors2,\n        ids,\n        minColor: 0,\n        maxColor,\n        palette\n      }\n    };\n    return layer;\n  };\n  function convert$2(stage) {\n    const { cubeData } = stage;\n    const { length: length2 } = cubeData;\n    const ids = [];\n    const colors2 = new Float64Array(length2);\n    const positionsX = new Float64Array(length2);\n    const positionsY = new Float64Array(length2);\n    const positionsZ = new Float64Array(length2);\n    const sizesX = new Float64Array(length2);\n    const sizesY = new Float64Array(length2);\n    const sizesZ = new Float64Array(length2);\n    let bounds2;\n    const colorMap = new ColorMap();\n    cubeData.forEach((cube, i) => {\n      ids.push(i);\n      if (cube.isEmpty) {\n        positionsX[i] = 0;\n        positionsY[i] = 0;\n        positionsZ[i] = 0;\n        sizesX[i] = 0;\n        sizesY[i] = 0;\n        sizesZ[i] = 0;\n        colors2[i] = 0;\n      } else {\n        positionsX[i] = cube.position[0] + cube.size[0] * 0.5;\n        positionsY[i] = cube.position[1] + cube.size[1] * 0.5;\n        positionsZ[i] = cube.position[2] + cube.size[2] * 0.5;\n        sizesX[i] = cube.size[0];\n        sizesY[i] = cube.size[1];\n        sizesZ[i] = cube.size[2];\n        bounds2 = increment(bounds2, cube.position[0], cube.position[1], cube.position[2], cube.position[0] + cube.size[0], cube.position[1] + cube.size[1], cube.position[2] + cube.size[2]);\n        colors2[i] = colorMap.registerColor(cube.color);\n      }\n    });\n    const { palette, maxColor } = colorMap.getPalette();\n    return {\n      ids: new Uint32Array(ids),\n      colors: colors2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      sizesX,\n      sizesY,\n      sizesZ,\n      bounds: bounds2,\n      maxColor,\n      palette\n    };\n  }\n  const key = \"line\";\n  const createLineLayer = (props) => {\n    const { height: height2, ref: ref2, stage } = props;\n    const { core } = ref2;\n    const lines = new Line(core);\n    const { ids, fromIds, toIds, lineColors, lineSizes, bounds: bounds2, positionsX, positionsY, positionsZ, lineMaxColor, palette } = convert$1(stage, height2);\n    if (!ids.length)\n      return;\n    const { renderer } = core;\n    let lineTransitionBuffer = renderer.transitionBuffers.find((t) => t.key === key);\n    if (!lineTransitionBuffer) {\n      lineTransitionBuffer = renderer.createTransitionBuffer(ids);\n      lineTransitionBuffer.key = key;\n      renderer.transitionBuffers.push(lineTransitionBuffer);\n    } else {\n      lineTransitionBuffer.swap();\n    }\n    lines.layout(lineTransitionBuffer.currentBuffer, ids, fromIds, toIds, {\n      positionsX,\n      positionsY,\n      positionsZ,\n      lineSizes,\n      sizeScaling: 1\n    });\n    let options = {\n      lineColors,\n      lineMinColor: 0,\n      lineMaxColor\n    };\n    lineTransitionBuffer.currentBuffer.unitType = UnitType.cylinder;\n    lineTransitionBuffer.currentPalette.colors = palette;\n    return {\n      update: (newBounds) => {\n        options = Object.assign(Object.assign({}, options), newBounds);\n        const currLineTransitionBuffer = core.renderer.transitionBuffers.find((t) => t.key === key);\n        lines.update(currLineTransitionBuffer.currentBuffer, ids, fromIds, toIds, options);\n      },\n      bounds: bounds2,\n      unitColorMap: {\n        ids,\n        colors: lineColors,\n        minColor: 0,\n        maxColor: lineMaxColor,\n        palette\n      }\n    };\n  };\n  function convert$1(stage, height2, width2) {\n    const { pathData } = stage;\n    const positions = [];\n    const lines = [];\n    const colorMap = new ColorMap();\n    pathData.forEach((path2) => {\n      const color2 = colorMap.registerColor(path2.strokeColor);\n      let from = positions.length;\n      positions.push(path2.positions[0]);\n      for (let i = 1; i < path2.positions.length; i++) {\n        const to = positions.length;\n        positions.push(path2.positions[i]);\n        lines.push({\n          id: lines.length,\n          from,\n          to,\n          color: color2,\n          size: path2.strokeWidth\n        });\n        from = to;\n      }\n    });\n    const ids = new Uint32Array(lines.length);\n    const fromIds = new Uint32Array(lines.length);\n    const toIds = new Uint32Array(lines.length);\n    const lineColors = new Float64Array(lines.length);\n    const lineSizes = new Float64Array(lines.length);\n    lines.forEach((line2, i) => {\n      ids[i] = i;\n      fromIds[i] = line2.from;\n      toIds[i] = line2.to;\n      lineColors[i] = line2.color;\n      lineSizes[i] = line2.size;\n    });\n    const positionsX = new Float64Array(positions.length);\n    const positionsY = new Float64Array(positions.length);\n    const positionsZ = new Float64Array(positions.length);\n    let bounds2;\n    positions.forEach((p, i) => {\n      positionsX[i] = p[0];\n      positionsY[i] = p[1] + height2;\n      positionsZ[i] = p[2];\n      bounds2 = increment(bounds2, positionsX[i], positionsY[i], positionsZ[i], positionsX[i], positionsY[i], positionsZ[i]);\n    });\n    const { palette, maxColor: lineMaxColor } = colorMap.getPalette();\n    return {\n      ids,\n      fromIds,\n      toIds,\n      lineColors,\n      lineSizes,\n      bounds: bounds2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      lineMaxColor,\n      palette\n    };\n  }\n  const createTextLayer = (props) => {\n    const { ref: ref2, stage } = props;\n    const { core } = ref2;\n    const { positionsX, positionsY, positionsZ, sizes, bounds: bounds2, maxGlyphs, text: text2 } = convert(stage);\n    if (text2.length === 0) {\n      core.renderer.labelSets = [];\n      return;\n    }\n    const options = {\n      text: text2,\n      maxGlyphs,\n      scales: sizes\n    };\n    const labelSet = new LabelSet(core, options);\n    labelSet.positionsX = positionsX;\n    labelSet.positionsY = positionsY;\n    labelSet.positionsZ = positionsZ;\n    labelSet.horizontalAlignment = HorizontalAlignment.center;\n    labelSet.verticalAlignment = VerticalAlignment.center;\n    const layer = {\n      update: (bounds3) => {\n        const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds3;\n        labelSet.minBoundsX = minBoundsX;\n        labelSet.minBoundsY = minBoundsY;\n        labelSet.minBoundsZ = minBoundsZ;\n        labelSet.maxBoundsX = maxBoundsX;\n        labelSet.maxBoundsY = maxBoundsY;\n        labelSet.maxBoundsZ = maxBoundsZ;\n      },\n      bounds: bounds2\n    };\n    const labelSetVisual = core.renderer.createLabelSetVisual(labelSet);\n    core.renderer.labelSets = [labelSetVisual];\n    return layer;\n  };\n  function convert(stage) {\n    const { textData } = stage;\n    const { length: length2 } = textData;\n    const ids = [];\n    const text2 = [];\n    const colors2 = new Float64Array(length2);\n    const positionsX = new Float64Array(length2);\n    const positionsY = new Float64Array(length2);\n    const positionsZ = new Float64Array(length2);\n    const sizes = new Float64Array(length2);\n    let bounds2;\n    let maxGlyphs = 0;\n    const colorMap = new ColorMap();\n    textData.forEach((t, i) => {\n      ids.push(i);\n      text2.push(t.text);\n      maxGlyphs += t.text.length;\n      positionsX[i] = t.position[0];\n      positionsY[i] = t.position[1];\n      positionsZ[i] = t.position[2];\n      sizes[i] = 1.5 * t.size;\n      bounds2 = increment(bounds2, t.position[0], t.position[1], t.position[2], t.position[0], t.position[1], t.position[2]);\n      colors2[i] = colorMap.registerColor(t.color);\n    });\n    const { palette, maxColor } = colorMap.getPalette();\n    return {\n      ids: new Uint32Array(ids),\n      colors: colors2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      sizes,\n      bounds: bounds2,\n      maxColor,\n      maxGlyphs,\n      palette,\n      text: text2\n    };\n  }\n  function getImageData(url) {\n    return new Promise((resolve2, reject) => {\n      const imageElement = document.createElement(\"img\");\n      imageElement.onload = () => {\n        const canvas = document.createElement(\"canvas\");\n        const ctx = canvas.getContext(\"2d\");\n        const { height: height2, width: width2 } = imageElement;\n        canvas.width = width2;\n        canvas.height = height2;\n        ctx.drawImage(imageElement, 0, 0);\n        resolve2(ctx.getImageData(0, 0, width2, height2));\n      };\n      imageElement.src = url;\n    });\n  }\n  function createImageQuad(core, imageData, bounds2, position2, width2, height2) {\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds2;\n    const imageOptions = {\n      imageData,\n      position: position2,\n      height: height2,\n      width: width2,\n      minBoundsX,\n      maxBoundsX,\n      minBoundsZ,\n      maxBoundsZ,\n      minBoundsY,\n      maxBoundsY\n    };\n    return new ImageQuad(core, imageOptions);\n  }\n  function createCameraDefaults() {\n    const qModelRotation2d2 = create$1();\n    const qModelRotation3d2 = Constants.QUAT_ROTATEX_MINUS_90;\n    const qCameraRotation2d2 = create$1();\n    const qCameraRotation3d2 = create$1();\n    const qAngle = create$1();\n    const vCameraPosition2 = create$3();\n    setAxisAngle(qCameraRotation3d2, Constants.VECTOR3_UNITX, AngleHelper.degreesToRadians(30));\n    setAxisAngle(qAngle, Constants.VECTOR3_UNITY, AngleHelper.degreesToRadians(-25));\n    multiply(qCameraRotation3d2, qCameraRotation3d2, qAngle);\n    return {\n      qModelRotation2d: qModelRotation2d2,\n      qModelRotation3d: qModelRotation3d2,\n      qCameraRotation2d: qCameraRotation2d2,\n      qCameraRotation3d: qCameraRotation3d2,\n      vCameraPosition: vCameraPosition2\n    };\n  }\n  const cameraDefaults = createCameraDefaults();\n  const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n  function applyCameraCallbacks(ref2, lastPresenterConfig, lastView, transistion2dOnly) {\n    const { cameraTransitioner, core, modelTransitioner, positionTransitioner } = ref2;\n    ref2.reset = () => {\n      core.reset(true);\n      if (lastView === \"3d\") {\n        modelTransitioner.qRotation.to = qModelRotation3d;\n        cameraTransitioner.qRotation.to = qCameraRotation3d;\n        cameraTransitioner.vPosition.to = vCameraPosition;\n      } else {\n        modelTransitioner.qRotation.to = qModelRotation2d;\n        cameraTransitioner.qRotation.to = qCameraRotation2d;\n        cameraTransitioner.vPosition.to = vCameraPosition;\n      }\n      slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.to, modelTransitioner.qRotation.to, 0);\n      core.setModelRotation(modelTransitioner.qRotation.current, true);\n      core.camera.setOrbit(cameraTransitioner.qRotation.to, true);\n      core.camera.setPosition(cameraTransitioner.vPosition.to, true);\n    };\n    const cam = (t) => {\n      slerp(cameraTransitioner.qRotation.current, cameraTransitioner.qRotation.from, cameraTransitioner.qRotation.to, t);\n      lerp(cameraTransitioner.vPosition.current, cameraTransitioner.vPosition.from, cameraTransitioner.vPosition.to, t);\n      core.camera.setOrbit(cameraTransitioner.qRotation.current, false);\n      core.camera.setPosition(cameraTransitioner.vPosition.current, false);\n      core.inputManager.isPickingEnabled = false;\n    };\n    core.updateCallback = (elapsedTime) => {\n      const { transitionDurations } = lastPresenterConfig;\n      if (positionTransitioner.isTransitioning) {\n        const t = positionTransitioner.elapse(elapsedTime, transitionDurations.position + transitionDurations.stagger);\n        core.renderer.transitionTime = t;\n        setTransitionTimeAxesVisibility(transistion2dOnly, core);\n      } else {\n        core.inputManager.isPickingEnabled = true;\n      }\n      if (modelTransitioner.isTransitioning) {\n        const tm = modelTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n        if (modelTransitioner.shouldTransition) {\n          slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.from, modelTransitioner.qRotation.to, tm);\n          core.setModelRotation(modelTransitioner.qRotation.current, false);\n        }\n        cam(tm);\n      }\n      if (cameraTransitioner.isTransitioning) {\n        const t = cameraTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n        cam(t);\n      }\n    };\n  }\n  function setTransitionTimeAxesVisibility(transistion2dOnly, core) {\n    const t = core.renderer.transitionTime;\n    if (transistion2dOnly) {\n      if (t < 0.5) {\n        core.renderer.axesVisibility = AxesVisibility.previous;\n      } else {\n        core.renderer.axesVisibility = AxesVisibility.current;\n      }\n    } else {\n      if (t <= 0.01) {\n        core.renderer.axesVisibility = AxesVisibility.previous;\n      } else if (t >= 0.99) {\n        core.renderer.axesVisibility = AxesVisibility.current;\n      } else {\n        core.renderer.axesVisibility = AxesVisibility.none;\n      }\n    }\n  }\n  function morphChartsRender(ref2, prevStage, stage, height2, width2, preStage, colors2, config) {\n    const { qCameraRotation2d: qCameraRotation2d2, qCameraRotation3d: qCameraRotation3d2, qModelRotation2d: qModelRotation2d2, qModelRotation3d: qModelRotation3d2, vCameraPosition: vCameraPosition2 } = cameraDefaults;\n    const { core, cameraTransitioner, modelTransitioner, positionTransitioner } = ref2;\n    let transistion2dOnly = false;\n    let cameraTo;\n    let holdCamera;\n    if (config.camera === \"hold\") {\n      holdCamera = true;\n    } else {\n      cameraTo = config.camera;\n    }\n    if (prevStage && prevStage.view !== stage.view) {\n      modelTransitioner.shouldTransition = !holdCamera;\n      if (stage.view === \"2d\") {\n        modelTransitioner.qRotation.from = qModelRotation3d2;\n        modelTransitioner.qRotation.to = qModelRotation2d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      } else {\n        modelTransitioner.qRotation.from = qModelRotation2d2;\n        modelTransitioner.qRotation.to = qModelRotation3d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      }\n    } else {\n      modelTransitioner.shouldTransition = false;\n      if (stage.view === \"2d\") {\n        transistion2dOnly = true;\n        modelTransitioner.qRotation.to = qModelRotation2d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      } else {\n        modelTransitioner.qRotation.to = qModelRotation3d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      }\n    }\n    core.camera.getOrbit(cameraTransitioner.qRotation.from);\n    core.camera.getPosition(cameraTransitioner.vPosition.from);\n    if (!prevStage) {\n      core.setModelRotation(modelTransitioner.qRotation.to, false);\n      core.camera.setOrbit(cameraTransitioner.qRotation.to, false);\n      core.camera.setPosition(cameraTransitioner.vPosition.to, false);\n    } else if (!holdCamera) {\n      cameraTransitioner.begin();\n    }\n    positionTransitioner.begin();\n    if (modelTransitioner.shouldTransition) {\n      modelTransitioner.begin();\n    }\n    const props = { ref: ref2, stage, height: height2, config };\n    const cubeLayer = createCubeLayer(props);\n    const lineLayer = createLineLayer(props);\n    const textLayer = createTextLayer(props);\n    const { backgroundImages } = stage;\n    let contentBounds = outerBounds(outerBounds(cubeLayer === null || cubeLayer === void 0 ? void 0 : cubeLayer.bounds, lineLayer === null || lineLayer === void 0 ? void 0 : lineLayer.bounds), outerBounds(textLayer === null || textLayer === void 0 ? void 0 : textLayer.bounds, null));\n    backgroundImages === null || backgroundImages === void 0 ? void 0 : backgroundImages.forEach((backgroundImage) => {\n      contentBounds = outerBounds(contentBounds, convertBounds(backgroundImage.bounds));\n    });\n    props.bounds = contentBounds;\n    core.renderer.previousAxes = core.renderer.currentAxes;\n    const axesLayer = createAxesLayer(props);\n    core.config.transitionStaggering = config.transitionDurations.stagger;\n    core.config.transitionDuration = config.transitionDurations.position;\n    let bounds2;\n    if (axesLayer && axesLayer.bounds) {\n      bounds2 = axesLayer.bounds;\n    } else {\n      bounds2 = contentBounds;\n    }\n    ref2.setMorphChartsRendererOptions(config.renderer);\n    if (preStage) {\n      preStage(stage, cubeLayer);\n    }\n    core.renderer.images = [];\n    if (backgroundImages) {\n      const addImage = (imageBounds, imageData) => {\n        const imageWidth2 = imageBounds.maxBoundsX - imageBounds.minBoundsX;\n        const imageHeight2 = imageBounds.maxBoundsY - imageBounds.minBoundsY;\n        const position2 = [imageBounds.minBoundsX + imageWidth2 / 2, imageBounds.minBoundsY + imageHeight2 / 2, 0];\n        const imageQuad = createImageQuad(core, imageData, contentBounds, position2, imageWidth2, imageHeight2);\n        const imageVisual = core.renderer.createImageVisual(imageQuad);\n        core.renderer.images.push(imageVisual);\n      };\n      const imageDataCache = {};\n      backgroundImages.forEach((backgroundImage) => {\n        const imageBounds = convertBounds(backgroundImage.bounds);\n        const imageData = imageDataCache[backgroundImage.url];\n        if (imageData) {\n          addImage(imageBounds, imageData);\n        } else {\n          getImageData(backgroundImage.url).then((imageData2) => {\n            imageDataCache[backgroundImage.url] = imageData2;\n            addImage(imageBounds, imageData2);\n          });\n        }\n      });\n    }\n    layersWithSelection(cubeLayer, lineLayer, textLayer, config.layerSelection, bounds2, ref2.layerStagger);\n    applyCameraCallbacks(ref2, config, stage.view, transistion2dOnly);\n    core.renderer.transitionTime = 0;\n    colorConfig(ref2, colors2);\n    return {\n      bounds: bounds2,\n      getCubeLayer: () => cubeLayer,\n      update: (layerSelection) => layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds2, ref2.layerStagger),\n      activate: (id2) => core.renderer.transitionBuffers[0].activeId = id2,\n      moveCamera: (camera) => {\n        if (!(positionTransitioner.isTransitioning || modelTransitioner.isTransitioning)) {\n          core.camera.getOrbit(cameraTransitioner.qRotation.from);\n          core.camera.getPosition(cameraTransitioner.vPosition.from);\n          cameraTransitioner.move(camera.position, camera.rotation);\n        }\n      },\n      setTransitionTimeAxesVisibility: () => {\n        setTransitionTimeAxesVisibility(transistion2dOnly, core);\n      }\n    };\n  }\n  function layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds2, layerStagger) {\n    const layerItems = [\n      {\n        layer: cubeLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.cubes,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.cubes\n      },\n      {\n        layer: lineLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.lines,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.lines\n      },\n      {\n        layer: textLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.texts,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.texts\n      }\n    ];\n    layerItems.forEach((layerItem) => {\n      var _a;\n      return (_a = layerItem.layer) === null || _a === void 0 ? void 0 : _a.update(bounds2, layerItem.selection, layerItem.stagger);\n    });\n  }\n  function convertBounds(bounds2) {\n    if (!bounds2)\n      return;\n    return {\n      minBoundsX: bounds2.x1,\n      maxBoundsX: bounds2.x2,\n      minBoundsY: -bounds2.y2,\n      maxBoundsY: -bounds2.y1,\n      minBoundsZ: minZ,\n      maxBoundsZ: minZ\n    };\n  }\n  function shouldChangeRenderer(prev, next) {\n    var _a, _b;\n    if (!prev || !next)\n      return true;\n    if (prev.advanced !== next.advanced)\n      return true;\n    if (!prev.advanced) {\n      return ((_a = prev.basicOptions) === null || _a === void 0 ? void 0 : _a.antialias) != ((_b = next.basicOptions) === null || _b === void 0 ? void 0 : _b.antialias);\n    }\n  }\n  function getRenderer(mcRendererOptions, core) {\n    const advanced = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced;\n    const r = advanced ? new Main() : new Main$1(mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.basicOptions);\n    core.renderer = r;\n    setRendererOptions(r, mcRendererOptions);\n    return r;\n  }\n  function setRendererOptions(renderer, mcRendererOptions) {\n    const o = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advancedOptions;\n    if ((mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced) && o) {\n      for (const key2 in o) {\n        renderer.config[key2] = o[key2];\n      }\n    }\n  }\n  function rendererEnabled(advanced) {\n    const r = advanced ? new Main() : new Main$1();\n    return r.isSupported;\n  }\n  const rightButton = 2;\n  function listenCanvasEvents(core, options) {\n    const { container, pickGridCallback } = options;\n    const { inputManager } = core;\n    if (options.onLasso) {\n      inputManager.pickLassoCallback = (result) => {\n        options.onLasso(result.ids[0], result.manipulator.event);\n      };\n    }\n    inputManager.singleTouchAction = (manipulator) => {\n      if (manipulator.button == rightButton || manipulator.shiftKey || manipulator.ctrlKey) {\n        return SingleTouchAction.rotate;\n      } else if (manipulator.altKey) {\n        return SingleTouchAction.lasso;\n      } else {\n        return SingleTouchAction.translate;\n      }\n    };\n    inputManager.pickAxesGridCallback = ({ divisionX, divisionY, divisionZ, manipulator }) => {\n      clearClickTimeout();\n      const { altKey, button, shiftKey } = manipulator;\n      const me = { altKey, shiftKey, button };\n      const e = me;\n      pickGridCallback([divisionX, divisionY, divisionZ], e);\n    };\n    const canvas = container.getElementsByTagName(\"canvas\")[0];\n    let pickedId;\n    const hover2 = (e) => {\n      if (core.renderer.pickedId !== pickedId) {\n        pickedId = core.renderer.pickedId;\n        const ordinal2 = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n        options.onCubeHover(e, ordinal2);\n      }\n    };\n    canvas.addEventListener(\"mousemove\", (e) => {\n      clearClickTimeout();\n      if (mousedown) {\n        options.onCubeHover(e, null);\n      }\n      hover2(e);\n    });\n    canvas.addEventListener(\"mouseout\", hover2);\n    canvas.addEventListener(\"mouseover\", hover2);\n    let mousedown;\n    canvas.addEventListener(\"mousedown\", () => {\n      mousedown = true;\n    });\n    canvas.addEventListener(\"mouseup\", (e) => {\n      mousedown = false;\n    });\n    let canvasClickTimeout;\n    const clearClickTimeout = () => {\n      clearTimeout(canvasClickTimeout);\n      canvasClickTimeout = null;\n    };\n    canvas.addEventListener(\"click\", (e) => {\n      canvasClickTimeout = setTimeout(() => {\n        options.onCanvasClick(e);\n      }, 50);\n    });\n    inputManager.pickItemCallback = ({ manipulator }) => {\n      clearClickTimeout();\n      const ordinal2 = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n      options.onCubeClick(manipulator.event, ordinal2);\n    };\n  }\n  function cubicInOut(t) {\n    return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n  }\n  function easing(t) {\n    if (t === 0 || t === 1)\n      return t;\n    return cubicInOut(t);\n  }\n  class Transitioner {\n    constructor() {\n      this.isTransitioning = false;\n    }\n    begin() {\n      this.isTransitioning = true;\n      this.time = 0;\n    }\n    elapse(elapsedTime, totalTime, ease = false) {\n      this.time += elapsedTime;\n      if (this.time >= totalTime) {\n        this.isTransitioning = false;\n        this.time = totalTime;\n        this.ended && this.ended();\n      }\n      const t = this.time / totalTime;\n      return ease ? easing(t) : t;\n    }\n  }\n  class CameraTransitioner extends Transitioner {\n    constructor() {\n      super();\n      this.qRotation = {\n        from: create$1(),\n        to: null,\n        current: create$1()\n      };\n      this.vPosition = {\n        from: create$3(),\n        to: null,\n        current: create$3()\n      };\n    }\n    move(position2, rotation2) {\n      this.begin();\n      this.qRotation.to = rotation2;\n      this.vPosition.to = position2;\n    }\n  }\n  class ModelTransitioner extends Transitioner {\n    constructor() {\n      super();\n      this.shouldTransition = false;\n      this.qRotation = {\n        from: null,\n        to: null,\n        current: create$1()\n      };\n    }\n  }\n  function init(options, mcRendererOptions) {\n    const { container } = options;\n    const core = new Core({ container });\n    getRenderer(mcRendererOptions, core);\n    listenCanvasEvents(core, options);\n    core.config.pickSelectDelay = 50;\n    const cameraTransitioner = new CameraTransitioner();\n    const modelTransitioner = new ModelTransitioner();\n    const positionTransitioner = new Transitioner();\n    positionTransitioner.ended = () => {\n      core.renderer.axesVisibility = AxesVisibility.current;\n    };\n    const ref2 = {\n      supportedRenders: {\n        advanced: rendererEnabled(true),\n        basic: rendererEnabled(false)\n      },\n      reset: null,\n      cameraTransitioner,\n      modelTransitioner,\n      positionTransitioner,\n      core,\n      setMorphChartsRendererOptions(mcRendererOptions2) {\n        if (shouldChangeRenderer(ref2.lastMorphChartsRendererOptions, mcRendererOptions2)) {\n          getRenderer(mcRendererOptions2, core);\n          listenCanvasEvents(core, options);\n        } else {\n          if (mcRendererOptions2.advanced) {\n            setRendererOptions(core.renderer, mcRendererOptions2);\n          }\n        }\n        ref2.lastMorphChartsRendererOptions = mcRendererOptions2;\n      },\n      lastMorphChartsRendererOptions: mcRendererOptions,\n      layerStagger: {}\n    };\n    return ref2;\n  }\n  class Presenter {\n    /**\n     * Get the previously rendered Stage object.\n     */\n    get stage() {\n      return this._last.stage;\n    }\n    /**\n     * Get the current View camera type.\n     */\n    get view() {\n      return this._last.view;\n    }\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */\n    constructor(el, style2) {\n      this.el = el;\n      this.style = deepMerge(defaultPresenterStyle$1, style2);\n      initializePanel(this);\n      this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n    }\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */\n    animationCancel() {\n      if (this.animationTimer) {\n        clearTimeout(this.animationTimer);\n        this.animationTimer = null;\n        if (this.logger) {\n          this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || \"handler\"}`);\n        }\n        if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n          this.queuedAnimationOptions.animationCanceled.call(null);\n        }\n      }\n    }\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */\n    animationQueue(handler, timeout2, options) {\n      if (this.logger) {\n        this.logger(`queueing animation ${options && options.waitingLabel || \"waiting\"}...(${timeout2})`);\n      }\n      this.animationCancel();\n      this.animationTimer = setTimeout(() => {\n        if (this.logger) {\n          this.logger(`queueing animation ${options && options.handlerLabel || \"handler\"}...`);\n        }\n        handler();\n      }, timeout2);\n    }\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */\n    getElement(type2) {\n      const elements = this.el.getElementsByClassName(className(type2, this));\n      if (elements && elements.length) {\n        return elements[0];\n      }\n    }\n    /**\n     * Present the Vega Scene, or Stage object using Morphcharts.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area.\n     * @param config Optional presentation configuration object.\n     */\n    present(sceneOrStage, height2, width2, config) {\n      this.animationCancel();\n      const scene = sceneOrStage;\n      let stage;\n      const options = {\n        maxOrdinal: 0,\n        currAxis: null,\n        defaultCubeColor: this.style.defaultCubeColor,\n        assignCubeOrdinal: config && config.onSceneRectAssignCubeOrdinal || (() => options.maxOrdinal++),\n        modifyAxis: (config === null || config === void 0 ? void 0 : config.onAxisItem) ? config.onAxisItem : defaultOnAxisItem,\n        zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n      };\n      if (scene.marktype) {\n        stage = createStage(scene.view);\n        sceneToStage(options, stage, scene);\n      } else {\n        stage = sceneOrStage;\n      }\n      const c2 = deepMerge(defaultPresenterConfig, config);\n      if (!this.morphchartsref) {\n        this._morphChartsOptions = {\n          container: this.getElement(PresenterElement.gl),\n          pickGridCallback: c2.axisPickGridCallback,\n          onCubeHover: (e, ordinal2) => {\n            c2.onCubeHover(e, { ordinal: ordinal2, color: null, position: null, size: null });\n          },\n          onCubeClick: (e, ordinal2) => {\n            c2.onCubeClick(e, { ordinal: ordinal2, color: null, position: null, size: null });\n          },\n          onCanvasClick: config === null || config === void 0 ? void 0 : config.onLayerClick,\n          onLasso: config === null || config === void 0 ? void 0 : config.onLasso\n        };\n        this.morphchartsref = init(this._morphChartsOptions, c2.renderer || defaultPresenterConfig.renderer);\n      }\n      let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n      if (options.maxOrdinal) {\n        cubeCount = Math.max(cubeCount, options.maxOrdinal);\n        const empty = {\n          isEmpty: true\n        };\n        stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n      }\n      config.preLayer && config.preLayer(stage);\n      this.morphChartsRenderResult = morphChartsRender(this.morphchartsref, this._last.stage, stage, height2, width2, config && config.preStage, config && config.morphChartsColors, c2);\n      delete stage.cubeData;\n      delete stage.redraw;\n      this._last = {\n        cubeCount,\n        height: height2,\n        width: width2,\n        stage,\n        view: stage.view\n      };\n      const a2 = getActiveElementInfo();\n      mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement.legend));\n      setActiveElement(a2);\n      if (config && config.onPresent) {\n        config.onPresent();\n      }\n    }\n    canvasToDataURL() {\n      return new Promise((resolve2, reject) => {\n        this.morphchartsref.core.afterRenderCallback = () => {\n          this.morphchartsref.core.afterRenderCallback = null;\n          const canvas = this.getElement(PresenterElement.gl).getElementsByTagName(\"canvas\")[0];\n          const png = canvas.toDataURL(\"image/png\");\n          resolve2(png);\n        };\n      });\n    }\n    configColors(mcColors) {\n      colorConfig(this.morphchartsref, mcColors);\n    }\n    /**\n     * Home the camera to the last initial position.\n     */\n    homeCamera() {\n      var _a;\n      (_a = this.morphchartsref) === null || _a === void 0 ? void 0 : _a.reset();\n    }\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */\n    showGuides() {\n      this.getElement(PresenterElement.gl).classList.add(\"show-center\");\n    }\n    finalize() {\n      this.animationCancel();\n      if (this.morphchartsref)\n        this.morphchartsref.core.stop();\n      if (this.el)\n        this.el.innerHTML = \"\";\n      this._last = null;\n      this.morphchartsref = null;\n      this.el = null;\n      this.logger = null;\n      this.queuedAnimationOptions = null;\n    }\n  }\n  function _RendererGl(loader2) {\n    class RendererGlInternal extends base.vega.Renderer {\n      initialize(el, width2, height2, origin) {\n        this.height = height2;\n        this.width = width2;\n        return super.initialize(el, width2, height2, origin);\n      }\n      resize(width2, height2, origin) {\n        super.resize(width2, height2, origin);\n        this.origin = origin;\n        this.height = height2;\n        this.width = width2;\n        return this;\n      }\n      _render(scene, items) {\n        const scene3d = scene;\n        scene3d.view = this.getView();\n        this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n        return this;\n      }\n    }\n    const instance = new RendererGlInternal(loader2);\n    return instance;\n  }\n  const RendererGl = _RendererGl;\n  let registered = false;\n  function _ViewGl(runtime2, config) {\n    class ViewGlInternal extends base.vega.View {\n      constructor(runtime3, config2 = {}) {\n        super(runtime3, config2);\n        this.config = config2;\n        this.presenter = config2.presenter;\n        config2.presenterConfig = config2.presenterConfig || {};\n        config2.presenterConfig.redraw = () => {\n          this._redraw = true;\n          this.run();\n        };\n      }\n      renderer(...args) {\n        if (args && args.length) {\n          const renderer = args[0];\n          if (renderer === \"morphcharts\" && !registered) {\n            base.vega.renderModule(\"morphcharts\", { handler: base.vega.CanvasHandler, renderer: RendererGl });\n            registered = true;\n          }\n          return super.renderer(renderer);\n        } else {\n          return super.renderer();\n        }\n      }\n      initialize(el) {\n        if (!this.presenter) {\n          this.presenter = new Presenter(el);\n        }\n        super.initialize(this.presenter.getElement(PresenterElement.vegaControls));\n        const renderer = this._renderer;\n        renderer.presenterConfig = this.config.presenterConfig;\n        renderer.presenter = this.presenter;\n        renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView$1);\n        return this;\n      }\n      error(e) {\n        if (this.presenter.logger) {\n          this.presenter.logger(e);\n        }\n      }\n    }\n    const instance = new ViewGlInternal(runtime2, config);\n    return instance;\n  }\n  const ViewGl = _ViewGl;\n  const { defaultPresenterStyle } = defaults;\n  const defaultViewerOptions = {\n    colors: {\n      activeCube: \"purple\",\n      defaultCube: colorToString(defaultPresenterStyle.defaultCubeColor),\n      hoveredCube: colorToString(defaultPresenterStyle.highlightColor),\n      selectedCube: \"yellow\",\n      axisSelectHighlight: colorToString([128, 128, 128, 128]),\n      axisLine: \"#000\",\n      axisText: \"#000\",\n      gridLine: \"#CCC\",\n      backgroundColor: \"#FFF\"\n    },\n    language: {\n      headers: {\n        chart: \"Chart\",\n        details: \"Details\",\n        legend: \"Legend\",\n        selection: \"Select & Filter\"\n      },\n      bing: \"bing\",\n      newColorMap: \"remap color to filtered items\",\n      oldColorMap: \"keep same colors\",\n      deselect: \"deselect\",\n      exclude: \"exclude\",\n      isolate: \"isolate\",\n      legendOther: \"other\",\n      nextDetail: \">\",\n      previousDetail: \"<\",\n      reset: \"reset\",\n      colorBinCount: \"Color bin count\",\n      colorReverse: \"Color reverse\",\n      count: \"Count\",\n      percent: \"Percent\",\n      sum: \"Sum\",\n      scatterPointScale: \"Point scale\",\n      FacetMaxBins: \"Facet max bins\",\n      FacetVMaxBins: \"Cross facet max bins\",\n      XMaxBins: \"X axis max bins\",\n      YMaxBins: \"Y axis max bins\",\n      XGridSize: \"X grid size\",\n      YGridSize: \"Y grid size\",\n      InnerPaddingSize: \"Inner padding size\",\n      OuterPaddingSize: \"Outer padding size\",\n      treeMapMethod: \"Treemap layout\",\n      facetColumns: \"Facet columns\",\n      facetRows: \"Facet rows\",\n      markOpacitySignal: \"Mark opacity\",\n      textScaleSignal: \"Text scale\",\n      xAxisTextAngleSignal: \"X axis text angle\",\n      yAxisTextAngleSignal: \"Y axis text angle\",\n      zGrounded: \"Z grounded\",\n      zScaleProportion: \"Z scale proportion to Y\",\n      selectionCount: (count2) => `${count2} items selected`\n    },\n    maxLegends: 19,\n    //20 would be \"other\"\n    onError: (errors) => {\n    },\n    filterRenderingTimerPadding: 200,\n    selectionPolygonZ: -1,\n    tickSize: 10\n  };\n  function getPresenterStyle(options) {\n    const style2 = {\n      cssPrefix,\n      fontFamily: options.fontFamily,\n      defaultCubeColor: colorFromString(options.colors.defaultCube)\n    };\n    if (options.colors.hoveredCube) {\n      style2.highlightColor = colorFromString(options.colors.hoveredCube);\n    }\n    return style2;\n  }\n  const cssPrefix = \"sanddance-\";\n  const dualColorSchemeColors = {\n    black: \"#212121\",\n    gray: \"#D2D2D2\",\n    blue: \"#0060F0\",\n    green: \"#00C000\",\n    orange: \"#FF9900\",\n    red: \"#E00000\"\n  };\n  function isInternalFieldName(columnName, includeVegaMorphChartsFields = false) {\n    if (includeVegaMorphChartsFields) {\n      if (columnName === GL_ORDINAL)\n        return true;\n    }\n    for (const f in FieldNames) {\n      if (columnName === FieldNames[f])\n        return true;\n    }\n    return false;\n  }\n  const dualPairs = [\n    [dualColorSchemeColors.black, dualColorSchemeColors.gray],\n    [dualColorSchemeColors.red, dualColorSchemeColors.green],\n    [dualColorSchemeColors.red, dualColorSchemeColors.blue],\n    [dualColorSchemeColors.black, dualColorSchemeColors.red],\n    [dualColorSchemeColors.black, dualColorSchemeColors.orange],\n    [dualColorSchemeColors.black, dualColorSchemeColors.green]\n  ];\n  const colorSchemes = [\n    {\n      scheme: ColorScaleNone,\n      colors: [defaultViewerOptions.colors.defaultCube]\n    }\n  ];\n  createDualColorSchemes();\n  function registerColorSchemes(vega2) {\n    colorSchemes.forEach((cs) => {\n      if (cs.colors.length === 1) {\n        vega2.scheme(cs.scheme, (x2) => cs.colors[0]);\n      } else {\n        vega2.scheme(cs.scheme, cs.colors);\n      }\n    });\n  }\n  function createPair(names, colors2) {\n    const scheme2 = `dual_${names[0]}${names[1]}`;\n    colorSchemes.push({ scheme: scheme2, colors: colors2 });\n  }\n  function createDualColorSchemes() {\n    dualPairs.forEach((colors2) => {\n      const names = colors2.map((color2) => {\n        for (const key2 in dualColorSchemeColors)\n          if (color2 === dualColorSchemeColors[key2])\n            return key2;\n      });\n      createPair(names, colors2);\n      createPair([...names].reverse(), [...colors2].reverse());\n    });\n  }\n  var DataLayoutChange;\n  (function(DataLayoutChange2) {\n    DataLayoutChange2[DataLayoutChange2[\"same\"] = 0] = \"same\";\n    DataLayoutChange2[DataLayoutChange2[\"reset\"] = 1] = \"reset\";\n    DataLayoutChange2[DataLayoutChange2[\"refine\"] = 2] = \"refine\";\n  })(DataLayoutChange || (DataLayoutChange = {}));\n  class Animator {\n    constructor(dataScope, props) {\n      this.dataScope = dataScope;\n      this.props = props;\n    }\n    select(search) {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.select(search);\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    deselect() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deselect();\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    filter(search, keepData, collapseData, rebase) {\n      if (rebase) {\n        this.dataScope.collapse(false, keepData);\n      }\n      this.dataScope.collapse(true, collapseData);\n      return new Promise((resolve2, reject) => {\n        this.props.onAnimateDataChange(DataLayoutChange.refine, \"before refine\", \"refine\").then(() => {\n          this.dataScope.deselect();\n          this.dataScope.setFilteredData(keepData);\n          this.props.onDataChanged(DataLayoutChange.refine, search);\n          resolve2();\n        }).catch(reject);\n      });\n    }\n    reset() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deselect();\n        let time2;\n        if (!this.dataScope.hasFilteredData()) {\n          time2 = 0;\n        } else {\n          this.dataScope.setFilteredData(null);\n        }\n        this.props.onAnimateDataChange(DataLayoutChange.reset, \"before reset\", \"reset\", time2).then(() => {\n          this.dataScope.collapse(false);\n          this.props.onDataChanged(DataLayoutChange.reset);\n          resolve2();\n        }).catch(reject);\n      });\n    }\n    activate(datum2) {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.activate(datum2);\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n    deactivate() {\n      return new Promise((resolve2, reject) => {\n        this.dataScope.deactivate();\n        this.props.onDataChanged(DataLayoutChange.same);\n        resolve2();\n      });\n    }\n  }\n  function notNice(niceValue) {\n    return (niceValue + \"\").replace(/[\\s,]/g, \"\");\n  }\n  function tickValue(axis, i) {\n    const tick = axis.tickText[i];\n    let value2;\n    if (tick) {\n      value2 = axis.tickText[i].value;\n    }\n    return { tick, value: value2 };\n  }\n  function selectNullOrEmpty(column) {\n    const searchExpression = {\n      name: column.name,\n      operator: \"isnullorEmpty\"\n    };\n    return searchExpression;\n  }\n  function selectExact(column, value2) {\n    if (value2 == null) {\n      return selectNullOrEmpty(column);\n    }\n    const searchExpression = {\n      name: column.name,\n      operator: \"==\",\n      value: value2\n    };\n    return searchExpression;\n  }\n  function selectNone(column, values2) {\n    const expressions = values2.map((value2, i) => {\n      const searchExpression = {\n        name: column.name,\n        operator: \"!=\",\n        value: value2\n      };\n      if (i) {\n        searchExpression.clause = \"&&\";\n      }\n      return searchExpression;\n    });\n    const searchExpressionGroup = {\n      expressions\n    };\n    return searchExpressionGroup;\n  }\n  function selectExactAxis(axis, column, i) {\n    const result = tickValue(axis, i);\n    if (result.tick) {\n      return selectExact(column, result.value);\n    }\n  }\n  function selectBetween(column, lowValue, highValue, lowOperator = \">=\", highOperator = \"<\") {\n    const expressions = [];\n    if (lowValue !== void 0) {\n      expressions.push({\n        name: column.name,\n        operator: lowOperator,\n        value: lowValue\n      });\n    }\n    if (highValue !== void 0) {\n      expressions.push({\n        name: column.name,\n        operator: highOperator,\n        value: highValue\n      });\n    }\n    if (expressions.length > 1) {\n      expressions[1].clause = \"&&\";\n    }\n    const searchExpressionGroup = {\n      expressions\n    };\n    return searchExpressionGroup;\n  }\n  function selectBetweenAxis(axis, column, i) {\n    const low = tickValue(axis, i);\n    const high = tickValue(axis, i + 1);\n    return selectBetween(column, low.value, high.value);\n  }\n  const dimToRole = {\n    0: \"x\",\n    1: \"y\",\n    2: \"z\"\n  };\n  const roleToDim = {\n    x: 0,\n    y: 1,\n    z: 1\n  };\n  class AxisSelection {\n    constructor(specCapabilities, columns, stage) {\n      this.specCapabilities = specCapabilities;\n      this.columns = columns;\n      this.stage = stage;\n    }\n    convert(divisions) {\n      const searchRoles = [];\n      divisions.forEach((division, i) => {\n        const role = dimToRole[i];\n        const axes = this.stage.axes[role];\n        const axis = axes.filter((axis2) => axis2.tickText.length)[0];\n        if (axis) {\n          const capabilities = this.specCapabilities.roles.filter((r) => r.role === role)[0];\n          const column = this.columns[role];\n          if (division >= 0 && (capabilities === null || capabilities === void 0 ? void 0 : capabilities.axisSelection)) {\n            searchRoles.push({\n              axis,\n              role,\n              capabilities,\n              column,\n              division\n            });\n          }\n        }\n      });\n      switch (searchRoles.length) {\n        case 0: {\n          return null;\n        }\n        case 1: {\n          return this.getSearchFromSearchRole(searchRoles[0]);\n        }\n        default: {\n          const roles = searchRoles.map((searchRole) => this.getSearchFromSearchRole(searchRole));\n          roles.forEach((role, i) => {\n            if (i === 0)\n              return;\n            role.clause = \"&&\";\n          });\n          return roles;\n        }\n      }\n    }\n    getSearchFromSearchRole(searchRole) {\n      const getSearch = searchRole.capabilities.axisSelection === \"exact\" ? (a2, c2, i) => ({ expressions: [selectExactAxis(a2, c2, i)] }) : selectBetweenAxis;\n      const { axis, column, division } = searchRole;\n      return getSearch(axis, column, division);\n    }\n  }\n  function moveTicksBetween(axes) {\n    axes.forEach((axis) => {\n      if (axis.ticks.length === 0)\n        return;\n      const dim = roleToDim[axis.axisRole];\n      const { color: color2 } = axis.ticks[0];\n      const newLine = (value2) => {\n        const line2 = {\n          sourcePosition: [0, 0, 0],\n          targetPosition: [0, 0, 0],\n          color: color2\n        };\n        line2.sourcePosition[dim] = value2;\n        return line2;\n      };\n      const newTicks = [];\n      newTicks.push(newLine(axis.domain.sourcePosition[dim]));\n      for (let i = 1; i < axis.ticks.length; i++) {\n        newTicks.push(newLine((axis.ticks[i].sourcePosition[dim] + axis.ticks[i - 1].sourcePosition[dim]) / 2));\n      }\n      newTicks.push(newLine(axis.domain.targetPosition[dim]));\n      axis.ticks = newTicks;\n    });\n  }\n  function populateColorContext(colorContext, presenter) {\n    if (!colorContext.colorMap) {\n      colorContext.colorMap = presenter.morphChartsRenderResult.getCubeLayer().unitColorMap;\n    }\n    colorContext.legend = clone(presenter.stage.legend);\n    colorContext.legendElement = presenter.getElement(PresenterElement.legend).children[0];\n  }\n  class DataScope {\n    constructor() {\n      this.filteredColumnsStats = {};\n    }\n    setData(data2, columns) {\n      const differentData = this.data !== data2;\n      if (differentData) {\n        if (this.data) {\n          this.deselect();\n        }\n        this.data = data2;\n        this.columns = columns;\n        this.filteredData = null;\n        this.filteredColumnsStats = {};\n      }\n      return differentData;\n    }\n    setFilteredData(filteredData) {\n      this.filteredData = filteredData;\n      this.filteredColumnsStats = {};\n    }\n    getColumns(columnTypes) {\n      if (!this.columns) {\n        this.columns = getColumnsFromData(base.vega.inferTypes, this.data, columnTypes);\n      }\n      return this.columns;\n    }\n    getFilteredColumnStats(columnName) {\n      if (!this.filteredColumnsStats[columnName]) {\n        this.filteredColumnsStats[columnName] = getStats(this.filteredData, this.columns.filter((c2) => c2.name === columnName)[0]);\n      }\n      return this.filteredColumnsStats[columnName];\n    }\n    currentData() {\n      return this.filteredData || this.data;\n    }\n    select(search) {\n      this.deselect();\n      if (search) {\n        this.selection = this.createUserSelection(search, true, false);\n        if (this.selection.included.length) {\n          this.activate(this.selection.included[0]);\n        }\n      }\n    }\n    createUserSelection(search, assign, rebase) {\n      const exec = new Exec(search, this.getColumns());\n      const s = {\n        search,\n        included: [],\n        excluded: []\n      };\n      const data2 = rebase ? this.data : this.currentData();\n      data2.forEach((datum2) => {\n        if (exec.run(datum2)) {\n          if (assign) {\n            datum2[FieldNames.Selected] = true;\n          }\n          s.included.push(datum2);\n        } else {\n          s.excluded.push(datum2);\n        }\n      });\n      return s;\n    }\n    deselect() {\n      this.deactivate();\n      this.data.forEach((datum2) => {\n        delete datum2[FieldNames.Selected];\n      });\n      this.selection = null;\n    }\n    hasFilteredData() {\n      return !!this.filteredData;\n    }\n    hasSelectedData() {\n      return !!this.selection;\n    }\n    collapse(collapsed, data2 = this.data) {\n      data2.forEach((datum2) => {\n        datum2[FieldNames.Collapsed] = collapsed;\n      });\n      this.isCollapsed = collapsed;\n    }\n    activate(datum2) {\n      this.deactivate();\n      datum2[FieldNames.Active] = true;\n      this.active = datum2;\n    }\n    deactivate() {\n      if (this.active) {\n        delete this.active[FieldNames.Active];\n      }\n      this.active = null;\n    }\n    ordinalIndexWithinSelection(ordinal2) {\n      if (this.selection) {\n        for (let i = 0; i < this.selection.included.length; i++) {\n          const datum2 = this.selection.included[i];\n          if (datum2[GL_ORDINAL] === ordinal2) {\n            return { datum: datum2, index: i };\n          }\n        }\n      }\n      return { datum: null, index: -1 };\n    }\n    finalize() {\n      this.data = null;\n      this.filteredData = null;\n      this.filteredColumnsStats = null;\n      if (this.selection) {\n        this.selection.excluded = null;\n        this.selection.included = null;\n        this.selection = null;\n      }\n    }\n  }\n  var Action;\n  (function(Action2) {\n    Action2[Action2[\"deselect\"] = 0] = \"deselect\";\n    Action2[Action2[\"isolate\"] = 1] = \"isolate\";\n    Action2[Action2[\"exclude\"] = 2] = \"exclude\";\n    Action2[Action2[\"reset\"] = 3] = \"reset\";\n    Action2[Action2[\"next\"] = 4] = \"next\";\n    Action2[Action2[\"previous\"] = 5] = \"previous\";\n  })(Action || (Action = {}));\n  class Details {\n    constructor(parentElement, language, animator, dataScope, colorMapHandler, hasColorMaps) {\n      this.language = language;\n      this.animator = animator;\n      this.dataScope = dataScope;\n      this.colorMapHandler = colorMapHandler;\n      this.hasColorMaps = hasColorMaps;\n      this.element = addDiv(parentElement, `${cssPrefix}unitControls`);\n      this.clear();\n    }\n    finalize() {\n      if (this.element)\n        this.element.innerHTML = \"\";\n      this.dataScope = null;\n      this.element = null;\n    }\n    clear() {\n      this.state = {\n        userSelection: null,\n        index: -1,\n        remapColor: false\n      };\n      this.render();\n    }\n    clearSelection() {\n      this.state.userSelection = null;\n      this.state.index = -1;\n      this.render();\n    }\n    populate(userSelection, index2 = 0) {\n      this.state.userSelection = userSelection;\n      this.state.index = index2;\n      this.render();\n    }\n    selectByNameValue(columnName, value2) {\n      const search = {\n        name: columnName,\n        operator: \"==\",\n        value: value2\n      };\n      this.clearSelection();\n      this.animator.select(search);\n      this.populate(this.dataScope.selection);\n    }\n    remapChanged(remap) {\n      this.state.remapColor = remap;\n      this.colorMapHandler(remap);\n      this.render();\n    }\n    handleAction(action) {\n      let p;\n      const u2 = this.state.userSelection;\n      switch (action) {\n        case Action.deselect: {\n          this.clearSelection();\n          p = this.animator.deselect();\n          break;\n        }\n        case Action.exclude: {\n          this.clearSelection();\n          p = this.animator.filter(invert$1(u2.search), u2.excluded, u2.included, false);\n          this.state.remapColor = false;\n          break;\n        }\n        case Action.isolate: {\n          this.clearSelection();\n          p = this.animator.filter(u2.search, u2.included, u2.excluded, false);\n          this.state.remapColor = false;\n          break;\n        }\n        case Action.reset: {\n          this.clear();\n          p = this.animator.reset();\n          break;\n        }\n        default: {\n          switch (action) {\n            case Action.previous: {\n              this.state.index--;\n              if (this.state.index < 0) {\n                this.state.index = this.state.userSelection.included.length - 1;\n              }\n              break;\n            }\n            case Action.next: {\n              this.state.index++;\n              if (this.state.index >= this.state.userSelection.included.length) {\n                this.state.index = 0;\n              }\n              break;\n            }\n          }\n          this.render();\n          p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n        }\n      }\n      p.then(() => this.render());\n    }\n    render() {\n      const hasRefinedData = this.dataScope.hasFilteredData();\n      const renderProps = {\n        language: this.language,\n        actionHandler: (action) => this.handleAction(action),\n        selectionHandler: (columnName, value2) => this.selectByNameValue(columnName, value2),\n        count: this.state.userSelection && this.state.userSelection.included.length,\n        hasRefinedData,\n        item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n        remapColorHandler: (remap) => this.remapChanged(remap),\n        hasColorMaps: this.hasColorMaps() && hasRefinedData,\n        remapColor: this.state.remapColor\n      };\n      const a2 = getActiveElementInfo();\n      mount(renderDetails(renderProps), this.element);\n      setActiveElement(a2);\n    }\n  }\n  const renderDetails = (props) => {\n    const controlButtons = [\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.deselect) }, props.language.deselect),\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.isolate) }, props.language.isolate),\n      createElement(\"button\", { disabled: !props.item, onClick: (e) => props.actionHandler(Action.exclude) }, props.language.exclude)\n    ];\n    const colorMapping = createElement(\n      \"div\",\n      null,\n      createElement(\"button\", { disabled: props.remapColor, onClick: (e) => props.remapColorHandler(true) }, props.language.newColorMap),\n      createElement(\"button\", { disabled: !props.remapColor, onClick: (e) => props.remapColorHandler(false) }, props.language.oldColorMap)\n    );\n    const singleItem = props.count === 1;\n    const scrollButtons = [\n      createElement(\"button\", { disabled: singleItem, onClick: (e) => props.actionHandler(Action.previous) }, props.language.previousDetail),\n      createElement(\"button\", { disabled: singleItem, onClick: (e) => props.actionHandler(Action.next) }, props.language.nextDetail),\n      createElement(\n        \"span\",\n        null,\n        \" \",\n        props.language.selectionCount(props.count)\n      )\n    ];\n    const rows = [];\n    for (const prop in props.item) {\n      if (prop === GL_ORDINAL) {\n        continue;\n      }\n      if (isInternalFieldName(prop)) {\n        continue;\n      }\n      rows.push({\n        cells: [\n          { content: prop },\n          { content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler) }\n        ]\n      });\n    }\n    return createElement(\n      \"div\",\n      null,\n      props.hasColorMaps && colorMapping,\n      createElement(\"h4\", null, props.language.headers.selection),\n      createElement(\n        \"div\",\n        { className: `${cssPrefix}selection` },\n        controlButtons,\n        createElement(\"button\", { disabled: !props.hasRefinedData, onClick: (e) => props.actionHandler(Action.reset) }, \"reset\")\n      ),\n      props.item && createElement(\"h4\", null, props.language.headers.details),\n      createElement(\n        \"div\",\n        null,\n        createElement(\"div\", { className: `${cssPrefix}details-scroll` }, props.item && scrollButtons),\n        createElement(\"div\", { className: `${cssPrefix}details` }, props.item && createElement(Table$1, { rows }))\n      )\n    );\n  };\n  function linkSelect(language, columnName, value2, selectionHandler) {\n    return createElement(\n      \"span\",\n      null,\n      createElement(\"a\", { href: \"#\", onClick: (e) => selectionHandler(columnName, value2) }, value2),\n      isNaN(value2) ? [\" \", createElement(\"a\", { className: \"bing-search\", href: `https://www.bing.com/search?q=${encodeURIComponent(value2)}`, target: \"_blank\" }, language.bing)] : \"\"\n    );\n  }\n  function ensureHeaders(presenter, headers) {\n    const vegaControls = presenter.getElement(PresenterElement.vegaControls);\n    conditionalHeader(!!vegaControls.querySelectorAll(\".vega-bindings > *\").length, vegaControls, headers.chart);\n    const legend2 = presenter.getElement(PresenterElement.legend);\n    conditionalHeader(!!legend2.children.length, legend2, headers.legend);\n  }\n  function conditionalHeader(condition, element2, header) {\n    const existing = existingHeader(element2, header);\n    if (condition && !existing) {\n      addHeader(element2, header);\n    }\n    if (!condition && existing) {\n      existing.remove();\n    }\n  }\n  function addHeader(element2, header) {\n    const h2 = document.createElement(\"h4\");\n    h2.innerHTML = header;\n    element2.insertAdjacentElement(\"beforebegin\", h2);\n  }\n  function existingHeader(element2, header) {\n    const { previousElementSibling } = element2;\n    if (previousElementSibling && previousElementSibling.innerHTML === header) {\n      return previousElementSibling;\n    }\n  }\n  function legendRange(colorBinType, column, legend2, clickedIndex) {\n    if (column.quantitative) {\n      return selectQuantitative(colorBinType, column, legend2, clickedIndex);\n    } else {\n      return selectCategorical(column, legend2, clickedIndex);\n    }\n  }\n  function selectCategorical(column, legend2, clickedIndex) {\n    const value2 = legend2.rows[clickedIndex].value;\n    if (value2 === Other) {\n      const values2 = [];\n      for (const i in legend2.rows) {\n        if (+i !== clickedIndex) {\n          values2.push(legend2.rows[i].value);\n        }\n      }\n      return selectNone(column, values2);\n    } else {\n      return { expressions: [selectExact(column, legend2.rows[clickedIndex].value)] };\n    }\n  }\n  function selectQuantitative(colorBinType, column, legend2, clickedIndex) {\n    const keys2 = Object.keys(legend2.rows).map((key2) => +key2).sort((a2, b2) => +a2 - +b2);\n    let lowValue;\n    let lowOperator;\n    let highValue;\n    let highOperator;\n    const rowText = legend2.rows[clickedIndex].label;\n    switch (colorBinType) {\n      case \"continuous\": {\n        lowValue = rowText;\n        if (clickedIndex < keys2.length - 1) {\n          highValue = legend2.rows[clickedIndex + 1].value;\n        }\n        break;\n      }\n      default: {\n        if (rowText.indexOf(\"null\") > 0) {\n          const ex = {\n            expressions: [selectNullOrEmpty(column)]\n          };\n          return ex;\n        }\n        const dash = rowText.indexOf(\"–\");\n        if (dash > 0) {\n          lowValue = rowText.substr(0, dash);\n          highValue = rowText.substr(dash + 1);\n        } else {\n          if (rowText.indexOf(\"<\") >= 0) {\n            highValue = rowText.substring(2);\n          } else {\n            if (rowText.indexOf(\"≥\") >= 0) {\n              lowValue = rowText.substring(2);\n            }\n          }\n        }\n      }\n    }\n    if (lowValue)\n      lowValue = notNice(lowValue);\n    if (highValue)\n      highValue = notNice(highValue);\n    if (lowValue === highValue) {\n      return { expressions: [selectExact(column, lowValue)] };\n    } else {\n      return selectBetween(column, lowValue, highValue, lowOperator, highOperator);\n    }\n  }\n  function finalizeLegend(colorBinType, colorColumn, legend2, language) {\n    const rowTexts = [];\n    for (const i in legend2.rows) {\n      const row = legend2.rows[i];\n      row.search = legendRange(colorBinType, colorColumn, legend2, +i);\n      if (row.value === Other) {\n        row.label = language.legendOther;\n      } else {\n        rowTexts.push(row.value);\n      }\n    }\n  }\n  function assignOrdinals(columns, data2, ordinalMap) {\n    const uCol = columns.uid && columns.uid.name;\n    if (ordinalMap) {\n      data2.forEach((d, i) => {\n        const key2 = uCol ? d[uCol] : i;\n        d[GL_ORDINAL] = ordinalMap[key2];\n      });\n    } else {\n      ordinalMap = {};\n      data2.forEach((d, i) => {\n        d[GL_ORDINAL] = i;\n        const uColValue = uCol ? d[uCol] : i;\n        ordinalMap[uColValue] = i;\n      });\n    }\n    return ordinalMap;\n  }\n  function getDataIndexOfCube(cube, data2) {\n    const len2 = data2.length;\n    for (let i = 0; i < len2; i++) {\n      if (data2[i][GL_ORDINAL] === cube.ordinal) {\n        return i;\n      }\n    }\n  }\n  const { push } = util;\n  function getSearchGroupFromVegaValue(search) {\n    let group2;\n    const vegaSearch = search;\n    if (Array.isArray(vegaSearch)) {\n      group2 = { expressions: [] };\n      vegaSearch.forEach((g) => {\n        const clonedExpressions = clone(g.expressions).filter(Boolean);\n        clonedExpressions[0].clause = \"&&\";\n        push(group2.expressions, clonedExpressions);\n      });\n    } else {\n      group2 = vegaSearch ? { expressions: vegaSearch.expressions.filter(Boolean) } : null;\n    }\n    return group2;\n  }\n  function applySignalValues(sv, b2) {\n    if (!sv || !b2 || !b2.signals || !b2.signals.length)\n      return;\n    for (const key2 in sv) {\n      const value2 = sv[key2];\n      const signalB = b2.signals.filter((signal) => signal.name === key2)[0];\n      if (signalB && signalB.bind) {\n        signalB.value = value2;\n      }\n    }\n  }\n  function extractSignalValuesFromView(view, spec) {\n    if (!view || !spec || !spec.signals || !spec.signals.length)\n      return;\n    const result = {};\n    spec.signals.forEach((signalA) => {\n      if (signalA.bind) {\n        try {\n          result[signalA.name] = view.signal(signalA.name);\n        } catch (e) {\n        }\n      }\n    });\n    return result;\n  }\n  const hideSignalUI = [\n    SignalNames.MarkOpacity,\n    SignalNames.TextAngleX,\n    SignalNames.TextAngleY\n  ];\n  function unbindSignalUI(spec) {\n    spec.signals.forEach((signal) => {\n      if (hideSignalUI.indexOf(signal.name) >= 0) {\n        delete signal.bind;\n      }\n    });\n  }\n  const { outerSize } = util;\n  const { Table } = controls;\n  class Tooltip {\n    constructor(props) {\n      this.props = props;\n      const renderProps = {\n        cssPrefix: props.cssPrefix,\n        rows: getRows(props.dataItem)\n      };\n      this.finalizeHandler = () => this.destroy();\n      this.element = renderTooltip(renderProps);\n      if (this.element) {\n        this.element.style.position = \"absolute\";\n        this.child = this.element.firstChild;\n        document.body.appendChild(this.element);\n        let m2 = outerSize(this.child);\n        while (m2.height > document.documentElement.clientHeight) {\n          const tr2 = this.child.querySelector(\"tr:last-child\");\n          if (tr2) {\n            tr2.parentElement.removeChild(tr2);\n          } else {\n            break;\n          }\n          m2 = outerSize(this.child);\n        }\n        let position2;\n        const te = props.event;\n        if (te.touches) {\n          position2 = te[0];\n        } else {\n          const pme = props.event;\n          position2 = pme;\n        }\n        if (position2.clientX + m2.width >= document.documentElement.clientWidth) {\n          this.child.style.right = \"0\";\n        }\n        let moveTop = true;\n        if (position2.clientY + m2.height >= document.documentElement.clientHeight) {\n          if (position2.clientY - m2.height > 0) {\n            this.child.style.bottom = \"0\";\n          } else {\n            moveTop = false;\n          }\n        }\n        if (moveTop) {\n          this.element.style.top = `${position2.clientY}px`;\n        }\n        this.element.style.left = `${position2.clientX}px`;\n        this.child.addEventListener(\"mouseenter\", this.finalizeHandler);\n        this.child.addEventListener(\"mousemove\", this.finalizeHandler);\n        this.child.addEventListener(\"mouseover\", this.finalizeHandler);\n      }\n    }\n    destroy() {\n      this.child.removeEventListener(\"mouseenter\", this.finalizeHandler);\n      this.child.removeEventListener(\"mousemove\", this.finalizeHandler);\n      this.child.removeEventListener(\"mouseover\", this.finalizeHandler);\n      if (this.element) {\n        document.body.removeChild(this.element);\n      }\n      this.element = null;\n    }\n  }\n  function cleanDataItem(item) {\n    const ret = {};\n    for (const columnName in item) {\n      if (columnName === GL_ORDINAL) {\n        continue;\n      }\n      if (isInternalFieldName(columnName)) {\n        continue;\n      }\n      ret[columnName] = item[columnName];\n    }\n    return ret;\n  }\n  function getRows(item) {\n    const rows = [];\n    for (const columnName in item) {\n      const value2 = item[columnName];\n      let content2;\n      switch (value2) {\n        case null:\n          content2 = createElement(\"i\", null, \"null\");\n          break;\n        case void 0:\n          content2 = createElement(\"i\", null, \"undefined\");\n          break;\n        default:\n          content2 = value2.toString();\n      }\n      rows.push({\n        cells: [\n          { content: columnName + \":\" },\n          { content: content2 }\n        ]\n      });\n    }\n    return rows;\n  }\n  const renderTooltip = (props) => {\n    return props.rows.length === 0 ? null : createElement(\"div\", { className: `${props.cssPrefix}tooltip` }, Table({ rows: props.rows }));\n  };\n  class CharacterSet {\n    resetCharacterSet(forceNewCharacterSet, oldInsight, newInsight) {\n      if (forceNewCharacterSet || needsNewCharacterSet(oldInsight, newInsight)) {\n        this.chars = void 0;\n      }\n    }\n    getCharacterSet(stage) {\n      if (!this.chars) {\n        const map2 = {};\n        const addText = (text2) => {\n          Array.from(text2).forEach((char) => {\n            map2[char] = true;\n          });\n        };\n        stage.textData.forEach((t) => addText(t.text));\n        const { x: x2, y: y2 } = stage.axes;\n        [x2, y2].forEach((axes) => {\n          axes.forEach((axis) => {\n            if (axis.tickText)\n              axis.tickText.forEach((t) => addText(t.text));\n            if (axis.title)\n              addText(axis.title.text);\n          });\n        });\n        this.chars = Object.keys(map2);\n      }\n      return this.chars;\n    }\n  }\n  function needsNewCharacterSet(oldInsight, newInsight) {\n    if (!oldInsight)\n      return true;\n    if (!newInsight)\n      return true;\n    if (oldInsight.chart !== newInsight.chart)\n      return true;\n    if (oldInsight.facetStyle !== newInsight.facetStyle)\n      return true;\n    if (oldInsight.totalStyle !== newInsight.totalStyle)\n      return true;\n    if (oldInsight.hideAxes !== newInsight.hideAxes)\n      return true;\n    if (differentObjectValues(oldInsight.signalValues, newInsight.signalValues))\n      return true;\n    if (differentObjectValues(oldInsight.size, newInsight.size))\n      return true;\n    const oldColumns = oldInsight.columns;\n    const newColumns = newInsight.columns;\n    if (oldColumns.facet !== newColumns.facet)\n      return true;\n    if (oldColumns.facetV !== newColumns.facetV)\n      return true;\n    if (oldColumns.x !== newColumns.x)\n      return true;\n    if (oldColumns.y !== newColumns.y)\n      return true;\n    if (oldColumns.z !== newColumns.z)\n      return true;\n    return false;\n  }\n  function differentObjectValues(a2, b2) {\n    if (!a2 && !b2)\n      return false;\n    if (!a2 || !b2)\n      return true;\n    const keys2 = Object.keys(b2);\n    for (let i = 0; i < keys2.length; i++) {\n      const key2 = keys2[i];\n      const ta = typeof a2;\n      const tb = typeof b2;\n      if (ta !== tb)\n        return true;\n      if (ta === \"object\") {\n        return differentObjectValues(a2[key2], b2[key2]);\n      } else {\n        if (a2[key2] !== b2[key2])\n          return true;\n      }\n    }\n    return false;\n  }\n  function assignTransitionStagger(transition, currentData, selection, presenter) {\n    const { layerStagger } = presenter.morphchartsref;\n    const { morphChartsRenderResult } = presenter;\n    const cubelayer = morphChartsRenderResult.getCubeLayer();\n    const range2 = transition.reverse ? [1, 0] : [0, 1];\n    if (!transition || transition.type === \"ordinal\" && !transition.reverse) {\n      delete layerStagger.cubes;\n    } else {\n      const staggerOrders = new Float64Array(cubelayer.positionsX.length);\n      switch (transition.type) {\n        case \"ordinal\": {\n          const scale2 = linear(range2).domain([0, currentData.length]);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            staggerOrders[glOrdinal] = scale2(i);\n          });\n          break;\n        }\n        case \"column\": {\n          if (transition.column.quantitative) {\n            const values2 = new Float64Array(currentData.length);\n            currentData.forEach((datum2, i) => {\n              values2[i] = datum2[transition.column.name];\n            });\n            const stats = getStats(currentData, transition.column);\n            const scale2 = linear(range2).domain([stats.min, stats.max]);\n            currentData.forEach((datum2, i) => {\n              const glOrdinal = datum2[GL_ORDINAL];\n              staggerOrders[glOrdinal] = scale2(values2[i]);\n            });\n          } else {\n            const strings = new Array(currentData.length);\n            currentData.forEach((datum2, i) => {\n              strings[i] = datum2[transition.column.name];\n            });\n            getStats(currentData, transition.column, (distictValues) => {\n              currentData.forEach((datum2, i) => {\n                const glOrdinal = datum2[GL_ORDINAL];\n                const index2 = distictValues.indexOf(strings[i]);\n                const staggerOrder = index2 / distictValues.length;\n                staggerOrders[glOrdinal] = transition.reverse ? 1 - staggerOrder : staggerOrder;\n              });\n            });\n          }\n          break;\n        }\n        case \"position\": {\n          const dimensions = {\n            x: cubelayer.positionsX,\n            y: cubelayer.positionsY,\n            z: cubelayer.positionsZ\n          };\n          const positions = dimensions[transition.dimension];\n          const values2 = new Float64Array(currentData.length);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            values2[i] = positions[glOrdinal];\n          });\n          const stats = getStats(values2, null, \"number\", true);\n          const scale2 = linear(range2).domain([stats.min, stats.max]);\n          currentData.forEach((datum2, i) => {\n            const glOrdinal = datum2[GL_ORDINAL];\n            staggerOrders[glOrdinal] = scale2(values2[i]);\n          });\n          break;\n        }\n      }\n      layerStagger.cubes = { staggerOrders, maxStaggerOrder: 1, minStaggerOrder: 0 };\n    }\n    cubelayer.update(morphChartsRenderResult.bounds, selection, layerStagger.cubes);\n  }\n  var __awaiter = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  const { defaultView } = defaults;\n  const zAxisZindex = 1010;\n  let didRegisterColorSchemes = false;\n  class Viewer {\n    /**\n     * Instantiate a new Viewer.\n     * @param element Parent HTMLElement to present within.\n     * @param options Optional viewer options object.\n     */\n    constructor(element2, options) {\n      this.element = element2;\n      this.options = deepMerge(defaultViewerOptions, options);\n      this.presenter = new Presenter(element2, getPresenterStyle(this.options));\n      this._characterSet = new CharacterSet();\n      this._dataScope = new DataScope();\n      this._animator = new Animator(this._dataScope, {\n        onDataChanged: this.onDataChanged.bind(this),\n        onAnimateDataChange: this.onAnimateDataChange.bind(this)\n      });\n      this._details = new Details(this.presenter.getElement(PresenterElement.panel), this.options.language, this._animator, this._dataScope, (remap) => {\n        this.currentColorContext = ~~remap;\n        this.renderSameLayout();\n      }, () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1);\n      this.insight = {};\n    }\n    changeColorContexts(colorContexts) {\n      this.colorContexts = colorContexts;\n      this.currentColorContext = 0;\n      this.options.onColorContextChange && this.options.onColorContextChange();\n    }\n    applyLegendColorContext(colorContext) {\n      const a2 = getActiveElementInfo();\n      mount(colorContext.legendElement, this.presenter.getElement(PresenterElement.legend));\n      setActiveElement(a2);\n      this.presenter.stage.legend = colorContext.legend;\n    }\n    onAnimateDataChange(dataChange, waitingLabel, handlerLabel, time2) {\n      var _a;\n      if (time2 === void 0) {\n        const transitionDurations = ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transitionDurations) || defaultPresenterConfig.transitionDurations;\n        time2 = transitionDurations.position + transitionDurations.stagger;\n      }\n      return new Promise((resolve2, reject) => {\n        let innerPromise;\n        if (dataChange === DataLayoutChange.refine) {\n          const oldColorContext = this.colorContexts[this.currentColorContext];\n          innerPromise = new Promise((innerResolve) => {\n            this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, cubeLayer) => {\n              finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n              this.overrideAxisLabels(stage);\n              cubeLayer.unitColorMap = oldColorContext.colorMap;\n              if (this.options.onStage) {\n                this.options.onStage(stage);\n              }\n            } })).then(() => {\n              this.applyLegendColorContext(oldColorContext);\n              innerResolve();\n            });\n          });\n        } else {\n          innerPromise = this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, colorMapper) => {\n            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n            this.overrideAxisLabels(stage);\n            if (this.options.onStage) {\n              this.options.onStage(stage);\n            }\n          } }));\n        }\n        innerPromise.then(() => {\n          this.presenter.animationQueue(resolve2, time2, { waitingLabel, handlerLabel, animationCanceled: reject });\n        });\n      });\n    }\n    onDataChanged(dataLayout, filter2) {\n      return __awaiter(this, void 0, void 0, function* () {\n        switch (dataLayout) {\n          case DataLayoutChange.same: {\n            const hasSelectedData = this._dataScope.hasSelectedData();\n            const hasActive = !!this._dataScope.active;\n            if (hasSelectedData || hasActive) {\n              this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n            } else {\n              this.presenter.morphChartsRenderResult.update({ cubes: null });\n            }\n            break;\n          }\n          case DataLayoutChange.refine: {\n            const oldColorContext = this.colorContexts[this.currentColorContext];\n            let colorMap;\n            this.presenter.morphChartsRenderResult.update({ cubes: null });\n            yield this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { preStage: (stage, cubeLayer) => {\n              colorMap = cubeLayer.unitColorMap;\n              cubeLayer.unitColorMap = oldColorContext.colorMap;\n              this.preStage(stage, cubeLayer);\n            }, onPresent: () => {\n              const newColorContext = {\n                colorMap,\n                legend: clone(this.presenter.stage.legend),\n                legendElement: this.presenter.getElement(PresenterElement.legend).children[0]\n              };\n              this.applyLegendColorContext(oldColorContext);\n              this.changeColorContexts([oldColorContext, newColorContext]);\n              this.onPresent();\n            } }));\n            if (!compare(this.insight.filter, filter2)) {\n              this.insight.filter = narrow(this.insight.filter, filter2);\n            }\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n            }\n            break;\n          }\n          case DataLayoutChange.reset: {\n            const colorContext = {\n              colorMap: null,\n              legend: null,\n              legendElement: null\n            };\n            this.changeColorContexts([colorContext]);\n            this.presenter.morphChartsRenderResult.update({ cubes: null });\n            yield this.renderNewLayout({}, Object.assign(Object.assign({}, this.setup || {}), { onPresent: () => {\n              populateColorContext(colorContext, this.presenter);\n              this.onPresent();\n            } }));\n            delete this.insight.filter;\n            if (this.options.onDataFilter) {\n              this.options.onDataFilter(null, null);\n            }\n            break;\n          }\n        }\n        if (this.options.onSelectionChanged) {\n          const sel = this.getSelection();\n          this.options.onSelectionChanged(sel && sel.search || null, 0, sel && sel.selectedData || null);\n        }\n      });\n    }\n    convertSearchToSet() {\n      if (this._dataScope.selection) {\n        const s = /* @__PURE__ */ new Set();\n        let found = false;\n        this._dataScope.selection.included.forEach((o, i) => {\n          s.add(o[GL_ORDINAL]);\n          found = true;\n        });\n        if (!found) {\n          s.add(-1);\n        }\n        return s;\n      }\n    }\n    convertSetToSearch(s) {\n      const search = {\n        expressions: []\n      };\n      s.forEach((value2) => {\n        search.expressions.push({\n          name: GL_ORDINAL,\n          operator: \"==\",\n          value: value2,\n          clause: \"||\"\n        });\n      });\n      return search;\n    }\n    getSpecColumnsWithFilteredStats() {\n      if (!this._dataScope.hasFilteredData()) {\n        return this._specColumns;\n      }\n      const roles = [\"color\", \"facet\", \"group\", \"size\", \"sort\", \"sum\", \"x\", \"y\", \"z\"];\n      const specColumns = Object.assign({}, this._specColumns);\n      roles.forEach((r) => {\n        if (specColumns[r]) {\n          const column = Object.assign({}, specColumns[r]);\n          column.stats = this.getColumnStats(column);\n          specColumns[r] = column;\n        }\n      });\n      return specColumns;\n    }\n    renderNewLayout(signalValues, presenterConfig, view) {\n      return __awaiter(this, void 0, void 0, function* () {\n        const currData = this._dataScope.currentData();\n        const context2 = {\n          specColumns: this.getSpecColumnsWithFilteredStats(),\n          insight: this.insight,\n          specViewOptions: Object.assign(Object.assign({}, this.options), { zAxisOptions: {\n            showZAxis: true,\n            zIndex: zAxisZindex\n          }, collapseFacetAxes: true })\n        };\n        const specResult = build(context2, currData);\n        if (!specResult.errors) {\n          const uiValues = extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n          applySignalValues(Object.assign(Object.assign({}, uiValues), signalValues), specResult.vegaSpec);\n          unbindSignalUI(specResult.vegaSpec);\n          this.vegaSpec = specResult.vegaSpec;\n          this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n          this.specCapabilities = specResult.specCapabilities;\n          const config = this.createConfig(presenterConfig);\n          this._lastPresenterConfig = config.presenterConfig;\n          if (view) {\n            config.getView = () => view;\n          }\n          if (!didRegisterColorSchemes) {\n            registerColorSchemes(base.vega);\n            didRegisterColorSchemes = true;\n          }\n          try {\n            if (this.vegaViewGl) {\n              this.vegaViewGl.finalize();\n            }\n            const runtime2 = base.vega.parse(this.vegaSpec);\n            this.vegaViewGl = new ViewGl(runtime2, config).renderer(\"morphcharts\").initialize(this.element);\n            yield this.vegaViewGl.runAsync();\n            const handler = (n, v) => {\n              this._characterSet.resetCharacterSet(true);\n            };\n            this.vegaSpec.signals.forEach((s) => {\n              this.vegaViewGl.addSignalListener(s.name, handler);\n            });\n            this.configForSignalCapture(config.presenterConfig);\n          } catch (e) {\n            specResult.errors = [e.message];\n          }\n          if (!specResult.errors) {\n            ensureHeaders(this.presenter, this.options.language.headers);\n          }\n        }\n        if (specResult.errors) {\n          if (this.options.onError) {\n            this.options.onError(specResult.errors);\n          } else if (this.presenter.logger) {\n            this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join(\"\\n\")}`);\n          }\n        }\n        return specResult;\n      });\n    }\n    /**\n     * Render the same layout with new options.\n     * @param newViewerOptions New options object.\n     */\n    renderSameLayout(newViewerOptions) {\n      const colorContext = this.colorContexts[this.currentColorContext];\n      this.applyLegendColorContext(colorContext);\n      if (newViewerOptions) {\n        if (newViewerOptions.colors) {\n          const mcColors = this.getMorphChartsColors();\n          this.presenter.configColors(mcColors);\n          this._lastPresenterConfig.morphChartsColors = mcColors;\n        }\n        this.options = deepMerge(this.options, newViewerOptions);\n      }\n      this.presenter.morphChartsRenderResult.getCubeLayer().unitColorMap = colorContext.colorMap;\n      this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n    }\n    getView(view) {\n      if (view === void 0) {\n        if (this.presenter.view === null) {\n          return defaultView;\n        } else {\n          return this.presenter.view;\n        }\n      } else {\n        return view;\n      }\n    }\n    transformData(values2, transform2) {\n      try {\n        const runtime2 = base.vega.parse({\n          $schema: \"https://vega.github.io/schema/vega/v4.json\",\n          data: [{\n            name: \"source\",\n            values: values2,\n            transform: transform2\n          }]\n        });\n        new ViewGl(runtime2).run();\n      } catch (e) {\n      }\n      return values2;\n    }\n    /**\n     * Render data into a visualization.\n     * @param insightSetup InsightSetup object to create a visualization rendering.\n     * @param data Array of data objects.\n     * @param renderOptions Optional RenderOptions object.\n     */\n    render(insightSetup_1, data_1) {\n      return __awaiter(this, arguments, void 0, function* (insightSetup, data2, renderOptions = {}) {\n        const { insight: insight2, setup: setup2 } = insightSetup;\n        let result;\n        if (!compare(insight2.filter, this.insight.filter)) {\n          const transitionDurations = (setup2 === null || setup2 === void 0 ? void 0 : setup2.transitionDurations) || defaultPresenterConfig.transitionDurations;\n          const renderTime = transitionDurations.position + transitionDurations.stagger;\n          const allowAsyncRenderTime = renderTime + this.options.filterRenderingTimerPadding;\n          if (insight2.filter) {\n            result = yield this._render(insightSetup, data2, renderOptions, true);\n            this.presenter.animationQueue(() => {\n              this.filter(insight2.filter, renderOptions.rebaseFilter && renderOptions.rebaseFilter());\n            }, allowAsyncRenderTime, { waitingLabel: \"layout before refine\", handlerLabel: \"refine after layout\" });\n          } else {\n            this._dataScope.setFilteredData(null);\n            result = yield this._render(insightSetup, data2, renderOptions, true);\n            this.presenter.animationQueue(() => {\n              this.reset();\n            }, allowAsyncRenderTime, { waitingLabel: \"layout before reset\", handlerLabel: \"reset after layout\" });\n          }\n        } else {\n          result = yield this._render(insightSetup, data2, renderOptions, false);\n        }\n        return result;\n      });\n    }\n    shouldViewstateTransition(newInsight, oldInsight) {\n      if (!oldInsight.columns)\n        return false;\n      if (oldInsight.chart !== newInsight.chart)\n        return true;\n      if (oldInsight.size.height !== newInsight.size.height)\n        return true;\n      if (oldInsight.size.width !== newInsight.size.width)\n        return true;\n      if (oldInsight.columns.facet !== newInsight.columns.facet)\n        return true;\n      return false;\n    }\n    configForSignalCapture(presenterConfig) {\n      const colorContext = {\n        colorMap: null,\n        legend: null,\n        legendElement: null\n      };\n      presenterConfig.preStage = (stage, cubeLayer) => {\n        if (this._shouldSaveColorContext()) {\n          colorContext.colorMap = cubeLayer.unitColorMap;\n        }\n        this.preStage(stage, cubeLayer);\n      };\n      presenterConfig.onPresent = () => {\n        if (this._shouldSaveColorContext()) {\n          populateColorContext(colorContext, this.presenter);\n          this.changeColorContexts([colorContext]);\n          this._dataScope.deselect();\n        }\n        this.onPresent();\n      };\n    }\n    onPresent() {\n      var _a;\n      if ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transition) {\n        assignTransitionStagger(this.setup.transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n      }\n      this.options.onPresent && this.options.onPresent();\n    }\n    _render(insightSetup, data2, renderOptions, forceNewCharacterSet) {\n      return __awaiter(this, void 0, void 0, function* () {\n        const { insight: insight2, setup: setup2 } = insightSetup;\n        if (this._tooltip) {\n          this._tooltip.destroy();\n          this._tooltip = null;\n        }\n        if (this._dataScope.setData(data2, renderOptions.columns)) {\n          this.transformData(data2, insight2.transform);\n        }\n        this._specColumns = getSpecColumns(insight2, this._dataScope.getColumns(renderOptions.columnTypes));\n        const ordinalMap = assignOrdinals(this._specColumns, data2, renderOptions.ordinalMap);\n        this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight2);\n        this.insight = clone(insight2);\n        this.setup = setup2;\n        this._shouldSaveColorContext = () => !renderOptions.initialColorContext;\n        const colorContext = renderOptions.initialColorContext || {\n          colorMap: null,\n          legend: null,\n          legendElement: null\n        };\n        const specResult = yield this.renderNewLayout(insight2.signalValues, Object.assign(Object.assign({}, setup2 || {}), { preStage: (stage, cubeLayer) => {\n          if (this._shouldSaveColorContext()) {\n            colorContext.colorMap = cubeLayer.unitColorMap;\n          } else {\n            cubeLayer.unitColorMap = colorContext.colorMap;\n          }\n          const hasSelectedData = !!this._dataScope.hasSelectedData();\n          if (hasSelectedData || this._dataScope.active) ;\n          this.preStage(stage, cubeLayer);\n        }, onPresent: () => {\n          if (this._shouldSaveColorContext()) {\n            populateColorContext(colorContext, this.presenter);\n            this.changeColorContexts([colorContext]);\n          } else {\n            this.applyLegendColorContext(colorContext);\n          }\n          this.onPresent();\n        }, shouldViewstateTransition: () => this.shouldViewstateTransition(insight2, this.insight) }), this.getView(insight2.view));\n        this._shouldSaveColorContext = () => !renderOptions.discardColorContextUpdates || !renderOptions.discardColorContextUpdates();\n        this._details.render();\n        const result = { ordinalMap, specResult };\n        return result;\n      });\n    }\n    overrideAxisLabels(stage) {\n    }\n    preLayer(stage) {\n      let axisRole;\n      for (axisRole in stage.axes) {\n        const capability = this.specCapabilities.roles.filter((r) => r.role === axisRole)[0];\n        if (capability && (capability.axisSelectionBetweenTicks || capability.axisSelection === \"exact\")) {\n          moveTicksBetween(stage.axes[axisRole]);\n        }\n      }\n    }\n    preStage(stage, cubeLayer) {\n      this.overrideAxisLabels(stage);\n      this._axisSelection = new AxisSelection(this.specCapabilities, this._specColumns, stage);\n      finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n      if (this.options.onStage) {\n        this.options.onStage(stage);\n      }\n    }\n    onCubeClick(e, cube) {\n      this.options.onCubeClick && this.options.onCubeClick(e, cube);\n      const hasSelectedData = this._dataScope.hasSelectedData();\n      if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n        const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n        if (indexWithinSelection.index >= 0) {\n          this.activate(indexWithinSelection.datum);\n          this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n          if (this.options.onSelectionChanged) {\n            const sel = this.getSelection();\n            this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n          }\n          return;\n        }\n      }\n      if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][GL_ORDINAL] === cube.ordinal) {\n        this.deselect();\n        return;\n      }\n      const search = {\n        name: GL_ORDINAL,\n        operator: \"==\",\n        value: cube.ordinal\n      };\n      this.select(search);\n    }\n    onCubeHover(event2, cube) {\n      var _a, _b;\n      if (this._tooltip) {\n        this._tooltip.destroy();\n        this._tooltip = null;\n      }\n      if (!cube) {\n        return;\n      }\n      const currentData = this._dataScope.currentData();\n      const index2 = getDataIndexOfCube(cube, currentData);\n      if (index2 >= 0) {\n        const dataItem = cleanDataItem(((_a = this.options.tooltipOptions) === null || _a === void 0 ? void 0 : _a.prepareDataItem(currentData[index2])) || currentData[index2]);\n        const tooltipCreateOptions = {\n          dataItem,\n          event: event2\n        };\n        if ((_b = this.options.tooltipOptions) === null || _b === void 0 ? void 0 : _b.create) {\n          this._tooltip = this.options.tooltipOptions.create(tooltipCreateOptions);\n        } else {\n          this._tooltip = new Tooltip(Object.assign(Object.assign({}, tooltipCreateOptions), { cssPrefix: this.presenter.style.cssPrefix }));\n        }\n      }\n    }\n    onTextHover(e, t) {\n      if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor)\n        return false;\n      return !colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n    }\n    getMorphChartsColors() {\n      const { colors: colors2 } = this.options;\n      return {\n        activeItemColor: colors2.activeCube,\n        axesGridBackgroundColor: colors2.backgroundColor,\n        axesGridHighlightColor: colors2.axisSelectHighlight,\n        axesGridMajorColor: colors2.gridLine,\n        axesGridMinorColor: colors2.gridLine,\n        axesGridZeroColor: colors2.gridLine,\n        axesTextHeadingColor: colors2.axisText,\n        axesTextLabelColor: colors2.axisText,\n        axesTextTitleColor: colors2.axisText,\n        backgroundColor: colors2.backgroundColor,\n        textBorderColor: colors2.backgroundColor,\n        textColor: colors2.axisText\n      };\n    }\n    createConfig(c2) {\n      var _a;\n      const { getTextColor, getTextHighlightColor, onTextClick } = this.options;\n      const defaultPresenterConfig2 = {\n        morphChartsColors: this.getMorphChartsColors(),\n        zAxisZindex,\n        getCharacterSet: (stage) => this._characterSet.getCharacterSet(stage),\n        getTextColor,\n        getTextHighlightColor,\n        onTextClick: (e, t) => {\n          if (t.metaData && t.metaData.search) {\n            const search = getSearchGroupFromVegaValue(t.metaData.search);\n            if (this.options.onAxisClick) {\n              this.options.onAxisClick(e, search);\n            } else {\n              this.select(search);\n            }\n          }\n          if (onTextClick) {\n            onTextClick(e, t);\n          }\n        },\n        onCubeClick: this.onCubeClick.bind(this),\n        onCubeHover: this.onCubeHover.bind(this),\n        onTextHover: this.onTextHover.bind(this),\n        preLayer: this.preLayer.bind(this),\n        preStage: this.preStage.bind(this),\n        onPresent: this.onPresent.bind(this),\n        onAxisConfig: (cartesian2, dim3d, axis) => {\n          if (!axis)\n            return;\n          const role = this.specCapabilities.roles.filter((r) => r.role === axis.axisRole)[0];\n          if (role === null || role === void 0 ? void 0 : role.axisSelection) {\n            cartesian2.isDivisionPickingEnabled[dim3d] = true;\n            cartesian2.arePickDivisionsVisible[dim3d] = axis.tickText.length > 0;\n            cartesian2.isLabelPickingEnabled[dim3d] = true;\n            cartesian2.isTitlePickingEnabled[dim3d] = true;\n            cartesian2.isHeadingPickingEnabled[dim3d] = true;\n            cartesian2.isGridPickingEnabled = false;\n          }\n        },\n        onAxesComplete: (cartesian2) => {\n        },\n        axisPickGridCallback: (divisions, e) => {\n          const search = this._axisSelection.convert(divisions);\n          if (this.options.onAxisClick) {\n            this.options.onAxisClick(e, search);\n          } else {\n            this.select(search);\n          }\n        },\n        onLayerClick: (e) => {\n          this.options.onCanvasClick && this.options.onCanvasClick(e);\n          this.deselect();\n        },\n        onLegendClick: (e, legend2, clickedIndex) => {\n          const legendRow = clickedIndex !== null && legend2.rows[clickedIndex];\n          if (legendRow) {\n            if (this.options.onLegendRowClick) {\n              this.options.onLegendRowClick(e, legendRow);\n            } else {\n              this.select(legendRow.search);\n            }\n          } else if (this.options.onLegendHeaderClick) {\n            this.options.onLegendHeaderClick(e);\n          }\n        },\n        onSceneRectAssignCubeOrdinal: (datum2) => {\n          return datum2[GL_ORDINAL];\n        },\n        onTargetViewState: (h2, w2) => {\n          const { height: height2, width: width2 } = this.insight.size;\n          let newViewStateTarget;\n          if (this.options.onNewViewStateTarget) {\n            newViewStateTarget = this.options.onNewViewStateTarget();\n          }\n          return { height: height2, width: width2, newViewStateTarget };\n        },\n        layerSelection: {\n          cubes: this.convertSearchToSet()\n        },\n        preserveDrawingBuffer: this.options.preserveDrawingBuffer\n      };\n      if (!this.options.disableLasso) {\n        defaultPresenterConfig2.onLasso = (ids, e) => {\n          this.deselect();\n          const search = this.convertSetToSearch(ids);\n          this.select(search);\n        };\n      }\n      if (this.options.onBeforeCreateLayers) {\n        defaultPresenterConfig2.preLayer = (stage) => {\n          this.preLayer(stage);\n          this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n        };\n      }\n      const config = {\n        presenter: this.presenter,\n        presenterConfig: Object.assign(defaultPresenterConfig2, c2)\n      };\n      if ((_a = this.setup) === null || _a === void 0 ? void 0 : _a.transitionDurations) {\n        config.presenterConfig.transitionDurations = this.setup.transitionDurations;\n      }\n      return config;\n    }\n    /**\n     * Filter the data and animate.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter.\n     */\n    filter(search, rebase = false) {\n      const u2 = this._dataScope.createUserSelection(search, false, rebase);\n      return new Promise((resolve2, reject) => {\n        this._animator.filter(search, u2.included, u2.excluded, rebase).then(() => {\n          this._details.clear();\n          this._details.clearSelection();\n          this._details.populate(this._dataScope.selection);\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Remove any filtration and animate.\n     */\n    reset() {\n      return new Promise((resolve2, reject) => {\n        this._animator.reset().then(() => {\n          this._details.clear();\n          this._details.clearSelection();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Select cubes by a filter expression.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     */\n    select(search) {\n      return new Promise((resolve2, reject) => {\n        this._animator.select(search).then(() => {\n          this._details.populate(this._dataScope.selection);\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Removes any selection.\n     */\n    deselect() {\n      return new Promise((resolve2, reject) => {\n        this._animator.deselect().then(() => {\n          this._details.clearSelection();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Gets the current selection.\n     */\n    getSelection() {\n      if (!this._dataScope)\n        return null;\n      const selectionState = {\n        search: this._dataScope.selection && this._dataScope.selection.search || null,\n        selectedData: this._dataScope.selection && this._dataScope.selection.included || null,\n        active: this._dataScope.active\n      };\n      return selectionState;\n    }\n    /**\n     * Set one data row to the active state.\n     */\n    activate(datum2) {\n      return new Promise((resolve2, reject) => {\n        this._animator.activate(datum2).then(() => {\n          this.presenter.morphChartsRenderResult.activate(datum2[GL_ORDINAL]);\n          this._details.render();\n          resolve2();\n        });\n      });\n    }\n    /**\n     * Deactivate item.\n     */\n    deActivate() {\n      return new Promise((resolve2, reject) => {\n        if (this._dataScope && this._dataScope.active) {\n          this._animator.deactivate().then(() => {\n            this.presenter.morphChartsRenderResult.activate(-1);\n            this._details.render();\n            resolve2();\n          });\n        } else {\n          resolve2();\n        }\n      });\n    }\n    /**\n     * Gets the current camera.\n     * @param transitionFinal Optional flag to get camera destination when transition completes.\n     */\n    getCamera(transitionFinal = false) {\n      var _a, _b, _c, _d, _e, _f, _g;\n      let position2 = [0, 0, 0];\n      let rotation2 = [0, 0, 0, 0];\n      if (transitionFinal) {\n        position2 = Array.from((_b = (_a = this.presenter) === null || _a === void 0 ? void 0 : _a.morphchartsref) === null || _b === void 0 ? void 0 : _b.cameraTransitioner.vPosition.to);\n        rotation2 = Array.from((_d = (_c = this.presenter) === null || _c === void 0 ? void 0 : _c.morphchartsref) === null || _d === void 0 ? void 0 : _d.cameraTransitioner.qRotation.to);\n      } else {\n        const camera = (_g = (_f = (_e = this.presenter) === null || _e === void 0 ? void 0 : _e.morphchartsref) === null || _f === void 0 ? void 0 : _f.core) === null || _g === void 0 ? void 0 : _g.camera;\n        if (camera) {\n          camera.getPosition(position2);\n          camera.getOrbit(rotation2);\n        }\n      }\n      return { position: position2, rotation: rotation2, captureSize: this.insight.size };\n    }\n    /**\n     * Sets the current camera.\n     * @param camera Camera to set.\n     */\n    setCamera(camera) {\n      var _a, _b;\n      if (camera) {\n        (_b = (_a = this.presenter) === null || _a === void 0 ? void 0 : _a.morphChartsRenderResult) === null || _b === void 0 ? void 0 : _b.moveCamera(camera);\n      }\n    }\n    /**\n     * Gets the current insight with signal values.\n     */\n    getInsight() {\n      const insight2 = Object.assign({}, this.insight);\n      insight2.signalValues = this.getSignalValues();\n      return insight2;\n    }\n    /**\n     * Gets column stats from current data (filtered or all).\n     * @param column Column to get stats for.\n     */\n    getColumnStats(column) {\n      return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n    }\n    /**\n     * Gets current signal values.\n     */\n    getSignalValues() {\n      return extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n    }\n    assignTransitionStagger(transition) {\n      assignTransitionStagger(transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n    }\n    finalize() {\n      if (this._dataScope)\n        this._dataScope.finalize();\n      if (this._details)\n        this._details.finalize();\n      if (this._tooltip)\n        this._tooltip.destroy();\n      if (this.vegaViewGl)\n        this.vegaViewGl.finalize();\n      if (this.presenter)\n        this.presenter.finalize();\n      if (this.element)\n        this.element.innerHTML = \"\";\n      this.colorContexts = null;\n      this.element = null;\n      this.options = null;\n      this.presenter = null;\n      this.vegaSpec = null;\n      this.vegaViewGl = null;\n      this._animator = null;\n      this._dataScope = null;\n      this._details = null;\n      this._tooltip = null;\n    }\n  }\n  Viewer.defaultViewerOptions = defaultViewerOptions;\n  const use = use$1;\n  const data = [];\n  const size = 100;\n  for (let x2 = 0; x2 < size; x2++) {\n    for (let y2 = 0; y2 < size; y2++) {\n      const id2 = x2 * y2;\n      const z = Math.random() * size * (x2 % 10) * (y2 % 10);\n      const w2 = Math.random() * size;\n      data.push({ id: id2, x: x2, y: y2, z, w: w2 });\n    }\n  }\n  use(vega$1);\n  const viewer = new Viewer(document.getElementById(\"vis\"));\n  const insight = {\n    columns: {\n      color: \"z\",\n      uid: \"id\",\n      x: \"x\",\n      y: \"y\",\n      z: \"z\"\n    },\n    scheme: \"blues\",\n    size: { height: 500, width: 500 },\n    chart: \"scatterplot\",\n    view: \"3d\"\n  };\n  viewer.render({ insight }, data);\n}));\n"
  },
  {
    "path": "docs/tests/v4/es6/js/vega-morphcharts-test-es6.js",
    "content": "(function(factory) {\n  typeof define === \"function\" && define.amd ? define(factory) : factory();\n})((function() {\n  \"use strict\";\n  function accessor(fn, fields, name) {\n    fn.fields = fields || [];\n    fn.fname = name;\n    return fn;\n  }\n  function accessorName(fn) {\n    return fn == null ? null : fn.fname;\n  }\n  function accessorFields(fn) {\n    return fn == null ? null : fn.fields;\n  }\n  function getter$1(path2) {\n    return path2.length === 1 ? get1(path2[0]) : getN(path2);\n  }\n  const get1 = (field2) => function(obj) {\n    return obj[field2];\n  };\n  const getN = (path2) => {\n    const len2 = path2.length;\n    return function(obj) {\n      for (let i = 0; i < len2; ++i) {\n        obj = obj[path2[i]];\n      }\n      return obj;\n    };\n  };\n  function error(message) {\n    throw Error(message);\n  }\n  function splitAccessPath(p) {\n    const path2 = [], n = p.length;\n    let q = null, b2 = 0, s = \"\", i, j, c2;\n    p = p + \"\";\n    function push() {\n      path2.push(s + p.substring(i, j));\n      s = \"\";\n      i = j + 1;\n    }\n    for (i = j = 0; j < n; ++j) {\n      c2 = p[j];\n      if (c2 === \"\\\\\") {\n        s += p.substring(i, j++);\n        i = j;\n      } else if (c2 === q) {\n        push();\n        q = null;\n        b2 = -1;\n      } else if (q) {\n        continue;\n      } else if (i === b2 && c2 === '\"') {\n        i = j + 1;\n        q = c2;\n      } else if (i === b2 && c2 === \"'\") {\n        i = j + 1;\n        q = c2;\n      } else if (c2 === \".\" && !b2) {\n        if (j > i) {\n          push();\n        } else {\n          i = j + 1;\n        }\n      } else if (c2 === \"[\") {\n        if (j > i) push();\n        b2 = i = j + 1;\n      } else if (c2 === \"]\") {\n        if (!b2) error(\"Access path missing open bracket: \" + p);\n        if (b2 > 0) push();\n        b2 = 0;\n        i = j + 1;\n      }\n    }\n    if (b2) error(\"Access path missing closing bracket: \" + p);\n    if (q) error(\"Access path missing closing quote: \" + p);\n    if (j > i) {\n      j++;\n      push();\n    }\n    return path2;\n  }\n  function field$1(field2, name, opt) {\n    const path2 = splitAccessPath(field2);\n    field2 = path2.length === 1 ? path2[0] : field2;\n    return accessor((opt && opt.get || getter$1)(path2), [field2], name || field2);\n  }\n  const id = field$1(\"id\");\n  const identity$7 = accessor((_) => _, [], \"identity\");\n  const zero$3 = accessor(() => 0, [], \"zero\");\n  const one$2 = accessor(() => 1, [], \"one\");\n  const truthy = accessor(() => true, [], \"true\");\n  const falsy = accessor(() => false, [], \"false\");\n  const DisallowedObjectProperties = /* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype).filter((name) => typeof Object.prototype[name] === \"function\"), \"__proto__\"]);\n  function log$1$1(method2, level, input) {\n    const args = [level].concat([].slice.call(input));\n    console[method2].apply(console, args);\n  }\n  const None$2 = 0;\n  const Error$1 = 1;\n  const Warn = 2;\n  const Info = 3;\n  const Debug = 4;\n  function logger(_, method2, handler = log$1$1) {\n    let level = _ || None$2;\n    return {\n      level(_2) {\n        if (arguments.length) {\n          level = +_2;\n          return this;\n        } else {\n          return level;\n        }\n      },\n      error() {\n        if (level >= Error$1) handler(method2 || \"error\", \"ERROR\", arguments);\n        return this;\n      },\n      warn() {\n        if (level >= Warn) handler(method2 || \"warn\", \"WARN\", arguments);\n        return this;\n      },\n      info() {\n        if (level >= Info) handler(method2 || \"log\", \"INFO\", arguments);\n        return this;\n      },\n      debug() {\n        if (level >= Debug) handler(method2 || \"log\", \"DEBUG\", arguments);\n        return this;\n      }\n    };\n  }\n  var isArray = Array.isArray;\n  function isObject$1(_) {\n    return _ === Object(_);\n  }\n  const isLegalKey = (key2) => key2 !== \"__proto__\";\n  function mergeConfig(...configs) {\n    return configs.reduce((out, source2) => {\n      for (const key2 in source2) {\n        if (key2 === \"signals\") {\n          out.signals = mergeNamed(out.signals, source2.signals);\n        } else {\n          const r = key2 === \"legend\" ? {\n            layout: 1\n          } : key2 === \"style\" ? true : null;\n          writeConfig(out, key2, source2[key2], r);\n        }\n      }\n      return out;\n    }, {});\n  }\n  function writeConfig(output2, key2, value2, recurse2) {\n    if (!isLegalKey(key2)) return;\n    let k, o;\n    if (isObject$1(value2) && !isArray(value2)) {\n      o = isObject$1(output2[key2]) ? output2[key2] : output2[key2] = {};\n      for (k in value2) {\n        if (recurse2 && (recurse2 === true || recurse2[k])) {\n          writeConfig(o, k, value2[k]);\n        } else if (isLegalKey(k)) {\n          o[k] = value2[k];\n        }\n      }\n    } else {\n      output2[key2] = value2;\n    }\n  }\n  function mergeNamed(a2, b2) {\n    if (a2 == null) return b2;\n    const map2 = {}, out = [];\n    function add2(_) {\n      if (!map2[_.name]) {\n        map2[_.name] = 1;\n        out.push(_);\n      }\n    }\n    b2.forEach(add2);\n    a2.forEach(add2);\n    return out;\n  }\n  function peek$1(array2) {\n    return array2[array2.length - 1];\n  }\n  function toNumber(_) {\n    return _ == null || _ === \"\" ? null : +_;\n  }\n  const exp$2 = (sign2) => (x2) => sign2 * Math.exp(x2);\n  const log$4 = (sign2) => (x2) => Math.log(sign2 * x2);\n  const symlog$1 = (c2) => (x2) => Math.sign(x2) * Math.log1p(Math.abs(x2 / c2));\n  const symexp = (c2) => (x2) => Math.sign(x2) * Math.expm1(Math.abs(x2)) * c2;\n  const pow$4 = (exponent2) => (x2) => x2 < 0 ? -Math.pow(-x2, exponent2) : Math.pow(x2, exponent2);\n  function pan(domain2, delta, lift, ground) {\n    const d0 = lift(domain2[0]), d1 = lift(peek$1(domain2)), dd = (d1 - d0) * delta;\n    return [ground(d0 - dd), ground(d1 - dd)];\n  }\n  function panLinear(domain2, delta) {\n    return pan(domain2, delta, toNumber, identity$7);\n  }\n  function panLog(domain2, delta) {\n    var sign2 = Math.sign(domain2[0]);\n    return pan(domain2, delta, log$4(sign2), exp$2(sign2));\n  }\n  function panPow(domain2, delta, exponent2) {\n    return pan(domain2, delta, pow$4(exponent2), pow$4(1 / exponent2));\n  }\n  function panSymlog(domain2, delta, constant2) {\n    return pan(domain2, delta, symlog$1(constant2), symexp(constant2));\n  }\n  function zoom$1(domain2, anchor, scale2, lift, ground) {\n    const d0 = lift(domain2[0]), d1 = lift(peek$1(domain2)), da = anchor != null ? lift(anchor) : (d0 + d1) / 2;\n    return [ground(da + (d0 - da) * scale2), ground(da + (d1 - da) * scale2)];\n  }\n  function zoomLinear(domain2, anchor, scale2) {\n    return zoom$1(domain2, anchor, scale2, toNumber, identity$7);\n  }\n  function zoomLog(domain2, anchor, scale2) {\n    const sign2 = Math.sign(domain2[0]);\n    return zoom$1(domain2, anchor, scale2, log$4(sign2), exp$2(sign2));\n  }\n  function zoomPow(domain2, anchor, scale2, exponent2) {\n    return zoom$1(domain2, anchor, scale2, pow$4(exponent2), pow$4(1 / exponent2));\n  }\n  function zoomSymlog(domain2, anchor, scale2, constant2) {\n    return zoom$1(domain2, anchor, scale2, symlog$1(constant2), symexp(constant2));\n  }\n  function quarter(date2) {\n    return 1 + ~~(new Date(date2).getMonth() / 3);\n  }\n  function utcquarter(date2) {\n    return 1 + ~~(new Date(date2).getUTCMonth() / 3);\n  }\n  function array$5(_) {\n    return _ != null ? isArray(_) ? _ : [_] : [];\n  }\n  function clampRange(range2, min2, max2) {\n    let lo = range2[0], hi = range2[1], span2;\n    if (hi < lo) {\n      span2 = hi;\n      hi = lo;\n      lo = span2;\n    }\n    span2 = hi - lo;\n    return span2 >= max2 - min2 ? [min2, max2] : [lo = Math.min(Math.max(lo, min2), max2 - span2), lo + span2];\n  }\n  function isFunction(_) {\n    return typeof _ === \"function\";\n  }\n  const DESCENDING = \"descending\";\n  function compare$1(fields, orders, opt) {\n    opt = opt || {};\n    orders = array$5(orders) || [];\n    const ord = [], get2 = [], fmap = {}, gen = opt.comparator || comparator;\n    array$5(fields).forEach((f, i) => {\n      if (f == null) return;\n      ord.push(orders[i] === DESCENDING ? -1 : 1);\n      get2.push(f = isFunction(f) ? f : field$1(f, null, opt));\n      (accessorFields(f) || []).forEach((_) => fmap[_] = 1);\n    });\n    return get2.length === 0 ? null : accessor(gen(get2, ord), Object.keys(fmap));\n  }\n  const ascending$2 = (u2, v) => (u2 < v || u2 == null) && v != null ? -1 : (u2 > v || v == null) && u2 != null ? 1 : (v = v instanceof Date ? +v : v, u2 = u2 instanceof Date ? +u2 : u2) !== u2 && v === v ? -1 : v !== v && u2 === u2 ? 1 : 0;\n  const comparator = (fields, orders) => fields.length === 1 ? compare1(fields[0], orders[0]) : compareN(fields, orders, fields.length);\n  const compare1 = (field2, order) => function(a2, b2) {\n    return ascending$2(field2(a2), field2(b2)) * order;\n  };\n  const compareN = (fields, orders, n) => {\n    orders.push(0);\n    return function(a2, b2) {\n      let f, c2 = 0, i = -1;\n      while (c2 === 0 && ++i < n) {\n        f = fields[i];\n        c2 = ascending$2(f(a2), f(b2));\n      }\n      return c2 * orders[i];\n    };\n  };\n  function constant$5(_) {\n    return isFunction(_) ? _ : () => _;\n  }\n  function debounce(delay, handler) {\n    let tid;\n    return (e) => {\n      if (tid) clearTimeout(tid);\n      tid = setTimeout(() => (handler(e), tid = null), delay);\n    };\n  }\n  function extend$1(_) {\n    for (let x2, k, i = 1, len2 = arguments.length; i < len2; ++i) {\n      x2 = arguments[i];\n      for (k in x2) {\n        _[k] = x2[k];\n      }\n    }\n    return _;\n  }\n  function extent(array2, f) {\n    let i = 0, n, v, min2, max2;\n    if (array2 && (n = array2.length)) {\n      if (f == null) {\n        for (v = array2[i]; i < n && (v == null || v !== v); v = array2[++i]) ;\n        min2 = max2 = v;\n        for (; i < n; ++i) {\n          v = array2[i];\n          if (v != null) {\n            if (v < min2) min2 = v;\n            if (v > max2) max2 = v;\n          }\n        }\n      } else {\n        for (v = f(array2[i]); i < n && (v == null || v !== v); v = f(array2[++i])) ;\n        min2 = max2 = v;\n        for (; i < n; ++i) {\n          v = f(array2[i]);\n          if (v != null) {\n            if (v < min2) min2 = v;\n            if (v > max2) max2 = v;\n          }\n        }\n      }\n    }\n    return [min2, max2];\n  }\n  function extentIndex(array2, f) {\n    const n = array2.length;\n    let i = -1, a2, b2, c2, u2, v;\n    if (f == null) {\n      while (++i < n) {\n        b2 = array2[i];\n        if (b2 != null && b2 >= b2) {\n          a2 = c2 = b2;\n          break;\n        }\n      }\n      if (i === n) return [-1, -1];\n      u2 = v = i;\n      while (++i < n) {\n        b2 = array2[i];\n        if (b2 != null) {\n          if (a2 > b2) {\n            a2 = b2;\n            u2 = i;\n          }\n          if (c2 < b2) {\n            c2 = b2;\n            v = i;\n          }\n        }\n      }\n    } else {\n      while (++i < n) {\n        b2 = f(array2[i], i, array2);\n        if (b2 != null && b2 >= b2) {\n          a2 = c2 = b2;\n          break;\n        }\n      }\n      if (i === n) return [-1, -1];\n      u2 = v = i;\n      while (++i < n) {\n        b2 = f(array2[i], i, array2);\n        if (b2 != null) {\n          if (a2 > b2) {\n            a2 = b2;\n            u2 = i;\n          }\n          if (c2 < b2) {\n            c2 = b2;\n            v = i;\n          }\n        }\n      }\n    }\n    return [u2, v];\n  }\n  function has$1(object2, property2) {\n    return Object.hasOwn(object2, property2);\n  }\n  const NULL = {};\n  function fastmap(input) {\n    let obj = {}, test2;\n    function has$1$1(key2) {\n      return has$1(obj, key2) && obj[key2] !== NULL;\n    }\n    const map2 = {\n      size: 0,\n      empty: 0,\n      object: obj,\n      has: has$1$1,\n      get(key2) {\n        return has$1$1(key2) ? obj[key2] : void 0;\n      },\n      set(key2, value2) {\n        if (!has$1$1(key2)) {\n          ++map2.size;\n          if (obj[key2] === NULL) --map2.empty;\n        }\n        obj[key2] = value2;\n        return this;\n      },\n      delete(key2) {\n        if (has$1$1(key2)) {\n          --map2.size;\n          ++map2.empty;\n          obj[key2] = NULL;\n        }\n        return this;\n      },\n      clear() {\n        map2.size = map2.empty = 0;\n        map2.object = obj = {};\n      },\n      test(_) {\n        if (arguments.length) {\n          test2 = _;\n          return map2;\n        } else {\n          return test2;\n        }\n      },\n      clean() {\n        const next = {};\n        let size = 0;\n        for (const key2 in obj) {\n          const value2 = obj[key2];\n          if (value2 !== NULL && (!test2 || !test2(value2))) {\n            next[key2] = value2;\n            ++size;\n          }\n        }\n        map2.size = size;\n        map2.empty = 0;\n        map2.object = obj = next;\n      }\n    };\n    if (input) Object.keys(input).forEach((key2) => {\n      map2.set(key2, input[key2]);\n    });\n    return map2;\n  }\n  function flush(range2, value2, threshold2, left, right, center) {\n    if (!threshold2 && threshold2 !== 0) return center;\n    const t = +threshold2;\n    let a2 = range2[0], b2 = peek$1(range2), l;\n    if (b2 < a2) {\n      l = a2;\n      a2 = b2;\n      b2 = l;\n    }\n    l = Math.abs(value2 - a2);\n    const r = Math.abs(b2 - value2);\n    return l < r && l <= t ? left : r <= t ? right : center;\n  }\n  function inherits(child, parent, members) {\n    const proto = child.prototype = Object.create(parent.prototype);\n    Object.defineProperty(proto, \"constructor\", {\n      value: child,\n      writable: true,\n      enumerable: true,\n      configurable: true\n    });\n    return extend$1(proto, members);\n  }\n  function inrange(value2, range2, left, right) {\n    let r0 = range2[0], r1 = range2[range2.length - 1], t;\n    if (r0 > r1) {\n      t = r0;\n      r0 = r1;\n      r1 = t;\n    }\n    left = left === void 0 || left;\n    right = right === void 0 || right;\n    return (left ? r0 <= value2 : r0 < value2) && (right ? value2 <= r1 : value2 < r1);\n  }\n  function isBoolean$1(_) {\n    return typeof _ === \"boolean\";\n  }\n  function isDate$1(_) {\n    return Object.prototype.toString.call(_) === \"[object Date]\";\n  }\n  function isIterable(_) {\n    return _ && isFunction(_[Symbol.iterator]);\n  }\n  function isNumber$1(_) {\n    return typeof _ === \"number\";\n  }\n  function isRegExp(_) {\n    return Object.prototype.toString.call(_) === \"[object RegExp]\";\n  }\n  function isString(_) {\n    return typeof _ === \"string\";\n  }\n  function key$2(fields, flat, opt) {\n    if (fields) {\n      fields = flat ? array$5(fields).map((f) => f.replace(/\\\\(.)/g, \"$1\")) : array$5(fields);\n    }\n    const len2 = fields && fields.length, gen = opt && opt.get || getter$1, map2 = (f) => gen(flat ? [f] : splitAccessPath(f));\n    let fn;\n    if (!len2) {\n      fn = function() {\n        return \"\";\n      };\n    } else if (len2 === 1) {\n      const get2 = map2(fields[0]);\n      fn = function(_) {\n        return \"\" + get2(_);\n      };\n    } else {\n      const get2 = fields.map(map2);\n      fn = function(_) {\n        let s = \"\" + get2[0](_), i = 0;\n        while (++i < len2) s += \"|\" + get2[i](_);\n        return s;\n      };\n    }\n    return accessor(fn, fields, \"key\");\n  }\n  function lerp$1(array2, frac) {\n    const lo = array2[0], hi = peek$1(array2), f = +frac;\n    return !f ? lo : f === 1 ? hi : lo + f * (hi - lo);\n  }\n  const DEFAULT_MAX_SIZE = 1e4;\n  function lruCache(maxsize) {\n    maxsize = +maxsize || DEFAULT_MAX_SIZE;\n    let curr, prev, size;\n    const clear = () => {\n      curr = {};\n      prev = {};\n      size = 0;\n    };\n    const update2 = (key2, value2) => {\n      if (++size > maxsize) {\n        prev = curr;\n        curr = {};\n        size = 1;\n      }\n      return curr[key2] = value2;\n    };\n    clear();\n    return {\n      clear,\n      has: (key2) => has$1(curr, key2) || has$1(prev, key2),\n      get: (key2) => has$1(curr, key2) ? curr[key2] : has$1(prev, key2) ? update2(key2, prev[key2]) : void 0,\n      set: (key2, value2) => has$1(curr, key2) ? curr[key2] = value2 : update2(key2, value2)\n    };\n  }\n  function merge$3(compare2, array0, array1, output2) {\n    const n0 = array0.length, n1 = array1.length;\n    if (!n1) return array0;\n    if (!n0) return array1;\n    const merged = output2 || new array0.constructor(n0 + n1);\n    let i0 = 0, i1 = 0, i = 0;\n    for (; i0 < n0 && i1 < n1; ++i) {\n      merged[i] = compare2(array0[i0], array1[i1]) > 0 ? array1[i1++] : array0[i0++];\n    }\n    for (; i0 < n0; ++i0, ++i) {\n      merged[i] = array0[i0];\n    }\n    for (; i1 < n1; ++i1, ++i) {\n      merged[i] = array1[i1];\n    }\n    return merged;\n  }\n  function repeat(str, reps) {\n    let s = \"\";\n    while (--reps >= 0) s += str;\n    return s;\n  }\n  function pad$2(str, length2, padchar, align) {\n    const c2 = padchar || \" \", s = str + \"\", n = length2 - s.length;\n    return n <= 0 ? s : align === \"left\" ? repeat(c2, n) + s : align === \"center\" ? repeat(c2, ~~(n / 2)) + s + repeat(c2, Math.ceil(n / 2)) : s + repeat(c2, n);\n  }\n  function span(array2) {\n    return array2 && peek$1(array2) - array2[0] || 0;\n  }\n  function $(x2) {\n    return isArray(x2) ? `[${x2.map((v) => v === null ? \"null\" : $(v))}]` : isObject$1(x2) || isString(x2) ? (\n      // Output valid JSON and JS source strings.\n      // See https://github.com/judofyr/timeless/blob/master/posts/json-isnt-a-javascript-subset.md\n      JSON.stringify(x2).replaceAll(\"\\u2028\", \"\\\\u2028\").replaceAll(\"\\u2029\", \"\\\\u2029\")\n    ) : x2;\n  }\n  function toBoolean(_) {\n    return _ == null || _ === \"\" ? null : !_ || _ === \"false\" || _ === \"0\" ? false : !!_;\n  }\n  const defaultParser = (_) => isNumber$1(_) ? _ : isDate$1(_) ? _ : Date.parse(_);\n  function toDate(_, parser2) {\n    parser2 = parser2 || defaultParser;\n    return _ == null || _ === \"\" ? null : parser2(_);\n  }\n  function toString(_) {\n    return _ == null || _ === \"\" ? null : _ + \"\";\n  }\n  function toSet(_) {\n    const s = {}, n = _.length;\n    for (let i = 0; i < n; ++i) s[_[i]] = true;\n    return s;\n  }\n  function truncate$1(str, length2, align, ellipsis) {\n    const e = ellipsis != null ? ellipsis : \"…\", s = str + \"\", n = s.length, l = Math.max(0, length2 - e.length);\n    return n <= length2 ? s : align === \"left\" ? e + s.slice(n - l) : align === \"center\" ? s.slice(0, Math.ceil(l / 2)) + e + s.slice(n - ~~(l / 2)) : s.slice(0, l) + e;\n  }\n  function visitArray(array2, filter2, visitor) {\n    if (array2) {\n      if (filter2) {\n        const n = array2.length;\n        for (let i = 0; i < n; ++i) {\n          const t = filter2(array2[i]);\n          if (t) visitor(t, i, array2);\n        }\n      } else {\n        array2.forEach(visitor);\n      }\n    }\n  }\n  var EOL = {}, EOF = {}, QUOTE = 34, NEWLINE = 10, RETURN = 13;\n  function objectConverter(columns) {\n    return new Function(\"d\", \"return {\" + columns.map(function(name, i) {\n      return JSON.stringify(name) + \": d[\" + i + '] || \"\"';\n    }).join(\",\") + \"}\");\n  }\n  function customConverter(columns, f) {\n    var object2 = objectConverter(columns);\n    return function(row, i) {\n      return f(object2(row), i, columns);\n    };\n  }\n  function inferColumns(rows) {\n    var columnSet = /* @__PURE__ */ Object.create(null), columns = [];\n    rows.forEach(function(row) {\n      for (var column in row) {\n        if (!(column in columnSet)) {\n          columns.push(columnSet[column] = column);\n        }\n      }\n    });\n    return columns;\n  }\n  function pad$1(value2, width2) {\n    var s = value2 + \"\", length2 = s.length;\n    return length2 < width2 ? new Array(width2 - length2 + 1).join(0) + s : s;\n  }\n  function formatYear$1(year) {\n    return year < 0 ? \"-\" + pad$1(-year, 6) : year > 9999 ? \"+\" + pad$1(year, 6) : pad$1(year, 4);\n  }\n  function formatDate(date2) {\n    var hours = date2.getUTCHours(), minutes = date2.getUTCMinutes(), seconds = date2.getUTCSeconds(), milliseconds = date2.getUTCMilliseconds();\n    return isNaN(date2) ? \"Invalid Date\" : formatYear$1(date2.getUTCFullYear()) + \"-\" + pad$1(date2.getUTCMonth() + 1, 2) + \"-\" + pad$1(date2.getUTCDate(), 2) + (milliseconds ? \"T\" + pad$1(hours, 2) + \":\" + pad$1(minutes, 2) + \":\" + pad$1(seconds, 2) + \".\" + pad$1(milliseconds, 3) + \"Z\" : seconds ? \"T\" + pad$1(hours, 2) + \":\" + pad$1(minutes, 2) + \":\" + pad$1(seconds, 2) + \"Z\" : minutes || hours ? \"T\" + pad$1(hours, 2) + \":\" + pad$1(minutes, 2) + \"Z\" : \"\");\n  }\n  function dsvFormat(delimiter) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n\\r]\"), DELIMITER = delimiter.charCodeAt(0);\n    function parse2(text2, f) {\n      var convert2, columns, rows = parseRows(text2, function(row, i) {\n        if (convert2) return convert2(row, i - 1);\n        columns = row, convert2 = f ? customConverter(row, f) : objectConverter(row);\n      });\n      rows.columns = columns || [];\n      return rows;\n    }\n    function parseRows(text2, f) {\n      var rows = [], N = text2.length, I = 0, n = 0, t, eof = N <= 0, eol = false;\n      if (text2.charCodeAt(N - 1) === NEWLINE) --N;\n      if (text2.charCodeAt(N - 1) === RETURN) --N;\n      function token() {\n        if (eof) return EOF;\n        if (eol) return eol = false, EOL;\n        var i, j = I, c2;\n        if (text2.charCodeAt(j) === QUOTE) {\n          while (I++ < N && text2.charCodeAt(I) !== QUOTE || text2.charCodeAt(++I) === QUOTE) ;\n          if ((i = I) >= N) eof = true;\n          else if ((c2 = text2.charCodeAt(I++)) === NEWLINE) eol = true;\n          else if (c2 === RETURN) {\n            eol = true;\n            if (text2.charCodeAt(I) === NEWLINE) ++I;\n          }\n          return text2.slice(j + 1, i - 1).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          if ((c2 = text2.charCodeAt(i = I++)) === NEWLINE) eol = true;\n          else if (c2 === RETURN) {\n            eol = true;\n            if (text2.charCodeAt(I) === NEWLINE) ++I;\n          } else if (c2 !== DELIMITER) continue;\n          return text2.slice(j, i);\n        }\n        return eof = true, text2.slice(j, N);\n      }\n      while ((t = token()) !== EOF) {\n        var row = [];\n        while (t !== EOL && t !== EOF) row.push(t), t = token();\n        if (f && (row = f(row, n++)) == null) continue;\n        rows.push(row);\n      }\n      return rows;\n    }\n    function preformatBody(rows, columns) {\n      return rows.map(function(row) {\n        return columns.map(function(column) {\n          return formatValue2(row[column]);\n        }).join(delimiter);\n      });\n    }\n    function format2(rows, columns) {\n      if (columns == null) columns = inferColumns(rows);\n      return [columns.map(formatValue2).join(delimiter)].concat(preformatBody(rows, columns)).join(\"\\n\");\n    }\n    function formatBody(rows, columns) {\n      if (columns == null) columns = inferColumns(rows);\n      return preformatBody(rows, columns).join(\"\\n\");\n    }\n    function formatRows(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    }\n    function formatRow(row) {\n      return row.map(formatValue2).join(delimiter);\n    }\n    function formatValue2(value2) {\n      return value2 == null ? \"\" : value2 instanceof Date ? formatDate(value2) : reFormat.test(value2 += \"\") ? '\"' + value2.replace(/\"/g, '\"\"') + '\"' : value2;\n    }\n    return {\n      parse: parse2,\n      parseRows,\n      format: format2,\n      formatBody,\n      formatRows,\n      formatRow,\n      formatValue: formatValue2\n    };\n  }\n  function identity$6(x2) {\n    return x2;\n  }\n  function transform$3(transform2) {\n    if (transform2 == null) return identity$6;\n    var x02, y02, kx = transform2.scale[0], ky = transform2.scale[1], dx = transform2.translate[0], dy = transform2.translate[1];\n    return function(input, i) {\n      if (!i) x02 = y02 = 0;\n      var j = 2, n = input.length, output2 = new Array(n);\n      output2[0] = (x02 += input[0]) * kx + dx;\n      output2[1] = (y02 += input[1]) * ky + dy;\n      while (j < n) output2[j] = input[j], ++j;\n      return output2;\n    };\n  }\n  function reverse$1(array2, n) {\n    var t, j = array2.length, i = j - n;\n    while (i < --j) t = array2[i], array2[i++] = array2[j], array2[j] = t;\n  }\n  function feature(topology, o) {\n    if (typeof o === \"string\") o = topology.objects[o];\n    return o.type === \"GeometryCollection\" ? { type: \"FeatureCollection\", features: o.geometries.map(function(o2) {\n      return feature$1(topology, o2);\n    }) } : feature$1(topology, o);\n  }\n  function feature$1(topology, o) {\n    var id2 = o.id, bbox = o.bbox, properties = o.properties == null ? {} : o.properties, geometry = object$1(topology, o);\n    return id2 == null && bbox == null ? { type: \"Feature\", properties, geometry } : bbox == null ? { type: \"Feature\", id: id2, properties, geometry } : { type: \"Feature\", id: id2, bbox, properties, geometry };\n  }\n  function object$1(topology, o) {\n    var transformPoint = transform$3(topology.transform), arcs = topology.arcs;\n    function arc2(i, points2) {\n      if (points2.length) points2.pop();\n      for (var a2 = arcs[i < 0 ? ~i : i], k = 0, n = a2.length; k < n; ++k) {\n        points2.push(transformPoint(a2[k], k));\n      }\n      if (i < 0) reverse$1(points2, n);\n    }\n    function point2(p) {\n      return transformPoint(p);\n    }\n    function line2(arcs2) {\n      var points2 = [];\n      for (var i = 0, n = arcs2.length; i < n; ++i) arc2(arcs2[i], points2);\n      if (points2.length < 2) points2.push(points2[0]);\n      return points2;\n    }\n    function ring(arcs2) {\n      var points2 = line2(arcs2);\n      while (points2.length < 4) points2.push(points2[0]);\n      return points2;\n    }\n    function polygon(arcs2) {\n      return arcs2.map(ring);\n    }\n    function geometry(o2) {\n      var type2 = o2.type, coordinates;\n      switch (type2) {\n        case \"GeometryCollection\":\n          return { type: type2, geometries: o2.geometries.map(geometry) };\n        case \"Point\":\n          coordinates = point2(o2.coordinates);\n          break;\n        case \"MultiPoint\":\n          coordinates = o2.coordinates.map(point2);\n          break;\n        case \"LineString\":\n          coordinates = line2(o2.arcs);\n          break;\n        case \"MultiLineString\":\n          coordinates = o2.arcs.map(line2);\n          break;\n        case \"Polygon\":\n          coordinates = polygon(o2.arcs);\n          break;\n        case \"MultiPolygon\":\n          coordinates = o2.arcs.map(polygon);\n          break;\n        default:\n          return null;\n      }\n      return { type: type2, coordinates };\n    }\n    return geometry(o);\n  }\n  function stitch(topology, arcs) {\n    var stitchedArcs = {}, fragmentByStart = {}, fragmentByEnd = {}, fragments = [], emptyIndex = -1;\n    arcs.forEach(function(i, j) {\n      var arc2 = topology.arcs[i < 0 ? ~i : i], t;\n      if (arc2.length < 3 && !arc2[1][0] && !arc2[1][1]) {\n        t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n      }\n    });\n    arcs.forEach(function(i) {\n      var e = ends(i), start = e[0], end = e[1], f, g;\n      if (f = fragmentByEnd[start]) {\n        delete fragmentByEnd[f.end];\n        f.push(i);\n        f.end = end;\n        if (g = fragmentByStart[end]) {\n          delete fragmentByStart[g.start];\n          var fg = g === f ? f : f.concat(g);\n          fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n        } else {\n          fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n        }\n      } else if (f = fragmentByStart[end]) {\n        delete fragmentByStart[f.start];\n        f.unshift(i);\n        f.start = start;\n        if (g = fragmentByEnd[start]) {\n          delete fragmentByEnd[g.end];\n          var gf = g === f ? f : g.concat(f);\n          fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n        } else {\n          fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n        }\n      } else {\n        f = [i];\n        fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n      }\n    });\n    function ends(i) {\n      var arc2 = topology.arcs[i < 0 ? ~i : i], p02 = arc2[0], p1;\n      if (topology.transform) p1 = [0, 0], arc2.forEach(function(dp) {\n        p1[0] += dp[0], p1[1] += dp[1];\n      });\n      else p1 = arc2[arc2.length - 1];\n      return i < 0 ? [p1, p02] : [p02, p1];\n    }\n    function flush2(fragmentByEnd2, fragmentByStart2) {\n      for (var k in fragmentByEnd2) {\n        var f = fragmentByEnd2[k];\n        delete fragmentByStart2[f.start];\n        delete f.start;\n        delete f.end;\n        f.forEach(function(i) {\n          stitchedArcs[i < 0 ? ~i : i] = 1;\n        });\n        fragments.push(f);\n      }\n    }\n    flush2(fragmentByEnd, fragmentByStart);\n    flush2(fragmentByStart, fragmentByEnd);\n    arcs.forEach(function(i) {\n      if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]);\n    });\n    return fragments;\n  }\n  function mesh(topology) {\n    return object$1(topology, meshArcs.apply(this, arguments));\n  }\n  function meshArcs(topology, object2, filter2) {\n    var arcs, i, n;\n    if (arguments.length > 1) arcs = extractArcs(topology, object2, filter2);\n    else for (i = 0, arcs = new Array(n = topology.arcs.length); i < n; ++i) arcs[i] = i;\n    return { type: \"MultiLineString\", arcs: stitch(topology, arcs) };\n  }\n  function extractArcs(topology, object2, filter2) {\n    var arcs = [], geomsByArc = [], geom;\n    function extract0(i) {\n      var j = i < 0 ? ~i : i;\n      (geomsByArc[j] || (geomsByArc[j] = [])).push({ i, g: geom });\n    }\n    function extract1(arcs2) {\n      arcs2.forEach(extract0);\n    }\n    function extract2(arcs2) {\n      arcs2.forEach(extract1);\n    }\n    function extract3(arcs2) {\n      arcs2.forEach(extract2);\n    }\n    function geometry(o) {\n      switch (geom = o, o.type) {\n        case \"GeometryCollection\":\n          o.geometries.forEach(geometry);\n          break;\n        case \"LineString\":\n          extract1(o.arcs);\n          break;\n        case \"MultiLineString\":\n        case \"Polygon\":\n          extract2(o.arcs);\n          break;\n        case \"MultiPolygon\":\n          extract3(o.arcs);\n          break;\n      }\n    }\n    geometry(object2);\n    geomsByArc.forEach(filter2 == null ? function(geoms) {\n      arcs.push(geoms[0].i);\n    } : function(geoms) {\n      if (filter2(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i);\n    });\n    return arcs;\n  }\n  function ascending$1(a2, b2) {\n    return a2 == null || b2 == null ? NaN : a2 < b2 ? -1 : a2 > b2 ? 1 : a2 >= b2 ? 0 : NaN;\n  }\n  function descending$1(a2, b2) {\n    return a2 == null || b2 == null ? NaN : b2 < a2 ? -1 : b2 > a2 ? 1 : b2 >= a2 ? 0 : NaN;\n  }\n  function bisector(f) {\n    let compare12, compare2, delta;\n    if (f.length !== 2) {\n      compare12 = ascending$1;\n      compare2 = (d, x2) => ascending$1(f(d), x2);\n      delta = (d, x2) => f(d) - x2;\n    } else {\n      compare12 = f === ascending$1 || f === descending$1 ? f : zero$2;\n      compare2 = f;\n      delta = f;\n    }\n    function left(a2, x2, lo = 0, hi = a2.length) {\n      if (lo < hi) {\n        if (compare12(x2, x2) !== 0) return hi;\n        do {\n          const mid = lo + hi >>> 1;\n          if (compare2(a2[mid], x2) < 0) lo = mid + 1;\n          else hi = mid;\n        } while (lo < hi);\n      }\n      return lo;\n    }\n    function right(a2, x2, lo = 0, hi = a2.length) {\n      if (lo < hi) {\n        if (compare12(x2, x2) !== 0) return hi;\n        do {\n          const mid = lo + hi >>> 1;\n          if (compare2(a2[mid], x2) <= 0) lo = mid + 1;\n          else hi = mid;\n        } while (lo < hi);\n      }\n      return lo;\n    }\n    function center(a2, x2, lo = 0, hi = a2.length) {\n      const i = left(a2, x2, lo, hi - 1);\n      return i > lo && delta(a2[i - 1], x2) > -delta(a2[i], x2) ? i - 1 : i;\n    }\n    return { left, center, right };\n  }\n  function zero$2() {\n    return 0;\n  }\n  function number$6(x2) {\n    return x2 === null ? NaN : +x2;\n  }\n  function* numbers$2(values2, valueof) {\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    }\n  }\n  const ascendingBisect = bisector(ascending$1);\n  const bisectRight$1 = ascendingBisect.right;\n  const bisectLeft$1 = ascendingBisect.left;\n  bisector(number$6).center;\n  function variance(values2, valueof) {\n    let count2 = 0;\n    let delta;\n    let mean2 = 0;\n    let sum2 = 0;\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          delta = value2 - mean2;\n          mean2 += delta / ++count2;\n          sum2 += delta * (value2 - mean2);\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          delta = value2 - mean2;\n          mean2 += delta / ++count2;\n          sum2 += delta * (value2 - mean2);\n        }\n      }\n    }\n    if (count2 > 1) return sum2 / (count2 - 1);\n  }\n  function deviation(values2, valueof) {\n    const v = variance(values2, valueof);\n    return v ? Math.sqrt(v) : v;\n  }\n  class Adder {\n    constructor() {\n      this._partials = new Float64Array(32);\n      this._n = 0;\n    }\n    add(x2) {\n      const p = this._partials;\n      let i = 0;\n      for (let j = 0; j < this._n && j < 32; j++) {\n        const y2 = p[j], hi = x2 + y2, lo = Math.abs(x2) < Math.abs(y2) ? x2 - (hi - y2) : y2 - (hi - x2);\n        if (lo) p[i++] = lo;\n        x2 = hi;\n      }\n      p[i] = x2;\n      this._n = i + 1;\n      return this;\n    }\n    valueOf() {\n      const p = this._partials;\n      let n = this._n, x2, y2, lo, hi = 0;\n      if (n > 0) {\n        hi = p[--n];\n        while (n > 0) {\n          x2 = hi;\n          y2 = p[--n];\n          hi = x2 + y2;\n          lo = y2 - (hi - x2);\n          if (lo) break;\n        }\n        if (n > 0 && (lo < 0 && p[n - 1] < 0 || lo > 0 && p[n - 1] > 0)) {\n          y2 = lo * 2;\n          x2 = hi + y2;\n          if (y2 == x2 - hi) hi = x2;\n        }\n      }\n      return hi;\n    }\n  }\n  class InternMap extends Map {\n    constructor(entries, key2 = keyof) {\n      super();\n      Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key2 } });\n      if (entries != null) for (const [key3, value2] of entries) this.set(key3, value2);\n    }\n    get(key2) {\n      return super.get(intern_get(this, key2));\n    }\n    has(key2) {\n      return super.has(intern_get(this, key2));\n    }\n    set(key2, value2) {\n      return super.set(intern_set(this, key2), value2);\n    }\n    delete(key2) {\n      return super.delete(intern_delete(this, key2));\n    }\n  }\n  class InternSet extends Set {\n    constructor(values2, key2 = keyof) {\n      super();\n      Object.defineProperties(this, { _intern: { value: /* @__PURE__ */ new Map() }, _key: { value: key2 } });\n      if (values2 != null) for (const value2 of values2) this.add(value2);\n    }\n    has(value2) {\n      return super.has(intern_get(this, value2));\n    }\n    add(value2) {\n      return super.add(intern_set(this, value2));\n    }\n    delete(value2) {\n      return super.delete(intern_delete(this, value2));\n    }\n  }\n  function intern_get({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    return _intern.has(key2) ? _intern.get(key2) : value2;\n  }\n  function intern_set({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    if (_intern.has(key2)) return _intern.get(key2);\n    _intern.set(key2, value2);\n    return value2;\n  }\n  function intern_delete({ _intern, _key }, value2) {\n    const key2 = _key(value2);\n    if (_intern.has(key2)) {\n      value2 = _intern.get(key2);\n      _intern.delete(key2);\n    }\n    return value2;\n  }\n  function keyof(value2) {\n    return value2 !== null && typeof value2 === \"object\" ? value2.valueOf() : value2;\n  }\n  function permute(source2, keys2) {\n    return Array.from(keys2, (key2) => source2[key2]);\n  }\n  function compareDefined(compare2 = ascending$1) {\n    if (compare2 === ascending$1) return ascendingDefined;\n    if (typeof compare2 !== \"function\") throw new TypeError(\"compare is not a function\");\n    return (a2, b2) => {\n      const x2 = compare2(a2, b2);\n      if (x2 || x2 === 0) return x2;\n      return (compare2(b2, b2) === 0) - (compare2(a2, a2) === 0);\n    };\n  }\n  function ascendingDefined(a2, b2) {\n    return (a2 == null || !(a2 >= a2)) - (b2 == null || !(b2 >= b2)) || (a2 < b2 ? -1 : a2 > b2 ? 1 : 0);\n  }\n  const e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);\n  function tickSpec(start, stop2, count2) {\n    const step = (stop2 - start) / Math.max(0, count2), power = Math.floor(Math.log10(step)), error2 = step / Math.pow(10, power), factor = error2 >= e10 ? 10 : error2 >= e5 ? 5 : error2 >= e2 ? 2 : 1;\n    let i1, i2, inc;\n    if (power < 0) {\n      inc = Math.pow(10, -power) / factor;\n      i1 = Math.round(start * inc);\n      i2 = Math.round(stop2 * inc);\n      if (i1 / inc < start) ++i1;\n      if (i2 / inc > stop2) --i2;\n      inc = -inc;\n    } else {\n      inc = Math.pow(10, power) * factor;\n      i1 = Math.round(start / inc);\n      i2 = Math.round(stop2 / inc);\n      if (i1 * inc < start) ++i1;\n      if (i2 * inc > stop2) --i2;\n    }\n    if (i2 < i1 && 0.5 <= count2 && count2 < 2) return tickSpec(start, stop2, count2 * 2);\n    return [i1, i2, inc];\n  }\n  function ticks(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    if (!(count2 > 0)) return [];\n    if (start === stop2) return [start];\n    const reverse2 = stop2 < start, [i1, i2, inc] = reverse2 ? tickSpec(stop2, start, count2) : tickSpec(start, stop2, count2);\n    if (!(i2 >= i1)) return [];\n    const n = i2 - i1 + 1, ticks2 = new Array(n);\n    if (reverse2) {\n      if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) / -inc;\n      else for (let i = 0; i < n; ++i) ticks2[i] = (i2 - i) * inc;\n    } else {\n      if (inc < 0) for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) / -inc;\n      else for (let i = 0; i < n; ++i) ticks2[i] = (i1 + i) * inc;\n    }\n    return ticks2;\n  }\n  function tickIncrement(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    return tickSpec(start, stop2, count2)[2];\n  }\n  function tickStep(start, stop2, count2) {\n    stop2 = +stop2, start = +start, count2 = +count2;\n    const reverse2 = stop2 < start, inc = reverse2 ? tickIncrement(stop2, start, count2) : tickIncrement(start, stop2, count2);\n    return (reverse2 ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n  }\n  function max$3(values2, valueof) {\n    let max2;\n    if (valueof === void 0) {\n      for (const value2 of values2) {\n        if (value2 != null && (max2 < value2 || max2 === void 0 && value2 >= value2)) {\n          max2 = value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (max2 < value2 || max2 === void 0 && value2 >= value2)) {\n          max2 = value2;\n        }\n      }\n    }\n    return max2;\n  }\n  function min$3(values2, valueof) {\n    let min2;\n    if (valueof === void 0) {\n      for (const value2 of values2) {\n        if (value2 != null && (min2 > value2 || min2 === void 0 && value2 >= value2)) {\n          min2 = value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (min2 > value2 || min2 === void 0 && value2 >= value2)) {\n          min2 = value2;\n        }\n      }\n    }\n    return min2;\n  }\n  function quickselect(array2, k, left = 0, right = Infinity, compare2) {\n    k = Math.floor(k);\n    left = Math.floor(Math.max(0, left));\n    right = Math.floor(Math.min(array2.length - 1, right));\n    if (!(left <= k && k <= right)) return array2;\n    compare2 = compare2 === void 0 ? ascendingDefined : compareDefined(compare2);\n    while (right > left) {\n      if (right - left > 600) {\n        const n = right - left + 1;\n        const m2 = k - left + 1;\n        const z = Math.log(n);\n        const s = 0.5 * Math.exp(2 * z / 3);\n        const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m2 - n / 2 < 0 ? -1 : 1);\n        const newLeft = Math.max(left, Math.floor(k - m2 * s / n + sd));\n        const newRight = Math.min(right, Math.floor(k + (n - m2) * s / n + sd));\n        quickselect(array2, k, newLeft, newRight, compare2);\n      }\n      const t = array2[k];\n      let i = left;\n      let j = right;\n      swap$1(array2, left, k);\n      if (compare2(array2[right], t) > 0) swap$1(array2, left, right);\n      while (i < j) {\n        swap$1(array2, i, j), ++i, --j;\n        while (compare2(array2[i], t) < 0) ++i;\n        while (compare2(array2[j], t) > 0) --j;\n      }\n      if (compare2(array2[left], t) === 0) swap$1(array2, left, j);\n      else ++j, swap$1(array2, j, right);\n      if (j <= k) left = j + 1;\n      if (k <= j) right = j - 1;\n    }\n    return array2;\n  }\n  function swap$1(array2, i, j) {\n    const t = array2[i];\n    array2[i] = array2[j];\n    array2[j] = t;\n  }\n  function quantile$1(values2, p, valueof) {\n    values2 = Float64Array.from(numbers$2(values2, valueof));\n    if (!(n = values2.length) || isNaN(p = +p)) return;\n    if (p <= 0 || n < 2) return min$3(values2);\n    if (p >= 1) return max$3(values2);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = max$3(quickselect(values2, i0).subarray(0, i0 + 1)), value1 = min$3(values2.subarray(i0 + 1));\n    return value0 + (value1 - value0) * (i - i0);\n  }\n  function quantileSorted(values2, p, valueof = number$6) {\n    if (!(n = values2.length) || isNaN(p = +p)) return;\n    if (p <= 0 || n < 2) return +valueof(values2[0], 0, values2);\n    if (p >= 1) return +valueof(values2[n - 1], n - 1, values2);\n    var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values2[i0], i0, values2), value1 = +valueof(values2[i0 + 1], i0 + 1, values2);\n    return value0 + (value1 - value0) * (i - i0);\n  }\n  function mean(values2, valueof) {\n    let count2 = 0;\n    let sum2 = 0;\n    if (valueof === void 0) {\n      for (let value2 of values2) {\n        if (value2 != null && (value2 = +value2) >= value2) {\n          ++count2, sum2 += value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        if ((value2 = valueof(value2, ++index2, values2)) != null && (value2 = +value2) >= value2) {\n          ++count2, sum2 += value2;\n        }\n      }\n    }\n    if (count2) return sum2 / count2;\n  }\n  function median(values2, valueof) {\n    return quantile$1(values2, 0.5, valueof);\n  }\n  function* flatten$1(arrays) {\n    for (const array2 of arrays) {\n      yield* array2;\n    }\n  }\n  function merge$2(arrays) {\n    return Array.from(flatten$1(arrays));\n  }\n  function range$3(start, stop2, step) {\n    start = +start, stop2 = +stop2, step = (n = arguments.length) < 2 ? (stop2 = start, start = 0, 1) : n < 3 ? 1 : +step;\n    var i = -1, n = Math.max(0, Math.ceil((stop2 - start) / step)) | 0, range2 = new Array(n);\n    while (++i < n) {\n      range2[i] = start + i * step;\n    }\n    return range2;\n  }\n  function sum$1(values2, valueof) {\n    let sum2 = 0;\n    {\n      for (let value2 of values2) {\n        if (value2 = +value2) {\n          sum2 += value2;\n        }\n      }\n    }\n    return sum2;\n  }\n  function intersection(values2, ...others) {\n    values2 = new InternSet(values2);\n    others = others.map(set$8);\n    out: for (const value2 of values2) {\n      for (const other of others) {\n        if (!other.has(value2)) {\n          values2.delete(value2);\n          continue out;\n        }\n      }\n    }\n    return values2;\n  }\n  function set$8(values2) {\n    return values2 instanceof InternSet ? values2 : new InternSet(values2);\n  }\n  function union(...others) {\n    const set2 = new InternSet();\n    for (const other of others) {\n      for (const o of other) {\n        set2.add(o);\n      }\n    }\n    return set2;\n  }\n  function formatDecimal(x2) {\n    return Math.abs(x2 = Math.round(x2)) >= 1e21 ? x2.toLocaleString(\"en\").replace(/,/g, \"\") : x2.toString(10);\n  }\n  function formatDecimalParts(x2, p) {\n    if ((i = (x2 = p ? x2.toExponential(p - 1) : x2.toExponential()).indexOf(\"e\")) < 0) return null;\n    var i, coefficient = x2.slice(0, i);\n    return [\n      coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n      +x2.slice(i + 1)\n    ];\n  }\n  function exponent(x2) {\n    return x2 = formatDecimalParts(Math.abs(x2)), x2 ? x2[1] : NaN;\n  }\n  function formatGroup(grouping, thousands) {\n    return function(value2, width2) {\n      var i = value2.length, t = [], j = 0, g = grouping[0], length2 = 0;\n      while (i > 0 && g > 0) {\n        if (length2 + g + 1 > width2) g = Math.max(1, width2 - length2);\n        t.push(value2.substring(i -= g, i + g));\n        if ((length2 += g + 1) > width2) break;\n        g = grouping[j = (j + 1) % grouping.length];\n      }\n      return t.reverse().join(thousands);\n    };\n  }\n  function formatNumerals(numerals) {\n    return function(value2) {\n      return value2.replace(/[0-9]/g, function(i) {\n        return numerals[+i];\n      });\n    };\n  }\n  var re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n  function formatSpecifier(specifier) {\n    if (!(match2 = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n    var match2;\n    return new FormatSpecifier({\n      fill: match2[1],\n      align: match2[2],\n      sign: match2[3],\n      symbol: match2[4],\n      zero: match2[5],\n      width: match2[6],\n      comma: match2[7],\n      precision: match2[8] && match2[8].slice(1),\n      trim: match2[9],\n      type: match2[10]\n    });\n  }\n  formatSpecifier.prototype = FormatSpecifier.prototype;\n  function FormatSpecifier(specifier) {\n    this.fill = specifier.fill === void 0 ? \" \" : specifier.fill + \"\";\n    this.align = specifier.align === void 0 ? \">\" : specifier.align + \"\";\n    this.sign = specifier.sign === void 0 ? \"-\" : specifier.sign + \"\";\n    this.symbol = specifier.symbol === void 0 ? \"\" : specifier.symbol + \"\";\n    this.zero = !!specifier.zero;\n    this.width = specifier.width === void 0 ? void 0 : +specifier.width;\n    this.comma = !!specifier.comma;\n    this.precision = specifier.precision === void 0 ? void 0 : +specifier.precision;\n    this.trim = !!specifier.trim;\n    this.type = specifier.type === void 0 ? \"\" : specifier.type + \"\";\n  }\n  FormatSpecifier.prototype.toString = function() {\n    return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (this.width === void 0 ? \"\" : Math.max(1, this.width | 0)) + (this.comma ? \",\" : \"\") + (this.precision === void 0 ? \"\" : \".\" + Math.max(0, this.precision | 0)) + (this.trim ? \"~\" : \"\") + this.type;\n  };\n  function formatTrim(s) {\n    out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n      switch (s[i]) {\n        case \".\":\n          i0 = i1 = i;\n          break;\n        case \"0\":\n          if (i0 === 0) i0 = i;\n          i1 = i;\n          break;\n        default:\n          if (!+s[i]) break out;\n          if (i0 > 0) i0 = 0;\n          break;\n      }\n    }\n    return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n  }\n  var prefixExponent;\n  function formatPrefixAuto(x2, p) {\n    var d = formatDecimalParts(x2, p);\n    if (!d) return x2 + \"\";\n    var coefficient = d[0], exponent2 = d[1], i = exponent2 - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent2 / 3))) * 3) + 1, n = coefficient.length;\n    return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x2, Math.max(0, p + i - 1))[0];\n  }\n  function formatRounded(x2, p) {\n    var d = formatDecimalParts(x2, p);\n    if (!d) return x2 + \"\";\n    var coefficient = d[0], exponent2 = d[1];\n    return exponent2 < 0 ? \"0.\" + new Array(-exponent2).join(\"0\") + coefficient : coefficient.length > exponent2 + 1 ? coefficient.slice(0, exponent2 + 1) + \".\" + coefficient.slice(exponent2 + 1) : coefficient + new Array(exponent2 - coefficient.length + 2).join(\"0\");\n  }\n  const formatTypes = {\n    \"%\": (x2, p) => (x2 * 100).toFixed(p),\n    \"b\": (x2) => Math.round(x2).toString(2),\n    \"c\": (x2) => x2 + \"\",\n    \"d\": formatDecimal,\n    \"e\": (x2, p) => x2.toExponential(p),\n    \"f\": (x2, p) => x2.toFixed(p),\n    \"g\": (x2, p) => x2.toPrecision(p),\n    \"o\": (x2) => Math.round(x2).toString(8),\n    \"p\": (x2, p) => formatRounded(x2 * 100, p),\n    \"r\": formatRounded,\n    \"s\": formatPrefixAuto,\n    \"X\": (x2) => Math.round(x2).toString(16).toUpperCase(),\n    \"x\": (x2) => Math.round(x2).toString(16)\n  };\n  function identity$5(x2) {\n    return x2;\n  }\n  var map$1 = Array.prototype.map, prefixes = [\"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\"];\n  function formatLocale$1(locale2) {\n    var group2 = locale2.grouping === void 0 || locale2.thousands === void 0 ? identity$5 : formatGroup(map$1.call(locale2.grouping, Number), locale2.thousands + \"\"), currencyPrefix = locale2.currency === void 0 ? \"\" : locale2.currency[0] + \"\", currencySuffix = locale2.currency === void 0 ? \"\" : locale2.currency[1] + \"\", decimal = locale2.decimal === void 0 ? \".\" : locale2.decimal + \"\", numerals = locale2.numerals === void 0 ? identity$5 : formatNumerals(map$1.call(locale2.numerals, String)), percent = locale2.percent === void 0 ? \"%\" : locale2.percent + \"\", minus = locale2.minus === void 0 ? \"−\" : locale2.minus + \"\", nan = locale2.nan === void 0 ? \"NaN\" : locale2.nan + \"\";\n    function newFormat(specifier) {\n      specifier = formatSpecifier(specifier);\n      var fill2 = specifier.fill, align = specifier.align, sign2 = specifier.sign, symbol2 = specifier.symbol, zero2 = specifier.zero, width2 = specifier.width, comma = specifier.comma, precision = specifier.precision, trim = specifier.trim, type2 = specifier.type;\n      if (type2 === \"n\") comma = true, type2 = \"g\";\n      else if (!formatTypes[type2]) precision === void 0 && (precision = 12), trim = true, type2 = \"g\";\n      if (zero2 || fill2 === \"0\" && align === \"=\") zero2 = true, fill2 = \"0\", align = \"=\";\n      var prefix = symbol2 === \"$\" ? currencyPrefix : symbol2 === \"#\" && /[boxX]/.test(type2) ? \"0\" + type2.toLowerCase() : \"\", suffix = symbol2 === \"$\" ? currencySuffix : /[%p]/.test(type2) ? percent : \"\";\n      var formatType = formatTypes[type2], maybeSuffix = /[defgprs%]/.test(type2);\n      precision = precision === void 0 ? 6 : /[gprs]/.test(type2) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision));\n      function format2(value2) {\n        var valuePrefix = prefix, valueSuffix = suffix, i, n, c2;\n        if (type2 === \"c\") {\n          valueSuffix = formatType(value2) + valueSuffix;\n          value2 = \"\";\n        } else {\n          value2 = +value2;\n          var valueNegative = value2 < 0 || 1 / value2 < 0;\n          value2 = isNaN(value2) ? nan : formatType(Math.abs(value2), precision);\n          if (trim) value2 = formatTrim(value2);\n          if (valueNegative && +value2 === 0 && sign2 !== \"+\") valueNegative = false;\n          valuePrefix = (valueNegative ? sign2 === \"(\" ? sign2 : minus : sign2 === \"-\" || sign2 === \"(\" ? \"\" : sign2) + valuePrefix;\n          valueSuffix = (type2 === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign2 === \"(\" ? \")\" : \"\");\n          if (maybeSuffix) {\n            i = -1, n = value2.length;\n            while (++i < n) {\n              if (c2 = value2.charCodeAt(i), 48 > c2 || c2 > 57) {\n                valueSuffix = (c2 === 46 ? decimal + value2.slice(i + 1) : value2.slice(i)) + valueSuffix;\n                value2 = value2.slice(0, i);\n                break;\n              }\n            }\n          }\n        }\n        if (comma && !zero2) value2 = group2(value2, Infinity);\n        var length2 = valuePrefix.length + value2.length + valueSuffix.length, padding2 = length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) : \"\";\n        if (comma && zero2) value2 = group2(padding2 + value2, padding2.length ? width2 - valueSuffix.length : Infinity), padding2 = \"\";\n        switch (align) {\n          case \"<\":\n            value2 = valuePrefix + value2 + valueSuffix + padding2;\n            break;\n          case \"=\":\n            value2 = valuePrefix + padding2 + value2 + valueSuffix;\n            break;\n          case \"^\":\n            value2 = padding2.slice(0, length2 = padding2.length >> 1) + valuePrefix + value2 + valueSuffix + padding2.slice(length2);\n            break;\n          default:\n            value2 = padding2 + valuePrefix + value2 + valueSuffix;\n            break;\n        }\n        return numerals(value2);\n      }\n      format2.toString = function() {\n        return specifier + \"\";\n      };\n      return format2;\n    }\n    function formatPrefix2(specifier, value2) {\n      var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)), e = Math.max(-8, Math.min(8, Math.floor(exponent(value2) / 3))) * 3, k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];\n      return function(value3) {\n        return f(k * value3) + prefix;\n      };\n    }\n    return {\n      format: newFormat,\n      formatPrefix: formatPrefix2\n    };\n  }\n  var locale$2;\n  var format$3;\n  var formatPrefix;\n  defaultLocale$2({\n    thousands: \",\",\n    grouping: [3],\n    currency: [\"$\", \"\"]\n  });\n  function defaultLocale$2(definition2) {\n    locale$2 = formatLocale$1(definition2);\n    format$3 = locale$2.format;\n    formatPrefix = locale$2.formatPrefix;\n    return locale$2;\n  }\n  function precisionFixed(step) {\n    return Math.max(0, -exponent(Math.abs(step)));\n  }\n  function precisionPrefix(step, value2) {\n    return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value2) / 3))) * 3 - exponent(Math.abs(step)));\n  }\n  function precisionRound(step, max2) {\n    step = Math.abs(step), max2 = Math.abs(max2) - step;\n    return Math.max(0, exponent(max2) - exponent(step)) + 1;\n  }\n  const t0$2 = /* @__PURE__ */ new Date(), t1$1 = /* @__PURE__ */ new Date();\n  function timeInterval$1(floori, offseti, count2, field2) {\n    function interval2(date2) {\n      return floori(date2 = arguments.length === 0 ? /* @__PURE__ */ new Date() : /* @__PURE__ */ new Date(+date2)), date2;\n    }\n    interval2.floor = (date2) => {\n      return floori(date2 = /* @__PURE__ */ new Date(+date2)), date2;\n    };\n    interval2.ceil = (date2) => {\n      return floori(date2 = new Date(date2 - 1)), offseti(date2, 1), floori(date2), date2;\n    };\n    interval2.round = (date2) => {\n      const d0 = interval2(date2), d1 = interval2.ceil(date2);\n      return date2 - d0 < d1 - date2 ? d0 : d1;\n    };\n    interval2.offset = (date2, step) => {\n      return offseti(date2 = /* @__PURE__ */ new Date(+date2), step == null ? 1 : Math.floor(step)), date2;\n    };\n    interval2.range = (start, stop2, step) => {\n      const range2 = [];\n      start = interval2.ceil(start);\n      step = step == null ? 1 : Math.floor(step);\n      if (!(start < stop2) || !(step > 0)) return range2;\n      let previous;\n      do\n        range2.push(previous = /* @__PURE__ */ new Date(+start)), offseti(start, step), floori(start);\n      while (previous < start && start < stop2);\n      return range2;\n    };\n    interval2.filter = (test2) => {\n      return timeInterval$1((date2) => {\n        if (date2 >= date2) while (floori(date2), !test2(date2)) date2.setTime(date2 - 1);\n      }, (date2, step) => {\n        if (date2 >= date2) {\n          if (step < 0) while (++step <= 0) {\n            while (offseti(date2, -1), !test2(date2)) {\n            }\n          }\n          else while (--step >= 0) {\n            while (offseti(date2, 1), !test2(date2)) {\n            }\n          }\n        }\n      });\n    };\n    if (count2) {\n      interval2.count = (start, end) => {\n        t0$2.setTime(+start), t1$1.setTime(+end);\n        floori(t0$2), floori(t1$1);\n        return Math.floor(count2(t0$2, t1$1));\n      };\n      interval2.every = (step) => {\n        step = Math.floor(step);\n        return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval2 : interval2.filter(field2 ? (d) => field2(d) % step === 0 : (d) => interval2.count(0, d) % step === 0);\n      };\n    }\n    return interval2;\n  }\n  const millisecond = timeInterval$1(() => {\n  }, (date2, step) => {\n    date2.setTime(+date2 + step);\n  }, (start, end) => {\n    return end - start;\n  });\n  millisecond.every = (k) => {\n    k = Math.floor(k);\n    if (!isFinite(k) || !(k > 0)) return null;\n    if (!(k > 1)) return millisecond;\n    return timeInterval$1((date2) => {\n      date2.setTime(Math.floor(date2 / k) * k);\n    }, (date2, step) => {\n      date2.setTime(+date2 + step * k);\n    }, (start, end) => {\n      return (end - start) / k;\n    });\n  };\n  millisecond.range;\n  const durationSecond$1 = 1e3;\n  const durationMinute$1 = durationSecond$1 * 60;\n  const durationHour$1 = durationMinute$1 * 60;\n  const durationDay$1 = durationHour$1 * 24;\n  const durationWeek$1 = durationDay$1 * 7;\n  const durationMonth$1 = durationDay$1 * 30;\n  const durationYear$1 = durationDay$1 * 365;\n  const second = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds());\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationSecond$1);\n  }, (start, end) => {\n    return (end - start) / durationSecond$1;\n  }, (date2) => {\n    return date2.getUTCSeconds();\n  });\n  second.range;\n  const timeMinute = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond$1);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationMinute$1);\n  }, (start, end) => {\n    return (end - start) / durationMinute$1;\n  }, (date2) => {\n    return date2.getMinutes();\n  });\n  timeMinute.range;\n  const utcMinute = timeInterval$1((date2) => {\n    date2.setUTCSeconds(0, 0);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationMinute$1);\n  }, (start, end) => {\n    return (end - start) / durationMinute$1;\n  }, (date2) => {\n    return date2.getUTCMinutes();\n  });\n  utcMinute.range;\n  const timeHour = timeInterval$1((date2) => {\n    date2.setTime(date2 - date2.getMilliseconds() - date2.getSeconds() * durationSecond$1 - date2.getMinutes() * durationMinute$1);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationHour$1);\n  }, (start, end) => {\n    return (end - start) / durationHour$1;\n  }, (date2) => {\n    return date2.getHours();\n  });\n  timeHour.range;\n  const utcHour = timeInterval$1((date2) => {\n    date2.setUTCMinutes(0, 0, 0);\n  }, (date2, step) => {\n    date2.setTime(+date2 + step * durationHour$1);\n  }, (start, end) => {\n    return (end - start) / durationHour$1;\n  }, (date2) => {\n    return date2.getUTCHours();\n  });\n  utcHour.range;\n  const timeDay = timeInterval$1(\n    (date2) => date2.setHours(0, 0, 0, 0),\n    (date2, step) => date2.setDate(date2.getDate() + step),\n    (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationDay$1,\n    (date2) => date2.getDate() - 1\n  );\n  timeDay.range;\n  const utcDay = timeInterval$1((date2) => {\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCDate(date2.getUTCDate() + step);\n  }, (start, end) => {\n    return (end - start) / durationDay$1;\n  }, (date2) => {\n    return date2.getUTCDate() - 1;\n  });\n  utcDay.range;\n  const unixDay = timeInterval$1((date2) => {\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCDate(date2.getUTCDate() + step);\n  }, (start, end) => {\n    return (end - start) / durationDay$1;\n  }, (date2) => {\n    return Math.floor(date2 / durationDay$1);\n  });\n  unixDay.range;\n  function timeWeekday(i) {\n    return timeInterval$1((date2) => {\n      date2.setDate(date2.getDate() - (date2.getDay() + 7 - i) % 7);\n      date2.setHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setDate(date2.getDate() + step * 7);\n    }, (start, end) => {\n      return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute$1) / durationWeek$1;\n    });\n  }\n  const timeSunday = timeWeekday(0);\n  const timeMonday = timeWeekday(1);\n  const timeTuesday = timeWeekday(2);\n  const timeWednesday = timeWeekday(3);\n  const timeThursday = timeWeekday(4);\n  const timeFriday = timeWeekday(5);\n  const timeSaturday = timeWeekday(6);\n  timeSunday.range;\n  timeMonday.range;\n  timeTuesday.range;\n  timeWednesday.range;\n  timeThursday.range;\n  timeFriday.range;\n  timeSaturday.range;\n  function utcWeekday(i) {\n    return timeInterval$1((date2) => {\n      date2.setUTCDate(date2.getUTCDate() - (date2.getUTCDay() + 7 - i) % 7);\n      date2.setUTCHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setUTCDate(date2.getUTCDate() + step * 7);\n    }, (start, end) => {\n      return (end - start) / durationWeek$1;\n    });\n  }\n  const utcSunday = utcWeekday(0);\n  const utcMonday = utcWeekday(1);\n  const utcTuesday = utcWeekday(2);\n  const utcWednesday = utcWeekday(3);\n  const utcThursday = utcWeekday(4);\n  const utcFriday = utcWeekday(5);\n  const utcSaturday = utcWeekday(6);\n  utcSunday.range;\n  utcMonday.range;\n  utcTuesday.range;\n  utcWednesday.range;\n  utcThursday.range;\n  utcFriday.range;\n  utcSaturday.range;\n  const timeMonth = timeInterval$1((date2) => {\n    date2.setDate(1);\n    date2.setHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setMonth(date2.getMonth() + step);\n  }, (start, end) => {\n    return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n  }, (date2) => {\n    return date2.getMonth();\n  });\n  timeMonth.range;\n  const utcMonth = timeInterval$1((date2) => {\n    date2.setUTCDate(1);\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCMonth(date2.getUTCMonth() + step);\n  }, (start, end) => {\n    return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n  }, (date2) => {\n    return date2.getUTCMonth();\n  });\n  utcMonth.range;\n  const timeYear = timeInterval$1((date2) => {\n    date2.setMonth(0, 1);\n    date2.setHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setFullYear(date2.getFullYear() + step);\n  }, (start, end) => {\n    return end.getFullYear() - start.getFullYear();\n  }, (date2) => {\n    return date2.getFullYear();\n  });\n  timeYear.every = (k) => {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval$1((date2) => {\n      date2.setFullYear(Math.floor(date2.getFullYear() / k) * k);\n      date2.setMonth(0, 1);\n      date2.setHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setFullYear(date2.getFullYear() + step * k);\n    });\n  };\n  timeYear.range;\n  const utcYear = timeInterval$1((date2) => {\n    date2.setUTCMonth(0, 1);\n    date2.setUTCHours(0, 0, 0, 0);\n  }, (date2, step) => {\n    date2.setUTCFullYear(date2.getUTCFullYear() + step);\n  }, (start, end) => {\n    return end.getUTCFullYear() - start.getUTCFullYear();\n  }, (date2) => {\n    return date2.getUTCFullYear();\n  });\n  utcYear.every = (k) => {\n    return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval$1((date2) => {\n      date2.setUTCFullYear(Math.floor(date2.getUTCFullYear() / k) * k);\n      date2.setUTCMonth(0, 1);\n      date2.setUTCHours(0, 0, 0, 0);\n    }, (date2, step) => {\n      date2.setUTCFullYear(date2.getUTCFullYear() + step * k);\n    });\n  };\n  utcYear.range;\n  function ticker(year, month, week2, day, hour, minute) {\n    const tickIntervals = [\n      [second, 1, durationSecond$1],\n      [second, 5, 5 * durationSecond$1],\n      [second, 15, 15 * durationSecond$1],\n      [second, 30, 30 * durationSecond$1],\n      [minute, 1, durationMinute$1],\n      [minute, 5, 5 * durationMinute$1],\n      [minute, 15, 15 * durationMinute$1],\n      [minute, 30, 30 * durationMinute$1],\n      [hour, 1, durationHour$1],\n      [hour, 3, 3 * durationHour$1],\n      [hour, 6, 6 * durationHour$1],\n      [hour, 12, 12 * durationHour$1],\n      [day, 1, durationDay$1],\n      [day, 2, 2 * durationDay$1],\n      [week2, 1, durationWeek$1],\n      [month, 1, durationMonth$1],\n      [month, 3, 3 * durationMonth$1],\n      [year, 1, durationYear$1]\n    ];\n    function ticks2(start, stop2, count2) {\n      const reverse2 = stop2 < start;\n      if (reverse2) [start, stop2] = [stop2, start];\n      const interval2 = count2 && typeof count2.range === \"function\" ? count2 : tickInterval(start, stop2, count2);\n      const ticks3 = interval2 ? interval2.range(start, +stop2 + 1) : [];\n      return reverse2 ? ticks3.reverse() : ticks3;\n    }\n    function tickInterval(start, stop2, count2) {\n      const target2 = Math.abs(stop2 - start) / count2;\n      const i = bisector(([, , step2]) => step2).right(tickIntervals, target2);\n      if (i === tickIntervals.length) return year.every(tickStep(start / durationYear$1, stop2 / durationYear$1, count2));\n      if (i === 0) return millisecond.every(Math.max(tickStep(start, stop2, count2), 1));\n      const [t, step] = tickIntervals[target2 / tickIntervals[i - 1][2] < tickIntervals[i][2] / target2 ? i - 1 : i];\n      return t.every(step);\n    }\n    return [ticks2, tickInterval];\n  }\n  const [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\n  const [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n  const YEAR = \"year\";\n  const QUARTER = \"quarter\";\n  const MONTH = \"month\";\n  const WEEK = \"week\";\n  const DATE = \"date\";\n  const DAY = \"day\";\n  const DAYOFYEAR = \"dayofyear\";\n  const HOURS = \"hours\";\n  const MINUTES = \"minutes\";\n  const SECONDS = \"seconds\";\n  const MILLISECONDS = \"milliseconds\";\n  const TIME_UNITS = [YEAR, QUARTER, MONTH, WEEK, DATE, DAY, DAYOFYEAR, HOURS, MINUTES, SECONDS, MILLISECONDS];\n  const UNITS = TIME_UNITS.reduce((o, u2, i) => (o[u2] = 1 + i, o), {});\n  function timeUnits(units) {\n    const u2 = array$5(units).slice(), m2 = {};\n    if (!u2.length) error(\"Missing time unit.\");\n    u2.forEach((unit2) => {\n      if (has$1(UNITS, unit2)) {\n        m2[unit2] = 1;\n      } else {\n        error(`Invalid time unit: ${unit2}.`);\n      }\n    });\n    const numTypes = (m2[WEEK] || m2[DAY] ? 1 : 0) + (m2[QUARTER] || m2[MONTH] || m2[DATE] ? 1 : 0) + (m2[DAYOFYEAR] ? 1 : 0);\n    if (numTypes > 1) {\n      error(`Incompatible time units: ${units}`);\n    }\n    u2.sort((a2, b2) => UNITS[a2] - UNITS[b2]);\n    return u2;\n  }\n  const defaultSpecifiers = {\n    [YEAR]: \"%Y \",\n    [QUARTER]: \"Q%q \",\n    [MONTH]: \"%b \",\n    [DATE]: \"%d \",\n    [WEEK]: \"W%U \",\n    [DAY]: \"%a \",\n    [DAYOFYEAR]: \"%j \",\n    [HOURS]: \"%H:00\",\n    [MINUTES]: \"00:%M\",\n    [SECONDS]: \":%S\",\n    [MILLISECONDS]: \".%L\",\n    [`${YEAR}-${MONTH}`]: \"%Y-%m \",\n    [`${YEAR}-${MONTH}-${DATE}`]: \"%Y-%m-%d \",\n    [`${HOURS}-${MINUTES}`]: \"%H:%M\"\n  };\n  function timeUnitSpecifier(units, specifiers) {\n    const s = extend$1({}, defaultSpecifiers, specifiers), u2 = timeUnits(units), n = u2.length;\n    let fmt = \"\", start = 0, end, key2;\n    for (start = 0; start < n; ) {\n      for (end = u2.length; end > start; --end) {\n        key2 = u2.slice(start, end).join(\"-\");\n        if (s[key2] != null) {\n          fmt += s[key2];\n          start = end;\n          break;\n        }\n      }\n    }\n    return fmt.trim();\n  }\n  const t0$1 = /* @__PURE__ */ new Date();\n  function localYear(y2) {\n    t0$1.setFullYear(y2);\n    t0$1.setMonth(0);\n    t0$1.setDate(1);\n    t0$1.setHours(0, 0, 0, 0);\n    return t0$1;\n  }\n  function dayofyear(d) {\n    return localDayOfYear(new Date(d));\n  }\n  function week(d) {\n    return localWeekNum(new Date(d));\n  }\n  function localDayOfYear(d) {\n    return timeDay.count(localYear(d.getFullYear()) - 1, d);\n  }\n  function localWeekNum(d) {\n    return timeSunday.count(localYear(d.getFullYear()) - 1, d);\n  }\n  function localFirst(y2) {\n    return localYear(y2).getDay();\n  }\n  function localDate$1(y2, m2, d, H, M2, S, L) {\n    if (0 <= y2 && y2 < 100) {\n      const date2 = new Date(-1, m2, d, H, M2, S, L);\n      date2.setFullYear(y2);\n      return date2;\n    }\n    return new Date(y2, m2, d, H, M2, S, L);\n  }\n  function utcdayofyear(d) {\n    return utcDayOfYear(new Date(d));\n  }\n  function utcweek(d) {\n    return utcWeekNum(new Date(d));\n  }\n  function utcDayOfYear(d) {\n    const y2 = Date.UTC(d.getUTCFullYear(), 0, 1);\n    return utcDay.count(y2 - 1, d);\n  }\n  function utcWeekNum(d) {\n    const y2 = Date.UTC(d.getUTCFullYear(), 0, 1);\n    return utcSunday.count(y2 - 1, d);\n  }\n  function utcFirst(y2) {\n    t0$1.setTime(Date.UTC(y2, 0, 1));\n    return t0$1.getUTCDay();\n  }\n  function utcDate$1(y2, m2, d, H, M2, S, L) {\n    if (0 <= y2 && y2 < 100) {\n      const date2 = new Date(Date.UTC(-1, m2, d, H, M2, S, L));\n      date2.setUTCFullYear(d.y);\n      return date2;\n    }\n    return new Date(Date.UTC(y2, m2, d, H, M2, S, L));\n  }\n  function floor(units, step, get2, inv, newDate2) {\n    const s = step || 1, b2 = peek$1(units), _ = (unit2, p, key2) => {\n      key2 = key2 || unit2;\n      return getUnit(get2[key2], inv[key2], unit2 === b2 && s, p);\n    };\n    const t = /* @__PURE__ */ new Date(), u2 = toSet(units), y2 = u2[YEAR] ? _(YEAR) : constant$5(2012), m2 = u2[MONTH] ? _(MONTH) : u2[QUARTER] ? _(QUARTER) : zero$3, d = u2[WEEK] && u2[DAY] ? _(DAY, 1, WEEK + DAY) : u2[WEEK] ? _(WEEK, 1) : u2[DAY] ? _(DAY, 1) : u2[DATE] ? _(DATE, 1) : u2[DAYOFYEAR] ? _(DAYOFYEAR, 1) : one$2, H = u2[HOURS] ? _(HOURS) : zero$3, M2 = u2[MINUTES] ? _(MINUTES) : zero$3, S = u2[SECONDS] ? _(SECONDS) : zero$3, L = u2[MILLISECONDS] ? _(MILLISECONDS) : zero$3;\n    return function(v) {\n      t.setTime(+v);\n      const year = y2(t);\n      return newDate2(year, m2(t), d(t, year), H(t), M2(t), S(t), L(t));\n    };\n  }\n  function getUnit(f, inv, step, phase) {\n    const u2 = step <= 1 ? f : phase ? (d, y2) => phase + step * Math.floor((f(d, y2) - phase) / step) : (d, y2) => step * Math.floor(f(d, y2) / step);\n    return inv ? (d, y2) => inv(u2(d, y2), y2) : u2;\n  }\n  function weekday(week2, day, firstDay) {\n    return day + week2 * 7 - (firstDay + 6) % 7;\n  }\n  const localGet = {\n    [YEAR]: (d) => d.getFullYear(),\n    [QUARTER]: (d) => Math.floor(d.getMonth() / 3),\n    [MONTH]: (d) => d.getMonth(),\n    [DATE]: (d) => d.getDate(),\n    [HOURS]: (d) => d.getHours(),\n    [MINUTES]: (d) => d.getMinutes(),\n    [SECONDS]: (d) => d.getSeconds(),\n    [MILLISECONDS]: (d) => d.getMilliseconds(),\n    [DAYOFYEAR]: (d) => localDayOfYear(d),\n    [WEEK]: (d) => localWeekNum(d),\n    [WEEK + DAY]: (d, y2) => weekday(localWeekNum(d), d.getDay(), localFirst(y2)),\n    [DAY]: (d, y2) => weekday(1, d.getDay(), localFirst(y2))\n  };\n  const localInv = {\n    [QUARTER]: (q) => 3 * q,\n    [WEEK]: (w2, y2) => weekday(w2, 0, localFirst(y2))\n  };\n  function timeFloor(units, step) {\n    return floor(units, step || 1, localGet, localInv, localDate$1);\n  }\n  const utcGet = {\n    [YEAR]: (d) => d.getUTCFullYear(),\n    [QUARTER]: (d) => Math.floor(d.getUTCMonth() / 3),\n    [MONTH]: (d) => d.getUTCMonth(),\n    [DATE]: (d) => d.getUTCDate(),\n    [HOURS]: (d) => d.getUTCHours(),\n    [MINUTES]: (d) => d.getUTCMinutes(),\n    [SECONDS]: (d) => d.getUTCSeconds(),\n    [MILLISECONDS]: (d) => d.getUTCMilliseconds(),\n    [DAYOFYEAR]: (d) => utcDayOfYear(d),\n    [WEEK]: (d) => utcWeekNum(d),\n    [DAY]: (d, y2) => weekday(1, d.getUTCDay(), utcFirst(y2)),\n    [WEEK + DAY]: (d, y2) => weekday(utcWeekNum(d), d.getUTCDay(), utcFirst(y2))\n  };\n  const utcInv = {\n    [QUARTER]: (q) => 3 * q,\n    [WEEK]: (w2, y2) => weekday(w2, 0, utcFirst(y2))\n  };\n  function utcFloor(units, step) {\n    return floor(units, step || 1, utcGet, utcInv, utcDate$1);\n  }\n  const timeIntervals = {\n    [YEAR]: timeYear,\n    [QUARTER]: timeMonth.every(3),\n    [MONTH]: timeMonth,\n    [WEEK]: timeSunday,\n    [DATE]: timeDay,\n    [DAY]: timeDay,\n    [DAYOFYEAR]: timeDay,\n    [HOURS]: timeHour,\n    [MINUTES]: timeMinute,\n    [SECONDS]: second,\n    [MILLISECONDS]: millisecond\n  };\n  const utcIntervals = {\n    [YEAR]: utcYear,\n    [QUARTER]: utcMonth.every(3),\n    [MONTH]: utcMonth,\n    [WEEK]: utcSunday,\n    [DATE]: utcDay,\n    [DAY]: utcDay,\n    [DAYOFYEAR]: utcDay,\n    [HOURS]: utcHour,\n    [MINUTES]: utcMinute,\n    [SECONDS]: second,\n    [MILLISECONDS]: millisecond\n  };\n  function timeInterval(unit2) {\n    return timeIntervals[unit2];\n  }\n  function utcInterval(unit2) {\n    return utcIntervals[unit2];\n  }\n  function offset$3(ival, date2, step) {\n    return ival ? ival.offset(date2, step) : void 0;\n  }\n  function timeOffset(unit2, date2, step) {\n    return offset$3(timeInterval(unit2), date2, step);\n  }\n  function utcOffset(unit2, date2, step) {\n    return offset$3(utcInterval(unit2), date2, step);\n  }\n  function sequence$1(ival, start, stop2, step) {\n    return ival ? ival.range(start, stop2, step) : void 0;\n  }\n  function timeSequence(unit2, start, stop2, step) {\n    return sequence$1(timeInterval(unit2), start, stop2, step);\n  }\n  function utcSequence(unit2, start, stop2, step) {\n    return sequence$1(utcInterval(unit2), start, stop2, step);\n  }\n  const durationSecond = 1e3, durationMinute = durationSecond * 60, durationHour = durationMinute * 60, durationDay = durationHour * 24, durationWeek = durationDay * 7, durationMonth = durationDay * 30, durationYear = durationDay * 365;\n  const Milli = [YEAR, MONTH, DATE, HOURS, MINUTES, SECONDS, MILLISECONDS], Seconds = Milli.slice(0, -1), Minutes = Seconds.slice(0, -1), Hours = Minutes.slice(0, -1), Day = Hours.slice(0, -1), Week = [YEAR, WEEK], Month = [YEAR, MONTH], Year = [YEAR];\n  const intervals = [[Seconds, 1, durationSecond], [Seconds, 5, 5 * durationSecond], [Seconds, 15, 15 * durationSecond], [Seconds, 30, 30 * durationSecond], [Minutes, 1, durationMinute], [Minutes, 5, 5 * durationMinute], [Minutes, 15, 15 * durationMinute], [Minutes, 30, 30 * durationMinute], [Hours, 1, durationHour], [Hours, 3, 3 * durationHour], [Hours, 6, 6 * durationHour], [Hours, 12, 12 * durationHour], [Day, 1, durationDay], [Week, 1, durationWeek], [Month, 1, durationMonth], [Month, 3, 3 * durationMonth], [Year, 1, durationYear]];\n  function bin$1(opt) {\n    const ext = opt.extent, max2 = opt.maxbins || 40, target2 = Math.abs(span(ext)) / max2;\n    let i = bisector((i2) => i2[2]).right(intervals, target2), units, step;\n    if (i === intervals.length) {\n      units = Year, step = tickStep(ext[0] / durationYear, ext[1] / durationYear, max2);\n    } else if (i) {\n      i = intervals[target2 / intervals[i - 1][2] < intervals[i][2] / target2 ? i - 1 : i];\n      units = i[0];\n      step = i[1];\n    } else {\n      units = Milli;\n      step = Math.max(tickStep(ext[0], ext[1], max2), 1);\n    }\n    return {\n      units,\n      step\n    };\n  }\n  function localDate(d) {\n    if (0 <= d.y && d.y < 100) {\n      var date2 = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n      date2.setFullYear(d.y);\n      return date2;\n    }\n    return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n  }\n  function utcDate(d) {\n    if (0 <= d.y && d.y < 100) {\n      var date2 = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n      date2.setUTCFullYear(d.y);\n      return date2;\n    }\n    return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n  }\n  function newDate(y2, m2, d) {\n    return { y: y2, m: m2, d, H: 0, M: 0, S: 0, L: 0 };\n  }\n  function formatLocale(locale2) {\n    var locale_dateTime = locale2.dateTime, locale_date = locale2.date, locale_time = locale2.time, locale_periods = locale2.periods, locale_weekdays = locale2.days, locale_shortWeekdays = locale2.shortDays, locale_months = locale2.months, locale_shortMonths = locale2.shortMonths;\n    var periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths);\n    var formats2 = {\n      \"a\": formatShortWeekday,\n      \"A\": formatWeekday,\n      \"b\": formatShortMonth,\n      \"B\": formatMonth,\n      \"c\": null,\n      \"d\": formatDayOfMonth,\n      \"e\": formatDayOfMonth,\n      \"f\": formatMicroseconds,\n      \"g\": formatYearISO,\n      \"G\": formatFullYearISO,\n      \"H\": formatHour24,\n      \"I\": formatHour12,\n      \"j\": formatDayOfYear,\n      \"L\": formatMilliseconds,\n      \"m\": formatMonthNumber,\n      \"M\": formatMinutes,\n      \"p\": formatPeriod,\n      \"q\": formatQuarter,\n      \"Q\": formatUnixTimestamp,\n      \"s\": formatUnixTimestampSeconds,\n      \"S\": formatSeconds,\n      \"u\": formatWeekdayNumberMonday,\n      \"U\": formatWeekNumberSunday,\n      \"V\": formatWeekNumberISO,\n      \"w\": formatWeekdayNumberSunday,\n      \"W\": formatWeekNumberMonday,\n      \"x\": null,\n      \"X\": null,\n      \"y\": formatYear,\n      \"Y\": formatFullYear,\n      \"Z\": formatZone,\n      \"%\": formatLiteralPercent\n    };\n    var utcFormats = {\n      \"a\": formatUTCShortWeekday,\n      \"A\": formatUTCWeekday,\n      \"b\": formatUTCShortMonth,\n      \"B\": formatUTCMonth,\n      \"c\": null,\n      \"d\": formatUTCDayOfMonth,\n      \"e\": formatUTCDayOfMonth,\n      \"f\": formatUTCMicroseconds,\n      \"g\": formatUTCYearISO,\n      \"G\": formatUTCFullYearISO,\n      \"H\": formatUTCHour24,\n      \"I\": formatUTCHour12,\n      \"j\": formatUTCDayOfYear,\n      \"L\": formatUTCMilliseconds,\n      \"m\": formatUTCMonthNumber,\n      \"M\": formatUTCMinutes,\n      \"p\": formatUTCPeriod,\n      \"q\": formatUTCQuarter,\n      \"Q\": formatUnixTimestamp,\n      \"s\": formatUnixTimestampSeconds,\n      \"S\": formatUTCSeconds,\n      \"u\": formatUTCWeekdayNumberMonday,\n      \"U\": formatUTCWeekNumberSunday,\n      \"V\": formatUTCWeekNumberISO,\n      \"w\": formatUTCWeekdayNumberSunday,\n      \"W\": formatUTCWeekNumberMonday,\n      \"x\": null,\n      \"X\": null,\n      \"y\": formatUTCYear,\n      \"Y\": formatUTCFullYear,\n      \"Z\": formatUTCZone,\n      \"%\": formatLiteralPercent\n    };\n    var parses = {\n      \"a\": parseShortWeekday,\n      \"A\": parseWeekday,\n      \"b\": parseShortMonth,\n      \"B\": parseMonth,\n      \"c\": parseLocaleDateTime,\n      \"d\": parseDayOfMonth,\n      \"e\": parseDayOfMonth,\n      \"f\": parseMicroseconds,\n      \"g\": parseYear,\n      \"G\": parseFullYear,\n      \"H\": parseHour24,\n      \"I\": parseHour24,\n      \"j\": parseDayOfYear,\n      \"L\": parseMilliseconds,\n      \"m\": parseMonthNumber,\n      \"M\": parseMinutes,\n      \"p\": parsePeriod,\n      \"q\": parseQuarter,\n      \"Q\": parseUnixTimestamp,\n      \"s\": parseUnixTimestampSeconds,\n      \"S\": parseSeconds,\n      \"u\": parseWeekdayNumberMonday,\n      \"U\": parseWeekNumberSunday,\n      \"V\": parseWeekNumberISO,\n      \"w\": parseWeekdayNumberSunday,\n      \"W\": parseWeekNumberMonday,\n      \"x\": parseLocaleDate,\n      \"X\": parseLocaleTime,\n      \"y\": parseYear,\n      \"Y\": parseFullYear,\n      \"Z\": parseZone,\n      \"%\": parseLiteralPercent\n    };\n    formats2.x = newFormat(locale_date, formats2);\n    formats2.X = newFormat(locale_time, formats2);\n    formats2.c = newFormat(locale_dateTime, formats2);\n    utcFormats.x = newFormat(locale_date, utcFormats);\n    utcFormats.X = newFormat(locale_time, utcFormats);\n    utcFormats.c = newFormat(locale_dateTime, utcFormats);\n    function newFormat(specifier, formats3) {\n      return function(date2) {\n        var string2 = [], i = -1, j = 0, n = specifier.length, c2, pad2, format2;\n        if (!(date2 instanceof Date)) date2 = /* @__PURE__ */ new Date(+date2);\n        while (++i < n) {\n          if (specifier.charCodeAt(i) === 37) {\n            string2.push(specifier.slice(j, i));\n            if ((pad2 = pads[c2 = specifier.charAt(++i)]) != null) c2 = specifier.charAt(++i);\n            else pad2 = c2 === \"e\" ? \" \" : \"0\";\n            if (format2 = formats3[c2]) c2 = format2(date2, pad2);\n            string2.push(c2);\n            j = i + 1;\n          }\n        }\n        string2.push(specifier.slice(j, i));\n        return string2.join(\"\");\n      };\n    }\n    function newParse(specifier, Z) {\n      return function(string2) {\n        var d = newDate(1900, void 0, 1), i = parseSpecifier(d, specifier, string2 += \"\", 0), week2, day;\n        if (i != string2.length) return null;\n        if (\"Q\" in d) return new Date(d.Q);\n        if (\"s\" in d) return new Date(d.s * 1e3 + (\"L\" in d ? d.L : 0));\n        if (Z && !(\"Z\" in d)) d.Z = 0;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        if (d.m === void 0) d.m = \"q\" in d ? d.q : 0;\n        if (\"V\" in d) {\n          if (d.V < 1 || d.V > 53) return null;\n          if (!(\"w\" in d)) d.w = 1;\n          if (\"Z\" in d) {\n            week2 = utcDate(newDate(d.y, 0, 1)), day = week2.getUTCDay();\n            week2 = day > 4 || day === 0 ? utcMonday.ceil(week2) : utcMonday(week2);\n            week2 = utcDay.offset(week2, (d.V - 1) * 7);\n            d.y = week2.getUTCFullYear();\n            d.m = week2.getUTCMonth();\n            d.d = week2.getUTCDate() + (d.w + 6) % 7;\n          } else {\n            week2 = localDate(newDate(d.y, 0, 1)), day = week2.getDay();\n            week2 = day > 4 || day === 0 ? timeMonday.ceil(week2) : timeMonday(week2);\n            week2 = timeDay.offset(week2, (d.V - 1) * 7);\n            d.y = week2.getFullYear();\n            d.m = week2.getMonth();\n            d.d = week2.getDate() + (d.w + 6) % 7;\n          }\n        } else if (\"W\" in d || \"U\" in d) {\n          if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n          day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n          d.m = 0;\n          d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n        }\n        if (\"Z\" in d) {\n          d.H += d.Z / 100 | 0;\n          d.M += d.Z % 100;\n          return utcDate(d);\n        }\n        return localDate(d);\n      };\n    }\n    function parseSpecifier(d, specifier, string2, j) {\n      var i = 0, n = specifier.length, m2 = string2.length, c2, parse2;\n      while (i < n) {\n        if (j >= m2) return -1;\n        c2 = specifier.charCodeAt(i++);\n        if (c2 === 37) {\n          c2 = specifier.charAt(i++);\n          parse2 = parses[c2 in pads ? specifier.charAt(i++) : c2];\n          if (!parse2 || (j = parse2(d, string2, j)) < 0) return -1;\n        } else if (c2 != string2.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    function parsePeriod(d, string2, i) {\n      var n = periodRe.exec(string2.slice(i));\n      return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortWeekday(d, string2, i) {\n      var n = shortWeekdayRe.exec(string2.slice(i));\n      return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseWeekday(d, string2, i) {\n      var n = weekdayRe.exec(string2.slice(i));\n      return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseShortMonth(d, string2, i) {\n      var n = shortMonthRe.exec(string2.slice(i));\n      return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseMonth(d, string2, i) {\n      var n = monthRe.exec(string2.slice(i));\n      return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function parseLocaleDateTime(d, string2, i) {\n      return parseSpecifier(d, locale_dateTime, string2, i);\n    }\n    function parseLocaleDate(d, string2, i) {\n      return parseSpecifier(d, locale_date, string2, i);\n    }\n    function parseLocaleTime(d, string2, i) {\n      return parseSpecifier(d, locale_time, string2, i);\n    }\n    function formatShortWeekday(d) {\n      return locale_shortWeekdays[d.getDay()];\n    }\n    function formatWeekday(d) {\n      return locale_weekdays[d.getDay()];\n    }\n    function formatShortMonth(d) {\n      return locale_shortMonths[d.getMonth()];\n    }\n    function formatMonth(d) {\n      return locale_months[d.getMonth()];\n    }\n    function formatPeriod(d) {\n      return locale_periods[+(d.getHours() >= 12)];\n    }\n    function formatQuarter(d) {\n      return 1 + ~~(d.getMonth() / 3);\n    }\n    function formatUTCShortWeekday(d) {\n      return locale_shortWeekdays[d.getUTCDay()];\n    }\n    function formatUTCWeekday(d) {\n      return locale_weekdays[d.getUTCDay()];\n    }\n    function formatUTCShortMonth(d) {\n      return locale_shortMonths[d.getUTCMonth()];\n    }\n    function formatUTCMonth(d) {\n      return locale_months[d.getUTCMonth()];\n    }\n    function formatUTCPeriod(d) {\n      return locale_periods[+(d.getUTCHours() >= 12)];\n    }\n    function formatUTCQuarter(d) {\n      return 1 + ~~(d.getUTCMonth() / 3);\n    }\n    return {\n      format: function(specifier) {\n        var f = newFormat(specifier += \"\", formats2);\n        f.toString = function() {\n          return specifier;\n        };\n        return f;\n      },\n      parse: function(specifier) {\n        var p = newParse(specifier += \"\", false);\n        p.toString = function() {\n          return specifier;\n        };\n        return p;\n      },\n      utcFormat: function(specifier) {\n        var f = newFormat(specifier += \"\", utcFormats);\n        f.toString = function() {\n          return specifier;\n        };\n        return f;\n      },\n      utcParse: function(specifier) {\n        var p = newParse(specifier += \"\", true);\n        p.toString = function() {\n          return specifier;\n        };\n        return p;\n      }\n    };\n  }\n  var pads = { \"-\": \"\", \"_\": \" \", \"0\": \"0\" }, numberRe = /^\\s*\\d+/, percentRe = /^%/, requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n  function pad(value2, fill2, width2) {\n    var sign2 = value2 < 0 ? \"-\" : \"\", string2 = (sign2 ? -value2 : value2) + \"\", length2 = string2.length;\n    return sign2 + (length2 < width2 ? new Array(width2 - length2 + 1).join(fill2) + string2 : string2);\n  }\n  function requote(s) {\n    return s.replace(requoteRe, \"\\\\$&\");\n  }\n  function formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n  }\n  function formatLookup(names) {\n    return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n  }\n  function parseWeekdayNumberSunday(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d.w = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekdayNumberMonday(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d.u = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberSunday(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.U = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberISO(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.V = +n[0], i + n[0].length) : -1;\n  }\n  function parseWeekNumberMonday(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.W = +n[0], i + n[0].length) : -1;\n  }\n  function parseFullYear(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 4));\n    return n ? (d.y = +n[0], i + n[0].length) : -1;\n  }\n  function parseYear(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2e3), i + n[0].length) : -1;\n  }\n  function parseZone(d, string2, i) {\n    var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string2.slice(i, i + 6));\n    return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n  }\n  function parseQuarter(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 1));\n    return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n  }\n  function parseMonthNumber(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function parseDayOfMonth(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.d = +n[0], i + n[0].length) : -1;\n  }\n  function parseDayOfYear(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 3));\n    return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n  }\n  function parseHour24(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.H = +n[0], i + n[0].length) : -1;\n  }\n  function parseMinutes(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.M = +n[0], i + n[0].length) : -1;\n  }\n  function parseSeconds(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 2));\n    return n ? (d.S = +n[0], i + n[0].length) : -1;\n  }\n  function parseMilliseconds(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 3));\n    return n ? (d.L = +n[0], i + n[0].length) : -1;\n  }\n  function parseMicroseconds(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i, i + 6));\n    return n ? (d.L = Math.floor(n[0] / 1e3), i + n[0].length) : -1;\n  }\n  function parseLiteralPercent(d, string2, i) {\n    var n = percentRe.exec(string2.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function parseUnixTimestamp(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i));\n    return n ? (d.Q = +n[0], i + n[0].length) : -1;\n  }\n  function parseUnixTimestampSeconds(d, string2, i) {\n    var n = numberRe.exec(string2.slice(i));\n    return n ? (d.s = +n[0], i + n[0].length) : -1;\n  }\n  function formatDayOfMonth(d, p) {\n    return pad(d.getDate(), p, 2);\n  }\n  function formatHour24(d, p) {\n    return pad(d.getHours(), p, 2);\n  }\n  function formatHour12(d, p) {\n    return pad(d.getHours() % 12 || 12, p, 2);\n  }\n  function formatDayOfYear(d, p) {\n    return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n  }\n  function formatMilliseconds(d, p) {\n    return pad(d.getMilliseconds(), p, 3);\n  }\n  function formatMicroseconds(d, p) {\n    return formatMilliseconds(d, p) + \"000\";\n  }\n  function formatMonthNumber(d, p) {\n    return pad(d.getMonth() + 1, p, 2);\n  }\n  function formatMinutes(d, p) {\n    return pad(d.getMinutes(), p, 2);\n  }\n  function formatSeconds(d, p) {\n    return pad(d.getSeconds(), p, 2);\n  }\n  function formatWeekdayNumberMonday(d) {\n    var day = d.getDay();\n    return day === 0 ? 7 : day;\n  }\n  function formatWeekNumberSunday(d, p) {\n    return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n  }\n  function dISO(d) {\n    var day = d.getDay();\n    return day >= 4 || day === 0 ? timeThursday(d) : timeThursday.ceil(d);\n  }\n  function formatWeekNumberISO(d, p) {\n    d = dISO(d);\n    return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n  }\n  function formatWeekdayNumberSunday(d) {\n    return d.getDay();\n  }\n  function formatWeekNumberMonday(d, p) {\n    return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n  }\n  function formatYear(d, p) {\n    return pad(d.getFullYear() % 100, p, 2);\n  }\n  function formatYearISO(d, p) {\n    d = dISO(d);\n    return pad(d.getFullYear() % 100, p, 2);\n  }\n  function formatFullYear(d, p) {\n    return pad(d.getFullYear() % 1e4, p, 4);\n  }\n  function formatFullYearISO(d, p) {\n    var day = d.getDay();\n    d = day >= 4 || day === 0 ? timeThursday(d) : timeThursday.ceil(d);\n    return pad(d.getFullYear() % 1e4, p, 4);\n  }\n  function formatZone(d) {\n    var z = d.getTimezoneOffset();\n    return (z > 0 ? \"-\" : (z *= -1, \"+\")) + pad(z / 60 | 0, \"0\", 2) + pad(z % 60, \"0\", 2);\n  }\n  function formatUTCDayOfMonth(d, p) {\n    return pad(d.getUTCDate(), p, 2);\n  }\n  function formatUTCHour24(d, p) {\n    return pad(d.getUTCHours(), p, 2);\n  }\n  function formatUTCHour12(d, p) {\n    return pad(d.getUTCHours() % 12 || 12, p, 2);\n  }\n  function formatUTCDayOfYear(d, p) {\n    return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n  }\n  function formatUTCMilliseconds(d, p) {\n    return pad(d.getUTCMilliseconds(), p, 3);\n  }\n  function formatUTCMicroseconds(d, p) {\n    return formatUTCMilliseconds(d, p) + \"000\";\n  }\n  function formatUTCMonthNumber(d, p) {\n    return pad(d.getUTCMonth() + 1, p, 2);\n  }\n  function formatUTCMinutes(d, p) {\n    return pad(d.getUTCMinutes(), p, 2);\n  }\n  function formatUTCSeconds(d, p) {\n    return pad(d.getUTCSeconds(), p, 2);\n  }\n  function formatUTCWeekdayNumberMonday(d) {\n    var dow = d.getUTCDay();\n    return dow === 0 ? 7 : dow;\n  }\n  function formatUTCWeekNumberSunday(d, p) {\n    return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n  }\n  function UTCdISO(d) {\n    var day = d.getUTCDay();\n    return day >= 4 || day === 0 ? utcThursday(d) : utcThursday.ceil(d);\n  }\n  function formatUTCWeekNumberISO(d, p) {\n    d = UTCdISO(d);\n    return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n  }\n  function formatUTCWeekdayNumberSunday(d) {\n    return d.getUTCDay();\n  }\n  function formatUTCWeekNumberMonday(d, p) {\n    return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n  }\n  function formatUTCYear(d, p) {\n    return pad(d.getUTCFullYear() % 100, p, 2);\n  }\n  function formatUTCYearISO(d, p) {\n    d = UTCdISO(d);\n    return pad(d.getUTCFullYear() % 100, p, 2);\n  }\n  function formatUTCFullYear(d, p) {\n    return pad(d.getUTCFullYear() % 1e4, p, 4);\n  }\n  function formatUTCFullYearISO(d, p) {\n    var day = d.getUTCDay();\n    d = day >= 4 || day === 0 ? utcThursday(d) : utcThursday.ceil(d);\n    return pad(d.getUTCFullYear() % 1e4, p, 4);\n  }\n  function formatUTCZone() {\n    return \"+0000\";\n  }\n  function formatLiteralPercent() {\n    return \"%\";\n  }\n  function formatUnixTimestamp(d) {\n    return +d;\n  }\n  function formatUnixTimestampSeconds(d) {\n    return Math.floor(+d / 1e3);\n  }\n  var locale$1;\n  var timeFormat$1;\n  var timeParse$1;\n  var utcFormat$1;\n  var utcParse$1;\n  defaultLocale$1({\n    dateTime: \"%x, %X\",\n    date: \"%-m/%-d/%Y\",\n    time: \"%-I:%M:%S %p\",\n    periods: [\"AM\", \"PM\"],\n    days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n    shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n    months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n    shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n  });\n  function defaultLocale$1(definition2) {\n    locale$1 = formatLocale(definition2);\n    timeFormat$1 = locale$1.format;\n    timeParse$1 = locale$1.parse;\n    utcFormat$1 = locale$1.utcFormat;\n    utcParse$1 = locale$1.utcParse;\n    return locale$1;\n  }\n  function memoize(method2) {\n    const cache2 = {};\n    return (spec) => cache2[spec] || (cache2[spec] = method2(spec));\n  }\n  function trimZeroes(numberFormat, decimalChar) {\n    return (x2) => {\n      const str = numberFormat(x2), dec = str.indexOf(decimalChar);\n      if (dec < 0) return str;\n      let idx = rightmostDigit(str, dec);\n      const end = idx < str.length ? str.slice(idx) : \"\";\n      while (--idx > dec) if (str[idx] !== \"0\") {\n        ++idx;\n        break;\n      }\n      return str.slice(0, idx) + end;\n    };\n  }\n  function rightmostDigit(str, dec) {\n    let i = str.lastIndexOf(\"e\"), c2;\n    if (i > 0) return i;\n    for (i = str.length; --i > dec; ) {\n      c2 = str.charCodeAt(i);\n      if (c2 >= 48 && c2 <= 57) return i + 1;\n    }\n  }\n  function numberLocale(locale2) {\n    const format2 = memoize(locale2.format), formatPrefix2 = locale2.formatPrefix;\n    return {\n      format: format2,\n      formatPrefix: formatPrefix2,\n      formatFloat(spec) {\n        const s = formatSpecifier(spec || \",\");\n        if (s.precision == null) {\n          s.precision = 12;\n          switch (s.type) {\n            case \"%\":\n              s.precision -= 2;\n              break;\n            case \"e\":\n              s.precision -= 1;\n              break;\n          }\n          return trimZeroes(\n            format2(s),\n            // number format\n            format2(\".1f\")(1)[1]\n            // decimal point character\n          );\n        } else {\n          return format2(s);\n        }\n      },\n      formatSpan(start, stop2, count2, specifier) {\n        specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n        const step = tickStep(start, stop2, count2), value2 = Math.max(Math.abs(start), Math.abs(stop2));\n        let precision;\n        if (specifier.precision == null) {\n          switch (specifier.type) {\n            case \"s\": {\n              if (!isNaN(precision = precisionPrefix(step, value2))) {\n                specifier.precision = precision;\n              }\n              return formatPrefix2(specifier, value2);\n            }\n            case \"\":\n            case \"e\":\n            case \"g\":\n            case \"p\":\n            case \"r\": {\n              if (!isNaN(precision = precisionRound(step, value2))) {\n                specifier.precision = precision - (specifier.type === \"e\");\n              }\n              break;\n            }\n            case \"f\":\n            case \"%\": {\n              if (!isNaN(precision = precisionFixed(step))) {\n                specifier.precision = precision - (specifier.type === \"%\") * 2;\n              }\n              break;\n            }\n          }\n        }\n        return format2(specifier);\n      }\n    };\n  }\n  let defaultNumberLocale;\n  resetNumberFormatDefaultLocale();\n  function resetNumberFormatDefaultLocale() {\n    return defaultNumberLocale = numberLocale({\n      format: format$3,\n      formatPrefix\n    });\n  }\n  function numberFormatLocale(definition2) {\n    return numberLocale(formatLocale$1(definition2));\n  }\n  function numberFormatDefaultLocale(definition2) {\n    return arguments.length ? defaultNumberLocale = numberFormatLocale(definition2) : defaultNumberLocale;\n  }\n  function timeMultiFormat(format2, interval2, spec) {\n    spec = spec || {};\n    if (!isObject$1(spec)) {\n      error(`Invalid time multi-format specifier: ${spec}`);\n    }\n    const second2 = interval2(SECONDS), minute = interval2(MINUTES), hour = interval2(HOURS), day = interval2(DATE), week2 = interval2(WEEK), month = interval2(MONTH), quarter2 = interval2(QUARTER), year = interval2(YEAR), L = format2(spec[MILLISECONDS] || \".%L\"), S = format2(spec[SECONDS] || \":%S\"), M2 = format2(spec[MINUTES] || \"%I:%M\"), H = format2(spec[HOURS] || \"%I %p\"), d = format2(spec[DATE] || spec[DAY] || \"%a %d\"), w2 = format2(spec[WEEK] || \"%b %d\"), m2 = format2(spec[MONTH] || \"%B\"), q = format2(spec[QUARTER] || \"%B\"), y2 = format2(spec[YEAR] || \"%Y\");\n    return (date2) => (second2(date2) < date2 ? L : minute(date2) < date2 ? S : hour(date2) < date2 ? M2 : day(date2) < date2 ? H : month(date2) < date2 ? week2(date2) < date2 ? d : w2 : year(date2) < date2 ? quarter2(date2) < date2 ? m2 : q : y2)(date2);\n  }\n  function timeLocale(locale2) {\n    const timeFormat2 = memoize(locale2.format), utcFormat2 = memoize(locale2.utcFormat);\n    return {\n      timeFormat: (spec) => isString(spec) ? timeFormat2(spec) : timeMultiFormat(timeFormat2, timeInterval, spec),\n      utcFormat: (spec) => isString(spec) ? utcFormat2(spec) : timeMultiFormat(utcFormat2, utcInterval, spec),\n      timeParse: memoize(locale2.parse),\n      utcParse: memoize(locale2.utcParse)\n    };\n  }\n  let defaultTimeLocale;\n  resetTimeFormatDefaultLocale();\n  function resetTimeFormatDefaultLocale() {\n    return defaultTimeLocale = timeLocale({\n      format: timeFormat$1,\n      parse: timeParse$1,\n      utcFormat: utcFormat$1,\n      utcParse: utcParse$1\n    });\n  }\n  function timeFormatLocale(definition2) {\n    return timeLocale(formatLocale(definition2));\n  }\n  function timeFormatDefaultLocale(definition2) {\n    return arguments.length ? defaultTimeLocale = timeFormatLocale(definition2) : defaultTimeLocale;\n  }\n  const createLocale = (number2, time2) => extend$1({}, number2, time2);\n  function locale(numberSpec, timeSpec) {\n    const number2 = numberSpec ? numberFormatLocale(numberSpec) : numberFormatDefaultLocale();\n    const time2 = timeSpec ? timeFormatLocale(timeSpec) : timeFormatDefaultLocale();\n    return createLocale(number2, time2);\n  }\n  function defaultLocale(numberSpec, timeSpec) {\n    const args = arguments.length;\n    if (args && args !== 2) {\n      error(\"defaultLocale expects either zero or two arguments.\");\n    }\n    return args ? createLocale(numberFormatDefaultLocale(numberSpec), timeFormatDefaultLocale(timeSpec)) : createLocale(numberFormatDefaultLocale(), timeFormatDefaultLocale());\n  }\n  function resetDefaultLocale() {\n    resetNumberFormatDefaultLocale();\n    resetTimeFormatDefaultLocale();\n    return defaultLocale();\n  }\n  const protocol_re = /^(data:|([A-Za-z]+:)?\\/\\/)/;\n  const allowed_re = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp|file|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i;\n  const whitespace_re = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205f\\u3000]/g;\n  const fileProtocol = \"file://\";\n  function loaderFactory(fs) {\n    return (options) => ({\n      options: options || {},\n      sanitize,\n      load: load$1,\n      fileAccess: false,\n      file: fileLoader(),\n      http: httpLoader\n    });\n  }\n  async function load$1(uri, options) {\n    const opt = await this.sanitize(uri, options), url = opt.href;\n    return opt.localFile ? this.file(url) : this.http(url, options?.http);\n  }\n  async function sanitize(uri, options) {\n    options = extend$1({}, this.options, options);\n    const fileAccess = this.fileAccess, result = {\n      href: null\n    };\n    let isFile, loadFile, base2;\n    const isAllowed = allowed_re.test(uri.replace(whitespace_re, \"\"));\n    if (uri == null || typeof uri !== \"string\" || !isAllowed) {\n      error(\"Sanitize failure, invalid URI: \" + $(uri));\n    }\n    const hasProtocol = protocol_re.test(uri);\n    if ((base2 = options.baseURL) && !hasProtocol) {\n      if (!uri.startsWith(\"/\") && !base2.endsWith(\"/\")) {\n        uri = \"/\" + uri;\n      }\n      uri = base2 + uri;\n    }\n    loadFile = (isFile = uri.startsWith(fileProtocol)) || options.mode === \"file\" || options.mode !== \"http\" && !hasProtocol && fileAccess;\n    if (isFile) {\n      uri = uri.slice(fileProtocol.length);\n    } else if (uri.startsWith(\"//\")) {\n      if (options.defaultProtocol === \"file\") {\n        uri = uri.slice(2);\n        loadFile = true;\n      } else {\n        uri = (options.defaultProtocol || \"http\") + \":\" + uri;\n      }\n    }\n    Object.defineProperty(result, \"localFile\", {\n      value: !!loadFile\n    });\n    result.href = uri;\n    if (options.target) {\n      result.target = options.target + \"\";\n    }\n    if (options.rel) {\n      result.rel = options.rel + \"\";\n    }\n    if (options.context === \"image\" && options.crossOrigin) {\n      result.crossOrigin = options.crossOrigin + \"\";\n    }\n    return result;\n  }\n  function fileLoader(fs) {\n    return fileReject;\n  }\n  async function fileReject() {\n    error(\"No file system access.\");\n  }\n  async function httpLoader(url, options) {\n    const opt = extend$1({}, this.options.http, options), type2 = options && options.response, response = await fetch(url, opt);\n    return !response.ok ? error(response.status + \"\" + response.statusText) : isFunction(response[type2]) ? response[type2]() : response.text();\n  }\n  const isValid = (_) => _ != null && _ === _;\n  const isBoolean = (_) => _ === \"true\" || _ === \"false\" || _ === true || _ === false;\n  const isDate = (_) => !Number.isNaN(Date.parse(_));\n  const isNumber = (_) => !Number.isNaN(+_) && !(_ instanceof Date);\n  const isInteger = (_) => isNumber(_) && Number.isInteger(+_);\n  const typeParsers = {\n    boolean: toBoolean,\n    integer: toNumber,\n    number: toNumber,\n    date: toDate,\n    string: toString,\n    unknown: identity$7\n  };\n  const typeTests = [isBoolean, isInteger, isNumber, isDate];\n  const typeList = [\"boolean\", \"integer\", \"number\", \"date\"];\n  function inferType(values2, field2) {\n    if (!values2 || !values2.length) return \"unknown\";\n    const n = values2.length, m2 = typeTests.length, a2 = typeTests.map((_, i) => i + 1);\n    for (let i = 0, t = 0, j, value2; i < n; ++i) {\n      value2 = field2 ? values2[i][field2] : values2[i];\n      for (j = 0; j < m2; ++j) {\n        if (a2[j] && isValid(value2) && !typeTests[j](value2)) {\n          a2[j] = 0;\n          ++t;\n          if (t === typeTests.length) return \"string\";\n        }\n      }\n    }\n    return typeList[a2.reduce((u2, v) => u2 === 0 ? v : u2, 0) - 1];\n  }\n  function inferTypes(data2, fields) {\n    return fields.reduce((types, field2) => {\n      types[field2] = inferType(data2, field2);\n      return types;\n    }, {});\n  }\n  function delimitedFormat(delimiter) {\n    const parse2 = function(data2, format2) {\n      const delim = {\n        delimiter\n      };\n      return dsv(data2, format2 ? extend$1(format2, delim) : delim);\n    };\n    parse2.responseType = \"text\";\n    return parse2;\n  }\n  function dsv(data2, format2) {\n    if (format2.header) {\n      data2 = format2.header.map($).join(format2.delimiter) + \"\\n\" + data2;\n    }\n    return dsvFormat(format2.delimiter).parse(data2 + \"\");\n  }\n  dsv.responseType = \"text\";\n  function isBuffer(_) {\n    return typeof Buffer === \"function\" && isFunction(Buffer.isBuffer) ? Buffer.isBuffer(_) : false;\n  }\n  function json(data2, format2) {\n    const prop = format2 && format2.property ? field$1(format2.property) : identity$7;\n    return isObject$1(data2) && !isBuffer(data2) ? parseJSON(prop(data2), format2) : prop(JSON.parse(data2));\n  }\n  json.responseType = \"json\";\n  function parseJSON(data2, format2) {\n    if (!isArray(data2) && isIterable(data2)) {\n      data2 = [...data2];\n    }\n    return format2 && format2.copy ? JSON.parse(JSON.stringify(data2)) : data2;\n  }\n  const filters = {\n    interior: (a2, b2) => a2 !== b2,\n    exterior: (a2, b2) => a2 === b2\n  };\n  function topojson(data2, format2) {\n    let method2, object2, property2, filter2;\n    data2 = json(data2, format2);\n    if (format2 && format2.feature) {\n      method2 = feature;\n      property2 = format2.feature;\n    } else if (format2 && format2.mesh) {\n      method2 = mesh;\n      property2 = format2.mesh;\n      filter2 = filters[format2.filter];\n    } else {\n      error(\"Missing TopoJSON feature or mesh parameter.\");\n    }\n    object2 = (object2 = data2.objects[property2]) ? method2(data2, object2, filter2) : error(\"Invalid TopoJSON object: \" + property2);\n    return object2 && object2.features || [object2];\n  }\n  topojson.responseType = \"json\";\n  const format$2 = {\n    dsv,\n    csv: delimitedFormat(\",\"),\n    tsv: delimitedFormat(\"\t\"),\n    json,\n    topojson\n  };\n  function formats$1(name, reader) {\n    if (arguments.length > 1) {\n      format$2[name] = reader;\n      return this;\n    } else {\n      return has$1(format$2, name) ? format$2[name] : null;\n    }\n  }\n  function responseType(type2) {\n    const f = formats$1(type2);\n    return f && f.responseType || \"text\";\n  }\n  function read(data2, schema, timeParser, utcParser) {\n    schema = schema || {};\n    const reader = formats$1(schema.type || \"json\");\n    if (!reader) error(\"Unknown data format type: \" + schema.type);\n    data2 = reader(data2, schema);\n    if (schema.parse) parse$6(data2, schema.parse, timeParser, utcParser);\n    if (has$1(data2, \"columns\")) delete data2.columns;\n    return data2;\n  }\n  function parse$6(data2, types, timeParser, utcParser) {\n    if (!data2.length) return;\n    const locale2 = timeFormatDefaultLocale();\n    timeParser = timeParser || locale2.timeParse;\n    utcParser = utcParser || locale2.utcParse;\n    let fields = data2.columns || Object.keys(data2[0]), datum2, field2, i, j, n, m2;\n    if (types === \"auto\") types = inferTypes(data2, fields);\n    fields = Object.keys(types);\n    const parsers = fields.map((field3) => {\n      const type2 = types[field3];\n      let parts, pattern;\n      if (type2 && (type2.startsWith(\"date:\") || type2.startsWith(\"utc:\"))) {\n        parts = type2.split(/:(.+)?/, 2);\n        pattern = parts[1];\n        if (pattern[0] === \"'\" && pattern[pattern.length - 1] === \"'\" || pattern[0] === '\"' && pattern[pattern.length - 1] === '\"') {\n          pattern = pattern.slice(1, -1);\n        }\n        const parse2 = parts[0] === \"utc\" ? utcParser : timeParser;\n        return parse2(pattern);\n      }\n      if (!typeParsers[type2]) {\n        throw Error(\"Illegal format pattern: \" + field3 + \":\" + type2);\n      }\n      return typeParsers[type2];\n    });\n    for (i = 0, n = data2.length, m2 = fields.length; i < n; ++i) {\n      datum2 = data2[i];\n      for (j = 0; j < m2; ++j) {\n        field2 = fields[j];\n        datum2[field2] = parsers[j](datum2[field2]);\n      }\n    }\n  }\n  const loader = loaderFactory();\n  function UniqueList(idFunc) {\n    const $2 = idFunc || identity$7, list = [], ids = {};\n    list.add = (_) => {\n      const id2 = $2(_);\n      if (!ids[id2]) {\n        ids[id2] = 1;\n        list.push(_);\n      }\n      return list;\n    };\n    list.remove = (_) => {\n      const id2 = $2(_);\n      if (ids[id2]) {\n        ids[id2] = 0;\n        const idx = list.indexOf(_);\n        if (idx >= 0) list.splice(idx, 1);\n      }\n      return list;\n    };\n    return list;\n  }\n  async function asyncCallback(df, callback) {\n    try {\n      await callback(df);\n    } catch (err) {\n      df.error(err);\n    }\n  }\n  const TUPLE_ID_KEY = Symbol(\"vega_id\");\n  let TUPLE_ID = 1;\n  function isTuple(t) {\n    return !!(t && tupleid(t));\n  }\n  function tupleid(t) {\n    return t[TUPLE_ID_KEY];\n  }\n  function setid(t, id2) {\n    t[TUPLE_ID_KEY] = id2;\n    return t;\n  }\n  function ingest$1(datum2) {\n    const t = datum2 === Object(datum2) ? datum2 : {\n      data: datum2\n    };\n    return tupleid(t) ? t : setid(t, TUPLE_ID++);\n  }\n  function derive(t) {\n    return rederive(t, ingest$1({}));\n  }\n  function rederive(t, d) {\n    for (const k in t) d[k] = t[k];\n    return d;\n  }\n  function replace$1(t, d) {\n    return setid(d, tupleid(t));\n  }\n  function stableCompare(cmp, f) {\n    return !cmp ? null : f ? (a2, b2) => cmp(a2, b2) || tupleid(f(a2)) - tupleid(f(b2)) : (a2, b2) => cmp(a2, b2) || tupleid(a2) - tupleid(b2);\n  }\n  function isChangeSet(v) {\n    return v && v.constructor === changeset;\n  }\n  function changeset() {\n    const add2 = [], rem2 = [], mod = [], remp = [], modp = [];\n    let clean = null, reflow2 = false;\n    return {\n      constructor: changeset,\n      insert(t) {\n        const d = array$5(t), n = d.length;\n        for (let i = 0; i < n; ++i) add2.push(d[i]);\n        return this;\n      },\n      remove(t) {\n        const a2 = isFunction(t) ? remp : rem2, d = array$5(t), n = d.length;\n        for (let i = 0; i < n; ++i) a2.push(d[i]);\n        return this;\n      },\n      modify(t, field2, value2) {\n        const m2 = {\n          field: field2,\n          value: constant$5(value2)\n        };\n        if (isFunction(t)) {\n          m2.filter = t;\n          modp.push(m2);\n        } else {\n          m2.tuple = t;\n          mod.push(m2);\n        }\n        return this;\n      },\n      encode(t, set2) {\n        if (isFunction(t)) modp.push({\n          filter: t,\n          field: set2\n        });\n        else mod.push({\n          tuple: t,\n          field: set2\n        });\n        return this;\n      },\n      clean(value2) {\n        clean = value2;\n        return this;\n      },\n      reflow() {\n        reflow2 = true;\n        return this;\n      },\n      pulse(pulse2, tuples) {\n        const cur = {}, out = {};\n        let i, n, m2, f, t, id2;\n        for (i = 0, n = tuples.length; i < n; ++i) {\n          cur[tupleid(tuples[i])] = 1;\n        }\n        for (i = 0, n = rem2.length; i < n; ++i) {\n          t = rem2[i];\n          cur[tupleid(t)] = -1;\n        }\n        for (i = 0, n = remp.length; i < n; ++i) {\n          f = remp[i];\n          tuples.forEach((t4) => {\n            if (f(t4)) cur[tupleid(t4)] = -1;\n          });\n        }\n        for (i = 0, n = add2.length; i < n; ++i) {\n          t = add2[i];\n          id2 = tupleid(t);\n          if (cur[id2]) {\n            cur[id2] = 1;\n          } else {\n            pulse2.add.push(ingest$1(add2[i]));\n          }\n        }\n        for (i = 0, n = tuples.length; i < n; ++i) {\n          t = tuples[i];\n          if (cur[tupleid(t)] < 0) pulse2.rem.push(t);\n        }\n        function modify2(t4, f2, v) {\n          if (v) {\n            t4[f2] = v(t4);\n          } else {\n            pulse2.encode = f2;\n          }\n          if (!reflow2) out[tupleid(t4)] = t4;\n        }\n        for (i = 0, n = mod.length; i < n; ++i) {\n          m2 = mod[i];\n          t = m2.tuple;\n          f = m2.field;\n          id2 = cur[tupleid(t)];\n          if (id2 > 0) {\n            modify2(t, f, m2.value);\n            pulse2.modifies(f);\n          }\n        }\n        for (i = 0, n = modp.length; i < n; ++i) {\n          m2 = modp[i];\n          f = m2.filter;\n          tuples.forEach((t4) => {\n            if (f(t4) && cur[tupleid(t4)] > 0) {\n              modify2(t4, m2.field, m2.value);\n            }\n          });\n          pulse2.modifies(m2.field);\n        }\n        if (reflow2) {\n          pulse2.mod = rem2.length || remp.length ? tuples.filter((t4) => cur[tupleid(t4)] > 0) : tuples.slice();\n        } else {\n          for (id2 in out) pulse2.mod.push(out[id2]);\n        }\n        if (clean || clean == null && (rem2.length || remp.length)) {\n          pulse2.clean(true);\n        }\n        return pulse2;\n      }\n    };\n  }\n  const CACHE = \"_:mod:_\";\n  function Parameters() {\n    Object.defineProperty(this, CACHE, {\n      writable: true,\n      value: {}\n    });\n  }\n  Parameters.prototype = {\n    /**\n     * Set a parameter value. If the parameter value changes, the parameter\n     * will be recorded as modified.\n     * @param {string} name - The parameter name.\n     * @param {number} index - The index into an array-value parameter. Ignored if\n     *   the argument is undefined, null or less than zero.\n     * @param {*} value - The parameter value to set.\n     * @param {boolean} [force=false] - If true, records the parameter as modified\n     *   even if the value is unchanged.\n     * @return {Parameters} - This parameter object.\n     */\n    set(name, index2, value2, force2) {\n      const o = this, v = o[name], mod = o[CACHE];\n      if (index2 != null && index2 >= 0) {\n        if (v[index2] !== value2 || force2) {\n          v[index2] = value2;\n          mod[index2 + \":\" + name] = -1;\n          mod[name] = -1;\n        }\n      } else if (v !== value2 || force2) {\n        o[name] = value2;\n        mod[name] = isArray(value2) ? 1 + value2.length : -1;\n      }\n      return o;\n    },\n    /**\n     * Tests if one or more parameters has been modified. If invoked with no\n     * arguments, returns true if any parameter value has changed. If the first\n     * argument is array, returns trues if any parameter name in the array has\n     * changed. Otherwise, tests if the given name and optional array index has\n     * changed.\n     * @param {string} name - The parameter name to test.\n     * @param {number} [index=undefined] - The parameter array index to test.\n     * @return {boolean} - Returns true if a queried parameter was modified.\n     */\n    modified(name, index2) {\n      const mod = this[CACHE];\n      if (!arguments.length) {\n        for (const k in mod) {\n          if (mod[k]) return true;\n        }\n        return false;\n      } else if (isArray(name)) {\n        for (let k = 0; k < name.length; ++k) {\n          if (mod[name[k]]) return true;\n        }\n        return false;\n      }\n      return index2 != null && index2 >= 0 ? index2 + 1 < mod[name] || !!mod[index2 + \":\" + name] : !!mod[name];\n    },\n    /**\n     * Clears the modification records. After calling this method,\n     * all parameters are considered unmodified.\n     */\n    clear() {\n      this[CACHE] = {};\n      return this;\n    }\n  };\n  let OP_ID = 0;\n  const PULSE = \"pulse\", NO_PARAMS = new Parameters();\n  const SKIP$1$1 = 1, MODIFIED = 2;\n  function Operator(init2, update2, params2, react) {\n    this.id = ++OP_ID;\n    this.value = init2;\n    this.stamp = -1;\n    this.rank = -1;\n    this.qrank = -1;\n    this.flags = 0;\n    if (update2) {\n      this._update = update2;\n    }\n    if (params2) this.parameters(params2, react);\n  }\n  function flag(bit) {\n    return function(state) {\n      const f = this.flags;\n      if (arguments.length === 0) return !!(f & bit);\n      this.flags = state ? f | bit : f & ~bit;\n      return this;\n    };\n  }\n  Operator.prototype = {\n    /**\n     * Returns a list of target operators dependent on this operator.\n     * If this list does not exist, it is created and then returned.\n     * @return {UniqueList}\n     */\n    targets() {\n      return this._targets || (this._targets = UniqueList(id));\n    },\n    /**\n     * Sets the value of this operator.\n     * @param {*} value - the value to set.\n     * @return {Number} Returns 1 if the operator value has changed\n     *   according to strict equality, returns 0 otherwise.\n     */\n    set(value2) {\n      if (this.value !== value2) {\n        this.value = value2;\n        return 1;\n      } else {\n        return 0;\n      }\n    },\n    /**\n     * Indicates that operator evaluation should be skipped on the next pulse.\n     * This operator will still propagate incoming pulses, but its update function\n     * will not be invoked. The skip flag is reset after every pulse, so calling\n     * this method will affect processing of the next pulse only.\n     */\n    skip: flag(SKIP$1$1),\n    /**\n     * Indicates that this operator's value has been modified on its most recent\n     * pulse. Normally modification is checked via strict equality; however, in\n     * some cases it is more efficient to update the internal state of an object.\n     * In those cases, the modified flag can be used to trigger propagation. Once\n     * set, the modification flag persists across pulses until unset. The flag can\n     * be used with the last timestamp to test if a modification is recent.\n     */\n    modified: flag(MODIFIED),\n    /**\n     * Sets the parameters for this operator. The parameter values are analyzed for\n     * operator instances. If found, this operator will be added as a dependency\n     * of the parameterizing operator. Operator values are dynamically marshalled\n     * from each operator parameter prior to evaluation. If a parameter value is\n     * an array, the array will also be searched for Operator instances. However,\n     * the search does not recurse into sub-arrays or object properties.\n     * @param {object} params - A hash of operator parameters.\n     * @param {boolean} [react=true] - A flag indicating if this operator should\n     *   automatically update (react) when parameter values change. In other words,\n     *   this flag determines if the operator registers itself as a listener on\n     *   any upstream operators included in the parameters.\n     * @param {boolean} [initonly=false] - A flag indicating if this operator\n     *   should calculate an update only upon its initial evaluation, then\n     *   deregister dependencies and suppress all future update invocations.\n     * @return {Operator[]} - An array of upstream dependencies.\n     */\n    parameters(params2, react, initonly) {\n      react = react !== false;\n      const argval = this._argval = this._argval || new Parameters(), argops = this._argops = this._argops || [], deps = [];\n      let name, value2, n, i;\n      const add2 = (name2, index2, value3) => {\n        if (value3 instanceof Operator) {\n          if (value3 !== this) {\n            if (react) value3.targets().add(this);\n            deps.push(value3);\n          }\n          argops.push({\n            op: value3,\n            name: name2,\n            index: index2\n          });\n        } else {\n          argval.set(name2, index2, value3);\n        }\n      };\n      for (name in params2) {\n        value2 = params2[name];\n        if (name === PULSE) {\n          array$5(value2).forEach((op) => {\n            if (!(op instanceof Operator)) {\n              error(\"Pulse parameters must be operator instances.\");\n            } else if (op !== this) {\n              op.targets().add(this);\n              deps.push(op);\n            }\n          });\n          this.source = value2;\n        } else if (isArray(value2)) {\n          argval.set(name, -1, Array(n = value2.length));\n          for (i = 0; i < n; ++i) add2(name, i, value2[i]);\n        } else {\n          add2(name, -1, value2);\n        }\n      }\n      this.marshall().clear();\n      if (initonly) argops.initonly = true;\n      return deps;\n    },\n    /**\n     * Internal method for marshalling parameter values.\n     * Visits each operator dependency to pull the latest value.\n     * @return {Parameters} A Parameters object to pass to the update function.\n     */\n    marshall(stamp) {\n      const argval = this._argval || NO_PARAMS, argops = this._argops;\n      let item, i, op, mod;\n      if (argops) {\n        const n = argops.length;\n        for (i = 0; i < n; ++i) {\n          item = argops[i];\n          op = item.op;\n          mod = op.modified() && op.stamp === stamp;\n          argval.set(item.name, item.index, op.value, mod);\n        }\n        if (argops.initonly) {\n          for (i = 0; i < n; ++i) {\n            item = argops[i];\n            item.op.targets().remove(this);\n          }\n          this._argops = null;\n          this._update = null;\n        }\n      }\n      return argval;\n    },\n    /**\n     * Detach this operator from the dataflow.\n     * Unregisters listeners on upstream dependencies.\n     */\n    detach() {\n      const argops = this._argops;\n      let i, n, item, op;\n      if (argops) {\n        for (i = 0, n = argops.length; i < n; ++i) {\n          item = argops[i];\n          op = item.op;\n          if (op._targets) {\n            op._targets.remove(this);\n          }\n        }\n      }\n      this.pulse = null;\n      this.source = null;\n    },\n    /**\n     * Delegate method to perform operator processing.\n     * Subclasses can override this method to perform custom processing.\n     * By default, it marshalls parameters and calls the update function\n     * if that function is defined. If the update function does not\n     * change the operator value then StopPropagation is returned.\n     * If no update function is defined, this method does nothing.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return The output pulse or StopPropagation. A falsy return value\n     *   (including undefined) will let the input pulse pass through.\n     */\n    evaluate(pulse2) {\n      const update2 = this._update;\n      if (update2) {\n        const params2 = this.marshall(pulse2.stamp), v = update2.call(this, params2, pulse2);\n        params2.clear();\n        if (v !== this.value) {\n          this.value = v;\n        } else if (!this.modified()) {\n          return pulse2.StopPropagation;\n        }\n      }\n    },\n    /**\n     * Run this operator for the current pulse. If this operator has already\n     * been run at (or after) the pulse timestamp, returns StopPropagation.\n     * Internally, this method calls {@link evaluate} to perform processing.\n     * If {@link evaluate} returns a falsy value, the input pulse is returned.\n     * This method should NOT be overridden, instead overrride {@link evaluate}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return the output pulse for this operator (or StopPropagation)\n     */\n    run(pulse2) {\n      if (pulse2.stamp < this.stamp) return pulse2.StopPropagation;\n      let rv;\n      if (this.skip()) {\n        this.skip(false);\n        rv = 0;\n      } else {\n        rv = this.evaluate(pulse2);\n      }\n      return this.pulse = rv || pulse2;\n    }\n  };\n  function add$4(init2, update2, params2, react) {\n    let shift = 1, op;\n    if (init2 instanceof Operator) {\n      op = init2;\n    } else if (init2 && init2.prototype instanceof Operator) {\n      op = new init2();\n    } else if (isFunction(init2)) {\n      op = new Operator(null, init2);\n    } else {\n      shift = 0;\n      op = new Operator(init2, update2);\n    }\n    this.rank(op);\n    if (shift) {\n      react = params2;\n      params2 = update2;\n    }\n    if (params2) this.connect(op, op.parameters(params2, react));\n    this.touch(op);\n    return op;\n  }\n  function connect(target2, sources) {\n    const targetRank = target2.rank, n = sources.length;\n    for (let i = 0; i < n; ++i) {\n      if (targetRank < sources[i].rank) {\n        this.rerank(target2);\n        return;\n      }\n    }\n  }\n  let STREAM_ID = 0;\n  function EventStream(filter2, apply2, receive) {\n    this.id = ++STREAM_ID;\n    this.value = null;\n    if (receive) this.receive = receive;\n    if (filter2) this._filter = filter2;\n    if (apply2) this._apply = apply2;\n  }\n  function stream(filter2, apply2, receive) {\n    return new EventStream(filter2, apply2, receive);\n  }\n  EventStream.prototype = {\n    _filter: truthy,\n    _apply: identity$7,\n    targets() {\n      return this._targets || (this._targets = UniqueList(id));\n    },\n    consume(_) {\n      if (!arguments.length) return !!this._consume;\n      this._consume = !!_;\n      return this;\n    },\n    receive(evt) {\n      if (this._filter(evt)) {\n        const val = this.value = this._apply(evt), trg = this._targets, n = trg ? trg.length : 0;\n        for (let i = 0; i < n; ++i) trg[i].receive(val);\n        if (this._consume) {\n          evt.preventDefault();\n          evt.stopPropagation();\n        }\n      }\n    },\n    filter(filter2) {\n      const s = stream(filter2);\n      this.targets().add(s);\n      return s;\n    },\n    apply(apply2) {\n      const s = stream(null, apply2);\n      this.targets().add(s);\n      return s;\n    },\n    merge() {\n      const s = stream();\n      this.targets().add(s);\n      for (let i = 0, n = arguments.length; i < n; ++i) {\n        arguments[i].targets().add(s);\n      }\n      return s;\n    },\n    throttle(pause) {\n      let t = -1;\n      return this.filter(() => {\n        const now2 = Date.now();\n        if (now2 - t > pause) {\n          t = now2;\n          return 1;\n        } else {\n          return 0;\n        }\n      });\n    },\n    debounce(delay) {\n      const s = stream();\n      this.targets().add(stream(null, null, debounce(delay, (e) => {\n        const df = e.dataflow;\n        s.receive(e);\n        if (df && df.run) df.run();\n      })));\n      return s;\n    },\n    between(a2, b2) {\n      let active = false;\n      a2.targets().add(stream(null, null, () => active = true));\n      b2.targets().add(stream(null, null, () => active = false));\n      return this.filter(() => active);\n    },\n    detach() {\n      this._filter = truthy;\n      this._targets = null;\n    }\n  };\n  function events$1(source2, type2, filter2, apply2) {\n    const df = this, s = stream(filter2, apply2), send = function(e) {\n      e.dataflow = df;\n      try {\n        s.receive(e);\n      } catch (error2) {\n        df.error(error2);\n      } finally {\n        df.run();\n      }\n    };\n    let sources;\n    if (typeof source2 === \"string\" && typeof document !== \"undefined\") {\n      sources = document.querySelectorAll(source2);\n    } else {\n      sources = array$5(source2);\n    }\n    const n = sources.length;\n    for (let i = 0; i < n; ++i) {\n      sources[i].addEventListener(type2, send);\n    }\n    return s;\n  }\n  function parse$5(data2, format2) {\n    const locale2 = this.locale();\n    return read(data2, format2, locale2.timeParse, locale2.utcParse);\n  }\n  function ingest(target2, data2, format2) {\n    data2 = this.parse(data2, format2);\n    return this.pulse(target2, this.changeset().insert(data2));\n  }\n  async function request(url, format2) {\n    const df = this;\n    let status = 0, data2;\n    try {\n      data2 = await df.loader().load(url, {\n        context: \"dataflow\",\n        response: responseType(format2 && format2.type)\n      });\n      try {\n        data2 = df.parse(data2, format2);\n      } catch (err) {\n        status = -2;\n        df.warn(\"Data ingestion failed\", url, err);\n      }\n    } catch (err) {\n      status = -1;\n      df.warn(\"Loading failed\", url, err);\n    }\n    return {\n      data: data2,\n      status\n    };\n  }\n  async function preload(target2, url, format2) {\n    const df = this, pending = df._pending || loadPending(df);\n    pending.requests += 1;\n    const res = await df.request(url, format2);\n    df.pulse(target2, df.changeset().remove(truthy).insert(res.data || []));\n    pending.done();\n    return res;\n  }\n  function loadPending(df) {\n    let accept;\n    const pending = new Promise((a2) => accept = a2);\n    pending.requests = 0;\n    pending.done = () => {\n      if (--pending.requests === 0) {\n        df._pending = null;\n        accept(df);\n      }\n    };\n    return df._pending = pending;\n  }\n  const SKIP$2 = {\n    skip: true\n  };\n  function on(source2, target2, update2, params2, options) {\n    const fn = source2 instanceof Operator ? onOperator : onStream;\n    fn(this, source2, target2, update2, params2, options);\n    return this;\n  }\n  function onStream(df, stream2, target2, update2, params2, options) {\n    const opt = extend$1({}, options, SKIP$2);\n    let func, op;\n    if (!isFunction(target2)) target2 = constant$5(target2);\n    if (update2 === void 0) {\n      func = (e) => df.touch(target2(e));\n    } else if (isFunction(update2)) {\n      op = new Operator(null, update2, params2, false);\n      func = (e) => {\n        op.evaluate(e);\n        const t = target2(e), v = op.value;\n        isChangeSet(v) ? df.pulse(t, v, options) : df.update(t, v, opt);\n      };\n    } else {\n      func = (e) => df.update(target2(e), update2, opt);\n    }\n    stream2.apply(func);\n  }\n  function onOperator(df, source2, target2, update2, params2, options) {\n    if (update2 === void 0) {\n      source2.targets().add(target2);\n    } else {\n      const opt = options || {}, op = new Operator(null, updater(target2, update2), params2, false);\n      op.modified(opt.force);\n      op.rank = source2.rank;\n      source2.targets().add(op);\n      if (target2) {\n        op.skip(true);\n        op.value = target2.value;\n        op.targets().add(target2);\n        df.connect(target2, [op]);\n      }\n    }\n  }\n  function updater(target2, update2) {\n    update2 = isFunction(update2) ? update2 : constant$5(update2);\n    return target2 ? function(_, pulse2) {\n      const value2 = update2(_, pulse2);\n      if (!target2.skip()) {\n        target2.skip(value2 !== this.value).value = value2;\n      }\n      return value2;\n    } : update2;\n  }\n  function rank(op) {\n    op.rank = ++this._rank;\n  }\n  function rerank(op) {\n    const queue = [op];\n    let cur, list, i;\n    while (queue.length) {\n      this.rank(cur = queue.pop());\n      if (list = cur._targets) {\n        for (i = list.length; --i >= 0; ) {\n          queue.push(cur = list[i]);\n          if (cur === op) error(\"Cycle detected in dataflow graph.\");\n        }\n      }\n    }\n  }\n  const StopPropagation = {};\n  const ADD = 1 << 0, REM = 1 << 1, MOD$1 = 1 << 2, ADD_REM = ADD | REM, ADD_MOD = ADD | MOD$1, ALL = ADD | REM | MOD$1, REFLOW = 1 << 3, SOURCE = 1 << 4, NO_SOURCE = 1 << 5, NO_FIELDS = 1 << 6;\n  function Pulse(dataflow, stamp, encode2) {\n    this.dataflow = dataflow;\n    this.stamp = stamp == null ? -1 : stamp;\n    this.add = [];\n    this.rem = [];\n    this.mod = [];\n    this.fields = null;\n    this.encode = encode2 || null;\n  }\n  function materialize(data2, filter2) {\n    const out = [];\n    visitArray(data2, filter2, (_) => out.push(_));\n    return out;\n  }\n  function filter$1(pulse2, flags) {\n    const map2 = {};\n    pulse2.visit(flags, (t) => {\n      map2[tupleid(t)] = 1;\n    });\n    return (t) => map2[tupleid(t)] ? null : t;\n  }\n  function addFilter(a2, b2) {\n    return a2 ? (t, i) => a2(t, i) && b2(t, i) : b2;\n  }\n  Pulse.prototype = {\n    /**\n     * Sentinel value indicating pulse propagation should stop.\n     */\n    StopPropagation,\n    /**\n     * Boolean flag indicating ADD (added) tuples.\n     */\n    ADD,\n    /**\n     * Boolean flag indicating REM (removed) tuples.\n     */\n    REM,\n    /**\n     * Boolean flag indicating MOD (modified) tuples.\n     */\n    MOD: MOD$1,\n    /**\n     * Boolean flag indicating ADD (added) and REM (removed) tuples.\n     */\n    ADD_REM,\n    /**\n     * Boolean flag indicating ADD (added) and MOD (modified) tuples.\n     */\n    ADD_MOD,\n    /**\n     * Boolean flag indicating ADD, REM and MOD tuples.\n     */\n    ALL,\n    /**\n     * Boolean flag indicating all tuples in a data source\n     * except for the ADD, REM and MOD tuples.\n     */\n    REFLOW,\n    /**\n     * Boolean flag indicating a 'pass-through' to a\n     * backing data source, ignoring ADD, REM and MOD tuples.\n     */\n    SOURCE,\n    /**\n     * Boolean flag indicating that source data should be\n     * suppressed when creating a forked pulse.\n     */\n    NO_SOURCE,\n    /**\n     * Boolean flag indicating that field modifications should be\n     * suppressed when creating a forked pulse.\n     */\n    NO_FIELDS,\n    /**\n     * Creates a new pulse based on the values of this pulse.\n     * The dataflow, time stamp and field modification values are copied over.\n     * By default, new empty ADD, REM and MOD arrays are created.\n     * @param {number} flags - Integer of boolean flags indicating which (if any)\n     *   tuple arrays should be copied to the new pulse. The supported flag values\n     *   are ADD, REM and MOD. Array references are copied directly: new array\n     *   instances are not created.\n     * @return {Pulse} - The forked pulse instance.\n     * @see init\n     */\n    fork(flags) {\n      return new Pulse(this.dataflow).init(this, flags);\n    },\n    /**\n     * Creates a copy of this pulse with new materialized array\n     * instances for the ADD, REM, MOD, and SOURCE arrays.\n     * The dataflow, time stamp and field modification values are copied over.\n     * @return {Pulse} - The cloned pulse instance.\n     * @see init\n     */\n    clone() {\n      const p = this.fork(ALL);\n      p.add = p.add.slice();\n      p.rem = p.rem.slice();\n      p.mod = p.mod.slice();\n      if (p.source) p.source = p.source.slice();\n      return p.materialize(ALL | SOURCE);\n    },\n    /**\n     * Returns a pulse that adds all tuples from a backing source. This is\n     * useful for cases where operators are added to a dataflow after an\n     * upstream data pipeline has already been processed, ensuring that\n     * new operators can observe all tuples within a stream.\n     * @return {Pulse} - A pulse instance with all source tuples included\n     *   in the add array. If the current pulse already has all source\n     *   tuples in its add array, it is returned directly. If the current\n     *   pulse does not have a backing source, it is returned directly.\n     */\n    addAll() {\n      let p = this;\n      const reuse = !p.source || p.add === p.rem || !p.rem.length && p.source.length === p.add.length;\n      if (reuse) {\n        return p;\n      } else {\n        p = new Pulse(this.dataflow).init(this);\n        p.add = p.source;\n        p.rem = [];\n        return p;\n      }\n    },\n    /**\n     * Initialize this pulse based on the values of another pulse. This method\n     * is used internally by {@link fork} to initialize a new forked tuple.\n     * The dataflow, time stamp and field modification values are copied over.\n     * By default, new empty ADD, REM and MOD arrays are created.\n     * @param {Pulse} src - The source pulse to copy from.\n     * @param {number} flags - Integer of boolean flags indicating which (if any)\n     *   tuple arrays should be copied to the new pulse. The supported flag values\n     *   are ADD, REM and MOD. Array references are copied directly: new array\n     *   instances are not created. By default, source data arrays are copied\n     *   to the new pulse. Use the NO_SOURCE flag to enforce a null source.\n     * @return {Pulse} - Returns this Pulse instance.\n     */\n    init(src, flags) {\n      const p = this;\n      p.stamp = src.stamp;\n      p.encode = src.encode;\n      if (src.fields && !(flags & NO_FIELDS)) {\n        p.fields = src.fields;\n      }\n      if (flags & ADD) {\n        p.addF = src.addF;\n        p.add = src.add;\n      } else {\n        p.addF = null;\n        p.add = [];\n      }\n      if (flags & REM) {\n        p.remF = src.remF;\n        p.rem = src.rem;\n      } else {\n        p.remF = null;\n        p.rem = [];\n      }\n      if (flags & MOD$1) {\n        p.modF = src.modF;\n        p.mod = src.mod;\n      } else {\n        p.modF = null;\n        p.mod = [];\n      }\n      if (flags & NO_SOURCE) {\n        p.srcF = null;\n        p.source = null;\n      } else {\n        p.srcF = src.srcF;\n        p.source = src.source;\n        if (src.cleans) p.cleans = src.cleans;\n      }\n      return p;\n    },\n    /**\n     * Schedules a function to run after pulse propagation completes.\n     * @param {function} func - The function to run.\n     */\n    runAfter(func) {\n      this.dataflow.runAfter(func);\n    },\n    /**\n     * Indicates if tuples have been added, removed or modified.\n     * @param {number} [flags] - The tuple types (ADD, REM or MOD) to query.\n     *   Defaults to ALL, returning true if any tuple type has changed.\n     * @return {boolean} - Returns true if one or more queried tuple types have\n     *   changed, false otherwise.\n     */\n    changed(flags) {\n      const f = flags || ALL;\n      return f & ADD && this.add.length || f & REM && this.rem.length || f & MOD$1 && this.mod.length;\n    },\n    /**\n     * Forces a \"reflow\" of tuple values, such that all tuples in the backing\n     * source are added to the MOD set, unless already present in the ADD set.\n     * @param {boolean} [fork=false] - If true, returns a forked copy of this\n     *   pulse, and invokes reflow on that derived pulse.\n     * @return {Pulse} - The reflowed pulse instance.\n     */\n    reflow(fork) {\n      if (fork) return this.fork(ALL).reflow();\n      const len2 = this.add.length, src = this.source && this.source.length;\n      if (src && src !== len2) {\n        this.mod = this.source;\n        if (len2) this.filter(MOD$1, filter$1(this, ADD));\n      }\n      return this;\n    },\n    /**\n     * Get/set metadata to pulse requesting garbage collection\n     * to reclaim currently unused resources.\n     */\n    clean(value2) {\n      if (arguments.length) {\n        this.cleans = !!value2;\n        return this;\n      } else {\n        return this.cleans;\n      }\n    },\n    /**\n     * Marks one or more data field names as modified to assist dependency\n     * tracking and incremental processing by transform operators.\n     * @param {string|Array<string>} _ - The field(s) to mark as modified.\n     * @return {Pulse} - This pulse instance.\n     */\n    modifies(_) {\n      const hash = this.fields || (this.fields = {});\n      if (isArray(_)) {\n        _.forEach((f) => hash[f] = true);\n      } else {\n        hash[_] = true;\n      }\n      return this;\n    },\n    /**\n     * Checks if one or more data fields have been modified during this pulse\n     * propagation timestamp.\n     * @param {string|Array<string>} _ - The field(s) to check for modified.\n     * @param {boolean} nomod - If true, will check the modified flag even if\n     *   no mod tuples exist. If false (default), mod tuples must be present.\n     * @return {boolean} - Returns true if any of the provided fields has been\n     *   marked as modified, false otherwise.\n     */\n    modified(_, nomod) {\n      const fields = this.fields;\n      return !((nomod || this.mod.length) && fields) ? false : !arguments.length ? !!fields : isArray(_) ? _.some((f) => fields[f]) : fields[_];\n    },\n    /**\n     * Adds a filter function to one more tuple sets. Filters are applied to\n     * backing tuple arrays, to determine the actual set of tuples considered\n     * added, removed or modified. They can be used to delay materialization of\n     * a tuple set in order to avoid expensive array copies. In addition, the\n     * filter functions can serve as value transformers: unlike standard predicate\n     * function (which return boolean values), Pulse filters should return the\n     * actual tuple value to process. If a tuple set is already filtered, the\n     * new filter function will be appended into a conjuntive ('and') query.\n     * @param {number} flags - Flags indicating the tuple set(s) to filter.\n     * @param {function(*):object} filter - Filter function that will be applied\n     *   to the tuple set array, and should return a data tuple if the value\n     *   should be included in the tuple set, and falsy (or null) otherwise.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    filter(flags, filter2) {\n      const p = this;\n      if (flags & ADD) p.addF = addFilter(p.addF, filter2);\n      if (flags & REM) p.remF = addFilter(p.remF, filter2);\n      if (flags & MOD$1) p.modF = addFilter(p.modF, filter2);\n      if (flags & SOURCE) p.srcF = addFilter(p.srcF, filter2);\n      return p;\n    },\n    /**\n     * Materialize one or more tuple sets in this pulse. If the tuple set(s) have\n     * a registered filter function, it will be applied and the tuple set(s) will\n     * be replaced with materialized tuple arrays.\n     * @param {number} flags - Flags indicating the tuple set(s) to materialize.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    materialize(flags) {\n      flags = flags || ALL;\n      const p = this;\n      if (flags & ADD && p.addF) {\n        p.add = materialize(p.add, p.addF);\n        p.addF = null;\n      }\n      if (flags & REM && p.remF) {\n        p.rem = materialize(p.rem, p.remF);\n        p.remF = null;\n      }\n      if (flags & MOD$1 && p.modF) {\n        p.mod = materialize(p.mod, p.modF);\n        p.modF = null;\n      }\n      if (flags & SOURCE && p.srcF) {\n        p.source = p.source.filter(p.srcF);\n        p.srcF = null;\n      }\n      return p;\n    },\n    /**\n     * Visit one or more tuple sets in this pulse.\n     * @param {number} flags - Flags indicating the tuple set(s) to visit.\n     *   Legal values are ADD, REM, MOD and SOURCE (if a backing data source\n     *   has been set).\n     * @param {function(object):*} - Visitor function invoked per-tuple.\n     * @return {Pulse} - Returns this pulse instance.\n     */\n    visit(flags, visitor) {\n      const p = this, v = visitor;\n      if (flags & SOURCE) {\n        visitArray(p.source, p.srcF, v);\n        return p;\n      }\n      if (flags & ADD) visitArray(p.add, p.addF, v);\n      if (flags & REM) visitArray(p.rem, p.remF, v);\n      if (flags & MOD$1) visitArray(p.mod, p.modF, v);\n      const src = p.source;\n      if (flags & REFLOW && src) {\n        const sum2 = p.add.length + p.mod.length;\n        if (sum2 === src.length) ;\n        else if (sum2) {\n          visitArray(src, filter$1(p, ADD_MOD), v);\n        } else {\n          visitArray(src, p.srcF, v);\n        }\n      }\n      return p;\n    }\n  };\n  function MultiPulse(dataflow, stamp, pulses, encode2) {\n    const p = this;\n    let c2 = 0;\n    this.dataflow = dataflow;\n    this.stamp = stamp;\n    this.fields = null;\n    this.encode = encode2 || null;\n    this.pulses = pulses;\n    for (const pulse2 of pulses) {\n      if (pulse2.stamp !== stamp) continue;\n      if (pulse2.fields) {\n        const hash = p.fields || (p.fields = {});\n        for (const f in pulse2.fields) {\n          hash[f] = 1;\n        }\n      }\n      if (pulse2.changed(p.ADD)) c2 |= p.ADD;\n      if (pulse2.changed(p.REM)) c2 |= p.REM;\n      if (pulse2.changed(p.MOD)) c2 |= p.MOD;\n    }\n    this.changes = c2;\n  }\n  inherits(MultiPulse, Pulse, {\n    /**\n     * Creates a new pulse based on the values of this pulse.\n     * The dataflow, time stamp and field modification values are copied over.\n     * @return {Pulse}\n     */\n    fork(flags) {\n      const p = new Pulse(this.dataflow).init(this, flags & this.NO_FIELDS);\n      if (flags !== void 0) {\n        if (flags & p.ADD) this.visit(p.ADD, (t) => p.add.push(t));\n        if (flags & p.REM) this.visit(p.REM, (t) => p.rem.push(t));\n        if (flags & p.MOD) this.visit(p.MOD, (t) => p.mod.push(t));\n      }\n      return p;\n    },\n    changed(flags) {\n      return this.changes & flags;\n    },\n    modified(_) {\n      const p = this, fields = p.fields;\n      return !(fields && p.changes & p.MOD) ? 0 : isArray(_) ? _.some((f) => fields[f]) : fields[_];\n    },\n    filter() {\n      error(\"MultiPulse does not support filtering.\");\n    },\n    materialize() {\n      error(\"MultiPulse does not support materialization.\");\n    },\n    visit(flags, visitor) {\n      const p = this, pulses = p.pulses, n = pulses.length;\n      let i = 0;\n      if (flags & p.SOURCE) {\n        for (; i < n; ++i) {\n          pulses[i].visit(flags, visitor);\n        }\n      } else {\n        for (; i < n; ++i) {\n          if (pulses[i].stamp === p.stamp) {\n            pulses[i].visit(flags, visitor);\n          }\n        }\n      }\n      return p;\n    }\n  });\n  async function evaluate(encode2, prerun, postrun) {\n    const df = this, async = [];\n    if (df._pulse) return reentrant(df);\n    if (df._pending) await df._pending;\n    if (prerun) await asyncCallback(df, prerun);\n    if (!df._touched.length) {\n      df.debug(\"Dataflow invoked, but nothing to do.\");\n      return df;\n    }\n    const stamp = ++df._clock;\n    df._pulse = new Pulse(df, stamp, encode2);\n    df._touched.forEach((op2) => df._enqueue(op2, true));\n    df._touched = UniqueList(id);\n    let count2 = 0, op, next, error2;\n    try {\n      while (df._heap.size() > 0) {\n        op = df._heap.pop();\n        if (op.rank !== op.qrank) {\n          df._enqueue(op, true);\n          continue;\n        }\n        next = op.run(df._getPulse(op, encode2));\n        if (next.then) {\n          next = await next;\n        } else if (next.async) {\n          async.push(next.async);\n          next = StopPropagation;\n        }\n        if (next !== StopPropagation) {\n          if (op._targets) op._targets.forEach((op2) => df._enqueue(op2));\n        }\n        ++count2;\n      }\n    } catch (err) {\n      df._heap.clear();\n      error2 = err;\n    }\n    df._input = {};\n    df._pulse = null;\n    df.debug(`Pulse ${stamp}: ${count2} operators`);\n    if (error2) {\n      df._postrun = [];\n      df.error(error2);\n    }\n    if (df._postrun.length) {\n      const pr = df._postrun.sort((a2, b2) => b2.priority - a2.priority);\n      df._postrun = [];\n      for (let i = 0; i < pr.length; ++i) {\n        await asyncCallback(df, pr[i].callback);\n      }\n    }\n    if (postrun) await asyncCallback(df, postrun);\n    if (async.length) {\n      Promise.all(async).then((cb) => df.runAsync(null, () => {\n        cb.forEach((f) => {\n          try {\n            f(df);\n          } catch (err) {\n            df.error(err);\n          }\n        });\n      }));\n    }\n    return df;\n  }\n  async function runAsync(encode2, prerun, postrun) {\n    while (this._running) await this._running;\n    const clear = () => this._running = null;\n    (this._running = this.evaluate(encode2, prerun, postrun)).then(clear, clear);\n    return this._running;\n  }\n  function run(encode2, prerun, postrun) {\n    return this._pulse ? reentrant(this) : (this.evaluate(encode2, prerun, postrun), this);\n  }\n  function runAfter(callback, enqueue2, priority) {\n    if (this._pulse || enqueue2) {\n      this._postrun.push({\n        priority: priority || 0,\n        callback\n      });\n    } else {\n      try {\n        callback(this);\n      } catch (err) {\n        this.error(err);\n      }\n    }\n  }\n  function reentrant(df) {\n    df.error(\"Dataflow already running. Use runAsync() to chain invocations.\");\n    return df;\n  }\n  function enqueue(op, force2) {\n    const q = op.stamp < this._clock;\n    if (q) op.stamp = this._clock;\n    if (q || force2) {\n      op.qrank = op.rank;\n      this._heap.push(op);\n    }\n  }\n  function getPulse(op, encode2) {\n    const s = op.source, stamp = this._clock;\n    return s && isArray(s) ? new MultiPulse(this, stamp, s.map((_) => _.pulse), encode2) : this._input[op.id] || singlePulse(this._pulse, s && s.pulse);\n  }\n  function singlePulse(p, s) {\n    if (s && s.stamp === p.stamp) {\n      return s;\n    }\n    p = p.fork();\n    if (s && s !== StopPropagation) {\n      p.source = s.source;\n    }\n    return p;\n  }\n  const NO_OPT = {\n    skip: false,\n    force: false\n  };\n  function touch(op, options) {\n    const opt = options || NO_OPT;\n    if (this._pulse) {\n      this._enqueue(op);\n    } else {\n      this._touched.add(op);\n    }\n    if (opt.skip) op.skip(true);\n    return this;\n  }\n  function update$6(op, value2, options) {\n    const opt = options || NO_OPT;\n    if (op.set(value2) || opt.force) {\n      this.touch(op, opt);\n    }\n    return this;\n  }\n  function pulse(op, changeset2, options) {\n    this.touch(op, options || NO_OPT);\n    const p = new Pulse(this, this._clock + (this._pulse ? 0 : 1)), t = op.pulse && op.pulse.source || [];\n    p.target = op;\n    this._input[op.id] = changeset2.pulse(p, t);\n    return this;\n  }\n  function Heap(cmp) {\n    let nodes = [];\n    return {\n      clear: () => nodes = [],\n      size: () => nodes.length,\n      peek: () => nodes[0],\n      push: (x2) => {\n        nodes.push(x2);\n        return siftdown(nodes, 0, nodes.length - 1, cmp);\n      },\n      pop: () => {\n        const last = nodes.pop();\n        let item;\n        if (nodes.length) {\n          item = nodes[0];\n          nodes[0] = last;\n          siftup(nodes, 0, cmp);\n        } else {\n          item = last;\n        }\n        return item;\n      }\n    };\n  }\n  function siftdown(array2, start, idx, cmp) {\n    let parent, pidx;\n    const item = array2[idx];\n    while (idx > start) {\n      pidx = idx - 1 >> 1;\n      parent = array2[pidx];\n      if (cmp(item, parent) < 0) {\n        array2[idx] = parent;\n        idx = pidx;\n        continue;\n      }\n      break;\n    }\n    return array2[idx] = item;\n  }\n  function siftup(array2, idx, cmp) {\n    const start = idx, end = array2.length, item = array2[idx];\n    let cidx = (idx << 1) + 1, ridx;\n    while (cidx < end) {\n      ridx = cidx + 1;\n      if (ridx < end && cmp(array2[cidx], array2[ridx]) >= 0) {\n        cidx = ridx;\n      }\n      array2[idx] = array2[cidx];\n      idx = cidx;\n      cidx = (idx << 1) + 1;\n    }\n    array2[idx] = item;\n    return siftdown(array2, start, idx, cmp);\n  }\n  function Dataflow() {\n    this.logger(logger());\n    this.logLevel(Error$1);\n    this._clock = 0;\n    this._rank = 0;\n    this._locale = defaultLocale();\n    try {\n      this._loader = loader();\n    } catch (e) {\n    }\n    this._touched = UniqueList(id);\n    this._input = {};\n    this._pulse = null;\n    this._heap = Heap((a2, b2) => a2.qrank - b2.qrank);\n    this._postrun = [];\n  }\n  function logMethod(method2) {\n    return function() {\n      return this._log[method2].apply(this, arguments);\n    };\n  }\n  Dataflow.prototype = {\n    /**\n     * The current timestamp of this dataflow. This value reflects the\n     * timestamp of the previous dataflow run. The dataflow is initialized\n     * with a stamp value of 0. The initial run of the dataflow will have\n     * a timestap of 1, and so on. This value will match the\n     * {@link Pulse.stamp} property.\n     * @return {number} - The current timestamp value.\n     */\n    stamp() {\n      return this._clock;\n    },\n    /**\n     * Gets or sets the loader instance to use for data file loading. A\n     * loader object must provide a \"load\" method for loading files and a\n     * \"sanitize\" method for checking URL/filename validity. Both methods\n     * should accept a URI and options hash as arguments, and return a Promise\n     * that resolves to the loaded file contents (load) or a hash containing\n     * sanitized URI data with the sanitized url assigned to the \"href\" property\n     * (sanitize).\n     * @param {object} _ - The loader instance to use.\n     * @return {object|Dataflow} - If no arguments are provided, returns\n     *   the current loader instance. Otherwise returns this Dataflow instance.\n     */\n    loader(_) {\n      if (arguments.length) {\n        this._loader = _;\n        return this;\n      } else {\n        return this._loader;\n      }\n    },\n    /**\n     * Gets or sets the locale instance to use for formatting and parsing\n     * string values. The locale object should be provided by the\n     * vega-format library, and include methods such as format, timeFormat,\n     * utcFormat, timeParse, and utcParse.\n     * @param {object} _ - The locale instance to use.\n     * @return {object|Dataflow} - If no arguments are provided, returns\n     *   the current locale instance. Otherwise returns this Dataflow instance.\n     */\n    locale(_) {\n      if (arguments.length) {\n        this._locale = _;\n        return this;\n      } else {\n        return this._locale;\n      }\n    },\n    /**\n     * Get or set the logger instance used to log messages. If no arguments are\n     * provided, returns the current logger instance. Otherwise, sets the logger\n     * and return this Dataflow instance. Provided loggers must support the full\n     * API of logger objects generated by the vega-util logger method. Note that\n     * by default the log level of the new logger will be used; use the logLevel\n     * method to adjust the log level as needed.\n     */\n    logger(logger2) {\n      if (arguments.length) {\n        this._log = logger2;\n        return this;\n      } else {\n        return this._log;\n      }\n    },\n    /**\n     * Logs an error message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit error messages.\n     */\n    error: logMethod(\"error\"),\n    /**\n     * Logs a warning message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit warning messages.\n     */\n    warn: logMethod(\"warn\"),\n    /**\n     * Logs a information message. By default, logged messages are written to\n     * console output. The message will only be logged if the current log level is\n     * high enough to permit information messages.\n     */\n    info: logMethod(\"info\"),\n    /**\n     * Logs a debug message. By default, logged messages are written to console\n     * output. The message will only be logged if the current log level is high\n     * enough to permit debug messages.\n     */\n    debug: logMethod(\"debug\"),\n    /**\n     * Get or set the current log level. If an argument is provided, it\n     * will be used as the new log level.\n     * @param {number} [level] - Should be one of None, Warn, Info\n     * @return {number} - The current log level.\n     */\n    logLevel: logMethod(\"level\"),\n    /**\n     * Empty entry threshold for garbage cleaning. Map data structures will\n     * perform cleaning once the number of empty entries exceeds this value.\n     */\n    cleanThreshold: 1e4,\n    // OPERATOR REGISTRATION\n    add: add$4,\n    connect,\n    rank,\n    rerank,\n    // OPERATOR UPDATES\n    pulse,\n    touch,\n    update: update$6,\n    changeset,\n    // DATA LOADING\n    ingest,\n    parse: parse$5,\n    preload,\n    request,\n    // EVENT HANDLING\n    events: events$1,\n    on,\n    // PULSE PROPAGATION\n    evaluate,\n    run,\n    runAsync,\n    runAfter,\n    _enqueue: enqueue,\n    _getPulse: getPulse\n  };\n  function Transform(init2, params2) {\n    Operator.call(this, init2, null, params2);\n  }\n  inherits(Transform, Operator, {\n    /**\n     * Overrides {@link Operator.evaluate} for transform operators.\n     * Internally, this method calls {@link evaluate} to perform processing.\n     * If {@link evaluate} returns a falsy value, the input pulse is returned.\n     * This method should NOT be overridden, instead overrride {@link evaluate}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return the output pulse for this operator (or StopPropagation)\n     */\n    run(pulse2) {\n      if (pulse2.stamp < this.stamp) return pulse2.StopPropagation;\n      let rv;\n      if (this.skip()) {\n        this.skip(false);\n      } else {\n        rv = this.evaluate(pulse2);\n      }\n      rv = rv || pulse2;\n      if (rv.then) {\n        rv = rv.then((_) => this.pulse = _);\n      } else if (rv !== pulse2.StopPropagation) {\n        this.pulse = rv;\n      }\n      return rv;\n    },\n    /**\n     * Overrides {@link Operator.evaluate} for transform operators.\n     * Marshalls parameter values and then invokes {@link transform}.\n     * @param {Pulse} pulse - the current dataflow pulse.\n     * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n         value (including undefined) will let the input pulse pass through.\n    */\n    evaluate(pulse2) {\n      const params2 = this.marshall(pulse2.stamp), out = this.transform(params2, pulse2);\n      params2.clear();\n      return out;\n    },\n    /**\n     * Process incoming pulses.\n     * Subclasses should override this method to implement transforms.\n     * @param {Parameters} _ - The operator parameter values.\n     * @param {Pulse} pulse - The current dataflow pulse.\n     * @return {Pulse} The output pulse (or StopPropagation). A falsy return\n     *   value (including undefined) will let the input pulse pass through.\n     */\n    transform() {\n    }\n  });\n  const transforms = {};\n  function definition$1(type2) {\n    const t = transform$2(type2);\n    return t && t.Definition || null;\n  }\n  function transform$2(type2) {\n    type2 = type2 && type2.toLowerCase();\n    return has$1(transforms, type2) ? transforms[type2] : null;\n  }\n  function* numbers$1(values2, valueof) {\n    if (valueof == null) {\n      for (let value2 of values2) {\n        if (value2 != null && value2 !== \"\" && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    } else {\n      let index2 = -1;\n      for (let value2 of values2) {\n        value2 = valueof(value2, ++index2, values2);\n        if (value2 != null && value2 !== \"\" && (value2 = +value2) >= value2) {\n          yield value2;\n        }\n      }\n    }\n  }\n  function quantiles(array2, p, f) {\n    const values2 = Float64Array.from(numbers$1(array2, f));\n    values2.sort(ascending$1);\n    return p.map((_) => quantileSorted(values2, _));\n  }\n  function quartiles(array2, f) {\n    return quantiles(array2, [0.25, 0.5, 0.75], f);\n  }\n  function estimateBandwidth(array2, f) {\n    const n = array2.length, d = deviation(array2, f), q = quartiles(array2, f), h2 = (q[2] - q[0]) / 1.34, v = Math.min(d, h2) || d || Math.abs(q[0]) || 1;\n    return 1.06 * v * Math.pow(n, -0.2);\n  }\n  function bin(_) {\n    const maxb = _.maxbins || 20, base2 = _.base || 10, logb = Math.log(base2), div = _.divide || [5, 2];\n    let min2 = _.extent[0], max2 = _.extent[1], step, level, minstep, v, i, n;\n    const span2 = _.span || max2 - min2 || Math.abs(min2) || 1;\n    if (_.step) {\n      step = _.step;\n    } else if (_.steps) {\n      v = span2 / maxb;\n      for (i = 0, n = _.steps.length; i < n && _.steps[i] < v; ++i) ;\n      step = _.steps[Math.max(0, i - 1)];\n    } else {\n      level = Math.ceil(Math.log(maxb) / logb);\n      minstep = _.minstep || 0;\n      step = Math.max(minstep, Math.pow(base2, Math.round(Math.log(span2) / logb) - level));\n      while (Math.ceil(span2 / step) > maxb) {\n        step *= base2;\n      }\n      for (i = 0, n = div.length; i < n; ++i) {\n        v = step / div[i];\n        if (v >= minstep && span2 / v <= maxb) step = v;\n      }\n    }\n    v = Math.log(step);\n    const precision = v >= 0 ? 0 : ~~(-v / logb) + 1, eps = Math.pow(base2, -precision - 1);\n    if (_.nice || _.nice === void 0) {\n      v = Math.floor(min2 / step + eps) * step;\n      min2 = min2 < v ? v - step : v;\n      max2 = Math.ceil(max2 / step) * step;\n    }\n    return {\n      start: min2,\n      stop: max2 === min2 ? min2 + step : max2,\n      step\n    };\n  }\n  var random = Math.random;\n  function setRandom(r) {\n    random = r;\n  }\n  function bootstrapCI(array2, samples, alpha, f) {\n    if (!array2.length) return [void 0, void 0];\n    const values2 = Float64Array.from(numbers$1(array2, f)), n = values2.length, m2 = samples;\n    let a2, i, j, mu;\n    for (j = 0, mu = Array(m2); j < m2; ++j) {\n      for (a2 = 0, i = 0; i < n; ++i) {\n        a2 += values2[~~(random() * n)];\n      }\n      mu[j] = a2 / n;\n    }\n    mu.sort(ascending$1);\n    return [quantile$1(mu, alpha / 2), quantile$1(mu, 1 - alpha / 2)];\n  }\n  function dotbin(array2, step, smooth, f) {\n    f = f || ((_) => _);\n    const n = array2.length, v = new Float64Array(n);\n    let i = 0, j = 1, a2 = f(array2[0]), b2 = a2, w2 = a2 + step, x2;\n    for (; j < n; ++j) {\n      x2 = f(array2[j]);\n      if (x2 >= w2) {\n        b2 = (a2 + b2) / 2;\n        for (; i < j; ++i) v[i] = b2;\n        w2 = x2 + step;\n        a2 = x2;\n      }\n      b2 = x2;\n    }\n    b2 = (a2 + b2) / 2;\n    for (; i < j; ++i) v[i] = b2;\n    return smooth ? smoothing(v, step + step / 4) : v;\n  }\n  function smoothing(v, thresh) {\n    const n = v.length;\n    let a2 = 0, b2 = 1, c2, d;\n    while (v[a2] === v[b2]) ++b2;\n    while (b2 < n) {\n      c2 = b2 + 1;\n      while (v[b2] === v[c2]) ++c2;\n      if (v[b2] - v[b2 - 1] < thresh) {\n        d = b2 + (a2 + c2 - b2 - b2 >> 1);\n        while (d < b2) v[d++] = v[b2];\n        while (d > b2) v[d--] = v[a2];\n      }\n      a2 = b2;\n      b2 = c2;\n    }\n    return v;\n  }\n  function lcg$2(seed) {\n    return function() {\n      seed = (1103515245 * seed + 12345) % 2147483647;\n      return seed / 2147483647;\n    };\n  }\n  function integer(min2, max2) {\n    if (max2 == null) {\n      max2 = min2;\n      min2 = 0;\n    }\n    let a2, b2, d;\n    const dist2 = {\n      min(_) {\n        if (arguments.length) {\n          a2 = _ || 0;\n          d = b2 - a2;\n          return dist2;\n        } else {\n          return a2;\n        }\n      },\n      max(_) {\n        if (arguments.length) {\n          b2 = _ || 0;\n          d = b2 - a2;\n          return dist2;\n        } else {\n          return b2;\n        }\n      },\n      sample() {\n        return a2 + Math.floor(d * random());\n      },\n      pdf(x2) {\n        return x2 === Math.floor(x2) && x2 >= a2 && x2 < b2 ? 1 / d : 0;\n      },\n      cdf(x2) {\n        const v = Math.floor(x2);\n        return v < a2 ? 0 : v >= b2 ? 1 : (v - a2 + 1) / d;\n      },\n      icdf(p) {\n        return p >= 0 && p <= 1 ? a2 - 1 + Math.floor(p * d) : NaN;\n      }\n    };\n    return dist2.min(min2).max(max2);\n  }\n  const SQRT2PI = Math.sqrt(2 * Math.PI);\n  const SQRT2 = Math.SQRT2;\n  let nextSample = NaN;\n  function sampleNormal(mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    let x2 = 0, y2 = 0, rds, c2;\n    if (nextSample === nextSample) {\n      x2 = nextSample;\n      nextSample = NaN;\n    } else {\n      do {\n        x2 = random() * 2 - 1;\n        y2 = random() * 2 - 1;\n        rds = x2 * x2 + y2 * y2;\n      } while (rds === 0 || rds > 1);\n      c2 = Math.sqrt(-2 * Math.log(rds) / rds);\n      x2 *= c2;\n      nextSample = y2 * c2;\n    }\n    return mean2 + x2 * stdev;\n  }\n  function densityNormal(value2, mean2, stdev) {\n    stdev = stdev == null ? 1 : stdev;\n    const z = (value2 - (mean2 || 0)) / stdev;\n    return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI);\n  }\n  function cumulativeNormal(value2, mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z = (value2 - mean2) / stdev, Z = Math.abs(z);\n    let cd;\n    if (Z > 37) {\n      cd = 0;\n    } else {\n      const exp2 = Math.exp(-Z * Z / 2);\n      let sum2;\n      if (Z < 7.07106781186547) {\n        sum2 = 0.0352624965998911 * Z + 0.700383064443688;\n        sum2 = sum2 * Z + 6.37396220353165;\n        sum2 = sum2 * Z + 33.912866078383;\n        sum2 = sum2 * Z + 112.079291497871;\n        sum2 = sum2 * Z + 221.213596169931;\n        sum2 = sum2 * Z + 220.206867912376;\n        cd = exp2 * sum2;\n        sum2 = 0.0883883476483184 * Z + 1.75566716318264;\n        sum2 = sum2 * Z + 16.064177579207;\n        sum2 = sum2 * Z + 86.7807322029461;\n        sum2 = sum2 * Z + 296.564248779674;\n        sum2 = sum2 * Z + 637.333633378831;\n        sum2 = sum2 * Z + 793.826512519948;\n        sum2 = sum2 * Z + 440.413735824752;\n        cd = cd / sum2;\n      } else {\n        sum2 = Z + 0.65;\n        sum2 = Z + 4 / sum2;\n        sum2 = Z + 3 / sum2;\n        sum2 = Z + 2 / sum2;\n        sum2 = Z + 1 / sum2;\n        cd = exp2 / sum2 / 2.506628274631;\n      }\n    }\n    return z > 0 ? 1 - cd : cd;\n  }\n  function quantileNormal(p, mean2, stdev) {\n    if (p < 0 || p > 1) return NaN;\n    return (mean2 || 0) + (stdev == null ? 1 : stdev) * SQRT2 * erfinv(2 * p - 1);\n  }\n  function erfinv(x2) {\n    let w2 = -Math.log((1 - x2) * (1 + x2)), p;\n    if (w2 < 6.25) {\n      w2 -= 3.125;\n      p = -364441206401782e-35;\n      p = -16850591381820166e-35 + p * w2;\n      p = 128584807152564e-32 + p * w2;\n      p = 11157877678025181e-33 + p * w2;\n      p = -1333171662854621e-31 + p * w2;\n      p = 20972767875968562e-33 + p * w2;\n      p = 6637638134358324e-30 + p * w2;\n      p = -4054566272975207e-29 + p * w2;\n      p = -8151934197605472e-29 + p * w2;\n      p = 26335093153082323e-28 + p * w2;\n      p = -12975133253453532e-27 + p * w2;\n      p = -5415412054294628e-26 + p * w2;\n      p = 10512122733215323e-25 + p * w2;\n      p = -4112633980346984e-24 + p * w2;\n      p = -29070369957882005e-24 + p * w2;\n      p = 42347877827932404e-23 + p * w2;\n      p = -13654692000834679e-22 + p * w2;\n      p = -13882523362786469e-21 + p * w2;\n      p = 18673420803405714e-20 + p * w2;\n      p = -740702534166267e-18 + p * w2;\n      p = -0.006033670871430149 + p * w2;\n      p = 0.24015818242558962 + p * w2;\n      p = 1.6536545626831027 + p * w2;\n    } else if (w2 < 16) {\n      w2 = Math.sqrt(w2) - 3.25;\n      p = 22137376921775787e-25;\n      p = 9075656193888539e-23 + p * w2;\n      p = -27517406297064545e-23 + p * w2;\n      p = 18239629214389228e-24 + p * w2;\n      p = 15027403968909828e-22 + p * w2;\n      p = -4013867526981546e-21 + p * w2;\n      p = 29234449089955446e-22 + p * w2;\n      p = 12475304481671779e-21 + p * w2;\n      p = -47318229009055734e-21 + p * w2;\n      p = 6828485145957318e-20 + p * w2;\n      p = 24031110387097894e-21 + p * w2;\n      p = -3550375203628475e-19 + p * w2;\n      p = 9532893797373805e-19 + p * w2;\n      p = -0.0016882755560235047 + p * w2;\n      p = 0.002491442096107851 + p * w2;\n      p = -0.003751208507569241 + p * w2;\n      p = 0.005370914553590064 + p * w2;\n      p = 1.0052589676941592 + p * w2;\n      p = 3.0838856104922208 + p * w2;\n    } else if (Number.isFinite(w2)) {\n      w2 = Math.sqrt(w2) - 5;\n      p = -27109920616438573e-27;\n      p = -2555641816996525e-25 + p * w2;\n      p = 15076572693500548e-25 + p * w2;\n      p = -3789465440126737e-24 + p * w2;\n      p = 761570120807834e-23 + p * w2;\n      p = -1496002662714924e-23 + p * w2;\n      p = 2914795345090108e-23 + p * w2;\n      p = -6771199775845234e-23 + p * w2;\n      p = 22900482228026655e-23 + p * w2;\n      p = -99298272942317e-20 + p * w2;\n      p = 4526062597223154e-21 + p * w2;\n      p = -1968177810553167e-20 + p * w2;\n      p = 7599527703001776e-20 + p * w2;\n      p = -21503011930044477e-20 + p * w2;\n      p = -13871931833623122e-20 + p * w2;\n      p = 1.0103004648645344 + p * w2;\n      p = 4.849906401408584 + p * w2;\n    } else {\n      p = Infinity;\n    }\n    return p * x2;\n  }\n  function gaussian(mean2, stdev) {\n    let mu, sigma;\n    const dist2 = {\n      mean(_) {\n        if (arguments.length) {\n          mu = _ || 0;\n          return dist2;\n        } else {\n          return mu;\n        }\n      },\n      stdev(_) {\n        if (arguments.length) {\n          sigma = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return sigma;\n        }\n      },\n      sample: () => sampleNormal(mu, sigma),\n      pdf: (value2) => densityNormal(value2, mu, sigma),\n      cdf: (value2) => cumulativeNormal(value2, mu, sigma),\n      icdf: (p) => quantileNormal(p, mu, sigma)\n    };\n    return dist2.mean(mean2).stdev(stdev);\n  }\n  function kde(support, bandwidth2) {\n    const kernel = gaussian();\n    let n = 0;\n    const dist2 = {\n      data(_) {\n        if (arguments.length) {\n          support = _;\n          n = _ ? _.length : 0;\n          return dist2.bandwidth(bandwidth2);\n        } else {\n          return support;\n        }\n      },\n      bandwidth(_) {\n        if (!arguments.length) return bandwidth2;\n        bandwidth2 = _;\n        if (!bandwidth2 && support) bandwidth2 = estimateBandwidth(support);\n        return dist2;\n      },\n      sample() {\n        return support[~~(random() * n)] + bandwidth2 * kernel.sample();\n      },\n      pdf(x2) {\n        let y2 = 0, i = 0;\n        for (; i < n; ++i) {\n          y2 += kernel.pdf((x2 - support[i]) / bandwidth2);\n        }\n        return y2 / bandwidth2 / n;\n      },\n      cdf(x2) {\n        let y2 = 0, i = 0;\n        for (; i < n; ++i) {\n          y2 += kernel.cdf((x2 - support[i]) / bandwidth2);\n        }\n        return y2 / n;\n      },\n      icdf() {\n        throw Error(\"KDE icdf not supported.\");\n      }\n    };\n    return dist2.data(support);\n  }\n  function sampleLogNormal(mean2, stdev) {\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    return Math.exp(mean2 + sampleNormal() * stdev);\n  }\n  function densityLogNormal(value2, mean2, stdev) {\n    if (value2 <= 0) return 0;\n    mean2 = mean2 || 0;\n    stdev = stdev == null ? 1 : stdev;\n    const z = (Math.log(value2) - mean2) / stdev;\n    return Math.exp(-0.5 * z * z) / (stdev * SQRT2PI * value2);\n  }\n  function cumulativeLogNormal(value2, mean2, stdev) {\n    return cumulativeNormal(Math.log(value2), mean2, stdev);\n  }\n  function quantileLogNormal(p, mean2, stdev) {\n    return Math.exp(quantileNormal(p, mean2, stdev));\n  }\n  function lognormal(mean2, stdev) {\n    let mu, sigma;\n    const dist2 = {\n      mean(_) {\n        if (arguments.length) {\n          mu = _ || 0;\n          return dist2;\n        } else {\n          return mu;\n        }\n      },\n      stdev(_) {\n        if (arguments.length) {\n          sigma = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return sigma;\n        }\n      },\n      sample: () => sampleLogNormal(mu, sigma),\n      pdf: (value2) => densityLogNormal(value2, mu, sigma),\n      cdf: (value2) => cumulativeLogNormal(value2, mu, sigma),\n      icdf: (p) => quantileLogNormal(p, mu, sigma)\n    };\n    return dist2.mean(mean2).stdev(stdev);\n  }\n  function mixture$1(dists, weights) {\n    let m2 = 0, w2;\n    function normalize2(x2) {\n      const w3 = [];\n      let sum2 = 0, i;\n      for (i = 0; i < m2; ++i) {\n        sum2 += w3[i] = x2[i] == null ? 1 : +x2[i];\n      }\n      for (i = 0; i < m2; ++i) {\n        w3[i] /= sum2;\n      }\n      return w3;\n    }\n    const dist2 = {\n      weights(_) {\n        if (arguments.length) {\n          w2 = normalize2(weights = _ || []);\n          return dist2;\n        }\n        return weights;\n      },\n      distributions(_) {\n        if (arguments.length) {\n          if (_) {\n            m2 = _.length;\n            dists = _;\n          } else {\n            m2 = 0;\n            dists = [];\n          }\n          return dist2.weights(weights);\n        }\n        return dists;\n      },\n      sample() {\n        const r = random();\n        let d = dists[m2 - 1], v = w2[0], i = 0;\n        for (; i < m2 - 1; v += w2[++i]) {\n          if (r < v) {\n            d = dists[i];\n            break;\n          }\n        }\n        return d.sample();\n      },\n      pdf(x2) {\n        let p = 0, i = 0;\n        for (; i < m2; ++i) {\n          p += w2[i] * dists[i].pdf(x2);\n        }\n        return p;\n      },\n      cdf(x2) {\n        let p = 0, i = 0;\n        for (; i < m2; ++i) {\n          p += w2[i] * dists[i].cdf(x2);\n        }\n        return p;\n      },\n      icdf() {\n        throw Error(\"Mixture icdf not supported.\");\n      }\n    };\n    return dist2.distributions(dists).weights(weights);\n  }\n  function sampleUniform(min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return min2 + (max2 - min2) * random();\n  }\n  function densityUniform(value2, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return value2 >= min2 && value2 <= max2 ? 1 / (max2 - min2) : 0;\n  }\n  function cumulativeUniform(value2, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return value2 < min2 ? 0 : value2 > max2 ? 1 : (value2 - min2) / (max2 - min2);\n  }\n  function quantileUniform(p, min2, max2) {\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return p >= 0 && p <= 1 ? min2 + p * (max2 - min2) : NaN;\n  }\n  function uniform(min2, max2) {\n    let a2, b2;\n    const dist2 = {\n      min(_) {\n        if (arguments.length) {\n          a2 = _ || 0;\n          return dist2;\n        } else {\n          return a2;\n        }\n      },\n      max(_) {\n        if (arguments.length) {\n          b2 = _ == null ? 1 : _;\n          return dist2;\n        } else {\n          return b2;\n        }\n      },\n      sample: () => sampleUniform(a2, b2),\n      pdf: (value2) => densityUniform(value2, a2, b2),\n      cdf: (value2) => cumulativeUniform(value2, a2, b2),\n      icdf: (p) => quantileUniform(p, a2, b2)\n    };\n    if (max2 == null) {\n      max2 = min2 == null ? 1 : min2;\n      min2 = 0;\n    }\n    return dist2.min(min2).max(max2);\n  }\n  function constant$4(data2, x2, y2) {\n    let mean2 = 0, n = 0;\n    for (const d of data2) {\n      const val = y2(d);\n      if (x2(d) == null || val == null || isNaN(val)) continue;\n      mean2 += (val - mean2) / ++n;\n    }\n    return {\n      coef: [mean2],\n      predict: () => mean2,\n      rSquared: 0\n    };\n  }\n  function ols(uX, uY, uXY, uX2) {\n    const delta = uX2 - uX * uX, slope = Math.abs(delta) < 1e-24 ? 0 : (uXY - uX * uY) / delta, intercept = uY - slope * uX;\n    return [intercept, slope];\n  }\n  function points(data2, x2, y2, sort2) {\n    data2 = data2.filter((d2) => {\n      let u2 = x2(d2), v = y2(d2);\n      return u2 != null && (u2 = +u2) >= u2 && v != null && (v = +v) >= v;\n    });\n    if (sort2) {\n      data2.sort((a2, b2) => x2(a2) - x2(b2));\n    }\n    const n = data2.length, X3 = new Float64Array(n), Y3 = new Float64Array(n);\n    let i = 0, ux = 0, uy = 0, xv, yv, d;\n    for (d of data2) {\n      X3[i] = xv = +x2(d);\n      Y3[i] = yv = +y2(d);\n      ++i;\n      ux += (xv - ux) / i;\n      uy += (yv - uy) / i;\n    }\n    for (i = 0; i < n; ++i) {\n      X3[i] -= ux;\n      Y3[i] -= uy;\n    }\n    return [X3, Y3, ux, uy];\n  }\n  function visitPoints(data2, x2, y2, callback) {\n    let i = -1, u2, v;\n    for (const d of data2) {\n      u2 = x2(d);\n      v = y2(d);\n      if (u2 != null && (u2 = +u2) >= u2 && v != null && (v = +v) >= v) {\n        callback(u2, v, ++i);\n      }\n    }\n  }\n  function rSquared(data2, x2, y2, uY, predict) {\n    let SSE = 0, SST = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      const sse = dy - predict(dx), sst = dy - uY;\n      SSE += sse * sse;\n      SST += sst * sst;\n    });\n    return 1 - SSE / SST;\n  }\n  function linear$2(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      ++n;\n      X3 += (dx - X3) / n;\n      Y3 += (dy - Y3) / n;\n      XY += (dx * dy - XY) / n;\n      X22 += (dx * dx - X22) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] + coef[1] * x3;\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, Y3, predict)\n    };\n  }\n  function log$3(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      ++n;\n      dx = Math.log(dx);\n      X3 += (dx - X3) / n;\n      Y3 += (dy - Y3) / n;\n      XY += (dx * dy - XY) / n;\n      X22 += (dx * dx - X22) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] + coef[1] * Math.log(x3);\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, Y3, predict)\n    };\n  }\n  function exp$1(data2, x2, y2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2);\n    let YL = 0, XY = 0, XYL = 0, X2Y = 0, n = 0, dx, ly2, xy;\n    visitPoints(data2, x2, y2, (_, dy) => {\n      dx = xv[n++];\n      ly2 = Math.log(dy);\n      xy = dx * dy;\n      YL += (dy * ly2 - YL) / n;\n      XY += (xy - XY) / n;\n      XYL += (xy * ly2 - XYL) / n;\n      X2Y += (dx * xy - X2Y) / n;\n    });\n    const [c0, c1] = ols(XY / uy, YL / uy, XYL / uy, X2Y / uy), predict = (x3) => Math.exp(c0 + c1 * (x3 - ux));\n    return {\n      coef: [Math.exp(c0 - c1 * ux), c1],\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function pow$3(data2, x2, y2) {\n    let X3 = 0, Y3 = 0, XY = 0, X22 = 0, YS = 0, n = 0;\n    visitPoints(data2, x2, y2, (dx, dy) => {\n      const lx2 = Math.log(dx), ly2 = Math.log(dy);\n      ++n;\n      X3 += (lx2 - X3) / n;\n      Y3 += (ly2 - Y3) / n;\n      XY += (lx2 * ly2 - XY) / n;\n      X22 += (lx2 * lx2 - X22) / n;\n      YS += (dy - YS) / n;\n    });\n    const coef = ols(X3, Y3, XY, X22), predict = (x3) => coef[0] * Math.pow(x3, coef[1]);\n    coef[0] = Math.exp(coef[0]);\n    return {\n      coef,\n      predict,\n      rSquared: rSquared(data2, x2, y2, YS, predict)\n    };\n  }\n  function quad(data2, x2, y2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2), n = xv.length;\n    let X22 = 0, X3 = 0, X4 = 0, XY = 0, X2Y = 0, i, dx, dy, x22;\n    for (i = 0; i < n; ) {\n      dx = xv[i];\n      dy = yv[i++];\n      x22 = dx * dx;\n      X22 += (x22 - X22) / i;\n      X3 += (x22 * dx - X3) / i;\n      X4 += (x22 * x22 - X4) / i;\n      XY += (dx * dy - XY) / i;\n      X2Y += (x22 * dy - X2Y) / i;\n    }\n    const X2X2 = X4 - X22 * X22, d = X22 * X2X2 - X3 * X3, a2 = (X2Y * X22 - XY * X3) / d, b2 = (XY * X2X2 - X2Y * X3) / d, c2 = -a2 * X22, predict = (x3) => {\n      x3 = x3 - ux;\n      return a2 * x3 * x3 + b2 * x3 + c2 + uy;\n    };\n    return {\n      coef: [c2 - b2 * ux + a2 * ux * ux + uy, b2 - 2 * a2 * ux, a2],\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function poly(data2, x2, y2, order) {\n    if (order === 0) return constant$4(data2, x2, y2);\n    if (order === 1) return linear$2(data2, x2, y2);\n    if (order === 2) return quad(data2, x2, y2);\n    const [xv, yv, ux, uy] = points(data2, x2, y2), n = xv.length, lhs = [], rhs = [], k = order + 1;\n    let i, j, l, v, c2;\n    for (i = 0; i < k; ++i) {\n      for (l = 0, v = 0; l < n; ++l) {\n        v += Math.pow(xv[l], i) * yv[l];\n      }\n      lhs.push(v);\n      c2 = new Float64Array(k);\n      for (j = 0; j < k; ++j) {\n        for (l = 0, v = 0; l < n; ++l) {\n          v += Math.pow(xv[l], i + j);\n        }\n        c2[j] = v;\n      }\n      rhs.push(c2);\n    }\n    rhs.push(lhs);\n    const coef = gaussianElimination(rhs), predict = (x3) => {\n      x3 -= ux;\n      let y3 = uy + coef[0] + coef[1] * x3 + coef[2] * x3 * x3;\n      for (i = 3; i < k; ++i) y3 += coef[i] * Math.pow(x3, i);\n      return y3;\n    };\n    return {\n      coef: uncenter(k, coef, -ux, uy),\n      predict,\n      rSquared: rSquared(data2, x2, y2, uy, predict)\n    };\n  }\n  function uncenter(k, a2, x2, y2) {\n    const z = Array(k);\n    let i, j, v, c2;\n    for (i = 0; i < k; ++i) z[i] = 0;\n    for (i = k - 1; i >= 0; --i) {\n      v = a2[i];\n      c2 = 1;\n      z[i] += v;\n      for (j = 1; j <= i; ++j) {\n        c2 *= (i + 1 - j) / j;\n        z[i - j] += v * Math.pow(x2, j) * c2;\n      }\n    }\n    z[0] += y2;\n    return z;\n  }\n  function gaussianElimination(matrix) {\n    const n = matrix.length - 1, coef = [];\n    let i, j, k, r, t;\n    for (i = 0; i < n; ++i) {\n      r = i;\n      for (j = i + 1; j < n; ++j) {\n        if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][r])) {\n          r = j;\n        }\n      }\n      for (k = i; k < n + 1; ++k) {\n        t = matrix[k][i];\n        matrix[k][i] = matrix[k][r];\n        matrix[k][r] = t;\n      }\n      for (j = i + 1; j < n; ++j) {\n        for (k = n; k >= i; k--) {\n          matrix[k][j] -= matrix[k][i] * matrix[i][j] / matrix[i][i];\n        }\n      }\n    }\n    for (j = n - 1; j >= 0; --j) {\n      t = 0;\n      for (k = j + 1; k < n; ++k) {\n        t += matrix[k][j] * coef[k];\n      }\n      coef[j] = (matrix[n][j] - t) / matrix[j][j];\n    }\n    return coef;\n  }\n  const maxiters = 2, epsilon$6 = 1e-12;\n  function loess(data2, x2, y2, bandwidth2) {\n    const [xv, yv, ux, uy] = points(data2, x2, y2, true), n = xv.length, bw = Math.max(2, ~~(bandwidth2 * n)), yhat = new Float64Array(n), residuals = new Float64Array(n), robustWeights = new Float64Array(n).fill(1);\n    for (let iter = -1; ++iter <= maxiters; ) {\n      const interval2 = [0, bw - 1];\n      for (let i = 0; i < n; ++i) {\n        const dx = xv[i], i0 = interval2[0], i1 = interval2[1], edge = dx - xv[i0] > xv[i1] - dx ? i0 : i1;\n        let W = 0, X3 = 0, Y3 = 0, XY = 0, X22 = 0;\n        const denom = 1 / Math.abs(xv[edge] - dx || 1);\n        for (let k = i0; k <= i1; ++k) {\n          const xk = xv[k], yk = yv[k], w2 = tricube(Math.abs(dx - xk) * denom) * robustWeights[k], xkw = xk * w2;\n          W += w2;\n          X3 += xkw;\n          Y3 += yk * w2;\n          XY += yk * xkw;\n          X22 += xk * xkw;\n        }\n        const [a2, b2] = ols(X3 / W, Y3 / W, XY / W, X22 / W);\n        yhat[i] = a2 + b2 * dx;\n        residuals[i] = Math.abs(yv[i] - yhat[i]);\n        updateInterval(xv, i + 1, interval2);\n      }\n      if (iter === maxiters) {\n        break;\n      }\n      const medianResidual = median(residuals);\n      if (Math.abs(medianResidual) < epsilon$6) break;\n      for (let i = 0, arg, w2; i < n; ++i) {\n        arg = residuals[i] / (6 * medianResidual);\n        robustWeights[i] = arg >= 1 ? epsilon$6 : (w2 = 1 - arg * arg) * w2;\n      }\n    }\n    return output$1(xv, yhat, ux, uy);\n  }\n  function tricube(x2) {\n    return (x2 = 1 - x2 * x2 * x2) * x2 * x2;\n  }\n  function updateInterval(xv, i, interval2) {\n    const val = xv[i];\n    let left = interval2[0], right = interval2[1] + 1;\n    if (right >= xv.length) return;\n    while (i > left && xv[right] - val <= val - xv[left]) {\n      interval2[0] = ++left;\n      interval2[1] = right;\n      ++right;\n    }\n  }\n  function output$1(xv, yhat, ux, uy) {\n    const n = xv.length, out = [];\n    let i = 0, cnt = 0, prev = [], v;\n    for (; i < n; ++i) {\n      v = xv[i] + ux;\n      if (prev[0] === v) {\n        prev[1] += (yhat[i] - prev[1]) / ++cnt;\n      } else {\n        cnt = 0;\n        prev[1] += uy;\n        prev = [v, yhat[i]];\n        out.push(prev);\n      }\n    }\n    prev[1] += uy;\n    return out;\n  }\n  const MIN_RADIANS = 0.5 * Math.PI / 180;\n  function sampleCurve(f, extent2, minSteps, maxSteps) {\n    minSteps = minSteps || 25;\n    maxSteps = Math.max(minSteps, maxSteps || 200);\n    const point2 = (x2) => [x2, f(x2)], minX = extent2[0], maxX = extent2[1], span2 = maxX - minX, stop2 = span2 / maxSteps, prev = [point2(minX)], next = [];\n    if (minSteps === maxSteps) {\n      for (let i = 1; i < maxSteps; ++i) {\n        prev.push(point2(minX + i / minSteps * span2));\n      }\n      prev.push(point2(maxX));\n      return prev;\n    } else {\n      next.push(point2(maxX));\n      for (let i = minSteps; --i > 0; ) {\n        next.push(point2(minX + i / minSteps * span2));\n      }\n    }\n    let p02 = prev[0];\n    let p1 = next[next.length - 1];\n    const sx = 1 / span2;\n    const sy = scaleY(p02[1], next);\n    while (p1) {\n      const pm = point2((p02[0] + p1[0]) / 2);\n      const dx = pm[0] - p02[0] >= stop2;\n      if (dx && angleDelta(p02, pm, p1, sx, sy) > MIN_RADIANS) {\n        next.push(pm);\n      } else {\n        p02 = p1;\n        prev.push(p1);\n        next.pop();\n      }\n      p1 = next[next.length - 1];\n    }\n    return prev;\n  }\n  function scaleY(init2, points2) {\n    let ymin = init2;\n    let ymax = init2;\n    const n = points2.length;\n    for (let i = 0; i < n; ++i) {\n      const y2 = points2[i][1];\n      if (y2 < ymin) ymin = y2;\n      if (y2 > ymax) ymax = y2;\n    }\n    return 1 / (ymax - ymin);\n  }\n  function angleDelta(p, q, r, sx, sy) {\n    const a0 = Math.atan2(sy * (r[1] - p[1]), sx * (r[0] - p[0])), a1 = Math.atan2(sy * (q[1] - p[1]), sx * (q[0] - p[0]));\n    return Math.abs(a0 - a1);\n  }\n  function multikey(f) {\n    return (x2) => {\n      const n = f.length;\n      let i = 1, k = String(f[0](x2));\n      for (; i < n; ++i) {\n        k += \"|\" + f[i](x2);\n      }\n      return k;\n    };\n  }\n  function groupkey(fields) {\n    return !fields || !fields.length ? function() {\n      return \"\";\n    } : fields.length === 1 ? fields[0] : multikey(fields);\n  }\n  function measureName(op, field2, as) {\n    return as || op + (!field2 ? \"\" : \"_\" + field2);\n  }\n  const noop$4 = () => {\n  };\n  const base_op = {\n    init: noop$4,\n    add: noop$4,\n    rem: noop$4,\n    idx: 0\n  };\n  const AggregateOps = {\n    values: {\n      init: (m2) => m2.cell.store = true,\n      value: (m2) => m2.cell.data.values(),\n      idx: -1\n    },\n    count: {\n      value: (m2) => m2.cell.num\n    },\n    __count__: {\n      value: (m2) => m2.missing + m2.valid\n    },\n    missing: {\n      value: (m2) => m2.missing\n    },\n    valid: {\n      value: (m2) => m2.valid\n    },\n    sum: {\n      init: (m2) => m2.sum = 0,\n      value: (m2) => m2.valid ? m2.sum : void 0,\n      add: (m2, v) => m2.sum += +v,\n      rem: (m2, v) => m2.sum -= v\n    },\n    product: {\n      init: (m2) => m2.product = 1,\n      value: (m2) => m2.valid ? m2.product : void 0,\n      add: (m2, v) => m2.product *= v,\n      rem: (m2, v) => m2.product /= v\n    },\n    mean: {\n      init: (m2) => m2.mean = 0,\n      value: (m2) => m2.valid ? m2.mean : void 0,\n      add: (m2, v) => (m2.mean_d = v - m2.mean, m2.mean += m2.mean_d / m2.valid),\n      rem: (m2, v) => (m2.mean_d = v - m2.mean, m2.mean -= m2.valid ? m2.mean_d / m2.valid : m2.mean)\n    },\n    average: {\n      value: (m2) => m2.valid ? m2.mean : void 0,\n      req: [\"mean\"],\n      idx: 1\n    },\n    variance: {\n      init: (m2) => m2.dev = 0,\n      value: (m2) => m2.valid > 1 ? m2.dev / (m2.valid - 1) : void 0,\n      add: (m2, v) => m2.dev += m2.mean_d * (v - m2.mean),\n      rem: (m2, v) => m2.dev -= m2.mean_d * (v - m2.mean),\n      req: [\"mean\"],\n      idx: 1\n    },\n    variancep: {\n      value: (m2) => m2.valid > 1 ? m2.dev / m2.valid : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stdev: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / (m2.valid - 1)) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stdevp: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / m2.valid) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    stderr: {\n      value: (m2) => m2.valid > 1 ? Math.sqrt(m2.dev / (m2.valid * (m2.valid - 1))) : void 0,\n      req: [\"variance\"],\n      idx: 2\n    },\n    distinct: {\n      value: (m2) => m2.cell.data.distinct(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    ci0: {\n      value: (m2) => m2.cell.data.ci0(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    ci1: {\n      value: (m2) => m2.cell.data.ci1(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    median: {\n      value: (m2) => m2.cell.data.q2(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    q1: {\n      value: (m2) => m2.cell.data.q1(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    q3: {\n      value: (m2) => m2.cell.data.q3(m2.get),\n      req: [\"values\"],\n      idx: 3\n    },\n    min: {\n      init: (m2) => m2.min = void 0,\n      value: (m2) => m2.min = Number.isNaN(m2.min) ? m2.cell.data.min(m2.get) : m2.min,\n      add: (m2, v) => {\n        if (v < m2.min || m2.min === void 0) m2.min = v;\n      },\n      rem: (m2, v) => {\n        if (v <= m2.min) m2.min = NaN;\n      },\n      req: [\"values\"],\n      idx: 4\n    },\n    max: {\n      init: (m2) => m2.max = void 0,\n      value: (m2) => m2.max = Number.isNaN(m2.max) ? m2.cell.data.max(m2.get) : m2.max,\n      add: (m2, v) => {\n        if (v > m2.max || m2.max === void 0) m2.max = v;\n      },\n      rem: (m2, v) => {\n        if (v >= m2.max) m2.max = NaN;\n      },\n      req: [\"values\"],\n      idx: 4\n    },\n    argmin: {\n      init: (m2) => m2.argmin = void 0,\n      value: (m2) => m2.argmin || m2.cell.data.argmin(m2.get),\n      add: (m2, v, t) => {\n        if (v < m2.min) m2.argmin = t;\n      },\n      rem: (m2, v) => {\n        if (v <= m2.min) m2.argmin = void 0;\n      },\n      req: [\"min\", \"values\"],\n      idx: 3\n    },\n    argmax: {\n      init: (m2) => m2.argmax = void 0,\n      value: (m2) => m2.argmax || m2.cell.data.argmax(m2.get),\n      add: (m2, v, t) => {\n        if (v > m2.max) m2.argmax = t;\n      },\n      rem: (m2, v) => {\n        if (v >= m2.max) m2.argmax = void 0;\n      },\n      req: [\"max\", \"values\"],\n      idx: 3\n    },\n    exponential: {\n      init: (m2, r) => {\n        m2.exp = 0;\n        m2.exp_r = r;\n      },\n      value: (m2) => m2.valid ? m2.exp * (1 - m2.exp_r) / (1 - m2.exp_r ** m2.valid) : void 0,\n      add: (m2, v) => m2.exp = m2.exp_r * m2.exp + v,\n      rem: (m2, v) => m2.exp = (m2.exp - v / m2.exp_r ** (m2.valid - 1)) / m2.exp_r\n    },\n    exponentialb: {\n      value: (m2) => m2.valid ? m2.exp * (1 - m2.exp_r) : void 0,\n      req: [\"exponential\"],\n      idx: 1\n    }\n  };\n  const ValidAggregateOps = Object.keys(AggregateOps).filter((d) => d !== \"__count__\");\n  function measure(key2, value2) {\n    return (out, aggregate_param) => extend$1({\n      name: key2,\n      aggregate_param,\n      out: out || key2\n    }, base_op, value2);\n  }\n  [...ValidAggregateOps, \"__count__\"].forEach((key2) => {\n    AggregateOps[key2] = measure(key2, AggregateOps[key2]);\n  });\n  function createMeasure(op, param2, name) {\n    return AggregateOps[op](name, param2);\n  }\n  function compareIndex(a2, b2) {\n    return a2.idx - b2.idx;\n  }\n  function resolve(agg) {\n    const map2 = {};\n    agg.forEach((a2) => map2[a2.name] = a2);\n    const getreqs = (a2) => {\n      if (!a2.req) return;\n      a2.req.forEach((key2) => {\n        if (!map2[key2]) getreqs(map2[key2] = AggregateOps[key2]());\n      });\n    };\n    agg.forEach(getreqs);\n    return Object.values(map2).sort(compareIndex);\n  }\n  function init$1() {\n    this.valid = 0;\n    this.missing = 0;\n    this._ops.forEach((op) => op.aggregate_param == null ? op.init(this) : op.init(this, op.aggregate_param));\n  }\n  function add$3(v, t) {\n    if (v == null || v === \"\") {\n      ++this.missing;\n      return;\n    }\n    if (v !== v) return;\n    ++this.valid;\n    this._ops.forEach((op) => op.add(this, v, t));\n  }\n  function rem(v, t) {\n    if (v == null || v === \"\") {\n      --this.missing;\n      return;\n    }\n    if (v !== v) return;\n    --this.valid;\n    this._ops.forEach((op) => op.rem(this, v, t));\n  }\n  function set$7(t) {\n    this._out.forEach((op) => t[op.out] = op.value(this));\n    return t;\n  }\n  function compileMeasures(agg, field2) {\n    const get2 = field2 || identity$7, ops2 = resolve(agg), out = agg.slice().sort(compareIndex);\n    function ctr(cell2) {\n      this._ops = ops2;\n      this._out = out;\n      this.cell = cell2;\n      this.init();\n    }\n    ctr.prototype.init = init$1;\n    ctr.prototype.add = add$3;\n    ctr.prototype.rem = rem;\n    ctr.prototype.set = set$7;\n    ctr.prototype.get = get2;\n    ctr.fields = agg.map((op) => op.out);\n    return ctr;\n  }\n  function TupleStore(key2) {\n    this._key = key2 ? field$1(key2) : tupleid;\n    this.reset();\n  }\n  const prototype$1 = TupleStore.prototype;\n  prototype$1.reset = function() {\n    this._add = [];\n    this._rem = [];\n    this._ext = null;\n    this._get = null;\n    this._q = null;\n  };\n  prototype$1.add = function(v) {\n    this._add.push(v);\n  };\n  prototype$1.rem = function(v) {\n    this._rem.push(v);\n  };\n  prototype$1.values = function() {\n    this._get = null;\n    if (this._rem.length === 0) return this._add;\n    const a2 = this._add, r = this._rem, k = this._key, n = a2.length, m2 = r.length, x2 = Array(n - m2), map2 = {};\n    let i, j, v;\n    for (i = 0; i < m2; ++i) {\n      map2[k(r[i])] = 1;\n    }\n    for (i = 0, j = 0; i < n; ++i) {\n      if (map2[k(v = a2[i])]) {\n        map2[k(v)] = 0;\n      } else {\n        x2[j++] = v;\n      }\n    }\n    this._rem = [];\n    return this._add = x2;\n  };\n  prototype$1.distinct = function(get2) {\n    const v = this.values(), map2 = {};\n    let n = v.length, count2 = 0, s;\n    while (--n >= 0) {\n      s = get2(v[n]) + \"\";\n      if (!has$1(map2, s)) {\n        map2[s] = 1;\n        ++count2;\n      }\n    }\n    return count2;\n  };\n  prototype$1.extent = function(get2) {\n    if (this._get !== get2 || !this._ext) {\n      const v = this.values(), i = extentIndex(v, get2);\n      this._ext = [v[i[0]], v[i[1]]];\n      this._get = get2;\n    }\n    return this._ext;\n  };\n  prototype$1.argmin = function(get2) {\n    return this.extent(get2)[0] || {};\n  };\n  prototype$1.argmax = function(get2) {\n    return this.extent(get2)[1] || {};\n  };\n  prototype$1.min = function(get2) {\n    const m2 = this.extent(get2)[0];\n    return m2 != null ? get2(m2) : void 0;\n  };\n  prototype$1.max = function(get2) {\n    const m2 = this.extent(get2)[1];\n    return m2 != null ? get2(m2) : void 0;\n  };\n  prototype$1.quartile = function(get2) {\n    if (this._get !== get2 || !this._q) {\n      this._q = quartiles(this.values(), get2);\n      this._get = get2;\n    }\n    return this._q;\n  };\n  prototype$1.q1 = function(get2) {\n    return this.quartile(get2)[0];\n  };\n  prototype$1.q2 = function(get2) {\n    return this.quartile(get2)[1];\n  };\n  prototype$1.q3 = function(get2) {\n    return this.quartile(get2)[2];\n  };\n  prototype$1.ci = function(get2) {\n    if (this._get !== get2 || !this._ci) {\n      this._ci = bootstrapCI(this.values(), 1e3, 0.05, get2);\n      this._get = get2;\n    }\n    return this._ci;\n  };\n  prototype$1.ci0 = function(get2) {\n    return this.ci(get2)[0];\n  };\n  prototype$1.ci1 = function(get2) {\n    return this.ci(get2)[1];\n  };\n  function Aggregate$1(params2) {\n    Transform.call(this, null, params2);\n    this._adds = [];\n    this._mods = [];\n    this._alen = 0;\n    this._mlen = 0;\n    this._drop = true;\n    this._cross = false;\n    this._dims = [];\n    this._dnames = [];\n    this._measures = [];\n    this._countOnly = false;\n    this._counts = null;\n    this._prev = null;\n    this._inputs = null;\n    this._outputs = null;\n  }\n  Aggregate$1.Definition = {\n    \"type\": \"Aggregate\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidAggregateOps\n    }, {\n      \"name\": \"aggregate_params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"drop\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"cross\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(Aggregate$1, Transform, {\n    transform(_, pulse2) {\n      const aggr = this, out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), mod = _.modified();\n      aggr.stamp = out.stamp;\n      if (aggr.value && (mod || pulse2.modified(aggr._inputs, true))) {\n        aggr._prev = aggr.value;\n        aggr.value = mod ? aggr.init(_) : /* @__PURE__ */ Object.create(null);\n        pulse2.visit(pulse2.SOURCE, (t) => aggr.add(t));\n      } else {\n        aggr.value = aggr.value || aggr.init(_);\n        pulse2.visit(pulse2.REM, (t) => aggr.rem(t));\n        pulse2.visit(pulse2.ADD, (t) => aggr.add(t));\n      }\n      out.modifies(aggr._outputs);\n      aggr._drop = _.drop !== false;\n      if (_.cross && aggr._dims.length > 1) {\n        aggr._drop = false;\n        aggr.cross();\n      }\n      if (pulse2.clean() && aggr._drop) {\n        out.clean(true).runAfter(() => this.clean());\n      }\n      return aggr.changes(out);\n    },\n    cross() {\n      const aggr = this, curr = aggr.value, dims = aggr._dnames, vals = dims.map(() => ({})), n = dims.length;\n      function collect2(cells) {\n        let key2, i, t, v;\n        for (key2 in cells) {\n          t = cells[key2].tuple;\n          for (i = 0; i < n; ++i) {\n            vals[i][v = t[dims[i]]] = v;\n          }\n        }\n      }\n      collect2(aggr._prev);\n      collect2(curr);\n      function generate2(base2, tuple, index2) {\n        const name = dims[index2], v = vals[index2++];\n        for (const k in v) {\n          const key2 = base2 ? base2 + \"|\" + k : k;\n          tuple[name] = v[k];\n          if (index2 < n) generate2(key2, tuple, index2);\n          else if (!curr[key2]) aggr.cell(key2, tuple);\n        }\n      }\n      generate2(\"\", {}, 0);\n    },\n    init(_) {\n      const inputs = this._inputs = [], outputs = this._outputs = [], inputMap = {};\n      function inputVisit(get2) {\n        const fields2 = array$5(accessorFields(get2)), n2 = fields2.length;\n        let i2 = 0, f;\n        for (; i2 < n2; ++i2) {\n          if (!inputMap[f = fields2[i2]]) {\n            inputMap[f] = 1;\n            inputs.push(f);\n          }\n        }\n      }\n      this._dims = array$5(_.groupby);\n      this._dnames = this._dims.map((d) => {\n        const dname = accessorName(d);\n        inputVisit(d);\n        outputs.push(dname);\n        return dname;\n      });\n      this.cellkey = _.key ? _.key : groupkey(this._dims);\n      this._countOnly = true;\n      this._counts = [];\n      this._measures = [];\n      const fields = _.fields || [null], ops2 = _.ops || [\"count\"], aggregate_params = _.aggregate_params || [null], as = _.as || [], n = fields.length, map2 = {};\n      let field2, op, aggregate_param, m2, mname, outname, i;\n      if (n !== ops2.length) {\n        error(\"Unmatched number of fields and aggregate ops.\");\n      }\n      for (i = 0; i < n; ++i) {\n        field2 = fields[i];\n        op = ops2[i];\n        aggregate_param = aggregate_params[i] || null;\n        if (field2 == null && op !== \"count\") {\n          error(\"Null aggregate field specified.\");\n        }\n        mname = accessorName(field2);\n        outname = measureName(op, mname, as[i]);\n        outputs.push(outname);\n        if (op === \"count\") {\n          this._counts.push(outname);\n          continue;\n        }\n        m2 = map2[mname];\n        if (!m2) {\n          inputVisit(field2);\n          m2 = map2[mname] = [];\n          m2.field = field2;\n          this._measures.push(m2);\n        }\n        if (op !== \"count\") this._countOnly = false;\n        m2.push(createMeasure(op, aggregate_param, outname));\n      }\n      this._measures = this._measures.map((m3) => compileMeasures(m3, m3.field));\n      return /* @__PURE__ */ Object.create(null);\n    },\n    // -- Cell Management -----\n    cellkey: groupkey(),\n    cell(key2, t) {\n      let cell2 = this.value[key2];\n      if (!cell2) {\n        cell2 = this.value[key2] = this.newcell(key2, t);\n        this._adds[this._alen++] = cell2;\n      } else if (cell2.num === 0 && this._drop && cell2.stamp < this.stamp) {\n        cell2.stamp = this.stamp;\n        this._adds[this._alen++] = cell2;\n      } else if (cell2.stamp < this.stamp) {\n        cell2.stamp = this.stamp;\n        this._mods[this._mlen++] = cell2;\n      }\n      return cell2;\n    },\n    newcell(key2, t) {\n      const cell2 = {\n        key: key2,\n        num: 0,\n        agg: null,\n        tuple: this.newtuple(t, this._prev && this._prev[key2]),\n        stamp: this.stamp,\n        store: false\n      };\n      if (!this._countOnly) {\n        const measures = this._measures, n = measures.length;\n        cell2.agg = Array(n);\n        for (let i = 0; i < n; ++i) {\n          cell2.agg[i] = new measures[i](cell2);\n        }\n      }\n      if (cell2.store) {\n        cell2.data = new TupleStore();\n      }\n      return cell2;\n    },\n    newtuple(t, p) {\n      const names = this._dnames, dims = this._dims, n = dims.length, x2 = {};\n      for (let i = 0; i < n; ++i) {\n        x2[names[i]] = dims[i](t);\n      }\n      return p ? replace$1(p.tuple, x2) : ingest$1(x2);\n    },\n    clean() {\n      const cells = this.value;\n      for (const key2 in cells) {\n        if (cells[key2].num === 0) {\n          delete cells[key2];\n        }\n      }\n    },\n    // -- Process Tuples -----\n    add(t) {\n      const key2 = this.cellkey(t), cell2 = this.cell(key2, t);\n      cell2.num += 1;\n      if (this._countOnly) return;\n      if (cell2.store) cell2.data.add(t);\n      const agg = cell2.agg;\n      for (let i = 0, n = agg.length; i < n; ++i) {\n        agg[i].add(agg[i].get(t), t);\n      }\n    },\n    rem(t) {\n      const key2 = this.cellkey(t), cell2 = this.cell(key2, t);\n      cell2.num -= 1;\n      if (this._countOnly) return;\n      if (cell2.store) cell2.data.rem(t);\n      const agg = cell2.agg;\n      for (let i = 0, n = agg.length; i < n; ++i) {\n        agg[i].rem(agg[i].get(t), t);\n      }\n    },\n    celltuple(cell2) {\n      const tuple = cell2.tuple, counts = this._counts;\n      if (cell2.store) {\n        cell2.data.values();\n      }\n      for (let i = 0, n = counts.length; i < n; ++i) {\n        tuple[counts[i]] = cell2.num;\n      }\n      if (!this._countOnly) {\n        const agg = cell2.agg;\n        for (let i = 0, n = agg.length; i < n; ++i) {\n          agg[i].set(tuple);\n        }\n      }\n      return tuple;\n    },\n    changes(out) {\n      const adds = this._adds, mods = this._mods, prev = this._prev, drop = this._drop, add2 = out.add, rem2 = out.rem, mod = out.mod;\n      let cell2, key2, i, n;\n      if (prev) for (key2 in prev) {\n        cell2 = prev[key2];\n        if (!drop || cell2.num) rem2.push(cell2.tuple);\n      }\n      for (i = 0, n = this._alen; i < n; ++i) {\n        add2.push(this.celltuple(adds[i]));\n        adds[i] = null;\n      }\n      for (i = 0, n = this._mlen; i < n; ++i) {\n        cell2 = mods[i];\n        (cell2.num === 0 && drop ? rem2 : mod).push(this.celltuple(cell2));\n        mods[i] = null;\n      }\n      this._alen = this._mlen = 0;\n      this._prev = null;\n      return out;\n    }\n  });\n  const EPSILON$1$1 = 1e-14;\n  function Bin(params2) {\n    Transform.call(this, null, params2);\n  }\n  Bin.Definition = {\n    \"type\": \"Bin\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"interval\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"anchor\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"maxbins\",\n      \"type\": \"number\",\n      \"default\": 20\n    }, {\n      \"name\": \"base\",\n      \"type\": \"number\",\n      \"default\": 10\n    }, {\n      \"name\": \"divide\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"default\": [5, 2]\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"span\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"minstep\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"name\",\n      \"type\": \"string\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"bin0\", \"bin1\"]\n    }]\n  };\n  inherits(Bin, Transform, {\n    transform(_, pulse2) {\n      const band2 = _.interval !== false, bins = this._bins(_), start = bins.start, step = bins.step, as = _.as || [\"bin0\", \"bin1\"], b0 = as[0], b1 = as[1];\n      let flag2;\n      if (_.modified()) {\n        pulse2 = pulse2.reflow(true);\n        flag2 = pulse2.SOURCE;\n      } else {\n        flag2 = pulse2.modified(accessorFields(_.field)) ? pulse2.ADD_MOD : pulse2.ADD;\n      }\n      pulse2.visit(flag2, band2 ? (t) => {\n        const v = bins(t);\n        t[b0] = v;\n        t[b1] = v == null ? null : start + step * (1 + (v - start) / step);\n      } : (t) => t[b0] = bins(t));\n      return pulse2.modifies(band2 ? as : b0);\n    },\n    _bins(_) {\n      if (this.value && !_.modified()) {\n        return this.value;\n      }\n      const field2 = _.field, bins = bin(_), step = bins.step;\n      let start = bins.start, stop2 = start + Math.ceil((bins.stop - start) / step) * step, a2, d;\n      if ((a2 = _.anchor) != null) {\n        d = a2 - (start + step * Math.floor((a2 - start) / step));\n        start += d;\n        stop2 += d;\n      }\n      const f = function(t) {\n        let v = toNumber(field2(t));\n        return v == null ? null : v < start ? -Infinity : v > stop2 ? Infinity : (v = Math.max(start, Math.min(v, stop2 - step)), start + step * Math.floor(EPSILON$1$1 + (v - start) / step));\n      };\n      f.start = start;\n      f.stop = bins.stop;\n      f.step = step;\n      return this.value = accessor(f, accessorFields(field2), _.name || \"bin_\" + accessorName(field2));\n    }\n  });\n  function SortedList(idFunc, source2, input) {\n    const $2 = idFunc;\n    let data2 = source2 || [], add2 = input || [], rem2 = {}, cnt = 0;\n    return {\n      add: (t) => add2.push(t),\n      remove: (t) => rem2[$2(t)] = ++cnt,\n      size: () => data2.length,\n      data: (compare2, resort) => {\n        if (cnt) {\n          data2 = data2.filter((t) => !rem2[$2(t)]);\n          rem2 = {};\n          cnt = 0;\n        }\n        if (resort && compare2) {\n          data2.sort(compare2);\n        }\n        if (add2.length) {\n          data2 = compare2 ? merge$3(compare2, data2, add2.sort(compare2)) : data2.concat(add2);\n          add2 = [];\n        }\n        return data2;\n      }\n    };\n  }\n  function Collect$1(params2) {\n    Transform.call(this, [], params2);\n  }\n  Collect$1.Definition = {\n    \"type\": \"Collect\",\n    \"metadata\": {\n      \"source\": true\n    },\n    \"params\": [{\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }]\n  };\n  inherits(Collect$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.ALL), list = SortedList(tupleid, this.value, out.materialize(out.ADD).add), sort2 = _.sort, mod = pulse2.changed() || sort2 && (_.modified(\"sort\") || pulse2.modified(sort2.fields));\n      out.visit(out.REM, list.remove);\n      this.modified(mod);\n      this.value = out.source = list.data(stableCompare(sort2), mod);\n      if (pulse2.source && pulse2.source.root) {\n        this.value.root = pulse2.source.root;\n      }\n      return out;\n    }\n  });\n  function Compare$1(params2) {\n    Operator.call(this, null, update$5, params2);\n  }\n  inherits(Compare$1, Operator);\n  function update$5(_) {\n    return this.value && !_.modified() ? this.value : compare$1(_.fields, _.orders);\n  }\n  function CountPattern(params2) {\n    Transform.call(this, null, params2);\n  }\n  CountPattern.Definition = {\n    \"type\": \"CountPattern\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"case\",\n      \"type\": \"enum\",\n      \"values\": [\"upper\", \"lower\", \"mixed\"],\n      \"default\": \"mixed\"\n    }, {\n      \"name\": \"pattern\",\n      \"type\": \"string\",\n      \"default\": '[\\\\w\"]+'\n    }, {\n      \"name\": \"stopwords\",\n      \"type\": \"string\",\n      \"default\": \"\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"text\", \"count\"]\n    }]\n  };\n  function tokenize(text2, tcase, match2) {\n    switch (tcase) {\n      case \"upper\":\n        text2 = text2.toUpperCase();\n        break;\n      case \"lower\":\n        text2 = text2.toLowerCase();\n        break;\n    }\n    return text2.match(match2);\n  }\n  inherits(CountPattern, Transform, {\n    transform(_, pulse2) {\n      const process = (update2) => (tuple) => {\n        var tokens = tokenize(get2(tuple), _.case, match2) || [], t;\n        for (var i = 0, n = tokens.length; i < n; ++i) {\n          if (!stop2.test(t = tokens[i])) update2(t);\n        }\n      };\n      const init2 = this._parameterCheck(_, pulse2), counts = this._counts, match2 = this._match, stop2 = this._stop, get2 = _.field, as = _.as || [\"text\", \"count\"], add2 = process((t) => counts[t] = 1 + (counts[t] || 0)), rem2 = process((t) => counts[t] -= 1);\n      if (init2) {\n        pulse2.visit(pulse2.SOURCE, add2);\n      } else {\n        pulse2.visit(pulse2.ADD, add2);\n        pulse2.visit(pulse2.REM, rem2);\n      }\n      return this._finish(pulse2, as);\n    },\n    _parameterCheck(_, pulse2) {\n      let init2 = false;\n      if (_.modified(\"stopwords\") || !this._stop) {\n        this._stop = new RegExp(\"^\" + (_.stopwords || \"\") + \"$\", \"i\");\n        init2 = true;\n      }\n      if (_.modified(\"pattern\") || !this._match) {\n        this._match = new RegExp(_.pattern || \"[\\\\w']+\", \"g\");\n        init2 = true;\n      }\n      if (_.modified(\"field\") || pulse2.modified(_.field.fields)) {\n        init2 = true;\n      }\n      if (init2) this._counts = {};\n      return init2;\n    },\n    _finish(pulse2, as) {\n      const counts = this._counts, tuples = this._tuples || (this._tuples = {}), text2 = as[0], count2 = as[1], out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      let w2, t, c2;\n      for (w2 in counts) {\n        t = tuples[w2];\n        c2 = counts[w2] || 0;\n        if (!t && c2) {\n          tuples[w2] = t = ingest$1({});\n          t[text2] = w2;\n          t[count2] = c2;\n          out.add.push(t);\n        } else if (c2 === 0) {\n          if (t) out.rem.push(t);\n          counts[w2] = null;\n          tuples[w2] = null;\n        } else if (t[count2] !== c2) {\n          t[count2] = c2;\n          out.mod.push(t);\n        }\n      }\n      return out.modifies(as);\n    }\n  });\n  function Cross(params2) {\n    Transform.call(this, null, params2);\n  }\n  Cross.Definition = {\n    \"type\": \"Cross\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"filter\",\n      \"type\": \"expr\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"a\", \"b\"]\n    }]\n  };\n  inherits(Cross, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), as = _.as || [\"a\", \"b\"], a2 = as[0], b2 = as[1], reset2 = !this.value || pulse2.changed(pulse2.ADD_REM) || _.modified(\"as\") || _.modified(\"filter\");\n      let data2 = this.value;\n      if (reset2) {\n        if (data2) out.rem = data2;\n        data2 = pulse2.materialize(pulse2.SOURCE).source;\n        out.add = this.value = cross$1(data2, a2, b2, _.filter || truthy);\n      } else {\n        out.mod = data2;\n      }\n      out.source = this.value;\n      return out.modifies(as);\n    }\n  });\n  function cross$1(input, a2, b2, filter2) {\n    var data2 = [], t = {}, n = input.length, i = 0, j, left;\n    for (; i < n; ++i) {\n      t[a2] = left = input[i];\n      for (j = 0; j < n; ++j) {\n        t[b2] = input[j];\n        if (filter2(t)) {\n          data2.push(ingest$1(t));\n          t = {};\n          t[a2] = left;\n        }\n      }\n    }\n    return data2;\n  }\n  const Distributions = {\n    kde,\n    mixture: mixture$1,\n    normal: gaussian,\n    lognormal,\n    uniform\n  };\n  const DISTRIBUTIONS = \"distributions\", FUNCTION = \"function\", FIELD = \"field\";\n  function parse$4(def2, data2) {\n    const func = def2[FUNCTION];\n    if (!has$1(Distributions, func)) {\n      error(\"Unknown distribution function: \" + func);\n    }\n    const d = Distributions[func]();\n    for (const name in def2) {\n      if (name === FIELD) {\n        d.data((def2.from || data2()).map(def2[name]));\n      } else if (name === DISTRIBUTIONS) {\n        d[name](def2[name].map((_) => parse$4(_, data2)));\n      } else if (typeof d[name] === FUNCTION) {\n        d[name](def2[name]);\n      }\n    }\n    return d;\n  }\n  function Density(params2) {\n    Transform.call(this, null, params2);\n  }\n  const distributions = [{\n    \"key\": {\n      \"function\": \"normal\"\n    },\n    \"params\": [{\n      \"name\": \"mean\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"stdev\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"lognormal\"\n    },\n    \"params\": [{\n      \"name\": \"mean\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"stdev\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"uniform\"\n    },\n    \"params\": [{\n      \"name\": \"min\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"max\",\n      \"type\": \"number\",\n      \"default\": 1\n    }]\n  }, {\n    \"key\": {\n      \"function\": \"kde\"\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"from\",\n      \"type\": \"data\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0\n    }]\n  }];\n  const mixture = {\n    \"key\": {\n      \"function\": \"mixture\"\n    },\n    \"params\": [{\n      \"name\": \"distributions\",\n      \"type\": \"param\",\n      \"array\": true,\n      \"params\": distributions\n    }, {\n      \"name\": \"weights\",\n      \"type\": \"number\",\n      \"array\": true\n    }]\n  };\n  Density.Definition = {\n    \"type\": \"Density\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"minsteps\",\n      \"type\": \"number\",\n      \"default\": 25\n    }, {\n      \"name\": \"maxsteps\",\n      \"type\": \"number\",\n      \"default\": 200\n    }, {\n      \"name\": \"method\",\n      \"type\": \"string\",\n      \"default\": \"pdf\",\n      \"values\": [\"pdf\", \"cdf\"]\n    }, {\n      \"name\": \"distribution\",\n      \"type\": \"param\",\n      \"params\": distributions.concat(mixture)\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"value\", \"density\"]\n    }]\n  };\n  inherits(Density, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const dist2 = parse$4(_.distribution, source$1(pulse2)), minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n        let method2 = _.method || \"pdf\";\n        if (method2 !== \"pdf\" && method2 !== \"cdf\") {\n          error(\"Invalid density method: \" + method2);\n        }\n        if (!_.extent && !dist2.data) {\n          error(\"Missing density extent parameter.\");\n        }\n        method2 = dist2[method2];\n        const as = _.as || [\"value\", \"density\"], domain2 = _.extent || extent(dist2.data()), values2 = sampleCurve(method2, domain2, minsteps, maxsteps).map((v) => {\n          const tuple = {};\n          tuple[as[0]] = v[0];\n          tuple[as[1]] = v[1];\n          return ingest$1(tuple);\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  function source$1(pulse2) {\n    return () => pulse2.materialize(pulse2.SOURCE).source;\n  }\n  function fieldNames(fields, as) {\n    if (!fields) return null;\n    return fields.map((f, i) => as[i] || accessorName(f));\n  }\n  function partition$1$1(data2, groupby, field2) {\n    const groups = [], get2 = (f) => f(t);\n    let map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2.map(field2));\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(field2(t));\n      }\n    }\n    return groups;\n  }\n  const Output$5 = \"bin\";\n  function DotBin(params2) {\n    Transform.call(this, null, params2);\n  }\n  DotBin.Definition = {\n    \"type\": \"DotBin\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": Output$5\n    }]\n  };\n  const autostep = (data2, field2) => span(extent(data2, field2)) / 30;\n  inherits(DotBin, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !(_.modified() || pulse2.changed())) {\n        return pulse2;\n      }\n      const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(pulse2.source, _.groupby, identity$7), smooth = _.smooth || false, field2 = _.field, step = _.step || autostep(source2, field2), sort2 = stableCompare((a2, b2) => field2(a2) - field2(b2)), as = _.as || Output$5, n = groups.length;\n      let min2 = Infinity, max2 = -Infinity, i = 0, j;\n      for (; i < n; ++i) {\n        const g = groups[i].sort(sort2);\n        j = -1;\n        for (const v of dotbin(g, step, smooth, field2)) {\n          if (v < min2) min2 = v;\n          if (v > max2) max2 = v;\n          g[++j][as] = v;\n        }\n      }\n      this.value = {\n        start: min2,\n        stop: max2,\n        step\n      };\n      return pulse2.reflow(true).modifies(as);\n    }\n  });\n  function Expression$1(params2) {\n    Operator.call(this, null, update$4, params2);\n    this.modified(true);\n  }\n  inherits(Expression$1, Operator);\n  function update$4(_) {\n    const expr2 = _.expr;\n    return this.value && !_.modified(\"expr\") ? this.value : accessor((datum2) => expr2(datum2, _), accessorFields(expr2), accessorName(expr2));\n  }\n  function Extent(params2) {\n    Transform.call(this, [void 0, void 0], params2);\n  }\n  Extent.Definition = {\n    \"type\": \"Extent\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  };\n  inherits(Extent, Transform, {\n    transform(_, pulse2) {\n      const extent2 = this.value, field2 = _.field, mod = pulse2.changed() || pulse2.modified(field2.fields) || _.modified(\"field\");\n      let min2 = extent2[0], max2 = extent2[1];\n      if (mod || min2 == null) {\n        min2 = Infinity;\n        max2 = -Infinity;\n      }\n      pulse2.visit(mod ? pulse2.SOURCE : pulse2.ADD, (t) => {\n        const v = toNumber(field2(t));\n        if (v != null) {\n          if (v < min2) min2 = v;\n          if (v > max2) max2 = v;\n        }\n      });\n      if (!Number.isFinite(min2) || !Number.isFinite(max2)) {\n        let name = accessorName(field2);\n        if (name) name = ` for field \"${name}\"`;\n        pulse2.dataflow.warn(`Infinite extent${name}: [${min2}, ${max2}]`);\n        min2 = max2 = void 0;\n      }\n      this.value = [min2, max2];\n    }\n  });\n  function Subflow(pulse2, parent) {\n    Operator.call(this, pulse2);\n    this.parent = parent;\n    this.count = 0;\n  }\n  inherits(Subflow, Operator, {\n    /**\n     * Routes pulses from this subflow to a target transform.\n     * @param {Transform} target - A transform that receives the subflow of tuples.\n     */\n    connect(target2) {\n      this.detachSubflow = target2.detachSubflow;\n      this.targets().add(target2);\n      return target2.source = this;\n    },\n    /**\n     * Add an 'add' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being added.\n     */\n    add(t) {\n      this.count += 1;\n      this.value.add.push(t);\n    },\n    /**\n     * Add a 'rem' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being removed.\n     */\n    rem(t) {\n      this.count -= 1;\n      this.value.rem.push(t);\n    },\n    /**\n     * Add a 'mod' tuple to the subflow pulse.\n     * @param {Tuple} t - The tuple being modified.\n     */\n    mod(t) {\n      this.value.mod.push(t);\n    },\n    /**\n     * Re-initialize this operator's pulse value.\n     * @param {Pulse} pulse - The pulse to copy from.\n     * @see Pulse.init\n     */\n    init(pulse2) {\n      this.value.init(pulse2, pulse2.NO_SOURCE);\n    },\n    /**\n     * Evaluate this operator. This method overrides the\n     * default behavior to simply return the contained pulse value.\n     * @return {Pulse}\n     */\n    evaluate() {\n      return this.value;\n    }\n  });\n  function Facet$1(params2) {\n    Transform.call(this, {}, params2);\n    this._keys = fastmap();\n    const a2 = this._targets = [];\n    a2.active = 0;\n    a2.forEach = (f) => {\n      for (let i = 0, n = a2.active; i < n; ++i) {\n        f(a2[i], i, a2);\n      }\n    };\n  }\n  inherits(Facet$1, Transform, {\n    activate(flow) {\n      this._targets[this._targets.active++] = flow;\n    },\n    // parent argument provided by PreFacet subclass\n    subflow(key2, flow, pulse2, parent) {\n      const flows = this.value;\n      let sf = has$1(flows, key2) && flows[key2], df, p;\n      if (!sf) {\n        p = parent || (p = this._group[key2]) && p.tuple;\n        df = pulse2.dataflow;\n        sf = new Subflow(pulse2.fork(pulse2.NO_SOURCE), this);\n        df.add(sf).connect(flow(df, key2, p));\n        flows[key2] = sf;\n        this.activate(sf);\n      } else if (sf.value.stamp < pulse2.stamp) {\n        sf.init(pulse2);\n        this.activate(sf);\n      }\n      return sf;\n    },\n    clean() {\n      const flows = this.value;\n      let detached = 0;\n      for (const key2 in flows) {\n        if (flows[key2].count === 0) {\n          const detach = flows[key2].detachSubflow;\n          if (detach) detach();\n          delete flows[key2];\n          ++detached;\n        }\n      }\n      if (detached) {\n        const active = this._targets.filter((sf) => sf && sf.count > 0);\n        this.initTargets(active);\n      }\n    },\n    initTargets(act) {\n      const a2 = this._targets, n = a2.length, m2 = act ? act.length : 0;\n      let i = 0;\n      for (; i < m2; ++i) {\n        a2[i] = act[i];\n      }\n      for (; i < n && a2[i] != null; ++i) {\n        a2[i] = null;\n      }\n      a2.active = m2;\n    },\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, key2 = _.key, flow = _.subflow, cache2 = this._keys, rekey = _.modified(\"key\"), subflow = (key3) => this.subflow(key3, flow, pulse2);\n      this._group = _.group || {};\n      this.initTargets();\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t), k = cache2.get(id2);\n        if (k !== void 0) {\n          cache2.delete(id2);\n          subflow(k).rem(t);\n        }\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        const k = key2(t);\n        cache2.set(tupleid(t), k);\n        subflow(k).add(t);\n      });\n      if (rekey || pulse2.modified(key2.fields)) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          const id2 = tupleid(t), k0 = cache2.get(id2), k1 = key2(t);\n          if (k0 === k1) {\n            subflow(k1).mod(t);\n          } else {\n            cache2.set(id2, k1);\n            subflow(k0).rem(t);\n            subflow(k1).add(t);\n          }\n        });\n      } else if (pulse2.changed(pulse2.MOD)) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          subflow(cache2.get(tupleid(t))).mod(t);\n        });\n      }\n      if (rekey) {\n        pulse2.visit(pulse2.REFLOW, (t) => {\n          const id2 = tupleid(t), k0 = cache2.get(id2), k1 = key2(t);\n          if (k0 !== k1) {\n            cache2.set(id2, k1);\n            subflow(k0).rem(t);\n            subflow(k1).add(t);\n          }\n        });\n      }\n      if (pulse2.clean()) {\n        df.runAfter(() => {\n          this.clean();\n          cache2.clean();\n        });\n      } else if (cache2.empty > df.cleanThreshold) {\n        df.runAfter(cache2.clean);\n      }\n      return pulse2;\n    }\n  });\n  function Field$1(params2) {\n    Operator.call(this, null, update$3, params2);\n  }\n  inherits(Field$1, Operator);\n  function update$3(_) {\n    return this.value && !_.modified() ? this.value : isArray(_.name) ? array$5(_.name).map((f) => field$1(f)) : field$1(_.name, _.as);\n  }\n  function Filter(params2) {\n    Transform.call(this, fastmap(), params2);\n  }\n  Filter.Definition = {\n    \"type\": \"Filter\",\n    \"metadata\": {\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"expr\",\n      \"type\": \"expr\",\n      \"required\": true\n    }]\n  };\n  inherits(Filter, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, cache2 = this.value, output2 = pulse2.fork(), add2 = output2.add, rem2 = output2.rem, mod = output2.mod, test2 = _.expr;\n      let isMod = true;\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t);\n        if (!cache2.has(id2)) rem2.push(t);\n        else cache2.delete(id2);\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        if (test2(t, _)) add2.push(t);\n        else cache2.set(tupleid(t), 1);\n      });\n      function revisit(t) {\n        const id2 = tupleid(t), b2 = test2(t, _), s = cache2.get(id2);\n        if (b2 && s) {\n          cache2.delete(id2);\n          add2.push(t);\n        } else if (!b2 && !s) {\n          cache2.set(id2, 1);\n          rem2.push(t);\n        } else if (isMod && b2 && !s) {\n          mod.push(t);\n        }\n      }\n      pulse2.visit(pulse2.MOD, revisit);\n      if (_.modified()) {\n        isMod = false;\n        pulse2.visit(pulse2.REFLOW, revisit);\n      }\n      if (cache2.empty > df.cleanThreshold) df.runAfter(cache2.clean);\n      return output2;\n    }\n  });\n  function Flatten(params2) {\n    Transform.call(this, [], params2);\n  }\n  Flatten.Definition = {\n    \"type\": \"Flatten\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"index\",\n      \"type\": \"string\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Flatten, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, as = fieldNames(fields, _.as || []), index2 = _.index || null, m2 = as.length;\n      out.rem = this.value;\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        const arrays = fields.map((f) => f(t)), maxlen = arrays.reduce((l, a2) => Math.max(l, a2.length), 0);\n        let i = 0, j, d, v;\n        for (; i < maxlen; ++i) {\n          d = derive(t);\n          for (j = 0; j < m2; ++j) {\n            d[as[j]] = (v = arrays[j][i]) == null ? null : v;\n          }\n          if (index2) {\n            d[index2] = i;\n          }\n          out.add.push(d);\n        }\n      });\n      this.value = out.source = out.add;\n      if (index2) out.modifies(index2);\n      return out.modifies(as);\n    }\n  });\n  function Fold(params2) {\n    Transform.call(this, [], params2);\n  }\n  Fold.Definition = {\n    \"type\": \"Fold\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"key\", \"value\"]\n    }]\n  };\n  inherits(Fold, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, fnames = fields.map(accessorName), as = _.as || [\"key\", \"value\"], k = as[0], v = as[1], n = fields.length;\n      out.rem = this.value;\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        for (let i = 0, d; i < n; ++i) {\n          d = derive(t);\n          d[k] = fnames[i];\n          d[v] = fields[i](t);\n          out.add.push(d);\n        }\n      });\n      this.value = out.source = out.add;\n      return out.modifies(as);\n    }\n  });\n  function Formula(params2) {\n    Transform.call(this, null, params2);\n  }\n  Formula.Definition = {\n    \"type\": \"Formula\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"expr\",\n      \"type\": \"expr\",\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"required\": true\n    }, {\n      \"name\": \"initonly\",\n      \"type\": \"boolean\"\n    }]\n  };\n  inherits(Formula, Transform, {\n    transform(_, pulse2) {\n      const func = _.expr, as = _.as, mod = _.modified(), flag2 = _.initonly ? pulse2.ADD : mod ? pulse2.SOURCE : pulse2.modified(func.fields) || pulse2.modified(as) ? pulse2.ADD_MOD : pulse2.ADD;\n      if (mod) {\n        pulse2 = pulse2.materialize().reflow(true);\n      }\n      if (!_.initonly) {\n        pulse2.modifies(as);\n      }\n      return pulse2.visit(flag2, (t) => t[as] = func(t, _));\n    }\n  });\n  function Generate(params2) {\n    Transform.call(this, [], params2);\n  }\n  inherits(Generate, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.ALL), gen = _.generator;\n      let data2 = this.value, num = _.size - data2.length, add2, rem2, t;\n      if (num > 0) {\n        for (add2 = []; --num >= 0; ) {\n          add2.push(t = ingest$1(gen(_)));\n          data2.push(t);\n        }\n        out.add = out.add.length ? out.materialize(out.ADD).add.concat(add2) : add2;\n      } else {\n        rem2 = data2.slice(0, -num);\n        out.rem = out.rem.length ? out.materialize(out.REM).rem.concat(rem2) : rem2;\n        data2 = data2.slice(-num);\n      }\n      out.source = this.value = data2;\n      return out;\n    }\n  });\n  const Methods$1 = {\n    value: \"value\",\n    median,\n    mean,\n    min: min$3,\n    max: max$3\n  };\n  const Empty$1 = [];\n  function Impute(params2) {\n    Transform.call(this, [], params2);\n  }\n  Impute.Definition = {\n    \"type\": \"Impute\",\n    \"metadata\": {\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"keyvals\",\n      \"array\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"value\",\n      \"values\": [\"value\", \"mean\", \"median\", \"max\", \"min\"]\n    }, {\n      \"name\": \"value\",\n      \"default\": 0\n    }]\n  };\n  function getValue(_) {\n    var m2 = _.method || Methods$1.value, v;\n    if (Methods$1[m2] == null) {\n      error(\"Unrecognized imputation method: \" + m2);\n    } else if (m2 === Methods$1.value) {\n      v = _.value !== void 0 ? _.value : 0;\n      return () => v;\n    } else {\n      return Methods$1[m2];\n    }\n  }\n  function getField$1(_) {\n    const f = _.field;\n    return (t) => t ? f(t) : NaN;\n  }\n  inherits(Impute, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), impute = getValue(_), field2 = getField$1(_), fName = accessorName(_.field), kName = accessorName(_.key), gNames = (_.groupby || []).map(accessorName), groups = partition$4(pulse2.source, _.groupby, _.key, _.keyvals), curr = [], prev = this.value, m2 = groups.domain.length, group2, value2, gVals, kVal, g, i, j, l, n, t;\n      for (g = 0, l = groups.length; g < l; ++g) {\n        group2 = groups[g];\n        gVals = group2.values;\n        value2 = NaN;\n        for (j = 0; j < m2; ++j) {\n          if (group2[j] != null) continue;\n          kVal = groups.domain[j];\n          t = {\n            _impute: true\n          };\n          for (i = 0, n = gVals.length; i < n; ++i) t[gNames[i]] = gVals[i];\n          t[kName] = kVal;\n          t[fName] = Number.isNaN(value2) ? value2 = impute(group2, field2) : value2;\n          curr.push(ingest$1(t));\n        }\n      }\n      if (curr.length) out.add = out.materialize(out.ADD).add.concat(curr);\n      if (prev.length) out.rem = out.materialize(out.REM).rem.concat(prev);\n      this.value = curr;\n      return out;\n    }\n  });\n  function partition$4(data2, groupby, key2, keyvals) {\n    var get2 = (f) => f(t), groups = [], domain2 = keyvals ? keyvals.slice() : [], kMap = {}, gMap = {}, gVals, gKey, group2, i, j, k, n, t;\n    domain2.forEach((k2, i2) => kMap[k2] = i2 + 1);\n    for (i = 0, n = data2.length; i < n; ++i) {\n      t = data2[i];\n      k = key2(t);\n      j = kMap[k] || (kMap[k] = domain2.push(k));\n      gKey = (gVals = groupby ? groupby.map(get2) : Empty$1) + \"\";\n      if (!(group2 = gMap[gKey])) {\n        group2 = gMap[gKey] = [];\n        groups.push(group2);\n        group2.values = gVals;\n      }\n      group2[j - 1] = t;\n    }\n    groups.domain = domain2;\n    return groups;\n  }\n  function JoinAggregate(params2) {\n    Aggregate$1.call(this, params2);\n  }\n  JoinAggregate.Definition = {\n    \"type\": \"JoinAggregate\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidAggregateOps\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(JoinAggregate, Aggregate$1, {\n    transform(_, pulse2) {\n      const aggr = this, mod = _.modified();\n      let cells;\n      if (aggr.value && (mod || pulse2.modified(aggr._inputs, true))) {\n        cells = aggr.value = mod ? aggr.init(_) : {};\n        pulse2.visit(pulse2.SOURCE, (t) => aggr.add(t));\n      } else {\n        cells = aggr.value = aggr.value || this.init(_);\n        pulse2.visit(pulse2.REM, (t) => aggr.rem(t));\n        pulse2.visit(pulse2.ADD, (t) => aggr.add(t));\n      }\n      aggr.changes();\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        extend$1(t, cells[aggr.cellkey(t)].tuple);\n      });\n      return pulse2.reflow(mod).modifies(this._outputs);\n    },\n    changes() {\n      const adds = this._adds, mods = this._mods;\n      let i, n;\n      for (i = 0, n = this._alen; i < n; ++i) {\n        this.celltuple(adds[i]);\n        adds[i] = null;\n      }\n      for (i = 0, n = this._mlen; i < n; ++i) {\n        this.celltuple(mods[i]);\n        mods[i] = null;\n      }\n      this._alen = this._mlen = 0;\n    }\n  });\n  function KDE(params2) {\n    Transform.call(this, null, params2);\n  }\n  KDE.Definition = {\n    \"type\": \"KDE\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"cumulative\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"counts\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"steps\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"minsteps\",\n      \"type\": \"number\",\n      \"default\": 25\n    }, {\n      \"name\": \"maxsteps\",\n      \"type\": \"number\",\n      \"default\": 200\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"value\", \"density\"]\n    }]\n  };\n  inherits(KDE, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(source2, _.groupby, _.field), names = (_.groupby || []).map(accessorName), bandwidth2 = _.bandwidth, method2 = _.cumulative ? \"cdf\" : \"pdf\", as = _.as || [\"value\", \"density\"], values2 = [];\n        let domain2 = _.extent, minsteps = _.steps || _.minsteps || 25, maxsteps = _.steps || _.maxsteps || 200;\n        if (method2 !== \"pdf\" && method2 !== \"cdf\") {\n          error(\"Invalid density method: \" + method2);\n        }\n        if (_.resolve === \"shared\") {\n          if (!domain2) domain2 = extent(source2, _.field);\n          minsteps = maxsteps = _.steps || maxsteps;\n        }\n        groups.forEach((g) => {\n          const density = kde(g, bandwidth2)[method2], scale2 = _.counts ? g.length : 1, local = domain2 || extent(g);\n          sampleCurve(density, local, minsteps, maxsteps).forEach((v) => {\n            const t = {};\n            for (let i = 0; i < names.length; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = v[0];\n            t[as[1]] = v[1] * scale2;\n            values2.push(ingest$1(t));\n          });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  function Key$1(params2) {\n    Operator.call(this, null, update$2, params2);\n  }\n  inherits(Key$1, Operator);\n  function update$2(_) {\n    return this.value && !_.modified() ? this.value : key$2(_.fields, _.flat);\n  }\n  function Load$1(params2) {\n    Transform.call(this, [], params2);\n    this._pending = null;\n  }\n  inherits(Load$1, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow;\n      if (this._pending) {\n        return output(this, pulse2, this._pending);\n      }\n      if (stop(_)) return pulse2.StopPropagation;\n      if (_.values) {\n        return output(this, pulse2, df.parse(_.values, _.format));\n      } else if (_.async) {\n        const p = df.request(_.url, _.format).then((res) => {\n          this._pending = array$5(res.data);\n          return (df2) => df2.touch(this);\n        });\n        return {\n          async: p\n        };\n      } else {\n        return df.request(_.url, _.format).then((res) => output(this, pulse2, array$5(res.data)));\n      }\n    }\n  });\n  function stop(_) {\n    return _.modified(\"async\") && !(_.modified(\"values\") || _.modified(\"url\") || _.modified(\"format\"));\n  }\n  function output(op, pulse2, data2) {\n    data2.forEach(ingest$1);\n    const out = pulse2.fork(pulse2.NO_FIELDS & pulse2.NO_SOURCE);\n    out.rem = op.value;\n    op.value = out.source = out.add = data2;\n    op._pending = null;\n    if (out.rem.length) out.clean(true);\n    return out;\n  }\n  function Lookup(params2) {\n    Transform.call(this, {}, params2);\n  }\n  Lookup.Definition = {\n    \"type\": \"Lookup\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"index\",\n      \"type\": \"index\",\n      \"params\": [{\n        \"name\": \"from\",\n        \"type\": \"data\",\n        \"required\": true\n      }, {\n        \"name\": \"key\",\n        \"type\": \"field\",\n        \"required\": true\n      }]\n    }, {\n      \"name\": \"values\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }, {\n      \"name\": \"default\",\n      \"default\": null\n    }]\n  };\n  inherits(Lookup, Transform, {\n    transform(_, pulse2) {\n      const keys2 = _.fields, index2 = _.index, values2 = _.values, defaultValue = _.default == null ? null : _.default, reset2 = _.modified(), n = keys2.length;\n      let flag2 = reset2 ? pulse2.SOURCE : pulse2.ADD, out = pulse2, as = _.as, set2, m2, mods;\n      if (values2) {\n        m2 = values2.length;\n        if (n > 1 && !as) {\n          error('Multi-field lookup requires explicit \"as\" parameter.');\n        }\n        if (as && as.length !== n * m2) {\n          error('The \"as\" parameter has too few output field names.');\n        }\n        as = as || values2.map(accessorName);\n        set2 = function(t) {\n          for (var i = 0, k = 0, j, v; i < n; ++i) {\n            v = index2.get(keys2[i](t));\n            if (v == null) for (j = 0; j < m2; ++j, ++k) t[as[k]] = defaultValue;\n            else for (j = 0; j < m2; ++j, ++k) t[as[k]] = values2[j](v);\n          }\n        };\n      } else {\n        if (!as) {\n          error(\"Missing output field names.\");\n        }\n        set2 = function(t) {\n          for (var i = 0, v; i < n; ++i) {\n            v = index2.get(keys2[i](t));\n            t[as[i]] = v == null ? defaultValue : v;\n          }\n        };\n      }\n      if (reset2) {\n        out = pulse2.reflow(true);\n      } else {\n        mods = keys2.some((k) => pulse2.modified(k.fields));\n        flag2 |= mods ? pulse2.MOD : 0;\n      }\n      pulse2.visit(flag2, set2);\n      return out.modifies(as);\n    }\n  });\n  function MultiExtent$1(params2) {\n    Operator.call(this, null, update$1, params2);\n  }\n  inherits(MultiExtent$1, Operator);\n  function update$1(_) {\n    if (this.value && !_.modified()) {\n      return this.value;\n    }\n    const ext = _.extents, n = ext.length;\n    let min2 = Infinity, max2 = -Infinity, i, e;\n    for (i = 0; i < n; ++i) {\n      e = ext[i];\n      if (e[0] < min2) min2 = e[0];\n      if (e[1] > max2) max2 = e[1];\n    }\n    return [min2, max2];\n  }\n  function MultiValues$1(params2) {\n    Operator.call(this, null, update, params2);\n  }\n  inherits(MultiValues$1, Operator);\n  function update(_) {\n    return this.value && !_.modified() ? this.value : _.values.reduce((data2, _2) => data2.concat(_2), []);\n  }\n  function Params$2(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Params$2, Transform, {\n    transform(_, pulse2) {\n      this.modified(_.modified());\n      this.value = _;\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function Pivot(params2) {\n    Aggregate$1.call(this, params2);\n  }\n  Pivot.Definition = {\n    \"type\": \"Pivot\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"value\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"op\",\n      \"type\": \"enum\",\n      \"values\": ValidAggregateOps,\n      \"default\": \"sum\"\n    }, {\n      \"name\": \"limit\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"key\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(Pivot, Aggregate$1, {\n    _transform: Aggregate$1.prototype.transform,\n    transform(_, pulse2) {\n      return this._transform(aggregateParams(_, pulse2), pulse2);\n    }\n  });\n  function aggregateParams(_, pulse2) {\n    const key2 = _.field, value2 = _.value, op = (_.op === \"count\" ? \"__count__\" : _.op) || \"sum\", fields = accessorFields(key2).concat(accessorFields(value2)), keys2 = pivotKeys(key2, _.limit || 0, pulse2);\n    if (pulse2.changed()) _.set(\"__pivot__\", null, null, true);\n    return {\n      key: _.key,\n      groupby: _.groupby,\n      ops: keys2.map(() => op),\n      fields: keys2.map((k) => get$4(k, key2, value2, fields)),\n      as: keys2.map((k) => k + \"\"),\n      modified: _.modified.bind(_)\n    };\n  }\n  function get$4(k, key2, value2, fields) {\n    return accessor((d) => key2(d) === k ? value2(d) : NaN, fields, k + \"\");\n  }\n  function pivotKeys(key2, limit, pulse2) {\n    const map2 = {}, list = [];\n    pulse2.visit(pulse2.SOURCE, (t) => {\n      const k = key2(t);\n      if (!map2[k]) {\n        map2[k] = 1;\n        list.push(k);\n      }\n    });\n    list.sort(ascending$2);\n    return limit ? list.slice(0, limit) : list;\n  }\n  function PreFacet$1(params2) {\n    Facet$1.call(this, params2);\n  }\n  inherits(PreFacet$1, Facet$1, {\n    transform(_, pulse2) {\n      const flow = _.subflow, field2 = _.field, subflow = (t) => this.subflow(tupleid(t), flow, pulse2, t);\n      if (_.modified(\"field\") || field2 && pulse2.modified(accessorFields(field2))) {\n        error(\"PreFacet does not support field modification.\");\n      }\n      this.initTargets();\n      if (field2) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.mod(_2));\n        });\n        pulse2.visit(pulse2.ADD, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.add(ingest$1(_2)));\n        });\n        pulse2.visit(pulse2.REM, (t) => {\n          const sf = subflow(t);\n          field2(t).forEach((_2) => sf.rem(_2));\n        });\n      } else {\n        pulse2.visit(pulse2.MOD, (t) => subflow(t).mod(t));\n        pulse2.visit(pulse2.ADD, (t) => subflow(t).add(t));\n        pulse2.visit(pulse2.REM, (t) => subflow(t).rem(t));\n      }\n      if (pulse2.clean()) {\n        pulse2.runAfter(() => this.clean());\n      }\n      return pulse2;\n    }\n  });\n  function Project(params2) {\n    Transform.call(this, null, params2);\n  }\n  Project.Definition = {\n    \"type\": \"Project\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }]\n  };\n  inherits(Project, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), fields = _.fields, as = fieldNames(_.fields, _.as || []), derive2 = fields ? (s, t) => project(s, t, fields, as) : rederive;\n      let lut;\n      if (this.value) {\n        lut = this.value;\n      } else {\n        pulse2 = pulse2.addAll();\n        lut = this.value = {};\n      }\n      pulse2.visit(pulse2.REM, (t) => {\n        const id2 = tupleid(t);\n        out.rem.push(lut[id2]);\n        lut[id2] = null;\n      });\n      pulse2.visit(pulse2.ADD, (t) => {\n        const dt = derive2(t, ingest$1({}));\n        lut[tupleid(t)] = dt;\n        out.add.push(dt);\n      });\n      pulse2.visit(pulse2.MOD, (t) => {\n        out.mod.push(derive2(t, lut[tupleid(t)]));\n      });\n      return out;\n    }\n  });\n  function project(s, t, fields, as) {\n    for (let i = 0, n = fields.length; i < n; ++i) {\n      t[as[i]] = fields[i](s);\n    }\n    return t;\n  }\n  function Proxy$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Proxy$1, Transform, {\n    transform(_, pulse2) {\n      this.value = _.value;\n      return _.modified(\"value\") ? pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS) : pulse2.StopPropagation;\n    }\n  });\n  function Quantile$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Quantile$1.Definition = {\n    \"type\": \"Quantile\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"probs\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 0.01\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"default\": [\"prob\", \"value\"]\n    }]\n  };\n  const EPSILON$2 = 1e-14;\n  inherits(Quantile$1, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), as = _.as || [\"prob\", \"value\"];\n      if (this.value && !_.modified() && !pulse2.changed()) {\n        out.source = this.value;\n        return out;\n      }\n      const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$1$1(source2, _.groupby, _.field), names = (_.groupby || []).map(accessorName), values2 = [], step = _.step || 0.01, p = _.probs || range$3(step / 2, 1 - EPSILON$2, step), n = p.length;\n      groups.forEach((g) => {\n        const q = quantiles(g, p);\n        for (let i = 0; i < n; ++i) {\n          const t = {};\n          for (let i2 = 0; i2 < names.length; ++i2) {\n            t[names[i2]] = g.dims[i2];\n          }\n          t[as[0]] = p[i];\n          t[as[1]] = q[i];\n          values2.push(ingest$1(t));\n        }\n      });\n      if (this.value) out.rem = this.value;\n      this.value = out.add = out.source = values2;\n      return out;\n    }\n  });\n  function Relay$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Relay$1, Transform, {\n    transform(_, pulse2) {\n      let out, lut;\n      if (this.value) {\n        lut = this.value;\n      } else {\n        out = pulse2 = pulse2.addAll();\n        lut = this.value = {};\n      }\n      if (_.derive) {\n        out = pulse2.fork(pulse2.NO_SOURCE);\n        pulse2.visit(pulse2.REM, (t) => {\n          const id2 = tupleid(t);\n          out.rem.push(lut[id2]);\n          lut[id2] = null;\n        });\n        pulse2.visit(pulse2.ADD, (t) => {\n          const dt = derive(t);\n          lut[tupleid(t)] = dt;\n          out.add.push(dt);\n        });\n        pulse2.visit(pulse2.MOD, (t) => {\n          const dt = lut[tupleid(t)];\n          for (const k in t) {\n            dt[k] = t[k];\n            out.modifies(k);\n          }\n          out.mod.push(dt);\n        });\n      }\n      return out;\n    }\n  });\n  function Sample(params2) {\n    Transform.call(this, [], params2);\n    this.count = 0;\n  }\n  Sample.Definition = {\n    \"type\": \"Sample\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"default\": 1e3\n    }]\n  };\n  inherits(Sample, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE), mod = _.modified(\"size\"), num = _.size, map2 = this.value.reduce((m2, t) => (m2[tupleid(t)] = 1, m2), {});\n      let res = this.value, cnt = this.count, cap = 0;\n      function update2(t) {\n        let p, idx;\n        if (res.length < num) {\n          res.push(t);\n        } else {\n          idx = ~~((cnt + 1) * random());\n          if (idx < res.length && idx >= cap) {\n            p = res[idx];\n            if (map2[tupleid(p)]) out.rem.push(p);\n            res[idx] = t;\n          }\n        }\n        ++cnt;\n      }\n      if (pulse2.rem.length) {\n        pulse2.visit(pulse2.REM, (t) => {\n          const id2 = tupleid(t);\n          if (map2[id2]) {\n            map2[id2] = -1;\n            out.rem.push(t);\n          }\n          --cnt;\n        });\n        res = res.filter((t) => map2[tupleid(t)] !== -1);\n      }\n      if ((pulse2.rem.length || mod) && res.length < num && pulse2.source) {\n        cap = cnt = res.length;\n        pulse2.visit(pulse2.SOURCE, (t) => {\n          if (!map2[tupleid(t)]) update2(t);\n        });\n        cap = -1;\n      }\n      if (mod && res.length > num) {\n        const n = res.length - num;\n        for (let i = 0; i < n; ++i) {\n          map2[tupleid(res[i])] = -1;\n          out.rem.push(res[i]);\n        }\n        res = res.slice(n);\n      }\n      if (pulse2.mod.length) {\n        pulse2.visit(pulse2.MOD, (t) => {\n          if (map2[tupleid(t)]) out.mod.push(t);\n        });\n      }\n      if (pulse2.add.length) {\n        pulse2.visit(pulse2.ADD, update2);\n      }\n      if (pulse2.add.length || cap < 0) {\n        out.add = res.filter((t) => !map2[tupleid(t)]);\n      }\n      this.count = cnt;\n      this.value = out.source = res;\n      return out;\n    }\n  });\n  function Sequence(params2) {\n    Transform.call(this, null, params2);\n  }\n  Sequence.Definition = {\n    \"type\": \"Sequence\",\n    \"metadata\": {\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"start\",\n      \"type\": \"number\",\n      \"required\": true\n    }, {\n      \"name\": \"stop\",\n      \"type\": \"number\",\n      \"required\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"data\"\n    }]\n  };\n  inherits(Sequence, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !_.modified()) return;\n      const out = pulse2.materialize().fork(pulse2.MOD), as = _.as || \"data\";\n      out.rem = this.value ? pulse2.rem.concat(this.value) : pulse2.rem;\n      this.value = range$3(_.start, _.stop, _.step || 1).map((v) => {\n        const t = {};\n        t[as] = v;\n        return ingest$1(t);\n      });\n      out.add = pulse2.add.concat(this.value);\n      return out;\n    }\n  });\n  function Sieve$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Sieve$1, Transform, {\n    transform(_, pulse2) {\n      this.value = pulse2.source;\n      return pulse2.changed() ? pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS) : pulse2.StopPropagation;\n    }\n  });\n  function TimeUnit(params2) {\n    Transform.call(this, null, params2);\n  }\n  const OUTPUT = [\"unit0\", \"unit1\"];\n  TimeUnit.Definition = {\n    \"type\": \"TimeUnit\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"interval\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"units\",\n      \"type\": \"enum\",\n      \"values\": TIME_UNITS,\n      \"array\": true\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"maxbins\",\n      \"type\": \"number\",\n      \"default\": 40\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"date\",\n      \"array\": true\n    }, {\n      \"name\": \"timezone\",\n      \"type\": \"enum\",\n      \"default\": \"local\",\n      \"values\": [\"local\", \"utc\"]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": OUTPUT\n    }]\n  };\n  inherits(TimeUnit, Transform, {\n    transform(_, pulse2) {\n      const field2 = _.field, band2 = _.interval !== false, utc = _.timezone === \"utc\", floor2 = this._floor(_, pulse2), offset2 = (utc ? utcInterval : timeInterval)(floor2.unit).offset, as = _.as || OUTPUT, u0 = as[0], u1 = as[1], step = floor2.step;\n      let min2 = floor2.start || Infinity, max2 = floor2.stop || -Infinity, flag2 = pulse2.ADD;\n      if (_.modified() || pulse2.changed(pulse2.REM) || pulse2.modified(accessorFields(field2))) {\n        pulse2 = pulse2.reflow(true);\n        flag2 = pulse2.SOURCE;\n        min2 = Infinity;\n        max2 = -Infinity;\n      }\n      pulse2.visit(flag2, (t) => {\n        const v = field2(t);\n        let a2, b2;\n        if (v == null) {\n          t[u0] = null;\n          if (band2) t[u1] = null;\n        } else {\n          t[u0] = a2 = b2 = floor2(v);\n          if (band2) t[u1] = b2 = offset2(a2, step);\n          if (a2 < min2) min2 = a2;\n          if (b2 > max2) max2 = b2;\n        }\n      });\n      floor2.start = min2;\n      floor2.stop = max2;\n      return pulse2.modifies(band2 ? as : u0);\n    },\n    _floor(_, pulse2) {\n      const utc = _.timezone === \"utc\";\n      const {\n        units,\n        step\n      } = _.units ? {\n        units: _.units,\n        step: _.step || 1\n      } : bin$1({\n        extent: _.extent || extent(pulse2.materialize(pulse2.SOURCE).source, _.field),\n        maxbins: _.maxbins\n      });\n      const tunits = timeUnits(units), prev = this.value || {}, floor2 = (utc ? utcFloor : timeFloor)(tunits, step);\n      floor2.unit = peek$1(tunits);\n      floor2.units = tunits;\n      floor2.step = step;\n      floor2.start = prev.start;\n      floor2.stop = prev.stop;\n      return this.value = floor2;\n    }\n  });\n  function TupleIndex(params2) {\n    Transform.call(this, fastmap(), params2);\n  }\n  inherits(TupleIndex, Transform, {\n    transform(_, pulse2) {\n      const df = pulse2.dataflow, field2 = _.field, index2 = this.value, set2 = (t) => index2.set(field2(t), t);\n      let mod = true;\n      if (_.modified(\"field\") || pulse2.modified(field2.fields)) {\n        index2.clear();\n        pulse2.visit(pulse2.SOURCE, set2);\n      } else if (pulse2.changed()) {\n        pulse2.visit(pulse2.REM, (t) => index2.delete(field2(t)));\n        pulse2.visit(pulse2.ADD, set2);\n      } else {\n        mod = false;\n      }\n      this.modified(mod);\n      if (index2.empty > df.cleanThreshold) df.runAfter(index2.clean);\n      return pulse2.fork();\n    }\n  });\n  function Values$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Values$1, Transform, {\n    transform(_, pulse2) {\n      const run2 = !this.value || _.modified(\"field\") || _.modified(\"sort\") || pulse2.changed() || _.sort && pulse2.modified(_.sort.fields);\n      if (run2) {\n        this.value = (_.sort ? pulse2.source.slice().sort(stableCompare(_.sort)) : pulse2.source).map(_.field);\n      }\n    }\n  });\n  function WindowOp(op, field2, param2, as) {\n    const fn = WindowOps[op](field2, param2);\n    return {\n      init: fn.init || zero$3,\n      update: function(w2, t) {\n        t[as] = fn.next(w2);\n      }\n    };\n  }\n  const WindowOps = {\n    row_number: function() {\n      return {\n        next: (w2) => w2.index + 1\n      };\n    },\n    rank: function() {\n      let rank2;\n      return {\n        init: () => rank2 = 1,\n        next: (w2) => {\n          const i = w2.index, data2 = w2.data;\n          return i && w2.compare(data2[i - 1], data2[i]) ? rank2 = i + 1 : rank2;\n        }\n      };\n    },\n    dense_rank: function() {\n      let drank;\n      return {\n        init: () => drank = 1,\n        next: (w2) => {\n          const i = w2.index, d = w2.data;\n          return i && w2.compare(d[i - 1], d[i]) ? ++drank : drank;\n        }\n      };\n    },\n    percent_rank: function() {\n      const rank2 = WindowOps.rank(), next = rank2.next;\n      return {\n        init: rank2.init,\n        next: (w2) => (next(w2) - 1) / (w2.data.length - 1)\n      };\n    },\n    cume_dist: function() {\n      let cume;\n      return {\n        init: () => cume = 0,\n        next: (w2) => {\n          const d = w2.data, c2 = w2.compare;\n          let i = w2.index;\n          if (cume < i) {\n            while (i + 1 < d.length && !c2(d[i], d[i + 1])) ++i;\n            cume = i;\n          }\n          return (1 + cume) / d.length;\n        }\n      };\n    },\n    ntile: function(field2, num) {\n      num = +num;\n      if (!(num > 0)) error(\"ntile num must be greater than zero.\");\n      const cume = WindowOps.cume_dist(), next = cume.next;\n      return {\n        init: cume.init,\n        next: (w2) => Math.ceil(num * next(w2))\n      };\n    },\n    lag: function(field2, offset2) {\n      offset2 = +offset2 || 1;\n      return {\n        next: (w2) => {\n          const i = w2.index - offset2;\n          return i >= 0 ? field2(w2.data[i]) : null;\n        }\n      };\n    },\n    lead: function(field2, offset2) {\n      offset2 = +offset2 || 1;\n      return {\n        next: (w2) => {\n          const i = w2.index + offset2, d = w2.data;\n          return i < d.length ? field2(d[i]) : null;\n        }\n      };\n    },\n    first_value: function(field2) {\n      return {\n        next: (w2) => field2(w2.data[w2.i0])\n      };\n    },\n    last_value: function(field2) {\n      return {\n        next: (w2) => field2(w2.data[w2.i1 - 1])\n      };\n    },\n    nth_value: function(field2, nth) {\n      nth = +nth;\n      if (!(nth > 0)) error(\"nth_value nth must be greater than zero.\");\n      return {\n        next: (w2) => {\n          const i = w2.i0 + (nth - 1);\n          return i < w2.i1 ? field2(w2.data[i]) : null;\n        }\n      };\n    },\n    prev_value: function(field2) {\n      let prev;\n      return {\n        init: () => prev = null,\n        next: (w2) => {\n          const v = field2(w2.data[w2.index]);\n          return v != null ? prev = v : prev;\n        }\n      };\n    },\n    next_value: function(field2) {\n      let v, i;\n      return {\n        init: () => (v = null, i = -1),\n        next: (w2) => {\n          const d = w2.data;\n          return w2.index <= i ? v : (i = find$2(field2, d, w2.index)) < 0 ? (i = d.length, v = null) : v = field2(d[i]);\n        }\n      };\n    }\n  };\n  function find$2(field2, data2, index2) {\n    for (let n = data2.length; index2 < n; ++index2) {\n      const v = field2(data2[index2]);\n      if (v != null) return index2;\n    }\n    return -1;\n  }\n  const ValidWindowOps = Object.keys(WindowOps);\n  function WindowState(_) {\n    const ops2 = array$5(_.ops), fields = array$5(_.fields), params2 = array$5(_.params), aggregate_params = array$5(_.aggregate_params), as = array$5(_.as), outputs = this.outputs = [], windows = this.windows = [], inputs = {}, map2 = {}, counts = [], measures = [];\n    let countOnly = true;\n    function visitInputs(f) {\n      array$5(accessorFields(f)).forEach((_2) => inputs[_2] = 1);\n    }\n    visitInputs(_.sort);\n    ops2.forEach((op, i) => {\n      const field2 = fields[i], param2 = params2[i], aggregate_param = aggregate_params[i] || null, mname = accessorName(field2), name = measureName(op, mname, as[i]);\n      visitInputs(field2);\n      outputs.push(name);\n      if (has$1(WindowOps, op)) {\n        windows.push(WindowOp(op, field2, param2, name));\n      } else {\n        if (field2 == null && op !== \"count\") {\n          error(\"Null aggregate field specified.\");\n        }\n        if (op === \"count\") {\n          counts.push(name);\n          return;\n        }\n        countOnly = false;\n        let m2 = map2[mname];\n        if (!m2) {\n          m2 = map2[mname] = [];\n          m2.field = field2;\n          measures.push(m2);\n        }\n        m2.push(createMeasure(op, aggregate_param, name));\n      }\n    });\n    if (counts.length || measures.length) {\n      this.cell = cell(measures, counts, countOnly);\n    }\n    this.inputs = Object.keys(inputs);\n  }\n  const prototype = WindowState.prototype;\n  prototype.init = function() {\n    this.windows.forEach((_) => _.init());\n    if (this.cell) this.cell.init();\n  };\n  prototype.update = function(w2, t) {\n    const cell2 = this.cell, wind = this.windows, data2 = w2.data, m2 = wind && wind.length;\n    let j;\n    if (cell2) {\n      for (j = w2.p0; j < w2.i0; ++j) cell2.rem(data2[j]);\n      for (j = w2.p1; j < w2.i1; ++j) cell2.add(data2[j]);\n      cell2.set(t);\n    }\n    for (j = 0; j < m2; ++j) wind[j].update(w2, t);\n  };\n  function cell(measures, counts, countOnly) {\n    measures = measures.map((m2) => compileMeasures(m2, m2.field));\n    const cell2 = {\n      num: 0,\n      agg: null,\n      store: false,\n      count: counts\n    };\n    if (!countOnly) {\n      var n = measures.length, a2 = cell2.agg = Array(n), i = 0;\n      for (; i < n; ++i) a2[i] = new measures[i](cell2);\n    }\n    if (cell2.store) {\n      var store = cell2.data = new TupleStore();\n    }\n    cell2.add = function(t) {\n      cell2.num += 1;\n      if (countOnly) return;\n      if (store) store.add(t);\n      for (let i2 = 0; i2 < n; ++i2) {\n        a2[i2].add(a2[i2].get(t), t);\n      }\n    };\n    cell2.rem = function(t) {\n      cell2.num -= 1;\n      if (countOnly) return;\n      if (store) store.rem(t);\n      for (let i2 = 0; i2 < n; ++i2) {\n        a2[i2].rem(a2[i2].get(t), t);\n      }\n    };\n    cell2.set = function(t) {\n      let i2, n2;\n      if (store) store.values();\n      for (i2 = 0, n2 = counts.length; i2 < n2; ++i2) t[counts[i2]] = cell2.num;\n      if (!countOnly) for (i2 = 0, n2 = a2.length; i2 < n2; ++i2) a2[i2].set(t);\n    };\n    cell2.init = function() {\n      cell2.num = 0;\n      if (store) store.reset();\n      for (let i2 = 0; i2 < n; ++i2) a2[i2].init();\n    };\n    return cell2;\n  }\n  function Window(params2) {\n    Transform.call(this, {}, params2);\n    this._mlen = 0;\n    this._mods = [];\n  }\n  Window.Definition = {\n    \"type\": \"Window\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"ops\",\n      \"type\": \"enum\",\n      \"array\": true,\n      \"values\": ValidWindowOps.concat(ValidAggregateOps)\n    }, {\n      \"name\": \"params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"aggregate_params\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"array\": true\n    }, {\n      \"name\": \"frame\",\n      \"type\": \"number\",\n      \"null\": true,\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [null, 0]\n    }, {\n      \"name\": \"ignorePeers\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }]\n  };\n  inherits(Window, Transform, {\n    transform(_, pulse2) {\n      this.stamp = pulse2.stamp;\n      const mod = _.modified(), cmp = stableCompare(_.sort), key2 = groupkey(_.groupby), group2 = (t) => this.group(key2(t));\n      let state = this.state;\n      if (!state || mod) {\n        state = this.state = new WindowState(_);\n      }\n      if (mod || pulse2.modified(state.inputs)) {\n        this.value = {};\n        pulse2.visit(pulse2.SOURCE, (t) => group2(t).add(t));\n      } else {\n        pulse2.visit(pulse2.REM, (t) => group2(t).remove(t));\n        pulse2.visit(pulse2.ADD, (t) => group2(t).add(t));\n      }\n      for (let i = 0, n = this._mlen; i < n; ++i) {\n        processPartition(this._mods[i], state, cmp, _);\n      }\n      this._mlen = 0;\n      this._mods = [];\n      return pulse2.reflow(mod).modifies(state.outputs);\n    },\n    group(key2) {\n      let group2 = this.value[key2];\n      if (!group2) {\n        group2 = this.value[key2] = SortedList(tupleid);\n        group2.stamp = -1;\n      }\n      if (group2.stamp < this.stamp) {\n        group2.stamp = this.stamp;\n        this._mods[this._mlen++] = group2;\n      }\n      return group2;\n    }\n  });\n  function processPartition(list, state, cmp, _) {\n    const sort2 = _.sort, range2 = sort2 && !_.ignorePeers, frame2 = _.frame || [null, 0], data2 = list.data(cmp), n = data2.length, b2 = range2 ? bisector(sort2) : null, w2 = {\n      i0: 0,\n      i1: 0,\n      p0: 0,\n      p1: 0,\n      index: 0,\n      data: data2,\n      compare: sort2 || constant$5(-1)\n    };\n    state.init();\n    for (let i = 0; i < n; ++i) {\n      setWindow(w2, frame2, i, n);\n      if (range2) adjustRange(w2, b2);\n      state.update(w2, data2[i]);\n    }\n  }\n  function setWindow(w2, f, i, n) {\n    w2.p0 = w2.i0;\n    w2.p1 = w2.i1;\n    w2.i0 = f[0] == null ? 0 : Math.max(0, i - Math.abs(f[0]));\n    w2.i1 = f[1] == null ? n : Math.min(n, i + Math.abs(f[1]) + 1);\n    w2.index = i;\n  }\n  function adjustRange(w2, bisect2) {\n    const r0 = w2.i0, r1 = w2.i1 - 1, c2 = w2.compare, d = w2.data, n = d.length - 1;\n    if (r0 > 0 && !c2(d[r0], d[r0 - 1])) w2.i0 = bisect2.left(d, d[r0]);\n    if (r1 < n && !c2(d[r1], d[r1 + 1])) w2.i1 = bisect2.right(d, d[r1]);\n  }\n  const tx = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    aggregate: Aggregate$1,\n    bin: Bin,\n    collect: Collect$1,\n    compare: Compare$1,\n    countpattern: CountPattern,\n    cross: Cross,\n    density: Density,\n    dotbin: DotBin,\n    expression: Expression$1,\n    extent: Extent,\n    facet: Facet$1,\n    field: Field$1,\n    filter: Filter,\n    flatten: Flatten,\n    fold: Fold,\n    formula: Formula,\n    generate: Generate,\n    impute: Impute,\n    joinaggregate: JoinAggregate,\n    kde: KDE,\n    key: Key$1,\n    load: Load$1,\n    lookup: Lookup,\n    multiextent: MultiExtent$1,\n    multivalues: MultiValues$1,\n    params: Params$2,\n    pivot: Pivot,\n    prefacet: PreFacet$1,\n    project: Project,\n    proxy: Proxy$1,\n    quantile: Quantile$1,\n    relay: Relay$1,\n    sample: Sample,\n    sequence: Sequence,\n    sieve: Sieve$1,\n    subflow: Subflow,\n    timeunit: TimeUnit,\n    tupleindex: TupleIndex,\n    values: Values$1,\n    window: Window\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function constant$3(x2) {\n    return function constant2() {\n      return x2;\n    };\n  }\n  const abs$2 = Math.abs;\n  const atan2$1 = Math.atan2;\n  const cos$2 = Math.cos;\n  const max$2 = Math.max;\n  const min$2 = Math.min;\n  const sin$2 = Math.sin;\n  const sqrt$3 = Math.sqrt;\n  const epsilon$5 = 1e-12;\n  const pi$3 = Math.PI;\n  const halfPi$2 = pi$3 / 2;\n  const tau$3 = 2 * pi$3;\n  function acos$1(x2) {\n    return x2 > 1 ? 0 : x2 < -1 ? pi$3 : Math.acos(x2);\n  }\n  function asin$2(x2) {\n    return x2 >= 1 ? halfPi$2 : x2 <= -1 ? -halfPi$2 : Math.asin(x2);\n  }\n  const pi$2 = Math.PI, tau$2 = 2 * pi$2, epsilon$4 = 1e-6, tauEpsilon = tau$2 - epsilon$4;\n  function append$1(strings) {\n    this._ += strings[0];\n    for (let i = 1, n = strings.length; i < n; ++i) {\n      this._ += arguments[i] + strings[i];\n    }\n  }\n  function appendRound$1(digits) {\n    let d = Math.floor(digits);\n    if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n    if (d > 15) return append$1;\n    const k = 10 ** d;\n    return function(strings) {\n      this._ += strings[0];\n      for (let i = 1, n = strings.length; i < n; ++i) {\n        this._ += Math.round(arguments[i] * k) / k + strings[i];\n      }\n    };\n  }\n  let Path$1 = class Path {\n    constructor(digits) {\n      this._x0 = this._y0 = // start of current subpath\n      this._x1 = this._y1 = null;\n      this._ = \"\";\n      this._append = digits == null ? append$1 : appendRound$1(digits);\n    }\n    moveTo(x2, y2) {\n      this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;\n    }\n    closePath() {\n      if (this._x1 !== null) {\n        this._x1 = this._x0, this._y1 = this._y0;\n        this._append`Z`;\n      }\n    }\n    lineTo(x2, y2) {\n      this._append`L${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    quadraticCurveTo(x12, y12, x2, y2) {\n      this._append`Q${+x12},${+y12},${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    bezierCurveTo(x12, y12, x2, y2, x3, y3) {\n      this._append`C${+x12},${+y12},${+x2},${+y2},${this._x1 = +x3},${this._y1 = +y3}`;\n    }\n    arcTo(x12, y12, x2, y2, r) {\n      x12 = +x12, y12 = +y12, x2 = +x2, y2 = +y2, r = +r;\n      if (r < 0) throw new Error(`negative radius: ${r}`);\n      let x02 = this._x1, y02 = this._y1, x21 = x2 - x12, y21 = y2 - y12, x01 = x02 - x12, y01 = y02 - y12, l01_2 = x01 * x01 + y01 * y01;\n      if (this._x1 === null) {\n        this._append`M${this._x1 = x12},${this._y1 = y12}`;\n      } else if (!(l01_2 > epsilon$4)) ;\n      else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$4) || !r) {\n        this._append`L${this._x1 = x12},${this._y1 = y12}`;\n      } else {\n        let x20 = x2 - x02, y20 = y2 - y02, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;\n        if (Math.abs(t01 - 1) > epsilon$4) {\n          this._append`L${x12 + t01 * x01},${y12 + t01 * y01}`;\n        }\n        this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x12 + t21 * x21},${this._y1 = y12 + t21 * y21}`;\n      }\n    }\n    arc(x2, y2, r, a0, a1, ccw) {\n      x2 = +x2, y2 = +y2, r = +r, ccw = !!ccw;\n      if (r < 0) throw new Error(`negative radius: ${r}`);\n      let dx = r * Math.cos(a0), dy = r * Math.sin(a0), x02 = x2 + dx, y02 = y2 + dy, cw2 = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;\n      if (this._x1 === null) {\n        this._append`M${x02},${y02}`;\n      } else if (Math.abs(this._x1 - x02) > epsilon$4 || Math.abs(this._y1 - y02) > epsilon$4) {\n        this._append`L${x02},${y02}`;\n      }\n      if (!r) return;\n      if (da < 0) da = da % tau$2 + tau$2;\n      if (da > tauEpsilon) {\n        this._append`A${r},${r},0,1,${cw2},${x2 - dx},${y2 - dy}A${r},${r},0,1,${cw2},${this._x1 = x02},${this._y1 = y02}`;\n      } else if (da > epsilon$4) {\n        this._append`A${r},${r},0,${+(da >= pi$2)},${cw2},${this._x1 = x2 + r * Math.cos(a1)},${this._y1 = y2 + r * Math.sin(a1)}`;\n      }\n    }\n    rect(x2, y2, w2, h2) {\n      this._append`M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${w2 = +w2}v${+h2}h${-w2}Z`;\n    }\n    toString() {\n      return this._;\n    }\n  };\n  function path$3() {\n    return new Path$1();\n  }\n  path$3.prototype = Path$1.prototype;\n  function withPath(shape2) {\n    let digits = 3;\n    shape2.digits = function(_) {\n      if (!arguments.length) return digits;\n      if (_ == null) {\n        digits = null;\n      } else {\n        const d = Math.floor(_);\n        if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n        digits = d;\n      }\n      return shape2;\n    };\n    return () => new Path$1(digits);\n  }\n  function arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function arcPadAngle(d) {\n    return d && d.padAngle;\n  }\n  function intersect$3(x02, y02, x12, y12, x2, y2, x3, y3) {\n    var x10 = x12 - x02, y10 = y12 - y02, x32 = x3 - x2, y32 = y3 - y2, t = y32 * x10 - x32 * y10;\n    if (t * t < epsilon$5) return;\n    t = (x32 * (y02 - y2) - y32 * (x02 - x2)) / t;\n    return [x02 + t * x10, y02 + t * y10];\n  }\n  function cornerTangents(x02, y02, x12, y12, r1, rc, cw2) {\n    var x01 = x02 - x12, y01 = y02 - y12, lo = (cw2 ? rc : -rc) / sqrt$3(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x11 = x02 + ox, y11 = y02 + oy, x10 = x12 + ox, y10 = y12 + oy, x002 = (x11 + x10) / 2, y002 = (y11 + y10) / 2, dx = x10 - x11, dy = y10 - y11, d2 = dx * dx + dy * dy, r = r1 - rc, D2 = x11 * y10 - x10 * y11, d = (dy < 0 ? -1 : 1) * sqrt$3(max$2(0, r * r * d2 - D2 * D2)), cx0 = (D2 * dy - dx * d) / d2, cy0 = (-D2 * dx - dy * d) / d2, cx1 = (D2 * dy + dx * d) / d2, cy1 = (-D2 * dx + dy * d) / d2, dx0 = cx0 - x002, dy0 = cy0 - y002, dx1 = cx1 - x002, dy1 = cy1 - y002;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return {\n      cx: cx0,\n      cy: cy0,\n      x01: -ox,\n      y01: -oy,\n      x11: cx0 * (r1 / r - 1),\n      y11: cy0 * (r1 / r - 1)\n    };\n  }\n  function arc$2$1() {\n    var innerRadius = arcInnerRadius, outerRadius = arcOuterRadius, cornerRadius = constant$3(0), padRadius = null, startAngle = arcStartAngle, endAngle = arcEndAngle, padAngle = arcPadAngle, context2 = null, path2 = withPath(arc2);\n    function arc2() {\n      var buffer, r, r0 = +innerRadius.apply(this, arguments), r1 = +outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) - halfPi$2, a1 = endAngle.apply(this, arguments) - halfPi$2, da = abs$2(a1 - a0), cw2 = a1 > a0;\n      if (!context2) context2 = buffer = path2();\n      if (r1 < r0) r = r1, r1 = r0, r0 = r;\n      if (!(r1 > epsilon$5)) context2.moveTo(0, 0);\n      else if (da > tau$3 - epsilon$5) {\n        context2.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));\n        context2.arc(0, 0, r1, a0, a1, !cw2);\n        if (r0 > epsilon$5) {\n          context2.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));\n          context2.arc(0, 0, r0, a1, a0, cw2);\n        }\n      } else {\n        var a01 = a0, a11 = a1, a00 = a0, a10 = a1, da0 = da, da1 = da, ap = padAngle.apply(this, arguments) / 2, rp = ap > epsilon$5 && (padRadius ? +padRadius.apply(this, arguments) : sqrt$3(r0 * r0 + r1 * r1)), rc = min$2(abs$2(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), rc0 = rc, rc1 = rc, t02, t12;\n        if (rp > epsilon$5) {\n          var p02 = asin$2(rp / r0 * sin$2(ap)), p1 = asin$2(rp / r1 * sin$2(ap));\n          if ((da0 -= p02 * 2) > epsilon$5) p02 *= cw2 ? 1 : -1, a00 += p02, a10 -= p02;\n          else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n          if ((da1 -= p1 * 2) > epsilon$5) p1 *= cw2 ? 1 : -1, a01 += p1, a11 -= p1;\n          else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n        }\n        var x01 = r1 * cos$2(a01), y01 = r1 * sin$2(a01), x10 = r0 * cos$2(a10), y10 = r0 * sin$2(a10);\n        if (rc > epsilon$5) {\n          var x11 = r1 * cos$2(a11), y11 = r1 * sin$2(a11), x002 = r0 * cos$2(a00), y002 = r0 * sin$2(a00), oc;\n          if (da < pi$3) {\n            if (oc = intersect$3(x01, y01, x002, y002, x11, y11, x10, y10)) {\n              var ax = x01 - oc[0], ay = y01 - oc[1], bx = x11 - oc[0], by = y11 - oc[1], kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$3(ax * ax + ay * ay) * sqrt$3(bx * bx + by * by))) / 2), lc = sqrt$3(oc[0] * oc[0] + oc[1] * oc[1]);\n              rc0 = min$2(rc, (r0 - lc) / (kc - 1));\n              rc1 = min$2(rc, (r1 - lc) / (kc + 1));\n            } else {\n              rc0 = rc1 = 0;\n            }\n          }\n        }\n        if (!(da1 > epsilon$5)) context2.moveTo(x01, y01);\n        else if (rc1 > epsilon$5) {\n          t02 = cornerTangents(x002, y002, x01, y01, r1, rc1, cw2);\n          t12 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw2);\n          context2.moveTo(t02.cx + t02.x01, t02.cy + t02.y01);\n          if (rc1 < rc) context2.arc(t02.cx, t02.cy, rc1, atan2$1(t02.y01, t02.x01), atan2$1(t12.y01, t12.x01), !cw2);\n          else {\n            context2.arc(t02.cx, t02.cy, rc1, atan2$1(t02.y01, t02.x01), atan2$1(t02.y11, t02.x11), !cw2);\n            context2.arc(0, 0, r1, atan2$1(t02.cy + t02.y11, t02.cx + t02.x11), atan2$1(t12.cy + t12.y11, t12.cx + t12.x11), !cw2);\n            context2.arc(t12.cx, t12.cy, rc1, atan2$1(t12.y11, t12.x11), atan2$1(t12.y01, t12.x01), !cw2);\n          }\n        } else context2.moveTo(x01, y01), context2.arc(0, 0, r1, a01, a11, !cw2);\n        if (!(r0 > epsilon$5) || !(da0 > epsilon$5)) context2.lineTo(x10, y10);\n        else if (rc0 > epsilon$5) {\n          t02 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw2);\n          t12 = cornerTangents(x01, y01, x002, y002, r0, -rc0, cw2);\n          context2.lineTo(t02.cx + t02.x01, t02.cy + t02.y01);\n          if (rc0 < rc) context2.arc(t02.cx, t02.cy, rc0, atan2$1(t02.y01, t02.x01), atan2$1(t12.y01, t12.x01), !cw2);\n          else {\n            context2.arc(t02.cx, t02.cy, rc0, atan2$1(t02.y01, t02.x01), atan2$1(t02.y11, t02.x11), !cw2);\n            context2.arc(0, 0, r0, atan2$1(t02.cy + t02.y11, t02.cx + t02.x11), atan2$1(t12.cy + t12.y11, t12.cx + t12.x11), cw2);\n            context2.arc(t12.cx, t12.cy, rc0, atan2$1(t12.y11, t12.x11), atan2$1(t12.y01, t12.x01), !cw2);\n          }\n        } else context2.arc(0, 0, r0, a10, a00, cw2);\n      }\n      context2.closePath();\n      if (buffer) return context2 = null, buffer + \"\" || null;\n    }\n    arc2.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a2 = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$3 / 2;\n      return [cos$2(a2) * r, sin$2(a2) * r];\n    };\n    arc2.innerRadius = function(_) {\n      return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : innerRadius;\n    };\n    arc2.outerRadius = function(_) {\n      return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : outerRadius;\n    };\n    arc2.cornerRadius = function(_) {\n      return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : cornerRadius;\n    };\n    arc2.padRadius = function(_) {\n      return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant$3(+_), arc2) : padRadius;\n    };\n    arc2.startAngle = function(_) {\n      return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : startAngle;\n    };\n    arc2.endAngle = function(_) {\n      return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : endAngle;\n    };\n    arc2.padAngle = function(_) {\n      return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant$3(+_), arc2) : padAngle;\n    };\n    arc2.context = function(_) {\n      return arguments.length ? (context2 = _ == null ? null : _, arc2) : context2;\n    };\n    return arc2;\n  }\n  function array$4(x2) {\n    return typeof x2 === \"object\" && \"length\" in x2 ? x2 : Array.from(x2);\n  }\n  function Linear$1(context2) {\n    this._context = context2;\n  }\n  Linear$1.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n        // falls through\n        default:\n          this._context.lineTo(x2, y2);\n          break;\n      }\n    }\n  };\n  function curveLinear(context2) {\n    return new Linear$1(context2);\n  }\n  function x$3(p) {\n    return p[0];\n  }\n  function y$3(p) {\n    return p[1];\n  }\n  function line$2$1(x2, y2) {\n    var defined = constant$3(true), context2 = null, curve2 = curveLinear, output2 = null, path2 = withPath(line2);\n    x2 = typeof x2 === \"function\" ? x2 : x2 === void 0 ? x$3 : constant$3(x2);\n    y2 = typeof y2 === \"function\" ? y2 : y2 === void 0 ? y$3 : constant$3(y2);\n    function line2(data2) {\n      var i, n = (data2 = array$4(data2)).length, d, defined0 = false, buffer;\n      if (context2 == null) output2 = curve2(buffer = path2());\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) output2.lineStart();\n          else output2.lineEnd();\n        }\n        if (defined0) output2.point(+x2(d, i, data2), +y2(d, i, data2));\n      }\n      if (buffer) return output2 = null, buffer + \"\" || null;\n    }\n    line2.x = function(_) {\n      return arguments.length ? (x2 = typeof _ === \"function\" ? _ : constant$3(+_), line2) : x2;\n    };\n    line2.y = function(_) {\n      return arguments.length ? (y2 = typeof _ === \"function\" ? _ : constant$3(+_), line2) : y2;\n    };\n    line2.defined = function(_) {\n      return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant$3(!!_), line2) : defined;\n    };\n    line2.curve = function(_) {\n      return arguments.length ? (curve2 = _, context2 != null && (output2 = curve2(context2)), line2) : curve2;\n    };\n    line2.context = function(_) {\n      return arguments.length ? (_ == null ? context2 = output2 = null : output2 = curve2(context2 = _), line2) : context2;\n    };\n    return line2;\n  }\n  function area$2$1(x02, y02, y12) {\n    var x12 = null, defined = constant$3(true), context2 = null, curve2 = curveLinear, output2 = null, path2 = withPath(area2);\n    x02 = typeof x02 === \"function\" ? x02 : x02 === void 0 ? x$3 : constant$3(+x02);\n    y02 = typeof y02 === \"function\" ? y02 : y02 === void 0 ? constant$3(0) : constant$3(+y02);\n    y12 = typeof y12 === \"function\" ? y12 : y12 === void 0 ? y$3 : constant$3(+y12);\n    function area2(data2) {\n      var i, j, k, n = (data2 = array$4(data2)).length, d, defined0 = false, buffer, x0z = new Array(n), y0z = new Array(n);\n      if (context2 == null) output2 = curve2(buffer = path2());\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) {\n            j = i;\n            output2.areaStart();\n            output2.lineStart();\n          } else {\n            output2.lineEnd();\n            output2.lineStart();\n            for (k = i - 1; k >= j; --k) {\n              output2.point(x0z[k], y0z[k]);\n            }\n            output2.lineEnd();\n            output2.areaEnd();\n          }\n        }\n        if (defined0) {\n          x0z[i] = +x02(d, i, data2), y0z[i] = +y02(d, i, data2);\n          output2.point(x12 ? +x12(d, i, data2) : x0z[i], y12 ? +y12(d, i, data2) : y0z[i]);\n        }\n      }\n      if (buffer) return output2 = null, buffer + \"\" || null;\n    }\n    function arealine() {\n      return line$2$1().defined(defined).curve(curve2).context(context2);\n    }\n    area2.x = function(_) {\n      return arguments.length ? (x02 = typeof _ === \"function\" ? _ : constant$3(+_), x12 = null, area2) : x02;\n    };\n    area2.x0 = function(_) {\n      return arguments.length ? (x02 = typeof _ === \"function\" ? _ : constant$3(+_), area2) : x02;\n    };\n    area2.x1 = function(_) {\n      return arguments.length ? (x12 = _ == null ? null : typeof _ === \"function\" ? _ : constant$3(+_), area2) : x12;\n    };\n    area2.y = function(_) {\n      return arguments.length ? (y02 = typeof _ === \"function\" ? _ : constant$3(+_), y12 = null, area2) : y02;\n    };\n    area2.y0 = function(_) {\n      return arguments.length ? (y02 = typeof _ === \"function\" ? _ : constant$3(+_), area2) : y02;\n    };\n    area2.y1 = function(_) {\n      return arguments.length ? (y12 = _ == null ? null : typeof _ === \"function\" ? _ : constant$3(+_), area2) : y12;\n    };\n    area2.lineX0 = area2.lineY0 = function() {\n      return arealine().x(x02).y(y02);\n    };\n    area2.lineY1 = function() {\n      return arealine().x(x02).y(y12);\n    };\n    area2.lineX1 = function() {\n      return arealine().x(x12).y(y02);\n    };\n    area2.defined = function(_) {\n      return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant$3(!!_), area2) : defined;\n    };\n    area2.curve = function(_) {\n      return arguments.length ? (curve2 = _, context2 != null && (output2 = curve2(context2)), area2) : curve2;\n    };\n    area2.context = function(_) {\n      return arguments.length ? (_ == null ? context2 = output2 = null : output2 = curve2(context2 = _), area2) : context2;\n    };\n    return area2;\n  }\n  const circle = {\n    draw(context2, size) {\n      const r = sqrt$3(size / pi$3);\n      context2.moveTo(r, 0);\n      context2.arc(0, 0, r, 0, tau$3);\n    }\n  };\n  function Symbol$1(type2, size) {\n    let context2 = null, path2 = withPath(symbol2);\n    type2 = typeof type2 === \"function\" ? type2 : constant$3(type2 || circle);\n    size = typeof size === \"function\" ? size : constant$3(size === void 0 ? 64 : +size);\n    function symbol2() {\n      let buffer;\n      if (!context2) context2 = buffer = path2();\n      type2.apply(this, arguments).draw(context2, +size.apply(this, arguments));\n      if (buffer) return context2 = null, buffer + \"\" || null;\n    }\n    symbol2.type = function(_) {\n      return arguments.length ? (type2 = typeof _ === \"function\" ? _ : constant$3(_), symbol2) : type2;\n    };\n    symbol2.size = function(_) {\n      return arguments.length ? (size = typeof _ === \"function\" ? _ : constant$3(+_), symbol2) : size;\n    };\n    symbol2.context = function(_) {\n      return arguments.length ? (context2 = _ == null ? null : _, symbol2) : context2;\n    };\n    return symbol2;\n  }\n  function noop$3() {\n  }\n  function point$5(that, x2, y2) {\n    that._context.bezierCurveTo(\n      (2 * that._x0 + that._x1) / 3,\n      (2 * that._y0 + that._y1) / 3,\n      (that._x0 + 2 * that._x1) / 3,\n      (that._y0 + 2 * that._y1) / 3,\n      (that._x0 + 4 * that._x1 + x2) / 6,\n      (that._y0 + 4 * that._y1 + y2) / 6\n    );\n  }\n  function Basis(context2) {\n    this._context = context2;\n  }\n  Basis.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 3:\n          point$5(this, this._x1, this._y1);\n        // falls through\n        case 2:\n          this._context.lineTo(this._x1, this._y1);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);\n        // falls through\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasis(context2) {\n    return new Basis(context2);\n  }\n  function BasisClosed(context2) {\n    this._context = context2;\n  }\n  BasisClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x2, this._y2);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n          this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x2, this._y2);\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x2 = x2, this._y2 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 2:\n          this._point = 3;\n          this._x4 = x2, this._y4 = y2;\n          this._context.moveTo((this._x0 + 4 * this._x1 + x2) / 6, (this._y0 + 4 * this._y1 + y2) / 6);\n          break;\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasisClosed(context2) {\n    return new BasisClosed(context2);\n  }\n  function BasisOpen(context2) {\n    this._context = context2;\n  }\n  BasisOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          var x02 = (this._x0 + 4 * this._x1 + x2) / 6, y02 = (this._y0 + 4 * this._y1 + y2) / 6;\n          this._line ? this._context.lineTo(x02, y02) : this._context.moveTo(x02, y02);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$5(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n    }\n  };\n  function curveBasisOpen(context2) {\n    return new BasisOpen(context2);\n  }\n  function Bundle(context2, beta) {\n    this._basis = new Basis(context2);\n    this._beta = beta;\n  }\n  Bundle.prototype = {\n    lineStart: function() {\n      this._x = [];\n      this._y = [];\n      this._basis.lineStart();\n    },\n    lineEnd: function() {\n      var x2 = this._x, y2 = this._y, j = x2.length - 1;\n      if (j > 0) {\n        var x02 = x2[0], y02 = y2[0], dx = x2[j] - x02, dy = y2[j] - y02, i = -1, t;\n        while (++i <= j) {\n          t = i / j;\n          this._basis.point(\n            this._beta * x2[i] + (1 - this._beta) * (x02 + t * dx),\n            this._beta * y2[i] + (1 - this._beta) * (y02 + t * dy)\n          );\n        }\n      }\n      this._x = this._y = null;\n      this._basis.lineEnd();\n    },\n    point: function(x2, y2) {\n      this._x.push(+x2);\n      this._y.push(+y2);\n    }\n  };\n  const curveBundle = (function custom2(beta) {\n    function bundle2(context2) {\n      return beta === 1 ? new Basis(context2) : new Bundle(context2, beta);\n    }\n    bundle2.beta = function(beta2) {\n      return custom2(+beta2);\n    };\n    return bundle2;\n  })(0.85);\n  function point$4(that, x2, y2) {\n    that._context.bezierCurveTo(\n      that._x1 + that._k * (that._x2 - that._x0),\n      that._y1 + that._k * (that._y2 - that._y0),\n      that._x2 + that._k * (that._x1 - x2),\n      that._y2 + that._k * (that._y1 - y2),\n      that._x2,\n      that._y2\n    );\n  }\n  function Cardinal(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  Cardinal.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x2, this._y2);\n          break;\n        case 3:\n          point$4(this, this._x1, this._y1);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          this._x1 = x2, this._y1 = y2;\n          break;\n        case 2:\n          this._point = 3;\n        // falls through\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinal = (function custom2(tension) {\n    function cardinal(context2) {\n      return new Cardinal(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function CardinalClosed(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  CardinalClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.lineTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._context.moveTo(this._x4 = x2, this._y4 = y2);\n          break;\n        case 2:\n          this._point = 3;\n          this._x5 = x2, this._y5 = y2;\n          break;\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinalClosed = (function custom2(tension) {\n    function cardinal(context2) {\n      return new CardinalClosed(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function CardinalOpen(context2, tension) {\n    this._context = context2;\n    this._k = (1 - tension) / 6;\n  }\n  CardinalOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$4(this, x2, y2);\n          break;\n      }\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCardinalOpen = (function custom2(tension) {\n    function cardinal(context2) {\n      return new CardinalOpen(context2, tension);\n    }\n    cardinal.tension = function(tension2) {\n      return custom2(+tension2);\n    };\n    return cardinal;\n  })(0);\n  function point$3(that, x2, y2) {\n    var x12 = that._x1, y12 = that._y1, x22 = that._x2, y22 = that._y2;\n    if (that._l01_a > epsilon$5) {\n      var a2 = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n      x12 = (x12 * a2 - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n      y12 = (y12 * a2 - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n    }\n    if (that._l23_a > epsilon$5) {\n      var b2 = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m2 = 3 * that._l23_a * (that._l23_a + that._l12_a);\n      x22 = (x22 * b2 + that._x1 * that._l23_2a - x2 * that._l12_2a) / m2;\n      y22 = (y22 * b2 + that._y1 * that._l23_2a - y2 * that._l12_2a) / m2;\n    }\n    that._context.bezierCurveTo(x12, y12, x22, y22, that._x2, that._y2);\n  }\n  function CatmullRom(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRom.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x2, this._y2);\n          break;\n        case 3:\n          this.point(this._x2, this._y2);\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n        // falls through\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRom = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRom(context2, alpha) : new Cardinal(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function CatmullRomClosed(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRomClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 1: {\n          this._context.moveTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 2: {\n          this._context.lineTo(this._x3, this._y3);\n          this._context.closePath();\n          break;\n        }\n        case 3: {\n          this.point(this._x3, this._y3);\n          this.point(this._x4, this._y4);\n          this.point(this._x5, this._y5);\n          break;\n        }\n      }\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._x3 = x2, this._y3 = y2;\n          break;\n        case 1:\n          this._point = 2;\n          this._context.moveTo(this._x4 = x2, this._y4 = y2);\n          break;\n        case 2:\n          this._point = 3;\n          this._x5 = x2, this._y5 = y2;\n          break;\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRomClosed = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRomClosed(context2, alpha) : new CardinalClosed(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function CatmullRomOpen(context2, alpha) {\n    this._context = context2;\n    this._alpha = alpha;\n  }\n  CatmullRomOpen.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN;\n      this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line || this._line !== 0 && this._point === 3) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) {\n        var x23 = this._x2 - x2, y23 = this._y2 - y2;\n        this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n      }\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n          break;\n        case 3:\n          this._point = 4;\n        // falls through\n        default:\n          point$3(this, x2, y2);\n          break;\n      }\n      this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n      this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n      this._x0 = this._x1, this._x1 = this._x2, this._x2 = x2;\n      this._y0 = this._y1, this._y1 = this._y2, this._y2 = y2;\n    }\n  };\n  const curveCatmullRomOpen = (function custom2(alpha) {\n    function catmullRom(context2) {\n      return alpha ? new CatmullRomOpen(context2, alpha) : new CardinalOpen(context2, 0);\n    }\n    catmullRom.alpha = function(alpha2) {\n      return custom2(+alpha2);\n    };\n    return catmullRom;\n  })(0.5);\n  function LinearClosed(context2) {\n    this._context = context2;\n  }\n  LinearClosed.prototype = {\n    areaStart: noop$3,\n    areaEnd: noop$3,\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._point) this._context.closePath();\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      if (this._point) this._context.lineTo(x2, y2);\n      else this._point = 1, this._context.moveTo(x2, y2);\n    }\n  };\n  function curveLinearClosed(context2) {\n    return new LinearClosed(context2);\n  }\n  function sign$1(x2) {\n    return x2 < 0 ? -1 : 1;\n  }\n  function slope3(that, x2, y2) {\n    var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);\n    return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n  }\n  function slope2(that, t) {\n    var h2 = that._x1 - that._x0;\n    return h2 ? (3 * (that._y1 - that._y0) / h2 - t) / 2 : t;\n  }\n  function point$2(that, t02, t12) {\n    var x02 = that._x0, y02 = that._y0, x12 = that._x1, y12 = that._y1, dx = (x12 - x02) / 3;\n    that._context.bezierCurveTo(x02 + dx, y02 + dx * t02, x12 - dx, y12 - dx * t12, x12, y12);\n  }\n  function MonotoneX(context2) {\n    this._context = context2;\n  }\n  MonotoneX.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      switch (this._point) {\n        case 2:\n          this._context.lineTo(this._x1, this._y1);\n          break;\n        case 3:\n          point$2(this, this._t0, slope2(this, this._t0));\n          break;\n      }\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      var t12 = NaN;\n      x2 = +x2, y2 = +y2;\n      if (x2 === this._x1 && y2 === this._y1) return;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n          break;\n        case 2:\n          this._point = 3;\n          point$2(this, slope2(this, t12 = slope3(this, x2, y2)), t12);\n          break;\n        default:\n          point$2(this, this._t0, t12 = slope3(this, x2, y2));\n          break;\n      }\n      this._x0 = this._x1, this._x1 = x2;\n      this._y0 = this._y1, this._y1 = y2;\n      this._t0 = t12;\n    }\n  };\n  function MonotoneY(context2) {\n    this._context = new ReflectContext(context2);\n  }\n  (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x2, y2) {\n    MonotoneX.prototype.point.call(this, y2, x2);\n  };\n  function ReflectContext(context2) {\n    this._context = context2;\n  }\n  ReflectContext.prototype = {\n    moveTo: function(x2, y2) {\n      this._context.moveTo(y2, x2);\n    },\n    closePath: function() {\n      this._context.closePath();\n    },\n    lineTo: function(x2, y2) {\n      this._context.lineTo(y2, x2);\n    },\n    bezierCurveTo: function(x12, y12, x2, y2, x3, y3) {\n      this._context.bezierCurveTo(y12, x12, y2, x2, y3, x3);\n    }\n  };\n  function monotoneX(context2) {\n    return new MonotoneX(context2);\n  }\n  function monotoneY(context2) {\n    return new MonotoneY(context2);\n  }\n  function Natural(context2) {\n    this._context = context2;\n  }\n  Natural.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x = [];\n      this._y = [];\n    },\n    lineEnd: function() {\n      var x2 = this._x, y2 = this._y, n = x2.length;\n      if (n) {\n        this._line ? this._context.lineTo(x2[0], y2[0]) : this._context.moveTo(x2[0], y2[0]);\n        if (n === 2) {\n          this._context.lineTo(x2[1], y2[1]);\n        } else {\n          var px2 = controlPoints(x2), py2 = controlPoints(y2);\n          for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n            this._context.bezierCurveTo(px2[0][i0], py2[0][i0], px2[1][i0], py2[1][i0], x2[i1], y2[i1]);\n          }\n        }\n      }\n      if (this._line || this._line !== 0 && n === 1) this._context.closePath();\n      this._line = 1 - this._line;\n      this._x = this._y = null;\n    },\n    point: function(x2, y2) {\n      this._x.push(+x2);\n      this._y.push(+y2);\n    }\n  };\n  function controlPoints(x2) {\n    var i, n = x2.length - 1, m2, a2 = new Array(n), b2 = new Array(n), r = new Array(n);\n    a2[0] = 0, b2[0] = 2, r[0] = x2[0] + 2 * x2[1];\n    for (i = 1; i < n - 1; ++i) a2[i] = 1, b2[i] = 4, r[i] = 4 * x2[i] + 2 * x2[i + 1];\n    a2[n - 1] = 2, b2[n - 1] = 7, r[n - 1] = 8 * x2[n - 1] + x2[n];\n    for (i = 1; i < n; ++i) m2 = a2[i] / b2[i - 1], b2[i] -= m2, r[i] -= m2 * r[i - 1];\n    a2[n - 1] = r[n - 1] / b2[n - 1];\n    for (i = n - 2; i >= 0; --i) a2[i] = (r[i] - a2[i + 1]) / b2[i];\n    b2[n - 1] = (x2[n] + a2[n - 1]) / 2;\n    for (i = 0; i < n - 1; ++i) b2[i] = 2 * x2[i + 1] - a2[i + 1];\n    return [a2, b2];\n  }\n  function curveNatural(context2) {\n    return new Natural(context2);\n  }\n  function Step(context2, t) {\n    this._context = context2;\n    this._t = t;\n  }\n  Step.prototype = {\n    areaStart: function() {\n      this._line = 0;\n    },\n    areaEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._x = this._y = NaN;\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n      if (this._line || this._line !== 0 && this._point === 1) this._context.closePath();\n      if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n    },\n    point: function(x2, y2) {\n      x2 = +x2, y2 = +y2;\n      switch (this._point) {\n        case 0:\n          this._point = 1;\n          this._line ? this._context.lineTo(x2, y2) : this._context.moveTo(x2, y2);\n          break;\n        case 1:\n          this._point = 2;\n        // falls through\n        default: {\n          if (this._t <= 0) {\n            this._context.lineTo(this._x, y2);\n            this._context.lineTo(x2, y2);\n          } else {\n            var x12 = this._x * (1 - this._t) + x2 * this._t;\n            this._context.lineTo(x12, this._y);\n            this._context.lineTo(x12, y2);\n          }\n          break;\n        }\n      }\n      this._x = x2, this._y = y2;\n    }\n  };\n  function curveStep(context2) {\n    return new Step(context2, 0.5);\n  }\n  function stepBefore(context2) {\n    return new Step(context2, 0);\n  }\n  function stepAfter(context2) {\n    return new Step(context2, 1);\n  }\n  function domCanvas(w2, h2) {\n    if (typeof document !== \"undefined\" && document.createElement) {\n      const c2 = document.createElement(\"canvas\");\n      if (c2 && c2.getContext) {\n        c2.width = w2;\n        c2.height = h2;\n        return c2;\n      }\n    }\n    return null;\n  }\n  const domImage = () => typeof Image !== \"undefined\" ? Image : null;\n  function initRange(domain2, range2) {\n    switch (arguments.length) {\n      case 0:\n        break;\n      case 1:\n        this.range(domain2);\n        break;\n      default:\n        this.range(range2).domain(domain2);\n        break;\n    }\n    return this;\n  }\n  function initInterpolator(domain2, interpolator) {\n    switch (arguments.length) {\n      case 0:\n        break;\n      case 1: {\n        if (typeof domain2 === \"function\") this.interpolator(domain2);\n        else this.range(domain2);\n        break;\n      }\n      default: {\n        this.domain(domain2);\n        if (typeof interpolator === \"function\") this.interpolator(interpolator);\n        else this.range(interpolator);\n        break;\n      }\n    }\n    return this;\n  }\n  const implicit = Symbol(\"implicit\");\n  function ordinal() {\n    var index2 = new InternMap(), domain2 = [], range2 = [], unknown = implicit;\n    function scale2(d) {\n      let i = index2.get(d);\n      if (i === void 0) {\n        if (unknown !== implicit) return unknown;\n        index2.set(d, i = domain2.push(d) - 1);\n      }\n      return range2[i % range2.length];\n    }\n    scale2.domain = function(_) {\n      if (!arguments.length) return domain2.slice();\n      domain2 = [], index2 = new InternMap();\n      for (const value2 of _) {\n        if (index2.has(value2)) continue;\n        index2.set(value2, domain2.push(value2) - 1);\n      }\n      return scale2;\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), scale2) : range2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return ordinal(domain2, range2).unknown(unknown);\n    };\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function define2(constructor, factory, prototype2) {\n    constructor.prototype = factory.prototype = prototype2;\n    prototype2.constructor = constructor;\n  }\n  function extend(parent, definition2) {\n    var prototype2 = Object.create(parent.prototype);\n    for (var key2 in definition2) prototype2[key2] = definition2[key2];\n    return prototype2;\n  }\n  function Color$1() {\n  }\n  var darker = 0.7;\n  var brighter = 1 / darker;\n  var reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex = /^#([0-9a-f]{3,8})$/, reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`), reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`), reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`), reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`), reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`), reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n  var named = {\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  };\n  define2(Color$1, color$2, {\n    copy(channels) {\n      return Object.assign(new this.constructor(), this, channels);\n    },\n    displayable() {\n      return this.rgb().displayable();\n    },\n    hex: color_formatHex,\n    // Deprecated! Use color.formatHex.\n    formatHex: color_formatHex,\n    formatHex8: color_formatHex8,\n    formatHsl: color_formatHsl,\n    formatRgb: color_formatRgb,\n    toString: color_formatRgb\n  });\n  function color_formatHex() {\n    return this.rgb().formatHex();\n  }\n  function color_formatHex8() {\n    return this.rgb().formatHex8();\n  }\n  function color_formatHsl() {\n    return hslConvert(this).formatHsl();\n  }\n  function color_formatRgb() {\n    return this.rgb().formatRgb();\n  }\n  function color$2(format2) {\n    var m2, l;\n    format2 = (format2 + \"\").trim().toLowerCase();\n    return (m2 = reHex.exec(format2)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format2)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format2)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format2)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format2)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format2)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format2) ? rgbn(named[format2]) : format2 === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0) : null;\n  }\n  function rgbn(n) {\n    return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1);\n  }\n  function rgba(r, g, b2, a2) {\n    if (a2 <= 0) r = g = b2 = NaN;\n    return new Rgb(r, g, b2, a2);\n  }\n  function rgbConvert(o) {\n    if (!(o instanceof Color$1)) o = color$2(o);\n    if (!o) return new Rgb();\n    o = o.rgb();\n    return new Rgb(o.r, o.g, o.b, o.opacity);\n  }\n  function rgb$1(r, g, b2, opacity) {\n    return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b2, opacity == null ? 1 : opacity);\n  }\n  function Rgb(r, g, b2, opacity) {\n    this.r = +r;\n    this.g = +g;\n    this.b = +b2;\n    this.opacity = +opacity;\n  }\n  define2(Rgb, rgb$1, extend(Color$1, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n    },\n    rgb() {\n      return this;\n    },\n    clamp() {\n      return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n    },\n    displayable() {\n      return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1);\n    },\n    hex: rgb_formatHex,\n    // Deprecated! Use color.formatHex.\n    formatHex: rgb_formatHex,\n    formatHex8: rgb_formatHex8,\n    formatRgb: rgb_formatRgb,\n    toString: rgb_formatRgb\n  }));\n  function rgb_formatHex() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n  }\n  function rgb_formatHex8() {\n    return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n  }\n  function rgb_formatRgb() {\n    const a2 = clampa(this.opacity);\n    return `${a2 === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a2 === 1 ? \")\" : `, ${a2})`}`;\n  }\n  function clampa(opacity) {\n    return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n  }\n  function clampi(value2) {\n    return Math.max(0, Math.min(255, Math.round(value2) || 0));\n  }\n  function hex(value2) {\n    value2 = clampi(value2);\n    return (value2 < 16 ? \"0\" : \"\") + value2.toString(16);\n  }\n  function hsla(h2, s, l, a2) {\n    if (a2 <= 0) h2 = s = l = NaN;\n    else if (l <= 0 || l >= 1) h2 = s = NaN;\n    else if (s <= 0) h2 = NaN;\n    return new Hsl(h2, s, l, a2);\n  }\n  function hslConvert(o) {\n    if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Color$1)) o = color$2(o);\n    if (!o) return new Hsl();\n    if (o instanceof Hsl) return o;\n    o = o.rgb();\n    var r = o.r / 255, g = o.g / 255, b2 = o.b / 255, min2 = Math.min(r, g, b2), max2 = Math.max(r, g, b2), h2 = NaN, s = max2 - min2, l = (max2 + min2) / 2;\n    if (s) {\n      if (r === max2) h2 = (g - b2) / s + (g < b2) * 6;\n      else if (g === max2) h2 = (b2 - r) / s + 2;\n      else h2 = (r - g) / s + 4;\n      s /= l < 0.5 ? max2 + min2 : 2 - max2 - min2;\n      h2 *= 60;\n    } else {\n      s = l > 0 && l < 1 ? 0 : h2;\n    }\n    return new Hsl(h2, s, l, o.opacity);\n  }\n  function hsl$1(h2, s, l, opacity) {\n    return arguments.length === 1 ? hslConvert(h2) : new Hsl(h2, s, l, opacity == null ? 1 : opacity);\n  }\n  function Hsl(h2, s, l, opacity) {\n    this.h = +h2;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n  }\n  define2(Hsl, hsl$1, extend(Color$1, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Hsl(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h2 = this.h % 360 + (this.h < 0) * 360, s = isNaN(h2) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n      return new Rgb(\n        hsl2rgb(h2 >= 240 ? h2 - 240 : h2 + 120, m1, m2),\n        hsl2rgb(h2, m1, m2),\n        hsl2rgb(h2 < 120 ? h2 + 240 : h2 - 120, m1, m2),\n        this.opacity\n      );\n    },\n    clamp() {\n      return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n    },\n    displayable() {\n      return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1);\n    },\n    formatHsl() {\n      const a2 = clampa(this.opacity);\n      return `${a2 === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a2 === 1 ? \")\" : `, ${a2})`}`;\n    }\n  }));\n  function clamph(value2) {\n    value2 = (value2 || 0) % 360;\n    return value2 < 0 ? value2 + 360 : value2;\n  }\n  function clampt(value2) {\n    return Math.max(0, Math.min(1, value2 || 0));\n  }\n  function hsl2rgb(h2, m1, m2) {\n    return (h2 < 60 ? m1 + (m2 - m1) * h2 / 60 : h2 < 180 ? m2 : h2 < 240 ? m1 + (m2 - m1) * (240 - h2) / 60 : m1) * 255;\n  }\n  const radians$1 = Math.PI / 180;\n  const degrees$2 = 180 / Math.PI;\n  const K = 18, Xn = 0.96422, Yn = 1, Zn = 0.82521, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1;\n  function labConvert(o) {\n    if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n    if (o instanceof Hcl) return hcl2lab(o);\n    if (!(o instanceof Rgb)) o = rgbConvert(o);\n    var r = rgb2lrgb(o.r), g = rgb2lrgb(o.g), b2 = rgb2lrgb(o.b), y2 = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b2) / Yn), x2, z;\n    if (r === g && g === b2) x2 = z = y2;\n    else {\n      x2 = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b2) / Xn);\n      z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b2) / Zn);\n    }\n    return new Lab(116 * y2 - 16, 500 * (x2 - y2), 200 * (y2 - z), o.opacity);\n  }\n  function lab$1(l, a2, b2, opacity) {\n    return arguments.length === 1 ? labConvert(l) : new Lab(l, a2, b2, opacity == null ? 1 : opacity);\n  }\n  function Lab(l, a2, b2, opacity) {\n    this.l = +l;\n    this.a = +a2;\n    this.b = +b2;\n    this.opacity = +opacity;\n  }\n  define2(Lab, lab$1, extend(Color$1, {\n    brighter(k) {\n      return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    darker(k) {\n      return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n    },\n    rgb() {\n      var y2 = (this.l + 16) / 116, x2 = isNaN(this.a) ? y2 : y2 + this.a / 500, z = isNaN(this.b) ? y2 : y2 - this.b / 200;\n      x2 = Xn * lab2xyz(x2);\n      y2 = Yn * lab2xyz(y2);\n      z = Zn * lab2xyz(z);\n      return new Rgb(\n        lrgb2rgb(3.1338561 * x2 - 1.6168667 * y2 - 0.4906146 * z),\n        lrgb2rgb(-0.9787684 * x2 + 1.9161415 * y2 + 0.033454 * z),\n        lrgb2rgb(0.0719453 * x2 - 0.2289914 * y2 + 1.4052427 * z),\n        this.opacity\n      );\n    }\n  }));\n  function xyz2lab(t) {\n    return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n  }\n  function lab2xyz(t) {\n    return t > t1 ? t * t * t : t2 * (t - t0);\n  }\n  function lrgb2rgb(x2) {\n    return 255 * (x2 <= 31308e-7 ? 12.92 * x2 : 1.055 * Math.pow(x2, 1 / 2.4) - 0.055);\n  }\n  function rgb2lrgb(x2) {\n    return (x2 /= 255) <= 0.04045 ? x2 / 12.92 : Math.pow((x2 + 0.055) / 1.055, 2.4);\n  }\n  function hclConvert(o) {\n    if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n    if (!(o instanceof Lab)) o = labConvert(o);\n    if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n    var h2 = Math.atan2(o.b, o.a) * degrees$2;\n    return new Hcl(h2 < 0 ? h2 + 360 : h2, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n  }\n  function hcl$1(h2, c2, l, opacity) {\n    return arguments.length === 1 ? hclConvert(h2) : new Hcl(h2, c2, l, opacity == null ? 1 : opacity);\n  }\n  function Hcl(h2, c2, l, opacity) {\n    this.h = +h2;\n    this.c = +c2;\n    this.l = +l;\n    this.opacity = +opacity;\n  }\n  function hcl2lab(o) {\n    if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n    var h2 = o.h * radians$1;\n    return new Lab(o.l, Math.cos(h2) * o.c, Math.sin(h2) * o.c, o.opacity);\n  }\n  define2(Hcl, hcl$1, extend(Color$1, {\n    brighter(k) {\n      return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n    },\n    darker(k) {\n      return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n    },\n    rgb() {\n      return hcl2lab(this).rgb();\n    }\n  }));\n  var A = -0.14861, B$1 = 1.78277, C$1 = -0.29227, D$1 = -0.90649, E = 1.97294, ED = E * D$1, EB = E * B$1, BC_DA = B$1 * C$1 - D$1 * A;\n  function cubehelixConvert(o) {\n    if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n    if (!(o instanceof Rgb)) o = rgbConvert(o);\n    var r = o.r / 255, g = o.g / 255, b2 = o.b / 255, l = (BC_DA * b2 + ED * r - EB * g) / (BC_DA + ED - EB), bl2 = b2 - l, k = (E * (g - l) - C$1 * bl2) / D$1, s = Math.sqrt(k * k + bl2 * bl2) / (E * l * (1 - l)), h2 = s ? Math.atan2(k, bl2) * degrees$2 - 120 : NaN;\n    return new Cubehelix(h2 < 0 ? h2 + 360 : h2, s, l, o.opacity);\n  }\n  function cubehelix$1(h2, s, l, opacity) {\n    return arguments.length === 1 ? cubehelixConvert(h2) : new Cubehelix(h2, s, l, opacity == null ? 1 : opacity);\n  }\n  function Cubehelix(h2, s, l, opacity) {\n    this.h = +h2;\n    this.s = +s;\n    this.l = +l;\n    this.opacity = +opacity;\n  }\n  define2(Cubehelix, cubehelix$1, extend(Color$1, {\n    brighter(k) {\n      k = k == null ? brighter : Math.pow(brighter, k);\n      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    darker(k) {\n      k = k == null ? darker : Math.pow(darker, k);\n      return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n    },\n    rgb() {\n      var h2 = isNaN(this.h) ? 0 : (this.h + 120) * radians$1, l = +this.l, a2 = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh2 = Math.cos(h2), sinh2 = Math.sin(h2);\n      return new Rgb(\n        255 * (l + a2 * (A * cosh2 + B$1 * sinh2)),\n        255 * (l + a2 * (C$1 * cosh2 + D$1 * sinh2)),\n        255 * (l + a2 * (E * cosh2)),\n        this.opacity\n      );\n    }\n  }));\n  function basis(t12, v0, v1, v2, v3) {\n    var t22 = t12 * t12, t32 = t22 * t12;\n    return ((1 - 3 * t12 + 3 * t22 - t32) * v0 + (4 - 6 * t22 + 3 * t32) * v1 + (1 + 3 * t12 + 3 * t22 - 3 * t32) * v2 + t32 * v3) / 6;\n  }\n  function basis$1(values2) {\n    var n = values2.length - 1;\n    return function(t) {\n      var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values2[i], v2 = values2[i + 1], v0 = i > 0 ? values2[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values2[i + 2] : 2 * v2 - v1;\n      return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n  }\n  function basisClosed(values2) {\n    var n = values2.length;\n    return function(t) {\n      var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values2[(i + n - 1) % n], v1 = values2[i % n], v2 = values2[(i + 1) % n], v3 = values2[(i + 2) % n];\n      return basis((t - i / n) * n, v0, v1, v2, v3);\n    };\n  }\n  const constant$2 = (x2) => () => x2;\n  function linear$1(a2, d) {\n    return function(t) {\n      return a2 + t * d;\n    };\n  }\n  function exponential(a2, b2, y2) {\n    return a2 = Math.pow(a2, y2), b2 = Math.pow(b2, y2) - a2, y2 = 1 / y2, function(t) {\n      return Math.pow(a2 + t * b2, y2);\n    };\n  }\n  function hue$1(a2, b2) {\n    var d = b2 - a2;\n    return d ? linear$1(a2, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$2(isNaN(a2) ? b2 : a2);\n  }\n  function gamma(y2) {\n    return (y2 = +y2) === 1 ? nogamma : function(a2, b2) {\n      return b2 - a2 ? exponential(a2, b2, y2) : constant$2(isNaN(a2) ? b2 : a2);\n    };\n  }\n  function nogamma(a2, b2) {\n    var d = b2 - a2;\n    return d ? linear$1(a2, d) : constant$2(isNaN(a2) ? b2 : a2);\n  }\n  const rgb = (function rgbGamma(y2) {\n    var color2 = gamma(y2);\n    function rgb2(start, end) {\n      var r = color2((start = rgb$1(start)).r, (end = rgb$1(end)).r), g = color2(start.g, end.g), b2 = color2(start.b, end.b), opacity = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.r = r(t);\n        start.g = g(t);\n        start.b = b2(t);\n        start.opacity = opacity(t);\n        return start + \"\";\n      };\n    }\n    rgb2.gamma = rgbGamma;\n    return rgb2;\n  })(1);\n  function rgbSpline(spline) {\n    return function(colors2) {\n      var n = colors2.length, r = new Array(n), g = new Array(n), b2 = new Array(n), i, color2;\n      for (i = 0; i < n; ++i) {\n        color2 = rgb$1(colors2[i]);\n        r[i] = color2.r || 0;\n        g[i] = color2.g || 0;\n        b2[i] = color2.b || 0;\n      }\n      r = spline(r);\n      g = spline(g);\n      b2 = spline(b2);\n      color2.opacity = 1;\n      return function(t) {\n        color2.r = r(t);\n        color2.g = g(t);\n        color2.b = b2(t);\n        return color2 + \"\";\n      };\n    };\n  }\n  var rgbBasis = rgbSpline(basis$1);\n  var rgbBasisClosed = rgbSpline(basisClosed);\n  function numberArray(a2, b2) {\n    if (!b2) b2 = [];\n    var n = a2 ? Math.min(b2.length, a2.length) : 0, c2 = b2.slice(), i;\n    return function(t) {\n      for (i = 0; i < n; ++i) c2[i] = a2[i] * (1 - t) + b2[i] * t;\n      return c2;\n    };\n  }\n  function isNumberArray(x2) {\n    return ArrayBuffer.isView(x2) && !(x2 instanceof DataView);\n  }\n  function array$3(a2, b2) {\n    return (isNumberArray(b2) ? numberArray : genericArray)(a2, b2);\n  }\n  function genericArray(a2, b2) {\n    var nb = b2 ? b2.length : 0, na = a2 ? Math.min(nb, a2.length) : 0, x2 = new Array(na), c2 = new Array(nb), i;\n    for (i = 0; i < na; ++i) x2[i] = interpolate$1(a2[i], b2[i]);\n    for (; i < nb; ++i) c2[i] = b2[i];\n    return function(t) {\n      for (i = 0; i < na; ++i) c2[i] = x2[i](t);\n      return c2;\n    };\n  }\n  function date$1(a2, b2) {\n    var d = /* @__PURE__ */ new Date();\n    return a2 = +a2, b2 = +b2, function(t) {\n      return d.setTime(a2 * (1 - t) + b2 * t), d;\n    };\n  }\n  function interpolateNumber(a2, b2) {\n    return a2 = +a2, b2 = +b2, function(t) {\n      return a2 * (1 - t) + b2 * t;\n    };\n  }\n  function object(a2, b2) {\n    var i = {}, c2 = {}, k;\n    if (a2 === null || typeof a2 !== \"object\") a2 = {};\n    if (b2 === null || typeof b2 !== \"object\") b2 = {};\n    for (k in b2) {\n      if (k in a2) {\n        i[k] = interpolate$1(a2[k], b2[k]);\n      } else {\n        c2[k] = b2[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c2[k] = i[k](t);\n      return c2;\n    };\n  }\n  var reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, reB = new RegExp(reA.source, \"g\");\n  function zero$1(b2) {\n    return function() {\n      return b2;\n    };\n  }\n  function one$1(b2) {\n    return function(t) {\n      return b2(t) + \"\";\n    };\n  }\n  function string(a2, b2) {\n    var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a2 = a2 + \"\", b2 = b2 + \"\";\n    while ((am = reA.exec(a2)) && (bm = reB.exec(b2))) {\n      if ((bs = bm.index) > bi) {\n        bs = b2.slice(bi, bs);\n        if (s[i]) s[i] += bs;\n        else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm;\n        else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({ i, x: interpolateNumber(am, bm) });\n      }\n      bi = reB.lastIndex;\n    }\n    if (bi < b2.length) {\n      bs = b2.slice(bi);\n      if (s[i]) s[i] += bs;\n      else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? one$1(q[0].x) : zero$1(b2) : (b2 = q.length, function(t) {\n      for (var i2 = 0, o; i2 < b2; ++i2) s[(o = q[i2]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  function interpolate$1(a2, b2) {\n    var t = typeof b2, c2;\n    return b2 == null || t === \"boolean\" ? constant$2(b2) : (t === \"number\" ? interpolateNumber : t === \"string\" ? (c2 = color$2(b2)) ? (b2 = c2, rgb) : string : b2 instanceof color$2 ? rgb : b2 instanceof Date ? date$1 : isNumberArray(b2) ? numberArray : Array.isArray(b2) ? genericArray : typeof b2.valueOf !== \"function\" && typeof b2.toString !== \"function\" || isNaN(b2) ? object : interpolateNumber)(a2, b2);\n  }\n  function discrete$1(range2) {\n    var n = range2.length;\n    return function(t) {\n      return range2[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n    };\n  }\n  function hue(a2, b2) {\n    var i = hue$1(+a2, +b2);\n    return function(t) {\n      var x2 = i(t);\n      return x2 - 360 * Math.floor(x2 / 360);\n    };\n  }\n  function interpolateRound(a2, b2) {\n    return a2 = +a2, b2 = +b2, function(t) {\n      return Math.round(a2 * (1 - t) + b2 * t);\n    };\n  }\n  var degrees$1 = 180 / Math.PI;\n  var identity$4 = {\n    translateX: 0,\n    translateY: 0,\n    rotate: 0,\n    skewX: 0,\n    scaleX: 1,\n    scaleY: 1\n  };\n  function decompose(a2, b2, c2, d, e, f) {\n    var scaleX, scaleY2, skewX;\n    if (scaleX = Math.sqrt(a2 * a2 + b2 * b2)) a2 /= scaleX, b2 /= scaleX;\n    if (skewX = a2 * c2 + b2 * d) c2 -= a2 * skewX, d -= b2 * skewX;\n    if (scaleY2 = Math.sqrt(c2 * c2 + d * d)) c2 /= scaleY2, d /= scaleY2, skewX /= scaleY2;\n    if (a2 * d < b2 * c2) a2 = -a2, b2 = -b2, skewX = -skewX, scaleX = -scaleX;\n    return {\n      translateX: e,\n      translateY: f,\n      rotate: Math.atan2(b2, a2) * degrees$1,\n      skewX: Math.atan(skewX) * degrees$1,\n      scaleX,\n      scaleY: scaleY2\n    };\n  }\n  var svgNode;\n  function parseCss(value2) {\n    const m2 = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value2 + \"\");\n    return m2.isIdentity ? identity$4 : decompose(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f);\n  }\n  function parseSvg(value2) {\n    if (value2 == null) return identity$4;\n    if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n    svgNode.setAttribute(\"transform\", value2);\n    if (!(value2 = svgNode.transform.baseVal.consolidate())) return identity$4;\n    value2 = value2.matrix;\n    return decompose(value2.a, value2.b, value2.c, value2.d, value2.e, value2.f);\n  }\n  function interpolateTransform(parse2, pxComma, pxParen, degParen) {\n    function pop(s) {\n      return s.length ? s.pop() + \" \" : \"\";\n    }\n    function translate2(xa, ya, xb, yb, s, q) {\n      if (xa !== xb || ya !== yb) {\n        var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n        q.push({ i: i - 4, x: interpolateNumber(xa, xb) }, { i: i - 2, x: interpolateNumber(ya, yb) });\n      } else if (xb || yb) {\n        s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n      }\n    }\n    function rotate2(a2, b2, s, q) {\n      if (a2 !== b2) {\n        if (a2 - b2 > 180) b2 += 360;\n        else if (b2 - a2 > 180) a2 += 360;\n        q.push({ i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: interpolateNumber(a2, b2) });\n      } else if (b2) {\n        s.push(pop(s) + \"rotate(\" + b2 + degParen);\n      }\n    }\n    function skewX(a2, b2, s, q) {\n      if (a2 !== b2) {\n        q.push({ i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: interpolateNumber(a2, b2) });\n      } else if (b2) {\n        s.push(pop(s) + \"skewX(\" + b2 + degParen);\n      }\n    }\n    function scale2(xa, ya, xb, yb, s, q) {\n      if (xa !== xb || ya !== yb) {\n        var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n        q.push({ i: i - 4, x: interpolateNumber(xa, xb) }, { i: i - 2, x: interpolateNumber(ya, yb) });\n      } else if (xb !== 1 || yb !== 1) {\n        s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n      }\n    }\n    return function(a2, b2) {\n      var s = [], q = [];\n      a2 = parse2(a2), b2 = parse2(b2);\n      translate2(a2.translateX, a2.translateY, b2.translateX, b2.translateY, s, q);\n      rotate2(a2.rotate, b2.rotate, s, q);\n      skewX(a2.skewX, b2.skewX, s, q);\n      scale2(a2.scaleX, a2.scaleY, b2.scaleX, b2.scaleY, s, q);\n      a2 = b2 = null;\n      return function(t) {\n        var i = -1, n = q.length, o;\n        while (++i < n) s[(o = q[i]).i] = o.x(t);\n        return s.join(\"\");\n      };\n    };\n  }\n  var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\n  var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n  var epsilon2$1 = 1e-12;\n  function cosh(x2) {\n    return ((x2 = Math.exp(x2)) + 1 / x2) / 2;\n  }\n  function sinh(x2) {\n    return ((x2 = Math.exp(x2)) - 1 / x2) / 2;\n  }\n  function tanh(x2) {\n    return ((x2 = Math.exp(2 * x2)) - 1) / (x2 + 1);\n  }\n  const zoom = (function zoomRho(rho, rho2, rho4) {\n    function zoom2(p02, p1) {\n      var ux0 = p02[0], uy0 = p02[1], w0 = p02[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n      if (d2 < epsilon2$1) {\n        S = Math.log(w1 / w0) / rho;\n        i = function(t) {\n          return [\n            ux0 + t * dx,\n            uy0 + t * dy,\n            w0 * Math.exp(rho * t * S)\n          ];\n        };\n      } else {\n        var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n        S = (r1 - r0) / rho;\n        i = function(t) {\n          var s = t * S, coshr0 = cosh(r0), u2 = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n          return [\n            ux0 + u2 * dx,\n            uy0 + u2 * dy,\n            w0 * coshr0 / cosh(rho * s + r0)\n          ];\n        };\n      }\n      i.duration = S * 1e3 * rho / Math.SQRT2;\n      return i;\n    }\n    zoom2.rho = function(_) {\n      var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n      return zoomRho(_1, _2, _4);\n    };\n    return zoom2;\n  })(Math.SQRT2, 2, 4);\n  function hsl(hue2) {\n    return function(start, end) {\n      var h2 = hue2((start = hsl$1(start)).h, (end = hsl$1(end)).h), s = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h2(t);\n        start.s = s(t);\n        start.l = l(t);\n        start.opacity = opacity(t);\n        return start + \"\";\n      };\n    };\n  }\n  const hsl_default = hsl(hue$1);\n  var hslLong = hsl(nogamma);\n  function lab(start, end) {\n    var l = nogamma((start = lab$1(start)).l, (end = lab$1(end)).l), a2 = nogamma(start.a, end.a), b2 = nogamma(start.b, end.b), opacity = nogamma(start.opacity, end.opacity);\n    return function(t) {\n      start.l = l(t);\n      start.a = a2(t);\n      start.b = b2(t);\n      start.opacity = opacity(t);\n      return start + \"\";\n    };\n  }\n  function hcl(hue2) {\n    return function(start, end) {\n      var h2 = hue2((start = hcl$1(start)).h, (end = hcl$1(end)).h), c2 = nogamma(start.c, end.c), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity);\n      return function(t) {\n        start.h = h2(t);\n        start.c = c2(t);\n        start.l = l(t);\n        start.opacity = opacity(t);\n        return start + \"\";\n      };\n    };\n  }\n  const hcl_default = hcl(hue$1);\n  var hclLong = hcl(nogamma);\n  function cubehelix(hue2) {\n    return (function cubehelixGamma(y2) {\n      y2 = +y2;\n      function cubehelix2(start, end) {\n        var h2 = hue2((start = cubehelix$1(start)).h, (end = cubehelix$1(end)).h), s = nogamma(start.s, end.s), l = nogamma(start.l, end.l), opacity = nogamma(start.opacity, end.opacity);\n        return function(t) {\n          start.h = h2(t);\n          start.s = s(t);\n          start.l = l(Math.pow(t, y2));\n          start.opacity = opacity(t);\n          return start + \"\";\n        };\n      }\n      cubehelix2.gamma = cubehelixGamma;\n      return cubehelix2;\n    })(1);\n  }\n  const cubehelix_default = cubehelix(hue$1);\n  var cubehelixLong = cubehelix(nogamma);\n  function piecewise(interpolate2, values2) {\n    if (values2 === void 0) values2 = interpolate2, interpolate2 = interpolate$1;\n    var i = 0, n = values2.length - 1, v = values2[0], I = new Array(n < 0 ? 0 : n);\n    while (i < n) I[i] = interpolate2(v, v = values2[++i]);\n    return function(t) {\n      var i2 = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));\n      return I[i2](t - i2);\n    };\n  }\n  function quantize$2(interpolator, n) {\n    var samples = new Array(n);\n    for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n    return samples;\n  }\n  const $$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    interpolate: interpolate$1,\n    interpolateArray: array$3,\n    interpolateBasis: basis$1,\n    interpolateBasisClosed: basisClosed,\n    interpolateCubehelix: cubehelix_default,\n    interpolateCubehelixLong: cubehelixLong,\n    interpolateDate: date$1,\n    interpolateDiscrete: discrete$1,\n    interpolateHcl: hcl_default,\n    interpolateHclLong: hclLong,\n    interpolateHsl: hsl_default,\n    interpolateHslLong: hslLong,\n    interpolateHue: hue,\n    interpolateLab: lab,\n    interpolateNumber,\n    interpolateNumberArray: numberArray,\n    interpolateObject: object,\n    interpolateRgb: rgb,\n    interpolateRgbBasis: rgbBasis,\n    interpolateRgbBasisClosed: rgbBasisClosed,\n    interpolateRound,\n    interpolateString: string,\n    interpolateTransformCss,\n    interpolateTransformSvg,\n    interpolateZoom: zoom,\n    piecewise,\n    quantize: quantize$2\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function constants(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  function number$5(x2) {\n    return +x2;\n  }\n  var unit = [0, 1];\n  function identity$3(x2) {\n    return x2;\n  }\n  function normalize$4(a2, b2) {\n    return (b2 -= a2 = +a2) ? function(x2) {\n      return (x2 - a2) / b2;\n    } : constants(isNaN(b2) ? NaN : 0.5);\n  }\n  function clamper(a2, b2) {\n    var t;\n    if (a2 > b2) t = a2, a2 = b2, b2 = t;\n    return function(x2) {\n      return Math.max(a2, Math.min(b2, x2));\n    };\n  }\n  function bimap(domain2, range2, interpolate2) {\n    var d0 = domain2[0], d1 = domain2[1], r0 = range2[0], r1 = range2[1];\n    if (d1 < d0) d0 = normalize$4(d1, d0), r0 = interpolate2(r1, r0);\n    else d0 = normalize$4(d0, d1), r0 = interpolate2(r0, r1);\n    return function(x2) {\n      return r0(d0(x2));\n    };\n  }\n  function polymap(domain2, range2, interpolate2) {\n    var j = Math.min(domain2.length, range2.length) - 1, d = new Array(j), r = new Array(j), i = -1;\n    if (domain2[j] < domain2[0]) {\n      domain2 = domain2.slice().reverse();\n      range2 = range2.slice().reverse();\n    }\n    while (++i < j) {\n      d[i] = normalize$4(domain2[i], domain2[i + 1]);\n      r[i] = interpolate2(range2[i], range2[i + 1]);\n    }\n    return function(x2) {\n      var i2 = bisectRight$1(domain2, x2, 1, j) - 1;\n      return r[i2](d[i2](x2));\n    };\n  }\n  function copy$7(source2, target2) {\n    return target2.domain(source2.domain()).range(source2.range()).interpolate(source2.interpolate()).clamp(source2.clamp()).unknown(source2.unknown());\n  }\n  function transformer$3() {\n    var domain2 = unit, range2 = unit, interpolate2 = interpolate$1, transform2, untransform, unknown, clamp2 = identity$3, piecewise2, output2, input;\n    function rescale() {\n      var n = Math.min(domain2.length, range2.length);\n      if (clamp2 !== identity$3) clamp2 = clamper(domain2[0], domain2[n - 1]);\n      piecewise2 = n > 2 ? polymap : bimap;\n      output2 = input = null;\n      return scale2;\n    }\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : (output2 || (output2 = piecewise2(domain2.map(transform2), range2, interpolate2)))(transform2(clamp2(x2)));\n    }\n    scale2.invert = function(y2) {\n      return clamp2(untransform((input || (input = piecewise2(range2, domain2.map(transform2), interpolateNumber)))(y2)));\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2 = Array.from(_, number$5), rescale()) : domain2.slice();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();\n    };\n    scale2.rangeRound = function(_) {\n      return range2 = Array.from(_), interpolate2 = interpolateRound, rescale();\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = _ ? true : identity$3, rescale()) : clamp2 !== identity$3;\n    };\n    scale2.interpolate = function(_) {\n      return arguments.length ? (interpolate2 = _, rescale()) : interpolate2;\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t, u2) {\n      transform2 = t, untransform = u2;\n      return rescale();\n    };\n  }\n  function continuous$1() {\n    return transformer$3()(identity$3, identity$3);\n  }\n  function tickFormat$1(start, stop2, count2, specifier) {\n    var step = tickStep(start, stop2, count2), precision;\n    specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n    switch (specifier.type) {\n      case \"s\": {\n        var value2 = Math.max(Math.abs(start), Math.abs(stop2));\n        if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value2))) specifier.precision = precision;\n        return formatPrefix(specifier, value2);\n      }\n      case \"\":\n      case \"e\":\n      case \"g\":\n      case \"p\":\n      case \"r\": {\n        if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop2))))) specifier.precision = precision - (specifier.type === \"e\");\n        break;\n      }\n      case \"f\":\n      case \"%\": {\n        if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n        break;\n      }\n    }\n    return format$3(specifier);\n  }\n  function linearish(scale2) {\n    var domain2 = scale2.domain;\n    scale2.ticks = function(count2) {\n      var d = domain2();\n      return ticks(d[0], d[d.length - 1], count2 == null ? 10 : count2);\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      var d = domain2();\n      return tickFormat$1(d[0], d[d.length - 1], count2 == null ? 10 : count2, specifier);\n    };\n    scale2.nice = function(count2) {\n      if (count2 == null) count2 = 10;\n      var d = domain2();\n      var i0 = 0;\n      var i1 = d.length - 1;\n      var start = d[i0];\n      var stop2 = d[i1];\n      var prestep;\n      var step;\n      var maxIter = 10;\n      if (stop2 < start) {\n        step = start, start = stop2, stop2 = step;\n        step = i0, i0 = i1, i1 = step;\n      }\n      while (maxIter-- > 0) {\n        step = tickIncrement(start, stop2, count2);\n        if (step === prestep) {\n          d[i0] = start;\n          d[i1] = stop2;\n          return domain2(d);\n        } else if (step > 0) {\n          start = Math.floor(start / step) * step;\n          stop2 = Math.ceil(stop2 / step) * step;\n        } else if (step < 0) {\n          start = Math.ceil(start * step) / step;\n          stop2 = Math.floor(stop2 * step) / step;\n        } else {\n          break;\n        }\n        prestep = step;\n      }\n      return scale2;\n    };\n    return scale2;\n  }\n  function linear() {\n    var scale2 = continuous$1();\n    scale2.copy = function() {\n      return copy$7(scale2, linear());\n    };\n    initRange.apply(scale2, arguments);\n    return linearish(scale2);\n  }\n  function identity$2(domain2) {\n    var unknown;\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : x2;\n    }\n    scale2.invert = scale2;\n    scale2.domain = scale2.range = function(_) {\n      return arguments.length ? (domain2 = Array.from(_, number$5), scale2) : domain2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return identity$2(domain2).unknown(unknown);\n    };\n    domain2 = arguments.length ? Array.from(domain2, number$5) : [0, 1];\n    return linearish(scale2);\n  }\n  function nice(domain2, interval2) {\n    domain2 = domain2.slice();\n    var i0 = 0, i1 = domain2.length - 1, x02 = domain2[i0], x12 = domain2[i1], t;\n    if (x12 < x02) {\n      t = i0, i0 = i1, i1 = t;\n      t = x02, x02 = x12, x12 = t;\n    }\n    domain2[i0] = interval2.floor(x02);\n    domain2[i1] = interval2.ceil(x12);\n    return domain2;\n  }\n  function transformLog(x2) {\n    return Math.log(x2);\n  }\n  function transformExp(x2) {\n    return Math.exp(x2);\n  }\n  function transformLogn(x2) {\n    return -Math.log(-x2);\n  }\n  function transformExpn(x2) {\n    return -Math.exp(-x2);\n  }\n  function pow10(x2) {\n    return isFinite(x2) ? +(\"1e\" + x2) : x2 < 0 ? 0 : x2;\n  }\n  function powp(base2) {\n    return base2 === 10 ? pow10 : base2 === Math.E ? Math.exp : (x2) => Math.pow(base2, x2);\n  }\n  function logp(base2) {\n    return base2 === Math.E ? Math.log : base2 === 10 && Math.log10 || base2 === 2 && Math.log2 || (base2 = Math.log(base2), (x2) => Math.log(x2) / base2);\n  }\n  function reflect(f) {\n    return (x2, k) => -f(-x2, k);\n  }\n  function loggish(transform2) {\n    const scale2 = transform2(transformLog, transformExp);\n    const domain2 = scale2.domain;\n    let base2 = 10;\n    let logs;\n    let pows;\n    function rescale() {\n      logs = logp(base2), pows = powp(base2);\n      if (domain2()[0] < 0) {\n        logs = reflect(logs), pows = reflect(pows);\n        transform2(transformLogn, transformExpn);\n      } else {\n        transform2(transformLog, transformExp);\n      }\n      return scale2;\n    }\n    scale2.base = function(_) {\n      return arguments.length ? (base2 = +_, rescale()) : base2;\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2(_), rescale()) : domain2();\n    };\n    scale2.ticks = (count2) => {\n      const d = domain2();\n      let u2 = d[0];\n      let v = d[d.length - 1];\n      const r = v < u2;\n      if (r) [u2, v] = [v, u2];\n      let i = logs(u2);\n      let j = logs(v);\n      let k;\n      let t;\n      const n = count2 == null ? 10 : +count2;\n      let z = [];\n      if (!(base2 % 1) && j - i < n) {\n        i = Math.floor(i), j = Math.ceil(j);\n        if (u2 > 0) for (; i <= j; ++i) {\n          for (k = 1; k < base2; ++k) {\n            t = i < 0 ? k / pows(-i) : k * pows(i);\n            if (t < u2) continue;\n            if (t > v) break;\n            z.push(t);\n          }\n        }\n        else for (; i <= j; ++i) {\n          for (k = base2 - 1; k >= 1; --k) {\n            t = i > 0 ? k / pows(-i) : k * pows(i);\n            if (t < u2) continue;\n            if (t > v) break;\n            z.push(t);\n          }\n        }\n        if (z.length * 2 < n) z = ticks(u2, v, n);\n      } else {\n        z = ticks(i, j, Math.min(j - i, n)).map(pows);\n      }\n      return r ? z.reverse() : z;\n    };\n    scale2.tickFormat = (count2, specifier) => {\n      if (count2 == null) count2 = 10;\n      if (specifier == null) specifier = base2 === 10 ? \"s\" : \",\";\n      if (typeof specifier !== \"function\") {\n        if (!(base2 % 1) && (specifier = formatSpecifier(specifier)).precision == null) specifier.trim = true;\n        specifier = format$3(specifier);\n      }\n      if (count2 === Infinity) return specifier;\n      const k = Math.max(1, base2 * count2 / scale2.ticks().length);\n      return (d) => {\n        let i = d / pows(Math.round(logs(d)));\n        if (i * base2 < base2 - 0.5) i *= base2;\n        return i <= k ? specifier(d) : \"\";\n      };\n    };\n    scale2.nice = () => {\n      return domain2(nice(domain2(), {\n        floor: (x2) => pows(Math.floor(logs(x2))),\n        ceil: (x2) => pows(Math.ceil(logs(x2)))\n      }));\n    };\n    return scale2;\n  }\n  function log$2() {\n    const scale2 = loggish(transformer$3()).domain([1, 10]);\n    scale2.copy = () => copy$7(scale2, log$2()).base(scale2.base());\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function transformSymlog(c2) {\n    return function(x2) {\n      return Math.sign(x2) * Math.log1p(Math.abs(x2 / c2));\n    };\n  }\n  function transformSymexp(c2) {\n    return function(x2) {\n      return Math.sign(x2) * Math.expm1(Math.abs(x2)) * c2;\n    };\n  }\n  function symlogish(transform2) {\n    var c2 = 1, scale2 = transform2(transformSymlog(c2), transformSymexp(c2));\n    scale2.constant = function(_) {\n      return arguments.length ? transform2(transformSymlog(c2 = +_), transformSymexp(c2)) : c2;\n    };\n    return linearish(scale2);\n  }\n  function symlog() {\n    var scale2 = symlogish(transformer$3());\n    scale2.copy = function() {\n      return copy$7(scale2, symlog()).constant(scale2.constant());\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function transformPow(exponent2) {\n    return function(x2) {\n      return x2 < 0 ? -Math.pow(-x2, exponent2) : Math.pow(x2, exponent2);\n    };\n  }\n  function transformSqrt(x2) {\n    return x2 < 0 ? -Math.sqrt(-x2) : Math.sqrt(x2);\n  }\n  function transformSquare(x2) {\n    return x2 < 0 ? -x2 * x2 : x2 * x2;\n  }\n  function powish(transform2) {\n    var scale2 = transform2(identity$3, identity$3), exponent2 = 1;\n    function rescale() {\n      return exponent2 === 1 ? transform2(identity$3, identity$3) : exponent2 === 0.5 ? transform2(transformSqrt, transformSquare) : transform2(transformPow(exponent2), transformPow(1 / exponent2));\n    }\n    scale2.exponent = function(_) {\n      return arguments.length ? (exponent2 = +_, rescale()) : exponent2;\n    };\n    return linearish(scale2);\n  }\n  function pow$2() {\n    var scale2 = powish(transformer$3());\n    scale2.copy = function() {\n      return copy$7(scale2, pow$2()).exponent(scale2.exponent());\n    };\n    initRange.apply(scale2, arguments);\n    return scale2;\n  }\n  function sqrt$2() {\n    return pow$2.apply(null, arguments).exponent(0.5);\n  }\n  function quantile() {\n    var domain2 = [], range2 = [], thresholds = [], unknown;\n    function rescale() {\n      var i = 0, n = Math.max(1, range2.length);\n      thresholds = new Array(n - 1);\n      while (++i < n) thresholds[i - 1] = quantileSorted(domain2, i / n);\n      return scale2;\n    }\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : range2[bisectRight$1(thresholds, x2)];\n    }\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return i < 0 ? [NaN, NaN] : [\n        i > 0 ? thresholds[i - 1] : domain2[0],\n        i < thresholds.length ? thresholds[i] : domain2[domain2.length - 1]\n      ];\n    };\n    scale2.domain = function(_) {\n      if (!arguments.length) return domain2.slice();\n      domain2 = [];\n      for (let d of _) if (d != null && !isNaN(d = +d)) domain2.push(d);\n      domain2.sort(ascending$1);\n      return rescale();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), rescale()) : range2.slice();\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.quantiles = function() {\n      return thresholds.slice();\n    };\n    scale2.copy = function() {\n      return quantile().domain(domain2).range(range2).unknown(unknown);\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function quantize$1() {\n    var x02 = 0, x12 = 1, n = 1, domain2 = [0.5], range2 = [0, 1], unknown;\n    function scale2(x2) {\n      return x2 != null && x2 <= x2 ? range2[bisectRight$1(domain2, x2, 0, n)] : unknown;\n    }\n    function rescale() {\n      var i = -1;\n      domain2 = new Array(n);\n      while (++i < n) domain2[i] = ((i + 1) * x12 - (i - n) * x02) / (n + 1);\n      return scale2;\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12] = _, x02 = +x02, x12 = +x12, rescale()) : [x02, x12];\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (n = (range2 = Array.from(_)).length - 1, rescale()) : range2.slice();\n    };\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return i < 0 ? [NaN, NaN] : i < 1 ? [x02, domain2[0]] : i >= n ? [domain2[n - 1], x12] : [domain2[i - 1], domain2[i]];\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : scale2;\n    };\n    scale2.thresholds = function() {\n      return domain2.slice();\n    };\n    scale2.copy = function() {\n      return quantize$1().domain([x02, x12]).range(range2).unknown(unknown);\n    };\n    return initRange.apply(linearish(scale2), arguments);\n  }\n  function threshold() {\n    var domain2 = [0.5], range2 = [0, 1], unknown, n = 1;\n    function scale2(x2) {\n      return x2 != null && x2 <= x2 ? range2[bisectRight$1(domain2, x2, 0, n)] : unknown;\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? (domain2 = Array.from(_), n = Math.min(domain2.length, range2.length - 1), scale2) : domain2.slice();\n    };\n    scale2.range = function(_) {\n      return arguments.length ? (range2 = Array.from(_), n = Math.min(domain2.length, range2.length - 1), scale2) : range2.slice();\n    };\n    scale2.invertExtent = function(y2) {\n      var i = range2.indexOf(y2);\n      return [domain2[i - 1], domain2[i]];\n    };\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    scale2.copy = function() {\n      return threshold().domain(domain2).range(range2).unknown(unknown);\n    };\n    return initRange.apply(scale2, arguments);\n  }\n  function date(t) {\n    return new Date(t);\n  }\n  function number$4(t) {\n    return t instanceof Date ? +t : +/* @__PURE__ */ new Date(+t);\n  }\n  function calendar(ticks2, tickInterval, year, month, week2, day, hour, minute, second2, format2) {\n    var scale2 = continuous$1(), invert2 = scale2.invert, domain2 = scale2.domain;\n    var formatMillisecond = format2(\".%L\"), formatSecond = format2(\":%S\"), formatMinute = format2(\"%I:%M\"), formatHour = format2(\"%I %p\"), formatDay = format2(\"%a %d\"), formatWeek = format2(\"%b %d\"), formatMonth = format2(\"%B\"), formatYear2 = format2(\"%Y\");\n    function tickFormat2(date2) {\n      return (second2(date2) < date2 ? formatMillisecond : minute(date2) < date2 ? formatSecond : hour(date2) < date2 ? formatMinute : day(date2) < date2 ? formatHour : month(date2) < date2 ? week2(date2) < date2 ? formatDay : formatWeek : year(date2) < date2 ? formatMonth : formatYear2)(date2);\n    }\n    scale2.invert = function(y2) {\n      return new Date(invert2(y2));\n    };\n    scale2.domain = function(_) {\n      return arguments.length ? domain2(Array.from(_, number$4)) : domain2().map(date);\n    };\n    scale2.ticks = function(interval2) {\n      var d = domain2();\n      return ticks2(d[0], d[d.length - 1], interval2 == null ? 10 : interval2);\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      return specifier == null ? tickFormat2 : format2(specifier);\n    };\n    scale2.nice = function(interval2) {\n      var d = domain2();\n      if (!interval2 || typeof interval2.range !== \"function\") interval2 = tickInterval(d[0], d[d.length - 1], interval2 == null ? 10 : interval2);\n      return interval2 ? domain2(nice(d, interval2)) : scale2;\n    };\n    scale2.copy = function() {\n      return copy$7(scale2, calendar(ticks2, tickInterval, year, month, week2, day, hour, minute, second2, format2));\n    };\n    return scale2;\n  }\n  function time$1() {\n    return initRange.apply(calendar(timeTicks, timeTickInterval, timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute, second, timeFormat$1).domain([new Date(2e3, 0, 1), new Date(2e3, 0, 2)]), arguments);\n  }\n  function utcTime() {\n    return initRange.apply(calendar(utcTicks, utcTickInterval, utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, utcFormat$1).domain([Date.UTC(2e3, 0, 1), Date.UTC(2e3, 0, 2)]), arguments);\n  }\n  function transformer$2() {\n    var x02 = 0, x12 = 1, t02, t12, k10, transform2, interpolator = identity$3, clamp2 = false, unknown;\n    function scale2(x2) {\n      return x2 == null || isNaN(x2 = +x2) ? unknown : interpolator(k10 === 0 ? 0.5 : (x2 = (transform2(x2) - t02) * k10, clamp2 ? Math.max(0, Math.min(1, x2)) : x2));\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12] = _, t02 = transform2(x02 = +x02), t12 = transform2(x12 = +x12), k10 = t02 === t12 ? 0 : 1 / (t12 - t02), scale2) : [x02, x12];\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = !!_, scale2) : clamp2;\n    };\n    scale2.interpolator = function(_) {\n      return arguments.length ? (interpolator = _, scale2) : interpolator;\n    };\n    function range2(interpolate2) {\n      return function(_) {\n        var r0, r1;\n        return arguments.length ? ([r0, r1] = _, interpolator = interpolate2(r0, r1), scale2) : [interpolator(0), interpolator(1)];\n      };\n    }\n    scale2.range = range2(interpolate$1);\n    scale2.rangeRound = range2(interpolateRound);\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t) {\n      transform2 = t, t02 = t(x02), t12 = t(x12), k10 = t02 === t12 ? 0 : 1 / (t12 - t02);\n      return scale2;\n    };\n  }\n  function copy$6(source2, target2) {\n    return target2.domain(source2.domain()).interpolator(source2.interpolator()).clamp(source2.clamp()).unknown(source2.unknown());\n  }\n  function sequential() {\n    var scale2 = linearish(transformer$2()(identity$3));\n    scale2.copy = function() {\n      return copy$6(scale2, sequential());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialLog() {\n    var scale2 = loggish(transformer$2()).domain([1, 10]);\n    scale2.copy = function() {\n      return copy$6(scale2, sequentialLog()).base(scale2.base());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialSymlog() {\n    var scale2 = symlogish(transformer$2());\n    scale2.copy = function() {\n      return copy$6(scale2, sequentialSymlog()).constant(scale2.constant());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialPow() {\n    var scale2 = powish(transformer$2());\n    scale2.copy = function() {\n      return copy$6(scale2, sequentialPow()).exponent(scale2.exponent());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function sequentialSqrt() {\n    return sequentialPow.apply(null, arguments).exponent(0.5);\n  }\n  function transformer$1() {\n    var x02 = 0, x12 = 0.5, x2 = 1, s = 1, t02, t12, t22, k10, k21, interpolator = identity$3, transform2, clamp2 = false, unknown;\n    function scale2(x3) {\n      return isNaN(x3 = +x3) ? unknown : (x3 = 0.5 + ((x3 = +transform2(x3)) - t12) * (s * x3 < s * t12 ? k10 : k21), interpolator(clamp2 ? Math.max(0, Math.min(1, x3)) : x3));\n    }\n    scale2.domain = function(_) {\n      return arguments.length ? ([x02, x12, x2] = _, t02 = transform2(x02 = +x02), t12 = transform2(x12 = +x12), t22 = transform2(x2 = +x2), k10 = t02 === t12 ? 0 : 0.5 / (t12 - t02), k21 = t12 === t22 ? 0 : 0.5 / (t22 - t12), s = t12 < t02 ? -1 : 1, scale2) : [x02, x12, x2];\n    };\n    scale2.clamp = function(_) {\n      return arguments.length ? (clamp2 = !!_, scale2) : clamp2;\n    };\n    scale2.interpolator = function(_) {\n      return arguments.length ? (interpolator = _, scale2) : interpolator;\n    };\n    function range2(interpolate2) {\n      return function(_) {\n        var r0, r1, r2;\n        return arguments.length ? ([r0, r1, r2] = _, interpolator = piecewise(interpolate2, [r0, r1, r2]), scale2) : [interpolator(0), interpolator(0.5), interpolator(1)];\n      };\n    }\n    scale2.range = range2(interpolate$1);\n    scale2.rangeRound = range2(interpolateRound);\n    scale2.unknown = function(_) {\n      return arguments.length ? (unknown = _, scale2) : unknown;\n    };\n    return function(t) {\n      transform2 = t, t02 = t(x02), t12 = t(x12), t22 = t(x2), k10 = t02 === t12 ? 0 : 0.5 / (t12 - t02), k21 = t12 === t22 ? 0 : 0.5 / (t22 - t12), s = t12 < t02 ? -1 : 1;\n      return scale2;\n    };\n  }\n  function diverging() {\n    var scale2 = linearish(transformer$1()(identity$3));\n    scale2.copy = function() {\n      return copy$6(scale2, diverging());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingLog() {\n    var scale2 = loggish(transformer$1()).domain([0.1, 1, 10]);\n    scale2.copy = function() {\n      return copy$6(scale2, divergingLog()).base(scale2.base());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingSymlog() {\n    var scale2 = symlogish(transformer$1());\n    scale2.copy = function() {\n      return copy$6(scale2, divergingSymlog()).constant(scale2.constant());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingPow() {\n    var scale2 = powish(transformer$1());\n    scale2.copy = function() {\n      return copy$6(scale2, divergingPow()).exponent(scale2.exponent());\n    };\n    return initInterpolator.apply(scale2, arguments);\n  }\n  function divergingSqrt() {\n    return divergingPow.apply(null, arguments).exponent(0.5);\n  }\n  function colors$1(specifier) {\n    var n = specifier.length / 6 | 0, colors2 = new Array(n), i = 0;\n    while (i < n) colors2[i] = \"#\" + specifier.slice(i * 6, ++i * 6);\n    return colors2;\n  }\n  const schemeCategory10 = colors$1(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n  const schemeAccent = colors$1(\"7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666\");\n  const schemeDark2 = colors$1(\"1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666\");\n  const schemeObservable10 = colors$1(\"4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0\");\n  const schemePaired = colors$1(\"a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928\");\n  const schemePastel1 = colors$1(\"fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2\");\n  const schemePastel2 = colors$1(\"b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc\");\n  const schemeSet1 = colors$1(\"e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999\");\n  const schemeSet2 = colors$1(\"66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3\");\n  const schemeSet3 = colors$1(\"8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f\");\n  function bandSpace(count2, paddingInner, paddingOuter) {\n    const space = count2 - paddingInner + paddingOuter * 2;\n    return count2 ? space > 0 ? space : 1 : 0;\n  }\n  const Identity = \"identity\";\n  const Linear = \"linear\";\n  const Log$1 = \"log\";\n  const Pow = \"pow\";\n  const Sqrt = \"sqrt\";\n  const Symlog = \"symlog\";\n  const Time = \"time\";\n  const UTC = \"utc\";\n  const Sequential = \"sequential\";\n  const Diverging = \"diverging\";\n  const Quantile = \"quantile\";\n  const Quantize = \"quantize\";\n  const Threshold = \"threshold\";\n  const Ordinal = \"ordinal\";\n  const Point = \"point\";\n  const Band = \"band\";\n  const BinOrdinal = \"bin-ordinal\";\n  const Continuous = \"continuous\";\n  const Discrete$1 = \"discrete\";\n  const Discretizing = \"discretizing\";\n  const Interpolating = \"interpolating\";\n  const Temporal = \"temporal\";\n  function invertRange(scale2) {\n    return function(_) {\n      let lo = _[0], hi = _[1], t;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      return [scale2.invert(lo), scale2.invert(hi)];\n    };\n  }\n  function invertRangeExtent(scale2) {\n    return function(_) {\n      const range2 = scale2.range();\n      let lo = _[0], hi = _[1], min2 = -1, max2, t, i, n;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      for (i = 0, n = range2.length; i < n; ++i) {\n        if (range2[i] >= lo && range2[i] <= hi) {\n          if (min2 < 0) min2 = i;\n          max2 = i;\n        }\n      }\n      if (min2 < 0) return void 0;\n      lo = scale2.invertExtent(range2[min2]);\n      hi = scale2.invertExtent(range2[max2]);\n      return [lo[0] === void 0 ? lo[1] : lo[0], hi[1] === void 0 ? hi[0] : hi[1]];\n    };\n  }\n  function band() {\n    const scale2 = ordinal().unknown(void 0), domain2 = scale2.domain, ordinalRange = scale2.range;\n    let range$12 = [0, 1], step, bandwidth2, round = false, paddingInner = 0, paddingOuter = 0, align = 0.5;\n    delete scale2.unknown;\n    function rescale() {\n      const n = domain2().length, reverse2 = range$12[1] < range$12[0], stop2 = range$12[1 - reverse2], space = bandSpace(n, paddingInner, paddingOuter);\n      let start = range$12[reverse2 - 0];\n      step = (stop2 - start) / (space || 1);\n      if (round) {\n        step = Math.floor(step);\n      }\n      start += (stop2 - start - step * (n - paddingInner)) * align;\n      bandwidth2 = step * (1 - paddingInner);\n      if (round) {\n        start = Math.round(start);\n        bandwidth2 = Math.round(bandwidth2);\n      }\n      const values2 = range$3(n).map((i) => start + step * i);\n      return ordinalRange(reverse2 ? values2.reverse() : values2);\n    }\n    scale2.domain = function(_) {\n      if (arguments.length) {\n        domain2(_);\n        return rescale();\n      } else {\n        return domain2();\n      }\n    };\n    scale2.range = function(_) {\n      if (arguments.length) {\n        range$12 = [+_[0], +_[1]];\n        return rescale();\n      } else {\n        return range$12.slice();\n      }\n    };\n    scale2.rangeRound = function(_) {\n      range$12 = [+_[0], +_[1]];\n      round = true;\n      return rescale();\n    };\n    scale2.bandwidth = function() {\n      return bandwidth2;\n    };\n    scale2.step = function() {\n      return step;\n    };\n    scale2.round = function(_) {\n      if (arguments.length) {\n        round = !!_;\n        return rescale();\n      } else {\n        return round;\n      }\n    };\n    scale2.padding = function(_) {\n      if (arguments.length) {\n        paddingOuter = Math.max(0, Math.min(1, _));\n        paddingInner = paddingOuter;\n        return rescale();\n      } else {\n        return paddingInner;\n      }\n    };\n    scale2.paddingInner = function(_) {\n      if (arguments.length) {\n        paddingInner = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return paddingInner;\n      }\n    };\n    scale2.paddingOuter = function(_) {\n      if (arguments.length) {\n        paddingOuter = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return paddingOuter;\n      }\n    };\n    scale2.align = function(_) {\n      if (arguments.length) {\n        align = Math.max(0, Math.min(1, _));\n        return rescale();\n      } else {\n        return align;\n      }\n    };\n    scale2.invertRange = function(_) {\n      if (_[0] == null || _[1] == null) return;\n      const reverse2 = range$12[1] < range$12[0], values2 = reverse2 ? ordinalRange().reverse() : ordinalRange(), n = values2.length - 1;\n      let lo = +_[0], hi = +_[1], a2, b2, t;\n      if (lo !== lo || hi !== hi) return;\n      if (hi < lo) {\n        t = lo;\n        lo = hi;\n        hi = t;\n      }\n      if (hi < values2[0] || lo > range$12[1 - reverse2]) return;\n      a2 = Math.max(0, bisectRight$1(values2, lo) - 1);\n      b2 = lo === hi ? a2 : bisectRight$1(values2, hi) - 1;\n      if (lo - values2[a2] > bandwidth2 + 1e-10) ++a2;\n      if (reverse2) {\n        t = a2;\n        a2 = n - b2;\n        b2 = n - t;\n      }\n      return a2 > b2 ? void 0 : domain2().slice(a2, b2 + 1);\n    };\n    scale2.invert = function(_) {\n      const value2 = scale2.invertRange([_, _]);\n      return value2 ? value2[0] : value2;\n    };\n    scale2.copy = function() {\n      return band().domain(domain2()).range(range$12).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n    };\n    return rescale();\n  }\n  function pointish(scale2) {\n    const copy2 = scale2.copy;\n    scale2.padding = scale2.paddingOuter;\n    delete scale2.paddingInner;\n    scale2.copy = function() {\n      return pointish(copy2());\n    };\n    return scale2;\n  }\n  function point$1() {\n    return pointish(band().paddingInner(1));\n  }\n  var map = Array.prototype.map;\n  function numbers(_) {\n    return map.call(_, toNumber);\n  }\n  const slice$1 = Array.prototype.slice;\n  function scaleBinOrdinal() {\n    let domain2 = [], range2 = [];\n    function scale2(x2) {\n      return x2 == null || x2 !== x2 ? void 0 : range2[(bisectRight$1(domain2, x2) - 1) % range2.length];\n    }\n    scale2.domain = function(_) {\n      if (arguments.length) {\n        domain2 = numbers(_);\n        return scale2;\n      } else {\n        return domain2.slice();\n      }\n    };\n    scale2.range = function(_) {\n      if (arguments.length) {\n        range2 = slice$1.call(_);\n        return scale2;\n      } else {\n        return range2.slice();\n      }\n    };\n    scale2.tickFormat = function(count2, specifier) {\n      return tickFormat$1(domain2[0], peek$1(domain2), count2 == null ? 10 : count2, specifier);\n    };\n    scale2.copy = function() {\n      return scaleBinOrdinal().domain(scale2.domain()).range(scale2.range());\n    };\n    return scale2;\n  }\n  const scales = /* @__PURE__ */ new Map();\n  const VEGA_SCALE = Symbol(\"vega_scale\");\n  function registerScale(scale2) {\n    scale2[VEGA_SCALE] = true;\n    return scale2;\n  }\n  function isRegisteredScale(scale2) {\n    return scale2 && scale2[VEGA_SCALE] === true;\n  }\n  function create$8(type2, constructor, metadata2) {\n    const ctr = function scale2() {\n      const s = constructor();\n      if (!s.invertRange) {\n        s.invertRange = s.invert ? invertRange(s) : s.invertExtent ? invertRangeExtent(s) : void 0;\n      }\n      s.type = type2;\n      return registerScale(s);\n    };\n    ctr.metadata = toSet(array$5(metadata2));\n    return ctr;\n  }\n  function scale$6(type2, scale2, metadata2) {\n    if (arguments.length > 1) {\n      scales.set(type2, create$8(type2, scale2, metadata2));\n      return this;\n    } else {\n      return isValidScaleType(type2) ? scales.get(type2) : void 0;\n    }\n  }\n  scale$6(Identity, identity$2);\n  scale$6(Linear, linear, Continuous);\n  scale$6(Log$1, log$2, [Continuous, Log$1]);\n  scale$6(Pow, pow$2, Continuous);\n  scale$6(Sqrt, sqrt$2, Continuous);\n  scale$6(Symlog, symlog, Continuous);\n  scale$6(Time, time$1, [Continuous, Temporal]);\n  scale$6(UTC, utcTime, [Continuous, Temporal]);\n  scale$6(Sequential, sequential, [Continuous, Interpolating]);\n  scale$6(`${Sequential}-${Linear}`, sequential, [Continuous, Interpolating]);\n  scale$6(`${Sequential}-${Log$1}`, sequentialLog, [Continuous, Interpolating, Log$1]);\n  scale$6(`${Sequential}-${Pow}`, sequentialPow, [Continuous, Interpolating]);\n  scale$6(`${Sequential}-${Sqrt}`, sequentialSqrt, [Continuous, Interpolating]);\n  scale$6(`${Sequential}-${Symlog}`, sequentialSymlog, [Continuous, Interpolating]);\n  scale$6(`${Diverging}-${Linear}`, diverging, [Continuous, Interpolating]);\n  scale$6(`${Diverging}-${Log$1}`, divergingLog, [Continuous, Interpolating, Log$1]);\n  scale$6(`${Diverging}-${Pow}`, divergingPow, [Continuous, Interpolating]);\n  scale$6(`${Diverging}-${Sqrt}`, divergingSqrt, [Continuous, Interpolating]);\n  scale$6(`${Diverging}-${Symlog}`, divergingSymlog, [Continuous, Interpolating]);\n  scale$6(Quantile, quantile, [Discretizing, Quantile]);\n  scale$6(Quantize, quantize$1, Discretizing);\n  scale$6(Threshold, threshold, Discretizing);\n  scale$6(BinOrdinal, scaleBinOrdinal, [Discrete$1, Discretizing]);\n  scale$6(Ordinal, ordinal, Discrete$1);\n  scale$6(Band, band, Discrete$1);\n  scale$6(Point, point$1, Discrete$1);\n  function isValidScaleType(type2) {\n    return scales.has(type2);\n  }\n  function hasType(key2, type2) {\n    const s = scales.get(key2);\n    return s && s.metadata[type2];\n  }\n  function isContinuous(key2) {\n    return hasType(key2, Continuous);\n  }\n  function isDiscrete(key2) {\n    return hasType(key2, Discrete$1);\n  }\n  function isDiscretizing(key2) {\n    return hasType(key2, Discretizing);\n  }\n  function isLogarithmic(key2) {\n    return hasType(key2, Log$1);\n  }\n  function isTemporal(key2) {\n    return hasType(key2, Temporal);\n  }\n  function isInterpolating(key2) {\n    return hasType(key2, Interpolating);\n  }\n  function isQuantile(key2) {\n    return hasType(key2, Quantile);\n  }\n  const scaleProps = [\"clamp\", \"base\", \"constant\", \"exponent\"];\n  function interpolateRange(interpolator, range2) {\n    const start = range2[0], span2 = peek$1(range2) - start;\n    return function(i) {\n      return interpolator(start + i * span2);\n    };\n  }\n  function interpolateColors(colors2, type2, gamma2) {\n    return piecewise(interpolate(type2 || \"rgb\", gamma2), colors2);\n  }\n  function quantizeInterpolator(interpolator, count2) {\n    const samples = new Array(count2), n = count2 + 1;\n    for (let i = 0; i < count2; ) samples[i] = interpolator(++i / n);\n    return samples;\n  }\n  function scaleFraction(scale$12, min2, max2) {\n    const delta = max2 - min2;\n    let i, t, s;\n    if (!delta || !Number.isFinite(delta)) {\n      return constant$5(0.5);\n    } else {\n      i = (t = scale$12.type).indexOf(\"-\");\n      t = i < 0 ? t : t.slice(i + 1);\n      s = scale$6(t)().domain([min2, max2]).range([0, 1]);\n      scaleProps.forEach((m2) => scale$12[m2] ? s[m2](scale$12[m2]()) : 0);\n      return s;\n    }\n  }\n  function interpolate(type2, gamma2) {\n    const interp = $$1[method(type2)];\n    return gamma2 != null && interp && interp.gamma ? interp.gamma(gamma2) : interp;\n  }\n  function method(type2) {\n    return \"interpolate\" + type2.toLowerCase().split(\"-\").map((s) => s[0].toUpperCase() + s.slice(1)).join(\"\");\n  }\n  const continuous = {\n    blues: \"cfe1f2bed8eca8cee58fc1de74b2d75ba3cf4592c63181bd206fb2125ca40a4a90\",\n    greens: \"d3eecdc0e6baabdda594d3917bc77d60ba6c46ab5e329a512089430e7735036429\",\n    greys: \"e2e2e2d4d4d4c4c4c4b1b1b19d9d9d8888887575756262624d4d4d3535351e1e1e\",\n    oranges: \"fdd8b3fdc998fdb87bfda55efc9244f87f2cf06b18e4580bd14904b93d029f3303\",\n    purples: \"e2e1efd4d4e8c4c5e0b4b3d6a3a0cc928ec3827cb97566ae684ea25c3696501f8c\",\n    reds: \"fdc9b4fcb49afc9e80fc8767fa7051f6573fec3f2fdc2a25c81b1db21218970b13\",\n    blueGreen: \"d5efedc1e8e0a7ddd18bd2be70c6a958ba9144ad77319c5d2089460e7736036429\",\n    bluePurple: \"ccddecbad0e4a8c2dd9ab0d4919cc98d85be8b6db28a55a6873c99822287730f71\",\n    greenBlue: \"d3eecec5e8c3b1e1bb9bd8bb82cec269c2ca51b2cd3c9fc7288abd1675b10b60a1\",\n    orangeRed: \"fddcaffdcf9bfdc18afdad77fb9562f67d53ee6545e24932d32d1ebf130da70403\",\n    purpleBlue: \"dbdaebc8cee4b1c3de97b7d87bacd15b9fc93a90c01e7fb70b70ab056199045281\",\n    purpleBlueGreen: \"dbd8eac8cee4b0c3de93b7d872acd1549fc83892bb1c88a3097f8702736b016353\",\n    purpleRed: \"dcc9e2d3b3d7ce9eccd186c0da6bb2e14da0e23189d91e6fc61159ab07498f023a\",\n    redPurple: \"fccfccfcbec0faa9b8f98faff571a5ec539ddb3695c41b8aa908808d0179700174\",\n    yellowGreen: \"e4f4acd1eca0b9e2949ed68880c97c62bb6e47aa5e3297502083440e723b036034\",\n    yellowOrangeBrown: \"feeaa1fedd84fecc63feb746fca031f68921eb7215db5e0bc54c05ab3d038f3204\",\n    yellowOrangeRed: \"fee087fed16ffebd59fea849fd903efc7335f9522bee3423de1b20ca0b22af0225\",\n    blueOrange: \"134b852f78b35da2cb9dcae1d2e5eff2f0ebfce0bafbbf74e8932fc5690d994a07\",\n    brownBlueGreen: \"704108a0651ac79548e3c78af3e6c6eef1eac9e9e48ed1c74da79e187a72025147\",\n    purpleGreen: \"5b1667834792a67fb6c9aed3e6d6e8eff0efd9efd5aedda971bb75368e490e5e29\",\n    purpleOrange: \"4114696647968f83b7b9b4d6dadbebf3eeeafce0bafbbf74e8932fc5690d994a07\",\n    redBlue: \"8c0d25bf363adf745ef4ae91fbdbc9f2efeed2e5ef9dcae15da2cb2f78b3134b85\",\n    redGrey: \"8c0d25bf363adf745ef4ae91fcdccbfaf4f1e2e2e2c0c0c0969696646464343434\",\n    yellowGreenBlue: \"eff9bddbf1b4bde5b594d5b969c5be45b4c22c9ec02182b82163aa23479c1c3185\",\n    redYellowBlue: \"a50026d4322cf16e43fcac64fedd90faf8c1dcf1ecabd6e875abd04a74b4313695\",\n    redYellowGreen: \"a50026d4322cf16e43fcac63fedd8df9f7aed7ee8ea4d86e64bc6122964f006837\",\n    pinkYellowGreen: \"8e0152c0267edd72adf0b3d6faddedf5f3efe1f2cab6de8780bb474f9125276419\",\n    spectral: \"9e0142d13c4bf0704afcac63fedd8dfbf8b0e0f3a1a9dda269bda94288b55e4fa2\",\n    viridis: \"440154470e61481a6c482575472f7d443a834144873d4e8a39568c35608d31688e2d708e2a788e27818e23888e21918d1f988b1fa08822a8842ab07f35b77943bf7154c56866cc5d7ad1518fd744a5db36bcdf27d2e21be9e51afde725\",\n    magma: \"0000040404130b0924150e3720114b2c11603b0f704a107957157e651a80721f817f24828c29819a2e80a8327db6377ac43c75d1426fde4968e95462f1605df76f5cfa7f5efc8f65fe9f6dfeaf78febf84fece91fddea0fcedaffcfdbf\",\n    inferno: \"0000040403130c0826170c3b240c4f330a5f420a68500d6c5d126e6b176e781c6d86216b932667a12b62ae305cbb3755c73e4cd24644dd513ae65c30ed6925f3771af8850ffb9506fca50afcb519fac62df6d645f2e661f3f484fcffa4\",\n    plasma: \"0d088723069033059742039d5002a25d01a66a00a87801a88405a7900da49c179ea72198b12a90ba3488c33d80cb4779d35171da5a69e16462e76e5bed7953f2834cf68f44fa9a3dfca636fdb32ffec029fcce25f9dc24f5ea27f0f921\",\n    cividis: \"00205100235800265d002961012b65042e670831690d346b11366c16396d1c3c6e213f6e26426e2c456e31476e374a6e3c4d6e42506e47536d4c566d51586e555b6e5a5e6e5e616e62646f66676f6a6a706e6d717270717573727976737c79747f7c75827f758682768985778c8877908b78938e789691789a94789e9778a19b78a59e77a9a177aea575b2a874b6ab73bbaf71c0b26fc5b66dc9b96acebd68d3c065d8c462ddc85fe2cb5ce7cf58ebd355f0d652f3da4ff7de4cfae249fce647\",\n    rainbow: \"6e40aa883eb1a43db3bf3cafd83fa4ee4395fe4b83ff576eff6659ff7847ff8c38f3a130e2b72fcfcc36bee044aff05b8ff4576ff65b52f6673af27828ea8d1ddfa319d0b81cbecb23abd82f96e03d82e14c6edb5a5dd0664dbf6e40aa\",\n    sinebow: \"ff4040fc582af47218e78d0bd5a703bfbf00a7d5038de70b72f41858fc2a40ff402afc5818f4720be78d03d5a700bfbf03a7d50b8de71872f42a58fc4040ff582afc7218f48d0be7a703d5bf00bfd503a7e70b8df41872fc2a58ff4040\",\n    turbo: \"23171b32204a3e2a71453493493eae4b49c54a53d7485ee44569ee4074f53c7ff8378af93295f72e9ff42ba9ef28b3e926bce125c5d925cdcf27d5c629dcbc2de3b232e9a738ee9d3ff39347f68950f9805afc7765fd6e70fe667cfd5e88fc5795fb51a1f84badf545b9f140c5ec3cd0e637dae034e4d931ecd12ef4c92bfac029ffb626ffad24ffa223ff9821ff8d1fff821dff771cfd6c1af76118f05616e84b14df4111d5380fcb2f0dc0260ab61f07ac1805a313029b0f00950c00910b00\",\n    browns: \"eedbbdecca96e9b97ae4a865dc9856d18954c7784cc0673fb85536ad44339f3632\",\n    tealBlues: \"bce4d89dd3d181c3cb65b3c245a2b9368fae347da0306a932c5985\",\n    teals: \"bbdfdfa2d4d58ac9c975bcbb61b0af4da5a43799982b8b8c1e7f7f127273006667\",\n    warmGreys: \"dcd4d0cec5c1c0b8b4b3aaa7a59c9998908c8b827f7e7673726866665c5a59504e\",\n    goldGreen: \"f4d166d5ca60b6c35c98bb597cb25760a6564b9c533f8f4f33834a257740146c36\",\n    goldOrange: \"f4d166f8be5cf8aa4cf5983bf3852aef701be2621fd65322c54923b142239e3a26\",\n    goldRed: \"f4d166f6be59f9aa51fc964ef6834bee734ae56249db5247cf4244c43141b71d3e\",\n    lightGreyRed: \"efe9e6e1dad7d5cbc8c8bdb9bbaea9cd967ddc7b43e15f19df4011dc000b\",\n    lightGreyTeal: \"e4eaead6dcddc8ced2b7c2c7a6b4bc64b0bf22a6c32295c11f85be1876bc\",\n    lightMulti: \"e0f1f2c4e9d0b0de9fd0e181f6e072f6c053f3993ef77440ef4a3c\",\n    lightOrange: \"f2e7daf7d5baf9c499fab184fa9c73f68967ef7860e8645bde515bd43d5b\",\n    lightTealBlue: \"e3e9e0c0dccf9aceca7abfc859afc0389fb9328dad2f7ca0276b95255988\",\n    darkBlue: \"3232322d46681a5c930074af008cbf05a7ce25c0dd38daed50f3faffffff\",\n    darkGold: \"3c3c3c584b37725e348c7631ae8b2bcfa424ecc31ef9de30fff184ffffff\",\n    darkGreen: \"3a3a3a215748006f4d048942489e4276b340a6c63dd2d836ffeb2cffffaa\",\n    darkMulti: \"3737371f5287197d8c29a86995ce3fffe800ffffff\",\n    darkRed: \"3434347036339e3c38cc4037e75d1eec8620eeab29f0ce32ffeb2c\"\n  };\n  const discrete = {\n    accent: schemeAccent,\n    category10: schemeCategory10,\n    category20: \"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\",\n    category20b: \"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\",\n    category20c: \"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\",\n    dark2: schemeDark2,\n    observable10: schemeObservable10,\n    paired: schemePaired,\n    pastel1: schemePastel1,\n    pastel2: schemePastel2,\n    set1: schemeSet1,\n    set2: schemeSet2,\n    set3: schemeSet3,\n    tableau10: \"4c78a8f58518e4575672b7b254a24beeca3bb279a2ff9da69d755dbab0ac\",\n    tableau20: \"4c78a89ecae9f58518ffbf7954a24b88d27ab79a20f2cf5b43989483bcb6e45756ff9d9879706ebab0acd67195fcbfd2b279a2d6a5c99e765fd8b5a5\"\n  };\n  function colors(palette) {\n    if (isArray(palette)) return palette;\n    const n = palette.length / 6 | 0, c2 = new Array(n);\n    for (let i = 0; i < n; ) {\n      c2[i] = \"#\" + palette.slice(i * 6, ++i * 6);\n    }\n    return c2;\n  }\n  function apply(_, f) {\n    for (const k in _) scheme(k, f(_[k]));\n  }\n  const schemes = {};\n  apply(discrete, colors);\n  apply(continuous, (_) => interpolateColors(colors(_)));\n  function scheme(name, scheme2) {\n    name = name && name.toLowerCase();\n    if (arguments.length > 1) {\n      schemes[name] = scheme2;\n      return this;\n    } else {\n      return schemes[name];\n    }\n  }\n  const SymbolLegend = \"symbol\";\n  const DiscreteLegend = \"discrete\";\n  const GradientLegend = \"gradient\";\n  const defaultFormatter = (value2) => isArray(value2) ? value2.map((v) => String(v)) : String(value2);\n  const ascending = (a2, b2) => a2[1] - b2[1];\n  const descending = (a2, b2) => b2[1] - a2[1];\n  function tickCount(scale2, count2, minStep) {\n    let step;\n    if (isNumber$1(count2)) {\n      if (scale2.bins) {\n        count2 = Math.max(count2, scale2.bins.length);\n      }\n      if (minStep != null) {\n        count2 = Math.min(count2, Math.floor(span(scale2.domain()) / minStep || 1) + 1);\n      }\n    }\n    if (isObject$1(count2)) {\n      step = count2.step;\n      count2 = count2.interval;\n    }\n    if (isString(count2)) {\n      count2 = scale2.type === Time ? timeInterval(count2) : scale2.type == UTC ? utcInterval(count2) : error(\"Only time and utc scales accept interval strings.\");\n      if (step) count2 = count2.every(step);\n    }\n    return count2;\n  }\n  function validTicks(scale2, ticks2, count2) {\n    let range2 = scale2.range(), lo = range2[0], hi = peek$1(range2), cmp = ascending;\n    if (lo > hi) {\n      range2 = hi;\n      hi = lo;\n      lo = range2;\n      cmp = descending;\n    }\n    lo = Math.floor(lo);\n    hi = Math.ceil(hi);\n    ticks2 = ticks2.map((v) => [v, scale2(v)]).filter((_) => lo <= _[1] && _[1] <= hi).sort(cmp).map((_) => _[0]);\n    if (count2 > 0 && ticks2.length > 1) {\n      const endpoints = [ticks2[0], peek$1(ticks2)];\n      while (ticks2.length > count2 && ticks2.length >= 3) {\n        ticks2 = ticks2.filter((_, i) => !(i % 2));\n      }\n      if (ticks2.length < 3) {\n        ticks2 = endpoints;\n      }\n    }\n    return ticks2;\n  }\n  function tickValues(scale2, count2) {\n    return scale2.bins ? validTicks(scale2, scale2.bins, count2) : scale2.ticks ? scale2.ticks(count2) : scale2.domain();\n  }\n  function tickFormat(locale2, scale2, count2, specifier, formatType, noSkip) {\n    const type2 = scale2.type;\n    let format2 = defaultFormatter;\n    if (type2 === Time || formatType === Time) {\n      format2 = locale2.timeFormat(specifier);\n    } else if (type2 === UTC || formatType === UTC) {\n      format2 = locale2.utcFormat(specifier);\n    } else if (isLogarithmic(type2)) {\n      const varfmt = locale2.formatFloat(specifier);\n      if (noSkip || scale2.bins) {\n        format2 = varfmt;\n      } else {\n        const test2 = tickLog(scale2, count2, false);\n        format2 = (_) => test2(_) ? varfmt(_) : \"\";\n      }\n    } else if (scale2.tickFormat) {\n      const d = scale2.domain();\n      format2 = locale2.formatSpan(d[0], d[d.length - 1], count2, specifier);\n    } else if (specifier) {\n      format2 = locale2.format(specifier);\n    }\n    return format2;\n  }\n  function tickLog(scale2, count2, values2) {\n    const ticks2 = tickValues(scale2, count2), base2 = scale2.base(), logb = Math.log(base2), k = Math.max(1, base2 * count2 / ticks2.length);\n    const test2 = (d) => {\n      let i = d / Math.pow(base2, Math.round(Math.log(d) / logb));\n      if (i * base2 < base2 - 0.5) i *= base2;\n      return i <= k;\n    };\n    return values2 ? ticks2.filter(test2) : test2;\n  }\n  const symbols$1 = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"thresholds\",\n    [Threshold]: \"domain\"\n  };\n  const formats = {\n    [Quantile]: \"quantiles\",\n    [Quantize]: \"domain\"\n  };\n  function labelValues(scale2, count2) {\n    return scale2.bins ? binValues(scale2.bins) : scale2.type === Log$1 ? tickLog(scale2, count2, true) : symbols$1[scale2.type] ? thresholdValues(scale2[symbols$1[scale2.type]]()) : tickValues(scale2, count2);\n  }\n  function thresholdFormat(locale2, scale2, specifier) {\n    const _ = scale2[formats[scale2.type]](), n = _.length;\n    let d = n > 1 ? _[1] - _[0] : _[0], i;\n    for (i = 1; i < n; ++i) {\n      d = Math.min(d, _[i] - _[i - 1]);\n    }\n    return locale2.formatSpan(0, d, 3 * 10, specifier);\n  }\n  function thresholdValues(thresholds) {\n    const values2 = [-Infinity].concat(thresholds);\n    values2.max = Infinity;\n    return values2;\n  }\n  function binValues(bins) {\n    const values2 = bins.slice(0, -1);\n    values2.max = peek$1(bins);\n    return values2;\n  }\n  const isDiscreteRange = (scale2) => symbols$1[scale2.type] || scale2.bins;\n  function labelFormat(locale2, scale2, count2, type2, specifier, formatType, noSkip) {\n    const format2 = formats[scale2.type] && formatType !== Time && formatType !== UTC ? thresholdFormat(locale2, scale2, specifier) : tickFormat(locale2, scale2, count2, specifier, formatType, noSkip);\n    return type2 === SymbolLegend && isDiscreteRange(scale2) ? formatRange(format2) : type2 === DiscreteLegend ? formatDiscrete(format2) : formatPoint(format2);\n  }\n  const formatRange = (format2) => (value2, index2, array2) => {\n    const limit = get$3(array2[index2 + 1], get$3(array2.max, Infinity)), lo = formatValue$1(value2, format2), hi = formatValue$1(limit, format2);\n    return lo && hi ? lo + \" – \" + hi : hi ? \"< \" + hi : \"≥ \" + lo;\n  };\n  const get$3 = (value2, dflt) => value2 != null ? value2 : dflt;\n  const formatDiscrete = (format2) => (value2, index2) => index2 ? format2(value2) : null;\n  const formatPoint = (format2) => (value2) => format2(value2);\n  const formatValue$1 = (value2, format2) => Number.isFinite(value2) ? format2(value2) : null;\n  function labelFraction(scale2) {\n    const domain2 = scale2.domain(), count2 = domain2.length - 1;\n    let lo = +domain2[0], hi = +peek$1(domain2), span2 = hi - lo;\n    if (scale2.type === Threshold) {\n      const adjust = count2 ? span2 / count2 : 0.1;\n      lo -= adjust;\n      hi += adjust;\n      span2 = hi - lo;\n    }\n    return (value2) => (value2 - lo) / span2;\n  }\n  function format$1(locale2, scale2, specifier, formatType) {\n    const type2 = formatType || scale2.type;\n    if (isString(specifier) && isTemporal(type2)) {\n      specifier = specifier.replace(/%a/g, \"%A\").replace(/%b/g, \"%B\");\n    }\n    return !specifier && type2 === Time ? locale2.timeFormat(\"%A, %d %B %Y, %X\") : !specifier && type2 === UTC ? locale2.utcFormat(\"%A, %d %B %Y, %X UTC\") : labelFormat(locale2, scale2, 5, null, specifier, formatType, true);\n  }\n  function domainCaption(locale2, scale2, opt) {\n    opt = opt || {};\n    const max2 = Math.max(3, opt.maxlen || 7), fmt = format$1(locale2, scale2, opt.format, opt.formatType);\n    if (isDiscretizing(scale2.type)) {\n      const v = labelValues(scale2).slice(1).map(fmt), n = v.length;\n      return `${n} boundar${n === 1 ? \"y\" : \"ies\"}: ${v.join(\", \")}`;\n    } else if (isDiscrete(scale2.type)) {\n      const d = scale2.domain(), n = d.length, v = n > max2 ? d.slice(0, max2 - 2).map(fmt).join(\", \") + \", ending with \" + d.slice(-1).map(fmt) : d.map(fmt).join(\", \");\n      return `${n} value${n === 1 ? \"\" : \"s\"}: ${v}`;\n    } else {\n      const d = scale2.domain();\n      return `values from ${fmt(d[0])} to ${fmt(peek$1(d))}`;\n    }\n  }\n  let gradient_id = 0;\n  function resetSVGGradientId() {\n    gradient_id = 0;\n  }\n  const patternPrefix = \"p_\";\n  function isGradient(value2) {\n    return value2 && value2.gradient;\n  }\n  function gradientRef(g, defs, base2) {\n    const type2 = g.gradient;\n    let id2 = g.id, prefix = type2 === \"radial\" ? patternPrefix : \"\";\n    if (!id2) {\n      id2 = g.id = \"gradient_\" + gradient_id++;\n      if (type2 === \"radial\") {\n        g.x1 = get$2(g.x1, 0.5);\n        g.y1 = get$2(g.y1, 0.5);\n        g.r1 = get$2(g.r1, 0);\n        g.x2 = get$2(g.x2, 0.5);\n        g.y2 = get$2(g.y2, 0.5);\n        g.r2 = get$2(g.r2, 0.5);\n        prefix = patternPrefix;\n      } else {\n        g.x1 = get$2(g.x1, 0);\n        g.y1 = get$2(g.y1, 0);\n        g.x2 = get$2(g.x2, 1);\n        g.y2 = get$2(g.y2, 0);\n      }\n    }\n    defs[id2] = g;\n    return \"url(\" + (base2 || \"\") + \"#\" + prefix + id2 + \")\";\n  }\n  function get$2(val, def2) {\n    return val != null ? val : def2;\n  }\n  function Gradient$1(p02, p1) {\n    var stops = [], gradient2;\n    return gradient2 = {\n      gradient: \"linear\",\n      x1: p02 ? p02[0] : 0,\n      y1: p02 ? p02[1] : 0,\n      x2: p1 ? p1[0] : 1,\n      y2: p1 ? p1[1] : 0,\n      stops,\n      stop: function(offset2, color2) {\n        stops.push({\n          offset: offset2,\n          color: color2\n        });\n        return gradient2;\n      }\n    };\n  }\n  const lookup$4 = {\n    \"basis\": {\n      curve: curveBasis\n    },\n    \"basis-closed\": {\n      curve: curveBasisClosed\n    },\n    \"basis-open\": {\n      curve: curveBasisOpen\n    },\n    \"bundle\": {\n      curve: curveBundle,\n      tension: \"beta\",\n      value: 0.85\n    },\n    \"cardinal\": {\n      curve: curveCardinal,\n      tension: \"tension\",\n      value: 0\n    },\n    \"cardinal-open\": {\n      curve: curveCardinalOpen,\n      tension: \"tension\",\n      value: 0\n    },\n    \"cardinal-closed\": {\n      curve: curveCardinalClosed,\n      tension: \"tension\",\n      value: 0\n    },\n    \"catmull-rom\": {\n      curve: curveCatmullRom,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"catmull-rom-closed\": {\n      curve: curveCatmullRomClosed,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"catmull-rom-open\": {\n      curve: curveCatmullRomOpen,\n      tension: \"alpha\",\n      value: 0.5\n    },\n    \"linear\": {\n      curve: curveLinear\n    },\n    \"linear-closed\": {\n      curve: curveLinearClosed\n    },\n    \"monotone\": {\n      horizontal: monotoneY,\n      vertical: monotoneX\n    },\n    \"natural\": {\n      curve: curveNatural\n    },\n    \"step\": {\n      curve: curveStep\n    },\n    \"step-after\": {\n      curve: stepAfter\n    },\n    \"step-before\": {\n      curve: stepBefore\n    }\n  };\n  function curves(type2, orientation, tension) {\n    var entry2 = has$1(lookup$4, type2) && lookup$4[type2], curve2 = null;\n    if (entry2) {\n      curve2 = entry2.curve || entry2[orientation || \"vertical\"];\n      if (entry2.tension && tension != null) {\n        curve2 = curve2[entry2.tension](tension);\n      }\n    }\n    return curve2;\n  }\n  const paramCounts = {\n    m: 2,\n    l: 2,\n    h: 1,\n    v: 1,\n    z: 0,\n    c: 6,\n    s: 4,\n    q: 4,\n    t: 2,\n    a: 7\n  };\n  const commandPattern = /[mlhvzcsqta]([^mlhvzcsqta]+|$)/gi;\n  const numberPattern = /^[+-]?(([0-9]*\\.[0-9]+)|([0-9]+\\.)|([0-9]+))([eE][+-]?[0-9]+)?/;\n  const spacePattern = /^((\\s+,?\\s*)|(,\\s*))/;\n  const flagPattern = /^[01]/;\n  function parse$3(path2) {\n    const commands = [];\n    const matches = path2.match(commandPattern) || [];\n    matches.forEach((str) => {\n      let cmd = str[0];\n      const type2 = cmd.toLowerCase();\n      const paramCount = paramCounts[type2];\n      const params2 = parseParams(type2, paramCount, str.slice(1).trim());\n      const count2 = params2.length;\n      if (count2 < paramCount || count2 && count2 % paramCount !== 0) {\n        throw Error(\"Invalid SVG path, incorrect parameter count\");\n      }\n      commands.push([cmd, ...params2.slice(0, paramCount)]);\n      if (count2 === paramCount) {\n        return;\n      }\n      if (type2 === \"m\") {\n        cmd = cmd === \"M\" ? \"L\" : \"l\";\n      }\n      for (let i = paramCount; i < count2; i += paramCount) {\n        commands.push([cmd, ...params2.slice(i, i + paramCount)]);\n      }\n    });\n    return commands;\n  }\n  function parseParams(type2, paramCount, segment) {\n    const params2 = [];\n    for (let index2 = 0; paramCount && index2 < segment.length; ) {\n      for (let i = 0; i < paramCount; ++i) {\n        const pattern = type2 === \"a\" && (i === 3 || i === 4) ? flagPattern : numberPattern;\n        const match2 = segment.slice(index2).match(pattern);\n        if (match2 === null) {\n          throw Error(\"Invalid SVG path, incorrect parameter type\");\n        }\n        index2 += match2[0].length;\n        params2.push(+match2[0]);\n        const ws = segment.slice(index2).match(spacePattern);\n        if (ws !== null) {\n          index2 += ws[0].length;\n        }\n      }\n    }\n    return params2;\n  }\n  const DegToRad = Math.PI / 180;\n  const Epsilon = 1e-14;\n  const HalfPi = Math.PI / 2;\n  const Tau = Math.PI * 2;\n  const HalfSqrt3 = Math.sqrt(3) / 2;\n  var segmentCache = {};\n  var bezierCache = {};\n  var join$1 = [].join;\n  function segments(x2, y2, rx, ry, large, sweep, rotateX2, ox, oy) {\n    const key2 = join$1.call(arguments);\n    if (segmentCache[key2]) {\n      return segmentCache[key2];\n    }\n    const th = rotateX2 * DegToRad;\n    const sin_th = Math.sin(th);\n    const cos_th = Math.cos(th);\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n    const px2 = cos_th * (ox - x2) * 0.5 + sin_th * (oy - y2) * 0.5;\n    const py2 = cos_th * (oy - y2) * 0.5 - sin_th * (ox - x2) * 0.5;\n    let pl = px2 * px2 / (rx * rx) + py2 * py2 / (ry * ry);\n    if (pl > 1) {\n      pl = Math.sqrt(pl);\n      rx *= pl;\n      ry *= pl;\n    }\n    const a00 = cos_th / rx;\n    const a01 = sin_th / rx;\n    const a10 = -sin_th / ry;\n    const a11 = cos_th / ry;\n    const x02 = a00 * ox + a01 * oy;\n    const y02 = a10 * ox + a11 * oy;\n    const x12 = a00 * x2 + a01 * y2;\n    const y12 = a10 * x2 + a11 * y2;\n    const d = (x12 - x02) * (x12 - x02) + (y12 - y02) * (y12 - y02);\n    let sfactor_sq = 1 / d - 0.25;\n    if (sfactor_sq < 0) sfactor_sq = 0;\n    let sfactor = Math.sqrt(sfactor_sq);\n    if (sweep == large) sfactor = -sfactor;\n    const xc = 0.5 * (x02 + x12) - sfactor * (y12 - y02);\n    const yc = 0.5 * (y02 + y12) + sfactor * (x12 - x02);\n    const th0 = Math.atan2(y02 - yc, x02 - xc);\n    const th1 = Math.atan2(y12 - yc, x12 - xc);\n    let th_arc = th1 - th0;\n    if (th_arc < 0 && sweep === 1) {\n      th_arc += Tau;\n    } else if (th_arc > 0 && sweep === 0) {\n      th_arc -= Tau;\n    }\n    const segs = Math.ceil(Math.abs(th_arc / (HalfPi + 1e-3)));\n    const result = [];\n    for (let i = 0; i < segs; ++i) {\n      const th2 = th0 + i * th_arc / segs;\n      const th3 = th0 + (i + 1) * th_arc / segs;\n      result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];\n    }\n    return segmentCache[key2] = result;\n  }\n  function bezier(params2) {\n    const key2 = join$1.call(params2);\n    if (bezierCache[key2]) {\n      return bezierCache[key2];\n    }\n    var cx = params2[0], cy = params2[1], th0 = params2[2], th1 = params2[3], rx = params2[4], ry = params2[5], sin_th = params2[6], cos_th = params2[7];\n    const a00 = cos_th * rx;\n    const a01 = -sin_th * ry;\n    const a10 = sin_th * rx;\n    const a11 = cos_th * ry;\n    const cos_th0 = Math.cos(th0);\n    const sin_th0 = Math.sin(th0);\n    const cos_th1 = Math.cos(th1);\n    const sin_th1 = Math.sin(th1);\n    const th_half = 0.5 * (th1 - th0);\n    const sin_th_h2 = Math.sin(th_half * 0.5);\n    const t = 8 / 3 * sin_th_h2 * sin_th_h2 / Math.sin(th_half);\n    const x12 = cx + cos_th0 - t * sin_th0;\n    const y12 = cy + sin_th0 + t * cos_th0;\n    const x3 = cx + cos_th1;\n    const y3 = cy + sin_th1;\n    const x2 = x3 + t * sin_th1;\n    const y2 = y3 - t * cos_th1;\n    return bezierCache[key2] = [a00 * x12 + a01 * y12, a10 * x12 + a11 * y12, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3];\n  }\n  const temp = [\"l\", 0, 0, 0, 0, 0, 0, 0];\n  function scale$1$1(current, sX, sY) {\n    const c2 = temp[0] = current[0];\n    if (c2 === \"a\" || c2 === \"A\") {\n      temp[1] = sX * current[1];\n      temp[2] = sY * current[2];\n      temp[3] = current[3];\n      temp[4] = current[4];\n      temp[5] = current[5];\n      temp[6] = sX * current[6];\n      temp[7] = sY * current[7];\n    } else if (c2 === \"h\" || c2 === \"H\") {\n      temp[1] = sX * current[1];\n    } else if (c2 === \"v\" || c2 === \"V\") {\n      temp[1] = sY * current[1];\n    } else {\n      for (var i = 1, n = current.length; i < n; ++i) {\n        temp[i] = (i % 2 == 1 ? sX : sY) * current[i];\n      }\n    }\n    return temp;\n  }\n  function pathRender(context2, path2, l, t, sX, sY) {\n    var current, previous = null, x2 = 0, y2 = 0, controlX = 0, controlY = 0, tempX, tempY, tempControlX, tempControlY, anchorX = 0, anchorY = 0;\n    if (l == null) l = 0;\n    if (t == null) t = 0;\n    if (sX == null) sX = 1;\n    if (sY == null) sY = sX;\n    if (context2.beginPath) context2.beginPath();\n    for (var i = 0, len2 = path2.length; i < len2; ++i) {\n      current = path2[i];\n      if (sX !== 1 || sY !== 1) {\n        current = scale$1$1(current, sX, sY);\n      }\n      switch (current[0]) {\n        // first letter\n        case \"l\":\n          x2 += current[1];\n          y2 += current[2];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"L\":\n          x2 = current[1];\n          y2 = current[2];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"h\":\n          x2 += current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"H\":\n          x2 = current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"v\":\n          y2 += current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"V\":\n          y2 = current[1];\n          context2.lineTo(x2 + l, y2 + t);\n          break;\n        case \"m\":\n          x2 += current[1];\n          y2 += current[2];\n          anchorX = x2;\n          anchorY = y2;\n          context2.moveTo(x2 + l, y2 + t);\n          break;\n        case \"M\":\n          x2 = current[1];\n          y2 = current[2];\n          anchorX = x2;\n          anchorY = y2;\n          context2.moveTo(x2 + l, y2 + t);\n          break;\n        case \"c\":\n          tempX = x2 + current[5];\n          tempY = y2 + current[6];\n          controlX = x2 + current[3];\n          controlY = y2 + current[4];\n          context2.bezierCurveTo(\n            x2 + current[1] + l,\n            // x1\n            y2 + current[2] + t,\n            // y1\n            controlX + l,\n            // x2\n            controlY + t,\n            // y2\n            tempX + l,\n            tempY + t\n          );\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"C\":\n          x2 = current[5];\n          y2 = current[6];\n          controlX = current[3];\n          controlY = current[4];\n          context2.bezierCurveTo(current[1] + l, current[2] + t, controlX + l, controlY + t, x2 + l, y2 + t);\n          break;\n        case \"s\":\n          tempX = x2 + current[3];\n          tempY = y2 + current[4];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.bezierCurveTo(controlX + l, controlY + t, x2 + current[1] + l, y2 + current[2] + t, tempX + l, tempY + t);\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"S\":\n          tempX = current[3];\n          tempY = current[4];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.bezierCurveTo(controlX + l, controlY + t, current[1] + l, current[2] + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = current[1];\n          controlY = current[2];\n          break;\n        case \"q\":\n          tempX = x2 + current[3];\n          tempY = y2 + current[4];\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"Q\":\n          tempX = current[3];\n          tempY = current[4];\n          context2.quadraticCurveTo(current[1] + l, current[2] + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = current[1];\n          controlY = current[2];\n          break;\n        case \"t\":\n          tempX = x2 + current[1];\n          tempY = y2 + current[2];\n          if (previous[0].match(/[QqTt]/) === null) {\n            controlX = x2;\n            controlY = y2;\n          } else if (previous[0] === \"t\") {\n            controlX = 2 * x2 - tempControlX;\n            controlY = 2 * y2 - tempControlY;\n          } else if (previous[0] === \"q\") {\n            controlX = 2 * x2 - controlX;\n            controlY = 2 * y2 - controlY;\n          }\n          tempControlX = controlX;\n          tempControlY = controlY;\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          controlX = x2 + current[1];\n          controlY = y2 + current[2];\n          break;\n        case \"T\":\n          tempX = current[1];\n          tempY = current[2];\n          controlX = 2 * x2 - controlX;\n          controlY = 2 * y2 - controlY;\n          context2.quadraticCurveTo(controlX + l, controlY + t, tempX + l, tempY + t);\n          x2 = tempX;\n          y2 = tempY;\n          break;\n        case \"a\":\n          drawArc(context2, x2 + l, y2 + t, [current[1], current[2], current[3], current[4], current[5], current[6] + x2 + l, current[7] + y2 + t]);\n          x2 += current[6];\n          y2 += current[7];\n          break;\n        case \"A\":\n          drawArc(context2, x2 + l, y2 + t, [current[1], current[2], current[3], current[4], current[5], current[6] + l, current[7] + t]);\n          x2 = current[6];\n          y2 = current[7];\n          break;\n        case \"z\":\n        case \"Z\":\n          x2 = anchorX;\n          y2 = anchorY;\n          context2.closePath();\n          break;\n      }\n      previous = current;\n    }\n  }\n  function drawArc(context2, x2, y2, coords) {\n    const seg = segments(\n      coords[5],\n      // end x\n      coords[6],\n      // end y\n      coords[0],\n      // radius x\n      coords[1],\n      // radius y\n      coords[3],\n      // large flag\n      coords[4],\n      // sweep flag\n      coords[2],\n      // rotation\n      x2,\n      y2\n    );\n    for (let i = 0; i < seg.length; ++i) {\n      const bez = bezier(seg[i]);\n      context2.bezierCurveTo(bez[0], bez[1], bez[2], bez[3], bez[4], bez[5]);\n    }\n  }\n  const Tan30 = 0.5773502691896257;\n  const builtins = {\n    \"circle\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(r, 0);\n        context2.arc(0, 0, r, 0, Tau);\n      }\n    },\n    \"cross\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, s = r / 2.5;\n        context2.moveTo(-r, -s);\n        context2.lineTo(-r, s);\n        context2.lineTo(-s, s);\n        context2.lineTo(-s, r);\n        context2.lineTo(s, r);\n        context2.lineTo(s, s);\n        context2.lineTo(r, s);\n        context2.lineTo(r, -s);\n        context2.lineTo(s, -s);\n        context2.lineTo(s, -r);\n        context2.lineTo(-s, -r);\n        context2.lineTo(-s, -s);\n        context2.closePath();\n      }\n    },\n    \"diamond\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(-r, 0);\n        context2.lineTo(0, -r);\n        context2.lineTo(r, 0);\n        context2.lineTo(0, r);\n        context2.closePath();\n      }\n    },\n    \"square\": {\n      draw: function(context2, size) {\n        var w2 = Math.sqrt(size), x2 = -w2 / 2;\n        context2.rect(x2, x2, w2, w2);\n      }\n    },\n    \"arrow\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, s = r / 7, t = r / 2.5, v = r / 8;\n        context2.moveTo(-s, r);\n        context2.lineTo(s, r);\n        context2.lineTo(s, -v);\n        context2.lineTo(t, -v);\n        context2.lineTo(0, -r);\n        context2.lineTo(-t, -v);\n        context2.lineTo(-s, -v);\n        context2.closePath();\n      }\n    },\n    \"wedge\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30, b2 = r / 4;\n        context2.moveTo(0, -h2 - o);\n        context2.lineTo(-b2, h2 - o);\n        context2.lineTo(b2, h2 - o);\n        context2.closePath();\n      }\n    },\n    \"triangle\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r, o = h2 - r * Tan30;\n        context2.moveTo(0, -h2 - o);\n        context2.lineTo(-r, h2 - o);\n        context2.lineTo(r, h2 - o);\n        context2.closePath();\n      }\n    },\n    \"triangle-up\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(0, -h2);\n        context2.lineTo(-r, h2);\n        context2.lineTo(r, h2);\n        context2.closePath();\n      }\n    },\n    \"triangle-down\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(0, h2);\n        context2.lineTo(-r, -h2);\n        context2.lineTo(r, -h2);\n        context2.closePath();\n      }\n    },\n    \"triangle-right\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(h2, 0);\n        context2.lineTo(-h2, -r);\n        context2.lineTo(-h2, r);\n        context2.closePath();\n      }\n    },\n    \"triangle-left\": {\n      draw: function(context2, size) {\n        var r = Math.sqrt(size) / 2, h2 = HalfSqrt3 * r;\n        context2.moveTo(-h2, 0);\n        context2.lineTo(h2, -r);\n        context2.lineTo(h2, r);\n        context2.closePath();\n      }\n    },\n    \"stroke\": {\n      draw: function(context2, size) {\n        const r = Math.sqrt(size) / 2;\n        context2.moveTo(-r, 0);\n        context2.lineTo(r, 0);\n      }\n    }\n  };\n  function symbols(_) {\n    return has$1(builtins, _) ? builtins[_] : customSymbol(_);\n  }\n  var custom = {};\n  function customSymbol(path2) {\n    if (!has$1(custom, path2)) {\n      const parsed = parse$3(path2);\n      custom[path2] = {\n        draw: function(context2, size) {\n          pathRender(context2, parsed, 0, 0, Math.sqrt(size) / 2);\n        }\n      };\n    }\n    return custom[path2];\n  }\n  const C = 0.448084975506;\n  function rectangleX(d) {\n    return d.x;\n  }\n  function rectangleY(d) {\n    return d.y;\n  }\n  function rectangleWidth(d) {\n    return d.width;\n  }\n  function rectangleHeight(d) {\n    return d.height;\n  }\n  function number$3(_) {\n    return typeof _ === \"function\" ? _ : () => +_;\n  }\n  function clamp(value2, min2, max2) {\n    return Math.max(min2, Math.min(value2, max2));\n  }\n  function vg_rect() {\n    var x2 = rectangleX, y2 = rectangleY, width2 = rectangleWidth, height2 = rectangleHeight, crTL = number$3(0), crTR = crTL, crBL = crTL, crBR = crTL, context2 = null;\n    function rectangle2(_, x02, y02) {\n      var buffer, x12 = x02 != null ? x02 : +x2.call(this, _), y12 = y02 != null ? y02 : +y2.call(this, _), w2 = +width2.call(this, _), h2 = +height2.call(this, _), s = Math.min(w2, h2) / 2, tl2 = clamp(+crTL.call(this, _), 0, s), tr2 = clamp(+crTR.call(this, _), 0, s), bl2 = clamp(+crBL.call(this, _), 0, s), br2 = clamp(+crBR.call(this, _), 0, s);\n      if (!context2) context2 = buffer = path$3();\n      if (tl2 <= 0 && tr2 <= 0 && bl2 <= 0 && br2 <= 0) {\n        context2.rect(x12, y12, w2, h2);\n      } else {\n        var x22 = x12 + w2, y22 = y12 + h2;\n        context2.moveTo(x12 + tl2, y12);\n        context2.lineTo(x22 - tr2, y12);\n        context2.bezierCurveTo(x22 - C * tr2, y12, x22, y12 + C * tr2, x22, y12 + tr2);\n        context2.lineTo(x22, y22 - br2);\n        context2.bezierCurveTo(x22, y22 - C * br2, x22 - C * br2, y22, x22 - br2, y22);\n        context2.lineTo(x12 + bl2, y22);\n        context2.bezierCurveTo(x12 + C * bl2, y22, x12, y22 - C * bl2, x12, y22 - bl2);\n        context2.lineTo(x12, y12 + tl2);\n        context2.bezierCurveTo(x12, y12 + C * tl2, x12 + C * tl2, y12, x12 + tl2, y12);\n        context2.closePath();\n      }\n      if (buffer) {\n        context2 = null;\n        return buffer + \"\" || null;\n      }\n    }\n    rectangle2.x = function(_) {\n      if (arguments.length) {\n        x2 = number$3(_);\n        return rectangle2;\n      } else {\n        return x2;\n      }\n    };\n    rectangle2.y = function(_) {\n      if (arguments.length) {\n        y2 = number$3(_);\n        return rectangle2;\n      } else {\n        return y2;\n      }\n    };\n    rectangle2.width = function(_) {\n      if (arguments.length) {\n        width2 = number$3(_);\n        return rectangle2;\n      } else {\n        return width2;\n      }\n    };\n    rectangle2.height = function(_) {\n      if (arguments.length) {\n        height2 = number$3(_);\n        return rectangle2;\n      } else {\n        return height2;\n      }\n    };\n    rectangle2.cornerRadius = function(tl2, tr2, br2, bl2) {\n      if (arguments.length) {\n        crTL = number$3(tl2);\n        crTR = tr2 != null ? number$3(tr2) : crTL;\n        crBR = br2 != null ? number$3(br2) : crTL;\n        crBL = bl2 != null ? number$3(bl2) : crTR;\n        return rectangle2;\n      } else {\n        return crTL;\n      }\n    };\n    rectangle2.context = function(_) {\n      if (arguments.length) {\n        context2 = _ == null ? null : _;\n        return rectangle2;\n      } else {\n        return context2;\n      }\n    };\n    return rectangle2;\n  }\n  function vg_trail() {\n    var x2, y2, size, defined, context2 = null, ready, x12, y12, r1;\n    function point2(x22, y22, w2) {\n      const r2 = w2 / 2;\n      if (ready) {\n        var ux = y12 - y22, uy = x22 - x12;\n        if (ux || uy) {\n          var ud = Math.hypot(ux, uy), rx = (ux /= ud) * r1, ry = (uy /= ud) * r1, t = Math.atan2(uy, ux);\n          context2.moveTo(x12 - rx, y12 - ry);\n          context2.lineTo(x22 - ux * r2, y22 - uy * r2);\n          context2.arc(x22, y22, r2, t - Math.PI, t);\n          context2.lineTo(x12 + rx, y12 + ry);\n          context2.arc(x12, y12, r1, t, t + Math.PI);\n        } else {\n          context2.arc(x22, y22, r2, 0, Tau);\n        }\n        context2.closePath();\n      } else {\n        ready = 1;\n      }\n      x12 = x22;\n      y12 = y22;\n      r1 = r2;\n    }\n    function trail2(data2) {\n      var i, n = data2.length, d, defined0 = false, buffer;\n      if (context2 == null) context2 = buffer = path$3();\n      for (i = 0; i <= n; ++i) {\n        if (!(i < n && defined(d = data2[i], i, data2)) === defined0) {\n          if (defined0 = !defined0) ready = 0;\n        }\n        if (defined0) point2(+x2(d, i, data2), +y2(d, i, data2), +size(d, i, data2));\n      }\n      if (buffer) {\n        context2 = null;\n        return buffer + \"\" || null;\n      }\n    }\n    trail2.x = function(_) {\n      if (arguments.length) {\n        x2 = _;\n        return trail2;\n      } else {\n        return x2;\n      }\n    };\n    trail2.y = function(_) {\n      if (arguments.length) {\n        y2 = _;\n        return trail2;\n      } else {\n        return y2;\n      }\n    };\n    trail2.size = function(_) {\n      if (arguments.length) {\n        size = _;\n        return trail2;\n      } else {\n        return size;\n      }\n    };\n    trail2.defined = function(_) {\n      if (arguments.length) {\n        defined = _;\n        return trail2;\n      } else {\n        return defined;\n      }\n    };\n    trail2.context = function(_) {\n      if (arguments.length) {\n        if (_ == null) {\n          context2 = null;\n        } else {\n          context2 = _;\n        }\n        return trail2;\n      } else {\n        return context2;\n      }\n    };\n    return trail2;\n  }\n  function value$1(a2, b2) {\n    return a2 != null ? a2 : b2;\n  }\n  const x$2 = (item) => item.x || 0, y$2 = (item) => item.y || 0, w = (item) => item.width || 0, h = (item) => item.height || 0, xw = (item) => (item.x || 0) + (item.width || 0), yh = (item) => (item.y || 0) + (item.height || 0), sa = (item) => item.startAngle || 0, ea = (item) => item.endAngle || 0, pa = (item) => item.padAngle || 0, ir = (item) => item.innerRadius || 0, or = (item) => item.outerRadius || 0, cr = (item) => item.cornerRadius || 0, tl = (item) => value$1(item.cornerRadiusTopLeft, item.cornerRadius) || 0, tr = (item) => value$1(item.cornerRadiusTopRight, item.cornerRadius) || 0, br = (item) => value$1(item.cornerRadiusBottomRight, item.cornerRadius) || 0, bl = (item) => value$1(item.cornerRadiusBottomLeft, item.cornerRadius) || 0, sz = (item) => value$1(item.size, 64), ts = (item) => item.size || 1, def = (item) => !(item.defined === false), type = (item) => symbols(item.shape || \"circle\");\n  const arcShape = arc$2$1().startAngle(sa).endAngle(ea).padAngle(pa).innerRadius(ir).outerRadius(or).cornerRadius(cr), areavShape = area$2$1().x(x$2).y1(y$2).y0(yh).defined(def), areahShape = area$2$1().y(y$2).x1(x$2).x0(xw).defined(def), lineShape = line$2$1().x(x$2).y(y$2).defined(def), rectShape = vg_rect().x(x$2).y(y$2).width(w).height(h).cornerRadius(tl, tr, br, bl), symbolShape = Symbol$1().type(type).size(sz), trailShape = vg_trail().x(x$2).y(y$2).defined(def).size(ts);\n  function hasCornerRadius(item) {\n    return item.cornerRadius || item.cornerRadiusTopLeft || item.cornerRadiusTopRight || item.cornerRadiusBottomRight || item.cornerRadiusBottomLeft;\n  }\n  function arc$1(context2, item) {\n    return arcShape.context(context2)(item);\n  }\n  function area$1(context2, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return (item.orient === \"horizontal\" ? areahShape : areavShape).curve(curves(interp, item.orient, item.tension)).context(context2)(items);\n  }\n  function line$1(context2, items) {\n    const item = items[0], interp = item.interpolate || \"linear\";\n    return lineShape.curve(curves(interp, item.orient, item.tension)).context(context2)(items);\n  }\n  function rectangle(context2, item, x2, y2) {\n    return rectShape.context(context2)(item, x2, y2);\n  }\n  function shape$1(context2, item) {\n    return (item.mark.shape || item.shape).context(context2)(item);\n  }\n  function symbol$1(context2, item) {\n    return symbolShape.context(context2)(item);\n  }\n  function trail$1(context2, items) {\n    return trailShape.context(context2)(items);\n  }\n  var clip_id = 1;\n  function resetSVGClipId() {\n    clip_id = 1;\n  }\n  function clip$1$1(renderer, item, size) {\n    var clip2 = item.clip, defs = renderer._defs, id2 = item.clip_id || (item.clip_id = \"clip\" + clip_id++), c2 = defs.clipping[id2] || (defs.clipping[id2] = {\n      id: id2\n    });\n    if (isFunction(clip2)) {\n      c2.path = clip2(null);\n    } else if (hasCornerRadius(size)) {\n      c2.path = rectangle(null, size, 0, 0);\n    } else {\n      c2.width = size.width || 0;\n      c2.height = size.height || 0;\n    }\n    return \"url(#\" + id2 + \")\";\n  }\n  function Bounds(b2) {\n    this.clear();\n    if (b2) this.union(b2);\n  }\n  Bounds.prototype = {\n    clone() {\n      return new Bounds(this);\n    },\n    clear() {\n      this.x1 = +Number.MAX_VALUE;\n      this.y1 = +Number.MAX_VALUE;\n      this.x2 = -Number.MAX_VALUE;\n      this.y2 = -Number.MAX_VALUE;\n      return this;\n    },\n    empty() {\n      return this.x1 === +Number.MAX_VALUE && this.y1 === +Number.MAX_VALUE && this.x2 === -Number.MAX_VALUE && this.y2 === -Number.MAX_VALUE;\n    },\n    equals(b2) {\n      return this.x1 === b2.x1 && this.y1 === b2.y1 && this.x2 === b2.x2 && this.y2 === b2.y2;\n    },\n    set(x12, y12, x2, y2) {\n      if (x2 < x12) {\n        this.x2 = x12;\n        this.x1 = x2;\n      } else {\n        this.x1 = x12;\n        this.x2 = x2;\n      }\n      if (y2 < y12) {\n        this.y2 = y12;\n        this.y1 = y2;\n      } else {\n        this.y1 = y12;\n        this.y2 = y2;\n      }\n      return this;\n    },\n    add(x2, y2) {\n      if (x2 < this.x1) this.x1 = x2;\n      if (y2 < this.y1) this.y1 = y2;\n      if (x2 > this.x2) this.x2 = x2;\n      if (y2 > this.y2) this.y2 = y2;\n      return this;\n    },\n    expand(d) {\n      this.x1 -= d;\n      this.y1 -= d;\n      this.x2 += d;\n      this.y2 += d;\n      return this;\n    },\n    round() {\n      this.x1 = Math.floor(this.x1);\n      this.y1 = Math.floor(this.y1);\n      this.x2 = Math.ceil(this.x2);\n      this.y2 = Math.ceil(this.y2);\n      return this;\n    },\n    scale(s) {\n      this.x1 *= s;\n      this.y1 *= s;\n      this.x2 *= s;\n      this.y2 *= s;\n      return this;\n    },\n    translate(dx, dy) {\n      this.x1 += dx;\n      this.x2 += dx;\n      this.y1 += dy;\n      this.y2 += dy;\n      return this;\n    },\n    rotate(angle2, x2, y2) {\n      const p = this.rotatedPoints(angle2, x2, y2);\n      return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n    },\n    rotatedPoints(angle2, x2, y2) {\n      var {\n        x1: x12,\n        y1: y12,\n        x2: x22,\n        y2: y22\n      } = this, cos2 = Math.cos(angle2), sin2 = Math.sin(angle2), cx = x2 - x2 * cos2 + y2 * sin2, cy = y2 - x2 * sin2 - y2 * cos2;\n      return [cos2 * x12 - sin2 * y12 + cx, sin2 * x12 + cos2 * y12 + cy, cos2 * x12 - sin2 * y22 + cx, sin2 * x12 + cos2 * y22 + cy, cos2 * x22 - sin2 * y12 + cx, sin2 * x22 + cos2 * y12 + cy, cos2 * x22 - sin2 * y22 + cx, sin2 * x22 + cos2 * y22 + cy];\n    },\n    union(b2) {\n      if (b2.x1 < this.x1) this.x1 = b2.x1;\n      if (b2.y1 < this.y1) this.y1 = b2.y1;\n      if (b2.x2 > this.x2) this.x2 = b2.x2;\n      if (b2.y2 > this.y2) this.y2 = b2.y2;\n      return this;\n    },\n    intersect(b2) {\n      if (b2.x1 > this.x1) this.x1 = b2.x1;\n      if (b2.y1 > this.y1) this.y1 = b2.y1;\n      if (b2.x2 < this.x2) this.x2 = b2.x2;\n      if (b2.y2 < this.y2) this.y2 = b2.y2;\n      return this;\n    },\n    encloses(b2) {\n      return b2 && this.x1 <= b2.x1 && this.x2 >= b2.x2 && this.y1 <= b2.y1 && this.y2 >= b2.y2;\n    },\n    alignsWith(b2) {\n      return b2 && (this.x1 == b2.x1 || this.x2 == b2.x2 || this.y1 == b2.y1 || this.y2 == b2.y2);\n    },\n    intersects(b2) {\n      return b2 && !(this.x2 < b2.x1 || this.x1 > b2.x2 || this.y2 < b2.y1 || this.y1 > b2.y2);\n    },\n    contains(x2, y2) {\n      return !(x2 < this.x1 || x2 > this.x2 || y2 < this.y1 || y2 > this.y2);\n    },\n    width() {\n      return this.x2 - this.x1;\n    },\n    height() {\n      return this.y2 - this.y1;\n    }\n  };\n  function Item(mark) {\n    this.mark = mark;\n    this.bounds = this.bounds || new Bounds();\n  }\n  function GroupItem(mark) {\n    Item.call(this, mark);\n    this.items = this.items || [];\n  }\n  inherits(GroupItem, Item);\n  class ResourceLoader {\n    constructor(customLoader) {\n      this._pending = 0;\n      this._loader = customLoader || loader();\n    }\n    pending() {\n      return this._pending;\n    }\n    sanitizeURL(uri) {\n      const loader2 = this;\n      increment$1(loader2);\n      return loader2._loader.sanitize(uri, {\n        context: \"href\"\n      }).then((opt) => {\n        decrement(loader2);\n        return opt;\n      }).catch(() => {\n        decrement(loader2);\n        return null;\n      });\n    }\n    loadImage(uri) {\n      const loader2 = this, Image2 = domImage();\n      increment$1(loader2);\n      return loader2._loader.sanitize(uri, {\n        context: \"image\"\n      }).then((opt) => {\n        const url = opt.href;\n        if (!url || !Image2) throw {\n          url\n        };\n        const img = new Image2();\n        const cors = has$1(opt, \"crossOrigin\") ? opt.crossOrigin : \"anonymous\";\n        if (cors != null) img.crossOrigin = cors;\n        img.onload = () => decrement(loader2);\n        img.onerror = () => decrement(loader2);\n        img.src = url;\n        return img;\n      }).catch((e) => {\n        decrement(loader2);\n        return {\n          complete: false,\n          width: 0,\n          height: 0,\n          src: e && e.url || \"\"\n        };\n      });\n    }\n    ready() {\n      const loader2 = this;\n      return new Promise((accept) => {\n        function poll(value2) {\n          if (!loader2.pending()) accept(value2);\n          else setTimeout(() => {\n            poll(true);\n          }, 10);\n        }\n        poll(false);\n      });\n    }\n  }\n  function increment$1(loader2) {\n    loader2._pending += 1;\n  }\n  function decrement(loader2) {\n    loader2._pending -= 1;\n  }\n  function boundStroke(bounds2, item, miter) {\n    if (item.stroke && item.opacity !== 0 && item.strokeOpacity !== 0) {\n      const sw = item.strokeWidth != null ? +item.strokeWidth : 1;\n      bounds2.expand(sw + (miter ? miterAdjustment(item, sw) : 0));\n    }\n    return bounds2;\n  }\n  function miterAdjustment(item, strokeWidth) {\n    return item.strokeJoin && item.strokeJoin !== \"miter\" ? 0 : strokeWidth;\n  }\n  const circleThreshold = Tau - 1e-8;\n  let bounds, lx, ly, rot, ma, mb, mc, md;\n  const add$2 = (x2, y2) => bounds.add(x2, y2);\n  const addL = (x2, y2) => add$2(lx = x2, ly = y2);\n  const addX = (x2) => add$2(x2, bounds.y1);\n  const addY = (y2) => add$2(bounds.x1, y2);\n  const px = (x2, y2) => ma * x2 + mc * y2;\n  const py = (x2, y2) => mb * x2 + md * y2;\n  const addp = (x2, y2) => add$2(px(x2, y2), py(x2, y2));\n  const addpL = (x2, y2) => addL(px(x2, y2), py(x2, y2));\n  function boundContext(_, deg) {\n    bounds = _;\n    if (deg) {\n      rot = deg * DegToRad;\n      ma = md = Math.cos(rot);\n      mb = Math.sin(rot);\n      mc = -mb;\n    } else {\n      ma = md = 1;\n      rot = mb = mc = 0;\n    }\n    return context$1;\n  }\n  const context$1 = {\n    beginPath() {\n    },\n    closePath() {\n    },\n    moveTo: addpL,\n    lineTo: addpL,\n    rect(x2, y2, w2, h2) {\n      if (rot) {\n        addp(x2 + w2, y2);\n        addp(x2 + w2, y2 + h2);\n        addp(x2, y2 + h2);\n        addpL(x2, y2);\n      } else {\n        add$2(x2 + w2, y2 + h2);\n        addL(x2, y2);\n      }\n    },\n    quadraticCurveTo(x12, y12, x2, y2) {\n      const px1 = px(x12, y12), py1 = py(x12, y12), px2 = px(x2, y2), py2 = py(x2, y2);\n      quadExtrema(lx, px1, px2, addX);\n      quadExtrema(ly, py1, py2, addY);\n      addL(px2, py2);\n    },\n    bezierCurveTo(x12, y12, x2, y2, x3, y3) {\n      const px1 = px(x12, y12), py1 = py(x12, y12), px2 = px(x2, y2), py2 = py(x2, y2), px3 = px(x3, y3), py3 = py(x3, y3);\n      cubicExtrema(lx, px1, px2, px3, addX);\n      cubicExtrema(ly, py1, py2, py3, addY);\n      addL(px3, py3);\n    },\n    arc(cx, cy, r, sa2, ea2, ccw) {\n      sa2 += rot;\n      ea2 += rot;\n      lx = r * Math.cos(ea2) + cx;\n      ly = r * Math.sin(ea2) + cy;\n      if (Math.abs(ea2 - sa2) > circleThreshold) {\n        add$2(cx - r, cy - r);\n        add$2(cx + r, cy + r);\n      } else {\n        const update2 = (a2) => add$2(r * Math.cos(a2) + cx, r * Math.sin(a2) + cy);\n        let s, i;\n        update2(sa2);\n        update2(ea2);\n        if (ea2 !== sa2) {\n          sa2 = sa2 % Tau;\n          if (sa2 < 0) sa2 += Tau;\n          ea2 = ea2 % Tau;\n          if (ea2 < 0) ea2 += Tau;\n          if (ea2 < sa2) {\n            ccw = !ccw;\n            s = sa2;\n            sa2 = ea2;\n            ea2 = s;\n          }\n          if (ccw) {\n            ea2 -= Tau;\n            s = sa2 - sa2 % HalfPi;\n            for (i = 0; i < 4 && s > ea2; ++i, s -= HalfPi) update2(s);\n          } else {\n            s = sa2 - sa2 % HalfPi + HalfPi;\n            for (i = 0; i < 4 && s < ea2; ++i, s = s + HalfPi) update2(s);\n          }\n        }\n      }\n    }\n  };\n  function quadExtrema(x02, x12, x2, cb) {\n    const t = (x02 - x12) / (x02 + x2 - 2 * x12);\n    if (0 < t && t < 1) cb(x02 + (x12 - x02) * t);\n  }\n  function cubicExtrema(x02, x12, x2, x3, cb) {\n    const a2 = x3 - x02 + 3 * x12 - 3 * x2, b2 = x02 + x2 - 2 * x12, c2 = x02 - x12;\n    let t02 = 0, t12 = 0, r;\n    if (Math.abs(a2) > Epsilon) {\n      r = b2 * b2 + c2 * a2;\n      if (r >= 0) {\n        r = Math.sqrt(r);\n        t02 = (-b2 + r) / a2;\n        t12 = (-b2 - r) / a2;\n      }\n    } else {\n      t02 = 0.5 * c2 / b2;\n    }\n    if (0 < t02 && t02 < 1) cb(cubic(t02, x02, x12, x2, x3));\n    if (0 < t12 && t12 < 1) cb(cubic(t12, x02, x12, x2, x3));\n  }\n  function cubic(t, x02, x12, x2, x3) {\n    const s = 1 - t, s2 = s * s, t22 = t * t;\n    return s2 * s * x02 + 3 * s2 * t * x12 + 3 * s * t22 * x2 + t22 * t * x3;\n  }\n  var context$2 = (context$2 = domCanvas(1, 1)) ? context$2.getContext(\"2d\") : null;\n  const b = new Bounds();\n  function intersectPath(draw2) {\n    return function(item, brush) {\n      if (!context$2) return true;\n      draw2(context$2, item);\n      b.clear().union(item.bounds).intersect(brush).round();\n      const {\n        x1: x12,\n        y1: y12,\n        x2,\n        y2\n      } = b;\n      for (let y3 = y12; y3 <= y2; ++y3) {\n        for (let x3 = x12; x3 <= x2; ++x3) {\n          if (context$2.isPointInPath(x3, y3)) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n  }\n  function intersectPoint(item, box2) {\n    return box2.contains(item.x || 0, item.y || 0);\n  }\n  function intersectRect(item, box2) {\n    const x2 = item.x || 0, y2 = item.y || 0, w2 = item.width || 0, h2 = item.height || 0;\n    return box2.intersects(b.set(x2, y2, x2 + w2, y2 + h2));\n  }\n  function intersectRule(item, box2) {\n    const x2 = item.x || 0, y2 = item.y || 0, x22 = item.x2 != null ? item.x2 : x2, y22 = item.y2 != null ? item.y2 : y2;\n    return intersectBoxLine(box2, x2, y2, x22, y22);\n  }\n  function intersectBoxLine(box2, x2, y2, u2, v) {\n    const {\n      x1: x12,\n      y1: y12,\n      x2: x22,\n      y2: y22\n    } = box2, dx = u2 - x2, dy = v - y2;\n    let t02 = 0, t12 = 1, p, q, r, e;\n    for (e = 0; e < 4; ++e) {\n      if (e === 0) {\n        p = -dx;\n        q = -(x12 - x2);\n      }\n      if (e === 1) {\n        p = dx;\n        q = x22 - x2;\n      }\n      if (e === 2) {\n        p = -dy;\n        q = -(y12 - y2);\n      }\n      if (e === 3) {\n        p = dy;\n        q = y22 - y2;\n      }\n      if (Math.abs(p) < 1e-10 && q < 0) return false;\n      r = q / p;\n      if (p < 0) {\n        if (r > t12) return false;\n        else if (r > t02) t02 = r;\n      } else if (p > 0) {\n        if (r < t02) return false;\n        else if (r < t12) t12 = r;\n      }\n    }\n    return true;\n  }\n  function blend(context2, item) {\n    context2.globalCompositeOperation = item.blend || \"source-over\";\n  }\n  function value$2(value2, dflt) {\n    return value2 == null ? dflt : value2;\n  }\n  function addStops(gradient2, stops) {\n    const n = stops.length;\n    for (let i = 0; i < n; ++i) {\n      gradient2.addColorStop(stops[i].offset, stops[i].color);\n    }\n    return gradient2;\n  }\n  function gradient$1(context2, spec, bounds2) {\n    const w2 = bounds2.width(), h2 = bounds2.height();\n    let gradient2;\n    if (spec.gradient === \"radial\") {\n      gradient2 = context2.createRadialGradient(bounds2.x1 + value$2(spec.x1, 0.5) * w2, bounds2.y1 + value$2(spec.y1, 0.5) * h2, Math.max(w2, h2) * value$2(spec.r1, 0), bounds2.x1 + value$2(spec.x2, 0.5) * w2, bounds2.y1 + value$2(spec.y2, 0.5) * h2, Math.max(w2, h2) * value$2(spec.r2, 0.5));\n    } else {\n      const x12 = value$2(spec.x1, 0), y12 = value$2(spec.y1, 0), x2 = value$2(spec.x2, 1), y2 = value$2(spec.y2, 0);\n      if (x12 === x2 || y12 === y2 || w2 === h2) {\n        gradient2 = context2.createLinearGradient(bounds2.x1 + x12 * w2, bounds2.y1 + y12 * h2, bounds2.x1 + x2 * w2, bounds2.y1 + y2 * h2);\n      } else {\n        const image2 = domCanvas(Math.ceil(w2), Math.ceil(h2)), ictx = image2.getContext(\"2d\");\n        ictx.scale(w2, h2);\n        ictx.fillStyle = addStops(ictx.createLinearGradient(x12, y12, x2, y2), spec.stops);\n        ictx.fillRect(0, 0, w2, h2);\n        return context2.createPattern(image2, \"no-repeat\");\n      }\n    }\n    return addStops(gradient2, spec.stops);\n  }\n  function color$1(context2, item, value2) {\n    return isGradient(value2) ? gradient$1(context2, value2, item.bounds) : value2;\n  }\n  function fill(context2, item, opacity) {\n    opacity *= item.fillOpacity == null ? 1 : item.fillOpacity;\n    if (opacity > 0) {\n      context2.globalAlpha = opacity;\n      context2.fillStyle = color$1(context2, item, item.fill);\n      return true;\n    } else {\n      return false;\n    }\n  }\n  var Empty = [];\n  function stroke(context2, item, opacity) {\n    var lw = (lw = item.strokeWidth) != null ? lw : 1;\n    if (lw <= 0) return false;\n    opacity *= item.strokeOpacity == null ? 1 : item.strokeOpacity;\n    if (opacity > 0) {\n      context2.globalAlpha = opacity;\n      context2.strokeStyle = color$1(context2, item, item.stroke);\n      context2.lineWidth = lw;\n      context2.lineCap = item.strokeCap || \"butt\";\n      context2.lineJoin = item.strokeJoin || \"miter\";\n      context2.miterLimit = item.strokeMiterLimit || 10;\n      if (context2.setLineDash) {\n        context2.setLineDash(item.strokeDash || Empty);\n        context2.lineDashOffset = item.strokeDashOffset || 0;\n      }\n      return true;\n    } else {\n      return false;\n    }\n  }\n  function compare(a2, b2) {\n    return a2.zindex - b2.zindex || a2.index - b2.index;\n  }\n  function zorder(scene) {\n    if (!scene.zdirty) return scene.zitems;\n    var items = scene.items, output2 = [], item, i, n;\n    for (i = 0, n = items.length; i < n; ++i) {\n      item = items[i];\n      item.index = i;\n      if (item.zindex) output2.push(item);\n    }\n    scene.zdirty = false;\n    return scene.zitems = output2.sort(compare);\n  }\n  function visit(scene, visitor) {\n    var items = scene.items, i, n;\n    if (!items || !items.length) return;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        if (!items[i].zindex) visitor(items[i]);\n      }\n      items = zitems;\n    }\n    for (i = 0, n = items.length; i < n; ++i) {\n      visitor(items[i]);\n    }\n  }\n  function pickVisit(scene, visitor) {\n    var items = scene.items, hit2, i;\n    if (!items || !items.length) return null;\n    const zitems = zorder(scene);\n    if (zitems && zitems.length) items = zitems;\n    for (i = items.length; --i >= 0; ) {\n      if (hit2 = visitor(items[i])) return hit2;\n    }\n    if (items === zitems) {\n      for (items = scene.items, i = items.length; --i >= 0; ) {\n        if (!items[i].zindex) {\n          if (hit2 = visitor(items[i])) return hit2;\n        }\n      }\n    }\n    return null;\n  }\n  function drawAll(path2) {\n    return function(context2, scene, bounds2) {\n      visit(scene, (item) => {\n        if (!bounds2 || bounds2.intersects(item.bounds)) {\n          drawPath(path2, context2, item, item);\n        }\n      });\n    };\n  }\n  function drawOne(path2) {\n    return function(context2, scene, bounds2) {\n      if (scene.items.length && (!bounds2 || bounds2.intersects(scene.bounds))) {\n        drawPath(path2, context2, scene.items[0], scene.items);\n      }\n    };\n  }\n  function drawPath(path2, context2, item, items) {\n    var opacity = item.opacity == null ? 1 : item.opacity;\n    if (opacity === 0) return;\n    if (path2(context2, items)) return;\n    blend(context2, item);\n    if (item.fill && fill(context2, item, opacity)) {\n      context2.fill();\n    }\n    if (item.stroke && stroke(context2, item, opacity)) {\n      context2.stroke();\n    }\n  }\n  function pick$1(test2) {\n    test2 = test2 || truthy;\n    return function(context2, scene, x2, y2, gx, gy) {\n      x2 *= context2.pixelRatio;\n      y2 *= context2.pixelRatio;\n      return pickVisit(scene, (item) => {\n        const b2 = item.bounds;\n        if (b2 && !b2.contains(gx, gy) || !b2) return;\n        if (test2(context2, item, x2, y2, gx, gy)) return item;\n      });\n    };\n  }\n  function hitPath(path2, filled) {\n    return function(context2, o, x2, y2) {\n      var item = Array.isArray(o) ? o[0] : o, fill2 = filled == null ? item.fill : filled, stroke2 = item.stroke && context2.isPointInStroke, lw, lc;\n      if (stroke2) {\n        lw = item.strokeWidth;\n        lc = item.strokeCap;\n        context2.lineWidth = lw != null ? lw : 1;\n        context2.lineCap = lc != null ? lc : \"butt\";\n      }\n      return path2(context2, o) ? false : fill2 && context2.isPointInPath(x2, y2) || stroke2 && context2.isPointInStroke(x2, y2);\n    };\n  }\n  function pickPath(path2) {\n    return pick$1(hitPath(path2));\n  }\n  function translate$2(x2, y2) {\n    return \"translate(\" + x2 + \",\" + y2 + \")\";\n  }\n  function rotate(a2) {\n    return \"rotate(\" + a2 + \")\";\n  }\n  function scale$5(scaleX, scaleY2) {\n    return \"scale(\" + scaleX + \",\" + scaleY2 + \")\";\n  }\n  function translateItem(item) {\n    return translate$2(item.x || 0, item.y || 0);\n  }\n  function rotateItem(item) {\n    return translate$2(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\");\n  }\n  function transformItem(item) {\n    return translate$2(item.x || 0, item.y || 0) + (item.angle ? \" \" + rotate(item.angle) : \"\") + (item.scaleX || item.scaleY ? \" \" + scale$5(item.scaleX || 1, item.scaleY || 1) : \"\");\n  }\n  function markItemPath(type2, shape2, isect) {\n    function attr2(emit2, item) {\n      emit2(\"transform\", rotateItem(item));\n      emit2(\"d\", shape2(null, item));\n    }\n    function bound2(bounds2, item) {\n      shape2(boundContext(bounds2, item.angle), item);\n      return boundStroke(bounds2, item).translate(item.x || 0, item.y || 0);\n    }\n    function draw2(context2, item) {\n      var x2 = item.x || 0, y2 = item.y || 0, a2 = item.angle || 0;\n      context2.translate(x2, y2);\n      if (a2) context2.rotate(a2 *= DegToRad);\n      context2.beginPath();\n      shape2(context2, item);\n      if (a2) context2.rotate(-a2);\n      context2.translate(-x2, -y2);\n    }\n    return {\n      type: type2,\n      tag: \"path\",\n      nested: false,\n      attr: attr2,\n      bound: bound2,\n      draw: drawAll(draw2),\n      pick: pickPath(draw2),\n      isect: isect || intersectPath(draw2)\n    };\n  }\n  var arc$2 = markItemPath(\"arc\", arc$1);\n  function pickArea(a2, p) {\n    var v = a2[0].orient === \"horizontal\" ? p[1] : p[0], z = a2[0].orient === \"horizontal\" ? \"y\" : \"x\", i = a2.length, min2 = Infinity, hit2, d;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      d = Math.abs(a2[i][z] - v);\n      if (d < min2) {\n        min2 = d;\n        hit2 = a2[i];\n      }\n    }\n    return hit2;\n  }\n  function pickLine(a2, p) {\n    var t = Math.pow(a2[0].strokeWidth || 1, 2), i = a2.length, dx, dy, dd;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      dx = a2[i].x - p[0];\n      dy = a2[i].y - p[1];\n      dd = dx * dx + dy * dy;\n      if (dd < t) return a2[i];\n    }\n    return null;\n  }\n  function pickTrail(a2, p) {\n    var i = a2.length, dx, dy, dd;\n    while (--i >= 0) {\n      if (a2[i].defined === false) continue;\n      dx = a2[i].x - p[0];\n      dy = a2[i].y - p[1];\n      dd = dx * dx + dy * dy;\n      dx = a2[i].size || 1;\n      if (dd < dx * dx) return a2[i];\n    }\n    return null;\n  }\n  function markMultiItemPath(type2, shape2, tip) {\n    function attr2(emit2, item) {\n      var items = item.mark.items;\n      if (items.length) emit2(\"d\", shape2(null, items));\n    }\n    function bound2(bounds2, mark) {\n      var items = mark.items;\n      if (items.length === 0) {\n        return bounds2;\n      } else {\n        shape2(boundContext(bounds2), items);\n        return boundStroke(bounds2, items[0]);\n      }\n    }\n    function draw2(context2, items) {\n      context2.beginPath();\n      shape2(context2, items);\n    }\n    const hit2 = hitPath(draw2);\n    function pick2(context2, scene, x2, y2, gx, gy) {\n      var items = scene.items, b2 = scene.bounds;\n      if (!items || !items.length || b2 && !b2.contains(gx, gy)) {\n        return null;\n      }\n      x2 *= context2.pixelRatio;\n      y2 *= context2.pixelRatio;\n      return hit2(context2, items, x2, y2) ? items[0] : null;\n    }\n    return {\n      type: type2,\n      tag: \"path\",\n      nested: true,\n      attr: attr2,\n      bound: bound2,\n      draw: drawOne(draw2),\n      pick: pick2,\n      isect: intersectPoint,\n      tip\n    };\n  }\n  var area$2 = markMultiItemPath(\"area\", area$1, pickArea);\n  function clip$2(context2, scene) {\n    var clip2 = scene.clip;\n    context2.save();\n    if (isFunction(clip2)) {\n      context2.beginPath();\n      clip2(context2);\n      context2.clip();\n    } else {\n      clipGroup(context2, scene.group);\n    }\n  }\n  function clipGroup(context2, group2) {\n    context2.beginPath();\n    hasCornerRadius(group2) ? rectangle(context2, group2, 0, 0) : context2.rect(0, 0, group2.width || 0, group2.height || 0);\n    context2.clip();\n  }\n  function offset$1(item) {\n    const sw = value$2(item.strokeWidth, 1);\n    return item.strokeOffset != null ? item.strokeOffset : item.stroke && sw > 0.5 && sw < 1.5 ? 0.5 - Math.abs(sw - 1) : 0;\n  }\n  function attr$5(emit2, item) {\n    emit2(\"transform\", translateItem(item));\n  }\n  function emitRectangle(emit2, item) {\n    const off = offset$1(item);\n    emit2(\"d\", rectangle(null, item, off, off));\n  }\n  function background$1(emit2, item) {\n    emit2(\"class\", \"background\");\n    emit2(\"aria-hidden\", true);\n    emitRectangle(emit2, item);\n  }\n  function foreground(emit2, item) {\n    emit2(\"class\", \"foreground\");\n    emit2(\"aria-hidden\", true);\n    if (item.strokeForeground) {\n      emitRectangle(emit2, item);\n    } else {\n      emit2(\"d\", \"\");\n    }\n  }\n  function content(emit2, item, renderer) {\n    const url = item.clip ? clip$1$1(renderer, item, item) : null;\n    emit2(\"clip-path\", url);\n  }\n  function bound$5(bounds2, group2) {\n    if (!group2.clip && group2.items) {\n      const items = group2.items, m2 = items.length;\n      for (let j = 0; j < m2; ++j) {\n        bounds2.union(items[j].bounds);\n      }\n    }\n    if ((group2.clip || group2.width || group2.height) && !group2.noBound) {\n      bounds2.add(0, 0).add(group2.width || 0, group2.height || 0);\n    }\n    boundStroke(bounds2, group2);\n    return bounds2.translate(group2.x || 0, group2.y || 0);\n  }\n  function rectanglePath(context2, group2, x2, y2) {\n    const off = offset$1(group2);\n    context2.beginPath();\n    rectangle(context2, group2, (x2 || 0) + off, (y2 || 0) + off);\n  }\n  const hitBackground = hitPath(rectanglePath);\n  const hitForeground = hitPath(rectanglePath, false);\n  const hitCorner = hitPath(rectanglePath, true);\n  function draw$4(context2, scene, bounds2, markTypes) {\n    visit(scene, (group2) => {\n      const gx = group2.x || 0, gy = group2.y || 0, fore = group2.strokeForeground, opacity = group2.opacity == null ? 1 : group2.opacity;\n      if ((group2.stroke || group2.fill) && opacity) {\n        rectanglePath(context2, group2, gx, gy);\n        blend(context2, group2);\n        if (group2.fill && fill(context2, group2, opacity)) {\n          context2.fill();\n        }\n        if (group2.stroke && !fore && stroke(context2, group2, opacity)) {\n          context2.stroke();\n        }\n      }\n      context2.save();\n      context2.translate(gx, gy);\n      if (group2.clip) clipGroup(context2, group2);\n      if (bounds2) bounds2.translate(-gx, -gy);\n      visit(group2, (item) => {\n        if (item.marktype === \"group\" || markTypes == null || markTypes.includes(item.marktype)) {\n          this.draw(context2, item, bounds2, markTypes);\n        }\n      });\n      if (bounds2) bounds2.translate(gx, gy);\n      context2.restore();\n      if (fore && group2.stroke && opacity) {\n        rectanglePath(context2, group2, gx, gy);\n        blend(context2, group2);\n        if (stroke(context2, group2, opacity)) {\n          context2.stroke();\n        }\n      }\n    });\n  }\n  function pick(context2, scene, x2, y2, gx, gy) {\n    if (scene.bounds && !scene.bounds.contains(gx, gy) || !scene.items) {\n      return null;\n    }\n    const cx = x2 * context2.pixelRatio, cy = y2 * context2.pixelRatio;\n    return pickVisit(scene, (group2) => {\n      let hit2, dx, dy;\n      const b2 = group2.bounds;\n      if (b2 && !b2.contains(gx, gy)) return;\n      dx = group2.x || 0;\n      dy = group2.y || 0;\n      const dw = dx + (group2.width || 0), dh = dy + (group2.height || 0), c2 = group2.clip;\n      if (c2 && (gx < dx || gx > dw || gy < dy || gy > dh)) return;\n      context2.save();\n      context2.translate(dx, dy);\n      dx = gx - dx;\n      dy = gy - dy;\n      if (c2 && hasCornerRadius(group2) && !hitCorner(context2, group2, cx, cy)) {\n        context2.restore();\n        return null;\n      }\n      const fore = group2.strokeForeground, ix = scene.interactive !== false;\n      if (ix && fore && group2.stroke && hitForeground(context2, group2, cx, cy)) {\n        context2.restore();\n        return group2;\n      }\n      hit2 = pickVisit(group2, (mark) => pickMark(mark, dx, dy) ? this.pick(mark, x2, y2, dx, dy) : null);\n      if (!hit2 && ix && (group2.fill || !fore && group2.stroke) && hitBackground(context2, group2, cx, cy)) {\n        hit2 = group2;\n      }\n      context2.restore();\n      return hit2 || null;\n    });\n  }\n  function pickMark(mark, x2, y2) {\n    return (mark.interactive !== false || mark.marktype === \"group\") && mark.bounds && mark.bounds.contains(x2, y2);\n  }\n  var group$1 = {\n    type: \"group\",\n    tag: \"g\",\n    nested: false,\n    attr: attr$5,\n    bound: bound$5,\n    draw: draw$4,\n    pick,\n    isect: intersectRect,\n    content,\n    background: background$1,\n    foreground\n  };\n  var metadata = {\n    \"xmlns\": \"http://www.w3.org/2000/svg\",\n    \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\",\n    \"version\": \"1.1\"\n  };\n  function getImage(item, renderer) {\n    var image2 = item.image;\n    if (!image2 || item.url && item.url !== image2.url) {\n      image2 = {\n        complete: false,\n        width: 0,\n        height: 0\n      };\n      renderer.loadImage(item.url).then((image3) => {\n        item.image = image3;\n        item.image.url = item.url;\n      });\n    }\n    return image2;\n  }\n  function imageWidth(item, image2) {\n    return item.width != null ? item.width : !image2 || !image2.width ? 0 : item.aspect !== false && item.height ? item.height * image2.width / image2.height : image2.width;\n  }\n  function imageHeight(item, image2) {\n    return item.height != null ? item.height : !image2 || !image2.height ? 0 : item.aspect !== false && item.width ? item.width * image2.height / image2.width : image2.height;\n  }\n  function imageXOffset(align, w2) {\n    return align === \"center\" ? w2 / 2 : align === \"right\" ? w2 : 0;\n  }\n  function imageYOffset(baseline2, h2) {\n    return baseline2 === \"middle\" ? h2 / 2 : baseline2 === \"bottom\" ? h2 : 0;\n  }\n  function attr$4(emit2, item, renderer) {\n    const img = getImage(item, renderer), w2 = imageWidth(item, img), h2 = imageHeight(item, img), x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2), i = !img.src && img.toDataURL ? img.toDataURL() : img.src || \"\";\n    emit2(\"href\", i, metadata[\"xmlns:xlink\"], \"xlink:href\");\n    emit2(\"transform\", translate$2(x2, y2));\n    emit2(\"width\", w2);\n    emit2(\"height\", h2);\n    emit2(\"preserveAspectRatio\", item.aspect === false ? \"none\" : \"xMidYMid\");\n  }\n  function bound$4(bounds2, item) {\n    const img = item.image, w2 = imageWidth(item, img), h2 = imageHeight(item, img), x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2);\n    return bounds2.set(x2, y2, x2 + w2, y2 + h2);\n  }\n  function draw$3(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      if (bounds2 && !bounds2.intersects(item.bounds)) return;\n      const img = getImage(item, this);\n      let w2 = imageWidth(item, img);\n      let h2 = imageHeight(item, img);\n      if (w2 === 0 || h2 === 0) return;\n      let x2 = (item.x || 0) - imageXOffset(item.align, w2), y2 = (item.y || 0) - imageYOffset(item.baseline, h2), opacity, ar0, ar1, t;\n      if (item.aspect !== false) {\n        ar0 = img.width / img.height;\n        ar1 = item.width / item.height;\n        if (ar0 === ar0 && ar1 === ar1 && ar0 !== ar1) {\n          if (ar1 < ar0) {\n            t = w2 / ar0;\n            y2 += (h2 - t) / 2;\n            h2 = t;\n          } else {\n            t = h2 * ar0;\n            x2 += (w2 - t) / 2;\n            w2 = t;\n          }\n        }\n      }\n      if (img.complete || img.toDataURL) {\n        blend(context2, item);\n        context2.globalAlpha = (opacity = item.opacity) != null ? opacity : 1;\n        context2.imageSmoothingEnabled = item.smooth !== false;\n        context2.drawImage(img, x2, y2, w2, h2);\n      }\n    });\n  }\n  var image = {\n    type: \"image\",\n    tag: \"image\",\n    nested: false,\n    attr: attr$4,\n    bound: bound$4,\n    draw: draw$3,\n    pick: pick$1(),\n    isect: truthy,\n    // bounds check is sufficient\n    get: getImage,\n    xOffset: imageXOffset,\n    yOffset: imageYOffset\n  };\n  var line$2 = markMultiItemPath(\"line\", line$1, pickLine);\n  function attr$3(emit2, item) {\n    var sx = item.scaleX || 1, sy = item.scaleY || 1;\n    if (sx !== 1 || sy !== 1) {\n      emit2(\"vector-effect\", \"non-scaling-stroke\");\n    }\n    emit2(\"transform\", transformItem(item));\n    emit2(\"d\", item.path);\n  }\n  function path$1(context2, item) {\n    var path2 = item.path;\n    if (path2 == null) return true;\n    var x2 = item.x || 0, y2 = item.y || 0, sx = item.scaleX || 1, sy = item.scaleY || 1, a2 = (item.angle || 0) * DegToRad, cache2 = item.pathCache;\n    if (!cache2 || cache2.path !== path2) {\n      (item.pathCache = cache2 = parse$3(path2)).path = path2;\n    }\n    if (a2 && context2.rotate && context2.translate) {\n      context2.translate(x2, y2);\n      context2.rotate(a2);\n      pathRender(context2, cache2, 0, 0, sx, sy);\n      context2.rotate(-a2);\n      context2.translate(-x2, -y2);\n    } else {\n      pathRender(context2, cache2, x2, y2, sx, sy);\n    }\n  }\n  function bound$3(bounds2, item) {\n    return path$1(boundContext(bounds2, item.angle), item) ? bounds2.set(0, 0, 0, 0) : boundStroke(bounds2, item, true);\n  }\n  var path$2 = {\n    type: \"path\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$3,\n    bound: bound$3,\n    draw: drawAll(path$1),\n    pick: pickPath(path$1),\n    isect: intersectPath(path$1)\n  };\n  function attr$2(emit2, item) {\n    emit2(\"d\", rectangle(null, item));\n  }\n  function bound$2(bounds2, item) {\n    var x2, y2;\n    return boundStroke(bounds2.set(x2 = item.x || 0, y2 = item.y || 0, x2 + item.width || 0, y2 + item.height || 0), item);\n  }\n  function draw$2(context2, item) {\n    context2.beginPath();\n    rectangle(context2, item);\n  }\n  var rect = {\n    type: \"rect\",\n    tag: \"path\",\n    nested: false,\n    attr: attr$2,\n    bound: bound$2,\n    draw: drawAll(draw$2),\n    pick: pickPath(draw$2),\n    isect: intersectRect\n  };\n  function attr$1(emit2, item) {\n    emit2(\"transform\", translateItem(item));\n    emit2(\"x2\", item.x2 != null ? item.x2 - (item.x || 0) : 0);\n    emit2(\"y2\", item.y2 != null ? item.y2 - (item.y || 0) : 0);\n  }\n  function bound$1(bounds2, item) {\n    var x12, y12;\n    return boundStroke(bounds2.set(x12 = item.x || 0, y12 = item.y || 0, item.x2 != null ? item.x2 : x12, item.y2 != null ? item.y2 : y12), item);\n  }\n  function path(context2, item, opacity) {\n    var x12, y12, x2, y2;\n    if (item.stroke && stroke(context2, item, opacity)) {\n      x12 = item.x || 0;\n      y12 = item.y || 0;\n      x2 = item.x2 != null ? item.x2 : x12;\n      y2 = item.y2 != null ? item.y2 : y12;\n      context2.beginPath();\n      context2.moveTo(x12, y12);\n      context2.lineTo(x2, y2);\n      return true;\n    }\n    return false;\n  }\n  function draw$1(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      if (bounds2 && !bounds2.intersects(item.bounds)) return;\n      var opacity = item.opacity == null ? 1 : item.opacity;\n      if (opacity && path(context2, item, opacity)) {\n        blend(context2, item);\n        context2.stroke();\n      }\n    });\n  }\n  function hit$1(context2, item, x2, y2) {\n    if (!context2.isPointInStroke) return false;\n    return path(context2, item, 1) && context2.isPointInStroke(x2, y2);\n  }\n  var rule$1 = {\n    type: \"rule\",\n    tag: \"line\",\n    nested: false,\n    attr: attr$1,\n    bound: bound$1,\n    draw: draw$1,\n    pick: pick$1(hit$1),\n    isect: intersectRule\n  };\n  var shape = markItemPath(\"shape\", shape$1);\n  var symbol = markItemPath(\"symbol\", symbol$1, intersectPoint);\n  const widthCache = lruCache();\n  var textMetrics = {\n    height: fontSize,\n    measureWidth,\n    estimateWidth,\n    width: estimateWidth,\n    canvas: useCanvas\n  };\n  useCanvas(true);\n  function useCanvas(use2) {\n    textMetrics.width = use2 && context$2 ? measureWidth : estimateWidth;\n  }\n  function estimateWidth(item, text2) {\n    return _estimateWidth(textValue(item, text2), fontSize(item));\n  }\n  function _estimateWidth(text2, currentFontHeight) {\n    return ~~(0.8 * text2.length * currentFontHeight);\n  }\n  function measureWidth(item, text2) {\n    return fontSize(item) <= 0 || !(text2 = textValue(item, text2)) ? 0 : _measureWidth(text2, font(item));\n  }\n  function _measureWidth(text2, currentFont) {\n    const key2 = `(${currentFont}) ${text2}`;\n    let width2 = widthCache.get(key2);\n    if (width2 === void 0) {\n      context$2.font = currentFont;\n      width2 = context$2.measureText(text2).width;\n      widthCache.set(key2, width2);\n    }\n    return width2;\n  }\n  function fontSize(item) {\n    return item.fontSize != null ? +item.fontSize || 0 : 11;\n  }\n  function lineHeight(item) {\n    return item.lineHeight != null ? item.lineHeight : fontSize(item) + 2;\n  }\n  function lineArray(_) {\n    return isArray(_) ? _.length > 1 ? _ : _[0] : _;\n  }\n  function textLines(item) {\n    return lineArray(item.lineBreak && item.text && !isArray(item.text) ? item.text.split(item.lineBreak) : item.text);\n  }\n  function multiLineOffset(item) {\n    const tl2 = textLines(item);\n    return (isArray(tl2) ? tl2.length - 1 : 0) * lineHeight(item);\n  }\n  function textValue(item, line2) {\n    const text2 = line2 == null ? \"\" : (line2 + \"\").trim();\n    return item.limit > 0 && text2.length ? truncate(item, text2) : text2;\n  }\n  function widthGetter(item) {\n    if (textMetrics.width === measureWidth) {\n      const currentFont = font(item);\n      return (text2) => _measureWidth(text2, currentFont);\n    } else if (textMetrics.width === estimateWidth) {\n      const currentFontHeight = fontSize(item);\n      return (text2) => _estimateWidth(text2, currentFontHeight);\n    } else {\n      return (text2) => textMetrics.width(item, text2);\n    }\n  }\n  function truncate(item, text2) {\n    var limit = +item.limit, width2 = widthGetter(item);\n    if (width2(text2) < limit) return text2;\n    var ellipsis = item.ellipsis || \"…\", rtl = item.dir === \"rtl\", lo = 0, hi = text2.length, mid;\n    limit -= width2(ellipsis);\n    if (rtl) {\n      while (lo < hi) {\n        mid = lo + hi >>> 1;\n        if (width2(text2.slice(mid)) > limit) lo = mid + 1;\n        else hi = mid;\n      }\n      return ellipsis + text2.slice(lo);\n    } else {\n      while (lo < hi) {\n        mid = 1 + (lo + hi >>> 1);\n        if (width2(text2.slice(0, mid)) < limit) lo = mid;\n        else hi = mid - 1;\n      }\n      return text2.slice(0, lo) + ellipsis;\n    }\n  }\n  function fontFamily(item, quote) {\n    var font2 = item.font;\n    return (quote && font2 ? String(font2).replace(/\"/g, \"'\") : font2) || \"sans-serif\";\n  }\n  function font(item, quote) {\n    return (item.fontStyle ? item.fontStyle + \" \" : \"\") + (item.fontVariant ? item.fontVariant + \" \" : \"\") + (item.fontWeight ? item.fontWeight + \" \" : \"\") + fontSize(item) + \"px \" + fontFamily(item, quote);\n  }\n  function offset$2(item) {\n    var baseline2 = item.baseline, h2 = fontSize(item);\n    return Math.round(baseline2 === \"top\" ? 0.79 * h2 : baseline2 === \"middle\" ? 0.3 * h2 : baseline2 === \"bottom\" ? -0.21 * h2 : baseline2 === \"line-top\" ? 0.29 * h2 + 0.5 * lineHeight(item) : baseline2 === \"line-bottom\" ? 0.29 * h2 - 0.5 * lineHeight(item) : 0);\n  }\n  const textAlign = {\n    \"left\": \"start\",\n    \"center\": \"middle\",\n    \"right\": \"end\"\n  };\n  const tempBounds$1 = new Bounds();\n  function anchorPoint(item) {\n    var x2 = item.x || 0, y2 = item.y || 0, r = item.radius || 0, t;\n    if (r) {\n      t = (item.theta || 0) - HalfPi;\n      x2 += r * Math.cos(t);\n      y2 += r * Math.sin(t);\n    }\n    tempBounds$1.x1 = x2;\n    tempBounds$1.y1 = y2;\n    return tempBounds$1;\n  }\n  function attr(emit2, item) {\n    var dx = item.dx || 0, dy = (item.dy || 0) + offset$2(item), p = anchorPoint(item), x2 = p.x1, y2 = p.y1, a2 = item.angle || 0, t;\n    emit2(\"text-anchor\", textAlign[item.align] || \"start\");\n    if (a2) {\n      t = translate$2(x2, y2) + \" \" + rotate(a2);\n      if (dx || dy) t += \" \" + translate$2(dx, dy);\n    } else {\n      t = translate$2(x2 + dx, y2 + dy);\n    }\n    emit2(\"transform\", t);\n  }\n  function bound(bounds2, item, mode) {\n    var h2 = textMetrics.height(item), a2 = item.align, p = anchorPoint(item), x2 = p.x1, y2 = p.y1, dx = item.dx || 0, dy = (item.dy || 0) + offset$2(item) - Math.round(0.8 * h2), tl2 = textLines(item), w2;\n    if (isArray(tl2)) {\n      h2 += lineHeight(item) * (tl2.length - 1);\n      w2 = tl2.reduce((w3, t) => Math.max(w3, textMetrics.width(item, t)), 0);\n    } else {\n      w2 = textMetrics.width(item, tl2);\n    }\n    if (a2 === \"center\") {\n      dx -= w2 / 2;\n    } else if (a2 === \"right\") {\n      dx -= w2;\n    } else ;\n    bounds2.set(dx += x2, dy += y2, dx + w2, dy + h2);\n    if (item.angle && !mode) {\n      bounds2.rotate(item.angle * DegToRad, x2, y2);\n    } else if (mode === 2) {\n      return bounds2.rotatedPoints(item.angle * DegToRad, x2, y2);\n    }\n    return bounds2;\n  }\n  function draw$5(context2, scene, bounds2) {\n    visit(scene, (item) => {\n      var opacity = item.opacity == null ? 1 : item.opacity, p, x2, y2, i, lh, tl2, str;\n      if (bounds2 && !bounds2.intersects(item.bounds) || // bounds check\n      opacity === 0 || item.fontSize <= 0 || item.text == null || item.text.length === 0) return;\n      context2.font = font(item);\n      context2.textAlign = item.align || \"left\";\n      p = anchorPoint(item);\n      x2 = p.x1, y2 = p.y1;\n      if (item.angle) {\n        context2.save();\n        context2.translate(x2, y2);\n        context2.rotate(item.angle * DegToRad);\n        x2 = y2 = 0;\n      }\n      x2 += item.dx || 0;\n      y2 += (item.dy || 0) + offset$2(item);\n      tl2 = textLines(item);\n      blend(context2, item);\n      if (isArray(tl2)) {\n        lh = lineHeight(item);\n        for (i = 0; i < tl2.length; ++i) {\n          str = textValue(item, tl2[i]);\n          if (item.fill && fill(context2, item, opacity)) {\n            context2.fillText(str, x2, y2);\n          }\n          if (item.stroke && stroke(context2, item, opacity)) {\n            context2.strokeText(str, x2, y2);\n          }\n          y2 += lh;\n        }\n      } else {\n        str = textValue(item, tl2);\n        if (item.fill && fill(context2, item, opacity)) {\n          context2.fillText(str, x2, y2);\n        }\n        if (item.stroke && stroke(context2, item, opacity)) {\n          context2.strokeText(str, x2, y2);\n        }\n      }\n      if (item.angle) context2.restore();\n    });\n  }\n  function hit(context2, item, x2, y2, gx, gy) {\n    if (item.fontSize <= 0) return false;\n    if (!item.angle) return true;\n    var p = anchorPoint(item), ax = p.x1, ay = p.y1, b2 = bound(tempBounds$1, item, 1), a2 = -item.angle * DegToRad, cos2 = Math.cos(a2), sin2 = Math.sin(a2), px2 = cos2 * gx - sin2 * gy + (ax - cos2 * ax + sin2 * ay), py2 = sin2 * gx + cos2 * gy + (ay - sin2 * ax - cos2 * ay);\n    return b2.contains(px2, py2);\n  }\n  function intersectText(item, box2) {\n    const p = bound(tempBounds$1, item, 2);\n    return intersectBoxLine(box2, p[0], p[1], p[2], p[3]) || intersectBoxLine(box2, p[0], p[1], p[4], p[5]) || intersectBoxLine(box2, p[4], p[5], p[6], p[7]) || intersectBoxLine(box2, p[2], p[3], p[6], p[7]);\n  }\n  var text = {\n    type: \"text\",\n    tag: \"text\",\n    nested: false,\n    attr,\n    bound,\n    draw: draw$5,\n    pick: pick$1(hit),\n    isect: intersectText\n  };\n  var trail = markMultiItemPath(\"trail\", trail$1, pickTrail);\n  var Marks = {\n    arc: arc$2,\n    area: area$2,\n    group: group$1,\n    image,\n    line: line$2,\n    path: path$2,\n    rect,\n    rule: rule$1,\n    shape,\n    symbol,\n    text,\n    trail\n  };\n  function boundItem$1(item, func, opt) {\n    var type2 = Marks[item.mark.marktype], bound2 = func || type2.bound;\n    if (type2.nested) item = item.mark;\n    return bound2(item.bounds || (item.bounds = new Bounds()), item, opt);\n  }\n  var DUMMY = {\n    mark: null\n  };\n  function boundMark(mark, bounds2, opt) {\n    var type2 = Marks[mark.marktype], bound2 = type2.bound, items = mark.items, hasItems = items && items.length, i, n, item, b2;\n    if (type2.nested) {\n      if (hasItems) {\n        item = items[0];\n      } else {\n        DUMMY.mark = mark;\n        item = DUMMY;\n      }\n      b2 = boundItem$1(item, bound2, opt);\n      bounds2 = bounds2 && bounds2.union(b2) || b2;\n      return bounds2;\n    }\n    bounds2 = bounds2 || mark.bounds && mark.bounds.clear() || new Bounds();\n    if (hasItems) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        bounds2.union(boundItem$1(items[i], bound2, opt));\n      }\n    }\n    return mark.bounds = bounds2;\n  }\n  const keys$1 = [\n    \"marktype\",\n    \"name\",\n    \"role\",\n    \"interactive\",\n    \"clip\",\n    \"items\",\n    \"zindex\",\n    \"x\",\n    \"y\",\n    \"width\",\n    \"height\",\n    \"align\",\n    \"baseline\",\n    // layout\n    \"fill\",\n    \"fillOpacity\",\n    \"opacity\",\n    \"blend\",\n    // fill\n    \"stroke\",\n    \"strokeOpacity\",\n    \"strokeWidth\",\n    \"strokeCap\",\n    // stroke\n    \"strokeDash\",\n    \"strokeDashOffset\",\n    // stroke dash\n    \"strokeForeground\",\n    \"strokeOffset\",\n    // group\n    \"startAngle\",\n    \"endAngle\",\n    \"innerRadius\",\n    \"outerRadius\",\n    // arc\n    \"cornerRadius\",\n    \"padAngle\",\n    // arc, rect\n    \"cornerRadiusTopLeft\",\n    \"cornerRadiusTopRight\",\n    // rect, group\n    \"cornerRadiusBottomLeft\",\n    \"cornerRadiusBottomRight\",\n    \"interpolate\",\n    \"tension\",\n    \"orient\",\n    \"defined\",\n    // area, line\n    \"url\",\n    \"aspect\",\n    \"smooth\",\n    // image\n    \"path\",\n    \"scaleX\",\n    \"scaleY\",\n    // path\n    \"x2\",\n    \"y2\",\n    // rule\n    \"size\",\n    \"shape\",\n    // symbol\n    \"text\",\n    \"angle\",\n    \"theta\",\n    \"radius\",\n    \"dir\",\n    \"dx\",\n    \"dy\",\n    // text\n    \"ellipsis\",\n    \"limit\",\n    \"lineBreak\",\n    \"lineHeight\",\n    \"font\",\n    \"fontSize\",\n    \"fontWeight\",\n    \"fontStyle\",\n    \"fontVariant\",\n    // font\n    \"description\",\n    \"aria\",\n    \"ariaRole\",\n    \"ariaRoleDescription\"\n    // aria\n  ];\n  function sceneToJSON(scene, indent) {\n    return JSON.stringify(scene, keys$1, indent);\n  }\n  function sceneFromJSON(json2) {\n    const scene = typeof json2 === \"string\" ? JSON.parse(json2) : json2;\n    return initialize$1(scene);\n  }\n  function initialize$1(scene) {\n    var type2 = scene.marktype, items = scene.items, parent, i, n;\n    if (items) {\n      for (i = 0, n = items.length; i < n; ++i) {\n        parent = type2 ? \"mark\" : \"group\";\n        items[i][parent] = scene;\n        if (items[i].zindex) items[i][parent].zdirty = true;\n        if (\"group\" === (type2 || parent)) initialize$1(items[i]);\n      }\n    }\n    if (type2) boundMark(scene);\n    return scene;\n  }\n  class Scenegraph {\n    constructor(scene) {\n      if (arguments.length) {\n        this.root = sceneFromJSON(scene);\n      } else {\n        this.root = createMark({\n          marktype: \"group\",\n          name: \"root\",\n          role: \"frame\"\n        });\n        this.root.items = [new GroupItem(this.root)];\n      }\n    }\n    toJSON(indent) {\n      return sceneToJSON(this.root, indent || 0);\n    }\n    mark(markdef, group2, index2) {\n      group2 = group2 || this.root.items[0];\n      const mark = createMark(markdef, group2);\n      group2.items[index2] = mark;\n      if (mark.zindex) mark.group.zdirty = true;\n      return mark;\n    }\n  }\n  function createMark(def2, group2) {\n    const mark = {\n      bounds: new Bounds(),\n      clip: !!def2.clip,\n      group: group2,\n      interactive: def2.interactive === false ? false : true,\n      items: [],\n      marktype: def2.marktype,\n      name: def2.name || void 0,\n      role: def2.role || void 0,\n      zindex: def2.zindex || 0\n    };\n    if (def2.aria != null) {\n      mark.aria = def2.aria;\n    }\n    if (def2.description) {\n      mark.description = def2.description;\n    }\n    return mark;\n  }\n  function domCreate(doc, tag, ns) {\n    if (!doc && typeof document !== \"undefined\" && document.createElement) {\n      doc = document;\n    }\n    return doc ? ns ? doc.createElementNS(ns, tag) : doc.createElement(tag) : null;\n  }\n  function domFind(el, tag) {\n    tag = tag.toLowerCase();\n    var nodes = el.childNodes, i = 0, n = nodes.length;\n    for (; i < n; ++i) if (nodes[i].tagName.toLowerCase() === tag) {\n      return nodes[i];\n    }\n  }\n  function domChild(el, index2, tag, ns) {\n    var a2 = el.childNodes[index2], b2;\n    if (!a2 || a2.tagName.toLowerCase() !== tag.toLowerCase()) {\n      b2 = a2 || null;\n      a2 = domCreate(el.ownerDocument, tag, ns);\n      el.insertBefore(a2, b2);\n    }\n    return a2;\n  }\n  function domClear(el, index2) {\n    var nodes = el.childNodes, curr = nodes.length;\n    while (curr > index2) el.removeChild(nodes[--curr]);\n    return el;\n  }\n  function cssClass(mark) {\n    return \"mark-\" + mark.marktype + (mark.role ? \" role-\" + mark.role : \"\") + (mark.name ? \" \" + mark.name : \"\");\n  }\n  function point(event2, el) {\n    const rect2 = el.getBoundingClientRect();\n    return [event2.clientX - rect2.left - (el.clientLeft || 0), event2.clientY - rect2.top - (el.clientTop || 0)];\n  }\n  function resolveItem(item, event2, el, origin) {\n    var mark = item && item.mark, mdef, p;\n    if (mark && (mdef = Marks[mark.marktype]).tip) {\n      p = point(event2, el);\n      p[0] -= origin[0];\n      p[1] -= origin[1];\n      while (item = item.mark.group) {\n        p[0] -= item.x || 0;\n        p[1] -= item.y || 0;\n      }\n      item = mdef.tip(mark.items, p);\n    }\n    return item;\n  }\n  class Handler {\n    /**\n     * Create a new Handler instance.\n     * @param {object} [customLoader] - Optional loader instance for\n     *   href URL sanitization. If not specified, a standard loader\n     *   instance will be generated.\n     * @param {function} [customTooltip] - Optional tooltip handler\n     *   function for custom tooltip display.\n     * @constructor\n     */\n    constructor(customLoader, customTooltip) {\n      this._active = null;\n      this._handlers = {};\n      this._loader = customLoader || loader();\n      this._tooltip = customTooltip || defaultTooltip$1;\n    }\n    /**\n     * Initialize a new Handler instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {object} [obj] - Optional context object that should serve as\n     *   the \"this\" context for event callbacks.\n     * @return {Handler} - This handler instance.\n     */\n    initialize(el, origin, obj) {\n      this._el = el;\n      this._obj = obj || null;\n      return this.origin(origin);\n    }\n    /**\n     * Returns the parent container element for a visualization.\n     * @return {DOMElement} - The containing DOM element.\n     */\n    element() {\n      return this._el;\n    }\n    /**\n     * Returns the scene element (e.g., canvas or SVG) of the visualization\n     * Subclasses must override if the first child is not the scene element.\n     * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n     */\n    canvas() {\n      return this._el && this._el.firstChild;\n    }\n    /**\n     * Get / set the origin coordinates of the visualization.\n     */\n    origin(origin) {\n      if (arguments.length) {\n        this._origin = origin || [0, 0];\n        return this;\n      } else {\n        return this._origin.slice();\n      }\n    }\n    /**\n     * Get / set the scenegraph root.\n     */\n    scene(scene) {\n      if (!arguments.length) return this._scene;\n      this._scene = scene;\n      return this;\n    }\n    /**\n     * Add an event handler. Subclasses should override this method.\n     */\n    on() {\n    }\n    /**\n     * Remove an event handler. Subclasses should override this method.\n     */\n    off() {\n    }\n    /**\n     * Utility method for finding the array index of an event handler.\n     * @param {Array} h - An array of registered event handlers.\n     * @param {string} type - The event type.\n     * @param {function} handler - The event handler instance to find.\n     * @return {number} - The handler's array index or -1 if not registered.\n     */\n    _handlerIndex(h2, type2, handler) {\n      for (let i = h2 ? h2.length : 0; --i >= 0; ) {\n        if (h2[i].type === type2 && (!handler || h2[i].handler === handler)) {\n          return i;\n        }\n      }\n      return -1;\n    }\n    /**\n     * Returns an array with registered event handlers.\n     * @param {string} [type] - The event type to query. Any annotations\n     *   are ignored; for example, for the argument \"click.foo\", \".foo\" will\n     *   be ignored and the method returns all \"click\" handlers. If type is\n     *   null or unspecified, this method returns handlers for all types.\n     * @return {Array} - A new array containing all registered event handlers.\n     */\n    handlers(type2) {\n      const h2 = this._handlers, a2 = [];\n      if (type2) {\n        a2.push(...h2[this.eventName(type2)]);\n      } else {\n        for (const k in h2) {\n          a2.push(...h2[k]);\n        }\n      }\n      return a2;\n    }\n    /**\n     * Parses an event name string to return the specific event type.\n     * For example, given \"click.foo\" returns \"click\"\n     * @param {string} name - The input event type string.\n     * @return {string} - A string with the event type only.\n     */\n    eventName(name) {\n      const i = name.indexOf(\".\");\n      return i < 0 ? name : name.slice(0, i);\n    }\n    /**\n     * Handle hyperlink navigation in response to an item.href value.\n     * @param {Event} event - The event triggering hyperlink navigation.\n     * @param {Item} item - The scenegraph item.\n     * @param {string} href - The URL to navigate to.\n     */\n    handleHref(event2, item, href2) {\n      this._loader.sanitize(href2, {\n        context: \"href\"\n      }).then((opt) => {\n        const e = new MouseEvent(event2.type, event2), a2 = domCreate(null, \"a\");\n        for (const name in opt) a2.setAttribute(name, opt[name]);\n        a2.dispatchEvent(e);\n      }).catch(() => {\n      });\n    }\n    /**\n     * Handle tooltip display in response to an item.tooltip value.\n     * @param {Event} event - The event triggering tooltip display.\n     * @param {Item} item - The scenegraph item.\n     * @param {boolean} show - A boolean flag indicating whether\n     *   to show or hide a tooltip for the given item.\n     */\n    handleTooltip(event2, item, show) {\n      if (item && item.tooltip != null) {\n        item = resolveItem(item, event2, this.canvas(), this._origin);\n        const value2 = show && item && item.tooltip || null;\n        this._tooltip.call(this._obj, this, event2, item, value2);\n      }\n    }\n    /**\n     * Returns the size of a scenegraph item and its position relative\n     * to the viewport.\n     * @param {Item} item - The scenegraph item.\n     * @return {object} - A bounding box object (compatible with the\n     *   DOMRect type) consisting of x, y, width, heigh, top, left,\n     *   right, and bottom properties.\n     */\n    getItemBoundingClientRect(item) {\n      const el = this.canvas();\n      if (!el) return;\n      const rect2 = el.getBoundingClientRect(), origin = this._origin, bounds2 = item.bounds, width2 = bounds2.width(), height2 = bounds2.height();\n      let x2 = bounds2.x1 + origin[0] + rect2.left, y2 = bounds2.y1 + origin[1] + rect2.top;\n      while (item.mark && (item = item.mark.group)) {\n        x2 += item.x || 0;\n        y2 += item.y || 0;\n      }\n      return {\n        x: x2,\n        y: y2,\n        width: width2,\n        height: height2,\n        left: x2,\n        top: y2,\n        right: x2 + width2,\n        bottom: y2 + height2\n      };\n    }\n  }\n  function defaultTooltip$1(handler, event2, item, value2) {\n    handler.element().setAttribute(\"title\", value2 || \"\");\n  }\n  class Renderer {\n    /**\n     * Create a new Renderer instance.\n     * @param {object} [loader] - Optional loader instance for\n     *   image and href URL sanitization. If not specified, a\n     *   standard loader instance will be generated.\n     * @constructor\n     */\n    constructor(loader2) {\n      this._el = null;\n      this._bgcolor = null;\n      this._loader = new ResourceLoader(loader2);\n    }\n    /**\n     * Initialize a new Renderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {Renderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._el = el;\n      return this.resize(width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Returns the parent container element for a visualization.\n     * @return {DOMElement} - The containing DOM element.\n     */\n    element() {\n      return this._el;\n    }\n    /**\n     * Returns the scene element (e.g., canvas or SVG) of the visualization\n     * Subclasses must override if the first child is not the scene element.\n     * @return {DOMElement} - The scene (e.g., canvas or SVG) element.\n     */\n    canvas() {\n      return this._el && this._el.firstChild;\n    }\n    /**\n     * Get / set the background color.\n     */\n    background(bgcolor) {\n      if (arguments.length === 0) return this._bgcolor;\n      this._bgcolor = bgcolor;\n      return this;\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {Renderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      this._width = width2;\n      this._height = height2;\n      this._origin = origin || [0, 0];\n      this._scale = scaleFactor || 1;\n      return this;\n    }\n    /**\n     * Report a dirty item whose bounds should be redrawn.\n     * This base class method does nothing. Subclasses that perform\n     * incremental should implement this method.\n     * @param {Item} item - The dirty item whose bounds should be redrawn.\n     */\n    dirty() {\n    }\n    /**\n     * Render an input scenegraph, potentially with a set of dirty items.\n     * This method will perform an immediate rendering with available resources.\n     * The renderer may also need to perform image loading to perform a complete\n     * render. This process can lead to asynchronous re-rendering of the scene\n     * after this method returns. To receive notification when rendering is\n     * complete, use the renderAsync method instead.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     * @return {Renderer} - This renderer instance.\n     */\n    render(scene, markTypes) {\n      const r = this;\n      r._call = function() {\n        r._render(scene, markTypes);\n      };\n      r._call();\n      r._call = null;\n      return r;\n    }\n    /**\n     * Internal rendering method. Renderer subclasses should override this\n     * method to actually perform rendering.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render() {\n    }\n    /**\n     * Asynchronous rendering method. Similar to render, but returns a Promise\n     * that resolves when all rendering is completed. Sometimes a renderer must\n     * perform image loading to get a complete rendering. The returned\n     * Promise will not resolve until this process completes.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     * @return {Promise} - A Promise that resolves when rendering is complete.\n     */\n    renderAsync(scene, markTypes) {\n      const r = this.render(scene, markTypes);\n      return this._ready ? this._ready.then(() => r) : Promise.resolve(r);\n    }\n    /**\n     * Internal method for asynchronous resource loading.\n     * Proxies method calls to the ImageLoader, and tracks loading\n     * progress to invoke a re-render once complete.\n     * @param {string} method - The method name to invoke on the ImageLoader.\n     * @param {string} uri - The URI for the requested resource.\n     * @return {Promise} - A Promise that resolves to the requested resource.\n     */\n    _load(method2, uri) {\n      var r = this, p = r._loader[method2](uri);\n      if (!r._ready) {\n        const call = r._call;\n        r._ready = r._loader.ready().then((redraw) => {\n          if (redraw) call();\n          r._ready = null;\n        });\n      }\n      return p;\n    }\n    /**\n     * Sanitize a URL to include as a hyperlink in the rendered scene.\n     * This method proxies a call to ImageLoader.sanitizeURL, but also tracks\n     * image loading progress and invokes a re-render once complete.\n     * @param {string} uri - The URI string to sanitize.\n     * @return {Promise} - A Promise that resolves to the sanitized URL.\n     */\n    sanitizeURL(uri) {\n      return this._load(\"sanitizeURL\", uri);\n    }\n    /**\n     * Requests an image to include in the rendered scene.\n     * This method proxies a call to ImageLoader.loadImage, but also tracks\n     * image loading progress and invokes a re-render once complete.\n     * @param {string} uri - The URI string of the image.\n     * @return {Promise} - A Promise that resolves to the loaded Image.\n     */\n    loadImage(uri) {\n      return this._load(\"loadImage\", uri);\n    }\n  }\n  const KeyDownEvent = \"keydown\";\n  const KeyPressEvent = \"keypress\";\n  const KeyUpEvent = \"keyup\";\n  const DragEnterEvent = \"dragenter\";\n  const DragLeaveEvent = \"dragleave\";\n  const DragOverEvent = \"dragover\";\n  const PointerDownEvent = \"pointerdown\";\n  const PointerUpEvent = \"pointerup\";\n  const PointerMoveEvent = \"pointermove\";\n  const PointerOutEvent = \"pointerout\";\n  const PointerOverEvent = \"pointerover\";\n  const MouseDownEvent = \"mousedown\";\n  const MouseUpEvent = \"mouseup\";\n  const MouseMoveEvent = \"mousemove\";\n  const MouseOutEvent = \"mouseout\";\n  const MouseOverEvent = \"mouseover\";\n  const ClickEvent = \"click\";\n  const DoubleClickEvent = \"dblclick\";\n  const WheelEvent = \"wheel\";\n  const MouseWheelEvent = \"mousewheel\";\n  const TouchStartEvent = \"touchstart\";\n  const TouchMoveEvent = \"touchmove\";\n  const TouchEndEvent = \"touchend\";\n  const Events = [KeyDownEvent, KeyPressEvent, KeyUpEvent, DragEnterEvent, DragLeaveEvent, DragOverEvent, PointerDownEvent, PointerUpEvent, PointerMoveEvent, PointerOutEvent, PointerOverEvent, MouseDownEvent, MouseUpEvent, MouseMoveEvent, MouseOutEvent, MouseOverEvent, ClickEvent, DoubleClickEvent, WheelEvent, MouseWheelEvent, TouchStartEvent, TouchMoveEvent, TouchEndEvent];\n  const TooltipShowEvent = PointerMoveEvent;\n  const TooltipHideEvent = MouseOutEvent;\n  const HrefEvent = ClickEvent;\n  class CanvasHandler extends Handler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n      this._down = null;\n      this._touch = null;\n      this._first = true;\n      this._events = {};\n      this.events = Events;\n      this.pointermove = move([PointerMoveEvent, MouseMoveEvent], [PointerOverEvent, MouseOverEvent], [PointerOutEvent, MouseOutEvent]);\n      this.dragover = move([DragOverEvent], [DragEnterEvent], [DragLeaveEvent]), this.pointerout = inactive([PointerOutEvent, MouseOutEvent]);\n      this.dragleave = inactive([DragLeaveEvent]);\n    }\n    initialize(el, origin, obj) {\n      this._canvas = el && domFind(el, \"canvas\");\n      [ClickEvent, MouseDownEvent, PointerDownEvent, PointerMoveEvent, PointerOutEvent, DragLeaveEvent].forEach((type2) => eventListenerCheck(this, type2));\n      return super.initialize(el, origin, obj);\n    }\n    // return the backing canvas instance\n    canvas() {\n      return this._canvas;\n    }\n    // retrieve the current canvas context\n    context() {\n      return this._canvas.getContext(\"2d\");\n    }\n    // to keep old versions of firefox happy\n    DOMMouseScroll(evt) {\n      this.fire(MouseWheelEvent, evt);\n    }\n    pointerdown(evt) {\n      this._down = this._active;\n      this.fire(PointerDownEvent, evt);\n    }\n    mousedown(evt) {\n      this._down = this._active;\n      this.fire(MouseDownEvent, evt);\n    }\n    click(evt) {\n      if (this._down === this._active) {\n        this.fire(ClickEvent, evt);\n        this._down = null;\n      }\n    }\n    touchstart(evt) {\n      this._touch = this.pickEvent(evt.changedTouches[0]);\n      if (this._first) {\n        this._active = this._touch;\n        this._first = false;\n      }\n      this.fire(TouchStartEvent, evt, true);\n    }\n    touchmove(evt) {\n      this.fire(TouchMoveEvent, evt, true);\n    }\n    touchend(evt) {\n      this.fire(TouchEndEvent, evt, true);\n      this._touch = null;\n    }\n    // fire an event\n    fire(type2, evt, touch2) {\n      const a2 = touch2 ? this._touch : this._active, h2 = this._handlers[type2];\n      evt.vegaType = type2;\n      if (type2 === HrefEvent && a2 && a2.href) {\n        this.handleHref(evt, a2, a2.href);\n      } else if (type2 === TooltipShowEvent || type2 === TooltipHideEvent) {\n        this.handleTooltip(evt, a2, type2 !== TooltipHideEvent);\n      }\n      if (h2) {\n        for (let i = 0, len2 = h2.length; i < len2; ++i) {\n          h2[i].handler.call(this._obj, evt, a2);\n        }\n      }\n    }\n    // add an event handler\n    on(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers, i = this._handlerIndex(h2[name], type2, handler);\n      if (i < 0) {\n        eventListenerCheck(this, type2);\n        (h2[name] || (h2[name] = [])).push({\n          type: type2,\n          handler\n        });\n      }\n      return this;\n    }\n    // remove an event handler\n    off(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers[name], i = this._handlerIndex(h2, type2, handler);\n      if (i >= 0) {\n        h2.splice(i, 1);\n      }\n      return this;\n    }\n    pickEvent(evt) {\n      const p = point(evt, this._canvas), o = this._origin;\n      return this.pick(this._scene, p[0], p[1], p[0] - o[0], p[1] - o[1]);\n    }\n    // find the scenegraph item at the current pointer position\n    // x, y -- the absolute x, y pointer coordinates on the canvas element\n    // gx, gy -- the relative coordinates within the current group\n    pick(scene, x2, y2, gx, gy) {\n      const g = this.context(), mark = Marks[scene.marktype];\n      return mark.pick.call(this, g, scene, x2, y2, gx, gy);\n    }\n  }\n  const eventBundle = (type2) => type2 === TouchStartEvent || type2 === TouchMoveEvent || type2 === TouchEndEvent ? [TouchStartEvent, TouchMoveEvent, TouchEndEvent] : [type2];\n  function eventListenerCheck(handler, type2) {\n    eventBundle(type2).forEach((_) => addEventListener(handler, _));\n  }\n  function addEventListener(handler, type2) {\n    const canvas = handler.canvas();\n    if (canvas && !handler._events[type2]) {\n      handler._events[type2] = 1;\n      canvas.addEventListener(type2, handler[type2] ? (evt) => handler[type2](evt) : (evt) => handler.fire(type2, evt));\n    }\n  }\n  function fireAll(handler, types, event2) {\n    types.forEach((type2) => handler.fire(type2, event2));\n  }\n  function move(moveEvents, overEvents, outEvents) {\n    return function(evt) {\n      const a2 = this._active, p = this.pickEvent(evt);\n      if (p === a2) {\n        fireAll(this, moveEvents, evt);\n      } else {\n        if (!a2 || !a2.exit) {\n          fireAll(this, outEvents, evt);\n        }\n        this._active = p;\n        fireAll(this, overEvents, evt);\n        fireAll(this, moveEvents, evt);\n      }\n    };\n  }\n  function inactive(types) {\n    return function(evt) {\n      fireAll(this, types, evt);\n      this._active = null;\n    };\n  }\n  function devicePixelRatio$1() {\n    return typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1;\n  }\n  function resize(canvas, width2, height2, origin, scaleFactor, opt) {\n    const inDOM = typeof HTMLElement !== \"undefined\" && canvas instanceof HTMLElement && canvas.parentNode != null, context2 = canvas.getContext(\"2d\"), ratio = inDOM ? devicePixelRatio$1() : scaleFactor;\n    canvas.width = width2 * ratio;\n    canvas.height = height2 * ratio;\n    for (const key2 in opt) {\n      context2[key2] = opt[key2];\n    }\n    if (inDOM && ratio !== 1) {\n      canvas.style.width = width2 + \"px\";\n      canvas.style.height = height2 + \"px\";\n    }\n    context2.pixelRatio = ratio;\n    context2.setTransform(ratio, 0, 0, ratio, ratio * origin[0], ratio * origin[1]);\n    return canvas;\n  }\n  class CanvasRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._options = {};\n      this._redraw = false;\n      this._dirty = new Bounds();\n      this._tempb = new Bounds();\n    }\n    initialize(el, width2, height2, origin, scaleFactor, options) {\n      this._options = options || {};\n      this._canvas = this._options.externalContext ? null : domCanvas(1, 1, this._options.type);\n      if (el && this._canvas) {\n        domClear(el, 0).appendChild(this._canvas);\n        this._canvas.setAttribute(\"class\", \"marks\");\n      }\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      if (this._canvas) {\n        resize(this._canvas, this._width, this._height, this._origin, this._scale, this._options.context);\n      } else {\n        const ctx = this._options.externalContext;\n        if (!ctx) error(\"CanvasRenderer is missing a valid canvas or context\");\n        ctx.scale(this._scale, this._scale);\n        ctx.translate(this._origin[0], this._origin[1]);\n      }\n      this._redraw = true;\n      return this;\n    }\n    canvas() {\n      return this._canvas;\n    }\n    context() {\n      return this._options.externalContext || (this._canvas ? this._canvas.getContext(\"2d\") : null);\n    }\n    dirty(item) {\n      const b2 = this._tempb.clear().union(item.bounds);\n      let g = item.mark.group;\n      while (g) {\n        b2.translate(g.x || 0, g.y || 0);\n        g = g.mark.group;\n      }\n      this._dirty.union(b2);\n    }\n    _render(scene, markTypes) {\n      const g = this.context(), o = this._origin, w2 = this._width, h2 = this._height, db = this._dirty, vb = viewBounds(o, w2, h2);\n      g.save();\n      const b2 = this._redraw || db.empty() ? (this._redraw = false, vb.expand(1)) : clipToBounds(g, vb.intersect(db), o);\n      this.clear(-o[0], -o[1], w2, h2);\n      this.draw(g, scene, b2, markTypes);\n      g.restore();\n      db.clear();\n      return this;\n    }\n    draw(ctx, scene, bounds2, markTypes) {\n      if (scene.marktype !== \"group\" && markTypes != null && !markTypes.includes(scene.marktype)) {\n        return;\n      }\n      const mark = Marks[scene.marktype];\n      if (scene.clip) clip$2(ctx, scene);\n      mark.draw.call(this, ctx, scene, bounds2, markTypes);\n      if (scene.clip) ctx.restore();\n    }\n    clear(x2, y2, w2, h2) {\n      const opt = this._options, g = this.context();\n      if (opt.type !== \"pdf\" && !opt.externalContext) {\n        g.clearRect(x2, y2, w2, h2);\n      }\n      if (this._bgcolor != null) {\n        g.fillStyle = this._bgcolor;\n        g.fillRect(x2, y2, w2, h2);\n      }\n    }\n  }\n  const viewBounds = (origin, width2, height2) => new Bounds().set(0, 0, width2, height2).translate(-origin[0], -origin[1]);\n  function clipToBounds(g, b2, origin) {\n    b2.expand(1).round();\n    if (g.pixelRatio % 1) {\n      b2.scale(g.pixelRatio).round().scale(1 / g.pixelRatio);\n    }\n    b2.translate(-(origin[0] % 1), -(origin[1] % 1));\n    g.beginPath();\n    g.rect(b2.x1, b2.y1, b2.width(), b2.height());\n    g.clip();\n    return b2;\n  }\n  class SVGHandler extends Handler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n      const h2 = this;\n      h2._hrefHandler = listener(h2, (evt, item) => {\n        if (item && item.href) h2.handleHref(evt, item, item.href);\n      });\n      h2._tooltipHandler = listener(h2, (evt, item) => {\n        h2.handleTooltip(evt, item, evt.type !== TooltipHideEvent);\n      });\n    }\n    initialize(el, origin, obj) {\n      let svg = this._svg;\n      if (svg) {\n        svg.removeEventListener(HrefEvent, this._hrefHandler);\n        svg.removeEventListener(TooltipShowEvent, this._tooltipHandler);\n        svg.removeEventListener(TooltipHideEvent, this._tooltipHandler);\n      }\n      this._svg = svg = el && domFind(el, \"svg\");\n      if (svg) {\n        svg.addEventListener(HrefEvent, this._hrefHandler);\n        svg.addEventListener(TooltipShowEvent, this._tooltipHandler);\n        svg.addEventListener(TooltipHideEvent, this._tooltipHandler);\n      }\n      return super.initialize(el, origin, obj);\n    }\n    canvas() {\n      return this._svg;\n    }\n    // add an event handler\n    on(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers, i = this._handlerIndex(h2[name], type2, handler);\n      if (i < 0) {\n        const x2 = {\n          type: type2,\n          handler,\n          listener: listener(this, handler)\n        };\n        (h2[name] || (h2[name] = [])).push(x2);\n        if (this._svg) {\n          this._svg.addEventListener(name, x2.listener);\n        }\n      }\n      return this;\n    }\n    // remove an event handler\n    off(type2, handler) {\n      const name = this.eventName(type2), h2 = this._handlers[name], i = this._handlerIndex(h2, type2, handler);\n      if (i >= 0) {\n        if (this._svg) {\n          this._svg.removeEventListener(name, h2[i].listener);\n        }\n        h2.splice(i, 1);\n      }\n      return this;\n    }\n  }\n  const listener = (context2, handler) => (evt) => {\n    let item = evt.target.__data__;\n    item = Array.isArray(item) ? item[0] : item;\n    evt.vegaType = evt.type;\n    handler.call(context2._obj, evt, item);\n  };\n  const ARIA_HIDDEN = \"aria-hidden\";\n  const ARIA_LABEL = \"aria-label\";\n  const ARIA_ROLE = \"role\";\n  const ARIA_ROLEDESCRIPTION = \"aria-roledescription\";\n  const GRAPHICS_OBJECT = \"graphics-object\";\n  const GRAPHICS_SYMBOL = \"graphics-symbol\";\n  const bundle = (role, roledesc, label2) => ({\n    [ARIA_ROLE]: role,\n    [ARIA_ROLEDESCRIPTION]: roledesc,\n    [ARIA_LABEL]: label2 || void 0\n  });\n  const AriaIgnore = toSet([\"axis-domain\", \"axis-grid\", \"axis-label\", \"axis-tick\", \"axis-title\", \"legend-band\", \"legend-entry\", \"legend-gradient\", \"legend-label\", \"legend-title\", \"legend-symbol\", \"title\"]);\n  const AriaGuides = {\n    \"axis\": {\n      desc: \"axis\",\n      caption: axisCaption\n    },\n    \"legend\": {\n      desc: \"legend\",\n      caption: legendCaption\n    },\n    \"title-text\": {\n      desc: \"title\",\n      caption: (item) => `Title text '${titleCaption(item)}'`\n    },\n    \"title-subtitle\": {\n      desc: \"subtitle\",\n      caption: (item) => `Subtitle text '${titleCaption(item)}'`\n    }\n  };\n  const AriaEncode = {\n    ariaRole: ARIA_ROLE,\n    ariaRoleDescription: ARIA_ROLEDESCRIPTION,\n    description: ARIA_LABEL\n  };\n  function ariaItemAttributes(emit2, item) {\n    const hide = item.aria === false;\n    emit2(ARIA_HIDDEN, hide || void 0);\n    if (hide || item.description == null) {\n      for (const prop in AriaEncode) {\n        emit2(AriaEncode[prop], void 0);\n      }\n    } else {\n      const type2 = item.mark.marktype;\n      emit2(ARIA_LABEL, item.description);\n      emit2(ARIA_ROLE, item.ariaRole || (type2 === \"group\" ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL));\n      emit2(ARIA_ROLEDESCRIPTION, item.ariaRoleDescription || `${type2} mark`);\n    }\n  }\n  function ariaMarkAttributes(mark) {\n    return mark.aria === false ? {\n      [ARIA_HIDDEN]: true\n    } : AriaIgnore[mark.role] ? null : AriaGuides[mark.role] ? ariaGuide(mark, AriaGuides[mark.role]) : ariaMark(mark);\n  }\n  function ariaMark(mark) {\n    const type2 = mark.marktype;\n    const recurse2 = type2 === \"group\" || type2 === \"text\" || mark.items.some((_) => _.description != null && _.aria !== false);\n    return bundle(recurse2 ? GRAPHICS_OBJECT : GRAPHICS_SYMBOL, `${type2} mark container`, mark.description);\n  }\n  function ariaGuide(mark, opt) {\n    try {\n      const item = mark.items[0], caption = opt.caption || (() => \"\");\n      return bundle(opt.role || GRAPHICS_SYMBOL, opt.desc, item.description || caption(item));\n    } catch (err) {\n      return null;\n    }\n  }\n  function titleCaption(item) {\n    return array$5(item.text).join(\" \");\n  }\n  function axisCaption(item) {\n    const datum2 = item.datum, orient = item.orient, title = datum2.title ? extractTitle(item) : null, ctx = item.context, scale2 = ctx.scales[datum2.scale].value, locale2 = ctx.dataflow.locale(), type2 = scale2.type, xy = orient === \"left\" || orient === \"right\" ? \"Y\" : \"X\";\n    return `${xy}-axis` + (title ? ` titled '${title}'` : \"\") + ` for a ${isDiscrete(type2) ? \"discrete\" : type2} scale with ${domainCaption(locale2, scale2, item)}`;\n  }\n  function legendCaption(item) {\n    const datum2 = item.datum, title = datum2.title ? extractTitle(item) : null, type2 = `${datum2.type || \"\"} legend`.trim(), scales2 = datum2.scales, props = Object.keys(scales2), ctx = item.context, scale2 = ctx.scales[scales2[props[0]]].value, locale2 = ctx.dataflow.locale();\n    return capitalize(type2) + (title ? ` titled '${title}'` : \"\") + ` for ${channelCaption(props)} with ${domainCaption(locale2, scale2, item)}`;\n  }\n  function extractTitle(item) {\n    try {\n      return array$5(peek$1(item.items).items[0].text).join(\" \");\n    } catch (err) {\n      return null;\n    }\n  }\n  function channelCaption(props) {\n    props = props.map((p) => p + (p === \"fill\" || p === \"stroke\" ? \" color\" : \"\"));\n    return props.length < 2 ? props[0] : props.slice(0, -1).join(\", \") + \" and \" + peek$1(props);\n  }\n  function capitalize(s) {\n    return s.length ? s[0].toUpperCase() + s.slice(1) : s;\n  }\n  const innerText = (val) => (val + \"\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n  const attrText = (val) => innerText(val).replace(/\"/g, \"&quot;\").replace(/\\t/g, \"&#x9;\").replace(/\\n/g, \"&#xA;\").replace(/\\r/g, \"&#xD;\");\n  function markup() {\n    let buf = \"\", outer = \"\", inner = \"\";\n    const stack = [], clear = () => outer = inner = \"\", push = (tag) => {\n      if (outer) {\n        buf += `${outer}>${inner}`;\n        clear();\n      }\n      stack.push(tag);\n    }, attr2 = (name, value2) => {\n      if (value2 != null) outer += ` ${name}=\"${attrText(value2)}\"`;\n      return m2;\n    }, m2 = {\n      open(tag, ...attrs) {\n        push(tag);\n        outer = \"<\" + tag;\n        for (const set2 of attrs) {\n          for (const key2 in set2) attr2(key2, set2[key2]);\n        }\n        return m2;\n      },\n      close() {\n        const tag = stack.pop();\n        if (outer) {\n          buf += outer + (inner ? `>${inner}</${tag}>` : \"/>\");\n        } else {\n          buf += `</${tag}>`;\n        }\n        clear();\n        return m2;\n      },\n      attr: attr2,\n      text: (t) => (inner += innerText(t), m2),\n      toString: () => buf\n    };\n    return m2;\n  }\n  const serializeXML = (node) => _serialize(markup(), node) + \"\";\n  function _serialize(m2, node) {\n    m2.open(node.tagName);\n    if (node.hasAttributes()) {\n      const attrs = node.attributes, n = attrs.length;\n      for (let i = 0; i < n; ++i) {\n        m2.attr(attrs[i].name, attrs[i].value);\n      }\n    }\n    if (node.hasChildNodes()) {\n      const children2 = node.childNodes;\n      for (const child of children2) {\n        child.nodeType === 3 ? m2.text(child.nodeValue) : _serialize(m2, child);\n      }\n    }\n    return m2.close();\n  }\n  const stylesAttr = {\n    fill: \"fill\",\n    fillOpacity: \"fill-opacity\",\n    stroke: \"stroke\",\n    strokeOpacity: \"stroke-opacity\",\n    strokeWidth: \"stroke-width\",\n    strokeCap: \"stroke-linecap\",\n    strokeJoin: \"stroke-linejoin\",\n    strokeDash: \"stroke-dasharray\",\n    strokeDashOffset: \"stroke-dashoffset\",\n    strokeMiterLimit: \"stroke-miterlimit\",\n    opacity: \"opacity\"\n  };\n  const stylesCss = {\n    blend: \"mix-blend-mode\"\n  };\n  const rootAttributes = {\n    \"fill\": \"none\",\n    \"stroke-miterlimit\": 10\n  };\n  const RootIndex = 0, xmlns = \"http://www.w3.org/2000/xmlns/\", svgns = metadata.xmlns;\n  class SVGRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._dirtyID = 0;\n      this._dirty = [];\n      this._svg = null;\n      this._root = null;\n      this._defs = null;\n    }\n    /**\n     * Initialize a new SVGRenderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._defs = {};\n      this._clearDefs();\n      if (el) {\n        this._svg = domChild(el, 0, \"svg\", svgns);\n        this._svg.setAttributeNS(xmlns, \"xmlns\", svgns);\n        this._svg.setAttributeNS(xmlns, \"xmlns:xlink\", metadata[\"xmlns:xlink\"]);\n        this._svg.setAttribute(\"version\", metadata[\"version\"]);\n        this._svg.setAttribute(\"class\", \"marks\");\n        domClear(el, 1);\n        this._root = domChild(this._svg, RootIndex, \"g\", svgns);\n        setAttributes(this._root, rootAttributes);\n        domClear(this._svg, RootIndex + 1);\n      }\n      this.background(this._bgcolor);\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Get / set the background color.\n     */\n    background(bgcolor) {\n      if (arguments.length && this._svg) {\n        this._svg.style.setProperty(\"background-color\", bgcolor);\n      }\n      return super.background(...arguments);\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      if (this._svg) {\n        setAttributes(this._svg, {\n          width: this._width * this._scale,\n          height: this._height * this._scale,\n          viewBox: `0 0 ${this._width} ${this._height}`\n        });\n        this._root.setAttribute(\"transform\", `translate(${this._origin})`);\n      }\n      this._dirty = [];\n      return this;\n    }\n    /**\n     * Returns the SVG element of the visualization.\n     * @return {DOMElement} - The SVG element.\n     */\n    canvas() {\n      return this._svg;\n    }\n    /**\n     * Returns an SVG text string for the rendered content,\n     * or null if this renderer is currently headless.\n     */\n    svg() {\n      const svg = this._svg, bg = this._bgcolor;\n      if (!svg) return null;\n      let node;\n      if (bg) {\n        svg.removeAttribute(\"style\");\n        node = domChild(svg, RootIndex, \"rect\", svgns);\n        setAttributes(node, {\n          width: this._width,\n          height: this._height,\n          fill: bg\n        });\n      }\n      const text2 = serializeXML(svg);\n      if (bg) {\n        svg.removeChild(node);\n        this._svg.style.setProperty(\"background-color\", bg);\n      }\n      return text2;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render(scene, markTypes) {\n      if (this._dirtyCheck()) {\n        if (this._dirtyAll) this._clearDefs();\n        this.mark(this._root, scene, void 0, markTypes);\n        domClear(this._root, 1);\n      }\n      this.defs();\n      this._dirty = [];\n      ++this._dirtyID;\n      return this;\n    }\n    // -- Manage rendering of items marked as dirty --\n    /**\n     * Flag a mark item as dirty.\n     * @param {Item} item - The mark item.\n     */\n    dirty(item) {\n      if (item.dirty !== this._dirtyID) {\n        item.dirty = this._dirtyID;\n        this._dirty.push(item);\n      }\n    }\n    /**\n     * Check if a mark item is considered dirty.\n     * @param {Item} item - The mark item.\n     */\n    isDirty(item) {\n      return this._dirtyAll || !item._svg || !item._svg.ownerSVGElement || item.dirty === this._dirtyID;\n    }\n    /**\n     * Internal method to check dirty status and, if possible,\n     * make targetted updates without a full rendering pass.\n     */\n    _dirtyCheck() {\n      this._dirtyAll = true;\n      const items = this._dirty;\n      if (!items.length || !this._dirtyID) return true;\n      const id2 = ++this._dirtyID;\n      let item, mark, type2, mdef, i, n, o;\n      for (i = 0, n = items.length; i < n; ++i) {\n        item = items[i];\n        mark = item.mark;\n        if (mark.marktype !== type2) {\n          type2 = mark.marktype;\n          mdef = Marks[type2];\n        }\n        if (mark.zdirty && mark.dirty !== id2) {\n          this._dirtyAll = false;\n          dirtyParents(item, id2);\n          mark.items.forEach((i2) => {\n            i2.dirty = id2;\n          });\n        }\n        if (mark.zdirty) continue;\n        if (item.exit) {\n          if (mdef.nested && mark.items.length) {\n            o = mark.items[0];\n            if (o._svg) this._update(mdef, o._svg, o);\n          } else if (item._svg) {\n            o = item._svg.parentNode;\n            if (o) o.removeChild(item._svg);\n          }\n          item._svg = null;\n          continue;\n        }\n        item = mdef.nested ? mark.items[0] : item;\n        if (item._update === id2) continue;\n        if (!item._svg || !item._svg.ownerSVGElement) {\n          this._dirtyAll = false;\n          dirtyParents(item, id2);\n        } else {\n          this._update(mdef, item._svg, item);\n        }\n        item._update = id2;\n      }\n      return !this._dirtyAll;\n    }\n    // -- Construct & maintain scenegraph to SVG mapping ---\n    /**\n     * Render a set of mark items.\n     * @param {SVGElement} el - The parent element in the SVG tree.\n     * @param {object} scene - The mark parent to render.\n     * @param {SVGElement} prev - The previous sibling in the SVG tree.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    mark(el, scene, prev, markTypes) {\n      if (!this.isDirty(scene)) {\n        return scene._svg;\n      }\n      const svg = this._svg, markType2 = scene.marktype, mdef = Marks[markType2], events2 = scene.interactive === false ? \"none\" : null, isGroup = mdef.tag === \"g\";\n      const parent = bind$1(scene, el, prev, \"g\", svg);\n      if (markType2 !== \"group\" && markTypes != null && !markTypes.includes(markType2)) {\n        domClear(parent, 0);\n        return scene._svg;\n      }\n      parent.setAttribute(\"class\", cssClass(scene));\n      const aria = ariaMarkAttributes(scene);\n      for (const key2 in aria) setAttribute$1(parent, key2, aria[key2]);\n      if (!isGroup) {\n        setAttribute$1(parent, \"pointer-events\", events2);\n      }\n      setAttribute$1(parent, \"clip-path\", scene.clip ? clip$1$1(this, scene, scene.group) : null);\n      let sibling = null, i = 0;\n      const process = (item) => {\n        const dirty = this.isDirty(item), node = bind$1(item, parent, sibling, mdef.tag, svg);\n        if (dirty) {\n          this._update(mdef, node, item);\n          if (isGroup) recurse(this, node, item, markTypes);\n        }\n        sibling = node;\n        ++i;\n      };\n      if (mdef.nested) {\n        if (scene.items.length) process(scene.items[0]);\n      } else {\n        visit(scene, process);\n      }\n      domClear(parent, i);\n      return parent;\n    }\n    /**\n     * Update the attributes of an SVG element for a mark item.\n     * @param {object} mdef - The mark definition object\n     * @param {SVGElement} el - The SVG element.\n     * @param {Item} item - The mark item.\n     */\n    _update(mdef, el, item) {\n      element$1 = el;\n      values = el.__values__;\n      ariaItemAttributes(emit, item);\n      mdef.attr(emit, item, this);\n      const extra = mark_extras[mdef.type];\n      if (extra) extra.call(this, mdef, el, item);\n      if (element$1) this.style(element$1, item);\n    }\n    /**\n     * Update the presentation attributes of an SVG element for a mark item.\n     * @param {SVGElement} el - The SVG element.\n     * @param {Item} item - The mark item.\n     */\n    style(el, item) {\n      if (item == null) return;\n      for (const prop in stylesAttr) {\n        let value2 = prop === \"font\" ? fontFamily(item) : item[prop];\n        if (value2 === values[prop]) continue;\n        const name = stylesAttr[prop];\n        if (value2 == null) {\n          el.removeAttribute(name);\n        } else {\n          if (isGradient(value2)) {\n            value2 = gradientRef(value2, this._defs.gradient, href());\n          }\n          el.setAttribute(name, value2 + \"\");\n        }\n        values[prop] = value2;\n      }\n      for (const prop in stylesCss) {\n        setStyle(el, stylesCss[prop], item[prop]);\n      }\n    }\n    /**\n     * Render SVG defs, as needed.\n     * Must be called *after* marks have been processed to ensure the\n     * collected state is current and accurate.\n     */\n    defs() {\n      const svg = this._svg, defs = this._defs;\n      let el = defs.el, index2 = 0;\n      for (const id2 in defs.gradient) {\n        if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n        index2 = updateGradient(el, defs.gradient[id2], index2);\n      }\n      for (const id2 in defs.clipping) {\n        if (!el) defs.el = el = domChild(svg, RootIndex + 1, \"defs\", svgns);\n        index2 = updateClipping(el, defs.clipping[id2], index2);\n      }\n      if (el) {\n        index2 === 0 ? (svg.removeChild(el), defs.el = null) : domClear(el, index2);\n      }\n    }\n    /**\n     * Clear defs caches.\n     */\n    _clearDefs() {\n      const def2 = this._defs;\n      def2.gradient = {};\n      def2.clipping = {};\n    }\n  }\n  function dirtyParents(item, id2) {\n    for (; item && item.dirty !== id2; item = item.mark.group) {\n      item.dirty = id2;\n      if (item.mark && item.mark.dirty !== id2) {\n        item.mark.dirty = id2;\n      } else return;\n    }\n  }\n  function updateGradient(el, grad, index2) {\n    let i, n, stop2;\n    if (grad.gradient === \"radial\") {\n      let pt = domChild(el, index2++, \"pattern\", svgns);\n      setAttributes(pt, {\n        id: patternPrefix + grad.id,\n        viewBox: \"0,0,1,1\",\n        width: \"100%\",\n        height: \"100%\",\n        preserveAspectRatio: \"xMidYMid slice\"\n      });\n      pt = domChild(pt, 0, \"rect\", svgns);\n      setAttributes(pt, {\n        width: 1,\n        height: 1,\n        fill: `url(${href()}#${grad.id})`\n      });\n      el = domChild(el, index2++, \"radialGradient\", svgns);\n      setAttributes(el, {\n        id: grad.id,\n        fx: grad.x1,\n        fy: grad.y1,\n        fr: grad.r1,\n        cx: grad.x2,\n        cy: grad.y2,\n        r: grad.r2\n      });\n    } else {\n      el = domChild(el, index2++, \"linearGradient\", svgns);\n      setAttributes(el, {\n        id: grad.id,\n        x1: grad.x1,\n        x2: grad.x2,\n        y1: grad.y1,\n        y2: grad.y2\n      });\n    }\n    for (i = 0, n = grad.stops.length; i < n; ++i) {\n      stop2 = domChild(el, i, \"stop\", svgns);\n      stop2.setAttribute(\"offset\", grad.stops[i].offset);\n      stop2.setAttribute(\"stop-color\", grad.stops[i].color);\n    }\n    domClear(el, i);\n    return index2;\n  }\n  function updateClipping(el, clip2, index2) {\n    let mask;\n    el = domChild(el, index2, \"clipPath\", svgns);\n    el.setAttribute(\"id\", clip2.id);\n    if (clip2.path) {\n      mask = domChild(el, 0, \"path\", svgns);\n      mask.setAttribute(\"d\", clip2.path);\n    } else {\n      mask = domChild(el, 0, \"rect\", svgns);\n      setAttributes(mask, {\n        x: 0,\n        y: 0,\n        width: clip2.width,\n        height: clip2.height\n      });\n    }\n    domClear(el, 1);\n    return index2 + 1;\n  }\n  function recurse(renderer, el, group2, markTypes) {\n    el = el.lastChild.previousSibling;\n    let prev, idx = 0;\n    visit(group2, (item) => {\n      prev = renderer.mark(el, item, prev, markTypes);\n      ++idx;\n    });\n    domClear(el, 1 + idx);\n  }\n  function bind$1(item, el, sibling, tag, svg) {\n    let node = item._svg, doc;\n    if (!node) {\n      doc = el.ownerDocument;\n      node = domCreate(doc, tag, svgns);\n      item._svg = node;\n      if (item.mark) {\n        node.__data__ = item;\n        node.__values__ = {\n          fill: \"default\"\n        };\n        if (tag === \"g\") {\n          const bg = domCreate(doc, \"path\", svgns);\n          node.appendChild(bg);\n          bg.__data__ = item;\n          const cg = domCreate(doc, \"g\", svgns);\n          node.appendChild(cg);\n          cg.__data__ = item;\n          const fg = domCreate(doc, \"path\", svgns);\n          node.appendChild(fg);\n          fg.__data__ = item;\n          fg.__values__ = {\n            fill: \"default\"\n          };\n        }\n      }\n    }\n    if (node.ownerSVGElement !== svg || siblingCheck(node, sibling)) {\n      el.insertBefore(node, sibling ? sibling.nextSibling : el.firstChild);\n    }\n    return node;\n  }\n  function siblingCheck(node, sibling) {\n    return node.parentNode && node.parentNode.childNodes.length > 1 && node.previousSibling != sibling;\n  }\n  let element$1 = null, values = null;\n  const mark_extras = {\n    group(mdef, el, item) {\n      const fg = element$1 = el.childNodes[2];\n      values = fg.__values__;\n      mdef.foreground(emit, item, this);\n      values = el.__values__;\n      element$1 = el.childNodes[1];\n      mdef.content(emit, item, this);\n      const bg = element$1 = el.childNodes[0];\n      mdef.background(emit, item, this);\n      const value2 = item.mark.interactive === false ? \"none\" : null;\n      if (value2 !== values.events) {\n        setAttribute$1(fg, \"pointer-events\", value2);\n        setAttribute$1(bg, \"pointer-events\", value2);\n        values.events = value2;\n      }\n      if (item.strokeForeground && item.stroke) {\n        const fill2 = item.fill;\n        setAttribute$1(fg, \"display\", null);\n        this.style(bg, item);\n        setAttribute$1(bg, \"stroke\", null);\n        if (fill2) item.fill = null;\n        values = fg.__values__;\n        this.style(fg, item);\n        if (fill2) item.fill = fill2;\n        element$1 = null;\n      } else {\n        setAttribute$1(fg, \"display\", \"none\");\n      }\n    },\n    image(mdef, el, item) {\n      if (item.smooth === false) {\n        setStyle(el, \"image-rendering\", \"optimizeSpeed\");\n        setStyle(el, \"image-rendering\", \"pixelated\");\n      } else {\n        setStyle(el, \"image-rendering\", null);\n      }\n    },\n    text(mdef, el, item) {\n      const tl2 = textLines(item);\n      let key2, value2, doc, lh;\n      if (isArray(tl2)) {\n        value2 = tl2.map((_) => textValue(item, _));\n        key2 = value2.join(\"\\n\");\n        if (key2 !== values.text) {\n          domClear(el, 0);\n          doc = el.ownerDocument;\n          lh = lineHeight(item);\n          value2.forEach((t, i) => {\n            const ts2 = domCreate(doc, \"tspan\", svgns);\n            ts2.__data__ = item;\n            ts2.textContent = t;\n            if (i) {\n              ts2.setAttribute(\"x\", 0);\n              ts2.setAttribute(\"dy\", lh);\n            }\n            el.appendChild(ts2);\n          });\n          values.text = key2;\n        }\n      } else {\n        value2 = textValue(item, tl2);\n        if (value2 !== values.text) {\n          el.textContent = value2;\n          values.text = value2;\n        }\n      }\n      setAttribute$1(el, \"font-family\", fontFamily(item));\n      setAttribute$1(el, \"font-size\", fontSize(item) + \"px\");\n      setAttribute$1(el, \"font-style\", item.fontStyle);\n      setAttribute$1(el, \"font-variant\", item.fontVariant);\n      setAttribute$1(el, \"font-weight\", item.fontWeight);\n    }\n  };\n  function emit(name, value2, ns) {\n    if (value2 === values[name]) return;\n    if (ns) {\n      setAttributeNS(element$1, name, value2, ns);\n    } else {\n      setAttribute$1(element$1, name, value2);\n    }\n    values[name] = value2;\n  }\n  function setStyle(el, name, value2) {\n    if (value2 !== values[name]) {\n      if (value2 == null) {\n        el.style.removeProperty(name);\n      } else {\n        el.style.setProperty(name, value2 + \"\");\n      }\n      values[name] = value2;\n    }\n  }\n  function setAttributes(el, attrs) {\n    for (const key2 in attrs) {\n      setAttribute$1(el, key2, attrs[key2]);\n    }\n  }\n  function setAttribute$1(el, name, value2) {\n    if (value2 != null) {\n      el.setAttribute(name, value2);\n    } else {\n      el.removeAttribute(name);\n    }\n  }\n  function setAttributeNS(el, name, value2, ns) {\n    if (value2 != null) {\n      el.setAttributeNS(ns, name, value2);\n    } else {\n      el.removeAttributeNS(ns, name);\n    }\n  }\n  function href() {\n    let loc;\n    return typeof window === \"undefined\" ? \"\" : (loc = window.location).hash ? loc.href.slice(0, -loc.hash.length) : loc.href;\n  }\n  class SVGStringRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._text = null;\n      this._defs = {\n        gradient: {},\n        clipping: {}\n      };\n    }\n    /**\n     * Returns the rendered SVG text string,\n     * or null if rendering has not yet occurred.\n     */\n    svg() {\n      return this._text;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     */\n    _render(scene) {\n      const m2 = markup();\n      m2.open(\"svg\", extend$1({}, metadata, {\n        class: \"marks\",\n        width: this._width * this._scale,\n        height: this._height * this._scale,\n        viewBox: `0 0 ${this._width} ${this._height}`\n      }));\n      const bg = this._bgcolor;\n      if (bg && bg !== \"transparent\" && bg !== \"none\") {\n        m2.open(\"rect\", {\n          width: this._width,\n          height: this._height,\n          fill: bg\n        }).close();\n      }\n      m2.open(\"g\", rootAttributes, {\n        transform: \"translate(\" + this._origin + \")\"\n      });\n      this.mark(m2, scene);\n      m2.close();\n      this.defs(m2);\n      this._text = m2.close() + \"\";\n      return this;\n    }\n    /**\n     * Render a set of mark items.\n     * @param {object} m - The markup context.\n     * @param {object} scene - The mark parent to render.\n     */\n    mark(m2, scene) {\n      const mdef = Marks[scene.marktype], tag = mdef.tag, attrList = [ariaItemAttributes, mdef.attr];\n      m2.open(\"g\", {\n        \"class\": cssClass(scene),\n        \"clip-path\": scene.clip ? clip$1$1(this, scene, scene.group) : null\n      }, ariaMarkAttributes(scene), {\n        \"pointer-events\": tag !== \"g\" && scene.interactive === false ? \"none\" : null\n      });\n      const process = (item) => {\n        const href2 = this.href(item);\n        if (href2) m2.open(\"a\", href2);\n        m2.open(tag, this.attr(scene, item, attrList, tag !== \"g\" ? tag : null));\n        if (tag === \"text\") {\n          const tl2 = textLines(item);\n          if (isArray(tl2)) {\n            const attrs = {\n              x: 0,\n              dy: lineHeight(item)\n            };\n            for (let i = 0; i < tl2.length; ++i) {\n              m2.open(\"tspan\", i ? attrs : null).text(textValue(item, tl2[i])).close();\n            }\n          } else {\n            m2.text(textValue(item, tl2));\n          }\n        } else if (tag === \"g\") {\n          const fore = item.strokeForeground, fill2 = item.fill, stroke2 = item.stroke;\n          if (fore && stroke2) {\n            item.stroke = null;\n          }\n          m2.open(\"path\", this.attr(scene, item, mdef.background, \"bgrect\")).close();\n          m2.open(\"g\", this.attr(scene, item, mdef.content));\n          visit(item, (scene2) => this.mark(m2, scene2));\n          m2.close();\n          if (fore && stroke2) {\n            if (fill2) item.fill = null;\n            item.stroke = stroke2;\n            m2.open(\"path\", this.attr(scene, item, mdef.foreground, \"bgrect\")).close();\n            if (fill2) item.fill = fill2;\n          } else {\n            m2.open(\"path\", this.attr(scene, item, mdef.foreground, \"bgfore\")).close();\n          }\n        }\n        m2.close();\n        if (href2) m2.close();\n      };\n      if (mdef.nested) {\n        if (scene.items && scene.items.length) process(scene.items[0]);\n      } else {\n        visit(scene, process);\n      }\n      return m2.close();\n    }\n    /**\n     * Get href attributes for a hyperlinked mark item.\n     * @param {Item} item - The mark item.\n     */\n    href(item) {\n      const href2 = item.href;\n      let attr2;\n      if (href2) {\n        if (attr2 = this._hrefs && this._hrefs[href2]) {\n          return attr2;\n        } else {\n          this.sanitizeURL(href2).then((attr3) => {\n            attr3[\"xlink:href\"] = attr3.href;\n            attr3.href = null;\n            (this._hrefs || (this._hrefs = {}))[href2] = attr3;\n          });\n        }\n      }\n      return null;\n    }\n    /**\n     * Get an object of SVG attributes for a mark item.\n     * @param {object} scene - The mark parent.\n     * @param {Item} item - The mark item.\n     * @param {array|function} attrs - One or more attribute emitters.\n     * @param {string} tag - The tag being rendered.\n     */\n    attr(scene, item, attrs, tag) {\n      const object2 = {}, emit2 = (name, value2, ns, prefixed) => {\n        object2[prefixed || name] = value2;\n      };\n      if (Array.isArray(attrs)) {\n        attrs.forEach((fn) => fn(emit2, item, this));\n      } else {\n        attrs(emit2, item, this);\n      }\n      if (tag) {\n        style(object2, item, scene, tag, this._defs);\n      }\n      return object2;\n    }\n    /**\n     * Render SVG defs, as needed.\n     * Must be called *after* marks have been processed to ensure the\n     * collected state is current and accurate.\n     * @param {object} m - The markup context.\n     */\n    defs(m2) {\n      const gradient2 = this._defs.gradient, clipping = this._defs.clipping, count2 = Object.keys(gradient2).length + Object.keys(clipping).length;\n      if (count2 === 0) return;\n      m2.open(\"defs\");\n      for (const id2 in gradient2) {\n        const def2 = gradient2[id2], stops = def2.stops;\n        if (def2.gradient === \"radial\") {\n          m2.open(\"pattern\", {\n            id: patternPrefix + id2,\n            viewBox: \"0,0,1,1\",\n            width: \"100%\",\n            height: \"100%\",\n            preserveAspectRatio: \"xMidYMid slice\"\n          });\n          m2.open(\"rect\", {\n            width: \"1\",\n            height: \"1\",\n            fill: \"url(#\" + id2 + \")\"\n          }).close();\n          m2.close();\n          m2.open(\"radialGradient\", {\n            id: id2,\n            fx: def2.x1,\n            fy: def2.y1,\n            fr: def2.r1,\n            cx: def2.x2,\n            cy: def2.y2,\n            r: def2.r2\n          });\n        } else {\n          m2.open(\"linearGradient\", {\n            id: id2,\n            x1: def2.x1,\n            x2: def2.x2,\n            y1: def2.y1,\n            y2: def2.y2\n          });\n        }\n        for (let i = 0; i < stops.length; ++i) {\n          m2.open(\"stop\", {\n            offset: stops[i].offset,\n            \"stop-color\": stops[i].color\n          }).close();\n        }\n        m2.close();\n      }\n      for (const id2 in clipping) {\n        const def2 = clipping[id2];\n        m2.open(\"clipPath\", {\n          id: id2\n        });\n        if (def2.path) {\n          m2.open(\"path\", {\n            d: def2.path\n          }).close();\n        } else {\n          m2.open(\"rect\", {\n            x: 0,\n            y: 0,\n            width: def2.width,\n            height: def2.height\n          }).close();\n        }\n        m2.close();\n      }\n      m2.close();\n    }\n  }\n  function style(s, item, scene, tag, defs) {\n    let styleList;\n    if (item == null) return s;\n    if (tag === \"bgrect\" && scene.interactive === false) {\n      s[\"pointer-events\"] = \"none\";\n    }\n    if (tag === \"bgfore\") {\n      if (scene.interactive === false) {\n        s[\"pointer-events\"] = \"none\";\n      }\n      s.display = \"none\";\n      if (item.fill !== null) return s;\n    }\n    if (tag === \"image\" && item.smooth === false) {\n      styleList = [\"image-rendering: optimizeSpeed;\", \"image-rendering: pixelated;\"];\n    }\n    if (tag === \"text\") {\n      s[\"font-family\"] = fontFamily(item);\n      s[\"font-size\"] = fontSize(item) + \"px\";\n      s[\"font-style\"] = item.fontStyle;\n      s[\"font-variant\"] = item.fontVariant;\n      s[\"font-weight\"] = item.fontWeight;\n    }\n    for (const prop in stylesAttr) {\n      let value2 = item[prop];\n      const name = stylesAttr[prop];\n      if (value2 === \"transparent\" && (name === \"fill\" || name === \"stroke\")) ;\n      else if (value2 != null) {\n        if (isGradient(value2)) {\n          value2 = gradientRef(value2, defs.gradient, \"\");\n        }\n        s[name] = value2;\n      }\n    }\n    for (const prop in stylesCss) {\n      const value2 = item[prop];\n      if (value2 != null) {\n        styleList = styleList || [];\n        styleList.push(`${stylesCss[prop]}: ${value2};`);\n      }\n    }\n    if (styleList) {\n      s.style = styleList.join(\" \");\n    }\n    return s;\n  }\n  const OPTS = {\n    svgMarkTypes: [\"text\"],\n    svgOnTop: true,\n    debug: false\n  };\n  function setHybridRendererOptions(options) {\n    OPTS[\"svgMarkTypes\"] = options.svgMarkTypes ?? [\"text\"];\n    OPTS[\"svgOnTop\"] = options.svgOnTop ?? true;\n    OPTS[\"debug\"] = options.debug ?? false;\n  }\n  class HybridRenderer extends Renderer {\n    constructor(loader2) {\n      super(loader2);\n      this._svgRenderer = new SVGRenderer(loader2);\n      this._canvasRenderer = new CanvasRenderer(loader2);\n    }\n    /**\n     * Initialize a new HybridRenderer instance.\n     * @param {DOMElement} el - The containing DOM element for the display.\n     * @param {number} width - The coordinate width of the display, in pixels.\n     * @param {number} height - The coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {HybridRenderer} - This renderer instance.\n     */\n    initialize(el, width2, height2, origin, scaleFactor) {\n      this._root_el = domChild(el, 0, \"div\");\n      const bottomEl = domChild(this._root_el, 0, \"div\");\n      const topEl = domChild(this._root_el, 1, \"div\");\n      this._root_el.style.position = \"relative\";\n      if (!OPTS.debug) {\n        bottomEl.style.height = \"100%\";\n        topEl.style.position = \"absolute\";\n        topEl.style.top = \"0\";\n        topEl.style.left = \"0\";\n        topEl.style.height = \"100%\";\n        topEl.style.width = \"100%\";\n      }\n      this._svgEl = OPTS.svgOnTop ? topEl : bottomEl;\n      this._canvasEl = OPTS.svgOnTop ? bottomEl : topEl;\n      this._svgEl.style.pointerEvents = \"none\";\n      this._canvasRenderer.initialize(this._canvasEl, width2, height2, origin, scaleFactor);\n      this._svgRenderer.initialize(this._svgEl, width2, height2, origin, scaleFactor);\n      return super.initialize(el, width2, height2, origin, scaleFactor);\n    }\n    /**\n     * Flag a mark item as dirty.\n     * @param {Item} item - The mark item.\n     */\n    dirty(item) {\n      if (OPTS.svgMarkTypes.includes(item.mark.marktype)) {\n        this._svgRenderer.dirty(item);\n      } else {\n        this._canvasRenderer.dirty(item);\n      }\n      return this;\n    }\n    /**\n     * Internal rendering method.\n     * @param {object} scene - The root mark of a scenegraph to render.\n     * @param {Array} markTypes - Array of the mark types to render.\n     *                            If undefined, render all mark types\n     */\n    _render(scene, markTypes) {\n      const allMarkTypes = markTypes ?? [\"arc\", \"area\", \"image\", \"line\", \"path\", \"rect\", \"rule\", \"shape\", \"symbol\", \"text\", \"trail\"];\n      const canvasMarkTypes = allMarkTypes.filter((m2) => !OPTS.svgMarkTypes.includes(m2));\n      this._svgRenderer.render(scene, OPTS.svgMarkTypes);\n      this._canvasRenderer.render(scene, canvasMarkTypes);\n    }\n    /**\n     * Resize the display.\n     * @param {number} width - The new coordinate width of the display, in pixels.\n     * @param {number} height - The new coordinate height of the display, in pixels.\n     * @param {Array<number>} origin - The new origin of the display, in pixels.\n     *   The coordinate system will be translated to this point.\n     * @param {number} [scaleFactor=1] - Optional scaleFactor by which to multiply\n     *   the width and height to determine the final pixel size.\n     * @return {SVGRenderer} - This renderer instance;\n     */\n    resize(width2, height2, origin, scaleFactor) {\n      super.resize(width2, height2, origin, scaleFactor);\n      this._svgRenderer.resize(width2, height2, origin, scaleFactor);\n      this._canvasRenderer.resize(width2, height2, origin, scaleFactor);\n      return this;\n    }\n    background(bgcolor) {\n      if (OPTS.svgOnTop) {\n        this._canvasRenderer.background(bgcolor);\n      } else {\n        this._svgRenderer.background(bgcolor);\n      }\n      return this;\n    }\n  }\n  class HybridHandler extends CanvasHandler {\n    constructor(loader2, tooltip) {\n      super(loader2, tooltip);\n    }\n    initialize(el, origin, obj) {\n      const canvas = domChild(domChild(el, 0, \"div\"), OPTS.svgOnTop ? 0 : 1, \"div\");\n      return super.initialize(canvas, origin, obj);\n    }\n  }\n  const Canvas = \"canvas\";\n  const Hybrid = \"hybrid\";\n  const PNG = \"png\";\n  const SVG = \"svg\";\n  const None$1 = \"none\";\n  const RenderType = {\n    Canvas,\n    PNG,\n    SVG,\n    Hybrid,\n    None: None$1\n  };\n  const modules = {};\n  modules[Canvas] = modules[PNG] = {\n    renderer: CanvasRenderer,\n    headless: CanvasRenderer,\n    handler: CanvasHandler\n  };\n  modules[SVG] = {\n    renderer: SVGRenderer,\n    headless: SVGStringRenderer,\n    handler: SVGHandler\n  };\n  modules[Hybrid] = {\n    renderer: HybridRenderer,\n    headless: HybridRenderer,\n    handler: HybridHandler\n  };\n  modules[None$1] = {};\n  function renderModule(name, _) {\n    name = String(name || \"\").toLowerCase();\n    if (arguments.length > 1) {\n      modules[name] = _;\n      return this;\n    } else {\n      return modules[name];\n    }\n  }\n  function intersect$2(scene, bounds2, filter2) {\n    const hits = [], box2 = new Bounds().union(bounds2), type2 = scene.marktype;\n    return type2 ? intersectMark(scene, box2, filter2, hits) : type2 === \"group\" ? intersectGroup(scene, box2, filter2, hits) : error(\"Intersect scene must be mark node or group item.\");\n  }\n  function intersectMark(mark, box2, filter2, hits) {\n    if (visitMark(mark, box2, filter2)) {\n      const items = mark.items, type2 = mark.marktype, n = items.length;\n      let i = 0;\n      if (type2 === \"group\") {\n        for (; i < n; ++i) {\n          intersectGroup(items[i], box2, filter2, hits);\n        }\n      } else {\n        for (const test2 = Marks[type2].isect; i < n; ++i) {\n          const item = items[i];\n          if (intersectItem(item, box2, test2)) hits.push(item);\n        }\n      }\n    }\n    return hits;\n  }\n  function visitMark(mark, box2, filter2) {\n    return mark.bounds && box2.intersects(mark.bounds) && (mark.marktype === \"group\" || mark.interactive !== false && (!filter2 || filter2(mark)));\n  }\n  function intersectGroup(group2, box2, filter2, hits) {\n    if (filter2 && filter2(group2.mark) && intersectItem(group2, box2, Marks.group.isect)) {\n      hits.push(group2);\n    }\n    const marks = group2.items, n = marks && marks.length;\n    if (n) {\n      const x2 = group2.x || 0, y2 = group2.y || 0;\n      box2.translate(-x2, -y2);\n      for (let i = 0; i < n; ++i) {\n        intersectMark(marks[i], box2, filter2, hits);\n      }\n      box2.translate(x2, y2);\n    }\n    return hits;\n  }\n  function intersectItem(item, box2, test2) {\n    const bounds2 = item.bounds;\n    return box2.encloses(bounds2) || box2.intersects(bounds2) && test2(item, box2);\n  }\n  const clipBounds = new Bounds();\n  function boundClip(mark) {\n    const clip2 = mark.clip;\n    if (isFunction(clip2)) {\n      clip2(boundContext(clipBounds.clear()));\n    } else if (clip2) {\n      clipBounds.set(0, 0, mark.group.width, mark.group.height);\n    } else return;\n    mark.bounds.intersect(clipBounds);\n  }\n  const TOLERANCE = 1e-9;\n  function sceneEqual(a2, b2, key2) {\n    return a2 === b2 ? true : key2 === \"path\" ? pathEqual(a2, b2) : a2 instanceof Date && b2 instanceof Date ? +a2 === +b2 : isNumber$1(a2) && isNumber$1(b2) ? Math.abs(a2 - b2) <= TOLERANCE : !a2 || !b2 || !isObject$1(a2) && !isObject$1(b2) ? a2 == b2 : objectEqual(a2, b2);\n  }\n  function pathEqual(a2, b2) {\n    return sceneEqual(parse$3(a2), parse$3(b2));\n  }\n  function objectEqual(a2, b2) {\n    var ka = Object.keys(a2), kb = Object.keys(b2), key2, i;\n    if (ka.length !== kb.length) return false;\n    ka.sort();\n    kb.sort();\n    for (i = ka.length - 1; i >= 0; i--) {\n      if (ka[i] != kb[i]) return false;\n    }\n    for (i = ka.length - 1; i >= 0; i--) {\n      key2 = ka[i];\n      if (!sceneEqual(a2[key2], b2[key2], key2)) return false;\n    }\n    return typeof a2 === typeof b2;\n  }\n  function resetSVGDefIds() {\n    resetSVGClipId();\n    resetSVGGradientId();\n  }\n  const Top$1 = \"top\";\n  const Left$1 = \"left\";\n  const Right$1 = \"right\";\n  const Bottom$1 = \"bottom\";\n  const TopLeft = \"top-left\";\n  const TopRight = \"top-right\";\n  const BottomLeft = \"bottom-left\";\n  const BottomRight = \"bottom-right\";\n  const Start$1 = \"start\";\n  const Middle$1 = \"middle\";\n  const End$1 = \"end\";\n  const X = \"x\";\n  const Y = \"y\";\n  const Group = \"group\";\n  const AxisRole$1 = \"axis\";\n  const TitleRole$1 = \"title\";\n  const FrameRole$1 = \"frame\";\n  const ScopeRole$1 = \"scope\";\n  const LegendRole$1 = \"legend\";\n  const RowHeader = \"row-header\";\n  const RowFooter = \"row-footer\";\n  const RowTitle = \"row-title\";\n  const ColHeader = \"column-header\";\n  const ColFooter = \"column-footer\";\n  const ColTitle = \"column-title\";\n  const Padding$1 = \"padding\";\n  const Symbols$1 = \"symbol\";\n  const Fit = \"fit\";\n  const FitX = \"fit-x\";\n  const FitY = \"fit-y\";\n  const Pad = \"pad\";\n  const None = \"none\";\n  const All = \"all\";\n  const Each = \"each\";\n  const Flush = \"flush\";\n  const Column = \"column\";\n  const Row = \"row\";\n  function Bound$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Bound$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow, mark = _.mark, type2 = mark.marktype, entry2 = Marks[type2], bound2 = entry2.bound;\n      let markBounds = mark.bounds, rebound;\n      if (entry2.nested) {\n        if (mark.items.length) view.dirty(mark.items[0]);\n        markBounds = boundItem(mark, bound2);\n        mark.items.forEach((item) => {\n          item.bounds.clear().union(markBounds);\n        });\n      } else if (type2 === Group || _.modified()) {\n        pulse2.visit(pulse2.MOD, (item) => view.dirty(item));\n        markBounds.clear();\n        mark.items.forEach((item) => markBounds.union(boundItem(item, bound2)));\n        switch (mark.role) {\n          case AxisRole$1:\n          case LegendRole$1:\n          case TitleRole$1:\n            pulse2.reflow();\n        }\n      } else {\n        rebound = pulse2.changed(pulse2.REM);\n        pulse2.visit(pulse2.ADD, (item) => {\n          markBounds.union(boundItem(item, bound2));\n        });\n        pulse2.visit(pulse2.MOD, (item) => {\n          rebound = rebound || markBounds.alignsWith(item.bounds);\n          view.dirty(item);\n          markBounds.union(boundItem(item, bound2));\n        });\n        if (rebound) {\n          markBounds.clear();\n          mark.items.forEach((item) => markBounds.union(item.bounds));\n        }\n      }\n      boundClip(mark);\n      return pulse2.modifies(\"bounds\");\n    }\n  });\n  function boundItem(item, bound2, opt) {\n    return bound2(item.bounds.clear(), item, opt);\n  }\n  const COUNTER_NAME = \":vega_identifier:\";\n  function Identifier$1(params2) {\n    Transform.call(this, 0, params2);\n  }\n  Identifier$1.Definition = {\n    \"type\": \"Identifier\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"required\": true\n    }]\n  };\n  inherits(Identifier$1, Transform, {\n    transform(_, pulse2) {\n      const counter = getCounter(pulse2.dataflow), as = _.as;\n      let id2 = counter.value;\n      pulse2.visit(pulse2.ADD, (t) => t[as] = t[as] || ++id2);\n      counter.set(this.value = id2);\n      return pulse2;\n    }\n  });\n  function getCounter(view) {\n    return view._signals[COUNTER_NAME] || (view._signals[COUNTER_NAME] = view.add(0));\n  }\n  function Mark$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Mark$1, Transform, {\n    transform(_, pulse2) {\n      let mark = this.value;\n      if (!mark) {\n        mark = pulse2.dataflow.scenegraph().mark(_.markdef, lookup$1$1(_), _.index);\n        mark.group.context = _.context;\n        if (!_.context.group) _.context.group = mark.group;\n        mark.source = this.source;\n        mark.clip = _.clip;\n        mark.interactive = _.interactive;\n        this.value = mark;\n      }\n      const Init = mark.marktype === Group ? GroupItem : Item;\n      pulse2.visit(pulse2.ADD, (item) => Init.call(item, mark));\n      if (_.modified(\"clip\") || _.modified(\"interactive\")) {\n        mark.clip = _.clip;\n        mark.interactive = !!_.interactive;\n        mark.zdirty = true;\n        pulse2.reflow();\n      }\n      mark.items = pulse2.source;\n      return pulse2;\n    }\n  });\n  function lookup$1$1(_) {\n    const g = _.groups, p = _.parent;\n    return g && g.size === 1 ? g.get(Object.keys(g.object)[0]) : g && p ? g.lookup(p) : null;\n  }\n  function Overlap$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  const methods = {\n    parity: (items) => items.filter((item, i) => i % 2 ? item.opacity = 0 : 1),\n    greedy: (items, sep) => {\n      let a2;\n      return items.filter((b2, i) => !i || !intersect$1(a2.bounds, b2.bounds, sep) ? (a2 = b2, 1) : b2.opacity = 0);\n    }\n  };\n  const intersect$1 = (a2, b2, sep) => sep > Math.max(b2.x1 - a2.x2, a2.x1 - b2.x2, b2.y1 - a2.y2, a2.y1 - b2.y2);\n  const hasOverlap = (items, pad2) => {\n    for (var i = 1, n = items.length, a2 = items[0].bounds, b2; i < n; a2 = b2, ++i) {\n      if (intersect$1(a2, b2 = items[i].bounds, pad2)) return true;\n    }\n  };\n  const hasBounds = (item) => {\n    const b2 = item.bounds;\n    return b2.width() > 1 && b2.height() > 1;\n  };\n  const boundTest = (scale2, orient, tolerance) => {\n    var range2 = scale2.range(), b2 = new Bounds();\n    if (orient === Top$1 || orient === Bottom$1) {\n      b2.set(range2[0], -Infinity, range2[1], Infinity);\n    } else {\n      b2.set(-Infinity, range2[0], Infinity, range2[1]);\n    }\n    b2.expand(tolerance || 1);\n    return (item) => b2.encloses(item.bounds);\n  };\n  const reset = (source2) => {\n    source2.forEach((item) => item.opacity = 1);\n    return source2;\n  };\n  const reflow = (pulse2, _) => pulse2.reflow(_.modified()).modifies(\"opacity\");\n  inherits(Overlap$1, Transform, {\n    transform(_, pulse2) {\n      const reduce = methods[_.method] || methods.parity, sep = _.separation || 0;\n      let source2 = pulse2.materialize(pulse2.SOURCE).source, items, test2;\n      if (!source2 || !source2.length) return;\n      if (!_.method) {\n        if (_.modified(\"method\")) {\n          reset(source2);\n          pulse2 = reflow(pulse2, _);\n        }\n        return pulse2;\n      }\n      source2 = source2.filter(hasBounds);\n      if (!source2.length) return;\n      if (_.sort) {\n        source2 = source2.slice().sort(_.sort);\n      }\n      items = reset(source2);\n      pulse2 = reflow(pulse2, _);\n      if (items.length >= 3 && hasOverlap(items, sep)) {\n        do {\n          items = reduce(items, sep);\n        } while (items.length >= 3 && hasOverlap(items, sep));\n        if (items.length < 3 && !peek$1(source2).opacity) {\n          if (items.length > 1) peek$1(items).opacity = 0;\n          peek$1(source2).opacity = 1;\n        }\n      }\n      if (_.boundScale && _.boundTolerance >= 0) {\n        test2 = boundTest(_.boundScale, _.boundOrient, +_.boundTolerance);\n        source2.forEach((item) => {\n          if (!test2(item)) item.opacity = 0;\n        });\n      }\n      const bounds2 = items[0].mark.bounds.clear();\n      source2.forEach((item) => {\n        if (item.opacity) bounds2.union(item.bounds);\n      });\n      return pulse2;\n    }\n  });\n  function Render$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Render$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow;\n      pulse2.visit(pulse2.ALL, (item) => view.dirty(item));\n      if (pulse2.fields && pulse2.fields[\"zindex\"]) {\n        const item = pulse2.source && pulse2.source[0];\n        if (item) item.mark.zdirty = true;\n      }\n    }\n  });\n  const tempBounds = new Bounds();\n  function set$6(item, property2, value2) {\n    return item[property2] === value2 ? 0 : (item[property2] = value2, 1);\n  }\n  function isYAxis(mark) {\n    var orient = mark.items[0].orient;\n    return orient === Left$1 || orient === Right$1;\n  }\n  function axisIndices(datum2) {\n    let index2 = +datum2.grid;\n    return [\n      datum2.ticks ? index2++ : -1,\n      // ticks index\n      datum2.labels ? index2++ : -1,\n      // labels index\n      index2 + +datum2.domain\n      // title index\n    ];\n  }\n  function axisLayout(view, axis, width2, height2) {\n    var item = axis.items[0], datum2 = item.datum, delta = item.translate != null ? item.translate : 0.5, orient = item.orient, indices = axisIndices(datum2), range2 = item.range, offset2 = item.offset, position2 = item.position, minExtent = item.minExtent, maxExtent = item.maxExtent, title = datum2.title && item.items[indices[2]].items[0], titlePadding = item.titlePadding, bounds2 = item.bounds, dl = title && multiLineOffset(title), x2 = 0, y2 = 0, i, s;\n    tempBounds.clear().union(bounds2);\n    bounds2.clear();\n    if ((i = indices[0]) > -1) bounds2.union(item.items[i].bounds);\n    if ((i = indices[1]) > -1) bounds2.union(item.items[i].bounds);\n    switch (orient) {\n      case Top$1:\n        x2 = position2 || 0;\n        y2 = -offset2;\n        s = Math.max(minExtent, Math.min(maxExtent, -bounds2.y1));\n        bounds2.add(0, -s).add(range2, 0);\n        if (title) axisTitleLayout(view, title, s, titlePadding, dl, 0, -1, bounds2);\n        break;\n      case Left$1:\n        x2 = -offset2;\n        y2 = position2 || 0;\n        s = Math.max(minExtent, Math.min(maxExtent, -bounds2.x1));\n        bounds2.add(-s, 0).add(0, range2);\n        if (title) axisTitleLayout(view, title, s, titlePadding, dl, 1, -1, bounds2);\n        break;\n      case Right$1:\n        x2 = width2 + offset2;\n        y2 = position2 || 0;\n        s = Math.max(minExtent, Math.min(maxExtent, bounds2.x2));\n        bounds2.add(0, 0).add(s, range2);\n        if (title) axisTitleLayout(view, title, s, titlePadding, dl, 1, 1, bounds2);\n        break;\n      case Bottom$1:\n        x2 = position2 || 0;\n        y2 = height2 + offset2;\n        s = Math.max(minExtent, Math.min(maxExtent, bounds2.y2));\n        bounds2.add(0, 0).add(range2, s);\n        if (title) axisTitleLayout(view, title, s, titlePadding, 0, 0, 1, bounds2);\n        break;\n      default:\n        x2 = item.x;\n        y2 = item.y;\n    }\n    boundStroke(bounds2.translate(x2, y2), item);\n    if (set$6(item, \"x\", x2 + delta) | set$6(item, \"y\", y2 + delta)) {\n      item.bounds = tempBounds;\n      view.dirty(item);\n      item.bounds = bounds2;\n      view.dirty(item);\n    }\n    return item.mark.bounds.clear().union(bounds2);\n  }\n  function axisTitleLayout(view, title, offset2, pad2, dl, isYAxis2, sign2, bounds2) {\n    const b2 = title.bounds;\n    if (title.auto) {\n      const v = sign2 * (offset2 + dl + pad2);\n      let dx = 0, dy = 0;\n      view.dirty(title);\n      isYAxis2 ? dx = (title.x || 0) - (title.x = v) : dy = (title.y || 0) - (title.y = v);\n      title.mark.bounds.clear().union(b2.translate(-dx, -dy));\n      view.dirty(title);\n    }\n    bounds2.union(b2);\n  }\n  const min$1 = (a2, b2) => Math.floor(Math.min(a2, b2));\n  const max$1 = (a2, b2) => Math.ceil(Math.max(a2, b2));\n  function gridLayoutGroups(group2) {\n    var groups = group2.items, n = groups.length, i = 0, mark, items;\n    const views = {\n      marks: [],\n      rowheaders: [],\n      rowfooters: [],\n      colheaders: [],\n      colfooters: [],\n      rowtitle: null,\n      coltitle: null\n    };\n    for (; i < n; ++i) {\n      mark = groups[i];\n      items = mark.items;\n      if (mark.marktype === Group) {\n        switch (mark.role) {\n          case AxisRole$1:\n          case LegendRole$1:\n          case TitleRole$1:\n            break;\n          case RowHeader:\n            views.rowheaders.push(...items);\n            break;\n          case RowFooter:\n            views.rowfooters.push(...items);\n            break;\n          case ColHeader:\n            views.colheaders.push(...items);\n            break;\n          case ColFooter:\n            views.colfooters.push(...items);\n            break;\n          case RowTitle:\n            views.rowtitle = items[0];\n            break;\n          case ColTitle:\n            views.coltitle = items[0];\n            break;\n          default:\n            views.marks.push(...items);\n        }\n      }\n    }\n    return views;\n  }\n  function bboxFlush(item) {\n    return new Bounds().set(0, 0, item.width || 0, item.height || 0);\n  }\n  function bboxFull(item) {\n    const b2 = item.bounds.clone();\n    return b2.empty() ? b2.set(0, 0, 0, 0) : b2.translate(-(item.x || 0), -(item.y || 0));\n  }\n  function get$1(opt, key2, d) {\n    const v = isObject$1(opt) ? opt[key2] : opt;\n    return v != null ? v : d !== void 0 ? d : 0;\n  }\n  function offsetValue$1(v) {\n    return v < 0 ? Math.ceil(-v) : 0;\n  }\n  function gridLayout(view, groups, opt) {\n    var dirty = !opt.nodirty, bbox = opt.bounds === Flush ? bboxFlush : bboxFull, bounds2 = tempBounds.set(0, 0, 0, 0), alignCol = get$1(opt.align, Column), alignRow = get$1(opt.align, Row), padCol = get$1(opt.padding, Column), padRow = get$1(opt.padding, Row), ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), n = groups.length, xOffset = Array(n), xExtent = Array(ncols), xMax = 0, yOffset = Array(n), yExtent = Array(nrows), yMax = 0, dx = Array(n), dy = Array(n), boxes = Array(n), m2, i, c2, r, b2, g, px2, py2, x2, y2, offset2;\n    for (i = 0; i < ncols; ++i) xExtent[i] = 0;\n    for (i = 0; i < nrows; ++i) yExtent[i] = 0;\n    for (i = 0; i < n; ++i) {\n      g = groups[i];\n      b2 = boxes[i] = bbox(g);\n      g.x = g.x || 0;\n      dx[i] = 0;\n      g.y = g.y || 0;\n      dy[i] = 0;\n      c2 = i % ncols;\n      r = ~~(i / ncols);\n      xMax = Math.max(xMax, px2 = Math.ceil(b2.x2));\n      yMax = Math.max(yMax, py2 = Math.ceil(b2.y2));\n      xExtent[c2] = Math.max(xExtent[c2], px2);\n      yExtent[r] = Math.max(yExtent[r], py2);\n      xOffset[i] = padCol + offsetValue$1(b2.x1);\n      yOffset[i] = padRow + offsetValue$1(b2.y1);\n      if (dirty) view.dirty(groups[i]);\n    }\n    for (i = 0; i < n; ++i) {\n      if (i % ncols === 0) xOffset[i] = 0;\n      if (i < ncols) yOffset[i] = 0;\n    }\n    if (alignCol === Each) {\n      for (c2 = 1; c2 < ncols; ++c2) {\n        for (offset2 = 0, i = c2; i < n; i += ncols) {\n          if (offset2 < xOffset[i]) offset2 = xOffset[i];\n        }\n        for (i = c2; i < n; i += ncols) {\n          xOffset[i] = offset2 + xExtent[c2 - 1];\n        }\n      }\n    } else if (alignCol === All) {\n      for (offset2 = 0, i = 0; i < n; ++i) {\n        if (i % ncols && offset2 < xOffset[i]) offset2 = xOffset[i];\n      }\n      for (i = 0; i < n; ++i) {\n        if (i % ncols) xOffset[i] = offset2 + xMax;\n      }\n    } else {\n      for (alignCol = false, c2 = 1; c2 < ncols; ++c2) {\n        for (i = c2; i < n; i += ncols) {\n          xOffset[i] += xExtent[c2 - 1];\n        }\n      }\n    }\n    if (alignRow === Each) {\n      for (r = 1; r < nrows; ++r) {\n        for (offset2 = 0, i = r * ncols, m2 = i + ncols; i < m2; ++i) {\n          if (offset2 < yOffset[i]) offset2 = yOffset[i];\n        }\n        for (i = r * ncols; i < m2; ++i) {\n          yOffset[i] = offset2 + yExtent[r - 1];\n        }\n      }\n    } else if (alignRow === All) {\n      for (offset2 = 0, i = ncols; i < n; ++i) {\n        if (offset2 < yOffset[i]) offset2 = yOffset[i];\n      }\n      for (i = ncols; i < n; ++i) {\n        yOffset[i] = offset2 + yMax;\n      }\n    } else {\n      for (alignRow = false, r = 1; r < nrows; ++r) {\n        for (i = r * ncols, m2 = i + ncols; i < m2; ++i) {\n          yOffset[i] += yExtent[r - 1];\n        }\n      }\n    }\n    for (x2 = 0, i = 0; i < n; ++i) {\n      x2 = xOffset[i] + (i % ncols ? x2 : 0);\n      dx[i] += x2 - groups[i].x;\n    }\n    for (c2 = 0; c2 < ncols; ++c2) {\n      for (y2 = 0, i = c2; i < n; i += ncols) {\n        y2 += yOffset[i];\n        dy[i] += y2 - groups[i].y;\n      }\n    }\n    if (alignCol && get$1(opt.center, Column) && nrows > 1) {\n      for (i = 0; i < n; ++i) {\n        b2 = alignCol === All ? xMax : xExtent[i % ncols];\n        x2 = b2 - boxes[i].x2 - groups[i].x - dx[i];\n        if (x2 > 0) dx[i] += x2 / 2;\n      }\n    }\n    if (alignRow && get$1(opt.center, Row) && ncols !== 1) {\n      for (i = 0; i < n; ++i) {\n        b2 = alignRow === All ? yMax : yExtent[~~(i / ncols)];\n        y2 = b2 - boxes[i].y2 - groups[i].y - dy[i];\n        if (y2 > 0) dy[i] += y2 / 2;\n      }\n    }\n    for (i = 0; i < n; ++i) {\n      bounds2.union(boxes[i].translate(dx[i], dy[i]));\n    }\n    x2 = get$1(opt.anchor, X);\n    y2 = get$1(opt.anchor, Y);\n    switch (get$1(opt.anchor, Column)) {\n      case End$1:\n        x2 -= bounds2.width();\n        break;\n      case Middle$1:\n        x2 -= bounds2.width() / 2;\n    }\n    switch (get$1(opt.anchor, Row)) {\n      case End$1:\n        y2 -= bounds2.height();\n        break;\n      case Middle$1:\n        y2 -= bounds2.height() / 2;\n    }\n    x2 = Math.round(x2);\n    y2 = Math.round(y2);\n    bounds2.clear();\n    for (i = 0; i < n; ++i) {\n      groups[i].mark.bounds.clear();\n    }\n    for (i = 0; i < n; ++i) {\n      g = groups[i];\n      g.x += dx[i] += x2;\n      g.y += dy[i] += y2;\n      bounds2.union(g.mark.bounds.union(g.bounds.translate(dx[i], dy[i])));\n      if (dirty) view.dirty(g);\n    }\n    return bounds2;\n  }\n  function trellisLayout(view, group2, opt) {\n    var views = gridLayoutGroups(group2), groups = views.marks, bbox = opt.bounds === Flush ? boundFlush : boundFull, off = opt.offset, ncols = opt.columns || groups.length, nrows = ncols <= 0 ? 1 : Math.ceil(groups.length / ncols), cells = nrows * ncols, x2, y2, x22, y22, anchor, band2, offset2;\n    const bounds2 = gridLayout(view, groups, opt);\n    if (bounds2.empty()) bounds2.set(0, 0, 0, 0);\n    if (views.rowheaders) {\n      band2 = get$1(opt.headerBand, Row, null);\n      x2 = layoutHeaders(view, views.rowheaders, groups, ncols, nrows, -get$1(off, \"rowHeader\"), min$1, 0, bbox, \"x1\", 0, ncols, 1, band2);\n    }\n    if (views.colheaders) {\n      band2 = get$1(opt.headerBand, Column, null);\n      y2 = layoutHeaders(view, views.colheaders, groups, ncols, ncols, -get$1(off, \"columnHeader\"), min$1, 1, bbox, \"y1\", 0, 1, ncols, band2);\n    }\n    if (views.rowfooters) {\n      band2 = get$1(opt.footerBand, Row, null);\n      x22 = layoutHeaders(view, views.rowfooters, groups, ncols, nrows, get$1(off, \"rowFooter\"), max$1, 0, bbox, \"x2\", ncols - 1, ncols, 1, band2);\n    }\n    if (views.colfooters) {\n      band2 = get$1(opt.footerBand, Column, null);\n      y22 = layoutHeaders(view, views.colfooters, groups, ncols, ncols, get$1(off, \"columnFooter\"), max$1, 1, bbox, \"y2\", cells - ncols, 1, ncols, band2);\n    }\n    if (views.rowtitle) {\n      anchor = get$1(opt.titleAnchor, Row);\n      offset2 = get$1(off, \"rowTitle\");\n      offset2 = anchor === End$1 ? x22 + offset2 : x2 - offset2;\n      band2 = get$1(opt.titleBand, Row, 0.5);\n      layoutTitle(view, views.rowtitle, offset2, 0, bounds2, band2);\n    }\n    if (views.coltitle) {\n      anchor = get$1(opt.titleAnchor, Column);\n      offset2 = get$1(off, \"columnTitle\");\n      offset2 = anchor === End$1 ? y22 + offset2 : y2 - offset2;\n      band2 = get$1(opt.titleBand, Column, 0.5);\n      layoutTitle(view, views.coltitle, offset2, 1, bounds2, band2);\n    }\n  }\n  function boundFlush(item, field2) {\n    return field2 === \"x1\" ? item.x || 0 : field2 === \"y1\" ? item.y || 0 : field2 === \"x2\" ? (item.x || 0) + (item.width || 0) : field2 === \"y2\" ? (item.y || 0) + (item.height || 0) : void 0;\n  }\n  function boundFull(item, field2) {\n    return item.bounds[field2];\n  }\n  function layoutHeaders(view, headers, groups, ncols, limit, offset2, agg, isX2, bound2, bf, start, stride, back, band2) {\n    var n = groups.length, init2 = 0, edge = 0, i, j, k, m2, b2, h2, g, x2, y2;\n    if (!n) return init2;\n    for (i = start; i < n; i += stride) {\n      if (groups[i]) init2 = agg(init2, bound2(groups[i], bf));\n    }\n    if (!headers.length) return init2;\n    if (headers.length > limit) {\n      view.warn(\"Grid headers exceed limit: \" + limit);\n      headers = headers.slice(0, limit);\n    }\n    init2 += offset2;\n    for (j = 0, m2 = headers.length; j < m2; ++j) {\n      view.dirty(headers[j]);\n      headers[j].mark.bounds.clear();\n    }\n    for (i = start, j = 0, m2 = headers.length; j < m2; ++j, i += stride) {\n      h2 = headers[j];\n      b2 = h2.mark.bounds;\n      for (k = i; k >= 0 && (g = groups[k]) == null; k -= back) ;\n      if (isX2) {\n        x2 = band2 == null ? g.x : Math.round(g.bounds.x1 + band2 * g.bounds.width());\n        y2 = init2;\n      } else {\n        x2 = init2;\n        y2 = band2 == null ? g.y : Math.round(g.bounds.y1 + band2 * g.bounds.height());\n      }\n      b2.union(h2.bounds.translate(x2 - (h2.x || 0), y2 - (h2.y || 0)));\n      h2.x = x2;\n      h2.y = y2;\n      view.dirty(h2);\n      edge = agg(edge, b2[bf]);\n    }\n    return edge;\n  }\n  function layoutTitle(view, g, offset2, isX2, bounds2, band2) {\n    if (!g) return;\n    view.dirty(g);\n    var x2 = offset2, y2 = offset2;\n    isX2 ? x2 = Math.round(bounds2.x1 + band2 * bounds2.width()) : y2 = Math.round(bounds2.y1 + band2 * bounds2.height());\n    g.bounds.translate(x2 - (g.x || 0), y2 - (g.y || 0));\n    g.mark.bounds.clear().union(g.bounds);\n    g.x = x2;\n    g.y = y2;\n    view.dirty(g);\n  }\n  function lookup$3(config, orient) {\n    const opt = config[orient] || {};\n    return (key2, d) => opt[key2] != null ? opt[key2] : config[key2] != null ? config[key2] : d;\n  }\n  function offsets(legends, value2) {\n    let max2 = -Infinity;\n    legends.forEach((item) => {\n      if (item.offset != null) max2 = Math.max(max2, item.offset);\n    });\n    return max2 > -Infinity ? max2 : value2;\n  }\n  function legendParams(g, orient, config, xb, yb, w2, h2) {\n    const _ = lookup$3(config, orient), offset2 = offsets(g, _(\"offset\", 0)), anchor = _(\"anchor\", Start$1), mult2 = anchor === End$1 ? 1 : anchor === Middle$1 ? 0.5 : 0;\n    const p = {\n      align: Each,\n      bounds: _(\"bounds\", Flush),\n      columns: _(\"direction\") === \"vertical\" ? 1 : g.length,\n      padding: _(\"margin\", 8),\n      center: _(\"center\"),\n      nodirty: true\n    };\n    switch (orient) {\n      case Left$1:\n        p.anchor = {\n          x: Math.floor(xb.x1) - offset2,\n          column: End$1,\n          y: mult2 * (h2 || xb.height() + 2 * xb.y1),\n          row: anchor\n        };\n        break;\n      case Right$1:\n        p.anchor = {\n          x: Math.ceil(xb.x2) + offset2,\n          y: mult2 * (h2 || xb.height() + 2 * xb.y1),\n          row: anchor\n        };\n        break;\n      case Top$1:\n        p.anchor = {\n          y: Math.floor(yb.y1) - offset2,\n          row: End$1,\n          x: mult2 * (w2 || yb.width() + 2 * yb.x1),\n          column: anchor\n        };\n        break;\n      case Bottom$1:\n        p.anchor = {\n          y: Math.ceil(yb.y2) + offset2,\n          x: mult2 * (w2 || yb.width() + 2 * yb.x1),\n          column: anchor\n        };\n        break;\n      case TopLeft:\n        p.anchor = {\n          x: offset2,\n          y: offset2\n        };\n        break;\n      case TopRight:\n        p.anchor = {\n          x: w2 - offset2,\n          y: offset2,\n          column: End$1\n        };\n        break;\n      case BottomLeft:\n        p.anchor = {\n          x: offset2,\n          y: h2 - offset2,\n          row: End$1\n        };\n        break;\n      case BottomRight:\n        p.anchor = {\n          x: w2 - offset2,\n          y: h2 - offset2,\n          column: End$1,\n          row: End$1\n        };\n        break;\n    }\n    return p;\n  }\n  function legendLayout(view, legend) {\n    var item = legend.items[0], datum2 = item.datum, orient = item.orient, bounds2 = item.bounds, x2 = item.x, y2 = item.y, w2, h2;\n    item._bounds ? item._bounds.clear().union(bounds2) : item._bounds = bounds2.clone();\n    bounds2.clear();\n    legendGroupLayout(view, item, item.items[0].items[0]);\n    bounds2 = legendBounds(item, bounds2);\n    w2 = 2 * item.padding;\n    h2 = 2 * item.padding;\n    if (!bounds2.empty()) {\n      w2 = Math.ceil(bounds2.width() + w2);\n      h2 = Math.ceil(bounds2.height() + h2);\n    }\n    if (datum2.type === Symbols$1) {\n      legendEntryLayout(item.items[0].items[0].items[0].items);\n    }\n    if (orient !== None) {\n      item.x = x2 = 0;\n      item.y = y2 = 0;\n    }\n    item.width = w2;\n    item.height = h2;\n    boundStroke(bounds2.set(x2, y2, x2 + w2, y2 + h2), item);\n    item.mark.bounds.clear().union(bounds2);\n    return item;\n  }\n  function legendBounds(item, b2) {\n    item.items.forEach((_) => b2.union(_.bounds));\n    b2.x1 = item.padding;\n    b2.y1 = item.padding;\n    return b2;\n  }\n  function legendGroupLayout(view, item, entry2) {\n    var pad2 = item.padding, ex = pad2 - entry2.x, ey = pad2 - entry2.y;\n    if (!item.datum.title) {\n      if (ex || ey) translate$1(view, entry2, ex, ey);\n    } else {\n      var title = item.items[1].items[0], anchor = title.anchor, tpad = item.titlePadding || 0, tx2 = pad2 - title.x, ty2 = pad2 - title.y;\n      switch (title.orient) {\n        case Left$1:\n          ex += Math.ceil(title.bounds.width()) + tpad;\n          break;\n        case Right$1:\n        case Bottom$1:\n          break;\n        default:\n          ey += title.bounds.height() + tpad;\n      }\n      if (ex || ey) translate$1(view, entry2, ex, ey);\n      switch (title.orient) {\n        case Left$1:\n          ty2 += legendTitleOffset(item, entry2, title, anchor, 1, 1);\n          break;\n        case Right$1:\n          tx2 += legendTitleOffset(item, entry2, title, End$1, 0, 0) + tpad;\n          ty2 += legendTitleOffset(item, entry2, title, anchor, 1, 1);\n          break;\n        case Bottom$1:\n          tx2 += legendTitleOffset(item, entry2, title, anchor, 0, 0);\n          ty2 += legendTitleOffset(item, entry2, title, End$1, -1, 0, 1) + tpad;\n          break;\n        default:\n          tx2 += legendTitleOffset(item, entry2, title, anchor, 0, 0);\n      }\n      if (tx2 || ty2) translate$1(view, title, tx2, ty2);\n      if ((tx2 = Math.round(title.bounds.x1 - pad2)) < 0) {\n        translate$1(view, entry2, -tx2, 0);\n        translate$1(view, title, -tx2, 0);\n      }\n    }\n  }\n  function legendTitleOffset(item, entry2, title, anchor, y2, lr, noBar) {\n    const grad = item.datum.type !== \"symbol\", vgrad = title.datum.vgrad, e = grad && (lr || !vgrad) && !noBar ? entry2.items[0] : entry2, s = e.bounds[y2 ? \"y2\" : \"x2\"] - item.padding, u2 = vgrad && lr ? s : 0, v = vgrad && lr ? 0 : s, o = y2 <= 0 ? 0 : multiLineOffset(title);\n    return Math.round(anchor === Start$1 ? u2 : anchor === End$1 ? v - o : 0.5 * (s - o));\n  }\n  function translate$1(view, item, dx, dy) {\n    item.x += dx;\n    item.y += dy;\n    item.bounds.translate(dx, dy);\n    item.mark.bounds.translate(dx, dy);\n    view.dirty(item);\n  }\n  function legendEntryLayout(entries) {\n    const widths = entries.reduce((w2, g) => {\n      w2[g.column] = Math.max(g.bounds.x2 - g.x, w2[g.column] || 0);\n      return w2;\n    }, {});\n    entries.forEach((g) => {\n      g.width = widths[g.column];\n      g.height = g.bounds.y2 - g.y;\n    });\n  }\n  function titleLayout(view, mark, width2, height2, viewBounds2) {\n    var group2 = mark.items[0], frame2 = group2.frame, orient = group2.orient, anchor = group2.anchor, offset2 = group2.offset, padding2 = group2.padding, title = group2.items[0].items[0], subtitle = group2.items[1] && group2.items[1].items[0], end = orient === Left$1 || orient === Right$1 ? height2 : width2, start = 0, x2 = 0, y2 = 0, sx = 0, sy = 0, pos;\n    if (frame2 !== Group) {\n      orient === Left$1 ? (start = viewBounds2.y2, end = viewBounds2.y1) : orient === Right$1 ? (start = viewBounds2.y1, end = viewBounds2.y2) : (start = viewBounds2.x1, end = viewBounds2.x2);\n    } else if (orient === Left$1) {\n      start = height2, end = 0;\n    }\n    pos = anchor === Start$1 ? start : anchor === End$1 ? end : (start + end) / 2;\n    if (subtitle && subtitle.text) {\n      switch (orient) {\n        case Top$1:\n        case Bottom$1:\n          sy = title.bounds.height() + padding2;\n          break;\n        case Left$1:\n          sx = title.bounds.width() + padding2;\n          break;\n        case Right$1:\n          sx = -title.bounds.width() - padding2;\n          break;\n      }\n      tempBounds.clear().union(subtitle.bounds);\n      tempBounds.translate(sx - (subtitle.x || 0), sy - (subtitle.y || 0));\n      if (set$6(subtitle, \"x\", sx) | set$6(subtitle, \"y\", sy)) {\n        view.dirty(subtitle);\n        subtitle.bounds.clear().union(tempBounds);\n        subtitle.mark.bounds.clear().union(tempBounds);\n        view.dirty(subtitle);\n      }\n      tempBounds.clear().union(subtitle.bounds);\n    } else {\n      tempBounds.clear();\n    }\n    tempBounds.union(title.bounds);\n    switch (orient) {\n      case Top$1:\n        x2 = pos;\n        y2 = viewBounds2.y1 - tempBounds.height() - offset2;\n        break;\n      case Left$1:\n        x2 = viewBounds2.x1 - tempBounds.width() - offset2;\n        y2 = pos;\n        break;\n      case Right$1:\n        x2 = viewBounds2.x2 + tempBounds.width() + offset2;\n        y2 = pos;\n        break;\n      case Bottom$1:\n        x2 = pos;\n        y2 = viewBounds2.y2 + offset2;\n        break;\n      default:\n        x2 = group2.x;\n        y2 = group2.y;\n    }\n    if (set$6(group2, \"x\", x2) | set$6(group2, \"y\", y2)) {\n      tempBounds.translate(x2, y2);\n      view.dirty(group2);\n      group2.bounds.clear().union(tempBounds);\n      mark.bounds.clear().union(tempBounds);\n      view.dirty(group2);\n    }\n    return group2.bounds;\n  }\n  function ViewLayout$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(ViewLayout$1, Transform, {\n    transform(_, pulse2) {\n      const view = pulse2.dataflow;\n      _.mark.items.forEach((group2) => {\n        if (_.layout) trellisLayout(view, group2, _.layout);\n        layoutGroup(view, group2, _);\n      });\n      return shouldReflow(_.mark.group) ? pulse2.reflow() : pulse2;\n    }\n  });\n  function shouldReflow(group2) {\n    return group2 && group2.mark.role !== \"legend-entry\";\n  }\n  function layoutGroup(view, group2, _) {\n    var items = group2.items, width2 = Math.max(0, group2.width || 0), height2 = Math.max(0, group2.height || 0), viewBounds2 = new Bounds().set(0, 0, width2, height2), xBounds = viewBounds2.clone(), yBounds = viewBounds2.clone(), legends = [], title, mark, orient, b2, i, n;\n    for (i = 0, n = items.length; i < n; ++i) {\n      mark = items[i];\n      switch (mark.role) {\n        case AxisRole$1:\n          b2 = isYAxis(mark) ? xBounds : yBounds;\n          b2.union(axisLayout(view, mark, width2, height2));\n          break;\n        case TitleRole$1:\n          title = mark;\n          break;\n        case LegendRole$1:\n          legends.push(legendLayout(view, mark));\n          break;\n        case FrameRole$1:\n        case ScopeRole$1:\n        case RowHeader:\n        case RowFooter:\n        case RowTitle:\n        case ColHeader:\n        case ColFooter:\n        case ColTitle:\n          xBounds.union(mark.bounds);\n          yBounds.union(mark.bounds);\n          break;\n        default:\n          viewBounds2.union(mark.bounds);\n      }\n    }\n    if (legends.length) {\n      const l = {};\n      legends.forEach((item) => {\n        orient = item.orient || Right$1;\n        if (orient !== None) (l[orient] || (l[orient] = [])).push(item);\n      });\n      for (const orient2 in l) {\n        const g = l[orient2];\n        gridLayout(view, g, legendParams(g, orient2, _.legends, xBounds, yBounds, width2, height2));\n      }\n      legends.forEach((item) => {\n        const b3 = item.bounds;\n        if (!b3.equals(item._bounds)) {\n          item.bounds = item._bounds;\n          view.dirty(item);\n          item.bounds = b3;\n          view.dirty(item);\n        }\n        if (_.autosize && (_.autosize.type === Fit || _.autosize.type === FitX || _.autosize.type === FitY)) {\n          switch (item.orient) {\n            case Left$1:\n            case Right$1:\n              viewBounds2.add(b3.x1, 0).add(b3.x2, 0);\n              break;\n            case Top$1:\n            case Bottom$1:\n              viewBounds2.add(0, b3.y1).add(0, b3.y2);\n          }\n        } else {\n          viewBounds2.union(b3);\n        }\n      });\n    }\n    viewBounds2.union(xBounds).union(yBounds);\n    if (title) {\n      viewBounds2.union(titleLayout(view, title, width2, height2, viewBounds2));\n    }\n    if (group2.clip) {\n      viewBounds2.set(0, 0, group2.width || 0, group2.height || 0);\n    }\n    viewSizeLayout(view, group2, viewBounds2, _);\n  }\n  function viewSizeLayout(view, group2, viewBounds2, _) {\n    const auto = _.autosize || {}, type2 = auto.type;\n    if (view._autosize < 1 || !type2) return;\n    let viewWidth2 = view._width, viewHeight2 = view._height, width2 = Math.max(0, group2.width || 0), left = Math.max(0, Math.ceil(-viewBounds2.x1)), height2 = Math.max(0, group2.height || 0), top = Math.max(0, Math.ceil(-viewBounds2.y1));\n    const right = Math.max(0, Math.ceil(viewBounds2.x2 - width2)), bottom = Math.max(0, Math.ceil(viewBounds2.y2 - height2));\n    if (auto.contains === Padding$1) {\n      const padding2 = view.padding();\n      viewWidth2 -= padding2.left + padding2.right;\n      viewHeight2 -= padding2.top + padding2.bottom;\n    }\n    if (type2 === None) {\n      left = 0;\n      top = 0;\n      width2 = viewWidth2;\n      height2 = viewHeight2;\n    } else if (type2 === Fit) {\n      width2 = Math.max(0, viewWidth2 - left - right);\n      height2 = Math.max(0, viewHeight2 - top - bottom);\n    } else if (type2 === FitX) {\n      width2 = Math.max(0, viewWidth2 - left - right);\n      viewHeight2 = height2 + top + bottom;\n    } else if (type2 === FitY) {\n      viewWidth2 = width2 + left + right;\n      height2 = Math.max(0, viewHeight2 - top - bottom);\n    } else if (type2 === Pad) {\n      viewWidth2 = width2 + left + right;\n      viewHeight2 = height2 + top + bottom;\n    }\n    view._resizeView(viewWidth2, viewHeight2, width2, height2, [left, top], auto.resize);\n  }\n  const vtx = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    bound: Bound$1,\n    identifier: Identifier$1,\n    mark: Mark$1,\n    overlap: Overlap$1,\n    render: Render$1,\n    viewlayout: ViewLayout$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function AxisTicks$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(AxisTicks$1, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var locale2 = pulse2.dataflow.locale(), out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), ticks2 = this.value, scale2 = _.scale, tally = _.count == null ? _.values ? _.values.length : 10 : _.count, count2 = tickCount(scale2, tally, _.minstep), format2 = _.format || tickFormat(locale2, scale2, count2, _.formatSpecifier, _.formatType, !!_.values), values2 = _.values ? validTicks(scale2, _.values, count2) : tickValues(scale2, count2);\n      if (ticks2) out.rem = ticks2;\n      ticks2 = values2.map((value2, i) => ingest$1({\n        index: i / (values2.length - 1 || 1),\n        value: value2,\n        label: format2(value2)\n      }));\n      if (_.extra && ticks2.length) {\n        ticks2.push(ingest$1({\n          index: -1,\n          extra: {\n            value: ticks2[0].value\n          },\n          label: \"\"\n        }));\n      }\n      out.source = ticks2;\n      out.add = ticks2;\n      this.value = ticks2;\n      return out;\n    }\n  });\n  function DataJoin$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  function defaultItemCreate() {\n    return ingest$1({});\n  }\n  function newMap(key2) {\n    const map2 = fastmap().test((t) => t.exit);\n    map2.lookup = (t) => map2.get(key2(t));\n    return map2;\n  }\n  inherits(DataJoin$1, Transform, {\n    transform(_, pulse2) {\n      var df = pulse2.dataflow, out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), item = _.item || defaultItemCreate, key2 = _.key || tupleid, map2 = this.value;\n      if (isArray(out.encode)) {\n        out.encode = null;\n      }\n      if (map2 && (_.modified(\"key\") || pulse2.modified(key2))) {\n        error(\"DataJoin does not support modified key function or fields.\");\n      }\n      if (!map2) {\n        pulse2 = pulse2.addAll();\n        this.value = map2 = newMap(key2);\n      }\n      pulse2.visit(pulse2.ADD, (t) => {\n        const k = key2(t);\n        let x2 = map2.get(k);\n        if (x2) {\n          if (x2.exit) {\n            map2.empty--;\n            out.add.push(x2);\n          } else {\n            out.mod.push(x2);\n          }\n        } else {\n          x2 = item(t);\n          map2.set(k, x2);\n          out.add.push(x2);\n        }\n        x2.datum = t;\n        x2.exit = false;\n      });\n      pulse2.visit(pulse2.MOD, (t) => {\n        const k = key2(t), x2 = map2.get(k);\n        if (x2) {\n          x2.datum = t;\n          out.mod.push(x2);\n        }\n      });\n      pulse2.visit(pulse2.REM, (t) => {\n        const k = key2(t), x2 = map2.get(k);\n        if (t === x2.datum && !x2.exit) {\n          out.rem.push(x2);\n          x2.exit = true;\n          ++map2.empty;\n        }\n      });\n      if (pulse2.changed(pulse2.ADD_MOD)) out.modifies(\"datum\");\n      if (pulse2.clean() || _.clean && map2.empty > df.cleanThreshold) {\n        df.runAfter(map2.clean);\n      }\n      return out;\n    }\n  });\n  function Encode$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(Encode$1, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ADD_REM), fmod = _.mod || false, encoders = _.encoders, encode2 = pulse2.encode;\n      if (isArray(encode2)) {\n        if (out.changed() || encode2.every((e) => encoders[e])) {\n          encode2 = encode2[0];\n          out.encode = null;\n        } else {\n          return pulse2.StopPropagation;\n        }\n      }\n      var reenter = encode2 === \"enter\", update2 = encoders.update || falsy, enter = encoders.enter || falsy, exit = encoders.exit || falsy, set2 = (encode2 && !reenter ? encoders[encode2] : update2) || falsy;\n      if (pulse2.changed(pulse2.ADD)) {\n        pulse2.visit(pulse2.ADD, (t) => {\n          enter(t, _);\n          update2(t, _);\n        });\n        out.modifies(enter.output);\n        out.modifies(update2.output);\n        if (set2 !== falsy && set2 !== update2) {\n          pulse2.visit(pulse2.ADD, (t) => {\n            set2(t, _);\n          });\n          out.modifies(set2.output);\n        }\n      }\n      if (pulse2.changed(pulse2.REM) && exit !== falsy) {\n        pulse2.visit(pulse2.REM, (t) => {\n          exit(t, _);\n        });\n        out.modifies(exit.output);\n      }\n      if (reenter || set2 !== falsy) {\n        const flag2 = pulse2.MOD | (_.modified() ? pulse2.REFLOW : 0);\n        if (reenter) {\n          pulse2.visit(flag2, (t) => {\n            const mod = enter(t, _) || fmod;\n            if (set2(t, _) || mod) out.mod.push(t);\n          });\n          if (out.mod.length) out.modifies(enter.output);\n        } else {\n          pulse2.visit(flag2, (t) => {\n            if (set2(t, _) || fmod) out.mod.push(t);\n          });\n        }\n        if (out.mod.length) out.modifies(set2.output);\n      }\n      return out.changed() ? out : pulse2.StopPropagation;\n    }\n  });\n  function LegendEntries$1(params2) {\n    Transform.call(this, [], params2);\n  }\n  inherits(LegendEntries$1, Transform, {\n    transform(_, pulse2) {\n      if (this.value != null && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var locale2 = pulse2.dataflow.locale(), out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), items = this.value, type2 = _.type || SymbolLegend, scale2 = _.scale, limit = +_.limit, count2 = tickCount(scale2, _.count == null ? 5 : _.count, _.minstep), lskip = !!_.values || type2 === SymbolLegend, format2 = _.format || labelFormat(locale2, scale2, count2, type2, _.formatSpecifier, _.formatType, lskip), values2 = _.values || labelValues(scale2, count2), domain2, fraction, size, offset2, ellipsis;\n      if (items) out.rem = items;\n      if (type2 === SymbolLegend) {\n        if (limit && values2.length > limit) {\n          pulse2.dataflow.warn(\"Symbol legend count exceeds limit, filtering items.\");\n          items = values2.slice(0, limit - 1);\n          ellipsis = true;\n        } else {\n          items = values2;\n        }\n        if (isFunction(size = _.size)) {\n          if (!_.values && scale2(items[0]) === 0) {\n            items = items.slice(1);\n          }\n          offset2 = items.reduce((max2, value2) => Math.max(max2, size(value2, _)), 0);\n        } else {\n          size = constant$5(offset2 = size || 8);\n        }\n        items = items.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, items),\n          value: value2,\n          offset: offset2,\n          size: size(value2, _)\n        }));\n        if (ellipsis) {\n          ellipsis = values2[items.length];\n          items.push(ingest$1({\n            index: items.length,\n            label: `…${values2.length - items.length} entries`,\n            value: ellipsis,\n            offset: offset2,\n            size: size(ellipsis, _)\n          }));\n        }\n      } else if (type2 === GradientLegend) {\n        domain2 = scale2.domain(), fraction = scaleFraction(scale2, domain2[0], peek$1(domain2));\n        if (values2.length < 3 && !_.values && domain2[0] !== peek$1(domain2)) {\n          values2 = [domain2[0], peek$1(domain2)];\n        }\n        items = values2.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, values2),\n          value: value2,\n          perc: fraction(value2)\n        }));\n      } else {\n        size = values2.length - 1;\n        fraction = labelFraction(scale2);\n        items = values2.map((value2, index2) => ingest$1({\n          index: index2,\n          label: format2(value2, index2, values2),\n          value: value2,\n          perc: index2 ? fraction(value2) : 0,\n          perc2: index2 === size ? 1 : fraction(values2[index2 + 1])\n        }));\n      }\n      out.source = items;\n      out.add = items;\n      this.value = items;\n      return out;\n    }\n  });\n  const sourceX = (t) => t.source.x;\n  const sourceY = (t) => t.source.y;\n  const targetX = (t) => t.target.x;\n  const targetY = (t) => t.target.y;\n  function LinkPath(params2) {\n    Transform.call(this, {}, params2);\n  }\n  LinkPath.Definition = {\n    \"type\": \"LinkPath\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"sourceX\",\n      \"type\": \"field\",\n      \"default\": \"source.x\"\n    }, {\n      \"name\": \"sourceY\",\n      \"type\": \"field\",\n      \"default\": \"source.y\"\n    }, {\n      \"name\": \"targetX\",\n      \"type\": \"field\",\n      \"default\": \"target.x\"\n    }, {\n      \"name\": \"targetY\",\n      \"type\": \"field\",\n      \"default\": \"target.y\"\n    }, {\n      \"name\": \"orient\",\n      \"type\": \"enum\",\n      \"default\": \"vertical\",\n      \"values\": [\"horizontal\", \"vertical\", \"radial\"]\n    }, {\n      \"name\": \"shape\",\n      \"type\": \"enum\",\n      \"default\": \"line\",\n      \"values\": [\"line\", \"arc\", \"curve\", \"diagonal\", \"orthogonal\"]\n    }, {\n      \"name\": \"require\",\n      \"type\": \"signal\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  inherits(LinkPath, Transform, {\n    transform(_, pulse2) {\n      var sx = _.sourceX || sourceX, sy = _.sourceY || sourceY, tx2 = _.targetX || targetX, ty2 = _.targetY || targetY, as = _.as || \"path\", orient = _.orient || \"vertical\", shape2 = _.shape || \"line\", path2 = Paths.get(shape2 + \"-\" + orient) || Paths.get(shape2);\n      if (!path2) {\n        error(\"LinkPath unsupported type: \" + _.shape + (_.orient ? \"-\" + _.orient : \"\"));\n      }\n      pulse2.visit(pulse2.SOURCE, (t) => {\n        t[as] = path2(sx(t), sy(t), tx2(t), ty2(t));\n      });\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  const line = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"L\" + tx2 + \",\" + ty2;\n  const lineR = (sa2, sr, ta, tr2) => line(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const arc = (sx, sy, tx2, ty2) => {\n    var dx = tx2 - sx, dy = ty2 - sy, rr = Math.hypot(dx, dy) / 2, ra = 180 * Math.atan2(dy, dx) / Math.PI;\n    return \"M\" + sx + \",\" + sy + \"A\" + rr + \",\" + rr + \" \" + ra + \" 0 1 \" + tx2 + \",\" + ty2;\n  };\n  const arcR = (sa2, sr, ta, tr2) => arc(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const curve = (sx, sy, tx2, ty2) => {\n    const dx = tx2 - sx, dy = ty2 - sy, ix = 0.2 * (dx + dy), iy = 0.2 * (dy - dx);\n    return \"M\" + sx + \",\" + sy + \"C\" + (sx + ix) + \",\" + (sy + iy) + \" \" + (tx2 + iy) + \",\" + (ty2 - ix) + \" \" + tx2 + \",\" + ty2;\n  };\n  const curveR = (sa2, sr, ta, tr2) => curve(sr * Math.cos(sa2), sr * Math.sin(sa2), tr2 * Math.cos(ta), tr2 * Math.sin(ta));\n  const orthoX = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"V\" + ty2 + \"H\" + tx2;\n  const orthoY = (sx, sy, tx2, ty2) => \"M\" + sx + \",\" + sy + \"H\" + tx2 + \"V\" + ty2;\n  const orthoR = (sa2, sr, ta, tr2) => {\n    const sc = Math.cos(sa2), ss = Math.sin(sa2), tc = Math.cos(ta), ts2 = Math.sin(ta), sf = Math.abs(ta - sa2) > Math.PI ? ta <= sa2 : ta > sa2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"A\" + sr + \",\" + sr + \" 0 0,\" + (sf ? 1 : 0) + \" \" + sr * tc + \",\" + sr * ts2 + \"L\" + tr2 * tc + \",\" + tr2 * ts2;\n  };\n  const diagonalX = (sx, sy, tx2, ty2) => {\n    const m2 = (sx + tx2) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + m2 + \",\" + sy + \" \" + m2 + \",\" + ty2 + \" \" + tx2 + \",\" + ty2;\n  };\n  const diagonalY = (sx, sy, tx2, ty2) => {\n    const m2 = (sy + ty2) / 2;\n    return \"M\" + sx + \",\" + sy + \"C\" + sx + \",\" + m2 + \" \" + tx2 + \",\" + m2 + \" \" + tx2 + \",\" + ty2;\n  };\n  const diagonalR = (sa2, sr, ta, tr2) => {\n    const sc = Math.cos(sa2), ss = Math.sin(sa2), tc = Math.cos(ta), ts2 = Math.sin(ta), mr = (sr + tr2) / 2;\n    return \"M\" + sr * sc + \",\" + sr * ss + \"C\" + mr * sc + \",\" + mr * ss + \" \" + mr * tc + \",\" + mr * ts2 + \" \" + tr2 * tc + \",\" + tr2 * ts2;\n  };\n  const Paths = fastmap({\n    \"line\": line,\n    \"line-radial\": lineR,\n    \"arc\": arc,\n    \"arc-radial\": arcR,\n    \"curve\": curve,\n    \"curve-radial\": curveR,\n    \"orthogonal-horizontal\": orthoX,\n    \"orthogonal-vertical\": orthoY,\n    \"orthogonal-radial\": orthoR,\n    \"diagonal-horizontal\": diagonalX,\n    \"diagonal-vertical\": diagonalY,\n    \"diagonal-radial\": diagonalR\n  });\n  function Pie(params2) {\n    Transform.call(this, null, params2);\n  }\n  Pie.Definition = {\n    \"type\": \"Pie\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"startAngle\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"endAngle\",\n      \"type\": \"number\",\n      \"default\": 6.283185307179586\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"startAngle\", \"endAngle\"]\n    }]\n  };\n  inherits(Pie, Transform, {\n    transform(_, pulse2) {\n      var as = _.as || [\"startAngle\", \"endAngle\"], startAngle = as[0], endAngle = as[1], field2 = _.field || one$2, start = _.startAngle || 0, stop2 = _.endAngle != null ? _.endAngle : 2 * Math.PI, data2 = pulse2.source, values2 = data2.map(field2), n = values2.length, a2 = start, k = (stop2 - start) / sum$1(values2), index2 = range$3(n), i, t, v;\n      if (_.sort) {\n        index2.sort((a3, b2) => values2[a3] - values2[b2]);\n      }\n      for (i = 0; i < n; ++i) {\n        v = values2[index2[i]];\n        t = data2[index2[i]];\n        t[startAngle] = a2;\n        t[endAngle] = a2 += v * k;\n      }\n      this.value = values2;\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  const DEFAULT_COUNT = 5;\n  function includeZero(scale2) {\n    const type2 = scale2.type;\n    return !scale2.bins && (type2 === Linear || type2 === Pow || type2 === Sqrt);\n  }\n  function includePad(type2) {\n    return isContinuous(type2) && type2 !== Sequential;\n  }\n  const SKIP$1 = toSet([\"set\", \"modified\", \"clear\", \"type\", \"scheme\", \"schemeExtent\", \"schemeCount\", \"domain\", \"domainMin\", \"domainMid\", \"domainMax\", \"domainRaw\", \"domainImplicit\", \"nice\", \"zero\", \"bins\", \"range\", \"rangeStep\", \"round\", \"reverse\", \"interpolate\", \"interpolateGamma\"]);\n  function Scale$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Scale$1, Transform, {\n    transform(_, pulse2) {\n      var df = pulse2.dataflow, scale$12 = this.value, key2 = scaleKey(_);\n      if (!scale$12 || key2 !== scale$12.type) {\n        this.value = scale$12 = scale$6(key2)();\n      }\n      for (key2 in _) if (!SKIP$1[key2]) {\n        if (key2 === \"padding\" && includePad(scale$12.type)) continue;\n        isFunction(scale$12[key2]) ? scale$12[key2](_[key2]) : df.warn(\"Unsupported scale property: \" + key2);\n      }\n      configureRange(scale$12, _, configureBins(scale$12, _, configureDomain(scale$12, _, df)));\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function scaleKey(_) {\n    var t = _.type, d = \"\", n;\n    if (t === Sequential) return Sequential + \"-\" + Linear;\n    if (isContinuousColor(_)) {\n      n = _.rawDomain ? _.rawDomain.length : _.domain ? _.domain.length + +(_.domainMid != null) : 0;\n      d = n === 2 ? Sequential + \"-\" : n === 3 ? Diverging + \"-\" : \"\";\n    }\n    return (d + t || Linear).toLowerCase();\n  }\n  function isContinuousColor(_) {\n    const t = _.type;\n    return isContinuous(t) && t !== Time && t !== UTC && (_.scheme || _.range && _.range.length && _.range.every(isString));\n  }\n  function configureDomain(scale2, _, df) {\n    const raw = rawDomain(scale2, _.domainRaw, df);\n    if (raw > -1) return raw;\n    var domain2 = _.domain, type2 = scale2.type, zero2 = _.zero || _.zero === void 0 && includeZero(scale2), n, mid;\n    if (!domain2) return 0;\n    if (zero2 || _.domainMin != null || _.domainMax != null || _.domainMid != null) {\n      n = (domain2 = domain2.slice()).length - 1 || 1;\n      if (zero2) {\n        if (domain2[0] > 0) domain2[0] = 0;\n        if (domain2[n] < 0) domain2[n] = 0;\n      }\n      if (_.domainMin != null) domain2[0] = _.domainMin;\n      if (_.domainMax != null) domain2[n] = _.domainMax;\n      if (_.domainMid != null) {\n        mid = _.domainMid;\n        const i = mid > domain2[n] ? n + 1 : mid < domain2[0] ? 0 : n;\n        if (i !== n) df.warn(\"Scale domainMid exceeds domain min or max.\", mid);\n        domain2.splice(i, 0, mid);\n      }\n    }\n    if (includePad(type2) && _.padding && domain2[0] !== peek$1(domain2)) {\n      domain2 = padDomain(type2, domain2, _.range, _.padding, _.exponent, _.constant);\n    }\n    scale2.domain(domainCheck(type2, domain2, df));\n    if (type2 === Ordinal) {\n      scale2.unknown(_.domainImplicit ? implicit : void 0);\n    }\n    if (_.nice && scale2.nice) {\n      scale2.nice(_.nice !== true && tickCount(scale2, _.nice) || null);\n    }\n    return domain2.length;\n  }\n  function rawDomain(scale2, raw, df) {\n    if (raw) {\n      scale2.domain(domainCheck(scale2.type, raw, df));\n      return raw.length;\n    } else {\n      return -1;\n    }\n  }\n  function padDomain(type2, domain2, range2, pad2, exponent2, constant2) {\n    var span2 = Math.abs(peek$1(range2) - range2[0]), frac = span2 / (span2 - 2 * pad2), d = type2 === Log$1 ? zoomLog(domain2, null, frac) : type2 === Sqrt ? zoomPow(domain2, null, frac, 0.5) : type2 === Pow ? zoomPow(domain2, null, frac, exponent2 || 1) : type2 === Symlog ? zoomSymlog(domain2, null, frac, constant2 || 1) : zoomLinear(domain2, null, frac);\n    domain2 = domain2.slice();\n    domain2[0] = d[0];\n    domain2[domain2.length - 1] = d[1];\n    return domain2;\n  }\n  function domainCheck(type2, domain2, df) {\n    if (isLogarithmic(type2)) {\n      var s = Math.abs(domain2.reduce((s2, v) => s2 + (v < 0 ? -1 : v > 0 ? 1 : 0), 0));\n      if (s !== domain2.length) {\n        df.warn(\"Log scale domain includes zero: \" + $(domain2));\n      }\n    }\n    return domain2;\n  }\n  function configureBins(scale2, _, count2) {\n    let bins = _.bins;\n    if (bins && !isArray(bins)) {\n      const domain2 = scale2.domain(), lo = domain2[0], hi = peek$1(domain2), step = bins.step;\n      let start = bins.start == null ? lo : bins.start, stop2 = bins.stop == null ? hi : bins.stop;\n      if (!step) error(\"Scale bins parameter missing step property.\");\n      if (start < lo) start = step * Math.ceil(lo / step);\n      if (stop2 > hi) stop2 = step * Math.floor(hi / step);\n      bins = range$3(start, stop2 + step / 2, step);\n    }\n    if (bins) {\n      scale2.bins = bins;\n    } else if (scale2.bins) {\n      delete scale2.bins;\n    }\n    if (scale2.type === BinOrdinal) {\n      if (!bins) {\n        scale2.bins = scale2.domain();\n      } else if (!_.domain && !_.domainRaw) {\n        scale2.domain(bins);\n        count2 = bins.length;\n      }\n    }\n    return count2;\n  }\n  function configureRange(scale2, _, count2) {\n    var type2 = scale2.type, round = _.round || false, range2 = _.range;\n    if (_.rangeStep != null) {\n      range2 = configureRangeStep(type2, _, count2);\n    } else if (_.scheme) {\n      range2 = configureScheme(type2, _, count2);\n      if (isFunction(range2)) {\n        if (scale2.interpolator) {\n          return scale2.interpolator(range2);\n        } else {\n          error(`Scale type ${type2} does not support interpolating color schemes.`);\n        }\n      }\n    }\n    if (range2 && isInterpolating(type2)) {\n      return scale2.interpolator(interpolateColors(flip(range2, _.reverse), _.interpolate, _.interpolateGamma));\n    }\n    if (range2 && _.interpolate && scale2.interpolate) {\n      scale2.interpolate(interpolate(_.interpolate, _.interpolateGamma));\n    } else if (isFunction(scale2.round)) {\n      scale2.round(round);\n    } else if (isFunction(scale2.rangeRound)) {\n      scale2.interpolate(round ? interpolateRound : interpolate$1);\n    }\n    if (range2) scale2.range(flip(range2, _.reverse));\n  }\n  function configureRangeStep(type2, _, count2) {\n    if (type2 !== Band && type2 !== Point) {\n      error(\"Only band and point scales support rangeStep.\");\n    }\n    var outer = (_.paddingOuter != null ? _.paddingOuter : _.padding) || 0, inner = type2 === Point ? 1 : (_.paddingInner != null ? _.paddingInner : _.padding) || 0;\n    return [0, _.rangeStep * bandSpace(count2, inner, outer)];\n  }\n  function configureScheme(type2, _, count2) {\n    var extent2 = _.schemeExtent, name, scheme$1;\n    if (isArray(_.scheme)) {\n      scheme$1 = interpolateColors(_.scheme, _.interpolate, _.interpolateGamma);\n    } else {\n      name = _.scheme.toLowerCase();\n      scheme$1 = scheme(name);\n      if (!scheme$1) error(`Unrecognized scheme name: ${_.scheme}`);\n    }\n    count2 = type2 === Threshold ? count2 + 1 : type2 === BinOrdinal ? count2 - 1 : type2 === Quantile || type2 === Quantize ? +_.schemeCount || DEFAULT_COUNT : count2;\n    return isInterpolating(type2) ? adjustScheme(scheme$1, extent2, _.reverse) : isFunction(scheme$1) ? quantizeInterpolator(adjustScheme(scheme$1, extent2), count2) : type2 === Ordinal ? scheme$1 : scheme$1.slice(0, count2);\n  }\n  function adjustScheme(scheme2, extent2, reverse2) {\n    return isFunction(scheme2) && (extent2 || reverse2) ? interpolateRange(scheme2, flip(extent2 || [0, 1], reverse2)) : scheme2;\n  }\n  function flip(array2, reverse2) {\n    return reverse2 ? array2.slice().reverse() : array2;\n  }\n  function SortItems$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  inherits(SortItems$1, Transform, {\n    transform(_, pulse2) {\n      const mod = _.modified(\"sort\") || pulse2.changed(pulse2.ADD) || pulse2.modified(_.sort.fields) || pulse2.modified(\"datum\");\n      if (mod) pulse2.source.sort(stableCompare(_.sort));\n      this.modified(mod);\n      return pulse2;\n    }\n  });\n  const Zero = \"zero\", Center$1 = \"center\", Normalize = \"normalize\", DefOutput = [\"y0\", \"y1\"];\n  function Stack(params2) {\n    Transform.call(this, null, params2);\n  }\n  Stack.Definition = {\n    \"type\": \"Stack\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"offset\",\n      \"type\": \"enum\",\n      \"default\": Zero,\n      \"values\": [Zero, Center$1, Normalize]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": DefOutput\n    }]\n  };\n  inherits(Stack, Transform, {\n    transform(_, pulse2) {\n      var as = _.as || DefOutput, y02 = as[0], y12 = as[1], sort2 = stableCompare(_.sort), field2 = _.field || one$2, stack = _.offset === Center$1 ? stackCenter : _.offset === Normalize ? stackNormalize : stackZero, groups, i, n, max2;\n      groups = partition$3(pulse2.source, _.groupby, sort2, field2);\n      for (i = 0, n = groups.length, max2 = groups.max; i < n; ++i) {\n        stack(groups[i], max2, field2, y02, y12);\n      }\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  function stackCenter(group2, max2, field2, y02, y12) {\n    var last = (max2 - group2.sum) / 2, m2 = group2.length, j = 0, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      t[y02] = last;\n      t[y12] = last += Math.abs(field2(t));\n    }\n  }\n  function stackNormalize(group2, max2, field2, y02, y12) {\n    var scale2 = 1 / group2.sum, last = 0, m2 = group2.length, j = 0, v = 0, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      t[y02] = last;\n      t[y12] = last = scale2 * (v += Math.abs(field2(t)));\n    }\n  }\n  function stackZero(group2, max2, field2, y02, y12) {\n    var lastPos = 0, lastNeg = 0, m2 = group2.length, j = 0, v, t;\n    for (; j < m2; ++j) {\n      t = group2[j];\n      v = +field2(t);\n      if (v < 0) {\n        t[y02] = lastNeg;\n        t[y12] = lastNeg += v;\n      } else {\n        t[y02] = lastPos;\n        t[y12] = lastPos += v;\n      }\n    }\n  }\n  function partition$3(data2, groupby, sort2, field2) {\n    var groups = [], get2 = (f) => f(t), map2, i, n, m2, t, k, g, s, max2;\n    if (groupby == null) {\n      groups.push(data2.slice());\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    for (k = 0, max2 = 0, m2 = groups.length; k < m2; ++k) {\n      g = groups[k];\n      for (i = 0, s = 0, n = g.length; i < n; ++i) {\n        s += Math.abs(field2(g[i]));\n      }\n      g.sum = s;\n      if (s > max2) max2 = s;\n      if (sort2) g.sort(sort2);\n    }\n    groups.max = max2;\n    return groups;\n  }\n  const encode$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    axisticks: AxisTicks$1,\n    datajoin: DataJoin$1,\n    encode: Encode$1,\n    legendentries: LegendEntries$1,\n    linkpath: LinkPath,\n    pie: Pie,\n    scale: Scale$1,\n    sortitems: SortItems$1,\n    stack: Stack\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var epsilon$3 = 1e-6;\n  var epsilon2 = 1e-12;\n  var pi$1 = Math.PI;\n  var halfPi$1 = pi$1 / 2;\n  var quarterPi = pi$1 / 4;\n  var tau$1 = pi$1 * 2;\n  var degrees = 180 / pi$1;\n  var radians = pi$1 / 180;\n  var abs$1 = Math.abs;\n  var atan = Math.atan;\n  var atan2 = Math.atan2;\n  var cos$1 = Math.cos;\n  var ceil = Math.ceil;\n  var exp = Math.exp;\n  var hypot = Math.hypot;\n  var log$1 = Math.log;\n  var pow$1 = Math.pow;\n  var sin$1 = Math.sin;\n  var sign = Math.sign || function(x2) {\n    return x2 > 0 ? 1 : x2 < 0 ? -1 : 0;\n  };\n  var sqrt$1 = Math.sqrt;\n  var tan = Math.tan;\n  function acos(x2) {\n    return x2 > 1 ? 0 : x2 < -1 ? pi$1 : Math.acos(x2);\n  }\n  function asin$1(x2) {\n    return x2 > 1 ? halfPi$1 : x2 < -1 ? -halfPi$1 : Math.asin(x2);\n  }\n  function noop$2() {\n  }\n  function streamGeometry(geometry, stream2) {\n    if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {\n      streamGeometryType[geometry.type](geometry, stream2);\n    }\n  }\n  var streamObjectType = {\n    Feature: function(object2, stream2) {\n      streamGeometry(object2.geometry, stream2);\n    },\n    FeatureCollection: function(object2, stream2) {\n      var features = object2.features, i = -1, n = features.length;\n      while (++i < n) streamGeometry(features[i].geometry, stream2);\n    }\n  };\n  var streamGeometryType = {\n    Sphere: function(object2, stream2) {\n      stream2.sphere();\n    },\n    Point: function(object2, stream2) {\n      object2 = object2.coordinates;\n      stream2.point(object2[0], object2[1], object2[2]);\n    },\n    MultiPoint: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object2 = coordinates[i], stream2.point(object2[0], object2[1], object2[2]);\n    },\n    LineString: function(object2, stream2) {\n      streamLine(object2.coordinates, stream2, 0);\n    },\n    MultiLineString: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) streamLine(coordinates[i], stream2, 0);\n    },\n    Polygon: function(object2, stream2) {\n      streamPolygon(object2.coordinates, stream2);\n    },\n    MultiPolygon: function(object2, stream2) {\n      var coordinates = object2.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) streamPolygon(coordinates[i], stream2);\n    },\n    GeometryCollection: function(object2, stream2) {\n      var geometries = object2.geometries, i = -1, n = geometries.length;\n      while (++i < n) streamGeometry(geometries[i], stream2);\n    }\n  };\n  function streamLine(coordinates, stream2, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    stream2.lineStart();\n    while (++i < n) coordinate = coordinates[i], stream2.point(coordinate[0], coordinate[1], coordinate[2]);\n    stream2.lineEnd();\n  }\n  function streamPolygon(coordinates, stream2) {\n    var i = -1, n = coordinates.length;\n    stream2.polygonStart();\n    while (++i < n) streamLine(coordinates[i], stream2, 1);\n    stream2.polygonEnd();\n  }\n  function geoStream(object2, stream2) {\n    if (object2 && streamObjectType.hasOwnProperty(object2.type)) {\n      streamObjectType[object2.type](object2, stream2);\n    } else {\n      streamGeometry(object2, stream2);\n    }\n  }\n  var areaRingSum$1 = new Adder();\n  var areaSum$1 = new Adder(), lambda00$2, phi00$2, lambda0$1, cosPhi0, sinPhi0;\n  var areaStream$1 = {\n    point: noop$2,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: function() {\n      areaRingSum$1 = new Adder();\n      areaStream$1.lineStart = areaRingStart$1;\n      areaStream$1.lineEnd = areaRingEnd$1;\n    },\n    polygonEnd: function() {\n      var areaRing = +areaRingSum$1;\n      areaSum$1.add(areaRing < 0 ? tau$1 + areaRing : areaRing);\n      this.lineStart = this.lineEnd = this.point = noop$2;\n    },\n    sphere: function() {\n      areaSum$1.add(tau$1);\n    }\n  };\n  function areaRingStart$1() {\n    areaStream$1.point = areaPointFirst$1;\n  }\n  function areaRingEnd$1() {\n    areaPoint$1(lambda00$2, phi00$2);\n  }\n  function areaPointFirst$1(lambda, phi2) {\n    areaStream$1.point = areaPoint$1;\n    lambda00$2 = lambda, phi00$2 = phi2;\n    lambda *= radians, phi2 *= radians;\n    lambda0$1 = lambda, cosPhi0 = cos$1(phi2 = phi2 / 2 + quarterPi), sinPhi0 = sin$1(phi2);\n  }\n  function areaPoint$1(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    phi2 = phi2 / 2 + quarterPi;\n    var dLambda = lambda - lambda0$1, sdLambda = dLambda >= 0 ? 1 : -1, adLambda = sdLambda * dLambda, cosPhi = cos$1(phi2), sinPhi = sin$1(phi2), k = sinPhi0 * sinPhi, u2 = cosPhi0 * cosPhi + k * cos$1(adLambda), v = k * sdLambda * sin$1(adLambda);\n    areaRingSum$1.add(atan2(v, u2));\n    lambda0$1 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;\n  }\n  function geoArea$1(object2) {\n    areaSum$1 = new Adder();\n    geoStream(object2, areaStream$1);\n    return areaSum$1 * 2;\n  }\n  function spherical(cartesian2) {\n    return [atan2(cartesian2[1], cartesian2[0]), asin$1(cartesian2[2])];\n  }\n  function cartesian(spherical2) {\n    var lambda = spherical2[0], phi2 = spherical2[1], cosPhi = cos$1(phi2);\n    return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi2)];\n  }\n  function cartesianDot(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];\n  }\n  function cartesianCross(a2, b2) {\n    return [a2[1] * b2[2] - a2[2] * b2[1], a2[2] * b2[0] - a2[0] * b2[2], a2[0] * b2[1] - a2[1] * b2[0]];\n  }\n  function cartesianAddInPlace(a2, b2) {\n    a2[0] += b2[0], a2[1] += b2[1], a2[2] += b2[2];\n  }\n  function cartesianScale(vector, k) {\n    return [vector[0] * k, vector[1] * k, vector[2] * k];\n  }\n  function cartesianNormalizeInPlace(d) {\n    var l = sqrt$1(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l, d[1] /= l, d[2] /= l;\n  }\n  var lambda0, phi0, lambda1, phi1, lambda2, lambda00$1, phi00$1, p0, deltaSum, ranges, range$2;\n  var boundsStream$1 = {\n    point: boundsPoint$1,\n    lineStart: boundsLineStart,\n    lineEnd: boundsLineEnd,\n    polygonStart: function() {\n      boundsStream$1.point = boundsRingPoint;\n      boundsStream$1.lineStart = boundsRingStart;\n      boundsStream$1.lineEnd = boundsRingEnd;\n      deltaSum = new Adder();\n      areaStream$1.polygonStart();\n    },\n    polygonEnd: function() {\n      areaStream$1.polygonEnd();\n      boundsStream$1.point = boundsPoint$1;\n      boundsStream$1.lineStart = boundsLineStart;\n      boundsStream$1.lineEnd = boundsLineEnd;\n      if (areaRingSum$1 < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n      else if (deltaSum > epsilon$3) phi1 = 90;\n      else if (deltaSum < -epsilon$3) phi0 = -90;\n      range$2[0] = lambda0, range$2[1] = lambda1;\n    },\n    sphere: function() {\n      lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);\n    }\n  };\n  function boundsPoint$1(lambda, phi2) {\n    ranges.push(range$2 = [lambda0 = lambda, lambda1 = lambda]);\n    if (phi2 < phi0) phi0 = phi2;\n    if (phi2 > phi1) phi1 = phi2;\n  }\n  function linePoint(lambda, phi2) {\n    var p = cartesian([lambda * radians, phi2 * radians]);\n    if (p0) {\n      var normal = cartesianCross(p0, p), equatorial = [normal[1], -normal[0], 0], inflection = cartesianCross(equatorial, normal);\n      cartesianNormalizeInPlace(inflection);\n      inflection = spherical(inflection);\n      var delta = lambda - lambda2, sign2 = delta > 0 ? 1 : -1, lambdai = inflection[0] * degrees * sign2, phii, antimeridian = abs$1(delta) > 180;\n      if (antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {\n        phii = inflection[1] * degrees;\n        if (phii > phi1) phi1 = phii;\n      } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign2 * lambda2 < lambdai && lambdai < sign2 * lambda)) {\n        phii = -inflection[1] * degrees;\n        if (phii < phi0) phi0 = phii;\n      } else {\n        if (phi2 < phi0) phi0 = phi2;\n        if (phi2 > phi1) phi1 = phi2;\n      }\n      if (antimeridian) {\n        if (lambda < lambda2) {\n          if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n        } else {\n          if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n        }\n      } else {\n        if (lambda1 >= lambda0) {\n          if (lambda < lambda0) lambda0 = lambda;\n          if (lambda > lambda1) lambda1 = lambda;\n        } else {\n          if (lambda > lambda2) {\n            if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;\n          } else {\n            if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;\n          }\n        }\n      }\n    } else {\n      ranges.push(range$2 = [lambda0 = lambda, lambda1 = lambda]);\n    }\n    if (phi2 < phi0) phi0 = phi2;\n    if (phi2 > phi1) phi1 = phi2;\n    p0 = p, lambda2 = lambda;\n  }\n  function boundsLineStart() {\n    boundsStream$1.point = linePoint;\n  }\n  function boundsLineEnd() {\n    range$2[0] = lambda0, range$2[1] = lambda1;\n    boundsStream$1.point = boundsPoint$1;\n    p0 = null;\n  }\n  function boundsRingPoint(lambda, phi2) {\n    if (p0) {\n      var delta = lambda - lambda2;\n      deltaSum.add(abs$1(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);\n    } else {\n      lambda00$1 = lambda, phi00$1 = phi2;\n    }\n    areaStream$1.point(lambda, phi2);\n    linePoint(lambda, phi2);\n  }\n  function boundsRingStart() {\n    areaStream$1.lineStart();\n  }\n  function boundsRingEnd() {\n    boundsRingPoint(lambda00$1, phi00$1);\n    areaStream$1.lineEnd();\n    if (abs$1(deltaSum) > epsilon$3) lambda0 = -(lambda1 = 180);\n    range$2[0] = lambda0, range$2[1] = lambda1;\n    p0 = null;\n  }\n  function angle(lambda02, lambda12) {\n    return (lambda12 -= lambda02) < 0 ? lambda12 + 360 : lambda12;\n  }\n  function rangeCompare(a2, b2) {\n    return a2[0] - b2[0];\n  }\n  function rangeContains(range2, x2) {\n    return range2[0] <= range2[1] ? range2[0] <= x2 && x2 <= range2[1] : x2 < range2[0] || range2[1] < x2;\n  }\n  function geoBounds$1(feature2) {\n    var i, n, a2, b2, merged, deltaMax, delta;\n    phi1 = lambda1 = -(lambda0 = phi0 = Infinity);\n    ranges = [];\n    geoStream(feature2, boundsStream$1);\n    if (n = ranges.length) {\n      ranges.sort(rangeCompare);\n      for (i = 1, a2 = ranges[0], merged = [a2]; i < n; ++i) {\n        b2 = ranges[i];\n        if (rangeContains(a2, b2[0]) || rangeContains(a2, b2[1])) {\n          if (angle(a2[0], b2[1]) > angle(a2[0], a2[1])) a2[1] = b2[1];\n          if (angle(b2[0], a2[1]) > angle(a2[0], a2[1])) a2[0] = b2[0];\n        } else {\n          merged.push(a2 = b2);\n        }\n      }\n      for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a2 = merged[n]; i <= n; a2 = b2, ++i) {\n        b2 = merged[i];\n        if ((delta = angle(a2[1], b2[0])) > deltaMax) deltaMax = delta, lambda0 = b2[0], lambda1 = a2[1];\n      }\n    }\n    ranges = range$2 = null;\n    return lambda0 === Infinity || phi0 === Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0, phi0], [lambda1, phi1]];\n  }\n  var W0, W1, X0$1, Y0$1, Z0$1, X1$1, Y1$1, Z1$1, X2$1, Y2$1, Z2$1, lambda00, phi00, x0$4, y0$4, z0;\n  var centroidStream$1 = {\n    sphere: noop$2,\n    point: centroidPoint$1,\n    lineStart: centroidLineStart$1,\n    lineEnd: centroidLineEnd$1,\n    polygonStart: function() {\n      centroidStream$1.lineStart = centroidRingStart$1;\n      centroidStream$1.lineEnd = centroidRingEnd$1;\n    },\n    polygonEnd: function() {\n      centroidStream$1.lineStart = centroidLineStart$1;\n      centroidStream$1.lineEnd = centroidLineEnd$1;\n    }\n  };\n  function centroidPoint$1(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2);\n    centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi2));\n  }\n  function centroidPointCartesian(x2, y2, z) {\n    ++W0;\n    X0$1 += (x2 - X0$1) / W0;\n    Y0$1 += (y2 - Y0$1) / W0;\n    Z0$1 += (z - Z0$1) / W0;\n  }\n  function centroidLineStart$1() {\n    centroidStream$1.point = centroidLinePointFirst;\n  }\n  function centroidLinePointFirst(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2);\n    x0$4 = cosPhi * cos$1(lambda);\n    y0$4 = cosPhi * sin$1(lambda);\n    z0 = sin$1(phi2);\n    centroidStream$1.point = centroidLinePoint;\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidLinePoint(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2), x2 = cosPhi * cos$1(lambda), y2 = cosPhi * sin$1(lambda), z = sin$1(phi2), w2 = atan2(sqrt$1((w2 = y0$4 * z - z0 * y2) * w2 + (w2 = z0 * x2 - x0$4 * z) * w2 + (w2 = x0$4 * y2 - y0$4 * x2) * w2), x0$4 * x2 + y0$4 * y2 + z0 * z);\n    W1 += w2;\n    X1$1 += w2 * (x0$4 + (x0$4 = x2));\n    Y1$1 += w2 * (y0$4 + (y0$4 = y2));\n    Z1$1 += w2 * (z0 + (z0 = z));\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidLineEnd$1() {\n    centroidStream$1.point = centroidPoint$1;\n  }\n  function centroidRingStart$1() {\n    centroidStream$1.point = centroidRingPointFirst;\n  }\n  function centroidRingEnd$1() {\n    centroidRingPoint(lambda00, phi00);\n    centroidStream$1.point = centroidPoint$1;\n  }\n  function centroidRingPointFirst(lambda, phi2) {\n    lambda00 = lambda, phi00 = phi2;\n    lambda *= radians, phi2 *= radians;\n    centroidStream$1.point = centroidRingPoint;\n    var cosPhi = cos$1(phi2);\n    x0$4 = cosPhi * cos$1(lambda);\n    y0$4 = cosPhi * sin$1(lambda);\n    z0 = sin$1(phi2);\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function centroidRingPoint(lambda, phi2) {\n    lambda *= radians, phi2 *= radians;\n    var cosPhi = cos$1(phi2), x2 = cosPhi * cos$1(lambda), y2 = cosPhi * sin$1(lambda), z = sin$1(phi2), cx = y0$4 * z - z0 * y2, cy = z0 * x2 - x0$4 * z, cz = x0$4 * y2 - y0$4 * x2, m2 = hypot(cx, cy, cz), w2 = asin$1(m2), v = m2 && -w2 / m2;\n    X2$1.add(v * cx);\n    Y2$1.add(v * cy);\n    Z2$1.add(v * cz);\n    W1 += w2;\n    X1$1 += w2 * (x0$4 + (x0$4 = x2));\n    Y1$1 += w2 * (y0$4 + (y0$4 = y2));\n    Z1$1 += w2 * (z0 + (z0 = z));\n    centroidPointCartesian(x0$4, y0$4, z0);\n  }\n  function geoCentroid$1(object2) {\n    W0 = W1 = X0$1 = Y0$1 = Z0$1 = X1$1 = Y1$1 = Z1$1 = 0;\n    X2$1 = new Adder();\n    Y2$1 = new Adder();\n    Z2$1 = new Adder();\n    geoStream(object2, centroidStream$1);\n    var x2 = +X2$1, y2 = +Y2$1, z = +Z2$1, m2 = hypot(x2, y2, z);\n    if (m2 < epsilon2) {\n      x2 = X1$1, y2 = Y1$1, z = Z1$1;\n      if (W1 < epsilon$3) x2 = X0$1, y2 = Y0$1, z = Z0$1;\n      m2 = hypot(x2, y2, z);\n      if (m2 < epsilon2) return [NaN, NaN];\n    }\n    return [atan2(y2, x2) * degrees, asin$1(z / m2) * degrees];\n  }\n  function compose(a2, b2) {\n    function compose2(x2, y2) {\n      return x2 = a2(x2, y2), b2(x2[0], x2[1]);\n    }\n    if (a2.invert && b2.invert) compose2.invert = function(x2, y2) {\n      return x2 = b2.invert(x2, y2), x2 && a2.invert(x2[0], x2[1]);\n    };\n    return compose2;\n  }\n  function rotationIdentity(lambda, phi2) {\n    if (abs$1(lambda) > pi$1) lambda -= Math.round(lambda / tau$1) * tau$1;\n    return [lambda, phi2];\n  }\n  rotationIdentity.invert = rotationIdentity;\n  function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {\n    return (deltaLambda %= tau$1) ? deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda) : deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity;\n  }\n  function forwardRotationLambda(deltaLambda) {\n    return function(lambda, phi2) {\n      lambda += deltaLambda;\n      if (abs$1(lambda) > pi$1) lambda -= Math.round(lambda / tau$1) * tau$1;\n      return [lambda, phi2];\n    };\n  }\n  function rotationLambda(deltaLambda) {\n    var rotation2 = forwardRotationLambda(deltaLambda);\n    rotation2.invert = forwardRotationLambda(-deltaLambda);\n    return rotation2;\n  }\n  function rotationPhiGamma(deltaPhi, deltaGamma) {\n    var cosDeltaPhi = cos$1(deltaPhi), sinDeltaPhi = sin$1(deltaPhi), cosDeltaGamma = cos$1(deltaGamma), sinDeltaGamma = sin$1(deltaGamma);\n    function rotation2(lambda, phi2) {\n      var cosPhi = cos$1(phi2), x2 = cos$1(lambda) * cosPhi, y2 = sin$1(lambda) * cosPhi, z = sin$1(phi2), k = z * cosDeltaPhi + x2 * sinDeltaPhi;\n      return [\n        atan2(y2 * cosDeltaGamma - k * sinDeltaGamma, x2 * cosDeltaPhi - z * sinDeltaPhi),\n        asin$1(k * cosDeltaGamma + y2 * sinDeltaGamma)\n      ];\n    }\n    rotation2.invert = function(lambda, phi2) {\n      var cosPhi = cos$1(phi2), x2 = cos$1(lambda) * cosPhi, y2 = sin$1(lambda) * cosPhi, z = sin$1(phi2), k = z * cosDeltaGamma - y2 * sinDeltaGamma;\n      return [\n        atan2(y2 * cosDeltaGamma + z * sinDeltaGamma, x2 * cosDeltaPhi + k * sinDeltaPhi),\n        asin$1(k * cosDeltaPhi - x2 * sinDeltaPhi)\n      ];\n    };\n    return rotation2;\n  }\n  function rotation(rotate2) {\n    rotate2 = rotateRadians(rotate2[0] * radians, rotate2[1] * radians, rotate2.length > 2 ? rotate2[2] * radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate2(coordinates[0] * radians, coordinates[1] * radians);\n      return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate2.invert(coordinates[0] * radians, coordinates[1] * radians);\n      return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates;\n    };\n    return forward;\n  }\n  function circleStream(stream2, radius2, delta, direction, t02, t12) {\n    if (!delta) return;\n    var cosRadius = cos$1(radius2), sinRadius = sin$1(radius2), step = direction * delta;\n    if (t02 == null) {\n      t02 = radius2 + direction * tau$1;\n      t12 = radius2 - step / 2;\n    } else {\n      t02 = circleRadius(cosRadius, t02);\n      t12 = circleRadius(cosRadius, t12);\n      if (direction > 0 ? t02 < t12 : t02 > t12) t02 += direction * tau$1;\n    }\n    for (var point2, t = t02; direction > 0 ? t > t12 : t < t12; t -= step) {\n      point2 = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);\n      stream2.point(point2[0], point2[1]);\n    }\n  }\n  function circleRadius(cosRadius, point2) {\n    point2 = cartesian(point2), point2[0] -= cosRadius;\n    cartesianNormalizeInPlace(point2);\n    var radius2 = acos(-point2[1]);\n    return ((-point2[2] < 0 ? -radius2 : radius2) + tau$1 - epsilon$3) % tau$1;\n  }\n  function clipBuffer() {\n    var lines = [], line2;\n    return {\n      point: function(x2, y2, m2) {\n        line2.push([x2, y2, m2]);\n      },\n      lineStart: function() {\n        lines.push(line2 = []);\n      },\n      lineEnd: noop$2,\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      },\n      result: function() {\n        var result = lines;\n        lines = [];\n        line2 = null;\n        return result;\n      }\n    };\n  }\n  function pointEqual(a2, b2) {\n    return abs$1(a2[0] - b2[0]) < epsilon$3 && abs$1(a2[1] - b2[1]) < epsilon$3;\n  }\n  function Intersection(point2, points2, other, entry2) {\n    this.x = point2;\n    this.z = points2;\n    this.o = other;\n    this.e = entry2;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function clipRejoin(segments2, compareIntersection2, startInside, interpolate2, stream2) {\n    var subject = [], clip2 = [], i, n;\n    segments2.forEach(function(segment) {\n      if ((n2 = segment.length - 1) <= 0) return;\n      var n2, p02 = segment[0], p1 = segment[n2], x2;\n      if (pointEqual(p02, p1)) {\n        if (!p02[2] && !p1[2]) {\n          stream2.lineStart();\n          for (i = 0; i < n2; ++i) stream2.point((p02 = segment[i])[0], p02[1]);\n          stream2.lineEnd();\n          return;\n        }\n        p1[0] += 2 * epsilon$3;\n      }\n      subject.push(x2 = new Intersection(p02, segment, null, true));\n      clip2.push(x2.o = new Intersection(p02, null, x2, false));\n      subject.push(x2 = new Intersection(p1, segment, null, false));\n      clip2.push(x2.o = new Intersection(p1, null, x2, true));\n    });\n    if (!subject.length) return;\n    clip2.sort(compareIntersection2);\n    link(subject);\n    link(clip2);\n    for (i = 0, n = clip2.length; i < n; ++i) {\n      clip2[i].e = startInside = !startInside;\n    }\n    var start = subject[0], points2, point2;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points2 = current.z;\n      stream2.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (i = 0, n = points2.length; i < n; ++i) stream2.point((point2 = points2[i])[0], point2[1]);\n          } else {\n            interpolate2(current.x, current.n.x, 1, stream2);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points2 = current.p.z;\n            for (i = points2.length - 1; i >= 0; --i) stream2.point((point2 = points2[i])[0], point2[1]);\n          } else {\n            interpolate2(current.x, current.p.x, -1, stream2);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points2 = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      stream2.lineEnd();\n    }\n  }\n  function link(array2) {\n    if (!(n = array2.length)) return;\n    var n, i = 0, a2 = array2[0], b2;\n    while (++i < n) {\n      a2.n = b2 = array2[i];\n      b2.p = a2;\n      a2 = b2;\n    }\n    a2.n = b2 = array2[0];\n    b2.p = a2;\n  }\n  function longitude(point2) {\n    return abs$1(point2[0]) <= pi$1 ? point2[0] : sign(point2[0]) * ((abs$1(point2[0]) + pi$1) % tau$1 - pi$1);\n  }\n  function polygonContains(polygon, point2) {\n    var lambda = longitude(point2), phi2 = point2[1], sinPhi = sin$1(phi2), normal = [sin$1(lambda), -cos$1(lambda), 0], angle2 = 0, winding = 0;\n    var sum2 = new Adder();\n    if (sinPhi === 1) phi2 = halfPi$1 + epsilon$3;\n    else if (sinPhi === -1) phi2 = -halfPi$1 - epsilon$3;\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      if (!(m2 = (ring = polygon[i]).length)) continue;\n      var ring, m2, point0 = ring[m2 - 1], lambda02 = longitude(point0), phi02 = point0[1] / 2 + quarterPi, sinPhi02 = sin$1(phi02), cosPhi02 = cos$1(phi02);\n      for (var j = 0; j < m2; ++j, lambda02 = lambda12, sinPhi02 = sinPhi1, cosPhi02 = cosPhi1, point0 = point1) {\n        var point1 = ring[j], lambda12 = longitude(point1), phi12 = point1[1] / 2 + quarterPi, sinPhi1 = sin$1(phi12), cosPhi1 = cos$1(phi12), delta = lambda12 - lambda02, sign2 = delta >= 0 ? 1 : -1, absDelta = sign2 * delta, antimeridian = absDelta > pi$1, k = sinPhi02 * sinPhi1;\n        sum2.add(atan2(k * sign2 * sin$1(absDelta), cosPhi02 * cosPhi1 + k * cos$1(absDelta)));\n        angle2 += antimeridian ? delta + sign2 * tau$1 : delta;\n        if (antimeridian ^ lambda02 >= lambda ^ lambda12 >= lambda) {\n          var arc2 = cartesianCross(cartesian(point0), cartesian(point1));\n          cartesianNormalizeInPlace(arc2);\n          var intersection2 = cartesianCross(normal, arc2);\n          cartesianNormalizeInPlace(intersection2);\n          var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin$1(intersection2[2]);\n          if (phi2 > phiArc || phi2 === phiArc && (arc2[0] || arc2[1])) {\n            winding += antimeridian ^ delta >= 0 ? 1 : -1;\n          }\n        }\n      }\n    }\n    return (angle2 < -epsilon$3 || angle2 < epsilon$3 && sum2 < -epsilon2) ^ winding & 1;\n  }\n  function clip$1(pointVisible, clipLine2, interpolate2, start) {\n    return function(sink) {\n      var line2 = clipLine2(sink), ringBuffer = clipBuffer(), ringSink = clipLine2(ringBuffer), polygonStarted = false, polygon, segments2, ring;\n      var clip2 = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart: function() {\n          clip2.point = pointRing;\n          clip2.lineStart = ringStart;\n          clip2.lineEnd = ringEnd;\n          segments2 = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip2.point = point2;\n          clip2.lineStart = lineStart;\n          clip2.lineEnd = lineEnd;\n          segments2 = merge$2(segments2);\n          var startInside = polygonContains(polygon, start);\n          if (segments2.length) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            clipRejoin(segments2, compareIntersection, startInside, interpolate2, sink);\n          } else if (startInside) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            sink.lineStart();\n            interpolate2(null, null, 1, sink);\n            sink.lineEnd();\n          }\n          if (polygonStarted) sink.polygonEnd(), polygonStarted = false;\n          segments2 = polygon = null;\n        },\n        sphere: function() {\n          sink.polygonStart();\n          sink.lineStart();\n          interpolate2(null, null, 1, sink);\n          sink.lineEnd();\n          sink.polygonEnd();\n        }\n      };\n      function point2(lambda, phi2) {\n        if (pointVisible(lambda, phi2)) sink.point(lambda, phi2);\n      }\n      function pointLine(lambda, phi2) {\n        line2.point(lambda, phi2);\n      }\n      function lineStart() {\n        clip2.point = pointLine;\n        line2.lineStart();\n      }\n      function lineEnd() {\n        clip2.point = point2;\n        line2.lineEnd();\n      }\n      function pointRing(lambda, phi2) {\n        ring.push([lambda, phi2]);\n        ringSink.point(lambda, phi2);\n      }\n      function ringStart() {\n        ringSink.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringSink.lineEnd();\n        var clean = ringSink.clean(), ringSegments = ringBuffer.result(), i, n = ringSegments.length, m2, segment, point3;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          if ((m2 = segment.length - 1) > 0) {\n            if (!polygonStarted) sink.polygonStart(), polygonStarted = true;\n            sink.lineStart();\n            for (i = 0; i < m2; ++i) sink.point((point3 = segment[i])[0], point3[1]);\n            sink.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments2.push(ringSegments.filter(validSegment));\n      }\n      return clip2;\n    };\n  }\n  function validSegment(segment) {\n    return segment.length > 1;\n  }\n  function compareIntersection(a2, b2) {\n    return ((a2 = a2.x)[0] < 0 ? a2[1] - halfPi$1 - epsilon$3 : halfPi$1 - a2[1]) - ((b2 = b2.x)[0] < 0 ? b2[1] - halfPi$1 - epsilon$3 : halfPi$1 - b2[1]);\n  }\n  const clipAntimeridian = clip$1(\n    function() {\n      return true;\n    },\n    clipAntimeridianLine,\n    clipAntimeridianInterpolate,\n    [-pi$1, -halfPi$1]\n  );\n  function clipAntimeridianLine(stream2) {\n    var lambda02 = NaN, phi02 = NaN, sign0 = NaN, clean;\n    return {\n      lineStart: function() {\n        stream2.lineStart();\n        clean = 1;\n      },\n      point: function(lambda12, phi12) {\n        var sign1 = lambda12 > 0 ? pi$1 : -pi$1, delta = abs$1(lambda12 - lambda02);\n        if (abs$1(delta - pi$1) < epsilon$3) {\n          stream2.point(lambda02, phi02 = (phi02 + phi12) / 2 > 0 ? halfPi$1 : -halfPi$1);\n          stream2.point(sign0, phi02);\n          stream2.lineEnd();\n          stream2.lineStart();\n          stream2.point(sign1, phi02);\n          stream2.point(lambda12, phi02);\n          clean = 0;\n        } else if (sign0 !== sign1 && delta >= pi$1) {\n          if (abs$1(lambda02 - sign0) < epsilon$3) lambda02 -= sign0 * epsilon$3;\n          if (abs$1(lambda12 - sign1) < epsilon$3) lambda12 -= sign1 * epsilon$3;\n          phi02 = clipAntimeridianIntersect(lambda02, phi02, lambda12, phi12);\n          stream2.point(sign0, phi02);\n          stream2.lineEnd();\n          stream2.lineStart();\n          stream2.point(sign1, phi02);\n          clean = 0;\n        }\n        stream2.point(lambda02 = lambda12, phi02 = phi12);\n        sign0 = sign1;\n      },\n      lineEnd: function() {\n        stream2.lineEnd();\n        lambda02 = phi02 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function clipAntimeridianIntersect(lambda02, phi02, lambda12, phi12) {\n    var cosPhi02, cosPhi1, sinLambda0Lambda1 = sin$1(lambda02 - lambda12);\n    return abs$1(sinLambda0Lambda1) > epsilon$3 ? atan((sin$1(phi02) * (cosPhi1 = cos$1(phi12)) * sin$1(lambda12) - sin$1(phi12) * (cosPhi02 = cos$1(phi02)) * sin$1(lambda02)) / (cosPhi02 * cosPhi1 * sinLambda0Lambda1)) : (phi02 + phi12) / 2;\n  }\n  function clipAntimeridianInterpolate(from, to, direction, stream2) {\n    var phi2;\n    if (from == null) {\n      phi2 = direction * halfPi$1;\n      stream2.point(-pi$1, phi2);\n      stream2.point(0, phi2);\n      stream2.point(pi$1, phi2);\n      stream2.point(pi$1, 0);\n      stream2.point(pi$1, -phi2);\n      stream2.point(0, -phi2);\n      stream2.point(-pi$1, -phi2);\n      stream2.point(-pi$1, 0);\n      stream2.point(-pi$1, phi2);\n    } else if (abs$1(from[0] - to[0]) > epsilon$3) {\n      var lambda = from[0] < to[0] ? pi$1 : -pi$1;\n      phi2 = direction * lambda / 2;\n      stream2.point(-lambda, phi2);\n      stream2.point(0, phi2);\n      stream2.point(lambda, phi2);\n    } else {\n      stream2.point(to[0], to[1]);\n    }\n  }\n  function clipCircle(radius2) {\n    var cr2 = cos$1(radius2), delta = 2 * radians, smallRadius = cr2 > 0, notHemisphere = abs$1(cr2) > epsilon$3;\n    function interpolate2(from, to, direction, stream2) {\n      circleStream(stream2, radius2, delta, direction, from, to);\n    }\n    function visible(lambda, phi2) {\n      return cos$1(lambda) * cos$1(phi2) > cr2;\n    }\n    function clipLine2(stream2) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(lambda, phi2) {\n          var point1 = [lambda, phi2], point2, v = visible(lambda, phi2), c2 = smallRadius ? v ? 0 : code(lambda, phi2) : v ? code(lambda + (lambda < 0 ? pi$1 : -pi$1), phi2) : 0;\n          if (!point0 && (v00 = v0 = v)) stream2.lineStart();\n          if (v !== v0) {\n            point2 = intersect2(point0, point1);\n            if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2))\n              point1[2] = 1;\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              stream2.lineStart();\n              point2 = intersect2(point1, point0);\n              stream2.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect2(point0, point1);\n              stream2.point(point2[0], point2[1], 2);\n              stream2.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c2 & c0) && (t = intersect2(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                stream2.lineStart();\n                stream2.point(t[0][0], t[0][1]);\n                stream2.point(t[1][0], t[1][1]);\n                stream2.lineEnd();\n              } else {\n                stream2.point(t[1][0], t[1][1]);\n                stream2.lineEnd();\n                stream2.lineStart();\n                stream2.point(t[0][0], t[0][1], 3);\n              }\n            }\n          }\n          if (v && (!point0 || !pointEqual(point0, point1))) {\n            stream2.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c2;\n        },\n        lineEnd: function() {\n          if (v0) stream2.lineEnd();\n          point0 = null;\n        },\n        // Rejoin first and last segments if there were intersections and the first\n        // and last points were visible.\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect2(a2, b2, two) {\n      var pa2 = cartesian(a2), pb = cartesian(b2);\n      var n1 = [1, 0, 0], n2 = cartesianCross(pa2, pb), n2n2 = cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a2;\n      var c1 = cr2 * n2n2 / determinant, c2 = -cr2 * n1n2 / determinant, n1xn2 = cartesianCross(n1, n2), A5 = cartesianScale(n1, c1), B2 = cartesianScale(n2, c2);\n      cartesianAddInPlace(A5, B2);\n      var u2 = n1xn2, w2 = cartesianDot(A5, u2), uu = cartesianDot(u2, u2), t22 = w2 * w2 - uu * (cartesianDot(A5, A5) - 1);\n      if (t22 < 0) return;\n      var t = sqrt$1(t22), q = cartesianScale(u2, (-w2 - t) / uu);\n      cartesianAddInPlace(q, A5);\n      q = spherical(q);\n      if (!two) return q;\n      var lambda02 = a2[0], lambda12 = b2[0], phi02 = a2[1], phi12 = b2[1], z;\n      if (lambda12 < lambda02) z = lambda02, lambda02 = lambda12, lambda12 = z;\n      var delta2 = lambda12 - lambda02, polar = abs$1(delta2 - pi$1) < epsilon$3, meridian = polar || delta2 < epsilon$3;\n      if (!polar && phi12 < phi02) z = phi02, phi02 = phi12, phi12 = z;\n      if (meridian ? polar ? phi02 + phi12 > 0 ^ q[1] < (abs$1(q[0] - lambda02) < epsilon$3 ? phi02 : phi12) : phi02 <= q[1] && q[1] <= phi12 : delta2 > pi$1 ^ (lambda02 <= q[0] && q[0] <= lambda12)) {\n        var q1 = cartesianScale(u2, (-w2 + t) / uu);\n        cartesianAddInPlace(q1, A5);\n        return [q, spherical(q1)];\n      }\n    }\n    function code(lambda, phi2) {\n      var r = smallRadius ? radius2 : pi$1 - radius2, code2 = 0;\n      if (lambda < -r) code2 |= 1;\n      else if (lambda > r) code2 |= 2;\n      if (phi2 < -r) code2 |= 4;\n      else if (phi2 > r) code2 |= 8;\n      return code2;\n    }\n    return clip$1(visible, clipLine2, interpolate2, smallRadius ? [0, -radius2] : [-pi$1, radius2 - pi$1]);\n  }\n  function clipLine(a2, b2, x02, y02, x12, y12) {\n    var ax = a2[0], ay = a2[1], bx = b2[0], by = b2[1], t02 = 0, t12 = 1, dx = bx - ax, dy = by - ay, r;\n    r = x02 - ax;\n    if (!dx && r > 0) return;\n    r /= dx;\n    if (dx < 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    } else if (dx > 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    }\n    r = x12 - ax;\n    if (!dx && r < 0) return;\n    r /= dx;\n    if (dx < 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    } else if (dx > 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    }\n    r = y02 - ay;\n    if (!dy && r > 0) return;\n    r /= dy;\n    if (dy < 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    } else if (dy > 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    }\n    r = y12 - ay;\n    if (!dy && r < 0) return;\n    r /= dy;\n    if (dy < 0) {\n      if (r > t12) return;\n      if (r > t02) t02 = r;\n    } else if (dy > 0) {\n      if (r < t02) return;\n      if (r < t12) t12 = r;\n    }\n    if (t02 > 0) a2[0] = ax + t02 * dx, a2[1] = ay + t02 * dy;\n    if (t12 < 1) b2[0] = ax + t12 * dx, b2[1] = ay + t12 * dy;\n    return true;\n  }\n  var clipMax = 1e9, clipMin = -clipMax;\n  function clipRectangle(x02, y02, x12, y12) {\n    function visible(x2, y2) {\n      return x02 <= x2 && x2 <= x12 && y02 <= y2 && y2 <= y12;\n    }\n    function interpolate2(from, to, direction, stream2) {\n      var a2 = 0, a1 = 0;\n      if (from == null || (a2 = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoint(from, to) < 0 ^ direction > 0) {\n        do\n          stream2.point(a2 === 0 || a2 === 3 ? x02 : x12, a2 > 1 ? y12 : y02);\n        while ((a2 = (a2 + direction + 4) % 4) !== a1);\n      } else {\n        stream2.point(to[0], to[1]);\n      }\n    }\n    function corner(p, direction) {\n      return abs$1(p[0] - x02) < epsilon$3 ? direction > 0 ? 0 : 3 : abs$1(p[0] - x12) < epsilon$3 ? direction > 0 ? 2 : 1 : abs$1(p[1] - y02) < epsilon$3 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compareIntersection2(a2, b2) {\n      return comparePoint(a2.x, b2.x);\n    }\n    function comparePoint(a2, b2) {\n      var ca = corner(a2, 1), cb = corner(b2, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b2[1] - a2[1] : ca === 1 ? a2[0] - b2[0] : ca === 2 ? a2[1] - b2[1] : b2[0] - a2[0];\n    }\n    return function(stream2) {\n      var activeStream = stream2, bufferStream = clipBuffer(), segments2, polygon, ring, x__, y__, v__, x_, y_, v_, first, clean;\n      var clipStream = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart,\n        polygonEnd\n      };\n      function point2(x2, y2) {\n        if (visible(x2, y2)) activeStream.point(x2, y2);\n      }\n      function polygonInside() {\n        var winding = 0;\n        for (var i = 0, n = polygon.length; i < n; ++i) {\n          for (var ring2 = polygon[i], j = 1, m2 = ring2.length, point3 = ring2[0], a0, a1, b0 = point3[0], b1 = point3[1]; j < m2; ++j) {\n            a0 = b0, a1 = b1, point3 = ring2[j], b0 = point3[0], b1 = point3[1];\n            if (a1 <= y12) {\n              if (b1 > y12 && (b0 - a0) * (y12 - a1) > (b1 - a1) * (x02 - a0)) ++winding;\n            } else {\n              if (b1 <= y12 && (b0 - a0) * (y12 - a1) < (b1 - a1) * (x02 - a0)) --winding;\n            }\n          }\n        }\n        return winding;\n      }\n      function polygonStart() {\n        activeStream = bufferStream, segments2 = [], polygon = [], clean = true;\n      }\n      function polygonEnd() {\n        var startInside = polygonInside(), cleanInside = clean && startInside, visible2 = (segments2 = merge$2(segments2)).length;\n        if (cleanInside || visible2) {\n          stream2.polygonStart();\n          if (cleanInside) {\n            stream2.lineStart();\n            interpolate2(null, null, 1, stream2);\n            stream2.lineEnd();\n          }\n          if (visible2) {\n            clipRejoin(segments2, compareIntersection2, startInside, interpolate2, stream2);\n          }\n          stream2.polygonEnd();\n        }\n        activeStream = stream2, segments2 = polygon = ring = null;\n      }\n      function lineStart() {\n        clipStream.point = linePoint2;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments2) {\n          linePoint2(x__, y__);\n          if (v__ && v_) bufferStream.rejoin();\n          segments2.push(bufferStream.result());\n        }\n        clipStream.point = point2;\n        if (v_) activeStream.lineEnd();\n      }\n      function linePoint2(x2, y2) {\n        var v = visible(x2, y2);\n        if (polygon) ring.push([x2, y2]);\n        if (first) {\n          x__ = x2, y__ = y2, v__ = v;\n          first = false;\n          if (v) {\n            activeStream.lineStart();\n            activeStream.point(x2, y2);\n          }\n        } else {\n          if (v && v_) activeStream.point(x2, y2);\n          else {\n            var a2 = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], b2 = [x2 = Math.max(clipMin, Math.min(clipMax, x2)), y2 = Math.max(clipMin, Math.min(clipMax, y2))];\n            if (clipLine(a2, b2, x02, y02, x12, y12)) {\n              if (!v_) {\n                activeStream.lineStart();\n                activeStream.point(a2[0], a2[1]);\n              }\n              activeStream.point(b2[0], b2[1]);\n              if (!v) activeStream.lineEnd();\n              clean = false;\n            } else if (v) {\n              activeStream.lineStart();\n              activeStream.point(x2, y2);\n              clean = false;\n            }\n          }\n        }\n        x_ = x2, y_ = y2, v_ = v;\n      }\n      return clipStream;\n    };\n  }\n  function graticuleX(y02, y12, dy) {\n    var y2 = range$3(y02, y12 - epsilon$3, dy).concat(y12);\n    return function(x2) {\n      return y2.map(function(y3) {\n        return [x2, y3];\n      });\n    };\n  }\n  function graticuleY(x02, x12, dx) {\n    var x2 = range$3(x02, x12 - epsilon$3, dx).concat(x12);\n    return function(y2) {\n      return x2.map(function(x3) {\n        return [x3, y2];\n      });\n    };\n  }\n  function graticule() {\n    var x12, x02, X12, X02, y12, y02, Y12, Y02, dx = 10, dy = dx, DX = 90, DY = 360, x2, y2, X3, Y3, precision = 2.5;\n    function graticule2() {\n      return { type: \"MultiLineString\", coordinates: lines() };\n    }\n    function lines() {\n      return range$3(ceil(X02 / DX) * DX, X12, DX).map(X3).concat(range$3(ceil(Y02 / DY) * DY, Y12, DY).map(Y3)).concat(range$3(ceil(x02 / dx) * dx, x12, dx).filter(function(x3) {\n        return abs$1(x3 % DX) > epsilon$3;\n      }).map(x2)).concat(range$3(ceil(y02 / dy) * dy, y12, dy).filter(function(y3) {\n        return abs$1(y3 % DY) > epsilon$3;\n      }).map(y2));\n    }\n    graticule2.lines = function() {\n      return lines().map(function(coordinates) {\n        return { type: \"LineString\", coordinates };\n      });\n    };\n    graticule2.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [\n          X3(X02).concat(\n            Y3(Y12).slice(1),\n            X3(X12).reverse().slice(1),\n            Y3(Y02).reverse().slice(1)\n          )\n        ]\n      };\n    };\n    graticule2.extent = function(_) {\n      if (!arguments.length) return graticule2.extentMinor();\n      return graticule2.extentMajor(_).extentMinor(_);\n    };\n    graticule2.extentMajor = function(_) {\n      if (!arguments.length) return [[X02, Y02], [X12, Y12]];\n      X02 = +_[0][0], X12 = +_[1][0];\n      Y02 = +_[0][1], Y12 = +_[1][1];\n      if (X02 > X12) _ = X02, X02 = X12, X12 = _;\n      if (Y02 > Y12) _ = Y02, Y02 = Y12, Y12 = _;\n      return graticule2.precision(precision);\n    };\n    graticule2.extentMinor = function(_) {\n      if (!arguments.length) return [[x02, y02], [x12, y12]];\n      x02 = +_[0][0], x12 = +_[1][0];\n      y02 = +_[0][1], y12 = +_[1][1];\n      if (x02 > x12) _ = x02, x02 = x12, x12 = _;\n      if (y02 > y12) _ = y02, y02 = y12, y12 = _;\n      return graticule2.precision(precision);\n    };\n    graticule2.step = function(_) {\n      if (!arguments.length) return graticule2.stepMinor();\n      return graticule2.stepMajor(_).stepMinor(_);\n    };\n    graticule2.stepMajor = function(_) {\n      if (!arguments.length) return [DX, DY];\n      DX = +_[0], DY = +_[1];\n      return graticule2;\n    };\n    graticule2.stepMinor = function(_) {\n      if (!arguments.length) return [dx, dy];\n      dx = +_[0], dy = +_[1];\n      return graticule2;\n    };\n    graticule2.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x2 = graticuleX(y02, y12, 90);\n      y2 = graticuleY(x02, x12, precision);\n      X3 = graticuleX(Y02, Y12, 90);\n      Y3 = graticuleY(X02, X12, precision);\n      return graticule2;\n    };\n    return graticule2.extentMajor([[-180, -90 + epsilon$3], [180, 90 - epsilon$3]]).extentMinor([[-180, -80 - epsilon$3], [180, 80 + epsilon$3]]);\n  }\n  const identity$1 = (x2) => x2;\n  var areaSum = new Adder(), areaRingSum = new Adder(), x00$2, y00$2, x0$3, y0$3;\n  var areaStream = {\n    point: noop$2,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: function() {\n      areaStream.lineStart = areaRingStart;\n      areaStream.lineEnd = areaRingEnd;\n    },\n    polygonEnd: function() {\n      areaStream.lineStart = areaStream.lineEnd = areaStream.point = noop$2;\n      areaSum.add(abs$1(areaRingSum));\n      areaRingSum = new Adder();\n    },\n    result: function() {\n      var area2 = areaSum / 2;\n      areaSum = new Adder();\n      return area2;\n    }\n  };\n  function areaRingStart() {\n    areaStream.point = areaPointFirst;\n  }\n  function areaPointFirst(x2, y2) {\n    areaStream.point = areaPoint;\n    x00$2 = x0$3 = x2, y00$2 = y0$3 = y2;\n  }\n  function areaPoint(x2, y2) {\n    areaRingSum.add(y0$3 * x2 - x0$3 * y2);\n    x0$3 = x2, y0$3 = y2;\n  }\n  function areaRingEnd() {\n    areaPoint(x00$2, y00$2);\n  }\n  var x0$2 = Infinity, y0$2 = x0$2, x1 = -x0$2, y1 = x1;\n  var boundsStream = {\n    point: boundsPoint,\n    lineStart: noop$2,\n    lineEnd: noop$2,\n    polygonStart: noop$2,\n    polygonEnd: noop$2,\n    result: function() {\n      var bounds2 = [[x0$2, y0$2], [x1, y1]];\n      x1 = y1 = -(y0$2 = x0$2 = Infinity);\n      return bounds2;\n    }\n  };\n  function boundsPoint(x2, y2) {\n    if (x2 < x0$2) x0$2 = x2;\n    if (x2 > x1) x1 = x2;\n    if (y2 < y0$2) y0$2 = y2;\n    if (y2 > y1) y1 = y2;\n  }\n  var X0 = 0, Y0 = 0, Z0 = 0, X1 = 0, Y1 = 0, Z1 = 0, X2 = 0, Y2 = 0, Z2 = 0, x00$1, y00$1, x0$1, y0$1;\n  var centroidStream = {\n    point: centroidPoint,\n    lineStart: centroidLineStart,\n    lineEnd: centroidLineEnd,\n    polygonStart: function() {\n      centroidStream.lineStart = centroidRingStart;\n      centroidStream.lineEnd = centroidRingEnd;\n    },\n    polygonEnd: function() {\n      centroidStream.point = centroidPoint;\n      centroidStream.lineStart = centroidLineStart;\n      centroidStream.lineEnd = centroidLineEnd;\n    },\n    result: function() {\n      var centroid = Z2 ? [X2 / Z2, Y2 / Z2] : Z1 ? [X1 / Z1, Y1 / Z1] : Z0 ? [X0 / Z0, Y0 / Z0] : [NaN, NaN];\n      X0 = Y0 = Z0 = X1 = Y1 = Z1 = X2 = Y2 = Z2 = 0;\n      return centroid;\n    }\n  };\n  function centroidPoint(x2, y2) {\n    X0 += x2;\n    Y0 += y2;\n    ++Z0;\n  }\n  function centroidLineStart() {\n    centroidStream.point = centroidPointFirstLine;\n  }\n  function centroidPointFirstLine(x2, y2) {\n    centroidStream.point = centroidPointLine;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function centroidPointLine(x2, y2) {\n    var dx = x2 - x0$1, dy = y2 - y0$1, z = sqrt$1(dx * dx + dy * dy);\n    X1 += z * (x0$1 + x2) / 2;\n    Y1 += z * (y0$1 + y2) / 2;\n    Z1 += z;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function centroidLineEnd() {\n    centroidStream.point = centroidPoint;\n  }\n  function centroidRingStart() {\n    centroidStream.point = centroidPointFirstRing;\n  }\n  function centroidRingEnd() {\n    centroidPointRing(x00$1, y00$1);\n  }\n  function centroidPointFirstRing(x2, y2) {\n    centroidStream.point = centroidPointRing;\n    centroidPoint(x00$1 = x0$1 = x2, y00$1 = y0$1 = y2);\n  }\n  function centroidPointRing(x2, y2) {\n    var dx = x2 - x0$1, dy = y2 - y0$1, z = sqrt$1(dx * dx + dy * dy);\n    X1 += z * (x0$1 + x2) / 2;\n    Y1 += z * (y0$1 + y2) / 2;\n    Z1 += z;\n    z = y0$1 * x2 - x0$1 * y2;\n    X2 += z * (x0$1 + x2);\n    Y2 += z * (y0$1 + y2);\n    Z2 += z * 3;\n    centroidPoint(x0$1 = x2, y0$1 = y2);\n  }\n  function PathContext(context2) {\n    this._context = context2;\n  }\n  PathContext.prototype = {\n    _radius: 4.5,\n    pointRadius: function(_) {\n      return this._radius = _, this;\n    },\n    polygonStart: function() {\n      this._line = 0;\n    },\n    polygonEnd: function() {\n      this._line = NaN;\n    },\n    lineStart: function() {\n      this._point = 0;\n    },\n    lineEnd: function() {\n      if (this._line === 0) this._context.closePath();\n      this._point = NaN;\n    },\n    point: function(x2, y2) {\n      switch (this._point) {\n        case 0: {\n          this._context.moveTo(x2, y2);\n          this._point = 1;\n          break;\n        }\n        case 1: {\n          this._context.lineTo(x2, y2);\n          break;\n        }\n        default: {\n          this._context.moveTo(x2 + this._radius, y2);\n          this._context.arc(x2, y2, this._radius, 0, tau$1);\n          break;\n        }\n      }\n    },\n    result: noop$2\n  };\n  var lengthSum = new Adder(), lengthRing, x00, y00, x0, y0;\n  var lengthStream = {\n    point: noop$2,\n    lineStart: function() {\n      lengthStream.point = lengthPointFirst;\n    },\n    lineEnd: function() {\n      if (lengthRing) lengthPoint(x00, y00);\n      lengthStream.point = noop$2;\n    },\n    polygonStart: function() {\n      lengthRing = true;\n    },\n    polygonEnd: function() {\n      lengthRing = null;\n    },\n    result: function() {\n      var length2 = +lengthSum;\n      lengthSum = new Adder();\n      return length2;\n    }\n  };\n  function lengthPointFirst(x2, y2) {\n    lengthStream.point = lengthPoint;\n    x00 = x0 = x2, y00 = y0 = y2;\n  }\n  function lengthPoint(x2, y2) {\n    x0 -= x2, y0 -= y2;\n    lengthSum.add(sqrt$1(x0 * x0 + y0 * y0));\n    x0 = x2, y0 = y2;\n  }\n  let cacheDigits, cacheAppend, cacheRadius, cacheCircle;\n  class PathString {\n    constructor(digits) {\n      this._append = digits == null ? append : appendRound(digits);\n      this._radius = 4.5;\n      this._ = \"\";\n    }\n    pointRadius(_) {\n      this._radius = +_;\n      return this;\n    }\n    polygonStart() {\n      this._line = 0;\n    }\n    polygonEnd() {\n      this._line = NaN;\n    }\n    lineStart() {\n      this._point = 0;\n    }\n    lineEnd() {\n      if (this._line === 0) this._ += \"Z\";\n      this._point = NaN;\n    }\n    point(x2, y2) {\n      switch (this._point) {\n        case 0: {\n          this._append`M${x2},${y2}`;\n          this._point = 1;\n          break;\n        }\n        case 1: {\n          this._append`L${x2},${y2}`;\n          break;\n        }\n        default: {\n          this._append`M${x2},${y2}`;\n          if (this._radius !== cacheRadius || this._append !== cacheAppend) {\n            const r = this._radius;\n            const s = this._;\n            this._ = \"\";\n            this._append`m0,${r}a${r},${r} 0 1,1 0,${-2 * r}a${r},${r} 0 1,1 0,${2 * r}z`;\n            cacheRadius = r;\n            cacheAppend = this._append;\n            cacheCircle = this._;\n            this._ = s;\n          }\n          this._ += cacheCircle;\n          break;\n        }\n      }\n    }\n    result() {\n      const result = this._;\n      this._ = \"\";\n      return result.length ? result : null;\n    }\n  }\n  function append(strings) {\n    let i = 1;\n    this._ += strings[0];\n    for (const j = strings.length; i < j; ++i) {\n      this._ += arguments[i] + strings[i];\n    }\n  }\n  function appendRound(digits) {\n    const d = Math.floor(digits);\n    if (!(d >= 0)) throw new RangeError(`invalid digits: ${digits}`);\n    if (d > 15) return append;\n    if (d !== cacheDigits) {\n      const k = 10 ** d;\n      cacheDigits = d;\n      cacheAppend = function append2(strings) {\n        let i = 1;\n        this._ += strings[0];\n        for (const j = strings.length; i < j; ++i) {\n          this._ += Math.round(arguments[i] * k) / k + strings[i];\n        }\n      };\n    }\n    return cacheAppend;\n  }\n  function geoPath(projection2, context2) {\n    let digits = 3, pointRadius = 4.5, projectionStream, contextStream;\n    function path2(object2) {\n      if (object2) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        geoStream(object2, projectionStream(contextStream));\n      }\n      return contextStream.result();\n    }\n    path2.area = function(object2) {\n      geoStream(object2, projectionStream(areaStream));\n      return areaStream.result();\n    };\n    path2.measure = function(object2) {\n      geoStream(object2, projectionStream(lengthStream));\n      return lengthStream.result();\n    };\n    path2.bounds = function(object2) {\n      geoStream(object2, projectionStream(boundsStream));\n      return boundsStream.result();\n    };\n    path2.centroid = function(object2) {\n      geoStream(object2, projectionStream(centroidStream));\n      return centroidStream.result();\n    };\n    path2.projection = function(_) {\n      if (!arguments.length) return projection2;\n      projectionStream = _ == null ? (projection2 = null, identity$1) : (projection2 = _).stream;\n      return path2;\n    };\n    path2.context = function(_) {\n      if (!arguments.length) return context2;\n      contextStream = _ == null ? (context2 = null, new PathString(digits)) : new PathContext(context2 = _);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return path2;\n    };\n    path2.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path2;\n    };\n    path2.digits = function(_) {\n      if (!arguments.length) return digits;\n      if (_ == null) digits = null;\n      else {\n        const d = Math.floor(_);\n        if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n        digits = d;\n      }\n      if (context2 === null) contextStream = new PathString(digits);\n      return path2;\n    };\n    return path2.projection(projection2).digits(digits).context(context2);\n  }\n  function transformer(methods2) {\n    return function(stream2) {\n      var s = new TransformStream();\n      for (var key2 in methods2) s[key2] = methods2[key2];\n      s.stream = stream2;\n      return s;\n    };\n  }\n  function TransformStream() {\n  }\n  TransformStream.prototype = {\n    constructor: TransformStream,\n    point: function(x2, y2) {\n      this.stream.point(x2, y2);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function fit$1(projection2, fitBounds, object2) {\n    var clip2 = projection2.clipExtent && projection2.clipExtent();\n    projection2.scale(150).translate([0, 0]);\n    if (clip2 != null) projection2.clipExtent(null);\n    geoStream(object2, projection2.stream(boundsStream));\n    fitBounds(boundsStream.result());\n    if (clip2 != null) projection2.clipExtent(clip2);\n    return projection2;\n  }\n  function fitExtent(projection2, extent2, object2) {\n    return fit$1(projection2, function(b2) {\n      var w2 = extent2[1][0] - extent2[0][0], h2 = extent2[1][1] - extent2[0][1], k = Math.min(w2 / (b2[1][0] - b2[0][0]), h2 / (b2[1][1] - b2[0][1])), x2 = +extent2[0][0] + (w2 - k * (b2[1][0] + b2[0][0])) / 2, y2 = +extent2[0][1] + (h2 - k * (b2[1][1] + b2[0][1])) / 2;\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  function fitSize(projection2, size, object2) {\n    return fitExtent(projection2, [[0, 0], size], object2);\n  }\n  function fitWidth(projection2, width2, object2) {\n    return fit$1(projection2, function(b2) {\n      var w2 = +width2, k = w2 / (b2[1][0] - b2[0][0]), x2 = (w2 - k * (b2[1][0] + b2[0][0])) / 2, y2 = -k * b2[0][1];\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  function fitHeight(projection2, height2, object2) {\n    return fit$1(projection2, function(b2) {\n      var h2 = +height2, k = h2 / (b2[1][1] - b2[0][1]), x2 = -k * b2[0][0], y2 = (h2 - k * (b2[1][1] + b2[0][1])) / 2;\n      projection2.scale(150 * k).translate([x2, y2]);\n    }, object2);\n  }\n  var maxDepth = 16, cosMinDistance = cos$1(30 * radians);\n  function resample(project2, delta2) {\n    return +delta2 ? resample$1(project2, delta2) : resampleNone(project2);\n  }\n  function resampleNone(project2) {\n    return transformer({\n      point: function(x2, y2) {\n        x2 = project2(x2, y2);\n        this.stream.point(x2[0], x2[1]);\n      }\n    });\n  }\n  function resample$1(project2, delta2) {\n    function resampleLineTo(x02, y02, lambda02, a0, b0, c0, x12, y12, lambda12, a1, b1, c1, depth, stream2) {\n      var dx = x12 - x02, dy = y12 - y02, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * delta2 && depth--) {\n        var a2 = a0 + a1, b2 = b0 + b1, c2 = c0 + c1, m2 = sqrt$1(a2 * a2 + b2 * b2 + c2 * c2), phi2 = asin$1(c2 /= m2), lambda22 = abs$1(abs$1(c2) - 1) < epsilon$3 || abs$1(lambda02 - lambda12) < epsilon$3 ? (lambda02 + lambda12) / 2 : atan2(b2, a2), p = project2(lambda22, phi2), x2 = p[0], y2 = p[1], dx2 = x2 - x02, dy2 = y2 - y02, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > delta2 || abs$1((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x02, y02, lambda02, a0, b0, c0, x2, y2, lambda22, a2 /= m2, b2 /= m2, c2, depth, stream2);\n          stream2.point(x2, y2);\n          resampleLineTo(x2, y2, lambda22, a2, b2, c2, x12, y12, lambda12, a1, b1, c1, depth, stream2);\n        }\n      }\n    }\n    return function(stream2) {\n      var lambda002, x002, y002, a00, b00, c00, lambda02, x02, y02, a0, b0, c0;\n      var resampleStream = {\n        point: point2,\n        lineStart,\n        lineEnd,\n        polygonStart: function() {\n          stream2.polygonStart();\n          resampleStream.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream2.polygonEnd();\n          resampleStream.lineStart = lineStart;\n        }\n      };\n      function point2(x2, y2) {\n        x2 = project2(x2, y2);\n        stream2.point(x2[0], x2[1]);\n      }\n      function lineStart() {\n        x02 = NaN;\n        resampleStream.point = linePoint2;\n        stream2.lineStart();\n      }\n      function linePoint2(lambda, phi2) {\n        var c2 = cartesian([lambda, phi2]), p = project2(lambda, phi2);\n        resampleLineTo(x02, y02, lambda02, a0, b0, c0, x02 = p[0], y02 = p[1], lambda02 = lambda, a0 = c2[0], b0 = c2[1], c0 = c2[2], maxDepth, stream2);\n        stream2.point(x02, y02);\n      }\n      function lineEnd() {\n        resampleStream.point = point2;\n        stream2.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resampleStream.point = ringPoint;\n        resampleStream.lineEnd = ringEnd;\n      }\n      function ringPoint(lambda, phi2) {\n        linePoint2(lambda002 = lambda, phi2), x002 = x02, y002 = y02, a00 = a0, b00 = b0, c00 = c0;\n        resampleStream.point = linePoint2;\n      }\n      function ringEnd() {\n        resampleLineTo(x02, y02, lambda02, a0, b0, c0, x002, y002, lambda002, a00, b00, c00, maxDepth, stream2);\n        resampleStream.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resampleStream;\n    };\n  }\n  var transformRadians = transformer({\n    point: function(x2, y2) {\n      this.stream.point(x2 * radians, y2 * radians);\n    }\n  });\n  function transformRotate(rotate2) {\n    return transformer({\n      point: function(x2, y2) {\n        var r = rotate2(x2, y2);\n        return this.stream.point(r[0], r[1]);\n      }\n    });\n  }\n  function scaleTranslate(k, dx, dy, sx, sy) {\n    function transform2(x2, y2) {\n      x2 *= sx;\n      y2 *= sy;\n      return [dx + k * x2, dy - k * y2];\n    }\n    transform2.invert = function(x2, y2) {\n      return [(x2 - dx) / k * sx, (dy - y2) / k * sy];\n    };\n    return transform2;\n  }\n  function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) {\n    if (!alpha) return scaleTranslate(k, dx, dy, sx, sy);\n    var cosAlpha = cos$1(alpha), sinAlpha = sin$1(alpha), a2 = cosAlpha * k, b2 = sinAlpha * k, ai = cosAlpha / k, bi = sinAlpha / k, ci = (sinAlpha * dy - cosAlpha * dx) / k, fi = (sinAlpha * dx + cosAlpha * dy) / k;\n    function transform2(x2, y2) {\n      x2 *= sx;\n      y2 *= sy;\n      return [a2 * x2 - b2 * y2 + dx, dy - b2 * x2 - a2 * y2];\n    }\n    transform2.invert = function(x2, y2) {\n      return [sx * (ai * x2 - bi * y2 + ci), sy * (fi - bi * x2 - ai * y2)];\n    };\n    return transform2;\n  }\n  function projection$1(project2) {\n    return projectionMutator(function() {\n      return project2;\n    })();\n  }\n  function projectionMutator(projectAt) {\n    var project2, k = 150, x2 = 480, y2 = 250, lambda = 0, phi2 = 0, deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate2, alpha = 0, sx = 1, sy = 1, theta = null, preclip = clipAntimeridian, x02 = null, y02, x12, y12, postclip = identity$1, delta2 = 0.5, projectResample, projectTransform, projectRotateTransform, cache2, cacheStream;\n    function projection2(point2) {\n      return projectRotateTransform(point2[0] * radians, point2[1] * radians);\n    }\n    function invert2(point2) {\n      point2 = projectRotateTransform.invert(point2[0], point2[1]);\n      return point2 && [point2[0] * degrees, point2[1] * degrees];\n    }\n    projection2.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = transformRadians(transformRotate(rotate2)(preclip(projectResample(postclip(cacheStream = stream2)))));\n    };\n    projection2.preclip = function(_) {\n      return arguments.length ? (preclip = _, theta = void 0, reset2()) : preclip;\n    };\n    projection2.postclip = function(_) {\n      return arguments.length ? (postclip = _, x02 = y02 = x12 = y12 = null, reset2()) : postclip;\n    };\n    projection2.clipAngle = function(_) {\n      return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset2()) : theta * degrees;\n    };\n    projection2.clipExtent = function(_) {\n      return arguments.length ? (postclip = _ == null ? (x02 = y02 = x12 = y12 = null, identity$1) : clipRectangle(x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset2()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    projection2.scale = function(_) {\n      return arguments.length ? (k = +_, recenter()) : k;\n    };\n    projection2.translate = function(_) {\n      return arguments.length ? (x2 = +_[0], y2 = +_[1], recenter()) : [x2, y2];\n    };\n    projection2.center = function(_) {\n      return arguments.length ? (lambda = _[0] % 360 * radians, phi2 = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi2 * degrees];\n    };\n    projection2.rotate = function(_) {\n      return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees];\n    };\n    projection2.angle = function(_) {\n      return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees;\n    };\n    projection2.reflectX = function(_) {\n      return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0;\n    };\n    projection2.reflectY = function(_) {\n      return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0;\n    };\n    projection2.precision = function(_) {\n      return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset2()) : sqrt$1(delta2);\n    };\n    projection2.fitExtent = function(extent2, object2) {\n      return fitExtent(projection2, extent2, object2);\n    };\n    projection2.fitSize = function(size, object2) {\n      return fitSize(projection2, size, object2);\n    };\n    projection2.fitWidth = function(width2, object2) {\n      return fitWidth(projection2, width2, object2);\n    };\n    projection2.fitHeight = function(height2, object2) {\n      return fitHeight(projection2, height2, object2);\n    };\n    function recenter() {\n      var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project2(lambda, phi2)), transform2 = scaleTranslateRotate(k, x2 - center[0], y2 - center[1], sx, sy, alpha);\n      rotate2 = rotateRadians(deltaLambda, deltaPhi, deltaGamma);\n      projectTransform = compose(project2, transform2);\n      projectRotateTransform = compose(rotate2, projectTransform);\n      projectResample = resample(projectTransform, delta2);\n      return reset2();\n    }\n    function reset2() {\n      cache2 = cacheStream = null;\n      return projection2;\n    }\n    return function() {\n      project2 = projectAt.apply(this, arguments);\n      projection2.invert = project2.invert && invert2;\n      return recenter();\n    };\n  }\n  function conicProjection(projectAt) {\n    var phi02 = 0, phi12 = pi$1 / 3, m2 = projectionMutator(projectAt), p = m2(phi02, phi12);\n    p.parallels = function(_) {\n      return arguments.length ? m2(phi02 = _[0] * radians, phi12 = _[1] * radians) : [phi02 * degrees, phi12 * degrees];\n    };\n    return p;\n  }\n  function cylindricalEqualAreaRaw(phi02) {\n    var cosPhi02 = cos$1(phi02);\n    function forward(lambda, phi2) {\n      return [lambda * cosPhi02, sin$1(phi2) / cosPhi02];\n    }\n    forward.invert = function(x2, y2) {\n      return [x2 / cosPhi02, asin$1(y2 * cosPhi02)];\n    };\n    return forward;\n  }\n  function conicEqualAreaRaw(y02, y12) {\n    var sy0 = sin$1(y02), n = (sy0 + sin$1(y12)) / 2;\n    if (abs$1(n) < epsilon$3) return cylindricalEqualAreaRaw(y02);\n    var c2 = 1 + sy0 * (2 * n - sy0), r0 = sqrt$1(c2) / n;\n    function project2(x2, y2) {\n      var r = sqrt$1(c2 - 2 * n * sin$1(y2)) / n;\n      return [r * sin$1(x2 *= n), r0 - r * cos$1(x2)];\n    }\n    project2.invert = function(x2, y2) {\n      var r0y = r0 - y2, l = atan2(x2, abs$1(r0y)) * sign(r0y);\n      if (r0y * n < 0)\n        l -= pi$1 * sign(x2) * sign(r0y);\n      return [l / n, asin$1((c2 - (x2 * x2 + r0y * r0y) * n * n) / (2 * n))];\n    };\n    return project2;\n  }\n  function geoConicEqualArea() {\n    return conicProjection(conicEqualAreaRaw).scale(155.424).center([0, 33.6442]);\n  }\n  function geoAlbers() {\n    return geoConicEqualArea().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-0.6, 38.7]);\n  }\n  function multiplex(streams) {\n    var n = streams.length;\n    return {\n      point: function(x2, y2) {\n        var i = -1;\n        while (++i < n) streams[i].point(x2, y2);\n      },\n      sphere: function() {\n        var i = -1;\n        while (++i < n) streams[i].sphere();\n      },\n      lineStart: function() {\n        var i = -1;\n        while (++i < n) streams[i].lineStart();\n      },\n      lineEnd: function() {\n        var i = -1;\n        while (++i < n) streams[i].lineEnd();\n      },\n      polygonStart: function() {\n        var i = -1;\n        while (++i < n) streams[i].polygonStart();\n      },\n      polygonEnd: function() {\n        var i = -1;\n        while (++i < n) streams[i].polygonEnd();\n      }\n    };\n  }\n  function geoAlbersUsa() {\n    var cache2, cacheStream, lower48 = geoAlbers(), lower48Point, alaska = geoConicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, hawaii = geoConicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, point2, pointStream = { point: function(x2, y2) {\n      point2 = [x2, y2];\n    } };\n    function albersUsa(coordinates) {\n      var x2 = coordinates[0], y2 = coordinates[1];\n      return point2 = null, (lower48Point.point(x2, y2), point2) || (alaskaPoint.point(x2, y2), point2) || (hawaiiPoint.point(x2, y2), point2);\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x2 = (coordinates[0] - t[0]) / k, y2 = (coordinates[1] - t[1]) / k;\n      return (y2 >= 0.12 && y2 < 0.234 && x2 >= -0.425 && x2 < -0.214 ? alaska : y2 >= 0.166 && y2 < 0.234 && x2 >= -0.214 && x2 < -0.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = multiplex([lower48.stream(cacheStream = stream2), alaska.stream(stream2), hawaii.stream(stream2)]);\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_), alaska.precision(_), hawaii.precision(_);\n      return reset2();\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x2 = +_[0], y2 = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([[x2 - 0.455 * k, y2 - 0.238 * k], [x2 + 0.455 * k, y2 + 0.238 * k]]).stream(pointStream);\n      alaskaPoint = alaska.translate([x2 - 0.307 * k, y2 + 0.201 * k]).clipExtent([[x2 - 0.425 * k + epsilon$3, y2 + 0.12 * k + epsilon$3], [x2 - 0.214 * k - epsilon$3, y2 + 0.234 * k - epsilon$3]]).stream(pointStream);\n      hawaiiPoint = hawaii.translate([x2 - 0.205 * k, y2 + 0.212 * k]).clipExtent([[x2 - 0.214 * k + epsilon$3, y2 + 0.166 * k + epsilon$3], [x2 - 0.115 * k - epsilon$3, y2 + 0.234 * k - epsilon$3]]).stream(pointStream);\n      return reset2();\n    };\n    albersUsa.fitExtent = function(extent2, object2) {\n      return fitExtent(albersUsa, extent2, object2);\n    };\n    albersUsa.fitSize = function(size, object2) {\n      return fitSize(albersUsa, size, object2);\n    };\n    albersUsa.fitWidth = function(width2, object2) {\n      return fitWidth(albersUsa, width2, object2);\n    };\n    albersUsa.fitHeight = function(height2, object2) {\n      return fitHeight(albersUsa, height2, object2);\n    };\n    function reset2() {\n      cache2 = cacheStream = null;\n      return albersUsa;\n    }\n    return albersUsa.scale(1070);\n  }\n  function azimuthalRaw(scale2) {\n    return function(x2, y2) {\n      var cx = cos$1(x2), cy = cos$1(y2), k = scale2(cx * cy);\n      if (k === Infinity) return [2, 0];\n      return [\n        k * cy * sin$1(x2),\n        k * sin$1(y2)\n      ];\n    };\n  }\n  function azimuthalInvert(angle2) {\n    return function(x2, y2) {\n      var z = sqrt$1(x2 * x2 + y2 * y2), c2 = angle2(z), sc = sin$1(c2), cc = cos$1(c2);\n      return [\n        atan2(x2 * sc, z * cc),\n        asin$1(z && y2 * sc / z)\n      ];\n    };\n  }\n  var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {\n    return sqrt$1(2 / (1 + cxcy));\n  });\n  azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {\n    return 2 * asin$1(z / 2);\n  });\n  function geoAzimuthalEqualArea() {\n    return projection$1(azimuthalEqualAreaRaw).scale(124.75).clipAngle(180 - 1e-3);\n  }\n  var azimuthalEquidistantRaw = azimuthalRaw(function(c2) {\n    return (c2 = acos(c2)) && c2 / sin$1(c2);\n  });\n  azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {\n    return z;\n  });\n  function geoAzimuthalEquidistant() {\n    return projection$1(azimuthalEquidistantRaw).scale(79.4188).clipAngle(180 - 1e-3);\n  }\n  function mercatorRaw(lambda, phi2) {\n    return [lambda, log$1(tan((halfPi$1 + phi2) / 2))];\n  }\n  mercatorRaw.invert = function(x2, y2) {\n    return [x2, 2 * atan(exp(y2)) - halfPi$1];\n  };\n  function geoMercator() {\n    return mercatorProjection(mercatorRaw).scale(961 / tau$1);\n  }\n  function mercatorProjection(project2) {\n    var m2 = projection$1(project2), center = m2.center, scale2 = m2.scale, translate2 = m2.translate, clipExtent = m2.clipExtent, x02 = null, y02, x12, y12;\n    m2.scale = function(_) {\n      return arguments.length ? (scale2(_), reclip()) : scale2();\n    };\n    m2.translate = function(_) {\n      return arguments.length ? (translate2(_), reclip()) : translate2();\n    };\n    m2.center = function(_) {\n      return arguments.length ? (center(_), reclip()) : center();\n    };\n    m2.clipExtent = function(_) {\n      return arguments.length ? (_ == null ? x02 = y02 = x12 = y12 = null : (x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reclip()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    function reclip() {\n      var k = pi$1 * scale2(), t = m2(rotation(m2.rotate()).invert([0, 0]));\n      return clipExtent(x02 == null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project2 === mercatorRaw ? [[Math.max(t[0] - k, x02), y02], [Math.min(t[0] + k, x12), y12]] : [[x02, Math.max(t[1] - k, y02)], [x12, Math.min(t[1] + k, y12)]]);\n    }\n    return reclip();\n  }\n  function tany(y2) {\n    return tan((halfPi$1 + y2) / 2);\n  }\n  function conicConformalRaw(y02, y12) {\n    var cy0 = cos$1(y02), n = y02 === y12 ? sin$1(y02) : log$1(cy0 / cos$1(y12)) / log$1(tany(y12) / tany(y02)), f = cy0 * pow$1(tany(y02), n) / n;\n    if (!n) return mercatorRaw;\n    function project2(x2, y2) {\n      if (f > 0) {\n        if (y2 < -halfPi$1 + epsilon$3) y2 = -halfPi$1 + epsilon$3;\n      } else {\n        if (y2 > halfPi$1 - epsilon$3) y2 = halfPi$1 - epsilon$3;\n      }\n      var r = f / pow$1(tany(y2), n);\n      return [r * sin$1(n * x2), f - r * cos$1(n * x2)];\n    }\n    project2.invert = function(x2, y2) {\n      var fy = f - y2, r = sign(n) * sqrt$1(x2 * x2 + fy * fy), l = atan2(x2, abs$1(fy)) * sign(fy);\n      if (fy * n < 0)\n        l -= pi$1 * sign(x2) * sign(fy);\n      return [l / n, 2 * atan(pow$1(f / r, 1 / n)) - halfPi$1];\n    };\n    return project2;\n  }\n  function geoConicConformal() {\n    return conicProjection(conicConformalRaw).scale(109.5).parallels([30, 30]);\n  }\n  function equirectangularRaw(lambda, phi2) {\n    return [lambda, phi2];\n  }\n  equirectangularRaw.invert = equirectangularRaw;\n  function geoEquirectangular() {\n    return projection$1(equirectangularRaw).scale(152.63);\n  }\n  function conicEquidistantRaw(y02, y12) {\n    var cy0 = cos$1(y02), n = y02 === y12 ? sin$1(y02) : (cy0 - cos$1(y12)) / (y12 - y02), g = cy0 / n + y02;\n    if (abs$1(n) < epsilon$3) return equirectangularRaw;\n    function project2(x2, y2) {\n      var gy = g - y2, nx = n * x2;\n      return [gy * sin$1(nx), g - gy * cos$1(nx)];\n    }\n    project2.invert = function(x2, y2) {\n      var gy = g - y2, l = atan2(x2, abs$1(gy)) * sign(gy);\n      if (gy * n < 0)\n        l -= pi$1 * sign(x2) * sign(gy);\n      return [l / n, g - sign(n) * sqrt$1(x2 * x2 + gy * gy)];\n    };\n    return project2;\n  }\n  function geoConicEquidistant() {\n    return conicProjection(conicEquidistantRaw).scale(131.154).center([0, 13.9389]);\n  }\n  var A1 = 1.340264, A2 = -0.081106, A3 = 893e-6, A4 = 3796e-6, M = sqrt$1(3) / 2, iterations = 12;\n  function equalEarthRaw(lambda, phi2) {\n    var l = asin$1(M * sin$1(phi2)), l2 = l * l, l6 = l2 * l2 * l2;\n    return [\n      lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),\n      l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))\n    ];\n  }\n  equalEarthRaw.invert = function(x2, y2) {\n    var l = y2, l2 = l * l, l6 = l2 * l2 * l2;\n    for (var i = 0, delta, fy, fpy; i < iterations; ++i) {\n      fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y2;\n      fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);\n      l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;\n      if (abs$1(delta) < epsilon2) break;\n    }\n    return [\n      M * x2 * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),\n      asin$1(sin$1(l) / M)\n    ];\n  };\n  function geoEqualEarth() {\n    return projection$1(equalEarthRaw).scale(177.158);\n  }\n  function gnomonicRaw(x2, y2) {\n    var cy = cos$1(y2), k = cos$1(x2) * cy;\n    return [cy * sin$1(x2) / k, sin$1(y2) / k];\n  }\n  gnomonicRaw.invert = azimuthalInvert(atan);\n  function geoGnomonic() {\n    return projection$1(gnomonicRaw).scale(144.049).clipAngle(60);\n  }\n  function geoIdentity() {\n    var k = 1, tx2 = 0, ty2 = 0, sx = 1, sy = 1, alpha = 0, ca, sa2, x02 = null, y02, x12, y12, kx = 1, ky = 1, transform2 = transformer({\n      point: function(x2, y2) {\n        var p = projection2([x2, y2]);\n        this.stream.point(p[0], p[1]);\n      }\n    }), postclip = identity$1, cache2, cacheStream;\n    function reset2() {\n      kx = k * sx;\n      ky = k * sy;\n      cache2 = cacheStream = null;\n      return projection2;\n    }\n    function projection2(p) {\n      var x2 = p[0] * kx, y2 = p[1] * ky;\n      if (alpha) {\n        var t = y2 * ca - x2 * sa2;\n        x2 = x2 * ca + y2 * sa2;\n        y2 = t;\n      }\n      return [x2 + tx2, y2 + ty2];\n    }\n    projection2.invert = function(p) {\n      var x2 = p[0] - tx2, y2 = p[1] - ty2;\n      if (alpha) {\n        var t = y2 * ca + x2 * sa2;\n        x2 = x2 * ca - y2 * sa2;\n        y2 = t;\n      }\n      return [x2 / kx, y2 / ky];\n    };\n    projection2.stream = function(stream2) {\n      return cache2 && cacheStream === stream2 ? cache2 : cache2 = transform2(postclip(cacheStream = stream2));\n    };\n    projection2.postclip = function(_) {\n      return arguments.length ? (postclip = _, x02 = y02 = x12 = y12 = null, reset2()) : postclip;\n    };\n    projection2.clipExtent = function(_) {\n      return arguments.length ? (postclip = _ == null ? (x02 = y02 = x12 = y12 = null, identity$1) : clipRectangle(x02 = +_[0][0], y02 = +_[0][1], x12 = +_[1][0], y12 = +_[1][1]), reset2()) : x02 == null ? null : [[x02, y02], [x12, y12]];\n    };\n    projection2.scale = function(_) {\n      return arguments.length ? (k = +_, reset2()) : k;\n    };\n    projection2.translate = function(_) {\n      return arguments.length ? (tx2 = +_[0], ty2 = +_[1], reset2()) : [tx2, ty2];\n    };\n    projection2.angle = function(_) {\n      return arguments.length ? (alpha = _ % 360 * radians, sa2 = sin$1(alpha), ca = cos$1(alpha), reset2()) : alpha * degrees;\n    };\n    projection2.reflectX = function(_) {\n      return arguments.length ? (sx = _ ? -1 : 1, reset2()) : sx < 0;\n    };\n    projection2.reflectY = function(_) {\n      return arguments.length ? (sy = _ ? -1 : 1, reset2()) : sy < 0;\n    };\n    projection2.fitExtent = function(extent2, object2) {\n      return fitExtent(projection2, extent2, object2);\n    };\n    projection2.fitSize = function(size, object2) {\n      return fitSize(projection2, size, object2);\n    };\n    projection2.fitWidth = function(width2, object2) {\n      return fitWidth(projection2, width2, object2);\n    };\n    projection2.fitHeight = function(height2, object2) {\n      return fitHeight(projection2, height2, object2);\n    };\n    return projection2;\n  }\n  function naturalEarth1Raw(lambda, phi2) {\n    var phi22 = phi2 * phi2, phi4 = phi22 * phi22;\n    return [\n      lambda * (0.8707 - 0.131979 * phi22 + phi4 * (-0.013791 + phi4 * (3971e-6 * phi22 - 1529e-6 * phi4))),\n      phi2 * (1.007226 + phi22 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi22 - 5916e-6 * phi4)))\n    ];\n  }\n  naturalEarth1Raw.invert = function(x2, y2) {\n    var phi2 = y2, i = 25, delta;\n    do {\n      var phi22 = phi2 * phi2, phi4 = phi22 * phi22;\n      phi2 -= delta = (phi2 * (1.007226 + phi22 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi22 - 5916e-6 * phi4))) - y2) / (1.007226 + phi22 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi22 - 5916e-6 * 11 * phi4)));\n    } while (abs$1(delta) > epsilon$3 && --i > 0);\n    return [\n      x2 / (0.8707 + (phi22 = phi2 * phi2) * (-0.131979 + phi22 * (-0.013791 + phi22 * phi22 * phi22 * (3971e-6 - 1529e-6 * phi22)))),\n      phi2\n    ];\n  };\n  function geoNaturalEarth1() {\n    return projection$1(naturalEarth1Raw).scale(175.295);\n  }\n  function orthographicRaw(x2, y2) {\n    return [cos$1(y2) * sin$1(x2), sin$1(y2)];\n  }\n  orthographicRaw.invert = azimuthalInvert(asin$1);\n  function geoOrthographic() {\n    return projection$1(orthographicRaw).scale(249.5).clipAngle(90 + epsilon$3);\n  }\n  function stereographicRaw(x2, y2) {\n    var cy = cos$1(y2), k = 1 + cos$1(x2) * cy;\n    return [cy * sin$1(x2) / k, sin$1(y2) / k];\n  }\n  stereographicRaw.invert = azimuthalInvert(function(z) {\n    return 2 * atan(z);\n  });\n  function geoStereographic() {\n    return projection$1(stereographicRaw).scale(250).clipAngle(142);\n  }\n  function transverseMercatorRaw(lambda, phi2) {\n    return [log$1(tan((halfPi$1 + phi2) / 2)), -lambda];\n  }\n  transverseMercatorRaw.invert = function(x2, y2) {\n    return [-y2, 2 * atan(exp(x2)) - halfPi$1];\n  };\n  function geoTransverseMercator() {\n    var m2 = mercatorProjection(transverseMercatorRaw), center = m2.center, rotate2 = m2.rotate;\n    m2.center = function(_) {\n      return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);\n    };\n    m2.rotate = function(_) {\n      return arguments.length ? rotate2([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate2(), [_[0], _[1], _[2] - 90]);\n    };\n    return rotate2([0, 0, 90]).scale(159.155);\n  }\n  var abs = Math.abs;\n  var cos = Math.cos;\n  var sin = Math.sin;\n  var epsilon$2 = 1e-6;\n  var pi = Math.PI;\n  var halfPi = pi / 2;\n  var sqrt2 = sqrt(2);\n  function asin(x2) {\n    return x2 > 1 ? halfPi : x2 < -1 ? -halfPi : Math.asin(x2);\n  }\n  function sqrt(x2) {\n    return x2 > 0 ? Math.sqrt(x2) : 0;\n  }\n  function mollweideBromleyTheta(cp, phi2) {\n    var cpsinPhi = cp * sin(phi2), i = 30, delta;\n    do\n      phi2 -= delta = (phi2 + sin(phi2) - cpsinPhi) / (1 + cos(phi2));\n    while (abs(delta) > epsilon$2 && --i > 0);\n    return phi2 / 2;\n  }\n  function mollweideBromleyRaw(cx, cy, cp) {\n    function forward(lambda, phi2) {\n      return [cx * lambda * cos(phi2 = mollweideBromleyTheta(cp, phi2)), cy * sin(phi2)];\n    }\n    forward.invert = function(x2, y2) {\n      return y2 = asin(y2 / cy), [x2 / (cx * cos(y2)), asin((2 * y2 + sin(2 * y2)) / cp)];\n    };\n    return forward;\n  }\n  var mollweideRaw = mollweideBromleyRaw(sqrt2 / halfPi, sqrt2, pi);\n  function geoMollweide() {\n    return projection$1(mollweideRaw).scale(169.529);\n  }\n  const defaultPath = geoPath();\n  const projectionProperties = [\n    // standard properties in d3-geo\n    \"clipAngle\",\n    \"clipExtent\",\n    \"scale\",\n    \"translate\",\n    \"center\",\n    \"rotate\",\n    \"parallels\",\n    \"precision\",\n    \"reflectX\",\n    \"reflectY\",\n    // extended properties in d3-geo-projections\n    \"coefficient\",\n    \"distance\",\n    \"fraction\",\n    \"lobes\",\n    \"parallel\",\n    \"radius\",\n    \"ratio\",\n    \"spacing\",\n    \"tilt\"\n  ];\n  function create$7(type2, constructor) {\n    return function projection2() {\n      const p = constructor();\n      p.type = type2;\n      p.path = geoPath().projection(p);\n      p.copy = p.copy || function() {\n        const c2 = projection2();\n        projectionProperties.forEach((prop) => {\n          if (p[prop]) c2[prop](p[prop]());\n        });\n        c2.path.pointRadius(p.path.pointRadius());\n        return c2;\n      };\n      return registerScale(p);\n    };\n  }\n  function projection(type2, proj) {\n    if (!type2 || typeof type2 !== \"string\") {\n      throw new Error(\"Projection type must be a name string.\");\n    }\n    type2 = type2.toLowerCase();\n    if (arguments.length > 1) {\n      projections[type2] = create$7(type2, proj);\n      return this;\n    } else {\n      return projections[type2] || null;\n    }\n  }\n  function getProjectionPath(proj) {\n    return proj && proj.path || defaultPath;\n  }\n  const projections = {\n    // base d3-geo projection types\n    albers: geoAlbers,\n    albersusa: geoAlbersUsa,\n    azimuthalequalarea: geoAzimuthalEqualArea,\n    azimuthalequidistant: geoAzimuthalEquidistant,\n    conicconformal: geoConicConformal,\n    conicequalarea: geoConicEqualArea,\n    conicequidistant: geoConicEquidistant,\n    equalEarth: geoEqualEarth,\n    equirectangular: geoEquirectangular,\n    gnomonic: geoGnomonic,\n    identity: geoIdentity,\n    mercator: geoMercator,\n    mollweide: geoMollweide,\n    naturalEarth1: geoNaturalEarth1,\n    orthographic: geoOrthographic,\n    stereographic: geoStereographic,\n    transversemercator: geoTransverseMercator\n  };\n  for (const key2 in projections) {\n    projection(key2, projections[key2]);\n  }\n  function noop$1() {\n  }\n  const cases = [[], [[[1, 1.5], [0.5, 1]]], [[[1.5, 1], [1, 1.5]]], [[[1.5, 1], [0.5, 1]]], [[[1, 0.5], [1.5, 1]]], [[[1, 1.5], [0.5, 1]], [[1, 0.5], [1.5, 1]]], [[[1, 0.5], [1, 1.5]]], [[[1, 0.5], [0.5, 1]]], [[[0.5, 1], [1, 0.5]]], [[[1, 1.5], [1, 0.5]]], [[[0.5, 1], [1, 0.5]], [[1.5, 1], [1, 1.5]]], [[[1.5, 1], [1, 0.5]]], [[[0.5, 1], [1.5, 1]]], [[[1, 1.5], [1.5, 1]]], [[[0.5, 1], [1, 1.5]]], []];\n  function contours() {\n    var dx = 1, dy = 1, smooth = smoothLinear;\n    function contours2(values2, tz) {\n      return tz.map((value2) => contour(values2, value2));\n    }\n    function contour(values2, value2) {\n      var polygons = [], holes = [];\n      isorings(values2, value2, (ring) => {\n        smooth(ring, values2, value2);\n        if (area(ring) > 0) polygons.push([ring]);\n        else holes.push(ring);\n      });\n      holes.forEach((hole) => {\n        for (var i = 0, n = polygons.length, polygon; i < n; ++i) {\n          if (contains((polygon = polygons[i])[0], hole) !== -1) {\n            polygon.push(hole);\n            return;\n          }\n        }\n      });\n      return {\n        type: \"MultiPolygon\",\n        value: value2,\n        coordinates: polygons\n      };\n    }\n    function isorings(values2, value2, callback) {\n      var fragmentByStart = [], fragmentByEnd = [], x2, y2, t02, t12, t22, t32;\n      x2 = y2 = -1;\n      t12 = values2[0] >= value2;\n      cases[t12 << 1].forEach(stitch2);\n      while (++x2 < dx - 1) {\n        t02 = t12, t12 = values2[x2 + 1] >= value2;\n        cases[t02 | t12 << 1].forEach(stitch2);\n      }\n      cases[t12 << 0].forEach(stitch2);\n      while (++y2 < dy - 1) {\n        x2 = -1;\n        t12 = values2[y2 * dx + dx] >= value2;\n        t22 = values2[y2 * dx] >= value2;\n        cases[t12 << 1 | t22 << 2].forEach(stitch2);\n        while (++x2 < dx - 1) {\n          t02 = t12, t12 = values2[y2 * dx + dx + x2 + 1] >= value2;\n          t32 = t22, t22 = values2[y2 * dx + x2 + 1] >= value2;\n          cases[t02 | t12 << 1 | t22 << 2 | t32 << 3].forEach(stitch2);\n        }\n        cases[t12 | t22 << 3].forEach(stitch2);\n      }\n      x2 = -1;\n      t22 = values2[y2 * dx] >= value2;\n      cases[t22 << 2].forEach(stitch2);\n      while (++x2 < dx - 1) {\n        t32 = t22, t22 = values2[y2 * dx + x2 + 1] >= value2;\n        cases[t22 << 2 | t32 << 3].forEach(stitch2);\n      }\n      cases[t22 << 3].forEach(stitch2);\n      function stitch2(line2) {\n        var start = [line2[0][0] + x2, line2[0][1] + y2], end = [line2[1][0] + x2, line2[1][1] + y2], startIndex = index2(start), endIndex = index2(end), f, g;\n        if (f = fragmentByEnd[startIndex]) {\n          if (g = fragmentByStart[endIndex]) {\n            delete fragmentByEnd[f.end];\n            delete fragmentByStart[g.start];\n            if (f === g) {\n              f.ring.push(end);\n              callback(f.ring);\n            } else {\n              fragmentByStart[f.start] = fragmentByEnd[g.end] = {\n                start: f.start,\n                end: g.end,\n                ring: f.ring.concat(g.ring)\n              };\n            }\n          } else {\n            delete fragmentByEnd[f.end];\n            f.ring.push(end);\n            fragmentByEnd[f.end = endIndex] = f;\n          }\n        } else if (f = fragmentByStart[endIndex]) {\n          if (g = fragmentByEnd[startIndex]) {\n            delete fragmentByStart[f.start];\n            delete fragmentByEnd[g.end];\n            if (f === g) {\n              f.ring.push(end);\n              callback(f.ring);\n            } else {\n              fragmentByStart[g.start] = fragmentByEnd[f.end] = {\n                start: g.start,\n                end: f.end,\n                ring: g.ring.concat(f.ring)\n              };\n            }\n          } else {\n            delete fragmentByStart[f.start];\n            f.ring.unshift(start);\n            fragmentByStart[f.start = startIndex] = f;\n          }\n        } else {\n          fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {\n            start: startIndex,\n            end: endIndex,\n            ring: [start, end]\n          };\n        }\n      }\n    }\n    function index2(point2) {\n      return point2[0] * 2 + point2[1] * (dx + 1) * 4;\n    }\n    function smoothLinear(ring, values2, value2) {\n      ring.forEach((point2) => {\n        var x2 = point2[0], y2 = point2[1], xt = x2 | 0, yt = y2 | 0, v0, v1 = values2[yt * dx + xt];\n        if (x2 > 0 && x2 < dx && xt === x2) {\n          v0 = values2[yt * dx + xt - 1];\n          point2[0] = x2 + (value2 - v0) / (v1 - v0) - 0.5;\n        }\n        if (y2 > 0 && y2 < dy && yt === y2) {\n          v0 = values2[(yt - 1) * dx + xt];\n          point2[1] = y2 + (value2 - v0) / (v1 - v0) - 0.5;\n        }\n      });\n    }\n    contours2.contour = contour;\n    contours2.size = function(_) {\n      if (!arguments.length) return [dx, dy];\n      var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]);\n      if (!(_0 >= 0 && _1 >= 0)) error(\"invalid size\");\n      return dx = _0, dy = _1, contours2;\n    };\n    contours2.smooth = function(_) {\n      return arguments.length ? (smooth = _ ? smoothLinear : noop$1, contours2) : smooth === smoothLinear;\n    };\n    return contours2;\n  }\n  function area(ring) {\n    var i = 0, n = ring.length, area2 = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];\n    while (++i < n) area2 += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];\n    return area2;\n  }\n  function contains(ring, hole) {\n    var i = -1, n = hole.length, c2;\n    while (++i < n) if (c2 = ringContains(ring, hole[i])) return c2;\n    return 0;\n  }\n  function ringContains(ring, point2) {\n    var x2 = point2[0], y2 = point2[1], contains2 = -1;\n    for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {\n      var pi2 = ring[i], xi = pi2[0], yi = pi2[1], pj = ring[j], xj = pj[0], yj = pj[1];\n      if (segmentContains(pi2, pj, point2)) return 0;\n      if (yi > y2 !== yj > y2 && x2 < (xj - xi) * (y2 - yi) / (yj - yi) + xi) contains2 = -contains2;\n    }\n    return contains2;\n  }\n  function segmentContains(a2, b2, c2) {\n    var i;\n    return collinear$1(a2, b2, c2) && within(a2[i = +(a2[0] === b2[0])], c2[i], b2[i]);\n  }\n  function collinear$1(a2, b2, c2) {\n    return (b2[0] - a2[0]) * (c2[1] - a2[1]) === (c2[0] - a2[0]) * (b2[1] - a2[1]);\n  }\n  function within(p, q, r) {\n    return p <= q && q <= r || r <= q && q <= p;\n  }\n  function quantize(k, nice2, zero2) {\n    return function(values2) {\n      var ex = extent(values2), start = zero2 ? Math.min(ex[0], 0) : ex[0], stop2 = ex[1], span2 = stop2 - start, step = nice2 ? tickStep(start, stop2, k) : span2 / (k + 1);\n      return range$3(start + step, stop2, step);\n    };\n  }\n  function Isocontour(params2) {\n    Transform.call(this, null, params2);\n  }\n  Isocontour.Definition = {\n    \"type\": \"Isocontour\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"thresholds\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"levels\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"zero\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"scale\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"translate\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"null\": true,\n      \"default\": \"contour\"\n    }]\n  };\n  inherits(Isocontour, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), source2 = pulse2.materialize(pulse2.SOURCE).source, field2 = _.field || identity$7, contour = contours().smooth(_.smooth !== false), tz = _.thresholds || levels(source2, field2, _), as = _.as === null ? null : _.as || \"contour\", values2 = [];\n      source2.forEach((t) => {\n        const grid = field2(t);\n        const paths = contour.size([grid.width, grid.height])(grid.values, isArray(tz) ? tz : tz(grid.values));\n        transformPaths(paths, grid, t, _);\n        paths.forEach((p) => {\n          values2.push(rederive(t, ingest$1(as != null ? {\n            [as]: p\n          } : p)));\n        });\n      });\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = values2;\n      return out;\n    }\n  });\n  function levels(values2, f, _) {\n    const q = quantize(_.levels || 10, _.nice, _.zero !== false);\n    return _.resolve !== \"shared\" ? q : q(values2.map((t) => max$3(f(t).values)));\n  }\n  function transformPaths(paths, grid, datum2, _) {\n    let s = _.scale || grid.scale, t = _.translate || grid.translate;\n    if (isFunction(s)) s = s(datum2, _);\n    if (isFunction(t)) t = t(datum2, _);\n    if ((s === 1 || s == null) && !t) return;\n    const sx = (isNumber$1(s) ? s : s[0]) || 1, sy = (isNumber$1(s) ? s : s[1]) || 1, tx2 = t && t[0] || 0, ty2 = t && t[1] || 0;\n    paths.forEach(transform$1(grid, sx, sy, tx2, ty2));\n  }\n  function transform$1(grid, sx, sy, tx2, ty2) {\n    const x12 = grid.x1 || 0, y12 = grid.y1 || 0, flip2 = sx * sy < 0;\n    function transformPolygon(coordinates) {\n      coordinates.forEach(transformRing);\n    }\n    function transformRing(coordinates) {\n      if (flip2) coordinates.reverse();\n      coordinates.forEach(transformPoint);\n    }\n    function transformPoint(coordinates) {\n      coordinates[0] = (coordinates[0] - x12) * sx + tx2;\n      coordinates[1] = (coordinates[1] - y12) * sy + ty2;\n    }\n    return function(geometry) {\n      geometry.coordinates.forEach(transformPolygon);\n      return geometry;\n    };\n  }\n  function radius(bw, data2, f) {\n    const v = bw >= 0 ? bw : estimateBandwidth(data2, f);\n    return Math.round((Math.sqrt(4 * v * v + 1) - 1) / 2);\n  }\n  function number$2(_) {\n    return isFunction(_) ? _ : constant$5(+_);\n  }\n  function density2D() {\n    var x2 = (d) => d[0], y2 = (d) => d[1], weight = one$2, bandwidth2 = [-1, -1], dx = 960, dy = 500, k = 2;\n    function density(data2, counts) {\n      const rx = radius(bandwidth2[0], data2, x2) >> k, ry = radius(bandwidth2[1], data2, y2) >> k, ox = rx ? rx + 2 : 0, oy = ry ? ry + 2 : 0, n = 2 * ox + (dx >> k), m2 = 2 * oy + (dy >> k), values0 = new Float32Array(n * m2), values1 = new Float32Array(n * m2);\n      let values2 = values0;\n      data2.forEach((d) => {\n        const xi = ox + (+x2(d) >> k), yi = oy + (+y2(d) >> k);\n        if (xi >= 0 && xi < n && yi >= 0 && yi < m2) {\n          values0[xi + yi * n] += +weight(d);\n        }\n      });\n      if (rx > 0 && ry > 0) {\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n        blurX(n, m2, values0, values1, rx);\n        blurY(n, m2, values1, values0, ry);\n      } else if (rx > 0) {\n        blurX(n, m2, values0, values1, rx);\n        blurX(n, m2, values1, values0, rx);\n        blurX(n, m2, values0, values1, rx);\n        values2 = values1;\n      } else if (ry > 0) {\n        blurY(n, m2, values0, values1, ry);\n        blurY(n, m2, values1, values0, ry);\n        blurY(n, m2, values0, values1, ry);\n        values2 = values1;\n      }\n      const s = counts ? Math.pow(2, -2 * k) : 1 / sum$1(values2);\n      for (let i = 0, sz2 = n * m2; i < sz2; ++i) values2[i] *= s;\n      return {\n        values: values2,\n        scale: 1 << k,\n        width: n,\n        height: m2,\n        x1: ox,\n        y1: oy,\n        x2: ox + (dx >> k),\n        y2: oy + (dy >> k)\n      };\n    }\n    density.x = function(_) {\n      return arguments.length ? (x2 = number$2(_), density) : x2;\n    };\n    density.y = function(_) {\n      return arguments.length ? (y2 = number$2(_), density) : y2;\n    };\n    density.weight = function(_) {\n      return arguments.length ? (weight = number$2(_), density) : weight;\n    };\n    density.size = function(_) {\n      if (!arguments.length) return [dx, dy];\n      var _0 = +_[0], _1 = +_[1];\n      if (!(_0 >= 0 && _1 >= 0)) error(\"invalid size\");\n      return dx = _0, dy = _1, density;\n    };\n    density.cellSize = function(_) {\n      if (!arguments.length) return 1 << k;\n      if (!((_ = +_) >= 1)) error(\"invalid cell size\");\n      k = Math.floor(Math.log(_) / Math.LN2);\n      return density;\n    };\n    density.bandwidth = function(_) {\n      if (!arguments.length) return bandwidth2;\n      _ = array$5(_);\n      if (_.length === 1) _ = [+_[0], +_[0]];\n      if (_.length !== 2) error(\"invalid bandwidth\");\n      return bandwidth2 = _, density;\n    };\n    return density;\n  }\n  function blurX(n, m2, source2, target2, r) {\n    const w2 = (r << 1) + 1;\n    for (let j = 0; j < m2; ++j) {\n      for (let i = 0, sr = 0; i < n + r; ++i) {\n        if (i < n) {\n          sr += source2[i + j * n];\n        }\n        if (i >= r) {\n          if (i >= w2) {\n            sr -= source2[i - w2 + j * n];\n          }\n          target2[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w2 - i, w2);\n        }\n      }\n    }\n  }\n  function blurY(n, m2, source2, target2, r) {\n    const w2 = (r << 1) + 1;\n    for (let i = 0; i < n; ++i) {\n      for (let j = 0, sr = 0; j < m2 + r; ++j) {\n        if (j < m2) {\n          sr += source2[i + j * n];\n        }\n        if (j >= r) {\n          if (j >= w2) {\n            sr -= source2[i + (j - w2) * n];\n          }\n          target2[i + (j - r) * n] = sr / Math.min(j + 1, m2 - 1 + w2 - j, w2);\n        }\n      }\n    }\n  }\n  function KDE2D(params2) {\n    Transform.call(this, null, params2);\n  }\n  KDE2D.Definition = {\n    \"type\": \"KDE2D\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"weight\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"cellSize\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"counts\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"grid\"\n    }]\n  };\n  const PARAMS = [\"x\", \"y\", \"weight\", \"size\", \"cellSize\", \"bandwidth\"];\n  function params(obj, _) {\n    PARAMS.forEach((param2) => _[param2] != null ? obj[param2](_[param2]) : 0);\n    return obj;\n  }\n  inherits(KDE2D, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) return pulse2.StopPropagation;\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition$2(source2, _.groupby), names = (_.groupby || []).map(accessorName), kde2 = params(density2D(), _), as = _.as || \"grid\", values2 = [];\n      function set2(t, vals) {\n        for (let i = 0; i < names.length; ++i) t[names[i]] = vals[i];\n        return t;\n      }\n      values2 = groups.map((g) => ingest$1(set2({\n        [as]: kde2(g, _.counts)\n      }, g.dims)));\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = values2;\n      return out;\n    }\n  });\n  function partition$2(data2, groupby) {\n    var groups = [], get2 = (f) => f(t), map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2);\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    return groups;\n  }\n  function Contour(params2) {\n    Transform.call(this, null, params2);\n  }\n  Contour.Definition = {\n    \"type\": \"Contour\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"required\": true\n    }, {\n      \"name\": \"values\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"x\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"weight\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"cellSize\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"count\",\n      \"type\": \"number\"\n    }, {\n      \"name\": \"nice\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"thresholds\",\n      \"type\": \"number\",\n      \"array\": true\n    }, {\n      \"name\": \"smooth\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }]\n  };\n  inherits(Contour, Transform, {\n    transform(_, pulse2) {\n      if (this.value && !pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS), contour = contours().smooth(_.smooth !== false), values2 = _.values, thresh = _.thresholds || quantize(_.count || 10, _.nice, !!values2), size = _.size, grid, post;\n      if (!values2) {\n        values2 = pulse2.materialize(pulse2.SOURCE).source;\n        grid = params(density2D(), _)(values2, true);\n        post = transform$1(grid, grid.scale || 1, grid.scale || 1, 0, 0);\n        size = [grid.width, grid.height];\n        values2 = grid.values;\n      }\n      thresh = isArray(thresh) ? thresh : thresh(values2);\n      values2 = contour.size(size)(values2, thresh);\n      if (post) values2.forEach(post);\n      if (this.value) out.rem = this.value;\n      this.value = out.source = out.add = (values2 || []).map(ingest$1);\n      return out;\n    }\n  });\n  const Feature = \"Feature\";\n  const FeatureCollection = \"FeatureCollection\";\n  const MultiPoint = \"MultiPoint\";\n  function GeoJSON(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoJSON.Definition = {\n    \"type\": \"GeoJSON\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"geojson\",\n      \"type\": \"field\"\n    }]\n  };\n  inherits(GeoJSON, Transform, {\n    transform(_, pulse2) {\n      var features = this._features, points2 = this._points, fields = _.fields, lon = fields && fields[0], lat = fields && fields[1], geojson = _.geojson || !fields && identity$7, flag2 = pulse2.ADD, mod;\n      mod = _.modified() || pulse2.changed(pulse2.REM) || pulse2.modified(accessorFields(geojson)) || lon && pulse2.modified(accessorFields(lon)) || lat && pulse2.modified(accessorFields(lat));\n      if (!this.value || mod) {\n        flag2 = pulse2.SOURCE;\n        this._features = features = [];\n        this._points = points2 = [];\n      }\n      if (geojson) {\n        pulse2.visit(flag2, (t) => features.push(geojson(t)));\n      }\n      if (lon && lat) {\n        pulse2.visit(flag2, (t) => {\n          var x2 = lon(t), y2 = lat(t);\n          if (x2 != null && y2 != null && (x2 = +x2) === x2 && (y2 = +y2) === y2) {\n            points2.push([x2, y2]);\n          }\n        });\n        features = features.concat({\n          type: Feature,\n          geometry: {\n            type: MultiPoint,\n            coordinates: points2\n          }\n        });\n      }\n      this.value = {\n        type: FeatureCollection,\n        features\n      };\n    }\n  });\n  function GeoPath(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoPath.Definition = {\n    \"type\": \"GeoPath\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\"\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"pointRadius\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  inherits(GeoPath, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), path2 = this.value, field2 = _.field || identity$7, as = _.as || \"path\", flag2 = out.SOURCE;\n      if (!path2 || _.modified()) {\n        this.value = path2 = getProjectionPath(_.projection);\n        out.materialize().reflow();\n      } else {\n        flag2 = field2 === identity$7 || pulse2.modified(field2.fields) ? out.ADD_MOD : out.ADD;\n      }\n      const prev = initPath(path2, _.pointRadius);\n      out.visit(flag2, (t) => t[as] = path2(field2(t)));\n      path2.pointRadius(prev);\n      return out.modifies(as);\n    }\n  });\n  function initPath(path2, pointRadius) {\n    const prev = path2.pointRadius();\n    path2.context(null);\n    if (pointRadius != null) {\n      path2.pointRadius(pointRadius);\n    }\n    return prev;\n  }\n  function GeoPoint(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoPoint.Definition = {\n    \"type\": \"GeoPoint\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\",\n      \"required\": true\n    }, {\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [\"x\", \"y\"]\n    }]\n  };\n  inherits(GeoPoint, Transform, {\n    transform(_, pulse2) {\n      var proj = _.projection, lon = _.fields[0], lat = _.fields[1], as = _.as || [\"x\", \"y\"], x2 = as[0], y2 = as[1], mod;\n      function set2(t) {\n        const xy = proj([lon(t), lat(t)]);\n        if (xy) {\n          t[x2] = xy[0];\n          t[y2] = xy[1];\n        } else {\n          t[x2] = void 0;\n          t[y2] = void 0;\n        }\n      }\n      if (_.modified()) {\n        pulse2 = pulse2.materialize().reflow(true).visit(pulse2.SOURCE, set2);\n      } else {\n        mod = pulse2.modified(lon.fields) || pulse2.modified(lat.fields);\n        pulse2.visit(mod ? pulse2.ADD_MOD : pulse2.ADD, set2);\n      }\n      return pulse2.modifies(as);\n    }\n  });\n  function GeoShape(params2) {\n    Transform.call(this, null, params2);\n  }\n  GeoShape.Definition = {\n    \"type\": \"GeoShape\",\n    \"metadata\": {\n      \"modifies\": true,\n      \"nomod\": true\n    },\n    \"params\": [{\n      \"name\": \"projection\",\n      \"type\": \"projection\"\n    }, {\n      \"name\": \"field\",\n      \"type\": \"field\",\n      \"default\": \"datum\"\n    }, {\n      \"name\": \"pointRadius\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"shape\"\n    }]\n  };\n  inherits(GeoShape, Transform, {\n    transform(_, pulse2) {\n      var out = pulse2.fork(pulse2.ALL), shape2 = this.value, as = _.as || \"shape\", flag2 = out.ADD;\n      if (!shape2 || _.modified()) {\n        this.value = shape2 = shapeGenerator(getProjectionPath(_.projection), _.field || field$1(\"datum\"), _.pointRadius);\n        out.materialize().reflow();\n        flag2 = out.SOURCE;\n      }\n      out.visit(flag2, (t) => t[as] = shape2);\n      return out.modifies(as);\n    }\n  });\n  function shapeGenerator(path2, field2, pointRadius) {\n    const shape2 = pointRadius == null ? (_) => path2(field2(_)) : (_) => {\n      var prev = path2.pointRadius(), value2 = path2.pointRadius(pointRadius)(field2(_));\n      path2.pointRadius(prev);\n      return value2;\n    };\n    shape2.context = (_) => {\n      path2.context(_);\n      return shape2;\n    };\n    return shape2;\n  }\n  function Graticule(params2) {\n    Transform.call(this, [], params2);\n    this.generator = graticule();\n  }\n  Graticule.Definition = {\n    \"type\": \"Graticule\",\n    \"metadata\": {\n      \"changes\": true,\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"extent\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"extentMajor\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"extentMinor\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"step\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"stepMajor\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [90, 360]\n    }, {\n      \"name\": \"stepMinor\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [10, 10]\n    }, {\n      \"name\": \"precision\",\n      \"type\": \"number\",\n      \"default\": 2.5\n    }]\n  };\n  inherits(Graticule, Transform, {\n    transform(_, pulse2) {\n      var src = this.value, gen = this.generator, t;\n      if (!src.length || _.modified()) {\n        for (const prop in _) {\n          if (isFunction(gen[prop])) {\n            gen[prop](_[prop]);\n          }\n        }\n      }\n      t = gen();\n      if (src.length) {\n        pulse2.mod.push(replace$1(src[0], t));\n      } else {\n        pulse2.add.push(ingest$1(t));\n      }\n      src[0] = t;\n      return pulse2;\n    }\n  });\n  function Heatmap(params2) {\n    Transform.call(this, null, params2);\n  }\n  Heatmap.Definition = {\n    \"type\": \"heatmap\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"color\",\n      \"type\": \"string\",\n      \"expr\": true\n    }, {\n      \"name\": \"opacity\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"resolve\",\n      \"type\": \"enum\",\n      \"values\": [\"shared\", \"independent\"],\n      \"default\": \"independent\"\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"image\"\n    }]\n  };\n  inherits(Heatmap, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.changed() && !_.modified()) {\n        return pulse2.StopPropagation;\n      }\n      var source2 = pulse2.materialize(pulse2.SOURCE).source, shared = _.resolve === \"shared\", field2 = _.field || identity$7, opacity = opacity_(_.opacity, _), color2 = color_(_.color, _), as = _.as || \"image\", obj = {\n        $x: 0,\n        $y: 0,\n        $value: 0,\n        $max: shared ? max$3(source2.map((t) => max$3(field2(t).values))) : 0\n      };\n      source2.forEach((t) => {\n        const v = field2(t);\n        const o = extend$1({}, t, obj);\n        if (!shared) o.$max = max$3(v.values || []);\n        t[as] = toCanvas(v, o, color2.dep ? color2 : constant$5(color2(o)), opacity.dep ? opacity : constant$5(opacity(o)));\n      });\n      return pulse2.reflow(true).modifies(as);\n    }\n  });\n  function color_(color2, _) {\n    let f;\n    if (isFunction(color2)) {\n      f = (obj) => rgb$1(color2(obj, _));\n      f.dep = dependency(color2);\n    } else {\n      f = constant$5(rgb$1(color2 || \"#888\"));\n    }\n    return f;\n  }\n  function opacity_(opacity, _) {\n    let f;\n    if (isFunction(opacity)) {\n      f = (obj) => opacity(obj, _);\n      f.dep = dependency(opacity);\n    } else if (opacity) {\n      f = constant$5(opacity);\n    } else {\n      f = (obj) => obj.$value / obj.$max || 0;\n      f.dep = true;\n    }\n    return f;\n  }\n  function dependency(f) {\n    if (!isFunction(f)) return false;\n    const set2 = toSet(accessorFields(f));\n    return set2.$x || set2.$y || set2.$value || set2.$max;\n  }\n  function toCanvas(grid, obj, color2, opacity) {\n    const n = grid.width, m2 = grid.height, x12 = grid.x1 || 0, y12 = grid.y1 || 0, x2 = grid.x2 || n, y2 = grid.y2 || m2, val = grid.values, value2 = val ? (i) => val[i] : zero$3, can = domCanvas(x2 - x12, y2 - y12), ctx = can.getContext(\"2d\"), img = ctx.getImageData(0, 0, x2 - x12, y2 - y12), pix = img.data;\n    for (let j = y12, k = 0; j < y2; ++j) {\n      obj.$y = j - y12;\n      for (let i = x12, r = j * n; i < x2; ++i, k += 4) {\n        obj.$x = i - x12;\n        obj.$value = value2(i + r);\n        const v = color2(obj);\n        pix[k + 0] = v.r;\n        pix[k + 1] = v.g;\n        pix[k + 2] = v.b;\n        pix[k + 3] = ~~(255 * opacity(obj));\n      }\n    }\n    ctx.putImageData(img, 0, 0);\n    return can;\n  }\n  function Projection$1(params2) {\n    Transform.call(this, null, params2);\n    this.modified(true);\n  }\n  inherits(Projection$1, Transform, {\n    transform(_, pulse2) {\n      let proj = this.value;\n      if (!proj || _.modified(\"type\")) {\n        this.value = proj = create$6(_.type);\n        projectionProperties.forEach((prop) => {\n          if (_[prop] != null) set$5(proj, prop, _[prop]);\n        });\n      } else {\n        projectionProperties.forEach((prop) => {\n          if (_.modified(prop)) set$5(proj, prop, _[prop]);\n        });\n      }\n      if (_.pointRadius != null) proj.path.pointRadius(_.pointRadius);\n      if (_.fit) fit(proj, _);\n      return pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n    }\n  });\n  function fit(proj, _) {\n    const data2 = collectGeoJSON(_.fit);\n    _.extent ? proj.fitExtent(_.extent, data2) : _.size ? proj.fitSize(_.size, data2) : 0;\n  }\n  function create$6(type2) {\n    const constructor = projection((type2 || \"mercator\").toLowerCase());\n    if (!constructor) error(\"Unrecognized projection type: \" + type2);\n    return constructor();\n  }\n  function set$5(proj, key2, value2) {\n    if (isFunction(proj[key2])) proj[key2](value2);\n  }\n  function collectGeoJSON(data2) {\n    data2 = array$5(data2);\n    return data2.length === 1 ? data2[0] : {\n      type: FeatureCollection,\n      features: data2.reduce((a2, f) => a2.concat(featurize(f)), [])\n    };\n  }\n  function featurize(f) {\n    return f.type === FeatureCollection ? f.features : array$5(f).filter((d) => d != null).map((d) => d.type === Feature ? d : {\n      type: Feature,\n      geometry: d\n    });\n  }\n  const geo = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    contour: Contour,\n    geojson: GeoJSON,\n    geopath: GeoPath,\n    geopoint: GeoPoint,\n    geoshape: GeoShape,\n    graticule: Graticule,\n    heatmap: Heatmap,\n    isocontour: Isocontour,\n    kde2d: KDE2D,\n    projection: Projection$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function forceCenter(x2, y2) {\n    var nodes, strength = 1;\n    if (x2 == null) x2 = 0;\n    if (y2 == null) y2 = 0;\n    function force2() {\n      var i, n = nodes.length, node, sx = 0, sy = 0;\n      for (i = 0; i < n; ++i) {\n        node = nodes[i], sx += node.x, sy += node.y;\n      }\n      for (sx = (sx / n - x2) * strength, sy = (sy / n - y2) * strength, i = 0; i < n; ++i) {\n        node = nodes[i], node.x -= sx, node.y -= sy;\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n    };\n    force2.x = function(_) {\n      return arguments.length ? (x2 = +_, force2) : x2;\n    };\n    force2.y = function(_) {\n      return arguments.length ? (y2 = +_, force2) : y2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = +_, force2) : strength;\n    };\n    return force2;\n  }\n  function tree_add(d) {\n    const x2 = +this._x.call(null, d), y2 = +this._y.call(null, d);\n    return add$1(this.cover(x2, y2), x2, y2, d);\n  }\n  function add$1(tree2, x2, y2, d) {\n    if (isNaN(x2) || isNaN(y2)) return tree2;\n    var parent, node = tree2._root, leaf = { data: d }, x02 = tree2._x0, y02 = tree2._y0, x12 = tree2._x1, y12 = tree2._y1, xm, ym, xp, yp, right, bottom, i, j;\n    if (!node) return tree2._root = leaf, tree2;\n    while (node.length) {\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n      if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree2;\n    }\n    xp = +tree2._x.call(null, node.data);\n    yp = +tree2._y.call(null, node.data);\n    if (x2 === xp && y2 === yp) return leaf.next = node, parent ? parent[i] = leaf : tree2._root = leaf, tree2;\n    do {\n      parent = parent ? parent[i] = new Array(4) : tree2._root = new Array(4);\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n    } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm));\n    return parent[j] = node, parent[i] = leaf, tree2;\n  }\n  function addAll(data2) {\n    var d, i, n = data2.length, x2, y2, xz = new Array(n), yz = new Array(n), x02 = Infinity, y02 = Infinity, x12 = -Infinity, y12 = -Infinity;\n    for (i = 0; i < n; ++i) {\n      if (isNaN(x2 = +this._x.call(null, d = data2[i])) || isNaN(y2 = +this._y.call(null, d))) continue;\n      xz[i] = x2;\n      yz[i] = y2;\n      if (x2 < x02) x02 = x2;\n      if (x2 > x12) x12 = x2;\n      if (y2 < y02) y02 = y2;\n      if (y2 > y12) y12 = y2;\n    }\n    if (x02 > x12 || y02 > y12) return this;\n    this.cover(x02, y02).cover(x12, y12);\n    for (i = 0; i < n; ++i) {\n      add$1(this, xz[i], yz[i], data2[i]);\n    }\n    return this;\n  }\n  function tree_cover(x2, y2) {\n    if (isNaN(x2 = +x2) || isNaN(y2 = +y2)) return this;\n    var x02 = this._x0, y02 = this._y0, x12 = this._x1, y12 = this._y1;\n    if (isNaN(x02)) {\n      x12 = (x02 = Math.floor(x2)) + 1;\n      y12 = (y02 = Math.floor(y2)) + 1;\n    } else {\n      var z = x12 - x02 || 1, node = this._root, parent, i;\n      while (x02 > x2 || x2 >= x12 || y02 > y2 || y2 >= y12) {\n        i = (y2 < y02) << 1 | x2 < x02;\n        parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n        switch (i) {\n          case 0:\n            x12 = x02 + z, y12 = y02 + z;\n            break;\n          case 1:\n            x02 = x12 - z, y12 = y02 + z;\n            break;\n          case 2:\n            x12 = x02 + z, y02 = y12 - z;\n            break;\n          case 3:\n            x02 = x12 - z, y02 = y12 - z;\n            break;\n        }\n      }\n      if (this._root && this._root.length) this._root = node;\n    }\n    this._x0 = x02;\n    this._y0 = y02;\n    this._x1 = x12;\n    this._y1 = y12;\n    return this;\n  }\n  function tree_data() {\n    var data2 = [];\n    this.visit(function(node) {\n      if (!node.length) do\n        data2.push(node.data);\n      while (node = node.next);\n    });\n    return data2;\n  }\n  function tree_extent(_) {\n    return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]];\n  }\n  function Quad$3(node, x02, y02, x12, y12) {\n    this.node = node;\n    this.x0 = x02;\n    this.y0 = y02;\n    this.x1 = x12;\n    this.y1 = y12;\n  }\n  function tree_find(x2, y2, radius2) {\n    var data2, x02 = this._x0, y02 = this._y0, x12, y12, x22, y22, x3 = this._x1, y3 = this._y1, quads = [], node = this._root, q, i;\n    if (node) quads.push(new Quad$3(node, x02, y02, x3, y3));\n    if (radius2 == null) radius2 = Infinity;\n    else {\n      x02 = x2 - radius2, y02 = y2 - radius2;\n      x3 = x2 + radius2, y3 = y2 + radius2;\n      radius2 *= radius2;\n    }\n    while (q = quads.pop()) {\n      if (!(node = q.node) || (x12 = q.x0) > x3 || (y12 = q.y0) > y3 || (x22 = q.x1) < x02 || (y22 = q.y1) < y02) continue;\n      if (node.length) {\n        var xm = (x12 + x22) / 2, ym = (y12 + y22) / 2;\n        quads.push(\n          new Quad$3(node[3], xm, ym, x22, y22),\n          new Quad$3(node[2], x12, ym, xm, y22),\n          new Quad$3(node[1], xm, y12, x22, ym),\n          new Quad$3(node[0], x12, y12, xm, ym)\n        );\n        if (i = (y2 >= ym) << 1 | x2 >= xm) {\n          q = quads[quads.length - 1];\n          quads[quads.length - 1] = quads[quads.length - 1 - i];\n          quads[quads.length - 1 - i] = q;\n        }\n      } else {\n        var dx = x2 - +this._x.call(null, node.data), dy = y2 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy;\n        if (d2 < radius2) {\n          var d = Math.sqrt(radius2 = d2);\n          x02 = x2 - d, y02 = y2 - d;\n          x3 = x2 + d, y3 = y2 + d;\n          data2 = node.data;\n        }\n      }\n    }\n    return data2;\n  }\n  function tree_remove(d) {\n    if (isNaN(x2 = +this._x.call(null, d)) || isNaN(y2 = +this._y.call(null, d))) return this;\n    var parent, node = this._root, retainer, previous, next, x02 = this._x0, y02 = this._y0, x12 = this._x1, y12 = this._y1, x2, y2, xm, ym, right, bottom, i, j;\n    if (!node) return this;\n    if (node.length) while (true) {\n      if (right = x2 >= (xm = (x02 + x12) / 2)) x02 = xm;\n      else x12 = xm;\n      if (bottom = y2 >= (ym = (y02 + y12) / 2)) y02 = ym;\n      else y12 = ym;\n      if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n      if (!node.length) break;\n      if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) retainer = parent, j = i;\n    }\n    while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n    if (next = node.next) delete node.next;\n    if (previous) return next ? previous.next = next : delete previous.next, this;\n    if (!parent) return this._root = next, this;\n    next ? parent[i] = next : delete parent[i];\n    if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) {\n      if (retainer) retainer[j] = node;\n      else this._root = node;\n    }\n    return this;\n  }\n  function removeAll(data2) {\n    for (var i = 0, n = data2.length; i < n; ++i) this.remove(data2[i]);\n    return this;\n  }\n  function tree_root() {\n    return this._root;\n  }\n  function tree_size() {\n    var size = 0;\n    this.visit(function(node) {\n      if (!node.length) do\n        ++size;\n      while (node = node.next);\n    });\n    return size;\n  }\n  function tree_visit(callback) {\n    var quads = [], q, node = this._root, child, x02, y02, x12, y12;\n    if (node) quads.push(new Quad$3(node, this._x0, this._y0, this._x1, this._y1));\n    while (q = quads.pop()) {\n      if (!callback(node = q.node, x02 = q.x0, y02 = q.y0, x12 = q.x1, y12 = q.y1) && node.length) {\n        var xm = (x02 + x12) / 2, ym = (y02 + y12) / 2;\n        if (child = node[3]) quads.push(new Quad$3(child, xm, ym, x12, y12));\n        if (child = node[2]) quads.push(new Quad$3(child, x02, ym, xm, y12));\n        if (child = node[1]) quads.push(new Quad$3(child, xm, y02, x12, ym));\n        if (child = node[0]) quads.push(new Quad$3(child, x02, y02, xm, ym));\n      }\n    }\n    return this;\n  }\n  function tree_visitAfter(callback) {\n    var quads = [], next = [], q;\n    if (this._root) quads.push(new Quad$3(this._root, this._x0, this._y0, this._x1, this._y1));\n    while (q = quads.pop()) {\n      var node = q.node;\n      if (node.length) {\n        var child, x02 = q.x0, y02 = q.y0, x12 = q.x1, y12 = q.y1, xm = (x02 + x12) / 2, ym = (y02 + y12) / 2;\n        if (child = node[0]) quads.push(new Quad$3(child, x02, y02, xm, ym));\n        if (child = node[1]) quads.push(new Quad$3(child, xm, y02, x12, ym));\n        if (child = node[2]) quads.push(new Quad$3(child, x02, ym, xm, y12));\n        if (child = node[3]) quads.push(new Quad$3(child, xm, ym, x12, y12));\n      }\n      next.push(q);\n    }\n    while (q = next.pop()) {\n      callback(q.node, q.x0, q.y0, q.x1, q.y1);\n    }\n    return this;\n  }\n  function defaultX(d) {\n    return d[0];\n  }\n  function tree_x(_) {\n    return arguments.length ? (this._x = _, this) : this._x;\n  }\n  function defaultY(d) {\n    return d[1];\n  }\n  function tree_y(_) {\n    return arguments.length ? (this._y = _, this) : this._y;\n  }\n  function quadtree(nodes, x2, y2) {\n    var tree2 = new Quadtree(x2 == null ? defaultX : x2, y2 == null ? defaultY : y2, NaN, NaN, NaN, NaN);\n    return nodes == null ? tree2 : tree2.addAll(nodes);\n  }\n  function Quadtree(x2, y2, x02, y02, x12, y12) {\n    this._x = x2;\n    this._y = y2;\n    this._x0 = x02;\n    this._y0 = y02;\n    this._x1 = x12;\n    this._y1 = y12;\n    this._root = void 0;\n  }\n  function leaf_copy(leaf) {\n    var copy2 = { data: leaf.data }, next = copy2;\n    while (leaf = leaf.next) next = next.next = { data: leaf.data };\n    return copy2;\n  }\n  var treeProto = quadtree.prototype = Quadtree.prototype;\n  treeProto.copy = function() {\n    var copy2 = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child;\n    if (!node) return copy2;\n    if (!node.length) return copy2._root = leaf_copy(node), copy2;\n    nodes = [{ source: node, target: copy2._root = new Array(4) }];\n    while (node = nodes.pop()) {\n      for (var i = 0; i < 4; ++i) {\n        if (child = node.source[i]) {\n          if (child.length) nodes.push({ source: child, target: node.target[i] = new Array(4) });\n          else node.target[i] = leaf_copy(child);\n        }\n      }\n    }\n    return copy2;\n  };\n  treeProto.add = tree_add;\n  treeProto.addAll = addAll;\n  treeProto.cover = tree_cover;\n  treeProto.data = tree_data;\n  treeProto.extent = tree_extent;\n  treeProto.find = tree_find;\n  treeProto.remove = tree_remove;\n  treeProto.removeAll = removeAll;\n  treeProto.root = tree_root;\n  treeProto.size = tree_size;\n  treeProto.visit = tree_visit;\n  treeProto.visitAfter = tree_visitAfter;\n  treeProto.x = tree_x;\n  treeProto.y = tree_y;\n  function constant$1(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  function jiggle(random2) {\n    return (random2() - 0.5) * 1e-6;\n  }\n  function x$1(d) {\n    return d.x + d.vx;\n  }\n  function y$1(d) {\n    return d.y + d.vy;\n  }\n  function forceCollide(radius2) {\n    var nodes, radii, random2, strength = 1, iterations2 = 1;\n    if (typeof radius2 !== \"function\") radius2 = constant$1(radius2 == null ? 1 : +radius2);\n    function force2() {\n      var i, n = nodes.length, tree2, node, xi, yi, ri, ri2;\n      for (var k = 0; k < iterations2; ++k) {\n        tree2 = quadtree(nodes, x$1, y$1).visitAfter(prepare2);\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          ri = radii[node.index], ri2 = ri * ri;\n          xi = node.x + node.vx;\n          yi = node.y + node.vy;\n          tree2.visit(apply2);\n        }\n      }\n      function apply2(quad2, x02, y02, x12, y12) {\n        var data2 = quad2.data, rj = quad2.r, r = ri + rj;\n        if (data2) {\n          if (data2.index > node.index) {\n            var x2 = xi - data2.x - data2.vx, y2 = yi - data2.y - data2.vy, l = x2 * x2 + y2 * y2;\n            if (l < r * r) {\n              if (x2 === 0) x2 = jiggle(random2), l += x2 * x2;\n              if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n              l = (r - (l = Math.sqrt(l))) / l * strength;\n              node.vx += (x2 *= l) * (r = (rj *= rj) / (ri2 + rj));\n              node.vy += (y2 *= l) * r;\n              data2.vx -= x2 * (r = 1 - r);\n              data2.vy -= y2 * r;\n            }\n          }\n          return;\n        }\n        return x02 > xi + r || x12 < xi - r || y02 > yi + r || y12 < yi - r;\n      }\n    }\n    function prepare2(quad2) {\n      if (quad2.data) return quad2.r = radii[quad2.data.index];\n      for (var i = quad2.r = 0; i < 4; ++i) {\n        if (quad2[i] && quad2[i].r > quad2.r) {\n          quad2.r = quad2[i].r;\n        }\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, node;\n      radii = new Array(n);\n      for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius2(node, i, nodes);\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.iterations = function(_) {\n      return arguments.length ? (iterations2 = +_, force2) : iterations2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = +_, force2) : strength;\n    };\n    force2.radius = function(_) {\n      return arguments.length ? (radius2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : radius2;\n    };\n    return force2;\n  }\n  function index$1(d) {\n    return d.index;\n  }\n  function find$1(nodeById, nodeId) {\n    var node = nodeById.get(nodeId);\n    if (!node) throw new Error(\"node not found: \" + nodeId);\n    return node;\n  }\n  function forceLink(links) {\n    var id2 = index$1, strength = defaultStrength, strengths, distance2 = constant$1(30), distances, nodes, count2, bias, random2, iterations2 = 1;\n    if (links == null) links = [];\n    function defaultStrength(link2) {\n      return 1 / Math.min(count2[link2.source.index], count2[link2.target.index]);\n    }\n    function force2(alpha) {\n      for (var k = 0, n = links.length; k < iterations2; ++k) {\n        for (var i = 0, link2, source2, target2, x2, y2, l, b2; i < n; ++i) {\n          link2 = links[i], source2 = link2.source, target2 = link2.target;\n          x2 = target2.x + target2.vx - source2.x - source2.vx || jiggle(random2);\n          y2 = target2.y + target2.vy - source2.y - source2.vy || jiggle(random2);\n          l = Math.sqrt(x2 * x2 + y2 * y2);\n          l = (l - distances[i]) / l * alpha * strengths[i];\n          x2 *= l, y2 *= l;\n          target2.vx -= x2 * (b2 = bias[i]);\n          target2.vy -= y2 * b2;\n          source2.vx += x2 * (b2 = 1 - b2);\n          source2.vy += y2 * b2;\n        }\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d, i2) => [id2(d, i2, nodes), d])), link2;\n      for (i = 0, count2 = new Array(n); i < m2; ++i) {\n        link2 = links[i], link2.index = i;\n        if (typeof link2.source !== \"object\") link2.source = find$1(nodeById, link2.source);\n        if (typeof link2.target !== \"object\") link2.target = find$1(nodeById, link2.target);\n        count2[link2.source.index] = (count2[link2.source.index] || 0) + 1;\n        count2[link2.target.index] = (count2[link2.target.index] || 0) + 1;\n      }\n      for (i = 0, bias = new Array(m2); i < m2; ++i) {\n        link2 = links[i], bias[i] = count2[link2.source.index] / (count2[link2.source.index] + count2[link2.target.index]);\n      }\n      strengths = new Array(m2), initializeStrength();\n      distances = new Array(m2), initializeDistance();\n    }\n    function initializeStrength() {\n      if (!nodes) return;\n      for (var i = 0, n = links.length; i < n; ++i) {\n        strengths[i] = +strength(links[i], i, links);\n      }\n    }\n    function initializeDistance() {\n      if (!nodes) return;\n      for (var i = 0, n = links.length; i < n; ++i) {\n        distances[i] = +distance2(links[i], i, links);\n      }\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.links = function(_) {\n      return arguments.length ? (links = _, initialize2(), force2) : links;\n    };\n    force2.id = function(_) {\n      return arguments.length ? (id2 = _, force2) : id2;\n    };\n    force2.iterations = function(_) {\n      return arguments.length ? (iterations2 = +_, force2) : iterations2;\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initializeStrength(), force2) : strength;\n    };\n    force2.distance = function(_) {\n      return arguments.length ? (distance2 = typeof _ === \"function\" ? _ : constant$1(+_), initializeDistance(), force2) : distance2;\n    };\n    return force2;\n  }\n  var noop = { value: () => {\n  } };\n  function dispatch() {\n    for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n      if (!(t = arguments[i] + \"\") || t in _ || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n      _[t] = [];\n    }\n    return new Dispatch(_);\n  }\n  function Dispatch(_) {\n    this._ = _;\n  }\n  function parseTypenames(typenames, types) {\n    return typenames.trim().split(/^|\\s+/).map(function(t) {\n      var name = \"\", i = t.indexOf(\".\");\n      if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n      if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n      return { type: t, name };\n    });\n  }\n  Dispatch.prototype = dispatch.prototype = {\n    constructor: Dispatch,\n    on: function(typename, callback) {\n      var _ = this._, T = parseTypenames(typename + \"\", _), t, i = -1, n = T.length;\n      if (arguments.length < 2) {\n        while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n        return;\n      }\n      if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n      while (++i < n) {\n        if (t = (typename = T[i]).type) _[t] = set$4(_[t], typename.name, callback);\n        else if (callback == null) for (t in _) _[t] = set$4(_[t], typename.name, null);\n      }\n      return this;\n    },\n    copy: function() {\n      var copy2 = {}, _ = this._;\n      for (var t in _) copy2[t] = _[t].slice();\n      return new Dispatch(copy2);\n    },\n    call: function(type2, that) {\n      if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n      if (!this._.hasOwnProperty(type2)) throw new Error(\"unknown type: \" + type2);\n      for (t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n    },\n    apply: function(type2, that, args) {\n      if (!this._.hasOwnProperty(type2)) throw new Error(\"unknown type: \" + type2);\n      for (var t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n    }\n  };\n  function get(type2, name) {\n    for (var i = 0, n = type2.length, c2; i < n; ++i) {\n      if ((c2 = type2[i]).name === name) {\n        return c2.value;\n      }\n    }\n  }\n  function set$4(type2, name, callback) {\n    for (var i = 0, n = type2.length; i < n; ++i) {\n      if (type2[i].name === name) {\n        type2[i] = noop, type2 = type2.slice(0, i).concat(type2.slice(i + 1));\n        break;\n      }\n    }\n    if (callback != null) type2.push({ name, value: callback });\n    return type2;\n  }\n  var frame = 0, timeout = 0, interval$1 = 0, pokeDelay = 1e3, taskHead, taskTail, clockLast = 0, clockNow = 0, clockSkew = 0, clock = typeof performance === \"object\" && performance.now ? performance : Date, setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) {\n    setTimeout(f, 17);\n  };\n  function now() {\n    return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n  }\n  function clearNow() {\n    clockNow = 0;\n  }\n  function Timer$1() {\n    this._call = this._time = this._next = null;\n  }\n  Timer$1.prototype = timer$1.prototype = {\n    constructor: Timer$1,\n    restart: function(callback, delay, time2) {\n      if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n      time2 = (time2 == null ? now() : +time2) + (delay == null ? 0 : +delay);\n      if (!this._next && taskTail !== this) {\n        if (taskTail) taskTail._next = this;\n        else taskHead = this;\n        taskTail = this;\n      }\n      this._call = callback;\n      this._time = time2;\n      sleep();\n    },\n    stop: function() {\n      if (this._call) {\n        this._call = null;\n        this._time = Infinity;\n        sleep();\n      }\n    }\n  };\n  function timer$1(callback, delay, time2) {\n    var t = new Timer$1();\n    t.restart(callback, delay, time2);\n    return t;\n  }\n  function timerFlush() {\n    now();\n    ++frame;\n    var t = taskHead, e;\n    while (t) {\n      if ((e = clockNow - t._time) >= 0) t._call.call(void 0, e);\n      t = t._next;\n    }\n    --frame;\n  }\n  function wake() {\n    clockNow = (clockLast = clock.now()) + clockSkew;\n    frame = timeout = 0;\n    try {\n      timerFlush();\n    } finally {\n      frame = 0;\n      nap();\n      clockNow = 0;\n    }\n  }\n  function poke() {\n    var now2 = clock.now(), delay = now2 - clockLast;\n    if (delay > pokeDelay) clockSkew -= delay, clockLast = now2;\n  }\n  function nap() {\n    var t02, t12 = taskHead, t22, time2 = Infinity;\n    while (t12) {\n      if (t12._call) {\n        if (time2 > t12._time) time2 = t12._time;\n        t02 = t12, t12 = t12._next;\n      } else {\n        t22 = t12._next, t12._next = null;\n        t12 = t02 ? t02._next = t22 : taskHead = t22;\n      }\n    }\n    taskTail = t02;\n    sleep(time2);\n  }\n  function sleep(time2) {\n    if (frame) return;\n    if (timeout) timeout = clearTimeout(timeout);\n    var delay = time2 - clockNow;\n    if (delay > 24) {\n      if (time2 < Infinity) timeout = setTimeout(wake, time2 - clock.now() - clockSkew);\n      if (interval$1) interval$1 = clearInterval(interval$1);\n    } else {\n      if (!interval$1) clockLast = clock.now(), interval$1 = setInterval(poke, pokeDelay);\n      frame = 1, setFrame(wake);\n    }\n  }\n  function interval(callback, delay, time2) {\n    var t = new Timer$1(), total = delay;\n    if (delay == null) return t.restart(callback, delay, time2), t;\n    t._restart = t.restart;\n    t.restart = function(callback2, delay2, time3) {\n      delay2 = +delay2, time3 = time3 == null ? now() : +time3;\n      t._restart(function tick(elapsed) {\n        elapsed += total;\n        t._restart(tick, total += delay2, time3);\n        callback2(elapsed);\n      }, delay2, time3);\n    };\n    t.restart(callback, delay, time2);\n    return t;\n  }\n  const a$1 = 1664525;\n  const c$1 = 1013904223;\n  const m$1 = 4294967296;\n  function lcg$1() {\n    let s = 1;\n    return () => (s = (a$1 * s + c$1) % m$1) / m$1;\n  }\n  function x(d) {\n    return d.x;\n  }\n  function y(d) {\n    return d.y;\n  }\n  var initialRadius = 10, initialAngle = Math.PI * (3 - Math.sqrt(5));\n  function forceSimulation(nodes) {\n    var simulation2, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer$1(step), event2 = dispatch(\"tick\", \"end\"), random2 = lcg$1();\n    if (nodes == null) nodes = [];\n    function step() {\n      tick();\n      event2.call(\"tick\", simulation2);\n      if (alpha < alphaMin) {\n        stepper.stop();\n        event2.call(\"end\", simulation2);\n      }\n    }\n    function tick(iterations2) {\n      var i, n = nodes.length, node;\n      if (iterations2 === void 0) iterations2 = 1;\n      for (var k = 0; k < iterations2; ++k) {\n        alpha += (alphaTarget - alpha) * alphaDecay;\n        forces.forEach(function(force2) {\n          force2(alpha);\n        });\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          if (node.fx == null) node.x += node.vx *= velocityDecay;\n          else node.x = node.fx, node.vx = 0;\n          if (node.fy == null) node.y += node.vy *= velocityDecay;\n          else node.y = node.fy, node.vy = 0;\n        }\n      }\n      return simulation2;\n    }\n    function initializeNodes() {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.index = i;\n        if (node.fx != null) node.x = node.fx;\n        if (node.fy != null) node.y = node.fy;\n        if (isNaN(node.x) || isNaN(node.y)) {\n          var radius2 = initialRadius * Math.sqrt(0.5 + i), angle2 = i * initialAngle;\n          node.x = radius2 * Math.cos(angle2);\n          node.y = radius2 * Math.sin(angle2);\n        }\n        if (isNaN(node.vx) || isNaN(node.vy)) {\n          node.vx = node.vy = 0;\n        }\n      }\n    }\n    function initializeForce(force2) {\n      if (force2.initialize) force2.initialize(nodes, random2);\n      return force2;\n    }\n    initializeNodes();\n    return simulation2 = {\n      tick,\n      restart: function() {\n        return stepper.restart(step), simulation2;\n      },\n      stop: function() {\n        return stepper.stop(), simulation2;\n      },\n      nodes: function(_) {\n        return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation2) : nodes;\n      },\n      alpha: function(_) {\n        return arguments.length ? (alpha = +_, simulation2) : alpha;\n      },\n      alphaMin: function(_) {\n        return arguments.length ? (alphaMin = +_, simulation2) : alphaMin;\n      },\n      alphaDecay: function(_) {\n        return arguments.length ? (alphaDecay = +_, simulation2) : +alphaDecay;\n      },\n      alphaTarget: function(_) {\n        return arguments.length ? (alphaTarget = +_, simulation2) : alphaTarget;\n      },\n      velocityDecay: function(_) {\n        return arguments.length ? (velocityDecay = 1 - _, simulation2) : 1 - velocityDecay;\n      },\n      randomSource: function(_) {\n        return arguments.length ? (random2 = _, forces.forEach(initializeForce), simulation2) : random2;\n      },\n      force: function(name, _) {\n        return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation2) : forces.get(name);\n      },\n      find: function(x2, y2, radius2) {\n        var i = 0, n = nodes.length, dx, dy, d2, node, closest;\n        if (radius2 == null) radius2 = Infinity;\n        else radius2 *= radius2;\n        for (i = 0; i < n; ++i) {\n          node = nodes[i];\n          dx = x2 - node.x;\n          dy = y2 - node.y;\n          d2 = dx * dx + dy * dy;\n          if (d2 < radius2) closest = node, radius2 = d2;\n        }\n        return closest;\n      },\n      on: function(name, _) {\n        return arguments.length > 1 ? (event2.on(name, _), simulation2) : event2.on(name);\n      }\n    };\n  }\n  function forceManyBody() {\n    var nodes, node, random2, alpha, strength = constant$1(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81;\n    function force2(_) {\n      var i, n = nodes.length, tree2 = quadtree(nodes, x, y).visitAfter(accumulate);\n      for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree2.visit(apply2);\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length, node2;\n      strengths = new Array(n);\n      for (i = 0; i < n; ++i) node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes);\n    }\n    function accumulate(quad2) {\n      var strength2 = 0, q, c2, weight = 0, x2, y2, i;\n      if (quad2.length) {\n        for (x2 = y2 = i = 0; i < 4; ++i) {\n          if ((q = quad2[i]) && (c2 = Math.abs(q.value))) {\n            strength2 += q.value, weight += c2, x2 += c2 * q.x, y2 += c2 * q.y;\n          }\n        }\n        quad2.x = x2 / weight;\n        quad2.y = y2 / weight;\n      } else {\n        q = quad2;\n        q.x = q.data.x;\n        q.y = q.data.y;\n        do\n          strength2 += strengths[q.data.index];\n        while (q = q.next);\n      }\n      quad2.value = strength2;\n    }\n    function apply2(quad2, x12, _, x2) {\n      if (!quad2.value) return true;\n      var x3 = quad2.x - node.x, y2 = quad2.y - node.y, w2 = x2 - x12, l = x3 * x3 + y2 * y2;\n      if (w2 * w2 / theta2 < l) {\n        if (l < distanceMax2) {\n          if (x3 === 0) x3 = jiggle(random2), l += x3 * x3;\n          if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n          if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n          node.vx += x3 * quad2.value * alpha / l;\n          node.vy += y2 * quad2.value * alpha / l;\n        }\n        return true;\n      } else if (quad2.length || l >= distanceMax2) return;\n      if (quad2.data !== node || quad2.next) {\n        if (x3 === 0) x3 = jiggle(random2), l += x3 * x3;\n        if (y2 === 0) y2 = jiggle(random2), l += y2 * y2;\n        if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n      }\n      do\n        if (quad2.data !== node) {\n          w2 = strengths[quad2.data.index] * alpha / l;\n          node.vx += x3 * w2;\n          node.vy += y2 * w2;\n        }\n      while (quad2 = quad2.next);\n    }\n    force2.initialize = function(_nodes, _random) {\n      nodes = _nodes;\n      random2 = _random;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.distanceMin = function(_) {\n      return arguments.length ? (distanceMin2 = _ * _, force2) : Math.sqrt(distanceMin2);\n    };\n    force2.distanceMax = function(_) {\n      return arguments.length ? (distanceMax2 = _ * _, force2) : Math.sqrt(distanceMax2);\n    };\n    force2.theta = function(_) {\n      return arguments.length ? (theta2 = _ * _, force2) : Math.sqrt(theta2);\n    };\n    return force2;\n  }\n  function forceX(x2) {\n    var strength = constant$1(0.1), nodes, strengths, xz;\n    if (typeof x2 !== \"function\") x2 = constant$1(x2 == null ? 0 : +x2);\n    function force2(alpha) {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length;\n      strengths = new Array(n);\n      xz = new Array(n);\n      for (i = 0; i < n; ++i) {\n        strengths[i] = isNaN(xz[i] = +x2(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.x = function(_) {\n      return arguments.length ? (x2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : x2;\n    };\n    return force2;\n  }\n  function forceY(y2) {\n    var strength = constant$1(0.1), nodes, strengths, yz;\n    if (typeof y2 !== \"function\") y2 = constant$1(y2 == null ? 0 : +y2);\n    function force2(alpha) {\n      for (var i = 0, n = nodes.length, node; i < n; ++i) {\n        node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;\n      }\n    }\n    function initialize2() {\n      if (!nodes) return;\n      var i, n = nodes.length;\n      strengths = new Array(n);\n      yz = new Array(n);\n      for (i = 0; i < n; ++i) {\n        strengths[i] = isNaN(yz[i] = +y2(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);\n      }\n    }\n    force2.initialize = function(_) {\n      nodes = _;\n      initialize2();\n    };\n    force2.strength = function(_) {\n      return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : strength;\n    };\n    force2.y = function(_) {\n      return arguments.length ? (y2 = typeof _ === \"function\" ? _ : constant$1(+_), initialize2(), force2) : y2;\n    };\n    return force2;\n  }\n  const ForceMap = {\n    center: forceCenter,\n    collide: forceCollide,\n    nbody: forceManyBody,\n    link: forceLink,\n    x: forceX,\n    y: forceY\n  };\n  const Forces = \"forces\", ForceParams = [\"alpha\", \"alphaMin\", \"alphaTarget\", \"velocityDecay\", \"forces\"], ForceConfig = [\"static\", \"iterations\"], ForceOutput = [\"x\", \"y\", \"vx\", \"vy\"];\n  function Force(params2) {\n    Transform.call(this, null, params2);\n  }\n  Force.Definition = {\n    \"type\": \"Force\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"static\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"restart\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"iterations\",\n      \"type\": \"number\",\n      \"default\": 300\n    }, {\n      \"name\": \"alpha\",\n      \"type\": \"number\",\n      \"default\": 1\n    }, {\n      \"name\": \"alphaMin\",\n      \"type\": \"number\",\n      \"default\": 1e-3\n    }, {\n      \"name\": \"alphaTarget\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"velocityDecay\",\n      \"type\": \"number\",\n      \"default\": 0.4\n    }, {\n      \"name\": \"forces\",\n      \"type\": \"param\",\n      \"array\": true,\n      \"params\": [{\n        \"key\": {\n          \"force\": \"center\"\n        },\n        \"params\": [{\n          \"name\": \"x\",\n          \"type\": \"number\",\n          \"default\": 0\n        }, {\n          \"name\": \"y\",\n          \"type\": \"number\",\n          \"default\": 0\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"collide\"\n        },\n        \"params\": [{\n          \"name\": \"radius\",\n          \"type\": \"number\",\n          \"expr\": true\n        }, {\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.7\n        }, {\n          \"name\": \"iterations\",\n          \"type\": \"number\",\n          \"default\": 1\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"nbody\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": -30,\n          \"expr\": true\n        }, {\n          \"name\": \"theta\",\n          \"type\": \"number\",\n          \"default\": 0.9\n        }, {\n          \"name\": \"distanceMin\",\n          \"type\": \"number\",\n          \"default\": 1\n        }, {\n          \"name\": \"distanceMax\",\n          \"type\": \"number\"\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"link\"\n        },\n        \"params\": [{\n          \"name\": \"links\",\n          \"type\": \"data\"\n        }, {\n          \"name\": \"id\",\n          \"type\": \"field\"\n        }, {\n          \"name\": \"distance\",\n          \"type\": \"number\",\n          \"default\": 30,\n          \"expr\": true\n        }, {\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"expr\": true\n        }, {\n          \"name\": \"iterations\",\n          \"type\": \"number\",\n          \"default\": 1\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"x\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.1\n        }, {\n          \"name\": \"x\",\n          \"type\": \"field\"\n        }]\n      }, {\n        \"key\": {\n          \"force\": \"y\"\n        },\n        \"params\": [{\n          \"name\": \"strength\",\n          \"type\": \"number\",\n          \"default\": 0.1\n        }, {\n          \"name\": \"y\",\n          \"type\": \"field\"\n        }]\n      }]\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"modify\": false,\n      \"default\": ForceOutput\n    }]\n  };\n  inherits(Force, Transform, {\n    transform(_, pulse2) {\n      var sim = this.value, change2 = pulse2.changed(pulse2.ADD_REM), params2 = _.modified(ForceParams), iters = _.iterations || 300;\n      if (!sim) {\n        this.value = sim = simulation(pulse2.source, _);\n        sim.on(\"tick\", rerun(pulse2.dataflow, this));\n        if (!_.static) {\n          change2 = true;\n          sim.tick();\n        }\n        pulse2.modifies(\"index\");\n      } else {\n        if (change2) {\n          pulse2.modifies(\"index\");\n          sim.nodes(pulse2.source);\n        }\n        if (params2 || pulse2.changed(pulse2.MOD)) {\n          setup(sim, _, 0, pulse2);\n        }\n      }\n      if (params2 || change2 || _.modified(ForceConfig) || pulse2.changed() && _.restart) {\n        sim.alpha(Math.max(sim.alpha(), _.alpha || 1)).alphaDecay(1 - Math.pow(sim.alphaMin(), 1 / iters));\n        if (_.static) {\n          for (sim.stop(); --iters >= 0; ) sim.tick();\n        } else {\n          if (sim.stopped()) sim.restart();\n          if (!change2) return pulse2.StopPropagation;\n        }\n      }\n      return this.finish(_, pulse2);\n    },\n    finish(_, pulse2) {\n      const dataflow = pulse2.dataflow;\n      for (let args = this._argops, j = 0, m2 = args.length, arg; j < m2; ++j) {\n        arg = args[j];\n        if (arg.name !== Forces || arg.op._argval.force !== \"link\") {\n          continue;\n        }\n        for (var ops2 = arg.op._argops, i = 0, n = ops2.length, op; i < n; ++i) {\n          if (ops2[i].name === \"links\" && (op = ops2[i].op.source)) {\n            dataflow.pulse(op, dataflow.changeset().reflow());\n            break;\n          }\n        }\n      }\n      return pulse2.reflow(_.modified()).modifies(ForceOutput);\n    }\n  });\n  function rerun(df, op) {\n    return () => df.touch(op).run();\n  }\n  function simulation(nodes, _) {\n    const sim = forceSimulation(nodes), stop2 = sim.stop, restart = sim.restart;\n    let stopped = false;\n    sim.stopped = () => stopped;\n    sim.restart = () => (stopped = false, restart());\n    sim.stop = () => (stopped = true, stop2());\n    return setup(sim, _, true).on(\"end\", () => stopped = true);\n  }\n  function setup(sim, _, init2, pulse2) {\n    var f = array$5(_.forces), i, n, p, name;\n    for (i = 0, n = ForceParams.length; i < n; ++i) {\n      p = ForceParams[i];\n      if (p !== Forces && _.modified(p)) sim[p](_[p]);\n    }\n    for (i = 0, n = f.length; i < n; ++i) {\n      name = Forces + i;\n      p = init2 || _.modified(Forces, i) ? getForce(f[i]) : pulse2 && modified(f[i], pulse2) ? sim.force(name) : null;\n      if (p) sim.force(name, p);\n    }\n    for (n = sim.numForces || 0; i < n; ++i) {\n      sim.force(Forces + i, null);\n    }\n    sim.numForces = f.length;\n    return sim;\n  }\n  function modified(f, pulse2) {\n    var k, v;\n    for (k in f) {\n      if (isFunction(v = f[k]) && pulse2.modified(accessorFields(v))) return 1;\n    }\n    return 0;\n  }\n  function getForce(_) {\n    var f, p;\n    if (!has$1(ForceMap, _.force)) {\n      error(\"Unrecognized force: \" + _.force);\n    }\n    f = ForceMap[_.force]();\n    for (p in _) {\n      if (isFunction(f[p])) setForceParam(f[p], _[p], _);\n    }\n    return f;\n  }\n  function setForceParam(f, v, _) {\n    f(isFunction(v) ? (d) => v(d, _) : v);\n  }\n  const force = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    force: Force\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function defaultSeparation$2(a2, b2) {\n    return a2.parent === b2.parent ? 1 : 2;\n  }\n  function meanX(children2) {\n    return children2.reduce(meanXReduce, 0) / children2.length;\n  }\n  function meanXReduce(x2, c2) {\n    return x2 + c2.x;\n  }\n  function maxY(children2) {\n    return 1 + children2.reduce(maxYReduce, 0);\n  }\n  function maxYReduce(y2, c2) {\n    return Math.max(y2, c2.y);\n  }\n  function leafLeft(node) {\n    var children2;\n    while (children2 = node.children) node = children2[0];\n    return node;\n  }\n  function leafRight(node) {\n    var children2;\n    while (children2 = node.children) node = children2[children2.length - 1];\n    return node;\n  }\n  function cluster() {\n    var separation = defaultSeparation$2, dx = 1, dy = 1, nodeSize = false;\n    function cluster2(root) {\n      var previousNode, x2 = 0;\n      root.eachAfter(function(node) {\n        var children2 = node.children;\n        if (children2) {\n          node.x = meanX(children2);\n          node.y = maxY(children2);\n        } else {\n          node.x = previousNode ? x2 += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = leafLeft(root), right = leafRight(root), x02 = left.x - separation(left, right) / 2, x12 = right.x + separation(right, left) / 2;\n      return root.eachAfter(nodeSize ? function(node) {\n        node.x = (node.x - root.x) * dx;\n        node.y = (root.y - node.y) * dy;\n      } : function(node) {\n        node.x = (node.x - x02) / (x12 - x02) * dx;\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;\n      });\n    }\n    cluster2.separation = function(x2) {\n      return arguments.length ? (separation = x2, cluster2) : separation;\n    };\n    cluster2.size = function(x2) {\n      return arguments.length ? (nodeSize = false, dx = +x2[0], dy = +x2[1], cluster2) : nodeSize ? null : [dx, dy];\n    };\n    cluster2.nodeSize = function(x2) {\n      return arguments.length ? (nodeSize = true, dx = +x2[0], dy = +x2[1], cluster2) : nodeSize ? [dx, dy] : null;\n    };\n    return cluster2;\n  }\n  function count(node) {\n    var sum2 = 0, children2 = node.children, i = children2 && children2.length;\n    if (!i) sum2 = 1;\n    else while (--i >= 0) sum2 += children2[i].value;\n    node.value = sum2;\n  }\n  function node_count() {\n    return this.eachAfter(count);\n  }\n  function node_each(callback, that) {\n    let index2 = -1;\n    for (const node of this) {\n      callback.call(that, node, ++index2, this);\n    }\n    return this;\n  }\n  function node_eachBefore(callback, that) {\n    var node = this, nodes = [node], children2, i, index2 = -1;\n    while (node = nodes.pop()) {\n      callback.call(that, node, ++index2, this);\n      if (children2 = node.children) {\n        for (i = children2.length - 1; i >= 0; --i) {\n          nodes.push(children2[i]);\n        }\n      }\n    }\n    return this;\n  }\n  function node_eachAfter(callback, that) {\n    var node = this, nodes = [node], next = [], children2, i, n, index2 = -1;\n    while (node = nodes.pop()) {\n      next.push(node);\n      if (children2 = node.children) {\n        for (i = 0, n = children2.length; i < n; ++i) {\n          nodes.push(children2[i]);\n        }\n      }\n    }\n    while (node = next.pop()) {\n      callback.call(that, node, ++index2, this);\n    }\n    return this;\n  }\n  function node_find(callback, that) {\n    let index2 = -1;\n    for (const node of this) {\n      if (callback.call(that, node, ++index2, this)) {\n        return node;\n      }\n    }\n  }\n  function node_sum(value2) {\n    return this.eachAfter(function(node) {\n      var sum2 = +value2(node.data) || 0, children2 = node.children, i = children2 && children2.length;\n      while (--i >= 0) sum2 += children2[i].value;\n      node.value = sum2;\n    });\n  }\n  function node_sort(compare2) {\n    return this.eachBefore(function(node) {\n      if (node.children) {\n        node.children.sort(compare2);\n      }\n    });\n  }\n  function node_path(end) {\n    var start = this, ancestor = leastCommonAncestor(start, end), nodes = [start];\n    while (start !== ancestor) {\n      start = start.parent;\n      nodes.push(start);\n    }\n    var k = nodes.length;\n    while (end !== ancestor) {\n      nodes.splice(k, 0, end);\n      end = end.parent;\n    }\n    return nodes;\n  }\n  function leastCommonAncestor(a2, b2) {\n    if (a2 === b2) return a2;\n    var aNodes = a2.ancestors(), bNodes = b2.ancestors(), c2 = null;\n    a2 = aNodes.pop();\n    b2 = bNodes.pop();\n    while (a2 === b2) {\n      c2 = a2;\n      a2 = aNodes.pop();\n      b2 = bNodes.pop();\n    }\n    return c2;\n  }\n  function node_ancestors() {\n    var node = this, nodes = [node];\n    while (node = node.parent) {\n      nodes.push(node);\n    }\n    return nodes;\n  }\n  function node_descendants() {\n    return Array.from(this);\n  }\n  function node_leaves() {\n    var leaves = [];\n    this.eachBefore(function(node) {\n      if (!node.children) {\n        leaves.push(node);\n      }\n    });\n    return leaves;\n  }\n  function node_links() {\n    var root = this, links = [];\n    root.each(function(node) {\n      if (node !== root) {\n        links.push({ source: node.parent, target: node });\n      }\n    });\n    return links;\n  }\n  function* node_iterator() {\n    var node = this, current, next = [node], children2, i, n;\n    do {\n      current = next.reverse(), next = [];\n      while (node = current.pop()) {\n        yield node;\n        if (children2 = node.children) {\n          for (i = 0, n = children2.length; i < n; ++i) {\n            next.push(children2[i]);\n          }\n        }\n      }\n    } while (next.length);\n  }\n  function hierarchy(data2, children2) {\n    if (data2 instanceof Map) {\n      data2 = [void 0, data2];\n      if (children2 === void 0) children2 = mapChildren;\n    } else if (children2 === void 0) {\n      children2 = objectChildren;\n    }\n    var root = new Node$2(data2), node, nodes = [root], child, childs, i, n;\n    while (node = nodes.pop()) {\n      if ((childs = children2(node.data)) && (n = (childs = Array.from(childs)).length)) {\n        node.children = childs;\n        for (i = n - 1; i >= 0; --i) {\n          nodes.push(child = childs[i] = new Node$2(childs[i]));\n          child.parent = node;\n          child.depth = node.depth + 1;\n        }\n      }\n    }\n    return root.eachBefore(computeHeight);\n  }\n  function node_copy() {\n    return hierarchy(this).eachBefore(copyData);\n  }\n  function objectChildren(d) {\n    return d.children;\n  }\n  function mapChildren(d) {\n    return Array.isArray(d) ? d[1] : null;\n  }\n  function copyData(node) {\n    if (node.data.value !== void 0) node.value = node.data.value;\n    node.data = node.data.data;\n  }\n  function computeHeight(node) {\n    var height2 = 0;\n    do\n      node.height = height2;\n    while ((node = node.parent) && node.height < ++height2);\n  }\n  function Node$2(data2) {\n    this.data = data2;\n    this.depth = this.height = 0;\n    this.parent = null;\n  }\n  Node$2.prototype = hierarchy.prototype = {\n    constructor: Node$2,\n    count: node_count,\n    each: node_each,\n    eachAfter: node_eachAfter,\n    eachBefore: node_eachBefore,\n    find: node_find,\n    sum: node_sum,\n    sort: node_sort,\n    path: node_path,\n    ancestors: node_ancestors,\n    descendants: node_descendants,\n    leaves: node_leaves,\n    links: node_links,\n    copy: node_copy,\n    [Symbol.iterator]: node_iterator\n  };\n  function optional(f) {\n    return f == null ? null : required(f);\n  }\n  function required(f) {\n    if (typeof f !== \"function\") throw new Error();\n    return f;\n  }\n  function constantZero() {\n    return 0;\n  }\n  function constant(x2) {\n    return function() {\n      return x2;\n    };\n  }\n  const a = 1664525;\n  const c = 1013904223;\n  const m = 4294967296;\n  function lcg() {\n    let s = 1;\n    return () => (s = (a * s + c) % m) / m;\n  }\n  function array$2(x2) {\n    return typeof x2 === \"object\" && \"length\" in x2 ? x2 : Array.from(x2);\n  }\n  function shuffle(array2, random2) {\n    let m2 = array2.length, t, i;\n    while (m2) {\n      i = random2() * m2-- | 0;\n      t = array2[m2];\n      array2[m2] = array2[i];\n      array2[i] = t;\n    }\n    return array2;\n  }\n  function packEncloseRandom(circles, random2) {\n    var i = 0, n = (circles = shuffle(Array.from(circles), random2)).length, B2 = [], p, e;\n    while (i < n) {\n      p = circles[i];\n      if (e && enclosesWeak(e, p)) ++i;\n      else e = encloseBasis(B2 = extendBasis(B2, p)), i = 0;\n    }\n    return e;\n  }\n  function extendBasis(B2, p) {\n    var i, j;\n    if (enclosesWeakAll(p, B2)) return [p];\n    for (i = 0; i < B2.length; ++i) {\n      if (enclosesNot(p, B2[i]) && enclosesWeakAll(encloseBasis2(B2[i], p), B2)) {\n        return [B2[i], p];\n      }\n    }\n    for (i = 0; i < B2.length - 1; ++i) {\n      for (j = i + 1; j < B2.length; ++j) {\n        if (enclosesNot(encloseBasis2(B2[i], B2[j]), p) && enclosesNot(encloseBasis2(B2[i], p), B2[j]) && enclosesNot(encloseBasis2(B2[j], p), B2[i]) && enclosesWeakAll(encloseBasis3(B2[i], B2[j], p), B2)) {\n          return [B2[i], B2[j], p];\n        }\n      }\n    }\n    throw new Error();\n  }\n  function enclosesNot(a2, b2) {\n    var dr = a2.r - b2.r, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr < 0 || dr * dr < dx * dx + dy * dy;\n  }\n  function enclosesWeak(a2, b2) {\n    var dr = a2.r - b2.r + Math.max(a2.r, b2.r, 1) * 1e-9, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n  }\n  function enclosesWeakAll(a2, B2) {\n    for (var i = 0; i < B2.length; ++i) {\n      if (!enclosesWeak(a2, B2[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  function encloseBasis(B2) {\n    switch (B2.length) {\n      case 1:\n        return encloseBasis1(B2[0]);\n      case 2:\n        return encloseBasis2(B2[0], B2[1]);\n      case 3:\n        return encloseBasis3(B2[0], B2[1], B2[2]);\n    }\n  }\n  function encloseBasis1(a2) {\n    return {\n      x: a2.x,\n      y: a2.y,\n      r: a2.r\n    };\n  }\n  function encloseBasis2(a2, b2) {\n    var x12 = a2.x, y12 = a2.y, r1 = a2.r, x2 = b2.x, y2 = b2.y, r2 = b2.r, x21 = x2 - x12, y21 = y2 - y12, r21 = r2 - r1, l = Math.sqrt(x21 * x21 + y21 * y21);\n    return {\n      x: (x12 + x2 + x21 / l * r21) / 2,\n      y: (y12 + y2 + y21 / l * r21) / 2,\n      r: (l + r1 + r2) / 2\n    };\n  }\n  function encloseBasis3(a2, b2, c2) {\n    var x12 = a2.x, y12 = a2.y, r1 = a2.r, x2 = b2.x, y2 = b2.y, r2 = b2.r, x3 = c2.x, y3 = c2.y, r3 = c2.r, a22 = x12 - x2, a3 = x12 - x3, b22 = y12 - y2, b3 = y12 - y3, c22 = r2 - r1, c3 = r3 - r1, d1 = x12 * x12 + y12 * y12 - r1 * r1, d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, ab = a3 * b22 - a22 * b3, xa = (b22 * d3 - b3 * d2) / (ab * 2) - x12, xb = (b3 * c22 - b22 * c3) / ab, ya = (a3 * d2 - a22 * d3) / (ab * 2) - y12, yb = (a22 * c3 - a3 * c22) / ab, A5 = xb * xb + yb * yb - 1, B2 = 2 * (r1 + xa * xb + ya * yb), C3 = xa * xa + ya * ya - r1 * r1, r = -(Math.abs(A5) > 1e-6 ? (B2 + Math.sqrt(B2 * B2 - 4 * A5 * C3)) / (2 * A5) : C3 / B2);\n    return {\n      x: x12 + xa + xb * r,\n      y: y12 + ya + yb * r,\n      r\n    };\n  }\n  function place(b2, a2, c2) {\n    var dx = b2.x - a2.x, x2, a22, dy = b2.y - a2.y, y2, b22, d2 = dx * dx + dy * dy;\n    if (d2) {\n      a22 = a2.r + c2.r, a22 *= a22;\n      b22 = b2.r + c2.r, b22 *= b22;\n      if (a22 > b22) {\n        x2 = (d2 + b22 - a22) / (2 * d2);\n        y2 = Math.sqrt(Math.max(0, b22 / d2 - x2 * x2));\n        c2.x = b2.x - x2 * dx - y2 * dy;\n        c2.y = b2.y - x2 * dy + y2 * dx;\n      } else {\n        x2 = (d2 + a22 - b22) / (2 * d2);\n        y2 = Math.sqrt(Math.max(0, a22 / d2 - x2 * x2));\n        c2.x = a2.x + x2 * dx - y2 * dy;\n        c2.y = a2.y + x2 * dy + y2 * dx;\n      }\n    } else {\n      c2.x = a2.x + c2.r;\n      c2.y = a2.y;\n    }\n  }\n  function intersects(a2, b2) {\n    var dr = a2.r + b2.r - 1e-6, dx = b2.x - a2.x, dy = b2.y - a2.y;\n    return dr > 0 && dr * dr > dx * dx + dy * dy;\n  }\n  function score(node) {\n    var a2 = node._, b2 = node.next._, ab = a2.r + b2.r, dx = (a2.x * b2.r + b2.x * a2.r) / ab, dy = (a2.y * b2.r + b2.y * a2.r) / ab;\n    return dx * dx + dy * dy;\n  }\n  function Node$1(circle2) {\n    this._ = circle2;\n    this.next = null;\n    this.previous = null;\n  }\n  function packSiblingsRandom(circles, random2) {\n    if (!(n = (circles = array$2(circles)).length)) return 0;\n    var a2, b2, c2, n, aa, ca, i, j, k, sj, sk;\n    a2 = circles[0], a2.x = 0, a2.y = 0;\n    if (!(n > 1)) return a2.r;\n    b2 = circles[1], a2.x = -b2.r, b2.x = a2.r, b2.y = 0;\n    if (!(n > 2)) return a2.r + b2.r;\n    place(b2, a2, c2 = circles[2]);\n    a2 = new Node$1(a2), b2 = new Node$1(b2), c2 = new Node$1(c2);\n    a2.next = c2.previous = b2;\n    b2.next = a2.previous = c2;\n    c2.next = b2.previous = a2;\n    pack: for (i = 3; i < n; ++i) {\n      place(a2._, b2._, c2 = circles[i]), c2 = new Node$1(c2);\n      j = b2.next, k = a2.previous, sj = b2._.r, sk = a2._.r;\n      do {\n        if (sj <= sk) {\n          if (intersects(j._, c2._)) {\n            b2 = j, a2.next = b2, b2.previous = a2, --i;\n            continue pack;\n          }\n          sj += j._.r, j = j.next;\n        } else {\n          if (intersects(k._, c2._)) {\n            a2 = k, a2.next = b2, b2.previous = a2, --i;\n            continue pack;\n          }\n          sk += k._.r, k = k.previous;\n        }\n      } while (j !== k.next);\n      c2.previous = a2, c2.next = b2, a2.next = b2.previous = b2 = c2;\n      aa = score(a2);\n      while ((c2 = c2.next) !== b2) {\n        if ((ca = score(c2)) < aa) {\n          a2 = c2, aa = ca;\n        }\n      }\n      b2 = a2.next;\n    }\n    a2 = [b2._], c2 = b2;\n    while ((c2 = c2.next) !== b2) a2.push(c2._);\n    c2 = packEncloseRandom(a2, random2);\n    for (i = 0; i < n; ++i) a2 = circles[i], a2.x -= c2.x, a2.y -= c2.y;\n    return c2.r;\n  }\n  function defaultRadius(d) {\n    return Math.sqrt(d.value);\n  }\n  function pack() {\n    var radius2 = null, dx = 1, dy = 1, padding2 = constantZero;\n    function pack2(root) {\n      const random2 = lcg();\n      root.x = dx / 2, root.y = dy / 2;\n      if (radius2) {\n        root.eachBefore(radiusLeaf(radius2)).eachAfter(packChildrenRandom(padding2, 0.5, random2)).eachBefore(translateChild(1));\n      } else {\n        root.eachBefore(radiusLeaf(defaultRadius)).eachAfter(packChildrenRandom(constantZero, 1, random2)).eachAfter(packChildrenRandom(padding2, root.r / Math.min(dx, dy), random2)).eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));\n      }\n      return root;\n    }\n    pack2.radius = function(x2) {\n      return arguments.length ? (radius2 = optional(x2), pack2) : radius2;\n    };\n    pack2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], pack2) : [dx, dy];\n    };\n    pack2.padding = function(x2) {\n      return arguments.length ? (padding2 = typeof x2 === \"function\" ? x2 : constant(+x2), pack2) : padding2;\n    };\n    return pack2;\n  }\n  function radiusLeaf(radius2) {\n    return function(node) {\n      if (!node.children) {\n        node.r = Math.max(0, +radius2(node) || 0);\n      }\n    };\n  }\n  function packChildrenRandom(padding2, k, random2) {\n    return function(node) {\n      if (children2 = node.children) {\n        var children2, i, n = children2.length, r = padding2(node) * k || 0, e;\n        if (r) for (i = 0; i < n; ++i) children2[i].r += r;\n        e = packSiblingsRandom(children2, random2);\n        if (r) for (i = 0; i < n; ++i) children2[i].r -= r;\n        node.r = e + r;\n      }\n    };\n  }\n  function translateChild(k) {\n    return function(node) {\n      var parent = node.parent;\n      node.r *= k;\n      if (parent) {\n        node.x = parent.x + k * node.x;\n        node.y = parent.y + k * node.y;\n      }\n    };\n  }\n  function roundNode(node) {\n    node.x0 = Math.round(node.x0);\n    node.y0 = Math.round(node.y0);\n    node.x1 = Math.round(node.x1);\n    node.y1 = Math.round(node.y1);\n  }\n  function treemapDice(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (x12 - x02) / parent.value;\n    while (++i < n) {\n      node = nodes[i], node.y0 = y02, node.y1 = y12;\n      node.x0 = x02, node.x1 = x02 += node.value * k;\n    }\n  }\n  function partition$1() {\n    var dx = 1, dy = 1, padding2 = 0, round = false;\n    function partition2(root) {\n      var n = root.height + 1;\n      root.x0 = root.y0 = padding2;\n      root.x1 = dx;\n      root.y1 = dy / n;\n      root.eachBefore(positionNode(dy, n));\n      if (round) root.eachBefore(roundNode);\n      return root;\n    }\n    function positionNode(dy2, n) {\n      return function(node) {\n        if (node.children) {\n          treemapDice(node, node.x0, dy2 * (node.depth + 1) / n, node.x1, dy2 * (node.depth + 2) / n);\n        }\n        var x02 = node.x0, y02 = node.y0, x12 = node.x1 - padding2, y12 = node.y1 - padding2;\n        if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n        if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n        node.x0 = x02;\n        node.y0 = y02;\n        node.x1 = x12;\n        node.y1 = y12;\n      };\n    }\n    partition2.round = function(x2) {\n      return arguments.length ? (round = !!x2, partition2) : round;\n    };\n    partition2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], partition2) : [dx, dy];\n    };\n    partition2.padding = function(x2) {\n      return arguments.length ? (padding2 = +x2, partition2) : padding2;\n    };\n    return partition2;\n  }\n  var preroot = { depth: -1 }, ambiguous = {}, imputed = {};\n  function defaultId(d) {\n    return d.id;\n  }\n  function defaultParentId(d) {\n    return d.parentId;\n  }\n  function stratify() {\n    var id2 = defaultId, parentId = defaultParentId, path2;\n    function stratify2(data2) {\n      var nodes = Array.from(data2), currentId = id2, currentParentId = parentId, n, d, i, root, parent, node, nodeId, nodeKey, nodeByKey = /* @__PURE__ */ new Map();\n      if (path2 != null) {\n        const I = nodes.map((d2, i2) => normalize$3(path2(d2, i2, data2)));\n        const P = I.map(parentof);\n        const S = new Set(I).add(\"\");\n        for (const i2 of P) {\n          if (!S.has(i2)) {\n            S.add(i2);\n            I.push(i2);\n            P.push(parentof(i2));\n            nodes.push(imputed);\n          }\n        }\n        currentId = (_, i2) => I[i2];\n        currentParentId = (_, i2) => P[i2];\n      }\n      for (i = 0, n = nodes.length; i < n; ++i) {\n        d = nodes[i], node = nodes[i] = new Node$2(d);\n        if ((nodeId = currentId(d, i, data2)) != null && (nodeId += \"\")) {\n          nodeKey = node.id = nodeId;\n          nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node);\n        }\n        if ((nodeId = currentParentId(d, i, data2)) != null && (nodeId += \"\")) {\n          node.parent = nodeId;\n        }\n      }\n      for (i = 0; i < n; ++i) {\n        node = nodes[i];\n        if (nodeId = node.parent) {\n          parent = nodeByKey.get(nodeId);\n          if (!parent) throw new Error(\"missing: \" + nodeId);\n          if (parent === ambiguous) throw new Error(\"ambiguous: \" + nodeId);\n          if (parent.children) parent.children.push(node);\n          else parent.children = [node];\n          node.parent = parent;\n        } else {\n          if (root) throw new Error(\"multiple roots\");\n          root = node;\n        }\n      }\n      if (!root) throw new Error(\"no root\");\n      if (path2 != null) {\n        while (root.data === imputed && root.children.length === 1) {\n          root = root.children[0], --n;\n        }\n        for (let i2 = nodes.length - 1; i2 >= 0; --i2) {\n          node = nodes[i2];\n          if (node.data !== imputed) break;\n          node.data = null;\n        }\n      }\n      root.parent = preroot;\n      root.eachBefore(function(node2) {\n        node2.depth = node2.parent.depth + 1;\n        --n;\n      }).eachBefore(computeHeight);\n      root.parent = null;\n      if (n > 0) throw new Error(\"cycle\");\n      return root;\n    }\n    stratify2.id = function(x2) {\n      return arguments.length ? (id2 = optional(x2), stratify2) : id2;\n    };\n    stratify2.parentId = function(x2) {\n      return arguments.length ? (parentId = optional(x2), stratify2) : parentId;\n    };\n    stratify2.path = function(x2) {\n      return arguments.length ? (path2 = optional(x2), stratify2) : path2;\n    };\n    return stratify2;\n  }\n  function normalize$3(path2) {\n    path2 = `${path2}`;\n    let i = path2.length;\n    if (slash(path2, i - 1) && !slash(path2, i - 2)) path2 = path2.slice(0, -1);\n    return path2[0] === \"/\" ? path2 : `/${path2}`;\n  }\n  function parentof(path2) {\n    let i = path2.length;\n    if (i < 2) return \"\";\n    while (--i > 1) if (slash(path2, i)) break;\n    return path2.slice(0, i);\n  }\n  function slash(path2, i) {\n    if (path2[i] === \"/\") {\n      let k = 0;\n      while (i > 0 && path2[--i] === \"\\\\\") ++k;\n      if ((k & 1) === 0) return true;\n    }\n    return false;\n  }\n  function defaultSeparation$1(a2, b2) {\n    return a2.parent === b2.parent ? 1 : 2;\n  }\n  function nextLeft(v) {\n    var children2 = v.children;\n    return children2 ? children2[0] : v.t;\n  }\n  function nextRight(v) {\n    var children2 = v.children;\n    return children2 ? children2[children2.length - 1] : v.t;\n  }\n  function moveSubtree(wm, wp, shift) {\n    var change2 = shift / (wp.i - wm.i);\n    wp.c -= change2;\n    wp.s += shift;\n    wm.c += change2;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function executeShifts(v) {\n    var shift = 0, change2 = 0, children2 = v.children, i = children2.length, w2;\n    while (--i >= 0) {\n      w2 = children2[i];\n      w2.z += shift;\n      w2.m += shift;\n      shift += w2.s + (change2 += w2.c);\n    }\n  }\n  function nextAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  function TreeNode(node, i) {\n    this._ = node;\n    this.parent = null;\n    this.children = null;\n    this.A = null;\n    this.a = this;\n    this.z = 0;\n    this.m = 0;\n    this.c = 0;\n    this.s = 0;\n    this.t = null;\n    this.i = i;\n  }\n  TreeNode.prototype = Object.create(Node$2.prototype);\n  function treeRoot(root) {\n    var tree2 = new TreeNode(root, 0), node, nodes = [tree2], child, children2, i, n;\n    while (node = nodes.pop()) {\n      if (children2 = node._.children) {\n        node.children = new Array(n = children2.length);\n        for (i = n - 1; i >= 0; --i) {\n          nodes.push(child = node.children[i] = new TreeNode(children2[i], i));\n          child.parent = node;\n        }\n      }\n    }\n    (tree2.parent = new TreeNode(null, 0)).children = [tree2];\n    return tree2;\n  }\n  function tree$1() {\n    var separation = defaultSeparation$1, dx = 1, dy = 1, nodeSize = null;\n    function tree2(root) {\n      var t = treeRoot(root);\n      t.eachAfter(firstWalk), t.parent.m = -t.z;\n      t.eachBefore(secondWalk);\n      if (nodeSize) root.eachBefore(sizeNode);\n      else {\n        var left = root, right = root, bottom = root;\n        root.eachBefore(function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var s = left === right ? 1 : separation(left, right) / 2, tx2 = s - left.x, kx = dx / (right.x + s + tx2), ky = dy / (bottom.depth || 1);\n        root.eachBefore(function(node) {\n          node.x = (node.x + tx2) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return root;\n    }\n    function firstWalk(v) {\n      var children2 = v.children, siblings = v.parent.children, w2 = v.i ? siblings[v.i - 1] : null;\n      if (children2) {\n        executeShifts(v);\n        var midpoint = (children2[0].z + children2[children2.length - 1].z) / 2;\n        if (w2) {\n          v.z = w2.z + separation(v._, w2._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w2) {\n        v.z = w2.z + separation(v._, w2._);\n      }\n      v.parent.A = apportion(v, w2, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w2, ancestor) {\n      if (w2) {\n        var vip = v, vop = v, vim = w2, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {\n          vom = nextLeft(vom);\n          vop = nextRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            moveSubtree(nextAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !nextRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !nextLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= dx;\n      node.y = node.depth * dy;\n    }\n    tree2.separation = function(x2) {\n      return arguments.length ? (separation = x2, tree2) : separation;\n    };\n    tree2.size = function(x2) {\n      return arguments.length ? (nodeSize = false, dx = +x2[0], dy = +x2[1], tree2) : nodeSize ? null : [dx, dy];\n    };\n    tree2.nodeSize = function(x2) {\n      return arguments.length ? (nodeSize = true, dx = +x2[0], dy = +x2[1], tree2) : nodeSize ? [dx, dy] : null;\n    };\n    return tree2;\n  }\n  function treemapSlice(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, node, i = -1, n = nodes.length, k = parent.value && (y12 - y02) / parent.value;\n    while (++i < n) {\n      node = nodes[i], node.x0 = x02, node.x1 = x12;\n      node.y0 = y02, node.y1 = y02 += node.value * k;\n    }\n  }\n  var phi = (1 + Math.sqrt(5)) / 2;\n  function squarifyRatio(ratio, parent, x02, y02, x12, y12) {\n    var rows = [], nodes = parent.children, row, nodeValue, i0 = 0, i1 = 0, n = nodes.length, dx, dy, value2 = parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta;\n    while (i0 < n) {\n      dx = x12 - x02, dy = y12 - y02;\n      do\n        sumValue = nodes[i1++].value;\n      while (!sumValue && i1 < n);\n      minValue = maxValue = sumValue;\n      alpha = Math.max(dy / dx, dx / dy) / (value2 * ratio);\n      beta = sumValue * sumValue * alpha;\n      minRatio = Math.max(maxValue / beta, beta / minValue);\n      for (; i1 < n; ++i1) {\n        sumValue += nodeValue = nodes[i1].value;\n        if (nodeValue < minValue) minValue = nodeValue;\n        if (nodeValue > maxValue) maxValue = nodeValue;\n        beta = sumValue * sumValue * alpha;\n        newRatio = Math.max(maxValue / beta, beta / minValue);\n        if (newRatio > minRatio) {\n          sumValue -= nodeValue;\n          break;\n        }\n        minRatio = newRatio;\n      }\n      rows.push(row = { value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1) });\n      if (row.dice) treemapDice(row, x02, y02, x12, value2 ? y02 += dy * sumValue / value2 : y12);\n      else treemapSlice(row, x02, y02, value2 ? x02 += dx * sumValue / value2 : x12, y12);\n      value2 -= sumValue, i0 = i1;\n    }\n    return rows;\n  }\n  const treemapSquarify = (function custom2(ratio) {\n    function squarify(parent, x02, y02, x12, y12) {\n      squarifyRatio(ratio, parent, x02, y02, x12, y12);\n    }\n    squarify.ratio = function(x2) {\n      return custom2((x2 = +x2) > 1 ? x2 : 1);\n    };\n    return squarify;\n  })(phi);\n  function treemap() {\n    var tile = treemapSquarify, round = false, dx = 1, dy = 1, paddingStack = [0], paddingInner = constantZero, paddingTop = constantZero, paddingRight = constantZero, paddingBottom = constantZero, paddingLeft = constantZero;\n    function treemap2(root) {\n      root.x0 = root.y0 = 0;\n      root.x1 = dx;\n      root.y1 = dy;\n      root.eachBefore(positionNode);\n      paddingStack = [0];\n      if (round) root.eachBefore(roundNode);\n      return root;\n    }\n    function positionNode(node) {\n      var p = paddingStack[node.depth], x02 = node.x0 + p, y02 = node.y0 + p, x12 = node.x1 - p, y12 = node.y1 - p;\n      if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n      if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n      node.x0 = x02;\n      node.y0 = y02;\n      node.x1 = x12;\n      node.y1 = y12;\n      if (node.children) {\n        p = paddingStack[node.depth + 1] = paddingInner(node) / 2;\n        x02 += paddingLeft(node) - p;\n        y02 += paddingTop(node) - p;\n        x12 -= paddingRight(node) - p;\n        y12 -= paddingBottom(node) - p;\n        if (x12 < x02) x02 = x12 = (x02 + x12) / 2;\n        if (y12 < y02) y02 = y12 = (y02 + y12) / 2;\n        tile(node, x02, y02, x12, y12);\n      }\n    }\n    treemap2.round = function(x2) {\n      return arguments.length ? (round = !!x2, treemap2) : round;\n    };\n    treemap2.size = function(x2) {\n      return arguments.length ? (dx = +x2[0], dy = +x2[1], treemap2) : [dx, dy];\n    };\n    treemap2.tile = function(x2) {\n      return arguments.length ? (tile = required(x2), treemap2) : tile;\n    };\n    treemap2.padding = function(x2) {\n      return arguments.length ? treemap2.paddingInner(x2).paddingOuter(x2) : treemap2.paddingInner();\n    };\n    treemap2.paddingInner = function(x2) {\n      return arguments.length ? (paddingInner = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingInner;\n    };\n    treemap2.paddingOuter = function(x2) {\n      return arguments.length ? treemap2.paddingTop(x2).paddingRight(x2).paddingBottom(x2).paddingLeft(x2) : treemap2.paddingTop();\n    };\n    treemap2.paddingTop = function(x2) {\n      return arguments.length ? (paddingTop = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingTop;\n    };\n    treemap2.paddingRight = function(x2) {\n      return arguments.length ? (paddingRight = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingRight;\n    };\n    treemap2.paddingBottom = function(x2) {\n      return arguments.length ? (paddingBottom = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingBottom;\n    };\n    treemap2.paddingLeft = function(x2) {\n      return arguments.length ? (paddingLeft = typeof x2 === \"function\" ? x2 : constant(+x2), treemap2) : paddingLeft;\n    };\n    return treemap2;\n  }\n  function treemapBinary(parent, x02, y02, x12, y12) {\n    var nodes = parent.children, i, n = nodes.length, sum2, sums = new Array(n + 1);\n    for (sums[0] = sum2 = i = 0; i < n; ++i) {\n      sums[i + 1] = sum2 += nodes[i].value;\n    }\n    partition2(0, n, parent.value, x02, y02, x12, y12);\n    function partition2(i2, j, value2, x03, y03, x13, y13) {\n      if (i2 >= j - 1) {\n        var node = nodes[i2];\n        node.x0 = x03, node.y0 = y03;\n        node.x1 = x13, node.y1 = y13;\n        return;\n      }\n      var valueOffset = sums[i2], valueTarget = value2 / 2 + valueOffset, k = i2 + 1, hi = j - 1;\n      while (k < hi) {\n        var mid = k + hi >>> 1;\n        if (sums[mid] < valueTarget) k = mid + 1;\n        else hi = mid;\n      }\n      if (valueTarget - sums[k - 1] < sums[k] - valueTarget && i2 + 1 < k) --k;\n      var valueLeft = sums[k] - valueOffset, valueRight = value2 - valueLeft;\n      if (x13 - x03 > y13 - y03) {\n        var xk = value2 ? (x03 * valueRight + x13 * valueLeft) / value2 : x13;\n        partition2(i2, k, valueLeft, x03, y03, xk, y13);\n        partition2(k, j, valueRight, xk, y03, x13, y13);\n      } else {\n        var yk = value2 ? (y03 * valueRight + y13 * valueLeft) / value2 : y13;\n        partition2(i2, k, valueLeft, x03, y03, x13, yk);\n        partition2(k, j, valueRight, x03, yk, x13, y13);\n      }\n    }\n  }\n  function treemapSliceDice(parent, x02, y02, x12, y12) {\n    (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x02, y02, x12, y12);\n  }\n  const treemapResquarify = (function custom2(ratio) {\n    function resquarify(parent, x02, y02, x12, y12) {\n      if ((rows = parent._squarify) && rows.ratio === ratio) {\n        var rows, row, nodes, i, j = -1, n, m2 = rows.length, value2 = parent.value;\n        while (++j < m2) {\n          row = rows[j], nodes = row.children;\n          for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;\n          if (row.dice) treemapDice(row, x02, y02, x12, value2 ? y02 += (y12 - y02) * row.value / value2 : y12);\n          else treemapSlice(row, x02, y02, value2 ? x02 += (x12 - x02) * row.value / value2 : x12, y12);\n          value2 -= row.value;\n        }\n      } else {\n        parent._squarify = rows = squarifyRatio(ratio, parent, x02, y02, x12, y12);\n        rows.ratio = ratio;\n      }\n    }\n    resquarify.ratio = function(x2) {\n      return custom2((x2 = +x2) > 1 ? x2 : 1);\n    };\n    return resquarify;\n  })(phi);\n  function lookup$2(tree2, key2, filter2) {\n    const map2 = {};\n    tree2.each((node) => {\n      const t = node.data;\n      if (filter2(t)) map2[key2(t)] = node;\n    });\n    tree2.lookup = map2;\n    return tree2;\n  }\n  function Nest(params2) {\n    Transform.call(this, null, params2);\n  }\n  Nest.Definition = {\n    \"type\": \"Nest\",\n    \"metadata\": {\n      \"treesource\": true,\n      \"changes\": true\n    },\n    \"params\": [{\n      \"name\": \"keys\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"generate\",\n      \"type\": \"boolean\"\n    }]\n  };\n  const children$1 = (n) => n.values;\n  inherits(Nest, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source) {\n        error(\"Nest transform requires an upstream data source.\");\n      }\n      var gen = _.generate, mod = _.modified(), out = pulse2.clone(), tree2 = this.value;\n      if (!tree2 || mod || pulse2.changed()) {\n        if (tree2) {\n          tree2.each((node) => {\n            if (node.children && isTuple(node.data)) {\n              out.rem.push(node.data);\n            }\n          });\n        }\n        this.value = tree2 = hierarchy({\n          values: array$5(_.keys).reduce((n, k) => {\n            n.key(k);\n            return n;\n          }, nest()).entries(out.source)\n        }, children$1);\n        if (gen) {\n          tree2.each((node) => {\n            if (node.children) {\n              node = ingest$1(node.data);\n              out.add.push(node);\n              out.source.push(node);\n            }\n          });\n        }\n        lookup$2(tree2, tupleid, tupleid);\n      }\n      out.source.root = tree2;\n      return out;\n    }\n  });\n  function nest() {\n    const keys2 = [], nest2 = {\n      entries: (array2) => entries(apply2(array2, 0), 0),\n      key: (d) => (keys2.push(d), nest2)\n    };\n    function apply2(array2, depth) {\n      if (depth >= keys2.length) {\n        return array2;\n      }\n      const n = array2.length, key2 = keys2[depth++], valuesByKey = {}, result = {};\n      let i = -1, keyValue, value2, values2;\n      while (++i < n) {\n        keyValue = key2(value2 = array2[i]) + \"\";\n        if (values2 = valuesByKey[keyValue]) {\n          values2.push(value2);\n        } else {\n          valuesByKey[keyValue] = [value2];\n        }\n      }\n      for (keyValue in valuesByKey) {\n        result[keyValue] = apply2(valuesByKey[keyValue], depth);\n      }\n      return result;\n    }\n    function entries(map2, depth) {\n      if (++depth > keys2.length) return map2;\n      const array2 = [];\n      for (const key2 in map2) {\n        array2.push({\n          key: key2,\n          values: entries(map2[key2], depth)\n        });\n      }\n      return array2;\n    }\n    return nest2;\n  }\n  function HierarchyLayout(params2) {\n    Transform.call(this, null, params2);\n  }\n  const defaultSeparation = (a2, b2) => a2.parent === b2.parent ? 1 : 2;\n  inherits(HierarchyLayout, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source || !pulse2.source.root) {\n        error(this.constructor.name + \" transform requires a backing tree data source.\");\n      }\n      const layout = this.layout(_.method), fields = this.fields, root = pulse2.source.root, as = _.as || fields;\n      if (_.field) root.sum(_.field);\n      else root.count();\n      if (_.sort) root.sort(stableCompare(_.sort, (d) => d.data));\n      setParams(layout, this.params, _);\n      if (layout.separation) {\n        layout.separation(_.separation !== false ? defaultSeparation : one$2);\n      }\n      try {\n        this.value = layout(root);\n      } catch (err) {\n        error(err);\n      }\n      root.each((node) => setFields(node, fields, as));\n      return pulse2.reflow(_.modified()).modifies(as).modifies(\"leaf\");\n    }\n  });\n  function setParams(layout, params2, _) {\n    for (let p, i = 0, n = params2.length; i < n; ++i) {\n      p = params2[i];\n      if (p in _) layout[p](_[p]);\n    }\n  }\n  function setFields(node, fields, as) {\n    const t = node.data, n = fields.length - 1;\n    for (let i = 0; i < n; ++i) {\n      t[as[i]] = node[fields[i]];\n    }\n    t[as[n]] = node.children ? node.children.length : 0;\n  }\n  const Output$3 = [\"x\", \"y\", \"r\", \"depth\", \"children\"];\n  function Pack(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Pack.Definition = {\n    \"type\": \"Pack\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"radius\",\n      \"type\": \"field\",\n      \"default\": null\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$3.length,\n      \"default\": Output$3\n    }]\n  };\n  inherits(Pack, HierarchyLayout, {\n    layout: pack,\n    params: [\"radius\", \"size\", \"padding\"],\n    fields: Output$3\n  });\n  const Output$2 = [\"x0\", \"y0\", \"x1\", \"y1\", \"depth\", \"children\"];\n  function Partition(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Partition.Definition = {\n    \"type\": \"Partition\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"round\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$2.length,\n      \"default\": Output$2\n    }]\n  };\n  inherits(Partition, HierarchyLayout, {\n    layout: partition$1,\n    params: [\"size\", \"round\", \"padding\"],\n    fields: Output$2\n  });\n  function Stratify(params2) {\n    Transform.call(this, null, params2);\n  }\n  Stratify.Definition = {\n    \"type\": \"Stratify\",\n    \"metadata\": {\n      \"treesource\": true\n    },\n    \"params\": [{\n      \"name\": \"key\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"parentKey\",\n      \"type\": \"field\",\n      \"required\": true\n    }]\n  };\n  inherits(Stratify, Transform, {\n    transform(_, pulse2) {\n      if (!pulse2.source) {\n        error(\"Stratify transform requires an upstream data source.\");\n      }\n      let tree2 = this.value;\n      const mod = _.modified(), out = pulse2.fork(pulse2.ALL).materialize(pulse2.SOURCE), run2 = !tree2 || mod || pulse2.changed(pulse2.ADD_REM) || pulse2.modified(_.key.fields) || pulse2.modified(_.parentKey.fields);\n      out.source = out.source.slice();\n      if (run2) {\n        tree2 = out.source.length ? lookup$2(stratify().id(_.key).parentId(_.parentKey)(out.source), _.key, truthy) : lookup$2(stratify()([{}]), _.key, _.key);\n      }\n      out.source.root = this.value = tree2;\n      return out;\n    }\n  });\n  const Layouts = {\n    tidy: tree$1,\n    cluster\n  };\n  const Output$1$1 = [\"x\", \"y\", \"depth\", \"children\"];\n  function Tree(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Tree.Definition = {\n    \"type\": \"Tree\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"tidy\",\n      \"values\": [\"tidy\", \"cluster\"]\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"nodeSize\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"separation\",\n      \"type\": \"boolean\",\n      \"default\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$1$1.length,\n      \"default\": Output$1$1\n    }]\n  };\n  inherits(Tree, HierarchyLayout, {\n    /**\n     * Tree layout generator. Supports both 'tidy' and 'cluster' layouts.\n     */\n    layout(method2) {\n      const m2 = method2 || \"tidy\";\n      if (has$1(Layouts, m2)) return Layouts[m2]();\n      else error(\"Unrecognized Tree layout method: \" + m2);\n    },\n    params: [\"size\", \"nodeSize\"],\n    fields: Output$1$1\n  });\n  function TreeLinks(params2) {\n    Transform.call(this, [], params2);\n  }\n  TreeLinks.Definition = {\n    \"type\": \"TreeLinks\",\n    \"metadata\": {\n      \"tree\": true,\n      \"generates\": true,\n      \"changes\": true\n    },\n    \"params\": []\n  };\n  inherits(TreeLinks, Transform, {\n    transform(_, pulse2) {\n      const links = this.value, tree2 = pulse2.source && pulse2.source.root, out = pulse2.fork(pulse2.NO_SOURCE), lut = {};\n      if (!tree2) error(\"TreeLinks transform requires a tree data source.\");\n      if (pulse2.changed(pulse2.ADD_REM)) {\n        out.rem = links;\n        pulse2.visit(pulse2.SOURCE, (t) => lut[tupleid(t)] = 1);\n        tree2.each((node) => {\n          const t = node.data, p = node.parent && node.parent.data;\n          if (p && lut[tupleid(t)] && lut[tupleid(p)]) {\n            out.add.push(ingest$1({\n              source: p,\n              target: t\n            }));\n          }\n        });\n        this.value = out.add;\n      } else if (pulse2.changed(pulse2.MOD)) {\n        pulse2.visit(pulse2.MOD, (t) => lut[tupleid(t)] = 1);\n        links.forEach((link2) => {\n          if (lut[tupleid(link2.source)] || lut[tupleid(link2.target)]) {\n            out.mod.push(link2);\n          }\n        });\n      }\n      return out;\n    }\n  });\n  const Tiles = {\n    binary: treemapBinary,\n    dice: treemapDice,\n    slice: treemapSlice,\n    slicedice: treemapSliceDice,\n    squarify: treemapSquarify,\n    resquarify: treemapResquarify\n  };\n  const Output$4 = [\"x0\", \"y0\", \"x1\", \"y1\", \"depth\", \"children\"];\n  function Treemap(params2) {\n    HierarchyLayout.call(this, params2);\n  }\n  Treemap.Definition = {\n    \"type\": \"Treemap\",\n    \"metadata\": {\n      \"tree\": true,\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"field\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"sort\",\n      \"type\": \"compare\"\n    }, {\n      \"name\": \"method\",\n      \"type\": \"enum\",\n      \"default\": \"squarify\",\n      \"values\": [\"squarify\", \"resquarify\", \"binary\", \"dice\", \"slice\", \"slicedice\"]\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingInner\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingOuter\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingTop\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingRight\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingBottom\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"paddingLeft\",\n      \"type\": \"number\",\n      \"default\": 0\n    }, {\n      \"name\": \"ratio\",\n      \"type\": \"number\",\n      \"default\": 1.618033988749895\n    }, {\n      \"name\": \"round\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": Output$4.length,\n      \"default\": Output$4\n    }]\n  };\n  inherits(Treemap, HierarchyLayout, {\n    /**\n     * Treemap layout generator. Adds 'method' and 'ratio' parameters\n     * to configure the underlying tile method.\n     */\n    layout() {\n      const x2 = treemap();\n      x2.ratio = (_) => {\n        const t = x2.tile();\n        if (t.ratio) x2.tile(t.ratio(_));\n      };\n      x2.method = (_) => {\n        if (has$1(Tiles, _)) x2.tile(Tiles[_]);\n        else error(\"Unrecognized Treemap layout method: \" + _);\n      };\n      return x2;\n    },\n    params: [\"method\", \"ratio\", \"size\", \"round\", \"padding\", \"paddingInner\", \"paddingOuter\", \"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"],\n    fields: Output$4\n  });\n  const tree = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    nest: Nest,\n    pack: Pack,\n    partition: Partition,\n    stratify: Stratify,\n    tree: Tree,\n    treelinks: TreeLinks,\n    treemap: Treemap\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const ALPHA_MASK = 4278190080;\n  function baseBitmaps($2, data2) {\n    const bitmap = $2.bitmap();\n    (data2 || []).forEach((d) => bitmap.set($2(d.boundary[0]), $2(d.boundary[3])));\n    return [bitmap, void 0];\n  }\n  function markBitmaps($2, baseMark, avoidMarks, labelInside, isGroupArea) {\n    const width2 = $2.width, height2 = $2.height, border = labelInside || isGroupArea, context2 = domCanvas(width2, height2).getContext(\"2d\"), baseMarkContext = domCanvas(width2, height2).getContext(\"2d\"), strokeContext = border && domCanvas(width2, height2).getContext(\"2d\");\n    avoidMarks.forEach((items) => draw(context2, items, false));\n    draw(baseMarkContext, baseMark, false);\n    if (border) {\n      draw(strokeContext, baseMark, true);\n    }\n    const buffer = getBuffer(context2, width2, height2), baseMarkBuffer = getBuffer(baseMarkContext, width2, height2), strokeBuffer = border && getBuffer(strokeContext, width2, height2), layer1 = $2.bitmap(), layer2 = border && $2.bitmap();\n    let x2, y2, u2, v, index2, alpha, strokeAlpha, baseMarkAlpha;\n    for (y2 = 0; y2 < height2; ++y2) {\n      for (x2 = 0; x2 < width2; ++x2) {\n        index2 = y2 * width2 + x2;\n        alpha = buffer[index2] & ALPHA_MASK;\n        baseMarkAlpha = baseMarkBuffer[index2] & ALPHA_MASK;\n        strokeAlpha = border && strokeBuffer[index2] & ALPHA_MASK;\n        if (alpha || strokeAlpha || baseMarkAlpha) {\n          u2 = $2(x2);\n          v = $2(y2);\n          if (!isGroupArea && (alpha || baseMarkAlpha)) layer1.set(u2, v);\n          if (border && (alpha || strokeAlpha)) layer2.set(u2, v);\n        }\n      }\n    }\n    return [layer1, layer2];\n  }\n  function getBuffer(context2, width2, height2) {\n    return new Uint32Array(context2.getImageData(0, 0, width2, height2).data.buffer);\n  }\n  function draw(context2, items, interior) {\n    if (!items.length) return;\n    const type2 = items[0].mark.marktype;\n    if (type2 === \"group\") {\n      items.forEach((group2) => {\n        group2.items.forEach((mark) => draw(context2, mark.items, interior));\n      });\n    } else {\n      Marks[type2].draw(context2, {\n        items: interior ? items.map(prepare) : items\n      });\n    }\n  }\n  function prepare(source2) {\n    const item = rederive(source2, {});\n    if (item.stroke && item.strokeOpacity !== 0 || item.fill && item.fillOpacity !== 0) {\n      return {\n        ...item,\n        strokeOpacity: 1,\n        stroke: \"#000\",\n        fillOpacity: 0\n      };\n    }\n    return item;\n  }\n  const DIV = 5, MOD = 31, SIZE = 32, RIGHT0 = new Uint32Array(SIZE + 1), RIGHT1 = new Uint32Array(SIZE + 1);\n  RIGHT1[0] = 0;\n  RIGHT0[0] = ~RIGHT1[0];\n  for (let i = 1; i <= SIZE; ++i) {\n    RIGHT1[i] = RIGHT1[i - 1] << 1 | 1;\n    RIGHT0[i] = ~RIGHT1[i];\n  }\n  function Bitmap(w2, h2) {\n    const array2 = new Uint32Array(~~((w2 * h2 + SIZE) / SIZE));\n    function _set(index2, mask) {\n      array2[index2] |= mask;\n    }\n    function _clear(index2, mask) {\n      array2[index2] &= mask;\n    }\n    return {\n      array: array2,\n      get: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        return array2[index2 >>> DIV] & 1 << (index2 & MOD);\n      },\n      set: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        _set(index2 >>> DIV, 1 << (index2 & MOD));\n      },\n      clear: (x2, y2) => {\n        const index2 = y2 * w2 + x2;\n        _clear(index2 >>> DIV, ~(1 << (index2 & MOD)));\n      },\n      getRange: (x2, y2, x22, y22) => {\n        let r = y22, start, end, indexStart, indexEnd;\n        for (; r >= y2; --r) {\n          start = r * w2 + x2;\n          end = r * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            if (array2[indexStart] & RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]) {\n              return true;\n            }\n          } else {\n            if (array2[indexStart] & RIGHT0[start & MOD]) return true;\n            if (array2[indexEnd] & RIGHT1[(end & MOD) + 1]) return true;\n            for (let i = indexStart + 1; i < indexEnd; ++i) {\n              if (array2[i]) return true;\n            }\n          }\n        }\n        return false;\n      },\n      setRange: (x2, y2, x22, y22) => {\n        let start, end, indexStart, indexEnd, i;\n        for (; y2 <= y22; ++y2) {\n          start = y2 * w2 + x2;\n          end = y2 * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            _set(indexStart, RIGHT0[start & MOD] & RIGHT1[(end & MOD) + 1]);\n          } else {\n            _set(indexStart, RIGHT0[start & MOD]);\n            _set(indexEnd, RIGHT1[(end & MOD) + 1]);\n            for (i = indexStart + 1; i < indexEnd; ++i) _set(i, 4294967295);\n          }\n        }\n      },\n      clearRange: (x2, y2, x22, y22) => {\n        let start, end, indexStart, indexEnd, i;\n        for (; y2 <= y22; ++y2) {\n          start = y2 * w2 + x2;\n          end = y2 * w2 + x22;\n          indexStart = start >>> DIV;\n          indexEnd = end >>> DIV;\n          if (indexStart === indexEnd) {\n            _clear(indexStart, RIGHT1[start & MOD] | RIGHT0[(end & MOD) + 1]);\n          } else {\n            _clear(indexStart, RIGHT1[start & MOD]);\n            _clear(indexEnd, RIGHT0[(end & MOD) + 1]);\n            for (i = indexStart + 1; i < indexEnd; ++i) _clear(i, 0);\n          }\n        }\n      },\n      outOfBounds: (x2, y2, x22, y22) => x2 < 0 || y2 < 0 || y22 >= h2 || x22 >= w2\n    };\n  }\n  function scaler(width2, height2, padding2) {\n    const ratio = Math.max(1, Math.sqrt(width2 * height2 / 1e6)), w2 = ~~((width2 + 2 * padding2 + ratio) / ratio), h2 = ~~((height2 + 2 * padding2 + ratio) / ratio), scale2 = (_) => ~~((_ + padding2) / ratio);\n    scale2.invert = (_) => _ * ratio - padding2;\n    scale2.bitmap = () => Bitmap(w2, h2);\n    scale2.ratio = ratio;\n    scale2.padding = padding2;\n    scale2.width = width2;\n    scale2.height = height2;\n    return scale2;\n  }\n  function placeAreaLabelNaive($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height;\n    return function(d) {\n      const items = d.datum.datum.items[markIndex].items, n = items.length, textHeight = d.datum.fontSize, textWidth = textMetrics.width(d.datum, d.datum.text);\n      let maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, areaWidth;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        x3 = (x12 + x2) / 2;\n        y3 = (y12 + y2) / 2;\n        areaWidth = Math.abs(x2 - x12 + y2 - y12);\n        if (areaWidth >= maxAreaWidth) {\n          maxAreaWidth = areaWidth;\n          d.x = x3;\n          d.y = y3;\n        }\n      }\n      x3 = textWidth / 2;\n      y3 = textHeight / 2;\n      x12 = d.x - x3;\n      x2 = d.x + x3;\n      y12 = d.y - y3;\n      y2 = d.y + y3;\n      d.align = \"center\";\n      if (x12 < 0 && x2 <= width2) {\n        d.align = \"left\";\n      } else if (0 <= x12 && width2 < x2) {\n        d.align = \"right\";\n      }\n      d.baseline = \"middle\";\n      if (y12 < 0 && y2 <= height2) {\n        d.baseline = \"top\";\n      } else if (0 <= y12 && height2 < y2) {\n        d.baseline = \"bottom\";\n      }\n      return true;\n    };\n  }\n  function outOfBounds(x2, y2, textWidth, textHeight, width2, height2) {\n    let r = textWidth / 2;\n    return x2 - r < 0 || x2 + r > width2 || y2 - (r = textHeight / 2) < 0 || y2 + r > height2;\n  }\n  function collision($2, x2, y2, textHeight, textWidth, h2, bm0, bm1) {\n    const w2 = textWidth * h2 / (textHeight * 2), x12 = $2(x2 - w2), x22 = $2(x2 + w2), y12 = $2(y2 - (h2 = h2 / 2)), y22 = $2(y2 + h2);\n    return bm0.outOfBounds(x12, y12, x22, y22) || bm0.getRange(x12, y12, x22, y22) || bm1 && bm1.getRange(x12, y12, x22, y22);\n  }\n  function placeAreaLabelReducedSearch($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1];\n    function tryLabel(_x, _y, maxSize, textWidth, textHeight) {\n      const x2 = $2.invert(_x), y2 = $2.invert(_y);\n      let lo = maxSize, hi = height2, mid;\n      if (!outOfBounds(x2, y2, textWidth, textHeight, width2, height2) && !collision($2, x2, y2, textHeight, textWidth, lo, bm0, bm1) && !collision($2, x2, y2, textHeight, textWidth, textHeight, bm0, null)) {\n        while (hi - lo >= 1) {\n          mid = (lo + hi) / 2;\n          if (collision($2, x2, y2, textHeight, textWidth, mid, bm0, bm1)) {\n            hi = mid;\n          } else {\n            lo = mid;\n          }\n        }\n        if (lo > maxSize) {\n          return [x2, y2, lo, true];\n        }\n      }\n    }\n    return function(d) {\n      const items = d.datum.datum.items[markIndex].items, n = items.length, textHeight = d.datum.fontSize, textWidth = textMetrics.width(d.datum, d.datum.text);\n      let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, _x, _y, _x1, _xMid, _x2, _y1, _yMid, _y2, areaWidth, result, swapTmp;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        if (x12 > x2) {\n          swapTmp = x12;\n          x12 = x2;\n          x2 = swapTmp;\n        }\n        if (y12 > y2) {\n          swapTmp = y12;\n          y12 = y2;\n          y2 = swapTmp;\n        }\n        _x1 = $2(x12);\n        _x2 = $2(x2);\n        _xMid = ~~((_x1 + _x2) / 2);\n        _y1 = $2(y12);\n        _y2 = $2(y2);\n        _yMid = ~~((_y1 + _y2) / 2);\n        for (_x = _xMid; _x >= _x1; --_x) {\n          for (_y = _yMid; _y >= _y1; --_y) {\n            result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n            if (result) {\n              [d.x, d.y, maxSize, labelPlaced] = result;\n            }\n          }\n        }\n        for (_x = _xMid; _x <= _x2; ++_x) {\n          for (_y = _yMid; _y <= _y2; ++_y) {\n            result = tryLabel(_x, _y, maxSize, textWidth, textHeight);\n            if (result) {\n              [d.x, d.y, maxSize, labelPlaced] = result;\n            }\n          }\n        }\n        if (!labelPlaced && !avoidBaseMark) {\n          areaWidth = Math.abs(x2 - x12 + y2 - y12);\n          x3 = (x12 + x2) / 2;\n          y3 = (y12 + y2) / 2;\n          if (areaWidth >= maxAreaWidth && !outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            maxAreaWidth = areaWidth;\n            d.x = x3;\n            d.y = y3;\n            labelPlaced2 = true;\n          }\n        }\n      }\n      if (labelPlaced || labelPlaced2) {\n        x3 = textWidth / 2;\n        y3 = textHeight / 2;\n        bm0.setRange($2(d.x - x3), $2(d.y - y3), $2(d.x + x3), $2(d.y + y3));\n        d.align = \"center\";\n        d.baseline = \"middle\";\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n  const X_DIR = [-1, -1, 1, 1];\n  const Y_DIR = [-1, 1, -1, 1];\n  function placeAreaLabelFloodFill($2, bitmaps, avoidBaseMark, markIndex) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1], bm2 = $2.bitmap();\n    return function(d) {\n      const items = d.datum.datum.items[markIndex].items, n = items.length, textHeight = d.datum.fontSize, textWidth = textMetrics.width(d.datum, d.datum.text), stack = [];\n      let maxSize = avoidBaseMark ? textHeight : 0, labelPlaced = false, labelPlaced2 = false, maxAreaWidth = 0, x12, x2, y12, y2, x3, y3, _x, _y, lo, hi, mid, areaWidth;\n      for (let i = 0; i < n; ++i) {\n        x12 = items[i].x;\n        y12 = items[i].y;\n        x2 = items[i].x2 === void 0 ? x12 : items[i].x2;\n        y2 = items[i].y2 === void 0 ? y12 : items[i].y2;\n        stack.push([$2((x12 + x2) / 2), $2((y12 + y2) / 2)]);\n        while (stack.length) {\n          [_x, _y] = stack.pop();\n          if (bm0.get(_x, _y) || bm1.get(_x, _y) || bm2.get(_x, _y)) continue;\n          bm2.set(_x, _y);\n          for (let j = 0; j < 4; ++j) {\n            x3 = _x + X_DIR[j];\n            y3 = _y + Y_DIR[j];\n            if (!bm2.outOfBounds(x3, y3, x3, y3)) stack.push([x3, y3]);\n          }\n          x3 = $2.invert(_x);\n          y3 = $2.invert(_y);\n          lo = maxSize;\n          hi = height2;\n          if (!outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, lo, bm0, bm1) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            while (hi - lo >= 1) {\n              mid = (lo + hi) / 2;\n              if (collision($2, x3, y3, textHeight, textWidth, mid, bm0, bm1)) {\n                hi = mid;\n              } else {\n                lo = mid;\n              }\n            }\n            if (lo > maxSize) {\n              d.x = x3;\n              d.y = y3;\n              maxSize = lo;\n              labelPlaced = true;\n            }\n          }\n        }\n        if (!labelPlaced && !avoidBaseMark) {\n          areaWidth = Math.abs(x2 - x12 + y2 - y12);\n          x3 = (x12 + x2) / 2;\n          y3 = (y12 + y2) / 2;\n          if (areaWidth >= maxAreaWidth && !outOfBounds(x3, y3, textWidth, textHeight, width2, height2) && !collision($2, x3, y3, textHeight, textWidth, textHeight, bm0, null)) {\n            maxAreaWidth = areaWidth;\n            d.x = x3;\n            d.y = y3;\n            labelPlaced2 = true;\n          }\n        }\n      }\n      if (labelPlaced || labelPlaced2) {\n        x3 = textWidth / 2;\n        y3 = textHeight / 2;\n        bm0.setRange($2(d.x - x3), $2(d.y - y3), $2(d.x + x3), $2(d.y + y3));\n        d.align = \"center\";\n        d.baseline = \"middle\";\n        return true;\n      } else {\n        return false;\n      }\n    };\n  }\n  const Aligns = [\"right\", \"center\", \"left\"], Baselines = [\"bottom\", \"middle\", \"top\"];\n  function placeMarkLabel($2, bitmaps, anchors, offsets2) {\n    const width2 = $2.width, height2 = $2.height, bm0 = bitmaps[0], bm1 = bitmaps[1], n = offsets2.length;\n    return function(d) {\n      const boundary = d.boundary, textHeight = d.datum.fontSize;\n      if (boundary[2] < 0 || boundary[5] < 0 || boundary[0] > width2 || boundary[3] > height2) {\n        return false;\n      }\n      let textWidth = d.textWidth ?? 0, dx, dy, isInside, sizeFactor, insideFactor, x12, x2, y12, y2, xc, yc, _x1, _x2, _y1, _y2;\n      for (let i = 0; i < n; ++i) {\n        dx = (anchors[i] & 3) - 1;\n        dy = (anchors[i] >>> 2 & 3) - 1;\n        isInside = dx === 0 && dy === 0 || offsets2[i] < 0;\n        sizeFactor = dx && dy ? Math.SQRT1_2 : 1;\n        insideFactor = offsets2[i] < 0 ? -1 : 1;\n        x12 = boundary[1 + dx] + offsets2[i] * dx * sizeFactor;\n        yc = boundary[4 + dy] + insideFactor * textHeight * dy / 2 + offsets2[i] * dy * sizeFactor;\n        y12 = yc - textHeight / 2;\n        y2 = yc + textHeight / 2;\n        _x1 = $2(x12);\n        _y1 = $2(y12);\n        _y2 = $2(y2);\n        if (!textWidth) {\n          if (!test(_x1, _x1, _y1, _y2, bm0, bm1, x12, x12, y12, y2, boundary, isInside)) {\n            continue;\n          } else {\n            textWidth = textMetrics.width(d.datum, d.datum.text);\n          }\n        }\n        xc = x12 + insideFactor * textWidth * dx / 2;\n        x12 = xc - textWidth / 2;\n        x2 = xc + textWidth / 2;\n        _x1 = $2(x12);\n        _x2 = $2(x2);\n        if (test(_x1, _x2, _y1, _y2, bm0, bm1, x12, x2, y12, y2, boundary, isInside)) {\n          d.x = !dx ? xc : dx * insideFactor < 0 ? x2 : x12;\n          d.y = !dy ? yc : dy * insideFactor < 0 ? y2 : y12;\n          d.align = Aligns[dx * insideFactor + 1];\n          d.baseline = Baselines[dy * insideFactor + 1];\n          bm0.setRange(_x1, _y1, _x2, _y2);\n          return true;\n        }\n      }\n      return false;\n    };\n  }\n  function test(_x1, _x2, _y1, _y2, bm0, bm1, x12, x2, y12, y2, boundary, isInside) {\n    return !(bm0.outOfBounds(_x1, _y1, _x2, _y2) || (isInside && bm1 || bm0).getRange(_x1, _y1, _x2, _y2));\n  }\n  const TOP = 0, MIDDLE = 4, BOTTOM = 8, LEFT = 0, CENTER = 1, RIGHT = 2;\n  const anchorCode = {\n    \"top-left\": TOP + LEFT,\n    \"top\": TOP + CENTER,\n    \"top-right\": TOP + RIGHT,\n    \"left\": MIDDLE + LEFT,\n    \"middle\": MIDDLE + CENTER,\n    \"right\": MIDDLE + RIGHT,\n    \"bottom-left\": BOTTOM + LEFT,\n    \"bottom\": BOTTOM + CENTER,\n    \"bottom-right\": BOTTOM + RIGHT\n  };\n  const placeAreaLabel = {\n    \"naive\": placeAreaLabelNaive,\n    \"reduced-search\": placeAreaLabelReducedSearch,\n    \"floodfill\": placeAreaLabelFloodFill\n  };\n  function labelLayout(texts, size, compare2, offset2, anchor, avoidMarks, avoidBaseMark, lineAnchor, markIndex, padding2, method2) {\n    if (!texts.length) return texts;\n    const positions = Math.max(offset2.length, anchor.length), offsets2 = getOffsets(offset2, positions), anchors = getAnchors(anchor, positions), marktype = markType(texts[0].datum), grouptype = marktype === \"group\" && texts[0].datum.items[markIndex].marktype, isGroupArea = grouptype === \"area\", boundary = markBoundary(marktype, grouptype, lineAnchor, markIndex), infPadding = padding2 === null || padding2 === Infinity, isNaiveGroupArea = isGroupArea && method2 === \"naive\";\n    let maxTextWidth = -1, maxTextHeight = -1;\n    const data2 = texts.map((d) => {\n      const textWidth = infPadding ? textMetrics.width(d, d.text) : void 0;\n      maxTextWidth = Math.max(maxTextWidth, textWidth);\n      maxTextHeight = Math.max(maxTextHeight, d.fontSize);\n      return {\n        datum: d,\n        opacity: 0,\n        x: void 0,\n        y: void 0,\n        align: void 0,\n        baseline: void 0,\n        boundary: boundary(d),\n        textWidth\n      };\n    });\n    padding2 = padding2 === null || padding2 === Infinity ? Math.max(maxTextWidth, maxTextHeight) + Math.max(...offset2) : padding2;\n    const $2 = scaler(size[0], size[1], padding2);\n    let bitmaps;\n    if (!isNaiveGroupArea) {\n      if (compare2) {\n        data2.sort((a2, b2) => compare2(a2.datum, b2.datum));\n      }\n      let labelInside = false;\n      for (let i = 0; i < anchors.length && !labelInside; ++i) {\n        labelInside = anchors[i] === 5 || offsets2[i] < 0;\n      }\n      const baseMark = (marktype && avoidBaseMark || isGroupArea) && texts.map((d) => d.datum);\n      bitmaps = avoidMarks.length || baseMark ? markBitmaps($2, baseMark || [], avoidMarks, labelInside, isGroupArea) : baseBitmaps($2, avoidBaseMark && data2);\n    }\n    const place2 = isGroupArea ? placeAreaLabel[method2]($2, bitmaps, avoidBaseMark, markIndex) : placeMarkLabel($2, bitmaps, anchors, offsets2);\n    data2.forEach((d) => d.opacity = +place2(d));\n    return data2;\n  }\n  function getOffsets(_, count2) {\n    const offsets2 = new Float64Array(count2), n = _.length;\n    for (let i = 0; i < n; ++i) offsets2[i] = _[i] || 0;\n    for (let i = n; i < count2; ++i) offsets2[i] = offsets2[n - 1];\n    return offsets2;\n  }\n  function getAnchors(_, count2) {\n    const anchors = new Int8Array(count2), n = _.length;\n    for (let i = 0; i < n; ++i) anchors[i] |= anchorCode[_[i]];\n    for (let i = n; i < count2; ++i) anchors[i] = anchors[n - 1];\n    return anchors;\n  }\n  function markType(item) {\n    return item && item.mark && item.mark.marktype;\n  }\n  function markBoundary(marktype, grouptype, lineAnchor, markIndex) {\n    const xy = (d) => [d.x, d.x, d.x, d.y, d.y, d.y];\n    if (!marktype) {\n      return xy;\n    } else if (marktype === \"line\" || marktype === \"area\") {\n      return (d) => xy(d.datum);\n    } else if (grouptype === \"line\") {\n      return (d) => {\n        const items = d.datum.items[markIndex].items;\n        return xy(items.length ? items[lineAnchor === \"start\" ? 0 : items.length - 1] : {\n          x: NaN,\n          y: NaN\n        });\n      };\n    } else {\n      return (d) => {\n        const b2 = d.datum.bounds;\n        return [b2.x1, (b2.x1 + b2.x2) / 2, b2.x2, b2.y1, (b2.y1 + b2.y2) / 2, b2.y2];\n      };\n    }\n  }\n  const Output$1 = [\"x\", \"y\", \"opacity\", \"align\", \"baseline\"];\n  const Anchors = [\"top-left\", \"left\", \"bottom-left\", \"top\", \"bottom\", \"top-right\", \"right\", \"bottom-right\"];\n  function Label$1(params2) {\n    Transform.call(this, null, params2);\n  }\n  Label$1.Definition = {\n    type: \"Label\",\n    metadata: {\n      modifies: true\n    },\n    params: [{\n      name: \"size\",\n      type: \"number\",\n      array: true,\n      length: 2,\n      required: true\n    }, {\n      name: \"sort\",\n      type: \"compare\"\n    }, {\n      name: \"anchor\",\n      type: \"string\",\n      array: true,\n      default: Anchors\n    }, {\n      name: \"offset\",\n      type: \"number\",\n      array: true,\n      default: [1]\n    }, {\n      name: \"padding\",\n      type: \"number\",\n      default: 0,\n      null: true\n    }, {\n      name: \"lineAnchor\",\n      type: \"string\",\n      values: [\"start\", \"end\"],\n      default: \"end\"\n    }, {\n      name: \"markIndex\",\n      type: \"number\",\n      default: 0\n    }, {\n      name: \"avoidBaseMark\",\n      type: \"boolean\",\n      default: true\n    }, {\n      name: \"avoidMarks\",\n      type: \"data\",\n      array: true\n    }, {\n      name: \"method\",\n      type: \"string\",\n      default: \"naive\"\n    }, {\n      name: \"as\",\n      type: \"string\",\n      array: true,\n      length: Output$1.length,\n      default: Output$1\n    }]\n  };\n  inherits(Label$1, Transform, {\n    transform(_, pulse2) {\n      function modp(param2) {\n        const p = _[param2];\n        return isFunction(p) && pulse2.modified(p.fields);\n      }\n      const mod = _.modified();\n      if (!(mod || pulse2.changed(pulse2.ADD_REM) || modp(\"sort\"))) return;\n      if (!_.size || _.size.length !== 2) {\n        error(\"Size parameter should be specified as a [width, height] array.\");\n      }\n      const as = _.as || Output$1;\n      labelLayout(pulse2.materialize(pulse2.SOURCE).source || [], _.size, _.sort, array$5(_.offset == null ? 1 : _.offset), array$5(_.anchor || Anchors), _.avoidMarks || [], _.avoidBaseMark !== false, _.lineAnchor || \"end\", _.markIndex || 0, _.padding === void 0 ? 0 : _.padding, _.method || \"naive\").forEach((l) => {\n        const t = l.datum;\n        t[as[0]] = l.x;\n        t[as[1]] = l.y;\n        t[as[2]] = l.opacity;\n        t[as[3]] = l.align;\n        t[as[4]] = l.baseline;\n      });\n      return pulse2.reflow(mod).modifies(as);\n    }\n  });\n  const label = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    label: Label$1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function partition(data2, groupby) {\n    var groups = [], get2 = function(f) {\n      return f(t);\n    }, map2, i, n, t, k, g;\n    if (groupby == null) {\n      groups.push(data2);\n    } else {\n      for (map2 = {}, i = 0, n = data2.length; i < n; ++i) {\n        t = data2[i];\n        k = groupby.map(get2);\n        g = map2[k];\n        if (!g) {\n          map2[k] = g = [];\n          g.dims = k;\n          groups.push(g);\n        }\n        g.push(t);\n      }\n    }\n    return groups;\n  }\n  function Loess(params2) {\n    Transform.call(this, null, params2);\n  }\n  Loess.Definition = {\n    \"type\": \"Loess\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"bandwidth\",\n      \"type\": \"number\",\n      \"default\": 0.3\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Loess, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition(source2, _.groupby), names = (_.groupby || []).map(accessorName), m2 = names.length, as = _.as || [accessorName(_.x), accessorName(_.y)], values2 = [];\n        groups.forEach((g) => {\n          loess(g, _.x, _.y, _.bandwidth || 0.3).forEach((p) => {\n            const t = {};\n            for (let i = 0; i < m2; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = p[0];\n            t[as[1]] = p[1];\n            values2.push(ingest$1(t));\n          });\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  const Methods = {\n    constant: constant$4,\n    linear: linear$2,\n    log: log$3,\n    exp: exp$1,\n    pow: pow$3,\n    quad,\n    poly\n  };\n  const degreesOfFreedom = (method2, order) => method2 === \"poly\" ? order : method2 === \"quad\" ? 2 : 1;\n  function Regression(params2) {\n    Transform.call(this, null, params2);\n  }\n  Regression.Definition = {\n    \"type\": \"Regression\",\n    \"metadata\": {\n      \"generates\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"groupby\",\n      \"type\": \"field\",\n      \"array\": true\n    }, {\n      \"name\": \"method\",\n      \"type\": \"string\",\n      \"default\": \"linear\",\n      \"values\": Object.keys(Methods)\n    }, {\n      \"name\": \"order\",\n      \"type\": \"number\",\n      \"default\": 3\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"params\",\n      \"type\": \"boolean\",\n      \"default\": false\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true\n    }]\n  };\n  inherits(Regression, Transform, {\n    transform(_, pulse2) {\n      const out = pulse2.fork(pulse2.NO_SOURCE | pulse2.NO_FIELDS);\n      if (!this.value || pulse2.changed() || _.modified()) {\n        const source2 = pulse2.materialize(pulse2.SOURCE).source, groups = partition(source2, _.groupby), names = (_.groupby || []).map(accessorName), method2 = _.method || \"linear\", order = _.order == null ? 3 : _.order, dof = degreesOfFreedom(method2, order), as = _.as || [accessorName(_.x), accessorName(_.y)], fit2 = Methods[method2], values2 = [];\n        let domain2 = _.extent;\n        if (!has$1(Methods, method2)) {\n          error(\"Invalid regression method: \" + method2);\n        }\n        if (domain2 != null) {\n          if (method2 === \"log\" && domain2[0] <= 0) {\n            pulse2.dataflow.warn(\"Ignoring extent with values <= 0 for log regression.\");\n            domain2 = null;\n          }\n        }\n        groups.forEach((g) => {\n          const n = g.length;\n          if (n <= dof) {\n            pulse2.dataflow.warn(\"Skipping regression with more parameters than data points.\");\n            return;\n          }\n          const model = fit2(g, _.x, _.y, order);\n          if (_.params) {\n            values2.push(ingest$1({\n              keys: g.dims,\n              coef: model.coef,\n              rSquared: model.rSquared\n            }));\n            return;\n          }\n          const dom = domain2 || extent(g, _.x), add2 = (p) => {\n            const t = {};\n            for (let i = 0; i < names.length; ++i) {\n              t[names[i]] = g.dims[i];\n            }\n            t[as[0]] = p[0];\n            t[as[1]] = p[1];\n            values2.push(ingest$1(t));\n          };\n          if (method2 === \"linear\" || method2 === \"constant\") {\n            dom.forEach((x2) => add2([x2, model.predict(x2)]));\n          } else {\n            sampleCurve(model.predict, dom, 25, 200).forEach(add2);\n          }\n        });\n        if (this.value) out.rem = this.value;\n        this.value = out.add = out.source = values2;\n      }\n      return out;\n    }\n  });\n  const reg = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    loess: Loess,\n    regression: Regression\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const epsilon$1 = 11102230246251565e-32;\n  const splitter = 134217729;\n  const resulterrbound = (3 + 8 * epsilon$1) * epsilon$1;\n  function sum(elen, e, flen, f, h2) {\n    let Q, Qnew, hh, bvirt;\n    let enow = e[0];\n    let fnow = f[0];\n    let eindex = 0;\n    let findex = 0;\n    if (fnow > enow === fnow > -enow) {\n      Q = enow;\n      enow = e[++eindex];\n    } else {\n      Q = fnow;\n      fnow = f[++findex];\n    }\n    let hindex = 0;\n    if (eindex < elen && findex < flen) {\n      if (fnow > enow === fnow > -enow) {\n        Qnew = enow + Q;\n        hh = Q - (Qnew - enow);\n        enow = e[++eindex];\n      } else {\n        Qnew = fnow + Q;\n        hh = Q - (Qnew - fnow);\n        fnow = f[++findex];\n      }\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n      while (eindex < elen && findex < flen) {\n        if (fnow > enow === fnow > -enow) {\n          Qnew = Q + enow;\n          bvirt = Qnew - Q;\n          hh = Q - (Qnew - bvirt) + (enow - bvirt);\n          enow = e[++eindex];\n        } else {\n          Qnew = Q + fnow;\n          bvirt = Qnew - Q;\n          hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n          fnow = f[++findex];\n        }\n        Q = Qnew;\n        if (hh !== 0) {\n          h2[hindex++] = hh;\n        }\n      }\n    }\n    while (eindex < elen) {\n      Qnew = Q + enow;\n      bvirt = Qnew - Q;\n      hh = Q - (Qnew - bvirt) + (enow - bvirt);\n      enow = e[++eindex];\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n    }\n    while (findex < flen) {\n      Qnew = Q + fnow;\n      bvirt = Qnew - Q;\n      hh = Q - (Qnew - bvirt) + (fnow - bvirt);\n      fnow = f[++findex];\n      Q = Qnew;\n      if (hh !== 0) {\n        h2[hindex++] = hh;\n      }\n    }\n    if (Q !== 0 || hindex === 0) {\n      h2[hindex++] = Q;\n    }\n    return hindex;\n  }\n  function estimate(elen, e) {\n    let Q = e[0];\n    for (let i = 1; i < elen; i++) Q += e[i];\n    return Q;\n  }\n  function vec(n) {\n    return new Float64Array(n);\n  }\n  const ccwerrboundA = (3 + 16 * epsilon$1) * epsilon$1;\n  const ccwerrboundB = (2 + 12 * epsilon$1) * epsilon$1;\n  const ccwerrboundC = (9 + 64 * epsilon$1) * epsilon$1 * epsilon$1;\n  const B = vec(4);\n  const C1 = vec(8);\n  const C2 = vec(12);\n  const D = vec(16);\n  const u = vec(4);\n  function orient2dadapt(ax, ay, bx, by, cx, cy, detsum) {\n    let acxtail, acytail, bcxtail, bcytail;\n    let bvirt, c2, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t12, t02, u3;\n    const acx = ax - cx;\n    const bcx = bx - cx;\n    const acy = ay - cy;\n    const bcy = by - cy;\n    s1 = acx * bcy;\n    c2 = splitter * acx;\n    ahi = c2 - (c2 - acx);\n    alo = acx - ahi;\n    c2 = splitter * bcy;\n    bhi = c2 - (c2 - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acy * bcx;\n    c2 = splitter * acy;\n    ahi = c2 - (c2 - acy);\n    alo = acy - ahi;\n    c2 = splitter * bcx;\n    bhi = c2 - (c2 - bcx);\n    blo = bcx - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    B[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    B[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    B[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    B[3] = u3;\n    let det = estimate(4, B);\n    let errbound = ccwerrboundB * detsum;\n    if (det >= errbound || -det >= errbound) {\n      return det;\n    }\n    bvirt = ax - acx;\n    acxtail = ax - (acx + bvirt) + (bvirt - cx);\n    bvirt = bx - bcx;\n    bcxtail = bx - (bcx + bvirt) + (bvirt - cx);\n    bvirt = ay - acy;\n    acytail = ay - (acy + bvirt) + (bvirt - cy);\n    bvirt = by - bcy;\n    bcytail = by - (bcy + bvirt) + (bvirt - cy);\n    if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) {\n      return det;\n    }\n    errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);\n    det += acx * bcytail + bcy * acxtail - (acy * bcxtail + bcx * acytail);\n    if (det >= errbound || -det >= errbound) return det;\n    s1 = acxtail * bcy;\n    c2 = splitter * acxtail;\n    ahi = c2 - (c2 - acxtail);\n    alo = acxtail - ahi;\n    c2 = splitter * bcy;\n    bhi = c2 - (c2 - bcy);\n    blo = bcy - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acytail * bcx;\n    c2 = splitter * acytail;\n    ahi = c2 - (c2 - acytail);\n    alo = acytail - ahi;\n    c2 = splitter * bcx;\n    bhi = c2 - (c2 - bcx);\n    blo = bcx - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C1len = sum(4, B, 4, u, C1);\n    s1 = acx * bcytail;\n    c2 = splitter * acx;\n    ahi = c2 - (c2 - acx);\n    alo = acx - ahi;\n    c2 = splitter * bcytail;\n    bhi = c2 - (c2 - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acy * bcxtail;\n    c2 = splitter * acy;\n    ahi = c2 - (c2 - acy);\n    alo = acy - ahi;\n    c2 = splitter * bcxtail;\n    bhi = c2 - (c2 - bcxtail);\n    blo = bcxtail - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const C2len = sum(C1len, C1, 4, u, C2);\n    s1 = acxtail * bcytail;\n    c2 = splitter * acxtail;\n    ahi = c2 - (c2 - acxtail);\n    alo = acxtail - ahi;\n    c2 = splitter * bcytail;\n    bhi = c2 - (c2 - bcytail);\n    blo = bcytail - bhi;\n    s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);\n    t12 = acytail * bcxtail;\n    c2 = splitter * acytail;\n    ahi = c2 - (c2 - acytail);\n    alo = acytail - ahi;\n    c2 = splitter * bcxtail;\n    bhi = c2 - (c2 - bcxtail);\n    blo = bcxtail - bhi;\n    t02 = alo * blo - (t12 - ahi * bhi - alo * bhi - ahi * blo);\n    _i = s0 - t02;\n    bvirt = s0 - _i;\n    u[0] = s0 - (_i + bvirt) + (bvirt - t02);\n    _j = s1 + _i;\n    bvirt = _j - s1;\n    _0 = s1 - (_j - bvirt) + (_i - bvirt);\n    _i = _0 - t12;\n    bvirt = _0 - _i;\n    u[1] = _0 - (_i + bvirt) + (bvirt - t12);\n    u3 = _j + _i;\n    bvirt = u3 - _j;\n    u[2] = _j - (u3 - bvirt) + (_i - bvirt);\n    u[3] = u3;\n    const Dlen = sum(C2len, C2, 4, u, D);\n    return D[Dlen - 1];\n  }\n  function orient2d(ax, ay, bx, by, cx, cy) {\n    const detleft = (ay - cy) * (bx - cx);\n    const detright = (ax - cx) * (by - cy);\n    const det = detleft - detright;\n    const detsum = Math.abs(detleft + detright);\n    if (Math.abs(det) >= ccwerrboundA * detsum) return det;\n    return -orient2dadapt(ax, ay, bx, by, cx, cy, detsum);\n  }\n  const EPSILON$1 = Math.pow(2, -52);\n  const EDGE_STACK = new Uint32Array(512);\n  class Delaunator {\n    static from(points2, getX = defaultGetX, getY = defaultGetY) {\n      const n = points2.length;\n      const coords = new Float64Array(n * 2);\n      for (let i = 0; i < n; i++) {\n        const p = points2[i];\n        coords[2 * i] = getX(p);\n        coords[2 * i + 1] = getY(p);\n      }\n      return new Delaunator(coords);\n    }\n    constructor(coords) {\n      const n = coords.length >> 1;\n      if (n > 0 && typeof coords[0] !== \"number\") throw new Error(\"Expected coords to contain numbers.\");\n      this.coords = coords;\n      const maxTriangles = Math.max(2 * n - 5, 0);\n      this._triangles = new Uint32Array(maxTriangles * 3);\n      this._halfedges = new Int32Array(maxTriangles * 3);\n      this._hashSize = Math.ceil(Math.sqrt(n));\n      this._hullPrev = new Uint32Array(n);\n      this._hullNext = new Uint32Array(n);\n      this._hullTri = new Uint32Array(n);\n      this._hullHash = new Int32Array(this._hashSize);\n      this._ids = new Uint32Array(n);\n      this._dists = new Float64Array(n);\n      this.update();\n    }\n    update() {\n      const { coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash } = this;\n      const n = coords.length >> 1;\n      let minX = Infinity;\n      let minY = Infinity;\n      let maxX = -Infinity;\n      let maxY2 = -Infinity;\n      for (let i = 0; i < n; i++) {\n        const x2 = coords[2 * i];\n        const y2 = coords[2 * i + 1];\n        if (x2 < minX) minX = x2;\n        if (y2 < minY) minY = y2;\n        if (x2 > maxX) maxX = x2;\n        if (y2 > maxY2) maxY2 = y2;\n        this._ids[i] = i;\n      }\n      const cx = (minX + maxX) / 2;\n      const cy = (minY + maxY2) / 2;\n      let i0, i1, i2;\n      for (let i = 0, minDist = Infinity; i < n; i++) {\n        const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);\n        if (d < minDist) {\n          i0 = i;\n          minDist = d;\n        }\n      }\n      const i0x = coords[2 * i0];\n      const i0y = coords[2 * i0 + 1];\n      for (let i = 0, minDist = Infinity; i < n; i++) {\n        if (i === i0) continue;\n        const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);\n        if (d < minDist && d > 0) {\n          i1 = i;\n          minDist = d;\n        }\n      }\n      let i1x = coords[2 * i1];\n      let i1y = coords[2 * i1 + 1];\n      let minRadius = Infinity;\n      for (let i = 0; i < n; i++) {\n        if (i === i0 || i === i1) continue;\n        const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);\n        if (r < minRadius) {\n          i2 = i;\n          minRadius = r;\n        }\n      }\n      let i2x = coords[2 * i2];\n      let i2y = coords[2 * i2 + 1];\n      if (minRadius === Infinity) {\n        for (let i = 0; i < n; i++) {\n          this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];\n        }\n        quicksort(this._ids, this._dists, 0, n - 1);\n        const hull = new Uint32Array(n);\n        let j = 0;\n        for (let i = 0, d0 = -Infinity; i < n; i++) {\n          const id2 = this._ids[i];\n          const d = this._dists[id2];\n          if (d > d0) {\n            hull[j++] = id2;\n            d0 = d;\n          }\n        }\n        this.hull = hull.subarray(0, j);\n        this.triangles = new Uint32Array(0);\n        this.halfedges = new Uint32Array(0);\n        return;\n      }\n      if (orient2d(i0x, i0y, i1x, i1y, i2x, i2y) < 0) {\n        const i = i1;\n        const x2 = i1x;\n        const y2 = i1y;\n        i1 = i2;\n        i1x = i2x;\n        i1y = i2y;\n        i2 = i;\n        i2x = x2;\n        i2y = y2;\n      }\n      const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n      this._cx = center.x;\n      this._cy = center.y;\n      for (let i = 0; i < n; i++) {\n        this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);\n      }\n      quicksort(this._ids, this._dists, 0, n - 1);\n      this._hullStart = i0;\n      let hullSize = 3;\n      hullNext[i0] = hullPrev[i2] = i1;\n      hullNext[i1] = hullPrev[i0] = i2;\n      hullNext[i2] = hullPrev[i1] = i0;\n      hullTri[i0] = 0;\n      hullTri[i1] = 1;\n      hullTri[i2] = 2;\n      hullHash.fill(-1);\n      hullHash[this._hashKey(i0x, i0y)] = i0;\n      hullHash[this._hashKey(i1x, i1y)] = i1;\n      hullHash[this._hashKey(i2x, i2y)] = i2;\n      this.trianglesLen = 0;\n      this._addTriangle(i0, i1, i2, -1, -1, -1);\n      for (let k = 0, xp, yp; k < this._ids.length; k++) {\n        const i = this._ids[k];\n        const x2 = coords[2 * i];\n        const y2 = coords[2 * i + 1];\n        if (k > 0 && Math.abs(x2 - xp) <= EPSILON$1 && Math.abs(y2 - yp) <= EPSILON$1) continue;\n        xp = x2;\n        yp = y2;\n        if (i === i0 || i === i1 || i === i2) continue;\n        let start = 0;\n        for (let j = 0, key2 = this._hashKey(x2, y2); j < this._hashSize; j++) {\n          start = hullHash[(key2 + j) % this._hashSize];\n          if (start !== -1 && start !== hullNext[start]) break;\n        }\n        start = hullPrev[start];\n        let e = start, q;\n        while (q = hullNext[e], orient2d(x2, y2, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]) >= 0) {\n          e = q;\n          if (e === start) {\n            e = -1;\n            break;\n          }\n        }\n        if (e === -1) continue;\n        let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n        hullTri[i] = this._legalize(t + 2);\n        hullTri[e] = t;\n        hullSize++;\n        let n2 = hullNext[e];\n        while (q = hullNext[n2], orient2d(x2, y2, coords[2 * n2], coords[2 * n2 + 1], coords[2 * q], coords[2 * q + 1]) < 0) {\n          t = this._addTriangle(n2, i, q, hullTri[i], -1, hullTri[n2]);\n          hullTri[i] = this._legalize(t + 2);\n          hullNext[n2] = n2;\n          hullSize--;\n          n2 = q;\n        }\n        if (e === start) {\n          while (q = hullPrev[e], orient2d(x2, y2, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]) < 0) {\n            t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n            this._legalize(t + 2);\n            hullTri[q] = t;\n            hullNext[e] = e;\n            hullSize--;\n            e = q;\n          }\n        }\n        this._hullStart = hullPrev[i] = e;\n        hullNext[e] = hullPrev[n2] = i;\n        hullNext[i] = n2;\n        hullHash[this._hashKey(x2, y2)] = i;\n        hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n      }\n      this.hull = new Uint32Array(hullSize);\n      for (let i = 0, e = this._hullStart; i < hullSize; i++) {\n        this.hull[i] = e;\n        e = hullNext[e];\n      }\n      this.triangles = this._triangles.subarray(0, this.trianglesLen);\n      this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n    }\n    _hashKey(x2, y2) {\n      return Math.floor(pseudoAngle(x2 - this._cx, y2 - this._cy) * this._hashSize) % this._hashSize;\n    }\n    _legalize(a2) {\n      const { _triangles: triangles, _halfedges: halfedges, coords } = this;\n      let i = 0;\n      let ar = 0;\n      while (true) {\n        const b2 = halfedges[a2];\n        const a0 = a2 - a2 % 3;\n        ar = a0 + (a2 + 2) % 3;\n        if (b2 === -1) {\n          if (i === 0) break;\n          a2 = EDGE_STACK[--i];\n          continue;\n        }\n        const b0 = b2 - b2 % 3;\n        const al = a0 + (a2 + 1) % 3;\n        const bl2 = b0 + (b2 + 2) % 3;\n        const p02 = triangles[ar];\n        const pr = triangles[a2];\n        const pl = triangles[al];\n        const p1 = triangles[bl2];\n        const illegal = inCircle(\n          coords[2 * p02],\n          coords[2 * p02 + 1],\n          coords[2 * pr],\n          coords[2 * pr + 1],\n          coords[2 * pl],\n          coords[2 * pl + 1],\n          coords[2 * p1],\n          coords[2 * p1 + 1]\n        );\n        if (illegal) {\n          triangles[a2] = p1;\n          triangles[b2] = p02;\n          const hbl = halfedges[bl2];\n          if (hbl === -1) {\n            let e = this._hullStart;\n            do {\n              if (this._hullTri[e] === bl2) {\n                this._hullTri[e] = a2;\n                break;\n              }\n              e = this._hullPrev[e];\n            } while (e !== this._hullStart);\n          }\n          this._link(a2, hbl);\n          this._link(b2, halfedges[ar]);\n          this._link(ar, bl2);\n          const br2 = b0 + (b2 + 1) % 3;\n          if (i < EDGE_STACK.length) {\n            EDGE_STACK[i++] = br2;\n          }\n        } else {\n          if (i === 0) break;\n          a2 = EDGE_STACK[--i];\n        }\n      }\n      return ar;\n    }\n    _link(a2, b2) {\n      this._halfedges[a2] = b2;\n      if (b2 !== -1) this._halfedges[b2] = a2;\n    }\n    // add a new triangle given vertex indices and adjacent half-edge ids\n    _addTriangle(i0, i1, i2, a2, b2, c2) {\n      const t = this.trianglesLen;\n      this._triangles[t] = i0;\n      this._triangles[t + 1] = i1;\n      this._triangles[t + 2] = i2;\n      this._link(t, a2);\n      this._link(t + 1, b2);\n      this._link(t + 2, c2);\n      this.trianglesLen += 3;\n      return t;\n    }\n  }\n  function pseudoAngle(dx, dy) {\n    const p = dx / (Math.abs(dx) + Math.abs(dy));\n    return (dy > 0 ? 3 - p : 1 + p) / 4;\n  }\n  function dist(ax, ay, bx, by) {\n    const dx = ax - bx;\n    const dy = ay - by;\n    return dx * dx + dy * dy;\n  }\n  function inCircle(ax, ay, bx, by, cx, cy, px2, py2) {\n    const dx = ax - px2;\n    const dy = ay - py2;\n    const ex = bx - px2;\n    const ey = by - py2;\n    const fx = cx - px2;\n    const fy = cy - py2;\n    const ap = dx * dx + dy * dy;\n    const bp = ex * ex + ey * ey;\n    const cp = fx * fx + fy * fy;\n    return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n  }\n  function circumradius(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl2 = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n    const x2 = (ey * bl2 - dy * cl) * d;\n    const y2 = (dx * cl - ex * bl2) * d;\n    return x2 * x2 + y2 * y2;\n  }\n  function circumcenter(ax, ay, bx, by, cx, cy) {\n    const dx = bx - ax;\n    const dy = by - ay;\n    const ex = cx - ax;\n    const ey = cy - ay;\n    const bl2 = dx * dx + dy * dy;\n    const cl = ex * ex + ey * ey;\n    const d = 0.5 / (dx * ey - dy * ex);\n    const x2 = ax + (ey * bl2 - dy * cl) * d;\n    const y2 = ay + (dx * cl - ex * bl2) * d;\n    return { x: x2, y: y2 };\n  }\n  function quicksort(ids, dists, left, right) {\n    if (right - left <= 20) {\n      for (let i = left + 1; i <= right; i++) {\n        const temp2 = ids[i];\n        const tempDist = dists[temp2];\n        let j = i - 1;\n        while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--];\n        ids[j + 1] = temp2;\n      }\n    } else {\n      const median2 = left + right >> 1;\n      let i = left + 1;\n      let j = right;\n      swap(ids, median2, i);\n      if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n      if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n      if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n      const temp2 = ids[i];\n      const tempDist = dists[temp2];\n      while (true) {\n        do\n          i++;\n        while (dists[ids[i]] < tempDist);\n        do\n          j--;\n        while (dists[ids[j]] > tempDist);\n        if (j < i) break;\n        swap(ids, i, j);\n      }\n      ids[left + 1] = ids[j];\n      ids[j] = temp2;\n      if (right - i + 1 >= j - left) {\n        quicksort(ids, dists, i, right);\n        quicksort(ids, dists, left, j - 1);\n      } else {\n        quicksort(ids, dists, left, j - 1);\n        quicksort(ids, dists, i, right);\n      }\n    }\n  }\n  function swap(arr, i, j) {\n    const tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n  }\n  function defaultGetX(p) {\n    return p[0];\n  }\n  function defaultGetY(p) {\n    return p[1];\n  }\n  const epsilon = 1e-6;\n  class Path {\n    constructor() {\n      this._x0 = this._y0 = // start of current subpath\n      this._x1 = this._y1 = null;\n      this._ = \"\";\n    }\n    moveTo(x2, y2) {\n      this._ += `M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}`;\n    }\n    closePath() {\n      if (this._x1 !== null) {\n        this._x1 = this._x0, this._y1 = this._y0;\n        this._ += \"Z\";\n      }\n    }\n    lineTo(x2, y2) {\n      this._ += `L${this._x1 = +x2},${this._y1 = +y2}`;\n    }\n    arc(x2, y2, r) {\n      x2 = +x2, y2 = +y2, r = +r;\n      const x02 = x2 + r;\n      const y02 = y2;\n      if (r < 0) throw new Error(\"negative radius\");\n      if (this._x1 === null) this._ += `M${x02},${y02}`;\n      else if (Math.abs(this._x1 - x02) > epsilon || Math.abs(this._y1 - y02) > epsilon) this._ += \"L\" + x02 + \",\" + y02;\n      if (!r) return;\n      this._ += `A${r},${r},0,1,1,${x2 - r},${y2}A${r},${r},0,1,1,${this._x1 = x02},${this._y1 = y02}`;\n    }\n    rect(x2, y2, w2, h2) {\n      this._ += `M${this._x0 = this._x1 = +x2},${this._y0 = this._y1 = +y2}h${+w2}v${+h2}h${-w2}Z`;\n    }\n    value() {\n      return this._ || null;\n    }\n  }\n  class Polygon {\n    constructor() {\n      this._ = [];\n    }\n    moveTo(x2, y2) {\n      this._.push([x2, y2]);\n    }\n    closePath() {\n      this._.push(this._[0].slice());\n    }\n    lineTo(x2, y2) {\n      this._.push([x2, y2]);\n    }\n    value() {\n      return this._.length ? this._ : null;\n    }\n  }\n  let Voronoi$1 = class Voronoi {\n    constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) {\n      if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error(\"invalid bounds\");\n      this.delaunay = delaunay;\n      this._circumcenters = new Float64Array(delaunay.points.length * 2);\n      this.vectors = new Float64Array(delaunay.points.length * 2);\n      this.xmax = xmax, this.xmin = xmin;\n      this.ymax = ymax, this.ymin = ymin;\n      this._init();\n    }\n    update() {\n      this.delaunay.update();\n      this._init();\n      return this;\n    }\n    _init() {\n      const { delaunay: { points: points2, hull, triangles }, vectors } = this;\n      let bx, by;\n      const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2);\n      for (let i = 0, j = 0, n = triangles.length, x2, y2; i < n; i += 3, j += 2) {\n        const t12 = triangles[i] * 2;\n        const t22 = triangles[i + 1] * 2;\n        const t32 = triangles[i + 2] * 2;\n        const x13 = points2[t12];\n        const y13 = points2[t12 + 1];\n        const x22 = points2[t22];\n        const y22 = points2[t22 + 1];\n        const x3 = points2[t32];\n        const y3 = points2[t32 + 1];\n        const dx = x22 - x13;\n        const dy = y22 - y13;\n        const ex = x3 - x13;\n        const ey = y3 - y13;\n        const ab = (dx * ey - dy * ex) * 2;\n        if (Math.abs(ab) < 1e-9) {\n          if (bx === void 0) {\n            bx = by = 0;\n            for (const i2 of hull) bx += points2[i2 * 2], by += points2[i2 * 2 + 1];\n            bx /= hull.length, by /= hull.length;\n          }\n          const a2 = 1e9 * Math.sign((bx - x13) * ey - (by - y13) * ex);\n          x2 = (x13 + x3) / 2 - a2 * ey;\n          y2 = (y13 + y3) / 2 + a2 * ex;\n        } else {\n          const d = 1 / ab;\n          const bl2 = dx * dx + dy * dy;\n          const cl = ex * ex + ey * ey;\n          x2 = x13 + (ey * bl2 - dy * cl) * d;\n          y2 = y13 + (dx * cl - ex * bl2) * d;\n        }\n        circumcenters[j] = x2;\n        circumcenters[j + 1] = y2;\n      }\n      let h2 = hull[hull.length - 1];\n      let p02, p1 = h2 * 4;\n      let x02, x12 = points2[2 * h2];\n      let y02, y12 = points2[2 * h2 + 1];\n      vectors.fill(0);\n      for (let i = 0; i < hull.length; ++i) {\n        h2 = hull[i];\n        p02 = p1, x02 = x12, y02 = y12;\n        p1 = h2 * 4, x12 = points2[2 * h2], y12 = points2[2 * h2 + 1];\n        vectors[p02 + 2] = vectors[p1] = y02 - y12;\n        vectors[p02 + 3] = vectors[p1 + 1] = x12 - x02;\n      }\n    }\n    render(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { delaunay: { halfedges, inedges, hull }, circumcenters, vectors } = this;\n      if (hull.length <= 1) return null;\n      for (let i = 0, n = halfedges.length; i < n; ++i) {\n        const j = halfedges[i];\n        if (j < i) continue;\n        const ti = Math.floor(i / 3) * 2;\n        const tj = Math.floor(j / 3) * 2;\n        const xi = circumcenters[ti];\n        const yi = circumcenters[ti + 1];\n        const xj = circumcenters[tj];\n        const yj = circumcenters[tj + 1];\n        this._renderSegment(xi, yi, xj, yj, context2);\n      }\n      let h0, h1 = hull[hull.length - 1];\n      for (let i = 0; i < hull.length; ++i) {\n        h0 = h1, h1 = hull[i];\n        const t = Math.floor(inedges[h1] / 3) * 2;\n        const x2 = circumcenters[t];\n        const y2 = circumcenters[t + 1];\n        const v = h0 * 4;\n        const p = this._project(x2, y2, vectors[v + 2], vectors[v + 3]);\n        if (p) this._renderSegment(x2, y2, p[0], p[1], context2);\n      }\n      return buffer && buffer.value();\n    }\n    renderBounds(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      context2.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin);\n      return buffer && buffer.value();\n    }\n    renderCell(i, context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const points2 = this._clip(i);\n      if (points2 === null || !points2.length) return;\n      context2.moveTo(points2[0], points2[1]);\n      let n = points2.length;\n      while (points2[0] === points2[n - 2] && points2[1] === points2[n - 1] && n > 1) n -= 2;\n      for (let i2 = 2; i2 < n; i2 += 2) {\n        if (points2[i2] !== points2[i2 - 2] || points2[i2 + 1] !== points2[i2 - 1])\n          context2.lineTo(points2[i2], points2[i2 + 1]);\n      }\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    *cellPolygons() {\n      const { delaunay: { points: points2 } } = this;\n      for (let i = 0, n = points2.length / 2; i < n; ++i) {\n        const cell2 = this.cellPolygon(i);\n        if (cell2) cell2.index = i, yield cell2;\n      }\n    }\n    cellPolygon(i) {\n      const polygon = new Polygon();\n      this.renderCell(i, polygon);\n      return polygon.value();\n    }\n    _renderSegment(x02, y02, x12, y12, context2) {\n      let S;\n      const c0 = this._regioncode(x02, y02);\n      const c1 = this._regioncode(x12, y12);\n      if (c0 === 0 && c1 === 0) {\n        context2.moveTo(x02, y02);\n        context2.lineTo(x12, y12);\n      } else if (S = this._clipSegment(x02, y02, x12, y12, c0, c1)) {\n        context2.moveTo(S[0], S[1]);\n        context2.lineTo(S[2], S[3]);\n      }\n    }\n    contains(i, x2, y2) {\n      if ((x2 = +x2, x2 !== x2) || (y2 = +y2, y2 !== y2)) return false;\n      return this.delaunay._step(i, x2, y2) === i;\n    }\n    *neighbors(i) {\n      const ci = this._clip(i);\n      if (ci) for (const j of this.delaunay.neighbors(i)) {\n        const cj = this._clip(j);\n        if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) {\n          for (let aj = 0, lj = cj.length; aj < lj; aj += 2) {\n            if (ci[ai] === cj[aj] && ci[ai + 1] === cj[aj + 1] && ci[(ai + 2) % li] === cj[(aj + lj - 2) % lj] && ci[(ai + 3) % li] === cj[(aj + lj - 1) % lj]) {\n              yield j;\n              break loop;\n            }\n          }\n        }\n      }\n    }\n    _cell(i) {\n      const { circumcenters, delaunay: { inedges, halfedges, triangles } } = this;\n      const e0 = inedges[i];\n      if (e0 === -1) return null;\n      const points2 = [];\n      let e = e0;\n      do {\n        const t = Math.floor(e / 3);\n        points2.push(circumcenters[t * 2], circumcenters[t * 2 + 1]);\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) break;\n        e = halfedges[e];\n      } while (e !== e0 && e !== -1);\n      return points2;\n    }\n    _clip(i) {\n      if (i === 0 && this.delaunay.hull.length === 1) {\n        return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n      }\n      const points2 = this._cell(i);\n      if (points2 === null) return null;\n      const { vectors: V } = this;\n      const v = i * 4;\n      return this._simplify(V[v] || V[v + 1] ? this._clipInfinite(i, points2, V[v], V[v + 1], V[v + 2], V[v + 3]) : this._clipFinite(i, points2));\n    }\n    _clipFinite(i, points2) {\n      const n = points2.length;\n      let P = null;\n      let x02, y02, x12 = points2[n - 2], y12 = points2[n - 1];\n      let c0, c1 = this._regioncode(x12, y12);\n      let e0, e1 = 0;\n      for (let j = 0; j < n; j += 2) {\n        x02 = x12, y02 = y12, x12 = points2[j], y12 = points2[j + 1];\n        c0 = c1, c1 = this._regioncode(x12, y12);\n        if (c0 === 0 && c1 === 0) {\n          e0 = e1, e1 = 0;\n          if (P) P.push(x12, y12);\n          else P = [x12, y12];\n        } else {\n          let S, sx0, sy0, sx1, sy1;\n          if (c0 === 0) {\n            if ((S = this._clipSegment(x02, y02, x12, y12, c0, c1)) === null) continue;\n            [sx0, sy0, sx1, sy1] = S;\n          } else {\n            if ((S = this._clipSegment(x12, y12, x02, y02, c1, c0)) === null) continue;\n            [sx1, sy1, sx0, sy0] = S;\n            e0 = e1, e1 = this._edgecode(sx0, sy0);\n            if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n            if (P) P.push(sx0, sy0);\n            else P = [sx0, sy0];\n          }\n          e0 = e1, e1 = this._edgecode(sx1, sy1);\n          if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n          if (P) P.push(sx1, sy1);\n          else P = [sx1, sy1];\n        }\n      }\n      if (P) {\n        e0 = e1, e1 = this._edgecode(P[0], P[1]);\n        if (e0 && e1) this._edge(i, e0, e1, P, P.length);\n      } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n        return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin];\n      }\n      return P;\n    }\n    _clipSegment(x02, y02, x12, y12, c0, c1) {\n      const flip2 = c0 < c1;\n      if (flip2) [x02, y02, x12, y12, c0, c1] = [x12, y12, x02, y02, c1, c0];\n      while (true) {\n        if (c0 === 0 && c1 === 0) return flip2 ? [x12, y12, x02, y02] : [x02, y02, x12, y12];\n        if (c0 & c1) return null;\n        let x2, y2, c2 = c0 || c1;\n        if (c2 & 8) x2 = x02 + (x12 - x02) * (this.ymax - y02) / (y12 - y02), y2 = this.ymax;\n        else if (c2 & 4) x2 = x02 + (x12 - x02) * (this.ymin - y02) / (y12 - y02), y2 = this.ymin;\n        else if (c2 & 2) y2 = y02 + (y12 - y02) * (this.xmax - x02) / (x12 - x02), x2 = this.xmax;\n        else y2 = y02 + (y12 - y02) * (this.xmin - x02) / (x12 - x02), x2 = this.xmin;\n        if (c0) x02 = x2, y02 = y2, c0 = this._regioncode(x02, y02);\n        else x12 = x2, y12 = y2, c1 = this._regioncode(x12, y12);\n      }\n    }\n    _clipInfinite(i, points2, vx0, vy0, vxn, vyn) {\n      let P = Array.from(points2), p;\n      if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]);\n      if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]);\n      if (P = this._clipFinite(i, P)) {\n        for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) {\n          c0 = c1, c1 = this._edgecode(P[j], P[j + 1]);\n          if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length;\n        }\n      } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) {\n        P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax];\n      }\n      return P;\n    }\n    _edge(i, e0, e1, P, j) {\n      while (e0 !== e1) {\n        let x2, y2;\n        switch (e0) {\n          case 5:\n            e0 = 4;\n            continue;\n          // top-left\n          case 4:\n            e0 = 6, x2 = this.xmax, y2 = this.ymin;\n            break;\n          // top\n          case 6:\n            e0 = 2;\n            continue;\n          // top-right\n          case 2:\n            e0 = 10, x2 = this.xmax, y2 = this.ymax;\n            break;\n          // right\n          case 10:\n            e0 = 8;\n            continue;\n          // bottom-right\n          case 8:\n            e0 = 9, x2 = this.xmin, y2 = this.ymax;\n            break;\n          // bottom\n          case 9:\n            e0 = 1;\n            continue;\n          // bottom-left\n          case 1:\n            e0 = 5, x2 = this.xmin, y2 = this.ymin;\n            break;\n        }\n        if ((P[j] !== x2 || P[j + 1] !== y2) && this.contains(i, x2, y2)) {\n          P.splice(j, 0, x2, y2), j += 2;\n        }\n      }\n      return j;\n    }\n    _project(x02, y02, vx, vy) {\n      let t = Infinity, c2, x2, y2;\n      if (vy < 0) {\n        if (y02 <= this.ymin) return null;\n        if ((c2 = (this.ymin - y02) / vy) < t) y2 = this.ymin, x2 = x02 + (t = c2) * vx;\n      } else if (vy > 0) {\n        if (y02 >= this.ymax) return null;\n        if ((c2 = (this.ymax - y02) / vy) < t) y2 = this.ymax, x2 = x02 + (t = c2) * vx;\n      }\n      if (vx > 0) {\n        if (x02 >= this.xmax) return null;\n        if ((c2 = (this.xmax - x02) / vx) < t) x2 = this.xmax, y2 = y02 + (t = c2) * vy;\n      } else if (vx < 0) {\n        if (x02 <= this.xmin) return null;\n        if ((c2 = (this.xmin - x02) / vx) < t) x2 = this.xmin, y2 = y02 + (t = c2) * vy;\n      }\n      return [x2, y2];\n    }\n    _edgecode(x2, y2) {\n      return (x2 === this.xmin ? 1 : x2 === this.xmax ? 2 : 0) | (y2 === this.ymin ? 4 : y2 === this.ymax ? 8 : 0);\n    }\n    _regioncode(x2, y2) {\n      return (x2 < this.xmin ? 1 : x2 > this.xmax ? 2 : 0) | (y2 < this.ymin ? 4 : y2 > this.ymax ? 8 : 0);\n    }\n    _simplify(P) {\n      if (P && P.length > 4) {\n        for (let i = 0; i < P.length; i += 2) {\n          const j = (i + 2) % P.length, k = (i + 4) % P.length;\n          if (P[i] === P[j] && P[j] === P[k] || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) {\n            P.splice(j, 2), i -= 2;\n          }\n        }\n        if (!P.length) P = null;\n      }\n      return P;\n    }\n  };\n  const tau = 2 * Math.PI, pow = Math.pow;\n  function pointX(p) {\n    return p[0];\n  }\n  function pointY(p) {\n    return p[1];\n  }\n  function collinear(d) {\n    const { triangles, coords } = d;\n    for (let i = 0; i < triangles.length; i += 3) {\n      const a2 = 2 * triangles[i], b2 = 2 * triangles[i + 1], c2 = 2 * triangles[i + 2], cross2 = (coords[c2] - coords[a2]) * (coords[b2 + 1] - coords[a2 + 1]) - (coords[b2] - coords[a2]) * (coords[c2 + 1] - coords[a2 + 1]);\n      if (cross2 > 1e-10) return false;\n    }\n    return true;\n  }\n  function jitter(x2, y2, r) {\n    return [x2 + Math.sin(x2 + y2) * r, y2 + Math.cos(x2 - y2) * r];\n  }\n  class Delaunay {\n    static from(points2, fx = pointX, fy = pointY, that) {\n      return new Delaunay(\"length\" in points2 ? flatArray(points2, fx, fy, that) : Float64Array.from(flatIterable(points2, fx, fy, that)));\n    }\n    constructor(points2) {\n      this._delaunator = new Delaunator(points2);\n      this.inedges = new Int32Array(points2.length / 2);\n      this._hullIndex = new Int32Array(points2.length / 2);\n      this.points = this._delaunator.coords;\n      this._init();\n    }\n    update() {\n      this._delaunator.update();\n      this._init();\n      return this;\n    }\n    _init() {\n      const d = this._delaunator, points2 = this.points;\n      if (d.hull && d.hull.length > 2 && collinear(d)) {\n        this.collinear = Int32Array.from({ length: points2.length / 2 }, (_, i) => i).sort((i, j) => points2[2 * i] - points2[2 * j] || points2[2 * i + 1] - points2[2 * j + 1]);\n        const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], bounds2 = [points2[2 * e], points2[2 * e + 1], points2[2 * f], points2[2 * f + 1]], r = 1e-8 * Math.hypot(bounds2[3] - bounds2[1], bounds2[2] - bounds2[0]);\n        for (let i = 0, n = points2.length / 2; i < n; ++i) {\n          const p = jitter(points2[2 * i], points2[2 * i + 1], r);\n          points2[2 * i] = p[0];\n          points2[2 * i + 1] = p[1];\n        }\n        this._delaunator = new Delaunator(points2);\n      } else {\n        delete this.collinear;\n      }\n      const halfedges = this.halfedges = this._delaunator.halfedges;\n      const hull = this.hull = this._delaunator.hull;\n      const triangles = this.triangles = this._delaunator.triangles;\n      const inedges = this.inedges.fill(-1);\n      const hullIndex = this._hullIndex.fill(-1);\n      for (let e = 0, n = halfedges.length; e < n; ++e) {\n        const p = triangles[e % 3 === 2 ? e - 2 : e + 1];\n        if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e;\n      }\n      for (let i = 0, n = hull.length; i < n; ++i) {\n        hullIndex[hull[i]] = i;\n      }\n      if (hull.length <= 2 && hull.length > 0) {\n        this.triangles = new Int32Array(3).fill(-1);\n        this.halfedges = new Int32Array(3).fill(-1);\n        this.triangles[0] = hull[0];\n        inedges[hull[0]] = 1;\n        if (hull.length === 2) {\n          inedges[hull[1]] = 0;\n          this.triangles[1] = hull[1];\n          this.triangles[2] = hull[1];\n        }\n      }\n    }\n    voronoi(bounds2) {\n      return new Voronoi$1(this, bounds2);\n    }\n    *neighbors(i) {\n      const { inedges, hull, _hullIndex, halfedges, triangles, collinear: collinear2 } = this;\n      if (collinear2) {\n        const l = collinear2.indexOf(i);\n        if (l > 0) yield collinear2[l - 1];\n        if (l < collinear2.length - 1) yield collinear2[l + 1];\n        return;\n      }\n      const e0 = inedges[i];\n      if (e0 === -1) return;\n      let e = e0, p02 = -1;\n      do {\n        yield p02 = triangles[e];\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) return;\n        e = halfedges[e];\n        if (e === -1) {\n          const p = hull[(_hullIndex[i] + 1) % hull.length];\n          if (p !== p02) yield p;\n          return;\n        }\n      } while (e !== e0);\n    }\n    find(x2, y2, i = 0) {\n      if ((x2 = +x2, x2 !== x2) || (y2 = +y2, y2 !== y2)) return -1;\n      const i0 = i;\n      let c2;\n      while ((c2 = this._step(i, x2, y2)) >= 0 && c2 !== i && c2 !== i0) i = c2;\n      return c2;\n    }\n    _step(i, x2, y2) {\n      const { inedges, hull, _hullIndex, halfedges, triangles, points: points2 } = this;\n      if (inedges[i] === -1 || !points2.length) return (i + 1) % (points2.length >> 1);\n      let c2 = i;\n      let dc = pow(x2 - points2[i * 2], 2) + pow(y2 - points2[i * 2 + 1], 2);\n      const e0 = inedges[i];\n      let e = e0;\n      do {\n        let t = triangles[e];\n        const dt = pow(x2 - points2[t * 2], 2) + pow(y2 - points2[t * 2 + 1], 2);\n        if (dt < dc) dc = dt, c2 = t;\n        e = e % 3 === 2 ? e - 2 : e + 1;\n        if (triangles[e] !== i) break;\n        e = halfedges[e];\n        if (e === -1) {\n          e = hull[(_hullIndex[i] + 1) % hull.length];\n          if (e !== t) {\n            if (pow(x2 - points2[e * 2], 2) + pow(y2 - points2[e * 2 + 1], 2) < dc) return e;\n          }\n          break;\n        }\n      } while (e !== e0);\n      return c2;\n    }\n    render(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2, halfedges, triangles } = this;\n      for (let i = 0, n = halfedges.length; i < n; ++i) {\n        const j = halfedges[i];\n        if (j < i) continue;\n        const ti = triangles[i] * 2;\n        const tj = triangles[j] * 2;\n        context2.moveTo(points2[ti], points2[ti + 1]);\n        context2.lineTo(points2[tj], points2[tj + 1]);\n      }\n      this.renderHull(context2);\n      return buffer && buffer.value();\n    }\n    renderPoints(context2, r) {\n      if (r === void 0 && (!context2 || typeof context2.moveTo !== \"function\")) r = context2, context2 = null;\n      r = r == void 0 ? 2 : +r;\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2 } = this;\n      for (let i = 0, n = points2.length; i < n; i += 2) {\n        const x2 = points2[i], y2 = points2[i + 1];\n        context2.moveTo(x2 + r, y2);\n        context2.arc(x2, y2, r, 0, tau);\n      }\n      return buffer && buffer.value();\n    }\n    renderHull(context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { hull, points: points2 } = this;\n      const h2 = hull[0] * 2, n = hull.length;\n      context2.moveTo(points2[h2], points2[h2 + 1]);\n      for (let i = 1; i < n; ++i) {\n        const h3 = 2 * hull[i];\n        context2.lineTo(points2[h3], points2[h3 + 1]);\n      }\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    hullPolygon() {\n      const polygon = new Polygon();\n      this.renderHull(polygon);\n      return polygon.value();\n    }\n    renderTriangle(i, context2) {\n      const buffer = context2 == null ? context2 = new Path() : void 0;\n      const { points: points2, triangles } = this;\n      const t02 = triangles[i *= 3] * 2;\n      const t12 = triangles[i + 1] * 2;\n      const t22 = triangles[i + 2] * 2;\n      context2.moveTo(points2[t02], points2[t02 + 1]);\n      context2.lineTo(points2[t12], points2[t12 + 1]);\n      context2.lineTo(points2[t22], points2[t22 + 1]);\n      context2.closePath();\n      return buffer && buffer.value();\n    }\n    *trianglePolygons() {\n      const { triangles } = this;\n      for (let i = 0, n = triangles.length / 3; i < n; ++i) {\n        yield this.trianglePolygon(i);\n      }\n    }\n    trianglePolygon(i) {\n      const polygon = new Polygon();\n      this.renderTriangle(i, polygon);\n      return polygon.value();\n    }\n  }\n  function flatArray(points2, fx, fy, that) {\n    const n = points2.length;\n    const array2 = new Float64Array(n * 2);\n    for (let i = 0; i < n; ++i) {\n      const p = points2[i];\n      array2[i * 2] = fx.call(that, p, i, points2);\n      array2[i * 2 + 1] = fy.call(that, p, i, points2);\n    }\n    return array2;\n  }\n  function* flatIterable(points2, fx, fy, that) {\n    let i = 0;\n    for (const p of points2) {\n      yield fx.call(that, p, i, points2);\n      yield fy.call(that, p, i, points2);\n      ++i;\n    }\n  }\n  function Voronoi(params2) {\n    Transform.call(this, null, params2);\n  }\n  Voronoi.Definition = {\n    \"type\": \"Voronoi\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"x\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"y\",\n      \"type\": \"field\",\n      \"required\": true\n    }, {\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"extent\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"length\": 2,\n      \"default\": [[-1e5, -1e5], [1e5, 1e5]],\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"default\": \"path\"\n    }]\n  };\n  const defaultExtent = [-1e5, -1e5, 1e5, 1e5];\n  inherits(Voronoi, Transform, {\n    transform(_, pulse2) {\n      const as = _.as || \"path\", data2 = pulse2.source;\n      if (!data2 || !data2.length) return pulse2;\n      let s = _.size;\n      s = s ? [0, 0, s[0], s[1]] : (s = _.extent) ? [s[0][0], s[0][1], s[1][0], s[1][1]] : defaultExtent;\n      const voronoi2 = this.value = Delaunay.from(data2, _.x, _.y).voronoi(s);\n      for (let i = 0, n = data2.length; i < n; ++i) {\n        const polygon = voronoi2.cellPolygon(i);\n        data2[i][as] = polygon && !isPoint(polygon) ? toPathString(polygon) : null;\n      }\n      return pulse2.reflow(_.modified()).modifies(as);\n    }\n  });\n  function toPathString(p) {\n    const x2 = p[0][0], y2 = p[0][1];\n    let n = p.length - 1;\n    for (; p[n][0] === x2 && p[n][1] === y2; --n) ;\n    return \"M\" + p.slice(0, n + 1).join(\"L\") + \"Z\";\n  }\n  function isPoint(p) {\n    return p.length === 2 && p[0][0] === p[1][0] && p[0][1] === p[1][1];\n  }\n  const voronoi = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    voronoi: Voronoi\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  var cloudRadians = Math.PI / 180, cw = 1 << 11 >> 5, ch = 1 << 11;\n  function cloud() {\n    var size = [256, 256], text2, font2, fontSize2, fontStyle, fontWeight, rotate2, padding2, spiral = archimedeanSpiral, words = [], random2 = Math.random, cloud2 = {};\n    cloud2.layout = function() {\n      var contextAndRatio = getContext2(domCanvas()), board = zeroArray((size[0] >> 5) * size[1]), bounds2 = null, n = words.length, i = -1, tags = [], data2 = words.map((d2) => ({\n        text: text2(d2),\n        font: font2(d2),\n        style: fontStyle(d2),\n        weight: fontWeight(d2),\n        rotate: rotate2(d2),\n        size: ~~(fontSize2(d2) + 1e-14),\n        padding: padding2(d2),\n        xoff: 0,\n        yoff: 0,\n        x1: 0,\n        y1: 0,\n        x0: 0,\n        y0: 0,\n        hasText: false,\n        sprite: null,\n        datum: d2\n      })).sort((a2, b2) => b2.size - a2.size);\n      while (++i < n) {\n        var d = data2[i];\n        d.x = size[0] * (random2() + 0.5) >> 1;\n        d.y = size[1] * (random2() + 0.5) >> 1;\n        cloudSprite(contextAndRatio, d, data2, i);\n        if (d.hasText && place2(board, d, bounds2)) {\n          tags.push(d);\n          if (bounds2) cloudBounds(bounds2, d);\n          else bounds2 = [{\n            x: d.x + d.x0,\n            y: d.y + d.y0\n          }, {\n            x: d.x + d.x1,\n            y: d.y + d.y1\n          }];\n          d.x -= size[0] >> 1;\n          d.y -= size[1] >> 1;\n        }\n      }\n      return tags;\n    };\n    function getContext2(canvas) {\n      canvas.width = canvas.height = 1;\n      var ratio = Math.sqrt(canvas.getContext(\"2d\").getImageData(0, 0, 1, 1).data.length >> 2);\n      canvas.width = (cw << 5) / ratio;\n      canvas.height = ch / ratio;\n      var context2 = canvas.getContext(\"2d\");\n      context2.fillStyle = context2.strokeStyle = \"red\";\n      context2.textAlign = \"center\";\n      return {\n        context: context2,\n        ratio\n      };\n    }\n    function place2(board, tag, bounds2) {\n      var startX = tag.x, startY = tag.y, maxDelta = Math.hypot(size[0], size[1]), s = spiral(size), dt = random2() < 0.5 ? 1 : -1, t = -dt, dxdy, dx, dy;\n      while (dxdy = s(t += dt)) {\n        dx = ~~dxdy[0];\n        dy = ~~dxdy[1];\n        if (Math.min(Math.abs(dx), Math.abs(dy)) >= maxDelta) break;\n        tag.x = startX + dx;\n        tag.y = startY + dy;\n        if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 || tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue;\n        if (!bounds2 || !cloudCollide(tag, board, size[0])) {\n          if (!bounds2 || collideRects(tag, bounds2)) {\n            var sprite = tag.sprite, w2 = tag.width >> 5, sw = size[0] >> 5, lx2 = tag.x - (w2 << 4), sx = lx2 & 127, msx = 32 - sx, h2 = tag.y1 - tag.y0, x2 = (tag.y + tag.y0) * sw + (lx2 >> 5), last;\n            for (var j = 0; j < h2; j++) {\n              last = 0;\n              for (var i = 0; i <= w2; i++) {\n                board[x2 + i] |= last << msx | (i < w2 ? (last = sprite[j * w2 + i]) >>> sx : 0);\n              }\n              x2 += sw;\n            }\n            tag.sprite = null;\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n    cloud2.words = function(_) {\n      if (arguments.length) {\n        words = _;\n        return cloud2;\n      } else {\n        return words;\n      }\n    };\n    cloud2.size = function(_) {\n      if (arguments.length) {\n        size = [+_[0], +_[1]];\n        return cloud2;\n      } else {\n        return size;\n      }\n    };\n    cloud2.font = function(_) {\n      if (arguments.length) {\n        font2 = functor(_);\n        return cloud2;\n      } else {\n        return font2;\n      }\n    };\n    cloud2.fontStyle = function(_) {\n      if (arguments.length) {\n        fontStyle = functor(_);\n        return cloud2;\n      } else {\n        return fontStyle;\n      }\n    };\n    cloud2.fontWeight = function(_) {\n      if (arguments.length) {\n        fontWeight = functor(_);\n        return cloud2;\n      } else {\n        return fontWeight;\n      }\n    };\n    cloud2.rotate = function(_) {\n      if (arguments.length) {\n        rotate2 = functor(_);\n        return cloud2;\n      } else {\n        return rotate2;\n      }\n    };\n    cloud2.text = function(_) {\n      if (arguments.length) {\n        text2 = functor(_);\n        return cloud2;\n      } else {\n        return text2;\n      }\n    };\n    cloud2.spiral = function(_) {\n      if (arguments.length) {\n        spiral = spirals[_] || _;\n        return cloud2;\n      } else {\n        return spiral;\n      }\n    };\n    cloud2.fontSize = function(_) {\n      if (arguments.length) {\n        fontSize2 = functor(_);\n        return cloud2;\n      } else {\n        return fontSize2;\n      }\n    };\n    cloud2.padding = function(_) {\n      if (arguments.length) {\n        padding2 = functor(_);\n        return cloud2;\n      } else {\n        return padding2;\n      }\n    };\n    cloud2.random = function(_) {\n      if (arguments.length) {\n        random2 = _;\n        return cloud2;\n      } else {\n        return random2;\n      }\n    };\n    return cloud2;\n  }\n  function cloudSprite(contextAndRatio, d, data2, di) {\n    if (d.sprite) return;\n    var c2 = contextAndRatio.context, ratio = contextAndRatio.ratio;\n    c2.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);\n    var x2 = 0, y2 = 0, maxh = 0, n = data2.length, w2, w32, h2, i, j;\n    --di;\n    while (++di < n) {\n      d = data2[di];\n      c2.save();\n      c2.font = d.style + \" \" + d.weight + \" \" + ~~((d.size + 1) / ratio) + \"px \" + d.font;\n      w2 = c2.measureText(d.text + \"m\").width * ratio;\n      h2 = d.size << 1;\n      if (d.rotate) {\n        var sr = Math.sin(d.rotate * cloudRadians), cr2 = Math.cos(d.rotate * cloudRadians), wcr = w2 * cr2, wsr = w2 * sr, hcr = h2 * cr2, hsr = h2 * sr;\n        w2 = Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 31 >> 5 << 5;\n        h2 = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));\n      } else {\n        w2 = w2 + 31 >> 5 << 5;\n      }\n      if (h2 > maxh) maxh = h2;\n      if (x2 + w2 >= cw << 5) {\n        x2 = 0;\n        y2 += maxh;\n        maxh = 0;\n      }\n      if (y2 + h2 >= ch) break;\n      c2.translate((x2 + (w2 >> 1)) / ratio, (y2 + (h2 >> 1)) / ratio);\n      if (d.rotate) c2.rotate(d.rotate * cloudRadians);\n      c2.fillText(d.text, 0, 0);\n      if (d.padding) {\n        c2.lineWidth = 2 * d.padding;\n        c2.strokeText(d.text, 0, 0);\n      }\n      c2.restore();\n      d.width = w2;\n      d.height = h2;\n      d.xoff = x2;\n      d.yoff = y2;\n      d.x1 = w2 >> 1;\n      d.y1 = h2 >> 1;\n      d.x0 = -d.x1;\n      d.y0 = -d.y1;\n      d.hasText = true;\n      x2 += w2;\n    }\n    var pixels = c2.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data, sprite = [];\n    while (--di >= 0) {\n      d = data2[di];\n      if (!d.hasText) continue;\n      w2 = d.width;\n      w32 = w2 >> 5;\n      h2 = d.y1 - d.y0;\n      for (i = 0; i < h2 * w32; i++) sprite[i] = 0;\n      x2 = d.xoff;\n      if (x2 == null) return;\n      y2 = d.yoff;\n      var seen = 0, seenRow = -1;\n      for (j = 0; j < h2; j++) {\n        for (i = 0; i < w2; i++) {\n          var k = w32 * j + (i >> 5), m2 = pixels[(y2 + j) * (cw << 5) + (x2 + i) << 2] ? 1 << 31 - i % 32 : 0;\n          sprite[k] |= m2;\n          seen |= m2;\n        }\n        if (seen) seenRow = j;\n        else {\n          d.y0++;\n          h2--;\n          j--;\n          y2++;\n        }\n      }\n      d.y1 = d.y0 + seenRow;\n      d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32);\n    }\n  }\n  function cloudCollide(tag, board, sw) {\n    sw >>= 5;\n    var sprite = tag.sprite, w2 = tag.width >> 5, lx2 = tag.x - (w2 << 4), sx = lx2 & 127, msx = 32 - sx, h2 = tag.y1 - tag.y0, x2 = (tag.y + tag.y0) * sw + (lx2 >> 5), last;\n    for (var j = 0; j < h2; j++) {\n      last = 0;\n      for (var i = 0; i <= w2; i++) {\n        if ((last << msx | (i < w2 ? (last = sprite[j * w2 + i]) >>> sx : 0)) & board[x2 + i]) return true;\n      }\n      x2 += sw;\n    }\n    return false;\n  }\n  function cloudBounds(bounds2, d) {\n    var b0 = bounds2[0], b1 = bounds2[1];\n    if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0;\n    if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0;\n    if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1;\n    if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1;\n  }\n  function collideRects(a2, b2) {\n    return a2.x + a2.x1 > b2[0].x && a2.x + a2.x0 < b2[1].x && a2.y + a2.y1 > b2[0].y && a2.y + a2.y0 < b2[1].y;\n  }\n  function archimedeanSpiral(size) {\n    var e = size[0] / size[1];\n    return function(t) {\n      return [e * (t *= 0.1) * Math.cos(t), t * Math.sin(t)];\n    };\n  }\n  function rectangularSpiral(size) {\n    var dy = 4, dx = dy * size[0] / size[1], x2 = 0, y2 = 0;\n    return function(t) {\n      var sign2 = t < 0 ? -1 : 1;\n      switch (Math.sqrt(1 + 4 * sign2 * t) - sign2 & 3) {\n        case 0:\n          x2 += dx;\n          break;\n        case 1:\n          y2 += dy;\n          break;\n        case 2:\n          x2 -= dx;\n          break;\n        default:\n          y2 -= dy;\n          break;\n      }\n      return [x2, y2];\n    };\n  }\n  function zeroArray(n) {\n    var a2 = [], i = -1;\n    while (++i < n) a2[i] = 0;\n    return a2;\n  }\n  function functor(d) {\n    return typeof d === \"function\" ? d : function() {\n      return d;\n    };\n  }\n  var spirals = {\n    archimedean: archimedeanSpiral,\n    rectangular: rectangularSpiral\n  };\n  const Output = [\"x\", \"y\", \"font\", \"fontSize\", \"fontStyle\", \"fontWeight\", \"angle\"];\n  const Params$1 = [\"text\", \"font\", \"rotate\", \"fontSize\", \"fontStyle\", \"fontWeight\"];\n  function Wordcloud(params2) {\n    Transform.call(this, cloud(), params2);\n  }\n  Wordcloud.Definition = {\n    \"type\": \"Wordcloud\",\n    \"metadata\": {\n      \"modifies\": true\n    },\n    \"params\": [{\n      \"name\": \"size\",\n      \"type\": \"number\",\n      \"array\": true,\n      \"length\": 2\n    }, {\n      \"name\": \"font\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"sans-serif\"\n    }, {\n      \"name\": \"fontStyle\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"normal\"\n    }, {\n      \"name\": \"fontWeight\",\n      \"type\": \"string\",\n      \"expr\": true,\n      \"default\": \"normal\"\n    }, {\n      \"name\": \"fontSize\",\n      \"type\": \"number\",\n      \"expr\": true,\n      \"default\": 14\n    }, {\n      \"name\": \"fontSizeRange\",\n      \"type\": \"number\",\n      \"array\": \"nullable\",\n      \"default\": [10, 50]\n    }, {\n      \"name\": \"rotate\",\n      \"type\": \"number\",\n      \"expr\": true,\n      \"default\": 0\n    }, {\n      \"name\": \"text\",\n      \"type\": \"field\"\n    }, {\n      \"name\": \"spiral\",\n      \"type\": \"string\",\n      \"values\": [\"archimedean\", \"rectangular\"]\n    }, {\n      \"name\": \"padding\",\n      \"type\": \"number\",\n      \"expr\": true\n    }, {\n      \"name\": \"as\",\n      \"type\": \"string\",\n      \"array\": true,\n      \"length\": 7,\n      \"default\": Output\n    }]\n  };\n  inherits(Wordcloud, Transform, {\n    transform(_, pulse2) {\n      if (_.size && !(_.size[0] && _.size[1])) {\n        error(\"Wordcloud size dimensions must be non-zero.\");\n      }\n      function modp(param2) {\n        const p = _[param2];\n        return isFunction(p) && pulse2.modified(p.fields);\n      }\n      const mod = _.modified();\n      if (!(mod || pulse2.changed(pulse2.ADD_REM) || Params$1.some(modp))) return;\n      const data2 = pulse2.materialize(pulse2.SOURCE).source, layout = this.value, as = _.as || Output;\n      let fontSize2 = _.fontSize || 14, range2;\n      isFunction(fontSize2) ? range2 = _.fontSizeRange : fontSize2 = constant$5(fontSize2);\n      if (range2) {\n        const fsize = fontSize2, sizeScale = scale$6(\"sqrt\")().domain(extent(data2, fsize)).range(range2);\n        fontSize2 = (x2) => sizeScale(fsize(x2));\n      }\n      data2.forEach((t) => {\n        t[as[0]] = NaN;\n        t[as[1]] = NaN;\n        t[as[3]] = 0;\n      });\n      const words = layout.words(data2).text(_.text).size(_.size || [500, 500]).padding(_.padding || 1).spiral(_.spiral || \"archimedean\").rotate(_.rotate || 0).font(_.font || \"sans-serif\").fontStyle(_.fontStyle || \"normal\").fontWeight(_.fontWeight || \"normal\").fontSize(fontSize2).random(random).layout();\n      const size = layout.size(), dx = size[0] >> 1, dy = size[1] >> 1, n = words.length;\n      for (let i = 0, w2, t; i < n; ++i) {\n        w2 = words[i];\n        t = w2.datum;\n        t[as[0]] = w2.x + dx;\n        t[as[1]] = w2.y + dy;\n        t[as[2]] = w2.font;\n        t[as[3]] = w2.size;\n        t[as[4]] = w2.style;\n        t[as[5]] = w2.weight;\n        t[as[6]] = w2.rotate;\n      }\n      return pulse2.reflow(mod).modifies(as);\n    }\n  });\n  const wordcloud = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    wordcloud: Wordcloud\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const array8 = (n) => new Uint8Array(n);\n  const array16 = (n) => new Uint16Array(n);\n  const array32 = (n) => new Uint32Array(n);\n  function Bitmaps() {\n    let width2 = 8, data2 = [], seen = array32(0), curr = array$1(0, width2), prev = array$1(0, width2);\n    return {\n      data: () => data2,\n      seen: () => seen = lengthen(seen, data2.length),\n      add(array2) {\n        for (let i = 0, j = data2.length, n = array2.length, t; i < n; ++i) {\n          t = array2[i];\n          t._index = j++;\n          data2.push(t);\n        }\n      },\n      remove(num, map2) {\n        const n = data2.length, copy2 = Array(n - num), reindex = data2;\n        let t, i, j;\n        for (i = 0; !map2[i] && i < n; ++i) {\n          copy2[i] = data2[i];\n          reindex[i] = i;\n        }\n        for (j = i; i < n; ++i) {\n          t = data2[i];\n          if (!map2[i]) {\n            reindex[i] = j;\n            curr[j] = curr[i];\n            prev[j] = prev[i];\n            copy2[j] = t;\n            t._index = j++;\n          } else {\n            reindex[i] = -1;\n          }\n          curr[i] = 0;\n        }\n        data2 = copy2;\n        return reindex;\n      },\n      size: () => data2.length,\n      curr: () => curr,\n      prev: () => prev,\n      reset: (k) => prev[k] = curr[k],\n      all: () => width2 < 257 ? 255 : width2 < 65537 ? 65535 : 4294967295,\n      set(k, one2) {\n        curr[k] |= one2;\n      },\n      clear(k, one2) {\n        curr[k] &= ~one2;\n      },\n      resize(n, m2) {\n        const k = curr.length;\n        if (n > k || m2 > width2) {\n          width2 = Math.max(m2, width2);\n          curr = array$1(n, width2, curr);\n          prev = array$1(n, width2);\n        }\n      }\n    };\n  }\n  function lengthen(array2, length2, copy2) {\n    if (array2.length >= length2) return array2;\n    copy2 = copy2 || new array2.constructor(length2);\n    copy2.set(array2);\n    return copy2;\n  }\n  function array$1(n, m2, array2) {\n    const copy2 = (m2 < 257 ? array8 : m2 < 65537 ? array16 : array32)(n);\n    if (array2) copy2.set(array2);\n    return copy2;\n  }\n  function Dimension(index2, i, query) {\n    const bit = 1 << i;\n    return {\n      one: bit,\n      zero: ~bit,\n      range: query.slice(),\n      bisect: index2.bisect,\n      index: index2.index,\n      size: index2.size,\n      onAdd(added, curr) {\n        const dim = this, range2 = dim.bisect(dim.range, added.value), idx = added.index, lo = range2[0], hi = range2[1], n1 = idx.length;\n        let i2;\n        for (i2 = 0; i2 < lo; ++i2) curr[idx[i2]] |= bit;\n        for (i2 = hi; i2 < n1; ++i2) curr[idx[i2]] |= bit;\n        return dim;\n      }\n    };\n  }\n  function SortedIndex() {\n    let index2 = array32(0), value2 = [], size = 0;\n    function insert2(key2, data2, base2) {\n      if (!data2.length) return [];\n      const n0 = size, n1 = data2.length, addi = array32(n1);\n      let addv = Array(n1), oldv, oldi, i;\n      for (i = 0; i < n1; ++i) {\n        addv[i] = key2(data2[i]);\n        addi[i] = i;\n      }\n      addv = sort$1(addv, addi);\n      if (n0) {\n        oldv = value2;\n        oldi = index2;\n        value2 = Array(n0 + n1);\n        index2 = array32(n0 + n1);\n        merge$1(base2, oldv, oldi, n0, addv, addi, n1, value2, index2);\n      } else {\n        if (base2 > 0) for (i = 0; i < n1; ++i) {\n          addi[i] += base2;\n        }\n        value2 = addv;\n        index2 = addi;\n      }\n      size = n0 + n1;\n      return {\n        index: addi,\n        value: addv\n      };\n    }\n    function remove2(num, map2) {\n      const n = size;\n      let idx, i, j;\n      for (i = 0; !map2[index2[i]] && i < n; ++i) ;\n      for (j = i; i < n; ++i) {\n        if (!map2[idx = index2[i]]) {\n          index2[j] = idx;\n          value2[j] = value2[i];\n          ++j;\n        }\n      }\n      size = n - num;\n    }\n    function reindex(map2) {\n      for (let i = 0, n = size; i < n; ++i) {\n        index2[i] = map2[index2[i]];\n      }\n    }\n    function bisect2(range2, array2) {\n      let n;\n      if (array2) {\n        n = array2.length;\n      } else {\n        array2 = value2;\n        n = size;\n      }\n      return [bisectLeft$1(array2, range2[0], 0, n), bisectRight$1(array2, range2[1], 0, n)];\n    }\n    return {\n      insert: insert2,\n      remove: remove2,\n      bisect: bisect2,\n      reindex,\n      index: () => index2,\n      size: () => size\n    };\n  }\n  function sort$1(values2, index2) {\n    values2.sort.call(index2, (a2, b2) => {\n      const x2 = values2[a2], y2 = values2[b2];\n      return x2 < y2 ? -1 : x2 > y2 ? 1 : 0;\n    });\n    return permute(values2, index2);\n  }\n  function merge$1(base2, value0, index0, n0, value1, index1, n1, value2, index2) {\n    let i0 = 0, i1 = 0, i;\n    for (i = 0; i0 < n0 && i1 < n1; ++i) {\n      if (value0[i0] < value1[i1]) {\n        value2[i] = value0[i0];\n        index2[i] = index0[i0++];\n      } else {\n        value2[i] = value1[i1];\n        index2[i] = index1[i1++] + base2;\n      }\n    }\n    for (; i0 < n0; ++i0, ++i) {\n      value2[i] = value0[i0];\n      index2[i] = index0[i0];\n    }\n    for (; i1 < n1; ++i1, ++i) {\n      value2[i] = value1[i1];\n      index2[i] = index1[i1] + base2;\n    }\n  }\n  function CrossFilter(params2) {\n    Transform.call(this, Bitmaps(), params2);\n    this._indices = null;\n    this._dims = null;\n  }\n  CrossFilter.Definition = {\n    \"type\": \"CrossFilter\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"fields\",\n      \"type\": \"field\",\n      \"array\": true,\n      \"required\": true\n    }, {\n      \"name\": \"query\",\n      \"type\": \"array\",\n      \"array\": true,\n      \"required\": true,\n      \"content\": {\n        \"type\": \"number\",\n        \"array\": true,\n        \"length\": 2\n      }\n    }]\n  };\n  inherits(CrossFilter, Transform, {\n    transform(_, pulse2) {\n      if (!this._dims) {\n        return this.init(_, pulse2);\n      } else {\n        var init2 = _.modified(\"fields\") || _.fields.some((f) => pulse2.modified(f.fields));\n        return init2 ? this.reinit(_, pulse2) : this.eval(_, pulse2);\n      }\n    },\n    init(_, pulse2) {\n      const fields = _.fields, query = _.query, indices = this._indices = {}, dims = this._dims = [], m2 = query.length;\n      let i = 0, key2, index2;\n      for (; i < m2; ++i) {\n        key2 = fields[i].fname;\n        index2 = indices[key2] || (indices[key2] = SortedIndex());\n        dims.push(Dimension(index2, i, query[i]));\n      }\n      return this.eval(_, pulse2);\n    },\n    reinit(_, pulse2) {\n      const output2 = pulse2.materialize().fork(), fields = _.fields, query = _.query, indices = this._indices, dims = this._dims, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), out = output2.rem = output2.add, mod = output2.mod, m2 = query.length, adds = {};\n      let add2, index2, key2, mods, remMap, modMap, i, n, f;\n      prev.set(curr);\n      if (pulse2.rem.length) {\n        remMap = this.remove(_, pulse2, output2);\n      }\n      if (pulse2.add.length) {\n        bits.add(pulse2.add);\n      }\n      if (pulse2.mod.length) {\n        modMap = {};\n        for (mods = pulse2.mod, i = 0, n = mods.length; i < n; ++i) {\n          modMap[mods[i]._index] = 1;\n        }\n      }\n      for (i = 0; i < m2; ++i) {\n        f = fields[i];\n        if (!dims[i] || _.modified(\"fields\", i) || pulse2.modified(f.fields)) {\n          key2 = f.fname;\n          if (!(add2 = adds[key2])) {\n            indices[key2] = index2 = SortedIndex();\n            adds[key2] = add2 = index2.insert(f, pulse2.source, 0);\n          }\n          dims[i] = Dimension(index2, i, query[i]).onAdd(add2, curr);\n        }\n      }\n      for (i = 0, n = bits.data().length; i < n; ++i) {\n        if (remMap[i]) {\n          continue;\n        } else if (prev[i] !== curr[i]) {\n          out.push(i);\n        } else if (modMap[i] && curr[i] !== all) {\n          mod.push(i);\n        }\n      }\n      bits.mask = (1 << m2) - 1;\n      return output2;\n    },\n    eval(_, pulse2) {\n      const output2 = pulse2.materialize().fork(), m2 = this._dims.length;\n      let mask = 0;\n      if (pulse2.rem.length) {\n        this.remove(_, pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      if (_.modified(\"query\") && !_.modified(\"fields\")) {\n        mask |= this.update(_, pulse2, output2);\n      }\n      if (pulse2.add.length) {\n        this.insert(_, pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      if (pulse2.mod.length) {\n        this.modify(pulse2, output2);\n        mask |= (1 << m2) - 1;\n      }\n      this.value.mask = mask;\n      return output2;\n    },\n    insert(_, pulse2, output2) {\n      const tuples = pulse2.add, bits = this.value, dims = this._dims, indices = this._indices, fields = _.fields, adds = {}, out = output2.add, n = bits.size() + tuples.length, m2 = dims.length;\n      let k = bits.size(), j, key2, add2;\n      bits.resize(n, m2);\n      bits.add(tuples);\n      const curr = bits.curr(), prev = bits.prev(), all = bits.all();\n      for (j = 0; j < m2; ++j) {\n        key2 = fields[j].fname;\n        add2 = adds[key2] || (adds[key2] = indices[key2].insert(fields[j], tuples, k));\n        dims[j].onAdd(add2, curr);\n      }\n      for (; k < n; ++k) {\n        prev[k] = all;\n        if (curr[k] !== all) out.push(k);\n      }\n    },\n    modify(pulse2, output2) {\n      const out = output2.mod, bits = this.value, curr = bits.curr(), all = bits.all(), tuples = pulse2.mod;\n      let i, n, k;\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        k = tuples[i]._index;\n        if (curr[k] !== all) out.push(k);\n      }\n    },\n    remove(_, pulse2, output2) {\n      const indices = this._indices, bits = this.value, curr = bits.curr(), prev = bits.prev(), all = bits.all(), map2 = {}, out = output2.rem, tuples = pulse2.rem;\n      let i, n, k, f;\n      for (i = 0, n = tuples.length; i < n; ++i) {\n        k = tuples[i]._index;\n        map2[k] = 1;\n        prev[k] = f = curr[k];\n        curr[k] = all;\n        if (f !== all) out.push(k);\n      }\n      for (k in indices) {\n        indices[k].remove(n, map2);\n      }\n      this.reindex(pulse2, n, map2);\n      return map2;\n    },\n    // reindex filters and indices after propagation completes\n    reindex(pulse2, num, map2) {\n      const indices = this._indices, bits = this.value;\n      pulse2.runAfter(() => {\n        const indexMap = bits.remove(num, map2);\n        for (const key2 in indices) indices[key2].reindex(indexMap);\n      });\n    },\n    update(_, pulse2, output2) {\n      const dims = this._dims, query = _.query, stamp = pulse2.stamp, m2 = dims.length;\n      let mask = 0, i, q;\n      output2.filters = 0;\n      for (q = 0; q < m2; ++q) {\n        if (_.modified(\"query\", q)) {\n          i = q;\n          ++mask;\n        }\n      }\n      if (mask === 1) {\n        mask = dims[i].one;\n        this.incrementOne(dims[i], query[i], output2.add, output2.rem);\n      } else {\n        for (q = 0, mask = 0; q < m2; ++q) {\n          if (!_.modified(\"query\", q)) continue;\n          mask |= dims[q].one;\n          this.incrementAll(dims[q], query[q], stamp, output2.add);\n          output2.rem = output2.add;\n        }\n      }\n      return mask;\n    },\n    incrementAll(dim, query, stamp, out) {\n      const bits = this.value, seen = bits.seen(), curr = bits.curr(), prev = bits.prev(), index2 = dim.index(), old = dim.bisect(dim.range), range2 = dim.bisect(query), lo1 = range2[0], hi1 = range2[1], lo0 = old[0], hi0 = old[1], one2 = dim.one;\n      let i, j, k;\n      if (lo1 < lo0) {\n        for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      } else if (lo1 > lo0) {\n        for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      }\n      if (hi1 > hi0) {\n        for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      } else if (hi1 < hi0) {\n        for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n          k = index2[i];\n          if (seen[k] !== stamp) {\n            prev[k] = curr[k];\n            seen[k] = stamp;\n            out.push(k);\n          }\n          curr[k] ^= one2;\n        }\n      }\n      dim.range = query.slice();\n    },\n    incrementOne(dim, query, add2, rem2) {\n      const bits = this.value, curr = bits.curr(), index2 = dim.index(), old = dim.bisect(dim.range), range2 = dim.bisect(query), lo1 = range2[0], hi1 = range2[1], lo0 = old[0], hi0 = old[1], one2 = dim.one;\n      let i, j, k;\n      if (lo1 < lo0) {\n        for (i = lo1, j = Math.min(lo0, hi1); i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          add2.push(k);\n        }\n      } else if (lo1 > lo0) {\n        for (i = lo0, j = Math.min(lo1, hi0); i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          rem2.push(k);\n        }\n      }\n      if (hi1 > hi0) {\n        for (i = Math.max(lo1, hi0), j = hi1; i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          add2.push(k);\n        }\n      } else if (hi1 < hi0) {\n        for (i = Math.max(lo0, hi1), j = hi0; i < j; ++i) {\n          k = index2[i];\n          curr[k] ^= one2;\n          rem2.push(k);\n        }\n      }\n      dim.range = query.slice();\n    }\n  });\n  function ResolveFilter(params2) {\n    Transform.call(this, null, params2);\n  }\n  ResolveFilter.Definition = {\n    \"type\": \"ResolveFilter\",\n    \"metadata\": {},\n    \"params\": [{\n      \"name\": \"ignore\",\n      \"type\": \"number\",\n      \"required\": true,\n      \"description\": \"A bit mask indicating which filters to ignore.\"\n    }, {\n      \"name\": \"filter\",\n      \"type\": \"object\",\n      \"required\": true,\n      \"description\": \"Per-tuple filter bitmaps from a CrossFilter transform.\"\n    }]\n  };\n  inherits(ResolveFilter, Transform, {\n    transform(_, pulse2) {\n      const ignore = ~(_.ignore || 0), bitmap = _.filter, mask = bitmap.mask;\n      if ((mask & ignore) === 0) return pulse2.StopPropagation;\n      const output2 = pulse2.fork(pulse2.ALL), data2 = bitmap.data(), curr = bitmap.curr(), prev = bitmap.prev(), pass = (k) => !(curr[k] & ignore) ? data2[k] : null;\n      output2.filter(output2.MOD, pass);\n      if (!(mask & mask - 1)) {\n        output2.filter(output2.ADD, pass);\n        output2.filter(output2.REM, (k) => (curr[k] & ignore) === mask ? data2[k] : null);\n      } else {\n        output2.filter(output2.ADD, (k) => {\n          const c2 = curr[k] & ignore, f = !c2 && c2 ^ prev[k] & ignore;\n          return f ? data2[k] : null;\n        });\n        output2.filter(output2.REM, (k) => {\n          const c2 = curr[k] & ignore, f = c2 && !(c2 ^ (c2 ^ prev[k] & ignore));\n          return f ? data2[k] : null;\n        });\n      }\n      return output2.filter(output2.SOURCE, (t) => pass(t._index));\n    }\n  });\n  const xf = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    crossfilter: CrossFilter,\n    resolvefilter: ResolveFilter\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const RawCode = \"RawCode\";\n  const Literal = \"Literal\";\n  const Property = \"Property\";\n  const Identifier = \"Identifier\";\n  const ArrayExpression = \"ArrayExpression\";\n  const BinaryExpression = \"BinaryExpression\";\n  const CallExpression = \"CallExpression\";\n  const ConditionalExpression = \"ConditionalExpression\";\n  const LogicalExpression = \"LogicalExpression\";\n  const MemberExpression = \"MemberExpression\";\n  const ObjectExpression = \"ObjectExpression\";\n  const UnaryExpression = \"UnaryExpression\";\n  function ASTNode(type2) {\n    this.type = type2;\n  }\n  ASTNode.prototype.visit = function(visitor) {\n    let c2, i, n;\n    if (visitor(this)) return 1;\n    for (c2 = children(this), i = 0, n = c2.length; i < n; ++i) {\n      if (c2[i].visit(visitor)) return 1;\n    }\n  };\n  function children(node) {\n    switch (node.type) {\n      case ArrayExpression:\n        return node.elements;\n      case BinaryExpression:\n      case LogicalExpression:\n        return [node.left, node.right];\n      case CallExpression:\n        return [node.callee].concat(node.arguments);\n      case ConditionalExpression:\n        return [node.test, node.consequent, node.alternate];\n      case MemberExpression:\n        return [node.object, node.property];\n      case ObjectExpression:\n        return node.properties;\n      case Property:\n        return [node.key, node.value];\n      case UnaryExpression:\n        return [node.argument];\n      case Identifier:\n      case Literal:\n      case RawCode:\n      default:\n        return [];\n    }\n  }\n  var TokenName, source, index, length$1, lookahead;\n  var TokenBooleanLiteral = 1, TokenEOF = 2, TokenIdentifier = 3, TokenKeyword = 4, TokenNullLiteral = 5, TokenNumericLiteral = 6, TokenPunctuator = 7, TokenStringLiteral = 8, TokenRegularExpression = 9;\n  TokenName = {};\n  TokenName[TokenBooleanLiteral] = \"Boolean\";\n  TokenName[TokenEOF] = \"<end>\";\n  TokenName[TokenIdentifier] = \"Identifier\";\n  TokenName[TokenKeyword] = \"Keyword\";\n  TokenName[TokenNullLiteral] = \"Null\";\n  TokenName[TokenNumericLiteral] = \"Numeric\";\n  TokenName[TokenPunctuator] = \"Punctuator\";\n  TokenName[TokenStringLiteral] = \"String\";\n  TokenName[TokenRegularExpression] = \"RegularExpression\";\n  var SyntaxArrayExpression = \"ArrayExpression\", SyntaxBinaryExpression = \"BinaryExpression\", SyntaxCallExpression = \"CallExpression\", SyntaxConditionalExpression = \"ConditionalExpression\", SyntaxIdentifier = \"Identifier\", SyntaxLiteral = \"Literal\", SyntaxLogicalExpression = \"LogicalExpression\", SyntaxMemberExpression = \"MemberExpression\", SyntaxObjectExpression = \"ObjectExpression\", SyntaxProperty = \"Property\", SyntaxUnaryExpression = \"UnaryExpression\";\n  var MessageUnexpectedToken = \"Unexpected token %0\", MessageUnexpectedNumber = \"Unexpected number\", MessageUnexpectedString = \"Unexpected string\", MessageUnexpectedIdentifier = \"Unexpected identifier\", MessageUnexpectedReserved = \"Unexpected reserved word\", MessageUnexpectedEOS = \"Unexpected end of input\", MessageInvalidRegExp = \"Invalid regular expression\", MessageUnterminatedRegExp = \"Invalid regular expression: missing /\", MessageStrictOctalLiteral = \"Octal literals are not allowed in strict mode.\", MessageStrictDuplicateProperty = \"Duplicate data property in object literal not allowed in strict mode\";\n  var ILLEGAL$1 = \"ILLEGAL\", DISABLED = \"Disabled.\";\n  var RegexNonAsciiIdentifierStart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"), RegexNonAsciiIdentifierPart = new RegExp(\"[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\");\n  function assert(condition, message) {\n    if (!condition) {\n      throw new Error(\"ASSERT: \" + message);\n    }\n  }\n  function isDecimalDigit(ch2) {\n    return ch2 >= 48 && ch2 <= 57;\n  }\n  function isHexDigit(ch2) {\n    return \"0123456789abcdefABCDEF\".includes(ch2);\n  }\n  function isOctalDigit(ch2) {\n    return \"01234567\".includes(ch2);\n  }\n  function isWhiteSpace(ch2) {\n    return ch2 === 32 || ch2 === 9 || ch2 === 11 || ch2 === 12 || ch2 === 160 || ch2 >= 5760 && [5760, 6158, 8192, 8193, 8194, 8195, 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8239, 8287, 12288, 65279].includes(ch2);\n  }\n  function isLineTerminator(ch2) {\n    return ch2 === 10 || ch2 === 13 || ch2 === 8232 || ch2 === 8233;\n  }\n  function isIdentifierStart(ch2) {\n    return ch2 === 36 || ch2 === 95 || // $ (dollar) and _ (underscore)\n    ch2 >= 65 && ch2 <= 90 || // A..Z\n    ch2 >= 97 && ch2 <= 122 || // a..z\n    ch2 === 92 || // \\ (backslash)\n    ch2 >= 128 && RegexNonAsciiIdentifierStart.test(String.fromCharCode(ch2));\n  }\n  function isIdentifierPart(ch2) {\n    return ch2 === 36 || ch2 === 95 || // $ (dollar) and _ (underscore)\n    ch2 >= 65 && ch2 <= 90 || // A..Z\n    ch2 >= 97 && ch2 <= 122 || // a..z\n    ch2 >= 48 && ch2 <= 57 || // 0..9\n    ch2 === 92 || // \\ (backslash)\n    ch2 >= 128 && RegexNonAsciiIdentifierPart.test(String.fromCharCode(ch2));\n  }\n  const keywords = {\n    \"if\": 1,\n    \"in\": 1,\n    \"do\": 1,\n    \"var\": 1,\n    \"for\": 1,\n    \"new\": 1,\n    \"try\": 1,\n    \"let\": 1,\n    \"this\": 1,\n    \"else\": 1,\n    \"case\": 1,\n    \"void\": 1,\n    \"with\": 1,\n    \"enum\": 1,\n    \"while\": 1,\n    \"break\": 1,\n    \"catch\": 1,\n    \"throw\": 1,\n    \"const\": 1,\n    \"yield\": 1,\n    \"class\": 1,\n    \"super\": 1,\n    \"return\": 1,\n    \"typeof\": 1,\n    \"delete\": 1,\n    \"switch\": 1,\n    \"export\": 1,\n    \"import\": 1,\n    \"public\": 1,\n    \"static\": 1,\n    \"default\": 1,\n    \"finally\": 1,\n    \"extends\": 1,\n    \"package\": 1,\n    \"private\": 1,\n    \"function\": 1,\n    \"continue\": 1,\n    \"debugger\": 1,\n    \"interface\": 1,\n    \"protected\": 1,\n    \"instanceof\": 1,\n    \"implements\": 1\n  };\n  function skipComment() {\n    while (index < length$1) {\n      const ch2 = source.charCodeAt(index);\n      if (isWhiteSpace(ch2) || isLineTerminator(ch2)) {\n        ++index;\n      } else {\n        break;\n      }\n    }\n  }\n  function scanHexEscape(prefix) {\n    var i, len2, ch2, code = 0;\n    len2 = prefix === \"u\" ? 4 : 2;\n    for (i = 0; i < len2; ++i) {\n      if (index < length$1 && isHexDigit(source[index])) {\n        ch2 = source[index++];\n        code = code * 16 + \"0123456789abcdef\".indexOf(ch2.toLowerCase());\n      } else {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n    }\n    return String.fromCharCode(code);\n  }\n  function scanUnicodeCodePointEscape() {\n    var ch2, code, cu1, cu2;\n    ch2 = source[index];\n    code = 0;\n    if (ch2 === \"}\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    while (index < length$1) {\n      ch2 = source[index++];\n      if (!isHexDigit(ch2)) {\n        break;\n      }\n      code = code * 16 + \"0123456789abcdef\".indexOf(ch2.toLowerCase());\n    }\n    if (code > 1114111 || ch2 !== \"}\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (code <= 65535) {\n      return String.fromCharCode(code);\n    }\n    cu1 = (code - 65536 >> 10) + 55296;\n    cu2 = (code - 65536 & 1023) + 56320;\n    return String.fromCharCode(cu1, cu2);\n  }\n  function getEscapedIdentifier() {\n    var ch2, id2;\n    ch2 = source.charCodeAt(index++);\n    id2 = String.fromCharCode(ch2);\n    if (ch2 === 92) {\n      if (source.charCodeAt(index) !== 117) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n      ++index;\n      ch2 = scanHexEscape(\"u\");\n      if (!ch2 || ch2 === \"\\\\\" || !isIdentifierStart(ch2.charCodeAt(0))) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n      id2 = ch2;\n    }\n    while (index < length$1) {\n      ch2 = source.charCodeAt(index);\n      if (!isIdentifierPart(ch2)) {\n        break;\n      }\n      ++index;\n      id2 += String.fromCharCode(ch2);\n      if (ch2 === 92) {\n        id2 = id2.substr(0, id2.length - 1);\n        if (source.charCodeAt(index) !== 117) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n        ++index;\n        ch2 = scanHexEscape(\"u\");\n        if (!ch2 || ch2 === \"\\\\\" || !isIdentifierPart(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n        id2 += ch2;\n      }\n    }\n    return id2;\n  }\n  function getIdentifier() {\n    var start, ch2;\n    start = index++;\n    while (index < length$1) {\n      ch2 = source.charCodeAt(index);\n      if (ch2 === 92) {\n        index = start;\n        return getEscapedIdentifier();\n      }\n      if (isIdentifierPart(ch2)) {\n        ++index;\n      } else {\n        break;\n      }\n    }\n    return source.slice(start, index);\n  }\n  function scanIdentifier() {\n    var start, id2, type2;\n    start = index;\n    id2 = source.charCodeAt(index) === 92 ? getEscapedIdentifier() : getIdentifier();\n    if (id2.length === 1) {\n      type2 = TokenIdentifier;\n    } else if (keywords.hasOwnProperty(id2)) {\n      type2 = TokenKeyword;\n    } else if (id2 === \"null\") {\n      type2 = TokenNullLiteral;\n    } else if (id2 === \"true\" || id2 === \"false\") {\n      type2 = TokenBooleanLiteral;\n    } else {\n      type2 = TokenIdentifier;\n    }\n    return {\n      type: type2,\n      value: id2,\n      start,\n      end: index\n    };\n  }\n  function scanPunctuator() {\n    var start = index, code = source.charCodeAt(index), code2, ch1 = source[index], ch2, ch3, ch4;\n    switch (code) {\n      // Check for most common single-character punctuators.\n      case 46:\n      // . dot\n      case 40:\n      // ( open bracket\n      case 41:\n      // ) close bracket\n      case 59:\n      // ; semicolon\n      case 44:\n      // , comma\n      case 123:\n      // { open curly brace\n      case 125:\n      // } close curly brace\n      case 91:\n      // [\n      case 93:\n      // ]\n      case 58:\n      // :\n      case 63:\n      // ?\n      case 126:\n        ++index;\n        return {\n          type: TokenPunctuator,\n          value: String.fromCharCode(code),\n          start,\n          end: index\n        };\n      default:\n        code2 = source.charCodeAt(index + 1);\n        if (code2 === 61) {\n          switch (code) {\n            case 43:\n            // +\n            case 45:\n            // -\n            case 47:\n            // /\n            case 60:\n            // <\n            case 62:\n            // >\n            case 94:\n            // ^\n            case 124:\n            // |\n            case 37:\n            // %\n            case 38:\n            // &\n            case 42:\n              index += 2;\n              return {\n                type: TokenPunctuator,\n                value: String.fromCharCode(code) + String.fromCharCode(code2),\n                start,\n                end: index\n              };\n            case 33:\n            // !\n            case 61:\n              index += 2;\n              if (source.charCodeAt(index) === 61) {\n                ++index;\n              }\n              return {\n                type: TokenPunctuator,\n                value: source.slice(start, index),\n                start,\n                end: index\n              };\n          }\n        }\n    }\n    ch4 = source.substr(index, 4);\n    if (ch4 === \">>>=\") {\n      index += 4;\n      return {\n        type: TokenPunctuator,\n        value: ch4,\n        start,\n        end: index\n      };\n    }\n    ch3 = ch4.substr(0, 3);\n    if (ch3 === \">>>\" || ch3 === \"<<=\" || ch3 === \">>=\") {\n      index += 3;\n      return {\n        type: TokenPunctuator,\n        value: ch3,\n        start,\n        end: index\n      };\n    }\n    ch2 = ch3.substr(0, 2);\n    if (ch1 === ch2[1] && \"+-<>&|\".includes(ch1) || ch2 === \"=>\") {\n      index += 2;\n      return {\n        type: TokenPunctuator,\n        value: ch2,\n        start,\n        end: index\n      };\n    }\n    if (ch2 === \"//\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (\"<>=!+-*%&|^/\".includes(ch1)) {\n      ++index;\n      return {\n        type: TokenPunctuator,\n        value: ch1,\n        start,\n        end: index\n      };\n    }\n    throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n  }\n  function scanHexLiteral(start) {\n    let number2 = \"\";\n    while (index < length$1) {\n      if (!isHexDigit(source[index])) {\n        break;\n      }\n      number2 += source[index++];\n    }\n    if (number2.length === 0) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseInt(\"0x\" + number2, 16),\n      start,\n      end: index\n    };\n  }\n  function scanOctalLiteral(start) {\n    let number2 = \"0\" + source[index++];\n    while (index < length$1) {\n      if (!isOctalDigit(source[index])) {\n        break;\n      }\n      number2 += source[index++];\n    }\n    if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseInt(number2, 8),\n      octal: true,\n      start,\n      end: index\n    };\n  }\n  function scanNumericLiteral() {\n    var number2, start, ch2;\n    ch2 = source[index];\n    assert(isDecimalDigit(ch2.charCodeAt(0)) || ch2 === \".\", \"Numeric literal must start with a decimal digit or a decimal point\");\n    start = index;\n    number2 = \"\";\n    if (ch2 !== \".\") {\n      number2 = source[index++];\n      ch2 = source[index];\n      if (number2 === \"0\") {\n        if (ch2 === \"x\" || ch2 === \"X\") {\n          ++index;\n          return scanHexLiteral(start);\n        }\n        if (isOctalDigit(ch2)) {\n          return scanOctalLiteral(start);\n        }\n        if (ch2 && isDecimalDigit(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n        }\n      }\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number2 += source[index++];\n      }\n      ch2 = source[index];\n    }\n    if (ch2 === \".\") {\n      number2 += source[index++];\n      while (isDecimalDigit(source.charCodeAt(index))) {\n        number2 += source[index++];\n      }\n      ch2 = source[index];\n    }\n    if (ch2 === \"e\" || ch2 === \"E\") {\n      number2 += source[index++];\n      ch2 = source[index];\n      if (ch2 === \"+\" || ch2 === \"-\") {\n        number2 += source[index++];\n      }\n      if (isDecimalDigit(source.charCodeAt(index))) {\n        while (isDecimalDigit(source.charCodeAt(index))) {\n          number2 += source[index++];\n        }\n      } else {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      }\n    }\n    if (isIdentifierStart(source.charCodeAt(index))) {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenNumericLiteral,\n      value: parseFloat(number2),\n      start,\n      end: index\n    };\n  }\n  function scanStringLiteral() {\n    var str = \"\", quote, start, ch2, code, octal = false;\n    quote = source[index];\n    assert(quote === \"'\" || quote === '\"', \"String literal must starts with a quote\");\n    start = index;\n    ++index;\n    while (index < length$1) {\n      ch2 = source[index++];\n      if (ch2 === quote) {\n        quote = \"\";\n        break;\n      } else if (ch2 === \"\\\\\") {\n        ch2 = source[index++];\n        if (!ch2 || !isLineTerminator(ch2.charCodeAt(0))) {\n          switch (ch2) {\n            case \"u\":\n            case \"x\":\n              if (source[index] === \"{\") {\n                ++index;\n                str += scanUnicodeCodePointEscape();\n              } else {\n                str += scanHexEscape(ch2);\n              }\n              break;\n            case \"n\":\n              str += \"\\n\";\n              break;\n            case \"r\":\n              str += \"\\r\";\n              break;\n            case \"t\":\n              str += \"\t\";\n              break;\n            case \"b\":\n              str += \"\\b\";\n              break;\n            case \"f\":\n              str += \"\\f\";\n              break;\n            case \"v\":\n              str += \"\\v\";\n              break;\n            default:\n              if (isOctalDigit(ch2)) {\n                code = \"01234567\".indexOf(ch2);\n                if (code !== 0) {\n                  octal = true;\n                }\n                if (index < length$1 && isOctalDigit(source[index])) {\n                  octal = true;\n                  code = code * 8 + \"01234567\".indexOf(source[index++]);\n                  if (\"0123\".includes(ch2) && index < length$1 && isOctalDigit(source[index])) {\n                    code = code * 8 + \"01234567\".indexOf(source[index++]);\n                  }\n                }\n                str += String.fromCharCode(code);\n              } else {\n                str += ch2;\n              }\n              break;\n          }\n        } else {\n          if (ch2 === \"\\r\" && source[index] === \"\\n\") {\n            ++index;\n          }\n        }\n      } else if (isLineTerminator(ch2.charCodeAt(0))) {\n        break;\n      } else {\n        str += ch2;\n      }\n    }\n    if (quote !== \"\") {\n      throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n    }\n    return {\n      type: TokenStringLiteral,\n      value: str,\n      octal,\n      start,\n      end: index\n    };\n  }\n  function testRegExp(pattern, flags) {\n    let tmp = pattern;\n    if (flags.includes(\"u\")) {\n      tmp = tmp.replace(/\\\\u\\{([0-9a-fA-F]+)\\}/g, ($0, $1) => {\n        if (parseInt($1, 16) <= 1114111) {\n          return \"x\";\n        }\n        throwError({}, MessageInvalidRegExp);\n      }).replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, \"x\");\n    }\n    try {\n      new RegExp(tmp);\n    } catch (e) {\n      throwError({}, MessageInvalidRegExp);\n    }\n    try {\n      return new RegExp(pattern, flags);\n    } catch (exception) {\n      return null;\n    }\n  }\n  function scanRegExpBody() {\n    var ch2, str, classMarker, terminated, body;\n    ch2 = source[index];\n    assert(ch2 === \"/\", \"Regular expression literal must start with a slash\");\n    str = source[index++];\n    classMarker = false;\n    terminated = false;\n    while (index < length$1) {\n      ch2 = source[index++];\n      str += ch2;\n      if (ch2 === \"\\\\\") {\n        ch2 = source[index++];\n        if (isLineTerminator(ch2.charCodeAt(0))) {\n          throwError({}, MessageUnterminatedRegExp);\n        }\n        str += ch2;\n      } else if (isLineTerminator(ch2.charCodeAt(0))) {\n        throwError({}, MessageUnterminatedRegExp);\n      } else if (classMarker) {\n        if (ch2 === \"]\") {\n          classMarker = false;\n        }\n      } else {\n        if (ch2 === \"/\") {\n          terminated = true;\n          break;\n        } else if (ch2 === \"[\") {\n          classMarker = true;\n        }\n      }\n    }\n    if (!terminated) {\n      throwError({}, MessageUnterminatedRegExp);\n    }\n    body = str.substr(1, str.length - 2);\n    return {\n      value: body,\n      literal: str\n    };\n  }\n  function scanRegExpFlags() {\n    var ch2, str, flags;\n    str = \"\";\n    flags = \"\";\n    while (index < length$1) {\n      ch2 = source[index];\n      if (!isIdentifierPart(ch2.charCodeAt(0))) {\n        break;\n      }\n      ++index;\n      if (ch2 === \"\\\\\" && index < length$1) {\n        throwError({}, MessageUnexpectedToken, ILLEGAL$1);\n      } else {\n        flags += ch2;\n        str += ch2;\n      }\n    }\n    if (flags.search(/[^gimuy]/g) >= 0) {\n      throwError({}, MessageInvalidRegExp, flags);\n    }\n    return {\n      value: flags,\n      literal: str\n    };\n  }\n  function scanRegExp() {\n    var start, body, flags, value2;\n    lookahead = null;\n    skipComment();\n    start = index;\n    body = scanRegExpBody();\n    flags = scanRegExpFlags();\n    value2 = testRegExp(body.value, flags.value);\n    return {\n      literal: body.literal + flags.literal,\n      value: value2,\n      regex: {\n        pattern: body.value,\n        flags: flags.value\n      },\n      start,\n      end: index\n    };\n  }\n  function isIdentifierName(token) {\n    return token.type === TokenIdentifier || token.type === TokenKeyword || token.type === TokenBooleanLiteral || token.type === TokenNullLiteral;\n  }\n  function advance() {\n    skipComment();\n    if (index >= length$1) {\n      return {\n        type: TokenEOF,\n        start: index,\n        end: index\n      };\n    }\n    const ch2 = source.charCodeAt(index);\n    if (isIdentifierStart(ch2)) {\n      return scanIdentifier();\n    }\n    if (ch2 === 40 || ch2 === 41 || ch2 === 59) {\n      return scanPunctuator();\n    }\n    if (ch2 === 39 || ch2 === 34) {\n      return scanStringLiteral();\n    }\n    if (ch2 === 46) {\n      if (isDecimalDigit(source.charCodeAt(index + 1))) {\n        return scanNumericLiteral();\n      }\n      return scanPunctuator();\n    }\n    if (isDecimalDigit(ch2)) {\n      return scanNumericLiteral();\n    }\n    return scanPunctuator();\n  }\n  function lex() {\n    const token = lookahead;\n    index = token.end;\n    lookahead = advance();\n    index = token.end;\n    return token;\n  }\n  function peek() {\n    const pos = index;\n    lookahead = advance();\n    index = pos;\n  }\n  function finishArrayExpression(elements) {\n    const node = new ASTNode(SyntaxArrayExpression);\n    node.elements = elements;\n    return node;\n  }\n  function finishBinaryExpression(operator2, left, right) {\n    const node = new ASTNode(operator2 === \"||\" || operator2 === \"&&\" ? SyntaxLogicalExpression : SyntaxBinaryExpression);\n    node.operator = operator2;\n    node.left = left;\n    node.right = right;\n    return node;\n  }\n  function finishCallExpression(callee, args) {\n    const node = new ASTNode(SyntaxCallExpression);\n    node.callee = callee;\n    node.arguments = args;\n    return node;\n  }\n  function finishConditionalExpression(test2, consequent, alternate) {\n    const node = new ASTNode(SyntaxConditionalExpression);\n    node.test = test2;\n    node.consequent = consequent;\n    node.alternate = alternate;\n    return node;\n  }\n  function finishIdentifier(name) {\n    const node = new ASTNode(SyntaxIdentifier);\n    node.name = name;\n    return node;\n  }\n  function finishLiteral(token) {\n    const node = new ASTNode(SyntaxLiteral);\n    node.value = token.value;\n    node.raw = source.slice(token.start, token.end);\n    if (token.regex) {\n      if (node.raw === \"//\") {\n        node.raw = \"/(?:)/\";\n      }\n      node.regex = token.regex;\n    }\n    return node;\n  }\n  function finishMemberExpression(accessor2, object2, property2) {\n    const node = new ASTNode(SyntaxMemberExpression);\n    node.computed = accessor2 === \"[\";\n    node.object = object2;\n    node.property = property2;\n    if (!node.computed) property2.member = true;\n    return node;\n  }\n  function finishObjectExpression(properties) {\n    const node = new ASTNode(SyntaxObjectExpression);\n    node.properties = properties;\n    return node;\n  }\n  function finishProperty(kind, key2, value2) {\n    const node = new ASTNode(SyntaxProperty);\n    node.key = key2;\n    node.value = value2;\n    node.kind = kind;\n    return node;\n  }\n  function finishUnaryExpression(operator2, argument) {\n    const node = new ASTNode(SyntaxUnaryExpression);\n    node.operator = operator2;\n    node.argument = argument;\n    node.prefix = true;\n    return node;\n  }\n  function throwError(token, messageFormat) {\n    var error2, args = Array.prototype.slice.call(arguments, 2), msg = messageFormat.replace(/%(\\d)/g, (whole, index2) => {\n      assert(index2 < args.length, \"Message reference must be in range\");\n      return args[index2];\n    });\n    error2 = new Error(msg);\n    error2.index = index;\n    error2.description = msg;\n    throw error2;\n  }\n  function throwUnexpected(token) {\n    if (token.type === TokenEOF) {\n      throwError(token, MessageUnexpectedEOS);\n    }\n    if (token.type === TokenNumericLiteral) {\n      throwError(token, MessageUnexpectedNumber);\n    }\n    if (token.type === TokenStringLiteral) {\n      throwError(token, MessageUnexpectedString);\n    }\n    if (token.type === TokenIdentifier) {\n      throwError(token, MessageUnexpectedIdentifier);\n    }\n    if (token.type === TokenKeyword) {\n      throwError(token, MessageUnexpectedReserved);\n    }\n    throwError(token, MessageUnexpectedToken, token.value);\n  }\n  function expect(value2) {\n    const token = lex();\n    if (token.type !== TokenPunctuator || token.value !== value2) {\n      throwUnexpected(token);\n    }\n  }\n  function match(value2) {\n    return lookahead.type === TokenPunctuator && lookahead.value === value2;\n  }\n  function matchKeyword(keyword) {\n    return lookahead.type === TokenKeyword && lookahead.value === keyword;\n  }\n  function parseArrayInitialiser() {\n    const elements = [];\n    index = lookahead.start;\n    expect(\"[\");\n    while (!match(\"]\")) {\n      if (match(\",\")) {\n        lex();\n        elements.push(null);\n      } else {\n        elements.push(parseConditionalExpression());\n        if (!match(\"]\")) {\n          expect(\",\");\n        }\n      }\n    }\n    lex();\n    return finishArrayExpression(elements);\n  }\n  function parseObjectPropertyKey() {\n    index = lookahead.start;\n    const token = lex();\n    if (token.type === TokenStringLiteral || token.type === TokenNumericLiteral) {\n      if (token.octal) {\n        throwError(token, MessageStrictOctalLiteral);\n      }\n      return finishLiteral(token);\n    }\n    return finishIdentifier(token.value);\n  }\n  function parseObjectProperty() {\n    var token, key2, id2, value2;\n    index = lookahead.start;\n    token = lookahead;\n    if (token.type === TokenIdentifier) {\n      id2 = parseObjectPropertyKey();\n      expect(\":\");\n      value2 = parseConditionalExpression();\n      return finishProperty(\"init\", id2, value2);\n    }\n    if (token.type === TokenEOF || token.type === TokenPunctuator) {\n      throwUnexpected(token);\n    } else {\n      key2 = parseObjectPropertyKey();\n      expect(\":\");\n      value2 = parseConditionalExpression();\n      return finishProperty(\"init\", key2, value2);\n    }\n  }\n  function parseObjectInitialiser() {\n    var properties = [], property2, name, key2, map2 = {}, toString2 = String;\n    index = lookahead.start;\n    expect(\"{\");\n    while (!match(\"}\")) {\n      property2 = parseObjectProperty();\n      if (property2.key.type === SyntaxIdentifier) {\n        name = property2.key.name;\n      } else {\n        name = toString2(property2.key.value);\n      }\n      key2 = \"$\" + name;\n      if (Object.prototype.hasOwnProperty.call(map2, key2)) {\n        throwError({}, MessageStrictDuplicateProperty);\n      } else {\n        map2[key2] = true;\n      }\n      properties.push(property2);\n      if (!match(\"}\")) {\n        expect(\",\");\n      }\n    }\n    expect(\"}\");\n    return finishObjectExpression(properties);\n  }\n  function parseGroupExpression() {\n    expect(\"(\");\n    const expr2 = parseExpression();\n    expect(\")\");\n    return expr2;\n  }\n  const legalKeywords = {\n    \"if\": 1\n  };\n  function parsePrimaryExpression() {\n    var type2, token, expr2;\n    if (match(\"(\")) {\n      return parseGroupExpression();\n    }\n    if (match(\"[\")) {\n      return parseArrayInitialiser();\n    }\n    if (match(\"{\")) {\n      return parseObjectInitialiser();\n    }\n    type2 = lookahead.type;\n    index = lookahead.start;\n    if (type2 === TokenIdentifier || legalKeywords[lookahead.value]) {\n      expr2 = finishIdentifier(lex().value);\n    } else if (type2 === TokenStringLiteral || type2 === TokenNumericLiteral) {\n      if (lookahead.octal) {\n        throwError(lookahead, MessageStrictOctalLiteral);\n      }\n      expr2 = finishLiteral(lex());\n    } else if (type2 === TokenKeyword) {\n      throw new Error(DISABLED);\n    } else if (type2 === TokenBooleanLiteral) {\n      token = lex();\n      token.value = token.value === \"true\";\n      expr2 = finishLiteral(token);\n    } else if (type2 === TokenNullLiteral) {\n      token = lex();\n      token.value = null;\n      expr2 = finishLiteral(token);\n    } else if (match(\"/\") || match(\"/=\")) {\n      expr2 = finishLiteral(scanRegExp());\n      peek();\n    } else {\n      throwUnexpected(lex());\n    }\n    return expr2;\n  }\n  function parseArguments() {\n    const args = [];\n    expect(\"(\");\n    if (!match(\")\")) {\n      while (index < length$1) {\n        args.push(parseConditionalExpression());\n        if (match(\")\")) {\n          break;\n        }\n        expect(\",\");\n      }\n    }\n    expect(\")\");\n    return args;\n  }\n  function parseNonComputedProperty() {\n    index = lookahead.start;\n    const token = lex();\n    if (!isIdentifierName(token)) {\n      throwUnexpected(token);\n    }\n    return finishIdentifier(token.value);\n  }\n  function parseNonComputedMember() {\n    expect(\".\");\n    return parseNonComputedProperty();\n  }\n  function parseComputedMember() {\n    expect(\"[\");\n    const expr2 = parseExpression();\n    expect(\"]\");\n    return expr2;\n  }\n  function parseLeftHandSideExpressionAllowCall() {\n    var expr2, args, property2;\n    expr2 = parsePrimaryExpression();\n    for (; ; ) {\n      if (match(\".\")) {\n        property2 = parseNonComputedMember();\n        expr2 = finishMemberExpression(\".\", expr2, property2);\n      } else if (match(\"(\")) {\n        args = parseArguments();\n        expr2 = finishCallExpression(expr2, args);\n      } else if (match(\"[\")) {\n        property2 = parseComputedMember();\n        expr2 = finishMemberExpression(\"[\", expr2, property2);\n      } else {\n        break;\n      }\n    }\n    return expr2;\n  }\n  function parsePostfixExpression() {\n    const expr2 = parseLeftHandSideExpressionAllowCall();\n    if (lookahead.type === TokenPunctuator) {\n      if (match(\"++\") || match(\"--\")) {\n        throw new Error(DISABLED);\n      }\n    }\n    return expr2;\n  }\n  function parseUnaryExpression() {\n    var token, expr2;\n    if (lookahead.type !== TokenPunctuator && lookahead.type !== TokenKeyword) {\n      expr2 = parsePostfixExpression();\n    } else if (match(\"++\") || match(\"--\")) {\n      throw new Error(DISABLED);\n    } else if (match(\"+\") || match(\"-\") || match(\"~\") || match(\"!\")) {\n      token = lex();\n      expr2 = parseUnaryExpression();\n      expr2 = finishUnaryExpression(token.value, expr2);\n    } else if (matchKeyword(\"delete\") || matchKeyword(\"void\") || matchKeyword(\"typeof\")) {\n      throw new Error(DISABLED);\n    } else {\n      expr2 = parsePostfixExpression();\n    }\n    return expr2;\n  }\n  function binaryPrecedence(token) {\n    let prec = 0;\n    if (token.type !== TokenPunctuator && token.type !== TokenKeyword) {\n      return 0;\n    }\n    switch (token.value) {\n      case \"||\":\n        prec = 1;\n        break;\n      case \"&&\":\n        prec = 2;\n        break;\n      case \"|\":\n        prec = 3;\n        break;\n      case \"^\":\n        prec = 4;\n        break;\n      case \"&\":\n        prec = 5;\n        break;\n      case \"==\":\n      case \"!=\":\n      case \"===\":\n      case \"!==\":\n        prec = 6;\n        break;\n      case \"<\":\n      case \">\":\n      case \"<=\":\n      case \">=\":\n      case \"instanceof\":\n      case \"in\":\n        prec = 7;\n        break;\n      case \"<<\":\n      case \">>\":\n      case \">>>\":\n        prec = 8;\n        break;\n      case \"+\":\n      case \"-\":\n        prec = 9;\n        break;\n      case \"*\":\n      case \"/\":\n      case \"%\":\n        prec = 11;\n        break;\n    }\n    return prec;\n  }\n  function parseBinaryExpression() {\n    var marker, markers, expr2, token, prec, stack, right, operator2, left, i;\n    marker = lookahead;\n    left = parseUnaryExpression();\n    token = lookahead;\n    prec = binaryPrecedence(token);\n    if (prec === 0) {\n      return left;\n    }\n    token.prec = prec;\n    lex();\n    markers = [marker, lookahead];\n    right = parseUnaryExpression();\n    stack = [left, token, right];\n    while ((prec = binaryPrecedence(lookahead)) > 0) {\n      while (stack.length > 2 && prec <= stack[stack.length - 2].prec) {\n        right = stack.pop();\n        operator2 = stack.pop().value;\n        left = stack.pop();\n        markers.pop();\n        expr2 = finishBinaryExpression(operator2, left, right);\n        stack.push(expr2);\n      }\n      token = lex();\n      token.prec = prec;\n      stack.push(token);\n      markers.push(lookahead);\n      expr2 = parseUnaryExpression();\n      stack.push(expr2);\n    }\n    i = stack.length - 1;\n    expr2 = stack[i];\n    markers.pop();\n    while (i > 1) {\n      markers.pop();\n      expr2 = finishBinaryExpression(stack[i - 1].value, stack[i - 2], expr2);\n      i -= 2;\n    }\n    return expr2;\n  }\n  function parseConditionalExpression() {\n    var expr2, consequent, alternate;\n    expr2 = parseBinaryExpression();\n    if (match(\"?\")) {\n      lex();\n      consequent = parseConditionalExpression();\n      expect(\":\");\n      alternate = parseConditionalExpression();\n      expr2 = finishConditionalExpression(expr2, consequent, alternate);\n    }\n    return expr2;\n  }\n  function parseExpression() {\n    const expr2 = parseConditionalExpression();\n    if (match(\",\")) {\n      throw new Error(DISABLED);\n    }\n    return expr2;\n  }\n  function parser$1(code) {\n    source = code;\n    index = 0;\n    length$1 = source.length;\n    lookahead = null;\n    peek();\n    const expr2 = parseExpression();\n    if (lookahead.type !== TokenEOF) {\n      throw new Error(\"Unexpect token after expression.\");\n    }\n    return expr2;\n  }\n  var Constants$1 = {\n    NaN: \"NaN\",\n    E: \"Math.E\",\n    LN2: \"Math.LN2\",\n    LN10: \"Math.LN10\",\n    LOG2E: \"Math.LOG2E\",\n    LOG10E: \"Math.LOG10E\",\n    PI: \"Math.PI\",\n    SQRT1_2: \"Math.SQRT1_2\",\n    SQRT2: \"Math.SQRT2\",\n    MIN_VALUE: \"Number.MIN_VALUE\",\n    MAX_VALUE: \"Number.MAX_VALUE\"\n  };\n  function Functions(codegen2) {\n    function fncall(name, args, cast, type2) {\n      let obj = codegen2(args[0]);\n      if (cast) {\n        obj = cast + \"(\" + obj + \")\";\n        if (cast.lastIndexOf(\"new \", 0) === 0) obj = \"(\" + obj + \")\";\n      }\n      return obj + \".\" + name + (type2 < 0 ? \"\" : type2 === 0 ? \"()\" : \"(\" + args.slice(1).map(codegen2).join(\",\") + \")\");\n    }\n    function fn(name, cast, type2) {\n      return (args) => fncall(name, args, cast, type2);\n    }\n    const DATE2 = \"new Date\", STRING = \"String\", REGEXP = \"RegExp\";\n    return {\n      // MATH functions\n      isNaN: \"Number.isNaN\",\n      isFinite: \"Number.isFinite\",\n      abs: \"Math.abs\",\n      acos: \"Math.acos\",\n      asin: \"Math.asin\",\n      atan: \"Math.atan\",\n      atan2: \"Math.atan2\",\n      ceil: \"Math.ceil\",\n      cos: \"Math.cos\",\n      exp: \"Math.exp\",\n      floor: \"Math.floor\",\n      hypot: \"Math.hypot\",\n      log: \"Math.log\",\n      max: \"Math.max\",\n      min: \"Math.min\",\n      pow: \"Math.pow\",\n      random: \"Math.random\",\n      round: \"Math.round\",\n      sin: \"Math.sin\",\n      sqrt: \"Math.sqrt\",\n      tan: \"Math.tan\",\n      clamp: function(args) {\n        if (args.length < 3) error(\"Missing arguments to clamp function.\");\n        if (args.length > 3) error(\"Too many arguments to clamp function.\");\n        const a2 = args.map(codegen2);\n        return \"Math.max(\" + a2[1] + \", Math.min(\" + a2[2] + \",\" + a2[0] + \"))\";\n      },\n      // DATE functions\n      now: \"Date.now\",\n      utc: \"Date.UTC\",\n      datetime: DATE2,\n      date: fn(\"getDate\", DATE2, 0),\n      day: fn(\"getDay\", DATE2, 0),\n      year: fn(\"getFullYear\", DATE2, 0),\n      month: fn(\"getMonth\", DATE2, 0),\n      hours: fn(\"getHours\", DATE2, 0),\n      minutes: fn(\"getMinutes\", DATE2, 0),\n      seconds: fn(\"getSeconds\", DATE2, 0),\n      milliseconds: fn(\"getMilliseconds\", DATE2, 0),\n      time: fn(\"getTime\", DATE2, 0),\n      timezoneoffset: fn(\"getTimezoneOffset\", DATE2, 0),\n      utcdate: fn(\"getUTCDate\", DATE2, 0),\n      utcday: fn(\"getUTCDay\", DATE2, 0),\n      utcyear: fn(\"getUTCFullYear\", DATE2, 0),\n      utcmonth: fn(\"getUTCMonth\", DATE2, 0),\n      utchours: fn(\"getUTCHours\", DATE2, 0),\n      utcminutes: fn(\"getUTCMinutes\", DATE2, 0),\n      utcseconds: fn(\"getUTCSeconds\", DATE2, 0),\n      utcmilliseconds: fn(\"getUTCMilliseconds\", DATE2, 0),\n      // sequence functions\n      length: fn(\"length\", null, -1),\n      // STRING functions\n      parseFloat: \"parseFloat\",\n      parseInt: \"parseInt\",\n      upper: fn(\"toUpperCase\", STRING, 0),\n      lower: fn(\"toLowerCase\", STRING, 0),\n      substring: fn(\"substring\", STRING),\n      split: fn(\"split\", STRING),\n      trim: fn(\"trim\", STRING, 0),\n      // base64 encode/decode\n      btoa: \"btoa\",\n      atob: \"atob\",\n      // REGEXP functions\n      regexp: REGEXP,\n      test: fn(\"test\", REGEXP),\n      // Control Flow functions\n      if: function(args) {\n        if (args.length < 3) error(\"Missing arguments to if function.\");\n        if (args.length > 3) error(\"Too many arguments to if function.\");\n        const a2 = args.map(codegen2);\n        return \"(\" + a2[0] + \"?\" + a2[1] + \":\" + a2[2] + \")\";\n      }\n    };\n  }\n  function stripQuotes(s) {\n    const n = s && s.length - 1;\n    return n && (s[0] === '\"' && s[n] === '\"' || s[0] === \"'\" && s[n] === \"'\") ? s.slice(1, -1) : s;\n  }\n  function codegen(opt) {\n    opt = opt || {};\n    const allowed = opt.allowed ? toSet(opt.allowed) : {}, forbidden = opt.forbidden ? toSet(opt.forbidden) : {}, constants2 = opt.constants || Constants$1, functions = (opt.functions || Functions)(visit2), globalvar = opt.globalvar, fieldvar = opt.fieldvar, outputGlobal = isFunction(globalvar) ? globalvar : (id2) => `${globalvar}[\"${id2}\"]`;\n    /* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype).filter((name) => typeof Object.prototype[name] === \"function\"), \"__proto__\"]);\n    let globals = {}, fields = {}, memberDepth = 0;\n    function visit2(ast) {\n      if (isString(ast)) return ast;\n      const generator = Generators[ast.type];\n      if (generator == null) error(\"Unsupported type: \" + ast.type);\n      return generator(ast);\n    }\n    const Generators = {\n      Literal: (n) => n.raw,\n      Identifier: (n) => {\n        const id2 = n.name;\n        if (memberDepth > 0) {\n          return id2;\n        } else if (has$1(forbidden, id2)) {\n          return error(\"Illegal identifier: \" + id2);\n        } else if (has$1(constants2, id2)) {\n          return constants2[id2];\n        } else if (has$1(allowed, id2)) {\n          return id2;\n        } else {\n          globals[id2] = 1;\n          return outputGlobal(id2);\n        }\n      },\n      MemberExpression: (n) => {\n        const d = !n.computed, o = visit2(n.object);\n        if (d) memberDepth += 1;\n        const p = visit2(n.property);\n        if (o === fieldvar) {\n          fields[stripQuotes(p)] = 1;\n        }\n        if (d) memberDepth -= 1;\n        return o + (d ? \".\" + p : \"[\" + p + \"]\");\n      },\n      CallExpression: (n) => {\n        if (n.callee.type !== \"Identifier\") {\n          error(\"Illegal callee type: \" + n.callee.type);\n        }\n        const callee = n.callee.name, args = n.arguments, fn = has$1(functions, callee) && functions[callee];\n        if (!fn) error(\"Unrecognized function: \" + callee);\n        return isFunction(fn) ? fn(args) : fn + \"(\" + args.map(visit2).join(\",\") + \")\";\n      },\n      ArrayExpression: (n) => \"[\" + n.elements.map(visit2).join(\",\") + \"]\",\n      BinaryExpression: (n) => \"(\" + visit2(n.left) + \" \" + n.operator + \" \" + visit2(n.right) + \")\",\n      UnaryExpression: (n) => \"(\" + n.operator + visit2(n.argument) + \")\",\n      ConditionalExpression: (n) => \"(\" + visit2(n.test) + \"?\" + visit2(n.consequent) + \":\" + visit2(n.alternate) + \")\",\n      LogicalExpression: (n) => \"(\" + visit2(n.left) + n.operator + visit2(n.right) + \")\",\n      ObjectExpression: (n) => {\n        for (const prop of n.properties) {\n          const keyName = prop.key.name;\n          if (DisallowedObjectProperties.has(keyName)) {\n            error(\"Illegal property: \" + keyName);\n          }\n        }\n        return \"{\" + n.properties.map(visit2).join(\",\") + \"}\";\n      },\n      Property: (n) => {\n        memberDepth += 1;\n        const k = visit2(n.key);\n        memberDepth -= 1;\n        return k + \":\" + visit2(n.value);\n      }\n    };\n    function codegen2(ast) {\n      const result = {\n        code: visit2(ast),\n        globals: Object.keys(globals),\n        fields: Object.keys(fields)\n      };\n      globals = {};\n      fields = {};\n      return result;\n    }\n    codegen2.functions = functions;\n    codegen2.constants = constants2;\n    return codegen2;\n  }\n  const SELECTION_GETTER = Symbol(\"vega_selection_getter\");\n  function getter(f) {\n    if (!f.getter || !f.getter[SELECTION_GETTER]) {\n      f.getter = field$1(f.field);\n      f.getter[SELECTION_GETTER] = true;\n    }\n    return f.getter;\n  }\n  const Intersect = \"intersect\";\n  const Union = \"union\";\n  const VlMulti = \"vlMulti\";\n  const VlPoint = \"vlPoint\";\n  const Or = \"or\";\n  const And = \"and\";\n  const SelectionId = \"_vgsid_\";\n  const $selectionId = field$1(SelectionId);\n  const TYPE_ENUM = \"E\", TYPE_RANGE_INC = \"R\", TYPE_RANGE_EXC = \"R-E\", TYPE_RANGE_LE = \"R-LE\", TYPE_RANGE_RE = \"R-RE\", TYPE_PRED_LT = \"E-LT\", TYPE_PRED_LTE = \"E-LTE\", TYPE_PRED_GT = \"E-GT\", TYPE_PRED_GTE = \"E-GTE\", TYPE_PRED_VALID = \"E-VALID\", TYPE_PRED_ONE_OF = \"E-ONE\", UNIT_INDEX = \"index:unit\";\n  function testPoint(datum2, entry2) {\n    var fields = entry2.fields, values2 = entry2.values, n = fields.length, i = 0, dval, f;\n    for (; i < n; ++i) {\n      f = fields[i];\n      dval = getter(f)(datum2);\n      if (isDate$1(dval)) dval = toNumber(dval);\n      if (isDate$1(values2[i])) values2[i] = toNumber(values2[i]);\n      if (isArray(values2[i]) && isDate$1(values2[i][0])) values2[i] = values2[i].map(toNumber);\n      if (f.type === TYPE_ENUM) {\n        if (isArray(values2[i]) ? !values2[i].includes(dval) : dval !== values2[i]) {\n          return false;\n        }\n      } else {\n        if (f.type === TYPE_RANGE_INC) {\n          if (!inrange(dval, values2[i])) return false;\n        } else if (f.type === TYPE_RANGE_RE) {\n          if (!inrange(dval, values2[i], true, false)) return false;\n        } else if (f.type === TYPE_RANGE_EXC) {\n          if (!inrange(dval, values2[i], false, false)) return false;\n        } else if (f.type === TYPE_RANGE_LE) {\n          if (!inrange(dval, values2[i], false, true)) return false;\n        } else if (f.type === TYPE_PRED_LT) {\n          if (dval >= values2[i]) return false;\n        } else if (f.type === TYPE_PRED_LTE) {\n          if (dval > values2[i]) return false;\n        } else if (f.type === TYPE_PRED_GT) {\n          if (dval <= values2[i]) return false;\n        } else if (f.type === TYPE_PRED_GTE) {\n          if (dval < values2[i]) return false;\n        } else if (f.type === TYPE_PRED_VALID) {\n          if (dval === null || isNaN(dval)) return false;\n        } else if (f.type === TYPE_PRED_ONE_OF) {\n          if (values2[i].indexOf(dval) === -1) return false;\n        }\n      }\n    }\n    return true;\n  }\n  function selectionTest(name, datum2, op) {\n    var data2 = this.context.data[name], entries = data2 ? data2.values.value : [], unitIdx = data2 ? data2[UNIT_INDEX] && data2[UNIT_INDEX].value : void 0, intersect2 = op === Intersect, n = entries.length, i = 0, entry2, miss, count2, unit2, b2;\n    for (; i < n; ++i) {\n      entry2 = entries[i];\n      if (unitIdx && intersect2) {\n        miss = miss || {};\n        count2 = miss[unit2 = entry2.unit] || 0;\n        if (count2 === -1) continue;\n        b2 = testPoint(datum2, entry2);\n        miss[unit2] = b2 ? -1 : ++count2;\n        if (b2 && unitIdx.size === 1) return true;\n        if (!b2 && count2 === unitIdx.get(unit2).count) return false;\n      } else {\n        b2 = testPoint(datum2, entry2);\n        if (intersect2 ^ b2) return b2;\n      }\n    }\n    return n && intersect2;\n  }\n  const bisect = bisector($selectionId), bisectLeft = bisect.left, bisectRight = bisect.right;\n  function selectionIdTest(name, datum2, op) {\n    const data2 = this.context.data[name], entries = data2 ? data2.values.value : [], unitIdx = data2 ? data2[UNIT_INDEX] && data2[UNIT_INDEX].value : void 0, intersect2 = op === Intersect, value2 = $selectionId(datum2), index2 = bisectLeft(entries, value2);\n    if (index2 === entries.length) return false;\n    if ($selectionId(entries[index2]) !== value2) return false;\n    if (unitIdx && intersect2) {\n      if (unitIdx.size === 1) return true;\n      if (bisectRight(entries, value2) - index2 < unitIdx.size) return false;\n    }\n    return true;\n  }\n  function selectionTuples(array2, base2) {\n    if (!isArray(array2)) {\n      error(\"First argument to selectionTuples must be an array.\");\n    }\n    if (!isObject$1(base2)) {\n      error(\"Second argument to selectionTuples must be an object.\");\n    }\n    return array2.map((x2) => extend$1(base2.fields ? {\n      values: base2.fields.map((f) => getter(f)(x2.datum))\n    } : {\n      [SelectionId]: $selectionId(x2.datum)\n    }, base2));\n  }\n  function selectionResolve(name, op, isMulti, vl5) {\n    var data2 = this.context.data[name], entries = data2 ? data2.values.value : [], resolved = {}, multiRes = {}, types = {}, entry2, fields, values2, unit2, field2, value2, res, resUnit, type2, union2, n = entries.length, i = 0, j, m2;\n    for (; i < n; ++i) {\n      entry2 = entries[i];\n      unit2 = entry2.unit;\n      fields = entry2.fields;\n      values2 = entry2.values;\n      if (fields && values2) {\n        for (j = 0, m2 = fields.length; j < m2; ++j) {\n          field2 = fields[j];\n          res = resolved[field2.field] || (resolved[field2.field] = {});\n          resUnit = res[unit2] || (res[unit2] = []);\n          types[field2.field] = type2 = field2.type.charAt(0);\n          union2 = ops[`${type2}_union`];\n          res[unit2] = union2(resUnit, array$5(values2[j]));\n        }\n        if (isMulti) {\n          resUnit = multiRes[unit2] || (multiRes[unit2] = []);\n          resUnit.push(array$5(values2).reduce((obj, curr, j2) => (obj[fields[j2].field] = curr, obj), {}));\n        }\n      } else {\n        field2 = SelectionId;\n        value2 = $selectionId(entry2);\n        res = resolved[field2] || (resolved[field2] = {});\n        resUnit = res[unit2] || (res[unit2] = []);\n        resUnit.push(value2);\n        if (isMulti) {\n          resUnit = multiRes[unit2] || (multiRes[unit2] = []);\n          resUnit.push({\n            [SelectionId]: value2\n          });\n        }\n      }\n    }\n    op = op || Union;\n    if (resolved[SelectionId]) {\n      resolved[SelectionId] = ops[`${SelectionId}_${op}`](...Object.values(resolved[SelectionId]));\n    } else {\n      Object.keys(resolved).forEach((field3) => {\n        resolved[field3] = Object.keys(resolved[field3]).map((unit3) => resolved[field3][unit3]).reduce((acc, curr) => acc === void 0 ? curr : ops[`${types[field3]}_${op}`](acc, curr));\n      });\n    }\n    entries = Object.keys(multiRes);\n    if (isMulti && entries.length) {\n      const key2 = vl5 ? VlPoint : VlMulti;\n      resolved[key2] = op === Union ? {\n        [Or]: entries.reduce((acc, k) => (acc.push(...multiRes[k]), acc), [])\n      } : {\n        [And]: entries.map((k) => ({\n          [Or]: multiRes[k]\n        }))\n      };\n    }\n    return resolved;\n  }\n  var ops = {\n    [`${SelectionId}_union`]: union,\n    [`${SelectionId}_intersect`]: intersection,\n    E_union: function(base2, value2) {\n      if (!base2.length) return value2;\n      var i = 0, n = value2.length;\n      for (; i < n; ++i) if (!base2.includes(value2[i])) base2.push(value2[i]);\n      return base2;\n    },\n    E_intersect: function(base2, value2) {\n      return !base2.length ? value2 : base2.filter((v) => value2.includes(v));\n    },\n    R_union: function(base2, value2) {\n      var lo = toNumber(value2[0]), hi = toNumber(value2[1]);\n      if (lo > hi) {\n        lo = value2[1];\n        hi = value2[0];\n      }\n      if (!base2.length) return [lo, hi];\n      if (base2[0] > lo) base2[0] = lo;\n      if (base2[1] < hi) base2[1] = hi;\n      return base2;\n    },\n    R_intersect: function(base2, value2) {\n      var lo = toNumber(value2[0]), hi = toNumber(value2[1]);\n      if (lo > hi) {\n        lo = value2[1];\n        hi = value2[0];\n      }\n      if (!base2.length) return [lo, hi];\n      if (hi < base2[0] || base2[1] < lo) {\n        return [];\n      } else {\n        if (base2[0] < lo) base2[0] = lo;\n        if (base2[1] > hi) base2[1] = hi;\n      }\n      return base2;\n    }\n  };\n  const DataPrefix$1 = \":\", IndexPrefix$1 = \"@\";\n  function selectionVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) error(\"First argument to selection functions must be a string literal.\");\n    const data2 = args[0].value, op = args.length >= 2 && peek$1(args).value, field2 = \"unit\", indexName = IndexPrefix$1 + field2, dataName = DataPrefix$1 + data2;\n    if (op === Intersect && !has$1(params2, indexName)) {\n      params2[indexName] = scope.getData(data2).indataRef(scope, field2);\n    }\n    if (!has$1(params2, dataName)) {\n      params2[dataName] = scope.getData(data2).tuplesRef();\n    }\n  }\n  function data$1(name) {\n    const data2 = this.context.data[name];\n    return data2 ? data2.values.value : [];\n  }\n  function indata(name, field2, value2) {\n    const index2 = this.context.data[name][\"index:\" + field2], entry2 = index2 ? index2.value.get(value2) : void 0;\n    return entry2 ? entry2.count : entry2;\n  }\n  function setdata(name, tuples) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input;\n    df.pulse(input, df.changeset().remove(truthy).insert(tuples));\n    return 1;\n  }\n  function encode(item, name, retval) {\n    if (item) {\n      const df = this.context.dataflow, target2 = item.mark.source;\n      df.pulse(target2, df.changeset().encode(item, name));\n    }\n    return retval !== void 0 ? retval : item;\n  }\n  const wrap = (method2) => function(value2, spec) {\n    const locale2 = this.context.dataflow.locale();\n    return value2 === null ? \"null\" : locale2[method2](spec)(value2);\n  };\n  const format = wrap(\"format\");\n  const timeFormat = wrap(\"timeFormat\");\n  const utcFormat = wrap(\"utcFormat\");\n  const timeParse = wrap(\"timeParse\");\n  const utcParse = wrap(\"utcParse\");\n  const dateObj = new Date(2e3, 0, 1);\n  function time(month, day, specifier) {\n    if (!Number.isInteger(month) || !Number.isInteger(day)) return \"\";\n    dateObj.setYear(2e3);\n    dateObj.setMonth(month);\n    dateObj.setDate(day);\n    return timeFormat.call(this, dateObj, specifier);\n  }\n  function monthFormat(month) {\n    return time.call(this, month, 1, \"%B\");\n  }\n  function monthAbbrevFormat(month) {\n    return time.call(this, month, 1, \"%b\");\n  }\n  function dayFormat(day) {\n    return time.call(this, 0, 2 + day, \"%A\");\n  }\n  function dayAbbrevFormat(day) {\n    return time.call(this, 0, 2 + day, \"%a\");\n  }\n  const DataPrefix = \":\";\n  const IndexPrefix = \"@\";\n  const ScalePrefix = \"%\";\n  const SignalPrefix = \"$\";\n  function dataVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) {\n      error(\"First argument to data functions must be a string literal.\");\n    }\n    const data2 = args[0].value, dataName = DataPrefix + data2;\n    if (!has$1(dataName, params2)) {\n      try {\n        params2[dataName] = scope.getData(data2).tuplesRef();\n      } catch (err) {\n      }\n    }\n  }\n  function indataVisitor(name, args, scope, params2) {\n    if (args[0].type !== Literal) error(\"First argument to indata must be a string literal.\");\n    if (args[1].type !== Literal) error(\"Second argument to indata must be a string literal.\");\n    const data2 = args[0].value, field2 = args[1].value, indexName = IndexPrefix + field2;\n    if (!has$1(indexName, params2)) {\n      params2[indexName] = scope.getData(data2).indataRef(scope, field2);\n    }\n  }\n  function scaleVisitor(name, args, scope, params2) {\n    if (args[0].type === Literal) {\n      addScaleDependency(scope, params2, args[0].value);\n    } else {\n      for (name in scope.scales) {\n        addScaleDependency(scope, params2, name);\n      }\n    }\n  }\n  function addScaleDependency(scope, params2, name) {\n    const scaleName = ScalePrefix + name;\n    if (!has$1(params2, scaleName)) {\n      try {\n        params2[scaleName] = scope.scaleRef(name);\n      } catch (err) {\n      }\n    }\n  }\n  function getScale(nameOrFunction, ctx) {\n    if (isString(nameOrFunction)) {\n      const maybeScale = ctx.scales[nameOrFunction];\n      return maybeScale && isRegisteredScale(maybeScale.value) ? maybeScale.value : void 0;\n    } else if (isFunction(nameOrFunction)) {\n      return isRegisteredScale(nameOrFunction) ? nameOrFunction : void 0;\n    }\n    return void 0;\n  }\n  function internalScaleFunctions(codegen2, fnctx, visitors) {\n    fnctx.__bandwidth = (s) => s && s.bandwidth ? s.bandwidth() : 0;\n    visitors._bandwidth = scaleVisitor;\n    visitors._range = scaleVisitor;\n    visitors._scale = scaleVisitor;\n    const ref2 = (arg) => \"_[\" + (arg.type === Literal ? $(ScalePrefix + arg.value) : $(ScalePrefix) + \"+\" + codegen2(arg)) + \"]\";\n    return {\n      _bandwidth: (args) => `this.__bandwidth(${ref2(args[0])})`,\n      _range: (args) => `${ref2(args[0])}.range()`,\n      _scale: (args) => `${ref2(args[0])}(${codegen2(args[1])})`\n    };\n  }\n  function geoMethod(methodName, globalMethod) {\n    return function(projection2, geojson, group2) {\n      if (projection2) {\n        const p = getScale(projection2, (group2 || this).context);\n        return p && p.path[methodName](geojson);\n      } else {\n        return globalMethod(geojson);\n      }\n    };\n  }\n  const geoArea = geoMethod(\"area\", geoArea$1);\n  const geoBounds = geoMethod(\"bounds\", geoBounds$1);\n  const geoCentroid = geoMethod(\"centroid\", geoCentroid$1);\n  function geoScale(projection2, group2) {\n    const p = getScale(projection2, (group2 || this).context);\n    return p && p.scale();\n  }\n  function inScope(item) {\n    const group2 = this.context.group;\n    let value2 = false;\n    if (group2) while (item) {\n      if (item === group2) {\n        value2 = true;\n        break;\n      }\n      item = item.mark.group;\n    }\n    return value2;\n  }\n  function log(df, method2, args) {\n    try {\n      df[method2].apply(df, [\"EXPRESSION\"].concat([].slice.call(args)));\n    } catch (err) {\n      df.warn(err);\n    }\n    return args[args.length - 1];\n  }\n  function warn() {\n    return log(this.context.dataflow, \"warn\", arguments);\n  }\n  function info() {\n    return log(this.context.dataflow, \"info\", arguments);\n  }\n  function debug() {\n    return log(this.context.dataflow, \"debug\", arguments);\n  }\n  function channel_luminance_value(channelValue) {\n    const val = channelValue / 255;\n    if (val <= 0.03928) {\n      return val / 12.92;\n    }\n    return Math.pow((val + 0.055) / 1.055, 2.4);\n  }\n  function luminance(color2) {\n    const c2 = rgb$1(color2), r = channel_luminance_value(c2.r), g = channel_luminance_value(c2.g), b2 = channel_luminance_value(c2.b);\n    return 0.2126 * r + 0.7152 * g + 0.0722 * b2;\n  }\n  function contrast(color1, color2) {\n    const lum1 = luminance(color1), lum2 = luminance(color2), lumL = Math.max(lum1, lum2), lumD = Math.min(lum1, lum2);\n    return (lumL + 0.05) / (lumD + 0.05);\n  }\n  function merge() {\n    const args = [].slice.call(arguments);\n    args.unshift({});\n    return extend$1(...args);\n  }\n  function equal(a2, b2) {\n    return a2 === b2 || a2 !== a2 && b2 !== b2 ? true : isArray(a2) ? isArray(b2) && a2.length === b2.length ? equalArray(a2, b2) : false : isObject$1(a2) && isObject$1(b2) ? equalObject(a2, b2) : false;\n  }\n  function equalArray(a2, b2) {\n    for (let i = 0, n = a2.length; i < n; ++i) {\n      if (!equal(a2[i], b2[i])) return false;\n    }\n    return true;\n  }\n  function equalObject(a2, b2) {\n    for (const key2 in a2) {\n      if (!equal(a2[key2], b2[key2])) return false;\n    }\n    return true;\n  }\n  function removePredicate(props) {\n    return (_) => equalObject(props, _);\n  }\n  function modify(name, insert2, remove2, toggle, modify2, values2) {\n    const df = this.context.dataflow, data2 = this.context.data[name], input = data2.input, stamp = df.stamp();\n    let changes = data2.changes, predicate, key2;\n    if (df._trigger === false || !(input.value.length || insert2 || toggle)) {\n      return 0;\n    }\n    if (!changes || changes.stamp < stamp) {\n      data2.changes = changes = df.changeset();\n      changes.stamp = stamp;\n      df.runAfter(() => {\n        data2.modified = true;\n        df.pulse(input, changes).run();\n      }, true, 1);\n    }\n    if (remove2) {\n      predicate = remove2 === true ? truthy : isArray(remove2) || isTuple(remove2) ? remove2 : removePredicate(remove2);\n      changes.remove(predicate);\n    }\n    if (insert2) {\n      changes.insert(insert2);\n    }\n    if (toggle) {\n      predicate = removePredicate(toggle);\n      if (input.value.some(predicate)) {\n        changes.remove(predicate);\n      } else {\n        changes.insert(toggle);\n      }\n    }\n    if (modify2) {\n      for (key2 in values2) {\n        changes.modify(modify2, key2, values2[key2]);\n      }\n    }\n    return 1;\n  }\n  function pinchDistance(event2) {\n    const t = event2.touches, dx = t[0].clientX - t[1].clientX, dy = t[0].clientY - t[1].clientY;\n    return Math.hypot(dx, dy);\n  }\n  function pinchAngle(event2) {\n    const t = event2.touches;\n    return Math.atan2(t[0].clientY - t[1].clientY, t[0].clientX - t[1].clientX);\n  }\n  const accessors = {};\n  function pluck(data2, name) {\n    const accessor2 = accessors[name] || (accessors[name] = field$1(name));\n    return isArray(data2) ? data2.map(accessor2) : accessor2(data2);\n  }\n  function array(seq) {\n    return isArray(seq) || ArrayBuffer.isView(seq) ? seq : null;\n  }\n  function sequence(seq) {\n    return array(seq) || (isString(seq) ? seq : null);\n  }\n  function join(seq, ...args) {\n    return array(seq).join(...args);\n  }\n  function indexof(seq, ...args) {\n    return sequence(seq).indexOf(...args);\n  }\n  function lastindexof(seq, ...args) {\n    return sequence(seq).lastIndexOf(...args);\n  }\n  function slice(seq, ...args) {\n    return sequence(seq).slice(...args);\n  }\n  function replace(str, pattern, repl) {\n    if (isFunction(repl)) error(\"Function argument passed to replace.\");\n    if (!isString(pattern) && !isRegExp(pattern)) error(\"Please pass a string or RegExp argument to replace.\");\n    return String(str).replace(pattern, repl);\n  }\n  function reverse(seq) {\n    return array(seq).slice().reverse();\n  }\n  function sort(seq) {\n    return array(seq).slice().sort(ascending$2);\n  }\n  function bandspace(count2, paddingInner, paddingOuter) {\n    return bandSpace(count2 || 0, paddingInner || 0, paddingOuter || 0);\n  }\n  function bandwidth(name, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s && s.bandwidth ? s.bandwidth() : 0;\n  }\n  function copy$5(name, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s ? s.copy() : void 0;\n  }\n  function domain(name, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s ? s.domain() : [];\n  }\n  function invert$1(name, range2, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return !s ? void 0 : isArray(range2) ? (s.invertRange || s.invert)(range2) : (s.invert || s.invertExtent)(range2);\n  }\n  function range$1(name, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s && s.range ? s.range() : [];\n  }\n  function scale$4(name, value2, group2) {\n    const s = getScale(name, (group2 || this).context);\n    return s ? s(value2) : void 0;\n  }\n  function scaleGradient(scale2, p02, p1, count2, group2) {\n    scale2 = getScale(scale2, (group2 || this).context);\n    const gradient2 = Gradient$1(p02, p1);\n    let stops = scale2.domain(), min2 = stops[0], max2 = peek$1(stops), fraction = identity$7;\n    if (!(max2 - min2)) {\n      scale2 = (scale2.interpolator ? scale$6(\"sequential\")().interpolator(scale2.interpolator()) : scale$6(\"linear\")().interpolate(scale2.interpolate()).range(scale2.range())).domain([min2 = 0, max2 = 1]);\n    } else {\n      fraction = scaleFraction(scale2, min2, max2);\n    }\n    if (scale2.ticks) {\n      stops = scale2.ticks(+count2 || 15);\n      if (min2 !== stops[0]) stops.unshift(min2);\n      if (max2 !== peek$1(stops)) stops.push(max2);\n    }\n    stops.forEach((_) => gradient2.stop(fraction(_), scale2(_)));\n    return gradient2;\n  }\n  function geoShape(projection2, geojson, group2) {\n    const p = getScale(projection2, (group2 || this).context);\n    return function(context2) {\n      return p ? p.path.context(context2)(geojson) : \"\";\n    };\n  }\n  function pathShape(path2) {\n    let p = null;\n    return function(context2) {\n      return context2 ? pathRender(context2, p = p || parse$3(path2)) : path2;\n    };\n  }\n  const datum = (d) => d.data;\n  function treeNodes(name, context2) {\n    const tree2 = data$1.call(context2, name);\n    return tree2.root && tree2.root.lookup || {};\n  }\n  function treePath(name, source2, target2) {\n    const nodes = treeNodes(name, this), s = nodes[source2], t = nodes[target2];\n    return s && t ? s.path(t).map(datum) : void 0;\n  }\n  function treeAncestors(name, node) {\n    const n = treeNodes(name, this)[node];\n    return n ? n.ancestors().map(datum) : void 0;\n  }\n  const _window = () => typeof window !== \"undefined\" && window || null;\n  function screen() {\n    const w2 = _window();\n    return w2 ? w2.screen : {};\n  }\n  function windowSize() {\n    const w2 = _window();\n    return w2 ? [w2.innerWidth, w2.innerHeight] : [void 0, void 0];\n  }\n  function containerSize() {\n    const view = this.context.dataflow, el = view.container && view.container();\n    return el ? [el.clientWidth, el.clientHeight] : [void 0, void 0];\n  }\n  function intersect(b2, opt, group2) {\n    if (!b2) return [];\n    const [u2, v] = b2, box2 = new Bounds().set(u2[0], u2[1], v[0], v[1]), scene = group2 || this.context.dataflow.scenegraph().root;\n    return intersect$2(scene, box2, filter(opt));\n  }\n  function filter(opt) {\n    let p = null;\n    if (opt) {\n      const types = array$5(opt.marktype), names = array$5(opt.markname);\n      p = (_) => (!types.length || types.some((t) => _.marktype === t)) && (!names.length || names.some((s) => _.name === s));\n    }\n    return p;\n  }\n  function lassoAppend(lasso, x2, y2, minDist = 5) {\n    lasso = array$5(lasso);\n    const last = lasso[lasso.length - 1];\n    return last === void 0 || Math.hypot(last[0] - x2, last[1] - y2) > minDist ? [...lasso, [x2, y2]] : lasso;\n  }\n  function lassoPath(lasso) {\n    return array$5(lasso).reduce((svg, [x2, y2], i) => {\n      return svg += i == 0 ? `M ${x2},${y2} ` : i === lasso.length - 1 ? \" Z\" : `L ${x2},${y2} `;\n    }, \"\");\n  }\n  function intersectLasso(markname, pixelLasso, unit2) {\n    const {\n      x: x2,\n      y: y2,\n      mark\n    } = unit2;\n    const bb = new Bounds().set(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER);\n    for (const [px2, py2] of pixelLasso) {\n      if (px2 < bb.x1) bb.x1 = px2;\n      if (px2 > bb.x2) bb.x2 = px2;\n      if (py2 < bb.y1) bb.y1 = py2;\n      if (py2 > bb.y2) bb.y2 = py2;\n    }\n    bb.translate(x2, y2);\n    const intersection2 = intersect([[bb.x1, bb.y1], [bb.x2, bb.y2]], markname, mark);\n    return intersection2.filter((tuple) => pointInPolygon(tuple.x, tuple.y, pixelLasso));\n  }\n  function pointInPolygon(testx, testy, polygon) {\n    let intersections = 0;\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n      const [prevX, prevY] = polygon[j];\n      const [x2, y2] = polygon[i];\n      if (y2 > testy != prevY > testy && testx < (prevX - x2) * (testy - y2) / (prevY - y2) + x2) {\n        intersections++;\n      }\n    }\n    return intersections & 1;\n  }\n  const functionContext = {\n    random() {\n      return random();\n    },\n    // override default\n    cumulativeNormal,\n    cumulativeLogNormal,\n    cumulativeUniform,\n    densityNormal,\n    densityLogNormal,\n    densityUniform,\n    quantileNormal,\n    quantileLogNormal,\n    quantileUniform,\n    sampleNormal,\n    sampleLogNormal,\n    sampleUniform,\n    isArray,\n    isBoolean: isBoolean$1,\n    isDate: isDate$1,\n    isDefined(_) {\n      return _ !== void 0;\n    },\n    isNumber: isNumber$1,\n    isObject: isObject$1,\n    isRegExp,\n    isString,\n    isTuple,\n    isValid(_) {\n      return _ != null && _ === _;\n    },\n    toBoolean,\n    toDate(_) {\n      return toDate(_);\n    },\n    // suppress extra arguments\n    toNumber,\n    toString,\n    indexof,\n    join,\n    lastindexof,\n    replace,\n    reverse,\n    sort,\n    slice,\n    flush,\n    lerp: lerp$1,\n    merge,\n    pad: pad$2,\n    peek: peek$1,\n    pluck,\n    span,\n    inrange,\n    truncate: truncate$1,\n    rgb: rgb$1,\n    lab: lab$1,\n    hcl: hcl$1,\n    hsl: hsl$1,\n    luminance,\n    contrast,\n    sequence: range$3,\n    format,\n    utcFormat,\n    utcParse,\n    utcOffset,\n    utcSequence,\n    timeFormat,\n    timeParse,\n    timeOffset,\n    timeSequence,\n    timeUnitSpecifier,\n    monthFormat,\n    monthAbbrevFormat,\n    dayFormat,\n    dayAbbrevFormat,\n    quarter,\n    utcquarter,\n    week,\n    utcweek,\n    dayofyear,\n    utcdayofyear,\n    warn,\n    info,\n    debug,\n    extent(_) {\n      return extent(_);\n    },\n    // suppress extra arguments\n    inScope,\n    intersect,\n    clampRange,\n    pinchDistance,\n    pinchAngle,\n    screen,\n    containerSize,\n    windowSize,\n    bandspace,\n    setdata,\n    pathShape,\n    panLinear,\n    panLog,\n    panPow,\n    panSymlog,\n    zoomLinear,\n    zoomLog,\n    zoomPow,\n    zoomSymlog,\n    encode,\n    modify,\n    lassoAppend,\n    lassoPath,\n    intersectLasso\n  };\n  const eventFunctions = [\"view\", \"item\", \"group\", \"xy\", \"x\", \"y\"], eventPrefix = \"event.vega.\", thisPrefix = \"this.\", astVisitors = {};\n  const codegenParams = {\n    forbidden: [\"_\"],\n    allowed: [\"datum\", \"event\", \"item\"],\n    fieldvar: \"datum\",\n    globalvar: (id2) => `_[${$(SignalPrefix + id2)}]`,\n    functions: buildFunctions,\n    constants: Constants$1,\n    visitors: astVisitors\n  };\n  const codeGenerator = codegen(codegenParams);\n  function buildFunctions(codegen2) {\n    const fn = Functions(codegen2);\n    eventFunctions.forEach((name) => fn[name] = eventPrefix + name);\n    for (const name in functionContext) {\n      fn[name] = thisPrefix + name;\n    }\n    extend$1(fn, internalScaleFunctions(codegen2, functionContext, astVisitors));\n    return fn;\n  }\n  function expressionFunction(name, fn, visitor) {\n    if (arguments.length === 1) {\n      return functionContext[name];\n    }\n    functionContext[name] = fn;\n    if (visitor) astVisitors[name] = visitor;\n    if (codeGenerator) codeGenerator.functions[name] = thisPrefix + name;\n    return this;\n  }\n  expressionFunction(\"bandwidth\", bandwidth, scaleVisitor);\n  expressionFunction(\"copy\", copy$5, scaleVisitor);\n  expressionFunction(\"domain\", domain, scaleVisitor);\n  expressionFunction(\"range\", range$1, scaleVisitor);\n  expressionFunction(\"invert\", invert$1, scaleVisitor);\n  expressionFunction(\"scale\", scale$4, scaleVisitor);\n  expressionFunction(\"gradient\", scaleGradient, scaleVisitor);\n  expressionFunction(\"geoArea\", geoArea, scaleVisitor);\n  expressionFunction(\"geoBounds\", geoBounds, scaleVisitor);\n  expressionFunction(\"geoCentroid\", geoCentroid, scaleVisitor);\n  expressionFunction(\"geoShape\", geoShape, scaleVisitor);\n  expressionFunction(\"geoScale\", geoScale, scaleVisitor);\n  expressionFunction(\"indata\", indata, indataVisitor);\n  expressionFunction(\"data\", data$1, dataVisitor);\n  expressionFunction(\"treePath\", treePath, dataVisitor);\n  expressionFunction(\"treeAncestors\", treeAncestors, dataVisitor);\n  expressionFunction(\"vlSelectionTest\", selectionTest, selectionVisitor);\n  expressionFunction(\"vlSelectionIdTest\", selectionIdTest, selectionVisitor);\n  expressionFunction(\"vlSelectionResolve\", selectionResolve, selectionVisitor);\n  expressionFunction(\"vlSelectionTuples\", selectionTuples);\n  function parser(expr2, scope) {\n    const params2 = {};\n    let ast;\n    try {\n      expr2 = isString(expr2) ? expr2 : $(expr2) + \"\";\n      ast = parser$1(expr2);\n    } catch (err) {\n      error(\"Expression parse error: \" + expr2);\n    }\n    ast.visit((node) => {\n      if (node.type !== CallExpression) return;\n      const name = node.callee.name, visit2 = codegenParams.visitors[name];\n      if (visit2) visit2(name, node.arguments, scope, params2);\n    });\n    const gen = codeGenerator(ast);\n    gen.globals.forEach((name) => {\n      const signalName = SignalPrefix + name;\n      if (!has$1(params2, signalName) && scope.getSignal(name)) {\n        params2[signalName] = scope.signalRef(name);\n      }\n    });\n    return {\n      $expr: extend$1({\n        code: gen.code\n      }, scope.options.ast ? {\n        ast\n      } : null),\n      $fields: gen.fields,\n      $params: params2\n    };\n  }\n  function parse$2(spec) {\n    const ctx = this, operators = spec.operators || [];\n    if (spec.background) {\n      ctx.background = spec.background;\n    }\n    if (spec.eventConfig) {\n      ctx.eventConfig = spec.eventConfig;\n    }\n    if (spec.locale) {\n      ctx.locale = spec.locale;\n    }\n    operators.forEach((entry2) => ctx.parseOperator(entry2));\n    operators.forEach((entry2) => ctx.parseOperatorParameters(entry2));\n    (spec.streams || []).forEach((entry2) => ctx.parseStream(entry2));\n    (spec.updates || []).forEach((entry2) => ctx.parseUpdate(entry2));\n    return ctx.resolve();\n  }\n  const Skip$2 = toSet([\"rule\"]), Swap = toSet([\"group\", \"image\", \"rect\"]);\n  function adjustSpatial(encode2, marktype) {\n    let code = \"\";\n    if (Skip$2[marktype]) return code;\n    if (encode2.x2) {\n      if (encode2.x) {\n        if (Swap[marktype]) {\n          code += \"if(o.x>o.x2)$=o.x,o.x=o.x2,o.x2=$;\";\n        }\n        code += \"o.width=o.x2-o.x;\";\n      } else {\n        code += \"o.x=o.x2-(o.width||0);\";\n      }\n    }\n    if (encode2.xc) {\n      code += \"o.x=o.xc-(o.width||0)/2;\";\n    }\n    if (encode2.y2) {\n      if (encode2.y) {\n        if (Swap[marktype]) {\n          code += \"if(o.y>o.y2)$=o.y,o.y=o.y2,o.y2=$;\";\n        }\n        code += \"o.height=o.y2-o.y;\";\n      } else {\n        code += \"o.y=o.y2-(o.height||0);\";\n      }\n    }\n    if (encode2.yc) {\n      code += \"o.y=o.yc-(o.height||0)/2;\";\n    }\n    return code;\n  }\n  function canonicalType(type2) {\n    return (type2 + \"\").toLowerCase();\n  }\n  function isOperator(type2) {\n    return canonicalType(type2) === \"operator\";\n  }\n  function isCollect(type2) {\n    return canonicalType(type2) === \"collect\";\n  }\n  function expression(ctx, args, code) {\n    if (!code.endsWith(\";\")) {\n      code = \"return(\" + code + \");\";\n    }\n    const fn = Function(...args.concat(code));\n    return ctx && ctx.functions ? fn.bind(ctx.functions) : fn;\n  }\n  function _compare(u2, v, lt, gt) {\n    return `((u = ${u2}) < (v = ${v}) || u == null) && v != null ? ${lt}\n  : (u > v || v == null) && u != null ? ${gt}\n  : ((v = v instanceof Date ? +v : v), (u = u instanceof Date ? +u : u)) !== u && v === v ? ${lt}\n  : v !== v && u === u ? ${gt} : `;\n  }\n  var expressionCodegen = {\n    /**\n     * Parse an expression used to update an operator value.\n     */\n    operator: (ctx, expr2) => expression(ctx, [\"_\"], expr2.code),\n    /**\n     * Parse an expression provided as an operator parameter value.\n     */\n    parameter: (ctx, expr2) => expression(ctx, [\"datum\", \"_\"], expr2.code),\n    /**\n     * Parse an expression applied to an event stream.\n     */\n    event: (ctx, expr2) => expression(ctx, [\"event\"], expr2.code),\n    /**\n     * Parse an expression used to handle an event-driven operator update.\n     */\n    handler: (ctx, expr2) => {\n      const code = `var datum=event.item&&event.item.datum;return ${expr2.code};`;\n      return expression(ctx, [\"_\", \"event\"], code);\n    },\n    /**\n     * Parse an expression that performs visual encoding.\n     */\n    encode: (ctx, encode2) => {\n      const {\n        marktype,\n        channels\n      } = encode2;\n      let code = \"var o=item,datum=o.datum,m=0,$;\";\n      for (const name in channels) {\n        const o = \"o[\" + $(name) + \"]\";\n        code += `$=${channels[name].code};if(${o}!==$)${o}=$,m=1;`;\n      }\n      code += adjustSpatial(channels, marktype);\n      code += \"return m;\";\n      return expression(ctx, [\"item\", \"_\"], code);\n    },\n    /**\n     * Optimized code generators for access and comparison.\n     */\n    codegen: {\n      get(path2) {\n        const ref2 = `[${path2.map($).join(\"][\")}]`;\n        const get2 = Function(\"_\", `return _${ref2};`);\n        get2.path = ref2;\n        return get2;\n      },\n      comparator(fields, orders) {\n        let t;\n        const map2 = (f, i) => {\n          const o = orders[i];\n          let u2, v;\n          if (f.path) {\n            u2 = `a${f.path}`;\n            v = `b${f.path}`;\n          } else {\n            (t = t || {})[\"f\" + i] = f;\n            u2 = `this.f${i}(a)`;\n            v = `this.f${i}(b)`;\n          }\n          return _compare(u2, v, -o, o);\n        };\n        const fn = Function(\"a\", \"b\", \"var u, v; return \" + fields.map(map2).join(\"\") + \"0;\");\n        return t ? fn.bind(t) : fn;\n      }\n    }\n  };\n  function parseOperator(spec) {\n    const ctx = this;\n    if (isOperator(spec.type) || !spec.type) {\n      ctx.operator(spec, spec.update ? ctx.operatorExpression(spec.update) : null);\n    } else {\n      ctx.transform(spec, spec.type);\n    }\n  }\n  function parseOperatorParameters(spec) {\n    const ctx = this;\n    if (spec.params) {\n      const op = ctx.get(spec.id);\n      if (!op) error(\"Invalid operator id: \" + spec.id);\n      ctx.dataflow.connect(op, op.parameters(ctx.parseParameters(spec.params), spec.react, spec.initonly));\n    }\n  }\n  function parseParameters$1(spec, params2) {\n    params2 = params2 || {};\n    const ctx = this;\n    for (const key2 in spec) {\n      const value2 = spec[key2];\n      params2[key2] = isArray(value2) ? value2.map((v) => parseParameter$2(v, ctx, params2)) : parseParameter$2(value2, ctx, params2);\n    }\n    return params2;\n  }\n  function parseParameter$2(spec, ctx, params2) {\n    if (!spec || !isObject$1(spec)) return spec;\n    for (let i = 0, n = PARSERS.length, p; i < n; ++i) {\n      p = PARSERS[i];\n      if (has$1(spec, p.key)) {\n        return p.parse(spec, ctx, params2);\n      }\n    }\n    return spec;\n  }\n  var PARSERS = [{\n    key: \"$ref\",\n    parse: getOperator\n  }, {\n    key: \"$key\",\n    parse: getKey\n  }, {\n    key: \"$expr\",\n    parse: getExpression\n  }, {\n    key: \"$field\",\n    parse: getField\n  }, {\n    key: \"$encode\",\n    parse: getEncode\n  }, {\n    key: \"$compare\",\n    parse: getCompare\n  }, {\n    key: \"$context\",\n    parse: getContext\n  }, {\n    key: \"$subflow\",\n    parse: getSubflow\n  }, {\n    key: \"$tupleid\",\n    parse: getTupleId\n  }];\n  function getOperator(_, ctx) {\n    return ctx.get(_.$ref) || error(\"Operator not defined: \" + _.$ref);\n  }\n  function getExpression(_, ctx, params2) {\n    if (_.$params) {\n      ctx.parseParameters(_.$params, params2);\n    }\n    const k = \"e:\" + _.$expr.code;\n    return ctx.fn[k] || (ctx.fn[k] = accessor(ctx.parameterExpression(_.$expr), _.$fields));\n  }\n  function getKey(_, ctx) {\n    const k = \"k:\" + _.$key + \"_\" + !!_.$flat;\n    return ctx.fn[k] || (ctx.fn[k] = key$2(_.$key, _.$flat, ctx.expr.codegen));\n  }\n  function getField(_, ctx) {\n    if (!_.$field) return null;\n    const k = \"f:\" + _.$field + \"_\" + _.$name;\n    return ctx.fn[k] || (ctx.fn[k] = field$1(_.$field, _.$name, ctx.expr.codegen));\n  }\n  function getCompare(_, ctx) {\n    const k = \"c:\" + _.$compare + \"_\" + _.$order, c2 = array$5(_.$compare).map((_2) => _2 && _2.$tupleid ? tupleid : _2);\n    return ctx.fn[k] || (ctx.fn[k] = compare$1(c2, _.$order, ctx.expr.codegen));\n  }\n  function getEncode(_, ctx) {\n    const spec = _.$encode, encode2 = {};\n    for (const name in spec) {\n      const enc = spec[name];\n      encode2[name] = accessor(ctx.encodeExpression(enc.$expr), enc.$fields);\n      encode2[name].output = enc.$output;\n    }\n    return encode2;\n  }\n  function getContext(_, ctx) {\n    return ctx;\n  }\n  function getSubflow(_, ctx) {\n    const spec = _.$subflow;\n    return function(dataflow, key2, parent) {\n      const subctx = ctx.fork().parse(spec), op = subctx.get(spec.operators[0].id), p = subctx.signals.parent;\n      if (p) p.set(parent);\n      op.detachSubflow = () => ctx.detach(subctx);\n      return op;\n    };\n  }\n  function getTupleId() {\n    return tupleid;\n  }\n  function parseStream$2(spec) {\n    var ctx = this, filter2 = spec.filter != null ? ctx.eventExpression(spec.filter) : void 0, stream2 = spec.stream != null ? ctx.get(spec.stream) : void 0, args;\n    if (spec.source) {\n      stream2 = ctx.events(spec.source, spec.type, filter2);\n    } else if (spec.merge) {\n      args = spec.merge.map((_) => ctx.get(_));\n      stream2 = args[0].merge.apply(args[0], args.slice(1));\n    }\n    if (spec.between) {\n      args = spec.between.map((_) => ctx.get(_));\n      stream2 = stream2.between(args[0], args[1]);\n    }\n    if (spec.filter) {\n      stream2 = stream2.filter(filter2);\n    }\n    if (spec.throttle != null) {\n      stream2 = stream2.throttle(+spec.throttle);\n    }\n    if (spec.debounce != null) {\n      stream2 = stream2.debounce(+spec.debounce);\n    }\n    if (stream2 == null) {\n      error(\"Invalid stream definition: \" + JSON.stringify(spec));\n    }\n    if (spec.consume) stream2.consume(true);\n    ctx.stream(spec, stream2);\n  }\n  function parseUpdate$1(spec) {\n    var ctx = this, srcid = isObject$1(srcid = spec.source) ? srcid.$ref : srcid, source2 = ctx.get(srcid), target2 = null, update2 = spec.update, params2 = void 0;\n    if (!source2) error(\"Source not defined: \" + spec.source);\n    target2 = spec.target && spec.target.$expr ? ctx.eventExpression(spec.target.$expr) : ctx.get(spec.target);\n    if (update2 && update2.$expr) {\n      if (update2.$params) {\n        params2 = ctx.parseParameters(update2.$params);\n      }\n      update2 = ctx.handlerExpression(update2.$expr);\n    }\n    ctx.update(spec, source2, target2, update2, params2);\n  }\n  const SKIP = {\n    skip: true\n  };\n  function getState$1(options) {\n    var ctx = this, state = {};\n    if (options.signals) {\n      var signals = state.signals = {};\n      Object.keys(ctx.signals).forEach((key2) => {\n        const op = ctx.signals[key2];\n        if (options.signals(key2, op)) {\n          signals[key2] = op.value;\n        }\n      });\n    }\n    if (options.data) {\n      var data2 = state.data = {};\n      Object.keys(ctx.data).forEach((key2) => {\n        const dataset = ctx.data[key2];\n        if (options.data(key2, dataset)) {\n          data2[key2] = dataset.input.value;\n        }\n      });\n    }\n    if (ctx.subcontext && options.recurse !== false) {\n      state.subcontext = ctx.subcontext.map((ctx2) => ctx2.getState(options));\n    }\n    return state;\n  }\n  function setState$1(state) {\n    var ctx = this, df = ctx.dataflow, data2 = state.data, signals = state.signals;\n    Object.keys(signals || {}).forEach((key2) => {\n      df.update(ctx.signals[key2], signals[key2], SKIP);\n    });\n    Object.keys(data2 || {}).forEach((key2) => {\n      df.pulse(ctx.data[key2].input, df.changeset().remove(truthy).insert(data2[key2]));\n    });\n    (state.subcontext || []).forEach((substate, i) => {\n      const subctx = ctx.subcontext[i];\n      if (subctx) subctx.setState(substate);\n    });\n  }\n  function context(df, transforms2, functions, expr2) {\n    return new Context(df, transforms2, functions, expr2);\n  }\n  function Context(df, transforms2, functions, expr2) {\n    this.dataflow = df;\n    this.transforms = transforms2;\n    this.events = df.events.bind(df);\n    this.expr = expr2 || expressionCodegen, this.signals = {};\n    this.scales = {};\n    this.nodes = {};\n    this.data = {};\n    this.fn = {};\n    if (functions) {\n      this.functions = Object.create(functions);\n      this.functions.context = this;\n    }\n  }\n  function Subcontext(ctx) {\n    this.dataflow = ctx.dataflow;\n    this.transforms = ctx.transforms;\n    this.events = ctx.events;\n    this.expr = ctx.expr;\n    this.signals = Object.create(ctx.signals);\n    this.scales = Object.create(ctx.scales);\n    this.nodes = Object.create(ctx.nodes);\n    this.data = Object.create(ctx.data);\n    this.fn = Object.create(ctx.fn);\n    if (ctx.functions) {\n      this.functions = Object.create(ctx.functions);\n      this.functions.context = this;\n    }\n  }\n  Context.prototype = Subcontext.prototype = {\n    fork() {\n      const ctx = new Subcontext(this);\n      (this.subcontext || (this.subcontext = [])).push(ctx);\n      return ctx;\n    },\n    detach(ctx) {\n      this.subcontext = this.subcontext.filter((c2) => c2 !== ctx);\n      const keys2 = Object.keys(ctx.nodes);\n      for (const key2 of keys2) ctx.nodes[key2]._targets = null;\n      for (const key2 of keys2) ctx.nodes[key2].detach();\n      ctx.nodes = null;\n    },\n    get(id2) {\n      return this.nodes[id2];\n    },\n    set(id2, node) {\n      return this.nodes[id2] = node;\n    },\n    add(spec, op) {\n      const ctx = this, df = ctx.dataflow, data2 = spec.value;\n      ctx.set(spec.id, op);\n      if (isCollect(spec.type) && data2) {\n        if (data2.$ingest) {\n          df.ingest(op, data2.$ingest, data2.$format);\n        } else if (data2.$request) {\n          df.preload(op, data2.$request, data2.$format);\n        } else {\n          df.pulse(op, df.changeset().insert(data2));\n        }\n      }\n      if (spec.root) {\n        ctx.root = op;\n      }\n      if (spec.parent) {\n        let p = ctx.get(spec.parent.$ref);\n        if (p) {\n          df.connect(p, [op]);\n          op.targets().add(p);\n        } else {\n          (ctx.unresolved = ctx.unresolved || []).push(() => {\n            p = ctx.get(spec.parent.$ref);\n            df.connect(p, [op]);\n            op.targets().add(p);\n          });\n        }\n      }\n      if (spec.signal) {\n        ctx.signals[spec.signal] = op;\n      }\n      if (spec.scale) {\n        ctx.scales[spec.scale] = op;\n      }\n      if (spec.data) {\n        for (const name in spec.data) {\n          const data3 = ctx.data[name] || (ctx.data[name] = {});\n          spec.data[name].forEach((role) => data3[role] = op);\n        }\n      }\n    },\n    resolve() {\n      (this.unresolved || []).forEach((fn) => fn());\n      delete this.unresolved;\n      return this;\n    },\n    operator(spec, update2) {\n      this.add(spec, this.dataflow.add(spec.value, update2));\n    },\n    transform(spec, type2) {\n      this.add(spec, this.dataflow.add(this.transforms[canonicalType(type2)]));\n    },\n    stream(spec, stream2) {\n      this.set(spec.id, stream2);\n    },\n    update(spec, stream2, target2, update2, params2) {\n      this.dataflow.on(stream2, target2, update2, params2, spec.options);\n    },\n    // expression parsing\n    operatorExpression(expr2) {\n      return this.expr.operator(this, expr2);\n    },\n    parameterExpression(expr2) {\n      return this.expr.parameter(this, expr2);\n    },\n    eventExpression(expr2) {\n      return this.expr.event(this, expr2);\n    },\n    handlerExpression(expr2) {\n      return this.expr.handler(this, expr2);\n    },\n    encodeExpression(encode2) {\n      return this.expr.encode(this, encode2);\n    },\n    // parse methods\n    parse: parse$2,\n    parseOperator,\n    parseOperatorParameters,\n    parseParameters: parseParameters$1,\n    parseStream: parseStream$2,\n    parseUpdate: parseUpdate$1,\n    // state methods\n    getState: getState$1,\n    setState: setState$1\n  };\n  function initializeAria(view) {\n    const el = view.container();\n    if (el) {\n      el.setAttribute(\"role\", \"graphics-document\");\n      el.setAttribute(\"aria-roleDescription\", \"visualization\");\n      ariaLabel(el, view.description());\n    }\n  }\n  function ariaLabel(el, desc) {\n    if (el) desc == null ? el.removeAttribute(\"aria-label\") : el.setAttribute(\"aria-label\", desc);\n  }\n  function background(view) {\n    view.add(null, (_) => {\n      view._background = _.bg;\n      view._resize = 1;\n      return _.bg;\n    }, {\n      bg: view._signals.background\n    });\n  }\n  const Default = \"default\";\n  function cursor(view) {\n    const cursor2 = view._signals.cursor || (view._signals.cursor = view.add({\n      user: Default,\n      item: null\n    }));\n    view.on(view.events(\"view\", \"pointermove\"), cursor2, (_, event2) => {\n      const value2 = cursor2.value, user = value2 ? isString(value2) ? value2 : value2.user : Default, item = event2.item && event2.item.cursor || null;\n      return value2 && user === value2.user && item == value2.item ? value2 : {\n        user,\n        item\n      };\n    });\n    view.add(null, function(_) {\n      let user = _.cursor, item = this.value;\n      if (!isString(user)) {\n        item = user.item;\n        user = user.user;\n      }\n      setCursor(view, user && user !== Default ? user : item || user);\n      return item;\n    }, {\n      cursor: cursor2\n    });\n  }\n  function setCursor(view, cursor2) {\n    const el = view.globalCursor() ? typeof document !== \"undefined\" && document.body : view.container();\n    if (el) {\n      return cursor2 == null ? el.style.removeProperty(\"cursor\") : el.style.cursor = cursor2;\n    }\n  }\n  function dataref(view, name) {\n    var data2 = view._runtime.data;\n    if (!has$1(data2, name)) {\n      error(\"Unrecognized data set: \" + name);\n    }\n    return data2[name];\n  }\n  function data(name, values2) {\n    return arguments.length < 2 ? dataref(this, name).values.value : change.call(this, name, changeset().remove(truthy).insert(values2));\n  }\n  function change(name, changes) {\n    if (!isChangeSet(changes)) {\n      error(\"Second argument to changes must be a changeset.\");\n    }\n    const dataset = dataref(this, name);\n    dataset.modified = true;\n    return this.pulse(dataset.input, changes);\n  }\n  function insert(name, _) {\n    return change.call(this, name, changeset().insert(_));\n  }\n  function remove(name, _) {\n    return change.call(this, name, changeset().remove(_));\n  }\n  function width(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewWidth + padding2.left + padding2.right);\n  }\n  function height(view) {\n    var padding2 = view.padding();\n    return Math.max(0, view._viewHeight + padding2.top + padding2.bottom);\n  }\n  function offset(view) {\n    var padding2 = view.padding(), origin = view._origin;\n    return [padding2.left + origin[0], padding2.top + origin[1]];\n  }\n  function resizeRenderer(view) {\n    var origin = offset(view), w2 = width(view), h2 = height(view);\n    view._renderer.background(view.background());\n    view._renderer.resize(w2, h2, origin);\n    view._handler.origin(origin);\n    view._resizeListeners.forEach((handler) => {\n      try {\n        handler(w2, h2);\n      } catch (error2) {\n        view.error(error2);\n      }\n    });\n  }\n  function eventExtend(view, event2, item) {\n    var r = view._renderer, el = r && r.canvas(), p, e, translate2;\n    if (el) {\n      translate2 = offset(view);\n      e = event2.changedTouches ? event2.changedTouches[0] : event2;\n      p = point(e, el);\n      p[0] -= translate2[0];\n      p[1] -= translate2[1];\n    }\n    event2.dataflow = view;\n    event2.item = item;\n    event2.vega = extension(view, item, p);\n    return event2;\n  }\n  function extension(view, item, point2) {\n    const itemGroup = item ? item.mark.marktype === \"group\" ? item : item.mark.group : null;\n    function group2(name) {\n      var g = itemGroup, i;\n      if (name) for (i = item; i; i = i.mark.group) {\n        if (i.mark.name === name) {\n          g = i;\n          break;\n        }\n      }\n      return g && g.mark && g.mark.interactive ? g : {};\n    }\n    function xy(item2) {\n      if (!item2) return point2;\n      if (isString(item2)) item2 = group2(item2);\n      const p = point2.slice();\n      while (item2) {\n        p[0] -= item2.x || 0;\n        p[1] -= item2.y || 0;\n        item2 = item2.mark && item2.mark.group;\n      }\n      return p;\n    }\n    return {\n      view: constant$5(view),\n      item: constant$5(item || {}),\n      group: group2,\n      xy,\n      x: (item2) => xy(item2)[0],\n      y: (item2) => xy(item2)[1]\n    };\n  }\n  const VIEW$1 = \"view\", TIMER = \"timer\", WINDOW = \"window\", NO_TRAP = {\n    trap: false\n  };\n  function initializeEventConfig(config) {\n    const events2 = extend$1({\n      defaults: {}\n    }, config);\n    const unpack = (obj, keys2) => {\n      keys2.forEach((k) => {\n        if (isArray(obj[k])) obj[k] = toSet(obj[k]);\n      });\n    };\n    unpack(events2.defaults, [\"prevent\", \"allow\"]);\n    unpack(events2, [\"view\", \"window\", \"selector\"]);\n    return events2;\n  }\n  function trackEventListener(view, sources, type2, handler) {\n    view._eventListeners.push({\n      type: type2,\n      sources: array$5(sources),\n      handler\n    });\n  }\n  function prevent(view, type2) {\n    var def2 = view._eventConfig.defaults, prevent2 = def2.prevent, allow = def2.allow;\n    return prevent2 === false || allow === true ? false : prevent2 === true || allow === false ? true : prevent2 ? prevent2[type2] : allow ? !allow[type2] : view.preventDefault();\n  }\n  function permit(view, key2, type2) {\n    const rule2 = view._eventConfig && view._eventConfig[key2];\n    if (rule2 === false || isObject$1(rule2) && !rule2[type2]) {\n      view.warn(`Blocked ${key2} ${type2} event listener.`);\n      return false;\n    }\n    return true;\n  }\n  function events(source2, type2, filter2) {\n    var view = this, s = new EventStream(filter2), send = function(e, item) {\n      view.runAsync(null, () => {\n        if (source2 === VIEW$1 && prevent(view, type2)) {\n          e.preventDefault();\n        }\n        s.receive(eventExtend(view, e, item));\n      });\n    }, sources;\n    if (source2 === TIMER) {\n      if (permit(view, \"timer\", type2)) {\n        view.timer(send, type2);\n      }\n    } else if (source2 === VIEW$1) {\n      if (permit(view, \"view\", type2)) {\n        view.addEventListener(type2, send, NO_TRAP);\n      }\n    } else {\n      if (source2 === WINDOW) {\n        if (permit(view, \"window\", type2) && typeof window !== \"undefined\") {\n          sources = [window];\n        }\n      } else if (typeof document !== \"undefined\") {\n        if (permit(view, \"selector\", type2)) {\n          sources = Array.from(document.querySelectorAll(source2));\n        }\n      }\n      if (!sources) {\n        view.warn(\"Can not resolve event source: \" + source2);\n      } else {\n        for (var i = 0, n = sources.length; i < n; ++i) {\n          sources[i].addEventListener(type2, send);\n        }\n        trackEventListener(view, sources, type2, send);\n      }\n    }\n    return s;\n  }\n  function itemFilter(event2) {\n    return event2.item;\n  }\n  function markTarget(event2) {\n    return event2.item.mark.source;\n  }\n  function invoke(name) {\n    return function(_, event2) {\n      return event2.vega.view().changeset().encode(event2.item, name);\n    };\n  }\n  function hover(hoverSet, leaveSet) {\n    hoverSet = [hoverSet || \"hover\"];\n    leaveSet = [leaveSet || \"update\", hoverSet[0]];\n    this.on(this.events(\"view\", \"pointerover\", itemFilter), markTarget, invoke(hoverSet));\n    this.on(this.events(\"view\", \"pointerout\", itemFilter), markTarget, invoke(leaveSet));\n    return this;\n  }\n  function finalize() {\n    var tooltip = this._tooltip, timers = this._timers, handlers = this._handler.handlers(), listeners = this._eventListeners, n, m2, e, h2, t;\n    n = timers.length;\n    while (--n >= 0) {\n      timers[n].stop();\n    }\n    n = listeners.length;\n    while (--n >= 0) {\n      e = listeners[n];\n      m2 = e.sources.length;\n      while (--m2 >= 0) {\n        e.sources[m2].removeEventListener(e.type, e.handler);\n      }\n    }\n    if (tooltip) {\n      tooltip.call(this, this._handler, null, null, null);\n    }\n    n = handlers.length;\n    while (--n >= 0) {\n      t = handlers[n].type;\n      h2 = handlers[n].handler;\n      this._handler.off(t, h2);\n    }\n    return this;\n  }\n  function element(tag, attr2, text2) {\n    const el = document.createElement(tag);\n    for (const key2 in attr2) el.setAttribute(key2, attr2[key2]);\n    if (text2 != null) el.textContent = text2;\n    return el;\n  }\n  const BindClass = \"vega-bind\", NameClass = \"vega-bind-name\", RadioClass = \"vega-bind-radio\";\n  function bind(view, el, binding) {\n    if (!el) return;\n    const param2 = binding.param;\n    let bind2 = binding.state;\n    if (!bind2) {\n      bind2 = binding.state = {\n        elements: null,\n        active: false,\n        set: null,\n        update: (value2) => {\n          if (value2 != view.signal(param2.signal)) {\n            view.runAsync(null, () => {\n              bind2.source = true;\n              view.signal(param2.signal, value2);\n            });\n          }\n        }\n      };\n      if (param2.debounce) {\n        bind2.update = debounce(param2.debounce, bind2.update);\n      }\n    }\n    const create2 = param2.input == null && param2.element ? target : generate;\n    create2(bind2, el, param2, view);\n    if (!bind2.active) {\n      view.on(view._signals[param2.signal], null, () => {\n        bind2.source ? bind2.source = false : bind2.set(view.signal(param2.signal));\n      });\n      bind2.active = true;\n    }\n    return bind2;\n  }\n  function target(bind2, node, param2, view) {\n    const type2 = param2.event || \"input\";\n    const handler = () => bind2.update(node.value);\n    view.signal(param2.signal, node.value);\n    node.addEventListener(type2, handler);\n    trackEventListener(view, node, type2, handler);\n    bind2.set = (value2) => {\n      node.value = value2;\n      node.dispatchEvent(event(type2));\n    };\n  }\n  function event(type2) {\n    return typeof Event !== \"undefined\" ? new Event(type2) : {\n      type: type2\n    };\n  }\n  function generate(bind2, el, param2, view) {\n    const value2 = view.signal(param2.signal);\n    const div = element(\"div\", {\n      \"class\": BindClass\n    });\n    const wrapper = param2.input === \"radio\" ? div : div.appendChild(element(\"label\"));\n    wrapper.appendChild(element(\"span\", {\n      \"class\": NameClass\n    }, param2.name || param2.signal));\n    el.appendChild(div);\n    let input = form;\n    switch (param2.input) {\n      case \"checkbox\":\n        input = checkbox;\n        break;\n      case \"select\":\n        input = select;\n        break;\n      case \"radio\":\n        input = radio;\n        break;\n      case \"range\":\n        input = range;\n        break;\n    }\n    input(bind2, wrapper, param2, value2);\n  }\n  function form(bind2, el, param2, value2) {\n    const node = element(\"input\");\n    for (const key2 in param2) {\n      if (key2 !== \"signal\" && key2 !== \"element\") {\n        node.setAttribute(key2 === \"input\" ? \"type\" : key2, param2[key2]);\n      }\n    }\n    node.setAttribute(\"name\", param2.signal);\n    node.value = value2;\n    el.appendChild(node);\n    node.addEventListener(\"input\", () => bind2.update(node.value));\n    bind2.elements = [node];\n    bind2.set = (value3) => node.value = value3;\n  }\n  function checkbox(bind2, el, param2, value2) {\n    const attr2 = {\n      type: \"checkbox\",\n      name: param2.signal\n    };\n    if (value2) attr2.checked = true;\n    const node = element(\"input\", attr2);\n    el.appendChild(node);\n    node.addEventListener(\"change\", () => bind2.update(node.checked));\n    bind2.elements = [node];\n    bind2.set = (value3) => node.checked = !!value3 || null;\n  }\n  function select(bind2, el, param2, value2) {\n    const node = element(\"select\", {\n      name: param2.signal\n    }), labels = param2.labels || [];\n    param2.options.forEach((option, i) => {\n      const attr2 = {\n        value: option\n      };\n      if (valuesEqual(option, value2)) attr2.selected = true;\n      node.appendChild(element(\"option\", attr2, (labels[i] || option) + \"\"));\n    });\n    el.appendChild(node);\n    node.addEventListener(\"change\", () => {\n      bind2.update(param2.options[node.selectedIndex]);\n    });\n    bind2.elements = [node];\n    bind2.set = (value3) => {\n      for (let i = 0, n = param2.options.length; i < n; ++i) {\n        if (valuesEqual(param2.options[i], value3)) {\n          node.selectedIndex = i;\n          return;\n        }\n      }\n    };\n  }\n  function radio(bind2, el, param2, value2) {\n    const group2 = element(\"span\", {\n      \"class\": RadioClass\n    }), labels = param2.labels || [];\n    el.appendChild(group2);\n    bind2.elements = param2.options.map((option, i) => {\n      const attr2 = {\n        type: \"radio\",\n        name: param2.signal,\n        value: option\n      };\n      if (valuesEqual(option, value2)) attr2.checked = true;\n      const input = element(\"input\", attr2);\n      input.addEventListener(\"change\", () => bind2.update(option));\n      const label2 = element(\"label\", {}, (labels[i] || option) + \"\");\n      label2.prepend(input);\n      group2.appendChild(label2);\n      return input;\n    });\n    bind2.set = (value3) => {\n      const nodes = bind2.elements, n = nodes.length;\n      for (let i = 0; i < n; ++i) {\n        if (valuesEqual(nodes[i].value, value3)) nodes[i].checked = true;\n      }\n    };\n  }\n  function range(bind2, el, param2, value2) {\n    value2 = value2 !== void 0 ? value2 : (+param2.max + +param2.min) / 2;\n    const max2 = param2.max != null ? param2.max : Math.max(100, +value2) || 100, min2 = param2.min || Math.min(0, max2, +value2) || 0, step = param2.step || tickStep(min2, max2, 100);\n    const node = element(\"input\", {\n      type: \"range\",\n      name: param2.signal,\n      min: min2,\n      max: max2,\n      step\n    });\n    node.value = value2;\n    const span2 = element(\"span\", {}, +value2);\n    el.appendChild(node);\n    el.appendChild(span2);\n    const update2 = () => {\n      span2.textContent = node.value;\n      bind2.update(+node.value);\n    };\n    node.addEventListener(\"input\", update2);\n    node.addEventListener(\"change\", update2);\n    bind2.elements = [node];\n    bind2.set = (value3) => {\n      node.value = value3;\n      span2.textContent = value3;\n    };\n  }\n  function valuesEqual(a2, b2) {\n    return a2 === b2 || a2 + \"\" === b2 + \"\";\n  }\n  function initializeRenderer(view, r, el, constructor, scaleFactor, opt) {\n    r = r || new constructor(view.loader());\n    return r.initialize(el, width(view), height(view), offset(view), scaleFactor, opt).background(view.background());\n  }\n  function trap(view, fn) {\n    return !fn ? null : function() {\n      try {\n        fn.apply(this, arguments);\n      } catch (error2) {\n        view.error(error2);\n      }\n    };\n  }\n  function initializeHandler(view, prevHandler, el, constructor) {\n    const handler = new constructor(view.loader(), trap(view, view.tooltip())).scene(view.scenegraph().root).initialize(el, offset(view), view);\n    if (prevHandler) {\n      prevHandler.handlers().forEach((h2) => {\n        handler.on(h2.type, h2.handler);\n      });\n    }\n    return handler;\n  }\n  function initialize(el, elBind) {\n    const view = this, type2 = view._renderType, config = view._eventConfig.bind, module = renderModule(type2);\n    el = view._el = el ? lookup$1(view, el, true) : null;\n    initializeAria(view);\n    if (!module) view.error(\"Unrecognized renderer type: \" + type2);\n    const Handler2 = module.handler || CanvasHandler, Renderer2 = el ? module.renderer : module.headless;\n    view._renderer = !Renderer2 ? null : initializeRenderer(view, view._renderer, el, Renderer2);\n    view._handler = initializeHandler(view, view._handler, el, Handler2);\n    view._redraw = true;\n    if (el && config !== \"none\") {\n      elBind = elBind ? view._elBind = lookup$1(view, elBind, true) : el.appendChild(element(\"form\", {\n        \"class\": \"vega-bindings\"\n      }));\n      view._bind.forEach((_) => {\n        if (_.param.element && config !== \"container\") {\n          _.element = lookup$1(view, _.param.element, !!_.param.input);\n        }\n      });\n      view._bind.forEach((_) => {\n        bind(view, _.element || elBind, _);\n      });\n    }\n    return view;\n  }\n  function lookup$1(view, el, clear) {\n    if (typeof el === \"string\") {\n      if (typeof document !== \"undefined\") {\n        el = document.querySelector(el);\n        if (!el) {\n          view.error(\"Signal bind element not found: \" + el);\n          return null;\n        }\n      } else {\n        view.error(\"DOM document instance not found.\");\n        return null;\n      }\n    }\n    if (el && clear) {\n      try {\n        el.textContent = \"\";\n      } catch (e) {\n        el = null;\n        view.error(e);\n      }\n    }\n    return el;\n  }\n  const number$1 = (_) => +_ || 0;\n  const paddingObject$1 = (_) => ({\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  });\n  function padding(_) {\n    return isObject$1(_) ? {\n      top: number$1(_.top),\n      bottom: number$1(_.bottom),\n      left: number$1(_.left),\n      right: number$1(_.right)\n    } : paddingObject$1(number$1(_));\n  }\n  async function renderHeadless(view, type2, scaleFactor, opt) {\n    const module = renderModule(type2), ctr = module && module.headless;\n    if (!ctr) error(\"Unrecognized renderer type: \" + type2);\n    await view.runAsync();\n    return initializeRenderer(view, null, null, ctr, scaleFactor, opt).renderAsync(view._scenegraph.root);\n  }\n  async function renderToImageURL(type2, scaleFactor) {\n    if (type2 !== RenderType.Canvas && type2 !== RenderType.SVG && type2 !== RenderType.PNG) {\n      error(\"Unrecognized image type: \" + type2);\n    }\n    const r = await renderHeadless(this, type2, scaleFactor);\n    return type2 === RenderType.SVG ? toBlobURL(r.svg(), \"image/svg+xml\") : r.canvas().toDataURL(\"image/png\");\n  }\n  function toBlobURL(data2, mime) {\n    const blob = new Blob([data2], {\n      type: mime\n    });\n    return window.URL.createObjectURL(blob);\n  }\n  async function renderToCanvas(scaleFactor, opt) {\n    const r = await renderHeadless(this, RenderType.Canvas, scaleFactor, opt);\n    return r.canvas();\n  }\n  async function renderToSVG(scaleFactor) {\n    const r = await renderHeadless(this, RenderType.SVG, scaleFactor);\n    return r.svg();\n  }\n  function runtime(view, spec, expr2) {\n    return context(view, transforms, functionContext, expr2).parse(spec);\n  }\n  function scale$3(name) {\n    var scales2 = this._runtime.scales;\n    if (!has$1(scales2, name)) {\n      error(\"Unrecognized scale or projection: \" + name);\n    }\n    return scales2[name].value;\n  }\n  var Width = \"width\", Height = \"height\", Padding = \"padding\", Skip$1 = {\n    skip: true\n  };\n  function viewWidth(view, width2) {\n    var a2 = view.autosize(), p = view.padding();\n    return width2 - (a2 && a2.contains === Padding ? p.left + p.right : 0);\n  }\n  function viewHeight(view, height2) {\n    var a2 = view.autosize(), p = view.padding();\n    return height2 - (a2 && a2.contains === Padding ? p.top + p.bottom : 0);\n  }\n  function initializeResize(view) {\n    var s = view._signals, w2 = s[Width], h2 = s[Height], p = s[Padding];\n    function resetSize() {\n      view._autosize = view._resize = 1;\n    }\n    view._resizeWidth = view.add(null, (_) => {\n      view._width = _.size;\n      view._viewWidth = viewWidth(view, _.size);\n      resetSize();\n    }, {\n      size: w2\n    });\n    view._resizeHeight = view.add(null, (_) => {\n      view._height = _.size;\n      view._viewHeight = viewHeight(view, _.size);\n      resetSize();\n    }, {\n      size: h2\n    });\n    const resizePadding = view.add(null, resetSize, {\n      pad: p\n    });\n    view._resizeWidth.rank = w2.rank + 1;\n    view._resizeHeight.rank = h2.rank + 1;\n    resizePadding.rank = p.rank + 1;\n  }\n  function resizeView(viewWidth2, viewHeight2, width2, height2, origin, auto) {\n    this.runAfter((view) => {\n      let rerun2 = 0;\n      view._autosize = 0;\n      if (view.width() !== width2) {\n        rerun2 = 1;\n        view.signal(Width, width2, Skip$1);\n        view._resizeWidth.skip(true);\n      }\n      if (view.height() !== height2) {\n        rerun2 = 1;\n        view.signal(Height, height2, Skip$1);\n        view._resizeHeight.skip(true);\n      }\n      if (view._viewWidth !== viewWidth2) {\n        view._resize = 1;\n        view._viewWidth = viewWidth2;\n      }\n      if (view._viewHeight !== viewHeight2) {\n        view._resize = 1;\n        view._viewHeight = viewHeight2;\n      }\n      if (view._origin[0] !== origin[0] || view._origin[1] !== origin[1]) {\n        view._resize = 1;\n        view._origin = origin;\n      }\n      if (rerun2) view.run(\"enter\");\n      if (auto) view.runAfter((v) => v.resize());\n    }, false, 1);\n  }\n  function getState(options) {\n    return this._runtime.getState(options || {\n      data: dataTest,\n      signals: signalTest,\n      recurse: true\n    });\n  }\n  function dataTest(name, data2) {\n    return data2.modified && isArray(data2.input.value) && !name.startsWith(\"_:vega:_\");\n  }\n  function signalTest(name, op) {\n    return !(name === \"parent\" || op instanceof transforms.proxy);\n  }\n  function setState(state) {\n    this.runAsync(null, (v) => {\n      v._trigger = false;\n      v._runtime.setState(state);\n    }, (v) => {\n      v._trigger = true;\n    });\n    return this;\n  }\n  function timer(callback, delay) {\n    function tick(elapsed) {\n      callback({\n        timestamp: Date.now(),\n        elapsed\n      });\n    }\n    this._timers.push(interval(tick, delay));\n  }\n  function defaultTooltip(handler, event2, item, value2) {\n    const el = handler.element();\n    if (el) el.setAttribute(\"title\", formatTooltip(value2));\n  }\n  function formatTooltip(value2) {\n    return value2 == null ? \"\" : isArray(value2) ? formatArray(value2) : isObject$1(value2) && !isDate$1(value2) ? formatObject(value2) : value2 + \"\";\n  }\n  function formatObject(obj) {\n    return Object.keys(obj).map((key2) => {\n      const v = obj[key2];\n      return key2 + \": \" + (isArray(v) ? formatArray(v) : formatValue(v));\n    }).join(\"\\n\");\n  }\n  function formatArray(value2) {\n    return \"[\" + value2.map(formatValue).join(\", \") + \"]\";\n  }\n  function formatValue(value2) {\n    return isArray(value2) ? \"[…]\" : isObject$1(value2) && !isDate$1(value2) ? \"{…}\" : value2;\n  }\n  function watchPixelRatio() {\n    if (this.renderer() === \"canvas\" && this._renderer._canvas) {\n      let remove2 = null;\n      const updatePixelRatio = () => {\n        if (remove2 != null) {\n          remove2();\n        }\n        const media = matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`);\n        media.addEventListener(\"change\", updatePixelRatio);\n        remove2 = () => {\n          media.removeEventListener(\"change\", updatePixelRatio);\n        };\n        this._renderer._canvas.getContext(\"2d\").pixelRatio = window.devicePixelRatio || 1;\n        this._redraw = true;\n        this._resize = 1;\n        this.resize().runAsync();\n      };\n      updatePixelRatio();\n    }\n  }\n  function View$1(spec, options) {\n    const view = this;\n    options = options || {};\n    Dataflow.call(view);\n    if (options.loader) view.loader(options.loader);\n    if (options.logger) view.logger(options.logger);\n    if (options.logLevel != null) view.logLevel(options.logLevel);\n    if (options.locale || spec.locale) {\n      const loc = extend$1({}, spec.locale, options.locale);\n      view.locale(locale(loc.number, loc.time));\n    }\n    view._el = null;\n    view._elBind = null;\n    view._renderType = options.renderer || RenderType.Canvas;\n    view._scenegraph = new Scenegraph();\n    const root = view._scenegraph.root;\n    view._renderer = null;\n    view._tooltip = options.tooltip || defaultTooltip, view._redraw = true;\n    view._handler = new CanvasHandler().scene(root);\n    view._globalCursor = false;\n    view._preventDefault = false;\n    view._timers = [];\n    view._eventListeners = [];\n    view._resizeListeners = [];\n    view._eventConfig = initializeEventConfig(spec.eventConfig);\n    view.globalCursor(view._eventConfig.globalCursor);\n    const ctx = runtime(view, spec, options.expr);\n    view._runtime = ctx;\n    view._signals = ctx.signals;\n    view._bind = (spec.bindings || []).map((_) => ({\n      state: null,\n      param: extend$1({}, _)\n    }));\n    if (ctx.root) ctx.root.set(root);\n    root.source = ctx.data.root.input;\n    view.pulse(ctx.data.root.input, view.changeset().insert(root.items));\n    view._width = view.width();\n    view._height = view.height();\n    view._viewWidth = viewWidth(view, view._width);\n    view._viewHeight = viewHeight(view, view._height);\n    view._origin = [0, 0];\n    view._resize = 0;\n    view._autosize = 1;\n    initializeResize(view);\n    background(view);\n    cursor(view);\n    view.description(spec.description);\n    if (options.hover) view.hover();\n    if (options.container) view.initialize(options.container, options.bind);\n    if (options.watchPixelRatio) view._watchPixelRatio();\n  }\n  function lookupSignal(view, name) {\n    return has$1(view._signals, name) ? view._signals[name] : error(\"Unrecognized signal name: \" + $(name));\n  }\n  function findOperatorHandler(op, handler) {\n    const h2 = (op._targets || []).filter((op2) => op2._update && op2._update.handler === handler);\n    return h2.length ? h2[0] : null;\n  }\n  function addOperatorListener(view, name, op, handler) {\n    let h2 = findOperatorHandler(op, handler);\n    if (!h2) {\n      h2 = trap(view, () => handler(name, op.value));\n      h2.handler = handler;\n      view.on(op, null, h2);\n    }\n    return view;\n  }\n  function removeOperatorListener(view, op, handler) {\n    const h2 = findOperatorHandler(op, handler);\n    if (h2) op._targets.remove(h2);\n    return view;\n  }\n  inherits(View$1, Dataflow, {\n    // -- DATAFLOW / RENDERING ----\n    async evaluate(encode2, prerun, postrun) {\n      await Dataflow.prototype.evaluate.call(this, encode2, prerun);\n      if (this._redraw || this._resize) {\n        try {\n          if (this._renderer) {\n            if (this._resize) {\n              this._resize = 0;\n              resizeRenderer(this);\n            }\n            await this._renderer.renderAsync(this._scenegraph.root);\n          }\n          this._redraw = false;\n        } catch (e) {\n          this.error(e);\n        }\n      }\n      if (postrun) asyncCallback(this, postrun);\n      return this;\n    },\n    dirty(item) {\n      this._redraw = true;\n      this._renderer && this._renderer.dirty(item);\n    },\n    // -- GET / SET ----\n    description(text2) {\n      if (arguments.length) {\n        const desc = text2 != null ? text2 + \"\" : null;\n        if (desc !== this._desc) ariaLabel(this._el, this._desc = desc);\n        return this;\n      }\n      return this._desc;\n    },\n    container() {\n      return this._el;\n    },\n    scenegraph() {\n      return this._scenegraph;\n    },\n    origin() {\n      return this._origin.slice();\n    },\n    signal(name, value2, options) {\n      const op = lookupSignal(this, name);\n      return arguments.length === 1 ? op.value : this.update(op, value2, options);\n    },\n    width(_) {\n      return arguments.length ? this.signal(\"width\", _) : this.signal(\"width\");\n    },\n    height(_) {\n      return arguments.length ? this.signal(\"height\", _) : this.signal(\"height\");\n    },\n    padding(_) {\n      return arguments.length ? this.signal(\"padding\", padding(_)) : padding(this.signal(\"padding\"));\n    },\n    autosize(_) {\n      return arguments.length ? this.signal(\"autosize\", _) : this.signal(\"autosize\");\n    },\n    background(_) {\n      return arguments.length ? this.signal(\"background\", _) : this.signal(\"background\");\n    },\n    renderer(type2) {\n      if (!arguments.length) return this._renderType;\n      if (!renderModule(type2)) error(\"Unrecognized renderer type: \" + type2);\n      if (type2 !== this._renderType) {\n        this._renderType = type2;\n        this._resetRenderer();\n      }\n      return this;\n    },\n    tooltip(handler) {\n      if (!arguments.length) return this._tooltip;\n      if (handler !== this._tooltip) {\n        this._tooltip = handler;\n        this._resetRenderer();\n      }\n      return this;\n    },\n    loader(loader2) {\n      if (!arguments.length) return this._loader;\n      if (loader2 !== this._loader) {\n        Dataflow.prototype.loader.call(this, loader2);\n        this._resetRenderer();\n      }\n      return this;\n    },\n    resize() {\n      this._autosize = 1;\n      return this.touch(lookupSignal(this, \"autosize\"));\n    },\n    _resetRenderer() {\n      if (this._renderer) {\n        this._renderer = null;\n        this.initialize(this._el, this._elBind);\n      }\n    },\n    // -- SIZING ----\n    _resizeView: resizeView,\n    // -- EVENT HANDLING ----\n    addEventListener(type2, handler, options) {\n      let callback = handler;\n      if (!(options && options.trap === false)) {\n        callback = trap(this, handler);\n        callback.raw = handler;\n      }\n      this._handler.on(type2, callback);\n      return this;\n    },\n    removeEventListener(type2, handler) {\n      var handlers = this._handler.handlers(type2), i = handlers.length, h2, t;\n      while (--i >= 0) {\n        t = handlers[i].type;\n        h2 = handlers[i].handler;\n        if (type2 === t && (handler === h2 || handler === h2.raw)) {\n          this._handler.off(t, h2);\n          break;\n        }\n      }\n      return this;\n    },\n    addResizeListener(handler) {\n      const l = this._resizeListeners;\n      if (!l.includes(handler)) {\n        l.push(handler);\n      }\n      return this;\n    },\n    removeResizeListener(handler) {\n      var l = this._resizeListeners, i = l.indexOf(handler);\n      if (i >= 0) {\n        l.splice(i, 1);\n      }\n      return this;\n    },\n    addSignalListener(name, handler) {\n      return addOperatorListener(this, name, lookupSignal(this, name), handler);\n    },\n    removeSignalListener(name, handler) {\n      return removeOperatorListener(this, lookupSignal(this, name), handler);\n    },\n    addDataListener(name, handler) {\n      return addOperatorListener(this, name, dataref(this, name).values, handler);\n    },\n    removeDataListener(name, handler) {\n      return removeOperatorListener(this, dataref(this, name).values, handler);\n    },\n    globalCursor(_) {\n      if (arguments.length) {\n        if (this._globalCursor !== !!_) {\n          const prev = setCursor(this, null);\n          this._globalCursor = !!_;\n          if (prev) setCursor(this, prev);\n        }\n        return this;\n      } else {\n        return this._globalCursor;\n      }\n    },\n    preventDefault(_) {\n      if (arguments.length) {\n        this._preventDefault = _;\n        return this;\n      } else {\n        return this._preventDefault;\n      }\n    },\n    timer,\n    events,\n    finalize,\n    hover,\n    // -- DATA ----\n    data,\n    change,\n    insert,\n    remove,\n    // -- SCALES --\n    scale: scale$3,\n    // -- INITIALIZATION ----\n    initialize,\n    // -- HEADLESS RENDERING ----\n    toImageURL: renderToImageURL,\n    toCanvas: renderToCanvas,\n    toSVG: renderToSVG,\n    // -- SAVE / RESTORE STATE ----\n    getState,\n    setState,\n    // RE-RENDER ON ZOOM\n    _watchPixelRatio: watchPixelRatio\n  });\n  const VIEW = \"view\", LBRACK = \"[\", RBRACK = \"]\", LBRACE = \"{\", RBRACE = \"}\", COLON = \":\", COMMA = \",\", NAME = \"@\", GT = \">\", ILLEGAL = /[[\\]{}]/, DEFAULT_MARKS = {\n    \"*\": 1,\n    arc: 1,\n    area: 1,\n    group: 1,\n    image: 1,\n    line: 1,\n    path: 1,\n    rect: 1,\n    rule: 1,\n    shape: 1,\n    symbol: 1,\n    text: 1,\n    trail: 1\n  };\n  let DEFAULT_SOURCE, MARKS;\n  function eventSelector(selector, source2, marks) {\n    DEFAULT_SOURCE = source2 || VIEW;\n    MARKS = marks || DEFAULT_MARKS;\n    return parseMerge(selector.trim()).map(parseSelector);\n  }\n  function isMarkType(type2) {\n    return MARKS[type2];\n  }\n  function find(s, i, endChar, pushChar, popChar) {\n    const n = s.length;\n    let count2 = 0, c2;\n    for (; i < n; ++i) {\n      c2 = s[i];\n      if (!count2 && c2 === endChar) return i;\n      else if (popChar && popChar.includes(c2)) --count2;\n      else if (pushChar && pushChar.includes(c2)) ++count2;\n    }\n    return i;\n  }\n  function parseMerge(s) {\n    const output2 = [], n = s.length;\n    let start = 0, i = 0;\n    while (i < n) {\n      i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n      output2.push(s.substring(start, i).trim());\n      start = ++i;\n    }\n    if (output2.length === 0) {\n      throw \"Empty event selector: \" + s;\n    }\n    return output2;\n  }\n  function parseSelector(s) {\n    return s[0] === \"[\" ? parseBetween(s) : parseStream$1(s);\n  }\n  function parseBetween(s) {\n    const n = s.length;\n    let i = 1, b2;\n    i = find(s, i, RBRACK, LBRACK, RBRACK);\n    if (i === n) {\n      throw \"Empty between selector: \" + s;\n    }\n    b2 = parseMerge(s.substring(1, i));\n    if (b2.length !== 2) {\n      throw \"Between selector must have two elements: \" + s;\n    }\n    s = s.slice(i + 1).trim();\n    if (s[0] !== GT) {\n      throw \"Expected '>' after between selector: \" + s;\n    }\n    b2 = b2.map(parseSelector);\n    const stream2 = parseSelector(s.slice(1).trim());\n    if (stream2.between) {\n      return {\n        between: b2,\n        stream: stream2\n      };\n    } else {\n      stream2.between = b2;\n    }\n    return stream2;\n  }\n  function parseStream$1(s) {\n    const stream2 = {\n      source: DEFAULT_SOURCE\n    }, source2 = [];\n    let throttle = [0, 0], markname = 0, start = 0, n = s.length, i = 0, j, filter2;\n    if (s[n - 1] === RBRACE) {\n      i = s.lastIndexOf(LBRACE);\n      if (i >= 0) {\n        try {\n          throttle = parseThrottle(s.substring(i + 1, n - 1));\n        } catch (e) {\n          throw \"Invalid throttle specification: \" + s;\n        }\n        s = s.slice(0, i).trim();\n        n = s.length;\n      } else throw \"Unmatched right brace: \" + s;\n      i = 0;\n    }\n    if (!n) throw s;\n    if (s[0] === NAME) markname = ++i;\n    j = find(s, i, COLON);\n    if (j < n) {\n      source2.push(s.substring(start, j).trim());\n      start = i = ++j;\n    }\n    i = find(s, i, LBRACK);\n    if (i === n) {\n      source2.push(s.substring(start, n).trim());\n    } else {\n      source2.push(s.substring(start, i).trim());\n      filter2 = [];\n      start = ++i;\n      if (start === n) throw \"Unmatched left bracket: \" + s;\n    }\n    while (i < n) {\n      i = find(s, i, RBRACK);\n      if (i === n) throw \"Unmatched left bracket: \" + s;\n      filter2.push(s.substring(start, i).trim());\n      if (i < n - 1 && s[++i] !== LBRACK) throw \"Expected left bracket: \" + s;\n      start = ++i;\n    }\n    if (!(n = source2.length) || ILLEGAL.test(source2[n - 1])) {\n      throw \"Invalid event selector: \" + s;\n    }\n    if (n > 1) {\n      stream2.type = source2[1];\n      if (markname) {\n        stream2.markname = source2[0].slice(1);\n      } else if (isMarkType(source2[0])) {\n        stream2.marktype = source2[0];\n      } else {\n        stream2.source = source2[0];\n      }\n    } else {\n      stream2.type = source2[0];\n    }\n    if (stream2.type.slice(-1) === \"!\") {\n      stream2.consume = true;\n      stream2.type = stream2.type.slice(0, -1);\n    }\n    if (filter2 != null) stream2.filter = filter2;\n    if (throttle[0]) stream2.throttle = throttle[0];\n    if (throttle[1]) stream2.debounce = throttle[1];\n    return stream2;\n  }\n  function parseThrottle(s) {\n    const a2 = s.split(COMMA);\n    if (!s.length || a2.length > 2) throw s;\n    return a2.map((_) => {\n      const x2 = +_;\n      if (x2 !== x2) throw s;\n      return x2;\n    });\n  }\n  function parseAutosize(spec) {\n    return isObject$1(spec) ? spec : {\n      type: spec || \"pad\"\n    };\n  }\n  const number = (_) => +_ || 0;\n  const paddingObject = (_) => ({\n    top: _,\n    bottom: _,\n    left: _,\n    right: _\n  });\n  function parsePadding(spec) {\n    return !isObject$1(spec) ? paddingObject(number(spec)) : spec.signal ? spec : {\n      top: number(spec.top),\n      bottom: number(spec.bottom),\n      left: number(spec.left),\n      right: number(spec.right)\n    };\n  }\n  const encoder = (_) => isObject$1(_) && !isArray(_) ? extend$1({}, _) : {\n    value: _\n  };\n  function addEncode(object2, name, value2, set2) {\n    if (value2 != null) {\n      const isEncoder = isObject$1(value2) && !isArray(value2) || isArray(value2) && value2.length && isObject$1(value2[0]);\n      if (isEncoder) {\n        object2.update[name] = value2;\n      } else {\n        object2[set2 || \"enter\"][name] = {\n          value: value2\n        };\n      }\n      return 1;\n    } else {\n      return 0;\n    }\n  }\n  function addEncoders(object2, enter, update2) {\n    for (const name in enter) {\n      addEncode(object2, name, enter[name]);\n    }\n    for (const name in update2) {\n      addEncode(object2, name, update2[name], \"update\");\n    }\n  }\n  function extendEncode(encode2, extra, skip) {\n    for (const name in extra) {\n      if (skip && has$1(skip, name)) continue;\n      encode2[name] = extend$1(encode2[name] || {}, extra[name]);\n    }\n    return encode2;\n  }\n  function has(key2, encode2) {\n    return encode2 && (encode2.enter && encode2.enter[key2] || encode2.update && encode2.update[key2]);\n  }\n  const MarkRole = \"mark\";\n  const FrameRole = \"frame\";\n  const ScopeRole = \"scope\";\n  const AxisRole = \"axis\";\n  const AxisDomainRole = \"axis-domain\";\n  const AxisGridRole = \"axis-grid\";\n  const AxisLabelRole = \"axis-label\";\n  const AxisTickRole = \"axis-tick\";\n  const AxisTitleRole = \"axis-title\";\n  const LegendRole = \"legend\";\n  const LegendBandRole = \"legend-band\";\n  const LegendEntryRole = \"legend-entry\";\n  const LegendGradientRole = \"legend-gradient\";\n  const LegendLabelRole = \"legend-label\";\n  const LegendSymbolRole = \"legend-symbol\";\n  const LegendTitleRole = \"legend-title\";\n  const TitleRole = \"title\";\n  const TitleTextRole = \"title-text\";\n  const TitleSubtitleRole = \"title-subtitle\";\n  function applyDefaults(encode2, type2, role, style2, config) {\n    const defaults2 = {}, enter = {};\n    let update2, key2, skip, props;\n    key2 = \"lineBreak\";\n    if (type2 === \"text\" && config[key2] != null && !has(key2, encode2)) {\n      applyDefault(defaults2, key2, config[key2]);\n    }\n    if (role == \"legend\" || String(role).startsWith(\"axis\")) {\n      role = null;\n    }\n    props = role === FrameRole ? config.group : role === MarkRole ? extend$1({}, config.mark, config[type2]) : null;\n    for (key2 in props) {\n      skip = has(key2, encode2) || (key2 === \"fill\" || key2 === \"stroke\") && (has(\"fill\", encode2) || has(\"stroke\", encode2));\n      if (!skip) applyDefault(defaults2, key2, props[key2]);\n    }\n    array$5(style2).forEach((name) => {\n      const props2 = config.style && config.style[name];\n      for (const key3 in props2) {\n        if (!has(key3, encode2)) {\n          applyDefault(defaults2, key3, props2[key3]);\n        }\n      }\n    });\n    encode2 = extend$1({}, encode2);\n    for (key2 in defaults2) {\n      props = defaults2[key2];\n      if (props.signal) {\n        (update2 = update2 || {})[key2] = props;\n      } else {\n        enter[key2] = props;\n      }\n    }\n    encode2.enter = extend$1(enter, encode2.enter);\n    if (update2) encode2.update = extend$1(update2, encode2.update);\n    return encode2;\n  }\n  function applyDefault(defaults2, key2, value2) {\n    defaults2[key2] = value2 && value2.signal ? {\n      signal: value2.signal\n    } : {\n      value: value2\n    };\n  }\n  const scaleRef = (scale2) => isString(scale2) ? $(scale2) : scale2.signal ? `(${scale2.signal})` : field(scale2);\n  function entry$1(enc) {\n    if (enc.gradient != null) {\n      return gradient(enc);\n    }\n    let value2 = enc.signal ? `(${enc.signal})` : enc.color ? color(enc.color) : enc.field != null ? field(enc.field) : enc.value !== void 0 ? $(enc.value) : void 0;\n    if (enc.scale != null) {\n      value2 = scale$2(enc, value2);\n    }\n    if (value2 === void 0) {\n      value2 = null;\n    }\n    if (enc.exponent != null) {\n      value2 = `pow(${value2},${property(enc.exponent)})`;\n    }\n    if (enc.mult != null) {\n      value2 += `*${property(enc.mult)}`;\n    }\n    if (enc.offset != null) {\n      value2 += `+${property(enc.offset)}`;\n    }\n    if (enc.round) {\n      value2 = `round(${value2})`;\n    }\n    return value2;\n  }\n  const _color = (type2, x2, y2, z) => `(${type2}(${[x2, y2, z].map(entry$1).join(\",\")})+'')`;\n  function color(enc) {\n    return enc.c ? _color(\"hcl\", enc.h, enc.c, enc.l) : enc.h || enc.s ? _color(\"hsl\", enc.h, enc.s, enc.l) : enc.l || enc.a ? _color(\"lab\", enc.l, enc.a, enc.b) : enc.r || enc.g || enc.b ? _color(\"rgb\", enc.r, enc.g, enc.b) : null;\n  }\n  function gradient(enc) {\n    const args = [enc.start, enc.stop, enc.count].map((_) => _ == null ? null : $(_));\n    while (args.length && peek$1(args) == null) args.pop();\n    args.unshift(scaleRef(enc.gradient));\n    return `gradient(${args.join(\",\")})`;\n  }\n  function property(property2) {\n    return isObject$1(property2) ? \"(\" + entry$1(property2) + \")\" : property2;\n  }\n  function field(ref2) {\n    return resolveField(isObject$1(ref2) ? ref2 : {\n      datum: ref2\n    });\n  }\n  function resolveField(ref2) {\n    let object2, level, field2;\n    if (ref2.signal) {\n      object2 = \"datum\";\n      field2 = ref2.signal;\n    } else if (ref2.group || ref2.parent) {\n      level = Math.max(1, ref2.level || 1);\n      object2 = \"item\";\n      while (level-- > 0) {\n        object2 += \".mark.group\";\n      }\n      if (ref2.parent) {\n        field2 = ref2.parent;\n        object2 += \".datum\";\n      } else {\n        field2 = ref2.group;\n      }\n    } else if (ref2.datum) {\n      object2 = \"datum\";\n      field2 = ref2.datum;\n    } else {\n      error(\"Invalid field reference: \" + $(ref2));\n    }\n    if (!ref2.signal) {\n      field2 = isString(field2) ? splitAccessPath(field2).map($).join(\"][\") : resolveField(field2);\n    }\n    return object2 + \"[\" + field2 + \"]\";\n  }\n  function scale$2(enc, value2) {\n    const scale2 = scaleRef(enc.scale);\n    if (enc.range != null) {\n      value2 = `lerp(_range(${scale2}), ${+enc.range})`;\n    } else {\n      if (value2 !== void 0) value2 = `_scale(${scale2}, ${value2})`;\n      if (enc.band) {\n        value2 = (value2 ? value2 + \"+\" : \"\") + `_bandwidth(${scale2})` + (+enc.band === 1 ? \"\" : \"*\" + property(enc.band));\n        if (enc.extra) {\n          value2 = `(datum.extra ? _scale(${scale2}, datum.extra.value) : ${value2})`;\n        }\n      }\n      if (value2 == null) value2 = \"0\";\n    }\n    return value2;\n  }\n  function rule(enc) {\n    let code = \"\";\n    enc.forEach((rule2) => {\n      const value2 = entry$1(rule2);\n      code += rule2.test ? `(${rule2.test})?${value2}:` : value2;\n    });\n    if (peek$1(code) === \":\") {\n      code += \"null\";\n    }\n    return code;\n  }\n  function parseEncode(encode2, type2, role, style2, scope, params2) {\n    const enc = {};\n    params2 = params2 || {};\n    params2.encoders = {\n      $encode: enc\n    };\n    encode2 = applyDefaults(encode2, type2, role, style2, scope.config);\n    for (const key2 in encode2) {\n      enc[key2] = parseBlock(encode2[key2], type2, params2, scope);\n    }\n    return params2;\n  }\n  function parseBlock(block, marktype, params2, scope) {\n    const channels = {}, fields = {};\n    for (const name in block) {\n      if (block[name] != null) {\n        channels[name] = parse$1(expr(block[name]), scope, params2, fields);\n      }\n    }\n    return {\n      $expr: {\n        marktype,\n        channels\n      },\n      $fields: Object.keys(fields),\n      $output: Object.keys(block)\n    };\n  }\n  function expr(enc) {\n    return isArray(enc) ? rule(enc) : entry$1(enc);\n  }\n  function parse$1(code, scope, params2, fields) {\n    const expr2 = parser(code, scope);\n    expr2.$fields.forEach((name) => fields[name] = 1);\n    extend$1(params2, expr2.$params);\n    return expr2.$expr;\n  }\n  const OUTER = \"outer\", OUTER_INVALID = [\"value\", \"update\", \"init\", \"react\", \"bind\"];\n  function outerError(prefix, name) {\n    error(prefix + ' for \"outer\" push: ' + $(name));\n  }\n  function parseSignal(signal, scope) {\n    const name = signal.name;\n    if (signal.push === OUTER) {\n      if (!scope.signals[name]) outerError(\"No prior signal definition\", name);\n      OUTER_INVALID.forEach((prop) => {\n        if (signal[prop] !== void 0) outerError(\"Invalid property \", prop);\n      });\n    } else {\n      const op = scope.addSignal(name, signal.value);\n      if (signal.react === false) op.react = false;\n      if (signal.bind) scope.addBinding(name, signal.bind);\n    }\n  }\n  function Entry(type2, value2, params2, parent) {\n    this.id = -1;\n    this.type = type2;\n    this.value = value2;\n    this.params = params2;\n    if (parent) this.parent = parent;\n  }\n  function entry(type2, value2, params2, parent) {\n    return new Entry(type2, value2, params2, parent);\n  }\n  function operator(value2, params2) {\n    return entry(\"operator\", value2, params2);\n  }\n  function ref(op) {\n    const ref2 = {\n      $ref: op.id\n    };\n    if (op.id < 0) (op.refs = op.refs || []).push(ref2);\n    return ref2;\n  }\n  function fieldRef$1(field2, name) {\n    return name ? {\n      $field: field2,\n      $name: name\n    } : {\n      $field: field2\n    };\n  }\n  const keyFieldRef = fieldRef$1(\"key\");\n  function compareRef(fields, orders) {\n    return {\n      $compare: fields,\n      $order: orders\n    };\n  }\n  function keyRef(fields, flat) {\n    const ref2 = {\n      $key: fields\n    };\n    if (flat) ref2.$flat = true;\n    return ref2;\n  }\n  const Ascending = \"ascending\";\n  const Descending = \"descending\";\n  function sortKey(sort2) {\n    return !isObject$1(sort2) ? \"\" : (sort2.order === Descending ? \"-\" : \"+\") + aggrField(sort2.op, sort2.field);\n  }\n  function aggrField(op, field2) {\n    return (op && op.signal ? \"$\" + op.signal : op || \"\") + (op && field2 ? \"_\" : \"\") + (field2 && field2.signal ? \"$\" + field2.signal : field2 || \"\");\n  }\n  const Scope$1 = \"scope\";\n  const View = \"view\";\n  function isSignal(_) {\n    return _ && _.signal;\n  }\n  function isExpr$1(_) {\n    return _ && _.expr;\n  }\n  function hasSignal(_) {\n    if (isSignal(_)) return true;\n    if (isObject$1(_)) for (const key2 in _) {\n      if (hasSignal(_[key2])) return true;\n    }\n    return false;\n  }\n  function value(specValue, defaultValue) {\n    return specValue != null ? specValue : defaultValue;\n  }\n  function deref(v) {\n    return v && v.signal || v;\n  }\n  const Timer = \"timer\";\n  function parseStream(stream2, scope) {\n    const method2 = stream2.merge ? mergeStream : stream2.stream ? nestedStream : stream2.type ? eventStream : error(\"Invalid stream specification: \" + $(stream2));\n    return method2(stream2, scope);\n  }\n  function eventSource(source2) {\n    return source2 === Scope$1 ? View : source2 || View;\n  }\n  function mergeStream(stream2, scope) {\n    const list = stream2.merge.map((s) => parseStream(s, scope)), entry2 = streamParameters({\n      merge: list\n    }, stream2, scope);\n    return scope.addStream(entry2).id;\n  }\n  function nestedStream(stream2, scope) {\n    const id2 = parseStream(stream2.stream, scope), entry2 = streamParameters({\n      stream: id2\n    }, stream2, scope);\n    return scope.addStream(entry2).id;\n  }\n  function eventStream(stream2, scope) {\n    let id2;\n    if (stream2.type === Timer) {\n      id2 = scope.event(Timer, stream2.throttle);\n      stream2 = {\n        between: stream2.between,\n        filter: stream2.filter\n      };\n    } else {\n      id2 = scope.event(eventSource(stream2.source), stream2.type);\n    }\n    const entry2 = streamParameters({\n      stream: id2\n    }, stream2, scope);\n    return Object.keys(entry2).length === 1 ? id2 : scope.addStream(entry2).id;\n  }\n  function streamParameters(entry2, stream2, scope) {\n    let param2 = stream2.between;\n    if (param2) {\n      if (param2.length !== 2) {\n        error('Stream \"between\" parameter must have 2 entries: ' + $(stream2));\n      }\n      entry2.between = [parseStream(param2[0], scope), parseStream(param2[1], scope)];\n    }\n    param2 = stream2.filter ? [].concat(stream2.filter) : [];\n    if (stream2.marktype || stream2.markname || stream2.markrole) {\n      param2.push(filterMark(stream2.marktype, stream2.markname, stream2.markrole));\n    }\n    if (stream2.source === Scope$1) {\n      param2.push(\"inScope(event.item)\");\n    }\n    if (param2.length) {\n      entry2.filter = parser(\"(\" + param2.join(\")&&(\") + \")\", scope).$expr;\n    }\n    if ((param2 = stream2.throttle) != null) {\n      entry2.throttle = +param2;\n    }\n    if ((param2 = stream2.debounce) != null) {\n      entry2.debounce = +param2;\n    }\n    if (stream2.consume) {\n      entry2.consume = true;\n    }\n    return entry2;\n  }\n  function filterMark(type2, name, role) {\n    const item = \"event.item\";\n    return item + (type2 && type2 !== \"*\" ? \"&&\" + item + \".mark.marktype==='\" + type2 + \"'\" : \"\") + (role ? \"&&\" + item + \".mark.role==='\" + role + \"'\" : \"\") + (name ? \"&&\" + item + \".mark.name==='\" + name + \"'\" : \"\");\n  }\n  const OP_VALUE_EXPR = {\n    code: \"_.$value\",\n    ast: {\n      type: \"Identifier\",\n      value: \"value\"\n    }\n  };\n  function parseUpdate(spec, scope, target2) {\n    const encode2 = spec.encode, entry2 = {\n      target: target2\n    };\n    let events2 = spec.events, update2 = spec.update, sources = [];\n    if (!events2) {\n      error(\"Signal update missing events specification.\");\n    }\n    if (isString(events2)) {\n      events2 = eventSelector(events2, scope.isSubscope() ? Scope$1 : View);\n    }\n    events2 = array$5(events2).filter((s) => s.signal || s.scale ? (sources.push(s), 0) : 1);\n    if (sources.length > 1) {\n      sources = [mergeSources(sources)];\n    }\n    if (events2.length) {\n      sources.push(events2.length > 1 ? {\n        merge: events2\n      } : events2[0]);\n    }\n    if (encode2 != null) {\n      if (update2) error(\"Signal encode and update are mutually exclusive.\");\n      update2 = \"encode(item(),\" + $(encode2) + \")\";\n    }\n    entry2.update = isString(update2) ? parser(update2, scope) : update2.expr != null ? parser(update2.expr, scope) : update2.value != null ? update2.value : update2.signal != null ? {\n      $expr: OP_VALUE_EXPR,\n      $params: {\n        $value: scope.signalRef(update2.signal)\n      }\n    } : error(\"Invalid signal update specification.\");\n    if (spec.force) {\n      entry2.options = {\n        force: true\n      };\n    }\n    sources.forEach((source2) => scope.addUpdate(extend$1(streamSource(source2, scope), entry2)));\n  }\n  function streamSource(stream2, scope) {\n    return {\n      source: stream2.signal ? scope.signalRef(stream2.signal) : stream2.scale ? scope.scaleRef(stream2.scale) : parseStream(stream2, scope)\n    };\n  }\n  function mergeSources(sources) {\n    return {\n      signal: \"[\" + sources.map((s) => s.scale ? 'scale(\"' + s.scale + '\")' : s.signal) + \"]\"\n    };\n  }\n  function parseSignalUpdates(signal, scope) {\n    const op = scope.getSignal(signal.name);\n    let expr2 = signal.update;\n    if (signal.init) {\n      if (expr2) {\n        error(\"Signals can not include both init and update expressions.\");\n      } else {\n        expr2 = signal.init;\n        op.initonly = true;\n      }\n    }\n    if (expr2) {\n      expr2 = parser(expr2, scope);\n      op.update = expr2.$expr;\n      op.params = expr2.$params;\n    }\n    if (signal.on) {\n      signal.on.forEach((_) => parseUpdate(_, scope, op.id));\n    }\n  }\n  const transform = (name) => (params2, value2, parent) => entry(name, value2, params2 || void 0, parent);\n  const Aggregate = transform(\"aggregate\");\n  const AxisTicks = transform(\"axisticks\");\n  const Bound = transform(\"bound\");\n  const Collect = transform(\"collect\");\n  const Compare = transform(\"compare\");\n  const DataJoin = transform(\"datajoin\");\n  const Encode = transform(\"encode\");\n  const Expression = transform(\"expression\");\n  const Facet = transform(\"facet\");\n  const Field = transform(\"field\");\n  const Key = transform(\"key\");\n  const LegendEntries = transform(\"legendentries\");\n  const Load = transform(\"load\");\n  const Mark = transform(\"mark\");\n  const MultiExtent = transform(\"multiextent\");\n  const MultiValues = transform(\"multivalues\");\n  const Overlap = transform(\"overlap\");\n  const Params = transform(\"params\");\n  const PreFacet = transform(\"prefacet\");\n  const Projection = transform(\"projection\");\n  const Proxy = transform(\"proxy\");\n  const Relay = transform(\"relay\");\n  const Render = transform(\"render\");\n  const Scale = transform(\"scale\");\n  const Sieve = transform(\"sieve\");\n  const SortItems = transform(\"sortitems\");\n  const ViewLayout = transform(\"viewlayout\");\n  const Values = transform(\"values\");\n  let FIELD_REF_ID = 0;\n  const MULTIDOMAIN_SORT_OPS = {\n    min: \"min\",\n    max: \"max\",\n    count: \"sum\"\n  };\n  function initScale(spec, scope) {\n    const type2 = spec.type || \"linear\";\n    if (!isValidScaleType(type2)) {\n      error(\"Unrecognized scale type: \" + $(type2));\n    }\n    scope.addScale(spec.name, {\n      type: type2,\n      domain: void 0\n    });\n  }\n  function parseScale(spec, scope) {\n    const params2 = scope.getScale(spec.name).params;\n    let key2;\n    params2.domain = parseScaleDomain(spec.domain, spec, scope);\n    if (spec.range != null) {\n      params2.range = parseScaleRange(spec, scope, params2);\n    }\n    if (spec.interpolate != null) {\n      parseScaleInterpolate(spec.interpolate, params2);\n    }\n    if (spec.nice != null) {\n      params2.nice = parseScaleNice(spec.nice, scope);\n    }\n    if (spec.bins != null) {\n      params2.bins = parseScaleBins(spec.bins, scope);\n    }\n    for (key2 in spec) {\n      if (has$1(params2, key2) || key2 === \"name\") continue;\n      params2[key2] = parseLiteral(spec[key2], scope);\n    }\n  }\n  function parseLiteral(v, scope) {\n    return !isObject$1(v) ? v : v.signal ? scope.signalRef(v.signal) : error(\"Unsupported object: \" + $(v));\n  }\n  function parseArray(v, scope) {\n    return v.signal ? scope.signalRef(v.signal) : v.map((v2) => parseLiteral(v2, scope));\n  }\n  function dataLookupError(name) {\n    error(\"Can not find data set: \" + $(name));\n  }\n  function parseScaleDomain(domain2, spec, scope) {\n    if (!domain2) {\n      if (spec.domainMin != null || spec.domainMax != null) {\n        error(\"No scale domain defined for domainMin/domainMax to override.\");\n      }\n      return;\n    }\n    return domain2.signal ? scope.signalRef(domain2.signal) : (isArray(domain2) ? explicitDomain : domain2.fields ? multipleDomain : singularDomain)(domain2, spec, scope);\n  }\n  function explicitDomain(domain2, spec, scope) {\n    return domain2.map((v) => parseLiteral(v, scope));\n  }\n  function singularDomain(domain2, spec, scope) {\n    const data2 = scope.getData(domain2.data);\n    if (!data2) dataLookupError(domain2.data);\n    return isDiscrete(spec.type) ? data2.valuesRef(scope, domain2.field, parseSort(domain2.sort, false)) : isQuantile(spec.type) ? data2.domainRef(scope, domain2.field) : data2.extentRef(scope, domain2.field);\n  }\n  function multipleDomain(domain2, spec, scope) {\n    const data2 = domain2.data, fields = domain2.fields.reduce((dom, d) => {\n      d = isString(d) ? {\n        data: data2,\n        field: d\n      } : isArray(d) || d.signal ? fieldRef(d, scope) : d;\n      dom.push(d);\n      return dom;\n    }, []);\n    return (isDiscrete(spec.type) ? ordinalMultipleDomain : isQuantile(spec.type) ? quantileMultipleDomain : numericMultipleDomain)(domain2, scope, fields);\n  }\n  function fieldRef(data2, scope) {\n    const name = \"_:vega:_\" + FIELD_REF_ID++, coll = Collect({});\n    if (isArray(data2)) {\n      coll.value = {\n        $ingest: data2\n      };\n    } else if (data2.signal) {\n      const code = \"setdata(\" + $(name) + \",\" + data2.signal + \")\";\n      coll.params.input = scope.signalRef(code);\n    }\n    scope.addDataPipeline(name, [coll, Sieve({})]);\n    return {\n      data: name,\n      field: \"data\"\n    };\n  }\n  function ordinalMultipleDomain(domain2, scope, fields) {\n    const sort2 = parseSort(domain2.sort, true);\n    let a2, v;\n    const counts = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.countsRef(scope, f.field, sort2);\n    });\n    const p = {\n      groupby: keyFieldRef,\n      pulse: counts\n    };\n    if (sort2) {\n      a2 = sort2.op || \"count\";\n      v = sort2.field ? aggrField(a2, sort2.field) : \"count\";\n      p.ops = [MULTIDOMAIN_SORT_OPS[a2]];\n      p.fields = [scope.fieldRef(v)];\n      p.as = [v];\n    }\n    a2 = scope.add(Aggregate(p));\n    const c2 = scope.add(Collect({\n      pulse: ref(a2)\n    }));\n    v = scope.add(Values({\n      field: keyFieldRef,\n      sort: scope.sortRef(sort2),\n      pulse: ref(c2)\n    }));\n    return ref(v);\n  }\n  function parseSort(sort2, multidomain) {\n    if (sort2) {\n      if (!sort2.field && !sort2.op) {\n        if (isObject$1(sort2)) sort2.field = \"key\";\n        else sort2 = {\n          field: \"key\"\n        };\n      } else if (!sort2.field && sort2.op !== \"count\") {\n        error(\"No field provided for sort aggregate op: \" + sort2.op);\n      } else if (multidomain && sort2.field) {\n        if (sort2.op && !MULTIDOMAIN_SORT_OPS[sort2.op]) {\n          error(\"Multiple domain scales can not be sorted using \" + sort2.op);\n        }\n      }\n    }\n    return sort2;\n  }\n  function quantileMultipleDomain(domain2, scope, fields) {\n    const values2 = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.domainRef(scope, f.field);\n    });\n    return ref(scope.add(MultiValues({\n      values: values2\n    })));\n  }\n  function numericMultipleDomain(domain2, scope, fields) {\n    const extents = fields.map((f) => {\n      const data2 = scope.getData(f.data);\n      if (!data2) dataLookupError(f.data);\n      return data2.extentRef(scope, f.field);\n    });\n    return ref(scope.add(MultiExtent({\n      extents\n    })));\n  }\n  function parseScaleBins(v, scope) {\n    return v.signal || isArray(v) ? parseArray(v, scope) : scope.objectProperty(v);\n  }\n  function parseScaleNice(nice2, scope) {\n    return nice2.signal ? scope.signalRef(nice2.signal) : isObject$1(nice2) ? {\n      interval: parseLiteral(nice2.interval),\n      step: parseLiteral(nice2.step)\n    } : parseLiteral(nice2);\n  }\n  function parseScaleInterpolate(interpolate2, params2) {\n    params2.interpolate = parseLiteral(interpolate2.type || interpolate2);\n    if (interpolate2.gamma != null) {\n      params2.interpolateGamma = parseLiteral(interpolate2.gamma);\n    }\n  }\n  function parseScaleRange(spec, scope, params2) {\n    const config = scope.config.range;\n    let range2 = spec.range;\n    if (range2.signal) {\n      return scope.signalRef(range2.signal);\n    } else if (isString(range2)) {\n      if (config && has$1(config, range2)) {\n        spec = extend$1({}, spec, {\n          range: config[range2]\n        });\n        return parseScaleRange(spec, scope, params2);\n      } else if (range2 === \"width\") {\n        range2 = [0, {\n          signal: \"width\"\n        }];\n      } else if (range2 === \"height\") {\n        range2 = isDiscrete(spec.type) ? [0, {\n          signal: \"height\"\n        }] : [{\n          signal: \"height\"\n        }, 0];\n      } else {\n        error(\"Unrecognized scale range value: \" + $(range2));\n      }\n    } else if (range2.scheme) {\n      params2.scheme = isArray(range2.scheme) ? parseArray(range2.scheme, scope) : parseLiteral(range2.scheme, scope);\n      if (range2.extent) params2.schemeExtent = parseArray(range2.extent, scope);\n      if (range2.count) params2.schemeCount = parseLiteral(range2.count, scope);\n      return;\n    } else if (range2.step) {\n      params2.rangeStep = parseLiteral(range2.step, scope);\n      return;\n    } else if (isDiscrete(spec.type) && !isArray(range2)) {\n      return parseScaleDomain(range2, spec, scope);\n    } else if (!isArray(range2)) {\n      error(\"Unsupported range type: \" + $(range2));\n    }\n    return range2.map((v) => (isArray(v) ? parseArray : parseLiteral)(v, scope));\n  }\n  function parseProjection(proj, scope) {\n    const config = scope.config.projection || {}, params2 = {};\n    for (const name in proj) {\n      if (name === \"name\") continue;\n      params2[name] = parseParameter$1(proj[name], name, scope);\n    }\n    for (const name in config) {\n      if (params2[name] == null) {\n        params2[name] = parseParameter$1(config[name], name, scope);\n      }\n    }\n    scope.addProjection(proj.name, params2);\n  }\n  function parseParameter$1(_, name, scope) {\n    return isArray(_) ? _.map((_2) => parseParameter$1(_2, name, scope)) : !isObject$1(_) ? _ : _.signal ? scope.signalRef(_.signal) : name === \"fit\" ? _ : error(\"Unsupported parameter object: \" + $(_));\n  }\n  const Top = \"top\";\n  const Left = \"left\";\n  const Right = \"right\";\n  const Bottom = \"bottom\";\n  const Center = \"center\";\n  const Vertical = \"vertical\";\n  const Start = \"start\";\n  const Middle = \"middle\";\n  const End = \"end\";\n  const Index = \"index\";\n  const Label = \"label\";\n  const Offset = \"offset\";\n  const Perc = \"perc\";\n  const Perc2 = \"perc2\";\n  const Value = \"value\";\n  const GuideLabelStyle = \"guide-label\";\n  const GuideTitleStyle = \"guide-title\";\n  const GroupTitleStyle = \"group-title\";\n  const GroupSubtitleStyle = \"group-subtitle\";\n  const Symbols = \"symbol\";\n  const Gradient = \"gradient\";\n  const Discrete = \"discrete\";\n  const Size = \"size\";\n  const Shape = \"shape\";\n  const Fill = \"fill\";\n  const Stroke = \"stroke\";\n  const StrokeWidth = \"strokeWidth\";\n  const StrokeDash = \"strokeDash\";\n  const Opacity = \"opacity\";\n  const LegendScales = [Size, Shape, Fill, Stroke, StrokeWidth, StrokeDash, Opacity];\n  const Skip = {\n    name: 1,\n    style: 1,\n    interactive: 1\n  };\n  const zero = {\n    value: 0\n  };\n  const one = {\n    value: 1\n  };\n  const GroupMark = \"group\";\n  const RectMark = \"rect\";\n  const RuleMark = \"rule\";\n  const SymbolMark = \"symbol\";\n  const TextMark = \"text\";\n  function guideGroup(mark) {\n    mark.type = GroupMark;\n    mark.interactive = mark.interactive || false;\n    return mark;\n  }\n  function lookup(spec, config) {\n    const _ = (name, dflt) => value(spec[name], value(config[name], dflt));\n    _.isVertical = (s) => Vertical === value(spec.direction, config.direction || (s ? config.symbolDirection : config.gradientDirection));\n    _.gradientLength = () => value(spec.gradientLength, config.gradientLength || config.gradientWidth);\n    _.gradientThickness = () => value(spec.gradientThickness, config.gradientThickness || config.gradientHeight);\n    _.entryColumns = () => value(spec.columns, value(config.columns, +_.isVertical(true)));\n    return _;\n  }\n  function getEncoding(name, encode2) {\n    const v = encode2 && (encode2.update && encode2.update[name] || encode2.enter && encode2.enter[name]);\n    return v && v.signal ? v : v ? v.value : null;\n  }\n  function getStyle(name, scope, style2) {\n    const s = scope.config.style[style2];\n    return s && s[name];\n  }\n  function anchorExpr(s, e, m2) {\n    return `item.anchor === '${Start}' ? ${s} : item.anchor === '${End}' ? ${e} : ${m2}`;\n  }\n  const alignExpr$1 = anchorExpr($(Left), $(Right), $(Center));\n  function tickBand(_) {\n    const v = _(\"tickBand\");\n    let offset2 = _(\"tickOffset\"), band2, extra;\n    if (!v) {\n      band2 = _(\"bandPosition\");\n      extra = _(\"tickExtra\");\n    } else if (v.signal) {\n      band2 = {\n        signal: `(${v.signal}) === 'extent' ? 1 : 0.5`\n      };\n      extra = {\n        signal: `(${v.signal}) === 'extent'`\n      };\n      if (!isObject$1(offset2)) {\n        offset2 = {\n          signal: `(${v.signal}) === 'extent' ? 0 : ${offset2}`\n        };\n      }\n    } else if (v === \"extent\") {\n      band2 = 1;\n      extra = true;\n      offset2 = 0;\n    } else {\n      band2 = 0.5;\n      extra = false;\n    }\n    return {\n      extra,\n      band: band2,\n      offset: offset2\n    };\n  }\n  function extendOffset(value2, offset2) {\n    return !offset2 ? value2 : !value2 ? offset2 : !isObject$1(value2) ? {\n      value: value2,\n      offset: offset2\n    } : Object.assign({}, value2, {\n      offset: extendOffset(value2.offset, offset2)\n    });\n  }\n  function guideMark(mark, extras) {\n    if (extras) {\n      mark.name = extras.name;\n      mark.style = extras.style || mark.style;\n      mark.interactive = !!extras.interactive;\n      mark.encode = extendEncode(mark.encode, extras, Skip);\n    } else {\n      mark.interactive = false;\n    }\n    return mark;\n  }\n  function legendGradient(spec, scale2, config, userEncode) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length2 = _.gradientLength();\n    let enter, start, stop2, width2, height2;\n    if (vertical) {\n      start = [0, 1];\n      stop2 = [0, 0];\n      width2 = thickness;\n      height2 = length2;\n    } else {\n      start = [0, 0];\n      stop2 = [1, 0];\n      width2 = length2;\n      height2 = thickness;\n    }\n    const encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: zero,\n        y: zero,\n        width: encoder(width2),\n        height: encoder(height2)\n      },\n      update: extend$1({}, enter, {\n        opacity: one,\n        fill: {\n          gradient: scale2,\n          start,\n          stop: stop2\n        }\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gradientStrokeColor\"),\n      strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n      type: RectMark,\n      role: LegendGradientRole,\n      encode: encode2\n    }, userEncode);\n  }\n  function legendGradientDiscrete(spec, scale2, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = _.gradientThickness(), length2 = _.gradientLength();\n    let u2, v, uu, vv, adjust = \"\";\n    vertical ? (u2 = \"y\", uu = \"y2\", v = \"x\", vv = \"width\", adjust = \"1-\") : (u2 = \"x\", uu = \"x2\", v = \"y\", vv = \"height\");\n    const enter = {\n      opacity: zero,\n      fill: {\n        scale: scale2,\n        field: Value\n      }\n    };\n    enter[u2] = {\n      signal: adjust + \"datum.\" + Perc,\n      mult: length2\n    };\n    enter[v] = zero;\n    enter[uu] = {\n      signal: adjust + \"datum.\" + Perc2,\n      mult: length2\n    };\n    enter[vv] = encoder(thickness);\n    const encode2 = {\n      enter,\n      update: extend$1({}, enter, {\n        opacity: one\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gradientStrokeColor\"),\n      strokeWidth: _(\"gradientStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"gradientOpacity\")\n    });\n    return guideMark({\n      type: RectMark,\n      role: LegendBandRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  const alignExpr = `datum.${Perc}<=0?\"${Left}\":datum.${Perc}>=1?\"${Right}\":\"${Center}\"`, baselineExpr = `datum.${Perc}<=0?\"${Bottom}\":datum.${Perc}>=1?\"${Top}\":\"${Middle}\"`;\n  function legendGradientLabels(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), vertical = _.isVertical(), thickness = encoder(_.gradientThickness()), length2 = _.gradientLength();\n    let overlap = _(\"labelOverlap\"), enter, update2, u2, v, adjust = \"\";\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        }\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontStyle: _(\"labelFontStyle\"),\n      fontWeight: _(\"labelFontWeight\"),\n      limit: value(spec.labelLimit, config.gradientLabelLimit)\n    });\n    if (vertical) {\n      enter.align = {\n        value: \"left\"\n      };\n      enter.baseline = update2.baseline = {\n        signal: baselineExpr\n      };\n      u2 = \"y\";\n      v = \"x\";\n      adjust = \"1-\";\n    } else {\n      enter.align = update2.align = {\n        signal: alignExpr\n      };\n      enter.baseline = {\n        value: \"top\"\n      };\n      u2 = \"x\";\n      v = \"y\";\n    }\n    enter[u2] = update2[u2] = {\n      signal: adjust + \"datum.\" + Perc,\n      mult: length2\n    };\n    enter[v] = update2[v] = thickness;\n    thickness.offset = value(spec.labelOffset, config.gradientLabelOffset) || 0;\n    overlap = overlap ? {\n      separation: _(\"labelSeparation\"),\n      method: overlap,\n      order: \"datum.\" + Index\n    } : void 0;\n    return guideMark({\n      type: TextMark,\n      role: LegendLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: dataRef,\n      encode: encode2,\n      overlap\n    }, userEncode);\n  }\n  function legendSymbolGroups(spec, config, userEncode, dataRef, columns) {\n    const _ = lookup(spec, config), entries = userEncode.entries, interactive2 = !!(entries && entries.interactive), name = entries ? entries.name : void 0, height2 = _(\"clipHeight\"), symbolOffset = _(\"symbolOffset\"), valueRef = {\n      data: \"value\"\n    }, xSignal = `(${columns}) ? datum.${Offset} : datum.${Size}`, yEncode = height2 ? encoder(height2) : {\n      field: Size\n    }, index2 = `datum.${Index}`, ncols = `max(1, ${columns})`;\n    let encode2, enter, update2, nrows, sort2;\n    yEncode.mult = 0.5;\n    encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: {\n          signal: xSignal,\n          mult: 0.5,\n          offset: symbolOffset\n        },\n        y: yEncode\n      },\n      update: update2 = {\n        opacity: one,\n        x: enter.x,\n        y: enter.y\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    let baseFill = null, baseStroke = null;\n    if (!spec.fill) {\n      baseFill = config.symbolBaseFillColor;\n      baseStroke = config.symbolBaseStrokeColor;\n    }\n    addEncoders(encode2, {\n      fill: _(\"symbolFillColor\", baseFill),\n      shape: _(\"symbolType\"),\n      size: _(\"symbolSize\"),\n      stroke: _(\"symbolStrokeColor\", baseStroke),\n      strokeDash: _(\"symbolDash\"),\n      strokeDashOffset: _(\"symbolDashOffset\"),\n      strokeWidth: _(\"symbolStrokeWidth\")\n    }, {\n      // update\n      opacity: _(\"symbolOpacity\")\n    });\n    LegendScales.forEach((scale2) => {\n      if (spec[scale2]) {\n        update2[scale2] = enter[scale2] = {\n          scale: spec[scale2],\n          field: Value\n        };\n      }\n    });\n    const symbols2 = guideMark({\n      type: SymbolMark,\n      role: LegendSymbolRole,\n      key: Value,\n      from: valueRef,\n      clip: height2 ? true : void 0,\n      encode: encode2\n    }, userEncode.symbols);\n    const labelOffset = encoder(symbolOffset);\n    labelOffset.offset = _(\"labelOffset\");\n    encode2 = {\n      enter: enter = {\n        opacity: zero,\n        x: {\n          signal: xSignal,\n          offset: labelOffset\n        },\n        y: yEncode\n      },\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        },\n        x: enter.x,\n        y: enter.y\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      align: _(\"labelAlign\"),\n      baseline: _(\"labelBaseline\"),\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontStyle: _(\"labelFontStyle\"),\n      fontWeight: _(\"labelFontWeight\"),\n      limit: _(\"labelLimit\")\n    });\n    const labels = guideMark({\n      type: TextMark,\n      role: LegendLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: valueRef,\n      encode: encode2\n    }, userEncode.labels);\n    encode2 = {\n      enter: {\n        noBound: {\n          value: !height2\n        },\n        // ignore width/height in bounds calc\n        width: zero,\n        height: height2 ? encoder(height2) : zero,\n        opacity: zero\n      },\n      exit: {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one,\n        row: {\n          signal: null\n        },\n        column: {\n          signal: null\n        }\n      }\n    };\n    if (_.isVertical(true)) {\n      nrows = `ceil(item.mark.items.length / ${ncols})`;\n      update2.row.signal = `${index2}%${nrows}`;\n      update2.column.signal = `floor(${index2} / ${nrows})`;\n      sort2 = {\n        field: [\"row\", index2]\n      };\n    } else {\n      update2.row.signal = `floor(${index2} / ${ncols})`;\n      update2.column.signal = `${index2} % ${ncols}`;\n      sort2 = {\n        field: index2\n      };\n    }\n    update2.column.signal = `(${columns})?${update2.column.signal}:${index2}`;\n    dataRef = {\n      facet: {\n        data: dataRef,\n        name: \"value\",\n        groupby: Index\n      }\n    };\n    return guideGroup({\n      role: ScopeRole,\n      from: dataRef,\n      encode: extendEncode(encode2, entries, Skip),\n      marks: [symbols2, labels],\n      name,\n      interactive: interactive2,\n      sort: sort2\n    });\n  }\n  function legendSymbolLayout(spec, config) {\n    const _ = lookup(spec, config);\n    return {\n      align: _(\"gridAlign\"),\n      columns: _.entryColumns(),\n      center: {\n        row: true,\n        column: false\n      },\n      padding: {\n        row: _(\"rowPadding\"),\n        column: _(\"columnPadding\")\n      }\n    };\n  }\n  const isL = 'item.orient === \"left\"', isR = 'item.orient === \"right\"', isLR = `(${isL} || ${isR})`, isVG = `datum.vgrad && ${isLR}`, baseline = anchorExpr('\"top\"', '\"bottom\"', '\"middle\"'), alignFlip = anchorExpr('\"right\"', '\"left\"', '\"center\"'), exprAlign = `datum.vgrad && ${isR} ? (${alignFlip}) : (${isLR} && !(datum.vgrad && ${isL})) ? \"left\" : ${alignExpr$1}`, exprAnchor = `item._anchor || (${isLR} ? \"middle\" : \"start\")`, exprAngle = `${isVG} ? (${isL} ? -90 : 90) : 0`, exprBaseline = `${isLR} ? (datum.vgrad ? (${isR} ? \"bottom\" : \"top\") : ${baseline}) : \"top\"`;\n  function legendTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config);\n    const encode2 = {\n      enter: {\n        opacity: zero\n      },\n      update: {\n        opacity: one,\n        x: {\n          field: {\n            group: \"padding\"\n          }\n        },\n        y: {\n          field: {\n            group: \"padding\"\n          }\n        }\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      orient: _(\"titleOrient\"),\n      _anchor: _(\"titleAnchor\"),\n      anchor: {\n        signal: exprAnchor\n      },\n      angle: {\n        signal: exprAngle\n      },\n      align: {\n        signal: exprAlign\n      },\n      baseline: {\n        signal: exprBaseline\n      },\n      text: spec.title,\n      fill: _(\"titleColor\"),\n      fillOpacity: _(\"titleOpacity\"),\n      font: _(\"titleFont\"),\n      fontSize: _(\"titleFontSize\"),\n      fontStyle: _(\"titleFontStyle\"),\n      fontWeight: _(\"titleFontWeight\"),\n      limit: _(\"titleLimit\"),\n      lineHeight: _(\"titleLineHeight\")\n    }, {\n      // require update\n      align: _(\"titleAlign\"),\n      baseline: _(\"titleBaseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: LegendTitleRole,\n      style: GuideTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function clip(clip2, scope) {\n    let expr2;\n    if (isObject$1(clip2)) {\n      if (clip2.signal) {\n        expr2 = clip2.signal;\n      } else if (clip2.path) {\n        expr2 = \"pathShape(\" + param(clip2.path) + \")\";\n      } else if (clip2.sphere) {\n        expr2 = \"geoShape(\" + param(clip2.sphere) + ', {type: \"Sphere\"})';\n      }\n    }\n    return expr2 ? scope.signalRef(expr2) : !!clip2;\n  }\n  function param(value2) {\n    return isObject$1(value2) && value2.signal ? value2.signal : $(value2);\n  }\n  function getRole(spec) {\n    const role = spec.role || \"\";\n    return role.startsWith(\"axis\") || role.startsWith(\"legend\") || role.startsWith(\"title\") ? role : spec.type === GroupMark ? ScopeRole : role || MarkRole;\n  }\n  function definition(spec) {\n    return {\n      marktype: spec.type,\n      name: spec.name || void 0,\n      role: spec.role || getRole(spec),\n      zindex: +spec.zindex || void 0,\n      aria: spec.aria,\n      description: spec.description\n    };\n  }\n  function interactive(spec, scope) {\n    return spec && spec.signal ? scope.signalRef(spec.signal) : spec === false ? false : true;\n  }\n  function parseTransform(spec, scope) {\n    const def2 = definition$1(spec.type);\n    if (!def2) error(\"Unrecognized transform type: \" + $(spec.type));\n    const t = entry(def2.type.toLowerCase(), null, parseParameters(def2, spec, scope));\n    if (spec.signal) scope.addSignal(spec.signal, scope.proxy(t));\n    t.metadata = def2.metadata || {};\n    return t;\n  }\n  function parseParameters(def2, spec, scope) {\n    const params2 = {}, n = def2.params.length;\n    for (let i = 0; i < n; ++i) {\n      const pdef = def2.params[i];\n      params2[pdef.name] = parseParameter(pdef, spec, scope);\n    }\n    return params2;\n  }\n  function parseParameter(def2, spec, scope) {\n    const type2 = def2.type, value2 = spec[def2.name];\n    if (type2 === \"index\") {\n      return parseIndexParameter(def2, spec, scope);\n    } else if (value2 === void 0) {\n      if (def2.required) {\n        error(\"Missing required \" + $(spec.type) + \" parameter: \" + $(def2.name));\n      }\n      return;\n    } else if (type2 === \"param\") {\n      return parseSubParameters(def2, spec, scope);\n    } else if (type2 === \"projection\") {\n      return scope.projectionRef(spec[def2.name]);\n    }\n    return def2.array && !isSignal(value2) ? value2.map((v) => parameterValue(def2, v, scope)) : parameterValue(def2, value2, scope);\n  }\n  function parameterValue(def2, value2, scope) {\n    const type2 = def2.type;\n    if (isSignal(value2)) {\n      return isExpr(type2) ? error(\"Expression references can not be signals.\") : isField(type2) ? scope.fieldRef(value2) : isCompare(type2) ? scope.compareRef(value2) : scope.signalRef(value2.signal);\n    } else {\n      const expr2 = def2.expr || isField(type2);\n      return expr2 && outerExpr(value2) ? scope.exprRef(value2.expr, value2.as) : expr2 && outerField(value2) ? fieldRef$1(value2.field, value2.as) : isExpr(type2) ? parser(value2, scope) : isData(type2) ? ref(scope.getData(value2).values) : isField(type2) ? fieldRef$1(value2) : isCompare(type2) ? scope.compareRef(value2) : value2;\n    }\n  }\n  function parseIndexParameter(def2, spec, scope) {\n    if (!isString(spec.from)) {\n      error('Lookup \"from\" parameter must be a string literal.');\n    }\n    return scope.getData(spec.from).lookupRef(scope, spec.key);\n  }\n  function parseSubParameters(def2, spec, scope) {\n    const value2 = spec[def2.name];\n    if (def2.array) {\n      if (!isArray(value2)) {\n        error(\"Expected an array of sub-parameters. Instead: \" + $(value2));\n      }\n      return value2.map((v) => parseSubParameter(def2, v, scope));\n    } else {\n      return parseSubParameter(def2, value2, scope);\n    }\n  }\n  function parseSubParameter(def2, value2, scope) {\n    const n = def2.params.length;\n    let pdef;\n    for (let i = 0; i < n; ++i) {\n      pdef = def2.params[i];\n      for (const k in pdef.key) {\n        if (pdef.key[k] !== value2[k]) {\n          pdef = null;\n          break;\n        }\n      }\n      if (pdef) break;\n    }\n    if (!pdef) error(\"Unsupported parameter: \" + $(value2));\n    const params2 = extend$1(parseParameters(pdef, value2, scope), pdef.key);\n    return ref(scope.add(Params(params2)));\n  }\n  const outerExpr = (_) => _ && _.expr;\n  const outerField = (_) => _ && _.field;\n  const isData = (_) => _ === \"data\";\n  const isExpr = (_) => _ === \"expr\";\n  const isField = (_) => _ === \"field\";\n  const isCompare = (_) => _ === \"compare\";\n  function parseData$1(from, group2, scope) {\n    let facet, key2, op, dataRef, parent;\n    if (!from) {\n      dataRef = ref(scope.add(Collect(null, [{}])));\n    } else if (facet = from.facet) {\n      if (!group2) error(\"Only group marks can be faceted.\");\n      if (facet.field != null) {\n        dataRef = parent = getDataRef(facet, scope);\n      } else {\n        if (!from.data) {\n          op = parseTransform(extend$1({\n            type: \"aggregate\",\n            groupby: array$5(facet.groupby)\n          }, facet.aggregate), scope);\n          op.params.key = scope.keyRef(facet.groupby);\n          op.params.pulse = getDataRef(facet, scope);\n          dataRef = parent = ref(scope.add(op));\n        } else {\n          parent = ref(scope.getData(from.data).aggregate);\n        }\n        key2 = scope.keyRef(facet.groupby, true);\n      }\n    }\n    if (!dataRef) {\n      dataRef = getDataRef(from, scope);\n    }\n    return {\n      key: key2,\n      pulse: dataRef,\n      parent\n    };\n  }\n  function getDataRef(from, scope) {\n    return from.$ref ? from : from.data && from.data.$ref ? from.data : ref(scope.getData(from.data).output);\n  }\n  function DataScope(scope, input, output2, values2, aggr) {\n    this.scope = scope;\n    this.input = input;\n    this.output = output2;\n    this.values = values2;\n    this.aggregate = aggr;\n    this.index = {};\n  }\n  DataScope.fromEntries = function(scope, entries) {\n    const n = entries.length, values2 = entries[n - 1], output2 = entries[n - 2];\n    let input = entries[0], aggr = null, i = 1;\n    if (input && input.type === \"load\") {\n      input = entries[1];\n    }\n    scope.add(entries[0]);\n    for (; i < n; ++i) {\n      entries[i].params.pulse = ref(entries[i - 1]);\n      scope.add(entries[i]);\n      if (entries[i].type === \"aggregate\") aggr = entries[i];\n    }\n    return new DataScope(scope, input, output2, values2, aggr);\n  };\n  function fieldKey(field2) {\n    return isString(field2) ? field2 : null;\n  }\n  function addSortField(scope, p, sort2) {\n    const as = aggrField(sort2.op, sort2.field);\n    let s;\n    if (p.ops) {\n      for (let i = 0, n = p.as.length; i < n; ++i) {\n        if (p.as[i] === as) return;\n      }\n    } else {\n      p.ops = [\"count\"];\n      p.fields = [null];\n      p.as = [\"count\"];\n    }\n    if (sort2.op) {\n      p.ops.push((s = sort2.op.signal) ? scope.signalRef(s) : sort2.op);\n      p.fields.push(scope.fieldRef(sort2.field));\n      p.as.push(as);\n    }\n  }\n  function cache(scope, ds, name, optype, field2, counts, index2) {\n    const cache2 = ds[name] || (ds[name] = {}), sort2 = sortKey(counts);\n    let k = fieldKey(field2), v, op;\n    if (k != null) {\n      scope = ds.scope;\n      k = k + (sort2 ? \"|\" + sort2 : \"\");\n      v = cache2[k];\n    }\n    if (!v) {\n      const params2 = counts ? {\n        field: keyFieldRef,\n        pulse: ds.countsRef(scope, field2, counts)\n      } : {\n        field: scope.fieldRef(field2),\n        pulse: ref(ds.output)\n      };\n      if (sort2) params2.sort = scope.sortRef(counts);\n      op = scope.add(entry(optype, void 0, params2));\n      if (index2) ds.index[field2] = op;\n      v = ref(op);\n      if (k != null) cache2[k] = v;\n    }\n    return v;\n  }\n  DataScope.prototype = {\n    countsRef(scope, field2, sort2) {\n      const ds = this, cache2 = ds.counts || (ds.counts = {}), k = fieldKey(field2);\n      let v, a2, p;\n      if (k != null) {\n        scope = ds.scope;\n        v = cache2[k];\n      }\n      if (!v) {\n        p = {\n          groupby: scope.fieldRef(field2, \"key\"),\n          pulse: ref(ds.output)\n        };\n        if (sort2 && sort2.field) addSortField(scope, p, sort2);\n        a2 = scope.add(Aggregate(p));\n        v = scope.add(Collect({\n          pulse: ref(a2)\n        }));\n        v = {\n          agg: a2,\n          ref: ref(v)\n        };\n        if (k != null) cache2[k] = v;\n      } else if (sort2 && sort2.field) {\n        addSortField(scope, v.agg.params, sort2);\n      }\n      return v.ref;\n    },\n    tuplesRef() {\n      return ref(this.values);\n    },\n    extentRef(scope, field2) {\n      return cache(scope, this, \"extent\", \"extent\", field2, false);\n    },\n    domainRef(scope, field2) {\n      return cache(scope, this, \"domain\", \"values\", field2, false);\n    },\n    valuesRef(scope, field2, sort2) {\n      return cache(scope, this, \"vals\", \"values\", field2, sort2 || true);\n    },\n    lookupRef(scope, field2) {\n      return cache(scope, this, \"lookup\", \"tupleindex\", field2, false);\n    },\n    indataRef(scope, field2) {\n      return cache(scope, this, \"indata\", \"tupleindex\", field2, true, true);\n    }\n  };\n  function parseFacet(spec, scope, group2) {\n    const facet = spec.from.facet, name = facet.name, data2 = getDataRef(facet, scope);\n    let op;\n    if (!facet.name) {\n      error(\"Facet must have a name: \" + $(facet));\n    }\n    if (!facet.data) {\n      error(\"Facet must reference a data set: \" + $(facet));\n    }\n    if (facet.field) {\n      op = scope.add(PreFacet({\n        field: scope.fieldRef(facet.field),\n        pulse: data2\n      }));\n    } else if (facet.groupby) {\n      op = scope.add(Facet({\n        key: scope.keyRef(facet.groupby),\n        group: ref(scope.proxy(group2.parent)),\n        pulse: data2\n      }));\n    } else {\n      error(\"Facet must specify groupby or field: \" + $(facet));\n    }\n    const subscope = scope.fork(), source2 = subscope.add(Collect()), values2 = subscope.add(Sieve({\n      pulse: ref(source2)\n    }));\n    subscope.addData(name, new DataScope(subscope, source2, source2, values2));\n    subscope.addSignal(\"parent\", null);\n    op.params.subflow = {\n      $subflow: subscope.parse(spec).toRuntime()\n    };\n  }\n  function parseSubflow(spec, scope, input) {\n    const op = scope.add(PreFacet({\n      pulse: input.pulse\n    })), subscope = scope.fork();\n    subscope.add(Sieve());\n    subscope.addSignal(\"parent\", null);\n    op.params.subflow = {\n      $subflow: subscope.parse(spec).toRuntime()\n    };\n  }\n  function parseTrigger(spec, scope, name) {\n    const remove2 = spec.remove, insert2 = spec.insert, toggle = spec.toggle, modify2 = spec.modify, values2 = spec.values, op = scope.add(operator());\n    const update2 = \"if(\" + spec.trigger + ',modify(\"' + name + '\",' + [insert2, remove2, toggle, modify2, values2].map((_) => _ == null ? \"null\" : _).join(\",\") + \"),0)\";\n    const expr2 = parser(update2, scope);\n    op.update = expr2.$expr;\n    op.params = expr2.$params;\n  }\n  function parseMark(spec, scope) {\n    const role = getRole(spec), group2 = spec.type === GroupMark, facet = spec.from && spec.from.facet, overlap = spec.overlap;\n    let layout = spec.layout || role === ScopeRole || role === FrameRole, ops2, op, store, enc, name, layoutRef, boundRef;\n    const nested = role === MarkRole || layout || facet;\n    const input = parseData$1(spec.from, group2, scope);\n    op = scope.add(DataJoin({\n      key: input.key || (spec.key ? fieldRef$1(spec.key) : void 0),\n      pulse: input.pulse,\n      clean: !group2\n    }));\n    const joinRef = ref(op);\n    op = store = scope.add(Collect({\n      pulse: joinRef\n    }));\n    op = scope.add(Mark({\n      markdef: definition(spec),\n      interactive: interactive(spec.interactive, scope),\n      clip: clip(spec.clip, scope),\n      context: {\n        $context: true\n      },\n      groups: scope.lookup(),\n      parent: scope.signals.parent ? scope.signalRef(\"parent\") : null,\n      index: scope.markpath(),\n      pulse: ref(op)\n    }));\n    const markRef = ref(op);\n    op = enc = scope.add(Encode(parseEncode(spec.encode, spec.type, role, spec.style, scope, {\n      mod: false,\n      pulse: markRef\n    })));\n    op.params.parent = scope.encode();\n    if (spec.transform) {\n      spec.transform.forEach((_) => {\n        const tx2 = parseTransform(_, scope), md2 = tx2.metadata;\n        if (md2.generates || md2.changes) {\n          error(\"Mark transforms should not generate new data.\");\n        }\n        if (!md2.nomod) enc.params.mod = true;\n        tx2.params.pulse = ref(op);\n        scope.add(op = tx2);\n      });\n    }\n    if (spec.sort) {\n      op = scope.add(SortItems({\n        sort: scope.compareRef(spec.sort),\n        pulse: ref(op)\n      }));\n    }\n    const encodeRef = ref(op);\n    if (facet || layout) {\n      layout = scope.add(ViewLayout({\n        layout: scope.objectProperty(spec.layout),\n        legends: scope.legends,\n        mark: markRef,\n        pulse: encodeRef\n      }));\n      layoutRef = ref(layout);\n    }\n    const bound2 = scope.add(Bound({\n      mark: markRef,\n      pulse: layoutRef || encodeRef\n    }));\n    boundRef = ref(bound2);\n    if (group2) {\n      if (nested) {\n        ops2 = scope.operators;\n        ops2.pop();\n        if (layout) ops2.pop();\n      }\n      scope.pushState(encodeRef, layoutRef || boundRef, joinRef);\n      facet ? parseFacet(spec, scope, input) : nested ? parseSubflow(spec, scope, input) : scope.parse(spec);\n      scope.popState();\n      if (nested) {\n        if (layout) ops2.push(layout);\n        ops2.push(bound2);\n      }\n    }\n    if (overlap) {\n      boundRef = parseOverlap(overlap, boundRef, scope);\n    }\n    const render = scope.add(Render({\n      pulse: boundRef\n    })), sieve = scope.add(Sieve({\n      pulse: ref(render)\n    }, void 0, scope.parent()));\n    if (spec.name != null) {\n      name = spec.name;\n      scope.addData(name, new DataScope(scope, store, render, sieve));\n      if (spec.on) spec.on.forEach((on2) => {\n        if (on2.insert || on2.remove || on2.toggle) {\n          error(\"Marks only support modify triggers.\");\n        }\n        parseTrigger(on2, scope, name);\n      });\n    }\n  }\n  function parseOverlap(overlap, source2, scope) {\n    const method2 = overlap.method, bound2 = overlap.bound, sep = overlap.separation;\n    const params2 = {\n      separation: isSignal(sep) ? scope.signalRef(sep.signal) : sep,\n      method: isSignal(method2) ? scope.signalRef(method2.signal) : method2,\n      pulse: source2\n    };\n    if (overlap.order) {\n      params2.sort = scope.compareRef({\n        field: overlap.order\n      });\n    }\n    if (bound2) {\n      const tol = bound2.tolerance;\n      params2.boundTolerance = isSignal(tol) ? scope.signalRef(tol.signal) : +tol;\n      params2.boundScale = scope.scaleRef(bound2.scale);\n      params2.boundOrient = bound2.orient;\n    }\n    return ref(scope.add(Overlap(params2)));\n  }\n  function parseLegend(spec, scope) {\n    const config = scope.config.legend, encode2 = spec.encode || {}, _ = lookup(spec, config), legendEncode = encode2.legend || {}, name = legendEncode.name || void 0, interactive2 = legendEncode.interactive, style2 = legendEncode.style, scales2 = {};\n    let scale2 = 0, entryLayout, params2, children2;\n    LegendScales.forEach((s) => spec[s] ? (scales2[s] = spec[s], scale2 = scale2 || spec[s]) : 0);\n    if (!scale2) error(\"Missing valid scale for legend.\");\n    const type2 = legendType(spec, scope.scaleType(scale2));\n    const datum2 = {\n      title: spec.title != null,\n      scales: scales2,\n      type: type2,\n      vgrad: type2 !== \"symbol\" && _.isVertical()\n    };\n    const dataRef = ref(scope.add(Collect(null, [datum2])));\n    const entryEncode = {\n      enter: {\n        x: {\n          value: 0\n        },\n        y: {\n          value: 0\n        }\n      }\n    };\n    const entryRef = ref(scope.add(LegendEntries(params2 = {\n      type: type2,\n      scale: scope.scaleRef(scale2),\n      count: scope.objectProperty(_(\"tickCount\")),\n      limit: scope.property(_(\"symbolLimit\")),\n      values: scope.objectProperty(spec.values),\n      minstep: scope.property(spec.tickMinStep),\n      formatType: scope.property(spec.formatType),\n      formatSpecifier: scope.property(spec.format)\n    })));\n    if (type2 === Gradient) {\n      children2 = [legendGradient(spec, scale2, config, encode2.gradient), legendGradientLabels(spec, config, encode2.labels, entryRef)];\n      params2.count = params2.count || scope.signalRef(`max(2,2*floor((${deref(_.gradientLength())})/100))`);\n    } else if (type2 === Discrete) {\n      children2 = [legendGradientDiscrete(spec, scale2, config, encode2.gradient, entryRef), legendGradientLabels(spec, config, encode2.labels, entryRef)];\n    } else {\n      entryLayout = legendSymbolLayout(spec, config);\n      children2 = [legendSymbolGroups(spec, config, encode2, entryRef, deref(entryLayout.columns))];\n      params2.size = sizeExpression(spec, scope, children2[0].marks);\n    }\n    children2 = [guideGroup({\n      role: LegendEntryRole,\n      from: dataRef,\n      encode: entryEncode,\n      marks: children2,\n      layout: entryLayout,\n      interactive: interactive2\n    })];\n    if (datum2.title) {\n      children2.push(legendTitle(spec, config, encode2.title, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: LegendRole,\n      from: dataRef,\n      encode: extendEncode(buildLegendEncode(_, spec, config), legendEncode, Skip),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function legendType(spec, scaleType) {\n    let type2 = spec.type || Symbols;\n    if (!spec.type && scaleCount(spec) === 1 && (spec.fill || spec.stroke)) {\n      type2 = isContinuous(scaleType) ? Gradient : isDiscretizing(scaleType) ? Discrete : Symbols;\n    }\n    return type2 !== Gradient ? type2 : isDiscretizing(scaleType) ? Discrete : Gradient;\n  }\n  function scaleCount(spec) {\n    return LegendScales.reduce((count2, type2) => count2 + (spec[type2] ? 1 : 0), 0);\n  }\n  function buildLegendEncode(_, spec, config) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      offset: _(\"offset\"),\n      padding: _(\"padding\"),\n      titlePadding: _(\"titlePadding\"),\n      cornerRadius: _(\"cornerRadius\"),\n      fill: _(\"fillColor\"),\n      stroke: _(\"strokeColor\"),\n      strokeWidth: config.strokeWidth,\n      strokeDash: config.strokeDash,\n      x: _(\"legendX\"),\n      y: _(\"legendY\"),\n      // accessibility support\n      format: spec.format,\n      formatType: spec.formatType\n    });\n    return encode2;\n  }\n  function sizeExpression(spec, scope, marks) {\n    const size = deref(getChannel(\"size\", spec, marks)), strokeWidth = deref(getChannel(\"strokeWidth\", spec, marks)), fontSize2 = deref(getFontSize(marks[1].encode, scope, GuideLabelStyle));\n    return parser(`max(ceil(sqrt(${size})+${strokeWidth}),${fontSize2})`, scope);\n  }\n  function getChannel(name, spec, marks) {\n    return spec[name] ? `scale(\"${spec[name]}\",datum)` : getEncoding(name, marks[0].encode);\n  }\n  function getFontSize(encode2, scope, style2) {\n    return getEncoding(\"fontSize\", encode2) || getStyle(\"fontSize\", scope, style2);\n  }\n  const angleExpr = `item.orient===\"${Left}\"?-90:item.orient===\"${Right}\"?90:0`;\n  function parseTitle(spec, scope) {\n    spec = isString(spec) ? {\n      text: spec\n    } : spec;\n    const _ = lookup(spec, scope.config.title), encode2 = spec.encode || {}, userEncode = encode2.group || {}, name = userEncode.name || void 0, interactive2 = userEncode.interactive, style2 = userEncode.style, children2 = [];\n    const datum2 = {}, dataRef = ref(scope.add(Collect(null, [datum2])));\n    children2.push(buildTitle(spec, _, titleEncode(spec), dataRef));\n    if (spec.subtitle) {\n      children2.push(buildSubTitle(spec, _, encode2.subtitle, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: TitleRole,\n      from: dataRef,\n      encode: groupEncode(_, userEncode),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function titleEncode(spec) {\n    const encode2 = spec.encode;\n    return encode2 && encode2.title || extend$1({\n      name: spec.name,\n      interactive: spec.interactive,\n      style: spec.style\n    }, encode2);\n  }\n  function groupEncode(_, userEncode) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      anchor: _(\"anchor\"),\n      align: {\n        signal: alignExpr$1\n      },\n      angle: {\n        signal: angleExpr\n      },\n      limit: _(\"limit\"),\n      frame: _(\"frame\"),\n      offset: _(\"offset\") || 0,\n      padding: _(\"subtitlePadding\")\n    });\n    return extendEncode(encode2, userEncode, Skip);\n  }\n  function buildTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n      value: 0\n    }, text2 = spec.text, encode2 = {\n      enter: {\n        opacity: zero2\n      },\n      update: {\n        opacity: {\n          value: 1\n        }\n      },\n      exit: {\n        opacity: zero2\n      }\n    };\n    addEncoders(encode2, {\n      text: text2,\n      align: {\n        signal: \"item.mark.group.align\"\n      },\n      angle: {\n        signal: \"item.mark.group.angle\"\n      },\n      limit: {\n        signal: \"item.mark.group.limit\"\n      },\n      baseline: \"top\",\n      dx: _(\"dx\"),\n      dy: _(\"dy\"),\n      fill: _(\"color\"),\n      font: _(\"font\"),\n      fontSize: _(\"fontSize\"),\n      fontStyle: _(\"fontStyle\"),\n      fontWeight: _(\"fontWeight\"),\n      lineHeight: _(\"lineHeight\")\n    }, {\n      // update\n      align: _(\"align\"),\n      angle: _(\"angle\"),\n      baseline: _(\"baseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: TitleTextRole,\n      style: GroupTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function buildSubTitle(spec, _, userEncode, dataRef) {\n    const zero2 = {\n      value: 0\n    }, text2 = spec.subtitle, encode2 = {\n      enter: {\n        opacity: zero2\n      },\n      update: {\n        opacity: {\n          value: 1\n        }\n      },\n      exit: {\n        opacity: zero2\n      }\n    };\n    addEncoders(encode2, {\n      text: text2,\n      align: {\n        signal: \"item.mark.group.align\"\n      },\n      angle: {\n        signal: \"item.mark.group.angle\"\n      },\n      limit: {\n        signal: \"item.mark.group.limit\"\n      },\n      baseline: \"top\",\n      dx: _(\"dx\"),\n      dy: _(\"dy\"),\n      fill: _(\"subtitleColor\"),\n      font: _(\"subtitleFont\"),\n      fontSize: _(\"subtitleFontSize\"),\n      fontStyle: _(\"subtitleFontStyle\"),\n      fontWeight: _(\"subtitleFontWeight\"),\n      lineHeight: _(\"subtitleLineHeight\")\n    }, {\n      // update\n      align: _(\"align\"),\n      angle: _(\"angle\"),\n      baseline: _(\"baseline\")\n    });\n    return guideMark({\n      type: TextMark,\n      role: TitleSubtitleRole,\n      style: GroupSubtitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function parseData(data2, scope) {\n    const transforms2 = [];\n    if (data2.transform) {\n      data2.transform.forEach((tx2) => {\n        transforms2.push(parseTransform(tx2, scope));\n      });\n    }\n    if (data2.on) {\n      data2.on.forEach((on2) => {\n        parseTrigger(on2, scope, data2.name);\n      });\n    }\n    scope.addDataPipeline(data2.name, analyze(data2, scope, transforms2));\n  }\n  function analyze(data2, scope, ops2) {\n    const output2 = [];\n    let source2 = null, modify2 = false, generate2 = false, upstream, i, n, t, m2;\n    if (data2.values) {\n      if (isSignal(data2.values) || hasSignal(data2.format)) {\n        output2.push(load(scope, data2));\n        output2.push(source2 = collect());\n      } else {\n        output2.push(source2 = collect({\n          $ingest: data2.values,\n          $format: data2.format\n        }));\n      }\n    } else if (data2.url) {\n      if (hasSignal(data2.url) || hasSignal(data2.format)) {\n        output2.push(load(scope, data2));\n        output2.push(source2 = collect());\n      } else {\n        output2.push(source2 = collect({\n          $request: data2.url,\n          $format: data2.format\n        }));\n      }\n    } else if (data2.source) {\n      source2 = upstream = array$5(data2.source).map((d) => ref(scope.getData(d).output));\n      output2.push(null);\n    }\n    for (i = 0, n = ops2.length; i < n; ++i) {\n      t = ops2[i];\n      m2 = t.metadata;\n      if (!source2 && !m2.source) {\n        output2.push(source2 = collect());\n      }\n      output2.push(t);\n      if (m2.generates) generate2 = true;\n      if (m2.modifies && !generate2) modify2 = true;\n      if (m2.source) source2 = t;\n      else if (m2.changes) source2 = null;\n    }\n    if (upstream) {\n      n = upstream.length - 1;\n      output2[0] = Relay({\n        derive: modify2,\n        pulse: n ? upstream : upstream[0]\n      });\n      if (modify2 || n) {\n        output2.splice(1, 0, collect());\n      }\n    }\n    if (!source2) output2.push(collect());\n    output2.push(Sieve({}));\n    return output2;\n  }\n  function collect(values2) {\n    const s = Collect({}, values2);\n    s.metadata = {\n      source: true\n    };\n    return s;\n  }\n  function load(scope, data2) {\n    return Load({\n      url: data2.url ? scope.property(data2.url) : void 0,\n      async: data2.async ? scope.property(data2.async) : void 0,\n      values: data2.values ? scope.property(data2.values) : void 0,\n      format: scope.objectProperty(data2.format)\n    });\n  }\n  const isX = (orient) => orient === Bottom || orient === Top;\n  const getSign = (orient, a2, b2) => isSignal(orient) ? ifLeftTopExpr(orient.signal, a2, b2) : orient === Left || orient === Top ? a2 : b2;\n  const ifX = (orient, a2, b2) => isSignal(orient) ? ifXEnc(orient.signal, a2, b2) : isX(orient) ? a2 : b2;\n  const ifY = (orient, a2, b2) => isSignal(orient) ? ifYEnc(orient.signal, a2, b2) : isX(orient) ? b2 : a2;\n  const ifTop = (orient, a2, b2) => isSignal(orient) ? ifTopExpr(orient.signal, a2, b2) : orient === Top ? {\n    value: a2\n  } : {\n    value: b2\n  };\n  const ifRight = (orient, a2, b2) => isSignal(orient) ? ifRightExpr(orient.signal, a2, b2) : orient === Right ? {\n    value: a2\n  } : {\n    value: b2\n  };\n  const ifXEnc = ($orient, a2, b2) => ifEnc(`${$orient} === '${Top}' || ${$orient} === '${Bottom}'`, a2, b2);\n  const ifYEnc = ($orient, a2, b2) => ifEnc(`${$orient} !== '${Top}' && ${$orient} !== '${Bottom}'`, a2, b2);\n  const ifLeftTopExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Left}' || ${$orient} === '${Top}'`, a2, b2);\n  const ifTopExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Top}'`, a2, b2);\n  const ifRightExpr = ($orient, a2, b2) => ifExpr(`${$orient} === '${Right}'`, a2, b2);\n  const ifEnc = (test2, a2, b2) => {\n    a2 = a2 != null ? encoder(a2) : a2;\n    b2 = b2 != null ? encoder(b2) : b2;\n    if (isSimple(a2) && isSimple(b2)) {\n      a2 = a2 ? a2.signal || $(a2.value) : null;\n      b2 = b2 ? b2.signal || $(b2.value) : null;\n      return {\n        signal: `${test2} ? (${a2}) : (${b2})`\n      };\n    } else {\n      return [extend$1({\n        test: test2\n      }, a2)].concat(b2 || []);\n    }\n  };\n  const isSimple = (enc) => enc == null || Object.keys(enc).length === 1;\n  const ifExpr = (test2, a2, b2) => ({\n    signal: `${test2} ? (${toExpr(a2)}) : (${toExpr(b2)})`\n  });\n  const ifOrient = ($orient, t, b2, l, r) => ({\n    signal: (l != null ? `${$orient} === '${Left}' ? (${toExpr(l)}) : ` : \"\") + (b2 != null ? `${$orient} === '${Bottom}' ? (${toExpr(b2)}) : ` : \"\") + (r != null ? `${$orient} === '${Right}' ? (${toExpr(r)}) : ` : \"\") + (t != null ? `${$orient} === '${Top}' ? (${toExpr(t)}) : ` : \"\") + \"(null)\"\n  });\n  const toExpr = (v) => isSignal(v) ? v.signal : v == null ? null : $(v);\n  const mult = (sign2, value2) => value2 === 0 ? 0 : isSignal(sign2) ? {\n    signal: `(${sign2.signal}) * ${value2}`\n  } : {\n    value: sign2 * value2\n  };\n  const patch = (value2, base2) => {\n    const s = value2.signal;\n    return s && s.endsWith(\"(null)\") ? {\n      signal: s.slice(0, -6) + base2.signal\n    } : value2;\n  };\n  function fallback(prop, config, axisConfig2, style2) {\n    let styleProp;\n    if (config && has$1(config, prop)) {\n      return config[prop];\n    } else if (has$1(axisConfig2, prop)) {\n      return axisConfig2[prop];\n    } else if (prop.startsWith(\"title\")) {\n      switch (prop) {\n        case \"titleColor\":\n          styleProp = \"fill\";\n          break;\n        case \"titleFont\":\n        case \"titleFontSize\":\n        case \"titleFontWeight\":\n          styleProp = prop[5].toLowerCase() + prop.slice(6);\n      }\n      return style2[GuideTitleStyle][styleProp];\n    } else if (prop.startsWith(\"label\")) {\n      switch (prop) {\n        case \"labelColor\":\n          styleProp = \"fill\";\n          break;\n        case \"labelFont\":\n        case \"labelFontSize\":\n          styleProp = prop[5].toLowerCase() + prop.slice(6);\n      }\n      return style2[GuideLabelStyle][styleProp];\n    }\n    return null;\n  }\n  function keys(objects) {\n    const map2 = {};\n    for (const obj of objects) {\n      if (!obj) continue;\n      for (const key2 in obj) map2[key2] = 1;\n    }\n    return Object.keys(map2);\n  }\n  function axisConfig(spec, scope) {\n    var config = scope.config, style2 = config.style, axis = config.axis, band2 = scope.scaleType(spec.scale) === \"band\" && config.axisBand, orient = spec.orient, xy, or2, key2;\n    if (isSignal(orient)) {\n      const xyKeys = keys([config.axisX, config.axisY]), orientKeys = keys([config.axisTop, config.axisBottom, config.axisLeft, config.axisRight]);\n      xy = {};\n      for (key2 of xyKeys) {\n        xy[key2] = ifX(orient, fallback(key2, config.axisX, axis, style2), fallback(key2, config.axisY, axis, style2));\n      }\n      or2 = {};\n      for (key2 of orientKeys) {\n        or2[key2] = ifOrient(orient.signal, fallback(key2, config.axisTop, axis, style2), fallback(key2, config.axisBottom, axis, style2), fallback(key2, config.axisLeft, axis, style2), fallback(key2, config.axisRight, axis, style2));\n      }\n    } else {\n      xy = orient === Top || orient === Bottom ? config.axisX : config.axisY;\n      or2 = config[\"axis\" + orient[0].toUpperCase() + orient.slice(1)];\n    }\n    const result = xy || or2 || band2 ? extend$1({}, axis, xy, or2, band2) : axis;\n    return result;\n  }\n  function axisDomain(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient;\n    let enter, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"domainColor\"),\n      strokeCap: _(\"domainCap\"),\n      strokeDash: _(\"domainDash\"),\n      strokeDashOffset: _(\"domainDashOffset\"),\n      strokeWidth: _(\"domainWidth\"),\n      strokeOpacity: _(\"domainOpacity\")\n    });\n    const pos0 = position(spec, 0);\n    const pos1 = position(spec, 1);\n    enter.x = update2.x = ifX(orient, pos0, zero);\n    enter.x2 = update2.x2 = ifX(orient, pos1);\n    enter.y = update2.y = ifY(orient, pos0, zero);\n    enter.y2 = update2.y2 = ifY(orient, pos1);\n    return guideMark({\n      type: RuleMark,\n      role: AxisDomainRole,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function position(spec, pos) {\n    return {\n      scale: spec.scale,\n      range: pos\n    };\n  }\n  function axisGrid(spec, config, userEncode, dataRef, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, vscale = spec.gridScale, sign2 = getSign(orient, 1, -1), offset2 = offsetValue(spec.offset, sign2);\n    let enter, exit, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: exit = {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"gridColor\"),\n      strokeCap: _(\"gridCap\"),\n      strokeDash: _(\"gridDash\"),\n      strokeDashOffset: _(\"gridDashOffset\"),\n      strokeOpacity: _(\"gridOpacity\"),\n      strokeWidth: _(\"gridWidth\")\n    });\n    const tickPos = {\n      scale: spec.scale,\n      field: Value,\n      band: band2.band,\n      extra: band2.extra,\n      offset: band2.offset,\n      round: _(\"tickRound\")\n    };\n    const sz2 = ifX(orient, {\n      signal: \"height\"\n    }, {\n      signal: \"width\"\n    });\n    const gridStart = vscale ? {\n      scale: vscale,\n      range: 0,\n      mult: sign2,\n      offset: offset2\n    } : {\n      value: 0,\n      offset: offset2\n    };\n    const gridEnd = vscale ? {\n      scale: vscale,\n      range: 1,\n      mult: sign2,\n      offset: offset2\n    } : extend$1(sz2, {\n      mult: sign2,\n      offset: offset2\n    });\n    enter.x = update2.x = ifX(orient, tickPos, gridStart);\n    enter.y = update2.y = ifY(orient, tickPos, gridStart);\n    enter.x2 = update2.x2 = ifY(orient, gridEnd);\n    enter.y2 = update2.y2 = ifX(orient, gridEnd);\n    exit.x = ifX(orient, tickPos);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n      type: RuleMark,\n      role: AxisGridRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function offsetValue(offset2, sign2) {\n    if (sign2 === 1) ;\n    else if (!isObject$1(offset2)) {\n      offset2 = isSignal(sign2) ? {\n        signal: `(${sign2.signal}) * (${offset2 || 0})`\n      } : sign2 * (offset2 || 0);\n    } else {\n      let entry2 = offset2 = extend$1({}, offset2);\n      while (entry2.mult != null) {\n        if (!isObject$1(entry2.mult)) {\n          entry2.mult = isSignal(sign2) ? {\n            signal: `(${entry2.mult}) * (${sign2.signal})`\n          } : entry2.mult * sign2;\n          return offset2;\n        } else {\n          entry2 = entry2.mult = extend$1({}, entry2.mult);\n        }\n      }\n      entry2.mult = sign2;\n    }\n    return offset2;\n  }\n  function axisTicks(spec, config, userEncode, dataRef, size, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, sign2 = getSign(orient, -1, 1);\n    let enter, exit, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero\n      },\n      update: update2 = {\n        opacity: one\n      },\n      exit: exit = {\n        opacity: zero\n      }\n    };\n    addEncoders(encode2, {\n      stroke: _(\"tickColor\"),\n      strokeCap: _(\"tickCap\"),\n      strokeDash: _(\"tickDash\"),\n      strokeDashOffset: _(\"tickDashOffset\"),\n      strokeOpacity: _(\"tickOpacity\"),\n      strokeWidth: _(\"tickWidth\")\n    });\n    const tickSize = encoder(size);\n    tickSize.mult = sign2;\n    const tickPos = {\n      scale: spec.scale,\n      field: Value,\n      band: band2.band,\n      extra: band2.extra,\n      offset: band2.offset,\n      round: _(\"tickRound\")\n    };\n    update2.y = enter.y = ifX(orient, zero, tickPos);\n    update2.y2 = enter.y2 = ifX(orient, tickSize);\n    exit.x = ifX(orient, tickPos);\n    update2.x = enter.x = ifY(orient, zero, tickPos);\n    update2.x2 = enter.x2 = ifY(orient, tickSize);\n    exit.y = ifY(orient, tickPos);\n    return guideMark({\n      type: RuleMark,\n      role: AxisTickRole,\n      key: Value,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function flushExpr(scale2, threshold2, a2, b2, c2) {\n    return {\n      signal: 'flush(range(\"' + scale2 + '\"), scale(\"' + scale2 + '\", datum.value), ' + threshold2 + \",\" + a2 + \",\" + b2 + \",\" + c2 + \")\"\n    };\n  }\n  function axisLabels(spec, config, userEncode, dataRef, size, band2) {\n    const _ = lookup(spec, config), orient = spec.orient, scale2 = spec.scale, sign2 = getSign(orient, -1, 1), flush2 = deref(_(\"labelFlush\")), flushOffset = deref(_(\"labelFlushOffset\")), labelAlign = _(\"labelAlign\"), labelBaseline = _(\"labelBaseline\");\n    let flushOn = flush2 === 0 || !!flush2, update2;\n    const tickSize = encoder(size);\n    tickSize.mult = sign2;\n    tickSize.offset = encoder(_(\"labelPadding\") || 0);\n    tickSize.offset.mult = sign2;\n    const tickPos = {\n      scale: scale2,\n      field: Value,\n      band: 0.5,\n      offset: extendOffset(band2.offset, _(\"labelOffset\"))\n    };\n    const align = ifX(orient, flushOn ? flushExpr(scale2, flush2, '\"left\"', '\"right\"', '\"center\"') : {\n      value: \"center\"\n    }, ifRight(orient, \"left\", \"right\"));\n    const baseline2 = ifX(orient, ifTop(orient, \"bottom\", \"top\"), flushOn ? flushExpr(scale2, flush2, '\"top\"', '\"bottom\"', '\"middle\"') : {\n      value: \"middle\"\n    });\n    const offsetExpr = flushExpr(scale2, flush2, `-(${flushOffset})`, flushOffset, 0);\n    flushOn = flushOn && flushOffset;\n    const enter = {\n      opacity: zero,\n      x: ifX(orient, tickPos, tickSize),\n      y: ifY(orient, tickPos, tickSize)\n    };\n    const encode2 = {\n      enter,\n      update: update2 = {\n        opacity: one,\n        text: {\n          field: Label\n        },\n        x: enter.x,\n        y: enter.y,\n        align,\n        baseline: baseline2\n      },\n      exit: {\n        opacity: zero,\n        x: enter.x,\n        y: enter.y\n      }\n    };\n    addEncoders(encode2, {\n      dx: !labelAlign && flushOn ? ifX(orient, offsetExpr) : null,\n      dy: !labelBaseline && flushOn ? ifY(orient, offsetExpr) : null\n    });\n    addEncoders(encode2, {\n      angle: _(\"labelAngle\"),\n      fill: _(\"labelColor\"),\n      fillOpacity: _(\"labelOpacity\"),\n      font: _(\"labelFont\"),\n      fontSize: _(\"labelFontSize\"),\n      fontWeight: _(\"labelFontWeight\"),\n      fontStyle: _(\"labelFontStyle\"),\n      limit: _(\"labelLimit\"),\n      lineHeight: _(\"labelLineHeight\")\n    }, {\n      align: labelAlign,\n      baseline: labelBaseline\n    });\n    const bound2 = _(\"labelBound\");\n    let overlap = _(\"labelOverlap\");\n    overlap = overlap || bound2 ? {\n      separation: _(\"labelSeparation\"),\n      method: overlap,\n      order: \"datum.index\",\n      bound: bound2 ? {\n        scale: scale2,\n        orient,\n        tolerance: bound2\n      } : null\n    } : void 0;\n    if (update2.align !== align) {\n      update2.align = patch(update2.align, align);\n    }\n    if (update2.baseline !== baseline2) {\n      update2.baseline = patch(update2.baseline, baseline2);\n    }\n    return guideMark({\n      type: TextMark,\n      role: AxisLabelRole,\n      style: GuideLabelStyle,\n      key: Value,\n      from: dataRef,\n      encode: encode2,\n      overlap\n    }, userEncode);\n  }\n  function axisTitle(spec, config, userEncode, dataRef) {\n    const _ = lookup(spec, config), orient = spec.orient, sign2 = getSign(orient, -1, 1);\n    let enter, update2;\n    const encode2 = {\n      enter: enter = {\n        opacity: zero,\n        anchor: encoder(_(\"titleAnchor\", null)),\n        align: {\n          signal: alignExpr$1\n        }\n      },\n      update: update2 = extend$1({}, enter, {\n        opacity: one,\n        text: encoder(spec.title)\n      }),\n      exit: {\n        opacity: zero\n      }\n    };\n    const titlePos = {\n      signal: `lerp(range(\"${spec.scale}\"), ${anchorExpr(0, 1, 0.5)})`\n    };\n    update2.x = ifX(orient, titlePos);\n    update2.y = ifY(orient, titlePos);\n    enter.angle = ifX(orient, zero, mult(sign2, 90));\n    enter.baseline = ifX(orient, ifTop(orient, Bottom, Top), {\n      value: Bottom\n    });\n    update2.angle = enter.angle;\n    update2.baseline = enter.baseline;\n    addEncoders(encode2, {\n      fill: _(\"titleColor\"),\n      fillOpacity: _(\"titleOpacity\"),\n      font: _(\"titleFont\"),\n      fontSize: _(\"titleFontSize\"),\n      fontStyle: _(\"titleFontStyle\"),\n      fontWeight: _(\"titleFontWeight\"),\n      limit: _(\"titleLimit\"),\n      lineHeight: _(\"titleLineHeight\")\n    }, {\n      // require update\n      align: _(\"titleAlign\"),\n      angle: _(\"titleAngle\"),\n      baseline: _(\"titleBaseline\")\n    });\n    autoLayout(_, orient, encode2, userEncode);\n    encode2.update.align = patch(encode2.update.align, enter.align);\n    encode2.update.angle = patch(encode2.update.angle, enter.angle);\n    encode2.update.baseline = patch(encode2.update.baseline, enter.baseline);\n    return guideMark({\n      type: TextMark,\n      role: AxisTitleRole,\n      style: GuideTitleStyle,\n      from: dataRef,\n      encode: encode2\n    }, userEncode);\n  }\n  function autoLayout(_, orient, encode2, userEncode) {\n    const auto = (value2, dim) => value2 != null ? (encode2.update[dim] = patch(encoder(value2), encode2.update[dim]), false) : !has(dim, userEncode) ? true : false;\n    const autoY = auto(_(\"titleX\"), \"x\"), autoX = auto(_(\"titleY\"), \"y\");\n    encode2.enter.auto = autoX === autoY ? encoder(autoX) : ifX(orient, encoder(autoX), encoder(autoY));\n  }\n  function parseAxis(spec, scope) {\n    const config = axisConfig(spec, scope), encode2 = spec.encode || {}, axisEncode = encode2.axis || {}, name = axisEncode.name || void 0, interactive2 = axisEncode.interactive, style2 = axisEncode.style, _ = lookup(spec, config), band2 = tickBand(_);\n    const datum2 = {\n      scale: spec.scale,\n      ticks: !!_(\"ticks\"),\n      labels: !!_(\"labels\"),\n      grid: !!_(\"grid\"),\n      domain: !!_(\"domain\"),\n      title: spec.title != null\n    };\n    const dataRef = ref(scope.add(Collect({}, [datum2])));\n    const ticksRef = ref(scope.add(AxisTicks({\n      scale: scope.scaleRef(spec.scale),\n      extra: scope.property(band2.extra),\n      count: scope.objectProperty(spec.tickCount),\n      values: scope.objectProperty(spec.values),\n      minstep: scope.property(spec.tickMinStep),\n      formatType: scope.property(spec.formatType),\n      formatSpecifier: scope.property(spec.format)\n    })));\n    const children2 = [];\n    let size;\n    if (datum2.grid) {\n      children2.push(axisGrid(spec, config, encode2.grid, ticksRef, band2));\n    }\n    if (datum2.ticks) {\n      size = _(\"tickSize\");\n      children2.push(axisTicks(spec, config, encode2.ticks, ticksRef, size, band2));\n    }\n    if (datum2.labels) {\n      size = datum2.ticks ? size : 0;\n      children2.push(axisLabels(spec, config, encode2.labels, ticksRef, size, band2));\n    }\n    if (datum2.domain) {\n      children2.push(axisDomain(spec, config, encode2.domain, dataRef));\n    }\n    if (datum2.title) {\n      children2.push(axisTitle(spec, config, encode2.title, dataRef));\n    }\n    return parseMark(guideGroup({\n      role: AxisRole,\n      from: dataRef,\n      encode: extendEncode(buildAxisEncode(_, spec), axisEncode, Skip),\n      marks: children2,\n      aria: _(\"aria\"),\n      description: _(\"description\"),\n      zindex: _(\"zindex\"),\n      name,\n      interactive: interactive2,\n      style: style2\n    }), scope);\n  }\n  function buildAxisEncode(_, spec) {\n    const encode2 = {\n      enter: {},\n      update: {}\n    };\n    addEncoders(encode2, {\n      orient: _(\"orient\"),\n      offset: _(\"offset\") || 0,\n      position: value(spec.position, 0),\n      titlePadding: _(\"titlePadding\"),\n      minExtent: _(\"minExtent\"),\n      maxExtent: _(\"maxExtent\"),\n      range: {\n        signal: `abs(span(range(\"${spec.scale}\")))`\n      },\n      translate: _(\"translate\"),\n      // accessibility support\n      format: spec.format,\n      formatType: spec.formatType\n    });\n    return encode2;\n  }\n  function parseScope(spec, scope, preprocessed) {\n    const signals = array$5(spec.signals), scales2 = array$5(spec.scales);\n    if (!preprocessed) signals.forEach((_) => parseSignal(_, scope));\n    array$5(spec.projections).forEach((_) => parseProjection(_, scope));\n    scales2.forEach((_) => initScale(_, scope));\n    array$5(spec.data).forEach((_) => parseData(_, scope));\n    scales2.forEach((_) => parseScale(_, scope));\n    (preprocessed || signals).forEach((_) => parseSignalUpdates(_, scope));\n    array$5(spec.axes).forEach((_) => parseAxis(_, scope));\n    array$5(spec.marks).forEach((_) => parseMark(_, scope));\n    array$5(spec.legends).forEach((_) => parseLegend(_, scope));\n    if (spec.title) parseTitle(spec.title, scope);\n    scope.parseLambdas();\n    return scope;\n  }\n  const rootEncode = (spec) => extendEncode({\n    enter: {\n      x: {\n        value: 0\n      },\n      y: {\n        value: 0\n      }\n    },\n    update: {\n      width: {\n        signal: \"width\"\n      },\n      height: {\n        signal: \"height\"\n      }\n    }\n  }, spec);\n  function parseView(spec, scope) {\n    const config = scope.config;\n    const root = ref(scope.root = scope.add(operator()));\n    const signals = collectSignals(spec, config);\n    signals.forEach((_) => parseSignal(_, scope));\n    scope.description = spec.description || config.description;\n    scope.eventConfig = config.events;\n    scope.legends = scope.objectProperty(config.legend && config.legend.layout);\n    scope.locale = config.locale;\n    const input = scope.add(Collect());\n    const encode2 = scope.add(Encode(parseEncode(rootEncode(spec.encode), GroupMark, FrameRole, spec.style, scope, {\n      pulse: ref(input)\n    })));\n    const parent = scope.add(ViewLayout({\n      layout: scope.objectProperty(spec.layout),\n      legends: scope.legends,\n      autosize: scope.signalRef(\"autosize\"),\n      mark: root,\n      pulse: ref(encode2)\n    }));\n    scope.operators.pop();\n    scope.pushState(ref(encode2), ref(parent), null);\n    parseScope(spec, scope, signals);\n    scope.operators.push(parent);\n    let op = scope.add(Bound({\n      mark: root,\n      pulse: ref(parent)\n    }));\n    op = scope.add(Render({\n      pulse: ref(op)\n    }));\n    op = scope.add(Sieve({\n      pulse: ref(op)\n    }));\n    scope.addData(\"root\", new DataScope(scope, input, input, op));\n    return scope;\n  }\n  function signalObject(name, value2) {\n    return value2 && value2.signal ? {\n      name,\n      update: value2.signal\n    } : {\n      name,\n      value: value2\n    };\n  }\n  function collectSignals(spec, config) {\n    const _ = (name) => value(spec[name], config[name]), signals = [signalObject(\"background\", _(\"background\")), signalObject(\"autosize\", parseAutosize(_(\"autosize\"))), signalObject(\"padding\", parsePadding(_(\"padding\"))), signalObject(\"width\", _(\"width\") || 0), signalObject(\"height\", _(\"height\") || 0)], pre = signals.reduce((p, s) => (p[s.name] = s, p), {}), map2 = {};\n    array$5(spec.signals).forEach((s) => {\n      if (has$1(pre, s.name)) {\n        s = extend$1(pre[s.name], s);\n      } else {\n        signals.push(s);\n      }\n      map2[s.name] = s;\n    });\n    array$5(config.signals).forEach((s) => {\n      if (!has$1(map2, s.name) && !has$1(pre, s.name)) {\n        signals.push(s);\n      }\n    });\n    return signals;\n  }\n  function Scope(config, options) {\n    this.config = config || {};\n    this.options = options || {};\n    this.bindings = [];\n    this.field = {};\n    this.signals = {};\n    this.lambdas = {};\n    this.scales = {};\n    this.events = {};\n    this.data = {};\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this.eventConfig = null;\n    this.locale = null;\n    this._id = 0;\n    this._subid = 0;\n    this._nextsub = [0];\n    this._parent = [];\n    this._encode = [];\n    this._lookup = [];\n    this._markpath = [];\n  }\n  function Subscope(scope) {\n    this.config = scope.config;\n    this.options = scope.options;\n    this.legends = scope.legends;\n    this.field = Object.create(scope.field);\n    this.signals = Object.create(scope.signals);\n    this.lambdas = Object.create(scope.lambdas);\n    this.scales = Object.create(scope.scales);\n    this.events = Object.create(scope.events);\n    this.data = Object.create(scope.data);\n    this.streams = [];\n    this.updates = [];\n    this.operators = [];\n    this._id = 0;\n    this._subid = ++scope._nextsub[0];\n    this._nextsub = scope._nextsub;\n    this._parent = scope._parent.slice();\n    this._encode = scope._encode.slice();\n    this._lookup = scope._lookup.slice();\n    this._markpath = scope._markpath;\n  }\n  Scope.prototype = Subscope.prototype = {\n    parse(spec) {\n      return parseScope(spec, this);\n    },\n    fork() {\n      return new Subscope(this);\n    },\n    isSubscope() {\n      return this._subid > 0;\n    },\n    toRuntime() {\n      this.finish();\n      return {\n        description: this.description,\n        operators: this.operators,\n        streams: this.streams,\n        updates: this.updates,\n        bindings: this.bindings,\n        eventConfig: this.eventConfig,\n        locale: this.locale\n      };\n    },\n    id() {\n      return (this._subid ? this._subid + \":\" : 0) + this._id++;\n    },\n    add(op) {\n      this.operators.push(op);\n      op.id = this.id();\n      if (op.refs) {\n        op.refs.forEach((ref2) => {\n          ref2.$ref = op.id;\n        });\n        op.refs = null;\n      }\n      return op;\n    },\n    proxy(op) {\n      const vref = op instanceof Entry ? ref(op) : op;\n      return this.add(Proxy({\n        value: vref\n      }));\n    },\n    addStream(stream2) {\n      this.streams.push(stream2);\n      stream2.id = this.id();\n      return stream2;\n    },\n    addUpdate(update2) {\n      this.updates.push(update2);\n      return update2;\n    },\n    // Apply metadata\n    finish() {\n      let name, ds;\n      if (this.root) this.root.root = true;\n      for (name in this.signals) {\n        this.signals[name].signal = name;\n      }\n      for (name in this.scales) {\n        this.scales[name].scale = name;\n      }\n      function annotate(op, name2, type2) {\n        let data2, list;\n        if (op) {\n          data2 = op.data || (op.data = {});\n          list = data2[name2] || (data2[name2] = []);\n          list.push(type2);\n        }\n      }\n      for (name in this.data) {\n        ds = this.data[name];\n        annotate(ds.input, name, \"input\");\n        annotate(ds.output, name, \"output\");\n        annotate(ds.values, name, \"values\");\n        for (const field2 in ds.index) {\n          annotate(ds.index[field2], name, \"index:\" + field2);\n        }\n      }\n      return this;\n    },\n    // ----\n    pushState(encode2, parent, lookup2) {\n      this._encode.push(ref(this.add(Sieve({\n        pulse: encode2\n      }))));\n      this._parent.push(parent);\n      this._lookup.push(lookup2 ? ref(this.proxy(lookup2)) : null);\n      this._markpath.push(-1);\n    },\n    popState() {\n      this._encode.pop();\n      this._parent.pop();\n      this._lookup.pop();\n      this._markpath.pop();\n    },\n    parent() {\n      return peek$1(this._parent);\n    },\n    encode() {\n      return peek$1(this._encode);\n    },\n    lookup() {\n      return peek$1(this._lookup);\n    },\n    markpath() {\n      const p = this._markpath;\n      return ++p[p.length - 1];\n    },\n    // ----\n    fieldRef(field2, name) {\n      if (isString(field2)) return fieldRef$1(field2, name);\n      if (!field2.signal) {\n        error(\"Unsupported field reference: \" + $(field2));\n      }\n      const s = field2.signal;\n      let f = this.field[s];\n      if (!f) {\n        const params2 = {\n          name: this.signalRef(s)\n        };\n        if (name) params2.as = name;\n        this.field[s] = f = ref(this.add(Field(params2)));\n      }\n      return f;\n    },\n    compareRef(cmp) {\n      let signal = false;\n      const check = (_) => isSignal(_) ? (signal = true, this.signalRef(_.signal)) : isExpr$1(_) ? (signal = true, this.exprRef(_.expr)) : _;\n      const fields = array$5(cmp.field).map(check), orders = array$5(cmp.order).map(check);\n      return signal ? ref(this.add(Compare({\n        fields,\n        orders\n      }))) : compareRef(fields, orders);\n    },\n    keyRef(fields, flat) {\n      let signal = false;\n      const check = (_) => isSignal(_) ? (signal = true, ref(sig[_.signal])) : _;\n      const sig = this.signals;\n      fields = array$5(fields).map(check);\n      return signal ? ref(this.add(Key({\n        fields,\n        flat\n      }))) : keyRef(fields, flat);\n    },\n    sortRef(sort2) {\n      if (!sort2) return sort2;\n      const a2 = aggrField(sort2.op, sort2.field), o = sort2.order || Ascending;\n      return o.signal ? ref(this.add(Compare({\n        fields: a2,\n        orders: this.signalRef(o.signal)\n      }))) : compareRef(a2, o);\n    },\n    // ----\n    event(source2, type2) {\n      const key2 = source2 + \":\" + type2;\n      if (!this.events[key2]) {\n        const id2 = this.id();\n        this.streams.push({\n          id: id2,\n          source: source2,\n          type: type2\n        });\n        this.events[key2] = id2;\n      }\n      return this.events[key2];\n    },\n    // ----\n    hasOwnSignal(name) {\n      return has$1(this.signals, name);\n    },\n    addSignal(name, value2) {\n      if (this.hasOwnSignal(name)) {\n        error(\"Duplicate signal name: \" + $(name));\n      }\n      const op = value2 instanceof Entry ? value2 : this.add(operator(value2));\n      return this.signals[name] = op;\n    },\n    getSignal(name) {\n      if (!this.signals[name]) {\n        error(\"Unrecognized signal name: \" + $(name));\n      }\n      return this.signals[name];\n    },\n    signalRef(s) {\n      if (this.signals[s]) {\n        return ref(this.signals[s]);\n      } else if (!has$1(this.lambdas, s)) {\n        this.lambdas[s] = this.add(operator(null));\n      }\n      return ref(this.lambdas[s]);\n    },\n    parseLambdas() {\n      const code = Object.keys(this.lambdas);\n      for (let i = 0, n = code.length; i < n; ++i) {\n        const s = code[i], e = parser(s, this), op = this.lambdas[s];\n        op.params = e.$params;\n        op.update = e.$expr;\n      }\n    },\n    property(spec) {\n      return spec && spec.signal ? this.signalRef(spec.signal) : spec;\n    },\n    objectProperty(spec) {\n      return !spec || !isObject$1(spec) ? spec : this.signalRef(spec.signal || propertyLambda(spec));\n    },\n    exprRef(code, name) {\n      const params2 = {\n        expr: parser(code, this)\n      };\n      if (name) params2.expr.$name = name;\n      return ref(this.add(Expression(params2)));\n    },\n    addBinding(name, bind2) {\n      if (!this.bindings) {\n        error(\"Nested signals do not support binding: \" + $(name));\n      }\n      this.bindings.push(extend$1({\n        signal: name\n      }, bind2));\n    },\n    // ----\n    addScaleProj(name, transform2) {\n      if (has$1(this.scales, name)) {\n        error(\"Duplicate scale or projection name: \" + $(name));\n      }\n      this.scales[name] = this.add(transform2);\n    },\n    addScale(name, params2) {\n      this.addScaleProj(name, Scale(params2));\n    },\n    addProjection(name, params2) {\n      this.addScaleProj(name, Projection(params2));\n    },\n    getScale(name) {\n      if (!this.scales[name]) {\n        error(\"Unrecognized scale name: \" + $(name));\n      }\n      return this.scales[name];\n    },\n    scaleRef(name) {\n      return ref(this.getScale(name));\n    },\n    scaleType(name) {\n      return this.getScale(name).params.type;\n    },\n    projectionRef(name) {\n      return this.scaleRef(name);\n    },\n    projectionType(name) {\n      return this.scaleType(name);\n    },\n    // ----\n    addData(name, dataScope) {\n      if (has$1(this.data, name)) {\n        error(\"Duplicate data set name: \" + $(name));\n      }\n      return this.data[name] = dataScope;\n    },\n    getData(name) {\n      if (!this.data[name]) {\n        error(\"Undefined data set name: \" + $(name));\n      }\n      return this.data[name];\n    },\n    addDataPipeline(name, entries) {\n      if (has$1(this.data, name)) {\n        error(\"Duplicate data set name: \" + $(name));\n      }\n      return this.addData(name, DataScope.fromEntries(this, entries));\n    }\n  };\n  function propertyLambda(spec) {\n    return (isArray(spec) ? arrayLambda : objectLambda)(spec);\n  }\n  function arrayLambda(array2) {\n    const n = array2.length;\n    let code = \"[\";\n    for (let i = 0; i < n; ++i) {\n      const value2 = array2[i];\n      code += (i > 0 ? \",\" : \"\") + (isObject$1(value2) ? value2.signal || propertyLambda(value2) : $(value2));\n    }\n    return code + \"]\";\n  }\n  function objectLambda(obj) {\n    let code = \"{\", i = 0, key2, value2;\n    for (key2 in obj) {\n      value2 = obj[key2];\n      code += (++i > 1 ? \",\" : \"\") + $(key2) + \":\" + (isObject$1(value2) ? value2.signal || propertyLambda(value2) : $(value2));\n    }\n    return code + \"}\";\n  }\n  function defaults() {\n    const defaultFont = \"sans-serif\", defaultSymbolSize = 30, defaultStrokeWidth = 2, defaultColor = \"#4c78a8\", black = \"#000\", gray = \"#888\", lightGray = \"#ddd\";\n    return {\n      // default visualization description\n      description: \"Vega visualization\",\n      // default padding around visualization\n      padding: 0,\n      // default for automatic sizing; options: 'none', 'pad', 'fit'\n      // or provide an object (e.g., {'type': 'pad', 'resize': true})\n      autosize: \"pad\",\n      // default view background color\n      // covers the entire view component\n      background: null,\n      // default event handling configuration\n      // preventDefault for view-sourced event types except 'wheel'\n      events: {\n        defaults: {\n          allow: [\"wheel\"]\n        }\n      },\n      // defaults for top-level group marks\n      // accepts mark properties (fill, stroke, etc)\n      // covers the data rectangle within group width/height\n      group: null,\n      // defaults for basic mark types\n      // each subset accepts mark properties (fill, stroke, etc)\n      mark: null,\n      arc: {\n        fill: defaultColor\n      },\n      area: {\n        fill: defaultColor\n      },\n      image: null,\n      line: {\n        stroke: defaultColor,\n        strokeWidth: defaultStrokeWidth\n      },\n      path: {\n        stroke: defaultColor\n      },\n      rect: {\n        fill: defaultColor\n      },\n      rule: {\n        stroke: black\n      },\n      shape: {\n        stroke: defaultColor\n      },\n      symbol: {\n        fill: defaultColor,\n        size: 64\n      },\n      text: {\n        fill: black,\n        font: defaultFont,\n        fontSize: 11\n      },\n      trail: {\n        fill: defaultColor,\n        size: defaultStrokeWidth\n      },\n      // style definitions\n      style: {\n        // axis & legend labels\n        \"guide-label\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 10\n        },\n        // axis & legend titles\n        \"guide-title\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 11,\n          fontWeight: \"bold\"\n        },\n        // headers, including chart title\n        \"group-title\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 13,\n          fontWeight: \"bold\"\n        },\n        // chart subtitle\n        \"group-subtitle\": {\n          fill: black,\n          font: defaultFont,\n          fontSize: 12\n        },\n        // defaults for styled point marks in Vega-Lite\n        point: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth,\n          shape: \"circle\"\n        },\n        circle: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth\n        },\n        square: {\n          size: defaultSymbolSize,\n          strokeWidth: defaultStrokeWidth,\n          shape: \"square\"\n        },\n        // defaults for styled group marks in Vega-Lite\n        cell: {\n          fill: \"transparent\",\n          stroke: lightGray\n        },\n        view: {\n          fill: \"transparent\"\n        }\n      },\n      // defaults for title\n      title: {\n        orient: \"top\",\n        anchor: \"middle\",\n        offset: 4,\n        subtitlePadding: 3\n      },\n      // defaults for axes\n      axis: {\n        minExtent: 0,\n        maxExtent: 200,\n        bandPosition: 0.5,\n        domain: true,\n        domainWidth: 1,\n        domainColor: gray,\n        grid: false,\n        gridWidth: 1,\n        gridColor: lightGray,\n        labels: true,\n        labelAngle: 0,\n        labelLimit: 180,\n        labelOffset: 0,\n        labelPadding: 2,\n        ticks: true,\n        tickColor: gray,\n        tickOffset: 0,\n        tickRound: true,\n        tickSize: 5,\n        tickWidth: 1,\n        titlePadding: 4\n      },\n      // correction for centering bias\n      axisBand: {\n        tickOffset: -0.5\n      },\n      // defaults for cartographic projection\n      projection: {\n        type: \"mercator\"\n      },\n      // defaults for legends\n      legend: {\n        orient: \"right\",\n        padding: 0,\n        gridAlign: \"each\",\n        columnPadding: 10,\n        rowPadding: 2,\n        symbolDirection: \"vertical\",\n        gradientDirection: \"vertical\",\n        gradientLength: 200,\n        gradientThickness: 16,\n        gradientStrokeColor: lightGray,\n        gradientStrokeWidth: 0,\n        gradientLabelOffset: 2,\n        labelAlign: \"left\",\n        labelBaseline: \"middle\",\n        labelLimit: 160,\n        labelOffset: 4,\n        labelOverlap: true,\n        symbolLimit: 30,\n        symbolType: \"circle\",\n        symbolSize: 100,\n        symbolOffset: 0,\n        symbolStrokeWidth: 1.5,\n        symbolBaseFillColor: \"transparent\",\n        symbolBaseStrokeColor: gray,\n        titleLimit: 180,\n        titleOrient: \"top\",\n        titlePadding: 5,\n        layout: {\n          offset: 18,\n          direction: \"horizontal\",\n          left: {\n            direction: \"vertical\"\n          },\n          right: {\n            direction: \"vertical\"\n          }\n        }\n      },\n      // defaults for scale ranges\n      range: {\n        category: {\n          scheme: \"tableau10\"\n        },\n        ordinal: {\n          scheme: \"blues\"\n        },\n        heatmap: {\n          scheme: \"yellowgreenblue\"\n        },\n        ramp: {\n          scheme: \"blues\"\n        },\n        diverging: {\n          scheme: \"blueorange\",\n          extent: [1, 0]\n        },\n        symbol: [\"circle\", \"square\", \"triangle-up\", \"cross\", \"diamond\", \"triangle-right\", \"triangle-down\", \"triangle-left\"]\n      }\n    };\n  }\n  function parse(spec, config, options) {\n    if (!isObject$1(spec)) {\n      error(\"Input Vega specification must be an object.\");\n    }\n    config = mergeConfig(defaults(), config, spec.config);\n    return parseView(spec, new Scope(config, options)).toRuntime();\n  }\n  var version$1 = \"6.2.0\";\n  extend$1(transforms, tx, vtx, encode$1, geo, force, label, tree, reg, voronoi, wordcloud, xf);\n  const version = version$1;\n  const vega$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    Bounds,\n    CanvasHandler,\n    CanvasRenderer,\n    DATE,\n    DAY,\n    DAYOFYEAR,\n    Dataflow,\n    Debug,\n    DisallowedObjectProperties,\n    Error: Error$1,\n    EventStream,\n    Gradient: Gradient$1,\n    GroupItem,\n    HOURS,\n    Handler,\n    HybridHandler,\n    HybridRenderer,\n    Info,\n    Item,\n    MILLISECONDS,\n    MINUTES,\n    MONTH,\n    Marks,\n    MultiPulse,\n    None: None$2,\n    Operator,\n    Parameters,\n    Pulse,\n    QUARTER,\n    RenderType,\n    Renderer,\n    ResourceLoader,\n    SECONDS,\n    SVGHandler,\n    SVGRenderer,\n    SVGStringRenderer,\n    Scenegraph,\n    TIME_UNITS,\n    Transform,\n    View: View$1,\n    WEEK,\n    Warn,\n    YEAR,\n    accessor,\n    accessorFields,\n    accessorName,\n    array: array$5,\n    ascending: ascending$2,\n    bandwidthNRD: estimateBandwidth,\n    bin,\n    bootstrapCI,\n    boundClip,\n    boundContext,\n    boundItem: boundItem$1,\n    boundMark,\n    boundStroke,\n    changeset,\n    clampRange,\n    codegenExpression: codegen,\n    compare: compare$1,\n    constant: constant$5,\n    cumulativeLogNormal,\n    cumulativeNormal,\n    cumulativeUniform,\n    dayofyear,\n    debounce,\n    defaultLocale,\n    definition: definition$1,\n    densityLogNormal,\n    densityNormal,\n    densityUniform,\n    domChild,\n    domClear,\n    domCreate,\n    domFind,\n    dotbin,\n    error,\n    expressionFunction,\n    extend: extend$1,\n    extent,\n    extentIndex,\n    falsy,\n    fastmap,\n    field: field$1,\n    flush,\n    font,\n    fontFamily,\n    fontSize,\n    format: format$2,\n    formatLocale: numberFormatDefaultLocale,\n    formats: formats$1,\n    hasOwnProperty: has$1,\n    id,\n    identity: identity$7,\n    inferType,\n    inferTypes,\n    ingest: ingest$1,\n    inherits,\n    inrange,\n    interpolate,\n    interpolateColors,\n    interpolateRange,\n    intersect: intersect$2,\n    intersectBoxLine,\n    intersectPath,\n    intersectPoint,\n    intersectRule,\n    isArray,\n    isBoolean: isBoolean$1,\n    isDate: isDate$1,\n    isFunction,\n    isIterable,\n    isNumber: isNumber$1,\n    isObject: isObject$1,\n    isRegExp,\n    isString,\n    isTuple,\n    key: key$2,\n    lerp: lerp$1,\n    lineHeight,\n    loader,\n    locale,\n    logger,\n    lruCache,\n    markup,\n    merge: merge$3,\n    mergeConfig,\n    multiLineOffset,\n    one: one$2,\n    pad: pad$2,\n    panLinear,\n    panLog,\n    panPow,\n    panSymlog,\n    parse,\n    parseExpression: parser$1,\n    parseSelector: eventSelector,\n    path: path$3,\n    pathCurves: curves,\n    pathEqual,\n    pathParse: parse$3,\n    pathRectangle: vg_rect,\n    pathRender,\n    pathSymbols: symbols,\n    pathTrail: vg_trail,\n    peek: peek$1,\n    point,\n    projection,\n    quantileLogNormal,\n    quantileNormal,\n    quantileUniform,\n    quantiles,\n    quantizeInterpolator,\n    quarter,\n    quartiles,\n    get random() {\n      return random;\n    },\n    randomInteger: integer,\n    randomKDE: kde,\n    randomLCG: lcg$2,\n    randomLogNormal: lognormal,\n    randomMixture: mixture$1,\n    randomNormal: gaussian,\n    randomUniform: uniform,\n    read,\n    regressionConstant: constant$4,\n    regressionExp: exp$1,\n    regressionLinear: linear$2,\n    regressionLoess: loess,\n    regressionLog: log$3,\n    regressionPoly: poly,\n    regressionPow: pow$3,\n    regressionQuad: quad,\n    renderModule,\n    repeat,\n    resetDefaultLocale,\n    resetSVGDefIds,\n    responseType,\n    runtimeContext: context,\n    sampleCurve,\n    sampleLogNormal,\n    sampleNormal,\n    sampleUniform,\n    scale: scale$6,\n    sceneEqual,\n    sceneFromJSON,\n    scenePickVisit: pickVisit,\n    sceneToJSON,\n    sceneVisit: visit,\n    sceneZOrder: zorder,\n    scheme,\n    serializeXML,\n    setHybridRendererOptions,\n    setRandom,\n    span,\n    splitAccessPath,\n    stringValue: $,\n    textMetrics,\n    timeBin: bin$1,\n    timeFloor,\n    timeFormatLocale: timeFormatDefaultLocale,\n    timeInterval,\n    timeOffset,\n    timeSequence,\n    timeUnitSpecifier,\n    timeUnits,\n    toBoolean,\n    toDate,\n    toNumber,\n    toSet,\n    toString,\n    transform: transform$2,\n    transforms,\n    truncate: truncate$1,\n    truthy,\n    tupleid,\n    typeParsers,\n    utcFloor,\n    utcInterval,\n    utcOffset,\n    utcSequence,\n    utcdayofyear,\n    utcquarter,\n    utcweek,\n    version,\n    visitArray,\n    week,\n    writeConfig,\n    zero: zero$3,\n    zoomLinear,\n    zoomLog,\n    zoomPow,\n    zoomSymlog\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\n  function decamelize(str, separator = \"-\") {\n    return str.replace(/([a-z\\d])([A-Z])/g, \"$1\" + separator + \"$2\").replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, \"$1\" + separator + \"$2\").toLowerCase();\n  }\n  function createElement(tag, attrs, ...children2) {\n    if (typeof tag === \"function\") {\n      const fn = tag;\n      let props = attrs;\n      if (props === null || props === void 0) {\n        props = { children: children2 };\n      } else {\n        props.children = children2;\n      }\n      return fn(props);\n    } else {\n      const ns = tag === \"svg\" ? SVG_NAMESPACE : null;\n      const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);\n      const map2 = attrs;\n      let ref2;\n      for (let name in map2) {\n        if (name && map2.hasOwnProperty(name)) {\n          let value2 = map2[name];\n          if (name === \"className\" && value2 !== void 0) {\n            setAttribute(el, ns, \"class\", value2.toString());\n          } else if (name === \"disabled\" && !value2) ;\n          else if (value2 === null || value2 === void 0) {\n            continue;\n          } else if (value2 === true) {\n            setAttribute(el, ns, name, name);\n          } else if (typeof value2 === \"function\") {\n            if (name === \"ref\") {\n              ref2 = value2;\n            } else {\n              el[name.toLowerCase()] = value2;\n            }\n          } else if (typeof value2 === \"object\") {\n            setAttribute(el, ns, name, flatten(value2));\n          } else {\n            setAttribute(el, ns, name, value2.toString());\n          }\n        }\n      }\n      if (children2 && children2.length > 0) {\n        appendChildren(el, children2);\n      }\n      if (ref2) {\n        ref2(el);\n      }\n      return el;\n    }\n  }\n  function setAttribute(el, ns, name, value2) {\n    if (ns) {\n      el.setAttributeNS(null, name, value2);\n    } else {\n      el.setAttribute(name, value2);\n    }\n  }\n  function flatten(o) {\n    const arr = [];\n    for (let prop in o)\n      arr.push(`${decamelize(prop, \"-\")}:${o[prop]}`);\n    return arr.join(\";\");\n  }\n  function isInsideForeignObject(element2) {\n    let current = element2;\n    while (current) {\n      if (current.tagName.toLowerCase() === \"foreignobject\") {\n        return true;\n      }\n      current = current.parentElement;\n    }\n    return false;\n  }\n  function recreateWithSvgNamespace(element2) {\n    const svgElement = document.createElementNS(SVG_NAMESPACE, element2.tagName.toLowerCase());\n    for (let i = 0; i < element2.attributes.length; i++) {\n      const attr2 = element2.attributes[i];\n      svgElement.setAttributeNS(null, attr2.name, attr2.value);\n    }\n    const eventProperties = [\n      \"onclick\",\n      \"onmousedown\",\n      \"onmouseup\",\n      \"onmouseover\",\n      \"onmouseout\",\n      \"onmousemove\",\n      \"onkeydown\",\n      \"onkeyup\",\n      \"onkeypress\",\n      \"onfocus\",\n      \"onblur\"\n    ];\n    for (const prop of eventProperties) {\n      if (element2[prop]) {\n        svgElement[prop] = element2[prop];\n      }\n    }\n    for (let i = 0; i < element2.childNodes.length; i++) {\n      const child = element2.childNodes[i];\n      if (child.nodeType === Node.ELEMENT_NODE) {\n        svgElement.appendChild(recreateWithSvgNamespace(child));\n      } else {\n        svgElement.appendChild(child.cloneNode(true));\n      }\n    }\n    return svgElement;\n  }\n  function addChild(parentElement, child) {\n    if (child === null || child === void 0 || typeof child === \"boolean\") {\n      return;\n    } else if (Array.isArray(child)) {\n      appendChildren(parentElement, child);\n    } else if (isElement(child)) {\n      const childEl = child;\n      if (parentElement.namespaceURI === SVG_NAMESPACE && childEl.namespaceURI !== SVG_NAMESPACE && childEl.tagName.toLowerCase() !== \"foreignobject\" && !isInsideForeignObject(parentElement)) {\n        const recreated = recreateWithSvgNamespace(childEl);\n        parentElement.appendChild(recreated);\n      } else {\n        parentElement.appendChild(childEl);\n      }\n    } else {\n      parentElement.appendChild(document.createTextNode(child.toString()));\n    }\n  }\n  function appendChildren(parentElement, children2) {\n    children2.forEach((child) => addChild(parentElement, child));\n  }\n  function isElement(el) {\n    return !!el.nodeType;\n  }\n  function mount(element2, container) {\n    container.innerHTML = \"\";\n    if (element2) {\n      addChild(container, element2);\n    }\n  }\n  function findElementByChildPositions(childPositions, container) {\n    let element2 = document.body;\n    let childPosition;\n    while (element2 && childPositions.length) {\n      childPosition = childPositions.shift();\n      element2 = element2.children.item(childPosition);\n    }\n    if (element2) {\n      return element2;\n    }\n  }\n  function focusActiveElement(element2, activeElementInfo) {\n    element2.focus();\n    element2.scrollTop = activeElementInfo.scrollTop;\n    const input = element2;\n    if (input.setSelectionRange && activeElementInfo && activeElementInfo.selectionStart != null && activeElementInfo.selectionEnd != null) {\n      input.setSelectionRange(activeElementInfo.selectionStart, activeElementInfo.selectionEnd, activeElementInfo.selectionDirection);\n    }\n  }\n  function setActiveElement(activeElementInfo, container) {\n    if (activeElementInfo) {\n      const element2 = findElementByChildPositions(activeElementInfo.childPositions);\n      if (element2) {\n        focusActiveElement(element2, activeElementInfo);\n      }\n    }\n  }\n  function getActiveElementInfo(container) {\n    let element2 = document.activeElement;\n    const { scrollTop, selectionDirection, selectionEnd, selectionStart } = element2;\n    const activeElementInfo = {\n      childPositions: [],\n      scrollTop,\n      selectionDirection,\n      selectionEnd,\n      selectionStart\n    };\n    while (element2 && element2 !== document.body && element2 !== container) {\n      activeElementInfo.childPositions.unshift(getChildPosition(element2));\n      element2 = element2.parentElement;\n    }\n    if ((element2 === document.body || element2 === container) && activeElementInfo.childPositions.length)\n      return activeElementInfo;\n  }\n  function getChildPosition(element2) {\n    let childPosition = 0;\n    while (element2 = element2.previousElementSibling)\n      childPosition++;\n    return childPosition;\n  }\n  const KeyCodes = {\n    ENTER: \"Enter\"\n  };\n  const Table = (props) => {\n    return createElement(\n      \"table\",\n      { className: props.className },\n      props.children,\n      props.rows.map((row, i) => createElement(\"tr\", { className: props.rowClassName || \"\", onClick: (e) => props.onRowClick && props.onRowClick(e, i), tabIndex: props.onRowClick ? 0 : -1, onKeyUp: (e) => {\n        if (e.key === KeyCodes.ENTER && props.onRowClick) {\n          props.onRowClick(e, i);\n        }\n      } }, row.cells.map((cell2, i2) => createElement(\"td\", { className: cell2.className || \"\", title: cell2.title || \"\" }, cell2.content))))\n    );\n  };\n  var EPSILON = 1e-6;\n  var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\n  function setMatrixArrayType(type2) {\n    ARRAY_TYPE = type2;\n  }\n  function create$5() {\n    var out = new ARRAY_TYPE(9);\n    if (ARRAY_TYPE != Float32Array) {\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[5] = 0;\n      out[6] = 0;\n      out[7] = 0;\n    }\n    out[0] = 1;\n    out[4] = 1;\n    out[8] = 1;\n    return out;\n  }\n  function fromMat4(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[4];\n    out[4] = a2[5];\n    out[5] = a2[6];\n    out[6] = a2[8];\n    out[7] = a2[9];\n    out[8] = a2[10];\n    return out;\n  }\n  function fromValues$5(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n  }\n  function fromQuat$1(out, q) {\n    var x2 = q[0], y2 = q[1], z = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z2 = z + z;\n    var xx = x2 * x22;\n    var yx = y2 * x22;\n    var yy = y2 * y22;\n    var zx = z * x22;\n    var zy = z * y22;\n    var zz = z * z2;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z2;\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n    return out;\n  }\n  function create$4() {\n    var out = new ARRAY_TYPE(16);\n    if (ARRAY_TYPE != Float32Array) {\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n    }\n    out[0] = 1;\n    out[5] = 1;\n    out[10] = 1;\n    out[15] = 1;\n    return out;\n  }\n  function copy$4(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    out[4] = a2[4];\n    out[5] = a2[5];\n    out[6] = a2[6];\n    out[7] = a2[7];\n    out[8] = a2[8];\n    out[9] = a2[9];\n    out[10] = a2[10];\n    out[11] = a2[11];\n    out[12] = a2[12];\n    out[13] = a2[13];\n    out[14] = a2[14];\n    out[15] = a2[15];\n    return out;\n  }\n  function fromValues$4(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n  }\n  function identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function invert(out, a2) {\n    var a00 = a2[0], a01 = a2[1], a02 = a2[2], a03 = a2[3];\n    var a10 = a2[4], a11 = a2[5], a12 = a2[6], a13 = a2[7];\n    var a20 = a2[8], a21 = a2[9], a22 = a2[10], a23 = a2[11];\n    var a30 = a2[12], a31 = a2[13], a32 = a2[14], a33 = a2[15];\n    var b00 = a00 * a11 - a01 * a10;\n    var b01 = a00 * a12 - a02 * a10;\n    var b02 = a00 * a13 - a03 * a10;\n    var b03 = a01 * a12 - a02 * a11;\n    var b04 = a01 * a13 - a03 * a11;\n    var b05 = a02 * a13 - a03 * a12;\n    var b06 = a20 * a31 - a21 * a30;\n    var b07 = a20 * a32 - a22 * a30;\n    var b08 = a20 * a33 - a23 * a30;\n    var b09 = a21 * a32 - a22 * a31;\n    var b10 = a21 * a33 - a23 * a31;\n    var b11 = a22 * a33 - a23 * a32;\n    var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n    if (!det) {\n      return null;\n    }\n    det = 1 / det;\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n    return out;\n  }\n  function multiply$2(out, a2, b2) {\n    var a00 = a2[0], a01 = a2[1], a02 = a2[2], a03 = a2[3];\n    var a10 = a2[4], a11 = a2[5], a12 = a2[6], a13 = a2[7];\n    var a20 = a2[8], a21 = a2[9], a22 = a2[10], a23 = a2[11];\n    var a30 = a2[12], a31 = a2[13], a32 = a2[14], a33 = a2[15];\n    var b0 = b2[0], b1 = b2[1], b22 = b2[2], b3 = b2[3];\n    out[0] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[4];\n    b1 = b2[5];\n    b22 = b2[6];\n    b3 = b2[7];\n    out[4] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[8];\n    b1 = b2[9];\n    b22 = b2[10];\n    b3 = b2[11];\n    out[8] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    b0 = b2[12];\n    b1 = b2[13];\n    b22 = b2[14];\n    b3 = b2[15];\n    out[12] = b0 * a00 + b1 * a10 + b22 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b22 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b22 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b22 * a23 + b3 * a33;\n    return out;\n  }\n  function translate(out, a2, v) {\n    var x2 = v[0], y2 = v[1], z = v[2];\n    var a00, a01, a02, a03;\n    var a10, a11, a12, a13;\n    var a20, a21, a22, a23;\n    if (a2 === out) {\n      out[12] = a2[0] * x2 + a2[4] * y2 + a2[8] * z + a2[12];\n      out[13] = a2[1] * x2 + a2[5] * y2 + a2[9] * z + a2[13];\n      out[14] = a2[2] * x2 + a2[6] * y2 + a2[10] * z + a2[14];\n      out[15] = a2[3] * x2 + a2[7] * y2 + a2[11] * z + a2[15];\n    } else {\n      a00 = a2[0];\n      a01 = a2[1];\n      a02 = a2[2];\n      a03 = a2[3];\n      a10 = a2[4];\n      a11 = a2[5];\n      a12 = a2[6];\n      a13 = a2[7];\n      a20 = a2[8];\n      a21 = a2[9];\n      a22 = a2[10];\n      a23 = a2[11];\n      out[0] = a00;\n      out[1] = a01;\n      out[2] = a02;\n      out[3] = a03;\n      out[4] = a10;\n      out[5] = a11;\n      out[6] = a12;\n      out[7] = a13;\n      out[8] = a20;\n      out[9] = a21;\n      out[10] = a22;\n      out[11] = a23;\n      out[12] = a00 * x2 + a10 * y2 + a20 * z + a2[12];\n      out[13] = a01 * x2 + a11 * y2 + a21 * z + a2[13];\n      out[14] = a02 * x2 + a12 * y2 + a22 * z + a2[14];\n      out[15] = a03 * x2 + a13 * y2 + a23 * z + a2[15];\n    }\n    return out;\n  }\n  function scale$1(out, a2, v) {\n    var x2 = v[0], y2 = v[1], z = v[2];\n    out[0] = a2[0] * x2;\n    out[1] = a2[1] * x2;\n    out[2] = a2[2] * x2;\n    out[3] = a2[3] * x2;\n    out[4] = a2[4] * y2;\n    out[5] = a2[5] * y2;\n    out[6] = a2[6] * y2;\n    out[7] = a2[7] * y2;\n    out[8] = a2[8] * z;\n    out[9] = a2[9] * z;\n    out[10] = a2[10] * z;\n    out[11] = a2[11] * z;\n    out[12] = a2[12];\n    out[13] = a2[13];\n    out[14] = a2[14];\n    out[15] = a2[15];\n    return out;\n  }\n  function fromScaling(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function fromRotationTranslationScale(out, q, v, s) {\n    var x2 = q[0], y2 = q[1], z = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z2 = z + z;\n    var xx = x2 * x22;\n    var xy = x2 * y22;\n    var xz = x2 * z2;\n    var yy = y2 * y22;\n    var yz = y2 * z2;\n    var zz = z * z2;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz2 = s[2];\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz2;\n    out[9] = (yz - wx) * sz2;\n    out[10] = (1 - (xx + yy)) * sz2;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n  }\n  function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n    var x2 = q[0], y2 = q[1], z = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z2 = z + z;\n    var xx = x2 * x22;\n    var xy = x2 * y22;\n    var xz = x2 * z2;\n    var yy = y2 * y22;\n    var yz = y2 * z2;\n    var zz = z * z2;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z2;\n    var sx = s[0];\n    var sy = s[1];\n    var sz2 = s[2];\n    var ox = o[0];\n    var oy = o[1];\n    var oz = o[2];\n    var out0 = (1 - (yy + zz)) * sx;\n    var out1 = (xy + wz) * sx;\n    var out2 = (xz - wy) * sx;\n    var out4 = (xy - wz) * sy;\n    var out5 = (1 - (xx + zz)) * sy;\n    var out6 = (yz + wx) * sy;\n    var out8 = (xz + wy) * sz2;\n    var out9 = (yz - wx) * sz2;\n    var out10 = (1 - (xx + yy)) * sz2;\n    out[0] = out0;\n    out[1] = out1;\n    out[2] = out2;\n    out[3] = 0;\n    out[4] = out4;\n    out[5] = out5;\n    out[6] = out6;\n    out[7] = 0;\n    out[8] = out8;\n    out[9] = out9;\n    out[10] = out10;\n    out[11] = 0;\n    out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n    out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n    out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n    out[15] = 1;\n    return out;\n  }\n  function fromQuat(out, q) {\n    var x2 = q[0], y2 = q[1], z = q[2], w2 = q[3];\n    var x22 = x2 + x2;\n    var y22 = y2 + y2;\n    var z2 = z + z;\n    var xx = x2 * x22;\n    var yx = y2 * x22;\n    var yy = y2 * y22;\n    var zx = z * x22;\n    var zy = z * y22;\n    var zz = z * z2;\n    var wx = w2 * x22;\n    var wy = w2 * y22;\n    var wz = w2 * z2;\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n  }\n  function frustum(out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left);\n    var tb = 1 / (top - bottom);\n    var nf = 1 / (near - far);\n    out[0] = near * 2 * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = near * 2 * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = far * near * 2 * nf;\n    out[15] = 0;\n    return out;\n  }\n  function perspectiveNO(out, fovy, aspect, near, far) {\n    var f = 1 / Math.tan(fovy / 2);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[15] = 0;\n    if (far != null && far !== Infinity) {\n      var nf = 1 / (near - far);\n      out[10] = (far + near) * nf;\n      out[14] = 2 * far * near * nf;\n    } else {\n      out[10] = -1;\n      out[14] = -2 * near;\n    }\n    return out;\n  }\n  var perspective = perspectiveNO;\n  function lookAt(out, eye, center, up) {\n    var x02, x12, x2, y02, y12, y2, z02, z1, z2, len2;\n    var eyex = eye[0];\n    var eyey = eye[1];\n    var eyez = eye[2];\n    var upx = up[0];\n    var upy = up[1];\n    var upz = up[2];\n    var centerx = center[0];\n    var centery = center[1];\n    var centerz = center[2];\n    if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) {\n      return identity(out);\n    }\n    z02 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n    len2 = 1 / Math.sqrt(z02 * z02 + z1 * z1 + z2 * z2);\n    z02 *= len2;\n    z1 *= len2;\n    z2 *= len2;\n    x02 = upy * z2 - upz * z1;\n    x12 = upz * z02 - upx * z2;\n    x2 = upx * z1 - upy * z02;\n    len2 = Math.sqrt(x02 * x02 + x12 * x12 + x2 * x2);\n    if (!len2) {\n      x02 = 0;\n      x12 = 0;\n      x2 = 0;\n    } else {\n      len2 = 1 / len2;\n      x02 *= len2;\n      x12 *= len2;\n      x2 *= len2;\n    }\n    y02 = z1 * x2 - z2 * x12;\n    y12 = z2 * x02 - z02 * x2;\n    y2 = z02 * x12 - z1 * x02;\n    len2 = Math.sqrt(y02 * y02 + y12 * y12 + y2 * y2);\n    if (!len2) {\n      y02 = 0;\n      y12 = 0;\n      y2 = 0;\n    } else {\n      len2 = 1 / len2;\n      y02 *= len2;\n      y12 *= len2;\n      y2 *= len2;\n    }\n    out[0] = x02;\n    out[1] = y02;\n    out[2] = z02;\n    out[3] = 0;\n    out[4] = x12;\n    out[5] = y12;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x02 * eyex + x12 * eyey + x2 * eyez);\n    out[13] = -(y02 * eyex + y12 * eyey + y2 * eyez);\n    out[14] = -(z02 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n    return out;\n  }\n  var mul = multiply$2;\n  function create$3() {\n    var out = new ARRAY_TYPE(3);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    return out;\n  }\n  function clone$3(a2) {\n    var out = new ARRAY_TYPE(3);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    return out;\n  }\n  function length(a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z = a2[2];\n    return Math.sqrt(x2 * x2 + y2 * y2 + z * z);\n  }\n  function fromValues$3(x2, y2, z) {\n    var out = new ARRAY_TYPE(3);\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z;\n    return out;\n  }\n  function copy$3(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    return out;\n  }\n  function set$3(out, x2, y2, z) {\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z;\n    return out;\n  }\n  function add(out, a2, b2) {\n    out[0] = a2[0] + b2[0];\n    out[1] = a2[1] + b2[1];\n    out[2] = a2[2] + b2[2];\n    return out;\n  }\n  function subtract(out, a2, b2) {\n    out[0] = a2[0] - b2[0];\n    out[1] = a2[1] - b2[1];\n    out[2] = a2[2] - b2[2];\n    return out;\n  }\n  function multiply$1(out, a2, b2) {\n    out[0] = a2[0] * b2[0];\n    out[1] = a2[1] * b2[1];\n    out[2] = a2[2] * b2[2];\n    return out;\n  }\n  function min(out, a2, b2) {\n    out[0] = Math.min(a2[0], b2[0]);\n    out[1] = Math.min(a2[1], b2[1]);\n    out[2] = Math.min(a2[2], b2[2]);\n    return out;\n  }\n  function max(out, a2, b2) {\n    out[0] = Math.max(a2[0], b2[0]);\n    out[1] = Math.max(a2[1], b2[1]);\n    out[2] = Math.max(a2[2], b2[2]);\n    return out;\n  }\n  function scale(out, a2, b2) {\n    out[0] = a2[0] * b2;\n    out[1] = a2[1] * b2;\n    out[2] = a2[2] * b2;\n    return out;\n  }\n  function scaleAndAdd(out, a2, b2, scale2) {\n    out[0] = a2[0] + b2[0] * scale2;\n    out[1] = a2[1] + b2[1] * scale2;\n    out[2] = a2[2] + b2[2] * scale2;\n    return out;\n  }\n  function distance(a2, b2) {\n    var x2 = b2[0] - a2[0];\n    var y2 = b2[1] - a2[1];\n    var z = b2[2] - a2[2];\n    return Math.sqrt(x2 * x2 + y2 * y2 + z * z);\n  }\n  function squaredDistance(a2, b2) {\n    var x2 = b2[0] - a2[0];\n    var y2 = b2[1] - a2[1];\n    var z = b2[2] - a2[2];\n    return x2 * x2 + y2 * y2 + z * z;\n  }\n  function squaredLength(a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z = a2[2];\n    return x2 * x2 + y2 * y2 + z * z;\n  }\n  function negate(out, a2) {\n    out[0] = -a2[0];\n    out[1] = -a2[1];\n    out[2] = -a2[2];\n    return out;\n  }\n  function normalize$2(out, a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z = a2[2];\n    var len2 = x2 * x2 + y2 * y2 + z * z;\n    if (len2 > 0) {\n      len2 = 1 / Math.sqrt(len2);\n    }\n    out[0] = a2[0] * len2;\n    out[1] = a2[1] * len2;\n    out[2] = a2[2] * len2;\n    return out;\n  }\n  function dot$1(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2];\n  }\n  function cross(out, a2, b2) {\n    var ax = a2[0], ay = a2[1], az = a2[2];\n    var bx = b2[0], by = b2[1], bz = b2[2];\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n  }\n  function lerp(out, a2, b2, t) {\n    var ax = a2[0];\n    var ay = a2[1];\n    var az = a2[2];\n    out[0] = ax + t * (b2[0] - ax);\n    out[1] = ay + t * (b2[1] - ay);\n    out[2] = az + t * (b2[2] - az);\n    return out;\n  }\n  function transformMat4$2(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z = a2[2];\n    var w2 = m2[3] * x2 + m2[7] * y2 + m2[11] * z + m2[15];\n    w2 = w2 || 1;\n    out[0] = (m2[0] * x2 + m2[4] * y2 + m2[8] * z + m2[12]) / w2;\n    out[1] = (m2[1] * x2 + m2[5] * y2 + m2[9] * z + m2[13]) / w2;\n    out[2] = (m2[2] * x2 + m2[6] * y2 + m2[10] * z + m2[14]) / w2;\n    return out;\n  }\n  function transformMat3(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z = a2[2];\n    out[0] = x2 * m2[0] + y2 * m2[3] + z * m2[6];\n    out[1] = x2 * m2[1] + y2 * m2[4] + z * m2[7];\n    out[2] = x2 * m2[2] + y2 * m2[5] + z * m2[8];\n    return out;\n  }\n  function transformQuat(out, a2, q) {\n    var qx = q[0], qy = q[1], qz = q[2], qw = q[3];\n    var vx = a2[0], vy = a2[1], vz = a2[2];\n    var tx2 = qy * vz - qz * vy;\n    var ty2 = qz * vx - qx * vz;\n    var tz = qx * vy - qy * vx;\n    tx2 = tx2 + tx2;\n    ty2 = ty2 + ty2;\n    tz = tz + tz;\n    out[0] = vx + qw * tx2 + qy * tz - qz * ty2;\n    out[1] = vy + qw * ty2 + qz * tx2 - qx * tz;\n    out[2] = vz + qw * tz + qx * ty2 - qy * tx2;\n    return out;\n  }\n  function exactEquals$1(a2, b2) {\n    return a2[0] === b2[0] && a2[1] === b2[1] && a2[2] === b2[2];\n  }\n  function equals$2(a2, b2) {\n    var a0 = a2[0], a1 = a2[1], a22 = a2[2];\n    var b0 = b2[0], b1 = b2[1], b22 = b2[2];\n    return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) && Math.abs(a22 - b22) <= EPSILON * Math.max(1, Math.abs(a22), Math.abs(b22));\n  }\n  var len = length;\n  (function() {\n    var vec2 = create$3();\n    return function(a2, stride, offset2, count2, fn, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 3;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        vec2[2] = a2[i + 2];\n        fn(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n        a2[i + 2] = vec2[2];\n      }\n      return a2;\n    };\n  })();\n  function create$2() {\n    var out = new ARRAY_TYPE(4);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n    }\n    return out;\n  }\n  function clone$2(a2) {\n    var out = new ARRAY_TYPE(4);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function fromValues$2(x2, y2, z, w2) {\n    var out = new ARRAY_TYPE(4);\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z;\n    out[3] = w2;\n    return out;\n  }\n  function copy$2(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    out[2] = a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function set$2(out, x2, y2, z, w2) {\n    out[0] = x2;\n    out[1] = y2;\n    out[2] = z;\n    out[3] = w2;\n    return out;\n  }\n  function normalize$1(out, a2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    var z = a2[2];\n    var w2 = a2[3];\n    var len2 = x2 * x2 + y2 * y2 + z * z + w2 * w2;\n    if (len2 > 0) {\n      len2 = 1 / Math.sqrt(len2);\n    }\n    out[0] = x2 * len2;\n    out[1] = y2 * len2;\n    out[2] = z * len2;\n    out[3] = w2 * len2;\n    return out;\n  }\n  function dot(a2, b2) {\n    return a2[0] * b2[0] + a2[1] * b2[1] + a2[2] * b2[2] + a2[3] * b2[3];\n  }\n  function transformMat4$1(out, a2, m2) {\n    var x2 = a2[0], y2 = a2[1], z = a2[2], w2 = a2[3];\n    out[0] = m2[0] * x2 + m2[4] * y2 + m2[8] * z + m2[12] * w2;\n    out[1] = m2[1] * x2 + m2[5] * y2 + m2[9] * z + m2[13] * w2;\n    out[2] = m2[2] * x2 + m2[6] * y2 + m2[10] * z + m2[14] * w2;\n    out[3] = m2[3] * x2 + m2[7] * y2 + m2[11] * z + m2[15] * w2;\n    return out;\n  }\n  function exactEquals(a2, b2) {\n    return a2[0] === b2[0] && a2[1] === b2[1] && a2[2] === b2[2] && a2[3] === b2[3];\n  }\n  (function() {\n    var vec2 = create$2();\n    return function(a2, stride, offset2, count2, fn, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 4;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        vec2[2] = a2[i + 2];\n        vec2[3] = a2[i + 3];\n        fn(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n        a2[i + 2] = vec2[2];\n        a2[i + 3] = vec2[3];\n      }\n      return a2;\n    };\n  })();\n  function create$1() {\n    var out = new ARRAY_TYPE(4);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n      out[2] = 0;\n    }\n    out[3] = 1;\n    return out;\n  }\n  function setAxisAngle(out, axis, rad) {\n    rad = rad * 0.5;\n    var s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n  }\n  function multiply(out, a2, b2) {\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = b2[0], by = b2[1], bz = b2[2], bw = b2[3];\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n  }\n  function rotateX(out, a2, rad) {\n    rad *= 0.5;\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n  }\n  function rotateY(out, a2, rad) {\n    rad *= 0.5;\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var by = Math.sin(rad), bw = Math.cos(rad);\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n  }\n  function slerp(out, a2, b2, t) {\n    var ax = a2[0], ay = a2[1], az = a2[2], aw = a2[3];\n    var bx = b2[0], by = b2[1], bz = b2[2], bw = b2[3];\n    var omega, cosom, sinom, scale0, scale1;\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    if (cosom < 0) {\n      cosom = -cosom;\n      bx = -bx;\n      by = -by;\n      bz = -bz;\n      bw = -bw;\n    }\n    if (1 - cosom > EPSILON) {\n      omega = Math.acos(cosom);\n      sinom = Math.sin(omega);\n      scale0 = Math.sin((1 - t) * omega) / sinom;\n      scale1 = Math.sin(t * omega) / sinom;\n    } else {\n      scale0 = 1 - t;\n      scale1 = t;\n    }\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    return out;\n  }\n  function conjugate(out, a2) {\n    out[0] = -a2[0];\n    out[1] = -a2[1];\n    out[2] = -a2[2];\n    out[3] = a2[3];\n    return out;\n  }\n  function fromMat3(out, m2) {\n    var fTrace = m2[0] + m2[4] + m2[8];\n    var fRoot;\n    if (fTrace > 0) {\n      fRoot = Math.sqrt(fTrace + 1);\n      out[3] = 0.5 * fRoot;\n      fRoot = 0.5 / fRoot;\n      out[0] = (m2[5] - m2[7]) * fRoot;\n      out[1] = (m2[6] - m2[2]) * fRoot;\n      out[2] = (m2[1] - m2[3]) * fRoot;\n    } else {\n      var i = 0;\n      if (m2[4] > m2[0]) i = 1;\n      if (m2[8] > m2[i * 3 + i]) i = 2;\n      var j = (i + 1) % 3;\n      var k = (i + 2) % 3;\n      fRoot = Math.sqrt(m2[i * 3 + i] - m2[j * 3 + j] - m2[k * 3 + k] + 1);\n      out[i] = 0.5 * fRoot;\n      fRoot = 0.5 / fRoot;\n      out[3] = (m2[j * 3 + k] - m2[k * 3 + j]) * fRoot;\n      out[j] = (m2[j * 3 + i] + m2[i * 3 + j]) * fRoot;\n      out[k] = (m2[k * 3 + i] + m2[i * 3 + k]) * fRoot;\n    }\n    return out;\n  }\n  var clone$1 = clone$2;\n  var fromValues$1 = fromValues$2;\n  var copy$1 = copy$2;\n  var set$1 = set$2;\n  var normalize = normalize$1;\n  function equals$1(a2, b2) {\n    return Math.abs(dot(a2, b2)) >= 1 - EPSILON;\n  }\n  var rotationTo = (function() {\n    var tmpvec3 = create$3();\n    var xUnitVec3 = fromValues$3(1, 0, 0);\n    var yUnitVec3 = fromValues$3(0, 1, 0);\n    return function(out, a2, b2) {\n      var dot2 = dot$1(a2, b2);\n      if (dot2 < -0.999999) {\n        cross(tmpvec3, xUnitVec3, a2);\n        if (len(tmpvec3) < 1e-6) cross(tmpvec3, yUnitVec3, a2);\n        normalize$2(tmpvec3, tmpvec3);\n        setAxisAngle(out, tmpvec3, Math.PI);\n        return out;\n      } else if (dot2 > 0.999999) {\n        out[0] = 0;\n        out[1] = 0;\n        out[2] = 0;\n        out[3] = 1;\n        return out;\n      } else {\n        cross(tmpvec3, a2, b2);\n        out[0] = tmpvec3[0];\n        out[1] = tmpvec3[1];\n        out[2] = tmpvec3[2];\n        out[3] = 1 + dot2;\n        return normalize(out, out);\n      }\n    };\n  })();\n  (function() {\n    var temp1 = create$1();\n    var temp2 = create$1();\n    return function(out, a2, b2, c2, d, t) {\n      slerp(temp1, a2, d, t);\n      slerp(temp2, b2, c2, t);\n      slerp(out, temp1, temp2, 2 * t * (1 - t));\n      return out;\n    };\n  })();\n  (function() {\n    var matr = create$5();\n    return function(out, view, right, up) {\n      matr[0] = right[0];\n      matr[3] = right[1];\n      matr[6] = right[2];\n      matr[1] = up[0];\n      matr[4] = up[1];\n      matr[7] = up[2];\n      matr[2] = -view[0];\n      matr[5] = -view[1];\n      matr[8] = -view[2];\n      return normalize(out, fromMat3(out, matr));\n    };\n  })();\n  function create() {\n    var out = new ARRAY_TYPE(2);\n    if (ARRAY_TYPE != Float32Array) {\n      out[0] = 0;\n      out[1] = 0;\n    }\n    return out;\n  }\n  function clone(a2) {\n    var out = new ARRAY_TYPE(2);\n    out[0] = a2[0];\n    out[1] = a2[1];\n    return out;\n  }\n  function fromValues(x2, y2) {\n    var out = new ARRAY_TYPE(2);\n    out[0] = x2;\n    out[1] = y2;\n    return out;\n  }\n  function copy(out, a2) {\n    out[0] = a2[0];\n    out[1] = a2[1];\n    return out;\n  }\n  function set(out, x2, y2) {\n    out[0] = x2;\n    out[1] = y2;\n    return out;\n  }\n  function transformMat4(out, a2, m2) {\n    var x2 = a2[0];\n    var y2 = a2[1];\n    out[0] = m2[0] * x2 + m2[4] * y2 + m2[12];\n    out[1] = m2[1] * x2 + m2[5] * y2 + m2[13];\n    return out;\n  }\n  function equals(a2, b2) {\n    var a0 = a2[0], a1 = a2[1];\n    var b0 = b2[0], b1 = b2[1];\n    return Math.abs(a0 - b0) <= EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1));\n  }\n  (function() {\n    var vec2 = create();\n    return function(a2, stride, offset2, count2, fn, arg) {\n      var i, l;\n      if (!stride) {\n        stride = 2;\n      }\n      if (!offset2) {\n        offset2 = 0;\n      }\n      if (count2) {\n        l = Math.min(count2 * stride + offset2, a2.length);\n      } else {\n        l = a2.length;\n      }\n      for (i = offset2; i < l; i += stride) {\n        vec2[0] = a2[i];\n        vec2[1] = a2[i + 1];\n        fn(vec2, vec2, arg);\n        a2[i] = vec2[0];\n        a2[i + 1] = vec2[1];\n      }\n      return a2;\n    };\n  })();\n  class Constants {\n  }\n  Constants.TWO_PI = 6.283185307179586;\n  Constants.PI = 3.141592653589793;\n  Constants.PI_OVER_TWO = 1.5707963267948966;\n  Constants.PI_OVER_THREE = 1.0471975511965976;\n  Constants.PI_OVER_FOUR = 0.7853981633974483;\n  Constants.PI_OVER_SIX = 0.5235987755982988;\n  Constants.LOG_2 = 0.6931471805599453;\n  Constants.RADIANS_PER_DEGREE = 0.017453292519943295;\n  Constants.DEGREES_PER_RADIAN = 57.29577951308232;\n  Constants.ROOT_TWO = 1.4142135623730951;\n  Constants.ROOT_TWO_OVER_TWO = 0.7071067811865476;\n  Constants.ROOT_THREE = 1.7320508075688772;\n  Constants.ROOT_THREE_OVER_TWO = 0.8660254037844386;\n  Constants.ROOT_THREE_OVER_THREE = 0.5773502691896257;\n  Constants.VECTOR2_ZERO = fromValues(0, 0);\n  Constants.VECTOR2_ONE = fromValues(1, 1);\n  Constants.VECTOR2_UNITX = fromValues(1, 0);\n  Constants.VECTOR2_UNITY = fromValues(0, 1);\n  Constants.VECTOR3_ZERO = fromValues$3(0, 0, 0);\n  Constants.VECTOR3_ONE = fromValues$3(1, 1, 1);\n  Constants.VECTOR3_UNITX = fromValues$3(1, 0, 0);\n  Constants.VECTOR3_UNITY = fromValues$3(0, 1, 0);\n  Constants.VECTOR3_UNITZ = fromValues$3(0, 0, 1);\n  Constants.VECTOR3_REFLECTX = fromValues$3(1, -1, -1);\n  Constants.VECTOR3_REFLECTY = fromValues$3(-1, 1, -1);\n  Constants.VECTOR3_REFLECTZ = fromValues$3(-1, -1, 1);\n  Constants.VECTOR4_ZERO = fromValues$2(0, 0, 0, 0);\n  Constants.VECTOR4_ONE = fromValues$2(1, 1, 1, 1);\n  Constants.VECTOR4_UNITX = fromValues$2(1, 0, 0, 0);\n  Constants.VECTOR4_UNITY = fromValues$2(0, 1, 0, 0);\n  Constants.VECTOR4_UNITZ = fromValues$2(0, 0, 1, 0);\n  Constants.VECTOR4_UNITW = fromValues$2(0, 0, 0, 1);\n  Constants.MAT3_IDENTITY = create$5();\n  Constants.MAT4_IDENTITY = create$4();\n  Constants.MAT4_ROTATION_MINUS_90 = fromValues$4(0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  Constants.QUAT_IDENTITY = create$1();\n  Constants.QUAT_ROTATEX_PLUS_90 = fromValues$1(Constants.ROOT_TWO_OVER_TWO, 0, 0, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEX_MINUS_90 = fromValues$1(-Constants.ROOT_TWO_OVER_TWO, 0, 0, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEY_PLUS_90 = fromValues$1(0, Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEY_MINUS_90 = fromValues$1(0, -Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEZ_PLUS_90 = fromValues$1(0, 0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO);\n  Constants.QUAT_ROTATEZ_MINUS_90 = fromValues$1(0, 0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO);\n  Constants.MILLISECONDS_PER_DAY = 864e5;\n  class MathHelper {\n    static simpleLinearRegression(points2) {\n      const n = points2.length;\n      let sumX = 0;\n      let sumY = 0;\n      let sumXY = 0;\n      let sumXX = 0;\n      for (let i = 0; i < n; i++) {\n        sumX += points2[i].x;\n        sumY += points2[i].y;\n        sumXY += points2[i].x * points2[i].y;\n        sumXX += points2[i].x * points2[i].x;\n      }\n      const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\n      const yIntercept = (sumY - slope * sumX) / n;\n      return { slope, yIntercept };\n    }\n    static clamp(value2, min2, max2) {\n      return Math.max(Math.min(value2, max2), min2);\n    }\n    static lerp(value1, value2, amount) {\n      return value1 + (value2 - value1) * amount;\n    }\n    static normalize(value2, min2, max2, from = 0, to = 1) {\n      return max2 - min2 == 0 ? 0 : Math.max(Math.min((to - from) * (value2 - min2) / (max2 - min2) + from, to), from);\n    }\n    static splitExponent(value2, result) {\n      let exponent2 = Math.round(Math.log10(Math.abs(value2)));\n      let coefficient = value2 / Math.pow(10, exponent2);\n      if (coefficient < 1) {\n        coefficient *= 10;\n        exponent2--;\n      }\n      result[0] = coefficient;\n      result[1] = exponent2;\n    }\n    static combineExponent(mantissa, exponent2) {\n      return mantissa * Math.pow(10, exponent2);\n    }\n    static isPowerOf2(value2) {\n      return (value2 & value2 - 1) == 0;\n    }\n  }\n  class PseudoRandom {\n    constructor(seed) {\n      this._seed = seed % 2147483647;\n      if (this._seed <= 0)\n        this._seed += 2147483646;\n    }\n    next() {\n      return this._seed = this._seed * 16807 % 2147483647;\n    }\n    nextFloat() {\n      return (this.next() - 1) / 2147483646;\n    }\n    nextInteger(min2, max2) {\n      return Math.floor(this.nextFloat() * (max2 - min2 + 1) + min2);\n    }\n  }\n  class AngleHelper {\n    static degreesToRadians(degrees2) {\n      return degrees2 * Constants.RADIANS_PER_DEGREE;\n    }\n    static radiansToDegrees(radians2) {\n      return radians2 * Constants.DEGREES_PER_RADIAN;\n    }\n    static wrapAngle(angle2) {\n      if (angle2 > Constants.PI)\n        angle2 = angle2 - Constants.TWO_PI;\n      else if (angle2 < -Constants.PI)\n        angle2 += Constants.TWO_PI;\n      return angle2;\n    }\n    static sphericalToCartesian(altitude, longitude2, latitude, result) {\n      latitude = AngleHelper.degreesToRadians(latitude);\n      longitude2 = AngleHelper.degreesToRadians(longitude2);\n      const scale2 = Math.cos(latitude);\n      result[0] = altitude * scale2 * Math.sin(longitude2);\n      result[1] = altitude * Math.sin(latitude);\n      result[2] = altitude * scale2 * Math.cos(longitude2);\n    }\n    static cartesianToSpherical(x2, y2, z, result) {\n      result[0] = Math.atan2(x2, z);\n      result[1] = Math.asin(y2);\n    }\n    static angleBetweenVectors(from, to) {\n      if (exactEquals$1(from, to)) {\n        return 0;\n      } else {\n        const dot2 = MathHelper.clamp(dot$1(from, to), -1, 1);\n        return Math.acos(dot2);\n      }\n    }\n    static signedAngleBetweenVectors(from, to, up) {\n      if (exactEquals$1(from, to)) {\n        return 0;\n      } else {\n        const dot2 = MathHelper.clamp(dot$1(from, to), -1, 1);\n        let angle2 = Math.acos(dot2);\n        cross(AngleHelper._vec3, from, to);\n        if (dot$1(AngleHelper._vec3, up) < 0) {\n          angle2 = -angle2;\n        }\n        return angle2;\n      }\n    }\n  }\n  AngleHelper._vec3 = create$3();\n  class CameraBase {\n    getView(view) {\n      this.getPosition(view.position);\n    }\n    setView(view, isSmooth) {\n      this.setPosition(view.position, isSmooth);\n    }\n    lerpView(from, to, time2) {\n      lerp(this._vec3, from.position, to.position, time2);\n      this.setPosition(this._vec3, false);\n    }\n    get vMatrices() {\n      return this._vMatrices;\n    }\n    get inverseVMatrices() {\n      return this._inverseVMatrices;\n    }\n    get mvMatrices() {\n      return this._mvMatrices;\n    }\n    get pMatrices() {\n      return this._pMatrices;\n    }\n    get inversePMatrices() {\n      return this._inversePMatrices;\n    }\n    get pickVMatrix() {\n      return this._pickVMatrix;\n    }\n    get rMatrix() {\n      return this._mat3;\n    }\n    getOrbit(value2) {\n      copy$1(value2, this._orbitRotation);\n    }\n    setOrbit(value2, isSmooth) {\n      copy$1(this._orbitRotation, value2);\n      if (!isSmooth) {\n        copy$1(this._smoothedOrbitRotation, value2);\n      }\n    }\n    getPosition(value2) {\n      copy$3(value2, this._cameraPosition);\n    }\n    setPosition(value2, isSmooth) {\n      copy$3(this._cameraPosition, value2);\n      if (!isSmooth) {\n        copy$3(this._smoothedCameraPosition, value2);\n      }\n    }\n    constructor(core) {\n      this._core = core;\n      this._vec3 = create$3();\n      this._quat = create$1();\n      this._mat3 = create$5();\n      this._right = create$3();\n      this._up = create$3();\n      this._forward = create$3();\n      this._modelManipulationOrigin = create$3();\n      this.modelPosition = create$3();\n      this.modelScale = create$3();\n      this.modelRotation = create$1();\n      this._orbitRotation = create$1();\n      this._orbitDirection = create$1();\n      this._smoothedOrbitRotation = create$1();\n      this._smoothedCameraPosition = create$3();\n      this._smoothedCameraRotation = create$1();\n      this._cameraPosition = create$3();\n      this._cameraRotation = create$1();\n      this._combinedPosition = create$3();\n      this._combinedRotation = create$1();\n      this._leftToRightEye = create$3();\n      this._pickVMatrix = create$4();\n      this._eyePositions = [create$3(), create$3()];\n      this._vMatrices = [create$4(), create$4()];\n      this._mvMatrices = [create$4(), create$4()];\n      this._pMatrices = [create$4(), create$4()];\n      this._inverseVMatrices = [create$4(), create$4()];\n      this._inversePMatrices = [create$4(), create$4()];\n    }\n    reset(isSmooth) {\n      copy$3(this._cameraPosition, Constants.VECTOR3_ZERO);\n      copy$1(this._cameraRotation, Constants.QUAT_IDENTITY);\n      copy$1(this._orbitRotation, Constants.QUAT_IDENTITY);\n      if (!isSmooth) {\n        this.syncSmooth();\n      }\n    }\n    update(elapsedTime) {\n      let amount = Math.min(elapsedTime * this._core.config.positionSmoothing, 1);\n      lerp(this._smoothedCameraPosition, this._smoothedCameraPosition, this._cameraPosition, amount);\n      amount = Math.min(elapsedTime * this._core.config.rotationSmoothing, 1);\n      slerp(this._smoothedCameraRotation, this._smoothedCameraRotation, this._cameraRotation, amount);\n      slerp(this._smoothedOrbitRotation, this._smoothedOrbitRotation, this._orbitRotation, amount);\n      const epsilon3 = 1e-6;\n      let x2;\n      let y2;\n      let z;\n      let w2;\n      x2 = this._smoothedCameraPosition[0] - this._cameraPosition[0];\n      y2 = this._smoothedCameraPosition[1] - this._cameraPosition[1];\n      z = this._smoothedCameraPosition[2] - this._cameraPosition[2];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z) < epsilon3) {\n        copy$3(this._smoothedCameraPosition, this._cameraPosition);\n      }\n      x2 = this._smoothedCameraRotation[0] - this._cameraRotation[0];\n      y2 = this._smoothedCameraRotation[1] - this._cameraRotation[1];\n      z = this._smoothedCameraRotation[2] - this._cameraRotation[2];\n      w2 = this._smoothedCameraRotation[3] - this._cameraRotation[3];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z) < epsilon3 && Math.abs(w2) < epsilon3) {\n        copy$1(this._smoothedCameraRotation, this._cameraRotation);\n      }\n      x2 = this._smoothedOrbitRotation[0] - this._orbitRotation[0];\n      y2 = this._smoothedOrbitRotation[1] - this._orbitRotation[1];\n      z = this._smoothedOrbitRotation[2] - this._orbitRotation[2];\n      w2 = this._smoothedOrbitRotation[3] - this._orbitRotation[3];\n      if (Math.abs(x2) < epsilon3 && Math.abs(y2) < epsilon3 && Math.abs(z) < epsilon3 && Math.abs(w2) < epsilon3) {\n        copy$1(this._smoothedOrbitRotation, this._orbitRotation);\n      }\n      normalize(this._smoothedCameraRotation, this._smoothedCameraRotation);\n      normalize(this._smoothedOrbitRotation, this._smoothedOrbitRotation);\n      conjugate(this._orbitDirection, this._smoothedOrbitRotation);\n      transformMat4$2(this._modelManipulationOrigin, this.modelManipulationOrigin, this.modelMMatrix);\n      subtract(this._vec3, this._smoothedCameraPosition, this._modelManipulationOrigin);\n      transformQuat(this._combinedPosition, this._vec3, this._orbitDirection);\n      add(this._combinedPosition, this._combinedPosition, this._modelManipulationOrigin);\n      multiply(this._combinedRotation, this._orbitDirection, this._smoothedCameraRotation);\n      fromQuat$1(this._mat3, this._combinedRotation);\n      this._right[0] = this._mat3[0];\n      this._right[1] = this._mat3[1];\n      this._right[2] = this._mat3[2];\n      this._up[0] = this._mat3[3];\n      this._up[1] = this._mat3[4];\n      this._up[2] = this._mat3[5];\n      this._forward[0] = this._mat3[6];\n      this._forward[1] = this._mat3[7];\n      this._forward[2] = this._mat3[8];\n      const view = this._vMatrices[0];\n      view[0] = this._right[0];\n      view[1] = this._up[0];\n      view[2] = this._forward[0];\n      view[4] = this._right[1];\n      view[5] = this._up[1];\n      view[6] = this._forward[1];\n      view[8] = this._right[2];\n      view[9] = this._up[2];\n      view[10] = this._forward[2];\n      view[12] = -dot$1(this._right, this._combinedPosition);\n      view[13] = -dot$1(this._up, this._combinedPosition);\n      view[14] = -dot$1(this._forward, this._combinedPosition);\n      const aspectRatio = this.width / this.height;\n      if (this._core.config.stereoMode == StereoMode.none) {\n        if (this._core.config.tilesX != 1 || this._core.config.tilesY != 1) {\n          const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n          const bottom = -top;\n          const left = -aspectRatio * top;\n          const right = aspectRatio * top;\n          const width2 = right - left;\n          const height2 = top - bottom;\n          const tileWidth = width2 / this._core.config.tilesX;\n          const tileHeight = height2 / this._core.config.tilesY;\n          frustum(this._pMatrices[0], left + this._core.config.tileOffsetX * tileWidth, left + (this._core.config.tileOffsetX + 1) * tileWidth, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY - 1) * tileHeight, bottom + (this._core.config.tilesY - this._core.config.tileOffsetY) * tileHeight, this._core.config.nearPlane, this._core.config.farPlane);\n        } else {\n          perspective(this.pMatrices[0], this._core.config.fov, aspectRatio, this._core.config.nearPlane, this._core.config.farPlane);\n        }\n        multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n        invert(this._inverseVMatrices[0], this.vMatrices[0]);\n        invert(this._inversePMatrices[0], this.pMatrices[0]);\n      } else {\n        cross(this._leftToRightEye, this._forward, this._up);\n        normalize$2(this._leftToRightEye, this._leftToRightEye);\n        scaleAndAdd(this._eyePositions[0], this._combinedPosition, this._leftToRightEye, -this._core.config.ipd);\n        scaleAndAdd(this._eyePositions[1], this._combinedPosition, this._leftToRightEye, this._core.config.ipd);\n        this._vMatrices[0][12] += this._core.config.ipd * 0.5;\n        copy$4(this._vMatrices[1], this._vMatrices[0]);\n        this._vMatrices[1][12] -= this._core.config.ipd;\n        const frustumShift = this._core.config.ipd * 0.5 * this._core.config.nearPlane / this._core.config.screenDistance;\n        const top = Math.tan(this._core.config.fov * 0.5) * this._core.config.nearPlane;\n        const bottom = -top;\n        let left = -aspectRatio * top + frustumShift;\n        let right = aspectRatio * top + frustumShift;\n        frustum(this._pMatrices[0], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n        left = -aspectRatio * top - frustumShift;\n        right = aspectRatio * top - frustumShift;\n        frustum(this._pMatrices[1], left, right, bottom, top, this._core.config.nearPlane, this._core.config.farPlane);\n        multiply$2(this._mvMatrices[0], this._vMatrices[0], this.modelMMatrix);\n        multiply$2(this._mvMatrices[1], this._vMatrices[1], this.modelMMatrix);\n        invert(this._inverseVMatrices[0], this._vMatrices[0]);\n        invert(this._inversePMatrices[0], this._pMatrices[0]);\n        copy$4(this._inverseVMatrices[1], this._inverseVMatrices[0]);\n        this._inverseVMatrices[1][12] += this._core.config.ipd;\n        invert(this._inversePMatrices[1], this._pMatrices[1]);\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`cam off ${this._cameraPosition[0] < 0 ? \"\" : \" \"}${this._cameraPosition[0].toFixed(3)},${this._cameraPosition[1] < 0 ? \"\" : \" \"}${this._cameraPosition[1].toFixed(3)},${this._cameraPosition[2] < 0 ? \"\" : \" \"}${this._cameraPosition[2].toFixed(3)}`);\n        this._core.debugText.addLine(`cam pos ${this._combinedPosition[0] < 0 ? \"\" : \" \"}${this._combinedPosition[0].toFixed(3)},${this._combinedPosition[1] < 0 ? \"\" : \" \"}${this._combinedPosition[1].toFixed(3)},${this._combinedPosition[2] < 0 ? \"\" : \" \"}${this._combinedPosition[2].toFixed(3)}`);\n        this._core.debugText.addLine(`cam rot ${this._combinedRotation[0] < 0 ? \"\" : \" \"}${this._combinedRotation[0].toFixed(3)},${this._combinedRotation[1] < 0 ? \"\" : \" \"}${this._combinedRotation[1].toFixed(3)},${this._combinedRotation[2] < 0 ? \"\" : \" \"}${this._combinedRotation[2].toFixed(3)},${this._combinedRotation[3] < 0 ? \"\" : \" \"}${this._combinedRotation[3].toFixed(3)}`);\n      }\n    }\n    _zoom(direction, distance2) {\n      scaleAndAdd(this._cameraPosition, this._cameraPosition, direction, distance2);\n    }\n    rotate(translationDelta) {\n    }\n    zoom(zoomDelta, x2, y2) {\n      this.unproject(this._vec3, x2, y2, 1);\n      normalize$2(this._vec3, this._vec3);\n      const distance$1 = zoomDelta * distance(this._combinedPosition, this.modelPosition);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      this._zoom(this._vec3, distance$1);\n    }\n    _twist(axis, angle2) {\n    }\n    twist(angle2, x2, y2) {\n    }\n    updatePickVMatrix(x2, y2) {\n      this.unproject(this._vec3, x2, y2, 1);\n      lookAt(this._pickVMatrix, this._combinedPosition, this._vec3, this._up);\n    }\n    syncSmooth() {\n      copy$3(this._smoothedCameraPosition, this._cameraPosition);\n      copy$1(this._smoothedCameraRotation, this._cameraRotation);\n      copy$1(this._smoothedOrbitRotation, this._orbitRotation);\n    }\n    updateModelManipulationOrigin(from, to) {\n      const a2 = create$3();\n      const b2 = create$3();\n      const c2 = create$3();\n      const d = create$3();\n      transformMat4$2(a2, from, this.modelMMatrix);\n      transformMat4$2(b2, to, this.modelMMatrix);\n      subtract(a2, this._cameraPosition, a2);\n      subtract(b2, this._cameraPosition, b2);\n      transformQuat(c2, a2, this._orbitDirection);\n      transformQuat(d, b2, this._orbitDirection);\n      subtract(c2, c2, a2);\n      subtract(d, d, b2);\n      subtract(this._vec3, c2, d);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      add(this._cameraPosition, this._cameraPosition, this._vec3);\n      add(this._smoothedCameraPosition, this._smoothedCameraPosition, this._vec3);\n    }\n    unproject(position2, x2, y2, z) {\n      set$3(position2, 2 * x2 / this.width - 1, 1 - 2 * y2 / this.height, z);\n      transformMat4$2(position2, position2, this._inversePMatrices[0]);\n      transformMat4$2(position2, position2, this._inverseVMatrices[0]);\n    }\n    translate(translationDelta) {\n      const distance$1 = distance(this.modelPosition, this._combinedPosition);\n      const height2 = 2 * Math.tan(this._core.config.fov / 2) * distance$1 / this.height;\n      set$3(this._vec3, height2 * translationDelta[0], -height2 * translationDelta[1], 0);\n      transformQuat(this._vec3, this._vec3, this._combinedRotation);\n      transformQuat(this._vec3, this._vec3, this._orbitRotation);\n      subtract(this._cameraPosition, this._cameraPosition, this._vec3);\n    }\n  }\n  class AltAzimuthCamera extends CameraBase {\n    getView(view) {\n      super.getView(view);\n      view.altitude = this.altitude;\n      view.azimuth = this.azimuth;\n      view.fov = this._core.config.fov;\n    }\n    setView(view, isSmooth) {\n      super.setView(view, isSmooth);\n      this.setAltAzimuth(view.altitude, view.azimuth, isSmooth);\n      this._core.config.fov = view.fov;\n    }\n    lerpView(from, to, time2) {\n      super.lerpView(from, to, time2);\n      this.setAltAzimuth(MathHelper.lerp(from.altitude, to.altitude, time2), MathHelper.lerp(from.azimuth, to.azimuth, time2), false);\n      this._core.config.fov = MathHelper.lerp(from.fov, to.fov, time2);\n    }\n    update(elapsedTime) {\n      super.update(elapsedTime);\n      if (this._core.config.isDebugVisible) {\n        const altitude = AngleHelper.radiansToDegrees(this.altitude);\n        const azimuth = AngleHelper.radiansToDegrees(this.azimuth);\n        this._core.debugText.addLine(`cam alt ${altitude < 0 ? \"\" : \" \"}${altitude.toFixed(1)}`);\n        this._core.debugText.addLine(`cam azi ${azimuth < 0 ? \"\" : \" \"}${azimuth.toFixed(1)}`);\n      }\n    }\n    get altitude() {\n      transformQuat(this._up, Constants.VECTOR3_UNITY, this._combinedRotation);\n      transformQuat(this._right, Constants.VECTOR3_UNITX, this._combinedRotation);\n      return -AngleHelper.signedAngleBetweenVectors(Constants.VECTOR3_UNITY, this._up, this._right);\n    }\n    get azimuth() {\n      transformQuat(this._up, Constants.VECTOR3_UNITY, this._combinedRotation);\n      transformQuat(this._right, Constants.VECTOR3_UNITX, this._combinedRotation);\n      return -AngleHelper.signedAngleBetweenVectors(Constants.VECTOR3_UNITX, this._right, this._up);\n    }\n    setAltAzimuth(altitude, azimuth, isSmooth) {\n      setAxisAngle(this._quat, Constants.VECTOR3_UNITX, altitude);\n      multiply(this._orbitRotation, this._quat, Constants.QUAT_IDENTITY);\n      setAxisAngle(this._quat, Constants.VECTOR3_UNITY, azimuth);\n      multiply(this._orbitRotation, this._orbitRotation, this._quat);\n      if (!isSmooth) {\n        this.syncSmooth();\n      }\n    }\n    rotate(translationDelta) {\n      const length2 = Math.min(this.width, this.height);\n      let angle2 = translationDelta[1] * Constants.PI / length2;\n      setAxisAngle(this._quat, Constants.VECTOR3_UNITX, angle2);\n      multiply(this._orbitRotation, this._quat, this._orbitRotation);\n      angle2 = translationDelta[0] * Constants.PI / length2;\n      setAxisAngle(this._quat, Constants.VECTOR3_UNITY, angle2);\n      multiply(this._orbitRotation, this._orbitRotation, this._quat);\n    }\n  }\n  let Config$2 = class Config {\n    constructor(core) {\n      this.reset();\n    }\n    reset() {\n      this.isDebugVisible = false;\n      this.logLevel = LogLevel.warn;\n      this.shaderPath = \"shaders\";\n      this.fontPath = \"fonts\";\n      this.modelDistance = 0.5;\n      this.modelSize = 0.25;\n      this.stereoMode = StereoMode.none;\n      this.ipd = 0.06;\n      this.screenDistance = 0.5;\n      this.fov = AngleHelper.degreesToRadians(30);\n      this.nearPlane = 0.01;\n      this.farPlane = 100;\n      this.pickWidth = 512;\n      this.pickHeight = 512;\n      this.pickHoldDelay = 1e3;\n      this.pickSelectDelay = 100;\n      this.resizeMinimumDelay = 250;\n      this.rotationSmoothing = 0.02;\n      this.positionSmoothing = 0.02;\n      this.focusSmoothing = 0.01;\n      this.scaleSmoothing = 0.02;\n      this.mouseWheelZoomScale = -2e-3;\n      this.mouseWheelRotationScale = -2e-3;\n      this.dragToleranceSquared = 100;\n      this.manipulatorMinRelativeDistanceSquared = 100;\n      this.isMultiTouchEnabled = true;\n      this.isMultiTouchZoomEnabled = true;\n      this.isMultiTouchTwistEnabled = true;\n      this.isMultiTouchRotateEnabled = true;\n      this.isMultiTouchTranslateEnabled = true;\n      this.multiTouchZoomScale = 1;\n      this.cameraMinDistance = 0.1;\n      this.cameraMaxDistance = 10;\n      this.xrControllerRayColor = fromValues$3(0.5, 0.5, 0.5);\n      this.xrControllerProfile = \"windows-mixed-reality\";\n      this.xrControllerHandedness = \"right\";\n      this.paletteColor = new Uint8Array([128, 128, 128, 0]);\n      this.textColor = create$3();\n      this.textHoverColor = create$3();\n      this.textBorderColor = create$3();\n      this.textBorderWidth = 24 / 255;\n      this.identityRotation = Constants.VECTOR3_UNITY;\n      this.axesTextLabelMaxGlyphs = 32;\n      this.axesTextColor = create$3();\n      this.axesTextBorderColor = create$3();\n      this.axesTextHoverColor = create$3();\n      this.axesTextLabelMajorSize = 0.03;\n      this.axesTextLabelMinorSize = 0.02;\n      this.axesTextTitleMaxGlyphs = 127;\n      this.axesTextTitleSize = 0.05;\n      this.axesTextHeadingMaxGlyphs = 128;\n      this.axesTextHeadingSize = 0.075;\n      this.axesTextTitleLineHeight = 1.5;\n      this.axesTextHeadingLineHeight = 1.5;\n      this.axesTextLabelLineHeight = 1.5;\n      this.axesGridMajorThickness = 2e-4;\n      this.axesGridMinorThickness = 1e-4;\n      this.axesGridZeroThickness = 2e-3;\n      this.axesGridPickDivisionHeight = 0.025;\n      this.axesGridBackgroundColor = create$3();\n      this.axesGridHighlightColor = create$3();\n      this.axesGridMinorColor = create$3();\n      this.axesGridMajorColor = create$3();\n      this.axesGridZeroColor = create$3();\n      this.axesGridDefaultDivisions = 10;\n      this.keyTitleMaxGlyphs = 64;\n      this.keyLabelMaxGlyphs = 64;\n      this.selectionColor = create$3();\n      this.hoverColor = create$3();\n      this.activeColor = create$3();\n      this.highlightMode = HighlightMode.color;\n      this.lassoThickness = 4;\n      this.lassoDashWidth = 2;\n      this.lassoColor = create$3();\n      this.minCubifiedTreeMapSlice = 0.01;\n      this.sdfBuffer = 192;\n      this.sdfBorder = 0;\n      this.forceDirectIsEnabled = false;\n      this.forceDirectAttraction = 1;\n      this.forceDirectRepulsion = 1;\n      this.forceDirectGravity = 1;\n      this.forceDirectInterval = 0.1;\n      this.forceDirectMaxDistance = 0.1;\n      this.forceDirectTheta = 1;\n      this.forceDirectIterationsPerLayout = 1;\n      this.forceDirectEdgeWeightPower = 1;\n      this.forceDirectLockX = false;\n      this.forceDirectLockY = false;\n      this.forceDirectLockZ = false;\n      this.transitionDuration = 400;\n      this.transitionStaggering = 100;\n      this.transitionView = true;\n      this.isTransitionPickingEnabled = false;\n      this.backgroundColor = create$2();\n      this.theme = Theme.light;\n      this.ambientColor = create$3();\n      this.renderMode = RenderMode.color;\n      this.tilesX = 1;\n      this.tilesY = 1;\n      this.tileOffsetX = 0;\n      this.tileOffsetY = 0;\n    }\n    get theme() {\n      return this._theme;\n    }\n    set theme(value2) {\n      if (this._theme != value2) {\n        this._theme = value2;\n        switch (value2) {\n          case Theme.dark:\n            set$2(this.backgroundColor, 0, 0, 0, 1);\n            set$3(this.textColor, 0.9, 0.9, 0.9);\n            set$3(this.textHoverColor, 1, 1, 1);\n            set$3(this.textBorderColor, 0, 0, 0);\n            set$3(this.axesTextColor, 0.9, 0.9, 0.9);\n            set$3(this.axesTextBorderColor, 0, 0, 0);\n            set$3(this.axesTextHoverColor, 1, 1, 1);\n            set$3(this.axesGridBackgroundColor, 0.02, 0.02, 0.02);\n            set$3(this.axesGridHighlightColor, 0.04, 0.04, 0.04);\n            set$3(this.axesGridMinorColor, 0.05, 0.05, 0.05);\n            set$3(this.axesGridMajorColor, 0.1, 0.1, 0.1);\n            set$3(this.axesGridZeroColor, 0.05, 0.1, 0.1);\n            set$3(this.selectionColor, 1, 1, 0);\n            set$3(this.hoverColor, 1, 0, 1);\n            set$3(this.activeColor, 0, 1, 1);\n            set$3(this.lassoColor, 0.9, 0.9, 0.9);\n            break;\n          case Theme.light:\n            set$2(this.backgroundColor, 1, 1, 1, 1);\n            set$3(this.textColor, 0, 0, 0);\n            set$3(this.textHoverColor, 0.1, 0.1, 0.1);\n            set$3(this.textBorderColor, 1, 1, 1);\n            set$3(this.axesTextColor, 0, 0, 0);\n            set$3(this.axesTextBorderColor, 1, 1, 1);\n            set$3(this.axesTextHoverColor, 0.1, 0.1, 0.1);\n            set$3(this.axesGridBackgroundColor, 1, 1, 1);\n            set$3(this.axesGridHighlightColor, 0.925, 0.925, 0.925);\n            set$3(this.axesGridMinorColor, 0.9, 0.9, 0.9);\n            set$3(this.axesGridMajorColor, 0.8, 0.8, 0.8);\n            set$3(this.axesGridZeroColor, 0.7, 0.9, 0.9);\n            set$3(this.selectionColor, 1, 1, 0);\n            set$3(this.hoverColor, 1, 0, 1);\n            set$3(this.activeColor, 0, 1, 1);\n            set$3(this.lassoColor, 0.1, 0.1, 0.1);\n            break;\n        }\n        if (this.themeChangedCallback) {\n          this.themeChangedCallback(this._theme);\n        }\n      }\n    }\n  };\n  class DebugText {\n    get text() {\n      return this._text;\n    }\n    constructor() {\n      this.clear();\n    }\n    clear() {\n      this._text = \"\";\n    }\n    addLine(value2) {\n      this._text += value2 + \"\\n\";\n    }\n  }\n  class Fps {\n    get frameCounter() {\n      return this._frameCounter;\n    }\n    get totalFrames() {\n      return this._totalFrames;\n    }\n    constructor(core) {\n      this._core = core;\n      this._totalFrames = 0;\n      this.reset();\n    }\n    update(elapsedTime) {\n      this._elapsedTime += elapsedTime;\n      if (this._elapsedTime > 1e3) {\n        this._elapsedTime -= 1e3;\n        this._fps = this._frameCounter;\n        this._frameCounter = 0;\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`fps      ${this._fps}`);\n      }\n    }\n    render() {\n      this._frameCounter++;\n      this._totalFrames++;\n    }\n    reset() {\n      this._fps = 0;\n      this._frameCounter = 0;\n      this._elapsedTime = 0;\n    }\n  }\n  const PaletteType = {\n    sequentialsinglehue: \"sequentialsinglehue\",\n    sequentialmultihue: \"sequentialmultihue\",\n    diverging: \"diverging\",\n    qualitative: \"qualitative\"\n  };\n  class PaletteResources {\n    constructor() {\n      this.palettes = {\n        \"blues\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 251, 255, 222, 235, 247, 198, 219, 239, 158, 202, 225, 107, 174, 214, 66, 146, 198, 33, 113, 181, 8, 81, 156, 8, 48, 107]) },\n        \"greens\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([247, 252, 245, 229, 245, 224, 199, 233, 192, 161, 217, 155, 116, 196, 118, 65, 171, 93, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n        \"greys\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 255, 255, 240, 240, 240, 217, 217, 217, 189, 189, 189, 150, 150, 150, 115, 115, 115, 82, 82, 82, 37, 37, 37, 0, 0, 0]) },\n        \"oranges\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 235, 254, 230, 206, 253, 208, 162, 253, 174, 107, 253, 141, 60, 241, 105, 19, 217, 72, 1, 166, 54, 3, 127, 39, 4]) },\n        \"purples\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([252, 251, 253, 239, 237, 245, 218, 218, 235, 188, 189, 220, 158, 154, 200, 128, 125, 186, 106, 81, 163, 84, 39, 143, 63, 0, 125]) },\n        \"reds\": { type: PaletteType.sequentialsinglehue, colors: new Uint8Array([255, 245, 240, 254, 224, 210, 252, 187, 161, 252, 146, 114, 251, 106, 74, 239, 59, 44, 203, 24, 29, 165, 15, 21, 103, 0, 13]) },\n        \"viridis\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([72, 37, 117, 65, 68, 135, 53, 96, 141, 42, 120, 142, 33, 145, 141, 34, 168, 132, 67, 191, 113, 122, 209, 81, 188, 223, 39]) },\n        \"inferno\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([23, 12, 59, 66, 10, 104, 107, 23, 110, 147, 38, 103, 187, 55, 85, 221, 81, 58, 243, 119, 26, 252, 165, 10, 246, 214, 69]) },\n        \"magma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([21, 14, 55, 59, 15, 112, 101, 26, 128, 140, 41, 129, 182, 55, 122, 222, 73, 104, 247, 111, 92, 254, 159, 109, 254, 206, 145]) },\n        \"plasma\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([66, 3, 157, 106, 0, 168, 144, 13, 164, 177, 42, 144, 203, 71, 121, 225, 100, 98, 242, 131, 76, 252, 166, 54, 252, 206, 37]) },\n        \"bluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 229, 245, 249, 204, 236, 230, 153, 216, 201, 102, 194, 164, 65, 174, 118, 35, 139, 69, 0, 109, 44, 0, 68, 27]) },\n        \"bluepurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 253, 224, 236, 244, 191, 211, 230, 158, 188, 218, 140, 150, 198, 140, 107, 177, 136, 65, 157, 129, 15, 124, 77, 0, 75]) },\n        \"greenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 252, 240, 224, 243, 219, 204, 235, 197, 168, 221, 181, 123, 204, 196, 78, 179, 211, 43, 140, 190, 8, 104, 172, 8, 64, 129]) },\n        \"orangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 236, 254, 232, 200, 253, 212, 158, 253, 187, 132, 252, 141, 89, 239, 101, 72, 215, 48, 31, 179, 0, 0, 127, 0, 0]) },\n        \"purpleblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 231, 242, 208, 209, 230, 166, 189, 219, 116, 169, 207, 54, 144, 192, 5, 112, 176, 4, 90, 141, 2, 56, 88]) },\n        \"purplebluegreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 251, 236, 226, 240, 208, 209, 230, 166, 189, 219, 103, 169, 207, 54, 144, 192, 2, 129, 138, 1, 108, 89, 1, 70, 54]) },\n        \"purplered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([247, 244, 249, 231, 225, 239, 212, 185, 218, 201, 148, 199, 223, 101, 176, 231, 41, 138, 206, 18, 86, 152, 0, 67, 103, 0, 31]) },\n        \"redpurple\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 247, 243, 253, 224, 221, 252, 197, 192, 250, 159, 181, 247, 104, 161, 221, 52, 151, 174, 1, 126, 122, 1, 119, 73, 0, 106]) },\n        \"yellowgreen\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 247, 252, 185, 217, 240, 163, 173, 221, 142, 120, 198, 121, 65, 171, 93, 35, 132, 67, 0, 104, 55, 0, 69, 41]) },\n        \"yellowgreenblue\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 217, 237, 248, 177, 199, 233, 180, 127, 205, 187, 65, 182, 196, 29, 145, 192, 34, 94, 168, 37, 52, 148, 8, 29, 88]) },\n        \"yelloworangebrown\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 229, 255, 247, 188, 254, 227, 145, 254, 196, 79, 254, 153, 41, 236, 112, 20, 204, 76, 2, 153, 52, 4, 102, 37, 6]) },\n        \"yelloworangered\": { type: PaletteType.sequentialmultihue, colors: new Uint8Array([255, 255, 204, 255, 237, 160, 254, 217, 118, 254, 178, 76, 253, 141, 60, 252, 78, 42, 227, 26, 28, 189, 0, 38, 128, 0, 38]) },\n        \"brownbluegreen\": { type: PaletteType.diverging, colors: new Uint8Array([84, 48, 5, 140, 81, 10, 191, 129, 45, 223, 194, 125, 246, 232, 195, 245, 245, 245, 199, 234, 229, 128, 205, 193, 53, 151, 143, 1, 102, 94, 0, 60, 48]) },\n        \"pinkyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([142, 1, 82, 197, 27, 125, 222, 119, 174, 241, 182, 218, 253, 224, 239, 247, 247, 247, 230, 245, 208, 184, 225, 134, 127, 188, 65, 77, 146, 33, 39, 100, 25]) },\n        \"purplegreen\": { type: PaletteType.diverging, colors: new Uint8Array([64, 0, 75, 118, 42, 131, 153, 112, 171, 194, 165, 207, 231, 212, 232, 247, 247, 247, 217, 240, 211, 166, 219, 160, 90, 174, 97, 27, 120, 55, 0, 68, 27]) },\n        \"purpleorange\": { type: PaletteType.diverging, colors: new Uint8Array([127, 59, 8, 179, 88, 6, 224, 130, 20, 253, 184, 99, 254, 224, 182, 247, 247, 247, 216, 218, 235, 178, 171, 210, 128, 115, 172, 84, 39, 136, 45, 0, 75]) },\n        \"redblue\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 247, 247, 247, 209, 229, 240, 146, 197, 222, 67, 147, 195, 33, 102, 172, 5, 48, 97]) },\n        \"redgrey\": { type: PaletteType.diverging, colors: new Uint8Array([103, 0, 31, 178, 24, 43, 214, 96, 77, 244, 165, 130, 253, 219, 199, 255, 255, 255, 224, 224, 224, 186, 186, 186, 135, 135, 135, 77, 77, 77, 26, 26, 26]) },\n        \"redyellowblue\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 144, 255, 255, 191, 224, 243, 248, 171, 217, 233, 116, 173, 209, 69, 117, 180, 49, 54, 149]) },\n        \"redyellowgreen\": { type: PaletteType.diverging, colors: new Uint8Array([165, 0, 38, 215, 48, 39, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 217, 239, 139, 166, 217, 106, 102, 189, 99, 26, 152, 80, 0, 104, 55]) },\n        \"spectral\": { type: PaletteType.diverging, colors: new Uint8Array([158, 1, 66, 213, 62, 79, 244, 109, 67, 253, 174, 97, 254, 224, 139, 255, 255, 191, 230, 245, 152, 171, 221, 164, 102, 194, 165, 50, 136, 189, 94, 79, 162]) },\n        \"accent\": { type: PaletteType.qualitative, colors: new Uint8Array([127, 201, 127, 190, 174, 212, 253, 192, 134, 255, 255, 153, 56, 108, 176, 240, 2, 127, 191, 91, 23, 102, 102, 102]) },\n        \"category10\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 255, 127, 14, 44, 160, 44, 214, 39, 40, 148, 103, 189, 140, 86, 75, 227, 119, 194, 127, 127, 127, 188, 189, 34, 23, 190, 207]) },\n        \"category20\": { type: PaletteType.qualitative, colors: new Uint8Array([31, 119, 180, 174, 199, 232, 255, 127, 14, 255, 187, 120, 44, 160, 44, 152, 223, 138, 214, 39, 40, 255, 152, 150, 148, 103, 189, 197, 176, 213, 140, 86, 75, 196, 156, 148, 227, 119, 194, 247, 182, 210, 127, 127, 127, 199, 199, 199, 188, 189, 34, 219, 219, 141, 23, 190, 207, 158, 218, 229]) },\n        \"dark2\": { type: PaletteType.qualitative, colors: new Uint8Array([27, 158, 119, 217, 95, 2, 117, 112, 179, 231, 41, 138, 102, 166, 30, 230, 171, 2, 166, 118, 29, 102, 102, 102]) },\n        \"paired\": { type: PaletteType.qualitative, colors: new Uint8Array([166, 206, 227, 31, 120, 180, 178, 223, 138, 51, 160, 44, 251, 154, 153, 227, 26, 28, 253, 191, 111, 255, 127, 0, 202, 178, 214, 106, 61, 154, 255, 255, 153, 177, 89, 40]) },\n        \"pastel1\": { type: PaletteType.qualitative, colors: new Uint8Array([251, 180, 174, 179, 205, 227, 204, 235, 197, 222, 203, 228, 254, 217, 166, 255, 255, 204, 229, 216, 189, 253, 218, 236, 242, 242, 242]) },\n        \"pastel2\": { type: PaletteType.qualitative, colors: new Uint8Array([179, 226, 205, 253, 205, 172, 203, 213, 232, 244, 202, 228, 230, 245, 201, 255, 242, 174, 241, 226, 204, 204, 204, 204]) },\n        \"set1\": { type: PaletteType.qualitative, colors: new Uint8Array([228, 26, 28, 55, 126, 184, 77, 175, 74, 152, 78, 163, 255, 127, 0, 255, 255, 51, 166, 86, 40, 247, 129, 191, 153, 153, 153]) },\n        \"set2\": { type: PaletteType.qualitative, colors: new Uint8Array([102, 194, 165, 252, 141, 98, 141, 160, 203, 231, 138, 195, 166, 216, 84, 255, 217, 47, 229, 196, 148, 179, 179, 179]) },\n        \"set3\": { type: PaletteType.qualitative, colors: new Uint8Array([141, 211, 199, 255, 255, 179, 190, 186, 218, 251, 128, 114, 128, 177, 211, 253, 180, 98, 179, 222, 105, 252, 205, 229, 217, 217, 217, 188, 128, 189, 204, 235, 197, 255, 237, 111]) }\n      };\n    }\n  }\n  class PaletteBase {\n    get colors() {\n      return this._colors;\n    }\n    set colors(value2) {\n      if (this._colors != value2) {\n        this._colors = value2;\n        this._changed = true;\n      }\n    }\n    constructor() {\n      this._colors = null;\n    }\n    copyFrom(palette) {\n      if (palette.colors) {\n        this.colors = new Uint8Array(palette.colors);\n      } else {\n        this.colors = null;\n      }\n    }\n    update() {\n    }\n  }\n  let Palette$2 = class Palette extends PaletteBase {\n  };\n  class PositionVertex {\n    static getPosition(buffer, index2, value2) {\n      const offset2 = index2 * PositionVertex.SIZE;\n      set$3(value2, buffer[offset2], buffer[offset2 + 1], buffer[offset2 + 2]);\n    }\n    static setPosition(buffer, index2, value2) {\n      const offset2 = index2 * PositionVertex.SIZE;\n      buffer[offset2] = value2[0];\n      buffer[offset2 + 1] = value2[1];\n      buffer[offset2 + 2] = value2[2];\n    }\n  }\n  PositionVertex.SIZE = 3;\n  PositionVertex.SIZE_BYTES = 12;\n  class PositionColorVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getColor(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      set$3(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255);\n    }\n    static setColor(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n    }\n  }\n  PositionColorVertex.SIZE_BYTES = 16;\n  PositionColorVertex.POSITION_OFFSET_BYTES = 0;\n  PositionColorVertex.COLOR_OFFSET_BYTES = 12;\n  class PositionTextureVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionColorVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n  }\n  PositionTextureVertex.SIZE_BYTES = 16;\n  PositionTextureVertex.POSITION_OFFSET_BYTES = 0;\n  PositionTextureVertex.TEX_COORD_OFFSET_BYTES = 12;\n  class PositionTexturePickVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$2(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = PositionTexturePickVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n  }\n  PositionTexturePickVertex.SIZE_BYTES = 20;\n  PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES = 0;\n  PositionTexturePickVertex.POSITION_OFFSET_BYTES = 4;\n  PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES = 16;\n  class PositionNormalTextureVertex {\n    static getPosition(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setPosition(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.POSITION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getNormal(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      set$3(value2, bufferView.getInt8(offset2) / 127, bufferView.getInt8(offset2 + 1) / 127, bufferView.getInt8(offset2 + 2) / 127);\n    }\n    static setNormal(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      bufferView.setInt8(offset2, value2[0] * 127);\n      bufferView.setInt8(offset2 + 1, value2[1] * 127);\n      bufferView.setInt8(offset2 + 2, value2[2] * 127);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PositionNormalTextureVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n  }\n  PositionNormalTextureVertex.SIZE_BYTES = 20;\n  PositionNormalTextureVertex.POSITION_OFFSET_BYTES = 0;\n  PositionNormalTextureVertex.NORMAL_OFFSET_BYTES = 12;\n  PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES = 16;\n  class PickGridVertex {\n    static getTranslation(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setTranslation(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static getNormal(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      set$3(value2, bufferView.getInt8(offset2) / 127, bufferView.getInt8(offset2 + 1) / 127, bufferView.getInt8(offset2 + 2) / 127);\n    }\n    static setNormal(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.NORMAL_OFFSET_BYTES;\n      bufferView.setInt8(offset2, value2[0] * 127);\n      bufferView.setInt8(offset2 + 1, value2[1] * 127);\n      bufferView.setInt8(offset2 + 2, value2[2] * 127);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$2(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      set(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535);\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.TEX_COORD_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n    }\n    static getBounds(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.BOUNDS_OFFSET_BYTES;\n      set$2(value2, bufferView.getUint16(offset2, true) / 65535, bufferView.getUint16(offset2 + 2, true) / 65535, bufferView.getUint16(offset2 + 4, true) / 65535, bufferView.getUint16(offset2 + 6, true) / 65535);\n    }\n    static setBounds(bufferView, index2, value2) {\n      const offset2 = PickGridVertex.SIZE_BYTES * index2 + this.BOUNDS_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 65535, true);\n      bufferView.setUint16(offset2 + 2, value2[1] * 65535, true);\n      bufferView.setUint16(offset2 + 4, value2[2] * 65535, true);\n      bufferView.setUint16(offset2 + 6, value2[3] * 65535, true);\n    }\n  }\n  PickGridVertex.SIZE_BYTES = 32;\n  PickGridVertex.TRANSLATION_OFFSET_BYTES = 0;\n  PickGridVertex.NORMAL_OFFSET_BYTES = 12;\n  PickGridVertex.ID_COLOR_OFFSET_BYTES = 16;\n  PickGridVertex.TEX_COORD_OFFSET_BYTES = 20;\n  PickGridVertex.BOUNDS_OFFSET_BYTES = 24;\n  class UnitVertex {\n    static getIdHover(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.ID_HOVER_OFFSET_BYTES, true);\n    }\n    static setIdHover(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.ID_HOVER_OFFSET_BYTES, value2, true);\n    }\n    static copyIdHover(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ID_HOVER_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ID_HOVER_OFFSET_BYTES, true), true);\n    }\n    static getTranslation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setTranslation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TRANSLATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static copyTranslation(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TRANSLATION_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TRANSLATION_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      set(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255);\n    }\n    static setColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n    }\n    static copyColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.COLOR_OFFSET_BYTES;\n      toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n      toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n    }\n    static getOrder(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ORDER_OFFSET_BYTES;\n      set(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true));\n    }\n    static setOrder(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ORDER_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n    }\n    static copyOrder(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ORDER_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ORDER_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n    }\n    static getScale(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SCALE_OFFSET_BYTES;\n      set$3(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true));\n    }\n    static setScale(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SCALE_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n    }\n    static copyScale(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SCALE_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SCALE_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n    }\n    static getRotation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ROTATION_OFFSET_BYTES;\n      set$1(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true), bufferView.getFloat32(offset2 + 12, true));\n    }\n    static setRotation(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ROTATION_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n      bufferView.setFloat32(offset2 + 12, value2[3], true);\n    }\n    static copyRotation(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.ROTATION_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.ROTATION_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n      toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getTexCoord(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TEXCOORD_OFFSET_BYTES;\n      set$1(value2, bufferView.getFloat32(offset2, true), bufferView.getFloat32(offset2 + 4, true), bufferView.getFloat32(offset2 + 8, true), bufferView.getFloat32(offset2 + 12, true));\n    }\n    static setTexCoord(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.TEXCOORD_OFFSET_BYTES;\n      bufferView.setFloat32(offset2, value2[0], true);\n      bufferView.setFloat32(offset2 + 4, value2[1], true);\n      bufferView.setFloat32(offset2 + 8, value2[2], true);\n      bufferView.setFloat32(offset2 + 12, value2[3], true);\n    }\n    static copyTexCoord(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.TEXCOORD_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.TEXCOORD_OFFSET_BYTES;\n      toBufferView.setFloat32(toOffset, fromBufferView.getFloat32(fromOffset, true), true);\n      toBufferView.setFloat32(toOffset + 4, fromBufferView.getFloat32(fromOffset + 4, true), true);\n      toBufferView.setFloat32(toOffset + 8, fromBufferView.getFloat32(fromOffset + 8, true), true);\n      toBufferView.setFloat32(toOffset + 12, fromBufferView.getFloat32(fromOffset + 12, true), true);\n    }\n    static getIdColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      set$2(value2, bufferView.getUint8(offset2) / 255, bufferView.getUint8(offset2 + 1) / 255, bufferView.getUint8(offset2 + 2) / 255, bufferView.getUint8(offset2 + 3) / 255);\n    }\n    static setIdColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.ID_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static getSelected(bufferView, index2) {\n      return bufferView.getInt8(UnitVertex.SIZE_BYTES * index2 + this.SELECTED_OFFSET_BYTES) / 127;\n    }\n    static setSelected(bufferView, index2, value2) {\n      bufferView.setInt8(UnitVertex.SIZE_BYTES * index2 + this.SELECTED_OFFSET_BYTES, value2 * 127);\n    }\n    static copySelected(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setInt8(UnitVertex.SIZE_BYTES * toIndex + this.SELECTED_OFFSET_BYTES, fromBufferView.getInt8(UnitVertex.SIZE_BYTES * fromIndex + this.SELECTED_OFFSET_BYTES));\n    }\n    static getRounding(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.ROUNDING_OFFSET_BYTES, true);\n    }\n    static setRounding(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.ROUNDING_OFFSET_BYTES, value2, true);\n    }\n    static copyRounding(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.ROUNDING_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.ROUNDING_OFFSET_BYTES, true), true);\n    }\n    static getParameter1(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_1_OFFSET_BYTES, true);\n    }\n    static setParameter1(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_1_OFFSET_BYTES, value2, true);\n    }\n    static copyParameter1(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_1_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_1_OFFSET_BYTES, true), true);\n    }\n    static getParameter2(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_2_OFFSET_BYTES, true);\n    }\n    static setParameter2(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.PARAMETER_2_OFFSET_BYTES, value2, true);\n    }\n    static copyParameter2(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.PARAMETER_2_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.PARAMETER_2_OFFSET_BYTES, true), true);\n    }\n    static getMaterial(bufferView, index2) {\n      return bufferView.getUint16(UnitVertex.SIZE_BYTES * index2 + this.MATERIAL_OFFSET_BYTES);\n    }\n    static setMaterial(bufferView, index2, value2) {\n      bufferView.setUint16(UnitVertex.SIZE_BYTES * index2 + this.MATERIAL_OFFSET_BYTES, value2);\n    }\n    static copyMaterial(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint16(UnitVertex.SIZE_BYTES * toIndex + this.MATERIAL_OFFSET_BYTES, fromBufferView.getUint16(UnitVertex.SIZE_BYTES * fromIndex + this.MATERIAL_OFFSET_BYTES, true), true);\n    }\n    static getTexture(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.TEXTURE_OFFSET_BYTES);\n    }\n    static setTexture(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.TEXTURE_OFFSET_BYTES, value2);\n    }\n    static copyTexture(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.TEXTURE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.TEXTURE_OFFSET_BYTES));\n    }\n    static getSdfBuffer(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BUFFER_OFFSET_BYTES);\n    }\n    static setSdfBuffer(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BUFFER_OFFSET_BYTES, value2);\n    }\n    static copySdfBuffer(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BUFFER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BUFFER_OFFSET_BYTES));\n    }\n    static getSdfBorder(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BORDER_OFFSET_BYTES);\n    }\n    static setSdfBorder(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.SDF_BORDER_OFFSET_BYTES, value2);\n    }\n    static copySdfBorder(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.SDF_BORDER_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.SDF_BORDER_OFFSET_BYTES));\n    }\n    static getMatId(bufferView, index2) {\n      return bufferView.getUint8(UnitVertex.SIZE_BYTES * index2 + this.MAT_TYPE_OFFSET_BYTES);\n    }\n    static setMatId(bufferView, index2, value2) {\n      bufferView.setUint8(UnitVertex.SIZE_BYTES * index2 + this.MAT_TYPE_OFFSET_BYTES, value2);\n    }\n    static copyMatId(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_TYPE_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_TYPE_OFFSET_BYTES));\n    }\n    static getMatColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_COLOR_OFFSET_BYTES;\n      value2[0] = bufferView.getUint16(offset2) / 255;\n      value2[1] = bufferView.getUint16(offset2 + 2) / 255;\n      value2[2] = bufferView.getUint16(offset2 + 4) / 255;\n    }\n    static setMatColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_COLOR_OFFSET_BYTES;\n      bufferView.setUint16(offset2, value2[0] * 255);\n      bufferView.setUint16(offset2 + 2, value2[1] * 255);\n      bufferView.setUint16(offset2 + 4, value2[2] * 255);\n    }\n    static copyMatColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.MAT_COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.MAT_COLOR_OFFSET_BYTES;\n      toBufferView.setUint16(toOffset, fromBufferView.getUint16(fromOffset));\n      toBufferView.setUint16(toOffset + 2, fromBufferView.getUint16(fromOffset + 2));\n      toBufferView.setUint16(toOffset + 4, fromBufferView.getUint16(fromOffset + 4));\n    }\n    static getMatFuzz(bufferView, index2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_FUZZ_OFFSET_BYTES;\n      return bufferView.getUint8(offset2) / 255;\n    }\n    static setMatFuzz(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_FUZZ_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2 * 255);\n    }\n    static copyMatFuzz(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_FUZZ_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_FUZZ_OFFSET_BYTES));\n    }\n    static getMatGloss(bufferView, index2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_GLOSS_OFFSET_BYTES;\n      return bufferView.getUint8(offset2) / 255;\n    }\n    static setMatGloss(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.MAT_GLOSS_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2 * 255);\n    }\n    static copyMatGloss(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setUint8(UnitVertex.SIZE_BYTES * toIndex + this.MAT_GLOSS_OFFSET_BYTES, fromBufferView.getUint8(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_GLOSS_OFFSET_BYTES));\n    }\n    static getMatDensity(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_DENSITY_OFFSET_BYTES, true);\n    }\n    static setMatDensity(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_DENSITY_OFFSET_BYTES, value2, true);\n    }\n    static copyMatDensity(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_DENSITY_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_DENSITY_OFFSET_BYTES, true), true);\n    }\n    static getMatRefractiveIndex(bufferView, index2) {\n      return bufferView.getFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true);\n    }\n    static setMatRefractiveIndex(bufferView, index2, value2) {\n      bufferView.setFloat32(UnitVertex.SIZE_BYTES * index2 + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, value2, true);\n    }\n    static copyMatRefractiveIndex(fromBufferView, fromIndex, toBufferView, toIndex) {\n      toBufferView.setFloat32(UnitVertex.SIZE_BYTES * toIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, fromBufferView.getFloat32(UnitVertex.SIZE_BYTES * fromIndex + this.MAT_REFRACTIVE_INDEX_OFFSET_BYTES, true), true);\n    }\n    static getSegColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SEG_COLOR_OFFSET_BYTES;\n      value2[0] = bufferView.getUint8(offset2) / 255;\n      value2[1] = bufferView.getUint8(offset2 + 1) / 255;\n      value2[2] = bufferView.getUint8(offset2 + 2) / 255;\n      value2[3] = bufferView.getUint8(offset2 + 3) / 255;\n    }\n    static setSegColor(bufferView, index2, value2) {\n      const offset2 = UnitVertex.SIZE_BYTES * index2 + this.SEG_COLOR_OFFSET_BYTES;\n      bufferView.setUint8(offset2, value2[0] * 255);\n      bufferView.setUint8(offset2 + 1, value2[1] * 255);\n      bufferView.setUint8(offset2 + 2, value2[2] * 255);\n      bufferView.setUint8(offset2 + 3, value2[3] * 255);\n    }\n    static copySegColor(fromBufferView, fromIndex, toBufferView, toIndex) {\n      const fromOffset = UnitVertex.SIZE_BYTES * fromIndex + this.SEG_COLOR_OFFSET_BYTES;\n      const toOffset = UnitVertex.SIZE_BYTES * toIndex + this.SEG_COLOR_OFFSET_BYTES;\n      toBufferView.setUint8(toOffset, fromBufferView.getUint8(fromOffset));\n      toBufferView.setUint8(toOffset + 1, fromBufferView.getUint8(fromOffset + 1));\n      toBufferView.setUint8(toOffset + 2, fromBufferView.getUint8(fromOffset + 2));\n      toBufferView.setUint8(toOffset + 3, fromBufferView.getUint8(fromOffset + 3));\n    }\n  }\n  UnitVertex.SIZE_BYTES = 120;\n  UnitVertex.ID_HOVER_OFFSET_BYTES = 0;\n  UnitVertex.ID_COLOR_OFFSET_BYTES = 4;\n  UnitVertex.ORDER_OFFSET_BYTES = 8;\n  UnitVertex.STAGGER_ORDER_OFFSET_BYTES = 12;\n  UnitVertex.SELECTED_OFFSET_BYTES = 80;\n  UnitVertex.TRANSLATION_OFFSET_BYTES = 16;\n  UnitVertex.COLOR_OFFSET_BYTES = 28;\n  UnitVertex.MATERIAL_OFFSET_BYTES = 30;\n  UnitVertex.SCALE_OFFSET_BYTES = 32;\n  UnitVertex.ROUNDING_OFFSET_BYTES = 44;\n  UnitVertex.ROTATION_OFFSET_BYTES = 48;\n  UnitVertex.TEXCOORD_OFFSET_BYTES = 64;\n  UnitVertex.TEXTURE_OFFSET_BYTES = 81;\n  UnitVertex.SDF_BUFFER_OFFSET_BYTES = 82;\n  UnitVertex.SDF_BORDER_OFFSET_BYTES = 83;\n  UnitVertex.PARAMETER_1_OFFSET_BYTES = 84;\n  UnitVertex.PARAMETER_2_OFFSET_BYTES = 88;\n  UnitVertex.MAT_TYPE_OFFSET_BYTES = 92;\n  UnitVertex.MAT_COLOR_OFFSET_BYTES = 112;\n  UnitVertex.MAT_FUZZ_OFFSET_BYTES = 96;\n  UnitVertex.MAT_GLOSS_OFFSET_BYTES = 97;\n  UnitVertex.MAT_DENSITY_OFFSET_BYTES = 100;\n  UnitVertex.MAT_REFRACTIVE_INDEX_OFFSET_BYTES = 104;\n  UnitVertex.SEG_COLOR_OFFSET_BYTES = 108;\n  class ObjMesh {\n  }\n  class ObjHelper {\n    constructor(core) {\n      this._core = core;\n    }\n    read(data2) {\n      const start = window.performance.now();\n      const indices = [];\n      const positions = [];\n      const normals = [];\n      const texCoords = [];\n      const meshes = [];\n      const indexOffsets = [];\n      const indexCounts = [];\n      const faceLookup = {};\n      const lines = data2.split(\"\\n\");\n      let faceCount = 0;\n      for (let i = 0; i < lines.length; i++) {\n        const parts = lines[i].trim().split(\" \");\n        if (parts.length > 0) {\n          switch (parts[0]) {\n            case \"o\":\n              meshes.push(parts[1]);\n              indexOffsets.push(indices.length);\n              break;\n            case \"v\":\n              positions.push(parseFloat(parts[1]));\n              positions.push(parseFloat(parts[2]));\n              positions.push(parseFloat(parts[3]));\n              break;\n            case \"vt\":\n              texCoords.push(parseFloat(parts[1]));\n              texCoords.push(parseFloat(parts[2]));\n              break;\n            case \"vn\":\n              normals.push(parseFloat(parts[1]));\n              normals.push(parseFloat(parts[2]));\n              normals.push(parseFloat(parts[3]));\n              break;\n            case \"f\":\n              for (let i2 = 0; i2 < parts.length - 1; i2++) {\n                const part = parts[i2 + 1];\n                if (faceLookup[part] == void 0) {\n                  faceLookup[part] = faceCount++;\n                }\n                indices.push(faceLookup[part]);\n              }\n              break;\n          }\n        }\n      }\n      for (let i = 0; i < meshes.length - 1; i++) {\n        indexCounts.push(indexOffsets[i + 1] - indexOffsets[i]);\n      }\n      indexCounts.push(indices.length - indexOffsets[meshes.length - 1]);\n      const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * Object.keys(faceLookup).length);\n      const dataView = new DataView(vertices);\n      let minX = Number.MAX_VALUE;\n      let minY = Number.MAX_VALUE;\n      let minZ2 = Number.MAX_VALUE;\n      let maxX = -Number.MAX_VALUE;\n      let maxY2 = -Number.MAX_VALUE;\n      let maxZ = -Number.MAX_VALUE;\n      const faces = Object.keys(faceLookup);\n      const _vec2 = create();\n      const _vec3 = create$3();\n      let hasTexCoords, hasNormals;\n      if (faces.length > 0) {\n        const faceParts = faces[0].split(\"/\");\n        hasTexCoords = faceParts.length > 1 && !isNaN(parseInt(faceParts[1]));\n        hasNormals = faceParts.length > 2 && !isNaN(parseInt(faceParts[2]));\n      }\n      for (let i = 0; i < faces.length; i++) {\n        const faceParts = faces[i].split(\"/\");\n        let index2 = (parseInt(faceParts[0]) - 1) * 3;\n        const x2 = positions[index2];\n        const y2 = positions[index2 + 1];\n        const z = positions[index2 + 2];\n        set$3(_vec3, x2, y2, z);\n        PositionNormalTextureVertex.setPosition(dataView, i, _vec3);\n        minX = Math.min(x2, minX);\n        minY = Math.min(y2, minY);\n        minZ2 = Math.min(z, minZ2);\n        maxX = Math.max(x2, maxX);\n        maxY2 = Math.max(y2, maxY2);\n        maxZ = Math.max(z, maxZ);\n        if (hasNormals) {\n          index2 = (parseInt(faceParts[2]) - 1) * 3;\n          set$3(_vec3, normals[index2], normals[index2 + 1], normals[index2 + 2]);\n          PositionNormalTextureVertex.setNormal(dataView, i, _vec3);\n        }\n        if (hasTexCoords) {\n          index2 = (parseInt(faceParts[1]) - 1) * 2;\n          set(_vec2, texCoords[index2], texCoords[index2 + 1]);\n          PositionNormalTextureVertex.setTexCoord(dataView, i, _vec2);\n        }\n      }\n      const originX = (minX + maxX) / 2;\n      const originY = (minY + maxY2) / 2;\n      const originZ = (minZ2 + maxZ) / 2;\n      const objMesh = new ObjMesh();\n      objMesh.vertices = vertices;\n      objMesh.indices = new Uint16Array(indices);\n      objMesh.meshes = meshes;\n      objMesh.indexOffsets = indexOffsets;\n      objMesh.indexCounts = indexCounts;\n      objMesh.indexCount = indices.length;\n      objMesh.minX = minX;\n      objMesh.minY = minY;\n      objMesh.minZ = minZ2;\n      objMesh.maxX = maxX;\n      objMesh.maxY = maxY2;\n      objMesh.maxZ = maxZ;\n      objMesh.originX = originX;\n      objMesh.originY = originY;\n      objMesh.originZ = originZ;\n      this._core.log.write(LogLevel.info, `obj loaded ${Math.round(window.performance.now() - start)}ms`);\n      return objMesh;\n    }\n  }\n  class Cube {\n  }\n  Cube.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    0.5,\n    0.5,\n    -0.5,\n    0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5,\n    -0.5\n  ]);\n  Cube.INDICES = new Uint16Array([5, 4, 1, 0, 3, 4, 7, 5, 6, 1, 2, 3, 6, 7]);\n  Cube.CUBE_MAP_INDICES = new Uint16Array([2, 3, 1, 0, 4, 3, 7, 2, 6, 1, 5, 4, 6, 7]);\n  Cube.FACE_NORMALS = [\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, -1, 0),\n    fromValues$3(-1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Cube.FACE_POSITIONS = [\n    fromValues$3(0, 0.5, 0),\n    fromValues$3(0.5, 0, 0),\n    fromValues$3(0, -0.5, 0),\n    fromValues$3(-0.5, 0, 0),\n    fromValues$3(0, 0, 0.5),\n    fromValues$3(0, 0, -0.5)\n  ];\n  Cube.FACE_ROTATIONS = [\n    fromValues$5(1, 0, 0, 0, 0, -1, 0, 1, 0),\n    fromValues$5(0, 0, -1, 0, 1, 0, 1, 0, 0),\n    fromValues$5(1, 0, 0, 0, 0, 1, 0, -1, 0),\n    fromValues$5(0, 0, 1, 0, 1, 0, -1, 0, 0),\n    fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n  ];\n  Cube.EDGE_POSITIONS = [\n    fromValues$3(0, 0.5, 0.5),\n    fromValues$3(0.5, 0.5, 0),\n    fromValues$3(0, 0.5, -0.5),\n    fromValues$3(-0.5, 0.5, 0),\n    fromValues$3(0, -0.5, 0.5),\n    fromValues$3(0.5, -0.5, 0),\n    fromValues$3(0, -0.5, -0.5),\n    fromValues$3(-0.5, -0.5, 0),\n    fromValues$3(0.5, 0, 0.5),\n    fromValues$3(0.5, 0, -0.5),\n    fromValues$3(-0.5, 0, -0.5),\n    fromValues$3(-0.5, 0, 0.5)\n  ];\n  Cube.EDGE_NORMALS = [\n    fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO)\n  ];\n  Cube.EDGE_CORNERS = [\n    [0, 1],\n    [1, 5],\n    [4, 5],\n    [0, 4],\n    [2, 3],\n    [2, 6],\n    [6, 7],\n    [3, 7],\n    [1, 2],\n    [5, 6],\n    [4, 7],\n    [0, 3]\n  ];\n  Cube.EDGE_FACES = [\n    [0, 4],\n    [0, 1],\n    [0, 5],\n    [0, 3],\n    [2, 4],\n    [2, 1],\n    [2, 5],\n    [2, 3],\n    [1, 4],\n    [1, 5],\n    [3, 5],\n    [3, 4]\n  ];\n  Cube.EDGE_AXIS = [\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    0,\n    2,\n    1,\n    1,\n    1,\n    1\n  ];\n  Cube.AXIS_EDGES = [\n    [0, 2, 4, 6],\n    [8, 9, 10, 11],\n    [1, 3, 5, 7]\n  ];\n  Cube.AXIS_FACES = [\n    [1, 3],\n    [0, 2],\n    [4, 5]\n  ];\n  Cube.OPPOSITE_FACES = [\n    2,\n    3,\n    0,\n    1,\n    5,\n    4\n  ];\n  Cube.EDGE_POSITIVES = [\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(0, 1, 0)\n  ];\n  Cube.EDGE_FORWARDS = [\n    fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, -Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(0, -Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, Constants.ROOT_TWO_OVER_TWO, 0),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO),\n    fromValues$3(-Constants.ROOT_TWO_OVER_TWO, 0, -Constants.ROOT_TWO_OVER_TWO)\n  ];\n  let ControllerVisual$1 = class ControllerVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(controller) {\n      this.controller = controller;\n    }\n  };\n  class Controller {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get texture() {\n      return this._texture;\n    }\n    get rayMMatrix() {\n      return this._rayMMatrix;\n    }\n    get rayIndexCount() {\n      return this._rayIndexCount;\n    }\n    get rayVertices() {\n      return this._rayVertices;\n    }\n    get rayIndices() {\n      return this._rayIndices;\n    }\n    constructor(core, options) {\n      this._cubeObj = `o Cube\nv 1.000000 -1.000000 -1.000000\nv 1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 1.000000\nv -1.000000 -1.000000 -1.000000\nv 1.000000 1.000000 -0.999999\nv 0.999999 1.000000 1.000001\nv -1.000000 1.000000 1.000000\nv -1.000000 1.000000 -1.000000\nvt 1.000000 0.333333\nvt 1.000000 0.666667\nvt 0.666667 0.666667\nvt 0.666667 0.333333\nvt 0.666667 0.000000\nvt 0.000000 0.333333\nvt 0.000000 0.000000\nvt 0.333333 0.000000\nvt 0.333333 1.000000\nvt 0.000000 1.000000\nvt 0.000000 0.666667\nvt 0.333333 0.333333\nvt 0.333333 0.666667\nvt 1.000000 0.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 1.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.000000 0.000000 1.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.000000 0.000000 -1.000000\ns off\nf 2/1/1 3/2/1 4/3/1\nf 8/1/2 7/4/2 6/5/2\nf 5/6/3 6/7/3 2/8/3\nf 6/8/4 7/5/4 3/4/4\nf 3/9/5 7/10/5 8/11/5\nf 1/12/6 4/13/6 8/11/6\nf 1/4/1 2/1/1 4/3/1\nf 5/14/2 8/1/2 6/5/2\nf 1/12/3 5/6/3 2/8/3\nf 2/12/4 6/8/4 3/4/4\nf 4/13/5 3/9/5 8/11/5\nf 5/6/6 1/12/6 8/11/6`;\n      this._core = core;\n      this._obj = options.obj;\n      this._texture = options.texture || new ImageData(new Uint8ClampedArray([0, 0, 0, 255]), 1, 1);\n    }\n    initialize() {\n      const _vec3 = create$3();\n      this._mMatrix = create$4();\n      const objMesh = new ObjHelper(this._core).read(this._obj || this._cubeObj);\n      if (!this._obj) {\n        this.useRayPose = true;\n        const modelThickness = 0.02;\n        const modelLength = 0.1;\n        set$3(_vec3, modelThickness, modelThickness, modelLength);\n        fromScaling(this._mMatrix, _vec3);\n        set$3(_vec3, 0, 0, 1);\n        translate(this._mMatrix, this._mMatrix, _vec3);\n      }\n      this._vertices = objMesh.vertices;\n      this._indices = objMesh.indices;\n      this._indexCount = objMesh.indexCount;\n      this._rayMMatrix = create$4();\n      const rayVertices = Cube.POSITIONS;\n      this._rayVertices = new ArrayBuffer(PositionColorVertex.SIZE_BYTES * rayVertices.length / PositionVertex.SIZE);\n      const rayVerticesView = new DataView(this._rayVertices);\n      const rayIndices = Cube.INDICES;\n      this._rayIndices = new Uint16Array(rayIndices);\n      const rayVertexCount = rayVertices.length / PositionVertex.SIZE;\n      this._rayIndexCount = rayIndices.length;\n      for (let i = 0; i < rayVertexCount; i++) {\n        set$3(_vec3, rayVertices[i * PositionVertex.SIZE], rayVertices[i * PositionVertex.SIZE + 1], rayVertices[i * PositionVertex.SIZE + 2]);\n        PositionColorVertex.setPosition(rayVerticesView, i, _vec3);\n        PositionColorVertex.setColor(rayVerticesView, i, this._core.config.xrControllerRayColor);\n      }\n      const rayThickness = 25e-4;\n      const rayLength = 10;\n      set$3(_vec3, rayThickness, rayThickness, rayLength);\n      fromScaling(this._rayMMatrix, _vec3);\n      set$3(_vec3, 0, 0, -0.5);\n      translate(this._rayMMatrix, this._rayMMatrix, _vec3);\n      this._isInitialized = true;\n      this._core.log.write(LogLevel.info, \"controller initialized\");\n    }\n    update(elapsedTime) {\n    }\n  }\n  class MatrixHelper {\n    static fieldOfViewFromProjectionMatrix(p) {\n      return 2 * Math.atan(1 / p[5]);\n    }\n  }\n  class AxesVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(axes) {\n      this.axes = axes;\n    }\n  }\n  class AxesBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    set vMatrix(value2) {\n      this._vMatrix = value2;\n    }\n    pickGrid(id2) {\n      const offset2 = id2 * 3;\n      return {\n        divisionX: this._pickGrid[offset2] - 1,\n        divisionY: this._pickGrid[offset2 + 1] - 1,\n        divisionZ: this._pickGrid[offset2 + 2] - 1\n      };\n    }\n    pickTitle(id2) {\n      return { axis: this._pickTitle[id2] };\n    }\n    pickLabel(id2) {\n      const offset2 = id2 * 2;\n      return {\n        axis: this._pickLabel[offset2],\n        label: this._pickLabel[offset2 + 1]\n      };\n    }\n    pickHeading(id2) {\n      return { axis: this._pickHeading[id2] };\n    }\n    getFromValues(index2) {\n      return this._fromValues[index2];\n    }\n    setFromValues(index2, value2) {\n      if (this._fromValues[index2] != value2) {\n        this._fromValues[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getToValues(index2) {\n      return this._toValues[index2];\n    }\n    setToValues(index2, value2) {\n      if (this._toValues[index2] != value2) {\n        this._toValues[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get font() {\n      return this._font;\n    }\n    set font(value2) {\n      if (this._font != value2) {\n        this._font = value2;\n        this._hasChanged = true;\n      }\n    }\n    get gridPickDivisionHeight() {\n      return this._gridPickDivisionHeight;\n    }\n    set gridPickDivisionHeight(value2) {\n      if (this._gridPickDivisionHeight != value2) {\n        this._gridPickDivisionHeight = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core) {\n      this._core = core;\n      this._mMatrix = create$4();\n      this._mvMatrix = create$4();\n      this._textMetric = { maxTop: 0, width: 0, maxHeight: 0 };\n      this._gridPickDivisionHeight = core.config.axesGridPickDivisionHeight;\n      this.textBorderWidth = core.config.textBorderWidth;\n      this.gamma = 0;\n      this.gridMajorThickness = core.config.axesGridMajorThickness;\n      this.gridMinorThickness = core.config.axesGridMinorThickness;\n      this.gridZeroThickness = core.config.axesGridZeroThickness;\n      this._font = core.font;\n      this.isGridPickingEnabled = false;\n    }\n    update(elapsedTime) {\n    }\n  }\n  let Quad$2 = class Quad {\n    static positions(transform2) {\n      const positions = new Float32Array(12);\n      const position2 = create$3();\n      for (let i = 0; i < 4; i++) {\n        set$3(position2, this.POSITIONS[i * 3], this.POSITIONS[i * 3 + 1], this.POSITIONS[i * 3 + 2]);\n        transformMat4$2(position2, position2, transform2);\n        positions[i * 3] = position2[0];\n        positions[i * 3 + 1] = position2[1];\n        positions[i * 3 + 2] = position2[2];\n      }\n      return positions;\n    }\n    static textured(transform2, texTransform = Constants.MAT4_IDENTITY) {\n      const positions = this.positions(transform2);\n      const texCoords = this.TEX_COORDS;\n      const vertices = new ArrayBuffer(PositionTextureVertex.SIZE_BYTES * positions.length / 3);\n      const verticesView = new DataView(vertices);\n      const position2 = create$3();\n      const texCoord = create();\n      for (let i = 0; i < positions.length / PositionVertex.SIZE; i++) {\n        set$3(position2, positions[i * PositionVertex.SIZE], positions[i * PositionVertex.SIZE + 1], positions[i * PositionVertex.SIZE + 2]);\n        set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n        transformMat4(texCoord, texCoord, texTransform);\n        PositionTextureVertex.setPosition(verticesView, i, position2);\n        PositionTextureVertex.setTexCoord(verticesView, i, texCoord);\n      }\n      return verticesView;\n    }\n    static normalTextured(transform2, texTransform = Constants.MAT4_IDENTITY) {\n      const positions = this.positions(transform2);\n      const texCoords = this.TEX_COORDS;\n      const vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * positions.length / 3);\n      const verticesView = new DataView(vertices);\n      const position2 = create$3();\n      const texCoord = create();\n      const normal3 = create$3();\n      const normal4 = create$2();\n      for (let i = 0; i < positions.length / PositionVertex.SIZE; i++) {\n        set$3(position2, positions[i * PositionVertex.SIZE], positions[i * PositionVertex.SIZE + 1], positions[i * PositionVertex.SIZE + 2]);\n        set(texCoord, texCoords[i * 2], texCoords[i * 2 + 1]);\n        transformMat4(texCoord, texCoord, texTransform);\n        PositionNormalTextureVertex.setPosition(verticesView, i, position2);\n        set$2(normal4, 0, 0, 1, 0);\n        transformMat4$1(normal4, normal4, transform2);\n        set$3(normal3, normal4[0], normal4[1], normal4[2]);\n        normalize$2(normal3, normal3);\n        PositionNormalTextureVertex.setNormal(verticesView, i, normal3);\n        PositionNormalTextureVertex.setTexCoord(verticesView, i, texCoord);\n      }\n      return verticesView;\n    }\n  };\n  Quad$2.FACE_NORMALS = [\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Quad$2.FACE_ROTATIONS = [\n    fromValues$5(1, 0, 0, 0, 1, 0, 0, 0, 1),\n    fromValues$5(1, 0, 0, 0, -1, 0, 0, 0, -1)\n  ];\n  Quad$2.EDGE_POSITIONS = [\n    fromValues$3(0, 0.5, 0),\n    fromValues$3(0.5, 0, 0),\n    fromValues$3(0, -0.5, 0),\n    fromValues$3(-0.5, 0, 0)\n  ];\n  Quad$2.EDGE_NORMALS = [\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, -1, 0),\n    fromValues$3(-1, 0, 0)\n  ];\n  Quad$2.EDGE_POSITIVES = [\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 1, 0),\n    fromValues$3(1, 0, 0),\n    fromValues$3(0, 1, 0)\n  ];\n  Quad$2.EDGE_FORWARDS = [\n    fromValues$3(0, 0, -1),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, 1),\n    fromValues$3(0, 0, -1)\n  ];\n  Quad$2.AXIS_EDGES = [\n    [0, 2],\n    [1, 3]\n  ];\n  Quad$2.POSITIONS = new Float32Array([\n    -0.5,\n    0.5,\n    0,\n    0.5,\n    0.5,\n    0,\n    -0.5,\n    -0.5,\n    0,\n    0.5,\n    -0.5,\n    0\n  ]);\n  Quad$2.INDICES = new Uint16Array([0, 2, 1, 1, 2, 3]);\n  Quad$2.TEX_COORDS = new Float32Array([0, 1, 1, 1, 0, 0, 1, 0]);\n  class TextHelper {\n    static truncate(text2, length2) {\n      return text2.length > length2 ? `${text2.substr(0, length2 - 1)}…` : text2;\n    }\n    static measure(font2, text2, size) {\n      size.width = 0;\n      let maxDescent = 0;\n      for (const char of text2) {\n        let glyph = font2.glyphs[char];\n        if (!glyph) {\n          font2.addGlyph(char);\n          glyph = font2.glyphs[char];\n        }\n        size.width += glyph.advance;\n        size.maxTop = Math.max(glyph.top, size.maxTop);\n        maxDescent = Math.max(glyph.height - glyph.top, maxDescent);\n      }\n      size.maxHeight = size.maxTop + maxDescent;\n    }\n    static wrap(font2, text2, maxWidth) {\n      const lines = [];\n      let width2 = 0;\n      let start = 0;\n      let lastBreakingChar = -1;\n      let widthAfterLastBreakingChar = 0;\n      for (let i = 0; i < text2.length; i++) {\n        let char = text2.charAt(i);\n        let glyph = font2.glyphs[char];\n        if (!glyph) {\n          font2.addGlyph(char);\n          glyph = font2.glyphs[char];\n        }\n        width2 += glyph.advance;\n        if (char == \" \" || char == \"-\") {\n          widthAfterLastBreakingChar = width2;\n          lastBreakingChar = i;\n        }\n        if (width2 > maxWidth) {\n          if (lastBreakingChar == -1) {\n            lines.push(text2.substring(start, i));\n            start = i;\n            width2 += glyph.advance;\n          } else {\n            lines.push(text2.substring(start, lastBreakingChar));\n            start = lastBreakingChar + 1;\n            width2 -= widthAfterLastBreakingChar;\n            widthAfterLastBreakingChar = 0;\n            lastBreakingChar = -1;\n          }\n        }\n      }\n      lines.push(text2.substring(start, text2.length));\n      return lines;\n    }\n    static addString(font2, text2, vertices, indices, index2, position2, scale2, offset2, rotation2, idColor) {\n      for (const char of text2) {\n        this.addGlyph(font2, char, vertices, indices, index2++, position2, scale2, offset2, rotation2, idColor);\n      }\n    }\n    static addGlyph(font2, char, vertices, indices, index2, position2, scale2, offset2, rotation2, idColor) {\n      let glyph = font2.glyphs[char];\n      if (!glyph) {\n        font2.addGlyph(char);\n        glyph = font2.glyphs[char];\n      }\n      const vertexOffset = index2 * 4;\n      const width2 = glyph.width * scale2;\n      const height2 = glyph.height * scale2;\n      const top = glyph.top * scale2;\n      const border = font2.border * scale2;\n      const x02 = offset2[0] - border;\n      const x12 = offset2[0] + width2 + border;\n      const y02 = offset2[1] + top + border;\n      const y12 = offset2[1] + top - height2 - border;\n      const z02 = offset2[2];\n      set$3(this._topLeft, x02, y02, z02);\n      set$3(this._topRight, x12, y02, z02);\n      set$3(this._bottomLeft, x02, y12, z02);\n      set$3(this._bottomRight, x12, y12, z02);\n      if (rotation2) {\n        transformQuat(this._topLeft, this._topLeft, rotation2);\n        transformQuat(this._topRight, this._topRight, rotation2);\n        transformQuat(this._bottomLeft, this._bottomLeft, rotation2);\n        transformQuat(this._bottomRight, this._bottomRight, rotation2);\n      }\n      add(this._vec3, this._topLeft, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset, this._vec3);\n      add(this._vec3, this._topRight, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 1, this._vec3);\n      add(this._vec3, this._bottomLeft, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 2, this._vec3);\n      add(this._vec3, this._bottomRight, position2);\n      PositionTexturePickVertex.setPosition(vertices, vertexOffset + 3, this._vec3);\n      set(this._vec2, glyph.u0, glyph.v0);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset, this._vec2);\n      set(this._vec2, glyph.u1, glyph.v0);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 1, this._vec2);\n      set(this._vec2, glyph.u0, glyph.v1);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 2, this._vec2);\n      set(this._vec2, glyph.u1, glyph.v1);\n      PositionTexturePickVertex.setTexCoord(vertices, vertexOffset + 3, this._vec2);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 1, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 2, idColor);\n      PositionTexturePickVertex.setIdColor(vertices, vertexOffset + 3, idColor);\n      offset2[0] += glyph.advance * scale2;\n      const indexTemplate = Quad$2.INDICES;\n      const indexOffset = index2 * 6;\n      for (let i = 0; i < 6; i++) {\n        indices[indexOffset + i] = indexTemplate[i] + vertexOffset;\n      }\n    }\n  }\n  TextHelper._vec2 = create();\n  TextHelper._vec3 = create$3();\n  TextHelper._topLeft = create$3();\n  TextHelper._topRight = create$3();\n  TextHelper._bottomLeft = create$3();\n  TextHelper._bottomRight = create$3();\n  class PickHelper {\n    static nextPickId() {\n      return this._pickId++;\n    }\n    static encodeNumber(number2, type2, color2) {\n      const encoded = number2 | PickHelper.encodeType(type2);\n      PickHelper.float32ToVec4(encoded, color2);\n    }\n    static decodeNumber(color2) {\n      return color2[0] + (color2[1] << 8) + (color2[2] << 16);\n    }\n    static encodeVec3(vec3, type2, color2) {\n      const encoded = vec3[0] | vec3[1] << 8 | vec3[2] << 16 | PickHelper.encodeType(type2);\n      PickHelper.float32ToVec4(encoded, color2);\n    }\n    static decodeVec3(color2, axes) {\n      axes[0] = color2[0];\n      axes[1] = color2[1];\n      axes[2] = color2[2];\n    }\n    static encodeType(type2) {\n      return type2 << 24;\n    }\n    static decodeType(color2) {\n      return color2[3];\n    }\n    static float32ToVec4(number2, color2) {\n      color2[0] = ((number2 & 255) >>> 0) / 255;\n      color2[1] = ((number2 & 65280) >>> 8) / 255;\n      color2[2] = ((number2 & 16711680) >>> 16) / 255;\n      color2[3] = ((number2 & 4278190080) >>> 24) / 255;\n    }\n    static uint8ArrayToNumber(color2) {\n      return color2[0] + (color2[1] << 8) + (color2[2] << 16) + (color2[3] << 24);\n    }\n  }\n  PickHelper._pickId = 1;\n  class Cartesian3dAxes extends AxesBase {\n    get size() {\n      return this._size;\n    }\n    get isDiscreteX() {\n      return this._isDiscrete[0];\n    }\n    set isDiscreteX(value2) {\n      if (value2 != this._isDiscrete[0]) {\n        this._isDiscrete[0] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteY() {\n      return this._isDiscrete[1];\n    }\n    set isDiscreteY(value2) {\n      if (value2 != this._isDiscrete[1]) {\n        this._isDiscrete[1] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteZ() {\n      return this._isDiscrete[2];\n    }\n    set isDiscreteZ(value2) {\n      if (value2 != this._isDiscrete[2]) {\n        this._isDiscrete[2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (value2 != this._minBoundsZ) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (value2 != this._minBoundsZ) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsOutsideEdge(index2) {\n      return this._isOutsideEdge[index2];\n    }\n    getIsForwardFace(index2) {\n      return this._isForwardFace[index2];\n    }\n    get textVertices() {\n      return this._textVertices;\n    }\n    get textIndices() {\n      return this._textIndices;\n    }\n    getLabelMMatrix(index2) {\n      return this._labelMMatrices[index2];\n    }\n    setLabelPositions(index2, value2) {\n      if (this._labelPositions[index2] != value2) {\n        this._labelPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabels(index2, value2) {\n      if (this._labels[index2] != value2) {\n        this._labels[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabelSizes(index2, value2) {\n      if (this._labelSizes[index2] != value2) {\n        this._labelSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getLabelOrientation(index2) {\n      return this._orientations[index2];\n    }\n    setLabelOrientation(index2, orientation) {\n      if (this._orientations[index2] != orientation) {\n        this._orientations[index2] = orientation;\n        this._hasChanged = true;\n      }\n    }\n    getTitleIndexCount(index2) {\n      return this._titleIndexCounts[index2];\n    }\n    getTitleIndexOffset(index2) {\n      return this._titleIndexOffsets[index2];\n    }\n    getTitleMMatrix(index2) {\n      return this._titleMMatrices[index2];\n    }\n    setTitle(index2, value2) {\n      if (this._titles[index2] != value2) {\n        this._titles[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setTitleSize(index2, value2) {\n      if (this._titleSizes[index2] != value2) {\n        this._titleSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getHeadingIndexCount(index2) {\n      return this._headingIndexCounts[index2];\n    }\n    getHeadingIndexOffset(index2) {\n      return this._headingIndexOffsets[index2];\n    }\n    getHeadingMMatrix(index2) {\n      return this._headingMMatrices[index2];\n    }\n    setHeading(index2, value2) {\n      if (this._headings[index2] != value2) {\n        this._headings[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setHeadingSize(index2, value2) {\n      if (this._headingSizes[index2] != value2) {\n        this._headingSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsLeftToRightHorizontal(index2) {\n      return this._isLeftToRightHorizontal[index2];\n    }\n    getIsLeftToRightVertical(index2) {\n      return this._isLeftToRightVertical[index2];\n    }\n    getAxesLeftToRightIndexCount(index2) {\n      return this._axesLeftToRightIndexCounts[index2];\n    }\n    getAxesRightToLeftIndexCount(index2) {\n      return this._axesRightToLeftIndexCounts[index2];\n    }\n    getAxesLeftToRightIndexOffset(index2) {\n      return this._axesLeftToRightIndexOffsets[index2];\n    }\n    getAxesRightToLeftIndexOffset(index2) {\n      return this._axesRightToLeftIndexOffsets[index2];\n    }\n    get gridVertices() {\n      return this._gridVertices;\n    }\n    get gridIndices() {\n      return this._gridIndices;\n    }\n    getGridTicksIndexCount(index2) {\n      return this._gridTicksIndexCounts[index2];\n    }\n    getGridTicksIndexOffset(index2) {\n      return this._gridTicksIndexOffsets[index2];\n    }\n    getGridFaceIndexCount(index2) {\n      return this._gridFaceIndexCounts[index2];\n    }\n    getGridFaceIndexOffset(index2) {\n      return this._gridFaceIndexOffsets[index2];\n    }\n    getGridTicksMMatrix(index2) {\n      return this._gridTicksMMatrices[index2];\n    }\n    getGridFaceMMatrix(index2) {\n      return this._gridFaceMMatrices[index2];\n    }\n    getGridTicksScale(index2) {\n      return this._gridTicksScales[index2];\n    }\n    getGridFaceZero(index2) {\n      return this._gridFaceZeros[index2];\n    }\n    getGridTicksZero(index2) {\n      return this._gridTicksZeros[index2];\n    }\n    getGridFaceMinorGridlines(index2) {\n      return this._gridFaceMinorGridlines[index2];\n    }\n    getGridTicksMinorGridlines(index2) {\n      return this._gridTicksMinorGridlines[index2];\n    }\n    setTickPositions(index2, value2) {\n      if (this._gridTicksPositions[index2] != value2) {\n        this._gridTicksPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingX() {\n      return this._scalingX;\n    }\n    set scalingX(value2) {\n      if (value2 != this._scalingX) {\n        this._scalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingY() {\n      return this._scalingY;\n    }\n    set scalingY(value2) {\n      if (value2 != this._scalingY) {\n        this._scalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingZ() {\n      return this._scalingZ;\n    }\n    set scalingZ(value2) {\n      if (value2 != this._scalingZ) {\n        this._scalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offset[12];\n    }\n    set offsetX(value2) {\n      if (value2 != this._offset[12]) {\n        this._offset[12] = value2;\n      }\n    }\n    get offsetY() {\n      return this._offset[13];\n    }\n    set offsetY(value2) {\n      if (value2 != this._offset[13]) {\n        this._offset[13] = value2;\n      }\n    }\n    get offsetZ() {\n      return this._offset[14];\n    }\n    set offsetZ(value2) {\n      if (value2 != this._offset[14]) {\n        this._offset[14] = value2;\n      }\n    }\n    constructor(core) {\n      super(core);\n      this._size = create$3();\n      this._translation = create$3();\n      this._normal = create$3();\n      this._forward = create$3();\n      this._right = create$3();\n      this._up = create$3();\n      this._texCoord = create();\n      this._bounds = create$2();\n      this._vec3 = create$3();\n      this._vec4 = create$2();\n      this._mat3 = create$5();\n      this._isDiscrete = [false, false, false];\n      this._minBoundsX = 0;\n      this._minBoundsY = 0;\n      this._minBoundsZ = 0;\n      this._maxBoundsX = 0;\n      this._maxBoundsY = 0;\n      this._maxBoundsZ = 0;\n      this._isForwardFace = [];\n      this._isForwardEdge = [];\n      this._isOutsideEdge = [];\n      for (let i = 0; i < 6; i++) {\n        this._isForwardFace.push(false);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._isForwardEdge.push(false);\n        this._isOutsideEdge.push(false);\n      }\n      this._textOffset = create$3();\n      this._textPosition = create$3();\n      this._distances = [];\n      for (let i = 0; i < 12; i++) {\n        this._distances.push(0);\n      }\n      this._labelPositions = [];\n      this._labels = [];\n      this._labelSizes = [];\n      this._maxLabelSize = [];\n      this._axesLeftToRightIndexCounts = [];\n      this._axesRightToLeftIndexCounts = [];\n      this._axesLeftToRightIndexOffsets = [];\n      this._axesRightToLeftIndexOffsets = [];\n      this._labelMMatrices = [];\n      this._orientations = [];\n      for (let i = 0; i < 3; i++) {\n        this._maxLabelSize.push(create());\n        this._orientations.push(AxesTextOrientation.parallel);\n        this._axesLeftToRightIndexCounts.push(0);\n        this._axesRightToLeftIndexCounts.push(0);\n        this._axesLeftToRightIndexOffsets.push(0);\n        this._axesRightToLeftIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._labelMMatrices.push(create$4());\n      }\n      this._titles = [];\n      this._titleSizes = [];\n      this._titleIndexCounts = [];\n      this._titleIndexOffsets = [];\n      this._titleMMatrices = [];\n      for (let i = 0; i < 3; i++) {\n        this._titles.push(null);\n        this._titleSizes.push(core.config.axesTextTitleSize);\n        this._titleIndexCounts.push(0);\n        this._titleIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._titleMMatrices.push(create$4());\n      }\n      this._headings = [];\n      this._headingSizes = [];\n      this._headingIndexCounts = [];\n      this._headingIndexOffsets = [];\n      this._headingMMatrices = [];\n      this.isHeadingVisible = [];\n      for (let i = 0; i < 3; i++) {\n        this._headings.push(null);\n        this._headingSizes.push(core.config.axesTextHeadingSize);\n        this._headingIndexCounts.push(0);\n        this._headingIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 12; i++) {\n        this._headingMMatrices.push(create$4());\n        this.isHeadingVisible.push(true);\n      }\n      this.isEdgeVisible = [];\n      this._edgePosition = create$3();\n      this._edgePositive = create$3();\n      this._edgeNormal = create$3();\n      this._edgeNormalTemp = create$3();\n      this._edgePositiveTemp = create$3();\n      this._isLeftToRightHorizontal = [];\n      this._isLeftToRightVertical = [];\n      this._edgeHorizontalRight = [];\n      this._edgeHorizontalUp = [];\n      this._edgeHorizontalForward = [];\n      this._edgeVerticalRight = [];\n      this._edgeVerticalUp = [];\n      this._edgeVerticalForward = [];\n      for (let i = 0; i < 12; i++) {\n        this.isEdgeVisible.push(true);\n        this._isLeftToRightHorizontal.push(false);\n        this._isLeftToRightVertical.push(false);\n        this._edgeHorizontalRight.push(create$3());\n        this._edgeHorizontalUp.push(create$3());\n        this._edgeHorizontalForward.push(create$3());\n        this._edgeVerticalRight.push(create$3());\n        this._edgeVerticalUp.push(create$3());\n        this._edgeVerticalForward.push(create$3());\n      }\n      this.isFaceVisible = [];\n      for (let i = 0; i < 6; i++) {\n        this.isFaceVisible.push(true);\n      }\n      this.arePickDivisionsVisible = [];\n      this.areFacesVisible = [];\n      this._indexTemplate = Quad$2.INDICES;\n      this.zero = create$3();\n      this._gridTicksZeros = [];\n      this._gridFaceZeros = [];\n      this.minorGridlines = fromValues$3(1, 1, 1);\n      this._gridTicksMinorGridlines = [];\n      this._gridFaceMinorGridlines = [];\n      this._gridTicksPositions = [];\n      this._gridTicksScales = [];\n      this._gridTicksIndexCounts = [];\n      this._gridTicksIndexOffsets = [];\n      this._gridFaceScale = create$3();\n      this._gridFaceIndexCounts = [];\n      this._gridFaceIndexOffsets = [];\n      this._gridFaceMMatrices = [];\n      this._gridTicksMMatrices = [];\n      this._gridTicksRotations = [];\n      for (let i = 0; i < 3; i++) {\n        this.arePickDivisionsVisible.push(true);\n        this.areFacesVisible.push(true);\n        this._gridTicksZeros.push(create());\n        this._gridFaceZeros.push(create());\n        this._gridTicksMinorGridlines.push(create());\n        this._gridFaceMinorGridlines.push(create());\n        this._gridTicksScales.push(create$3());\n        this._gridTicksIndexCounts.push(0);\n        this._gridTicksIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 6; i++) {\n        this._gridFaceIndexCounts.push(0);\n        this._gridFaceIndexOffsets.push(0);\n        this._gridFaceMMatrices.push(create$4());\n      }\n      for (let i = 0; i < 12; i++) {\n        this._gridTicksMMatrices.push(create$4());\n        this._gridTicksRotations.push(create$4());\n        const _mat4 = this._gridTicksRotations[i];\n        _mat4[0] = Cube.EDGE_POSITIVES[i][0];\n        _mat4[1] = Cube.EDGE_POSITIVES[i][1];\n        _mat4[2] = Cube.EDGE_POSITIVES[i][2];\n        _mat4[4] = Cube.EDGE_NORMALS[i][0];\n        _mat4[5] = Cube.EDGE_NORMALS[i][1];\n        _mat4[6] = Cube.EDGE_NORMALS[i][2];\n        cross(this._vec3, Cube.EDGE_POSITIVES[i], Cube.EDGE_NORMALS[i]);\n        _mat4[8] = this._vec3[0];\n        _mat4[9] = this._vec3[1];\n        _mat4[10] = this._vec3[2];\n      }\n      this._fromValues = [null, null, null];\n      this._toValues = [null, null, null];\n      this.isDivisionPickingEnabled = [false, false, false];\n      this.isLabelPickingEnabled = [false, false, false];\n      this.isTitlePickingEnabled = [false, false, false];\n      this.isHeadingPickingEnabled = [false, false, false];\n      this.isAxisReversed = [false, false, false];\n      this._scalingX = 1;\n      this._scalingY = 1;\n      this._scalingZ = 1;\n      this._offset = create$4();\n    }\n    initialize() {\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this.isInitialized) {\n        if (this._hasChanged) {\n          const start = window.performance.now();\n          this._hasChanged = false;\n          set$3(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, this._maxBoundsZ - this._minBoundsZ);\n          const maxBounds = Math.max(this._size[0], Math.max(this._size[1], this._size[2]));\n          this._size[0] *= this._scalingX / maxBounds;\n          this._size[1] *= this._scalingY / maxBounds;\n          this._size[2] *= this._scalingZ / maxBounds;\n          this._updateGrids(this._size);\n          this._updateText(this._size);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n          this._core.log.write(LogLevel.info, `cartesian3d updated ${Math.round(window.performance.now() - start)}ms`);\n        }\n        multiply$2(this._mMatrix, this.mMatrix, this._offset);\n        this._mvMatrix = create$4();\n        multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n        fromMat4(this._mat3, this._mvMatrix);\n        for (let faceId = 0; faceId < 6; faceId++) {\n          multiply$1(this._vec3, Cube.FACE_POSITIONS[faceId], this._size);\n          transformMat4$2(this._forward, this._vec3, this._mvMatrix);\n          transformMat3(this._normal, Cube.FACE_NORMALS[faceId], this._mat3);\n          this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n        }\n        this._forward[0] = this._mat3[2];\n        this._forward[1] = this._mat3[5];\n        this._forward[2] = this._mat3[8];\n        for (let edgeId = 0; edgeId < 12; edgeId++) {\n          const faceIds = Cube.EDGE_FACES[edgeId];\n          const forward1 = this._isForwardFace[faceIds[0]];\n          const forward2 = this._isForwardFace[faceIds[1]];\n          const outsideEdge = forward1 != forward2;\n          this._isOutsideEdge[edgeId] = outsideEdge;\n          if (outsideEdge) {\n            this._isForwardEdge[edgeId] = dot$1(Cube.EDGE_FORWARDS[edgeId], this._forward) < 0;\n          }\n          this._distances[edgeId] = 0;\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          if (this.arePickDivisionsVisible[axisId]) {\n            set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n            set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n            const gridTicksScale = this._gridTicksScales[axisId];\n            for (let edge = 0; edge < 4; edge++) {\n              const edgeId = Cube.AXIS_EDGES[axisId][edge];\n              if (this._isOutsideEdge[edgeId] && this.isEdgeVisible[edgeId]) {\n                let distance2 = this._distances[edgeId];\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n                scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n                translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                if (!this._isForwardEdge[edgeId]) {\n                  scale$1(gridTicksMMatrix, gridTicksMMatrix, Constants.VECTOR3_REFLECTX);\n                }\n                scale$1(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                this._distances[edgeId] = distance2;\n              }\n            }\n          }\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          if (this.areFacesVisible[axisId]) {\n            const axisId2 = axisId == 0 ? 1 : 0;\n            const axisId3 = axisId == 2 ? 1 : 2;\n            set(this._gridFaceZeros[axisId], this.zero[axisId2], this.zero[axisId3]);\n            set(this._gridFaceMinorGridlines[axisId], this.minorGridlines[axisId2], this.minorGridlines[axisId3]);\n            for (let face = 0; face < 2; face++) {\n              const faceId = Cube.AXIS_FACES[axisId][face];\n              if (this._isForwardFace[faceId]) {\n                const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n                scale$1(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n                if (this._size[axisId] > 0) {\n                  translate(gridFaceMMatrix, gridFaceMMatrix, Cube.FACE_POSITIONS[faceId]);\n                }\n              }\n            }\n          }\n        }\n        for (let axisId = 0; axisId < 3; axisId++) {\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (this._isOutsideEdge[edgeId]) {\n              multiply$1(this._edgePosition, Cube.EDGE_POSITIONS[edgeId], this._size);\n              transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n              normalize$2(this._forward, this._edgePosition);\n              negate(this._forward, this._forward);\n              cross(this._right, Constants.VECTOR3_UNITY, this._forward);\n              normalize$2(this._right, this._right);\n              cross(this._up, this._forward, this._right);\n              transformMat3(this._edgeNormal, Cube.EDGE_NORMALS[edgeId], this._mat3);\n              transformMat3(this._edgePositive, Cube.EDGE_POSITIVES[edgeId], this._mat3);\n              copy$3(this._edgeNormalTemp, this._edgeNormal);\n              copy$3(this._edgePositiveTemp, this._edgePositive);\n              const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n              const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n              const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n              if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n                copy$3(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n              } else {\n                negate(edgeHorizontalUp, Cube.EDGE_NORMALS[edgeId]);\n                negate(this._edgeNormalTemp, this._edgeNormalTemp);\n              }\n              if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n                this._isLeftToRightHorizontal[edgeId] = true;\n                copy$3(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n              } else {\n                this._isLeftToRightHorizontal[edgeId] = false;\n                negate(edgeHorizontalRight, Cube.EDGE_POSITIVES[edgeId]);\n                negate(this._edgePositiveTemp, this._edgePositiveTemp);\n              }\n              cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n              if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n                this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n                negate(edgeHorizontalRight, edgeHorizontalRight);\n              }\n              cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n              const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n              const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n              const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n              if (dot$1(this._edgeNormal, this._right) < 0) {\n                copy$3(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n              } else {\n                negate(edgeVerticalUp, Cube.EDGE_NORMALS[edgeId]);\n                negate(this._edgeNormal, this._edgeNormal);\n              }\n              if (dot$1(this._edgePositive, this._up) < 0) {\n                this._isLeftToRightVertical[edgeId] = true;\n                copy$3(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n              } else {\n                this._isLeftToRightVertical[edgeId] = false;\n                negate(edgeVerticalRight, Cube.EDGE_POSITIVES[edgeId]);\n                negate(this._edgePositive, this._edgePositive);\n              }\n              cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n              if (dot$1(edgeVerticalForward, this._forward) < 0) {\n                this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n                negate(edgeVerticalRight, edgeVerticalRight);\n              }\n              cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n              if (this.isEdgeVisible[edgeId]) {\n                if (this._labels[axisId]) {\n                  this._updateLabels(axisId, edgeId);\n                }\n                if (this._titles[axisId]) {\n                  this._updateTitle(axisId, edgeId);\n                }\n              }\n              if (this.isHeadingVisible[edgeId]) {\n                this._updateHeading(axisId, edgeId);\n              }\n            }\n          }\n        }\n      }\n    }\n    _updateLabels(axisId, edgeId) {\n      const orientation = this._orientations[axisId];\n      let distance2 = this._distances[edgeId];\n      let maxLabelSize = this._maxLabelSize[axisId][1];\n      if (orientation == AxesTextOrientation.parallel)\n        maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n      distance2 += maxLabelSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const labelMMatrix = this._labelMMatrices[edgeId];\n      labelMMatrix[12] = this._vec3[0];\n      labelMMatrix[13] = this._vec3[1];\n      labelMMatrix[14] = this._vec3[2];\n      if (orientation == AxesTextOrientation.parallel) {\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      } else {\n        const right = this._edgeVerticalRight[edgeId];\n        const up = this._edgeVerticalUp[edgeId];\n        const forward = this._edgeVerticalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      }\n      multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n      if (orientation == AxesTextOrientation.perpendicular) {\n        multiply$2(labelMMatrix, labelMMatrix, Constants.MAT4_ROTATION_MINUS_90);\n      }\n      distance2 += maxLabelSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateTitle(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n      distance2 += titleTextSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const titleMMatrix = this._titleMMatrices[edgeId];\n      titleMMatrix[12] = this._vec3[0];\n      titleMMatrix[13] = this._vec3[1];\n      titleMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      titleMMatrix[0] = right[0];\n      titleMMatrix[1] = right[1];\n      titleMMatrix[2] = right[2];\n      titleMMatrix[4] = up[0];\n      titleMMatrix[5] = up[1];\n      titleMMatrix[6] = up[2];\n      titleMMatrix[8] = forward[0];\n      titleMMatrix[9] = forward[1];\n      titleMMatrix[10] = forward[2];\n      multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n      distance2 += titleTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateHeading(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n      distance2 += headingTextSize * 0.5;\n      multiply$1(this._vec3, Cube.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Cube.EDGE_NORMALS[edgeId], distance2);\n      const headingMMatrix = this._headingMMatrices[edgeId];\n      headingMMatrix[12] = this._vec3[0];\n      headingMMatrix[13] = this._vec3[1];\n      headingMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      headingMMatrix[0] = right[0];\n      headingMMatrix[1] = right[1];\n      headingMMatrix[2] = right[2];\n      headingMMatrix[4] = up[0];\n      headingMMatrix[5] = up[1];\n      headingMMatrix[6] = up[2];\n      headingMMatrix[8] = forward[0];\n      headingMMatrix[9] = forward[1];\n      headingMMatrix[10] = forward[2];\n      multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n      distance2 += headingTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateGrids(size) {\n      let offset2 = 0;\n      this.pickGridLookup = {};\n      this._pickGrid = [];\n      const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n      const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n      const zDivisions = this._gridTicksPositions[2] ? this._gridTicksPositions[2].length - 1 : 0;\n      const count2 = 2 * (xDivisions * yDivisions) + 2 * (xDivisions * zDivisions) + 2 * (yDivisions * zDivisions) + xDivisions + yDivisions + zDivisions;\n      const byteLength = PickGridVertex.SIZE_BYTES * count2 * 4;\n      if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n        this._gridVertices = new ArrayBuffer(byteLength);\n        this._gridVerticesView = new DataView(this._gridVertices);\n        this._gridIndices = new Uint16Array(count2 * 6);\n      }\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const width2 = size[axisId];\n        set$3(this._gridTicksScales[axisId], width2, this._gridPickDivisionHeight, 1);\n        offset2 = this._updateGridTicks(axisId, this._gridVerticesView, this._gridIndices, offset2);\n        for (let face = 0; face < 2; face++) {\n          const faceId = Cube.AXIS_FACES[axisId][face];\n          offset2 = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset2);\n        }\n        this._gridFaceScale[axisId] = size[axisId] == 0 ? 1 : size[axisId];\n      }\n    }\n    _updateText(size) {\n      let glyphOffset = 0;\n      let count2 = 0;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const labels = this._labels[axisId];\n        if (labels) {\n          for (let i = 0; i < labels.length; i++) {\n            count2 += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n          }\n        }\n        const title = this._titles[axisId];\n        if (title) {\n          count2 += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n        }\n        const heading = this._headings[axisId];\n        if (heading) {\n          count2 += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n      }\n      const byteLength = PositionTexturePickVertex.SIZE_BYTES * count2 * 4;\n      if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n        this._textVertices = new ArrayBuffer(byteLength);\n        this._textVerticesView = new DataView(this._textVertices);\n        this._textIndices = new Uint16Array(count2 * 6);\n      }\n      this.pickLabelLookup = {};\n      this._pickLabel = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._labels[axisId]) {\n          const width2 = size[axisId];\n          const maxLabelSize = this._maxLabelSize[axisId];\n          const orientation = this._orientations[axisId];\n          set(maxLabelSize, 0, 0);\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateLeftToRightAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateRightToLeftAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesLeftToRightIndexCounts[axisId] = 0;\n          this._axesRightToLeftIndexCounts[axisId] = 0;\n          this._maxLabelSize[axisId][0] = 0;\n          this._maxLabelSize[axisId][1] = 0;\n        }\n      }\n      this.pickTitleLookup = {};\n      this._pickTitle = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._titles[axisId]) {\n          set$3(this._textPosition, 0, 0, 0);\n          set$3(this._textOffset, 0, 0, 0);\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n          const scale2 = this._titleSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n          this.pickTitleLookup[pickId] = this._pickTitle.length;\n          this._pickTitle.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          this._titleIndexCounts[axisId] = 0;\n        }\n      }\n      this.pickHeadingLookup = {};\n      this._pickHeading = [];\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (this._headings[axisId]) {\n          set$3(this._textPosition, 0, 0, 0);\n          set$3(this._textOffset, 0, 0, 0);\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n          const scale2 = this._headingSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n          this.pickHeadingLookup[pickId] = this._pickHeading.length;\n          this._pickHeading.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          this._headingIndexCounts[axisId] = 0;\n        }\n      }\n    }\n    _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions[label2] : positions[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$3(this._textPosition, (position2 - 0.5) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = position2 == 0 ? 0 : position2 == 1 ? -width2 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            maxSize[0] = Math.max(width2, maxSize[0]);\n            maxSize[1] = Math.max(lineHeight2, maxSize[1]);\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$3(this._textPosition, 0, (position2 - 0.5) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = position2 == 0 ? 0 : position2 == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n            }\n            maxSize[0] = Math.max(lineHeight2, maxSize[0]);\n            maxSize[1] = Math.max(width2, maxSize[1]);\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions[label2] : positions[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$3(this._textPosition, (0.5 - position2) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = label2 == 0 ? -width2 : label2 == labels.length - 1 ? 0 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$3(this._textPosition, 0, (0.5 - position2) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = label2 == 0 ? -maxGlyphTop : label2 == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n            }\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset2) {\n      this._gridTicksIndexOffsets[axisId] = offset2 * 6;\n      if (this._gridTicksPositions[axisId]) {\n        const axes = create$3();\n        const positions = this._gridTicksPositions[axisId];\n        const isAxisReversed = this.isAxisReversed[axisId];\n        let vertexOffset = offset2 * 4;\n        for (let position2 = 0; position2 < positions.length - 1; position2++) {\n          const left = isAxisReversed ? 1 - positions[position2 + 1] - 0.5 : positions[position2] - 0.5;\n          const right = isAxisReversed ? 1 - positions[position2] - 0.5 : positions[position2 + 1] - 0.5;\n          axes[axisId] = position2 + 1;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n          this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n          this._pickGrid.push(axes[0]);\n          this._pickGrid.push(axes[1]);\n          this._pickGrid.push(axes[2]);\n          let indexOffset = offset2 * 6;\n          for (let j = 0; j < this._indexTemplate.length; j++) {\n            indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n          }\n          set$2(this._bounds, left + 0.5, 0, right + 0.5, 1);\n          this._translation[0] = left;\n          this._translation[1] = 0.5;\n          this._translation[2] = 0;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 1;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = left;\n          this._translation[1] = -0.5;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 0;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          offset2++;\n        }\n      }\n      this._gridTicksIndexCounts[axisId] = offset2 * 6 - this._gridTicksIndexOffsets[axisId];\n      return offset2;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset2) {\n      set$3(this._translation, 0, 0, 0);\n      this._gridFaceIndexOffsets[faceId] = offset2 * 6;\n      const axisId2 = axisId == 0 ? 1 : 0;\n      const axisId3 = axisId == 2 ? 1 : 2;\n      if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n        const axes = create$3();\n        negate(this._normal, Cube.FACE_NORMALS[faceId]);\n        const positions2 = this._gridTicksPositions[axisId2];\n        const positions3 = this._gridTicksPositions[axisId3];\n        const isAxisReversed2 = this.isAxisReversed[axisId2];\n        const isAxisReversed3 = this.isAxisReversed[axisId3];\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId2] = position2 + 1;\n          let vertexOffset = offset2 * 4;\n          for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n            const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n            const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n            axes[axisId3] = position3 + 1;\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n            this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n            this._pickGrid.push(axes[0]);\n            this._pickGrid.push(axes[1]);\n            this._pickGrid.push(axes[2]);\n            let indexOffset = offset2 * 6;\n            for (let i = 0; i < this._indexTemplate.length; i++) {\n              indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n            }\n            set$2(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = max3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = max3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = min3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = min3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            offset2++;\n          }\n        }\n      }\n      this._gridFaceIndexCounts[faceId] = offset2 * 6 - this._gridFaceIndexOffsets[faceId];\n      return offset2;\n    }\n  }\n  class Cartesian2dAxes extends AxesBase {\n    get size() {\n      return this._size;\n    }\n    get isDiscreteX() {\n      return this._isDiscrete[0];\n    }\n    set isDiscreteX(value2) {\n      if (value2 != this._isDiscrete[0]) {\n        this._isDiscrete[0] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get isDiscreteY() {\n      return this._isDiscrete[1];\n    }\n    set isDiscreteY(value2) {\n      if (value2 != this._isDiscrete[1]) {\n        this._isDiscrete[1] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (value2 != this._minBoundsX) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (value2 != this._minBoundsY) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsOutsideEdge(index2) {\n      return this._isOutsideEdge[index2];\n    }\n    getIsForwardFace(index2) {\n      return this._isForwardFace[index2];\n    }\n    get textVertices() {\n      return this._textVertices;\n    }\n    get textIndices() {\n      return this._textIndices;\n    }\n    getLabelMMatrix(index2) {\n      return this._labelMMatrices[index2];\n    }\n    setLabelPositions(index2, value2) {\n      if (this._labelPositions[index2] != value2) {\n        this._labelPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabels(index2, value2) {\n      if (this._labels[index2] != value2) {\n        this._labels[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setLabelSizes(index2, value2) {\n      if (this._labelSizes[index2] != value2) {\n        this._labelSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getLabelOrientation(index2) {\n      return this._orientations[index2];\n    }\n    setLabelOrientation(index2, orientation) {\n      if (this._orientations[index2] != orientation) {\n        this._orientations[index2] = orientation;\n        this._hasChanged = true;\n      }\n    }\n    getTitleIndexCount(index2) {\n      return this._titleIndexCounts[index2];\n    }\n    getTitleIndexOffset(index2) {\n      return this._titleIndexOffsets[index2];\n    }\n    getTitleMMatrix(index2) {\n      return this._titleMMatrices[index2];\n    }\n    setTitle(index2, value2) {\n      if (this._titles[index2] != value2) {\n        this._titles[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setTitleSize(index2, value2) {\n      if (this._titleSizes[index2] != value2) {\n        this._titleSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getHeadingIndexCount(index2) {\n      return this._headingIndexCounts[index2];\n    }\n    getHeadingIndexOffset(index2) {\n      return this._headingIndexOffsets[index2];\n    }\n    getHeadingMMatrix(index2) {\n      return this._headingMMatrices[index2];\n    }\n    setHeading(index2, value2) {\n      if (this._headings[index2] != value2) {\n        this._headings[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    setHeadingSize(index2, value2) {\n      if (this._headingSizes[index2] != value2) {\n        this._headingSizes[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    getIsLeftToRightHorizontal(index2) {\n      return this._isLeftToRightHorizontal[index2];\n    }\n    getIsLeftToRightVertical(index2) {\n      return this._isLeftToRightVertical[index2];\n    }\n    getAxesLeftToRightIndexCount(index2) {\n      return this._axesLeftToRightIndexCounts[index2];\n    }\n    getAxesRightToLeftIndexCount(index2) {\n      return this._axesRightToLeftIndexCounts[index2];\n    }\n    getAxesLeftToRightIndexOffset(index2) {\n      return this._axesLeftToRightIndexOffsets[index2];\n    }\n    getAxesRightToLeftIndexOffset(index2) {\n      return this._axesRightToLeftIndexOffsets[index2];\n    }\n    get gridVertices() {\n      return this._gridVertices;\n    }\n    get gridIndices() {\n      return this._gridIndices;\n    }\n    getGridTicksIndexCount(index2) {\n      return this._gridTicksIndexCounts[index2];\n    }\n    getGridTicksIndexOffset(index2) {\n      return this._gridTicksIndexOffsets[index2];\n    }\n    getGridFaceIndexCount(index2) {\n      return this._gridFaceIndexCounts[index2];\n    }\n    getGridFaceIndexOffset(index2) {\n      return this._gridFaceIndexOffsets[index2];\n    }\n    getGridTicksMMatrix(index2) {\n      return this._gridTicksMMatrices[index2];\n    }\n    getGridFaceMMatrix(index2) {\n      return this._gridFaceMMatrices[index2];\n    }\n    getGridTicksScale(index2) {\n      return this._gridTicksScales[index2];\n    }\n    getGridTicksZero(index2) {\n      return this._gridTicksZeros[index2];\n    }\n    get gridFaceZero() {\n      return this._gridFaceZeros;\n    }\n    get gridFaceMinorGridlines() {\n      return this._gridFaceMinorGridlines;\n    }\n    getGridTicksMinorGridlines(index2) {\n      return this._gridTicksMinorGridlines[index2];\n    }\n    setTickPositions(index2, value2) {\n      if (this._gridTicksPositions[index2] != value2) {\n        this._gridTicksPositions[index2] = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingX() {\n      return this._scalingX;\n    }\n    set scalingX(value2) {\n      if (value2 != this._scalingX) {\n        this._scalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalingY() {\n      return this._scalingY;\n    }\n    set scalingY(value2) {\n      if (value2 != this._scalingY) {\n        this._scalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offset[12];\n    }\n    set offsetX(value2) {\n      if (value2 != this._offset[12]) {\n        this._offset[12] = value2;\n      }\n    }\n    get offsetY() {\n      return this._offset[13];\n    }\n    set offsetY(value2) {\n      if (value2 != this._offset[13]) {\n        this._offset[13] = value2;\n      }\n    }\n    set rotation(value2) {\n      if (this._rotation != value2) {\n        this._rotation = value2;\n        this._rMatrix = create$4();\n        fromQuat(this._rMatrix, value2);\n      }\n    }\n    constructor(core) {\n      super(core);\n      this._size = create$3();\n      this._translation = create$3();\n      this._normal = create$3();\n      this._forward = create$3();\n      this._right = create$3();\n      this._up = create$3();\n      this._texCoord = create();\n      this._bounds = create$2();\n      this._vec3 = create$3();\n      this._vec4 = create$2();\n      this._mat3 = create$5();\n      this._isDiscrete = [false, false];\n      this._minBoundsX = 0;\n      this._minBoundsY = 0;\n      this._maxBoundsX = 0;\n      this._maxBoundsY = 0;\n      this._isForwardFace = [];\n      this._isForwardEdge = [];\n      this._isOutsideEdge = [];\n      for (let i = 0; i < 2; i++) {\n        this._isForwardFace.push(false);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._isForwardEdge.push(false);\n        this._isOutsideEdge.push(false);\n      }\n      this._textOffset = create$3();\n      this._textPosition = create$3();\n      this._distances = [];\n      for (let i = 0; i < 4; i++) {\n        this._distances.push(0);\n      }\n      this._labelPositions = [];\n      this._labels = [];\n      this._labelSizes = [];\n      this._maxLabelSize = [];\n      this._axesLeftToRightIndexCounts = [];\n      this._axesRightToLeftIndexCounts = [];\n      this._axesLeftToRightIndexOffsets = [];\n      this._axesRightToLeftIndexOffsets = [];\n      this._labelMMatrices = [];\n      this._orientations = [];\n      for (let i = 0; i < 2; i++) {\n        this._maxLabelSize.push(create());\n        this._orientations.push(AxesTextOrientation.parallel);\n        this._axesLeftToRightIndexCounts.push(0);\n        this._axesRightToLeftIndexCounts.push(0);\n        this._axesLeftToRightIndexOffsets.push(0);\n        this._axesRightToLeftIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._labelMMatrices.push(create$4());\n      }\n      this._titles = [];\n      this._titleSizes = [];\n      this._titleIndexCounts = [];\n      this._titleIndexOffsets = [];\n      this._titleMMatrices = [];\n      for (let i = 0; i < 2; i++) {\n        this._titles.push(null);\n        this._titleSizes.push(core.config.axesTextTitleSize);\n        this._titleIndexCounts.push(0);\n        this._titleIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._titleMMatrices.push(create$4());\n      }\n      this._headings = [];\n      this._headingSizes = [];\n      this._headingIndexCounts = [];\n      this._headingIndexOffsets = [];\n      this._headingMMatrices = [];\n      this.isHeadingVisible = [];\n      for (let i = 0; i < 2; i++) {\n        this._headings.push(null);\n        this._headingSizes.push(core.config.axesTextHeadingSize);\n        this._headingIndexCounts.push(0);\n        this._headingIndexOffsets.push(0);\n      }\n      for (let i = 0; i < 4; i++) {\n        this._headingMMatrices.push(create$4());\n        this.isHeadingVisible.push(true);\n      }\n      this.isEdgeVisible = [];\n      this._edgePosition = create$3();\n      this._edgePositive = create$3();\n      this._edgeNormal = create$3();\n      this._edgeNormalTemp = create$3();\n      this._edgePositiveTemp = create$3();\n      this._isLeftToRightHorizontal = [];\n      this._isLeftToRightVertical = [];\n      this._edgeHorizontalRight = [];\n      this._edgeHorizontalUp = [];\n      this._edgeHorizontalForward = [];\n      this._edgeVerticalRight = [];\n      this._edgeVerticalUp = [];\n      this._edgeVerticalForward = [];\n      for (let i = 0; i < 4; i++) {\n        this.isEdgeVisible.push(true);\n        this._isLeftToRightHorizontal.push(false);\n        this._isLeftToRightVertical.push(false);\n        this._edgeHorizontalRight.push(create$3());\n        this._edgeHorizontalUp.push(create$3());\n        this._edgeHorizontalForward.push(create$3());\n        this._edgeVerticalRight.push(create$3());\n        this._edgeVerticalUp.push(create$3());\n        this._edgeVerticalForward.push(create$3());\n      }\n      this.isFaceVisible = [];\n      for (let i = 0; i < 2; i++) {\n        this.isFaceVisible.push(true);\n      }\n      this.arePickDivisionsVisible = [];\n      this.areFacesVisible = [];\n      this._indexTemplate = Quad$2.INDICES;\n      this.zero = create$3();\n      this._gridTicksZeros = [];\n      this._gridFaceZeros = create();\n      this.minorGridlines = fromValues$3(1, 1, 1);\n      this._gridTicksMinorGridlines = [];\n      this._gridFaceMinorGridlines = create();\n      this._gridTicksPositions = [];\n      this._gridTicksScales = [];\n      this._gridTicksIndexCounts = [];\n      this._gridTicksIndexOffsets = [];\n      this._gridFaceScale = create$3();\n      this._gridFaceIndexCounts = [];\n      this._gridFaceIndexOffsets = [];\n      this._gridFaceMMatrices = [];\n      this._gridTicksMMatrices = [];\n      this._gridTicksRotations = [];\n      for (let i = 0; i < 2; i++) {\n        this.arePickDivisionsVisible.push(true);\n        this.areFacesVisible.push(true);\n        this._gridTicksZeros.push(create());\n        this._gridTicksMinorGridlines.push(create());\n        this._gridTicksScales.push(create$3());\n        this._gridTicksIndexCounts.push(0);\n        this._gridTicksIndexOffsets.push(0);\n        this._gridFaceIndexCounts.push(0);\n        this._gridFaceIndexOffsets.push(0);\n        this._gridFaceMMatrices.push(create$4());\n      }\n      for (let i = 0; i < 4; i++) {\n        this._gridTicksMMatrices.push(create$4());\n        this._gridTicksRotations.push(create$4());\n        const _mat4 = this._gridTicksRotations[i];\n        _mat4[0] = Quad$2.EDGE_POSITIVES[i][0];\n        _mat4[1] = Quad$2.EDGE_POSITIVES[i][1];\n        _mat4[2] = Quad$2.EDGE_POSITIVES[i][2];\n        _mat4[4] = Quad$2.EDGE_NORMALS[i][0];\n        _mat4[5] = Quad$2.EDGE_NORMALS[i][1];\n        _mat4[6] = Quad$2.EDGE_NORMALS[i][2];\n        cross(this._vec3, Quad$2.EDGE_POSITIVES[i], Quad$2.EDGE_NORMALS[i]);\n        _mat4[8] = this._vec3[0];\n        _mat4[9] = this._vec3[1];\n        _mat4[10] = this._vec3[2];\n      }\n      this._fromValues = [null, null];\n      this._toValues = [null, null];\n      this.isDivisionPickingEnabled = [false, false];\n      this.isLabelPickingEnabled = [false, false];\n      this.isTitlePickingEnabled = [false, false];\n      this.isHeadingPickingEnabled = [false, false];\n      this.isAxisReversed = [false, false];\n      this._scalingX = 1;\n      this._scalingY = 1;\n      this._offset = create$4();\n    }\n    initialize() {\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this.isInitialized) {\n        if (this._hasChanged) {\n          const start = window.performance.now();\n          this._hasChanged = false;\n          set$3(this._size, this._maxBoundsX - this._minBoundsX, this._maxBoundsY - this._minBoundsY, 0);\n          const maxBounds = Math.max(this._size[0], this._size[1]);\n          this._size[0] *= this._scalingX / maxBounds;\n          this._size[1] *= this._scalingY / maxBounds;\n          this._updateGrids(this._size);\n          this._updateText(this._size);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n          this._core.log.write(LogLevel.info, `cartesian2d updated ${Math.round(window.performance.now() - start)}ms`);\n        }\n        if (this._rMatrix) {\n          mul(this._mMatrix, this.mMatrix, this._rMatrix);\n          mul(this._mMatrix, this._mMatrix, this._offset);\n        } else {\n          multiply$2(this._mMatrix, this.mMatrix, this._offset);\n        }\n        this._mvMatrix = create$4();\n        multiply$2(this._mvMatrix, this._vMatrix, this._mMatrix);\n        fromMat4(this._mat3, this._mvMatrix);\n        for (let faceId = 0; faceId < 2; faceId++) {\n          transformMat4$2(this._forward, Constants.VECTOR3_ZERO, this._mvMatrix);\n          transformMat3(this._normal, Quad$2.FACE_NORMALS[faceId], this._mat3);\n          this._isForwardFace[faceId] = dot$1(this._normal, this._forward) > 0;\n        }\n        this._forward[0] = this._mat3[2];\n        this._forward[1] = this._mat3[5];\n        this._forward[2] = this._mat3[8];\n        for (let edgeId = 0; edgeId < 4; edgeId++) {\n          this._isForwardEdge[edgeId] = dot$1(Quad$2.EDGE_FORWARDS[edgeId], this._forward) < 0;\n          this._distances[edgeId] = 0;\n        }\n        for (let axisId = 0; axisId < 2; axisId++) {\n          if (this.arePickDivisionsVisible[axisId]) {\n            set(this._gridTicksZeros[axisId], this.zero[axisId], -1);\n            set(this._gridTicksMinorGridlines[axisId], this.minorGridlines[axisId], 1);\n            const gridTicksScale = this._gridTicksScales[axisId];\n            for (let edge = 0; edge < 2; edge++) {\n              const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n              if (this.isEdgeVisible[edgeId]) {\n                let distance2 = this._distances[edgeId];\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                const gridTicksMMatrix = this._gridTicksMMatrices[edgeId];\n                multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n                scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance2);\n                translate(gridTicksMMatrix, this._mMatrix, this._vec3);\n                multiply$2(gridTicksMMatrix, gridTicksMMatrix, this._gridTicksRotations[edgeId]);\n                if (!this._isForwardEdge[edgeId]) {\n                  scale$1(gridTicksMMatrix, gridTicksMMatrix, Constants.VECTOR3_REFLECTX);\n                }\n                scale$1(gridTicksMMatrix, gridTicksMMatrix, gridTicksScale);\n                distance2 += this._gridPickDivisionHeight * 0.5;\n                this._distances[edgeId] = distance2;\n              }\n            }\n          }\n        }\n        set(this._gridFaceZeros, this.zero[0], this.zero[1]);\n        set(this._gridFaceMinorGridlines, this.minorGridlines[0], this.minorGridlines[1]);\n        for (let faceId = 0; faceId < 2; faceId++) {\n          if (this._isForwardFace[faceId]) {\n            const gridFaceMMatrix = this._gridFaceMMatrices[faceId];\n            scale$1(gridFaceMMatrix, this._mMatrix, this._gridFaceScale);\n          }\n        }\n        for (let axisId = 0; axisId < 2; axisId++) {\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n            multiply$1(this._edgePosition, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n            transformMat4$2(this._edgePosition, this._edgePosition, this._mvMatrix);\n            normalize$2(this._forward, this._edgePosition);\n            negate(this._forward, this._forward);\n            cross(this._right, Constants.VECTOR3_UNITY, this._forward);\n            normalize$2(this._right, this._right);\n            cross(this._up, this._forward, this._right);\n            transformMat3(this._edgeNormal, Quad$2.EDGE_NORMALS[edgeId], this._mat3);\n            transformMat3(this._edgePositive, Quad$2.EDGE_POSITIVES[edgeId], this._mat3);\n            copy$3(this._edgeNormalTemp, this._edgeNormal);\n            copy$3(this._edgePositiveTemp, this._edgePositive);\n            const edgeHorizontalRight = this._edgeHorizontalRight[edgeId];\n            const edgeHorizontalUp = this._edgeHorizontalUp[edgeId];\n            const edgeHorizontalForward = this._edgeHorizontalForward[edgeId];\n            if (dot$1(this._edgeNormalTemp, this._up) > 0) {\n              copy$3(edgeHorizontalUp, Quad$2.EDGE_NORMALS[edgeId]);\n            } else {\n              negate(edgeHorizontalUp, Quad$2.EDGE_NORMALS[edgeId]);\n              negate(this._edgeNormalTemp, this._edgeNormalTemp);\n            }\n            if (dot$1(this._edgePositiveTemp, this._right) > 0) {\n              this._isLeftToRightHorizontal[edgeId] = true;\n              copy$3(edgeHorizontalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n            } else {\n              this._isLeftToRightHorizontal[edgeId] = false;\n              negate(edgeHorizontalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n              negate(this._edgePositiveTemp, this._edgePositiveTemp);\n            }\n            cross(edgeHorizontalForward, this._edgePositiveTemp, this._edgeNormalTemp);\n            if (dot$1(edgeHorizontalForward, this._forward) < 0) {\n              this._isLeftToRightHorizontal[edgeId] = !this._isLeftToRightHorizontal[edgeId];\n              negate(edgeHorizontalRight, edgeHorizontalRight);\n            }\n            cross(edgeHorizontalForward, edgeHorizontalRight, edgeHorizontalUp);\n            const edgeVerticalRight = this._edgeVerticalRight[edgeId];\n            const edgeVerticalUp = this._edgeVerticalUp[edgeId];\n            const edgeVerticalForward = this._edgeVerticalForward[edgeId];\n            if (dot$1(this._edgeNormal, this._right) < 0) {\n              copy$3(edgeVerticalUp, Quad$2.EDGE_NORMALS[edgeId]);\n            } else {\n              negate(edgeVerticalUp, Quad$2.EDGE_NORMALS[edgeId]);\n              negate(this._edgeNormal, this._edgeNormal);\n            }\n            if (dot$1(this._edgePositive, this._up) < 0) {\n              this._isLeftToRightVertical[edgeId] = true;\n              copy$3(edgeVerticalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n            } else {\n              this._isLeftToRightVertical[edgeId] = false;\n              negate(edgeVerticalRight, Quad$2.EDGE_POSITIVES[edgeId]);\n              negate(this._edgePositive, this._edgePositive);\n            }\n            cross(edgeVerticalForward, this._edgePositive, this._edgeNormal);\n            if (dot$1(edgeVerticalForward, this._forward) < 0) {\n              this._isLeftToRightVertical[edgeId] = !this._isLeftToRightVertical[edgeId];\n              negate(edgeVerticalRight, edgeVerticalRight);\n            }\n            cross(edgeVerticalForward, edgeVerticalRight, edgeVerticalUp);\n            if (this.isEdgeVisible[edgeId]) {\n              if (this._labels[axisId]) {\n                this._updateLabels(axisId, edgeId);\n              }\n              if (this._titles[axisId]) {\n                this._updateTitle(axisId, edgeId);\n              }\n            }\n            if (this.isHeadingVisible[edgeId]) {\n              this._updateHeading(axisId, edgeId);\n            }\n          }\n        }\n      }\n    }\n    _updateLabels(axisId, edgeId) {\n      const orientation = this._orientations[axisId];\n      let distance2 = this._distances[edgeId];\n      let maxLabelSize = this._maxLabelSize[axisId][1];\n      if (orientation == AxesTextOrientation.parallel)\n        maxLabelSize *= this._core.config.axesTextLabelLineHeight;\n      distance2 += maxLabelSize * 0.5;\n      multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance2);\n      const labelMMatrix = this._labelMMatrices[edgeId];\n      labelMMatrix[12] = this._vec3[0];\n      labelMMatrix[13] = this._vec3[1];\n      labelMMatrix[14] = this._vec3[2];\n      if (orientation == AxesTextOrientation.parallel) {\n        const right = this._edgeHorizontalRight[edgeId];\n        const up = this._edgeHorizontalUp[edgeId];\n        const forward = this._edgeHorizontalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      } else {\n        const right = this._edgeVerticalRight[edgeId];\n        const up = this._edgeVerticalUp[edgeId];\n        const forward = this._edgeVerticalForward[edgeId];\n        labelMMatrix[0] = right[0];\n        labelMMatrix[1] = right[1];\n        labelMMatrix[2] = right[2];\n        labelMMatrix[4] = up[0];\n        labelMMatrix[5] = up[1];\n        labelMMatrix[6] = up[2];\n        labelMMatrix[8] = forward[0];\n        labelMMatrix[9] = forward[1];\n        labelMMatrix[10] = forward[2];\n      }\n      multiply$2(labelMMatrix, this._mMatrix, labelMMatrix);\n      if (orientation == AxesTextOrientation.perpendicular) {\n        multiply$2(labelMMatrix, labelMMatrix, Constants.MAT4_ROTATION_MINUS_90);\n      }\n      distance2 += maxLabelSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateTitle(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const titleTextSize = this._titleSizes[axisId] * this._core.config.axesTextTitleLineHeight;\n      distance2 += titleTextSize * 0.5;\n      multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance2);\n      const titleMMatrix = this._titleMMatrices[edgeId];\n      titleMMatrix[12] = this._vec3[0];\n      titleMMatrix[13] = this._vec3[1];\n      titleMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      titleMMatrix[0] = right[0];\n      titleMMatrix[1] = right[1];\n      titleMMatrix[2] = right[2];\n      titleMMatrix[4] = up[0];\n      titleMMatrix[5] = up[1];\n      titleMMatrix[6] = up[2];\n      titleMMatrix[8] = forward[0];\n      titleMMatrix[9] = forward[1];\n      titleMMatrix[10] = forward[2];\n      multiply$2(titleMMatrix, this._mMatrix, titleMMatrix);\n      distance2 += titleTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateHeading(axisId, edgeId) {\n      let distance2 = this._distances[edgeId];\n      const headingTextSize = this._headingSizes[axisId] * this._core.config.axesTextHeadingLineHeight;\n      distance2 += headingTextSize * 0.5;\n      multiply$1(this._vec3, Quad$2.EDGE_POSITIONS[edgeId], this._size);\n      scaleAndAdd(this._vec3, this._vec3, Quad$2.EDGE_NORMALS[edgeId], distance2);\n      const headingMMatrix = this._headingMMatrices[edgeId];\n      headingMMatrix[12] = this._vec3[0];\n      headingMMatrix[13] = this._vec3[1];\n      headingMMatrix[14] = this._vec3[2];\n      const right = this._edgeHorizontalRight[edgeId];\n      const up = this._edgeHorizontalUp[edgeId];\n      const forward = this._edgeHorizontalForward[edgeId];\n      headingMMatrix[0] = right[0];\n      headingMMatrix[1] = right[1];\n      headingMMatrix[2] = right[2];\n      headingMMatrix[4] = up[0];\n      headingMMatrix[5] = up[1];\n      headingMMatrix[6] = up[2];\n      headingMMatrix[8] = forward[0];\n      headingMMatrix[9] = forward[1];\n      headingMMatrix[10] = forward[2];\n      multiply$2(headingMMatrix, this._mMatrix, headingMMatrix);\n      distance2 += headingTextSize * 0.5;\n      this._distances[edgeId] = distance2;\n    }\n    _updateGrids(size) {\n      let offset2 = 0;\n      this.pickGridLookup = {};\n      this._pickGrid = [];\n      const xDivisions = this._gridTicksPositions[0] ? this._gridTicksPositions[0].length - 1 : 0;\n      const yDivisions = this._gridTicksPositions[1] ? this._gridTicksPositions[1].length - 1 : 0;\n      const count2 = 2 * (xDivisions * yDivisions) + xDivisions + yDivisions;\n      const byteLength = PickGridVertex.SIZE_BYTES * count2 * 4;\n      if (!this._gridVertices || this._gridVertices.byteLength < byteLength) {\n        this._gridVertices = new ArrayBuffer(byteLength);\n        this._gridVerticesView = new DataView(this._gridVertices);\n        this._gridIndices = new Uint16Array(count2 * 6);\n      }\n      for (let axisId2 = 0; axisId2 < 2; axisId2++) {\n        const width2 = size[axisId2];\n        set$3(this._gridTicksScales[axisId2], width2, this._gridPickDivisionHeight, 1);\n        offset2 = this._updateGridTicks(axisId2, this._gridVerticesView, this._gridIndices, offset2);\n        this._gridFaceScale[axisId2] = size[axisId2] == 0 ? 1 : size[axisId2];\n      }\n      const axisId = 2;\n      this._gridFaceScale[axisId] = 1;\n      for (let faceId = 0; faceId < 2; faceId++) {\n        offset2 = this._updateGridFace(axisId, faceId, this._gridVerticesView, this._gridIndices, offset2);\n      }\n    }\n    _updateText(size) {\n      let glyphOffset = 0;\n      let count2 = 0;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const labels = this._labels[axisId];\n        if (labels) {\n          for (let i = 0; i < labels.length; i++) {\n            count2 += 2 * Math.min(labels[i].length, this._core.config.axesTextLabelMaxGlyphs);\n          }\n        }\n        const title = this._titles[axisId];\n        if (title) {\n          count2 += Math.min(title.length, this._core.config.axesTextTitleMaxGlyphs);\n        }\n        const heading = this._headings[axisId];\n        if (heading) {\n          count2 += Math.min(heading.length, this._core.config.axesTextHeadingMaxGlyphs);\n        }\n      }\n      const byteLength = PositionTexturePickVertex.SIZE_BYTES * count2 * 4;\n      if (!this._textVertices || this._textVertices.byteLength < byteLength) {\n        this._textVertices = new ArrayBuffer(byteLength);\n        this._textVerticesView = new DataView(this._textVertices);\n        this._textIndices = new Uint16Array(count2 * 6);\n      }\n      this.pickLabelLookup = {};\n      this._pickLabel = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._labels[axisId]) {\n          const width2 = size[axisId];\n          const maxLabelSize = this._maxLabelSize[axisId];\n          const orientation = this._orientations[axisId];\n          set(maxLabelSize, 0, 0);\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateLeftToRightAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesLeftToRightIndexCounts[axisId] = glyphOffset * 6 - this._axesLeftToRightIndexOffsets[axisId];\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          glyphOffset = this._updateRightToLeftAxisLabels(axisId, width2, maxLabelSize, glyphOffset, orientation, this._labels[axisId], this._labelPositions[axisId], this._labelSizes[axisId]);\n          this._axesRightToLeftIndexCounts[axisId] = glyphOffset * 6 - this._axesRightToLeftIndexOffsets[axisId];\n        } else {\n          this._axesLeftToRightIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesRightToLeftIndexOffsets[axisId] = glyphOffset * 6;\n          this._axesLeftToRightIndexCounts[axisId] = 0;\n          this._axesRightToLeftIndexCounts[axisId] = 0;\n          this._maxLabelSize[axisId][0] = 0;\n          this._maxLabelSize[axisId][1] = 0;\n        }\n      }\n      this.pickTitleLookup = {};\n      this._pickTitle = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._titles[axisId]) {\n          set$3(this._textPosition, 0, 0, 0);\n          set$3(this._textOffset, 0, 0, 0);\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._titles[axisId], this._core.config.axesTextTitleMaxGlyphs);\n          const scale2 = this._titleSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesTitle, this._vec4);\n          this.pickTitleLookup[pickId] = this._pickTitle.length;\n          this._pickTitle.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._titleIndexCounts[axisId] = glyphOffset * 6 - this._titleIndexOffsets[axisId];\n        } else {\n          this._titleIndexOffsets[axisId] = glyphOffset * 6;\n          this._titleIndexCounts[axisId] = 0;\n        }\n      }\n      this.pickHeadingLookup = {};\n      this._pickHeading = [];\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (this._headings[axisId]) {\n          set$3(this._textPosition, 0, 0, 0);\n          set$3(this._textOffset, 0, 0, 0);\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          const text2 = TextHelper.truncate(this._headings[axisId], this._core.config.axesTextHeadingMaxGlyphs);\n          const scale2 = this._headingSizes[axisId] / this._font.size;\n          TextHelper.measure(this._font, text2, this._textMetric);\n          const width2 = this._textMetric.width * scale2;\n          const maxGlyphTop = this._textMetric.maxTop * scale2;\n          const lineHeight2 = this._font.size * scale2;\n          this._textOffset[0] -= width2 / 2;\n          this._textOffset[1] -= (lineHeight2 - maxGlyphTop) / 2;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesHeading, this._vec4);\n          this.pickHeadingLookup[pickId] = this._pickHeading.length;\n          this._pickHeading.push(axisId);\n          TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n          glyphOffset += text2.length;\n          this._headingIndexCounts[axisId] = glyphOffset * 6 - this._headingIndexOffsets[axisId];\n        } else {\n          this._headingIndexOffsets[axisId] = glyphOffset * 6;\n          this._headingIndexCounts[axisId] = 0;\n        }\n      }\n    }\n    _updateLeftToRightAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions[label2] : positions[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$3(this._textPosition, (position2 - 0.5) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = position2 == 0 ? 0 : position2 == 1 ? -width2 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            maxSize[0] = Math.max(width2, maxSize[0]);\n            maxSize[1] = Math.max(lineHeight2, maxSize[1]);\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$3(this._textPosition, 0, (position2 - 0.5) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = position2 == 0 ? 0 : position2 == 1 ? -maxGlyphTop : -maxGlyphTop / 2;\n            }\n            maxSize[0] = Math.max(lineHeight2, maxSize[0]);\n            maxSize[1] = Math.max(width2, maxSize[1]);\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateRightToLeftAxisLabels(axisId, size, maxSize, glyphOffset, orientation, labels, positions, scales2) {\n      const isAxisReversed = this.isAxisReversed[axisId];\n      for (let label2 = 0; label2 < labels.length; label2++) {\n        const text2 = TextHelper.truncate(labels[label2], this._core.config.axesTextLabelMaxGlyphs);\n        const lineHeight2 = scales2[label2];\n        const scale2 = lineHeight2 / this._font.size;\n        TextHelper.measure(this._font, text2, this._textMetric);\n        const width2 = this._textMetric.width * scale2;\n        const maxGlyphTop = this._textMetric.maxTop * scale2;\n        const position2 = isAxisReversed ? 1 - positions[label2] : positions[label2];\n        switch (orientation) {\n          case AxesTextOrientation.parallel:\n            set$3(this._textPosition, (0.5 - position2) * size, 0, 0);\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[0] = -width2 / 2;\n            } else {\n              this._textOffset[0] = label2 == 0 ? -width2 : label2 == labels.length - 1 ? 0 : -width2 / 2;\n            }\n            this._textOffset[1] = (maxGlyphTop - lineHeight2) / 2;\n            break;\n          case AxesTextOrientation.perpendicular:\n            set$3(this._textPosition, 0, (0.5 - position2) * size, 0);\n            this._textOffset[0] = -width2 / 2;\n            if (this._isDiscrete[axisId]) {\n              this._textOffset[1] = -maxGlyphTop / 2;\n            } else {\n              this._textOffset[1] = label2 == 0 ? -maxGlyphTop : label2 == labels.length - 1 ? 0 : -maxGlyphTop / 2;\n            }\n            break;\n        }\n        const pickId = PickHelper.nextPickId();\n        PickHelper.encodeNumber(pickId, PickType.axesLabel, this._vec4);\n        this.pickLabelLookup[pickId] = this._pickLabel.length / 2;\n        this._pickLabel.push(axisId);\n        this._pickLabel.push(label2);\n        TextHelper.addString(this._font, text2, this._textVerticesView, this._textIndices, glyphOffset, this._textPosition, scale2, this._textOffset, null, this._vec4);\n        glyphOffset += text2.length;\n      }\n      return glyphOffset;\n    }\n    _updateGridTicks(axisId, dataView, indices, offset2) {\n      this._gridTicksIndexOffsets[axisId] = offset2 * 6;\n      if (this._gridTicksPositions[axisId]) {\n        const axes = create$3();\n        const positions = this._gridTicksPositions[axisId];\n        const isAxisReversed = this.isAxisReversed[axisId];\n        let vertexOffset = offset2 * 4;\n        for (let position2 = 0; position2 < positions.length - 1; position2++) {\n          const left = isAxisReversed ? 1 - positions[position2 + 1] - 0.5 : positions[position2] - 0.5;\n          const right = isAxisReversed ? 1 - positions[position2] - 0.5 : positions[position2 + 1] - 0.5;\n          axes[axisId] = position2 + 1;\n          const pickId = PickHelper.nextPickId();\n          PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n          this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n          this._pickGrid.push(axes[0]);\n          this._pickGrid.push(axes[1]);\n          this._pickGrid.push(axes[2]);\n          let indexOffset = offset2 * 6;\n          for (let j = 0; j < this._indexTemplate.length; j++) {\n            indices[indexOffset++] = this._indexTemplate[j] + vertexOffset;\n          }\n          set$2(this._bounds, left + 0.5, 0, right + 0.5, 1);\n          this._translation[0] = left;\n          this._translation[1] = 0.5;\n          this._translation[2] = 0;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 1;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = left;\n          this._translation[1] = -0.5;\n          this._texCoord[0] = left + 0.5;\n          this._texCoord[1] = 0;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          this._translation[0] = right;\n          this._texCoord[0] = right + 0.5;\n          PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n          PickGridVertex.setNormal(dataView, vertexOffset, Constants.VECTOR3_UNITZ);\n          PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n          PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n          PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n          vertexOffset++;\n          offset2++;\n        }\n      }\n      this._gridTicksIndexCounts[axisId] = offset2 * 6 - this._gridTicksIndexOffsets[axisId];\n      return offset2;\n    }\n    _updateGridFace(axisId, faceId, dataView, indices, offset2) {\n      set$3(this._translation, 0, 0, 0);\n      this._gridFaceIndexOffsets[faceId] = offset2 * 6;\n      const axisId2 = axisId == 0 ? 1 : 0;\n      const axisId3 = axisId == 2 ? 1 : 2;\n      if (this._gridTicksPositions[axisId2] && this._gridTicksPositions[axisId3]) {\n        const axes = create$3();\n        negate(this._normal, Quad$2.FACE_NORMALS[faceId]);\n        const positions2 = this._gridTicksPositions[axisId2];\n        const positions3 = this._gridTicksPositions[axisId3];\n        const isAxisReversed2 = this.isAxisReversed[axisId2];\n        const isAxisReversed3 = this.isAxisReversed[axisId3];\n        for (let position2 = 0; position2 < positions2.length - 1; position2++) {\n          const min2 = isAxisReversed2 ? 1 - positions2[position2 + 1] - 0.5 : positions2[position2] - 0.5;\n          const max2 = isAxisReversed2 ? 1 - positions2[position2] - 0.5 : positions2[position2 + 1] - 0.5;\n          axes[axisId2] = position2 + 1;\n          let vertexOffset = offset2 * 4;\n          for (let position3 = 0; position3 < positions3.length - 1; position3++) {\n            const min3 = isAxisReversed3 ? 1 - positions3[position3 + 1] - 0.5 : positions3[position3] - 0.5;\n            const max3 = isAxisReversed3 ? 1 - positions3[position3] - 0.5 : positions3[position3 + 1] - 0.5;\n            axes[axisId3] = position3 + 1;\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.axesDivision, this._vec4);\n            this.pickGridLookup[pickId] = this._pickGrid.length / 3;\n            this._pickGrid.push(axes[0]);\n            this._pickGrid.push(axes[1]);\n            this._pickGrid.push(axes[2]);\n            let indexOffset = offset2 * 6;\n            for (let i = 0; i < this._indexTemplate.length; i++) {\n              indices[indexOffset++] = this._indexTemplate[i] + vertexOffset;\n            }\n            set$2(this._bounds, min2 + 0.5, min3 + 0.5, max2 + 0.5, max3 + 0.5);\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = max3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = max3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = min2;\n            this._translation[axisId3] = min3;\n            this._texCoord[0] = min2 + 0.5;\n            this._texCoord[1] = min3 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            this._translation[axisId2] = max2;\n            this._texCoord[0] = max2 + 0.5;\n            PickGridVertex.setTranslation(dataView, vertexOffset, this._translation);\n            PickGridVertex.setNormal(dataView, vertexOffset, this._normal);\n            PickGridVertex.setIdColor(dataView, vertexOffset, this._vec4);\n            PickGridVertex.setTexCoord(dataView, vertexOffset, this._texCoord);\n            PickGridVertex.setBounds(dataView, vertexOffset, this._bounds);\n            vertexOffset++;\n            offset2++;\n          }\n        }\n      }\n      this._gridFaceIndexCounts[faceId] = offset2 * 6 - this._gridFaceIndexOffsets[faceId];\n      return offset2;\n    }\n  }\n  class Glyph {\n    toJSON() {\n      return {\n        key: this.key,\n        char: this.char,\n        width: this.width,\n        height: this.height,\n        top: this.top,\n        left: this.left,\n        advance: this.advance,\n        u0: this.u0,\n        v0: this.v0,\n        u1: this.u1,\n        v1: this.v1\n      };\n    }\n  }\n  let FontVisual$2 = class FontVisual {\n    update() {\n    }\n    constructor(font2) {\n      this.font = font2;\n    }\n  };\n  class Font {\n    get atlas() {\n      return this._rasterizer.fontAtlas;\n    }\n    get count() {\n      return this._chars.size;\n    }\n    constructor(core, rasterizer) {\n      this._core = core;\n      this._rasterizer = rasterizer;\n      this._chars = /* @__PURE__ */ new Set();\n      this._previousSize = 0;\n      this.glyphs = {};\n    }\n    addGlyph(char) {\n      if (!this._chars.has(char)) {\n        this._chars.add(char);\n        this._rasterizer.draw(char);\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._core.log.write(LogLevel.info, `${this.name} added ${this._chars.size - this._previousSize} new glyphs`);\n        this._previousSize = this._chars.size;\n        if (this.hasChangedCallback) {\n          this.hasChangedCallback();\n        }\n      }\n    }\n    toJSON() {\n      const glyphs = [];\n      for (let key2 in this.glyphs) {\n        const glyph = this.glyphs[key2];\n        glyphs.push(glyph.toJSON());\n      }\n      return {\n        name: this.name,\n        size: this.size,\n        border: this.border,\n        glyphs,\n        edgeValue: this.edgeValue\n      };\n    }\n  }\n  class FontAtlas {\n    constructor(width2, height2) {\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = width2;\n      canvas.height = height2;\n      const context2 = canvas.getContext(\"2d\");\n      context2.clearRect(0, 0, width2, height2);\n      this.imageData = context2.getImageData(0, 0, width2, height2);\n      this.x = 0;\n      this.top = new Uint16Array(width2);\n    }\n  }\n  class FontRasterizer {\n    get font() {\n      return this._font;\n    }\n    get fontAtlas() {\n      return this._fontAtlas;\n    }\n    constructor(core, options) {\n      let start = performance.now();\n      this._core = core;\n      this._fontAtlas = options.fontAtlas;\n      this._fontSize = options.fontSize;\n      this._border = options.border;\n      this._fontFamily = options.fontFamily;\n      this._fontWeight = options.fontWeight;\n      this._fontStyle = options.fontStyle;\n      this._baseline = options.baseline;\n      this._maxDistance = options.maxDistance;\n      this._edgeValue = options.edgeValue;\n      this._font = new Font(core, this);\n      this._font.name = `${this._fontFamily}${this._fontSize}${this._fontWeight == \"normal\" ? \"\" : this._fontWeight}${this._fontStyle == \"normal\" ? \"\" : this._fontStyle}`.replace(/[^a-z0-9,]/ig, \"\").toLowerCase();\n      this._font.size = this._fontSize;\n      this._font.border = this._border;\n      this._font.edgeValue = this._edgeValue;\n      const glyphRasterizerOptions = {\n        baseline: this._baseline,\n        border: this._border,\n        edgeValue: this._edgeValue,\n        fontFamily: this._fontFamily,\n        fontSize: this._fontSize,\n        fontStyle: this._fontStyle,\n        fontWeight: this._fontWeight,\n        maxDistance: this._maxDistance\n      };\n      this._glyphRasterizer = new GlyphRasterizer(core, glyphRasterizerOptions);\n      this._core.log.write(LogLevel.info, `font rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n      const glyph = this._glyphRasterizer.draw(char);\n      const texWidth = glyph.width + 2 * this._border;\n      const texHeight = glyph.height + 2 * this._border;\n      const width2 = this._fontAtlas.imageData.width;\n      const height2 = this._fontAtlas.imageData.height;\n      if (this._fontAtlas.x + texWidth > width2) {\n        this._fontAtlas.x = 0;\n      }\n      let y2 = 0;\n      for (let x2 = this._fontAtlas.x; x2 < this._fontAtlas.x + texWidth; x2++) {\n        y2 = Math.max(y2, this._fontAtlas.top[x2]);\n      }\n      if (y2 + texHeight > height2) {\n        this._core.log.write(LogLevel.warn, `${this._font.name} height overflow`);\n      }\n      for (let x2 = this._fontAtlas.x; x2 < this._fontAtlas.x + texWidth; x2++) {\n        this._fontAtlas.top[x2] = y2 + texHeight;\n      }\n      glyph.u0 = this._fontAtlas.x / width2;\n      glyph.v0 = y2 / height2;\n      glyph.u1 = (this._fontAtlas.x + texWidth) / width2;\n      glyph.v1 = (y2 + texHeight) / height2;\n      this._font.glyphs[char] = glyph;\n      for (let i = 0; i < glyph.distances.length; i++) {\n        const distance2 = glyph.distances[i];\n        const dataX = i % texWidth;\n        const dataY = Math.floor(i / texWidth);\n        const offset2 = (this._fontAtlas.x + dataX + (y2 + dataY) * width2) * 4;\n        this._fontAtlas.imageData.data[offset2 + 0] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 1] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 2] = distance2;\n        this._fontAtlas.imageData.data[offset2 + 3] = 255;\n      }\n      this._fontAtlas.x += texWidth;\n    }\n  }\n  class GlyphRasterizer {\n    constructor(core, options) {\n      let start = performance.now();\n      this._core = core;\n      this._fontSize = options.fontSize;\n      this._border = options.border;\n      this._fontFamily = options.fontFamily;\n      this._fontWeight = options.fontWeight;\n      this._fontStyle = options.fontStyle;\n      this._baseline = options.baseline;\n      this._maxDistance = options.maxDistance;\n      this._edgeValue = options.edgeValue;\n      this._size = this._fontSize + this._border * 2;\n      this._size += this._border * 2;\n      this._gridOuter = new Float64Array(this._size * this._size);\n      this._gridInner = new Float64Array(this._size * this._size);\n      this._f = new Float64Array(this._size);\n      this._z = new Float64Array(this._size + 1);\n      this._v = new Uint16Array(this._size);\n      const canvas = document.createElement(\"canvas\");\n      canvas.width = canvas.height = this._size;\n      this._context = canvas.getContext(\"2d\", { willReadFrequently: true });\n      this._context.font = `${this._fontStyle} ${this._fontWeight} ${this._fontSize}px ${this._fontFamily} `;\n      this._context.textBaseline = this._baseline;\n      this._context.textAlign = \"left\";\n      this._context.fillStyle = \"black\";\n      this._core.log.write(LogLevel.info, `glyph rasterizer ${Math.round(window.performance.now() - start)}ms`);\n    }\n    draw(char) {\n      const textMetrics2 = this._context.measureText(char);\n      const glyphLeft = 0;\n      const glyphTop = Math.floor(textMetrics2.actualBoundingBoxAscent);\n      let glyphWidth = Math.ceil(textMetrics2.actualBoundingBoxRight);\n      let glyphHeight = Math.ceil(textMetrics2.actualBoundingBoxAscent) + Math.ceil(textMetrics2.actualBoundingBoxDescent);\n      glyphWidth = Math.min(this._size - this._border, glyphWidth);\n      glyphHeight = Math.min(this._size - this._border, glyphHeight);\n      const width2 = glyphWidth + 2 * this._border;\n      const height2 = glyphHeight + 2 * this._border;\n      const length2 = width2 * height2;\n      const distances = new Uint8ClampedArray(length2);\n      const gradientsX = new Uint8ClampedArray(length2);\n      const gradientsY = new Uint8ClampedArray(length2);\n      const pixels = new Uint8ClampedArray(length2);\n      const glyph = new Glyph();\n      glyph.char = char;\n      glyph.key = char.codePointAt(0);\n      glyph.distances = distances;\n      glyph.gradientsX = gradientsX;\n      glyph.gradientsY = gradientsY;\n      glyph.pixels = pixels;\n      glyph.width = glyphWidth;\n      glyph.height = glyphHeight;\n      glyph.top = glyphTop;\n      glyph.left = glyphLeft;\n      glyph.advance = textMetrics2.width;\n      if (glyphWidth == 0 || glyphHeight == 0) {\n        return glyph;\n      }\n      this._context.clearRect(this._border, this._border, glyphWidth, glyphHeight);\n      this._context.fillText(char, this._border, this._border + glyphTop);\n      const imgData = this._context.getImageData(this._border, this._border, glyphWidth, glyphHeight);\n      for (let i = 0; i < length2; i++) {\n        this._gridOuter[i] = Number.MAX_VALUE;\n        this._gridInner[i] = 0;\n      }\n      for (let y2 = 0; y2 < glyphHeight; y2++) {\n        for (let x2 = 0; x2 < glyphWidth; x2++) {\n          const a2 = imgData.data[4 * (y2 * glyphWidth + x2) + 3] / 255;\n          if (a2 > 0) {\n            const j = (y2 + this._border) * width2 + x2 + this._border;\n            if (a2 == 1) {\n              this._gridOuter[j] = 0;\n              this._gridInner[j] = Number.MAX_VALUE;\n            } else {\n              const d = 0.5 - a2;\n              this._gridOuter[j] = d > 0 ? d * d : 0;\n              this._gridInner[j] = d < 0 ? d * d : 0;\n              pixels[j] = 255;\n            }\n          }\n        }\n      }\n      this._edt(this._gridOuter, 0, 0, width2, height2, width2, this._f, this._v, this._z);\n      this._edt(this._gridInner, this._border, this._border, glyphWidth, glyphHeight, width2, this._f, this._v, this._z);\n      const distances2 = new Float32Array(length2);\n      for (let i = 0; i < length2; i++) {\n        const distance2 = Math.sqrt(this._gridOuter[i]) - Math.sqrt(this._gridInner[i]);\n        distances[i] = Math.round(this._edgeValue - distance2 * 255 / this._maxDistance);\n        distances2[i] = distance2;\n      }\n      for (let i = 0; i < length2; i++) {\n        const x2 = i % width2;\n        const y2 = Math.floor(i / width2);\n        const d = distances2[i];\n        const sign2 = d < 0 ? -1 : 1;\n        const x02 = x2 > 0 ? distances2[i - 1] : Number.MAX_VALUE;\n        const x12 = x2 < width2 - 1 ? distances2[i + 1] : Number.MAX_VALUE;\n        const y02 = y2 > 0 ? distances2[i - width2] : Number.MAX_VALUE;\n        const y12 = y2 < height2 - 1 ? distances2[i + width2] : Number.MAX_VALUE;\n        let gradientX = sign2 * x02 < sign2 * x12 ? d - x02 : x12 - d;\n        let gradientY = sign2 * y02 < sign2 * y12 ? y02 - d : d - y12;\n        gradientsX[i] = Math.round((gradientX * 0.5 + 0.5) * 255);\n        gradientsY[i] = Math.round((gradientY * 0.5 + 0.5) * 255);\n      }\n      return glyph;\n    }\n    _edt(data2, x02, y02, width2, height2, gridSize, f, v, z) {\n      for (let x2 = x02; x2 < x02 + width2; x2++)\n        this._edt1d(data2, y02 * gridSize + x2, gridSize, height2, f, v, z);\n      for (let y2 = y02; y2 < y02 + height2; y2++)\n        this._edt1d(data2, y2 * gridSize + x02, 1, width2, f, v, z);\n    }\n    _edt1d(grid, offset2, stride, n, f, v, z) {\n      v[0] = 0;\n      z[0] = -Number.MAX_VALUE;\n      z[1] = Number.MAX_VALUE;\n      f[0] = grid[offset2];\n      for (let q = 1, k = 0, s = 0; q < n; q++) {\n        f[q] = grid[offset2 + q * stride];\n        const q2 = q * q;\n        do {\n          const r = v[k];\n          s = (f[q] - f[r] + q2 - r * r) / (q - r) / 2;\n        } while (s <= z[k] && --k > -1);\n        k++;\n        v[k] = q;\n        z[k] = s;\n        z[k + 1] = Number.MAX_VALUE;\n      }\n      for (let q = 0, k = 0; q < n; q++) {\n        while (z[k + 1] < q) {\n          k++;\n        }\n        const r = v[k];\n        const qr = q - r;\n        grid[offset2 + q * stride] = f[r] + qr * qr;\n      }\n    }\n  }\n  class ManipulationProcessor {\n    get manipulators() {\n      return this._manipulators;\n    }\n    get count() {\n      return this._count;\n    }\n    get isDragging() {\n      return this._isDragging;\n    }\n    constructor(core) {\n      this._core = core;\n      this._count = 0;\n      this._centroid = create$3();\n      this._previousCentroid = create$3();\n      this._relativePositionToCentroid = create$3();\n      this._directionToCentroid = create$3();\n      this._previousDirectionToCentroid = create$3();\n      this._manipulators = {};\n      this._removedManipulators = [];\n      this.cumulativeTranslation = create$3();\n      this.translationDelta = create$3();\n      this.centroid = create$3();\n      this.maxScale = Number.MAX_VALUE;\n      this.twistAxis = fromValues$3(0, 0, 1);\n      this.initialize();\n    }\n    update(elapsedTime, manipulators) {\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        if (!manipulators[manipulator.id]) {\n          if (this.removeManipulator) {\n            this.removeManipulator(manipulator);\n          }\n          this._removedManipulators.push(manipulator.id);\n        }\n      }\n      if (this._removedManipulators.length > 0) {\n        for (let i = 0; i < this._removedManipulators.length; i++) {\n          delete this._manipulators[this._removedManipulators[i]];\n          this._count--;\n        }\n        this._removedManipulators = [];\n      }\n      for (const key2 in manipulators) {\n        const manipulator = manipulators[key2];\n        if (!this._manipulators[manipulator.id]) {\n          if (!this.addManipulator || this.addManipulator(manipulator)) {\n            copy$3(manipulator.initialPosition, manipulator.position);\n            this._manipulators[manipulator.id] = manipulator;\n            this._count++;\n          }\n        }\n      }\n      set$3(this.translationDelta, 0, 0, 0);\n      this.scaleDelta = 0;\n      this.twistDelta = 0;\n      if (this._count > 0) {\n        if (this._previousCount > 0) {\n          if (this.prepareManipulation) {\n            this.prepareManipulation();\n          }\n          this._process();\n          if (this.processManipulation) {\n            this.processManipulation(elapsedTime);\n          }\n        } else {\n          this.initialize();\n          if (this.beginManipulation) {\n            this.beginManipulation();\n          }\n        }\n      } else {\n        if (this._previousCount > 0) {\n          if (this.endManipulation) {\n            this.endManipulation();\n          }\n        }\n      }\n      this._isDragging = this._count == 1 && squaredLength(this.cumulativeTranslation) > this._core.config.dragToleranceSquared || this._count > 1;\n      this._previousCount = this._count;\n    }\n    initialize() {\n      set$3(this.centroid, 0, 0, 0);\n      set$3(this.cumulativeTranslation, 0, 0, 0);\n      this.cumulativeScale = 1;\n      this.cumulativeTwist = 0;\n    }\n    _process() {\n      if (this._previousCount > 0) {\n        let persisted = 0;\n        for (const key2 in this._manipulators) {\n          const manipulator = this._manipulators[key2];\n          if (manipulator.isPersisted) {\n            persisted++;\n          }\n        }\n        const removed = this._previousCount - persisted;\n        if (persisted > 0) {\n          if (removed > 0) {\n            copy$3(this._centroid, this._previousCentroid);\n          } else {\n            set$3(this._centroid, 0, 0, 0);\n            for (const key2 in this._manipulators) {\n              const manipulator = this._manipulators[key2];\n              if (manipulator.isPersisted) {\n                add(this._centroid, this._centroid, manipulator.position);\n              }\n            }\n            scale(this._centroid, this._centroid, 1 / persisted);\n          }\n          for (const key2 in this._manipulators) {\n            const manipulator = this._manipulators[key2];\n            if (manipulator.isPersisted) {\n              manipulator.maxTranslationSquared = Math.max(manipulator.maxTranslationSquared, squaredDistance(manipulator.position, manipulator.initialPosition));\n              add(this.translationDelta, this.translationDelta, manipulator.position);\n              subtract(this.translationDelta, this.translationDelta, manipulator.previousPosition);\n              subtract(this._relativePositionToCentroid, manipulator.position, this._centroid);\n              const distanceToCentroidSquared = squaredLength(this._relativePositionToCentroid);\n              if (distanceToCentroidSquared < this._core.config.manipulatorMinRelativeDistanceSquared) {\n                this.scaleDelta += 1;\n              } else {\n                const distanceToCentroid = Math.sqrt(distanceToCentroidSquared);\n                const previousDistanceToCentroidSquared = squaredLength(manipulator.previousPositionRelativeToCentroid);\n                const previousDistanceToCentroid = Math.sqrt(previousDistanceToCentroidSquared);\n                this.scaleDelta += distanceToCentroid / previousDistanceToCentroid;\n                scale(this._directionToCentroid, this._relativePositionToCentroid, 1 / distanceToCentroid);\n                scale(this._previousDirectionToCentroid, manipulator.previousPositionRelativeToCentroid, 1 / previousDistanceToCentroid);\n                this.twistDelta += AngleHelper.signedAngleBetweenVectors(this._previousDirectionToCentroid, this._directionToCentroid, this.twistAxis);\n              }\n            }\n          }\n          scale(this.translationDelta, this.translationDelta, 1 / persisted);\n          add(this.cumulativeTranslation, this.cumulativeTranslation, this.translationDelta);\n          this.scaleDelta /= persisted;\n          this.cumulativeScale = MathHelper.clamp(this.cumulativeScale * this.scaleDelta, this.minScale, this.maxScale);\n          this.scaleDelta -= 1;\n          this.twistDelta /= persisted;\n          this.cumulativeTwist += this.twistDelta;\n        }\n      }\n      set$3(this.centroid, 0, 0, 0);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        add(this.centroid, this.centroid, manipulator.position);\n      }\n      scale(this.centroid, this.centroid, 1 / this._count);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        subtract(manipulator.positionRelativeToCentroid, manipulator.position, this.centroid);\n      }\n      copy$3(this._previousCentroid, this.centroid);\n      for (const key2 in this._manipulators) {\n        const manipulator = this._manipulators[key2];\n        manipulator.isPersisted = true;\n        copy$3(manipulator.previousPosition, manipulator.position);\n        copy$3(manipulator.previousRotationAxis, manipulator.rotationAxis);\n        copy$3(manipulator.previousPositionRelativeToCentroid, manipulator.positionRelativeToCentroid);\n      }\n    }\n  }\n  class MouseWheel {\n    constructor(core) {\n      this._core = core;\n      this._previousTotal = 0;\n      this.total = 0;\n    }\n    initialize(element2) {\n      element2.addEventListener(\"wheel\", (e) => {\n        e.preventDefault();\n        const wheelEvent = e;\n        this.total += wheelEvent.deltaY;\n      }, { passive: false });\n    }\n    update(elapsedTime) {\n      const total = this.total;\n      this.delta = total - this._previousTotal;\n      this._previousTotal = total;\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`mse whl ${this.total < 0 ? \"\" : \" \"}${Math.round(this.total)}`);\n      }\n    }\n  }\n  class Manipulator {\n    constructor() {\n      this.pickedIndex = 0;\n      this.maxTranslationSquared = 0;\n      this.initialPosition = create$3();\n      this.position = create$3();\n      this.previousPosition = create$3();\n      this.holdOrigin = create$3();\n      this.positionRelativeToCentroid = create$3();\n      this.previousPositionRelativeToCentroid = create$3();\n      this.rotationAxis = create$3();\n      this.previousRotationAxis = create$3();\n    }\n  }\n  class Pointers {\n    get hoverX() {\n      return this._hoverX;\n    }\n    get hoverY() {\n      return this._hoverY;\n    }\n    get hoverId() {\n      return this._hoverId;\n    }\n    constructor(core, manipulators) {\n      this._core = core;\n      this._manipulators = manipulators;\n    }\n    initialize(element2) {\n      this._element = element2;\n      element2.addEventListener(\"pointerdown\", (e) => this._handlePointerDown(e), { passive: true });\n      element2.addEventListener(\"pointermove\", (e) => this._handlePointerMove(e), { passive: true });\n      element2.addEventListener(\"pointerup\", (e) => this._handlePointerUp(e), { passive: true });\n      element2.addEventListener(\"pointercancel\", (e) => this._handlePointerCancel(e), { passive: true });\n      element2.addEventListener(\"pointerleave\", (e) => this._handlePointerLeave(e), { passive: true });\n      element2.addEventListener(\"pointerout\", (e) => this._handlePointerOut(e), { passive: true });\n    }\n    update(elapsedTime) {\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`pen rot  ${(this._tiltX | 0).toFixed(3)},${(this._tiltY | 0).toFixed(3)},${(this._twist | 0).toFixed(3)}`);\n        this._core.debugText.addLine(`hov pos  ${this.hoverX ? `${this.hoverX.toFixed(3)},${this.hoverY.toFixed(3)}px` : \"\"}`);\n      }\n    }\n    _handlePointerDown(e) {\n      this._element.focus();\n      const devicePixelRatio2 = this._core.renderer.devicePixelRatio;\n      const manipulator = new Manipulator();\n      const id2 = e.pointerId;\n      const x2 = e.offsetX * devicePixelRatio2;\n      const y2 = e.offsetY * devicePixelRatio2;\n      manipulator.id = id2;\n      manipulator.position[0] = x2;\n      manipulator.position[1] = y2;\n      manipulator.type = e.pointerType;\n      manipulator.button = e.button;\n      manipulator.shiftKey = e.shiftKey;\n      manipulator.ctrlKey = e.ctrlKey;\n      manipulator.altKey = e.altKey;\n      manipulator.event = e;\n      this._manipulators[id2] = manipulator;\n      this._hoverId = id2;\n      this._hoverX = x2;\n      this._hoverY = y2;\n    }\n    _handlePointerMove(e) {\n      const devicePixelRatio2 = this._core.renderer.devicePixelRatio;\n      const x2 = e.offsetX * devicePixelRatio2;\n      const y2 = e.offsetY * devicePixelRatio2;\n      const id2 = e.pointerId;\n      const manipulator = this._manipulators[id2];\n      if (manipulator) {\n        manipulator.position[0] = x2;\n        manipulator.position[1] = y2;\n        manipulator.event = e;\n      }\n      switch (e.pointerType) {\n        case \"mouse\":\n          this._hoverId = id2;\n          this._hoverX = x2;\n          this._hoverY = y2;\n          break;\n        case \"pen\":\n          this._hoverId = id2;\n          this._hoverX = x2;\n          this._hoverY = y2;\n          this._tiltX = e.tiltX;\n          this._tiltY = e.tiltY;\n          this._twist = e.twist;\n          break;\n      }\n    }\n    _handlePointerUp(e) {\n      const manipulator = this._manipulators[e.pointerId];\n      if (manipulator) {\n        manipulator.event = e;\n      }\n      this._remove(e.pointerId);\n    }\n    _handlePointerCancel(e) {\n      this._remove(e.pointerId);\n    }\n    _handlePointerLeave(e) {\n      this._resetHover();\n      this._remove(e.pointerId);\n    }\n    _handlePointerOut(e) {\n      this._resetHover();\n      this._remove(e.pointerId);\n    }\n    _resetHover() {\n      this._hoverId = null;\n      this._hoverX = null;\n      this._hoverY = null;\n    }\n    _remove(pointerId) {\n      const manipulator = this._manipulators[pointerId];\n      if (manipulator) {\n        delete this._manipulators[pointerId];\n      }\n    }\n  }\n  class AnimationHelper {\n    static smoothStep(value2) {\n      return value2 * value2 * (3 - 2 * value2);\n    }\n    static damp(value2, target2, threshold2, dampening) {\n      if (Math.abs(target2) < threshold2) {\n        return MathHelper.lerp(value2, 0, dampening);\n      } else {\n        return MathHelper.lerp(value2, target2, dampening);\n      }\n    }\n  }\n  class Keyboard {\n    constructor(core) {\n      this._core = core;\n      this._pressedKeys = /* @__PURE__ */ new Set();\n      this._previousPressedKeys = /* @__PURE__ */ new Set();\n    }\n    initialize(element2) {\n      element2.addEventListener(\"keydown\", (e) => {\n        this._handleKeyDown(e);\n      }, false);\n      element2.addEventListener(\"keyup\", (e) => {\n        this._handleKeyUp(e);\n      }, false);\n    }\n    update(elapsedTime) {\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`key tot  ${this._pressedKeys.size}`);\n      }\n    }\n    isKeyDown(key2) {\n      return this._pressedKeys.has(key2);\n    }\n    wasKeyReleased(key2) {\n      if (this._pressedKeys.has(key2)) {\n        if (!this._previousPressedKeys.has(key2)) {\n          this._previousPressedKeys.add(key2);\n          return true;\n        }\n      } else {\n        this._previousPressedKeys.delete(key2);\n      }\n      return false;\n    }\n    _handleKeyDown(e) {\n      const keyboardEvent = e;\n      const key2 = keyboardEvent.key;\n      if (!this._pressedKeys.has(key2)) {\n        this._pressedKeys.add(key2);\n      }\n    }\n    _handleKeyUp(e) {\n      const keyboardEvent = e;\n      const key2 = keyboardEvent.key;\n      if (this._pressedKeys.has(key2)) {\n        this._pressedKeys.delete(key2);\n      }\n    }\n  }\n  class Manager {\n    constructor(core) {\n      this._manipulators = {};\n      this._core = core;\n      this._vec3 = create$3();\n      this._manipulationProcessor = new ManipulationProcessor(core);\n      this._manipulators = {};\n      this._pointers = new Pointers(core, this._manipulators);\n      this._pointers.initialize(core.container);\n      this._mouseWheel = new MouseWheel(core);\n      this._mouseWheel.initialize(core.container);\n      this._keyboard = new Keyboard(core);\n      this._keyboard.initialize(core.container);\n      this.isPickingEnabled = true;\n      this.mouseWheelZoomScale = this._core.config.mouseWheelZoomScale;\n      this.mouseWheelRotationScale = this._core.config.mouseWheelRotationScale;\n      this.multiTouchZoomScale = this._core.config.multiTouchZoomScale;\n      this.pickHoldDelay = this._core.config.pickHoldDelay;\n      this.pickSelectDelay = this._core.config.pickSelectDelay;\n      const rightButton2 = 2;\n      this.singleTouchAction = (manipulator) => {\n        if (manipulator.type == \"mouse\" && manipulator.button == rightButton2 || manipulator.shiftKey || manipulator.ctrlKey) {\n          return SingleTouchAction.translate;\n        } else if (manipulator.altKey || manipulator.type == \"pen\" && manipulator.button == rightButton2) {\n          return SingleTouchAction.lasso;\n        } else {\n          return SingleTouchAction.rotate;\n        }\n      };\n      this.mouseWheelAction = (keyboard) => {\n        if (this._keyboard.isKeyDown(\"Control\")) {\n          return MouseWheelAction.rotateY;\n        } else {\n          return MouseWheelAction.zoom;\n        }\n      };\n      this.lassoPickType = PickType.data;\n      this._thumbstickX = 0;\n      this._previousControllerButtonPressed = [false, false, false, false];\n      this._quat0 = create$1();\n      this._quat1 = create$1();\n    }\n    update(elapsedTime, xrFrame) {\n      if (xrFrame) {\n        const inputSources = this._core.webXRSession.inputSources;\n        if (inputSources.length > 0 && this._core.renderer.controllers.length > 0) {\n          const inputSource = inputSources[0];\n          const controllerVisual = this._core.renderer.controllers[0];\n          if (inputSource.gripSpace && inputSource.targetRayMode == \"tracked-pointer\") {\n            const gripPose = xrFrame.getPose(inputSource.gripSpace, this._core.renderer.webXRReferenceSpace);\n            if (gripPose) {\n              controllerVisual.mMatrix = gripPose.transform.matrix;\n            }\n            const gamepad = inputSource.gamepad;\n            this._core.renderer.isPickingEnabled = false;\n            const rayPose = xrFrame.getPose(inputSource.targetRaySpace, this._core.renderer.webXRReferenceSpace);\n            if (rayPose) {\n              controllerVisual.rayMMatrix = rayPose.transform.matrix;\n              if (gamepad.buttons[0].value > 0 && this.isPickingEnabled) {\n                this._core.renderer.pickVMatrix = rayPose.transform.inverse.matrix;\n                this._core.renderer.isPickingEnabled = true;\n              }\n            }\n            const threshold2 = 0.2;\n            const dampening = Math.min(0.015 * elapsedTime, 1);\n            this._thumbstickX = AnimationHelper.damp(this._thumbstickX, gamepad.axes[2], threshold2, dampening);\n            if (this._thumbstickX != 0) {\n              setAxisAngle(this._quat0, Constants.VECTOR3_UNITY, 0.01 * this._thumbstickX * elapsedTime);\n              this._core.getModelRotation(this._quat1);\n              multiply(this._quat1, this._quat0, this._quat1);\n              this._core.setModelRotation(this._quat1, true);\n            }\n            if (gamepad.buttons[2].pressed) {\n              if (!this._previousControllerButtonPressed[2]) {\n                this._previousControllerButtonPressed[2] = true;\n                if (this.controllerButtonPressedCallback) {\n                  this.controllerButtonPressedCallback(2);\n                }\n              }\n            } else {\n              this._previousControllerButtonPressed[2] = false;\n            }\n          }\n        }\n      } else {\n        const camera = this._core.camera;\n        this._manipulationProcessor.update(elapsedTime, this._manipulators);\n        this._pointers.update(elapsedTime);\n        this._mouseWheel.update(elapsedTime);\n        this._keyboard.update(elapsedTime);\n        if (this._mouseWheel.delta != 0) {\n          switch (this.mouseWheelAction(this._keyboard)) {\n            case MouseWheelAction.zoom:\n              if (this._pointers.hoverX, this._pointers.hoverY) {\n                camera.zoom(this._mouseWheel.delta * this.mouseWheelZoomScale, this._pointers.hoverX, this._pointers.hoverY);\n              }\n              break;\n            case MouseWheelAction.rotateY:\n              setAxisAngle(this._quat0, Constants.VECTOR3_UNITY, this._mouseWheel.delta * this.mouseWheelRotationScale);\n              camera.getOrbit(this._quat1);\n              multiply(this._quat1, this._quat1, this._quat0);\n              camera.setOrbit(this._quat1, true);\n              break;\n          }\n        }\n        const count2 = this._manipulationProcessor.count;\n        if (count2 == 0) {\n          if (this._isLassoPicking) {\n            this._isLassoPicking = false;\n            this._core.renderer.isLassoPicking = false;\n            const x02 = Math.min(this._lassoX0, this._lassoX1);\n            const y02 = Math.min(this._lassoY0, this._lassoY1);\n            const x12 = Math.max(this._lassoX0, this._lassoX1);\n            const y12 = Math.max(this._lassoY0, this._lassoY1);\n            if (x12 - x02 > 0 && y12 - y02 > 0) {\n              const sets = this._core.pickLasso(x02, y02, x12, y12, this.lassoPickType);\n              const result = {\n                x0: x02,\n                y0: y02,\n                x1: x12,\n                y1: y12,\n                pickType: this.lassoPickType,\n                ids: sets,\n                manipulator: this._manipulator\n              };\n              this.pickLassoCallback(result);\n            }\n          }\n        } else if (count2 == 1) {\n          const translationDelta = this._manipulationProcessor.translationDelta;\n          if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n            const manipulators = this._manipulationProcessor.manipulators;\n            for (const key2 in manipulators) {\n              const manipulator = manipulators[key2];\n              switch (this.singleTouchAction(manipulator)) {\n                case SingleTouchAction.rotate:\n                  camera.rotate(translationDelta);\n                  break;\n                case SingleTouchAction.translate:\n                  camera.translate(translationDelta);\n                  break;\n                case SingleTouchAction.lasso:\n                  if (this.pickLassoCallback) {\n                    if (!this._isLassoPicking) {\n                      this._isLassoPicking = true;\n                      this._core.renderer.isLassoPicking = true;\n                      this._lassoX0 = manipulator.position[0];\n                      this._lassoY0 = manipulator.position[1];\n                    }\n                    this._lassoX1 = manipulator.position[0];\n                    this._lassoY1 = manipulator.position[1];\n                    this._core.renderer.lassoX0 = Math.min(this._lassoX0, this._lassoX1);\n                    this._core.renderer.lassoY0 = Math.min(this._lassoY0, this._lassoY1);\n                    this._core.renderer.lassoX1 = Math.max(this._lassoX0, this._lassoX1);\n                    this._core.renderer.lassoY1 = Math.max(this._lassoY0, this._lassoY1);\n                  }\n                  break;\n              }\n              break;\n            }\n          }\n        } else {\n          const translationDelta = this._manipulationProcessor.translationDelta;\n          const camera2 = this._core.camera;\n          if (translationDelta[0] != 0 || translationDelta[1] != 0) {\n            camera2.translate(translationDelta);\n          }\n          if (this._manipulationProcessor.scaleDelta != 0) {\n            const distance2 = this._manipulationProcessor.scaleDelta * this.multiTouchZoomScale;\n            camera2.zoom(distance2, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n          }\n          if (this._manipulationProcessor.twistDelta != 0) {\n            camera2.twist(this._manipulationProcessor.twistDelta, this._manipulationProcessor.centroid[0], this._manipulationProcessor.centroid[1]);\n          }\n        }\n        if (this.isPickingEnabled && !this._manipulationProcessor.isDragging && !this._isLassoPicking) {\n          const camera2 = this._core.camera;\n          const renderer = this._core.renderer;\n          if (renderer.isCapturingPickImage) {\n            camera2.updatePickVMatrix(renderer.width / 2, renderer.height / 2);\n            renderer.pickVMatrix = camera2.pickVMatrix;\n            renderer.isPickingEnabled = true;\n            this._pickedTime = 0;\n          } else if (this._pointers.hoverId > -1) {\n            const pickingX = this._pointers.hoverX;\n            const pickingY = this._pointers.hoverY;\n            camera2.updatePickVMatrix(pickingX, pickingY);\n            renderer.pickVMatrix = camera2.pickVMatrix;\n            renderer.isPickingEnabled = true;\n            if (this._pickedId != renderer.pickedId) {\n              this._pickedId = renderer.pickedId;\n              this._pickedTime = 0;\n            } else {\n              if (this._manipulationProcessor.count == 1) {\n                this._pickedTime += elapsedTime;\n                for (const key2 in this._manipulators) {\n                  this._manipulator = this._manipulators[key2];\n                  break;\n                }\n              }\n            }\n            if (this._pickedTime > 0) {\n              switch (renderer.pickedType) {\n                case PickType.data:\n                  if (this._pickedTime > this.pickHoldDelay) {\n                    renderer.getVertexPosition(this._vec3, this._pickedId);\n                    this._core.setModelManipulationOrigin(this._vec3);\n                    this._pickedTime = 0;\n                  } else if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.transitionBuffers.length; i++) {\n                        const transitionBuffer = renderer.transitionBuffers[i];\n                        const id2 = transitionBuffer.pickIdLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = {\n                            transitionBuffer: i,\n                            id: id2,\n                            manipulator: this._manipulator\n                          };\n                          this._core.log.write(LogLevel.info, `picked id ${result.id}, transition buffer ${i}`);\n                          if (this.pickItemCallback) {\n                            this.pickItemCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.label:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.labelSets.length; i++) {\n                        const labelSet = renderer.labelSets[i].label;\n                        const id2 = labelSet.pickIdLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = {\n                            label: id2,\n                            set: i,\n                            manipulator: this._manipulator\n                          };\n                          this._core.log.write(LogLevel.info, `picked label ${result.label}, set ${result.set}`);\n                          if (this.pickLabelSetCallback) {\n                            this.pickLabelSetCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesDivision:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickGridLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickGrid(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked division (${result.divisionX}, ${result.divisionY}, ${result.divisionZ}), axes ${result.axes}`);\n                          if (this.pickAxesGridCallback) {\n                            this.pickAxesGridCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesTitle:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickTitleLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickTitle(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked title ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesTitleCallback) {\n                            this.pickAxesTitleCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesLabel:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickLabelLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickLabel(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked label ${result.label}, axis ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesLabelCallback) {\n                            this.pickAxesLabelCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n                case PickType.axesHeading:\n                  if (this._manipulationProcessor.count == 0) {\n                    if (this._pickedTime > this.pickSelectDelay) {\n                      for (let i = 0; i < renderer.currentAxes.length; i++) {\n                        const axes = renderer.currentAxes[i].axes;\n                        const id2 = axes.pickHeadingLookup[this._pickedId];\n                        if (id2 > -1) {\n                          const result = axes.pickHeading(id2);\n                          result.axes = i;\n                          result.manipulator = this._manipulator;\n                          this._core.log.write(LogLevel.info, `picked heading ${result.axis}, axes ${result.axes}`);\n                          if (this.pickAxesHeadingCallback) {\n                            this.pickAxesHeadingCallback(result);\n                          }\n                          break;\n                        }\n                      }\n                    }\n                    this._pickedTime = 0;\n                  }\n                  break;\n              }\n            }\n          } else {\n            renderer.isPickingEnabled = false;\n            this._pickedTime = 0;\n          }\n        } else {\n          this._core.renderer.isPickingEnabled = false;\n          this._pickedTime = 0;\n        }\n      }\n      if (this._core.config.isDebugVisible) {\n        this._core.debugText.addLine(`man tot  ${this._manipulationProcessor.count}`);\n        this._core.debugText.addLine(`pck key  ${this._core.renderer.pickedId}`);\n      }\n    }\n  }\n  class Log {\n    constructor(core) {\n      this._core = core;\n    }\n    write(level, value2) {\n      if (level >= this._core.config.logLevel) {\n        switch (level) {\n          case LogLevel.trace:\n            console.trace(value2);\n            break;\n          case LogLevel.debug:\n            console.debug(value2);\n            break;\n          case LogLevel.info:\n            console.info(value2);\n            break;\n          case LogLevel.warn:\n            console.warn(value2);\n            break;\n          case LogLevel.error:\n            console.error(value2);\n            break;\n        }\n      }\n    }\n  }\n  var __awaiter$3 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class Core {\n    get container() {\n      return this._container;\n    }\n    get started() {\n      return this._started;\n    }\n    get debugText() {\n      return this._debugText;\n    }\n    get log() {\n      return this._log;\n    }\n    get totalFrames() {\n      return this._fps.totalFrames;\n    }\n    get camera() {\n      return this._camera;\n    }\n    set camera(value2) {\n      this._camera = value2;\n    }\n    getModelRotation(value2) {\n      copy$1(value2, this._modelRotation);\n    }\n    setModelRotation(value2, isSmooth) {\n      copy$1(this._modelRotation, value2);\n      if (!isSmooth) {\n        copy$1(this._smoothedModelRotation, this._modelRotation);\n      }\n    }\n    getModelScale() {\n      return this._modelScale[0];\n    }\n    setModelScale(value2, isSmooth) {\n      set$3(this._modelScale, value2, value2, value2);\n      if (!isSmooth) {\n        copy$3(this._smoothedModelScale, this._modelScale);\n      }\n    }\n    getModelManipulationOrigin(value2) {\n      copy$3(value2, this._modelManipulationOrigin);\n    }\n    setModelManipulationOrigin(value2) {\n      this._updateManipulationOrigin(value2);\n    }\n    getModelPosition(value2) {\n      copy$3(value2, this._modelPosition);\n    }\n    setModelPosition(value2, isSmooth) {\n      copy$3(this._modelPosition, value2);\n      if (!isSmooth) {\n        copy$3(this._smoothedModelPosition, this._modelPosition);\n      }\n    }\n    get webXRSession() {\n      return this._webXRSession;\n    }\n    get renderer() {\n      return this._renderer;\n    }\n    set renderer(renderer) {\n      if (this._renderer == renderer) {\n        return;\n      }\n      if (this._renderer) {\n        this.stop();\n        this._renderer.remove();\n      }\n      if (!renderer.isInitialized) {\n        renderer.initialize(this);\n      }\n      if (this._renderer) {\n        renderer.transitionTime = this._renderer.transitionTime;\n        for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n          const previousTransitionBuffer = this._renderer.transitionBuffers[i];\n          const transitionBuffer = renderer.createTransitionBuffer(previousTransitionBuffer.currentBuffer.ids);\n          transitionBuffer.copyFrom(previousTransitionBuffer);\n          renderer.transitionBuffers.push(transitionBuffer);\n        }\n        const currentAxes = this._renderer.currentAxes;\n        if (currentAxes) {\n          renderer.currentAxes = [];\n          for (let i = 0; i < currentAxes.length; i++) {\n            const axesVisual = currentAxes[i];\n            const axes = axesVisual.axes;\n            if (axes instanceof Cartesian3dAxes) {\n              const cartesian3dAxesVisual = renderer.createCartesian3dAxesVisual(axes);\n              renderer.currentAxes.push(cartesian3dAxesVisual);\n            } else if (axes instanceof Cartesian2dAxes) {\n              renderer.currentAxes.push(renderer.createCartesian2dAxesVisual(axes));\n            }\n          }\n        }\n        const labelSets = this._renderer.labelSets;\n        if (labelSets) {\n          renderer.labelSets = [];\n          for (let i = 0; i < labelSets.length; i++) {\n            renderer.labelSets.push(renderer.createLabelSetVisual(labelSets[i].label));\n          }\n        }\n        const images = this._renderer.images;\n        if (images) {\n          renderer.images = [];\n          for (let i = 0; i < images.length; i++) {\n            renderer.images.push(renderer.createImageVisual(images[i].image));\n          }\n        }\n        const fonts = this._renderer.fonts;\n        if (fonts) {\n          for (const key2 in fonts) {\n            const font2 = fonts[key2].font;\n            renderer.fonts[font2.name] = renderer.createFontVisual(font2);\n          }\n        }\n      } else {\n        renderer.fonts[this._font.name] = renderer.createFontVisual(this._font);\n      }\n      if (this._renderer) {\n        this._renderer.finalize();\n      }\n      this._renderer = renderer;\n      this._fps.reset();\n      this.start();\n    }\n    get font() {\n      return this._font;\n    }\n    get paletteResources() {\n      return this._paletteResources;\n    }\n    get config() {\n      return this._config;\n    }\n    get inputManager() {\n      return this._inputManager;\n    }\n    constructor(options) {\n      setMatrixArrayType(Array);\n      this._vec3 = create$3();\n      this._quat = create$1();\n      this._mat4 = create$4();\n      this._container = options && options.container ? options.container : document.body;\n      this._config = new Config$2(this);\n      this._log = new Log(this);\n      this._debugText = new DebugText();\n      this._inputManager = options && options.useInputManager === false ? null : new Manager(this);\n      const fontRasterizerOptions = options && options.fontRasterizerOptions ? options.fontRasterizerOptions : {\n        fontAtlas: new FontAtlas(256, 512),\n        fontSize: 24,\n        border: 3,\n        fontFamily: '\"segoe ui semibold\", sans-serif',\n        fontWeight: \"normal\",\n        fontStyle: \"normal\",\n        baseline: \"alphabetic\",\n        maxDistance: 8,\n        edgeValue: 192\n      };\n      const fontRasterizer = new FontRasterizer(this, fontRasterizerOptions);\n      this._font = fontRasterizer.font;\n      this._paletteResources = new PaletteResources();\n      this._previousTime = 0;\n      this._fps = new Fps(this);\n      this._modelMMatrix = create$4();\n      this._modelPosition = create$3();\n      this._modelRotation = create$1();\n      this._modelScale = create$3();\n      this._smoothedModelPosition = create$3();\n      this._smoothedModelRotation = create$1();\n      this._smoothedModelScale = create$3();\n      this._modelManipulationOrigin = create$3();\n      this._camera = new AltAzimuthCamera(this);\n      this.resetModel(false);\n    }\n    getView(view) {\n      this.getModelPosition(view.position);\n      this.getModelRotation(view.rotation);\n      view.scale = this.getModelScale();\n    }\n    setView(view, isSmooth) {\n      this.setModelPosition(view.position, isSmooth);\n      this.setModelRotation(view.rotation, isSmooth);\n      this.setModelScale(view.scale, isSmooth);\n    }\n    lerpView(from, to, time2) {\n      lerp(this._vec3, from.position, to.position, time2);\n      this.setModelPosition(this._vec3, false);\n      slerp(this._quat, from.rotation, to.rotation, time2);\n      this.setModelRotation(this._quat, false);\n      this.setModelScale(MathHelper.lerp(from.scale, to.scale, time2), false);\n    }\n    resetModel(isSmooth) {\n      set$3(this._modelPosition, 0, 0, -this._config.modelDistance);\n      set$3(this._modelScale, this._config.modelSize, this._config.modelSize, this._config.modelSize);\n      set$1(this._modelRotation, 0, 0, 0, 1);\n      if (!isSmooth) {\n        this._syncSmooth();\n      }\n    }\n    resetManipulationOrigin() {\n      if (!exactEquals$1(this._modelManipulationOrigin, Constants.VECTOR3_ZERO)) {\n        this._updateManipulationOrigin(Constants.VECTOR3_ZERO);\n      }\n    }\n    reset(isSmooth) {\n      this.resetModel(isSmooth);\n      this.resetManipulationOrigin();\n      this._camera.reset(isSmooth);\n    }\n    start() {\n      if (!this._started && this._renderer) {\n        this._windowAnimationFrame = window.requestAnimationFrame((currentTime) => this._tick(currentTime));\n        this._started = true;\n        this._log.write(LogLevel.info, \"render loop started\");\n        if (this.startCallback) {\n          this.startCallback();\n        }\n      }\n    }\n    stop() {\n      if (this._started) {\n        this._started = false;\n        if (this._windowAnimationFrame != null) {\n          window.cancelAnimationFrame(this._windowAnimationFrame);\n          this._windowAnimationFrame = null;\n          this._log.write(LogLevel.info, \"render loop stopped\");\n        }\n        if (this.stopCallback) {\n          this.stopCallback();\n        }\n      }\n    }\n    checkWebXRSupport() {\n      const xrSystem = navigator.xr;\n      if (xrSystem) {\n        xrSystem.isSessionSupported(\"immersive-vr\").then((supported) => {\n          if (supported) {\n            this._log.write(LogLevel.info, \"WebXR supported\");\n            if (this.webXRSupportedCallback) {\n              this.webXRSupportedCallback();\n            }\n          }\n        });\n      }\n    }\n    requestWebXRSession() {\n      if (this._webXRSession) {\n        this._webXRSession.end();\n      } else {\n        navigator.xr.requestSession(\"immersive-vr\").then((session) => this._webXRSessionStarted(session));\n      }\n    }\n    _webXRSessionStarted(session) {\n      if (this.webXRSessionStartedCallback) {\n        this.webXRSessionStartedCallback();\n      }\n      this._webXRSession = session;\n      session.onend = () => this._webXRSessionEnded();\n      this._renderer.initializeWebXR(session).then(() => {\n        if (this._windowAnimationFrame) {\n          window.cancelAnimationFrame(this._windowAnimationFrame);\n          this._windowAnimationFrame = null;\n        }\n        session.requestAnimationFrame((currentTime, xrframe) => this._tick(currentTime, xrframe));\n      });\n      session.oninputsourceschange = (event2) => this._webXRInputSourcesChanged(event2);\n    }\n    _webXRSessionEnded() {\n      if (this.webXRSessionEndedCallback) {\n        this.webXRSessionEndedCallback();\n      }\n      this._webXRSession = null;\n      this._renderer.controllers.length = 0;\n      this.start();\n    }\n    _webXRInputSourcesChanged(event2) {\n      if (event2.added.length > 0) {\n        const added = event2.added[0];\n        if (added.targetRayMode == \"tracked-pointer\") {\n          const profiles = added.profiles;\n          const handedness = added.handedness;\n          if (this.webXRInputSourceRequestCallback) {\n            this.webXRInputSourceRequestCallback(profiles, handedness, (response) => {\n              const options = {\n                profiles,\n                handedness,\n                obj: response.obj,\n                texture: response.texture\n              };\n              const controller = new Controller(this, options);\n              this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n            }, (e) => {\n              this._log.write(LogLevel.error, e);\n            });\n          } else {\n            const options = {};\n            const controller = new Controller(this, options);\n            this.renderer.controllers.push(this.renderer.createControllerVisual(controller));\n          }\n        }\n      }\n      if (event2.removed.length > 0) {\n        this.renderer.controllers.length = 0;\n      }\n    }\n    _tick(currentTime, xrFrame) {\n      return __awaiter$3(this, void 0, void 0, function* () {\n        let elapsedTime = currentTime - this._previousTime;\n        this._previousTime = currentTime;\n        if (elapsedTime > 0) {\n          this.update(elapsedTime, xrFrame);\n          yield this.render(elapsedTime, xrFrame);\n        }\n        if (xrFrame) {\n          xrFrame.session.requestAnimationFrame((currentTime2, xrframe) => this._tick(currentTime2, xrframe));\n        } else if (this._started) {\n          this._windowAnimationFrame = window.requestAnimationFrame((currentTime2) => this._tick(currentTime2));\n        }\n      });\n    }\n    update(elapsedTime, xrFrame) {\n      this._renderer.setSize(elapsedTime);\n      if (this.updateCallback) {\n        this.updateCallback(elapsedTime, xrFrame);\n      }\n      if (this._config.isDebugVisible) {\n        this._debugText.clear();\n      }\n      this._fps.update(elapsedTime);\n      if (this._inputManager) {\n        this._inputManager.isPickingEnabled = this._config.isTransitionPickingEnabled || this._renderer.transitionTime == 1;\n        this._inputManager.update(elapsedTime, xrFrame);\n      }\n      let amount = Math.min(elapsedTime * this._config.positionSmoothing, 1);\n      lerp(this._smoothedModelPosition, this._smoothedModelPosition, this._modelPosition, amount);\n      amount = Math.min(elapsedTime * this._config.rotationSmoothing, 1);\n      slerp(this._smoothedModelRotation, this._smoothedModelRotation, this._modelRotation, amount);\n      amount = Math.min(elapsedTime * this._config.scaleSmoothing, 1);\n      lerp(this._smoothedModelScale, this._smoothedModelScale, this._modelScale, amount);\n      fromRotationTranslationScaleOrigin(this._modelMMatrix, this._smoothedModelRotation, this._smoothedModelPosition, this._smoothedModelScale, this._modelManipulationOrigin);\n      this._renderer.mMatrix = this._modelMMatrix;\n      if (this._config.isDebugVisible) {\n        this._debugText.addLine(`mod pos ${this._smoothedModelPosition[0] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[0].toFixed(3)},${this._smoothedModelPosition[1] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[1].toFixed(3)},${this._smoothedModelPosition[2] < 0 ? \"\" : \" \"}${this._smoothedModelPosition[2].toFixed(3)}`);\n        this._debugText.addLine(`mod rot ${this._smoothedModelRotation[0] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[0].toFixed(3)},${this._smoothedModelRotation[1] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[1].toFixed(3)},${this._smoothedModelRotation[2] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[2].toFixed(3)},${this._smoothedModelRotation[3] < 0 ? \"\" : \" \"}${this._smoothedModelRotation[3].toFixed(3)}`);\n        this._debugText.addLine(`mod siz  ${this._smoothedModelScale[0].toFixed(3)}`);\n        this._debugText.addLine(`man ori ${this._modelManipulationOrigin[0] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[0].toFixed(3)},${this._modelManipulationOrigin[1] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[1].toFixed(3)},${this._modelManipulationOrigin[2] < 0 ? \"\" : \" \"}${this._modelManipulationOrigin[2].toFixed(3)}`);\n        this._debugText.addLine(`scr dst  ${this._config.screenDistance.toFixed(3)}`);\n        this._debugText.addLine(`cam fov  ${Math.round(AngleHelper.radiansToDegrees(this._config.fov))}`);\n        this._debugText.addLine(`tbf tot  ${this._renderer.transitionBuffers.length}`);\n      }\n      if (!xrFrame) {\n        this._camera.width = this._renderer.width;\n        this._camera.height = this._renderer.height;\n        this._camera.modelMMatrix = this._modelMMatrix;\n        this._camera.modelPosition = this._smoothedModelPosition;\n        this._camera.modelRotation = this._smoothedModelRotation;\n        this._camera.modelScale = this._smoothedModelScale;\n        this._camera.modelManipulationOrigin = this._modelManipulationOrigin;\n        this._camera.update(elapsedTime);\n        this._renderer.vMatrices = this._camera.vMatrices;\n        this._renderer.mvMatrices = this._camera.mvMatrices;\n        this._renderer.pMatrices = this._camera.pMatrices;\n        this._renderer.inverseVMatrices = this._camera.inverseVMatrices;\n        this._renderer.inversePMatrices = this._camera.inversePMatrices;\n      }\n      this._renderer.prepare(xrFrame);\n      if (!xrFrame && this._config.stereoMode == StereoMode.none) {\n        this._renderer.pickPMatrix = this._camera.pMatrices[0];\n      } else {\n        const fov = MatrixHelper.fieldOfViewFromProjectionMatrix(this._renderer.pMatrices[0]);\n        perspective(this._mat4, fov, this._renderer.width / this._renderer.height, this._config.nearPlane, this._config.farPlane);\n        this._renderer.pickPMatrix = this._mat4;\n      }\n      if (this._renderer.isInitialized) {\n        this._renderer.update(elapsedTime);\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$3(this, void 0, void 0, function* () {\n        this._fps.render();\n        if (this._renderer.isInitialized) {\n          yield this._renderer.render(elapsedTime, xrFrame);\n          if (this.afterRenderCallback) {\n            this.afterRenderCallback();\n          }\n        }\n      });\n    }\n    _syncSmooth() {\n      copy$3(this._smoothedModelPosition, this._modelPosition);\n      copy$3(this._smoothedModelScale, this._modelScale);\n      copy$1(this._smoothedModelRotation, this._modelRotation);\n    }\n    _updateManipulationOrigin(position2) {\n      this._log.write(LogLevel.info, `manipulation origin ${position2[0].toFixed(3)},${position2[1].toFixed(3)},${position2[2].toFixed(3)}`);\n      this._camera.updateModelManipulationOrigin(this._modelManipulationOrigin, position2);\n      copy$3(this._modelManipulationOrigin, position2);\n      transformMat4$2(this._vec3, this._modelManipulationOrigin, this._modelMMatrix);\n      subtract(this._modelPosition, this._vec3, this._modelManipulationOrigin);\n      copy$3(this._smoothedModelPosition, this._modelPosition);\n      if (this.manipulationOriginChangedCallback) {\n        const result = {\n          x: position2[0],\n          y: position2[1],\n          z: position2[2]\n        };\n        this.manipulationOriginChangedCallback(result);\n      }\n    }\n    pickLasso(x02, y02, x12, y12, pickType) {\n      const inverseMMatrix = create$4();\n      invert(inverseMMatrix, this._modelMMatrix);\n      const sets = [];\n      const nearPositions = [create$3(), create$3(), create$3(), create$3()];\n      const farPositions = [create$3(), create$3(), create$3(), create$3()];\n      const directions = [create$3(), create$3(), create$3(), create$3()];\n      this._camera.unproject(nearPositions[0], x02, y12, -1);\n      this._camera.unproject(farPositions[0], x02, y12, 1);\n      this._camera.unproject(nearPositions[1], x12, y12, -1);\n      this._camera.unproject(farPositions[1], x12, y12, 1);\n      this._camera.unproject(nearPositions[2], x12, y02, -1);\n      this._camera.unproject(farPositions[2], x12, y02, 1);\n      this._camera.unproject(nearPositions[3], x02, y02, -1);\n      this._camera.unproject(farPositions[3], x02, y02, 1);\n      for (let i = 0; i < 4; i++) {\n        transformMat4$2(nearPositions[i], nearPositions[i], inverseMMatrix);\n        transformMat4$2(farPositions[i], farPositions[i], inverseMMatrix);\n        subtract(directions[i], farPositions[i], nearPositions[i]);\n        normalize$2(directions[i], directions[i]);\n      }\n      const normals = [create$3(), create$3(), create$3(), create$3()];\n      const d = [];\n      for (let i = 0; i < 4; i++) {\n        cross(normals[i], directions[(i + 1) % 4], directions[i]);\n        normalize$2(normals[i], normals[i]);\n        d.push(-dot$1(normals[i], nearPositions[i]));\n      }\n      if (pickType == PickType.data) {\n        const translation = create$3();\n        for (let i = 0; i < this._renderer.transitionBuffers.length; i++) {\n          const transitionBuffer = this._renderer.transitionBuffers[i];\n          const set2 = /* @__PURE__ */ new Set();\n          if (transitionBuffer.isVisible) {\n            const start = window.performance.now();\n            const currentBuffer = transitionBuffer.currentBuffer;\n            const lookup2 = currentBuffer.lookup;\n            for (let j = 0; j < currentBuffer.length; j++) {\n              const id2 = currentBuffer.ids[j];\n              const index2 = lookup2[id2];\n              if (index2 != null) {\n                UnitVertex.getTranslation(currentBuffer.dataView, index2, translation);\n                let isInside = true;\n                for (let k = 0; k < 4; k++) {\n                  let distance2 = dot$1(normals[k], translation);\n                  distance2 += d[k];\n                  if (distance2 < 0) {\n                    isInside = false;\n                    break;\n                  }\n                }\n                if (isInside) {\n                  set2.add(id2);\n                }\n              }\n            }\n            if (set2.size > 0) {\n              this._log.write(LogLevel.info, `lasso transition buffer ${i} picked ${set2.size} ${Math.round(window.performance.now() - start)}ms`);\n            }\n          }\n          sets.push(set2);\n        }\n      }\n      return sets;\n    }\n  }\n  const StereoMode = {\n    none: \"none\",\n    split: \"split\",\n    anaglyph: \"anaglyph\",\n    left: \"left\",\n    right: \"right\"\n  };\n  const HorizontalAlignment = {\n    left: \"left\",\n    center: \"center\",\n    right: \"right\"\n  };\n  const VerticalAlignment = {\n    top: \"top\",\n    center: \"center\",\n    bottom: \"bottom\"\n  };\n  const AxesTextOrientation = {\n    parallel: \"parallel\",\n    perpendicular: \"perpendicular\"\n  };\n  const AxesVisibility = {\n    none: \"none\",\n    current: \"current\",\n    previous: \"previous\"\n  };\n  const PickType = {\n    none: 0,\n    data: 1,\n    label: 2,\n    axesDivision: 3,\n    axesTitle: 4,\n    axesLabel: 5,\n    axesHeading: 6\n  };\n  const Theme = {\n    dark: \"dark\",\n    light: \"light\"\n  };\n  const HighlightMode = {\n    luminance: \"luminance\",\n    color: \"color\"\n  };\n  const UnitType = {\n    block: \"block\",\n    blockSdf: \"blockSdf\",\n    sphere: \"sphere\",\n    sphereSdf: \"sphereSdf\",\n    cylinder: \"cylinder\",\n    cylinderSdf: \"cylinderSdf\",\n    hexPrism: \"hexPrism\",\n    hexPrismSdf: \"hexPrismSdf\",\n    sdf: \"sdf\",\n    disk: \"disk\",\n    ringSdf: \"ringSdf\"\n  };\n  const SingleTouchAction = {\n    translate: \"translate\",\n    rotate: \"rotate\",\n    lasso: \"lasso\"\n  };\n  const MouseWheelAction = {\n    zoom: \"zoom\",\n    rotateY: \"rotateY\"\n  };\n  const LogLevel = {\n    trace: 0,\n    debug: 1,\n    info: 2,\n    warn: 3,\n    error: 4\n  };\n  const Edge3D = {\n    topFront: 0,\n    topRight: 1,\n    topBack: 2,\n    bottomRight: 5,\n    frontRight: 8,\n    backRight: 9\n  };\n  const RenderMode = {\n    color: \"color\"\n  };\n  let LabelSetVisual$2 = class LabelSetVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(labelSet) {\n      this.label = labelSet;\n    }\n  };\n  class LabelBase {\n    get material() {\n      return this._material;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get verticesView() {\n      return this._verticesView;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get materialType() {\n      return this._materialType;\n    }\n    get materialColor() {\n      return this._materialColor;\n    }\n    get materialFuzz() {\n      return this._materialFuzz;\n    }\n    get materialGloss() {\n      return this._materialGloss;\n    }\n    get segmentColor() {\n      return this._segmentColor;\n    }\n    get scale() {\n      return this._scale;\n    }\n    set scale(value2) {\n      if (this._scale != value2) {\n        this._scale = value2;\n        this._hasChanged = true;\n      }\n    }\n    get font() {\n      return this._font;\n    }\n    set font(value2) {\n      if (this._font != value2) {\n        this._font = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotation() {\n      return this._rotation;\n    }\n    set rotation(value2) {\n      if (this._rotation != value2) {\n        this._rotation = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseX(value2) {\n      if (this._reverseX != value2) {\n        this._reverseX = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseY(value2) {\n      if (this._reverseY != value2) {\n        this._reverseY = value2;\n        this._hasChanged = true;\n      }\n    }\n    set reverseZ(value2) {\n      if (this._reverseZ != value2) {\n        this._reverseZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get horizontalAlignment() {\n      return this._horizontalAlignment;\n    }\n    set horizontalAlignment(value2) {\n      if (this._horizontalAlignment != value2) {\n        this._horizontalAlignment = value2;\n        this._hasChanged = true;\n      }\n    }\n    get verticalAlignment() {\n      return this._verticalAlignment;\n    }\n    set verticalAlignment(value2) {\n      if (this._verticalAlignment != value2) {\n        this._verticalAlignment = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetX() {\n      return this._offsetX;\n    }\n    set offsetX(value2) {\n      if (this._offsetX != value2) {\n        this._offsetX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetY() {\n      return this._offsetY;\n    }\n    set offsetY(value2) {\n      if (this._offsetY != value2) {\n        this._offsetY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetZ() {\n      return this._offsetZ;\n    }\n    set offsetZ(value2) {\n      if (this._offsetZ != value2) {\n        this._offsetZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxGlyphTop() {\n      return this._maxGlyphTop;\n    }\n    set maxGlyphTop(value2) {\n      if (this._maxGlyphTop != value2) {\n        this._maxGlyphTop = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxGlyphHeight() {\n      return this._maxGlyphHeight;\n    }\n    set maxGlyphHeight(value2) {\n      if (this._maxGlyphHeight != value2) {\n        this._maxGlyphHeight = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options) {\n      this._core = core;\n      this._offset = create$3();\n      this._vec3 = create$3();\n      this._vec4 = create$2();\n      this._mMatrix = create$4();\n      this._indexCount = 0;\n      this._maxGlyphs = options.maxGlyphs;\n      this._textMetric = { width: 0, maxHeight: 0, maxTop: 0 };\n      this.scale = options.scale ? options.scale : 1;\n      this.offsetX = options.offsetX ? options.offsetX : 0;\n      this.offsetY = options.offsetY ? options.offsetY : 0;\n      this.offsetZ = options.offsetZ ? options.offsetZ : 0;\n      this.reverseX = options.reverseX;\n      this.reverseY = options.reverseY;\n      this.reverseZ = options.reverseZ;\n      this.rotation = options.rotation;\n      this.maxGlyphTop = options.maxGlyphTop;\n      this.horizontalAlignment = options.horizontalAlignment === void 0 ? HorizontalAlignment.center : options.horizontalAlignment;\n      this.verticalAlignment = options.verticalAlignment === void 0 ? VerticalAlignment.center : options.verticalAlignment;\n      this._material = options.material;\n      this.borderWidth = core.config.textBorderWidth;\n      this.gamma = 0;\n      this._materialType = options.materialType || 0;\n      this._materialColor = options.materialColor || core.config.textColor;\n      this._materialFuzz = options.materialFuzz || 0;\n      this._materialGloss = options.materialGloss || 0;\n      this._segmentColor = options.segmentColor;\n    }\n    initialize() {\n      this._vertices = new ArrayBuffer(PositionTexturePickVertex.SIZE_BYTES * this._maxGlyphs * 4);\n      this._verticesView = new DataView(this._vertices);\n      this._indices = new Uint32Array(this._maxGlyphs * 6);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n  }\n  class LabelSet extends LabelBase {\n    get materials() {\n      return this._materials;\n    }\n    get materialTypes() {\n      return this._materialTypes;\n    }\n    get materialColors() {\n      return this._materialColors;\n    }\n    get materialFuzzes() {\n      return this._materialFuzzes;\n    }\n    get materialGlosses() {\n      return this._materialGlosses;\n    }\n    get segmentColors() {\n      return this._segmentColors;\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (this._minBoundsX != value2) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (this._minBoundsY != value2) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (this._minBoundsZ != value2) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (this._maxBoundsX != value2) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (this._maxBoundsY != value2) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (this._maxBoundsZ != value2) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsX() {\n      return this._positionsX;\n    }\n    set positionsX(value2) {\n      if (this._positionsX != value2) {\n        this._positionsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsY() {\n      return this._positionsY;\n    }\n    set positionsY(value2) {\n      if (this._positionsY != value2) {\n        this._positionsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionsZ() {\n      return this._positionsZ;\n    }\n    set positionsZ(value2) {\n      if (this._positionsZ != value2) {\n        this._positionsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingX() {\n      return this._positionScalingX;\n    }\n    set positionScalingX(value2) {\n      if (this._positionScalingX != value2) {\n        this._positionScalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingY() {\n      return this._positionScalingY;\n    }\n    set positionScalingY(value2) {\n      if (this._positionScalingY != value2) {\n        this._positionScalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get positionScalingZ() {\n      return this._positionScalingZ;\n    }\n    set positionScalingZ(value2) {\n      if (this._positionScalingZ != value2) {\n        this._positionScalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotations() {\n      return this._rotations;\n    }\n    set rotations(value2) {\n      if (this._rotations != value2) {\n        this._rotations = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsX() {\n      return this._offsetsX;\n    }\n    set offsetsX(value2) {\n      if (this._offsetsX != value2) {\n        this._offsetsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsY() {\n      return this._offsetsY;\n    }\n    set offsetsY(value2) {\n      if (this._offsetsY != value2) {\n        this._offsetsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetsZ() {\n      return this._offsetsZ;\n    }\n    set offsetsZ(value2) {\n      if (this._offsetsZ != value2) {\n        this._offsetsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingX() {\n      return this._offsetScalingX;\n    }\n    set offsetScalingX(value2) {\n      if (this._offsetScalingX != value2) {\n        this._offsetScalingX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingY() {\n      return this._offsetScalingY;\n    }\n    set offsetScalingY(value2) {\n      if (this._offsetScalingY != value2) {\n        this._offsetScalingY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get offsetScalingZ() {\n      return this._offsetScalingZ;\n    }\n    set offsetScalingZ(value2) {\n      if (this._offsetScalingZ != value2) {\n        this._offsetScalingZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get text() {\n      return this._text;\n    }\n    set text(value2) {\n      if (this._text != value2) {\n        this._text = value2;\n        this._hasChanged = true;\n      }\n    }\n    get horizontalAlignments() {\n      return this._horizontalAlignments;\n    }\n    set horizontalAlignments(value2) {\n      if (this._horizontalAlignments != value2) {\n        this._horizontalAlignments = value2;\n        this._hasChanged = true;\n      }\n    }\n    get verticalAlignments() {\n      return this._verticalAlignments;\n    }\n    set verticalAlignments(value2) {\n      if (this._verticalAlignments != value2) {\n        this._verticalAlignments = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scales() {\n      return this._scales;\n    }\n    set scales(value2) {\n      if (this._scales != value2) {\n        this._scales = value2;\n        this._hasChanged = true;\n      }\n    }\n    get scalesScaling() {\n      return this._scalesScaling;\n    }\n    set scalesScaling(value2) {\n      if (this._scalesScaling != value2) {\n        this._scalesScaling = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options) {\n      super(core, options);\n      this._quat = create$1();\n      this._materials = options.materials;\n      this._materialType = options.materialType;\n      this._materialColor = options.materialColors ? null : options.materialColor || core.config.textColor;\n      this._materialColors = options.materialColors;\n      this.minBoundsX = options.minBoundsX ? options.minBoundsX : 0;\n      this.minBoundsY = options.minBoundsY ? options.minBoundsY : 0;\n      this.minBoundsZ = options.minBoundsZ ? options.minBoundsZ : 0;\n      this.maxBoundsX = options.maxBoundsX ? options.maxBoundsX : 1;\n      this.maxBoundsY = options.maxBoundsY ? options.maxBoundsY : 1;\n      this.maxBoundsZ = options.maxBoundsZ ? options.maxBoundsZ : 1;\n      this._font = options.font || core.font;\n      this.text = options.text;\n      this.positionsX = options.positionsX;\n      this.positionsY = options.positionsY;\n      this.positionsZ = options.positionsZ;\n      this.positionScalingX = options.positionScalingX ? options.positionScalingX : 1;\n      this.positionScalingY = options.positionScalingY ? options.positionScalingY : 1;\n      this.positionScalingZ = options.positionScalingZ ? options.positionScalingZ : 1;\n      this.rotations = options.rotations;\n      this.offsetsX = options.offsetsX;\n      this.offsetsY = options.offsetsY;\n      this.offsetsZ = options.offsetsZ;\n      this.offsetScalingX = options.offsetScalingX ? options.offsetScalingX : 1;\n      this.offsetScalingY = options.offsetScalingY ? options.offsetScalingY : 1;\n      this.offsetScalingZ = options.offsetScalingZ ? options.offsetScalingZ : 1;\n      if (options.horizontalAlignments)\n        this.horizontalAlignments = options.horizontalAlignments;\n      if (options.verticalAlignments)\n        this.verticalAlignments = options.verticalAlignments;\n      if (options.scales)\n        this.scales = options.scales;\n      this.scalesScaling = options.scalesScaling ? options.scalesScaling : 1;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.pickIdLookup = {};\n        if (!this._text) {\n          this._indexCount = 0;\n        } else {\n          const start = window.performance.now();\n          const modelSizeX = this._maxBoundsX - this._minBoundsX;\n          const modelSizeY = this._maxBoundsY - this._minBoundsY;\n          const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n          const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n          const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n          const modelOriginX = (this._minBoundsX + this._maxBoundsX) / 2;\n          const modelOriginY = (this._minBoundsY + this._maxBoundsY) / 2;\n          const modelOriginZ = (this._minBoundsZ + this._maxBoundsZ) / 2;\n          if (this._rotation) {\n            set$1(this._quat, this._rotation[0], this._rotation[1], this._rotation[2], this._rotation[3]);\n          }\n          let glyphs = 0;\n          for (let i = 0; i < this._text.length; i++) {\n            const offsetX = (this._offsetsX ? this._offsetsX[i] / 2 : this._offsetX) * boundsScaling * this._offsetScalingX;\n            const offsetY = (this._offsetsY ? this._offsetsY[i] / 2 : this._offsetY) * boundsScaling * this._offsetScalingY;\n            const offsetZ = (this._offsetsZ ? this._offsetsZ[i] / 2 : this._offsetZ) * boundsScaling * this._offsetScalingZ;\n            const text2 = TextHelper.truncate(this._text[i], this._maxGlyphs - glyphs);\n            const scale2 = (this._scales ? this._scales[i] * this._scalesScaling : this._scale) * boundsScaling / this._font.size;\n            TextHelper.measure(this._font, text2, this._textMetric);\n            const width2 = this._textMetric.width * scale2;\n            const lineHeight2 = this._font.size * scale2;\n            const maxGlyphTop = (this._maxGlyphTop ? this._maxGlyphTop : this._textMetric.maxTop) * scale2;\n            const horizontalAlignment = this._horizontalAlignments ? this._horizontalAlignments[i] : this._horizontalAlignment;\n            switch (horizontalAlignment) {\n              case HorizontalAlignment.left:\n                this._offset[0] = offsetX;\n                break;\n              case HorizontalAlignment.center:\n                this._offset[0] = offsetX - width2 / 2;\n                break;\n              case HorizontalAlignment.right:\n                this._offset[0] = offsetX - width2;\n                break;\n            }\n            const verticalAlignment = this._verticalAlignments ? this._verticalAlignments[i] : this._verticalAlignment;\n            switch (verticalAlignment) {\n              case VerticalAlignment.top:\n                this._offset[1] = offsetY - lineHeight2 / 2;\n                break;\n              case VerticalAlignment.center:\n                this._offset[1] = offsetY;\n                break;\n              case VerticalAlignment.bottom:\n                this._offset[1] = offsetY + lineHeight2 / 2;\n                break;\n            }\n            this._offset[1] -= maxGlyphTop / 2;\n            this._offset[2] = offsetZ;\n            let positionX = this.positionsX ? this.positionsX[i] * this.positionScalingX : 0;\n            let positionY = this.positionsY ? this.positionsY[i] * this.positionScalingY : 0;\n            let positionZ = this.positionsZ ? this.positionsZ[i] * this.positionScalingZ : 0;\n            if (this._reverseX) {\n              positionX = this.minBoundsX + this.maxBoundsX - positionX;\n            }\n            if (this._reverseY) {\n              positionY = this.minBoundsY + this.maxBoundsY - positionY;\n            }\n            if (this._reverseZ) {\n              positionZ = this.minBoundsZ + this.maxBoundsZ - positionZ;\n            }\n            set$3(this._vec3, (positionX - modelOriginX) * boundsScaling, (positionY - modelOriginY) * boundsScaling, (positionZ - modelOriginZ) * boundsScaling);\n            if (this._rotations) {\n              set$1(this._quat, this._rotations[i * 4], this._rotations[i * 4 + 1], this._rotations[i * 4 + 2], this._rotations[i * 4 + 3]);\n            }\n            const pickId = PickHelper.nextPickId();\n            PickHelper.encodeNumber(pickId, PickType.label, this._vec4);\n            this.pickIdLookup[pickId] = i;\n            TextHelper.addString(this._font, text2, this._verticesView, this._indices, glyphs, this._vec3, scale2, this._offset, this._rotation || this._rotations ? this._quat : null, this._vec4);\n            glyphs += text2.length;\n            if (glyphs >= this._maxGlyphs) {\n              glyphs = this._maxGlyphs;\n              break;\n            }\n          }\n          this._indexCount = glyphs * 6;\n          this._core.log.write(LogLevel.info, `label set updated ${Math.round(window.performance.now() - start)}ms`);\n          if (this.hasChangedCallback) {\n            this.hasChangedCallback();\n          }\n        }\n      }\n    }\n  }\n  let ImageVisual$2 = class ImageVisual {\n    render(elapsedTime, xrFrame) {\n    }\n    update(elapsedTime) {\n    }\n    constructor(image2) {\n      this.image = image2;\n    }\n  };\n  class ImageBase {\n    get material() {\n      return this._material;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get mMatrix() {\n      return this._mMatrix;\n    }\n    get imageData() {\n      return this._imageData;\n    }\n    set imageData(value2) {\n      if (this._imageData != value2) {\n        this._imageData = value2;\n        this._hasChanged = true;\n      }\n    }\n    get rotation() {\n      return this._rotation;\n    }\n    set rotation(value2) {\n      if (!equals$1(this._rotation, value2)) {\n        copy$1(this._rotation, value2);\n        this._hasChanged = true;\n      }\n    }\n    get position() {\n      return this._position;\n    }\n    set position(value2) {\n      if (!equals$2(this._position, value2)) {\n        copy$3(this._position, value2);\n        this._hasChanged = true;\n      }\n    }\n    get texCoord0() {\n      return this._texCoord0;\n    }\n    set texCoord0(value2) {\n      if (!equals(this._texCoord0, value2)) {\n        copy(this._texCoord0, value2);\n        this._hasChanged = true;\n      }\n    }\n    get texCoord1() {\n      return this._texCoord1;\n    }\n    set texCoord1(value2) {\n      if (!equals(this._texCoord1, value2)) {\n        copy(this._texCoord1, value2);\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsX() {\n      return this._minBoundsX;\n    }\n    set minBoundsX(value2) {\n      if (this._minBoundsX != value2) {\n        this._minBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsY() {\n      return this._minBoundsY;\n    }\n    set minBoundsY(value2) {\n      if (this._minBoundsY != value2) {\n        this._minBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get minBoundsZ() {\n      return this._minBoundsZ;\n    }\n    set minBoundsZ(value2) {\n      if (this._minBoundsZ != value2) {\n        this._minBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsX() {\n      return this._maxBoundsX;\n    }\n    set maxBoundsX(value2) {\n      if (this._maxBoundsX != value2) {\n        this._maxBoundsX = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsY() {\n      return this._maxBoundsY;\n    }\n    set maxBoundsY(value2) {\n      if (this._maxBoundsY != value2) {\n        this._maxBoundsY = value2;\n        this._hasChanged = true;\n      }\n    }\n    get maxBoundsZ() {\n      return this._maxBoundsZ;\n    }\n    set maxBoundsZ(value2) {\n      if (this._maxBoundsZ != value2) {\n        this._maxBoundsZ = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options) {\n      this._core = core;\n      this._mMatrix = create$4();\n      this._origin = create$3();\n      this._translation = create$3();\n      this._scale = create$3();\n      this._transform = create$4();\n      this._imageData = options.imageData;\n      this._minBoundsX = options.minBoundsX === void 0 ? 0 : options.minBoundsX;\n      this._minBoundsY = options.minBoundsY === void 0 ? 0 : options.minBoundsY;\n      this._minBoundsZ = options.minBoundsZ === void 0 ? 0 : options.minBoundsZ;\n      this._maxBoundsX = options.maxBoundsX === void 0 ? 1 : options.maxBoundsX;\n      this._maxBoundsY = options.maxBoundsY === void 0 ? 1 : options.maxBoundsY;\n      this._maxBoundsZ = options.maxBoundsZ === void 0 ? 1 : options.maxBoundsZ;\n      this._position = options.position ? clone$3(options.position) : create$3();\n      this._rotation = options.rotation ? clone$1(options.rotation) : create$1();\n      this._texCoord0 = options.texCoord0 ? clone(options.texCoord0) : fromValues(0, 0);\n      this._texCoord1 = options.texCoord1 ? clone(options.texCoord1) : fromValues(1, 1);\n      this._material = options.material === void 0 ? -1 : options.material;\n      this._hasChanged = true;\n    }\n  }\n  class ImageQuad extends ImageBase {\n    get width() {\n      return this._width;\n    }\n    set width(value2) {\n      if (this._width != value2) {\n        this._width = value2;\n        this._hasChanged = true;\n      }\n    }\n    get height() {\n      return this._height;\n    }\n    set height(value2) {\n      if (this._height != value2) {\n        this._height = value2;\n        this._hasChanged = true;\n      }\n    }\n    constructor(core, options) {\n      super(core, options);\n      this._width = options.width === void 0 ? 1 : options.width;\n      this._height = options.height === void 0 ? 1 : options.height;\n      this._texTransform = create$4();\n      translate(this._texTransform, this._texTransform, fromValues$3(0, 1, 0));\n      scale$1(this._texTransform, this._texTransform, fromValues$3(1, -1, 1));\n    }\n    initialize() {\n      this._vertices = new ArrayBuffer(PositionNormalTextureVertex.SIZE_BYTES * 4);\n      this._indices = Quad$2.INDICES;\n      this._indexCount = this._indices.length;\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        const modelSizeX = this._maxBoundsX - this._minBoundsX;\n        const modelSizeY = this._maxBoundsY - this._minBoundsY;\n        const modelSizeZ = this._maxBoundsZ - this._minBoundsZ;\n        const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n        const boundsScaling = maxBounds == 0 ? 1 : 1 / maxBounds;\n        set$3(this._origin, (this._minBoundsX + this._maxBoundsX) / 2, (this._minBoundsY + this._maxBoundsY) / 2, (this._minBoundsZ + this._maxBoundsZ) / 2);\n        subtract(this._translation, this._position, this._origin);\n        scale(this._translation, this._translation, boundsScaling);\n        set$3(this._scale, this._width, this._height, 1);\n        scale(this._scale, this._scale, boundsScaling);\n        fromRotationTranslationScale(this._transform, this._rotation, this._translation, this._scale);\n        this._verticesView = Quad$2.normalTextured(this._transform, this._texTransform);\n        this._vertices = this._verticesView.buffer;\n        if (this.hasChangedCallback) {\n          this.hasChangedCallback();\n        }\n      }\n    }\n  }\n  class BoundsHelper {\n    static rotateBounds(minBounds, maxBounds, rotation2, rotatedMinBounds, rotatedMaxBounds, offset2) {\n      const sizeX = maxBounds[0] - minBounds[0];\n      const sizeY = maxBounds[1] - minBounds[1];\n      const sizeZ = maxBounds[2] - minBounds[2];\n      const min$12 = rotatedMinBounds;\n      const max$12 = rotatedMaxBounds;\n      set$3(min$12, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n      set$3(max$12, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n      const vertices = Cube.POSITIONS;\n      const position2 = create$3();\n      for (let i = 0; i < 8; i++) {\n        set$3(position2, vertices[i * 3] * sizeX, vertices[i * 3 + 1] * sizeY, vertices[i * 3 + 2] * sizeZ);\n        add(position2, position2, offset2);\n        transformQuat(position2, position2, rotation2);\n        subtract(position2, position2, offset2);\n        min(min$12, min$12, position2);\n        max(max$12, max$12, position2);\n      }\n      add(position2, minBounds, maxBounds);\n      scale(position2, position2, 0.5);\n      add(min$12, min$12, position2);\n      add(max$12, max$12, position2);\n    }\n    static cylinder(pa2, pb, radius2, minBounds, maxBounds) {\n      const a2 = create$3();\n      subtract(a2, pb, pa2);\n      const aa = dot$1(a2, a2);\n      const ex = radius2 * Math.sqrt(1 - a2[0] * a2[0] / aa);\n      const ey = radius2 * Math.sqrt(1 - a2[1] * a2[1] / aa);\n      const ez = radius2 * Math.sqrt(1 - a2[2] * a2[2] / aa);\n      minBounds[0] = Math.min(pa2[0] - ex, pb[0] - ex);\n      minBounds[1] = Math.min(pa2[1] - ey, pb[1] - ey);\n      minBounds[2] = Math.min(pa2[2] - ez, pb[2] - ez);\n      maxBounds[0] = Math.max(pa2[0] + ex, pb[0] + ex);\n      maxBounds[1] = Math.max(pa2[1] + ey, pb[1] + ey);\n      maxBounds[2] = Math.max(pa2[2] + ez, pb[2] + ez);\n    }\n  }\n  class LayoutBase {\n    get facetScaling() {\n      return this._facetScaling;\n    }\n    offsetX(facetCoordX) {\n      return ((facetCoordX + 0.5) / this._facetsX - 0.5) * (this.maxModelBoundsX - this.minModelBoundsX) / this._maxBounds;\n    }\n    offsetY(facetCoordY) {\n      return ((facetCoordY + 0.5) / this._facetsY - 0.5) * (this.maxModelBoundsY - this.minModelBoundsY) / this._maxBounds;\n    }\n    offsetZ(facetCoordZ) {\n      return ((facetCoordZ + 0.5) / this._facetsZ - 0.5) * (this.maxModelBoundsZ - this.minModelBoundsZ) / this._maxBounds;\n    }\n    constructor(core) {\n      this._core = core;\n      this.modelOriginX = 0;\n      this.modelOriginY = 0;\n      this.modelOriginZ = 0;\n      this.minModelBoundsX = 0;\n      this.minModelBoundsY = 0;\n      this.minModelBoundsZ = 0;\n      this.maxModelBoundsX = 0;\n      this.maxModelBoundsY = 0;\n      this.maxModelBoundsZ = 0;\n      this.minLayoutBoundsX = 0;\n      this.minLayoutBoundsY = 0;\n      this.minLayoutBoundsZ = 0;\n      this.maxLayoutBoundsX = 0;\n      this.maxLayoutBoundsY = 0;\n      this.maxLayoutBoundsZ = 0;\n      this._facetSpacingX = 0;\n      this._facetSpacingY = 0;\n      this._facetSpacingZ = 0;\n      this._facetSizeX = 0;\n      this._facetSizeY = 0;\n      this._facetSizeZ = 0;\n      this._facetsX = 1;\n      this._facetsY = 1;\n      this._facetsZ = 1;\n    }\n    _updateModelBounds(options) {\n      this.minModelBoundsX = options.minBoundsX === void 0 ? this.minLayoutBoundsX : options.minBoundsX;\n      this.minModelBoundsY = options.minBoundsY === void 0 ? this.minLayoutBoundsY : options.minBoundsY;\n      this.minModelBoundsZ = options.minBoundsZ === void 0 ? this.minLayoutBoundsZ : options.minBoundsZ;\n      this.maxModelBoundsX = options.maxBoundsX === void 0 ? this.maxLayoutBoundsX : options.maxBoundsX;\n      this.maxModelBoundsY = options.maxBoundsY === void 0 ? this.maxLayoutBoundsY : options.maxBoundsY;\n      this.maxModelBoundsZ = options.maxBoundsZ === void 0 ? this.maxLayoutBoundsZ : options.maxBoundsZ;\n      this._isFacetted = options.facetsX !== void 0 && options.facetsX > 1 && options.facetCoordsX != null || options.facetsY !== void 0 && options.facetsY > 1 && options.facetCoordsY != null || options.facetsZ !== void 0 && options.facetsZ > 1 && options.facetCoordsZ != null;\n      this._facetSpacingX = options.facetSpacingX === void 0 ? 0 : options.facetSpacingX;\n      this._facetSpacingY = options.facetSpacingY === void 0 ? 0 : options.facetSpacingY;\n      this._facetSpacingZ = options.facetSpacingZ === void 0 ? 0 : options.facetSpacingZ;\n      let modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n      let modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n      let modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n      const maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n      this._facetSizeX = modelSizeX;\n      this._facetSizeY = modelSizeY;\n      this._facetSizeZ = modelSizeZ;\n      this._facetsX = options.facetCoordsX ? options.facetsX : 1;\n      this._facetsY = options.facetCoordsY ? options.facetsY : 1;\n      this._facetsZ = options.facetCoordsZ ? options.facetsZ : 1;\n      this.minModelBoundsX -= this._facetSizeX * this._facetSpacingX / 2;\n      this.minModelBoundsY -= this._facetSizeY * this._facetSpacingY / 2;\n      this.minModelBoundsZ -= this._facetSizeZ * this._facetSpacingZ / 2;\n      this.maxModelBoundsX = this.minModelBoundsX + this._facetsX * this._facetSizeX * (1 + this._facetSpacingX);\n      this.maxModelBoundsY = this.minModelBoundsY + this._facetsY * this._facetSizeY * (1 + this._facetSpacingY);\n      this.maxModelBoundsZ = this.minModelBoundsZ + this._facetsZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n      this.modelOriginX = (this.minModelBoundsX + this.maxModelBoundsX) / 2;\n      this.modelOriginY = (this.minModelBoundsY + this.maxModelBoundsY) / 2;\n      this.modelOriginZ = (this.minModelBoundsZ + this.maxModelBoundsZ) / 2;\n      modelSizeX = this.maxModelBoundsX - this.minModelBoundsX;\n      modelSizeY = this.maxModelBoundsY - this.minModelBoundsY;\n      modelSizeZ = this.maxModelBoundsZ - this.minModelBoundsZ;\n      this._maxBounds = Math.max(modelSizeX, Math.max(modelSizeY, modelSizeZ));\n      this._boundsScaling = this._maxBounds == 0 ? 1 : 1 / this._maxBounds;\n      this._facetScaling = maxBounds / this._maxBounds;\n    }\n    resetCumulativeLayoutBounds() {\n      this.minCumulativeLayoutBoundsX = void 0;\n      this.minCumulativeLayoutBoundsY = void 0;\n      this.minCumulativeLayoutBoundsZ = void 0;\n      this.maxCumulativeLayoutBoundsX = void 0;\n      this.maxCumulativeLayoutBoundsY = void 0;\n      this.maxCumulativeLayoutBoundsZ = void 0;\n    }\n    _updateCumulativeLayoutBounds() {\n      this.minCumulativeLayoutBoundsX = this.minCumulativeLayoutBoundsX === void 0 ? this.minLayoutBoundsX : Math.min(this.minCumulativeLayoutBoundsX, this.minLayoutBoundsX);\n      this.minCumulativeLayoutBoundsY = this.minCumulativeLayoutBoundsY === void 0 ? this.minLayoutBoundsY : Math.min(this.minCumulativeLayoutBoundsY, this.minLayoutBoundsY);\n      this.minCumulativeLayoutBoundsZ = this.minCumulativeLayoutBoundsZ === void 0 ? this.minLayoutBoundsZ : Math.min(this.minCumulativeLayoutBoundsZ, this.minLayoutBoundsZ);\n      this.maxCumulativeLayoutBoundsX = this.maxCumulativeLayoutBoundsX === void 0 ? this.maxLayoutBoundsX : Math.max(this.maxCumulativeLayoutBoundsX, this.maxLayoutBoundsX);\n      this.maxCumulativeLayoutBoundsY = this.maxCumulativeLayoutBoundsY === void 0 ? this.maxLayoutBoundsY : Math.max(this.maxCumulativeLayoutBoundsY, this.maxLayoutBoundsY);\n      this.maxCumulativeLayoutBoundsZ = this.maxCumulativeLayoutBoundsZ === void 0 ? this.maxLayoutBoundsZ : Math.max(this.maxCumulativeLayoutBoundsZ, this.maxLayoutBoundsZ);\n    }\n    unitToModelSize(unitSize) {\n      return unitSize / this._boundsScaling;\n    }\n    unitToModelPositionX(unitPositionX) {\n      return this.unitToModelSize(unitPositionX) + this.modelOriginX;\n    }\n    unitToModelPositionY(unitPositionY) {\n      return this.unitToModelSize(unitPositionY) + this.modelOriginY;\n    }\n    unitToModelPositionZ(unitPositionZ) {\n      return this.unitToModelSize(unitPositionZ) + this.modelOriginZ;\n    }\n    unitToModelPosition(unitPosition, modelPosition) {\n      modelPosition[0] = this.unitToModelPositionX(unitPosition[0]);\n      modelPosition[1] = this.unitToModelPositionY(unitPosition[1]);\n      modelPosition[2] = this.unitToModelPositionZ(unitPosition[2]);\n    }\n    modelToUnitSize(modelSize) {\n      return modelSize * this._boundsScaling;\n    }\n    modelToUnitPositionX(modelPositionX) {\n      return (modelPositionX - this.modelOriginX) * this._boundsScaling;\n    }\n    modelToUnitPositionY(modelPositionY) {\n      return (modelPositionY - this.modelOriginY) * this._boundsScaling;\n    }\n    modelToUnitPositionZ(modelPositionZ) {\n      return (modelPositionZ - this.modelOriginZ) * this._boundsScaling;\n    }\n    modelToUnitPosition(modelPosition, unitPosition) {\n      unitPosition[0] = this.modelToUnitPositionX(modelPosition[0]);\n      unitPosition[1] = this.modelToUnitPositionY(modelPosition[1]);\n      unitPosition[2] = this.modelToUnitPositionZ(modelPosition[2]);\n    }\n    inclusiveUnitBounds(buffer, ids, unitType, offset2, count2, minBounds, maxBounds) {\n      set$3(minBounds, Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n      set$3(maxBounds, -Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n      const unitScale = create$3();\n      const unitRotation = create$1();\n      const unitTranslation = create$3();\n      const lookup2 = buffer.lookup;\n      const dataView = buffer.dataView;\n      let minBounds0;\n      let maxBounds0;\n      let minBounds1;\n      let maxBounds1;\n      switch (unitType) {\n        case UnitType.sphere:\n        case UnitType.sphereSdf:\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            const radius2 = unitScale[0] / 2;\n            minBounds[0] = Math.min(minBounds[0], unitTranslation[0] - radius2);\n            minBounds[1] = Math.min(minBounds[1], unitTranslation[1] - radius2);\n            minBounds[2] = Math.min(minBounds[2], unitTranslation[2] - radius2);\n            maxBounds[0] = Math.max(maxBounds[0], unitTranslation[0] + radius2);\n            maxBounds[1] = Math.max(maxBounds[1], unitTranslation[1] + radius2);\n            maxBounds[2] = Math.max(maxBounds[2], unitTranslation[2] + radius2);\n          }\n          break;\n        case UnitType.hexPrism:\n        case UnitType.hexPrismSdf:\n        case UnitType.block:\n        case UnitType.blockSdf:\n          minBounds0 = create$3();\n          maxBounds0 = create$3();\n          minBounds1 = create$3();\n          maxBounds1 = create$3();\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getRotation(dataView, index2, unitRotation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            minBounds0[0] = unitTranslation[0] - unitScale[0] / 2;\n            minBounds0[1] = unitTranslation[1] - unitScale[1] / 2;\n            minBounds0[2] = unitTranslation[2] - unitScale[2] / 2;\n            maxBounds0[0] = unitTranslation[0] + unitScale[0] / 2;\n            maxBounds0[1] = unitTranslation[1] + unitScale[1] / 2;\n            maxBounds0[2] = unitTranslation[2] + unitScale[2] / 2;\n            BoundsHelper.rotateBounds(minBounds0, maxBounds0, unitRotation, minBounds1, maxBounds1, Constants.VECTOR3_ZERO);\n            min(minBounds, minBounds, minBounds1);\n            max(maxBounds, maxBounds, maxBounds1);\n          }\n          break;\n        case UnitType.cylinder:\n        case UnitType.cylinderSdf:\n          minBounds0 = create$3();\n          maxBounds0 = create$3();\n          const pa2 = create$3();\n          const pb = create$3();\n          const identityRotation = Constants.VECTOR3_UNITY;\n          let ca;\n          for (let i = 0; i < count2; i++) {\n            const id2 = ids[i + offset2];\n            const index2 = lookup2[id2];\n            UnitVertex.getTranslation(dataView, index2, unitTranslation);\n            UnitVertex.getRotation(dataView, index2, unitRotation);\n            UnitVertex.getScale(dataView, index2, unitScale);\n            const length2 = unitScale[1];\n            const radius2 = Math.max(unitScale[0], unitScale[2]);\n            if (length2 != 0 && radius2 != 0) {\n              if (equals$1(unitRotation, Constants.QUAT_IDENTITY)) {\n                ca = identityRotation;\n              } else {\n                ca = create$3();\n                transformQuat(ca, identityRotation, unitRotation);\n              }\n              scaleAndAdd(pa2, unitTranslation, ca, -length2 * 0.5);\n              scaleAndAdd(pb, unitTranslation, ca, length2 * 0.5);\n              BoundsHelper.cylinder(pa2, pb, radius2, minBounds0, maxBounds0);\n              min(minBounds, minBounds, minBounds0);\n              max(maxBounds, maxBounds, maxBounds0);\n            }\n          }\n          break;\n      }\n    }\n  }\n  class Scatter extends LayoutBase {\n    layout(buffer, ids, options) {\n      const start = window.performance.now();\n      const offset2 = options.offset === void 0 ? 0 : options.offset;\n      const count2 = options.count === void 0 ? ids.length : options.count;\n      const positionScalingX = options.positionScalingX === void 0 ? 1 : options.positionScalingX;\n      const positionScalingY = options.positionScalingY === void 0 ? 1 : options.positionScalingY;\n      const positionScalingZ = options.positionScalingZ === void 0 ? 1 : options.positionScalingZ;\n      if (!this._positions || this._positions.length < buffer.length * 3) {\n        this._positions = new Float32Array(buffer.length * 3);\n      }\n      this.minLayoutBoundsX = Number.MAX_VALUE;\n      this.minLayoutBoundsY = Number.MAX_VALUE;\n      this.minLayoutBoundsZ = Number.MAX_VALUE;\n      this.maxLayoutBoundsX = -Number.MAX_VALUE;\n      this.maxLayoutBoundsY = -Number.MAX_VALUE;\n      this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = lookup2[id2];\n        let positionX = options.positionsX ? options.positionsX[id2] * positionScalingX : 0;\n        let positionY = options.positionsY ? options.positionsY[id2] * positionScalingY : 0;\n        let positionZ = options.positionsZ ? options.positionsZ[id2] * positionScalingZ : 0;\n        this._positions[index2 * 3] = positionX;\n        this._positions[index2 * 3 + 1] = positionY;\n        this._positions[index2 * 3 + 2] = positionZ;\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, positionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, positionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, positionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, positionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, positionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, positionZ);\n      }\n      this._updateCumulativeLayoutBounds();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, options) {\n      const start = window.performance.now();\n      const offset2 = options.offset === void 0 ? 0 : options.offset;\n      const count2 = options.count === void 0 ? ids.length : options.count;\n      const dataView = buffer.dataView;\n      const _vec2 = create();\n      const _vec3 = create$3();\n      const _vec4 = create$2();\n      const _quat = create$1();\n      const sizeScalingX = options.sizeScaling === void 0 ? options.sizeScalingX === void 0 ? 1 : options.sizeScalingX : options.sizeScaling;\n      const sizeScalingY = options.sizeScaling === void 0 ? options.sizeScalingY === void 0 ? 1 : options.sizeScalingY : options.sizeScaling;\n      const sizeScalingZ = options.sizeScaling === void 0 ? options.sizeScalingZ === void 0 ? 1 : options.sizeScalingZ : options.sizeScaling;\n      const sizesX = options.sizes ? options.sizes : options.sizesX;\n      const sizesY = options.sizes ? options.sizes : options.sizesY;\n      const sizesZ = options.sizes ? options.sizes : options.sizesZ;\n      const minSize = options.minSize === void 0 ? 0 : options.minSize;\n      const minColor = options.minColor === void 0 ? 0 : options.minColor;\n      const maxColor = options.maxColor === void 0 ? 1 : options.maxColor;\n      const minOrder = options.minOrder === void 0 ? 0 : options.minOrder;\n      const maxOrder = options.maxOrder === void 0 ? 1 : options.maxOrder;\n      const orderReverse = options.orderReverse === void 0 ? false : options.orderReverse;\n      const minStaggerOrder = options.minStaggerOrder === void 0 ? 0 : options.minStaggerOrder;\n      const maxStaggerOrder = options.maxStaggerOrder === void 0 ? 1 : options.maxStaggerOrder;\n      const staggerOrderReverse = options.staggerOrderReverse === void 0 ? false : options.staggerOrderReverse;\n      const reverseX = options.reverseX === void 0 ? false : options.reverseX;\n      const reverseY = options.reverseY === void 0 ? false : options.reverseY;\n      const reverseZ = options.reverseZ === void 0 ? false : options.reverseZ;\n      this._updateModelBounds(options);\n      if (options.rotation) {\n        _quat[0] = options.rotation[0];\n        _quat[1] = options.rotation[1];\n        _quat[2] = options.rotation[2];\n        _quat[3] = options.rotation[3];\n      } else {\n        rotationTo(_quat, this._core.config.identityRotation, Constants.VECTOR3_UNITY);\n      }\n      if (options.texCoord) {\n        _vec4[0] = options.texCoord[0];\n        _vec4[1] = options.texCoord[1];\n        _vec4[2] = options.texCoord[2];\n        _vec4[3] = options.texCoord[3];\n      }\n      const lookup2 = buffer.lookup;\n      const selection = options.selected && options.selected.size > 0;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = lookup2[id2];\n        let positionX = this._positions[index2 * 3];\n        let positionY = this._positions[index2 * 3 + 1];\n        let positionZ = this._positions[index2 * 3 + 2];\n        if (this._isFacetted) {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n          }\n          const facetX = options.facetCoordsX ? options.facetCoordsX[id2] : 0;\n          const facetY = options.facetCoordsY ? options.facetCoordsY[id2] : 0;\n          const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id2] : 0;\n          positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n          positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n          positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        } else {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n          }\n        }\n        _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n        _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n        _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n        UnitVertex.setTranslation(dataView, index2, _vec3);\n        _vec3[0] = Math.max((sizesX ? Math.abs(sizesX[id2]) : 1) * sizeScalingX, minSize) * this._boundsScaling;\n        _vec3[1] = Math.max((sizesY ? Math.abs(sizesY[id2]) : 1) * sizeScalingY, minSize) * this._boundsScaling;\n        _vec3[2] = Math.max((sizesZ ? Math.abs(sizesZ[id2]) : 1) * sizeScalingZ, minSize) * this._boundsScaling;\n        UnitVertex.setScale(dataView, index2, _vec3);\n        if (options.rotations) {\n          _quat[0] = options.rotations[id2 * 4];\n          _quat[1] = options.rotations[id2 * 4 + 1];\n          _quat[2] = options.rotations[id2 * 4 + 2];\n          _quat[3] = options.rotations[id2 * 4 + 3];\n          UnitVertex.setRotation(dataView, index2, _quat);\n        } else {\n          UnitVertex.setRotation(dataView, index2, _quat);\n        }\n        if (options.colors) {\n          const size = 1 / (maxColor - minColor + 1);\n          const color2 = MathHelper.normalize(options.colors[id2], minColor, maxColor, size / 2, 1 - size / 2);\n          if (options.colors1) {\n            const color1 = MathHelper.normalize(options.colors1[id2], minColor, maxColor, size / 2, 1 - size / 2);\n            set(_vec2, color2, color1);\n          } else {\n            set(_vec2, color2, color2);\n          }\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else {\n          UnitVertex.setColor(dataView, index2, Constants.VECTOR2_ONE);\n        }\n        UnitVertex.setIdHover(dataView, index2, options.hover ? options.hover[id2] : id2);\n        UnitVertex.setSelected(dataView, index2, selection ? options.selected.has(id2) ? 1 : -1 : 0);\n        if (options.order !== void 0) {\n          const order = MathHelper.normalize(options.order[id2], minOrder, maxOrder, 0, 1);\n          _vec2[0] = orderReverse ? 1 - order : order;\n        } else {\n          _vec2[0] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        if (options.staggerOrder !== void 0) {\n          _vec2[1] = options.staggerOrder;\n        } else if (options.staggerOrders) {\n          const stagger = MathHelper.normalize(options.staggerOrders[id2], minStaggerOrder, maxStaggerOrder, 0, 1);\n          _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n        } else {\n          _vec2[1] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        UnitVertex.setOrder(dataView, index2, _vec2);\n        UnitVertex.setMaterial(dataView, index2, options.material ? options.material : options.materials ? options.materials[id2] : 0);\n        UnitVertex.setRounding(dataView, index2, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id2] * this._boundsScaling : 0);\n        UnitVertex.setParameter1(dataView, index2, options.parameter1 ? options.parameter1 : options.parameters1 ? options.parameters1[id2] : 0);\n        UnitVertex.setParameter2(dataView, index2, options.parameter2 ? options.parameter2 : options.parameters2 ? options.parameters2[id2] : 0);\n        UnitVertex.setSdfBuffer(dataView, index2, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id2] : this._core.config.sdfBuffer);\n        UnitVertex.setSdfBorder(dataView, index2, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id2] : this._core.config.sdfBorder);\n        if (options.texCoords) {\n          _vec4[0] = options.texCoords[id2 * 4];\n          _vec4[1] = options.texCoords[id2 * 4 + 1];\n          _vec4[2] = options.texCoords[id2 * 4 + 2];\n          _vec4[3] = options.texCoords[id2 * 4 + 3];\n          UnitVertex.setTexCoord(dataView, index2, _vec4);\n        } else {\n          UnitVertex.setTexCoord(dataView, index2, _vec4);\n        }\n        UnitVertex.setMatId(dataView, index2, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id2] : 0);\n        UnitVertex.setMatColor(dataView, index2, options.materialColor ? options.materialColor : options.materialColors ? [options.materialColors[id2 * 3], options.materialColors[id2 * 3 + 1], options.materialColors[id2 * 3 + 2]] : [0, 0, 0]);\n        UnitVertex.setMatFuzz(dataView, index2, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id2] : 0);\n        UnitVertex.setMatGloss(dataView, index2, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id2] : 0);\n        UnitVertex.setMatDensity(dataView, index2, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id2] : 0);\n        UnitVertex.setMatRefractiveIndex(dataView, index2, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id2] : 0);\n        UnitVertex.setSegColor(dataView, index2, options.segmentColor ? options.segmentColor : options.segmentColors ? [options.segmentColors[id2 * 4], options.segmentColors[id2 * 4 + 1], options.segmentColors[id2 * 4 + 2], options.segmentColors[id2 * 4 + 3]] : [buffer.idColors[id2 * 4], buffer.idColors[id2 * 4 + 1], buffer.idColors[id2 * 4 + 2], buffer.idColors[id2 * 4 + 3]]);\n      }\n      buffer.update();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  fromValues$3(0.2126, 0.7152, 0.0722);\n  create$3();\n  create$3();\n  class PathHelper {\n    static getFilenameWithoutExtension(path2) {\n      const dot2 = path2.lastIndexOf(\".\");\n      if (dot2 == -1) {\n        return path2;\n      } else {\n        const start = path2.lastIndexOf(\"/\") == -1 ? 0 : path2.lastIndexOf(\"/\") + 1;\n        return path2.substring(start, dot2);\n      }\n    }\n    static getExtension(path2) {\n      const dot2 = path2.lastIndexOf(\".\");\n      if (dot2 == -1 || dot2 == path2.length - 1) {\n        return null;\n      } else {\n        return path2.substring(dot2 + 1, path2.length);\n      }\n    }\n    static getFilename(path2) {\n      if (path2.lastIndexOf(\"/\") == -1) {\n        return path2;\n      } else {\n        const start = path2.lastIndexOf(\"/\") + 1;\n        return path2.substring(start, path2.length);\n      }\n    }\n    static getPath(path2) {\n      if (path2.lastIndexOf(\"/\") == -1) {\n        return \"\";\n      } else {\n        return path2.substring(0, path2.lastIndexOf(\"/\"));\n      }\n    }\n    static combine(first, second2) {\n      const seperator = first.lastIndexOf(\"/\") == first.length - 1;\n      if (second2.indexOf(\"/\") == 0) {\n        if (seperator) {\n          return first.substring(0, first.length - 1) + second2;\n        } else {\n          return first + second2;\n        }\n      } else {\n        if (seperator) {\n          return first + second2;\n        } else {\n          return first + \"/\" + second2;\n        }\n      }\n    }\n  }\n  class TextureHelper {\n    static create(gl, width2, height2, format2, type2, filter2, bytes, internalFormat = format2) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter2);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter2);\n      gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width2, height2, 0, format2, type2, bytes);\n      return texture;\n    }\n    static fromImage(gl, image2, mipmaps, filter2) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image2);\n      if (mipmaps && MathHelper.isPowerOf2(image2.width) && MathHelper.isPowerOf2(image2.height))\n        gl.generateMipmap(gl.TEXTURE_2D);\n      else {\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter2);\n        gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter2);\n      }\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      return texture;\n    }\n    static cubemapFromImages(gl, images) {\n      const texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture);\n      const targets = [\n        gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n        gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n        gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n        gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n      ];\n      for (let i = 0; i < 6; i++) {\n        gl.texImage2D(targets[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, images[i]);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n        gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      }\n      gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n      gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n      return texture;\n    }\n  }\n  class Line extends LayoutBase {\n    layout(buffer, ids, fromIds, toIds, options) {\n      const start = window.performance.now();\n      const offset2 = options.offset === void 0 ? 0 : options.offset;\n      const count2 = options.count === void 0 ? ids.length : options.count;\n      const positionScalingX = options.positionScalingX === void 0 ? 1 : options.positionScalingX;\n      const positionScalingY = options.positionScalingY === void 0 ? 1 : options.positionScalingY;\n      const positionScalingZ = options.positionScalingZ === void 0 ? 1 : options.positionScalingZ;\n      const sizeScalingX = options.sizeScaling === void 0 ? options.sizeScalingX === void 0 ? 1 : options.sizeScalingX : options.sizeScaling;\n      const sizeScalingY = options.sizeScaling === void 0 ? options.sizeScalingY === void 0 ? 1 : options.sizeScalingY : options.sizeScaling;\n      const sizeScalingZ = options.sizeScaling === void 0 ? options.sizeScalingZ === void 0 ? 1 : options.sizeScalingZ : options.sizeScaling;\n      const minSize = options.minSize === void 0 ? 0 : options.minSize;\n      const offsetScaling = options.offsetScaling === void 0 ? 1 : options.offsetScaling;\n      if (!this._positions || this._positions.length < buffer.length * 3) {\n        this._positions = new Float32Array(buffer.length * 3);\n        this._sizes = new Float32Array(buffer.length * 3);\n        this._rotations = new Float32Array(buffer.length * 4);\n      }\n      this.minLayoutBoundsX = Number.MAX_VALUE;\n      this.minLayoutBoundsY = Number.MAX_VALUE;\n      this.minLayoutBoundsZ = Number.MAX_VALUE;\n      this.maxLayoutBoundsX = -Number.MAX_VALUE;\n      this.maxLayoutBoundsY = -Number.MAX_VALUE;\n      this.maxLayoutBoundsZ = -Number.MAX_VALUE;\n      const _vec3 = create$3();\n      const _quat = create$1();\n      const direction = create$3();\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const fromId = fromIds[id2];\n        const toId = toIds[id2];\n        const index2 = lookup2[id2];\n        let toPositionX = options.positionsX ? options.positionsX[toId] * positionScalingX : 0;\n        let toPositionY = options.positionsY ? options.positionsY[toId] * positionScalingY : 0;\n        let toPositionZ = options.positionsZ ? options.positionsZ[toId] * positionScalingZ : 0;\n        let fromPositionX = options.positionsX ? options.positionsX[fromId] * positionScalingX : 0;\n        let fromPositionY = options.positionsY ? options.positionsY[fromId] * positionScalingY : 0;\n        let fromPositionZ = options.positionsZ ? options.positionsZ[fromId] * positionScalingZ : 0;\n        if (fromId == toId) {\n          this._sizes[index2 * 3] = 0;\n          this._sizes[index2 * 3 + 1] = 0;\n          this._sizes[index2 * 3 + 2] = 0;\n          this._rotations[index2 * 4] = 0;\n          this._rotations[index2 * 4 + 1] = 0;\n          this._rotations[index2 * 4 + 2] = 0;\n          this._rotations[index2 * 4 + 3] = 1;\n        } else {\n          direction[0] = toPositionX - fromPositionX;\n          direction[1] = toPositionY - fromPositionY;\n          direction[2] = toPositionZ - fromPositionZ;\n          let length$12 = length(direction);\n          scale(direction, direction, 1 / length$12);\n          rotationTo(_quat, this._core.config.identityRotation, direction);\n          this._rotations[index2 * 4] = _quat[0];\n          this._rotations[index2 * 4 + 1] = _quat[1];\n          this._rotations[index2 * 4 + 2] = _quat[2];\n          this._rotations[index2 * 4 + 3] = _quat[3];\n          if (options.offsets) {\n            const fromOffset = options.offsets[fromId] * offsetScaling / 2;\n            const toOffset = options.offsets[toId] * offsetScaling / 2;\n            toPositionX -= direction[0] * toOffset;\n            toPositionY -= direction[1] * toOffset;\n            toPositionZ -= direction[2] * toOffset;\n            fromPositionX += direction[0] * fromOffset;\n            fromPositionY += direction[1] * fromOffset;\n            fromPositionZ += direction[2] * fromOffset;\n            length$12 = Math.max(length$12 - toOffset - fromOffset, minSize);\n          }\n          this._sizes[index2 * 3 + 1] = Math.max(length$12 * sizeScalingY, minSize);\n          if (options.lineSizes) {\n            this._sizes[index2 * 3] = Math.max(options.lineSizes[id2] * sizeScalingX, minSize);\n            this._sizes[index2 * 3 + 2] = Math.max(options.lineSizes[id2] * sizeScalingZ, minSize);\n          } else if (options.endSizes) {\n            this._sizes[index2 * 3] = Math.max(options.endSizes[fromId] * sizeScalingX, minSize);\n            this._sizes[index2 * 3 + 2] = Math.max(options.endSizes[toId] * sizeScalingZ, minSize);\n          } else {\n            this._sizes[index2 * 3] = sizeScalingX;\n            this._sizes[index2 * 3 + 2] = sizeScalingZ;\n          }\n        }\n        _vec3[0] = (fromPositionX + toPositionX) / 2;\n        _vec3[1] = (fromPositionY + toPositionY) / 2;\n        _vec3[2] = (fromPositionZ + toPositionZ) / 2;\n        this._positions[index2 * 3] = _vec3[0];\n        this._positions[index2 * 3 + 1] = _vec3[1];\n        this._positions[index2 * 3 + 2] = _vec3[2];\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, fromPositionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, fromPositionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, fromPositionZ);\n        this.minLayoutBoundsX = Math.min(this.minLayoutBoundsX, toPositionX);\n        this.minLayoutBoundsY = Math.min(this.minLayoutBoundsY, toPositionY);\n        this.minLayoutBoundsZ = Math.min(this.minLayoutBoundsZ, toPositionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, fromPositionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, fromPositionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, fromPositionZ);\n        this.maxLayoutBoundsX = Math.max(this.maxLayoutBoundsX, toPositionX);\n        this.maxLayoutBoundsY = Math.max(this.maxLayoutBoundsY, toPositionY);\n        this.maxLayoutBoundsZ = Math.max(this.maxLayoutBoundsZ, toPositionZ);\n      }\n      this._updateCumulativeLayoutBounds();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} layout ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update(buffer, ids, fromIds, toIds, options) {\n      const start = window.performance.now();\n      const offset2 = options.offset === void 0 ? 0 : options.offset;\n      const count2 = options.count === void 0 ? ids.length : options.count;\n      const dataView = buffer.dataView;\n      const _vec2 = create();\n      const _vec3 = create$3();\n      const _quat = create$1();\n      const endMinColor = options.endMinColor === void 0 ? 0 : options.endMinColor;\n      const endMaxColor = options.endMaxColor === void 0 ? 1 : options.endMaxColor;\n      const lineMinColor = options.lineMinColor === void 0 ? 0 : options.lineMinColor;\n      const lineMaxColor = options.lineMaxColor === void 0 ? 1 : options.lineMaxColor;\n      const minOrder = options.minOrder === void 0 ? 0 : options.minOrder;\n      const maxOrder = options.maxOrder === void 0 ? 1 : options.maxOrder;\n      const orderReverse = options.orderReverse === void 0 ? false : options.orderReverse;\n      const minStaggerOrder = options.minStaggerOrder === void 0 ? 0 : options.minStaggerOrder;\n      const maxStaggerOrder = options.maxStaggerOrder === void 0 ? 1 : options.maxStaggerOrder;\n      const staggerOrderReverse = options.staggerOrderReverse === void 0 ? false : options.staggerOrderReverse;\n      const reverseX = options.reverseX === void 0 ? false : options.reverseX;\n      const reverseY = options.reverseY === void 0 ? false : options.reverseY;\n      const reverseZ = options.reverseZ === void 0 ? false : options.reverseZ;\n      this._updateModelBounds(options);\n      const lookup2 = buffer.lookup;\n      const selection = options.selected && options.selected.size > 0;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const fromId = fromIds[id2];\n        const toId = toIds[id2];\n        const index2 = lookup2[id2];\n        let positionX = this._positions[index2 * 3];\n        let positionY = this._positions[index2 * 3 + 1];\n        let positionZ = this._positions[index2 * 3 + 2];\n        if (this._isFacetted) {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.minModelBoundsX + this._facetSizeX * (1 + this._facetSpacingX) - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.minModelBoundsY + this._facetSizeY * (1 + this._facetSpacingY) - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.minModelBoundsZ + this._facetSizeZ * (1 + this._facetSpacingZ) - positionZ;\n          }\n          const facetX = options.facetCoordsX ? options.facetCoordsX[id2] : 0;\n          const facetY = options.facetCoordsY ? options.facetCoordsY[id2] : 0;\n          const facetZ = options.facetCoordsZ ? options.facetCoordsZ[id2] : 0;\n          positionX += facetX * this._facetSizeX * (1 + this._facetSpacingX);\n          positionY += facetY * this._facetSizeY * (1 + this._facetSpacingY);\n          positionZ += facetZ * this._facetSizeZ * (1 + this._facetSpacingZ);\n        } else {\n          if (reverseX) {\n            positionX = this.minModelBoundsX + this.maxModelBoundsX - positionX;\n          }\n          if (reverseY) {\n            positionY = this.minModelBoundsY + this.maxModelBoundsY - positionY;\n          }\n          if (reverseZ) {\n            positionZ = this.minModelBoundsZ + this.maxModelBoundsZ - positionZ;\n          }\n        }\n        _vec3[0] = (positionX - this.modelOriginX) * this._boundsScaling;\n        _vec3[1] = (positionY - this.modelOriginY) * this._boundsScaling;\n        _vec3[2] = (positionZ - this.modelOriginZ) * this._boundsScaling;\n        UnitVertex.setTranslation(dataView, index2, _vec3);\n        _vec3[0] = this._sizes[index2 * 3] * this._boundsScaling;\n        _vec3[1] = this._sizes[index2 * 3 + 1] * this._boundsScaling;\n        _vec3[2] = this._sizes[index2 * 3 + 2] * this._boundsScaling;\n        UnitVertex.setScale(dataView, index2, _vec3);\n        _quat[0] = this._rotations[index2 * 4];\n        _quat[1] = this._rotations[index2 * 4 + 1];\n        _quat[2] = this._rotations[index2 * 4 + 2];\n        _quat[3] = this._rotations[index2 * 4 + 3];\n        if (reverseX) {\n          _quat[1] = -_quat[1];\n          _quat[2] = -_quat[2];\n        }\n        if (reverseY) {\n          _quat[0] = -_quat[0];\n          _quat[2] = -_quat[2];\n        }\n        if (reverseZ) {\n          _quat[0] = -_quat[0];\n          _quat[1] = -_quat[1];\n        }\n        UnitVertex.setRotation(dataView, index2, _quat);\n        let size;\n        if (options.endColors) {\n          size = 1 / (endMaxColor - endMinColor + 1);\n          const fromColor = MathHelper.normalize(options.endColors[fromId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n          const toColor = MathHelper.normalize(options.endColors[toId], endMinColor, endMaxColor, size / 2, 1 - size / 2);\n          set(_vec2, fromColor, toColor);\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else if (options.lineColors) {\n          size = 1 / (lineMaxColor - lineMinColor + 1);\n          const color2 = MathHelper.normalize(options.lineColors[id2], lineMinColor, lineMaxColor, size / 2, 1 - size / 2);\n          set(_vec2, color2, color2);\n          UnitVertex.setColor(dataView, index2, _vec2);\n        } else {\n          UnitVertex.setColor(dataView, index2, Constants.VECTOR2_ONE);\n        }\n        UnitVertex.setIdHover(dataView, index2, options.hover ? options.hover[id2] : id2);\n        UnitVertex.setSelected(dataView, index2, selection ? options.selected.has(id2) ? 1 : -1 : 0);\n        if (options.order !== void 0) {\n          const order = MathHelper.normalize(options.order[id2], minOrder, maxOrder, 0, 1);\n          _vec2[0] = orderReverse ? 1 - order : order;\n        } else {\n          _vec2[0] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        if (options.staggerOrder !== void 0) {\n          _vec2[1] = options.staggerOrder;\n        } else if (options.staggerOrders) {\n          const stagger = MathHelper.normalize(options.staggerOrders[id2], minStaggerOrder, maxStaggerOrder, 0, 1);\n          _vec2[1] = staggerOrderReverse ? 1 - stagger : stagger;\n        } else {\n          _vec2[1] = count2 == 1 ? 0 : i / (count2 - 1);\n        }\n        UnitVertex.setOrder(dataView, index2, _vec2);\n        UnitVertex.setMaterial(dataView, index2, options.material ? options.material : options.materials ? options.materials[id2] : 0);\n        UnitVertex.setRounding(dataView, index2, options.rounding ? options.rounding * this._boundsScaling : options.roundings ? options.roundings[id2] * this._boundsScaling : 0);\n        UnitVertex.setSdfBuffer(dataView, index2, options.sdfBuffer ? options.sdfBuffer : options.sdfBuffers ? options.sdfBuffers[id2] : this._core.config.sdfBuffer);\n        UnitVertex.setSdfBorder(dataView, index2, options.sdfBorder ? options.sdfBorder : options.sdfBorders ? options.sdfBorders[id2] : this._core.config.sdfBorder);\n        UnitVertex.setMatId(dataView, index2, options.materialType ? options.materialType : options.materialTypes ? options.materialTypes[id2] : 0);\n        UnitVertex.setMatColor(dataView, index2, options.materialColor ? options.materialColor : options.materialColors ? [options.materialColors[id2 * 3], options.materialColors[id2 * 3 + 1], options.materialColors[id2 * 3 + 2]] : [0, 0, 0]);\n        UnitVertex.setMatFuzz(dataView, index2, options.materialFuzz ? options.materialFuzz : options.materialFuzzes ? options.materialFuzzes[id2] : 0);\n        UnitVertex.setMatGloss(dataView, index2, options.materialGloss ? options.materialGloss : options.materialGlosses ? options.materialGlosses[id2] : 0);\n        UnitVertex.setMatDensity(dataView, index2, options.materialDensity ? options.materialDensity : options.materialDensities ? options.materialDensities[id2] : 0);\n        UnitVertex.setMatRefractiveIndex(dataView, index2, options.materialRefractiveIndex ? options.materialRefractiveIndex : options.materialRefractiveIndices ? options.materialRefractiveIndices[id2] : 0);\n        UnitVertex.setSegColor(dataView, index2, options.segmentColor ? options.segmentColor : options.segmentColors ? [options.segmentColors[id2 * 4], options.segmentColors[id2 * 4 + 1], options.segmentColors[id2 * 4 + 2], options.segmentColors[id2 * 4 + 3]] : [buffer.idColors[id2 * 4], buffer.idColors[id2 * 4 + 1], buffer.idColors[id2 * 4 + 2], buffer.idColors[id2 * 4 + 3]]);\n      }\n      buffer.update();\n      this._core.log.write(LogLevel.info, `${this.constructor.name.toLowerCase()} update ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  class AtlasBase {\n    get imageData() {\n      return this._imageData;\n    }\n    set imageData(value2) {\n      if (this._imageData != value2) {\n        this._imageData = value2;\n        this._changed = true;\n      }\n    }\n    constructor() {\n      this._imageData = null;\n    }\n    copyFrom(atlas) {\n      if (atlas.imageData) {\n        this._imageData = atlas.imageData;\n        this._changed = true;\n      } else {\n        this.imageData = null;\n      }\n    }\n    update() {\n    }\n  }\n  let Atlas$2 = class Atlas extends AtlasBase {\n  };\n  class BufferBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get ids() {\n      return this._ids;\n    }\n    get dataView() {\n      return this._dataView;\n    }\n    get vertices() {\n      return this._vertices;\n    }\n    get lookup() {\n      return this._lookup;\n    }\n    get length() {\n      return this._length;\n    }\n    get selected() {\n      return this._selected;\n    }\n    constructor(core, ids) {\n      this._core = core;\n      this._ids = ids;\n      this._length = ids.length;\n      this._vertices = new ArrayBuffer(this._length * UnitVertex.SIZE_BYTES);\n      this._dataView = new DataView(this._vertices);\n      this._selected = /* @__PURE__ */ new Set();\n      this.from = 0;\n      this.to = 1;\n      this.unitType = UnitType.block;\n      this._lookup = {};\n      for (let i = 0; i < this._length; i++) {\n        const id2 = ids[i];\n        this._lookup[id2] = i;\n        UnitVertex.setRotation(this._dataView, i, Constants.QUAT_IDENTITY);\n      }\n    }\n    createShared() {\n      const buffer = Object.create(this);\n      buffer._vertices = new ArrayBuffer(buffer._vertices.byteLength);\n      buffer._dataView = new DataView(buffer._vertices);\n      return buffer;\n    }\n    copyFrom(buffer) {\n      const start = window.performance.now();\n      const fromDataView = buffer.dataView;\n      const toDataView = this._dataView;\n      const lookup2 = buffer.lookup;\n      for (let i = 0; i < this._length; i++) {\n        const index2 = lookup2[this._ids[i]];\n        if (index2 != null) {\n          UnitVertex.copyIdHover(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTranslation(fromDataView, index2, toDataView, i);\n          UnitVertex.copyScale(fromDataView, index2, toDataView, i);\n          UnitVertex.copyRotation(fromDataView, index2, toDataView, i);\n          UnitVertex.copyColor(fromDataView, index2, toDataView, i);\n          UnitVertex.copySelected(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMaterial(fromDataView, index2, toDataView, i);\n          UnitVertex.copyRounding(fromDataView, index2, toDataView, i);\n          UnitVertex.copyOrder(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTexCoord(fromDataView, index2, toDataView, i);\n          UnitVertex.copyTexture(fromDataView, index2, toDataView, i);\n          UnitVertex.copySdfBuffer(fromDataView, index2, toDataView, i);\n          UnitVertex.copySdfBorder(fromDataView, index2, toDataView, i);\n          UnitVertex.copyParameter1(fromDataView, index2, toDataView, i);\n          UnitVertex.copyParameter2(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatId(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatColor(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatFuzz(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatRefractiveIndex(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatGloss(fromDataView, index2, toDataView, i);\n          UnitVertex.copyMatDensity(fromDataView, index2, toDataView, i);\n          UnitVertex.copySegColor(fromDataView, index2, toDataView, i);\n        } else {\n          UnitVertex.setRotation(toDataView, i, Constants.QUAT_IDENTITY);\n        }\n      }\n      this.unitType = buffer.unitType;\n      this._selected = buffer.selected;\n      this._core.log.write(LogLevel.info, `buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    update() {\n    }\n    updateSelection(options) {\n      const start = window.performance.now();\n      const ids = options && options.ids ? options.ids : this._ids;\n      const offset2 = options && options.offset !== void 0 ? options.offset : 0;\n      const count2 = options && options.count !== void 0 ? options.count : ids.length;\n      const selection = this._selected.size > 0;\n      const dataView = this._dataView;\n      for (let i = 0; i < count2; i++) {\n        const id2 = ids[i + offset2];\n        const index2 = this._lookup[id2];\n        UnitVertex.setSelected(dataView, index2, selection ? this._selected.has(id2) ? 1 : -1 : 0);\n      }\n      this.update();\n      this._core.log.write(LogLevel.info, `buffer update selection ${count2} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  class TransitionBufferBase {\n    get pickIdLookup() {\n      return this._pickIdLookup;\n    }\n    get currentBuffer() {\n      return this._isBuffer1Current ? this._buffer1 : this._buffer2;\n    }\n    get previousBuffer() {\n      return this._isBuffer1Current ? this._buffer2 : this._buffer1;\n    }\n    get currentPalette() {\n      return this._isBuffer1Current ? this._palette1 : this._palette2;\n    }\n    get previousPalette() {\n      return this._isBuffer1Current ? this._palette2 : this._palette1;\n    }\n    get currentAtlas() {\n      return this._isBuffer1Current ? this._atlas1 : this._atlas2;\n    }\n    get previousAtlas() {\n      return this._isBuffer1Current ? this._atlas2 : this._atlas1;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get length() {\n      return this._length;\n    }\n    constructor(core, ids, bufferType, paletteType, atlasType) {\n      this.bufferType = bufferType;\n      this.paletteType = paletteType;\n      this.atlasType = atlasType;\n      this._core = core;\n      this._length = ids.length;\n      this.id = TransitionBufferBase._id++;\n      this.isVisible = true;\n      this.transitionTime = 1;\n      this.activeId = -1;\n      const start = window.performance.now();\n      this._buffer1 = new bufferType(core, ids);\n      this._buffer2 = this._buffer1.createShared();\n      this._palette1 = new paletteType();\n      this._palette2 = new paletteType();\n      this._atlas1 = new atlasType();\n      this._atlas2 = new atlasType();\n      this.isPickingEnabled = true;\n      this._pickIdLookup = {};\n      const dataView1 = this._buffer1.dataView;\n      const dataView2 = this._buffer2.dataView;\n      const _vec4 = create$2();\n      this.idColors = new Float32Array(this._length * 4);\n      this._buffer1.idColors = this.idColors;\n      this._buffer2.idColors = this.idColors;\n      for (let i = 0; i < this._length; i++) {\n        const id2 = ids[i];\n        const pickId = PickHelper.nextPickId();\n        this._pickIdLookup[pickId] = id2;\n        PickHelper.encodeNumber(pickId, PickType.data, _vec4);\n        this.idColors[i * 4] = _vec4[0];\n        this.idColors[i * 4 + 1] = _vec4[1];\n        this.idColors[i * 4 + 2] = _vec4[2];\n        this.idColors[i * 4 + 3] = _vec4[3];\n        UnitVertex.setIdColor(dataView1, i, _vec4);\n        UnitVertex.setIdColor(dataView2, i, _vec4);\n      }\n      this._core.log.write(LogLevel.info, `transition buffer created ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n    swap() {\n      this._isBuffer1Current = !this._isBuffer1Current;\n    }\n    copyFrom(transitionBuffer) {\n      const start = window.performance.now();\n      this.key = transitionBuffer.key;\n      this.isVisible = transitionBuffer.isVisible;\n      this.transitionTime = transitionBuffer.transitionTime;\n      this.isPickingEnabled = transitionBuffer.isPickingEnabled;\n      this.unitType = transitionBuffer.unitType;\n      this.activeId = transitionBuffer.activeId;\n      this.currentBuffer.copyFrom(transitionBuffer.currentBuffer);\n      this.previousBuffer.copyFrom(transitionBuffer.previousBuffer);\n      this.currentBuffer.update();\n      this.previousBuffer.update();\n      this.currentPalette.copyFrom(transitionBuffer.currentPalette);\n      this.previousPalette.copyFrom(transitionBuffer.previousPalette);\n      this.currentAtlas.copyFrom(transitionBuffer.currentAtlas);\n      this.previousAtlas.copyFrom(transitionBuffer.previousAtlas);\n      this._core.log.write(LogLevel.info, `transition buffer copied ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n    }\n  }\n  TransitionBufferBase._id = 1;\n  let Buffer$3 = class Buffer extends BufferBase {\n    constructor(core, ids) {\n      super(core, ids);\n    }\n  };\n  let TransitionBuffer$2 = class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$3, Palette$2, Atlas$2);\n    }\n  };\n  class DebugAxes {\n    get vertices() {\n      return this._vertices;\n    }\n    get indices() {\n      return this._indices;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    initialize() {\n      let vertexOffset = 0;\n      let indexOffset = 0;\n      const axisVertices = Cube.POSITIONS;\n      const axisIndices2 = Cube.INDICES;\n      this._vertices = new ArrayBuffer(3 * PositionColorVertex.SIZE_BYTES * axisVertices.length / PositionVertex.SIZE);\n      const verticesView = new DataView(this._vertices);\n      this._indices = new Uint16Array(3 * axisIndices2.length + 4);\n      const vertexCount = axisVertices.length / PositionVertex.SIZE;\n      const indexCount = axisIndices2.length;\n      const transform2 = create$4();\n      const length2 = 1;\n      const width2 = 0.01;\n      transform2[0] = length2;\n      transform2[5] = width2;\n      transform2[10] = width2;\n      transform2[12] = 0.5;\n      transform2[13] = 0;\n      transform2[14] = 0;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants.VECTOR3_UNITX, transform2, vertexOffset, indexOffset);\n      indexOffset += indexCount;\n      this._indices[indexOffset++] = axisIndices2[indexCount - 1] + vertexOffset;\n      vertexOffset += vertexCount;\n      this._indices[indexOffset++] = axisIndices2[0] + vertexOffset;\n      transform2[0] = width2;\n      transform2[5] = length2;\n      transform2[10] = width2;\n      transform2[12] = 0;\n      transform2[13] = 0.5;\n      transform2[14] = 0;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants.VECTOR3_UNITY, transform2, vertexOffset, indexOffset);\n      indexOffset += indexCount;\n      this._indices[indexOffset++] = axisIndices2[indexCount - 1] + vertexOffset;\n      vertexOffset += vertexCount;\n      this._indices[indexOffset++] = axisIndices2[0] + vertexOffset;\n      transform2[0] = width2;\n      transform2[5] = width2;\n      transform2[10] = length2;\n      transform2[12] = 0;\n      transform2[13] = 0;\n      transform2[14] = 0.5;\n      this._createAxis(axisVertices, axisIndices2, verticesView, this._indices, Constants.VECTOR3_UNITZ, transform2, vertexOffset, indexOffset);\n      this._indexCount = this._indices.length;\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    _createAxis(axisVertices, axisIndices2, verticesView, indices, color2, transform2, vertexOffset, indexOffset) {\n      const position2 = create$3();\n      const vertexCount = axisVertices.length / PositionVertex.SIZE;\n      const indexCount = axisIndices2.length;\n      for (let i = 0; i < vertexCount; i++) {\n        set$3(position2, axisVertices[i * PositionVertex.SIZE], axisVertices[i * PositionVertex.SIZE + 1], axisVertices[i * PositionVertex.SIZE + 2]);\n        transformMat4$2(position2, position2, transform2);\n        PositionColorVertex.setPosition(verticesView, vertexOffset + i, position2);\n        PositionColorVertex.setColor(verticesView, vertexOffset + i, color2);\n      }\n      for (let i = 0; i < indexCount; i++) {\n        indices[indexOffset + i] = axisIndices2[i] + vertexOffset;\n      }\n    }\n  }\n  var __awaiter$2 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class RendererConfig {\n    reset() {\n    }\n  }\n  class RendererBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get config() {\n      return this._config;\n    }\n    get devicePixelRatio() {\n      return this._devicePixelRatio;\n    }\n    get width() {\n      return this._canvas.width;\n    }\n    set width(value2) {\n      this._options.width = value2;\n    }\n    get height() {\n      return this._canvas.height;\n    }\n    set height(value2) {\n      this._options.height = value2;\n    }\n    get webXRReferenceSpace() {\n      return this._webXRReferenceSpace;\n    }\n    get pickedType() {\n      return this._pickedType;\n    }\n    get pickedId() {\n      return this._pickedId;\n    }\n    get isCapturingPickImage() {\n      return this._isCapturingPickImage;\n    }\n    capturePickImage() {\n      this._isCapturingPickImage = true;\n    }\n    get backgroundColor() {\n      return this._backgroundColor;\n    }\n    set backgroundColor(value2) {\n      if (!exactEquals(value2, this._backgroundColor)) {\n        this._backgroundColor = value2;\n      }\n    }\n    get ambientColor() {\n      return this._ambientColor;\n    }\n    set ambientColor(value2) {\n      if (!exactEquals$1(value2, this._ambientColor)) {\n        this._ambientColor = value2;\n      }\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    swapAxes() {\n      this._isAxes1Current = !this._isAxes1Current;\n    }\n    createCartesian2dAxesVisual(axes) {\n      return new AxesVisual(axes);\n    }\n    createCartesian3dAxesVisual(axes) {\n      return new AxesVisual(axes);\n    }\n    _createDebugAxesVisual(debugAxes) {\n      return null;\n    }\n    createLabelSetVisual(labelSet) {\n      return new LabelSetVisual$2(labelSet);\n    }\n    createControllerVisual(controller) {\n      return new ControllerVisual$1(controller);\n    }\n    createTransitionBuffer(ids) {\n      return new TransitionBuffer$2(this._core, ids);\n    }\n    createImageVisual(image2) {\n      return new ImageVisual$2(image2);\n    }\n    createFontVisual(font2) {\n      return new FontVisual$2(font2);\n    }\n    constructor(options) {\n      this._options = options;\n      this.fonts = {};\n    }\n    get isWebXRSupported() {\n      return false;\n    }\n    initialize(core) {\n      this._core = core;\n      this._canvas = document.createElement(\"canvas\");\n      const contextmenu = this._options && this._options.contextmenu;\n      if (!contextmenu) {\n        this._canvas.addEventListener(\"contextmenu\", (e) => {\n          e.preventDefault();\n        });\n      }\n      this._canvas.tabIndex = this._core.container.tabIndex;\n      this._canvas.style.display = \"block\";\n      this._canvas.style.touchAction = \"none\";\n      this._core.container.appendChild(this._canvas);\n      this._mvMatrices = [create$4(), create$4()];\n      this.pickPMatrix = create$4();\n      this.axesVisibility = AxesVisibility.current;\n      this._debugAxes = new DebugAxes();\n      this._debugAxesVisual = this._createDebugAxesVisual(this._debugAxes);\n      this.transitionTime = 1;\n      this.transitionBuffers = [];\n      this.areLabelsVisible = true;\n      this.labelSets = [];\n      this.controllers = [];\n      this.areImagesVisible = true;\n      this.images = [];\n      this._viewports = [new DOMRect(), new DOMRect()];\n      this.isPickingEnabled = false;\n      this._pickedType = PickType.none;\n      this._pickedId = 0;\n      this._lassoMMatrix = create$4();\n      this._lassoThickness = create();\n      this._resizeMinimumDelay = -1;\n      this._previousResizeWidth = -1;\n      this._previousResizeHeight = -1;\n    }\n    remove() {\n      this._core.container.removeChild(this._canvas);\n    }\n    finalize() {\n      this._isInitialized = false;\n    }\n    setSize(elapsedTime) {\n      if (this._options && this._options.width && this._options.height) {\n        this._devicePixelRatio = 1;\n        this._resizeWidth = this._options.width;\n        this._resizeHeight = this._options.height;\n      } else {\n        this._devicePixelRatio = window.devicePixelRatio || 1;\n        this._resizeWidth = this._core.container.clientWidth * devicePixelRatio;\n        this._resizeHeight = this._core.container.clientHeight * devicePixelRatio;\n      }\n      if (this._resizeWidth != this._previousResizeWidth || this._resizeHeight != this._previousResizeHeight) {\n        this._previousResizeWidth = this._resizeWidth;\n        this._previousResizeHeight = this._resizeHeight;\n        this._isResizing = true;\n        this._resizeElapsedTime = elapsedTime;\n      }\n      if (this._isResizing) {\n        if (this._resizeElapsedTime > this._resizeMinimumDelay && this._isInitialized) {\n          this._isResizing = false;\n          this._resizeMinimumDelay = this._core.config.resizeMinimumDelay;\n          this._resize(this._resizeWidth, this._resizeHeight);\n        } else {\n          this._resizeElapsedTime += elapsedTime;\n        }\n      }\n    }\n    _resize(width2, height2) {\n      this._canvas.style.width = `${Math.floor(width2 / this._devicePixelRatio)}px`;\n      this._canvas.style.height = `${Math.floor(height2 / this._devicePixelRatio)}px`;\n      width2 = Math.floor(width2);\n      height2 = Math.floor(height2);\n      this._canvas.width = width2;\n      this._canvas.height = height2;\n    }\n    update(elapsedTime) {\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        if (transitionBuffer.isVisible) {\n          const previous = transitionBuffer.previousPalette;\n          const current = transitionBuffer.currentPalette;\n          if (previous) {\n            previous.update();\n          }\n          if (current) {\n            current.update();\n          }\n        }\n      }\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        if (transitionBuffer.isVisible) {\n          const previous = transitionBuffer.previousAtlas;\n          const current = transitionBuffer.currentAtlas;\n          if (previous) {\n            previous.update();\n          }\n          if (current) {\n            current.update();\n          }\n        }\n      }\n      if (this._core.config.isDebugVisible) {\n        if (this._debugAxesVisual) {\n          this._debugAxesVisual.mMatrix = this.mMatrix;\n          this._debugAxesVisual.vMatrices = this.vMatrices;\n          this._debugAxesVisual.pMatrices = this.pMatrices;\n          this._debugAxesVisual.viewports = this._viewports;\n          this._debugAxesVisual.viewportOffset = this._viewportOffset;\n          this._debugAxesVisual.viewportCount = this._viewportCount;\n        }\n      }\n      if (this.areLabelsVisible) {\n        for (let i = 0; i < this.labelSets.length; i++) {\n          const labelSetVisual = this.labelSets[i];\n          if (labelSetVisual.isVisible) {\n            this.labelSets[i].label.update(elapsedTime);\n            labelSetVisual.mMatrix = this.mMatrix;\n            labelSetVisual.vMatrices = this.vMatrices;\n            labelSetVisual.pMatrices = this.pMatrices;\n            labelSetVisual.isPickingEnabled = this.isPickingEnabled;\n            labelSetVisual.pickPMatrix = this.pickPMatrix;\n            labelSetVisual.pickVMatrix = this.pickVMatrix;\n            labelSetVisual.viewports = this._viewports;\n            labelSetVisual.viewportOffset = this._viewportOffset;\n            labelSetVisual.viewportCount = this._viewportCount;\n            labelSetVisual.update(elapsedTime);\n          }\n        }\n      }\n      if (this.areImagesVisible) {\n        for (let i = 0; i < this.images.length; i++) {\n          const imageVisual = this.images[i];\n          if (imageVisual && imageVisual.isVisible) {\n            const image2 = this.images[i].image;\n            image2.update(elapsedTime);\n            imageVisual.mMatrix = this.mMatrix;\n            imageVisual.vMatrices = this.vMatrices;\n            imageVisual.pMatrices = this.pMatrices;\n            imageVisual.isPickingEnabled = this.isPickingEnabled;\n            imageVisual.pickPMatrix = this.pickPMatrix;\n            imageVisual.pickVMatrix = this.pickVMatrix;\n            imageVisual.viewports = this._viewports;\n            imageVisual.viewportOffset = this._viewportOffset;\n            imageVisual.viewportCount = this._viewportCount;\n            imageVisual.update(elapsedTime);\n          }\n        }\n      }\n      for (let i = 0; i < this.controllers.length; i++) {\n        const controllerVisual = this.controllers[i];\n        if (controllerVisual.isVisible) {\n          const controller = this.controllers[i].controller;\n          controller.update(elapsedTime);\n          controllerVisual.vMatrices = this.vMatrices;\n          controllerVisual.inverseVMatrices = this.vMatrices;\n          controllerVisual.pMatrices = this.pMatrices;\n          controllerVisual.viewports = this._viewports;\n          controllerVisual.viewportOffset = this._viewportOffset;\n          controllerVisual.viewportCount = this._viewportCount;\n          controllerVisual.update(elapsedTime);\n        }\n      }\n      const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n      if (axesVisuals) {\n        for (let i = 0; i < axesVisuals.length; i++) {\n          const axesVisual = axesVisuals[i];\n          if (axesVisual.isVisible) {\n            const axes = axesVisual.axes;\n            axes.mMatrix = this.mMatrix;\n            axes.vMatrix = this.vMatrices[0];\n            axes.update(elapsedTime);\n            axesVisual.vMatrices = this.vMatrices;\n            axesVisual.pMatrices = this.pMatrices;\n            axesVisual.isPickingEnabled = this.isPickingEnabled;\n            axesVisual.pickPMatrix = this.pickPMatrix;\n            axesVisual.pickVMatrix = this.pickVMatrix;\n            axesVisual.viewports = this._viewports;\n            axesVisual.viewportOffset = this._viewportOffset;\n            axesVisual.viewportCount = this._viewportCount;\n            axesVisual.update(elapsedTime);\n          }\n        }\n      }\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        const font2 = fontVisual.font;\n        font2.update();\n        fontVisual.update();\n      }\n    }\n    getVertexPosition(position2, pickedId) {\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        const transitionBuffer = this.transitionBuffers[i];\n        const id2 = transitionBuffer.pickIdLookup[pickedId];\n        if (id2 > -1) {\n          const index2 = transitionBuffer.currentBuffer.lookup[id2];\n          const dataView = transitionBuffer.currentBuffer.dataView;\n          UnitVertex.getTranslation(dataView, index2, position2);\n          break;\n        }\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$2(this, void 0, void 0, function* () {\n      });\n    }\n    prepare(xrFrame) {\n    }\n    initializeWebXR(session) {\n      return null;\n    }\n  }\n  let Quad$1 = class Quad {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const _vec3 = fromValues$3(2, 2, 2);\n      const _mat4 = create$4();\n      fromScaling(_mat4, _vec3);\n      const vertices = Quad$2.positions(_mat4);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$2.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  let Atlas$1 = class Atlas extends AtlasBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([255, 255, 255, 255]));\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._imageData) {\n        this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Palette$1 = class Palette extends PaletteBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._colors) {\n        const colors2 = new Uint8Array(this._colors);\n        for (let i = 0; i < colors2.length; i++) {\n          colors2[i] = Math.pow(colors2[i] / 255, 2.2) * 255;\n        }\n        this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors2);\n      } else {\n        this._texture = null;\n      }\n    }\n  };\n  let Buffer$2 = class Buffer extends BufferBase {\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update() {\n      if (this._isInitialized) {\n        const start = window.performance.now();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n        this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n      }\n    }\n  };\n  let TransitionBuffer$1 = class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$2, Palette$1, Atlas$1);\n    }\n    initializeContext(gl) {\n      this._buffer1.initializeContext(gl);\n      this._buffer2.initializeContext(gl);\n      this._palette1.initializeContext(this._core, gl);\n      this._palette2.initializeContext(this._core, gl);\n      this._atlas1.initializeContext(this._core, gl);\n      this._atlas2.initializeContext(this._core, gl);\n      this._isInitialized = true;\n    }\n  };\n  let Config$1 = class Config extends RendererConfig {\n    constructor() {\n      super();\n      this.reset();\n    }\n    reset() {\n      this.specularIntensity = 0.15;\n      this.specularPower = 150;\n      this.lightPosition = fromValues$3(-0.5, 0.5, 0);\n      this.ambient = 0.01;\n      const _quat1 = create$1();\n      const _quat2 = create$1();\n      let angle2 = AngleHelper.degreesToRadians(15);\n      setAxisAngle(_quat1, Constants.VECTOR3_UNITX, angle2);\n      multiply(_quat2, _quat1, _quat2);\n      angle2 = AngleHelper.degreesToRadians(-15);\n      setAxisAngle(_quat1, Constants.VECTOR3_UNITY, angle2);\n      multiply(_quat2, _quat2, _quat1);\n      this.directionToLight = create$3();\n      transformQuat(this.directionToLight, Constants.VECTOR3_UNITZ, _quat2);\n      this.halfAngle = create$3();\n      add(this.halfAngle, Constants.VECTOR3_UNITZ, this.directionToLight);\n      normalize$2(this.halfAngle, this.halfAngle);\n      this.isFxaaEnabled = false;\n    }\n  };\n  let Resources$1 = class Resources {\n    bindFramebuffer(framebuffer) {\n      if (this.framebuffer != framebuffer) {\n        this.framebuffer = framebuffer;\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n      }\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this.framebuffer = this._gl.createFramebuffer();\n      this.ANGLE_instanced_arrays = gl.getExtension(\"ANGLE_instanced_arrays\");\n      this.OES_standard_derivatives = gl.getExtension(\"OES_standard_derivatives\");\n      this.EXT_frag_depth = gl.getExtension(\"EXT_frag_depth\");\n      this.OES_element_index_uint = gl.getExtension(\"OES_element_index_uint\");\n      this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n  };\n  Resources$1.glsl = {\n    \"anaglyph.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nconst vec3 LEFT_MASK = vec3(1.0, 0.0, 0.0);\\nconst vec3 RIGHT_MASK = vec3(0.0, 1.0, 1.0);\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 color = LEFT_MASK * dot(texture2D(uSampler1, texCoords).rgb, LUMINANCE);\\ncolor += RIGHT_MASK * dot(texture2D(uSampler2, texCoords).rgb, LUMINANCE);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n',\n    \"color.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec3 vColor;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(vColor, GAMMA), 1.0);\\n}\\n',\n    \"color.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec3 aColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying lowp vec3 vColor;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvColor = aColor;\\n}\\n\",\n    \"lasso.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\ngl_FragColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n',\n    \"lasso.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"model.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform sampler2D uSampler;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\ngl_FragColor = vec4(pow(texture2D(uSampler, vTexCoord).xyz, GAMMA), 1.0);\\nvec3 color = texture2D(uSampler, vTexCoord).xyz;\\nfloat ambient = 0.01;\\nvec3 normal = normalize(vNormal);\\nfloat diffuse = 0.5 * max(dot(uDirectionToLight, normal), 0.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (ambient + diffuse);\\ncolor += specular;\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n',\n    \"model.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nvTexCoord = aTexCoord;\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(aNormal, 0.0));\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\n}\\n\",\n    \"pickgrid.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#define Derivatives\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nuniform vec3 uDirectionToLight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick)\\n{\\ngl_FragColor = vColor;\\n}\\nelse\\n{\\nvec2 buffer;\\n#ifdef Derivatives\\nbuffer = fwidth(vTexCoord);\\n#else\\nbuffer = vec2(0.002);\\n#endif\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nfloat diffuse = 0.2 * max(dot(uDirectionToLight, vNormal), 0.0);\\nfloat ambient = 0.8;\\ncolor.xyz *= (ambient + diffuse);\\ncolor.xyz = pow(color.xyz, GAMMA);\\ngl_FragColor = color;\\n}\\n}\\n',\n    \"pickgrid.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute lowp vec4 aIdColor;\\nattribute mediump vec2 aTexCoord;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nvarying lowp vec4 vColor;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec4 vBounds;\\nvarying mediump vec3 vNormal;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": '#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#define Derivatives\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse {\\nfloat distance = texture2D(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\ngl_FragColor = vec4(pow(mix(uBorderColor, mix(uColor, uHoverColor, vHover), value), GAMMA), 1.0);\\n}\\n}\\n',\n    \"sdftext.vertex.fx\": \"#version 100\\nattribute lowp vec4 aIdColor;\\nattribute vec3 aPosition;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nvarying mediump vec2 vTexCoord;\\nvarying lowp vec4 vIdColor;\\nvarying lowp float vHover;\\nvoid main(void) {\\ngl_Position = uPMatrix * uVMatrix * uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": \"#version 100\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nif (uPick) {\\ngl_FragColor = vec4(0.0);\\n}\\nelse {\\ngl_FragColor = vec4(texture2D(uSampler, vTexCoord).xyz, 1.0);\\n}\\n}\\n\",\n    \"texture.vertex.fx\": \"#version 100\\nattribute vec3 aPosition;\\nattribute mediump vec3 aNormal;\\nattribute mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nvarying mediump vec3 vNormal;\\nvarying mediump vec2 vTexCoord;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\ngl_Position = uPMatrix * mvMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": '#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void)\\n{\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n',\n    \"unitblock.vertex.fx\": '#version 100\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitcylinder.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - sqrt(h1);\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - sqrt(h2);\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unitcylinder.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec4 vCircle1;\\nvarying vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unithexprism.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform mat4 uVMatrix;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nvec4 iHexPrism( in vec3 ro, in vec3 rd, in float ra, in float he )\\n{\\nconst vec3 n1 = vec3( 1.0,0.0,0.0);\\nconst vec3 n2 = vec3( 0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n3 = vec3(-0.5,0.0,ROOT_THREE_OVER_TWO);\\nconst vec3 n4 = vec3( 0.0,1.0,0.0);\\nvec3 t1 = vec3((vec2(ra,-ra)-dot(ro,n1))/dot(rd,n1), 1.0);\\nvec3 t2 = vec3((vec2(ra,-ra)-dot(ro,n2))/dot(rd,n2), 1.0);\\nvec3 t3 = vec3((vec2(ra,-ra)-dot(ro,n3))/dot(rd,n3), 1.0);\\nvec3 t4 = vec3((vec2(he,-he)-dot(ro,n4))/dot(rd,n4), 1.0);\\nif( t1.y<t1.x ) t1=vec3(t1.yx,-1.0);\\nif( t2.y<t2.x ) t2=vec3(t2.yx,-1.0);\\nif( t3.y<t3.x ) t3=vec3(t3.yx,-1.0);\\nif( t4.y<t4.x ) t4=vec3(t4.yx,-1.0);\\nvec4 tN=vec4(t1.x,t1.z*n1);\\nif( t2.x>tN.x ) tN=vec4(t2.x,t2.z*n2);\\nif( t3.x>tN.x ) tN=vec4(t3.x,t3.z*n3);\\nif( t4.x>tN.x ) tN=vec4(t4.x,t4.z*n4);\\nfloat tF = min(min(t1.y,t2.y),min(t3.y,t4.y));\\nif( tN.x>tF || tF<0.0) return vec4(-1.0);\\nreturn tN;\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = -vViewCenter;\\nmat3 rot = mat3(uVMatrix);\\nvec3 rdd = rd * rot;\\nvec3 roo = ro * rot;\\nvec4 tnor = iHexPrism(roo, rdd, vRadius * vScaling, vHeight * vScaling);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = rot * tnor.yzw;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unithexprism.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying float vRadius;\\nvarying float vHeight;\\nvarying float vScaling;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvRadius = 0.0;\\nvHeight = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvRadius = scale.x * ROOT_THREE_OVER_TWO;\\nvHeight = scale.y;\\nvec3 position = aPosition;\\nposition.y *= scale.y;\\nposition.z *= scale.x;\\nposition.x *= scale.x * ROOT_THREE_OVER_TWO;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvScaling = length(uMMatrix[0].xyz) / 2.0;\\n}\\n}\\n',\n    \"unitsdf.fragment.fx\": '#version 100\\n#define Derivatives\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\nuniform vec3\t uBackgroundColor;\\nuniform float \t uBuffer;\\n#ifdef Derivatives\\n#extension GL_OES_standard_derivatives : enable\\n#endif\\nvoid main(void) {\\nfloat distance = mix(texture2D(uPreviousSampler1, vPreviousTexCoord).r, texture2D(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer) {\\ndiscard;\\n}\\nif (uPick) {\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nfloat diffuse, specular;\\n#ifdef Derivatives\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\ndiffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nspecular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\n#else\\ndiffuse = 1.0;\\nspecular = 0.0;\\n#endif\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\nfloat uGamma = 0.0;\\nfloat gamma;\\n#ifdef Derivatives\\ngamma = fwidth(distance);\\n#else\\ngamma = uGamma;\\n#endif\\nfloat value = smoothstep(uBuffer + gamma, uBuffer, distance);\\ngl_FragColor = vec4(mix(color, uBackgroundColor, value), 1.0);\\n}\\n}\\n',\n    \"unitsdf.vertex.fx\": '#version 100\\n#include \"quat.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute mediump vec4 aRotation;\\nattribute mediump vec4 aPreviousRotation;\\nattribute mediump vec4 aTexCoord;\\nattribute mediump vec4 aPreviousTexCoord;\\nattribute lowp vec2 aColor;\\nattribute lowp vec2 aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\n#define Derivatives\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump vec2 vTexCoord;\\nvarying mediump vec2 vPreviousTexCoord;\\n#ifdef Derivatives\\nvarying vec3 vViewPosition;\\n#endif\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\ngl_Position = vec4(0.0);\\n#ifdef Derivatives\\nvViewPosition = vec3(0.0);\\n#endif\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\n#ifdef Derivatives\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\n#else\\ngl_Position = uPMatrix * mvMatrix * vec4(position, 1.0);\\n#endif\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n',\n    \"unitsphere.fragment.fx\": '#version 100\\n#define FragDepth\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvarying mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform vec3 uDirectionToLight;\\nuniform vec3 uHalfAngle;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbient;\\nuniform vec3 uHoverColor;\\nuniform vec3 uActiveColor;\\nuniform vec3 uSelectedColor;\\nuniform float uHighlightMode;\\n#ifdef FragDepth\\n#extension GL_EXT_frag_depth : enable\\n#endif\\nfloat sphIntersect(in vec3 ro, in vec3 rd, in vec4 sph)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot(oc, rd);\\nfloat c = dot(oc, oc) - sph.w * sph.w;\\nfloat h = b * b - c;\\nif (h < 0.0) return -1.0;\\nreturn -b - sqrt(h);\\n}\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nelse\\n{\\nvec3 viewPosition = rd * t;\\n#ifdef FragDepth\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepthEXT = ndcDepth * 0.5 + 0.5;\\n#endif\\nif (uPick)\\n{\\ngl_FragColor = vIdColor;\\n}\\nelse\\n{\\nfloat emissive = 0.0;\\nvec3 previousColor = texture2D(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture2D(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\nif (uHighlightMode < 0.5) {\\nemissive = vVertexSelected * 0.5;\\nemissive += 1.5 * max(vHover, vActive);\\nemissive /= 4.0;\\n}\\nelse {\\npreviousColor = mix(previousColor, vec3(dot(LUMINANCE, previousColor)), max(-vVertexSelected, 0.0));\\ncolor = mix(color, vec3(dot(LUMINANCE, color)), max(-vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uSelectedColor, max(vVertexSelected, 0.0));\\ncolor = mix(color, uSelectedColor, max(vVertexSelected, 0.0));\\npreviousColor = mix(previousColor, uActiveColor, vActive);\\ncolor = mix(color, uActiveColor, vActive);\\npreviousColor = mix(previousColor, uHoverColor, vHover);\\ncolor = mix(color, uHoverColor, vHover);\\n}\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nfloat diffuse = clamp(dot(uDirectionToLight, normal), 0.0, 1.0);\\nfloat specular = pow(clamp(dot(normal, uHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity;\\ncolor *= (uAmbient + diffuse + emissive);\\ncolor += specular;\\ncolor = clamp(color, 0.0, 1.0);\\ncolor = pow(color, GAMMA);\\ngl_FragColor = vec4(color, 1.0);\\n}\\n}\\n}\\n',\n    \"unitsphere.vertex.fx\": '#version 100\\n#include \"common.include.fx\"\\nattribute mediump vec3 aPosition;\\nattribute vec3 aTranslation;\\nattribute vec3 aPreviousTranslation;\\nattribute lowp float aColor;\\nattribute lowp float aPreviousColor;\\nattribute vec3 aScale;\\nattribute vec3 aPreviousScale;\\nattribute float aId;\\nattribute vec2 aOrder;\\nattribute lowp float aSelected;\\nattribute lowp float aPreviousSelected;\\nattribute lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nvarying lowp vec4 vIdColor;\\nvarying lowp vec2 vVertexColor;\\nvarying lowp float vVertexSelected;\\nvarying highp float vAnimation;\\nvarying lowp float vHover;\\nvarying lowp float vActive;\\nvarying mediump float vRadius;\\nvarying vec3 vViewPosition;\\nvarying vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec4 translation = vec4(mix(aPreviousTranslation, aTranslation, animation), 1.0);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * translation).xyz;\\ntranslation.xyz += aPosition * scale;\\nvViewPosition = (mvMatrix * translation).xyz;\\ngl_Position = uPMatrix * vec4(vViewPosition, 1.0);\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n',\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nmat3 transpose(in mat3 mat) {\\nvec3 i0 = mat[0];\\nvec3 i1 = mat[1];\\nvec3 i2 = mat[2];\\nreturn mat3\\n(\\nvec3(i0.x, i1.x, i2.x),\\nvec3(i0.y, i1.y, i2.y),\\nvec3(i0.z, i1.z, i2.z)\\n);\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n  };\n  let ShaderBase$1 = class ShaderBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    set vertexBuffer(value2) {\n      if (this._vertexBuffer != value2) {\n        this._vertexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    set indexBuffer(value2) {\n      if (this._indexBuffer != value2) {\n        this._indexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    constructor(core, main) {\n      this._core = core;\n      this._main = main;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n      const program = this._gl.createProgram();\n      this._gl.attachShader(program, vs);\n      this._gl.attachShader(program, fs);\n      this._gl.linkProgram(program);\n      if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n      }\n      return program;\n    }\n    _compileShader(source2, type2) {\n      const shader = this._gl.createShader(type2);\n      this._gl.shaderSource(shader, source2);\n      this._gl.compileShader(shader);\n      if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n      }\n      return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n      const remove2 = `#define ${directive}`;\n      const index2 = shaderSource.indexOf(remove2);\n      shaderSource = index2 == -1 ? shaderSource : shaderSource.substring(0, index2) + shaderSource.substring(index2 + remove2.length);\n      return shaderSource;\n    }\n    prepare() {\n      if (this._program != this._main.shaderResources.currentProgram) {\n        if (this._main.shaderResources.currentShader) {\n          this._main.shaderResources.currentShader.disableProgram();\n        }\n        this.enableProgram(this._program);\n        this.updateBuffers();\n        this.updateTextures();\n      } else {\n        if (this._haveBuffersChanged) {\n          this.updateBuffers();\n        }\n        if (this._haveTexturesChanged) {\n          this.updateTextures();\n        }\n      }\n    }\n    apply() {\n    }\n    applyModel() {\n    }\n    applyView() {\n    }\n    enableProgram(program) {\n      this._gl.useProgram(program);\n      this._main.shaderResources.currentProgram = program;\n      this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n      this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n      this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n      this._main.shaderResources.currentShader = null;\n      this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n      callback(this._includesFromFile(Resources$1.glsl[vsName]), this._includesFromFile(Resources$1.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n      this._sourceFromUrl(vsName, (vsSource) => {\n        this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n          this._sourceFromUrl(fsName, (fsSource) => {\n            this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n              callback(vsIncSource, fsIncSource);\n            });\n          });\n        });\n      });\n    }\n    _sourceFromUrl(url, callback) {\n      const request2 = new XMLHttpRequest();\n      request2.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n      request2.onreadystatechange = () => {\n        if (request2.readyState == XMLHttpRequest.DONE && request2.status == 200) {\n          callback(request2.responseText);\n        }\n      };\n      request2.send();\n    }\n    _includesFromFile(source2) {\n      let index2 = 0;\n      do {\n        index2 = source2.indexOf(\"#include\", index2);\n        if (index2 != -1) {\n          const start = source2.indexOf('\"', index2);\n          const end = source2.indexOf('\"', start + 1);\n          const name = source2.substring(start + 1, end);\n          const inc = Resources$1.glsl[name];\n          source2 = source2.substring(0, index2) + inc + source2.substring(end + 1);\n        }\n      } while (index2 != -1);\n      return source2;\n    }\n    _includesFromUrl(source2, index2, callback) {\n      index2 = source2.indexOf(\"#include\", index2);\n      if (index2 != -1) {\n        const start = source2.indexOf('\"', index2);\n        const end = source2.indexOf('\"', start + 1);\n        const name = source2.substring(start + 1, end);\n        this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n          source2 = source2.substring(0, index2) + include + source2.substring(end + 1);\n          this._includesFromUrl(source2, index2, callback);\n        });\n      } else {\n        callback(source2);\n      }\n    }\n  };\n  class Color extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"color.vertex.fx\", \"color.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionColorVertex.SIZE_BYTES, PositionColorVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 3, this._gl.UNSIGNED_BYTE, true, PositionColorVertex.SIZE_BYTES, PositionColorVertex.COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  }\n  let Texture$1 = class Texture extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  };\n  let Lasso$3 = class Lasso extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n      this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  class Model extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"model.vertex.fx\", \"model.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n    }\n    applyView() {\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  let SdfText$1 = class SdfText extends ShaderBase$1 {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n      this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n      this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n      this._gl.uniform1f(this._gammaUniform, this.gamma);\n      this._gl.uniform1f(this._bufferUniform, this.buffer);\n      this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  };\n  let PickGrid$1 = class PickGrid extends ShaderBase$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n      this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n      this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n      this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n      this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n      this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n      this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n      this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n      this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n      this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n      this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n      this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n      this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n      this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n      this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n      this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n      this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n      this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n      this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n      this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n      this._gl.uniform2fv(this._zeroUniform, this.zero);\n      this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._boundsAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  let UnitShader$1 = class UnitShader extends ShaderBase$1 {\n    get paletteTexture() {\n      return this._paletteTexture;\n    }\n    set paletteTexture(value2) {\n      if (this._paletteTexture != value2) {\n        this._paletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousPaletteTexture() {\n      return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value2) {\n      if (this._previousPaletteTexture != value2) {\n        this._previousPaletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get sdfTexture() {\n      return this._sdfTexture;\n    }\n    set sdfTexture(value2) {\n      if (this._sdfTexture != value2) {\n        this._sdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousSdfTexture() {\n      return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value2) {\n      if (this._previousSdfTexture != value2) {\n        this._previousSdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    set instanceBuffer(value2) {\n      if (this._instanceBuffer != value2) {\n        this._instanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    set previousInstanceBuffer(value2) {\n      if (this._previousInstanceBuffer != value2) {\n        this._previousInstanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    initializeData() {\n      this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n      this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n      this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n      this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n      this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n      this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n      this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n      this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n      this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n      this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n      this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n      this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n      this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._directionToLightUniform = gl.getUniformLocation(this._program, \"uDirectionToLight\");\n      this._halfAngleUniform = gl.getUniformLocation(this._program, \"uHalfAngle\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._ambientUniform = gl.getUniformLocation(this._program, \"uAmbient\");\n      this._activeColorUniform = gl.getUniformLocation(this._program, \"uActiveColor\");\n      this._selectedColorUniform = gl.getUniformLocation(this._program, \"uSelectedColor\");\n      this._highlightModeUniform = gl.getUniformLocation(this._program, \"uHighlightMode\");\n      const vertices = Cube.POSITIONS;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Cube.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this.indexCount = indices.length;\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._updateCurrentBuffer();\n      this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n      this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._translationAttribute);\n      this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._scaleAttribute);\n      this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._selectedAttribute);\n      this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 1);\n      this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      if (this._previousInstanceBuffer != this._instanceBuffer) {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n      }\n      this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n      this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n      this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1f(this._timeUniform, this.time);\n      this._gl.uniform1f(this._durationUniform, this.duration);\n      this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n      this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n      this._gl.uniform1i(this._previousSampler0Uniform, 0);\n      this._gl.uniform1i(this._sampler0Uniform, 1);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n      this._gl.uniform1f(this._ambientUniform, this.ambient);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._activeColorUniform, this.activeColor);\n      this._gl.uniform3fv(this._selectedColorUniform, this.selectedColor);\n      this._gl.uniform1f(this._hoverUniform, this.hover);\n      this._gl.uniform1f(this._activeUniform, this.active);\n      this._gl.uniform1f(this._highlightModeUniform, this.highlightMode == HighlightMode.luminance ? 0 : 1);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n      this._gl.uniform3fv(this._directionToLightUniform, this.directionToLight);\n      this._gl.uniform3fv(this._halfAngleUniform, this.halfAngle);\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n    }\n    updateTextures() {\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._translationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTranslationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._scaleAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousScaleAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._selectedAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousSelectedAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._orderAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._idColorAttribute, 0);\n    }\n  };\n  let UnitBlock$1 = class UnitBlock extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            vsSource = this._removeDirective(vsSource, \"Derivatives\");\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  };\n  let UnitSphere$1 = class UnitSphere extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n  };\n  let UnitCylinder$1 = class UnitCylinder extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  };\n  class UnitHexPrism extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unithexprism.vertex.fx\", \"unithexprism.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.EXT_frag_depth == null) {\n            fsSource = this._removeDirective(fsSource, \"FragDepth\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n    }\n  }\n  let UnitSdf$1 = class UnitSdf extends UnitShader$1 {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n          if (this._main.shaderResources.OES_standard_derivatives == null) {\n            vsSource = this._removeDirective(vsSource, \"Derivatives\");\n            fsSource = this._removeDirective(fsSource, \"Derivatives\");\n          }\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n      this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n      this._sdfBufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._sdfBackgroundColorUniform = gl.getUniformLocation(this._program, \"uBackgroundColor\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n      super.apply();\n      this._gl.uniform1i(this._previousSampler1Uniform, 2);\n      this._gl.uniform1i(this._sampler1Uniform, 3);\n      this._gl.uniform1f(this._sdfBufferUniform, this.sdfBuffer);\n      this._gl.uniform3fv(this._sdfBackgroundColorUniform, this.sdfBackgroundColor);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      const ANGLE_instanced_arrays = this._main.shaderResources.ANGLE_instanced_arrays;\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._rotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousRotationAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._texCoordAttribute, 0);\n      ANGLE_instanced_arrays.vertexAttribDivisorANGLE(this._previousTexCoordAttribute, 0);\n    }\n  };\n  class Anaglyph extends ShaderBase$1 {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"anaglyph.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n    }\n  }\n  class DebugAxesVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.colorShader.isInitialized;\n    }\n    constructor(core, main, debugAxes) {\n      this._main = main;\n      this._debugAxes = debugAxes;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._debugAxes.isInitialized) {\n        this._debugAxes.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._debugAxes.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._debugAxes.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const colorShader = this._main.colorShader;\n        const shaderResources = this._main.shaderResources;\n        colorShader.vertexBuffer = this._vertexBuffer;\n        colorShader.indexBuffer = this._indexBuffer;\n        colorShader.prepare();\n        colorShader.mMatrix = this.mMatrix;\n        colorShader.apply();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          colorShader.vMatrix = this.vMatrices[viewport];\n          colorShader.pMatrix = this.pMatrices[viewport];\n          colorShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._debugAxes.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  }\n  let AxesVisualBase$1 = class AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get axes() {\n      return this._axes;\n    }\n    constructor(core) {\n      this._core = core;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._renderGrid();\n        this._renderText();\n      }\n    }\n    _renderGrid() {\n    }\n    _renderText() {\n    }\n  };\n  let Cartesian2dVisual$1 = class Cartesian2dVisual extends AxesVisualBase$1 {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian2dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 2; edge++) {\n          const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n          if (axes.isEdgeVisible[edgeId]) {\n            if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n              indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n              indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n            } else {\n              indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n              indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n            }\n            if (indexCount > 0) {\n              shader.mMatrix = axes.getLabelMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n            indexCount = axes.getTitleIndexCount(axisId);\n            if (indexCount > 0) {\n              indexOffset = axes.getTitleIndexOffset(axisId);\n              shader.mMatrix = axes.getTitleMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n          indexCount = axes.getHeadingIndexCount(axisId);\n          if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n            indexOffset = axes.getHeadingIndexOffset(axisId);\n            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n            shader.applyModel();\n            shader.isPickShader = false;\n            for (let i = 0; i < this.viewportCount; i++) {\n              const viewport = i + this.viewportOffset;\n              shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n              this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n              shader.vMatrix = this.vMatrices[viewport];\n              shader.pMatrix = this.pMatrices[viewport];\n              shader.applyView();\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n              shader.isPickShader = true;\n              shader.pMatrix = this.pickPMatrix;\n              shader.vMatrix = this.pickVMatrix;\n              shader.applyView();\n              shaderResources.bindFramebuffer(this.pickFramebuffer);\n              this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.directionToLight = Constants.VECTOR3_UNITZ;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width3 = gridTicksScale[0];\n          const height3 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n            if (axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width3, height3);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      const axisId2 = 0;\n      const axisId3 = 1;\n      const width2 = size[axisId2];\n      const height2 = size[axisId3];\n      gridShader.zero = axes.gridFaceZero;\n      gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n      for (let face = 0; face < 2; face++) {\n        const faceId = face;\n        if (axes.getIsForwardFace(faceId)) {\n          this._renderGridFace(faceId, width2, height2);\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, this._axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, this._axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  };\n  let Cartesian3dVisual$1 = class Cartesian3dVisual extends AxesVisualBase$1 {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian3dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 4; edge++) {\n          const edgeId = Cube.AXIS_EDGES[axisId][edge];\n          if (axes.getIsOutsideEdge(edgeId)) {\n            if (axes.isEdgeVisible[edgeId]) {\n              if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n              } else {\n                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n              }\n              if (indexCount > 0) {\n                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n              indexCount = axes.getTitleIndexCount(axisId);\n              if (indexCount > 0) {\n                indexOffset = axes.getTitleIndexOffset(axisId);\n                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n            }\n            indexCount = axes.getHeadingIndexCount(axisId);\n            if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n              indexOffset = axes.getHeadingIndexOffset(axisId);\n              shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.directionToLight = Constants.VECTOR3_UNITZ;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width2 = gridTicksScale[0];\n          const height2 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.areFacesVisible[axisId]) {\n          const axisId2 = axisId == 0 ? 1 : 0;\n          const axisId3 = axisId == 2 ? 1 : 2;\n          const width2 = size[axisId2];\n          const height2 = size[axisId3];\n          gridShader.zero = axes.getGridFaceZero(axisId);\n          gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n          for (let face = 0; face < 2; face++) {\n            const faceId = Cube.AXIS_FACES[axisId][face];\n            if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n              this._renderGridFace(faceId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  };\n  class ControllerVisual {\n    get isInitialized() {\n      return this._isInitialized && this._modelShader.isInitialized && this._colorShader.isInitialized;\n    }\n    get controller() {\n      return this._controller;\n    }\n    constructor(core, main, controller) {\n      this._core = core;\n      this._main = main;\n      this._mMatrix = create$4();\n      this._vec3 = create$3();\n      this._controller = controller;\n      this._modelShader = main.modelShader;\n      this._colorShader = main.colorShader;\n      this.mMatrix = create$4();\n      this.rayMMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._controller.isInitialized) {\n        this._controller.initialize();\n      }\n      this._initialize(gl);\n    }\n    _initialize(gl) {\n      this._gl = gl;\n      this.modelTexture = TextureHelper.fromImage(gl, this._controller.texture, false, gl.LINEAR);\n      this._modelVertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._modelVertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._controller.vertices, gl.STATIC_DRAW);\n      this._modelIndexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._modelIndexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.indices, gl.STATIC_DRAW);\n      this._rayVertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._rayVertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._controller.rayVertices, gl.STATIC_DRAW);\n      this._rayIndexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._rayIndexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._controller.rayIndices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._modelShader.vertexBuffer = this._modelVertexBuffer;\n        this._modelShader.indexBuffer = this._modelIndexBuffer;\n        this._modelShader.texture2D = this.modelTexture;\n        this._modelShader.prepare();\n        multiply$2(this._mMatrix, this._controller.useRayPose ? this.rayMMatrix : this.mMatrix, this._controller.mMatrix);\n        this._modelShader.mMatrix = this._mMatrix;\n        this._modelShader.specularPower = 10;\n        this._modelShader.specularIntensity = 0.01;\n        this._modelShader.apply();\n        this._modelShader.applyModel();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          this._modelShader.directionToLight = Constants.VECTOR3_UNITZ;\n          this._modelShader.halfAngle = Constants.VECTOR3_UNITZ;\n          this._modelShader.vMatrix = this.vMatrices[viewport];\n          this._modelShader.pMatrix = this.pMatrices[viewport];\n          this._modelShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._controller.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this.isRayVisible) {\n          this._colorShader.vertexBuffer = this._rayVertexBuffer;\n          this._colorShader.indexBuffer = this._rayIndexBuffer;\n          this._colorShader.prepare();\n          multiply$2(this._mMatrix, this.rayMMatrix, this._controller.rayMMatrix);\n          this._colorShader.mMatrix = this._mMatrix;\n          this._colorShader.apply();\n          this._colorShader.applyModel();\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            this._colorShader.vMatrix = this.vMatrices[viewport];\n            this._colorShader.pMatrix = this.pMatrices[viewport];\n            this._colorShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLE_STRIP, this._controller.rayIndexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      }\n    }\n  }\n  let ImageVisual$1 = class ImageVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n      return this._image;\n    }\n    constructor(core, main, image2) {\n      this._core = core;\n      this._main = main;\n      this._image = image2;\n      this._image.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this.mMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._image.isInitialized) {\n        this._image.initialize();\n      }\n      this._gl = gl;\n      if (this._image.imageData) {\n        this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n      }\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const textureShader = this._main.textureShader;\n        const shaderResources = this._main.shaderResources;\n        textureShader.vertexBuffer = this._vertexBuffer;\n        textureShader.indexBuffer = this._indexBuffer;\n        textureShader.texture2D = this.texture;\n        textureShader.prepare();\n        textureShader.mMatrix = this.mMatrix;\n        textureShader.isPickShader = false;\n        textureShader.apply();\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          textureShader.vMatrix = this.vMatrices[viewport];\n          textureShader.pMatrix = this.pMatrices[viewport];\n          textureShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this.isPickingEnabled) {\n          textureShader.isPickShader = true;\n          textureShader.vMatrix = this.pickVMatrix;\n          textureShader.pMatrix = this.pickPMatrix;\n          textureShader.applyView();\n          shaderResources.bindFramebuffer(this.pickFramebuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  };\n  let LabelVisualBase$1 = class LabelVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label2) {\n      this._core = core;\n      this._main = main;\n      this._label = label2;\n      this._label.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this._mMatrix = create$4();\n      this.mMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._label.isInitialized) {\n        this._label.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const indexCount = this._label.indexCount;\n        if (indexCount > 0) {\n          const shader = this._main.sdfTextShader;\n          const fontVisual = this._main.fonts[this._label.font.name];\n          shader.vertexBuffer = this._vertexBuffer;\n          shader.indexBuffer = this._indexBuffer;\n          shader.texture2D = fontVisual.texture;\n          shader.prepare();\n          shader.gamma = this._label.gamma;\n          shader.buffer = fontVisual.font.edgeValue / 255;\n          shader.borderWidth = this._label.borderWidth;\n          shader.color = this._label.color || this._core.config.textColor;\n          shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n          shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n          shader.pickedIdColor = this.pickedIdColor;\n          shader.apply();\n          multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n          shader.mMatrix = this._mMatrix;\n          shader.applyModel();\n          shader.isPickShader = false;\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._main.shaderResources.bindFramebuffer(this.framebuffers[viewport]);\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            shader.vMatrix = this.vMatrices[viewport];\n            shader.pMatrix = this.pMatrices[viewport];\n            shader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n          }\n          if (this.isPickingEnabled) {\n            shader.isPickShader = true;\n            shader.pMatrix = this.pickPMatrix;\n            shader.vMatrix = this.pickVMatrix;\n            shader.applyView();\n            this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_INT, 0);\n          }\n        }\n      }\n    }\n  };\n  let LabelVisual$1 = class LabelVisual extends LabelVisualBase$1 {\n    get label() {\n      return this._label;\n    }\n    set text(value2) {\n      this._label.text = value2;\n    }\n    get text() {\n      return this._label.text;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  };\n  let LabelSetVisual$1 = class LabelSetVisual extends LabelVisualBase$1 {\n    get label() {\n      return this._label;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  };\n  let FontVisual$1 = class FontVisual {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get font() {\n      return this._font;\n    }\n    constructor(core, font2) {\n      this._core = core;\n      this._font = font2;\n      font2.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._isInitialized = true;\n      if (this._font.count > 0) {\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n        this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n      }\n    }\n  };\n  let Lasso$2 = class Lasso {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const vertices = Quad$2.textured(Constants.MAT4_IDENTITY);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$2.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  };\n  var __awaiter$1 = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  let Main$1 = class Main extends RendererBase {\n    get shaderResources() {\n      return this._shaderResources;\n    }\n    get colorShader() {\n      return this._colorShader;\n    }\n    get textureShader() {\n      return this._textureShader;\n    }\n    get lassoShader() {\n      return this._lassoShader;\n    }\n    get modelShader() {\n      return this._modelShader;\n    }\n    get sdfTextShader() {\n      return this._sdfTextShader;\n    }\n    get gridShader() {\n      return this._gridShader;\n    }\n    get blockShader() {\n      return this._blockShader;\n    }\n    get sphereShader() {\n      return this._sphereShader;\n    }\n    get cyclinderShader() {\n      return this._cylinderShader;\n    }\n    get hexPrismShader() {\n      return this._hexPrismShader;\n    }\n    get sdfShader() {\n      return this._sdfShader;\n    }\n    get anaglyphShader() {\n      return this._anaglyphShader;\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    get config() {\n      return this._config;\n    }\n    constructor(options) {\n      super(options);\n      this._config = new Config$1();\n      this._quad = new Quad$1();\n      this._lasso = new Lasso$2();\n      this._pickedPixels = new Uint8Array(4);\n      this._pickedIdColor = create$2();\n      this._mat3 = create$5();\n      this._directionToCamera = create$3();\n      this._directionToLight = create$3();\n      this._halfAngle = create$3();\n      this._cameraPosition = create$3();\n      this._modelPosition = create$3();\n      this.depthEnabled = true;\n    }\n    get isSupported() {\n      return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    get isWebXRSupported() {\n      return true;\n    }\n    initialize(core) {\n      super.initialize(core);\n      this._shaderResources = new Resources$1();\n      this._colorShader = new Color(this._core, this);\n      this._textureShader = new Texture$1(this._core, this);\n      this._lassoShader = new Lasso$3(this._core, this);\n      this._modelShader = new Model(this._core, this);\n      this._sdfTextShader = new SdfText$1(this._core, this);\n      this._gridShader = new PickGrid$1(this._core, this);\n      this._anaglyphShader = new Anaglyph(this._core, this);\n      this._blockShader = new UnitBlock$1(this._core, this);\n      this._sphereShader = new UnitSphere$1(this._core, this);\n      this._cylinderShader = new UnitCylinder$1(this._core, this);\n      this._hexPrismShader = new UnitHexPrism(this._core, this);\n      this._sdfShader = new UnitSdf$1(this._core, this);\n      this._initializeContext(this._createContext(this._canvas));\n      this._canvas.addEventListener(\"webglcontextlost\", (event2) => {\n        this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n        this._isInitialized = false;\n        event2.preventDefault();\n      }, false);\n      this._canvas.addEventListener(\"webglcontextrestored\", () => {\n        this._initializeContext(this._createContext(this._canvas));\n        this._isInitialized = true;\n        this._core.log.write(LogLevel.info, \"WebGL context restored\");\n      }, false);\n      this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n      this._gl = gl;\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        fontVisual.initializeContext(gl);\n      }\n      this._shaderResources.initializeContext(this._gl);\n      this._colorShader.initializeContext(this._gl);\n      this._textureShader.initializeContext(this._gl);\n      this._lassoShader.initializeContext(this._gl);\n      this._modelShader.initializeContext(this._gl);\n      this._sdfTextShader.initializeContext(this._gl);\n      this._gridShader.initializeContext(this._gl);\n      this._anaglyphShader.initializeContext(this._gl);\n      this._blockShader.initializeContext(this._gl);\n      this._sphereShader.initializeContext(this._gl);\n      this._cylinderShader.initializeContext(this._gl);\n      this._hexPrismShader.initializeContext(this._gl);\n      this._sdfShader.initializeContext(this._gl);\n      this._quad.initializeContext(this._gl);\n      this._lasso.initializeContext(this._gl);\n      this._debugAxesVisual.initializeContext(this._gl);\n      this._framebuffers = [null, null];\n      const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, this._core.config.pickWidth, this._core.config.pickHeight);\n      const framebuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(framebuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._pickFrameBuffer = framebuffer;\n      this._anaglyphTextures = [null, null];\n      this.anaglyphFramebuffers = [null, null];\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        this.transitionBuffers[i].initializeContext(this._gl);\n      }\n      if (this._axes1) {\n        for (let i = 0; i < this._axes1.length; i++) {\n          this._axes1[i].initializeContext(this._gl);\n        }\n      }\n      if (this._axes2) {\n        for (let i = 0; i < this._axes2.length; i++) {\n          this._axes2[i].initializeContext(this._gl);\n        }\n      }\n      for (let i = 0; i < this.labelSets.length; i++) {\n        this.labelSets[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.images.length; i++) {\n        this.images[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.controllers.length; i++) {\n        this.controllers[i].initializeContext(this._gl);\n      }\n    }\n    _resize(width2, height2) {\n      super._resize(width2, height2);\n      for (let i = 0; i < 2; i++) {\n        const texture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        const renderBuffer = this._gl.createRenderbuffer();\n        this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n        this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT16, width2, height2);\n        const framebuffer = this._gl.createFramebuffer();\n        this._shaderResources.bindFramebuffer(framebuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n        this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n        this._anaglyphTextures[i] = texture;\n        this.anaglyphFramebuffers[i] = framebuffer;\n      }\n      this._core.log.write(LogLevel.info, `buffers resized ${width2},${height2}`);\n    }\n    _createContext(canvas) {\n      const antialias = this._options ? this._options.antialias === void 0 ? true : this._options.antialias : true;\n      const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === void 0 ? false : this._options.preserveDrawingBuffer : false;\n      return canvas.getContext(\"webgl\", {\n        stencil: true,\n        alpha: true,\n        antialias,\n        preserveDrawingBuffer\n      });\n    }\n    initializeWebXR(session) {\n      const promise = new Promise((resolve2, reject) => {\n        this._gl.makeXRCompatible().then(() => {\n          session.updateRenderState({\n            baseLayer: new XRWebGLLayer(session, this._gl),\n            depthNear: this._core.config.nearPlane,\n            depthFar: this._core.config.farPlane\n          });\n          session.requestReferenceSpace(\"local\").then((refSpace) => {\n            this._webXRReferenceSpace = refSpace;\n            resolve2();\n          });\n        });\n      });\n      return promise;\n    }\n    prepare(xrFrame) {\n      if (xrFrame) {\n        const pose = xrFrame.getViewerPose(this._webXRReferenceSpace);\n        if (pose) {\n          const glLayer = xrFrame.session.renderState.baseLayer;\n          for (let i = 0; i < pose.views.length; i++) {\n            const view = pose.views[i];\n            this.vMatrices[i] = view.transform.inverse.matrix;\n            this.inverseVMatrices[i] = view.transform.matrix;\n            multiply$2(this._mvMatrices[i], this.vMatrices[i], this.mMatrix);\n            this.mvMatrices[i] = this._mvMatrices[i];\n            this.pMatrices[i] = view.projectionMatrix;\n            const viewport = glLayer.getViewport(view);\n            this._viewports[i].x = viewport.x;\n            this._viewports[i].y = viewport.y;\n            this._viewports[i].width = viewport.width;\n            this._viewports[i].height = viewport.height;\n            this._framebuffers[i] = glLayer.framebuffer;\n          }\n        }\n        this._viewportOffset = 0;\n        this._viewportCount = 2;\n      } else {\n        let viewport;\n        switch (this._core.config.stereoMode) {\n          case StereoMode.none:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 1;\n            this._framebuffers[0] = null;\n            break;\n          case StereoMode.left:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 1;\n            this._framebuffers[0] = null;\n            break;\n          case StereoMode.right:\n            viewport = this._viewports[1];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 1;\n            this._viewportCount = 1;\n            this._framebuffers[1] = null;\n            break;\n          case StereoMode.anaglyph:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            viewport = this._viewports[1];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n            this._framebuffers[0] = this.anaglyphFramebuffers[0];\n            this._framebuffers[1] = this.anaglyphFramebuffers[1];\n            break;\n          case StereoMode.split:\n            viewport = this._viewports[0];\n            viewport.x = 0;\n            viewport.y = 0;\n            viewport.width = this._canvas.width / 2;\n            viewport.height = this._canvas.height;\n            viewport = this._viewports[1];\n            viewport.x = this._canvas.width / 2;\n            viewport.y = 0;\n            viewport.width = this._canvas.width / 2;\n            viewport.height = this._canvas.height;\n            this._viewportOffset = 0;\n            this._viewportCount = 2;\n            this._framebuffers[0] = null;\n            this._framebuffers[1] = null;\n            break;\n        }\n      }\n    }\n    createTransitionBuffer(ids) {\n      const buffer = new TransitionBuffer$1(this._core, ids);\n      buffer.initializeContext(this._gl);\n      return buffer;\n    }\n    createControllerVisual(controller) {\n      const visual = new ControllerVisual(this._core, this, controller);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian2dAxesVisual(axes) {\n      const visual = new Cartesian2dVisual$1(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n      const visual = new Cartesian3dVisual$1(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    _createDebugAxesVisual(debugAxes) {\n      return new DebugAxesVisual(this._core, this, debugAxes);\n    }\n    _createLabelVisual(label2) {\n      return new LabelVisual$1(this._core, this, label2);\n    }\n    createLabelSetVisual(labelSet) {\n      const visual = new LabelSetVisual$1(this._core, this, labelSet);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createImageVisual(image2) {\n      const visual = new ImageVisual$1(this._core, this, image2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createFontVisual(font2) {\n      const visual = new FontVisual$1(this._core, font2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    getDataUrl(mimeType) {\n      return this._canvas.toDataURL(mimeType);\n    }\n    render(elapsedTime, xrFrame) {\n      return __awaiter$1(this, void 0, void 0, function* () {\n        if (this.depthEnabled) {\n          this._gl.enable(this._gl.DEPTH_TEST);\n        } else {\n          this._gl.disable(this._gl.DEPTH_TEST);\n        }\n        this._gl.enable(this._gl.CULL_FACE);\n        this._gl.disable(this._gl.BLEND);\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.clearColor(0, 0, 0, 0);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n        this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], backgroundColor[3]);\n        if (xrFrame) {\n          const glLayer = xrFrame.session.renderState.baseLayer;\n          this._shaderResources.bindFramebuffer(glLayer.framebuffer);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        } else if (this._core.config.stereoMode == StereoMode.anaglyph) {\n          for (let i = 0; i < 2; i++) {\n            this._shaderResources.bindFramebuffer(this.anaglyphFramebuffers[i]);\n            this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n          }\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        } else {\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        if (this._core.config.isDebugVisible) {\n          this._debugAxesVisual.framebuffers = this._framebuffers;\n          this._debugAxesVisual.render(elapsedTime, xrFrame);\n        }\n        const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n        if (axesVisuals) {\n          for (let i = 0; i < axesVisuals.length; i++) {\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n              axesVisual.pickedIdColor = this._pickedIdColor;\n              axesVisual.pickFramebuffer = this._pickFrameBuffer;\n              axesVisual.framebuffers = this._framebuffers;\n              axesVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        for (let i = 0; i < this.transitionBuffers.length; i++) {\n          const transitionBuffer = this.transitionBuffers[i];\n          if (transitionBuffer.isVisible) {\n            this._renderTransitionBuffer(xrFrame, transitionBuffer);\n          }\n        }\n        if (this.areLabelsVisible) {\n          for (let i = 0; i < this.labelSets.length; i++) {\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n              labelSetVisual.pickedIdColor = this._pickedIdColor;\n              labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n              labelSetVisual.framebuffers = this._framebuffers;\n              labelSetVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        if (this.areImagesVisible) {\n          for (let i = 0; i < this.images.length; i++) {\n            const imageVisual = this.images[i];\n            if (imageVisual.isVisible) {\n              imageVisual.framebuffers = this._framebuffers;\n              imageVisual.pickFramebuffer = this._pickFrameBuffer;\n              imageVisual.isPickingEnabled = this.isPickingEnabled;\n              imageVisual.render(elapsedTime, xrFrame);\n            }\n          }\n        }\n        for (let i = 0; i < this.controllers.length; i++) {\n          const controllerVisual = this.controllers[i];\n          if (controllerVisual.isVisible) {\n            controllerVisual.isRayVisible = this.isPickingEnabled;\n            controllerVisual.framebuffers = this._framebuffers;\n            controllerVisual.render(elapsedTime, xrFrame);\n          }\n        }\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n          this._pickedType = PickHelper.decodeType(this._pickedPixels);\n          set$2(this._pickedIdColor, this._pickedPixels[0] / 255, this._pickedPixels[1] / 255, this._pickedPixels[2] / 255, this._pickedPixels[3] / 255);\n          this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n          if (this._isCapturingPickImage && this.capturePickImageCallback) {\n            this._isCapturingPickImage = false;\n            const data2 = new Uint8ClampedArray(this._core.config.pickWidth * this._core.config.pickHeight * 4);\n            this._gl.readPixels(0, 0, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, data2);\n            for (let i = 0; i < data2.length / 4; i++) {\n              if (data2[i * 4 + 3] == PickType.data) {\n                data2[i * 4 + 3] = 255;\n              } else {\n                data2[i * 4] = 0;\n                data2[i * 4 + 1] = 0;\n                data2[i * 4 + 2] = 0;\n                data2[i * 4 + 3] = 0;\n              }\n            }\n            const length2 = this._core.config.pickWidth * this._core.config.pickHeight * 4;\n            const row = this._core.config.pickWidth * 4;\n            const end = (this._core.config.pickHeight - 1) * row;\n            const flipped = new Uint8ClampedArray(length2);\n            for (let i = 0; i < length2; i += row) {\n              flipped.set(data2.subarray(i, i + row), end - i);\n            }\n            this.capturePickImageCallback(flipped, this._core.config.pickWidth, this._core.config.pickHeight);\n          }\n        } else {\n          set$2(this._pickedIdColor, 0, 0, 0, 0);\n          this._pickedId = 0;\n        }\n        if (this.isLassoPicking && this._lassoShader.isInitialized) {\n          this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n          this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n          const lassoWidth = this.lassoX1 - this.lassoX0;\n          const lassoHeight = this.lassoY1 - this.lassoY0;\n          this._lassoShader.prepare();\n          this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n          this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n          this._lassoShader.apply();\n          const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewportIndex = i + this._viewportOffset;\n            this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n            const viewport = this._viewports[viewportIndex];\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n            this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n            this._lassoMMatrix[10] = 1;\n            this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n            this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n            this._lassoShader.mMatrix = this._lassoMMatrix;\n            set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n            this._lassoShader.thickness = this._lassoThickness;\n            this._lassoShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n        if (this._core.config.stereoMode == StereoMode.anaglyph && this._anaglyphShader.isInitialized && this._quad.isInitialized) {\n          this._shaderResources.bindFramebuffer(null);\n          this._gl.viewport(this._viewports[0].x, this._viewports[0].y, this._viewports[0].width, this._viewports[0].height);\n          this._anaglyphShader.vertexBuffer = this._quad.vertexBuffer;\n          this._anaglyphShader.indexBuffer = this._quad.indexBuffer;\n          this._anaglyphShader.texture2D1 = this._anaglyphTextures[0];\n          this._anaglyphShader.texture2D2 = this._anaglyphTextures[1];\n          this._anaglyphShader.prepare();\n          this._anaglyphShader.viewport = this._viewports[0];\n          this._anaglyphShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      });\n    }\n    _renderTransitionBuffer(xrFrame, transitionBuffer) {\n      const currentBuffer = transitionBuffer.currentBuffer;\n      const previousBuffer = transitionBuffer.previousBuffer;\n      const currentPalette = transitionBuffer.currentPalette;\n      const previousPalette = transitionBuffer.previousPalette;\n      const currentAtlas = transitionBuffer.currentAtlas;\n      const previousAtlas = transitionBuffer.previousAtlas;\n      const unitType = transitionBuffer.unitType === void 0 ? currentBuffer.unitType : transitionBuffer.unitType;\n      const id2 = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n      const hoverId = id2 > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id2) : -1;\n      const activeId = transitionBuffer.activeId;\n      if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf || unitType == UnitType.ringSdf)) {\n        this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._blockShader.prepare();\n        this._blockShader.mMatrix = this.mMatrix;\n        this._blockShader.time = this.transitionTime;\n        this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._blockShader.rangeMin = 0;\n        this._blockShader.rangeMax = transitionBuffer.length - 1;\n        this._blockShader.hover = hoverId;\n        this._blockShader.active = activeId;\n        this._blockShader.selectedColor = this._core.config.selectionColor;\n        this._blockShader.hoverColor = this._core.config.hoverColor;\n        this._blockShader.activeColor = this._core.config.activeColor;\n        this._blockShader.highlightMode = this._core.config.highlightMode;\n        this._blockShader.specularPower = this._config.specularPower;\n        this._blockShader.specularIntensity = this._config.specularIntensity;\n        this._blockShader.ambient = this._config.ambient;\n        this._blockShader.apply();\n        this._blockShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._blockShader.directionToLight = this._directionToLight;\n            this._blockShader.halfAngle = this._halfAngle;\n          } else {\n            this._blockShader.directionToLight = this._config.directionToLight;\n            this._blockShader.halfAngle = this._config.halfAngle;\n          }\n          this._blockShader.vMatrix = vMatrix;\n          this._blockShader.pMatrix = this.pMatrices[viewport];\n          this._blockShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._blockShader.isPickShader = true;\n          this._blockShader.pMatrix = this.pickPMatrix;\n          this._blockShader.vMatrix = this.pickVMatrix;\n          this._blockShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf || unitType == UnitType.disk)) {\n        this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sphereShader.prepare();\n        this._sphereShader.mMatrix = this.mMatrix;\n        this._sphereShader.time = this.transitionTime;\n        this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sphereShader.rangeMin = 0;\n        this._sphereShader.rangeMax = transitionBuffer.length - 1;\n        this._sphereShader.hover = hoverId;\n        this._sphereShader.active = activeId;\n        this._sphereShader.selectedColor = this._core.config.selectionColor;\n        this._sphereShader.hoverColor = this._core.config.hoverColor;\n        this._sphereShader.activeColor = this._core.config.activeColor;\n        this._sphereShader.highlightMode = this._core.config.highlightMode;\n        this._sphereShader.specularPower = this._config.specularPower;\n        this._sphereShader.specularIntensity = this._config.specularIntensity;\n        this._sphereShader.ambient = this._config.ambient;\n        this._sphereShader.apply();\n        this._sphereShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._sphereShader.directionToLight = this._directionToLight;\n            this._sphereShader.halfAngle = this._halfAngle;\n          } else {\n            this._sphereShader.directionToLight = this._config.directionToLight;\n            this._sphereShader.halfAngle = this._config.halfAngle;\n          }\n          this._sphereShader.vMatrix = vMatrix;\n          this._sphereShader.pMatrix = this.pMatrices[viewport];\n          this._sphereShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._sphereShader.isPickShader = true;\n          this._sphereShader.pMatrix = this.pickPMatrix;\n          this._sphereShader.vMatrix = this.pickVMatrix;\n          this._sphereShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n        this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._cylinderShader.prepare();\n        this._cylinderShader.mMatrix = this.mMatrix;\n        this._cylinderShader.time = this.transitionTime;\n        this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._cylinderShader.rangeMin = 0;\n        this._cylinderShader.rangeMax = transitionBuffer.length - 1;\n        this._cylinderShader.hover = hoverId;\n        this._cylinderShader.active = activeId;\n        this._cylinderShader.selectedColor = this._core.config.selectionColor;\n        this._cylinderShader.hoverColor = this._core.config.hoverColor;\n        this._cylinderShader.activeColor = this._core.config.activeColor;\n        this._cylinderShader.highlightMode = this._core.config.highlightMode;\n        this._cylinderShader.specularPower = this._config.specularPower;\n        this._cylinderShader.specularIntensity = this._config.specularIntensity;\n        this._cylinderShader.ambient = this._config.ambient;\n        this._cylinderShader.apply();\n        this._cylinderShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._cylinderShader.directionToLight = this._directionToLight;\n            this._cylinderShader.halfAngle = this._halfAngle;\n          } else {\n            this._cylinderShader.directionToLight = this._config.directionToLight;\n            this._cylinderShader.halfAngle = this._config.halfAngle;\n          }\n          this._cylinderShader.vMatrix = vMatrix;\n          this._cylinderShader.pMatrix = this.pMatrices[viewport];\n          this._cylinderShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._cylinderShader.isPickShader = true;\n          this._cylinderShader.pMatrix = this.pickPMatrix;\n          this._cylinderShader.vMatrix = this.pickVMatrix;\n          this._cylinderShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._hexPrismShader.isInitialized && (unitType == UnitType.hexPrism || unitType == UnitType.hexPrismSdf)) {\n        this._hexPrismShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._hexPrismShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._hexPrismShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._hexPrismShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._hexPrismShader.prepare();\n        this._hexPrismShader.mMatrix = this.mMatrix;\n        this._hexPrismShader.time = this.transitionTime;\n        this._hexPrismShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._hexPrismShader.rangeMin = 0;\n        this._hexPrismShader.rangeMax = transitionBuffer.length - 1;\n        this._hexPrismShader.hover = hoverId;\n        this._hexPrismShader.active = activeId;\n        this._hexPrismShader.selectedColor = this._core.config.selectionColor;\n        this._hexPrismShader.hoverColor = this._core.config.hoverColor;\n        this._hexPrismShader.activeColor = this._core.config.activeColor;\n        this._hexPrismShader.highlightMode = this._core.config.highlightMode;\n        this._hexPrismShader.specularPower = this._config.specularPower;\n        this._hexPrismShader.specularIntensity = this._config.specularIntensity;\n        this._hexPrismShader.ambient = this._config.ambient;\n        this._hexPrismShader.apply();\n        this._hexPrismShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._hexPrismShader.directionToLight = this._directionToLight;\n            this._hexPrismShader.halfAngle = this._halfAngle;\n          } else {\n            this._hexPrismShader.directionToLight = this._config.directionToLight;\n            this._hexPrismShader.halfAngle = this._config.halfAngle;\n          }\n          this._hexPrismShader.vMatrix = vMatrix;\n          this._hexPrismShader.pMatrix = this.pMatrices[viewport];\n          this._hexPrismShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._hexPrismShader.isPickShader = true;\n          this._hexPrismShader.pMatrix = this.pickPMatrix;\n          this._hexPrismShader.vMatrix = this.pickVMatrix;\n          this._hexPrismShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._hexPrismShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n        this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n        this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n        this._sdfShader.prepare();\n        this._sdfShader.mMatrix = this.mMatrix;\n        this._sdfShader.time = this.transitionTime;\n        this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sdfShader.rangeMin = 0;\n        this._sdfShader.rangeMax = transitionBuffer.length - 1;\n        this._sdfShader.hover = hoverId;\n        this._sdfShader.active = activeId;\n        this._sdfShader.selectedColor = this._core.config.selectionColor;\n        this._sdfShader.hoverColor = this._core.config.hoverColor;\n        this._sdfShader.activeColor = this._core.config.activeColor;\n        this._sdfShader.highlightMode = this._core.config.highlightMode;\n        this._sdfShader.sdfBuffer = (this.sdfBuffer || this._core.config.sdfBuffer) / 255;\n        this._sdfShader.sdfBackgroundColor = this.sdfBackgroundColor || fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n        this._sdfShader.specularPower = this._config.specularPower;\n        this._sdfShader.specularIntensity = this._config.specularIntensity;\n        this._sdfShader.ambient = this._config.ambient;\n        this._sdfShader.apply();\n        this._sdfShader.isPickShader = false;\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._shaderResources.bindFramebuffer(this._framebuffers[viewport]);\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          const vMatrix = this.vMatrices[viewport];\n          if (xrFrame) {\n            set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n            subtract(this._directionToLight, this._config.lightPosition, this._modelPosition);\n            normalize$2(this._directionToLight, this._directionToLight);\n            const inverseVMatrix = this.inverseVMatrices[viewport];\n            set$3(this._cameraPosition, inverseVMatrix[12], inverseVMatrix[13], inverseVMatrix[14]);\n            subtract(this._directionToCamera, this._cameraPosition, this._modelPosition);\n            normalize$2(this._directionToCamera, this._directionToCamera);\n            add(this._halfAngle, this._directionToLight, this._directionToCamera);\n            normalize$2(this._halfAngle, this._halfAngle);\n            fromMat4(this._mat3, vMatrix);\n            transformMat3(this._directionToLight, this._directionToLight, this._mat3);\n            transformMat3(this._halfAngle, this._halfAngle, this._mat3);\n            this._sdfShader.directionToLight = this._directionToLight;\n            this._sdfShader.halfAngle = this._halfAngle;\n          } else {\n            this._sdfShader.directionToLight = this._config.directionToLight;\n            this._sdfShader.halfAngle = this._config.halfAngle;\n          }\n          this._sdfShader.vMatrix = vMatrix;\n          this._sdfShader.pMatrix = this.pMatrices[viewport];\n          this._sdfShader.applyView();\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this.isPickingEnabled && transitionBuffer.isPickingEnabled) {\n          this._sdfShader.isPickShader = true;\n          this._sdfShader.pMatrix = this.pickPMatrix;\n          this._sdfShader.vMatrix = this.pickVMatrix;\n          this._sdfShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._shaderResources.ANGLE_instanced_arrays.drawElementsInstancedANGLE(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      }\n    }\n  };\n  class Quad {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const _vec3 = fromValues$3(2, 2, 2);\n      const _mat4 = create$4();\n      fromScaling(_mat4, _vec3);\n      const vertices = Quad$2.positions(_mat4);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$2.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  }\n  class Atlas extends AtlasBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, new Uint8Array([255, 255, 255, 255]));\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._imageData) {\n        this._texture = TextureHelper.fromImage(this._gl, this._imageData, false, this._gl.LINEAR);\n      } else {\n        this._texture = null;\n      }\n    }\n  }\n  class Palette extends PaletteBase {\n    get texture() {\n      return this._texture;\n    }\n    get defaultTexture() {\n      return this._defaultTexture;\n    }\n    initializeContext(core, gl) {\n      this._gl = gl;\n      this._defaultTexture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, gl.NEAREST, core.config.paletteColor);\n      this._updateTexture();\n    }\n    update() {\n      super.update();\n      if (this._changed) {\n        this._changed = false;\n        this._updateTexture();\n      }\n    }\n    _updateTexture() {\n      if (this._colors) {\n        const colors2 = new Uint8Array(this._colors);\n        for (let i = 0; i < colors2.length; i++) {\n          colors2[i] = Math.pow(colors2[i] / 255, 2.2) * 255;\n        }\n        this._texture = TextureHelper.create(this._gl, this._colors.length / 4, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.NEAREST, colors2);\n      } else {\n        this._texture = null;\n      }\n    }\n  }\n  let Buffer$1 = class Buffer extends BufferBase {\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    constructor(core, ids) {\n      super(core, ids);\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._vertices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update() {\n      if (this._isInitialized) {\n        const start = window.performance.now();\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._vertices);\n        this._core.log.write(LogLevel.info, `buffer updated ${this._length} ${Math.round(window.performance.now() - start)}ms`);\n      }\n    }\n  };\n  class TransitionBuffer extends TransitionBufferBase {\n    constructor(core, ids) {\n      super(core, ids, Buffer$1, Palette, Atlas);\n    }\n    initializeContext(gl) {\n      this._buffer1.initializeContext(gl);\n      this._buffer2.initializeContext(gl);\n      this._palette1.initializeContext(this._core, gl);\n      this._palette2.initializeContext(this._core, gl);\n      this._atlas1.initializeContext(this._core, gl);\n      this._atlas2.initializeContext(this._core, gl);\n      this._isInitialized = true;\n    }\n  }\n  class Config extends RendererConfig {\n    get keyLightAltitude() {\n      return this._keyLightAltitude;\n    }\n    set keyLightAltitude(value2) {\n      this._keyLightAltitude = value2;\n      this._updateLights();\n    }\n    get keyLightAzimuth() {\n      return this._keyLightAzimuth;\n    }\n    set keyLightAzimuth(value2) {\n      this._keyLightAzimuth = value2;\n      this._updateLights();\n    }\n    get keyLightDistance() {\n      return this._keyLightDistance;\n    }\n    set keyLightDistance(value2) {\n      this._keyLightDistance = value2;\n      this._updateLights();\n    }\n    get fillLight1Altitude() {\n      return this._fillLight1Altitude;\n    }\n    set fillLight1Altitude(value2) {\n      this._fillLight1Altitude = value2;\n      this._updateLights();\n    }\n    get fillLight1Azimuth() {\n      return this._fillLight1Azimuth;\n    }\n    set fillLight1Azimuth(value2) {\n      this._fillLight1Azimuth = value2;\n      this._updateLights();\n    }\n    get fillLight2Altitude() {\n      return this._fillLight2Altitude;\n    }\n    set fillLight2Altitude(value2) {\n      this._fillLight2Altitude = value2;\n      this._updateLights();\n    }\n    get fillLight2Azimuth() {\n      return this._fillLight2Azimuth;\n    }\n    set fillLight2Azimuth(value2) {\n      this._fillLight2Azimuth = value2;\n      this._updateLights();\n    }\n    constructor() {\n      super();\n      this._rotation = create$1();\n      this.keyLightPosition = create$3();\n      this.fillLight1Position = create$3();\n      this.fillLight2Position = create$3();\n      this.reset();\n    }\n    _updateLights() {\n      this._updateLight(this._keyLightAltitude, this._keyLightAzimuth, this._keyLightDistance, this.keyLightPosition);\n      this._updateLight(this._fillLight1Altitude, this._fillLight1Azimuth, 1, this.fillLight1Position);\n      this._updateLight(this._fillLight2Altitude, this._fillLight2Azimuth, 1, this.fillLight2Position);\n    }\n    _updateLight(altitude, azimuth, distance2, position2) {\n      rotateY(this._rotation, Constants.QUAT_IDENTITY, AngleHelper.degreesToRadians(azimuth));\n      rotateX(this._rotation, this._rotation, AngleHelper.degreesToRadians(-altitude));\n      transformQuat(position2, Constants.VECTOR3_UNITZ, this._rotation);\n      scale(position2, position2, distance2);\n    }\n    reset() {\n      this.isSsaoEnabled = true;\n      this.ssaoWidth = 1024;\n      this.ssaoHeight = 1024;\n      this.ssaoBlurEnabled = true;\n      this.ssaoKernelSize = 8;\n      this.ssaoNoiseSize = 4;\n      this.ssaoRadius = 0.02;\n      this.ssaoPower = 1;\n      this.isShadowEnabled = true;\n      this.shadowWidth = 1024;\n      this.shadowHeight = 1024;\n      this.isDofEnabled = false;\n      this.dofAutoFocus = true;\n      this.dofFocusDistance = 0.5;\n      this.dofFocusRange = 0.5;\n      this.dofMaxBackgroundBlur = 0.75;\n      this.isBloomEnabled = false;\n      this.bloomIntensity = 2;\n      this.specularIntensity = 0.15;\n      this.specularPower = 150;\n      this.ambientIntensity = 0.1;\n      this.materialIntensity = 0.5;\n      this.keyLightIntensity = 1.5;\n      this.fillLight1Intensity = 0.25;\n      this.fillLight2Intensity = 0.25;\n      this._keyLightAltitude = 30;\n      this._keyLightAzimuth = -45;\n      this._keyLightDistance = 1;\n      this._fillLight1Altitude = 30;\n      this._fillLight1Azimuth = 45;\n      this._fillLight2Altitude = 30;\n      this._fillLight2Azimuth = -135;\n      this._updateLights();\n      this.isFxaaEnabled = false;\n    }\n  }\n  class Resources {\n    bindFramebuffer(framebuffer) {\n      if (this.framebuffer != framebuffer) {\n        this.framebuffer = framebuffer;\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\n      }\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this.framebuffer = this._gl.createFramebuffer();\n      this.OES_texture_float = gl.getExtension(\"OES_texture_float\");\n      this.OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n      this.WEBGL_lose_context = gl.getExtension(\"WEBGL_lose_context\");\n    }\n  }\n  Resources.glsl = {\n    \"background.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\ngl_FragDepth = 0.99999;\\nmyPosition = vec4(0.0, 0.0, -FAR_PLANE, 0.0);\\nmyColor = vec4(uColor, 1.0);\\nmyNormal = vec4(0.0, 0.0, 1.0, 0.0);\\n}\\n',\n    \"box.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform sampler2D uSampler;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nfloat result = 0.0;\\nfor (int x = -2; x < 2; x++)\\n{\\nfor (int y = -2; y < 2; y++)\\n{\\nvec2 offset = vec2(float(x) + 0.5, float(y) + 0.5) * texelSize;\\nresult += texture(uSampler, texCoords + offset).r;\\n}\\n}\\nresult /= 16.0;\\nmyOutputColor = vec4(vec3(result), 1.0);\\n}\\n\",\n    \"bright.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec4 color = texture(uSampler, texCoords);\\nmyOutputColor = vec4(color.rgb * color.a, 1.0);\\n}\\n\",\n    \"combine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform float uIntensity;\\nout vec4 myOutputColor;\\nvoid main() {\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 bloom =\\ntexture(uSampler2, texCoords).rgb +\\ntexture(uSampler3, texCoords).rgb +\\ntexture(uSampler4, texCoords).rgb +\\ntexture(uSampler5, texCoords).rgb;\\nbloom *= uIntensity;\\nvec3 color = texture(uSampler1, texCoords).rgb;\\ncolor += bloom;\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"deferred.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform mat4 uInverseVMatrix;\\nuniform mat4 uShadowVMatrix;\\nuniform mat4 uShadowPMatrix;\\nuniform bool uShadow;\\nuniform bool uSsao;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform sampler2D uSampler4;\\nuniform sampler2D uSampler5;\\nuniform vec4 uViewport;\\nuniform vec3 uKeyLightHalfAngle;\\nuniform vec3 uDirectionToKeyLight;\\nuniform vec3 uDirectionToFillLight1;\\nuniform vec3 uDirectionToFillLight2;\\nuniform vec2 uShadowMapSize;\\nuniform float uKeyLightIntensity;\\nuniform float uFillLight1Intensity;\\nuniform float uFillLight2Intensity;\\nuniform float uSpecularPower;\\nuniform float uSpecularIntensity;\\nuniform float uAmbientIntensity;\\nuniform float uMaterialIntensity;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec4 position = texture(uSampler1, texCoords);\\nvec4 color = texture(uSampler2, texCoords);\\nvec4 normal = texture(uSampler3, texCoords);\\nfloat shadow;\\nif (uShadow)\\n{\\nvec4 positionWorld = uInverseVMatrix * vec4(position.xyz, 1.0);\\nvec4 positionShadowView = uShadowVMatrix * positionWorld;\\nvec4 positionShadowViewProjection = uShadowPMatrix * positionShadowView;\\nvec3 projCoords = positionShadowViewProjection.xyz / positionShadowViewProjection.w;\\nprojCoords = projCoords * 0.5 + 0.5;\\nfloat minProjCoords = min(projCoords.x, projCoords.y);\\nfloat maxProjCoords = max(projCoords.x, projCoords.y);\\nif (minProjCoords < 0.0 || maxProjCoords > 1.0)\\n{\\nshadow = 1.0;\\n}\\nelse\\n{\\nfloat currentDepth = projCoords.z;\\nfloat bias = 0.0;\\nvec2 texelSize = 1.0 / uShadowMapSize;\\nfor(int x = -1; x <= 1; ++x)\\n{\\nfor(int y = -1; y <= 1; ++y)\\n{\\nfloat pcfDepth = texture(uSampler5, projCoords.xy + vec2(x, y) * texelSize).r;\\nshadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;\\n}\\n}\\nshadow /= 9.0;\\nshadow = clamp(1.0 - shadow, 0.0, 1.0);\\n}\\n}\\nelse\\n{\\nshadow = 1.0;\\n}\\nfloat ssao = uSsao ? texture(uSampler4, texCoords).r : 1.0;\\nfloat diffuseIntensity = clamp(dot(normal.rgb, uDirectionToKeyLight), 0.0, 1.0) * uKeyLightIntensity * shadow;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight1), 0.0, 1.0) * uFillLight1Intensity * ssao;\\ndiffuseIntensity += clamp(dot(normal.rgb, uDirectionToFillLight2), 0.0, 1.0) * uFillLight2Intensity * ssao;\\nvec3 diffuse = color.rgb * diffuseIntensity * uMaterialIntensity;\\nvec3 ambient = uAmbientIntensity * color.rgb * ssao;\\nvec3 emissive = color.w * color.rgb;\\nfloat specular = normal.w * clamp(pow(clamp(dot(normal.rgb, uKeyLightHalfAngle), 0.0, 1.0), uSpecularPower) * uSpecularIntensity * uKeyLightIntensity * shadow, 0.0, 1.0);\\nvec3 result = min(ambient + diffuse + specular + emissive, 1.0);\\nresult = pow(result, GAMMA);\\nmyOutputColor = vec4(result, position.w);\\n}\\n',\n    \"dofblur.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uNearFocusDepth;\\nuniform float uFarFocusDepth;\\nuniform float uMaxBackgroundBlur;\\nout vec4 myOutputColor;\\nfloat circleOfConfusion(in float depth )\\n{\\nfloat f;\\nif (depth < uFocusDepth)\\n{\\nf = (depth - uFocusDepth) / (uFocusDepth - uNearFocusDepth);\\nf = clamp(f, -1.0, 0.0);\\n}\\nelse\\n{\\nf = (depth - uFocusDepth) / (uFarFocusDepth - uFocusDepth);\\nf = clamp(f, 0.0, uMaxBackgroundBlur);\\n}\\nreturn f * 0.5 + 0.5;\\n}\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nvec4 color = texture(uSampler1, texCoords);\\nfloat depth = -texture(uSampler2, texCoords).z;\\nfloat coc = circleOfConfusion(depth);\\nmyOutputColor = vec4(coc);\\n}\\n\",\n    \"dofcombine.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform vec4 uViewport;\\nuniform float uFocusDepth;\\nuniform float uAperture;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nout vec4 myOutputColor;\\nconst float MAX_CIRCLE_OF_CONFUSION = 3.0;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec2 texelSizeLow = texelSize * 4.0;\\nconst int NUM_TAPS = 13;\\nvec2 samples[NUM_TAPS];\\nsamples[0] = vec2(-0.326212,-0.405810);\\nsamples[1] = vec2(-0.840144,-0.073580);\\nsamples[2] = vec2(-0.695914, 0.457137);\\nsamples[3] = vec2(-0.203345, 0.620716);\\nsamples[4] = vec2( 0.962340,-0.194983);\\nsamples[5] = vec2( 0.473434,-0.480026);\\nsamples[6] = vec2( 0.519456, 0.767022);\\nsamples[7] = vec2( 0.185461,-0.893124);\\nsamples[8] = vec2( 0.507431, 0.064425);\\nsamples[9] = vec2( 0.896420, 0.412458);\\nsamples[10] = vec2(-0.321940,-0.932615);\\nsamples[11] = vec2(-0.791559,-0.597710);\\nsamples[12] = vec2( 0.000000, 0.000000);\\nconst float maxCoC = 5.0;\\nconst float radiusScale = 0.5;\\nvec4 cOut = texture(uSampler1, texCoords);\\nfloat coc = texture(uSampler2, texCoords).r;\\nfloat centerDepth = coc;\\nfloat discRadius = abs(coc * 2.0 - 1.0) * maxCoC;\\nfloat discRadiusLow = discRadius * radiusScale;\\ncOut = vec4(0.0);\\nfloat acc = 0.0;\\nfor (int t = 0; t < NUM_TAPS; t++)\\n{\\nvec2 coordLow = texCoords + (texelSizeLow * samples[t] * discRadiusLow);\\nvec2 coordHigh = texCoords + (texelSize * samples[t] * discRadius);\\nvec4 tapLow = texture(uSampler1, coordLow);\\nvec4 tapHigh = texture(uSampler1, coordHigh);\\nfloat cocLow = texture(uSampler2, coordLow).r;\\nfloat cocHigh = texture(uSampler2, coordHigh).r;\\nfloat tapBlur = abs(cocHigh * 2.0 - 1.0);\\nvec4 tap = mix(tapHigh, tapLow, tapBlur);\\nfloat cocBlur = mix(cocHigh, cocLow, tapBlur);\\ncocBlur = (cocBlur >= centerDepth) ? 1.0 : abs(cocBlur * 2.0 - 1.0);\\ncOut += tap * cocBlur;\\nacc += cocBlur;\\n}\\nvec4 result = cOut / acc;\\nmyOutputColor = result;\\n}\\n\",\n    \"downsample.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uViewport.zw;\\nmyOutputColor = texture(uSampler, texCoords);\\n}\\n\",\n    \"fxaa.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nconst float FXAA_SPAN_MAX = 8.0;\\nconst float FXAA_REDUCE_MUL = 1.0 / 8.0;\\nconst float FXAA_REDUCE_MIN = 1.0 / 128.0;\\nuniform sampler2D uSampler;\\nuniform vec4 uViewport;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec2 texelSize = vec2(1.0) / uViewport.zw;\\nvec3 color = texture(uSampler, texCoords).rgb;\\nvec3 colorNW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorNE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y - texelSize.y)).rgb;\\nvec3 colorSW = texture(uSampler, vec2(texCoords.x - texelSize.x, texCoords.y + texelSize.y)).rgb;\\nvec3 colorSE = texture(uSampler, vec2(texCoords.x + texelSize.x, texCoords.y + texelSize.y)).rgb;\\nfloat luminance = dot(color, LUMINANCE);\\nfloat luminanceNW = dot(colorNW, LUMINANCE);\\nfloat luminanceNE = dot(colorNE, LUMINANCE);\\nfloat luminanceSW = dot(colorSW, LUMINANCE);\\nfloat luminanceSE = dot(colorSE, LUMINANCE);\\nfloat luminanceMin = min(luminance, min(min(luminanceNW, luminanceNE), min(luminanceSW, luminanceSE)));\\nfloat luminanceMax = max(luminance, max(max(luminanceNW, luminanceNE), max(luminanceSW, luminanceSE)));\\nvec2 dir = vec2(luminanceSW + luminanceSE - luminanceNW - luminanceNE, luminanceNW + luminanceSW - luminanceNE - luminanceSE);\\nfloat dirReduce = max((luminanceNW + luminanceNE + luminanceSW + luminanceSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\\nfloat rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\\ndir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * texelSize;\\nvec3 colorA = 0.5 * (\\ntexture(uSampler, texCoords.xy + dir * (1.0/3.0 - 0.5)).rgb +\\ntexture(uSampler, texCoords.xy + dir * (2.0/3.0 - 0.5)).rgb);\\nvec3 colorB = colorA * 0.5 + 0.25 * (\\ntexture(uSampler, texCoords.xy - dir * 0.5).rgb +\\ntexture(uSampler, texCoords.xy + dir * 0.5).rgb);\\nluminance = dot(colorB, LUMINANCE);\\nif (luminance < luminanceMin || luminance > luminanceMax)\\n{\\nmyOutputColor = vec4(colorA, 1.0);\\n}\\nelse\\n{\\nmyOutputColor = vec4(colorB, 1.0);\\n}\\n}\\n',\n    \"gaussian.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform vec2 uResolution;\\nuniform bool uHorizontal;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = gl_FragCoord.xy / uResolution;\\nvec2 texelSize = vec2(1.0) / uResolution;\\nconst int NUM_WEIGHTS = 3;\\nfloat weights[NUM_WEIGHTS];\\nweights[0] = 0.2270270270;\\nweights[1] = 0.3162162162;\\nweights[2] = 0.0702702703;\\nfloat offsets[NUM_WEIGHTS];\\noffsets[0] = 0.0;\\noffsets[1] = 1.3846153846;\\noffsets[2] = 3.2307692308;\\nvec3 color = texture(uSampler, texCoords).rgb * weights[0];\\nif (uHorizontal)\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(texelSize.x * offsets[i], 0.0)).rgb * weights[i];\\n}\\n}\\nelse\\n{\\nfor (int i = 1; i < NUM_WEIGHTS; i++) {\\ncolor += texture(uSampler, texCoords + vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\ncolor += texture(uSampler, texCoords - vec2(0.0, texelSize.y * offsets[i])).rgb * weights[i];\\n}\\n}\\nmyOutputColor = vec4(color, 1.0);\\n}\\n\",\n    \"lasso.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform vec3 uColor;\\nuniform vec2 uThickness;\\nuniform float uDashWidth;\\nin mediump vec2 vTexCoord;\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 distance = min(vTexCoord, 1.0 - vTexCoord);\\nif (distance.x > uThickness.x && distance.y > uThickness.y) {\\ndiscard;\\n}\\nvec2 texCoord = vec2(vTexCoord.x, 1.0 - vTexCoord.y);\\nvec2 thickness = uThickness * uDashWidth;\\nvec2 b = mod(floor(texCoord / thickness), 2.0);\\nif (b.x > 0.0 && texCoord.x < 1.0 - thickness.x) {\\ndiscard;\\n}\\nif (b.y > 0.0 && texCoord.y < 1.0 - thickness.y) {\\ndiscard;\\n}\\nmyOutputColor = vec4(pow(uColor, GAMMA), 1.0);\\n}\\n',\n    \"lasso.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nout mediump vec2 vTexCoord;\\nvoid main(void) {\\ngl_Position = uMMatrix * vec4(aPosition, 1.0);\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"pickgrid.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform bool uPick;\\nuniform vec2 uFaceSize;\\nuniform vec3 uMajorColor;\\nuniform vec3 uMinorColor;\\nuniform vec3 uZeroColor;\\nuniform float uMajorThickness;\\nuniform float uMinorThickness;\\nuniform float uZeroThickness;\\nuniform vec2 uZero;\\nuniform vec2 uMinorGridlines;\\nin lowp vec4 vColor;\\nin mediump vec2 vTexCoord;\\nin mediump vec4 vBounds;\\nin mediump vec3 vNormal;\\nin vec3 vViewPosition;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void) {\\nif (uPick)\\n{\\nmyPosition = vColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec2 buffer = fwidth(vTexCoord);\\nvec2 distance, thickness, step;\\nvec4 color = vColor;\\nvec2 width = vBounds.zw - vBounds.xy;\\ndistance = (vTexCoord - vBounds.xy) / width;\\ndistance = min(abs(distance - floor(uMinorGridlines * distance) / uMinorGridlines), abs(distance - ceil(uMinorGridlines * distance) / uMinorGridlines));\\ndistance *= width;\\nthickness = vec2(uMinorThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMinorColor, color.xyz, min(step.x, step.y));\\nthickness = vec2(uMajorThickness) / uFaceSize;\\ndistance = min(vTexCoord - vBounds.xy, vBounds.zw - vTexCoord);\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uMajorColor, color.xyz, min(step.x, step.y));\\ndistance = abs(vTexCoord - uZero);\\nthickness = vec2(uZeroThickness) / uFaceSize;\\nstep = smoothstep(thickness, thickness + buffer, distance);\\ncolor.xyz = mix(uZeroColor, color.xyz, min(step.x, step.y));\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\nmyColor.xyz = color.xyz;\\n}\\n}\\n',\n    \"pickgrid.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin lowp vec4 aIdColor;\\nin mediump vec2 aTexCoord;\\nin mediump vec3 aNormal;\\nin mediump vec4 aBounds;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform bool uPick;\\nuniform vec4 uPickedIdColor;\\nuniform vec3 uBackground;\\nuniform vec3 uHighlight;\\nout lowp vec4 vColor;\\nout mediump vec2 vTexCoord;\\nout mediump vec4 vBounds;\\nout mediump vec3 vNormal;\\nout vec3 vViewPosition;\\nvoid main(void) {\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize(vec3(mvMatrix * vec4(aNormal, 0.0)));\\nvTexCoord = aTexCoord;\\nvBounds = aBounds;\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nif (uPick)\\n{\\nvColor = aIdColor;\\n}\\nelse\\n{\\nvColor = uPickedIdColor == aIdColor ? vec4(uHighlight, 1.0) : vColor = vec4(uBackground, 1.0);\\n}\\n}\\n\",\n    \"sdftext.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nuniform sampler2D uSampler;\\nuniform bool uPick;\\nuniform vec3 uColor;\\nuniform vec3 uHoverColor;\\nuniform float uGamma;\\nuniform vec3 uBorderColor;\\nuniform float uBuffer;\\nuniform float uBorderWidth;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nin lowp vec4 vIdColor;\\nin lowp float vHover;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick) {\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nfloat distance = texture(uSampler, vTexCoord).r;\\nif (distance < uBuffer - uBorderWidth)\\n{\\ndiscard;\\n}\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, mix(uColor, uHoverColor, vHover), value);\\nmyPosition.xyz = vViewPosition;\\nmyNormal.xyz = vNormal;\\nmyColor.w = 1.0;\\nmyPosition.w = 0.0;\\nmyNormal.w = 0.0;\\n}\\n}\\n\",\n    \"sdftext.vertex.fx\": \"#version 300 es\\nin lowp vec4 aIdColor;\\nin vec3 aPosition;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform vec4 uPickedIdColor;\\nout vec3 vViewPosition;\\nout vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nout lowp vec4 vIdColor;\\nout lowp float vHover;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = vec3(mvMatrix * vec4(0.0, 0.0, 1.0, 0.0));\\nvec4 viewPosition = mvMatrix* vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\nvIdColor = aIdColor;\\nvHover = uPickedIdColor == aIdColor ? 1.0 : 0.0;\\n}\\n\",\n    \"simple.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nvoid main(void) {\\ngl_Position = vec4(aPosition, 1.0);\\n}\\n\",\n    \"ssao.fragment.fx\": \"#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\nconst int SSAO_KERNEL_SIZE = 8;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uSampler2;\\nuniform sampler2D uSampler3;\\nuniform mat4 uPMatrix;\\nuniform vec4 uViewport;\\nuniform float uSsaoNoiseSize;\\nuniform float uSsaoRadius;\\nuniform float uSsaoPower;\\nuniform vec3 uSsaoKernel[SSAO_KERNEL_SIZE];\\nout vec4 myOutputColor;\\nvoid main(void)\\n{\\nvec2 texCoords = (gl_FragCoord.xy - uViewport.xy) / uViewport.zw;\\nvec3 position = texture(uSampler1, texCoords).rgb;\\nvec3 normal = texture(uSampler2, texCoords).rgb;\\nfloat occlusion = 0.0;\\nvec2 noiseScale = uViewport.zw / uSsaoNoiseSize;\\nvec3 randomVec = texture(uSampler3, texCoords * noiseScale).rgb;\\nvec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));\\nvec3 bitangent = cross(normal, tangent);\\nmat3 tbn = mat3(tangent, bitangent, normal);\\nfor(int i = 0; i < SSAO_KERNEL_SIZE; i++)\\n{\\nvec3 mySample = tbn * uSsaoKernel[i];\\nmySample = position + mySample * uSsaoRadius;\\nvec4 offset = vec4(mySample, 1.0);\\noffset = uPMatrix * offset;\\noffset.xy /= offset.w;\\noffset.xy = offset.xy * 0.5 + 0.5;\\nfloat sampleDepth = texture(uSampler1, offset.xy).z;\\nfloat rangeCheck = abs(position.z - sampleDepth) > uSsaoRadius ? 0.0 : 1.0;\\nocclusion += (sampleDepth < mySample.z ? 0.0 : 1.0) * rangeCheck;\\n}\\nocclusion /= float(SSAO_KERNEL_SIZE);\\nocclusion = pow(1.0 - occlusion, uSsaoPower);\\nmyOutputColor = vec4(occlusion, 0.0, 0.0, 1.0);\\n}\\n\",\n    \"texture.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\nuniform sampler2D uSampler;\\nin mediump vec2 vTexCoord;\\nin vec3 vViewPosition;\\nin vec3 vNormal;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nmyPosition.xyz = vViewPosition;\\nmyColor.xyz = pow(texture(uSampler, vTexCoord).xyz, INV_GAMMA);\\nmyColor.w = 0.0;\\nmyNormal.xyz = vNormal;\\nmyNormal.w = 0.0;\\n}\\n',\n    \"texture.vertex.fx\": \"#version 300 es\\nin vec3 aPosition;\\nin mediump vec3 aNormal;\\nin mediump vec2 aTexCoord;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nout vec3 vViewPosition;\\nout mediump vec3 vNormal;\\nout mediump vec2 vTexCoord;\\nvoid main(void)\\n{\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvNormal = normalize((mvMatrix * vec4(aNormal, 0.0)).xyz);\\nvec4 viewPosition = mvMatrix * vec4(aPosition, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvTexCoord = aTexCoord;\\n}\\n\",\n    \"unitblock.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitblock.vertex.fx\": '#version 300 es\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitcylinder.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec4 vCircle1;\\nin vec4 vCircle2;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 tnor = iCappedCone(ro, rd, vCircle1.xyz, vCircle2.xyz, vCircle1.w, vCircle2.w, uShadow ? -1.0 : 1.0);\\nfloat t = tnor.x;\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = tnor.yzw;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitcylinder.vertex.fx\": '#version 300 es\\n#include \"common.include.fx\"\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nuniform vec3 uIdentityRotation;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout vec3 vViewPosition;\\nout vec4 vCircle1;\\nout vec4 vCircle2;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvCircle1 = vec4(0.0);\\nvCircle2 = vec4(0.0);\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec3 viewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition;\\nposition.xz *= max(scale.x, scale.z);\\nposition.y *= scale.y;\\nvec3 direction = IDENTITY_ROTATION;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\ndirection = rotate(direction, quat);\\n}\\nvec3 viewDirection = (mvMatrix * vec4(direction, 0.0)).xyz;\\nvec3 h = viewDirection * scale.y * 0.5;\\nfloat r1 = length(viewDirection) * 0.5;\\nfloat r2 = r1 * scale.z;\\nr1 *= scale.x;\\nvCircle1 = vec4(viewCenter - h, r1);\\nvCircle2 = vec4(viewCenter + h, r2);\\nvec4 viewPosition = mvMatrix * vec4(position + translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\n}\\n}\\n',\n    \"unitsdf.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin mediump vec2 vTexCoord;\\nin mediump vec2 vPreviousTexCoord;\\nin mediump vec3 vModelPosition;\\nin vec3 vViewPosition;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform sampler2D uSampler1;\\nuniform sampler2D uPreviousSampler1;\\nuniform bool uPick;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nfloat uBorderWidth = 0.0 / 255.0;\\nfloat uBuffer = 192.0 / 255.0;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat distance = mix(texture(uPreviousSampler1, vPreviousTexCoord).r, texture(uSampler1, vTexCoord).r, vAnimation);\\nif (distance < uBuffer - uBorderWidth) {\\ndiscard;\\n}\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = vViewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nfloat distanceSquared = (0.75 - dot2(vModelPosition)) * 2.0;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nvec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition)));\\nmyNormal.xyz = normal;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nvec3 uBorderColor = vec3(1.0, 1.0, 1.0);\\nfloat uGamma = 0.0;\\nfloat gamma = fwidth(distance);\\nfloat value = smoothstep(uBuffer - gamma, uBuffer + gamma, distance);\\nmyColor.xyz = mix(uBorderColor, color, value);\\n}\\n}\\n',\n    \"unitsdf.vertex.fx\": '#version 300 es\\n#include \"quat.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin mediump vec4 aRotation;\\nin mediump vec4 aPreviousRotation;\\nin mediump vec4 aTexCoord;\\nin mediump vec4 aPreviousTexCoord;\\nin lowp vec2 aColor;\\nin lowp vec2 aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin vec2 aOrder;\\nin float aId;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump vec3 vModelPosition;\\nout mediump vec2 vTexCoord;\\nout mediump vec2 vPreviousTexCoord;\\nout vec3 vViewPosition;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvModelPosition = vec3(0.0);\\ngl_Position = vec4(0.0);\\nvViewPosition = vec3(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nvModelPosition = aPosition;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nvec3 scale = mix(aPreviousScale, aScale, animation);\\nvec3 position = aPosition * scale;\\nif (aRotation.w * aPreviousRotation.w != 1.0)\\n{\\nvec4 quat = slerp(aPreviousRotation, aRotation, animation);\\nposition = rotate(position, quat);\\n}\\nposition += mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvec4 viewPosition = mvMatrix * vec4(position, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = aPosition.y < 0.0 ? vec2(aColor.x, aPreviousColor.x) : vec2(aColor.y, aPreviousColor.y);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvPreviousTexCoord.x = aPosition.x < 0.0 ? aPreviousTexCoord.x : aPreviousTexCoord.z;\\nvPreviousTexCoord.y = aPosition.y > 0.0 ? aPreviousTexCoord.y : aPreviousTexCoord.w;\\nvTexCoord.x = aPosition.x < 0.0 ? aTexCoord.x : aTexCoord.z;\\nvTexCoord.y = aPosition.y > 0.0 ? aTexCoord.y : aTexCoord.w;\\n}\\n}\\n',\n    \"unitsphere.fragment.fx\": '#version 300 es\\n#ifdef GL_FRAGMENT_PRECISION_HIGH\\nprecision highp float;\\n#else\\nprecision mediump float;\\n#endif\\n#include \"common.include.fx\"\\n#include \"intersect.include.fx\"\\nin lowp vec4 vIdColor;\\nin lowp vec2 vVertexColor;\\nin lowp float vVertexSelected;\\nin float vAnimation;\\nin lowp float vHover;\\nin lowp float vActive;\\nin vec3 vViewPosition;\\nin vec3 vViewCenter;\\nin mediump float vRadius;\\nuniform sampler2D uSampler;\\nuniform sampler2D uPreviousSampler;\\nuniform bool uPick;\\nuniform bool uShadow;\\nlayout(location = 0) out vec4 myPosition;\\nlayout(location = 1) out vec4 myColor;\\nlayout(location = 2) out vec4 myNormal;\\nvoid main(void)\\n{\\nvec3 rd = normalize(vViewPosition);\\nvec3 ro = vec3(0.0);\\nvec4 s = vec4(vViewCenter, vRadius);\\nfloat t = sphIntersect(ro, rd, s, uShadow ? -1.0 : 1.0);\\nif (t < 0.0)\\n{\\ndiscard;\\n}\\nvec3 viewPosition = rd * t;\\nfloat ndcDepth = DEPTH_A + DEPTH_B / viewPosition.z;\\ngl_FragDepth = ndcDepth * 0.5 + 0.5;\\nif (uPick)\\n{\\nmyPosition = vIdColor;\\n}\\nelse\\n{\\nmyPosition.xyz = viewPosition;\\nvec3 previousColor = texture(uPreviousSampler, vec2(vVertexColor.y, 0.0)).xyz;\\nvec3 color = texture(uSampler, vec2(vVertexColor.x, 0.0)).xyz;\\ncolor = mix(previousColor, color, vAnimation);\\nvec3 normal = (viewPosition - vViewCenter) / s.w;\\nmyNormal.xyz = normal;\\nfloat distanceSquared = dot(normal, rd);\\ndistanceSquared *= distanceSquared;\\nfloat emissive = max(vVertexSelected, 0.0);\\nemissive += max(vHover, vActive);\\nemissive *= distanceSquared;\\nmyColor.w = emissive;\\nmyPosition.w = emissive;\\nfloat specular = 1.0;\\nmyNormal.w = specular;\\nmyColor.xyz = color;\\n}\\n}\\n',\n    \"unitsphere.vertex.fx\": '#version 300 es\\n#include \"common.include.fx\"\\nin mediump vec3 aPosition;\\nin vec3 aTranslation;\\nin vec3 aPreviousTranslation;\\nin lowp float aColor;\\nin lowp float aPreviousColor;\\nin vec3 aScale;\\nin vec3 aPreviousScale;\\nin float aId;\\nin vec2 aOrder;\\nin lowp float aSelected;\\nin lowp float aPreviousSelected;\\nin lowp vec4 aIdColor;\\nuniform mat4 uMMatrix;\\nuniform mat4 uVMatrix;\\nuniform mat4 uPMatrix;\\nuniform float uTime;\\nuniform float uDuration;\\nuniform float uOrderFrom;\\nuniform float uOrderTo;\\nuniform float uHover;\\nuniform float uActive;\\nout lowp vec4 vIdColor;\\nout lowp vec2 vVertexColor;\\nout lowp float vVertexSelected;\\nout highp float vAnimation;\\nout lowp float vHover;\\nout lowp float vActive;\\nout mediump float vRadius;\\nout vec3 vViewPosition;\\nout vec3 vViewCenter;\\nvoid main(void)\\n{\\nif (aOrder.x < uOrderFrom || aOrder.x > uOrderTo)\\n{\\nvIdColor = vec4(0.0);\\nvVertexColor = vec2(0.0);\\nvVertexSelected = 0.0;\\nvAnimation = 0.0;\\nvHover = 0.0;\\nvActive = 0.0;\\nvViewPosition = vec3(0.0);\\nvViewCenter = vec3(0.0);\\nvRadius = 0.0;\\ngl_Position = vec4(0.0);\\n}\\nelse\\n{\\nvIdColor = aIdColor;\\nfloat staggerOrder = aOrder.y;\\nfloat startTime = staggerOrder * (1.0 - uDuration);\\nfloat animation = clamp((uTime - startTime) / uDuration, 0.0, 1.0);\\nanimation = smoothstep(0.0, 1.0, animation);\\nfloat scale = mix(min(aPreviousScale.x, min(aPreviousScale.y, aPreviousScale.z)), min(aScale.x, min(aScale.y, aScale.z)), animation);\\nvec3 translation = mix(aPreviousTranslation, aTranslation, animation);\\nmat4 mvMatrix = uVMatrix * uMMatrix;\\nvViewCenter = (mvMatrix * vec4(translation, 1.0)).xyz;\\ntranslation.xyz += aPosition * scale;\\nvec4 viewPosition = mvMatrix * vec4(translation, 1.0);\\nvViewPosition = viewPosition.xyz;\\ngl_Position = uPMatrix * viewPosition;\\nvVertexColor = vec2(aColor, aPreviousColor);\\nvVertexSelected = mix(aPreviousSelected, aSelected, animation);\\nvAnimation = animation;\\nvHover = uHover == aId ? 1.0 : 0.0;\\nvActive = uActive == aId ? 1.0 : 0.0;\\nvRadius = distance(vViewPosition, vViewCenter) / ROOT_THREE;\\n}\\n}\\n',\n    \"common.include.fx\": \"const float NEAR_PLANE = 0.01;\\nconst float FAR_PLANE = 100.0;\\nconst float DEPTH_A = 1.0002000200020003;\\nconst float DEPTH_B = 0.020002000200020003;\\nconst vec3 GAMMA = vec3(0.45454545454545453);\\nconst vec3 INV_GAMMA = vec3(2.2);\\nconst vec3 LUMINANCE = vec3(0.2126, 0.7152, 0.0722);\\nconst float PI = 3.1415926538;\\nconst float ROOT_TWO = 1.4142135624;\\nconst float ROOT_TWO_OVER_TWO = 0.7071067811865476;\\nconst float ROOT_THREE = 1.7320508075688772;\\nconst float ROOT_THREE_OVER_TWO = 0.8660254037844386;\\nconst vec3 IDENTITY_ROTATION = vec3(0.0, 1.0, 0.0);\\nfloat dot2(in vec2 v) { return dot(v, v); }\\nfloat dot2(in vec3 v) { return dot(v, v); }\\n\",\n    \"intersect.include.fx\": \"float sphIntersect( in vec3 ro, in vec3 rd, in vec4 sph, in float shadow)\\n{\\nvec3 oc = ro - sph.xyz;\\nfloat b = dot( oc, rd );\\nfloat c = dot( oc, oc ) - sph.w*sph.w;\\nfloat h = b*b - c;\\nif( h<0.0 ) return -1.0;\\nreturn -b - shadow * sqrt( h );\\n}\\nfloat roundedboxIntersect( in vec3 ro, in vec3 rd, in vec3 size, in float rad )\\n{\\nvec3 m = 1.0/rd;\\nvec3 n = m*ro;\\nvec3 k = abs(m)*(size+rad);\\nvec3 t1 = -n - k;\\nvec3 t2 = -n + k;\\nfloat tN = max( max( t1.x, t1.y ), t1.z );\\nfloat tF = min( min( t2.x, t2.y ), t2.z );\\nif( tN > tF || tF < 0.0) return -1.0;\\nfloat t = tN;\\nvec3 pos = ro+t*rd;\\nvec3 s = sign(pos);\\nro *= s;\\nrd *= s;\\npos *= s;\\npos -= size;\\npos = max( pos.xyz, pos.yzx );\\nif( min(min(pos.x,pos.y),pos.z)<0.0 ) return t;\\nvec3 oc = ro - size;\\nvec3 dd = rd*rd;\\nvec3 oo = oc*oc;\\nvec3 od = oc*rd;\\nfloat ra2 = rad*rad;\\nt = 1e20;\\n{\\nfloat b = od.x + od.y + od.z;\\nfloat c = oo.x + oo.y + oo.z - ra2;\\nfloat h = b*b - c;\\nif( h>0.0 ) t = -b-sqrt(h);\\n}\\n{\\nfloat a = dd.y + dd.z;\\nfloat b = od.y + od.z;\\nfloat c = oo.y + oo.z - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.x+rd.x*h)<size.x ) t = h;\\n}\\n}\\n{\\nfloat a = dd.z + dd.x;\\nfloat b = od.z + od.x;\\nfloat c = oo.z + oo.x - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.y+rd.y*h)<size.y ) t = h;\\n}\\n}\\n{\\nfloat a = dd.x + dd.y;\\nfloat b = od.x + od.y;\\nfloat c = oo.x + oo.y - ra2;\\nfloat h = b*b - a*c;\\nif( h>0.0 )\\n{\\nh = (-b-sqrt(h))/a;\\nif( h>0.0 && h<t && abs(ro.z+rd.z*h)<size.z ) t = h;\\n}\\n}\\nif( t>1e19 ) t=-1.0;\\nreturn t;\\n}\\nvec3 roundedboxNormal( in vec3 pos, in vec3 siz, in float rad )\\n{\\nreturn sign(pos)*normalize(max(abs(pos)-siz,0.0));\\n}\\nvec4 iCappedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(oa, ba);\\nfloat m2 = dot(ob, ba);\\nfloat m3 = dot(rd, ba);\\nif (m1 < 0.0) { if (dot2(oa * m3 - rd * m1) < (ra * ra * m3 * m3)) return vec4(-m1 / m3, -ba * inversesqrt(m0)); }\\nelse if (m2 > 0.0) { if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) return vec4(-m2 / m3, ba * inversesqrt(m0)); }\\nfloat m4 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat rr = ra - rb;\\nfloat hy = m0 + rr * rr;\\nfloat k2 = m0 * m0 - m3 * m3 * hy;\\nfloat k1 = m0 * m0 * m4 - m1 * m3 * hy + m0 * ra * (rr * m3 * 1.0);\\nfloat k0 = m0 * m0 * m5 - m1 * m1 * hy + m0 * ra * (rr * m1 * 2.0 - m0 * ra);\\nfloat h = k1 * k1 - k2 * k0;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-k1 - shadow * sqrt(h)) / k2;\\nfloat y = m1 + t * m3;\\nif (y > 0.0 && y < m0)\\n{\\nreturn vec4(t, normalize(m0 * (m0 * (oa + t * rd) + rr * ba * ra) - ba * hy * y));\\n}\\nreturn vec4(-1.0);\\n}\\nvec4 iRoundedCone(in vec3 ro, in vec3 rd,\\nin vec3 pa, in vec3 pb,\\nin float ra, in float rb, in float shadow)\\n{\\nvec3 ba = pb - pa;\\nvec3 oa = ro - pa;\\nvec3 ob = ro - pb;\\nfloat rr = ra - rb;\\nfloat m0 = dot(ba, ba);\\nfloat m1 = dot(ba, oa);\\nfloat m2 = dot(ba, rd);\\nfloat m3 = dot(rd, oa);\\nfloat m5 = dot(oa, oa);\\nfloat m6 = dot(ob, rd);\\nfloat m7 = dot(ob, ob);\\nfloat d2 = m0 - rr * rr;\\nfloat k2 = d2 - m2 * m2;\\nfloat k1 = d2 * m3 - m1 * m2 + m2 * rr * ra;\\nfloat k0 = d2 * m5 - m1 * m1 + m1 * rr * ra * 2.0 - m0 * ra * ra;\\nfloat h = k1 * k1 - k0 * k2;\\nif (h < 0.0) return vec4(-1.0);\\nfloat t = (-shadow * sqrt(h) - k1) / k2;\\nfloat y = m1 - ra * rr + t * m2;\\nif (y > 0.0 && y < d2)\\n{\\nreturn vec4(t, normalize(d2 * (oa + t * rd) - ba * y));\\n}\\nfloat h1 = m3 * m3 - m5 + ra * ra;\\nfloat h2 = m6 * m6 - m7 + rb * rb;\\nif (max(h1, h2) < 0.0) return vec4(-1.0);\\nvec4 r = vec4(1e20);\\nif (h1 > 0.0)\\n{\\nt = -m3 - shadow * sqrt( h1 );\\nr = vec4(t, (oa + t * rd) / ra);\\n}\\nif (h2 > 0.0)\\n{\\nt = -m6 - shadow * sqrt( h2 );\\nif (t < r.x)\\nr = vec4(t, (ob + t * rd) / rb);\\n}\\nreturn r;\\n}\\n\",\n    \"quat.include.fx\": \"const float EPSILON = 0.000001;\\nmat3 fromQuat(in vec4 q) {\\nfloat x = q.x;\\nfloat y = q.y;\\nfloat z = q.z;\\nfloat w = q.w;\\nfloat x2 = x + x;\\nfloat y2 = y + y;\\nfloat z2 = z + z;\\nfloat xx = x * x2;\\nfloat yx = y * x2;\\nfloat yy = y * y2;\\nfloat zx = z * x2;\\nfloat zy = z * y2;\\nfloat zz = z * z2;\\nfloat wx = w * x2;\\nfloat wy = w * y2;\\nfloat wz = w * z2;\\nmat3 m;\\nm[0][0] = 1.0 - yy - zz;\\nm[0][1] = yx - wz;\\nm[0][2] = zx + wy;\\nm[1][0] = yx + wz;\\nm[1][1] = 1.0 - xx - zz;\\nm[1][2] = zy - wx;\\nm[2][0] = zx - wy;\\nm[2][1] = zy + wx;\\nm[2][2] = 1.0 - xx - yy;\\nreturn m;\\n}\\nvec3 rotate(in vec3 p, in vec4 q) {\\nreturn p + 2.0 * cross(q.xyz, cross(q.xyz, p) + q.w * p);\\n}\\nvec4 slerp(in vec4 a, in vec4 b, in float t) {\\nfloat cosom = dot(a, b);\\nif (cosom < 0.0) {\\ncosom = -cosom;\\nb = -b;\\n}\\nfloat scale0, scale1;\\nif (1.0 - cosom > EPSILON) {\\nfloat omega = acos(cosom);\\nfloat sinom = sin(omega);\\nscale0 = sin((1.0 - t) * omega) / sinom;\\nscale1 = sin(t * omega) / sinom;\\n}\\nelse {\\nscale0 = 1.0 - t;\\nscale1 = t;\\n}\\nreturn vec4(scale0 * a + scale1 * b);\\n}\\n\"\n  };\n  class ShaderBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    set vertexBuffer(value2) {\n      if (this._vertexBuffer != value2) {\n        this._vertexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    set indexBuffer(value2) {\n      if (this._indexBuffer != value2) {\n        this._indexBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    constructor(core, main) {\n      this._core = core;\n      this._main = main;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    _createProgram(vs, fs) {\n      const program = this._gl.createProgram();\n      this._gl.attachShader(program, vs);\n      this._gl.attachShader(program, fs);\n      this._gl.linkProgram(program);\n      if (!this._gl.getProgramParameter(program, this._gl.LINK_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getProgramInfoLog(program));\n      }\n      return program;\n    }\n    _compileShader(source2, type2) {\n      const shader = this._gl.createShader(type2);\n      this._gl.shaderSource(shader, source2);\n      this._gl.compileShader(shader);\n      if (!this._gl.getShaderParameter(shader, this._gl.COMPILE_STATUS)) {\n        this._core.log.write(LogLevel.error, this._gl.getShaderInfoLog(shader));\n      }\n      return shader;\n    }\n    _removeDirective(shaderSource, directive) {\n      const remove2 = `#define ${directive}`;\n      const index2 = shaderSource.indexOf(remove2);\n      shaderSource = index2 == -1 ? shaderSource : shaderSource.substring(0, index2) + shaderSource.substring(index2 + remove2.length);\n      return shaderSource;\n    }\n    prepare() {\n      if (this._program != this._main.shaderResources.currentProgram) {\n        if (this._main.shaderResources.currentShader) {\n          this._main.shaderResources.currentShader.disableProgram();\n        }\n        this.enableProgram(this._program);\n        this.updateBuffers();\n        this.updateTextures();\n      } else {\n        if (this._haveBuffersChanged) {\n          this.updateBuffers();\n        }\n        if (this._haveTexturesChanged) {\n          this.updateTextures();\n        }\n      }\n    }\n    apply() {\n    }\n    applyModel() {\n    }\n    applyView() {\n    }\n    enableProgram(program) {\n      this._gl.useProgram(program);\n      this._main.shaderResources.currentProgram = program;\n      this._main.shaderResources.currentShader = this;\n    }\n    updateBuffers() {\n      this._haveBuffersChanged = false;\n    }\n    updateTextures() {\n      this._haveTexturesChanged = false;\n    }\n    disableProgram() {\n      this._main.shaderResources.currentShader = null;\n      this._main.shaderResources.currentProgram = null;\n    }\n    _shaderFromFile(vsName, fsName, callback) {\n      callback(this._includesFromFile(Resources.glsl[vsName]), this._includesFromFile(Resources.glsl[fsName]));\n    }\n    _shaderFromUrl(vsName, fsName, callback) {\n      this._sourceFromUrl(vsName, (vsSource) => {\n        this._includesFromUrl(vsSource, 0, (vsIncSource) => {\n          this._sourceFromUrl(fsName, (fsSource) => {\n            this._includesFromUrl(fsSource, 0, (fsIncSource) => {\n              callback(vsIncSource, fsIncSource);\n            });\n          });\n        });\n      });\n    }\n    _sourceFromUrl(url, callback) {\n      const request2 = new XMLHttpRequest();\n      request2.open(\"GET\", PathHelper.combine(this._core.config.shaderPath, url));\n      request2.onreadystatechange = () => {\n        if (request2.readyState == XMLHttpRequest.DONE && request2.status == 200) {\n          callback(request2.responseText);\n        }\n      };\n      request2.send();\n    }\n    _includesFromFile(source2) {\n      let index2 = 0;\n      do {\n        index2 = source2.indexOf(\"#include\", index2);\n        if (index2 != -1) {\n          const start = source2.indexOf('\"', index2);\n          const end = source2.indexOf('\"', start + 1);\n          const name = source2.substring(start + 1, end);\n          const inc = Resources.glsl[name];\n          source2 = source2.substring(0, index2) + inc + source2.substring(end + 1);\n        }\n      } while (index2 != -1);\n      return source2;\n    }\n    _includesFromUrl(source2, index2, callback) {\n      index2 = source2.indexOf(\"#include\", index2);\n      if (index2 != -1) {\n        const start = source2.indexOf('\"', index2);\n        const end = source2.indexOf('\"', start + 1);\n        const name = source2.substring(start + 1, end);\n        this._sourceFromUrl(PathHelper.combine(\"inc\", name), (include) => {\n          source2 = source2.substring(0, index2) + include + source2.substring(end + 1);\n          this._includesFromUrl(source2, index2, callback);\n        });\n      } else {\n        callback(source2);\n      }\n    }\n  }\n  class Texture extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"texture.vertex.fx\", \"texture.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = gl.getAttribLocation(this._program, \"aNormal\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionNormalTextureVertex.SIZE_BYTES, PositionNormalTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  let Lasso$1 = class Lasso extends ShaderBase {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"lasso.vertex.fx\", \"lasso.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._thicknessUniform = gl.getUniformLocation(this._program, \"uThickness\");\n      this._dashWidthUniform = gl.getUniformLocation(this._program, \"uDashWidth\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform1f(this._dashWidthUniform, this.dashWidth);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2fv(this._thicknessUniform, this.thickness);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTextureVertex.SIZE_BYTES, PositionTextureVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  };\n  class SdfText extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"sdftext.vertex.fx\", \"sdftext.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._hoverColorUniform = gl.getUniformLocation(this._program, \"uHoverColor\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._borderColorUniform = gl.getUniformLocation(this._program, \"uBorderColor\");\n      this._bufferUniform = gl.getUniformLocation(this._program, \"uBuffer\");\n      this._borderWidthUniform = gl.getUniformLocation(this._program, \"uBorderWidth\");\n      this._gammaUniform = gl.getUniformLocation(this._program, \"uGamma\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform3fv(this._colorUniform, this.color);\n      this._gl.uniform3fv(this._hoverColorUniform, this.hoverColor);\n      this._gl.uniform3fv(this._borderColorUniform, this.borderColor);\n      this._gl.uniform1f(this._gammaUniform, this.gamma);\n      this._gl.uniform1f(this._bufferUniform, this.buffer);\n      this._gl.uniform1f(this._borderWidthUniform, this.borderWidth);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyModel() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.POSITION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PositionTexturePickVertex.SIZE_BYTES, PositionTexturePickVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class PickGrid extends ShaderBase {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"pickgrid.vertex.fx\", \"pickgrid.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = this._gl.getAttribLocation(this._program, \"aPosition\");\n      this._idColorAttribute = this._gl.getAttribLocation(this._program, \"aIdColor\");\n      this._texCoordAttribute = this._gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._normalAttribute = this._gl.getAttribLocation(this._program, \"aNormal\");\n      this._boundsAttribute = this._gl.getAttribLocation(this._program, \"aBounds\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._majorColorUniform = gl.getUniformLocation(this._program, \"uMajorColor\");\n      this._minorColorUniform = gl.getUniformLocation(this._program, \"uMinorColor\");\n      this._zeroColorUniform = gl.getUniformLocation(this._program, \"uZeroColor\");\n      this._backgroundUniform = gl.getUniformLocation(this._program, \"uBackground\");\n      this._highlightUniform = gl.getUniformLocation(this._program, \"uHighlight\");\n      this._pickedIdColorUniform = gl.getUniformLocation(this._program, \"uPickedIdColor\");\n      this._faceSizeUniform = gl.getUniformLocation(this._program, \"uFaceSize\");\n      this._majorThicknessUniform = gl.getUniformLocation(this._program, \"uMajorThickness\");\n      this._minorThicknessUniform = gl.getUniformLocation(this._program, \"uMinorThickness\");\n      this._zeroThicknessUniform = gl.getUniformLocation(this._program, \"uZeroThickness\");\n      this._zeroUniform = gl.getUniformLocation(this._program, \"uZero\");\n      this._minorGridlinesUniform = gl.getUniformLocation(this._program, \"uMinorGridlines\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1f(this._majorThicknessUniform, this.majorThickness);\n      this._gl.uniform1f(this._minorThicknessUniform, this.minorThickness);\n      this._gl.uniform1f(this._zeroThicknessUniform, this.zeroThickness);\n      this._gl.uniform3fv(this._backgroundUniform, this.backgroundColor);\n      this._gl.uniform3fv(this._highlightUniform, this.highlightColor);\n      this._gl.uniform3fv(this._majorColorUniform, this.majorColor);\n      this._gl.uniform3fv(this._minorColorUniform, this.minorColor);\n      this._gl.uniform3fv(this._zeroColorUniform, this.zeroColor);\n      this._gl.uniform4fv(this._pickedIdColorUniform, this.pickedIdColor);\n    }\n    applyView() {\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    ApplyFace() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform2f(this._faceSizeUniform, this.faceWidth, this.faceHeight);\n      this._gl.uniform2fv(this._zeroUniform, this.zero);\n      this._gl.uniform2fv(this._minorGridlinesUniform, this.minorGridlines);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PickGridVertex.SIZE_BYTES, PickGridVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.vertexAttribPointer(this._normalAttribute, 3, this._gl.BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.NORMAL_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._normalAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 2, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.TEX_COORD_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, PickGridVertex.SIZE_BYTES, PickGridVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._boundsAttribute, 4, this._gl.UNSIGNED_SHORT, true, PickGridVertex.SIZE_BYTES, PickGridVertex.BOUNDS_OFFSET_BYTES);\n      this._gl.enableVertexAttribArray(this._boundsAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n  }\n  class UnitShader extends ShaderBase {\n    get paletteTexture() {\n      return this._paletteTexture;\n    }\n    set paletteTexture(value2) {\n      if (this._paletteTexture != value2) {\n        this._paletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousPaletteTexture() {\n      return this._previousPaletteTexture;\n    }\n    set previousPaletteTexture(value2) {\n      if (this._previousPaletteTexture != value2) {\n        this._previousPaletteTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get sdfTexture() {\n      return this._sdfTexture;\n    }\n    set sdfTexture(value2) {\n      if (this._sdfTexture != value2) {\n        this._sdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get previousSdfTexture() {\n      return this._previousSdfTexture;\n    }\n    set previousSdfTexture(value2) {\n      if (this._previousSdfTexture != value2) {\n        this._previousSdfTexture = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    set instanceBuffer(value2) {\n      if (this._instanceBuffer != value2) {\n        this._instanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    set previousInstanceBuffer(value2) {\n      if (this._previousInstanceBuffer != value2) {\n        this._previousInstanceBuffer = value2;\n        this._haveBuffersChanged = true;\n      }\n    }\n    initializeData() {\n      this._areBuffersInitialized = false;\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._translationAttribute = gl.getAttribLocation(this._program, \"aTranslation\");\n      this._previousTranslationAttribute = gl.getAttribLocation(this._program, \"aPreviousTranslation\");\n      this._scaleAttribute = gl.getAttribLocation(this._program, \"aScale\");\n      this._previousScaleAttribute = gl.getAttribLocation(this._program, \"aPreviousScale\");\n      this._colorAttribute = gl.getAttribLocation(this._program, \"aColor\");\n      this._previousColorAttribute = gl.getAttribLocation(this._program, \"aPreviousColor\");\n      this._selectedAttribute = gl.getAttribLocation(this._program, \"aSelected\");\n      this._previousSelectedAttribute = gl.getAttribLocation(this._program, \"aPreviousSelected\");\n      this._orderAttribute = gl.getAttribLocation(this._program, \"aOrder\");\n      this._idAttribute = gl.getAttribLocation(this._program, \"aId\");\n      this._idColorAttribute = gl.getAttribLocation(this._program, \"aIdColor\");\n      this._sampler0Uniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._previousSampler0Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler\");\n      this._mMatrixUniform = gl.getUniformLocation(this._program, \"uMMatrix\");\n      this._vMatrixUniform = gl.getUniformLocation(this._program, \"uVMatrix\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._timeUniform = gl.getUniformLocation(this._program, \"uTime\");\n      this._durationUniform = gl.getUniformLocation(this._program, \"uDuration\");\n      this._fromOrderUniform = gl.getUniformLocation(this._program, \"uOrderFrom\");\n      this._toOrderUniform = gl.getUniformLocation(this._program, \"uOrderTo\");\n      this._hoverUniform = gl.getUniformLocation(this._program, \"uHover\");\n      this._activeUniform = gl.getUniformLocation(this._program, \"uActive\");\n      this._pickUniform = gl.getUniformLocation(this._program, \"uPick\");\n      this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n      const vertices = Cube.POSITIONS;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Cube.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this.indexCount = indices.length;\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, 12, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._updateCurrentBuffer();\n      this._updatePreviousBuffer();\n    }\n    _updateCurrentBuffer() {\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._instanceBuffer);\n      this._gl.vertexAttribPointer(this._idAttribute, 1, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ID_HOVER_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._idAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idAttribute);\n      this._gl.vertexAttribPointer(this._idColorAttribute, 4, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.ID_COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._idColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._idColorAttribute);\n      this._gl.vertexAttribPointer(this._translationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._translationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._translationAttribute);\n      this._gl.vertexAttribPointer(this._scaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._scaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._scaleAttribute);\n      this._gl.vertexAttribPointer(this._selectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._selectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._selectedAttribute);\n      this._gl.vertexAttribPointer(this._orderAttribute, 2, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ORDER_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._orderAttribute, 1);\n      this._gl.enableVertexAttribArray(this._orderAttribute);\n    }\n    _updatePreviousBuffer() {\n      if (this._previousInstanceBuffer != this._instanceBuffer) {\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._previousInstanceBuffer);\n      }\n      this._gl.vertexAttribPointer(this._previousTranslationAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TRANSLATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTranslationAttribute);\n      this._gl.vertexAttribPointer(this._previousScaleAttribute, 3, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.SCALE_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousScaleAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousScaleAttribute);\n      this._gl.vertexAttribPointer(this._previousSelectedAttribute, 1, this._gl.BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.SELECTED_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousSelectedAttribute);\n    }\n    apply() {\n      this._gl.uniformMatrix4fv(this._mMatrixUniform, false, this.mMatrix);\n      this._gl.uniform1f(this._timeUniform, this.time);\n      this._gl.uniform1f(this._durationUniform, this.duration);\n      this._gl.uniform1f(this._fromOrderUniform, this.rangeMin);\n      this._gl.uniform1f(this._toOrderUniform, this.rangeMax);\n      this._gl.uniform1i(this._previousSampler0Uniform, 0);\n      this._gl.uniform1i(this._sampler0Uniform, 1);\n      this._gl.uniform1f(this._hoverUniform, this.hover);\n      this._gl.uniform1f(this._activeUniform, this.active);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._vMatrixUniform, false, this.vMatrix);\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n      this._gl.uniform1i(this._pickUniform, this.isPickShader ? 1 : 0);\n      this._gl.uniform1i(this._shadowUniform, this.isShadowMap ? 1 : 0);\n    }\n    updateTextures() {\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousPaletteTexture);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._paletteTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._translationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousTranslationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._scaleAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousScaleAttribute, 0);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 0);\n      this._gl.vertexAttribDivisor(this._selectedAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousSelectedAttribute, 0);\n      this._gl.vertexAttribDivisor(this._orderAttribute, 0);\n      this._gl.vertexAttribDivisor(this._idAttribute, 0);\n      this._gl.vertexAttribDivisor(this._idColorAttribute, 0);\n    }\n  }\n  class UnitBlock extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitblock.vertex.fx\", \"unitblock.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n  }\n  class UnitSphere extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsphere.vertex.fx\", \"unitsphere.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._colorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 1, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n  }\n  class UnitCylinder extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitcylinder.vertex.fx\", \"unitcylinder.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n    }\n  }\n  class UnitSdf extends UnitShader {\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"unitsdf.vertex.fx\", \"unitsdf.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      super._initializeShader(gl, vsSource, fsSource);\n      this._rotationAttribute = gl.getAttribLocation(this._program, \"aRotation\");\n      this._previousRotationAttribute = gl.getAttribLocation(this._program, \"aPreviousRotation\");\n      this._texCoordAttribute = gl.getAttribLocation(this._program, \"aTexCoord\");\n      this._previousTexCoordAttribute = gl.getAttribLocation(this._program, \"aPreviousTexCoord\");\n      this._sampler1Uniform = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._previousSampler1Uniform = gl.getUniformLocation(this._program, \"uPreviousSampler1\");\n      this._isInitialized = true;\n    }\n    _updateCurrentBuffer() {\n      super._updateCurrentBuffer();\n      this._gl.vertexAttribPointer(this._rotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._rotationAttribute);\n      this._gl.vertexAttribPointer(this._texCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._texCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._texCoordAttribute);\n      this._gl.vertexAttribPointer(this._colorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._colorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._colorAttribute);\n    }\n    _updatePreviousBuffer() {\n      super._updatePreviousBuffer();\n      this._gl.vertexAttribPointer(this._previousRotationAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.ROTATION_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousRotationAttribute);\n      this._gl.vertexAttribPointer(this._previousTexCoordAttribute, 4, this._gl.FLOAT, false, UnitVertex.SIZE_BYTES, UnitVertex.TEXCOORD_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousTexCoordAttribute);\n      this._gl.vertexAttribPointer(this._previousColorAttribute, 2, this._gl.UNSIGNED_BYTE, true, UnitVertex.SIZE_BYTES, UnitVertex.COLOR_OFFSET_BYTES);\n      this._gl.vertexAttribDivisor(this._previousColorAttribute, 1);\n      this._gl.enableVertexAttribArray(this._previousColorAttribute);\n    }\n    apply() {\n      super.apply();\n      this._gl.uniform1i(this._previousSampler1Uniform, 2);\n      this._gl.uniform1i(this._sampler1Uniform, 3);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._previousSdfTexture);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._sdfTexture);\n    }\n    disableProgram() {\n      super.disableProgram();\n      this._gl.vertexAttribDivisor(this._rotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousRotationAttribute, 0);\n      this._gl.vertexAttribDivisor(this._texCoordAttribute, 0);\n      this._gl.vertexAttribDivisor(this._previousTexCoordAttribute, 0);\n    }\n  }\n  class Background extends ShaderBase {\n    constructor(core, main) {\n      super(core, main);\n      this._quad = new Quad();\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      this._quad.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"background.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._colorUniform = gl.getUniformLocation(this._program, \"uColor\");\n      this._isInitialized = true;\n      this._vao = gl.createVertexArray();\n      gl.bindVertexArray(this._vao);\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._quad.vertexBuffer);\n      gl.vertexAttribPointer(this._positionAttribute, 3, gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      gl.enableVertexAttribArray(this._positionAttribute);\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._quad.indexBuffer);\n      gl.bindVertexArray(null);\n    }\n    apply() {\n      this._gl.uniform3fv(this._colorUniform, this.color);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindVertexArray(this._vao);\n    }\n  }\n  class Ssao extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"ssao.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._pMatrixUniform = gl.getUniformLocation(this._program, \"uPMatrix\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._ssaoNoiseSizeUniform = gl.getUniformLocation(this._program, \"uSsaoNoiseSize\");\n      this._ssaoRadiusUniform = gl.getUniformLocation(this._program, \"uSsaoRadius\");\n      this._ssaoPowerUniform = gl.getUniformLocation(this._program, \"uSsaoPower\");\n      this._ssaoKernelUniform = gl.getUniformLocation(this._program, \"uSsaoKernel\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._ssaoNoiseSizeUniform, this.ssaoNoiseSize);\n      this._gl.uniform1f(this._ssaoRadiusUniform, this.ssaoRadius);\n      this._gl.uniform1f(this._ssaoPowerUniform, this.ssaoPower);\n      this._gl.uniform3fv(this._ssaoKernelUniform, this.ssaoKernel);\n    }\n    applyView() {\n      this._gl.uniformMatrix4fv(this._pMatrixUniform, false, this.pMatrix);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n  }\n  class Box extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"box.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Deferred extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D4() {\n      return this._texture2D4;\n    }\n    set texture2D4(value2) {\n      if (this._texture2D4 != value2) {\n        this._texture2D4 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D5() {\n      return this._texture2D5;\n    }\n    set texture2D5(value2) {\n      if (this._texture2D5 != value2) {\n        this._texture2D5 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    constructor(core, main) {\n      super(core, main);\n      this.directionToKeyLight = create$3();\n      this.directionToFillLight1 = create$3();\n      this.directionToFillLight2 = create$3();\n      this.keyLightHalfAngle = create$3();\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"deferred.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._shadowUniform = gl.getUniformLocation(this._program, \"uShadow\");\n      this._ssaoUniform = gl.getUniformLocation(this._program, \"uSsao\");\n      this._inverseVMatrixUniform = gl.getUniformLocation(this._program, \"uInverseVMatrix\");\n      this._shadowVMatrixUniform = gl.getUniformLocation(this._program, \"uShadowVMatrix\");\n      this._shadowPMatrixUniform = gl.getUniformLocation(this._program, \"uShadowPMatrix\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n      this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._shadowMapSizeUniform = gl.getUniformLocation(this._program, \"uShadowMapSize\");\n      this._keyLightHalfAngleUniform = gl.getUniformLocation(this._program, \"uKeyLightHalfAngle\");\n      this._directionToKeyLightUniform = gl.getUniformLocation(this._program, \"uDirectionToKeyLight\");\n      this._directionToFillLight1Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight1\");\n      this._directionToFillLight2Uniform = gl.getUniformLocation(this._program, \"uDirectionToFillLight2\");\n      this._keyLightIntensityUniform = gl.getUniformLocation(this._program, \"uKeyLightIntensity\");\n      this._fillLight1IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight1Intensity\");\n      this._fillLight2IntensityUniform = gl.getUniformLocation(this._program, \"uFillLight2Intensity\");\n      this._ambientIntensityUniform = gl.getUniformLocation(this._program, \"uAmbientIntensity\");\n      this._materialIntensityUniform = gl.getUniformLocation(this._program, \"uMaterialIntensity\");\n      this._specularPowerUniform = gl.getUniformLocation(this._program, \"uSpecularPower\");\n      this._specularIntensityUniform = gl.getUniformLocation(this._program, \"uSpecularIntensity\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._shadowUniform, this.isShadowEnabled ? 1 : 0);\n      this._gl.uniform1i(this._ssaoUniform, this.isSsaoEnabled ? 1 : 0);\n      this._gl.uniformMatrix4fv(this._inverseVMatrixUniform, false, this.inverseVMatrix);\n      this._gl.uniformMatrix4fv(this._shadowVMatrixUniform, false, this.shadowVMatrix);\n      this._gl.uniformMatrix4fv(this._shadowPMatrixUniform, false, this.shadowPMatrix);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform1i(this._samplerUniform4, 3);\n      this._gl.uniform1i(this._samplerUniform5, 4);\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform2f(this._shadowMapSizeUniform, this.shadowMapWidth, this.shadowMapHeight);\n      this._gl.uniform1f(this._keyLightIntensityUniform, this.keyLightIntensity);\n      this._gl.uniform1f(this._fillLight1IntensityUniform, this.fillLight1Intensity);\n      this._gl.uniform1f(this._fillLight2IntensityUniform, this.fillLight2Intensity);\n      this._gl.uniform1f(this._ambientIntensityUniform, this.ambientIntensity);\n      this._gl.uniform1f(this._materialIntensityUniform, this.materialIntensity);\n      this._gl.uniform1f(this._specularPowerUniform, this.specularPower);\n      this._gl.uniform1f(this._specularIntensityUniform, this.specularIntensity);\n      this._gl.uniform3fv(this._directionToKeyLightUniform, this.directionToKeyLight);\n      this._gl.uniform3fv(this._directionToFillLight1Uniform, this.directionToFillLight1);\n      this._gl.uniform3fv(this._directionToFillLight2Uniform, this.directionToFillLight2);\n      this._gl.uniform3fv(this._keyLightHalfAngleUniform, this.keyLightHalfAngle);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n      this._gl.activeTexture(this._gl.TEXTURE4);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n  }\n  class Combine extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D4() {\n      return this._texture2D4;\n    }\n    set texture2D4(value2) {\n      if (this._texture2D4 != value2) {\n        this._texture2D4 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D5() {\n      return this._texture2D5;\n    }\n    set texture2D5(value2) {\n      if (this._texture2D5 != value2) {\n        this._texture2D5 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"combine.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._intensityUniform = gl.getUniformLocation(this._program, \"uIntensity\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._samplerUniform4 = gl.getUniformLocation(this._program, \"uSampler4\");\n      this._samplerUniform5 = gl.getUniformLocation(this._program, \"uSampler5\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height);\n      this._gl.uniform1f(this._intensityUniform, this.intensity);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n      this._gl.uniform1i(this._samplerUniform4, 3);\n      this._gl.uniform1i(this._samplerUniform5, 4);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n      this._gl.activeTexture(this._gl.TEXTURE3);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D4);\n      this._gl.activeTexture(this._gl.TEXTURE4);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D5);\n    }\n  }\n  class DofBlur extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"dofblur.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n      this._nearFocusDepthUniform = gl.getUniformLocation(this._program, \"uNearFocusDepth\");\n      this._farFocusDepthUniform = gl.getUniformLocation(this._program, \"uFarFocusDepth\");\n      this._maxBackgroundBlurUniform = gl.getUniformLocation(this._program, \"uMaxBackgroundBlur\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n      this._gl.uniform1f(this._nearFocusDepthUniform, this.nearFocusDepth);\n      this._gl.uniform1f(this._farFocusDepthUniform, this.farFocusDepth);\n      this._gl.uniform1f(this._maxBackgroundBlurUniform, this.maxBackgroundBlur);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n    }\n  }\n  class Downsample extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"downsample.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Gaussian extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"gaussian.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n      this._horizontalUniform = gl.getUniformLocation(this._program, \"uHorizontal\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n      this._gl.uniform1i(this._horizontalUniform, this.horizontal ? 1 : 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class DofCombine extends ShaderBase {\n    get texture2D1() {\n      return this._texture2D1;\n    }\n    set texture2D1(value2) {\n      if (this._texture2D1 != value2) {\n        this._texture2D1 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D2() {\n      return this._texture2D2;\n    }\n    set texture2D2(value2) {\n      if (this._texture2D2 != value2) {\n        this._texture2D2 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    get texture2D3() {\n      return this._texture2D3;\n    }\n    set texture2D3(value2) {\n      if (this._texture2D3 != value2) {\n        this._texture2D3 = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"dofcombine.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._focusDepthUniform = gl.getUniformLocation(this._program, \"uFocusDepth\");\n      this._apertureUniform = gl.getUniformLocation(this._program, \"uAperture\");\n      this._samplerUniform1 = gl.getUniformLocation(this._program, \"uSampler1\");\n      this._samplerUniform2 = gl.getUniformLocation(this._program, \"uSampler2\");\n      this._samplerUniform3 = gl.getUniformLocation(this._program, \"uSampler3\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1f(this._focusDepthUniform, this.focusDepth);\n      this._gl.uniform1f(this._apertureUniform, this.aperture);\n      this._gl.uniform1i(this._samplerUniform1, 0);\n      this._gl.uniform1i(this._samplerUniform2, 1);\n      this._gl.uniform1i(this._samplerUniform3, 2);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D1);\n      this._gl.activeTexture(this._gl.TEXTURE1);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D2);\n      this._gl.activeTexture(this._gl.TEXTURE2);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D3);\n    }\n  }\n  class Fxaa extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"fxaa.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._viewportUniform = gl.getUniformLocation(this._program, \"uViewport\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform4f(this._viewportUniform, this.left, this.top, this.width, this.height);\n      this._gl.uniform1i(this._samplerUniform, 0);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class Bright extends ShaderBase {\n    get texture2D() {\n      return this._texture2D;\n    }\n    set texture2D(value2) {\n      if (this._texture2D != value2) {\n        this._texture2D = value2;\n        this._haveTexturesChanged = true;\n      }\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      if (this._isLoaded) {\n        this._initializeShader(gl, this._vsSource, this._fsSource);\n      } else {\n        this._shaderFromFile(\"simple.vertex.fx\", \"bright.fragment.fx\", (vsSource, fsSource) => {\n          this._vsSource = vsSource;\n          this._fsSource = fsSource;\n          this._isLoaded = true;\n          this._initializeShader(gl, vsSource, fsSource);\n        });\n      }\n    }\n    _initializeShader(gl, vsSource, fsSource) {\n      const vs = this._compileShader(vsSource, gl.VERTEX_SHADER);\n      const fs = this._compileShader(fsSource, gl.FRAGMENT_SHADER);\n      this._program = this._createProgram(vs, fs);\n      this._positionAttribute = gl.getAttribLocation(this._program, \"aPosition\");\n      this._samplerUniform = gl.getUniformLocation(this._program, \"uSampler\");\n      this._resolutionUniform = gl.getUniformLocation(this._program, \"uResolution\");\n      this._isInitialized = true;\n    }\n    apply() {\n      this._gl.uniform1i(this._samplerUniform, 0);\n      this._gl.uniform2f(this._resolutionUniform, this.width, this.height);\n    }\n    updateBuffers() {\n      super.updateBuffers();\n      super.updateBuffers();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n      this._gl.vertexAttribPointer(this._positionAttribute, 3, this._gl.FLOAT, false, PositionVertex.SIZE_BYTES, 0);\n      this._gl.enableVertexAttribArray(this._positionAttribute);\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n    }\n    updateTextures() {\n      super.updateTextures();\n      this._gl.activeTexture(this._gl.TEXTURE0);\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._texture2D);\n    }\n  }\n  class AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get axes() {\n      return this._axes;\n    }\n    constructor(core) {\n      this._core = core;\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n    }\n    update(elapsedTime) {\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        this._renderGrid();\n        this._renderText();\n      }\n    }\n    _renderGrid() {\n    }\n    _renderText() {\n    }\n  }\n  class Cartesian2dVisual extends AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian2dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian2dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian2d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian2d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 2; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 2; edge++) {\n          const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n          if (axes.isEdgeVisible[edgeId]) {\n            if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n              indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n              indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n            } else {\n              indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n              indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n            }\n            if (indexCount > 0) {\n              shader.mMatrix = axes.getLabelMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n            indexCount = axes.getTitleIndexCount(axisId);\n            if (indexCount > 0) {\n              indexOffset = axes.getTitleIndexOffset(axisId);\n              shader.mMatrix = axes.getTitleMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n          indexCount = axes.getHeadingIndexCount(axisId);\n          if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n            indexOffset = axes.getHeadingIndexOffset(axisId);\n            shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n            shader.applyModel();\n            shader.isPickShader = false;\n            shaderResources.bindFramebuffer(this.geometryFramebuffer);\n            for (let i = 0; i < this.viewportCount; i++) {\n              const viewport = i + this.viewportOffset;\n              this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n              shader.vMatrix = this.vMatrices[viewport];\n              shader.pMatrix = this.pMatrices[viewport];\n              shader.applyView();\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n            if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n              shader.isPickShader = true;\n              shader.pMatrix = this.pickPMatrix;\n              shader.vMatrix = this.pickVMatrix;\n              shader.applyView();\n              shaderResources.bindFramebuffer(this.pickFramebuffer);\n              this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n              this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const gridShader = this._main.gridShader;\n      const axes = this._axes;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 2; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width3 = gridTicksScale[0];\n          const height3 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 2; edge++) {\n            const edgeId = Quad$2.AXIS_EDGES[axisId][edge];\n            if (axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width3, height3);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      const axisId2 = 0;\n      const axisId3 = 1;\n      const width2 = size[axisId2];\n      const height2 = size[axisId3];\n      gridShader.zero = axes.gridFaceZero;\n      gridShader.minorGridlines = axes.gridFaceMinorGridlines;\n      for (let face = 0; face < 2; face++) {\n        const faceId = face;\n        if (axes.getIsForwardFace(faceId)) {\n          this._renderGridFace(faceId, width2, height2);\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      const axes = this._axes;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  }\n  class Cartesian3dVisual extends AxesVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.gridShader.isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._axes.font.name].isInitialized;\n    }\n    constructor(core, main, cartesian3dAxes) {\n      super(core);\n      this._main = main;\n      this._axes = cartesian3dAxes;\n      this._axes.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      super.initializeContext(gl);\n      const axes = this._axes;\n      if (!axes.isInitialized) {\n        axes.initialize();\n      }\n      if (axes.gridVertices) {\n        this._createGridBuffers();\n      }\n      if (axes.textVertices) {\n        this._createTextBuffers();\n      }\n      this._isInitialized = true;\n    }\n    _createGridBuffers() {\n      const axes = this._axes;\n      this._gridVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.gridVertices, this._gl.STATIC_DRAW);\n      this._gridIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.gridIndices, this._gl.STATIC_DRAW);\n      this._gridBufferSize = axes.gridVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers created`);\n    }\n    _createTextBuffers() {\n      const axes = this._axes;\n      this._textVertexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n      this._gl.bufferData(this._gl.ARRAY_BUFFER, axes.textVertices, this._gl.STATIC_DRAW);\n      this._textIndexBuffer = this._gl.createBuffer();\n      this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n      this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, axes.textIndices, this._gl.STATIC_DRAW);\n      this._textBufferSize = axes.textVertices.byteLength;\n      this._core.log.write(LogLevel.info, `cartesian3d visual text buffers created`);\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        const axes = this._axes;\n        if (!this._gridVertexBuffer || axes.gridVertices.byteLength > this._gridBufferSize) {\n          this._createGridBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._gridVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.gridVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._gridIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.gridIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual grid buffers updated`);\n        }\n        if (!this._textVertexBuffer || axes.textVertices.byteLength > this._textBufferSize) {\n          this._createTextBuffers();\n        } else {\n          this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._textVertexBuffer);\n          this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, axes.textVertices);\n          this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._textIndexBuffer);\n          this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, axes.textIndices);\n          this._core.log.write(LogLevel.info, `cartesian3d visual text buffers updated`);\n        }\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    _renderText() {\n      const axes = this._axes;\n      const shader = this._main.sdfTextShader;\n      const shaderResources = this._main.shaderResources;\n      const fontVisual = this._main.fonts[axes.font.name];\n      shader.vertexBuffer = this._textVertexBuffer;\n      shader.indexBuffer = this._textIndexBuffer;\n      shader.texture2D = fontVisual.texture;\n      shader.prepare();\n      shader.buffer = fontVisual.font.edgeValue / 255;\n      shader.gamma = axes.gamma;\n      shader.borderWidth = axes.textBorderWidth;\n      shader.color = axes.textColor || this._core.config.axesTextColor;\n      shader.hoverColor = axes.textHoverColor || this._core.config.axesTextHoverColor;\n      shader.borderColor = axes.textBorderColor || this._core.config.textBorderColor;\n      shader.pickedIdColor = this.pickedIdColor;\n      shader.apply();\n      let indexCount, indexOffset;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        const orientation = axes.getLabelOrientation(axisId);\n        for (let edge = 0; edge < 4; edge++) {\n          const edgeId = Cube.AXIS_EDGES[axisId][edge];\n          if (axes.getIsOutsideEdge(edgeId)) {\n            if (axes.isEdgeVisible[edgeId]) {\n              if (orientation == AxesTextOrientation.parallel && axes.getIsLeftToRightHorizontal(edgeId) || orientation == AxesTextOrientation.perpendicular && axes.getIsLeftToRightVertical(edgeId)) {\n                indexCount = axes.getAxesLeftToRightIndexCount(axisId);\n                indexOffset = axes.getAxesLeftToRightIndexOffset(axisId);\n              } else {\n                indexCount = axes.getAxesRightToLeftIndexCount(axisId);\n                indexOffset = axes.getAxesRightToLeftIndexOffset(axisId);\n              }\n              if (indexCount > 0) {\n                shader.mMatrix = axes.getLabelMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isLabelPickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n              indexCount = axes.getTitleIndexCount(axisId);\n              if (indexCount > 0) {\n                indexOffset = axes.getTitleIndexOffset(axisId);\n                shader.mMatrix = axes.getTitleMMatrix(edgeId);\n                shader.applyModel();\n                shader.isPickShader = false;\n                shaderResources.bindFramebuffer(this.geometryFramebuffer);\n                for (let i = 0; i < this.viewportCount; i++) {\n                  const viewport = i + this.viewportOffset;\n                  this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                  shader.vMatrix = this.vMatrices[viewport];\n                  shader.pMatrix = this.pMatrices[viewport];\n                  shader.applyView();\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n                if (this.isPickingEnabled && axes.isTitlePickingEnabled[axisId]) {\n                  shader.isPickShader = true;\n                  shader.pMatrix = this.pickPMatrix;\n                  shader.vMatrix = this.pickVMatrix;\n                  shader.applyView();\n                  shaderResources.bindFramebuffer(this.pickFramebuffer);\n                  this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                  this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n                }\n              }\n            }\n            indexCount = axes.getHeadingIndexCount(axisId);\n            if (indexCount > 0 && axes.isHeadingVisible[edgeId]) {\n              indexOffset = axes.getHeadingIndexOffset(axisId);\n              shader.mMatrix = axes.getHeadingMMatrix(edgeId);\n              shader.applyModel();\n              shader.isPickShader = false;\n              shaderResources.bindFramebuffer(this.geometryFramebuffer);\n              for (let i = 0; i < this.viewportCount; i++) {\n                const viewport = i + this.viewportOffset;\n                this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n                shader.vMatrix = this.vMatrices[viewport];\n                shader.pMatrix = this.pMatrices[viewport];\n                shader.applyView();\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n              if (this.isPickingEnabled && axes.isHeadingPickingEnabled[axisId]) {\n                shader.isPickShader = true;\n                shader.pMatrix = this.pickPMatrix;\n                shader.vMatrix = this.pickVMatrix;\n                shader.applyView();\n                shaderResources.bindFramebuffer(this.pickFramebuffer);\n                this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n                this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, indexOffset * 2);\n              }\n            }\n          }\n        }\n      }\n    }\n    _renderGrid() {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      gridShader.vertexBuffer = this._gridVertexBuffer;\n      gridShader.indexBuffer = this._gridIndexBuffer;\n      gridShader.prepare();\n      gridShader.majorThickness = axes.gridMajorThickness;\n      gridShader.minorThickness = axes.gridMinorThickness;\n      gridShader.zeroThickness = axes.gridZeroThickness;\n      gridShader.backgroundColor = axes.gridBackgroundColor || this._core.config.axesGridBackgroundColor;\n      gridShader.highlightColor = axes.gridHighlightColor || this._core.config.axesGridHighlightColor;\n      gridShader.majorColor = axes.gridMajorColor || this._core.config.axesGridMajorColor;\n      gridShader.minorColor = axes.gridMinorColor || this._core.config.axesGridMinorColor;\n      gridShader.zeroColor = axes.gridZeroColor || this._core.config.axesGridZeroColor;\n      gridShader.pickedIdColor = this.pickedIdColor;\n      gridShader.apply();\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.arePickDivisionsVisible[axisId]) {\n          const gridTicksScale = axes.getGridTicksScale(axisId);\n          const width2 = gridTicksScale[0];\n          const height2 = gridTicksScale[1];\n          gridShader.zero = axes.getGridTicksZero(axisId);\n          gridShader.minorGridlines = axes.getGridTicksMinorGridlines(axisId);\n          for (let edge = 0; edge < 4; edge++) {\n            const edgeId = Cube.AXIS_EDGES[axisId][edge];\n            if (axes.getIsOutsideEdge(edgeId) && axes.isEdgeVisible[edgeId]) {\n              this._renderGridTicks(axisId, edgeId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.disable(this._gl.CULL_FACE);\n      const size = axes.size;\n      for (let axisId = 0; axisId < 3; axisId++) {\n        if (axes.areFacesVisible[axisId]) {\n          const axisId2 = axisId == 0 ? 1 : 0;\n          const axisId3 = axisId == 2 ? 1 : 2;\n          const width2 = size[axisId2];\n          const height2 = size[axisId3];\n          gridShader.zero = axes.getGridFaceZero(axisId);\n          gridShader.minorGridlines = axes.getGridFaceMinorGridlines(axisId);\n          for (let face = 0; face < 2; face++) {\n            const faceId = Cube.AXIS_FACES[axisId][face];\n            if (axes.getIsForwardFace(faceId) && axes.isFaceVisible[faceId]) {\n              this._renderGridFace(faceId, width2, height2);\n            }\n          }\n        }\n      }\n      this._gl.enable(this._gl.CULL_FACE);\n    }\n    _renderGridTicks(axisId, edgeId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridTicksMMatrix(edgeId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isDivisionPickingEnabled[axisId]) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridTicksIndexCount(axisId), this._gl.UNSIGNED_SHORT, axes.getGridTicksIndexOffset(axisId) * 2);\n      }\n    }\n    _renderGridFace(faceId, width2, height2) {\n      const axes = this._axes;\n      const gridShader = this._main.gridShader;\n      const shaderResources = this._main.shaderResources;\n      gridShader.mMatrix = axes.getGridFaceMMatrix(faceId);\n      gridShader.faceWidth = width2;\n      gridShader.faceHeight = height2;\n      gridShader.ApplyFace();\n      gridShader.isPickShader = false;\n      shaderResources.bindFramebuffer(this.geometryFramebuffer);\n      for (let i = 0; i < this.viewportCount; i++) {\n        const viewport = i + this.viewportOffset;\n        this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n        gridShader.vMatrix = this.vMatrices[viewport];\n        gridShader.pMatrix = this.pMatrices[viewport];\n        gridShader.applyView();\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n      if (this.isPickingEnabled && axes.isGridPickingEnabled) {\n        gridShader.isPickShader = true;\n        gridShader.vMatrix = this.pickVMatrix;\n        gridShader.pMatrix = this.pickPMatrix;\n        gridShader.applyView();\n        shaderResources.bindFramebuffer(this.pickFramebuffer);\n        this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n        this._gl.drawElements(this._gl.TRIANGLES, axes.getGridFaceIndexCount(faceId), this._gl.UNSIGNED_SHORT, axes.getGridFaceIndexOffset(faceId) * 2);\n      }\n    }\n  }\n  class FontVisual {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get font() {\n      return this._font;\n    }\n    constructor(core, font2) {\n      this._core = core;\n      this._font = font2;\n      font2.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n    }\n    initializeContext(gl) {\n      this._gl = gl;\n      this._isInitialized = true;\n      if (this._font.count > 0) {\n        this._hasChanged = true;\n      }\n    }\n    update() {\n      if (this._hasChanged && this._isInitialized) {\n        this._hasChanged = false;\n        this.texture = TextureHelper.fromImage(this._gl, this._font.atlas.imageData, false, this._gl.LINEAR);\n        this._core.log.write(LogLevel.info, `${this._font.name} texture updated`);\n      }\n    }\n  }\n  class LabelVisualBase {\n    get isInitialized() {\n      return this._isInitialized && this._main.sdfTextShader.isInitialized && this._main.fonts[this._label.font.name].isInitialized;\n    }\n    constructor(core, main, label2) {\n      this._core = core;\n      this._main = main;\n      this._label = label2;\n      this._label.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this._mMatrix = create$4();\n      this.mMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._label.isInitialized) {\n        this._label.initialize();\n      }\n      this._gl = gl;\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._label.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._label.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._label.vertices);\n        this._gl.bindBuffer(this._gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n        this._gl.bufferSubData(this._gl.ELEMENT_ARRAY_BUFFER, 0, this._label.indices);\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const indexCount = this._label.indexCount;\n        if (indexCount > 0) {\n          const shader = this._main.sdfTextShader;\n          const fontVisual = this._main.fonts[this._label.font.name];\n          shader.vertexBuffer = this._vertexBuffer;\n          shader.indexBuffer = this._indexBuffer;\n          shader.texture2D = fontVisual.texture;\n          shader.prepare();\n          shader.gamma = this._label.gamma;\n          shader.buffer = fontVisual.font.edgeValue / 255;\n          shader.borderWidth = this._label.borderWidth;\n          shader.color = this._label.color || this._core.config.textColor;\n          shader.borderColor = this._label.borderColor || this._core.config.textBorderColor;\n          shader.hoverColor = this._label.hoverColor || this._core.config.textHoverColor;\n          shader.pickedIdColor = this.pickedIdColor;\n          shader.apply();\n          multiply$2(this._mMatrix, this.mMatrix, this._label.mMatrix);\n          shader.mMatrix = this._mMatrix;\n          shader.applyModel();\n          shader.isPickShader = false;\n          this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n          for (let i = 0; i < this.viewportCount; i++) {\n            const viewport = i + this.viewportOffset;\n            this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n            shader.vMatrix = this.vMatrices[viewport];\n            shader.pMatrix = this.pMatrices[viewport];\n            shader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n          if (this.isPickingEnabled) {\n            shader.isPickShader = true;\n            shader.pMatrix = this.pickPMatrix;\n            shader.vMatrix = this.pickVMatrix;\n            shader.applyView();\n            this._main.shaderResources.bindFramebuffer(this.pickFramebuffer);\n            this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n            this._gl.drawElements(this._gl.TRIANGLES, indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      }\n    }\n  }\n  class LabelVisual extends LabelVisualBase {\n    get label() {\n      return this._label;\n    }\n    set text(value2) {\n      this._label.text = value2;\n    }\n    get text() {\n      return this._label.text;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  }\n  class LabelSetVisual extends LabelVisualBase {\n    get label() {\n      return this._label;\n    }\n    constructor(core, main, label2) {\n      super(core, main, label2);\n    }\n  }\n  class ImageVisual {\n    get isInitialized() {\n      return this._isInitialized && this._main.textureShader.isInitialized;\n    }\n    get image() {\n      return this._image;\n    }\n    constructor(core, main, image2) {\n      this._core = core;\n      this._main = main;\n      this._image = image2;\n      this._image.hasChangedCallback = () => {\n        this._hasChanged = true;\n      };\n      this.mMatrix = create$4();\n      this.isVisible = true;\n    }\n    initializeContext(gl) {\n      if (!this._image.isInitialized) {\n        this._image.initialize();\n      }\n      this._gl = gl;\n      if (this._image.imageData) {\n        this.texture = TextureHelper.fromImage(gl, this._image.imageData, false, gl.LINEAR);\n      }\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, this._image.vertices, gl.STATIC_DRAW);\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this._image.indices, gl.STATIC_DRAW);\n      this._isInitialized = true;\n    }\n    update(elapsedTime) {\n      if (this._hasChanged) {\n        this._hasChanged = false;\n        this._gl.bindBuffer(this._gl.ARRAY_BUFFER, this._vertexBuffer);\n        this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, this._image.vertices);\n        this._main.shaderResources.currentProgram = null;\n      }\n    }\n    render(elapsedTime, xrFrame) {\n      if (this.isInitialized) {\n        const textureShader = this._main.textureShader;\n        textureShader.vertexBuffer = this._vertexBuffer;\n        textureShader.indexBuffer = this._indexBuffer;\n        textureShader.texture2D = this.texture;\n        textureShader.prepare();\n        textureShader.mMatrix = this.mMatrix;\n        textureShader.apply();\n        this._main.shaderResources.bindFramebuffer(this.geometryFramebuffer);\n        for (let i = 0; i < this.viewportCount; i++) {\n          const viewport = i + this.viewportOffset;\n          this._gl.viewport(this.viewports[viewport].x, this.viewports[viewport].y, this.viewports[viewport].width, this.viewports[viewport].height);\n          textureShader.vMatrix = this.vMatrices[viewport];\n          textureShader.pMatrix = this.pMatrices[viewport];\n          textureShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._image.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n      }\n    }\n  }\n  class Lasso {\n    get isInitialized() {\n      return this._isInitialized;\n    }\n    get vertexBuffer() {\n      return this._vertexBuffer;\n    }\n    get indexBuffer() {\n      return this._indexBuffer;\n    }\n    get indexCount() {\n      return this._indexCount;\n    }\n    initializeContext(gl) {\n      const vertices = Quad$2.textured(Constants.MAT4_IDENTITY);\n      this._vertexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer);\n      gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n      const indices = Quad$2.INDICES;\n      this._indexBuffer = gl.createBuffer();\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      this._indexCount = indices.length;\n      this._isInitialized = true;\n    }\n  }\n  var __awaiter = function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  };\n  class Main extends RendererBase {\n    get shaderResources() {\n      return this._shaderResources;\n    }\n    get textureShader() {\n      return this._textureShader;\n    }\n    get lassoShader() {\n      return this._lassoShader;\n    }\n    get sdfTextShader() {\n      return this._sdfTextShader;\n    }\n    get gridShader() {\n      return this._gridShader;\n    }\n    get blockShader() {\n      return this._blockShader;\n    }\n    get sphereShader() {\n      return this._sphereShader;\n    }\n    get cyclinderShader() {\n      return this._cylinderShader;\n    }\n    get sdfShader() {\n      return this._sdfShader;\n    }\n    get currentAxes() {\n      return this._isAxes1Current ? this._axes1 : this._axes2;\n    }\n    set currentAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes1 = value2;\n      } else {\n        this._axes2 = value2;\n      }\n    }\n    get previousAxes() {\n      return this._isAxes1Current ? this._axes2 : this._axes1;\n    }\n    set previousAxes(value2) {\n      if (this._isAxes1Current) {\n        this._axes2 = value2;\n      } else {\n        this._axes1 = value2;\n      }\n    }\n    get config() {\n      return this._config;\n    }\n    constructor(options) {\n      super(options);\n      this._config = new Config();\n      this._quad = new Quad();\n      this._lasso = new Lasso();\n      this._pickedPixels = new Uint8Array(4);\n      this._pickedIdColor = create$2();\n      this._position = create$3();\n      this._direction = create$3();\n      this._cameraRotation = create$5();\n      this._cameraPosition = create$3();\n      this._modelPosition = create$3();\n      this._modelManipulationOrigin = create$3();\n      this._shadowVMatrix = create$4();\n      this._shadowPMatrix = create$4();\n    }\n    get isSupported() {\n      return this._createContext(document.createElement(\"canvas\")) !== null;\n    }\n    initialize(core) {\n      super.initialize(core);\n      this._shaderResources = new Resources();\n      this._textureShader = new Texture(core, this);\n      this._lassoShader = new Lasso$1(core, this);\n      this._sdfTextShader = new SdfText(core, this);\n      this._gridShader = new PickGrid(core, this);\n      this._blockShader = new UnitBlock(core, this);\n      this._sphereShader = new UnitSphere(core, this);\n      this._cylinderShader = new UnitCylinder(core, this);\n      this._sdfShader = new UnitSdf(core, this);\n      this._backgroundShader = new Background(core, this);\n      this._ssaoShader = new Ssao(core, this);\n      this._boxShader = new Box(core, this);\n      this._deferredShader = new Deferred(core, this);\n      this._combineShader = new Combine(core, this);\n      this._dofBlurShader = new DofBlur(core, this);\n      this._downsampleShader = new Downsample(core, this);\n      this._gaussianShader = new Gaussian(core, this);\n      this._dofCombineShader = new DofCombine(core, this);\n      this._fxaaShader = new Fxaa(core, this);\n      this._brightPassShader = new Bright(core, this);\n      this._initializeContext(this._createContext(this._canvas));\n      this._canvas.addEventListener(\"webglcontextlost\", (event2) => {\n        this._core.log.write(LogLevel.warn, \"WebGL context lost\");\n        event2.preventDefault();\n      }, false);\n      this._canvas.addEventListener(\"webglcontextrestored\", () => {\n        this._initializeContext(this._createContext(this._canvas));\n        this._core.log.write(LogLevel.info, \"WebGL context restored\");\n      }, false);\n      this._isInitialized = true;\n    }\n    _initializeContext(gl) {\n      this._gl = gl;\n      for (const key2 in this.fonts) {\n        const fontVisual = this.fonts[key2];\n        fontVisual.initializeContext(gl);\n      }\n      this._ssaoSampleKernel = new Float32Array(this._config.ssaoKernelSize * 3);\n      const random2 = new PseudoRandom(0);\n      const _vec3 = create$3();\n      for (let i = 0; i < this._config.ssaoKernelSize; i++) {\n        _vec3[0] = random2.nextFloat() * 2 - 1;\n        _vec3[1] = random2.nextFloat() * 2 - 1;\n        _vec3[2] = random2.nextFloat();\n        normalize$2(_vec3, _vec3);\n        scale(_vec3, _vec3, random2.nextFloat());\n        let scale$12 = i / this._config.ssaoKernelSize;\n        scale$12 = MathHelper.lerp(0.1, 1, scale$12 * scale$12);\n        scale(_vec3, _vec3, scale$12);\n        this._ssaoSampleKernel[i * 3] = _vec3[0];\n        this._ssaoSampleKernel[i * 3 + 1] = _vec3[1];\n        this._ssaoSampleKernel[i * 3 + 2] = _vec3[2];\n      }\n      const noise = new Float32Array(this._config.ssaoNoiseSize * this._config.ssaoNoiseSize * 4);\n      _vec3[2] = 0;\n      for (let i = 0; i < this._config.ssaoNoiseSize * this._config.ssaoNoiseSize; i++) {\n        _vec3[0] = random2.nextFloat() * 2 - 1;\n        _vec3[1] = random2.nextFloat() * 2 - 1;\n        normalize$2(_vec3, _vec3);\n        noise[i * 4] = _vec3[0];\n        noise[i * 4 + 1] = _vec3[1];\n      }\n      this._ssaoNoiseTexture = this._gl.createTexture();\n      this._gl.bindTexture(this._gl.TEXTURE_2D, this._ssaoNoiseTexture);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.REPEAT);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.REPEAT);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MIN_FILTER, this._gl.NEAREST);\n      this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_MAG_FILTER, this._gl.NEAREST);\n      this._gl.texImage2D(this._gl.TEXTURE_2D, 0, this._gl.RGBA32F, this._config.ssaoNoiseSize, this._config.ssaoNoiseSize, 0, this._gl.RGBA, this._gl.FLOAT, noise);\n      this._ssaoWidth = -1;\n      this._ssaoHeight = -1;\n      this._shadowWidth = -1;\n      this._shadowHeight = -1;\n      this._shaderResources.initializeContext(this._gl);\n      this._textureShader.initializeContext(this._gl);\n      this._lassoShader.initializeContext(this._gl);\n      this._sdfTextShader.initializeContext(this._gl);\n      this._gridShader.initializeContext(this._gl);\n      this._blockShader.initializeContext(this._gl);\n      this._sphereShader.initializeContext(this._gl);\n      this._cylinderShader.initializeContext(this._gl);\n      this._sdfShader.initializeContext(this._gl);\n      this._backgroundShader.initializeContext(this._gl);\n      this._ssaoShader.initializeContext(this._gl);\n      this._boxShader.initializeContext(this._gl);\n      this._deferredShader.initializeContext(this._gl);\n      this._combineShader.initializeContext(this._gl);\n      this._dofBlurShader.initializeContext(this._gl);\n      this._downsampleShader.initializeContext(this._gl);\n      this._gaussianShader.initializeContext(this._gl);\n      this._dofCombineShader.initializeContext(this._gl);\n      this._fxaaShader.initializeContext(this._gl);\n      this._brightPassShader.initializeContext(this._gl);\n      this._quad.initializeContext(this._gl);\n      this._lasso.initializeContext(this._gl);\n      this._framebuffers = [null, null];\n      const texture = TextureHelper.create(this._gl, this._core.config.pickWidth, this._core.config.pickHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, this._core.config.pickWidth, this._core.config.pickHeight);\n      const framebuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(framebuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, texture, 0);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._pickFrameBuffer = framebuffer;\n      for (let i = 0; i < this.transitionBuffers.length; i++) {\n        this.transitionBuffers[i].initializeContext(this._gl);\n      }\n      if (this._axes1) {\n        for (let i = 0; i < this._axes1.length; i++) {\n          this._axes1[i].initializeContext(this._gl);\n        }\n      }\n      if (this._axes2) {\n        for (let i = 0; i < this._axes2.length; i++) {\n          this._axes2[i].initializeContext(this._gl);\n        }\n      }\n      for (let i = 0; i < this.labelSets.length; i++) {\n        this.labelSets[i].initializeContext(this._gl);\n      }\n      for (let i = 0; i < this.images.length; i++) {\n        this.images[i].initializeContext(this._gl);\n      }\n    }\n    _resize(width2, height2) {\n      super._resize(width2, height2);\n      this._positionTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.NEAREST, null, this._gl.RGBA32F);\n      this._colorTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._normalTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._geometryFrameBuffer = this._gl.createFramebuffer();\n      this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._positionTexture, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT1, this._gl.TEXTURE_2D, this._colorTexture, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT2, this._gl.TEXTURE_2D, this._normalTexture, 0);\n      const renderBuffer = this._gl.createRenderbuffer();\n      this._gl.bindRenderbuffer(this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.renderbufferStorage(this._gl.RENDERBUFFER, this._gl.DEPTH_COMPONENT24, width2, height2);\n      this._gl.framebufferRenderbuffer(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.RENDERBUFFER, renderBuffer);\n      this._gl.drawBuffers([this._gl.COLOR_ATTACHMENT0, this._gl.COLOR_ATTACHMENT1, this._gl.COLOR_ATTACHMENT2]);\n      this._postProcessTexture1 = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessDepthTexture = TextureHelper.create(this._gl, width2, height2, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n      this._postProcessFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture1, 0);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._postProcessDepthTexture, 0);\n      this._postProcessTexture2 = TextureHelper.create(this._gl, width2, height2, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessTexture2, 0);\n      this._postProcessDofTexture = TextureHelper.create(this._gl, width2, height2, this._gl.RED, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.R32F);\n      this._postProcessDofFrameBuffer = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessDofTexture, 0);\n      const widthHalf = Math.round(width2 / 2);\n      const heightHalf = Math.round(height2 / 2);\n      this._postProcessHalfTexture1 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessHalfFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture1, 0);\n      this._postProcessHalfTexture2 = TextureHelper.create(this._gl, widthHalf, heightHalf, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessHalfFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessHalfTexture2, 0);\n      const widthQuarter = Math.round(widthHalf / 2);\n      const heightQuarter = Math.round(heightHalf / 2);\n      this._postProcessQuarterTexture1 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessQuarterFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture1, 0);\n      this._postProcessQuarterTexture2 = TextureHelper.create(this._gl, widthQuarter, heightQuarter, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessQuarterFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessQuarterTexture2, 0);\n      const widthEighth = Math.round(widthQuarter / 2);\n      const heightEighth = Math.round(heightQuarter / 2);\n      this._postProcessEighthTexture1 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessEighthFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture1, 0);\n      this._postProcessEighthTexture2 = TextureHelper.create(this._gl, widthEighth, heightEighth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessEighthFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessEighthTexture2, 0);\n      const widthSixteenth = Math.round(widthEighth / 2);\n      const hgeightSixteenth = Math.round(heightEighth / 2);\n      this._postProcessSixteenthTexture1 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessSixteenthFrameBuffer1 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture1, 0);\n      this._postProcessSixteenthTexture2 = TextureHelper.create(this._gl, widthSixteenth, hgeightSixteenth, this._gl.RGBA, this._gl.FLOAT, this._gl.LINEAR, null, this._gl.RGBA32F);\n      this._postProcessSixteenthFrameBuffer2 = this._gl.createFramebuffer();\n      this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n      this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._postProcessSixteenthTexture2, 0);\n      this._core.log.write(LogLevel.info, `buffers resized ${width2},${height2}`);\n    }\n    _createContext(canvas) {\n      let supported = false;\n      const preserveDrawingBuffer = this._options ? this._options.preserveDrawingBuffer === void 0 ? false : this._options.preserveDrawingBuffer : false;\n      const options = {\n        stencil: true,\n        alpha: false,\n        antialias: false,\n        preserveDrawingBuffer\n      };\n      const gl = canvas.getContext(\"webgl2\", options);\n      if (gl) {\n        const OES_texture_float_linear = gl.getExtension(\"OES_texture_float_linear\");\n        const EXT_color_buffer_float = gl.getExtension(\"EXT_color_buffer_float\");\n        if (OES_texture_float_linear && EXT_color_buffer_float && gl.MAX_DRAW_BUFFERS > 3) {\n          const texture = TextureHelper.create(gl, 1, 1, gl.RGBA, gl.FLOAT, gl.LINEAR, null, gl.RGBA32F);\n          const framebuffer = gl.createFramebuffer();\n          gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n          gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n          const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n          if (status == gl.FRAMEBUFFER_COMPLETE) {\n            supported = true;\n          }\n          gl.bindTexture(gl.TEXTURE_2D, null);\n        }\n      }\n      return supported ? gl : null;\n    }\n    prepare() {\n      let viewport;\n      switch (this._core.config.stereoMode) {\n        case StereoMode.none:\n          viewport = this._viewports[0];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 0;\n          this._viewportCount = 1;\n          break;\n        case StereoMode.left:\n          viewport = this._viewports[0];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 0;\n          this._viewportCount = 1;\n          break;\n        case StereoMode.right:\n          viewport = this._viewports[1];\n          viewport.x = 0;\n          viewport.y = 0;\n          viewport.width = this._canvas.width;\n          viewport.height = this._canvas.height;\n          this._viewportOffset = 1;\n          this._viewportCount = 1;\n          break;\n      }\n    }\n    createTransitionBuffer(ids) {\n      const buffer = new TransitionBuffer(this._core, ids);\n      buffer.initializeContext(this._gl);\n      return buffer;\n    }\n    createCartesian2dAxesVisual(axes) {\n      const visual = new Cartesian2dVisual(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createCartesian3dAxesVisual(axes) {\n      const visual = new Cartesian3dVisual(this._core, this, axes);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    _createLabelVisual(label2) {\n      return new LabelVisual(this._core, this, label2);\n    }\n    createLabelSetVisual(labelSet) {\n      const visual = new LabelSetVisual(this._core, this, labelSet);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createImageVisual(image2) {\n      const visual = new ImageVisual(this._core, this, image2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    createFontVisual(font2) {\n      const visual = new FontVisual(this._core, font2);\n      visual.initializeContext(this._gl);\n      return visual;\n    }\n    getDataUrl(mimeType) {\n      return this._canvas.toDataURL(mimeType);\n    }\n    update(elapsedTime) {\n      super.update(elapsedTime);\n      if (this._shadowWidth != this._config.shadowWidth || this._shadowHeight != this._config.shadowHeight) {\n        this._shadowWidth = this._config.shadowWidth;\n        this._shadowHeight = this._config.shadowHeight;\n        this._shadowColorTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null);\n        this._shadowDepthTexture = TextureHelper.create(this._gl, this._config.shadowWidth, this._config.shadowHeight, this._gl.DEPTH_COMPONENT, this._gl.UNSIGNED_INT, this._gl.NEAREST, null, this._gl.DEPTH_COMPONENT24);\n        this._shadowFrameBuffer = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._shadowFrameBuffer);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._shadowColorTexture, 0);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.DEPTH_ATTACHMENT, this._gl.TEXTURE_2D, this._shadowDepthTexture, 0);\n        this._core.log.write(LogLevel.info, `shadow map resized ${this._shadowWidth},${this._shadowHeight}`);\n      }\n      if (this._ssaoWidth != this._config.ssaoWidth || this._ssaoHeight != this._config.ssaoHeight) {\n        this._ssaoWidth = this._config.ssaoWidth;\n        this._ssaoHeight = this._config.ssaoHeight;\n        this._ssaoTexture1 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n        this._ssaoFrameBuffer1 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer1);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture1, 0);\n        this._ssaoTexture2 = TextureHelper.create(this._gl, this._config.ssaoWidth, this._config.ssaoHeight, this._gl.RED, this._gl.UNSIGNED_BYTE, this._gl.LINEAR, null, this._gl.R8);\n        this._ssaoFrameBuffer2 = this._gl.createFramebuffer();\n        this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._ssaoFrameBuffer2);\n        this._gl.framebufferTexture2D(this._gl.FRAMEBUFFER, this._gl.COLOR_ATTACHMENT0, this._gl.TEXTURE_2D, this._ssaoTexture2, 0);\n        this._core.log.write(LogLevel.info, `ssao map resized ${this._ssaoWidth},${this._ssaoHeight}`);\n      }\n      if (this._config.isDofEnabled && this._config.dofAutoFocus) {\n        this._core.getModelManipulationOrigin(this._modelManipulationOrigin);\n        this._core.getModelPosition(this._modelPosition);\n        add(this._position, this._modelManipulationOrigin, this._modelPosition);\n        this._core.camera.getPosition(this._cameraPosition);\n        subtract(this._position, this._position, this._cameraPosition);\n        const distance2 = -this._position[2];\n        const amount = Math.min(elapsedTime * this._core.config.focusSmoothing, 1);\n        this._config.dofFocusDistance = MathHelper.lerp(this._config.dofFocusDistance, distance2, amount);\n      }\n    }\n    render(elapsedTime) {\n      return __awaiter(this, void 0, void 0, function* () {\n        this._gl.enable(this._gl.DEPTH_TEST);\n        this._gl.enable(this._gl.CULL_FACE);\n        this._gl.cullFace(this._gl.BACK);\n        this._gl.disable(this._gl.BLEND);\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.clearColor(0, 0, 0, 0);\n          this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        }\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        const backgroundColor = this._backgroundColor || this._core.config.backgroundColor;\n        this._gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1);\n        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT | this._gl.STENCIL_BUFFER_BIT);\n        if (this.config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.clear(this._gl.DEPTH_BUFFER_BIT);\n          perspective(this._shadowPMatrix, AngleHelper.degreesToRadians(30), this._config.shadowWidth / this._config.shadowHeight, this._core.config.nearPlane, this._core.config.farPlane);\n          set$3(this._modelPosition, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n          fromMat4(this._cameraRotation, this.inverseVMatrices[0]);\n          transformMat3(this._position, this._config.keyLightPosition, this._cameraRotation);\n          add(this._position, this._position, this._modelPosition);\n          lookAt(this._shadowVMatrix, this._position, this._modelPosition, Constants.VECTOR3_UNITY);\n        }\n        for (let i = 0; i < this.transitionBuffers.length; i++) {\n          const transitionBuffer = this.transitionBuffers[i];\n          if (transitionBuffer.isVisible) {\n            this._renderTransitionBuffer(transitionBuffer);\n          }\n        }\n        const axesVisuals = this.axesVisibility == AxesVisibility.current ? this.currentAxes : this.axesVisibility == AxesVisibility.previous ? this.previousAxes : null;\n        if (axesVisuals) {\n          for (let i = 0; i < axesVisuals.length; i++) {\n            const axesVisual = axesVisuals[i];\n            if (axesVisual.isVisible) {\n              axesVisual.pickedIdColor = this._pickedIdColor;\n              axesVisual.pickFramebuffer = this._pickFrameBuffer;\n              axesVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              axesVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this.areLabelsVisible) {\n          for (let i = 0; i < this.labelSets.length; i++) {\n            const labelSetVisual = this.labelSets[i];\n            if (labelSetVisual.isVisible) {\n              labelSetVisual.pickedIdColor = this._pickedIdColor;\n              labelSetVisual.pickFramebuffer = this._pickFrameBuffer;\n              labelSetVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              labelSetVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this.areImagesVisible) {\n          for (let i = 0; i < this.images.length; i++) {\n            const imageVisual = this.images[i];\n            if (imageVisual.isVisible) {\n              imageVisual.geometryFramebuffer = this._geometryFrameBuffer;\n              imageVisual.render(elapsedTime);\n            }\n          }\n        }\n        if (this._backgroundShader.isInitialized) {\n          this._backgroundShader.prepare();\n          this._backgroundShader.color = fromValues$3(this._core.config.backgroundColor[0], this._core.config.backgroundColor[1], this._core.config.backgroundColor[2]);\n          this._backgroundShader.apply();\n          this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewport = i + this._viewportOffset;\n            this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n          this._gl.bindVertexArray(null);\n        }\n        if (this.isPickingEnabled) {\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.readPixels(this._core.config.pickWidth / 2, this._core.config.pickHeight / 2, 1, 1, this._gl.RGBA, this._gl.UNSIGNED_BYTE, this._pickedPixels);\n          this._pickedType = PickHelper.decodeType(this._pickedPixels);\n          set$2(this._pickedIdColor, this._pickedPixels[0] / 255, this._pickedPixels[1] / 255, this._pickedPixels[2] / 255, this._pickedPixels[3] / 255);\n          this._pickedId = PickHelper.decodeNumber(this._pickedPixels);\n        } else {\n          set$2(this._pickedIdColor, 0, 0, 0, 0);\n          this._pickedId = 0;\n        }\n        if (this.transitionBuffers.length > 0 && this._quad.isInitialized) {\n          const viewport = this._viewportOffset;\n          this._postProcess(this.vMatrices[viewport], this.inverseVMatrices[viewport], this.pMatrices[viewport], this._viewports[viewport]);\n        }\n        if (this.isLassoPicking && this._lassoShader.isInitialized) {\n          this._lassoShader.vertexBuffer = this._lasso.vertexBuffer;\n          this._lassoShader.indexBuffer = this._lasso.indexBuffer;\n          const lassoWidth = this.lassoX1 - this.lassoX0;\n          const lassoHeight = this.lassoY1 - this.lassoY0;\n          this._lassoShader.prepare();\n          this._lassoShader.color = this.lassoColor ? this.lassoColor : this._core.config.lassoColor;\n          this._lassoShader.dashWidth = this.lassoDashWidth ? this.lassoDashWidth : this._core.config.lassoDashWidth;\n          this._lassoShader.apply();\n          const lassoThickness = this.lassoThickness ? this.lassoThickness : this._core.config.lassoThickness;\n          for (let i = 0; i < this._viewportCount; i++) {\n            const viewportIndex = i + this._viewportOffset;\n            this._shaderResources.bindFramebuffer(this._framebuffers[viewportIndex]);\n            const viewport = this._viewports[viewportIndex];\n            this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n            this._lassoMMatrix[0] = lassoWidth * 2 / viewport.width;\n            this._lassoMMatrix[5] = lassoHeight * 2 / viewport.height;\n            this._lassoMMatrix[10] = 1;\n            this._lassoMMatrix[12] = (this.lassoX0 + lassoWidth / 2) / viewport.width * 2 - 1;\n            this._lassoMMatrix[13] = 1 - (this.lassoY0 + lassoHeight / 2) / viewport.height * 2;\n            this._lassoShader.mMatrix = this._lassoMMatrix;\n            set(this._lassoThickness, lassoThickness / lassoWidth, lassoThickness / lassoHeight);\n            this._lassoShader.thickness = this._lassoThickness;\n            this._lassoShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._lasso.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n      });\n    }\n    _renderTransitionBuffer(transitionBuffer) {\n      const currentBuffer = transitionBuffer.currentBuffer;\n      const previousBuffer = transitionBuffer.previousBuffer;\n      const currentPalette = transitionBuffer.currentPalette;\n      const previousPalette = transitionBuffer.previousPalette;\n      const currentAtlas = transitionBuffer.currentAtlas;\n      const previousAtlas = transitionBuffer.previousAtlas;\n      const unitType = transitionBuffer.unitType === void 0 ? currentBuffer.unitType : transitionBuffer.unitType;\n      const id2 = currentBuffer.lookup[transitionBuffer.pickIdLookup[this._pickedId]];\n      const hoverId = id2 > -1 ? UnitVertex.getIdHover(currentBuffer.dataView, id2) : -1;\n      const activeId = transitionBuffer.activeId;\n      if (this._blockShader.isInitialized && (unitType == UnitType.block || unitType == UnitType.blockSdf)) {\n        this._blockShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._blockShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._blockShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._blockShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._blockShader.prepare();\n        this._blockShader.mMatrix = this.mMatrix;\n        this._blockShader.time = this.transitionTime;\n        this._blockShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._blockShader.rangeMin = currentBuffer.from;\n        this._blockShader.rangeMax = currentBuffer.to;\n        this._blockShader.hover = hoverId;\n        this._blockShader.active = activeId;\n        this._blockShader.specularPower = this._config.specularPower;\n        this._blockShader.specularIntensity = this._config.specularIntensity;\n        this._blockShader.apply();\n        this._blockShader.isPickShader = false;\n        this._blockShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._blockShader.vMatrix = this.vMatrices[viewport];\n          this._blockShader.pMatrix = this.pMatrices[viewport];\n          this._blockShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._gl.cullFace(this._gl.FRONT);\n          this._blockShader.isPickShader = false;\n          this._blockShader.isShadowMap = true;\n          this._blockShader.vMatrix = this._shadowVMatrix;\n          this._blockShader.pMatrix = this._shadowPMatrix;\n          this._blockShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n          this._gl.cullFace(this._gl.BACK);\n        }\n        if (this.isPickingEnabled) {\n          this._blockShader.isPickShader = true;\n          this._blockShader.isShadowMap = false;\n          this._blockShader.pMatrix = this.pickPMatrix;\n          this._blockShader.vMatrix = this.pickVMatrix;\n          this._blockShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._blockShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sphereShader.isInitialized && (unitType == UnitType.sphere || unitType == UnitType.sphereSdf)) {\n        this._sphereShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sphereShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sphereShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sphereShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sphereShader.prepare();\n        this._sphereShader.mMatrix = this.mMatrix;\n        this._sphereShader.time = this.transitionTime;\n        this._sphereShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sphereShader.rangeMin = currentBuffer.from;\n        this._sphereShader.rangeMax = currentBuffer.to;\n        this._sphereShader.hover = hoverId;\n        this._sphereShader.active = activeId;\n        this._sphereShader.specularPower = this._config.specularPower;\n        this._sphereShader.specularIntensity = this._config.specularIntensity;\n        this._sphereShader.apply();\n        this._sphereShader.isPickShader = false;\n        this._sphereShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._sphereShader.vMatrix = this.vMatrices[viewport];\n          this._sphereShader.pMatrix = this.pMatrices[viewport];\n          this._sphereShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._sphereShader.isPickShader = false;\n          this._sphereShader.isShadowMap = true;\n          this._sphereShader.vMatrix = this._shadowVMatrix;\n          this._sphereShader.pMatrix = this._shadowPMatrix;\n          this._sphereShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n        }\n        if (this.isPickingEnabled) {\n          this._sphereShader.isPickShader = true;\n          this._sphereShader.isShadowMap = false;\n          this._sphereShader.pMatrix = this.pickPMatrix;\n          this._sphereShader.vMatrix = this.pickVMatrix;\n          this._sphereShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sphereShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._cylinderShader.isInitialized && (unitType == UnitType.cylinder || unitType == UnitType.cylinderSdf)) {\n        this._cylinderShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._cylinderShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._cylinderShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._cylinderShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._cylinderShader.prepare();\n        this._cylinderShader.mMatrix = this.mMatrix;\n        this._cylinderShader.time = this.transitionTime;\n        this._cylinderShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._cylinderShader.rangeMin = currentBuffer.from;\n        this._cylinderShader.rangeMax = currentBuffer.to;\n        this._cylinderShader.hover = hoverId;\n        this._cylinderShader.active = activeId;\n        this._cylinderShader.specularPower = this._config.specularPower;\n        this._cylinderShader.specularIntensity = this._config.specularIntensity;\n        this._cylinderShader.apply();\n        this._cylinderShader.isPickShader = false;\n        this._cylinderShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._cylinderShader.vMatrix = this.vMatrices[viewport];\n          this._cylinderShader.pMatrix = this.pMatrices[viewport];\n          this._cylinderShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._cylinderShader.isPickShader = false;\n          this._cylinderShader.isShadowMap = true;\n          this._cylinderShader.vMatrix = this._shadowVMatrix;\n          this._cylinderShader.pMatrix = this._shadowPMatrix;\n          this._cylinderShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n        }\n        if (this.isPickingEnabled) {\n          this._cylinderShader.isPickShader = true;\n          this._cylinderShader.isShadowMap = false;\n          this._cylinderShader.pMatrix = this.pickPMatrix;\n          this._cylinderShader.vMatrix = this.pickVMatrix;\n          this._cylinderShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._cylinderShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      } else if (this._sdfShader.isInitialized && unitType == UnitType.sdf) {\n        this._sdfShader.instanceBuffer = currentBuffer.vertexBuffer;\n        this._sdfShader.previousInstanceBuffer = previousBuffer.vertexBuffer;\n        this._sdfShader.paletteTexture = currentPalette.texture || currentPalette.defaultTexture;\n        this._sdfShader.previousPaletteTexture = previousPalette.texture || previousPalette.defaultTexture;\n        this._sdfShader.sdfTexture = currentAtlas.texture || currentAtlas.defaultTexture;\n        this._sdfShader.previousSdfTexture = previousAtlas.texture || previousAtlas.defaultTexture;\n        this._sdfShader.prepare();\n        this._sdfShader.mMatrix = this.mMatrix;\n        this._sdfShader.time = this.transitionTime;\n        this._sdfShader.duration = this._core.config.transitionDuration / (this._core.config.transitionDuration + this._core.config.transitionStaggering);\n        this._sdfShader.rangeMin = currentBuffer.from;\n        this._sdfShader.rangeMax = currentBuffer.to;\n        this._sdfShader.hover = hoverId;\n        this._sdfShader.active = activeId;\n        this._sdfShader.specularPower = this._config.specularPower;\n        this._sdfShader.specularIntensity = this._config.specularIntensity;\n        this._sdfShader.apply();\n        this._sdfShader.isPickShader = false;\n        this._sdfShader.isShadowMap = false;\n        this._shaderResources.bindFramebuffer(this._geometryFrameBuffer);\n        for (let i = 0; i < this._viewportCount; i++) {\n          const viewport = i + this._viewportOffset;\n          this._gl.viewport(this._viewports[viewport].x, this._viewports[viewport].y, this._viewports[viewport].width, this._viewports[viewport].height);\n          this._sdfShader.vMatrix = this.vMatrices[viewport];\n          this._sdfShader.pMatrix = this.pMatrices[viewport];\n          this._sdfShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n        if (this._config.isShadowEnabled) {\n          this._shaderResources.bindFramebuffer(this._shadowFrameBuffer);\n          this._gl.viewport(0, 0, this._config.shadowWidth, this._config.shadowHeight);\n          this._gl.cullFace(this._gl.FRONT);\n          this._sdfShader.isPickShader = false;\n          this._sdfShader.isShadowMap = true;\n          this._sdfShader.vMatrix = this._shadowVMatrix;\n          this._sdfShader.pMatrix = this._shadowPMatrix;\n          this._sdfShader.applyView();\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n          this._gl.colorMask(true, true, true, true);\n          this._gl.cullFace(this._gl.BACK);\n        }\n        if (this.isPickingEnabled) {\n          this._sdfShader.isPickShader = true;\n          this._sdfShader.isShadowMap = false;\n          this._sdfShader.pMatrix = this.pickPMatrix;\n          this._sdfShader.vMatrix = this.pickVMatrix;\n          this._sdfShader.applyView();\n          this._shaderResources.bindFramebuffer(this._pickFrameBuffer);\n          this._gl.viewport(0, 0, this._core.config.pickWidth, this._core.config.pickHeight);\n          this._gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, this._sdfShader.indexCount, this._gl.UNSIGNED_SHORT, 0, transitionBuffer.length);\n        }\n      }\n    }\n    _postProcess(vMatrix, inverseVMatrix, pMatrix, viewport) {\n      if (this._deferredShader.isInitialized) {\n        this._gl.disable(this._gl.DEPTH_TEST);\n        let ssaoTexture;\n        if (this._config.isSsaoEnabled && this._ssaoShader.isInitialized) {\n          this._gl.viewport(0, 0, this._config.ssaoWidth, this._config.ssaoHeight);\n          ssaoTexture = this._ssaoTexture1;\n          this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer1);\n          this._ssaoShader.vertexBuffer = this._quad.vertexBuffer;\n          this._ssaoShader.indexBuffer = this._quad.indexBuffer;\n          this._ssaoShader.texture2D1 = this._positionTexture;\n          this._ssaoShader.texture2D2 = this._normalTexture;\n          this._ssaoShader.texture2D3 = this._ssaoNoiseTexture;\n          this._ssaoShader.prepare();\n          this._ssaoShader.pMatrix = pMatrix;\n          this._ssaoShader.ssaoNoiseSize = this._config.ssaoNoiseSize;\n          this._ssaoShader.ssaoRadius = this._config.ssaoRadius;\n          this._ssaoShader.ssaoPower = this._config.ssaoPower;\n          this._ssaoShader.ssaoKernel = this._ssaoSampleKernel;\n          this._ssaoShader.left = 0;\n          this._ssaoShader.top = 0;\n          this._ssaoShader.width = this._config.ssaoWidth;\n          this._ssaoShader.height = this._config.ssaoHeight;\n          this._ssaoShader.apply();\n          this._ssaoShader.applyView();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          if (this._config.ssaoBlurEnabled && this._boxShader.isInitialized) {\n            ssaoTexture = this._ssaoTexture2;\n            this._shaderResources.bindFramebuffer(this._ssaoFrameBuffer2);\n            this._boxShader.vertexBuffer = this._quad.vertexBuffer;\n            this._boxShader.indexBuffer = this._quad.indexBuffer;\n            this._boxShader.texture2D = this._ssaoTexture1;\n            this._boxShader.prepare();\n            this._boxShader.left = 0;\n            this._boxShader.top = 0;\n            this._boxShader.width = this._config.ssaoWidth;\n            this._boxShader.height = this._config.ssaoHeight;\n            this._boxShader.apply();\n            this._boxShader.applyView();\n            this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          }\n        }\n        this._gl.viewport(viewport.left, viewport.top, viewport.width, viewport.height);\n        let postProcessFrameBuffer = this._postProcessFrameBuffer1;\n        this._shaderResources.bindFramebuffer(postProcessFrameBuffer);\n        this._deferredShader.vertexBuffer = this._quad.vertexBuffer;\n        this._deferredShader.indexBuffer = this._quad.indexBuffer;\n        this._deferredShader.texture2D1 = this._positionTexture;\n        this._deferredShader.texture2D2 = this._colorTexture;\n        this._deferredShader.texture2D3 = this._normalTexture;\n        this._deferredShader.texture2D4 = this._config.isSsaoEnabled ? ssaoTexture : null;\n        this._deferredShader.texture2D5 = this._shadowDepthTexture;\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_S, this._gl.CLAMP_TO_EDGE);\n        this._gl.texParameteri(this._gl.TEXTURE_2D, this._gl.TEXTURE_WRAP_T, this._gl.CLAMP_TO_EDGE);\n        this._deferredShader.prepare();\n        this._deferredShader.isShadowEnabled = this._config.isShadowEnabled;\n        this._deferredShader.isSsaoEnabled = this._config.isSsaoEnabled;\n        this._deferredShader.inverseVMatrix = inverseVMatrix;\n        this._deferredShader.shadowVMatrix = this._shadowVMatrix;\n        this._deferredShader.shadowPMatrix = this._shadowPMatrix;\n        this._deferredShader.vMatrix = vMatrix;\n        this._deferredShader.keyLightIntensity = this._config.keyLightIntensity;\n        this._deferredShader.fillLight1Intensity = this._config.fillLight1Intensity;\n        this._deferredShader.fillLight2Intensity = this._config.fillLight2Intensity;\n        this._core.camera.getPosition(this._cameraPosition);\n        fromMat4(this._cameraRotation, vMatrix);\n        set$3(this._position, this.mMatrix[12], this.mMatrix[13], this.mMatrix[14]);\n        normalize$2(this._deferredShader.directionToKeyLight, this._config.keyLightPosition);\n        subtract(this._direction, this._cameraPosition, this._position);\n        normalize$2(this._direction, this._direction);\n        add(this._deferredShader.keyLightHalfAngle, this._direction, this._deferredShader.directionToKeyLight);\n        normalize$2(this._deferredShader.keyLightHalfAngle, this._deferredShader.keyLightHalfAngle);\n        copy$3(this._deferredShader.directionToFillLight1, this._config.fillLight1Position);\n        copy$3(this._deferredShader.directionToFillLight2, this._config.fillLight2Position);\n        this._deferredShader.left = viewport.left;\n        this._deferredShader.top = viewport.top;\n        this._deferredShader.width = viewport.width;\n        this._deferredShader.height = viewport.height;\n        this._deferredShader.shadowMapWidth = this._config.shadowWidth;\n        this._deferredShader.shadowMapHeight = this._config.shadowHeight;\n        this._deferredShader.ambientIntensity = this._config.ambientIntensity;\n        this._deferredShader.materialIntensity = this._config.materialIntensity;\n        this._deferredShader.specularPower = this._config.specularPower;\n        this._deferredShader.specularIntensity = this._config.specularIntensity;\n        this._deferredShader.apply();\n        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        const widthHalf = Math.round(viewport.width / 2);\n        const heightHalf = Math.round(viewport.height / 2);\n        const widthQuarter = Math.round(widthHalf / 2);\n        const heightQuarter = Math.round(heightHalf / 2);\n        const widthEighth = Math.round(widthQuarter / 2);\n        const heightEighth = Math.round(heightQuarter / 2);\n        const widthSixteenth = Math.round(widthEighth / 2);\n        const heightSixteenth = Math.round(heightEighth / 2);\n        if (this._config.isDofEnabled && this._dofBlurShader.isInitialized && this._dofCombineShader.isInitialized) {\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessDofFrameBuffer);\n          this._dofBlurShader.vertexBuffer = this._quad.vertexBuffer;\n          this._dofBlurShader.indexBuffer = this._quad.indexBuffer;\n          this._dofBlurShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._dofBlurShader.texture2D2 = this._positionTexture;\n          this._dofBlurShader.prepare();\n          this._dofBlurShader.focusDepth = this._config.dofFocusDistance;\n          this._dofBlurShader.nearFocusDepth = this._config.dofFocusDistance - this._config.dofFocusRange / 2;\n          this._dofBlurShader.farFocusDepth = this._config.dofFocusDistance + this._config.dofFocusRange / 2;\n          this._dofBlurShader.maxBackgroundBlur = this._config.dofMaxBackgroundBlur;\n          this._dofBlurShader.left = viewport.left;\n          this._dofBlurShader.top = viewport.top;\n          this._dofBlurShader.width = viewport.width;\n          this._dofBlurShader.height = viewport.height;\n          this._dofBlurShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n          this._dofCombineShader.vertexBuffer = this._quad.vertexBuffer;\n          this._dofCombineShader.indexBuffer = this._quad.indexBuffer;\n          this._dofCombineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._dofCombineShader.texture2D2 = this._postProcessDofTexture;\n          this._dofCombineShader.prepare();\n          this._dofCombineShader.focusDepth = this._config.dofFocusDistance;\n          this._dofCombineShader.left = viewport.left;\n          this._dofCombineShader.top = viewport.top;\n          this._dofCombineShader.width = viewport.width;\n          this._dofCombineShader.height = viewport.height;\n          this._dofCombineShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this._config.isBloomEnabled && this._brightPassShader.isInitialized && this._gaussianShader.isInitialized) {\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthHalf;\n          this._brightPassShader.height = heightHalf;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessHalfTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthQuarter;\n          this._brightPassShader.height = heightQuarter;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessQuarterTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthEighth;\n          this._brightPassShader.height = heightEighth;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n          this._brightPassShader.vertexBuffer = this._quad.vertexBuffer;\n          this._brightPassShader.indexBuffer = this._quad.indexBuffer;\n          this._brightPassShader.texture2D = this._postProcessEighthTexture1;\n          this._brightPassShader.prepare();\n          this._brightPassShader.width = widthSixteenth;\n          this._brightPassShader.height = heightSixteenth;\n          this._brightPassShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessHalfTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthHalf;\n          this._gaussianShader.height = heightHalf;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessHalfFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessHalfTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessQuarterTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthQuarter;\n          this._gaussianShader.height = heightQuarter;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessQuarterFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessQuarterTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessEighthTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthEighth;\n          this._gaussianShader.height = heightEighth;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessEighthFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessEighthTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer2);\n          this._gaussianShader.vertexBuffer = this._quad.vertexBuffer;\n          this._gaussianShader.indexBuffer = this._quad.indexBuffer;\n          this._gaussianShader.texture2D = this._postProcessSixteenthTexture1;\n          this._gaussianShader.prepare();\n          this._gaussianShader.width = widthSixteenth;\n          this._gaussianShader.height = heightSixteenth;\n          this._gaussianShader.horizontal = true;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, this._postProcessSixteenthFrameBuffer1);\n          this._gaussianShader.texture2D = this._postProcessSixteenthTexture2;\n          this._gaussianShader.prepare();\n          this._gaussianShader.horizontal = false;\n          this._gaussianShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        if (this._config.isFxaaEnabled && this._fxaaShader.isInitialized) {\n          postProcessFrameBuffer = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessFrameBuffer2 : this._postProcessFrameBuffer1;\n          this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, postProcessFrameBuffer);\n          this._fxaaShader.vertexBuffer = this._quad.vertexBuffer;\n          this._fxaaShader.indexBuffer = this._quad.indexBuffer;\n          this._fxaaShader.texture2D = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture2 : this._postProcessTexture1;\n          this._fxaaShader.prepare();\n          this._fxaaShader.left = viewport.left;\n          this._fxaaShader.top = viewport.top;\n          this._fxaaShader.width = viewport.width;\n          this._fxaaShader.height = viewport.height;\n          this._fxaaShader.apply();\n          this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n        }\n        this._shaderResources.bindFramebuffer(null);\n        this._gl.clear(this._gl.COLOR_BUFFER_BIT | this._gl.DEPTH_BUFFER_BIT);\n        this._gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);\n        this._combineShader.vertexBuffer = this._quad.vertexBuffer;\n        this._combineShader.indexBuffer = this._quad.indexBuffer;\n        this._combineShader.texture2D1 = postProcessFrameBuffer == this._postProcessFrameBuffer1 ? this._postProcessTexture1 : this._postProcessTexture2;\n        if (this._config.isBloomEnabled) {\n          this._combineShader.texture2D2 = this._postProcessHalfTexture1;\n          this._combineShader.texture2D3 = this._postProcessQuarterTexture1;\n          this._combineShader.texture2D4 = this._postProcessEighthTexture1;\n          this._combineShader.texture2D5 = this._postProcessSixteenthTexture1;\n        } else {\n          this._combineShader.texture2D2 = null;\n          this._combineShader.texture2D3 = null;\n          this._combineShader.texture2D4 = null;\n          this._combineShader.texture2D5 = null;\n        }\n        this._combineShader.prepare();\n        this._combineShader.viewport = viewport;\n        this._combineShader.intensity = this._config.bloomIntensity;\n        this._combineShader.apply();\n        this._gl.drawElements(this._gl.TRIANGLES, this._quad.indexCount, this._gl.UNSIGNED_SHORT, 0);\n      }\n    }\n  }\n  (function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  });\n  class MaterialBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * MaterialBufferData.SIZE);\n      this.TYPE_OFFSET = 0 / 4;\n      this.FUZZ_OFFSET = 4 / 4;\n      this.REFRACTIVE_INDEX_OFFSET = 8 / 4;\n      this.TEXTURE_ID_OFFSET = 12 / 4;\n      this.COLOR_OFFSET = 16 / 4;\n      this.GLOSSINESS_OFFSET = 28 / 4;\n      this.ID_COLOR_OFFSET = 32 / 4;\n      this.DENSITY_OFFSET = 48 / 4;\n    }\n    getType(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getFuzz(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.FUZZ_OFFSET];\n    }\n    setFuzz(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.FUZZ_OFFSET] = value2;\n    }\n    getRefractiveIndex(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.REFRACTIVE_INDEX_OFFSET];\n    }\n    setRefractiveIndex(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.REFRACTIVE_INDEX_OFFSET] = value2;\n    }\n    getTextureId(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.TEXTURE_ID_OFFSET];\n    }\n    setTextureId(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.TEXTURE_ID_OFFSET] = value2;\n    }\n    getColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getGlossiness(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.GLOSSINESS_OFFSET];\n    }\n    setGlossiness(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.GLOSSINESS_OFFSET] = value2;\n    }\n    getDensity(index2) {\n      return this[MaterialBufferData.SIZE * index2 + this.DENSITY_OFFSET];\n    }\n    setDensity(index2, value2) {\n      this[MaterialBufferData.SIZE * index2 + this.DENSITY_OFFSET] = value2;\n    }\n    getIdColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.ID_COLOR_OFFSET;\n      set$2(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setIdColor(index2, value2) {\n      const offset2 = MaterialBufferData.SIZE * index2 + this.ID_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  MaterialBufferData.SIZE = 64 / 4;\n  class TextureBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * TextureBufferData.SIZE);\n      this.COLOR0_OFFSET = 0 / 4;\n      this.TYPE_OFFSET = 12 / 4;\n      this.COLOR1_OFFSET = 16 / 4;\n      this.SIZE0_OFFSET = 32 / 4;\n      this.SIZE1_OFFSET = 48 / 4;\n      this.CLIP_OFFSET = 64 / 4;\n      this.OFFSET_OFFSET = 80 / 4;\n    }\n    getType(index2) {\n      return this[TextureBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[TextureBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getColor0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR0_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getColor1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR1_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.COLOR1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      set$2(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setSize0(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getSize1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      set$2(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setSize1(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getClip(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.CLIP_OFFSET;\n      set$2(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setClip(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.CLIP_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getOffset(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.OFFSET_OFFSET;\n      set(value2, this[offset2], this[offset2 + 1]);\n    }\n    setOffset(index2, value2) {\n      const offset2 = TextureBufferData.SIZE * index2 + this.OFFSET_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n  }\n  TextureBufferData.SIZE = 96 / 4;\n  class HittableBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * HittableBufferData.SIZE);\n      this.CENTER0_OFFSET = 0 / 4;\n      this.TYPE_OFFSET = 12 / 4;\n      this.SIZE0_OFFSET = 16 / 4;\n      this.MATERIAL_ID_OFFSET = 28 / 4;\n      this.ROTATION0_OFFSET = 32 / 4;\n      this.ROTATION1_OFFSET = 48 / 4;\n      this.TEXCOORD0_OFFSET = 64 / 4;\n      this.TEXCOORD1_OFFSET = 72 / 4;\n      this.CENTER1_OFFSET = 80 / 4;\n      this.ROUNDING_OFFSET = 92 / 4;\n      this.SIZE1_OFFSET = 96 / 4;\n      this.BOUNDARY_TYPE_OFFSET = 108 / 4;\n      this.TIME0_OFFSET = 112 / 4;\n      this.TIME1_OFFSET = 116 / 4;\n      this.TEX_ID_OFFSET = 120 / 4;\n      this.SDF_BUFFER_OFFSET = 124 / 4;\n      this.SDF_BORDER_OFFSET = 128 / 4;\n      this.PARAMETER_1_OFFSET = 132 / 4;\n      this.PARAMETER_2_OFFSET = 136 / 4;\n      this.MATERIAL_FUZZ_OFFSET = 140 / 4;\n      this.MATERIAL_GLOSS_OFFSET = 144 / 4;\n      this.MATERIAL_DENSITY_OFFSET = 148 / 4;\n      this.MATERIAL_REFRACTIVE_INDEX_OFFSET = 152 / 4;\n      this.MATERIAL_COLOR_OFFSET = 160 / 4;\n      this.MATERIAL_TYPE_ID_OFFSET = 172 / 4;\n      this.SEGMENT_COLOR_OFFSET = 176 / 4;\n      this.TEXTURE_TYPE_ID_OFFSET = 192 / 4;\n      this.TEXTURE_ID_OFFSET = 196 / 4;\n    }\n    getType(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getCenter0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER0_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getCenter1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER1_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.CENTER1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getTime0(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TIME0_OFFSET];\n    }\n    setTime0(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TIME0_OFFSET] = value2;\n    }\n    getTime1(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TIME1_OFFSET];\n    }\n    setTime1(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TIME1_OFFSET] = value2;\n    }\n    getSize0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SIZE1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getRotation0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION0_OFFSET;\n      set$1(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getRotation1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION1_OFFSET;\n      set$1(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.ROTATION1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n    getTexCoord0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD0_OFFSET;\n      set(value2, this[offset2], this[offset2 + 1]);\n    }\n    setTexCoord0(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD0_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n    getTexCoord1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD1_OFFSET;\n      set(value2, this[offset2], this[offset2 + 1]);\n    }\n    setTexCoord1(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.TEXCOORD1_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n    }\n    getRounding(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.ROUNDING_OFFSET];\n    }\n    setRounding(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.ROUNDING_OFFSET] = value2;\n    }\n    getParameter1(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.PARAMETER_1_OFFSET];\n    }\n    setParameter1(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.PARAMETER_1_OFFSET] = value2;\n    }\n    getParameter2(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.PARAMETER_2_OFFSET];\n    }\n    setParameter2(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.PARAMETER_2_OFFSET] = value2;\n    }\n    getBoundaryType(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.BOUNDARY_TYPE_OFFSET];\n    }\n    setBoundaryType(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.BOUNDARY_TYPE_OFFSET] = value2;\n    }\n    getTexId(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.TEX_ID_OFFSET];\n    }\n    setTexId(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.TEX_ID_OFFSET] = value2;\n    }\n    getSdfBuffer(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.SDF_BUFFER_OFFSET];\n    }\n    setSdfBuffer(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.SDF_BUFFER_OFFSET] = value2;\n    }\n    getSdfBorder(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.SDF_BORDER_OFFSET];\n    }\n    setSdfBorder(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.SDF_BORDER_OFFSET] = value2;\n    }\n    getMaterialTypeId(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_TYPE_ID_OFFSET];\n    }\n    setMaterialTypeId(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_TYPE_ID_OFFSET] = value2;\n    }\n    getMaterialFuzz(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_FUZZ_OFFSET];\n    }\n    setMaterialFuzz(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_FUZZ_OFFSET] = value2;\n    }\n    getMaterialDensity(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_DENSITY_OFFSET];\n    }\n    setMaterialDensity(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_DENSITY_OFFSET] = value2;\n    }\n    getMaterialGloss(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_GLOSS_OFFSET];\n    }\n    setMaterialGloss(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_GLOSS_OFFSET] = value2;\n    }\n    getMaterialRefractiveIndex(index2) {\n      return this[HittableBufferData.SIZE * index2 + this.MATERIAL_REFRACTIVE_INDEX_OFFSET];\n    }\n    setMaterialRefractiveIndex(index2, value2) {\n      this[HittableBufferData.SIZE * index2 + this.MATERIAL_REFRACTIVE_INDEX_OFFSET] = value2;\n    }\n    getMaterialColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.MATERIAL_COLOR_OFFSET;\n      value2[0] = this[offset2];\n      value2[1] = this[offset2 + 1];\n      value2[2] = this[offset2 + 2];\n    }\n    setMaterialColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.MATERIAL_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSegmentColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SEGMENT_COLOR_OFFSET;\n      value2[0] = this[offset2];\n      value2[1] = this[offset2 + 1];\n      value2[2] = this[offset2 + 2];\n      value2[3] = this[offset2 + 3];\n    }\n    setSegmentColor(index2, value2) {\n      const offset2 = HittableBufferData.SIZE * index2 + this.SEGMENT_COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  HittableBufferData.SIZE = 208 / 4;\n  class ComputeUniformBufferData extends Float32Array {\n    constructor() {\n      super(ComputeUniformBufferData.SIZE);\n      this.POSITION_OFFSET = 0 / 4;\n      this.WIDTH_OFFSET = 12 / 4;\n      this.RIGHT_OFFSET = 16 / 4;\n      this.HEIGHT_OFFSET = 28 / 4;\n      this.UP_OFFSET = 32 / 4;\n      this.SEED_OFFSET = 44 / 4;\n      this.FORWARD_OFFSET = 48 / 4;\n      this.FOV_OFFSET = 60 / 4;\n      this.BACKGROUND_COLOR_OFFSET = 64 / 4;\n      this.TIME0_OFFSET = 76 / 4;\n      this.AMBIENT_COLOR_OFFSET = 80 / 4;\n      this.TIME1_OFFSET = 92 / 4;\n      this.TILES_X = 96 / 4;\n      this.TILES_Y = 100 / 4;\n      this.TILE_OFFSET_X = 104 / 4;\n      this.TILE_OFFSET_Y = 108 / 4;\n      this.LOOKAT_OFFSET = 112 / 4;\n      this.APERTURE_OFFSET = 124 / 4;\n      this.FOCUS_DISTANCE_OFFSET = 128 / 4;\n      this.RAYS_PER_FRAME_OFFSET = 132 / 4;\n    }\n    getFocusDistance() {\n      return this[this.FOCUS_DISTANCE_OFFSET];\n    }\n    setFocusDistance(value2) {\n      this[this.FOCUS_DISTANCE_OFFSET] = value2;\n    }\n    getWidth() {\n      return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value2) {\n      this[this.WIDTH_OFFSET] = value2;\n    }\n    getHeight() {\n      return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value2) {\n      this[this.HEIGHT_OFFSET] = value2;\n    }\n    getSeed() {\n      return this[this.SEED_OFFSET];\n    }\n    setSeed(value2) {\n      this[this.SEED_OFFSET] = value2;\n    }\n    getRaysPerFrame() {\n      return this[this.RAYS_PER_FRAME_OFFSET];\n    }\n    setRaysPerFrame(value2) {\n      this[this.RAYS_PER_FRAME_OFFSET] = value2;\n    }\n    getFieldOfView() {\n      return this[this.FOV_OFFSET];\n    }\n    setFieldOfView(value2) {\n      this[this.FOV_OFFSET] = value2;\n    }\n    getAperture() {\n      return this[this.APERTURE_OFFSET];\n    }\n    setAperture(value2) {\n      this[this.APERTURE_OFFSET] = value2;\n    }\n    getPosition(value2) {\n      set$3(value2, this[this.POSITION_OFFSET], this[this.POSITION_OFFSET + 1], this[this.POSITION_OFFSET + 2]);\n    }\n    setPosition(value2) {\n      this[this.POSITION_OFFSET] = value2[0];\n      this[this.POSITION_OFFSET + 1] = value2[1];\n      this[this.POSITION_OFFSET + 2] = value2[2];\n    }\n    getRight(value2) {\n      set$3(value2, this[this.RIGHT_OFFSET], this[this.RIGHT_OFFSET + 1], this[this.RIGHT_OFFSET + 2]);\n    }\n    setRight(value2) {\n      this[this.RIGHT_OFFSET] = value2[0];\n      this[this.RIGHT_OFFSET + 1] = value2[1];\n      this[this.RIGHT_OFFSET + 2] = value2[2];\n    }\n    getUp(value2) {\n      set$3(value2, this[this.UP_OFFSET], this[this.UP_OFFSET + 1], this[this.UP_OFFSET + 2]);\n    }\n    setUp(value2) {\n      this[this.UP_OFFSET] = value2[0];\n      this[this.UP_OFFSET + 1] = value2[1];\n      this[this.UP_OFFSET + 2] = value2[2];\n    }\n    getForward(value2) {\n      set$3(value2, this[this.FORWARD_OFFSET], this[this.FORWARD_OFFSET + 1], this[this.FORWARD_OFFSET + 2]);\n    }\n    setForward(value2) {\n      this[this.FORWARD_OFFSET] = value2[0];\n      this[this.FORWARD_OFFSET + 1] = value2[1];\n      this[this.FORWARD_OFFSET + 2] = value2[2];\n    }\n    getBackgroundColor(value2) {\n      set$2(value2, this[this.BACKGROUND_COLOR_OFFSET], this[this.BACKGROUND_COLOR_OFFSET + 1], this[this.BACKGROUND_COLOR_OFFSET + 2], this[this.BACKGROUND_COLOR_OFFSET + 3]);\n    }\n    setBackgroundColor(value2) {\n      this[this.BACKGROUND_COLOR_OFFSET] = value2[0];\n      this[this.BACKGROUND_COLOR_OFFSET + 1] = value2[1];\n      this[this.BACKGROUND_COLOR_OFFSET + 2] = value2[2];\n      this[this.BACKGROUND_COLOR_OFFSET + 3] = value2[3];\n    }\n    getAmbientColor(value2) {\n      set$3(value2, this[this.AMBIENT_COLOR_OFFSET], this[this.AMBIENT_COLOR_OFFSET + 1], this[this.AMBIENT_COLOR_OFFSET + 2]);\n    }\n    setAmbientColor(value2) {\n      this[this.AMBIENT_COLOR_OFFSET] = value2[0];\n      this[this.AMBIENT_COLOR_OFFSET + 1] = value2[1];\n      this[this.AMBIENT_COLOR_OFFSET + 2] = value2[2];\n    }\n    getTime0() {\n      return this[this.TIME0_OFFSET];\n    }\n    setTime0(value2) {\n      this[this.TIME0_OFFSET] = value2;\n    }\n    getTime1() {\n      return this[this.TIME1_OFFSET];\n    }\n    setTime1(value2) {\n      this[this.TIME1_OFFSET] = value2;\n    }\n    getTilesX() {\n      return this[this.TILES_X];\n    }\n    setTilesX(value2) {\n      this[this.TILES_X] = value2;\n    }\n    getTilesY() {\n      return this[this.TILES_Y];\n    }\n    setTilesY(value2) {\n      this[this.TILES_Y] = value2;\n    }\n    getTileOffsetX() {\n      return this[this.TILE_OFFSET_X];\n    }\n    setTileOffsetX(value2) {\n      this[this.TILE_OFFSET_X] = value2;\n    }\n    getTileOffsetY() {\n      return this[this.TILE_OFFSET_Y];\n    }\n    setTileOffsetY(value2) {\n      this[this.TILE_OFFSET_Y] = value2;\n    }\n    getLookAt(value2) {\n      set$3(value2, this[this.LOOKAT_OFFSET], this[this.LOOKAT_OFFSET + 1], this[this.LOOKAT_OFFSET + 2]);\n    }\n    setLookAt(value2) {\n      this[this.LOOKAT_OFFSET] = value2[0];\n      this[this.LOOKAT_OFFSET + 1] = value2[1];\n      this[this.LOOKAT_OFFSET + 2] = value2[2];\n    }\n  }\n  ComputeUniformBufferData.SIZE = 144 / 4;\n  class FullscreenQuadUniformBufferData extends Float32Array {\n    constructor() {\n      super(FullscreenQuadUniformBufferData.SIZE);\n      this.WIDTH_OFFSET = 0 / 4;\n      this.HEIGHT_OFFSET = 4 / 4;\n      this.SPP_OFFSET = 8 / 4;\n      this.EXPOSURE_OFFSET = 12 / 4;\n      this.MIN_DEPTH_OFFSET = 16 / 4;\n      this.MAX_DEPTH_OFFSET = 20 / 4;\n      this.EDGE_NORMAL_OFFSET = 24 / 4;\n      this.EDGE_DEPTH_OFFSET = 28 / 4;\n      this.EDGE_FOREGROUND_OFFSET = 32 / 4;\n      this.EDGE_BACKGROUND_OFFSET = 48 / 4;\n    }\n    getWidth() {\n      return this[this.WIDTH_OFFSET];\n    }\n    setWidth(value2) {\n      this[this.WIDTH_OFFSET] = value2;\n    }\n    getHeight() {\n      return this[this.HEIGHT_OFFSET];\n    }\n    setHeight(value2) {\n      this[this.HEIGHT_OFFSET] = value2;\n    }\n    getSamplesPerPixel() {\n      return this[this.SPP_OFFSET];\n    }\n    setSamplesPerPixel(value2) {\n      this[this.SPP_OFFSET] = value2;\n    }\n    getExposure() {\n      return this[this.EXPOSURE_OFFSET];\n    }\n    setExposure(value2) {\n      this[this.EXPOSURE_OFFSET] = value2;\n    }\n    getMinDepth() {\n      return this[this.MIN_DEPTH_OFFSET];\n    }\n    setMinDepth(value2) {\n      this[this.MIN_DEPTH_OFFSET] = value2;\n    }\n    getMaxDepth() {\n      return this[this.MAX_DEPTH_OFFSET];\n    }\n    setMaxDepth(value2) {\n      this[this.MAX_DEPTH_OFFSET] = value2;\n    }\n    getEdgeDepth() {\n      return this[this.EDGE_DEPTH_OFFSET];\n    }\n    setEdgeDepth(value2) {\n      this[this.EDGE_DEPTH_OFFSET] = value2;\n    }\n    getEdgeNormal() {\n      return this[this.EDGE_NORMAL_OFFSET];\n    }\n    setEdgeNormal(value2) {\n      this[this.EDGE_NORMAL_OFFSET] = value2;\n    }\n    getEdgeForeground(value2) {\n      set$2(value2, this[this.EDGE_FOREGROUND_OFFSET], this[this.EDGE_FOREGROUND_OFFSET + 1], this[this.EDGE_FOREGROUND_OFFSET + 2], this[this.EDGE_FOREGROUND_OFFSET + 3]);\n    }\n    setEdgeForeground(value2) {\n      this[this.EDGE_FOREGROUND_OFFSET] = value2[0];\n      this[this.EDGE_FOREGROUND_OFFSET + 1] = value2[1];\n      this[this.EDGE_FOREGROUND_OFFSET + 2] = value2[2];\n      this[this.EDGE_FOREGROUND_OFFSET + 3] = value2[3];\n    }\n    getEdgeBackground(value2) {\n      set$2(value2, this[this.EDGE_BACKGROUND_OFFSET], this[this.EDGE_BACKGROUND_OFFSET + 1], this[this.EDGE_BACKGROUND_OFFSET + 2], this[this.EDGE_BACKGROUND_OFFSET + 3]);\n    }\n    setEdgeBackground(value2) {\n      this[this.EDGE_BACKGROUND_OFFSET] = value2[0];\n      this[this.EDGE_BACKGROUND_OFFSET + 1] = value2[1];\n      this[this.EDGE_BACKGROUND_OFFSET + 2] = value2[2];\n      this[this.EDGE_BACKGROUND_OFFSET + 3] = value2[3];\n    }\n  }\n  FullscreenQuadUniformBufferData.SIZE = 64 / 4;\n  class LinearBVHNodeBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * LinearBVHNodeBufferData.SIZE);\n      this.CENTER_OFFSET = 0 / 4;\n      this.SIZE_OFFSET = 16 / 4;\n      this.PRIMITIVES_OFFSET_OFFSET = 12 / 4;\n      this.SECOND_CHILD_OFFSET_OFFSET = 28 / 4;\n      this.N_PRIMITIVES_OFFSET = 32 / 4;\n      this.AXIS_OFFSET = 36 / 4;\n    }\n    getCenter(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize(index2, value2) {\n      const offset2 = LinearBVHNodeBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getPrimitivesOffset(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.PRIMITIVES_OFFSET_OFFSET];\n    }\n    setPrimitivesOffset(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.PRIMITIVES_OFFSET_OFFSET] = value2;\n    }\n    getSecondChildOffset(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.SECOND_CHILD_OFFSET_OFFSET];\n    }\n    setSecondChildOffset(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.SECOND_CHILD_OFFSET_OFFSET] = value2;\n    }\n    getNPrimitives(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.N_PRIMITIVES_OFFSET];\n    }\n    setNPrimitives(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.N_PRIMITIVES_OFFSET] = value2;\n    }\n    getAxis(index2) {\n      return this[LinearBVHNodeBufferData.SIZE * index2 + this.AXIS_OFFSET];\n    }\n    setAxis(index2, value2) {\n      this[LinearBVHNodeBufferData.SIZE * index2 + this.AXIS_OFFSET] = value2;\n    }\n  }\n  LinearBVHNodeBufferData.SIZE = 48 / 4;\n  class LightBufferData extends Float32Array {\n    constructor(count2) {\n      super(count2 * LightBufferData.SIZE);\n      this.ROTATION_OFFSET = 0 / 4;\n      this.CENTER_OFFSET = 16 / 4;\n      this.TYPE_OFFSET = 28 / 4;\n      this.SIZE_OFFSET = 32 / 4;\n      this.COLOR_OFFSET = 48 / 4;\n    }\n    getType(index2) {\n      return this[LightBufferData.SIZE * index2 + this.TYPE_OFFSET];\n    }\n    setType(index2, value2) {\n      this[LightBufferData.SIZE * index2 + this.TYPE_OFFSET] = value2;\n    }\n    getCenter(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setCenter(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.CENTER_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getSize(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setSize(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.SIZE_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getColor(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      set$3(value2, this[offset2], this[offset2 + 1], this[offset2 + 2]);\n    }\n    setColor(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.COLOR_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n    }\n    getRotation(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.ROTATION_OFFSET;\n      set$1(value2, this[offset2], this[offset2 + 1], this[offset2 + 2], this[offset2 + 3]);\n    }\n    setRotation(index2, value2) {\n      const offset2 = LightBufferData.SIZE * index2 + this.ROTATION_OFFSET;\n      this[offset2] = value2[0];\n      this[offset2 + 1] = value2[1];\n      this[offset2 + 2] = value2[2];\n      this[offset2 + 3] = value2[3];\n    }\n  }\n  LightBufferData.SIZE = 64 / 4;\n  (function(thisArg, _arguments, P, generator) {\n    function adopt(value2) {\n      return value2 instanceof P ? value2 : new P(function(resolve2) {\n        resolve2(value2);\n      });\n    }\n    return new (P || (P = Promise))(function(resolve2, reject) {\n      function fulfilled(value2) {\n        try {\n          step(generator.next(value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function rejected(value2) {\n        try {\n          step(generator[\"throw\"](value2));\n        } catch (e) {\n          reject(e);\n        }\n      }\n      function step(result) {\n        result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected);\n      }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n  });\n  var isMergeableObject = function isMergeableObject2(value2) {\n    return isNonNullObject(value2) && !isSpecial(value2);\n  };\n  function isNonNullObject(value2) {\n    return !!value2 && typeof value2 === \"object\";\n  }\n  function isSpecial(value2) {\n    var stringValue = Object.prototype.toString.call(value2);\n    return stringValue === \"[object RegExp]\" || stringValue === \"[object Date]\" || isReactElement(value2);\n  }\n  var canUseSymbol = typeof Symbol === \"function\" && Symbol.for;\n  var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for(\"react.element\") : 60103;\n  function isReactElement(value2) {\n    return value2.$$typeof === REACT_ELEMENT_TYPE;\n  }\n  function emptyTarget(val) {\n    return Array.isArray(val) ? [] : {};\n  }\n  function cloneUnlessOtherwiseSpecified(value2, options) {\n    return options.clone !== false && options.isMergeableObject(value2) ? deepmerge$1(emptyTarget(value2), value2, options) : value2;\n  }\n  function defaultArrayMerge(target2, source2, options) {\n    return target2.concat(source2).map(function(element2) {\n      return cloneUnlessOtherwiseSpecified(element2, options);\n    });\n  }\n  function mergeObject(target2, source2, options) {\n    var destination = {};\n    if (options.isMergeableObject(target2)) {\n      Object.keys(target2).forEach(function(key2) {\n        destination[key2] = cloneUnlessOtherwiseSpecified(target2[key2], options);\n      });\n    }\n    Object.keys(source2).forEach(function(key2) {\n      if (!options.isMergeableObject(source2[key2]) || !target2[key2]) {\n        destination[key2] = cloneUnlessOtherwiseSpecified(source2[key2], options);\n      } else {\n        destination[key2] = deepmerge$1(target2[key2], source2[key2], options);\n      }\n    });\n    return destination;\n  }\n  function deepmerge$1(target2, source2, options) {\n    options = options || {};\n    options.arrayMerge = options.arrayMerge || defaultArrayMerge;\n    options.isMergeableObject = options.isMergeableObject || isMergeableObject;\n    var sourceIsArray = Array.isArray(source2);\n    var targetIsArray = Array.isArray(target2);\n    var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n    if (!sourceAndTargetTypesMatch) {\n      return cloneUnlessOtherwiseSpecified(source2, options);\n    } else if (sourceIsArray) {\n      return options.arrayMerge(target2, source2, options);\n    } else {\n      return mergeObject(target2, source2, options);\n    }\n  }\n  deepmerge$1.all = function deepmergeAll(array2, options) {\n    if (!Array.isArray(array2)) {\n      throw new Error(\"first argument should be an array\");\n    }\n    return array2.reduce(function(prev, next) {\n      return deepmerge$1(prev, next, options);\n    }, {});\n  };\n  var deepmerge_1 = deepmerge$1;\n  const _deepmerge = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n    __proto__: null,\n    default: deepmerge_1\n  }, Symbol.toStringTag, { value: \"Module\" }));\n  function isObject(o) {\n    return Object.prototype.toString.call(o) === \"[object Object]\";\n  }\n  function isPlainObject(o) {\n    var ctor, prot;\n    if (isObject(o) === false) return false;\n    ctor = o.constructor;\n    if (ctor === void 0) return true;\n    prot = ctor.prototype;\n    if (isObject(prot) === false) return false;\n    if (prot.hasOwnProperty(\"isPrototypeOf\") === false) {\n      return false;\n    }\n    return true;\n  }\n  const deepmerge = deepmerge_1 || _deepmerge;\n  const dontMerge = (destination, source2) => source2;\n  function deepMerge(...objectsToMerge) {\n    const objects = objectsToMerge.filter(Boolean);\n    return deepmerge.all(objects, { arrayMerge: dontMerge, isMergeableObject: isPlainObject });\n  }\n  function rgbToDeckglColor(c2) {\n    return [c2.r, c2.g, c2.b, c2.opacity * 255];\n  }\n  function colorIsEqual(a2, b2) {\n    if (a2.length !== b2.length)\n      return false;\n    for (let i = 0; i < a2.length; i++) {\n      if (a2[i] !== b2[i])\n        return false;\n    }\n    return true;\n  }\n  function colorFromString(cssColorSpecifier) {\n    if (cssColorSpecifier) {\n      const dc = color$2(cssColorSpecifier);\n      if (dc) {\n        const c2 = dc.rgb();\n        return rgbToDeckglColor(c2);\n      }\n    }\n  }\n  const minHeight = \"100px\";\n  const minWidth = \"100px\";\n  const defaultPresenterStyle = {\n    cssPrefix: \"vega-morphcharts-\",\n    defaultCubeColor: [128, 128, 128, 255],\n    highlightColor: [0, 0, 0, 255]\n  };\n  const defaultPresenterConfig = {\n    onCubeClick: (e, cube) => {\n    },\n    onCubeHover: (e, cube) => {\n    },\n    transitionDurations: {\n      position: 600,\n      stagger: 600,\n      view: 600\n    },\n    renderer: {\n      advanced: false,\n      advancedOptions: {},\n      basicOptions: {\n        antialias: true\n      }\n    }\n  };\n  function createStage(view) {\n    const stage = {\n      view,\n      cubeData: [],\n      pathData: [],\n      axes: {\n        x: [],\n        y: [],\n        z: []\n      },\n      gridLines: [],\n      textData: [],\n      legend: {\n        rows: {}\n      },\n      facets: []\n    };\n    return stage;\n  }\n  const groupStrokeWidth = 1;\n  const lineZ = 0;\n  const defaultView = \"2d\";\n  const minZ = 0.5;\n  const min3dDepth = 0.05;\n  const zAxisEncodeColor = [7, 7, 7, 255];\n  const zAxisOutColor = [0, 0, 0, 255];\n  function defaultOnAxisItem(vegaItem, stageItem, stage, currAxis) {\n    if (colorIsEqual(stageItem.color, zAxisEncodeColor)) {\n      stageItem.color = zAxisOutColor;\n      if (currAxis.axisRole !== \"z\") {\n        const previousAxisRole = removeCurrentAxes(stage, currAxis);\n        if (previousAxisRole) {\n          currAxis.axisRole = \"z\";\n          stage.axes.z.push(currAxis);\n        }\n      }\n    }\n  }\n  function removeCurrentAxes(stage, currAxis) {\n    for (const axisRole in stage.axes) {\n      const axes = stage.axes[axisRole];\n      for (let i = 0; i < axes.length; i++) {\n        if (axes[i] === currAxis) {\n          axes.splice(i, 1);\n          return axisRole;\n        }\n      }\n    }\n  }\n  const vega = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null\n  };\n  const base = {\n    vega\n  };\n  function use(vega2) {\n    base.vega = vega2;\n  }\n  var PresenterElement;\n  (function(PresenterElement2) {\n    PresenterElement2[PresenterElement2[\"root\"] = 0] = \"root\";\n    PresenterElement2[PresenterElement2[\"gl\"] = 1] = \"gl\";\n    PresenterElement2[PresenterElement2[\"panel\"] = 2] = \"panel\";\n    PresenterElement2[PresenterElement2[\"legend\"] = 3] = \"legend\";\n    PresenterElement2[PresenterElement2[\"vegaControls\"] = 4] = \"vegaControls\";\n  })(PresenterElement || (PresenterElement = {}));\n  const LegendView = (props) => {\n    const rows = [];\n    const addRow = (row, i) => {\n      const fn = symbolMap[row.symbol.shape];\n      let jsx;\n      if (fn) {\n        jsx = fn(row.symbol);\n      } else {\n        jsx = createElement(\"span\", null, \"x\");\n      }\n      rows.push({\n        cells: [\n          { className: \"symbol\", content: jsx },\n          { className: \"label\", content: row.label, title: row.label }\n        ]\n      });\n    };\n    const sorted = Object.keys(props.legend.rows).sort((a2, b2) => +a2 - +b2);\n    sorted.forEach((i) => addRow(props.legend.rows[i]));\n    if (sorted.length) {\n      return createElement(Table, { rows, rowClassName: \"legend-row\", onRowClick: (e, i) => props.onClick(e, props.legend, i) }, props.legend.title !== void 0 && createElement(\n        \"tr\",\n        { onClick: (e) => props.onClick(e, props.legend, null) },\n        createElement(\"th\", { colSpan: 2 }, props.legend.title)\n      ));\n    }\n  };\n  const symbolMap = {\n    square: function(symbol2) {\n      return createElement(\"div\", { style: {\n        height: `${symbol2.bounds.y2 - symbol2.bounds.y1}px`,\n        width: `${symbol2.bounds.x2 - symbol2.bounds.x1}px`,\n        backgroundColor: symbol2.fill,\n        borderColor: symbol2.fill\n      } });\n    }\n  };\n  function initializePanel(presenter) {\n    const rootDiv = createElement(\n      \"div\",\n      { className: className(PresenterElement.root, presenter) },\n      createElement(\"div\", { className: className(PresenterElement.gl, presenter), style: { minHeight, minWidth } }),\n      createElement(\n        \"div\",\n        { className: className(PresenterElement.panel, presenter) },\n        createElement(\"div\", { className: className(PresenterElement.vegaControls, presenter) }),\n        createElement(\"div\", { className: className(PresenterElement.legend, presenter) })\n      )\n    );\n    mount(rootDiv, presenter.el);\n  }\n  function className(type2, presenter) {\n    return `${presenter.style.cssPrefix}${PresenterElement[type2]}`;\n  }\n  function patchCubeArray(allocatedSize, empty, cubes) {\n    const patched = new Array(allocatedSize);\n    patched.fill(empty);\n    cubes.forEach((cube) => patched[cube.ordinal] = cube);\n    return patched;\n  }\n  const legendMap = {\n    \"legend-title\": function(legend, textItem) {\n      legend.title = textItem.text;\n    },\n    \"legend-symbol\": function(legend, symbol2) {\n      const { bounds: bounds2, fill: fill2, shape: shape2 } = symbol2;\n      const legendRowSymbol = { bounds: bounds2, fill: fill2, shape: shape2 };\n      const i = symbol2.datum.index;\n      legend.rows[i] = legend.rows[i] || {};\n      legend.rows[i].symbol = legendRowSymbol;\n    },\n    \"legend-label\": function(legend, label2) {\n      const i = label2.datum.index;\n      legend.rows[i] = legend.rows[i] || {};\n      const row = legend.rows[i];\n      row.label = label2.text;\n      row.value = label2.datum.value;\n    }\n  };\n  const markStager$5 = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(item) {\n      const fn = legendMap[item.mark.role];\n      if (fn) {\n        fn(stage.legend, item);\n      }\n    });\n  };\n  const markStager$4 = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(item) {\n      const { bounds: bounds2, height: height2, url, width: width2 } = item;\n      let { x1: x12, x2: x22, y1: y12, y2: y22 } = bounds2;\n      x12 += x2;\n      x22 += x2;\n      y12 += y2;\n      y22 += y2;\n      if (!stage.backgroundImages) {\n        stage.backgroundImages = [];\n      }\n      stage.backgroundImages.push({ bounds: { x1: x12, x2: x22, y1: y12, y2: y22 }, height: height2, url, width: width2 });\n    });\n  };\n  const markStager$3 = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(item) {\n      const noZ = item.z === void 0;\n      const z = noZ ? 0 : (item.z || 0) + minZ;\n      const depth = (noZ ? 0 : item.depth || 0) + min3dDepth;\n      const ty2 = -1;\n      const ordinal2 = options.assignCubeOrdinal(item.datum);\n      if (ordinal2 > options.maxOrdinal) {\n        options.maxOrdinal = ordinal2;\n      }\n      if (ordinal2 === void 0) ;\n      else {\n        const cube = {\n          ordinal: ordinal2,\n          size: [item.width, item.height, depth],\n          position: [x2 + (+item.x || 0), ty2 * (y2 + (+item.y || 0)) - +item.height, z],\n          color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128]\n        };\n        cube.color[3] = item.opacity === void 0 ? 255 : 255 * item.opacity;\n        stage.cubeData.push(cube);\n      }\n    });\n  };\n  const markStager$2 = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(item) {\n      const x12 = item.x || 0;\n      const y12 = item.y || 0;\n      const x22 = item.x2 != null ? item.x2 : x12;\n      const y22 = item.y2 != null ? item.y2 : y12;\n      const lineItem = styledLine(x12 + x2, y12 + y2, x22 + x2, y22 + y2, item.stroke, item.strokeWidth);\n      const { currAxis } = options;\n      if (options.modifyAxis) {\n        options.modifyAxis(item, lineItem, stage, currAxis);\n      }\n      if (item.mark.role === \"axis-tick\") {\n        currAxis.ticks.push(lineItem);\n      } else if (item.mark.role === \"axis-domain\") {\n        currAxis.domain = lineItem;\n      } else {\n        stage.gridLines.push(lineItem);\n      }\n    });\n  };\n  function styledLine(x12, y12, x2, y2, stroke2, strokeWidth) {\n    const line2 = {\n      sourcePosition: [x12, -y12, lineZ],\n      //-1 = change direction of y from SVG to GL\n      targetPosition: [x2, -y2, lineZ],\n      color: colorFromString(stroke2),\n      strokeWidth\n    };\n    return line2;\n  }\n  function box(gx, gy, height2, width2, stroke2, strokeWidth, diagonals = false) {\n    const lines = [\n      styledLine(gx, gy, gx + width2, gy, stroke2, strokeWidth),\n      styledLine(gx + width2, gy, gx + width2, gy + height2, stroke2, strokeWidth),\n      styledLine(gx + width2, gy + height2, gx, gy + height2, stroke2, strokeWidth),\n      styledLine(gx, gy + height2, gx, gy, stroke2, strokeWidth)\n    ];\n    if (diagonals) {\n      lines.push(styledLine(gx, gy, gx + width2, gy + height2, stroke2, strokeWidth));\n      lines.push(styledLine(gx, gy + height2, gx + width2, gy, stroke2, strokeWidth));\n    }\n    return lines;\n  }\n  const ty = -1;\n  const markStager$1 = (options, stage, scene, x2, y2, groupType) => {\n    const g = Object.assign({ opacity: 1, strokeOpacity: 1, strokeWidth: 1 }, scene.items[0]);\n    const path2 = {\n      strokeWidth: g.strokeWidth,\n      strokeColor: colorFromString(g.stroke),\n      positions: scene.items.map((it) => [\n        it.x,\n        ty * it.y,\n        it.z || 0\n      ])\n    };\n    path2.strokeColor[3] *= g.strokeOpacity;\n    path2.strokeColor[3] *= g.opacity;\n    stage.pathData.push(path2);\n  };\n  const markStager = (options, stage, scene, x2, y2, groupType) => {\n    const ty2 = -1;\n    base.vega.sceneVisit(scene, function(item) {\n      if (!item.text)\n        return;\n      const size = item.fontSize;\n      const yOffset = 0;\n      const textItem = {\n        color: colorFromString(item.fill),\n        text: item.limit === void 0 ? item.text : base.vega.truncate(item.text, item.limit, \"right\", item.ellipsis || \"...\"),\n        //use dots instead of unicode ellipsis for\n        position: [x2 + (item.x || 0), ty2 * (y2 + (item.y || 0) + yOffset), 0],\n        size,\n        angle: convertAngle(item.angle),\n        //textAnchor: convertAlignment(item.align),\n        //alignmentBaseline,\n        metaData: item.metaData\n      };\n      const { currAxis } = options;\n      if (options.modifyAxis) {\n        options.modifyAxis(item, textItem, stage, currAxis);\n      }\n      if (item.mark.role === \"axis-label\") {\n        const tickText = textItem;\n        tickText.value = item.datum.value;\n        currAxis.tickText.push(tickText);\n      } else if (item.mark.role === \"axis-title\") {\n        currAxis.title = textItem;\n      } else {\n        stage.textData.push(textItem);\n      }\n    });\n  };\n  function convertAngle(vegaTextAngle) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n      return 360 - vegaTextAngle;\n    }\n    return 0;\n  }\n  var GroupType;\n  (function(GroupType2) {\n    GroupType2[GroupType2[\"none\"] = 0] = \"none\";\n    GroupType2[GroupType2[\"legend\"] = 1] = \"legend\";\n    GroupType2[GroupType2[\"xAxis\"] = 2] = \"xAxis\";\n    GroupType2[GroupType2[\"yAxis\"] = 3] = \"yAxis\";\n    GroupType2[GroupType2[\"zAxis\"] = 4] = \"zAxis\";\n  })(GroupType || (GroupType = {}));\n  function getAxisGroupType(item, options) {\n    const axisItem = item;\n    const axisMark = axisItem === null || axisItem === void 0 ? void 0 : axisItem.mark;\n    if ((axisMark === null || axisMark === void 0 ? void 0 : axisMark.zindex) === options.zAxisZindex && options.zAxisZindex !== void 0) {\n      return GroupType.zAxis;\n    }\n    switch (axisItem.orient) {\n      case \"bottom\":\n      case \"top\":\n        return GroupType.xAxis;\n      case \"left\":\n      case \"right\":\n        return GroupType.yAxis;\n    }\n  }\n  function convertGroupRole(item, options) {\n    if (item.mark.role === \"legend\")\n      return GroupType.legend;\n    if (item.mark.role === \"axis\") {\n      const groupType = getAxisGroupType(item, options);\n      if (groupType !== void 0) {\n        return groupType;\n      }\n    }\n  }\n  const group = (options, stage, scene, x2, y2, groupType) => {\n    base.vega.sceneVisit(scene, function(g) {\n      const gx = g.x || 0, gy = g.y || 0;\n      if (g.context && g.context.background && !stage.backgroundColor) {\n        stage.backgroundColor = colorFromString(g.context.background);\n      }\n      if (g.stroke) {\n        const facetRect = {\n          datum: g.datum,\n          lines: box(gx + x2, gy + y2, g.height, g.width, g.stroke, groupStrokeWidth)\n        };\n        stage.facets.push(facetRect);\n      }\n      groupType = convertGroupRole(g, options) || groupType;\n      setCurrentAxis(options, stage, groupType);\n      base.vega.sceneVisit(g, function(item) {\n        mainStager(options, stage, item, gx + x2, gy + y2, groupType);\n      });\n    });\n  };\n  function setCurrentAxis(options, stage, groupType) {\n    let axisRole;\n    switch (groupType) {\n      case GroupType.xAxis:\n        axisRole = \"x\";\n        break;\n      case GroupType.yAxis:\n        axisRole = \"y\";\n        break;\n      case GroupType.zAxis:\n        axisRole = \"z\";\n        break;\n      default:\n        return;\n    }\n    options.currAxis = {\n      axisRole,\n      domain: null,\n      tickText: [],\n      ticks: []\n    };\n    stage.axes[axisRole].push(options.currAxis);\n  }\n  const markStagers = {\n    group,\n    legend: markStager$5,\n    image: markStager$4,\n    rect: markStager$3,\n    rule: markStager$2,\n    line: markStager$1,\n    text: markStager\n  };\n  const mainStager = (options, stage, scene, x2, y2, groupType) => {\n    if (scene.marktype !== \"group\" && groupType === GroupType.legend) {\n      markStager$5(options, stage, scene);\n    } else {\n      const markStager2 = markStagers[scene.marktype];\n      if (markStager2) {\n        markStager2(options, stage, scene, x2, y2, groupType);\n      }\n    }\n  };\n  function sceneToStage(options, stage, scene) {\n    mainStager(options, stage, scene, 0, 0, null);\n    sortAxis(stage.axes.x, 0);\n    sortAxis(stage.axes.y, 1);\n    sortAxis(stage.axes.z, 1);\n  }\n  function sortAxis(axes, dim) {\n    axes.forEach((axis) => {\n      if (axis.domain)\n        orderDomain(axis.domain, dim);\n      axis.ticks.sort((a2, b2) => a2.sourcePosition[dim] - b2.sourcePosition[dim]);\n      axis.tickText.sort((a2, b2) => a2.position[dim] - b2.position[dim]);\n    });\n  }\n  function orderDomain(domain2, dim) {\n    if (domain2.sourcePosition[dim] > domain2.targetPosition[dim]) {\n      const temp2 = domain2.targetPosition;\n      domain2.targetPosition = domain2.sourcePosition;\n      domain2.sourcePosition = temp2;\n    }\n  }\n  function outerBounds(b1, b2) {\n    if (!b1 && !b2)\n      return;\n    if (!b1)\n      return b2;\n    if (!b2)\n      return b1;\n    const minProps = [\n      \"minBoundsX\",\n      \"minBoundsY\",\n      \"minBoundsZ\"\n    ];\n    const maxProps = [\n      \"maxBoundsX\",\n      \"maxBoundsY\",\n      \"maxBoundsZ\"\n    ];\n    const result = {};\n    minProps.forEach((p) => result[p] = notNull(Math.min, b1[p], b2[p]));\n    maxProps.forEach((p) => result[p] = notNull(Math.max, b1[p], b2[p]));\n    return result;\n  }\n  function notNull(fn, v1, v2) {\n    if (v1 == null && v2 == null)\n      return null;\n    if (v1 == null)\n      return v2;\n    if (v2 == null)\n      return v1;\n    return fn(v1, v2);\n  }\n  function increment(b2, minBoundsX, minBoundsY, minBoundsZ, maxBoundsX, maxBoundsY, maxBoundsZ) {\n    return outerBounds(b2, {\n      minBoundsX,\n      minBoundsY,\n      minBoundsZ,\n      maxBoundsX,\n      maxBoundsY,\n      maxBoundsZ\n    });\n  }\n  const createAxesLayer = (props) => {\n    const { config, height: height2, ref: ref2, stage } = props;\n    const { core } = ref2;\n    const { renderer } = core;\n    const { x: x2, y: y2, z } = stage.axes;\n    const xyz = [...x2, ...y2, ...z];\n    renderer.currentAxes = [];\n    if (!xyz.length) {\n      renderer.axesVisibility = AxesVisibility.none;\n      return;\n    }\n    renderer.axesVisibility = AxesVisibility.current;\n    const correlation = new AxesCorrelation(stage, 3);\n    const { axesSets, labels } = correlation;\n    const grid = correlation.getGrid();\n    if (grid.byColumn[0]) {\n      grid.byColumn[0].forEach((row) => {\n        row.axesSet.showFacetTitleY = true;\n      });\n      grid.byRow[0].forEach((col) => {\n        col.axesSet.showFacetTitleX = true;\n      });\n    }\n    if (grid.rows > 1) {\n      const { byRow } = grid;\n      byRow[0].forEach(({ axesSet }, col) => {\n        if (!axesSet.y) {\n          if (byRow[1][col].axesSet) {\n            byRow[1][col].axesSet.x.tickText = axesSet.x.tickText;\n            byRow[1][col].axesSet.showFacetTitleX = axesSet.showFacetTitleX;\n            delete axesSet.x;\n          }\n        }\n      });\n    }\n    let bounds2;\n    const allAxesSetBounds = [];\n    let anyZ = false;\n    for (let i = 0; i < axesSets.length; i++) {\n      if (axesSets[i].z) {\n        anyZ = true;\n        break;\n      }\n    }\n    const is3d = stage.view === \"3d\" && anyZ;\n    axesSets.forEach((axesSet) => {\n      if (!axesSet.x && !axesSet.y)\n        return;\n      const axesSetBounds = {\n        axesSet,\n        maxBoundsX: null,\n        maxBoundsY: null,\n        maxBoundsZ: null,\n        minBoundsX: null,\n        minBoundsY: null,\n        minBoundsZ: null\n      };\n      if (is3d) {\n        const zBounds = getDomainBounds(1, axesSet.z);\n        axesSetBounds.minBoundsZ = -zBounds.maxBounds;\n        axesSetBounds.maxBoundsZ = -zBounds.minBounds;\n      }\n      const yBounds = getDomainBounds(1, axesSet.y);\n      axesSetBounds.minBoundsY = yBounds.minBounds;\n      axesSetBounds.maxBoundsY = yBounds.maxBounds;\n      axesSetBounds.y = yBounds.minBounds;\n      axesSetBounds.h = yBounds.maxBounds - yBounds.minBounds;\n      const xBounds = getDomainBounds(0, axesSet.x);\n      axesSetBounds.minBoundsX = xBounds.minBounds;\n      axesSetBounds.maxBoundsX = xBounds.maxBounds;\n      axesSetBounds.x = xBounds.minBounds;\n      axesSetBounds.w = xBounds.maxBounds - xBounds.minBounds;\n      allAxesSetBounds.push(axesSetBounds);\n      bounds2 = outerBounds(bounds2, axesSetBounds);\n    });\n    const facetLabelX = labels.filter((label2) => label2.axisRole === \"x\")[0];\n    const facetLabelY = labels.filter((label2) => label2.axisRole === \"y\")[0];\n    core.inputManager.pickAxesTitleCallback = ({ axis, axes, manipulator }) => {\n      const axesSet = axesSets[axes];\n      let a2;\n      let f;\n      switch (axis) {\n        case 0: {\n          a2 = axesSet.x;\n          f = facetLabelX;\n          break;\n        }\n        case 1: {\n          a2 = axesSet.y;\n          f = facetLabelY;\n          break;\n        }\n        case 2: {\n          a2 = axesSet.z;\n          break;\n        }\n      }\n      if (a2) {\n        config.onTextClick(manipulator.event, a2.title || f.title);\n      }\n    };\n    allAxesSetBounds.forEach((axesSetBounds) => {\n      const { axesSet } = axesSetBounds;\n      if (!axesSet.x && !axesSet.y)\n        return;\n      const cartesian2 = new (is3d ? Cartesian3dAxes : Cartesian2dAxes)(core);\n      cartesian2.isDivisionPickingEnabled = [false, false, false];\n      cartesian2.arePickDivisionsVisible = [false, false, false];\n      cartesian2.isLabelPickingEnabled = [false, false, false];\n      cartesian2.isTitlePickingEnabled = [false, false, false];\n      cartesian2.isGridPickingEnabled = false;\n      cartesian2.isHeadingPickingEnabled = [false, false, false];\n      createAxes(cartesian2, 0, 0, axesSet.x, AxesTextOrientation.perpendicular, height2, props, axesSet.showFacetTitleX && facetLabelX);\n      createAxes(cartesian2, 1, 1, axesSet.y, AxesTextOrientation.perpendicular, height2, props, axesSet.showFacetTitleY && facetLabelY);\n      if (is3d) {\n        createAxes(cartesian2, 1, 2, axesSet.z, AxesTextOrientation.perpendicular, height2, props);\n      }\n      configCartesianAxes(is3d, bounds2, cartesian2);\n      const { maxBoundsX, maxBoundsY, minBoundsX, minBoundsY } = bounds2;\n      const w2 = maxBoundsX - minBoundsX;\n      const h2 = maxBoundsY - minBoundsY;\n      cartesian2.scalingX = axesSetBounds.w / w2;\n      cartesian2.scalingY = axesSetBounds.h / h2;\n      cartesian2.offsetX = (axesSetBounds.x - minBoundsX + axesSetBounds.w / 2) / w2 - 0.5;\n      cartesian2.offsetY = (axesSetBounds.y - minBoundsY + axesSetBounds.h / 2) / h2 - 0.5;\n      const aspect = h2 / w2;\n      if (aspect > 1) {\n        cartesian2.offsetX /= aspect;\n      } else {\n        cartesian2.offsetY *= aspect;\n      }\n      const axes = is3d ? renderer.createCartesian3dAxesVisual(cartesian2) : renderer.createCartesian2dAxesVisual(cartesian2);\n      renderer.currentAxes.push(axes);\n      props.config.onAxesComplete && props.config.onAxesComplete(cartesian2);\n    });\n    return { bounds: bounds2 };\n  };\n  const nullDomain = {\n    sourcePosition: [0, 0, 0],\n    targetPosition: [0, 0, 0]\n  };\n  class AxesCorrelation {\n    constructor(stage, dimensions) {\n      this.dimensions = dimensions;\n      const { x: x2, y: y2, z } = stage.axes;\n      this.axesSets = [];\n      this.labels = [];\n      [x2, y2, z].forEach((axes) => {\n        axes.forEach((axis) => {\n          if (this.axesSets.length === 0) {\n            this.initialize(axis);\n          } else {\n            this.correlate(axis);\n          }\n        });\n      });\n    }\n    getGrid() {\n      const mapCols = {};\n      const mapRows = {};\n      this.axesSets.forEach((axesSet) => {\n        var _a;\n        const domain2 = (_a = axesSet === null || axesSet === void 0 ? void 0 : axesSet.x) === null || _a === void 0 ? void 0 : _a.domain;\n        if (!domain2)\n          return;\n        const col = domain2.sourcePosition[0].toString();\n        const row = domain2.sourcePosition[1].toString();\n        if (!mapCols[col]) {\n          mapCols[col] = {};\n        }\n        mapCols[col][row] = axesSet;\n        mapRows[row] = null;\n      });\n      const colKeys = Object.keys(mapCols).sort((a2, b2) => +a2 - +b2);\n      const rowKeys = Object.keys(mapRows).sort((a2, b2) => +a2 - +b2);\n      return {\n        cols: colKeys.length,\n        rows: rowKeys.length,\n        byColumn: colKeys.map((colKey) => rowKeys.map((rowKey) => {\n          return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] };\n        })),\n        byRow: rowKeys.map((rowKey) => colKeys.map((colKey) => {\n          return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] };\n        }))\n      };\n    }\n    initialize(axis) {\n      if (!axis.domain) {\n        this.labels.push(axis);\n        return;\n      }\n      const axesSet = {};\n      axesSet[axis.axisRole] = axis;\n      this.axesSets.push(axesSet);\n    }\n    correlate(axis) {\n      if (!axis.domain) {\n        this.labels.push(axis);\n        return;\n      }\n      for (let i = 0; i < this.axesSets.length; i++) {\n        const axesSet = this.axesSets[i];\n        for (const axisRole in axesSet) {\n          const test2 = axesSet[axisRole];\n          if (this.matchDomains(axis.domain, test2.domain)) {\n            if (!axesSet[axis.axisRole] || !axesSet[axis.axisRole].tickText.length && axis.tickText.length) {\n              axesSet[axis.axisRole] = axis;\n            }\n            return;\n          }\n        }\n      }\n      this.initialize(axis);\n    }\n    matchDomains(a2, b2) {\n      if (this.matchPoint(a2.sourcePosition, b2.sourcePosition))\n        return true;\n      if (this.matchPoint(a2.sourcePosition, b2.targetPosition))\n        return true;\n      if (this.matchPoint(a2.targetPosition, b2.targetPosition))\n        return true;\n      if (this.matchPoint(a2.targetPosition, b2.sourcePosition))\n        return true;\n      return false;\n    }\n    matchPoint(a2, b2) {\n      for (let i = 0; i < this.dimensions; i++) {\n        if (a2[i] !== b2[i])\n          return false;\n      }\n      return true;\n    }\n  }\n  function createAxes(cartesian2, dim2d, dim3d, axis, orientation, height2, props, facetLabel) {\n    const domain2 = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n    const { tickPositions, tickText, textPos, textSize } = convertAxis(axis, domain2, dim2d, height2);\n    if (axis.axisRole === \"z\") {\n      tickPositions.forEach((t, i) => tickPositions[i] = 1 - t);\n      textPos.forEach((t, i) => textPos[i] = 1 - t);\n      tickText.reverse();\n      tickPositions.reverse();\n      textPos.reverse();\n    }\n    cartesian2.setTickPositions(dim3d, tickPositions);\n    cartesian2.zero[dim3d] = 0;\n    cartesian2.setLabelPositions(dim3d, textPos);\n    cartesian2.setLabels(dim3d, tickText);\n    cartesian2.setLabelSizes(dim3d, textSize);\n    const title = (axis === null || axis === void 0 ? void 0 : axis.title) || (facetLabel === null || facetLabel === void 0 ? void 0 : facetLabel.title);\n    if (title === null || title === void 0 ? void 0 : title.text) {\n      cartesian2.setTitle(dim3d, title.text);\n      cartesian2.setTitleSize(dim3d, title.size / height2);\n    }\n    cartesian2.setLabelOrientation(dim3d, orientation);\n    props.config.onAxisConfig && props.config.onAxisConfig(cartesian2, dim3d, axis);\n    return {\n      tickText\n    };\n  }\n  function configCartesianAxes(is3d, bounds2, cartesian2) {\n    if (is3d) {\n      cartesian2.isEdgeVisible[Edge3D.topBack] = false;\n    }\n    cartesian2.isEdgeVisible[Edge3D.backRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.bottomRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.frontRight] = false;\n    cartesian2.isEdgeVisible[Edge3D.topFront] = false;\n    cartesian2.isEdgeVisible[Edge3D.topRight] = false;\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds2;\n    cartesian2.minBoundsX = minBoundsX;\n    cartesian2.maxBoundsX = maxBoundsX;\n    cartesian2.minBoundsY = minBoundsY;\n    cartesian2.maxBoundsY = maxBoundsY;\n    if (is3d) {\n      cartesian2.minBoundsZ = minBoundsZ;\n      cartesian2.maxBoundsZ = maxBoundsZ;\n    }\n  }\n  function getDomainBounds(dim2d, axis) {\n    const domain2 = (axis === null || axis === void 0 ? void 0 : axis.domain) || nullDomain;\n    const minBounds = domain2.sourcePosition[dim2d];\n    const maxBounds = domain2.targetPosition[dim2d];\n    return {\n      maxBounds,\n      minBounds\n    };\n  }\n  function convertAxis(axis, domain2, dim, height2) {\n    const start = domain2.sourcePosition[dim];\n    const span2 = domain2.targetPosition[dim] - start;\n    const tickPositions = axis ? axis.ticks.map((t) => (t.sourcePosition[dim] - start) / span2) : [];\n    const tickText = axis ? axis.tickText.map((t) => t.text) : [];\n    const textPos = axis ? axis.tickText.map((t) => (t.position[dim] - start) / span2) : [];\n    const textSize = axis ? axis.tickText.map((t) => t.size / height2) : [];\n    if (tickPositions.length) {\n      if (tickPositions[0] !== 0) {\n        tickPositions[0] = 0;\n      }\n      if (tickPositions[tickPositions.length - 1] !== 1) {\n        tickPositions[tickPositions.length - 1] = 1;\n      }\n    }\n    return {\n      tickPositions,\n      tickText,\n      textPos,\n      textSize\n    };\n  }\n  class ColorMap {\n    constructor(quant = 5) {\n      this.quant = quant;\n      this.colorMap = {};\n      this.colorArray = [];\n    }\n    getColorKey(rgbaColor) {\n      const color2 = rgbaColor.slice(0, 3).map((e) => Math.floor(e / this.quant) * this.quant);\n      color2[3] = rgbaColor[3];\n      return JSON.stringify(color2);\n    }\n    registerColor(rgbaColor) {\n      const colorKey = this.getColorKey(rgbaColor);\n      if (!this.colorMap[colorKey]) {\n        this.colorMap[colorKey] = {\n          index: this.colorArray.length,\n          rgbaColor\n        };\n        this.colorArray.push(rgbaColor);\n      }\n      return this.colorMap[colorKey].index;\n    }\n    getPalette() {\n      return {\n        palette: new Uint8Array(this.colorArray.flat()),\n        maxColor: this.colorArray.length - 1\n      };\n    }\n  }\n  function convert$3(newColor) {\n    const c2 = colorFromString(newColor).slice(0, 3);\n    return c2.map((v) => v / 255);\n  }\n  function colorConfig(ref2, colors2) {\n    if (!colors2)\n      return;\n    const { config } = ref2.core;\n    config.activeColor = convert$3(colors2.activeItemColor);\n    config.backgroundColor = new Float32Array(convert$3(colors2.backgroundColor));\n    config.textColor = convert$3(colors2.textColor);\n    config.textBorderColor = convert$3(colors2.textBorderColor);\n    config.axesTextColor = convert$3(colors2.axesTextLabelColor);\n    config.axesGridBackgroundColor = convert$3(colors2.axesGridBackgroundColor);\n    config.axesGridHighlightColor = convert$3(colors2.axesGridHighlightColor);\n    config.axesGridMinorColor = convert$3(colors2.axesGridMinorColor);\n    config.axesGridMajorColor = convert$3(colors2.axesGridMajorColor);\n    config.axesGridZeroColor = convert$3(colors2.axesGridZeroColor);\n    ref2.core.renderer[\"_theme\"] = null;\n  }\n  const key$1 = \"cube\";\n  const createCubeLayer = (props) => {\n    const { ref: ref2, stage } = props;\n    const { core } = ref2;\n    const scatter = new Scatter(core);\n    const { ids, colors: colors2, positionsX, positionsY, positionsZ, sizesX, sizesY, sizesZ, bounds: bounds2, maxColor, palette } = convert$2(stage);\n    if (!ids.length)\n      return;\n    const { renderer } = core;\n    let cubeTransitionBuffer = renderer.transitionBuffers.find((t) => t.key === key$1);\n    if (!cubeTransitionBuffer) {\n      cubeTransitionBuffer = renderer.createTransitionBuffer(ids);\n      cubeTransitionBuffer.key = key$1;\n      renderer.transitionBuffers.push(cubeTransitionBuffer);\n    } else {\n      cubeTransitionBuffer.swap();\n    }\n    scatter.layout(cubeTransitionBuffer.currentBuffer, ids, {\n      positionsX,\n      positionsY,\n      positionsZ\n    });\n    const layer = {\n      positionsX,\n      positionsY,\n      positionsZ,\n      update: (newBounds, selected, stagger) => {\n        const { colors: colors3, maxColor: maxColor2, minColor, palette: palette2 } = layer.unitColorMap;\n        const currCubeTransitionBuffer = core.renderer.transitionBuffers.find((t) => t.key === key$1);\n        currCubeTransitionBuffer.currentBuffer.unitType = UnitType.block;\n        currCubeTransitionBuffer.currentPalette.colors = palette2;\n        let options = Object.assign({\n          selected,\n          colors: colors3,\n          minColor,\n          maxColor: maxColor2,\n          sizesX,\n          sizesY,\n          sizesZ\n        }, newBounds);\n        if (stagger === null || stagger === void 0 ? void 0 : stagger.staggerOrders) {\n          const { maxStaggerOrder, minStaggerOrder, staggerOrders } = stagger;\n          options = Object.assign(Object.assign({}, options), {\n            maxStaggerOrder,\n            minStaggerOrder,\n            staggerOrders\n          });\n        }\n        scatter.update(currCubeTransitionBuffer.currentBuffer, ids, options);\n      },\n      bounds: bounds2,\n      unitColorMap: {\n        colors: colors2,\n        ids,\n        minColor: 0,\n        maxColor,\n        palette\n      }\n    };\n    return layer;\n  };\n  function convert$2(stage) {\n    const { cubeData } = stage;\n    const { length: length2 } = cubeData;\n    const ids = [];\n    const colors2 = new Float64Array(length2);\n    const positionsX = new Float64Array(length2);\n    const positionsY = new Float64Array(length2);\n    const positionsZ = new Float64Array(length2);\n    const sizesX = new Float64Array(length2);\n    const sizesY = new Float64Array(length2);\n    const sizesZ = new Float64Array(length2);\n    let bounds2;\n    const colorMap = new ColorMap();\n    cubeData.forEach((cube, i) => {\n      ids.push(i);\n      if (cube.isEmpty) {\n        positionsX[i] = 0;\n        positionsY[i] = 0;\n        positionsZ[i] = 0;\n        sizesX[i] = 0;\n        sizesY[i] = 0;\n        sizesZ[i] = 0;\n        colors2[i] = 0;\n      } else {\n        positionsX[i] = cube.position[0] + cube.size[0] * 0.5;\n        positionsY[i] = cube.position[1] + cube.size[1] * 0.5;\n        positionsZ[i] = cube.position[2] + cube.size[2] * 0.5;\n        sizesX[i] = cube.size[0];\n        sizesY[i] = cube.size[1];\n        sizesZ[i] = cube.size[2];\n        bounds2 = increment(bounds2, cube.position[0], cube.position[1], cube.position[2], cube.position[0] + cube.size[0], cube.position[1] + cube.size[1], cube.position[2] + cube.size[2]);\n        colors2[i] = colorMap.registerColor(cube.color);\n      }\n    });\n    const { palette, maxColor } = colorMap.getPalette();\n    return {\n      ids: new Uint32Array(ids),\n      colors: colors2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      sizesX,\n      sizesY,\n      sizesZ,\n      bounds: bounds2,\n      maxColor,\n      palette\n    };\n  }\n  const key = \"line\";\n  const createLineLayer = (props) => {\n    const { height: height2, ref: ref2, stage } = props;\n    const { core } = ref2;\n    const lines = new Line(core);\n    const { ids, fromIds, toIds, lineColors, lineSizes, bounds: bounds2, positionsX, positionsY, positionsZ, lineMaxColor, palette } = convert$1(stage, height2);\n    if (!ids.length)\n      return;\n    const { renderer } = core;\n    let lineTransitionBuffer = renderer.transitionBuffers.find((t) => t.key === key);\n    if (!lineTransitionBuffer) {\n      lineTransitionBuffer = renderer.createTransitionBuffer(ids);\n      lineTransitionBuffer.key = key;\n      renderer.transitionBuffers.push(lineTransitionBuffer);\n    } else {\n      lineTransitionBuffer.swap();\n    }\n    lines.layout(lineTransitionBuffer.currentBuffer, ids, fromIds, toIds, {\n      positionsX,\n      positionsY,\n      positionsZ,\n      lineSizes,\n      sizeScaling: 1\n    });\n    let options = {\n      lineColors,\n      lineMinColor: 0,\n      lineMaxColor\n    };\n    lineTransitionBuffer.currentBuffer.unitType = UnitType.cylinder;\n    lineTransitionBuffer.currentPalette.colors = palette;\n    return {\n      update: (newBounds) => {\n        options = Object.assign(Object.assign({}, options), newBounds);\n        const currLineTransitionBuffer = core.renderer.transitionBuffers.find((t) => t.key === key);\n        lines.update(currLineTransitionBuffer.currentBuffer, ids, fromIds, toIds, options);\n      },\n      bounds: bounds2,\n      unitColorMap: {\n        ids,\n        colors: lineColors,\n        minColor: 0,\n        maxColor: lineMaxColor,\n        palette\n      }\n    };\n  };\n  function convert$1(stage, height2, width2) {\n    const { pathData } = stage;\n    const positions = [];\n    const lines = [];\n    const colorMap = new ColorMap();\n    pathData.forEach((path2) => {\n      const color2 = colorMap.registerColor(path2.strokeColor);\n      let from = positions.length;\n      positions.push(path2.positions[0]);\n      for (let i = 1; i < path2.positions.length; i++) {\n        const to = positions.length;\n        positions.push(path2.positions[i]);\n        lines.push({\n          id: lines.length,\n          from,\n          to,\n          color: color2,\n          size: path2.strokeWidth\n        });\n        from = to;\n      }\n    });\n    const ids = new Uint32Array(lines.length);\n    const fromIds = new Uint32Array(lines.length);\n    const toIds = new Uint32Array(lines.length);\n    const lineColors = new Float64Array(lines.length);\n    const lineSizes = new Float64Array(lines.length);\n    lines.forEach((line2, i) => {\n      ids[i] = i;\n      fromIds[i] = line2.from;\n      toIds[i] = line2.to;\n      lineColors[i] = line2.color;\n      lineSizes[i] = line2.size;\n    });\n    const positionsX = new Float64Array(positions.length);\n    const positionsY = new Float64Array(positions.length);\n    const positionsZ = new Float64Array(positions.length);\n    let bounds2;\n    positions.forEach((p, i) => {\n      positionsX[i] = p[0];\n      positionsY[i] = p[1] + height2;\n      positionsZ[i] = p[2];\n      bounds2 = increment(bounds2, positionsX[i], positionsY[i], positionsZ[i], positionsX[i], positionsY[i], positionsZ[i]);\n    });\n    const { palette, maxColor: lineMaxColor } = colorMap.getPalette();\n    return {\n      ids,\n      fromIds,\n      toIds,\n      lineColors,\n      lineSizes,\n      bounds: bounds2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      lineMaxColor,\n      palette\n    };\n  }\n  const createTextLayer = (props) => {\n    const { ref: ref2, stage } = props;\n    const { core } = ref2;\n    const { positionsX, positionsY, positionsZ, sizes, bounds: bounds2, maxGlyphs, text: text2 } = convert(stage);\n    if (text2.length === 0) {\n      core.renderer.labelSets = [];\n      return;\n    }\n    const options = {\n      text: text2,\n      maxGlyphs,\n      scales: sizes\n    };\n    const labelSet = new LabelSet(core, options);\n    labelSet.positionsX = positionsX;\n    labelSet.positionsY = positionsY;\n    labelSet.positionsZ = positionsZ;\n    labelSet.horizontalAlignment = HorizontalAlignment.center;\n    labelSet.verticalAlignment = VerticalAlignment.center;\n    const layer = {\n      update: (bounds3) => {\n        const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds3;\n        labelSet.minBoundsX = minBoundsX;\n        labelSet.minBoundsY = minBoundsY;\n        labelSet.minBoundsZ = minBoundsZ;\n        labelSet.maxBoundsX = maxBoundsX;\n        labelSet.maxBoundsY = maxBoundsY;\n        labelSet.maxBoundsZ = maxBoundsZ;\n      },\n      bounds: bounds2\n    };\n    const labelSetVisual = core.renderer.createLabelSetVisual(labelSet);\n    core.renderer.labelSets = [labelSetVisual];\n    return layer;\n  };\n  function convert(stage) {\n    const { textData } = stage;\n    const { length: length2 } = textData;\n    const ids = [];\n    const text2 = [];\n    const colors2 = new Float64Array(length2);\n    const positionsX = new Float64Array(length2);\n    const positionsY = new Float64Array(length2);\n    const positionsZ = new Float64Array(length2);\n    const sizes = new Float64Array(length2);\n    let bounds2;\n    let maxGlyphs = 0;\n    const colorMap = new ColorMap();\n    textData.forEach((t, i) => {\n      ids.push(i);\n      text2.push(t.text);\n      maxGlyphs += t.text.length;\n      positionsX[i] = t.position[0];\n      positionsY[i] = t.position[1];\n      positionsZ[i] = t.position[2];\n      sizes[i] = 1.5 * t.size;\n      bounds2 = increment(bounds2, t.position[0], t.position[1], t.position[2], t.position[0], t.position[1], t.position[2]);\n      colors2[i] = colorMap.registerColor(t.color);\n    });\n    const { palette, maxColor } = colorMap.getPalette();\n    return {\n      ids: new Uint32Array(ids),\n      colors: colors2,\n      positionsX,\n      positionsY,\n      positionsZ,\n      sizes,\n      bounds: bounds2,\n      maxColor,\n      maxGlyphs,\n      palette,\n      text: text2\n    };\n  }\n  function getImageData(url) {\n    return new Promise((resolve2, reject) => {\n      const imageElement = document.createElement(\"img\");\n      imageElement.onload = () => {\n        const canvas = document.createElement(\"canvas\");\n        const ctx = canvas.getContext(\"2d\");\n        const { height: height2, width: width2 } = imageElement;\n        canvas.width = width2;\n        canvas.height = height2;\n        ctx.drawImage(imageElement, 0, 0);\n        resolve2(ctx.getImageData(0, 0, width2, height2));\n      };\n      imageElement.src = url;\n    });\n  }\n  function createImageQuad(core, imageData, bounds2, position2, width2, height2) {\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds2;\n    const imageOptions = {\n      imageData,\n      position: position2,\n      height: height2,\n      width: width2,\n      minBoundsX,\n      maxBoundsX,\n      minBoundsZ,\n      maxBoundsZ,\n      minBoundsY,\n      maxBoundsY\n    };\n    return new ImageQuad(core, imageOptions);\n  }\n  function createCameraDefaults() {\n    const qModelRotation2d2 = create$1();\n    const qModelRotation3d2 = Constants.QUAT_ROTATEX_MINUS_90;\n    const qCameraRotation2d2 = create$1();\n    const qCameraRotation3d2 = create$1();\n    const qAngle = create$1();\n    const vCameraPosition2 = create$3();\n    setAxisAngle(qCameraRotation3d2, Constants.VECTOR3_UNITX, AngleHelper.degreesToRadians(30));\n    setAxisAngle(qAngle, Constants.VECTOR3_UNITY, AngleHelper.degreesToRadians(-25));\n    multiply(qCameraRotation3d2, qCameraRotation3d2, qAngle);\n    return {\n      qModelRotation2d: qModelRotation2d2,\n      qModelRotation3d: qModelRotation3d2,\n      qCameraRotation2d: qCameraRotation2d2,\n      qCameraRotation3d: qCameraRotation3d2,\n      vCameraPosition: vCameraPosition2\n    };\n  }\n  const cameraDefaults = createCameraDefaults();\n  const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n  function applyCameraCallbacks(ref2, lastPresenterConfig, lastView, transistion2dOnly) {\n    const { cameraTransitioner, core, modelTransitioner, positionTransitioner } = ref2;\n    ref2.reset = () => {\n      core.reset(true);\n      if (lastView === \"3d\") {\n        modelTransitioner.qRotation.to = qModelRotation3d;\n        cameraTransitioner.qRotation.to = qCameraRotation3d;\n        cameraTransitioner.vPosition.to = vCameraPosition;\n      } else {\n        modelTransitioner.qRotation.to = qModelRotation2d;\n        cameraTransitioner.qRotation.to = qCameraRotation2d;\n        cameraTransitioner.vPosition.to = vCameraPosition;\n      }\n      slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.to, modelTransitioner.qRotation.to, 0);\n      core.setModelRotation(modelTransitioner.qRotation.current, true);\n      core.camera.setOrbit(cameraTransitioner.qRotation.to, true);\n      core.camera.setPosition(cameraTransitioner.vPosition.to, true);\n    };\n    const cam = (t) => {\n      slerp(cameraTransitioner.qRotation.current, cameraTransitioner.qRotation.from, cameraTransitioner.qRotation.to, t);\n      lerp(cameraTransitioner.vPosition.current, cameraTransitioner.vPosition.from, cameraTransitioner.vPosition.to, t);\n      core.camera.setOrbit(cameraTransitioner.qRotation.current, false);\n      core.camera.setPosition(cameraTransitioner.vPosition.current, false);\n      core.inputManager.isPickingEnabled = false;\n    };\n    core.updateCallback = (elapsedTime) => {\n      const { transitionDurations } = lastPresenterConfig;\n      if (positionTransitioner.isTransitioning) {\n        const t = positionTransitioner.elapse(elapsedTime, transitionDurations.position + transitionDurations.stagger);\n        core.renderer.transitionTime = t;\n        setTransitionTimeAxesVisibility(transistion2dOnly, core);\n      } else {\n        core.inputManager.isPickingEnabled = true;\n      }\n      if (modelTransitioner.isTransitioning) {\n        const tm = modelTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n        if (modelTransitioner.shouldTransition) {\n          slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.from, modelTransitioner.qRotation.to, tm);\n          core.setModelRotation(modelTransitioner.qRotation.current, false);\n        }\n        cam(tm);\n      }\n      if (cameraTransitioner.isTransitioning) {\n        const t = cameraTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n        cam(t);\n      }\n    };\n  }\n  function setTransitionTimeAxesVisibility(transistion2dOnly, core) {\n    const t = core.renderer.transitionTime;\n    if (transistion2dOnly) {\n      if (t < 0.5) {\n        core.renderer.axesVisibility = AxesVisibility.previous;\n      } else {\n        core.renderer.axesVisibility = AxesVisibility.current;\n      }\n    } else {\n      if (t <= 0.01) {\n        core.renderer.axesVisibility = AxesVisibility.previous;\n      } else if (t >= 0.99) {\n        core.renderer.axesVisibility = AxesVisibility.current;\n      } else {\n        core.renderer.axesVisibility = AxesVisibility.none;\n      }\n    }\n  }\n  function morphChartsRender(ref2, prevStage, stage, height2, width2, preStage, colors2, config) {\n    const { qCameraRotation2d: qCameraRotation2d2, qCameraRotation3d: qCameraRotation3d2, qModelRotation2d: qModelRotation2d2, qModelRotation3d: qModelRotation3d2, vCameraPosition: vCameraPosition2 } = cameraDefaults;\n    const { core, cameraTransitioner, modelTransitioner, positionTransitioner } = ref2;\n    let transistion2dOnly = false;\n    let cameraTo;\n    let holdCamera;\n    if (config.camera === \"hold\") {\n      holdCamera = true;\n    } else {\n      cameraTo = config.camera;\n    }\n    if (prevStage && prevStage.view !== stage.view) {\n      modelTransitioner.shouldTransition = !holdCamera;\n      if (stage.view === \"2d\") {\n        modelTransitioner.qRotation.from = qModelRotation3d2;\n        modelTransitioner.qRotation.to = qModelRotation2d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      } else {\n        modelTransitioner.qRotation.from = qModelRotation2d2;\n        modelTransitioner.qRotation.to = qModelRotation3d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      }\n    } else {\n      modelTransitioner.shouldTransition = false;\n      if (stage.view === \"2d\") {\n        transistion2dOnly = true;\n        modelTransitioner.qRotation.to = qModelRotation2d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation2d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      } else {\n        modelTransitioner.qRotation.to = qModelRotation3d2;\n        cameraTransitioner.qRotation.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.rotation) || qCameraRotation3d2;\n        cameraTransitioner.vPosition.to = (cameraTo === null || cameraTo === void 0 ? void 0 : cameraTo.position) || vCameraPosition2;\n      }\n    }\n    core.camera.getOrbit(cameraTransitioner.qRotation.from);\n    core.camera.getPosition(cameraTransitioner.vPosition.from);\n    if (!prevStage) {\n      core.setModelRotation(modelTransitioner.qRotation.to, false);\n      core.camera.setOrbit(cameraTransitioner.qRotation.to, false);\n      core.camera.setPosition(cameraTransitioner.vPosition.to, false);\n    } else if (!holdCamera) {\n      cameraTransitioner.begin();\n    }\n    positionTransitioner.begin();\n    if (modelTransitioner.shouldTransition) {\n      modelTransitioner.begin();\n    }\n    const props = { ref: ref2, stage, height: height2, config };\n    const cubeLayer = createCubeLayer(props);\n    const lineLayer = createLineLayer(props);\n    const textLayer = createTextLayer(props);\n    const { backgroundImages } = stage;\n    let contentBounds = outerBounds(outerBounds(cubeLayer === null || cubeLayer === void 0 ? void 0 : cubeLayer.bounds, lineLayer === null || lineLayer === void 0 ? void 0 : lineLayer.bounds), outerBounds(textLayer === null || textLayer === void 0 ? void 0 : textLayer.bounds, null));\n    backgroundImages === null || backgroundImages === void 0 ? void 0 : backgroundImages.forEach((backgroundImage) => {\n      contentBounds = outerBounds(contentBounds, convertBounds(backgroundImage.bounds));\n    });\n    props.bounds = contentBounds;\n    core.renderer.previousAxes = core.renderer.currentAxes;\n    const axesLayer = createAxesLayer(props);\n    core.config.transitionStaggering = config.transitionDurations.stagger;\n    core.config.transitionDuration = config.transitionDurations.position;\n    let bounds2;\n    if (axesLayer && axesLayer.bounds) {\n      bounds2 = axesLayer.bounds;\n    } else {\n      bounds2 = contentBounds;\n    }\n    ref2.setMorphChartsRendererOptions(config.renderer);\n    if (preStage) {\n      preStage(stage, cubeLayer);\n    }\n    core.renderer.images = [];\n    if (backgroundImages) {\n      const addImage = (imageBounds, imageData) => {\n        const imageWidth2 = imageBounds.maxBoundsX - imageBounds.minBoundsX;\n        const imageHeight2 = imageBounds.maxBoundsY - imageBounds.minBoundsY;\n        const position2 = [imageBounds.minBoundsX + imageWidth2 / 2, imageBounds.minBoundsY + imageHeight2 / 2, 0];\n        const imageQuad = createImageQuad(core, imageData, contentBounds, position2, imageWidth2, imageHeight2);\n        const imageVisual = core.renderer.createImageVisual(imageQuad);\n        core.renderer.images.push(imageVisual);\n      };\n      const imageDataCache = {};\n      backgroundImages.forEach((backgroundImage) => {\n        const imageBounds = convertBounds(backgroundImage.bounds);\n        const imageData = imageDataCache[backgroundImage.url];\n        if (imageData) {\n          addImage(imageBounds, imageData);\n        } else {\n          getImageData(backgroundImage.url).then((imageData2) => {\n            imageDataCache[backgroundImage.url] = imageData2;\n            addImage(imageBounds, imageData2);\n          });\n        }\n      });\n    }\n    layersWithSelection(cubeLayer, lineLayer, textLayer, config.layerSelection, bounds2, ref2.layerStagger);\n    applyCameraCallbacks(ref2, config, stage.view, transistion2dOnly);\n    core.renderer.transitionTime = 0;\n    colorConfig(ref2, colors2);\n    return {\n      bounds: bounds2,\n      getCubeLayer: () => cubeLayer,\n      update: (layerSelection) => layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds2, ref2.layerStagger),\n      activate: (id2) => core.renderer.transitionBuffers[0].activeId = id2,\n      moveCamera: (camera) => {\n        if (!(positionTransitioner.isTransitioning || modelTransitioner.isTransitioning)) {\n          core.camera.getOrbit(cameraTransitioner.qRotation.from);\n          core.camera.getPosition(cameraTransitioner.vPosition.from);\n          cameraTransitioner.move(camera.position, camera.rotation);\n        }\n      },\n      setTransitionTimeAxesVisibility: () => {\n        setTransitionTimeAxesVisibility(transistion2dOnly, core);\n      }\n    };\n  }\n  function layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds2, layerStagger) {\n    const layerItems = [\n      {\n        layer: cubeLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.cubes,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.cubes\n      },\n      {\n        layer: lineLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.lines,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.lines\n      },\n      {\n        layer: textLayer,\n        selection: layerSelection === null || layerSelection === void 0 ? void 0 : layerSelection.texts,\n        stagger: layerStagger === null || layerStagger === void 0 ? void 0 : layerStagger.texts\n      }\n    ];\n    layerItems.forEach((layerItem) => {\n      var _a;\n      return (_a = layerItem.layer) === null || _a === void 0 ? void 0 : _a.update(bounds2, layerItem.selection, layerItem.stagger);\n    });\n  }\n  function convertBounds(bounds2) {\n    if (!bounds2)\n      return;\n    return {\n      minBoundsX: bounds2.x1,\n      maxBoundsX: bounds2.x2,\n      minBoundsY: -bounds2.y2,\n      maxBoundsY: -bounds2.y1,\n      minBoundsZ: minZ,\n      maxBoundsZ: minZ\n    };\n  }\n  function shouldChangeRenderer(prev, next) {\n    var _a, _b;\n    if (!prev || !next)\n      return true;\n    if (prev.advanced !== next.advanced)\n      return true;\n    if (!prev.advanced) {\n      return ((_a = prev.basicOptions) === null || _a === void 0 ? void 0 : _a.antialias) != ((_b = next.basicOptions) === null || _b === void 0 ? void 0 : _b.antialias);\n    }\n  }\n  function getRenderer(mcRendererOptions, core) {\n    const advanced = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced;\n    const r = advanced ? new Main() : new Main$1(mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.basicOptions);\n    core.renderer = r;\n    setRendererOptions(r, mcRendererOptions);\n    return r;\n  }\n  function setRendererOptions(renderer, mcRendererOptions) {\n    const o = mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advancedOptions;\n    if ((mcRendererOptions === null || mcRendererOptions === void 0 ? void 0 : mcRendererOptions.advanced) && o) {\n      for (const key2 in o) {\n        renderer.config[key2] = o[key2];\n      }\n    }\n  }\n  function rendererEnabled(advanced) {\n    const r = advanced ? new Main() : new Main$1();\n    return r.isSupported;\n  }\n  const rightButton = 2;\n  function listenCanvasEvents(core, options) {\n    const { container, pickGridCallback } = options;\n    const { inputManager } = core;\n    if (options.onLasso) {\n      inputManager.pickLassoCallback = (result) => {\n        options.onLasso(result.ids[0], result.manipulator.event);\n      };\n    }\n    inputManager.singleTouchAction = (manipulator) => {\n      if (manipulator.button == rightButton || manipulator.shiftKey || manipulator.ctrlKey) {\n        return SingleTouchAction.rotate;\n      } else if (manipulator.altKey) {\n        return SingleTouchAction.lasso;\n      } else {\n        return SingleTouchAction.translate;\n      }\n    };\n    inputManager.pickAxesGridCallback = ({ divisionX, divisionY, divisionZ, manipulator }) => {\n      clearClickTimeout();\n      const { altKey, button, shiftKey } = manipulator;\n      const me = { altKey, shiftKey, button };\n      const e = me;\n      pickGridCallback([divisionX, divisionY, divisionZ], e);\n    };\n    const canvas = container.getElementsByTagName(\"canvas\")[0];\n    let pickedId;\n    const hover2 = (e) => {\n      if (core.renderer.pickedId !== pickedId) {\n        pickedId = core.renderer.pickedId;\n        const ordinal2 = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n        options.onCubeHover(e, ordinal2);\n      }\n    };\n    canvas.addEventListener(\"mousemove\", (e) => {\n      clearClickTimeout();\n      if (mousedown) {\n        options.onCubeHover(e, null);\n      }\n      hover2(e);\n    });\n    canvas.addEventListener(\"mouseout\", hover2);\n    canvas.addEventListener(\"mouseover\", hover2);\n    let mousedown;\n    canvas.addEventListener(\"mousedown\", () => {\n      mousedown = true;\n    });\n    canvas.addEventListener(\"mouseup\", (e) => {\n      mousedown = false;\n    });\n    let canvasClickTimeout;\n    const clearClickTimeout = () => {\n      clearTimeout(canvasClickTimeout);\n      canvasClickTimeout = null;\n    };\n    canvas.addEventListener(\"click\", (e) => {\n      canvasClickTimeout = setTimeout(() => {\n        options.onCanvasClick(e);\n      }, 50);\n    });\n    inputManager.pickItemCallback = ({ manipulator }) => {\n      clearClickTimeout();\n      const ordinal2 = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n      options.onCubeClick(manipulator.event, ordinal2);\n    };\n  }\n  function cubicInOut(t) {\n    return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n  }\n  function easing(t) {\n    if (t === 0 || t === 1)\n      return t;\n    return cubicInOut(t);\n  }\n  class Transitioner {\n    constructor() {\n      this.isTransitioning = false;\n    }\n    begin() {\n      this.isTransitioning = true;\n      this.time = 0;\n    }\n    elapse(elapsedTime, totalTime, ease = false) {\n      this.time += elapsedTime;\n      if (this.time >= totalTime) {\n        this.isTransitioning = false;\n        this.time = totalTime;\n        this.ended && this.ended();\n      }\n      const t = this.time / totalTime;\n      return ease ? easing(t) : t;\n    }\n  }\n  class CameraTransitioner extends Transitioner {\n    constructor() {\n      super();\n      this.qRotation = {\n        from: create$1(),\n        to: null,\n        current: create$1()\n      };\n      this.vPosition = {\n        from: create$3(),\n        to: null,\n        current: create$3()\n      };\n    }\n    move(position2, rotation2) {\n      this.begin();\n      this.qRotation.to = rotation2;\n      this.vPosition.to = position2;\n    }\n  }\n  class ModelTransitioner extends Transitioner {\n    constructor() {\n      super();\n      this.shouldTransition = false;\n      this.qRotation = {\n        from: null,\n        to: null,\n        current: create$1()\n      };\n    }\n  }\n  function init(options, mcRendererOptions) {\n    const { container } = options;\n    const core = new Core({ container });\n    getRenderer(mcRendererOptions, core);\n    listenCanvasEvents(core, options);\n    core.config.pickSelectDelay = 50;\n    const cameraTransitioner = new CameraTransitioner();\n    const modelTransitioner = new ModelTransitioner();\n    const positionTransitioner = new Transitioner();\n    positionTransitioner.ended = () => {\n      core.renderer.axesVisibility = AxesVisibility.current;\n    };\n    const ref2 = {\n      supportedRenders: {\n        advanced: rendererEnabled(true),\n        basic: rendererEnabled(false)\n      },\n      reset: null,\n      cameraTransitioner,\n      modelTransitioner,\n      positionTransitioner,\n      core,\n      setMorphChartsRendererOptions(mcRendererOptions2) {\n        if (shouldChangeRenderer(ref2.lastMorphChartsRendererOptions, mcRendererOptions2)) {\n          getRenderer(mcRendererOptions2, core);\n          listenCanvasEvents(core, options);\n        } else {\n          if (mcRendererOptions2.advanced) {\n            setRendererOptions(core.renderer, mcRendererOptions2);\n          }\n        }\n        ref2.lastMorphChartsRendererOptions = mcRendererOptions2;\n      },\n      lastMorphChartsRendererOptions: mcRendererOptions,\n      layerStagger: {}\n    };\n    return ref2;\n  }\n  class Presenter {\n    /**\n     * Get the previously rendered Stage object.\n     */\n    get stage() {\n      return this._last.stage;\n    }\n    /**\n     * Get the current View camera type.\n     */\n    get view() {\n      return this._last.view;\n    }\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */\n    constructor(el, style2) {\n      this.el = el;\n      this.style = deepMerge(defaultPresenterStyle, style2);\n      initializePanel(this);\n      this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n    }\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */\n    animationCancel() {\n      if (this.animationTimer) {\n        clearTimeout(this.animationTimer);\n        this.animationTimer = null;\n        if (this.logger) {\n          this.logger(`canceling animation ${this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel || \"handler\"}`);\n        }\n        if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n          this.queuedAnimationOptions.animationCanceled.call(null);\n        }\n      }\n    }\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */\n    animationQueue(handler, timeout2, options) {\n      if (this.logger) {\n        this.logger(`queueing animation ${options && options.waitingLabel || \"waiting\"}...(${timeout2})`);\n      }\n      this.animationCancel();\n      this.animationTimer = setTimeout(() => {\n        if (this.logger) {\n          this.logger(`queueing animation ${options && options.handlerLabel || \"handler\"}...`);\n        }\n        handler();\n      }, timeout2);\n    }\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */\n    getElement(type2) {\n      const elements = this.el.getElementsByClassName(className(type2, this));\n      if (elements && elements.length) {\n        return elements[0];\n      }\n    }\n    /**\n     * Present the Vega Scene, or Stage object using Morphcharts.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area.\n     * @param config Optional presentation configuration object.\n     */\n    present(sceneOrStage, height2, width2, config) {\n      this.animationCancel();\n      const scene = sceneOrStage;\n      let stage;\n      const options = {\n        maxOrdinal: 0,\n        currAxis: null,\n        defaultCubeColor: this.style.defaultCubeColor,\n        assignCubeOrdinal: config && config.onSceneRectAssignCubeOrdinal || (() => options.maxOrdinal++),\n        modifyAxis: (config === null || config === void 0 ? void 0 : config.onAxisItem) ? config.onAxisItem : defaultOnAxisItem,\n        zAxisZindex: config === null || config === void 0 ? void 0 : config.zAxisZindex\n      };\n      if (scene.marktype) {\n        stage = createStage(scene.view);\n        sceneToStage(options, stage, scene);\n      } else {\n        stage = sceneOrStage;\n      }\n      const c2 = deepMerge(defaultPresenterConfig, config);\n      if (!this.morphchartsref) {\n        this._morphChartsOptions = {\n          container: this.getElement(PresenterElement.gl),\n          pickGridCallback: c2.axisPickGridCallback,\n          onCubeHover: (e, ordinal2) => {\n            c2.onCubeHover(e, { ordinal: ordinal2, color: null, position: null, size: null });\n          },\n          onCubeClick: (e, ordinal2) => {\n            c2.onCubeClick(e, { ordinal: ordinal2, color: null, position: null, size: null });\n          },\n          onCanvasClick: config === null || config === void 0 ? void 0 : config.onLayerClick,\n          onLasso: config === null || config === void 0 ? void 0 : config.onLasso\n        };\n        this.morphchartsref = init(this._morphChartsOptions, c2.renderer || defaultPresenterConfig.renderer);\n      }\n      let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n      if (options.maxOrdinal) {\n        cubeCount = Math.max(cubeCount, options.maxOrdinal);\n        const empty = {\n          isEmpty: true\n        };\n        stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData);\n      }\n      config.preLayer && config.preLayer(stage);\n      this.morphChartsRenderResult = morphChartsRender(this.morphchartsref, this._last.stage, stage, height2, width2, config && config.preStage, config && config.morphChartsColors, c2);\n      delete stage.cubeData;\n      delete stage.redraw;\n      this._last = {\n        cubeCount,\n        height: height2,\n        width: width2,\n        stage,\n        view: stage.view\n      };\n      const a2 = getActiveElementInfo();\n      mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement.legend));\n      setActiveElement(a2);\n      if (config && config.onPresent) {\n        config.onPresent();\n      }\n    }\n    canvasToDataURL() {\n      return new Promise((resolve2, reject) => {\n        this.morphchartsref.core.afterRenderCallback = () => {\n          this.morphchartsref.core.afterRenderCallback = null;\n          const canvas = this.getElement(PresenterElement.gl).getElementsByTagName(\"canvas\")[0];\n          const png = canvas.toDataURL(\"image/png\");\n          resolve2(png);\n        };\n      });\n    }\n    configColors(mcColors) {\n      colorConfig(this.morphchartsref, mcColors);\n    }\n    /**\n     * Home the camera to the last initial position.\n     */\n    homeCamera() {\n      var _a;\n      (_a = this.morphchartsref) === null || _a === void 0 ? void 0 : _a.reset();\n    }\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */\n    showGuides() {\n      this.getElement(PresenterElement.gl).classList.add(\"show-center\");\n    }\n    finalize() {\n      this.animationCancel();\n      if (this.morphchartsref)\n        this.morphchartsref.core.stop();\n      if (this.el)\n        this.el.innerHTML = \"\";\n      this._last = null;\n      this.morphchartsref = null;\n      this.el = null;\n      this.logger = null;\n      this.queuedAnimationOptions = null;\n    }\n  }\n  function _RendererGl(loader2) {\n    class RendererGlInternal extends base.vega.Renderer {\n      initialize(el, width2, height2, origin) {\n        this.height = height2;\n        this.width = width2;\n        return super.initialize(el, width2, height2, origin);\n      }\n      resize(width2, height2, origin) {\n        super.resize(width2, height2, origin);\n        this.origin = origin;\n        this.height = height2;\n        this.width = width2;\n        return this;\n      }\n      _render(scene, items) {\n        const scene3d = scene;\n        scene3d.view = this.getView();\n        this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n        return this;\n      }\n    }\n    const instance = new RendererGlInternal(loader2);\n    return instance;\n  }\n  const RendererGl = _RendererGl;\n  let registered = false;\n  function _ViewGl(runtime2, config) {\n    class ViewGlInternal extends base.vega.View {\n      constructor(runtime3, config2 = {}) {\n        super(runtime3, config2);\n        this.config = config2;\n        this.presenter = config2.presenter;\n        config2.presenterConfig = config2.presenterConfig || {};\n        config2.presenterConfig.redraw = () => {\n          this._redraw = true;\n          this.run();\n        };\n      }\n      renderer(...args) {\n        if (args && args.length) {\n          const renderer = args[0];\n          if (renderer === \"morphcharts\" && !registered) {\n            base.vega.renderModule(\"morphcharts\", { handler: base.vega.CanvasHandler, renderer: RendererGl });\n            registered = true;\n          }\n          return super.renderer(renderer);\n        } else {\n          return super.renderer();\n        }\n      }\n      initialize(el) {\n        if (!this.presenter) {\n          this.presenter = new Presenter(el);\n        }\n        super.initialize(this.presenter.getElement(PresenterElement.vegaControls));\n        const renderer = this._renderer;\n        renderer.presenterConfig = this.config.presenterConfig;\n        renderer.presenter = this.presenter;\n        renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView);\n        return this;\n      }\n      error(e) {\n        if (this.presenter.logger) {\n          this.presenter.logger(e);\n        }\n      }\n    }\n    const instance = new ViewGlInternal(runtime2, config);\n    return instance;\n  }\n  const ViewGl = _ViewGl;\n  use(vega$1);\n  class SpecRenderer {\n    constructor() {\n      this.viewType = \"2d\";\n      this.spec = null;\n      this.view = null;\n      const json2 = localStorage.getItem(\"spec\");\n      if (json2) {\n        this.getTextArea().value = json2;\n      }\n    }\n    toggleView() {\n      if (this.viewType === \"3d\") {\n        this.viewType = \"2d\";\n      } else {\n        this.viewType = \"3d\";\n      }\n      this.getText();\n    }\n    getTextArea() {\n      return document.getElementsByTagName(\"textarea\")[0];\n    }\n    getText() {\n      const textarea = this.getTextArea();\n      const text2 = textarea.value;\n      const errorDiv = document.getElementById(\"error\");\n      const splitRight = document.getElementById(\"vis\");\n      try {\n        const spec = JSON.parse(text2);\n        splitRight.style.opacity = \"1\";\n        errorDiv.style.display = \"none\";\n        this.update(spec, text2);\n      } catch (e) {\n        errorDiv.innerText = e;\n        errorDiv.style.display = \"\";\n        splitRight.style.opacity = \"0.1\";\n      }\n    }\n    update(spec, json2) {\n      if (this.view != null) ;\n      const runtime2 = parse(spec);\n      localStorage.setItem(\"spec\", json2);\n      this.view = new ViewGl(\n        runtime2,\n        {\n          getView: () => {\n            return this.viewType;\n          },\n          presenterConfig: {\n            onTargetViewState: (height2, width2) => {\n              return { height: height2, width: width2, newViewStateTarget: false };\n            }\n          }\n        }\n      ).renderer(\"morphcharts\").initialize(document.querySelector(\"#vis\"));\n      this.view.run();\n    }\n  }\n  const specRenderer = new SpecRenderer();\n  window[\"vegaTest\"] = {\n    vega: vega$1,\n    specRenderer\n  };\n}));\n"
  },
  {
    "path": "docs/tests/v4/es6/sanddance-test-es6.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/sanddance-test-es6.css\" />\n</head>\n\n<body>\n    <header>\n        <h1>sanddance test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/sanddance-test-es6.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/es6/vega-morphcharts-test-es6.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-morphcharts test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/vega-morphcharts-test-es6.css\" />\n</head>\n\n<body class=\"columns\">\n    <header>\n        <h1>vega-morphcharts spec editor</h1>\n        <button id=\"view-type-button\" onclick=\"vegaTest.specRenderer.toggleView()\">2D / 3D</button>\n       \n    </header>\n\n    <div id=\"split-left\">\n        <div class=\"textform\">\n            <textarea>\n{\n    \"$schema\": \"https://vega.github.io/schema/vega/v4.json\",\n    \"width\": 500,\n    \"height\": 200,\n    \"padding\": 5,\n\n    \"data\": [\n        {\n            \"name\": \"table\",\n            \"values\": [\n                { \"x\": 0, \"y\": 28, \"c\": 0 }, { \"x\": 0, \"y\": 55, \"c\": 1 },\n                { \"x\": 1, \"y\": 43, \"c\": 0 }, { \"x\": 1, \"y\": 91, \"c\": 1 },\n                { \"x\": 2, \"y\": 81, \"c\": 0 }, { \"x\": 2, \"y\": 53, \"c\": 1 },\n                { \"x\": 3, \"y\": 19, \"c\": 0 }, { \"x\": 3, \"y\": 87, \"c\": 1 },\n                { \"x\": 4, \"y\": 52, \"c\": 0 }, { \"x\": 4, \"y\": 48, \"c\": 1 },\n                { \"x\": 5, \"y\": 24, \"c\": 0 }, { \"x\": 5, \"y\": 49, \"c\": 1 },\n                { \"x\": 6, \"y\": 87, \"c\": 0 }, { \"x\": 6, \"y\": 66, \"c\": 1 },\n                { \"x\": 7, \"y\": 17, \"c\": 0 }, { \"x\": 7, \"y\": 27, \"c\": 1 },\n                { \"x\": 8, \"y\": 68, \"c\": 0 }, { \"x\": 8, \"y\": 16, \"c\": 1 },\n                { \"x\": 9, \"y\": 49, \"c\": 0 }, { \"x\": 9, \"y\": 15, \"c\": 1 }\n            ],\n            \"transform\": [\n                {\n                    \"type\": \"stack\",\n                    \"groupby\": [\"x\"],\n                    \"sort\": { \"field\": \"c\" },\n                    \"field\": \"y\"\n                }\n            ]\n        }\n    ],\n\n    \"scales\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"band\",\n            \"range\": \"width\",\n            \"domain\": { \"data\": \"table\", \"field\": \"x\" }\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"linear\",\n            \"range\": \"height\",\n            \"nice\": true, \"zero\": true,\n            \"domain\": { \"data\": \"table\", \"field\": \"y1\" }\n        },\n        {\n            \"name\": \"color\",\n            \"type\": \"ordinal\",\n            \"range\": \"category\",\n            \"domain\": { \"data\": \"table\", \"field\": \"c\" }\n        }\n    ],\n\n    \"axes\": [\n        { \"orient\": \"bottom\", \"scale\": \"x\", \"title\": \"X Axis\", \"tickColor\": \"red\", \"tickWidth\": 3, \"labelColor\": \"blue\", \"titleColor\": \"green\" },\n        { \"orient\": \"left\", \"scale\": \"y\", \"title\": \"Y Axis\", \"domainColor\": \"magenta\", \"domainWidth\": 2, \"tickWidth\": 7 }\n    ],\n\n    \"marks\": [\n        {\n            \"type\": \"rect\",\n            \"from\": { \"data\": \"table\" },\n            \"encode\": {\n                \"enter\": {\n                    \"x\": { \"scale\": \"x\", \"field\": \"x\" },\n                    \"width\": { \"scale\": \"x\", \"band\": 1, \"offset\": -1 },\n                    \"y\": { \"scale\": \"y\", \"field\": \"y0\" },\n                    \"y2\": { \"scale\": \"y\", \"field\": \"y1\" },\n                    \"fill\": { \"scale\": \"color\", \"field\": \"c\" }\n                },\n                \"update\": {\n                    \"fillOpacity\": { \"value\": 1 }\n                },\n                \"hover\": {\n                    \"fillOpacity\": { \"value\": 0.5 }\n                }\n            }\n        }\n    ],\n    \"legends\": [\n        {\n            \"fill\": \"color\",\n            \"title\": \"Legend\",\n            \"encode\": {\n                \"symbols\": {\n                    \"update\": {\n                        \"shape\": { \"value\": \"square\" }\n                    }\n                }\n            }\n        }\n    ]\n}\n            </textarea>\n            <button onclick=\"vegaTest.specRenderer.getText()\">Apply this spec</button>\n        </div>\n    </div>\n    <div id=\"vis\"></div>    \n    <div id=\"error\"></div>\n\n    <script type=\"module\" src=\"js/vega-morphcharts-test-es6.js\"></script>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "docs/tests/v4/umd/css/test.css",
    "content": "body {\n    font-family: 'Segoe UI', sans-serif;\n}\n\n#vis { \n    position: absolute;\n    bottom: 0;\n    top: 5em;\n    left: 1em;\n    right: 0;\n}\n.sanddance-gl { \n    right: 290px;\n}\n.sanddance-panel {\n    width: 250px;\n}\n.vega-bind-name {\n    display: block;\n}"
  },
  {
    "path": "docs/tests/v4/umd/css/transition.css",
    "content": "html,\nbody {\n    font-family: sans-serif;\n    height: 100%;\n}\n\nbody.rows {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-areas: \"header\" \"view\" \"footer\";\n    margin: 0;\n    overflow: scroll;\n}\n\nbody.columns {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-columns: 40% 60%;\n    grid-template-areas: \"header header\" \"left right\" \"footer footer\";\n    margin: 0;\n}\n\nheader {\n    border-bottom: 1px solid silver;\n    grid-area: header;\n    padding: 0 2em;\n}\n\nfooter {\n    border-top: 1px solid silver;\n    grid-area: footer;\n    padding: 0 2em;\n}\n\n#view-type-button {\n    position: absolute;\n    right: 2em;\n    top: 2em;\n}\n\n#view-div, #view-div .vega-morphcharts-gl {\n    height: 100%;\n}\n\n#split-left.double {\n    display: grid;\n    grid-template-columns: auto;\n    grid-template-rows: 50% 50%;\n}\n\n#split-left {\n    grid-area: left;\n    overflow: hidden;\n}\n\n.textform {\n    background-color: #ccc;\n    display: grid;\n    grid-template-columns: auto;\n    grid-template-rows: auto 2em;\n    padding: 10px;\n}\n\n#split-left textarea {\n    border: 0;\n    height: 100%;\n    padding: 0 0 0 5px;\n    resize: none;\n    width: 100%;\n}\n\n#split-right,\n#error {\n    grid-area: right;\n}\n\n#error {\n    font-size: larger;\n    padding: 1em;\n}\n\n#split-right .vega-bindings {\n    padding: 1em;\n}\n\n.vega-morphcharts-root {\n    display: grid;\n    grid-template-rows: auto 200px;\n    height: 100%;\n}\n\n.vega-morphcharts-legend {\n    font-family: sans-serif;\n    position: absolute;\n    right: 1em;\n    top: 1em;\n    z-index: 1;\n}\n"
  },
  {
    "path": "docs/tests/v4/umd/css/vega-morphcharts.test.css",
    "content": ".vega-morphcharts-gl {\n    border: 1px solid #ccc;\n    height: 700px;\n}\n"
  },
  {
    "path": "docs/tests/v4/umd/embed.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>Embed SandDance Explorer in iframe</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <header>\n        <h1>Embed SandDance Explorer in iframe</h1>\n    </header>\n\n    <!-- \n        Reference the hosted version at https://microsoft.github.io/SandDance/embed/v4/sanddance-embed.html\n        or download it and host it on your own site.\n    -->\n    <iframe id=\"embed\" style=\"width: 90%; height: 600px\" src=\"../../../embed/v4/sanddance-embed.html\"></iframe>\n\n    <script>\n        const embed = document.getElementById('embed');\n        embed.onload = () => {\n            fetch('../../../sample-data/titanicmaster.tsv')\n                .then(response => response.text())\n                .then(rawText => {\n                    const w = document.getElementById('embed').contentWindow;\n                    const message = {\n                        // action definitions: 'init' | 'load' | 'getData' | 'getInsight'\n                        // https://github.com/microsoft/SandDance/blob/master/packages/sanddance-embed/src/types/message.d.ts#L3\n                        action: 'load',\n\n                        // data property may be a raw data file description:\n                        // https://microsoft.github.io/SandDance/docs/sanddance-explorer/v4/interfaces/datafile.html\n                        data: { rawText, type: 'tsv' }\n\n                        // or it may be an array\n                        //data: [{ a: 1 }, { a: 2 }, { a: 3 },]\n                    };\n                    w.postMessage(message, '*');\n\n                    /*\n                    // here we can add a button to get the current insight from the explorer\n                    const b = document.createElement('button');\n                    b.innerText = 'log current insight to console'\n                    b.onclick = () => {\n                        w.postMessage({ action: 'getInsight' }, '*');\n                    };\n                    document.body.appendChild(b);\n                    */\n                });\n        };\n\n        window.onmessage = (e) => {\n            // message responses\n            console.log('messaged', e.data);\n        };\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/js/qualBarChartTest.js",
    "content": "var qualBarChartTest;\n(function (qualBarChartTest) {\n    SandDance.use(vega);\n    qualBarChartTest.viewer = new SandDance.Viewer(document.getElementById('vis'));\n    function getValue(i) {\n        if (i < 20)\n            return 0;\n        if (i < 25)\n            return 1;\n        if (i < 35)\n            return 2;\n        return 3;\n    }\n    var data = [];\n    for (var i = 0; i < 70; i++) {\n        var v = getValue(i);\n        data.push({\n            myUid: i,\n            myX: \"cat\".concat(v),\n            myY: i,\n            myZ: i,\n            myColor: v.toString(),\n            mySort: i,\n        });\n    }\n    var glDiv = qualBarChartTest.viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl);\n    var insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ',\n        },\n        scheme: 'category20',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth,\n        },\n        chart: 'barchart',\n        view: '2d',\n    };\n    qualBarChartTest.viewer.render({ insight: insight }, data, { columnTypes: { myColor: 'string' } });\n})(qualBarChartTest || (qualBarChartTest = {}));\n"
  },
  {
    "path": "docs/tests/v4/umd/js/quanBarChartTest.js",
    "content": "var quanBarChartTest;\n(function (quanBarChartTest) {\n    SandDance.use(vega);\n    quanBarChartTest.viewer = new SandDance.Viewer(document.getElementById('vis'));\n    function getValue(i) {\n        if (i < 200)\n            return 0;\n        if (i < 250)\n            return 1;\n        if (i < 350)\n            return 2;\n        return 3;\n    }\n    var data = [];\n    for (var i = 0; i < 700; i++) {\n        var v = getValue(i);\n        data.push({\n            myUid: i,\n            myX: v,\n            myY: i,\n            myZ: i,\n            myColor: v,\n            mySort: i,\n        });\n    }\n    var glDiv = quanBarChartTest.viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl);\n    var insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ',\n        },\n        scheme: 'redblue',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth,\n        },\n        chart: 'barchart',\n        view: '2d',\n    };\n    quanBarChartTest.viewer.render({ insight: insight }, data);\n})(quanBarChartTest || (quanBarChartTest = {}));\n"
  },
  {
    "path": "docs/tests/v4/umd/js/scatterplotTest.js",
    "content": "var scatterplotTest;\n(function (scatterplotTest) {\n    SandDance.use(vega);\n    scatterplotTest.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    var glDiv = scatterplotTest.viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl);\n    var insight = {\n        columns: {\n            color: 'Education',\n            sort: 'TotalPop',\n            uid: 'Id',\n            x: 'Longitude',\n            y: 'Latitude',\n            z: 'Income',\n        },\n        scheme: 'redblue',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth,\n        },\n        chart: 'scatterplot',\n    };\n    vega.loader().load('../../../sample-data/demovote.tsv').then(function (text) {\n        var data = vega.read(text, { type: 'tsv' });\n        scatterplotTest.viewer.render({ insight: insight }, data);\n    });\n})(scatterplotTest || (scatterplotTest = {}));\n"
  },
  {
    "path": "docs/tests/v4/umd/js/test.js",
    "content": "var test;\n(function (test) {\n    var data = [\n        { myUid: 0, myColor: 0, mySort: 0, myX: 0, myY: 0, myZ: 0 },\n        { myUid: 1, myColor: 1, mySort: 1, myX: 1, myY: 1, myZ: 1 },\n        { myUid: 2, myColor: 2, mySort: 2, myX: 2, myY: 2, myZ: 2 },\n    ];\n    var insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ',\n        },\n        size: {\n            height: 700,\n            width: 700,\n        },\n        chart: 'scatterplot',\n    };\n    SandDance.use(vega);\n    test.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    test.viewer.render({ insight: insight }, data);\n})(test || (test = {}));\n"
  },
  {
    "path": "docs/tests/v4/umd/js/transforms.js",
    "content": "var transformTest;\n(function (transformTest) {\n    var insight = {\n        columns: {\n            color: 'brand',\n            x: 'Horsepower',\n            y: 'Miles_per_Gallon',\n            z: 'Cylinders',\n        },\n        transform: [\n            {\n                type: 'formula',\n                expr: 'split(datum.Name, \" \")',\n                as: 'name_split',\n            },\n            {\n                type: 'formula',\n                expr: 'datum.name_split[0]',\n                as: 'brand',\n            },\n        ],\n        size: {\n            height: 700,\n            width: 700,\n        },\n        scheme: 'category20',\n        view: '2d',\n        chart: 'scatterplot',\n        signalValues: {\n            Chart_PointScaleSignal: 8,\n            Text_AngleXSignal: 0,\n            Text_AngleYSignal: -90,\n        },\n    };\n    SandDance.use(vega);\n    transformTest.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    fetch('https://vega.github.io/editor/data/cars.json').then(function (response) {\n        return response.json();\n    }).then(function (json) {\n        transformTest.viewer.render({ insight: insight }, json);\n    });\n})(transformTest || (transformTest = {}));\n"
  },
  {
    "path": "docs/tests/v4/umd/js/transition.js",
    "content": "var transition;\n(function (transition) {\n    var lastSpec;\n    var viewType = '3d';\n    SandDance.use(vega);\n    function toggleView() {\n        if (viewType === '3d') {\n            viewType = '2d';\n        }\n        else {\n            viewType = '3d';\n        }\n        update(lastSpec);\n    }\n    transition.toggleView = toggleView;\n    function update(spec) {\n        transition.view = new SandDance.VegaMorphCharts.ViewGl(vega.parse(spec), { presenter: transition.view && transition.view.presenter, getView: function () { return viewType; } })\n            .renderer('morphcharts')\n            .initialize(document.querySelector('#split-right'))\n            .run();\n        lastSpec = spec;\n    }\n    transition.update = update;\n    function getText(textId) {\n        var textarea = document.getElementById(textId);\n        var text = textarea.value;\n        var errorDiv = document.getElementById('error');\n        var splitRight = document.getElementById('split-right');\n        try {\n            var spec = JSON.parse(text);\n            splitRight.style.opacity = '1';\n            errorDiv.style.display = 'none';\n            update(spec);\n        }\n        catch (e) {\n            errorDiv.innerText = e;\n            errorDiv.style.display = '';\n            splitRight.style.opacity = '0.1';\n        }\n    }\n    transition.getText = getText;\n    fetch('./specs/scatter3D.json')\n        .then(function (response) { return response.text(); })\n        .then(function (text) {\n        var textarea = document.getElementById('text1');\n        textarea.value = text;\n        getText('text1');\n    });\n    fetch('./specs/titanic.json')\n        .then(function (response) { return response.text(); })\n        .then(function (text) { return document.getElementById('text2').value = text; });\n})(transition || (transition = {}));\n"
  },
  {
    "path": "docs/tests/v4/umd/js/treeMapTest.js",
    "content": "var treeMapTest;\n(function (treeMapTest) {\n    SandDance.use(vega);\n    treeMapTest.viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    var glDiv = treeMapTest.viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl);\n    var insight = {\n        columns: {\n            color: 'Class',\n            size: 'TicketCost',\n            uid: 'Name',\n        },\n        scheme: 'category10',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth,\n        },\n        chart: 'treemap',\n    };\n    vega.loader().load('../../../sample-data/titanicmaster.tsv').then(function (text) {\n        var data = vega.read(text, { type: 'tsv' });\n        treeMapTest.viewer.render({ insight: insight }, data);\n    });\n})(treeMapTest || (treeMapTest = {}));\n"
  },
  {
    "path": "docs/tests/v4/umd/js/vega-morphcharts.test.js",
    "content": "var vegaMorphChartsTest;\n(function (vegaMorphChartsTest) {\n    VegaMorphCharts.use(vega);\n    var spec = {\n        \"$schema\": \"https://vega.github.io/schema/vega/v4.json\",\n        \"background\": \"#DEDEDE\",\n        \"width\": 500,\n        \"height\": 200,\n        \"padding\": 5,\n        \"data\": [\n            {\n                \"name\": \"table\",\n                \"values\": [\n                    { \"x\": 0, \"y\": 28, \"c\": 0 }, { \"x\": 0, \"y\": 55, \"c\": 1 },\n                    { \"x\": 1, \"y\": 43, \"c\": 0 }, { \"x\": 1, \"y\": 91, \"c\": 1 },\n                    { \"x\": 2, \"y\": 81, \"c\": 0 }, { \"x\": 2, \"y\": 53, \"c\": 1 },\n                    { \"x\": 3, \"y\": 19, \"c\": 0 }, { \"x\": 3, \"y\": 87, \"c\": 1 },\n                    { \"x\": 4, \"y\": 52, \"c\": 0 }, { \"x\": 4, \"y\": 48, \"c\": 1 },\n                    { \"x\": 5, \"y\": 24, \"c\": 0 }, { \"x\": 5, \"y\": 49, \"c\": 1 },\n                    { \"x\": 6, \"y\": 87, \"c\": 0 }, { \"x\": 6, \"y\": 66, \"c\": 1 },\n                    { \"x\": 7, \"y\": 17, \"c\": 0 }, { \"x\": 7, \"y\": 27, \"c\": 1 },\n                    { \"x\": 8, \"y\": 68, \"c\": 0 }, { \"x\": 8, \"y\": 16, \"c\": 1 },\n                    { \"x\": 9, \"y\": 49, \"c\": 0 }, { \"x\": 9, \"y\": 15, \"c\": 1 }\n                ],\n                \"transform\": [\n                    {\n                        \"type\": \"stack\",\n                        \"groupby\": [\"x\"],\n                        \"sort\": { \"field\": \"c\" },\n                        \"field\": \"y\"\n                    }\n                ]\n            }\n        ],\n        \"scales\": [\n            {\n                \"name\": \"x\",\n                \"type\": \"band\",\n                \"range\": \"width\",\n                \"domain\": { \"data\": \"table\", \"field\": \"x\" }\n            },\n            {\n                \"name\": \"y\",\n                \"type\": \"linear\",\n                \"range\": \"height\",\n                \"nice\": true, \"zero\": true,\n                \"domain\": { \"data\": \"table\", \"field\": \"y1\" }\n            },\n            {\n                \"name\": \"color\",\n                \"type\": \"ordinal\",\n                \"range\": \"category\",\n                \"domain\": { \"data\": \"table\", \"field\": \"c\" }\n            }\n        ],\n        \"axes\": [\n            { \"orient\": \"bottom\", \"scale\": \"x\", \"title\": \"X Axis\", \"tickColor\": \"red\", \"tickWidth\": 3, \"labelColor\": \"blue\", \"titleColor\": \"green\" },\n            { \"orient\": \"left\", \"scale\": \"y\", \"title\": \"Y Axis\", \"domainColor\": \"magenta\", \"domainWidth\": 2, \"tickWidth\": 7 }\n        ],\n        \"marks\": [\n            {\n                \"type\": \"rect\",\n                \"from\": { \"data\": \"table\" },\n                \"encode\": {\n                    \"enter\": {\n                        \"x\": { \"scale\": \"x\", \"field\": \"x\" },\n                        \"width\": { \"scale\": \"x\", \"band\": 1, \"offset\": -1 },\n                        \"y\": { \"scale\": \"y\", \"field\": \"y0\" },\n                        \"y2\": { \"scale\": \"y\", \"field\": \"y1\" },\n                        \"fill\": { \"scale\": \"color\", \"field\": \"c\" }\n                    },\n                    \"update\": {\n                        \"fillOpacity\": { \"value\": 1 }\n                    },\n                    \"hover\": {\n                        \"fillOpacity\": { \"value\": 0.5 }\n                    }\n                }\n            }\n        ],\n        \"legends\": [\n            {\n                \"fill\": \"color\",\n                \"title\": \"Legend\",\n                \"encode\": {\n                    \"symbols\": {\n                        \"update\": {\n                            \"shape\": { \"value\": \"square\" }\n                        }\n                    }\n                }\n            }\n        ]\n    };\n    var view = new VegaMorphCharts.ViewGl(vega.parse(spec), { getView: function () { return '2d'; } })\n        .renderer('morphcharts')\n        .initialize(document.querySelector('#vis'))\n        .run();\n})(vegaMorphChartsTest || (vegaMorphChartsTest = {}));\n"
  },
  {
    "path": "docs/tests/v4/umd/qualBarChartTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance qualBarChartTest</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v4/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"../../../dist/sanddance/v4/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance qualBarChartTest</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/qualBarChartTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/quanBarChartTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance quanBarChartTest</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v4/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"../../../dist/sanddance/v4/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance quanBarChartTest</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/quanBarChartTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/sanddance-react.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../../dist/sanddance/v4/sanddance.css\">\n</head>\n\n<body>\n\n    <main id=\"app\"></main>\n\n    <script src=\"../../../external/js/react.development.js\" crossorigin=\"\"></script>\n    <script src=\"../../../external/js/react-dom.development.js\" crossorigin=\"\"></script>\n    <script src=\"../../../dist/sanddance/v4/sanddance.js\"></script>\n    <script src=\"../../../dist/sanddance-react/v4/sanddance-react.js\"></script>\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n\n    <style>\n        .sanddance-ReactViewer {\n            height: 800px;\n        }\n    </style>\n    <script>\n\n        SandDanceReact.use(React, ReactDOM, vega);\n\n        class App extends React.Component {\n            constructor(props) {\n                super(props);\n                this.state = {\n                    data: props.data,\n                    index: 0\n                };\n            }\n\n            render() {\n                const { data, index } = this.state;\n\n                return React.createElement('div', {},\n                    React.createElement('button',\n                        {\n                            onClick: () => {\n                                let index = this.state.index + 1;\n                                if (index >= views.length) {\n                                    index = 0;\n                                }\n                                this.setState({ index });\n                            }\n                        },\n                        \"Next\"\n                    ),\n                    React.createElement(SandDanceReact.Viewer,\n                        { data, ...views[index] }\n                    )\n                );\n            }\n        }\n\n        vega.loader().load('../../../sample-data/titanicmaster.tsv').then(tsv_data => {\n            const data = vega.read(tsv_data, { type: 'tsv', parse: 'auto' });\n            const app = React.createElement(App, { data });\n            ReactDOM.render(app, document.getElementById('app'));\n        });\n\n        var views = [\n            {\n                insight: {\n                    columns: {\n                        x: \"Gender\",\n                        y: \"Joined\",\n                        color: \"Survived\",\n                        z: \"TicketCost\",\n                        sort: \"Survived\"\n                    },\n                    scheme: \"dual_redgreen\",\n                    chart: \"barchartV\",\n                    view: \"2d\",\n                    size: {\n                        height: 800,\n                        width: 800\n                    }\n                },\n                setup: {\n                    camera: {\n                        position: [0, 0, 0],\n                        rotation: [0, 0, 0, 1]\n                    },\n                    transition: {\n                        type: \"ordinal\"\n                    },\n                    transitionDurations: {\n                        position: 600,\n                        stagger: 600,\n                        view: 600\n                    },\n                    renderer: {\n                        advanced: false,\n                        advancedOptions: {\n                            bloomIntensity: 2,\n                            isBloomEnabled: false,\n                            isDofEnabled: false,\n                            dofFocusRange: 0.25,\n                            isFxaaEnabled: false,\n                            isShadowEnabled: true,\n                            isSsaoEnabled: true\n                        },\n                        basicOptions: {\n                            antialias: true\n                        }\n                    }\n                }\n            },\n            {\n                insight: {\n                    columns: {\n                        x: \"Survived\",\n                        y: \"Joined\",\n                        color: \"TicketCost\",\n                        z: \"TicketCost\",\n                        sort: \"Survived\"\n                    },\n                    scheme: \"redyellowgreen\",\n                    chart: \"barchartH\",\n                    view: \"2d\",\n                    size: {\n                        height: 800,\n                        width: 800\n                    }\n                },\n                setup: {\n                    camera: {\n                        position: [\n                            0,\n                            0,\n                            0\n                        ],\n                        rotation: [\n                            0.13633213577362982,\n                            -0.37130944289829027,\n                            -0.055216251568944684,\n                            0.9167846049823424\n                        ],\n                        captureSize: {\n                            height: 947,\n                            width: 1496\n                        }\n                    },\n                    renderer: {\n                        advanced: false,\n                        advancedOptions: {\n                            bloomIntensity: 2,\n                            isBloomEnabled: false,\n                            isDofEnabled: false,\n                            dofFocusRange: 0.25,\n                            isFxaaEnabled: false,\n                            isShadowEnabled: true,\n                            isSsaoEnabled: true\n                        },\n                        basicOptions: {\n                            antialias: true\n                        }\n                    },\n                    transition: {\n                        type: \"position\",\n                        dimension: \"x\",\n                    },\n                    transitionDurations: {\n                        position: 702,\n                        stagger: 1998.0000000000002,\n                        view: 600\n                    }\n                }\n            },\n            {\n                insight: {\n                    columns: {\n                        x: \"Survived\",\n                        y: \"Joined\",\n                        color: \"TicketCost\",\n                        z: \"TicketCost\",\n                        sort: \"Survived\"\n                    },\n                    scheme: \"redyellowgreen\",\n                    chart: \"barchartH\",\n                    view: \"2d\",\n                    size: {\n                        height: 800,\n                        width: 800\n                    }\n                },\n                setup: {\n                    camera: undefined,\n                    renderer: {\n                        advanced: true,\n                        advancedOptions: {\n                            bloomIntensity: 2,\n                            isBloomEnabled: false,\n                            isDofEnabled: false,\n                            dofFocusRange: 0.25,\n                            isFxaaEnabled: false,\n                            isShadowEnabled: true,\n                            isSsaoEnabled: true\n                        },\n                        basicOptions: {\n                            antialias: true\n                        }\n                    },\n                    transition: {\n                        type: \"position\",\n                        dimension: \"x\",\n                    },\n                    transitionDurations: {\n                        position: 702,\n                        stagger: 1998.0000000000002,\n                        view: 600\n                    }\n                }\n            }\n        ];\n\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/sanddance-specs.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>sanddance-specs demo</title>\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-specs@1/dist/umd/sanddance-specs.js\" charset=\"utf-8\"></script>\n</head>\n\n<body>\n    <div id=\"view\"></div>\n    <script>\n        vega.loader().load('https://sanddance.js.org/sample-data/titanicmaster.tsv').then(tsv_data => {\n            const data = vega.read(tsv_data, { type: 'tsv', parse: 'auto' });\n\n            const insight = {\n                \"colorBin\": \"quantize\",\n                \"columns\": {\n                    \"x\": \"Gender\",\n                    \"color\": \"Survived\",\n                    \"sort\": \"Survived\",\n                    \"facet\": \"Age\"\n                },\n                \"scheme\": \"set1\",   //see https://vega.github.io/vega/docs/schemes/#reference\n                \"facetStyle\": \"wrap\",\n                \"size\": {\n                    \"height\": 600,\n                    \"width\": 800\n                },\n                \"chart\": \"barchartV\"\n            };\n\n            const columns = SandDanceSpecs.getColumnsFromData(vega.inferTypes, data);\n            const specColumns = SandDanceSpecs.getSpecColumns(insight, columns);\n            const specViewOptions = {\n                colors: {\n                    defaultCube: \"steelblue\",\n                    axisLine: \"#000\",\n                    axisText: \"#000\"\n                },\n                language: {\n                    count: \"Count\"\n                },\n                maxLegends: 20,\n                tickSize: 10\n            };\n            const context = { specColumns, insight, specViewOptions };\n            const specResult = SandDanceSpecs.build(context, data);\n\n            if (specResult.errors) {\n                console.log(specResult.errors);\n            } else {\n                console.log(specResult.vegaSpec);\n            }\n\n            const runtime = vega.parse(specResult.vegaSpec);\n            const vegaView = new vega.View(runtime, {\n                renderer: 'canvas',  // renderer (canvas or svg)\n                container: '#view',   // parent DOM container\n            });\n            vegaView.runAsync().then(() => {\n                console.log(`done`);\n            }).catch(e => {\n                console.log(`error ${e}`);\n            });\n\n        });\n    </script>\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/scatterplotTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance scatterplot test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v4/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"../../../dist/sanddance/v4/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance scatterplot test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/scatterplotTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/specs/scatter3D.json",
    "content": "{\n    \"$schema\": \"https://vega.github.io/schema/vega/v3.json\",\n    \"width\": 700,\n    \"height\": 700,\n    \"padding\": 5,\n    \"signals\": [\n        {\n            \"name\": \"depth\",\n            \"value\": 700\n        },\n        {\n            \"name\": \"xaxis\",\n            \"value\": \"Longitude\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"yaxis\",\n            \"value\": \"Latitude\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"zaxis\",\n            \"value\": \"Obama\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"colorBy\",\n            \"value\": \"Income\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"size\",\n            \"value\": \"MedAge\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"ProjLongitude\",\n                    \"ProjLatitude\",\n                    \"Longitude\",\n                    \"Latitude\",\n                    \"TotalPop\",\n                    \"MedAge\",\n                    \"Education\",\n                    \"Income\",\n                    \"Obama\",\n                    \"MedHomeValue\",\n                    \"Winner\",\n                    \"State\"\n                ]\n            }\n        },\n        {\n            \"name\": \"reverseColor\",\n            \"value\": false,\n            \"bind\": {\n                \"input\": \"checkbox\"\n            }\n        }\n    ],\n    \"projections\": [\n        {\n            \"name\": \"projection\",\n            \"type\": \"albersUsa\"\n        }\n    ],\n    \"data\": [\n        {\n            \"name\": \"source\",\n            \"format\": {\n                \"type\": \"tsv\",\n                \"parse\": \"auto\"\n            },\n            \"url\": \"../../../sample-data/demovote.tsv\",\n            \"transform\": [\n                {\n                    \"type\": \"geopoint\",\n                    \"projection\": \"projection\",\n                    \"fields\": [\n                        \"Longitude\",\n                        \"Latitude\"\n                    ],\n                    \"as\": [\n                        \"ProjLongitude\",\n                        \"ProjLatitude\"\n                    ]\n                }\n            ]\n        }\n    ],\n    \"scales\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"xaxis\"\n                }\n            },\n            \"range\": \"width\"\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"yaxis\"\n                }\n            },\n            \"range\": \"height\"\n        },\n        {\n            \"name\": \"z\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": true,\n            \"zero\": false,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"zaxis\"\n                }\n            },\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"depth\"\n                }\n            ]\n        },\n        {\n            \"name\": \"size\",\n            \"type\": \"linear\",\n            \"round\": true,\n            \"nice\": false,\n            \"zero\": true,\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"size\"\n                }\n            },\n            \"range\": [\n                5,\n                30\n            ]\n        },\n        {\n            \"name\": \"mycolorscale\",\n            \"type\": \"sequential\",\n            \"interpolate\": \"rgb\",\n            \"reverse\": {\n                \"signal\": \"reverseColor\"\n            },\n            \"domain\": {\n                \"data\": \"source\",\n                \"field\": {\n                    \"signal\": \"colorBy\"\n                }\n            },\n            \"range\": [\n                \"#0000ff\",\n                \"#00ff00\",\n                \"#ff0000\"\n            ]\n        }\n    ],\n    \"axes\": [\n        {\n            \"scale\": \"x\",\n            \"grid\": true,\n            \"domain\": true,\n            \"orient\": \"bottom\",\n            \"tickCount\": 5,\n            \"title\": {\n                \"signal\": \"xaxis\"\n            }\n        },\n        {\n            \"scale\": \"y\",\n            \"grid\": true,\n            \"domain\": true,\n            \"orient\": \"left\",\n            \"titlePadding\": 5,\n            \"title\": {\n                \"signal\": \"yaxis\"\n            }\n        }\n    ],\n    \"marks\": [\n        {\n            \"name\": \"marks2\",\n            \"type\": \"rect\",\n            \"from\": {\n                \"data\": \"source\"\n            },\n            \"encode\": {\n                \"update\": {\n                    \"x\": {\n                        \"scale\": \"x\",\n                        \"field\": {\n                            \"signal\": \"xaxis\"\n                        }\n                    },\n                    \"y\": {\n                        \"scale\": \"y\",\n                        \"field\": {\n                            \"signal\": \"yaxis\"\n                        }\n                    },\n                    \"z\": {\n                        \"scale\": \"z\",\n                        \"field\": {\n                            \"signal\": \"zaxis\"\n                        }\n                    },\n                    \"depth\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"width\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"height\": {\n                        \"scale\": \"size\",\n                        \"field\": {\n                            \"signal\": \"size\"\n                        }\n                    },\n                    \"opacity\": {\n                        \"value\": 0.6\n                    },\n                    \"fill\": {\n                        \"scale\": \"mycolorscale\",\n                        \"field\": {\n                            \"signal\": \"colorBy\"\n                        }\n                    },\n                    \"stroke\": {\n                        \"scale\": \"mycolorscale\",\n                        \"field\": {\n                            \"signal\": \"colorBy\"\n                        }\n                    }\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "docs/tests/v4/umd/specs/titanic.json",
    "content": "{\n    \"$schema\": \"https://vega.github.io/schema/vega/v3.json\",\n    \"height\": 500,\n    \"padding\": 5,\n    \"signals\": [\n        {\n            \"name\": \"columns\",\n            \"value\": 17,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 10,\n                \"max\": 35,\n                \"step\": 1\n            }\n        },\n        {\n            \"name\": \"bins\",\n            \"value\": 7,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 2,\n                \"max\": 20,\n                \"step\": 1\n            }\n        },\n        {\n            \"name\": \"x_step\",\n            \"value\": 200,\n            \"bind\": {\n                \"input\": \"range\",\n                \"min\": 60,\n                \"max\": 200,\n                \"step\": 20\n            }\n        },\n        {\n            \"name\": \"x_padding\",\n            \"value\": 0.2\n        },\n        {\n            \"name\": \"width\",\n            \"update\": \"bandspace(domain('xscale2').length, x_padding, x_padding) * x_step\"\n        },\n        {\n            \"name\": \"height\",\n            \"update\": \"(rowxtent[1])*(bandwidth('xscale')+2*x_padding)\"\n        },\n        {\n            \"name\": \"newheight2\",\n            \"update\": \"(rowxtent[1]-1)*(bandwidth('xscale')+2*x_padding)\"\n        },\n        {\n            \"name\": \"variable\",\n            \"value\": \"Age\",\n            \"bind\": {\n                \"input\": \"select\",\n                \"options\": [\n                    \"Age\",\n                    \"TicketCost\"\n                ]\n            }\n        }\n    ],\n    \"data\": [\n        {\n            \"name\": \"points\",\n            \"format\": {\n                \"type\": \"tsv\",\n                \"parse\": \"auto\"\n            },\n            \"url\": \"../../../sample-data/titanicmaster.tsv\"\n        },\n        {\n            \"name\": \"nested\",\n            \"source\": \"points\",\n            \"transform\": [\n                {\n                    \"type\": \"extent\",\n                    \"field\": {\n                        \"signal\": \"variable\"\n                    },\n                    \"signal\": \"age_extent\"\n                },\n                {\n                    \"type\": \"bin\",\n                    \"field\": {\n                        \"signal\": \"variable\"\n                    },\n                    \"extent\": {\n                        \"signal\": \"age_extent\"\n                    },\n                    \"maxbins\": {\n                        \"signal\": \"bins\"\n                    },\n                    \"as\": [\n                        \"age0\",\n                        \"age1\"\n                    ]\n                },\n                {\n                    \"type\": \"stack\",\n                    \"groupby\": [\n                        \"age0\"\n                    ],\n                    \"sort\": {\n                        \"field\": {\n                            \"signal\": \"variable\"\n                        }\n                    }\n                },\n                {\n                    \"type\": \"formula\",\n                    \"expr\": \"floor(datum.y0 / columns)\",\n                    \"as\": \"row\"\n                },\n                {\n                    \"type\": \"extent\",\n                    \"signal\": \"xtent\",\n                    \"field\": \"y1\"\n                },\n                {\n                    \"type\": \"extent\",\n                    \"signal\": \"rowxtent\",\n                    \"field\": \"row\"\n                },\n                {\n                    \"type\": \"formula\",\n                    \"expr\": \"datum.y0 % columns\",\n                    \"as\": \"column\"\n                }\n            ]\n        }\n    ],\n    \"scales\": [\n        {\n            \"name\": \"xscale\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"x_step * (1-x_padding)\"\n                }\n            ],\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"column\",\n                \"sort\": true\n            }\n        },\n        {\n            \"name\": \"yscale\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"newheight2\"\n                }\n            ],\n            \"round\": true,\n            \"reverse\": true,\n            \"align\": 1,\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"row\",\n                \"sort\": true\n            },\n            \"zero\": true,\n            \"nice\": true\n        },\n        {\n            \"name\": \"yscalea\",\n            \"type\": \"band\",\n            \"range\": [\n                0,\n                {\n                    \"signal\": \"height\"\n                }\n            ],\n            \"round\": true,\n            \"reverse\": true,\n            \"align\": 1,\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"row\",\n                \"sort\": true\n            },\n            \"zero\": true,\n            \"nice\": true\n        },\n        {\n            \"name\": \"xscale2\",\n            \"type\": \"band\",\n            \"range\": {\n                \"step\": {\n                    \"signal\": \"x_step\"\n                }\n            },\n            \"padding\": {\n                \"signal\": \"x_padding\"\n            },\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": \"age0\",\n                \"sort\": true\n            }\n        },\n        {\n            \"name\": \"mycolor\",\n            \"type\": \"linear\",\n            \"domain\": {\n                \"data\": \"nested\",\n                \"field\": {\n                    \"signal\": \"variable\"\n                }\n            },\n            \"range\": {\n                \"scheme\": \"redyellowgreen\"\n            }\n        }\n    ],\n    \"axes\": [\n        {\n            \"orient\": \"bottom\",\n            \"scale\": \"xscale2\",\n            \"zindex\": 1\n        },\n        {\n            \"orient\": \"left\",\n            \"scale\": \"yscalea\",\n            \"zindex\": 1,\n            \"title\": \"People\",\n            \"encode\": {\n                \"ticks\": {\n                    \"update\": {\n                        \"stroke\": {\n                            \"value\": \"steelblue\"\n                        }\n                    }\n                },\n                \"labels\": {\n                    \"interactive\": true,\n                    \"update\": {\n                        \"text\": {\n                            \"signal\": \"columns * datum.value\"\n                        }\n                    }\n                }\n            }\n        }\n    ],\n    \"marks\": [\n        {\n            \"type\": \"rect\",\n            \"from\": {\n                \"data\": \"nested\"\n            },\n            \"encode\": {\n                \"update\": {\n                    \"x\": {\n                        \"scale\": \"xscale2\",\n                        \"field\": \"age0\",\n                        \"offset\": {\n                            \"scale\": \"xscale\",\n                            \"field\": \"column\"\n                        }\n                    },\n                    \"width\": {\n                        \"scale\": \"xscale\",\n                        \"band\": true\n                    },\n                    \"y\": {\n                        \"scale\": \"yscale\",\n                        \"field\": \"row\",\n                        \"band\": true\n                    },\n                    \"z\": {\n                        \"field\": \"TicketCost\"\n                    },\n                    \"depth\": {\n                        \"value\": 10\n                    },\n                    \"id\": {\n                        \"field\": \"Id\"\n                    },\n                    \"height\": {\n                        \"scale\": \"xscale\",\n                        \"band\": true\n                    },\n                    \"fill\": {\n                        \"scale\": \"mycolor\",\n                        \"field\": {\n                            \"signal\": \"variable\"\n                        }\n                    },\n                    \"stroke\": {\n                        \"value\": \"white\"\n                    }\n                },\n                \"hover\": {\n                    \"fill\": {\n                        \"value\": \"firebrick\"\n                    }\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "docs/tests/v4/umd/test.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v4/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"../../../dist/sanddance/v4/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/test.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/transforms.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v4/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"../../../dist/sanddance/v4/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance transforms test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/transforms.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/transition.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>vega-deck.gl transition</title>\n    <link rel=\"stylesheet\" href=\"css/transition.css\">\n</head>\n\n<body class=\"columns\">\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"../../../dist/sanddance/v4/sanddance.js\"></script>\n\n    <header>\n        <h1>vega-deck.gl transition editor</h1>\n        <button id=\"view-type-button\" onclick=\"transition.toggleView()\">2D / 3D</button>\n    </header>\n    <div id=\"split-left\" class=\"double\">\n        <div class=\"textform\">\n            <textarea id=\"text1\"></textarea>\n            <button onclick=\"transition.getText('text1')\">Apply this spec</button>\n        </div>\n        <div class=\"textform\">\n            <textarea id=\"text2\"></textarea>\n            <button onclick=\"transition.getText('text2')\">Apply this spec</button>\n        </div>\n    </div>\n    <div id=\"split-right\">\n    </div>\n    <div id=\"error\"></div>\n    <footer>\n    </footer>\n\n    <script src=\"js/transition.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/treeMapTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance scatterplot test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../../../dist/sanddance/v4/sanddance.css\" />\n    <link rel=\"stylesheet\" href=\"css/test.css\" />\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"../../../dist/sanddance/v4/sanddance.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>sanddance treemap test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/treeMapTest.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tests/v4/umd/vega-morphcharts.test.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-morphcharts test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"css/vega-morphcharts.test.css\" />\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <script src=\"../../../dist/vega-morphcharts/v1/vega-morphcharts.js\"></script>\n</head>\n\n<body>\n    <header>\n        <h1>vega-morphcharts test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"js/vega-morphcharts.test.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/tutorial/index.md",
    "content": "---\nlayout: docs\n---\n\nTODO: A tutorial page\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import { defineConfig } from 'eslint/config';\nimport react from 'eslint-plugin-react';\nimport typescriptEslint from '@typescript-eslint/eslint-plugin';\nimport globals from 'globals';\nimport tsParser from '@typescript-eslint/parser';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport js from '@eslint/js';\nimport { FlatCompat } from '@eslint/eslintrc';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\nconst compat = new FlatCompat({\n    baseDirectory: __dirname,\n    recommendedConfig: js.configs.recommended,\n    allConfig: js.configs.all,\n});\n\nexport default defineConfig([{\n    extends: compat.extends('eslint:recommended', 'plugin:@typescript-eslint/eslint-recommended'),\n\n    plugins: {\n        react,\n        '@typescript-eslint': typescriptEslint,\n    },\n\n    languageOptions: {\n        globals: {\n            ...globals.browser,\n            ...globals.mocha,\n            ...globals.node,\n            Atomics: 'readonly',\n            SharedArrayBuffer: 'readonly',\n        },\n\n        parser: tsParser,\n        ecmaVersion: 2018,\n        sourceType: 'module',\n\n        parserOptions: {\n            ecmaFeatures: {\n                jsx: true,\n            },\n        },\n    },\n\n    rules: {\n        'comma-dangle': ['error', 'always-multiline'],\n        'no-inner-declarations': ['off'],\n        'no-mixed-spaces-and-tabs': ['off'],\n        'no-prototype-builtins': ['off'],\n\n        'indent': ['error', 4, {\n            SwitchCase: 1,\n        }],\n\n        'no-unused-vars': ['off'],\n        'prefer-spread': ['off'],\n        'quote-props': ['error', 'consistent-as-needed'],\n        'quotes': ['error', 'single'],\n        'semi': ['error', 'always'],\n    },\n}]);"
  },
  {
    "path": "extensions/azdata-sanddance/.gitattributes",
    "content": "# Set default behavior to automatically normalize line endings.\n* text=auto\n\n"
  },
  {
    "path": "extensions/azdata-sanddance/.gitignore",
    "content": "dist\nnode_modules\n.vscode-test/\n*.vsix\nresources/\n!src/ui/*.js"
  },
  {
    "path": "extensions/azdata-sanddance/.vscode/settings.json",
    "content": "// Place your settings in this file to overwrite default and user settings.\n{\n    \"files.exclude\": {\n        \"out\": false // set this to true to hide the \"out\" folder with the compiled JS files\n    },\n    \"search.exclude\": {\n        \"out\": true // set this to false to include \"out\" folder in search results\n    },\n    // Turn off tsc task auto detection since we have the necessary tasks as npm scripts\n    \"typescript.tsc.autoDetect\": \"off\"\n}"
  },
  {
    "path": "extensions/azdata-sanddance/.vscode/tasks.json",
    "content": "// See https://go.microsoft.com/fwlink/?LinkId=733558\n// for the documentation about the tasks.json format\n{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"type\": \"npm\",\n            \"script\": \"watch\",\n            \"problemMatcher\": \"$tsc-watch\",\n            \"isBackground\": true,\n            \"presentation\": {\n                \"reveal\": \"never\"\n            },\n            \"group\": {\n                \"kind\": \"build\",\n                \"isDefault\": true\n            }\n        }\n    ]\n}"
  },
  {
    "path": "extensions/azdata-sanddance/.vscodeignore",
    "content": ".vscode/**\n.vscode-test/**\ndist/**/*.map\nnode_modules/**\nsrc/**\n.gitignore\ntsconfig.json\n*.vsix\nwebpack.config.js\n"
  },
  {
    "path": "extensions/azdata-sanddance/CHANGELOG.md",
    "content": "# Change Log\n\n## [4.1.0]\n- Column type editor in Data Browser\n\n## [4.0.2]\n- Fix z-axis order\n- Added new Vega color schemes\n- Use area squared formula for scatterplot size scaling\n- Use integers for small bin steps\n- Snapshots revive background image\n\n## [4.0.1]\n- New 3d engine\n- Transitions tab\n\n## [3.3.0]\n- Show the z axis scale in 3d\n\n## [3.2.0]\n- Fix for last bin of quantitative band scale\n- Support virtual workspaces\n- Declare support for untrusted workspaces\n\n## [3.1.1]\n- Fix for fuzzy text rendering \n\n## [3.1.0]\n- Fix animation final frame \n- Render Unicode character sets \n\n## [3.0.0]\n- (Major version number in sync with core components)\n- Faceting for all chart types\n- Cross faceting\n- Sum aggregation as treemaps or strips\n- Scatterplot size & z-grounding\n- 3D lighting from camera position\n- History undo / redo\n- Snapshot notes\n\n## [1.3.9]\n- Opacity slider (for overlapping cubes)\n- Round numbers in Legend\n\n## [1.3.6]\n- Horizontal bar chart\n- Direct color mapping\n\n## [1.3.5]\n- Sub-pixel rendering\n\n## [1.3.4]\n- Legend title is clickable\n- Legend, Tooltips and Search handle boolean values\n\n## [1.3.3]\n- Axes titles are clickable\n\n## [1.3.2]\n- SandDance now has tooltips\n\n## [1.3.1]\n- Updated sanddance-explorer to use chart recommendation heuristics\n\n## [1.3.0]\n- Enable visualization from SQL results grid\n\n## [1.2.0]\n- Added chart types: Grid\n- Added search expression grouping\n- Option to hide axes & legend\n- Data does not require a unique identifier column\n\n## [1.1.0]\n- Added chart types: Density & Stacks\n\n## [0.2.5]\n- Added icon\n\n## [0.2.4]\n- Added preview tag to package.json\n\n## [0.2.3]\n- Fixed logo link\n\n## [0.2.2]\n- Added dark theme\n"
  },
  {
    "path": "extensions/azdata-sanddance/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "extensions/azdata-sanddance/README.md",
    "content": "# SandDance for Azure Data Studio\n\nVisually explore, understand, and present your data.\n\n![sanddance-animation](https://user-images.githubusercontent.com/11507384/66725060-5bcc0580-ede2-11e9-9f69-7bbd9a208697.gif)\n\nBy using easy-to-understand views, SandDance helps you find insights about your data, which in turn help you tell stories supported by data, build cases based on evidence, test hypotheses, dig deeper into surface explanations, support decisions for purchases, or relate data into a wider, real world context.\n\nSandDance uses unit visualizations, which apply a one-to-one mapping between rows in your database and marks on the screen.\nSmooth animated transitions between views help you to maintain context as you interact with your data.\n\n## Usage\n\nThere are multiple ways to invoke a visualization:\n* Right-click on a .csv or .tsv file and choose *View in SandDance*.\n* In SQL query results pane, click the Visualizer icon.\n\n## Known Issues\n\nSee https://github.com/Microsoft/SandDance#known-issues\n\n## Release Notes\n\n### 3.0.0\n\nMajor upgrade to layout engine\n\n### 1.0.0\n\nInitial release of azdata-sanddance\n\n## License\n\nThis extension is licensed under the [MIT License](https://github.com/microsoft/SandDance/blob/main/extensions/azdata-sanddance/LICENSE).\n"
  },
  {
    "path": "extensions/azdata-sanddance/package.json",
    "content": "{\n    \"name\": \"azdata-sanddance\",\n    \"displayName\": \"SandDance for Azure Data Studio\",\n    \"description\": \"Visually explore, understand, and present your data.\",\n    \"version\": \"4.2.0\",\n    \"icon\": \"sanddance-logo.png\",\n    \"preview\": true,\n    \"publisher\": \"msrvida\",\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/Microsoft/Sanddance\"\n    },\n    \"engines\": {\n        \"vscode\": \"^1.53.0\",\n        \"azdata\": \"*\"\n    },\n    \"categories\": [\n        \"Data Science\",\n        \"Other\",\n        \"Visualization\"\n    ],\n    \"keywords\": [\n        \"data exploration\",\n        \"data visualization\",\n        \"dataviz\"\n    ],\n    \"activationEvents\": [\n        \"*\"\n    ],\n    \"main\": \"./dist/extension-bundle\",\n    \"capabilities\": {\n        \"untrustedWorkspaces\": {\n            \"supported\": true\n        },\n        \"virtualWorkspaces\": true\n    },\n    \"contributes\": {\n        \"commands\": [\n            {\n                \"command\": \"sanddance.view\",\n                \"title\": \"View in SandDance\"\n            }\n        ],\n        \"languages\": [\n            {\n                \"id\": \"csv\",\n                \"extensions\": [\n                    \".csv\"\n                ]\n            },\n            {\n                \"id\": \"tsv\",\n                \"extensions\": [\n                    \".tsv\"\n                ]\n            }\n        ],\n        \"menus\": {\n            \"commandPalette\": [\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"false\"\n                }\n            ],\n            \"explorer/context\": [\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == csv\"\n                },\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == tsv\"\n                }\n            ],\n            \"editor/title/context\": [\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == csv\"\n                },\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == tsv\"\n                }\n            ],\n            \"objectExplorer/item/context\": [\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"nodeType=~/^mssqlCluster/ && nodeLabel=~/[^\\\\s]+(\\\\.(csv|tsv))$/ && nodeType == mssqlCluster:file\"\n                }\n            ]\n        }\n    },\n    \"scripts\": {\n        \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n        \"clean\": \"rimraf ./resources/*.*\",\n        \"vscode:prepublish\": \"webpack --mode production\",\n        \"webpack\": \"webpack --mode development\",\n        \"webpack-dev\": \"webpack --mode development --watch\",\n        \"resources\": \"node ../common-frontend/scripts/resources.js\",\n        \"compile\": \"tsc -p ./\",\n        \"x-build:08\": \"npm run compile && npm run resources\",\n        \"x-test\": \"npm run compile && node ./node_modules/vscode/bin/test\",\n        \"x-deploy\": \"node ./scripts/deploy.js\",\n        \"x-build:09\": \"vsce package\"\n    }\n}\n"
  },
  {
    "path": "extensions/azdata-sanddance/scripts/deploy.js",
    "content": "const fs = require('fs');\nconst package = require('../package.json');\nconst filename = `${package.name}-${package.version}.vsix`;\nfs.copyFileSync(`./${filename}`, `../../docs/dist/azdata/v4/${filename}`);\n"
  },
  {
    "path": "extensions/azdata-sanddance/sql.bat",
    "content": "@echo off\nsetlocal\n\ntitle VSCode Dev\n\npushd %~dp0\\..\n\n:: Node modules\nif not exist node_modules call yarn\n\nfor /f \"tokens=2 delims=:,\" %%a in ('findstr /R /C:\"\\\"nameShort\\\":.*\" product.json') do set NAMESHORT=%%~a\nset NAMESHORT=%NAMESHORT: \"=%\nset NAMESHORT=%NAMESHORT:\"=%.exe\nset CODE=\".build\\electron\\%NAMESHORT%\"\n\n:: Download Electron if needed\nnode build\\lib\\electron.js\nif %errorlevel% neq 0 node .\\node_modules\\gulp\\bin\\gulp.js electron\n\n:: Build\nif not exist out node .\\node_modules\\gulp\\bin\\gulp.js compile\n\n:: Configuration\nset NODE_ENV=development\nset VSCODE_DEV=1\nset VSCODE_CLI=1\nset ELECTRON_DEFAULT_ERROR_MODE=1\nset ELECTRON_ENABLE_LOGGING=1\nset ELECTRON_ENABLE_STACK_DUMPING=1\n\n:: Launch Code\n\n:: Use the following to get v8 tracing:\n:: %CODE% --js-flags=\"--trace-hydrogen --trace-phase=Z --trace-deopt --code-comments --hydrogen-track-positions --redirect-code-traces\" . %*\n\n%CODE% . %*\n\npopd\n\nendlocal\n"
  },
  {
    "path": "extensions/azdata-sanddance/sql.sh",
    "content": "#!/usr/bin/env bash\n\nif [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n\trealpath() { [[ $1 = /* ]] && echo \"$1\" || echo \"$PWD/${1#./}\"; }\n\tROOT=$(dirname $(dirname $(realpath \"$0\")))\nelse\n\tROOT=$(dirname $(dirname $(readlink -f $0)))\nfi\n\nfunction code() {\n\tcd $ROOT\n\n\tif [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n\t\tNAME=`node -p \"require('./product.json').nameLong\"`\n\t\tCODE=\"./.build/electron/$NAME.app/Contents/MacOS/Electron\"\n\telse\n\t\tNAME=`node -p \"require('./product.json').applicationName\"`\n\t\tCODE=\".build/electron/$NAME\"\n\tfi\n\n\tINTENDED_VERSION=\"v`node -p \"require('./package.json').electronVersion\"`\"\n\tINSTALLED_VERSION=`cat .build/electron/version 2> /dev/null`\n\n\t# Node modules\n\ttest -d node_modules || ./scripts/npm.sh install\n\n\t# Get electron\n\t(test -f \"$CODE\" && [ $INTENDED_VERSION == $INSTALLED_VERSION ]) || ./node_modules/.bin/gulp electron\n\n\t# Build\n\ttest -d out || ./node_modules/.bin/gulp compile\n\n\t# Configuration\n\texport NODE_ENV=development\n\texport VSCODE_DEV=1\n\texport VSCODE_CLI=1\n\texport ELECTRON_ENABLE_LOGGING=1\n\texport ELECTRON_ENABLE_STACK_DUMPING=1\n\n\t# Launch Code\n\texec \"$CODE\" . \"$@\"\n}\n\ncode \"$@\"\n"
  },
  {
    "path": "extensions/azdata-sanddance/src/azdata.proposed.d.ts",
    "content": "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the Source EULA. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n// This is the place for API experiments and proposal.\n\nimport * as vscode from 'vscode';\n\ndeclare module 'azdata' {\n\n\t// EXPORTED NAMESPACES /////////////////////////////////////////////////\n\t/**\n\t * Namespace for Data Management Protocol global methods\n\t */\n\texport namespace dataprotocol {\n\t\texport function registerConnectionProvider(provider: ConnectionProvider): vscode.Disposable;\n\n\t\texport function registerBackupProvider(provider: BackupProvider): vscode.Disposable;\n\n\t\texport function registerRestoreProvider(provider: RestoreProvider): vscode.Disposable;\n\n\t\texport function registerScriptingProvider(provider: ScriptingProvider): vscode.Disposable;\n\n\t\texport function registerObjectExplorerProvider(provider: ObjectExplorerProvider): vscode.Disposable;\n\n\t\texport function registerObjectExplorerNodeProvider(provider: ObjectExplorerNodeProvider): vscode.Disposable;\n\n\t\texport function registerIconProvider(provider: IconProvider): vscode.Disposable;\n\n\t\texport function registerTaskServicesProvider(provider: TaskServicesProvider): vscode.Disposable;\n\n\t\texport function registerFileBrowserProvider(provider: FileBrowserProvider): vscode.Disposable;\n\n\t\texport function registerProfilerProvider(provider: ProfilerProvider): vscode.Disposable;\n\n\t\texport function registerMetadataProvider(provider: MetadataProvider): vscode.Disposable;\n\n\t\texport function registerQueryProvider(provider: QueryProvider): vscode.Disposable;\n\n\t\texport function registerAdminServicesProvider(provider: AdminServicesProvider): vscode.Disposable;\n\n\t\texport function registerAgentServicesProvider(provider: AgentServicesProvider): vscode.Disposable;\n\n\t\texport function registerCapabilitiesServiceProvider(provider: CapabilitiesProvider): vscode.Disposable;\n\n\t\texport function registerDacFxServicesProvider(provider: DacFxServicesProvider): vscode.Disposable;\n\n\t\texport function registerSchemaCompareServicesProvider(provider: SchemaCompareServicesProvider): vscode.Disposable;\n\n\t\t/**\n\t\t * An [event](#Event) which fires when the specific flavor of a language used in DMP\n\t\t * connections has changed. And example is for a SQL connection, the flavor changes\n\t\t * to MSSQL\n\t\t */\n\t\texport const onDidChangeLanguageFlavor: vscode.Event<DidChangeLanguageFlavorParams>;\n\t}\n\n\t/**\n\t * Namespace for credentials management global methods, available to all extensions\n\t */\n\texport namespace credentials {\n\t\t/**\n\t\t * Register a credential provider to handle credential requests.\n\t\t * @param provider The provider to register\n\t\t * @return Handle to the provider for disposal\n\t\t */\n\t\texport function registerProvider(provider: CredentialProvider): vscode.Disposable;\n\n\t\t/**\n\t\t * Retrieves a provider from the extension host if one has been registered. Any credentials\n\t\t * accessed with the returned provider will have the namespaceId appended to credential ID\n\t\t * to prevent extensions from trampling over each others' credentials.\n\t\t * @param namespaceId ID that will be appended to credential IDs.\n\t\t * @return Promise that returns the namespaced provider\n\t\t */\n\t\texport function getProvider(namespaceId: string): Thenable<CredentialProvider>;\n\t}\n\n\t/**\n\t * Namespace for serialization management global methods\n\t */\n\texport namespace serialization {\n\t\texport function registerProvider(provider: SerializationProvider): vscode.Disposable;\n\t}\n\n\t/**\n\t * Namespace for connection management\n\t */\n\texport namespace connection {\n\t\t/**\n\t\t * Get all active connections\n\t\t*/\n\t\texport function getActiveConnections(): Thenable<Connection[]>;\n\n\t\t/**\n\t\t * Get connection string\n\t\t*/\n\t\texport function getConnectionString(connectionId: string, includePassword: boolean): Thenable<string>;\n\n\t\t/**\n\t\t * Get the credentials for an active connection\n\t\t * @param connectionId The id of the connection\n\t\t * @returns A dictionary containing the credentials as they would be included in the connection's options dictionary\n\t\t */\n\t\texport function getCredentials(connectionId: string): Thenable<{ [name: string]: string }>;\n\n\t\t/**\n\t\t * Get ServerInfo for a connectionId\n\t\t * @param connectionId The id of the connection\n\t\t * @returns ServerInfo\n\t\t */\n\t\texport function getServerInfo(connectionId: string): Thenable<ServerInfo>;\n\n\t\t/**\n\t\t * Interface for representing a connection when working with connection APIs\n\t\t*/\n\t\texport interface Connection extends ConnectionInfo {\n\t\t\t/**\n\t\t\t * The name of the provider managing the connection (e.g. MSSQL)\n\t\t\t*/\n\t\t\tproviderName: string;\n\n\t\t\t/**\n\t\t\t * A unique identifier for the connection\n\t\t\t*/\n\t\t\tconnectionId: string;\n\t\t}\n\t}\n\n\t/**\n\t * Namespace for interacting with Object Explorer\n\t*/\n\texport namespace objectexplorer {\n\t\t/**\n\t\t * Get an Object Explorer node corresponding to the given connection and path. If no path\n\t\t * is given, it returns the top-level node for the given connection. If there is no node at\n\t\t * the given path, it returns undefined.\n\t\t * @param connectionId The id of the connection that the node exists on\n\t\t * @param nodePath The path of the node to get\n\t\t * @returns The node corresponding to the given connection and path,\n\t\t * or undefined if no such node exists.\n\t\t*/\n\t\texport function getNode(connectionId: string, nodePath?: string): Thenable<ObjectExplorerNode>;\n\n\t\t/**\n\t\t * Get all active Object Explorer connection nodes\n\t\t * @returns The Object Explorer nodes for each saved connection\n\t\t*/\n\t\texport function getActiveConnectionNodes(): Thenable<ObjectExplorerNode[]>;\n\n\t\t/**\n\t\t * Find Object Explorer nodes that match the given information\n\t\t * @param connectionId The id of the connection that the node exists on\n\t\t * @param type The type of the object to retrieve\n\t\t * @param schema The schema of the object, if applicable\n\t\t * @param name The name of the object\n\t\t * @param database The database the object exists under, if applicable\n\t\t * @param parentObjectNames A list of names of parent objects in the tree, ordered from highest to lowest level\n\t\t * (for example when searching for a table's column, provide the name of its parent table for this argument)\n\t\t */\n\t\texport function findNodes(connectionId: string, type: string, schema: string, name: string, database: string, parentObjectNames: string[]): Thenable<ObjectExplorerNode[]>;\n\n\t\t/**\n\t\t * Get connectionProfile from sessionId\n\t\t * @param sessionId The id of the session that the node exists on\n\t\t * @returns The IConnecitonProfile for the session\n\t\t */\n\t\texport function getSessionConnectionProfile(sessionId: string): Thenable<IConnectionProfile>;\n\n\t\t/**\n\t\t * Interface for representing and interacting with items in Object Explorer\n\t\t*/\n\t\texport interface ObjectExplorerNode extends NodeInfo {\n\t\t\t/**\n\t\t\t * The id of the connection that the node exists under\n\t\t\t */\n\t\t\tconnectionId: string;\n\n\t\t\t/**\n\t\t\t * Whether the node is currently expanded in Object Explorer\n\t\t\t */\n\t\t\tisExpanded(): Thenable<boolean>;\n\n\t\t\t/**\n\t\t\t * Set whether the node is expanded or collapsed\n\t\t\t * @param expandedState The new state of the node. If 'None', the node will not be changed\n\t\t\t */\n\t\t\tsetExpandedState(expandedState: vscode.TreeItemCollapsibleState): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Set whether the node is selected\n\t\t\t * @param selected Whether the node should be selected\n\t\t\t * @param clearOtherSelections If true, clear any other selections. If false, leave any existing selections.\n\t\t\t * Defaults to true when selected is true and false when selected is false.\n\t\t\t */\n\t\t\tsetSelected(selected: boolean, clearOtherSelections?: boolean): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Get all the child nodes. Returns an empty list if there are no children.\n\t\t\t */\n\t\t\tgetChildren(): Thenable<ObjectExplorerNode[]>;\n\n\t\t\t/**\n\t\t\t * Get the parent node. Returns undefined if there is none.\n\t\t\t */\n\t\t\tgetParent(): Thenable<ObjectExplorerNode>;\n\n\t\t\t/**\n\t\t\t * Refresh the node, expanding it if it has children\n\t\t\t */\n\t\t\trefresh(): Thenable<void>;\n\t\t}\n\t}\n\n\t// EXPORTED INTERFACES /////////////////////////////////////////////////\n\texport interface ConnectionInfo {\n\n\t\toptions: { [name: string]: any };\n\t}\n\n\t// Object Explorer interfaces  -----------------------------------------------------------------------\n\texport interface ObjectExplorerSession {\n\t\tsuccess: boolean;\n\t\tsessionId: string;\n\t\trootNode: NodeInfo;\n\t\terrorMessage: string;\n\t}\n\n\t/**\n\t * A NodeInfo object represents an element in the Object Explorer tree under\n\t * a connection.\n\t */\n\texport interface NodeInfo {\n\t\tnodePath: string;\n\t\tnodeType: string;\n\t\tnodeSubType: string;\n\t\tnodeStatus: string;\n\t\tlabel: string;\n\t\tisLeaf: boolean;\n\t\tmetadata: ObjectMetadata;\n\t\terrorMessage: string;\n\t\t/**\n\t\t * Optional iconType for the object in the tree. Currently this only supports\n\t\t * an icon name or SqlThemeIcon name, rather than a path to an icon.\n\t\t * If not defined, the nodeType + nodeStatus / nodeSubType values\n\t\t * will be used instead.\n\t\t */\n\t\ticonType?: string | SqlThemeIcon;\n\t\t/**\n\t\t * Informs who provides the children to a node, used by data explorer tree view api\n\t\t */\n\t\tchildProvider?: string;\n\t\t/**\n\t\t * Holds the connection profile for nodes, used by data explorer tree view api\n\t\t */\n\t\tpayload?: any;\n\t}\n\n\texport interface IConnectionProfile extends ConnectionInfo {\n\t\tconnectionName: string;\n\t\tserverName: string;\n\t\tdatabaseName: string;\n\t\tuserName: string;\n\t\tpassword: string;\n\t\tauthenticationType: string;\n\t\tsavePassword: boolean;\n\t\tgroupFullName: string;\n\t\tgroupId: string;\n\t\tproviderName: string;\n\t\tsaveProfile: boolean;\n\t\tid: string;\n\t\tazureTenantId?: string;\n\t}\n\n\t/**\n\t* Options for the actions that could happen after connecting is complete\n\t*/\n\texport interface IConnectionCompletionOptions {\n\t\t/**\n\t\t * Save the connection to MRU and settings (only save to setting if profile.saveProfile is set to true)\n\t\t * Default is true.\n\t\t */\n\t\tsaveConnection: boolean;\n\n\t\t/**\n\t\t * If true, open the dashboard after connection is complete.\n\t\t * If undefined / false, dashboard won't be opened after connection completes.\n\t\t * Default is false.\n\t\t */\n\t\tshowDashboard?: boolean;\n\n\t\t/**\n\t\t * If undefined / true, open the connection dialog if connection fails.\n\t\t * If false, connection dialog won't be opened even if connection fails.\n\t\t * Default is true.\n\t\t */\n\t\tshowConnectionDialogOnError?: boolean;\n\n\t\t/**\n\t\t * If undefined / true, open the connection firewall rule dialog if connection fails.\n\t\t * If false, connection firewall rule dialog won't be opened even if connection fails.\n\t\t * Default is true.\n\t\t */\n\t\tshowFirewallRuleOnError?: boolean;\n\t}\n\n\texport interface ConnectionInfoSummary {\n\n\t\t/**\n\t\t * URI identifying the owner of the connection\n\t\t */\n\t\townerUri: string;\n\n\t\t/**\n\t\t * connection id returned from service host.\n\t\t */\n\t\tconnectionId: string;\n\n\t\t/**\n\t\t * any diagnostic messages return from the service host.\n\t\t */\n\t\tmessages: string;\n\n\t\t/**\n\t\t * Error message returned from the engine, if any.\n\t\t */\n\t\terrorMessage: string;\n\n\t\t/**\n\t\t * Error number returned from the engine, if any.\n\t\t */\n\t\terrorNumber: number;\n\t\t/**\n\t\t * Information about the connected server.\n\t\t */\n\t\tserverInfo: ServerInfo;\n\t\t/**\n\t\t * information about the actual connection established\n\t\t */\n\t\tconnectionSummary: ConnectionSummary;\n\t}\n\n\t/**\n\t * Summary that identifies a unique database connection.\n\t */\n\texport interface ConnectionSummary {\n\t\t/**\n\t\t * server name\n\t\t */\n\t\tserverName: string;\n\t\t/**\n\t\t * database name\n\t\t */\n\t\tdatabaseName: string;\n\t\t/**\n\t\t * user name\n\t\t */\n\t\tuserName: string;\n\t}\n\n\t/**\n\t * Information about a Server instance.\n\t */\n\texport interface ServerInfo {\n\t\t/**\n\t\t * The major version of the instance.\n\t\t */\n\t\tserverMajorVersion: number;\n\t\t/**\n\t\t * The minor version of the instance.\n\t\t */\n\t\tserverMinorVersion: number;\n\t\t/**\n\t\t * The build of the instance.\n\t\t */\n\t\tserverReleaseVersion: number;\n\t\t/**\n\t\t * The ID of the engine edition of the instance.\n\t\t */\n\t\tengineEditionId: number;\n\t\t/**\n\t\t * String containing the full server version text.\n\t\t */\n\t\tserverVersion: string;\n\t\t/**\n\t\t * String describing the product level of the server.\n\t\t */\n\t\tserverLevel: string;\n\t\t/**\n\t\t * The edition of the instance.\n\t\t */\n\t\tserverEdition: string;\n\t\t/**\n\t\t * Whether the instance is running in the cloud (Azure) or not.\n\t\t */\n\t\tisCloud: boolean;\n\t\t/**\n\t\t * The version of Azure that the instance is running on, if applicable.\n\t\t */\n\t\tazureVersion: number;\n\t\t/**\n\t\t * The Operating System version string of the machine running the instance.\n\t\t */\n\t\tosVersion: string;\n\t\t/**\n\t\t * options for all new server properties.\n\t\t */\n\t\toptions: { [key: string]: any };\n\t}\n\n\texport interface DataProvider {\n\t\thandle?: number;\n\t\treadonly providerId: string;\n\t}\n\n\texport interface ConnectionProvider extends DataProvider {\n\n\t\tconnect(connectionUri: string, connectionInfo: ConnectionInfo): Thenable<boolean>;\n\n\t\tdisconnect(connectionUri: string): Thenable<boolean>;\n\n\t\tcancelConnect(connectionUri: string): Thenable<boolean>;\n\n\t\tlistDatabases(connectionUri: string): Thenable<ListDatabasesResult>;\n\n\t\tchangeDatabase(connectionUri: string, newDatabase: string): Thenable<boolean>;\n\n\t\trebuildIntelliSenseCache(connectionUri: string): Thenable<void>;\n\n\t\tgetConnectionString(connectionUri: string, includePassword: boolean): Thenable<string>;\n\n\t\tbuildConnectionInfo?(connectionString: string): Thenable<ConnectionInfo>;\n\n\t\tregisterOnConnectionComplete(handler: (connSummary: ConnectionInfoSummary) => any): void;\n\n\t\tregisterOnIntelliSenseCacheComplete(handler: (connectionUri: string) => any): void;\n\n\t\tregisterOnConnectionChanged(handler: (changedConnInfo: ChangedConnectionInfo) => any): void;\n\t}\n\n\texport enum ServiceOptionType {\n\t\tstring = 'string',\n\t\tmultistring = 'multistring',\n\t\tpassword = 'password',\n\t\tnumber = 'number',\n\t\tcategory = 'category',\n\t\tboolean = 'boolean',\n\t\tobject = 'object',\n\t}\n\n\texport enum ConnectionOptionSpecialType {\n\t\tconnectionName = 'connectionName',\n\t\tserverName = 'serverName',\n\t\tdatabaseName = 'databaseName',\n\t\tauthType = 'authType',\n\t\tuserName = 'userName',\n\t\tpassword = 'password',\n\t\tappName = 'appName',\n\t}\n\n\texport interface CategoryValue {\n\t\tdisplayName: string;\n\t\tname: string;\n\t}\n\n\texport interface ConnectionOption {\n\t\tname: string;\n\n\t\tdisplayName: string;\n\n\t\tdescription: string;\n\n\t\tgroupName: string;\n\n\t\tvalueType: ServiceOptionType;\n\n\t\tspecialValueType: ConnectionOptionSpecialType;\n\n\t\tdefaultValue: string;\n\n\t\tcategoryValues: CategoryValue[];\n\n\t\tisIdentity: boolean;\n\n\t\tisRequired: boolean;\n\t}\n\n\texport interface ConnectionProviderOptions {\n\t\toptions: ConnectionOption[];\n\t}\n\n\texport interface ServiceOption {\n\t\tname: string;\n\n\t\tdisplayName: string;\n\n\t\tdescription: string;\n\n\t\tgroupName: string;\n\n\t\tvalueType: ServiceOptionType;\n\n\t\tdefaultValue: string;\n\n\t\tobjectType: string;\n\n\t\tcategoryValues: CategoryValue[];\n\n\t\tisRequired: boolean;\n\n\t\tisArray: boolean;\n\t}\n\n\texport interface AdminServicesOptions {\n\t\tdatabaseInfoOptions: ServiceOption[];\n\n\t\tdatabaseFileInfoOptions: ServiceOption[];\n\n\t\tfileGroupInfoOptions: ServiceOption[];\n\t}\n\n\n\t// List Databases Request ----------------------------------------------------------------------\n\texport interface ListDatabasesResult {\n\t\tdatabaseNames: Array<string>;\n\t}\n\n\t/**\n\t * Information about a connection changed event for a resource represented by a URI\n\t */\n\texport interface ChangedConnectionInfo {\n\t\t/**\n\t\t * Owner URI of the connection that changed.\n\t\t */\n\t\tconnectionUri: string;\n\n\t\t/**\n\t\t * Summary of details containing any connection changes.\n\t\t */\n\t\tconnection: ConnectionSummary;\n\t}\n\n\texport interface FeatureMetadataProvider {\n\t\tenabled: boolean;\n\n\t\tfeatureName: string;\n\n\t\toptionsMetadata: ServiceOption[];\n\t}\n\n\texport interface DataProtocolServerCapabilities {\n\t\tprotocolVersion: string;\n\n\t\tproviderName: string;\n\n\t\tproviderDisplayName: string;\n\n\t\tconnectionProvider: ConnectionProviderOptions;\n\n\t\tadminServicesProvider: AdminServicesOptions;\n\n\t\tfeatures: FeatureMetadataProvider[];\n\t}\n\n\texport interface DataProtocolClientCapabilities {\n\t\thostName: string;\n\n\t\thostVersion: string;\n\t}\n\n\texport interface CapabilitiesProvider extends DataProvider {\n\t\tgetServerCapabilities(client: DataProtocolClientCapabilities): Thenable<DataProtocolServerCapabilities>;\n\t}\n\n\texport enum MetadataType {\n\t\tTable = 0,\n\t\tView = 1,\n\t\tSProc = 2,\n\t\tFunction = 3,\n\t}\n\n\texport interface ObjectMetadata {\n\t\tmetadataType: MetadataType;\n\n\t\tmetadataTypeName: string;\n\n\t\turn: string;\n\n\t\tname: string;\n\n\t\tschema: string;\n\t}\n\n\texport interface ColumnMetadata {\n\n\t\thasExtendedProperties: boolean;\n\n\t\tdefaultValue: string;\n\n\t\t/// <summary>\n\t\t/// Escaped identifier for the name of the column\n\t\t/// </summary>\n\t\tescapedName: string;\n\n\t\t/// <summary>\n\t\t/// Whether or not the column is computed\n\t\t/// </summary>\n\t\tisComputed: boolean;\n\n\t\t/// <summary>\n\t\t/// Whether or not the column is deterministically computed\n\t\t/// </summary>\n\t\tisDeterministic: boolean;\n\n\t\t/// <summary>\n\t\t/// Whether or not the column is an identity column\n\t\t/// </summary>\n\t\tisIdentity: boolean;\n\n\t\t/// <summary>\n\t\t/// The ordinal ID of the column\n\t\t/// </summary>\n\t\tordinal: number;\n\n\t\t/// <summary>\n\t\t/// Whether or not the column is calculated on the server side. This could be a computed\n\t\t/// column or a identity column.\n\t\t/// </summary>\n\t\tisCalculated: boolean;\n\n\t\t/// <summary>\n\t\t/// Whether or not the column is used in a key to uniquely identify a row\n\t\t/// </summary>\n\t\tisKey: boolean;\n\n\t\t/// <summary>\n\t\t/// Whether or not the column can be trusted for uniqueness\n\t\t/// </summary>\n\t\tisTrustworthyForUniqueness: boolean;\n\t}\n\n\texport interface TableMetadata {\n\n\t\tcolumns: ColumnMetadata;\n\n\t}\n\n\texport interface ProviderMetadata {\n\t\tobjectMetadata: ObjectMetadata[];\n\t}\n\n\texport interface MetadataProvider extends DataProvider {\n\t\tgetMetadata(connectionUri: string): Thenable<ProviderMetadata>;\n\n\t\tgetDatabases(connectionUri: string): Thenable<string[]>;\n\n\t\tgetTableInfo(connectionUri: string, metadata: ObjectMetadata): Thenable<ColumnMetadata[]>;\n\n\t\tgetViewInfo(connectionUri: string, metadata: ObjectMetadata): Thenable<ColumnMetadata[]>;\n\t}\n\n\texport enum ScriptOperation {\n\t\tSelect = 0,\n\t\tCreate = 1,\n\t\tInsert = 2,\n\t\tUpdate = 3,\n\t\tDelete = 4,\n\t\tExecute = 5,\n\t\tAlter = 6,\n\t}\n\n\texport interface ScriptingResult {\n\t\toperationId: string;\n\t\tscript: string;\n\t}\n\n\texport interface ScriptingParamDetails {\n\t\tfilePath: string;\n\t\tscriptCompatibilityOption: string;\n\t\ttargetDatabaseEngineEdition: string;\n\t\ttargetDatabaseEngineType: string;\n\t}\n\n\texport interface ScriptingProvider extends DataProvider {\n\n\t\tscriptAsOperation(connectionUri: string, operation: ScriptOperation, metadata: ObjectMetadata, paramDetails: ScriptingParamDetails): Thenable<ScriptingResult>;\n\n\t\tregisterOnScriptingComplete(handler: (scriptingCompleteResult: ScriptingCompleteResult) => any): void;\n\t}\n\n\texport interface ScriptingCompleteResult {\n\t\terrorDetails: string;\n\n\t\terrorMessage: string;\n\n\t\thasError: boolean;\n\n\t\tcanceled: boolean;\n\n\t\tsuccess: boolean;\n\n\t\toperationId: string;\n\t}\n\n\t/**\n\t * Parameters to initialize a connection to a database\n\t */\n\texport interface Credential {\n\t\t/**\n\t\t * Unique ID identifying the credential\n\t\t */\n\t\tcredentialId: string;\n\n\t\t/**\n\t\t * password\n\t\t */\n\t\tpassword: string;\n\t}\n\n\texport interface CredentialProvider {\n\t\thandle: number;\n\n\t\tsaveCredential(credentialId: string, password: string): Thenable<boolean>;\n\n\t\treadCredential(credentialId: string): Thenable<Credential>;\n\n\t\tdeleteCredential(credentialId: string): Thenable<boolean>;\n\t}\n\n\texport interface SerializationProvider {\n\t\thandle: number;\n\t\tsaveAs(saveFormat: string, savePath: string, results: string, appendToFile: boolean): Thenable<SaveResultRequestResult>;\n\t}\n\n\n\texport interface DidChangeLanguageFlavorParams {\n\t\turi: string;\n\t\tlanguage: string;\n\t\tflavor: string;\n\t}\n\n\texport interface QueryExecutionOptions {\n\t\toptions: Map<string, any>;\n\t}\n\n\texport interface QueryProvider extends DataProvider {\n\t\tcancelQuery(ownerUri: string): Thenable<QueryCancelResult>;\n\t\trunQuery(ownerUri: string, selection: ISelectionData, runOptions?: ExecutionPlanOptions): Thenable<void>;\n\t\trunQueryStatement(ownerUri: string, line: number, column: number): Thenable<void>;\n\t\trunQueryString(ownerUri: string, queryString: string): Thenable<void>;\n\t\trunQueryAndReturn(ownerUri: string, queryString: string): Thenable<SimpleExecuteResult>;\n\t\tparseSyntax(ownerUri: string, query: string): Thenable<SyntaxParseResult>;\n\t\tgetQueryRows(rowData: QueryExecuteSubsetParams): Thenable<QueryExecuteSubsetResult>;\n\t\tdisposeQuery(ownerUri: string): Thenable<void>;\n\t\tsaveResults(requestParams: SaveResultsRequestParams): Thenable<SaveResultRequestResult>;\n\t\tsetQueryExecutionOptions(ownerUri: string, options: QueryExecutionOptions): Thenable<void>;\n\n\t\t// Notifications\n\t\tregisterOnQueryComplete(handler: (result: QueryExecuteCompleteNotificationResult) => any): void;\n\t\tregisterOnBatchStart(handler: (batchInfo: QueryExecuteBatchNotificationParams) => any): void;\n\t\tregisterOnBatchComplete(handler: (batchInfo: QueryExecuteBatchNotificationParams) => any): void;\n\t\tregisterOnResultSetAvailable(handler: (resultSetInfo: QueryExecuteResultSetNotificationParams) => any): void;\n\t\tregisterOnResultSetUpdated(handler: (resultSetInfo: QueryExecuteResultSetNotificationParams) => any): void;\n\t\tregisterOnMessage(handler: (message: QueryExecuteMessageParams) => any): void;\n\n\t\t// Edit Data Requests\n\t\tcommitEdit(ownerUri: string): Thenable<void>;\n\t\tcreateRow(ownerUri: string): Thenable<EditCreateRowResult>;\n\t\tdeleteRow(ownerUri: string, rowId: number): Thenable<void>;\n\t\tdisposeEdit(ownerUri: string): Thenable<void>;\n\t\tinitializeEdit(ownerUri: string, schemaName: string, objectName: string, objectType: string, rowLimit: number, queryString: string): Thenable<void>;\n\t\trevertCell(ownerUri: string, rowId: number, columnId: number): Thenable<EditRevertCellResult>;\n\t\trevertRow(ownerUri: string, rowId: number): Thenable<void>;\n\t\tupdateCell(ownerUri: string, rowId: number, columnId: number, newValue: string): Thenable<EditUpdateCellResult>;\n\t\tgetEditRows(rowData: EditSubsetParams): Thenable<EditSubsetResult>;\n\n\t\t// Edit Data Notifications\n\t\tregisterOnEditSessionReady(handler: (ownerUri: string, success: boolean, message: string) => any): void;\n\t}\n\n\texport interface IDbColumn {\n\t\tallowDBNull?: boolean;\n\t\tbaseCatalogName: string;\n\t\tbaseColumnName: string;\n\t\tbaseSchemaName: string;\n\t\tbaseServerName: string;\n\t\tbaseTableName: string;\n\t\tcolumnName: string;\n\t\tcolumnOrdinal?: number;\n\t\tcolumnSize?: number;\n\t\tisAliased?: boolean;\n\t\tisAutoIncrement?: boolean;\n\t\tisExpression?: boolean;\n\t\tisHidden?: boolean;\n\t\tisIdentity?: boolean;\n\t\tisKey?: boolean;\n\t\tisBytes?: boolean;\n\t\tisChars?: boolean;\n\t\tisSqlVariant?: boolean;\n\t\tisUdt?: boolean;\n\t\tdataType: string;\n\t\tisXml?: boolean;\n\t\tisJson?: boolean;\n\t\tisLong?: boolean;\n\t\tisReadOnly?: boolean;\n\t\tisUnique?: boolean;\n\t\tnumericPrecision?: number;\n\t\tnumericScale?: number;\n\t\tudtAssemblyQualifiedName: string;\n\t\tdataTypeName: string;\n\t}\n\n\texport interface IGridResultSet {\n\t\tcolumns: IDbColumn[];\n\t\trowsUri: string;\n\t\tnumberOfRows: number;\n\t}\n\n\texport interface IResultMessage {\n\t\tbatchId?: number;\n\t\tisError: boolean;\n\t\ttime: string;\n\t\tmessage: string;\n\t}\n\n\texport interface ISelectionData {\n\t\tstartLine: number;\n\t\tstartColumn: number;\n\t\tendLine: number;\n\t\tendColumn: number;\n\t}\n\n\texport interface ResultSetSummary {\n\t\tid: number;\n\t\tbatchId: number;\n\t\trowCount: number;\n\t\tcolumnInfo: IDbColumn[];\n\t\tcomplete: boolean;\n\t}\n\n\texport interface BatchSummary {\n\t\thasError: boolean;\n\t\tid: number;\n\t\tselection: ISelectionData;\n\t\tresultSetSummaries: ResultSetSummary[];\n\t\texecutionElapsed: string;\n\t\texecutionEnd: string;\n\t\texecutionStart: string;\n\t}\n\n\texport enum EditRowState {\n\t\tclean = 0,\n\t\tdirtyInsert = 1,\n\t\tdirtyDelete = 2,\n\t\tdirtyUpdate = 3,\n\t}\n\n\texport interface EditRow {\n\t\tcells: DbCellValue[];\n\t\tid: number;\n\t\tisDirty: boolean;\n\t\tstate: EditRowState;\n\t}\n\n\texport interface EditCell extends DbCellValue {\n\t\tisDirty: boolean;\n\t}\n\n\texport interface QueryExecuteCompleteNotificationResult {\n\t\townerUri: string;\n\t\tbatchSummaries: BatchSummary[];\n\t}\n\n\texport interface ExecutionPlanOptions {\n\t\tdisplayEstimatedQueryPlan?: boolean;\n\t\tdisplayActualQueryPlan?: boolean;\n\t}\n\n\texport interface SimpleExecuteParams {\n\t\tqueryString: string;\n\t\townerUri: string;\n\t}\n\n\texport interface SimpleExecuteResult {\n\t\trowCount: number;\n\t\tcolumnInfo: IDbColumn[];\n\t\trows: DbCellValue[][];\n\t}\n\n\texport interface SyntaxParseParams {\n\t\townerUri: string;\n\t\tquery: string;\n\t}\n\n\texport interface SyntaxParseResult {\n\t\tparseable: boolean;\n\t\terrors: string[];\n\t}\n\n\t// Query Batch Notification -----------------------------------------------------------------------\n\texport interface QueryExecuteBatchNotificationParams {\n\t\tbatchSummary: BatchSummary;\n\t\townerUri: string;\n\t}\n\n\n\texport interface QueryExecuteResultSetNotificationParams {\n\t\tresultSetSummary: ResultSetSummary;\n\t\townerUri: string;\n\t}\n\n\n\texport interface QueryExecuteMessageParams {\n\t\tmessage: IResultMessage;\n\t\townerUri: string;\n\t}\n\n\texport interface QueryExecuteSubsetParams {\n\t\townerUri: string;\n\t\tbatchIndex: number;\n\t\tresultSetIndex: number;\n\t\trowsStartIndex: number;\n\t\trowsCount: number;\n\t}\n\n\texport interface IGridActionContext {\n\t\tcell: { row: number; cell: number; };\n\t\tselection: Slick.Range[];\n\t\trunner: QueryRunner;\n\t\tbatchId: number;\n\t\tresultId: number;\n\t\ttable: Table<any>;\n\t\tselectionModel: CellSelectionModel<any>;\n\t\ttableState: GridTableState;\n\t}\n\n\texport interface DbCellValue {\n\t\tdisplayValue: string;\n\t\tisNull: boolean;\n\t\tinvariantCultureDisplayValue: string;\n\t}\n\n\texport interface ResultSetSubset {\n\t\trowCount: number;\n\t\trows: DbCellValue[][];\n\t}\n\n\texport interface QueryExecuteSubsetResult {\n\t\tmessage: string;\n\t\tresultSubset: ResultSetSubset;\n\t}\n\n\texport interface QueryCancelResult {\n\t\tmessages: string;\n\t}\n\n\t// Save Results ===============================================================================\n\texport interface SaveResultsRequestParams {\n\t\t/**\n\t\t * 'csv', 'json', 'excel', 'xml'\n\t\t */\n\t\tresultFormat: string;\n\t\townerUri: string;\n\t\tfilePath: string;\n\t\tbatchIndex: number;\n\t\tresultSetIndex: number;\n\t\trowStartIndex: number;\n\t\trowEndIndex: number;\n\t\tcolumnStartIndex: number;\n\t\tcolumnEndIndex: number;\n\t\tincludeHeaders?: boolean;\n\t\tdelimiter?: string;\n\t\tlineSeperator?: string;\n\t\ttextIdentifier?: string;\n\t\tencoding?: string;\n\t\tformatted?: boolean;\n\t}\n\n\texport interface SaveResultRequestResult {\n\t\tmessages: string;\n\t}\n\n\t// Edit Data ==================================================================================\n\t// Shared Interfaces --------------------------------------------------------------------------\n\texport interface IEditSessionOperationParams {\n\t\townerUri: string;\n\t}\n\n\texport interface IEditRowOperationParams extends IEditSessionOperationParams {\n\t\trowId: number;\n\t}\n\n\texport interface EditCellResult {\n\t\tcell: EditCell;\n\t\tisRowDirty: boolean;\n\t}\n\n\t// edit/commit --------------------------------------------------------------------------------\n\texport interface EditCommitParams extends IEditSessionOperationParams { }\n\texport interface EditCommitResult { }\n\n\t// edit/createRow -----------------------------------------------------------------------------\n\texport interface EditCreateRowParams extends IEditSessionOperationParams { }\n\texport interface EditCreateRowResult {\n\t\tdefaultValues: string[];\n\t\tnewRowId: number;\n\t}\n\n\t// edit/deleteRow -----------------------------------------------------------------------------\n\texport interface EditDeleteRowParams extends IEditRowOperationParams { }\n\texport interface EditDeleteRowResult { }\n\n\t// edit/dispose -------------------------------------------------------------------------------\n\texport interface EditDisposeParams extends IEditSessionOperationParams { }\n\texport interface EditDisposeResult { }\n\n\t// edit/initialize ----------------------------------------------------------------------------\n\texport interface EditInitializeFiltering {\n\t\tLimitResults?: number;\n\t}\n\n\texport interface EditInitializeParams extends IEditSessionOperationParams {\n\t\tfilters: EditInitializeFiltering;\n\t\tobjectName: string;\n\t\tschemaName: string;\n\t\tobjectType: string;\n\t\tqueryString: string;\n\t}\n\n\n\texport interface EditInitializeResult { }\n\n\t// edit/revertCell ----------------------------------------------------------------------------\n\texport interface EditRevertCellParams extends IEditRowOperationParams {\n\t\tcolumnId: number;\n\t}\n\texport interface EditRevertCellResult extends EditCellResult {\n\t}\n\n\t// edit/revertRow -----------------------------------------------------------------------------\n\texport interface EditRevertRowParams extends IEditRowOperationParams { }\n\texport interface EditRevertRowResult { }\n\n\t// edit/sessionReady Event --------------------------------------------------------------------\n\texport interface EditSessionReadyParams {\n\t\townerUri: string;\n\t\tsuccess: boolean;\n\t\tmessage: string;\n\t}\n\n\t// edit/updateCell ----------------------------------------------------------------------------\n\texport interface EditUpdateCellParams extends IEditRowOperationParams {\n\t\tcolumnId: number;\n\t\tnewValue: string;\n\t}\n\n\texport interface EditUpdateCellResult extends EditCellResult {\n\t}\n\n\t// edit/subset --------------------------------------------------------------------------------\n\texport interface EditSubsetParams extends IEditSessionOperationParams {\n\t\trowStartIndex: number;\n\t\trowCount: number;\n\t}\n\texport interface EditSubsetResult {\n\t\trowCount: number;\n\t\tsubset: EditRow[];\n\t}\n\n\texport class Insight {\n\t    private _insight: IInsight;\n\t\n\t    public get insight(): IInsight;\n\t\n\t    private _options: IInsightOptions;\n\t    private _data: IInsightData;\n\t    private dim: Dimension;\n\t\n\t    constructor(\n\t\t\tcontainer: HTMLElement, options: IInsightOptions = defaultOptions,\n\t\t\t_instantiationService: IInstantiationService\n\t\t);\n\t\n\t    public layout(dim: Dimension);\n\t\n\t    public set options(val: IInsightOptions);\n\t\n\t    public get options(): IInsightOptions;\n\t\n\t    public set data(val: IInsightData);\n\t\t\n\t\n\t    private buildInsight();\n\t\n\t    private findctor(type: ChartType | InsightType): IInsightCtor;\n\t}\n\t\n\n\t/**\n\t * A reference to a named icon. Currently only a subset of the SQL icons are available.\n\t * Using a theme icon is preferred over a custom icon as it gives theme authors the possibility to change the icons.\n\t */\n\texport class SqlThemeIcon {\n\t    static readonly Folder: SqlThemeIcon;\n\t    static readonly Root: SqlThemeIcon;\n\t    static readonly Database: SqlThemeIcon;\n\t    static readonly Server: SqlThemeIcon;\n\t    static readonly ScalarValuedFunction: SqlThemeIcon;\n\t    static readonly TableValuedFunction: SqlThemeIcon;\n\t    static readonly AggregateFunction: SqlThemeIcon;\n\t    static readonly FileGroup: SqlThemeIcon;\n\t    static readonly StoredProcedure: SqlThemeIcon;\n\t    static readonly UserDefinedTableType: SqlThemeIcon;\n\t    static readonly View: SqlThemeIcon;\n\t    static readonly Table: SqlThemeIcon;\n\t    static readonly HistoryTable: SqlThemeIcon;\n\t    static readonly ServerLevelLinkedServerLogin: SqlThemeIcon;\n\t    static readonly ServerLevelServerAudit: SqlThemeIcon;\n\t    static readonly ServerLevelCryptographicProvider: SqlThemeIcon;\n\t    static readonly ServerLevelCredential: SqlThemeIcon;\n\t    static readonly ServerLevelServerRole: SqlThemeIcon;\n\t    static readonly ServerLevelLogin: SqlThemeIcon;\n\t    static readonly ServerLevelServerAuditSpecification: SqlThemeIcon;\n\t    static readonly ServerLevelServerTrigger: SqlThemeIcon;\n\t    static readonly ServerLevelLinkedServer: SqlThemeIcon;\n\t    static readonly ServerLevelEndpoint: SqlThemeIcon;\n\t    static readonly Synonym: SqlThemeIcon;\n\t    static readonly DatabaseTrigger: SqlThemeIcon;\n\t    static readonly Assembly: SqlThemeIcon;\n\t    static readonly MessageType: SqlThemeIcon;\n\t    static readonly Contract: SqlThemeIcon;\n\t    static readonly Queue: SqlThemeIcon;\n\t    static readonly Service: SqlThemeIcon;\n\t    static readonly Route: SqlThemeIcon;\n\t    static readonly DatabaseAndQueueEventNotification: SqlThemeIcon;\n\t    static readonly RemoteServiceBinding: SqlThemeIcon;\n\t    static readonly BrokerPriority: SqlThemeIcon;\n\t    static readonly FullTextCatalog: SqlThemeIcon;\n\t    static readonly FullTextStopList: SqlThemeIcon;\n\t    static readonly SqlLogFile: SqlThemeIcon;\n\t    static readonly PartitionFunction: SqlThemeIcon;\n\t    static readonly PartitionScheme: SqlThemeIcon;\n\t    static readonly SearchPropertyList: SqlThemeIcon;\n\t    static readonly User: SqlThemeIcon;\n\t    static readonly Schema: SqlThemeIcon;\n\t    static readonly AsymmetricKey: SqlThemeIcon;\n\t    static readonly Certificate: SqlThemeIcon;\n\t    static readonly SymmetricKey: SqlThemeIcon;\n\t    static readonly DatabaseEncryptionKey: SqlThemeIcon;\n\t    static readonly MasterKey: SqlThemeIcon;\n\t    static readonly DatabaseAuditSpecification: SqlThemeIcon;\n\t    static readonly Column: SqlThemeIcon;\n\t    static readonly Key: SqlThemeIcon;\n\t    static readonly Constraint: SqlThemeIcon;\n\t    static readonly Trigger: SqlThemeIcon;\n\t    static readonly Index: SqlThemeIcon;\n\t    static readonly Statistic: SqlThemeIcon;\n\t    static readonly UserDefinedDataType: SqlThemeIcon;\n\t    static readonly UserDefinedType: SqlThemeIcon;\n\t    static readonly XmlSchemaCollection: SqlThemeIcon;\n\t    static readonly SystemExactNumeric: SqlThemeIcon;\n\t    static readonly SystemApproximateNumeric: SqlThemeIcon;\n\t    static readonly SystemDateAndTime: SqlThemeIcon;\n\t    static readonly SystemCharacterString: SqlThemeIcon;\n\t    static readonly SystemUnicodeCharacterString: SqlThemeIcon;\n\t    static readonly SystemBinaryString: SqlThemeIcon;\n\t    static readonly SystemOtherDataType: SqlThemeIcon;\n\t    static readonly SystemClrDataType: SqlThemeIcon;\n\t    static readonly SystemSpatialDataType: SqlThemeIcon;\n\t    static readonly UserDefinedTableTypeColumn: SqlThemeIcon;\n\t    static readonly UserDefinedTableTypeKey: SqlThemeIcon;\n\t    static readonly UserDefinedTableTypeConstraint: SqlThemeIcon;\n\t    static readonly StoredProcedureParameter: SqlThemeIcon;\n\t    static readonly TableValuedFunctionParameter: SqlThemeIcon;\n\t    static readonly ScalarValuedFunctionParameter: SqlThemeIcon;\n\t    static readonly AggregateFunctionParameter: SqlThemeIcon;\n\t    static readonly DatabaseRole: SqlThemeIcon;\n\t    static readonly ApplicationRole: SqlThemeIcon;\n\t    static readonly FileGroupFile: SqlThemeIcon;\n\t    static readonly SystemMessageType: SqlThemeIcon;\n\t    static readonly SystemContract: SqlThemeIcon;\n\t    static readonly SystemService: SqlThemeIcon;\n\t    static readonly SystemQueue: SqlThemeIcon;\n\t    static readonly Sequence: SqlThemeIcon;\n\t    static readonly SecurityPolicy: SqlThemeIcon;\n\t    static readonly DatabaseScopedCredential: SqlThemeIcon;\n\t    static readonly ExternalResource: SqlThemeIcon;\n\t    static readonly ExternalDataSource: SqlThemeIcon;\n\t    static readonly ExternalFileFormat: SqlThemeIcon;\n\t    static readonly ExternalTable: SqlThemeIcon;\n\t    static readonly ColumnMasterKey: SqlThemeIcon;\n\t    static readonly ColumnEncryptionKey: SqlThemeIcon;\n\n\t    private constructor(id: string);\n\n\t    /**\n\t\t * Gets the ID for the theme icon for help in cases where string comparison is needed\n\t\t */\n\t    public readonly id: string;\n\t}\n\n\texport interface ObjectExplorerSessionResponse {\n\t\tsessionId: string;\n\t}\n\n\texport interface ObjectExplorerExpandInfo {\n\t\tsessionId: string;\n\t\tnodePath: string;\n\t\tnodes: NodeInfo[];\n\t\terrorMessage: string;\n\t}\n\n\texport interface ExpandNodeInfo {\n\t\tsessionId: string;\n\t\tnodePath: string;\n\t}\n\n\texport interface FindNodesInfo {\n\t\tsessionId: string;\n\t\ttype: string;\n\t\tschema: string;\n\t\tname: string;\n\t\tdatabase: string;\n\t\tparentObjectNames: string[];\n\t}\n\n\texport interface ObjectExplorerCloseSessionInfo {\n\t\tsessionId: string;\n\t}\n\n\texport interface ObjectExplorerCloseSessionResponse {\n\t\tsessionId: string;\n\t\tsuccess: boolean;\n\t}\n\n\texport interface ObjectExplorerFindNodesResponse {\n\t\tnodes: NodeInfo[];\n\t}\n\n\texport interface ObjectExplorerProviderBase extends DataProvider {\n\t\texpandNode(nodeInfo: ExpandNodeInfo): Thenable<boolean>;\n\n\t\trefreshNode(nodeInfo: ExpandNodeInfo): Thenable<boolean>;\n\n\t\tfindNodes(findNodesInfo: FindNodesInfo): Thenable<ObjectExplorerFindNodesResponse>;\n\n\t\tregisterOnExpandCompleted(handler: (response: ObjectExplorerExpandInfo) => any): void;\n\t}\n\n\texport interface ObjectExplorerProvider extends ObjectExplorerProviderBase {\n\t\tcreateNewSession(connInfo: ConnectionInfo): Thenable<ObjectExplorerSessionResponse>;\n\n\t\tcloseSession(closeSessionInfo: ObjectExplorerCloseSessionInfo): Thenable<ObjectExplorerCloseSessionResponse>;\n\n\t\tregisterOnSessionCreated(handler: (response: ObjectExplorerSession) => any): void;\n\n\t\tregisterOnSessionDisconnected?(handler: (response: ObjectExplorerSession) => any): void;\n\t}\n\n\texport interface ObjectExplorerNodeProvider extends ObjectExplorerProviderBase {\n\t\t/**\n\t\t * The providerId for whichever type of ObjectExplorer connection this can add folders and objects to\n\t\t */\n\t\treadonly supportedProviderId: string;\n\n\t\t/**\n\t\t * Optional group name used to sort nodes in the tree. If not defined, the node order will be added in order based on provider ID, with\n\t\t * nodes from the main ObjectExplorerProvider for this provider type added first\n\t\t */\n\t\treadonly group?: string;\n\n\t\thandleSessionOpen(session: ObjectExplorerSession): Thenable<boolean>;\n\n\t\thandleSessionClose(closeSessionInfo: ObjectExplorerCloseSessionInfo): void;\n\t}\n\n\texport interface IconProvider extends DataProvider {\n\t\tgetConnectionIconId(connection: IConnectionProfile, serverInfo: ServerInfo): Thenable<string>;\n\t}\n\n\t// Admin Services interfaces  -----------------------------------------------------------------------\n\texport interface DatabaseInfo {\n\t\toptions: {};\n\t}\n\n\texport interface LoginInfo {\n\t\tname: string;\n\t}\n\n\texport interface CreateDatabaseResponse {\n\t\tresult: boolean;\n\t\ttaskId: number;\n\t}\n\n\texport interface CreateLoginResponse {\n\t\tresult: boolean;\n\t\ttaskId: number;\n\t}\n\n\texport interface AdminServicesProvider extends DataProvider {\n\t\tcreateDatabase(connectionUri: string, database: DatabaseInfo): Thenable<CreateDatabaseResponse>;\n\n\t\tcreateLogin(connectionUri: string, login: LoginInfo): Thenable<CreateLoginResponse>;\n\n\t\tgetDefaultDatabaseInfo(connectionUri: string): Thenable<DatabaseInfo>;\n\n\t\tgetDatabaseInfo(connectionUri: string): Thenable<DatabaseInfo>;\n\t}\n\n\t// Agent Services types\n\texport enum WeekDays {\n\t\tsunday = 1,\n\t\tmonday = 2,\n\t\ttuesday = 4,\n\t\twednesday = 8,\n\t\tthursday = 16,\n\t\tfriday = 32,\n\t\tweekDays = 62,\n\t\tsaturday = 64,\n\t\tweekEnds = 65,\n\t\teveryDay = 127,\n\t}\n\n\texport enum NotifyMethods {\n\t\tnone = 0,\n\t\tnotifyEmail = 1,\n\t\tpager = 2,\n\t\tnetSend = 4,\n\t\tnotifyAll = 7,\n\t}\n\n\texport enum AlertType {\n\t\tsqlServerEvent = 1,\n\t\tsqlServerPerformanceCondition = 2,\n\t\tnonSqlServerEvent = 3,\n\t\twmiEvent = 4,\n\t}\n\n\texport enum JobCompletionActionCondition {\n\t\tNever = 0,\n\t\tOnSuccess = 1,\n\t\tOnFailure = 2,\n\t\tAlways = 3,\n\t}\n\n\texport enum FrequencyTypes {\n\t\tUnknown,\n\t\tOneTime = 1 << 1,\n\t\tDaily = 1 << 2,\n\t\tWeekly = 1 << 3,\n\t\tMonthly = 1 << 4,\n\t\tMonthlyRelative = 1 << 5,\n\t\tAutoStart = 1 << 6,\n\t\tOnIdle = 1 << 7,\n\t}\n\n\texport enum FrequencySubDayTypes {\n\t\tUnknown = 0,\n\t\tOnce = 1,\n\t\tSecond = 2,\n\t\tMinute = 4,\n\t\tHour = 8,\n\t}\n\n\texport enum FrequencyRelativeIntervals {\n\t\tFirst = 1,\n\t\tSecond = 2,\n\t\tThird = 4,\n\t\tFourth = 8,\n\t\tLast = 16,\n\t}\n\n\texport enum JobExecutionStatus {\n\t\tExecuting = 1,\n\t\tWaitingForWorkerThread = 2,\n\t\tBetweenRetries = 3,\n\t\tIdle = 4,\n\t\tSuspended = 5,\n\t\tWaitingForStepToFinish = 6,\n\t\tPerformingCompletionAction = 7,\n\t}\n\n\texport interface AgentJobInfo {\n\t\tname: string;\n\t\towner: string;\n\t\tdescription: string;\n\t\tcurrentExecutionStatus: number;\n\t\tlastRunOutcome: number;\n\t\tcurrentExecutionStep: string;\n\t\tenabled: boolean;\n\t\thasTarget: boolean;\n\t\thasSchedule: boolean;\n\t\thasStep: boolean;\n\t\trunnable: boolean;\n\t\tcategory: string;\n\t\tcategoryId: number;\n\t\tcategoryType: number;\n\t\tlastRun: string;\n\t\tnextRun: string;\n\t\tjobId: string;\n\t\tstartStepId: number;\n\t\temailLevel: JobCompletionActionCondition;\n\t\tpageLevel: JobCompletionActionCondition;\n\t\teventLogLevel: JobCompletionActionCondition;\n\t\tdeleteLevel: JobCompletionActionCondition;\n\t\toperatorToEmail: string;\n\t\toperatorToPage: string;\n\t\tjobSteps: AgentJobStepInfo[];\n\t\tjobSchedules: AgentJobScheduleInfo[];\n\t\talerts: AgentAlertInfo[];\n\t}\n\n\texport interface AgentJobScheduleInfo {\n\t\tid: number;\n\t\tname: string;\n\t\tjobName: string;\n\t\tisEnabled: boolean;\n\t\tfrequencyTypes: FrequencyTypes;\n\t\tfrequencySubDayTypes: FrequencySubDayTypes;\n\t\tfrequencySubDayInterval: number;\n\t\tfrequencyRelativeIntervals: FrequencyRelativeIntervals;\n\t\tfrequencyRecurrenceFactor: number;\n\t\tfrequencyInterval: number;\n\t\tdateCreated: string;\n\t\tactiveStartTimeOfDay: string;\n\t\tactiveStartDate: string;\n\t\tactiveEndTimeOfDay: string;\n\t\tjobCount: number;\n\t\tactiveEndDate: string;\n\t\tscheduleUid: string;\n\t\tdescription: string;\n\t}\n\n\texport interface AgentJobStep {\n\t\tjobId: string;\n\t\tstepId: string;\n\t\tstepName: string;\n\t\tmessage: string;\n\t\trunDate: string;\n\t\trunStatus: number;\n\t\tstepDetails: AgentJobStepInfo;\n\t}\n\n\texport interface AgentJobStepInfo {\n\t\tjobId: string;\n\t\tjobName: string;\n\t\tscript: string;\n\t\tscriptName: string;\n\t\tstepName: string;\n\t\tsubSystem: string;\n\t\tid: number;\n\t\tfailureAction: string;\n\t\tsuccessAction: string;\n\t\tfailStepId: number;\n\t\tsuccessStepId: number;\n\t\tcommand: string;\n\t\tcommandExecutionSuccessCode: number;\n\t\tdatabaseName: string;\n\t\tdatabaseUserName: string;\n\t\tserver: string;\n\t\toutputFileName: string;\n\t\tappendToLogFile: boolean;\n\t\tappendToStepHist: boolean;\n\t\twriteLogToTable: boolean;\n\t\tappendLogToTable: boolean;\n\t\tretryAttempts: number;\n\t\tretryInterval: number;\n\t\tproxyName: string;\n\t}\n\n\texport interface AgentJobHistoryInfo {\n\t\tinstanceId: number;\n\t\tsqlMessageId: string;\n\t\tmessage: string;\n\t\tstepId: string;\n\t\tstepName: string;\n\t\tsqlSeverity: string;\n\t\tjobId: string;\n\t\tjobName: string;\n\t\trunStatus: number;\n\t\trunDate: string;\n\t\trunDuration: string;\n\t\toperatorEmailed: string;\n\t\toperatorNetsent: string;\n\t\toperatorPaged: string;\n\t\tretriesAttempted: string;\n\t\tserver: string;\n\t\tsteps: AgentJobStep[];\n\t}\n\n\texport interface AgentProxyInfo {\n\t\tid: number;\n\t\taccountName: string;\n\t\tdescription: string;\n\t\tcredentialName: string;\n\t\tcredentialIdentity: string;\n\t\tcredentialId: number;\n\t\tisEnabled: boolean;\n\t}\n\n\texport interface AgentAlertInfo {\n\t\tid: number;\n\t\tname: string;\n\t\tdelayBetweenResponses: number;\n\t\teventDescriptionKeyword: string;\n\t\teventSource: string;\n\t\thasNotification: number;\n\t\tincludeEventDescription: NotifyMethods;\n\t\tisEnabled: boolean;\n\t\tjobId: string;\n\t\tjobName: string;\n\t\tlastOccurrenceDate: string;\n\t\tlastResponseDate: string;\n\t\tmessageId: number;\n\t\tnotificationMessage: string;\n\t\toccurrenceCount: number;\n\t\tperformanceCondition: string;\n\t\tseverity: number;\n\t\tdatabaseName: string;\n\t\tcountResetDate: string;\n\t\tcategoryName: string;\n\t\talertType: AlertType;\n\t\twmiEventNamespace: string;\n\t\twmiEventQuery: string;\n\t}\n\n\texport interface AgentOperatorInfo {\n\t\tname: string;\n\t\tid: number;\n\t\temailAddress: string;\n\t\tenabled: boolean;\n\t\tlastEmailDate: string;\n\t\tlastNetSendDate: string;\n\t\tlastPagerDate: string;\n\t\tpagerAddress: string;\n\t\tcategoryName: string;\n\t\tpagerDays: WeekDays;\n\t\tsaturdayPagerEndTime: string;\n\t\tsaturdayPagerStartTime: string;\n\t\tsundayPagerEndTime: string;\n\t\tsundayPagerStartTime: string;\n\t\tnetSendAddress: string;\n\t\tweekdayPagerStartTime: string;\n\t\tweekdayPagerEndTime: string;\n\t}\n\n\texport interface ResultStatus {\n\t\tsuccess: boolean;\n\t\terrorMessage: string;\n\t}\n\n\texport interface AgentJobsResult extends ResultStatus {\n\t\tjobs: AgentJobInfo[];\n\t}\n\n\texport interface AgentJobHistoryResult extends ResultStatus {\n\t\thistories: AgentJobHistoryInfo[];\n\t\tschedules: AgentJobScheduleInfo[];\n\t\talerts: AgentAlertInfo[];\n\t\tsteps: AgentJobStepInfo[];\n\t}\n\n\texport interface CreateAgentJobResult extends ResultStatus {\n\t\tjob: AgentJobInfo;\n\t}\n\n\texport interface UpdateAgentJobResult extends ResultStatus {\n\t\tjob: AgentJobInfo;\n\t}\n\n\texport interface AgentJobCategory {\n\t\tid: string;\n\t\tname: string;\n\t}\n\n\texport interface AgentJobDefaultsResult extends ResultStatus {\n\t\towner: string;\n\t\tcategories: AgentJobCategory[];\n\t}\n\n\texport interface CreateAgentJobStepResult extends ResultStatus {\n\t\tstep: AgentJobStepInfo;\n\t}\n\n\texport interface UpdateAgentJobStepResult extends ResultStatus {\n\t\tstep: AgentJobStepInfo;\n\t}\n\n\texport interface CreateAgentProxyResult extends ResultStatus {\n\t\tstep: AgentJobStepInfo;\n\t}\n\n\texport interface UpdateAgentProxyResult extends ResultStatus {\n\t\tstep: AgentJobStepInfo;\n\t}\n\n\texport interface AgentAlertsResult extends ResultStatus {\n\t\talerts: AgentAlertInfo[];\n\t}\n\n\texport interface CreateAgentAlertResult extends ResultStatus {\n\t\talert: AgentJobStepInfo;\n\t}\n\n\texport interface UpdateAgentAlertResult extends ResultStatus {\n\t\talert: AgentJobStepInfo;\n\t}\n\n\texport interface AgentOperatorsResult extends ResultStatus {\n\t\toperators: AgentOperatorInfo[];\n\t}\n\n\texport interface CreateAgentOperatorResult extends ResultStatus {\n\t\toperator: AgentOperatorInfo;\n\t}\n\n\texport interface UpdateAgentOperatorResult extends ResultStatus {\n\t\toperator: AgentOperatorInfo;\n\t}\n\n\texport interface AgentProxiesResult extends ResultStatus {\n\t\tproxies: AgentProxyInfo[];\n\t}\n\n\texport interface CreateAgentProxyResult extends ResultStatus {\n\t\tproxy: AgentProxyInfo;\n\t}\n\n\texport interface UpdateAgentProxyResult extends ResultStatus {\n\t\tproxy: AgentProxyInfo;\n\t}\n\n\texport interface AgentJobSchedulesResult extends ResultStatus {\n\t\tschedules: AgentJobScheduleInfo[];\n\t}\n\n\texport interface CreateAgentJobScheduleResult extends ResultStatus {\n\t\tschedule: AgentJobScheduleInfo;\n\t}\n\n\texport interface UpdateAgentJobScheduleResult extends ResultStatus {\n\t\tschedule: AgentJobScheduleInfo;\n\t}\n\n\texport interface AgentServicesProvider extends DataProvider {\n\t\t// Job management methods\n\t\tgetJobs(ownerUri: string): Thenable<AgentJobsResult>;\n\t\tgetJobHistory(ownerUri: string, jobId: string, jobName: string): Thenable<AgentJobHistoryResult>;\n\t\tjobAction(ownerUri: string, jobName: string, action: string): Thenable<ResultStatus>;\n\t\tcreateJob(ownerUri: string, jobInfo: AgentJobInfo): Thenable<CreateAgentJobResult>;\n\t\tupdateJob(ownerUri: string, originalJobName: string, jobInfo: AgentJobInfo): Thenable<UpdateAgentJobResult>;\n\t\tdeleteJob(ownerUri: string, jobInfo: AgentJobInfo): Thenable<ResultStatus>;\n\t\tgetJobDefaults(ownerUri: string): Thenable<AgentJobDefaultsResult>;\n\n\t\t// Job Step management methods\n\t\tcreateJobStep(ownerUri: string, stepInfo: AgentJobStepInfo): Thenable<CreateAgentJobStepResult>;\n\t\tupdateJobStep(ownerUri: string, originalJobStepName: string, stepInfo: AgentJobStepInfo): Thenable<UpdateAgentJobStepResult>;\n\t\tdeleteJobStep(ownerUri: string, stepInfo: AgentJobStepInfo): Thenable<ResultStatus>;\n\n\t\t// Alert management methods\n\t\tgetAlerts(ownerUri: string): Thenable<AgentAlertsResult>;\n\t\tcreateAlert(ownerUri: string, alertInfo: AgentAlertInfo): Thenable<CreateAgentAlertResult>;\n\t\tupdateAlert(ownerUri: string, originalAlertName: string, alertInfo: AgentAlertInfo): Thenable<UpdateAgentAlertResult>;\n\t\tdeleteAlert(ownerUri: string, alertInfo: AgentAlertInfo): Thenable<ResultStatus>;\n\n\t\t// Operator management methods\n\t\tgetOperators(ownerUri: string): Thenable<AgentOperatorsResult>;\n\t\tcreateOperator(ownerUri: string, operatorInfo: AgentOperatorInfo): Thenable<CreateAgentOperatorResult>;\n\t\tupdateOperator(ownerUri: string, originalOperatorName: string, operatorInfo: AgentOperatorInfo): Thenable<UpdateAgentOperatorResult>;\n\t\tdeleteOperator(ownerUri: string, operatorInfo: AgentOperatorInfo): Thenable<ResultStatus>;\n\n\t\t// Proxy management methods\n\t\tgetProxies(ownerUri: string): Thenable<AgentProxiesResult>;\n\t\tcreateProxy(ownerUri: string, proxyInfo: AgentProxyInfo): Thenable<CreateAgentOperatorResult>;\n\t\tupdateProxy(ownerUri: string, originalProxyName: string, proxyInfo: AgentProxyInfo): Thenable<UpdateAgentOperatorResult>;\n\t\tdeleteProxy(ownerUri: string, proxyInfo: AgentProxyInfo): Thenable<ResultStatus>;\n\n\t\t// Credential method\n\t\tgetCredentials(ownerUri: string): Thenable<GetCredentialsResult>;\n\n\t\t// Job Schedule management methods\n\t\tgetJobSchedules(ownerUri: string): Thenable<AgentJobSchedulesResult>;\n\t\tcreateJobSchedule(ownerUri: string, scheduleInfo: AgentJobScheduleInfo): Thenable<CreateAgentJobScheduleResult>;\n\t\tupdateJobSchedule(ownerUri: string, originalScheduleName: string, scheduleInfo: AgentJobScheduleInfo): Thenable<UpdateAgentJobScheduleResult>;\n\t\tdeleteJobSchedule(ownerUri: string, scheduleInfo: AgentJobScheduleInfo): Thenable<ResultStatus>;\n\n\t\tregisterOnUpdated(handler: () => any): void;\n\t}\n\n\t// DacFx interfaces  -----------------------------------------------------------------------\n\texport interface DacFxResult extends ResultStatus {\n\t\toperationId: string;\n\t}\n\n\texport interface GenerateDeployPlanResult extends DacFxResult {\n\t\treport: string;\n\t}\n\n\texport interface ExportParams {\n\t\tdatabaseName: string;\n\t\tpackageFilePath: string;\n\t\townerUri: string;\n\t\ttaskExecutionMode: TaskExecutionMode;\n\t}\n\n\texport interface ImportParams {\n\t\tpackageFilePath: string;\n\t\tdatabaseName: string;\n\t\townerUri: string;\n\t\ttaskExecutionMode: TaskExecutionMode;\n\t}\n\n\texport interface ExtractParams {\n\t\tdatabaseName: string;\n\t\tpackageFilePath: string;\n\t\tapplicationName: string;\n\t\tapplicationVersion: string;\n\t\townerUri: string;\n\t\ttaskExecutionMode: TaskExecutionMode;\n\t}\n\n\texport interface DeployParams {\n\t\tpackageFilePath: string;\n\t\tdatabaseName: string;\n\t\tupgradeExisting: boolean;\n\t\townerUri: string;\n\t\ttaskExecutionMode: TaskExecutionMode;\n\t}\n\n\texport interface GenerateDeployScriptParams {\n\t\tpackageFilePath: string;\n\t\tdatabaseName: string;\n\t\townerUri: string;\n\t\ttaskExecutionMode: TaskExecutionMode;\n\t}\n\n\texport interface GenerateDeployPlan {\n\t\tpackageFilePath: string;\n\t\tdatabaseName: string;\n\t\townerUri: string;\n\t\ttaskExecutionMode: TaskExecutionMode;\n\t}\n\n\texport interface DacFxServicesProvider extends DataProvider {\n\t\texportBacpac(databaseName: string, packageFilePath: string, ownerUri: string, taskExecutionMode: TaskExecutionMode): Thenable<DacFxResult>;\n\t\timportBacpac(packageFilePath: string, databaseName: string, ownerUri: string, taskExecutionMode: TaskExecutionMode): Thenable<DacFxResult>;\n\t\textractDacpac(databaseName: string, packageFilePath: string, applicationName: string, applicationVersion: string, ownerUri: string, taskExecutionMode: TaskExecutionMode): Thenable<DacFxResult>;\n\t\tdeployDacpac(packageFilePath: string, databaseName: string, upgradeExisting: boolean, ownerUri: string, taskExecutionMode: TaskExecutionMode): Thenable<DacFxResult>;\n\t\tgenerateDeployScript(packageFilePath: string, databaseName: string, ownerUri: string, taskExecutionMode: TaskExecutionMode): Thenable<DacFxResult>;\n\t\tgenerateDeployPlan(packageFilePath: string, databaseName: string, ownerUri: string, taskExecutionMode: TaskExecutionMode): Thenable<GenerateDeployPlanResult>;\n\t}\n\n\t// Schema Compare interfaces  -----------------------------------------------------------------------\n\texport interface SchemaCompareResult extends ResultStatus {\n\t\toperationId: string;\n\t\tareEqual: boolean;\n\t\tdifferences: DiffEntry[];\n\t}\n\n\texport interface DiffEntry {\n\t\tupdateAction: SchemaUpdateAction;\n\t\tdifferenceType: SchemaDifferenceType;\n\t\tname: string;\n\t\tsourceValue: string;\n\t\ttargetValue: string;\n\t\tparent: DiffEntry;\n\t\tchildren: DiffEntry[];\n\t\tsourceScript: string;\n\t\ttargetScript: string;\n\t}\n\n\texport enum SchemaUpdateAction {\n\t\tDelete = 0,\n\t\tChange = 1,\n\t\tAdd = 2,\n\t}\n\n\texport enum SchemaDifferenceType {\n\t\tObject = 0,\n\t\tProperty = 1,\n\t}\n\texport enum SchemaCompareEndpointType {\n\t\tDatabase = 0,\n\t\tDacpac = 1,\n\t}\n\texport interface SchemaCompareEndpointInfo {\n\t\tendpointType: SchemaCompareEndpointType;\n\t\tpackageFilePath: string;\n\t\tserverName: string;\n\t\tdatabaseName: string;\n\t\townerUri: string;\n\t}\n\n\texport interface SchemaCompareOptionsResult extends ResultStatus {\n\t\tdefaultDeploymentOptions: DeploymentOptions;\n\t}\n\n\texport interface DeploymentOptions {\n\t\tignoreTableOptions: boolean;\n\t\tignoreSemicolonBetweenStatements: boolean;\n\t\tignoreRouteLifetime: boolean;\n\t\tignoreRoleMembership: boolean;\n\t\tignoreQuotedIdentifiers: boolean;\n\t\tignorePermissions: boolean;\n\t\tignorePartitionSchemes: boolean;\n\t\tignoreObjectPlacementOnPartitionScheme: boolean;\n\t\tignoreNotForReplication: boolean;\n\t\tignoreLoginSids: boolean;\n\t\tignoreLockHintsOnIndexes: boolean;\n\t\tignoreKeywordCasing: boolean;\n\t\tignoreIndexPadding: boolean;\n\t\tignoreIndexOptions: boolean;\n\t\tignoreIncrement: boolean;\n\t\tignoreIdentitySeed: boolean;\n\t\tignoreUserSettingsObjects: boolean;\n\t\tignoreFullTextCatalogFilePath: boolean;\n\t\tignoreWhitespace: boolean;\n\t\tignoreWithNocheckOnForeignKeys: boolean;\n\t\tverifyCollationCompatibility: boolean;\n\t\tunmodifiableObjectWarnings: boolean;\n\t\ttreatVerificationErrorsAsWarnings: boolean;\n\t\tscriptRefreshModule: boolean;\n\t\tscriptNewConstraintValidation: boolean;\n\t\tscriptFileSize: boolean;\n\t\tscriptDeployStateChecks: boolean;\n\t\tscriptDatabaseOptions: boolean;\n\t\tscriptDatabaseCompatibility: boolean;\n\t\tscriptDatabaseCollation: boolean;\n\t\trunDeploymentPlanExecutors: boolean;\n\t\tregisterDataTierApplication: boolean;\n\t\tpopulateFilesOnFileGroups: boolean;\n\t\tnoAlterStatementsToChangeClrTypes: boolean;\n\t\tincludeTransactionalScripts: boolean;\n\t\tincludeCompositeObjects: boolean;\n\t\tallowUnsafeRowLevelSecurityDataMovement: boolean;\n\t\tignoreWithNocheckOnCheckConstraints: boolean;\n\t\tignoreFillFactor: boolean;\n\t\tignoreFileSize: boolean;\n\t\tignoreFilegroupPlacement: boolean;\n\t\tdoNotAlterReplicatedObjects: boolean;\n\t\tdoNotAlterChangeDataCaptureObjects: boolean;\n\t\tdisableAndReenableDdlTriggers: boolean;\n\t\tdeployDatabaseInSingleUserMode: boolean;\n\t\tcreateNewDatabase: boolean;\n\t\tcompareUsingTargetCollation: boolean;\n\t\tcommentOutSetVarDeclarations: boolean;\n\t\tblockWhenDriftDetected: boolean;\n\t\tblockOnPossibleDataLoss: boolean;\n\t\tbackupDatabaseBeforeChanges: boolean;\n\t\tallowIncompatiblePlatform: boolean;\n\t\tallowDropBlockingAssemblies: boolean;\n\t\tdropConstraintsNotInSource: boolean;\n\t\tdropDmlTriggersNotInSource: boolean;\n\t\tdropExtendedPropertiesNotInSource: boolean;\n\t\tdropIndexesNotInSource: boolean;\n\t\tignoreFileAndLogFilePath: boolean;\n\t\tignoreExtendedProperties: boolean;\n\t\tignoreDmlTriggerState: boolean;\n\t\tignoreDmlTriggerOrder: boolean;\n\t\tignoreDefaultSchema: boolean;\n\t\tignoreDdlTriggerState: boolean;\n\t\tignoreDdlTriggerOrder: boolean;\n\t\tignoreCryptographicProviderFilePath: boolean;\n\t\tverifyDeployment: boolean;\n\t\tignoreComments: boolean;\n\t\tignoreColumnCollation: boolean;\n\t\tignoreAuthorizer: boolean;\n\t\tignoreAnsiNulls: boolean;\n\t\tgenerateSmartDefaults: boolean;\n\t\tdropStatisticsNotInSource: boolean;\n\t\tdropRoleMembersNotInSource: boolean;\n\t\tdropPermissionsNotInSource: boolean;\n\t\tdropObjectsNotInSource: boolean;\n\t\tignoreColumnOrder: boolean;\n\t\tdoNotDropObjectTypes: SchemaObjectType[];\n\t\texcludeObjectTypes: SchemaObjectType[];\n\t}\n\n\texport enum SchemaObjectType {\n\t\tAggregates = 0,\n\t\tApplicationRoles = 1,\n\t\tAssemblies = 2,\n\t\tAssemblyFiles = 3,\n\t\tAsymmetricKeys = 4,\n\t\tBrokerPriorities = 5,\n\t\tCertificates = 6,\n\t\tColumnEncryptionKeys = 7,\n\t\tColumnMasterKeys = 8,\n\t\tContracts = 9,\n\t\tDatabaseOptions = 10,\n\t\tDatabaseRoles = 11,\n\t\tDatabaseTriggers = 12,\n\t\tDefaults = 13,\n\t\tExtendedProperties = 14,\n\t\tExternalDataSources = 15,\n\t\tExternalFileFormats = 16,\n\t\tExternalTables = 17,\n\t\tFilegroups = 18,\n\t\tFileTables = 19,\n\t\tFullTextCatalogs = 20,\n\t\tFullTextStoplists = 21,\n\t\tMessageTypes = 22,\n\t\tPartitionFunctions = 23,\n\t\tPartitionSchemes = 24,\n\t\tPermissions = 25,\n\t\tQueues = 26,\n\t\tRemoteServiceBindings = 27,\n\t\tRoleMembership = 28,\n\t\tRules = 29,\n\t\tScalarValuedFunctions = 30,\n\t\tSearchPropertyLists = 31,\n\t\tSecurityPolicies = 32,\n\t\tSequences = 33,\n\t\tServices = 34,\n\t\tSignatures = 35,\n\t\tStoredProcedures = 36,\n\t\tSymmetricKeys = 37,\n\t\tSynonyms = 38,\n\t\tTables = 39,\n\t\tTableValuedFunctions = 40,\n\t\tUserDefinedDataTypes = 41,\n\t\tUserDefinedTableTypes = 42,\n\t\tClrUserDefinedTypes = 43,\n\t\tUsers = 44,\n\t\tViews = 45,\n\t\tXmlSchemaCollections = 46,\n\t\tAudits = 47,\n\t\tCredentials = 48,\n\t\tCryptographicProviders = 49,\n\t\tDatabaseAuditSpecifications = 50,\n\t\tDatabaseEncryptionKeys = 51,\n\t\tDatabaseScopedCredentials = 52,\n\t\tEndpoints = 53,\n\t\tErrorMessages = 54,\n\t\tEventNotifications = 55,\n\t\tEventSessions = 56,\n\t\tLinkedServerLogins = 57,\n\t\tLinkedServers = 58,\n\t\tLogins = 59,\n\t\tMasterKeys = 60,\n\t\tRoutes = 61,\n\t\tServerAuditSpecifications = 62,\n\t\tServerRoleMembership = 63,\n\t\tServerRoles = 64,\n\t\tServerTriggers = 65,\n\t}\n\n\texport interface SchemaCompareServicesProvider extends DataProvider {\n\t\tschemaCompare(sourceEndpointInfo: SchemaCompareEndpointInfo, targetEndpointInfo: SchemaCompareEndpointInfo, taskExecutionMode: TaskExecutionMode, deploymentOptions: DeploymentOptions): Thenable<SchemaCompareResult>;\n\t\tschemaCompareGenerateScript(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: TaskExecutionMode): Thenable<ResultStatus>;\n\t\tschemaComparePublishChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: TaskExecutionMode): Thenable<ResultStatus>;\n\t\tschemaCompareGetDefaultOptions(): Thenable<SchemaCompareOptionsResult>;\n\t\tschemaCompareIncludeExcludeNode(operationId: string, diffEntry: DiffEntry, IncludeRequest: boolean, taskExecutionMode: TaskExecutionMode): Thenable<ResultStatus>;\n\t}\n\n\t// Security service interfaces ------------------------------------------------------------------------\n\texport interface CredentialInfo {\n\t\tid: number;\n\t\tidentity: string;\n\t\tname: string;\n\t\tdateLastModified: string;\n\t\tcreateDate: string;\n\t\tproviderName: string;\n\t}\n\n\texport interface GetCredentialsResult extends ResultStatus {\n\t\tcredentials: CredentialInfo[];\n\t}\n\n\t// Task service interfaces ----------------------------------------------------------------------------\n\texport enum TaskStatus {\n\t\tNotStarted = 0,\n\t\tInProgress = 1,\n\t\tSucceeded = 2,\n\t\tSucceededWithWarning = 3,\n\t\tFailed = 4,\n\t\tCanceled = 5,\n\t\tCanceling = 6,\n\t}\n\n\texport enum TaskExecutionMode {\n\t\texecute = 0,\n\t\tscript = 1,\n\t\texecuteAndScript = 2,\n\t}\n\n\texport interface ListTasksParams {\n\t\tlistActiveTasksOnly: boolean;\n\t}\n\n\texport interface TaskInfo {\n\t\tconnection?: connection.Connection;\n\t\ttaskId: string;\n\t\tstatus: TaskStatus;\n\t\ttaskExecutionMode: TaskExecutionMode;\n\t\tserverName: string;\n\t\tdatabaseName: string;\n\t\tname: string;\n\t\tdescription: string;\n\t\tproviderName: string;\n\t\tisCancelable: boolean;\n\t}\n\n\texport interface ListTasksResponse {\n\t\ttasks: TaskInfo[];\n\t}\n\n\texport interface CancelTaskParams {\n\t\ttaskId: string;\n\t}\n\n\texport interface TaskProgressInfo {\n\t\ttaskId: string;\n\t\tstatus: TaskStatus;\n\t\tmessage: string;\n\t\tscript?: string;\n\t}\n\n\texport interface TaskServicesProvider extends DataProvider {\n\t\tgetAllTasks(listTasksParams: ListTasksParams): Thenable<ListTasksResponse>;\n\n\t\tcancelTask(cancelTaskParams: CancelTaskParams): Thenable<boolean>;\n\n\t\tregisterOnTaskCreated(handler: (response: TaskInfo) => any): void;\n\n\t\tregisterOnTaskStatusChanged(handler: (response: TaskProgressInfo) => any): void;\n\t}\n\n\t// Disaster Recovery interfaces  -----------------------------------------------------------------------\n\n\texport interface BackupConfigInfo {\n\t\trecoveryModel: string;\n\t\tdefaultBackupFolder: string;\n\t\tbackupEncryptors: {};\n\t}\n\n\texport interface BackupResponse {\n\t\tresult: boolean;\n\t\ttaskId: number;\n\t}\n\n\texport interface BackupProvider extends DataProvider {\n\t\tbackup(connectionUri: string, backupInfo: { [key: string]: any }, taskExecutionMode: TaskExecutionMode): Thenable<BackupResponse>;\n\t\tgetBackupConfigInfo(connectionUri: string): Thenable<BackupConfigInfo>;\n\t}\n\n\texport interface RestoreProvider extends DataProvider {\n\t\tgetRestorePlan(connectionUri: string, restoreInfo: RestoreInfo): Thenable<RestorePlanResponse>;\n\t\tcancelRestorePlan(connectionUri: string, restoreInfo: RestoreInfo): Thenable<boolean>;\n\t\trestore(connectionUri: string, restoreInfo: RestoreInfo): Thenable<RestoreResponse>;\n\t\tgetRestoreConfigInfo(connectionUri: string): Thenable<RestoreConfigInfo>;\n\t}\n\n\texport interface RestoreInfo {\n\t\toptions: { [key: string]: any };\n\t\ttaskExecutionMode: TaskExecutionMode;\n\t}\n\n\texport interface RestoreDatabaseFileInfo {\n\t\tfileType: string;\n\n\t\tlogicalFileName: string;\n\n\t\toriginalFileName: string;\n\n\t\trestoreAsFileName: string;\n\t}\n\n\texport interface DatabaseFileInfo {\n\t\tproperties: LocalizedPropertyInfo[];\n\t\tid: string;\n\t\tisSelected: boolean;\n\t}\n\n\texport interface LocalizedPropertyInfo {\n\t\tpropertyName: string;\n\t\tpropertyValue: string;\n\t\tpropertyDisplayName: string;\n\t\tpropertyValueDisplayName: string;\n\t}\n\n\texport interface RestorePlanDetailInfo {\n\t\tname: string;\n\t\tcurrentValue: any;\n\t\tisReadOnly: boolean;\n\t\tisVisible: boolean;\n\t\tdefaultValue: any;\n\t}\n\n\texport interface RestorePlanResponse {\n\t\tsessionId: string;\n\t\tbackupSetsToRestore: DatabaseFileInfo[];\n\t\tcanRestore: boolean;\n\t\terrorMessage: string;\n\t\tdbFiles: RestoreDatabaseFileInfo[];\n\t\tdatabaseNamesFromBackupSets: string[];\n\t\tplanDetails: { [key: string]: RestorePlanDetailInfo };\n\t}\n\n\texport interface RestoreConfigInfo {\n\t\tconfigInfo: { [key: string]: any };\n\t}\n\n\texport interface RestoreResponse {\n\t\tresult: boolean;\n\t\ttaskId: string;\n\t\terrorMessage: string;\n\t}\n\n\texport interface ProfilerProvider extends DataProvider {\n\t\tcreateSession(sessionId: string, sessionName: string, template: ProfilerSessionTemplate): Thenable<boolean>;\n\t\tstartSession(sessionId: string, sessionName: string): Thenable<boolean>;\n\t\tstopSession(sessionId: string): Thenable<boolean>;\n\t\tpauseSession(sessionId: string): Thenable<boolean>;\n\t\tgetXEventSessions(sessionId: string): Thenable<string[]>;\n\t\tconnectSession(sessionId: string): Thenable<boolean>;\n\t\tdisconnectSession(sessionId: string): Thenable<boolean>;\n\n\t\tregisterOnSessionEventsAvailable(handler: (response: ProfilerSessionEvents) => any): void;\n\t\tregisterOnSessionStopped(handler: (response: ProfilerSessionStoppedParams) => any): void;\n\t\tregisterOnProfilerSessionCreated(handler: (response: ProfilerSessionCreatedParams) => any): void;\n\t}\n\n\texport interface IProfilerTableRow {\n\t\t/**\n\t\t * Name of the event; known issue this is not camel case, need to figure\n\t\t * out a better way to determine column id's from rendered column names\n\t\t */\n\t\tEventClass: string;\n\t}\n\n\texport interface IProfilerMoreRowsNotificationParams {\n\t\turi: string;\n\t\trowCount: number;\n\t\tdata: IProfilerTableRow;\n\t}\n\n\t/**\n\t * Profiler Event\n\t */\n\texport interface ProfilerEvent {\n\t\t/**\n\t\t * Event class name\n\t\t */\n\t\tname: string;\n\n\t\t/**\n\t\t * Event timestamp\n\t\t */\n\t\ttimestamp: string;\n\n\t\t/**\n\t\t * Event values\n\t\t */\n\t\tvalues: {};\n\t}\n\n\t/**\n\t * Profiler Session Template\n\t */\n\texport interface ProfilerSessionTemplate {\n\t\t/**\n\t\t * Template name\n\t\t */\n\t\tname: string;\n\n\t\t/**\n\t\t * Default view for template\n\t\t */\n\t\tdefaultView: string;\n\n\t\t/**\n\t\t * TSQL for creating a session\n\t\t */\n\t\tcreateStatement: string;\n\t}\n\n\texport interface ProfilerSessionEvents {\n\t\tsessionId: string;\n\n\t\tevents: ProfilerEvent[];\n\n\t\teventsLost: boolean;\n\t}\n\n\texport interface ProfilerSessionStoppedParams {\n\n\t\townerUri: string;\n\n\t\tsessionId: number;\n\t}\n\n\texport interface ProfilerSessionCreatedParams {\n\t\townerUri: string;\n\t\tsessionName: string;\n\t\ttemplateName: string;\n\t}\n\n\t// File browser interfaces  -----------------------------------------------------------------------\n\n\texport interface FileBrowserProvider extends DataProvider {\n\t\topenFileBrowser(ownerUri: string, expandPath: string, fileFilters: string[], changeFilter: boolean): Thenable<boolean>;\n\t\tregisterOnFileBrowserOpened(handler: (response: FileBrowserOpenedParams) => any): void;\n\t\texpandFolderNode(ownerUri: string, expandPath: string): Thenable<boolean>;\n\t\tregisterOnFolderNodeExpanded(handler: (response: FileBrowserExpandedParams) => any): void;\n\t\tvalidateFilePaths(ownerUri: string, serviceType: string, selectedFiles: string[]): Thenable<boolean>;\n\t\tregisterOnFilePathsValidated(handler: (response: FileBrowserValidatedParams) => any): void;\n\t\tcloseFileBrowser(ownerUri: string): Thenable<FileBrowserCloseResponse>;\n\t}\n\n\texport interface FileTreeNode {\n\t\tchildren: FileTreeNode[];\n\t\tisExpanded: boolean;\n\t\tisFile: boolean;\n\t\tname: string;\n\t\tfullPath: string;\n\t}\n\n\texport interface FileTree {\n\t\trootNode: FileTreeNode;\n\t\tselectedNode: FileTreeNode;\n\t}\n\n\texport interface FileBrowserOpenedParams {\n\t\townerUri: string;\n\t\tfileTree: FileTree;\n\t\tsucceeded: boolean;\n\t\tmessage: string;\n\t}\n\n\texport interface FileBrowserExpandedParams {\n\t\townerUri: string;\n\t\texpandPath: string;\n\t\tchildren: FileTreeNode[];\n\t\tsucceeded: boolean;\n\t\tmessage: string;\n\t}\n\n\texport interface FileBrowserValidatedParams {\n\t\tsucceeded: boolean;\n\t\tmessage: string;\n\t}\n\n\texport interface FileBrowserCloseResponse {\n\t\tsucceeded: boolean;\n\t\tmessage: string;\n\t}\n\n\t// ACCOUNT MANAGEMENT //////////////////////////////////////////////////\n\texport namespace accounts {\n\t\texport function registerAccountProvider(providerMetadata: AccountProviderMetadata, provider: AccountProvider): vscode.Disposable;\n\n\t\t/**\n\t\t * Launches a flyout dialog that will display the information on how to complete device\n\t\t * code OAuth login to the user. Only one flyout can be opened at once and each must be closed\n\t\t * by calling {@link endAutoOAuthDeviceCode}.\n\t\t * @param providerId\tID of the provider that's requesting the flyout be opened\n\t\t */\n\t\texport function beginAutoOAuthDeviceCode(providerId: string, title: string, message: string, userCode: string, uri: string): Thenable<void>;\n\n\t\t/**\n\t\t * Closes the flyout dialog opened by {@link beginAutoOAuthDeviceCode}\n\t\t */\n\t\texport function endAutoOAuthDeviceCode(): void;\n\n\t\t/**\n\t\t * Notifies the account management service that an account has updated (usually due to the\n\t\t * account going stale).\n\t\t * @param updatedAccount Account object with updated properties\n\t\t */\n\t\texport function accountUpdated(updatedAccount: Account): void;\n\n\t\t/**\n\t\t * Gets all added accounts.\n\t\t * @returns Promise to return the accounts\n\t\t */\n\t\texport function getAllAccounts(): Thenable<Account[]>;\n\n\t\t/**\n\t\t * Generates a security token by asking the account's provider\n\t\t * @param account Account to generate security token for (defaults to\n\t\t * AzureResource.ResourceManagement if not given)\n\t\t * @return Promise to return the security token\n\t\t */\n\t\texport function getSecurityToken(account: Account, resource?: AzureResource): Thenable<{}>;\n\n\t\t/**\n\t\t * An [event](#Event) which fires when the accounts have changed.\n\t\t */\n\t\texport const onDidChangeAccounts: vscode.Event<DidChangeAccountsParams>;\n\t}\n\n\t/**\n\t * Represents display information for an account.\n\t */\n\texport interface AccountDisplayInfo {\n\t\t/**\n\t\t * A display name that offers context for the account, such as \"Contoso\".\n\t\t */\n\t\tcontextualDisplayName: string;\n\n\t\t/**\n\t\t * account provider (eg, Work/School vs Microsoft Account)\n\t\t */\n\t\taccountType: string;\n\n\t\t/**\n\t\t * A display name that identifies the account, such as \"User Name\".\n\t\t */\n\t\tdisplayName: string;\n\n\t\t/**\n\t\t * User id that identifies the account, such as \"user@contoso.com\".\n\t\t */\n\t\tuserId: string;\n\t}\n\n\t/**\n\t * Represents a key that identifies an account.\n\t */\n\texport interface AccountKey {\n\t\t/**\n\t\t * Identifier of the provider\n\t\t */\n\t\tproviderId: string;\n\n\t\t/**\n\t\t * Any arguments that identify an instantiation of the provider\n\t\t */\n\t\tproviderArgs?: any;\n\n\t\t/**\n\t\t * Identifier for the account, unique to the provider\n\t\t */\n\t\taccountId: string;\n\t}\n\n\t/**\n\t * Represents an account.\n\t */\n\texport interface Account {\n\t\t/**\n\t\t * The key that identifies the account\n\t\t */\n\t\tkey: AccountKey;\n\n\t\t/**\n\t\t * Display information for the account\n\t\t */\n\t\tdisplayInfo: AccountDisplayInfo;\n\n\t\t/**\n\t\t * Custom properties stored with the account\n\t\t */\n\t\tproperties: any;\n\n\t\t/**\n\t\t * Indicates if the account needs refreshing\n\t\t */\n\t\tisStale: boolean;\n\t}\n\n\texport enum AzureResource {\n\t\tResourceManagement = 0,\n\t\tSql = 1,\n\t}\n\n\texport interface DidChangeAccountsParams {\n\t\t// Updated accounts\n\t\taccounts: Account[];\n\t}\n\n\t// - ACCOUNT PROVIDER //////////////////////////////////////////////////\n\t/**\n\t * Error to be used when the user has cancelled the prompt or refresh methods. When\n\t * AccountProvider.refresh or AccountProvider.prompt are rejected with this error, the error\n\t * will not be reported to the user.\n\t */\n\texport interface PromptFailedResult {\n\t\t/**\n\t\t * Type guard for differentiating user cancelled sign in errors from other errors\n\t\t */\n\t\tcanceled: boolean;\n\t}\n\n\t/**\n\t * Represents a provider of accounts.\n\t */\n\texport interface AccountProviderMetadata {\n\t\t/**\n\t\t * The identifier of the provider\n\t\t */\n\t\tid: string;\n\n\t\t/**\n\t\t * Display name of the provider\n\t\t */\n\t\tdisplayName: string;\n\n\t\t/**\n\t\t * Any arguments that identify an instantiation of the provider\n\t\t */\n\t\targs?: any;\n\n\t\t/**\n\t\t * Optional settings that identify an instantiation of a provider\n\t\t */\n\t\tsettings?: {};\n\t}\n\n\t/**\n\t * Represents a provider of accounts for use with the account management service\n\t */\n\texport interface AccountProvider {\n\t\t/**\n\t\t * Initializes the account provider with the accounts restored from the memento,\n\t\t * @param storedAccounts Accounts restored from the memento\n\t\t * @return Account objects after being rehydrated (if necessary)\n\t\t */\n\t\tinitialize(storedAccounts: Account[]): Thenable<Account[]>;\n\n\t\t/**\n\t\t * Generates a security token for the provided account\n\t\t * @param account The account to generate a security token for\n\t\t * @param resource The resource to get the token for\n\t\t * @return Promise to return a security token object\n\t\t */\n\t\tgetSecurityToken(account: Account, resource: AzureResource): Thenable<{}>;\n\n\t\t/**\n\t\t * Prompts the user to enter account information.\n\t\t * Returns an error if the user canceled the operation.\n\t\t */\n\t\tprompt(): Thenable<Account | PromptFailedResult>;\n\n\t\t/**\n\t\t * Refreshes a stale account.\n\t\t * Returns an error if the user canceled the operation.\n\t\t * Otherwise, returns a new updated account instance.\n\t\t * @param account - An account.\n\t\t */\n\t\trefresh(account: Account): Thenable<Account | PromptFailedResult>;\n\n\t\t/**\n\t\t * Clears sensitive information for an account. To be called when account is removed\n\t\t * @param accountKey - Key that uniquely identifies the account to clear\n\t\t */\n\t\tclear(accountKey: AccountKey): Thenable<void>;\n\n\t\t/**\n\t\t * Called from the account management service when the user has cancelled an auto OAuth\n\t\t * authorization process. Implementations should use this to cancel any polling process\n\t\t * and call the end OAuth method.\n\t\t */\n\t\tautoOAuthCancelled(): Thenable<void>;\n\t}\n\n\t// Resource provider interfaces  -----------------------------------------------------------------------\n\n\t// - ACCOUNT PROVIDER //////////////////////////////////////////////////\n\t/**\n\t * Represents a provider of accounts.\n\t */\n\texport interface ResourceProviderMetadata {\n\t\t/**\n\t\t * The identifier of the provider\n\t\t */\n\t\tid: string;\n\n\t\t/**\n\t\t * Display name of the provider\n\t\t */\n\t\tdisplayName: string;\n\n\t\t/**\n\t\t * Optional settings that identify an instantiation of a provider\n\t\t */\n\t\tsettings?: {};\n\t}\n\n\texport namespace resources {\n\t\t/**\n\t\t * Registers a resource provider that can suport\n\t\t */\n\t\texport function registerResourceProvider(providerMetadata: ResourceProviderMetadata, provider: ResourceProvider): vscode.Disposable;\n\t}\n\n\t/**\n\t * Represents a provider of resource\n\t */\n\texport interface ResourceProvider {\n\t\tcreateFirewallRule(account: Account, firewallruleInfo: FirewallRuleInfo): Thenable<CreateFirewallRuleResponse>;\n\t\thandleFirewallRule(errorCode: number, errorMessage: string, connectionTypeId: string): Thenable<HandleFirewallRuleResponse>;\n\t}\n\n\texport interface FirewallRuleInfo {\n\t\tstartIpAddress: string;\n\t\tendIpAddress: string;\n\t\tserverName: string;\n\t\tsecurityTokenMappings: {};\n\t}\n\n\texport interface CreateFirewallRuleResponse {\n\t\tresult: boolean;\n\t\terrorMessage: string;\n\t}\n\n\texport interface HandleFirewallRuleResponse {\n\t\tresult: boolean;\n\t\tipAddress: string;\n\t}\n\n\texport interface ModalDialog {\n\t\t/**\n\t\t * Title of the webview.\n\t\t */\n\t\ttitle: string;\n\n\t\t/**\n\t\t * Contents of the dialog body.\n\t\t */\n\t\thtml: string;\n\n\t\t/**\n\t\t * The caption of the OK button.\n\t\t */\n\t\tokTitle: string;\n\n\t\t/**\n\t\t * The caption of the Close button.\n\t\t */\n\t\tcloseTitle: string;\n\n\t\t/**\n\t\t * Opens the dialog.\n\t\t */\n\t\topen(): void;\n\n\t\t/**\n\t\t * Closes the dialog.\n\t\t */\n\t\tclose(): void;\n\n\t\t/**\n\t\t * Raised when the webview posts a message.\n\t\t */\n\t\treadonly onMessage: vscode.Event<any>;\n\n\t\t/**\n\t\t * Raised when dialog closed.\n\t\t */\n\t\treadonly onClosed: vscode.Event<any>;\n\n\t\t/**\n\t\t * Post a message to the dialog.\n\t\t *\n\t\t * @param message Body of the message.\n\t\t */\n\t\tpostMessage(message: any): Thenable<any>;\n\t}\n\n\texport interface DashboardWebview {\n\n\t\t/**\n\t\t * Raised when the webview posts a message.\n\t\t */\n\t\treadonly onMessage: vscode.Event<any>;\n\n\t\t/**\n\t\t * Raised when the webview closed.\n\t\t */\n\t\treadonly onClosed: vscode.Event<any>;\n\n\t\t/**\n\t\t * Post a message to the webview.\n\t\t *\n\t\t * @param message Body of the message.\n\t\t */\n\t\tpostMessage(message: any): Thenable<any>;\n\n\t\t/**\n\t\t * The connection info for the dashboard the webview exists on\n\t\t */\n\t\treadonly connection: connection.Connection;\n\n\t\t/**\n\t\t * The info on the server for the webview dashboard\n\t\t */\n\t\treadonly serverInfo: ServerInfo;\n\n\t\t/**\n\t\t * Contents of the dialog body.\n\t\t */\n\t\thtml: string;\n\t}\n\n\texport namespace dashboard {\n\t\t/**\n\t\t * Register a provider for a webview widget\n\t\t */\n\t\texport function registerWebviewProvider(widgetId: string, handler: (webview: DashboardWebview) => void): void;\n\t}\n\n\texport namespace workspace {\n\t\t/**\n\t\t * An event that is emitted when a [dashboard](#DashboardDocument) is opened.\n\t\t */\n\t\texport const onDidOpenDashboard: vscode.Event<DashboardDocument>;\n\n\t\t/**\n\t\t * An event that is emitted when a [dashboard](#DashboardDocument) is focused.\n\t\t */\n\t\texport const onDidChangeToDashboard: vscode.Event<DashboardDocument>;\n\t}\n\n\texport interface DashboardDocument {\n\t\tprofile: IConnectionProfile;\n\t\tserverInfo: ServerInfo;\n\t}\n\n\texport class TreeItem extends vscode.TreeItem {\n\t    payload?: IConnectionProfile;\n\t    childProvider?: string;\n\t}\n\n\texport namespace tasks {\n\n\t\texport interface ITaskHandler {\n\t\t\t(profile: IConnectionProfile, ...args: any[]): any;\n\t\t}\n\n\t\t/**\n\t\t* Registers a task that can be invoked via a keyboard shortcut,\n\t\t* a menu item, an action, or directly.\n\t\t*\n\t\t* Registering a task with an existing task identifier twice\n\t\t* will cause an error.\n\t\t*\n\t\t* @param task A unique identifier for the task.\n\t\t* @param callback A task handler function.\n\t\t* @param thisArg The `this` context used when invoking the handler function.\n\t\t* @return Disposable which unregisters this task on disposal.\n\t\t*/\n\t\texport function registerTask(task: string, callback: ITaskHandler, thisArg?: any): vscode.Disposable;\n\t}\n\n\t/**\n\t * Supports defining a model that can be instantiated as a view in the UI\n\t * @export\n\t */\n\texport interface ModelBuilder {\n\t\tnavContainer(): ContainerBuilder<NavContainer, any, any>;\n\t\tdivContainer(): DivBuilder;\n\t\tflexContainer(): FlexBuilder;\n\t\tsplitViewContainer(): SplitViewBuilder;\n\t\tdom(): ComponentBuilder<DomComponent>;\n\t\tcard(): ComponentBuilder<CardComponent>;\n\t\tinputBox(): ComponentBuilder<InputBoxComponent>;\n\t\tcheckBox(): ComponentBuilder<CheckBoxComponent>;\n\t\tradioButton(): ComponentBuilder<RadioButtonComponent>;\n\t\twebView(): ComponentBuilder<WebViewComponent>;\n\t\teditor(): ComponentBuilder<EditorComponent>;\n\t\tdiffeditor(): ComponentBuilder<DiffEditorComponent>;\n\t\ttext(): ComponentBuilder<TextComponent>;\n\t\tbutton(): ComponentBuilder<ButtonComponent>;\n\t\tdropDown(): ComponentBuilder<DropDownComponent>;\n\t\ttree<T>(): ComponentBuilder<TreeComponent<T>>;\n\t\tlistBox(): ComponentBuilder<ListBoxComponent>;\n\t\ttable(): ComponentBuilder<TableComponent>;\n\t\tdeclarativeTable(): ComponentBuilder<DeclarativeTableComponent>;\n\t\tdashboardWidget(widgetId: string): ComponentBuilder<DashboardWidgetComponent>;\n\t\tdashboardWebview(webviewId: string): ComponentBuilder<DashboardWebviewComponent>;\n\t\tformContainer(): FormBuilder;\n\t\tgroupContainer(): GroupBuilder;\n\t\ttoolbarContainer(): ToolbarBuilder;\n\t\tloadingComponent(): LoadingComponentBuilder;\n\t\tfileBrowserTree(): ComponentBuilder<FileBrowserTreeComponent>;\n\t\thyperlink(): ComponentBuilder<HyperlinkComponent>;\n\t}\n\n\texport interface TreeComponentDataProvider<T> extends vscode.TreeDataProvider<T> {\n\t\tgetTreeItem(element: T): TreeComponentItem | Thenable<TreeComponentItem>;\n\t}\n\n\texport interface NodeCheckedEventParameters<T> {\n\t\telement: T;\n\t\tchecked: boolean;\n\t}\n\n\texport interface TreeComponentView<T> extends vscode.Disposable {\n\t\tonNodeCheckedChanged: vscode.Event<NodeCheckedEventParameters<T>>;\n\t\tonDidChangeSelection: vscode.Event<vscode.TreeViewSelectionChangeEvent<T>>;\n\t}\n\n\texport class TreeComponentItem extends vscode.TreeItem {\n\t    checked?: boolean;\n\t    enabled?: boolean;\n\t}\n\n\texport interface ComponentBuilder<T extends Component> {\n\t\tcomponent(): T;\n\t\twithProperties<U>(properties: U): ComponentBuilder<T>;\n\t\twithValidation(validation: (component: T) => boolean): ComponentBuilder<T>;\n\t}\n\texport interface ContainerBuilder<T extends Component, TLayout, TItemLayout> extends ComponentBuilder<T> {\n\t\twithLayout(layout: TLayout): ContainerBuilder<T, TLayout, TItemLayout>;\n\t\twithItems(components: Array<Component>, itemLayout?: TItemLayout): ContainerBuilder<T, TLayout, TItemLayout>;\n\t}\n\n\texport interface FlexBuilder extends ContainerBuilder<FlexContainer, FlexLayout, FlexItemLayout> {\n\n\t}\n\n\t// Building on top of flex item\n\texport interface SplitViewBuilder extends ContainerBuilder<SplitViewContainer, SplitViewLayout, FlexItemLayout> {\n\n\t}\n\n\texport interface DivBuilder extends ContainerBuilder<DivContainer, DivLayout, DivItemLayout> {\n\n\t}\n\n\texport interface GroupBuilder extends ContainerBuilder<GroupContainer, GroupLayout, GroupItemLayout> {\n\t}\n\n\texport interface ToolbarBuilder extends ContainerBuilder<ToolbarContainer, ToolbarLayout, any> {\n\t\twithToolbarItems(components: ToolbarComponent[]): ContainerBuilder<ToolbarContainer, ToolbarLayout, any>;\n\n\t\t/**\n\t\t * Creates a collection of child components and adds them all to this container\n\t\t *\n\t\t * @param toolbarComponents the definitions\n\t\t */\n\t\taddToolbarItems(toolbarComponents: Array<ToolbarComponent>): void;\n\n\t\t/**\n\t\t * Creates a child component and adds it to this container.\n\t\t *\n\t\t * @param toolbarComponent the component to be added\n\t\t */\n\t\taddToolbarItem(toolbarComponent: ToolbarComponent): void;\n\t}\n\n\texport interface LoadingComponentBuilder extends ComponentBuilder<LoadingComponent> {\n\t\t/**\n\t\t * Set the component wrapped by the LoadingComponent\n\t\t * @param component The component to wrap\n\t\t */\n\t\twithItem(component: Component): LoadingComponentBuilder;\n\t}\n\n\texport interface FormBuilder extends ContainerBuilder<FormContainer, FormLayout, FormItemLayout> {\n\t\twithFormItems(components: (FormComponent | FormComponentGroup)[], itemLayout?: FormItemLayout): FormBuilder;\n\n\t\t/**\n\t\t * Creates a collection of child components and adds them all to this container\n\t\t *\n\t\t * @param formComponents the definitions\n\t\t * @param [itemLayout] Optional layout for the child items\n\t\t */\n\t\taddFormItems(formComponents: Array<FormComponent | FormComponentGroup>, itemLayout?: FormItemLayout): void;\n\n\t\t/**\n\t\t * Creates a child component and adds it to this container.\n\t\t *\n\t\t * @param formComponent the component to be added\n\t\t * @param [itemLayout] Optional layout for this child item\n\t\t */\n\t\taddFormItem(formComponent: FormComponent | FormComponentGroup, itemLayout?: FormItemLayout): void;\n\n\t\t/**\n\t\t * Inserts a from component in a given position in the form. Returns error given invalid index\n\t\t * @param formComponent Form component\n\t\t * @param index index to insert the component to\n\t\t * @param itemLayout Item Layout\n\t\t */\n\t\tinsertFormItem(formComponent: FormComponent | FormComponentGroup, index?: number, itemLayout?: FormItemLayout): void;\n\n\t\t/**\n\t\t * Removes a from item from the from\n\t\t */\n\t\tremoveFormItem(formComponent: FormComponent | FormComponentGroup): boolean;\n\t}\n\n\texport interface Component {\n\t\treadonly id: string;\n\n\t\t/**\n\t\t * Sends any updated properties of the component to the UI\n\t\t *\n\t\t * @returns Thenable that completes once the update\n\t\t * has been applied in the UI\n\t\t */\n\t\tupdateProperties(properties: { [key: string]: any }): Thenable<void>;\n\n\t\t/**\n\t\t * Sends an updated property of the component to the UI\n\t\t *\n\t\t * @returns Thenable that completes once the update\n\t\t * has been applied in the UI\n\t\t */\n\t\tupdateProperty(key: string, value: any): Thenable<void>;\n\n\t\tenabled: boolean;\n\t\t/**\n\t\t * Event fired to notify that the component's validity has changed\n\t\t */\n\t\treadonly onValidityChanged: vscode.Event<boolean>;\n\n\t\t/**\n\t\t * Whether the component is valid or not\n\t\t */\n\t\treadonly valid: boolean;\n\n\t\t/**\n\t\t * Run the component's validations\n\t\t */\n\t\tvalidate(): Thenable<boolean>;\n\t}\n\n\texport interface FormComponent {\n\t\tcomponent: Component;\n\t\ttitle: string;\n\t\tactions?: Component[];\n\t\trequired?: boolean;\n\t}\n\n\t/**\n\t * Used to create a group of components in a form layout\n\t */\n\texport interface FormComponentGroup {\n\t\t/**\n\t\t * The form components to display in the group along with optional layouts for each item\n\t\t */\n\t\tcomponents: (FormComponent & { layout?: FormItemLayout })[];\n\n\t\t/**\n\t\t * The title of the group, displayed above its components\n\t\t */\n\t\ttitle: string;\n\t}\n\n\texport interface ToolbarComponent {\n\t\tcomponent: Component;\n\t\ttitle?: string;\n\t\ttoolbarSeparatorAfter?: boolean;\n\t}\n\n\t/**\n\t * A component that contains other components\n\t */\n\texport interface Container<TLayout, TItemLayout> extends Component {\n\t\t/**\n\t\t * A copy of the child items array. This cannot be added to directly -\n\t\t * components must be created using the create methods instead\n\t\t */\n\t\treadonly items: Component[];\n\n\t\t/**\n\t\t * Removes all child items from this container\n\t\t */\n\t\tclearItems(): void;\n\t\t/**\n\t\t * Creates a collection of child components and adds them all to this container\n\t\t *\n\t\t * @param itemConfigs the definitions\n\t\t * @param [itemLayout] Optional layout for the child items\n\t\t */\n\t\taddItems(itemConfigs: Array<Component>, itemLayout?: TItemLayout): void;\n\n\t\t/**\n\t\t * Creates a child component and adds it to this container.\n\t\t * Adding component to multiple containers is not supported\n\t\t *\n\t\t * @param component the component to be added\n\t\t * @param [itemLayout] Optional layout for this child item\n\t\t */\n\t\taddItem(component: Component, itemLayout?: TItemLayout): void;\n\n\t\t/**\n\t\t * Creates a child component and inserts it to this container. Returns error given invalid index\n\t\t * Adding component to multiple containers is not supported\n\t\t * @param component the component to be added\n\t\t * @param index the index to insert the component to\n\t\t * @param [itemLayout] Optional layout for this child item\n\t\t */\n\t\tinsertItem(component: Component, index: number, itemLayout?: TItemLayout): void;\n\n\t\t/**\n\t\t *\n\t\t * @param component Removes a component from this container\n\t\t */\n\t\tremoveItem(component: Component): boolean;\n\n\t\t/**\n\t\t * Defines the layout for this container\n\t\t *\n\t\t * @param layout object\n\t\t */\n\t\tsetLayout(layout: TLayout): void;\n\t}\n\n\texport interface NavContainer extends Container<any, any> {\n\n\t}\n\n\t/**\n\t * The config for a FlexBox-based container. This supports easy\n\t * addition of content to a container with a flexible layout\n\t * and use of space.\n\t */\n\texport interface FlexLayout {\n\t\t/**\n\t\t * Matches the flex-flow CSS property and its available values.\n\t\t * To layout as a vertical view use \"column\", and for horizontal\n\t\t * use \"row\".\n\t\t */\n\t\tflexFlow?: string;\n\t\t/**\n\t\t * Matches the justify-content CSS property.\n\t\t */\n\t\tjustifyContent?: string;\n\t\t/**\n\t\t * Matches the align-items CSS property.\n\t\t */\n\t\talignItems?: string;\n\t\t/**\n\t\t * Matches the align-content CSS property.\n\t\t */\n\t\talignContent?: string;\n\n\t\t/**\n\t\t * Container Height\n\t\t */\n\t\theight?: number | string;\n\n\t\t/**\n\t\t * Container Width\n\t\t */\n\t\twidth?: number | string;\n\n\t\t/**\n\t\t *\n\t\t */\n\t\ttextAlign?: string;\n\n\t\t/**\n\t\t * The position CSS property. Empty by default.\n\t\t * This is particularly useful if laying out components inside a FlexContainer and\n\t\t * the size of the component is meant to be a fixed size. In this case the position must be\n\t\t * set to 'absolute', with the parent FlexContainer having 'relative' position.\n\t\t * Without this the component will fail to correctly size itself.\n\t\t */\n\t\tposition?: string;\n\t}\n\n\texport interface SplitViewLayout extends FlexLayout {\n\n\t\t/**\n\t\t * Orientation of the views inside split\n\t\t */\n\t\torientation: string;\n\n\t\t/**\n\t\t * SplitView height\n\t\t */\n\t\tsplitViewHeight: number | string;\n\t}\n\n\texport interface FlexItemLayout {\n\t\t/**\n\t\t * Matches the order CSS property and its available values.\n\t\t */\n\t\torder?: number;\n\t\t/**\n\t\t * Matches the flex CSS property and its available values.\n\t\t * Default is \"1 1 auto\".\n\t\t */\n\t\tflex?: string;\n\t\t/**\n\t\t * Matches the CSS style key and its available values.\n\t\t */\n\t\tCSSStyles?: { [key: string]: string };\n\t}\n\n\texport interface FormItemLayout {\n\t\thorizontal?: boolean;\n\t\tcomponentWidth?: number | string;\n\t\tcomponentHeight?: number | string;\n\t\ttitleFontSize?: number | string;\n\t\tinfo?: string;\n\t}\n\n\texport interface FormLayout {\n\t\twidth?: number | string;\n\t\theight?: number | string;\n\t\tpadding?: string;\n\t}\n\n\texport interface GroupLayout {\n\t\twidth?: number | string;\n\t\theader?: string;\n\t\tcollapsible?: boolean;\n\t\tcollapsed?: boolean;\n\t}\n\n\texport interface GroupItemLayout {\n\t}\n\n\texport interface DivLayout {\n\t\t/**\n\t\t * Container Height\n\t\t */\n\t\theight?: number | string;\n\n\t\t/**\n\t\t * Container Width\n\t\t */\n\t\twidth?: number | string;\n\t}\n\n\texport interface DivItemLayout {\n\t\t/**\n\t\t * Matches the order CSS property and its available values.\n\t\t */\n\t\torder?: number;\n\n\t\t/**\n\t\t * Matches the CSS style key and its available values.\n\t\t */\n\t\tCSSStyles?: { [key: string]: string };\n\t}\n\n\texport interface DivContainer extends Container<DivLayout, DivItemLayout>, DivContainerProperties {\n\t\t/**\n\t\t * An event called when the div is clicked\n\t\t */\n\t\tonDidClick: vscode.Event<any>;\n\t}\n\n\texport interface FlexContainer extends Container<FlexLayout, FlexItemLayout> {\n\t}\n\n\texport interface SplitViewContainer extends Container<SplitViewLayout, FlexItemLayout> {\n\t}\n\n\texport interface FormContainer extends Container<FormLayout, FormItemLayout> {\n\t}\n\n\texport interface GroupContainer extends Container<GroupLayout, GroupItemLayout> {\n\t}\n\n\n\texport enum Orientation {\n\t\tHorizontal = 'horizontal',\n\t\tVertical = 'vertial',\n\t}\n\n\texport interface ToolbarLayout {\n\t\torientation: Orientation;\n\t}\n\texport interface ToolbarContainer extends Container<ToolbarLayout, any> {\n\t}\n\n\t/**\n\t * Describes an action to be shown in the UI, with a user-readable label\n\t * and a callback to execute the action\n\t */\n\texport interface ActionDescriptor {\n\t\t/**\n\t\t * User-visible label to display\n\t\t */\n\t\tlabel: string;\n\t\t/**\n\t\t * Name of the clickable action. If not defined then no action will be shown\n\t\t */\n\t\tactionTitle?: string;\n\t\t/**\n\t\t * Data sent on callback being run.\n\t\t */\n\t\tcallbackData?: any;\n\t}\n\n\t/**\n\t * Defines status indicators that can be shown to the user as part of\n\t * components such as the Card UI\n\t */\n\texport enum StatusIndicator {\n\t\tNone = 0,\n\t\tOk = 1,\n\t\tWarning = 2,\n\t\tError = 3,\n\t}\n\n\texport enum CardType {\n\t\tVerticalButton = 'VerticalButton',\n\t\tDetails = 'Details',\n\t\tListItem = 'ListItem',\n\t}\n\n\t/**\n\t * Properties representing the card component, can be used\n\t * when using ModelBuilder to create the component\n\t */\n\texport interface CardProperties extends ComponentWithIcon {\n\t\tlabel: string;\n\t\tvalue?: string;\n\t\tactions?: ActionDescriptor[];\n\t\tdescriptions?: string[];\n\t\tstatus?: StatusIndicator;\n\n\t\t/**\n\t\t * Returns true if the card is selected\n\t\t */\n\t\tselected?: boolean;\n\n\t\t/**\n\t\t * Card Type, default: Details\n\t\t */\n\t\tcardType?: CardType;\n\t}\n\n\texport type InputBoxInputType = 'color' | 'date' | 'datetime-local' | 'email' | 'month' | 'number' | 'password' | 'range' | 'search' | 'text' | 'time' | 'url' | 'week';\n\n\texport interface ComponentProperties {\n\t\theight?: number | string;\n\t\twidth?: number | string;\n\t\t/**\n\t\t * The position CSS property. Empty by default.\n\t\t * This is particularly useful if laying out components inside a FlexContainer and\n\t\t * the size of the component is meant to be a fixed size. In this case the position must be\n\t\t * set to 'absolute', with the parent FlexContainer having 'relative' position.\n\t\t * Without this the component will fail to correctly size itself\n\t\t */\n\t\tposition?: string;\n\t\t/**\n\t\t * Matches the CSS style key and its available values.\n\t\t */\n\t\tCSSStyles?: { [key: string]: string };\n\t}\n\n\texport interface ComponentWithIcon {\n\t\ticonPath?: string | vscode.Uri | { light: string | vscode.Uri; dark: string | vscode.Uri };\n\t\ticonHeight?: number | string;\n\t\ticonWidth?: number | string;\n\t}\n\n\texport interface InputBoxProperties extends ComponentProperties {\n\t\tvalue?: string;\n\t\tariaLabel?: string;\n\t\tplaceHolder?: string;\n\t\tinputType?: InputBoxInputType;\n\t\trequired?: boolean;\n\t\tmultiline?: boolean;\n\t\trows?: number;\n\t\tcolumns?: number;\n\t\tmin?: number;\n\t\tmax?: number;\n\t}\n\n\texport interface TableColumn {\n\t\tvalue: string;\n\t\twidth?: number;\n\t\tcssClass?: string;\n\t\theaderCssClass?: string;\n\t\ttoolTip?: string;\n\t\ttype?: ColumnType;\n\t\toptions?: CheckboxColumnOption | TextColumnOption;\n\t}\n\n\texport enum ColumnType {\n\t\ttext = 0,\n\t\tcheckBox = 1,\n\t\tbutton = 2,\n\t}\n\n\texport interface CheckboxColumnOption {\n\t\tactionOnCheckbox: ActionOnCellCheckboxCheck;\n\t}\n\n\texport interface TextColumnOption {\n\t}\n\n\texport enum ActionOnCellCheckboxCheck {\n\t\tselectRow = 0,\n\t\tcustomAction = 1,\n\t}\n\n\texport interface TableComponentProperties extends ComponentProperties {\n\t\tdata: any[][];\n\t\tcolumns: string[] | TableColumn[];\n\t\tfontSize?: number | string;\n\t\tselectedRows?: number[];\n\t}\n\n\texport interface FileBrowserTreeProperties extends ComponentProperties {\n\t\townerUri: string;\n\t}\n\n\texport interface CheckBoxProperties {\n\t\tchecked?: boolean;\n\t\tlabel?: string;\n\t}\n\n\texport interface TreeProperties extends ComponentProperties {\n\t\twithCheckbox?: boolean;\n\t}\n\n\texport enum DeclarativeDataType {\n\t\tstring = 'string',\n\t\tcategory = 'category',\n\t\tboolean = 'boolean',\n\t\teditableCategory = 'editableCategory',\n\t}\n\n\texport interface RadioButtonProperties {\n\t\tname?: string;\n\t\tlabel?: string;\n\t\tvalue?: string;\n\t\tchecked?: boolean;\n\t}\n\n\texport interface TextComponentProperties {\n\t\tvalue?: string;\n\t\tlinks?: LinkArea[];\n\t\tCSSStyles?: { [key: string]: string };\n\t}\n\n\texport interface LinkArea {\n\t\ttext: string;\n\t\turl: string;\n\t}\n\n\texport interface HyperlinkComponentProperties extends ComponentProperties {\n\t\tlabel: string;\n\t\turl: string;\n\t}\n\n\texport interface DropDownProperties extends ComponentProperties {\n\t\tvalue?: string | CategoryValue;\n\t\tvalues?: string[] | CategoryValue[];\n\t\teditable?: boolean;\n\t\tfireOnTextChange?: boolean;\n\t}\n\n\texport interface DeclarativeTableColumn {\n\t\tdisplayName: string;\n\t\tcategoryValues: CategoryValue[];\n\t\tvalueType: DeclarativeDataType;\n\t\tisReadOnly: boolean;\n\t\twidth: number | string;\n\t}\n\n\texport interface DeclarativeTableProperties {\n\t\tdata: any[][];\n\t\tcolumns: DeclarativeTableColumn[];\n\t}\n\n\texport interface ListBoxProperties {\n\t\tselectedRow?: number;\n\t\tvalues?: string[];\n\n\t}\n\n\texport interface WebViewProperties extends ComponentProperties {\n\t\tmessage?: any;\n\n\t\t/**\n\t\t * Contents of the webview.\n\t\t *\n\t\t * Should be a complete html document.\n\t\t */\n\t\thtml?: string;\n\t\t/**\n\t\t * Content settings for the webview.\n\t\t */\n\t\toptions?: vscode.WebviewOptions;\n\t}\n\n\texport interface DomProperties extends ComponentProperties {\n\t\t/**\n\t\t * Contents of the DOM component.\n\t\t */\n\t\thtml?: string;\n\t}\n\n\t/**\n\t * Editor properties for the editor component\n\t */\n\texport interface EditorProperties extends ComponentProperties {\n\t\t/**\n\t\t * The content inside the text editor\n\t\t */\n\t\tcontent?: string;\n\t\t/**\n\t\t * The languge mode for this text editor. The language mode is SQL by default.\n\t\t */\n\t\tlanguageMode?: string;\n\t\t/**\n\t\t * Minimum height for editor component\n\t\t */\n\t\tminimumHeight?: number;\n\t}\n\n\texport interface ButtonProperties extends ComponentProperties, ComponentWithIcon {\n\t\tlabel?: string;\n\t\tisFile?: boolean;\n\t\tfileContent?: string;\n\t\ttitle?: string;\n\t}\n\n\texport interface LoadingComponentProperties {\n\t\tloading?: boolean;\n\t}\n\n\texport interface DivContainerProperties extends ComponentProperties {\n\t\t/**\n\t\t * Matches the overflow-y CSS property and its available values.\n\t\t */\n\t\toverflowY?: string;\n\n\t\t/**\n\t\t * Setting the scroll based on the y offset\n\t\t * This is used when its child component is webview\n\t\t */\n\t\tyOffsetChange?: number;\n\n\t\t/**\n\t\t * Indicates whether the element is clickable\n\t\t */\n\t\tclickable?: boolean;\n\t}\n\n\texport interface CardComponent extends Component, CardProperties {\n\t\tonDidActionClick: vscode.Event<ActionDescriptor>;\n\t\tonCardSelectedChanged: vscode.Event<any>;\n\t}\n\n\texport interface DomComponent extends Component, DomProperties {\n\n\t}\n\n\texport interface TextComponent extends Component, ComponentProperties {\n\t\tvalue: string;\n\t}\n\n\texport interface HyperlinkComponent extends Component, HyperlinkComponentProperties {\n\t\tlabel: string;\n\t\turl: string;\n\t}\n\n\texport interface InputBoxComponent extends Component, InputBoxProperties {\n\t\tonTextChanged: vscode.Event<any>;\n\t}\n\n\texport interface RadioButtonComponent extends Component, RadioButtonProperties {\n\t\tonDidClick: vscode.Event<any>;\n\t}\n\n\texport interface CheckBoxComponent extends Component {\n\t\tchecked: boolean;\n\t\tlabel: string;\n\t\tonChanged: vscode.Event<any>;\n\t}\n\n\texport interface DropDownComponent extends Component, DropDownProperties {\n\t\tvalue: string | CategoryValue;\n\t\tvalues: string[] | CategoryValue[];\n\t\tonValueChanged: vscode.Event<any>;\n\t}\n\n\texport interface TableCell {\n\t\trow: number;\n\t\tcolumn: number;\n\t\tvalue: any;\n\t}\n\n\texport interface DeclarativeTableComponent extends Component, DeclarativeTableProperties {\n\t\tonDataChanged: vscode.Event<any>;\n\t}\n\n\texport interface ListBoxComponent extends Component, ListBoxProperties {\n\t\tselectedRow?: number;\n\t\tvalues: string[];\n\t\tonRowSelected: vscode.Event<any>;\n\t}\n\n\texport interface ICheckboxCellActionEventArgs extends ICellActionEventArgs {\n\t\tchecked: boolean;\n\t}\n\n\tinterface ICellActionEventArgs {\n\t\trow: number;\n\t\tcolumn: number;\n\t\tcolumnName: number;\n\t}\n\n\texport interface TableComponent extends Component, TableComponentProperties {\n\t\tonRowSelected: vscode.Event<any>;\n\t\tonCellAction?: vscode.Event<ICellActionEventArgs>;\n\t}\n\n\texport interface FileBrowserTreeComponent extends Component, FileBrowserTreeProperties {\n\t\tonDidChange: vscode.Event<any>;\n\t}\n\n\texport interface TreeComponent<T> extends Component, TreeProperties {\n\t\tregisterDataProvider<T>(dataProvider: TreeComponentDataProvider<T>): TreeComponentView<T>;\n\t}\n\n\texport interface WebViewComponent extends Component {\n\t\thtml: string;\n\t\tmessage: any;\n\t\tonMessage: vscode.Event<any>;\n\t\treadonly options: vscode.WebviewOptions;\n\t}\n\n\t/**\n\t * Editor component for displaying the text code editor\n\t */\n\texport interface EditorComponent extends Component {\n\t\t/**\n\t\t * The content inside the text editor\n\t\t */\n\t\tcontent: string;\n\t\t/**\n\t\t * The languge mode for this text editor. The language mode is SQL by default.\n\t\t */\n\t\tlanguageMode: string;\n\t\t/**\n\t\t * The editor Uri which will be used as a reference for VSCode Language Service.\n\t\t * Currently this is auto-generated by the framework but can be queried after\n\t\t * view initialization is completed\n\t\t */\n\t\treadonly editorUri: string;\n\t\t/**\n\t\t * An event called when the editor content is updated\n\t\t */\n\t\treadonly onContentChanged: vscode.Event<any>;\n\n\t\t/**\n\t\t * An event called when the editor is created\n\t\t */\n\t\treadonly onEditorCreated: vscode.Event<any>;\n\n\t\t/**\n\t\t * Toggle for whether the editor should be automatically resized or not\n\t\t */\n\t\tisAutoResizable: boolean;\n\n\t\t/**\n\t\t * Minimum height for editor component\n\t\t */\n\t\tminimumHeight: number;\n\n\t}\n\n\texport interface DiffEditorComponent extends Component {\n\t\t/**\n\t\t * The content inside the left text editor\n\t\t */\n\t\tcontentLeft: string;\n\t\t/**\n\t\t * The content inside the right text editor\n\t\t */\n\t\tcontentRight: string;\n\t\t/**\n\t\t * The languge mode for this text editor. The language mode is SQL by default.\n\t\t */\n\t\tlanguageMode: string;\n\t\t/**\n\t\t * The left editor Uri which will be used as a reference for VSCode Language Service.\n\t\t * Currently this is auto-generated by the framework but can be queried after\n\t\t * view initialization is completed\n\t\t */\n\t\treadonly editorUriLeft: string;\n\t\t/**\n\t\t * The right editor Uri which will be used as a reference for VSCode Language Service.\n\t\t * Currently this is auto-generated by the framework but can be queried after\n\t\t * view initialization is completed\n\t\t */\n\t\treadonly editorUriRight: string;\n\t\t/**\n\t\t * An event called when the editor content is updated\n\t\t */\n\t\treadonly onContentChanged: vscode.Event<any>;\n\n\t\t/**\n\t\t * An event called when the editor is created\n\t\t */\n\t\treadonly onEditorCreated: vscode.Event<any>;\n\n\t\t/**\n\t\t * Toggle for whether the editor should be automatically resized or not\n\t\t */\n\t\tisAutoResizable: boolean;\n\n\t\t/**\n\t\t * Minimum height for editor component\n\t\t */\n\t\tminimumHeight: number;\n\t}\n\n\texport interface ButtonComponent extends Component, ButtonProperties {\n\t\t/**\n\t\t * The label for the button\n\t\t */\n\t\tlabel: string;\n\t\t/**\n\t\t * The title for the button. This title will show when it hovers\n\t\t */\n\t\ttitle: string;\n\t\t/**\n\t\t * Icon Path for the button.\n\t\t */\n\t\ticonPath: string | vscode.Uri | { light: string | vscode.Uri; dark: string | vscode.Uri };\n\n\t\t/**\n\t\t * An event called when the button is clicked\n\t\t */\n\t\tonDidClick: vscode.Event<any>;\n\t}\n\n\texport interface DashboardWidgetComponent extends Component {\n\t\twidgetId: string;\n\t}\n\n\texport interface DashboardWebviewComponent extends Component {\n\t\twebviewId: string;\n\t}\n\n\t/**\n\t * Component used to wrap another component that needs to be loaded, and show a loading spinner\n\t * while the contained component is loading\n\t */\n\texport interface LoadingComponent extends Component {\n\t\t/**\n\t\t * Whether to show the loading spinner instead of the contained component. True by default\n\t\t */\n\t\tloading: boolean;\n\n\t\t/**\n\t\t * The component displayed when the loading property is false\n\t\t */\n\t\tcomponent: Component;\n\t}\n\n\t/**\n\t * A view backed by a model provided by an extension.\n\t * This model contains enough information to lay out the view\n\t */\n\texport interface ModelView {\n\t\t/**\n\t\t * Raised when the view closed.\n\t\t */\n\t\treadonly onClosed: vscode.Event<any>;\n\n\t\t/**\n\t\t * The connection info for the dashboard the webview exists on\n\t\t */\n\t\treadonly connection: connection.Connection;\n\n\t\t/**\n\t\t * The info on the server for the dashboard\n\t\t */\n\t\treadonly serverInfo: ServerInfo;\n\n\t\t/**\n\t\t * The model backing the model-based view\n\t\t */\n\t\treadonly modelBuilder: ModelBuilder;\n\n\t\t/**\n\t\t * Whether or not the model view's root component is valid\n\t\t */\n\t\treadonly valid: boolean;\n\n\t\t/**\n\t\t * Raised when the model view's valid property changes\n\t\t */\n\t\treadonly onValidityChanged: vscode.Event<boolean>;\n\n\t\t/**\n\t\t * Run the model view root component's validations\n\t\t */\n\t\tvalidate(): Thenable<boolean>;\n\n\t\t/**\n\t\t * Initializes the model with a root component definition.\n\t\t * Once this has been done, the components will be laid out in the UI and\n\t\t * can be accessed and altered as needed.\n\t\t */\n\t\tinitializeModel<T extends Component>(root: T): Thenable<void>;\n\t}\n\n\texport namespace ui {\n\t\t/**\n\t\t * Register a provider for a model-view widget\n\t\t */\n\t\texport function registerModelViewProvider(widgetId: string, handler: (view: ModelView) => void): void;\n\t}\n\n\texport namespace window {\n\t\t/**\n\t\t * creates a web view dialog\n\t\t */\n\t\texport function createWebViewDialog(title: string): ModalDialog;\n\n\t\t/**\n\t\t * Create a dialog with the given title\n\t\t * @param title The title of the dialog, displayed at the top\n\t\t * @param isWide Indicates whether the dialog is wide or normal\n\t\t */\n\t\texport function createModelViewDialog(title: string, dialogName?: string, isWide?: boolean): Dialog;\n\n\t\t/**\n\t\t * Create a dialog tab which can be included as part of the content of a dialog\n\t\t * @param title The title of the page, displayed on the tab to select the page\n\t\t */\n\t\texport function createTab(title: string): DialogTab;\n\n\t\t/**\n\t\t * Create a button which can be included in a dialog\n\t\t * @param label The label of the button\n\t\t */\n\t\texport function createButton(label: string): Button;\n\n\t\t/**\n\t\t * Opens the given dialog if it is not already open\n\t\t */\n\t\texport function openDialog(dialog: Dialog): void;\n\n\t\t/**\n\t\t * Closes the given dialog if it is open\n\t\t */\n\t\texport function closeDialog(dialog: Dialog): void;\n\n\t\t/**\n\t\t * Create a wizard page with the given title, for inclusion in a wizard\n\t\t * @param title The title of the page\n\t\t */\n\t\texport function createWizardPage(title: string): WizardPage;\n\n\t\t/**\n\t\t * Create a wizard with the given title and pages\n\t\t * @param title The title of the wizard\n\t\t */\n\t\texport function createWizard(title: string): Wizard;\n\n\t\t/**\n\t\t * Used to control whether a message in a dialog/wizard is displayed as an error,\n\t\t * warning, or informational message. Default is error.\n\t\t */\n\t\texport enum MessageLevel {\n\t\t\tError = 0,\n\t\t\tWarning = 1,\n\t\t\tInformation = 2,\n\t\t}\n\n\t\t/**\n\t\t * A message shown in a dialog. If the level is not set it defaults to error.\n\t\t */\n\t\texport type DialogMessage = {\n\t\t\treadonly text: string,\n\t\t\treadonly description?: string,\n\t\t\treadonly level?: MessageLevel\n\t\t};\n\n\t\texport interface ModelViewPanel {\n\t\t\t/**\n\t\t\t * Register model view content for the dialog.\n\t\t\t * Doesn't do anything if model view is already registered\n\t\t\t */\n\t\t\tregisterContent(handler: (view: ModelView) => Thenable<void>): void;\n\n\t\t\t/**\n\t\t\t * Returns the model view content if registered. Returns undefined if model review is not registered\n\t\t\t */\n\t\t\treadonly modelView: ModelView;\n\n\t\t\t/**\n\t\t\t * Whether the panel's content is valid\n\t\t\t */\n\t\t\treadonly valid: boolean;\n\n\t\t\t/**\n\t\t\t * Fired whenever the panel's valid property changes\n\t\t\t */\n\t\t\treadonly onValidityChanged: vscode.Event<boolean>;\n\t\t}\n\n\t\t// Model view dialog classes\n\t\texport interface Dialog extends ModelViewPanel {\n\t\t\t/**\n\t\t\t * The title of the dialog\n\t\t\t */\n\t\t\ttitle: string;\n\n\t\t\t/**\n\t\t\t * Indicates the width of the dialog\n\t\t\t */\n\t\t\tisWide: boolean;\n\n\t\t\t/**\n\t\t\t * The content of the dialog. If multiple tabs are given they will be displayed with tabs\n\t\t\t * If a string is given, it should be the ID of the dialog's model view content\n\t\t\t */\n\t\t\tcontent: string | DialogTab[];\n\n\t\t\t/**\n\t\t\t * The ok button\n\t\t\t */\n\t\t\tokButton: Button;\n\n\t\t\t/**\n\t\t\t * The cancel button\n\t\t\t */\n\t\t\tcancelButton: Button;\n\n\t\t\t/**\n\t\t\t * Any additional buttons that should be displayed\n\t\t\t */\n\t\t\tcustomButtons: Button[];\n\n\t\t\t/**\n\t\t\t * Set the informational message shown in the dialog. Hidden when the message is\n\t\t\t * undefined or the text is empty or undefined. The default level is error.\n\t\t\t */\n\t\t\tmessage: DialogMessage;\n\n\t\t\t/**\n\t\t\t * Set the dialog name when opening\n\t\t\t * the dialog for telemetry\n\t\t\t */\n\t\t\tdialogName?: string;\n\n\t\t\t/**\n\t\t\t * Register a callback that will be called when the user tries to click done. Only\n\t\t\t * one callback can be registered at once, so each registration call will clear\n\t\t\t * the previous registration.\n\t\t\t * @param validator The callback that gets executed when the user tries to click\n\t\t\t * done. Return true to allow the dialog to close or false to block it from closing\n\t\t\t */\n\t\t\tregisterCloseValidator(validator: () => boolean | Thenable<boolean>): void;\n\n\t\t\t/**\n\t\t\t * Register an operation to run in the background when the dialog is done\n\t\t\t * @param operationInfo Operation Information\n\t\t\t */\n\t\t\tregisterOperation(operationInfo: BackgroundOperationInfo): void;\n\t\t}\n\n\t\texport interface DialogTab extends ModelViewPanel {\n\t\t\t/**\n\t\t\t * The title of the tab\n\t\t\t */\n\t\t\ttitle: string;\n\n\t\t\t/**\n\t\t\t * A string giving the ID of the tab's model view content\n\t\t\t */\n\t\t\tcontent: string;\n\t\t}\n\n\t\texport interface Button {\n\t\t\t/**\n\t\t\t * The label displayed on the button\n\t\t\t */\n\t\t\tlabel: string;\n\n\t\t\t/**\n\t\t\t * Whether the button is enabled\n\t\t\t */\n\t\t\tenabled: boolean;\n\n\t\t\t/**\n\t\t\t * Whether the button is hidden\n\t\t\t */\n\t\t\thidden: boolean;\n\n\t\t\t/**\n\t\t\t * Raised when the button is clicked\n\t\t\t */\n\t\t\treadonly onClick: vscode.Event<void>;\n\t\t}\n\n\t\texport interface WizardPageChangeInfo {\n\t\t\t/**\n\t\t\t * The page number that the wizard changed from\n\t\t\t */\n\t\t\tlastPage: number;\n\n\t\t\t/**\n\t\t\t * The new page number or undefined if the user is closing the wizard\n\t\t\t */\n\t\t\tnewPage: number;\n\t\t}\n\n\t\texport interface WizardPage extends ModelViewPanel {\n\t\t\t/**\n\t\t\t * The title of the page\n\t\t\t */\n\t\t\ttitle: string;\n\n\t\t\t/**\n\t\t\t * A string giving the ID of the page's model view content\n\t\t\t */\n\t\t\tcontent: string;\n\n\t\t\t/**\n\t\t\t * Any additional buttons that should be displayed while the page is open\n\t\t\t */\n\t\t\tcustomButtons: Button[];\n\n\t\t\t/**\n\t\t\t * Whether the page is enabled. If the page is not enabled, the user will not be\n\t\t\t * able to advance to it. Defaults to true.\n\t\t\t */\n\t\t\tenabled: boolean;\n\n\t\t\t/**\n\t\t\t * An optional description for the page. If provided it will be displayed underneath the page title.\n\t\t\t */\n\t\t\tdescription: string;\n\t\t}\n\n\t\texport interface Wizard {\n\t\t\t/**\n\t\t\t * The title of the wizard\n\t\t\t */\n\t\t\ttitle: string;\n\n\t\t\t/**\n\t\t\t * The wizard's pages. Pages can be added/removed while the dialog is open by using\n\t\t\t * the addPage and removePage methods\n\t\t\t */\n\t\t\tpages: WizardPage[];\n\n\t\t\t/**\n\t\t\t * The index in the pages array of the active page, or undefined if the wizard is\n\t\t\t * not currently visible\n\t\t\t */\n\t\t\treadonly currentPage: number;\n\n\t\t\t/**\n\t\t\t * The done button\n\t\t\t */\n\t\t\tdoneButton: Button;\n\n\t\t\t/**\n\t\t\t * The cancel button\n\t\t\t */\n\t\t\tcancelButton: Button;\n\n\t\t\t/**\n\t\t\t * The generate script button\n\t\t\t */\n\t\t\tgenerateScriptButton: Button;\n\n\t\t\t/**\n\t\t\t * The next button\n\t\t\t */\n\t\t\tnextButton: Button;\n\n\t\t\t/**\n\t\t\t * The back button\n\t\t\t */\n\t\t\tbackButton: Button;\n\n\t\t\t/**\n\t\t\t * Any additional buttons that should be displayed for all pages of the dialog. If\n\t\t\t * buttons are needed for specific pages they can be added using the customButtons\n\t\t\t * property on each page.\n\t\t\t */\n\t\t\tcustomButtons: Button[];\n\n\t\t\t/**\n\t\t\t * When set to false page titles and descriptions will not be displayed at the top\n\t\t\t * of each wizard page. The default is true.\n\t\t\t */\n\t\t\tdisplayPageTitles: boolean;\n\n\t\t\t/**\n\t\t\t * Event fired when the wizard's page changes, containing information about the\n\t\t\t * previous page and the new page\n\t\t\t */\n\t\t\tonPageChanged: vscode.Event<WizardPageChangeInfo>;\n\n\t\t\t/**\n\t\t\t * Add a page to the wizard at the given index\n\t\t\t * @param page The page to add\n\t\t\t * @param index The index in the pages array to add the page at, or undefined to\n\t\t\t * add it at the end\n\t\t\t */\n\t\t\taddPage(page: WizardPage, index?: number): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Remove the page at the given index from the wizard\n\t\t\t * @param index The index in the pages array to remove\n\t\t\t */\n\t\t\tremovePage(index: number): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Go to the page at the given index in the pages array.\n\t\t\t * @param index The index of the page to go to\n\t\t\t */\n\t\t\tsetCurrentPage(index: number): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Open the wizard. Does nothing if the wizard is already open.\n\t\t\t */\n\t\t\topen(): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Close the wizard. Does nothing if the wizard is not open.\n\t\t\t */\n\t\t\tclose(): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Register a callback that will be called when the user tries to navigate by\n\t\t\t * changing pages or clicking done. Only one callback can be registered at once, so\n\t\t\t * each registration call will clear the previous registration.\n\t\t\t * @param validator The callback that gets executed when the user tries to\n\t\t\t * navigate. Return true to allow the navigation to proceed, or false to\n\t\t\t * cancel it.\n\t\t\t */\n\t\t\tregisterNavigationValidator(validator: (pageChangeInfo: WizardPageChangeInfo) => boolean | Thenable<boolean>): void;\n\n\t\t\t/**\n\t\t\t * Set the informational message shown in the wizard. Hidden when the message is\n\t\t\t * undefined or the text is empty or undefined. The default level is error.\n\t\t\t */\n\t\t\tmessage: DialogMessage;\n\n\t\t\t/**\n\t\t\t * Register an operation to run in the background when the wizard is done\n\t\t\t * @param operationInfo Operation Information\n\t\t\t */\n\t\t\tregisterOperation(operationInfo: BackgroundOperationInfo): void;\n\t\t}\n\t}\n\n\t/**\n\t * Namespace for interacting with query editor\n\t*/\n\texport namespace queryeditor {\n\t\texport type QueryEvent =\n\t\t\t| 'queryStart'\n\t\t\t| 'queryStop'\n\t\t\t| 'executionPlan'\n\t\t\t| 'visualize';\n\n\t\texport interface QueryEventListener {\n\t\t\tonQueryEvent(type: QueryEvent, document: queryeditor.QueryDocument, args: any): void;\n\t\t}\n\n\t\t// new extensibility interfaces\n\t\texport interface QueryDocument {\n\t\t\tproviderId: string;\n\n\t\t\turi: string;\n\n\t\t\t// set the document's execution options\n\t\t\tsetExecutionOptions(options: Map<string, any>): Thenable<void>;\n\n\t\t\t// tab content is build using the modelview UI builder APIs\n\t\t\t// probably should rename DialogTab class since it is useful outside dialogs\n\t\t\tcreateQueryTab(tab: window.DialogTab): void;\n\t\t}\n\n\t\t/**\n\t\t * Make connection for the query editor\n\t\t * @param fileUri file URI for the query editor\n\t\t * @param connectionId connection ID\n\t\t */\n\t\texport function connect(fileUri: string, connectionId: string): Thenable<void>;\n\n\t\t/**\n\t\t * Run query if it is a query editor and it is already opened.\n\t\t * @param fileUri file URI for the query editor\n\t\t */\n\t\texport function runQuery(fileUri: string, options?: Map<string, string>): void;\n\n\t\t/**\n\t\t * Register a query event listener\n\t\t */\n\t\texport function registerQueryEventListener(listener: queryeditor.QueryEventListener): void;\n\n\t\t/**\n\t\t * Get a QueryDocument object for a file URI\n\t\t */\n\t\texport function getQueryDocument(fileUri: string): Thenable<queryeditor.QueryDocument>;\n\t}\n\n\t/**\n\t * Namespace for interacting with the workspace\n\t */\n\texport namespace workspace {\n\n\t\t/**\n\t\t * Create a new model view editor\n\t\t */\n\t\texport function createModelViewEditor(title: string, options?: ModelViewEditorOptions): ModelViewEditor;\n\n\t\texport interface ModelViewEditor extends window.ModelViewPanel {\n\t\t\t/**\n\t\t\t * `true` if there are unpersisted changes.\n\t\t\t * This is editable to support extensions updating the dirty status.\n\t\t\t */\n\t\t\tisDirty: boolean;\n\n\t\t\t/**\n\t\t\t * Opens the editor\n\t\t\t */\n\t\t\topenEditor(position?: vscode.ViewColumn): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Registers a save handler for this editor. This will be called if [supportsSave](#ModelViewEditorOptions.supportsSave)\n\t\t\t * is set to true and the editor is marked as dirty\n\t\t\t */\n\t\t\tregisterSaveHandler(handler: () => Thenable<boolean>): void;\n\t\t}\n\t}\n\n\texport interface ModelViewEditorOptions {\n\t\t/**\n\t\t * Should the model view editor's context be kept around even when the editor is no longer visible? It is false by default\n\t\t */\n\t\treadonly retainContextWhenHidden?: boolean;\n\n\t\t/**\n\t\t * Does this model view editor support save?\n\t\t */\n\t\treadonly supportsSave?: boolean;\n\n\t\t/**\n\t\t * Resource name for this editor\n\t\t * File icons might depend on file extension, language id or resource name\n\t\t * Resource name field needs to be set explitly if file icon for a particular Model View Editor depends on editor resource name\n\t\t */\n\t\treadonly resourceName?: string;\n\t}\n\n\texport enum DataProviderType {\n\t\tConnectionProvider = 'ConnectionProvider',\n\t\tBackupProvider = 'BackupProvider',\n\t\tRestoreProvider = 'RestoreProvider',\n\t\tScriptingProvider = 'ScriptingProvider',\n\t\tObjectExplorerProvider = 'ObjectExplorerProvider',\n\t\tTaskServicesProvider = 'TaskServicesProvider',\n\t\tFileBrowserProvider = 'FileBrowserProvider',\n\t\tProfilerProvider = 'ProfilerProvider',\n\t\tMetadataProvider = 'MetadataProvider',\n\t\tQueryProvider = 'QueryProvider',\n\t\tAdminServicesProvider = 'AdminServicesProvider',\n\t\tAgentServicesProvider = 'AgentServicesProvider',\n\t\tCapabilitiesProvider = 'CapabilitiesProvider',\n\t\tDacFxServicesProvider = 'DacFxServicesProvider',\n\t\tSchemaCompareServicesProvider = 'SchemaCompareServicesProvider',\n\t\tObjectExplorerNodeProvider = 'ObjectExplorerNodeProvider',\n\t\tIconProvider = 'IconProvider',\n\t}\n\n\texport namespace dataprotocol {\n\t\t/**\n\t\t * Get the provider corresponding to the given provider ID and type\n\t\t * @param providerId The ID that the provider was registered with\n\t\t * @param providerType The type of the provider\n\t\t */\n\t\texport function getProvider<T extends DataProvider>(providerId: string, providerType: DataProviderType): T;\n\n\t\t/**\n\t\t * Get all registered providers of the given type\n\t\t * @param providerType The type of the providers\n\t\t */\n\t\texport function getProvidersByType<T extends DataProvider>(providerType: DataProviderType): T[];\n\t}\n\n\n\t/**\n\t * Context object passed as an argument to command callbacks.\n\t * Defines properties that can be sent for any connected context,\n\t * whether that is the Object Explorer context menu or a command line\n\t * startup argument.\n\t */\n\n\texport interface ConnectedContext {\n\t\t/**\n\t\t * The connection information for the selected object.\n\t\t * Note that the connection is not guaranteed to be in a connected\n\t\t * state on click.\n\t\t */\n\t\tconnectionProfile: IConnectionProfile;\n\t}\n\n\t/**\n\t * Context object passed as an argument to command callbacks.\n\t * Defines the key properties required to identify a node in the object\n\t * explorer tree and take action against it.\n\t */\n\texport interface ObjectExplorerContext extends ConnectedContext {\n\n\t\t/**\n\t\t * Defines whether this is a Connection-level object.\n\t\t * If not, the object is expected to be a child object underneath\n\t\t * one of the connections.\n\t\t */\n\t\tisConnectionNode: boolean;\n\t\t/**\n\t\t * Node info for objects below a specific connection. This\n\t\t * may be null for a Connection-level object\n\t\t */\n\t\tnodeInfo: NodeInfo;\n\t}\n\n\t/**\n\t * Background Operation\n\t */\n\texport interface BackgroundOperation {\n\t\t/**\n\t\t * Updates the operation status or adds progress message\n\t\t * @param status Operation Status\n\t\t * @param message Progress message\n\t\t */\n\t\tupdateStatus(status: TaskStatus, message?: string): void;\n\n\t\t/**\n\t\t * Operation Id\n\t\t */\n\t\tid: string;\n\n\t\t/**\n\t\t * Event raised when operation is canceled in UI\n\t\t */\n\t\tonCanceled: vscode.Event<void>;\n\t}\n\n\t/**\n\t * Operation Information\n\t */\n\texport interface BackgroundOperationInfo {\n\n\t\t/**\n\t\t * The operation id. A unique id will be assigned to it If not specified a\n\t\t */\n\t\toperationId?: string;\n\t\t/**\n\t\t * Connection information\n\t\t */\n\t\tconnection?: connection.Connection;\n\n\t\t/**\n\t\t * Operation Display Name\n\t\t */\n\t\tdisplayName: string;\n\n\t\t/**\n\t\t * Operation Description\n\t\t */\n\t\tdescription: string;\n\n\t\t/**\n\t\t * True if the operation is cancelable\n\t\t */\n\t\tisCancelable: boolean;\n\n\t\t/**\n\t\t * The actual operation to execute\n\t\t */\n\t\toperation: (operation: BackgroundOperation) => void;\n\t}\n\n\tnamespace tasks {\n\t\t/**\n\t\t* Starts an operation to run in the background\n\t\t* @param operationInfo Operation Information\n\t\t*/\n\t\texport function startBackgroundOperation(operationInfo: BackgroundOperationInfo): void;\n\n\t}\n\n\texport interface ConnectionResult {\n\t\tconnected: boolean;\n\t\tconnectionId: string;\n\t\terrorMessage: string;\n\t\terrorCode: number;\n\t}\n\n\texport namespace connection {\n\t\t/**\n\t\t * List the databases that can be accessed from the given connection\n\t\t * @param connectionId The ID of the connection\n\t\t * @returns An list of names of databases\n\t\t */\n\t\texport function listDatabases(connectionId: string): Thenable<string[]>;\n\n\t\t/**\n\t\t * Get a URI corresponding to the given connection so that it can be used with data\n\t\t * providers and other APIs that require a connection API.\n\t\t * Note: If the given connection corresponds to multiple URIs this may return any of them\n\t\t * @param connectionId The ID of the connection\n\t\t */\n\t\texport function getUriForConnection(connectionId: string): Thenable<string>;\n\n\t\t/**\n\t\t * Opens the connection dialog, calls the callback with the result. If connection was successful\n\t\t * returns the connection otherwise returns undefined\n\t\t */\n\t\texport function openConnectionDialog(providers?: string[], initialConnectionProfile?: IConnectionProfile, connectionCompletionOptions?: IConnectionCompletionOptions): Thenable<connection.Connection>;\n\n\t\t/**\n\t\t * Opens the connection and add it to object explorer and opens the dashboard and returns the ConnectionResult\n\t\t * @param connectionProfile connection profile\n\t\t */\n\t\texport function connect(connectionProfile: IConnectionProfile, saveConnection?: boolean, showDashboard?: boolean): Thenable<ConnectionResult>;\n\t}\n\n\texport namespace nb {\n\t\t/**\n\t\t * All notebook documents currently known to the system.\n\t\t */\n\t\texport let notebookDocuments: NotebookDocument[];\n\n\t\t/**\n\t\t * The currently active Notebook editor or `undefined`. The active editor is the one\n\t\t * that currently has focus or, when none has focus, the one that has changed\n\t\t * input most recently.\n\t\t */\n\t\texport let activeNotebookEditor: NotebookEditor | undefined;\n\n\t\t/**\n\t\t * The currently visible editors or an empty array.\n\t\t */\n\t\texport let visibleNotebookEditors: NotebookEditor[];\n\n\t\t/**\n\t\t * An event that is emitted when a [notebook document](#NotebookDocument) is opened.\n\t\t *\n\t\t * To add an event listener when a visible text document is opened, use the [TextEditor](#TextEditor) events in the\n\t\t * [window](#window) namespace. Note that:\n\t\t *\n\t\t * - The event is emitted before the [document](#NotebookDocument) is updated in the\n\t\t * [active notebook editor](#nb.activeNotebookEditor)\n\t\t * - When a [notebook document](#NotebookDocument) is already open (e.g.: open in another visible notebook editor) this event is not emitted\n\t\t *\n\t\t */\n\t\texport const onDidOpenNotebookDocument: vscode.Event<NotebookDocument>;\n\n\t\t/**\n\t\t * An event that is emitted when a [notebook's](#NotebookDocument) cell contents are changed.\n\t\t */\n\t\texport const onDidChangeNotebookCell: vscode.Event<NotebookCellChangeEvent>;\n\n\t\t/**\n\t\t * Show the given document in a notebook editor. A [column](#ViewColumn) can be provided\n\t\t * to control where the editor is being shown. Might change the [active editor](#nb.activeNotebookEditor).\n\t\t *\n\t\t * The document is denoted by an [uri](#Uri). Depending on the [scheme](#Uri.scheme) the\n\t\t * following rules apply:\n\t\t * `file`-scheme: Open a file on disk, will be rejected if the file does not exist or cannot be loaded.\n\t\t * `untitled`-scheme: A new file that should be saved on disk, e.g. `untitled:c:\\frodo\\new.js`. The language\n\t\t * will be derived from the file name.\n\t\t * For all other schemes the registered notebook providers are consulted.\n\t\t *\n\t\t * @param document A document to be shown.\n\t\t * @param column A view column in which the [editor](#NotebookEditor) should be shown. The default is the [active](#ViewColumn.Active), other values\n\t\t * are adjusted to be `Min(column, columnCount + 1)`, the [active](#ViewColumn.Active)-column is not adjusted. Use [`ViewColumn.Beside`](#ViewColumn.Beside)\n\t\t * to open the editor to the side of the currently active one.\n\t\t * @param preserveFocus When `true` the editor will not take focus.\n\t\t * @return A promise that resolves to a [notebook editor](#NotebookEditor).\n\t\t */\n\t\texport function showNotebookDocument(uri: vscode.Uri, showOptions?: NotebookShowOptions): Thenable<NotebookEditor>;\n\n\t\texport interface NotebookDocument {\n\t\t\t/**\n\t\t\t * The associated uri for this notebook document.\n\t\t\t *\n\t\t\t * *Note* that most documents use the `file`-scheme, which means they are files on disk. However, **not** all documents are\n\t\t\t * saved on disk and therefore the `scheme` must be checked before trying to access the underlying file or siblings on disk.\n\t\t\t *\n\t\t\t */\n\t\t\treadonly uri: vscode.Uri;\n\n\t\t\t/**\n\t\t\t * The file system path of the associated resource. Shorthand\n\t\t\t * notation for [TextDocument.uri.fsPath](#TextDocument.uri). Independent of the uri scheme.\n\t\t\t */\n\t\t\treadonly fileName: string;\n\n\t\t\t/**\n\t\t\t * Is this document representing an untitled file which has never been saved yet. *Note* that\n\t\t\t * this does not mean the document will be saved to disk, use [`uri.scheme`](#Uri.scheme)\n\t\t\t * to figure out where a document will be [saved](#FileSystemProvider), e.g. `file`, `ftp` etc.\n\t\t\t */\n\t\t\treadonly isUntitled: boolean;\n\n\t\t\t/**\n\t\t\t * The identifier of the Notebook provider associated with this document.\n\t\t\t */\n\t\t\treadonly providerId: string;\n\n\t\t\t/**\n\t\t\t * `true` if there are unpersisted changes.\n\t\t\t */\n\t\t\treadonly isDirty: boolean;\n\t\t\t/**\n\t\t\t * `true` if the document have been closed. A closed document isn't synchronized anymore\n\t\t\t * and won't be re-used when the same resource is opened again.\n\t\t\t */\n\t\t\treadonly isClosed: boolean;\n\n\t\t\t/**\n\t\t\t * All cells.\n\t\t\t */\n\t\t\treadonly cells: NotebookCell[];\n\n\t\t\t/**\n\t\t\t * The spec for current kernel, if applicable. This will be undefined\n\t\t\t * until a kernel has been started\n\t\t\t */\n\t\t\treadonly kernelSpec: IKernelSpec;\n\n\t\t\t/**\n\t\t\t * Save the underlying file.\n\t\t\t *\n\t\t\t * @return A promise that will resolve to true when the file\n\t\t\t * has been saved. If the file was not dirty or the save failed,\n\t\t\t * will return false.\n\t\t\t */\n\t\t\tsave(): Thenable<boolean>;\n\n\t\t\t/**\n\t\t\t * Ensure a cell range is completely contained in this document.\n\t\t\t *\n\t\t\t * @param range A cell range.\n\t\t\t * @return The given range or a new, adjusted range.\n\t\t\t */\n\t\t\tvalidateCellRange(range: CellRange): CellRange;\n\t\t}\n\n\t\t/**\n\t\t * A cell range represents an ordered pair of two positions in a list of cells.\n\t\t * It is guaranteed that [start](#CellRange.start).isBeforeOrEqual([end](#CellRange.end))\n\t\t *\n\t\t * CellRange objects are __immutable__.\n\t\t */\n\t\texport class CellRange {\n\n\t\t    /**\n\t\t\t * The start index. It is before or equal to [end](#CellRange.end).\n\t\t\t */\n\t\t    readonly start: number;\n\n\t\t    /**\n\t\t\t * The end index. It is after or equal to [start](#CellRange.start).\n\t\t\t */\n\t\t    readonly end: number;\n\n\t\t    /**\n\t\t\t * Create a new range from two positions. If `start` is not\n\t\t\t * before or equal to `end`, the values will be swapped.\n\t\t\t *\n\t\t\t * @param start A number.\n\t\t\t * @param end A number.\n\t\t\t */\n\t\t    constructor(start: number, end: number);\n\t\t}\n\n\t\texport interface NotebookEditor {\n\t\t\t/**\n\t\t\t * The document associated with this editor. The document will be the same for the entire lifetime of this editor.\n\t\t\t */\n\t\t\treadonly document: NotebookDocument;\n\t\t\t/**\n\t\t\t * The column in which this editor shows. Will be `undefined` in case this\n\t\t\t * isn't one of the main editors, e.g an embedded editor, or when the editor\n\t\t\t * column is larger than three.\n\t\t\t */\n\t\t\tviewColumn?: vscode.ViewColumn;\n\n\t\t\t/**\n\t\t\t * Perform an edit on the document associated with this notebook editor.\n\t\t\t *\n\t\t\t * The given callback-function is invoked with an [edit-builder](#NotebookEditorEdit) which must\n\t\t\t * be used to make edits. Note that the edit-builder is only valid while the\n\t\t\t * callback executes.\n\t\t\t *\n\t\t\t * @param callback A function which can create edits using an [edit-builder](#NotebookEditorEdit).\n\t\t\t * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit.\n\t\t\t * @return A promise that resolves with a value indicating if the edits could be applied.\n\t\t\t */\n\t\t\tedit(callback: (editBuilder: NotebookEditorEdit) => void, options?: { undoStopBefore: boolean; undoStopAfter: boolean; }): Thenable<boolean>;\n\n\t\t\t/**\n\t\t\t * Kicks off execution of a cell. Thenable will resolve only once the full execution is completed.\n\t\t\t *\n\t\t\t *\n\t\t\t * @param cell An optional cell in this notebook which should be executed. If no cell is defined, it will run the active cell instead\n\t\t\t * @return A promise that resolves with a value indicating if the cell was run or not.\n\t\t\t */\n\t\t\trunCell(cell?: NotebookCell): Thenable<boolean>;\n\n\t\t\t/**\n\t\t\t * Kicks off execution of all code cells. Thenable will resolve only when full execution of all cells is completed.\n\t\t\t */\n\t\t\trunAllCells(): Thenable<boolean>;\n\n\t\t\t/** Clears the outputs of all code cells in a Notebook\n\t\t\t* @return A promise that resolves with a value indicating if the outputs are cleared or not.\n\t\t\t*/\n\t\t\tclearAllOutputs(): Thenable<boolean>;\n\n\t\t\t/**\n\t\t\t * Changes the Notebook's kernel. Thenable will resolve only after kernel change is complete.\n\t\t\t */\n\t\t\tchangeKernel(kernel: IKernelSpec): Thenable<boolean>;\n\t\t}\n\n\t\texport interface NotebookCell {\n\t\t\tcontents: ICellContents;\n\t\t\turi?: vscode.Uri;\n\t\t}\n\n\t\texport interface NotebookShowOptions {\n\t\t\t/**\n\t\t\t * An optional view column in which the [editor](#NotebookEditor) should be shown.\n\t\t\t * The default is the [active](#ViewColumn.Active), other values are adjusted to\n\t\t\t * be `Min(column, columnCount + 1)`, the [active](#ViewColumn.Active)-column is\n\t\t\t * not adjusted. Use [`ViewColumn.Beside`](#ViewColumn.Beside) to open the\n\t\t\t * editor to the side of the currently active one.\n\t\t\t */\n\t\t\tviewColumn?: vscode.ViewColumn;\n\n\t\t\t/**\n\t\t\t * An optional flag that when `true` will stop the [editor](#NotebookEditor) from taking focus.\n\t\t\t */\n\t\t\tpreserveFocus?: boolean;\n\n\t\t\t/**\n\t\t\t * An optional flag that controls if an [editor](#NotebookEditor)-tab will be replaced\n\t\t\t * with the next editor or if it will be kept.\n\t\t\t */\n\t\t\tpreview?: boolean;\n\n\t\t\t/**\n\t\t\t * An optional string indicating which notebook provider to initially use\n\t\t\t */\n\t\t\tproviderId?: string;\n\n\t\t\t/**\n\t\t\t * Optional profile indicating the initial connection to use for this editor\n\t\t\t */\n\t\t\tconnectionProfile?: IConnectionProfile;\n\n\t\t\t/**\n\t\t\t * Default kernel for notebook\n\t\t\t */\n\t\t\tdefaultKernel?: nb.IKernelSpec;\n\n\t\t\t/**\n\t\t\t * Optional content used to give an initial notebook state\n\t\t\t */\n\t\t\tinitialContent?: nb.INotebookContents | string;\n\t\t}\n\n\t\t/**\n\t\t * Represents an event describing the change in a [notebook documents's cells](#NotebookDocument.cells).\n\t\t */\n\t\texport interface NotebookCellChangeEvent {\n\t\t\t/**\n\t\t\t * The [notebook document](#NotebookDocument) for which the selections have changed.\n\t\t\t */\n\t\t\tnotebook: NotebookDocument;\n\t\t\t/**\n\t\t\t * The new value for the [notebook documents's cells](#NotebookDocument.cells).\n\t\t\t */\n\t\t\tcells: NotebookCell[];\n\t\t\t/**\n\t\t\t * The [change kind](#NotebookChangeKind) which has triggered this\n\t\t\t * event. Can be `undefined`.\n\t\t\t */\n\t\t\tkind?: NotebookChangeKind;\n\t\t}\n\n\t\texport enum NotebookChangeKind {\n\t\t\tContentUpdated = 0,\n\t\t\tMetadataUpdated = 1,\n\t\t\tSave = 2,\n\t\t\tCellExecuted = 3,\n\t\t}\n\n\t\t/**\n\t\t * A complex edit that will be applied in one transaction on a TextEditor.\n\t\t * This holds a description of the edits and if the edits are valid (i.e. no overlapping regions, document was not changed in the meantime, etc.)\n\t\t * they can be applied on a [document](#TextDocument) associated with a [text editor](#TextEditor).\n\t\t *\n\t\t */\n\t\texport interface NotebookEditorEdit {\n\t\t\t/**\n\t\t\t * Replace a cell range with a new cell.\n\t\t\t *\n\t\t\t * @param location The range this operation should remove.\n\t\t\t * @param value The new cell this operation should insert after removing `location`.\n\t\t\t */\n\t\t\treplace(location: number | CellRange, value: ICellContents): void;\n\n\t\t\t/**\n\t\t\t * Insert a cell (optionally) at a specific index. Any index outside of the length of the cells\n\t\t\t * will result in the cell being added at the end.\n\t\t\t *\n\t\t\t * @param index The position where the new text should be inserted.\n\t\t\t * @param value The new text this operation should insert.\n\t\t\t */\n\t\t\tinsertCell(value: ICellContents, index?: number): void;\n\n\t\t\t/**\n\t\t\t * Delete a certain cell.\n\t\t\t *\n\t\t\t * @param index The index of the cell to remove.\n\t\t\t */\n\t\t\tdeleteCell(index: number): void;\n\t\t}\n\n\t\t/**\n\t\t * Register a notebook provider. The supported file types handled by this\n\t\t * provider are defined in the `package.json:\n\t\t * ```json\n\t\t* {\n\t\t* \t\"contributes\": {\n\t\t* \t\t\"notebook.providers\": [{\n\t\t* \t\t\t\"provider\": \"providername\",\n\t\t* \t\t\t\"fileExtensions\": [\"FILEEXT\"]\n\t\t* \t\t}]\n\t\t* \t}\n\t\t* }\n\t\t* ```\n\t\t * @export\n\t\t * @param {NotebookProvider} provider\n\t\t * @returns {vscode.Disposable}\n\t\t */\n\t\texport function registerNotebookProvider(provider: NotebookProvider): vscode.Disposable;\n\n\t\texport interface IStandardKernel {\n\t\t\treadonly name: string;\n\t\t\treadonly displayName: string;\n\t\t\treadonly connectionProviderIds: string[];\n\t\t}\n\n\t\texport interface NotebookProvider {\n\t\t\treadonly providerId: string;\n\t\t\treadonly standardKernels: IStandardKernel[];\n\t\t\tgetNotebookManager(notebookUri: vscode.Uri): Thenable<NotebookManager>;\n\t\t\thandleNotebookClosed(notebookUri: vscode.Uri): void;\n\t\t}\n\n\t\texport interface NotebookManager {\n\t\t\t/**\n\t\t\t * Manages reading and writing contents to/from files.\n\t\t\t * Files may be local or remote, with this manager giving them a chance to convert and migrate\n\t\t\t * from specific notebook file types to and from a standard type for this UI\n\t\t\t */\n\t\t\treadonly contentManager: ContentManager;\n\t\t\t/**\n\t\t\t * A SessionManager that handles starting, stopping and handling notifications around sessions.\n\t\t\t * Each notebook has 1 session associated with it, and the session is responsible\n\t\t\t * for kernel management\n\t\t\t */\n\t\t\treadonly sessionManager: SessionManager;\n\t\t\t/**\n\t\t\t * (Optional) ServerManager to handle server lifetime management operations.\n\t\t\t * Depending on the implementation this may not be needed.\n\t\t\t */\n\t\t\treadonly serverManager?: ServerManager;\n\t\t}\n\n\t\t/**\n\t\t * Defines the contracts needed to manage the lifetime of a notebook server.\n\t\t */\n\t\texport interface ServerManager {\n\t\t\t/**\n\t\t\t * Indicates if the server is started at the current time\n\t\t\t */\n\t\t\treadonly isStarted: boolean;\n\n\t\t\t/**\n\t\t\t * Event sent when the server has started. This can be used to query\n\t\t\t * the manager for server settings\n\t\t\t */\n\t\t\treadonly onServerStarted: vscode.Event<void>;\n\n\t\t\t/**\n\t\t\t * Starts the server. Some server types may not support or require this.\n\t\t\t * Should no-op if server is already started\n\t\t\t */\n\t\t\tstartServer(): Thenable<void>;\n\n\t\t\t/**\n\t\t\t * Stops the server. Some server types may not support or require this\n\t\t\t */\n\t\t\tstopServer(): Thenable<void>;\n\t\t}\n\n\t\t//#region Content APIs\n\t\t/**\n\t\t * Handles interacting with file and folder contents\n\t\t */\n\t\texport interface ContentManager {\n\t\t\t/* Reads contents from a Uri representing a local or remote notebook and returns a\n\t\t\t * JSON object containing the cells and metadata about the notebook\n\t\t\t */\n\t\t\tgetNotebookContents(notebookUri: vscode.Uri): Thenable<INotebookContents>;\n\n\t\t\t/**\n\t\t\t * Save a file.\n\t\t\t *\n\t\t\t * @param notebookUri - The desired file path.\n\t\t\t *\n\t\t\t * @param notebook - notebook to be saved.\n\t\t\t *\n\t\t\t * @returns A thenable which resolves with the file content model when the\n\t\t\t *   file is saved.\n\t\t\t */\n\t\t\tsave(notebookUri: vscode.Uri, notebook: INotebookContents): Thenable<INotebookContents>;\n\t\t}\n\n\n\t\t/**\n\t\t * Interface defining the file format contents of a notebook, usually in a serializable\n\t\t * format. This interface does not have any methods for manipulating or interacting\n\t\t * with a notebook object.\n\t\t *\n\t\t */\n\t\texport interface INotebookContents {\n\n\t\t\treadonly cells: ICellContents[];\n\t\t\treadonly metadata: INotebookMetadata;\n\t\t\treadonly nbformat: number;\n\t\t\treadonly nbformat_minor: number;\n\t\t}\n\n\t\texport interface INotebookMetadata {\n\t\t\tkernelspec: IKernelInfo;\n\t\t\tlanguage_info?: ILanguageInfo;\n\t\t}\n\n\t\texport interface IKernelInfo {\n\t\t\tname: string;\n\t\t\tlanguage?: string;\n\t\t\tdisplay_name?: string;\n\t\t}\n\n\t\texport interface ILanguageInfo {\n\t\t\tname: string;\n\t\t\tversion?: string;\n\t\t\tmimetype?: string;\n\t\t\tcodemirror_mode?: string | ICodeMirrorMode;\n\t\t}\n\n\t\texport interface ICodeMirrorMode {\n\t\t\tname: string;\n\t\t\tversion: string;\n\t\t}\n\n\t\t/**\n\t\t * Interface defining the file format contents of a notebook cell, usually in a serializable\n\t\t * format. This interface does not have any methods for manipulating or interacting\n\t\t * with a cell object.\n\t\t *\n\t\t */\n\t\texport interface ICellContents {\n\t\t\tcell_type: CellType;\n\t\t\tsource: string | string[];\n\t\t\tmetadata?: {\n\t\t\t\tlanguage?: string;\n\t\t\t};\n\t\t\texecution_count?: number;\n\t\t\toutputs?: ICellOutput[];\n\t\t}\n\n\t\texport type CellType = 'code' | 'markdown' | 'raw';\n\n\t\texport interface ICellOutput {\n\t\t\toutput_type: OutputTypeName;\n\t\t}\n\n\t\t/**\n\t\t * An alias for a stream type.\n\t\t */\n\t\texport type StreamType = 'stdout' | 'stderr';\n\n\t\t/**\n\t\t * A multiline string.\n\t\t */\n\t\texport type MultilineString = string | string[];\n\n\t\texport interface IStreamResult extends ICellOutput {\n\t\t\toutput_type: 'stream';\n\t\t\t/**\n\t\t\t * Stream output field defining the stream name, for example stdout\n\t\t\t */\n\t\t\tname: StreamType;\n\t\t\t/**\n\t\t\t * Stream output field defining the multiline stream text\n\t\t\t */\n\t\t\ttext: MultilineString;\n\t\t}\n\t\texport interface IDisplayResult extends ICellOutput {\n\t\t\t/**\n\t\t\t * Mime bundle expected to contain mime type -> contents mappings.\n\t\t\t * This is dynamic and is controlled by kernels, so cannot be more specific\n\t\t\t */\n\t\t\tdata: { [key: string]: any };\n\t\t\t/**\n\t\t\t * Optional metadata, also a mime bundle\n\t\t\t */\n\t\t\tmetadata?: {};\n\t\t}\n\t\texport interface IDisplayData extends IDisplayResult {\n\t\t\toutput_type: 'display_data';\n\t\t}\n\t\texport interface IUpdateDisplayData extends IDisplayResult {\n\t\t\toutput_type: 'update_display_data';\n\t\t}\n\t\texport interface IExecuteResult extends IDisplayResult {\n\t\t\t/**\n\t\t\t * Type of cell output.\n\t\t\t */\n\t\t\toutput_type: 'execute_result';\n\t\t\t/**\n\t\t\t * Number of times the cell was executed\n\t\t\t */\n\t\t\texecution_count: number;\n\t\t}\n\t\texport interface IErrorResult extends ICellOutput {\n\t\t\t/**\n\t\t\t * Type of cell output.\n\t\t\t */\n\t\t\toutput_type: 'error';\n\t\t\t/**\n\t\t\t * Exception name\n\t\t\t */\n\t\t\tename: string;\n\t\t\t/**\n\t\t\t * Exception value\n\t\t\t */\n\t\t\tevalue: string;\n\t\t\t/**\n\t\t\t * Stacktrace equivalent\n\t\t\t */\n\t\t\ttraceback?: string[];\n\t\t}\n\n\t\texport type OutputTypeName =\n\t\t\t| 'execute_result'\n\t\t\t| 'display_data'\n\t\t\t| 'stream'\n\t\t\t| 'error'\n\t\t\t| 'update_display_data';\n\n\t\texport type Output = nb.IDisplayData | nb.IUpdateDisplayData | nb.IExecuteResult | nb.IErrorResult | nb.IStreamResult;\n\n\t\t//#endregion\n\n\t\t//#region Session APIs\n\t\texport interface SessionManager {\n\t\t\t/**\n\t\t\t * Indicates whether the manager is ready.\n\t\t\t */\n\t\t\treadonly isReady: boolean;\n\n\t\t\t/**\n\t\t\t * A Thenable that is fulfilled when the manager is ready.\n\t\t\t */\n\t\t\treadonly ready: Thenable<void>;\n\n\t\t\treadonly specs: IAllKernels | undefined;\n\n\t\t\tstartNew(options: ISessionOptions): Thenable<ISession>;\n\n\t\t\tshutdown(id: string): Thenable<void>;\n\t\t}\n\n\t\texport interface ISession {\n\t\t\t/**\n\t\t\t * Is change of kernels supported for this session?\n\t\t\t */\n\t\t\tcanChangeKernels: boolean;\n\t\t\t/*\n\t\t\t * Unique id of the session.\n\t\t\t */\n\t\t\treadonly id: string;\n\n\t\t\t/**\n\t\t\t * The current path associated with the session.\n\t\t\t */\n\t\t\treadonly path: string;\n\n\t\t\t/**\n\t\t\t * The current name associated with the session.\n\t\t\t */\n\t\t\treadonly name: string;\n\n\t\t\t/**\n\t\t\t * The type of the session.\n\t\t\t */\n\t\t\treadonly type: string;\n\n\t\t\t/**\n\t\t\t * The status indicates if the kernel is healthy, dead, starting, etc.\n\t\t\t */\n\t\t\treadonly status: KernelStatus;\n\n\t\t\t/**\n\t\t\t * The kernel.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * This is a read-only property, and can be altered by [changeKernel].\n\t\t\t */\n\t\t\treadonly kernel: IKernel;\n\n\t\t\t/**\n\t\t\t * Tracks whether the default kernel failed to load\n\t\t\t * This could be for a reason such as the kernel name not being recognized as a valid kernel;\n\t\t\t */\n\t\t\tdefaultKernelLoaded?: boolean;\n\n\t\t\tchangeKernel(kernelInfo: IKernelSpec): Thenable<IKernel>;\n\n\t\t\tconfigureKernel(kernelInfo: IKernelSpec): Thenable<void>;\n\n\t\t\tconfigureConnection(connection: IConnectionProfile): Thenable<void>;\n\t\t}\n\n\t\texport interface ISessionOptions {\n\t\t\t/**\n\t\t\t * The path (not including name) to the session.\n\t\t\t */\n\t\t\tpath: string;\n\t\t\t/**\n\t\t\t * The name of the session.\n\t\t\t */\n\t\t\tname?: string;\n\t\t\t/**\n\t\t\t * The type of the session.\n\t\t\t */\n\t\t\ttype?: string;\n\t\t\t/**\n\t\t\t * The type of kernel (e.g. python3).\n\t\t\t */\n\t\t\tkernelName?: string;\n\t\t\t/**\n\t\t\t * The id of an existing kernel.\n\t\t\t */\n\t\t\tkernelId?: string;\n\t\t}\n\n\t\texport interface IKernel {\n\t\t\treadonly id: string;\n\t\t\treadonly name: string;\n\t\t\treadonly supportsIntellisense: boolean;\n\t\t\treadonly requiresConnection?: boolean;\n\t\t\t/**\n\t\t\t * Test whether the kernel is ready.\n\t\t\t */\n\t\t\treadonly isReady: boolean;\n\n\t\t\t/**\n\t\t\t * A Thenable that is fulfilled when the kernel is ready.\n\t\t\t */\n\t\t\treadonly ready: Thenable<void>;\n\n\t\t\t/**\n\t\t\t * The cached kernel info.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * This value will be null until the kernel is ready.\n\t\t\t */\n\t\t\treadonly info: IInfoReply | null;\n\n\t\t\t/**\n\t\t\t * Gets the full specification for this kernel, which can be serialized to\n\t\t\t * a noteobok file\n\t\t\t */\n\t\t\tgetSpec(): Thenable<IKernelSpec>;\n\n\t\t\t/**\n\t\t\t * Send an `execute_request` message.\n\t\t\t *\n\t\t\t * @param content - The content of the request.\n\t\t\t *\n\t\t\t * @param disposeOnDone - Whether to dispose of the future when done.\n\t\t\t *\n\t\t\t * @returns A kernel future.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * See [Messaging in\n\t\t\t * Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#execute).\n\t\t\t *\n\t\t\t * This method returns a kernel future, rather than a Thenable, since execution may\n\t\t\t * have many response messages (for example, many iopub display messages).\n\t\t\t *\n\t\t\t * Future `onReply` is called with the `execute_reply` content when the\n\t\t\t * shell reply is received and validated.\n\t\t\t *\n\t\t\t * **See also:** [[IExecuteReply]]\n\t\t\t */\n\t\t\trequestExecute(content: IExecuteRequest, disposeOnDone?: boolean): IFuture;\n\n\n\t\t\t/**\n\t\t\t * Send a `complete_request` message.\n\t\t\t *\n\t\t\t * @param content - The content of the request.\n\t\t\t *\n\t\t\t * @returns A Thenable that resolves with the response message.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#completion).\n\t\t\t *\n\t\t\t * Fulfills with the `complete_reply` content when the shell reply is\n\t\t\t * received and validated.\n\t\t\t */\n\t\t\trequestComplete(content: ICompleteRequest): Thenable<ICompleteReplyMsg>;\n\n\t\t\t/**\n\t\t\t * Interrupt a kernel.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * Uses the [Jupyter Notebook API](http://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter/notebook/master/notebook/services/api/api.yaml#!/kernels).\n\t\t\t *\n\t\t\t * The promise is fulfilled on a valid response and rejected otherwise.\n\t\t\t *\n\t\t\t * It is assumed that the API call does not mutate the kernel id or name.\n\t\t\t *\n\t\t\t * The promise will be rejected if the kernel status is `Dead` or if the\n\t\t\t * request fails or the response is invalid.\n\t\t\t */\n\t\t\tinterrupt(): Thenable<void>;\n\t\t}\n\n\t\texport interface IInfoReply {\n\t\t\tprotocol_version: string;\n\t\t\timplementation: string;\n\t\t\timplementation_version: string;\n\t\t\tlanguage_info: ILanguageInfo;\n\t\t\tbanner: string;\n\t\t\thelp_links: {\n\t\t\t\ttext: string;\n\t\t\t\turl: string;\n\t\t\t}[];\n\t\t}\n\n\t\t/**\n\t\t * The contents of a requestExecute message sent to the server.\n\t\t */\n\t\texport interface IExecuteRequest extends IExecuteOptions {\n\t\t\tcode: string;\n\t\t}\n\n\t\t/**\n\t\t * The options used to configure an execute request.\n\t\t */\n\t\texport interface IExecuteOptions {\n\t\t\t/**\n\t\t\t * Whether to execute the code as quietly as possible.\n\t\t\t * The default is `false`.\n\t\t\t */\n\t\t\tsilent?: boolean;\n\n\t\t\t/**\n\t\t\t * Whether to store history of the execution.\n\t\t\t * The default `true` if silent is False.\n\t\t\t * It is forced to  `false ` if silent is `true`.\n\t\t\t */\n\t\t\tstore_history?: boolean;\n\n\t\t\t/**\n\t\t\t * A mapping of names to expressions to be evaluated in the\n\t\t\t * kernel's interactive namespace.\n\t\t\t */\n\t\t\tuser_expressions?: {};\n\n\t\t\t/**\n\t\t\t * Whether to allow stdin requests.\n\t\t\t * The default is `true`.\n\t\t\t */\n\t\t\tallow_stdin?: boolean;\n\n\t\t\t/**\n\t\t\t * Whether to the abort execution queue on an error.\n\t\t\t * The default is `false`.\n\t\t\t */\n\t\t\tstop_on_error?: boolean;\n\t\t}\n\n\t\t/**\n\t\t * The content of a `'complete_request'` message.\n\t\t *\n\t\t * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#completion).\n\t\t *\n\t\t * **See also:** [[ICompleteReply]], [[IKernel.complete]]\n\t\t */\n\t\texport interface ICompleteRequest {\n\t\t\tcode: string;\n\t\t\tcursor_pos: number;\n\t\t}\n\n\t\texport interface ICompletionContent {\n\t\t\tmatches: string[];\n\t\t\tcursor_start: number;\n\t\t\tcursor_end: number;\n\t\t\tmetadata: any;\n\t\t\tstatus: 'ok' | 'error';\n\t\t}\n\t\t/**\n\t\t * A `'complete_reply'` message on the `'stream'` channel.\n\t\t *\n\t\t * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#completion).\n\t\t *\n\t\t * **See also:** [[ICompleteRequest]], [[IKernel.complete]]\n\t\t */\n\t\texport interface ICompleteReplyMsg extends IShellMessage {\n\t\t\tcontent: ICompletionContent;\n\t\t}\n\n\t\t/**\n\t\t * The valid Kernel status states.\n\t\t */\n\t\texport type KernelStatus =\n\t\t\t| 'unknown'\n\t\t\t| 'starting'\n\t\t\t| 'reconnecting'\n\t\t\t| 'idle'\n\t\t\t| 'busy'\n\t\t\t| 'restarting'\n\t\t\t| 'dead'\n\t\t\t| 'connected';\n\n\t\t/**\n\t\t * An arguments object for the kernel changed event.\n\t\t */\n\t\texport interface IKernelChangedArgs {\n\t\t\toldValue: IKernel | null;\n\t\t\tnewValue: IKernel | null;\n\t\t}\n\n\t\t/// -------- JSON objects, and objects primarily intended not to have methods -----------\n\t\texport interface IAllKernels {\n\t\t\tdefaultKernel: string;\n\t\t\tkernels: IKernelSpec[];\n\t\t}\n\t\texport interface IKernelSpec {\n\t\t\tname: string;\n\t\t\tlanguage?: string;\n\t\t\tdisplay_name?: string;\n\t\t}\n\n\t\texport interface MessageHandler<T extends IMessage> {\n\t\t\thandle(message: T): void | Thenable<void>;\n\t\t}\n\n\t\t/**\n\t\t * A Future interface for responses from the kernel.\n\t\t *\n\t\t * When a message is sent to a kernel, a Future is created to handle any\n\t\t * responses that may come from the kernel.\n\t\t */\n\t\texport interface IFuture extends vscode.Disposable {\n\n\t\t\t/**\n\t\t\t * The original outgoing message.\n\t\t\t */\n\t\t\treadonly msg: IMessage;\n\n\t\t\t/**\n\t\t\t * A Thenable that resolves when the future is done.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * The future is done when there are no more responses expected from the\n\t\t\t * kernel.\n\t\t\t *\n\t\t\t * The `done` Thenable resolves to the reply message if there is one,\n\t\t\t * otherwise it resolves to `undefined`.\n\t\t\t */\n\t\t\treadonly done: Thenable<IShellMessage | undefined>;\n\n\t\t\t/**\n\t\t\t * Set the reply handler for the kernel future.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * If the handler returns a Thenable, all kernel message processing pauses\n\t\t\t * until the Thenable is resolved. If there is a reply message, the future\n\t\t\t * `done` Thenable also resolves to the reply message after this handler has\n\t\t\t * been called.\n\t\t\t */\n\t\t\tsetReplyHandler(handler: MessageHandler<IShellMessage>): void;\n\n\t\t\t/**\n\t\t\t * Sets the stdin handler for the kernel future.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * If the handler returns a Thenable, all kernel message processing pauses\n\t\t\t * until the Thenable is resolved.\n\t\t\t */\n\t\t\tsetStdInHandler(handler: MessageHandler<IStdinMessage>): void;\n\n\t\t\t/**\n\t\t\t * Sets the iopub handler for the kernel future.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * If the handler returns a Thenable, all kernel message processing pauses\n\t\t\t * until the Thenable is resolved.\n\t\t\t */\n\t\t\tsetIOPubHandler(handler: MessageHandler<IIOPubMessage>): void;\n\n\t\t\t/**\n\t\t\t * Register hook for IOPub messages.\n\t\t\t *\n\t\t\t * @param hook - The callback invoked for an IOPub message.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * The IOPub hook system allows you to preempt the handlers for IOPub\n\t\t\t * messages handled by the future.\n\t\t\t *\n\t\t\t * The most recently registered hook is run first. A hook can return a\n\t\t\t * boolean or a Thenable to a boolean, in which case all kernel message\n\t\t\t * processing pauses until the Thenable is fulfilled. If a hook return value\n\t\t\t * resolves to false, any later hooks will not run and the function will\n\t\t\t * return a Thenable resolving to false. If a hook throws an error, the error\n\t\t\t * is logged to the console and the next hook is run. If a hook is\n\t\t\t * registered during the hook processing, it will not run until the next\n\t\t\t * message. If a hook is removed during the hook processing, it will be\n\t\t\t * deactivated immediately.\n\t\t\t */\n\t\t\tregisterMessageHook(\n\t\t\t\thook: (msg: IIOPubMessage) => boolean | Thenable<boolean>\n\t\t\t): void;\n\n\t\t\t/**\n\t\t\t * Remove a hook for IOPub messages.\n\t\t\t *\n\t\t\t * @param hook - The hook to remove.\n\t\t\t *\n\t\t\t * #### Notes\n\t\t\t * If a hook is removed during the hook processing, it will be deactivated immediately.\n\t\t\t */\n\t\t\tremoveMessageHook(\n\t\t\t\thook: (msg: IIOPubMessage) => boolean | Thenable<boolean>\n\t\t\t): void;\n\n\t\t\t/**\n\t\t\t * Send an `input_reply` message.\n\t\t\t */\n\t\t\tsendInputReply(content: IInputReply): void;\n\t\t}\n\n\t\texport interface IExecuteReplyMsg extends IShellMessage {\n\t\t\tcontent: IExecuteReply;\n\t\t}\n\n\t\t/**\n\t\t * The content of an `execute-reply` message.\n\t\t *\n\t\t * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#execution-results).\n\t\t */\n\t\texport interface IExecuteReply {\n\t\t\tstatus: 'ok' | 'error' | 'abort';\n\t\t\texecution_count: number | null;\n\t\t}\n\n\t\t/**\n\t\t * The valid channel names.\n\t\t */\n\t\texport type Channel = 'shell' | 'iopub' | 'stdin' | 'execute_reply';\n\n\t\t/**\n\t\t * Kernel message header content.\n\t\t *\n\t\t * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#general-message-format).\n\t\t *\n\t\t * **See also:** [[IMessage]]\n\t\t */\n\t\texport interface IHeader {\n\t\t\tusername: string;\n\t\t\tversion: string;\n\t\t\tsession: string;\n\t\t\tmsg_id: string;\n\t\t\tmsg_type: string;\n\t\t}\n\n\t\t/**\n\t\t * A kernel message\n\t\t */\n\t\texport interface IMessage {\n\t\t\ttype: Channel;\n\t\t\theader: IHeader;\n\t\t\tparent_header: IHeader | {};\n\t\t\tmetadata: {};\n\t\t\tcontent: any;\n\t\t}\n\n\t\t/**\n\t\t * A kernel message on the `'shell'` channel.\n\t\t */\n\t\texport interface IShellMessage extends IMessage {\n\t\t\tchannel: 'shell';\n\t\t}\n\n\t\t/**\n\t\t * A kernel message on the `'iopub'` channel.\n\t\t */\n\t\texport interface IIOPubMessage extends IMessage {\n\t\t\tchannel: 'iopub';\n\t\t}\n\n\t\t/**\n\t\t * A kernel message on the `'stdin'` channel.\n\t\t */\n\t\texport interface IStdinMessage extends IMessage {\n\t\t\tchannel: 'stdin';\n\t\t\tcontent: {\n\t\t\t\tprompt: string;\n\t\t\t\tpassword: boolean;\n\t\t\t};\n\t\t}\n\n\t\t/**\n\t\t * The content of an `'input_reply'` message.\n\t\t */\n\t\texport interface IInputReply {\n\t\t\tvalue: string;\n\t\t}\n\n\t\t//#endregion\n\n\t}\n}\n"
  },
  {
    "path": "extensions/azdata-sanddance/src/extension.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n'use strict';\n\nimport * as path from 'path';\nimport * as vscode from 'vscode';\nimport * as azdata from 'azdata';\nimport { TextDecoder } from 'util';\nimport { newPanel, WebViewWithUri } from 'common-backend';\nimport { MssqlExtensionApi, IFileNode } from './mssqlapis';\n\nlet current: WebViewWithUri | undefined = undefined;\n\nexport function activate(context: vscode.ExtensionContext) {\n    context.subscriptions.push(\n        vscode.commands.registerCommand('sanddance.view', (commandContext: vscode.Uri | azdata.ObjectExplorerContext) => {\n            if (!commandContext) {\n                vscode.window.showErrorMessage('No file was specified for the View in SandDance command');\n                return;\n            }\n            if (commandContext instanceof vscode.Uri) {\n                viewFileUriInSandDance(<vscode.Uri>commandContext, context);\n            } else if (commandContext.nodeInfo) {\n                // This is a call from the object explorer right-click.\n                downloadAndViewInSandDance(commandContext, context);\n            }\n        },\n        ),\n    );\n\n    //make the visualizer icon visible\n    vscode.commands.executeCommand('setContext', 'showVisualizer', true);\n\n    // Ideally would unregister listener on deactivate, but this is currently a void function.\n    // Issue #6374 created in ADS repository to track this ask\n    azdata.queryeditor.registerQueryEventListener({\n        async onQueryEvent(type: azdata.queryeditor.QueryEvent, document: azdata.queryeditor.QueryDocument, args: any) {\n            if (type === 'visualize') {\n                const providerid = document.providerId;\n                const provider: azdata.QueryProvider = azdata.dataprotocol.getProvider(providerid, azdata.DataProviderType.QueryProvider);\n                const data = await provider.getQueryRows({\n                    ownerUri: document.uri,\n                    batchIndex: args.batchId,\n                    resultSetIndex: args.id,\n                    rowsStartIndex: 0,\n                    rowsCount: args.rowCount,\n                });\n\n                const rows = data.resultSubset.rows;\n                const columns = args.columnInfo;\n                const rowsCount = args.rowCount;\n\n                // Create Json\n                const jsonArray: jsonType[] = [];\n\n                interface jsonType {\n                    [key: string]: any\n                }\n\n                for (let row = 0; row < rowsCount; row++) {\n                    const jsonObject: jsonType = {};\n                    for (let col = 0; col < columns.length; col++) {\n                        if (!rows[row][col].isNull) {\n                            jsonObject[columns[col].columnName] = rows[row][col].displayValue;\n                        }\n                        // If display value is null, don't do anything for now\n                    }\n                    jsonArray.push(jsonObject);\n                }\n\n                viewInSandDance(() => {\n                    return new Promise<string>(resolve => resolve(JSON.stringify(jsonArray)));\n                }, document.uri, 'json', context);\n            }\n        },\n    });\n}\n\nasync function downloadAndViewInSandDance(commandContext: azdata.ObjectExplorerContext, context: vscode.ExtensionContext): Promise<void> {\n    try {\n        const file = await getHdfsFileAsString(commandContext);\n        if (file) {\n            const { contents } = file;\n            viewInSandDance(() => new Promise<string>(resolve => resolve(contents)), file.fsUriPath, path.extname(file.fsUriPath).substring(1), context);\n        }\n    } catch (e) {\n        const error = e as Error;\n        vscode.window.showErrorMessage(`Error viewing in sanddance: ${error.message ? error.message : error}`);\n    }\n}\n\nfunction viewInSandDance(rawTextPromise: () => Thenable<string>, uriFsPath: string, type: string, context: vscode.ExtensionContext, uriTabName?: string | undefined): void {\n    const columnToShowIn = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined;\n    //only allow one SandDance at a time\n    if (current && current.uriFsPath !== uriFsPath) {\n        current.panel.dispose();\n        current = undefined;\n    }\n    if (current) {\n        //TODO: registerWebviewPanelSerializer to hydrate state\n        // If we already have a panel, show it in the target column\n        current.panel.reveal(columnToShowIn);\n    }\n    else {\n        // Otherwise, create a new panel\n        current = newPanel(context, uriFsPath, uriTabName);\n        current.panel.onDidDispose(() => {\n            current = undefined;\n        }, null, context.subscriptions);\n        // Handle messages from the webview\n        current.panel.webview.onDidReceiveMessage(message => {\n            switch (message.command) {\n                case 'getFileContent': {\n                    rawTextPromise().then(rawText => {\n                        if (current && current.panel.visible) {\n                            const dataFile = {\n                                type,\n                                rawText,\n                            };\n                            const compactUI = context.globalState.get('compactUI');\n                            current.panel.webview.postMessage({ command: 'gotFileContent', dataFile, compactUI });\n                        }\n                    });\n                    break;\n                }\n                case 'setCompactUI': {\n                    context.globalState.update('compactUI', message.compactUI);\n                    break;\n                }\n            }\n        }, undefined, context.subscriptions);\n    }\n}\n\nfunction viewFileUriInSandDance(fileUri: vscode.Uri, context: vscode.ExtensionContext, uriTabName?: string | undefined): void {\n    const p = () => new Promise<string>(resolve => {\n        vscode.workspace.fs.readFile(fileUri).then(uint8array => {\n            resolve(new TextDecoder().decode(uint8array));\n        });\n    });\n    viewInSandDance(p, fileUri.fsPath, path.extname(fileUri.fsPath).substring(1), context, uriTabName);\n}\n\nexport async function getHdfsFileAsString(commandContext: azdata.ObjectExplorerContext): Promise<{ contents: string, fsUriPath: string } | undefined> {\n    const extension = vscode.extensions.getExtension('Microsoft.mssql');\n    if (extension) {\n        const extensionApi: MssqlExtensionApi = extension.exports;\n        const browser = extensionApi.getMssqlObjectExplorerBrowser();\n        const node: IFileNode = await browser.getNode<IFileNode>(commandContext);\n        const contents = await node.getFileContentsAsString();\n        if (contents !== undefined) {\n            return {\n                contents,\n                fsUriPath: node.getNodeInfo().label,\n            };\n        }\n    }\n}\n\nexport function deactivate() {\n    vscode.commands.executeCommand('setContext', 'showVisualizer', false);\n}\n"
  },
  {
    "path": "extensions/azdata-sanddance/src/mssqlapis.d.ts",
    "content": "/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the Source EULA. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n// This is the place for extensions to expose APIs.\n\nimport * as azdata from 'azdata';\nimport * as vscode from 'vscode';\n\n/**\n* The APIs provided by Mssql extension\n*\n* @export\n* @interface MssqlExtensionApi\n*/\nexport interface MssqlExtensionApi {\n\t/**\n\t * Gets the object explorer API that supports querying over the connections supported by this extension\n\t *\n\t * @returns {IMssqlObjectExplorerBrowser}\n\t * @memberof IMssqlExtensionApi\n\t */\n\tgetMssqlObjectExplorerBrowser(): MssqlObjectExplorerBrowser;\n}\n\n/**\n * A browser supporting actions over the object explorer connections provided by this extension.\n * Currently this is the\n *\n * @export\n * @interface MssqlObjectExplorerBrowser\n */\nexport interface MssqlObjectExplorerBrowser {\n\t/**\n\t * Gets the matching node given a context object, e.g. one from a right-click on a node in Object Explorer\n\t *\n\t * @param {azdata.ObjectExplorerContext} objectExplorerContext\n\t * @returns {Promise<T>}\n\t */\n\tgetNode<T extends ITreeNode>(objectExplorerContext: azdata.ObjectExplorerContext): Promise<T>;\n}\n\n/**\n * A tree node in the object explorer tree\n *\n * @export\n * @interface ITreeNode\n */\nexport interface ITreeNode {\n\tgetNodeInfo(): azdata.NodeInfo;\n\tgetChildren(refreshChildren: boolean): ITreeNode[] | Promise<ITreeNode[]>;\n}\n\n/**\n * A HDFS file node. This is a leaf node in the object explorer tree, and its contents\n * can be queried\n *\n * @export\n * @interface IFileNode\n * @extends {ITreeNode}\n */\nexport interface IFileNode extends ITreeNode {\n\tgetFileContentsAsString(maxBytes?: number): Promise<string>;\n}\n"
  },
  {
    "path": "extensions/azdata-sanddance/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"moduleResolution\": \"node\",\n        \"target\": \"es6\",\n        \"outDir\": \"dist\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"skipLibCheck\": true,\n        \"sourceMap\": true,\n        \"rootDir\": \"src\",\n        /* Strict Type-Checking Option */\n        \"strict\": true,   /* enable all strict type-checking options */\n        /* Additional Checks */\n        \"noUnusedLocals\": true /* Report errors on unused locals. */\n        // \"noImplicitReturns\": true, /* Report error when not all code paths in function return a value. */\n        // \"noFallthroughCasesInSwitch\": true, /* Report errors for fallthrough cases in switch statement. */\n        // \"noUnusedParameters\": true,  /* Report errors on unused parameters. */\n    },\n    \"exclude\": [\n        \"node_modules\",\n        \".vscode-test\",\n        \"src/ui\",\n        \"resources\"\n    ]\n}"
  },
  {
    "path": "extensions/azdata-sanddance/webpack.config.js",
    "content": "//@ts-check\n\n'use strict';\n\nconst path = require('path');\n\n/**@type {import('webpack').Configuration}*/\nconst config = {\n  target: 'node', // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/\n\n  entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/\n  output: {\n    // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/\n    path: path.resolve(__dirname, 'dist'),\n    filename: 'extension-bundle.js',\n    libraryTarget: 'commonjs2',\n    devtoolModuleFilenameTemplate: '../[resource-path]'\n  },\n  devtool: 'source-map',\n  externals: {\n    azdata: 'azdata',\n    vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/\n  },\n  resolve: {\n    // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader\n    extensions: ['.ts', '.js']\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.ts$/,\n        exclude: /node_modules/,\n        use: [\n          {\n            loader: 'ts-loader'\n          }\n        ]\n      }\n    ]\n  }\n};\nmodule.exports = config;\n"
  },
  {
    "path": "extensions/common-backend/.gitignore",
    "content": "dist\n"
  },
  {
    "path": "extensions/common-backend/package.json",
    "content": "{\n  \"name\": \"common-backend\",\n  \"private\": true,\n  \"version\": \"1.0.0\",\n  \"description\": \"Common backend code for vscode-extension based projects\",\n  \"main\": \"dist/es6/index.js\",\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"build:07\": \"tsc -p .\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Microsoft/SandDance.git\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/Microsoft/SandDance/issues\"\n  },\n  \"homepage\": \"https://github.com/Microsoft/SandDance#readme\"\n}\n"
  },
  {
    "path": "extensions/common-backend/src/html.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as path from 'path';\nimport * as vscode from 'vscode';\n\nexport function getWebviewContent(webView: vscode.Webview, extensionPath: string, fileUriFsPath: string) {\n\n    function resourceUrl(resource: string) {\n        // Get path to resource on disk\n        const onDiskPath = vscode.Uri.file(path.join(extensionPath, 'resources', resource));\n\n        // And get the special URI to use with the webview\n        return webView.asWebviewUri(onDiskPath);\n    }\n\n    return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n    ${link(resourceUrl('app.css'))}\n</head>\n<body>\n    <div id=\"app\"></div>\n    ${script(resourceUrl('vega.js'))}\n    ${script(resourceUrl('react.production.min.js'))}\n    ${script(resourceUrl('react-dom.production.min.js'))}\n    ${script(resourceUrl('fluentui-react.js'))}\n    ${script(resourceUrl('fluentui-icons.js'))}\n    ${script(resourceUrl('sanddance-explorer.js'))}\n    ${script(resourceUrl('app.js'))}\n</body>\n</html>`;\n}\n\nfunction link(href: vscode.Uri) {\n    return `<link rel=\"stylesheet\" type=\"text/css\" href=\"${href}\" />`;\n}\n\nfunction script(src: vscode.Uri) {\n    return `<script src=\"${src}\"></script>`;\n}\n"
  },
  {
    "path": "extensions/common-backend/src/index.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nexport * from './panel';\n"
  },
  {
    "path": "extensions/common-backend/src/panel.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as path from 'path';\nimport * as vscode from 'vscode';\nimport { getWebviewContent } from './html';\n\nexport interface WebViewWithUri {\n    panel: vscode.WebviewPanel;\n    uriFsPath: string;\n}\n\nexport function newPanel(context: vscode.ExtensionContext, uriFsPath: string, uriTabName?: string) {\n    const webViewWithUri: WebViewWithUri = {\n        panel: vscode.window.createWebviewPanel(\n            'sandDance',\n            `SandDance: ${path.basename(uriTabName || uriFsPath)}`,\n            vscode.ViewColumn.One,\n            {\n                enableScripts: true,\n                // Only allow the webview to access resources in our extension's media directory\n                localResourceRoots: [\n                    vscode.Uri.file(path.join(context.extensionPath, 'resources')),\n                ],\n                retainContextWhenHidden: true,\n            },\n        ),\n        uriFsPath,\n    };\n    const webView = webViewWithUri.panel.webview;\n    webViewWithUri.panel.webview.html = getWebviewContent(webView, context.extensionPath, uriFsPath);\n    return webViewWithUri;\n}\n"
  },
  {
    "path": "extensions/common-backend/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"target\": \"es6\",\n        \"outDir\": \"dist/es6\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"skipLibCheck\": true,\n        \"declaration\": true,\n        \"moduleResolution\": \"node\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "extensions/common-frontend/.gitignore",
    "content": "dist\n!src/*.js\n"
  },
  {
    "path": "extensions/common-frontend/package.json",
    "content": "{\n  \"name\": \"common-frontend\",\n  \"private\": true,\n  \"version\": \"1.0.0\",\n  \"description\": \"Common frontend code for vscode-extension based projects\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"build-css\": \"sass ./src/css/app.scss ./dist/app.css\",\n    \"build-ui\": \"tsc -p .\",\n    \"build:07\": \"npm run build-css && npm run build-ui\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Microsoft/SandDance.git\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/Microsoft/SandDance/issues\"\n  },\n  \"homepage\": \"https://github.com/Microsoft/SandDance#readme\"\n}\n"
  },
  {
    "path": "extensions/common-frontend/scripts/resources.js",
    "content": "const path = require('path');\nconst fs = require('fs');\n\nconst resources = [\n    '../common-frontend/dist/app.css',\n    '../common-frontend/dist/app.js',\n    '../../packages/sanddance-explorer/dist/umd/sanddance-explorer.js',\n    '../../node_modules/vega/build/vega.js',\n    '../../node_modules/react/umd/react.production.min.js',\n    '../../node_modules/react-dom/umd/react-dom.production.min.js',\n    '../../node_modules/@fluentui/react/dist/fluentui-react.js',\n    '../../node_modules/@msrvida/fluentui-icons/dist/umd/fluentui-icons.js',\n];\n\nconst errors = [];\nconst resourcesPath = 'resources';\n\nif (!fs.existsSync(resourcesPath)) {\n    fs.mkdirSync(resourcesPath);\n}\n\nresources.forEach(resource => {\n    const dest = path.resolve(resourcesPath, path.basename(resource));\n    if (fs.existsSync(dest)) {\n        fs.unlinkSync(dest);\n    }\n    if (fs.existsSync(resource)) {\n        fs.copyFile(resource, dest, err => errors.push({ err, resource }));\n    } else { \n        errors.push('file does not exist', resource);\n    }\n});\n\nif (errors.length) {\n    console.log(errors);\n    process.exitCode = 1;\n}\n"
  },
  {
    "path": "extensions/common-frontend/src/app.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport SandDance = SandDanceExplorer.SandDance;\nimport VegaMorphCharts = SandDance.VegaMorphCharts;\n\ndeclare let vega: VegaMorphCharts.types.VegaBase;\ndeclare let FluentUIReact: _FluentUI.FluentUIComponents;\ndeclare let FluentUIIcons: _FluentUIIcons.FluentUIIconsBase;\n\nnamespace SandDanceApp {\n    FluentUIIcons.use(FluentUIReact.registerIcons, FluentUIReact.unregisterIcons);\n    FluentUIIcons.initializeIcons();\n    SandDanceExplorer.use(FluentUIReact, React, ReactDOM, vega);\n\n    function getTextcolor() {\n        return getComputedStyle(document.body).color;\n    }\n\n    function getThemePalette(darkTheme: boolean) {\n        const theme = darkTheme ? 'dark-theme' : '';\n        return SandDanceExplorer.themePalettes[theme];\n    }\n\n    function getViewerOptions(darkTheme: boolean) {\n        const color = getTextcolor();\n        const viewerOptions: Partial<SandDanceExplorer.ViewerOptions> = {\n            colors: {\n                ...SandDanceExplorer.getColorSettingsFromThemePalette(getThemePalette(darkTheme)),\n                axisLine: color,\n                axisText: color,\n                hoveredCube: color,\n            },\n        };\n        return viewerOptions;\n    }\n\n    function getVscodeThemeClassName() {\n        const classList = [].slice.apply(document.body.classList) as string[];\n        const prefixed = classList.filter(className => className.indexOf('vscode') === 0);\n        if (prefixed.length) {\n            return prefixed[0];\n        }\n    }\n\n    interface State {\n        compactUI: boolean;\n        darkTheme: boolean;\n    }\n\n    interface Handlers {\n        message: (e: MessageEvent) => void;\n        resize: (e: UIEvent) => void;\n        keyup: (e: KeyboardEvent) => void;\n    }\n\n    const z = 'z'.charCodeAt(0);\n    const Z = 'Z'.charCodeAt(0);\n\n    export class App extends React.Component<{}, State> {\n        private viewerOptions: Partial<SandDance.types.ViewerOptions>;\n        private handlers: Handlers;\n        public explorer: SandDanceExplorer.Explorer_Class;\n        public vscode: VsCode;\n\n        constructor(props: {}) {\n            super(props);\n\n            this.vscode = acquireVsCodeApi();\n\n            this.state = {\n                compactUI: false,\n                darkTheme: null,\n            };\n            this.viewerOptions = getViewerOptions(this.state.darkTheme);\n\n            this.handlers = {\n                message: event => {\n                    // Handle the message inside the webview\n                    const message = event.data as Message;\n\n                    switch (message.command) {\n                        case 'gotFileContent':\n                            if (this.explorer) {\n                                this.explorer.load(message.dataFile);\n                                this.setState({ compactUI: message.compactUI });\n                            }\n\n                            //TODO: hydrate state\n                            break;\n                    }\n                },\n                resize: e => {\n                    this.explorer && this.explorer.resize();\n                },\n                keyup: e => {\n                    //look for CTRL Z or CTRL SHIFT Z\n                    if (e.ctrlKey && (e.keyCode === z || e.keyCode === Z)) {\n                        if (e.shiftKey) {\n                            this.explorer.redo();\n                        } else {\n                            this.explorer.undo();\n                        }\n                    }\n                },\n            };\n        }\n\n        private wireEventHandlers(add: boolean) {\n            for (const key in this.handlers) {\n                if (add) {\n                    window.addEventListener(key, this.handlers[key]);\n                } else {\n                    window.removeEventListener(key, this.handlers[key]);\n                }\n            }\n        }\n\n        checkForDarkTheme() {\n            const vscodeThemeClassName = getVscodeThemeClassName();\n            const darkTheme = vscodeThemeClassName.indexOf('dark') >= 0;\n            this.viewerOptions = getViewerOptions(darkTheme);\n            if (this.state.darkTheme !== darkTheme && this.explorer) {\n                this.explorer.updateViewerOptions(this.viewerOptions);\n                if (this.explorer.viewer) {\n                    this.explorer.viewer.renderSameLayout(this.explorer.viewerOptions);\n                }\n            }\n            FluentUIReact.loadTheme({ palette: getThemePalette(darkTheme) });\n            this.setState({ darkTheme });\n        }\n\n        mounted(explorer: SandDanceExplorer.Explorer_Class) {\n            this.explorer = explorer;\n\n            this.wireEventHandlers(true);\n\n            this.vscode.postMessage({\n                command: 'getFileContent',\n            });\n\n            this.checkForDarkTheme();\n\n            new MutationObserver((mutationRecords) => {\n                this.checkForDarkTheme();\n            }).observe(document.body, { attributeFilter: ['class'] });\n        }\n\n        render() {\n            return (\n                <SandDanceExplorer.Explorer\n                    logoClickUrl=\"https://microsoft.github.io/SandDance/\"\n                    theme={this.state.darkTheme && 'dark-theme'}\n                    viewerOptions={this.viewerOptions}\n                    initialView=\"2d\"\n                    mounted={e => this.mounted(e)}\n                    compactUI={this.state.compactUI}\n                    additionalSettings={[\n                        {\n                            groupLabel: strings.labelPreferences,\n                            children: (\n                                <FluentUIReact.Toggle\n                                    label={strings.labelCompactUI}\n                                    title={strings.labelCompactUIDescription}\n                                    checked={this.state.compactUI}\n                                    onChange={(e, checked?) => {\n                                        this.vscode.postMessage({\n                                            command: 'setCompactUI',\n                                            compactUI: checked,\n                                        });\n                                        this.setState({ compactUI: checked });\n                                    }}\n                                />\n                            ),\n                        },\n                    ]}\n                />\n            );\n        }\n    }\n\n    const app = React.createElement(App);\n    ReactDOM.render(app, document.getElementById('app'));\n}\n"
  },
  {
    "path": "extensions/common-frontend/src/css/app.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nhtml,\nbody {\n    height: 100%;\n    margin: 0;\n}\n\nbody {\n    font-family: 'Segoe UI', sans-serif;\n}\nselect,\nbutton,\ninput {\n    font-family: 'Segoe UI', sans-serif;\n}\n#app {\n    display: grid;\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n}\n\n@import \"../../../../packages/sanddance-explorer/dist/css/sanddance-explorer\";\n"
  },
  {
    "path": "extensions/common-frontend/src/fluentUI-icons.d.ts",
    "content": "import { initializeIcons, use } from '@msrvida/fluentui-icons';\n\nexport interface FluentUIIconsBase {\n    initializeIcons: typeof initializeIcons;\n    use: typeof use;\n}\n\nexport as namespace _FluentUIIcons;\n"
  },
  {
    "path": "extensions/common-frontend/src/fluentUI.d.ts",
    "content": "export { FluentUIComponents } from '../../fluentui-react-cdn-typings';\n\nexport as namespace _FluentUI;\n"
  },
  {
    "path": "extensions/common-frontend/src/interfaces.d.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\ninterface Message {\n    command: string;\n    text?: string;\n    dataFile?: SandDanceExplorer.DataFile;\n    compactUI?: boolean;\n}\n\ninterface VsCode {\n    getState: () => any;\n    postMessage(message: Message);\n    setState: (state: any) => void;\n}\n\ndeclare function acquireVsCodeApi(): VsCode;\n"
  },
  {
    "path": "extensions/common-frontend/src/language.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nnamespace SandDanceApp {\n    export const strings = {\n        labelPreferences: 'Preferences',\n        labelCompactUI: 'Compact UI',\n        labelCompactUIDescription: 'Compact UI hides collapses labels on dropdown menus.',\n    };\n}"
  },
  {
    "path": "extensions/common-frontend/src/sanddance-explorer.d.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport * from '@msrvida/sanddance-explorer';\n\nexport as namespace SandDanceExplorer;\n"
  },
  {
    "path": "extensions/common-frontend/test/sanddance-test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>SandDance test</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../dist/app.css\" />\n    <script>\n        let compactUI = false;\n        function acquireVsCodeApi() {\n            return {\n                postMessage: m => {\n                    if (m && m.command && m.command === 'getFileContent') {\n                        switch (m.command) {\n                            case 'getFileContent': {\n                                self.postMessage({\n                                    command: 'gotFileContent',\n                                    dataFile: sampleData(),\n                                    compactUI\n                                });\n                                break;\n                            }\n                            case 'setCompactUI': {\n                                compactUI = m.compactUI;\n                                break;\n                            }\n                        }\n                    }\n                }\n            };\n        }\n\n        function sampleData() {\n            var data = [];\n            var size = 100;\n            for (var x = 0; x < size; x++) {\n                for (var y = 0; y < size; y++) {\n                    var id = x * y;\n                    var z_1 = Math.random() * size * (x % 10) * (y % 10);\n                    var w = Math.random() * size;\n                    data.push({ id: id, x: x, y: y, z: z_1, w: w });\n                }\n            }\n            return data;\n        }\n    </script>\n</head>\n\n<body class=\"vscode-light\">\n\n    <div id=\"app\"></div>\n\n    <script src=\"../../../node_modules/react/umd/react.production.min.js\"></script>\n    <script src=\"../../../node_modules/react-dom/umd/react-dom.production.min.js\"></script>\n    <script src=\"../../../node_modules/vega/build/vega.js\"></script>\n    <script src=\"../../../node_modules/@fluentui/react/dist/fluentui-react.js\"></script>\n    <script src=\"../../../node_modules/@msrvida/fluentui-icons/dist/umd/fluentui-icons.js\"></script>\n    <script src=\"../../../node_modules/@msrvida/sanddance-explorer/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"../dist/app.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "extensions/common-frontend/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"jsx\": \"react\",\n        \"lib\": [\n            \"dom\",\n            \"es2015\"\n        ],\n        \"skipLibCheck\": true,\n        \"outFile\": \"dist/app.js\"\n    },\n    \"files\": [\n        \"src/fluentUI-icons.d.ts\",\n        \"src/fluentUI.d.ts\",\n        \"src/interfaces.d.ts\",\n        \"src/sanddance-explorer.d.ts\",\n        \"src/language.ts\",\n        \"src/app.tsx\"\n    ]\n}"
  },
  {
    "path": "extensions/vscode-sanddance/.gitattributes",
    "content": "# Set default behavior to automatically normalize line endings.\n* text=auto\n\n"
  },
  {
    "path": "extensions/vscode-sanddance/.gitignore",
    "content": "dist\nnode_modules\n.vscode-test/\n*.vsix\nresources/\n!src/ui/*.js"
  },
  {
    "path": "extensions/vscode-sanddance/.vscode/settings.json",
    "content": "// Place your settings in this file to overwrite default and user settings.\n{\n    \"files.exclude\": {\n        \"out\": false // set this to true to hide the \"out\" folder with the compiled JS files\n    },\n    \"search.exclude\": {\n        \"out\": true // set this to false to include \"out\" folder in search results\n    },\n    // Turn off tsc task auto detection since we have the necessary tasks as npm scripts\n    \"typescript.tsc.autoDetect\": \"off\"\n}"
  },
  {
    "path": "extensions/vscode-sanddance/.vscode/tasks.json",
    "content": "// See https://go.microsoft.com/fwlink/?LinkId=733558\n// for the documentation about the tasks.json format\n{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"type\": \"npm\",\n            \"script\": \"watch\",\n            \"problemMatcher\": \"$tsc-watch\",\n            \"isBackground\": true,\n            \"presentation\": {\n                \"reveal\": \"never\"\n            },\n            \"group\": {\n                \"kind\": \"build\",\n                \"isDefault\": true\n            }\n        }\n    ]\n}"
  },
  {
    "path": "extensions/vscode-sanddance/.vscodeignore",
    "content": "# Exclude parent directories (critical for monorepos)\n../../**\n../**\n\n# Exclude everything first\n**\n\n# Then include only what we want\n!dist/extension-bundle.js\n!resources/\n!resources/**\n!README.md\n!LICENSE\n!CHANGELOG.md\n!sanddance-logo.png\n!package.json\n"
  },
  {
    "path": "extensions/vscode-sanddance/CHANGELOG.md",
    "content": "# Change Log\n\n## [4.2.1]\n- Offline icons\n\n## [4.1.0]\n- Column type editor in Data Browser\n\n## [4.0.3]\n- Added new Vega color schemes\n- Use area squared formula for scatterplot size scaling\n- Use integers for small bin steps\n- Snapshots revive background image\n\n## [4.0.2]\n- Fix z-axis order\n\n## [4.0.1]\n- New 3d engine\n- Transitions tab\n\n## [3.3.0]\n- Show the z axis scale in 3d\n\n## [3.2.0]\n- Fix for last bin of quantitative band scale\n- Support virtual workspaces\n- Declare support for untrusted workspaces\n\n## [3.1.1]\n- Fix for fuzzy text rendering \n\n## [3.1.0]\n- Fix animation final frame \n- Render Unicode character sets \n\n## [3.0.0]\n- (Major version number in sync with core components)\n- Faceting for all chart types\n- Cross faceting\n- Sum aggregation as treemaps or strips\n- Scatterplot size & z-grounding\n- 3D lighting from camera position\n- History undo / redo\n- Snapshot notes\n\n## [1.2.11]\n- Opacity slider (for overlapping cubes)\n- Round numbers in Legend\n\n## [1.2.8]\n- Horizontal bar chart\n- Direct color mapping\n\n## [1.2.7]\n- Sub-pixel rendering\n\n## [1.2.6]\n- Legend title is clickable\n- Legend, Tooltips and Search handle boolean values\n\n## [1.2.5]\n- Axes titles are clickable\n\n## [1.2.4]\n- Vertically constrained tooltips\n\n## [1.2.3]\n- SandDance now has tooltips\n\n## [1.2.1]\n- Updated sanddance-explorer to use chart recommendation heuristics\n\n## [1.2.0]\n- Added chart types: Grid\n- Added search expression grouping\n- Option to hide axes & legend\n- Data does not require a unique identifier column\n\n## [1.1.0]\n- Added chart types: Density & Stacks\n\n## [0.2.5]\n- Added icon\n\n## [0.2.4]\n- Added preview tag to package.json\n\n## [0.2.3]\n- Fixed logo link\n\n## [0.2.2]\n- Added dark theme\n"
  },
  {
    "path": "extensions/vscode-sanddance/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "extensions/vscode-sanddance/README.md",
    "content": "# SandDance for VSCode\n\nVisually explore, understand, and present your data.\n\n![sanddance-animation](https://user-images.githubusercontent.com/11507384/66712891-7d80aa80-ed58-11e9-8b95-d96568c1b240.gif)\n\nBy using easy-to-understand views, SandDance helps you find insights about your data, which in turn help you tell stories supported by data, build cases based on evidence, test hypotheses, dig deeper into surface explanations, support decisions for purchases, or relate data into a wider, real world context.\n\nSandDance uses unit visualizations, which apply a one-to-one mapping between rows in your database and marks on the screen.\nSmooth animated transitions between views help you to maintain context as you interact with your data.\n\n## Usage\n\nRight-click on a .csv or .tsv file and choose *View in SandDance*.\n\n## Known Issues\n\nSee https://github.com/Microsoft/SandDance#known-issues\n\n## Release Notes\n\n### 3.0.0\n\nMajor upgrade to layout engine\n\n### 1.0.0\n\nInitial release of vscode-sanddance\n"
  },
  {
    "path": "extensions/vscode-sanddance/package.json",
    "content": "{\n    \"name\": \"vscode-sanddance\",\n    \"displayName\": \"SandDance for VSCode\",\n    \"description\": \"Visually explore, understand, and present your data.\",\n    \"version\": \"4.2.0\",\n    \"icon\": \"sanddance-logo.png\",\n    \"publisher\": \"msrvida\",\n    \"license\": \"MIT\",\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/Microsoft/Sanddance\"\n    },\n    \"engines\": {\n        \"vscode\": \"^1.53.0\"\n    },\n    \"categories\": [\n        \"Data Science\",\n        \"Other\",\n        \"Visualization\"\n    ],\n    \"keywords\": [\n        \"data exploration\",\n        \"data visualization\",\n        \"dataviz\"\n    ],\n    \"activationEvents\": [\n        \"onCommand:sanddance.view\"\n    ],\n    \"main\": \"./dist/extension-bundle\",\n    \"capabilities\": {\n        \"untrustedWorkspaces\": {\n            \"supported\": true\n        },\n        \"virtualWorkspaces\": true\n    },\n    \"contributes\": {\n        \"commands\": [\n            {\n                \"command\": \"sanddance.view\",\n                \"title\": \"View in SandDance\"\n            }\n        ],\n        \"languages\": [\n            {\n                \"id\": \"csv\",\n                \"extensions\": [\n                    \".csv\"\n                ]\n            },\n            {\n                \"id\": \"tsv\",\n                \"extensions\": [\n                    \".tsv\"\n                ]\n            }\n        ],\n        \"menus\": {\n            \"commandPalette\": [\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"false\"\n                }\n            ],\n            \"explorer/context\": [\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == csv\"\n                },\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == tsv\"\n                }\n            ],\n            \"editor/title/context\": [\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == csv\"\n                },\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == tsv\"\n                }\n            ],\n            \"editor/title\": [\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == csv\",\n                    \"group\": \"navigation\"\n                },\n                {\n                    \"command\": \"sanddance.view\",\n                    \"when\": \"resourceLangId == tsv\",\n                    \"group\": \"navigation\"\n                }\n            ]\n        }\n    },\n    \"scripts\": {\n        \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n        \"clean\": \"rimraf ./resources/*.*\",\n        \"vscode:prepublish\": \"webpack --mode production\",\n        \"webpack\": \"webpack --mode development\",\n        \"webpack-dev\": \"webpack --mode development --watch\",\n        \"resources\": \"node ../common-frontend/scripts/resources.js\",\n        \"compile\": \"tsc -p ./\",\n        \"build:08\": \"npm run compile && npm run resources\",\n        \"x-test\": \"npm run compile && node ./out/test/runTest.js\",\n        \"deploy\": \"node ./scripts/deploy.js\",\n        \"build:09\": \"vsce package\"\n    }\n}\n"
  },
  {
    "path": "extensions/vscode-sanddance/scripts/deploy.js",
    "content": "const fs = require('fs');\nconst package = require('../package.json');\nconst filename = `${package.name}-${package.version}.vsix`;\nfs.copyFileSync(`./${filename}`, `../../docs/dist/vscode/v4/${filename}`);\n"
  },
  {
    "path": "extensions/vscode-sanddance/src/extension.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n'use strict';\n\nimport * as path from 'path';\nimport * as vscode from 'vscode';\nimport { newPanel, WebViewWithUri } from 'common-backend';\nimport { TextDecoder } from 'util';\n\nexport function activate(context: vscode.ExtensionContext) {\n    let current: WebViewWithUri | undefined = undefined;\n    context.subscriptions.push(\n        vscode.commands.registerCommand('sanddance.view',\n            (fileUri: vscode.Uri) => {\n                const columnToShowIn = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined;\n                const uriFsPath = fileUri.fsPath;\n                //only allow one SandDance at a time\n                if (current && current.uriFsPath !== uriFsPath) {\n                    current.panel.dispose();\n                    current = undefined;\n                }\n                if (current) {\n\n                    //TODO: registerWebviewPanelSerializer to hydrate state\n\n                    // If we already have a panel, show it in the target column\n                    current.panel.reveal(columnToShowIn);\n\n                } else {\n                    // Otherwise, create a new panel\n                    current = newPanel(context, uriFsPath);\n\n                    current.panel.onDidDispose(() => {\n                        current = undefined;\n                    }, null, context.subscriptions);\n\n                    // Handle messages from the webview\n                    current.panel.webview.onDidReceiveMessage(message => {\n                        switch (message.command) {\n                            case 'getFileContent': {\n                                vscode.workspace.fs.readFile(fileUri).then(uint8array => {\n                                    if (current && current.panel.visible) {\n\n                                        //TODO string type of dataFile\n                                        const dataFile = {\n                                            type: path.extname(uriFsPath).substring(1),\n                                            rawText: new TextDecoder().decode(uint8array),\n                                        };\n                                        const compactUI = context.globalState.get('compactUI');\n                                        current.panel.webview.postMessage({ command: 'gotFileContent', dataFile, compactUI });\n                                    }\n                                });\n                                break;\n                            }\n                            case 'setCompactUI': {\n                                context.globalState.update('compactUI', message.compactUI);\n                                break;\n                            }\n                        }\n                    }, undefined, context.subscriptions);\n                }\n            },\n        ),\n    );\n}\n\nexport function deactivate() {\n}\n"
  },
  {
    "path": "extensions/vscode-sanddance/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"target\": \"es6\",\n        \"outDir\": \"dist\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"skipLibCheck\": true,\n        \"sourceMap\": true,\n        \"rootDir\": \"src\",\n        /* Strict Type-Checking Option */\n        \"strict\": true,   /* enable all strict type-checking options */\n        /* Additional Checks */\n        \"noUnusedLocals\": true /* Report errors on unused locals. */\n        // \"noImplicitReturns\": true, /* Report error when not all code paths in function return a value. */\n        // \"noFallthroughCasesInSwitch\": true, /* Report errors for fallthrough cases in switch statement. */\n        // \"noUnusedParameters\": true,  /* Report errors on unused parameters. */\n    },\n    \"exclude\": [\n        \"node_modules\",\n        \".vscode-test\",\n        \"src/ui\",\n        \"resources\"\n    ]\n}"
  },
  {
    "path": "extensions/vscode-sanddance/webpack.config.js",
    "content": "//@ts-check\n\n'use strict';\n\nconst path = require('path');\n\n/**@type {import('webpack').Configuration}*/\nconst config = {\n  target: 'node', // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/\n\n  entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/\n  output: {\n    // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/\n    path: path.resolve(__dirname, 'dist'),\n    filename: 'extension-bundle.js',\n    libraryTarget: 'commonjs2',\n    devtoolModuleFilenameTemplate: '../[resource-path]'\n  },\n  devtool: 'source-map',\n  externals: {\n    vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/\n  },\n  resolve: {\n    // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader\n    extensions: ['.ts', '.js']\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.ts$/,\n        exclude: /node_modules/,\n        use: [\n          {\n            loader: 'ts-loader'\n          }\n        ]\n      }\n    ]\n  }\n};\nmodule.exports = config;\n"
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"@msrvida/sanddance-root\",\n    \"private\": true,\n    \"version\": \"1.0.0\",\n    \"description\": \"SandDance development monorepo.\",\n    \"scripts\": {\n        \"vegatest\": \"npm run vegatest --workspaces --if-present\",\n        \"eslint\": \"npm run eslint --workspaces --if-present\",\n        \"build-az\": \"npm run build --workspace azdata-sanddance\",\n        \"postinstall\": \"node ./scripts/copy_inuitcss.js && cd packages/powerbi && npm install --prefix . && cd ../..\",\n        \"build:01\": \"npm run build:01 --workspaces --if-present\",\n        \"build:02\": \"npm run build:02 --workspaces --if-present\",\n        \"build:03\": \"npm run build:03 --workspaces --if-present\",\n        \"build:04\": \"npm run build:04 --workspaces --if-present\",\n        \"build:05\": \"npm run build:05 --workspaces --if-present\",\n        \"build:06\": \"npm run build:06 --workspaces --if-present\",\n        \"build:07\": \"npm run build:07 --workspaces --if-present\",\n        \"build:08\": \"npm run build:08 --workspaces --if-present\",\n        \"build:09\": \"npm run build:09 --workspaces --if-present\",\n        \"build\": \"npm run build:01 && npm run build:02 && npm run build:03 && npm run build:04 && npm run build:05 && npm run build:06 && npm run build:07 && npm run build:08 && npm run build:09\",\n        \"build-test\": \"npm run build-test --workspaces --if-present\",\n        \"watch-css\": \"npm run watch-css --workspaces --if-present\",\n        \"watch-typescript\": \"npm run watch-typescript --workspaces --if-present\",\n        \"specs\": \"npm-run-all --parallel specs-watch-typescript specs-watch\",\n        \"serve-app\": \"npm run dev --workspace @msrvida/sanddance-app\",\n        \"start\": \"npm-run-all --parallel watch-typescript watch-css serve-app\",\n        \"restore-dist\": \"git checkout -q -- ./packages/sanddance/dist/umd/sanddance.d.ts ./packages/sanddance-react/dist/umd/sanddance-react.d.ts ./packages/vega-deck.gl/dist/umd/vega-deck.gl.d.ts ./packages/vega-morphcharts/dist/umd/vega-morphcharts.d.ts ./packages/sanddance-specs/dist/umd/sanddance-specs.d.ts ./packages/data-inference/dist/umd/data-inference.d.ts\",\n        \"clean-build\": \"rimraf --glob ./packages/**/dist/\",\n        \"clean\": \"npm run clean --workspaces --if-present && npm run clean-build && npm run restore-dist\",\n        \"remove-pem\": \"rimraf --glob **/*.pem && rimraf --glob **/*.key\",\n        \"vega-upgrade\": \"npm run remove-vega --workspaces --if-present && git checkout -- \\\"**/package.json\\\" && node ./scripts/vega-version.mjs\",\n        \"deploy\": \"npm run deploy --workspaces --if-present\",\n        \"test\": \"npm run eslint && npm run test --workspaces --if-present\",\n        \"dev\": \"npm run dev --workspace dev --if-present\",\n        \"pbiviz\": \"npm run start -w powerbi\",\n        \"build-rec\": \"npm run build --workspace @msrvida/chart-recommender\",\n        \"test-rec\": \"npm run test --workspace @msrvida/chart-recommender\",\n        \"azdata-webpack-extension\": \"npm run webpack --workspace azdata-sanddance\",\n        \"vscode-webpack-extension\": \"npm run webpack --workspace vscode-sanddance\"\n    },\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/microsoft/SandDance.git\"\n    },\n    \"author\": \"Dan Marshall\",\n    \"license\": \"MIT\",\n    \"devDependencies\": {\n        \"@danmarshall/deckgl-typings\": \"^4.1.11\",\n        \"@deck.gl/core\": \"8.3.7\",\n        \"@deck.gl/layers\": \"8.3.7\",\n        \"@fluentui/react\": \"^8\",\n        \"@luma.gl/core\": \"8.3.1\",\n        \"@rollup/plugin-buble\": \"^1.0.3\",\n        \"@rollup/plugin-commonjs\": \"^29.0.0\",\n        \"@rollup/plugin-json\": \"^6.1.0\",\n        \"@rollup/plugin-node-resolve\": \"^16.0.3\",\n        \"@rollup/plugin-typescript\": \"^12.3.0\",\n        \"@types/azdata\": \"^1.29.0\",\n        \"@types/d3-color\": \"^3.1.0\",\n        \"@types/d3-ease\": \"^3.0.0\",\n        \"@types/d3-format\": \"^1.3.1\",\n        \"@types/react\": \">=16.8.0 <18.0.0\",\n        \"@types/react-dom\": \">=16.8.0 <18.0.0\",\n        \"@types/temp-write\": \"^3.3.0\",\n        \"@types/vscode\": \"^1.53.0\",\n        \"@typescript-eslint/eslint-plugin\": \"^8.33.1\",\n        \"@typescript-eslint/parser\": \"^8.33.1\",\n        \"@uifabric/styling\": \"^7.25.1\",\n        \"@vscode/vsce\": \"^3.6.0\",\n        \"core-js\": \"3.2.1\",\n        \"d3-color\": \"^3.1.0\",\n        \"d3-ease\": \"^1.0.5\",\n        \"d3-scale\": \"^4.0.2\",\n        \"deepmerge\": \"^2.1.1\",\n        \"eslint\": \"^9.28.0\",\n        \"eslint-plugin-react\": \"^7.37.5\",\n        \"esm\": \"^3.2.25\",\n        \"fs-extra\": \"^7.0.1\",\n        \"glob\": \"^13.0.0\",\n        \"inuitcss\": \"^6.0.0\",\n        \"is-plain-object\": \"^5.0.0\",\n        \"just-compare\": \"^1.3.0\",\n        \"marked\": \"^4.0.10\",\n        \"mdast-util-toc\": \"^3.0.1\",\n        \"mocha\": \"^10.1.0\",\n        \"morphcharts\": \"^1\",\n        \"npm-run-all\": \"^4.1.5\",\n        \"process\": \"^0.11.10\",\n        \"react\": \">=16.8.0 <18.0.0\",\n        \"react-dom\": \">=16.8.0 <18.0.0\",\n        \"regenerator-runtime\": \"^0.13.3\",\n        \"rimraf\": \"^6.1.2\",\n        \"rollup\": \"^4.59.0\",\n        \"sass\": \"^1.94.2\",\n        \"temp-write\": \"^3.4.0\",\n        \"ts-loader\": \"^9.3.1\",\n        \"tsx-create-element\": \"^2.2.9\",\n        \"typescript\": \"^5.7.2\",\n        \"unified\": \"^7.0.2\",\n        \"vega\": \"^6.2.0\",\n        \"vega-datasets\": \"2.8.1\",\n        \"vega-typings\": \"^2.1.0\",\n        \"vite\": \"^7.2.6\",\n        \"vscode-test\": \"^1.3.0\",\n        \"webpack\": \"^5.52.0\",\n        \"webpack-cli\": \"^4.8.0\"\n    },\n    \"workspaces\": {\n        \"packages\": [\n            \"extensions/*\",\n            \"packages/*\"\n        ],\n        \"nohoist\": [\n            \"packages/powerbi/**\",\n            \"packages/powerbi/**/**\"\n        ]\n    }\n}\n"
  },
  {
    "path": "packages/chart-recommender/.gitignore",
    "content": "dist\n"
  },
  {
    "path": "packages/chart-recommender/.mocharc.json",
    "content": "{\n  \"spec\": \"test/**/*.mjs\",\n  \"node-option\": [\n    \"experimental-specifier-resolution=node\"\n  ]\n}\n"
  },
  {
    "path": "packages/chart-recommender/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/chart-recommender/README.md",
    "content": "# @msrvida/chart-recommender\n\nRecommends a SandDance chart based on input data.\n\n## For more information\nPlease visit the [SandDance website](https://microsoft.github.io/SandDance/).\n"
  },
  {
    "path": "packages/chart-recommender/package.json",
    "content": "{\n  \"name\": \"@msrvida/chart-recommender\",\n  \"version\": \"4.0.0\",\n  \"type\": \"module\",\n  \"description\": \"Recommendation engine for SandDance charts\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/chart-recommender\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"dependencies\": {\n    \"@msrvida/chart-types\": \"^1\",\n    \"@msrvida/sanddance-specs\": \"^2\"\n  },\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"test\": \"mocha\",\n    \"build-typescript\": \"tsc -p .\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build:04\": \"npm run build-typescript\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/chart-recommender/src/barChart.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport {\n    defaultColorScheme,\n    maxCategoricalColors,\n    Recommendation,\n    Recommender,\n    Rule,\n} from './recommender.js';\n\nconst maxDistinctVal = 20;\nconst minDistinctVal = 2;\n\nexport class BarChartRecommenderSummary {\n    public best: Recommendation;\n\n    constructor(columns: Column[], data: object[]) {\n        let score: number = -1;\n        for (let i = 0; i < columns.length; i++) {\n            const recommendation = new BarChartRecommender(columns[i], data).recommend();\n            if (recommendation.score > score) {\n                this.best = recommendation;\n                score = recommendation.score;\n            }\n            if (score === 1) break;\n        }\n\n        for (let k = 0; k < columns.length; k++) {\n            const column = columns[k];\n            if (column.name === this.best.columns.x || column.stats.isSequential) continue;\n            if (column.quantitative || (column.stats.distinctValueCount < maxCategoricalColors && column.stats.distinctValueCount > 1)) {\n                this.best.columns.color = this.best.columns.sort = column.name;\n                this.best.scheme = defaultColorScheme(column);\n                if (column.quantitative) {\n                    this.best.colorBin = 'quantile';\n                }\n                break;\n            }\n        }\n    }\n\n    recommend() {\n        return this.best;\n    }\n\n}\n\nexport class BarChartRecommender implements Recommender {\n    public rules: Rule[];\n    public column: Column;\n    public score: number;\n\n    constructor(column: Column, data: object[]) {\n        this.score = 0;\n        this.column = column;\n        //the total score for bar chart is 1\n        this.rules = [\n            (column) => {\n                if (column.stats.isSequential) return false;\n                else if (column.quantitative) {\n                    return true;\n                } else if (!column.quantitative && column.stats.distinctValueCount <= maxDistinctVal && column.stats.distinctValueCount >= minDistinctVal) {\n                    return true;\n                } else {\n                    return false;\n                }\n            },\n        ];\n        for (let i = 0; i < this.rules.length; i++) {\n            if (this.rules[i](column)) this.score++;\n        }\n\n    }\n\n    recommend() {\n        const rec: Recommendation = {\n            chart: 'barchart',\n            columns: {\n                x: this.column.name,\n            },\n            score: this.score,\n            scheme: undefined,\n            view: '2d',\n        };\n        return rec;\n    }\n\n}"
  },
  {
    "path": "packages/chart-recommender/src/geo.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\n\n//TODO: languages other than english\nconst longitudeNames = ['lon', 'long', 'longitude'];\nconst latitudeNames = ['lat', 'latitude'];\n\nfunction isSpec(names: string[], limits: [number, number], column: Column, data?: object[]) {\n    let is = false;\n    const cname = column.name.toLowerCase();\n    for (let i = 0; i < names.length; i++) {\n        if (names[i] === cname) {\n            is = true;\n            break;\n        }\n    }\n    if (data) {\n        //TODO: spin through data to see if it is within limits\n    }\n    return is;\n}\n\nexport function isLongitude(column: Column, data?: object[]) {\n    return isSpec(longitudeNames, [-180, 180], column, data);\n}\n\nexport function isLatitude(column: Column, data?: object[]) {\n    return isSpec(latitudeNames, [-90, 90], column, data);\n}\n\nexport function isGeo(column: Column, data?: object[]) {\n    return isLatitude(column, data) || isLongitude(column, data);\n}\n"
  },
  {
    "path": "packages/chart-recommender/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport * from './barChart.js';\nexport * from './geo.js';\nexport * from './scatterPlot.js';\nexport * from './treemap.js';\nexport * from './recommenderSummary.js';\n"
  },
  {
    "path": "packages/chart-recommender/src/recommender.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { Insight } from '@msrvida/sanddance-specs';\n\nexport const maxCategoricalColors: number = 20;\n\nexport interface Rule {\n    (column: Column): boolean;\n}\n\nexport interface Recommendation extends Partial<Insight> {\n    score: number;\n}\n\nexport abstract class Recommender {\n    constructor(columns: Column, data: object[]) { }\n    abstract rules: Rule[];\n    abstract recommend(): Recommendation;\n}\n\nexport function defaultColorScheme(c: Column) {\n    if (c.quantitative) {\n        return 'redyellowgreen';\n    } else if (c.stats.distinctValueCount === 2) {\n        return 'dual_redgreen';\n    } else if (c.stats.distinctValueCount <= 10) {\n        return 'category10';\n    }\n    return 'category20';\n}\n"
  },
  {
    "path": "packages/chart-recommender/src/recommenderSummary.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { BarChartRecommenderSummary } from './barChart.js';\nimport { Recommendation } from './recommender.js';\nimport { ScatterPlotRecommenderSummary } from './scatterPlot.js';\n\nexport class RecommenderSummary {\n    public rec: Recommendation;\n\n    constructor(columns: Column[], data: object[]) {\n        const quickRec: Recommendation = new ScatterPlotRecommenderSummary(columns, data).recommend();\n        if (quickRec) {\n            this.rec = quickRec;\n        } else {\n            const barChartrec: Recommendation = new BarChartRecommenderSummary(columns, data).recommend();\n            if (barChartrec && barChartrec.score >= 1) {\n                this.rec = barChartrec;\n            } else {\n                this.rec = {\n                    chart: 'grid',\n                    columns: {},\n                    score: 1,\n                };\n            }\n        }\n    }\n\n    recommend() {\n        return this.rec;\n    }\n\n\n}\n"
  },
  {
    "path": "packages/chart-recommender/src/scatterPlot.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { defaultColorScheme, maxCategoricalColors, Recommendation } from './recommender.js';\nimport { isLatitude, isLongitude } from './geo.js';\n\nexport class ScatterPlotRecommenderSummary {\n    public best: Recommendation;\n\n    constructor(columns: Column[], data: object[]) {\n        const rec: Recommendation = {\n            chart: 'scatterplot',\n            score: undefined,\n            columns: {},\n            scheme: undefined,\n            view: '2d',\n        };\n        columns.forEach(column => {\n            if (!rec.columns.x) {\n                if (column.name.toLowerCase() === 'x') {\n                    return rec.columns.x = column.name;\n                } else if (isLongitude(column)) {\n                    return rec.columns.x = column.name;\n                }\n            }\n            if (!rec.columns.y) {\n                if (column.name.toLowerCase() === 'y') {\n                    return rec.columns.y = column.name;\n                } else if (isLatitude(column)) {\n                    return rec.columns.y = column.name;\n                }\n            }\n            if (!rec.columns.color && !column.stats.isSequential) {\n                if (column.quantitative || column.stats.distinctValueCount < maxCategoricalColors) {\n                    rec.columns.color = rec.columns.sort = column.name;\n                    rec.scheme = defaultColorScheme(column);\n                    if (column.quantitative) {\n                        rec.colorBin = 'quantile';\n                    }\n                    return;\n                }\n            }\n        });\n        if (rec.columns.x && rec.columns.y) {\n            this.best = rec;\n        }\n    }\n\n    recommend() {\n        return this.best;\n    }\n}"
  },
  {
    "path": "packages/chart-recommender/src/treemap.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { isGeo } from './geo.js';\n\nexport function preferredColumnForTreemapSize(columns: Column[], strict: boolean) {\n    for (let i = 0; i < columns.length; i++) {\n        const c = columns[i];\n        if (c.quantitative) {\n            if (strict && c.stats.hasNegative) continue;\n            if (strict && c.stats.isSequential) continue;\n            if (strict && isGeo(c)) continue;\n            return c;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/chart-recommender/test/mocha.opts",
    "content": ""
  },
  {
    "path": "packages/chart-recommender/test/recommend.mjs",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport assert from 'assert';\nimport * as recommender from '../dist/es6/index.js';\nimport fs from 'fs';\nimport * as vega from 'vega';\nimport { getColumnsFromData } from '@msrvida/sanddance-specs';\n\nconst sampleDir = './test-data/';\n\nfunction GetDataAndColumns(sampleFile) {\n    return new Promise((resolve, reject) => {\n        fs.readFile(sampleDir + sampleFile, function (err, buffer) {\n            const rawText = buffer.toString();\n            const data = vega.read(rawText, { type: 'tsv', parse: 'auto' });\n            const columns = getColumnsFromData(vega.inferTypes, data);\n            resolve({ data, columns });\n        });\n    });\n}\n\nfunction RawDataAndColumns(data) {\n    const columns = getColumnsFromData(vega.inferTypes, data);\n    return { data, columns };\n}\n\nfunction FileGetDataAndColumns(sampleFile) {\n    return new Promise((resolve, reject) => {\n        fs.readFile(sampleFile, function (err, buffer) {\n            const rawText = buffer.toString();\n            const data = vega.read(rawText, { type: 'tsv', parse: 'auto' });\n            resolve(RawDataAndColumns(data));\n        });\n    });\n}\n\ndescribe('Recommender', function () {\n    var sampleFiles = fs.readdirSync(sampleDir);\n    console.log(sampleFiles[0]);\n    sampleFiles.forEach(function (sampleFile) {\n        var dataAndColumnsPromise = GetDataAndColumns(sampleFile);\n        it(`${sampleFile} Recommender returns one bar chart recommendations`, function (done) {\n            dataAndColumnsPromise.then(function (dataAndColumns) {\n                var r = new recommender.RecommenderSummary(dataAndColumns.columns, dataAndColumns.data);\n                var rec = r.recommend();\n                assert.ok(rec.chart === 'barchart');\n                done();\n            });\n        });\n    });\n\n    it('x/y: recommends scatter plot', function (done) {\n        const data = [\n            { x: 0, y: 0 },\n        ];\n        const dataAndColumns = RawDataAndColumns(data);\n        var r = new recommender.RecommenderSummary(dataAndColumns.columns, dataAndColumns.data);\n        var rec = r.recommend();\n        assert.ok(rec.chart === 'scatterplot');\n        done();\n    });\n\n    it('longitude/latitude: recommends scatter plot', function (done) {\n        let filePath = '../../docs/sample-data/demovote.tsv';\n        var dataAndColumnsPromise = FileGetDataAndColumns(filePath);\n        dataAndColumnsPromise.then(function (dataAndColumns) {\n            var r = new recommender.RecommenderSummary(dataAndColumns.columns, dataAndColumns.data);\n            var rec = r.recommend();\n            assert.ok(rec.chart === 'scatterplot');\n            done();\n        });\n    });\n\n    it('test-barchart: recommends bar chart', function (done) {\n        let filePath = '../../docs/sample-data/titanicmaster.tsv';\n        var dataAndColumnsPromise = FileGetDataAndColumns(filePath);\n        dataAndColumnsPromise.then(function (dataAndColumns) {\n            var r = new recommender.RecommenderSummary(dataAndColumns.columns, dataAndColumns.data);\n            var rec = r.recommend();\n            assert.ok(rec.chart === 'barchart');\n            done();\n        });\n    });\n});\n"
  },
  {
    "path": "packages/chart-recommender/test-data/test1.tsv",
    "content": "age\tnumber\n20\t1\n20\t3\n20\t5"
  },
  {
    "path": "packages/chart-recommender/test-data/test2.tsv",
    "content": "Age\tNumber\tname\n1\t1\ta\n2\t1\ta\n3\t1\tb\n4\t2\tb\n5\t2\tc\n6\t2\tc\n7\t3\ts\n8\t3\tw\n9\t3\ts\n10\t4\ts\n11\t4\t2\n12\t4\tt\n13\t5\t1\n14\t5\tw\n15\t5\t1"
  },
  {
    "path": "packages/chart-recommender/test-data/test3.tsv",
    "content": "Age\tNumber\n1\t1\n2\t16\n3\t1\n4\t2\n5\t24\n6\t22\n7\t32\n8\t30\n9\t31\n10\t44\n11\t42\n12\t41\n13\t54\n14\t53\n15\t52"
  },
  {
    "path": "packages/chart-recommender/test-data/test4.tsv",
    "content": "Number\tID\tname\n1\ta\ta\n2\tb\ta\n3\tc\tb\n4\tc\ta\n5\tc\ta\n6\tc\ta\n15\tc\tc"
  },
  {
    "path": "packages/chart-recommender/test-data/test5.tsv",
    "content": "Number\tID\tname\n1\ta1\ta\n2\tb2\ta\n3\tc3\ta\n4\tc4\ta\n5\tc5\ta\n6\tc6\ta\n15\tc7\ta\n1\ta8\ta\n2\tb9\ta\n3\tcx   a\n4\tc1\ta\n5\tc2\tc\n6\tc8\tc\n15\tc9\ta\n1\ta2\ta\n2\tb3\ta\n3\tcv\tc\n4\tcs\tc\n5\tcp\tc\na\tcppp\tc\n15\tcppppp  a"
  },
  {
    "path": "packages/chart-recommender/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"lib\": [\n            \"es2015\"\n        ],\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/chart-types/.gitignore",
    "content": "dist\n"
  },
  {
    "path": "packages/chart-types/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/chart-types/README.md",
    "content": "# @msrvida/chart-types\n\nTypeScript types for creating charts.\n\n## For more information\nPlease visit the [SandDance website](https://microsoft.github.io/SandDance/).\n"
  },
  {
    "path": "packages/chart-types/package.json",
    "content": "{\n  \"name\": \"@msrvida/chart-types\",\n  \"version\": \"1.1.1\",\n  \"description\": \"Types for chart applications.\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/chart-types\"\n  },\n  \"types\": \"dist/es6/index.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-typescript\": \"tsc -p .\",\n    \"build:01\": \"npm run build-typescript\",\n    \"remove-vega\": \"npm un vega-typings\",\n    \"patch-after-vega-upgrade\": \"npm version patch\"\n  },\n  \"author\": \"Dan Marshall\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"vega-typings\": \"~2.1.0\"\n  }\n}"
  },
  {
    "path": "packages/chart-types/src/column.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { TypeInference } from 'vega-typings';\nimport { ColumnStats } from './stats';\n\n/**\n * Column information.\n */\nexport interface Column {\n\n    /**\n     * Name of the column.\n     */\n    name: string;\n\n    /**\n     * Type of data in the column.\n     */\n    type: TypeInference;\n\n    /**\n     * Optional flag to specify if the column data is quantitative.\n     */\n    quantitative?: boolean;\n\n    /**\n    * Optional flag to specify if the column data is CSS colors.\n    */\n    isColorData?: boolean;\n\n    /**\n     * Optional stats object with metadata of column data content.\n     */\n    stats?: ColumnStats;\n}\n\nexport interface ColumnTypeMap {\n    [columnName: string]: TypeInference\n}\n"
  },
  {
    "path": "packages/chart-types/src/dimensions.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport type Dimension2D = 'x' | 'y';\n\nexport type Dimension3D = Dimension2D | 'z';\n"
  },
  {
    "path": "packages/chart-types/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport * from './column';\nexport * from './dimensions';\nexport * from './stats';\nexport * from './view';\n"
  },
  {
    "path": "packages/chart-types/src/stats.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * Metadata about a column.\n */\nexport interface ColumnStats {\n\n    /***\n     * Number of non-null values in this column.\n     */\n    nonNull: number;\n\n    /**\n     * Number of unique values in this column.\n     */\n    distinctValueCount: number;\n\n    /**\n     * Maximum value of data in this column, if column is numeric.\n     */\n    max?: number;\n\n    /**\n     * Mean value of data in this column, if column is numeric.\n     */\n    mean?: number;\n\n    /**\n     * Minimum value of data in this column, if column is numeric.\n     */\n    min?: number;\n\n    /**\n     * Optional flag to specify if the column data is sequential.\n     */\n    isSequential?: boolean;\n\n    /**\n     * Optional flag to specify if the column data contains negative numbers.\n     */\n    hasNegative?: boolean;\n\n    /**\n     * Optional flag to specify if the column data contains color data.\n     */\n    hasColorData?: boolean;\n}\n"
  },
  {
    "path": "packages/chart-types/src/view.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * Types of camera views.\n */\nexport type View = '2d' | '3d';\n\n/**\n * Rectangle size.\n */\nexport interface Size {\n    height: number;\n    width: number;\n}\n\n/**\n * Camera setting.\n */\nexport interface Camera {\n    position: [number, number, number];\n    rotation: [number, number, number, number];\n    captureSize: Size;\n}\n"
  },
  {
    "path": "packages/chart-types/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/data-inference/README.md",
    "content": "# @msrvida/data-inference\n\nInfer column types in tabular data. Inference is from [vega-loader's `inferTypes` function](https://github.com/vega/vega/tree/main/packages/vega-loader#inferTypes) (or similar function of your choice). This library enriches the column metadata with a [ColumnStats object](https://github.com/microsoft/SandDance/blob/main/packages/chart-types/src/stats.ts). \n\n[Demo](https://microsoft.github.io/SandDance/tests/data-inference/v2/)\n\n## Usage\n\nYou will need an array of data objects, so that columns types can be inferred.\n\n### Modules\n```js\nimport * as DataInference from '@msrvida/data-inference';\nimport { inferTypes } from 'vega-loader';\n\nconst data = [\n    {\n        Name: 'chevrolet chevelle malibu',\n        Miles_per_Gallon: 18,\n        Cylinders: 8,\n        Displacement: 307,\n        Horsepower: 130,\n        Weight_in_lbs: 3504,\n        Acceleration: 12,\n        Year: '1970-01-01',\n        Origin: 'USA',\n    },\n    {\n        Name: 'buick skylark 320',\n        Miles_per_Gallon: 15,\n        Cylinders: 8,\n        Displacement: 350,\n        Horsepower: 165,\n        Weight_in_lbs: 3693,\n        Acceleration: 11.5,\n        Year: '1970-01-01',\n        Origin: 'USA',\n    },\n];\n\nconst columns = DataInference.getColumnsFromData(inferTypes, data);\nconsole.log(columns);\n```\n\n### Pre-built library\n```html\n<script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n<script src=\"https://unpkg.com/@msrvida/data-inference@1.0.0/dist/umd/data-inference.js\" charset=\"utf-8\"></script>\n    <script>\n        const data = [\n            {\n                Name: 'chevrolet chevelle malibu',\n                Miles_per_Gallon: 18,\n                Cylinders: 8,\n                Displacement: 307,\n                Horsepower: 130,\n                Weight_in_lbs: 3504,\n                Acceleration: 12,\n                Year: '1970-01-01',\n                Origin: 'USA',\n            },\n            {\n                Name: 'buick skylark 320',\n                Miles_per_Gallon: 15,\n                Cylinders: 8,\n                Displacement: 350,\n                Horsepower: 165,\n                Weight_in_lbs: 3693,\n                Acceleration: 11.5,\n                Year: '1970-01-01',\n                Origin: 'USA',\n            },\n        ];\n\n        const columns = DataInference.getColumnsFromData(vega.inferTypes, data);\n        console.log(columns);\n    </script>\n```\n\n## Sample output\n```json\n[\n    {\n        \"name\": \"Name\",\n        \"type\": \"string\",\n        \"quantitative\": false,\n        \"stats\": {\n            \"distinctValueCount\": 2,\n            \"max\": null,\n            \"mean\": null,\n            \"min\": null\n        },\n        \"isColorData\": false\n    },\n    {\n        \"name\": \"Miles_per_Gallon\",\n        \"type\": \"integer\",\n        \"quantitative\": true,\n        \"stats\": {\n            \"distinctValueCount\": 2,\n            \"max\": 18,\n            \"mean\": 16.5,\n            \"min\": 15,\n            \"hasNegative\": false,\n            \"isSequential\": false\n        }\n    },\n    {\n        \"name\": \"Cylinders\",\n        \"type\": \"integer\",\n        \"quantitative\": true,\n        \"stats\": {\n            \"distinctValueCount\": 1,\n            \"max\": 8,\n            \"mean\": 8,\n            \"min\": 8,\n            \"hasNegative\": false,\n            \"isSequential\": false\n        }\n    },\n    .\n    .\n    .\n]\n```\n\n## Pandas-style simulation\nAs of version 1.2, the **pandasSimulation** namespace provides **describe()**, **head()**, and **info()** functions to emit data inferences in similar format of [Python's Pandas library](https://pandas.pydata.org/)\n\n### head\n```js\nconsole.log(DataInference.pandasSimulation.head(columns, data));\n```\n\n```\n                       Name Miles_per_Gallon Cylinders Displacement Horsepower \\\n1 chevrolet chevelle malibu               18         8          307        130\n2         buick skylark 320               15         8          350        165\n3        plymouth satellite               18         8          318        150\n4             amc rebel sst               16         8          304        150\n5               ford torino               17         8          302        140\n\nWeight_in_lbs Acceleration       Year Origin\n         3504           12 1970-01-01    USA\n         3693         11.5 1970-01-01    USA\n         3436           11 1970-01-01    USA\n         3433           12 1970-01-01    USA\n         3449         10.5 1970-01-01    USA\n```\n\n### info\n```js\nconsole.log(DataInference.pandasSimulation.info(columns, data));\n```\n\n```\ninfo\n<class 'pandas.core.frame.DataFrame'>\nIndex: 406 entries, 0 to 405\nData columns (total 9 columns):\n\n# Column           Non-Null Count Dtype         \n- ---------------- -------------- --------------\n0 Name             406 non-null   object        \n1 Miles_per_Gallon 398 non-null   float64       \n2 Cylinders        406 non-null   int64         \n3 Displacement     406 non-null   float64       \n4 Horsepower       400 non-null   int64         \n5 Weight_in_lbs    406 non-null   int64         \n6 Acceleration     406 non-null   float64       \n7 Year             406 non-null   datetime64[ns]\n8 Origin           406 non-null   object        \n\n\ndtypes: 3 float64, 3 int64, 2 object\nmemory usage: 21.0 KB\n```\n\n## For more information\nPlease visit the [SandDance website](https://microsoft.github.io/SandDance/).\n"
  },
  {
    "path": "packages/data-inference/package.json",
    "content": "{\n  \"name\": \"@msrvida/data-inference\",\n  \"type\": \"module\",\n  \"version\": \"2.0.0\",\n  \"description\": \"Infer column types in tabular data.\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/data-inference\"\n  },\n  \"types\": \"dist/es6/index.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-typescript\": \"tsc -p .\",\n    \"build:02\": \"npm run build-typescript && npm run bundle\",\n    \"bundle\": \"rollup -c\",\n    \"deploy\": \"node ./scripts/deploy.js\",\n    \"remove-vega\": \"npm un vega-typings\",\n    \"patch-after-vega-upgrade\": \"npm version patch\"\n  },\n  \"author\": \"Dan Marshall\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@msrvida/chart-types\": \"^1\",\n    \"d3-color\": \"^3.1.0\",\n    \"vega-typings\": \"~2.1.0\"\n  }\n}\n"
  },
  {
    "path": "packages/data-inference/rollup.config.mjs",
    "content": "import commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport resolve from '@rollup/plugin-node-resolve';\n\nexport default {\n    input: './dist/es6/index.js',\n    output: {\n        file: './dist/umd/data-inference.js',\n        format: 'umd',\n        name: 'DataInference',\n    },\n    plugins: [\n        json(),\n        resolve({ jsnext: true }),\n        commonjs({ sourceMap: false }),\n    ],\n};\n"
  },
  {
    "path": "packages/data-inference/scripts/deploy.js",
    "content": "import fs from 'fs';\nfs.copyFileSync('./dist/umd/data-inference.js', '../../docs/tests/data-inference/v2/js/data-inference.js');\n"
  },
  {
    "path": "packages/data-inference/src/color.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { color as d3color } from 'd3-color';\nimport { Column } from '@msrvida/chart-types';\n\nexport function isColor(cssColorSpecifier: string) {\n    return !!d3color(cssColorSpecifier);\n}\n\nexport function checkIsColorData(data: object[], column: Column) {\n    if (!column.stats.hasColorData) {\n        column.isColorData = false;\n        return;\n    }\n    for (let i = 0; i < data.length; i++) {\n        if (!isColor(data[i][column.name])) {\n            column.isColorData = false;\n            return;\n        }\n    }\n    column.isColorData = true;\n}\n"
  },
  {
    "path": "packages/data-inference/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport * from './color.js';\nexport * from './inference.js';\nexport * from './numeric.js';\nexport * from './stats.js';\nexport * from './summary.js';\n"
  },
  {
    "path": "packages/data-inference/src/inference.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column, ColumnTypeMap } from '@msrvida/chart-types';\nimport { inferTypes } from 'vega-typings';\nimport { checkIsColorData } from './color.js';\nimport { isQuantitative } from './numeric.js';\nimport { getStats } from './stats.js';\n\n/**\n * Derive column metadata from the data array.\n * @param data Array of data objects.\n */\nexport function getColumnsFromData(inferTypesFn: typeof inferTypes, data: object[], columnTypes?: ColumnTypeMap) {\n    const sample = data[0];\n    const fields = sample ? Object.keys(sample) : [];\n    const inferences = { ...inferTypesFn(data, fields), ...columnTypes };\n    const columns = fields.map(name => {\n        const column: Column = {\n            name,\n            type: inferences[name],\n        };\n        return column;\n    });\n    inferAll(columns, data);\n    return columns;\n}\n\n/**\n * Populate columns with type inferences and stats.\n * @param columns Array of columns.\n * @param data Array of data objects.\n */\nexport function inferAll(columns: Column[], data: object[]) {\n    columns.forEach(column => {\n        if (column) {\n            if (typeof column.quantitative !== 'boolean') {\n                column.quantitative = isQuantitative(column);\n            }\n            if (!column.stats) {\n                column.stats = getStats(data, column);\n            }\n            // hex codes, ex. #003300, are parsed as dates\n            if ((column.type === 'date' || column.type === 'string') && typeof column.isColorData !== 'boolean') {\n                checkIsColorData(data, column);\n            }\n        }\n    });\n}\n"
  },
  {
    "path": "packages/data-inference/src/numeric.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\n\nexport function isQuantitative(column: Column) {\n    return column.type === 'number' || column.type === 'integer';\n}\n\nexport function detectNegative(columnName: string | number, data: object[] | Float64Array) {\n    for (let i = 1; i < data.length; i++) {\n        const value = columnName == null ? data[i] : data[i][columnName];\n        if (value < 0) return true;\n    }\n    return false;\n}\n\nexport function detectSequentialColumn(columnName: string | number, data: object[] | Float64Array): boolean {\n    if (data.length < 2) return false;\n    for (let i = 1; i < data.length; i++) {\n        const curr = columnName == null ? data[i] : data[i][columnName];\n        const prev = columnName == null ? data[i - 1] : data[i - 1][columnName];\n        if (curr !== prev + 1) return false;\n    }\n    return true;\n}\n"
  },
  {
    "path": "packages/data-inference/src/stats.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column, ColumnStats } from '@msrvida/chart-types';\nimport { TypeInference } from 'vega-typings';\nimport { isColor } from './color.js';\nimport { detectNegative, detectSequentialColumn } from './numeric.js';\n\nexport function getStats(data: object[] | Float64Array, columnName: string | number, columnType: TypeInference, columnQuantitative: boolean, distinctValuesCallback?: (distinctValues: string[]) => void): ColumnStats;\nexport function getStats(data: object[], column: Column, distinctValuesCallback?: (distinctValues: string[]) => void): ColumnStats;\nexport function getStats(data: object[] | Float64Array, ...args: any[]) {\n    let columnName: string | number;\n    let columnType: TypeInference;\n    let columnQuantitative: boolean | undefined;\n    let distinctValuesCallback: (distinctValues: string[]) => void;\n    if (args.length <= 2) {\n        const column = args[0] as Column;\n        columnName = column.name;\n        columnType = column.type;\n        columnQuantitative = column.quantitative;\n        distinctValuesCallback = args[1];\n    } else {\n        columnName = args[0];\n        columnType = args[1];\n        columnQuantitative = args[2];\n        distinctValuesCallback = args[3];\n    }\n    const distinctMap = {};\n    const stats: ColumnStats = {\n        nonNull: 0,\n        distinctValueCount: null,\n        max: null,\n        mean: null,\n        min: null,\n    };\n    const columnIsString = columnType === 'string';\n    let sum = 0;\n    for (let i = 0; i < data.length; i++) {\n        const row = data[i];\n        const value = columnName == null ? row : row[columnName];\n        if (columnIsString) {\n            if (value !== '') {\n                stats.nonNull++;\n            }\n        } else if (value != null) {\n            stats.nonNull++;\n        }\n        const num = +value;\n        distinctMap[value] = true;\n        if (!isNaN(num)) {\n            if (stats.max === null || num > stats.max) {\n                stats.max = num;\n            }\n            if (stats.min === null || num < stats.min) {\n                stats.min = num;\n            }\n            sum += num;\n        }\n        // hex codes, ex. #003300, are parsed as dates\n        if ((columnType === 'date' || columnIsString) && !stats.hasColorData && isColor(value)) {\n            stats.hasColorData = true;\n        }\n    }\n    if (columnQuantitative) {\n        stats.mean = data.length > 0 && (sum / data.length);\n        stats.hasNegative = detectNegative(columnName, data);\n        if (columnType === 'integer') {\n            stats.isSequential = detectSequentialColumn(columnName, data);\n        }\n    }\n    const distinctValues = Object.keys(distinctMap);\n    if (distinctValuesCallback) {\n        distinctValues.sort();\n        distinctValuesCallback(distinctValues);\n    }\n    stats.distinctValueCount = distinctValues.length;\n    return stats;\n}\n"
  },
  {
    "path": "packages/data-inference/src/summary.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { TypeInference } from 'vega-typings/types';\n\nclass Table {\n    private columns: string[];\n    private columnWidths: number[];\n    private rows: string[][];\n    private maxWidth: number;\n    private underlineHeaders: boolean;\n    private align: 'left' | 'right';\n\n    constructor(\n        columns: string[],\n        rows: string[][],\n        maxWidth: number = 80,\n        underlineHeaders: boolean = false,\n        align: 'left' | 'right' = 'right',\n    ) {\n        this.columns = columns;\n        this.rows = rows;\n        this.maxWidth = maxWidth;\n        this.underlineHeaders = underlineHeaders;\n        this.align = align;\n\n        // Calculate maximum width for each column\n        this.columnWidths = this.columns.map((col, idx) =>\n            Math.max(\n                col.length,\n                ...this.rows.map(row => row[idx]?.length || 0),\n            ),\n        );\n    }\n\n    private createSpaces(num: number): string {\n        return ' '.repeat(num);\n    }\n\n    private groupColumns(): string[][] {\n        let cumulativeWidth = 0;\n        const columnGroups: string[][] = [];\n        let currentGroup: string[] = [];\n\n        this.columns.forEach((col, idx) => {\n            const columnSpace = this.columnWidths[idx] + 1; // account for one space between columns\n            if (cumulativeWidth + columnSpace > this.maxWidth && currentGroup.length > 0) {\n                columnGroups.push(currentGroup);\n                cumulativeWidth = columnSpace;\n                currentGroup = [col];\n            } else {\n                cumulativeWidth += columnSpace;\n                currentGroup.push(col);\n            }\n        });\n\n        if (currentGroup.length > 0) {\n            columnGroups.push(currentGroup);\n        }\n\n        return columnGroups;\n    }\n\n    private formatRow(row: string[], group: string[]): string {\n        return group.map(col => {\n            const idx = this.columns.indexOf(col);\n            const cellValue = row[idx] == null ? '' : row[idx].toString();\n            return this.align === 'right'\n                ? cellValue.padStart(this.columnWidths[idx], ' ')\n                : cellValue.padEnd(this.columnWidths[idx], ' ');\n        }).join(this.createSpaces(1));\n    }\n\n    private formatHeader(group: string[]): string {\n        return group.map(col => {\n            const idx = this.columns.indexOf(col);\n            return this.align === 'right'\n                ? col.padStart(this.columnWidths[idx], ' ')\n                : col.padEnd(this.columnWidths[idx], ' ');\n        }).join(this.createSpaces(1));\n    }\n\n    private underlineHeader(group: string[]): string {\n        return group.map(col => '-'.repeat(this.columnWidths[this.columns.indexOf(col)])).join(this.createSpaces(1));\n    }\n\n    public render(): string {\n        const output: string[] = [];\n        const columnGroups = this.groupColumns();\n\n        columnGroups.forEach((group, groupIndex) => {\n            const headerRow = this.formatHeader(group);\n            let section = headerRow + (groupIndex < columnGroups.length - 1 ? ' \\\\' : '') + '\\n';\n\n            if (this.underlineHeaders) {\n                section += this.underlineHeader(group) + '\\n';\n            }\n\n            this.rows.forEach((row) => {\n                section += this.formatRow(row, group) + '\\n';\n            });\n\n            output.push(section);\n            if (groupIndex < columnGroups.length - 1) {\n                output.push('\\n');\n            }\n        });\n\n        return output.join('');\n    }\n}\n\nexport namespace pandasSimulation {\n\n    // Mapping TypeScript types to Python-like dtypes\n    const typeMapping: { [key in TypeInference]: string } = {\n        boolean: 'bool',\n        number: 'float64',  // Assuming 'number' is used for floating-point numbers\n        date: 'datetime64[ns]',\n        string: 'object',\n        integer: 'int64',\n    };\n\n    export function head(columns: Column[], data: object[], maxWidth: number = 80): string {\n        const numRows = 5;  // Number of rows as in `head(5)` from pandas\n        const top = data.slice(0, numRows);  // Get the top `numRows` rows\n\n        // Create a \"fake\" row number column\n        const rowNumbers = Array.from({ length: numRows }, (_, i) => (i + 1).toString());\n\n        // Extract column names and rows for the table\n        const columnNames = [''].concat(columns.map(col => col.name));\n        const rows = top.map((row, i) => [rowNumbers[i]].concat(columns.map(col => row[col.name]?.toString() || '')));\n\n        // Create and render the table with right alignment\n        const table = new Table(columnNames, rows, maxWidth, false, 'right'); // Right alignment\n        return table.render();\n    }\n\n    export function info(columns: Column[], data: object[], maxWidth: number = 80): string {\n        const numRows = data.length;\n        const output: string[] = [];\n\n        // Summary header\n        output.push('<class \\'pandas.core.frame.DataFrame\\'>');\n        output.push(`Index: ${numRows} entries, 0 to ${numRows - 1}`);\n        output.push(`Data columns (total ${columns.length} columns):\\n`);\n\n        // Column headers and details\n        const columnHeaders = ['#', 'Column', 'Non-Null Count', 'Dtype'];\n        const rows = columns.map((col, idx) => {\n            const nonNullCount = col.stats.nonNull.toString();\n            const dtype = typeMapping[col.type as TypeInference] || 'unknown';\n            return [idx.toString(), col.name, `${nonNullCount} non-null`, dtype];\n        });\n\n        // Create and render the table with left alignment and header underline\n        const table = new Table(columnHeaders, rows, maxWidth, true, 'left'); // Left alignment\n        output.push(table.render());\n\n        // Memory usage estimation\n        const memoryUsage = columns.reduce((total, col) => {\n            const exampleValue = data.find(row => row[col.name] != null)?.[col.name];\n            if (exampleValue == null) return total;\n\n            const size = new Blob([exampleValue.toString()]).size;\n            return total + (size * numRows);\n        }, 0);\n\n        output.push(`\\ndtypes: ${columns.filter(col => col.type === 'number').length} float64, ` +\n            `${columns.filter(col => col.type === 'integer').length} int64, ` +\n            `${columns.filter(col => col.type === 'string').length} object`);\n\n        output.push(`memory usage: ${(memoryUsage / 1024).toFixed(1)} KB`);\n\n        return output.join('\\n');\n    }\n}\n"
  },
  {
    "path": "packages/data-inference/test/index.ts",
    "content": "import * as DataInference from '../src/index';\n\ndeclare const vega: any;\ndeclare const hljs: any;\n\nconst test = {\n    display: (pandasHead: string, pandasInfo?: string, columnsJson?: string, highlight?: boolean) => {\n        document.getElementById('pandasHead')!.innerHTML = pandasHead;\n        document.getElementById('pandasInfo')!.innerHTML = pandasInfo || '';\n        document.getElementById('columnsJson')!.innerHTML = columnsJson || '';\n        if (highlight) {\n            hljs.highlightAll();\n        }\n    },\n    loadObjectArray: (data: object[]) => {\n        const columns = DataInference.getColumnsFromData(vega.inferTypes, data);\n        const columnsJson = JSON.stringify(columns, null, 2);\n        const pandasHead = DataInference.pandasSimulation.head(columns, data);\n        const pandasInfo = DataInference.pandasSimulation.info(columns, data);\n        test.display(pandasHead, pandasInfo, columnsJson, true);\n    },\n    loadText: ({ url, format }) => {\n        test.display('Loading...');\n        vega.loader().load(url).then(function (text) {\n            const data = vega.read(text, format);\n            test.loadObjectArray(data);\n        });\n    },\n};\n\ndocument.getElementById('selectData')!.addEventListener('change', function (event) {\n    test.loadText(JSON.parse((event.target as HTMLSelectElement).value));\n});\n\ntest.loadText({ url: 'https://microsoft.github.io/SandDance/sample-data/titanicmaster.tsv', format: { type: 'tsv' } });\n"
  },
  {
    "path": "packages/data-inference/test/pandas.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import pandas as pd\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>Name</th>\\n\",\n       \"      <th>Miles_per_Gallon</th>\\n\",\n       \"      <th>Cylinders</th>\\n\",\n       \"      <th>Displacement</th>\\n\",\n       \"      <th>Horsepower</th>\\n\",\n       \"      <th>Weight_in_lbs</th>\\n\",\n       \"      <th>Acceleration</th>\\n\",\n       \"      <th>Year</th>\\n\",\n       \"      <th>Origin</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>chevrolet chevelle malibu</td>\\n\",\n       \"      <td>18.0</td>\\n\",\n       \"      <td>8</td>\\n\",\n       \"      <td>307.0</td>\\n\",\n       \"      <td>130.0</td>\\n\",\n       \"      <td>3504</td>\\n\",\n       \"      <td>12.0</td>\\n\",\n       \"      <td>1970-01-01</td>\\n\",\n       \"      <td>USA</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>buick skylark 320</td>\\n\",\n       \"      <td>15.0</td>\\n\",\n       \"      <td>8</td>\\n\",\n       \"      <td>350.0</td>\\n\",\n       \"      <td>165.0</td>\\n\",\n       \"      <td>3693</td>\\n\",\n       \"      <td>11.5</td>\\n\",\n       \"      <td>1970-01-01</td>\\n\",\n       \"      <td>USA</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>plymouth satellite</td>\\n\",\n       \"      <td>18.0</td>\\n\",\n       \"      <td>8</td>\\n\",\n       \"      <td>318.0</td>\\n\",\n       \"      <td>150.0</td>\\n\",\n       \"      <td>3436</td>\\n\",\n       \"      <td>11.0</td>\\n\",\n       \"      <td>1970-01-01</td>\\n\",\n       \"      <td>USA</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>amc rebel sst</td>\\n\",\n       \"      <td>16.0</td>\\n\",\n       \"      <td>8</td>\\n\",\n       \"      <td>304.0</td>\\n\",\n       \"      <td>150.0</td>\\n\",\n       \"      <td>3433</td>\\n\",\n       \"      <td>12.0</td>\\n\",\n       \"      <td>1970-01-01</td>\\n\",\n       \"      <td>USA</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>ford torino</td>\\n\",\n       \"      <td>17.0</td>\\n\",\n       \"      <td>8</td>\\n\",\n       \"      <td>302.0</td>\\n\",\n       \"      <td>140.0</td>\\n\",\n       \"      <td>3449</td>\\n\",\n       \"      <td>10.5</td>\\n\",\n       \"      <td>1970-01-01</td>\\n\",\n       \"      <td>USA</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                        Name  Miles_per_Gallon  Cylinders  Displacement  \\\\\\n\",\n       \"0  chevrolet chevelle malibu              18.0          8         307.0   \\n\",\n       \"1          buick skylark 320              15.0          8         350.0   \\n\",\n       \"2         plymouth satellite              18.0          8         318.0   \\n\",\n       \"3              amc rebel sst              16.0          8         304.0   \\n\",\n       \"4                ford torino              17.0          8         302.0   \\n\",\n       \"\\n\",\n       \"   Horsepower  Weight_in_lbs  Acceleration        Year Origin  \\n\",\n       \"0       130.0           3504          12.0  1970-01-01    USA  \\n\",\n       \"1       165.0           3693          11.5  1970-01-01    USA  \\n\",\n       \"2       150.0           3436          11.0  1970-01-01    USA  \\n\",\n       \"3       150.0           3433          12.0  1970-01-01    USA  \\n\",\n       \"4       140.0           3449          10.5  1970-01-01    USA  \"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Specify the path to the 'cars.json' file in your 'node_modules'\\n\",\n    \"file_path = '../node_modules/vega-datasets/data/cars.json'\\n\",\n    \"\\n\",\n    \"# Load the JSON data into a DataFrame\\n\",\n    \"df = pd.read_json(file_path)\\n\",\n    \"\\n\",\n    \"# Display the first few rows of the DataFrame\\n\",\n    \"df.head()\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class 'pandas.core.frame.DataFrame'>\\n\",\n      \"Index: 406 entries, 0 to 405\\n\",\n      \"Data columns (total 9 columns):\\n\",\n      \" #   Column            Non-Null Count  Dtype  \\n\",\n      \"---  ------            --------------  -----  \\n\",\n      \" 0   Name              406 non-null    object \\n\",\n      \" 1   Miles_per_Gallon  398 non-null    float64\\n\",\n      \" 2   Cylinders         406 non-null    int64  \\n\",\n      \" 3   Displacement      406 non-null    float64\\n\",\n      \" 4   Horsepower        400 non-null    float64\\n\",\n      \" 5   Weight_in_lbs     406 non-null    int64  \\n\",\n      \" 6   Acceleration      406 non-null    float64\\n\",\n      \" 7   Year              406 non-null    object \\n\",\n      \" 8   Origin            406 non-null    object \\n\",\n      \"dtypes: float64(4), int64(2), object(3)\\n\",\n      \"memory usage: 31.7+ KB\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"df.info()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>Miles_per_Gallon</th>\\n\",\n       \"      <th>Cylinders</th>\\n\",\n       \"      <th>Displacement</th>\\n\",\n       \"      <th>Horsepower</th>\\n\",\n       \"      <th>Weight_in_lbs</th>\\n\",\n       \"      <th>Acceleration</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>count</th>\\n\",\n       \"      <td>398.000000</td>\\n\",\n       \"      <td>406.000000</td>\\n\",\n       \"      <td>406.000000</td>\\n\",\n       \"      <td>400.000000</td>\\n\",\n       \"      <td>406.000000</td>\\n\",\n       \"      <td>406.000000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>mean</th>\\n\",\n       \"      <td>23.514573</td>\\n\",\n       \"      <td>5.475369</td>\\n\",\n       \"      <td>194.779557</td>\\n\",\n       \"      <td>105.082500</td>\\n\",\n       \"      <td>2979.413793</td>\\n\",\n       \"      <td>15.519704</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>std</th>\\n\",\n       \"      <td>7.815984</td>\\n\",\n       \"      <td>1.712160</td>\\n\",\n       \"      <td>104.922458</td>\\n\",\n       \"      <td>38.768779</td>\\n\",\n       \"      <td>847.004328</td>\\n\",\n       \"      <td>2.803359</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>min</th>\\n\",\n       \"      <td>9.000000</td>\\n\",\n       \"      <td>3.000000</td>\\n\",\n       \"      <td>68.000000</td>\\n\",\n       \"      <td>46.000000</td>\\n\",\n       \"      <td>1613.000000</td>\\n\",\n       \"      <td>8.000000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>25%</th>\\n\",\n       \"      <td>17.500000</td>\\n\",\n       \"      <td>4.000000</td>\\n\",\n       \"      <td>105.000000</td>\\n\",\n       \"      <td>75.750000</td>\\n\",\n       \"      <td>2226.500000</td>\\n\",\n       \"      <td>13.700000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>50%</th>\\n\",\n       \"      <td>23.000000</td>\\n\",\n       \"      <td>4.000000</td>\\n\",\n       \"      <td>151.000000</td>\\n\",\n       \"      <td>95.000000</td>\\n\",\n       \"      <td>2822.500000</td>\\n\",\n       \"      <td>15.500000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>75%</th>\\n\",\n       \"      <td>29.000000</td>\\n\",\n       \"      <td>8.000000</td>\\n\",\n       \"      <td>302.000000</td>\\n\",\n       \"      <td>130.000000</td>\\n\",\n       \"      <td>3618.250000</td>\\n\",\n       \"      <td>17.175000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>max</th>\\n\",\n       \"      <td>46.600000</td>\\n\",\n       \"      <td>8.000000</td>\\n\",\n       \"      <td>455.000000</td>\\n\",\n       \"      <td>230.000000</td>\\n\",\n       \"      <td>5140.000000</td>\\n\",\n       \"      <td>24.800000</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"       Miles_per_Gallon   Cylinders  Displacement  Horsepower  Weight_in_lbs  \\\\\\n\",\n       \"count        398.000000  406.000000    406.000000  400.000000     406.000000   \\n\",\n       \"mean          23.514573    5.475369    194.779557  105.082500    2979.413793   \\n\",\n       \"std            7.815984    1.712160    104.922458   38.768779     847.004328   \\n\",\n       \"min            9.000000    3.000000     68.000000   46.000000    1613.000000   \\n\",\n       \"25%           17.500000    4.000000    105.000000   75.750000    2226.500000   \\n\",\n       \"50%           23.000000    4.000000    151.000000   95.000000    2822.500000   \\n\",\n       \"75%           29.000000    8.000000    302.000000  130.000000    3618.250000   \\n\",\n       \"max           46.600000    8.000000    455.000000  230.000000    5140.000000   \\n\",\n       \"\\n\",\n       \"       Acceleration  \\n\",\n       \"count    406.000000  \\n\",\n       \"mean      15.519704  \\n\",\n       \"std        2.803359  \\n\",\n       \"min        8.000000  \\n\",\n       \"25%       13.700000  \\n\",\n       \"50%       15.500000  \\n\",\n       \"75%       17.175000  \\n\",\n       \"max       24.800000  \"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"df.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>Name</th>\\n\",\n       \"      <th>Class</th>\\n\",\n       \"      <th>Joined</th>\\n\",\n       \"      <th>Job</th>\\n\",\n       \"      <th>TicketCost</th>\\n\",\n       \"      <th>Age</th>\\n\",\n       \"      <th>Gender</th>\\n\",\n       \"      <th>Survived</th>\\n\",\n       \"      <th>Department</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>ALLEN, Miss Elisabeth Walton</td>\\n\",\n       \"      <td>1st Class Passenger</td>\\n\",\n       \"      <td>Southampton</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>214.0375</td>\\n\",\n       \"      <td>29.000000</td>\\n\",\n       \"      <td>Female</td>\\n\",\n       \"      <td>True</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>ALLISON, Mr Hudson Joshua Creighton</td>\\n\",\n       \"      <td>1st Class Passenger</td>\\n\",\n       \"      <td>Southampton</td>\\n\",\n       \"      <td>Businessman</td>\\n\",\n       \"      <td>151.8000</td>\\n\",\n       \"      <td>30.000000</td>\\n\",\n       \"      <td>Male</td>\\n\",\n       \"      <td>False</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>ALLISON, Mrs Bessie Waldo</td>\\n\",\n       \"      <td>1st Class Passenger</td>\\n\",\n       \"      <td>Southampton</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>151.8000</td>\\n\",\n       \"      <td>25.000000</td>\\n\",\n       \"      <td>Female</td>\\n\",\n       \"      <td>False</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>ALLISON, Miss Helen Loraine</td>\\n\",\n       \"      <td>1st Class Passenger</td>\\n\",\n       \"      <td>Southampton</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>151.8000</td>\\n\",\n       \"      <td>2.000000</td>\\n\",\n       \"      <td>Female</td>\\n\",\n       \"      <td>False</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>ALLISON, Master Hudson Trevor</td>\\n\",\n       \"      <td>1st Class Passenger</td>\\n\",\n       \"      <td>Southampton</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"      <td>151.8000</td>\\n\",\n       \"      <td>0.916667</td>\\n\",\n       \"      <td>Male</td>\\n\",\n       \"      <td>True</td>\\n\",\n       \"      <td>NaN</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"                                  Name                Class       Joined  \\\\\\n\",\n       \"0         ALLEN, Miss Elisabeth Walton  1st Class Passenger  Southampton   \\n\",\n       \"1  ALLISON, Mr Hudson Joshua Creighton  1st Class Passenger  Southampton   \\n\",\n       \"2            ALLISON, Mrs Bessie Waldo  1st Class Passenger  Southampton   \\n\",\n       \"3          ALLISON, Miss Helen Loraine  1st Class Passenger  Southampton   \\n\",\n       \"4        ALLISON, Master Hudson Trevor  1st Class Passenger  Southampton   \\n\",\n       \"\\n\",\n       \"           Job  TicketCost        Age  Gender  Survived Department  \\n\",\n       \"0          NaN    214.0375  29.000000  Female      True        NaN  \\n\",\n       \"1  Businessman    151.8000  30.000000    Male     False        NaN  \\n\",\n       \"2          NaN    151.8000  25.000000  Female     False        NaN  \\n\",\n       \"3          NaN    151.8000   2.000000  Female     False        NaN  \\n\",\n       \"4          NaN    151.8000   0.916667    Male      True        NaN  \"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Specify the path to the 'cars.json' file in your 'node_modules'\\n\",\n    \"file_path = '../../../docs/sample-data/titanicmaster.tsv'\\n\",\n    \"\\n\",\n    \"# Load the JSON data into a DataFrame\\n\",\n    \"df2 = pd.read_csv(file_path, delimiter='\\\\t')\\n\",\n    \"\\n\",\n    \"# Display the first few rows of the DataFrame\\n\",\n    \"df2.head()\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class 'pandas.core.frame.DataFrame'>\\n\",\n      \"RangeIndex: 2207 entries, 0 to 2206\\n\",\n      \"Data columns (total 9 columns):\\n\",\n      \" #   Column      Non-Null Count  Dtype  \\n\",\n      \"---  ------      --------------  -----  \\n\",\n      \" 0   Name        2207 non-null   object \\n\",\n      \" 1   Class       2207 non-null   object \\n\",\n      \" 2   Joined      2207 non-null   object \\n\",\n      \" 3   Job         1586 non-null   object \\n\",\n      \" 4   TicketCost  2207 non-null   float64\\n\",\n      \" 5   Age         2207 non-null   float64\\n\",\n      \" 6   Gender      2207 non-null   object \\n\",\n      \" 7   Survived    2207 non-null   bool   \\n\",\n      \" 8   Department  950 non-null    object \\n\",\n      \"dtypes: bool(1), float64(2), object(6)\\n\",\n      \"memory usage: 140.2+ KB\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"df2.info()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.11.9\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "packages/data-inference/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/fluentui-icons/README.md",
    "content": "# @msrvida/fluentui-icons\n\nA subset of [FluentUI icons](https://aka.ms/uifabric-icons) for use in MSRVida data visualization applications.\n"
  },
  {
    "path": "packages/fluentui-icons/config/fabric-icons.json",
    "content": "{\n  \"fontName\": \"fabric-icons\",\n  \"fontFamilyName\": \"FabricMDL2Icons\",\n  \"excludeGlyphs\": false,\n  \"excludeThirdPartyIcons\": false,\n  \"chunkSubsets\": false,\n  \"hashFontFileName\": true,\n  \"glyphs\": [\n    {\n      \"name\": \"Accept\",\n      \"unicode\": \"E8FB\"\n    },\n    {\n      \"name\": \"Add\",\n      \"unicode\": \"E710\"\n    },\n    {\n      \"name\": \"BIDashboard\",\n      \"unicode\": \"F543\"\n    },\n    {\n      \"name\": \"Camera\",\n      \"unicode\": \"E722\"\n    },\n    {\n      \"name\": \"Cancel\",\n      \"unicode\": \"E711\"\n    },\n    {\n      \"name\": \"ChevronDown\",\n      \"unicode\": \"E70D\"\n    },\n    {\n      \"name\": \"ChevronLeftMed\",\n      \"unicode\": \"E973\"\n    },\n    {\n      \"name\": \"ChevronRightMed\",\n      \"unicode\": \"E974\"\n    },\n    {\n      \"name\": \"Clear\",\n      \"unicode\": \"E894\"\n    },\n    {\n      \"name\": \"ClearFilter\",\n      \"unicode\": \"EF8F\"\n    },\n    {\n      \"name\": \"ClearNight\",\n      \"unicode\": \"E9C2\"\n    },\n    {\n      \"name\": \"CloudDownload\",\n      \"unicode\": \"EBD3\"\n    },\n    {\n      \"name\": \"Color\",\n      \"unicode\": \"E790\"\n    },\n    {\n      \"name\": \"Copy\",\n      \"unicode\": \"E8C8\"\n    },\n    {\n      \"name\": \"CubeShape\",\n      \"unicode\": \"F1AA\"\n    },\n    {\n      \"name\": \"Delete\",\n      \"unicode\": \"E74D\"\n    },\n    {\n      \"name\": \"Diamond\",\n      \"unicode\": \"ED02\"\n    },\n    {\n      \"name\": \"DiamondSolid\",\n      \"unicode\": \"F34C\"\n    },\n    {\n      \"name\": \"DoubleChevronLeft12\",\n      \"unicode\": \"EE98\"\n    },\n    {\n      \"name\": \"DoubleChevronRight12\",\n      \"unicode\": \"EE99\"\n    },\n    {\n      \"name\": \"Download\",\n      \"unicode\": \"E896\"\n    },\n    {\n      \"name\": \"Edit\",\n      \"unicode\": \"E70F\"\n    },\n    {\n      \"name\": \"Filter\",\n      \"unicode\": \"E71C\"\n    },\n    {\n      \"name\": \"Filters\",\n      \"unicode\": \"E795\"\n    },\n    {\n      \"name\": \"FiltersSolid\",\n      \"unicode\": \"F353\"\n    },\n    {\n      \"name\": \"Flow\",\n      \"unicode\": \"EF90\"\n    },\n    {\n      \"name\": \"History\",\n      \"unicode\": \"E81C\"\n    },\n    {\n      \"name\": \"HourGlass\",\n      \"unicode\": \"EA03\"\n    },\n    {\n      \"name\": \"More\",\n      \"unicode\": \"E712\"\n    },\n    {\n      \"name\": \"Next\",\n      \"unicode\": \"E893\"\n    },\n    {\n      \"name\": \"OpenInNewWindow\",\n      \"unicode\": \"E8A7\"\n    },\n    {\n      \"name\": \"Page\",\n      \"unicode\": \"E7C3\"\n    },\n    {\n      \"name\": \"Pause\",\n      \"unicode\": \"E769\"\n    },\n    {\n      \"name\": \"Photo2Add\",\n      \"unicode\": \"ECAB\"\n    },\n    {\n      \"name\": \"Photo2Remove\",\n      \"unicode\": \"ECAC\"\n    },\n    {\n      \"name\": \"PicturePosition\",\n      \"unicode\": \"F524\"\n    },\n    {\n      \"name\": \"Pin\",\n      \"unicode\": \"E718\"\n    },\n    {\n      \"name\": \"Pinned\",\n      \"unicode\": \"E840\"\n    },\n    {\n      \"name\": \"PlayResume\",\n      \"unicode\": \"F2C6\"\n    },\n    {\n      \"name\": \"PlayReverseResume\",\n      \"unicode\": \"F3E4\"\n    },\n    {\n      \"name\": \"Previous\",\n      \"unicode\": \"E892\"\n    },\n    {\n      \"name\": \"RadioBtnOff\",\n      \"unicode\": \"ECCA\"\n    },\n    {\n      \"name\": \"RadioBtnOn\",\n      \"unicode\": \"ECCB\"\n    },\n    {\n      \"name\": \"RadioBullet\",\n      \"unicode\": \"E915\"\n    },\n    {\n      \"name\": \"Redo\",\n      \"unicode\": \"E7A6\"\n    },\n    {\n      \"name\": \"RemoveFilter\",\n      \"unicode\": \"EB08\"\n    },\n    {\n      \"name\": \"ScaleVolume\",\n      \"unicode\": \"F18C\"\n    },\n    {\n      \"name\": \"Search\",\n      \"unicode\": \"E721\"\n    },\n    {\n      \"name\": \"Settings\",\n      \"unicode\": \"E713\"\n    },\n    {\n      \"name\": \"SortDown\",\n      \"unicode\": \"EE69\"\n    },\n    {\n      \"name\": \"SortUp\",\n      \"unicode\": \"EE68\"\n    },\n    {\n      \"name\": \"Sunny\",\n      \"unicode\": \"E9BD\"\n    },\n    {\n      \"name\": \"Table\",\n      \"unicode\": \"ED86\"\n    },\n    {\n      \"name\": \"Undo\",\n      \"unicode\": \"E7A7\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/fluentui-icons/css/fabric-icons-inline.css",
    "content": "/*\n  Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fabric-assets-license\n*/\n@font-face {\n  font-family: 'FabricMDL2Icons';\n  src: url('data:application/octet-stream;base64,d09GRgABAAAAABuQAA4AAAAAMIgABKj2AAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEgAAABgMVN8b2NtYXAAAAGMAAABEAAAArIn/BeDY3Z0IAAAApwAAAAgAAAAKgnZCa9mcGdtAAACvAAAAPAAAAFZ/J7mjmdhc3AAAAOsAAAADAAAAAwACAAbZ2x5ZgAAA7gAABITAAAepM100RhoZWFkAAAVzAAAADIAAAA2BVACQGhoZWEAABYAAAAAFQAAACQQAQgDaG10eAAAFhgAAABQAAAAchoOED5sb2NhAAAWaAAAAHAAAABw0ZDZvG1heHAAABbYAAAAHQAAACAAWQIibmFtZQAAFvgAAAP3AAAJ+pKX8lVwb3N0AAAa8AAAABQAAAAg/1EArnByZXAAABsEAAAAiQAAANN4vfIOeJxjYGH/xDiBgZWBgXUWqzEDA6M0hGa+yJDGJMTBysrFyMQIBgxAIMCAAL7BCgoMDs95vzpzgPkQkgGsjgXCU2BgAAD3EghqeJxjYGBgZoBgGQZGIMnAuAbIYwTzWRgnAOkEBgcGVgaF57zP+Z8LPhd6Lvxc4rnMc6Xnvs8zn094PvX5sufLnx9+IfPC4cWUF9NeLH9x4sXvl6IvS17ufXnoFfNrjteX36x+s+bNqTen3zK9bXuX+W7m+/73Ez72fFz16dhnn8/Bn598Vfnq/P8/AwPYBgG4DYpYbJiEZEMxDhsy3s3AboPEF4nfEp8kvkp8lHgr8QoID0jMl6iTqJLIkciU8BN/K35ZvEm8UbxQPFBcXpxNbKVYolismJyohIi/cKVwuXCMcJSwqtAiwYOCkwXmC8zlW8zXxpvN85znPk8AtyDXZ0jo0RYwstHejsEOAFLcpEl4nGPQYghlKGBoYFjFyMDYwOzAeIDBAYsIEAAAqhwHlXicXY+/TsNADMZzJLSEJ0A6IZ11KkOViJ3phksk1CUlDOelgNRKpO+AlIXFA8/ibhnzYgjMEf4utr/P+ny/c6f5yXx2nKVHKilWnDfhoNQLDurtmf35IU/vNmVhTNV5VvdlwWoJomtOF/VNsGjI0PWWTG0eH7acLWKXxY7w0nDShk7qbQB2qL/HHeJVPJLFI4QS30/xfYxL+rUsVobTiyasA/des/OoAUzFYxN49BoQf8ikP3VnE+NsOWXbwE5zgkSfygL3RJqE+0uPf/Wgkv+G+23Iv6tB9U3c9Bb0h2HBgrChl2fbUAkaYPkOhPxkxgABAAIACAAK//8AD3icnVh7cFRVmj/ffaYREm46SedFwk2nuwkhCelOp8E86EQSeSwkBgapboMwCktQMrqKGEDngKPgBHFMZtx1YLWUCZY7o7vrc2uYXdupLXGmZsQdtsbaSu38oQKzs+Jzq5TOvSf7nXNvd5rglu509+3zuOfxnfO9ft9HJHKKEOV76j1EJjohMcM0AqZhnpL/YL0qvWqvIeo96e//UFlP8APECxf0S1oDUbHh80AM9PGE5bW8CXlca8CafClh7cZx+MnDL7kGxxWbht8wo6YRMfKIFadWXE5RxS3llBXH8Z+Tz/V5+jw+3gO6B0K4tgd8SlJ6MWGvs9clpBft9QnpJemlhEKuaNrrcQhupxCNaHpaT5MYuYscJsdx56KS4iKtWJUDmu5V5RrNXxP0ywFvMIRdLcFoS2s04FVbY9gVbo2ESyI4qMQX8EInRFuCoVhIbYSQN6Q3gr9G00O6Nx/0gO7Lh+KiEp/uC1SBT/bFqiASbo35YnInxNQYhKuk4qJ8yV/TKEVbOiVvuBPLRmznY3+VpH0BAPJT7N3S8pXs4NOeQg/+nmYHV5aXsnefAhmA2U9BHb6F72bewnfxLdQ9xY5IiiJ9uIl9Wt0VXPHOD31LfaVNpePvrAjGF7JPN33ovIWCq99CwSZrbP3DO9radjy8PlPGtq6qq1u1NeaWSu3/jxg79yDsP3Ev3DG73YdXkpr79ipSpV25ZPHSpjmEiZJIBH95RKOkkoSRtwYyM2Tmy/VgmKEYChdevM/shIieL+tmCDlndMIKMKtkXx6Jrz/UxAorNw6NdMVtSqlE410jQxsr4aOmQ+vjpTUVvrn2XQWV9w8M3F9ZID0y11dRU6oRi17X0XZzd61E4nGJ1Hbf3NZx3Whe6YLaovq+YcM6Zgz31RfVLijN4+KO9BGaR3SKWlTApR7pMiCqmk4lj9iE4aPTy6howJWNTtrEmpQDMpmkAZvYAWlSJviCylSnCiVeEiJtuNIsiTK/pg2kotFfVORvrHBLueLrOhSa0/hGJZ5XokBUqhPHbkDE8CNPDAlvF4+gkzTqI38yd+PYA5X0cN6BDoaKyqlr/OuvCQXxiyyLVUlKJNypoMYoXGN0s5ibDdSs1lhrbSTsK/GVKAR2J9huZWl///pjx15LnX3hmScfODTY1FOyf9GzH0DJ4/vPn/nJnnh8z0/OnN9/6H/OPReDOkaosahky/3fg8aTZ1OvHTumEXuSjSVgTEremTorutb3L49t3/5wz+M31Dz22Qtb+fwPDjhrrX7on++mEmEfLexYcF9yy7f5xkTYnMy58kkRqSD13OZoOqjchHCBBDQRHinQKIegU86YAT2PhJemJ+3DT6qBpQe6e/Ylo5d7dz3hV5azyamlsHpOQ3ygUWVljbXF5vK19cHlzUvKtH/sPoBznpRGcE44mtw3dY//iV3KtRBIXzPQOBBvmCO/V7akeXmwfu1ys7i2sSznzv1oEbkUKSglCtca4IYw2hKDRrRzncpsE6XGt7184uBN4fBNB0+8vO2+81utj73l5UGvPL9vo9O393cnkskTv9vrlnge0e1M29hnfeINlpd7ZWPr+fucvimSM1yUwoOQrL5wGq/jkoGuJ2b6VDNk6lj9OmsKYW7hxWla88iXRApQ6VUKEyxA7VcpC+iow7tOj/b3j57elSn7ju7s6Nh5tM8t7UfLg0htMOiILOWfKaLQ3Cm8tGjOJFHKVMzDh181TiV4FLzvajxNA2kmUbIcT+Q3OP0mP4Dhj5r8FBGusgugToqaYBpFJdhGT+Q3IuA+OqFVLb2LLLKot6UKBY9rHVCudxKxCFCGKjaFuyukPGgjyeA+Gk3H+RQ+WU1RmtFYSqdJOs5pTSm4gPMQTm5GRprJLWQvGSVPkZfIGS4tSpVUWFwk5UuKe/eKe+9uu7BTqvXOaKrCucE1N+JwTHG4M8syzW67pTsHuXvle3lWWyGPgPbB6QdXr37w9Acs/Uh0sKfOW1lT6a3r2dISbIu2tK9Zyvv4a1CP5doBp87vAsdF2taE+4/ubBdzsY/NNnFwfFaHNHvE9lnt87PaecSl8RGW5hTX9QxGm1e3t0Tbgi1bslQPRt0DfUlzyXTqfCUxrn3n0f7mtW0RnMv7VDLbGMNVPewqgz79DcYQGTIyXE/ayVrH9ywAoW2OGBsZdhiORHPuQZRbaYf/2AUtrTFETKaYZGpCIGsMs8Lg20yjSA9Go4O9i6aFm+ItmXKZzh6GtoXzSudZcd5QkBYuzHFlXlmJlRJkEz6bz3P0Qqa8PYVaa2flXaJyPLaldI6HN2xKAAGpV7PwXMGMJUQrHRI4z7XJrqNRlfjWF0/Qm8JD26zTCXll36bkiXf23D5x9OD1MIHIAT3E0N5R3QrfRE+8uPXh6W3WLxJyT9/ZO/a8cyLZdduRVQgtWHLZ0OC6WLXw5e59KljMc+2b1/SI0tDJZaokAxBgk6jTaKrUyXQgD2ECBC4nVbTglznmBoV4xRqcdrNRdmxfiQ99qGO/UX0UHxJvKmj5rj94dOJ2TsymPnllwjq9bcghdePo3qHtty7DS9LIqiO3dfFj3XG2Txxy2/TDzqGrY+sGh5bxg7o+W39Tf5PUkm7cOR83DqE/4wqJAF1HeB7jTs4HQa6bCHxjoAm6OIl4vc7l8in6m+aK6/rCNdXswXlzy5t7l7D77beONEjL2f0Nva/cMrAW9mvFwZgJx2LNzCifl8eKypYsaapYfluj9PTCGn1e4Rz47/JmtciMBYs19mCwf1HXri3fWgKH7DMNR6RlcKihd00Z7K+uae5bucK028rh4+ZYZXM5K55TOFc3F9o3N962rKKpYUkZfJiHbJABfY9OBHbRiIfzJWIgU0IGSgqFOAYndhUIACPjN02+UArtL75qHqIek88EDQUwjVGNFZfeczyJTSTP1EeSx4mbkIeX9EtXxzfyGAZM1u6EPGYNYxAlj2N8c0XTGsYhHEPBBnQyDXl877mEBFDpvDwAQ8oBEC422OP2eALOUTiHnkA+Zx+T/irBFqvPpW+E3zsYDBBX6tzgF3JJQm+EKuA3eMQnnK2GAyhbloS3JuhlqhJUS47vGJ0QnSj9NvpFalGUZi7XiHZxrWuIQXyuZKPDjngjoQB3a+LBhdGZMiIncenAxIRFpcA0sZOcYIayqBBlcioA6LgYficmgaRRgQBvUsSaAYw1L3EM6dwWSBSPKHlVbyI9DgFpOGF/pBYm0mMiNpVwpopfvOurMLNC+o4OtbcPHe3rH+XlqEpzGv38pVgDDpMy9aJ+ke8Z8PAIV1eHrTL54og1Jg+PYEVUrbER3K+MlGkj7liHn9LYiDyML+WLVlkZVnGKVWaVkTk8NhD3xTF9PWkiEcQ7bWQFYp7rr6Z2NsrxIiSQOb4uNjGeiJpe3EvSwRvCK/FBSE4NntzX27vv5GCm7L77xkjkxru7u/fcGA7fuOeQADUKcnIKbxnofvZpAubLTVCQYJ8kkzA/MfWXSfZJQiO5i/DSJji9O3c5mXMHV1IEUoLFOJl9av0bzoYCuSmJS1qVSVwf5U3lMqJ/iXgI8ac3XNspFUZbpFCVmsEVtYj4qwAcFCGFSpx+vUSh6BbfP/3Q6pVd9E9vPXNX5+qHTr+PvvT7LH0xtbK6Q64+cP7MyT3x/sfeRgNy6J/eY5cfo9AjET4OtEceBHLX/MTR1979/CC6X77QqsNv3KsoDL3syTPnDxyZ/o+/ixx/Zox9/PnZv91u0COc99xWc/2gIp5BGfKi9AZ46ObqKsoCKhDaZERZPASBMTacgHEYT7BhGMOIhId2lNsM8F7Rz/hYvA++Pse7UcRaIk7AQNXJJWCMioY1guyNoPPslGNOAgLDBrTwCBqLuU/FIAhjCBPlAQfz8XwFwEWKTX57eJeNaIU62qtXrtvUHKivDzRvWreyur0DdRl7F65cuylcu2SmV0Nt3rRqQWv5tckV5hQ1VySvLW9dsGpTtk+Z6dPJrl9tbljT0eIz2hYvbjN8LR1rGjb/ahel2N+0uj1carRf2W+TgXv9+RXeRUMjh3t7D48MLfJW5PvvHfjKXuFrdojYfhW5Ae+mSubqUA/RSFYTNN3xfHowoxVtUOzPAkhfpyzirRhPSqEz1AY3P3Fn1/UjJwfjcVcLugv9xpz19/zNxt5DuzeWrd2QUX48xM9Hb7hh9Oe7GpsW7TpwdHXyuUdvZ13IvnPsXGKcKtPampEnNw+eHLmeCm3A5RRl46ND7Yv/4rZuf8aOUL4CX8nT8e2ewLLtxywNmX8OGhJj0oQbKz6g2zrPifmEDSDI1UgmgAGfHtJDsVDMF/OpukAHIfzjih7SIWKCbqjZeAN+/H7i/czPfrkr/QOdxONpkpLQbMJ1yT+egq4fsVfsipSacqMbqzxnyvtxlVrzu7rkO1jydYQbhP1L8r9OsZR04Q170qWV5zIcWuswmrmS1pyMnoc3RJPTWuxHLTHMGUoljDzwh17V+jHsmMIlaYbMVJIdt0lKnpihMeEMBYJFnB1PIpUY6WRo7ErCDiCcQjkbt1SgbdkwO16pbZS+OkLBUDcTBTcqHDrNjihctP5/BhBOUmDwp4/v27x06eZ9j/90MKc+G/O7q1wB8TMZhdxFtYVXLeXWr8ydVDhx/Dc76Z91sj/3BDmxJNq3ElJOqoiJuDHkZER0nnAIgUg5IGQ0wwgSS8CUEQebXo/Ci5AJ/jxSYMULq6sLrXiBB2helaFQoyoPqMf6Efv9b6RfWg+w38Ktv7H/KO1mf4AP4Rb7WqkB668A3Mp+ayspX+EU9fkUWugrLJBovmHk27RAamR4ifyxqV0i/cm6U36Ul1TcLEo4zWI6HVsFaPt9eNc8ihf0cz/A0U3UFXMMasok08h8IfOgPqBRvSzwC6PC0WKc7j7gPhxSpUV2TCYzsk5cJbGzTfHQ3H8q8Mk5QtTn9bTAnjrIfi/3TurzCfYCjmM/S8AluKTNS8ANX1q6LtqMwyH4d6Kpf6/bYp7I28sRL6gbk8zLCpMwgJNhg7QuwbxwCdfSpS9tDjclEiZlOsdDqkCuHPirAr8qY9Zj8ndGODSS3xbYiFf1YYGNZlASrwkZRqykvz2zDhIdECCYD7AQKn3Hesyudaq4hn6Rw6YZACVqwkc7OSPicokIjOkHv+BEBCIZZqjIBZvey1acsbF2L7xxxsLL51hWF5ds4XVz0yQjInLYxP+FXZnJ4VZw3jvZW462xbo+PWunyVUp3UDywoXk+fPiPye72xpws7uTmZf472RGhV7nIYIuz0gbmDw36jfqJPxDfG4iwnNiU/FETYgF3EOiUE/CQII9j5KscHzBnk/AAJucOsfFIcA43KA8mGQvJKwNMh5cQlrdQRJx38CG9PPOGrganwQbEnww3g/XGYH1S1E/diLvPBjDGhzr84in2KOIEsNYK2Wl5Lj9qHSndGf6LL96lT9npj5jN8PTSj48/QP2FnsLllk72etyM3RZZ+Vm9rp1lvOUC7gevzKmwnUxuEGhp2pqKkWl9+wqR2dsHpR9IXlEWIUxUSa+Lhf+1Cz+qiRFbhLDdDIW1EmizM5GKKlssmJKvMLDf1XOQaHZpISdkkQCAumqJK36By5+nEPySTH2oAQhPzEschjpkUxuAbHBjWANfAbPavAzuxPIL1mH9K/syR54Fj6zdrNfTxOmw260gVot01H/v4WWUKFTZwzl13i/xNr7D8ryqVf1NcjUbfkGl3IjH3dOYdRKc+NaP+eR7OHxaTol4tqZ+JRHtqrH/oKHtiQvK4+yyFWUoQUMoEQ2O1qG0blehnYjYsgi2+qAAa7CesgrQBeganhkrhqSyDBiqMeOp1JSRSDj39nBJA+gkxMTyWm0ackJO3nqVHJaxNTYxLrG58GON6QkOn37AreRWSQRSIIYlZ4vpiRPyZ/gQiBM5bRYlGdY3Lh0ti2/i3yXjJK/Jifd06CMqbPKTH+gJBuLtUMslA/cd5XkxmfZpIdIXFbiwXMSIZFsMBeCcCvCeMSuiPFB/EdEzxX9OXVJpHZ5WEXdylSmomYq7JKXyx6XU/hFeW9gcd00yfbwcnEdkNlDYPaQ9AaXJZp7u8GpC25FyvSgtFE0jAjBULhQnZECGX0XRu7jdYszS2lztS3lld5pMtPFSy+Qq8bA7DH27gxvZzLpLFub4Tz5X7oQ0KMAeJxjYGRgYGBZ8W1igahBPL/NVwZuDgYQ2P/3YAOIvmfgdQZEczCAxTkZmEAUAE1pCdgAAHicY2BkYOBgAAE4yciACpgAAsoAHQAAAHicY9ViWMbBwCDMwMDwmYGNAQQamBoYYADIYmxgBNKMLEAWEDIIMwaDxYWZGhjbmSSBbFYgD6EDrIvxMuMVBiMGSTgfCBlkGA6AOACflgxrAAAAFgAqAEIAZAFUAaQByAIcAjICngLsAzwDpAP+BQYFcgWuBdAGDAZ6BpYGsgbUBvQHGgdMB2QHhgecB7IILAiECLQJQgm0CgoKWgrQCyQLgAvWC/IMDgwyDFYMhgy8DRANQA1eDaQN5g4EDmYPUnicY2BkYGAwZzjBwMsAAoxgkguEGSNBTAAdRwF9AAAAeJy1VD+LHDcUf3u79l1wfARDwKWKEM7HMmtfzJnY1WHHla85mwM3Ae2MdkZ4diQkjYcxLlK6yMdIY8inCAmkTJ1PkDpVyrz3pNnb827MJZAdRvPT0/v7e08LALdHX8II4u8rfCMewS3cRbwDu/BNwmOUP0t4gvjbhK/Bp2ATvg6fwduEd+Fr+D7hPfgcfkn4BhzC7wnfHP08miS8D4c7v2KU0eQT3BU7fyY8gi/G5wnvwP74TcJjlL9LeIL4x4Svwe3xbwlfBzH+I+FdcJO9hPfgcDL4uQEvJj8kfHP8bvJXwvvwYu+7n96Lo7v3HohTnTvjzSKIx8ZZ42TQpsnESV2LM11WwYsz5ZV7rYrsqZw7nYvTJ8+OxIn3KvgzVba1dJsHm5Jz5Tx6Fvez4+N4Sofx7LkqjRLaCymCk4VaSvdKmIUIlVrLr3SmtSTOzdLKRiufbU2+CsE+nM26rsuWw3mGNrPQW1M6aat+tjBN8LMLc99aW2tVCDrIxEvTiqXsResVJoGJkVgEI3KnZFBTUWhva9lPhWwKYZ3G0xxVFH6lF1a5pQ4B3c17LqLWuWrIFx54YdwAFhRhulmqdaZo8zAVxDzaTslmCKAb0VU6r9Yy6zCobvK6LbBNq+xNU/fiQN8RajnHXC7U0cPHsmX1QjelcMoH7BSxehGAzFe+HjEDBxqjBLWkFjiNUQvTNbWRxWX2ZKRKOSrHYChc22DbIApFZZJOpWp7mVEcxqZP6tQQdIj8VHquMefs6t2G9yDgCO7CPXiA6BQ05ODAgMd3AQFljxE5vPO0SpRoRA1keHICNT4CzlBWQoVnnncKvwq1X+NaoOZTtJvjnnxTjCf4z3LE9p41yY6sSmjRn0TNq1hcReec8/ApZwH3MZtjfNZtB8t1u+ecjcFVoA5VJfENzECB0iVn+QplxBKdVKy7jb+S9y0yOGjn+F3iXmJOmtnK/gXzxHNA6UOY4dPxk6G/D+2zFGeGuGcvJfux6KFH6YK9UbWzrdE952yxI5r7KFYW1PuXXJNgJnr8tsxdZCIyNmiTzHDVDjWoDgVT3BesZ7njPUuID4pjuTPRNk9eVNpL9m25r1Rz4DOymnMeQydqroishryihecuuA3JYlXD9Epdtbwv0CbH/ZT5ijMf405XcT6sQPMkdsxTjut2zrpUKWnnWE3Lc1ds5Z5sakYHqH8HvzSh88TLNu8xh//K7YX3gj2VKHM8xyHdqWFWt1UwRN/M69HaDFAlsZbA8YZbQP5jrQVKOq7c8K382OzJS1OluC8mrbGqiFu+WS1bUrZDNwc/pFnzTf7nGY3/jE3qzIX34YboxDLND+U7Z6Zjb/+Hu/03hsc4mgB4nGNgZgCD/34M5QyYwBwAKWEB/3ic28CgzbCJkZNJm3ETF4jcztWaG2qrysChvZ07NdhBTwbE4onwsNCQBLF4nc215YVBLD4dFRkRHhCLX05CmI8DxBLg4+FkZwGxBMEAxBLaMKEgwADIYtjOCDeaCW40M9xoFrjRrHCj2eQkoUazw43mgBvNCTd6kzAju/YGBgXX2kwJFwDEASgaAAAA') format('truetype');\n}\n\n.ms-Icon {\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  display: inline-block;\n  font-family: 'FabricMDL2Icons';\n  font-style: normal;\n  font-weight: normal;\n  speak: none;\n}\n\n.ms-Icon--Accept:before { content: \"\\E8FB\"; }\n.ms-Icon--Add:before { content: \"\\E710\"; }\n.ms-Icon--BIDashboard:before { content: \"\\F543\"; }\n.ms-Icon--Camera:before { content: \"\\E722\"; }\n.ms-Icon--Cancel:before { content: \"\\E711\"; }\n.ms-Icon--ChevronDown:before { content: \"\\E70D\"; }\n.ms-Icon--ChevronLeftMed:before { content: \"\\E973\"; }\n.ms-Icon--ChevronRightMed:before { content: \"\\E974\"; }\n.ms-Icon--Clear:before { content: \"\\E894\"; }\n.ms-Icon--ClearFilter:before { content: \"\\EF8F\"; }\n.ms-Icon--ClearNight:before { content: \"\\E9C2\"; }\n.ms-Icon--CloudDownload:before { content: \"\\EBD3\"; }\n.ms-Icon--Color:before { content: \"\\E790\"; }\n.ms-Icon--Copy:before { content: \"\\E8C8\"; }\n.ms-Icon--CubeShape:before { content: \"\\F1AA\"; }\n.ms-Icon--Delete:before { content: \"\\E74D\"; }\n.ms-Icon--Diamond:before { content: \"\\ED02\"; }\n.ms-Icon--DiamondSolid:before { content: \"\\F34C\"; }\n.ms-Icon--DoubleChevronLeft12:before { content: \"\\EE98\"; }\n.ms-Icon--DoubleChevronRight12:before { content: \"\\EE99\"; }\n.ms-Icon--Download:before { content: \"\\E896\"; }\n.ms-Icon--Edit:before { content: \"\\E70F\"; }\n.ms-Icon--Filter:before { content: \"\\E71C\"; }\n.ms-Icon--Filters:before { content: \"\\E795\"; }\n.ms-Icon--FiltersSolid:before { content: \"\\F353\"; }\n.ms-Icon--Flow:before { content: \"\\EF90\"; }\n.ms-Icon--History:before { content: \"\\E81C\"; }\n.ms-Icon--HourGlass:before { content: \"\\EA03\"; }\n.ms-Icon--More:before { content: \"\\E712\"; }\n.ms-Icon--Next:before { content: \"\\E893\"; }\n.ms-Icon--OpenInNewWindow:before { content: \"\\E8A7\"; }\n.ms-Icon--Page:before { content: \"\\E7C3\"; }\n.ms-Icon--Pause:before { content: \"\\E769\"; }\n.ms-Icon--Photo2Add:before { content: \"\\ECAB\"; }\n.ms-Icon--Photo2Remove:before { content: \"\\ECAC\"; }\n.ms-Icon--PicturePosition:before { content: \"\\F524\"; }\n.ms-Icon--Pin:before { content: \"\\E718\"; }\n.ms-Icon--Pinned:before { content: \"\\E840\"; }\n.ms-Icon--PlayResume:before { content: \"\\F2C6\"; }\n.ms-Icon--PlayReverseResume:before { content: \"\\F3E4\"; }\n.ms-Icon--Previous:before { content: \"\\E892\"; }\n.ms-Icon--RadioBtnOff:before { content: \"\\ECCA\"; }\n.ms-Icon--RadioBtnOn:before { content: \"\\ECCB\"; }\n.ms-Icon--RadioBullet:before { content: \"\\E915\"; }\n.ms-Icon--Redo:before { content: \"\\E7A6\"; }\n.ms-Icon--RemoveFilter:before { content: \"\\EB08\"; }\n.ms-Icon--ScaleVolume:before { content: \"\\F18C\"; }\n.ms-Icon--Search:before { content: \"\\E721\"; }\n.ms-Icon--Settings:before { content: \"\\E713\"; }\n.ms-Icon--SortDown:before { content: \"\\EE69\"; }\n.ms-Icon--SortUp:before { content: \"\\EE68\"; }\n.ms-Icon--Sunny:before { content: \"\\E9BD\"; }\n.ms-Icon--Table:before { content: \"\\ED86\"; }\n.ms-Icon--Undo:before { content: \"\\E7A7\"; }\n"
  },
  {
    "path": "packages/fluentui-icons/css/fabric-icons.css",
    "content": "/*\n  Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fabric-assets-license\n*/\n@font-face {\n  font-family: 'FabricMDL2Icons';\n  src: url('../fonts/fabric-icons-4ac17eec.woff') format('woff');\n}\n\n.ms-Icon {\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  display: inline-block;\n  font-family: 'FabricMDL2Icons';\n  font-style: normal;\n  font-weight: normal;\n  speak: none;\n}\n\n.ms-Icon--Accept:before { content: \"\\E8FB\"; }\n.ms-Icon--Add:before { content: \"\\E710\"; }\n.ms-Icon--BIDashboard:before { content: \"\\F543\"; }\n.ms-Icon--Camera:before { content: \"\\E722\"; }\n.ms-Icon--Cancel:before { content: \"\\E711\"; }\n.ms-Icon--ChevronDown:before { content: \"\\E70D\"; }\n.ms-Icon--ChevronLeftMed:before { content: \"\\E973\"; }\n.ms-Icon--ChevronRightMed:before { content: \"\\E974\"; }\n.ms-Icon--Clear:before { content: \"\\E894\"; }\n.ms-Icon--ClearFilter:before { content: \"\\EF8F\"; }\n.ms-Icon--ClearNight:before { content: \"\\E9C2\"; }\n.ms-Icon--CloudDownload:before { content: \"\\EBD3\"; }\n.ms-Icon--Color:before { content: \"\\E790\"; }\n.ms-Icon--Copy:before { content: \"\\E8C8\"; }\n.ms-Icon--CubeShape:before { content: \"\\F1AA\"; }\n.ms-Icon--Delete:before { content: \"\\E74D\"; }\n.ms-Icon--Diamond:before { content: \"\\ED02\"; }\n.ms-Icon--DiamondSolid:before { content: \"\\F34C\"; }\n.ms-Icon--DoubleChevronLeft12:before { content: \"\\EE98\"; }\n.ms-Icon--DoubleChevronRight12:before { content: \"\\EE99\"; }\n.ms-Icon--Download:before { content: \"\\E896\"; }\n.ms-Icon--Edit:before { content: \"\\E70F\"; }\n.ms-Icon--Filter:before { content: \"\\E71C\"; }\n.ms-Icon--Filters:before { content: \"\\E795\"; }\n.ms-Icon--FiltersSolid:before { content: \"\\F353\"; }\n.ms-Icon--Flow:before { content: \"\\EF90\"; }\n.ms-Icon--History:before { content: \"\\E81C\"; }\n.ms-Icon--HourGlass:before { content: \"\\EA03\"; }\n.ms-Icon--More:before { content: \"\\E712\"; }\n.ms-Icon--Next:before { content: \"\\E893\"; }\n.ms-Icon--OpenInNewWindow:before { content: \"\\E8A7\"; }\n.ms-Icon--Page:before { content: \"\\E7C3\"; }\n.ms-Icon--Pause:before { content: \"\\E769\"; }\n.ms-Icon--Photo2Add:before { content: \"\\ECAB\"; }\n.ms-Icon--Photo2Remove:before { content: \"\\ECAC\"; }\n.ms-Icon--PicturePosition:before { content: \"\\F524\"; }\n.ms-Icon--Pin:before { content: \"\\E718\"; }\n.ms-Icon--Pinned:before { content: \"\\E840\"; }\n.ms-Icon--PlayResume:before { content: \"\\F2C6\"; }\n.ms-Icon--PlayReverseResume:before { content: \"\\F3E4\"; }\n.ms-Icon--Previous:before { content: \"\\E892\"; }\n.ms-Icon--RadioBtnOff:before { content: \"\\ECCA\"; }\n.ms-Icon--RadioBtnOn:before { content: \"\\ECCB\"; }\n.ms-Icon--RadioBullet:before { content: \"\\E915\"; }\n.ms-Icon--Redo:before { content: \"\\E7A6\"; }\n.ms-Icon--RemoveFilter:before { content: \"\\EB08\"; }\n.ms-Icon--ScaleVolume:before { content: \"\\F18C\"; }\n.ms-Icon--Search:before { content: \"\\E721\"; }\n.ms-Icon--Settings:before { content: \"\\E713\"; }\n.ms-Icon--SortDown:before { content: \"\\EE69\"; }\n.ms-Icon--SortUp:before { content: \"\\EE68\"; }\n.ms-Icon--Sunny:before { content: \"\\E9BD\"; }\n.ms-Icon--Table:before { content: \"\\ED86\"; }\n.ms-Icon--Undo:before { content: \"\\E7A7\"; }\n"
  },
  {
    "path": "packages/fluentui-icons/fabric-icons.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>fabric-icons demo</title>\n  <link rel=\"stylesheet\" href=\"css/fabric-icons.css\">\n  <style>\n  * {\n    box-sizing: border-box;\n  }\n\n  html,\n  body {\n    padding: 0;\n    margin: 0;\n    color: #333333;\n    font-family: \"Segoe UI Regular WestEuropean\", \"Segoe UI\", Tahoma, Arial, sans-serif;\n    font-size: 14px;\n    font-weight: normal;\n  }\n\n  body {\n    padding: 0 20px;\n  }\n\n  .IconContainer {\n    font-size: 14px;\n    float: left;\n    margin: 0 5px 5px 0;\n    width: 50px;\n    height: 50px;\n    line-height: 51px;\n  }\n\n  .IconContainer-icon {\n    text-align: center;\n  }\n\n  .IconContainer-name,\n  .IconContainer-unicode {\n    display: none;\n  }\n  </style>\n</head>\n<body>\n  <h1 class=\"ms-font-su\">fabric-icons</h1>\n\n  <div class=\"Icons\">\n    \n    <div class=\"IconContainer\" title=\"Accept - E8FB\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Accept\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Accept\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E8FB\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Add - E710\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Add\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Add\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E710\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"BIDashboard - F543\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--BIDashboard\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        BIDashboard\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        F543\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Camera - E722\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Camera\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Camera\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E722\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Cancel - E711\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Cancel\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Cancel\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E711\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"ChevronDown - E70D\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--ChevronDown\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        ChevronDown\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E70D\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"ChevronLeftMed - E973\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--ChevronLeftMed\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        ChevronLeftMed\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E973\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"ChevronRightMed - E974\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--ChevronRightMed\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        ChevronRightMed\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E974\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Clear - E894\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Clear\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Clear\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E894\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"ClearFilter - EF8F\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--ClearFilter\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        ClearFilter\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EF8F\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"ClearNight - E9C2\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--ClearNight\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        ClearNight\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E9C2\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"CloudDownload - EBD3\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--CloudDownload\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        CloudDownload\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EBD3\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Color - E790\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Color\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Color\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E790\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Copy - E8C8\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Copy\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Copy\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E8C8\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"CubeShape - F1AA\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--CubeShape\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        CubeShape\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        F1AA\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Delete - E74D\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Delete\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Delete\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E74D\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Diamond - ED02\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Diamond\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Diamond\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        ED02\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"DiamondSolid - F34C\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--DiamondSolid\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        DiamondSolid\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        F34C\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"DoubleChevronLeft12 - EE98\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--DoubleChevronLeft12\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        DoubleChevronLeft12\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EE98\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"DoubleChevronRight12 - EE99\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--DoubleChevronRight12\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        DoubleChevronRight12\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EE99\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Download - E896\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Download\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Download\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E896\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Edit - E70F\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Edit\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Edit\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E70F\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Filter - E71C\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Filter\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Filter\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E71C\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Filters - E795\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Filters\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Filters\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E795\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"FiltersSolid - F353\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--FiltersSolid\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        FiltersSolid\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        F353\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Flow - EF90\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Flow\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Flow\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EF90\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"History - E81C\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--History\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        History\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E81C\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"HourGlass - EA03\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--HourGlass\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        HourGlass\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EA03\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"More - E712\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--More\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        More\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E712\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Next - E893\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Next\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Next\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E893\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"OpenInNewWindow - E8A7\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--OpenInNewWindow\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        OpenInNewWindow\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E8A7\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Page - E7C3\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Page\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Page\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E7C3\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Pause - E769\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Pause\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Pause\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E769\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Photo2Add - ECAB\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Photo2Add\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Photo2Add\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        ECAB\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Photo2Remove - ECAC\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Photo2Remove\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Photo2Remove\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        ECAC\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"PicturePosition - F524\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--PicturePosition\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        PicturePosition\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        F524\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Pin - E718\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Pin\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Pin\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E718\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Pinned - E840\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Pinned\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Pinned\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E840\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"PlayResume - F2C6\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--PlayResume\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        PlayResume\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        F2C6\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"PlayReverseResume - F3E4\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--PlayReverseResume\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        PlayReverseResume\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        F3E4\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Previous - E892\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Previous\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Previous\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E892\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"RadioBtnOff - ECCA\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--RadioBtnOff\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        RadioBtnOff\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        ECCA\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"RadioBtnOn - ECCB\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--RadioBtnOn\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        RadioBtnOn\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        ECCB\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"RadioBullet - E915\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--RadioBullet\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        RadioBullet\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E915\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Redo - E7A6\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Redo\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Redo\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E7A6\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"RemoveFilter - EB08\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--RemoveFilter\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        RemoveFilter\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EB08\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"ScaleVolume - F18C\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--ScaleVolume\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        ScaleVolume\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        F18C\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Search - E721\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Search\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Search\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E721\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Settings - E713\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Settings\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Settings\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E713\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"SortDown - EE69\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--SortDown\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        SortDown\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EE69\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"SortUp - EE68\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--SortUp\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        SortUp\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        EE68\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Sunny - E9BD\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Sunny\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Sunny\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E9BD\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Table - ED86\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Table\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Table\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        ED86\n      </div>\n    </div>\n    \n    <div class=\"IconContainer\" title=\"Undo - E7A7\">\n      <div class=\"IconContainer-icon\">\n        <i class=\"ms-Icon ms-Icon--Undo\"></i>\n      </div>\n\n      <div class=\"IconContainer-name ms-font-l\">\n        Undo\n      </div>\n\n      <div class=\"IconContainer-unicode ms-font-s\">\n        E7A7\n      </div>\n    </div>\n    \n  </div>\n</body>\n</html>"
  },
  {
    "path": "packages/fluentui-icons/package.json",
    "content": "{\n  \"name\": \"@msrvida/fluentui-icons\",\n  \"version\": \"1.1.1\",\n  \"description\": \"Fluent UI icons for use in MsrVida data visualization applications.\",\n  \"main\": \"dist/es6/index.js\",\n  \"types\": \"dist/es6/index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/fluentui-icons\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"author\": \"Dan Marshall\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"clean\": \"rimraf ./dist\",\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"prebuild\": \"node ./scripts/prebuild.js\",\n    \"build\": \"tsc -p .\",\n    \"bundle\": \"rollup -c\",\n    \"build:05\": \"npm run build && npm run bundle\"\n  }\n}\n"
  },
  {
    "path": "packages/fluentui-icons/rollup.config.mjs",
    "content": "import commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport resolve from '@rollup/plugin-node-resolve';\n\nexport default {\n    input: './dist/es6/index.js',\n    output: {\n        file: './dist/umd/fluentui-icons.js',\n        format: 'umd',\n        name: 'FluentUIIcons',\n    },\n    plugins: [\n        json(),\n        resolve({ jsnext: true }),\n        commonjs({ sourceMap: false }),\n    ],\n};\n"
  },
  {
    "path": "packages/fluentui-icons/scripts/prebuild.js",
    "content": "const fs = require('fs');\nconst path = require('path');\n\n// Ensure src directory exists\nif (!fs.existsSync('./src')) {\n    fs.mkdirSync('./src', { recursive: true });\n}\n\n// Find the WOFF file and convert to base64\nfs.readdirSync('./fonts').forEach(file => {\n    if (file.endsWith('.woff')) {\n        const fontPath = path.join('./fonts', file);\n        const fontBuffer = fs.readFileSync(fontPath);\n        const base64Font = `data:font/woff;base64,${fontBuffer.toString('base64')}`;\n        \n        // Create filename from font name (convert hyphens to underscores)\n        const baseName = path.basename(file, '.woff');\n        const fileName = baseName.replace(/-/g, '_');\n        \n        // Create TypeScript file with the base64 data using constant export name\n        const tsContent = `// Auto-generated font data - do not edit manually\nexport const fabricIconsWoff = '${base64Font}';\n`;\n        \n        fs.writeFileSync(`./src/${fileName}.ts`, tsContent);\n        console.log(`Generated ${fileName}.ts with export 'fabricIconsWoff' from ${file}`);\n    }\n});"
  },
  {
    "path": "packages/fluentui-icons/scss/fabric-icons-inline.scss",
    "content": "/*\n  Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fabric-assets-license\n*/\n@font-face {\n  font-family: 'FabricMDL2Icons';\n  src: url('data:application/octet-stream;base64,d09GRgABAAAAABtwAA4AAAAAL9QABKj2AAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEgAAABgMVN8b2NtYXAAAAGMAAABDgAAAqowTifbY3Z0IAAAApwAAAAgAAAAKgnZCa9mcGdtAAACvAAAAPAAAAFZ/J7mjmdhc3AAAAOsAAAADAAAAAwACAAbZ2x5ZgAAA7gAABH0AAAd/LLl/VJoZWFkAAAVrAAAADIAAAA2BVACQGhoZWEAABXgAAAAFQAAACQQAQgDaG10eAAAFfgAAABPAAAAcBtCDopsb2NhAAAWSAAAAG4AAABu0JrJKm1heHAAABa4AAAAHQAAACAAWAIibmFtZQAAFtgAAAP3AAAJ+pKX8lVwb3N0AAAa0AAAABQAAAAg/1EArXByZXAAABrkAAAAiQAAANN4vfIOeJxjYGH/xDiBgZWBgXUWqzEDA6M0hGa+yJDGJMTBysrFyMQIBgxAIMCAAL7BCgoMDs95vzpzgPkQkgGsjgXCU2BgAAD3EghqeJxjYGBgZoBgGQZGIMnAuATIYwTzWRg7gHQcgwMDK4Pcc97n/M8Fnws/l3gu81zpue/zzOcTnk99vuz58ueHX8i8cHgx5cW0F8tfnHjx+6Xoy5KXe18eesX8muP15Ter36x5c+rN6bdMb9veZb6b+b7//YSPPR9XfTr22edz8OcnX1W+Ov//z8AANl8Aar4iFvMnIZlfjMP8jHczsJsv8UXil8QniY8SbyVeSbyU2C8xT6JWolIiWyJDwlf8jfgl8UbxBvEC8QBxOXFWsRViCWIxYrKi4iJ+whXCZcLRwpHCKkILBQ8IThKYJzCHbxFfK28WzzOeezz+3AJcnyDhRkvAyEZrGwY/AACftqENAAB4nGPQYghlKGBoYFjFyMDYwOzAeIDBAYsIEAAAqhwHlXicXY+/TsNADMZzJLSEJ0A6IZ11KkOViJ3phksk1CUlDOelgNRKpO+AlIXFA8/ibhnzYgjMEf4utr/P+ny/c6f5yXx2nKVHKilWnDfhoNQLDurtmf35IU/vNmVhTNV5VvdlwWoJomtOF/VNsGjI0PWWTG0eH7acLWKXxY7w0nDShk7qbQB2qL/HHeJVPJLFI4QS30/xfYxL+rUsVobTiyasA/des/OoAUzFYxN49BoQf8ikP3VnE+NsOWXbwE5zgkSfygL3RJqE+0uPf/Wgkv+G+23Iv6tB9U3c9Bb0h2HBgrChl2fbUAkaYPkOhPxkxgABAAIACAAK//8AD3icnVh7cFPXmT/ffehKBGyuZVt+YXMtS8KAbSxZFsQPZAc7PAp2DCWMFBNoAotJcJNNCDGQ5ECaQGpCGrvNNoVNJqEmk22T3c1zp3Q3SmcnpJ02ZMtOMzue7R9JgG435LkzCdK9x/udc69k2WSn3Uq6Oo97Ht853+v3fUQipwlRvqPeQ2SiERLTDT1g6MZp+ffma9Jr1lqi3pP+7veVDQQ/QLxwUbvsaiAqNnweiIE2njC9pjchj7sasCZfTph7cBx+3Pgl1+C4EkP360bU0CO6m5hxasblFFWcUk6ZcRz/BflCm6fN4+M9oHkghGt7wKckpZcS1nprfUJ6ydqQkF6WXk4oZEbT2oBDcDuFuIhLS2tpEiN3kSPkBO5cXFpS7CpR5YBL86pyrctfG/TLAW8whF0twWhLazTgVVtj2BVujYRLIzio1BfwQidEW4KhWEhthJA3pDWCv9alhTRvAWgBzVcAJcWlPs0XqAaf7ItVQyTcGvPF5E6IqTEIV0slxQWSv7ZRirZ0St5wJ5aN2C7A/mrJ9SUAyE+z98oqVrFDz3iKPPh7hh1aVVHG3nsaZABmPQ31+BYeyL6FB/At1D/NjkqKIn20mX1W0xVc+e73fct8ZU1l4++uDMYXss82f2S/hcKr30LhZnNswyM729p2PrIhW8a2ra6vX70t5pRK3f+PGCv/IOw/cS/cMbfdRzNJzX97FanS7nyyeGnRPMJESSSCPzdxUVJFwshbHZkZMgrkJaAboRgKF168z+iEiFYga0YIOad3wkowqmWfm8Q3HG5iRVWbhka64halVKLxrpGhTVXwcdPhDfGy2krfXOuuwqr7BwburyqUHp3rq6wtcxGTXtfRdnN3nUTicYnUdd/c1nHdqLtsQV3xkr5h3TyuD/ctKa5bUObm4o70EeomGkUtKuRSj3TpEFUNu+ImFmH4aPQKKhpwZaOTFjEn5YBMJmnAIlZAmpRxHYkCUSmqotBHiOh+PKsuIdUywe40yjl/snvaeqaSHn4noIGuotBrLv7114aC+MWriFVLSiTcqaAkKlwSNaOEqyNKbGustS4S9pX6ShUCexJsj7Ksv3/D8eOvp869+OxTDx4ebOopPbDouQ+h9IkDF87+eG88vvfHZy8cOPw/55+PQT0jVF9UuvX+70DjqXOp148fdxFrko0lYExK3pk6J7o29K+I7djxSM8TN9Q+/vmL2/j8Dw/aa615+J/vphJhHy/sWHBfcuu3+MZE6HL2XAWkmFSSJVyXXRqoXDU5owFVzyMFGuUQdMpZ9dLcJLwsPWkdeUoNLDvY3bM/Gb3Su/tJv7KCTWaWwZo5DfGBRpWVN9aVGCvWLQmuaF5a7vrH7oM45ylpBOeEo8n9mXv8T+5WroVA+pqBxoF4wxz5/fKlzSuCS9atMErqGsvz7tyPloagviuo7wqXRuAGJtoSg0a0H53KbNVX49tfOXnopnD4pkMnX9l+34Vt5ifeioqgV57ft8nu2/fbk8nkyd/uc0o8j+i2p23qMz/1BisqvLK+7cJ9dl+G5A0XpbDMJCeHnMbruGSgSY8ZPtUIGRpW/5SVgjC3nOI0rW7yFZECVHqNwgQLUOs1ygIa6sbuM6P9/aNndmfLvmO7Ojp2HetzSuuxiiBSGwzaIkv5J0MUmj+FlybNmyRKmYp5+PCrxqkEj4L3XYOnaSDNJEpW4In8Oqff4AfQ/VGDnyJi4LEWQL0UNcDQi0uxjRber0fAeTRCq1t6F5lkUW9LNQpesb+xEmhlo79YIiYBylDFMri7QiqCFpIMzuOi6TifwierKSpm8LmUTpF0nNOaUnAB+yGc3KyMNJNbyD4ySp4mL5OzXFqUaqmopFgqkBTn7hXn3p12UadU553WVIVzg2tuxOaYYnNnJveuajulMwe5O/O9PKutkEfB9eGZh9aseejMhyz9aHSwp95bVVvlre/Z2hJsi7a0r13G+/hrUI/n2wG7zu8Cx0Xa1ob7j+1qF3Oxj1VmL8op4cSsDmn2iB2z2hdmtd3EofFRluYU1/cMRpvXtLdE24ItW3NUD0adA31F88m063wlMa5917H+5nVtEZzL+1SSt48o4aoeRmf3TP0ZY4gMWRleQtrJOmE1UFCFttlirGfZodsSzbkHUW6lbf5jF7S0xhCJGGKS4RICWasblTrfZgpFejAaHexdNEX4lrwlUy7TucPQtrC7bJ4Z5w0FaeHCHFfmlZeaKUE24bP5PFsvZMrbGdRaKyfvEpXjsa1lczy8YVECCPS8LhPPFcxaQrTSIYGfHJvsOBpViW976SS9KTy03TyTkFf1bU6efHfv7RPHDl0PE+iR0UMM7RvVzPBN9ORL2x6Z2m7+PCH39J27Y++7J5Ndtx1djS6bJZcPDa6P1XDPmL1PBYt5jn3zGh5R6hq5QpVkAAJsEnUaTZU6mQ640f1C4EpSRQt+hWNZUIhXrMFpNxpl2/aV+tCH2vYb1UfxIfGGgpbv+kPHJm7nxGzuk1clzDPbh2xSN43uG9px63K8JBdZffS2Ln6sO871iUNun3rEPnRNbP3g0HJ+UMdna29pb5E60o07F+DGIfRnXCER+GoIe2PcyfkgyHUTAWUMXIIuTiJer325fIr2lrHyur5wbQ17aN7ciubepex+6+2jDdIKdn9D76u3DKyDA66SYMyA47FmplfMc7Pi8qVLmypX3NYoPbOwVptXNAf+u6JZLTZiwRIXeyjYv6hr99ZvLoXD1tmGo9JyONzQu7YcDtTUNvetWmlYbRXwSXOsqrmClcwpmqsZC62bG29bXtnUsLQcPnIjG2RA36MRgV1cxMP5EtGRKSEdJYVCHEG/VQ0CwMj4TZMvlSLry6+bh6jH4DPBhQKYxmjBjEvv257EIpIn87HkseMR5OFl7fLVcYM8hoGIuSchj5nDGJzI4xg3zGiawziEYyjYiE6mwc33nktIAJXOywMbpByAKrTBGrfGE3Cewnn0BPJ567j01wm2WH0+fSP8zsZgQDWO19ykiEsSeiNUAb/OIynhbF04gLLlSXh7gl6hKkG15PiO0QnRidJvoV+kJkVp5nKNKBLXuoboxOdINjrsiDcSCnC3Jh5cGJ0pI3ISlw5MTJhUCkwRK8kJZiiLClEmMwFAx8XwOzEJJI0KBHiTIoYLYAx3mWNI+7ZAonhEyat6E+lxCEjDCetjtSiRHhMxn4QzVfziXZPZnkYhfceG2tuHjvX1j/JyVKV5jX7+UqwBR0i5ekm7xPcMeHjkqKnDZrl8acQck4dHsCKq5tgI7ldOyl0jzlibn9LYiDyML+VLZnk5VnGKWW6Wkzkcc4v78pIQ2tYmEkG800ZWIua5/mpqZ6McL0ICmePrEgNxetTw4l6SBt4QXokPQnJq8NT+3t79pwazZffdN0YiN97d3b33xnD4xr2HBahRkJMZvGWgB9hnCZgvN0Fhgn2aTML8ROavkuzThIvkL8JLi+D07vzlZM4dXEkRSAkW42T2mflvOBsK5aYkLmlWJXF9lDeVy4j2FeIhxJ/ecF2nVBRtkULVahZX1CHirwawUYQUKrX7tVKFolv84MzDa1Z10T++/exdnWsePvMB+tLvsvSl1KqaDrnm4IWzp/bG+x9/Bw3I4X96n115nEKPRPg4cD36EJC75ieOvf7eF4fQ/fKFVh95815FYehlT529cPDo1H/8XeTEs2Psky/O/e0OnR7lvOe2musHFfEMypAXpTfAQyJHV1EWUIHQJiPK4iEIjLHhBIzDeIINwxhGJDxkotxmgHdGP+Nj8T74+hzvRhFriTgBA0A7RsfYDw1rBNkbQefZKcfswB7DBrTwCBpLuE/FIAhjCAPlAQfz8XwFwEVKDH57eJeNaIU62mtWrd/cHFiyJNC8ef2qmvYO1GXsXbhq3eZw3dLpXhdq8+bVC1orrk2uNDLUWJm8tqJ1werNuT5luk8ju3+5pWFtR4tPb1u8uE33tXSsbdjyy92UYn/TmvZwmd4+s98iA/f6Cyq9i4ZGjvT2HhkZWuStLPDfO/C1vcLX7BQx82pyA95NtczVYQlEIzlNcGm259OCWa1ogxJ/DkD6OmURb8V4sgedoWtwy5N3dl0/cmowHne0oLvIr8/ZcM8PN/Ue3rOpfN3GrPLjIX42esMNoz/b3di0aPfBY2uSzz92O+tC9p1n5xPjVJlyrR15asvgqZHrqdAGXE5RNj021L74G7d1+7N2hPIV+Eqejm/1BJbvOG66kPnnoSExJk04seKDmqXxXJNP2ACCXI1kAxjwaSEtFAvFfDGfqgl0EMI/rughDSIGaLqaizfgRx8kPsj+rFe60t/TMPRPk5SEZhOuS/7hNHT9gL1qVabUlBPdmBV5Uz6Iq9Sc39Ul38GSbyDcIOxfkv91mqWki29akw6tPEdg01qP0cxMWvMyZR7eEE1Oa4kftUQ3pimVMPLAH3pV80ewM4NL0iyZqSQ7YZGUPDFNY8IeCgSLODuRRCox0snS2JWEnUA4hXIubqlE27JxdrxS1yh9fYSCoW42Cm5UOHSaHVE4aP3/DCDspMDgT57Yv2XZsi37n/jJYF59NuZ3VpkB8bMZhfxFXQuvWsqpz8ydVNpx/J930r/oZH/pCfJiSbRvpaSCVBMDcWPIzohoPOEQApFyQMhohBEkloIhIw42vB6FFyED/G5SaMaLamqKzHihB6i7WleoXu0G6jF/wH73a+kX5oPsN3Drr60/SHvY7+EjuMW6VmrA+qsAt7LfWErKV5ShPp9Ci3xFhRIt0PUCixZKjQwvkT8WtUqlP5p3yo/xkoqbRQmnOUynYasQbb8P75pH8YJ+7gc4uok6Yo5BTblk6NkvZB/UBzSqVwR+YVQ4WozTnQech0OqtMiOyWRa1omjJFauKR6a/08FPjlPiPqClhbYUwPZ7+XeSX0hwV7EceynCbgMl13zEnDDV6amiTbjcAj+nbjUv9csMU/kw+WIF9RNSeZlRUkYwMmwUVqfYF64jGtp0lcWh5sSCZNyjeMhVSBXDvxVgV+VMfNx+dsjHBrJ7whsxKvasMBG0yiJ14QMI1bS3pleB4kOCBDMB5gIlb5tPm7V2VVcQ7vEYdM0gBI14aPtnBFxuEQExvSDX3AiApEsM1TkgkXvZSvPWli7F948a+LlcyyriUs28bq5aZIREdls4v/CrkznRis57+2sKEfbYl2flrPT5KpUaSB58WLywgXxn5c1bQ04WdPJ7Ev8tzOjQq/diKArstIGBs+N+vV6Cf8QnxuI8OzYVDxRA2IB55Ao1JMwkGAvoCQrHF+wFxIwwCYz57k4BBiHG5QHk+zFhLlRxoNLSKszSCLOG9iYfsFeA1fjk2Bjgg/G++E6I7B+GerHLuSdB2NYnWN9HvGUeBRRYhhrpsyUHLcek+6U7kyf41ev8uds5nN2MzyjFMAz32Nvs7dhubmLvSE3Q5d5Tm5mb5jnOE+5gGvxmTEVrovBDQo9VVOZFJXet6ptnbF4UPal5BFhFcZE2fi6QvhTo+TrkhT5SQzDzlhQO4kyOxuhpHLJiox4hYf/upyDQnNJCSsliQQE0lVFWrUPHfw4hxSQEuxBCUJ+YlhkM9IjGdwCYoMbwVr4HJ5zwU+tTiC/YB3Sv7KneuA5+Nzcw341RZgGe9AGuuqYhvr/TbSECs2c1ZVf4f0Sc98/KCsyr2lrkanbC3Qu5XoB7pzCqJXmx7V+ziPZw+PTdErEtdPxKY9sVY/1JQ9tiTsnj7LIVZSjBQygRDbbWobRuVaOdiOiyyLbaoMBrsJayCtAF6BqeGSuGpLIMGKox06kUlJlIOvf2aEkD6CTExPJKbRpyQkrefp0ckrE1NjEuovPg51vSkl0+tZFbiNzSCKQBDEqPV9MSZ6WP8WFQJjKKbEoz7A4celsW34XeYCMkr8hp5zToIyps8psf6A0F4u1QyxUANx3lebHZ7mkh0hcVuHB8xIhkVwwF4JwK8J4xK6I8UH8R0TPjP68uiRSuzysok4lk62o2Qq77OWyx+UUfl7RG1hcP0VyPbxcXA9k9hCYPSS90WGJy7ndYOaiU5GyPShtFA0jQjAULlRnpEBG34WR+3j94uxSrrmurRVV3iky3cVLL5CrxsDsMdaeLG+nM+ksV5vmPPlfWKi8b3icY2BkYGBgWfFta/5xpnh+m68M3BwMILD/78EGEH3PwOsMiOZgAItzMjCBKABqkgp/AAB4nGNgZGDgYAABOMnIgAqYAALKAB0AAAB4nGPVYljGwcAgzMDA8JmBDUgyMDUwwACQxdjACKQZWYAsIGQQZgwGiwszNTC2M0kC2axAHkIHWBfjZcYrDEYMknA+EDLIMBwAcQBsQgvrAAAAABYAKgBCAGQBVAGkAcgB3gJKApgC6ANQA6oEsgUeBVoFfAW4BiYGQgZeBoAGoAbGBvgHEAcyB0gHXgfYCDAIYAjuCWAJtgoGCnwK0AssC4ILngu6C94MAgwyDGgMvAzsDQoNUA2SDbAOEg7+AAB4nGNgZGBgMGM4wcDLAAKMYJILhBkjQUwAHSwBfAAAAHictVQ/ixw3FH97u/ZdcHwEQ8ClihDOxzJrX8yZ2NVhx5WvOZsDNwHtjHZGeHYkJI2HMS5SusjHSGPIpwgJpEydT5A6Vcq896TZ2/NuzCWQHUbz09P7+3tPCwC3R1/CCOLvK3wjHsEt3EW8A7vwTcJjlD9LeIL424SvwadgE74On8HbhHfha/g+4T34HH5J+AYcwu8J3xz9PJokvA+HO79ilNHkE9wVO38mPIIvxucJ78D++E3CY5S/S3iC+MeEr8Ht8W8JXwcx/iPhXXCTvYT34HAy+LkBLyY/JHxz/G7yV8L78GLvu5/ei6O79x6IU507480iiMfGWeNk0KbJxEldizNdVsGLM+WVe62K7KmcO52L0yfPjsSJ9yr4M1W2tXSbB5uSc+U8ehb3s+PjeEqH8ey5Ko0S2gspgpOFWkr3SpiFCJVay690prUkzs3SykYrn21NvgrBPpzNuq7LlsN5hjaz0FtTOmmrfrYwTfCzC3PfWltrVQg6yMRL04ql7EXrFSaBiZFYBCNyp2RQU1Fob2vZT4VsCmGdxtMcVRR+pRdWuaUOAd3Ney6i1rlqyBceeGHcABYUYbpZqnWmaPMwFcQ82k7JZgigG9FVOq/WMuswqG7yui2wTavsTVP34kDfEWo5x1wu1NHDx7Jl9UI3pXDKB+wUsXoRgMxXvh4xAwcaowS1pBY4jVEL0zW1kcVl9mSkSjkqx2AoXNtg2yAKRWWSTqVqe5lRHMamT+rUEHSI/FR6rjHn7Ordhvcg4Ajuwj14gOgUNOTgwIDHdwEBZY8RObzztEqUaEQNZHhyAjU+As5QVkKFZ553Cr8KtV/jWqDmU7Sb4558U4wn+M9yxPaeNcmOrEpo0Z9EzatYXEXnnPPwKWcB9zGbY3zWbQfLdbvnnI3BVaAOVSXxDcxAgdIlZ/kKZcQSnVSsu42/kvctMjho5/hd4l5iTprZyv4F88RzQOlDmOHT8ZOhvw/tsxRnhrhnLyX7seihR+mCvVG1s63RPedssSOa+yhWFtT7l1yTYCZ6/LbMXWQiMjZok8xw1Q41qA4FU9wXrGe54z1LiA+KY7kz0TZPXlTaS/Ztua9Uc+AzsppzHkMnaq6IrIa8ooXnLrgNyWJVw/RKXbW8L9Amx/2U+YozH+NOV3E+rEDzJHbMU47rds66VClp51hNy3NXbOWebGpGB6h/B780ofPEyzbvMYf/yu2F94I9lShzPMch3alhVrdVMETfzOvR2gxQJbGWwPGGW0D+Y60FSjqu3PCt/NjsyUtTpbgvJq2xqohbvlktW1K2QzcHP6RZ803+5xmN/4xN6syF9+GG6MQyzQ/lO2emY2//h7v9N4bHOJoAeJxjYGYAg/9+DOUMmMAMAClgAf54nNvAoM2wiZGTSZtxExeI3M7Vmhtqq8rAob2dOzXYQU8GxOKJ8LDQkASxeJ3NteWFQSw+HRUZER4Qi19OQpiPA8QS4OPhZGcBsQTBAMQS2jChIMAAyGLYzgg3mgluNDPcaBa40axwo9nkJKFGs8ON5oAbzQk3epMwI7v2BgYF19pMCRcAxAEoGgAAAA==') format('truetype');\n}\n\n.ms-Icon {\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  display: inline-block;\n  font-family: 'FabricMDL2Icons';\n  font-style: normal;\n  font-weight: normal;\n  speak: none;\n}\n\n// Mixins\n@mixin ms-Icon--Accept { content: \"\\E8FB\"; }\n@mixin ms-Icon--Add { content: \"\\E710\"; }\n@mixin ms-Icon--BIDashboard { content: \"\\F543\"; }\n@mixin ms-Icon--Camera { content: \"\\E722\"; }\n@mixin ms-Icon--Cancel { content: \"\\E711\"; }\n@mixin ms-Icon--ChevronDown { content: \"\\E70D\"; }\n@mixin ms-Icon--ChevronLeftMed { content: \"\\E973\"; }\n@mixin ms-Icon--ChevronRightMed { content: \"\\E974\"; }\n@mixin ms-Icon--Clear { content: \"\\E894\"; }\n@mixin ms-Icon--ClearFilter { content: \"\\EF8F\"; }\n@mixin ms-Icon--ClearNight { content: \"\\E9C2\"; }\n@mixin ms-Icon--CloudDownload { content: \"\\EBD3\"; }\n@mixin ms-Icon--Color { content: \"\\E790\"; }\n@mixin ms-Icon--Copy { content: \"\\E8C8\"; }\n@mixin ms-Icon--CubeShape { content: \"\\F1AA\"; }\n@mixin ms-Icon--Delete { content: \"\\E74D\"; }\n@mixin ms-Icon--Diamond { content: \"\\ED02\"; }\n@mixin ms-Icon--DiamondSolid { content: \"\\F34C\"; }\n@mixin ms-Icon--DoubleChevronLeft12 { content: \"\\EE98\"; }\n@mixin ms-Icon--DoubleChevronRight12 { content: \"\\EE99\"; }\n@mixin ms-Icon--Download { content: \"\\E896\"; }\n@mixin ms-Icon--Edit { content: \"\\E70F\"; }\n@mixin ms-Icon--Filter { content: \"\\E71C\"; }\n@mixin ms-Icon--Filters { content: \"\\E795\"; }\n@mixin ms-Icon--FiltersSolid { content: \"\\F353\"; }\n@mixin ms-Icon--Flow { content: \"\\EF90\"; }\n@mixin ms-Icon--History { content: \"\\E81C\"; }\n@mixin ms-Icon--HourGlass { content: \"\\EA03\"; }\n@mixin ms-Icon--Next { content: \"\\E893\"; }\n@mixin ms-Icon--OpenInNewWindow { content: \"\\E8A7\"; }\n@mixin ms-Icon--Page { content: \"\\E7C3\"; }\n@mixin ms-Icon--Pause { content: \"\\E769\"; }\n@mixin ms-Icon--Photo2Add { content: \"\\ECAB\"; }\n@mixin ms-Icon--Photo2Remove { content: \"\\ECAC\"; }\n@mixin ms-Icon--PicturePosition { content: \"\\F524\"; }\n@mixin ms-Icon--Pin { content: \"\\E718\"; }\n@mixin ms-Icon--Pinned { content: \"\\E840\"; }\n@mixin ms-Icon--PlayResume { content: \"\\F2C6\"; }\n@mixin ms-Icon--PlayReverseResume { content: \"\\F3E4\"; }\n@mixin ms-Icon--Previous { content: \"\\E892\"; }\n@mixin ms-Icon--RadioBtnOff { content: \"\\ECCA\"; }\n@mixin ms-Icon--RadioBtnOn { content: \"\\ECCB\"; }\n@mixin ms-Icon--RadioBullet { content: \"\\E915\"; }\n@mixin ms-Icon--Redo { content: \"\\E7A6\"; }\n@mixin ms-Icon--RemoveFilter { content: \"\\EB08\"; }\n@mixin ms-Icon--ScaleVolume { content: \"\\F18C\"; }\n@mixin ms-Icon--Search { content: \"\\E721\"; }\n@mixin ms-Icon--Settings { content: \"\\E713\"; }\n@mixin ms-Icon--SortDown { content: \"\\EE69\"; }\n@mixin ms-Icon--SortUp { content: \"\\EE68\"; }\n@mixin ms-Icon--Sunny { content: \"\\E9BD\"; }\n@mixin ms-Icon--Table { content: \"\\ED86\"; }\n@mixin ms-Icon--Undo { content: \"\\E7A7\"; }\n\n\n// Classes\n.ms-Icon--Accept:before { @include ms-Icon--Accept }\n.ms-Icon--Add:before { @include ms-Icon--Add }\n.ms-Icon--BIDashboard:before { @include ms-Icon--BIDashboard }\n.ms-Icon--Camera:before { @include ms-Icon--Camera }\n.ms-Icon--Cancel:before { @include ms-Icon--Cancel }\n.ms-Icon--ChevronDown:before { @include ms-Icon--ChevronDown }\n.ms-Icon--ChevronLeftMed:before { @include ms-Icon--ChevronLeftMed }\n.ms-Icon--ChevronRightMed:before { @include ms-Icon--ChevronRightMed }\n.ms-Icon--Clear:before { @include ms-Icon--Clear }\n.ms-Icon--ClearFilter:before { @include ms-Icon--ClearFilter }\n.ms-Icon--ClearNight:before { @include ms-Icon--ClearNight }\n.ms-Icon--CloudDownload:before { @include ms-Icon--CloudDownload }\n.ms-Icon--Color:before { @include ms-Icon--Color }\n.ms-Icon--Copy:before { @include ms-Icon--Copy }\n.ms-Icon--CubeShape:before { @include ms-Icon--CubeShape }\n.ms-Icon--Delete:before { @include ms-Icon--Delete }\n.ms-Icon--Diamond:before { @include ms-Icon--Diamond }\n.ms-Icon--DiamondSolid:before { @include ms-Icon--DiamondSolid }\n.ms-Icon--DoubleChevronLeft12:before { @include ms-Icon--DoubleChevronLeft12 }\n.ms-Icon--DoubleChevronRight12:before { @include ms-Icon--DoubleChevronRight12 }\n.ms-Icon--Download:before { @include ms-Icon--Download }\n.ms-Icon--Edit:before { @include ms-Icon--Edit }\n.ms-Icon--Filter:before { @include ms-Icon--Filter }\n.ms-Icon--Filters:before { @include ms-Icon--Filters }\n.ms-Icon--FiltersSolid:before { @include ms-Icon--FiltersSolid }\n.ms-Icon--Flow:before { @include ms-Icon--Flow }\n.ms-Icon--History:before { @include ms-Icon--History }\n.ms-Icon--HourGlass:before { @include ms-Icon--HourGlass }\n.ms-Icon--Next:before { @include ms-Icon--Next }\n.ms-Icon--OpenInNewWindow:before { @include ms-Icon--OpenInNewWindow }\n.ms-Icon--Page:before { @include ms-Icon--Page }\n.ms-Icon--Pause:before { @include ms-Icon--Pause }\n.ms-Icon--Photo2Add:before { @include ms-Icon--Photo2Add }\n.ms-Icon--Photo2Remove:before { @include ms-Icon--Photo2Remove }\n.ms-Icon--PicturePosition:before { @include ms-Icon--PicturePosition }\n.ms-Icon--Pin:before { @include ms-Icon--Pin }\n.ms-Icon--Pinned:before { @include ms-Icon--Pinned }\n.ms-Icon--PlayResume:before { @include ms-Icon--PlayResume }\n.ms-Icon--PlayReverseResume:before { @include ms-Icon--PlayReverseResume }\n.ms-Icon--Previous:before { @include ms-Icon--Previous }\n.ms-Icon--RadioBtnOff:before { @include ms-Icon--RadioBtnOff }\n.ms-Icon--RadioBtnOn:before { @include ms-Icon--RadioBtnOn }\n.ms-Icon--RadioBullet:before { @include ms-Icon--RadioBullet }\n.ms-Icon--Redo:before { @include ms-Icon--Redo }\n.ms-Icon--RemoveFilter:before { @include ms-Icon--RemoveFilter }\n.ms-Icon--ScaleVolume:before { @include ms-Icon--ScaleVolume }\n.ms-Icon--Search:before { @include ms-Icon--Search }\n.ms-Icon--Settings:before { @include ms-Icon--Settings }\n.ms-Icon--SortDown:before { @include ms-Icon--SortDown }\n.ms-Icon--SortUp:before { @include ms-Icon--SortUp }\n.ms-Icon--Sunny:before { @include ms-Icon--Sunny }\n.ms-Icon--Table:before { @include ms-Icon--Table }\n.ms-Icon--Undo:before { @include ms-Icon--Undo }\n\n"
  },
  {
    "path": "packages/fluentui-icons/scss/fabric-icons.scss",
    "content": "/*\n  Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fabric-assets-license\n*/\n@font-face {\n  font-family: 'FabricMDL2Icons';\n  src: url('../fonts/fabric-icons-994712d3.woff') format('woff');\n}\n\n.ms-Icon {\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  display: inline-block;\n  font-family: 'FabricMDL2Icons';\n  font-style: normal;\n  font-weight: normal;\n  speak: none;\n}\n\n// Mixins\n@mixin ms-Icon--Accept { content: \"\\E8FB\"; }\n@mixin ms-Icon--Add { content: \"\\E710\"; }\n@mixin ms-Icon--BIDashboard { content: \"\\F543\"; }\n@mixin ms-Icon--Camera { content: \"\\E722\"; }\n@mixin ms-Icon--Cancel { content: \"\\E711\"; }\n@mixin ms-Icon--ChevronDown { content: \"\\E70D\"; }\n@mixin ms-Icon--ChevronLeftMed { content: \"\\E973\"; }\n@mixin ms-Icon--ChevronRightMed { content: \"\\E974\"; }\n@mixin ms-Icon--Clear { content: \"\\E894\"; }\n@mixin ms-Icon--ClearFilter { content: \"\\EF8F\"; }\n@mixin ms-Icon--ClearNight { content: \"\\E9C2\"; }\n@mixin ms-Icon--CloudDownload { content: \"\\EBD3\"; }\n@mixin ms-Icon--Color { content: \"\\E790\"; }\n@mixin ms-Icon--Copy { content: \"\\E8C8\"; }\n@mixin ms-Icon--CubeShape { content: \"\\F1AA\"; }\n@mixin ms-Icon--Delete { content: \"\\E74D\"; }\n@mixin ms-Icon--Diamond { content: \"\\ED02\"; }\n@mixin ms-Icon--DiamondSolid { content: \"\\F34C\"; }\n@mixin ms-Icon--DoubleChevronLeft12 { content: \"\\EE98\"; }\n@mixin ms-Icon--DoubleChevronRight12 { content: \"\\EE99\"; }\n@mixin ms-Icon--Download { content: \"\\E896\"; }\n@mixin ms-Icon--Edit { content: \"\\E70F\"; }\n@mixin ms-Icon--Filter { content: \"\\E71C\"; }\n@mixin ms-Icon--Filters { content: \"\\E795\"; }\n@mixin ms-Icon--FiltersSolid { content: \"\\F353\"; }\n@mixin ms-Icon--Flow { content: \"\\EF90\"; }\n@mixin ms-Icon--History { content: \"\\E81C\"; }\n@mixin ms-Icon--HourGlass { content: \"\\EA03\"; }\n@mixin ms-Icon--Next { content: \"\\E893\"; }\n@mixin ms-Icon--OpenInNewWindow { content: \"\\E8A7\"; }\n@mixin ms-Icon--Page { content: \"\\E7C3\"; }\n@mixin ms-Icon--Pause { content: \"\\E769\"; }\n@mixin ms-Icon--Photo2Add { content: \"\\ECAB\"; }\n@mixin ms-Icon--Photo2Remove { content: \"\\ECAC\"; }\n@mixin ms-Icon--PicturePosition { content: \"\\F524\"; }\n@mixin ms-Icon--Pin { content: \"\\E718\"; }\n@mixin ms-Icon--Pinned { content: \"\\E840\"; }\n@mixin ms-Icon--PlayResume { content: \"\\F2C6\"; }\n@mixin ms-Icon--PlayReverseResume { content: \"\\F3E4\"; }\n@mixin ms-Icon--Previous { content: \"\\E892\"; }\n@mixin ms-Icon--RadioBtnOff { content: \"\\ECCA\"; }\n@mixin ms-Icon--RadioBtnOn { content: \"\\ECCB\"; }\n@mixin ms-Icon--RadioBullet { content: \"\\E915\"; }\n@mixin ms-Icon--Redo { content: \"\\E7A6\"; }\n@mixin ms-Icon--RemoveFilter { content: \"\\EB08\"; }\n@mixin ms-Icon--ScaleVolume { content: \"\\F18C\"; }\n@mixin ms-Icon--Search { content: \"\\E721\"; }\n@mixin ms-Icon--Settings { content: \"\\E713\"; }\n@mixin ms-Icon--SortDown { content: \"\\EE69\"; }\n@mixin ms-Icon--SortUp { content: \"\\EE68\"; }\n@mixin ms-Icon--Sunny { content: \"\\E9BD\"; }\n@mixin ms-Icon--Table { content: \"\\ED86\"; }\n@mixin ms-Icon--Undo { content: \"\\E7A7\"; }\n\n\n// Classes\n.ms-Icon--Accept:before { @include ms-Icon--Accept }\n.ms-Icon--Add:before { @include ms-Icon--Add }\n.ms-Icon--BIDashboard:before { @include ms-Icon--BIDashboard }\n.ms-Icon--Camera:before { @include ms-Icon--Camera }\n.ms-Icon--Cancel:before { @include ms-Icon--Cancel }\n.ms-Icon--ChevronDown:before { @include ms-Icon--ChevronDown }\n.ms-Icon--ChevronLeftMed:before { @include ms-Icon--ChevronLeftMed }\n.ms-Icon--ChevronRightMed:before { @include ms-Icon--ChevronRightMed }\n.ms-Icon--Clear:before { @include ms-Icon--Clear }\n.ms-Icon--ClearFilter:before { @include ms-Icon--ClearFilter }\n.ms-Icon--ClearNight:before { @include ms-Icon--ClearNight }\n.ms-Icon--CloudDownload:before { @include ms-Icon--CloudDownload }\n.ms-Icon--Color:before { @include ms-Icon--Color }\n.ms-Icon--Copy:before { @include ms-Icon--Copy }\n.ms-Icon--CubeShape:before { @include ms-Icon--CubeShape }\n.ms-Icon--Delete:before { @include ms-Icon--Delete }\n.ms-Icon--Diamond:before { @include ms-Icon--Diamond }\n.ms-Icon--DiamondSolid:before { @include ms-Icon--DiamondSolid }\n.ms-Icon--DoubleChevronLeft12:before { @include ms-Icon--DoubleChevronLeft12 }\n.ms-Icon--DoubleChevronRight12:before { @include ms-Icon--DoubleChevronRight12 }\n.ms-Icon--Download:before { @include ms-Icon--Download }\n.ms-Icon--Edit:before { @include ms-Icon--Edit }\n.ms-Icon--Filter:before { @include ms-Icon--Filter }\n.ms-Icon--Filters:before { @include ms-Icon--Filters }\n.ms-Icon--FiltersSolid:before { @include ms-Icon--FiltersSolid }\n.ms-Icon--Flow:before { @include ms-Icon--Flow }\n.ms-Icon--History:before { @include ms-Icon--History }\n.ms-Icon--HourGlass:before { @include ms-Icon--HourGlass }\n.ms-Icon--Next:before { @include ms-Icon--Next }\n.ms-Icon--OpenInNewWindow:before { @include ms-Icon--OpenInNewWindow }\n.ms-Icon--Page:before { @include ms-Icon--Page }\n.ms-Icon--Pause:before { @include ms-Icon--Pause }\n.ms-Icon--Photo2Add:before { @include ms-Icon--Photo2Add }\n.ms-Icon--Photo2Remove:before { @include ms-Icon--Photo2Remove }\n.ms-Icon--PicturePosition:before { @include ms-Icon--PicturePosition }\n.ms-Icon--Pin:before { @include ms-Icon--Pin }\n.ms-Icon--Pinned:before { @include ms-Icon--Pinned }\n.ms-Icon--PlayResume:before { @include ms-Icon--PlayResume }\n.ms-Icon--PlayReverseResume:before { @include ms-Icon--PlayReverseResume }\n.ms-Icon--Previous:before { @include ms-Icon--Previous }\n.ms-Icon--RadioBtnOff:before { @include ms-Icon--RadioBtnOff }\n.ms-Icon--RadioBtnOn:before { @include ms-Icon--RadioBtnOn }\n.ms-Icon--RadioBullet:before { @include ms-Icon--RadioBullet }\n.ms-Icon--Redo:before { @include ms-Icon--Redo }\n.ms-Icon--RemoveFilter:before { @include ms-Icon--RemoveFilter }\n.ms-Icon--ScaleVolume:before { @include ms-Icon--ScaleVolume }\n.ms-Icon--Search:before { @include ms-Icon--Search }\n.ms-Icon--Settings:before { @include ms-Icon--Settings }\n.ms-Icon--SortDown:before { @include ms-Icon--SortDown }\n.ms-Icon--SortUp:before { @include ms-Icon--SortUp }\n.ms-Icon--Sunny:before { @include ms-Icon--Sunny }\n.ms-Icon--Table:before { @include ms-Icon--Table }\n.ms-Icon--Undo:before { @include ms-Icon--Undo }\n\n"
  },
  {
    "path": "packages/fluentui-icons/src/fabric-icons.ts",
    "content": "// Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fabric-assets-license\n\n// tslint:disable:max-line-length\n\nimport { IIconSubset } from '@uifabric/styling';\nimport { fabricIconsWoff } from './fabric_icons_4ac17eec';\n\nexport function initializeIcons() {\n    const subset: IIconSubset = {\n        style: {\n            MozOsxFontSmoothing: 'grayscale',\n            WebkitFontSmoothing: 'antialiased',\n            fontStyle: 'normal',\n            fontWeight: 'normal',\n            speak: 'none',\n        },\n        fontFace: {\n            fontFamily: '\"FabricMDL2Icons\"',\n            src: `url(\"${fabricIconsWoff}\") format(\"woff\")`,\n        },\n        icons: {\n            Accept: '\\uE8FB',\n            Add: '\\uE710',\n            BIDashboard: '\\uF543',\n            Camera: '\\uE722',\n            Cancel: '\\uE711',\n            ChevronDown: '\\uE70D',\n            ChevronLeftMed: '\\uE973',\n            ChevronRightMed: '\\uE974',\n            Clear: '\\uE894',\n            ClearFilter: '\\uEF8F',\n            ClearNight: '\\uE9C2',\n            CloudDownload: '\\uEBD3',\n            Color: '\\uE790',\n            Copy: '\\uE8C8',\n            CubeShape: '\\uF1AA',\n            Delete: '\\uE74D',\n            Diamond: '\\uED02',\n            DiamondSolid: '\\uF34C',\n            DoubleChevronLeft12: '\\uEE98',\n            DoubleChevronRight12: '\\uEE99',\n            Download: '\\uE896',\n            Edit: '\\uE70F',\n            Filter: '\\uE71C',\n            Filters: '\\uE795',\n            FiltersSolid: '\\uF353',\n            Flow: '\\uEF90',\n            History: '\\uE81C',\n            HourGlass: '\\uEA03',\n            More: '\\uE712',\n            Next: '\\uE893',\n            OpenInNewWindow: '\\uE8A7',\n            Page: '\\uE7C3',\n            Pause: '\\uE769',\n            Photo2Add: '\\uECAB',\n            Photo2Remove: '\\uECAC',\n            PicturePosition: '\\uF524',\n            Pin: '\\uE718',\n            Pinned: '\\uE840',\n            PlayResume: '\\uF2C6',\n            PlayReverseResume: '\\uF3E4',\n            Previous: '\\uE892',\n            RadioBtnOff: '\\uECCA',\n            RadioBtnOn: '\\uECCB',\n            RadioBullet: '\\uE915',\n            Redo: '\\uE7A6',\n            RemoveFilter: '\\uEB08',\n            ScaleVolume: '\\uF18C',\n            Search: '\\uE721',\n            Settings: '\\uE713',\n            SortDown: '\\uEE69',\n            SortUp: '\\uEE68',\n            Sunny: '\\uE9BD',\n            Table: '\\uED86',\n            Undo: '\\uE7A7',\n        },\n    };\n\n    return subset;\n}\n"
  },
  {
    "path": "packages/fluentui-icons/src/fabric_icons_4ac17eec.ts",
    "content": "// Auto-generated font data - do not edit manually\nexport const fabricIconsWoff = 'data:font/woff;base64,d09GRgABAAAAABuQAA4AAAAAMIgABKj2AAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEgAAABgMVN8b2NtYXAAAAGMAAABEAAAArIn/BeDY3Z0IAAAApwAAAAgAAAAKgnZCa9mcGdtAAACvAAAAPAAAAFZ/J7mjmdhc3AAAAOsAAAADAAAAAwACAAbZ2x5ZgAAA7gAABITAAAepM100RhoZWFkAAAVzAAAADIAAAA2BVACQGhoZWEAABYAAAAAFQAAACQQAQgDaG10eAAAFhgAAABQAAAAchoOED5sb2NhAAAWaAAAAHAAAABw0ZDZvG1heHAAABbYAAAAHQAAACAAWQIibmFtZQAAFvgAAAP3AAAJ+pKX8lVwb3N0AAAa8AAAABQAAAAg/1EArnByZXAAABsEAAAAiQAAANN4vfIOeJxjYGH/xDiBgZWBgXUWqzEDA6M0hGa+yJDGJMTBysrFyMQIBgxAIMCAAL7BCgoMDs95vzpzgPkQkgGsjgXCU2BgAAD3EghqeJxjYGBgZoBgGQZGIMnAuAbIYwTzWRgnAOkEBgcGVgaF57zP+Z8LPhd6Lvxc4rnMc6Xnvs8zn094PvX5sufLnx9+IfPC4cWUF9NeLH9x4sXvl6IvS17ufXnoFfNrjteX36x+s+bNqTen3zK9bXuX+W7m+/73Ez72fFz16dhnn8/Bn598Vfnq/P8/AwPYBgG4DYpYbJiEZEMxDhsy3s3AboPEF4nfEp8kvkp8lHgr8QoID0jMl6iTqJLIkciU8BN/K35ZvEm8UbxQPFBcXpxNbKVYolismJyohIi/cKVwuXCMcJSwqtAiwYOCkwXmC8zlW8zXxpvN85znPk8AtyDXZ0jo0RYwstHejsEOAFLcpEl4nGPQYghlKGBoYFjFyMDYwOzAeIDBAYsIEAAAqhwHlXicXY+/TsNADMZzJLSEJ0A6IZ11KkOViJ3phksk1CUlDOelgNRKpO+AlIXFA8/ibhnzYgjMEf4utr/P+ny/c6f5yXx2nKVHKilWnDfhoNQLDurtmf35IU/vNmVhTNV5VvdlwWoJomtOF/VNsGjI0PWWTG0eH7acLWKXxY7w0nDShk7qbQB2qL/HHeJVPJLFI4QS30/xfYxL+rUsVobTiyasA/des/OoAUzFYxN49BoQf8ikP3VnE+NsOWXbwE5zgkSfygL3RJqE+0uPf/Wgkv+G+23Iv6tB9U3c9Bb0h2HBgrChl2fbUAkaYPkOhPxkxgABAAIACAAK//8AD3icnVh7cFRVmj/ffaYREm46SedFwk2nuwkhCelOp8E86EQSeSwkBgapboMwCktQMrqKGEDngKPgBHFMZtx1YLWUCZY7o7vrc2uYXdupLXGmZsQdtsbaSu38oQKzs+Jzq5TOvSf7nXNvd5rglu509+3zuOfxnfO9ft9HJHKKEOV76j1EJjohMcM0AqZhnpL/YL0qvWqvIeo96e//UFlP8APECxf0S1oDUbHh80AM9PGE5bW8CXlca8CafClh7cZx+MnDL7kGxxWbht8wo6YRMfKIFadWXE5RxS3llBXH8Z+Tz/V5+jw+3gO6B0K4tgd8SlJ6MWGvs9clpBft9QnpJemlhEKuaNrrcQhupxCNaHpaT5MYuYscJsdx56KS4iKtWJUDmu5V5RrNXxP0ywFvMIRdLcFoS2s04FVbY9gVbo2ESyI4qMQX8EInRFuCoVhIbYSQN6Q3gr9G00O6Nx/0gO7Lh+KiEp/uC1SBT/bFqiASbo35YnInxNQYhKuk4qJ8yV/TKEVbOiVvuBPLRmznY3+VpH0BAPJT7N3S8pXs4NOeQg/+nmYHV5aXsnefAhmA2U9BHb6F72bewnfxLdQ9xY5IiiJ9uIl9Wt0VXPHOD31LfaVNpePvrAjGF7JPN33ovIWCq99CwSZrbP3DO9radjy8PlPGtq6qq1u1NeaWSu3/jxg79yDsP3Ev3DG73YdXkpr79ipSpV25ZPHSpjmEiZJIBH95RKOkkoSRtwYyM2Tmy/VgmKEYChdevM/shIieL+tmCDlndMIKMKtkXx6Jrz/UxAorNw6NdMVtSqlE410jQxsr4aOmQ+vjpTUVvrn2XQWV9w8M3F9ZID0y11dRU6oRi17X0XZzd61E4nGJ1Hbf3NZx3Whe6YLaovq+YcM6Zgz31RfVLijN4+KO9BGaR3SKWlTApR7pMiCqmk4lj9iE4aPTy6howJWNTtrEmpQDMpmkAZvYAWlSJviCylSnCiVeEiJtuNIsiTK/pg2kotFfVORvrHBLueLrOhSa0/hGJZ5XokBUqhPHbkDE8CNPDAlvF4+gkzTqI38yd+PYA5X0cN6BDoaKyqlr/OuvCQXxiyyLVUlKJNypoMYoXGN0s5ibDdSs1lhrbSTsK/GVKAR2J9huZWl///pjx15LnX3hmScfODTY1FOyf9GzH0DJ4/vPn/nJnnh8z0/OnN9/6H/OPReDOkaosahky/3fg8aTZ1OvHTumEXuSjSVgTEremTorutb3L49t3/5wz+M31Dz22Qtb+fwPDjhrrX7on++mEmEfLexYcF9yy7f5xkTYnMy58kkRqSD13OZoOqjchHCBBDQRHinQKIegU86YAT2PhJemJ+3DT6qBpQe6e/Ylo5d7dz3hV5azyamlsHpOQ3ygUWVljbXF5vK19cHlzUvKtH/sPoBznpRGcE44mtw3dY//iV3KtRBIXzPQOBBvmCO/V7akeXmwfu1ys7i2sSznzv1oEbkUKSglCtca4IYw2hKDRrRzncpsE6XGt7184uBN4fBNB0+8vO2+81utj73l5UGvPL9vo9O393cnkskTv9vrlnge0e1M29hnfeINlpd7ZWPr+fucvimSM1yUwoOQrL5wGq/jkoGuJ2b6VDNk6lj9OmsKYW7hxWla88iXRApQ6VUKEyxA7VcpC+iow7tOj/b3j57elSn7ju7s6Nh5tM8t7UfLg0htMOiILOWfKaLQ3Cm8tGjOJFHKVMzDh181TiV4FLzvajxNA2kmUbIcT+Q3OP0mP4Dhj5r8FBGusgugToqaYBpFJdhGT+Q3IuA+OqFVLb2LLLKot6UKBY9rHVCudxKxCFCGKjaFuyukPGgjyeA+Gk3H+RQ+WU1RmtFYSqdJOs5pTSm4gPMQTm5GRprJLWQvGSVPkZfIGS4tSpVUWFwk5UuKe/eKe+9uu7BTqvXOaKrCucE1N+JwTHG4M8syzW67pTsHuXvle3lWWyGPgPbB6QdXr37w9Acs/Uh0sKfOW1lT6a3r2dISbIu2tK9Zyvv4a1CP5doBp87vAsdF2taE+4/ubBdzsY/NNnFwfFaHNHvE9lnt87PaecSl8RGW5hTX9QxGm1e3t0Tbgi1bslQPRt0DfUlzyXTqfCUxrn3n0f7mtW0RnMv7VDLbGMNVPewqgz79DcYQGTIyXE/ayVrH9ywAoW2OGBsZdhiORHPuQZRbaYf/2AUtrTFETKaYZGpCIGsMs8Lg20yjSA9Go4O9i6aFm+ItmXKZzh6GtoXzSudZcd5QkBYuzHFlXlmJlRJkEz6bz3P0Qqa8PYVaa2flXaJyPLaldI6HN2xKAAGpV7PwXMGMJUQrHRI4z7XJrqNRlfjWF0/Qm8JD26zTCXll36bkiXf23D5x9OD1MIHIAT3E0N5R3QrfRE+8uPXh6W3WLxJyT9/ZO/a8cyLZdduRVQgtWHLZ0OC6WLXw5e59KljMc+2b1/SI0tDJZaokAxBgk6jTaKrUyXQgD2ECBC4nVbTglznmBoV4xRqcdrNRdmxfiQ99qGO/UX0UHxJvKmj5rj94dOJ2TsymPnllwjq9bcghdePo3qHtty7DS9LIqiO3dfFj3XG2Txxy2/TDzqGrY+sGh5bxg7o+W39Tf5PUkm7cOR83DqE/4wqJAF1HeB7jTs4HQa6bCHxjoAm6OIl4vc7l8in6m+aK6/rCNdXswXlzy5t7l7D77beONEjL2f0Nva/cMrAW9mvFwZgJx2LNzCifl8eKypYsaapYfluj9PTCGn1e4Rz47/JmtciMBYs19mCwf1HXri3fWgKH7DMNR6RlcKihd00Z7K+uae5bucK028rh4+ZYZXM5K55TOFc3F9o3N962rKKpYUkZfJiHbJABfY9OBHbRiIfzJWIgU0IGSgqFOAYndhUIACPjN02+UArtL75qHqIek88EDQUwjVGNFZfeczyJTSTP1EeSx4mbkIeX9EtXxzfyGAZM1u6EPGYNYxAlj2N8c0XTGsYhHEPBBnQyDXl877mEBFDpvDwAQ8oBEC422OP2eALOUTiHnkA+Zx+T/irBFqvPpW+E3zsYDBBX6tzgF3JJQm+EKuA3eMQnnK2GAyhbloS3JuhlqhJUS47vGJ0QnSj9NvpFalGUZi7XiHZxrWuIQXyuZKPDjngjoQB3a+LBhdGZMiIncenAxIRFpcA0sZOcYIayqBBlcioA6LgYficmgaRRgQBvUsSaAYw1L3EM6dwWSBSPKHlVbyI9DgFpOGF/pBYm0mMiNpVwpopfvOurMLNC+o4OtbcPHe3rH+XlqEpzGv38pVgDDpMy9aJ+ke8Z8PAIV1eHrTL54og1Jg+PYEVUrbER3K+MlGkj7liHn9LYiDyML+WLVlkZVnGKVWaVkTk8NhD3xTF9PWkiEcQ7bWQFYp7rr6Z2NsrxIiSQOb4uNjGeiJpe3EvSwRvCK/FBSE4NntzX27vv5GCm7L77xkjkxru7u/fcGA7fuOeQADUKcnIKbxnofvZpAubLTVCQYJ8kkzA/MfWXSfZJQiO5i/DSJji9O3c5mXMHV1IEUoLFOJl9av0bzoYCuSmJS1qVSVwf5U3lMqJ/iXgI8ac3XNspFUZbpFCVmsEVtYj4qwAcFCGFSpx+vUSh6BbfP/3Q6pVd9E9vPXNX5+qHTr+PvvT7LH0xtbK6Q64+cP7MyT3x/sfeRgNy6J/eY5cfo9AjET4OtEceBHLX/MTR1979/CC6X77QqsNv3KsoDL3syTPnDxyZ/o+/ixx/Zox9/PnZv91u0COc99xWc/2gIp5BGfKi9AZ46ObqKsoCKhDaZERZPASBMTacgHEYT7BhGMOIhId2lNsM8F7Rz/hYvA++Pse7UcRaIk7AQNXJJWCMioY1guyNoPPslGNOAgLDBrTwCBqLuU/FIAhjCBPlAQfz8XwFwEWKTX57eJeNaIU62qtXrtvUHKivDzRvWreyur0DdRl7F65cuylcu2SmV0Nt3rRqQWv5tckV5hQ1VySvLW9dsGpTtk+Z6dPJrl9tbljT0eIz2hYvbjN8LR1rGjb/ahel2N+0uj1carRf2W+TgXv9+RXeRUMjh3t7D48MLfJW5PvvHfjKXuFrdojYfhW5Ae+mSubqUA/RSFYTNN3xfHowoxVtUOzPAkhfpyzirRhPSqEz1AY3P3Fn1/UjJwfjcVcLugv9xpz19/zNxt5DuzeWrd2QUX48xM9Hb7hh9Oe7GpsW7TpwdHXyuUdvZ13IvnPsXGKcKtPampEnNw+eHLmeCm3A5RRl46ND7Yv/4rZuf8aOUL4CX8nT8e2ewLLtxywNmX8OGhJj0oQbKz6g2zrPifmEDSDI1UgmgAGfHtJDsVDMF/OpukAHIfzjih7SIWKCbqjZeAN+/H7i/czPfrkr/QOdxONpkpLQbMJ1yT+egq4fsVfsipSacqMbqzxnyvtxlVrzu7rkO1jydYQbhP1L8r9OsZR04Q170qWV5zIcWuswmrmS1pyMnoc3RJPTWuxHLTHMGUoljDzwh17V+jHsmMIlaYbMVJIdt0lKnpihMeEMBYJFnB1PIpUY6WRo7ErCDiCcQjkbt1SgbdkwO16pbZS+OkLBUDcTBTcqHDrNjihctP5/BhBOUmDwp4/v27x06eZ9j/90MKc+G/O7q1wB8TMZhdxFtYVXLeXWr8ydVDhx/Dc76Z91sj/3BDmxJNq3ElJOqoiJuDHkZER0nnAIgUg5IGQ0wwgSS8CUEQebXo/Ci5AJ/jxSYMULq6sLrXiBB2helaFQoyoPqMf6Efv9b6RfWg+w38Ktv7H/KO1mf4AP4Rb7WqkB668A3Mp+ayspX+EU9fkUWugrLJBovmHk27RAamR4ifyxqV0i/cm6U36Ul1TcLEo4zWI6HVsFaPt9eNc8ihf0cz/A0U3UFXMMasok08h8IfOgPqBRvSzwC6PC0WKc7j7gPhxSpUV2TCYzsk5cJbGzTfHQ3H8q8Mk5QtTn9bTAnjrIfi/3TurzCfYCjmM/S8AluKTNS8ANX1q6LtqMwyH4d6Kpf6/bYp7I28sRL6gbk8zLCpMwgJNhg7QuwbxwCdfSpS9tDjclEiZlOsdDqkCuHPirAr8qY9Zj8ndGODSS3xbYiFf1YYGNZlASrwkZRqykvz2zDhIdECCYD7AQKn3Hesyudaq4hn6Rw6YZACVqwkc7OSPicokIjOkHv+BEBCIZZqjIBZvey1acsbF2L7xxxsLL51hWF5ds4XVz0yQjInLYxP+FXZnJ4VZw3jvZW462xbo+PWunyVUp3UDywoXk+fPiPye72xpws7uTmZf472RGhV7nIYIuz0gbmDw36jfqJPxDfG4iwnNiU/FETYgF3EOiUE/CQII9j5KscHzBnk/AAJucOsfFIcA43KA8mGQvJKwNMh5cQlrdQRJx38CG9PPOGrganwQbEnww3g/XGYH1S1E/diLvPBjDGhzr84in2KOIEsNYK2Wl5Lj9qHSndGf6LL96lT9npj5jN8PTSj48/QP2FnsLllk72etyM3RZZ+Vm9rp1lvOUC7gevzKmwnUxuEGhp2pqKkWl9+wqR2dsHpR9IXlEWIUxUSa+Lhf+1Cz+qiRFbhLDdDIW1EmizM5GKKlssmJKvMLDf1XOQaHZpISdkkQCAumqJK36By5+nEPySTH2oAQhPzEschjpkUxuAbHBjWANfAbPavAzuxPIL1mH9K/syR54Fj6zdrNfTxOmw260gVot01H/v4WWUKFTZwzl13i/xNr7D8ryqVf1NcjUbfkGl3IjH3dOYdRKc+NaP+eR7OHxaTol4tqZ+JRHtqrH/oKHtiQvK4+yyFWUoQUMoEQ2O1qG0blehnYjYsgi2+qAAa7CesgrQBeganhkrhqSyDBiqMeOp1JSRSDj39nBJA+gkxMTyWm0ackJO3nqVHJaxNTYxLrG58GON6QkOn37AreRWSQRSIIYlZ4vpiRPyZ/gQiBM5bRYlGdY3Lh0ti2/i3yXjJK/Jifd06CMqbPKTH+gJBuLtUMslA/cd5XkxmfZpIdIXFbiwXMSIZFsMBeCcCvCeMSuiPFB/EdEzxX9OXVJpHZ5WEXdylSmomYq7JKXyx6XU/hFeW9gcd00yfbwcnEdkNlDYPaQ9AaXJZp7u8GpC25FyvSgtFE0jAjBULhQnZECGX0XRu7jdYszS2lztS3lld5pMtPFSy+Qq8bA7DH27gxvZzLpLFub4Tz5X7oQ0KMAeJxjYGRgYGBZ8W1igahBPL/NVwZuDgYQ2P/3YAOIvmfgdQZEczCAxTkZmEAUAE1pCdgAAHicY2BkYOBgAAE4yciACpgAAsoAHQAAAHicY9ViWMbBwCDMwMDwmYGNAQQamBoYYADIYmxgBNKMLEAWEDIIMwaDxYWZGhjbmSSBbFYgD6EDrIvxMuMVBiMGSTgfCBlkGA6AOACflgxrAAAAFgAqAEIAZAFUAaQByAIcAjICngLsAzwDpAP+BQYFcgWuBdAGDAZ6BpYGsgbUBvQHGgdMB2QHhgecB7IILAiECLQJQgm0CgoKWgrQCyQLgAvWC/IMDgwyDFYMhgy8DRANQA1eDaQN5g4EDmYPUnicY2BkYGAwZzjBwMsAAoxgkguEGSNBTAAdRwF9AAAAeJy1VD+LHDcUf3u79l1wfARDwKWKEM7HMmtfzJnY1WHHla85mwM3Ae2MdkZ4diQkjYcxLlK6yMdIY8inCAmkTJ1PkDpVyrz3pNnb827MJZAdRvPT0/v7e08LALdHX8II4u8rfCMewS3cRbwDu/BNwmOUP0t4gvjbhK/Bp2ATvg6fwduEd+Fr+D7hPfgcfkn4BhzC7wnfHP08miS8D4c7v2KU0eQT3BU7fyY8gi/G5wnvwP74TcJjlL9LeIL4x4Svwe3xbwlfBzH+I+FdcJO9hPfgcDL4uQEvJj8kfHP8bvJXwvvwYu+7n96Lo7v3HohTnTvjzSKIx8ZZ42TQpsnESV2LM11WwYsz5ZV7rYrsqZw7nYvTJ8+OxIn3KvgzVba1dJsHm5Jz5Tx6Fvez4+N4Sofx7LkqjRLaCymCk4VaSvdKmIUIlVrLr3SmtSTOzdLKRiufbU2+CsE+nM26rsuWw3mGNrPQW1M6aat+tjBN8LMLc99aW2tVCDrIxEvTiqXsResVJoGJkVgEI3KnZFBTUWhva9lPhWwKYZ3G0xxVFH6lF1a5pQ4B3c17LqLWuWrIFx54YdwAFhRhulmqdaZo8zAVxDzaTslmCKAb0VU6r9Yy6zCobvK6LbBNq+xNU/fiQN8RajnHXC7U0cPHsmX1QjelcMoH7BSxehGAzFe+HjEDBxqjBLWkFjiNUQvTNbWRxWX2ZKRKOSrHYChc22DbIApFZZJOpWp7mVEcxqZP6tQQdIj8VHquMefs6t2G9yDgCO7CPXiA6BQ05ODAgMd3AQFljxE5vPO0SpRoRA1keHICNT4CzlBWQoVnnncKvwq1X+NaoOZTtJvjnnxTjCf4z3LE9p41yY6sSmjRn0TNq1hcReec8/ApZwH3MZtjfNZtB8t1u+ecjcFVoA5VJfENzECB0iVn+QplxBKdVKy7jb+S9y0yOGjn+F3iXmJOmtnK/gXzxHNA6UOY4dPxk6G/D+2zFGeGuGcvJfux6KFH6YK9UbWzrdE952yxI5r7KFYW1PuXXJNgJnr8tsxdZCIyNmiTzHDVDjWoDgVT3BesZ7njPUuID4pjuTPRNk9eVNpL9m25r1Rz4DOymnMeQydqroishryihecuuA3JYlXD9Epdtbwv0CbH/ZT5ijMf405XcT6sQPMkdsxTjut2zrpUKWnnWE3Lc1ds5Z5sakYHqH8HvzSh88TLNu8xh//K7YX3gj2VKHM8xyHdqWFWt1UwRN/M69HaDFAlsZbA8YZbQP5jrQVKOq7c8K382OzJS1OluC8mrbGqiFu+WS1bUrZDNwc/pFnzTf7nGY3/jE3qzIX34YboxDLND+U7Z6Zjb/+Hu/03hsc4mgB4nGNgZgCD/34M5QyYwBwAKWEB/3ic28CgzbCJkZNJm3ETF4jcztWaG2qrysChvZ07NdhBTwbE4onwsNCQBLF4nc215YVBLD4dFRkRHhCLX05CmI8DxBLg4+FkZwGxBMEAxBLaMKEgwADIYtjOCDeaCW40M9xoFrjRrHCj2eQkoUazw43mgBvNCTd6kzAju/YGBgXX2kwJFwDEASgaAAAA';\n"
  },
  {
    "path": "packages/fluentui-icons/src/index.ts",
    "content": "import { initializeIcons as i } from './fabric-icons';\n\nimport { IIconOptions } from '@uifabric/styling';\n\nlet registerIcons: (iconSubset: any, options?: Partial<IIconOptions>) => void;\nlet unregisterIcons: (iconNames: string[]) => void;\n\nexport function initializeIcons(): void {\n    [i].forEach(\n        (initialize) => {\n            const subset = initialize();\n            unregisterIcons && unregisterIcons(Object.keys(subset.icons));\n            registerIcons(subset, {\n                disableWarnings: true,\n            });\n        });\n}\n\nexport function use(\n    _registerIcons: (iconSubset: any, options?: Partial<IIconOptions>) => void,\n    _unregisterIcons?: (iconNames: string[]) => void,\n): void {\n    registerIcons = _registerIcons;\n    unregisterIcons = _unregisterIcons;\n}\n"
  },
  {
    "path": "packages/fluentui-icons/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/fluentui-react-cdn-typings/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/fluentui-react-cdn-typings/index.d.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as FluentUITypes from './types';\nimport {\n    ActionButton,\n    CommandBarButton,\n    DefaultButton,\n    IconButton,\n    PrimaryButton,\n} from '@fluentui/react/lib/Button';\nimport { ChoiceGroup } from '@fluentui/react/lib/ChoiceGroup';\nimport { ComboBox } from '@fluentui/react/lib/ComboBox';\nimport { CommandBar } from '@fluentui/react/lib/CommandBar';\nimport { ContextualMenuItemType } from '@fluentui/react/lib/ContextualMenu';\nimport { Customizer } from '@fluentui/react/lib/utilities';\nimport { Dialog, DialogFooter, DialogType } from '@fluentui/react/lib/Dialog';\nimport { Dropdown, DropdownMenuItemType } from '@fluentui/react/lib/Dropdown';\nimport { getFocusStyle, getTheme, loadTheme, registerIcons, unregisterIcons } from '@fluentui/react/lib/Styling';\nimport { Icon } from '@fluentui/react/lib/Icon';\nimport { Label } from '@fluentui/react/lib/Label';\nimport { Modal } from '@fluentui/react/lib/Modal';\nimport { Slider } from '@fluentui/react/lib/Slider';\nimport { Spinner, SpinnerSize } from '@fluentui/react/lib/Spinner';\nimport { TextField } from '@fluentui/react/lib/TextField';\nimport { Toggle } from '@fluentui/react/lib/Toggle';\n\nexport { FluentUITypes };\n\nexport interface FluentUIComponents {\n  ActionButton: typeof ActionButton;\n  ChoiceGroup: typeof ChoiceGroup;\n  ComboBox: typeof ComboBox;\n  CommandBar: typeof CommandBar;\n  ContextualMenuItemType: typeof ContextualMenuItemType;\n  Customizer: typeof Customizer;\n  DefaultButton: typeof DefaultButton;\n  Dialog: typeof Dialog;\n  DialogFooter: typeof DialogFooter;\n  DialogType: typeof DialogType;\n  Dropdown: typeof Dropdown;\n  DropdownMenuItemType: typeof DropdownMenuItemType;\n  Icon: typeof Icon;\n  IconButton: typeof IconButton;\n  getFocusStyle: typeof getFocusStyle;\n  getTheme: typeof getTheme;\n  Label: typeof Label;\n  loadTheme: typeof loadTheme;\n  Modal: typeof Modal;\n  PrimaryButton: typeof PrimaryButton;\n  Slider: typeof Slider;\n  Spinner: typeof Spinner;\n  SpinnerSize: typeof SpinnerSize;\n  TextField: typeof TextField;\n  Toggle: typeof Toggle;\n  registerIcons?: typeof registerIcons;\n  unregisterIcons?: typeof unregisterIcons;\n}\n"
  },
  {
    "path": "packages/fluentui-react-cdn-typings/package.json",
    "content": "{\n  \"name\": \"@msrvida/fluentui-react-cdn-typings\",\n  \"version\": \"2.1.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/fluentui-react-cdn-typings\"\n  },\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./*.d.ts\",\n    \"test\": \"tsc index.d.ts --lib es6 --skipLibCheck true\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"dependencies\": {\n    \"@fluentui/react\": \"^8\"\n  },\n  \"peerDependencies\": {\n    \"@types/react\": \">=16.8.0 <18.0.0\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/fluentui-react-cdn-typings/types.d.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport { IChoiceGroupOption } from '@fluentui/react/lib/ChoiceGroup';\n\nexport {\n    IButton,\n    IButtonProps,\n    IButtonStyles,\n} from '@fluentui/react/lib/Button';\n\nexport {\n    IContextualMenuItem,\n    IContextualMenuProps,\n    IContextualMenuRenderItem,\n} from '@fluentui/react/lib/ContextualMenu';\n\nexport { IDropdown, IDropdownProps, IDropdownOption } from '@fluentui/react/lib/Dropdown';\n\nexport { IComboBox, IComboBoxProps, IComboBoxOption } from '@fluentui/react/lib/ComboBox';\n\nexport { IChoiceGroup } from '@fluentui/react/lib/ChoiceGroup';\n\nexport { ISlider, ISliderProps } from '@fluentui/react/lib/Slider';\n\nexport { ITextField, ITextFieldProps } from '@fluentui/react/lib/TextField';\n\nexport { ICommandBarItemProps, ICommandBarProps } from '@fluentui/react/lib/CommandBar';\n\nexport { IToggleProps } from '@fluentui/react/lib/Toggle';\n\nexport { IDialogProps } from '@fluentui/react/lib/Dialog';\n\nexport { IStyle, ITheme, IPalette } from '@fluentui/react/lib/Styling';\n\nexport { ICSSRule, ICSSPixelUnitRule } from '@uifabric/merge-styles/lib/IRawStyleBase';\n"
  },
  {
    "path": "packages/powerbi/.gitignore",
    "content": "webpack.*.html\n*.pbiviz\ndist\n"
  },
  {
    "path": "packages/powerbi/.vscode/launch.json",
    "content": "{\n    \"version\": \"0.1.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Debugger\",\n            \"type\": \"chrome\",\n            \"request\": \"attach\",\n            \"port\": 9222,\n            \"sourceMaps\": true,\n            \"webRoot\": \"${cwd}/\"\n        }\n    ]\n}"
  },
  {
    "path": "packages/powerbi/.vscode/settings.json",
    "content": "{\n    \"editor.tabSize\": 4,\n    \"editor.insertSpaces\": true,\n    \"files.eol\": \"\\n\",\n    \"files.watcherExclude\": {\n        \"**/.git/objects/**\": true,\n        \"**/node_modules/**\": true,\n        \".tmp\": true\n    },\n    \"files.exclude\": {\n        \".tmp\": true\n    },\n    \"search.exclude\": {\n        \".tmp\": true,\n        \"typings\": true\n    },\n    \"json.schemas\": [\n        {\n            \"fileMatch\": [\n                \"/pbiviz.json\"\n            ],            \n            \"url\": \"./.api/v1.6.0/schema.pbiviz.json\"\n        },\n        {\n            \"fileMatch\": [\n                \"/capabilities.json\"\n            ],            \n            \"url\": \"./.api/v1.6.0/schema.capabilities.json\"\n        },\n        {\n            \"fileMatch\": [\n                \"/dependencies.json\"\n            ],            \n            \"url\": \"./.api/v1.6.0/schema.dependencies.json\"\n        }        \n    ]    \n}"
  },
  {
    "path": "packages/powerbi/capabilities.json",
    "content": "{\n    \"privileges\": [\n        {\n            \"name\": \"WebAccess\",\n            \"essential\": false\n        },\n        {\n            \"name\": \"ExportContent\",\n            \"essential\": true\n        },\n        {\n            \"name\": \"LocalStorage\",\n            \"essential\": false\n        }\n    ],\n    \"dataRoles\": [\n        {\n            \"displayName\": \"Values\",\n            \"name\": \"values\",\n            \"kind\": \"GroupingOrMeasure\"\n        }\n    ],\n    \"objects\": {\n        \"general\": {\n            \"displayName\": \"General\",\n            \"displayNameKey\": \"formattingGeneral\",\n            \"properties\": {\n                \"filter\": {\n                    \"type\": {\n                        \"filter\": true\n                    }\n                }\n            }\n        },\n        \"sandDanceMainSettings\": {\n            \"displayName\": \"SandDance\",\n            \"properties\": {\n                \"showchrome\": {\n                    \"displayName\": \"Show chrome\",\n                    \"type\": {\n                        \"bool\": true\n                    }\n                },\n                \"darktheme\": {\n                    \"displayName\": \"Dark theme\",\n                    \"type\": {\n                        \"bool\": true\n                    }\n                }\n            }\n        },\n        \"sandDanceConfig\": {\n            \"properties\": {\n                \"imageHolderJSON\": {\n                    \"type\": {\n                        \"text\": true\n                    }\n                },\n                \"setupJSON\": {\n                    \"filterState\": true,\n                    \"type\": {\n                        \"text\": true\n                    }\n                },\n                \"insightJSON\": {\n                    \"filterState\": true,\n                    \"type\": {\n                        \"text\": true\n                    }\n                },\n                \"selectionQueryJSON\": {\n                    \"filterState\": true,\n                    \"type\": {\n                        \"text\": true\n                    }\n                },\n                \"snapshotsJSON\": {\n                    \"type\": {\n                        \"text\": true\n                    }\n                },\n                \"tooltipExclusionsJSON\": {\n                    \"type\": {\n                        \"text\": true\n                    }\n                }\n            }\n        }\n    },\n    \"dataViewMappings\": [\n        {\n            \"table\": {\n                \"rows\": {\n                    \"for\": {\n                        \"in\": \"values\"\n                    },\n                    \"dataReductionAlgorithm\": {\n                        \"window\": {\n                            \"count\": 30000\n                        }\n                    }\n                }\n            }\n        }\n    ],\n    \"suppressDefaultTitle\": true\n}"
  },
  {
    "path": "packages/powerbi/package.json",
    "content": "{\n  \"name\": \"powerbi\",\n  \"private\": true,\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"lint\": \"npm run eslint\",\n    \"pbiviz\": \"pbiviz\",\n    \"start\": \"pbiviz start\",\n    \"build:08\": \"pbiviz package\",\n    \"version\": \"node ./scripts/version.js\",\n    \"prebuild:08\": \"npm run version\",\n    \"deploy\": \"node ./scripts/deploy.js\",\n    \"build:07\": \"tsc -p .\",\n    \"remove-vega\": \"npm un vega\"\n  },\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.26.10\",\n    \"@babel/runtime-corejs2\": \"^7.26.10\",\n    \"@fluentui/react\": \"^8\",\n    \"@msrvida/sanddance-explorer\": \"file:../sanddance-explorer\",\n    \"core-js\": \"3.2.1\",\n    \"powerbi\": \"file:\",\n    \"powerbi-models\": \"^2.0.1\",\n    \"powerbi-visuals-api\": \"~5.11.0\",\n    \"powerbi-visuals-utils-dataviewutils\": \"^6.1.0\",\n    \"react\": \">=16.8.0 <18.0.0\",\n    \"react-dom\": \">=16.8.0 <18.0.0\",\n    \"regenerator-runtime\": \"^0.13.3\",\n    \"vega\": \"^6.2.0\"\n  },\n  \"devDependencies\": {\n    \"@msrvida/fluentui-react-cdn-typings\": \"file:../fluentui-react-cdn-typings\",\n    \"@types/react\": \">=16.8.0 <18.0.0\",\n    \"@types/react-dom\": \">=16.8.0 <18.0.0\",\n    \"powerbi-visuals-tools\": \"^5\"\n  }\n}\n"
  },
  {
    "path": "packages/powerbi/pbiviz.json",
    "content": "{\n    \"visual\": {\n        \"name\": \"SandDance2019\",\n        \"displayName\": \"SandDance\",\n        \"guid\": \"SandDance201929976D117A654D0BAB8E96507442D80B\",\n        \"visualClassName\": \"Visual\",\n        \"version\": \"4.2.0.2\",\n        \"description\": \"Visually explore, understand, and present your data.\",\n        \"supportUrl\": \"https://github.com/Microsoft/SandDance/issues\",\n        \"gitHubUrl\": \"https://github.com/microsoft/SandDance\"\n    },\n    \"apiVersion\": \"5.11.0\",\n    \"author\": {\n        \"name\": \"Microsoft Research VIDA\",\n        \"email\": \"msrvida@microsoft.com\"\n    },\n    \"assets\": {\n        \"icon\": \"assets/icon.png\"\n    },\n    \"externalJS\": null,\n    \"style\": \"style/visual.less\",\n    \"capabilities\": \"capabilities.json\",\n    \"dependencies\": null,\n    \"stringResources\": []\n}"
  },
  {
    "path": "packages/powerbi/scripts/deploy.js",
    "content": "const fs = require('fs');\nconst pbiviz = require('../pbiviz.json');\nconst filename = `${pbiviz.visual.guid}.${pbiviz.visual.version}.pbiviz`;\nfs.copyFileSync(`./dist/${filename}`, `../../docs/dist/powerbi/v4/${filename}`);\n"
  },
  {
    "path": "packages/powerbi/scripts/version.js",
    "content": "const fs = require('fs');\nconst path = require('path');\n\nconst cwd = process.cwd();\n\nconsole.log('versioning...');\n\nconst pbivizJson = require(path.resolve(cwd, 'pbiviz.json'));\n\nconst ts = `// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nexport const version: string = '${pbivizJson.visual.version}';\n`;\n\nconst file = path.resolve(cwd, 'src', 'version.ts');\n\nfs.writeFileSync(file, ts);\n\nconsole.log('versioning complete');\n"
  },
  {
    "path": "packages/powerbi/src/app.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { fluentUIComponents } from './fluentUIComponents';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as vega from 'vega';\nimport {\n    capabilities,\n    DataFile,\n    Explorer,\n    Explorer_Class,\n    getColorSettingsFromThemePalette,\n    Props as ExplorerProps,\n    SandDance,\n    themePalettes,\n    use,\n    util,\n} from '@msrvida/sanddance-explorer';\nimport { Logo } from '@msrvida/sanddance-explorer/dist/es6/controls/logo';\nimport { language } from './language';\nimport { version } from './version';\nimport powerbiVisualsApi from 'powerbi-visuals-api';\nimport { LogView } from './logView';\n\n// tslint:disable-next-line\nuse(fluentUIComponents, React as any, ReactDOM as any, vega);\n\nfunction getThemePalette(darkTheme: boolean) {\n    const theme = darkTheme ? 'dark-theme' : '';\n    return themePalettes[theme];\n}\n\nexport interface ViewChangeOptions {\n    tooltipExclusions?: string[];\n    setup?: SandDance.types.Setup;\n    reason: string;\n}\n\nexport interface Props {\n    renderOptions: SandDance.types.RenderOptions;\n    mounted: (app: App) => void;\n    onViewChange: (viewChangeOptions: ViewChangeOptions) => void;\n    onError: (e: any) => void;\n    onDataFilter: (filter: SandDance.searchExpression.Search, filteredData: object[]) => void;\n    onSelectionChanged: (search: SandDance.searchExpression.Search, activeIndex: number, selectedData: object[]) => void;\n    onSnapshotsChanged: (snapshots: SandDance.types.Snapshot[]) => void;\n    onContextMenu: (e: MouseEvent | PointerEvent, selectionId?: powerbiVisualsApi.extensibility.ISelectionId) => void;\n    onSetupSave: (setup: SandDance.types.Setup) => void;\n}\n\nconst RIGHT_MOUSE_BUTTON = 2;\nconst cameraSettle = 200;\n\nexport interface State {\n    loaded: boolean;\n    editmode: boolean;\n    chromeless: boolean;\n    darkTheme: boolean;\n    rowCount: number;\n    fetching: boolean;\n    log: string[];\n}\n\nexport class App extends React.Component<Props, State> {\n    private viewerOptions: Partial<SandDance.types.ViewerOptions>;\n    public explorer: Explorer_Class;\n    private cameraTimer: number;\n    public lastCamera: SandDance.types.Camera;\n    public lastCameraStable: boolean;\n\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            loaded: false,\n            editmode: true,\n            chromeless: false,\n            darkTheme: null,\n            rowCount: null,\n            fetching: false,\n            log: [],\n        };\n        this.viewerOptions = this.getViewerOptions();\n    }\n\n    finalize() {\n        this.endCameraListener();\n        this.explorer && this.explorer.finalize();\n        this.explorer = null;\n    }\n\n    private getViewerOptions(darkTheme?: boolean): Partial<SandDance.types.ViewerOptions> {\n        return {\n            colors: getColorSettingsFromThemePalette(themePalettes[darkTheme ? 'dark-theme' : '']),\n            onCubeClick: (e, cube) => {\n                const { button } = <PointerEvent>e;\n                if (button === RIGHT_MOUSE_BUTTON) {\n                    const row = this.explorer.state.dataContent.data[cube.ordinal];\n                    const selectionId = row[SandDance.constants.FieldNames.PowerBISelectionId];\n                    this.props.onContextMenu(<MouseEvent>e, selectionId);\n                    e.stopPropagation();\n                    e.preventDefault();\n                    return;\n                }\n            },\n            onDataFilter: this.props.onDataFilter,\n            onSelectionChanged: this.props.onSelectionChanged,\n            preserveDrawingBuffer: true,\n            onVegaSpec: () => {\n                this.endCameraListener();\n            },\n            disableLasso: true,\n        };\n    }\n\n    getDataContent() {\n        return this.explorer && this.explorer.state.dataContent && this.explorer.state.dataContent.data;\n    }\n\n    load(data: DataFile | object[], getPartialInsight: (columns: SandDance.types.Column[]) => Partial<SandDance.specs.Insight>, setup: SandDance.types.Setup, tooltipExclusions: string[], snapshots: SandDance.types.Snapshot[], snapshotIndex?: number) {\n        const wasLoaded = this.state.loaded;\n        const { explorer } = this;\n        if (wasLoaded) {\n            const { historyItems, sideTabId } = explorer.state;\n            const loaded = () => {\n                this.log('reloading history');\n                const last = historyItems[historyItems.length - 1];\n                historyItems.push({\n                    historicInsight: { ...last?.historicInsight || {} },\n                    label: language.historyActionDataChange,\n                });\n                const historyIndex = historyItems.length - 1;\n                explorer.setState({ historyIndex, historyItems, sideTabId });\n            };\n            explorer.setState({\n                calculating: () => {\n                    explorer.load(data, getPartialInsight, { tooltipExclusions, setup }).then(loaded);\n                    explorer.setState({ snapshots });\n                    this.manageSnapshot(snapshotIndex);\n                },\n            });\n        } else {\n            explorer.load(data, getPartialInsight, { tooltipExclusions, setup });\n            explorer.setState({ snapshots });\n            this.manageSnapshot(snapshotIndex);\n        }\n        this.setState({ loaded: true });\n    }\n\n    private beginCameraListener(transitionFinal: boolean, stable: boolean) {\n        const { viewer } = this.explorer;\n        this.lastCameraStable = stable;\n        this.lastCamera = viewer.getCamera(transitionFinal);\n        const { transitionDurations } = viewer.setup;\n        this.cameraTimer = setTimeout(() => this.listenToCamera(), transitionDurations.position + transitionDurations.stagger + cameraSettle);\n    }\n\n    private endCameraListener() {\n        clearTimeout(this.cameraTimer);\n    }\n\n    private listenToCamera() {\n        const currCamera = this.explorer.viewer.getCamera(false);\n        const compare = util.deepCompare(currCamera, this.lastCamera);\n        let stable = this.lastCameraStable;\n        if (this.lastCameraStable) {\n            if (!compare) {\n                //camera has moved, listen for stability\n                stable = false;\n            }\n        } else {\n            if (compare) {\n                //unstable camera has stabilized\n                const setup = this.explorer.getSetup();\n                setup.camera = currCamera;\n                this.props.onSetupSave(setup);\n                stable = true;\n            }\n        }\n        this.beginCameraListener(false, stable);\n    }\n\n    manageSnapshot(selectedSnapshotIndex: number) {\n        const { explorer } = this;\n        if (selectedSnapshotIndex != null) {\n            if (selectedSnapshotIndex !== explorer.state.selectedSnapshotIndex) {\n                explorer.reviveSnapshot(selectedSnapshotIndex);\n            }\n        } else {\n            explorer.setState({ selectedSnapshotIndex });\n        }\n    }\n\n    unload() {\n        this.endCameraListener();\n        this.setState({ loaded: false });\n    }\n\n    fetchStatus(rowCount: number, fetching: boolean) {\n        this.setState({ rowCount, fetching });\n    }\n\n    changeTheme(darkTheme: boolean) {\n        this.viewerOptions = this.getViewerOptions(darkTheme);\n        if (this.state.darkTheme !== darkTheme && this.explorer) {\n            this.explorer.updateViewerOptions(this.viewerOptions);\n            SandDance.VegaMorphCharts.base.vega.scheme(SandDance.constants.ColorScaleNone, x => this.explorer.viewer.options.colors.defaultCube);\n            if (this.explorer.viewer) {\n                this.explorer.viewer.renderSameLayout(this.explorer.viewerOptions);\n            }\n        }\n        fluentUIComponents.loadTheme({ palette: getThemePalette(darkTheme) });\n        this.setState({ darkTheme });\n    }\n\n    setChromeless(chromeless: boolean) {\n        if (chromeless === this.state.chromeless) return;\n        this.setState({ chromeless });\n        this.explorer.sidebar(chromeless, !chromeless);\n        this.explorer.resize();\n    }\n\n    log(message: string, insightSetup?: SandDance.types.InsightSetup) {\n        if (insightSetup) {\n            const { insight, setup } = insightSetup;\n            message = `${message}\\n insight: ${JSON.stringify(insight)}\\n setup: ${JSON.stringify(setup)}`;\n        }\n        this.setState({ log: [...this.state.log, message] });\n    }\n\n    render() {\n        const { props, state } = this;\n        const className = util.classList(\n            'sanddance-app',\n            state.editmode && 'editmode',\n            state.chromeless && 'chromeless',\n            state.loaded && 'loaded',\n        );\n        const explorerProps: ExplorerProps = {\n            renderOptions: props.renderOptions,\n            hideSidebarControls: true,\n            logoClickUrl: 'https://microsoft.github.io/SandDance/',\n            bingSearchDisabled: true,\n            searchORDisabled: true,\n            theme: state.darkTheme && 'dark-theme',\n            viewerOptions: this.viewerOptions,\n            initialView: '2d',\n            mounted: explorer => {\n                // explorer.snapshotThumbWidth = 240;\n                this.explorer = explorer;\n                props.mounted(this);\n            },\n            onSetupOptionsChanged: this.props.onSetupSave,\n            onSignalChanged: () => {\n                props.onViewChange({ reason: 'onSignalChanged' });\n            },\n            snapshotProps: {\n                hidden: !this.explorer?.state.snapshots || this.explorer?.state.snapshots.length === 0,\n            },\n            onSnapshotsChanged: props.onSnapshotsChanged,\n            onTooltipExclusionsChanged: tooltipExclusions => props.onViewChange({ tooltipExclusions, reason: 'onTooltipExclusionsChanged' }),\n            onView: () => {\n                this.beginCameraListener(true, true);\n                this.explorer.viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl).oncontextmenu = (e) => {\n                    props.onContextMenu(e);\n                    return false;\n                };\n                props.onViewChange({ reason: 'onView' });\n            },\n            onError: props.onError,\n            systemInfoChildren: [\n                React.createElement('li', null, `${language.powerBiCustomVisual}: ${version}`),\n                React.createElement('li', null,\n                    React.createElement(LogView, {\n                        clearLog: () => this.setState({ log: [] }),\n                        log: state.log,\n                    }),\n                ),\n            ],\n        };\n        return React.createElement('div', { className },\n            React.createElement(Explorer, explorerProps),\n            React.createElement('div', { className: 'sanddance-init' },\n                React.createElement('div', null,\n                    React.createElement(Logo),\n                ),\n                !capabilities.webgl && React.createElement('div', { className: 'sanddance-webgl-required' },\n                    language.webglDisabled,\n                ),\n            ),\n            state.fetching && React.createElement('div', { className: 'sanddance-fetch' },\n                `${language.fetching} ${state.rowCount ? `(${state.rowCount} ${language.fetched})` : ''}`,\n            ),\n        );\n    }\n}\n"
  },
  {
    "path": "packages/powerbi/src/cleanInsight.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport { SandDance } from '@msrvida/sanddance-explorer';\n\nexport function cleanInsight(insight: SandDance.specs.Insight, removeFilter = true) {\n    delete insight.size;\n    if (removeFilter) {\n        delete insight.filter;\n    }\n    visit(insight);\n}\n\nfunction visit(o: object) {\n    const props = Object.keys(o);\n    props.forEach(prop => {\n        if (o[prop] === null) {\n            delete o[prop];\n        } else if (typeof o[prop] === 'object') {\n            visit(o[prop]);\n        }\n    });\n}\n"
  },
  {
    "path": "packages/powerbi/src/convertFilter.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport * as powerbiModels from 'powerbi-models';\nimport powerbiVisualsApi from 'powerbi-visuals-api';\nimport { SandDance } from '@msrvida/sanddance-explorer';\n\ninterface ExprSourceEntity extends powerbiVisualsApi.data.ISQExpr {\n    source?: { entity?: string; };\n}\n\nexport function convertFilter(searchFilter: SandDance.searchExpression.Search, columns: powerbiVisualsApi.DataViewMetadataColumn[], data: object[]) {\n    const selectedIds: powerbiVisualsApi.extensibility.ISelectionId[] = [];\n    const filters: powerbiModels.IFilter[] = [];\n    const groups = SandDance.searchExpression.ensureSearchExpressionGroupArray(searchFilter);\n    groups.forEach(group =>\n        group.expressions.forEach(ex => {\n            if (!ex) return;\n            if (ex.name === SandDance.constants.GL_ORDINAL) {\n                // it would be ideal to filter to a single row identity, but the PowerBI API currently does not let us do that.\n                // so, we will filter to data points that have the same values\n                const dataPoint = getDataPoint(<number>ex.value, data);\n                if (dataPoint) {\n                    filterSimilar(dataPoint, columns, filters);\n                    // then we will select this data point\n                    selectedIds.push(dataPoint[SandDance.constants.FieldNames.PowerBISelectionId]);\n                }\n            } else {\n                const column = columns.filter(c => c.displayName === ex.name)[0];\n                if (column) {\n                    const advancedFilter = convertExpressionToAdvancedFilter(ex, column);\n                    if (advancedFilter) {\n                        filters.push(advancedFilter.toJSON());\n                    }\n                }\n            }\n        }),\n    );\n    return { filters, selectedIds };\n}\n\nfunction getDataPoint(GL_ORDINAL: number, data: object[]) {\n    for (let i = 0; i < data.length; i++) {\n        if (data[i][SandDance.constants.GL_ORDINAL] === GL_ORDINAL) {\n            return data[i];\n        }\n    }\n}\n\nfunction filterSimilar(data: object, columns: powerbiVisualsApi.DataViewMetadataColumn[], filters: powerbiModels.IFilter[]) {\n    columns.forEach(column => {\n        const value = data[column.displayName];\n\n        // INVESTIGATION: booleans do not work with filter api\n        if (typeof value === 'boolean') return;\n\n        let condition: powerbiModels.IAdvancedFilterCondition;\n        if (value == null) {\n            condition = { operator: 'IsBlank' };\n        } else {\n            condition = { operator: 'Is', value };\n        }\n        filters.push(createAdvancedFilter(column, condition).toJSON());\n    });\n}\n\nfunction createAdvancedFilter(column: powerbiVisualsApi.DataViewMetadataColumn, condition: powerbiModels.IAdvancedFilterCondition): powerbiModels.AdvancedFilter {\n    if (condition.operator === 'None') {\n        return null;\n    } else {\n        const expr: ExprSourceEntity = column.expr;\n        const target: powerbiModels.IFilterColumnTarget = {\n            table: expr.source?.entity,\n            column: column.displayName,\n        };\n        return new powerbiModels.AdvancedFilter(target, 'And', condition);\n    }\n}\n\nfunction convertExpressionToAdvancedFilter(ex: SandDance.searchExpression.SearchExpression, column: powerbiVisualsApi.DataViewMetadataColumn): powerbiModels.AdvancedFilter {\n    let condition: powerbiModels.IAdvancedFilterCondition;\n    if (ex.value == null) {\n        switch (ex.operator) {\n            case '==': {\n                condition = { operator: 'IsBlank' };\n                break;\n            }\n            case '!=': {\n                condition = { operator: 'IsNotBlank' };\n                break;\n            }\n        }\n    }\n    if (!condition) {\n        condition = {\n            operator: convertExpressionOperator(ex.operator),\n            value: ex.value,\n        };\n    }\n    return createAdvancedFilter(column, condition);\n}\n\nfunction convertExpressionOperator(operator: SandDance.searchExpression.SearchExpressionOperators): powerbiModels.AdvancedFilterConditionOperators {\n    switch (operator) {\n        case '!=': return 'IsNot';\n        case '!contains': return 'DoesNotContain';\n        case '!isnullorEmpty': return 'IsNotBlank';\n        case '!starts': return 'DoesNotStartWith';\n        case '<': return 'LessThan';\n        case '<=': return 'LessThanOrEqual';\n        case '==': return 'Is';\n        case '>': return 'GreaterThan';\n        case '>=': return 'GreaterThanOrEqual';\n        case 'contains': return 'Contains';\n        case 'isnullorEmpty': return 'IsBlank';\n        case 'starts': return 'StartsWith';\n        default: return 'None';\n    }\n}\n"
  },
  {
    "path": "packages/powerbi/src/convertTableToObjectArray.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport powerbi from 'powerbi-visuals-api';\nimport { SandDance, util } from '@msrvida/sanddance-explorer';\n\nexport function convertTableToObjectArray(table: powerbi.DataViewTable, oldData: object[], host: powerbi.extensibility.visual.IVisualHost) {\n    let different: boolean;\n    if (oldData) {\n        different = table.rows.length !== oldData.length;\n    } else {\n        different = true;\n    }\n    const columnNames = table.columns.map(c => c.displayName);\n    const data = table.rows.map((row, ri) => {\n        const newObject: object = {};\n        columnNames.forEach((cn, ci) => {\n            const value = row[ci];\n            newObject[cn] = value;\n            if (!different) {\n                const oldObject = oldData && oldData[ri];\n                if (oldObject[cn] !== value) {\n                    different = true;\n                }\n            }\n        });\n        newObject[SandDance.constants.FieldNames.PowerBISelectionId] = host.createSelectionIdBuilder().withTable(table, ri).createSelectionId();\n        if (!different && ri === 0) {\n            // check that all keys are the same\n            const oldKeys = Object.keys(oldData[0]).filter(key => !SandDance.util.isInternalFieldName(key, true));\n            const newKeys = Object.keys(newObject).filter(key => !SandDance.util.isInternalFieldName(key, true));\n            if (!util.deepCompare(oldKeys, newKeys)) {\n                different = true;\n            }\n        }\n        return newObject;\n    });\n    return { data, different };\n}\n"
  },
  {
    "path": "packages/powerbi/src/fluentUIComponents.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport {\n    ActionButton,\n    DefaultButton,\n    IconButton,\n    PrimaryButton,\n} from '@fluentui/react/lib/Button';\nimport { ChoiceGroup } from '@fluentui/react/lib/ChoiceGroup';\nimport { ComboBox } from '@fluentui/react/lib/ComboBox';\nimport { CommandBar } from '@fluentui/react/lib/CommandBar';\nimport { ContextualMenuItemType } from '@fluentui/react/lib/ContextualMenu';\nimport { Customizer } from '@fluentui/react/lib/Utilities';\nimport { Dialog, DialogFooter, DialogType } from '@fluentui/react/lib/Dialog';\nimport { Dropdown, DropdownMenuItemType } from '@fluentui/react/lib/Dropdown';\nimport { FluentUIComponents } from '@msrvida/fluentui-react-cdn-typings';\nimport { getFocusStyle, getTheme, loadTheme, registerIcons, unregisterIcons } from '@fluentui/react/lib/Styling';\nimport { Icon } from '@fluentui/react/lib/Icon';\nimport { initializeIcons, use } from '@msrvida/fluentui-icons';\nimport { Label } from '@fluentui/react/lib/Label';\nimport { Modal } from '@fluentui/react/lib/Modal';\nimport { Slider } from '@fluentui/react/lib/Slider';\nimport { Spinner, SpinnerSize } from '@fluentui/react/lib/Spinner';\nimport { TextField } from '@fluentui/react/lib/TextField';\nimport { Toggle } from '@fluentui/react/lib/Toggle';\n\nuse(registerIcons);\ninitializeIcons();\n\n/* tslint:disable */\nexport const fluentUIComponents: FluentUIComponents = {\n    ActionButton: ActionButton as any,\n    ChoiceGroup: ChoiceGroup as any,\n    ComboBox: ComboBox as any,\n    CommandBar: CommandBar as any,\n    ContextualMenuItemType,\n    Customizer: Customizer as any,\n    DefaultButton: DefaultButton as any,\n    Dialog: Dialog as any,\n    DialogFooter: DialogFooter as any,\n    DialogType,\n    Dropdown: Dropdown as any,\n    DropdownMenuItemType: DropdownMenuItemType as any,\n    Icon: Icon as any,\n    IconButton: IconButton as any,\n    getFocusStyle,\n    getTheme,\n    Label: Label as any,\n    loadTheme,\n    Modal: Modal as any,\n    PrimaryButton: PrimaryButton as any,\n    Slider: Slider as any,\n    Spinner: Spinner as any,\n    SpinnerSize,\n    TextField: TextField as any,\n    Toggle: Toggle as any,\n    registerIcons,\n    unregisterIcons,\n};\n"
  },
  {
    "path": "packages/powerbi/src/fontfix.ts",
    "content": "window.FabricConfig = { fontBaseUrl: '' };\n"
  },
  {
    "path": "packages/powerbi/src/language.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport const language = {\n    bookmarkCamera: 'Save camera position for bookmarks',\n    fetching: 'fetching...',\n    fetched: 'loaded',\n    powerBiCustomVisual: 'Power BI custom visual version',\n    diagnosticsLog: 'Diagnostics Log',\n    buttonClear: 'Clear',\n    historyActionDataChange: 'Power BI data change',\n    historyActionUpdate: 'Power BI update',\n    webglDisabled: 'SandDance requires a WebGL enabled browser.',\n};\n"
  },
  {
    "path": "packages/powerbi/src/logView.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport * as React from 'react';\nimport { controls } from '@msrvida/sanddance-explorer';\nimport { language } from './language';\nimport { DefaultButton } from '@fluentui/react';\n\nexport interface Props {\n    log: string[];\n    clearLog: () => void;\n}\n\nexport interface State {\n    showDialog: boolean;\n}\n\nexport class LogView extends React.Component<Props, State> {\n\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            showDialog: false,\n        };\n    }\n\n    render() {\n        const { props, state } = this;\n        return (\n            <span>\n                <a\n                    href='#'\n                    onClick={e => {\n                        e.preventDefault();\n                        this.setState({ showDialog: true });\n                    }}\n                >{language.diagnosticsLog}</a>\n                <controls.Dialog\n                    title={language.diagnosticsLog}\n                    buttons={[\n                        <DefaultButton\n                            key='clear'\n                            iconProps={{ iconName: 'Clear' }}\n                            text={language.buttonClear}\n                            onClick={props.clearLog}\n                        />,\n                    ]}\n                    hidden={!state.showDialog}\n                    onDismiss={() => this.setState({ showDialog: false })}\n                    minWidth={'40em'}\n                >\n                    <textarea cols={80} rows={10} value={props.log.map((s, i) => `${i}: ${s}`).join('\\n\\n')} />\n                </controls.Dialog>\n            </span>\n        );\n    }\n}\n"
  },
  {
    "path": "packages/powerbi/src/settings.ts",
    "content": "/*\n *  Power BI Visualizations\n *\n *  Copyright (c) Microsoft Corporation\n *  All rights reserved.\n *  MIT License\n *\n *  Permission is hereby granted, free of charge, to any person obtaining a copy\n *  of this software and associated documentation files (the \"\"Software\"\"), to deal\n *  in the Software without restriction, including without limitation the rights\n *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *  copies of the Software, and to permit persons to whom the Software is\n *  furnished to do so, subject to the following conditions:\n *\n *  The above copyright notice and this permission notice shall be included in\n *  all copies or substantial portions of the Software.\n *\n *  THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n *  THE SOFTWARE.\n */\n\n'use strict';\n\nimport powerbiVisualsApi from 'powerbi-visuals-api';\nimport DataViewPropertyValue = powerbiVisualsApi.DataViewPropertyValue;\n\nimport { dataViewObjectsParser } from 'powerbi-visuals-utils-dataviewutils';\nimport DataViewObjectsParser = dataViewObjectsParser.DataViewObjectsParser;\n\nexport class SandDanceConfig {\n  [propertyName: string]: DataViewPropertyValue;\n  setupJSON: string = '';\n  insightJSON: string = '';\n  selectionQueryJSON: string = '';\n  snapshotsJSON: string = '';\n  tooltipExclusionsJSON: string = '';\n  imageHolderJSON: string = '';\n}\n\nexport class SandDanceMainSettings {\n    showchrome: boolean = true;\n    showdebug: boolean = false;\n    darktheme: boolean = false;\n}\n\nexport interface IVisualSettings {\n  sandDanceConfig?: SandDanceConfig;\n  sandDanceMainSettings?: SandDanceMainSettings;\n}\n\nexport class VisualSettings extends DataViewObjectsParser implements IVisualSettings {\n    public sandDanceConfig = new SandDanceConfig();\n    public sandDanceMainSettings = new SandDanceMainSettings();\n}\n"
  },
  {
    "path": "packages/powerbi/src/version.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nexport const version: string = '4.2.0.2';\n"
  },
  {
    "path": "packages/powerbi/src/visual.ts",
    "content": "/*\n*  Power BI Visual CLI\n*\n*  Copyright (c) Microsoft Corporation\n*  All rights reserved.\n*  MIT License\n*\n*  Permission is hereby granted, free of charge, to any person obtaining a copy\n*  of this software and associated documentation files (the \"\"Software\"\"), to deal\n*  in the Software without restriction, including without limitation the rights\n*  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n*  copies of the Software, and to permit persons to whom the Software is\n*  furnished to do so, subject to the following conditions:\n*\n*  The above copyright notice and this permission notice shall be included in\n*  all copies or substantial portions of the Software.\n*\n*  THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n*  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n*  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n*  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n*  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n*  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n*  THE SOFTWARE.\n*/\n'use strict';\n\nimport './fontfix';\nimport 'core-js/stable';\nimport 'regenerator-runtime/runtime';\nimport './../style/visual.less';\nimport powerbiVisualsApi from 'powerbi-visuals-api';\nimport VisualConstructorOptions = powerbiVisualsApi.extensibility.visual.VisualConstructorOptions;\nimport VisualUpdateOptions = powerbiVisualsApi.extensibility.visual.VisualUpdateOptions;\nimport IVisual = powerbiVisualsApi.extensibility.visual.IVisual;\nimport EnumerateVisualObjectInstancesOptions = powerbiVisualsApi.EnumerateVisualObjectInstancesOptions;\nimport VisualObjectInstance = powerbiVisualsApi.VisualObjectInstance;\nimport DataView = powerbiVisualsApi.DataView;\nimport VisualObjectInstanceEnumerationObject = powerbiVisualsApi.VisualObjectInstanceEnumerationObject;\n\nimport * as powerbiModels from 'powerbi-models';\n\nimport { capabilities, SandDance, util as util2 } from '@msrvida/sanddance-explorer';\nimport { convertFilter } from './convertFilter';\nimport { createElement } from 'react';\nimport { render } from 'react-dom';\nimport { App, Props, ViewChangeOptions } from './app';\nimport { convertTableToObjectArray } from './convertTableToObjectArray';\nimport { cleanInsight } from './cleanInsight';\nimport { VisualSettings, SandDanceConfig, IVisualSettings } from './settings';\nimport { language } from './language';\n\nconst util1 = SandDance.VegaMorphCharts.util;\nconst util = { ...util1, ...util2 };\n\nexport class Visual implements IVisual {\n    private settings: VisualSettings;\n    private viewElement: HTMLElement;\n    private errorElement: HTMLElement;\n    private events: powerbiVisualsApi.extensibility.IVisualEventService;\n    private renderingOptions: VisualUpdateOptions;\n    private app: App;\n    private prevSettings: IVisualSettings;\n    private host: powerbiVisualsApi.extensibility.visual.IVisualHost;\n    private selectionManager: powerbiVisualsApi.extensibility.ISelectionManager;\n    private fetchMoreTimer: number;\n    private filters: { sd: SandDance.searchExpression.Search, pbi: powerbiModels.IFilter[] };\n    private columns: powerbiVisualsApi.DataViewMetadataColumn[];\n    private setInsightSetup: SandDance.types.InsightSetup;\n\n    public persistSelectionChange: boolean;\n    public sanddanceRenderOptions: SandDance.types.RenderOptions;\n    public afterView: (() => void)[];\n    public search: SandDance.searchExpression.Search;\n    public snapshots: SandDance.types.Snapshot[];\n\n    public static fetchMoreTimeout = 5000;\n\n    constructor(options: VisualConstructorOptions) {\n        this.host = options.host;\n        this.events = this.host.eventService;\n        this.selectionManager = this.host.createSelectionManager();\n        this.afterView = [];\n        this.sanddanceRenderOptions = {};\n        this.persistSelectionChange = true;\n\n        if (document) {\n            this.initialize(options);\n        }\n    }\n\n    initialize(options: VisualConstructorOptions) {\n        options.element.style.position = 'relative';\n        this.viewElement = util.addDiv(options.element, 'sanddance-powerbi');\n        this.errorElement = util.addDiv(options.element, 'sanddance-error');\n        this.errorElement.style.position = 'absolute';\n\n        const props: Props = {\n            renderOptions: this.sanddanceRenderOptions,\n            mounted: (app: App) => {\n                app.log('mounted');\n                this.app = app;\n            },\n            onSetupSave: (setup) => {\n                this.app.log('onCameraChange', { insight: null, setup });\n                this.persist({ setup, reason: 'onSetupSave' });\n            },\n            onContextMenu: (e: MouseEvent | PointerEvent, selectionId?: powerbiVisualsApi.extensibility.ISelectionId) => {\n                const position: powerbiVisualsApi.extensibility.IPoint = {\n                    x: e.clientX,\n                    y: e.clientY,\n                };\n                this.selectionManager.showContextMenu(selectionId || {}, position);\n            },\n            onViewChange: viewChangeOptions => {\n                this.app.log('onViewChange');\n                if (this.afterView.length) {\n                    this.afterView.forEach(fn => fn());\n                    this.afterView.length = 0;\n                }\n\n                if (this.renderingOptions) {\n                    this.events.renderingFinished(this.renderingOptions);\n                }\n\n                this.persist(viewChangeOptions);\n            },\n            onSnapshotsChanged: snapshots => {\n                this.snapshots = snapshots;\n                this.persist({ reason: 'onSnapshotsChanged' });\n            },\n            onError: (e: any) => {\n                if (this.renderingOptions) {\n                    this.events.renderingFailed(this.renderingOptions);\n                    this.renderingOptions = null;\n                }\n            },\n            onDataFilter: (searchFilter, filteredData) => {\n                this.app.log('onDataFilter');\n                this.persist({ reason: 'onDataFilter' });\n                if (filteredData) {\n                    const result = convertFilter(searchFilter, this.columns, filteredData);\n                    this.applySelection(result.selectedIds);\n                    this.applyFilters(result.filters);\n                    this.filters = { sd: searchFilter, pbi: result.filters };\n                } else {\n                    this.filters = null;\n                    this.clearFilter();\n                    this.clearSelection();\n                }\n            },\n            onSelectionChanged: (search, activeIndex, selectedData) => {\n                this.app.log(`onSelectionChanged\\n search: ${JSON.stringify(search)}\\n persistSelectionChange: ${this.persistSelectionChange}`);\n\n                this.search = search;\n\n                if (this.persistSelectionChange) {\n                    this.persist({ reason: 'onSelectionChanged' });\n                }\n                this.persistSelectionChange = true;\n\n                if (selectedData?.length) {\n                    const result = convertFilter(search, this.columns, selectedData);\n                    this.applySelection(result.selectedIds);\n                    this.applyFilters(this.filters ? this.filters.pbi.concat(result.filters) : result.filters);\n\n                } else {\n                    this.clearSelection();\n                    // revert to filtered if it exists\n                    if (this.filters) {\n                        this.applyFilters(this.filters.pbi);\n                    } else {\n                        this.clearFilter();\n                    }\n                }\n            },\n        };\n        render(createElement(App, props), this.viewElement);\n    }\n\n    persist(options: ViewChangeOptions) {\n        if (this.renderingOptions.viewMode !== powerbiVisualsApi.ViewMode.View) {\n            const { explorer } = this.app;\n            if (!explorer.viewer) return;\n            const insight = this.setInsightSetup?.insight || explorer.viewer.getInsight();\n            const setup = options.setup || this.setInsightSetup?.setup || explorer.getSetup();\n            this.setInsightSetup = null;\n            const tooltipExclusions = options.tooltipExclusions || explorer.state.tooltipExclusions;\n            cleanInsight(insight, false);\n            const config: SandDanceConfig = {\n                setupJSON: JSON.stringify(setup),\n                insightJSON: JSON.stringify(insight),\n                selectionQueryJSON: JSON.stringify(this.search),\n                snapshotsJSON: JSON.stringify(this.snapshots || []),\n                tooltipExclusionsJSON: JSON.stringify(tooltipExclusions),\n                imageHolderJSON: JSON.stringify(explorer.imageHolder),\n            };\n            this.app.log(`persist reason: ${options.reason}`, { insight, setup });\n            if (util.deepCompare(this.settings.sandDanceConfig, config)) {\n                this.app.log('persist skipped');\n            } else {\n                this.host.persistProperties({ replace: [{ objectName: 'sandDanceConfig', properties: config, selector: null }] });\n            }\n        }\n    }\n\n    applySelection(selectedIds: powerbiVisualsApi.extensibility.ISelectionId[]) {\n        if (selectedIds.length) {\n            this.selectionManager.select(selectedIds, false);\n        } else {\n            this.clearSelection();\n        }\n    }\n\n    clearSelection() {\n        this.selectionManager.clear();\n    }\n\n    applyFilters(filters: powerbiModels.IFilter[]) {\n        this.host.applyJsonFilter(null, 'general', 'filter', powerbiVisualsApi.FilterAction.merge);\n        this.host.applyJsonFilter(filters, 'general', 'filter', powerbiVisualsApi.FilterAction.merge);\n    }\n\n    clearFilter() {\n        this.applyFilters(null);\n    }\n\n    destroy() {\n        this.app && this.app.finalize();\n        this.app = null;\n    }\n\n    public update(options: VisualUpdateOptions) {\n        this.app.log(`visual update operationKind: ${options.operationKind}`);\n        this.renderingOptions = options;\n        this.events.renderingStarted(this.renderingOptions);\n\n        if (this.fetchMoreTimer) {\n            clearTimeout(this.fetchMoreTimer);\n        }\n\n        if (!capabilities.webgl) {\n            this.app.unload();\n            return;\n        }\n\n        const dataView = options && options.dataViews && options.dataViews[0];\n        if (!dataView || !dataView.table) {\n            this.app.unload();\n        } else {\n            this.columns = dataView.metadata.columns;\n            let doneFetching = true;\n            if (dataView.metadata.segment) {\n                doneFetching = !this.host.fetchMoreData();\n            }\n            this.app.fetchStatus(dataView.table.rows.length, !doneFetching);\n            if (doneFetching) {\n                this.show(dataView);\n            } else {\n                this.fetchMoreTimer = window.setTimeout(() => {\n                    this.app.fetchStatus(dataView.table.rows.length, false);\n                    this.show(dataView);\n\n                }, Visual.fetchMoreTimeout);\n            }\n        }\n    }\n\n    show(dataView: powerbiVisualsApi.DataView) {\n        this.app.log('show');\n\n        this.settings = Visual.parseSettings(dataView);\n        const oldData = this.app.getDataContent();\n        const result = convertTableToObjectArray(dataView.table, oldData, this.host);\n        let { different } = result;\n        const { data } = result;\n        if (!this.prevSettings) {\n            different = true;\n        }\n\n        const { sandDanceConfig, sandDanceMainSettings } = this.settings;\n\n        this.app.setState({ editmode: this.renderingOptions.viewMode !== powerbiVisualsApi.ViewMode.View });\n        this.app.setChromeless(!sandDanceMainSettings.showchrome);\n        this.app.changeTheme(this.settings.sandDanceMainSettings.darktheme);\n\n        const p = this.app.explorer?.viewer?.presenter;\n        if (p) {\n            p.morphchartsref.core.config.textColor = [0, 0, 0];\n            p.morphchartsref.core.config.isDebugVisible = sandDanceMainSettings.showdebug;\n        }\n\n        this.prevSettings = util.clone(this.settings);\n\n        const setup: SandDance.types.Setup = this.tryGetSetup(sandDanceConfig);\n\n        if (different) {\n            this.showDifferent(data, sandDanceConfig, setup);\n        } else {\n            this.showSame(sandDanceConfig, setup);\n        }\n    }\n\n    showSame(sandDanceConfig: SandDanceConfig, setup: SandDance.types.Setup) {\n        this.app.log('showSame');\n\n        const renderingFinished = () => {\n            this.events.renderingFinished(this.renderingOptions);\n        };\n\n        this.syncSelection(sandDanceConfig.selectionQueryJSON, false);\n        const setInsight = this.trySetInsight(sandDanceConfig, setup);\n        if (!setInsight) {\n            this.app.log('same insight');\n            const { camera: cameraOrHold, renderer } = setup;\n            let camera: SandDance.types.Camera;\n            let holdCamera = this.app.explorer.state.holdCamera;\n            if (cameraOrHold === 'hold') {\n                holdCamera = true;\n            } else {\n                camera = cameraOrHold;\n            }\n            this.app.explorer.setState({ camera, holdCamera, renderer });\n        }\n        return renderingFinished();\n    }\n\n    showDifferent(data: object[], sandDanceConfig: SandDanceConfig, setup: SandDance.types.Setup) {\n        this.app.log('showDifferent');\n\n        this.tryUpdateSnapshots(sandDanceConfig);\n\n        const tooltipExclusions: string[] = this.tryGetTooltipExclusions(sandDanceConfig);\n\n        this.app.load(\n            data,\n            columns => {\n                if (!columns) return;\n\n                // remove column which contains powerbi selectionId\n                for (let i = 0; i < columns.length; i++) {\n                    if (SandDance.util.isInternalFieldName(columns[i].name)) {\n                        columns.splice(i, 1);\n                        i--;\n                    }\n                }\n\n                this.syncSelection(sandDanceConfig.selectionQueryJSON, true);\n                this.syncBackgroundImage(sandDanceConfig.imageHolderJSON);\n\n                const insight: SandDance.specs.Insight = this.tryGetInsight(sandDanceConfig);\n\n                if (this.filters && insight) {\n                    insight.filter = this.filters.sd;\n                }\n\n                this.setInsightSetup = { insight, setup };\n\n                return insight;\n            },\n            setup,\n            tooltipExclusions,\n            this.snapshots,\n        );\n    }\n\n    tryGetInsight(sandDanceConfig: SandDanceConfig) {\n        let insight: SandDance.specs.Insight;\n        if (sandDanceConfig.insightJSON) {\n            try {\n                insight = JSON.parse(sandDanceConfig.insightJSON);\n                delete insight.size;\n            } catch (e) {\n                // continue regardless of error\n            }\n        }\n        return insight;\n    }\n\n    tryGetSetup(sandDanceConfig: SandDanceConfig) {\n        let setup: SandDance.types.Setup;\n        if (sandDanceConfig.setupJSON) {\n            try {\n                setup = JSON.parse(sandDanceConfig.setupJSON);\n            } catch (e) {\n                // continue regardless of error\n            }\n        }\n        return setup;\n    }\n\n    tryGetTooltipExclusions(sandDanceConfig: SandDanceConfig) {\n        let tooltipExclusions: string[] = [];\n        if (sandDanceConfig.tooltipExclusionsJSON) {\n            try {\n                tooltipExclusions = JSON.parse(sandDanceConfig.tooltipExclusionsJSON);\n            } catch (e) {\n                // continue regardless of error\n            }\n        }\n        return tooltipExclusions;\n    }\n\n    trySetInsight(sandDanceConfig: SandDanceConfig, setup: SandDance.types.Setup) {\n        if (sandDanceConfig.insightJSON) {\n            try {\n                const insight: SandDance.specs.Insight = JSON.parse(sandDanceConfig.insightJSON);\n                const compA = util.clone(insight);\n                cleanInsight(compA, false);\n                const compB = util.clone(this.app.explorer.viewer.getInsight());\n                cleanInsight(compB, false);\n                if (!util.deepCompare(compA, compB)) {\n                    this.app.log('set insight', { insight, setup });\n                    this.setInsightSetup = { insight, setup };\n                    this.app.explorer.setInsight({ label: language.historyActionUpdate }, null, insight, true, setup);\n                    return true;\n                }\n            } catch (e) {\n                // continue regardless of error\n            }\n        }\n        return false;\n    }\n\n    tryUpdateSnapshots(sandDanceConfig: SandDanceConfig) {\n        if (sandDanceConfig.snapshotsJSON) {\n            try {\n                const snapshots = JSON.parse(sandDanceConfig.snapshotsJSON);\n                if (this.snapshots === undefined) {\n                    this.snapshots = snapshots;\n                }\n            } catch (e) {\n                // continue regardless of error\n            }\n        }\n    }\n\n    syncBackgroundImage(imageHolderJSON: string) {\n        if (imageHolderJSON) {\n            try {\n                const imageHolder = JSON.parse(imageHolderJSON);\n                this.app.explorer.imageHolder = imageHolder;\n            } catch (e) {\n                // continue regardless of error\n            }\n        }\n    }\n\n    syncSelection(selectionQueryJSON: string, afterView: boolean) {\n        const existingSelection = (this.app?.explorer?.viewer?.getSelection()?.search) || null;\n        let search: SandDance.searchExpression.Search = null;\n        if (selectionQueryJSON) {\n            try {\n                search = JSON.parse(selectionQueryJSON);\n            } catch (e) {\n                // continue regardless of error\n            }\n        }\n\n        const diff = !SandDance.searchExpression.compare(existingSelection, search);\n        if (diff) {\n            this.app.log(`sync selection\\n selectionQueryJSON: ${JSON.stringify(selectionQueryJSON)}\\n existingSelection: ${JSON.stringify(existingSelection)}`);\n            this.persistSelectionChange = false;\n            if (afterView || !this.app?.explorer?.viewer) {\n                this.afterView.push(() => this.app.explorer.viewer.select(search));\n            } else {\n                this.app.explorer.viewer.select(search);\n            }\n        }\n    }\n\n    private static parseSettings(dataView: DataView): VisualSettings {\n        return VisualSettings.parse(dataView);\n    }\n\n    /**\n     * This function gets called for each of the objects defined in the capabilities files and allows you to select which of the\n     * objects and properties you want to expose to the users in the property pane.\n     *\n     */\n    public enumerateObjectInstances(options: EnumerateVisualObjectInstancesOptions): VisualObjectInstance[] | VisualObjectInstanceEnumerationObject {\n        if (options.objectName === 'sandDanceConfig') return [];\n        return VisualSettings.enumerateObjectInstances(this.settings || VisualSettings.getDefault(), options);\n    }\n}\n"
  },
  {
    "path": "packages/powerbi/style/visual.less",
    "content": "@import (less)\n  \"../../sanddance-explorer/dist/css/sanddance-explorer.css\";\n\n.sanddance-explorer-topbar .logo {\n  visibility: hidden;\n}\n\n.sanddance-powerbi {\n  display: grid;\n  height: 100%;\n}\n\n.sanddance-app {\n  display: grid;\n  height: 100%;\n  &.chromeless {\n    .sanddance-explorer {\n      grid-template-rows: auto;\n    }\n    .sanddance-explorer-topbar,\n    .sanddance-sidebar {\n      display: none;\n    }\n  }\n  &.editmode {\n    .sanddance-explorer-commandbar {\n      margin-right: 115px;\n    }\n  }\n  .sanddance-explorer {\n    visibility: hidden;\n  }\n  .sanddance-init {\n    background-color: #e8e8e8;\n    bottom: 0;\n    display: grid;\n    left: 0;\n    right: 0;\n    position: absolute;\n    top: 0;\n    > div {\n      align-self: center;\n      margin: auto;\n      text-align: center;\n    }\n    svg {\n      fill: #888;\n      height: 50px;\n    }\n    .sanddance-webgl-required {\n      margin-top: 50px;\n      position: absolute;\n      top: 50%;\n      width: 100%;\n    }\n  }\n  .sanddance-fetch {\n    background: rgba(0,0,0,0.1);\n    bottom: 0;\n    padding: 5px;\n    position: absolute;\n    text-align: center;\n    width: 100%;\n    z-index: 1;\n  }\n  &.loaded {\n    .sanddance-explorer {\n      visibility: visible;\n    }\n    .sanddance-init {\n      display: none;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/powerbi/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"allowJs\": false,\n        \"emitDecoratorMetadata\": true,\n        \"experimentalDecorators\": true,\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"React.createElement\",\n        \"target\": \"es6\",\n        \"sourceMap\": true,\n        \"outDir\": \"./.tmp/build/\",\n        \"skipLibCheck\": true,\n        \"moduleResolution\": \"node\",\n        \"declaration\": true,\n        \"lib\": [\n            \"es2015\",\n            \"dom\"\n        ],\n        \"types\": []\n    },\n    \"files\": [\n        \"./src/visual.ts\"\n    ]\n}"
  },
  {
    "path": "packages/sanddance/.gitignore",
    "content": "dist/es6\ndist/css\ndist/umd/*.js\ndist/umd/*.map\n"
  },
  {
    "path": "packages/sanddance/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/sanddance/README-DEV.md",
    "content": "### Dev notes\n\nThe build of vega-deck.gl is meant to satisfy these constraints:\n\n1. JavaScript runtime and bundlers\n\nSpecifically, the use of base classes in Vega and Deck.gl which were declared using the `class` keyword, subclasses in vega-deck.gl must also use the `class` keyword when extending these. \n\n2. TypeScript\n\nWe want to leverage TypeScript as much as possible.\n\n3. ES6 module consumers\n\nWe want to provide ES6+ modules.\n\n4. UMD module consumers\n\nWe want to provide browser-ready builds.\n\n5. PowerBi\n\nThis adds an extra issue of not having UMD globals such as `vega` and `deck` available in the global scope. This means that `class`es may not `extend` during the JavaScript compilation phase, but must do so in the JavaScript execution phase where the base class can be brought into scope.\n\nThe net result is that this we use dynamic `class`es which `extend` a base class which is passed in during the execution phase. Doing so means that we need to trick the TypeScript compiler and provide a \"shadow\" class definition. Here is an outline of this technique:\n\n```js\n\ndeclare class Super {\n}\n\n//superRef is the reference implementation of Super, known at runtime\nlet superRef: typeof Super\n\n//SubConstructor must be a function, so it may still be used with the 'new' keyword\nfunction SubConstructor() {\n\n  //PrivateSub must use the class keyword, if the Super used the class keyword\n  class PrivateSub extends superRef {\n    subProps: any;  //public property definitions are also defined in ShadowSub below\n  }\n\n  const instance = new PrivateSub() as Super;\n\n  return instance;\n}\n\n//cast to any so the compiler will allow us to cast Sub as ShadowSub\nexport const Sub = SubConstructor as any as typeof ShadowSub;\n\n//the exposed Sub declaration, which is not executable, but allows TypeScript to know the shape of Sub\nexport declare class ShadowSub extends Super {\n  subProps: any;\n}\n\n```\n\nTo invoke, you can just\n```js\nvar sub = new Sub();    //typed as ShadowSub\n```\n"
  },
  {
    "path": "packages/sanddance/README.md",
    "content": "# @msrvida/sanddance\n\nVisually explore, understand, and present your data.\n\n![sanddance-animation](https://user-images.githubusercontent.com/11507384/189461831-9467863e-bff8-47d2-aa03-ab2b74658814.gif)\n\n[Demo](https://microsoft.github.io/SandDance/app)\n\n## Installation\n\nYou will need to consider how to load the libraries that `sanddance` depends on, based on your build & deployment scenario.\n\n## Installation via script tags\n\nLoad dependencies via `<script>` tags in your HTML:\n```html\n<script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n<script src=\"https://unpkg.com/@msrvida/sanddance@^4/dist/umd/sanddance.js\"></script>\n```\n\nA global variable named `SandDance` will be available to you. In your JavaScript, call the `use` function to pass the dependency libraries:\n\n```js\nSandDance.use(vega);\n```\n\n## Installation via Node.js\n\nAdd these to the `dependencies` section of your `package.json`, then run `npm install`:\n\n```json\n\"@msrvida/sanddance\": \"^4\",\n\"vega\": \"^6.2\"\n```\n\nImport these in your JavaScript, then call the `use()` function to pass the dependency libraries to `SandDance.VegaMorphCharts`:\n\n```js\nimport * as vega from 'vega';\nimport * as SandDance from '@msrvida/sanddance';\n\nSandDance.use(vega);\n```\n\n## Usage\n```js\n// Begin with an array of data objects which have the same named properties: \nconst data = [\n    { myX: 0, myY: 0, myZ: 0 },\n    { myX: 1, myY: 1, myZ: 1 },\n    { myX: 2, myY: 2, myZ: 2 },\n];\n\n// Create an instance of the [SandDance Viewer Class](https://microsoft.github.io/SandDance/docs/sanddance/v4/classes/Viewer.html) with an HTML DOM node to use for display:\nconst viewer = new SandDance.Viewer(document.querySelector('#vis'));\n\n// Specify the chart by using an [Insight object](https://microsoft.github.io/SandDance/docs/sanddance/v4/interfaces/specs.Insight.html)\nconst insight = {\n    columns: {\n        x: 'myX',\n        y: 'myY',\n        z: 'myZ'\n    },\n    size: {\n        height: 700,\n        width: 700\n    },\n    chart: 'scatterplot'\n};\n\n// Render a chart, by calling the viewer's [render method](https://microsoft.github.io/SandDance/docs/sanddance/v4/classes/Viewer.html#render), passing the insight and the data:\nviewer.render({ insight }, data);\n```\n\n## Versions\n\n### 4.0.0 Changes\n\n* Use MorphCharts as WebGL engine\n\n### 3.2.0 Changes\n\n* Show z-axis scale\n\n### 3.1.0 Changes\n\n* Fix for animation easing\n* Text character set accepts all unicode\n\n### Breaking changes in v4\n\n* `viewer.render(insight)` now takes a higher level object, call as `viewer.render({insight})`\n\n### Breaking changes in v3\n\n* deck.gl dependency from 6.4 to 8.1\n* new `searchExpression` namespace\n  * `types.Search` moved here\n  * `util.ensureSearchExpressionGroup` moved here\n* new `specs` namespace\n  * `types.Insight` moved here\n* `ViewerOptions` colors are now `string` type\n* `VegaDeckGl.View` moved to `types.View`\n\n### Breaking changes in v2\n\n* vega dependency from 4.x to 5.x\n\n## For more information\nPlease visit the [SandDance website](https://microsoft.github.io/SandDance/).\n"
  },
  {
    "path": "packages/sanddance/package.json",
    "content": "{\n  \"name\": \"@msrvida/sanddance\",\n  \"version\": \"4.0.6\",\n  \"description\": \"SandDance visualization canvas component.\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/sanddance\"\n  },\n  \"types\": \"dist/es6/index.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"deploy\": \"node ./scripts/deploy.js\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-typescript\": \"tsc -p .\",\n    \"bundle\": \"rollup -c\",\n    \"build:04\": \"npm run build-typescript && node ../../scripts/version.js && npm run build-css && npm run bundle\",\n    \"watch-css\": \"sass ./src/css/sanddance.scss ./dist/css/sanddance.css --watch\",\n    \"build-css\": \"sass ./src/css/sanddance.scss ./dist/css/sanddance.css\",\n    \"remove-vega\": \"npm un vega-typings\",\n    \"patch-after-vega-upgrade\": \"npm version patch\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"@types/d3-scale\": \"^4.0.2\"\n  },\n  \"dependencies\": {\n    \"d3-scale\": \"^4.0.2\",\n    \"@msrvida/chart-types\": \"^1\",\n    \"@msrvida/sanddance-specs\": \"^2\",\n    \"@msrvida/search-expression\": \"^1\",\n    \"@msrvida/vega-morphcharts\": \"^1\",\n    \"vega-typings\": \"~2.1.0\"\n  }\n}\n"
  },
  {
    "path": "packages/sanddance/rollup.config.mjs",
    "content": "import commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport resolve from '@rollup/plugin-node-resolve';\n\nexport default {\n    input: './dist/es6/index.js',\n    output: {\n        file: './dist/umd/sanddance.js',\n        format: 'umd',\n        name: 'SandDance',\n    },\n    plugins: [\n        json(),\n        resolve({ jsnext: true }),\n        commonjs({ sourceMap: false }),\n    ],\n};\n"
  },
  {
    "path": "packages/sanddance/scripts/deploy.js",
    "content": "const fs = require('fs');\nfs.copyFileSync('./dist/css/sanddance.css', '../../docs/dist/sanddance/v4/sanddance.css');\nfs.copyFileSync('./dist/umd/sanddance.js', '../../docs/dist/sanddance/v4/sanddance.js');\n"
  },
  {
    "path": "packages/sanddance/src/animator.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { DataScope } from './dataScope';\nimport { Search } from '@msrvida/search-expression';\n\nexport enum DataLayoutChange {\n    same, reset, refine,\n}\n\nexport interface Props {\n    onAnimateDataChange: (dataChange: DataLayoutChange, waitingLabel: string, handlerLabel: string, time?: number) => Promise<void>;\n    onDataChanged: (dataChange: DataLayoutChange, search?: Search) => void;\n}\n\nexport class Animator {\n\n    constructor(private dataScope: DataScope, private props: Props) { }\n\n    select(search: Search) {\n        return new Promise<void>((resolve, reject) => {\n            this.dataScope.select(search);\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n\n    deselect() {\n        return new Promise<void>((resolve, reject) => {\n            this.dataScope.deselect();\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n\n    filter(search: Search, keepData: object[], collapseData: object[], rebase: boolean) {\n        if (rebase) {\n            this.dataScope.collapse(false, keepData);\n        }\n        this.dataScope.collapse(true, collapseData);\n        return new Promise<void>((resolve, reject) => {\n            this.props.onAnimateDataChange(DataLayoutChange.refine, 'before refine', 'refine').then(() => {\n                this.dataScope.deselect();\n                this.dataScope.setFilteredData(keepData);\n                this.props.onDataChanged(DataLayoutChange.refine, search);\n                resolve();\n            }).catch(reject);\n        });\n    }\n\n    reset() {\n        return new Promise<void>((resolve, reject) => {\n            this.dataScope.deselect();\n            let time: number;\n            if (!this.dataScope.hasFilteredData()) {\n                time = 0;\n            } else {\n                this.dataScope.setFilteredData(null);\n            }\n            this.props.onAnimateDataChange(DataLayoutChange.reset, 'before reset', 'reset', time).then(() => {\n                this.dataScope.collapse(false);\n                this.props.onDataChanged(DataLayoutChange.reset);\n                resolve();\n            }).catch(reject);\n        });\n    }\n\n    activate(datum: object) {\n        return new Promise<void>((resolve, reject) => {\n            this.dataScope.activate(datum);\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n\n    deactivate() {\n        return new Promise<void>((resolve, reject) => {\n            this.dataScope.deactivate();\n            this.props.onDataChanged(DataLayoutChange.same);\n            resolve();\n        });\n    }\n\n}"
  },
  {
    "path": "packages/sanddance/src/array.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { util } from '@msrvida/vega-morphcharts';\n\nconst { allTruthy, concat, push } = util;\n\nexport { allTruthy, concat, push };\n"
  },
  {
    "path": "packages/sanddance/src/axisSelection.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { selectBetweenAxis, selectExactAxis } from './expression';\nimport { Column } from '@msrvida/chart-types';\nimport {\n    InsightColumnRoles,\n    SpecCapabilities,\n    SpecColumns,\n    SpecRoleCapabilities,\n} from '@msrvida/sanddance-specs';\nimport { Search, SearchExpressionGroup } from '@msrvida/search-expression';\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\n\nexport interface AxisSelectionHandler {\n    (event: TouchEvent | MouseEvent | PointerEvent, search: SearchExpressionGroup): void;\n}\n\nconst dimToRole: { [key: string]: InsightColumnRoles } = {\n    0: 'x',\n    1: 'y',\n    2: 'z',\n};\n\nconst roleToDim: { [key in VegaMorphCharts.types.AxisRole]: number } = {\n    x: 0,\n    y: 1,\n    z: 1,\n};\n\ninterface SearchRole {\n    axis: VegaMorphCharts.types.Axis;\n    role: InsightColumnRoles;\n    capabilities: SpecRoleCapabilities;\n    column: Column;\n    division: number;\n}\n\nexport class AxisSelection {\n    constructor(\n        public specCapabilities: SpecCapabilities,\n        public columns: SpecColumns,\n        public stage: VegaMorphCharts.types.Stage,\n    ) {\n    }\n\n    convert(divisions: number[]): Search {\n        const searchRoles: SearchRole[] = [];\n        divisions.forEach((division, i) => {\n            const role = dimToRole[i];\n            const axes: VegaMorphCharts.types.Axis[] = this.stage.axes[role];\n            //all axes in a faceted chart should be the same\n            const axis = axes.filter(axis => axis.tickText.length)[0];\n            if (axis) {\n                const capabilities = this.specCapabilities.roles.filter(r => r.role === role)[0];\n                const column = this.columns[role];\n                if (division >= 0 && capabilities?.axisSelection) {\n                    searchRoles.push({\n                        axis,\n                        role,\n                        capabilities,\n                        column,\n                        division,\n                    });\n                }\n            }\n        });\n        switch (searchRoles.length) {\n            case 0: {\n                return null;\n            }\n            case 1: {\n                return this.getSearchFromSearchRole(searchRoles[0]);\n            }\n            default: {\n                const roles = searchRoles.map(searchRole => this.getSearchFromSearchRole(searchRole));\n                roles.forEach((role, i) => {\n                    if (i === 0) return;\n                    role.clause = '&&';\n                });\n                return roles;\n            }\n        }\n    }\n\n    private getSearchFromSearchRole(searchRole: SearchRole) {\n        const getSearch: { (a, c, i): SearchExpressionGroup } =\n            searchRole.capabilities.axisSelection === 'exact' ?\n                (a, c, i) => ({ expressions: [selectExactAxis(a, c, i)] })\n                :\n                selectBetweenAxis;\n        const { axis, column, division } = searchRole;\n        return getSearch(axis, column, division);\n    }\n}\n\n\nexport function moveTicksBetween(axes: VegaMorphCharts.types.Axis[]) {\n    axes.forEach(axis => {\n        if (axis.ticks.length === 0) return;\n\n        const dim = roleToDim[axis.axisRole];\n        const { color } = axis.ticks[0];\n\n        const newLine = (value: number) => {\n            const line: VegaMorphCharts.types.StyledLine = {\n                sourcePosition: [0, 0, 0],\n                targetPosition: [0, 0, 0],\n                color,\n            };\n            line.sourcePosition[dim] = value;\n            return line;\n        };\n\n        const newTicks: VegaMorphCharts.types.StyledLine[] = [];\n        newTicks.push(newLine(axis.domain.sourcePosition[dim]));\n        for (let i = 1; i < axis.ticks.length; i++) {\n            newTicks.push(newLine((axis.ticks[i].sourcePosition[dim] + axis.ticks[i - 1].sourcePosition[dim]) / 2));\n        }\n        newTicks.push(newLine(axis.domain.targetPosition[dim]));\n        axis.ticks = newTicks;\n    });\n}\n"
  },
  {
    "path": "packages/sanddance/src/characterSet.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Insight } from '@msrvida/sanddance-specs';\nimport { types } from '@msrvida/vega-morphcharts';\n\nexport class CharacterSet {\n    private chars: string[];\n\n    public resetCharacterSet(forceNewCharacterSet: boolean, oldInsight?: Insight, newInsight?: Insight) {\n        if (forceNewCharacterSet || needsNewCharacterSet(oldInsight, newInsight)) {\n            this.chars = undefined;\n        }\n    }\n\n    public getCharacterSet(stage: types.Stage) {\n        if (!this.chars) {\n            const map: { [char: string]: true } = {};\n            const addText = (text: string) => {\n                Array.from(text).forEach(char => { map[char] = true; });\n            };\n            stage.textData.forEach(t => addText(t.text));\n            const { x, y } = stage.axes;\n            [x, y].forEach(axes => {\n                axes.forEach(axis => {\n                    if (axis.tickText) axis.tickText.forEach(t => addText(t.text));\n                    if (axis.title) addText(axis.title.text);\n                });\n            });\n            this.chars = Object.keys(map);\n        }\n        return this.chars;\n    }\n}\n\nfunction needsNewCharacterSet(oldInsight: Insight, newInsight: Insight) {\n    if (!oldInsight) return true;\n    if (!newInsight) return true;\n    if (oldInsight.chart !== newInsight.chart) return true;\n    if (oldInsight.facetStyle !== newInsight.facetStyle) return true;\n    if (oldInsight.totalStyle !== newInsight.totalStyle) return true;\n    if (oldInsight.hideAxes !== newInsight.hideAxes) return true;\n    if (differentObjectValues(oldInsight.signalValues, newInsight.signalValues)) return true;\n    if (differentObjectValues(oldInsight.size, newInsight.size)) return true;\n    const oldColumns = oldInsight.columns;\n    const newColumns = newInsight.columns;\n    if (oldColumns.facet !== newColumns.facet) return true;\n    if (oldColumns.facetV !== newColumns.facetV) return true;\n    if (oldColumns.x !== newColumns.x) return true;\n    if (oldColumns.y !== newColumns.y) return true;\n    if (oldColumns.z !== newColumns.z) return true;\n    return false;\n}\n\nfunction differentObjectValues(a: { [key: string]: any }, b: { [key: string]: any }) {\n    if (!a && !b) return false;\n    if (!a || !b) return true;\n    const keys = Object.keys(b);\n    for (let i = 0; i < keys.length; i++) {\n        const key = keys[i];\n        const ta = typeof a;\n        const tb = typeof b;\n        if (ta !== tb) return true;\n        if (ta === 'object') {\n            return differentObjectValues(a[key], b[key]);\n        } else {\n            if (a[key] !== b[key]) return true;\n        }\n    }\n    return false;\n}\n"
  },
  {
    "path": "packages/sanddance/src/colorCubes.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { ColorContext } from './types';\n\nexport function populateColorContext(colorContext: ColorContext, presenter: VegaMorphCharts.Presenter) {\n    if (!colorContext.colorMap) {\n        colorContext.colorMap = presenter.morphChartsRenderResult.getCubeLayer().unitColorMap;\n    }\n    colorContext.legend = VegaMorphCharts.util.clone(presenter.stage.legend);\n    colorContext.legendElement = presenter.getElement(VegaMorphCharts.PresenterElement.legend).children[0] as HTMLElement;\n}\n"
  },
  {
    "path": "packages/sanddance/src/colorSchemes.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { ColorScaleNone } from '@msrvida/sanddance-specs';\nimport { ColorScheme } from './types';\nimport { defaultViewerOptions, dualColorSchemeColors as defs } from './defaults';\n\nconst dualPairs = [\n    [defs.black, defs.gray],\n    [defs.red, defs.green],\n    [defs.red, defs.blue],\n    [defs.black, defs.red],\n    [defs.black, defs.orange],\n    [defs.black, defs.green],\n];\n\n/**\n * Array of color schemes.\n */\nexport const colorSchemes: ColorScheme[] = [\n    {\n        scheme: ColorScaleNone,\n        colors: [defaultViewerOptions.colors.defaultCube],\n    },\n];\n\ncreateDualColorSchemes();\n\nexport function registerColorSchemes(vega: VegaMorphCharts.types.VegaBase) {\n    colorSchemes.forEach(cs => {\n        if (cs.colors.length === 1) {\n            vega.scheme(cs.scheme, x => cs.colors[0]);\n        } else {\n            vega.scheme(cs.scheme, cs.colors);\n        }\n    });\n}\n\nfunction createPair(names: string[], colors: string[]) {\n    const scheme = `dual_${names[0]}${names[1]}`;\n    colorSchemes.push({ scheme, colors });\n}\n\nfunction createDualColorSchemes() {\n    dualPairs.forEach(colors => {\n        const names = colors.map(color => {\n            for (const key in defs) if (color === defs[key]) return key;\n        });\n        createPair(names, colors);\n        createPair([...names].reverse(), [...colors].reverse());\n    });\n}\n"
  },
  {
    "path": "packages/sanddance/src/constants.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport {\n    ColorScaleNone,\n    FieldNames,\n    ScaleNames,\n    SignalNames,\n} from '@msrvida/sanddance-specs';\n\nconst GL_ORDINAL = 'GL_ORDINAL';\nexport { GL_ORDINAL };\n"
  },
  {
    "path": "packages/sanddance/src/css/sanddance.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n.sanddance-root {\n    height: 100%;\n    position: relative;\n    width: 100%;\n}\n\n.sanddance-gl {\n    overflow: hidden;\n    position: absolute;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    &.show-center {\n        background:\n            linear-gradient(to right,\n                transparent 49.9%,\n                rgba(255, 0, 0, 0.7),\n                transparent 50.1%\n            ),\n            linear-gradient(to bottom,\n                transparent 49.9%,\n                rgba(255, 0, 0, 0.7),\n                transparent 50.1%\n            )\n        ;\n    }\n    canvas {\n        outline: none;\n    }\n}\n\n.sanddance-panel {\n    position: absolute;\n    top: 1em;\n    right: 1em;\n    bottom: 1em;\n    \n    background: #fff;\n    box-shadow: 8px 8px 12px -6px #ccc;\n    \n    border: 1px solid #ccc;\n    overflow-y: scroll;\n    padding-bottom: 1em;\n    padding-left: 1em;\n}\n\n.sanddance-legend {\n    table {\n        border-collapse: collapse;\n    }\n    th {\n        word-break: break-word;\n        max-width: 11em;\n    }\n    .legend-row {\n        cursor: pointer;\n        td {\n            padding: 2px;\n        }\n        &:hover {\n            background-color: #efefef;\n        }\n    }\n    .symbol div {\n        border-style: outset;\n        border-width: 1.5px;\n    }\n    .label {\n        max-width: 9em;\n        white-space: nowrap;\n        text-overflow: ellipsis;\n        overflow: hidden;\n    }\n}\n\n.sanddance-details {\n    font-size: smaller;\n}\n\n.sanddance-details-scroll {\n    padding-bottom: 1em;\n}\n\n.sanddance-tooltip {\n    z-index: 1;\n    table {\n        background: #333;\n        color: #fff;\n        font-size: smaller;\n        margin: 1em;\n        min-width: 16em;\n        padding: 6px;\n        position: absolute;\n    }\n    td {\n        max-width: 16em;\n        overflow: hidden;\n        text-align: left;\n        text-overflow: ellipsis;\n        vertical-align: top;\n        width: 75%;\n        &:first-child {\n            width: 25%;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance/src/dataScope.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { Column, ColumnStats, ColumnTypeMap } from '@msrvida/chart-types';\nimport { Exec, Search } from '@msrvida/search-expression';\nimport { FieldNames, getColumnsFromData, getStats } from '@msrvida/sanddance-specs';\nimport { GL_ORDINAL } from './constants';\n\nexport interface ColumnsStatsMap {\n    [columnName: string]: ColumnStats;\n}\n\nexport interface UserSelection {\n    search: Search;\n    included: object[];\n    excluded: object[];\n}\n\nexport class DataScope {\n    public selection: UserSelection;\n    private data: object[];\n    private columns: Column[];\n    private filteredData: object[];\n    private filteredColumnsStats: ColumnsStatsMap;\n    public active: object;\n    public isCollapsed: boolean;\n\n    constructor() {\n        this.filteredColumnsStats = {};\n    }\n\n    public setData(data: object[], columns?: Column[]) {\n        const differentData = this.data !== data;\n        if (differentData) {\n            if (this.data) {\n                //clean up things we added to old data\n                this.deselect();\n            }\n            this.data = data;\n            this.columns = columns;\n            this.filteredData = null;\n            this.filteredColumnsStats = {};\n        }\n        return differentData;\n    }\n\n    public setFilteredData(filteredData: object[]) {\n        this.filteredData = filteredData;\n        this.filteredColumnsStats = {};\n    }\n\n    public getColumns(columnTypes?: ColumnTypeMap) {\n        if (!this.columns) {\n            this.columns = getColumnsFromData(VegaMorphCharts.base.vega.inferTypes, this.data, columnTypes);\n        }\n        return this.columns;\n    }\n\n    public getFilteredColumnStats(columnName: string) {\n        if (!this.filteredColumnsStats[columnName]) {\n            this.filteredColumnsStats[columnName] = getStats(this.filteredData, this.columns.filter(c => c.name === columnName)[0]);\n        }\n        return this.filteredColumnsStats[columnName];\n    }\n\n    public currentData() {\n        return this.filteredData || this.data;\n    }\n\n    public select(search: Search) {\n        this.deselect();\n        if (search) {\n            this.selection = this.createUserSelection(search, true, false);\n            if (this.selection.included.length) {\n                this.activate(this.selection.included[0]);\n            }\n        }\n    }\n\n    public createUserSelection(search: Search, assign: boolean, rebase: boolean) {\n        const exec = new Exec(search, this.getColumns());\n        const s: UserSelection = {\n            search,\n            included: [],\n            excluded: [],\n        };\n        const data = rebase ? this.data : this.currentData();\n        data.forEach(datum => {\n            if (exec.run(datum)) {\n                if (assign) {\n                    datum[FieldNames.Selected] = true;\n                }\n                s.included.push(datum);\n            } else {\n                s.excluded.push(datum);\n            }\n        });\n        return s;\n    }\n\n    public deselect() {\n        this.deactivate();\n        this.data.forEach(datum => {\n            delete datum[FieldNames.Selected];\n        });\n        this.selection = null;\n    }\n\n    public hasFilteredData() {\n        return !!this.filteredData;\n    }\n\n    public hasSelectedData() {\n        return !!this.selection;\n    }\n\n    public collapse(collapsed: boolean, data = this.data) {\n        data.forEach(datum => {\n            datum[FieldNames.Collapsed] = collapsed;\n        });\n        this.isCollapsed = collapsed;\n    }\n\n    public activate(datum: object) {\n        this.deactivate();\n        datum[FieldNames.Active] = true;\n        this.active = datum;\n    }\n\n    public deactivate() {\n        if (this.active) {\n            delete this.active[FieldNames.Active];\n        }\n        this.active = null;\n    }\n\n    public ordinalIndexWithinSelection(ordinal: number) {\n        if (this.selection) {\n            for (let i = 0; i < this.selection.included.length; i++) {\n                const datum = this.selection.included[i];\n                if (datum[GL_ORDINAL] === ordinal) {\n                    return { datum, index: i };\n                }\n            }\n        }\n        return { datum: null, index: -1 };\n    }\n\n    public finalize() {\n        this.data = null;\n        this.filteredData = null;\n        this.filteredColumnsStats = null;\n        if (this.selection) {\n            this.selection.excluded = null;\n            this.selection.included = null;\n            this.selection = null;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance/src/date.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { ColumnStats } from '@msrvida/chart-types';\nimport { Spec } from 'vega-typings';\n\nexport function makeDateRange(tickTexts: VegaMorphCharts.types.TickText[], columnStats: ColumnStats) {\n    if (tickTexts.length === 1) {\n        const d3TimeFormat = getD3TimeFormat(columnStats.min, columnStats.max);\n        tickTexts[0].text = vegaTimeFormat([[columnStats.min, columnStats.max]], d3TimeFormat)[0];\n    } else {\n        const d3TimeFormat = getD3TimeFormat(tickTexts[0].value as number, tickTexts[1].value as number);\n        const pairs = tickTexts.map((t, i) => {\n            const min = t.value as number;\n            let max: number;\n            if (i === tickTexts.length - 1) {\n                max = columnStats.max;\n            } else {\n                max = tickTexts[i + 1].value as number;\n            }\n            return [min, max] as [number, number];\n        });\n        const formattedPairs = vegaTimeFormat(pairs, d3TimeFormat);\n        formattedPairs.forEach((formattedPair, i) => tickTexts[i].text = formattedPair);\n    }\n}\n\nconst second = 1000;\nconst minute = second * 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst year = day * 365;\nconst month = year / 12;\n\nfunction getD3TimeFormat(min: number, max: number) {\n    const span = max - min;\n    if (span > year) return '%Y';\n    if (span > month) return '%b %Y';\n    if (span > day) return '%d %b %y';\n    if (span > hour) return '%d %b %H:%M';\n    if (span > second) return '%H:%M:%S';\n    return '%S.%L';\n}\n\nfunction vegaTimeFormat(values: [number, number][], d3TimeFormat: string) {\n    const name = 'timeFormat';\n    const as = 'output';\n    const spec: Spec = {\n        $schema: 'https://vega.github.io/schema/vega/v3.json',\n        data: [{\n            name,\n            values,\n            transform: [{\n                type: 'formula',\n                expr: `timeFormat(datum[0], '${d3TimeFormat}') + ' - ' + timeFormat(datum[1], '${d3TimeFormat}')`,\n                as,\n            }],\n        }],\n    };\n    const runtime = VegaMorphCharts.base.vega.parse(spec);\n    const view = new VegaMorphCharts.ViewGl(runtime).run();\n    return view.data(name).map(row => row[as]);\n}\n"
  },
  {
    "path": "packages/sanddance/src/defaults.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { ViewerOptions } from './types';\n\nconst { defaultPresenterStyle } = VegaMorphCharts.defaults;\n\nexport const defaultViewerOptions: ViewerOptions = {\n    colors: {\n        activeCube: 'purple',\n        defaultCube: VegaMorphCharts.util.colorToString(defaultPresenterStyle.defaultCubeColor),\n        hoveredCube: VegaMorphCharts.util.colorToString(defaultPresenterStyle.highlightColor),\n        selectedCube: 'yellow',\n        axisSelectHighlight: VegaMorphCharts.util.colorToString([128, 128, 128, 128]),\n        axisLine: '#000',\n        axisText: '#000',\n        gridLine: '#CCC',\n        backgroundColor: '#FFF',\n    },\n    language: {\n        headers: {\n            chart: 'Chart',\n            details: 'Details',\n            legend: 'Legend',\n            selection: 'Select & Filter',\n        },\n        bing: 'bing',\n        newColorMap: 'remap color to filtered items',\n        oldColorMap: 'keep same colors',\n        deselect: 'deselect',\n        exclude: 'exclude',\n        isolate: 'isolate',\n        legendOther: 'other',\n        nextDetail: '>',\n        previousDetail: '<',\n        reset: 'reset',\n        colorBinCount: 'Color bin count',\n        colorReverse: 'Color reverse',\n        count: 'Count',\n        percent: 'Percent',\n        sum: 'Sum',\n        scatterPointScale: 'Point scale',\n        FacetMaxBins: 'Facet max bins',\n        FacetVMaxBins: 'Cross facet max bins',\n        XMaxBins: 'X axis max bins',\n        YMaxBins: 'Y axis max bins',\n        XGridSize: 'X grid size',\n        YGridSize: 'Y grid size',\n        InnerPaddingSize: 'Inner padding size',\n        OuterPaddingSize: 'Outer padding size',\n        treeMapMethod: 'Treemap layout',\n        facetColumns: 'Facet columns',\n        facetRows: 'Facet rows',\n        markOpacitySignal: 'Mark opacity',\n        textScaleSignal: 'Text scale',\n        xAxisTextAngleSignal: 'X axis text angle',\n        yAxisTextAngleSignal: 'Y axis text angle',\n        zGrounded: 'Z grounded',\n        zScaleProportion: 'Z scale proportion to Y',\n        selectionCount: count => `${count} items selected`,\n    },\n    maxLegends: 19, //20 would be \"other\"\n    onError: (errors) => {\n        //console.log(`UnitVisViewer errors: ${errors.join('\\n')}`);\n    },\n    filterRenderingTimerPadding: 200,\n    selectionPolygonZ: -1,\n    tickSize: 10,\n};\n\nexport function getPresenterStyle(options: ViewerOptions) {\n    const style: VegaMorphCharts.types.PresenterStyle = {\n        cssPrefix,\n        fontFamily: options.fontFamily,\n        defaultCubeColor: VegaMorphCharts.util.colorFromString(options.colors.defaultCube),\n    };\n    if (options.colors.hoveredCube) {\n        style.highlightColor = VegaMorphCharts.util.colorFromString(options.colors.hoveredCube);\n    }\n    //if (options.lightSettings) {\n    // style.lightSettings = options.lightSettings;\n    //}\n    return style;\n}\n\nexport const cssPrefix = 'sanddance-';\n\nexport const dualColorSchemeColors = {\n    black: '#212121',\n    gray: '#D2D2D2',\n    blue: '#0060F0',\n    green: '#00C000',\n    orange: '#FF9900',\n    red: '#E00000',\n};\n"
  },
  {
    "path": "packages/sanddance/src/details.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { Animator } from './animator';\nimport { controls, util } from '@msrvida/vega-morphcharts';\nimport { cssPrefix } from './defaults';\nimport { DataScope, UserSelection } from './dataScope';\nimport { GL_ORDINAL } from './constants';\nimport { invert, SearchExpression } from '@msrvida/search-expression';\nimport { isInternalFieldName } from './util';\nimport { Language } from './types';\n\ninterface State {\n    remapColor?: boolean;\n    userSelection: UserSelection;\n    index: number;\n}\n\nenum Action {\n    deselect, isolate, exclude, reset, next, previous,\n}\n\nexport class Details {\n    public element: HTMLElement;\n    private state: State;\n\n    constructor(\n        parentElement: HTMLElement,\n        private language: Language,\n        private animator: Animator,\n        private dataScope: DataScope,\n        private colorMapHandler: (remap: boolean) => void,\n        private hasColorMaps: () => boolean,\n    ) {\n        this.element = util.addDiv(parentElement, `${cssPrefix}unitControls`);\n        this.clear();\n    }\n\n    finalize() {\n        if (this.element) this.element.innerHTML = '';\n        this.dataScope = null;\n        this.element = null;\n    }\n\n    clear() {\n        this.state = {\n            userSelection: null,\n            index: -1,\n            remapColor: false,\n        };\n        this.render();\n    }\n\n    clearSelection() {\n        this.state.userSelection = null;\n        this.state.index = -1;\n        this.render();\n    }\n\n    populate(userSelection: UserSelection, index = 0) {\n        this.state.userSelection = userSelection;\n        this.state.index = index;\n        this.render();\n    }\n\n    private selectByNameValue(columnName: string, value: any) {\n        const search: SearchExpression = {\n            name: columnName,\n            operator: '==',\n            value,\n        };\n        this.clearSelection();\n        this.animator.select(search);\n        this.populate(this.dataScope.selection);\n    }\n\n    private remapChanged(remap: boolean) {\n        this.state.remapColor = remap;\n        this.colorMapHandler(remap);\n        this.render();\n    }\n\n    private handleAction(action: Action) {\n        let p: Promise<void>;\n        const u = this.state.userSelection;\n        switch (action) {\n            case Action.deselect: {\n                this.clearSelection();\n                p = this.animator.deselect();\n                break;\n            }\n            case Action.exclude: {\n                this.clearSelection();\n                p = this.animator.filter(invert(u.search), u.excluded, u.included, false);\n                this.state.remapColor = false;\n                break;\n            }\n            case Action.isolate: {\n                this.clearSelection();\n                p = this.animator.filter(u.search, u.included, u.excluded, false);\n                this.state.remapColor = false;\n                break;\n            }\n            case Action.reset: {\n                this.clear();\n                p = this.animator.reset();\n                break;\n            }\n            default: {\n                switch (action) {\n                    case Action.previous: {\n                        this.state.index--;\n                        if (this.state.index < 0) {\n                            this.state.index = this.state.userSelection.included.length - 1;\n                        }\n                        break;\n                    }\n                    case Action.next: {\n                        this.state.index++;\n                        if (this.state.index >= this.state.userSelection.included.length) {\n                            this.state.index = 0;\n                        }\n                        break;\n                    }\n                }\n                this.render();\n                p = this.animator.activate(this.state.userSelection.included[this.state.index]);\n            }\n        }\n        p.then(() => this.render());\n    }\n\n    render() {\n        const hasRefinedData = this.dataScope.hasFilteredData();\n        const renderProps: RenderProps = {\n            language: this.language,\n            actionHandler: action => this.handleAction(action),\n            selectionHandler: (columnName, value) => this.selectByNameValue(columnName, value),\n            count: this.state.userSelection && this.state.userSelection.included.length,\n            hasRefinedData,\n            item: this.state.userSelection && this.state.userSelection.included[this.state.index],\n            remapColorHandler: remap => this.remapChanged(remap),\n            hasColorMaps: this.hasColorMaps() && hasRefinedData,\n            remapColor: this.state.remapColor,\n        };\n        const a = VegaMorphCharts.util.getActiveElementInfo();\n        VegaMorphCharts.util.mount(renderDetails(renderProps), this.element);\n        VegaMorphCharts.util.setActiveElement(a);\n    }\n}\n\ninterface RenderProps {\n    actionHandler: (action: Action) => void;\n    selectionHandler: (columnName: string, value: any) => void;\n    remapColorHandler: (remap: boolean) => void;\n    hasColorMaps: boolean;\n    remapColor: boolean;\n    item: any;\n    hasRefinedData: boolean;\n    count: number;\n    language: Language;\n}\n\nconst renderDetails = (props: RenderProps) => {\n    const controlButtons = [\n        <button disabled={!props.item} onClick={e => props.actionHandler(Action.deselect)}>{props.language.deselect}</button>,\n        <button disabled={!props.item} onClick={e => props.actionHandler(Action.isolate)}>{props.language.isolate}</button>,\n        <button disabled={!props.item} onClick={e => props.actionHandler(Action.exclude)}>{props.language.exclude}</button>,\n    ];\n    const colorMapping = (\n        <div>\n            <button disabled={props.remapColor} onClick={e => props.remapColorHandler(true)}>{props.language.newColorMap}</button>\n            <button disabled={!props.remapColor} onClick={e => props.remapColorHandler(false)}>{props.language.oldColorMap}</button>\n        </div>\n    );\n\n    const singleItem = props.count === 1;\n    const scrollButtons = [\n        <button disabled={singleItem} onClick={e => props.actionHandler(Action.previous)}>{props.language.previousDetail}</button>,\n        <button disabled={singleItem} onClick={e => props.actionHandler(Action.next)}>{props.language.nextDetail}</button>,\n        <span> {props.language.selectionCount(props.count)}</span>,\n    ];\n    const rows: controls.TableRow[] = [];\n    for (const prop in props.item) {\n        if (prop === GL_ORDINAL) {\n            continue;\n        }\n        if (isInternalFieldName(prop)) {\n            continue;\n        }\n        rows.push({\n            cells: [\n                { content: prop }, { content: linkSelect(props.language, prop, props.item[prop], props.selectionHandler) },\n            ],\n        });\n    }\n    return (\n        <div>\n            {props.hasColorMaps && colorMapping}\n            <h4>{props.language.headers.selection}</h4>\n            <div className={`${cssPrefix}selection`}>\n                {controlButtons}\n                <button disabled={!props.hasRefinedData} onClick={e => props.actionHandler(Action.reset)}>reset</button>\n            </div>\n            {props.item && <h4>{props.language.headers.details}</h4>}\n            <div>\n                <div className={`${cssPrefix}details-scroll`}>\n                    {props.item && scrollButtons}\n                </div>\n                <div className={`${cssPrefix}details`}>\n                    {props.item && <controls.Table rows={rows} />}\n                </div>\n            </div>\n        </div>\n    );\n};\n\nfunction linkSelect(language: Language, columnName: string, value: any, selectionHandler: (columnName: string, value: any) => void) {\n    return (\n        <span>\n            <a href=\"#\" onClick={e => selectionHandler(columnName, value)} >{value}</a>\n            {isNaN(value) ? [' ', <a className=\"bing-search\" href={`https://www.bing.com/search?q=${encodeURIComponent(value)}`} target=\"_blank\">{language.bing}</a>] : ''}\n        </span>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance/src/expression.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { Column } from '@msrvida/chart-types';\nimport {\n    SearchExpression,\n    SearchExpressionGroup,\n    SearchExpressionOperators,\n    SearchExpressionValue,\n} from '@msrvida/search-expression';\n\nexport function notNice(niceValue: string | number) {\n    //convert \"nice\" numbers to numeric value\n    return (niceValue + '').replace(/[\\s,]/g, '');\n}\n\nfunction tickValue(axis: VegaMorphCharts.types.Axis, i: number) {\n    const tick = axis.tickText[i];\n    let value: SearchExpressionValue;\n    if (tick) {\n        value = axis.tickText[i].value;\n    }\n    return { tick, value };\n}\n\nexport function selectNullOrEmpty(column: Column) {\n    const searchExpression: SearchExpression = {\n        name: column.name,\n        operator: 'isnullorEmpty',\n    };\n    return searchExpression;\n}\n\nexport function selectExact(column: Column, value: SearchExpressionValue) {\n    if (value == null) {\n        return selectNullOrEmpty(column);\n    }\n    const searchExpression: SearchExpression = {\n        name: column.name,\n        operator: '==',\n        value,\n    };\n    return searchExpression;\n}\n\nexport function selectNone(column: Column, values: string[]) {\n    const expressions = values.map((value, i) => {\n        const searchExpression: SearchExpression = {\n            name: column.name,\n            operator: '!=',\n            value,\n        };\n        if (i) {\n            searchExpression.clause = '&&';\n        }\n        return searchExpression;\n    });\n    const searchExpressionGroup: SearchExpressionGroup = {\n        expressions,\n    };\n    return searchExpressionGroup;\n}\n\nexport function selectExactAxis(axis: VegaMorphCharts.types.Axis, column: Column, i: number) {\n    const result = tickValue(axis, i);\n    if (result.tick) {\n        return selectExact(column, result.value);\n    }\n}\n\nexport function selectBetween(column: Column, lowValue: SearchExpressionValue, highValue: SearchExpressionValue, lowOperator: SearchExpressionOperators = '>=', highOperator: SearchExpressionOperators = '<') {\n    const expressions: SearchExpression[] = [];\n    if (lowValue !== undefined) {\n        expressions.push({\n            name: column.name,\n            operator: lowOperator,\n            value: lowValue,\n        });\n    }\n    if (highValue !== undefined) {\n        expressions.push({\n            name: column.name,\n            operator: highOperator,\n            value: highValue,\n        });\n    }\n    if (expressions.length > 1) {\n        expressions[1].clause = '&&';\n    }\n    const searchExpressionGroup: SearchExpressionGroup = {\n        expressions,\n    };\n    return searchExpressionGroup;\n}\n\nexport function selectBetweenAxis(axis: VegaMorphCharts.types.Axis, column: Column, i: number) {\n    const low = tickValue(axis, i);\n    const high = tickValue(axis, i + 1);\n    return selectBetween(column, low.value, high.value);\n}\n"
  },
  {
    "path": "packages/sanddance/src/headers.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Headers } from './types';\nimport { Presenter, PresenterElement } from '@msrvida/vega-morphcharts';\n\nexport function ensureHeaders(presenter: Presenter, headers: Headers) {\n    const vegaControls = presenter.getElement(PresenterElement.vegaControls);\n    conditionalHeader(!!vegaControls.querySelectorAll('.vega-bindings > *').length, vegaControls, headers.chart);\n    const legend = presenter.getElement(PresenterElement.legend);\n    conditionalHeader(!!legend.children.length, legend, headers.legend);\n}\n\nfunction conditionalHeader(condition: boolean, element: HTMLElement, header: string) {\n    const existing = existingHeader(element, header);\n    if (condition && !existing) {\n        addHeader(element, header);\n    }\n    if (!condition && existing) {\n        existing.remove();\n    }\n}\n\nfunction addHeader(element: HTMLElement, header: string) {\n    const h = document.createElement('h4');\n    h.innerHTML = header;\n    element.insertAdjacentElement('beforebegin', h);\n}\n\nfunction existingHeader(element: HTMLElement, header: string) {\n    const { previousElementSibling } = element;\n    if (previousElementSibling && previousElementSibling.innerHTML === header) {\n        return previousElementSibling;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as constants from './constants';\nimport * as searchExpression from '@msrvida/search-expression';\nimport * as specs from '@msrvida/sanddance-specs';\nimport * as types from './types';\nimport * as util from './util';\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { colorSchemes } from './colorSchemes';\nimport { use as _use } from '@msrvida/vega-morphcharts';\nimport { Viewer } from './viewer';\n\nconst use = _use;\n\nexport {\n    colorSchemes,\n    constants,\n    searchExpression,\n    specs,\n    types,\n    use,\n    util,\n    VegaMorphCharts,\n    Viewer,\n};\n\nexport { version } from './version';\n"
  },
  {
    "path": "packages/sanddance/src/legend.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { ColorBin, Other } from '@msrvida/sanddance-specs';\nimport { Column } from '@msrvida/chart-types';\nimport { Language, LegendRowWithSearch } from './types';\nimport {\n    notNice,\n    selectBetween,\n    selectExact,\n    selectNone,\n    selectNullOrEmpty,\n} from './expression';\nimport { SearchExpressionGroup, SearchExpressionOperators } from '@msrvida/search-expression';\n\nfunction legendRange(colorBinType: ColorBin, column: Column, legend: VegaMorphCharts.types.Legend, clickedIndex: number): SearchExpressionGroup {\n    if (column.quantitative) {\n        return selectQuantitative(colorBinType, column, legend, clickedIndex);\n    } else {\n        return selectCategorical(column, legend, clickedIndex);\n    }\n}\n\nfunction selectCategorical(column: Column, legend: VegaMorphCharts.types.Legend, clickedIndex: number): SearchExpressionGroup {\n    const value = legend.rows[clickedIndex].value;\n    if (value === Other) {\n        const values: string[] = [];\n        for (const i in legend.rows) {\n            if (+i !== clickedIndex) {\n                values.push(legend.rows[i].value);\n            }\n        }\n        return selectNone(column, values);\n    } else {\n        //select equal\n        return { expressions: [selectExact(column, legend.rows[clickedIndex].value)] };\n    }\n}\n\nfunction selectQuantitative(colorBinType: ColorBin, column: Column, legend: VegaMorphCharts.types.Legend, clickedIndex: number): SearchExpressionGroup {\n    const keys = Object.keys(legend.rows).map(key => +key).sort((a, b) => +a - +b);\n    let lowValue: string;\n    let lowOperator: SearchExpressionOperators;\n    let highValue: string;\n    let highOperator: SearchExpressionOperators;\n    const rowText = legend.rows[clickedIndex].label;\n    switch (colorBinType) {\n        case 'continuous': {\n            lowValue = rowText;\n            if (clickedIndex < keys.length - 1) {\n                highValue = legend.rows[clickedIndex + 1].value;\n            }\n            break;\n        }\n        default: {\n            if (rowText.indexOf('null') > 0) {\n                const ex: SearchExpressionGroup = {\n                    expressions: [selectNullOrEmpty(column)],\n                };\n                return ex;\n            }\n            const dash = rowText.indexOf('–');  //this is not the common dash character!\n            if (dash > 0) {\n                //bug in Vega for quantize?\n                //lowOperator = '>';\n                //highOperator = '<=';\n                lowValue = rowText.substr(0, dash);\n                highValue = rowText.substr(dash + 1);\n            } else {\n                if (rowText.indexOf('<') >= 0) {\n                    highValue = rowText.substring(2);\n                } else {\n                    if (rowText.indexOf('≥') >= 0) {\n                        lowValue = rowText.substring(2);\n                    }\n                }\n            }\n        }\n    }\n    if (lowValue) lowValue = notNice(lowValue);\n    if (highValue) highValue = notNice(highValue);\n    if (lowValue === highValue) {\n        return { expressions: [selectExact(column, lowValue)] };\n    } else {\n        return selectBetween(column, lowValue, highValue, lowOperator, highOperator);\n    }\n}\n\nexport function finalizeLegend(colorBinType: ColorBin, colorColumn: Column, legend: VegaMorphCharts.types.Legend, language: Language) {\n    const rowTexts: string[] = [];\n    for (const i in legend.rows) {\n        const row = legend.rows[i] as LegendRowWithSearch;\n        row.search = legendRange(colorBinType, colorColumn, legend, +i);\n        if (row.value === Other) {\n            row.label = language.legendOther;\n        } else {\n            rowTexts.push(row.value);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance/src/ordinal.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { Column } from '@msrvida/chart-types';\nimport { Insight, SpecColumns } from '@msrvida/sanddance-specs';\nimport { GL_ORDINAL } from './constants';\nimport { OrdinalMap } from './types';\n\nexport function assignOrdinals(columns: SpecColumns, data: object[], ordinalMap?: OrdinalMap) {\n    const uCol = columns.uid && columns.uid.name;\n\n    if (ordinalMap) {\n        data.forEach((d, i) => {\n            const key = uCol ? d[uCol] : i;\n            d[GL_ORDINAL] = ordinalMap[key];\n        });\n    } else {\n        ordinalMap = {};\n        data.forEach((d, i) => {\n            d[GL_ORDINAL] = i;\n            const uColValue = uCol ? d[uCol] : i;\n            ordinalMap[uColValue] = i;\n        });\n    }\n\n    return ordinalMap;\n}\n\nexport function getDataIndexOfCube(cube: VegaMorphCharts.types.Cube, data: object[]) {\n    const len = data.length;\n    for (let i = 0; i < len; i++) {\n        if (data[i][GL_ORDINAL] === cube.ordinal) {\n            return i;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance/src/search.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { push } from './array';\nimport { SearchExpressionGroup } from '@msrvida/search-expression';\n\nexport function getSearchGroupFromVegaValue(search: any) {\n    let group: SearchExpressionGroup;\n    const vegaSearch: SearchExpressionGroup | SearchExpressionGroup[] = search;\n    if (Array.isArray(vegaSearch)) {\n        //flatten into one group\n        group = { expressions: [] };\n        vegaSearch.forEach(g => {\n            const clonedExpressions = VegaMorphCharts.util.clone(g.expressions).filter(Boolean);\n            clonedExpressions[0].clause = '&&';\n            push(group.expressions, clonedExpressions);\n        });\n    }\n    else {\n        group = vegaSearch ?\n            { expressions: vegaSearch.expressions.filter(Boolean) }\n            : null;\n    }\n    return group;\n}\n\n"
  },
  {
    "path": "packages/sanddance/src/signals.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { InitSignal, NewSignal, Spec, View } from 'vega-typings';\nimport { SignalNames, SignalValues } from '@msrvida/sanddance-specs';\n\nexport function applySignalValues(sv: SignalValues, b: Spec) {\n    if (!sv || !b || !b.signals || !b.signals.length) return;\n    for (const key in sv) {\n        const value = sv[key];\n        const signalB = b.signals.filter(signal => signal.name === key)[0] as NewSignal;\n        if (signalB && signalB.bind) {\n            signalB.value = value;\n        }\n    }\n}\n\nexport function extractSignalValuesFromView(view: View, spec: Spec) {\n    if (!view || !spec || !spec.signals || !spec.signals.length) return;\n    const result: SignalValues = {};\n    spec.signals.forEach((signalA: NewSignal) => {\n        //bound to a UI control\n        if (signalA.bind) {\n            try {\n                result[signalA.name] = view.signal(signalA.name);\n            }\n            catch (e) {\n                // continue regardless of error\n            }\n        }\n    });\n    return result;\n}\n\n//signals not capable of handling with MorphCharts\nconst hideSignalUI = [\n    SignalNames.MarkOpacity,\n    SignalNames.TextAngleX,\n    SignalNames.TextAngleY,\n];\n\nexport function unbindSignalUI(spec: Spec) {\n    spec.signals.forEach((signal: InitSignal) => {\n        if (hideSignalUI.indexOf(signal.name) >= 0) {\n            delete signal.bind;\n        }\n    });\n}\n"
  },
  {
    "path": "packages/sanddance/src/tooltip.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { GL_ORDINAL } from './constants';\nimport { isInternalFieldName } from './util';\nimport { TooltipCreateOptions, TooltipDestroyable } from './types';\n\nconst { outerSize } = VegaMorphCharts.util;\nconst { Table } = VegaMorphCharts.controls;\n\ninterface Props extends TooltipCreateOptions {\n    cssPrefix: string;\n}\n\ninterface RenderProps {\n    cssPrefix: string;\n    rows: VegaMorphCharts.controls.TableRow[];\n}\n\nexport class Tooltip implements TooltipDestroyable {\n    private element: HTMLElement;\n    private child: HTMLElement;\n    private finalizeHandler: () => void;\n\n    constructor(private props: Props) {\n        const renderProps: RenderProps = {\n            cssPrefix: props.cssPrefix,\n            rows: getRows(props.dataItem),\n        };\n        this.finalizeHandler = () => this.destroy();\n        this.element = renderTooltip(renderProps) as any as HTMLElement;\n        if (this.element) {\n            this.element.style.position = 'absolute';\n            this.child = this.element.firstChild as HTMLElement;\n            document.body.appendChild(this.element);\n            //measure and move as necessary\n            let m = outerSize(this.child);\n            while (m.height > document.documentElement.clientHeight) {\n                const tr = this.child.querySelector('tr:last-child') as HTMLTableRowElement;\n                if (tr) {\n                    tr.parentElement.removeChild(tr);\n                } else {\n                    break;\n                }\n                m = outerSize(this.child);\n            }\n            let position: { clientX: number, clientY: number };\n            const te = props.event as TouchEvent;\n            if (te.touches) {\n                position = te[0];\n            } else {\n                const pme = props.event as MouseEvent | PointerEvent;\n                position = pme;\n            }\n\n            if (position.clientX + m.width >= document.documentElement.clientWidth) {\n                this.child.style.right = '0';\n            }\n            let moveTop = true;\n            if (position.clientY + m.height >= document.documentElement.clientHeight) {\n                if (position.clientY - m.height > 0) {\n                    this.child.style.bottom = '0';\n                } else {\n                    moveTop = false;\n                }\n            }\n            if (moveTop) {\n                this.element.style.top = `${position.clientY}px`;\n            }\n            this.element.style.left = `${position.clientX}px`;\n            this.child.addEventListener('mouseenter', this.finalizeHandler);\n            this.child.addEventListener('mousemove', this.finalizeHandler);\n            this.child.addEventListener('mouseover', this.finalizeHandler);\n        }\n    }\n\n    destroy() {\n        this.child.removeEventListener('mouseenter', this.finalizeHandler);\n        this.child.removeEventListener('mousemove', this.finalizeHandler);\n        this.child.removeEventListener('mouseover', this.finalizeHandler);\n        if (this.element) {\n            document.body.removeChild(this.element);\n        }\n        this.element = null;\n    }\n}\n\nexport function cleanDataItem(item: object) {\n    const ret: object = {};\n    for (const columnName in item) {\n        if (columnName === GL_ORDINAL) {\n            continue;\n        }\n        if (isInternalFieldName(columnName)) {\n            continue;\n        }\n        ret[columnName] = item[columnName];\n    }\n    return ret;\n}\n\nfunction getRows(item: object) {\n    const rows: VegaMorphCharts.controls.TableRow[] = [];\n    for (const columnName in item) {\n        const value: any = item[columnName];\n        let content: string | JSX.Element;\n        switch (value) {\n            case null:\n                content = <i>null</i>;\n                break;\n            case undefined:\n                content = <i>undefined</i>;\n                break;\n            default:\n                content = value.toString();\n        }\n        //}\n        rows.push({\n            cells: [\n                { content: columnName + ':' },\n                { content },\n            ],\n        });\n    }\n    return rows;\n}\n\nconst renderTooltip = (props: RenderProps) => {\n    return props.rows.length === 0 ? null : (\n        <div className={`${props.cssPrefix}tooltip`}>\n            {Table({ rows: props.rows })}\n        </div>\n    );\n};\n"
  },
  {
    "path": "packages/sanddance/src/transition.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { Transition } from './types';\nimport { getStats } from '@msrvida/sanddance-specs';\nimport { scaleLinear } from 'd3-scale';\nimport { GL_ORDINAL } from './constants';\nimport { Dimension3D } from '../../chart-types/dist/es6';\n\nexport function assignTransitionStagger(transition: Transition, currentData: object[], selection: Set<number>, presenter: VegaMorphCharts.Presenter) {\n    const { layerStagger } = presenter.morphchartsref;\n    const { morphChartsRenderResult } = presenter;\n    const cubelayer = morphChartsRenderResult.getCubeLayer();\n    const range = transition.reverse ? [1, 0] : [0, 1];\n    if (!transition || transition.type === 'ordinal' && !transition.reverse) {\n        delete layerStagger.cubes;\n    } else {\n        const staggerOrders = new Float64Array(cubelayer.positionsX.length);\n        switch (transition.type) {\n            case 'ordinal': {\n                //reverse ordinal\n                const scale = scaleLinear(range).domain([0, currentData.length]);\n                currentData.forEach((datum, i) => {\n                    const glOrdinal = datum[GL_ORDINAL] as number;\n                    staggerOrders[glOrdinal] = scale(i);\n                });\n                break;\n            }\n            case 'column': {\n                if (transition.column.quantitative) {\n                    const values = new Float64Array(currentData.length);\n                    currentData.forEach((datum, i) => {\n                        values[i] = datum[transition.column.name];\n                    });\n                    const stats = getStats(currentData, transition.column);\n                    const scale = scaleLinear(range).domain([stats.min, stats.max]);\n                    currentData.forEach((datum, i) => {\n                        const glOrdinal = datum[GL_ORDINAL] as number;\n                        staggerOrders[glOrdinal] = scale(values[i]);\n                    });\n                } else {\n                    const strings: string[] = new Array(currentData.length);\n                    currentData.forEach((datum, i) => {\n                        strings[i] = datum[transition.column.name];\n                    });\n                    getStats(currentData, transition.column, distictValues => {\n                        currentData.forEach((datum, i) => {\n                            const glOrdinal = datum[GL_ORDINAL] as number;\n                            const index = distictValues.indexOf(strings[i]);\n                            const staggerOrder = index / distictValues.length;\n                            staggerOrders[glOrdinal] = transition.reverse ? 1 - staggerOrder : staggerOrder;\n                        });\n                    });\n                }\n                break;\n            }\n            case 'position': {\n                const dimensions: { [key in Dimension3D]: Float64Array } = {\n                    x: cubelayer.positionsX,\n                    y: cubelayer.positionsY,\n                    z: cubelayer.positionsZ,\n                };\n                const positions = dimensions[transition.dimension];\n                const values = new Float64Array(currentData.length);\n                currentData.forEach((datum, i) => {\n                    const glOrdinal = datum[GL_ORDINAL] as number;\n                    values[i] = positions[glOrdinal];\n                });\n                const stats = getStats(values, null, 'number', true);\n                const scale = scaleLinear(range).domain([stats.min, stats.max]);\n                currentData.forEach((datum, i) => {\n                    const glOrdinal = datum[GL_ORDINAL] as number;\n                    staggerOrders[glOrdinal] = scale(values[i]);\n                });\n                break;\n            }\n        }\n        layerStagger.cubes = { staggerOrders, maxStaggerOrder: 1, minStaggerOrder: 0 };\n    }\n    cubelayer.update(morphChartsRenderResult.bounds, selection, layerStagger.cubes);\n}"
  },
  {
    "path": "packages/sanddance/src/types.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport {\n    Camera,\n    Column,\n    ColumnStats,\n    ColumnTypeMap,\n    Dimension2D,\n    Dimension3D,\n    Size,\n    View,\n} from '@msrvida/chart-types';\n//import { LightSettings } from '@deck.gl/core/lib/layer';\nimport { Search, SearchExpressionGroup } from '@msrvida/search-expression';\nimport { Spec } from 'vega-typings';\nimport {\n    Insight,\n    SpecCapabilities,\n    SpecColorSettings,\n    SpecLanguage,\n    SpecResult,\n    SpecViewOptions,\n} from '@msrvida/sanddance-specs';\n\nexport { Camera, Column, ColumnStats, ColumnTypeMap, Dimension2D, Dimension3D, Size, View };\n\n/**\n * Map of ordinals per unique Id.\n */\nexport interface OrdinalMap {\n    [uid: string]: number;\n}\n\n/**\n * Result of an attempt to render.\n */\nexport interface RenderResult {\n\n    /**\n     * Specification result object.\n     */\n    specResult: SpecResult;\n\n    /**\n     * Map of cube ordinals assigned by unique id.\n     */\n    ordinalMap: OrdinalMap;\n}\n\n/**\n * Customization options for the Viewer.\n */\nexport interface ViewerOptions extends SpecViewOptions {\n\n    /**\n     * Custom colors of various parts of the visualization.\n     */\n    colors: ColorSettings;\n\n    /**\n     * Font family of text elements.\n     */\n    fontFamily?: string;\n\n    /**\n     * Language settings for the visualization.\n     */\n    language: Language;\n\n    /**\n     * Tooltip options\n     */\n    tooltipOptions?: TooltipOptions;\n\n    /**\n     * Optional error handler.\n     */\n    onError?: (errors: string[]) => void;\n\n    /**\n     * Optional handler when color context changes.\n     */\n    onColorContextChange?: () => void;\n\n    /**\n     * Optional handler to be invoked when data is filtered.\n     */\n    onDataFilter?: (filter: Search, filteredData: object[]) => void;\n\n    /**\n     * Optional handler to be invoked when selection has changed.\n     */\n    onSelectionChanged?: (search: Search, activeIndex?: number, selectedData?: object[]) => void;\n\n    /**\n     * Optional handler when data is on stage.\n     */\n    onStage?: (stage: VegaMorphCharts.types.Stage) => void;\n\n    /**\n     * Optional handler when chart is presented.\n     */\n    onPresent?: () => void;\n\n    /**\n     * Optional handler to modify the stage prior to deck.gl layer construction.\n     */\n    onBeforeCreateLayers?: (stage: VegaMorphCharts.types.Stage, specCapabilities: SpecCapabilities) => void;\n\n    /**\n     * Optional handler to get the color of text elements.\n     */\n    getTextColor?: (t: VegaMorphCharts.types.VegaTextLayerDatum) => VegaMorphCharts.RGBAColor;\n\n    /**\n     * Optional handler to get the highlight color of text elements.\n     */\n    getTextHighlightColor?: (t: VegaMorphCharts.types.VegaTextLayerDatum) => VegaMorphCharts.RGBAColor;\n\n    /**\n     * Optional click handler for text elements.\n     */\n    onTextClick?: (e: MouseEvent | PointerEvent | TouchEvent, o: VegaMorphCharts.types.VegaTextLayerDatum) => void;\n\n    /**\n     * Optional handler when axis is clicked.\n     */\n    onAxisClick?: (e: TouchEvent | MouseEvent | PointerEvent, search: SearchExpressionGroup) => void;\n\n    /**\n     * Optional handler when empty canvas is clicked.\n     */\n    onCanvasClick?: (e: TouchEvent | MouseEvent | PointerEvent) => void;\n\n    /**\n     * Optional handler when cube is clicked.\n     */\n    onCubeClick?: (e: TouchEvent | MouseEvent | PointerEvent, cube: VegaMorphCharts.types.Cube) => void;\n\n    /**\n     * Optional handler when legend header is clicked.\n     */\n    onLegendHeaderClick?: (e: TouchEvent | MouseEvent | PointerEvent) => void;\n\n    /**\n     * Optional handler when legend row is clicked.\n     */\n    onLegendRowClick?: (e: TouchEvent | MouseEvent | PointerEvent, legendRow: LegendRowWithSearch) => void;\n\n    /**\n     * Optional handler when Vega spec is created, prior to it being rendered.\n     */\n    onVegaSpec?: (vegaSpec: Spec) => void;\n\n    /**\n     * Optional handler to reset the camera after chart is rendered.\n     */\n    onNewViewStateTarget?: () => boolean;\n\n    /**\n     * Optional flag to preserve the WebGL canvas.\n     */\n    preserveDrawingBuffer?: boolean;\n\n    /**\n     * Z value of selection polygons.\n     */\n    selectionPolygonZ: number;\n\n    /**\n     * Disable lasso selection.\n     */\n    disableLasso?: boolean;\n\n    filterRenderingTimerPadding?: number;\n}\n\nexport interface RenderOptions {\n    rebaseFilter?: () => boolean;\n    columns?: Column[];\n    columnTypes?: ColumnTypeMap;\n    ordinalMap?: OrdinalMap;\n    initialColorContext?: ColorContext;\n    discardColorContextUpdates?: () => boolean;\n}\n\n/**\n * Custom colors of various parts of the visualization.\n */\nexport interface ColorSettings extends SpecColorSettings {\n\n    /**\n     * Color of the background canvas.\n     */\n    backgroundColor?: string;\n\n    /**\n    * Color of the individually selected cube.\n    */\n    activeCube?: string;\n\n    /**\n     * Color of the cube when mouse hovered.\n     */\n    hoveredCube?: string;\n\n    /**\n     * Color of selected cubes.\n     */\n    selectedCube?: string;\n\n    /**\n     * Color of axis hover hotspots.\n     */\n    axisSelectHighlight?: string;\n}\n\n/**\n * Labels in the sections of the chart panel.\n */\nexport interface Headers {\n\n    /**\n     * Label above chart controls.\n     */\n    chart: string;\n\n    /**\n     * Label above legend.\n     */\n    legend: string;\n\n    /**\n     * Label above selection area.\n     */\n    selection: string;\n\n    /**\n     * Label above details section.\n     */\n    details: string;\n}\n\n/**\n * Language settings.\n */\nexport interface Language extends SpecLanguage {\n\n    /**\n     * Labels in the sections of the chart panel.\n     */\n    headers: Headers;\n\n    /**\n     * Text to use for \"search with Bing\".\n     */\n    bing: string;\n\n    /**\n     * Button text to re-map color.\n     */\n    newColorMap: string;\n\n    /**\n     * Button text to keep same color.\n     */\n    oldColorMap: string;\n\n    /**\n     * Button text to deselect.\n     */\n    deselect: string;\n\n    /**\n     * Button text to filter out selected items.\n     */\n    exclude: string;\n\n    /**\n     * Button text to keep only selected items.\n     */\n    isolate: string;\n\n    /**\n     * Text for aggregated legend rows past maximum.\n     */\n    legendOther: string;\n\n    /**\n     * Button text for next item.\n     */\n    nextDetail: string;\n\n    /**\n     * Button text for previous item.\n     */\n    previousDetail: string;\n\n    /**\n     * Button text to remove all filters.\n     */\n    reset: string;\n\n    /**\n     * Label preceding number of items in selection.\n     */\n    selectionCount: (count: number) => string;\n}\n\n/**\n * Custom Vega color scheme.\n */\nexport interface ColorScheme {\n\n    /**\n     * Name of the color scheme.\n     */\n    scheme: string;\n\n    /**\n     * Array of CSS colors.\n     */\n    colors: string[];\n}\n\nexport interface ColorMappedItem {\n    color?: VegaMorphCharts.RGBAColor;\n    unSelected?: boolean;\n}\n\n/**\n * ColorMap plus an HTMLElement legend containing color.\n */\nexport interface ColorContext {\n    colorMap: VegaMorphCharts.types.UnitColorMap;\n    legendElement: HTMLElement;\n    legend: VegaMorphCharts.types.Legend;\n}\n\nexport interface LegendRowWithSearch extends VegaMorphCharts.types.LegendRow {\n    search: SearchExpressionGroup;\n}\n\nexport interface SelectionState {\n    search?: Search;\n    selectedData?: object[];\n    active?: object;\n}\n\nexport interface TooltipCreateOptions {\n    dataItem: object;\n    event: MouseEvent | PointerEvent | TouchEvent;\n}\n\nexport interface TooltipDestroyable {\n    destroy: () => void;\n}\n\nexport interface TooltipOptions {\n    prepareDataItem?: (dataItem: object) => object;\n    create?: (props: TooltipCreateOptions) => TooltipDestroyable;\n}\n\nexport type Transition = TransitionByOrdinal | TransitionByColumn | TransitionByPosition;\n\nexport type TransitionType = 'ordinal' | 'column' | 'position';\n\nexport interface TransitionBase {\n    type: TransitionType;\n    reverse?: boolean;\n}\nexport interface TransitionByOrdinal extends TransitionBase {\n    type: 'ordinal';\n}\nexport interface TransitionByColumn extends TransitionBase {\n    type: 'column';\n    column: Column;\n}\n\nexport interface TransitionByPosition extends TransitionBase {\n    type: 'position';\n    dimension: Dimension3D;\n}\n\nexport interface Setup extends VegaMorphCharts.types.PresenterSetup {\n    transition?: Transition;\n}\n\n/**\n * Saved metadata about an Insight.\n */\nexport interface Snapshot {\n    title?: string;\n    description?: string;\n    insight?: Insight;\n    image?: string;\n    bgColor?: string;\n    setup?: Setup;\n}\n\n/**\n * Visualize an Insight with a particular Setup.\n */\nexport interface InsightSetup {\n    insight: Insight;\n    setup?: Setup;\n}\n\n"
  },
  {
    "path": "packages/sanddance/src/util.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { FieldNames, GL_ORDINAL } from './constants';\n\nexport { getColumnsFromData, getStats, inferAll } from '@msrvida/sanddance-specs';\nexport { getPresenterStyle } from './defaults';\n\nexport function isInternalFieldName(columnName: string, includeVegaMorphChartsFields = false) {\n    if (includeVegaMorphChartsFields) {\n        if (columnName === GL_ORDINAL) return true;\n    }\n    for (const f in FieldNames) {\n        if (columnName === FieldNames[f]) return true;\n    }\n    return false;\n}\n"
  },
  {
    "path": "packages/sanddance/src/version.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const version: string = 'DEBUG';\n"
  },
  {
    "path": "packages/sanddance/src/viewer.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Animator, DataLayoutChange } from './animator';\nimport { AxisSelection, moveTicksBetween } from './axisSelection';\nimport { populateColorContext } from './colorCubes';\nimport { registerColorSchemes } from './colorSchemes';\nimport { GL_ORDINAL } from './constants';\nimport { DataScope } from './dataScope';\nimport { makeDateRange } from './date';\nimport { defaultViewerOptions, getPresenterStyle } from './defaults';\nimport { Details } from './details';\nimport { ensureHeaders } from './headers';\nimport { finalizeLegend } from './legend';\nimport { assignOrdinals, getDataIndexOfCube } from './ordinal';\nimport { getSearchGroupFromVegaValue } from './search';\nimport { applySignalValues, extractSignalValuesFromView, unbindSignalUI } from './signals';\nimport { cleanDataItem, Tooltip } from './tooltip';\nimport {\n    ColorContext,\n    InsightSetup,\n    LegendRowWithSearch,\n    RenderOptions,\n    RenderResult,\n    SelectionState,\n    Setup,\n    TooltipCreateOptions,\n    TooltipDestroyable,\n    Transition,\n    ViewerOptions,\n} from './types';\nimport { Camera, Column } from '@msrvida/chart-types';\nimport { View } from '@msrvida/chart-types';\nimport {\n    build,\n    getSpecColumns,\n    Insight,\n    SignalValues,\n    SpecCapabilities,\n    SpecColumns,\n    SpecContext,\n} from '@msrvida/sanddance-specs';\nimport * as searchExpression from '@msrvida/search-expression';\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\nimport { ViewGl_Class } from '@msrvida/vega-morphcharts/dist/es6/vega-classes/viewGl';\nimport { Spec, Transforms, SignalListenerHandler } from 'vega-typings';\n\nimport Search = searchExpression.Search;\nimport SearchExpression = searchExpression.SearchExpression;\nimport SearchExpressionGroup = searchExpression.SearchExpressionGroup;\n\nimport { CharacterSet } from './characterSet';\nimport { assignTransitionStagger } from './transition';\n\nconst { defaultView } = VegaMorphCharts.defaults;\n\nconst zAxisZindex = 1010;\n\nlet didRegisterColorSchemes = false;\n\n/**\n * Component to view a SandDance data visualization.\n */\nexport class Viewer {\n\n    /**\n     * Default Viewer options.\n     */\n    static defaultViewerOptions = defaultViewerOptions;\n\n    /**\n     * Behavior specified by the visualization type.\n     */\n    public specCapabilities: SpecCapabilities;\n\n    /**\n     * Viewer options object.\n     */\n    public options: ViewerOptions;\n\n    /**\n     * Vega specification.\n     */\n    public vegaSpec: Spec;\n\n    /**\n     * Vega View instance.\n     */\n    public vegaViewGl: ViewGl_Class;\n\n    /**\n     * Presenter which does the rendering.\n     */\n    public presenter: VegaMorphCharts.Presenter;\n\n    /**\n     * Insight object for chart layout.\n     */\n    public insight: Insight;\n\n    /**\n     * Setup object for visual rendering of Insight.\n     */\n    public setup: Setup;\n\n    /**\n     * Color contexts. There is only one color context until data is filtered, after which colors may be re-mapped in another color context.\n     */\n    public colorContexts: ColorContext[];\n\n    /**\n     * Index of current color context. Change this and then call renderSameLayout().\n     */\n    public currentColorContext: number;\n\n    private _axisSelection: AxisSelection;\n    private _specColumns: SpecColumns;\n    private _dataScope: DataScope;\n    private _animator: Animator;\n    private _details: Details;\n    private _tooltip: TooltipDestroyable;\n    private _shouldSaveColorContext: () => boolean;\n    private _lastPresenterConfig: VegaMorphCharts.types.PresenterConfig;\n    private _characterSet: CharacterSet;\n\n    /**\n     * Instantiate a new Viewer.\n     * @param element Parent HTMLElement to present within.\n     * @param options Optional viewer options object.\n     */\n    constructor(public element: HTMLElement, options?: Partial<ViewerOptions>) {\n        this.options = VegaMorphCharts.util.deepMerge<ViewerOptions>(defaultViewerOptions, options as ViewerOptions);\n        this.presenter = new VegaMorphCharts.Presenter(element, getPresenterStyle(this.options));\n        //this.presenter.logger = console.log;\n        this._characterSet = new CharacterSet();\n        this._dataScope = new DataScope();\n        this._animator = new Animator(\n            this._dataScope,\n            {\n                onDataChanged: this.onDataChanged.bind(this),\n                onAnimateDataChange: this.onAnimateDataChange.bind(this),\n            });\n        this._details = new Details(\n            this.presenter.getElement(VegaMorphCharts.PresenterElement.panel),\n            this.options.language,\n            this._animator,\n            this._dataScope,\n            remap => {\n                this.currentColorContext = ~~remap;\n                this.renderSameLayout();\n            },\n            () => this.insight && this.insight.columns && !!this.insight.columns.color && this.colorContexts && this.colorContexts.length > 1,\n        );\n        this.insight = {} as Insight;\n    }\n\n    private changeColorContexts(colorContexts: ColorContext[]) {\n        this.colorContexts = colorContexts;\n        this.currentColorContext = 0;\n        this.options.onColorContextChange && this.options.onColorContextChange();\n    }\n\n    private applyLegendColorContext(colorContext: ColorContext) {\n        const a = VegaMorphCharts.util.getActiveElementInfo();\n        VegaMorphCharts.util.mount(colorContext.legendElement, this.presenter.getElement(VegaMorphCharts.PresenterElement.legend));\n        VegaMorphCharts.util.setActiveElement(a);\n        this.presenter.stage.legend = colorContext.legend;\n    }\n\n    private onAnimateDataChange(dataChange: DataLayoutChange, waitingLabel: string, handlerLabel: string, time?: number) {\n        if (time === undefined) {\n            const transitionDurations = this.setup?.transitionDurations || VegaMorphCharts.defaults.defaultPresenterConfig.transitionDurations;\n            time = transitionDurations.position + transitionDurations.stagger;\n        }\n        return new Promise<void>((resolve, reject) => {\n            let innerPromise: Promise<any>;\n            if (dataChange === DataLayoutChange.refine) {\n                const oldColorContext = this.colorContexts[this.currentColorContext];\n                innerPromise = new Promise<void>(innerResolve => {\n                    this.renderNewLayout({}, {\n                        ...(this.setup || {}),\n                        preStage: (stage, cubeLayer) => {\n                            finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                            this.overrideAxisLabels(stage);\n                            cubeLayer.unitColorMap = oldColorContext.colorMap;\n                            if (this.options.onStage) {\n                                this.options.onStage(stage);\n                            }\n                        },\n                    }).then(() => {\n                        //apply old legend\n                        this.applyLegendColorContext(oldColorContext);\n                        innerResolve();\n                    });\n                });\n            } else {\n                innerPromise = this.renderNewLayout({}, {\n                    ...(this.setup || {}),\n                    preStage: (stage, colorMapper) => {\n                        finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n                        this.overrideAxisLabels(stage);\n                        if (this.options.onStage) {\n                            this.options.onStage(stage);\n                        }\n                    },\n                });\n            }\n            innerPromise.then(() => {\n                this.presenter.animationQueue(resolve, time, { waitingLabel, handlerLabel, animationCanceled: reject });\n            });\n        });\n    }\n\n    private async onDataChanged(dataLayout: DataLayoutChange, filter?: Search) {\n        switch (dataLayout) {\n            case DataLayoutChange.same: {\n                const hasSelectedData = this._dataScope.hasSelectedData();\n                const hasActive = !!this._dataScope.active;\n\n                if (hasSelectedData || hasActive) {\n                    this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n                } else {\n                    this.presenter.morphChartsRenderResult.update({ cubes: null });\n                }\n                break;\n            }\n            case DataLayoutChange.refine: {\n                //save cube colors\n                const oldColorContext = this.colorContexts[this.currentColorContext];\n                let colorMap: VegaMorphCharts.types.UnitColorMap;\n                this.presenter.morphChartsRenderResult.update({ cubes: null });\n                await this.renderNewLayout({}, {\n                    ...(this.setup || {}),\n                    preStage: (stage, cubeLayer) => {\n                        //save off the spec colors\n                        colorMap = cubeLayer.unitColorMap;\n                        cubeLayer.unitColorMap = oldColorContext.colorMap;\n                        this.preStage(stage, cubeLayer);\n                    },\n                    onPresent: () => {\n                        //save new legend\n                        const newColorContext: ColorContext = {\n                            colorMap,\n                            legend: VegaMorphCharts.util.clone(this.presenter.stage.legend),\n                            legendElement: this.presenter.getElement(VegaMorphCharts.PresenterElement.legend).children[0] as HTMLElement,\n                        };\n                        //apply old legend\n                        this.applyLegendColorContext(oldColorContext);\n                        this.changeColorContexts([oldColorContext, newColorContext]);\n                        this.onPresent();\n                    },\n                });\n\n                //narrow the filter only if it is different\n                if (!searchExpression.compare(this.insight.filter, filter)) {\n                    this.insight.filter = searchExpression.narrow(this.insight.filter, filter);\n                }\n                if (this.options.onDataFilter) {\n                    this.options.onDataFilter(this.insight.filter, this._dataScope.currentData());\n                }\n                break;\n            }\n            case DataLayoutChange.reset: {\n                const colorContext: ColorContext = {\n                    colorMap: null,\n                    legend: null,\n                    legendElement: null,\n                };\n                this.changeColorContexts([colorContext]);\n                this.presenter.morphChartsRenderResult.update({ cubes: null });\n                await this.renderNewLayout({}, {\n                    ...(this.setup || {}),\n                    onPresent: () => {\n                        //color needs to change instantly\n                        populateColorContext(colorContext, this.presenter);\n                        this.onPresent();\n                    },\n                });\n\n                delete this.insight.filter;\n                if (this.options.onDataFilter) {\n                    this.options.onDataFilter(null, null);\n                }\n                break;\n            }\n        }\n        if (this.options.onSelectionChanged) {\n            const sel = this.getSelection();\n            this.options.onSelectionChanged((sel && sel.search) || null, 0, (sel && sel.selectedData) || null);\n        }\n    }\n\n    private convertSearchToSet() {\n        if (this._dataScope.selection) {\n            const s = new Set<number>();\n            let found = false;\n            this._dataScope.selection.included.forEach((o, i) => {\n                s.add(o[GL_ORDINAL]);\n                found = true;\n            });\n            if (!found) {\n                s.add(-1);\n            }\n            return s;\n        }\n    }\n\n    private convertSetToSearch(s: Set<number>) {\n        const search: SearchExpressionGroup = {\n            expressions: [],\n        };\n        s.forEach(value => {\n            search.expressions.push({\n                name: GL_ORDINAL,\n                operator: '==',\n                value,\n                clause: '||',\n            });\n        });\n        return search;\n    }\n\n    private getSpecColumnsWithFilteredStats() {\n        if (!this._dataScope.hasFilteredData()) {\n            return this._specColumns;\n        }\n        const roles = ['color', 'facet', 'group', 'size', 'sort', 'sum', 'x', 'y', 'z'];\n        const specColumns = { ...this._specColumns };\n        roles.forEach(r => {\n            if (specColumns[r]) {\n                const column = { ...specColumns[r] } as Column;\n                column.stats = this.getColumnStats(column);\n                specColumns[r] = column;\n            }\n        });\n        return specColumns;\n    }\n\n    private async renderNewLayout(signalValues: SignalValues, presenterConfig?: VegaMorphCharts.types.PresenterConfig, view?: View) {\n        const currData = this._dataScope.currentData();\n        const context: SpecContext = {\n            specColumns: this.getSpecColumnsWithFilteredStats(),\n            insight: this.insight,\n            specViewOptions: {\n                ...this.options,\n                zAxisOptions: {\n                    showZAxis: true,\n                    zIndex: zAxisZindex,\n                },\n                collapseFacetAxes: true,\n            },\n        };\n        const specResult = build(context, currData);\n        if (!specResult.errors) {\n            const uiValues = extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n            applySignalValues({ ...uiValues, ...signalValues }, specResult.vegaSpec);\n            unbindSignalUI(specResult.vegaSpec);\n            this.vegaSpec = specResult.vegaSpec;\n            this.options.onVegaSpec && this.options.onVegaSpec(this.vegaSpec);\n            this.specCapabilities = specResult.specCapabilities;\n            const config = this.createConfig(presenterConfig);\n            this._lastPresenterConfig = config.presenterConfig;\n            if (view) {\n                config.getView = () => view;\n            }\n            if (!didRegisterColorSchemes) {\n                registerColorSchemes(VegaMorphCharts.base.vega);\n                didRegisterColorSchemes = true;\n            }\n            try {\n                if (this.vegaViewGl) {\n                    this.vegaViewGl.finalize();\n                }\n                const runtime = VegaMorphCharts.base.vega.parse(this.vegaSpec);\n                this.vegaViewGl = new VegaMorphCharts.ViewGl(runtime, config)\n                    .renderer('morphcharts')\n                    .initialize(this.element) as ViewGl_Class;\n                await this.vegaViewGl.runAsync();\n\n                const handler: SignalListenerHandler = (n, v) => {\n                    this._characterSet.resetCharacterSet(true);\n                };\n\n                this.vegaSpec.signals.forEach(s => {\n                    this.vegaViewGl.addSignalListener(s.name, handler);\n                });\n\n                //capture new color color contexts via signals\n                this.configForSignalCapture(config.presenterConfig);\n            }\n            catch (e) {\n                specResult.errors = [e.message];\n            }\n            if (!specResult.errors) {\n                ensureHeaders(this.presenter, this.options.language.headers);\n            }\n        }\n        if (specResult.errors) {\n            if (this.options.onError) {\n                this.options.onError(specResult.errors);\n            } else if (this.presenter.logger) {\n                this.presenter.logger(`errors rendering Vega spec:${specResult.errors.join('\\n')}`);\n            }\n        }\n        return specResult;\n    }\n\n    /**\n     * Render the same layout with new options.\n     * @param newViewerOptions New options object.\n     */\n    renderSameLayout(newViewerOptions?: Partial<ViewerOptions>) {\n        const colorContext = this.colorContexts[this.currentColorContext];\n\n        this.applyLegendColorContext(colorContext);\n\n        if (newViewerOptions) {\n            if (newViewerOptions.colors) {\n                //set theme colors PresenterConfig\n                const mcColors = this.getMorphChartsColors();\n                this.presenter.configColors(mcColors);\n\n                this._lastPresenterConfig.morphChartsColors = mcColors;\n            }\n            this.options = VegaMorphCharts.util.deepMerge(this.options, newViewerOptions as ViewerOptions);\n        }\n\n        this.presenter.morphChartsRenderResult.getCubeLayer().unitColorMap = colorContext.colorMap;\n        this.presenter.morphChartsRenderResult.update({ cubes: this.convertSearchToSet() });\n    }\n\n    private getView(view: View) {\n        if (view === undefined) {\n            if (this.presenter.view === null) {\n                return defaultView;\n            } else {\n                return this.presenter.view;\n            }\n        } else {\n            return view;\n        }\n    }\n\n    private transformData(values: object[], transform: Transforms[]) {\n        try {\n            const runtime = VegaMorphCharts.base.vega.parse({\n                $schema: 'https://vega.github.io/schema/vega/v4.json',\n                data: [{\n                    name: 'source',\n                    values,\n                    transform,\n                }],\n            });\n            new VegaMorphCharts.ViewGl(runtime).run();\n        }\n        catch (e) {\n            // continue regardless of error\n        }\n        return values;\n    }\n\n    /**\n     * Render data into a visualization.\n     * @param insightSetup InsightSetup object to create a visualization rendering.\n     * @param data Array of data objects.\n     * @param renderOptions Optional RenderOptions object.\n     */\n    async render(insightSetup: InsightSetup, data: object[], renderOptions: RenderOptions = {}) {\n        const { insight, setup } = insightSetup;\n        let result: RenderResult;\n        //see if refine expression has changed\n        if (!searchExpression.compare(insight.filter, this.insight.filter)) {\n            const transitionDurations = setup?.transitionDurations || VegaMorphCharts.defaults.defaultPresenterConfig.transitionDurations;\n            const renderTime = transitionDurations.position + transitionDurations.stagger;\n            const allowAsyncRenderTime = renderTime + this.options.filterRenderingTimerPadding;\n            if (insight.filter) {\n                //refining\n                result = await this._render(insightSetup, data, renderOptions, true);\n                this.presenter.animationQueue(() => {\n                    this.filter(insight.filter, renderOptions.rebaseFilter && renderOptions.rebaseFilter());\n                }, allowAsyncRenderTime, { waitingLabel: 'layout before refine', handlerLabel: 'refine after layout' });\n            } else {\n                //not refining\n                this._dataScope.setFilteredData(null);\n                result = await this._render(insightSetup, data, renderOptions, true);\n                this.presenter.animationQueue(() => {\n                    this.reset();\n                }, allowAsyncRenderTime, { waitingLabel: 'layout before reset', handlerLabel: 'reset after layout' });\n            }\n        } else {\n            result = await this._render(insightSetup, data, renderOptions, false);\n        }\n        return result;\n    }\n\n    private shouldViewstateTransition(newInsight: Insight, oldInsight: Insight) {\n        if (!oldInsight.columns) return false;\n        if (oldInsight.chart !== newInsight.chart) return true;\n        if (oldInsight.size.height !== newInsight.size.height) return true;\n        if (oldInsight.size.width !== newInsight.size.width) return true;\n        if (oldInsight.columns.facet !== newInsight.columns.facet) return true;\n        return false;\n    }\n\n    private configForSignalCapture(presenterConfig: VegaMorphCharts.types.PresenterConfig) {\n        const colorContext = {\n            colorMap: null,\n            legend: null,\n            legendElement: null,\n        };\n\n        //now be ready to capture color changing signals \n        presenterConfig.preStage = (stage, cubeLayer) => {\n            if (this._shouldSaveColorContext()) {\n                //save off the colors from Vega layout\n                colorContext.colorMap = cubeLayer.unitColorMap;\n            }\n            this.preStage(stage, cubeLayer);\n        };\n        presenterConfig.onPresent = () => {\n            if (this._shouldSaveColorContext()) {\n                populateColorContext(colorContext, this.presenter);\n                this.changeColorContexts([colorContext]);\n                this._dataScope.deselect();\n            }\n            this.onPresent();\n        };\n    }\n\n    private onPresent() {\n        if (this.setup?.transition) {\n            assignTransitionStagger(this.setup.transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n        }\n        this.options.onPresent && this.options.onPresent();\n    }\n\n    private async _render(insightSetup: InsightSetup, data: object[], renderOptions: RenderOptions, forceNewCharacterSet: boolean) {\n        const { insight, setup } = insightSetup;\n        if (this._tooltip) {\n            this._tooltip.destroy();\n            this._tooltip = null;\n        }\n        if (this._dataScope.setData(data, renderOptions.columns)) {\n            //apply transform to the data\n            this.transformData(data, insight.transform);\n        }\n        this._specColumns = getSpecColumns(insight, this._dataScope.getColumns(renderOptions.columnTypes));\n        const ordinalMap = assignOrdinals(this._specColumns, data, renderOptions.ordinalMap);\n\n        this._characterSet.resetCharacterSet(forceNewCharacterSet, this.insight, insight);\n\n        this.insight = VegaMorphCharts.util.clone(insight);\n        this.setup = setup;\n        this._shouldSaveColorContext = () => !renderOptions.initialColorContext;\n        const colorContext = renderOptions.initialColorContext || {\n            colorMap: null,\n            legend: null,\n            legendElement: null,\n        };\n        const specResult = await this.renderNewLayout(\n            insight.signalValues,\n            {\n                ...(setup || {}),\n                preStage: (stage, cubeLayer) => {\n                    if (this._shouldSaveColorContext()) {\n                        //save off the colors from Vega layout\n                        colorContext.colorMap = cubeLayer.unitColorMap;\n                    } else {\n                        //apply passed colorContext\n                        cubeLayer.unitColorMap = colorContext.colorMap;\n                    }\n                    //if items are selected, repaint\n                    const hasSelectedData = !!this._dataScope.hasSelectedData();\n                    //const hasActive = !!this._dataScope.active;\n                    if (hasSelectedData || this._dataScope.active) {\n                        //TODO paint active item\n                        //this.presenter.mcRenderResult.update({ cubes: this.convertSearchToSet() });\n                    }\n                    this.preStage(stage, cubeLayer);\n                },\n                onPresent: () => {\n                    if (this._shouldSaveColorContext()) {\n                        populateColorContext(colorContext, this.presenter);\n                        this.changeColorContexts([colorContext]);\n                    } else {\n                        //apply passed colorContext\n                        this.applyLegendColorContext(colorContext);\n                    }\n                    this.onPresent();\n                },\n                shouldViewstateTransition: () => this.shouldViewstateTransition(insight, this.insight),\n            },\n            this.getView(insight.view),\n        );\n        //future signal changes should save the color context\n        this._shouldSaveColorContext = () => !renderOptions.discardColorContextUpdates || !renderOptions.discardColorContextUpdates();\n        this._details.render();\n        const result: RenderResult = { ordinalMap, specResult };\n        return result;\n    }\n\n    private overrideAxisLabels(stage: VegaMorphCharts.types.Stage) {\n        // if (this._specColumns.x && this._specColumns.x.type === 'date') {\n        //     stage.axes.x.forEach(axis => makeDateRange(\n        //         axis.tickText,\n        //         this.getColumnStats(this._specColumns.x)\n        //     ));\n        // }\n        // if (this._specColumns.y && this._specColumns.y.type === 'date') {\n        //     stage.axes.y.forEach(axis => makeDateRange(\n        //         axis.tickText,\n        //         this.getColumnStats(this._specColumns.y)\n        //     ));\n        // }\n\n    }\n\n    private preLayer(stage: VegaMorphCharts.types.Stage) {\n        //convert ticks\n        let axisRole: VegaMorphCharts.types.AxisRole;\n        for (axisRole in stage.axes) {\n            const capability = this.specCapabilities.roles.filter(r => r.role === axisRole)[0];\n            if (capability && (capability.axisSelectionBetweenTicks || capability.axisSelection === 'exact')) {\n                moveTicksBetween(stage.axes[axisRole]);\n            }\n        }\n    }\n\n    private preStage(stage: VegaMorphCharts.types.Stage, cubeLayer: VegaMorphCharts.types.ICubeLayer) {\n        this.overrideAxisLabels(stage);\n        this._axisSelection = new AxisSelection(this.specCapabilities, this._specColumns, stage);\n        finalizeLegend(this.insight.colorBin, this._specColumns.color, stage.legend, this.options.language);\n        if (this.options.onStage) {\n            this.options.onStage(stage);\n        }\n    }\n\n    private onCubeClick(e: MouseEvent | PointerEvent | TouchEvent, cube: VegaMorphCharts.types.Cube) {\n        this.options.onCubeClick && this.options.onCubeClick(e, cube);\n        const hasSelectedData = this._dataScope.hasSelectedData();\n        if (hasSelectedData && this._dataScope.selection.included.length > 1) {\n            //if active is within selection, keep the selection and activate the one.\n            const indexWithinSelection = this._dataScope.ordinalIndexWithinSelection(cube.ordinal);\n            if (indexWithinSelection.index >= 0) {\n                this.activate(indexWithinSelection.datum);\n                this._details.populate(this._dataScope.selection, indexWithinSelection.index);\n                if (this.options.onSelectionChanged) {\n                    const sel = this.getSelection();\n                    this.options.onSelectionChanged(sel.search, indexWithinSelection.index, sel.selectedData);\n                }\n                return;\n            }\n        }\n        if (hasSelectedData && this._dataScope.selection.included.length === 1 && this._dataScope.selection.included[0][GL_ORDINAL] === cube.ordinal) {\n            this.deselect();\n            return;\n        }\n        const search: SearchExpression = {\n            name: GL_ORDINAL,\n            operator: '==',\n            value: cube.ordinal,\n        };\n        this.select(search);\n    }\n\n    private onCubeHover(event: MouseEvent | PointerEvent | TouchEvent, cube: VegaMorphCharts.types.Cube) {\n        if (this._tooltip) {\n            this._tooltip.destroy();\n            this._tooltip = null;\n        }\n        if (!cube) {\n            return;\n        }\n        const currentData = this._dataScope.currentData();\n        const index = getDataIndexOfCube(cube, currentData);\n        if (index >= 0) {\n            const dataItem = cleanDataItem(this.options.tooltipOptions?.prepareDataItem(currentData[index]) || currentData[index]);\n            const tooltipCreateOptions: TooltipCreateOptions = {\n                dataItem,\n                event,\n            };\n            if (this.options.tooltipOptions?.create) {\n                this._tooltip = this.options.tooltipOptions.create(tooltipCreateOptions);\n            } else {\n                this._tooltip = new Tooltip({\n                    ...tooltipCreateOptions,\n                    cssPrefix: this.presenter.style.cssPrefix,\n                });\n            }\n        }\n    }\n\n    private onTextHover(e: MouseEvent | PointerEvent | TouchEvent, t: VegaMorphCharts.types.VegaTextLayerDatum) {\n        //return true if highlight color is different\n        if (!t || !this.options.getTextColor || !this.options.getTextHighlightColor) return false;\n        return !VegaMorphCharts.util.colorIsEqual(this.options.getTextColor(t), this.options.getTextHighlightColor(t));\n    }\n\n    private getMorphChartsColors(): VegaMorphCharts.types.MorphChartsColors {\n        const { colors } = this.options;\n        return {\n            activeItemColor: colors.activeCube,\n            axesGridBackgroundColor: colors.backgroundColor,\n            axesGridHighlightColor: colors.axisSelectHighlight,\n            axesGridMajorColor: colors.gridLine,\n            axesGridMinorColor: colors.gridLine,\n            axesGridZeroColor: colors.gridLine,\n            axesTextHeadingColor: colors.axisText,\n            axesTextLabelColor: colors.axisText,\n            axesTextTitleColor: colors.axisText,\n            backgroundColor: colors.backgroundColor,\n            textBorderColor: colors.backgroundColor,\n            textColor: colors.axisText,\n        };\n    }\n\n    private createConfig(c?: VegaMorphCharts.types.PresenterConfig): VegaMorphCharts.types.ViewGlConfig {\n        const { getTextColor, getTextHighlightColor, onTextClick } = this.options;\n        const defaultPresenterConfig: VegaMorphCharts.types.PresenterConfig = {\n            morphChartsColors: this.getMorphChartsColors(),\n            zAxisZindex,\n            getCharacterSet: stage => this._characterSet.getCharacterSet(stage),\n            getTextColor,\n            getTextHighlightColor,\n            onTextClick: (e, t) => {\n                if (t.metaData && t.metaData.search) {\n                    //used by facets to select the facet\n                    const search = getSearchGroupFromVegaValue(t.metaData.search);\n                    if (this.options.onAxisClick) {\n                        this.options.onAxisClick(e, search);\n                    } else {\n                        this.select(search);\n                    }\n                }\n                if (onTextClick) {\n                    onTextClick(e, t);\n                }\n            },\n            onCubeClick: this.onCubeClick.bind(this),\n            onCubeHover: this.onCubeHover.bind(this),\n            onTextHover: this.onTextHover.bind(this),\n            preLayer: this.preLayer.bind(this),\n            preStage: this.preStage.bind(this),\n            onPresent: this.onPresent.bind(this),\n            onAxisConfig: (cartesian, dim3d, axis) => {\n                if (!axis) return;\n                const role = this.specCapabilities.roles.filter(r => r.role === axis.axisRole)[0];\n                if (role?.axisSelection) {\n                    cartesian.isDivisionPickingEnabled[dim3d] = true;\n                    cartesian.arePickDivisionsVisible[dim3d] = axis.tickText.length > 0;\n                    cartesian.isLabelPickingEnabled[dim3d] = true;\n                    cartesian.isTitlePickingEnabled[dim3d] = true;\n                    cartesian.isHeadingPickingEnabled[dim3d] = true;\n                    cartesian.isGridPickingEnabled = false;\n                }\n            },\n            onAxesComplete: (cartesian) => {\n            },\n            axisPickGridCallback: (divisions: number[], e: MouseEvent | PointerEvent | TouchEvent) => {\n                const search = this._axisSelection.convert(divisions);\n                if (this.options.onAxisClick) {\n                    this.options.onAxisClick(e, search as any);  //TODO change onAxisClick to accept Search\n                } else {\n                    this.select(search);\n                }\n            },\n            onLayerClick: (e: MouseEvent) => {\n                this.options.onCanvasClick && this.options.onCanvasClick(e);\n                this.deselect();\n            },\n            onLegendClick: (e: MouseEvent, legend: VegaMorphCharts.types.Legend, clickedIndex: number) => {\n                const legendRow = clickedIndex !== null && legend.rows[clickedIndex] as LegendRowWithSearch;\n                if (legendRow) {\n                    if (this.options.onLegendRowClick) {\n                        this.options.onLegendRowClick(e, legendRow);\n                    } else {\n                        this.select(legendRow.search);\n                    }\n                } else if (this.options.onLegendHeaderClick) {\n                    //header clicked\n                    this.options.onLegendHeaderClick(e);\n                }\n            },\n            onSceneRectAssignCubeOrdinal: datum => {\n                //TODO see if datum is a facet selection rect\n                return datum[GL_ORDINAL];\n            },\n            onTargetViewState: (h, w) => {\n                const { height, width } = this.insight.size;\n                let newViewStateTarget: boolean;\n                if (this.options.onNewViewStateTarget) {\n                    newViewStateTarget = this.options.onNewViewStateTarget();\n                }\n                return { height, width, newViewStateTarget };\n            },\n            layerSelection: {\n                cubes: this.convertSearchToSet(),\n            },\n            preserveDrawingBuffer: this.options.preserveDrawingBuffer,\n        };\n        if (!this.options.disableLasso) {\n            defaultPresenterConfig.onLasso = (ids, e) => {\n                this.deselect();\n                const search = this.convertSetToSearch(ids);\n                this.select(search);\n            };\n        }\n        if (this.options.onBeforeCreateLayers) {\n            defaultPresenterConfig.preLayer = stage => {\n                this.preLayer(stage);\n                this.options.onBeforeCreateLayers(stage, this.specCapabilities);\n            };\n        }\n        const config: VegaMorphCharts.types.ViewGlConfig = {\n            presenter: this.presenter,\n            presenterConfig: Object.assign(defaultPresenterConfig, c),\n        };\n        if (this.setup?.transitionDurations) {\n            config.presenterConfig.transitionDurations = this.setup.transitionDurations;\n        }\n        return config;\n    }\n\n    /**\n     * Filter the data and animate.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     * @param rebase Optional flag to apply to entire dataset. A false value will apply the filter upon any existing filter. \n     */\n    filter(search: Search, rebase = false) {\n        const u = this._dataScope.createUserSelection(search, false, rebase);\n        return new Promise<void>((resolve, reject) => {\n            this._animator.filter(search, u.included, u.excluded, rebase).then(() => {\n                this._details.clear();\n                this._details.clearSelection();\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n\n    /**\n     * Remove any filtration and animate.\n     */\n    reset() {\n        return new Promise<void>((resolve, reject) => {\n            this._animator.reset().then(() => {\n                this._details.clear();\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n\n    /**\n     * Select cubes by a filter expression.\n     * @param search Filter expression, see https://vega.github.io/vega/docs/expressions/\n     */\n    select(search: Search) {\n        return new Promise<void>((resolve, reject) => {\n            this._animator.select(search).then(() => {\n                this._details.populate(this._dataScope.selection);\n                resolve();\n            });\n        });\n    }\n\n    /**\n     * Removes any selection.\n     */\n    deselect() {\n        return new Promise<void>((resolve, reject) => {\n            this._animator.deselect().then(() => {\n                this._details.clearSelection();\n                resolve();\n            });\n        });\n    }\n\n    /**\n     * Gets the current selection.\n     */\n    getSelection() {\n        if (!this._dataScope) return null;\n        const selectionState: SelectionState = {\n            search: (this._dataScope.selection && this._dataScope.selection.search) || null,\n            selectedData: (this._dataScope.selection && this._dataScope.selection.included) || null,\n            active: this._dataScope.active,\n        };\n        return selectionState;\n    }\n\n    /**\n     * Set one data row to the active state.\n     */\n    activate(datum: object) {\n        return new Promise<void>((resolve, reject) => {\n            this._animator.activate(datum).then(() => {\n                this.presenter.morphChartsRenderResult.activate(datum[GL_ORDINAL]);\n                this._details.render();\n                resolve();\n            });\n        });\n    }\n\n    /**\n     * Deactivate item.\n     */\n    deActivate() {\n        return new Promise<void>((resolve, reject) => {\n            if (this._dataScope && this._dataScope.active) {\n                this._animator.deactivate().then(() => {\n                    this.presenter.morphChartsRenderResult.activate(-1);\n                    this._details.render();\n                    resolve();\n                });\n            } else {\n                resolve();\n            }\n        });\n    }\n\n    /**\n     * Gets the current camera.\n     * @param transitionFinal Optional flag to get camera destination when transition completes.\n     */\n    getCamera(transitionFinal = false): Camera {\n        let position: [number, number, number] = [0, 0, 0];\n        let rotation: [number, number, number, number] = [0, 0, 0, 0];\n        if (transitionFinal) {\n            position = Array.from(this.presenter?.morphchartsref?.cameraTransitioner.vPosition.to as any) as [number, number, number];\n            rotation = Array.from(this.presenter?.morphchartsref?.cameraTransitioner.qRotation.to as any) as [number, number, number, number];\n        } else {\n            const camera = this.presenter?.morphchartsref?.core?.camera;\n            if (camera) {\n                camera.getPosition(position);\n                camera.getOrbit(rotation);\n            }\n        }\n        return { position, rotation, captureSize: this.insight.size };\n    }\n\n    /**\n     * Sets the current camera.\n     * @param camera Camera to set.\n     */\n    setCamera(camera: Camera) {\n        if (camera) {\n            this.presenter?.morphChartsRenderResult?.moveCamera(camera);\n        }\n    }\n\n    /**\n     * Gets the current insight with signal values.\n     */\n    getInsight(): Insight {\n        const insight = { ...this.insight };\n        insight.signalValues = this.getSignalValues();\n        return insight;\n    }\n\n    /**\n     * Gets column stats from current data (filtered or all).\n     * @param column Column to get stats for.\n     */\n    getColumnStats(column: Column) {\n        return this._dataScope.hasFilteredData() ? this._dataScope.getFilteredColumnStats(column.name) : column.stats;\n    }\n\n    /**\n     * Gets current signal values.\n     */\n    getSignalValues() {\n        return extractSignalValuesFromView(this.vegaViewGl, this.vegaSpec);\n    }\n\n    assignTransitionStagger(transition: Transition) {\n        assignTransitionStagger(transition, this._dataScope.currentData(), this.convertSearchToSet(), this.presenter);\n    }\n\n    finalize() {\n        if (this._dataScope) this._dataScope.finalize();\n        if (this._details) this._details.finalize();\n        if (this._tooltip) this._tooltip.destroy();\n        if (this.vegaViewGl) this.vegaViewGl.finalize();\n        if (this.presenter) this.presenter.finalize();\n        if (this.element) this.element.innerHTML = '';\n        this.colorContexts = null;\n        this.element = null;\n        this.options = null;\n        this.presenter = null;\n        this.vegaSpec = null;\n        this.vegaViewGl = null;\n        this._animator = null;\n        this._dataScope = null;\n        this._details = null;\n        this._tooltip = null;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"VegaMorphCharts.util.createElement\",\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/sanddance-app/.gitignore",
    "content": "dist\n"
  },
  {
    "path": "packages/sanddance-app/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Document</title>\n    <style type=\"text/css\">\n        html,\n        body {\n            height: 100%;\n            margin: 0;\n        }\n\n        body {\n            font-family: 'Segoe UI', sans-serif;\n        }\n\n        select,\n        button,\n        input {\n            font-family: 'Segoe UI', sans-serif;\n        }\n\n        #app {\n            position: absolute;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n        }\n    </style>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"./src/css/sanddance-app.scss\" />\n    <link rel=\"shortcut icon\" href=\"/favicon.ico\" />\n</head>\n\n<body>\n    <!-- link to JSON files so we can get a url from the bundler -->\n    <a class=\"sanddance-app-static-content\" id=\"demovote\" data-display-name=\"Demo Vote\" data-type=\"tsv\"\n        href=\"/sample-data/demovote.tsv\"></a>\n    <a class=\"sanddance-app-static-content\" id=\"titanic\" data-display-name=\"Titanic\" data-type=\"tsv\"\n        href=\"/sample-data/titanicmaster.tsv\"></a>\n\n    <script>\n        var themeColors = {\n            \"dark\": {\n                defaultCube: [128, 225, 255, 255]\n            },\n            \"light\": {\n                defaultCube: [128, 225, 255, 255]\n            }\n        };\n        var insights = {\n            \"titanic\": {\n                \"columns\": {\n                    \"uid\": \"Name\",\n                    \"x\": \"Gender\",\n                    \"y\": \"Joined\",\n                    \"color\": \"Survived\",\n                    \"z\": \"TicketCost\",\n                    \"size\": \"TicketCost\",\n                    \"sort\": \"Survived\"\n                },\n                \"scheme\": \"dual_redgreen\",\n                \"chart\": \"barchart\",\n                \"view\": \"2d\"\n            },\n            \"demovote\": {\n                \"columns\": {\n                    \"uid\": \"Id\",\n                    \"x\": \"Longitude\",\n                    \"y\": \"Latitude\",\n                    \"color\": \"Obama\",\n                    \"z\": \"Education\",\n                    \"size\": \"TotalPop\",\n                    \"sort\": \"State\"\n                },\n                \"scheme\": \"redblue\",\n                \"chart\": \"scatterplot\",\n                \"view\": \"3d\",\n                \"colorBin\": \"quantize\"\n            }\n        };\n        var options = {\n            \"*\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleColor_BinCountSignal\": 7\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            \"titanic\": {\n                \"chartPrefs\": {\n                    \"barchart\": {\n                        \"color\": {\n                            \"Gender\": {\n                                \"scheme\": \"set2\"\n                            }\n                        }\n                    }\n                }\n            },\n            \"demovote\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"color\": {\n                            \"Winner\": {\n                                \"scheme\": \"dual_bluered\"\n                            }\n                        }\n                    },\n                    \"treemap\": {\n                        \"*\": {\n                            \"*\": {\n                                \"columns\": {\n                                    \"size\": \"TotalPop\"\n                                }\n                            }\n                        }\n                    },\n                    \"stacks\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleX_BinsSignal\": 30,\n                                    \"RoleY_BinsSignal\": 30\n                                }\n                            }\n                        }\n                    }\n                },\n                \"tooltipExclusions\": [\"Id\", \"Latitude\", \"Longitude\"]\n            }\n        };\n    </script>\n\n    <main id=\"app\"></main>\n\n    <script src=\"https://unpkg.com/react@17/umd/react.development.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@17/umd/react-dom.development.js\" crossorigin></script>\n    <script type=\"module\" src=\"./src/index.tsx\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "packages/sanddance-app/package.json",
    "content": "{\n  \"name\": \"@msrvida/sanddance-app\",\n  \"private\": true,\n  \"version\": \"4.0.0\",\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"deploy\": \"npm run bundle && node ./scripts/deploy.js\",\n    \"build-typescript\": \"tsc -p .\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-css\": \"sass ./src/css/sanddance-app.scss ./dist/css/sanddance-app.css\",\n    \"build:07\": \"npm run build-typescript && npm run bundle && npm run build-css\",\n    \"bundle\": \"vite build\",\n    \"dev\": \"vite --config vite.dev.config.js\"\n  },\n  \"targets\": {\n    \"main\": false,\n    \"types\": false,\n    \"umd\": {\n      \"distDir\": \"./dist/umd\",\n      \"optimize\": false,\n      \"scopeHoist\": false,\n      \"sourceMap\": false\n    }\n  },\n  \"umd\": \"./dist/umd/sanddance-app.js\"\n}"
  },
  {
    "path": "packages/sanddance-app/scripts/deploy.js",
    "content": "const fs = require('fs');\n//specific version\nfs.copyFileSync('./dist/css/sanddance-app.css', '../../docs/tests/v4/es6/css/sanddance-app.css');\nfs.copyFileSync('./dist/umd/sanddance-app.js', '../../docs/tests/v4/es6/js/sanddance-app.js');\n//main app\nfs.copyFileSync('./dist/css/sanddance-app.css', '../../docs/app/css/sanddance-app.css');\nfs.copyFileSync('./dist/umd/sanddance-app.js', '../../docs/app/js/sanddance-app.js');\n"
  },
  {
    "path": "packages/sanddance-app/src/base.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { FluentUIComponents } from '@msrvida/fluentui-react-cdn-typings';\nimport * as SandDanceExplorer from '@msrvida/sanddance-explorer';\nimport { SandDance } from '@msrvida/sanddance-explorer';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport types = SandDance.VegaMorphCharts.types;\n\n/**\n * References to dependency libraries.\n */\nexport interface Base {\n    fluentUI: FluentUIComponents;\n}\n\nexport const base: Base = {\n    fluentUI: null,\n};\n\n/**\n * Specify the dependency libraries to use for rendering.\n * @param fluentUI FluentUI React library.\n * @param vega Vega library.\n * @param deck @deck.gl/core library.\n * @param layers @deck.gl/layers library.\n * @param luma @luma.gl/core library.\n */\nexport function use(\n    fluentUI: FluentUIComponents,\n    vega: types.VegaBase,\n) {\n    SandDanceExplorer.use(fluentUI, React, ReactDOM, vega);\n    base.fluentUI = fluentUI;\n}\n"
  },
  {
    "path": "packages/sanddance-app/src/css/sanddance-app.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n.sanddance-app-static-content {\n    display: none;\n}\n\n.sanddance-app {\n    display: grid;\n    grid-template-rows: 100% 0;\n    height: 100%;\n}\n\n.sanddance-export {\n    .ms-Button {\n        margin-bottom: 1em;\n        margin-top: 0.5em;\n    }\n}\n\n.sanddance-datasource-picker {\n    width: 100%;\n    //margin-bottom: 12px;\n}\n\n@import \"../../../sanddance-explorer/dist/css/sanddance-explorer\";\n\n.sanddance-sidebar {\n    .sanddance-datascope {\n        min-height: 7em;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-app/src/dataSourcePicker.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { base } from './base';\nimport { strings } from './language';\nimport { DataSource, DataSourceSnapshot, DataSourceType } from './types';\nimport { invalidUrlError } from './url';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { controls, DataFileType } from '@msrvida/sanddance-explorer';\nimport * as React from 'react';\n\nexport interface Props {\n    dataSource: DataSource;\n    dataSources: DataSource[];\n    changeDataSource: (dataSource: DataSource) => Promise<void>;\n}\n\nexport interface ButtonProps extends Props {\n    getPicker: () => DataSourcePicker;\n}\n\nexport function DataSourceButton(props: ButtonProps) {\n    const picker = props.getPicker();\n    if (!picker) return null;\n    const menuProps: FluentUITypes.IContextualMenuProps = {\n        items: [\n            {\n                key: 'sample-section',\n                itemType: base.fluentUI.ContextualMenuItemType.Section,\n                sectionProps: {\n                    title: strings.sampleDataPrefix,\n                    items: props.dataSources.map((ds, i) => {\n                        const item: FluentUITypes.IContextualMenuItem = {\n                            key: ds.id,\n                            text: ds.displayName,\n                            onClick: e => {\n                                picker.changeDataSource(ds);\n                            },\n                        };\n                        return item;\n                    }),\n                },\n            },\n            {\n                key: 'user-section',\n                itemType: base.fluentUI.ContextualMenuItemType.Section,\n                sectionProps: {\n                    topDivider: true,\n                    title: strings.menuUserData,\n                    items: [\n                        {\n                            key: 'local',\n                            text: strings.menuLocal,\n                            onClick: e => picker.setState({ dialogMode: 'local' }),\n                        },\n                        {\n                            key: 'url',\n                            text: strings.menuUrl,\n                            onClick: e => picker.setState({ dialogMode: 'url' }),\n                        },\n                    ],\n                },\n            },\n        ],\n    };\n    return (\n        <base.fluentUI.PrimaryButton\n            className=\"sanddance-datasource-picker\"\n            text={dataSourcePrefix(props.dataSource.dataSourceType, props.dataSource.displayName)}\n            menuProps={menuProps}\n        />\n    );\n}\n\nexport interface DialogProps extends Props {\n    theme: string;\n}\n\nexport interface State {\n    uploadFormatError?: string;\n    url?: string;\n    urlType?: DataFileType;\n    urlError?: string;\n    working: boolean;\n    dialogMode?: DataSourceType;\n}\n\nexport class DataSourcePicker extends React.Component<DialogProps, State> {\n    constructor(props: DialogProps) {\n        super(props);\n        this.state = {\n            url: '',\n            urlType: DataSourcePicker.urlTypes[0],\n            working: false,\n        };\n    }\n\n    static urlTypes: DataFileType[] = ['json', 'csv', 'tsv', 'topojson'];\n\n    changeDataSource(dataSource: DataSource) {\n        this.setState({ working: true });\n        return new Promise<void>((resolve, reject) => {\n            const uploadFormatError = '';\n            const urlError = '';\n            this.setState({ uploadFormatError, urlError });\n            this.props\n                .changeDataSource(dataSource)\n                .then(() => {\n                    this.setState({\n                        working: false,\n                        uploadFormatError: '',\n                        urlError: '',\n                        dialogMode: null,\n                    });\n                    resolve();\n                })\n                .catch(reason => {\n                    this.setState({ working: false });\n                    reject(reason);\n                });\n        });\n    }\n\n    upload(e: React.ChangeEvent<HTMLInputElement>) {\n        if (e.target.files) {\n            const file = e.target.files[0];\n            const split = file.name.split('.');\n            const type = split[split.length - 1] as DataFileType;\n            if (DataSourcePicker.urlTypes.indexOf(type) >= 0) {\n                const reader = new FileReader();\n                reader.onload = () => {\n                    const id = file.name;\n                    const displayName = file.name;\n                    const rawText = reader.result as string;\n                    const ds: DataSource = {\n                        dataSourceType: 'local',\n                        displayName,\n                        id,\n                        rawText,\n                        type,\n                    };\n                    this.changeDataSource(ds);\n                };\n                reader.readAsText(file);\n            } else {\n                const uploadFormatError = strings.errorInvalidFileFormat;\n                this.setState({ uploadFormatError });\n            }\n        }\n    }\n\n    loadUrl() {\n        if (!this.state.url) {\n            return this.setState({ urlError: strings.errorNoUrl });\n        }\n        if (this.state.url.toLocaleLowerCase().substr(0, 4) !== 'http') {\n            return this.setState({ urlError: strings.errorUrlHttp });\n        }\n        //TODO: check url\n        const { url } = this.state;\n        const ds: DataSource = {\n            dataSourceType: 'url',\n            displayName: url,\n            id: url,\n            dataUrl: url,\n            type: this.state.urlType,\n        };\n        this.changeDataSource(ds).catch((e: Error) => {\n            this.setState({ urlError: e.message });\n        });\n    }\n\n    getUrlShortcut(dataUrl: string, type: DataFileType) {\n        const dss: DataSourceSnapshot = {\n            dataSource: {\n                dataSourceType: 'url',\n                dataUrl,\n                displayName: dataUrl.substring(dataUrl.lastIndexOf('/') + 1, dataUrl.lastIndexOf('.')),\n                id: '',\n                type,\n            },\n        };\n        return '#' + JSON.stringify(dss);\n    }\n\n    render() {\n        const closeDialog = () => {\n            this.setState({ dialogMode: null });\n        };\n        let shortcut: string;\n        if (this.state.url && !invalidUrlError(this.state.url) && !this.state.urlError) {\n            shortcut = this.getUrlShortcut(this.state.url, this.state.urlType);\n        }\n        return [(\n            <controls.Dialog\n                key='local'\n                hidden={!(this.state.dialogMode === 'local')}\n                onDismiss={closeDialog}\n                dialogContentProps={{\n                    className: `sanddance-dialog ${this.props.theme}`,\n                    type: base.fluentUI.DialogType.normal,\n                    title: strings.dialogTitleLocal,\n                    subText: strings.dialogSubtextLocal,\n                }}\n            >\n                <input\n                    type=\"file\"\n                    onChange={e => this.upload(e)}\n                    disabled={this.state.working}\n                />\n                {this.state.uploadFormatError && (\n                    <div className=\"error\">{this.state.uploadFormatError}</div>\n                )}\n            </controls.Dialog>\n        ), (\n            <controls.Dialog\n                key='url'\n                hidden={!(this.state.dialogMode === 'url')}\n                onDismiss={closeDialog}\n                dialogContentProps={{\n                    className: `sanddance-dialog ${this.props.theme}`,\n                    type: base.fluentUI.DialogType.normal,\n                    title: strings.dialogTitleUrl,\n                }}\n                buttons={[\n                    (\n                        <base.fluentUI.PrimaryButton\n                            key={0}\n                            onClick={e => this.loadUrl()}\n                            iconProps={{ iconName: 'CloudDownload' }}\n                            text={strings.dialogLoadButton}\n                            disabled={this.state.working}\n                        />\n                    ),\n                ]}\n            >\n                <section>\n                    <base.fluentUI.TextField\n                        label={strings.labelUrl}\n                        placeholder={strings.urlInputPlaceholder}\n                        onKeyUp={e => e.keyCode === 13 && this.loadUrl()}\n                        onChange={(e, url) =>\n                            this.setState({ url, urlError: '' })\n                        }\n                        value={this.state.url}\n                        disabled={this.state.working}\n                    />\n                    {this.state.urlError && (\n                        <div className=\"error\">{this.state.urlError}</div>\n                    )}\n                </section>\n                <section>\n                    <base.fluentUI.ChoiceGroup\n                        selectedKey={this.state.urlType}\n                        options={\n                            DataSourcePicker.urlTypes.map((urlType, i) => {\n                                return {\n                                    key: urlType,\n                                    text: urlType,\n                                    disabled: this.state.working,\n                                } as FluentUITypes.IChoiceGroupOption;\n                            })\n                        }\n                        onChange={(ev: React.FormEvent<HTMLInputElement>, option: FluentUITypes.IChoiceGroupOption) =>\n                            this.setState({ urlType: option.text as DataFileType, urlError: '' })\n                        }\n                        label={strings.labelDataFormat}\n                    />\n                </section>\n                <section className='tip' style={{ visibility: !invalidUrlError(this.state.url) && !this.state.urlError ? 'visible' : 'hidden' }} >\n                    {strings.labelDataUrlShortcut} <a\n                        href={shortcut}\n                        title={strings.labelLinkDescription}\n                        aria-label={strings.labelLinkDescription}\n                    >{strings.labelLink}</a>\n                </section>\n            </controls.Dialog>\n        )];\n    }\n}\n\nfunction dataSourcePrefix(dt: DataSourceType, displayName: string) {\n    switch (dt) {\n        case 'sample':\n            return `${strings.sampleDataPrefix}: ${displayName}`;\n        case 'local':\n            return strings.localFilePrefix;\n        case 'url':\n            return strings.urlPrefix;\n    }\n    return strings.buttonLoadData;\n}\n"
  },
  {
    "path": "packages/sanddance-app/src/download.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nexport function downloadData(data: any, fileName: string) {\n\n    // Adapted from https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server\n    const a = document.createElement('a');\n    a.setAttribute('download', fileName);\n    document.body.appendChild(a);\n\n    const blob = dataURIToBlob(data);\n    a.href = URL.createObjectURL(blob);\n    // we must revoke the object URL, \n    // since we can't know when the download occured, we have to attach it on the click handler..\n    a.onclick = () => {\n        // ..and to wait a frame\n        requestAnimationFrame(() => URL.revokeObjectURL(a.href));\n        document.body.removeChild(a);\n    };\n    a.click();\n}\n\n//from https://stackoverflow.com/a/37151835/620501\nfunction dataURIToBlob(binStr: string) {\n    const len = binStr.length,\n        arr = new Uint8Array(len);\n\n    for (let i = 0; i < len; i++) {\n        arr[i] = binStr.charCodeAt(i);\n    }\n\n    return new Blob([arr]);\n}\n"
  },
  {
    "path": "packages/sanddance-app/src/fluentUIComponents.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport {\n    ActionButton,\n    DefaultButton,\n    IconButton,\n    PrimaryButton,\n} from '@fluentui/react/lib/Button';\nimport { ChoiceGroup } from '@fluentui/react/lib/ChoiceGroup';\nimport { ComboBox } from '@fluentui/react/lib/ComboBox';\nimport { CommandBar } from '@fluentui/react/lib/CommandBar';\nimport { ContextualMenuItemType } from '@fluentui/react/lib/ContextualMenu';\nimport { Customizer } from '@fluentui/react/lib/Utilities';\nimport { Dialog, DialogFooter, DialogType } from '@fluentui/react/lib/Dialog';\nimport { Dropdown, DropdownMenuItemType } from '@fluentui/react/lib/Dropdown';\nimport { FluentUIComponents } from '@msrvida/fluentui-react-cdn-typings';\nimport { getFocusStyle, getTheme, loadTheme, registerIcons, unregisterIcons } from '@fluentui/react/lib/Styling';\nimport { Icon } from '@fluentui/react/lib/Icon';\nimport { initializeIcons, use } from '@msrvida/fluentui-icons';\nimport { Label } from '@fluentui/react/lib/Label';\nimport { Modal } from '@fluentui/react/lib/Modal';\nimport { Slider } from '@fluentui/react/lib/Slider';\nimport { Spinner, SpinnerSize } from '@fluentui/react/lib/Spinner';\nimport { TextField } from '@fluentui/react/lib/TextField';\nimport { Toggle } from '@fluentui/react/lib/Toggle';\n\nuse(registerIcons);\ninitializeIcons();\n\nexport const fluentUI: FluentUIComponents = {\n    ActionButton: ActionButton as any,\n    ChoiceGroup: ChoiceGroup as any,\n    ComboBox: ComboBox as any,\n    CommandBar: CommandBar as any,\n    ContextualMenuItemType,\n    Customizer: Customizer as any,\n    DefaultButton: DefaultButton as any,\n    Dialog: Dialog as any,\n    DialogFooter: DialogFooter as any,\n    DialogType,\n    Dropdown: Dropdown as any,\n    DropdownMenuItemType: DropdownMenuItemType as any,\n    Icon: Icon as any,\n    IconButton: IconButton as any,\n    getFocusStyle,\n    getTheme,\n    Label: Label as any,\n    loadTheme,\n    Modal: Modal as any,\n    PrimaryButton: PrimaryButton as any,\n    Slider: Slider as any,\n    Spinner: Spinner as any,\n    SpinnerSize,\n    TextField: TextField as any,\n    Toggle: Toggle as any,\n    registerIcons,\n    unregisterIcons,\n};\n"
  },
  {
    "path": "packages/sanddance-app/src/index.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { use } from './base';\nimport { fluentUI } from './fluentUIComponents';\nimport { SandDanceApp } from './sanddanceApp';\nimport { DataSource, InsightMap } from './types';\nimport * as SandDanceExplorer from '@msrvida/sanddance-explorer';\nimport {\n    ColorSettings,\n    DataFileType,\n    Explorer_Class,\n    Prefs,\n} from '@msrvida/sanddance-explorer';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as vega from 'vega';\n\nuse(fluentUI, vega);\n\nconst staticContent = Array.from(\n    document.querySelectorAll<HTMLAnchorElement>('a.sanddance-app-static-content'),\n);\n\nconst dataSets = staticContent.filter(f => f.id).map<DataSource>(n => {\n    const forData = staticContent.filter(f => f.dataset['for'] === n.id)[0];\n    return {\n        dataSourceType: 'sample',\n        id: n.id,\n        displayName: n.dataset['displayName'],\n        dataUrl: n.href,\n        type: n.dataset['type'] as DataFileType,\n        snapshotsUrl: forData ? forData.href : null,\n    };\n});\n\nlet explorer: Explorer_Class;\n\ndeclare let insights: InsightMap;\ndeclare let darkTheme: boolean;\ndeclare function setTheme(darkTheme: boolean): void;\ndeclare let options: { [datasetId: string]: Prefs };\ndeclare let themeColors: { [theme: string]: ColorSettings };\n\nconst undef = typeof undefined;\n\nReactDOM.render(\n    <SandDanceApp\n        setTheme={typeof setTheme !== undef && setTheme}\n        darkTheme={typeof darkTheme !== undef && darkTheme}\n        insights={typeof insights !== undef && insights}\n        initialOptions={typeof options !== undef && options}\n        themeColors={typeof themeColors !== undef && themeColors}\n        dataSources={dataSets}\n        mounted={app => {\n            explorer = app.explorer;\n        }}\n    />,\n    document.getElementById('app'),\n);\n\nconst z = 'z'.charCodeAt(0);\nconst Z = 'Z'.charCodeAt(0);\n\ndocument.onkeyup = e => {\n    //look for CTRL Z or CTRL SHIFT Z\n    if (e.ctrlKey && (e.keyCode === z || e.keyCode === Z)) {\n        if (e.shiftKey) {\n            explorer.redo();\n        } else {\n            explorer.undo();\n        }\n    }\n};\n\nwindow['SandDanceApp'] = { explorer, SandDanceExplorer };\n"
  },
  {
    "path": "packages/sanddance-app/src/language.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { DataSource } from './types';\n\nexport const strings = {\n    buttonLoadData: 'Load data',\n    buttonThemeDark: 'Dark',\n    buttonThemeLight: 'Light',\n    buttonExport: 'Export',\n    menuUserData: 'Use your own data',\n    menuLocal: 'On this computer ...',\n    menuUrl: 'Enter a URL ...',\n    menuSnapshotsExportAsJSON: 'Export as .snapshots JSON file',\n    menuSnapshotsExportAs: 'Export as ...',\n    menuSnapshotsImport: 'Import a .snapshots JSON file',\n    dialogTitleLocal: 'Use a file from your computer',\n    dialogSubtextLocal: 'Your file will not be uploaded, it is only used by the browser on this computer.  The currently supported data formats are json (the default), csv (comma-separated values), tsv (tab-separated values), and topojson.',\n    dialogTitleUrl: 'Use a data file via URL',\n    dialogTitleSnapshotsExport: 'Export as',\n    dialogTitleSnapshotsLocal: 'Use a snapshots file from your computer',\n    dialogSubtextSnapshotsLocal: 'Use a file that was previously exported snapshots file. Your file will not be uploaded, it is only used by the browser on this computer.',\n    dialogTitleSnapshotsUrl: 'Use a snapshots file via URL',\n    dialogLoadButton: 'Load',\n    labelLocal: '[local]',\n    labelColorFilter: 'Note: Colors will be re-mapped to the filter when viewing this saved chart.',\n    labelPreferences: 'Preferences',\n    labelCompactUI: 'Compact UI',\n    labelCompactUIDescription: 'Compact UI hides collapses labels on dropdown menus.',\n    labelSnapshotsExportHTMLTitle: 'HTML',\n    labelSnapshotsExportHTMLDescription: 'A self contained HTML page with current data and snapshots pre-loaded.',\n    labelSnapshotsExportMarkdownTitle: 'Markdown',\n    labelSnapshotsExportMarkdownDescription: 'Markdown is a language used by many blogging platforms. Exports a Markdown file with thumbnails of these snapshots which link back to the SandDance website.',\n    labelSnapshotsShortcut: 'Tip: Your .snapshots JSON file can also be pre-loaded with this',\n    labelShare: 'share',\n    labelLink: 'link',\n    labelLinkDescription: 'A URL to revive this snapshot.',\n    labelUrl: 'Url',\n    labelDataFormat: 'Data format',\n    labelDataUrlShortcut: 'Tip: Your data file can also be pre-loaded with this',\n    urlInputPlaceholder: 'paste URL',\n    sampleDataPrefix: 'Sample data',\n    localFilePrefix: 'Local file',\n    urlPrefix: 'Url',\n    errorInvalidFileFormat: 'Invalid file format',\n    errorNoUrl: 'Please enter a url',\n    errorUrlHttp: 'Url must begin with \"http\"',\n    errorDownloadFailure: 'Data could not be prepared for download.',\n    errorDataSourceFromLocal: (ds: DataSource) => `Could not load ${ds.type} from local file.`,\n    errorDataSourceFromUrl: (ds: DataSource) => `Could not load ${ds.type} from ${ds.dataUrl}`,\n};\n"
  },
  {
    "path": "packages/sanddance-app/src/sanddanceApp.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { base } from './base';\nimport { DataSourceButton, DataSourcePicker, Props as DataSourceProps } from './dataSourcePicker';\nimport { downloadData } from './download';\nimport { strings } from './language';\nimport {\n    downloadSnapshotsJSON,\n    serializeSnapshot,\n    SnapshotExport,\n    SnapshotImportLocal,\n    SnapshotImportRemote,\n    validSnapshots,\n} from './snapshots';\nimport { DataSource, DataSourceSnapshot, InsightMap } from './types';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport {\n    ColorSettings,\n    Explorer,\n    Explorer_Class,\n    getColorSettingsFromThemePalette,\n    Options,\n    SandDance,\n    SideTabId,\n    themePalettes,\n    ViewerOptions,\n} from '@msrvida/sanddance-explorer';\nimport * as React from 'react';\n\nexport interface Props {\n    themeColors: { [theme: string]: ColorSettings };\n    setTheme?: (darkTheme: boolean) => void;\n    darkTheme?: boolean;\n    dataSources: DataSource[];\n    mounted?: (app: SandDanceApp) => void;\n    insights?: InsightMap;\n    initialOptions?: { [dataSetId: string]: Options };\n}\n\nexport type Dialogs = 'import-local' | 'import-remote' | 'export';\n\nexport interface State {\n    compactUI: boolean;\n    dialogMode: Dialogs;\n    dataSource: DataSource;\n    darkTheme: boolean;\n}\n\nfunction getViewerOptions(darkTheme: boolean, themeColors: { [theme: string]: ColorSettings }) {\n    const colors = themeColors && themeColors[darkTheme ? 'dark' : 'light'];\n    const viewerOptions: Partial<ViewerOptions> = {\n        colors: {\n            ...getColorSettingsFromThemePalette(themePalettes[darkTheme ? 'dark-theme' : '']),\n            ...colors,\n        },\n    };\n    return viewerOptions;\n}\n\nfunction getSnapshotFromHash() {\n    const hash = document.location.hash && document.location.hash.substring(1);\n    if (hash) {\n        try {\n            return JSON.parse(decodeURIComponent(hash)) as DataSourceSnapshot;\n        }\n        catch (e) {\n            // continue regardless of error\n        }\n    }\n}\n\nlet snapshotOnLoad = getSnapshotFromHash();\nif (snapshotOnLoad && snapshotOnLoad.dataSource && snapshotOnLoad.dataSource.dataSourceType === 'local') {\n    snapshotOnLoad = null;\n}\n\ninterface Handlers {\n    hashchange: (e: HashChangeEvent) => void;\n    resize: (e: UIEvent) => void;\n}\n\nexport class SandDanceApp extends React.Component<Props, State> {\n    private viewerOptions: Partial<SandDance.types.ViewerOptions>;\n    private handlers: Handlers;\n    private dataSourcePicker: DataSourcePicker;\n    private postLoad: (dataSource: DataSource) => void;\n\n    public explorer: Explorer_Class;\n\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            compactUI: !!localStorage.getItem('compactUI'),\n            dialogMode: null,\n            dataSource: snapshotOnLoad && snapshotOnLoad.dataSource || props.dataSources[0],\n            darkTheme: props.darkTheme,\n        };\n        this.viewerOptions = getViewerOptions(this.state.darkTheme, props.themeColors);\n        this.handlers = {\n            hashchange: e => {\n                const snapshot = getSnapshotFromHash();\n                if (snapshot) {\n                    this.explorer && this.explorer.calculate(() => this.hydrateSnapshot(snapshot));\n                }\n            },\n            resize: e => {\n                this.explorer && this.explorer.resize();\n            },\n        };\n        this.wireEventHandlers(true);\n        this.changeColorScheme(this.state.darkTheme);\n    }\n\n    private wireEventHandlers(add: boolean) {\n        for (const key in this.handlers) {\n            if (add) {\n                window.addEventListener(key, this.handlers[key]);\n            } else {\n                window.removeEventListener(key, this.handlers[key]);\n            }\n        }\n    }\n\n    private isSameDataSource(a: DataSource, b: DataSource) {\n        if (a.dataSourceType === b.dataSourceType && a.type === b.type && a.id === b.id) {\n            if (a.dataSourceType === 'url') {\n                return a.dataUrl === b.dataUrl;\n            }\n            return true;\n        }\n        return false;\n    }\n\n    private hydrateSnapshot(snapshot: DataSourceSnapshot, selectedSnapshotIndex = -1) {\n        if (snapshot.dataSource) {\n            if (this.isSameDataSource(snapshot.dataSource, this.state.dataSource)) {\n                if (selectedSnapshotIndex === -1) {\n                    this.explorer.reviveSnapshot(snapshot);\n                } else {\n                    this.explorer.reviveSnapshot(selectedSnapshotIndex);\n                }\n                if (snapshot.dataSource.snapshotsUrl && snapshot.dataSource.snapshotsUrl !== this.state.dataSource.snapshotsUrl) {\n                    //load new snapshots url\n                    fetch(snapshot.dataSource.snapshotsUrl)\n                        .then(response => response.json())\n                        .then(snapshots => {\n                            if (validSnapshots(snapshots)) {\n                                this.explorer.setState({ snapshots });\n                                const dataSource = { ...this.state.dataSource };\n                                dataSource.snapshotsUrl = snapshot.dataSource.snapshotsUrl;\n                                this.setState({ dataSource });\n                            }\n                        });\n                }\n            } else {\n                if (snapshot.dataSource.dataSourceType === 'local') {\n                    this.dataSourcePicker.setState({ dialogMode: 'local' });\n                    this.postLoad = ds => {\n                        if (this.isSameDataSource(snapshot.dataSource, ds)) {\n                            this.hydrateSnapshot(snapshot, selectedSnapshotIndex);\n                            //} else {                            //local file does not match snapshot\n                        }\n                    };\n                } else {\n                    this.load(snapshot.dataSource, snapshot.insight).then(() => {\n                        this.explorer.setState({ sideTabId: SideTabId.Snapshots, note: snapshot.description });\n                        this.explorer.scrollSnapshotIntoView(selectedSnapshotIndex);\n                    }).catch(e => {\n                        this.loadError(snapshot.dataSource);\n                    });\n                }\n            }\n            return true;\n        }\n    }\n\n    load(dataSource: DataSource, partialInsight?: Partial<SandDance.specs.Insight>) {\n        //clone so that we do not modify original object\n        dataSource = SandDance.VegaMorphCharts.util.clone(dataSource);\n        this.setState({ dataSource });\n        document.title = `SandDance - ${dataSource.displayName}`;\n        return this.explorer.load(\n            dataSource,\n            columns => {\n                return partialInsight || (this.props.insights && this.props.insights[dataSource.id]);\n            },\n            this.props.initialOptions && SandDance.VegaMorphCharts.util.deepMerge({}, this.props.initialOptions['*'], this.props.initialOptions[dataSource.id]),\n        );\n    }\n\n    private dataSourceError(dataSource: DataSource) {\n        switch (dataSource.dataSourceType) {\n            case 'local':\n                return strings.errorDataSourceFromLocal(dataSource);\n            case 'sample':\n            case 'url':\n                return strings.errorDataSourceFromUrl(dataSource);\n        }\n    }\n\n    private loadError(dataSource: DataSource) {\n        const error = this.dataSourceError(dataSource);\n        this.explorer.setState({ errors: [error] });\n        this.setState({ dataSource: { dataSourceType: null, id: null, type: null } });\n    }\n\n    updateExplorerViewerOptions(viewerOptions: Partial<SandDance.types.ViewerOptions>) {\n        this.viewerOptions = viewerOptions;\n        this.explorer && this.explorer.updateViewerOptions(this.viewerOptions);\n    }\n\n    getThemePalette(darkTheme: boolean) {\n        const theme = darkTheme ? 'dark-theme' : '';\n        return themePalettes[theme];\n    }\n\n    changeColorScheme(darkTheme: boolean) {\n        this.updateExplorerViewerOptions(getViewerOptions(darkTheme, this.props.themeColors));\n        SandDance.VegaMorphCharts.base.vega.scheme(SandDance.constants.ColorScaleNone, x => this.explorer.viewer.options.colors.defaultCube);\n        this.explorer && this.explorer.viewer && this.explorer.viewer.renderSameLayout(this.viewerOptions);\n        base.fluentUI.loadTheme({ palette: this.getThemePalette(darkTheme) });\n    }\n\n    render() {\n        const theme = this.state.darkTheme ? 'dark-theme' : '';\n        const dataSourceProps: DataSourceProps = {\n            dataSource: this.state.dataSource,\n            dataSources: this.props.dataSources,\n            changeDataSource: (dataSource: DataSource) => {\n                document.location.hash = '';\n                return this.load(dataSource).then(() => {\n                    if (this.postLoad) {\n                        this.postLoad(dataSource);\n                        this.postLoad = null;\n                    }\n                }).catch(() => this.loadError(dataSource));\n            },\n        };\n        return (\n            <section className=\"sanddance-app\">\n                <Explorer\n                    logoClickTarget=\"_self\"\n                    logoClickUrl=\"/SandDance/\"\n                    theme={theme}\n                    snapshotProps={{\n                        modifySnapShot: (snapshot: DataSourceSnapshot) => {\n                            snapshot.dataSource = this.state.dataSource;\n                        },\n                        getTopActions: snapshots => {\n                            const items: FluentUITypes.IContextualMenuItem[] = [\n                                {\n                                    key: 'import',\n                                    text: strings.menuSnapshotsImport,\n                                    subMenuProps: {\n                                        items: [\n                                            {\n                                                key: 'import-local',\n                                                text: strings.menuLocal,\n                                                onClick: () => this.setState({ dialogMode: 'import-local' }),\n                                            },\n                                            {\n                                                key: 'import-remote',\n                                                text: strings.menuUrl,\n                                                onClick: () => this.setState({ dialogMode: 'import-remote' }),\n                                            },\n                                        ],\n                                    },\n                                },\n                                {\n                                    key: 'export',\n                                    text: strings.menuSnapshotsExportAsJSON,\n                                    disabled: snapshots.length === 0,\n                                    onClick: () => downloadSnapshotsJSON(snapshots, `${this.state.dataSource.displayName}.snapshots`),\n                                },\n                                {\n                                    key: 'export-as',\n                                    text: strings.menuSnapshotsExportAs,\n                                    disabled: snapshots.length === 0,\n                                    onClick: () => this.setState({ dialogMode: 'export' }),\n                                },\n                            ];\n                            return items;\n                        },\n                        getChildren: snapshots => (\n                            <div>\n                                {this.state.dialogMode === 'import-local' && (\n                                    <SnapshotImportLocal\n                                        theme={theme}\n                                        dataSource={this.state.dataSource}\n                                        onImportSnapshot={snapshots => this.explorer.setState({ snapshots })}\n                                        onDismiss={() => this.setState({ dialogMode: null })}\n                                    />\n                                )}\n                                {this.state.dialogMode === 'import-remote' && (\n                                    <SnapshotImportRemote\n                                        theme={theme}\n                                        dataSource={this.state.dataSource}\n                                        onImportSnapshot={snapshots => this.explorer.setState({ snapshots })}\n                                        onSnapshotsUrl={snapshotsUrl => {\n                                            const dataSource = { ...this.state.dataSource };\n                                            dataSource.snapshotsUrl = snapshotsUrl;\n                                            this.setState({ dataSource });\n                                        }}\n                                        onDismiss={() => this.setState({ dialogMode: null })}\n                                    />\n                                )}\n                                {this.state.dialogMode === 'export' && (\n                                    <SnapshotExport\n                                        explorer={this.explorer}\n                                        dataSource={this.state.dataSource}\n                                        snapshots={snapshots}\n                                        onDismiss={() => this.setState({ dialogMode: null })}\n                                        theme={theme}\n                                    />\n                                )}\n                            </div>\n                        ),\n\n                        getActions: (snapshot: DataSourceSnapshot, i) => {\n                            const url = '#' + serializeSnapshot(snapshot);\n                            let element: JSX.Element;\n                            if (snapshot.dataSource && snapshot.dataSource.dataSourceType === 'local') {\n                                element = (<span key={`link${i}`}>{strings.labelLocal}</span>);\n                            } else {\n                                element = (\n                                    <a\n                                        key={`link${i}`}\n                                        href={url}\n                                        title={strings.labelLinkDescription}\n                                        aria-label={strings.labelLinkDescription}\n                                    >{strings.labelShare}</a>\n                                );\n                            }\n                            return [{ element }];\n                        },\n                        getTitle: insight => `${this.state.dataSource.displayName} ${insight.chart}`,\n                        getDescription: insight => '', //TODO create description from filter etc.\n                    }}\n                    onSnapshotClick={(snapshot: DataSourceSnapshot, selectedSnapshotIndex) => this.hydrateSnapshot(snapshot, selectedSnapshotIndex)}\n                    initialView=\"2d\"\n                    mounted={e => {\n                        this.explorer = e;\n                        this.load(this.state.dataSource, snapshotOnLoad && snapshotOnLoad.insight).catch(e => {\n                            this.loadError(this.state.dataSource);\n                        });\n                        this.props.mounted(this);\n                    }}\n                    dataExportHandler={(data, datatype, displayName) => {\n                        try {\n                            downloadData(data, `${displayName}.${datatype}`);\n                        }\n                        catch (e) {\n                            this.explorer.setState({ errors: [strings.errorDownloadFailure] });\n                        }\n                    }}\n                    datasetElement={(\n                        <DataSourceButton\n                            getPicker={() => this.dataSourcePicker}\n                            {...dataSourceProps}\n                        />\n                    )}\n                    topBarButtonProps={[\n                        {\n                            key: 'theme',\n                            text: this.state.darkTheme ? strings.buttonThemeLight : strings.buttonThemeDark,\n                            iconProps: {\n                                iconName: this.state.darkTheme ? 'Sunny' : 'ClearNight',\n                            },\n                            onClick: () => {\n                                const darkTheme = !this.state.darkTheme;\n                                this.props.setTheme && this.props.setTheme(darkTheme);\n                                this.setState({ darkTheme });\n                                this.changeColorScheme(darkTheme);\n                            },\n                        },\n                    ]}\n                    viewerOptions={this.viewerOptions}\n                    compactUI={this.state.compactUI}\n                    additionalSettings={[\n                        {\n                            groupLabel: strings.labelPreferences,\n                            children: (\n                                <base.fluentUI.Toggle\n                                    label={strings.labelCompactUI}\n                                    title={strings.labelCompactUIDescription}\n                                    checked={this.state.compactUI}\n                                    onChange={(e, checked?) => {\n                                        if (checked) {\n                                            localStorage.setItem('compactUI', 'true');\n                                        } else {\n                                            localStorage.removeItem('compactUI');\n                                        }\n                                        this.setState({ compactUI: checked });\n                                    }}\n                                />\n                            ),\n                        },\n                    ]}\n                >\n                </Explorer>\n                <DataSourcePicker\n                    ref={dsp => { if (dsp && !this.dataSourcePicker) this.dataSourcePicker = dsp; }}\n                    theme={theme}\n                    {...dataSourceProps}\n                />\n            </section >\n        );\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-app/src/snapshots.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { base } from './base';\nimport { downloadData } from './download';\nimport { strings } from './language';\nimport { DataSource, DataSourceSnapshot } from './types';\nimport { invalidUrlError } from './url';\nimport {\n    controls,\n    Explorer_Class,\n    getEmbedHTML,\n    SandDance,\n} from '@msrvida/sanddance-explorer';\nimport * as React from 'react';\n\nimport util = SandDance.VegaMorphCharts.util;\n\nfunction markdownImageLink(alt: string, imageUrl: string, link: string) {\n    return `[![${alt}](${imageUrl})](${link})`;\n}\n\nexport function cleanSnapshots(snapshots: SandDance.types.Snapshot[]) {\n    //remove data sources from snapshots\n    const clean = util.clone(snapshots) as DataSourceSnapshot[];\n    clean.forEach(snapshot => {\n        if (snapshot.dataSource) {\n            delete snapshot.dataSource.snapshotsUrl;\n        }\n    });\n    return clean as SandDance.types.Snapshot[];\n}\n\nexport function downloadSnapshotsJSON(snapshots: SandDance.types.Snapshot[], filename: string) {\n    //clean prior to exporting\n    const clean = cleanSnapshots(snapshots);\n    downloadData(JSON.stringify(clean, null, 2), filename);\n}\n\nexport function serializeSnapshot(snapshotWithImage: SandDance.types.Snapshot) {\n    const snapshot = util.clone(snapshotWithImage) as DataSourceSnapshot;\n    //remove the image data from the snapshot\n    delete snapshot.bgColor;\n    delete snapshot.image;\n    if (snapshot.dataSource) {\n        delete snapshot.dataSource.rawText;\n    }\n    return JSON.stringify(snapshot);\n}\n\nfunction isSnapshot(snapshot: SandDance.types.Snapshot) {\n    return snapshot.insight && snapshot.title;\n}\n\nexport function validSnapshots(snapshots: SandDance.types.Snapshot[]) {\n    if (Array.isArray(snapshots)) {\n        for (let i = 0; i < snapshots.length; i++) {\n            if (!isSnapshot(snapshots[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n}\n\nexport interface ImportProps {\n    theme: string;\n    onDismiss: () => void;\n    onImportSnapshot: (snapshots: SandDance.types.Snapshot[]) => void;\n    dataSource: DataSource;\n}\n\nexport interface ImportState {\n    working: boolean;\n    fileFormatError?: string;\n}\n\nexport class SnapshotImportLocal extends React.Component<ImportProps, ImportState> {\n\n    constructor(props: ImportProps) {\n        super(props);\n        this.state = {\n            working: false,\n        };\n    }\n\n    readFile(e: React.ChangeEvent<HTMLInputElement>) {\n        if (e.target.files) {\n            this.setState({ working: true });\n            const file = e.target.files[0];\n            const reader = new FileReader();\n            reader.onload = () => {\n                const rawText = reader.result as string;\n                let snapshots: SandDance.types.Snapshot[];\n                try {\n                    snapshots = JSON.parse(rawText);\n                }\n                catch (e) {\n                    this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n                }\n                //validate these are snapshots\n                if (validSnapshots(snapshots)) {\n                    this.props.onImportSnapshot(snapshots);\n                    this.setState({ working: false });\n                    this.props.onDismiss();\n                } else {\n                    this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n                }\n            };\n            reader.readAsText(file);\n        }\n    }\n\n    render() {\n        return (\n            <div>\n                <controls.Dialog\n                    hidden={false}\n                    onDismiss={this.props.onDismiss}\n                    dialogContentProps={{\n                        className: `sanddance-dialog ${this.props.theme}`,\n                        type: base.fluentUI.DialogType.normal,\n                        title: strings.dialogTitleSnapshotsLocal,\n                        subText: strings.dialogSubtextSnapshotsLocal,\n                    }}\n                >\n                    <section>\n                        <input\n                            type=\"file\"\n                            onChange={e => this.readFile(e)}\n                            disabled={this.state.working}\n                        />\n                        {this.state.fileFormatError && (\n                            <div className=\"error\">{this.state.fileFormatError}</div>\n                        )}\n                    </section>\n                </controls.Dialog>\n            </div>\n        );\n    }\n}\n\nexport interface ImportRemoteProps extends ImportProps {\n    onSnapshotsUrl: (snapshotsUrl: string) => void;\n}\n\nexport interface ImportRemoteState extends ImportState {\n    url?: string;\n    urlError?: string;\n}\n\nexport class SnapshotImportRemote extends React.Component<ImportRemoteProps, ImportRemoteState> {\n\n    constructor(props: ImportRemoteProps) {\n        super(props);\n        this.state = {\n            working: false,\n        };\n    }\n\n    getUrlShortcut() {\n        const dataSource = util.clone(this.props.dataSource);\n        delete dataSource.snapshots;\n        dataSource.snapshotsUrl = this.state.url;\n        const dss: DataSourceSnapshot = {\n            dataSource,\n        };\n        return '#' + JSON.stringify(dss);\n    }\n\n    loadUrl() {\n        const urlError = invalidUrlError(this.state.url);\n        if (urlError) {\n            return this.setState({ urlError });\n        }\n        const { url } = this.state;\n        fetch(url)\n            .then(response => {\n                if (response.status === 200) {\n                    return response.json();\n                } else {\n                    this.setState({ urlError: response.statusText });\n                }\n            })\n            .then(snapshots => {\n                if (validSnapshots(snapshots)) {\n                    this.props.onImportSnapshot(snapshots);\n                    this.props.onSnapshotsUrl(url);\n                    this.setState({ working: false });\n                    this.props.onDismiss();\n                } else {\n                    this.setState({ fileFormatError: strings.errorInvalidFileFormat, working: false });\n                }\n            })\n            .catch(e => {\n                this.setState({ urlError: e });\n            });\n    }\n\n    render() {\n        let shortcut: string;\n        if (this.props.dataSource.dataSourceType !== 'local' && this.state.url && !invalidUrlError(this.state.url) && !this.state.urlError) {\n            shortcut = this.getUrlShortcut();\n        }\n        return (\n            <div>\n                <controls.Dialog\n                    hidden={false}\n                    onDismiss={this.props.onDismiss}\n                    dialogContentProps={{\n                        className: `sanddance-dialog ${this.props.theme}`,\n                        type: base.fluentUI.DialogType.normal,\n                        title: strings.dialogTitleSnapshotsUrl,\n                    }}\n                    buttons={[\n                        (\n                            <base.fluentUI.PrimaryButton\n                                disabled={!this.state.url || !!this.state.urlError}\n                                key={0}\n                                onClick={e => this.loadUrl()}\n                                iconProps={{ iconName: 'CloudDownload' }}\n                                text={strings.dialogLoadButton}\n                            />\n                        ),\n                    ]}\n                >\n                    <section>\n                        <base.fluentUI.TextField\n                            label={strings.labelUrl}\n                            placeholder={strings.urlInputPlaceholder}\n                            onKeyUp={e => e.keyCode === 13 && this.loadUrl()}\n                            onChange={(e, url) =>\n                                this.setState({ url, urlError: '' })\n                            }\n                            value={this.state.url}\n                            disabled={this.state.working}\n                        />\n                        {this.state.urlError && (\n                            <div className=\"error\">{this.state.urlError}</div>\n                        )}\n                    </section>\n                    {this.props.dataSource.dataSourceType !== 'local'\n                        && (\n                            <section className='tip' style={{ visibility: !invalidUrlError(this.state.url) && !this.state.urlError ? 'visible' : 'hidden' }} >\n                                {strings.labelSnapshotsShortcut} <a\n                                    href={shortcut}\n                                    title={strings.labelLinkDescription}\n                                    aria-label={strings.labelLinkDescription}\n                                >{strings.labelShare}</a>\n                            </section>\n                        )\n                    }\n                </controls.Dialog>\n            </div>\n        );\n    }\n}\n\nexport interface ExportProps {\n    explorer: Explorer_Class;\n    onDismiss: () => void;\n    dataSource: DataSource;\n    snapshots: SandDance.types.Snapshot[];\n    theme: string;\n}\n\nexport function SnapshotExport(props: ExportProps) {\n    return (\n        <controls.Dialog\n            hidden={false}\n            onDismiss={props.onDismiss}\n            dialogContentProps={{\n                className: `sanddance-dialog ${props.theme} sanddance-export`,\n                type: base.fluentUI.DialogType.normal,\n                title: strings.dialogTitleSnapshotsExport,\n            }}\n        >\n            <ul>\n                <li>\n                    <strong>{strings.labelSnapshotsExportHTMLTitle}</strong>\n                    <div>\n                        {strings.labelSnapshotsExportHTMLDescription}\n                    </div>\n                    <base.fluentUI.PrimaryButton\n                        iconProps={{ iconName: 'Download' }}\n                        text={`${strings.buttonExport} ${strings.labelSnapshotsExportHTMLTitle}`}\n                        onClick={e => {\n                            const clean = cleanSnapshots(props.snapshots);\n                            const html = getEmbedHTML(props.explorer.state.dataContent.data, props.dataSource.displayName, clean);\n                            downloadData(html, `${props.dataSource.displayName}.html`);\n                        }}\n                    />\n                </li>\n                <li>\n                    <strong>{strings.labelSnapshotsExportMarkdownTitle}</strong>\n                    <div>\n                        {strings.labelSnapshotsExportMarkdownDescription}\n                    </div>\n                    <base.fluentUI.PrimaryButton\n                        iconProps={{ iconName: 'Download' }}\n                        text={`${strings.buttonExport} ${strings.labelSnapshotsExportMarkdownTitle}`}\n                        onClick={e => {\n                            const sections = props.snapshots.map(snapshot => {\n                                const section = [`## ${snapshot.title}`];\n                                section.push(snapshot.description);\n                                section.push('\\n');\n                                const url = `${location.origin}/#${encodeURIComponent(serializeSnapshot(snapshot))}`;\n                                section.push(markdownImageLink(snapshot.title, snapshot.image, url));\n                                return section.join('\\n');\n                            });\n                            sections.unshift(`# ${props.dataSource.displayName}`);\n                            downloadData(sections.join('\\n\\n'), `${props.dataSource.displayName}.snapshots.md`);\n                        }}\n                    />\n                </li>\n            </ul>\n        </controls.Dialog>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-app/src/types.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { DataFile, SandDance } from '@msrvida/sanddance-explorer';\n\nexport type DataSourceType = 'sample' | 'local' | 'url';\n\nexport interface DataSource extends DataFile {\n  dataSourceType: DataSourceType;\n  id: string;\n}\n\nexport interface InsightMap {\n  [id: string]: SandDance.specs.Insight;\n}\n\nexport interface DataSourceSnapshot extends SandDance.types.Snapshot {\n  dataSource: DataSource;\n}\n"
  },
  {
    "path": "packages/sanddance-app/src/url.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { strings } from './language';\n\nexport function invalidUrlError(url: string) {\n    if (!url) {\n        return strings.errorNoUrl;\n    }\n    if (url.toLocaleLowerCase().substr(0, 4) !== 'http') {\n        return strings.errorUrlHttp;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-app/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"jsx\": \"react\",\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/sanddance-app/vite.config.js",
    "content": "import { defineConfig } from 'vite';\nimport { resolve } from 'path';\n\nexport default defineConfig({\n    define: {\n        'process.env': process.env,\n    },\n    build: {\n        lib: {\n            entry: resolve(__dirname, 'dist/es6/index.js'),\n            name: 'SandDanceApp',\n            formats: ['umd'],\n            fileName: () => 'sanddance-app.js',\n        },\n        outDir: 'dist/umd',\n        emptyOutDir: true,\n        sourcemap: false,\n        minify: false,\n        rollupOptions: {\n            external: ['react', 'react-dom'],\n            output: {\n                globals: {\n                    'react': 'React',\n                    'react-dom': 'ReactDOM',\n                },\n            },\n        },\n    },\n});\n"
  },
  {
    "path": "packages/sanddance-app/vite.dev.config.js",
    "content": "import { defineConfig } from 'vite';\nimport { resolve } from 'path';\n\nexport default defineConfig({\n    publicDir: resolve(__dirname, '../../docs'),\n    server: {\n        open: true,\n    },\n});\n"
  },
  {
    "path": "packages/sanddance-embed/.gitignore",
    "content": "dist\nscripts/gen.js\n"
  },
  {
    "path": "packages/sanddance-embed/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/sanddance-embed/README.md",
    "content": "# @msrvida/sanddance-embed\n\nSandDance Embed is the easiest way to integrate [SandDance](https://microsoft.github.io/SandDance/) into your custom app, via an `<iframe>` tag. SandDance Embed is a wrapper around SandDance Explorer, plus [postMessage](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) handlers to load data and manage its display from outside the iframe.\n\n![image](https://user-images.githubusercontent.com/11507384/72197128-a99cdd80-33d2-11ea-9b49-5d470db0abc1.png)\n\n## Development considerations\nSandDance-Embed is an alternative to creating your own app wrapper around SandDance Explorer. Here are reasons you might choose one over the other:\n\n* *SandDance Explorer* will require an `npm install` and your own build / deployment system. You will be bound to use only compatible React versions. You will have greater control over events and injectable React sub-componentry.\n\n* *SandDance Embed* does not require an install or build system. Launch time might be slower as loads its own copy of React and other libraries at runtime. It runs in a sandbox mode which allows little customization.\n\n## Deployment scenarios\nThere are two ways to create a SandDance Embed iframe instance:\n1. Cross-domain\n2. In-domain\n\n## Cross-domain iframe\nThis is the simplest approach. Add an `<iframe>` tag in your HTML page:\n```html\n<iframe id=\"embedIframe\" src=\"https://microsoft.github.io/SandDance/embed/v4/sanddance-embed.html\" style=\"height:700px;width:100%\"></iframe>\n```\n\nGet a code reference to this iframe:\n```js\nconst embedIframe = document.getElementById('embedIframe');\nembedIframe.onload = () => {\n    //ready to send commands to SandDance Embed\n}\n```\n\n*Note the version number in the address to specify by major version. You may style the iframe as you see fit.*\n\n*Security: The URL is hosted by the secure [SandDance GitHub Pages website](https://github.com/microsoft/SandDance/tree/master/docs/embed).*\n\n*Privacy: The page does not collect any data that you pass to SandDance Embed.*\n\n## In-domain iframe\nIn your own website you can either [download a copy of the sanddance-embed.html file](https://microsoft.github.io/SandDance/embed/v4/sanddance-embed.html) and use it as above, or create an iframe dynamically.\n\n*Note the static html file approach will provide better performance, by utilizing the browser's built-in caching mechanisms to load scripts.*\n\nTo dynamically create a SandDance Embed iframe in JavaScript:\n```js\n    const embedPromise = new Promise((resolve, reject) => {\n        const embedIframe = document.createElement('iframe');\n        embedIframe.style.height = '700px';\n        embedIframe.style.width = '1000px'\n        embedIframe.onload = () => {\n            const embedScript = embedIframe.contentDocument.createElement('script');\n            embedScript.src = 'https://unpkg.com/@msrvida/sanddance-embed@4/dist/umd/sanddance-embed.js';\n            embedIframe.contentDocument.head.appendChild(embedScript);\n            embedScript.onload = () => resolve(embedIframe);\n            embedScript.onerror = reject;\n        };\n        document.body.appendChild(embedIframe);\n    });\n```\nThis promise provides you `embedIframe` when it is available:\n```js\n    embedPromise.then((embedIframe) => {\n        //ready to send commands to SandDance Embed\n    });\n```\n\n## Send commands to SandDance Embed\nUse `postMessage` to communicate with `embedIframe.contentWindow`. For all command requests, see https://github.com/microsoft/SandDance/blob/master/packages/sanddance-embed/src/types/message-request.d.ts\n\n* Use the [load command](https://microsoft.github.io/SandDance/docs/sanddance-embed/v4/interfaces/types_message_request.MessageRequest_Load.html) to load data and display initial chart:\n    ```js\n    const data = [\n        { x: 0, y: 0, z: 0 },\n        { x: 1, y: 1, z: 1 },\n        { x: 2, y: 2, z: 2 },\n    ];\n    embedIframe.contentWindow.postMessage({ action: 'load', data }, '*');\n    ```\n    \n    The `data` variable can be an array, or a [DataFile object](https://microsoft.github.io/SandDance/docs/sanddance-explorer/v4/interfaces/DataFile.html). \n    \n    Notable optional parameters:\n\n    * The `props` member, of type [Explorer Props](https://microsoft.github.io/SandDance/docs/sanddance-explorer/v4/interfaces/Props.html), here is shown used to specify the dark color theme, initially close the sidebar, and use the advanced renderer: \n    ```js\n    const props = { theme: 'dark-theme', initialSidebarClosed: true, initialRenderer: { advanced: true } };\n    embedIframe.contentWindow.postMessage({ action: 'load', data, props }, '*');\n    ```\n\n    *Note that the `props` member is for initializing the instance of SandDance Explorer. A new dataset can be loaded with a subsequent load command, but `props` will be not be used.*\n\n\n    * The `insight` member, of type [Insight](https://github.com/microsoft/SandDance/blob/main/packages/sanddance-specs/src/insight.ts), to specify a chart view: \n    ```js\n    const insight = {\n        chart: 'barchartH',\n        columns: {\n            y: 'Age',\n            z: 'TicketCost',\n            color: 'Class'\n        },\n        scheme: 'category10',\n        view: '3d',\n    };\n    embedIframe.contentWindow.postMessage({ action: 'load', data, insight }, '*');\n    ```\n\n* The [getInsight command](https://microsoft.github.io/SandDance/docs/sanddance-embed/v4/interfaces/types_message_request.MessageRequest_GetInsight.html) will request the current insight:\n    ```js\n    embedIframe.contentWindow.postMessage({ action: 'getInsight' }, '*');\n    ```\n\n* The [theme command](https://microsoft.github.io/SandDance/docs/sanddance-embed/v4/interfaces/types_message_request.MessageRequest_Theme.html) will get or set the theme:\n    ```js\n    embedIframe.contentWindow.postMessage({ action: 'theme', dark: true }, '*');\n    ```\n\n## Receive commands from SandDance Embed\nAttach a listener to your own window to observe message passing:\n```js\n    window.onmessage = (e) => {\n        console.log('messaged', e.data);\n    };\n```\nThe message will contain a property `request` which is a clone of the requesting message object which instigated the response. Other properties vary depending on the type of request. For all command responses, see https://github.com/microsoft/SandDance/blob/master/packages/sanddance-embed/src/types/message-response.d.ts\n\n Here is an example of the response for `getInsight`:\n```json\n{\n    \"request\": {\n        \"action\": \"getInsight\"\n    },\n    \"insight\": {\n        \"colorBin\": null,\n        \"columns\": {\n            \"x\": \"x\",\n            \"y\": \"y\"\n        },\n        \"facetStyle\": \"wrap\",\n        \"filter\": null,\n        \"hideAxes\": false,\n        \"hideLegend\": false,\n        \"signalValues\": {\n            \"RoleZ_ProportionSignal\": 0.6,\n            \"Text_ScaleSignal\": 1.2,\n            \"RoleColor_BinCountSignal\": 7,\n            \"RoleColor_ReverseSignal\": false,\n            \"Chart_PointScaleSignal\": 5,\n            \"RoleZ_Grounded\": false\n        },\n        \"size\": {\n            \"height\": 663,\n            \"width\": 700\n        },\n        \"totalStyle\": null,\n        \"transform\": null,\n        \"chart\": \"scatterplot\",\n        \"view\": \"2d\"\n    }\n}\n```\n\n## For more information\nPlease visit the [SandDance website](https://microsoft.github.io/SandDance/).\n"
  },
  {
    "path": "packages/sanddance-embed/package.json",
    "content": "{\n  \"name\": \"@msrvida/sanddance-embed\",\n  \"version\": \"4.5.0\",\n  \"description\": \"Embeddable SandDance Explorer.\",\n  \"browser\": \"dist/umd/sanddance-embed.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/sanddance-embed\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"gen\": \"node ./scripts/gen.js\",\n    \"build-css\": \"sass ./src/css/sanddance-embed.scss ./dist/css/sanddance-embed.css\",\n    \"build-typescript\": \"tsc -p .\",\n    \"build-gen\": \"tsc -p ./src/gen\",\n    \"build:07\": \"npm run build-css && npm run build-typescript\"\n  },\n  \"dependencies\": {\n    \"@msrvida/sanddance-explorer\": \"^4\"\n  },\n  \"author\": \"Dan Marshall\",\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/sanddance-embed/src/css/sanddance-embed.scss",
    "content": "html,\nbody {\n    height: 100%;\n    margin: 0;\n}\n\nbody {\n    font-family: 'Segoe UI', sans-serif;\n    display: grid;\n}\n"
  },
  {
    "path": "packages/sanddance-embed/src/deps.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nnamespace SandDanceEmbed {\n\n    export function defaultDependencies(localDev = false, static = false, minified = true) {\n        const deps: EmbedDependency[] = [\n            {\n                type: 'stylesheet',\n                url: `${localDev\n                    ? '../../../sanddance-explorer'\n                    : 'https://unpkg.com/@msrvida/sanddance-explorer@4'\n                }/dist/css/sanddance-explorer.css`,\n            },\n            {\n                type: 'stylesheet',\n                url: `${localDev\n                    ? '../..'\n                    : 'https://unpkg.com/@msrvida/sanddance-embed@4'\n                }/dist/css/sanddance-embed.css`,\n            },\n            {\n                type: 'script',\n                url: `${localDev\n                    ? '../../../../node_modules/react'\n                    : 'https://unpkg.com/react@17'\n                }/umd/react.${minified ? 'production.min' : 'development'}.js`,\n            },\n            {\n                type: 'script',\n                url: `${localDev\n                    ? '../../../../node_modules/react-dom'\n                    : 'https://unpkg.com/react-dom@17'\n                }/umd/react-dom.${minified ? 'production.min' : 'development'}.js`,\n            },\n            {\n                type: 'script',\n                url: `${localDev\n                    ? '../../../../node_modules/vega'\n                    : 'https://unpkg.com/vega@6.2'\n                }/build/vega${minified ? '.min' : ''}.js`,\n            },\n            {\n                type: 'script',\n                url: `${localDev\n                    ? '../../../../node_modules/@fluentui/react'\n                    : 'https://unpkg.com/@fluentui/react@8'\n                }/dist/fluentui-react.js`,\n            },\n            {\n                type: 'script',\n                url: `${localDev\n                    ? '../../../fluentui-icons'\n                    : 'https://unpkg.com/@msrvida/fluentui-icons@1'\n                }/dist/umd/fluentui-icons.js`,\n            },\n            {\n                type: 'script',\n                url: `${localDev\n                    ? '../../../sanddance-explorer'\n                    : 'https://unpkg.com/@msrvida/sanddance-explorer@4'\n                }/dist/umd/sanddance-explorer.js`,\n            },\n        ];\n        if (static) {\n            deps.push(\n                {\n                    type: 'script',\n                    url: `${localDev\n                        ? '../..'\n                        : 'https://unpkg.com/@msrvida/sanddance-embed@4'\n                    }/dist/umd/sanddance-embed.js`,\n                },\n            );\n        }\n        return deps;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-embed/src/gen/gen.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nconst fs = require('fs');\nconst { defaultDependencies } = SandDanceEmbed;\n\nfunction getHTML(localDev: boolean, extra: string = '') {\n    return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n${defaultDependencies(localDev, true)\n        .filter(d => d.type === 'stylesheet')\n        .map(d => {\n            return `    <link rel=\"stylesheet\" type=\"text/css\" href=\"${d.url}\" />`;\n        })\n        .join('\\n')\n}\n</head>\n<body>\n${defaultDependencies(localDev, true)\n        .filter(d => d.type === 'script')\n        .map(d => {\n            return `    <script src=\"${d.url}\"></script>`;\n        })\n        .join('\\n')\n}\n${extra}</body>\n</html>`;\n}\n\nfunction writeHTML(relPath: string, localDev: boolean, extra?: string) {\n    const fullPath = `${__dirname}/${relPath}`;\n    console.log(`writing html to ${fullPath}`);\n    fs.writeFileSync(fullPath, getHTML(localDev, extra));\n    console.log(`wrote html to ${fullPath}`);\n}\n\n//local standalone\nconst data = [\n    { x: 0, y: 0, z: 0 },\n    { x: 1, y: 1, z: 1 },\n    { x: 2, y: 2, z: 2 },\n];\nwriteHTML('../test/standalone/test.html', true, `<script>\\nconst data = ${JSON.stringify(data, null, 4)};\\nSandDanceEmbed.load(data);\\n</script>\\n`);\n\n//local static\nwriteHTML('../test/static-deps/target.html', true);\n\n//prod static\nwriteHTML('../../../docs/embed/v4/sanddance-embed.html', false, '    <!--EMBED-->\\n');\n"
  },
  {
    "path": "packages/sanddance-embed/src/gen/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"lib\": [\n            \"dom\",\n            \"es2015\"\n        ],\n        \"skipLibCheck\": true,\n        \"outFile\": \"../../scripts/gen.js\"\n    },\n    \"include\": [\n        \"../types\",\n        \"../deps.ts\",\n        \"gen.ts\"\n    ]\n}"
  },
  {
    "path": "packages/sanddance-embed/src/prepare.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nnamespace SandDanceEmbed {\n\n    export let deps: EmbedDependency[];\n\n    export let localDev: boolean;\n    export let static: boolean;\n    export let minified: boolean;\n\n    function getUnloadedDeps(depType: EmbedDependencyType, tagType: string, tagAttr: string) {\n        const depsToLoad = deps.filter(dep => dep.type === depType);\n        const elements = [\n            ...Array.from(document.head.querySelectorAll(tagType)),\n            ...Array.from(document.body.querySelectorAll(tagType)),\n        ];\n        depsToLoad.forEach(dep => {\n            const element = elements.find(element => element.attributes[tagAttr]?.nodeValue === dep.url);\n            if (element) {\n                dep.existed = true;\n                dep.loaded = true;\n            }\n        });\n        return depsToLoad.filter(dep => !dep.loaded);\n    }\n\n    function loadStyleSheets() {\n        const promises: Promise<void>[] = [];\n        const deps = getUnloadedDeps('stylesheet', 'link', 'href');\n        deps.forEach(dep => {\n            promises.push(new Promise<void>((resolve, reject) => {\n                const el = document.createElement('link');\n                el.rel = 'stylesheet';\n                el.type = 'text/css';\n                el.href = dep.url;\n                el.onload = () => {\n                    dep.loaded = true;\n                    resolve();\n                };\n                document.head.appendChild(el);\n            }));\n        });\n        return promises;\n    }\n\n    function loadScripts() {\n        const deps = getUnloadedDeps('script', 'script', 'src');\n        const promise = new Promise<void>((resolve, reject) => {\n            const next = (index: number) => {\n                if (index >= deps.length) {\n                    resolve();\n                } else {\n                    const dep = deps[index];\n                    const el = document.createElement('script');\n                    el.src = dep.url;\n                    el.onload = () => {\n                        dep.loaded = true;\n                        next(++index);\n                    };\n                    document.head.appendChild(el);\n                }\n            };\n            next(0);\n        });\n        return [promise];\n    }\n\n    export const prepare = new Promise<void>((resolve, reject) => {\n        deps = defaultDependencies(localDev, static, minified);\n        Promise.all([...loadStyleSheets(), ...loadScripts()]).then(() => resolve());\n    });\n\n}\n"
  },
  {
    "path": "packages/sanddance-embed/src/sanddance-embed.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nnamespace SandDanceEmbed {\n\n    declare let vega: SandDanceExplorer.SandDance.VegaMorphCharts.types.VegaBase;\n    declare let FluentUIReact: _FluentUI.FluentUIComponents;\n    declare let FluentUIIcons: _FluentUIIcons.FluentUIIconsBase;\n\n    interface DataWithInsight {\n        data: DataToLoad;\n        insight: Partial<SandDanceExplorer.SandDance.specs.Insight>;\n    }\n\n    export let sandDanceExplorer: SandDanceExplorer.Explorer_Class;\n    export const requests: MessageRequestWithSource[] = [];\n    let creating = false;\n    let innerLoad: () => void;\n\n    export function load(\n        data: DataToLoad,\n        insight?: Partial<SandDanceExplorer.SandDance.specs.Insight>,\n        props?: SandDanceExplorer.Props,\n        options?: SandDanceExplorer.Options,\n    ) {\n        return new Promise((resolve) => {\n\n            innerLoad = () => {\n                let getPartialInsight: (columns: SandDanceExplorer.SandDance.types.Column[]) => Partial<SandDanceExplorer.SandDance.specs.Insight>;\n                if (insight) {\n                    //TODO make sure that insight columns exist in dataset\n                    getPartialInsight = columns => insight;\n                }\n                sandDanceExplorer.load(data, getPartialInsight, options).then(resolve);\n            };\n\n            const create = () => {\n                creating = true;\n                prepare.then(() => {\n                    if (typeof FluentUIIcons !== 'undefined' && FluentUIIcons) {\n                        FluentUIIcons.use(FluentUIReact.registerIcons, FluentUIReact.unregisterIcons);\n                        FluentUIIcons.initializeIcons();\n                    }\n                    SandDanceExplorer.use(FluentUIReact, React, ReactDOM, vega);\n\n                    const theme = props?.theme || '';\n                    if (theme) {\n                        FluentUIReact.loadTheme({ palette: SandDanceExplorer.themePalettes[theme] });\n                    }\n                    const viewerOptions = getViewerOptions(theme, props?.viewerOptions);\n\n                    const explorerProps: SandDanceExplorer.Props = {\n                        logoClickUrl: 'https://microsoft.github.io/SandDance/',\n                        ...props,\n                        mounted: explorer => {\n                            sandDanceExplorer = explorer;\n                            creating = false;\n                            innerLoad();\n                            props?.mounted && props.mounted(explorer);\n                        },\n                        viewerOptions,\n                    };\n                    ReactDOM.render(React.createElement(SandDanceExplorer.Explorer, explorerProps), document.body);\n                });\n            };\n\n            if (sandDanceExplorer) {\n                innerLoad();\n            } else if (!creating) {\n                create();\n            }\n        });\n    }\n\n    function getViewerOptions(theme: string, viewerOptions: Partial<SandDanceExplorer.SandDance.types.ViewerOptions>): Partial<SandDanceExplorer.ViewerOptions> {\n        return {\n            ...viewerOptions,\n            colors: SandDanceExplorer.getColorSettingsFromThemePalette(SandDanceExplorer.themePalettes[theme]),\n            onError: (errors) => {\n                const response: MessageResponse_EventError = {\n                    request: null,\n                    errors,\n                };\n                lastRequestWithSource?.source.postMessage(response, '*');\n            },\n            onCanvasClick: (e) => {\n                const request: MessageRequest_EventCanvasClick = {\n                    action: 'eventCanvasClick',\n                };\n                const response: MessageResponse_EventCanvasClick = {\n                    request,\n                    event: safeSerialize(e),\n                };\n                lastRequestWithSource?.source.postMessage(response, '*');\n            },\n            onCubeClick: (e, cube) => {\n                const request: MessageRequest_EventCubeClick = {\n                    action: 'eventCubeClick',\n                };\n                const response: MessageResponse_EventCubeClick = {\n                    request,\n                    event: safeSerialize(e),\n                    ordinal: cube.ordinal,\n                };\n                lastRequestWithSource?.source.postMessage(response, '*');\n            },\n        };\n    }\n\n    function safeSerialize<T>(input: T) {\n        const output = {} as T;\n        for (const key in input) {\n            const value = input[key];\n            switch (typeof value) {\n                case 'undefined':\n                case 'number':\n                case 'boolean':\n                case 'string':\n                    output[key] = value;\n            }\n        }\n        return output;\n    }\n\n    export function changeColorScheme(darkTheme: boolean) {\n        const theme = darkTheme ? 'dark-theme' : '';\n        FluentUIReact.loadTheme({ palette: SandDanceExplorer.themePalettes[theme] });\n\n        const viewerOptions = getViewerOptions(theme, sandDanceExplorer.viewerOptions);\n        vega.scheme(SandDanceExplorer.SandDance.constants.ColorScaleNone, () => viewerOptions.colors.defaultCube);\n\n        sandDanceExplorer.updateViewerOptions(viewerOptions);\n        sandDanceExplorer.viewer.renderSameLayout(viewerOptions);\n        const props: SandDanceExplorer.Props = { ...sandDanceExplorer.props, theme, viewerOptions };\n        ReactDOM.render(React.createElement(SandDanceExplorer.Explorer, props), document.body);\n    }\n\n    export let lastRequestWithSource: MessageRequestWithSource;\n\n    export function respondToRequest(requestWithSource: MessageRequestWithSource) {\n        lastRequestWithSource = requestWithSource;\n        requests.push(requestWithSource);\n        const copy: MessageRequestWithSource = { ...requestWithSource };\n        delete copy.source;\n        const request: MessageRequest = { ...copy };\n        let response: MessageResponse;\n        switch (request.action) {\n            case 'init': {\n                response = {\n                    request,\n                };\n                break;\n            }\n            case 'load': {\n                const request_load = request as MessageRequest_Load;\n                load(\n                    request_load.data,\n                    request_load.insight,\n                    request_load.props,\n                    request_load.options,\n                ).then(() => {\n                    response = {\n                        request,\n                    };\n                    requestWithSource.source.postMessage(response, '*');\n                });\n                //don't keep a copy of the array\n                delete request_load.data;\n                break;\n            }\n            case 'getData': {\n                response = <MessageResponse_GetData>{\n                    request,\n                    data: sandDanceExplorer.state.dataContent.data,\n                };\n                break;\n            }\n            case 'getInsight': {\n                response = <MessageResponse_GetInsight>{\n                    request,\n                    insight: sandDanceExplorer.getInsight(),\n                };\n                break;\n            }\n            case 'getSetup': {\n                const setup: SandDanceExplorer.SandDance.types.Setup = sandDanceExplorer.getSetup();\n                setup.camera = sandDanceExplorer.viewer.getCamera();\n                response = <MessageResponse_GetSetup>{\n                    request,\n                    setup,\n                };\n                break;\n            }\n            case 'theme': {\n                const request_theme = request as MessageRequest_Theme;\n                if (request_theme.dark !== undefined) {\n                    changeColorScheme(request_theme.dark);\n                }\n                response = <MessageResponse_Theme>{\n                    request,\n                    theme: sandDanceExplorer.props.theme,\n                };\n            }\n        }\n        prepare.then(() => {\n            if (response) {\n                requestWithSource.source.postMessage(response, '*');\n            }\n        });\n    }\n\n    window.addEventListener('message', e => {\n        let payload: object[] | DataWithInsight | MessageRequest = e.data;\n        if (!payload) return;\n        if (Array.isArray(payload)) {\n            const data = payload;\n            const requestLoadFromArray: MessageRequest_Load = {\n                action: 'load',\n                data,\n                insight: null,\n            };\n            payload = requestLoadFromArray;\n        } else {\n            const dataWithInsight = payload as DataWithInsight;\n            if (Array.isArray(dataWithInsight.data)) {\n                const requestLoadFromDataWithInsight: MessageRequest_Load = {\n                    action: 'load',\n                    ...dataWithInsight,\n                };\n                payload = requestLoadFromDataWithInsight;\n            }\n        }\n        const request = payload as MessageRequest;\n        if (!request) return;\n        const requestWithSource = { ...request, source: e.source as WindowProxy };\n        respondToRequest(requestWithSource);\n    });\n\n    if (window.opener) {\n        const request: MessageRequest_Init = {\n            action: 'init',\n            ts: new Date(),\n        };\n        respondToRequest({ ...request, source: window.opener });\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-embed/src/types/deps.d.ts",
    "content": "type EmbedDependencyType = 'script' | 'stylesheet';\n\ninterface EmbedDependency {\n    url: string;\n    type: EmbedDependencyType;\n    loaded?: boolean;\n    existed?: boolean;\n}\n"
  },
  {
    "path": "packages/sanddance-embed/src/types/fluentUI-icons.d.ts",
    "content": "import { initializeIcons, use } from '@msrvida/fluentui-icons';\n\nexport interface FluentUIIconsBase {\n    initializeIcons: typeof initializeIcons;\n    use: typeof use;\n}\n\nexport as namespace _FluentUIIcons;\n"
  },
  {
    "path": "packages/sanddance-embed/src/types/fluentUI.d.ts",
    "content": "export { FluentUIComponents } from '@msrvida/fluentui-react-cdn-typings';\n\nexport as namespace _FluentUI;\n"
  },
  {
    "path": "packages/sanddance-embed/src/types/message-request.d.ts",
    "content": "type Actions = 'init' | 'load' | 'getData' | 'getInsight';\n\ninterface MessageRequestBase {\n    action: Actions;\n    id?: string | number;\n    ts?: string | number | Date;\n}\n\ninterface MessageRequest_Init extends MessageRequestBase {\n    action: 'init';\n}\n\ntype DataToLoad = object[] | SandDanceExplorer.DataFile;\n\ninterface MessageRequest_Load extends MessageRequestBase {\n    action: 'load';\n    data: DataToLoad;\n\n    insight?: Partial<SandDance.types.Insight>;\n\n    props?: SandDanceExplorer.Props;\n\n    options?: SandDanceExplorer.Options;\n}\n\ninterface MessageRequest_GetData extends MessageRequestBase {\n    action: 'getData';\n}\n\ninterface MessageRequest_GetInsight extends MessageRequestBase {\n    action: 'getInsight';\n}\n\ninterface MessageRequest_GetSetup extends MessageRequestBase {\n    action: 'getSetup';\n}\n\ninterface MessageRequest_Theme extends MessageRequestBase {\n    action: 'theme';\n    dark?: boolean;\n}\n\ninterface MessageRequest_EventCanvasClick extends MessageRequestBase {\n    action: 'eventCanvasClick';\n}\n\ninterface MessageRequest_EventCubeClick extends MessageRequestBase {\n    action: 'eventCubeClick';\n}\n\ntype MessageRequest =\n    | MessageRequest_Init\n    | MessageRequest_Load\n    | MessageRequest_GetData\n    | MessageRequest_GetInsight\n    | MessageRequest_GetSetup\n    | MessageRequest_Theme\n    | MessageRequest_EventCanvasClick\n    | MessageRequest_EventCubeClick\n    ;\n\ntype MessageRequestWithSource = MessageRequest & { source: WindowProxy };\n"
  },
  {
    "path": "packages/sanddance-embed/src/types/message-response.d.ts",
    "content": "interface MessageResponseBase {\n    request: MessageRequest;\n}\n\ninterface MessageResponse_Init extends MessageResponseBase { }\n\ninterface MessageResponse_GetData extends MessageResponseBase {\n    data: object[];\n}\n\ninterface MessageResponse_GetInsight extends MessageResponseBase {\n\n    insight: SandDanceExplorer.SandDance.types.Insight;\n}\n\ninterface MessageResponse_GetSetup extends MessageResponseBase {\n\n    setup: SandDanceExplorer.SandDance.types.Setup;\n}\n\ninterface MessageResponse_EventError extends MessageResponseBase {\n    errors: string[];\n}\n\ninterface MessageResponse_EventCanvasClick extends MessageResponseBase {\n    event: TouchEvent | MouseEvent | PointerEvent;\n}\n\ninterface MessageResponse_EventCubeClick extends MessageResponse_EventCanvasClick {\n    ordinal: number;\n}\n\ninterface MessageResponse_Theme extends MessageResponseBase {\n    theme: string;\n}\n\ntype MessageResponse =\n    | MessageResponse_Init\n    | MessageResponse_GetData\n    | MessageResponse_GetInsight\n    | MessageResponse_GetSetup\n    | MessageResponse_Theme\n    | MessageResponse_EventCanvasClick\n    | MessageResponse_EventCubeClick\n    ;\n"
  },
  {
    "path": "packages/sanddance-embed/src/types/sanddance-explorer.d.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport * from '@msrvida/sanddance-explorer';\n\nexport as namespace SandDanceExplorer;\n"
  },
  {
    "path": "packages/sanddance-embed/test/dynamic-deps/target.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n</head>\n\n<body>\n    <script>\n        var SandDanceEmbed = { \n            localDev: document.location.search.indexOf('prod') < 0,\n            minified: document.location.search.indexOf('min') >= 0,\n         };\n    </script>\n    <script src=\"../../dist/umd/sanddance-embed.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "packages/sanddance-embed/test/dynamic-deps/test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <header>\n        <h1>sanddance embed test</h1>\n    </header>\n\n    <iframe id=\"embed\" title=\"embed\" style=\"width: 90%; height: 700px\"></iframe>\n\n    <div>\n        <button id=\"button_theme\">toggle dark theme</button>\n        <button id=\"button_insight\">get insight</button>\n        <button id=\"button_setup\">get setup</button>\n        <a href=\"?\">localDev</a>\n        <a href=\"?prod&min\">prod</a>\n    </div>\n\n    <script>\n        window.onmessage = (e) => {\n            console.log('messaged', e.data);\n        };\n        const embedIframe = document.getElementById('embed');\n        embedIframe.onload = () => {\n            fetch('https://microsoft.github.io/SandDance/sample-data/titanicmaster.tsv')\n                .then(response => response.text())\n                .then(rawText => {\n                    const data = { rawText, type: 'tsv' };\n                    embedIframe.contentWindow.postMessage({\n                        action: 'load',\n                        data,\n                        insight: {\n                            chart: 'barchartH',\n                            columns: {\n                                y: 'Age',\n                                z: 'TicketCost',\n                                color: 'Class'\n                            },\n                            scheme: 'category10',\n                            view: '3d',\n                        },\n                        props: {\n                            theme: 'dark-theme',\n                            initialSidebarClosed: true,\n                            initialSidebarPinned: false,\n                            initialRenderer: {\n                                advanced: true,\n                            },\n                        }\n                    }, '*');\n                });\n        };\n        embedIframe.src = `target.html${location.search}`;\n\n        let dark = true;\n        const button_theme = document.getElementById('button_theme');\n        button_theme.onclick = () => {\n            dark = !dark;\n            embedIframe.contentWindow.postMessage({ action: 'theme', dark }, '*');\n        };\n\n        const button_insight = document.getElementById('button_insight');\n        button_insight.onclick = () => {\n            embedIframe.contentWindow.postMessage({ action: 'getInsight' }, '*');\n        };\n\n        const button_setup = document.getElementById('button_setup');\n        button_setup.onclick = () => {\n            embedIframe.contentWindow.postMessage({ action: 'getSetup' }, '*');\n        };\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "packages/sanddance-embed/test/standalone/test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../../sanddance-explorer/dist/css/sanddance-explorer.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../dist/css/sanddance-embed.css\" />\n</head>\n<body>\n    <script src=\"../../../../node_modules/react/umd/react.production.min.js\"></script>\n    <script src=\"../../../../node_modules/react-dom/umd/react-dom.production.min.js\"></script>\n    <script src=\"../../../../node_modules/vega/build/vega.min.js\"></script>\n    <script src=\"../../../../node_modules/@fluentui/react/dist/fluentui-react.js\"></script>\n    <script src=\"../../../fluentui-icons/dist/umd/fluentui-icons.js\"></script>\n    <script src=\"../../../sanddance-explorer/dist/umd/sanddance-explorer.js\"></script>\n    <script>\n        //comment out to test production build\n        var SandDanceEmbed = { \n            localDev: true\n         };\n    </script>\n    <script src=\"../../dist/umd/sanddance-embed.js\"></script>\n<script>\nconst data = [\n    {\n        \"x\": 0,\n        \"y\": 0,\n        \"z\": 0\n    },\n    {\n        \"x\": 1,\n        \"y\": 1,\n        \"z\": 1\n    },\n    {\n        \"x\": 2,\n        \"y\": 2,\n        \"z\": 2\n    }\n];\nSandDanceEmbed.load(data);\n</script>\n</body>\n</html>"
  },
  {
    "path": "packages/sanddance-embed/test/static-deps/target.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDance</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../../sanddance-explorer/dist/css/sanddance-explorer.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../dist/css/sanddance-embed.css\" />\n</head>\n<body>\n    <script src=\"../../../../node_modules/react/umd/react.production.min.js\"></script>\n    <script src=\"../../../../node_modules/react-dom/umd/react-dom.production.min.js\"></script>\n    <script src=\"../../../../node_modules/vega/build/vega.min.js\"></script>\n    <script src=\"../../../../node_modules/@fluentui/react/dist/fluentui-react.js\"></script>\n    <script src=\"../../../fluentui-icons/dist/umd/fluentui-icons.js\"></script>\n    <script src=\"../../../sanddance-explorer/dist/umd/sanddance-explorer.js\"></script>\n    <script>\n        // comment out to test production build\n        var SandDanceEmbed = { \n            localDev: true\n         };\n    </script>\n    <script src=\"../../dist/umd/sanddance-embed.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "packages/sanddance-embed/test/static-deps/test.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <header>\n        <h1>sanddance embed test</h1>\n    </header>\n\n    <iframe id=\"embed\" title=\"embed\" style=\"width: 90%; height: 700px\"></iframe>\n\n    <div>\n        <button id=\"button1\">toggle dark theme</button>\n    </div>\n\n    <script>\n        window.onmessage = (e) => {\n            console.log('messaged', e.data);\n        };\n        const embedIframe = document.getElementById('embed');\n        embedIframe.onload = () => {\n            fetch('https://microsoft.github.io/SandDance/sample-data/titanicmaster.tsv')\n                .then(response => response.text())\n                .then(rawText => {\n                    const data = { rawText, type: 'tsv' };\n                    embedIframe.contentWindow.postMessage({ action: 'load', data, props: { theme: 'dark-theme' } }, '*');\n                });\n        };\n        embedIframe.src = 'target.html';\n\n        let dark = true;\n        const button1 = document.getElementById('button1');\n        button1.onclick = () => {\n            dark = !dark;\n            embedIframe.contentWindow.postMessage({ action: 'theme', dark }, '*');\n        };\n\n    </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "packages/sanddance-embed/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"lib\": [\n            \"dom\",\n            \"es2015\"\n        ],\n        \"skipLibCheck\": true,\n        \"outFile\": \"dist/umd/sanddance-embed.js\"\n    },\n    \"exclude\": [\n        \"src/gen\"\n    ],\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/sanddance-explorer/.gitignore",
    "content": "dist\n"
  },
  {
    "path": "packages/sanddance-explorer/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/sanddance-explorer/README.md",
    "content": "# @msrvida/sanddance-explorer\n\nVisually explore, understand, and present your data.\n\n![image](https://user-images.githubusercontent.com/11507384/72197128-a99cdd80-33d2-11ea-9b49-5d470db0abc1.png)\n\n\n[Demo](https://microsoft.github.io/SandDance/app) - [API Reference](https://microsoft.github.io/SandDance/docs/sanddance-explorer/v4)\n\n## Installation\n\nAdd these to the `dependencies` section of your `package.json`, then run `npm install`:\n\n```json\n\"@msrvida/sanddance-explorer\": \"^4\",\n\"@fluentui/react\": \"^8\",\n\"vega\": \"^6.2\"\n```\n\nImport these in your JavaScript:\n\n```js\nimport * as fluentui from '@fluentui/react';\nimport * as vega from 'vega';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { Explorer, use } from '@msrvida/sanddance-explorer';\n\n//quickstart: use the included stylesheet\nimport \"@msrvida/sanddance-explorer/dist/css/sanddance-explorer.css\"\n\n/*\n  in your own stylesheet, you can modify the sanddance-explorer class to fit your needs.\n  Example:\n\n.sanddance-explorer {\n  height: 800px;\n}\n\n*/\n\nfluentui.initializeIcons();\n\nuse(fluentui, React, ReactDOM, vega);\n\nconst data = [\n  { a: 1, b: \"c1\" },\n  { a: 1, b: \"c2\" },\n  { a: 2, b: \"c3\" },\n  { a: 3, b: \"c4\" }\n];\n\nconst explorerProps = {\n    logoClickUrl: 'https://microsoft.github.io/SandDance/',\n    mounted: explorer => {\n        explorer.load(data);\n    }\n};\n\nReactDOM.render(React.createElement(Explorer, explorerProps), document.getElementById('app'));\n```\n\n## Versions\n\n### Breaking changes in v4\n\n* removed deck.gl dependency\n* @fluentui/react @8\n\n### Breaking changes in v3\n\n* deck.gl dependency from 6.4 to 8.1\n* fluentui-react 7.x (formerly office-ui-fabric-react 6.x)\n\n## For more information\nPlease visit the [SandDance website](https://microsoft.github.io/SandDance/).\n"
  },
  {
    "path": "packages/sanddance-explorer/bundle/umd.js",
    "content": "import * as SandDanceExplorer from '../dist/es6';\nwindow.SandDanceExplorer = SandDanceExplorer;\n"
  },
  {
    "path": "packages/sanddance-explorer/package.json",
    "content": "{\n  \"name\": \"@msrvida/sanddance-explorer\",\n  \"version\": \"4.1.8\",\n  \"description\": \"SandDance data exploration React component.\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/sanddance-explorer\"\n  },\n  \"types\": \"dist/es6/index.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"build-typescript\": \"tsc -p .\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-css\": \"sass ./src/css/sanddance-explorer.scss ./dist/css/sanddance-explorer.css\",\n    \"watch-css\": \"sass ./src/css/sanddance-explorer.scss ./dist/css/sanddance-explorer.css --watch\",\n    \"bundle\": \"vite build\",\n    \"deploy\": \"node ./scripts/deploy.js\",\n    \"prebuild:06\": \"node ./scripts/prebuild.js\",\n    \"build:06\": \"npm run build-typescript && node ../../scripts/version.js && npm run bundle && npm run build-css\"\n  },\n  \"targets\": {\n    \"main\": false,\n    \"types\": false,\n    \"umd\": {\n      \"distDir\": \"./dist/umd\",\n      \"optimize\": false,\n      \"sourceMap\": false,\n      \"includeNodeModules\": {\n        \"react\": false,\n        \"react-dom\": false\n      }\n    }\n  },\n  \"umd\": \"./dist/umd/sanddance-explorer.js\",\n  \"dependencies\": {\n    \"@msrvida/chart-recommender\": \"^4\",\n    \"@msrvida/fluentui-react-cdn-typings\": \"^2\",\n    \"@msrvida/sanddance-react\": \"^4\",\n    \"d3-format\": \"^1.3.2\"\n  },\n  \"peerDependencies\": {\n    \"@types/react\": \">=16.8.0 <18.0.0\",\n    \"@types/react-dom\": \">=16.8.0 <18.0.0\",\n    \"react\": \">=16.8.0 <18.0.0\",\n    \"react-dom\": \">=16.8.0 <18.0.0\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/scripts/deploy.js",
    "content": "const fs = require('fs');\nfs.copyFileSync('./dist/css/sanddance-explorer.css', '../../docs/dist/sanddance-explorer/v4/sanddance-explorer.css');\nfs.copyFileSync('./dist/umd/sanddance-explorer.js', '../../docs/dist/sanddance-explorer/v4/sanddance-explorer.js');\n"
  },
  {
    "path": "packages/sanddance-explorer/scripts/prebuild.js",
    "content": "const fs = require('fs');\n\nconst pubversion = 'v4';\n\nlet html = fs.readFileSync(`../../docs/embed/${pubversion}/sanddance-embed.html`, 'utf8');\n\nconst regex = /<title>(.*?)<\\/title>/;\n\nhtml = html.replace(regex, '<title>${title}</title>');\nhtml = html.replace('<!--EMBED-->', '${embed}');\n\nfs.writeFileSync('src/controls/dataExporterHtml.ts', `/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const embedHtml = (title: string, embed: string) => \\`${html}\\`;`);\n"
  },
  {
    "path": "packages/sanddance-explorer/src/base.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { BackgroundImageEditor } from './dialogs/backgroundImageEditor';\nimport { PositionedColumnMap } from './clickableTextLayer';\nimport { ColumnTypeChanger } from './controls/columnTypeChanger';\nimport { DataExportPicker } from './controls/dataExporter';\nimport { Chart } from './dialogs/chart';\nimport { Search } from './dialogs/search';\nimport { Settings } from './dialogs/settings';\nimport { SnapshotEditor } from './dialogs/snapshotEditor';\nimport { Snapshots } from './dialogs/snapshots';\nimport { TransitionEditor } from './dialogs/transition';\nimport { Explorer } from './explorer';\nimport { FluentUIComponents } from '@msrvida/fluentui-react-cdn-typings';\nimport { SandDance, use as _use } from '@msrvida/sanddance-react';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { Renderer } from './controls/renderer';\n\n/**\n * References to dependency libraries.\n */\nexport interface Base {\n    fluentUI: FluentUIComponents;\n    react: typeof React;\n    reactDOM: typeof ReactDOM;\n}\n\nexport const base: Base = {\n    fluentUI: null,\n    react: null,\n    reactDOM: null,\n};\n\n/**\n * Specify the dependency libraries to use for rendering.\n * @param fluentUI FluentUI React library.\n * @param react React library.\n * @param vega Vega library.\n * @param deck @deck.gl/core library.\n * @param layers @deck.gl/layers library.\n * @param luma @luma.gl/core library.\n */\nexport function use(\n    fluentUI: FluentUIComponents,\n    react: typeof React,\n    reactDOM: typeof ReactDOM,\n    vega: SandDance.VegaMorphCharts.types.VegaBase,\n) {\n    _use(react, reactDOM, vega);\n    base.fluentUI = fluentUI;\n    base.react = react;\n    base.reactDOM = reactDOM;\n\n    //inform React that we are using a dynamic base class\n    BackgroundImageEditor.prototype = react.Component.prototype as any;\n    Chart.prototype = react.Component.prototype as any;\n    ColumnTypeChanger.prototype = react.Component.prototype as any;\n    DataExportPicker.prototype = react.Component.prototype as any;\n    Explorer.prototype = react.Component.prototype as any;\n    PositionedColumnMap.prototype = react.Component.prototype as any;\n    Renderer.prototype = react.Component.prototype as any;\n    Search.prototype = react.Component.prototype as any;\n    SnapshotEditor.prototype = react.Component.prototype as any;\n    Snapshots.prototype = react.Component.prototype as any;\n    Settings.prototype = react.Component.prototype as any;\n    TransitionEditor.prototype = react.Component.prototype as any;\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/canvas.ts",
    "content": "import { SandDance } from '@msrvida/sanddance-react';\nimport PresenterElement = SandDance.VegaMorphCharts.PresenterElement;\n\nexport function getCanvas(viewer: SandDance.Viewer) {\n    const tags = viewer.presenter.getElement(PresenterElement.gl).getElementsByTagName('canvas');\n    if (tags) {\n        return tags[0];\n    }\n}\n\nexport function removeTabIndex(viewer: SandDance.Viewer) {\n    const canvas = getCanvas(viewer);\n    if (canvas) {\n        canvas.tabIndex = -1;\n    }\n}\n\nexport const capabilities = {\n    webgl: !!document.createElement('canvas').getContext('webgl'),\n    webgl2: !!document.createElement('canvas').getContext('webgl2'),\n};\n"
  },
  {
    "path": "packages/sanddance-explorer/src/clickableTextLayer.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from './base';\nimport { ColumnMap, Props as ColumnMapProps } from './controls/columnMap';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { MousePosition } from './mouseEvent';\n\nexport interface TextWithSpecRole extends SandDance.VegaMorphCharts.types.VegaTextLayerDatum {\n    specRole: SandDance.specs.SpecRoleCapabilities;\n}\n\nexport function attachSpecRoleToAxisTitle(\n    stage: SandDance.VegaMorphCharts.types.Stage,\n    specCapabilities: SandDance.specs.SpecCapabilities,\n) {\n    for (const axisName in stage.axes) {\n        specCapabilities.roles.forEach(specRole => {\n            if (specRole.role === axisName) {\n                const axes = stage.axes[axisName] as SandDance.VegaMorphCharts.types.Axis[];\n                axes.forEach(axis => {\n                    if (axis.title) {\n                        const textItem = axis.title as TextWithSpecRole;\n                        textItem.specRole = specRole;\n                    }\n                });\n            }\n        });\n    }\n}\n\nfunction px(n: number) {\n    return n + 'px';\n}\n\nexport interface PositionedColumnMapProps extends ColumnMapProps, MousePosition {\n    container: HTMLElement;\n}\n\nexport interface PositionedColumnMapState extends MousePosition { }\n\nfunction _PositionedColumnMap(_props: PositionedColumnMapProps) {\n    class __PositionedColumnMap extends base.react.Component<PositionedColumnMapProps, PositionedColumnMapState> {\n        private dropdownRef?: React.RefObject<FluentUITypes.IDropdown>;\n        private focused: boolean;\n        private div: HTMLDivElement;\n\n        constructor(props: PositionedColumnMapProps) {\n            super(props);\n            const { left, top } = props;\n            this.state = { left, top };\n            this.dropdownRef = base.react.createRef<FluentUITypes.IDropdown>();\n        }\n\n        focus() {\n            if (!this.focused) {\n                this.focused = true;\n                this.dropdownRef.current!.focus(true);\n            }\n        }\n\n        componentDidMount() {\n            const size = SandDance.VegaMorphCharts.util.outerSize(this.div);\n            const over: MousePosition = {\n                left: Math.max(0, this.state.left + size.width - this.props.container.offsetWidth),\n                top: Math.max(0, this.state.top + size.height - this.props.container.offsetHeight),\n            };\n            if (over.left || over.top) {\n                let { left, top } = this.state;\n                left -= over.left;\n                top -= over.top;\n                this.setState({ left, top });\n            } else {\n                this.focus();\n            }\n        }\n\n        componentDidUpdate() {\n            this.focus();\n        }\n\n        render() {\n            return (\n                <div\n                    ref={div => { if (div) this.div = div; }}\n                    className=\"sanddance-columnMap-absolute\"\n                    style={{ position: 'absolute', left: px(this.state.left), top: px(this.state.top) }}\n                >\n                    <ColumnMap\n                        {...this.props}\n                        componentRef={this.dropdownRef}\n                        hideSignals={true}\n                    />\n                </div>\n            );\n        }\n    }\n\n    return new __PositionedColumnMap(_props);\n}\n\nexport const PositionedColumnMap: typeof PositionedColumnMap_Class = _PositionedColumnMap as any;\n\nexport declare class PositionedColumnMap_Class extends base.react.Component<PositionedColumnMapProps, PositionedColumnMapState> {\n}"
  },
  {
    "path": "packages/sanddance-explorer/src/colorMap.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from './base';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { IconButton } from './controls/iconButton';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { strings } from './language';\n\nconst className = 'sanddance-panel-tools';\n\nfunction ensureToolbar(panel: HTMLElement) {\n    const existing = panel.getElementsByClassName(className);\n    if (existing.length > 0) {\n        return existing[0];\n    } else {\n        const div = SandDance.VegaMorphCharts.util.addDiv(panel, className);\n        panel.insertAdjacentElement('afterbegin', div);\n        return div;\n    }\n}\n\nexport function applyColorButtons(presenter: SandDance.VegaMorphCharts.Presenter, showLegend: boolean, props: Props) {\n    const panel = presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.panel);\n    const div = ensureToolbar(panel);\n    base.reactDOM.render(ColorMap(props), div);\n\n    panel.style.display = showLegend ? '' : 'none';\n}\n\nexport interface Props {\n    canRemap?: boolean;\n    colorMapHandler: { (remap: boolean): void };\n    isRemap: boolean;\n    themePalette: Partial<FluentUITypes.IPalette>;\n}\n\nfunction ColorMap(props: Props) {\n    const menuProps: FluentUITypes.IContextualMenuProps = {\n        items: [\n            {\n                key: 'new',\n                text: strings.buttonColorSchemeRemap,\n                disabled: !props.canRemap || props.isRemap,\n                onClick: () => props.colorMapHandler(true),\n            },\n            {\n                key: 'old',\n                text: strings.buttonColorSchemeKeep,\n                disabled: !props.canRemap || !props.isRemap,\n                onClick: () => props.colorMapHandler(false),\n            },\n        ],\n    };\n    return (\n        <div>\n            <IconButton\n                styles={{\n                    menuIcon: {\n                        display: 'none',\n                    },\n                }}\n                themePalette={props.themePalette}\n                title={strings.buttonColorSchemeMap}\n                onClick={null}\n                iconName={props.canRemap ? 'FiltersSolid' : 'Filters'}\n                menuProps={menuProps}\n            />\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/colorScheme.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SandDance } from '@msrvida/sanddance-react';\n\nexport function bestColorScheme(newColumn: SandDance.types.Column, oldColumn: SandDance.types.Column, oldScheme: string) {\n    if (oldColumn &&\n        oldColumn.quantitative === newColumn.quantitative &&\n        defaultColorScheme(oldColumn) === defaultColorScheme(newColumn)\n    ) {\n        return oldScheme;\n    }\n    return defaultColorScheme(newColumn);\n}\n\nfunction defaultColorScheme(c: SandDance.types.Column) {\n    if (c.quantitative) {\n        return 'redyellowgreen';\n    } else if (c.stats.distinctValueCount === 2) {\n        return 'dual_redgreen';\n    } else if (c.stats.distinctValueCount <= 10) {\n        return 'category10';\n    }\n    return 'category20';\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/columns.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { preferredColumnForTreemapSize } from '@msrvida/chart-recommender';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { strings } from './language';\nimport { Transforms } from 'vega-typings/types';\nimport { BackgroundImageColumnBound, DataExtent } from './interfaces';\n\nimport TotalStyle = SandDance.specs.TotalStyle;\n\nexport function ensureColumnsExist(insightColumns: SandDance.specs.InsightColumns, actualColumns: SandDance.types.Column[], transform: Transforms[]) {\n    //ensure columns exist\n    for (const role in insightColumns) {\n        const columnName = insightColumns[role];\n        const column = actualColumns.filter(c => c.name === columnName)[0];\n        const transformColumn = transform ? transform.filter(t => {\n            switch (t.type) {\n                case 'formula': {\n                    return t.as === columnName;\n                }\n            }\n        })[0] : null;\n        if (!(column || transformColumn)) {\n            delete insightColumns[role];\n        }\n    }\n}\n\nexport function ensureColumnsPopulated(chart: SandDance.specs.Chart, totalStyle: TotalStyle, insightColumns: SandDance.specs.InsightColumns, actualColumns: SandDance.types.Column[]) {\n    //ensure columns are populated\n    const nonInternal = actualColumns.filter(c => !SandDance.util.isInternalFieldName(c.name));\n    const firstColumn = nonInternal[0];\n    const firstColumnName = firstColumn && firstColumn.name;\n    const firstQuantitative = nonInternal.filter(c => c.quantitative)[0];\n    const firstQuantitativeColumnName = firstQuantitative && firstQuantitative.name;\n    const ensureColumn = (role: SandDance.specs.InsightColumnRoles, quantitative?: boolean, treemap?: boolean) => {\n        if (!insightColumns[role]) {\n            if (treemap) {\n                insightColumns[role] = getTreemapColumn(actualColumns).name;\n            } else {\n                insightColumns[role] = quantitative ? firstQuantitativeColumnName : firstColumnName;\n            }\n        }\n    };\n    function checkRequiresSize() {\n        switch (totalStyle) {\n            case 'sum-strip':\n            case 'sum-strip-percent':\n                ensureColumn('size', true);\n                break;\n            case 'sum-treemap':\n                ensureColumn('size', true, true);\n                break;\n        }\n    }\n    switch (chart) {\n        case 'barchart':\n        case 'barchartV':\n            ensureColumn('x');\n            checkRequiresSize();\n            break;\n        case 'barchartH':\n            ensureColumn('y');\n            checkRequiresSize();\n            break;\n        case 'density':\n            ensureColumn('x');\n            ensureColumn('y');\n            checkRequiresSize();\n            break;\n        case 'scatterplot':\n        case 'stacks':\n            ensureColumn('x');\n            ensureColumn('y');\n            break;\n        case 'treemap':\n            if (!insightColumns.size) {\n                insightColumns.size = getTreemapColumn(actualColumns).name;\n            }\n            if (!insightColumns.size) {\n                //error - no numeric column\n                return [strings.errorColumnMustBeNumeric];\n            }\n            break;\n    }\n}\n\nexport function getTreemapColumn(columns: SandDance.types.Column[]) {\n    let column = preferredColumnForTreemapSize(columns, true);\n    if (!column) {\n        column = preferredColumnForTreemapSize(columns, false);\n    }\n    return column;\n}\n\nexport function colorMapping(insight: SandDance.specs.Insight, columns: SandDance.types.Column[]) {\n    if (columns && insight.columns && insight.columns.color) {\n        return columns.filter(c => c.name === insight.columns.color)[0];\n    }\n}\n\nexport function getBackgroundImageColumnBounds(columns: SandDance.types.Column[]) {\n    const bounds: BackgroundImageColumnBound[] = [];\n    const getBound = (dimension: SandDance.types.Dimension2D, dataExtent: DataExtent, column: SandDance.types.Column): BackgroundImageColumnBound => {\n        const { stats } = column;\n        const numericValue = dataExtent === 'max' ? stats.max : stats.min;\n        return {\n            columnName: column.name,\n            dimension,\n            valid: true,\n            dataExtent,\n            numericValue,\n            stringValue: numericValue.toString(),\n        };\n    };\n    const dataExtents: DataExtent[] = ['max', 'min'];\n    const dimensions: SandDance.types.Dimension2D[] = ['x', 'y'];\n    columns.forEach(c => {\n        if (c.quantitative) {\n            dimensions.forEach(dimension => dataExtents.forEach(dataExtent => bounds.push(getBound(dimension, dataExtent, c))));\n        }\n    });\n    return bounds;\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/CommandBarButton.styles.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n//adapted from https://github.com/OfficeDev/office-ui-fabric-react/blob/master/packages/fluent-theme/src/fluent/styles/CommandBarButton.styles.ts\n\nimport { base } from '../base';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\n\nexport const CommandBarButtonStyles = (props: FluentUITypes.IButtonProps): Partial<FluentUITypes.IButtonStyles> => {\n    const { theme } = props;\n    if (!theme) {\n        throw new Error('Theme is undefined or null.');\n    }\n    const { palette, semanticColors } = theme;\n\n    const BUTTON_ICON_CLASSNAME = '.ms-Button-icon';\n\n    return {\n        root: [\n            { ...base.fluentUI.getFocusStyle(theme, { inset: 2 }) },\n            {\n                backgroundColor: palette.white,\n            },\n        ],\n\n        rootHovered: {\n            backgroundColor: palette.neutralLighter,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDarkAlt,\n                },\n            },\n        },\n\n        rootPressed: {\n            backgroundColor: palette.neutralLight,\n            color: palette.neutralDark,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark,\n                },\n            },\n        },\n\n        rootChecked: {\n            backgroundColor: palette.neutralLight,\n            color: palette.neutralDark,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark,\n                },\n            },\n        },\n\n        rootCheckedHovered: {\n            backgroundColor: palette.neutralQuaternaryAlt,\n            color: palette.neutralDark,\n        },\n\n        rootExpanded: {\n            color: palette.neutralDark,\n            backgroundColor: palette.neutralLight,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: palette.themeDark,\n                },\n            },\n        },\n\n        rootExpandedHovered: {\n            background: palette.neutralQuaternaryAlt,\n        },\n\n        rootDisabled: {\n            backgroundColor: palette.white,\n            selectors: {\n                [BUTTON_ICON_CLASSNAME]: {\n                    color: semanticColors.disabledBodySubtext,\n                },\n            },\n        },\n\n        splitButtonMenuButton: {\n            backgroundColor: palette.white,\n            color: palette.neutralSecondary,\n            selectors: {\n                ':hover': {\n                    backgroundColor: palette.neutralLighter,\n                    selectors: {\n                        [BUTTON_ICON_CLASSNAME]: {\n                            color: palette.neutralPrimary,\n                        },\n                    },\n                },\n                ':active': {\n                    backgroundColor: palette.neutralLight,\n                    selectors: {\n                        [BUTTON_ICON_CLASSNAME]: {\n                            color: palette.neutralPrimary,\n                        },\n                    },\n                },\n            },\n        },\n\n        splitButtonMenuButtonDisabled: {\n            backgroundColor: palette.white,\n        },\n\n        icon: {\n            color: palette.themePrimary,\n        },\n    };\n};\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/button.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { IButtonProps as _IButtonProps, ICSSRule, ICSSPixelUnitRule, IPalette, IStyle } from '@msrvida/fluentui-react-cdn-typings/types';\n\nexport interface IButtonProps extends _IButtonProps {\n    iconName?: string;\n    onClick: { (event: React.MouseEvent<{}>): void };\n    textAlign?: string;\n    width?: ICSSRule | ICSSPixelUnitRule;\n    themePalette: Partial<IPalette>;\n    rootStyle?: IStyle;\n}\n\nexport function Button(props: IButtonProps) {\n    return (\n        <base.fluentUI.DefaultButton\n            {...props}\n            styles={{\n                root: {\n                    backgroundColor: 'transparent',\n                    height: '30px',\n                    width: props.width,\n                    padding: 0,\n                    ...props.rootStyle as object,\n                },\n                rootDisabled: {\n                    backgroundColor: 'transparent',\n                },\n                icon: {\n                    color: props.themePalette.themePrimary,\n                },\n                label: {\n                    fontWeight: '400',\n                    textAlign: props.textAlign || 'left',\n                },\n            }}\n            iconProps={{ iconName: props.iconName }}\n        />\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/columnMap.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { ChangeColumnMappingOptions } from '../interfaces';\nimport { Dropdown } from './dropdown';\nimport { Explorer_Class } from '../explorer';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { NewSignal } from 'vega-typings/types';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { Signal } from './signal';\nimport { strings } from '../language';\n\nconst maxFacets = 50;\n\nconst roleLabels: { [role in SandDance.specs.InsightColumnRoles]: string } = {\n    color: strings.labelColumnColor,\n    facet: strings.labelColumnFacet,\n    facetV: strings.labelColumnFacetV,\n    group: strings.labelColumnGroup,\n    size: strings.labelColumnSize,\n    sort: strings.labelColumnSort,\n    uid: null,\n    x: strings.labelColumnX,\n    y: strings.labelColumnY,\n    z: strings.labelColumnZ,\n};\n\nconst aliasLabels: { [role in SandDance.specs.InsightColumnRoles]: string } = {\n    color: strings.labelAliasColor,\n    facet: strings.labelAliasFacet,\n    facetV: strings.labelAliasFacetV,\n    group: strings.labelAliasGroup,\n    size: strings.labelAliasSize,\n    sort: strings.labelAliasSort,\n    uid: null,\n    x: strings.labelAliasX,\n    y: strings.labelAliasY,\n    z: strings.labelAliasZ,\n};\n\nexport interface ColumnMapBaseProps {\n    allColumns: SandDance.types.Column[];\n    quantitativeColumns: SandDance.types.Column[];\n    categoricalColumns: SandDance.types.Column[];\n    changeColumnMapping: (role: SandDance.specs.InsightColumnRoles, columnOrRole: SandDance.types.Column | string, defaultColumn?: SandDance.types.Column, options?: ChangeColumnMappingOptions) => void;\n    facetStyle: SandDance.specs.FacetStyle;\n    totalStyle: SandDance.specs.TotalStyle;\n    explorer: Explorer_Class;\n    specCapabilities: SandDance.specs.SpecCapabilities;\n}\n\nexport interface ColumnMapOptionsProps extends ColumnMapBaseProps {\n    specRole: SandDance.specs.SpecRoleCapabilities;\n    disabledColumnName?: string\n    selectedColumnName?: string\n}\n\nexport interface Props extends ColumnMapOptionsProps {\n    collapseLabel: boolean;\n    componentRef?: React.RefObject<FluentUITypes.IDropdown>;\n    hideSignals?: boolean;\n    prefix?: JSX.Element;\n    suffix?: JSX.Element;\n    disabled?: boolean;\n    hideDropdown?: boolean;\n    onChangeSignal?: (name: string, value: any) => void;\n    onDismiss?: () => void;\n}\n\nfunction filterColumnList(context: SandDance.specs.InsightColumnRoles, columns: SandDance.types.Column[]) {\n    switch (context) {\n        case 'facet':\n        case 'facetV':\n            return columns.filter(\n                column =>\n                    column.quantitative ||\n                    (column.stats.distinctValueCount &&\n                        column.stats.distinctValueCount < maxFacets),\n            );\n        default:\n            return columns.slice();\n    }\n}\n\nfunction optionsForSpecColumn(sectionName: string, columns: SandDance.types.Column[], role: SandDance.specs.InsightColumnRoles, disabledColumnName: string, selectedColumnName: string) {\n    const filtered = filterColumnList(role, columns);\n    const options = filtered.map(column => {\n        const option: FluentUITypes.IDropdownOption = {\n            key: `column:${column.name}`,\n            text: column.name,\n            data: column,\n            selected: selectedColumnName === column.name,\n            disabled: disabledColumnName === column.name,\n        };\n        return option;\n    });\n    if (options.length) {\n        const option: FluentUITypes.IDropdownOption = {\n            key: sectionName,\n            text: sectionName,\n            itemType: base.fluentUI.DropdownMenuItemType.Header,\n        };\n        options.unshift(option);\n    }\n    return options;\n}\n\nfunction optionsForReference(sectionName: string, specRoles: SandDance.specs.SpecRoleCapabilities[]) {\n    const options = specRoles.map(specRole => {\n        const option: FluentUITypes.IDropdownOption = {\n            key: `role:${specRole.role}`,\n            text: aliasLabels[specRole.role],\n            data: specRole.role,\n        };\n        return option;\n    }).sort((a, b) => a.text.localeCompare(b.text));\n    if (options.length) {\n        const option: FluentUITypes.IDropdownOption = {\n            key: sectionName,\n            text: sectionName,\n            itemType: base.fluentUI.DropdownMenuItemType.Header,\n        };\n        options.unshift(option);\n    }\n    return options;\n}\n\nfunction selectFirst(options: FluentUITypes.IDropdownOption[]) {\n    for (let i = 0; i < options.length; i++) {\n        if (options[i].itemType === base.fluentUI.DropdownMenuItemType.Header) continue;\n        options[i].selected = true;\n        return;\n    }\n}\n\nexport function getColumnMapOptions(props: ColumnMapOptionsProps) {\n    if (!props.specRole) return null;\n\n    let categoricalColumns: SandDance.types.Column[];\n    let directColorColumns: SandDance.types.Column[];\n    let directColorGroup: FluentUITypes.IDropdownOption[];\n    let referenceGroup: FluentUITypes.IDropdownOption[] = [];\n\n    if (props.specRole.role === 'color') {\n        categoricalColumns = props.categoricalColumns.filter(c => !c.isColorData);\n        directColorColumns = props.categoricalColumns.filter(c => c.isColorData);\n        directColorGroup = optionsForSpecColumn(strings.selectDirectColor, directColorColumns, 'color', props.disabledColumnName, props.selectedColumnName);\n    } else {\n        categoricalColumns = props.categoricalColumns;\n    }\n\n    if (props.specRole.role === 'sort') {\n        const others = props.specCapabilities.roles.filter(specRole => specRole.role !== props.specRole.role);\n        referenceGroup = optionsForReference(strings.selectReference, others);\n    }\n\n    const quantitativeGroup = optionsForSpecColumn(strings.selectNumeric, props.quantitativeColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n    const categoricGroup = props.specRole.excludeCategoric ? null : optionsForSpecColumn(strings.selectNonNumeric, categoricalColumns, props.specRole.role, props.disabledColumnName, props.selectedColumnName);\n\n    const options = referenceGroup.concat(quantitativeGroup).concat(categoricGroup).concat(directColorGroup).filter(Boolean);\n    return options;\n}\n\nexport function ColumnMap(props: Props) {\n    const options = getColumnMapOptions(props);\n    if (props.specRole.allowNone) {\n        options.unshift({\n            key: -1,\n            text: strings.selectNone,\n        });\n    }\n    const hasSelection = options.reduce((p, c) => {\n        return p || c.selected;\n    }, false);\n    if (!hasSelection) {\n        selectFirst(options);\n    }\n    let signals: NewSignal[];\n    if (props.explorer.viewer && props.explorer.viewer.vegaSpec) {\n        if (props.specRole.signals) {\n            signals = props.explorer.viewer.vegaSpec.signals.filter(s => props.specRole.signals.indexOf(s.name) >= 0);\n        }\n    }\n    const label = roleLabels[props.specRole.role];\n    const signalElements = !props.hideSignals && signals && signals.map((signal, i) => {\n        let initialValue: any;\n        try {\n            initialValue = props.explorer.viewer.vegaViewGl.signal(signal.name);\n        } catch (error) {\n            // continue regardless of error\n        }\n        return (\n            <Signal\n                key={signal.name + i + initialValue}\n                explorer={props.explorer}\n                signal={signal}\n                initialValue={initialValue}\n                onChange={value => props.onChangeSignal && props.onChangeSignal(signal.name, value)}\n                collapseLabel={props.collapseLabel}\n            />\n        );\n    });\n    return (\n        <div\n            className=\"sanddance-columnMap\"\n        >\n            {props.prefix}\n            {!props.hideDropdown && (\n                <Dropdown\n                    componentRef={props.componentRef}\n                    collapseLabel={props.collapseLabel}\n                    disabled={props.disabled}\n                    label={label}\n                    options={options}\n                    onChange={(e, o) =>\n                        props.changeColumnMapping(props.specRole.role, typeof o.data === 'string' ? o.data : SandDance.VegaMorphCharts.util.clone(o.data))\n                    }\n                    onDismiss={props.onDismiss}\n                />\n            )}\n            {signalElements}\n            {props.suffix}\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/columnTypeChanger.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Dialog } from './dialog';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { strings } from '../language';\nimport { IconButton } from './iconButton';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\n\nexport interface Props {\n    theme: string;\n    themePalette: Partial<FluentUITypes.IPalette>;\n    initialQuantitativeColumns: SandDance.types.Column[];\n    initialCategoricalColumns: SandDance.types.Column[];\n    onConfirmUpdate: (columnTypes?: SandDance.types.ColumnTypeMap) => void;\n}\n\nexport interface State {\n    dialogHidden: boolean;\n    confirmationHidden: boolean;\n    quantitativeColumns: SandDance.types.Column[];\n    categoricalColumns: SandDance.types.Column[];\n    columnTypes: SandDance.types.ColumnTypeMap;\n}\n\nfunction _ColumnTypeChanger(_props: Props) {\n    class __ColumnTypeChanger extends base.react.Component<Props, State> {\n\n        constructor(props: Props) {\n            super(props);\n            this.state = this.getInitialState();\n        }\n\n        private getInitialState(): State {\n            const { props } = this;\n            return {\n                dialogHidden: true,\n                confirmationHidden: true,\n                quantitativeColumns: props.initialQuantitativeColumns.map(c => SandDance.VegaMorphCharts.util.clone(c)),\n                categoricalColumns: props.initialCategoricalColumns.map(c => SandDance.VegaMorphCharts.util.clone(c)),\n                columnTypes: null,\n            };\n        }\n\n        private closeDialog() {\n            this.setState(this.getInitialState());\n        }\n\n        private openConfirmation(columnTypes: SandDance.types.ColumnTypeMap) {\n            this.setState({ columnTypes, confirmationHidden: false });\n        }\n\n        render() {\n            const { props, state } = this;\n            const hasChanges = props.initialQuantitativeColumns.some((c, i) => {\n                return c.quantitative !== state.quantitativeColumns[i].quantitative;\n            });\n            return (\n                <div>\n                    <base.fluentUI.DefaultButton\n                        text={strings.buttonColumnTypes}\n                        onClick={() => this.setState({ dialogHidden: false })}\n                    />\n                    <Dialog\n                        minWidth=\"80%\"\n                        hidden={state.dialogHidden}\n                        onDismiss={() => this.closeDialog()}\n                        dialogContentProps={{\n                            className: `sanddance-dialog ${props.theme}`,\n                            type: base.fluentUI.DialogType.normal,\n                            title: strings.labelColumnTypes,\n                        }}\n                        buttons={[\n                            (\n                                <base.fluentUI.DefaultButton\n                                    key=\"revert\"\n                                    text={strings.buttonResetToDefault}\n                                    onClick={() => this.openConfirmation(null)}\n                                    iconProps={{ iconName: 'Undo' }}\n                                />\n                            ),\n                            (\n                                <base.fluentUI.DefaultButton\n                                    key=\"apply\"\n                                    text={strings.buttonApply}\n                                    onClick={() => {\n                                        const columnTypes: SandDance.types.ColumnTypeMap = {};\n                                        state.quantitativeColumns.forEach(c => {\n                                            columnTypes[c.name] = c.quantitative ? c.type : 'string';\n                                        });\n                                        state.categoricalColumns.forEach(c => {\n                                            columnTypes[c.name] = 'string';\n                                        });\n                                        this.openConfirmation(columnTypes);\n                                    }}\n                                    iconProps={{ iconName: 'Accept' }}\n                                    disabled={!hasChanges}\n                                />\n                            ),\n                        ]}\n                    >\n                        <div className='sanddance-columnTypes'>\n                            {state.quantitativeColumns.length > 0 && (\n                                <div>\n                                    <h3>{strings.selectNumeric}</h3>\n                                    <table>\n                                        <thead>\n                                            <tr>\n                                                <th>{strings.labelEditColumn}</th>\n                                                <th>{strings.labelColumnName}</th>\n                                                <th>{strings.labelColumnQuantitativeMin}</th>\n                                                <th>{strings.labelColumnQuantitativeMax}</th>\n                                                <th>{strings.labelColumnQuantitativeMean}</th>\n                                                <th>{strings.labelColumnDistinct}</th>\n                                            </tr>\n                                        </thead>\n                                        <tbody>\n                                            {state.quantitativeColumns.map((c, i) => (\n                                                <tr\n                                                    key={i}\n                                                    className={c.quantitative ? '' : 'changed'}\n                                                >\n                                                    <td>\n                                                        <IconButton\n                                                            iconName='Edit'\n                                                            onClick={undefined}\n                                                            menuProps={{\n                                                                items: [strings.selectNumeric, strings.selectNonNumeric].map(t => {\n                                                                    return {\n                                                                        key: t,\n                                                                        text: t,\n                                                                        onClick: () => {\n                                                                            c.quantitative = t === strings.selectNumeric;\n                                                                            this.setState({ quantitativeColumns: [...state.quantitativeColumns] });\n                                                                        },\n                                                                    };\n                                                                }),\n                                                            }}\n                                                            themePalette={props.themePalette}\n                                                            title={strings.labelChangeColumnType}\n                                                        />\n                                                    </td>\n                                                    <td>{c.name}</td>\n                                                    <td>{c.stats.min}</td>\n                                                    <td>{c.stats.max}</td>\n                                                    <td>{c.stats.mean}</td>\n                                                    <td>{c.stats.distinctValueCount}</td>\n                                                </tr>\n                                            ))}\n                                        </tbody>\n                                    </table>\n                                </div>\n                            )}\n                            {state.categoricalColumns.length > 0 && (\n                                <div>\n                                    <h3>{strings.selectNonNumeric}</h3>\n                                    <table>\n                                        <thead>\n                                            <tr>\n                                                <th>{strings.labelColumnName}</th>\n                                                <th>{strings.labelColumnType}</th>\n                                                <th>{strings.labelColumnDistinct}</th>\n                                                <th>{strings.labelColumnHasColorData}</th>\n                                                <th>{strings.labelColumnIsColorData}</th>\n                                            </tr>\n                                        </thead>\n                                        <tbody>\n                                            {state.categoricalColumns.map((c, i) => (\n                                                <tr key={i}>\n                                                    <td>{c.name}</td>\n                                                    <td>{c.type}</td>\n                                                    <td>{c.stats.distinctValueCount}</td>\n                                                    <td>{(!!c.stats.hasColorData).toString()}</td>\n                                                    <td>{(!!c.isColorData).toString()}</td>\n                                                </tr>\n                                            ))}\n                                        </tbody>\n                                    </table>\n                                </div>\n                            )}\n                        </div>\n                    </Dialog>\n                    <Dialog\n                        hidden={state.confirmationHidden}\n                        onDismiss={() => this.setState({ confirmationHidden: true })}\n                        dialogContentProps={{\n                            className: `sanddance-dialog ${props.theme}`,\n                            type: base.fluentUI.DialogType.normal,\n                            title: strings.labelConfirmation,\n                            subText: strings.labelHistoryWarning,\n                        }}\n                        buttons={(\n                            <base.fluentUI.PrimaryButton\n                                text={strings.buttonApply}\n                                onClick={() => {\n                                    this.closeDialog();\n                                    this.props.onConfirmUpdate(this.state.columnTypes);\n                                }}\n                                iconProps={{ iconName: 'Accept' }}\n                            />\n                        )}\n                    >\n                    </Dialog>\n                </div>\n            );\n        }\n    }\n\n    return new __ColumnTypeChanger(_props);\n}\n\nexport const ColumnTypeChanger: typeof ColumnTypeChanger_Class = _ColumnTypeChanger as any;\n\nexport declare class ColumnTypeChanger_Class extends base.react.Component<Props, State> {\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/dataExporter.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { embedHtml } from './dataExporterHtml';\nimport { Dialog } from './dialog';\nimport { base } from '../base';\nimport { convertToDelimited } from '../exportDelimited';\nimport {\n    DataExportHandler,\n    DataExportType,\n    DataFile,\n} from '../interfaces';\nimport { strings } from '../language';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { SandDance, util } from '@msrvida/sanddance-react';\n\nimport Snapshot = SandDance.types.Snapshot;\n\nexport interface IInitializer {\n    fileName: string;\n}\n\nexport interface Props {\n    initializer: IInitializer;\n    data: object[];\n    dataExportHandler: DataExportHandler;\n    disabled?: boolean;\n    theme: string;\n}\n\nexport interface State {\n    initializer: IInitializer;\n    dialogHidden: boolean;\n    exportType: DataExportType;\n    fileName: string;\n    fileNameError: string;\n    working: boolean;\n    delayAction?: () => void;\n}\n\nconst exportTypes: ([DataExportType, string])[] = [\n    ['json', strings.labelExportJSON],\n    ['csv', strings.labelExportCSV],\n    ['tsv', strings.labelExportTSV],\n    ['html', strings.labelExportHTML],\n];\n\nfunction _DataExportPicker(_props: Props) {\n\n    class __DataExportPicker extends base.react.Component<Props, State> {\n        constructor(props: Props) {\n            super(props);\n            this.state = this.getInitialState(this.props);\n        }\n\n        private getInitialState(props: Props) {\n            const initialState: State = {\n                initializer: props.initializer,\n                dialogHidden: true,\n                exportType: exportTypes[0][0],\n                fileName: props.initializer.fileName,\n                fileNameError: '',\n                working: false,\n            };\n            return initialState;\n        }\n\n        componentDidUpdate() {\n            if (!util.deepCompare(this.props.initializer, this.state.initializer)) {\n                this.setState(this.getInitialState(this.props));\n            }\n        }\n\n        // Converts to dataExport type and calls dataExportHandler to deal with data\n        private createExport(exportType: DataExportType, displayName: string) {\n            const final = (data: any) => {\n                this.props.dataExportHandler(data, exportType, displayName);\n                this.close();\n            };\n            const json = JSON.stringify(this.props.data, columnReplacer);\n            switch (exportType) {\n                case 'json': {\n                    final(json);\n                    break;\n                }\n                case 'csv': {\n                    final(convertToDelimited(JSON.parse(json), ','));\n                    break;\n                }\n                case 'tsv': {\n                    final(convertToDelimited(JSON.parse(json), '\\t'));\n                    break;\n                }\n                case 'html': {\n                    const csv = convertToDelimited(JSON.parse(json), ',');\n                    const html = embedHtml(`${strings.appName} - ${escape(displayName)}`, embedScript(csv, displayName));\n                    final(html);\n                }\n            }\n        }\n\n        private close() {\n            this.setState({ dialogHidden: true, working: false });\n        }\n\n        render() {\n            const closeDialog = () => this.close();\n\n            if (this.state.delayAction) {\n                requestAnimationFrame(() => {\n                    //allow render to complete\n                    if (this.state.delayAction) {\n                        this.state.delayAction();\n                        this.setState({ delayAction: null });\n                    }\n                });\n            }\n\n            const disabled = this.state.working || this.state.dialogHidden;\n\n            return (\n                <div>\n                    <base.fluentUI.DefaultButton\n                        className=\"search-action search-bottom-action\"\n                        text={strings.buttonExportCount(this.props.data.length)}\n                        onClick={() => this.setState({ dialogHidden: false })}\n                        disabled={this.props.disabled}\n                    />\n                    <Dialog\n                        hidden={this.state.dialogHidden}\n                        onDismiss={closeDialog}\n                        dialogContentProps={{\n                            className: `sanddance-dialog ${this.props.theme}`,\n                            type: base.fluentUI.DialogType.normal,\n                            title: strings.labelExport,\n                        }}\n                        buttons={[\n                            (\n                                <base.fluentUI.PrimaryButton\n                                    key={0}\n                                    disabled={disabled || !!this.state.fileNameError}\n                                    onClick={e => this.setState({\n                                        delayAction: () => this.createExport(this.state.exportType, this.state.fileName),\n                                        working: true,\n                                    })}\n                                    text={strings.buttonExport}\n                                    iconProps={{\n                                        iconName: 'Download',\n                                    }}\n                                />\n                            ),\n                        ]}\n                    >\n                        <base.fluentUI.TextField\n                            label={strings.labelExportFileName}\n                            onChange={(e, displayName) => {\n                                const displayNameError = getFileNameError(displayName);\n                                this.setState({ fileName: displayName, fileNameError: displayNameError });\n                            }}\n                            errorMessage={this.state.fileNameError}\n                            value={this.state.fileName}\n                        />\n                        <base.fluentUI.ChoiceGroup\n                            className=\"sanddance-form-separate\"\n                            disabled={disabled}\n                            selectedKey={this.state.exportType}\n                            options={\n                                exportTypes.map(([exportType, text]) => {\n                                    return {\n                                        key: exportType,\n                                        text,\n                                        disabled: false,\n                                    } as FluentUITypes.IChoiceGroupOption;\n                                })\n                            }\n                            onChange={(ev: React.FormEvent<HTMLInputElement>, option: FluentUITypes.IChoiceGroupOption) =>\n                                this.setState({ exportType: option.key as DataExportType })\n                            }\n                            label={strings.labelExportFormat}\n                        />\n                    </Dialog>\n                </div>\n            );\n        }\n    }\n\n    return new __DataExportPicker(_props);\n}\n\nexport const DataExportPicker: typeof DataExportPicker_Class = _DataExportPicker as any;\n\nexport declare class DataExportPicker_Class extends base.react.Component<Props, State> {\n}\n\nconst illegalChars = '\\\\/:*?\"<>|';\n\nfunction getFileNameError(displayName: string) {\n    if (!displayName) {\n        return strings.errorExportFilenameEmpty;\n    }\n    for (let i = 0; i < illegalChars.length; i++) {\n        if (displayName.indexOf(illegalChars[i]) >= 0) {\n            return strings.errorExportFilenameCharacters(illegalChars);\n        }\n    }\n}\n\nexport function removeExtensions(fileName: string) {\n    exportTypes.forEach(([exportType]) => {\n        const re = new RegExp(`\\\\.${exportType}`, 'ig');\n        fileName = fileName.replace(re, '');\n    });\n    return fileName;\n}\n\nfunction columnReplacer(name: string, value: any) {\n    if (SandDance.util.isInternalFieldName(name, true)) {\n        return undefined;\n    }\n    return value === null ? '' : value;\n}\n\nfunction embedScript(csv: string, displayName: string, snapshots?: Snapshot[]) {\n    const dataFile: DataFile = { type: 'csv', displayName, snapshots };\n    return `<pre id='csv-data' style='display:none'>${csv}</pre>\n    <script>SandDanceEmbed.load(Object.assign({rawText: document.getElementById('csv-data').innerText}, ${JSON.stringify(dataFile)}))</script>`;\n}\n\nexport function getEmbedHTML(data: object[], displayName: string, snapshots?: Snapshot[]) {\n    const json = JSON.stringify(data, columnReplacer);\n    const csv = convertToDelimited(JSON.parse(json), ',');\n    const html = embedHtml(\n        `${strings.appName} - ${escape(displayName)}`,\n        embedScript(csv, displayName, snapshots),\n    );\n    return html;\n}"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/dataExporterHtml.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const embedHtml = (title: string, embed: string) => `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>${title}</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/css/sanddance-explorer.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/css/sanddance-embed.css\" />\n</head>\n<body>\n    <script src=\"https://unpkg.com/react@17/umd/react.production.min.js\"></script>\n    <script src=\"https://unpkg.com/react-dom@17/umd/react-dom.production.min.js\"></script>\n    <script src=\"https://unpkg.com/vega@6.2/build/vega.min.js\"></script>\n    <script src=\"https://unpkg.com/@fluentui/react@8/dist/fluentui-react.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/fluentui-icons@1/dist/umd/fluentui-icons.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-explorer@4/dist/umd/sanddance-explorer.js\"></script>\n    <script src=\"https://unpkg.com/@msrvida/sanddance-embed@4/dist/umd/sanddance-embed.js\"></script>\n    ${embed}\n</body>\n</html>`;"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/dataItem.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { InputSearchExpression } from './searchTerm';\nimport { base } from '../base';\nimport { InputSearchExpressionGroup } from '../dialogs/search';\nimport { DateWithSource } from '../interfaces';\nimport { KeyCodes } from '../keycodes';\nimport { strings } from '../language';\nimport { SandDance } from '@msrvida/sanddance-react';\n\nimport SearchExpressionValue = SandDance.searchExpression.SearchExpressionValue;\n\nexport interface Props {\n    item: object;\n    showSystemFields?: boolean;\n    onSearch?: { (event: React.MouseEvent<HTMLElement>, search: InputSearchExpressionGroup[]): void };\n    bingSearchDisabled: boolean;\n    disabled: boolean;\n    columns: SandDance.types.Column[];\n}\n\nfunction isNumber(value: any) {\n    if (typeof value === 'number') return true;\n    if (!isNaN(value)) return true;\n    return false;\n}\n\nfunction isBoolean(value: any) {\n    if (typeof value === 'boolean') return true;\n    if (typeof value === 'string') {\n        switch (value.toLowerCase()) {\n            case true + '':\n            case false + '':\n                return true;\n        }\n    }\n    return false;\n}\n\nfunction bingSearchLink(column: SandDance.types.Column, value: any) {\n    if (isNumber(value)) return null;\n    if (isBoolean(value)) return null;\n    if (column && column.stats.distinctValueCount === 2) return null;\n    return (\n        <div className='bing-search'>\n            <a\n                href={`https://www.bing.com/search?q=${encodeURIComponent(value)}`}\n                target='_blank'\n                title={strings.bingsearchDescription(value)}\n                aria-label={strings.bingsearchDescription(value)}\n            >{strings.bingsearch}</a>\n        </div>\n    );\n}\n\ninterface NameValuePair {\n    columnName: string;\n    value: SearchExpressionValue;\n    bingSearch?: JSX.Element;\n}\n\ninterface DisplayValue {\n    special: boolean;\n    display: string | number;\n}\n\nfunction displayValue(value: SearchExpressionValue | object): DisplayValue {\n    switch (value) {\n        case '': {\n            return { special: true, display: strings.labelBlank };\n        }\n        case null: {\n            return { special: true, display: strings.labelNull };\n        }\n        case true: {\n            return { special: true, display: strings.labelTrue };\n        }\n        case false: {\n            return { special: true, display: strings.labelFalse };\n        }\n        default: {\n            if (typeof value === 'object') {\n                if (value instanceof Date) {\n                    const d = value as DateWithSource;\n                    return displayValue(d.input);\n                }\n                return { special: false, display: value.toLocaleString() };\n            }\n            return { special: false, display: value };\n        }\n    }\n}\n\nfunction displayValueElement(nvp: NameValuePair) {\n    const d = displayValue(nvp.value);\n    if (d.special) {\n        return <i>{d.display}</i>;\n    }\n    return d.display;\n}\n\nexport function DataItem(props: Props) {\n    if (!props.item) {\n        return null;\n    }\n    const nameValuePairs: NameValuePair[] = [];\n    for (const columnName in props.item) {\n        if (columnName === SandDance.constants.GL_ORDINAL && !props.showSystemFields) {\n            continue;\n        }\n        if (SandDance.util.isInternalFieldName(columnName)) {\n            continue;\n        }\n        const nameValuePair: NameValuePair = {\n            columnName,\n            value: props.item[columnName],\n        };\n        if (!props.bingSearchDisabled) {\n            nameValuePair.bingSearch = bingSearchLink(props.columns.filter(c => c.name === columnName)[0], props.item[columnName]);\n        }\n        nameValuePairs.push(nameValuePair);\n    }\n    return (\n        <div className=\"sanddance-dataItem\">\n            {nameValuePairs.map((nameValuePair, i) => {\n                const ex: InputSearchExpression = {\n                    key: 0,\n                    name: nameValuePair.columnName,\n                    operator: '==',\n                    value: nameValuePair.value,\n                };\n                if (nameValuePair.value === null || nameValuePair.value === '') {\n                    ex.operator = 'isnullorEmpty';\n                    delete ex.value;\n                }\n                const searchClick = (e: React.MouseEvent<HTMLTableDataCellElement>) => {\n                    const search: InputSearchExpressionGroup = {\n                        key: 0,\n                        expressions: [ex],\n                    };\n                    props.onSearch(e, [search]);\n                };\n                const title = strings.tooltipSearch(nameValuePair.columnName, displayValue(nameValuePair.value).display);\n                return (\n                    <div\n                        key={i}\n                        onClick={!props.disabled ? searchClick : null}\n                        title={title}\n                        onKeyUp={e => {\n                            if (e.keyCode === KeyCodes.ENTER) {\n                                searchClick(e as any);\n                            }\n                        }}\n                        tabIndex={0}\n                        className=\"name-value\"\n                    >\n                        <div className=\"column-name\">{nameValuePair.columnName}</div>\n                        <div className=\"column-value\">{displayValueElement(nameValuePair)}</div>\n                        {nameValuePair.bingSearch}\n                    </div>\n                );\n            })}\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/dataScope.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Button } from './button';\nimport { base } from '../base';\nimport { strings } from '../language';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { util } from '@msrvida/sanddance-react';\nimport { format } from 'd3-format';\n\nexport enum DataScopeId {\n    AllData, SelectedData, FilteredData,\n}\n\nexport interface SelectedItemIndex {\n    [key: number]: number;\n}\n\nexport function resetSelectedItemIndex(selectedItemIndex: SelectedItemIndex) {\n    selectedItemIndex[DataScopeId.AllData] = 0;\n    selectedItemIndex[DataScopeId.FilteredData] = 0;\n    selectedItemIndex[DataScopeId.SelectedData] = 0;\n}\n\nexport interface DataCount {\n    all: number;\n    filtered: number;\n    selected: number;\n}\n\nexport interface Props {\n    dataSet?: React.ReactNode;\n    onDataScopeClick: (dataScopeId: DataScopeId) => void;\n    onCompactClick: () => void;\n    selectedDataScope: DataScopeId;\n    dataCount: DataCount;\n    active: boolean;\n    disabled: boolean;\n    compact: boolean;\n    themePalette: Partial<FluentUITypes.IPalette>;\n}\n\nconst shortFormat = format('.2~s');\n\nfunction short(n: number) {\n    return n === -1 ? '--' : n ? (n < 1000 ? n.toString() : shortFormat(n)) : '0';\n}\n\nexport function DataScope(props: Props) {\n    const dataCount: DataCount = {\n        all: -1,\n        filtered: -1,\n        selected: -1,\n        ...props.dataCount,\n    };\n    return props.compact ?\n        (\n            <div className={util.classList('sanddance-datascope', 'compact')}\n                onClick={props.onCompactClick}>\n                <Compact\n                    {...props}\n                    dataScopeId={DataScopeId.AllData}\n                    text={strings.selectDataSpanAll}\n                    count={dataCount.all}\n                />\n                <Compact\n                    {...props}\n                    dataScopeId={DataScopeId.FilteredData}\n                    text={strings.selectDataSpanFilter}\n                    count={dataCount.filtered}\n                />\n                <Compact\n                    {...props}\n                    dataScopeId={DataScopeId.SelectedData}\n                    text={strings.selectDataSpanSelection}\n                    count={dataCount.selected}\n                />\n            </div>\n        ) : (\n            <div className={util.classList('sanddance-datascope', 'extended', props.active && 'active')}>\n                <div>\n                    <div>{props.dataSet}</div>\n                    <div className=\"datascope-buttons\">\n                        <DataScopeButton\n                            {...props}\n                            dataScopeId={DataScopeId.AllData}\n                            text={strings.selectDataSpanAll}\n                            count={dataCount.all}\n                        />\n                        <DataScopeButton\n                            {...props}\n                            dataScopeId={DataScopeId.FilteredData}\n                            text={strings.selectDataSpanFilter}\n                            count={dataCount.filtered}\n                        />\n                        <DataScopeButton\n                            {...props}\n                            dataScopeId={DataScopeId.SelectedData}\n                            text={strings.selectDataSpanSelection}\n                            count={dataCount.selected}\n                        />\n                    </div>\n                </div>\n            </div>\n        );\n}\n\nfunction Compact(props: DataScopeButtonProps) {\n    return (\n        <div\n            title={props.text}\n            onClick={() => { props.onDataScopeClick(props.dataScopeId); }}\n        >{short(props.count)}</div>\n    );\n}\n\ninterface DataScopeButtonProps extends Props {\n    text: string;\n    count: number;\n    dataScopeId: DataScopeId;\n}\n\nfunction DataScopeButton(props: DataScopeButtonProps) {\n    return (\n        <Button\n            themePalette={props.themePalette}\n            className={util.classList('datascope-button', props.selectedDataScope === props.dataScopeId && 'selected')}\n            disabled={props.disabled}\n            text={props.text}\n            onClick={() => { props.onDataScopeClick(props.dataScopeId); }}\n            onRenderText={() => {\n                return (\n                    <div title={props.count > 0 ? props.count.toString() : ''}>\n                        <label>\n                            {props.text}\n                        </label>\n                        <div>\n                            {short(props.count)}\n                        </div>\n                    </div>\n                );\n            }}\n            onRenderIcon={() => null}\n        />\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/dialog.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { strings } from '../language';\n\nexport interface IDialogProps extends FluentUITypes.IDialogProps {\n    title?: string;\n    children?: React.ReactNode;\n    buttons?: JSX.Element | JSX.Element[];\n}\n\nexport function Dialog(props: IDialogProps) {\n    return (\n        <base.fluentUI.Dialog\n            {...props}\n            dialogContentProps={{\n                ...{\n                    type: base.fluentUI.DialogType.normal,\n                    title: props.title,\n                },\n                ...props.dialogContentProps,\n            }}\n        >\n            <div\n                onKeyUp={e => {\n                    e.nativeEvent.stopImmediatePropagation();\n                }}\n            >\n                {props.children}\n            </div>\n            <base.fluentUI.DialogFooter>\n                {props.buttons}\n                <base.fluentUI.DefaultButton\n                    iconProps={{ iconName: 'Cancel' }}\n                    onClick={props.onDismiss}\n                    text={strings.buttonClose}\n                />\n            </base.fluentUI.DialogFooter>\n        </base.fluentUI.Dialog>\n\n    );\n}"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/dropdown.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\n\nexport const dropdownWidth = 200;\n\nexport interface IDropdownProps extends FluentUITypes.IDropdownProps {\n    collapseLabel?: boolean;\n}\n\nexport function Dropdown(props: IDropdownProps) {\n    const newProps = { ...props };\n    let selectedKey: string | number = null;\n    if (newProps.options && newProps.options.length > 1) {\n        const selectedOptions = newProps.options.filter(option => option.selected);\n        if (selectedOptions && selectedOptions.length > 0) {\n            selectedKey = selectedOptions[0].key;\n        }\n    }\n    if (newProps.collapseLabel) {\n        newProps.onRenderTitle = ((a, b) => {\n            return (\n                <span>\n                    {newProps.label}: {(a[0] as FluentUITypes.IDropdownOption).text}\n                </span>\n            );\n        });\n    }\n    return (\n        <base.fluentUI.Dropdown\n            dropdownWidth={dropdownWidth}\n            {...newProps}\n            label={newProps.collapseLabel ? null : newProps.label}\n            selectedKey={selectedKey}\n        />\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/group.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { util } from '@msrvida/sanddance-react';\n\nexport interface Props {\n    label: string;\n    labelCount?: string;\n    children?: React.ReactNode;\n    className?: string;\n}\n\nexport function Group(props: Props) {\n    return (\n        <div className={util.classList('sanddance-group', props.className)}>\n            <div className=\"group-head\">\n                <label>{props.label}</label>\n                {props.labelCount && <span className=\"count\">({props.labelCount})</span>}\n            </div>\n            {props.children && (\n                <div className=\"group-body\">\n                    {props.children}\n                </div>\n            )}\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/iconButton.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\n\nexport interface IIconButtonProps {\n    className?: string;\n    disabled?: boolean;\n    iconName: string;\n    onClick: { (event: React.MouseEvent<{}>): void };\n    onMouseOver?: { (event: React.MouseEvent<{}>): void };\n    menuProps?: FluentUITypes.IContextualMenuProps;\n    title: string;\n    themePalette: Partial<FluentUITypes.IPalette>;\n    role?: string;\n    styles?: FluentUITypes.IButtonStyles;\n}\n\nexport function IconButton(props: IIconButtonProps) {\n    return (\n        <base.fluentUI.IconButton\n            {...props}\n            styles={\n                props.styles\n                ||\n                {\n                    root: {\n                        color: props.themePalette.black,\n                    },\n                    rootHovered: {\n                        background: 'transparent',\n                        color: props.themePalette.themePrimary,\n                    },\n                    rootPressed: {\n                        background: 'transparent',\n                    },\n                    menuIcon: {\n                        display: 'none',\n                    },\n                }\n            }\n            iconProps={{ iconName: props.iconName }}\n            menuProps={props.menuProps}\n        />\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport * from './dialog';\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/logo.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\n\nconst s = `\n ......\n.......\n...\n......\n ......\n    ...\n.......\n......\n`;\n\nconst d = s.split('\\n').map((row, irow) =>\n    row.length\n        ? row.split('').map((char, icol) =>\n            char.trim()\n                ? `M${2 * icol + 1} ${2 * (irow - 1) + 1} v1 h1 v-1 Z`\n                : '',\n        ).join(' ')\n        : '',\n).join('\\n');\n\nexport function Logo() {\n    return (\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\">\n            <path d={d} />\n        </svg>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/renderer.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { Explorer_Class } from '../explorer';\nimport { strings } from '../language';\nimport { IconButton } from './iconButton';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { Dialog } from './dialog';\nimport { Button } from './button';\n\nexport interface Props {\n    explorer: Explorer_Class;\n    themePalette: Partial<FluentUITypes.IPalette>;\n    onHomeClick: () => void;\n    advanced: boolean;\n    advancedOptions: SandDance.VegaMorphCharts.types.AdvancedRendererOptions;\n    basicOptions: SandDance.VegaMorphCharts.types.BasicRendererOptions;\n}\n\nexport interface State {\n    viewer: SandDance.Viewer;\n    showOptions: boolean;\n}\n\nfunction _Renderer(_props: Props) {\n\n    class __Renderer extends base.react.Component<Props, State> {\n        private mounted: boolean;\n\n        constructor(props: Props) {\n            super(props);\n            this.state = this.getInitialState(props);\n            if (!this.state.viewer?.presenter?.morphchartsref) {\n                const t = setInterval(() => {\n                    const newState = this.getInitialState(props);\n                    if (this.mounted && newState.viewer?.presenter?.morphchartsref) {\n                        clearInterval(t);\n                        this.setState(newState);\n                    }\n                }, 10);\n            }\n        }\n        \n        componentDidMount() {\n            this.mounted = true;\n        }\n\n        componentWillUnmount() {\n            this.mounted = false;\n        }\n\n        getInitialState(props: Props): State {\n            const { viewer } = props.explorer;\n            return {\n                showOptions: false,\n                viewer,\n            };\n        }\n\n        setOptions(newOptions: Partial<SandDance.VegaMorphCharts.types.MorphChartsRendererOptions>) {\n            const { explorer } = this.props;\n            const renderer: SandDance.VegaMorphCharts.types.MorphChartsRendererOptions = {\n                ...explorer.state.renderer,\n                ...newOptions,\n            };\n            const { onSetupOptionsChanged } = explorer.props;\n            if (onSetupOptionsChanged) {\n                const setup = explorer.getSetup();\n                setup.renderer = renderer;\n                onSetupOptionsChanged(setup);\n            }\n            explorer.setState({ renderer });\n        }\n\n        setBasicOptions(newOptions: Partial<SandDance.VegaMorphCharts.types.BasicRendererOptions>) {\n            this.setOptions({\n                advanced: false,\n                basicOptions: {\n                    ...this.props.basicOptions,\n                    ...newOptions,\n                },\n            });\n        }\n\n        setAdvancedOptions(newOptions: Partial<SandDance.VegaMorphCharts.types.AdvancedRendererOptions>) {\n            this.setOptions({\n                advanced: true,\n                advancedOptions: {\n                    ...this.props.advancedOptions,\n                    ...newOptions,\n                },\n            });\n        }\n\n        render() {\n            const { props, state } = this;\n\n            const iconButtonStyles: FluentUITypes.IButtonStyles = {\n                menuIcon: {\n                    display: 'none',\n                },\n            };\n\n            if (!state.viewer?.presenter?.morphchartsref) {\n                return (\n                    <IconButton\n                        styles={iconButtonStyles}\n                        className='sanddance-advanced-renderer'\n                        disabled={true}\n                        iconName={'HourGlass'}\n                        onClick={undefined}\n                        themePalette={props.themePalette}\n                        title={strings.labelRenderer}\n                    />\n                );\n            } else {\n                const { morphchartsref } = state.viewer.presenter;\n\n                const choiceButtonStyle: FluentUITypes.IStyle = {\n                    border: 'none',\n                };\n\n                const { advanced, advancedOptions, basicOptions } = props;\n\n                return (\n                    <div>\n                        <IconButton\n                            iconName='PicturePosition'\n                            title={strings.buttonCameraHome}\n                            onClick={props.onHomeClick}\n                            styles={iconButtonStyles}\n                            themePalette={props.themePalette}\n                        />\n                        <IconButton\n                            styles={iconButtonStyles}\n                            className='sanddance-advanced-renderer'\n                            iconName={advanced ? 'DiamondSolid' : 'Diamond'}\n                            disabled={!morphchartsref.supportedRenders.advanced}\n                            onClick={undefined}\n                            themePalette={props.themePalette}\n                            title={morphchartsref.supportedRenders.advanced ? strings.labelRenderer : strings.labelRendererAdvancedDisabled}\n                            menuProps={{\n                                items: [\n                                    {\n                                        key: 'basic',\n                                        text: strings.labelRendererBasic,\n                                        iconProps: {\n                                            iconName: advanced ? null : 'RadioBullet',\n                                        },\n                                        onClick: () => advanced && this.setOptions({ advanced: false }),\n                                        //disabled: !advanced,\n                                    },\n                                    {\n                                        key: 'advanced',\n                                        text: strings.labelRendererAdvanced,\n                                        iconProps: {\n                                            iconName: advanced ? 'RadioBullet' : null,\n                                        },\n                                        onClick: () => !advanced && this.setOptions({ advanced: true }),\n                                        //disabled: advanced,\n                                    },\n                                    {\n                                        key: 'options',\n                                        text: strings.labelRendererOptions,\n                                        onClick: (e) => this.setState({ showOptions: true }),\n                                    },\n                                ],\n                            }}\n                        />\n                        <Dialog\n                            hidden={!state.showOptions}\n                            dialogContentProps={{\n                                className: 'sanddance-renderer-dialog',\n                                title: strings.labelRendererOptionsDialogTitle,\n                            }}\n                            onDismiss={() => this.setState({ showOptions: false })}\n                        >\n                            <div>\n                                <Button\n                                    iconName={advanced ? 'RadioBtnOff' : 'RadioBtnOn'}\n                                    onClick={() => this.setOptions({ advanced: false })}\n                                    text={strings.labelRendererBasic}\n                                    themePalette={props.themePalette}\n                                    rootStyle={choiceButtonStyle}\n                                />\n                                <ul>\n                                    <li>\n                                        <base.fluentUI.Toggle\n                                            checked={basicOptions.antialias}\n                                            label={strings.labelRendererOptionsAntialias}\n                                            onChange={(e, antialias) => this.setBasicOptions({ antialias })}\n                                        />\n                                    </li>\n                                </ul>\n                            </div>\n                            <div>\n                                <Button\n                                    iconName={advanced ? 'RadioBtnOn' : 'RadioBtnOff'}\n                                    onClick={() => this.setOptions({ advanced: true })}\n                                    text={strings.labelRendererAdvanced}\n                                    themePalette={props.themePalette}\n                                    rootStyle={choiceButtonStyle}\n                                />\n                                <ul>\n                                    <li>\n                                        <base.fluentUI.Toggle\n                                            checked={advancedOptions.isShadowEnabled}\n                                            label={strings.labelRendererOptionsShadow}\n                                            onChange={(e, isShadowEnabled) => this.setAdvancedOptions({ isShadowEnabled })}\n                                        />\n                                    </li>\n                                    <li>\n                                        <base.fluentUI.Toggle\n                                            checked={advancedOptions.isSsaoEnabled}\n                                            label={strings.labelRendererOptionsSsao}\n                                            onChange={(e, isSsaoEnabled) => this.setAdvancedOptions({ isSsaoEnabled })}\n                                        />\n                                    </li>\n                                    <li>\n                                        <base.fluentUI.Toggle\n                                            checked={advancedOptions.isBloomEnabled}\n                                            label={strings.labelRendererOptionsBloom}\n                                            onChange={(e, isBloomEnabled) => this.setAdvancedOptions({ isBloomEnabled })}\n                                        />\n                                        <ul>\n                                            <li>\n                                                <base.fluentUI.Slider\n                                                    value={advancedOptions.bloomIntensity}\n                                                    min={0.1}\n                                                    max={5}\n                                                    step={0.01}\n                                                    label={strings.labelRendererOptionsBloomIntensity}\n                                                    onChange={bloomIntensity => this.setAdvancedOptions({ bloomIntensity, isBloomEnabled: true })}\n                                                />\n                                            </li>\n                                        </ul>\n                                    </li>\n                                    <li>\n                                        <base.fluentUI.Toggle\n                                            checked={advancedOptions.isDofEnabled}\n                                            label={strings.labelRendererOptionsDof}\n                                            onChange={(e, isDofEnabled) => this.setAdvancedOptions({ isDofEnabled })}\n                                        />\n                                        <ul>\n                                            <li>\n                                                <base.fluentUI.Slider\n                                                    value={advancedOptions.dofFocusRange}\n                                                    min={0}\n                                                    max={2}\n                                                    step={0.01}\n                                                    label={strings.labelRendererOptionsDofRange}\n                                                    onChange={dofFocusRange => this.setAdvancedOptions({ dofFocusRange, isDofEnabled: true })}\n                                                />\n                                            </li>\n                                        </ul>\n                                    </li>\n                                    <li>\n                                        <base.fluentUI.Toggle\n                                            checked={advancedOptions.isFxaaEnabled}\n                                            label={strings.labelRendererOptionsFxaa}\n                                            onChange={(e, isFxaaEnabled) => this.setAdvancedOptions({ isFxaaEnabled })}\n                                        />\n                                    </li>\n                                </ul>\n                            </div>\n                        </Dialog>\n                    </div>\n                );\n            }\n        }\n    }\n\n    return new __Renderer(_props);\n}\n\nexport const Renderer: typeof Renderer_Class = _Renderer as any;\n\nexport declare class Renderer_Class extends base.react.Component<Props, State> {\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/scrollable.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { util } from '@msrvida/sanddance-react';\n\nexport interface Props {\n    children: React.ReactNode;\n    className?: string;\n    role?: string;\n}\n\nexport function Scrollable(props: Props) {\n    return (\n        <div className={util.classList('scrollable-container', props.className)} role={props.role}>\n            <div className=\"scrollable\">\n                {props.children}\n            </div>\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/searchTerm.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Dropdown, dropdownWidth } from './dropdown';\nimport { TextField } from './textfield';\nimport { base } from '../base';\nimport { strings } from '../language';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { SandDance } from '@msrvida/sanddance-react';\n\nimport SearchExpression = SandDance.searchExpression.SearchExpression;\nimport SearchExpressionClause = SandDance.searchExpression.SearchExpressionClause;\nimport SearchExpressionOperators = SandDance.searchExpression.SearchExpressionOperators;\n\nexport const maxAutocomplete = 100;\n\nexport interface AutoCompleteDistinctValues {\n    [columnName: string]: any[];\n}\n\nexport interface InputSearchExpression extends SearchExpression {\n    key: number;\n    unlocked?: boolean;\n    errorMessage?: string;\n}\n\nexport function getValidOperators(column: SandDance.types.Column): [SearchExpressionOperators, string][] {\n    const type = column && column.type;\n    switch (type) {\n        case 'boolean':\n            return [\n                ['==', strings.searchEQ],\n                ['!=', strings.searchNEQ],\n                ['isnullorEmpty', strings.searchNULL],\n            ];\n        case 'date':\n        case 'integer':\n        case 'number':\n            return [\n                ['==', strings.searchEQ],\n                ['!=', strings.searchNEQ],\n                ['>', strings.searchGT],\n                ['>=', strings.searchGTE],\n                ['<', strings.searchLT],\n                ['<=', strings.searchLTE],\n                ['isnullorEmpty', strings.searchNULL],\n            ];\n        case 'string':\n        default:\n            return [\n                ['==', strings.searchEQ],\n                ['!=', strings.searchNEQ],\n                ['>', strings.searchGT],\n                ['>=', strings.searchGTE],\n                ['<', strings.searchLT],\n                ['<=', strings.searchLTE],\n                ['contains', strings.searchIN],\n                ['starts', strings.searchSW],\n                ['isnullorEmpty', strings.searchNULL],\n            ];\n    }\n}\n\nexport interface Props {\n    collapseLabels: boolean;\n    index: number;\n    columns: SandDance.types.Column[];\n    data: object[];\n    searchExpression: InputSearchExpression;\n    disableOR: boolean;\n    autoCompleteDistinctValues: AutoCompleteDistinctValues;\n    onUpdateExpression: { (ex: Partial<InputSearchExpression>, index: number): void };\n    column: SandDance.types.Column;\n    dropdownRef?: React.RefObject<FluentUITypes.IDropdown>;\n}\n\nfunction getExpressionClauses(currClause: SearchExpressionClause, disableOR: boolean) {\n    const keys: [SearchExpressionClause, string][] = [\n        ['&&', strings.searchAND],\n    ];\n    if (!disableOR) {\n        keys.push(['||', strings.searchOR]);\n    }\n    return keys.map((key: [SearchExpressionClause, string], i: number) => {\n        const [clause, text] = key;\n        const selected = currClause == clause; //deliberate double equal \n        const option: FluentUITypes.IDropdownOption = {\n            key: i,\n            text,\n            data: clause,\n            selected,\n        };\n        return option;\n    });\n}\n\nfunction getOperators(ex: InputSearchExpression, column: SandDance.types.Column) {\n    let anySelected = false;\n    const validOperators = getValidOperators(column);\n    const options = validOperators.map(validoperator => {\n        const [op, text] = validoperator;\n        const selected = ex.operator === op;\n        anySelected = anySelected || selected;\n        const option: FluentUITypes.IDropdownOption = {\n            key: op,\n            text,\n            data: op,\n            selected,\n        };\n        return option;\n    });\n    if (!anySelected) {\n        options[0].selected = true;\n    }\n    return options;\n}\n\nfunction getDistinctValues(data: object[], columnName: string) {\n    const distinctMap = {};\n    for (let i = 0; i < data.length; i++) {\n        const row = data[i];\n        const value = row[columnName];\n        distinctMap[value] = true;\n    }\n    return Object.keys(distinctMap).sort();\n}\n\nfunction getValues(ex: InputSearchExpression, column: SandDance.types.Column, data: object[], autoCompleteDistinctValues: { [columnName: string]: any[] }): FluentUITypes.IComboBoxOption[] {\n    const stats = column && column.stats;\n    if (stats && stats.distinctValueCount < maxAutocomplete) {\n        if (!autoCompleteDistinctValues[column.name]) {\n            autoCompleteDistinctValues[column.name] = getDistinctValues(data, column.name);\n        }\n        return autoCompleteDistinctValues[column.name].map((v, i) => ({\n            key: i,\n            text: v,\n        } as FluentUITypes.IComboBoxOption));\n    }\n    return [];\n}\n\nexport function getText(ex: InputSearchExpression) {\n    if (ex.operator === 'isnullorEmpty') return '';\n    return (typeof ex.value === 'string') ? ex.value : ex.value == null ? '' : ex.value.toString();\n}\n\nexport function SearchTerm(props: Props) {\n    const ex = props.searchExpression;\n    const possibleValues = getValues(ex, props.column, props.data, props.autoCompleteDistinctValues);\n\n    //TODO better date handling with calendar picker\n\n    return (\n        <div>\n            {props.index > 0 && (\n                <Dropdown\n                    collapseLabel={props.collapseLabels}\n                    className=\"search-field\"\n                    label={strings.labelSearchClause}\n                    dropdownWidth={120}\n                    disabled={!ex.unlocked || props.disableOR}\n                    options={getExpressionClauses(ex.clause, props.disableOR)}\n                    onChange={(e, o) => props.onUpdateExpression({ clause: (o.data as SearchExpressionClause) }, props.index)}\n                />\n            )}\n            <Dropdown\n                componentRef={props.dropdownRef}\n                collapseLabel={props.collapseLabels}\n                className=\"search-field\"\n                label={strings.labelSearchColumn}\n                options={[\n                    {\n                        key: '',\n                        text: strings.selectAny,\n                        data: null,\n                        selected: ex.name === null,\n                    },\n                ].concat(props.columns.map((c, i) => ({\n                    key: c.name,\n                    text: c.name,\n                    data: c,\n                    selected: c.name === ex.name,\n                })))}\n                onChange={(e, o) => props.onUpdateExpression({ name: (o.data && (o.data as SandDance.types.Column).name) || null }, props.index)}\n            />\n            <Dropdown\n                collapseLabel={props.collapseLabels}\n                className=\"search-field\"\n                label={strings.labelSearchOperator}\n                dropdownWidth={120}\n                options={getOperators(ex, props.column)}\n                onChange={(e, o) => props.onUpdateExpression({ operator: (o.data) as SearchExpressionOperators }, props.index)}\n            />\n            {possibleValues.length > 0 && (\n                <base.fluentUI.ComboBox\n                    className=\"search-field\"\n                    label={props.collapseLabels ? null : strings.labelSearchValue}\n                    placeholder={strings.labelSearchValuePlaceholder}\n                    disabled={ex.operator === 'isnullorEmpty'}\n                    dropdownWidth={dropdownWidth}\n                    allowFreeform={true}\n                    autoComplete=\"on\"\n                    errorMessage={ex.errorMessage}\n                    text={getText(ex)}\n                    options={getValues(ex, props.column, props.data, props.autoCompleteDistinctValues)}\n                    onChange={\n                        (\n                            e: React.FormEvent<FluentUITypes.IComboBox>,\n                            o?: FluentUITypes.IComboBoxOption,\n                            i?: number,\n                            value?: string,\n                        ) => {\n                            if (o) {\n                                value = o.text;\n                            }\n                            props.onUpdateExpression({ value }, props.index);\n                        }\n                    }\n                />\n            )}\n            {possibleValues.length === 0 && (\n                <TextField\n                    className=\"search-field\"\n                    label={props.collapseLabels ? null : strings.labelSearchValue}\n                    placeholder={strings.labelSearchValuePlaceholder}\n                    disabled={ex.operator === 'isnullorEmpty'}\n                    errorMessage={ex.errorMessage}\n                    value={getText(ex)}\n                    onChange={(e, v) => props.onUpdateExpression({ value: v }, props.index)}\n                />\n            )}\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/sideButton.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { IconButton } from './iconButton';\nimport { SideTabId } from '../interfaces';\nimport { util } from '@msrvida/sanddance-react';\nimport { IButtonProps } from '@msrvida/fluentui-react-cdn-typings/types';\n\nexport interface BaseProps {\n    onSideTabClick: (sideTabId: SideTabId) => void;\n    selectedSideTab: SideTabId;\n    closed: boolean;\n    themePalette: Partial<FluentUITypes.IPalette>;\n}\n\nexport interface SidebuttonProps {\n    iconName: string;\n    title: string;\n    sideTabId: SideTabId;\n    badgeText?: string;\n    themePalette?: Partial<FluentUITypes.IPalette>;\n    role?: string;\n    omitAriaSelected?: boolean;\n}\n\nexport function Sidebutton(props: SidebuttonProps & BaseProps) {\n    const selected = !props.closed && props.selectedSideTab === props.sideTabId;\n    const buttonProps: IButtonProps = props.omitAriaSelected ? {} : {\n        'aria-selected': selected,\n    };\n    return (\n        <div className={util.classList('vbutton', selected && 'selected')}>\n            {props.badgeText && <div className=\"count\">{props.badgeText}</div>}\n            {<IconButton\n                {...buttonProps}\n                role={props.role || 'tab'}\n                themePalette={props.themePalette}\n                className=\"vbutton\"\n                iconName={props.iconName}\n                title={props.title}\n                onClick={() => { props.onSideTabClick(props.sideTabId); }}\n            />}\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/sidebar.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { DataScope, Props as DataScopeProps } from './dataScope';\nimport { Scrollable } from './scrollable';\nimport { SideTabId } from '../interfaces';\nimport { strings } from '../language';\nimport { util } from '@msrvida/sanddance-react';\nimport { BaseProps, Sidebutton, SidebuttonProps } from './sideButton';\n\nexport interface Props extends BaseProps {\n    calculating: boolean;\n    children: React.ReactNode;\n    hideSidebarControls: boolean;\n    snapshotsHidden: boolean;\n    disabled: boolean;\n    dataScopeProps: DataScopeProps;\n    pinned: boolean;\n}\n\nexport function Sidebar(props: Props) {\n    const sidebuttons: SidebuttonProps[] = [\n        {\n            sideTabId: SideTabId.ChartType,\n            iconName: 'BIDashboard',\n            title: strings.labelChart,\n        },\n        {\n            sideTabId: SideTabId.Color,\n            iconName: 'Color',\n            title: strings.labelColor,\n        },\n        {\n            sideTabId: SideTabId.Data,\n            iconName: 'Table',\n            title: strings.labelDataBrowser,\n        },\n        {\n            sideTabId: SideTabId.Search,\n            iconName: 'Search',\n            title: strings.labelSearch,\n        },\n        !props.snapshotsHidden && {\n            sideTabId: SideTabId.Snapshots,\n            iconName: 'Camera',\n            title: strings.labelSnapshots,\n        },\n        {\n            sideTabId: SideTabId.History,\n            iconName: 'History',\n            title: strings.labelHistory,\n        },\n        {\n            sideTabId: SideTabId.Transition,\n            iconName: 'Flow',\n            title: strings.labelTransition,\n        },\n        {\n            sideTabId: SideTabId.Settings,\n            iconName: 'Settings',\n            title: strings.labelChartSettings,\n        },\n    ].filter(Boolean);\n    return (\n        <div className={util.classList('sanddance-sidebar', 'calculator', props.pinned && 'pinned', props.closed && 'closed')}>\n            <div className=\"sidebar-content\">\n                <DataScope\n                    {...props.dataScopeProps}\n                />\n                <div className=\"vbuttons\">\n                    <div className=\"sidebar-dialogs\" role='tablist'>\n                        {sidebuttons.map((sidebutton, i) => (\n                            <Sidebutton\n                                key={i}\n                                {...props}\n                                {...sidebutton}\n                                themePalette={props.themePalette}\n                            />\n                        ))}\n                    </div>\n                    {!props.hideSidebarControls && (\n                        <div className=\"sidebar-controls\">\n                            <Sidebutton\n                                {...props}\n                                omitAriaSelected={true}\n                                role='button'\n                                sideTabId={SideTabId.Pin}\n                                iconName={props.pinned ? 'Pinned' : 'Pin'}\n                                title={props.pinned ? strings.buttonToolbarFloat : strings.buttonToolbarDock}\n                            />\n                            <Sidebutton\n                                {...props}\n                                omitAriaSelected={true}\n                                role='button'\n                                sideTabId={SideTabId.Collapse}\n                                iconName={props.closed ? 'DoubleChevronRight12' : 'DoubleChevronLeft12'}\n                                title={props.closed ? strings.buttonToolbarShow : strings.buttonToolbarHide}\n                            />\n                        </div>\n                    )}\n                </div>\n                <Scrollable role='tabpanel'>\n                    <div className=\"sidetab\">\n                        {props.children}\n                    </div>\n                </Scrollable>\n                {props.calculating && (\n                    <div className=\"calculating\">\n                        <base.fluentUI.Spinner\n                            size={base.fluentUI.SpinnerSize.large}\n                        />\n                    </div>\n                )}\n            </div>\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/signal.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport {\n    BindCheckbox,\n    Binding,\n    BindRadioSelect,\n    BindRange,\n    NewSignal,\n} from 'vega-typings';\nimport { Explorer_Class } from '../explorer';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\n\nexport interface Props {\n    initialValue: any;\n    newViewStateTarget?: boolean;\n    collapseLabel?: boolean;\n    explorer: Explorer_Class;\n    signal: NewSignal;\n    prefix?: string;\n    disabled?: boolean;\n    onChange?: (value: any) => void;\n    componentRef?: any;\n}\n\nexport function getInitialSignalValue(explorer: Explorer_Class, signal: NewSignal) {\n    let initialValue: any;\n    try {\n        initialValue = explorer.viewer.vegaViewGl.signal(signal.name);\n    } catch (error) {\n        // continue regardless of error\n    }\n    return initialValue;\n}\n\nexport function Signal(props: Props) {\n    if (!props.explorer.viewer || !props.signal) {\n        return null;\n    }\n    if (props.signal.bind) {\n        const input = (props.signal.bind as BindCheckbox | BindRadioSelect | BindRange).input;\n        if (input) {\n            const fn = map[input];\n            if (fn) {\n                const prefix = props.prefix ? `${props.prefix} ` : '';\n                const control = fn(\n                    prefix,\n                    props.signal.bind,\n                    props.initialValue,\n                    (value) => {\n                        props.onChange && props.onChange(value);\n                        props.explorer.signal(props.signal.name, value, props.newViewStateTarget);\n                    },\n                    props.disabled,\n                    props.collapseLabel,\n                    props.componentRef,\n                );\n                return (\n                    <div className=\"sanddance-signal\">\n                        {control}\n                    </div>\n                );\n            }\n        }\n    }\n    return null;\n}\n\nconst map: { [input: string]: (prefix: string, bind: Binding, initialValue: any, onChange: (value: any) => void, disabled: boolean, collapseLabel: boolean, ref: any) => JSX.Element } = {};\n\nmap['range'] = (prefix: string, bind: BindRange, initialValue: number, onChange: (value: number) => void, disabled: boolean, collapseLabel: boolean, ref: any) => {\n    let debouncer: number;\n    return (\n        <base.fluentUI.Slider\n            componentRef={ref}\n            label={prefix + bind.name}\n            max={bind.max}\n            min={bind.min}\n            step={bind.step}\n            defaultValue={initialValue}\n            onChange={value => {\n                if (debouncer) {\n                    clearTimeout(debouncer);\n                }\n                debouncer = setTimeout(() => onChange(value), bind.debounce || 0);\n            }}\n            disabled={disabled}\n        />\n    );\n};\n\nmap['select'] = (prefix: string, bind: BindRadioSelect, initialValue: any, onChange: (value: any) => void, disabled: boolean, collapseLabel: boolean, ref: any) => {\n    const options = bind.options.map((o, i) => {\n        const option: FluentUITypes.IDropdownOption = {\n            key: o,\n            text: o,\n        };\n        return option;\n    });\n    const label = prefix + bind.name;\n    return (\n        <base.fluentUI.Dropdown\n            componentRef={ref}\n            onRenderTitle={collapseLabel ?\n                ((a, b) => (\n                    <span>\n                        {label}: {(a[0] as FluentUITypes.IDropdownOption).text}\n                    </span>\n                ))\n                :\n                undefined}\n            defaultSelectedKey={initialValue}\n            label={collapseLabel ? undefined : label}\n            options={options}\n            onChange={(e, o) => onChange(o.text)}\n            disabled={disabled}\n        />\n    );\n};\n\nmap['checkbox'] = (prefix: string, bind: BindCheckbox, initialValue: boolean, onChange: (checked: boolean) => void, disabled: boolean, collapseLabel: boolean, ref: any) => {\n    return (\n        <base.fluentUI.Toggle\n            componentRef={ref}\n            defaultChecked={initialValue}\n            label={prefix + bind.name}\n            onChange={(e, checked?: boolean) => onChange(checked)}\n            disabled={disabled}\n        />\n    );\n};\n\n//TODO other signal types\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/textfield.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { ITextFieldProps } from '@msrvida/fluentui-react-cdn-typings/types';\n\nexport function TextField(props: ITextFieldProps) {\n    return (\n        <base.fluentUI.TextField\n            onKeyUp={e => {\n                e.nativeEvent.stopImmediatePropagation();\n            }}\n            {...props}\n        />\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/toggleColumns.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { SandDance } from '@msrvida/sanddance-react';\n\nexport interface Props {\n    allColumns: SandDance.types.Column[];\n    exclusions: string[];\n    toggleExclusion: (columnName: string) => void;\n}\n\nexport function ToggleColumns(props: Props) {\n    return (\n        <div>\n            {props.allColumns.map((c, i) => (\n                <div key={c.name}>\n                    <label>\n                        <base.fluentUI.Toggle\n                            checked={props.exclusions.indexOf(c.name) < 0}\n                            inlineLabel={true}\n                            label={c.name}\n                            onChange={() => props.toggleExclusion(c.name)}\n                        />\n                    </label>\n                </div>\n            ))}\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/controls/topbar.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { CommandBarButtonStyles } from './CommandBarButton.styles';\nimport { Logo } from './logo';\nimport { base } from '../base';\nimport { HistoryItem } from '../dialogs/history';\nimport { strings } from '../language';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { SandDance } from '@msrvida/sanddance-react';\n\nimport Search = SandDance.searchExpression.Search;\n\nexport interface Props {\n    collapseLabels: boolean;\n    logoClickUrl: string;\n    logoClickTarget: string;\n    buttons?: FluentUITypes.ICommandBarItemProps[];\n    iconButtons?: FluentUITypes.ICommandBarItemProps[];\n    doFilter: { (search: Search, historicFilterChange: string): void };\n    doUnfilter: (historicFilterChange: string) => void;\n    doDeselect: () => void;\n    filter: Search;\n    loaded: boolean;\n    selectionState: SandDance.types.SelectionState;\n    selectionSearch: Search;\n    view: SandDance.types.View;\n    snapshotsHidden: boolean;\n    snapshots: SandDance.types.Snapshot[];\n    onSnapshotClick: () => void;\n    onSnapshotNextClick: () => void;\n    onSnapshotPreviousClick: () => void;\n    onViewClick: () => void;\n    themePalette: Partial<FluentUITypes.IPalette>;\n    historyIndex: number;\n    historyItems: HistoryItem[];\n    undo: () => void;\n    redo: () => void;\n}\n\nexport function Topbar(props: Props) {\n    const zeroResults = props.selectionState.selectedData && props.selectionState.selectedData.length === 0;\n    const disabled = !props.loaded;\n    const items: FluentUITypes.ICommandBarItemProps[] = [\n        {\n            key: 'undo',\n            name: strings.buttonUndo,\n            iconProps: {\n                iconName: 'Undo',\n            },\n            disabled: disabled || props.historyItems.length === 0 || props.historyIndex === 0,\n            onClick: props.undo,\n        },\n        {\n            key: 'redo',\n            name: strings.buttonRedo,\n            iconProps: {\n                iconName: 'Redo',\n            },\n            disabled: disabled || props.historyItems.length <= 1 || props.historyIndex >= props.historyItems.length - 1,\n            onClick: props.redo,\n        },\n        {\n            key: 'deselect',\n            name: strings.buttonDeselect,\n            iconProps: {\n                iconName: 'Cancel',\n            },\n            disabled: disabled || !props.selectionSearch,\n            onClick: props.doDeselect,\n        },\n        {\n            key: 'isolate',\n            name: strings.buttonIsolate,\n            iconProps: {\n                iconName: 'Filter',\n            },\n            disabled: disabled || !props.selectionSearch || zeroResults,\n            onClick: () => props.doFilter(props.selectionSearch, strings.labelHistoryFilterIsolate),\n        },\n        {\n            key: 'exclude',\n            name: strings.buttonExclude,\n            iconProps: {\n                iconName: 'ClearFilter',\n            },\n            disabled: disabled || !props.selectionSearch || zeroResults,\n            onClick: () => props.doFilter(SandDance.searchExpression.invert(props.selectionSearch), strings.labelHistoryFilterIExclude),\n        },\n        {\n            key: 'reset',\n            name: strings.buttonReset,\n            iconProps: {\n                iconName: 'RemoveFilter',\n            },\n            disabled: disabled || !props.filter,\n            onClick: () => props.doUnfilter(strings.labelHistoryFilterClear),\n        },\n    ];\n    if (props.buttons) {\n        items.push.apply(items, props.buttons);\n    }\n    if (props.collapseLabels) {\n        items.forEach(item => item.iconOnly = true);\n    }\n    const farItems: FluentUITypes.ICommandBarItemProps[] = [];\n    if (!props.snapshotsHidden) {\n        farItems.push({\n            key: 'previous-snapshot',\n            iconProps: {\n                iconName: 'Previous',\n            },\n            title: strings.buttonPrevSnapshot,\n            onClick: props.onSnapshotPreviousClick,\n            disabled: !props.snapshots || props.snapshots.length < 2,\n        },\n        {\n            key: 'snapshot',\n            iconProps: {\n                iconName: 'Camera',\n            },\n            title: strings.buttonCreateSnapshot,\n            onClick: props.onSnapshotClick,\n            disabled: !props.loaded,\n        },\n        {\n            key: 'next-snapshot',\n            iconProps: {\n                iconName: 'Next',\n            },\n            title: strings.buttonNextSnapshot,\n            onClick: props.onSnapshotNextClick,\n            disabled: !props.snapshots || props.snapshots.length < 2,\n        });\n    }\n    farItems.push(\n        {\n            key: 'view',\n            iconProps: {\n                iconName: props.view === '2d' ? 'CubeShape' : 'Page',\n            },\n            title: props.view === '2d' ? strings.labelViewType3d : strings.labelViewType2d,\n            onClick: props.onViewClick,\n            disabled: !props.loaded,\n        });\n    if (props.iconButtons?.length) {\n        farItems.push(...props.iconButtons);\n    }\n\n    return (\n        <div className=\"sanddance-explorer-topbar\">\n            <div className=\"logo\">\n                <Logo />\n                <a href={props.logoClickUrl || '/'} target={props.logoClickTarget || '_blank'}>{strings.appName}</a>\n            </div>\n            <div className=\"sanddance-explorer-commandbar\">\n                <base.fluentUI.Customizer\n                    scopedSettings={{\n                        CommandBarButton: {\n                            styles: (buttonProps: FluentUITypes.IButtonProps) => {\n                                buttonProps.theme.palette = props.themePalette as FluentUITypes.IPalette;\n                                return CommandBarButtonStyles(buttonProps);\n                            },\n                        },\n                    }}\n                >\n                    <base.fluentUI.CommandBar\n                        items={items}\n                        farItems={farItems}\n                        styles={{\n                            root: {\n                                backgroundColor: 'transparent',\n                                height: 'unset',\n                                paddingLeft: 0,\n                                paddingRight: 0,\n                            },\n                        }}\n                    />\n                </base.fluentUI.Customizer>\n            </div>\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/color.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n$toolbar-bg: #f9f9f9;\n$toolbar-border: #ccc;\n$toolbar-border-light: #ddd;\n\n$dark-toolbar-bg: #272727;\n$dark-toolbar-border: #333;\n$dark-toolbar-border-light: #222;\n\n$highlight-color: rgb(0, 120, 212);\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/columnMap.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin columnMap() {\n    .sanddance-columnMap {\n        position: relative;\n        .ms-Dropdown-container {\n            margin-top: 10px;\n        }\n        .column-options {\n            bottom: 3px;\n            position: absolute;\n            right: 0;\n        }\n    }\n    .sanddance-columnMap-absolute {\n        margin-bottom: 1em;\n        margin-left: -4em;\n        margin-right: 1em;\n        margin-top: -1em;\n        .ms-Dropdown-container {\n            margin-top: 0;\n        }\n    }\n    .sanddance-tooltip {\n        z-index: 2;\n    }\n    .sanddance-chart-button {\n        display: block;\n        margin-top: 10px;\n    }\n    .sanddance-columnTypes {\n        max-height: 20em;\n        overflow: scroll;\n        th, td {\n            padding: 0 5px;\n        }\n        td, button {\n            height: 18px;\n        }\n        tr.changed {\n            text-decoration: line-through;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/dataIndex.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin dataIndex(\n) {\n    .sanddance-dataIndex {\n        .index {\n            display: grid;\n            grid-template-columns: 32px auto 32px;\n            line-height: 32px;\n            margin: 0px -8px 6px -8px;\n            text-align: center;\n        }\n        .item-filtered {\n            background-color: rgba(0, 0, 0, 0.1);\n            font-size: 10px;\n            padding: 2px 4px;\n            text-transform: uppercase;\n        }\n        .ms-Dropdown-container {\n            margin-bottom: 0.5em;\n        }\n\n        button {\n            margin-top: 1em;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/dataItem.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin dataItem(\n    $border-color,\n    $dark-border-color\n) {\n    .sanddance-dataItem {\n        background-color: #fff;\n        border: 1px solid $border-color;\n        .name-value {\n            border-top: 1px solid $border-color;\n            cursor: pointer;\n            padding: 4px;\n            position: relative;\n            word-break: break-all;\n            &:hover {\n                background-color: rgb(0, 120, 212);\n                color: #fff;\n            }\n            &:first-child {\n                border-top: none;\n            }\n        }\n        .column-name {\n            font-weight: 500;\n        }\n        .column-value {\n            max-height: 20em;\n            overflow: auto;\n        }\n        .bing-search {\n            text-align: right;\n        }\n    }\n    .dark-theme .sanddance-dataItem {\n        background-color: #000;\n        border-color: $dark-border-color;\n        .name-value {\n            border-top-color: $dark-border-color;\n        }\n        a {\n            color: #00b4f0;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/dataScope.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin dataScope(\n    $toolbar-margin,\n    $toolbar-width,\n    $sidetab-width: 50px\n) {\n    .sanddance-datascope {\n        grid-area: stats;\n        background-color: rgba(0, 0, 0, 0.05);\n        border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n        min-height: 5em;\n        &.extended > div {\n            margin: $toolbar-margin;\n            width: $toolbar-width - (2 * $toolbar-margin);\n        }\n        label {\n            display: block;\n            font-size: 10px;\n            text-transform: uppercase;\n        }\n        &.compact {\n            align-self: center;\n            cursor: pointer;\n            display: grid;\n            text-align: center;\n            width: $sidetab-width;\n            > div {\n                align-self: center;\n            }\n        }\n        .datascope-button {\n            background-color: #fff;\n            border: 1px solid rgba(0, 0, 0, 0.2);\n            box-sizing: border-box;\n            height: 36px;\n            min-width: unset;\n            width: 33.333%;\n            &:hover {\n                background-color: $highlight-color;\n                color: #fff;\n            }\n            label {\n                cursor: inherit;\n            }\n        }\n        &.active {\n            .datascope-button {\n                &.selected {\n                    border-color: $highlight-color;\n                }\n            }\n        }\n    }\n    .dark-theme .sanddance-datascope {\n        background-color: rgba(0, 0, 0, 0.3);\n        border-bottom-color: rgba(255, 255, 255, 0.1);\n        .datascope-button {\n            background-color: #000;\n            border-color: rgba(255, 255, 255, 0.2);\n            color: #fff;\n            &:hover {\n                background-color: $highlight-color;\n                color: #fff;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/group.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin group(\n    $margin,\n    $border-color: #ccc,\n    $head-opacity: 0.8,\n    $count-color: #333,\n    $bg-color: #ccc\n) {    \n    .sanddance-group {\n        border-top: 1px solid $border-color;\n        padding-bottom: 1.5em;\n        position: relative;\n        .group-head {\n            display: grid;\n            grid-template-columns: auto auto;\n            line-height: 16px;\n            margin: 1em 0;\n            label {\n                font-size: 11px;\n                font-weight: 600;\n                letter-spacing: 3px;\n                opacity: $head-opacity;\n                text-transform: uppercase;\n            }\n            .count {\n                color: $count-color;\n                font-size: 12px;\n                text-align: right;\n            }\n        }\n        .group-icon {\n            position: absolute;\n            top: -1px;\n            right: 0;\n        }\n        &:first-child {\n            border-top: none;\n            .group-head {\n                margin-top: 0;\n            }\n        }\n        &:last-child {\n            padding-bottom: 0;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/history.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin history(\n) {\n    .sanddance-history {\n        ol {\n            padding-left: 20px;\n        }\n        li {\n            border: 1px solid transparent;\n            cursor: pointer;\n\n            &.selected {\n                font-weight: bold;\n            }\n        }\n    }\n    .sanddance-history-button {\n        background: none;\n        border: 0;\n        font-size: inherit;\n        font-style: inherit;\n        font-weight: inherit;\n        height: unset;\n        padding: 3px 4px;\n        text-align: left;\n        width: 100%;\n        \n        .ms-Button-label {\n            display: inline;\n            font-weight: inherit;\n            margin: 0;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/note.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin note(\n) {\n    .sanddance-note {\n        background-color: #fffacd;\n        border: 1px solid #333;\n        box-shadow: 8px 8px 12px -6px #ccc;\n        color: #333;\n        margin: 1em;\n        padding: 20px;\n        position: absolute;\n        width: 15em;\n        word-break: break-word;\n        .cancel {\n            position: absolute;\n            right: -1px;\n            top: -1px;\n            i {\n                color: #333;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/palette.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n.sanddance-scheme {\n    $color-icon-height: 24px;\n    &.disabled {\n        filter: grayscale(95%);\n    }\n    &.option {\n        display: grid;\n        grid-template-columns: 10em auto;\n        width: 100%;\n    }\n    &.title {\n        justify-content: flex-start;\n    }\n    span {\n        align-self: center;\n    }\n    svg, .swatch {\n        align-self: center;\n        border: thin solid #777;\n        height: $color-icon-height;\n    }\n    svg {\n        width: 100%;\n    }\n    .swatch {\n        div {\n            display: inline-block;\n            width: 10px;\n            height: $color-icon-height;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/sanddance-explorer.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@use 'sass:math';\n@import \"../../../sanddance-react/dist/css/sanddance-react\";\n@import \"color\";\n@import \"columnMap\";\n@import \"dataItem\";\n@import \"dataIndex\";\n@import \"dataScope\";\n@import \"group\";\n@import \"note\";\n@import \"palette\";\n@import \"search\";\n@import \"scrollable\";\n@import \"sidebar\";\n@import \"snapshots\";\n@import \"history\";\n@import \"topbar\";\n\n//settings\n$sidetab-width: 50px;\n$toolbar-width: 300px;\n$toolbar-margin: 12px;\n$layout-margin-left: 0; //$sidetab-width;\n$layout-margin-right: 0; //150px; //room for legend\n\n@include topbar($toolbar-margin: $toolbar-margin, $toolbar-width: $toolbar-width, $sidetab-width: $sidetab-width);\n@include group($margin: $toolbar-margin, $border-color: $toolbar-border, $bg-color: $toolbar-bg);\n@include sidebar($bg-color: $toolbar-bg, $dark-bg-color: $dark-toolbar-bg, $toolbar-margin: $toolbar-margin, $toolbar-width: $toolbar-width, $sidetab-width: $sidetab-width);\n@include dataScope($toolbar-margin: $toolbar-margin, $toolbar-width: $toolbar-width, $sidetab-width: $sidetab-width);\n@include dataItem($border-color: $toolbar-border-light, $dark-border-color: $dark-toolbar-border-light);\n@include dataIndex();\n@include scrollable();\n@include search();\n@include snapshots();\n@include history();\n@include note();\n@include columnMap();\n\n.sanddance-dialog {\n    ul {\n        margin: 0;\n    }\n    section {\n        margin-top: 1em;\n        &:first-child {\n            margin-top: 0;\n        }\n    }\n    .tip {\n        font-style: italic;\n    }\n}\n\n.sanddance-explorer {\n    display: grid;\n    font-family: 'Segoe UI', sans-serif;\n    font-size: 13px;\n    grid-template-rows: 0fr auto;\n    &.dark-theme {\n        background-color: black;\n        canvas {\n            background-color: black;\n        }\n    }\n}\n\n.sanddance-main {\n    display: grid;\n    position: relative;\n    transition: grid-template-columns 350ms cubic-bezier(.4, 0, .2, 1);\n    .loading {\n        grid-row-end: span 2;\n        position: relative;\n        .ms-Spinner {\n            position: absolute;\n            top: 50%;\n            width: 100%;\n        }\n    }\n    .sanddance-view {\n        display: grid;\n        position: relative;\n        margin-left: $sidetab-width;\n    }\n    .sanddance-layout-unpinned, .sanddance-layout-pinned {\n        position: absolute;\n        top: 0;\n        left: $layout-margin-left;\n        right: $layout-margin-right;\n        bottom: 0;\n    }\n    &.hide-legend {\n        .sanddance-layout-unpinned, .sanddance-layout-pinned {\n            right: 0;\n        }\n    }\n    .sanddance-layout-pinned {\n        left: $toolbar-width;\n    }\n    .sanddance-ReactViewer {\n        overflow: hidden;\n        position: absolute;\n        top: 0;\n        left: $layout-margin-left - $layout-margin-right;   //oversize canvas to align center\n        bottom: 0;\n        right: 0;\n    }\n    &.hide-legend {\n        .sanddance-ReactViewer {\n            left: 0;\n        }\n    }\n    &.show-center {\n        .sanddance-layout-unpinned, .sanddance-layout-pinned {\n            background: linear-gradient(to right,\n                transparent 49%,\n                rgba(255, 0, 255, 0.2),\n                transparent 51%\n            );\n            background-color: rgba(0, 255, 255, 0.1);\n        }\n    }\n    &.pinned {\n        grid-template-columns: $toolbar-width auto;\n        grid-template-areas: \"side main\";\n        .sanddance-view {\n            grid-area: main;\n            margin-left: 0;\n        }\n        .loading {\n            grid-area: main;\n            grid-row-end: unset;\n        }\n        .sanddance-slidePanel {\n            grid-area: side;\n        }\n        &.closed {\n            grid-template-columns: 0 auto;\n            .sanddance-view {\n                margin-left: $sidetab-width;\n            }\n        }\n    }\n    span.ms-layer {\n        display: none;  //keep dialogs from occupying the grid when toolbar is floating\n    }\n}\n\n.sanddance-advanced-renderer {\n    height: 36px;\n    position: absolute;\n    right: 0;\n    top: 0;\n    width: 40px;\n}\n\n.sanddance-renderer-dialog {\n    ul {\n        list-style-type: none;\n        padding-left: 2em;\n    }\n}\n\n.sanddance-background-image-dialog {\n    min-width: 32em;\n    .thumbnail {\n        border-bottom: 1px solid #ccc;\n        display: grid;\n        grid-template-columns: auto auto;\n        padding-bottom: 1em;\n        > * {\n            align-self: center;\n        }\n        img {\n            margin-right: 1em;\n            max-height: 160px;\n            max-width: 16em;\n            object-fit: contain;\n        }\n    }\n    .axis-bounds {\n        border-bottom: 1px solid #ccc;\n        padding-bottom: 1em;\n    }\n    .axis-bound-fields {\n        display: grid;\n        column-gap: 1em;\n        grid-template-columns: auto auto;\n        margin-bottom: 1em;\n    }\n}\n\n#sanddance-vega-spec {\n    border: 1px inset;\n    max-height: 20em;\n    overflow: scroll;\n}\n\n.sanddance-panel {\n    top: 5em;\n    bottom: unset;\n    overflow-y: unset;\n    padding-right: 1em;\n    padding-top: 32px;\n    h4,\n    .sanddance-vegaControls,\n    .sanddance-unitControls {\n        display: none;\n    }\n}\n\n.sanddance-main.hide-legend .sanddance-panel {\n    display: none;\n}\n\n.sanddance-panel-tools {\n    position: absolute;\n    top: 0;\n    right: 0;\n}\n\n.sanddance-legend {\n    min-width: 54px;\n}\n\n.sanddance-explanation {\n    font-size: smaller;\n    font-style: italic;\n    margin-bottom: 1em;\n    .fieldname,\n    .fieldtype {\n        font-style: italic;\n    }\n}\n\n.sanddance-signal {\n    margin-top: 1em;\n}\n\n.sanddance-legend {\n    th {\n        color: #005a9e;\n        cursor: pointer;\n        &:hover {\n            background-color: rgba(43, 136, 216, math.div(1, 3));    // one-third opacity background\n        }\n    }\n    .legend-row:hover {\n        background-color: $highlight-color;\n        color: #fff;\n    }\n}\n\n.sanddance-form-separate {\n    margin-top: 1em;\n}\n\n.dark-theme {\n    .sanddance-dialog {\n        a {\n            color: #00b4f0;\n        }\n    }\n    .sanddance-panel {\n        background-color: #000;\n        color: #fff;\n    }\n    .sanddance-legend {\n        th {\n            color: #3ac5f3;\n            &:hover {\n                color: #009ed3;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/scrollable.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin scrollable(\n    $min-height: 200px\n) {\n    .scrollable-container {\n        display: grid;\n        min-height: $min-height;\n        position: relative;\n    }\n    .scrollable {\n        bottom: 0;\n        left: 0;\n        position: absolute;\n        right: 0;\n        overflow-y: auto;\n        top: 0;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/search.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin search(\n) {\n    .sanddance-search {\n        .sanddance-search-group {\n            border: 1px solid rgba(0, 0, 0, 0.2);\n        }        \n        .sanddance-search-group {\n            background: #fff;\n            margin-top: 1em;\n            padding: 4px;\n             &:first-child {\n                margin-top: 0;\n             }\n        }\n        .sanddance-search-expression {\n            background-color: rgba(0, 0, 0, 0.1);\n            margin: 12px 4px;\n            padding: 4px 8px 8px 8px;\n        }\n        .search-action {\n            width: 100%;\n        }\n        .search-bottom-action {\n            margin-top: 1em;\n        }\n        .search-field {\n            margin-top: 4px;\n        }\n    }\n    .dark-theme .sanddance-search {\n        .sanddance-search-group {\n            border-color: rgba(255, 255, 255, 0.2);\n            background: #000;\n        }\n        .sanddance-search-expression {\n            background-color: rgba(255, 255, 255, 0.2);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/sidebar.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin sidebar(\n    $bg-color,\n    $dark-bg-color,\n    $toolbar-margin,\n    $toolbar-width,\n    $sidetab-width: 50px,\n    $sidetab-count: 6,\n) {\n    .sanddance-sidebar {\n        background-color: $bg-color;\n        display: grid;\n        overflow: hidden;\n        position: relative;\n        transition: width 350ms cubic-bezier(.4, 0, .2, 1);     //TODO param\n        width: $toolbar-width;\n        &:not(.pinned) {\n            bottom: 0;\n            position: absolute;\n            top: 0;\n        }\n        .sidebar-content {\n            background-color: inherit;\n            display: grid;\n            grid-template-areas:    \"stats stats\"\n                                    \"tabs bar\";\n            grid-template-columns: $sidetab-width auto;\n            grid-template-rows: 0fr auto;\n            height: 100%;\n            overflow: hidden;\n            position: absolute;\n            z-index: 1; //appear over the canvas even though it is behind it in the dom.\n        }\n        .vbuttons {\n            background-color: rgba(0, 0, 0, 0.1);\n            display: grid;\n            grid-area: tabs;\n            grid-template-rows: auto 0fr;\n            position: relative;\n        }\n        .vbutton {\n            align-self: center;\n            display: grid;\n            height: 60px;\n            &.selected {\n                background-color: $bg-color;\n            }\n            button {\n                height: 100%;\n                width: 100%;\n                .ms-Button-icon {\n                    font-size: 20px;\n                }\n            }\n        }\n        .sidebar-dialogs {\n            .vbutton {\n                height: math.percentage(math.div(1, $sidetab-count));\n                max-height: 60px;\n                min-height: 32px;    \n            }\n        }\n        .scrollable-container {\n            width: $toolbar-width - $sidetab-width;\n        }\n        .sidetab {\n            grid-area: bar;\n            padding: $toolbar-margin;\n        }\n        &.closed {\n            width: $sidetab-width;\n        }\n        &.calculator {\n            .calculating {\n                background: rgba($bg-color, 0.5);\n                height: 100%;\n                position: absolute;\n                top: 0;\n                width: 100%;\n            }\n            .ms-Spinner {\n                margin-top: -16px;\n                position: relative;\n                top: 50%;\n            }\n        }\n    }\n    .dark-theme {\n        .sanddance-sidebar {\n            background-color: $dark-bg-color;\n            color: #fff;\n            .vbuttons {\n                background-color: rgba(0, 0, 0, 0.4);\n            }\n            .vbutton {\n                &.selected {\n                    background-color: $dark-bg-color;\n                }\n            }\n            &.calculator {\n                .calculating {\n                    background: rgba($dark-bg-color, 0.5);\n                }\n            }\n        }\n    }\n    .sanddance-chart-type {\n        .ms-ChoiceFieldGroup-flexContainer {\n            display: grid;\n            grid-template-columns: repeat(2, 50%);\n            grid-auto-flow: column;\n            grid-template-rows: repeat(4, auto);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/css/snapshots.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin snapshots() {\n    .sanddance-snapshots {\n        .ms-Button {\n            margin-bottom: 0.5em;\n        }\n        .snapshot {\n            border: 1px solid rgba(0, 0, 0, 0.2);\n            cursor: pointer;\n            margin-bottom: 0.5em;\n            padding: 5px;\n            &.selected {\n                border-color: rgba(0, 0, 0, 0.6);\n                border-width: 2px;\n                padding: 4px;\n            }\n            &:hover {\n                background-color: rgba(0, 0, 0, 0.1);\n            }\n            &:first-child {\n                margin-top: 0.5em;\n            }\n        }\n        .title {\n            font-weight: 500;\n            word-break: break-word;\n        }\n        .description {\n            font-weight: 100;\n            word-break: break-word;\n        }\n        .thumbnail {\n            display: grid;\n            height: 160px;\n            margin-top: 0.5em;\n        }\n        img {\n            height: 100%;\n            object-fit: contain;\n            width: 100%;\n        }\n        .actions {\n            display: grid;\n            grid-auto-flow: column;\n            a, span {\n                align-self: center;\n                text-align: center;\n            }\n            button {\n                width: 100%;\n            }\n        }\n    }\n    .sanddance-snapshot-dialog {\n        .thumbnail {\n            border: 1px solid rgba(0, 0, 0, 0.2);\n            display: grid;\n            height: 300px;\n            margin-top: 1em;\n        }\n        img {\n            height: 100%;\n            object-fit: contain;\n            width: 100%;\n        }\n    }\n    .dark-theme {\n        .sanddance-snapshots {\n            .snapshot {\n                background-color: rgba(0, 0, 0, 0.6);\n                border-color: rgba(255, 255, 255, 0.2);\n                &.selected {\n                    border-color: rgba(255, 255, 255, 0.6);\n                }\n                &:hover {\n                    background-color: rgba(0, 0, 0, 1);\n                }\n            }\n            .actions a {\n                color: #fff;\n            }\n        }\n        &.sanddance-snapshot-dialog {\n            .thumbnail {\n                border-color: rgba(255, 255, 255, 0.2);\n            }\n        }\n    }\n}"
  },
  {
    "path": "packages/sanddance-explorer/src/css/topbar.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@mixin topbar(\n  $toolbar-margin,\n  $toolbar-width,\n  $sidetab-width,\n  $toolbar-height: 36px\n) {\n  .sanddance-explorer-topbar {\n    background-color: #fff;\n    border-bottom: 1px solid $toolbar-border;\n    display: grid;\n    grid-template-columns: $toolbar-width auto;\n    height: $toolbar-height;\n    .logo {\n      color: $highlight-color;\n      display: grid;\n      grid-template-columns: $sidetab-width auto;\n      padding: 6px 0;\n      svg {\n        fill: $highlight-color;\n        height: 24px;\n        margin: 0 auto;\n        width: 24px;\n      }\n      a {\n        color: inherit;\n        font-size: 14px;\n        font-weight: bold;\n        line-height: 24px;\n        text-decoration: none;\n      }\n    }\n  }\n\n  //contain the commandbar so it can be measured\n  .sanddance-explorer-commandbar {\n    position: relative;\n    > div {\n      left: 0;\n      position: absolute;\n      right: 0;\n    }\n    .ms-CommandBar {\n      height: $toolbar-height;\n    }\n  }\n\n  .dark-theme .sanddance-explorer-topbar {\n    background-color: #000;\n    .logo {\n      color: #00b4f0;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dataLoader.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport {\n    DataContent,\n    DataFile,\n    DataFileType,\n    DateWithSource,\n} from './interfaces';\nimport { SandDance } from '@msrvida/sanddance-react';\n\nexport const loadDataFile = (dataFile: DataFile, columnTypes?: SandDance.types.ColumnTypeMap) => new Promise<DataContent>((resolve, reject) => {\n    const vega = SandDance.VegaMorphCharts.base.vega;\n    const loader = vega.loader();\n\n    function handleRawText(text: string) {\n        let data: object[];\n        try {\n            data = vega.read(text, { type: dataFile.type, parse: {} });\n        }\n        catch (e) {\n            reject(e);\n        }\n        if (data) {\n            loadDataArray(data, dataFile.type, columnTypes).then(dc => {\n                if (dataFile.snapshotsUrl) {\n                    fetch(dataFile.snapshotsUrl)\n                        .then(response => response.json())\n                        .then(snapshots => {\n                            dc.snapshots = snapshots;\n                            resolve(dc);\n                        })\n                        .catch(reject);\n                } else if (dataFile.snapshots) {\n                    dc.snapshots = dataFile.snapshots;\n                    resolve(dc);\n                } else {\n                    resolve(dc);\n                }\n            }).catch(reject);\n        }\n    }\n\n    if (dataFile.dataUrl) {\n        loader.load(dataFile.dataUrl).then(handleRawText).catch(reject);\n    } else if (dataFile.rawText) {\n        handleRawText(dataFile.rawText);\n    } else {\n        reject('dataFile object must have either dataUrl or rawText property set.');\n    }\n});\n\nexport const loadDataArray = (data: object[], type: DataFileType, columnTypes?: SandDance.types.ColumnTypeMap) => new Promise<DataContent>((resolve, reject) => {\n    const parse = type === 'csv' || type === 'tsv';\n    if (parse) {\n        //convert empty strings to null so that vega.inferType will get dates\n        data.forEach(row => {\n            for (const column in row) {\n                if (row[column] === '') {\n                    row[column] = null;\n                }\n            }\n        });\n    }\n    const columns = SandDance.util.\n        getColumnsFromData(SandDance.VegaMorphCharts.base.vega.inferTypes, data, columnTypes)\n        .filter(c => c.name && c.name.trim())\n        .sort((a, b) => a.name.localeCompare(b.name));\n    if (parse) {\n        const booleanColumns = columns.filter(c => c.type === 'boolean');\n        const dateColumns = columns.filter(c => c.type === 'date');\n        const numericColumns = columns.filter(c => c.type === 'integer' || c.type === 'number');\n        data.forEach(obj => {\n            booleanColumns.forEach(c => {\n                obj[c.name] = ('' + obj[c.name]).toLowerCase() === 'true';\n            });\n            dateColumns.forEach(c => {\n                const input = obj[c.name];\n                if (input !== null) {\n                    const d = new Date(input) as DateWithSource;\n                    d.input = input;\n                    obj[c.name] = d;\n                }\n            });\n            numericColumns.forEach(c => {\n                const n = parseFloat(obj[c.name]);\n                obj[c.name] = isNaN(n) ? null : n;\n            });\n        });\n    }\n    resolve({ data, columns });\n});\n"
  },
  {
    "path": "packages/sanddance-explorer/src/defaults.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { getColorSettingsFromThemePalette, themePalettes } from './themes';\nimport { SideTabId, ViewerOptions } from './interfaces';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { Props, State } from './explorer';\nimport { DataScopeId, resetSelectedItemIndex } from './controls/dataScope';\n\nexport const fontFamily = 'Segoe UI, sans-serif';\n\nexport const defaultViewerOptions: Partial<ViewerOptions> = {\n    colors: getColorSettingsFromThemePalette(themePalettes['']),\n    fontFamily,\n};\n\nexport const snapshotThumbWidth = 300;\n\nexport const defaultRenderer: SandDance.VegaMorphCharts.types.MorphChartsRendererOptions = {\n    advanced: false,\n    advancedOptions: {\n        bloomIntensity: 2,\n        isBloomEnabled: false,\n        isDofEnabled: false,\n        dofFocusRange: 0.25,\n        isFxaaEnabled: false,\n        isShadowEnabled: true,\n        isSsaoEnabled: true,\n    },\n    basicOptions: {\n        antialias: true,\n    },\n};\n\nexport function initialExplorerState(props: Props) {\n    const renderer = (props.initialRenderer as SandDance.VegaMorphCharts.types.MorphChartsRendererOptions) || defaultRenderer;\n    if (!renderer.advancedOptions) {\n        renderer.advancedOptions = defaultRenderer.advancedOptions;\n    }\n    if (!renderer.basicOptions) {\n        renderer.basicOptions = defaultRenderer.basicOptions;\n    }\n    const state: State = {\n        calculating: null,\n        errors: null,\n        autoCompleteDistinctValues: {},\n        colorBin: null,\n        dataContent: null,\n        dataFile: null,\n        search: null,\n        totalStyle: null,\n        facetStyle: 'wrap',\n        filter: null,\n        filteredData: null,\n        specCapabilities: null,\n        size: {\n            height: null,\n            width: null,\n        },\n        scheme: null,\n        transform: null,\n        columns: null,\n        chart: 'grid',\n        signalValues: null,\n        hideAxes: false,\n        hideLegend: false,\n        sideTabId: SideTabId.ChartType,\n        dataScopeId: DataScopeId.AllData,\n        selectedItemIndex: {},\n        sidebarClosed: props.initialSidebarClosed === undefined ? false : props.initialSidebarClosed,\n        sidebarPinned: props.initialSidebarPinned === undefined ? true : props.initialSidebarPinned,\n        view: props.initialView || '2d',\n        snapshots: [],\n        selectedSnapshotIndex: -1,\n        tooltipExclusions: [],\n        positionedColumnMapProps: null,\n        note: null,\n        historyIndex: -1,\n        historyItems: [],\n        renderer,\n        transitionType: 'ordinal',\n        transitionDimension: 'x',\n        transitionDurations: SandDance.VegaMorphCharts.util.clone(SandDance.VegaMorphCharts.defaults.defaultPresenterConfig.transitionDurations),\n    };\n    resetSelectedItemIndex(state.selectedItemIndex);\n    return state;\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/backgroundImageEditor.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Dialog } from '../controls/dialog';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { strings } from '../language';\nimport { IconButton } from '../controls/iconButton';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { ColumnMapBaseProps } from '../controls/columnMap';\nimport { IDropdownOption } from '@msrvida/fluentui-react-cdn-typings/types';\nimport { BackgroundImageColumnBound, DataExtent, ImageHolder } from '../interfaces';\nimport { getBackgroundImageColumnBounds } from '../columns';\n\nexport interface Props extends ColumnMapBaseProps {\n    themePalette: Partial<FluentUITypes.IPalette>;\n    chart: SandDance.specs.Chart;\n}\n\nexport interface State {\n    backgroundImageColumnBounds: BackgroundImageColumnBound[];\n    backgroundImageFileFormatError?: string;\n    readyToApply: boolean;\n    hidden: boolean;\n    xCol?: SandDance.types.Column;\n    yCol?: SandDance.types.Column;\n}\n\nfunction _BackgroundImageEditor(_props: Props) {\n    class __BackgroundImageEditor extends base.react.Component<Props, State>{\n\n        constructor(props: Props) {\n            super(props);\n            this.state = {\n                backgroundImageColumnBounds: [],\n                readyToApply: false,\n                hidden: true,\n            };\n        }\n\n        show(insightColumns: SandDance.specs.InsightColumns) {\n            const { explorer, quantitativeColumns } = this.props;\n            if (!quantitativeColumns.length) {\n                //TODO show error\n                return;\n            }\n            const xCol = quantitativeColumns.filter(c => c.name === insightColumns.x)[0];\n            const yCol = quantitativeColumns.filter(c => c.name === insightColumns.y)[0];\n            let backgroundImageColumnBounds: BackgroundImageColumnBound[];\n            if (explorer.imageHolder.backgroundImageColumnBounds.length < quantitativeColumns.length * 4) {\n                backgroundImageColumnBounds = getBackgroundImageColumnBounds(explorer.state.dataContent.columns);\n            } else {\n                backgroundImageColumnBounds = SandDance.VegaMorphCharts.util.clone(explorer.imageHolder.backgroundImageColumnBounds);\n            }\n            const newState: Partial<State> = { hidden: false, xCol, yCol, backgroundImageColumnBounds };\n            if (!xCol || !yCol) {\n                //TODO error\n            }\n            this.setState(newState as State);\n            this.checkReady();\n        }\n\n        render() {\n            const { props, state } = this;\n            const { explorer } = props;\n            return (\n                <Dialog\n                    hidden={state.hidden}\n                    onDismiss={() => this.setState({ hidden: true, backgroundImageFileFormatError: null })}\n                    modalProps={{\n                        containerClassName: 'sanddance-background-image-dialog',\n                    }}\n                    dialogContentProps={{\n                        type: base.fluentUI.DialogType.normal,\n                        title: strings.labelBackgroundImageDialogTitle,\n                        subText: strings.labelBackgroundImageSubtext,\n                    }}\n                    buttons={[\n                        <base.fluentUI.PrimaryButton\n                            key='apply'\n                            iconProps={{ iconName: 'Photo2Add' }}\n                            text={strings.buttonApply}\n                            onClick={() => this.applyImage(true)}\n                            disabled={!state.readyToApply}\n                        />,\n                    ]}\n                >\n                    {explorer.imageHolder.img ? (\n                        <div className='thumbnail'>\n                            <img src={explorer.imageHolder.img.src} />\n                            <base.fluentUI.DefaultButton\n                                key='remove'\n                                iconProps={{ iconName: 'Photo2Remove' }}\n                                text={strings.buttonRemove}\n                                onClick={() => {\n                                    explorer.imageHolder.img = null;\n                                    this.applyImage(false);\n                                    this.setState({ readyToApply: false });\n                                }}\n                            />\n                        </div>\n                    ) : (\n                        <div className='thumbnail'>\n                            <input\n                                type=\"file\"\n                                onChange={e => this.readBackgroundImage(e)}\n                            //disabled={this.state.working} //TODO\n                            />\n                            {state.backgroundImageFileFormatError && (\n                                <div className=\"error\">{state.backgroundImageFileFormatError}</div>\n                            )}\n                        </div>\n                    )}\n                    {this.inputForColumn(state.xCol, 'X axis', 'x', strings.labelBackgroundLeft, strings.labelBackgroundRight)}\n                    {this.inputForColumn(state.yCol, 'Y axis', 'y', strings.labelBackgroundBottom, strings.labelBackgroundTop)}\n                </Dialog>\n            );\n        }\n\n        private inputForColumn(column: SandDance.types.Column, label: string, dimension: SandDance.types.Dimension2D, minLabel: string, maxLabel: string) {\n            const { props, state } = this;\n            const fieldInput = (label: string, dataExtent: DataExtent, getDefault: () => number) => {\n                const bounds = state.backgroundImageColumnBounds.filter(b => b.columnName === column?.name && b.dimension === dimension && b.dataExtent === dataExtent)[0];\n                if (!bounds) {\n                    return null;\n                }\n                return (\n                    <div className='axis-bound-field'>\n                        <base.fluentUI.TextField\n                            label={label}\n                            onChange={(e, value) => {\n                                const numericValue = +value;\n                                bounds.stringValue = value;\n                                bounds.valid = !(!value || isNaN(numericValue));\n                                if (bounds.valid) {\n                                    bounds.numericValue = numericValue;\n                                }\n                                this.setState({ backgroundImageColumnBounds: [...state.backgroundImageColumnBounds] });\n                                this.checkReady();\n                            }}\n                            value={bounds.stringValue}\n                            errorMessage={bounds.valid ? null : strings.errorNumericValue}\n                            onRenderSuffix={(a) => {\n                                return (\n                                    <IconButton\n                                        iconName='ScaleVolume'\n                                        themePalette={props.themePalette}\n                                        title='Use data extent' //TODO\n                                        onClick={() => {\n                                            bounds.numericValue = getDefault();\n                                            bounds.stringValue = bounds.numericValue.toString();\n                                            bounds.valid = true;\n                                            this.setState({ backgroundImageColumnBounds: [...state.backgroundImageColumnBounds] });\n                                            this.checkReady();\n                                        }}\n                                    />\n                                );\n                            }}\n                        />\n                    </div>\n                );\n            };\n            return (\n                <div className='axis-bounds'>\n                    <base.fluentUI.Dropdown\n                        label={label}\n                        options={props.quantitativeColumns.map(c => {\n                            const option: IDropdownOption = {\n                                key: c.name,\n                                text: c.name,\n                            };\n                            return option;\n                        })}\n                        onChange={(e, o) => {\n                            const newState: Partial<State> = { readyToApply: false };\n                            const newColumn = props.quantitativeColumns.filter(c => c.name === o.key)[0];\n                            switch (dimension) {\n                                case 'x': {\n                                    newState.xCol = newColumn;\n                                    break;\n                                }\n                                case 'y': {\n                                    newState.yCol = newColumn;\n                                    break;\n                                }\n                            }\n                            this.setState(newState as State);\n                            this.checkReady();\n                        }}\n                        selectedKey={column?.name}\n                    />\n                    <div className='axis-bound-fields'>\n                        {fieldInput(minLabel, 'min', () => column.stats.min)}\n                        {fieldInput(maxLabel, 'max', () => column.stats.max)}\n                    </div>\n                </div>\n\n            );\n        }\n\n        readBackgroundImage(e: React.ChangeEvent<HTMLInputElement>) {\n            if (e.target.files) {\n                const file = e.target.files[0];\n                const reader = new FileReader();\n                reader.onload = () => {\n                    const img = new Image();\n                    img.onerror = () => {\n                        this.setState({ backgroundImageFileFormatError: strings.errorImageFormat });\n                    };\n                    img.onload = () => {\n                        //success\n                        const { src, height, width } = img;\n                        this.props.explorer.imageHolder.img = { src, height, width };\n                        this.checkReady();\n                    };\n                    try {\n                        img.src = reader.result as string;\n                    }\n                    catch (e) {\n                        this.setState({ backgroundImageFileFormatError: strings.errorImageFormat });\n                    }\n                };\n                reader.readAsDataURL(file);\n            }\n        }\n\n        checkReady() {\n            //allow state to resolve\n            setTimeout(() => {\n                const { state, props } = this;\n                const { explorer } = props;\n                const { backgroundImageColumnBounds } = state;\n                let valid = true;\n                const dimensions: SandDance.types.Dimension2D[] = ['x', 'y'];\n                const dataExtents: DataExtent[] = ['max', 'min'];\n                [state.xCol, state.yCol].forEach(c => dimensions.forEach(dimension => dataExtents.forEach(dataExtent => {\n                    const bounds = backgroundImageColumnBounds.filter(b => b.columnName === c.name && b.dataExtent === dataExtent && b.dimension === dimension)[0];\n                    if (!bounds.valid) {\n                        valid = false;\n                    }\n                })));\n                const readyToApply = explorer.imageHolder.img && valid;    //TODO if not already applied\n                this.setState({ readyToApply });\n            }, 0);\n        }\n\n        applyImage(showBackgroundImage: boolean) {\n            const { props, state } = this;\n            const { explorer } = props;\n            explorer.imageHolder.showBackgroundImage = showBackgroundImage;\n            explorer.imageHolder.backgroundImageColumnBounds = SandDance.VegaMorphCharts.util.clone(state.backgroundImageColumnBounds);\n            if (showBackgroundImage) {\n                switch (props.chart) {\n                    case 'density':\n                    case 'scatterplot':\n                    case 'stacks': {\n                        break;\n                    }\n                    default: {\n                        //TODO use xcol & ycol\n                        //make sure x & y are numeric\n                        explorer.changeChartType('scatterplot');\n                        return;\n                    }\n                }\n            }\n            explorer.forceUpdate();\n        }\n    }\n    return new __BackgroundImageEditor(_props);\n}\n\nexport const BackgroundImageEditor: typeof BackgroundImageEditor_Class = _BackgroundImageEditor as any;\n\nexport declare class BackgroundImageEditor_Class extends base.react.Component<Props, State> {\n    show(insightColumns: SandDance.specs.InsightColumns): void;\n}\n\nexport function setInsightBackgroundImage(insight: SandDance.specs.Insight, imageHolder: ImageHolder, columns: SandDance.specs.InsightColumns) {\n    if (!imageHolder.showBackgroundImage || !columns.x || !columns.y) {\n        return;\n    }\n    const { backgroundImageColumnBounds } = imageHolder;\n    const xBounds = backgroundImageColumnBounds.filter(b => b.columnName === columns.x && b.dimension === 'x');\n    const yBounds = backgroundImageColumnBounds.filter(b => b.columnName === columns.y && b.dimension === 'y');\n    if (!xBounds.length || !yBounds.length) {\n        return;\n    }\n    const allBounds = [...xBounds, ...yBounds];\n    for (let i = 0; i < allBounds.length; i++) {\n        if (!allBounds[i].valid) {\n            return;\n        }\n    }\n    const bottom = yBounds.filter(b => b.dataExtent === 'min')[0];\n    const left = xBounds.filter(b => b.dataExtent === 'min')[0];\n    const right = xBounds.filter(b => b.dataExtent === 'max')[0];\n    const top = yBounds.filter(b => b.dataExtent === 'max')[0];\n    const all = [bottom, left, right, top];\n    for (let i = 0; i < all.length; i++) {\n        if (!all[i]) {\n            return;\n        }\n    }\n    const { src, height, width } = imageHolder.img;\n    insight.backgroundImage = {\n        url: src,\n        size: { height, width },\n        extents: {\n            bottom: bottom.numericValue,\n            left: left.numericValue,\n            right: right.numericValue,\n            top: top.numericValue,\n        },\n    };\n    insight.size = insight.backgroundImage.size;\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/chart.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { ColumnMap, ColumnMapBaseProps, getColumnMapOptions } from '../controls/columnMap';\nimport { Dialog } from '../controls/dialog';\nimport { Dropdown } from '../controls/dropdown';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { Group } from '../controls/group';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { getInitialSignalValue, Signal } from '../controls/signal';\nimport { Signal as VegaSignal } from 'vega-typings';\nimport { strings } from '../language';\nimport { ToggleColumns } from '../controls/toggleColumns';\nimport { getTreemapColumn } from '../columns';\nimport { BackgroundImageEditor, BackgroundImageEditor_Class } from './backgroundImageEditor';\n\nexport interface Props extends ColumnMapBaseProps {\n    themePalette: Partial<FluentUITypes.IPalette>;\n    tooltipExclusions: string[];\n    toggleTooltipExclusion: (columnName: string) => void;\n    collapseLabels: boolean;\n    disabled: boolean;\n    chart: SandDance.specs.Chart;\n    view: SandDance.types.View;\n    insightColumns: SandDance.specs.InsightColumns;\n    onChangeSignal: (role: string, column: string, name: string, value: any) => void;\n}\n\nexport interface State {\n    showTooltipDialog: boolean;\n}\n\ninterface FacetData {\n    facetStyle: SandDance.specs.FacetStyle;\n    text?: string;\n    column?: SandDance.types.Column;\n}\n\nconst singleFacetLayouts: FacetData[] = [\n    { facetStyle: 'wrap', text: strings.labelFacetLayoutWrap },\n    //{ facetStyle: 'horizontal', text: strings.labelFacetLayoutHorizontal },\n    //{ facetStyle: 'vertical', text: strings.labelFacetLayoutVertical }\n];\n\nexport const chartLabelMap: { key: SandDance.specs.Chart, text: string }[] = [\n    {\n        key: 'grid',\n        text: strings.chartTypeGrid,\n    },\n    {\n        key: 'scatterplot',\n        text: strings.chartTypeScatterPlot,\n    },\n    {\n        key: 'density',\n        text: strings.chartTypeDensity,\n    },\n    {\n        key: 'barchartV',\n        text: strings.chartTypeBarChartV,\n    },\n    {\n        key: 'barchartH',\n        text: strings.chartTypeBarChartH,\n    },\n    {\n        key: 'treemap',\n        text: strings.chartTypeTreeMap,\n    },\n    {\n        key: 'strips',\n        text: strings.chartTypeStrips,\n    },\n    {\n        key: 'stacks',\n        text: strings.chartTypeStacks,\n    },\n];\n\nexport function chartLabel(key: SandDance.specs.Chart) {\n    for (let i = 0; i < chartLabelMap.length; i++) {\n        if (key === chartLabelMap[i].key) {\n            return chartLabelMap[i].text;\n        }\n    }\n}\n\nfunction _Chart(_props: Props) {\n    class __Chart extends base.react.Component<Props, State> {\n        private choiceRef?: React.RefObject<FluentUITypes.IChoiceGroup>;\n        private backgroundImageEditor: BackgroundImageEditor_Class;\n        constructor(props: Props) {\n            super(props);\n            this.state = {\n                showTooltipDialog: false,\n            };\n            this.choiceRef = base.react.createRef<FluentUITypes.IChoiceGroup>();\n            props.explorer.dialogFocusHandler.focus = () => this.choiceRef.current?.focus();\n        }\n\n        render() {\n            const { props } = this;\n            const { explorer, specCapabilities } = props;\n            const signals = explorer.viewer &&\n                explorer.viewer.vegaSpec &&\n                specCapabilities &&\n                specCapabilities.signals &&\n                explorer.viewer.vegaSpec.signals.filter(s => specCapabilities.signals.indexOf(s.name) >= 0);\n            const hasOptions = !!signals || specCapabilities?.backgroundImage;\n            return (\n                <div>\n                    <Group label={strings.labelChart}>\n                        <div className=\"calculator\">\n                            <base.fluentUI.ChoiceGroup\n                                componentRef={this.choiceRef}\n                                selectedKey={props.chart}\n                                className=\"sanddance-chart-type\"\n                                options={chartLabelMap.map(o => {\n                                    return {\n                                        ...o,\n                                        disabled: props.disabled\n                                            || (o.key === 'treemap' && props.quantitativeColumns.length === 0),\n                                    };\n                                })}\n                                onChange={(e, o) => props.explorer.changeChartType(o.key as SandDance.specs.Chart)}\n                            />\n                        </div>\n                    </Group>\n                    <Group label={strings.labelColumnMapping}>\n                        <div>\n                            {specCapabilities && specCapabilities.roles.map((specRole, i) => {\n                                const specColumnInRole = props.insightColumns[specRole.role];\n                                const selectedColumnName = specColumnInRole;\n                                let disabledColumnName: string;\n                                let prefix: JSX.Element;\n                                let suffix: JSX.Element;\n                                let hideDropdown = false;\n                                let { totalStyle } = props;\n                                if (!totalStyle) {\n                                    totalStyle = 'count-square';\n                                }\n                                let { facetStyle } = props;\n                                if (!facetStyle) {\n                                    facetStyle = 'wrap';\n                                }\n                                switch (specRole.role) {\n                                    case 'facet': {\n                                        suffix = (\n                                            <Dropdown\n                                                disabled={!props.insightColumns.facet}\n                                                collapseLabel={props.collapseLabels}\n                                                label={strings.labelFacetLayout}\n                                                calloutProps={{ style: { minWidth: '18em' } }}\n                                                options={[\n                                                    {\n                                                        key: 'header1',\n                                                        text: `${strings.labelFacetLayout}:`,\n                                                        itemType: base.fluentUI.DropdownMenuItemType.Header,\n                                                    },\n                                                    ...singleFacetLayouts.map(f => {\n                                                        const o: FluentUITypes.IDropdownOption = {\n                                                            key: f.facetStyle,\n                                                            text: f.text,\n                                                            data: f,\n                                                            selected: facetStyle === f.facetStyle,\n                                                        };\n                                                        return o;\n                                                    }),\n                                                    {\n                                                        key: 'divider',\n                                                        text: '-',\n                                                        itemType: base.fluentUI.DropdownMenuItemType.Divider,\n                                                    },\n                                                    {\n                                                        key: 'header2',\n                                                        text: `${strings.labelColumnFacetV}:`,\n                                                        itemType: base.fluentUI.DropdownMenuItemType.Header,\n                                                    },\n                                                    ...getColumnMapOptions({\n                                                        ...props,\n                                                        specRole,\n                                                        selectedColumnName: props.insightColumns.facetV,\n                                                    }).map(o => {\n                                                        if (o.itemType !== base.fluentUI.DropdownMenuItemType.Header) {\n                                                            const facetData: FacetData = {\n                                                                facetStyle: 'cross',\n                                                                column: o.data,\n                                                            };\n                                                            o.data = facetData;\n                                                            o.text = `${strings.labelFacetLayoutCross} ${o.text}`;\n                                                        }\n                                                        return o;\n                                                    }),\n                                                ]}\n                                                onChange={(e, o) => {\n                                                    const facetData = o.data as FacetData;\n                                                    props.changeColumnMapping('facet', 'facet', null, { facetStyle: facetData.facetStyle });\n                                                    if (facetData.facetStyle === 'cross') {\n                                                        props.changeColumnMapping('facetV', SandDance.VegaMorphCharts.util.clone(facetData.column));\n                                                    }\n                                                }}\n                                            />\n                                        );\n                                        break;\n                                    }\n                                    case 'facetV': {\n                                        hideDropdown = true;\n                                        break;\n                                    }\n                                    case 'size': {\n                                        const options: FluentUITypes.IDropdownOption[] = [\n                                            {\n                                                key: 'count-square',\n                                                text: strings.labelTotalByCountSquare,\n                                                data: 'count-square',\n                                                selected: !totalStyle || totalStyle === 'count-square',\n                                            },\n                                            {\n                                                key: 'count-strip',\n                                                text: strings.labelTotalByCountStrip,\n                                                data: 'count-strip',\n                                                selected: totalStyle === 'count-strip',\n                                            },\n                                            {\n                                                key: 'sum-strip',\n                                                text: strings.labelTotalBySumStrip,\n                                                data: 'sum-strip',\n                                                selected: totalStyle === 'sum-strip',\n                                            },\n                                            {\n                                                key: 'sum-treemap',\n                                                text: strings.labelTotalBySumTreemap,\n                                                data: 'sum-treemap',\n                                                selected: totalStyle === 'sum-treemap',\n                                                disabled: props.quantitativeColumns.length === 0,\n                                            },\n                                        ];\n                                        if (specCapabilities.percentage) {\n                                            options.push(\n                                                {\n                                                    key: 'sum-strip-percent',\n                                                    text: strings.labelTotalBySumStripPercent,\n                                                    data: 'sum-strip-percent',\n                                                    selected: totalStyle === 'sum-strip-percent',\n                                                    disabled: props.quantitativeColumns.length === 0,\n                                                });\n                                        }\n                                        prefix = !specCapabilities.countsAndSums ? null : (\n                                            <Dropdown\n                                                collapseLabel={props.collapseLabels}\n                                                label={strings.labelTotal}\n                                                calloutProps={{ style: { minWidth: '18em' } }}\n                                                options={options}\n                                                onChange={(e, o) => {\n                                                    const totalStyle = o.data as SandDance.specs.TotalStyle;\n                                                    let defaultColumn: SandDance.types.Column;\n                                                    if (totalStyle.indexOf('sum-') === 0) {\n                                                        if (totalStyle === 'sum-treemap') {\n                                                            defaultColumn = getTreemapColumn(props.allColumns);\n                                                        }\n                                                        defaultColumn = defaultColumn || props.quantitativeColumns[0];\n                                                    }\n                                                    props.changeColumnMapping('size', 'size', defaultColumn, { totalStyle });\n                                                }}\n                                            />\n                                        );\n                                        break;\n                                    }\n                                }\n                                const disabled = props.disabled\n                                    || specRole.disabled\n                                    || (specRole.role === 'size' && !(!specCapabilities.countsAndSums || totalStyle.indexOf('sum-') === 0))\n                                    || (specRole.role === 'sort' && specCapabilities.countsAndSums && totalStyle === 'sum-treemap');\n                                return (\n                                    <ColumnMap\n                                        {...props}\n                                        prefix={prefix}\n                                        suffix={suffix}\n                                        collapseLabel={props.collapseLabels}\n                                        disabled={disabled}\n                                        disabledColumnName={disabledColumnName}\n                                        selectedColumnName={selectedColumnName}\n                                        specRole={specRole}\n                                        key={i}\n                                        onChangeSignal={(name, value) => props.onChangeSignal(specRole.role, selectedColumnName, name, value)}\n                                        hideDropdown={hideDropdown}\n                                    />\n                                );\n                            })}\n                            <base.fluentUI.DefaultButton\n                                className='sanddance-chart-button'\n                                text={strings.buttonTooltipMapping}\n                                onClick={() => this.setState({ showTooltipDialog: true })}\n                            />\n                        </div>\n                    </Group>\n                    {hasOptions && (\n                        <Group label={strings.labelChartTypeOptions}>\n                            {signals && signals.map((signal, i) => (\n                                <Signal\n                                    key={i}\n                                    signal={signal}\n                                    explorer={explorer}\n                                    initialValue={getInitialSignalValue(explorer, signal)}\n                                    disabled={props.disabled || this.disableSignal(signal)}\n                                    collapseLabel={props.collapseLabels}\n                                    newViewStateTarget={false}\n                                />\n                            ))}\n                            {specCapabilities?.backgroundImage && (\n                                <base.fluentUI.DefaultButton\n                                    className='sanddance-chart-button'\n                                    text={strings.buttonBackgroundImage}\n                                    onClick={() => {\n                                        let insightColumns: SandDance.specs.InsightColumns;\n                                        switch (props.chart) {\n                                            case 'scatterplot':\n                                            case 'stacks':\n                                            {\n                                                insightColumns = props.insightColumns;\n                                                break;\n                                            }\n                                        }\n                                        if (!insightColumns) {\n                                            insightColumns = props.explorer.changeChartType('scatterplot');\n                                        }\n                                        this.backgroundImageEditor.show(insightColumns);\n                                    }}\n                                />\n                            )}\n                        </Group>\n                    )}\n                    <Dialog\n                        hidden={!this.state.showTooltipDialog}\n                        onDismiss={() => this.setState({ showTooltipDialog: false })}\n                        title={strings.labelTooltipMapping}\n                    >\n                        <ToggleColumns\n                            allColumns={props.allColumns}\n                            exclusions={props.tooltipExclusions}\n                            toggleExclusion={props.toggleTooltipExclusion}\n                        />\n                    </Dialog>\n                    <BackgroundImageEditor\n                        {...props}\n                        ref={e => this.backgroundImageEditor = e}\n                    />\n                </div>\n            );\n        }\n\n        private disableSignal(signal: VegaSignal) {\n            if (this.props.view === '2d' && signal.name === SandDance.constants.SignalNames.ZGrounded) {\n                return true;\n            }\n            return false;\n        }\n\n    }\n    return new __Chart(_props);\n}\n\nexport const Chart: typeof Chart_Class = _Chart as any;\n\nexport declare class Chart_Class extends base.react.Component<Props, State> {\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/color.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { ColumnMap, ColumnMapBaseProps } from '../controls/columnMap';\nimport { DataContent } from '../interfaces';\nimport { NewSignal } from 'vega-typings/types';\nimport { Palette } from '../palettes';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { getInitialSignalValue, Signal } from '../controls/signal';\nimport { strings } from '../language';\nimport { Group } from '../controls/group';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\n\nexport interface Props extends ColumnMapBaseProps {\n    compactUI: boolean;\n    specCapabilities: SandDance.specs.SpecCapabilities;\n    scheme: string;\n    colorColumn: string;\n    colorBin: SandDance.specs.ColorBin;\n    colorBinSignal: NewSignal;\n    colorReverseSignal: NewSignal;\n    dataContent: DataContent;\n    onColorSchemeChange: (scheme: string) => void;\n    onColorBinChange: (colorBin: SandDance.specs.ColorBin) => void;\n    onColorBinCountChange: (value: number) => void;\n    onColorReverseChange: (value: boolean) => void;\n    disabled: boolean;\n    directColor: boolean;\n    onDirectColorChange: (value: boolean) => void;\n}\n\nexport function Color(props: Props) {\n    const colorColumn = props.dataContent.columns.filter(c => c.name === props.colorColumn)[0];\n    const disabledColorBin = !colorColumn || !colorColumn.quantitative || props.directColor;\n    const colorBin = props.colorBin || 'quantize';\n    const dropdownRef = base.react.createRef<FluentUITypes.IDropdown>();\n    props.explorer.dialogFocusHandler.focus = ()=> dropdownRef.current?.focus();\n    return (\n        <div className=\"sanddance-color-dialog\">\n            <Group label={strings.labelColor}>\n                <ColumnMap\n                    {...props}\n                    componentRef={dropdownRef}\n                    collapseLabel={props.compactUI}\n                    selectedColumnName={props.colorColumn}\n                    specRole={props.specCapabilities && props.specCapabilities.roles.filter(r => r.role === 'color')[0]}\n                    key={0}\n                />\n                {colorColumn && colorColumn.isColorData && <div\n                    className=\"sanddance-explanation\"\n                    dangerouslySetInnerHTML={{ __html: strings.labelColorFieldIsColorData(colorColumn.name) }}\n                />}\n                {colorColumn && !colorColumn.isColorData && <Palette\n                    collapseLabel={props.compactUI}\n                    scheme={props.scheme}\n                    colorColumn={colorColumn}\n                    changeColorScheme={scheme => {\n                        props.onColorSchemeChange(scheme);\n                    }}\n                    disabled={props.disabled || props.directColor || (colorColumn && colorColumn.isColorData)}\n                />}\n                {colorColumn && !colorColumn.isColorData && <Signal\n                    disabled={props.disabled || !colorColumn || props.directColor || (colorColumn && colorColumn.isColorData)}\n                    signal={props.colorReverseSignal}\n                    explorer={props.explorer}\n                    initialValue={getInitialSignalValue(props.explorer, props.colorReverseSignal)}\n                    onChange={props.onColorReverseChange}\n                    collapseLabel={props.compactUI}\n                />}\n            </Group>\n            {colorColumn && !colorColumn.isColorData && <Group label={strings.labelColorBin}>\n                <div className=\"sanddance-explanation\">{strings.labelColorBinExplanation}</div>\n                <base.fluentUI.ChoiceGroup\n                    selectedKey={colorBin}\n                    options={[\n                        {\n                            key: 'continuous',\n                            text: strings.labelColorBinNone,\n                            disabled: disabledColorBin,\n                        },\n                        {\n                            key: 'quantize',\n                            text: strings.labelColorBinQuantize,\n                            disabled: disabledColorBin,\n                        },\n                        {\n                            key: 'quantile',\n                            text: strings.labelColorBinQuantile,\n                            disabled: disabledColorBin,\n                        },\n                    ]}\n                    onChange={(e, o) => {\n                        props.onColorBinChange(o.key as SandDance.specs.ColorBin);\n                    }}\n                />\n                <Signal\n                    disabled={props.disabled || disabledColorBin || props.colorBin === 'continuous'}\n                    signal={props.colorBinSignal}\n                    explorer={props.explorer}\n                    initialValue={getInitialSignalValue(props.explorer, props.colorBinSignal)}\n                    onChange={props.onColorBinCountChange}\n                    collapseLabel={props.compactUI}\n                />\n            </Group>}\n            {colorColumn && !colorColumn.isColorData && <Group label={strings.labelColorOptions}>\n                <base.fluentUI.Toggle\n                    label={strings.selectDirectColor}\n                    disabled={!colorColumn.stats.hasColorData}\n                    checked={!!(colorColumn.stats.hasColorData && props.directColor)}\n                    onChange={(e, checked?: boolean) => props.onDirectColorChange(checked)}\n                />\n                <div className=\"sanddance-explanation\" dangerouslySetInnerHTML={{ __html: strings.labelDataColors }} />\n            </Group>}\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/dataBrowser.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { DataExportHandler } from '../interfaces';\nimport { DataExportPicker, removeExtensions } from '../controls/dataExporter';\nimport { DataItem } from '../controls/dataItem';\nimport { DataScopeId } from '../controls/dataScope';\nimport { Dropdown } from '../controls/dropdown';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { Group } from '../controls/group';\nimport { IconButton } from '../controls/iconButton';\nimport { InputSearchExpressionGroup } from './search';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { strings } from '../language';\nimport { Explorer_Class } from '../explorer';\nimport { ColumnTypeChanger } from '../controls/columnTypeChanger';\n\nexport const dataBrowserZeroMessages: { [key: number]: string } = {};\ndataBrowserZeroMessages[DataScopeId.AllData] = strings.labelZeroAll;\ndataBrowserZeroMessages[DataScopeId.FilteredData] = null; //empty array is not used\ndataBrowserZeroMessages[DataScopeId.SelectedData] = strings.labelZeroSearchResults;\n\nexport const dataBrowserNullMessages: { [key: number]: string } = {};\ndataBrowserNullMessages[DataScopeId.AllData] = strings.labelDataNullAll;\ndataBrowserNullMessages[DataScopeId.FilteredData] = strings.labelDataNullFiltered;\ndataBrowserNullMessages[DataScopeId.SelectedData] = strings.labelDataNullSelection;\n\nexport interface Props {\n    data: object[];\n    index: number;\n    onActivate: { (row: object, index: number): void };\n    onSearch?: { (event: React.MouseEvent<{}>, search: InputSearchExpressionGroup[]): void };\n    bingSearchDisabled: boolean;\n    columns: SandDance.types.Column[];\n    quantitativeColumns: SandDance.types.Column[];\n    categoricalColumns: SandDance.types.Column[];\n    disabled?: boolean;\n    nullMessage: string;\n    zeroMessage: string;\n    itemVisible: boolean;\n    theme: string;\n    themePalette: Partial<FluentUITypes.IPalette>;\n    dataExportHandler: DataExportHandler;\n    selectedDataScope: DataScopeId;\n    onDataScopeClick: (dataScopeId: DataScopeId) => void;\n    displayName: string;\n    explorer: Explorer_Class;\n    onUpdateColumnTypes: (columnTypes: SandDance.types.ColumnTypeMap) => void;\n}\n\nexport function DataBrowser(props: Props) {\n    function activateRecord(newIndex: number) {\n        props.onActivate(props.data[newIndex], newIndex);\n    }\n    const { index } = props;\n    const length = props.data && props.data.length || 0;\n    const dropdownRef = base.react.createRef<FluentUITypes.IDropdown>();\n    props.explorer.dialogFocusHandler.focus = () => dropdownRef.current?.focus();\n\n    return (\n        <Group label={strings.labelDataBrowser} className=\"sanddance-dataIndex\">\n            <Dropdown\n                componentRef={dropdownRef}\n                label={strings.labelDataScope}\n                collapseLabel={true}\n                options={[\n                    {\n                        key: DataScopeId.AllData,\n                        text: strings.selectDataSpanAll,\n                        isSelected: props.selectedDataScope === DataScopeId.AllData,\n                    },\n                    {\n                        key: DataScopeId.FilteredData,\n                        text: strings.selectDataSpanFilter,\n                        isSelected: props.selectedDataScope === DataScopeId.FilteredData,\n                    },\n                    {\n                        key: DataScopeId.SelectedData,\n                        text: strings.selectDataSpanSelection,\n                        isSelected: props.selectedDataScope === DataScopeId.SelectedData,\n                    },\n                ]}\n                onChange={(e, o) => {\n                    props.onDataScopeClick(o.key as DataScopeId);\n                }}\n            />\n            {!props.data && <div dangerouslySetInnerHTML={{ __html: props.nullMessage }}></div>}\n            {props.data && !props.data.length && <div>{props.zeroMessage}</div>}\n            {!!length && <div>\n                <div className=\"index\">\n                    <IconButton\n                        themePalette={props.themePalette}\n                        iconName=\"ChevronLeftMed\"\n                        onClick={e => activateRecord(index <= 0 ? length - 1 : index - 1)}\n                        disabled={props.disabled || length === 1}\n                        title={strings.buttonPrevDataItem}\n                    />\n                    <span>{strings.record(index + 1, length)}</span>\n                    <IconButton\n                        themePalette={props.themePalette}\n                        iconName=\"ChevronRightMed\"\n                        onClick={e => activateRecord(index >= length - 1 ? 0 : index + 1)}\n                        disabled={props.disabled || length === 1}\n                        title={strings.buttonNextDataItem}\n                    />\n                </div>\n                {!props.itemVisible && <div className=\"item-filtered\">{strings.labelDataItemIsFiltered}</div>}\n                <DataItem\n                    columns={props.columns}\n                    item={props.data[index]}\n                    disabled={props.disabled}\n                    onSearch={props.onSearch}\n                    bingSearchDisabled={props.bingSearchDisabled}\n                />\n            </div>}\n            <ColumnTypeChanger\n                theme={props.theme}\n                themePalette={props.themePalette}\n                initialCategoricalColumns={props.categoricalColumns}\n                initialQuantitativeColumns={props.quantitativeColumns}\n                onConfirmUpdate={props.onUpdateColumnTypes}\n            />\n            {props.dataExportHandler && props.data && (\n                <DataExportPicker\n                    theme={props.theme}\n                    initializer={{\n                        fileName: `${removeExtensions(props.displayName)} (${props.data.length})`,\n                    }}\n                    data={props.data}\n                    dataExportHandler={props.dataExportHandler}\n                    disabled={props.disabled}\n                />\n            )}\n        </Group>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/history.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Group } from '../controls/group';\nimport { KeyCodes } from '../keycodes';\nimport { strings } from '../language';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { SandDance, util } from '@msrvida/sanddance-react';\nimport { Explorer_Class } from '../explorer';\n\nexport interface HistoricInsight extends SandDance.specs.Insight {\n    rebaseFilter?: boolean;\n    historicSetup?: SandDance.types.Setup;\n}\n\nexport interface HistoryAction {\n    insert?: boolean;\n    omit?: boolean;\n    label: string;\n}\n\nexport interface HistoryItem {\n    label: string;\n    historicInsight: Partial<HistoricInsight>;\n}\n\nexport interface Props {\n    disabled?: boolean;\n    themePalette: Partial<FluentUITypes.IPalette>;\n    historyIndex: number;\n    historyItems: HistoryItem[];\n    redo: (historyIndex: number) => void;\n    explorer: Explorer_Class;\n}\n\nexport function History(props: Props) {\n    return (\n        <Group label={strings.labelHistory} className=\"sanddance-history\">\n            <ol>\n                {props.historyItems.map((hi, i) => {\n                    let ref: React.RefObject<FluentUITypes.IButton>;\n                    if (i === props.historyIndex) {\n                        ref = base.react.createRef<FluentUITypes.IButton>();\n                        props.explorer.dialogFocusHandler.focus = () => {\n                            ref.current?.focus();\n                        };\n                    }\n                    return (\n                        <li\n                            key={i}\n                            className={util.classList(i === props.historyIndex && 'selected')}\n                            onKeyUp={e => {\n                                if (e.keyCode === KeyCodes.ENTER) {\n                                    props.redo(i);\n                                }\n                            }}\n                        >\n                            <base.fluentUI.DefaultButton\n                                className='sanddance-history-button'\n                                componentRef={ref}\n                                text={hi.label}\n                                onClick={() => props.redo(i)}\n                            />\n                        </li>\n                    );\n                })}\n            </ol>\n        </Group>\n    );\n}\n\nexport function getPureInsight(historicInsight: HistoricInsight) {\n    const { colorBin, columns, directColor, facetStyle, filter, hideAxes, hideLegend, scheme, signalValues, size, totalStyle, transform, chart, view } = historicInsight;\n    const insight: SandDance.specs.Insight = {\n        colorBin,\n        columns,\n        directColor,\n        facetStyle,\n        filter,\n        hideAxes,\n        hideLegend,\n        scheme,\n        signalValues,\n        size,\n        totalStyle,\n        transform,\n        chart,\n        view,\n    };\n    return insight;\n}\n\nexport function replay(historyItems: HistoryItem[], index: number): Partial<HistoricInsight> {\n    let filter: SandDance.searchExpression.Search = null;\n    let historicInsight: Partial<HistoricInsight> = {};\n    for (let i = 0; i < index + 1; i++) {\n        const historyItem = historyItems[i];\n        if (historyItem) {\n            if (historyItem.historicInsight.filter === null) {\n                filter = null;\n            } else if (historyItem.historicInsight.rebaseFilter) {\n                filter = historyItem.historicInsight.filter;\n            } else if (historyItem.historicInsight.filter) {\n                filter = SandDance.searchExpression.narrow(filter, historyItem.historicInsight.filter);\n            }\n            historicInsight = { ...historicInsight, ...historyItem.historicInsight };\n        }\n    }\n    return { ...historicInsight, filter };\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/search.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport {\n    AutoCompleteDistinctValues,\n    getValidOperators,\n    InputSearchExpression,\n    SearchTerm,\n    getText,\n} from '../controls/searchTerm';\nimport { base } from '../base';\nimport { Button } from '../controls/button';\nimport { Dropdown } from '../controls/dropdown';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { Group } from '../controls/group';\nimport { SandDance, util } from '@msrvida/sanddance-react';\nimport { strings } from '../language';\nimport { Explorer_Class } from '../explorer';\n\nimport SearchExpressionClause = SandDance.searchExpression.SearchExpressionClause;\n\nconst maxClauses = 5;\n\nexport interface InputSearchExpressionGroup extends SandDance.searchExpression.SearchExpressionGroup<InputSearchExpression> {\n    key: number;\n}\n\nexport interface IInitializer {\n    search?: InputSearchExpressionGroup[];\n    columns: SandDance.types.Column[];\n}\n\nexport interface Props {\n    collapseLabels: boolean;\n    data: object[];\n    initializer: IInitializer;\n    onSelect: { (search: SandDance.searchExpression.Search): void };\n    autoCompleteDistinctValues: AutoCompleteDistinctValues;\n    disableExpressionOR: boolean;\n    disableGroupOR: boolean;\n    disabled: boolean;\n    themePalette: Partial<FluentUITypes.IPalette>;\n    explorer: Explorer_Class;\n}\n\nexport interface State {\n    initializer: IInitializer;\n    groups: InputSearchExpressionGroup[];\n    sortedColumns: SandDance.types.Column[];\n}\n\nfunction getColumnWithName(columnName: string, columns: SandDance.types.Column[]) {\n    for (let i = 0; i < columns.length; i++) {\n        if (columns[i].name === columnName) return columns[i];\n    }\n}\n\nfunction validateExpression(ex: InputSearchExpression) {\n    if (ex.operator === 'isnullorEmpty') {\n        ex.errorMessage = null;\n        return;\n    }\n    const s = getText(ex);\n    if (s.length === 0) {\n        ex.errorMessage = strings.labelRequired;\n    } else {\n        ex.errorMessage = null;\n    }\n}\n\nfunction clearExpressionValidation(ex: InputSearchExpression) {\n    if (ex.operator === 'isnullorEmpty') {\n        ex.errorMessage = null;\n        return;\n    }\n    const s = getText(ex);\n    if (s.length !== 0) {\n        ex.errorMessage = null;\n    }\n}\n\nfunction getGroupClauses(currClause: SearchExpressionClause, index: number, disableGroupOR: boolean) {\n    let keys: [SearchExpressionClause, string][];\n    if (index === 0) {\n        keys = [\n            [null, strings.searchWHERE],\n        ];\n    } else {\n        keys = [\n            ['&&', strings.searchAND],\n        ];\n        if (!disableGroupOR) {\n            keys.push(['||', strings.searchOR]);\n        }\n    }\n    return keys.map((key: [SearchExpressionClause, string], i: number) => {\n        const [clause, text] = key;\n        const selected = currClause == clause; //deliberate double equal \n        const option: FluentUITypes.IDropdownOption = {\n            key: i,\n            text,\n            data: clause,\n            selected,\n        };\n        return option;\n    });\n}\n\nfunction _Search(_props: Props) {\n    class __Search extends base.react.Component<Props, State> {\n        private dropdownRef: React.RefObject<FluentUITypes.IDropdown>;\n\n        constructor(props: Props) {\n            super(props);\n            this.state = this.getInitialState(this.props);\n            this.dropdownRef = base.react.createRef<FluentUITypes.IDropdown>();\n            props.explorer.dialogFocusHandler.focus = () => this.dropdownRef.current?.focus();\n        }\n\n        getInitialState(props: Props) {\n            const initialState: State = {\n                groups: props.initializer.search || [this.newGroup(0, null)],\n                sortedColumns: [...props.initializer.columns].sort((a, b) => a.name.localeCompare(b.name)),\n                initializer: props.initializer,\n            };\n            initialState.groups.forEach(group => {\n                group.expressions.forEach(ex => ex.unlocked = group.expressions.length <= 2);\n            });\n            return initialState;\n        }\n\n        componentDidUpdate() {\n            if (!util.deepCompare(this.props.initializer, this.state.initializer)) {\n                this.setState(this.getInitialState(this.props));\n            }\n        }\n\n        validateAndSearch() {\n            const groups: InputSearchExpressionGroup[] = [...this.state.groups];\n            groups.forEach(group => {\n                group.expressions.forEach(validateExpression);\n                const errors = group.expressions.reduce((p, c) => p || c.errorMessage, '');\n                if (errors) {\n                    this.setState({ groups });\n                } else {\n                    this.props.onSelect(this.state.groups);\n                }\n            });\n        }\n\n        newGroup(key: number, clause: SearchExpressionClause) {\n            const group: InputSearchExpressionGroup = {\n                key,\n                clause,\n                expressions: [this.newExpression(0, null)],\n            };\n            return group;\n        }\n\n        updateGroup(partialGroup: Partial<InputSearchExpressionGroup>, groupIndex: number) {\n            const groups: InputSearchExpressionGroup[] = [...this.state.groups];\n            const group = {\n                ...groups[groupIndex],\n                ...partialGroup,\n            };\n            groups[groupIndex] = group;\n            this.setState({ groups });\n        }\n\n        addGroup() {\n            const groups: InputSearchExpressionGroup[] = [...this.state.groups];\n            const maxKey = groups.reduce((max, p) => p.key > max ? p.key : max, groups[0].key);\n            const newGroup = this.newGroup(maxKey + 1, '&&');\n            groups.push(newGroup);\n            this.setState({ groups });\n        }\n\n        deleteGroup(groupIndex: number) {\n            const groups: InputSearchExpressionGroup[] = [...this.state.groups];\n            groups.splice(groupIndex, 1);\n            this.setState({ groups });\n        }\n\n        newExpression(key: number, clause: SearchExpressionClause) {\n            const ex: InputSearchExpression = { key, clause, name: null, operator: 'contains', value: '' };\n            return ex;\n        }\n\n        addExpression(groupIndex: number) {\n            const groups: InputSearchExpressionGroup[] = [...this.state.groups];\n            const group = { ...groups[groupIndex] };\n            const expressions = [...group.expressions];\n            const maxKey = expressions.reduce((max, p) => p.key > max ? p.key : max, expressions[0].key);\n            const newEx = this.newExpression(maxKey + 1, '&&');\n            expressions.push(newEx);\n            if (expressions.length === 2) {\n                newEx.unlocked = true;\n            } else {\n                expressions.forEach(ex => ex.unlocked = false);\n                newEx.clause = expressions[1].clause;\n            }\n            group.expressions = expressions;\n            groups[groupIndex] = group;\n            this.setState({ groups });\n        }\n\n        updateExpression(partialEx: Partial<InputSearchExpression>, groupIndex: number, index: number) {\n            const groups: InputSearchExpressionGroup[] = [...this.state.groups];\n            const group = { ...groups[groupIndex] };\n            const expressions = [...group.expressions];\n            const currentEx = expressions[index];\n            if (currentEx.name !== partialEx.name) {\n                //choose an appropriate operator when switching data type\n                const oldColumn = getColumnWithName(currentEx.name, this.state.sortedColumns);\n                const newColumn = getColumnWithName(partialEx.name, this.state.sortedColumns);\n                const oldType = oldColumn && oldColumn.type;\n                const newType = newColumn && newColumn.type;\n                if (oldType !== newType) {\n                    const newOperators = getValidOperators(newColumn).map(validOperator => validOperator[0]);\n                    //see if old operator is compatible\n                    if (newOperators.indexOf(currentEx.operator) < 0) {\n                        //not compatible, so choose \"equal\"\n                        partialEx.operator = '==';\n                    }\n                }\n            }\n            const ex = { ...currentEx, ...partialEx };\n            clearExpressionValidation(ex);\n            expressions[index] = ex;\n            group.expressions = expressions;\n            groups[groupIndex] = group;\n            this.setState({ groups });\n        }\n\n        deleteExpression(groupIndex: number, index: number) {\n            const groups: InputSearchExpressionGroup[] = [...this.state.groups];\n            const group = { ...groups[groupIndex] };\n            const expressions: InputSearchExpression[] = [...group.expressions];\n            expressions.splice(index, 1);\n            if (expressions.length === 2) {\n                expressions[1].unlocked = true;\n            }\n            group.expressions = expressions;\n            groups[groupIndex] = group;\n            this.setState({ groups });\n        }\n\n        render() {\n            return (\n                <Group\n                    className=\"sanddance-search\"\n                    label={strings.labelSearch}\n                >\n                    <div>\n                        {this.state.groups.map((group, groupIndex) => (\n                            <div\n                                className=\"sanddance-search-group\"\n                                key={group.key}\n                            >\n                                <Dropdown\n                                    collapseLabel={this.props.collapseLabels}\n                                    className=\"search-group-clause\"\n                                    label={strings.labelSearchClause}\n                                    disabled={groupIndex === 0 || this.props.disableGroupOR}\n                                    dropdownWidth={120}\n                                    options={getGroupClauses(group.clause, groupIndex, this.props.disableGroupOR)}\n                                    onChange={(e, o) => this.updateGroup({ clause: (o.data as SearchExpressionClause) }, groupIndex)}\n                                />\n                                <div>\n                                    {group.expressions.map((ex, i) => (\n                                        <div\n                                            className=\"sanddance-search-expression\"\n                                            key={ex.key}\n                                        >\n                                            <SearchTerm\n                                                dropdownRef={groupIndex === 0 && i === 0 ? this.dropdownRef : undefined}\n                                                collapseLabels={this.props.collapseLabels}\n                                                onUpdateExpression={(ex, i) => this.updateExpression(ex, groupIndex, i)}\n                                                autoCompleteDistinctValues={this.props.autoCompleteDistinctValues}\n                                                index={i}\n                                                columns={this.state.sortedColumns}\n                                                data={this.props.data}\n                                                searchExpression={ex}\n                                                disableOR={this.props.disableExpressionOR}\n                                                column={getColumnWithName(ex.name, this.state.sortedColumns)}\n                                            />\n                                            {group.expressions.length > 1 && (\n                                                <Button\n                                                    themePalette={this.props.themePalette}\n                                                    className=\"search-action\"\n                                                    iconName=\"Cancel\"\n                                                    onClick={() => this.deleteExpression(groupIndex, i)}\n                                                    text={strings.buttonDeleteExpression}\n                                                />\n                                            )}\n                                        </div>\n                                    ))}\n                                </div>\n                                {group.expressions.length < maxClauses && (\n                                    <div>\n                                        <Button\n                                            themePalette={this.props.themePalette}\n                                            className=\"search-action\"\n                                            iconName=\"Add\"\n                                            onClick={() => this.addExpression(groupIndex)}\n                                            text={strings.buttonAddExpression}\n                                        />\n                                    </div>\n                                )}\n                                {this.state.groups.length > 1 && (\n                                    <Button\n                                        themePalette={this.props.themePalette}\n                                        className=\"search-action\"\n                                        iconName=\"Cancel\"\n                                        onClick={() => this.deleteGroup(groupIndex)}\n                                        text={strings.buttonDeleteExpressionGroup}\n                                    />\n                                )}\n                            </div>\n                        ))}\n                        {this.state.groups.length < maxClauses && (\n                            <div>\n                                <Button\n                                    themePalette={this.props.themePalette}\n                                    className=\"search-action search-bottom-action\"\n                                    iconName=\"Add\"\n                                    onClick={() => this.addGroup()}\n                                    text={strings.buttonAddExpressionGroup}\n                                />\n                            </div>\n                        )}\n                    </div>\n                    <base.fluentUI.PrimaryButton\n                        className=\"search-action search-bottom-action\"\n                        text={strings.buttonSelect}\n                        onClick={() => this.validateAndSearch()}\n                    />\n                </Group>\n            );\n        }\n    }\n    return new __Search(_props);\n}\n\nexport const Search: typeof Search_Class = _Search as any;\n\nexport declare class Search_Class extends base.react.Component<Props, State> {\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/settings.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as SandDanceReact from '@msrvida/sanddance-react';\nimport { base } from '../base';\nimport { capabilities } from '../canvas';\nimport { DataFile, SettingsGroup } from '../interfaces';\nimport { Dialog } from '../controls/dialog';\nimport { Dropdown } from '../controls/dropdown';\nimport { Explorer_Class } from '../explorer';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { Group } from '../controls/group';\nimport {\n    LinearScale,\n    NewSignal,\n    OrdinalScale,\n    QuantileScale,\n    QuantizeScale,\n    SequentialScale,\n    Signal as VegaSignal,\n    Spec,\n    Transforms,\n    UrlData,\n    ValuesData,\n} from 'vega-typings/types';\nimport { getInitialSignalValue, Signal } from '../controls/signal';\nimport { strings } from '../language';\nimport { version } from '../version';\n\nimport SandDance = SandDanceReact.SandDance;\n\ntype ScalesWithRange = QuantileScale | QuantizeScale | OrdinalScale | LinearScale | SequentialScale;\n\nexport interface Props {\n    additionalSettings: SettingsGroup[];\n    explorer: Explorer_Class;\n    dataFile: DataFile;\n    scheme: string;\n    hideLegend: boolean;\n    onToggleLegend: (checked: boolean) => void;\n    hideAxes: boolean;\n    onToggleAxes: (checked: boolean) => void;\n}\n\nexport interface State {\n    showSystemDialog: boolean;\n    showVegaDialog: boolean;\n    dataRefType: DataRefType;\n    spec: Spec;\n}\n\nenum DataRefType {\n    none, inline, url,\n}\n\nfunction filterSignals(signal: NewSignal) {\n    switch (signal.name) {\n        case SandDance.constants.SignalNames.XBins:\n        case SandDance.constants.SignalNames.YBins:\n        case SandDance.constants.SignalNames.FacetBins:\n        case SandDance.constants.SignalNames.FacetVBins:\n        case SandDance.constants.SignalNames.ColorBinCount:\n        case SandDance.constants.SignalNames.ColorReverse:\n        case SandDance.constants.SignalNames.PointScale:\n        case SandDance.constants.SignalNames.TreeMapMethod:\n        case SandDance.constants.SignalNames.ZGrounded:\n            return false;\n        default:\n            return !!signal.bind;\n    }\n}\n\nfunction cloneData(vegaSpec: Spec) {\n    const data0 = vegaSpec.data[0];\n    const valuesData = data0 as ValuesData;\n    const values = valuesData.values;\n    delete valuesData.values;\n    const data = SandDance.VegaMorphCharts.util.clone(vegaSpec.data);\n    valuesData.values = values;\n    return { data, values };\n}\n\nfunction cloneScales(vegaSpec: Spec) {\n    return SandDance.VegaMorphCharts.util.clone(vegaSpec.scales);\n}\n\nfunction serializeSpec(vegaSpec: Spec, datafile: DataFile, dataRefType: DataRefType, transform: Transforms[], scheme: string) {\n    const scales = cloneScales(vegaSpec);\n    const colorScale = scales.filter(scale => scale.name === SandDance.constants.ScaleNames.Color)[0];\n    if (scheme.indexOf('dual_') >= 0) {\n        (colorScale as ScalesWithRange).range = SandDance.colorSchemes.filter(cs => cs.scheme === scheme)[0].colors;\n    }\n    const clone = cloneData(vegaSpec);\n    const data0 = clone.data[0];\n    if (dataRefType === DataRefType.inline) {\n        const valuesData = data0 as ValuesData;\n        valuesData.format = { parse: 'auto', type: 'json' };\n        valuesData.values = clone.values;\n    } else if (dataRefType === DataRefType.none) {\n        const valuesData = data0 as ValuesData;\n        valuesData.values = [];\n        if (transform) {\n            if (valuesData.transform) {\n                valuesData.transform.push.apply(valuesData.transform, transform);\n            } else {\n                valuesData.transform = transform;\n            }\n        }\n    } else if (dataRefType === DataRefType.url) {\n        const urlData = data0 as UrlData;\n        urlData.url = datafile.dataUrl;\n        urlData.format = { parse: 'auto', type: datafile.type };\n        if (transform) {\n            if (urlData.transform) {\n                urlData.transform.push.apply(urlData.transform, transform);\n            } else {\n                urlData.transform = transform;\n            }\n        }\n    }\n    return { ...vegaSpec, data: clone.data, scales };\n}\n\nfunction defaultDataRefType(datafile: DataFile) {\n    if (datafile.dataUrl) {\n        return DataRefType.url;\n    }\n    return DataRefType.none;\n}\n\nfunction initState(props: Props): State {\n    return {\n        showSystemDialog: false,\n        showVegaDialog: false,\n        dataRefType: defaultDataRefType(props.dataFile),\n        spec: null,\n    };\n}\n\nfunction signalGroupKey(key: string) {\n    for (let i = 0; i < strings.signalGroups.length; i++) {\n        if (strings.signalGroups[i].prefix === key) {\n            return key;\n        }\n    }\n    return '*';\n}\n\nfunction vegaSignalGroups(vegaSignals: VegaSignal[]) {\n    const signalGroupMap: { [key: string]: VegaSignal[] } = {};\n    vegaSignals.forEach(vs => {\n        const split = vs.name.split('_');\n        const key = signalGroupKey(split[0]);\n        signalGroupMap[key] = signalGroupMap[key] || [];\n        signalGroupMap[key].push(vs);\n    });\n    return signalGroupMap;\n}\n\n//modeled after FluentUI ComponentRef \ninterface Focusable {\n    focus: () => void;\n}\n\nfunction _Settings(_props: Props) {\n    class __Settings extends base.react.Component<Props, State> {\n        constructor(props: Props) {\n            super(props);\n            this.state = initState(props);\n        }\n\n        render() {\n            const { props, state } = this;\n            if (!props.explorer.viewer || !props.explorer.viewer.vegaSpec) return null;\n            const options: FluentUITypes.IDropdownOption[] = [\n                {\n                    key: DataRefType.none,\n                    text: strings.selectVegaSpecDataNone,\n                    selected: this.state.dataRefType === DataRefType.none,\n                    data: DataRefType.none,\n                },\n                !props.dataFile.rawText && {\n                    key: DataRefType.url,\n                    text: strings.selectVegaSpecDataUrl,\n                    selected: this.state.dataRefType === DataRefType.url,\n                    data: DataRefType.url,\n                },\n                {\n                    key: DataRefType.inline,\n                    text: strings.selectVegaSpecDataInline,\n                    selected: this.state.dataRefType === DataRefType.inline,\n                    data: DataRefType.inline,\n                },\n            ].filter(Boolean);\n            const signalGroupMap = vegaSignalGroups(props.explorer.viewer.vegaSpec.signals);\n            let first = true;\n            return (\n                <div>\n                    {strings.signalGroups.map((sg: { prefix: string, label: string }, gi) => {\n                        const vegaSignals = signalGroupMap[sg.prefix];\n                        if (vegaSignals) {\n                            const filteredVegaSignals = vegaSignals.filter(filterSignals);\n                            if (filteredVegaSignals.length > 0) {\n                                return (\n                                    <Group\n                                        key={sg.prefix}\n                                        label={sg.label}\n                                    >\n                                        {filteredVegaSignals.map((signal, i) => {\n                                            const ref = base.react.createRef();\n                                            if (first) {\n                                                first = false;\n                                                props.explorer.dialogFocusHandler.focus = () => {\n                                                    const f = ref.current as Focusable;\n                                                    if (f?.focus) {\n                                                        f.focus();\n                                                    }\n                                                };\n                                            }\n                                            return (\n                                                <Signal\n                                                    componentRef={ref}\n                                                    key={i}\n                                                    signal={signal}\n                                                    explorer={props.explorer}\n                                                    initialValue={getInitialSignalValue(props.explorer, signal)}\n                                                    newViewStateTarget={false}\n                                                />\n                                            );\n                                        })}\n                                    </Group>\n                                );\n                            }\n                        }\n                    })}\n                    <Group label={strings.labelChartCanvas}>\n                        <base.fluentUI.Toggle\n                            label={strings.labelShowAxes}\n                            defaultChecked={!props.hideAxes}\n                            onChange={(e, checked?) => props.onToggleAxes(!checked)}\n                        />\n                        <base.fluentUI.Toggle\n                            label={strings.labelShowLegend}\n                            defaultChecked={!props.hideLegend}\n                            onChange={(e, checked?) => props.onToggleLegend(!checked)}\n                        />\n                    </Group>\n                    <Group label={strings.labelTools}>\n                        <base.fluentUI.DefaultButton\n                            text={strings.buttonShowVegaSpec}\n                            onClick={() => this.setState({\n                                showVegaDialog: true,\n                                spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, this.state.dataRefType, props.explorer.viewer.getInsight().transform, this.props.scheme),\n                            })}\n                        />\n                    </Group>\n                    <Group label={strings.labelSnapshots}>\n                        <base.fluentUI.Slider\n                            label={strings.labelSnapshotSettingThumbnailWidth}\n                            onChange={value => {\n                                this.props.explorer.snapshotThumbWidth = value;\n                            }}\n                            min={100}\n                            max={800}\n                            defaultValue={this.props.explorer.snapshotThumbWidth}\n                        />\n                    </Group>\n                    {props.additionalSettings && props.additionalSettings.map((g, i) => (\n                        <Group key={i} label={g.groupLabel}>\n                            {g.children}\n                        </Group>\n                    ))}\n                    <Group label={strings.labelSystem}>\n                        <base.fluentUI.DefaultButton\n                            text={strings.labelSystemInfo}\n                            onClick={() => this.setState({ showSystemDialog: true })}\n                        />\n                    </Group>\n                    <Dialog\n                        hidden={!state.showVegaDialog}\n                        onDismiss={() => this.setState(initState(this.props))}\n                        minWidth=\"80%\"\n                        title={strings.labelVegaSpec}\n                        buttons={[\n                            (\n                                <base.fluentUI.PrimaryButton\n                                    key=\"copy\"\n                                    iconProps={{ iconName: 'Copy' }}\n                                    text={strings.buttonCopyToClipboard}\n                                    onClick={() => {\n                                        const pre = document.getElementById('sanddance-vega-spec') as HTMLPreElement;\n                                        const range = document.createRange();\n                                        range.selectNode(pre);\n                                        const selection = window.getSelection();\n                                        selection.removeAllRanges();\n                                        selection.addRange(range);\n                                        document.execCommand('copy');\n                                    }}\n                                />\n                            ),\n                            (\n                                <base.fluentUI.DefaultButton\n                                    key=\"edit\"\n                                    iconProps={{ iconName: 'OpenInNewWindow' }}\n                                    text={strings.buttonLaunchVegaEditor}\n                                    onClick={() => {\n                                        window.open('https://vega.github.io/editor/', '_blank');\n                                    }}\n                                />\n                            ),\n                        ]}\n                    >\n                        <Dropdown\n                            label={strings.labelVegaSpecData}\n                            options={options}\n                            onChange={(e, o) => this.setState({\n                                dataRefType: o.data,\n                                spec: serializeSpec(props.explorer.viewer.vegaSpec, props.dataFile, o.data, props.explorer.viewer.getInsight().transform, this.props.scheme),\n                            })}\n                        />\n                        <pre id=\"sanddance-vega-spec\">\n                            {JSON.stringify(this.state.spec, null, 2)}\n                        </pre>\n                        <div>\n                            {strings.labelVegaSpecNotes}\n                        </div>\n                    </Dialog>\n                    <Dialog\n                        hidden={!state.showSystemDialog}\n                        onDismiss={() => this.setState(initState(this.props))}\n                        title={strings.labelSystemInfo}\n                    >\n                        <ul>\n                            {this.props.children}\n                            <li>\n                                SandDanceExplorer version: {version}\n                            </li>\n                            <li>\n                                SandDanceReact version: {SandDanceReact.version}\n                            </li>\n                            <li>\n                                SandDance version: {SandDance.version}\n                            </li>\n                            <li>\n                                Vega-MorphCharts version: {SandDance.VegaMorphCharts.version}\n                            </li>\n                            <li>\n                                WebGL enabled: {capabilities.webgl ? strings.labelYes : strings.labelNo}\n                            </li>\n                            <li>\n                                WebGL2 enabled: {capabilities.webgl2 ? strings.labelYes : strings.labelNo}\n                            </li>\n                        </ul>\n                    </Dialog>\n                </div>\n            );\n        }\n    }\n    return new __Settings(_props);\n}\n\nexport const Settings: typeof Settings_Class = _Settings as any;\n\nexport declare class Settings_Class extends base.react.Component<Props, State> {\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/snapshotEditor.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Dialog } from '../controls/dialog';\nimport { Explorer_Class } from '../explorer';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { getCanvas } from '../canvas';\nimport { SandDance, util } from '@msrvida/sanddance-react';\nimport { strings } from '../language';\n\nimport Snapshot = SandDance.types.Snapshot;\n\nexport interface SnapshotEditorProps {\n    modifySnapShot?: (snapshot: Snapshot) => void;\n    getTitle?: (insight: SandDance.specs.Insight) => string;\n    getDescription?: (insight: SandDance.specs.Insight) => string;\n}\n\nexport interface Props extends SnapshotEditorProps {\n    explorer: Explorer_Class;\n    theme: string;\n    onWriteSnapshot: (snapshot: Snapshot, editIndex: number) => void;\n    themePalette: Partial<FluentUITypes.IPalette>;\n}\n\nexport interface Confirmation {\n    buttonText: string;\n    handler: () => void;\n}\n\nexport interface State extends Snapshot {\n    showEditFormDialog: boolean;\n    editIndex: number;\n}\n\nfunction _SnapshotEditor(_props: Props) {\n    class __SnapshotEditor extends base.react.Component<Props, State>{\n        constructor(props: Props) {\n            super(props);\n            this.state = {\n                showEditFormDialog: false,\n                title: '',\n                description: '',\n                image: null,\n                bgColor: null,\n                insight: null,\n                editIndex: -1,\n            };\n        }\n\n        private resize(src: string, thumbWidth: number) {\n            if (!src) return;\n            const img = new Image();\n            img.onload = () => {\n                const canvas = document.createElement('canvas'), ctx = canvas.getContext('2d');\n                const ratio = img.width / thumbWidth;\n                canvas.height = img.height / ratio;\n                canvas.width = thumbWidth;\n                ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n                const image = canvas.toDataURL();\n                this.setState({ image });\n            };\n            img.src = src;\n        }\n\n        public editSnapshot(snapshot?: Snapshot, editIndex = -1) {\n            if (snapshot) {\n                this.setState({ showEditFormDialog: true, ...snapshot, editIndex });\n            } else {\n                const { explorer } = this.props;\n                const signalValues = explorer.viewer.getSignalValues();\n                explorer.viewer.deselect().then(() => {\n                    const canvas = getCanvas(explorer.viewer);\n                    const bgColor = canvas && window.getComputedStyle(canvas).backgroundColor;\n                    const insight = SandDance.VegaMorphCharts.util.clone(explorer.viewer.getInsight());\n                    delete insight.size;\n                    insight.signalValues = signalValues;\n                    const title = this.props.getTitle && this.props.getTitle(insight) || '';\n                    const description = this.props.getDescription && this.props.getDescription(insight) || '';\n                    this.setState({ showEditFormDialog: true, bgColor, title, description, insight, image: null, editIndex });\n\n                    //allow deselection to render\n                    setTimeout(() => {\n                        explorer.viewer.presenter.canvasToDataURL().then(dataUrl => {\n                            this.resize(dataUrl, explorer.snapshotThumbWidth);\n                        });\n                    }, 500);\n                });\n            }\n        }\n\n        render() {\n            const { explorer } = this.props;\n            return (\n                <Dialog\n                    modalProps={{ className: util.classList('sanddance-snapshot-dialog', this.props.theme) }}\n                    minWidth={`${explorer.snapshotThumbWidth + 64}px`}\n                    hidden={!this.state.showEditFormDialog}\n                    onDismiss={() => this.setState({ showEditFormDialog: false })}\n                    title={this.state.editIndex >= 0 ? strings.buttonEditSnapshot : strings.buttonCreateSnapshot}\n                    buttons={(\n                        <base.fluentUI.PrimaryButton\n                            disabled={!this.state.image || !this.state.title}\n                            key={0}\n                            onClick={e => {\n                                const setup = SandDance.VegaMorphCharts.util.clone(explorer.getSetup());\n                                if (setup.camera !== 'hold') {\n                                    //get the latest camera movement, instead of what's in state\n                                    setup.camera = explorer.viewer.getCamera();\n                                }\n                                const snapshot: Snapshot = {\n                                    title: this.state.title,\n                                    description: this.state.description,\n                                    insight: this.state.insight,\n                                    image: this.state.image,\n                                    bgColor: this.state.bgColor,\n                                    setup,\n                                };\n                                this.props.modifySnapShot && this.props.modifySnapShot(snapshot);\n                                this.props.onWriteSnapshot(snapshot, this.state.editIndex);\n                                this.setState({ showEditFormDialog: false, title: '', description: '', image: null });\n                            }}\n                            iconProps={{ iconName: 'Camera' }}\n                            text={this.state.editIndex >= 0 ? strings.buttonUpdateSnapshot : strings.buttonCreateSnapshot}\n                        />\n                    )}\n                >\n                    <base.fluentUI.TextField\n                        label={strings.labelSnapshotTitle}\n                        onChange={(e, title) => this.setState({ title })}\n                        value={this.state.title}\n                    />\n                    <base.fluentUI.TextField\n                        label={strings.labelSnapshotDescription}\n                        onChange={(e, description) => this.setState({ description })}\n                        value={this.state.description}\n                        multiline={true}\n                    />\n                    <div className='thumbnail'>\n                        {!this.state.image && <base.fluentUI.Spinner />}\n                        {this.state.image && <img src={this.state.image} style={{ backgroundColor: this.state.bgColor }} />}\n                    </div>\n                    {explorer.viewer?.colorContexts?.length > 1 && <div>{strings.labelColorFilter}</div>}\n                </Dialog>\n            );\n        }\n    }\n    return new __SnapshotEditor(_props);\n}\n\nexport const SnapshotEditor: typeof SnapshotEditor_Class = _SnapshotEditor as any;\n\nexport declare class SnapshotEditor_Class extends base.react.Component<Props, State> {\n    public editSnapshot(snapshot?: Snapshot, editIndex?: number)\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/snapshots.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Dialog } from '../controls/dialog';\nimport { Explorer_Class } from '../explorer';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { Group } from '../controls/group';\nimport { IconButton } from '../controls/iconButton';\nimport { SandDance, util } from '@msrvida/sanddance-react';\nimport { SnapshotAction } from '../interfaces';\nimport { strings } from '../language';\nimport { SnapshotEditor_Class } from './snapshotEditor';\n\nimport Snapshot = SandDance.types.Snapshot;\n\nexport interface SnapshotListProps {\n    getTopActions?: (snapshots: Snapshot[]) => FluentUITypes.IContextualMenuItem[];\n    getActions?: (snapshot: Snapshot, snapshotIndex: number) => SnapshotAction[];\n    getChildren?: (snapshots: Snapshot[]) => React.ReactNode;\n}\n\nexport interface Props extends SnapshotListProps {\n    explorer: Explorer_Class;\n    editor: SnapshotEditor_Class;\n    snapshots: Snapshot[];\n    selectedSnapshotIndex: number;\n    onClearSnapshots: () => void;\n    onWriteSnapshot: (snapshot: Snapshot, editIndex: number) => void;\n    onRemoveSnapshot: (i: number) => void;\n    onMoveUp: (i: number) => void;\n    onMoveDown: (i: number) => void;\n    onSnapshotClick?: (snapshot: Snapshot, index: number) => void;\n    themePalette: Partial<FluentUITypes.IPalette>;\n}\n\nexport interface Confirmation {\n    buttonText: string;\n    handler: () => void;\n}\n\nexport interface State extends Snapshot {\n    confirmation: Confirmation;\n}\nfunction _Snapshots(_props: Props) {\n    class __Snapshots extends base.react.Component<Props, State>{\n        constructor(props: Props) {\n            super(props);\n            this.state = {\n                confirmation: null,\n                title: '',\n                description: '',\n                image: null,\n                bgColor: null,\n                insight: null,\n            };\n        }\n\n        render() {\n            const items: FluentUITypes.IContextualMenuItem[] = [\n                {\n                    key: 'clear',\n                    text: strings.buttonClearSnapshots,\n                    onClick: () => this.setState({\n                        confirmation: {\n                            buttonText: strings.buttonClearSnapshots,\n                            handler: () => this.props.onClearSnapshots(),\n                        },\n                    }),\n                    disabled: this.props.snapshots.length === 0,\n                },\n            ];\n            if (this.props.getTopActions) {\n                items.push.apply(items, this.props.getTopActions(this.props.snapshots));\n            }\n            const ref = base.react.createRef<FluentUITypes.IButton>();\n            this.props.explorer.dialogFocusHandler.focus = () => {\n                ref.current?.focus();\n            };\n            return (\n                <Group className=\"sanddance-snapshots\" label={strings.labelSnapshots}>\n                    <div>\n                        <base.fluentUI.PrimaryButton\n                            componentRef={ref}\n                            text={strings.buttonCreateSnapshot}\n                            onClick={e => this.props.editor.editSnapshot()}\n                            split\n                            menuProps={{\n                                items,\n                            }}\n                        />\n                        {this.props.getChildren && this.props.getChildren(this.props.snapshots)}\n                        {this.state.confirmation && (\n                            <Dialog\n                                hidden={false}\n                                buttons={(\n                                    <base.fluentUI.PrimaryButton\n                                        key={0}\n                                        onClick={e => {\n                                            this.setState({ confirmation: null });\n                                            this.state.confirmation.handler();\n                                        }}\n                                        iconProps={{ iconName: 'Delete' }}\n                                        text={this.state.confirmation.buttonText}\n                                    />\n                                )}\n                                onDismiss={() => this.setState({ confirmation: null })}\n                            >\n                                {strings.labelConfirmation}\n                            </Dialog>\n                        )}\n                        <div>\n                            {this.props.snapshots.map((snapshot, i) => {\n                                const actions: SnapshotAction[] = this.props.getActions && this.props.getActions(snapshot, i) || [];\n                                actions.push(\n                                    {\n                                        iconButtonProps: {\n                                            themePalette: this.props.themePalette,\n                                            title: strings.buttonEditSnapshot,\n                                            onClick: e => this.props.editor.editSnapshot(snapshot, i),\n                                            iconName: 'Edit',\n                                        },\n                                    },\n                                );\n                                if (this.props.snapshots.length > 1) {\n                                    actions.push(\n                                        {\n                                            iconButtonProps: {\n                                                disabled: i === 0,\n                                                themePalette: this.props.themePalette,\n                                                title: strings.buttonMoveUp,\n                                                onClick: e => this.props.onMoveUp(i),\n                                                iconName: 'SortUp',\n                                            },\n                                        },\n                                        {\n                                            iconButtonProps: {\n                                                disabled: i > this.props.snapshots.length - 2,\n                                                themePalette: this.props.themePalette,\n                                                title: strings.buttonMoveDown,\n                                                onClick: e => this.props.onMoveDown(i),\n                                                iconName: 'SortDown',\n                                            },\n                                        },\n                                    );\n                                }\n                                actions.push(\n                                    {\n                                        iconButtonProps: {\n                                            themePalette: this.props.themePalette,\n                                            title: strings.buttonDeleteSnapshot,\n                                            onClick: () =>\n                                                this.setState({\n                                                    confirmation: {\n                                                        buttonText: strings.buttonDeleteSnapshot,\n                                                        handler: () => this.props.onRemoveSnapshot(i),\n                                                    },\n                                                }),\n                                            iconName: 'Delete',\n                                        },\n                                    },\n                                );\n                                return (\n                                    <div key={i} className={util.classList('snapshot', i === this.props.selectedSnapshotIndex && 'selected')}>\n                                        <div\n                                            onClick={e => this.props.onSnapshotClick(snapshot, i)}\n                                        >\n                                            <div className='title'>\n                                                {snapshot.title}\n                                            </div>\n                                            <div className='thumbnail'>\n                                                <img title={snapshot.description} src={snapshot.image} style={{ backgroundColor: snapshot.bgColor }} />\n                                            </div>\n                                        </div>\n                                        <Actions\n                                            actions={actions}\n                                            snapshot={snapshot}\n                                        />\n                                    </div>\n                                );\n                            })}\n                        </div>\n                    </div>\n                </Group>\n            );\n        }\n    }\n    return new __Snapshots(_props);\n}\n\nexport const Snapshots: typeof Snapshots_Class = _Snapshots as any;\n\nexport declare class Snapshots_Class extends base.react.Component<Props, State> {\n}\n\ninterface ActionsProps {\n    actions: SnapshotAction[];\n    snapshot: Snapshot;\n}\n\nfunction Actions(props: ActionsProps) {\n    return (\n        <div className=\"actions\">\n            {props.actions.map((action, i) => {\n                if (action.iconButtonProps) {\n                    return (\n                        <IconButton key={i} {...action.iconButtonProps} />\n                    );\n                }\n                if (action.element) {\n                    return action.element;\n                }\n            })}\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/dialogs/transition.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Group } from '../controls/group';\nimport { strings } from '../language';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { Explorer_Class, State as ExplorerState } from '../explorer';\nimport { ColumnMapBaseProps } from '../controls/columnMap';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { Dropdown } from '../controls/dropdown';\nimport { IconButton } from '../controls/iconButton';\nimport { Button } from '../controls/button';\n\nexport interface TransitionEdits {\n    transitionType: SandDance.types.TransitionType;\n    transitionReverse?: boolean;\n    transitionColumn?: SandDance.types.Column;\n    transitionDimension: SandDance.types.Dimension3D;\n    transitionDurations: SandDance.VegaMorphCharts.types.TransitionDurations;\n}\n\nexport interface Props extends ColumnMapBaseProps, TransitionEdits {\n    compactUI: boolean;\n    themePalette: Partial<FluentUITypes.IPalette>;\n    explorer: Explorer_Class;\n    changeSetup: (newState: Partial<ExplorerState>, affectsStagger: boolean) => void;\n}\n\nexport interface State {\n    scrub: number;\n    staggerPercent: number;\n    totalTransition: number;\n    viewTransition: number;\n    pauseDisabled: boolean;\n}\n\nconst positions: [SandDance.types.Dimension3D, string][] = [\n    ['x', strings.labelAliasX],\n    ['y', strings.labelAliasY],\n    ['z', strings.labelAliasZ],\n];\n\nconst autoScrubInterval = 50;   //tune to get the smoothest animation while able to do an update pass through React\n\nfunction _TransitionEditor(_props: Props) {\n    class __TransitionEditor extends base.react.Component<Props, State>{\n        private autoScrubber: AutoScrubber;\n\n        constructor(props: Props) {\n            super(props);\n            this.state = {\n                scrub: 100,\n                pauseDisabled: true,\n                ...this.initialCalc(props.transitionDurations),\n            };\n            this.autoScrubber = new AutoScrubber(\n                autoScrubInterval,\n                (direction, interval) => {\n                    const totalMs = this.state.totalTransition * 1000;\n                    const currentMs = (this.state.scrub / 100) * totalMs;\n                    const scrubMs = currentMs + direction * interval;\n                    let scrub = scrubMs / totalMs * 100;\n                    if (direction < 0 && scrub <= 0) {\n                        scrub = 0;\n                        this.autoScrubber.stop();\n                    }\n                    if (direction > 0 && scrub >= 100) {\n                        scrub = 100;\n                        this.autoScrubber.stop();\n                    }\n                    this.setScrubState(scrub);\n                },\n            );\n        }\n\n        initialCalc(transitionDurations: SandDance.VegaMorphCharts.types.TransitionDurations) {\n            const totalTransition = (transitionDurations.position + transitionDurations.stagger) / 1000;\n            const staggerPercent = transitionDurations.stagger === 0 ? 1 : (transitionDurations.stagger / (totalTransition * 1000)) * 100;\n            const viewTransition = transitionDurations.view / 1000;\n            return { totalTransition, staggerPercent, viewTransition };\n        }\n\n        setScrubState(scrub: number) {\n            const { morphChartsRenderResult, morphchartsref } = this.props.explorer.viewer.presenter;\n            morphchartsref.core.renderer.transitionTime = scrub / 100;\n            morphChartsRenderResult.setTransitionTimeAxesVisibility();\n            scrub = Math.round(scrub);\n            this.setState({ scrub, pauseDisabled: this.autoScrubber.isStopped() });\n        }\n\n        setDurations() {\n            setTimeout(() => {  //allow full state to update\n                const { props, state } = this;\n                const { totalTransition, staggerPercent, viewTransition } = state;\n                const stagger = totalTransition * staggerPercent / 100;\n                const { transitionDurations } = props;\n                transitionDurations.position = (totalTransition - stagger) * 1000;\n                transitionDurations.stagger = stagger * 1000;\n                transitionDurations.view = viewTransition * 1000;\n                syncTansitionDurations(props.explorer.viewer, transitionDurations);\n                props.changeSetup(null, false);\n            });\n        }\n\n        render() {\n            const { props, state } = this;\n            const { explorer, transitionDurations, changeSetup } = props;\n            const sliderRef = base.react.createRef<FluentUITypes.ISlider>();\n            explorer.dialogFocusHandler.focus = () => sliderRef.current?.focus();\n            return (\n                <div>\n                    <Group label={strings.labelTransition}>\n                        <base.fluentUI.Slider\n                            componentRef={sliderRef}\n                            label={strings.labelTransitionScrubber}\n                            min={0}\n                            max={100}\n                            valueFormat={strings.percentValueFormat}\n                            value={state.scrub}\n                            onChange={scrub => {\n                                this.autoScrubber.stop();\n                                this.setScrubState(scrub);\n                            }}\n                        />\n                        <IconButton\n                            themePalette={props.themePalette}\n                            title={strings.buttonTransitionReverse}\n                            iconName='PlayReverseResume'\n                            onClick={() => {\n                                this.autoScrubber.toggleScrubbing(-1);\n                                if (state.scrub === 0) {\n                                    this.setState({ scrub: 100 });\n                                }\n                            }}\n                        />\n                        <IconButton\n                            themePalette={props.themePalette}\n                            title={strings.buttonTransitionPause}\n                            iconName='Pause'\n                            onClick={() => {\n                                this.autoScrubber.togglePause();\n                            }}\n                            disabled={state.pauseDisabled}\n                        />\n                        <IconButton\n                            themePalette={props.themePalette}\n                            title={strings.buttonTransitionPlay}\n                            iconName='PlayResume'\n                            onClick={() => {\n                                this.autoScrubber.toggleScrubbing(1);\n                                if (state.scrub === 100) {\n                                    this.setState({ scrub: 0 });\n                                }\n                            }}\n                        />\n                    </Group>\n                    <Group label={strings.labelTransitionOptions}>\n                        <base.fluentUI.Toggle\n                            label={strings.labelHoldCamera}\n                            checked={explorer.state.holdCamera}\n                            onChange={(e, holdCamera) => {\n                                changeSetup({ holdCamera }, false);\n                            }}\n                        />\n                        <base.fluentUI.ChoiceGroup\n                            label={strings.labelTransitionStaggerBy}\n                            selectedKey={props.transitionType}\n                            options={[\n                                {\n                                    key: 'ordinal',\n                                    text: strings.labelTransitionStaggerByOrdinal,\n                                },\n                                {\n                                    key: 'column',\n                                    text: strings.labelTransitionStaggerByColumn,\n                                },\n                                {\n                                    key: 'position',\n                                    text: strings.labelTransitionStaggerByPosition,\n                                },\n                            ]}\n                            onChange={(e, o) => {\n                                const transitionType = o.key as SandDance.types.TransitionType;\n                                changeSetup({ transitionType }, true);\n                            }}\n                        />\n                    </Group>\n                    <Group label={strings.labelTransitionStaggerOptions}>\n                        {(() => {\n                            switch (props.transitionType) {\n                                case 'column': {\n                                    return (\n                                        <Dropdown\n                                            collapseLabel={props.compactUI}\n                                            label={strings.labelTransitionStaggerByColumn}\n                                            options={getColumnOptions(props, props.transitionColumn.name)}\n                                            onChange={(e, o) => {\n                                                changeSetup({ transitionColumn: o.data }, true);\n                                            }}\n                                        />\n                                    );\n                                }\n                                case 'position': {\n                                    return (\n                                        <Dropdown\n                                            collapseLabel={props.compactUI}\n                                            label={strings.labelTransitionStaggerByPosition}\n                                            options={positions.map(([key, text]) => {\n                                                return { key, text, selected: props.transitionDimension === key };\n                                            })}\n                                            onChange={(e, o) => {\n                                                changeSetup({ transitionDimension: o.key as SandDance.types.Dimension2D }, true);\n                                            }}\n                                        />\n                                    );\n                                }\n                            }\n                        })()}\n                        <base.fluentUI.Toggle\n                            label={strings.labelTransitionStaggerReverse}\n                            checked={props.transitionReverse}\n                            onChange={(e, transitionReverse) => changeSetup({ transitionReverse }, true)}\n                        />\n                    </Group>\n                    <Group label={strings.labelTransitionDurations}>\n                        <base.fluentUI.Slider\n                            label={strings.labelTransitionDuration}\n                            onChange={totalTransition => {\n                                this.setState({ totalTransition });\n                                this.setDurations();\n                            }}\n                            min={0}\n                            max={5}\n                            step={0.1}\n                            value={state.totalTransition}\n                        />\n                        <base.fluentUI.Slider\n                            label={strings.labelTransitionStagger}\n                            onChange={staggerPercent => {\n                                this.setState({ staggerPercent });\n                                this.setDurations();\n                            }}\n                            min={0}\n                            max={100}\n                            valueFormat={strings.percentValueFormat}\n                            value={state.staggerPercent}\n                        />\n                        <base.fluentUI.Slider\n                            label={strings.labelTransitionCamera}\n                            onChange={viewTransition => {\n                                this.setState({ viewTransition });\n                                this.setDurations();\n                            }}\n                            min={0}\n                            max={5}\n                            step={0.1}\n                            value={state.viewTransition}\n                        />\n                        <Button\n                            themePalette={props.themePalette}\n                            onClick={() => {\n                                const defaults = SandDance.VegaMorphCharts.defaults.defaultPresenterConfig.transitionDurations;\n                                const { position, stagger, view } = defaults;\n                                transitionDurations.position = position;\n                                transitionDurations.stagger = stagger;\n                                transitionDurations.view = view;\n                                this.setState({ ...this.initialCalc(transitionDurations) });\n                                this.setDurations();\n                            }}\n                            text={strings.buttonResetToDefault}\n                        />\n                    </Group>\n                </div>\n            );\n        }\n    }\n    return new __TransitionEditor(_props);\n}\n\nexport const TransitionEditor: typeof TransitionEditor_Class = _TransitionEditor as any;\n\nexport declare class TransitionEditor_Class extends base.react.Component<Props, State> {\n}\n\nfunction groupOptions(sectionName: string, columns: SandDance.types.Column[], selectedKey: string) {\n    const options = columns.map(column => {\n        const option: FluentUITypes.IDropdownOption = {\n            key: `column:${column.name}`,\n            text: column.name,\n            data: column,\n            selected: column.name === selectedKey,\n        };\n        return option;\n    });\n    if (options.length) {\n        const option: FluentUITypes.IDropdownOption = {\n            key: sectionName,\n            text: sectionName,\n            itemType: base.fluentUI.DropdownMenuItemType.Header,\n        };\n        options.unshift(option);\n    }\n    return options;\n}\n\nfunction getColumnOptions(props: ColumnMapBaseProps, selectedKey: string) {\n    const quantitativeGroup = groupOptions(strings.selectNumeric, props.quantitativeColumns, selectedKey);\n    const categoricGroup = groupOptions(strings.selectNonNumeric, props.categoricalColumns, selectedKey);\n    return quantitativeGroup.concat(categoricGroup);\n}\n\nexport function getTransition(state: TransitionEdits): SandDance.types.Transition {\n    const reverse = state.transitionReverse;\n    switch (state.transitionType) {\n        case 'ordinal': {\n            return {\n                type: 'ordinal',\n                reverse,\n            };\n        }\n        case 'column': {\n            return {\n                type: 'column',\n                column: state.transitionColumn,\n                reverse,\n            };\n        }\n        case 'position': {\n            return {\n                type: 'position',\n                dimension: state.transitionDimension,\n                reverse,\n            };\n        }\n    }\n}\n\nexport function syncTansitionDurations(viewer: SandDance.Viewer, transitionDurations: SandDance.VegaMorphCharts.types.TransitionDurations) {\n    const config = viewer?.presenter?.morphchartsref?.core.config;\n    if (config) {\n        const { position, stagger } = transitionDurations;\n        config.transitionDuration = position;\n        config.transitionStaggering = stagger;\n    }\n}\n\ntype AutoScrubberDirection = -1 | 1;\n\nclass AutoScrubber {\n    private autoScrubTimer: number;\n    public direction: AutoScrubberDirection;\n\n    constructor(\n        public interval: number,\n        public onInterval: (\n            direction: AutoScrubberDirection,\n            interval: number,\n        ) => void,\n    ) { }\n\n    getSignedInterval() {\n        return this.interval * this.direction;\n    }\n\n    toggleScrubbing(direction: AutoScrubberDirection) {\n        if (this.isScrubbing() && direction === this.direction) {\n            this.pause();\n        } else {\n            this.start(direction);\n        }\n    }\n\n    isPaused() {\n        return !this.isScrubbing() && this.direction !== undefined;\n    }\n\n    isStopped() {\n        return !this.isScrubbing() && this.direction === undefined;\n    }\n\n    isScrubbing() {\n        return this.autoScrubTimer !== undefined;\n    }\n\n    togglePause() {\n        if (this.isScrubbing()) {\n            this.pause();\n        } else if (this.direction) {\n            this.start(this.direction);\n        }\n    }\n\n    start(direction: AutoScrubberDirection) {\n        this.direction = direction;\n        if (!this.isScrubbing()) {\n            this.autoScrubTimer = setInterval(\n                () => this.onInterval(\n                    this.direction,\n                    this.interval,\n                ),\n                this.interval,\n            );\n        }\n    }\n\n    pause() {\n        clearInterval(this.autoScrubTimer);\n        this.autoScrubTimer = undefined;\n    }\n\n    stop() {\n        this.pause();\n        this.direction = undefined;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/explorer.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from './base';\nimport { removeTabIndex } from './canvas';\nimport {\n    attachSpecRoleToAxisTitle,\n    PositionedColumnMap,\n    PositionedColumnMapProps,\n    TextWithSpecRole,\n} from './clickableTextLayer';\nimport { applyColorButtons } from './colorMap';\nimport { bestColorScheme } from './colorScheme';\nimport { colorMapping, ensureColumnsExist, ensureColumnsPopulated, getBackgroundImageColumnBounds, getTreemapColumn } from './columns';\nimport { ColumnMapBaseProps } from './controls/columnMap';\nimport { DataScopeId, resetSelectedItemIndex, SelectedItemIndex } from './controls/dataScope';\nimport { Dialog } from './controls/dialog';\nimport { IconButton } from './controls/iconButton';\nimport { AutoCompleteDistinctValues } from './controls/searchTerm';\nimport { Sidebar } from './controls/sidebar';\nimport { Topbar } from './controls/topbar';\nimport { loadDataArray, loadDataFile } from './dataLoader';\nimport { defaultViewerOptions, initialExplorerState, snapshotThumbWidth } from './defaults';\nimport { Chart, chartLabel } from './dialogs/chart';\nimport { Color } from './dialogs/color';\nimport { DataBrowser, dataBrowserNullMessages, dataBrowserZeroMessages } from './dialogs/dataBrowser';\nimport { getPureInsight, HistoricInsight, History, HistoryAction, HistoryItem, replay } from './dialogs/history';\nimport { InputSearchExpressionGroup, Search } from './dialogs/search';\nimport { Settings } from './dialogs/settings';\nimport { SnapshotEditor, SnapshotEditor_Class } from './dialogs/snapshotEditor';\nimport { Snapshots } from './dialogs/snapshots';\nimport { getTransition, TransitionEdits, TransitionEditor, syncTansitionDurations } from './dialogs/transition';\nimport {\n    ChangeColumnMappingOptions,\n    ColorSettings,\n    DataContent,\n    DataExportHandler,\n    DataFile,\n    ImageHolder,\n    SettingsGroup,\n    SideTabId,\n    SnapshotProps,\n} from './interfaces';\nimport { strings } from './language';\nimport { getPosition } from './mouseEvent';\nimport {\n    copyPrefToNewState,\n    initPrefs,\n    Prefs,\n    savePref,\n    saveSignalValuePref,\n} from './partialInsight';\nimport { themePalettes } from './themes';\nimport { compareGroups, createInputSearch } from './searchGroups';\nimport { RecommenderSummary } from '@msrvida/chart-recommender';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { SandDance, Viewer, util } from '@msrvida/sanddance-react';\nimport { Renderer } from './controls/renderer';\n\nimport Snapshot = SandDance.types.Snapshot;\nimport { setInsightBackgroundImage } from './dialogs/backgroundImageEditor';\n\nexport interface Options {\n    chartPrefs?: Prefs;\n    tooltipExclusions?: string[];\n    setup?: SandDance.types.Setup;\n    columnTypes?: SandDance.types.ColumnTypeMap;\n}\n\nexport interface Props {\n    compactUI?: boolean;\n    hideSidebarControls?: boolean;\n    logoClickUrl?: string;\n    logoClickTarget?: string;\n    bingSearchDisabled?: boolean;\n    searchORDisabled?: boolean;\n    theme?: string;\n    viewerOptions?: Partial<SandDance.types.ViewerOptions>;\n    initialView?: SandDance.types.View;\n    mounted?: (explorer: Explorer_Class) => any;\n    datasetElement?: JSX.Element;\n    dataExportHandler?: DataExportHandler;\n    topBarButtonProps?: FluentUITypes.ICommandBarItemProps[];\n    topBarIconButtonProps?: FluentUITypes.ICommandBarItemProps[];\n    snapshotProps?: SnapshotProps;\n    onSnapshotClick?: (snapshot: Snapshot, selectedSnaphotIndex: number) => void | boolean;\n    onSnapshotsChanged?: (snapshots: Snapshot[]) => void;\n    onView?: () => void;\n    onError?: (e: any) => void;\n    onSignalChanged?: (signalName: string, signalValue: any) => void;\n    onTooltipExclusionsChanged?: (tooltipExclusions: string[]) => void;\n    onSetupOptionsChanged?: (setup: SandDance.types.Setup) => void;\n    additionalSettings?: SettingsGroup[];\n    systemInfoChildren?: React.ReactNode;\n    initialRenderer?: Partial<SandDance.VegaMorphCharts.types.MorphChartsRendererOptions>;\n    initialSidebarClosed?: boolean;\n    initialSidebarPinned?: boolean;\n    renderOptions?: SandDance.types.RenderOptions;\n}\n\nexport interface UIState {\n    calculating: () => void;\n    errors: string[];\n    autoCompleteDistinctValues: AutoCompleteDistinctValues;\n    search: InputSearchExpressionGroup[];\n    filteredData: object[];\n    sidebarClosed: boolean;\n    sidebarPinned: boolean;\n    dataFile: DataFile;\n    dataContent: DataContent;\n    specCapabilities: SandDance.specs.SpecCapabilities;\n    sideTabId: SideTabId;\n    dataScopeId: DataScopeId;\n    selectedItemIndex: SelectedItemIndex;\n    snapshots: Snapshot[];\n    selectedSnapshotIndex: number;\n    tooltipExclusions: string[];\n    positionedColumnMapProps: PositionedColumnMapProps;\n    note: string;\n    historyIndex: number;\n    historyItems: HistoryItem[];\n    camera?: SandDance.types.Camera;\n    holdCamera?: boolean;\n    renderer: SandDance.VegaMorphCharts.types.MorphChartsRendererOptions;\n}\n\nexport interface State extends HistoricInsight, UIState, TransitionEdits {\n}\n\nfunction _Explorer(_props: Props) {\n    class __Explorer extends base.react.Component<Props, State> {\n        private layoutDivUnpinned: HTMLElement;\n        private layoutDivPinned: HTMLElement;\n        private getColorContext: (oldInsight: SandDance.specs.Insight, newInsight: SandDance.specs.Insight) => SandDance.types.ColorContext;\n        private historicFilterChange: string;\n        private rebaseFilter: boolean;\n        private ignoreSelectionChange: boolean;\n        private snapshotEditor: SnapshotEditor_Class;\n        private scrollSnapshotTimer: number;\n        private newViewStateTarget: boolean;\n\n        public dialogFocusHandler: { focus?: () => void; };\n        public imageHolder: ImageHolder;\n        public viewer: SandDance.Viewer;\n        public viewerOptions: Partial<SandDance.types.ViewerOptions>;\n        public discardColorContextUpdates: boolean;\n        public prefs: Prefs;\n        public div: HTMLElement;\n        public snapshotThumbWidth: number;\n\n        constructor(props: Props) {\n            super(props);\n            this.dialogFocusHandler = {};\n            this.state = initialExplorerState(props);\n            this.imageHolder = { img: null, backgroundImageColumnBounds: [], showBackgroundImage: false };\n            this.snapshotThumbWidth = snapshotThumbWidth;\n            this.discardColorContextUpdates = true;\n            this.updateViewerOptions({ ...SandDance.VegaMorphCharts.util.clone(SandDance.Viewer.defaultViewerOptions), ...props.viewerOptions });\n        }\n\n        public finalize() {\n            if (this.viewer) this.viewer.finalize();\n        }\n\n        public updateViewerOptions(viewerOptions: Partial<SandDance.types.ViewerOptions>) {\n            this.viewerOptions = {\n                ...SandDance.VegaMorphCharts.util.deepMerge(\n                    defaultViewerOptions,\n                    {\n                        tooltipOptions: {\n                            prepareDataItem: (item => {\n                                const ret: object = {};\n                                for (const columnName in item) {\n                                    if (this.state.tooltipExclusions.indexOf(columnName) < 0) {\n                                        ret[columnName] = item[columnName];\n                                    }\n                                }\n                                return ret;\n                            }),\n                        },\n                    },\n                    this.viewerOptions,\n                    viewerOptions,\n                ),\n                onColorContextChange: () => this.manageColorToolbar(),\n                onDataFilter: (filter, filteredData) => {\n                    const selectedItemIndex = { ...this.state.selectedItemIndex };\n                    selectedItemIndex[DataScopeId.FilteredData] = 0;\n                    this.changeInsight(\n                        { filter },\n                        { label: this.historicFilterChange, omit: !this.historicFilterChange },\n                    );\n                    this.historicFilterChange = null;\n                    this.setState({ filteredData, selectedItemIndex });\n                    if (this.state.sideTabId === SideTabId.Data && this.state.dataScopeId === DataScopeId.FilteredData) {\n                        //make sure item is active\n                        requestAnimationFrame(() => filteredData && this.silentActivation(filteredData[0]));\n                    }\n                    viewerOptions && viewerOptions.onDataFilter && viewerOptions.onDataFilter(filter, filteredData);\n                },\n                onSelectionChanged: (newSearch, index, selectedData) => {\n                    if (this.ignoreSelectionChange) return;\n                    const selectedItemIndex = { ...this.state.selectedItemIndex };\n                    selectedItemIndex[DataScopeId.SelectedData] = index || 0;\n                    let { search } = this.state;\n                    const { sideTabId } = this.state;\n                    if (newSearch) {\n                        search = createInputSearch(newSearch);\n                        //} else {\n                        //sideTabId = SideTabId.ChartType;\n                    }\n                    this.setState({ search, selectedItemIndex, sideTabId });\n                    viewerOptions && viewerOptions.onSelectionChanged && viewerOptions.onSelectionChanged(newSearch, index, selectedData);\n                },\n                onAxisClick: (e, search) => {\n                    this.toggleableSearch(e, search);\n                    viewerOptions && viewerOptions.onAxisClick && viewerOptions.onAxisClick(e, search);\n                },\n                onLegendHeaderClick: e => {\n                    const pos = getPosition(e);\n                    const specRole = this.state.specCapabilities && this.state.specCapabilities.roles.filter(r => r.role === 'color')[0];\n                    const positionedColumnMapProps: PositionedColumnMapProps = {\n                        ...this.getColumnMapBaseProps(),\n                        collapseLabel: true,\n                        container: this.div,\n                        selectedColumnName: this.state.columns['color'],\n                        onDismiss: () => { this.setState({ positionedColumnMapProps: null }); },\n                        specRole,\n                        left: pos.left - this.div.clientLeft,\n                        top: pos.top - this.div.clientTop,\n                    };\n                    this.setState({ positionedColumnMapProps });\n                },\n                onLegendRowClick: (e, legendRow) => {\n                    this.toggleableSearch(e, legendRow.search);\n                    viewerOptions && viewerOptions.onLegendRowClick && viewerOptions.onLegendRowClick(e, legendRow);\n                },\n                onError: (errors) => {\n                    this.setState({ errors });\n                    viewerOptions && viewerOptions.onError && viewerOptions.onError(errors);\n                },\n                onBeforeCreateLayers: (stage, specCapabilities) => {\n                    attachSpecRoleToAxisTitle(stage, specCapabilities);\n                },\n                getTextColor: o => {\n                    if ((o as TextWithSpecRole).specRole) {\n                        return SandDance.VegaMorphCharts.util.colorFromString((this.viewerOptions.colors as ColorSettings).clickableText);\n                    } else if (o.metaData && o.metaData.search) {\n                        return SandDance.VegaMorphCharts.util.colorFromString((this.viewerOptions.colors as ColorSettings).searchText);\n                    } else {\n                        return o.color;\n                    }\n                },\n                getTextHighlightColor: o => {\n                    if ((o as TextWithSpecRole).specRole) {\n                        return SandDance.VegaMorphCharts.util.colorFromString((this.viewerOptions.colors as ColorSettings).clickableTextHighlight);\n                    } else if (o.metaData && o.metaData.search) {\n                        return SandDance.VegaMorphCharts.util.colorFromString((this.viewerOptions.colors as ColorSettings).searchTextHighlight);\n                    } else {\n                        return [0, 0, 0, 0];\n                    }\n                },\n                onTextClick: (e, text) => {\n                    if (e && text) {\n                        const pos = getPosition(e);\n                        const rect = this.viewer.element.getBoundingClientRect();\n                        pos.left += rect.left;\n                        pos.top += rect.top;\n                        const { specRole } = text as TextWithSpecRole;\n                        if (pos && specRole) {\n                            const positionedColumnMapProps: PositionedColumnMapProps = {\n                                ...this.getColumnMapBaseProps(),\n                                collapseLabel: true,\n                                container: this.div,\n                                selectedColumnName: this.state.columns[specRole.role],\n                                onDismiss: () => { this.setState({ positionedColumnMapProps: null }); },\n                                specRole,\n                                left: pos.left,\n                                top: pos.top,\n                            };\n                            this.setState({ positionedColumnMapProps });\n                        } else {\n                            this.setState({ positionedColumnMapProps: null });\n                        }\n                    }\n                },\n                onNewViewStateTarget: () => this.newViewStateTarget,\n            };\n            if (this.viewer && this.viewer.presenter) {\n                const newPresenterStyle = SandDance.util.getPresenterStyle(this.viewerOptions as SandDance.types.ViewerOptions);\n                const mergePrenterStyle = { ...this.viewer.presenter.style, ...newPresenterStyle };\n                this.viewer.presenter.style = mergePrenterStyle;\n                this.viewer.options = SandDance.VegaMorphCharts.util.deepMerge(this.viewer.options, this.props.viewerOptions, this.viewerOptions) as SandDance.types.ViewerOptions;\n            }\n        }\n\n        public signal(signalName: string, signalValue: any, newViewStateTarget?: boolean) {\n            switch (signalName) {\n                case SandDance.constants.SignalNames.ColorBinCount:\n                case SandDance.constants.SignalNames.ColorReverse:\n                case SandDance.constants.SignalNames.MarkOpacity:\n                    this.discardColorContextUpdates = false;\n                    break;\n            }\n            this.newViewStateTarget = newViewStateTarget;\n            this.viewer.vegaViewGl.signal(signalName, signalValue);\n            this.viewer.vegaViewGl.runAsync().then(() => {\n\n                //deeply set the state without a state change. This prevents a redraw if re-rendered\n                if (this.state.signalValues) {\n                    this.state.signalValues[signalName] = signalValue;\n                }\n\n                this.discardColorContextUpdates = true;\n                this.newViewStateTarget = undefined;\n                this.props.onSignalChanged && this.props.onSignalChanged(signalName, signalValue);\n            });\n        }\n\n        private manageColorToolbar() {\n            const canRemap = this.viewer.colorContexts && this.viewer.colorContexts.length > 1;\n            applyColorButtons(this.viewer.presenter, !!this.state.columns.color, {\n                themePalette: themePalettes[this.props.theme || ''],\n                canRemap,\n                isRemap: canRemap && this.viewer.currentColorContext > 0,\n                colorMapHandler: remap => {\n                    this.viewer.currentColorContext = ~~remap;\n                    this.viewer.renderSameLayout();\n                    this.manageColorToolbar();\n                },\n            });\n        }\n\n        public getInsight() {\n            return this.viewer.getInsight();\n        }\n\n        public getSetup(): SandDance.types.Setup {\n            return {\n                camera: this.state.holdCamera ? 'hold' : this.state.camera,\n                renderer: this.state.renderer,\n                transition: getTransition(this.state),\n                transitionDurations: this.state.transitionDurations,\n            };\n        }\n\n        private setSetup(setup: SandDance.types.Setup, newState: Partial<State>) {\n            newState.camera = undefined;\n            if (setup) {\n                this.props.onSetupOptionsChanged && this.props.onSetupOptionsChanged(setup);\n                const { camera, renderer, transition, transitionDurations } = setup;\n                newState.renderer = renderer;\n                newState.transitionType = transition.type;\n                if (camera === 'hold') {\n                    newState.holdCamera = true;\n                } else {\n                    newState.holdCamera = false;\n                    newState.camera = camera;\n                }\n                if (transition.type === 'column') {\n                    newState.transitionColumn = transition.column;\n                } else if (transition.type === 'position') {\n                    newState.transitionDimension = transition.dimension;\n                }\n                if (transitionDurations) {\n                    newState.transitionDurations = transitionDurations;\n                    syncTansitionDurations(this.viewer, transitionDurations);\n                }\n            }\n        }\n\n        public setInsight(historyAction: HistoryAction, newState: Partial<UIState> = {}, partialInsight: Partial<SandDance.specs.Insight> = this.viewer.getInsight(), rebaseFilter: boolean, setup?: SandDance.types.Setup) {\n            const selectedItemIndex = { ...this.state.selectedItemIndex };\n            resetSelectedItemIndex(selectedItemIndex);\n            const historicInsight: Partial<HistoricInsight> = {\n                chart: null,\n                scheme: null,\n                columns: null,\n                filter: null,\n                rebaseFilter,\n                ...partialInsight,\n            };\n            const state: Partial<UIState> = {\n                filteredData: null,\n                selectedItemIndex,\n                search: createInputSearch(historicInsight.filter),\n                ...newState,\n            };\n            const changeInsight = () => {\n                this.getColorContext = null;\n                this.setSetup(setup, historicInsight);\n                this.changeInsight(historicInsight, historyAction, state, setup);\n            };\n            const currentFilter = this.viewer.getInsight().filter;\n            if (rebaseFilter && currentFilter && historicInsight.filter) {\n                if (SandDance.searchExpression.startsWith(historicInsight.filter, currentFilter)) {\n                    changeInsight();\n                } else {\n                    const { transitionDurations } = this.state;\n                    const renderTime = transitionDurations.position + transitionDurations.stagger;\n                    const allowAsyncRenderTime = renderTime + this.viewerOptions.filterRenderingTimerPadding;\n                    this.viewer.reset()\n                        .then(() => new Promise((resolve, reject) => { setTimeout(resolve, allowAsyncRenderTime); }))\n                        .then(changeInsight);\n                }\n            } else {\n                changeInsight();\n            }\n        }\n\n        private handleReviveSnapshot(snapshot: Snapshot, selectedSnapshotIndex: number) {\n            let handled = false;\n            if (this.props.onSnapshotClick) {\n                this.setState({ selectedSnapshotIndex });\n                handled = this.props.onSnapshotClick(snapshot, selectedSnapshotIndex) as boolean;\n            }\n            if (!handled) {\n                this.reviveSnapshot(selectedSnapshotIndex);\n            }\n        }\n\n        public reviveSnapshot(snapshotOrIndex: Snapshot | number) {\n            if (typeof snapshotOrIndex === 'number') {\n                const selectedSnapshotIndex = snapshotOrIndex as number;\n                const snapshot = this.state.snapshots[selectedSnapshotIndex];\n                const newState: Partial<UIState> = { note: snapshot.description, selectedSnapshotIndex };\n                if (!this.state.sidebarClosed) {\n                    newState.sideTabId = SideTabId.Snapshots;\n                    this.scrollSnapshotIntoView(selectedSnapshotIndex);\n                }\n                if (snapshot.insight) {\n                    const { backgroundImage } = snapshot.insight;\n                    this.imageHolder.showBackgroundImage = !!backgroundImage;\n                    if (backgroundImage) {\n                        this.imageHolder.img = {\n                            src: backgroundImage.url,\n                            height: backgroundImage.size.height,\n                            width: backgroundImage.size.width,\n                        };\n                    }\n                }\n                this.setInsight({ label: strings.labelHistoryReviveSnapshot }, newState, snapshot.insight, true, snapshot.setup);\n            } else {\n                const snapshot = snapshotOrIndex as Snapshot;\n                if (snapshot.insight) {\n                    this.setInsight({ label: strings.labelHistoryReviveSnapshot }, { note: snapshot.description, selectedSnapshotIndex: -1 }, snapshot.insight, true, snapshot.setup); //don't navigate to sideTab\n                } else {\n                    this.setState({ note: snapshot.description, selectedSnapshotIndex: -1 });\n                }\n            }\n        }\n\n        public load(\n            data: DataFile | object[],\n            getPartialInsight?: (\n                columns: SandDance.types.Column[]\n            ) => Partial<SandDance.specs.Insight>,\n            optionsOrPrefs?: Prefs | Options,\n        ) {\n            this.setState({ historyIndex: -1, historyItems: [] });\n            this.changeInsight(\n                { columns: null },\n                { label: null, omit: true },\n                { note: null },\n            );\n            return new Promise<void>((resolve, reject) => {\n                const loadFinal = (dataContent: DataContent) => {\n                    let partialInsight: Partial<SandDance.specs.Insight>;\n                    this.prefs = (optionsOrPrefs && (optionsOrPrefs as Options).chartPrefs || (optionsOrPrefs as Prefs)) || {};\n                    this.imageHolder.backgroundImageColumnBounds = getBackgroundImageColumnBounds(dataContent.columns);\n                    if (getPartialInsight) {\n                        partialInsight = getPartialInsight(dataContent.columns);\n                        initPrefs(this.prefs, partialInsight);\n                    }\n                    if (!partialInsight) {\n                        //load recommendation\n                        const r = new RecommenderSummary(dataContent.columns, dataContent.data);\n                        partialInsight = r.recommend();\n                    }\n                    partialInsight = {\n                        facetStyle: 'wrap',\n                        filter: null,\n                        totalStyle: null,\n                        transform: null,\n                        ...partialInsight,\n                    };\n                    if (partialInsight.chart === 'barchart') {\n                        partialInsight.chart = 'barchartV';\n                    }\n                    const selectedItemIndex = { ...this.state.selectedItemIndex };\n                    const sideTabId = SideTabId.ChartType;\n                    resetSelectedItemIndex(selectedItemIndex);\n                    const newState: Partial<State> = {\n                        camera: undefined,\n                        columns: {},\n                        dataFile,\n                        dataContent,\n                        snapshots: dataContent.snapshots || this.state.snapshots,\n                        autoCompleteDistinctValues: {},\n                        filteredData: null,\n                        tooltipExclusions: (optionsOrPrefs && (optionsOrPrefs as Options).tooltipExclusions) || [],\n                        selectedItemIndex,\n                        sideTabId,\n                        ...partialInsight,\n                    };\n                    this.getColorContext = null;\n                    ensureColumnsExist(newState.columns, dataContent.columns, newState.transform);\n                    const errors = ensureColumnsPopulated(partialInsight?.chart, partialInsight?.totalStyle, newState.columns, dataContent.columns);\n                    newState.errors = errors;\n                    newState.transitionColumn = dataContent.columns[0];\n                    const setup = (optionsOrPrefs && (optionsOrPrefs as Options).setup);\n                    this.setSetup(setup, newState);\n                    //change insight\n                    this.changeInsight(\n                        partialInsight,\n                        { label: strings.labelHistoryInit, insert: true },\n                        newState as State,\n                        (optionsOrPrefs && (optionsOrPrefs as Options).setup),\n                    );\n                    //make sure item is active\n                    this.activateDataBrowserItem(sideTabId, this.state.dataScopeId);\n                    resolve();\n                };\n                let dataFile: DataFile;\n                if (Array.isArray(data)) {\n                    return loadDataArray(data, 'json', (optionsOrPrefs && (optionsOrPrefs as Options).columnTypes))\n                        .then(result => {\n                            dataFile = {\n                                type: 'json',\n                            };\n                            loadFinal(result);\n                        })\n                        .catch(reject);\n                } else {\n                    dataFile = data as DataFile;\n                    return loadDataFile(dataFile, (optionsOrPrefs && (optionsOrPrefs as Options).columnTypes))\n                        .then(loadFinal)\n                        .catch(reject);\n                }\n            });\n        }\n\n        public changeChartType(chart: SandDance.specs.Chart) {\n            const partialInsight = { ...copyPrefToNewState(this.prefs, chart, '*', '*') };\n            const insight: Partial<HistoricInsight> = { chart, ...partialInsight };\n            const columns = SandDance.VegaMorphCharts.util.deepMerge({}, partialInsight.columns, this.state.columns);\n            const { signalValues } = this.viewer.getInsight();\n            insight.signalValues = { ...this.state.signalValues, ...signalValues };\n            insight.columns = { ...columns };\n            insight.totalStyle = this.state.totalStyle;\n            let errors: string[];\n\n            //special case mappings when switching chart type\n            if (this.state.chart === 'scatterplot' && (chart === 'barchart' || chart === 'barchartV')) {\n                insight.columns = { ...columns, sort: columns.y };\n            } else if (this.state.chart === 'scatterplot' && chart === 'barchartH') {\n                insight.columns = { ...columns, sort: columns.x };\n            } else if (chart === 'treemap') {\n                insight.view = '2d';\n                if (!columns.size) {\n                    //make sure size exists and is numeric\n                    let sizeColumn: SandDance.types.Column;\n                    //first check prefs\n                    if (partialInsight && partialInsight.columns && partialInsight.columns.size) {\n                        const prefSizeColumn = this.state.dataContent.columns.filter(c => c.name === partialInsight.columns.size)[0];\n                        if (prefSizeColumn && prefSizeColumn.quantitative) {\n                            sizeColumn = prefSizeColumn;\n                        }\n                    }\n                    if (!sizeColumn) {\n                        sizeColumn = getTreemapColumn(this.state.dataContent.columns);\n                    }\n                    if (!sizeColumn) {\n                        //error - no numeric columns\n                        errors = [strings.errorColumnMustBeNumeric];\n                    } else {\n                        insight.columns = { ...columns, size: sizeColumn.name };\n                    }\n                }\n            } else if (chart === 'stacks') {\n                insight.view = '3d';\n            }\n\n            ensureColumnsExist(insight.columns, this.state.dataContent.columns, this.state.transform);\n            errors = ensureColumnsPopulated(chart, insight.totalStyle, insight.columns, this.state.dataContent.columns);\n\n            this.calculate(() => {\n                this.changeInsight(\n                    insight,\n                    { label: strings.labelHistoryChangeChartType(chartLabel(chart)) },\n                    errors ? { errors, camera: undefined } : { camera: undefined },\n                );\n            });\n\n            return insight.columns;\n        }\n\n        public calculate(calculating: () => any) {\n            this.setState({ calculating });\n        }\n\n        public changeView(view: SandDance.types.View) {\n            this.changeInsight(\n                { view },\n                { label: view === '2d' ? strings.labelViewType2d : strings.labelViewType3d },\n            );\n        }\n\n        //state members which change the insight\n        private changeInsight(partialInsight: Partial<SandDance.specs.Insight>, historyAction: HistoryAction, additionalUIState?: Partial<UIState>, historicSetup?: SandDance.types.Setup) {\n            if (!partialInsight.signalValues) {\n                partialInsight.signalValues = null;\n            }\n            if (partialInsight.chart === 'barchart') {\n                partialInsight.chart = 'barchartV';\n            }\n            this.addHistory({ ...partialInsight, historicSetup }, historyAction, additionalUIState);\n        }\n\n        public addHistory(historicInsight: Partial<HistoricInsight>, historyAction: HistoryAction, additionalUIState?: Partial<UIState>) {\n\n            const setCleanState = (newState: State) => {\n                const cleanState = { ...newState, ...additionalUIState };\n                if (!cleanState.note) {\n                    cleanState.note = null;\n                }\n                delete cleanState.rebaseFilter;\n\n                if (this.viewer) {\n                    const { signalValues } = this.viewer.getInsight();\n                    cleanState.signalValues = { ...this.state.signalValues, ...signalValues, ...cleanState.signalValues };\n                }\n\n                this.setState(cleanState);\n            };\n\n            if (historyAction.omit) {\n                setCleanState(historicInsight as State);\n                return;\n            }\n            const historyItems = this.state.historyItems.slice(0, this.state.historyIndex + 1);\n            const historyIndex = historyItems.length;\n            historyItems.push({ label: historyAction.label, historicInsight });\n            if (historyAction.insert) {\n                setCleanState({ historyIndex, historyItems } as State);\n            } else {\n                setCleanState({ ...historicInsight, historyIndex, historyItems } as State);\n            }\n        }\n\n        private replay(index: number): Partial<HistoricInsight> {\n            return replay(this.state.historyItems, index);\n        }\n\n        public undo() {\n            const historyIndex = this.state.historyIndex - 1;\n            if (historyIndex < 0) return;\n            this.doReplay(historyIndex);\n        }\n\n        public redo(historyIndex = this.state.historyIndex + 1) {\n            if (historyIndex >= this.state.historyItems.length) return;\n            this.doReplay(historyIndex);\n        }\n\n        private doReplay(historyIndex: number) {\n            const newState = this.replay(historyIndex);\n            this.rebaseFilter = true;\n            this.setSetup(newState.historicSetup, newState);\n            this.setState({ ...newState as State, historyIndex });\n        }\n\n        public changespecCapabilities(\n            specCapabilities: SandDance.specs.SpecCapabilities,\n        ) {\n            this.setState({ specCapabilities });\n        }\n\n        public changeColumnMapping(role: SandDance.specs.InsightColumnRoles, column: SandDance.types.Column, options?: ChangeColumnMappingOptions) {\n            const columns = { ...this.state.columns };\n            const label = column ? strings.labelHistoryMapColumn(role) : strings.labelHistoryUnMapColumn(role);\n            const final = () => {\n                const partialInsight: Partial<SandDance.specs.Insight> = { columns, totalStyle: options ? options.totalStyle : this.state.totalStyle };\n                const errors = ensureColumnsPopulated(this.state.chart, partialInsight.totalStyle, partialInsight.columns, this.state.dataContent.columns);\n\n                columns[role] = column && column.name;\n                this.changeInsight(\n                    partialInsight,\n                    { label },\n                    errors ? { errors, camera: this.viewer.getCamera() } : { camera: this.viewer.getCamera() },\n                );\n            };\n            const _changeInsight = (newInsight: Partial<HistoricInsight>, columnUpdate: SandDance.specs.InsightColumns, historyAction: HistoryAction) => {\n                newInsight.columns = SandDance.VegaMorphCharts.util.deepMerge(\n                    {},\n                    columns,\n                    columnUpdate,\n                );\n                savePref(this.prefs, this.state.chart, '*', '*', { columns: columnUpdate });\n                this.changeInsight(newInsight, historyAction, { camera: this.viewer.getCamera() });\n            };\n            if (column) {\n                let columnUpdate: SandDance.specs.InsightColumns;\n                switch (role) {\n                    case 'facet': {\n                        copyPrefToNewState(this.prefs, this.state.chart, 'facet', column.name);\n                        const historicInsight: Partial<HistoricInsight> = { columns, facetStyle: options ? options.facetStyle : this.state.facetStyle };\n                        columnUpdate = { facet: column.name };\n                        _changeInsight(historicInsight, columnUpdate, { label });\n                        break;\n                    }\n                    case 'color': {\n                        let calculating: () => void = null;\n                        const historicInsight: Partial<HistoricInsight> = { scheme: options && options.scheme, columns, colorBin: this.state.colorBin };\n                        if (!historicInsight.scheme) {\n                            copyPrefToNewState(this.prefs, this.state.chart, 'color', column.name);\n                        }\n                        if (!historicInsight.scheme) {\n                            historicInsight.scheme = bestColorScheme(column, null, this.state.scheme);\n                        }\n                        if (!column.stats.hasColorData) {\n                            historicInsight.directColor = false;\n                            if (this.state.directColor !== historicInsight.directColor) {\n                                calculating = () => this._resize();\n                            }\n                        }\n                        if (this.state.columns && this.state.columns.color && this.state.columns.color !== column.name) {\n                            const currColorColumn = this.state.dataContent.columns.filter(c => c.name === this.state.columns.color)[0];\n                            if (column.isColorData != currColorColumn.isColorData) {\n                                calculating = () => this._resize();\n                            }\n                        }\n                        this.ignoreSelectionChange = true;\n                        this.viewer.deselect().then(() => {\n                            this.ignoreSelectionChange = false;\n                            //allow deselection to render\n                            requestAnimationFrame(() => {\n                                columnUpdate = { color: column.name };\n                                this.getColorContext = null;\n                                this.setState({ calculating });\n                                _changeInsight(historicInsight, columnUpdate, { label });\n                            });\n                        });\n                        break;\n                    }\n                    case 'x': {\n                        copyPrefToNewState(this.prefs, this.state.chart, 'x', column.name);\n                        const historicInsight: Partial<HistoricInsight> = { columns };\n                        columnUpdate = { x: column.name };\n                        _changeInsight(historicInsight, columnUpdate, { label });\n                        break;\n                    }\n                    case 'size': {\n                        copyPrefToNewState(this.prefs, this.state.chart, 'size', column.name);\n                        const historicInsight: Partial<HistoricInsight> = { totalStyle: options ? options.totalStyle : this.state.totalStyle };\n                        columnUpdate = { size: column.name };\n                        _changeInsight(historicInsight, columnUpdate, { label });\n                        break;\n                    }\n                    default: {\n                        final();\n                        break;\n                    }\n                }\n            } else {\n                switch (role) {\n                    case 'facet': {\n                        columns.facet = null;\n                        columns.facetV = null;\n                        this.changeInsight(\n                            { columns, facetStyle: 'wrap' },\n                            { label },\n                        );\n                        break;\n                    }\n                    default: {\n                        final();\n                        break;\n                    }\n                }\n            }\n        }\n\n        private setSideTabId(sideTabId: SideTabId, dataScopeId?: DataScopeId) {\n            if (sideTabId === SideTabId.Data && dataScopeId == null) {\n                //choose most relevant DataScopeId\n                dataScopeId = this.getBestDataScopeId();\n            }\n            if (dataScopeId == null) {\n                dataScopeId = this.state.dataScopeId;\n            }\n            const calculating = () => {\n                this.dialogFocusHandler.focus && this.dialogFocusHandler.focus();\n            };\n            this.setState({ sideTabId, dataScopeId, sidebarClosed: false, calculating });\n            this.activateDataBrowserItem(sideTabId, dataScopeId);\n        }\n\n        private getBestDataScopeId() {\n            let dataScopeId: DataScopeId;\n            const selectionState: SandDance.types.SelectionState = this.viewer && this.viewer.getSelection();\n            if (selectionState && selectionState.selectedData && selectionState.selectedData.length) {\n                dataScopeId = DataScopeId.SelectedData;\n            }\n            else if (this.state.filteredData) {\n                dataScopeId = DataScopeId.FilteredData;\n            }\n            else {\n                dataScopeId = DataScopeId.AllData;\n            }\n            return dataScopeId;\n        }\n\n        private activateDataBrowserItem(sideTabId: SideTabId, dataScopeId: DataScopeId) {\n            if (!this.viewer) return;\n            let itemToActivate: object;\n            if (sideTabId === SideTabId.Data) {\n                switch (dataScopeId) {\n                    case DataScopeId.AllData: {\n                        itemToActivate = this.state.dataContent && this.state.dataContent.data[this.state.selectedItemIndex[DataScopeId.AllData]];\n                        break;\n                    }\n                    case DataScopeId.FilteredData: {\n                        itemToActivate = this.state.filteredData && this.state.filteredData[this.state.selectedItemIndex[DataScopeId.FilteredData]];\n                        break;\n                    }\n                    case DataScopeId.SelectedData: {\n                        const selection = this.viewer.getSelection() || {};\n                        itemToActivate = selection.selectedData && selection.selectedData[this.state.selectedItemIndex[DataScopeId.SelectedData]];\n                        break;\n                    }\n                }\n            }\n            this.silentActivation(itemToActivate);\n        }\n\n        private silentActivation(itemToActivate: object) {\n            this.ignoreSelectionChange = true;\n            const done = () => {\n                this.ignoreSelectionChange = false;\n            };\n            if (itemToActivate) {\n                return this.viewer.activate(itemToActivate).then(done);\n            } else {\n                return this.viewer.deActivate().then(done);\n            }\n        }\n\n        public sidebar(sidebarClosed: boolean, sidebarPinned: boolean) {\n            this.setState({ sidebarClosed, sidebarPinned });\n        }\n\n        public resize() {\n            this.setState({ calculating: () => this._resize() });\n        }\n\n        private _resize() {\n            this.changeInsight(\n                { size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed) },\n                { label: 'resize', omit: true },\n            );\n        }\n\n        private viewerMounted(glDiv: HTMLElement) {\n            this.setState({\n                size: this.getLayoutDivSize(this.state.sidebarPinned, this.state.sidebarClosed),\n                signalValues: this.state.signalValues, //keep initialized signalValues\n            });\n        }\n\n        private getLayoutDivSize(pinned: boolean, closed: boolean): SandDance.types.Size {\n            const div = pinned && !closed ? this.layoutDivPinned : this.layoutDivUnpinned;\n            return { height: div.offsetHeight, width: div.offsetWidth };\n        }\n\n        private toggleableSearch(e: TouchEvent | MouseEvent | PointerEvent, search: SandDance.searchExpression.SearchExpressionGroup) {\n            if (e.ctrlKey) {\n                this.setState({ search: createInputSearch(search) });\n                this.setSideTabId(SideTabId.Search);\n            } else {\n                const oldSelection = this.viewer.getSelection();\n                if (oldSelection.search) {\n                    //look for matching groups and toggle them\n                    const result = compareGroups(SandDance.searchExpression.ensureSearchExpressionGroupArray(oldSelection.search), search);\n                    if (result.found) {\n                        //removing a group\n                        if (result.groups.length === 0) {\n                            this.doDeselect();\n                        } else {\n                            //select with new search removed\n                            this.doSelect(result.groups);\n                        }\n                    } else {\n                        //adding a new group\n                        if (e.altKey || e.shiftKey) {\n                            let group = true;\n                            if (e.altKey) {\n                                search.clause = '&&';\n                            } else if (e.shiftKey) {\n                                if (this.props.searchORDisabled) {\n                                    group = false;\n                                } else {\n                                    search.clause = '||';\n                                }\n                            }\n                            if (group) {\n                                result.groups.push(search);\n                                this.doSelect(result.groups);\n                            } else {\n                                this.doSelect(search);\n                            }\n                        } else {\n                            //replace\n                            this.doSelect(search);\n                        }\n                    }\n                } else {\n                    this.doSelect(search);\n                }\n            }\n        }\n\n        private doFilter(search: SandDance.searchExpression.Search, historicFilterChange: string) {\n            this.historicFilterChange = historicFilterChange;\n            this.viewer.filter(search);\n        }\n\n        private doUnfilter(historicFilterChange: string) {\n            this.historicFilterChange = historicFilterChange;\n            this.viewer.reset();\n        }\n\n        private doSelect(search: SandDance.searchExpression.Search) {\n            return this.viewer.select(search);\n        }\n\n        private doDeselect() {\n            return this.viewer.deselect();\n        }\n\n        private writeSnapshot(snapshot: Snapshot, editIndex: number) {\n            let { selectedSnapshotIndex } = this.state;\n            let snapshots: Snapshot[];\n            if (editIndex >= 0) {\n                snapshots = [...this.state.snapshots];\n                snapshots[editIndex] = snapshot;\n                this.setState({ snapshots, selectedSnapshotIndex });\n            } else {\n                const note = snapshot.description;\n                snapshots = this.state.snapshots.concat(snapshot);\n                selectedSnapshotIndex = snapshots.length - 1;\n                this.scrollSnapshotIntoView(selectedSnapshotIndex);\n                this.setState({ sideTabId: SideTabId.Snapshots, snapshots, selectedSnapshotIndex, note });\n            }\n            this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n        }\n\n        public scrollSnapshotIntoView(selectedSnapshotIndex: number) {\n            clearTimeout(this.scrollSnapshotTimer);\n            if (this.state.sidebarClosed) return;\n            this.scrollSnapshotTimer = setTimeout(() => {\n                const selectedSnapshotElement = this.div.querySelector(`.snapshot:nth-child(${selectedSnapshotIndex + 1})`) as HTMLElement;\n                if (selectedSnapshotElement) {\n                    selectedSnapshotElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n                }\n            }, 500) as any as number;\n        }\n\n        componentDidMount() {\n            if (this.props.mounted) {\n                this.props.mounted(this as any as Explorer_Class);\n            }\n        }\n\n        render() {\n            const insight = getPureInsight(this.state);\n\n            const loaded = !!(insight.columns && this.state.dataContent);\n            if (loaded) {\n                setInsightBackgroundImage(insight, this.imageHolder, this.state.columns);\n            }\n\n            const selectionState: SandDance.types.SelectionState = (this.viewer && this.viewer.getSelection()) || {};\n            const selectionSearch = selectionState && selectionState.search;\n\n            const columnMapProps = this.getColumnMapBaseProps();\n\n            const datas: { [key: number]: object[] } = {};\n            datas[DataScopeId.AllData] = this.state.dataContent && this.state.dataContent.data;\n            datas[DataScopeId.FilteredData] = this.state.filteredData;\n            datas[DataScopeId.SelectedData] = selectionState && selectionState.selectedData;\n\n            if (this.state.calculating) {\n                requestAnimationFrame(() => {\n                    //allow render to complete\n                    if (this.state.calculating) {\n                        this.state.calculating();\n                        this.setState({ calculating: null });\n                    }\n                });\n            }\n\n            const theme = this.props.theme || '';\n            const themePalette = themePalettes[theme];\n\n            let renderOptions: SandDance.types.RenderOptions;\n            if (loaded) {\n                renderOptions = {\n                    ...this.props.renderOptions,\n                    rebaseFilter: () => this.rebaseFilter,\n                    initialColorContext: this.getColorContext && this.getColorContext(this.viewer.insight, insight),\n                    discardColorContextUpdates: () => this.discardColorContextUpdates,\n                    columns: this.state.dataContent?.columns,\n                };\n            }\n\n            return (\n                <div\n                    ref={div => { if (div) this.div = div; }}\n                    className={util.classList('sanddance-explorer', this.props.theme)}\n                >\n                    <Topbar\n                        collapseLabels={this.props.compactUI}\n                        historyIndex={this.state.historyIndex}\n                        historyItems={this.state.historyItems}\n                        undo={() => this.undo()}\n                        redo={() => this.redo()}\n                        logoClickUrl={this.props.logoClickUrl}\n                        logoClickTarget={this.props.logoClickTarget}\n                        themePalette={themePalette}\n                        loaded={loaded}\n                        doDeselect={this.doDeselect.bind(this)}\n                        doFilter={this.doFilter.bind(this)}\n                        doUnfilter={this.doUnfilter.bind(this)}\n                        filter={this.state.filter}\n                        selectionSearch={selectionSearch}\n                        selectionState={selectionState}\n                        buttons={this.props.topBarButtonProps}\n                        iconButtons={this.props.topBarIconButtonProps}\n                        view={this.state.view}\n                        snapshotsHidden={this.props.snapshotProps?.hidden}\n                        snapshots={this.state.snapshots}\n                        onSnapshotPreviousClick={() => {\n                            let selectedSnapshotIndex: number;\n                            if (this.state.selectedSnapshotIndex === -1) {\n                                selectedSnapshotIndex = this.state.snapshots.length - 1;\n                            } else {\n                                selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n                                selectedSnapshotIndex--;\n                                if (selectedSnapshotIndex < 0) {\n                                    selectedSnapshotIndex = this.state.snapshots.length - 1;\n                                }\n                            }\n                            this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n                        }}\n                        onSnapshotClick={() => this.snapshotEditor.editSnapshot()}\n                        onSnapshotNextClick={() => {\n                            let selectedSnapshotIndex: number;\n                            if (this.state.selectedSnapshotIndex === -1) {\n                                selectedSnapshotIndex = 0;\n                            } else {\n                                selectedSnapshotIndex = this.state.selectedSnapshotIndex;\n                                selectedSnapshotIndex++;\n                                if (selectedSnapshotIndex > this.state.snapshots.length - 1) {\n                                    selectedSnapshotIndex = 0;\n                                }\n                            }\n                            this.handleReviveSnapshot(this.state.snapshots[selectedSnapshotIndex], selectedSnapshotIndex);\n                        }}\n                        onViewClick={() => {\n                            const view = this.state.view === '2d' ? '3d' : '2d';\n                            this.changeInsight(\n                                { view },\n                                { label: view === '2d' ? strings.labelViewType2d : strings.labelViewType3d },\n                            );\n                        }}\n                    />\n                    <div className={util.classList('sanddance-main', this.state.sidebarPinned && 'pinned', this.state.sidebarClosed && 'closed', (insight.hideLegend || insight.directColor || !colorMapping(insight, this.state.dataContent && this.state.dataContent.columns)) && 'hide-legend')}>\n                        <div ref={div => { if (div && !this.layoutDivUnpinned) this.layoutDivUnpinned = div; }} className=\"sanddance-layout-unpinned\"></div>\n                        <div ref={div => { if (div && !this.layoutDivPinned) this.layoutDivPinned = div; }} className=\"sanddance-layout-pinned\"></div>\n                        {!loaded && (\n                            <div className=\"loading\">\n                                <base.fluentUI.Spinner\n                                    size={base.fluentUI.SpinnerSize.large}\n                                    label={strings.loading}\n                                />\n                            </div>\n                        )}\n                        <Sidebar\n                            themePalette={themePalette}\n                            calculating={!!this.state.calculating}\n                            closed={this.state.sidebarClosed}\n                            hideSidebarControls={this.props.hideSidebarControls}\n                            snapshotsHidden={this.props.snapshotProps?.hidden}\n                            pinned={this.state.sidebarPinned}\n                            disabled={!loaded}\n                            dataScopeProps={{\n                                themePalette,\n                                compact: this.state.sidebarClosed,\n                                onCompactClick: () => {\n                                    this.changeInsight(\n                                        {\n                                            size: this.getLayoutDivSize(this.state.sidebarPinned, false),\n                                        },\n                                        {\n                                            label: null, omit: true,\n                                        },\n                                        {\n                                            sidebarClosed: false,\n                                        },\n                                    );\n                                },\n                                dataSet: this.props.datasetElement,\n                                dataCount: loaded && {\n                                    all: this.state.dataContent && this.state.dataContent.data.length,\n                                    filtered: this.state.filteredData && this.state.filteredData.length,\n                                    selected: selectionState && selectionState.selectedData && selectionState.selectedData.length,\n                                },\n                                active: this.state.sideTabId === SideTabId.Data,\n                                onDataScopeClick: dataScopeId => this.setSideTabId(SideTabId.Data, dataScopeId),\n                                selectedDataScope: this.state.dataScopeId,\n                                disabled: !loaded,\n                            }}\n                            onSideTabClick={sideTabId => {\n                                //collapse or toggle\n                                if (sideTabId === SideTabId.Collapse || this.state.sideTabId === sideTabId) {\n                                    let { dataScopeId, sidebarClosed } = this.state;\n                                    if (sidebarClosed && sideTabId === SideTabId.Data) {\n                                        dataScopeId = this.getBestDataScopeId();\n                                    }\n                                    sidebarClosed = !this.state.sidebarClosed;\n                                    this.changeInsight(\n                                        {\n                                            size: this.getLayoutDivSize(this.state.sidebarPinned, sidebarClosed),\n                                        },\n                                        {\n                                            label: null, omit: true,\n                                        },\n                                        {\n                                            dataScopeId,\n                                            sidebarClosed,\n                                        },\n                                    );\n                                } else if (sideTabId === SideTabId.Pin) {\n                                    this.changeInsight(\n                                        {\n                                            size: this.getLayoutDivSize(!this.state.sidebarPinned, this.state.sidebarClosed),\n                                        },\n                                        {\n                                            label: null, omit: true,\n                                        },\n                                        {\n                                            sidebarPinned: !this.state.sidebarPinned,\n                                        },\n                                    );\n                                } else {\n                                    this.setSideTabId(sideTabId);\n                                }\n                            }}\n                            selectedSideTab={this.state.sideTabId}\n                        >\n                            {loaded && (() => {\n                                switch (this.state.sideTabId) {\n                                    case SideTabId.ChartType: {\n                                        return (\n                                            <Chart\n                                                themePalette={themePalette}\n                                                collapseLabels={this.props.compactUI}\n                                                tooltipExclusions={this.state.tooltipExclusions}\n                                                toggleTooltipExclusion={columnName => {\n                                                    const tooltipExclusions = [...this.state.tooltipExclusions];\n                                                    const i = tooltipExclusions.indexOf(columnName);\n                                                    if (i < 0) {\n                                                        tooltipExclusions.push(columnName);\n                                                    } else {\n                                                        tooltipExclusions.splice(i, 1);\n                                                    }\n                                                    this.setState({ tooltipExclusions });\n                                                    this.props.onTooltipExclusionsChanged && this.props.onTooltipExclusionsChanged(tooltipExclusions);\n                                                }}\n                                                disabled={!loaded || this.state.sidebarClosed}\n                                                {...columnMapProps}\n                                                chart={this.state.chart}\n                                                view={this.state.view}\n                                                insightColumns={this.state.columns}\n                                                onChangeSignal={(role, column, name, value) => saveSignalValuePref(this.prefs, this.state.chart, role, column, name, value)}\n                                            />\n                                        );\n                                    }\n                                    case SideTabId.Color: {\n                                        return (\n                                            <Color\n                                                compactUI={this.props.compactUI}\n                                                specCapabilities={this.state.specCapabilities}\n                                                disabled={!loaded || this.state.sidebarClosed}\n                                                {...columnMapProps}\n                                                dataContent={this.state.dataContent}\n                                                scheme={this.state.scheme}\n                                                colorBin={this.state.colorBin}\n                                                colorBinSignal={this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter(s => s.name === SandDance.constants.SignalNames.ColorBinCount)[0]}\n                                                colorReverseSignal={this.viewer && this.viewer.vegaSpec && this.viewer.vegaSpec.signals.filter(s => s.name === SandDance.constants.SignalNames.ColorReverse)[0]}\n                                                colorColumn={this.state.columns.color}\n                                                onColorBinChange={colorBin => {\n                                                    this.ignoreSelectionChange = true;\n                                                    this.viewer.deselect().then(() => {\n                                                        this.ignoreSelectionChange = false;\n                                                        //allow deselection to render\n                                                        requestAnimationFrame(() => {\n                                                            this.getColorContext = null;\n                                                            this.changeInsight(\n                                                                { colorBin },\n                                                                { label: strings.labelHistoryColorBin },\n                                                            );\n                                                            savePref(this.prefs, this.state.chart, 'color', this.state.columns.color, { colorBin });\n                                                        });\n                                                    });\n                                                }}\n                                                onColorSchemeChange={(scheme) => {\n                                                    this.changeColumnMapping('color', this.state.dataContent.columns.filter(c => c.name === this.state.columns.color)[0], { scheme });\n                                                    savePref(this.prefs, this.state.chart, 'color', this.state.columns.color, { scheme });\n                                                }}\n                                                onColorBinCountChange={value => {\n                                                    const signalValues: SandDance.specs.SignalValues = {};\n                                                    signalValues[SandDance.constants.SignalNames.ColorBinCount] = value;\n                                                    savePref(this.prefs, this.state.chart, 'color', this.state.columns.color, { signalValues });\n                                                }}\n                                                onColorReverseChange={value => {\n                                                    this.getColorContext = null;\n                                                }}\n                                                directColor={this.state.directColor}\n                                                onDirectColorChange={directColor => {\n                                                    this.changeInsight(\n                                                        { directColor },\n                                                        { label: strings.labelHistoryDirectColor },\n                                                        { calculating: () => this._resize() },\n                                                    );\n                                                }}\n                                            />\n                                        );\n                                    }\n                                    case SideTabId.Data: {\n                                        const data = datas[this.state.dataScopeId];\n                                        let itemVisible = true;\n                                        switch (this.state.dataScopeId) {\n                                            case DataScopeId.AllData: {\n                                                const item = this.state.selectedItemIndex[this.state.dataScopeId];\n                                                itemVisible = this.state.dataContent && !this.state.filteredData || this.state.filteredData.indexOf(data[item]) >= 0;\n                                            }\n                                        }\n                                        return (\n                                            <DataBrowser\n                                                explorer={this as any as Explorer_Class}\n                                                theme={this.props.theme}\n                                                themePalette={themePalette}\n                                                disabled={!loaded || this.state.sidebarClosed}\n                                                columns={this.state.dataContent && this.state.dataContent.columns}\n                                                categoricalColumns={columnMapProps.categoricalColumns}\n                                                quantitativeColumns={columnMapProps.quantitativeColumns}\n                                                data={data}\n                                                displayName={(this.state.dataFile && this.state.dataFile.displayName) || strings.defaultFileName}\n                                                nullMessage={dataBrowserNullMessages[this.state.dataScopeId]}\n                                                zeroMessage={dataBrowserZeroMessages[this.state.dataScopeId]}\n                                                index={this.state.selectedItemIndex[this.state.dataScopeId]}\n                                                itemVisible={itemVisible}\n                                                dataExportHandler={this.props.dataExportHandler}\n                                                selectedDataScope={this.state.dataScopeId}\n                                                onDataScopeClick={dataScopeId => this.setSideTabId(SideTabId.Data, dataScopeId)}\n                                                onActivate={(row, index) => {\n                                                    const selectedItemIndex = { ...this.state.selectedItemIndex };\n                                                    selectedItemIndex[this.state.dataScopeId] = index;\n                                                    this.setState({ selectedItemIndex });\n                                                    this.silentActivation(row);\n                                                }}\n                                                onSearch={(e, search) => {\n                                                    if (e.ctrlKey) {\n                                                        this.setState({ sideTabId: SideTabId.Search, search });\n                                                    } else {\n                                                        this.doSelect(search);\n                                                    }\n                                                }}\n                                                bingSearchDisabled={this.props.bingSearchDisabled}\n                                                onUpdateColumnTypes={columnTypes => {\n                                                    this.load(this.state.dataFile, null, { prefs: this.prefs, columnTypes });\n                                                }}\n                                            />\n                                        );\n                                    }\n                                    case SideTabId.Search: {\n                                        return (\n                                            <Search\n                                                explorer={this as any as Explorer_Class}\n                                                collapseLabels={this.props.compactUI}\n                                                themePalette={themePalette}\n                                                disabled={!loaded || this.state.sidebarClosed}\n                                                disableGroupOR={this.props.searchORDisabled}\n                                                disableExpressionOR={this.props.searchORDisabled}\n                                                initializer={{\n                                                    columns: columnMapProps.allColumns,\n                                                    search: this.state.search,\n                                                }}\n                                                autoCompleteDistinctValues={this.state.autoCompleteDistinctValues}\n                                                onSelect={expr => this.doSelect(expr)}\n                                                data={this.state.dataContent.data}\n                                            />\n                                        );\n                                    }\n                                    case SideTabId.Snapshots: {\n                                        return (\n                                            <Snapshots\n                                                {...this.props.snapshotProps}\n                                                editor={this.snapshotEditor}\n                                                themePalette={themePalette}\n                                                explorer={this as any as Explorer_Class}\n                                                snapshots={this.state.snapshots}\n                                                selectedSnapshotIndex={this.state.selectedSnapshotIndex}\n                                                onClearSnapshots={() => {\n                                                    const snapshots = [];\n                                                    this.setState({ snapshots, selectedSnapshotIndex: -1 });\n                                                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                                }}\n                                                onWriteSnapshot={(s, i) => this.writeSnapshot(s, i)}\n                                                onRemoveSnapshot={i => {\n                                                    const snapshots = [...this.state.snapshots];\n                                                    snapshots.splice(i, 1);\n                                                    let { selectedSnapshotIndex } = this.state;\n                                                    if (i === selectedSnapshotIndex) {\n                                                        selectedSnapshotIndex = -1;\n                                                    } else if (selectedSnapshotIndex > i) {\n                                                        selectedSnapshotIndex--;\n                                                    }\n                                                    this.setState({ snapshots, selectedSnapshotIndex });\n                                                    this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                                }}\n                                                onSnapshotClick={(snapshot, selectedSnapshotIndex) => {\n                                                    this.setState({ selectedSnapshotIndex });\n                                                    this.calculate(() => {\n                                                        this.handleReviveSnapshot(snapshot, selectedSnapshotIndex);\n                                                    });\n                                                }}\n                                                onMoveUp={i => {\n                                                    if (i > 0) {\n                                                        const snapshots = [...this.state.snapshots];\n                                                        const temp = snapshots[i - 1];\n                                                        snapshots[i - 1] = snapshots[i];\n                                                        snapshots[i] = temp;\n                                                        let { selectedSnapshotIndex } = this.state;\n                                                        if (i === selectedSnapshotIndex) {\n                                                            selectedSnapshotIndex = i - 1;\n                                                        } else if (i - 1 === selectedSnapshotIndex) {\n                                                            selectedSnapshotIndex = i;\n                                                        }\n                                                        this.setState({ snapshots, selectedSnapshotIndex });\n                                                        this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                                    }\n                                                }}\n                                                onMoveDown={i => {\n                                                    if (i < this.state.snapshots.length - 1) {\n                                                        const snapshots = [...this.state.snapshots];\n                                                        const temp = snapshots[i + 1];\n                                                        snapshots[i + 1] = snapshots[i];\n                                                        snapshots[i] = temp;\n                                                        let { selectedSnapshotIndex } = this.state;\n                                                        if (i === selectedSnapshotIndex) {\n                                                            selectedSnapshotIndex = i + 1;\n                                                        } else if (i + 1 === selectedSnapshotIndex) {\n                                                            selectedSnapshotIndex = i;\n                                                        }\n                                                        this.setState({ snapshots, selectedSnapshotIndex });\n                                                        this.props.onSnapshotsChanged && this.props.onSnapshotsChanged(snapshots);\n                                                    }\n                                                }}\n                                            />\n                                        );\n                                    }\n                                    case SideTabId.History: {\n                                        return (\n                                            <History\n                                                explorer={this as any as Explorer_Class}\n                                                themePalette={themePalette}\n                                                historyIndex={this.state.historyIndex}\n                                                historyItems={this.state.historyItems}\n                                                redo={i => this.redo(i)}\n                                            />\n                                        );\n                                    }\n                                    case SideTabId.Transition: {\n                                        return (\n                                            <TransitionEditor\n                                                {...columnMapProps}\n                                                {...this.state}\n                                                compactUI={this.props.compactUI}\n                                                explorer={this as any as Explorer_Class}\n                                                themePalette={themePalette}\n                                                changeSetup={(newState, affectsStagger) => {\n                                                    const calculating = () => {\n                                                        if (affectsStagger) {\n                                                            this.viewer.assignTransitionStagger(getTransition(this.state));\n                                                        }\n                                                        this.props.onSetupOptionsChanged && this.props.onSetupOptionsChanged(this.getSetup());\n                                                    };\n                                                    if (newState) {\n                                                        this.setState({ ...newState as State, calculating });\n                                                    } else {\n                                                        calculating();\n                                                    }\n                                                }}\n                                            />\n                                        );\n                                    }\n                                    case SideTabId.Settings: {\n                                        return (\n                                            <Settings\n                                                explorer={this as any as Explorer_Class}\n                                                dataFile={this.state.dataFile}\n                                                scheme={this.state.scheme}\n                                                hideLegend={this.state.hideLegend}\n                                                onToggleLegend={hideLegend => this.setState({ hideLegend, calculating: () => this._resize() })}\n                                                hideAxes={this.state.hideAxes}\n                                                onToggleAxes={hideAxes => this.setState({ calculating: () => this.setState({ hideAxes }) })}\n                                                additionalSettings={this.props.additionalSettings}\n                                            >\n                                                {this.props.systemInfoChildren}\n                                            </Settings>\n                                        );\n                                    }\n                                }\n                            })()}\n                        </Sidebar>\n                        {loaded && (\n                            <div className=\"sanddance-view\">\n                                <Viewer\n                                    renderOptions={renderOptions}\n                                    viewerOptions={this.viewerOptions}\n                                    ref={reactViewer => {\n                                        if (reactViewer) {\n                                            this.viewer = reactViewer.viewer;\n                                        }\n                                    }}\n                                    onView={renderResult => {\n                                        this.rebaseFilter = false;\n                                        this.changespecCapabilities(renderResult.specResult.errors ? renderResult.specResult.specCapabilities : this.viewer.specCapabilities);\n                                        this.getColorContext = (oldInsight: SandDance.specs.Insight, newInsight: SandDance.specs.Insight) => {\n                                            if (!oldInsight && !newInsight) {\n                                                return null;\n                                            }\n                                            if (!oldInsight || !newInsight) {\n                                                return null;\n                                            }\n                                            if (oldInsight.scheme !== newInsight.scheme) {\n                                                return null;\n                                            }\n                                            if (oldInsight.columns.color !== newInsight.columns.color) {\n                                                return null;\n                                            }\n                                            if (oldInsight.directColor != newInsight.directColor) {\n                                                return null;\n                                            }\n                                            return this.viewer.colorContexts && this.viewer.colorContexts[this.viewer.currentColorContext];\n                                        };\n                                        //don't allow tabbing to the canvas\n                                        removeTabIndex(this.viewer);\n                                        this.props.onView && this.props.onView();\n                                    }}\n                                    onError={e => {\n                                        this.props.onError && this.props.onError(e);\n                                    }}\n                                    data={this.state.dataContent.data}\n                                    insight={insight}\n                                    setup={this.getSetup()}\n                                    onMount={el => this.viewerMounted(el)}\n                                />\n                                {this.state.note && (\n                                    <div className='sanddance-note'>\n                                        <IconButton\n                                            className='cancel'\n                                            themePalette={themePalette}\n                                            title={strings.buttonClose}\n                                            iconName='Cancel'\n                                            onClick={() => this.setState({ note: null })}\n                                        />\n                                        <div>{this.state.note}</div>\n                                    </div>\n                                )}\n                                <Renderer\n                                    explorer={this as any as Explorer_Class}\n                                    advanced={this.state.renderer.advanced}\n                                    advancedOptions={this.state.renderer.advancedOptions}\n                                    basicOptions={this.state.renderer.basicOptions}\n                                    themePalette={themePalette}\n                                    onHomeClick={() => {\n                                        this.setState({ camera: undefined });\n                                        this.viewer.presenter.homeCamera();\n                                    }}\n                                />\n                            </div>\n                        )}\n                        <Dialog\n                            title={strings.labelError}\n                            hidden={!this.state.errors}\n                            onDismiss={() => {\n                                this.setState({ errors: null });\n                            }}\n                        >\n                            {this.state.errors && this.state.errors.map((error, i) => (\n                                <div key={i}>{error}</div>\n                            ))}\n                        </Dialog>\n                        <SnapshotEditor\n                            ref={se => this.snapshotEditor = se}\n                            {...this.props.snapshotProps}\n                            explorer={this as any as Explorer_Class}\n                            onWriteSnapshot={(s, i) => this.writeSnapshot(s, i)}\n                            theme={this.props.theme}\n                            themePalette={themePalette}\n                        />\n                    </div>\n                    {this.state.positionedColumnMapProps && (\n                        <PositionedColumnMap\n                            {...this.state.positionedColumnMapProps}\n                        />\n                    )}\n                </div>\n            );\n        }\n\n        private getColumnMapBaseProps() {\n            const allColumns = this.state.dataContent && this.state.dataContent.columns.filter(c => !SandDance.util.isInternalFieldName(c.name, true));\n            const quantitativeColumns = allColumns && allColumns.filter(c => c.quantitative);\n            const categoricalColumns = allColumns && allColumns.filter(c => !c.quantitative);\n            const props: ColumnMapBaseProps = {\n                changeColumnMapping: (role, columnOrRole, defaultColumn, options) => {\n                    let column: SandDance.types.Column;\n                    if (typeof columnOrRole === 'string') {\n                        //look up current insight\n                        const columnName = this.state.columns[columnOrRole];\n                        column = allColumns.filter(c => c.name === columnName)[0] || defaultColumn;\n                    } else {\n                        column = columnOrRole;\n                    }\n                    this.changeColumnMapping(role, column, options);\n                },\n                facetStyle: this.state.facetStyle,\n                totalStyle: this.state.totalStyle,\n                allColumns,\n                quantitativeColumns,\n                categoricalColumns,\n                specCapabilities: this.state.specCapabilities,\n                explorer: this as any as Explorer_Class,\n            };\n            return props;\n        }\n    }\n    return new __Explorer(_props);\n}\n\nexport const Explorer: typeof Explorer_Class = _Explorer as any;\n\nexport declare class Explorer_Class extends base.react.Component<Props, State> {\n    // private layoutDivUnpinned: HTMLElement;\n    // private layoutDivPinned: HTMLElement;\n    // private getColorContext: (oldInsight: SandDance.specs.Insight, newInsight: SandDance.specs.Insight) => SandDance.types.ColorContext;\n    // private historicFilterChange: string;\n    // private rebaseFilter: boolean;\n    // private ignoreSelectionChange: boolean;\n    // private snapshotEditor: SnapshotEditor_Class;\n    // private scrollSnapshotTimer: number;\n    // private newViewStateTarget: boolean;\n    dialogFocusHandler: { focus?: () => void; };\n    imageHolder: ImageHolder;\n    viewer: SandDance.Viewer;\n    viewerOptions: Partial<SandDance.types.ViewerOptions>;\n    discardColorContextUpdates: boolean;\n    prefs: Prefs;\n    div: HTMLElement;\n    snapshotThumbWidth: number;\n    constructor(props: Props);\n    finalize(): void;\n    updateViewerOptions(viewerOptions: Partial<SandDance.types.ViewerOptions>): void;\n    signal(signalName: string, signalValue: any, newViewStateTarget?: boolean): void;\n    //private manageColorToolbar(): void;\n    getInsight(): SandDance.specs.Insight;\n    getSetup(): SandDance.types.Setup;\n    //private setSetup(setup: SandDance.types.Setup, newState: Partial<State>): void;\n    setInsight(historyAction: HistoryAction, newState: Partial<UIState>, partialInsight: Partial<SandDance.specs.Insight>, rebaseFilter: boolean, setup?: SandDance.types.Setup): void;\n    //private handleReviveSnapshot(snapshot: Snapshot, selectedSnapshotIndex: number): void;\n    reviveSnapshot(snapshotOrIndex: Snapshot | number): void;\n    load(data: DataFile | object[], getPartialInsight?: (columns: SandDance.types.Column[]) => Partial<SandDance.specs.Insight>, optionsOrPrefs?: Prefs | Options): Promise<void>;\n    changeChartType(chart: SandDance.specs.Chart): SandDance.specs.InsightColumns;\n    calculate(calculating: () => any): void;\n    changeView(view: SandDance.types.View): void;\n    //private changeInsight(partialInsight: Partial<SandDance.specs.Insight>, historyAction: HistoryAction, additionalUIState?: Partial<UIState>): void;\n    addHistory(historicInsight: Partial<HistoricInsight>, historyAction: HistoryAction, additionalUIState?: Partial<UIState>): void;\n    //private replay(index: number): void;\n    undo(): void;\n    redo(historyIndex?: number): void;\n    changespecCapabilities(specCapabilities: SandDance.specs.SpecCapabilities): void;\n    changeColumnMapping(role: SandDance.specs.InsightColumnRoles, column: SandDance.types.Column, options?: ChangeColumnMappingOptions): void;\n    // private setSideTabId(sideTabId: SideTabId, dataScopeId?: DataScopeId): void;\n    // private getBestDataScopeId(): void;\n    // private activateDataBrowserItem(sideTabId: SideTabId, dataScopeId: DataScopeId): void;\n    // private silentActivation(itemToActivate: object): Promise<void>;\n    sidebar(sidebarClosed: boolean, sidebarPinned: boolean): void;\n    resize(): void;\n    // private _resize(): void;\n    // private viewerMounted(glDiv: HTMLElement): void;\n    // private getLayoutDivSize(pinned: boolean, closed: boolean): SandDance.types.Size;\n    // private toggleableSearch(e: TouchEvent | MouseEvent | PointerEvent, search: SandDance.searchExpression.SearchExpressionGroup): void;\n    // private doFilter(search: SandDance.searchExpression.Search, historicFilterChange: string): void;\n    // private doUnfilter(historicFilterChange: string): void;\n    // private doSelect(search: SandDance.searchExpression.Search): Promise<void>;\n    // private doDeselect(): Promise<void>;\n    // private writeSnapshot(snapshot: Snapshot, editIndex: number): void;\n    scrollSnapshotIntoView(selectedSnapshotIndex: number): void;\n    componentDidMount(): void;\n    render(): JSX.Element;\n    //private getColumnMapBaseProps(): ColumnMapBaseProps;\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/exportDelimited.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport function convertToDelimited(data: object[], delimiter?: string) {\n    const fields = Object.keys(data[0]);\n    const file = data.map(row => {\n        return fields.map(fieldName => {\n            const value: any = row[fieldName];\n            if (typeof value === 'number') {\n                return value;\n            }\n            if (typeof value === 'string') {\n                if (value.indexOf(delimiter) >= 0) {\n                    return `\"${value.replace(/\"/g, '\"\"')}\"`;\n                } else {\n                    return value;\n                }\n            }\n            return '';\n        }).join(delimiter);\n    });\n    file.unshift(fields.join(delimiter));\n    return (file.join('\\n'));\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as controls from './controls';\n\nexport { controls };\nexport { getEmbedHTML } from './controls/dataExporter';\nexport { ColorSettings, DataContent, DataExportType, DataFile, DataFileType, SettingsGroup, SideTabId, ViewerOptions } from './interfaces';\nexport { use } from './base';\nexport { capabilities } from './canvas';\nexport { Prefs } from './partialInsight';\nexport { getColorSettingsFromThemePalette, themePalettes } from './themes';\nexport * from './explorer';\n\nexport { SandDance, util } from '@msrvida/sanddance-react';\nexport * as SandDanceReact from '@msrvida/sanddance-react';\nexport { version } from './version';\n"
  },
  {
    "path": "packages/sanddance-explorer/src/interfaces.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { IIconButtonProps } from './controls/iconButton';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { SnapshotEditorProps } from './dialogs/snapshotEditor';\nimport { SnapshotListProps } from './dialogs/snapshots';\n\nimport Snapshot = SandDance.types.Snapshot;\n\nexport type DataFileType = 'json' | 'csv' | 'tsv' | 'topojson';\n\nexport interface DataFile {\n  displayName?: string;\n  dataUrl?: string;\n  snapshotsUrl?: string;\n  rawText?: string;\n  snapshots?: Snapshot[];\n  type: DataFileType;\n}\n\nexport interface DataContent {\n  data: object[];\n  columns: SandDance.types.Column[];\n  snapshots?: Snapshot[];\n}\n\nexport type DataExportType = DataFileType | 'html';\n\nexport interface DataExportHandler {\n  (data: any, datatype: DataExportType, displayName: string): void;\n}\n\nexport interface SnapshotAction {\n  element?: JSX.Element;\n  iconButtonProps?: IIconButtonProps;\n}\n\nexport interface SnapshotProps extends SnapshotEditorProps, SnapshotListProps {\n  hidden?: boolean;\n}\n\nexport interface ColorSettings extends SandDance.types.ColorSettings {\n  clickableText?: string;\n  clickableTextHighlight?: string;\n  searchText?: string;\n  searchTextHighlight?: string;\n}\n\nexport interface ViewerOptions extends SandDance.types.ViewerOptions {\n  colors: ColorSettings;\n}\n\nexport interface DateWithSource extends Date {\n  input?: string;\n}\n\nexport interface SettingsGroup {\n  groupLabel: string;\n  children: React.ReactNode;\n}\n\nexport enum SideTabId {\n  ChartType, Data, Search, Color, Snapshots, History, Transition, Settings, Pin, Collapse,\n}\n\nexport interface ChangeColumnMappingOptions {\n  scheme?: string;\n  facetStyle?: SandDance.specs.FacetStyle;\n  totalStyle?: SandDance.specs.TotalStyle;\n}\n\nexport type DataExtent = 'max' | 'min';\n\nexport interface BackgroundImageColumnBound {\n  columnName: string;\n  dimension: SandDance.types.Dimension2D;\n  dataExtent: DataExtent;\n  stringValue: string;\n  numericValue: number;\n  valid: boolean;\n}\n\nexport interface ImageHolder {\n  img: {\n    src: string;\n    height: number;\n    width: number;\n  };\n  backgroundImageColumnBounds: BackgroundImageColumnBound[];\n  showBackgroundImage: boolean;\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/keycodes.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const KeyCodes = {\n    ENTER: 13,\n};\n"
  },
  {
    "path": "packages/sanddance-explorer/src/language.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const strings = {\n    appName: 'SandDance',\n    bingsearch: 'Bing',\n    bingsearchDescription: (term) => `Search Bing for \"${term}\"`,\n    buttonClose: 'Close',\n    buttonSelect: 'Search & Select',\n    buttonColorSchemeMap: 'Map color scheme to filtered data',\n    buttonColorSchemeRemap: 'Remap color to filtered data',\n    buttonColorSchemeKeep: 'Keep same color scheme',\n    buttonCopyToClipboard: 'Copy to clipboard',\n    buttonExclude: 'Exclude',\n    buttonExport: 'Export',\n    buttonExportCount: (total) => total == 1 ? 'Export 1 row...' : `Export ${total} rows...`,\n    buttonIsolate: 'Isolate',\n    buttonReset: 'Stop filtering',\n    buttonDeselect: 'Clear selection',\n    buttonToolbarFloat: 'Float toolbar',\n    buttonToolbarDock: 'Dock toolbar',\n    buttonToolbarHide: 'Hide toolbar',\n    buttonToolbarShow: 'Show toolbar',\n    buttonNextDataItem: 'Next data item',\n    buttonPrevDataItem: 'Previous data item',\n    buttonCreateSnapshot: 'Create snapshot',\n    buttonNextSnapshot: 'Next snapshot',\n    buttonPrevSnapshot: 'Previous snapshot',\n    buttonUpdateSnapshot: 'Update snapshot',\n    buttonAddExpression: 'Add expression',\n    buttonAddExpressionGroup: 'Add group',\n    buttonDeleteExpression: 'Delete',\n    buttonDeleteExpressionGroup: 'Delete group',\n    buttonClearSnapshots: 'Clear snapshots',\n    buttonDeleteSnapshot: 'Delete snapshot',\n    buttonEditSnapshot: 'Edit snapshot',\n    buttonMoveUp: 'Move up',\n    buttonMoveDown: 'Move down',\n    buttonShowVegaSpec: 'Show Vega spec',\n    buttonLaunchVegaEditor: 'Open Vega Editor',\n    buttonCameraHome: 'Center chart in window',\n    buttonTooltipMapping: 'Tooltip columns...',\n    buttonBackgroundImage: 'Background image...',\n    buttonTransitionReverse: 'Play Reverse',\n    buttonTransitionPause: 'Pause',\n    buttonTransitionPlay: 'Play',\n    buttonUndo: 'Undo',\n    buttonRedo: 'Redo',\n    buttonColumnTypes: 'Column types...',\n    buttonApply: 'Apply',\n    buttonRemove: 'Remove',\n    buttonResetToDefault: 'Reset to default',\n    chartTypeBarChartH: 'Bar',\n    chartTypeBarChartV: 'Column',\n    chartTypeDensity: 'Density',\n    chartTypeGrid: 'Grid',\n    chartTypeScatterPlot: 'Scatter',\n    chartTypeStacks: 'Stacks',\n    chartTypeStrips: 'Strips',\n    chartTypeTreeMap: 'Treemap',\n    defaultFileName: 'sanddance-data',\n    errorExportFilenameEmpty: 'Filename cannot be blank',\n    errorExportFilenameCharacters: (characters) => `A filename cannot contain any of the following characters: ${characters}`,\n    errorColumnMustBeNumeric: 'Numeric column required for this chart type.',\n    errorNumericValue: 'Value must be numeric',\n    errorImageFormat: 'File is not an image',\n    labelBackgroundImageDialogTitle: 'Background image',\n    labelBackgroundImageSubtext: 'Background image can only be shown on Scatterplot, Density, and Stacks charts. Columns must be numeric type.',\n    labelBackgroundLeft: 'Left extent',\n    labelBackgroundRight: 'Right extent',\n    labelBackgroundBottom: 'Bottom extent',\n    labelBackgroundTop: 'Top extent',\n    labelBlank: 'blank',\n    labelNull: 'null',\n    labelTrue: 'true',\n    labelFalse: 'false',\n    labelSystemInfo: 'System info',\n    labelChangeColumnType: 'Change column type',\n    labelChartSettings: 'Chart settings',\n    labelEditColumn: 'Edit',\n    labelColumnName: 'Column name',\n    labelColumnType: 'Column type',\n    labelColumnDistinct: 'Distinct values',\n    labelColumnHasColorData: 'Has color data',\n    labelColumnIsColorData: 'Is color data',\n    labelColumnQuantitativeMin: 'Min',\n    labelColumnQuantitativeMax: 'Max',\n    labelColumnQuantitativeMean: 'Mean',\n    labelDataBrowser: 'Data browser',\n    labelDataScope: 'Scope',\n    labelExport: 'Export Data',\n    labelExportFormat: 'File format',\n    labelExportCSV: '.CSV - Comma separated values',\n    labelExportHTML: '.HTML - A SandDance html page embedding this data',\n    labelExportJSON: '.JSON - JavaScript object notation',\n    labelExportTSV: '.TSV - Tab separated values',\n    labelHistory: 'History',\n    labelHistoryWarning: 'This will erase your current history.',\n    labelTools: 'Tools',\n    labelHoldCamera: 'Keep previous camera position',\n    labelVegaSpec: 'Vega specification',\n    labelColor: 'Chart color',\n    labelError: 'Error',\n    labelExportFileName: 'File name',\n    labelSnapshots: 'Snapshots',\n    labelSnapshotSettingThumbnailWidth: 'Thumbnail image width',\n    labelSearch: 'Select by search',\n    labelSearchClause: 'Clause',\n    labelSearchColumn: 'Field',\n    labelSearchOperator: 'Operator',\n    labelSearchValue: 'Value',\n    labelSearchValuePlaceholder: 'Value to search for',\n    labelChart: 'Chart',\n    labelChartCanvas: 'Chart canvas',\n    labelColumnMapping: 'Column Mapping',\n    labelChartTypeOptions: 'Chart options',\n    labelColorBin: 'Color binning',\n    labelColorOptions: 'Color options',\n    labelColorBinExplanation: 'For numeric columns',\n    labelColorFieldInfo: (colorColumnName, colorColumnType, categoricalNumeric, distinctValueCount) =>\n        `Field <span className=\"fieldname\">${colorColumnName}</span> is of type <span className=\"fieldtype\">${colorColumnType}</span>${categoricalNumeric ? ` and has ${distinctValueCount} distinct values` : ''}.`,\n    labelColorFieldIsColorData: (colorColumnName) =>\n        `Field <span className=\"fieldname\">${colorColumnName}</span> contains direct color data.`,\n    labelColorBinNone: 'None (continuous)',\n    labelColorBinQuantize: 'Quantize',\n    labelColorBinQuantile: 'Quantile',\n    labelColorFilter: 'Note: Colors will be re-mapped to the filter when viewing this snapshot.',\n    labelColorScheme: 'Scheme',\n    labelTotal: 'Total by',\n    labelTotalByCountSquare: 'Count (Grid layout)',\n    labelTotalByCountStrip: 'Count (Strip layout)',\n    labelTotalBySumStrip: 'Sum (Strip layout)',\n    labelTotalBySumTreemap: 'Sum (Treemap layout)',\n    labelTotalBySumStripPercent: 'Sum as percentage (Strip layout)',\n    labelColumnColor: 'Color by',\n    labelColumnFacet: 'Facet by',\n    labelFacetLayout: 'Facet layout',\n    labelFacetLayoutWrap: 'Wrap',\n    // labelFacetLayoutHorizontal: 'Horizontal',\n    // labelFacetLayoutVertical: 'Vertical',\n    labelFacetLayoutCross: '⊞',\n    labelColumnFacetV: 'Cross facet by',\n    labelColumnSort: 'Sort by',\n    labelColumnX: 'X Axis',\n    labelColumnY: 'Y Axis',\n    labelColumnZ: 'Z Axis',\n    labelColumnSize: 'Size by',\n    labelColumnGroup: 'Group by',\n    labelAliasColor: 'Color',\n    labelAliasFacet: 'Facet',\n    labelAliasFacetV: 'Vertical facet',\n    labelAliasSort: 'Sort',\n    labelAliasX: 'X Axis',\n    labelAliasY: 'Y Axis',\n    labelAliasZ: 'Z Axis',\n    labelAliasSize: 'Size',\n    labelAliasGroup: 'Group',\n    labelDataItemIsFiltered: 'Item is filtered from view',\n    labelHistoryInit: 'Initial view',\n    labelHistoryFilterClear: 'Clear filter',\n    labelHistoryFilterIExclude: 'Exclude filter',\n    labelHistoryFilterIsolate: 'Isolate filter',\n    labelHistoryChangeChartType: chart => `Change chart type to ${chart}`,\n    labelHistoryMapColumn: column => `Map ${column} role`,\n    labelHistoryUnMapColumn: column => `Unmap ${column} role`,\n    labelHistoryReviveSnapshot: 'Revive snapshot',\n    labelHistoryColorBin: 'Change color binning',\n    labelHistoryDirectColor: 'Change direct color',\n    labelRenderer: 'Renderer quality',\n    labelRendererAdvancedDisabled: 'Renderer quality (Enhanced 3D mode not supported on this device)',\n    labelRendererBasic: 'Standard mode',\n    labelRendererAdvanced: 'Enhanced 3D mode',\n    labelRendererOptions: 'Renderer options ...',\n    labelRendererOptionsDialogTitle: 'Renderer options',\n    labelRendererOptionsAntialias: 'Antialias',\n    labelRendererOptionsBloom: 'Bloom highlighting (for selections)',\n    labelRendererOptionsBloomIntensity: 'Intensity',\n    labelRendererOptionsDof: 'Depth of Field',\n    labelRendererOptionsDofRange: 'Focus Range',\n    labelRendererOptionsFxaa: 'Antialias',\n    labelRendererOptionsShadow: 'Shadows',\n    labelRendererOptionsSsao: 'Screen Space Ambient Occlusion',\n    labelShowLegend: 'Show legend',\n    labelShowAxes: 'Show axes',\n    labelSnapshotTitle: 'Title',\n    labelSnapshotDescription: 'Note (optional)',\n    labelTooltipMapping: 'Tooltip columns',\n    labelTransition: 'Transition',\n    labelTransitionOptions: 'Transition options',\n    labelTransitionScrubber: 'Scrub transition',\n    labelTransitionStaggerBy: 'Stagger by',\n    labelTransitionStaggerByOrdinal: 'Data order',\n    labelTransitionStaggerByColumn: 'Column',\n    labelTransitionStaggerByPosition: 'Axis position',\n    labelTransitionStaggerOptions: 'Stagger options',\n    labelTransitionStaggerReverse: 'Reverse',\n    labelTransitionDurations: 'Transition durations',\n    labelTransitionCamera: '2D / 3D view',\n    labelTransitionDuration: 'Duration',\n    labelTransitionStagger: 'Stagger',\n    labelVegaSpecData: 'Data reference',\n    labelVegaSpecNotes: 'Note: You may need to change the color scheme to make this visible in Vega.',\n    labelYes: 'Yes',\n    labelNo: 'No',\n    labelConfirmation: 'Are you sure?',\n    labelColumnTypes: 'Column types',\n    loading: 'Loading...',\n    schemeCategorical: 'Categorical',\n    schemeCyclical: 'Cyclical',\n    schemeDiverging: 'Diverging',\n    schemeDual: 'Dual',\n    schemeSequentialMultiHue: 'Sequential Multi Hue',\n    schemeSequentialMultiHueDark: 'For dark backgrounds',\n    schemeSequentialMultiHueLight: 'For light backgrounds',\n    schemeSequentialSingleHue: 'Sequential Single Hue',\n    selectDataSpanAll: 'All rows',\n    selectDataSpanFilter: 'Filtered',\n    selectDataSpanSelection: 'Selected',\n    selectVegaSpecDataNone: 'None',\n    selectVegaSpecDataInline: 'Inline - WARNING this may use substantial browser/clipboard memory for large data sets.',\n    selectVegaSpecDataUrl: 'URL',\n    record: (current, total) => `${current} of ${total}`,\n    searchEQ: '=',\n    searchNEQ: '<>',\n    searchGT: '>',\n    searchGTE: '>=',\n    searchLT: '<',\n    searchLTE: '<=',\n    searchNULL: 'is null or empty',\n    searchIN: 'contains',\n    searchSW: 'starts with',\n    searchWHERE: 'Where',\n    searchAND: 'and',\n    searchOR: 'or',\n    selectAny: '-- any --',\n    selectNone: '-- none --',\n    selectNumeric: 'Numeric',\n    selectNonNumeric: 'Categorical',\n    selectDirectColor: 'Direct color',\n    selectReference: 'Column mappings',\n    tooltipSearch: (column, value) => `Click to search in '${column}' for \"${value}\"`,\n    labelRequired: 'required',\n    labelSystem: 'System',\n    labelViewType2d: 'View in 2D',\n    labelViewType3d: 'View in 3D',\n    labelDataColors: 'Enabled if this data column contains any CSS color values.',\n    labelDataNullAll: 'Loading data...',\n    labelDataNullFiltered: 'You can filter by first making a selection, then choosing <b>Isolate</b> or <b>Exclude</b> in the top bar.',\n    labelDataNullSelection: 'You can select by: <ul><li>clicking the chart axes</li><li>clicking in the legend</li><li>searching</li</ul>',\n    labelZeroAll: 'Dataset contains zero rows.',\n    labelZeroSearchResults: 'No rows matched your search.',\n    signalGroups: [\n        { prefix: 'Chart', label: 'Chart options' },\n        { prefix: 'Mark', label: 'Mark options' },\n        { prefix: 'RoleColor', label: 'Color options' },\n        { prefix: 'RoleFacet', label: 'Facet options' },\n        { prefix: 'RoleSort', label: 'Sort options' },\n        { prefix: 'RoleX', label: 'X axis options' },\n        { prefix: 'RoleY', label: 'Y axis options' },\n        { prefix: 'RoleZ', label: 'Z axis options' },\n        { prefix: 'Text', label: 'Text options' },\n        { prefix: '*', label: 'Options' },\n    ],\n    percentValueFormat: (value: number) => `${value}%`,\n};\n"
  },
  {
    "path": "packages/sanddance-explorer/src/mouseEvent.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport interface MousePosition {\n    top: number;\n    left: number;\n}\n\nfunction hasClientXY(e: MouseEvent | PointerEvent | Touch): MousePosition {\n    if (e && e.clientX !== undefined && e.clientX !== undefined) {\n        return { top: e.clientY, left: e.clientX };\n    }\n}\n\nexport function getPosition(e: MouseEvent | PointerEvent | TouchEvent): MousePosition {\n    const xy = hasClientXY(e as MouseEvent | PointerEvent);\n    if (xy) {\n        return xy;\n    }\n    const te = e as TouchEvent;\n    if (te?.touches) {\n        for (let i = 0; i < te.touches.length; i++) {\n            const xy = hasClientXY(te.touches[i]);\n            if (xy) {\n                return xy;\n            }\n        }\n    }\n    const el = e.target as HTMLElement;\n    if (el && el.getClientRects) {\n        return el.getClientRects()[0];\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/palettes/categorical.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { schemeOption, schemesJSX } from './scheme';\n\nconst p8 = `${100 / 8}%`;\nconst p9 = `${100 / 9}%`;\nconst p10 = `${100 / 10}%`;\nconst p12 = `${100 / 12}%`;\nconst p20 = `${100 / 20}%`;\n\nlet loaded = false;\n\nfunction load() {\n    schemesJSX['accent'] = (\n        <div className=\"swatch\">\n            <div title=\"#7fc97f\" style={{ width: p8, background: 'rgb(127, 201, 127)' }}></div>\n            <div title=\"#beaed4\" style={{ width: p8, background: 'rgb(190, 174, 212)' }}></div>\n            <div title=\"#fdc086\" style={{ width: p8, background: 'rgb(253, 192, 134)' }}></div>\n            <div title=\"#ffff99\" style={{ width: p8, background: 'rgb(255, 255, 153)' }}></div>\n            <div title=\"#386cb0\" style={{ width: p8, background: 'rgb(56, 108, 176)' }}></div>\n            <div title=\"#f0027f\" style={{ width: p8, background: 'rgb(240, 2, 127)' }}></div>\n            <div title=\"#bf5b17\" style={{ width: p8, background: 'rgb(191, 91, 23)' }}></div>\n            <div title=\"#666666\" style={{ width: p8, background: 'rgb(102, 102, 102)' }}></div>\n        </div>\n    );\n    schemesJSX['category10'] = (\n        <div className=\"swatch\">\n            <div title=\"#1f77b4\" style={{ width: p10, background: 'rgb(31, 119, 180)' }}></div>\n            <div title=\"#ff7f0e\" style={{ width: p10, background: 'rgb(255, 127, 14)' }}></div>\n            <div title=\"#2ca02c\" style={{ width: p10, background: 'rgb(44, 160, 44)' }}></div>\n            <div title=\"#d62728\" style={{ width: p10, background: 'rgb(214, 39, 40)' }}></div>\n            <div title=\"#9467bd\" style={{ width: p10, background: 'rgb(148, 103, 189)' }}></div>\n            <div title=\"#8c564b\" style={{ width: p10, background: 'rgb(140, 86, 75)' }}></div>\n            <div title=\"#e377c2\" style={{ width: p10, background: 'rgb(227, 119, 194)' }}></div>\n            <div title=\"#7f7f7f\" style={{ width: p10, background: 'rgb(127, 127, 127)' }}></div>\n            <div title=\"#bcbd22\" style={{ width: p10, background: 'rgb(188, 189, 34)' }}></div>\n            <div title=\"#17becf\" style={{ width: p10, background: 'rgb(23, 190, 207)' }}></div>\n        </div>\n    );\n    schemesJSX['category20'] = (\n        <div className=\"swatch\">\n            <div title=\"#1f77b4\" style={{ width: p20, background: 'rgb(31, 119, 180)' }}></div>\n            <div title=\"#aec7e8\" style={{ width: p20, background: 'rgb(174, 199, 232)' }}></div>\n            <div title=\"#ff7f0e\" style={{ width: p20, background: 'rgb(255, 127, 14)' }}></div>\n            <div title=\"#ffbb78\" style={{ width: p20, background: 'rgb(255, 187, 120)' }}></div>\n            <div title=\"#2ca02c\" style={{ width: p20, background: 'rgb(44, 160, 44)' }}></div>\n            <div title=\"#98df8a\" style={{ width: p20, background: 'rgb(152, 223, 138)' }}></div>\n            <div title=\"#d62728\" style={{ width: p20, background: 'rgb(214, 39, 40)' }}></div>\n            <div title=\"#ff9896\" style={{ width: p20, background: 'rgb(255, 152, 150)' }}></div>\n            <div title=\"#9467bd\" style={{ width: p20, background: 'rgb(148, 103, 189)' }}></div>\n            <div title=\"#c5b0d5\" style={{ width: p20, background: 'rgb(197, 176, 213)' }}></div>\n            <div title=\"#8c564b\" style={{ width: p20, background: 'rgb(140, 86, 75)' }}></div>\n            <div title=\"#c49c94\" style={{ width: p20, background: 'rgb(196, 156, 148)' }}></div>\n            <div title=\"#e377c2\" style={{ width: p20, background: 'rgb(227, 119, 194)' }}></div>\n            <div title=\"#f7b6d2\" style={{ width: p20, background: 'rgb(247, 182, 210)' }}></div>\n            <div title=\"#7f7f7f\" style={{ width: p20, background: 'rgb(127, 127, 127)' }}></div>\n            <div title=\"#c7c7c7\" style={{ width: p20, background: 'rgb(199, 199, 199)' }}></div>\n            <div title=\"#bcbd22\" style={{ width: p20, background: 'rgb(188, 189, 34)' }}></div>\n            <div title=\"#dbdb8d\" style={{ width: p20, background: 'rgb(219, 219, 141)' }}></div>\n            <div title=\"#17becf\" style={{ width: p20, background: 'rgb(23, 190, 207)' }}></div>\n            <div title=\"#9edae5\" style={{ width: p20, background: 'rgb(158, 218, 229)' }}></div>\n        </div>\n    );\n    schemesJSX['category20b'] = (\n        <div className=\"swatch\">\n            <div title=\"#393b79\" style={{ width: p20, background: 'rgb(57, 59, 121)' }}></div>\n            <div title=\"#5254a3\" style={{ width: p20, background: 'rgb(82, 84, 163)' }}></div>\n            <div title=\"#6b6ecf\" style={{ width: p20, background: 'rgb(107, 110, 207)' }}></div>\n            <div title=\"#9c9ede\" style={{ width: p20, background: 'rgb(156, 158, 222)' }}></div>\n            <div title=\"#637939\" style={{ width: p20, background: 'rgb(99, 121, 57)' }}></div>\n            <div title=\"#8ca252\" style={{ width: p20, background: 'rgb(140, 162, 82)' }}></div>\n            <div title=\"#b5cf6b\" style={{ width: p20, background: 'rgb(181, 207, 107)' }}></div>\n            <div title=\"#cedb9c\" style={{ width: p20, background: 'rgb(206, 219, 156)' }}></div>\n            <div title=\"#8c6d31\" style={{ width: p20, background: 'rgb(140, 109, 49)' }}></div>\n            <div title=\"#bd9e39\" style={{ width: p20, background: 'rgb(189, 158, 57)' }}></div>\n            <div title=\"#e7ba52\" style={{ width: p20, background: 'rgb(231, 186, 82)' }}></div>\n            <div title=\"#e7cb94\" style={{ width: p20, background: 'rgb(231, 203, 148)' }}></div>\n            <div title=\"#843c39\" style={{ width: p20, background: 'rgb(132, 60, 57)' }}></div>\n            <div title=\"#ad494a\" style={{ width: p20, background: 'rgb(173, 73, 74)' }}></div>\n            <div title=\"#d6616b\" style={{ width: p20, background: 'rgb(214, 97, 107)' }}></div>\n            <div title=\"#e7969c\" style={{ width: p20, background: 'rgb(231, 150, 156)' }}></div>\n            <div title=\"#7b4173\" style={{ width: p20, background: 'rgb(123, 65, 115)' }}></div>\n            <div title=\"#a55194\" style={{ width: p20, background: 'rgb(165, 81, 148)' }}></div>\n            <div title=\"#ce6dbd\" style={{ width: p20, background: 'rgb(206, 109, 189)' }}></div>\n            <div title=\"#de9ed6\" style={{ width: p20, background: 'rgb(222, 158, 214)' }}></div>\n        </div>\n    );\n    schemesJSX['category20c'] = (\n        <div className=\"swatch\">\n            <div title=\"#3182bd\" style={{ width: p20, background: 'rgb(49, 130, 189)' }}></div>\n            <div title=\"#6baed6\" style={{ width: p20, background: 'rgb(107, 174, 214)' }}></div>\n            <div title=\"#9ecae1\" style={{ width: p20, background: 'rgb(158, 202, 225)' }}></div>\n            <div title=\"#c6dbef\" style={{ width: p20, background: 'rgb(198, 219, 239)' }}></div>\n            <div title=\"#e6550d\" style={{ width: p20, background: 'rgb(230, 85, 13)' }}></div>\n            <div title=\"#fd8d3c\" style={{ width: p20, background: 'rgb(253, 141, 60)' }}></div>\n            <div title=\"#fdae6b\" style={{ width: p20, background: 'rgb(253, 174, 107)' }}></div>\n            <div title=\"#fdd0a2\" style={{ width: p20, background: 'rgb(253, 208, 162)' }}></div>\n            <div title=\"#31a354\" style={{ width: p20, background: 'rgb(49, 163, 84)' }}></div>\n            <div title=\"#74c476\" style={{ width: p20, background: 'rgb(116, 196, 118)' }}></div>\n            <div title=\"#a1d99b\" style={{ width: p20, background: 'rgb(161, 217, 155)' }}></div>\n            <div title=\"#c7e9c0\" style={{ width: p20, background: 'rgb(199, 233, 192)' }}></div>\n            <div title=\"#756bb1\" style={{ width: p20, background: 'rgb(117, 107, 177)' }}></div>\n            <div title=\"#9e9ac8\" style={{ width: p20, background: 'rgb(158, 154, 200)' }}></div>\n            <div title=\"#bcbddc\" style={{ width: p20, background: 'rgb(188, 189, 220)' }}></div>\n            <div title=\"#dadaeb\" style={{ width: p20, background: 'rgb(218, 218, 235)' }}></div>\n            <div title=\"#636363\" style={{ width: p20, background: 'rgb(99, 99, 99)' }}></div>\n            <div title=\"#969696\" style={{ width: p20, background: 'rgb(150, 150, 150)' }}></div>\n            <div title=\"#bdbdbd\" style={{ width: p20, background: 'rgb(189, 189, 189)' }}></div>\n            <div title=\"#d9d9d9\" style={{ width: p20, background: 'rgb(217, 217, 217)' }}></div>\n        </div>\n    );\n    schemesJSX['dark2'] = (\n        <div className=\"swatch\">\n            <div title=\"#1b9e77\" style={{ width: p8, background: 'rgb(27, 158, 119)' }}></div>\n            <div title=\"#d95f02\" style={{ width: p8, background: 'rgb(217, 95, 2)' }}></div>\n            <div title=\"#7570b3\" style={{ width: p8, background: 'rgb(117, 112, 179)' }}></div>\n            <div title=\"#e7298a\" style={{ width: p8, background: 'rgb(231, 41, 138)' }}></div>\n            <div title=\"#66a61e\" style={{ width: p8, background: 'rgb(102, 166, 30)' }}></div>\n            <div title=\"#e6ab02\" style={{ width: p8, background: 'rgb(230, 171, 2)' }}></div>\n            <div title=\"#a6761d\" style={{ width: p8, background: 'rgb(166, 118, 29)' }}></div>\n            <div title=\"#666666\" style={{ width: p8, background: 'rgb(102, 102, 102)' }}></div>\n        </div>\n    );\n    schemesJSX['paired'] = (\n        <div className=\"swatch\">\n            <div title=\"#a6cee3\" style={{ width: p12, background: 'rgb(166, 206, 227)' }}></div>\n            <div title=\"#1f78b4\" style={{ width: p12, background: 'rgb(31, 120, 180)' }}></div>\n            <div title=\"#b2df8a\" style={{ width: p12, background: 'rgb(178, 223, 138)' }}></div>\n            <div title=\"#33a02c\" style={{ width: p12, background: 'rgb(51, 160, 44)' }}></div>\n            <div title=\"#fb9a99\" style={{ width: p12, background: 'rgb(251, 154, 153)' }}></div>\n            <div title=\"#e31a1c\" style={{ width: p12, background: 'rgb(227, 26, 28)' }}></div>\n            <div title=\"#fdbf6f\" style={{ width: p12, background: 'rgb(253, 191, 111)' }}></div>\n            <div title=\"#ff7f00\" style={{ width: p12, background: 'rgb(255, 127, 0)' }}></div>\n            <div title=\"#cab2d6\" style={{ width: p12, background: 'rgb(202, 178, 214)' }}></div>\n            <div title=\"#6a3d9a\" style={{ width: p12, background: 'rgb(106, 61, 154)' }}></div>\n            <div title=\"#ffff99\" style={{ width: p12, background: 'rgb(255, 255, 153)' }}></div>\n            <div title=\"#b15928\" style={{ width: p12, background: 'rgb(177, 89, 40)' }}></div>\n        </div>\n    );\n    schemesJSX['pastel1'] = (\n        <div className=\"swatch\">\n            <div title=\"#fbb4ae\" style={{ width: p9, background: 'rgb(251, 180, 174)' }}></div>\n            <div title=\"#b3cde3\" style={{ width: p9, background: 'rgb(179, 205, 227)' }}></div>\n            <div title=\"#ccebc5\" style={{ width: p9, background: 'rgb(204, 235, 197)' }}></div>\n            <div title=\"#decbe4\" style={{ width: p9, background: 'rgb(222, 203, 228)' }}></div>\n            <div title=\"#fed9a6\" style={{ width: p9, background: 'rgb(254, 217, 166)' }}></div>\n            <div title=\"#ffffcc\" style={{ width: p9, background: 'rgb(255, 255, 204)' }}></div>\n            <div title=\"#e5d8bd\" style={{ width: p9, background: 'rgb(229, 216, 189)' }}></div>\n            <div title=\"#fddaec\" style={{ width: p9, background: 'rgb(253, 218, 236)' }}></div>\n            <div title=\"#f2f2f2\" style={{ width: p9, background: 'rgb(242, 242, 242)' }}></div>\n        </div>\n    );\n    schemesJSX['pastel2'] = (\n        <div className=\"swatch\">\n            <div title=\"#b3e2cd\" style={{ width: p8, background: 'rgb(179, 226, 205)' }}></div>\n            <div title=\"#fdcdac\" style={{ width: p8, background: 'rgb(253, 205, 172)' }}></div>\n            <div title=\"#cbd5e8\" style={{ width: p8, background: 'rgb(203, 213, 232)' }}></div>\n            <div title=\"#f4cae4\" style={{ width: p8, background: 'rgb(244, 202, 228)' }}></div>\n            <div title=\"#e6f5c9\" style={{ width: p8, background: 'rgb(230, 245, 201)' }}></div>\n            <div title=\"#fff2ae\" style={{ width: p8, background: 'rgb(255, 242, 174)' }}></div>\n            <div title=\"#f1e2cc\" style={{ width: p8, background: 'rgb(241, 226, 204)' }}></div>\n            <div title=\"#cccccc\" style={{ width: p8, background: 'rgb(204, 204, 204)' }}></div>\n        </div>\n    );\n    schemesJSX['set1'] = (\n        <div className=\"swatch\">\n            <div title=\"#e41a1c\" style={{ width: p9, background: 'rgb(228, 26, 28)' }}></div>\n            <div title=\"#377eb8\" style={{ width: p9, background: 'rgb(55, 126, 184)' }}></div>\n            <div title=\"#4daf4a\" style={{ width: p9, background: 'rgb(77, 175, 74)' }}></div>\n            <div title=\"#984ea3\" style={{ width: p9, background: 'rgb(152, 78, 163)' }}></div>\n            <div title=\"#ff7f00\" style={{ width: p9, background: 'rgb(255, 127, 0)' }}></div>\n            <div title=\"#ffff33\" style={{ width: p9, background: 'rgb(255, 255, 51)' }}></div>\n            <div title=\"#a65628\" style={{ width: p9, background: 'rgb(166, 86, 40)' }}></div>\n            <div title=\"#f781bf\" style={{ width: p9, background: 'rgb(247, 129, 191)' }}></div>\n            <div title=\"#999999\" style={{ width: p9, background: 'rgb(153, 153, 153)' }}></div>\n        </div>\n    );\n    schemesJSX['set2'] = (\n        <div className=\"swatch\">\n            <div title=\"#66c2a5\" style={{ width: p8, background: 'rgb(102, 194, 165)' }}></div>\n            <div title=\"#fc8d62\" style={{ width: p8, background: 'rgb(252, 141, 98)' }}></div>\n            <div title=\"#8da0cb\" style={{ width: p8, background: 'rgb(141, 160, 203)' }}></div>\n            <div title=\"#e78ac3\" style={{ width: p8, background: 'rgb(231, 138, 195)' }}></div>\n            <div title=\"#a6d854\" style={{ width: p8, background: 'rgb(166, 216, 84)' }}></div>\n            <div title=\"#ffd92f\" style={{ width: p8, background: 'rgb(255, 217, 47)' }}></div>\n            <div title=\"#e5c494\" style={{ width: p8, background: 'rgb(229, 196, 148)' }}></div>\n            <div title=\"#b3b3b3\" style={{ width: p8, background: 'rgb(179, 179, 179)' }}></div>\n        </div>\n    );\n    schemesJSX['set3'] = (\n        <div className=\"swatch\">\n            <div title=\"#8dd3c7\" style={{ width: p12, background: 'rgb(141, 211, 199)' }}></div>\n            <div title=\"#ffffb3\" style={{ width: p12, background: 'rgb(255, 255, 179)' }}></div>\n            <div title=\"#bebada\" style={{ width: p12, background: 'rgb(190, 186, 218)' }}></div>\n            <div title=\"#fb8072\" style={{ width: p12, background: 'rgb(251, 128, 114)' }}></div>\n            <div title=\"#80b1d3\" style={{ width: p12, background: 'rgb(128, 177, 211)' }}></div>\n            <div title=\"#fdb462\" style={{ width: p12, background: 'rgb(253, 180, 98)' }}></div>\n            <div title=\"#b3de69\" style={{ width: p12, background: 'rgb(179, 222, 105)' }}></div>\n            <div title=\"#fccde5\" style={{ width: p12, background: 'rgb(252, 205, 229)' }}></div>\n            <div title=\"#d9d9d9\" style={{ width: p12, background: 'rgb(217, 217, 217)' }}></div>\n            <div title=\"#bc80bd\" style={{ width: p12, background: 'rgb(188, 128, 189)' }}></div>\n            <div title=\"#ccebc5\" style={{ width: p12, background: 'rgb(204, 235, 197)' }}></div>\n            <div title=\"#ffed6f\" style={{ width: p12, background: 'rgb(255, 237, 111)' }}></div>\n        </div>\n    );\n    schemesJSX['tableau10'] = (\n        <div className=\"swatch\">\n            <div title=\"#4c78a8\" style={{ width: p10, background: 'rgb(76, 120, 168)' }}></div>\n            <div title=\"#f58518\" style={{ width: p10, background: 'rgb(245, 133, 24)' }}></div>\n            <div title=\"#e45756\" style={{ width: p10, background: 'rgb(228, 87, 86)' }}></div>\n            <div title=\"#72b7b2\" style={{ width: p10, background: 'rgb(114, 183, 178)' }}></div>\n            <div title=\"#54a24b\" style={{ width: p10, background: 'rgb(84, 162, 75)' }}></div>\n            <div title=\"#eeca3b\" style={{ width: p10, background: 'rgb(238, 202, 59)' }}></div>\n            <div title=\"#b279a2\" style={{ width: p10, background: 'rgb(178, 121, 162)' }}></div>\n            <div title=\"#ff9da6\" style={{ width: p10, background: 'rgb(255, 157, 166)' }}></div>\n            <div title=\"#9d755d\" style={{ width: p10, background: 'rgb(157, 117, 93)' }}></div>\n            <div title=\"#bab0ac\" style={{ width: p10, background: 'rgb(186, 176, 172)' }}></div>\n        </div>\n    );\n    schemesJSX['tableau20'] = (\n        <div className=\"swatch\">\n            <div title=\"#4c78a8\" style={{ width: p20, background: 'rgb(76, 120, 168)' }}></div>\n            <div title=\"#9ecae9\" style={{ width: p20, background: 'rgb(158, 202, 233)' }}></div>\n            <div title=\"#f58518\" style={{ width: p20, background: 'rgb(245, 133, 24)' }}></div>\n            <div title=\"#ffbf79\" style={{ width: p20, background: 'rgb(255, 191, 121)' }}></div>\n            <div title=\"#54a24b\" style={{ width: p20, background: 'rgb(84, 162, 75)' }}></div>\n            <div title=\"#88d27a\" style={{ width: p20, background: 'rgb(136, 210, 122)' }}></div>\n            <div title=\"#b79a20\" style={{ width: p20, background: 'rgb(183, 154, 32)' }}></div>\n            <div title=\"#f2cf5b\" style={{ width: p20, background: 'rgb(242, 207, 91)' }}></div>\n            <div title=\"#439894\" style={{ width: p20, background: 'rgb(67, 152, 148)' }}></div>\n            <div title=\"#83bcb6\" style={{ width: p20, background: 'rgb(131, 188, 182)' }}></div>\n            <div title=\"#e45756\" style={{ width: p20, background: 'rgb(228, 87, 86)' }}></div>\n            <div title=\"#ff9d98\" style={{ width: p20, background: 'rgb(255, 157, 152)' }}></div>\n            <div title=\"#79706e\" style={{ width: p20, background: 'rgb(121, 112, 110)' }}></div>\n            <div title=\"#bab0ac\" style={{ width: p20, background: 'rgb(186, 176, 172)' }}></div>\n            <div title=\"#d67195\" style={{ width: p20, background: 'rgb(214, 113, 149)' }}></div>\n            <div title=\"#fcbfd2\" style={{ width: p20, background: 'rgb(252, 191, 210)' }}></div>\n            <div title=\"#b279a2\" style={{ width: p20, background: 'rgb(178, 121, 162)' }}></div>\n            <div title=\"#d6a5c9\" style={{ width: p20, background: 'rgb(214, 165, 201)' }}></div>\n            <div title=\"#9e765f\" style={{ width: p20, background: 'rgb(158, 118, 95)' }}></div>\n            <div title=\"#d8b5a5\" style={{ width: p20, background: 'rgb(216, 181, 165)' }}></div>\n        </div>\n    );\n    loaded = true;\n}\n\nexport function categorical(selected: string) {\n    if (!loaded) load();\n    return [\n        schemeOption(selected, 'accent'),\n        schemeOption(selected, 'category10'),\n        schemeOption(selected, 'category20'),\n        schemeOption(selected, 'category20b'),\n        schemeOption(selected, 'category20c'),\n        schemeOption(selected, 'dark2'),\n        schemeOption(selected, 'paired'),\n        schemeOption(selected, 'pastel1'),\n        schemeOption(selected, 'pastel2'),\n        schemeOption(selected, 'set1'),\n        schemeOption(selected, 'set2'),\n        schemeOption(selected, 'set3'),\n        schemeOption(selected, 'tableau10'),\n        schemeOption(selected, 'tableau20'),\n    ];\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/palettes/cyclical.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { schemeOption, schemesJSX } from './scheme';\n\nlet loaded = false;\n\nfunction load() {\n    schemesJSX['rainbow'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-rainbow\">\n                    <stop offset=\"0%\" stopColor=\"#6e40aa\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#bf3caf\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#fe4b83\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#ff7847\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#e2b72f\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#aff05b\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#52f667\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#1ddfa3\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#23abd8\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#4c6edb\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#6e40aa\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-rainbow)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['sinebow'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-sinebow\">\n                    <stop offset=\"0%\" stopColor=\"#ff4040\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#e78d0b\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#a7d503\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#58fc2a\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#18f472\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#00bfbf\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#1872f4\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#582afc\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#a703d5\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#e70b8d\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#ff4040\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-sinebow)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    loaded = true;\n}\n\nexport function cyclical(selected: string) {\n    if (!loaded) load();\n    return [\n        schemeOption(selected, 'rainbow'),\n        schemeOption(selected, 'sinebow'),\n    ];\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/palettes/diverging.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { schemeOption, schemesJSX } from './scheme';\n\nlet loaded = false;\n\nfunction load() {\n    schemesJSX['blueorange'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-blueorange\">\n                    <stop offset=\"0%\" stopColor=\"rgb(5, 48, 97)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(34, 101, 163)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(75, 148, 196)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(143, 194, 221)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(205, 227, 238)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(242, 240, 235)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(253, 221, 179)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(248, 182, 100)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(221, 132, 31)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(178, 90, 9)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(127, 59, 8)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-blueorange)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['brownbluegreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-brownbluegreen\">\n                    <stop offset=\"0%\" stopColor=\"rgb(84, 48, 5)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(139, 84, 15)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(188, 132, 53)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(222, 190, 123)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(242, 228, 192)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(238, 241, 234)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(195, 231, 226)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(127, 201, 191)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(57, 152, 143)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(10, 103, 95)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(0, 60, 48)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-brownbluegreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['purplegreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-purplegreen\">\n                    <stop offset=\"0%\" stopColor=\"rgb(64, 0, 75)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(115, 47, 128)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(154, 109, 170)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(193, 164, 205)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(228, 210, 230)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(239, 240, 239)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(214, 238, 209)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(162, 215, 158)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(92, 173, 101)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(33, 120, 57)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(0, 68, 27)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-purplegreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['pinkyellowgreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-pinkyellowgreen\">\n                    <stop offset=\"0%\" stopColor=\"rgb(142, 1, 82)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(192, 38, 126)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(221, 114, 173)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(240, 179, 214)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(250, 221, 237)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(245, 243, 239)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(225, 242, 202)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(182, 222, 135)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(128, 187, 71)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(79, 145, 37)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(39, 100, 25)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-pinkyellowgreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['purpleorange'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-purpleorange\">\n                    <stop offset=\"0%\" stopColor=\"rgb(45, 0, 75)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(85, 45, 132)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(129, 112, 172)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(176, 170, 208)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(215, 215, 233)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(243, 238, 234)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(253, 221, 179)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(248, 182, 100)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(221, 132, 31)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(178, 90, 9)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(127, 59, 8)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-purpleorange)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['redblue'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-redblue\">\n                    <stop offset=\"0%\" stopColor=\"rgb(103, 0, 31)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(172, 32, 47)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(213, 96, 80)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(241, 163, 133)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(251, 215, 196)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(242, 239, 238)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(205, 227, 238)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(143, 194, 221)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(75, 148, 196)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(34, 101, 163)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(5, 48, 97)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-redblue)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['redgrey'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-redgrey\">\n                    <stop offset=\"0%\" stopColor=\"rgb(103, 0, 31)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(172, 32, 47)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(213, 96, 80)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(241, 163, 133)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(252, 216, 197)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(250, 244, 241)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(223, 223, 223)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(184, 184, 184)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(134, 134, 134)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(78, 78, 78)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(26, 26, 26)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-redgrey)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['redyellowblue'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-redyellowblue\">\n                    <stop offset=\"0%\" stopColor=\"rgb(165, 0, 38)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(212, 50, 44)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(241, 110, 67)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(252, 172, 100)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(254, 221, 144)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(250, 248, 193)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(220, 241, 236)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(171, 214, 232)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(117, 171, 208)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(74, 116, 180)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(49, 54, 149)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-redyellowblue)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['redyellowgreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-redyellowgreen\">\n                    <stop offset=\"0%\" stopColor=\"rgb(165, 0, 38)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(212, 50, 44)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(241, 110, 67)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(252, 172, 99)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(254, 221, 141)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(249, 247, 174)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(215, 238, 142)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(164, 216, 110)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(100, 188, 97)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(34, 150, 79)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(0, 104, 55)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-redyellowgreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['spectral'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-spectral\">\n                    <stop offset=\"0%\" stopColor=\"rgb(158, 1, 66)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(209, 60, 75)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(240, 112, 74)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(252, 172, 99)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(254, 221, 141)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(251, 248, 176)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(224, 243, 161)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(169, 221, 162)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(105, 189, 169)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(66, 136, 181)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(94, 79, 162)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-spectral)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    loaded = true;\n}\n\nexport function diverging(selected: string) {\n    if (!loaded) load();\n    return [\n        schemeOption(selected, 'blueorange'),\n        schemeOption(selected, 'brownbluegreen'),\n        schemeOption(selected, 'purplegreen'),\n        schemeOption(selected, 'pinkyellowgreen'),\n        schemeOption(selected, 'purpleorange'),\n        schemeOption(selected, 'redblue'),\n        schemeOption(selected, 'redgrey'),\n        schemeOption(selected, 'redyellowblue'),\n        schemeOption(selected, 'redyellowgreen'),\n        schemeOption(selected, 'spectral'),\n    ];\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/palettes/dual.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { schemeOption, schemesJSX } from './scheme';\n\nlet loaded = false;\n\nfunction load() {\n    SandDance.colorSchemes.filter(cs => cs.colors.length === 2).map((binaryScheme, i) => {\n        schemesJSX[binaryScheme.scheme] = (\n            <div className=\"swatch\">\n                {binaryScheme.colors.map((color, j) => (\n                    <div key={j} title={color} style={{ width: '50%', backgroundColor: color }}></div>\n                ))}\n            </div>\n        );\n    });\n    loaded = true;\n}\n\nexport function dual(selected: string) {\n    if (!loaded) load();\n    return SandDance.colorSchemes.filter(cs => cs.colors.length === 2).map((binaryScheme, i) => (\n        schemeOption(selected, binaryScheme.scheme)\n    ));\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/palettes/index.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { categorical } from './categorical';\nimport { cyclical } from './cyclical';\nimport { diverging } from './diverging';\nimport { Dropdown } from '../controls/dropdown';\nimport { dual } from './dual';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { ISchemeOption, schemesJSX } from './scheme';\nimport { SandDance, util } from '@msrvida/sanddance-react';\nimport { sequentialMultiHue } from './sequentialMultiHue';\nimport { sequentialSingleHue } from './sequentialSingleHue';\nimport { strings } from '../language';\n\nconst maxDistinctColors = 20;\n\nexport interface Props {\n    collapseLabel: boolean;\n    scheme: string;\n    colorColumn: SandDance.types.Column;\n    changeColorScheme: (scheme: string) => void;\n    disabled: boolean;\n}\n\nexport function Palette(props: Props) {\n    const { distinctValueCount } = props.colorColumn.stats;\n    const isDual = distinctValueCount === 2;\n    const categoricalNumeric = distinctValueCount > 0 && distinctValueCount < maxDistinctColors;\n    let isQualitative = false;\n    let isQuantitative = false;\n\n    switch (props.colorColumn.type) {\n        case 'boolean':\n        case 'string':\n            isQualitative = true;\n            break;\n\n        case 'number':\n            isQuantitative = true;\n            break;\n\n        case 'date':\n        case 'integer':\n            isQuantitative = true;\n            isQualitative = categoricalNumeric;\n    }\n\n    const selected = props.scheme;\n\n    const options: FluentUITypes.IDropdownOption[] = [];\n\n    function menu(name: string, opts: (ISchemeOption | FluentUITypes.IDropdownOption)[]) {\n        if (options.length) {\n            options.push({\n                key: 'divider' + options.length,\n                text: null,\n                itemType: base.fluentUI.DropdownMenuItemType.Divider,\n            });    \n        }\n        options.push({\n            key: name,\n            text: name,\n            itemType: base.fluentUI.DropdownMenuItemType.Header,\n        });\n        options.push.apply(options, opts);\n    }\n\n    isQualitative && menu(strings.schemeCategorical, categorical(selected));\n    isQuantitative && menu(strings.schemeSequentialSingleHue, sequentialSingleHue(selected));\n    isQuantitative && menu(strings.schemeSequentialMultiHue, sequentialMultiHue(selected));\n    isQuantitative && menu(strings.schemeDiverging, diverging(selected));\n    isQuantitative && menu(strings.schemeCyclical, cyclical(selected));\n    isDual && menu(strings.schemeDual, dual(selected));\n\n    return (\n        <div className=\"sanddance-palette\">\n            <div\n                className=\"sanddance-explanation\"\n                dangerouslySetInnerHTML={{\n                    __html: strings.labelColorFieldInfo(\n                        props.colorColumn.name,\n                        props.colorColumn.type,\n                        categoricalNumeric,\n                        distinctValueCount,\n                    ),\n                }}\n            />\n            <Dropdown\n                collapseLabel={props.collapseLabel}\n                disabled={props.disabled}\n                dropdownWidth={400}\n                label={strings.labelColorScheme}\n                onRenderOption={(option: ISchemeOption): JSX.Element => {\n                    if (option.itemType === base.fluentUI.DropdownMenuItemType.Header) {\n                        return <span>{option.text}</span>;\n                    } else {\n                        return (\n                            <div className=\"sanddance-scheme option\">\n                                <span className=\"name\">{option.scheme}</span>\n                                {option.children}\n                            </div>\n                        );\n                    }\n                }}\n                options={options}\n                onChange={(e, o: ISchemeOption) => {\n                    props.changeColorScheme(o.scheme);\n                }}\n            />\n            <div className={util.classList('sanddance-scheme', props.disabled && 'disabled')}>\n                {props.scheme && schemesJSX[props.scheme]}\n            </div>\n        </div>\n    );\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/palettes/scheme.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\n\nexport interface ISchemeOption extends FluentUITypes.IDropdownOption {\n    scheme: string;\n    children: React.ReactNode;\n}\n\nexport function schemeOption(selected: string, scheme: string): ISchemeOption {\n    return {\n        key: scheme,\n        text: scheme,\n        selected: selected === scheme,\n        scheme: scheme,\n        children: schemesJSX[scheme],\n    };\n}\n\nexport function schemeHeader(key: string, text: string): FluentUITypes.IDropdownOption {\n    return {\n        key,\n        text,\n        itemType: base.fluentUI.DropdownMenuItemType.Header,\n    };\n}\n\nexport const schemesJSX: { [scheme: string]: JSX.Element } = {};\n"
  },
  {
    "path": "packages/sanddance-explorer/src/palettes/sequentialMultiHue.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { strings } from '../language';\nimport { schemeHeader, schemeOption, schemesJSX } from './scheme';\n\nlet loaded = false;\n\nfunction load() {\n    schemesJSX['viridis'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-viridis\">\n                    <stop offset=\"0%\" stopColor=\"#440154\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#482475\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#414487\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#355f8d\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#2a788e\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#21918c\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#22a884\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#44bf70\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#7ad151\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#bddf26\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#fde725\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-viridis)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['inferno'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-inferno\">\n                    <stop offset=\"0%\" stopColor=\"#000004\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#160b39\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#420a68\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#6a176e\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#932667\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#bc3754\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#dd513a\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#f37819\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#fca50a\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#f6d746\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#fcffa4\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-inferno)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['magma'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-magma\">\n                    <stop offset=\"0%\" stopColor=\"#000004\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#140e36\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#3b0f70\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#641a80\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#8c2981\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#b73779\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#de4968\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#f7705c\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#fe9f6d\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#fecf92\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#fcfdbf\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-magma)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['plasma'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-plasma\">\n                    <stop offset=\"0%\" stopColor=\"#0d0887\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#41049d\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#6a00a8\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#8f0da4\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#b12a90\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#cc4778\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#e16462\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#f2844b\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#fca636\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#fcce25\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#f0f921\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-plasma)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['cividis'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-cividis\">\n                    <stop offset=\"0%\" stopColor=\"#002051\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#0a326a\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#2b446e\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#4d566d\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#696970\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#7f7c75\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#948f78\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#ada476\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#caba6a\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#ead156\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#fdea45\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-cividis)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['turbo'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-turbo\">\n                    <stop offset=\"0%\" stopColor=\"#23171b\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#4a58dd\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#2f9df5\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#27d7c4\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#4df884\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#95fb51\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#dedd32\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#ffa423\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#f65f18\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#ba2208\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#900c00\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-turbo)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['bluegreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-bluegreen\">\n                    <stop offset=\"0%\" stopColor=\"rgb(247, 252, 253)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(232, 246, 249)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(213, 239, 237)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(183, 228, 218)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(143, 211, 193)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(104, 194, 163)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(73, 177, 127)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(47, 153, 89)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(21, 127, 60)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(3, 100, 41)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(0, 68, 27)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-bluegreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['bluepurple'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-bluepurple\">\n                    <stop offset=\"0%\" stopColor=\"rgb(247, 252, 253)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(228, 238, 245)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(204, 221, 236)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(178, 202, 225)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(156, 179, 213)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(143, 149, 198)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(140, 116, 181)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(137, 82, 165)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(133, 45, 143)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(115, 15, 113)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(77, 0, 75)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-bluepurple)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['goldgreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-goldgreen\">\n                    <stop offset=\"0%\" stopColor=\"#f4d166\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#d5ca60\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#b6c35c\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#98bb59\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#7cb257\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#60a656\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#4b9c53\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#3f8f4f\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#33834a\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#257740\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#146c36\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-goldgreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['goldorange'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-goldorange\">\n                    <stop offset=\"0%\" stopColor=\"#f4d166\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#f8be5c\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#f8aa4c\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#f5983b\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#f3852a\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#ef701b\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#e2621f\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#d65322\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#c54923\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#b14223\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#9e3a26\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-goldorange)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['goldred'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-goldred\">\n                    <stop offset=\"0%\" stopColor=\"#f4d166\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#f6be59\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#f9aa51\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#fc964e\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#f6834b\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#ee734a\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#e56249\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#db5247\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#cf4244\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#c43141\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#b71d3e\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-goldred)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['greenblue'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-greenblue\">\n                    <stop offset=\"0%\" stopColor=\"rgb(247, 252, 240)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(229, 245, 223)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(211, 238, 206)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(189, 229, 191)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(158, 217, 187)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(123, 203, 196)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(88, 183, 205)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(57, 156, 198)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(29, 126, 183)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(11, 96, 161)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(8, 64, 129)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-greenblue)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['orangered'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-orangered\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 247, 236)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(254, 235, 207)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(253, 220, 175)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(253, 202, 148)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(253, 176, 122)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(250, 142, 93)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(241, 108, 73)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(224, 69, 48)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(200, 29, 19)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(167, 4, 3)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(127, 0, 0)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-orangered)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['purplebluegreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-purplebluegreen\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 247, 251)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(239, 231, 242)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(219, 216, 234)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(190, 201, 226)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(152, 185, 217)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(105, 168, 207)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(64, 150, 192)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(25, 135, 159)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(3, 120, 119)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(1, 99, 83)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(1, 70, 54)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-purplebluegreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['purpleblue'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-purpleblue\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 247, 251)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(239, 234, 244)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(219, 218, 235)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(191, 201, 226)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(155, 185, 217)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(114, 168, 207)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(67, 148, 195)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(26, 125, 182)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(6, 103, 161)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(4, 82, 129)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(2, 56, 88)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-purpleblue)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['purplered'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-purplered\">\n                    <stop offset=\"0%\" stopColor=\"rgb(247, 244, 249)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(234, 227, 240)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(220, 201, 226)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(208, 170, 210)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(208, 138, 194)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(221, 99, 174)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(227, 56, 144)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(215, 28, 108)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(183, 11, 79)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(143, 2, 58)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(103, 0, 31)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-purplered)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['redpurple'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-redpurple\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 247, 243)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(253, 228, 225)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(252, 207, 204)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(251, 181, 188)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(249, 147, 176)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(243, 105, 163)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(224, 62, 152)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(192, 23, 136)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(153, 3, 124)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(112, 1, 116)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(73, 0, 106)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-redpurple)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['yellowgreenblue'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-yellowgreenblue\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 255, 217)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(239, 249, 189)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(213, 238, 179)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(169, 221, 183)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(115, 201, 189)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(69, 180, 194)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(40, 151, 191)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(32, 115, 178)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(35, 78, 160)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(28, 49, 133)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(8, 29, 88)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-yellowgreenblue)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['yellowgreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-yellowgreen\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 255, 229)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(247, 252, 196)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(228, 244, 172)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(199, 232, 155)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(162, 216, 138)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(120, 197, 120)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(78, 175, 99)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(47, 148, 78)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(21, 121, 63)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(3, 96, 52)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(0, 69, 41)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-yellowgreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['yelloworangebrown'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-yelloworangebrown\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 255, 229)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(255, 248, 196)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(254, 234, 161)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(254, 214, 118)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(254, 186, 74)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(251, 153, 44)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(238, 121, 24)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(216, 91, 10)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(183, 67, 4)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(143, 50, 4)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(102, 37, 6)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-yelloworangebrown)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['yelloworangered'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-yelloworangered\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 255, 204)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(255, 240, 169)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(254, 224, 135)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(254, 201, 101)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(254, 171, 75)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(253, 137, 60)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(250, 92, 46)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(236, 48, 35)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(211, 17, 33)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(175, 2, 37)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(128, 0, 38)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-yelloworangered)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['darkblue'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-darkblue\">\n                    <stop offset=\"0%\" stopColor=\"#323232\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#2e4463\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#1e588a\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#086da7\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#0082b9\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#039ac7\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#12b1d4\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#2bc8e2\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#3ddff0\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#61f4fb\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#ffffff\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-darkblue)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['darkgold'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-darkgold\">\n                    <stop offset=\"0%\" stopColor=\"#3c3c3c\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#554a38\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#6d5a35\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#846f32\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#a0832d\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#bf9828\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#dbb022\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#f0cb23\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#fae241\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#fff290\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#ffffff\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-darkgold)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['darkgreen'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-darkgreen\">\n                    <stop offset=\"0%\" stopColor=\"#3a3a3a\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#245447\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#076a4c\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#038145\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#2d9642\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#5fa941\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#89bb3f\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#b3cb3b\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#dbdc34\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#ffed39\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#ffffaa\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-darkgreen)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['darkmulti'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-darkmulti\">\n                    <stop offset=\"0%\" stopColor=\"#373737\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#294767\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#1e5b88\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#1a748b\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#1f8e7e\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#29a869\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#6abf50\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#aad332\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#eae30d\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#fff166\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#ffffff\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-darkmulti)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['darkred'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-darkred\">\n                    <stop offset=\"0%\" stopColor=\"#343434\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#643633\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#8c3a36\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#b03e38\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#d14632\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#e75d1e\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#eb7e20\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#ed9c25\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#efb92d\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#f3d431\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#ffeb2c\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-darkred)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['lightgreyred'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-lightgreyred\">\n                    <stop offset=\"0%\" stopColor=\"#efe9e6\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#e2dcd9\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#d7cecb\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#ccc1be\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#c0b4af\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#c4a293\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#d38b66\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#de7336\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#e15917\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#df3a10\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#dc000b\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-lightgreyred)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['lightgreyteal'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-lightgreyteal\">\n                    <stop offset=\"0%\" stopColor=\"#e4eaea\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#d7ddde\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#cbd1d4\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#bcc6ca\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#adbac0\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#85b2be\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#4aacc1\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#22a1c2\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#2192c0\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#1e84be\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#1876bc\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-lightgreyteal)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['lightmulti'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-lightmulti\">\n                    <stop offset=\"0%\" stopColor=\"#e0f1f2\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#caebd7\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#b8e2b3\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#bddf93\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#d8e17e\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#f6e072\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#f6c659\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#f4a946\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#f58a3f\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#f56c3f\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#ef4a3c\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-lightmulti)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['lightorange'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-lightorange\">\n                    <stop offset=\"0%\" stopColor=\"#f2e7da\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#f7d7bd\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#f9c7a0\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#fab78a\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#faa47a\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#f8936d\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#f38264\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#ed725f\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#e6605b\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#dd4f5b\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#d43d5b\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-lightorange)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['lighttealblue'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-lighttealblue\">\n                    <stop offset=\"0%\" stopColor=\"#e3e9e0\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#c4ddd1\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#a2d1cb\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#84c4c9\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#66b5c3\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#49a7bd\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#3698b4\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#3188a9\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#2d799e\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#276994\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#255988\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-lighttealblue)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    loaded = true;\n}\n\nexport function sequentialMultiHue(selected: string) {\n    if (!loaded) load();\n    return [\n        schemeOption(selected, 'viridis'),\n        schemeOption(selected, 'magma'),\n        schemeOption(selected, 'inferno'),\n        schemeOption(selected, 'plasma'),\n        schemeOption(selected, 'cividis'),\n        schemeOption(selected, 'turbo'),\n        schemeOption(selected, 'bluegreen'),\n        schemeOption(selected, 'bluepurple'),\n        schemeOption(selected, 'goldgreen'),\n        schemeOption(selected, 'goldorange'),\n        schemeOption(selected, 'goldred'),\n        schemeOption(selected, 'greenblue'),\n        schemeOption(selected, 'orangered'),\n        schemeOption(selected, 'purplebluegreen'),\n        schemeOption(selected, 'purpleblue'),\n        schemeOption(selected, 'purplered'),\n        schemeOption(selected, 'redpurple'),\n        schemeOption(selected, 'yellowgreenblue'),\n        schemeOption(selected, 'yellowgreen'),\n        schemeOption(selected, 'yelloworangebrown'),\n        schemeOption(selected, 'yelloworangered'),\n        schemeHeader('schemeSequentialMultiHueDark', strings.schemeSequentialMultiHueDark),\n        schemeOption(selected, 'darkblue'),\n        schemeOption(selected, 'darkgold'),\n        schemeOption(selected, 'darkgreen'),\n        schemeOption(selected, 'darkmulti'),\n        schemeOption(selected, 'darkred'),\n        schemeHeader('schemeSequentialMultiHueLight', strings.schemeSequentialMultiHueLight),\n        schemeOption(selected, 'lightgreyred'),\n        schemeOption(selected, 'lightgreyteal'),\n        schemeOption(selected, 'lightmulti'),\n        schemeOption(selected, 'lightorange'),\n        schemeOption(selected, 'lighttealblue'),\n    ];\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/palettes/sequentialSingleHue.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { schemeOption, schemesJSX } from './scheme';\n\nlet loaded = false;\n\nfunction load() {\n    schemesJSX['blues'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-blues\">\n                    <stop offset=\"0%\" stopColor=\"rgb(247, 251, 255)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(227, 238, 249)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(207, 225, 242)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(181, 212, 233)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(147, 195, 223)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(109, 174, 213)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(75, 151, 201)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(47, 126, 188)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(24, 100, 170)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(10, 74, 144)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(8, 48, 107)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-blues)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['tealblues'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-tealblues\">\n                    <stop offset=\"0%\" stopColor=\"#bce4d8\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#a3d6d2\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#8cc9cd\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#76bdc7\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#5fb0c0\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#45a2b9\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#3993b0\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#3584a6\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#32759b\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#2f6790\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#2c5985\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-tealblues)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['teals'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-teals\">\n                    <stop offset=\"0%\" stopColor=\"#bbdfdf\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#a2d4d5\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#8ac9c9\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#75bcbb\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#61b0af\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#4da5a4\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#379998\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#2b8b8c\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#1e7f7f\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#127273\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#006667\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-teals)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['greens'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-greens\">\n                    <stop offset=\"0%\" stopColor=\"rgb(247, 252, 245)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(232, 246, 227)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(211, 238, 205)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(183, 226, 177)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(151, 212, 148)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(115, 195, 120)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(77, 175, 98)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(47, 152, 79)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(21, 127, 59)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(3, 100, 41)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(0, 68, 27)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-greens)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['greys'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-greys\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 255, 255)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(242, 242, 242)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(226, 226, 226)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(206, 206, 206)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(180, 180, 180)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(151, 151, 151)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(122, 122, 122)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(95, 95, 95)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(64, 64, 64)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(30, 30, 30)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(0, 0, 0)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-greys)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['purples'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-purples\">\n                    <stop offset=\"0%\" stopColor=\"rgb(252, 251, 253)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(241, 239, 246)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(226, 225, 239)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(206, 206, 229)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(182, 181, 216)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(158, 155, 201)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(135, 130, 188)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(115, 99, 172)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(97, 64, 155)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(80, 31, 140)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(63, 0, 125)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-purples)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['browns'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-browns\">\n                    <stop offset=\"0%\" stopColor=\"#eedbbd\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#ecca96\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#e9b97a\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#e4a865\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#dc9856\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#d18954\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#c7784c\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#c0673f\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#b85536\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#ad4433\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#9f3632\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-browns)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['reds'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-reds\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 245, 240)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(254, 227, 214)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(253, 201, 180)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(252, 170, 142)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(252, 138, 107)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(249, 105, 76)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(239, 69, 51)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(217, 39, 35)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(187, 21, 26)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(151, 11, 19)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(103, 0, 13)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-reds)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['oranges'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-oranges\">\n                    <stop offset=\"0%\" stopColor=\"rgb(255, 245, 235)\"></stop>\n                    <stop offset=\"10%\" stopColor=\"rgb(254, 232, 211)\"></stop>\n                    <stop offset=\"20%\" stopColor=\"rgb(253, 216, 179)\"></stop>\n                    <stop offset=\"30%\" stopColor=\"rgb(253, 194, 140)\"></stop>\n                    <stop offset=\"40%\" stopColor=\"rgb(253, 167, 98)\"></stop>\n                    <stop offset=\"50%\" stopColor=\"rgb(251, 141, 61)\"></stop>\n                    <stop offset=\"60%\" stopColor=\"rgb(242, 112, 29)\"></stop>\n                    <stop offset=\"70%\" stopColor=\"rgb(226, 86, 9)\"></stop>\n                    <stop offset=\"80%\" stopColor=\"rgb(196, 65, 3)\"></stop>\n                    <stop offset=\"90%\" stopColor=\"rgb(159, 51, 3)\"></stop>\n                    <stop offset=\"100%\" stopColor=\"rgb(127, 39, 4)\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-oranges)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    schemesJSX['warmgreys'] = (\n        <svg viewBox=\"0,0,1,1\" preserveAspectRatio=\"none\">\n            <defs>\n                <linearGradient id=\"gradient-warmgreys\">\n                    <stop offset=\"0%\" stopColor=\"#dcd4d0\"></stop>\n                    <stop offset=\"10%\" stopColor=\"#cec5c1\"></stop>\n                    <stop offset=\"20%\" stopColor=\"#c0b8b4\"></stop>\n                    <stop offset=\"30%\" stopColor=\"#b3aaa7\"></stop>\n                    <stop offset=\"40%\" stopColor=\"#a59c99\"></stop>\n                    <stop offset=\"50%\" stopColor=\"#98908c\"></stop>\n                    <stop offset=\"60%\" stopColor=\"#8b827f\"></stop>\n                    <stop offset=\"70%\" stopColor=\"#7e7673\"></stop>\n                    <stop offset=\"80%\" stopColor=\"#726866\"></stop>\n                    <stop offset=\"90%\" stopColor=\"#665c5a\"></stop>\n                    <stop offset=\"100%\" stopColor=\"#59504e\"></stop>\n                </linearGradient>\n            </defs>\n            <rect fill=\"url(#gradient-warmgreys)\" x=\"0\" y=\"0\" width=\"1\" height=\"1\"></rect>\n        </svg>\n    );\n    loaded = true;\n}\nexport function sequentialSingleHue(selected: string) {\n    if (!loaded) load();\n    return [\n        schemeOption(selected, 'blues'),\n        schemeOption(selected, 'tealblues'),\n        schemeOption(selected, 'teals'),\n        schemeOption(selected, 'greens'),\n        schemeOption(selected, 'browns'),\n        schemeOption(selected, 'oranges'),\n        schemeOption(selected, 'reds'),\n        schemeOption(selected, 'purples'),\n        schemeOption(selected, 'warmgreys'),\n        schemeOption(selected, 'greys'),\n    ];\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/partialInsight.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SandDance } from '@msrvida/sanddance-react';\n\nexport interface RolePrefs {\n  [columnName: string]: Partial<SandDance.specs.Insight>;\n}\n\nexport interface SpecTypePrefs {\n  [role: string]: RolePrefs;\n}\n\nexport interface Prefs {\n  [chart: string]: SpecTypePrefs;\n}\n\nexport function initPrefs(prefs: Prefs, partialInsight: Partial<SandDance.specs.Insight>) {\n    if (partialInsight) {\n        const specTypePrefs = prefs[partialInsight.chart] || {};\n        prefs[partialInsight.chart] = specTypePrefs;\n\n        for (const _role in partialInsight.columns) {\n            const role = _role as SandDance.specs.InsightColumnRoles;\n            if (role === 'color' || role === 'x') {\n                const rolePrefs = specTypePrefs[role] || {};\n                specTypePrefs[role] = rolePrefs;\n                const column = partialInsight.columns[role];\n                const copySignalValue = (signalName: string) => {\n                    if (partialInsight.signalValues && partialInsight.signalValues[signalName] && rolePrefs[column]) {\n                        const signalValues = rolePrefs[column].signalValues || {};\n                        signalValues[signalName] = partialInsight.signalValues[signalName];\n                        rolePrefs[column].signalValues = signalValues;\n                    }\n                };\n\n                switch (role) {\n                    case 'color':\n                        rolePrefs[column] = {\n                            scheme: partialInsight.scheme,\n                            colorBin: partialInsight.colorBin,\n                        };\n                        copySignalValue(SandDance.constants.SignalNames.ColorBinCount);\n                        break;\n\n                    case 'x':\n                        copySignalValue(SandDance.constants.SignalNames.XBins);\n                        break;\n                }\n            }\n        }\n    }\n}\n\nexport function saveSignalValuePref(prefs: Prefs, chart: SandDance.specs.Chart, role: string, column: string, signalName: string, signalValue: string) {\n    const partialInsight = savePref(prefs, chart, role, column, { signalValues: {} });\n    partialInsight.signalValues[signalName] = signalValue;\n}\n\nexport function copyPrefToNewState(prefs: Prefs, chart: SandDance.specs.Chart, role: string, columnName: string) {\n    const specTypePrefs = SandDance.VegaMorphCharts.util.deepMerge({}, prefs['*'], prefs[chart]);\n    const rolePrefs = SandDance.VegaMorphCharts.util.deepMerge({}, specTypePrefs['*'], specTypePrefs[role]);\n    const partialInsight = SandDance.VegaMorphCharts.util.deepMerge({}, rolePrefs['*'], rolePrefs[columnName]);\n    return partialInsight;\n}\n\nexport function savePref(prefs: Prefs, chart: SandDance.specs.Chart, role: string, column: string, partialInsight: Partial<SandDance.specs.Insight>) {\n    const SpecTypePrefs = prefs[chart] || {};\n    prefs[chart] = SpecTypePrefs;\n\n    const rolePrefs = SpecTypePrefs[role] || {};\n    SpecTypePrefs[role] = rolePrefs;\n\n    rolePrefs[column] = SandDance.VegaMorphCharts.util.deepMerge({}, rolePrefs[column], partialInsight);\n    return rolePrefs[column];\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/searchGroups.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SandDance } from '@msrvida/sanddance-react';\nimport { InputSearchExpression } from './controls/searchTerm';\nimport { InputSearchExpressionGroup } from './dialogs/search';\n\nimport SearchExpressionGroup = SandDance.searchExpression.SearchExpressionGroup;\n\nfunction comparableGroup(group: SearchExpressionGroup): SearchExpressionGroup {\n    return { ...group, clause: null };\n}\n\nfunction compareGroup(a: SearchExpressionGroup, b: SearchExpressionGroup) {\n    return SandDance.searchExpression.compareGroup(comparableGroup(a), comparableGroup(b));\n}\n\nexport function compareGroups(haystack: SearchExpressionGroup[], needle: SearchExpressionGroup) {\n    const groups: SearchExpressionGroup[] = [];\n    let found = false;\n\n    //look for item in all\n    haystack.forEach(group => {\n        if (compareGroup(group, needle)) {\n            //if it exists, don't add it\n            found = true;\n        } else {\n            groups.push(group);\n        }\n    });\n\n    return { groups, found };\n}\n\nexport function createInputSearch(search: SandDance.searchExpression.Search) {\n    const groups = SandDance.searchExpression.ensureSearchExpressionGroupArray(search);\n    const dialogSearch: InputSearchExpressionGroup[] = groups.map((group, groupIndex) => {\n        return {\n            key: groupIndex,\n            ...group,\n            expressions: group.expressions.map((ex, i) => {\n                const ex2: InputSearchExpression = {\n                    key: i,\n                    ...ex,\n                };\n                return ex2;\n            }),\n        };\n    });\n    return dialogSearch;\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/themes.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { ColorSettings } from './interfaces';\nimport { FluentUITypes } from '@msrvida/fluentui-react-cdn-typings';\nimport { SandDance } from '@msrvida/sanddance-react';\n\nimport util = SandDance.VegaMorphCharts.util;\n\nexport const themePalettes: { [theme: string]: Partial<FluentUITypes.IPalette> } = {};\n\nthemePalettes[''] = {\n    themePrimary: '#0078d4',\n    themeLighterAlt: '#eff6fc',\n    themeLighter: '#deecf9',\n    themeLight: '#c7e0f4',\n    themeTertiary: '#71afe5',\n    themeSecondary: '#2b88d8',\n    themeDarkAlt: '#106ebe',\n    themeDark: '#005a9e',\n    themeDarker: '#004578',\n    neutralLighterAlt: '#faf9f8',\n    neutralLighter: '#f3f2f1',\n    neutralLight: '#edebe9',\n    neutralQuaternaryAlt: '#e1dfdd',\n    neutralQuaternary: '#d0d0d0',\n    neutralTertiaryAlt: '#c8c6c4',\n    neutralTertiary: '#595959',\n    neutralSecondary: '#373737',\n    neutralSecondaryAlt: '#373737',\n    neutralPrimaryAlt: '#2f2f2f',\n    neutralPrimary: '#000000',\n    neutralDark: '#151515',\n    black: '#0b0b0b',\n    white: '#ffffff',\n};\n\nthemePalettes['dark-theme'] = {\n    themePrimary: '#0078d4',\n    themeLighterAlt: '#eff6fc',\n    themeLighter: '#deecf9',\n    themeLight: '#c7e0f4',\n    themeTertiary: '#71afe5',\n    themeSecondary: '#2b88d8',\n    themeDarkAlt: '#106ebe',\n    themeDark: '#005a9e',\n    themeDarker: '#004578',\n    neutralLighterAlt: '#0b0b0b',\n    neutralLighter: '#151515',\n    neutralLight: '#252525',\n    neutralQuaternaryAlt: '#2f2f2f',\n    neutralQuaternary: '#373737',\n    neutralTertiaryAlt: '#595959',\n    neutralTertiary: '#c8c8c8',\n    neutralSecondary: '#d0d0d0',\n    neutralSecondaryAlt: '#d0d0d0',\n    neutralPrimaryAlt: '#dadada',\n    neutralPrimary: '#ffffff',\n    neutralDark: '#f4f4f4',\n    black: '#f8f8f8',\n    white: '#000000',\n};\n\nexport function getColorSettingsFromThemePalette(themePalette: Partial<FluentUITypes.IPalette>): Partial<ColorSettings> {\n    const c = util.colorFromString(themePalette.themeSecondary);\n    c[3] = 256 / 3; // one-third opacity background\n    return {\n        axisLine: themePalette.black,\n        axisText: themePalette.black,\n        gridLine: themePalette.neutralLight,\n        backgroundColor: themePalette.white,\n        hoveredCube: themePalette.black,\n        clickableText: themePalette.themeDark,\n        clickableTextHighlight: util.colorToString(c),\n        searchText: themePalette.neutralPrimary,\n        searchTextHighlight: themePalette.neutralPrimaryAlt,\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-explorer/src/version.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const version: string = 'DEBUG';\n"
  },
  {
    "path": "packages/sanddance-explorer/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"base.react.createElement\",\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\",\n        \"types\": []\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/sanddance-explorer/vite.config.js",
    "content": "import { defineConfig } from 'vite';\nimport { resolve } from 'path';\n\nexport default defineConfig({\n    build: {\n        lib: {\n            entry: resolve(__dirname, 'bundle/umd.js'),\n            name: 'SandDanceExplorer',\n            formats: ['umd'],\n            fileName: () => 'sanddance-explorer.js',\n        },\n        outDir: 'dist/umd',\n        emptyOutDir: true,\n        sourcemap: false,\n        minify: false,\n        rollupOptions: {\n            external: ['react', 'react-dom'],\n            output: {\n                globals: {\n                    'react': 'React',\n                    'react-dom': 'ReactDOM',\n                },\n            },\n        },\n    },\n});\n"
  },
  {
    "path": "packages/sanddance-react/.gitignore",
    "content": "dist\n"
  },
  {
    "path": "packages/sanddance-react/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/sanddance-react/README.md",
    "content": "# @msrvida/sanddance-react\n\nVisually explore, understand, and present your data.\n\n![sanddance-animation](https://user-images.githubusercontent.com/11507384/189461831-9467863e-bff8-47d2-aa03-ab2b74658814.gif)\n\n[Demo](https://microsoft.github.io/SandDance/app)\n\n## Installation\n\nAdd these to the `dependencies` section of your `package.json`, then run `npm install`:\n\n```json\n\"@msrvida/sanddance-react\": \"^4\",\n\"react\": \"^17\",\n\"react-dom\": \"^17\",\n\"vega\": \"^6.2\"\n```\n\nImport these in your JavaScript:\n\n```js\nimport * as vega from 'vega';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as SandDanceReact from '@msrvida/sanddance-react';\n\nSandDanceReact.use(React, ReactDOM, vega);\n\nconst data = [\n    { a: 1, b: \"c1\" },\n    { a: 1, b: \"c2\" },\n    { a: 2, b: \"c3\" },\n    { a: 3, b: \"c4\" }\n];\n\nconst insight = {\n    columns: {\n        x: \"a\",\n        color: \"b\",\n    },\n    scheme: \"set1\",\n    chart: \"barchartV\",\n    view: \"2d\",\n    size: {\n        height: 800,\n        width: 800\n    }\n}\n\nReactDOM.render(\n    <SandDanceReact.Viewer\n        data={data}\n        insight={insight}\n    />,\n    document.getElementById('app')\n);\n```\n\n## Versions\n\n### Breaking changes in v4\n\n* renamed SandDanceReact to Viewer\n* removed deck.gl dependency\n\n## For more information\nPlease visit the [SandDance website](https://microsoft.github.io/SandDance/).\n"
  },
  {
    "path": "packages/sanddance-react/package.json",
    "content": "{\n  \"name\": \"@msrvida/sanddance-react\",\n  \"version\": \"4.0.2\",\n  \"description\": \"SandDance visualization canvas React component\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/sanddance-react\"\n  },\n  \"types\": \"dist/es6/index.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"deploy\": \"node ./scripts/deploy.js\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-typescript\": \"tsc -p .\",\n    \"build-css\": \"sass ./src/css/sanddance-react.scss ./dist/css/sanddance-react.css\",\n    \"bundle\": \"rollup -c\",\n    \"build:05\": \"npm run build-typescript && node ../../scripts/version.js && npm run build-css && npm run bundle\",\n    \"watch-css\": \"sass ./src/css/sanddance-react.scss ./dist/css/sanddance-react.css --watch\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@msrvida/sanddance\": \"^4\",\n    \"just-compare\": \"^1.3.0\"\n  },\n  \"peerDependencies\": {\n    \"@types/react\": \">=16.8.0 <18.0.0\",\n    \"@types/react-dom\": \">=16.8.0 <18.0.0\",\n    \"react\": \">=16.8.0 <18.0.0\",\n    \"react-dom\": \">=16.8.0 <18.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/sanddance-react/rollup.config.mjs",
    "content": "import commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport resolve from '@rollup/plugin-node-resolve';\n\nexport default {\n    input: './dist/es6/index.js',\n    output: {\n        globals: {\n            '@msrvida/sanddance': 'SandDance',\n        },\n        file: './dist/umd/sanddance-react.js',\n        format: 'umd',\n        name: 'SandDanceReact',\n    },\n    external: [\n        '@msrvida/sanddance',\n    ],\n    plugins: [\n        json(),\n        resolve({ jsnext: true }),\n        commonjs({ sourceMap: false }),\n    ],\n};\n"
  },
  {
    "path": "packages/sanddance-react/scripts/deploy.js",
    "content": "const fs = require('fs');\n\nconst pubversion = 'v4';\n\nfs.copyFileSync('./dist/umd/sanddance-react.js', `../../docs/dist/sanddance-react/${pubversion}/sanddance-react.js`);\n"
  },
  {
    "path": "packages/sanddance-react/src/base.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Viewer } from './viewer';\nimport * as SandDance from '@msrvida/sanddance';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\n/**\n * References to dependency libraries.\n */\nexport interface Base {\n    react: typeof React;\n    reactDOM: typeof ReactDOM;\n}\n\nexport const base: Base = {\n    react: null,\n    reactDOM: null,\n};\n\n/**\n * Specify the dependency libraries to use for rendering.\n * @param react React library.\n * @param vega Vega library.\n * @param deck @deck.gl/core library.\n * @param layers @deck.gl/layers library.\n * @param luma @luma.gl/core library.\n */\nexport function use(\n    react: typeof React,\n    reactDOM: typeof ReactDOM,\n    vega: SandDance.VegaMorphCharts.types.VegaBase,\n) {\n    SandDance.VegaMorphCharts.use(vega);\n    base.react = react;\n    base.reactDOM = reactDOM;\n\n    //inform React that we are using a dynamic base class\n    Viewer.prototype = react.Component.prototype as any;\n}\n"
  },
  {
    "path": "packages/sanddance-react/src/css/sanddance-react.scss",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n@import \"../../../sanddance/dist/css/sanddance\";\n"
  },
  {
    "path": "packages/sanddance-react/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as SandDance from '@msrvida/sanddance';\nimport * as util from './util';\n\nexport { SandDance, util };\nexport { Props, Viewer } from './viewer';\nexport { use } from './base';\nexport { version } from './version';\n"
  },
  {
    "path": "packages/sanddance-react/src/util.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as compare from 'just-compare';\nimport { specs, Viewer } from '@msrvida/sanddance';\n\nexport const classList = (...args: Array<string | boolean>) => {\n    return args.filter(Boolean).join(' ');\n};\n\nexport const deepCompare = (compare.default || compare) as <T>(a: T, b: T) => boolean;\n\nfunction addNullable(insight: specs.Insight, signalValues: specs.SignalValues) {\n    const withNulls: specs.Insight = { view: null, filter: null, ...insight, signalValues };\n    return withNulls;\n}\n\nexport function compareInsight(viewer: Viewer, insight: specs.Insight) {\n    const currentInsight = viewer.getInsight();\n    const a = addNullable(currentInsight, { ...viewer.insight.signalValues, ...currentInsight.signalValues });\n    const b = addNullable(insight, { ...a.signalValues, ...insight.signalValues });\n    const compare = deepCompare(a, b);\n    return { a, b, compare };\n}\n"
  },
  {
    "path": "packages/sanddance-react/src/version.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const version: string = 'DEBUG';\n"
  },
  {
    "path": "packages/sanddance-react/src/viewer.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from './base';\nimport { compareInsight, deepCompare } from './util';\nimport { specs, types, VegaMorphCharts, Viewer as SandDanceViewer } from '@msrvida/sanddance';\n\nexport interface Props {\n    viewerOptions?: Partial<types.ViewerOptions>;\n    insight: specs.Insight;\n    setup?: types.Setup;\n    data: object[];\n    renderOptions?: types.RenderOptions;\n    onView?: (renderResult: types.RenderResult) => void;\n    onError?: (error: any) => void;\n    onMount?: (element: HTMLElement) => boolean | void;\n}\n\nexport interface State {\n}\n\nfunction _Viewer(_props: Props) {\n\n    class __Viewer extends base.react.Component<Props, State> {\n        public viewer: SandDanceViewer;\n        private viewerDiv: React.ReactInstance;\n        private lastData: object[];\n\n        private layout() {\n            const { props } = this;\n            this.lastData = props.data;\n            this.viewer.render(\n                {\n                    insight: props.insight,\n                    setup: props.setup,\n                },\n                props.data,\n                props.renderOptions,\n            ).then(renderResult => {\n                //TODO: show errors if any\n                //console.log('viewer render');\n                props.onView && props.onView(renderResult);\n            }).catch(e => {\n                //console.log('viewer error');\n                props.onError && props.onError(e);\n            });\n        }\n\n        private view() {\n            const { props } = this;\n            let didLayout = false;\n            if (props.insight && props.data) {\n                const c = compareInsight(this.viewer, props.insight);\n                const sameDataRef = props.data === this.lastData;\n                if (!c.compare || !sameDataRef) {\n                    this.layout();\n                    didLayout = true;\n                }\n            }\n            if (!didLayout && props.setup) {\n                const { camera } = props.setup;\n                //compare setup, move camera\n                if (camera !== 'hold') {\n                    if (!deepCompare(this.viewer.setup.camera, camera)) {\n                        //camera is different\n                        if (!camera) {\n                            this.viewer?.presenter?.homeCamera();\n                        } else {\n                            this.viewer.setCamera(camera);\n                        }\n                        //save this for next comparison\n                        const setup = VegaMorphCharts.util.clone(this.viewer.setup);\n                        setup.camera = camera;\n                        this.viewer.setup = setup;\n                    }\n                }\n                if (props.setup.renderer) {\n                    this.viewer?.presenter?.morphchartsref?.setMorphChartsRendererOptions(props.setup.renderer);\n                }\n            }\n        }\n\n        componentDidMount() {\n            const { props } = this;\n            const element = base.reactDOM.findDOMNode(this.viewerDiv) as HTMLElement;\n            this.viewer = new SandDanceViewer(element, props.viewerOptions);\n            if (props.onMount) {\n                if (props.onMount(this.viewer.presenter.getElement(VegaMorphCharts.PresenterElement.gl))) {\n                    this.view();\n                }\n            } else {\n                this.view();\n            }\n        }\n\n        componentDidUpdate() {\n            const { props } = this;\n            this.viewer.options = VegaMorphCharts.util.deepMerge(this.viewer.options, props.viewerOptions) as types.ViewerOptions;\n            this.view();\n        }\n\n        componentWillUnmount() {\n            this.viewer.finalize();\n        }\n\n        render() {\n            return (\n                <div className=\"sanddance-ReactViewer\" ref={div => (this.viewerDiv = div)} />\n            );\n        }\n    }\n\n    return new __Viewer(_props);\n}\n\nexport const Viewer: typeof Viewer_Class = _Viewer as any;\n\nexport declare class Viewer_Class extends base.react.Component<Props, State> {\n    public viewer: SandDanceViewer;\n}\n"
  },
  {
    "path": "packages/sanddance-react/test/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>SandDanceReact</title>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../src/css/sanddance-react.scss\">\n\n    <style>\n        .sanddance-ReactViewer {\n            height: 800px;\n        }\n    </style>\n\n</head>\n<body>\n    \n    <div id=\"app\"></div>\n\n    <script type=\"module\" src=\"index.tsx\"></script>\n\n</body>\n</html>"
  },
  {
    "path": "packages/sanddance-react/test/index.tsx",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as vega from 'vega';\nimport * as SandDanceReact from '../src/index';\n\nSandDanceReact.use(React, ReactDOM, vega);\n\ninterface Props { }\n\ninterface State {\n    data: object[];\n    index: number;\n}\n\nclass App extends React.Component<Props, State> {\n    constructor(props) {\n        super(props);\n        this.state = {\n            data: props.data,\n            index: 0,\n        };\n    }\n\n    render() {\n        const { data, index } = this.state;\n\n        return React.createElement('div', {},\n            React.createElement('button',\n                {\n                    onClick: () => {\n                        let index = this.state.index + 1;\n                        if (index >= insightSetups.length) {\n                            index = 0;\n                        }\n                        this.setState({ index });\n                    },\n                },\n                \"Next\",\n            ),\n            React.createElement(SandDanceReact.Viewer,\n                { data, ...insightSetups[index] },\n            )\n        );\n    }\n}\n\nvega.loader().load('https://microsoft.github.io/SandDance/sample-data/titanicmaster.tsv').then(tsv_data => {\n    const data = vega.read(tsv_data, { type: 'tsv', parse: 'auto' });\n    const app = React.createElement(App, { data });\n    ReactDOM.render(app, document.getElementById('app'));\n});\n\nvar insightSetups: SandDanceReact.SandDance.types.InsightSetup[] = [\n    {\n        insight: {\n            columns: {\n                x: \"Gender\",\n                y: \"Joined\",\n                color: \"Survived\",\n                z: \"TicketCost\",\n                sort: \"Survived\"\n            },\n            scheme: \"dual_redgreen\",\n            chart: \"barchartV\",\n            view: \"2d\",\n            size: {\n                height: 800,\n                width: 800\n            }\n        },\n        setup: {\n            camera: {\n                position: [0, 0, 0],\n                rotation: [0, 0, 0, 1],\n                captureSize: {\n                    height: 100,\n                    width: 100,\n                }\n            },\n            transition: {\n                type: \"ordinal\"\n            },\n            transitionDurations: {\n                position: 600,\n                stagger: 600,\n                view: 600\n            },\n            renderer: {\n                advanced: false,\n                advancedOptions: {\n                    bloomIntensity: 2,\n                    isBloomEnabled: false,\n                    isDofEnabled: false,\n                    dofFocusRange: 0.25,\n                    isFxaaEnabled: false,\n                    isShadowEnabled: true,\n                    isSsaoEnabled: true\n                },\n                basicOptions: {\n                    antialias: true\n                }\n            }\n        }\n    },\n    {\n        insight: {\n            columns: {\n                x: \"Survived\",\n                y: \"Joined\",\n                color: \"TicketCost\",\n                z: \"TicketCost\",\n                sort: \"Survived\"\n            },\n            scheme: \"redyellowgreen\",\n            chart: \"barchartH\",\n            view: \"2d\",\n            size: {\n                height: 800,\n                width: 800\n            }\n        },\n        setup: {\n            camera: {\n                position: [\n                    0,\n                    0,\n                    0\n                ],\n                rotation: [\n                    0.13633213577362982,\n                    -0.37130944289829027,\n                    -0.055216251568944684,\n                    0.9167846049823424\n                ],\n                captureSize: {\n                    height: 947,\n                    width: 1496\n                }\n            },\n            renderer: {\n                advanced: false,\n                advancedOptions: {\n                    bloomIntensity: 2,\n                    isBloomEnabled: false,\n                    isDofEnabled: false,\n                    dofFocusRange: 0.25,\n                    isFxaaEnabled: false,\n                    isShadowEnabled: true,\n                    isSsaoEnabled: true\n                },\n                basicOptions: {\n                    antialias: true\n                }\n            },\n            transition: {\n                type: \"position\",\n                dimension: \"x\",\n            },\n            transitionDurations: {\n                position: 702,\n                stagger: 1998.0000000000002,\n                view: 600\n            }\n        }\n    },\n    {\n        insight: {\n            columns: {\n                x: \"Survived\",\n                y: \"Joined\",\n                color: \"TicketCost\",\n                z: \"TicketCost\",\n                sort: \"Survived\"\n            },\n            scheme: \"redyellowgreen\",\n            chart: \"barchartH\",\n            view: \"2d\",\n            size: {\n                height: 800,\n                width: 800\n            }\n        },\n        setup: {\n            camera: undefined,\n            renderer: {\n                advanced: true,\n                advancedOptions: {\n                    bloomIntensity: 2,\n                    isBloomEnabled: false,\n                    isDofEnabled: false,\n                    dofFocusRange: 0.25,\n                    isFxaaEnabled: false,\n                    isShadowEnabled: true,\n                    isSsaoEnabled: true\n                },\n                basicOptions: {\n                    antialias: true\n                }\n            },\n            transition: {\n                type: \"position\",\n                dimension: \"x\",\n            },\n            transitionDurations: {\n                position: 702,\n                stagger: 1998.0000000000002,\n                view: 600\n            }\n        }\n    }\n];"
  },
  {
    "path": "packages/sanddance-react/test/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"base.react.createElement\",\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"index.tsx\"\n    ]\n}\n"
  },
  {
    "path": "packages/sanddance-react/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"base.react.createElement\",\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}\n"
  },
  {
    "path": "packages/sanddance-specs/.gitignore",
    "content": "dist\n"
  },
  {
    "path": "packages/sanddance-specs/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/sanddance-specs/README.md",
    "content": "# @msrvida/sanddance-specs\n\n[Vega specifications](https://vega.github.io/vega/docs/specification/) for unit visualizations.\n\n![image](https://user-images.githubusercontent.com/11507384/82498036-238d5380-9aa4-11ea-85b0-8fcb31522461.png)\n\n[Demo](https://microsoft.github.io/SandDance/tests/sanddance-specs/v2/)\n\n## Usage\n\nYou will need an array of data objects, so that columns types can be inferred.\n\n```js\n    import { inferTypes } from 'vega';\n\n    const data = [\n        //your data objects\n    ];\n\n    const insight = {\n        \"colorBin\": \"quantize\",\n        \"columns\": {\n            \"x\": \"Gender\",\n            \"color\": \"Survived\",\n            \"sort\": \"Survived\",\n            \"facet\": \"Age\"\n        },\n        \"scheme\": \"set1\",   //see https://vega.github.io/vega/docs/schemes/#reference\n        \"facetStyle\": \"wrap\",\n        \"size\": {\n            \"height\": 600,\n            \"width\": 800\n        },\n        \"chart\": \"barchartV\"\n    };\n\n    const columns = getColumnsFromData(inferTypes, data);\n    const specColumns = getSpecColumns(insight, columns);\n    const specViewOptions = {\n        colors: {\n            defaultCube: \"steelblue\",\n            axisLine: \"#000\",\n            axisText: \"#000\"\n        },\n        language: {\n            count: \"Count\"\n        },\n        maxLegends: 20,\n        tickSize: 10\n    };\n    const context = { specColumns, insight, specViewOptions };\n    const specResult = build(context, data);\n\n    if (specResult.errors) {\n        console.log(specResult.errors);\n    } else {\n        console.log(specResult.vegaSpec);\n    }\n```\n\n## Versions\n\n### 1.5.0 Changes\n\n* Added background image\n\n### 1.4.0 Changes\n\n* Show z-axis scale\n\n### 1.3.0 Changes\n\n* Fix for last bin of quantitative band scale\n\n## For more information\nPlease visit the [SandDance website](https://microsoft.github.io/SandDance/).\n"
  },
  {
    "path": "packages/sanddance-specs/package.json",
    "content": "{\n  \"name\": \"@msrvida/sanddance-specs\",\n  \"type\": \"module\",\n  \"version\": \"2.0.0\",\n  \"description\": \"SandDance Vega specification generator.\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/sanddance-specs\"\n  },\n  \"types\": \"dist/es6/index.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-typescript\": \"tsc -p .\",\n    \"build:03\": \"npm run build-typescript && npm run bundle\",\n    \"bundle\": \"rollup -c\",\n    \"deploy\": \"tsc -p ./uitest/ && node ./scripts/deploy.js\",\n    \"uitest-watch\": \"tsc -p ./uitest/ -w\",\n    \"deploy-watch\": \"npm-run-all --parallel bundle-watch uitest-watch\",\n    \"test2\": \"node -r esm ./test/perf.js\",\n    \"remove-vega\": \"npm un vega-typings\",\n    \"patch-after-vega-upgrade\": \"npm version patch\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@msrvida/chart-types\": \"^1\",\n    \"@msrvida/data-inference\": \"^2\",\n    \"@msrvida/search-expression\": \"^1\",\n    \"vega-typings\": \"~2.1.0\"\n  }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/rollup.config.mjs",
    "content": "import commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport resolve from '@rollup/plugin-node-resolve';\n\nexport default {\n    input: './dist/es6/index.js',\n    output: {\n        file: './dist/umd/sanddance-specs.js',\n        format: 'umd',\n        name: 'SandDanceSpecs',\n    },\n    plugins: [\n        json(),\n        resolve({ jsnext: true }),\n        commonjs({ sourceMap: false }),\n    ],\n};\n"
  },
  {
    "path": "packages/sanddance-specs/scripts/deploy.js",
    "content": "import fs from 'fs';\nfs.copyFileSync('./dist/umd/sanddance-specs.js', '../../docs/tests/sanddance-specs/v2/js/sanddance-specs.js');\n"
  },
  {
    "path": "packages/sanddance-specs/src/axes.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SignalNames } from './constants.js';\nimport { axesLabelLimit, axesTitleLimit } from './defaults.js';\nimport { GlobalScope } from './globalScope.js';\nimport { AxisScale, AxisScales, GlobalScales } from './interfaces.js';\nimport { addAxes, addScales } from './scope.js';\nimport { SpecColumns, SpecViewOptions } from './types.js';\nimport { Column, View } from '@msrvida/chart-types';\nimport {\n    Axis,\n    NewSignal,\n    Scale,\n    Scope,\n    TextBaselineValue,\n} from 'vega-typings';\n\nexport interface AxesScope {\n    scope: Scope;\n    scale?: Scale;\n    title: boolean;\n    labels: boolean;\n    lines: boolean;\n}\n\nexport interface AxesScopeMap {\n    [key: string]: AxesScope[];\n}\n\ninterface Props {\n    globalScope: GlobalScope;\n    allGlobalScales: GlobalScales[];\n    axisScales: AxisScales;\n    plotOffsetSignals: { x: NewSignal, y: NewSignal };\n    axesOffsets: { x: number, y: number };\n    axesTitlePadding: { x: number, y: number };\n    labelBaseline: { x: TextBaselineValue, y: TextBaselineValue };\n    specColumns: SpecColumns;\n    specViewOptions: SpecViewOptions;\n    axesScopes: AxesScopeMap;\n    hideZAxis: boolean;\n    view: View;\n}\n\nexport function addGlobalAxes(props: Props) {\n    const { axesOffsets, axisScales, axesScopes, axesTitlePadding, allGlobalScales, globalScope, labelBaseline, plotOffsetSignals, specColumns, specViewOptions } = props;\n    const { scope } = globalScope;\n\n    allGlobalScales.forEach(globalScales => {\n        const { scales } = globalScales;\n        for (const xyz in scales) {\n            const _scales: Scale[] = scales[xyz];\n            if (_scales) {\n                addScales(scope, ..._scales);\n                let { showAxes } = globalScales;\n                let zindex: number = undefined;\n                if (xyz === 'z') {\n                    showAxes = false;\n                    if (props.view === '3d' && specViewOptions.zAxisOptions && !props.hideZAxis) {\n                        if (specViewOptions.zAxisOptions.showZAxis) {\n                            showAxes = true;\n                            zindex = specViewOptions.zAxisOptions.zIndex;\n                        }\n                    }\n                }\n                if (showAxes && axisScales) {\n                    const axisScale: AxisScale = axisScales[xyz];\n                    if (axisScale) {\n                        const lineColor = specViewOptions.colors.axisLine;\n                        const horizontal = xyz === 'x';\n                        const column: Column = specColumns[xyz] || { quantitative: true };\n                        const title = axisScale.title;\n                        const props: AxisProps = {\n                            title,\n                            horizontal,\n                            column,\n                            specViewOptions,\n                            lineColor,\n                            titlePadding: axesTitlePadding[xyz],\n                            labelBaseline: labelBaseline[xyz],\n                            zindex,\n                        };\n                        axesScopes['main'].forEach(a => addAxes(a.scope, createAxis({\n                            ...props,\n                            scale: a.scale || _scales[0],\n                            showTitle: a.title,\n                            showLabels: a.labels,\n                            showLines: a.lines,\n                        })));\n\n                        if (axesScopes[xyz]) {\n                            axesScopes[xyz].forEach(a => addAxes(a.scope, createAxis({\n                                ...props,\n                                scale: a.scale || _scales[0],\n                                showTitle: a.title,\n                                showLabels: a.labels,\n                                showLines: a.lines,\n                            })));\n                        }\n\n                        if (plotOffsetSignals[xyz] && axesOffsets[xyz]) {\n                            const plotOffsetSignal = plotOffsetSignals[xyz] as NewSignal;\n                            plotOffsetSignal.update = `${axesOffsets[xyz]}`;\n                        }\n                    }\n                }\n            }\n        }\n    });\n}\n\ninterface AxisProps {\n    scale?: Scale;\n    title: string;\n    horizontal: boolean;\n    column: Column;\n    specViewOptions: SpecViewOptions;\n    lineColor: string;\n    showLines?: boolean;\n    showTitle?: boolean;\n    showLabels?: boolean;\n    titlePadding: number;\n    labelBaseline: TextBaselineValue;\n    zindex: number;\n}\n\nfunction createAxis(props: AxisProps) {\n    const { column, horizontal, labelBaseline, lineColor, scale, showLabels, showTitle, showLines, specViewOptions, title, titlePadding, zindex } = props;\n    const axis: Axis = {\n        zindex,\n        scale: scale.name,\n        orient: horizontal ? 'bottom' : 'left',\n        domain: showLines,\n        ticks: showLines,\n        ...showLines && {\n            domainColor: lineColor,\n            tickColor: lineColor,\n            tickSize: specViewOptions.tickSize,\n        },\n        ...showTitle && {\n            title,\n            titleAlign: horizontal ? 'left' : 'right',\n            titleAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY,\n            },\n            titleColor: specViewOptions.colors.axisText,\n            titleFontSize: {\n                signal: SignalNames.TextTitleSize,\n            },\n            titleLimit: axesTitleLimit,\n            titlePadding,\n        },\n        labels: showLabels,\n        ...showLabels && {\n            labelAlign: horizontal ? 'left' : 'right',\n            labelBaseline,\n            labelAngle: {\n                signal: horizontal ? SignalNames.TextAngleX : SignalNames.TextAngleY,\n            },\n            labelColor: specViewOptions.colors.axisText,\n            labelFontSize: {\n                signal: SignalNames.TextSize,\n            },\n            labelLimit: axesLabelLimit,\n        },\n    };\n    if (column.quantitative) {\n        axis.format = '~r';\n    }\n    return axis;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/bin.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { FieldNames } from './constants.js';\nimport { exprSafeFieldName, safeFieldName } from './expr.js';\nimport { DiscreteColumn } from './interfaces.js';\nimport {\n    BinTransform,\n    Data,\n    Signal,\n    Transforms,\n} from 'vega-typings';\nimport { debounce } from './defaults.js';\nimport { dataExtent } from './transforms.js';\nimport { Column } from '@msrvida/chart-types';\n\nexport interface BaseBinnable {\n    fields: string[];\n    domainDataName: string;\n    fullScaleDataname: string;\n    discreteColumn: DiscreteColumn;\n}\n\nexport interface NativeBinnable extends BaseBinnable {\n    native: true;\n}\n\nexport interface AugmentBinnable extends BaseBinnable {\n    native: false;\n    transforms: Transforms[];\n    binSignal: string;\n    extentSignal: string;\n    signals: Signal[];\n    dataSequence: Data;\n}\n\nexport type Binnable = NativeBinnable | AugmentBinnable;\n\nexport function binnable(prefix: string, domainDataName: string, discreteColumn: DiscreteColumn, outerSignalExtents?: { min: number, max: number }): Binnable {\n    const { column, defaultBins, maxbins, maxbinsSignalDisplayName, maxbinsSignalName } = discreteColumn;\n    if (column.quantitative) {\n        const field = `${prefix}_bin_${exprSafeFieldName(column.name)}`;\n        const fieldEnd = `${field}_end`;\n        const binSignal = `${field}_bins`;\n        const dataExtentSignal = `${field}_bin_extent`;\n        const dataExtentSpanSignal = `${field}_bin_extent_span`;\n        const outerSignal = `${field}_outer_extent`;\n        domainDataName = `${field}_sequence`;   //override the data name\n        const extentTransform = dataExtent(column, dataExtentSignal);\n        let imageSignal: Signal;\n        if (outerSignalExtents) {\n            imageSignal = outerExtentSignal(outerSignal, outerSignalExtents.min, outerSignalExtents.max, dataExtentSignal);\n        }\n        const maxbinsSignal: Signal = {\n            name: maxbinsSignalName,\n            value: defaultBins,\n            bind: {\n                name: maxbinsSignalDisplayName,\n                debounce,\n                input: 'range',\n                min: 1,\n                max: maxbins,\n                step: 1,\n            },\n        };\n        const extentSignal = imageSignal?.name || dataExtentSignal;\n        const binTransform: BinTransform = {\n            type: 'bin',\n            field: safeFieldName(column.name),\n            as: [\n                field,\n                fieldEnd,\n            ],\n            signal: binSignal,\n            extent: {\n                signal: `[${extentSignal}[0], ${extentSignal}[1] + 1e-11]`, //add a tiny bit to the upper extent to force the extra bin - https://github.com/vega/vega/issues/2899\n            },\n            minstep: shouldBeIntegralBinStep(column) ? 1 : 0,\n            maxbins: {\n                signal: maxbinsSignalName,\n            },\n        };\n        const dataSequence: Data = {\n            name: domainDataName,\n            transform: [\n                {\n                    type: 'sequence',\n                    start: {\n                        signal: `${binSignal}.start`,\n                    },\n                    stop: {\n                        signal: `${binSignal}.stop`,\n                    },\n                    step: {\n                        signal: `${binSignal}.step`,\n                    },\n                },\n                {\n                    type: 'formula',\n                    expr: 'datum.data',\n                    as: field,\n                },\n                {\n                    type: 'formula',\n                    expr: `datum.data + ${binSignal}.step`,\n                    as: fieldEnd,\n                },\n                {\n                    type: 'window',\n                    ops: ['row_number'],\n                    as: [FieldNames.Ordinal],\n                },\n                {\n                    type: 'formula',\n                    expr: `datum.data === ${binSignal}.start`,\n                    as: FieldNames.First,\n                },\n                {\n                    type: 'formula',\n                    expr: `datum.data === ${binSignal}.stop - ${binSignal}.step`,\n                    as: FieldNames.Last,\n                },\n                {\n                    // when there is only one bin, use only first sequence element\n                    type: 'filter',\n                    expr: `${dataExtentSpanSignal} === 0 ? datum[${JSON.stringify(FieldNames.First)}] : true`,\n                },\n            ],\n        };\n        const signals: Signal[] = [\n            maxbinsSignal,\n            {\n                name: dataExtentSpanSignal,\n                update: `${extentSignal}[1] - ${extentSignal}[0]`,\n            },\n        ];\n        if (imageSignal) {\n            signals.push(imageSignal);\n        }\n        const augmentBinnable: AugmentBinnable = {\n            discreteColumn,\n            native: false,\n            transforms: [extentTransform, binTransform],\n            fields: [field, fieldEnd],\n            binSignal,\n            extentSignal,\n            dataSequence,\n            domainDataName,\n            signals,\n            fullScaleDataname: dataSequence.name,\n        };\n        return augmentBinnable;\n    } else {\n        const nativeBinnable: NativeBinnable = {\n            discreteColumn,\n            native: true,\n            fields: [column.name],\n            domainDataName,\n            fullScaleDataname: domainDataName,\n        };\n        return nativeBinnable;\n    }\n}\n\nexport function outerExtentSignal(name: string, min: number, max: number, dataExtent: string): Signal {\n    return {\n        name,\n        update: `[min(${min}, ${dataExtent}[0]), max(${max}, ${dataExtent}[1])]`,\n    };\n}\n\nexport function shouldBeIntegralBinStep(column: Column) {\n    //prevent Vega from showing \".5\" steps between integer scale values\n    return column.quantitative && (column.type === 'integer' && (column.stats.max - column.stats.min) <= 7);\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/build.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { getSpecBuilderPropsForChart } from './charts/index.js';\nimport { inferAll } from './inference.js';\nimport { SpecContext } from './types.js';\nimport { SpecResult } from './interfaces.js';\nimport { ValuesData } from 'vega-typings';\nimport { SpecBuilder } from './specBuilder.js';\n\nexport function build(specContext: SpecContext, currData: object[]): SpecResult {\n    const { specColumns } = specContext;\n    const columns = [\n        specColumns.color,\n        specColumns.facet,\n        specColumns.facetV,\n        specColumns.group,\n        specColumns.size,\n        specColumns.sort,\n        specColumns.x,\n        specColumns.y,\n        specColumns.z,\n    ];\n    inferAll(columns, currData);\n\n    const specBuilderProps = getSpecBuilderPropsForChart(specContext);\n    const specBuilder = new SpecBuilder(specBuilderProps, specContext);\n    let specResult: SpecResult;\n\n    if (specBuilder) {\n        try {\n            const errors = specBuilder.validate();\n            if (errors.length) {\n                specResult = {\n                    errors,\n                    specCapabilities: specBuilderProps.specCapabilities,\n                    vegaSpec: null,\n                };\n            } else {\n                specResult = specBuilder.build();\n            }\n        }\n        catch (e) {\n            specResult = {\n                specCapabilities: null,\n                vegaSpec: null,\n                errors: [e.stack],\n            };\n        }\n        if (!specResult.errors) {\n            const data0 = specResult.vegaSpec.data[0] as ValuesData;\n            data0.values = currData;\n        }\n    } else {\n        specResult = {\n            specCapabilities: null,\n            vegaSpec: null,\n            errors: [`could not build spec for ${specContext.insight.chart}`],\n        };\n    }\n    return specResult;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/barchartH.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SignalNames } from '../constants.js';\nimport { defaultBins, maxbins, minBarBandWidth } from '../defaults.js';\nimport { AxisScale, AxisScales } from '../interfaces.js';\nimport { AggregateContainerProps } from '../layouts/aggregateContainer.js';\nimport { BandProps } from '../layouts/band.js';\nimport { LayoutPair } from '../layouts/layout.js';\nimport { SquareProps } from '../layouts/square.js';\nimport { StripProps } from '../layouts/strip.js';\nimport { TreemapProps } from '../layouts/treemap.js';\nimport { allowNoneForSize } from '../size.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\n\nexport default function (specContext: SpecContext): SpecBuilderProps {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { language } = specViewOptions;\n    const showAxes = !insight.hideAxes;\n    const bandProps: BandProps = {\n        orientation: 'horizontal',\n        groupby: {\n            column: specColumns.y,\n            defaultBins,\n            maxbinsSignalName: SignalNames.YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins,\n        },\n        minBandWidth: minBarBandWidth,\n        showAxes,\n    };\n    const x: AxisScale = { title: null };\n    const axisScales: AxisScales = {\n        x,\n        y: { title: specColumns.y?.name },\n        z: { title: specColumns.z?.name },\n    };\n    const layouts: LayoutPair[] = [{\n        layoutType: 'Band',\n        props: bandProps,\n    }];\n    const { totalStyle, view } = insight;\n    if (totalStyle === 'sum-strip-percent') {\n        x.aggregate = 'percent';\n        x.title = language.percent;\n        const stripProps: StripProps = {\n            addPercentageScale: true,\n            sortOrder: 'ascending',\n            orientation: 'horizontal',\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view,\n        };\n        layouts.push({\n            layoutType: 'Strip',\n            props: stripProps,\n        });\n    } else {\n        const aggProps: AggregateContainerProps = {\n            niceScale: true,\n            dock: 'left',\n            globalAggregateMaxExtentSignal: 'aggMaxExtent',\n            globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n            sumBy: specColumns.size,\n            showAxes,\n        };\n        layouts.push({\n            layoutType: 'AggregateContainer',\n            props: aggProps,\n        });\n        switch (totalStyle) {\n            case 'sum-treemap': {\n                x.aggregate = 'sum';\n                x.title = language.sum;\n                const treemapProps: TreemapProps = {\n                    corner: 'top-left',\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Treemap',\n                    props: treemapProps,\n                });\n                break;\n            }\n            case 'sum-strip': {\n                x.aggregate = 'sum';\n                x.title = language.sum;\n                const stripProps: StripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'horizontal',\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            case 'count-strip': {\n                x.aggregate = 'count';\n                x.title = language.count;\n                const stripProps: StripProps = {\n                    sortOrder: 'ascending',\n                    orientation: 'horizontal',\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            default: {\n                x.aggregate = 'count';\n                x.title = language.count;\n                const squareProps: SquareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: 'down-right',\n                    z: specColumns.z,\n                    maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                    maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Square',\n                    props: squareProps,\n                });\n                break;\n            }\n        }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y?.quantitative ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [SignalNames.YBins],\n                },\n                {\n                    role: 'z',\n                    axisSelection: specColumns.z?.quantitative ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d',\n                },\n                {\n                    role: 'color',\n                    allowNone: true,\n                },\n                {\n                    role: 'sort',\n                    allowNone: true,\n                },\n                {\n                    role: 'size',\n                    allowNone: allowNoneForSize,\n                    excludeCategoric: true,\n                    signals: [SignalNames.TreeMapMethod],\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [SignalNames.FacetBins],\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [SignalNames.FacetVBins],\n                },\n            ],\n        },\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/barchartV.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SignalNames } from '../constants.js';\nimport { defaultBins, maxbins, minBarBandWidth } from '../defaults.js';\nimport { AxisScale, AxisScales } from '../interfaces.js';\nimport { AggregateContainerProps } from '../layouts/aggregateContainer.js';\nimport { BandProps } from '../layouts/band.js';\nimport { LayoutPair } from '../layouts/layout.js';\nimport { SquareProps } from '../layouts/square.js';\nimport { StripProps } from '../layouts/strip.js';\nimport { TreemapProps } from '../layouts/treemap.js';\nimport { allowNoneForSize } from '../size.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\n\nexport default function (specContext: SpecContext): SpecBuilderProps {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { language } = specViewOptions;\n    const showAxes = !insight.hideAxes;\n    const bandProps: BandProps = {\n        orientation: 'vertical',\n        groupby: {\n            column: specColumns.x,\n            defaultBins,\n            maxbinsSignalName: SignalNames.XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins,\n        },\n        minBandWidth: minBarBandWidth,\n        showAxes,\n    };\n    const y: AxisScale = { title: null };\n    const axisScales: AxisScales = {\n        x: { title: specColumns.x && specColumns.x.name },\n        y,\n        z: { title: specColumns.z && specColumns.z.name },\n    };\n    const layouts: LayoutPair[] = [{\n        layoutType: 'Band',\n        props: bandProps,\n    }];\n    const { totalStyle, view } = insight;\n    if (totalStyle === 'sum-strip-percent') {\n        y.aggregate = 'percent';\n        y.title = language.percent;\n        const stripProps: StripProps = {\n            addPercentageScale: true,\n            sortOrder: 'descending',\n            orientation: 'vertical',\n            size: specColumns.size,\n            sort: specColumns.sort,\n            z: specColumns.z,\n            showAxes,\n            view,\n        };\n        layouts.push({\n            layoutType: 'Strip',\n            props: stripProps,\n        });\n    } else {\n        const aggProps: AggregateContainerProps = {\n            niceScale: true,\n            dock: 'bottom',\n            globalAggregateMaxExtentSignal: 'aggMaxExtent',\n            globalAggregateMaxExtentScaledSignal: 'aggMaxExtentScaled',\n            sumBy: specColumns.size,\n            showAxes,\n        };\n        layouts.push({\n            layoutType: 'AggregateContainer',\n            props: aggProps,\n        });\n        switch (totalStyle) {\n            case 'sum-treemap': {\n                y.aggregate = 'sum';\n                y.title = language.sum;\n                const treemapProps: TreemapProps = {\n                    corner: 'bottom-left',\n                    size: specColumns.size,\n                    treeMapMethod: specViewOptions.language.treeMapMethod,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Treemap',\n                    props: treemapProps,\n                });\n                break;\n            }\n            case 'sum-strip': {\n                y.aggregate = 'sum';\n                y.title = language.sum;\n                const stripProps: StripProps = {\n                    sortOrder: 'descending',\n                    orientation: 'vertical',\n                    size: specColumns.size,\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            case 'count-strip': {\n                y.aggregate = 'count';\n                y.title = language.count;\n                const stripProps: StripProps = {\n                    sortOrder: 'descending',\n                    orientation: 'vertical',\n                    sort: specColumns.sort,\n                    z: specColumns.z,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Strip',\n                    props: stripProps,\n                });\n                break;\n            }\n            default: {\n                y.aggregate = 'count';\n                y.title = language.count;\n                const squareProps: SquareProps = {\n                    sortBy: specColumns.sort,\n                    fillDirection: 'right-up',\n                    z: specColumns.z,\n                    maxGroupedUnits: aggProps.globalAggregateMaxExtentSignal,\n                    maxGroupedFillSize: aggProps.globalAggregateMaxExtentScaledSignal,\n                    showAxes,\n                    view,\n                };\n                layouts.push({\n                    layoutType: 'Square',\n                    props: squareProps,\n                });\n                break;\n            }\n        }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: true,\n            percentage: true,\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x?.quantitative ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [SignalNames.XBins],\n                },\n                {\n                    role: 'z',\n                    axisSelection: specColumns.z?.quantitative ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d',\n                },\n                {\n                    role: 'color',\n                    allowNone: true,\n                },\n                {\n                    role: 'sort',\n                    allowNone: true,\n                },\n                {\n                    role: 'size',\n                    allowNone: allowNoneForSize,\n                    excludeCategoric: true,\n                    signals: [SignalNames.TreeMapMethod],\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [SignalNames.FacetBins],\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [SignalNames.FacetVBins],\n                },\n            ],\n        },\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/density.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SignalNames } from '../constants.js';\nimport { defaultBins, maxbins, minBarBandWidth } from '../defaults.js';\nimport { AxisScales } from '../interfaces.js';\nimport { AggregateSquareProps } from '../layouts/aggregateSquare.js';\nimport { BandProps } from '../layouts/band.js';\nimport { LayoutPair } from '../layouts/layout.js';\nimport { SquareProps } from '../layouts/square.js';\nimport { StripProps } from '../layouts/strip.js';\nimport { TreemapProps } from '../layouts/treemap.js';\nimport { allowNoneForSize } from '../size.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\n\nexport default function (specContext: SpecContext): SpecBuilderProps {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const axisScales: AxisScales = {\n        x: { title: specColumns.x?.name },\n        y: { title: specColumns.y?.name },\n        z: { title: specColumns.z?.name },\n    };\n    const backgroundImage =  specColumns.x?.quantitative && specColumns.y?.quantitative && insight.backgroundImage?.extents && insight.backgroundImage;\n    const showAxes = !(backgroundImage || insight.hideAxes);\n    const hBandProps: BandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: 'horizontal',\n        groupby: {\n            column: specColumns.y,\n            defaultBins,\n            maxbinsSignalName: SignalNames.YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins,\n        },\n        minBandWidth: minBarBandWidth,\n        showAxes,\n        outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom },\n    };\n    const vBandProps: BandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: 'vertical',\n        groupby: {\n            column: specColumns.x,\n            defaultBins,\n            maxbinsSignalName: SignalNames.XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins,\n        },\n        minBandWidth: minBarBandWidth,\n        showAxes,\n        outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left },\n    };\n    const aggProps: AggregateSquareProps = {\n        onBuild: null,\n        aggregation: null,\n        sumBy: specColumns.size,\n    };\n    const layouts: LayoutPair[] = [\n        {\n            layoutType: 'Band',\n            props: vBandProps,\n        },\n        {\n            layoutType: 'Band',\n            props: hBandProps,\n        },\n        {\n            layoutType: 'AggregateSquare',\n            props: aggProps,\n        },\n    ];\n    const { totalStyle, view } = insight;\n    switch (totalStyle) {\n        case 'sum-treemap': {\n            aggProps.aggregation = 'sum';\n            const treemapProps: TreemapProps = {\n                corner: 'bottom-left',\n                size: specColumns.size,\n                treeMapMethod: specViewOptions.language.treeMapMethod,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Treemap',\n                props: treemapProps,\n            });\n            break;\n        }\n        case 'sum-strip': {\n            aggProps.aggregation = 'sum';\n            const stripProps: StripProps = {\n                sortOrder: 'ascending',\n                orientation: 'vertical',\n                size: specColumns.size,\n                sort: specColumns.sort,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps,\n            });\n            break;\n        }\n        case 'count-strip': {\n            aggProps.aggregation = 'count';\n            const stripProps: StripProps = {\n                sortOrder: 'ascending',\n                orientation: 'vertical',\n                sort: specColumns.sort,\n                z: specColumns.z,\n                showAxes,\n                view,\n            };\n            layouts.push({\n                layoutType: 'Strip',\n                props: stripProps,\n            });\n            break;\n        }\n        default: {\n            aggProps.aggregation = 'count';\n            const squareProps: SquareProps = {\n                sortBy: specColumns.sort,\n                fillDirection: 'right-down',\n                z: specColumns.z,\n                maxGroupedUnits: null,\n                maxGroupedFillSize: null,\n                showAxes,\n                view,\n            };\n            aggProps.onBuild = (aggMaxExtent, aggMaxExtentScaled) => {\n                squareProps.maxGroupedUnits = aggMaxExtent;\n                squareProps.maxGroupedFillSize = aggMaxExtentScaled;\n            };\n            layouts.push({\n                layoutType: 'Square',\n                props: squareProps,\n            });\n            break;\n        }\n    }\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: true,\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x?.quantitative ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [SignalNames.XBins],\n                },\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y?.quantitative ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [SignalNames.YBins],\n                },\n                {\n                    role: 'z',\n                    axisSelection: specColumns.z?.quantitative ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d',\n                },\n                {\n                    role: 'color',\n                    allowNone: true,\n                },\n                {\n                    role: 'sort',\n                    allowNone: true,\n                },\n                {\n                    role: 'size',\n                    allowNone: allowNoneForSize,\n                    excludeCategoric: true,\n                    signals: [SignalNames.TreeMapMethod],\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [SignalNames.FacetBins],\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [SignalNames.FacetVBins],\n                },\n            ],\n        },\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/grid.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { AxisScales } from '../interfaces.js';\nimport { SignalNames } from '../constants.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\nimport { SquareProps } from '../layouts/square.js';\n\nexport default function (specContext: SpecContext): SpecBuilderProps {\n    const { insight, specColumns } = specContext;\n    const { view } = insight;\n    const squareProps: SquareProps = {\n        sortBy: specColumns.sort,\n        fillDirection: 'right-down',\n        z: specColumns.z,\n        collapseYHeight: true,\n        showAxes: !insight.hideAxes,\n        view,\n    };\n    const axisScales: AxisScales = {\n        z: { title: specColumns.z && specColumns.z.name },\n    };\n    return {\n        axisScales,\n        layouts: [\n            {\n                layoutType: 'Square',\n                props: squareProps,\n            },\n        ],\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'z',\n                    axisSelection: specColumns.z?.quantitative ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d',\n                },\n                {\n                    role: 'color',\n                    allowNone: true,\n                },\n                {\n                    role: 'sort',\n                    allowNone: true,\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [SignalNames.FacetBins],\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [SignalNames.FacetVBins],\n                },\n            ],\n        },\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport barchartH from './barchartH.js';\nimport barchartV from './barchartV.js';\nimport density from './density.js';\nimport grid from './grid.js';\nimport scatterplot from './scatterplot.js';\nimport stacks from './stacks.js';\nimport strips from './strips.js';\nimport treemap from './treemap.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\nimport { getFacetLayout } from '../facetLayout.js';\nimport { DiscreteColumn } from '../interfaces.js';\nimport { SignalNames } from '../constants.js';\nimport { defaultBins, maxbins } from '../defaults.js';\n\nconst map: { [chart: string]: (specContext: SpecContext) => SpecBuilderProps } = {\n    barchart: barchartV,\n    barchartH,\n    barchartV,\n    density,\n    grid,\n    scatterplot,\n    stacks,\n    strips,\n    treemap,\n};\n\nexport function getSpecBuilderPropsForChart(specContext: SpecContext) {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const fn = map[insight.chart];\n    if (fn) {\n        const props = fn(specContext);\n        if (insight.columns.facet) {\n            const discreteFacetColumn: DiscreteColumn = {\n                column: specColumns.facet,\n                defaultBins,\n                maxbins,\n                maxbinsSignalDisplayName: specViewOptions.language.FacetMaxBins,\n                maxbinsSignalName: SignalNames.FacetBins,\n            };\n            const discreteFacetVColumn: DiscreteColumn = {\n                column: specColumns.facetV,\n                defaultBins,\n                maxbins,\n                maxbinsSignalDisplayName: specViewOptions.language.FacetVMaxBins,\n                maxbinsSignalName: SignalNames.FacetVBins,\n            };\n            const { facetLayout, layoutPair } = getFacetLayout(insight.facetStyle, discreteFacetColumn, discreteFacetVColumn, specViewOptions.colors.axisText);\n            props.layouts.unshift(layoutPair);\n            props.facetLayout = facetLayout;\n            props.collapseFacetAxes = specViewOptions.collapseFacetAxes;\n        }\n        return props;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/scatterplot.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { AxisScales } from '../interfaces.js';\nimport { ScatterProps } from '../layouts/scatter.js';\nimport { SignalNames } from '../constants.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\n\nexport default function (specContext: SpecContext): SpecBuilderProps {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const backgroundImageExtents =  specColumns.x?.quantitative && specColumns.y?.quantitative && insight.backgroundImage?.extents;\n    const scatterProps: ScatterProps = {\n        x: specColumns.x,\n        y: specColumns.y,\n        z: specColumns.z,\n        size: specColumns.size,\n        scatterPointScaleDisplay: specViewOptions.language.scatterPointScale,\n        zGrounded: specViewOptions.language.zGrounded,\n        backgroundImageExtents,\n        showAxes: !(backgroundImageExtents || insight.hideAxes),\n        view: insight.view,\n    };\n    const axisScales: AxisScales = {\n        x: { title: specColumns.x?.name },\n        y: { title: specColumns.y?.name },\n        z: { title: specColumns.z?.name },\n    };\n    return {\n        axisScales,\n        layouts: [\n            {\n                layoutType: 'Scatter',\n                props: scatterProps,\n            },\n        ],\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'x',\n                    axisSelection: specColumns.x?.quantitative ? 'range' : 'exact',\n                },\n                {\n                    role: 'y',\n                    axisSelection: specColumns.y?.quantitative ? 'range' : 'exact',\n                },\n                {\n                    role: 'z',\n                    axisSelection: specColumns.z?.quantitative ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: false,\n                },\n                {\n                    role: 'color',\n                    allowNone: true,\n                },\n                {\n                    role: 'size',\n                    excludeCategoric: true,\n                    allowNone: true,\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [SignalNames.FacetBins],\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [SignalNames.FacetVBins],\n                },\n            ],\n            signals: [SignalNames.PointScale, SignalNames.ZGrounded],\n        },\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/stacks.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { AxisScales } from '../interfaces.js';\nimport { BandProps } from '../layouts/band.js';\nimport { defaultBins, maxbins, minBarBandWidth } from '../defaults.js';\nimport { SignalNames } from '../constants.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\nimport { StackProps } from '../layouts/stack.js';\n\nexport default function (specContext: SpecContext): SpecBuilderProps {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const axisScales: AxisScales = {\n        x: { title: specColumns.x?.name },\n        y: { title: specColumns.y?.name },\n        z: { title: specViewOptions.language.count },\n    };\n    const backgroundImage =  specColumns.x?.quantitative && specColumns.y?.quantitative && insight.backgroundImage?.extents && insight.backgroundImage;\n    const showAxes = !(backgroundImage || insight.hideAxes);\n    const hBandProps: BandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: 'horizontal',\n        groupby: {\n            column: specColumns.y,\n            defaultBins,\n            maxbinsSignalName: SignalNames.YBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.YMaxBins,\n            maxbins,\n        },\n        minBandWidth: minBarBandWidth,\n        showAxes,\n        outerSignalExtents: backgroundImage && { max: backgroundImage.extents.top, min: backgroundImage.extents.bottom },\n    };\n    const vBandProps: BandProps = {\n        excludeEncodingRuleMap: true,\n        orientation: 'vertical',\n        groupby: {\n            column: specColumns.x,\n            defaultBins,\n            maxbinsSignalName: SignalNames.XBins,\n            maxbinsSignalDisplayName: specContext.specViewOptions.language.XMaxBins,\n            maxbins,\n        },\n        minBandWidth: minBarBandWidth,\n        showAxes,\n        outerSignalExtents: backgroundImage && { max: backgroundImage.extents.right, min: backgroundImage.extents.left },\n    };\n    const stackProps: StackProps = {\n        sort: specColumns.sort,\n        showAxes,\n    };\n    return {\n        axisScales,\n        customZScale: true,\n        layouts: [\n            {\n                layoutType: 'Band',\n                props: vBandProps,\n            },\n            {\n                layoutType: 'Band',\n                props: hBandProps,\n            },\n            {\n                layoutType: 'Stack',\n                props: stackProps,\n            },\n        ],\n        specCapabilities: {\n            backgroundImage: true,\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'x',\n                    binnable: true,\n                    axisSelection: specColumns.x?.quantitative ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [SignalNames.XBins],\n                },\n                {\n                    role: 'y',\n                    binnable: true,\n                    axisSelection: specColumns.y?.quantitative ? 'range' : 'exact',\n                    axisSelectionBetweenTicks: true,\n                    signals: [SignalNames.YBins],\n                },\n                {\n                    role: 'color',\n                    allowNone: true,\n                },\n                {\n                    role: 'sort',\n                    allowNone: true,\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [SignalNames.FacetBins],\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [SignalNames.FacetVBins],\n                },\n            ],\n        },\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/strips.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { AggregateContainerProps } from '../layouts/aggregateContainer.js';\nimport { AxisScales } from '../interfaces.js';\nimport { LayoutPair } from '../layouts/layout.js';\nimport { SignalNames } from '../constants.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\nimport { StripProps } from '../layouts/strip.js';\n\nexport default function (specContext: SpecContext): SpecBuilderProps {\n    const { insight, specColumns } = specContext;\n    const { view } = insight;\n    const stripProps: StripProps = {\n        sortOrder: 'ascending',\n        orientation: 'vertical',\n        size: specColumns.size,\n        sort: specColumns.sort,\n        z: specColumns.z,\n        showAxes: !insight.hideAxes,\n        view,\n    };\n    const axisScales: AxisScales = {\n        z: { title: specColumns.z && specColumns.z.name },\n    };\n    const layouts: LayoutPair[] = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: specColumns.size ? 'sum' : 'count',\n        };\n        const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n        const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n        const props: AggregateContainerProps = {\n            dock: 'top',\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false,\n        };\n        layouts.push({\n            layoutType: 'AggregateContainer',\n            props,\n        });\n    }\n    layouts.push({\n        layoutType: 'Strip',\n        props: stripProps,\n    });\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'size',\n                    allowNone: true,        //size by none is a count\n                    excludeCategoric: true,\n                },\n                {\n                    role: 'z',\n                    axisSelection: specColumns.z?.quantitative ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d',\n                },\n                {\n                    role: 'color',\n                    allowNone: true,\n                },\n                {\n                    role: 'sort',\n                    allowNone: true,\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [SignalNames.FacetBins],\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [SignalNames.FacetVBins],\n                },\n            ],\n        },\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/charts/treemap.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { AxisScales } from '../interfaces.js';\nimport { SignalNames } from '../constants.js';\nimport { SpecBuilderProps } from '../specBuilder.js';\nimport { SpecContext } from '../types.js';\nimport { TreemapProps } from '../layouts/treemap.js';\nimport { LayoutPair } from '../layouts/layout.js';\nimport { AggregateContainerProps } from '../layouts/aggregateContainer.js';\n\nexport default function (specContext: SpecContext): SpecBuilderProps {\n    const { insight, specColumns, specViewOptions } = specContext;\n    const { view } = insight;\n    const treemapProps: TreemapProps = {\n        corner: 'top-left',\n        group: specColumns.group,\n        size: specColumns.size,\n        treeMapMethod: specViewOptions.language.treeMapMethod,\n        z: specColumns.z,\n        showAxes: !insight.hideAxes,\n        view,\n    };\n    const axisScales: AxisScales = {\n        z: { title: specColumns.z && specColumns.z.name },\n    };\n    const layouts: LayoutPair[] = [];\n    if (specColumns.facet) {\n        axisScales.y = {\n            title: null,\n            aggregate: 'sum',\n        };\n        const globalAggregateMaxExtentScaledSignal = 'globalAggregateMaxExtentScaledSignal';\n        const globalAggregateMaxExtentSignal = 'globalAggregateMaxExtentSignal';\n        const props: AggregateContainerProps = {\n            dock: 'top',\n            niceScale: false,\n            globalAggregateMaxExtentScaledSignal,\n            globalAggregateMaxExtentSignal,\n            sumBy: specColumns.size,\n            showAxes: false,\n        };\n        layouts.push({\n            layoutType: 'AggregateContainer',\n            props,\n        });\n    }\n    layouts.push({\n        layoutType: 'Treemap',\n        props: treemapProps,\n    });\n    return {\n        axisScales,\n        layouts,\n        specCapabilities: {\n            countsAndSums: false,\n            roles: [\n                {\n                    role: 'size',\n                    excludeCategoric: true,\n                },\n                {\n                    role: 'group',\n                    allowNone: true,\n                },\n                {\n                    role: 'z',\n                    axisSelection: specColumns.z?.quantitative ? 'range' : 'exact',\n                    allowNone: true,\n                    disabled: view === '2d',\n                },\n                {\n                    role: 'color',\n                    allowNone: true,\n                },\n                {\n                    role: 'facet',\n                    allowNone: true,\n                    signals: [SignalNames.FacetBins],\n                },\n                {\n                    role: 'facetV',\n                    allowNone: true,\n                    signals: [SignalNames.FacetVBins],\n                },\n            ],\n            signals: [SignalNames.TreeMapMethod],\n        },\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/color.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { addData, addScales, addSignals } from './scope.js';\nimport { binnableColorScale } from './scales.js';\nimport { colorBinCountSignal, colorReverseSignal } from './signals.js';\nimport { ColorScaleNone, FieldNames } from './constants.js';\nimport { getLegends } from './legends.js';\nimport { Scope } from 'vega-typings';\nimport { SpecContext } from './types.js';\nimport { topLookup } from './top.js';\n\nexport interface Props {\n    scope: Scope;\n    dataName: string;\n    specContext: SpecContext;\n    scaleName: string;\n    legendDataName: string;\n    topLookupName: string;\n    colorReverseSignalName: string;\n}\n\nexport function addColor(props: Props) {\n    const { colorReverseSignalName, dataName, scope, legendDataName, scaleName, specContext, topLookupName } = props;\n    let colorDataName = dataName;\n    const { insight, specColumns, specViewOptions } = specContext;\n    const legends = getLegends(specContext, scaleName);\n    if (legends) {\n        scope.legends = legends;\n    }\n\n    const categoricalColor = specColumns.color && !specColumns.color.quantitative;\n    if (categoricalColor) {\n        addData(scope, ...topLookup(specColumns.color, specViewOptions.maxLegends, dataName, legendDataName, topLookupName, FieldNames.TopColor, FieldNames.TopIndex));\n        colorDataName = legendDataName;\n    }\n\n    if (specColumns.color && !specColumns.color.isColorData && !insight.directColor) {\n        if (specColumns.color.quantitative) {\n            addScales(scope, binnableColorScale(scaleName, insight.colorBin, dataName, specColumns.color.name, insight.scheme));\n        } else {\n            addScales(scope, {\n                name: scaleName,\n                type: 'ordinal',\n                domain: {\n                    data: colorDataName,\n                    field: FieldNames.TopColor,\n                    sort: true,\n                },\n                range: {\n                    scheme: insight.scheme || ColorScaleNone,\n                },\n                reverse: { signal: colorReverseSignalName },\n            });\n        }\n    }\n\n    addSignals(scope,\n        colorBinCountSignal(specContext),\n        colorReverseSignal(specContext),\n    );\n\n    return { topColorField: FieldNames.TopColor, colorDataName };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/constants.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const FieldNames = {\n    Active: '__SandDance__Active',\n    Collapsed: '__SandDance__Collapsed',\n    Contains: '__SandDance__Contains',\n    Count: '__SandDance__Count',\n    Sum: '__SandDance__Sum',\n    SumOfCount: '__SandDance__CountSum',\n    SumOfSum: '__SandDance__SumSum',\n    Selected: '__SandDance__Selected',\n    First: '__SandDance__First',\n    Last: '__SandDance__Last',\n    Top: '__SandDance__Top',\n    TopColor: '__SandDance__TopColor',\n    TopIndex: '__SandDance__TopIndex',\n    PowerBISelectionId: '__SandDance__PowerBISelectionId',\n    FacetSearch: '__SandDance__FacetSearch',\n    FacetTitle: '__SandDance__FacetTitle',\n    Ordinal: '__SandDance__Ordinal',\n    WrapCol: '__SandDance__WrapCol',\n    WrapRow: '__SandDance__WrapRow',\n    Value: '__SandDance__Value',\n    OffsetX: '__SandDance__X',\n    OffsetY: '__SandDance__Y',\n    OffsetHeight: '__SandDance__H',\n    OffsetWidth: '__SandDance__W',\n};\n\nexport const ScaleNames = {\n    Color: 'scale_color',\n    X: 'scale_x',\n    Y: 'scale_y',\n    Z: 'scale_z',\n};\n\n//Signal names\nexport const SignalNames = {\n    ViewportWidth: 'ViewportWidth',\n    ViewportHeight: 'ViewportHeight',\n    MinCellWidth: 'MinCellWidth',\n    MinCellHeight: 'MinCellHeight',\n    PlotOffsetLeft: 'PlotOffsetLeft',\n    PlotOffsetTop: 'PlotOffsetTop',\n    PlotOffsetBottom: 'PlotOffsetBottom',\n    PlotOffsetRight: 'PlotOffsetRight',\n    PlotHeightIn: 'PlotHeightIn',\n    PlotWidthIn: 'PlotWidthIn',\n    PlotHeightOut: 'PlotHeightOut',\n    PlotWidthOut: 'PlotWidthOut',\n    ColorBinCount: 'RoleColor_BinCountSignal',\n    ColorReverse: 'RoleColor_ReverseSignal',\n    FacetAxesAdjustX: 'RoleFacet_AxesAdjustSignalX',\n    FacetAxesAdjustY: 'RoleFacet_AxesAdjustSignalY',\n    FacetBins: 'RoleFacet_BinsSignal',\n    FacetVBins: 'RoleFacetV_BinsSignal',\n    FacetPaddingTop: 'FacetPaddingTop',\n    FacetPaddingBottom: 'FacetPaddingBottom',\n    FacetPaddingLeft: 'FacetPaddingLeft',\n    MarkOpacity: 'Mark_OpacitySignal',\n    PointScale: 'Chart_PointScaleSignal',\n    TextAngleX: 'Text_AngleXSignal',\n    TextAngleY: 'Text_AngleYSignal',\n    TextScale: 'Text_ScaleSignal',\n    TextSize: 'Text_SizeSignal',\n    TextTitleSize: 'Text_TitleSizeSignal',\n    TreeMapMethod: 'Chart_TreeMapMethodSignal',\n    XBins: 'RoleX_BinsSignal',\n    YBins: 'RoleY_BinsSignal',\n    ZHeight: 'RoleZ_HeightSignal',\n    ZGrounded: 'RoleZ_Grounded',\n    ZProportion: 'RoleZ_ProportionSignal',\n};\n\n//These are special formulaic data values\nexport const Other = '__Other';\n\n//name of the \"no-color\" palette\nexport const ColorScaleNone = 'none';\n"
  },
  {
    "path": "packages/sanddance-specs/src/defaults.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n//TODO move these to options\n\nexport const defaultBins = 10;\n\nexport const maxbins = 100;\n\nexport const minBarBandWidth = 15;\n\nexport const minFacetWidth = 140;\nexport const minFacetHeight = 180;\n\nexport const facetPaddingLeft = 40;\nexport const facetPaddingTop = 40;\nexport const facetPaddingBottom = 40;\nexport const facetPaddingRight = 40;\n\nexport const axesLabelLimit = 100;\nexport const axesTitleLimit = 100;\n\nexport const axesTitlePaddingX = 30;\nexport const axesTitlePaddingY = 60;\n\nexport const axesTitlePaddingFacetX = 69;\nexport const axesTitlePaddingFacetY = 92;\n\nexport const axesOffsetX = 120;\nexport const axesOffsetY = 120;\n\nexport const scatterSizedMin = 10;\nexport const scatterSizedDiv = 20;\n\nexport const debounce = 250;\n"
  },
  {
    "path": "packages/sanddance-specs/src/expr.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * Make sure that the field name is accessible via Vega's Field type\n * https://vega.github.io/vega/docs/types/#Field \n * examples: \"source.x\", \"target['x']\", \"[my.field]\"\n */\nexport function safeFieldName(field: string) {\n    return field\n        .replace(/\\\\/g, '\\\\\\\\') //escape backslashes\n        .replace(/'/g, '\\\\\\'')  //escape single quotes\n        .replace(/\"/g, '\\\\\"')   //escape double quotes\n        .replace(/\\./g, '\\\\.')  //escape periods\n        .replace(/\\[/g, '\\\\[')  //escape left square brackets\n        .replace(/\\]/g, '\\\\]')  //escape right square brackets\n    ;\n}\n\n/**\n * Make sure the field name is usable in a Vega expression\n */\nexport function exprSafeFieldName(field: string) {\n    //remove whitespace, period, accessors and logical modifiers\n    return field.replace(/[.,:;+=\\-/<>{}|~!@#$%^*[\\]`'\"()?\\s\\\\]/g, '');\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/facetLayout.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { CrossProps } from './layouts/cross.js';\nimport { DiscreteColumn } from './interfaces.js';\nimport {\n    facetPaddingBottom,\n    facetPaddingLeft,\n    facetPaddingRight,\n    facetPaddingTop,\n} from './defaults.js';\nimport { FacetStyle } from './types.js';\nimport { LayoutPair } from './layouts/layout.js';\nimport { WrapProps } from './layouts/wrap.js';\n\nexport interface PlotPadding {\n    x: number;\n    y: number;\n}\n\nexport interface FacetPadding {\n    top: number;\n    left: number;\n    bottom: number;\n}\n\nexport interface FacetLayout {\n    facetPadding: FacetPadding;\n    plotPadding: PlotPadding;\n}\n\nexport function getFacetLayout(facetStyle: FacetStyle, facetColumn: DiscreteColumn, facetVColumn: DiscreteColumn, axisTextColor: string) {\n    let layoutPair: LayoutPair;\n    const groupby = facetColumn;\n    const plotPadding: PlotPadding = {\n        x: 0,\n        y: 0,\n    };\n    let facetPadding: FacetPadding;\n    switch (facetStyle) {\n        case 'cross': {\n            const props: CrossProps = {\n                axisTextColor,\n                colRowTitles: true,\n                groupbyX: groupby,\n                groupbyY: facetVColumn,\n            };\n            layoutPair = {\n                layoutType: 'Cross',\n                props,\n            };\n            facetPadding = {\n                bottom: facetPaddingBottom,\n                left: facetPaddingLeft,\n                top: 0,\n            };\n            plotPadding.y = facetPaddingTop;\n            plotPadding.x = facetPaddingRight;\n            break;\n        }\n        case 'wrap':\n        default: {\n            const props: WrapProps = {\n                axisTextColor,\n                cellTitles: true,\n                groupby,\n            };\n            layoutPair = {\n                layoutType: 'Wrap',\n                props,\n            };\n            facetPadding =\n            {\n                bottom: facetPaddingBottom,\n                left: facetPaddingLeft,\n                top: facetPaddingTop,\n            };\n            break;\n        }\n    }\n    const facetLayout: FacetLayout = {\n        facetPadding,\n        plotPadding,\n    };\n    return {\n        layoutPair,\n        facetLayout,\n    };\n}\n\n"
  },
  {
    "path": "packages/sanddance-specs/src/facetSearch.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Binnable } from './bin.js';\n\nexport function displayBin(bin: Binnable) {\n    const val = (index: number) => `datum[${JSON.stringify(bin.fields[index])}]`;\n    return bin.discreteColumn.column.quantitative ?\n        `format(${val(0)}, '~r') + ' - ' + format(${val(1)}, '~r')`\n        :\n        val(0);\n}\n\nfunction obj(nameValues: string[], clause?: string) {\n    if (clause) {\n        nameValues = [clause, ...nameValues];\n    }\n    return `{${nameValues.join()}}`;\n}\n\nexport function serializeAsVegaExpression(bin: Binnable, firstFieldName: string, lastFieldName: string, clause?: string) {\n    if (bin.discreteColumn.column.quantitative) {\n        const low = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            'operator:\\'>=\\'',\n            `value:datum[${JSON.stringify(bin.fields[0])}]`,\n        ];\n        const high = [\n            'clause:\\'&&\\'',\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            'operator:\\'<\\'',\n            `value:datum[${JSON.stringify(bin.fields[1])}]`,\n        ];\n        return obj([\n            `expressions:[ datum[${JSON.stringify(firstFieldName)}] ? null : ${obj(low)}, datum[${JSON.stringify(lastFieldName)}] ? null : ${obj(high)}]`,\n        ], clause);\n    } else {\n        const exact = [\n            `name:${JSON.stringify(bin.discreteColumn.column.name)}`,\n            'operator:\\'==\\'',\n            `value:datum[${JSON.stringify(bin.fields[0])}]`,\n        ];\n        return obj([\n            `expressions:[${obj(exact)}]`,\n        ], clause);\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/facetTitle.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { addData, addMarks, addScales } from './scope.js';\nimport { AxesScopeMap } from './axes.js';\nimport {\n    Data,\n    GroupMark,\n    Scale,\n    Scope,\n} from 'vega-typings';\nimport { FieldNames, SignalNames } from './constants.js';\nimport { InnerScope, SizeSignals, TitleSource } from './interfaces.js';\n\nexport function addFacetColRowTitles(globalScope: Scope, colTitleSource: TitleSource, rowTitleSource: TitleSource, sizeSignals: SizeSignals, axisTextColor: string) {\n    const titleSignal = `parent[${JSON.stringify(FieldNames.FacetTitle)}]`;\n    const index = `datum[${JSON.stringify(FieldNames.Ordinal)}] - 1`;\n    const col = facetColumnHeaderFooter(colTitleSource.dataName, sizeSignals, index);\n    const row = facetRowHeaderFooter(rowTitleSource.dataName, sizeSignals, index);\n    addMarks(globalScope, col.header, row.footer);\n    addMarks(col.header,\n        {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'center',\n                    },\n                    baseline: {\n                        value: 'middle',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    x: {\n                        signal: `${sizeSignals.layoutWidth} / 2`,\n                    },\n                    limit: {\n                        signal: sizeSignals.layoutWidth,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    text: {\n                        signal: titleSignal,\n                    },\n                },\n            },\n        },\n    );\n    addMarks(row.footer,\n        {\n            type: 'text',\n            encode: {\n                enter: {\n                    align: {\n                        value: 'left',\n                    },\n                    baseline: {\n                        value: 'middle',\n                    },\n                    fill: {\n                        value: axisTextColor,\n                    },\n                },\n                update: {\n                    metaData: {\n                        signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                    },\n                    y: {\n                        signal: `${sizeSignals.layoutHeight} / 2`,\n                    },\n                    limit: {\n                        signal: SignalNames.PlotOffsetRight,\n                    },\n                    fontSize: {\n                        signal: SignalNames.TextSize,\n                    },\n                    text: {\n                        signal: titleSignal,\n                    },\n                },\n            },\n        },\n    );\n}\n\nexport function addFacetCellTitles(scope: Scope, sizeSignals: SizeSignals, axisTextColor: string) {\n    addMarks(scope, {\n        type: 'text',\n        encode: {\n            enter: {\n                align: {\n                    value: 'center',\n                },\n                baseline: {\n                    value: 'bottom',\n                },\n                fill: {\n                    value: axisTextColor,\n                },\n            },\n            update: {\n                metaData: {\n                    signal: `{search: parent[${JSON.stringify(FieldNames.FacetSearch)}]}`,\n                },\n                x: {\n                    signal: `(${sizeSignals.layoutWidth}) / 2`,\n                },\n                text: {\n                    signal: `parent[${JSON.stringify(FieldNames.FacetTitle)}]`,\n                },\n                fontSize: {\n                    signal: SignalNames.TextSize,\n                },\n                limit: {\n                    signal: sizeSignals.layoutWidth,\n                },\n                y: {\n                    signal: `-${SignalNames.FacetPaddingTop} / 2`,\n                },\n            },\n        },\n    });\n}\n\ninterface Props {\n    globalScope: Scope;\n    plotScope: Scope;\n    facetScope: InnerScope;\n    colTitleScale: Scale;\n    rowTitleScale: Scale;\n    colSeqName: string;\n    rowSeqName: string;\n}\n\nexport function addFacetAxesGroupMarks(props: Props) {\n    const { colSeqName, colTitleScale, globalScope, facetScope, plotScope, rowSeqName, rowTitleScale } = props;\n    const { sizeSignals } = facetScope;\n\n    const colSequence = createSequence(colSeqName, sizeSignals.colCount);\n    const rowSequence = createSequence(rowSeqName, sizeSignals.rowCount);\n\n    const index = 'datum.data';\n    const col = facetColumnHeaderFooter(colSeqName, sizeSignals, index);\n    const row = facetRowHeaderFooter(rowSeqName, sizeSignals, index);\n\n    addData(globalScope, colSequence, rowSequence);\n    addMarks(globalScope, col.footer, row.header);\n\n    addScales(globalScope, colTitleScale, rowTitleScale);\n\n    const map: AxesScopeMap = {\n        main: [\n            {\n                scope: facetScope.facetScope,\n                lines: true,\n                labels: false,\n                title: false,\n            },\n        ],\n        x: [\n            {\n                scope: col.footer,\n                lines: true,\n                labels: true,\n                title: false,\n            },\n            {\n                scope: plotScope,\n                scale: colTitleScale,\n                lines: false,\n                labels: false,\n                title: true,\n            },\n        ],\n        y: [\n            {\n                scope: row.header,\n                lines: true,\n                labels: true,\n                title: false,\n            },\n            {\n                scope: plotScope,\n                scale: rowTitleScale,\n                lines: false,\n                labels: false,\n                title: true,\n            },\n        ],\n    };\n    return map;\n}\n\nexport function facetRowHeaderFooter(data: string, sizeSignals: SizeSignals, index: string) {\n    const rowFn = (xSignal: string) => {\n        return <GroupMark>{\n            type: 'group',\n            from: { data },\n            encode: {\n                update: {\n                    x: { signal: xSignal },\n                    y: {\n                        signal: `${SignalNames.PlotOffsetTop} + ${SignalNames.FacetPaddingTop} + (${index}) * (${sizeSignals.layoutHeight} + ${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n                    },\n                    height: { signal: sizeSignals.layoutHeight },\n                },\n            },\n        };\n    };\n    const header = rowFn(SignalNames.PlotOffsetLeft);\n    const footer = rowFn(`${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetRight} / 2`);\n    return { header, footer };\n}\n\nexport function facetColumnHeaderFooter(data: string, sizeSignals: SizeSignals, index: string) {\n    const colFn = (ySignal: string) => {\n        return <GroupMark>{\n            type: 'group',\n            from: { data },\n            encode: {\n                update: {\n                    x: {\n                        signal: `(${index}) * (${sizeSignals.layoutWidth} + ${SignalNames.FacetPaddingLeft}) + ${SignalNames.FacetPaddingLeft} + ${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}`,\n                    },\n                    y: { signal: `${ySignal} - ${SignalNames.FacetAxesAdjustY}` },\n                    width: { signal: sizeSignals.layoutWidth },\n                },\n            },\n        };\n    };\n    //create group marks based on data sequences\n    const header = colFn(`${SignalNames.PlotOffsetTop} / 2`);\n    const footer = colFn(`${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut}`);\n    return { header, footer };\n}\n\nfunction createSequence(dataName: string, countSignal: string): Data {\n    return {\n        name: dataName,\n        transform: [\n            {\n                type: 'sequence',\n                start: 0,\n                stop: {\n                    signal: countSignal,\n                },\n            },\n        ],\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/fill.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SignalNames } from './constants.js';\nimport { safeFieldName } from './expr.js';\nimport { SpecContext } from './types.js';\nimport { ColorValueRef, NumericValueRef, ProductionRule } from 'vega-typings';\n\nexport function fill(context: SpecContext, colorFieldName: string, scale: string): ProductionRule<ColorValueRef> {\n    const { specColumns, insight, specViewOptions } = context;\n    const colorColumn = specColumns.color;\n    return colorColumn ?\n        colorColumn.isColorData || insight.directColor ?\n            {\n                field: safeFieldName(colorColumn.name),\n            }\n            :\n            {\n                scale,\n                field: colorColumn.quantitative ? safeFieldName(colorColumn.name) : colorFieldName,\n            }\n        :\n        {\n            value: specViewOptions.colors.defaultCube,\n        };\n}\n\nexport function opacity(context: SpecContext): ProductionRule<NumericValueRef> {\n    const result: ProductionRule<NumericValueRef> = {\n        signal: SignalNames.MarkOpacity,\n    };\n    return result;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/globalScope.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SignalNames } from './constants.js';\nimport { InnerScope } from './interfaces.js';\nimport { LayoutOffsets, SizeSignals } from './interfaces.js';\nimport { getDataByName } from './scope.js';\nimport {\n    Data,\n    GroupMark,\n    NewSignal,\n    Spec,\n} from 'vega-typings';\n\nexport interface GlobalSignals {\n    facetAxesAdjustX: NewSignal;\n    facetAxesAdjustY: NewSignal;\n    minCellWidth: NewSignal;\n    minCellHeight: NewSignal;\n    plotOffsetLeft: NewSignal;\n    plotOffsetTop: NewSignal;\n    plotOffsetBottom: NewSignal;\n    plotOffsetRight: NewSignal;\n    plotHeightOut: NewSignal;\n    plotWidthOut: NewSignal;\n}\n\nexport interface GlobalScopeProps {\n    dataName: string;\n    scope: Spec;\n    markGroup: GroupMark;\n    signals: GlobalSignals;\n}\n\nexport class GlobalScope implements InnerScope {\n    private _markDataName: string;\n    public data: Data;\n    public zSize: string;\n    public sizeSignals: SizeSignals;\n    public offsets: LayoutOffsets;\n    public scope: Spec;\n    private _markGroup: GroupMark;\n    public signals: GlobalSignals;\n\n    constructor(props: GlobalScopeProps) {\n        const { dataName, markGroup, scope, signals } = props;\n        this.scope = scope;\n        this._markGroup = markGroup;\n        this.signals = signals;\n        this.data = getDataByName(scope.data, dataName).data;\n        this._markDataName = dataName;\n        this.offsets = {\n            x: '0',\n            y: '0',\n            h: SignalNames.PlotHeightIn,\n            w: SignalNames.PlotWidthIn,\n        };\n        this.sizeSignals = {\n            layoutHeight: SignalNames.PlotHeightIn,\n            layoutWidth: SignalNames.PlotWidthIn,\n        };\n        this.zSize = SignalNames.PlotHeightIn;\n    }\n\n    get markDataName(): string {\n        return this._markDataName;\n    }\n\n    public setMarkDataName(markDataName: string) {\n        this._markDataName = markDataName;\n    }\n\n    get markGroup(): GroupMark {\n        return this._markGroup;\n    }\n\n    public setMarkGroup(markGroup: GroupMark) {\n        this._markGroup = markGroup;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/image.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { BackgroundImage } from './types.js';\nimport { ImageMark } from 'vega-typings/types';\nimport { GlobalScales } from './interfaces.js';\nimport { bandScaleLinearSuffix } from './layouts/band.js';\n\nexport function getImageMark(backgroundImage: BackgroundImage, allGlobalScales: GlobalScales[]): ImageMark {\n    const xScale = allGlobalScales.filter(s => s.scales.x)[0].scales.x[0];\n    const yScale = allGlobalScales.filter(s => s.scales.y)[0].scales.y[0];\n    const [xScaleName, yScaleName] = [xScale, yScale].map(s => s.name + (xScale.type === 'band' ? bandScaleLinearSuffix : ''));\n    return {\n        type: 'image',\n        encode: {\n            update: {\n                url: {\n                    value: backgroundImage.url,\n                },\n                aspect: {\n                    value: false,\n                },\n                baseline: {\n                    value: 'bottom',\n                },\n                height: {\n                    signal: getScaledSpan(yScaleName, backgroundImage.extents.bottom, backgroundImage.extents.top),\n                },\n                y: {\n                    signal: getScaledValue(yScaleName, backgroundImage.extents.bottom),\n                },\n                width: {\n                    signal: getScaledSpan(xScaleName, backgroundImage.extents.right, backgroundImage.extents.left),\n                },\n                x: {\n                    signal: getScaledValue(xScaleName, backgroundImage.extents.left),\n                },\n            },\n        },\n    };\n}\n\nfunction getScaledSpan(scaleName: string, low: number, high: number): string {\n    return `abs(scale('${scaleName}', ${low}) - scale('${scaleName}', ${high}))`;\n}\n\nfunction getScaledValue(scaleName: string, value: number): string {\n    return `scale('${scaleName}', ${value})`;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport * from './build.js';\nexport * from './constants.js';\nexport * from './inference.js';\nexport * from './insight.js';\nexport * from './interfaces.js';\nexport * from './types.js';\n"
  },
  {
    "path": "packages/sanddance-specs/src/inference.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { SpecColumns } from './types.js';\nimport { Insight } from './insight.js';\n\nexport { getColumnsFromData, getStats, inferAll } from '@msrvida/data-inference';\n\n/**\n * Get columns associated with each Insight role.\n * @param insight Insight to specify column roles.\n * @param columns Array of Columns inferred from the data.\n */\nexport function getSpecColumns(insight: Insight, columns: Column[]): SpecColumns {\n    function getColumnByName(name: string) {\n        return columns.filter(c => c.name === name)[0];\n    }\n    return {\n        color: getColumnByName(insight.columns && insight.columns.color),\n        facet: getColumnByName(insight.columns && insight.columns.facet),\n        facetV: getColumnByName(insight.columns && insight.columns.facetV),\n        group: getColumnByName(insight.columns && insight.columns.group),\n        size: getColumnByName(insight.columns && insight.columns.size),\n        sort: getColumnByName(insight.columns && insight.columns.sort),\n        uid: getColumnByName(insight.columns && insight.columns.uid),\n        x: getColumnByName(insight.columns && insight.columns.x),\n        y: getColumnByName(insight.columns && insight.columns.y),\n        z: getColumnByName(insight.columns && insight.columns.z),\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/insight.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Size, View } from '@msrvida/chart-types';\nimport { Search } from '@msrvida/search-expression';\nimport { Transforms } from 'vega-typings';\nimport { BackgroundImage, Chart, ColorBin, FacetStyle, SignalValues, TotalStyle } from './types';\n\n/**\n * Options to designate a SandDance visualization.\n */\nexport interface Insight {\n    backgroundImage?: BackgroundImage;\n    chart: Chart;\n    size: Size;\n    columns: InsightColumns;\n    view?: View;\n    filter?: Search;\n    facetStyle?: FacetStyle;\n    totalStyle?: TotalStyle;\n\n    /**\n     * Type of color binning to use on color scale. Only applicable when the column in the color role is quantitative. \n     */\n    colorBin?: ColorBin;\n\n    /**\n     * Name of the color scheme. See https://vega.github.io/vega/docs/schemes/\n     */\n    scheme?: string;\n\n    /**\n     * Vega signal values for this insight.\n     */\n    signalValues?: SignalValues;\n\n    /**\n     * Optional flag to hide axes.\n     */\n    hideAxes?: boolean;\n\n    /**\n     * Optional flag to hide legend.\n     */\n    hideLegend?: boolean;\n\n    /**\n     * Optional flag to use CSS colors directly from data.\n     */\n    directColor?: boolean;\n\n    /**\n     * Optional array of Vega transforms to apply to the data.\n     */\n    transform?: Transforms[];\n}\n\nexport type InsightColumnRoles = 'uid' | 'x' | 'y' | 'z' | 'group' | 'size' | 'color' | 'facet' | 'facetV' | 'sort';\n\nexport interface InsightColumns {\n    uid?: string;\n    x?: string;\n    y?: string;\n    z?: string;\n    group?: string;\n    size?: string;\n    color?: string;\n    sort?: string;\n    facet?: string;\n    facetV?: string;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/interfaces.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SpecCapabilities, SpecContext } from './types.js';\nimport { Column } from '@msrvida/chart-types';\nimport {\n    AggregateOp,\n    Mark,\n    NumericValueRef,\n    Scale,\n    Scope,\n    Spec,\n} from 'vega-typings';\n\n/**\n * Specification result object.\n */\nexport interface SpecResult {\n    errors?: string[];\n    vegaSpec: Spec;\n    specCapabilities: SpecCapabilities;\n}\n\nexport interface SpecCreator {\n    (context: SpecContext): SpecResult;\n}\n\nexport interface SizeSignals {\n    layoutHeight: string;\n    layoutWidth: string;\n    colCount?: string;\n    rowCount?: string;\n}\n\nexport interface GlobalScales {\n    showAxes: boolean;\n    scales: {\n        x?: Scale[];\n        y?: Scale[];\n        z?: Scale[];\n    }\n}\n\nexport interface TitleSource {\n    dataName: string;\n    quantitative: boolean;\n}\n\nexport interface Titles {\n    x: TitleSource;\n    y: TitleSource;\n}\n\nexport type EncodingRule = { test?: string } & NumericValueRef;\n\nexport interface InnerScope {\n    id?: number;\n    titles?: Titles;\n    facetScope?: Scope;             //TODO add counts\n    mark?: Mark;\n    globalScales?: GlobalScales;\n    encodingRuleMap?: { [key: string]: EncodingRule[] };\n    sizeSignals: SizeSignals;\n    offsets: LayoutOffsets;\n}\n\nexport type Orientation = 'horizontal' | 'vertical';\n\nexport type Aggregate = 'count' | 'sum' | 'percent';\n\nexport interface AxisScale {\n    title: string;\n    aggregate?: Aggregate;\n}\n\nexport interface AxisScales {\n    x?: AxisScale;\n    y?: AxisScale;\n    z?: AxisScale;\n}\n\nexport interface DiscreteColumn {\n    column: Column;\n    defaultBins: number;\n    maxbins: number;\n    maxbinsSignalName: string;\n    maxbinsSignalDisplayName: string;\n}\n\nexport interface FieldOp {\n    field: string;\n    op: AggregateOp;\n    as: string;\n}\n\nexport interface Grouping {\n    id: number;\n    groupby: string[];\n    fieldOps: FieldOp[];\n}\n\nexport interface LayoutOffsets {\n    x: string;\n    y: string;\n    h: string;\n    w: string;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/aggregateContainer.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { FieldNames } from '../constants.js';\nimport { safeFieldName } from '../expr.js';\nimport {\n    AxisScale,\n    FieldOp,\n    InnerScope,\n    LayoutOffsets,\n} from '../interfaces.js';\nimport {\n    addOffsets,\n    addSignals,\n    addTransforms,\n    getGroupBy,\n} from '../scope.js';\nimport { testForCollapseSelection } from '../selection.js';\nimport { Column } from '@msrvida/chart-types';\nimport { JoinAggregateTransform, LinearScale } from 'vega-typings';\n\nexport interface AggregateContainerProps extends LayoutProps {\n    dock: 'bottom' | 'top' | 'left';\n    sumBy: Column;\n    globalAggregateMaxExtentSignal: string;\n    globalAggregateMaxExtentScaledSignal: string;\n    niceScale: boolean;\n    showAxes: boolean;\n}\n\nexport class AggregateContainer extends Layout {\n    private aggregation: 'sum' | 'count';\n    private names: {\n        barCount: string,\n        aggregateField: string,\n        globalAggregateExtentSignal: string,\n        scale: string,\n        extentData: string,\n        offsets: string\n    };\n\n    constructor(public props: AggregateContainerProps & LayoutBuildProps) {\n        super(props);\n        const a = this.aggregation = this.getAggregation();\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            scale: `scale_${p}`,\n            extentData: `data_${p}_extent`,\n            offsets: `data_${p}_offsets`,\n        };\n    }\n\n    public getAggregateSumOp() {\n        if (this.aggregation === 'sum') {\n            const fieldOp: FieldOp = {\n                field: safeFieldName(this.props.sumBy.name),\n                op: 'sum',\n                as: FieldNames.Sum,\n            };\n            return fieldOp;\n        }\n    }\n\n    public build(): InnerScope {\n        const { aggregation, names, props } = this;\n        const { dock, globalScope, groupings, niceScale, parentScope, showAxes } = props;\n\n        addTransforms(globalScope.data,\n            {\n                ...this.getTransforms(\n                    aggregation,\n                    getGroupBy(groupings),\n                ),\n                as: [names.aggregateField],\n            },\n            {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal,\n            },\n        );\n        addSignals(globalScope.scope,\n            {\n                name: props.globalAggregateMaxExtentSignal,\n                update: `${names.globalAggregateExtentSignal}[1]`,\n            },\n        );\n        const horizontal = dock === 'left';\n        const groupScaled = `scale(${JSON.stringify(names.scale)}, datum[${JSON.stringify(names.aggregateField)}])`;\n        const offsets: LayoutOffsets = {\n            x: parentScope.offsets.x,\n            y: addOffsets(parentScope.offsets.y,\n                dock === 'bottom' ?\n                    groupScaled\n                    :\n                    '',\n            ),\n            h: horizontal ?\n                parentScope.offsets.h\n                :\n                dock === 'top'\n                    ? groupScaled\n                    : `${parentScope.offsets.h} - ${groupScaled}`\n            ,\n            w: horizontal ?\n                groupScaled\n                :\n                parentScope.offsets.w,\n        };\n\n        const scale: LinearScale = {\n            type: 'linear',\n            name: names.scale,\n            domain: [\n                0,\n                {\n                    signal: props.globalAggregateMaxExtentSignal,\n                },\n            ],\n            range: horizontal ?\n                [\n                    0,\n                    {\n                        signal: parentScope.sizeSignals.layoutWidth,\n                    },\n                ]\n                :\n                [\n                    {\n                        signal: parentScope.sizeSignals.layoutHeight,\n                    },\n                    0,\n                ],\n            nice: niceScale,\n            zero: true,\n            reverse: dock === 'top',\n        };\n\n        const globalAggregateMaxExtentScaledValue = `scale(${JSON.stringify(names.scale)}, ${props.globalAggregateMaxExtentSignal})`;\n\n        addSignals(globalScope.scope,\n            {\n                name: props.globalAggregateMaxExtentScaledSignal,\n                update: dock === 'bottom'\n                    ? `${parentScope.sizeSignals.layoutHeight} - ${globalAggregateMaxExtentScaledValue}`\n                    : globalAggregateMaxExtentScaledValue,\n            },\n        );\n\n        return {\n            offsets,\n            sizeSignals: horizontal ?\n                {\n                    layoutHeight: parentScope.sizeSignals.layoutHeight,\n                    layoutWidth: null,\n                }\n                :\n                {\n                    layoutHeight: null,\n                    layoutWidth: parentScope.sizeSignals.layoutWidth,\n                },\n            globalScales: {\n                showAxes,\n                scales: {\n                    x: horizontal ? [scale] : undefined,\n                    y: horizontal ? undefined : [scale],\n                },\n            },\n            encodingRuleMap: horizontal ?\n                {\n                    x: [{\n                        test: testForCollapseSelection(),\n                        signal: parentScope.offsets.x,\n                    }],\n                    width: [{\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    }],\n                }\n                :\n                {\n                    y: [{\n                        test: testForCollapseSelection(),\n                        signal: dock === 'top'\n                            ? parentScope.offsets.y\n                            : addOffsets(parentScope.offsets.y, parentScope.offsets.h),\n                    }],\n                    height: [{\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    }],\n                },\n        };\n    }\n\n    private getTransforms(aggregation: 'count' | 'sum', groupby: string[]) {\n        const trans: JoinAggregateTransform = {\n            type: 'joinaggregate',\n            groupby: groupby.map(safeFieldName),\n            ops: [aggregation],\n        };\n        if (aggregation === 'sum') {\n            trans.fields = [this.props.sumBy.name].map(safeFieldName);\n        }\n        return trans;\n    }\n\n    private getAggregation() {\n        const { props } = this;\n        let s: AxisScale;\n        if (props.dock === 'left') {\n            s = props.axesScales.x;\n        } else {\n            s = props.axesScales.y;\n        }\n        switch (s.aggregate) {\n            case 'sum':\n                return 'sum';\n            default:\n                return 'count';\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/aggregateSquare.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { safeFieldName } from '../expr.js';\nimport { InnerScope, LayoutOffsets } from '../interfaces.js';\nimport {\n    addOffsets,\n    addTransforms,\n    getGroupBy,\n} from '../scope.js';\nimport { testForCollapseSelection } from '../selection.js';\nimport { Column } from '@msrvida/chart-types';\nimport { JoinAggregateTransform } from 'vega-typings';\n\nexport interface AggregateSquareProps extends LayoutProps {\n    aggregation: 'sum' | 'count';\n    sumBy: Column;\n    onBuild: (localAggregateMaxExtent: string, localAggregateMaxExtentScaled: string) => void;\n}\n\nexport class AggregateSquare extends Layout {\n    private names: {\n        barCount: string,\n        aggregateField: string,\n        globalAggregateExtentSignal: string,\n        extentData: string,\n    };\n\n    constructor(public props: AggregateSquareProps & LayoutBuildProps) {\n        super(props);\n        const a = this.props.aggregation;\n        const p = this.prefix = `agg_${this.id}`;\n        this.names = {\n            barCount: `${p}_count`,\n            aggregateField: `${p}_aggregate_value`,\n            globalAggregateExtentSignal: `${p}_${a}_extent`,\n            extentData: `data_${p}_extent`,\n        };\n    }\n\n    public build(): InnerScope {\n        const { names, props } = this;\n        const { aggregation, globalScope, groupings, onBuild, parentScope } = props;\n        const { sizeSignals } = parentScope;\n\n        addTransforms(globalScope.data,\n            {\n                ...this.getTransforms(\n                    aggregation,\n                    getGroupBy(groupings),\n                ),\n                as: [names.aggregateField],\n            },\n            {\n                type: 'extent',\n                field: safeFieldName(names.aggregateField),\n                signal: names.globalAggregateExtentSignal,\n            },\n        );\n\n        const localAggregateMaxExtent = `datum[${JSON.stringify(names.aggregateField)}]`;\n        const squareMaxSide = `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`;\n        const squareMaxArea = `(${[squareMaxSide, squareMaxSide].join(' * ')})`;\n        const shrinkRatio = `((${localAggregateMaxExtent}) / (${names.globalAggregateExtentSignal}[1]))`;\n        const squareArea = `(${[squareMaxArea, shrinkRatio].join(' * ')})`;\n        const squareSide = `sqrt(${squareArea})`;\n        const localAggregateMaxExtentScaled = squareSide;\n\n        onBuild && onBuild(localAggregateMaxExtent, localAggregateMaxExtentScaled);\n\n        const offsets: LayoutOffsets = {\n            x: addOffsets(parentScope.offsets.x, `(${parentScope.offsets.w} - ${squareSide}) / 2`),\n            y: addOffsets(parentScope.offsets.y, `(${parentScope.offsets.h} - ${squareSide}) / 2`),\n            h: squareSide,\n            w: squareSide,\n        };\n\n        return {\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null,\n            },\n            encodingRuleMap: {\n                y: [{\n                    test: testForCollapseSelection(),\n                    signal: offsets.y,\n                }],\n                height: [{\n                    test: testForCollapseSelection(),\n                    value: 0,\n                }],\n            },\n        };\n    }\n\n    private getTransforms(aggregation: 'count' | 'sum', groupby: string[]) {\n        const trans: JoinAggregateTransform = {\n            type: 'joinaggregate',\n            groupby: groupby.map(safeFieldName),\n            ops: [aggregation],\n        };\n        if (aggregation === 'sum') {\n            trans.fields = [this.props.sumBy.name].map(safeFieldName);\n        }\n        return trans;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/band.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { binnable, Binnable } from '../bin.js';\nimport { safeFieldName } from '../expr.js';\nimport {\n    DiscreteColumn,\n    EncodingRule,\n    InnerScope,\n    LayoutOffsets,\n    Orientation,\n} from '../interfaces.js';\nimport {\n    addData,\n    addOffsets,\n    addScales,\n    addSignals,\n    addTransforms,\n} from '../scope.js';\nimport { testForCollapseSelection } from '../selection.js';\nimport { modifySignal } from '../signals.js';\nimport { BandScale, RangeRawArray } from 'vega-typings';\nimport { linearScale } from '../scales.js';\n\nexport const bandScaleLinearSuffix = '_linear';\n\nexport interface BandProps extends LayoutProps {\n    excludeEncodingRuleMap?: boolean;\n    groupby: DiscreteColumn;\n    minBandWidth: number;\n    orientation: Orientation;\n    showAxes: boolean;\n    style?: string;\n    outerSignalExtents?: { min: number, max: number };\n}\n\nexport class Band extends Layout {\n    private bin: Binnable;\n    private names: {\n        xScale: string,\n        yScale: string,\n        bandWidth: string,\n        accumulative: string,\n    };\n\n    constructor(public props: BandProps & LayoutBuildProps) {\n        super(props);\n        const p = this.prefix = `band_${this.id}`;\n        this.names = {\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            bandWidth: `${p}_bandwidth`,\n            accumulative: `${p}_accumulative`,\n        };\n        this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby, props.outerSignalExtents);\n    }\n\n    public getGrouping() {\n        return this.bin.fields;\n    }\n\n    public build(): InnerScope {\n        const { bin, names, props } = this;\n        const { globalScope, minBandWidth, orientation, parentScope, showAxes } = props;\n        const binField = bin.fields[0];\n        if (bin.native === false) {\n            addSignals(globalScope.scope, ...bin.signals);\n            addTransforms(globalScope.data, ...bin.transforms);\n            addData(globalScope.scope, bin.dataSequence);\n        }\n\n        //TODO don't add this, use existing dataset\n        addData(globalScope.scope, {\n            name: names.accumulative,\n            source: bin.fullScaleDataname,\n            transform: [\n                {\n                    type: 'aggregate',\n                    groupby: this.getGrouping().map(safeFieldName),\n                    ops: ['count'],\n                },\n            ],\n        });\n        const horizontal = orientation === 'horizontal';\n        const minCellSignal = (horizontal) ? globalScope.signals.minCellHeight : globalScope.signals.minCellWidth;\n        modifySignal(minCellSignal, 'max', `length(data(${JSON.stringify(names.accumulative)})) * ${minBandWidth}`);\n        addSignals(globalScope.scope,\n            {\n                name: names.bandWidth,\n                update: `bandwidth(${JSON.stringify(horizontal ? names.yScale : names.xScale)})`,\n            },\n        );\n\n        const scale = this.getScale(bin, horizontal);\n\n        if (props.outerSignalExtents && bin.native === false) {\n            //add a linear scale for use by background image\n            addScales(globalScope.scope, linearScale(scale.name + bandScaleLinearSuffix, {signal: bin.extentSignal}, scale.range as RangeRawArray, scale.reverse as boolean, false, false));\n        }\n\n        let encodingRuleMap: { [key: string]: EncodingRule[] };\n        if (!props.excludeEncodingRuleMap) {\n            encodingRuleMap = horizontal ?\n                {\n                    x: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.x,\n                        },\n                    ],\n                    width: [\n                        {\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        },\n                    ],\n                }\n                :\n                {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: addOffsets(parentScope.offsets.y, parentScope.offsets.h),\n                        },\n                    ],\n                    height: [\n                        {\n                            test: testForCollapseSelection(),\n                            value: 0,\n                        },\n                    ],\n                };\n        }\n\n        return {\n            offsets: this.getOffset(horizontal, binField),\n            sizeSignals: horizontal ?\n                {\n                    layoutHeight: names.bandWidth,\n                    layoutWidth: parentScope.sizeSignals.layoutWidth,\n                }\n                :\n                {\n                    layoutHeight: parentScope.sizeSignals.layoutHeight,\n                    layoutWidth: names.bandWidth,\n                },\n            globalScales: {\n                showAxes,\n                scales: {\n                    x: horizontal ? undefined : [scale],\n                    y: horizontal ? [scale] : undefined,\n                },\n            },\n            encodingRuleMap,\n        };\n    }\n\n    private getOffset(horizontal: boolean, binField: string): LayoutOffsets {\n        const { names, props } = this;\n        const { parentScope } = props;\n        return {\n            x: addOffsets(parentScope.offsets.x,\n                horizontal ?\n                    ''\n                    :\n                    `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(binField)}])`,\n            ),\n            y: addOffsets(parentScope.offsets.y,\n                horizontal ?\n                    `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(binField)}])`\n                    :\n                    '',\n            ),\n            h: horizontal ?\n                names.bandWidth\n                :\n                parentScope.offsets.h,\n            w: horizontal ?\n                parentScope.offsets.w\n                :\n                names.bandWidth,\n        };\n    }\n\n    private getScale(bin: Binnable, horizontal: boolean) {\n        const { names } = this;\n        const { parentScope } = this.props;\n        const binField = safeFieldName(bin.fields[0]);\n\n        let bandScale: BandScale;\n        if (horizontal) {\n            bandScale = {\n                type: 'band',\n                name: names.yScale,\n                range: [\n                    0,\n                    {\n                        signal: parentScope.sizeSignals.layoutHeight,\n                    },\n                ],\n                padding: 0.1,\n                domain: {\n                    data: bin.domainDataName,\n                    field: binField,\n                    sort: true,\n                },\n                reverse: true,\n            };\n        } else {\n            bandScale = {\n                type: 'band',\n                name: names.xScale,\n                range: [\n                    0,\n                    {\n                        signal: parentScope.sizeSignals.layoutWidth,\n                    },\n                ],\n                padding: 0.1,\n                domain: {\n                    data: bin.domainDataName,\n                    field: binField,\n                    sort: true,\n                },\n            };\n        }\n        return bandScale;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/cross.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { Binnable, binnable } from '../bin.js';\nimport { FieldNames, SignalNames } from '../constants.js';\nimport { displayBin, serializeAsVegaExpression } from '../facetSearch.js';\nimport { addFacetColRowTitles } from '../facetTitle.js';\nimport {\n    DiscreteColumn,\n    InnerScope,\n    LayoutOffsets,\n    SizeSignals,\n    Titles,\n    TitleSource,\n} from '../interfaces.js';\nimport { createOrdinals, ordinalScale } from '../ordinal.js';\nimport {\n    addData,\n    addMarks,\n    addScales,\n    addSignals,\n    addTransforms,\n} from '../scope.js';\nimport { modifySignal } from '../signals.js';\nimport {\n    Data,\n    GroupMark,\n    NewSignal,\n    OrdinalScale,\n    SortOrder,\n} from 'vega-typings';\n\nexport interface CrossProps extends LayoutProps {\n    axisTextColor: string;\n    colRowTitles: boolean;\n    groupbyX: DiscreteColumn;\n    groupbyY: DiscreteColumn;\n}\n\ninterface Dimension {\n    dim: string;\n    bin: Binnable;\n    sortOrder: SortOrder;\n    size: string;\n    layout: string;\n    min: string;\n    out: NewSignal;\n    offset: string;\n    padding: string;\n    dataOut: Data;\n    scaleName: string;\n    position: string;\n}\n\nexport class Cross extends Layout {\n    private binX: Binnable;\n    private binY: Binnable;\n    private names: {\n        facetDataName: string,\n        searchUnion: string,\n        dimScale: string,\n        dimCount: string,\n        dimCategorical: string,\n        dimCellSizeCalc: string,\n        dimCellSize: string,\n    };\n\n    constructor(public props: CrossProps & LayoutBuildProps) {\n        super(props);\n        const p = this.prefix = `cross_${this.id}`;\n        this.binX = binnable(`${p}_x`, props.globalScope.data.name, props.groupbyX);\n        this.binY = binnable(`${p}_y`, props.globalScope.data.name, props.groupbyY);\n        this.names = {\n            facetDataName: `data_${p}_facet`,\n            searchUnion: `data_${p}_search`,\n            dimScale: `scale_${p}`,\n            dimCount: `${p}_count`,\n            dimCategorical: `data_${p}_cat`,\n            dimCellSize: `${p}_cell_size`,\n            dimCellSizeCalc: `${p}_cell_calc`,\n        };\n    }\n\n    public getGrouping() {\n        return this.binX.fields.concat(this.binY.fields);\n    }\n\n    public build(): InnerScope {\n        const { binX, binY, names, prefix, props } = this;\n        const { axisTextColor, colRowTitles, globalScope, parentScope } = props;\n        const titles: Titles = { x: { dataName: null, quantitative: null }, y: { dataName: null, quantitative: null } };\n\n        const dx: Dimension = {\n            dim: 'x',\n            bin: binX,\n            sortOrder: <SortOrder>'ascending',\n            size: parentScope.sizeSignals.layoutWidth,\n            layout: parentScope.sizeSignals.layoutWidth,\n            min: globalScope.signals.minCellWidth.name,\n            out: globalScope.signals.plotWidthOut,\n            offset: SignalNames.FacetPaddingLeft,\n            padding: SignalNames.FacetPaddingLeft,\n            dataOut: <Data>null,\n            scaleName: <string>null,\n            position: null,\n        };\n        const dy: Dimension = {\n            dim: 'y',\n            bin: binY,\n            sortOrder: <SortOrder>'ascending',\n            size: parentScope.sizeSignals.layoutHeight,\n            layout: parentScope.sizeSignals.layoutHeight,\n            min: globalScope.signals.minCellHeight.name,\n            out: globalScope.signals.plotHeightOut,\n            offset: SignalNames.FacetPaddingTop,\n            padding: `(${SignalNames.FacetPaddingTop} + ${SignalNames.FacetPaddingBottom})`,\n            dataOut: <Data>null,\n            scaleName: <string>null,\n            position: null,\n        };\n\n        const dimensions = [dx, dy];\n        dimensions.forEach(d => {\n            const { bin, dim, padding, sortOrder } = d;\n            let data: Data;\n            let dataName: string;\n            let countSignal: string;\n            let scale: OrdinalScale;\n            const titleSource: TitleSource = titles[dim];\n            if (bin.native === false) {\n                addSignals(globalScope.scope, ...bin.signals);\n                addTransforms(globalScope.data, ...bin.transforms);\n                addData(globalScope.scope, bin.dataSequence);\n                addTransforms(bin.dataSequence,\n                    {\n                        type: 'formula',\n                        expr: `indata(${JSON.stringify(globalScope.markDataName)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                        as: FieldNames.Contains,\n                    },\n                );\n                data = bin.dataSequence;\n                dataName = bin.dataSequence.name;\n                countSignal = `length(data(${JSON.stringify(dataName)}))`;\n                scale = ordinalScale(dataName, `${names.dimScale}_${dim}`, bin.fields);\n                titleSource.dataName = bin.dataSequence.name;\n            } else {\n                dataName = globalScope.markDataName;\n                const ord = createOrdinals(dataName, `${prefix}_${dim}`, bin.fields, sortOrder);\n                data = ord.data;\n                addData(globalScope.scope, ord.data);\n                countSignal = `length(data(${JSON.stringify(ord.data.name)}))`;\n                scale = ord.scale;\n                titleSource.dataName = ord.data.name;\n            }\n            titleSource.quantitative = bin.discreteColumn.column.quantitative;\n            d.dataOut = data;\n            d.scaleName = scale.name;\n            addTransforms(data,\n                {\n                    type: 'formula',\n                    expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                    as: FieldNames.FacetSearch,\n                },\n                {\n                    type: 'formula',\n                    expr: displayBin(bin),\n                    as: FieldNames.FacetTitle,\n                },\n            );\n            addScales(globalScope.scope, scale);\n            const count = `${names.dimCount}_${dim}`;\n            const calc = `${names.dimCellSizeCalc}_${dim}`;\n            const size = `${names.dimCellSize}_${dim}`;\n            addSignals(globalScope.scope, { name: count, update: countSignal });\n            addSignals(globalScope.scope,\n                {\n                    name: calc,\n                    update: `${d.layout} / ${count}`,\n                },\n                {\n                    name: size,\n                    update: `max(${d.min}, (${calc} - ${padding}))`,\n                },\n            );\n            modifySignal(d.out, 'max', `((${size} + ${padding}) * ${count})`);\n            d.position = this.dimensionOffset(d);\n        });\n\n        const groupRow: GroupMark = {\n            type: 'group',\n            encode: {\n                update: {\n                    y: {\n                        signal: dy.position,\n                    },\n                },\n            },\n            from: {\n                data: dy.dataOut.name,\n            },\n            data: [\n                {\n                    name: names.searchUnion,\n                    source: dx.dataOut.name,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: `[datum[${JSON.stringify(FieldNames.FacetSearch)}], merge(parent[${JSON.stringify(FieldNames.FacetSearch)}], { clause: '&&'})]`,\n                            as: FieldNames.FacetSearch,\n                        },\n                    ],\n                },\n            ],\n        };\n\n        const groupCol: GroupMark = {\n            style: 'cell',\n            name: prefix,\n            type: 'group',\n            encode: {\n                update: {\n                    height: {\n                        signal: `${names.dimCellSize}_y`,\n                    },\n                    width: {\n                        signal: `${names.dimCellSize}_x`,\n                    },\n                    x: {\n                        signal: dx.position,\n                    },\n                },\n            },\n            from: {\n                data: names.searchUnion,\n            },\n        };\n\n        addMarks(globalScope.markGroup, groupRow);\n        addMarks(groupRow, groupCol);\n\n        const offsets: LayoutOffsets = {\n            x: this.dimensionOffset(dx),\n            y: this.dimensionOffset(dy),\n            h: `${names.dimCellSize}_y`,\n            w: `${names.dimCellSize}_x`,\n        };\n\n        const sizeSignals: SizeSignals = {\n            layoutHeight: `${names.dimCellSize}_y`,\n            layoutWidth: `${names.dimCellSize}_x`,\n            colCount: `${names.dimCount}_x`,\n            rowCount: `${names.dimCount}_y`,\n        };\n\n        if (colRowTitles) {\n            addFacetColRowTitles(globalScope.scope, titles.x, titles.y, sizeSignals, axisTextColor);\n        }\n\n        return {\n            facetScope: groupCol,\n            offsets,\n            sizeSignals,\n            titles,\n        };\n    }\n\n    private dimensionOffset(d: Dimension) {\n        const { names } = this;\n        return `${d.offset} + (scale(${JSON.stringify(d.scaleName)}, datum[${JSON.stringify(d.bin.fields[0])}]) - 1) * (${names.dimCellSize}_${d.dim} + ${d.padding})`;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { AggregateContainer } from './aggregateContainer.js';\nimport { AggregateSquare } from './aggregateSquare.js';\nimport { Band } from './band.js';\nimport { Cross } from './cross.js';\nimport { Layout } from './layout.js';\nimport { Scatter } from './scatter.js';\nimport { Square } from './square.js';\nimport { Stack } from './stack.js';\nimport { Strip } from './strip.js';\nimport { Treemap } from './treemap.js';\nimport { Wrap } from './wrap.js';\n\nexport type LayoutType =\n    'AggregateContainer' |\n    'AggregateSquare' |\n    'Band' |\n    'Cross' |\n    'Scatter' |\n    'Square' |\n    'Stack' |\n    'Strip' |\n    'Treemap' |\n    'Wrap'\n    ;\n\nexport const layoutClasses: { [key in LayoutType]: typeof Layout } = {\n    AggregateContainer,\n    AggregateSquare,\n    Band,\n    Cross,\n    Scatter,\n    Square,\n    Stack,\n    Strip,\n    Treemap,\n    Wrap,\n};\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/layout.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { LayoutType } from './index.js';\nimport { GlobalScope } from '../globalScope.js';\nimport {\n    AxisScales,\n    FieldOp,\n    Grouping,\n    InnerScope,\n} from '../interfaces.js';\n\nexport interface LayoutProps {\n}\n\nexport interface LayoutPair {\n    props?: LayoutProps;\n    layoutType: LayoutType;\n}\n\nexport interface LayoutBuildProps {\n    axesScales: AxisScales;\n    globalScope: GlobalScope;\n    parentScope: InnerScope;\n    groupings: Grouping[];\n    id: number;\n}\n\nexport class Layout {\n    protected prefix: string;\n    public id: number;\n\n    constructor(public props: LayoutProps & LayoutBuildProps) {\n        this.id = props.id;\n    }\n\n    public getGrouping(): string[] {\n        return null;\n    }\n\n    public getAggregateSumOp(): FieldOp {\n        return null;\n    }\n\n    public build(): InnerScope {\n        throw 'Not implemented';\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/scatter.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { SignalNames } from '../constants.js';\nimport { debounce, scatterSizedDiv } from '../defaults.js';\nimport { safeFieldName } from '../expr.js';\nimport { GlobalScales, InnerScope } from '../interfaces.js';\nimport { linearScale, pointScale } from '../scales.js';\nimport {\n    addData,\n    addMarks,\n    addOffsets,\n    addScales,\n    addSignals,\n    addTransforms,\n} from '../scope.js';\nimport { testForCollapseSelection } from '../selection.js';\nimport { Column, Dimension3D, View } from '@msrvida/chart-types';\nimport {\n    RectEncodeEntry,\n    RectMark,\n    Scale,\n    ScaleData,\n    SignalRef,\n    Transforms,\n} from 'vega-typings';\nimport { Extents } from '../types.js';\nimport { dataExtent } from '../transforms.js';\nimport { outerExtentSignal, shouldBeIntegralBinStep } from '../bin.js';\n\nexport interface ScatterProps extends LayoutProps {\n    x: Column;\n    y: Column;\n    z: Column;\n    size: Column;\n    scatterPointScaleDisplay: string;\n    zGrounded: string;\n    showAxes: boolean;\n    backgroundImageExtents: Extents;\n    view: View;\n}\n\nexport class Scatter extends Layout {\n    private names: {\n        aggregateData: string,\n        markData: string,\n        xDataExtent: string,\n        yDataExtent: string,\n        xExtent: string,\n        yExtent: string,\n        sizeExtent: string,\n        sizeRange: string,\n        sizeScale: string,\n        xScale: string,\n        yScale: string,\n        zScale: string,\n    };\n\n    constructor(public props: ScatterProps & LayoutBuildProps) {\n        super(props);\n        const p = this.prefix = `scatter_${this.id}`;\n        this.names = {\n            aggregateData: `data_${p}_aggregate`,\n            markData: `data_${p}_mark`,\n            xDataExtent: `${p}_xDataExtent`,\n            yDataExtent: `${p}_yDataExtent`,\n            xExtent: `${p}_xExtent`,\n            yExtent: `${p}_yExtent`,\n            sizeExtent: `${p}_sizeExtent`,\n            sizeRange: `${p}_sizeRange`,\n            sizeScale: `${p}_sizeScale`,\n            xScale: `scale_${p}_x`,\n            yScale: `scale_${p}_y`,\n            zScale: `scale_${p}_z`,\n        };\n    }\n\n    public build(): InnerScope {\n        const { names, prefix, props } = this;\n        const { backgroundImageExtents, globalScope, parentScope, scatterPointScaleDisplay, showAxes, size, view, x, y, z, zGrounded } = props;\n        const qsize = size && size.quantitative && size;\n\n        addSignals(globalScope.scope,\n            {\n                name: SignalNames.PointScale,\n                value: 5,\n                bind: {\n                    name: scatterPointScaleDisplay,\n                    debounce,\n                    input: 'range',\n                    min: 1,\n                    max: 10,\n                    step: 0.1,\n                },\n            },\n            {\n                name: SignalNames.ZGrounded,\n                value: false,\n                bind: {\n                    name: zGrounded,\n                    input: 'checkbox',\n                },\n            },\n        );\n\n        if (backgroundImageExtents) {\n            addTransforms(globalScope.data,\n                dataExtent(x, names.xDataExtent),\n                dataExtent(y, names.yDataExtent),\n            );\n            const xSignal = outerExtentSignal(names.xExtent, backgroundImageExtents.left, backgroundImageExtents.right, names.xDataExtent);\n            const ySignal = outerExtentSignal(names.yExtent, backgroundImageExtents.bottom, backgroundImageExtents.top, names.yDataExtent);\n            addSignals(globalScope.scope, xSignal, ySignal);\n        }\n\n        if (qsize) {\n            addTransforms(globalScope.data,\n                {\n                    type: 'extent',\n                    field: safeFieldName(qsize.name),\n                    signal: names.sizeExtent,\n                },\n            );\n            addScales(globalScope.scope,\n                {\n                    name: names.sizeScale,\n                    type: 'pow',\n                    exponent: 0.5,\n                    domain: [0, { signal: `${names.sizeExtent}[1]` }],\n                    range: [0, { signal: names.sizeRange }],\n                },\n            );\n            addSignals(globalScope.scope,\n                {\n                    name: names.sizeRange,\n                    update: `min(${parentScope.sizeSignals.layoutHeight}, ${parentScope.sizeSignals.layoutWidth}) / ${scatterSizedDiv}`,\n                },\n            );\n        }\n\n        addData(globalScope.scope, {\n            name: names.markData,\n            source: globalScope.markDataName,\n            transform: [x, y, z].map(c => {\n                if (!c || !c.quantitative) return;\n                const t: Transforms = {\n                    type: 'filter',\n                    expr: `isValid(datum[${JSON.stringify(c.name)}])`,\n                };\n                return t;\n            }).filter(Boolean),\n        });\n        globalScope.setMarkDataName(names.markData);\n\n        const globalScales: GlobalScales = { showAxes, scales: {} };\n        const zValue = z ? `scale(${JSON.stringify(names.zScale)}, datum[${JSON.stringify(z.name)}])` : null;\n        const sizeValueSignal = qsize ?\n            `scale(${JSON.stringify(names.sizeScale)}, datum[${JSON.stringify(qsize.name)}]) * ${SignalNames.PointScale}`\n            : SignalNames.PointScale;\n\n        const update: RectEncodeEntry = {\n            height: [\n                {\n                    test: testForCollapseSelection(),\n                    value: 0,\n                },\n                {\n                    signal: sizeValueSignal,\n                },\n            ],\n            width: {\n                signal: sizeValueSignal,\n            },\n            ...z && {\n                z: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`,\n                    },\n                ],\n                zindex: [\n                    {\n                        signal: `${SignalNames.ZGrounded} ? 0 : ${zValue}`,\n                    },\n                ],\n                depth: [\n                    {\n                        test: testForCollapseSelection(),\n                        value: 0,\n                    },\n                    {\n                        signal: view === '3d'\n                            ? `${SignalNames.ZGrounded} ? ${zValue} : ${sizeValueSignal}`\n                            : '0',\n                    },\n                ],\n            },\n        };\n\n        const columnSignals: {\n            column: Column,\n            xyz: Dimension3D,\n            scaleName: string,\n            domain: ScaleData | SignalRef,\n            reverse: boolean,\n            signal: string\n        }[] = [\n            {\n                column: x,\n                xyz: 'x',\n                scaleName: names.xScale,\n                domain: backgroundImageExtents ?\n                    {\n                        signal: names.xExtent,\n                    }\n                    :\n                    {\n                        data: globalScope.data.name,\n                        field: safeFieldName(x.name),\n                    },\n                reverse: false,\n                signal: parentScope.sizeSignals.layoutWidth,\n            },\n            {\n                column: y,\n                xyz: 'y',\n                scaleName: names.yScale,\n                domain: backgroundImageExtents ?\n                    {\n                        signal: names.yExtent,\n                    }\n                    :\n                    {\n                        data: globalScope.data.name,\n                        field: safeFieldName(y.name),\n                    },\n                reverse: true,\n                signal: parentScope.sizeSignals.layoutHeight,\n            },\n            {\n                column: z,\n                xyz: 'z',\n                scaleName: names.zScale,\n                domain: {\n                    data: globalScope.data.name,\n                    field: z ? safeFieldName(z.name) : null,\n                },\n                reverse: false,\n                signal: view === '3d'\n                    ? `(${globalScope.zSize}) * ${SignalNames.ZProportion}`\n                    : `10 * ${SignalNames.ZProportion}`,\n            },\n        ];\n        columnSignals.forEach(cs => {\n            const { column, domain, reverse, scaleName, signal, xyz } = cs;\n            if (!column) return;\n            let scale: Scale;\n            if (column.quantitative) {\n                scale = linearScale(\n                    scaleName,\n                    domain,\n                    [0, { signal }],\n                    reverse,\n                    false,\n                    showAxes,\n                );\n                if (shouldBeIntegralBinStep(column)) {\n                    scale.bins = { step: 1 };\n                }\n            } else {\n                scale = pointScale(\n                    scaleName,\n                    globalScope.data.name,\n                    [0, { signal }],\n                    column.name,\n                    reverse,\n                );\n            }\n            globalScales.scales[xyz] = [scale];\n        });\n\n        const mark: RectMark = {\n            name: prefix,\n            type: 'rect',\n            from: { data: globalScope.markDataName },\n            encode: { update },\n        };\n        addMarks(globalScope.markGroup, mark);\n\n        return {\n            offsets: {\n                x: addOffsets(parentScope.offsets.x, `scale(${JSON.stringify(names.xScale)}, datum[${JSON.stringify(x.name)}])`),\n                y: addOffsets(parentScope.offsets.y, `scale(${JSON.stringify(names.yScale)}, datum[${JSON.stringify(y.name)}]) - ${sizeValueSignal}`),\n                h: sizeValueSignal,\n                w: sizeValueSignal,\n            },\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null,\n            },\n            globalScales,\n            mark,\n            encodingRuleMap: {\n                y: [\n                    {\n                        test: testForCollapseSelection(),\n                        signal: addOffsets(parentScope.offsets.y, parentScope.sizeSignals.layoutHeight),\n                    },\n                ],\n            },\n        };\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/square.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { FieldNames } from '../constants.js';\nimport { safeFieldName } from '../expr.js';\nimport { InnerScope } from '../interfaces.js';\nimport {\n    addMarks,\n    addOffsets,\n    addTransforms,\n    getGroupBy,\n} from '../scope.js';\nimport { testForCollapseSelection } from '../selection.js';\nimport { addZScale } from '../zBase.js';\nimport { Column, View } from '@msrvida/chart-types';\nimport { FormulaTransform, RectMark } from 'vega-typings';\n\nexport interface SquareProps extends LayoutProps {\n    sortBy: Column;\n    z: Column;\n    fillDirection: 'right-down' | 'right-up' | 'down-right';\n    maxGroupedUnits?: string;\n    maxGroupedFillSize?: string;\n    collapseYHeight?: boolean;\n    showAxes: boolean;\n    view: View;\n}\n\nexport class Square extends Layout {\n    private names: {\n        bandWidth: string,\n        maxGroupField: string,\n        maxGroupSignal: string,\n        stack0: string,\n        stack1: string,\n        zScale: string,\n    };\n\n    constructor(public props: SquareProps & LayoutBuildProps) {\n        super(props);\n        const p = this.prefix = `square_${this.id}`;\n        this.names = {\n            bandWidth: this.getBandWidth(),\n            maxGroupField: `${p}_max_group`,\n            maxGroupSignal: `${p}_max_grouping`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            zScale: `scale_${p}_z`,\n        };\n    }\n\n    public build(): InnerScope {\n        const { names, prefix, props } = this;\n        const { fillDirection, globalScope, groupings, parentScope, collapseYHeight, showAxes, sortBy, view, z } = props;\n        const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n\n        addTransforms(globalScope.data, {\n            type: 'stack',\n            groupby: getGroupBy(groupings).map(safeFieldName),\n            as: [names.stack0, names.stack1],\n            ...sortBy && {\n                sort: {\n                    field: safeFieldName(sortBy.name),\n                    order: 'ascending',\n                },\n            },\n        });\n\n        const { gap, levelSize, size, squaresPerBand } = this.addSignals();\n\n        const heightSignal = {\n            signal: fillDirection === 'down-right' ? size : levelSize,\n        };\n\n        const mark: RectMark = {\n            name: prefix,\n            type: 'rect',\n            from: {\n                data: globalScope.markDataName,\n            },\n            encode: {\n                update: {\n                    height: collapseYHeight ?\n                        [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            heightSignal,\n                        ]\n                        :\n                        heightSignal,\n                    width: {\n                        signal: fillDirection === 'down-right' ? levelSize : size,\n                    },\n                    ...z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                {\n                                    scale: names.zScale,\n                                    field: safeFieldName(z.name),\n                                }\n                                :\n                                {\n                                    value: 0,\n                                },\n                        ],\n                    },\n                },\n            },\n        };\n        addMarks(globalScope.markGroup, mark);\n\n        const { tx, ty } = this.transformXY(gap, levelSize, squaresPerBand);\n\n        return {\n            ...z && {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n            },\n            offsets: {\n                x: addOffsets(parentScope.offsets.x, tx.expr),\n                y: addOffsets(parentScope.offsets.y, ty.expr),\n                h: size,\n                w: size,\n            },\n            mark,\n            sizeSignals: {\n                layoutHeight: size,\n                layoutWidth: size,\n            },\n            ...collapseYHeight && {\n                encodingRuleMap: {\n                    y: [\n                        {\n                            test: testForCollapseSelection(),\n                            signal: parentScope.offsets.y,\n                        },\n                    ],\n                },\n            },\n        };\n    }\n\n    private getBandWidth() {\n        const { offsets } = this.props.parentScope;\n        switch (this.props.fillDirection) {\n            case 'down-right':\n                return offsets.h;\n            default:\n                return offsets.w;\n        }\n    }\n\n    private addSignals() {\n        const { names, props } = this;\n        const { fillDirection, globalScope, groupings, parentScope } = props;\n        let { maxGroupedFillSize, maxGroupedUnits } = props;\n\n        if (!maxGroupedUnits) {\n            if (groupings) {\n                addTransforms(globalScope.data,\n                    {\n                        type: 'joinaggregate',\n                        groupby: getGroupBy(groupings).map(safeFieldName),\n                        ops: ['count'],\n                        as: [names.maxGroupField],\n                    },\n                    {\n                        type: 'extent',\n                        field: names.maxGroupField,\n                        signal: names.maxGroupSignal,\n                    },\n                );\n                maxGroupedUnits = `(${names.maxGroupSignal}[1])`;\n            } else {\n                maxGroupedUnits = `length(data(${JSON.stringify(globalScope.data.name)}))`;\n            }\n        }\n        if (!maxGroupedFillSize) {\n            maxGroupedFillSize = fillDirection === 'down-right' ? parentScope.offsets.w : parentScope.offsets.h;\n        }\n\n        const aspect = `((${names.bandWidth}) / (${maxGroupedFillSize}))`;\n        const squaresPerBand = `ceil(sqrt(${maxGroupedUnits} * ${aspect}))`;\n        const gap = `min(0.1 * ((${names.bandWidth}) / (${squaresPerBand} - 1)), 1)`;\n        const size = `(((${names.bandWidth}) / ${squaresPerBand}) - ${gap})`;\n        const levels = `ceil(${maxGroupedUnits} / ${squaresPerBand})`;\n        const levelSize = `(((${maxGroupedFillSize}) / ${levels}) - ${gap})`;\n\n        return { gap, levelSize, size, squaresPerBand };\n    }\n\n    private transformXY(gap: string, levelSize: string, squaresPerBand: string) {\n        const { names, prefix } = this;\n        const compartment = `(${names.bandWidth}) / ${squaresPerBand} * ((datum[${JSON.stringify(names.stack0)}]) % ${squaresPerBand})`;\n        const level = `floor((datum[${JSON.stringify(names.stack0)}]) / ${squaresPerBand})`;\n        const { fillDirection, parentScope } = this.props;\n        const tx: FormulaTransform = {\n            type: 'formula',\n            expr: null,\n            as: `${prefix}_${FieldNames.OffsetX}`,\n        };\n        const ty: FormulaTransform = {\n            type: 'formula',\n            expr: null,\n            as: `${prefix}_${FieldNames.OffsetY}`,\n        };\n        switch (fillDirection) {\n            case 'down-right': {\n                tx.expr = `${level} * (${levelSize} + ${gap})`;\n                ty.expr = compartment;\n                break;\n            }\n            case 'right-up': {\n                tx.expr = compartment;\n                ty.expr = `${parentScope.offsets.h} - ${levelSize} - ${level} * (${levelSize} + ${gap})`;\n                break;\n            }\n            case 'right-down':\n            default: {\n                tx.expr = compartment;\n                ty.expr = `${level} * (${levelSize} + ${gap})`;\n                break;\n            }\n        }\n        return { tx, ty };\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/stack.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { safeFieldName } from '../expr.js';\nimport { InnerScope, LayoutOffsets } from '../interfaces.js';\nimport {\n    addData,\n    addMarks,\n    addOffsets,\n    addSignals,\n    addTransforms,\n    getGroupBy,\n} from '../scope.js';\nimport { testForCollapseSelection } from '../selection.js';\nimport { Column } from '@msrvida/chart-types';\nimport { LinearScale, RectMark } from 'vega-typings';\n\nexport interface StackProps extends LayoutProps {\n    sort: Column;\n    showAxes: boolean;\n}\n\nexport class Stack extends Layout {\n    private names: {\n        cube: string,\n        globalDataName: string,\n        globalExtent: string,\n        levelDataName: string,\n        count: string,\n        stack0: string,\n        stack1: string,\n        sequence: string,\n        sides: string,\n        size: string,\n        squared: string,\n        maxCount: string,\n        maxLevels: string,\n        zScale: string,\n    };\n\n    constructor(public props: StackProps & LayoutBuildProps) {\n        super(props);\n        const p = this.prefix = `stack_${this.id}`;\n        this.names = {\n            cube: `${p}_cube`,\n            globalDataName: `data_${p}_count`,\n            globalExtent: `${p}_global_extent`,\n            levelDataName: `data_${p}_level`,\n            count: `${p}_count`,\n            stack0: `${p}_stack0`,\n            stack1: `${p}_stack1`,\n            sequence: `data_${p}_sequence`,\n            sides: `${p}_sides`,\n            size: `${p}_size`,\n            squared: `${p}_squared`,\n            maxCount: `${p}_maxCount`,\n            maxLevels: `${p}_maxLevels`,\n            zScale: `${p}_zScale`,\n        };\n    }\n\n    public build(): InnerScope {\n        const { names, props } = this;\n        const { globalScope, groupings, parentScope, showAxes, sort } = props;\n        const { sizeSignals } = parentScope;\n\n        addTransforms(globalScope.data,\n            {\n                type: 'joinaggregate',\n                groupby: getGroupBy(groupings).map(safeFieldName),\n                ops: ['count'],\n                as: [names.count],\n            },\n            {\n                type: 'extent',\n                field: names.count,\n                signal: names.globalExtent,\n            },\n            {\n                type: 'stack',\n                groupby: getGroupBy(groupings).map(safeFieldName),\n                as: [names.stack0, names.stack1],\n                ...sort && {\n                    sort: {\n                        field: safeFieldName(sort.name),\n                        order: 'ascending',\n                    },\n                },\n            },\n        );\n\n        addData(globalScope.scope,\n            {\n                name: names.sequence,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `sqrt(${names.globalExtent}[1])`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.data * datum.data',\n                        as: 'squared',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.globalExtent}[1] / datum.squared)`,\n                        as: 'maxlevels',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(${names.size} - (datum.data - 1) * datum.data) / datum.data`,\n                        as: 'side',\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.side * datum.maxlevels + datum.maxlevels - 1',\n                        as: 'sidecubeheight',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(${globalScope.zSize} - datum.sidecubeheight)`,\n                        as: 'heightmatch',\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: 'heightmatch',\n                            order: 'ascending',\n                        },\n                    },\n                    {\n                        type: 'window',\n                        ops: ['row_number'],\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.row_number === 1',\n                    },\n                ],\n            },\n        );\n\n        addSignals(globalScope.scope,\n            {\n                name: names.size,\n                update: `min((${sizeSignals.layoutHeight}), (${sizeSignals.layoutWidth}))`,\n            },\n            {\n                name: names.squared,\n                update: `data('${names.sequence}')[0].squared`,\n            },\n            {\n                name: names.sides,\n                update: `sqrt(${names.squared})`,\n            },\n            {\n                name: names.cube,\n                update: `(${names.size} - (${names.sides} - 1)) / ${names.sides}`,\n            },\n            {\n                name: names.maxLevels,\n                update: `data('${names.sequence}')[0].maxlevels`,\n            },\n            {\n                name: names.maxCount,\n                update: `${names.maxLevels} * ${names.squared}`,\n            },\n        );\n\n        const zLevel = `floor(datum[${JSON.stringify(names.stack0)}] / ${names.squared})`;\n        const layerOrdinal = `(datum[${JSON.stringify(names.stack0)}] % ${names.squared})`;\n        const cubeX = `(${layerOrdinal} % ${names.sides})`;\n        const cubeY = `floor(${layerOrdinal} / ${names.sides})`;\n        const groupX = `(${sizeSignals.layoutWidth} - ${names.size}) / 2`;\n        const groupY = `(${sizeSignals.layoutHeight} - ${names.size}) / 2`;\n\n        const offsets: LayoutOffsets = {\n            x: addOffsets(parentScope.offsets.x, groupX, `${cubeX} * (${names.cube} + 1)`),\n            y: addOffsets(parentScope.offsets.y, groupY, `${cubeY} * (${names.cube} + 1)`),\n            h: names.size,\n            w: names.size,\n        };\n\n        const mark: RectMark = {\n            type: 'rect',\n            from: { data: this.names.levelDataName },\n            encode: {\n                update: {\n                    z: {\n                        signal: `${zLevel} * (${names.cube} + 1)`,\n                    },\n                    height: {\n                        signal: names.cube,\n                    },\n                    width: {\n                        signal: names.cube,\n                    },\n                    depth: {\n                        signal: names.cube,\n                    },\n                },\n            },\n        };\n        addMarks(globalScope.markGroup, mark);\n\n        const zScale: LinearScale = {\n            type: 'linear',\n            name: names.zScale,\n            domain: [\n                0,\n                {\n                    signal: names.maxCount,\n                },\n            ],\n            range: [\n                0,\n                {\n                    signal: `${names.maxLevels} * (${names.cube} + 1) - 1`,\n                },\n            ],\n            nice: false,\n        };\n\n        return {\n            offsets,\n            mark,\n            sizeSignals: {\n                layoutHeight: names.size,\n                layoutWidth: names.size,\n            },\n            globalScales: {\n                showAxes,\n                scales: {\n                    z: [zScale],\n                },\n            },\n            encodingRuleMap: {\n                y: [{\n                    test: testForCollapseSelection(),\n                    signal: parentScope.offsets.y,\n                }],\n                z: [{\n                    test: testForCollapseSelection(),\n                    value: 0,\n                }],\n                depth: [{\n                    test: testForCollapseSelection(),\n                    value: 0,\n                }],\n                height: [{\n                    test: testForCollapseSelection(),\n                    value: 0,\n                }],\n            },\n        };\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/strip.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { FieldNames } from '../constants.js';\nimport { safeFieldName } from '../expr.js';\nimport { InnerScope, LayoutOffsets, Orientation } from '../interfaces.js';\nimport {\n    addMarks,\n    addOffsets,\n    addTransforms,\n    getGroupBy,\n} from '../scope.js';\nimport { testForCollapseSelection } from '../selection.js';\nimport { addZScale } from '../zBase.js';\nimport { Column, View } from '@msrvida/chart-types';\nimport {\n    LinearScale,\n    RectMark,\n    SortOrder,\n    StackTransform,\n    Transforms,\n} from 'vega-typings';\n\nexport interface StripProps extends LayoutProps {\n    sortOrder: SortOrder;\n    addPercentageScale?: boolean;\n    orientation: Orientation;\n    size?: Column;\n    sort: Column;\n    z: Column;\n    showAxes: boolean;\n    view: View;\n}\n\nexport class Strip extends Layout {\n    private names: {\n        firstField: string,\n        lastField: string,\n        valueField: string,\n        scale: string,\n        zScale: string,\n    };\n\n    constructor(public props: StripProps & LayoutBuildProps) {\n        super(props);\n        const p = this.prefix = `strip_${this.id}`;\n        this.names = {\n            firstField: `${p}${FieldNames.First}`,\n            lastField: `${p}${FieldNames.Last}`,\n            valueField: `${p}${FieldNames.Value}`,\n            scale: `scale_${p}`,\n            zScale: `scale_${p}_z`,\n        };\n    }\n\n    public build(): InnerScope {\n        const { names, prefix, props } = this;\n        const { addPercentageScale, globalScope, groupings, orientation, showAxes, size, sort, sortOrder, parentScope, view, z } = props;\n\n        const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n\n        const horizontal = orientation === 'horizontal';\n\n        const transform: Transforms[] = [];\n\n        if (sort) {\n            transform.push({\n                type: 'collect',\n                sort: {\n                    field: safeFieldName(sort.name),\n                    order: sortOrder,\n                },\n            });\n        }\n\n        let stackField: string;\n        if (size) {\n            stackField = size.name;\n            transform.push({\n                type: 'filter',\n                expr: `datum[${JSON.stringify(size.name)}] > 0`,\n            });\n        } else {\n            stackField = names.valueField;\n            transform.push({\n                type: 'formula',\n                expr: '1',\n                as: stackField,\n            });\n        }\n\n        const stackTransform: StackTransform = {\n            type: 'stack',\n            field: safeFieldName(stackField),\n            offset: 'normalize',\n            as: [names.firstField, names.lastField],\n        };\n        if (groupings.length) {\n            stackTransform.groupby = getGroupBy(groupings).map(safeFieldName);\n        }\n        transform.push(stackTransform);\n\n        addTransforms(globalScope.data, ...transform);\n\n        const span = [names.lastField, names.firstField].map(f => `datum[${JSON.stringify(f)}]`).join(' - ');\n\n        const offsets: LayoutOffsets = {\n            x: addOffsets(parentScope.offsets.x,\n                horizontal ?\n                    `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.w})`\n                    :\n                    '',\n            ),\n            y: addOffsets(parentScope.offsets.y,\n                horizontal ?\n                    ''\n                    :\n                    `datum[${JSON.stringify(names.firstField)}] * (${parentScope.offsets.h})`,\n            ),\n            h: horizontal\n                ? parentScope.offsets.h\n                : `(${span}) * (${parentScope.offsets.h})`,\n            w: horizontal\n                ? `(${span}) * (${parentScope.offsets.w})`\n                : parentScope.offsets.w,\n        };\n\n        const mark: RectMark = {\n            name: prefix,\n            type: 'rect',\n            from: { data: globalScope.markDataName },\n            encode: {\n                update: {\n                    height: {\n                        signal: offsets.h,\n                    },\n                    width: {\n                        signal: offsets.w,\n                    },\n                    ...z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                {\n                                    scale: names.zScale,\n                                    field: safeFieldName(z.name),\n                                }\n                                :\n                                {\n                                    value: 0,\n                                },\n                        ],\n                    },\n                },\n            },\n        };\n\n        addMarks(globalScope.markGroup, mark);\n\n        let percentageScale: LinearScale[];\n        if (addPercentageScale) {\n            percentageScale = [{\n                type: 'linear',\n                name: names.scale,\n                domain: [0, 100],\n                range: horizontal ?\n                    [\n                        0,\n                        {\n                            signal: parentScope.sizeSignals.layoutWidth,\n                        },\n                    ]\n                    :\n                    [\n                        {\n                            signal: parentScope.sizeSignals.layoutHeight,\n                        },\n                        0,\n                    ]\n                ,\n            }];\n        }\n\n        return {\n            globalScales: {\n                showAxes,\n                scales: {\n                    x: horizontal ? percentageScale : undefined,\n                    y: horizontal ? undefined : percentageScale,\n                    z: zScale && [zScale],\n                },\n            },\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null,\n            },\n            mark,\n        };\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/treemap.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { SignalNames } from '../constants.js';\nimport { safeFieldName } from '../expr.js';\nimport { InnerScope, LayoutOffsets } from '../interfaces.js';\nimport {\n    addData,\n    addMarks,\n    addOffsets,\n    addSignals,\n    addTransforms,\n    getGroupBy,\n} from '../scope.js';\nimport { testForCollapseSelection } from '../selection.js';\nimport { addZScale } from '../zBase.js';\nimport { Column, View } from '@msrvida/chart-types';\nimport {\n    Data,\n    GroupMark,\n    RectMark,\n    Scope,\n} from 'vega-typings';\n\nexport interface TreemapProps extends LayoutProps {\n    corner: 'top-left' | 'bottom-left';\n    group?: Column;\n    size: Column;\n    treeMapMethod: string;\n    z: Column;\n    showAxes: boolean;\n    view: View;\n}\n\nexport class Treemap extends Layout {\n    private names: {\n        dataName: string,\n        dataHeightWidth: string,\n        dataExtents: string,\n        dataFacet: string,\n        dataFacetMark: string,\n        fieldX0: string,\n        fieldY0: string,\n        fieldX1: string,\n        fieldY1: string,\n        fieldDepth: string,\n        fieldChildren: string,\n        fieldHeight: string,\n        fieldWidth: string,\n        heightExtent: string,\n        widthExtent: string,\n        zScale: string,\n    };\n\n    constructor(public props: TreemapProps & LayoutBuildProps) {\n        super(props);\n        const p = this.prefix = `treemap_${this.id}`;\n        this.names = {\n            dataName: `data_${p}`,\n            dataHeightWidth: `data_${p}_hw`,\n            dataExtents: `data_${p}_extents`,\n            dataFacet: `data_${p}_facet`,\n            dataFacetMark: `data_${p}_facetMark`,\n            fieldChildren: `${p}_children`,\n            fieldDepth: `${p}_depth`,\n            fieldX0: `${p}_x0`,\n            fieldX1: `${p}_x1`,\n            fieldY0: `${p}_y0`,\n            fieldY1: `${p}_y1`,\n            fieldHeight: `${p}_h`,\n            fieldWidth: `${p}_w`,\n            heightExtent: `${p}_heightExtent`,\n            widthExtent: `${p}_widthExtent`,\n            zScale: `scale_${p}_z`,\n        };\n    }\n\n    public build(): InnerScope {\n        const { names, props } = this;\n        const { globalScope, parentScope, showAxes, treeMapMethod, z } = props;\n\n        const zScale = addZScale(z, globalScope.zSize, globalScope.data.name, names.zScale);\n\n        const offsets: LayoutOffsets = {\n            x: addOffsets(parentScope.offsets.x, fn(names.fieldX0)),\n            y: addOffsets(parentScope.offsets.y, fn(names.fieldY0)),\n            h: subtract(names.fieldY1, names.fieldY0),\n            w: subtract(names.fieldX1, names.fieldX0),\n        };\n\n        const mark = this.transformedMark(offsets);\n\n        addSignals(globalScope.scope, {\n            name: SignalNames.TreeMapMethod,\n            value: 'squarify',\n            bind: {\n                name: treeMapMethod,\n                input: 'select',\n                options: [\n                    'squarify', 'binary',\n                ],\n            },\n        });\n\n        return {\n            ...z && {\n                globalScales: {\n                    showAxes,\n                    scales: {\n                        z: [zScale],\n                    },\n                },\n            },\n            mark,\n            offsets,\n            sizeSignals: {\n                layoutHeight: null,\n                layoutWidth: null,\n            },\n        };\n    }\n\n    private transformedMark(offsets: LayoutOffsets) {\n        const { names, props } = this;\n        const { globalScope, groupings, parentScope } = props;\n\n        if (groupings.length) {\n            //treemap transform can't have it's boundary size grouped, so we need to facet the data.\n\n            addData(globalScope.scope,\n                {\n                    name: names.dataHeightWidth,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.h,\n                            as: names.fieldHeight,\n                        },\n                        {\n                            type: 'formula',\n                            expr: parentScope.offsets.w,\n                            as: names.fieldWidth,\n                        },\n                    ],\n                },\n            );\n\n            const treemapData: Data = {\n                name: names.dataFacetMark,\n                source: names.dataFacet,\n            };\n\n            const facets: GroupMark = {\n                type: 'group',\n                from: {\n                    facet: {\n                        name: names.dataFacet,\n                        data: names.dataHeightWidth,\n                        groupby: getGroupBy(groupings).map(safeFieldName),\n                    },\n                },\n                data: [\n                    {\n                        name: names.dataExtents,\n                        source: names.dataFacet,\n                        transform: [\n                            {\n                                type: 'extent',\n                                field: names.fieldHeight,\n                                signal: names.heightExtent,\n                            },\n                            {\n                                type: 'extent',\n                                field: names.fieldWidth,\n                                signal: names.widthExtent,\n                            },\n                        ],\n                    },\n                    treemapData,\n                ],\n            };\n\n            globalScope.setMarkDataName(names.dataFacetMark);\n\n            addMarks(globalScope.markGroup, facets);\n\n            //assign new markgroup after adding mark to original group\n            globalScope.setMarkGroup(facets);\n\n            this.treemapTransform(treemapData, `${names.widthExtent}[0]`, `${names.heightExtent}[0]`);\n            return this.addMark(offsets, facets, globalScope.markDataName);\n        } else {\n            this.treemapTransform(globalScope.data, parentScope.offsets.w, parentScope.offsets.h);\n            return this.addMark(offsets, globalScope.markGroup, globalScope.markDataName);\n        }\n    }\n\n    private addMark(offsets: LayoutOffsets, markParent: Scope, markDataName: string) {\n        const { names, prefix, props } = this;\n        const { view, z } = props;\n        const mark: RectMark = {\n            name: prefix,\n            type: 'rect',\n            from: { data: markDataName },\n            encode: {\n                update: {\n                    width: {\n                        signal: offsets.w,\n                    },\n                    height: {\n                        signal: offsets.h,\n                    },\n                    ...z && {\n                        z: { value: 0 },\n                        depth: [\n                            {\n                                test: testForCollapseSelection(),\n                                value: 0,\n                            },\n                            view === '3d'\n                                ?\n                                {\n                                    scale: names.zScale,\n                                    field: safeFieldName(z.name),\n                                }\n                                :\n                                {\n                                    value: 0,\n                                },\n                        ],\n                    },\n                },\n            },\n        };\n        addMarks(markParent, mark);\n        return mark;\n    }\n\n    private treemapTransform(treemapData: Data, widthSignal: string, heightSignal: string) {\n        const { names, props } = this;\n        const { group, size } = props;\n        addTransforms(treemapData,\n            {\n                type: 'filter',\n                expr: `datum[${JSON.stringify(size.name)}] > 0`,\n            },\n            {\n                type: 'nest',\n                keys: [(group && group.name) || '__NONE__'],\n            },\n            {\n                type: 'treemap',\n                field: safeFieldName(size.name),\n                sort: { field: 'value', order: 'descending' },\n                round: true,\n                method: { signal: SignalNames.TreeMapMethod },\n                paddingInner: 1,\n                paddingOuter: 0,\n                size: [\n                    { signal: widthSignal },\n                    { signal: heightSignal },\n                ],\n                as: [\n                    names.fieldX0,\n                    names.fieldY0,\n                    names.fieldX1,\n                    names.fieldY1,\n                    names.fieldDepth,\n                    names.fieldChildren,\n                ],\n            },\n        );\n    }\n}\n\nfunction fn(n: string) {\n    return `datum[${JSON.stringify(n)}]`;\n}\n\nfunction subtract(...fields: string[]) {\n    return fields.map(n => fn(n)).join(' - ');\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/layouts/wrap.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layout, LayoutBuildProps, LayoutProps } from './layout.js';\nimport { binnable, Binnable } from '../bin.js';\nimport { FieldNames, SignalNames } from '../constants.js';\nimport { safeFieldName } from '../expr.js';\nimport { displayBin, serializeAsVegaExpression } from '../facetSearch.js';\nimport { addFacetCellTitles } from '../facetTitle.js';\nimport {\n    DiscreteColumn,\n    InnerScope,\n    LayoutOffsets,\n    SizeSignals,\n} from '../interfaces.js';\nimport { createOrdinals } from '../ordinal.js';\nimport {\n    addData,\n    addMarks,\n    addOffsets,\n    addSignals,\n    addTransforms,\n} from '../scope.js';\nimport { modifySignal } from '../signals.js';\nimport { Data, GroupEncodeEntry, GroupMark } from 'vega-typings';\n\nexport interface WrapProps extends LayoutProps {\n    axisTextColor: string;\n    cellTitles: boolean;\n    groupby: DiscreteColumn;\n}\n\nexport class Wrap extends Layout {\n    private bin: Binnable;\n    private names: {\n        outputData: string,\n        rowColumnDataName: string,\n        cellHeight: string,\n        cellWidth: string,\n        fits: string,\n        target: string,\n        minArea: string,\n        aspect: string,\n        minAspect: string,\n        idealAspect: string,\n        dataLength: string,\n        rxc0: string,\n        rxc1: string,\n        rxc2: string,\n        rxc: string,\n        growColCount: string,\n        growCellWidth: string,\n        fitsArea: string,\n        colCount: string\n    };\n\n    constructor(public props: WrapProps & LayoutBuildProps) {\n        super(props);\n        const p = this.prefix = `wrap_${this.id}`;\n        this.bin = binnable(this.prefix, props.globalScope.data.name, props.groupby);\n        this.names = {\n            outputData: `data_${p}_out`,\n            rowColumnDataName: `data_${p}_row_col`,\n            cellHeight: `${p}_cellHeight`,\n            cellWidth: `${p}_cellWidth`,\n            fits: `${p}_fits`,\n            target: `${p}_target`,\n            minArea: `${p}_minArea`,\n            aspect: `${p}_aspect`,\n            minAspect: `${p}_minAspect`,\n            idealAspect: `${p}_idealAspect`,\n            dataLength: `${p}_dataLength`,\n            rxc0: `${p}_rxc0`,\n            rxc1: `${p}_rxc1`,\n            rxc2: `${p}_rxc2`,\n            rxc: `${p}_rxc`,\n            growColCount: `${p}_growColCount`,\n            growCellWidth: `${p}_growCellWidth`,\n            fitsArea: `${p}_fitsArea`,\n            colCount: `${p}_colCount`,\n        };\n    }\n\n    public getGrouping() {\n        return this.bin.fields;\n    }\n\n    public build(): InnerScope {\n        const { bin, names, prefix, props } = this;\n        const { axisTextColor, cellTitles, globalScope, parentScope } = props;\n\n        let ordinalBinData: string;\n\n        if (bin.native === false) {\n            addSignals(globalScope.scope, ...bin.signals);\n            addTransforms(globalScope.data, ...bin.transforms);\n            addData(globalScope.scope, bin.dataSequence);\n            addTransforms(bin.dataSequence, {\n                type: 'formula',\n                expr: `indata(${JSON.stringify(globalScope.data.name)}, ${JSON.stringify(bin.fields[0])}, datum[${JSON.stringify(bin.fields[0])}])`,\n                as: FieldNames.Contains,\n            });\n            ordinalBinData = bin.dataSequence.name;\n        } else {\n            const ord = createOrdinals(globalScope.data.name, prefix, bin.fields, 'ascending');\n            addData(globalScope.scope, ord.data);\n            ordinalBinData = ord.data.name;\n        }\n\n        addData(globalScope.scope,\n            {\n                name: names.rxc0,\n                transform: [\n                    {\n                        type: 'sequence',\n                        start: 1,\n                        stop: {\n                            signal: `ceil(sqrt(${names.dataLength})) + 1`,\n                        },\n                    },\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.data)`,\n                        as: 'complement',\n                    },\n                ],\n            },\n            {\n                name: names.rxc1,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['data'],\n                        as: ['cols'],\n                    },\n                ],\n            },\n            {\n                name: names.rxc2,\n                source: names.rxc0,\n                transform: [\n                    {\n                        type: 'project',\n                        fields: ['complement'],\n                        as: ['cols'],\n                    },\n                ],\n            },\n            {\n                name: names.rxc,\n                source: [names.rxc1, names.rxc2],\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `ceil(${names.dataLength} / datum.cols)`,\n                        as: 'rows',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutWidth} / datum.cols`,\n                        as: 'cellw',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.cols === 1 ? max(datum.cellw, ${SignalNames.MinCellWidth}) : datum.cellw`,\n                        as: 'cellw',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${parentScope.sizeSignals.layoutHeight} / datum.rows`,\n                        as: 'cellh',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `datum.rows === 1 ? max(datum.cellh, ${SignalNames.MinCellHeight}) : datum.cellh`,\n                        as: 'cellh',\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum.cellw >= ${SignalNames.MinCellWidth} && datum.cellh >= ${SignalNames.MinCellHeight})`,\n                        as: 'meetsmin',\n                    },\n                    {\n                        type: 'filter',\n                        expr: 'datum.meetsmin',\n                    },\n                    {\n                        type: 'formula',\n                        expr: 'datum.cellw / datum.cellh',\n                        as: names.aspect,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `abs(datum.${names.aspect} - ${names.target})`,\n                        as: names.idealAspect,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `${names.dataLength} / (datum.cols * datum.rows)`,\n                        as: 'coverage',\n                    },\n                    {\n                        type: 'collect',\n                        sort: {\n                            field: [names.idealAspect, 'coverage'],\n                            order: ['ascending', 'descending'],\n                        },\n                    },\n                ],\n            },\n            {\n                name: names.rowColumnDataName,\n                source: ordinalBinData,\n                transform: [\n                    {\n                        type: 'formula',\n                        expr: `floor((datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) / ${names.colCount})`,\n                        as: FieldNames.WrapRow,\n                    },\n                    {\n                        type: 'formula',\n                        expr: `(datum[${JSON.stringify(FieldNames.Ordinal)}] - 1) % ${names.colCount}`,\n                        as: FieldNames.WrapCol,\n                    },\n                    {\n                        type: 'formula',\n                        expr: serializeAsVegaExpression(bin, FieldNames.First, FieldNames.Last),\n                        as: FieldNames.FacetSearch,\n                    },\n                    {\n                        type: 'formula',\n                        expr: displayBin(bin),\n                        as: FieldNames.FacetTitle,\n                    },\n                ],\n            },\n        );\n\n        const dataOut: Data = {\n            name: names.outputData,\n            source: globalScope.data.name,\n            transform: [\n                {\n                    type: 'lookup',\n                    from: names.rowColumnDataName,\n                    key: safeFieldName(bin.fields[0]),\n                    fields: [bin.fields[0]].map(safeFieldName),\n                    values: [FieldNames.WrapRow, FieldNames.WrapCol],\n                },\n            ],\n        };\n        addData(globalScope.scope, dataOut);\n        globalScope.setMarkDataName(names.outputData);\n\n        addSignals(globalScope.scope,\n            {\n                name: names.minAspect,\n                update: `${SignalNames.MinCellWidth} / ${SignalNames.MinCellHeight}`,\n            },\n            {\n                name: names.target,\n                update: `${names.minAspect} === 1 ? ${1.2} : ${names.minAspect}`,\n            },\n            {\n                name: names.minArea,\n                update: `${SignalNames.MinCellWidth}*${SignalNames.MinCellHeight}`,\n            },\n            {\n                name: names.aspect,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${parentScope.sizeSignals.layoutHeight}`,\n            },\n            {\n                name: names.dataLength,\n                update: `data(${JSON.stringify(ordinalBinData)}).length`,\n            },\n            {\n                name: names.growColCount,\n                update: `max(floor(${parentScope.sizeSignals.layoutWidth} / ${SignalNames.MinCellWidth}), 1)`,\n            },\n            {\n                name: names.growCellWidth,\n                update: `${parentScope.sizeSignals.layoutWidth} / ${names.growColCount}`,\n            },\n            {\n                name: names.fitsArea,\n                update: `((${names.dataLength} * ${names.minArea}) <= (${parentScope.sizeSignals.layoutWidth} * ${parentScope.sizeSignals.layoutHeight}))`,\n            },\n            {\n                name: names.fits,\n                update: `${names.fitsArea} && length(data(${JSON.stringify(names.rxc)})) > 0`,\n            },\n            {\n                name: names.colCount,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cols : ${names.growColCount}`,\n            },\n            {\n                name: names.cellWidth,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellw : ${names.growCellWidth}`,\n            },\n            {\n                name: names.cellHeight,\n                update: `${names.fits} ? data(${JSON.stringify(names.rxc)})[0].cellh : ${SignalNames.MinCellHeight}`,\n            },\n        );\n\n        modifySignal(globalScope.signals.plotHeightOut, 'max', `(${names.cellHeight} * ceil(${names.dataLength} / ${names.colCount}))`);\n        modifySignal(globalScope.signals.plotWidthOut, 'max', `(${names.cellWidth} * ${names.colCount})`);\n\n        const signalH = [names.cellHeight, SignalNames.FacetPaddingTop, SignalNames.FacetPaddingBottom].join(' - ');\n        const signalW = [names.cellWidth, SignalNames.FacetPaddingLeft].join(' - ');\n        const signalX = addOffsets(parentScope.offsets.x, `datum[${JSON.stringify(FieldNames.WrapCol)}] * ${names.cellWidth}`, SignalNames.FacetPaddingLeft);\n        const signalY = addOffsets(parentScope.offsets.y, `datum[${JSON.stringify(FieldNames.WrapRow)}] * ${names.cellHeight}`, SignalNames.FacetPaddingTop);\n\n        const update: GroupEncodeEntry = {\n            height: {\n                signal: signalH,\n            },\n            width: {\n                signal: signalW,\n            },\n            x: {\n                signal: signalX,\n            },\n            y: {\n                signal: signalY,\n            },\n        };\n\n        const offsets: LayoutOffsets = {\n            x: signalX,\n            y: signalY,\n            h: signalH,\n            w: signalW,\n        };\n\n        const group: GroupMark = {\n            style: 'cell',\n            name: prefix,\n            type: 'group',\n            from: {\n                data: names.rowColumnDataName,\n            },\n            encode: { update },\n        };\n        addMarks(globalScope.markGroup, group);\n\n        const sizeSignals: SizeSignals = {\n            layoutHeight: `(${names.cellHeight} - ${SignalNames.FacetPaddingTop} - ${SignalNames.FacetPaddingBottom})`,\n            layoutWidth: `(${names.cellWidth} - ${SignalNames.FacetPaddingLeft})`,\n            colCount: names.colCount,\n            rowCount: `ceil(${names.dataLength} / ${names.colCount})`,\n        };\n\n        if (cellTitles) {\n            addFacetCellTitles(group, sizeSignals, axisTextColor);\n        }\n\n        return {\n            facetScope: group,\n            sizeSignals,\n            offsets,\n        };\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/legends.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { SpecContext } from './types.js';\nimport { Legend } from 'vega-typings';\n\nfunction legend(column: Column, fill: string) {\n    const legend: Legend = {\n        orient: 'none',\n        title: column.name,\n        fill,\n        encode: {\n            symbols: {\n                update: {\n                    shape: {\n                        value: 'square',\n                    },\n                },\n            },\n        },\n    };\n    if (column.quantitative) {\n        legend.type = 'symbol';\n        legend.format = '~r';\n    }\n    return legend;\n}\n\nexport function getLegends(context: SpecContext, fill: string) {\n    const { specColumns, insight } = context;\n    if (specColumns.color && !insight.hideLegend && !insight.directColor && !specColumns.color.isColorData) {\n        return [legend(specColumns.color, fill)];\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/ordinal.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { FieldNames } from './constants.js';\nimport { safeFieldName } from './expr.js';\nimport { Data, OrdinalScale, SortOrder } from 'vega-typings';\n\nexport interface OrdinalResult {\n    data: Data;\n    scale: OrdinalScale;\n}\n\nexport function createOrdinals(source: string, prefix: string, binFields: string[], sortOrder: SortOrder): OrdinalResult {\n    const _binFields = binFields.map(safeFieldName);\n    const dataName = `${prefix}_bin_order`;\n    const data: Data = {\n        name: dataName,\n        source,\n        transform: [\n            {\n                type: 'aggregate',\n                groupby: _binFields,\n            },\n            {\n                type: 'collect',\n                sort: {\n                    field: _binFields,\n                    order: _binFields.map(f => sortOrder),\n                },\n            },\n            {\n                type: 'window',\n                ops: ['row_number'],\n                as: [FieldNames.Ordinal],\n            },\n        ],\n    };\n    return {\n        data,\n        scale: ordinalScale(dataName, `scale_${prefix}_order`, binFields),\n    };\n}\n\nexport function ordinalScale(dataName: string, scaleName: string, binFields: string[]): OrdinalScale {\n    return {\n        type: 'ordinal',\n        name: scaleName,\n        domain: {\n            data: dataName,\n            field: safeFieldName(binFields[0]),\n        },\n        range: {\n            data: dataName,\n            field: FieldNames.Ordinal,\n        },\n    };\n}\n\n"
  },
  {
    "path": "packages/sanddance-specs/src/scales.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { ColorScaleNone, SignalNames } from './constants.js';\nimport { safeFieldName } from './expr.js';\nimport { ColorBin } from './types.js';\nimport {\n    LinearScale,\n    PointScale,\n    QuantileScale,\n    QuantizeScale,\n    RangeBand,\n    RangeScheme,\n    ScaleData,\n    SignalRef,\n} from 'vega-typings';\n\nexport function linearScale(scaleName: string, domain: ScaleData | SignalRef, range: RangeScheme, reverse: boolean, zero: boolean, nice = true) {\n    const scale: LinearScale = {\n        name: scaleName,\n        type: 'linear',\n        range,\n        round: true,\n        reverse,\n        domain,\n        zero,\n        nice,\n    };\n    return scale;\n}\n\nexport function pointScale(scaleName: string, data: string, range: RangeBand, field: string, reverse?: boolean) {\n    const scale: PointScale = {\n        name: scaleName,\n        type: 'point',\n        range,\n        domain: {\n            data,\n            field: safeFieldName(field),\n            sort: true,\n        },\n        padding: 0.5,\n    };\n    if (reverse !== undefined) {\n        scale.reverse = reverse;\n    }\n    return scale;\n}\n\nexport function binnableColorScale(scaleName: string, colorBin: ColorBin, data: string, field: string, scheme?: string) {\n    scheme = scheme || ColorScaleNone;\n    const domain: ScaleData = {\n        data,\n        field: safeFieldName(field),\n    };\n    const range: RangeScheme = {\n        scheme,\n    };\n    const reverse: SignalRef = { signal: SignalNames.ColorReverse };\n    if (colorBin !== 'continuous') {\n        range.count = { signal: SignalNames.ColorBinCount };\n    }\n    switch (colorBin) {\n        case 'continuous': {\n            const sequentialScale: LinearScale = {\n                name: scaleName,\n                type: 'linear',\n                domain,\n                range,\n                reverse,\n            };\n            return sequentialScale;\n        }\n        case 'quantile': {\n            const quantileScale: QuantileScale = {\n                name: scaleName,\n                type: 'quantile',\n                domain,\n                range,\n                reverse,\n            };\n            return quantileScale;\n        }\n        default: {\n            const quantizeScale: QuantizeScale = {\n                name: scaleName,\n                type: 'quantize',\n                domain,\n                range,\n                reverse,\n            };\n            return quantizeScale;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/scope.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Grouping } from './interfaces.js';\nimport {\n    Axis,\n    Data,\n    Mark,\n    Scale,\n    Scope,\n    Signal,\n    Transforms,\n} from 'vega-typings';\n\nexport function addAxes(scope: Scope, ...axes: Axis[]) {\n    if (!axes || !axes.length) return;\n    if (!scope.axes) scope.axes = [];\n    scope.axes.push(...axes.filter(Boolean));\n}\n\nexport function addData(scope: Scope, ...datas: Data[]) {\n    if (!datas || !datas.length) return;\n    if (!scope.data) scope.data = [];\n    scope.data.push(...datas.filter(Boolean));\n}\n\nexport function addMarks(scope: Scope, ...marks: Mark[]) {\n    if (!marks || !marks.length) return;\n    if (!scope.marks) scope.marks = [];\n    scope.marks.push(...marks.filter(Boolean));\n}\n\nexport function addScales(scope: Scope, ...scales: Scale[]) {\n    if (!scales || !scales.length) return;\n    if (!scope.scales) scope.scales = [];\n    scope.scales.push(...scales.filter(Boolean));\n}\n\nexport function addSignals(scope: Scope, ...signals: Signal[]) {\n    if (!signals || !signals.length) return;\n    if (!scope.signals) scope.signals = [];\n    scope.signals.push(...signals.filter(Boolean));\n}\n\nexport function addTransforms(data: Data, ...transforms: Transforms[]) {\n    if (!transforms || !transforms.length) return;\n    if (!data.transform) data.transform = [];\n    data.transform.push(...transforms.filter(Boolean));\n}\n\nexport function getDataByName(data: Data[], dataName: string) {\n    for (let i = 0; i < data.length; i++) {\n        if (data[i].name === dataName) return { data: data[i], index: i };\n    }\n}\n\nexport function getGroupBy(groupings: Grouping[]) {\n    const groupby = groupings.map(g => g.groupby);\n    return groupby.reduce((acc, val) => acc.concat(val), []);\n}\n\nexport function addOffsets(...offsets: string[]) {\n    return offsets.filter(Boolean).join(' + ');\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/selection.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { FieldNames } from './constants.js';\n\nexport function testForCollapseSelection() {\n    return `datum.${FieldNames.Collapsed}`;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/signals.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { NewSignal } from 'vega-typings/types';\nimport { SignalNames } from './constants.js';\nimport { debounce } from './defaults.js';\nimport { SpecContext } from './types.js';\n\nexport const defaultZProportion = 0.6;\n\nexport function textSignals(context: SpecContext, heightSignal: string) {\n    const { specViewOptions } = context;\n    const signals: NewSignal[] = [\n        {\n            name: SignalNames.ZProportion,\n            value: defaultZProportion,\n            bind: {\n                name: specViewOptions.language.zScaleProportion,\n                debounce,\n                input: 'range',\n                min: 0.1,\n                max: 2,\n                step: 0.1,\n            },\n        },\n        {\n            name: SignalNames.ZHeight,\n            update: `${heightSignal} * ${SignalNames.ZProportion}`,\n        },\n        {\n            name: SignalNames.TextScale,\n            value: 1.2,\n            bind: {\n                name: specViewOptions.language.textScaleSignal,\n                debounce,\n                input: 'range',\n                min: 0.5,\n                max: 2,\n                step: 0.1,\n            },\n        },\n        {\n            name: SignalNames.TextSize,\n            update: `${SignalNames.TextScale} * 10`,\n        },\n        {\n            name: SignalNames.TextTitleSize,\n            update: `${SignalNames.TextScale} * 15`,\n        },\n        {\n            name: SignalNames.TextAngleX,\n            value: 30,\n            bind: {\n                name: specViewOptions.language.xAxisTextAngleSignal,\n                debounce,\n                input: 'range',\n                min: 0,\n                max: 90,\n                step: 1,\n            },\n        },\n        {\n            name: SignalNames.TextAngleY,\n            value: 0,\n            bind: {\n                name: specViewOptions.language.yAxisTextAngleSignal,\n                debounce,\n                input: 'range',\n                min: -90,\n                max: 0,\n                step: 1,\n            },\n        },\n        {\n            name: SignalNames.MarkOpacity,\n            value: 1,\n            bind: {\n                name: specViewOptions.language.markOpacitySignal,\n                debounce,\n                input: 'range',\n                min: 0.1,\n                max: 1,\n                step: 0.05,\n            },\n        },\n    ];\n    return signals;\n}\n\nexport function colorBinCountSignal(context: SpecContext) {\n    const { specViewOptions } = context;\n    const signal: NewSignal = {\n        name: SignalNames.ColorBinCount,\n        value: 7,\n        bind: {\n            name: specViewOptions.language.colorBinCount,\n            debounce,\n            input: 'range',\n            min: 1,\n            max: specViewOptions.maxLegends + 1,\n            step: 1,\n        },\n    };\n    return signal;\n}\n\nexport function colorReverseSignal(context: SpecContext) {\n    const { specViewOptions } = context;\n    const signal: NewSignal = {\n        name: SignalNames.ColorReverse,\n        value: false,\n        bind: {\n            name: specViewOptions.language.colorReverse,\n            input: 'checkbox',\n        },\n    };\n    return signal;\n}\n\nexport function modifySignal(s: NewSignal, fn: string, update: string) {\n    s.update = `${fn}((${s.update}), (${update}))`;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/size.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SpecContext } from './types.js';\n\nexport function allowNoneForSize(specContext: SpecContext) {\n    switch (specContext.insight.totalStyle) {\n        case 'sum-strip':\n        case 'sum-strip-percent':\n        case 'sum-treemap':\n            return false;\n        default:\n            //if totalStyle is blank, count is assumed\n            return true;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/specBuilder.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { addGlobalAxes, AxesScopeMap } from './axes.js';\nimport { addColor } from './color.js';\nimport { FieldNames, ScaleNames, SignalNames } from './constants.js';\nimport {\n    axesOffsetX,\n    axesOffsetY,\n    axesTitlePaddingFacetX,\n    axesTitlePaddingFacetY,\n    axesTitlePaddingX,\n    axesTitlePaddingY,\n    facetPaddingBottom,\n    facetPaddingLeft,\n} from './defaults.js';\nimport { minFacetHeight, minFacetWidth } from './defaults.js';\nimport { FacetLayout } from './facetLayout.js';\nimport { addFacetAxesGroupMarks } from './facetTitle.js';\nimport { fill, opacity } from './fill.js';\nimport { GlobalScope, GlobalSignals } from './globalScope.js';\nimport {\n    AxisScales,\n    EncodingRule,\n    GlobalScales,\n    Grouping,\n    InnerScope,\n    SpecResult,\n} from './interfaces.js';\nimport { LayoutBuildProps, LayoutPair, LayoutProps } from './layouts/layout.js';\nimport {\n    addData,\n    addSignals,\n} from './scope.js';\nimport { textSignals } from './signals.js';\nimport { SpecCapabilities, SpecContext } from './types.js';\nimport {\n    GroupMark,\n    LinearScale,\n    Spec,\n} from 'vega-typings';\nimport { layoutClasses } from './layouts/index.js';\nimport { getImageMark } from './image.js';\n\nexport interface SpecBuilderProps {\n    axisScales?: AxisScales;\n    layouts: LayoutPair[];\n    errors?: string[];\n    specCapabilities: SpecCapabilities;\n    customZScale?: boolean;\n    facetLayout?: FacetLayout;\n    collapseFacetAxes?: boolean;\n}\n\nexport class SpecBuilder {\n    private globalSignals: GlobalSignals;\n\n    constructor(public props: SpecBuilderProps, public specContext: SpecContext) {\n        this.globalSignals = {\n            facetAxesAdjustX: { name: SignalNames.FacetAxesAdjustX, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingLeft.toString() : '0' },\n            facetAxesAdjustY: { name: SignalNames.FacetAxesAdjustY, update: props.facetLayout && props.collapseFacetAxes ? facetPaddingBottom.toString() : '0' },\n            minCellWidth: {\n                name: SignalNames.MinCellWidth,\n                update: `${minFacetWidth}`,\n            },\n            minCellHeight: { name: SignalNames.MinCellHeight, update: `${minFacetHeight}` },\n            plotOffsetLeft: { name: SignalNames.PlotOffsetLeft, update: '0' },\n            plotOffsetTop: { name: SignalNames.PlotOffsetTop, update: '0' },\n            plotOffsetBottom: { name: SignalNames.PlotOffsetBottom, update: '0' },\n            plotOffsetRight: { name: SignalNames.PlotOffsetRight, update: '0' },\n            plotHeightOut: { name: SignalNames.PlotHeightOut, update: SignalNames.PlotHeightIn },\n            plotWidthOut: { name: SignalNames.PlotWidthOut, update: SignalNames.PlotWidthIn },\n        };\n    }\n\n    public validate() {\n        const { specContext } = this;\n        const { specCapabilities } = this.props;\n        const { roles } = specCapabilities;\n        const required = roles.filter(r => {\n            switch (typeof r.allowNone) {\n                case 'boolean':\n                    return !r.allowNone;\n                case 'undefined':\n                    return true;\n                case 'function':\n                    return !r.allowNone(specContext);\n            }\n        });\n        const numeric = roles.filter(r => r.excludeCategoric);\n        const errors = required\n            .map(\n                r => {\n                    if (specContext.specColumns[r.role]) {\n                        return null;\n                    } else {\n                        return `Field ${r.role} is required.`;\n                    }\n                },\n            )\n            .concat(\n                numeric.map(\n                    r => {\n                        if (specContext.specColumns[r.role] && !specContext.specColumns[r.role].quantitative) {\n                            return `Field ${r.role} must be quantitative.`;\n                        } else {\n                            return null;\n                        }\n                    },\n                ),\n            )\n            .filter(Boolean);\n        const { backgroundImage } = specContext.insight;\n        if (backgroundImage && !backgroundImage.extents) {\n            errors.push('BackgroundImage must have extents.');\n        }\n        return errors;\n    }\n\n    public build(): SpecResult {\n        const { globalSignals, specContext } = this;\n        const { facetLayout, specCapabilities } = this.props;\n        const { insight, specColumns, specViewOptions } = specContext;\n        const dataName = 'data_source';\n        const { vegaSpec, groupMark } = this.initSpec(dataName);\n        const { topColorField, colorDataName } = addColor({\n            scope: vegaSpec,\n            dataName,\n            specContext,\n            scaleName: ScaleNames.Color,\n            legendDataName: 'data_legend',\n            topLookupName: 'data_topcolorlookup',\n            colorReverseSignalName: SignalNames.ColorReverse,\n        });\n        const globalScope = new GlobalScope({\n            dataName: colorDataName,\n            markGroup: groupMark,\n            scope: vegaSpec,\n            signals: globalSignals,\n        });\n        if (facetLayout) {\n            addSignals(vegaSpec,\n                {\n                    name: SignalNames.FacetPaddingBottom,\n                    update: `${facetLayout.facetPadding.bottom}`,\n                },\n                {\n                    name: SignalNames.FacetPaddingLeft,\n                    update: `${facetLayout.facetPadding.left}`,\n                },\n                {\n                    name: SignalNames.FacetPaddingTop,\n                    update: `${facetLayout.facetPadding.top}`,\n                },\n            );\n            globalSignals.plotOffsetTop.update = `${facetLayout.plotPadding.y}`;\n            globalSignals.plotOffsetRight.update = `${facetLayout.plotPadding.x}`;\n        }\n        const {\n            firstScope,\n            finalScope,\n            specResult,\n            allGlobalScales,\n            allEncodingRules,\n        } = this.iterateLayouts(globalScope, (i, innerScope) => {\n            if (facetLayout && i === 0) {\n                globalScope.zSize = innerScope.offsets.h;\n            }\n        });\n\n        if (specResult) {\n            return specResult;\n        }\n        if (allGlobalScales.length > 0) {\n            const plotHeightOut = globalSignals.plotHeightOut.name;\n            const plotWidthOut = globalSignals.plotWidthOut.name;\n\n            const colTitleScale: LinearScale = {\n                type: 'linear',\n                name: 'scale_facet_col_title',\n                domain: [0, 1],\n                range: [0, { signal: plotWidthOut }],\n            };\n\n            const rowTitleScale: LinearScale = {\n                type: 'linear',\n                name: 'scale_facet_row_title',\n                domain: [0, 1],\n                range: [{ signal: plotHeightOut }, 0],\n            };\n\n            const facetScope = facetLayout ? firstScope : null;\n\n            const backgroundGroup = facetLayout ? (facetScope.facetScope as GroupMark) : groupMark;\n            //TODO if capability and numeric x,y\n            if (insight.backgroundImage && specCapabilities.backgroundImage && specColumns.x?.quantitative && specColumns.y?.quantitative) {\n                //backgroundGroup.encode.update.fill = { value: 'pink' }\n                if (!backgroundGroup.marks) {\n                    backgroundGroup.marks = [];\n                }\n                const imageMark = getImageMark(insight.backgroundImage, allGlobalScales);\n                backgroundGroup.marks.unshift(imageMark);\n            }\n\n            const axesScopes: AxesScopeMap = facetLayout ?\n                addFacetAxesGroupMarks({\n                    globalScope: globalScope.scope,\n                    plotScope: groupMark,\n                    facetScope,\n                    colTitleScale,\n                    rowTitleScale,\n                    colSeqName: 'data_FacetCellColTitles',\n                    rowSeqName: 'data_FacetCellRowTitles',\n                })\n                :\n                {\n                    main: [{\n                        scope: groupMark,\n                        lines: true,\n                        labels: true,\n                        title: true,\n                    }],\n                };\n            addGlobalAxes({\n                globalScope,\n                allGlobalScales,\n                axisScales: this.props.axisScales,\n                plotOffsetSignals: { x: globalSignals.plotOffsetLeft, y: globalSignals.plotOffsetBottom },\n                axesOffsets: { x: axesOffsetX, y: axesOffsetY },\n                axesTitlePadding: facetLayout ? { x: axesTitlePaddingFacetX, y: axesTitlePaddingFacetY } : { x: axesTitlePaddingX, y: axesTitlePaddingY },\n                labelBaseline: { x: 'top', y: 'middle' },\n                specColumns,\n                specViewOptions,\n                axesScopes,\n                hideZAxis: !!facetLayout,\n                view: insight.view,\n            });\n        }\n\n        //add mark to the final scope\n        if (finalScope.mark) {\n            const { update } = finalScope.mark.encode;\n\n            const outputDataName = 'output';\n            finalScope.mark.from.data = outputDataName;\n            addData(globalScope.markGroup,\n                {\n                    name: outputDataName,\n                    source: globalScope.markDataName,\n                    transform: [\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.x,\n                            as: FieldNames.OffsetX,\n                        },\n                        {\n                            type: 'formula',\n                            expr: finalScope.offsets.y,\n                            as: FieldNames.OffsetY,\n                        },\n                    ],\n                },\n            );\n            update.x = {\n                field: FieldNames.OffsetX,\n            };\n            update.y = {\n                field: FieldNames.OffsetY,\n            };\n\n            allEncodingRules.forEach(map => {\n                for (const key in map) {\n                    if (update[key]) {\n                        const arrIn = map[key];\n                        if (!Array.isArray(update[key])) {\n                            const value = update[key];\n                            const arrOut = [];\n                            update[key] = arrOut;\n                            arrIn.forEach(rule => arrOut.push(rule));\n                            arrOut.push(value);\n                        } else {\n                            const arrOut = update[key] as {}[];\n                            arrIn.forEach(rule => arrOut.unshift(rule));\n                        }\n                    }\n                }\n            });\n\n            update.fill = fill(specContext, topColorField, ScaleNames.Color);\n            update.opacity = opacity(specContext);\n        }\n        return {\n            specCapabilities,\n            vegaSpec,\n        };\n    }\n\n    private initSpec(dataName: string) {\n        const { globalSignals } = this;\n        const { facetAxesAdjustX, facetAxesAdjustY, minCellWidth, minCellHeight, plotOffsetLeft, plotOffsetBottom, plotOffsetTop, plotOffsetRight, plotHeightOut, plotWidthOut } = globalSignals;\n        const { specContext } = this;\n        const { insight } = specContext;\n        const groupMark: GroupMark = {\n            type: 'group',\n            //style: 'cell',\n            encode: {\n                update: {\n                    x: { signal: `${SignalNames.PlotOffsetLeft} - ${SignalNames.FacetAxesAdjustX}` },\n                    y: { signal: SignalNames.PlotOffsetTop },\n                    height: { signal: `${SignalNames.PlotHeightOut} - ${SignalNames.FacetAxesAdjustY}` },\n                    width: { signal: `${SignalNames.PlotWidthOut} + ${SignalNames.FacetAxesAdjustX}` },\n                },\n            },\n        };\n        const inputDataname = 'input';\n        const vegaSpec: Spec = {\n            $schema: 'https://vega.github.io/schema/vega/v5.json',\n            //style: 'cell',\n            data: [{ name: inputDataname }, { name: dataName, source: inputDataname, transform: [] }],\n            marks: [groupMark],\n            signals: textSignals(specContext, SignalNames.ViewportHeight).concat([\n                minCellWidth,\n                minCellHeight,\n                {\n                    name: SignalNames.ViewportHeight,\n                    update: `max(${SignalNames.MinCellHeight}, ${insight.size.height})`,\n                },\n                {\n                    name: SignalNames.ViewportWidth,\n                    update: `max(${SignalNames.MinCellWidth}, ${insight.size.width})`,\n                },\n                plotOffsetLeft,\n                plotOffsetTop,\n                plotOffsetBottom,\n                plotOffsetRight,\n                facetAxesAdjustX,\n                facetAxesAdjustY,\n                {\n                    name: SignalNames.PlotHeightIn,\n                    update: `${SignalNames.ViewportHeight} - ${SignalNames.PlotOffsetBottom} + ${SignalNames.FacetAxesAdjustY}`,\n                },\n                {\n                    name: SignalNames.PlotWidthIn,\n                    update: `${SignalNames.ViewportWidth} - ${SignalNames.PlotOffsetLeft} - ${SignalNames.PlotOffsetRight}`,\n                },\n                plotHeightOut,\n                plotWidthOut,\n                {\n                    name: 'height',\n                    update: `${SignalNames.PlotOffsetTop} + ${SignalNames.PlotHeightOut} + ${SignalNames.PlotOffsetBottom} - ${SignalNames.FacetAxesAdjustY}`,\n                },\n                {\n                    name: 'width',\n                    update: `${SignalNames.PlotWidthOut} + ${SignalNames.PlotOffsetLeft} + ${SignalNames.PlotOffsetRight}`,\n                },\n            ]),\n        };\n        return { vegaSpec, groupMark };\n    }\n\n    private iterateLayouts(globalScope: GlobalScope, onLayoutBuild: (i: number, innerScope: InnerScope) => void) {\n        let specResult: SpecResult;\n        let parentScope: InnerScope = {\n            sizeSignals: globalScope.sizeSignals,\n            offsets: globalScope.offsets,\n        };\n        let firstScope: InnerScope;\n        let childScope: InnerScope;\n        const groupings: Grouping[] = [];\n        const { layouts, specCapabilities } = this.props;\n        const allGlobalScales: GlobalScales[] = [];\n        const allEncodingRules: { [key: string]: EncodingRule[] }[] = [];\n        for (let i = 0; i < layouts.length; i++) {\n            if (!parentScope) continue;\n            const buildProps: LayoutBuildProps = {\n                globalScope,\n                parentScope,\n                axesScales: this.props.axisScales,\n                groupings,\n                id: i,\n            };\n            const layout = this.createLayout(layouts[i], buildProps);\n            try {\n                childScope = layout.build();\n                childScope.id = i;\n                const groupby = layout.getGrouping();\n                if (groupby) {\n                    groupings.push({\n                        id: i,\n                        groupby,\n                        fieldOps: [\n                            { field: null, op: 'count', as: FieldNames.Count },\n                        ],\n                    });\n                }\n                const sumOp = layout.getAggregateSumOp();\n                if (sumOp) {\n                    groupings[groupings.length - 1].fieldOps.push(sumOp);\n                }\n                onLayoutBuild(i, childScope);\n            }\n            catch (e) {\n                specResult = {\n                    errors: [e.stack],\n                    specCapabilities,\n                    vegaSpec: null,\n                };\n                break;\n            }\n            if (childScope && childScope.globalScales) {\n                allGlobalScales.push(childScope.globalScales);\n            }\n            if (childScope.encodingRuleMap) {\n                allEncodingRules.push(childScope.encodingRuleMap);\n            }\n            if (i === 0) {\n                firstScope = childScope;\n            }\n            parentScope = childScope;\n        }\n        return { firstScope, finalScope: parentScope, specResult, allGlobalScales, allEncodingRules };\n    }\n\n    private createLayout(layoutPair: LayoutPair, buildProps: LayoutBuildProps) {\n        const { layoutType, props } = layoutPair;\n        const layoutBuildProps: LayoutProps & LayoutBuildProps = {\n            ...props,\n            ...buildProps,\n        };\n        const layoutClass = layoutClasses[layoutType];\n        const layout = new layoutClass(layoutBuildProps);\n        layout.id = buildProps.id;\n        return layout;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/top.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Other } from './constants.js';\nimport { safeFieldName } from './expr.js';\nimport { Column } from '@msrvida/chart-types';\nimport { Data } from 'vega-typings';\n\nexport function topLookup(column: Column, count: number, source: string, legend: string, lookupName: string, fieldName: string, indexName: string) {\n    const data: Data[] = [\n        {\n            name: lookupName,\n            source,\n            transform: [\n                {\n                    type: 'aggregate',\n                    groupby: [safeFieldName(column.name)],\n                },\n                {\n                    type: 'window',\n                    ops: ['count'],\n                    as: [indexName],\n                },\n                {\n                    type: 'filter',\n                    expr: `datum[${JSON.stringify(indexName)}] <= ${count}`,\n                },\n            ],\n        },\n        {\n            name: legend,\n            source,\n            transform: [\n                {\n                    type: 'lookup',\n                    from: lookupName,\n                    key: safeFieldName(column.name),\n                    fields: [column.name].map(safeFieldName),\n                    values: [column.name].map(safeFieldName),\n                    as: [fieldName],\n                },\n                {\n                    type: 'formula',\n                    expr: `datum[${JSON.stringify(fieldName)}] == null ? '${Other}' : datum[${JSON.stringify(fieldName)}]`,\n                    as: fieldName,\n                },\n            ],\n        },\n    ];\n    return data;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/transforms.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { ExtentTransform } from 'vega-typings';\nimport { safeFieldName } from './expr.js';\n\nexport function dataExtent(column: Column, signal: string): ExtentTransform {\n    return {\n        type: 'extent',\n        field: safeFieldName(column.name),\n        signal,\n    };\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/types.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column, Size } from '@msrvida/chart-types';\nimport { Insight, InsightColumnRoles } from './insight';\n\n/**\n * Deprecated - use @msrvida/chart-types instead.\n */\nexport { Size };\n\n/**\n * Type of selection scope on an axis.\n */\nexport type AxisSelectionType = 'exact' | 'range';\n\n/**\n * Types of SandDance visualizations.\n */\nexport type Chart = 'barchart' | 'barchartH' | 'barchartV' | 'density' | 'grid' | 'scatterplot' | 'stacks' | 'strips' | 'treemap';\n\nexport type ColorBin = 'continuous' | 'quantize' | 'quantile';\n\n/**\n * Layout style to use for faceting.\n */\nexport type FacetStyle = 'wrap' | 'cross'; // | 'horizontal' | 'vertical'\n\n/**\n * Layout style to use for summing.\n */\nexport type TotalStyle = 'count-square' | 'count-strip' | 'sum-strip' | 'sum-strip-percent' | 'sum-treemap';\n\n/**\n * Column to use for faceting into small multiples.\n */\nexport interface Facets {\n\n    /**\n     * Number of columns in the facet grid.\n     */\n    columns: number;\n\n    /**\n     * Number of rows in the facet grid.\n     */\n    rows: number;\n}\n\nexport interface Extents {\n    bottom: number;\n    left: number;\n    right: number;\n    top: number;\n}\n\nexport interface BackgroundImage {\n    url: string;\n    size: Size;\n    extents?: Extents;\n}\n\nexport interface SpecRoleCapabilities {\n    role: InsightColumnRoles;\n    excludeCategoric?: boolean;\n    allowNone?: boolean | ((specContext: SpecContext) => boolean);\n    binnable?: boolean;\n    axisSelection?: AxisSelectionType;\n    axisSelectionBetweenTicks?: boolean;\n    disabled?: boolean;\n\n    /**\n     * Signals associated with this spec role.\n     */\n    signals?: string[];\n}\n\n/**\n * Interaction behavior on a visualization type.\n */\nexport interface SpecCapabilities {\n    /**\n     * Capability of showing as counts or sums\n     */\n    countsAndSums: boolean;\n\n    /**\n     * Capability of showing as percentage\n     */\n    percentage?: boolean;\n\n    /**\n     * Roles to map columns.\n     */\n    roles: SpecRoleCapabilities[];\n\n    /**\n     * Signals associated with this spec type.\n     */\n    signals?: string[];\n\n    /**\n     * Ability to show background image.\n     */\n    backgroundImage?: boolean;\n}\n\n/**\n * Custom colors of various parts of the visualization.\n */\nexport interface SpecColorSettings {\n\n    /**\n     * Color of cubes when there is no coloring specified.\n     */\n    defaultCube?: string;\n\n    /**\n     * Color of axes lines.\n     */\n    axisLine?: string;\n\n    /**\n     * Color of grid lines.\n     */\n    gridLine?: string;\n\n    /**\n     * Color of axes text.\n     */\n    axisText?: string;\n}\n\n/**\n * Language settings.\n */\nexport interface SpecLanguage {\n\n    /**\n     * Label for a count axis.\n     */\n    count: string;\n\n    /**\n     * Label for a sum axis.\n     */\n    sum: string;\n\n    /**\n     * Label for a percentage axis.\n     */\n    percent: string;\n\n    /**\n     * Label for treemap method dropdown.\n     */\n    treeMapMethod: string;\n\n    /**\n     * Label for scatterPlot point scale slider.\n     */\n    scatterPointScale: string;\n\n    /**\n     * Label for bar facet max bins slider.\n     */\n    FacetMaxBins: string;\n\n    /**\n     * Label for bar facetV max bins slider.\n     */\n    FacetVMaxBins: string;\n\n    /**\n     * Label for bar x axis max bins slider.\n     */\n    XMaxBins: string;\n\n    /**\n     * Label for bar y axis max bins slider.\n     */\n    YMaxBins: string;\n\n    /**\n     * Label for bar x grid size slider.\n     */\n    XGridSize: string;\n\n    /**\n     * Label for bar y grid size slider.\n     */\n    YGridSize: string;\n\n    /**\n     * Label for bar inner padding size slider.\n     */\n    InnerPaddingSize: string;\n\n    /**\n     * Label for bar outer padding size slider.\n     */\n    OuterPaddingSize: string;\n\n    /**\n     * Label for the color bin count slider.\n     */\n    colorBinCount: string;\n\n    /**\n     * Label for the color reverse checkbox.\n     */\n    colorReverse: string;\n\n    /**\n     * Label for facet columns slider.\n     */\n    facetColumns: string;\n\n    /**\n     * Label for facet rows slider.\n     */\n    facetRows: string;\n\n    /**\n     * Label for mark opacity slider.\n     */\n    markOpacitySignal: string;\n\n    /**\n     * Label for text scale slider.\n     */\n    textScaleSignal: string;\n\n    /**\n     * Label for x axis text angle slider.\n     */\n    xAxisTextAngleSignal: string;\n\n    /**\n     * Label for y axis text angle slider.\n     */\n    yAxisTextAngleSignal: string;\n\n    /**\n     * Label for z scale proportion slider.\n     */\n    zScaleProportion: string;\n\n    /**\n     * Label for z grounded toggle.\n     */\n    zGrounded: string;\n}\n\nexport interface SignalValues {\n    [key: string]: any;\n}\n\n/**\n * Specified columns for a SandDance visualization.\n */\nexport interface SpecColumns {\n\n    /**\n     * Column with a unique id for each row.\n     */\n    uid: Column;\n\n    /**\n     * Column to use as x-axis in a visualization.\n     */\n    x?: Column;\n\n    /**\n     * Column to use as y-axis in a visualization, optional for bar chart.\n     */\n    y?: Column;\n\n    /**\n     * Column to use as z-axis in a visualization.\n     */\n    z?: Column;\n\n    /**\n     * Column to use as size in a visualization.\n     */\n    size?: Column;\n\n    /**\n     * Column to use for grouping in a visualization.\n     */\n    group?: Column;\n\n    /**\n     * Column to use for coloring a visualization.\n     */\n    color?: Column;\n\n    /**\n     * Column to use for sorting a visualization, not applicable to scatterplot.\n     */\n    sort?: Column;\n\n    /**\n     * Column to use for faceting a visualization.\n     */\n    facet?: Column;\n\n    /**\n     * Column to use for vertically faceting a visualization.\n     */\n    facetV?: Column;\n}\n\nexport interface ZAxisOptions {\n    showZAxis?: boolean;\n    zIndex?: number;\n}\n\nexport interface SpecViewOptions {\n\n    /**\n     * Custom colors of various parts of the visualization.\n     */\n    colors: SpecColorSettings;\n\n    /**\n     * Language settings for the visualization.\n     */\n    language: SpecLanguage;\n\n    /**\n     * Maximum number of rows in a legend.\n     */\n    maxLegends: number;\n\n    tickSize: number;\n\n    zAxisOptions?: ZAxisOptions;\n\n    collapseFacetAxes?: boolean;\n}\n\nexport interface SpecContext {\n    specColumns: SpecColumns;\n    insight: Insight;\n    specViewOptions: SpecViewOptions;\n}\n"
  },
  {
    "path": "packages/sanddance-specs/src/zBase.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { SignalNames } from './constants.js';\nimport { linearScale, pointScale } from './scales.js';\nimport { Column } from '@msrvida/chart-types';\nimport { RangeScheme } from 'vega-typings';\nimport { safeFieldName } from './expr.js';\n\nexport function addZScale(z: Column, zSize: string, dataName: string, zScaleName: string) {\n    if (z) {\n        const zRange: RangeScheme = [0, { signal: `(${zSize}) * ${SignalNames.ZProportion}` }];\n        const scale = z.quantitative\n            ?\n            linearScale(\n                zScaleName,\n                {\n                    data: dataName,\n                    field: safeFieldName(z.name),\n                },\n                zRange,\n                false,\n                true)\n            :\n            pointScale(zScaleName, dataName, zRange, z.name, false)\n            ;\n        return scale;\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/test/demo.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { build, getColumnsFromData, getSpecColumns } from '../dist/es6';\n\nimport { inferTypes, loader, parse, read, View } from 'vega';\n\nloader().load('../../docs/sample-data/titanicmaster.tsv').then(tsv_data => {\n    const data = read(tsv_data, { type: 'tsv', parse: 'auto' });\n\n    const insight = {\n        colorBin: 'quantize',\n        columns: {\n            x: 'Gender',\n            color: 'Survived',\n            sort: 'Survived',\n            facet: 'Age',\n        },\n        scheme: 'set1',   //see https://vega.github.io/vega/docs/schemes/#reference\n        facetStyle: 'wrap',\n        size: {\n            height: 600,\n            width: 800,\n        },\n        chart: 'barchartV',\n    };\n\n    const columns = getColumnsFromData(inferTypes, data);\n    const specColumns = getSpecColumns(insight, columns);\n    const specViewOptions = {\n        colors: {\n            defaultCube: 'steelblue',\n            axisLine: '#000',\n            axisText: '#000',\n        },\n        language: {\n            count: 'Count',\n        },\n        maxLegends: 20,\n        tickSize: 10,\n    };\n    const context = { specColumns, insight, specViewOptions };\n    const specResult = build(context, data);\n\n    if (specResult.errors) {\n        console.log(specResult.errors);\n    } else {\n        console.log(specResult.vegaSpec);\n    }\n\n    const runtime = parse(specResult.vegaSpec);\n    const vegaView = new View(runtime);\n    vegaView.runAsync().then(() => {\n        console.log('done');\n    }).catch(e => {\n        console.log(`error ${e}`);\n    });\n\n});\n"
  },
  {
    "path": "packages/sanddance-specs/test/perf.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport { build, getColumnsFromData, getSpecColumns } from '../dist/es6';\nimport * as vega from 'vega';\n\nvega.loader().load('../../docs/sample-data/demovote.tsv').then(tsv_data => {\n    const data = vega.read(tsv_data, { type: 'tsv', parse: 'auto' });\n    const columns = getColumnsFromData(vega.inferTypes, data);\n\n    const specViewOptions = {\n        colors: {\n            defaultCube: [0, 0, 0],\n            axisLine: [0, 0, 0],\n            axisText: [0, 0, 0],\n        },\n        language: {},\n        maxLegends: 20,\n        tickSize: 10,\n    };\n\n    const insightPasses = [\n        {\n            name: 'scatter',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                },\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'scatterplot',\n                view: '3d',\n            },\n        },\n        {\n            name: 'scatter facet wrap',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                    facet: 'MedAge',\n                },\n                facetStyle: 'wrap',\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'scatterplot',\n                view: '3d',\n            },\n        },\n        {\n            name: 'scatter facet cross',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                    facet: 'MedAge',\n                    facetV: 'Income',\n                },\n                facetStyle: 'cross',\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'scatterplot',\n                view: '3d',\n            },\n        },\n        {\n            name: 'density',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                },\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'density',\n                view: '3d',\n            },\n        },\n        {\n            name: 'density facet wrap',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                    facet: 'MedAge',\n                },\n                facetStyle: 'wrap',\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'density',\n                view: '3d',\n            },\n        },\n        {\n            name: 'density facet cross',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                    facet: 'MedAge',\n                    facetV: 'Income',\n                },\n                facetStyle: 'cross',\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'density',\n                view: '3d',\n            },\n        },\n        {\n            name: 'column',\n            insight: {\n                columns: {\n                    x: 'Income',\n                    color: 'Obama',\n                    z: 'Education',\n                },\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'barchartV',\n                view: '3d',\n            },\n        },\n        {\n            name: 'column facet wrap',\n            insight: {\n                columns: {\n                    x: 'Income',\n                    color: 'Obama',\n                    z: 'Education',\n                    facet: 'MedAge',\n                },\n                facetStyle: 'wrap',\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'barchartV',\n                view: '3d',\n            },\n        },\n        {\n            name: 'column facet cross',\n            insight: {\n                columns: {\n                    x: 'Income',\n                    color: 'Obama',\n                    z: 'Education',\n                    facet: 'MedAge',\n                    facetV: 'Income',\n                },\n                facetStyle: 'cross',\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'barchartV',\n                view: '3d',\n            },\n        },\n        {\n            name: 'stacks not faceted',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                    sort: 'State',\n                },\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'stacks',\n                view: '3d',\n            },\n        },\n        {\n            name: 'stacks facet wrap',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                    sort: 'State',\n                    facet: 'MedAge',\n                },\n                facetStyle: 'wrap',\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'stacks',\n                view: '3d',\n            },\n        },\n        {\n            name: 'stacks facet cross',\n            insight: {\n                columns: {\n                    x: 'Longitude',\n                    y: 'Latitude',\n                    color: 'Obama',\n                    z: 'Education',\n                    sort: 'State',\n                    facet: 'MedAge',\n                    facetV: 'Income',\n                },\n                facetStyle: 'cross',\n                scheme: 'redblue',\n                size: {\n                    height: 600,\n                    width: 800,\n                },\n                chart: 'stacks',\n                view: '3d',\n            },\n        },\n    ];\n\n    const run = i => {\n        const pass = insightPasses[i];\n        if (!pass) {\n            console.log('complete');\n            return;\n        }\n\n        const { insight, name } = pass;\n        const context = { specColumns: getSpecColumns(insight, columns), insight, specViewOptions };\n        const specResult = build(context, data);\n\n        if (specResult.errors) {\n            console.log(specResult.errors);\n        } else {\n            const runtime = vega.parse(specResult.vegaSpec);\n            const vegaView = new vega.View(runtime);\n            const startTime = new Date();\n            vegaView.runAsync().then(() => {\n                const stopTime = new Date();\n                console.log(`${name} done in ${stopTime - startTime}`);\n\n                // const d0 = specResult.vegaSpec.data[0];\n                // delete d0.values;\n                // d0.url = \"https://sanddance.js.org/sample-data/demovote.tsv\";\n                // d0.format = {\n                //     \"parse\": \"auto\",\n                //     \"type\": \"tsv\"\n                // };\n                //writeFileSync(`${name}.vg.json`, JSON.stringify(specResult.vegaSpec, null, 2), 'utf8');\n\n                run(++i);\n            }).catch(e => {\n                console.log(`${name} error ${e}`);\n            });\n        }\n    };\n\n    run(0);\n});\n"
  },
  {
    "path": "packages/sanddance-specs/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/sanddance-specs/uitest/chart-types.d.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport { Column } from '@msrvida/chart-types';\n\nexport as namespace ChartTypes;\n"
  },
  {
    "path": "packages/sanddance-specs/uitest/index.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../dist/umd/sanddance-specs.d.ts' />\n///<reference path='chart-types.d.ts' />\n///<reference path='vega.d.ts' />\n\ndeclare const vega: {\n    inferTypes: typeof Vega.inferTypes;\n    loader: typeof Vega.loader;\n    parse: typeof Vega.parse;\n    read: typeof Vega.read;\n    View: typeof Vega.View;\n};\n\nconst dataUrl = '/SandDance/sample-data/demovote.tsv';\nconst specViewOptions: SandDanceSpecs.SpecViewOptions = {\n    colors: {\n        defaultCube: \"steelblue\",\n        axisLine: \"#000\",\n        axisText: \"#000\"\n    },\n    language: <any>{\n        count: \"Count\"\n    },\n    maxLegends: 20,\n    tickSize: 10,\n};\nlet data: object[];\nlet columns: ChartTypes.Column[];\nconst container = document.getElementById('vis')!;\nconst select = document.getElementById('select-spec') as HTMLSelectElement;\nconst insightTextarea = document.getElementById('insight-json') as HTMLTextAreaElement;\nconst insightUdateButton = document.getElementById('insight-update') as HTMLButtonElement;\nconst vegaOutput = document.getElementById('vega-spec') as HTMLTextAreaElement;\nconst vegaCopy = document.getElementById('vega-spec-copy') as HTMLButtonElement;\n\nselect.onchange = () => selected(select.selectedIndex);\n\ninsightUdateButton.onclick = () => {\n    const insight = JSON.parse(insightTextarea.value);\n    render(insight);\n};\n\nvegaCopy.onclick = () => {\n    vegaOutput.select();\n    document.execCommand('copy');\n    vegaCopy.innerText = 'copied';\n    setTimeout(() => {\n        vegaCopy.innerText = 'copy';\n    }, 2000);\n}\n\nfunction selected(selectedIndex: number) {\n    container.innerHTML = `loading spec...`;\n    fetchInsight(select.options[selectedIndex].value);\n}\n\nfunction fetchInsight(specFilename: string) {\n    fetch(`specs/${specFilename}`)\n        .then(response => response.json())\n        .then(insight => render(insight))\n        .catch(error => container.innerText = error);\n}\n\nfunction render(insight: SandDanceSpecs.Insight) {\n    insightTextarea.value = JSON.stringify(insight, null, 2);\n    const specColumns = SandDanceSpecs.getSpecColumns(insight, columns);\n    const context: SandDanceSpecs.SpecContext = { specColumns, insight, specViewOptions };\n    const specResult = SandDanceSpecs.build(context, data);\n    if (specResult.errors) {\n        container.innerText = specResult.errors.map(error => error).join('\\n');\n    } else {\n        renderVegaSpec(specResult.vegaSpec);\n    }\n}\n\nfunction renderVegaSpec(vegaSpec: Vega.Spec) {\n    const runtime = vega.parse(vegaSpec);\n    const vegaView = new vega.View(runtime, { container });\n    vegaView\n        .runAsync()\n        .catch(e => container.innerHTML = `error ${e}`)\n        .then(() => {\n            const d0 = vegaSpec.data![0] as any;\n            delete d0.values;\n            d0.format = {\n                parse: 'auto',\n                type: 'tsv'\n            };\n            d0.url = 'https://microsoft.github.io' + dataUrl\n            vegaOutput.value = JSON.stringify(vegaSpec, null, 2);\n        });\n}\n\ncontainer.innerHTML = `loading ${dataUrl}...`;\nvega.loader().load(dataUrl).then(tsv_data => {\n    data = vega.read(tsv_data, { type: 'tsv', parse: 'auto' });\n    columns = SandDanceSpecs.getColumnsFromData(vega.inferTypes, data);\n    selected(0);\n});\n"
  },
  {
    "path": "packages/sanddance-specs/uitest/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"lib\": [\n            \"dom\", \"es2015\"\n        ],\n        \"outDir\": \"../../../docs/tests/sanddance-specs/v2/js/\",\n        \"removeComments\": true,\n        \"skipLibCheck\": true\n    }\n}\n"
  },
  {
    "path": "packages/sanddance-specs/uitest/vega.d.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport { inferTypes, loader, parse, read, Spec, View } from '../node_modules/vega-typings';\n\nexport as namespace Vega;\n"
  },
  {
    "path": "packages/sanddance-test-es6/.gitignore",
    "content": "dist"
  },
  {
    "path": "packages/sanddance-test-es6/package.json",
    "content": "{\n  \"name\": \"sanddance-test-es6\",\n  \"private\": true,\n  \"version\": \"1.0.0\",\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"build:05\": \"tsc -p .\",\n    \"deploy\": \"vite build\"\n  },\n  \"umd\": \"../../docs/tests/v4/es6/js/sanddance-test-es6.js\",\n  \"targets\": {\n    \"umd\": {\n      \"distDir\": \"../../docs/tests/v4/es6/js\",\n      \"includeNodeModules\": {},\n      \"optimize\": false,\n      \"scopeHoist\": false,\n      \"sourceMap\": false\n    }\n  }\n}\n"
  },
  {
    "path": "packages/sanddance-test-es6/src/sanddance-test-es6.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as vega from 'vega';\nimport * as SandDance from '@msrvida/sanddance';\n\ninterface Datum {\n    id: number;\n    x: number;\n    y: number;\n    z: number;\n    w: number;\n}\n\nconst data: Datum[] = [];\nconst size = 100;\n\nfor (let x = 0; x < size; x++) {\n    for (let y = 0; y < size; y++) {\n        const id = x * y;\n        const z = Math.random() * size * (x % 10) * (y % 10);\n        const w = Math.random() * size;\n        data.push({ id, x, y, z, w });\n    }\n}\n\nSandDance.use(vega);\n\nconst viewer = new SandDance.Viewer(document.getElementById('vis'));\n\nconst insight: SandDance.specs.Insight = {\n    columns: {\n        color: 'z',\n        uid: 'id',\n        x: 'x',\n        y: 'y',\n        z: 'z',\n    },\n    scheme: 'blues',\n    size: { height: 500, width: 500 },\n    chart: 'scatterplot',\n    view: '3d',\n};\n\nviewer.render({ insight }, data);\n"
  },
  {
    "path": "packages/sanddance-test-es6/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"moduleResolution\": \"node\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/sanddance-test-es6/vite.config.js",
    "content": "import { defineConfig } from 'vite';\nimport { resolve } from 'path';\n\nexport default defineConfig({\n    build: {\n        lib: {\n            entry: resolve(__dirname, 'src/sanddance-test-es6.ts'),\n            formats: ['umd'],\n            name: 'SandDanceTestES6',\n            fileName: () => 'sanddance-test-es6.js',\n        },\n        outDir: '../../docs/tests/v4/es6/js',\n        emptyOutDir: false,\n        sourcemap: false,\n        minify: false,\n    },\n});\n"
  },
  {
    "path": "packages/sanddance-test-umd/package.json",
    "content": "{\n  \"name\": \"sanddance-test-umd\",\n  \"private\": true,\n  \"version\": \"1.0.0\",\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"deploy\": \"tsc -p .\"\n  }\n}\n"
  },
  {
    "path": "packages/sanddance-test-umd/src/qualBarChartTest.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../../sanddance/dist/umd/sanddance.d.ts' />\n\nnamespace qualBarChartTest {\n\n    declare const vega: SandDance.VegaMorphCharts.types.VegaBase;\n\n    SandDance.use(vega);\n    export const viewer = new SandDance.Viewer(document.getElementById('vis'));\n\n    interface MyData {\n        myColor: string;\n        mySort: number;\n        myUid: number;\n        myX: string;\n        myY: number;\n        myZ: number;\n    }\n\n    function getValue(i) {\n        if (i < 20) return 0;\n        if (i < 25) return 1;\n        if (i < 35) return 2;\n        return 3;\n    }\n\n    const data: MyData[] = [];\n\n    for (let i = 0; i < 70; i++) {\n        const v = getValue(i);\n        data.push({\n            myUid: i,\n            myX: `cat${v}`,\n            myY: i,\n            myZ: i,\n            myColor: v.toString(),\n            mySort: i,\n        });\n    }\n    const glDiv = viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl);\n    const insight: SandDance.specs.Insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ',\n        },\n        scheme: 'category20',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth,\n        },\n        chart: 'barchart',\n        view: '2d',\n    };\n\n    viewer.render({ insight }, data, { columnTypes: { myColor: 'string' } });\n}\n"
  },
  {
    "path": "packages/sanddance-test-umd/src/quanBarChartTest.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../../sanddance/dist/umd/sanddance.d.ts' />\n\nnamespace quanBarChartTest {\n\n    declare const vega: SandDance.VegaMorphCharts.types.VegaBase;\n\n    SandDance.use(vega);\n    export const viewer = new SandDance.Viewer(document.getElementById('vis'));\n\n    interface MyData {\n        myColor: number;\n        mySort: number;\n        myUid: number;\n        myX: number;\n        myY: number;\n        myZ: number;\n    }\n\n    function getValue(i: number) {\n        if (i < 200) return 0;\n        if (i < 250) return 1;\n        if (i < 350) return 2;\n        return 3;\n    }\n\n    const data: MyData[] = [];\n\n    for (let i = 0; i < 700; i++) {\n        const v = getValue(i);\n        data.push({\n            myUid: i,\n            myX: v,\n            myY: i,\n            myZ: i,\n            myColor: v,\n            mySort: i,\n        });\n    }\n    const glDiv = viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl);\n    const insight: SandDance.specs.Insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ',\n        },\n        scheme: 'redblue',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth,\n        },\n        chart: 'barchart',\n        view: '2d',\n    };\n\n    viewer.render({ insight }, data);\n}\n"
  },
  {
    "path": "packages/sanddance-test-umd/src/scatterplotTest.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../../sanddance/dist/umd/sanddance.d.ts' />\n\nnamespace scatterplotTest {\n\n    declare const vega: SandDance.VegaMorphCharts.types.VegaBase;\n\n    SandDance.use(vega);\n    export const viewer = new SandDance.Viewer(document.querySelector('#vis'));\n\n    const glDiv = viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl);\n    const insight: SandDance.specs.Insight = {\n        columns: {\n            color: 'Education',\n            sort: 'TotalPop',\n            uid: 'Id',\n            x: 'Longitude',\n            y: 'Latitude',\n            z: 'Income',\n        },\n        scheme: 'redblue',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth,\n        },\n        chart: 'scatterplot',\n    };\n\n    vega.loader().load('../../../sample-data/demovote.tsv').then(text => {\n        const data = vega.read(text, { type: 'tsv' });\n        viewer.render({ insight }, data);\n    });\n\n}\n"
  },
  {
    "path": "packages/sanddance-test-umd/src/test.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../../sanddance/dist/umd/sanddance.d.ts' />\n\nnamespace test {\n\n    declare const vega: SandDance.VegaMorphCharts.types.VegaBase;\n\n    interface MyData {\n        myColor: number;\n        mySort: number;\n        myUid: number;\n        myX: number;\n        myY: number;\n        myZ: number;\n    }\n\n    const data: MyData[] = [\n        { myUid: 0, myColor: 0, mySort: 0, myX: 0, myY: 0, myZ: 0 },\n        { myUid: 1, myColor: 1, mySort: 1, myX: 1, myY: 1, myZ: 1 },\n        { myUid: 2, myColor: 2, mySort: 2, myX: 2, myY: 2, myZ: 2 },\n    ];\n\n    const insight: SandDance.specs.Insight = {\n        columns: {\n            color: 'myColor',\n            sort: 'mySort',\n            uid: 'myUid',\n            x: 'myX',\n            y: 'myY',\n            z: 'myZ',\n        },\n        size: {\n            height: 700,\n            width: 700,\n        },\n        chart: 'scatterplot',\n    };\n\n    SandDance.use(vega);\n    export const viewer = new SandDance.Viewer(document.querySelector('#vis'));\n    viewer.render({ insight }, data);\n}"
  },
  {
    "path": "packages/sanddance-test-umd/src/transforms.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../../sanddance/dist/umd/sanddance.d.ts' />\n\nnamespace transformTest {\n\n    declare const vega: SandDance.VegaMorphCharts.types.VegaBase;\n\n    const insight: SandDance.specs.Insight = {\n        columns: {\n            color: 'brand',\n            x: 'Horsepower',\n            y: 'Miles_per_Gallon',\n            z: 'Cylinders',\n        },\n        transform: [\n            {\n                type: 'formula',\n                expr: 'split(datum.Name, \" \")',\n                as: 'name_split',\n            },\n            {\n                type: 'formula',\n                expr: 'datum.name_split[0]',\n                as: 'brand',\n            },\n        ],\n        size: {\n            height: 700,\n            width: 700,\n        },\n        scheme: 'category20',\n        view: '2d',\n        chart: 'scatterplot',\n        signalValues: {\n            Chart_PointScaleSignal: 8,\n            Text_AngleXSignal: 0,\n            Text_AngleYSignal: -90,\n\n        },\n    };\n\n    SandDance.use(vega);\n    export const viewer = new SandDance.Viewer(document.querySelector('#vis'));\n\n    fetch('https://vega.github.io/editor/data/cars.json').then(response => {\n        return response.json();\n    }).then(json => {\n        viewer.render({ insight }, json);\n    });\n\n}"
  },
  {
    "path": "packages/sanddance-test-umd/src/transition.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../../sanddance/dist/umd/sanddance.d.ts' />\n///<reference path='vega.d.ts' />\n\nnamespace transition {\n    declare const vega: SandDance.VegaMorphCharts.types.VegaBase;\n\n    export let view: SandDance.ViewGl_Class;\n    let lastSpec: Vega.Spec;\n    let viewType: SandDance.types.View = '3d';\n\n    SandDance.use(vega);\n\n    export function toggleView() {\n        if (viewType === '3d') {\n            viewType = '2d';\n        } else {\n            viewType = '3d';\n        }\n        update(lastSpec);\n    }\n\n    export function update(spec: Vega.Spec) {\n        view = new SandDance.VegaMorphCharts.ViewGl(vega.parse(spec), { presenter: view && view.presenter, getView: () => viewType })\n            .renderer('morphcharts')\n            .initialize(document.querySelector('#split-right'))\n            .run();\n\n        lastSpec = spec;\n    }\n\n    export function getText(textId) {\n        const textarea = document.getElementById(textId) as HTMLTextAreaElement;\n        const text = textarea.value;\n\n        const errorDiv = document.getElementById('error');\n        const splitRight = document.getElementById('split-right');\n\n        try {\n            const spec = JSON.parse(text);\n\n            splitRight.style.opacity = '1';\n            errorDiv.style.display = 'none';\n            update(spec);\n        }\n        catch (e) {\n            errorDiv.innerText = e;\n            errorDiv.style.display = '';\n            splitRight.style.opacity = '0.1';\n        }\n    }\n\n    fetch('./specs/scatter3D.json')\n        .then(response => response.text())\n        .then(text => {\n            const textarea = document.getElementById('text1') as HTMLTextAreaElement;\n            textarea.value = text;\n            getText('text1');\n        });\n\n    fetch('./specs/titanic.json')\n        .then(response => response.text())\n        .then(text => (document.getElementById('text2') as HTMLTextAreaElement).value = text);\n\n}\n"
  },
  {
    "path": "packages/sanddance-test-umd/src/treeMapTest.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../../sanddance/dist/umd/sanddance.d.ts' />\n\nnamespace treeMapTest {\n\n    declare const vega: SandDance.VegaMorphCharts.types.VegaBase;\n\n    SandDance.use(vega);\n    export const viewer = new SandDance.Viewer(document.querySelector('#vis'));\n\n    const glDiv = viewer.presenter.getElement(SandDance.VegaMorphCharts.PresenterElement.gl);\n    const insight: SandDance.specs.Insight = {\n        columns: {\n            color: 'Class',\n            size: 'TicketCost',\n            uid: 'Name',\n        },\n        scheme: 'category10',\n        size: {\n            height: glDiv.offsetHeight,\n            width: glDiv.offsetWidth,\n        },\n        chart: 'treemap',\n    };\n\n    vega.loader().load('../../../sample-data/titanicmaster.tsv').then(text => {\n        const data = vega.read(text, { type: 'tsv' });\n        viewer.render({ insight }, data);\n    });\n\n}\n"
  },
  {
    "path": "packages/sanddance-test-umd/src/vega-morphcharts.test.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n///<reference path='../../vega-morphcharts/dist/umd/vega-morphcharts.d.ts' />\n///<reference path='vega.d.ts' />\n\nnamespace vegaMorphChartsTest {\n    declare const vega: VegaMorphCharts.types.VegaBase;\n\n    VegaMorphCharts.use(vega);\n\n    /* eslint-disable */\n    const spec: Vega.Spec = {\n        \"$schema\": \"https://vega.github.io/schema/vega/v4.json\",\n        \"background\": \"#DEDEDE\",\n        \"width\": 500,\n        \"height\": 200,\n        \"padding\": 5,\n\n        \"data\": [\n            {\n                \"name\": \"table\",\n                \"values\": [\n                    { \"x\": 0, \"y\": 28, \"c\": 0 }, { \"x\": 0, \"y\": 55, \"c\": 1 },\n                    { \"x\": 1, \"y\": 43, \"c\": 0 }, { \"x\": 1, \"y\": 91, \"c\": 1 },\n                    { \"x\": 2, \"y\": 81, \"c\": 0 }, { \"x\": 2, \"y\": 53, \"c\": 1 },\n                    { \"x\": 3, \"y\": 19, \"c\": 0 }, { \"x\": 3, \"y\": 87, \"c\": 1 },\n                    { \"x\": 4, \"y\": 52, \"c\": 0 }, { \"x\": 4, \"y\": 48, \"c\": 1 },\n                    { \"x\": 5, \"y\": 24, \"c\": 0 }, { \"x\": 5, \"y\": 49, \"c\": 1 },\n                    { \"x\": 6, \"y\": 87, \"c\": 0 }, { \"x\": 6, \"y\": 66, \"c\": 1 },\n                    { \"x\": 7, \"y\": 17, \"c\": 0 }, { \"x\": 7, \"y\": 27, \"c\": 1 },\n                    { \"x\": 8, \"y\": 68, \"c\": 0 }, { \"x\": 8, \"y\": 16, \"c\": 1 },\n                    { \"x\": 9, \"y\": 49, \"c\": 0 }, { \"x\": 9, \"y\": 15, \"c\": 1 }\n                ],\n                \"transform\": [\n                    {\n                        \"type\": \"stack\",\n                        \"groupby\": [\"x\"],\n                        \"sort\": { \"field\": \"c\" },\n                        \"field\": \"y\"\n                    }\n                ]\n            }\n        ],\n\n        \"scales\": [\n            {\n                \"name\": \"x\",\n                \"type\": \"band\",\n                \"range\": \"width\",\n                \"domain\": { \"data\": \"table\", \"field\": \"x\" }\n            },\n            {\n                \"name\": \"y\",\n                \"type\": \"linear\",\n                \"range\": \"height\",\n                \"nice\": true, \"zero\": true,\n                \"domain\": { \"data\": \"table\", \"field\": \"y1\" }\n            },\n            {\n                \"name\": \"color\",\n                \"type\": \"ordinal\",\n                \"range\": \"category\",\n                \"domain\": { \"data\": \"table\", \"field\": \"c\" }\n            }\n        ],\n\n        \"axes\": [\n            { \"orient\": \"bottom\", \"scale\": \"x\", \"title\": \"X Axis\", \"tickColor\": \"red\", \"tickWidth\": 3, \"labelColor\": \"blue\", \"titleColor\": \"green\" },\n            { \"orient\": \"left\", \"scale\": \"y\", \"title\": \"Y Axis\", \"domainColor\": \"magenta\", \"domainWidth\": 2, \"tickWidth\": 7 }\n        ],\n\n        \"marks\": [\n            {\n                \"type\": \"rect\",\n                \"from\": { \"data\": \"table\" },\n                \"encode\": {\n                    \"enter\": {\n                        \"x\": { \"scale\": \"x\", \"field\": \"x\" },\n                        \"width\": { \"scale\": \"x\", \"band\": 1, \"offset\": -1 },\n                        \"y\": { \"scale\": \"y\", \"field\": \"y0\" },\n                        \"y2\": { \"scale\": \"y\", \"field\": \"y1\" },\n                        \"fill\": { \"scale\": \"color\", \"field\": \"c\" }\n                    },\n                    \"update\": {\n                        \"fillOpacity\": { \"value\": 1 }\n                    },\n                    \"hover\": {\n                        \"fillOpacity\": { \"value\": 0.5 }\n                    }\n                }\n            }\n        ],\n        \"legends\": [\n            {\n                \"fill\": \"color\",\n                \"title\": \"Legend\",\n                \"encode\": {\n                    \"symbols\": {\n                        \"update\": {\n                            \"shape\": { \"value\": \"square\" }\n                        }\n                    }\n                }\n            }\n        ]\n    };\n    /* eslint-enable */\n\n    const view = new VegaMorphCharts.ViewGl(vega.parse(spec), { getView: () => '2d' })\n        .renderer('morphcharts')\n        .initialize(document.querySelector('#vis'))\n        .run();\n}\n"
  },
  {
    "path": "packages/sanddance-test-umd/src/vega.d.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nexport { inferTypes, loader, parse, read, Spec, View } from 'vega-typings';\n\nexport as namespace Vega;\n"
  },
  {
    "path": "packages/sanddance-test-umd/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"lib\": [\n            \"dom\", \"es2015\"\n        ],\n        \"outDir\": \"../../docs/tests/v4/umd/js/\",\n        \"removeComments\": true,\n        \"skipLibCheck\": true\n    }\n}\n"
  },
  {
    "path": "packages/search-expression/.gitignore",
    "content": "dist\n"
  },
  {
    "path": "packages/search-expression/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/search-expression/package.json",
    "content": "{\n  \"name\": \"@msrvida/search-expression\",\n  \"version\": \"1.0.4\",\n  \"description\": \"Search expression parser.\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/search-expression\"\n  },\n  \"types\": \"dist/es6/index.d.ts\",\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-typescript\": \"tsc -p .\",\n    \"build:02\": \"npm run build-typescript\",\n    \"remove-vega\": \"npm un vega-typings\",\n    \"patch-after-vega-upgrade\": \"npm version patch\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@msrvida/chart-types\": \"^1\",\n    \"vega-typings\": \"~2.1.0\"\n  }\n}\n"
  },
  {
    "path": "packages/search-expression/src/compare.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { ensureSearchExpressionGroupArray } from './group';\nimport { Search, SearchExpression, SearchExpressionGroup } from './types';\n\nconst expressionKeys = Object.keys(<Partial<SearchExpression>>{\n    clause: null,\n    name: null,\n    operator: null,\n    value: null,\n});\n\nexport function compareExpression(a: SearchExpression, b: SearchExpression): boolean {\n    if (a && b) {\n        for (let k = 0; k < expressionKeys.length; k++) {\n            const key = expressionKeys[k];\n            if (a[key] != b[key]) return false;\n        }\n    } else {\n        return !a && !b;\n    }\n    return true;\n}\n\nconst groupKeys = Object.keys(<Partial<SearchExpressionGroup>>{\n    clause: null,\n});\n\nexport function compareGroup(a: SearchExpressionGroup, b: SearchExpressionGroup): boolean {\n    for (let k = 0; k < groupKeys.length; k++) {\n        const key = groupKeys[k];\n        if (a[key] != b[key]) return false;\n    }\n    if (!a.expressions && !b.expressions) return true;\n    if (!a.expressions || !b.expressions) return false;\n    if (a.expressions.length != b.expressions.length) return false;\n    for (let i = 0; i < a.expressions.length; i++) {\n        if (!compareExpression(a.expressions[i], b.expressions[i])) return false;\n    }\n    return true;\n}\n\nexport function compare(a: Search, b: Search): boolean {\n    if (a == b) return true;\n    if (!a || !b) return false;\n    const arrs = [a, b].map(ensureSearchExpressionGroupArray);\n    const [arrA, arrB] = arrs;\n    if (arrA.length != arrB.length) return false;\n    for (let i = 0; i < arrA.length; i++) {\n        if (!compareGroup(arrA[i], arrB[i])) return false;\n    }\n    return true;\n}\n\nexport function startsWith(whole: Search, part: Search): boolean {\n    if (!part) return true;\n    const arrs = [whole, part].map(ensureSearchExpressionGroupArray);\n    const [wholeArray, partArray] = arrs;\n    if (partArray.length > wholeArray.length) return false;\n    for (let i = 0; i < partArray.length; i++) {\n        if (!compareGroup(wholeArray[i], partArray[i])) return false;\n    }\n    return true;\n}\n"
  },
  {
    "path": "packages/search-expression/src/exec.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Column } from '@msrvida/chart-types';\nimport { ensureSearchExpressionGroupArray } from './group';\nimport { Search, SearchExpression, SearchExpressionGroup } from './types';\n\nfunction valueToBoolean(value: any) {\n    if (typeof value === 'string') {\n        switch (value.toLowerCase()) {\n            case 'true':\n                return true;\n            case 'false':\n                return false;\n        }\n    }\n    return !!value;\n}\n\nfunction valueToString(value: any) {\n    if (value == null) {\n        return '';\n    }\n    switch (typeof value) {\n        case 'string':\n            return value;\n        case 'boolean':\n        case 'number':\n            return value.toString();\n    }\n    return '';\n}\n\nfunction isStringOperation(ex: SearchExpression) {\n    switch (ex.operator) {\n        case 'contains':\n        case '!contains':\n        case 'starts':\n        case '!starts':\n            return true;\n    }\n    return false;\n}\n\nfunction isnullorEmpty(value: any) {\n    if (value == null) return true; //double equal sign to also catch undefined\n    if (typeof value === 'string' && value.length === 0) return true;\n    return false;\n}\n\ninterface SearchExpressionLowercase extends SearchExpression {\n    column: Column;\n    valueLow: string;\n    valueBool: boolean;\n    stringOperation: boolean;\n}\n\nexport class Exec {\n    private groups: SearchExpressionGroup<SearchExpressionLowercase>[];\n\n    constructor(search: Search, private columns: Column[]) {\n        this.groups = (ensureSearchExpressionGroupArray(search) as SearchExpressionGroup<SearchExpressionLowercase>[]).map(g => {\n            const expressions = g.expressions.filter(Boolean);\n            expressions.forEach(ex => {\n                ex.column = this.getColumn(ex.name);\n                ex.valueBool = valueToBoolean(ex.value);\n                ex.valueLow = valueToString(ex.value).toLocaleLowerCase();\n                ex.stringOperation = isStringOperation(ex);\n            });\n            const group = { ...g, expressions };\n            return group;\n        });\n    }\n\n    private getColumn(name: string) {\n        for (let i = 0; i < this.columns.length; i++) {\n            if (this.columns[i].name == name) {\n                return this.columns[i];\n            }\n        }\n    }\n\n    private runExpressionOnColumn(datum: object, ex: SearchExpressionLowercase) {\n        const actualDataValue = datum[ex.name];\n        if (ex.operator === 'isnullorEmpty') {\n            return isnullorEmpty(actualDataValue);\n        } else if (ex.operator === '!isnullorEmpty') {\n            return !isnullorEmpty(actualDataValue);\n        }\n        let dataValue = actualDataValue;\n        let expressionValue = ex.value;\n        if (ex.column) {\n            if (ex.column.type === 'string' || ex.stringOperation) {\n                dataValue = valueToString(actualDataValue).toLocaleLowerCase();\n                expressionValue = ex.valueLow;\n            } else if (ex.column.type === 'boolean') {\n                dataValue = valueToBoolean(actualDataValue);\n                expressionValue = ex.valueBool;\n            } else if (ex.column.quantitative) {\n                dataValue = +actualDataValue;\n                expressionValue = +ex.value;\n            }\n        }\n        switch (ex.operator) {\n            case '!=':\n                return dataValue != expressionValue;\n            case '<':\n                return dataValue < expressionValue;\n            case '<=':\n                return dataValue <= expressionValue;\n            case '==':\n                return dataValue == expressionValue;\n            case '>':\n                return dataValue > expressionValue;\n            case '>=':\n                return dataValue >= expressionValue;\n            case 'contains':\n                return dataValue.indexOf(expressionValue) >= 0;\n            case '!contains':\n                return dataValue.indexOf(expressionValue) < 0;\n            case 'starts':\n                return dataValue.indexOf(expressionValue) == 0;\n            case '!starts':\n                return dataValue.indexOf(expressionValue) !== 0;\n        }\n    }\n\n    private runExpression(datum: object, ex: SearchExpressionLowercase) {\n        if (ex.name == null) {\n            //run on all columns\n            const group: SearchExpressionGroup<SearchExpressionLowercase> = {\n                expressions: this.columns.map((column, i) => {\n                    const ex2: SearchExpressionLowercase = {\n                        ...ex,\n                        column,\n                        name: column.name,\n                    };\n                    if (i) {\n                        ex2.clause = '||';\n                    }\n                    return ex2;\n                }),\n            };\n            return this.runGroup(datum, group);\n        } else {\n            return this.runExpressionOnColumn(datum, ex);\n        }\n    }\n\n    private runGroup(datum: object, group: SearchExpressionGroup<SearchExpressionLowercase>): boolean {\n        let accumulator: boolean = this.runExpression(datum, group.expressions[0]);\n        for (let i = 1; i < group.expressions.length; i++) {\n            const ex = group.expressions[i];\n            switch (ex.clause) {\n                case '&&':\n                    accumulator = accumulator && this.runExpression(datum, ex);\n                    break;\n                case '||':\n                    accumulator = accumulator || this.runExpression(datum, ex);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n\n    run(datum: object) {\n        let accumulator = this.runGroup(datum, this.groups[0]);\n        for (let i = 1; i < this.groups.length; i++) {\n            const group = this.groups[i];\n            switch (group.clause) {\n                case '&&':\n                    accumulator = accumulator && this.runGroup(datum, group);\n                    break;\n                case '||':\n                    accumulator = accumulator || this.runGroup(datum, group);\n                    break;\n            }\n        }\n        return accumulator;\n    }\n}\n"
  },
  {
    "path": "packages/search-expression/src/group.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport {\n    Search,\n    SearchExpression,\n    SearchExpressionGroup,\n} from './types';\n\nexport function isSearchExpressionGroup(search: Search) {\n    if (!search) {\n        return false;\n    }\n    return !!(search as SearchExpressionGroup).expressions;\n}\n\nexport function createGroupFromExpression(input: SearchExpression) {\n    const output: SearchExpressionGroup = {\n        expressions: [input],\n    };\n    return output;\n}\n\nexport function ensureSearchExpressionGroupArray(search: Search): SearchExpressionGroup[] {\n    if (Array.isArray(search)) {\n        return [...search];\n    } else if (isSearchExpressionGroup(search)) {\n        return [search as SearchExpressionGroup];\n    } else {\n        return [createGroupFromExpression(search as SearchExpression)];\n    }\n}\n"
  },
  {
    "path": "packages/search-expression/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport * from './compare';\nexport * from './exec';\nexport * from './group';\nexport * from './invert';\nexport * from './narrow';\nexport * from './types';\n"
  },
  {
    "path": "packages/search-expression/src/invert.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { isSearchExpressionGroup } from './group';\nimport {\n    Search,\n    SearchExpression,\n    SearchExpressionClause,\n    SearchExpressionGroup,\n    SearchExpressionOperators,\n} from './types';\n\nfunction invertSearchExpressionGroup(input: SearchExpressionGroup) {\n    //this only works if all expressions in this group have the same clause\n    const output: SearchExpressionGroup = {\n        expressions: input.expressions.map(invertSearchExpression),\n    };\n    if (input.clause) {\n        output.clause = invertedClauses[input.clause];\n    }\n    return output;\n}\n\nconst invertedOperators: { [key in SearchExpressionOperators]: SearchExpressionOperators } = {\n    '!=': '==',\n    '==': '!=',\n    '<': '>=',\n    '>=': '<',\n    '<=': '>',\n    '>': '<=',\n    '!contains': 'contains',\n    'contains': '!contains',\n    '!isnullorEmpty': 'isnullorEmpty',\n    'isnullorEmpty': '!isnullorEmpty',\n    '!starts': 'starts',\n    'starts': '!starts',\n};\n\nconst invertedClauses: { [key in SearchExpressionClause]: SearchExpressionClause } = {\n    '&&': '||',\n    '||': '&&',\n};\n\nfunction invertSearchExpression(input: SearchExpression) {\n    const operator = invertedOperators[input.operator];\n    const output: SearchExpression = { ...input, operator };\n    if (input.clause) {\n        output.clause = invertedClauses[input.clause];\n    }\n    return output;\n}\n\nexport function invert(search: Search): Search {\n    if (Array.isArray(search)) {\n        return (search as SearchExpressionGroup[]).map(invertSearchExpressionGroup);\n    } else if (isSearchExpressionGroup(search)) {\n        return invertSearchExpressionGroup(search as SearchExpressionGroup);\n    } else {\n        return invertSearchExpression(search as SearchExpression);\n    }\n}\n"
  },
  {
    "path": "packages/search-expression/src/narrow.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { ensureSearchExpressionGroupArray } from './group';\nimport { Search } from './types';\n\nexport function narrow(a: Search, b: Search) {\n    if (!a) {\n        return b;\n    }\n    const arrs = [a, b].map(ensureSearchExpressionGroupArray);\n    const [arrA, arrB] = arrs;\n    arrB[0].clause = '&&';\n    return arrA.concat(arrB);\n}\n"
  },
  {
    "path": "packages/search-expression/src/types.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport type SearchExpressionClause = '&&' | '||';\n\nexport type SearchExpressionStringSearchOperators = 'starts' | '!starts' | 'contains' | '!contains';\n\nexport type SearchExpressionOperators =\n    '==' | '!=' |\n    '<' | '<=' |\n    '>' | '>=' |\n    'isnullorEmpty' | '!isnullorEmpty' |\n    SearchExpressionStringSearchOperators;\n\nexport type SearchExpressionValue = boolean | Date | number | string;\n\nexport interface SearchExpression {\n    clause?: SearchExpressionClause;\n    name: string;\n    operator: SearchExpressionOperators;\n    value?: SearchExpressionValue;\n}\n\nexport interface SearchExpressionGroup<T extends SearchExpression = SearchExpression> {\n    clause?: SearchExpressionClause;\n    expressions: T[];\n}\n\nexport type Search = SearchExpression | SearchExpressionGroup | SearchExpressionGroup[];\n"
  },
  {
    "path": "packages/search-expression/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/vega-deck.gl/.gitignore",
    "content": "dist"
  },
  {
    "path": "packages/vega-deck.gl/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "packages/vega-deck.gl/README.md",
    "content": "# @msrvida/vega-deck.gl\n\nView component for [Vega](https://vega.github.io/) visualizations, using [deck.gl](https://deck.gl/) for WebGL rendering.\n\nThis project combines two great visualization libraries into one. You have the expressiveness of [Vega specifications](https://vega.github.io/vega/docs/specification/) and the WebGL rendering of [deck.gl](https://deck.gl). As a result, you have the option of visualizing data in 3 dimensions.\n\n\n## Limitations\n\nThis project does not fully implement every feature provided by Vega. Some interactive features are omitted due to the nature of the 3D rendering model which breaks correspondence to the 2D rendering plane. Other features simply have yet to be developed, for these we will gladly accept a pull request.\n\n## Feature additions\n\nRect elements can be rendered as 3D cuboids. To do this, add `\"z\"` / `\"depth\"` encodings where you normally use `\"x\"` / `\"width\"` and `\"y\"` / `\"height\"`.\n\n## Installation\n\nYou will need to consider how to load the libraries that `vega-deck.gl` depends on, based on your build & deployment scenario.\n\n## Installation via script tags\n\nThis is the quickest installation option. You can load scripts from a CDN, or you can serve them from your own website. In your HTML, add these tags:\n\n```html\n<script src=\"https://unpkg.com/vega@^5.11/build/vega.js\" charset=\"utf-8\"></script>\n<script src=\"https://unpkg.com/deck.gl@~8.3.7/dist.min.js\"></script>\n<script src=\"https://unpkg.com/@msrvida/vega-deck.gl@^3/dist/umd/vega-deck.gl.js\"></script>\n```\n\nA global variable named `VegaDeckGl` will be available to you. In your JavaScript, call the `use()` function to pass the dependency libraries to `VegaDeckGl`:\n\n```js\nVegaDeckGl.use(vega, deck, deck, luma);\n```\n\n## Installation via Node.js\n\nThis option is for those who are using a script bundler.\n\nAdd these to the `dependencies` section of your `package.json`, then run `npm install`:\n\n```json\n\"@deck.gl/core\": \"^8.3.7\",\n\"@deck.gl/layers\": \"^8.3.7\",\n\"@luma.gl/core\": \"^8.3.1\",\n\"@msrvida/vega-deck.gl\": \"^3\",\n\"vega\": \"^5.17.0\"\n```\n\nImport these in your JavaScript, then call the `use()` function to pass the dependency libraries to `VegaDeckGl`:\n\n```js\nimport * as deck from '@deck.gl/core';\nimport * as layers from '@deck.gl/layers';\nimport * as luma from '@luma.gl/core';\nimport * as vega from 'vega';\nimport * as VegaDeckGl from '@msrvida/vega-deck.gl';\n\nVegaDeckGl.use(vega, deck, layers, luma);\n```\n\n## Usage\n\n`VegaDeckGl.ViewGl` uses the same API as [Vega's View](https://github.com/vega/vega-view). In addition to `'canvas'` and `'svg'`, you can now pass `'deck.gl'` as the type of the renderer:\n\n```js\nvar view = new VegaDeckGl.ViewGl(vega.parse(spec))\n    .renderer('deck.gl')\n    .initialize(document.querySelector('#vis'))\n    .run();\n```\n\n## Versions\n\n### 3.3.0 Changes\n\n* Show z-axis scale\n\n### 3.2.0 Changes\n\n* Fix for animation easing\n* Text character set accepts all unicode\n\n### 3.1.0 Changes\n\n* Added line marks\n* Added area marks\n\n### Breaking changes in v3\n\n* `Stage.TickText` now `VegaTextLayerDatum` type\n* `View` type deleted\n* `util.isColor` function deleted\n"
  },
  {
    "path": "packages/vega-deck.gl/alias/deck-external.js",
    "content": "module.exports = deck;\n"
  },
  {
    "path": "packages/vega-deck.gl/alias/luma-external.js",
    "content": "module.exports = luma;\n"
  },
  {
    "path": "packages/vega-deck.gl/alias/react-external.js",
    "content": "module.exports = React;\n"
  },
  {
    "path": "packages/vega-deck.gl/package.json",
    "content": "{\n  \"name\": \"@msrvida/vega-deck.gl\",\n  \"version\": \"3.3.6\",\n  \"description\": \"Deck.gl renderer for Vega\",\n  \"main\": \"dist/es6/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/SandDance.git\",\n    \"directory\": \"packages/vega-deck.gl\"\n  },\n  \"files\": [\n    \"dist\"\n  ],\n  \"scripts\": {\n    \"x-deploy\": \"node ./scripts/deploy.js\",\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"watch-typescript\": \"tsc -p . -w\",\n    \"build-typescript\": \"tsc -p .\",\n    \"bundle\": \"rollup -c\",\n    \"x-build:02\": \"npm run build-typescript && npm run bundle\",\n    \"remove-vega\": \"npm un vega-typings\",\n    \"patch-after-vega-upgrade\": \"npm version patch\"\n  },\n  \"keywords\": [\n    \"vega\",\n    \"deck.gl\",\n    \"webgl\"\n  ],\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@danmarshall/deckgl-typings\": \"^4.1.11\",\n    \"@msrvida/chart-types\": \"^1\",\n    \"d3-color\": \"^3.1.0\",\n    \"d3-ease\": \"^1.0.5\",\n    \"deepmerge\": \"^2.1.1\",\n    \"tsx-create-element\": \"^2.2.9\",\n    \"vega-typings\": \"~2.1.0\"\n  }\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/rollup.config.mjs",
    "content": "import commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport resolve from '@rollup/plugin-node-resolve';\n\nexport default {\n    input: './dist/es6/index.js',\n    output: {\n        file: './dist/umd/vega-deck.gl.js',\n        format: 'umd',\n        name: 'VegaDeckGl',\n    },\n    plugins: [\n        json(),\n        resolve({ jsnext: true }),\n        commonjs({ sourceMap: false }),\n    ],\n};\n"
  },
  {
    "path": "packages/vega-deck.gl/scripts/deploy.js",
    "content": "const fs = require('fs');\n\nconst pubversion = 'v3';\n\nfs.copyFileSync('./dist/umd/vega-deck.gl.js', `../../docs/dist/vega-deck.gl/${pubversion}/vega-deck.gl.js`);\n"
  },
  {
    "path": "packages/vega-deck.gl/src/array.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport function concat<T>(...args: T[][]) {\n    return args.reduce((p, c) => c ? p.concat(c) : p, []);\n}\n\n/**\n * Returns array with items which are truthy.\n * @param args array or arrays to concat into a single array.\n */\nexport function allTruthy<T>(...args: T[][]) {\n    return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n}\n\n/**\n * Add an array to an existing array in place.\n * @param arr Array to append to.\n * @param items Arrof of items to append.\n */\nexport function push<T>(arr: T[], items: T[]) {\n    arr.push.apply(arr, items);\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/base.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport {\n    _CameraLight,\n    AmbientLight,\n    CompositeLayer,\n    COORDINATE_SYSTEM,\n    Deck,\n    DirectionalLight,\n    IconLayer,\n    Layer,\n    LightingEffect,\n    LinearInterpolator,\n    LineLayer,\n    OrbitController,\n    OrbitView,\n    PathLayer,\n    PolygonLayer,\n    gouraudLighting,\n    picking,\n    project32,\n    TextLayer,\n} from 'deck.gl';\nimport {\n    CanvasHandler,\n    inferType,\n    inferTypes,\n    loader,\n    parse,\n    read,\n    Renderer,\n    renderModule,\n    sceneVisit,\n    scheme,\n    truncate,\n    View,\n} from 'vega-typings';\nimport { CubeGeometry, Model, Texture2D } from '@luma.gl/core';\n\n/**\n * Vega library dependency.\n */\nexport interface VegaBase {\n    CanvasHandler: CanvasHandler;\n    inferType: typeof inferType;\n    inferTypes: typeof inferTypes;\n    loader: typeof loader;\n    parse: typeof parse;\n    read: typeof read;\n    renderModule: typeof renderModule;\n    Renderer: typeof Renderer,\n    sceneVisit: typeof sceneVisit\n    scheme: typeof scheme,\n    truncate: typeof truncate,\n    View: typeof View,\n}\n\nconst vega: VegaBase = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null,\n};\n\n/**\n * deck.gl/core dependency.\n */\nexport interface DeckBase {\n    _CameraLight: typeof _CameraLight,\n    AmbientLight: typeof AmbientLight,\n    CompositeLayer: typeof CompositeLayer;\n    COORDINATE_SYSTEM: typeof COORDINATE_SYSTEM;\n    Deck: typeof Deck;\n    DirectionalLight: typeof DirectionalLight;\n    Layer: typeof Layer;\n    LightingEffect: typeof LightingEffect;\n    LinearInterpolator: typeof LinearInterpolator;\n    OrbitView: typeof OrbitView;\n    OrbitController: typeof OrbitController;\n    gouraudLighting: typeof gouraudLighting;\n    picking: typeof picking;\n    project32: typeof project32;\n}\n\n/**\n * deck.gl/layers dependency.\n */\nexport interface DeckLayerBase {\n    IconLayer: typeof IconLayer;\n    LineLayer: typeof LineLayer;\n    PathLayer: typeof PathLayer;\n    PolygonLayer: typeof PolygonLayer;\n    TextLayer: typeof TextLayer;\n}\n\nconst deck: DeckBase = {\n    _CameraLight: null,\n    AmbientLight: null,\n    CompositeLayer: null,\n    COORDINATE_SYSTEM: null,\n    Deck: null,\n    DirectionalLight: null,\n    Layer: null,\n    LightingEffect: null,\n    LinearInterpolator: null,\n    OrbitView: null,\n    OrbitController: null,\n    gouraudLighting: null,\n    picking: null,\n    project32:  null,\n};\n\nconst layers: DeckLayerBase = {\n    IconLayer: null,\n    LineLayer: null,\n    PathLayer: null,\n    PolygonLayer: null,\n    TextLayer: null,\n};\n\n/**\n * luma.gl dependency.\n */\nexport interface LumaBase {\n    CubeGeometry: typeof CubeGeometry;\n    Model: typeof Model;\n    Texture2D: typeof Texture2D\n}\n\nconst luma: LumaBase = {\n    CubeGeometry: null,\n    Model: null,\n    Texture2D: null,\n};\n\n/**\n * References to dependency libraries.\n */\nexport interface Base {\n    deck: DeckBase;\n    layers: DeckLayerBase;\n    luma: LumaBase;\n    vega: VegaBase;\n}\n\n/**\n * References to dependency libraries.\n */\nexport const base: Base = {\n    deck,\n    layers,\n    luma,\n    vega,\n};\n\n/**\n * Specify the dependency libraries to use for rendering.\n * @param vega Vega library.\n * @param deck deck/core library.\n * @param layers deck/layers library.\n * @param luma luma.gl library.\n */\nexport function use(vega: VegaBase, deck: DeckBase, layers: DeckLayerBase, luma: LumaBase) {\n    base.deck = deck;\n    base.layers = layers;\n    base.luma = luma;\n    base.vega = vega;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/clone.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as _deepmerge from 'deepmerge';\n\nconst deepmerge = ((_deepmerge as any).default || _deepmerge) as typeof _deepmerge;\n\nexport function clone<T extends object>(objectToClone: T) {\n    if (!objectToClone) return objectToClone;\n    return deepmerge.all([objectToClone]) as T;\n}\n\nconst dontMerge = (destination, source) => source;\n\nexport function deepMerge<T>(...objectsToMerge: T[]) {\n    const objects = objectsToMerge.filter(Boolean) as any as object[];\n    return deepmerge.all(objects, { arrayMerge: dontMerge }) as any as T;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/color.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { RGBAColor } from '@deck.gl/core/utils/color';\nimport {\n    color as d3color,\n    hsl as d3hsl,\n    rgb as d3rgb,\n    RGBColor,\n} from 'd3-color';\n\nfunction rgbToDeckglColor(c: RGBColor): RGBAColor {\n    return [c.r, c.g, c.b, c.opacity * 255];\n}\n\n/**\n * Compares 2 colors to see if they are equal.\n * @param a RGBAColor to compare\n * @param b RGBAColor to compare\n * @returns True if colors are equal.\n */\nexport function colorIsEqual(a: RGBAColor, b: RGBAColor) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) {\n        if (a[i] !== b[i]) return false;\n    }\n    return true;\n}\n\n/**\n * Convert a CSS color string to a Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n */\nexport function colorFromString(cssColorSpecifier: string): RGBAColor {\n    if (cssColorSpecifier) {\n        const dc = d3color(cssColorSpecifier);\n        if (dc) {\n            const c = dc.rgb();\n            return rgbToDeckglColor(c);\n        }\n    }\n}\n\n/**\n * Convert a Deck.gl color to a CSS rgba() string.\n * @param color A Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n */\nexport function colorToString(color: RGBAColor) {\n    const c = [...color];\n    if (c.length > 3) {\n        c[3] /= 255;\n    }\n    return `rgba(${c.join(',')})`;\n}\n\nexport function desaturate(color: RGBAColor, value: number): RGBAColor {\n    const rgb = d3rgb(color[0], color[1], color[2], color[3] / 255);\n    const hslColor = d3hsl(rgb);\n    hslColor.s = value;\n    const c = hslColor.rgb();\n    return rgbToDeckglColor(c);\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/constants.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const layerNames = {\n    cubes: 'LAYER_CUBES',\n    lines: 'LAYER_LINES',\n    text: 'LAYER_TEXT',\n    paths: 'LAYER_PATHS',\n    polygons: 'LAYER_POLYGONS',\n};\n"
  },
  {
    "path": "packages/vega-deck.gl/src/controls.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { createElement, StatelessComponent, StatelessProps } from 'tsx-create-element';\n\nexport interface TableCell {\n    className?: string;\n    content: string | JSX.Element;\n    title?: string;\n}\n\nexport interface TableRow {\n    cells: TableCell[];\n}\n\nexport interface TableProps {\n    className?: string;\n    onRowClick?: (e: Event, index: number) => void;\n    rows: TableRow[];\n    rowClassName?: string;\n}\n\nexport const KeyCodes = {\n    ENTER: 'Enter',\n};\n\nexport const Table: StatelessComponent<TableProps> = (props: StatelessProps<TableProps>) => {\n    return (\n        <table className={props.className}>\n            {props.children}\n            {props.rows.map((row, i) => (\n                <tr\n                    className={props.rowClassName || ''}\n                    onClick={e => props.onRowClick && props.onRowClick(e as any as MouseEvent, i)}\n                    tabIndex={props.onRowClick ? 0 : -1}\n                    onKeyUp={e => {\n                        if (e.key === KeyCodes.ENTER && props.onRowClick) {\n                            props.onRowClick(e as any as KeyboardEvent, i);\n                        }\n                    }}\n                >\n                    {row.cells.map((cell, i) => (\n                        <td\n                            className={cell.className || ''}\n                            title={cell.title || ''}\n                        >{cell.content}</td>\n                    ))}\n                </tr>\n            ))}\n        </table>\n    );\n};\n"
  },
  {
    "path": "packages/vega-deck.gl/src/cube-layer/cube-layer-fragment.glsl.ts",
    "content": "// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nexport default `\\\n#define SHADER_NAME cube-layer-fragment-shader\n\nprecision highp float;\n\nvarying vec4 vColor;\n\nvoid main(void) {\n  gl_FragColor = vColor;\n\n  // use highlight color if this fragment belongs to the selected object.\n  gl_FragColor = picking_filterHighlightColor(gl_FragColor);\n\n  // use picking color if rendering to picking FBO.\n  gl_FragColor = picking_filterPickingColor(gl_FragColor);\n}\n`;\n"
  },
  {
    "path": "packages/vega-deck.gl/src/cube-layer/cube-layer-vertex.glsl.ts",
    "content": "// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport { min3dDepth, minPixelSize } from '../defaults';\n\nexport default `\\\n#define SHADER_NAME cube-layer-vertex-shader\n\nattribute vec3 positions;\nattribute vec3 normals;\n\nattribute vec3 instancePositions;\nattribute vec3 instancePositions64Low;\nattribute vec3 instanceSizes;\nattribute vec4 instanceColors;\nattribute vec3 instancePickingColors;\n\n// Custom uniforms\nuniform float lightingMix;\n\n// Result\nvarying vec4 vColor;\n\nvoid main(void) {\n\n  float x = instanceSizes.x > 0.0 ? max(instanceSizes.x, ${minPixelSize.toFixed(1)}) : 0.0;\n  float y = instanceSizes.y > 0.0 ? max(instanceSizes.y, ${minPixelSize.toFixed(1)}) : 0.0;\n\n  // if alpha == 0.0, do not render element\n  float noRender = float(instanceColors.a == 0.0);\n  float finalXScale = project_size(x) * mix(1.0, 0.0, noRender);\n  float finalYScale = project_size(y) * mix(1.0, 0.0, noRender);\n  float finalZScale = project_size(instanceSizes.z) * mix(1.0, 0.0, noRender);\n\n  // cube geometry vertics are between -1 to 1, scale and transform it to between 0, 1\n  vec3 offset = vec3(\n    (positions.x + 1.0) / 2.0 * finalXScale,\n    (positions.y + 1.0) / 2.0 * finalYScale,\n    (positions.z + 1.0) / 2.0 * finalZScale);\n\n  // extrude positions\n  vec4 position_worldspace;\n  gl_Position = project_position_to_clipspace(instancePositions, instancePositions64Low, offset, position_worldspace);\n  \n  vec3 lightColor = lighting_getLightColor(instanceColors.rgb, project_uCameraPosition, position_worldspace.xyz, project_normal(normals));\n  vec3 mixedLight = mix(instanceColors.rgb, lightColor, lightingMix);\n  vec4 color = vec4(mixedLight, instanceColors.a) / 255.0;\n  vColor = color;\n\n  // Set color to be rendered to picking fbo (also used to check for selection highlight).\n  picking_setPickingColor(instancePickingColors);\n}\n`;\n"
  },
  {
    "path": "packages/vega-deck.gl/src/cube-layer/cube-layer.ts",
    "content": "// Copyright (c) 2015 - 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n// Adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/layers/src/grid-cell-layer/grid-cell-layer.js\n\nimport fs from './cube-layer-fragment.glsl';\nimport vs from './cube-layer-vertex.glsl';\nimport { base } from '../base';\nimport { LinearInterpolator_Class } from '../deck.gl-classes/linearInterpolator';\nimport { Cube } from '../interfaces';\nimport { LayerProps } from '@deck.gl/core/lib/layer';\nimport { RGBAColor } from '@deck.gl/core/utils/color';\nimport { Layer } from 'deck.gl';\n\nexport interface CubeLayerDefaultProps {\n    lightingMix: number;\n    getColor?: (o: Cube) => number[];\n    getSize?: (o: Cube) => number[];\n    getPosition?: (o: Cube) => number[];\n    material?: any;\n}\n\nexport interface CubeLayerDataProps {\n    interpolator?: LinearInterpolator_Class<CubeLayerInterpolatedProps>;\n}\n\nexport interface CubeLayerInterpolatedProps {\n    lightingMix: number;\n}\n\nexport type CubeLayerProps = LayerProps<Cube> & CubeLayerDefaultProps & CubeLayerDataProps;\n\n//https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\nconst UNSIGNED_BYTE = 0x1401;\nconst DOUBLE = 0x140a;\n\nconst DEFAULT_COLOR: RGBAColor = [255, 0, 255, 255];\n\nconst defaultProps: CubeLayerDefaultProps = {\n    lightingMix: 0.5,\n    getSize: x => x.size,\n    getPosition: x => x.position,\n    getColor: x => x.color,\n    material: { ambient: 0.5, diffuse: 1 },\n};\n\nfunction _CubeLayer(props?: CubeLayerProps) {\n\n    //dynamic superclass, since we don't know have deck.Layer in the declaration phase\n    class __CubeLayer extends base.deck.Layer<Cube> {\n\n        static layerName = 'CubeLayer';\n        static defaultProps = defaultProps;\n\n        public id: string;\n        public props: CubeLayerProps;\n\n        getShaders() {\n            return { vs, fs, modules: [base.deck.project32, base.deck.gouraudLighting, base.deck.picking] };\n        }\n\n        initializeState() {\n            const attributeManager = this.getAttributeManager();\n            attributeManager.addInstanced({\n                instancePositions: {\n                    size: 3,\n                    type: DOUBLE,\n                    transition: true,\n                    accessor: 'getPosition',\n                },\n                instanceSizes: {\n                    size: 3,\n                    transition: true,\n                    accessor: 'getSize',\n                },\n                instanceColors: {\n                    size: 4,\n                    type: UNSIGNED_BYTE,\n                    transition: true,\n                    accessor: 'getColor',\n                    defaultValue: DEFAULT_COLOR,\n                },\n            });\n        }\n\n        updateState({ props, oldProps, changeFlags }) {\n            super.updateState({ props, oldProps, changeFlags } as any); //TODO add parameter type to deck.gl-typings\n            // Re-generate model if geometry changed\n            //if (props.fp64 !== oldProps.fp64) {\n            const { gl } = this.context;\n            if (this.state.model) {\n                this.state.model.delete();\n            }\n            this.setState({ model: this._getModel(gl) });\n            this.getAttributeManager().invalidateAll();\n            //}\n        }\n\n        _getModel(gl) {\n            return new base.luma.Model(\n                gl,\n                Object.assign({}, this.getShaders(), {\n                    id: this.props.id,\n                    geometry: new base.luma.CubeGeometry(),\n                    isInstanced: true,\n                    //shaderCache: this.context['shaderCache']\n                }),\n            );\n        }\n\n        draw({ uniforms }) {\n            let { lightingMix } = this.props;\n            if (this.props.interpolator && this.props.interpolator.layerInterpolatedProps) {\n                lightingMix = this.props.interpolator.layerInterpolatedProps.lightingMix;\n            }\n            this.state.model.setUniforms(\n                Object.assign({}, uniforms, {\n                    lightingMix,\n                }),\n            ).draw();\n        }\n    }\n\n    const instance = new __CubeLayer(props) as Layer<Cube>;\n\n    return instance;\n}\n\n//signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * CubeLayer - a Deck.gl layer to render cuboids.\n * This is instantiatable by calling `new CubeLayer()`.\n */\nexport const CubeLayer: typeof CubeLayer_Class = _CubeLayer as any;\n\n/**\n * CubeLayer - a Deck.gl layer to render cuboids.\n * This is not instantiatable, it is the TypeScript declaration of the type.\n */\nexport declare class CubeLayer_Class extends base.deck.Layer<Cube> {\n    id: string;\n    props: CubeLayerProps;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/deck.gl-classes/deckgl.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport Deck, { DeckProps, InteractiveState } from '@deck.gl/core/lib/deck';\nimport { base } from '../base';\nimport { createOrbitControllerClass, OrbitController_Class, OrbitControllerClassOptions } from './orbitController';\n\n//adapted from https://github.com/uber/deck.gl/blob/5.3-release/modules/lite/src/deckgl.js\n\nconst CANVAS_STYLE = {\n    position: 'absolute',\n    left: 0,\n    top: 0,\n    width: '100%',\n    height: '100%',\n};\n\nexport interface InteractiveStateVegaDeckGL extends InteractiveState {\n    onCube: boolean;\n    onText: boolean;\n    onAxisSelection: boolean;\n}\n\nexport type DeckGLInternalProps = DeckProps & {\n    container?: HTMLElement;\n    getCursor?: (interactiveState: InteractiveStateVegaDeckGL) => string;\n}\n\n// Create canvas elements for map and deck\nfunction createCanvas(props: DeckGLInternalProps) {\n    let { container = document.body } = props;\n\n    if (typeof container === 'string') {\n        container = document.getElementById(container);\n    }\n\n    if (!container) {\n        throw Error('Deck: container not found');\n    }\n\n    // Add DOM elements\n    const containerStyle = window.getComputedStyle(container);\n    if (containerStyle.position === 'static') {\n        container.style.position = 'relative';\n    }\n\n    const deckCanvas = document.createElement('canvas');\n    container.appendChild(deckCanvas);\n    Object.assign(deckCanvas.style, CANVAS_STYLE);\n\n    return { container, deckCanvas };\n}\n\nexport interface DeckGLClassesForPresenter {\n    OrbitControllerClass: typeof OrbitController_Class;\n    DeckGL_Class: typeof DeckGL_Class;\n}\n\n/**\n * Creates Deck.gl classes for rendering WebGL.\n * DEck.gl is instantiatable by calling `new createDeckGLClassesForPresenter(controlleroptions)(deckProps)`.\n */\nexport function createDeckGLClassesForPresenter(factoryOptions: OrbitControllerClassOptions): DeckGLClassesForPresenter {\n    const OrbitControllerClass = createOrbitControllerClass(factoryOptions);\n\n    //dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n    //This allows us to retrieve Deck from either UMD or ES6 consumers of this class.\n\n    function wrapper(props: DeckProps) {\n\n        /**\n         * @params container (Element) - DOM element to add deck.gl canvas to\n         * @params controller (Object) - Controller class. Leave empty for auto detection\n         */\n        class DeckGLInternal extends base.deck.Deck {\n            private _updateViewState;\n            private onViewStateChange;\n            public interactiveState: InteractiveStateVegaDeckGL;\n\n            constructor(props: DeckGLInternalProps) {\n                if (typeof document === 'undefined') {\n                    // Not browser\n                    throw Error('Deck can only be used in the browser');\n                }\n\n                const { deckCanvas } = createCanvas(props);\n\n                const viewState = props.initialViewState || props.viewState || {};\n\n                super(\n                    Object.assign({}, props, {\n                        width: '100%',\n                        height: '100%',\n                        canvas: deckCanvas,\n                        controller: OrbitControllerClass,\n                        initialViewState: viewState,\n                    }),\n                );\n\n                // Callback for the controller\n                this._updateViewState = params => {\n                    if (this.onViewStateChange) {\n                        this.onViewStateChange(params);\n                    }\n                };\n            }\n\n            setProps(props) {\n                // this._updateViewState must be bound to `this`\n                // but we don't have access to the current instance before calling super().\n                if ('onViewStateChange' in props && this._updateViewState) {\n                    // This is called at least once at _onRendererInitialized\n                    this.onViewStateChange = props.onViewStateChange;\n                    props.onViewStateChange = this._updateViewState;\n                }\n\n                super.setProps(props);\n            }\n        }\n\n        const instance = new DeckGLInternal(props) as Deck;\n\n        return instance;\n    }\n\n    return {\n        OrbitControllerClass,\n        DeckGL_Class: wrapper as any,\n    };\n}\n\n/**\n * Deck.gl instance for rendering WebGL.\n * This is not instantiatable, it is the TypeScript declaration of the type.\n */\nexport declare class DeckGL_Class extends base.deck.Deck {\n    public interactiveState: InteractiveStateVegaDeckGL;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/deck.gl-classes/linearInterpolator.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { LinearInterpolator as _LinearInterpolator } from '@deck.gl/core';\n\nexport interface ILinearInterpolator<T> {\n    layerStartProps: T;\n    layerEndProps: T;\n    layerInterpolatedProps: T;\n}\n\nfunction wrapper(props: any) {\n\n    class LinearInterpolatorInternal<T> extends base.deck.LinearInterpolator implements ILinearInterpolator<T> {\n        public layerStartProps: any;\n        public layerEndProps: any;\n        public layerInterpolatedProps: any;\n\n        constructor(transitionProps?: string[]) {\n            super(transitionProps);\n        }\n\n        interpolateProps(viewStateStartProps: any, viewStateEndProps: any, t: any) {\n            if (this.layerStartProps && this.layerEndProps) {\n                this.layerInterpolatedProps = super.interpolateProps(this.layerStartProps, this.layerEndProps, t);\n            }\n            return super.interpolateProps(viewStateStartProps, viewStateEndProps, t);\n        }\n    }\n\n    const instance = new LinearInterpolatorInternal(props) as _LinearInterpolator;\n\n    return instance;\n}\n\nexport const LinearInterpolator: typeof LinearInterpolator_Class = wrapper as any;\n\nexport declare class LinearInterpolator_Class<T> extends base.deck.LinearInterpolator implements ILinearInterpolator<T> {\n    layerStartProps: T;\n    layerEndProps: T;\n    layerInterpolatedProps: T;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/deck.gl-classes/orbitController.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport OrbitController from '@deck.gl/core/controllers/orbit-controller';\nimport { base } from '../base';\n\nexport interface OrbitControllerClassOptions {\n    doubleClickHandler?: (e: MouseEvent, orbitController: OrbitController_Class) => boolean;\n}\n\nexport function createOrbitControllerClass(factoryOptions: OrbitControllerClassOptions): typeof OrbitController_Class {\n\n    function wrapper(props: any) {\n\n        class OrbitControllerInternal extends base.deck.OrbitController {\n            public invertPan: boolean;\n            public dragRotate: boolean;\n\n            constructor(props: any) {\n                super(props);\n                this.invertPan = true;\n            }\n\n            handleEvent(event: MouseEvent) {\n                if (event.type === 'doubletap') {\n                    if (factoryOptions && factoryOptions.doubleClickHandler) {\n                        return factoryOptions.doubleClickHandler(event, this);\n                    }\n                }\n                return super.handleEvent(event);\n            }\n        }\n\n        const instance = new OrbitControllerInternal(props) as OrbitController;\n\n        return instance;\n    }\n\n    return wrapper as any;\n}\n\nexport declare class OrbitController_Class extends base.deck.OrbitController { }\n"
  },
  {
    "path": "packages/vega-deck.gl/src/defaults.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport {\n    Cube,\n    PresenterConfig,\n    PresenterStyle,\n    Stage,\n} from './interfaces';\n//import { LightSettings } from '@deck.gl/core/lib/layer';\nimport { View } from '@msrvida/chart-types';\n\nexport const minHeight = '100px';\nexport const minWidth = '100px';\n\n// const lightSettings: { [view in View]: LightSettings } = {\n//     '2d': {},\n//     '3d': {\n//         lightsPosition: [-122.45, 37.66, 8000, -122.0, 38.0, 8000],\n//         ambientRatio: 0.3,\n//         diffuseRatio: 0.6,\n//         specularRatio: 0.4,\n//         lightsStrength: [0.3, 0.0, 0.8, 0.0],\n//         numberOfLights: 2\n//     }\n// };\n\nexport const defaultPresenterStyle: PresenterStyle = {\n    cssPrefix: 'vega-deckgl-',\n    defaultCubeColor: [128, 128, 128, 255],\n    highlightColor: [0, 0, 0, 255],\n    //lightSettings\n};\n\nexport const defaultPresenterConfig: PresenterConfig = {\n    onCubeClick: (e, cube: Cube) => { },\n    onCubeHover: (e, cube: Cube) => { },\n    transitionDurations: {\n        color: 100,\n        position: 600,\n        size: 600,\n        view: 600,\n    },\n};\n\nexport function createStage(view: View) {\n    const stage: Stage = {\n        view,\n        cubeData: [],\n        pathData: [],\n        polygonData: [],\n        axes: {\n            x: [],\n            y: [],\n            z: [],\n        },\n        gridLines: [],\n        textData: [],\n        legend: {\n            rows: {},\n        },\n        facets: [],\n    };\n    return stage;\n}\n\nexport const groupStrokeWidth = 1;\n\nexport const lineZ = -1;\n\nexport const defaultView: View = '2d';\n\nexport const min3dDepth = 0.05;\nexport const minPixelSize = 0.5;\n"
  },
  {
    "path": "packages/vega-deck.gl/src/easing.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { easeExpInOut } from 'd3-ease';\n\nexport function easing(t: number) {\n    if (t === 0 || t === 1) return t;\n    return easeExpInOut(t);\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/effects.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from './base';\nimport { Effect } from '@deck.gl/core';\n\nexport function lightingEffects(): Effect[] {\n\n    const ambientLight = new base.deck.AmbientLight({\n        color: [255, 255, 255],\n        intensity: 0.3,\n    });\n\n    const cameraLight = new base.deck._CameraLight({\n        color: [255, 255, 255],\n        intensity: 1,\n    });\n\n    // const directionalLight = new base.deck.DirectionalLight({\n    //     color: [255, 255, 255],\n    //     direction: [0, 0, -1],\n    //     intensity: 0.2\n    //   });\n\n    return [new base.deck.LightingEffect({ ambientLight, cameraLight })];\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/enums.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * HTML elements outputted by the presenter.\n */\nexport enum PresenterElement {\n    root, gl, panel, legend, vegaControls,\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/exports/controls.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * This file is for external facing export only, do not use this for internal references, \n * as it may cause circular dependencies in Rollup.\n */\n\nimport { Table, TableCell, TableProps, TableRow } from '../controls';\n\n//alphabetize interfaces for documentation\nexport { TableCell, TableProps, TableRow };\n\n//alphabetize variables for documentation\nexport { Table };\n"
  },
  {
    "path": "packages/vega-deck.gl/src/exports/types.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * This file is for external facing export only, do not use this for internal references, \n * as it may cause circular dependencies in Rollup.\n */\n\nimport {\n    Axis,\n    Cube,\n    FacetRect,\n    Legend,\n    LegendRow,\n    LegendRowSymbol,\n    PresenterConfig,\n    PresenterStyle,\n    PreStage,\n    QueuedAnimationOptions,\n    Scene3d,\n    Stage,\n    StyledLine,\n    TickText,\n    TransitionDurations,\n    Vec3,\n    VegaTextLayerDatum,\n} from '../interfaces';\nimport {\n    Base,\n    DeckBase,\n    DeckLayerBase,\n    LumaBase,\n    VegaBase,\n} from '../base';\nimport { CubeLayerDataProps, CubeLayerDefaultProps, CubeLayerProps } from '../cube-layer/cube-layer';\nimport { ViewGlConfig } from '../vega-classes/viewGl';\n\n\n//alphabetize interfaces  for documentation\nexport {\n    Axis,\n    Base,\n    Cube,\n    CubeLayerDataProps,\n    CubeLayerDefaultProps,\n    DeckBase,\n    DeckLayerBase,\n    FacetRect,\n    Legend,\n    LegendRow,\n    LegendRowSymbol,\n    LumaBase,\n    PreStage,\n    PresenterConfig,\n    PresenterStyle,\n    QueuedAnimationOptions,\n    Scene3d,\n    Stage,\n    StyledLine,\n    TickText,\n    TransitionDurations,\n    VegaBase,\n    VegaTextLayerDatum,\n    ViewGlConfig,\n};\n\n//alphabetize types  for documentation\nexport { CubeLayerProps, Vec3 };\n"
  },
  {
    "path": "packages/vega-deck.gl/src/exports/util.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * This file is for external facing export only, do not use this for internal references, \n * as it may cause circular dependencies in Rollup.\n */\n\nimport { allTruthy, concat, push } from '../array';\nimport { addDiv, addEl, outerSize } from '../htmlHelpers';\nimport { clone, deepMerge } from '../clone';\nimport { colorFromString, colorIsEqual, colorToString, desaturate } from '../color';\nimport { createElement, getActiveElementInfo, mount, setActiveElement } from 'tsx-create-element';\nimport { getCubeLayer, getCubes } from '../layers';\n\n//alphabetize for documentation\nexport { addDiv, addEl, allTruthy, clone, colorFromString, colorIsEqual, colorToString, concat, createElement, deepMerge, desaturate, getActiveElementInfo, getCubeLayer, getCubes, mount, outerSize, push, setActiveElement };\n"
  },
  {
    "path": "packages/vega-deck.gl/src/htmlHelpers.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * Create a new element as a child of another element.\n * @param tagName Tag name of the new tag to create.\n * @param parentElement Reference of the element to append to.\n * @returns new HTMLElement.\n */\nexport function addEl(tagName: string, parentElement: HTMLElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n}\n\n/**\n * Create a new div HTMLElement as a child of another element.\n * @param parentElement Reference of the element to append to.\n * @param className Optional css class name to apply to the div.\n */\nexport function addDiv(parentElement: HTMLElement, className?: string) {\n    const div = addEl('div', parentElement) as HTMLDivElement;\n    if (className) {\n        div.className = className;\n    }\n    return div;\n}\n\n/**\n * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n * @param el HTML Element to measure.\n */\nexport function outerSize(el: HTMLElement) {\n    const cs = getComputedStyle(el);\n    const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return { height, width };\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as constants from './constants';\nimport * as controls from './exports/controls';\nimport * as types from './exports/types';\nimport * as util from './exports/util';\nimport * as defaults from './defaults';\n\nexport { base, use } from './base';\nexport { Presenter } from './presenter';\nexport { ViewGl } from './vega-classes/viewGl';\n\nexport * from './enums';\nexport { constants, controls, defaults, types, util };\n\n//export deck.gl types\nexport {\n    DeckProps,\n    LayerInputHandler,\n    PickInfo,\n    Position,\n    RGBAColor,\n} from 'deck.gl';\n"
  },
  {
    "path": "packages/vega-deck.gl/src/interfaces.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { DeckProps, PickInfo } from '@deck.gl/core/lib/deck';\nimport { RGBAColor } from '@deck.gl/core/utils/color';\nimport { Position } from '@deck.gl/core/utils/positions';\nimport { AlignmentBaseline, TextAnchor } from '@deck.gl/layers/text-layer/text-layer';\nimport { View } from '@msrvida/chart-types';\nimport { Scene } from 'vega-typings';\n//import { LightSettings } from '@deck.gl/core/lib/layer';\n\nexport interface VegaTextLayerDatum {\n    color: RGBAColor;\n    text: string;\n    position: Position;\n    size: number;\n    angle?: number;\n    textAnchor?: TextAnchor;\n    alignmentBaseline?: AlignmentBaseline;\n    metaData?: any;\n}\n\nexport interface StyledLine {\n    color?: RGBAColor;\n    sourcePosition: Vec3;\n    strokeWidth?: number;\n    targetPosition: Vec3;\n}\n\nexport interface TickText extends VegaTextLayerDatum {\n    value: number | string;\n}\n\nexport type AxisRole = 'x' | 'y' | 'z';\n\nexport interface Axis {\n    domain: StyledLine;\n    ticks: StyledLine[];\n    tickText: TickText[];\n    title?: VegaTextLayerDatum;\n    role?: AxisRole;\n}\n\n/**\n * 3 dimensional array of numbers.\n */\nexport type Vec3 = [number, number, number];\n\n/**\n * Cuboid information. The cube does not need to have equal dimensions.\n */\nexport interface Cube {\n\n    /**\n     * Ordinal position.\n     */\n    ordinal?: number;\n\n    /**\n     * Flag whether this cube is a \"placeholder\" and is not to be rendered nor contains cube data.\n     */\n    isEmpty?: boolean;\n\n    color: RGBAColor;\n    position: Vec3;\n    size: Vec3;\n}\n\nexport interface Path {\n    positions: Position[];\n    strokeColor: RGBAColor;\n    strokeWidth: number;\n}\n\nexport interface Polygon {\n    positions: Position[];\n    strokeColor: RGBAColor;\n    fillColor: RGBAColor;\n    strokeWidth: number;\n    depth: number;\n}\n/**\n * Vega Scene plus camera type.\n */\nexport interface Scene3d extends Scene {\n    view: View;\n}\n\n/**\n * Rect area and title for a facet.\n */\nexport interface FacetRect {\n    datum: any;\n    lines: StyledLine[];\n}\n\n/**\n * Data structure containing all that is necessary to present a chart.\n */\nexport interface Stage {\n    backgroundColor?: RGBAColor;\n    cubeData?: Cube[];\n    pathData?: Path[];\n    polygonData?: Polygon[];\n    legend?: Legend;\n    axes?: {\n        x?: Axis[];\n        y?: Axis[];\n        z?: Axis[];\n    };\n    textData?: VegaTextLayerDatum[];\n    view?: View;\n    gridLines?: StyledLine[];\n    facets?: FacetRect[];\n}\n\nexport interface Legend {\n    title?: string;\n    rows: { [index: number]: LegendRow };\n}\n\nexport interface LegendRow {\n    label?: string;\n    value?: string;\n    symbol?: LegendRowSymbol;\n}\n\nexport interface LegendRowSymbol {\n    bounds: {\n        x1: number;\n        y1: number;\n        x2: number;\n        y2: number;\n    };\n    fill: string;\n    shape: string;\n}\n\n/**\n * Function that can be called prior to presenting the stage.\n */\nexport interface PreStage {\n    (stage: Stage, deckProps: Partial<DeckProps>): void;\n}\n\n/**\n * Lengths of time for a transition animation.\n */\nexport interface TransitionDurations {\n    color?: number;\n    position?: number;\n    size?: number;\n    view?: number;\n}\n\n/**\n * Configuration options to be used by the Presenter.\n */\nexport interface PresenterConfig {\n    transitionDurations?: TransitionDurations;\n    preStage?: PreStage;\n    getCharacterSet?: (stage: Stage) => string[];\n    redraw?: () => void;\n    onCubeHover?: (e: MouseEvent | PointerEvent | TouchEvent, cube: Cube) => void;\n    onCubeClick?: (e: MouseEvent | PointerEvent | TouchEvent, cube: Cube) => void;\n    onLayerClick?: (info: PickInfo<any>, e: MouseEvent) => any;\n    onLegendClick?: (e: MouseEvent | PointerEvent | TouchEvent, legend: Legend, clickedIndex: number) => void;\n    onPresent?: () => void;\n    shouldViewstateTransition?: () => boolean;\n    preLayer?: (stage: Stage) => void;\n    onTextClick?: (e: MouseEvent | PointerEvent | TouchEvent, t: VegaTextLayerDatum) => void;\n    onTextHover?: (e: MouseEvent | PointerEvent | TouchEvent, t: VegaTextLayerDatum) => boolean;\n    getTextColor?: (o: VegaTextLayerDatum) => RGBAColor;\n    getTextHighlightColor?: (o: VegaTextLayerDatum) => RGBAColor;\n    getTextHighlightAlphaCutoff?: () => number;\n    onSceneRectAssignCubeOrdinal?: (d: object) => number | undefined;\n    onTargetViewState?: (height: number, width: number) => { height: number, width: number, newViewStateTarget?: boolean };\n    preserveDrawingBuffer?: boolean;\n    zAxisZindex?: number;\n}\n\nexport interface PresenterStyle {\n    cssPrefix?: string;\n    defaultCubeColor?: RGBAColor;\n    highlightColor?: RGBAColor;\n    //    lightSettings?: { [view in View]: LightSettings };\n    fontFamily?: string;\n}\n\n/**\n * Options to pass to Presenter.queueAnimation()\n */\nexport interface QueuedAnimationOptions {\n\n    /**\n     * Debug label to observe which animation is waiting.\n     */\n    waitingLabel?: string;\n\n    /**\n     * Debug label to observe which handler is invoked.\n     */\n    handlerLabel?: string;\n\n    /**\n     * Function to invoke if animation was interrupted when another animation is queued.\n     */\n    animationCanceled?: () => void;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/layers.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { concat } from './array';\nimport { base } from './base';\nimport { layerNames } from './constants';\nimport { CubeLayer, CubeLayerInterpolatedProps, CubeLayerProps } from './cube-layer/cube-layer';\nimport { LinearInterpolator_Class } from './deck.gl-classes/linearInterpolator';\nimport { easing } from './easing';\nimport {\n    Cube,\n    PresenterConfig,\n    Stage,\n    StyledLine,\n    VegaTextLayerDatum,\n    Path,\n    Polygon,\n} from './interfaces';\nimport { Presenter } from './presenter';\nimport { RGBAColor } from '@deck.gl/core/utils/color';\nimport { DeckProps } from '@deck.gl/core/lib/deck';\nimport { InterpolationTransitionTiming } from '@deck.gl/core/lib/layer';\nimport { Layer } from 'deck.gl';\nimport { TextLayerProps } from '@deck.gl/layers/text-layer/text-layer';\n\nexport function getLayers(\n    presenter: Presenter,\n    config: PresenterConfig,\n    stage: Stage,\n    lightSettings: any /*LightSettings*/,\n    lightingMix: number,\n    interpolator: LinearInterpolator_Class<CubeLayerInterpolatedProps>,\n    guideLines: StyledLine[],\n): Layer<any>[] {\n    const cubeLayer = newCubeLayer(presenter, config, stage.cubeData, presenter.style.highlightColor, lightSettings, lightingMix, interpolator);\n    const { x, y, z } = stage.axes;\n    const lines = concat(stage.gridLines, guideLines);\n    const texts = [...stage.textData];\n    [x, y, z].forEach(axes => {\n        axes.forEach(axis => {\n            if (axis.domain) lines.push(axis.domain);\n            if (axis.ticks) lines.push.apply(lines, axis.ticks);\n            if (axis.tickText) texts.push.apply(texts, axis.tickText);\n            if (axis.title) texts.push(axis.title);\n        });\n    });\n    let characterSet: string[];\n    if (config.getCharacterSet) {\n        characterSet = config.getCharacterSet(stage);\n    } else {\n        //Basic symbols, numbers, and uppercase / lowercase alphabet\n        characterSet = new Array(95).fill(1).map((_, i) => String.fromCharCode(32 + i));\n    }\n    if (stage.facets) {\n        stage.facets.forEach(f => {\n            if (f.lines) lines.push.apply(lines, f.lines);\n        });\n    }\n    const lineLayer = newLineLayer(layerNames.lines, lines);\n    const textLayer = newTextLayer(presenter, layerNames.text, texts, config, presenter.style.fontFamily, characterSet);\n    const pathLayer = newPathLayer(layerNames.paths, stage.pathData);\n    const polygonLayer = newPolygonLayer(layerNames.polygons, stage.polygonData);\n    return [textLayer, cubeLayer, lineLayer, pathLayer, polygonLayer];\n}\n\nfunction newCubeLayer(presenter: Presenter, config: PresenterConfig, cubeData: Cube[], highlightColor: RGBAColor, lightSettings: any /*LightSettings*/, lightingMix: number, interpolator?: LinearInterpolator_Class<CubeLayerInterpolatedProps>) {\n    const getPosition = getTiming(config.transitionDurations.position, easing);\n    const getSize = getTiming(config.transitionDurations.size, easing);\n    const getColor = getTiming(config.transitionDurations.color);\n    const cubeLayerProps: CubeLayerProps = {\n        interpolator,\n        lightingMix,\n        id: layerNames.cubes,\n        data: cubeData,\n        coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n        pickable: true,\n        autoHighlight: true,\n        highlightColor,\n        onClick: (o, e) => {\n            config.onCubeClick(e && e.srcEvent, o.object as Cube);\n        },\n        onHover: (o, e) => {\n            if (o.index === -1) {\n                presenter.deckgl.interactiveState.onCube = false;\n                config.onCubeHover(e && e.srcEvent, null);\n            } else {\n                presenter.deckgl.interactiveState.onCube = true;\n                config.onCubeHover(e && e.srcEvent, o.object as Cube);\n            }\n        },\n        //lightSettings,\n        transitions: {\n            getPosition,\n            getColor,\n            getSize,\n        },\n    };\n    return new CubeLayer(cubeLayerProps);\n}\n\nfunction newLineLayer(id: string, data: StyledLine[]) {\n    return new base.layers.LineLayer({\n        id,\n        data,\n        widthUnits: 'pixels',\n        coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n        getColor: (o: StyledLine) => o.color,\n        getWidth: (o: StyledLine) => o.strokeWidth,\n    });\n}\n\n\nfunction newPathLayer(id: string, data: Path[]) {\n    if (!data) return null;\n\n    return new base.layers.PathLayer<Path>({\n        id,\n        data,\n        billboard: true,\n        widthScale: 1,\n        widthMinPixels: 2,\n        widthUnits: 'pixels',\n        coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n        getPath: (o) => o.positions,\n        getColor: (o) => o.strokeColor,\n        getWidth: (o) => o.strokeWidth,\n    });\n}\n\nfunction newPolygonLayer(id: string, data: Polygon[]) {\n    if (!data) return null;\n\n    const newlayer = new base.layers.PolygonLayer<Polygon>({\n        id,\n        data,\n        coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n        getPolygon: (o) => o.positions,\n        getFillColor: (o) => o.fillColor,\n        getLineColor: (o) => o.strokeColor,\n        wireframe: false,\n        filled: true,\n        stroked: true,\n        pickable: true,\n        extruded: true,\n        getElevation: (o) => o.depth,\n        getLineWidth: (o) => o.strokeWidth,\n    });\n    return newlayer;\n}\n\nfunction newTextLayer(presenter: Presenter, id: string, data: VegaTextLayerDatum[], config: PresenterConfig, fontFamily: string, characterSet: string[]) {\n    let alphaCutoff = config.getTextHighlightAlphaCutoff && config.getTextHighlightAlphaCutoff();\n    if (alphaCutoff === undefined) {\n        alphaCutoff = 0.1;\n    }\n    const props: TextLayerProps<VegaTextLayerDatum> = {\n        id,\n        data,\n        characterSet,\n        coordinateSystem: base.deck.COORDINATE_SYSTEM.CARTESIAN,\n        sizeUnits: 'pixels',\n        autoHighlight: true,\n        pickable: true,\n        highlightColor: p => {\n            if (config.getTextHighlightColor) {\n                return config.getTextHighlightColor(p.object);\n            } else {\n                return [0, 0, 0, 0];\n            }\n        },\n        onClick: (o, e) => {\n            const pe: Partial<PointerEvent> = e && e.srcEvent;\n            config.onTextClick && config.onTextClick(pe as PointerEvent, o.object as VegaTextLayerDatum);\n        },\n        onHover: (o, e) => {\n            if (o.index === -1) {\n                presenter.deckgl.interactiveState.onText = false;\n            } else {\n                presenter.deckgl.interactiveState.onText = config.onTextHover ? config.onTextHover(e && e.srcEvent, o.object as VegaTextLayerDatum) : true;\n            }\n        },\n        getColor: config.getTextColor || (o => o.color),\n        getTextAnchor: o => o.textAnchor,\n        getSize: o => o.size,\n        getAngle: o => o.angle,\n        fontSettings: {\n            sdf: false,\n            fontSize: 128,\n            buffer: 3,\n        },\n        _subLayerProps: { characters: { alphaCutoff } },\n    };\n    if (fontFamily) {\n        props.fontFamily = fontFamily;\n    }\n\n    return new base.layers.TextLayer(props);\n}\n\nfunction getTiming(duration: number, easing?: (t: number) => number) {\n    let timing: InterpolationTransitionTiming;\n    if (duration) {\n        timing = {\n            duration,\n            type: 'interpolation',\n        };\n        if (easing) {\n            timing.easing = easing;\n        }\n    }\n    return timing;\n}\n\nexport function getCubeLayer(deckProps: Partial<DeckProps>) {\n    return deckProps.layers.filter(layer => layer && layer.id === layerNames.cubes)[0];\n}\n\nexport function getCubes(deckProps: Partial<DeckProps>) {\n    const cubeLayer = getCubeLayer(deckProps);\n    if (!cubeLayer) return;\n    const cubeLayerProps = cubeLayer.props as CubeLayerProps;\n    return cubeLayerProps.data as Cube[];\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/legend.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { createElement, StatelessComponent, StatelessProps } from 'tsx-create-element';\nimport { Legend, LegendRow, LegendRowSymbol } from './interfaces';\nimport { KeyCodes, Table, TableRow } from './controls';\n\nexport interface LegendViewProps {\n    legend: Legend;\n    onClick: (e: Event, legend: Legend, clickedIndex: number) => void;\n}\n\nexport const LegendView: StatelessComponent<LegendViewProps> = (props: StatelessProps<LegendViewProps>) => {\n    const rows: TableRow[] = [];\n\n    const addRow = (row: LegendRow, i: number) => {\n        const fn = symbolMap[row.symbol.shape];\n        let jsx: JSX.Element;\n        if (fn) {\n            jsx = fn(row.symbol);\n        } else {\n            jsx = <span>x</span>;\n            //console.log(`need to render ${row.symbol.shape} symbol shape`);\n        }\n        rows.push({\n            cells: [\n                { className: 'symbol', content: jsx },\n                { className: 'label', content: row.label, title: row.label },\n            ],\n        });\n    };\n\n    const sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n    sorted.forEach(i => addRow(props.legend.rows[i], +i));\n\n    if (sorted.length) {\n        return (\n            <Table\n                rows={rows}\n                rowClassName=\"legend-row\"\n                onRowClick={(e, i) => props.onClick(e, props.legend, i)}\n            >\n                {props.legend.title !== undefined && (\n                    <tr\n                        tabIndex={props.onClick ? 0 : -1}\n                        onClick={e => props.onClick(e as any as MouseEvent, props.legend, null)}\n                        onKeyUp={e => {\n                            if (e.key === KeyCodes.ENTER && props.onClick) {\n                                props.onClick(e as any as MouseEvent, props.legend, null);\n                            }\n                        }}\n                    >\n                        <th colSpan={2}>{props.legend.title}</th>\n                    </tr>\n                )}\n            </Table>\n        );\n    }\n};\n\nconst symbolMap: { [shape: string]: (symbol: LegendRowSymbol) => JSX.Element } = {\n\n    square: function (symbol: LegendRowSymbol) {\n        return (\n            <div style={{\n                height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                backgroundColor: symbol.fill,\n                borderColor: symbol.fill,\n            }} />\n        );\n    },\n\n};\n"
  },
  {
    "path": "packages/vega-deck.gl/src/marks/area.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { GroupType, MarkStager, MarkStagerOptions } from './interfaces';\nimport { colorFromString } from '../color';\nimport { Polygon, Stage } from '../interfaces';\nimport { Datum, Scene, SceneGroup } from 'vega-typings';\nimport { Position3D } from '@deck.gl/core';\n\ntype GroupItem = SceneGroup & {\n    datum: Datum;\n    length: number;\n    depth: number;\n    opacity: number;\n    fillOpacity: number;\n    fill: string;\n    strokeOpacity: number;\n    strokeWidth: number;\n    z: number;\n    z2: number;\n    x2: number;\n    y2: number;\n}\n\n//change direction of y from SVG to GL\nconst ty = -1;\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n    const g: GroupItem = {\n        fillOpacity: 1,\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 0,\n        depth: 0,\n        ...(<GroupItem>scene.items[0]),\n    };\n\n    const points = scene.items.map((item: GroupItem) => {\n        item = {\n            z: 0,\n            ...item,\n        };\n        item = {\n            x2: item.x,\n            y2: item.y,\n            z2: item.z,\n            ...item,\n        };\n        return [\n            item.x,\n            ty * item.y,\n            item.z,\n            item.x2,\n            ty * item.y2,\n            item.z2,\n        ];\n    });\n\n    const positions: Position3D[] = [];\n\n    const startpoint: Position3D = [points[0][0], points[0][1], points[0][2]];\n    points.forEach(p => {\n        positions.push([p[0], p[1], p[2]]);\n    });\n    points.reverse().forEach(p => {\n        positions.push([p[3], p[4], p[5]]);\n    });\n    positions.push(startpoint);\n\n    const polygon: Polygon = {\n        fillColor: colorFromString(g.fill) || [0, 0, 0, 0],\n        positions,\n        strokeColor: colorFromString(g.stroke) || [0, 0, 0, 0],\n        strokeWidth: g.strokeWidth,\n        depth: g.depth,\n    };\n\n    polygon.fillColor[3] *= g.fillOpacity;\n    polygon.fillColor[3] *= g.opacity;\n\n    polygon.strokeColor[3] *= g.strokeOpacity;\n    polygon.strokeColor[3] *= g.opacity;\n\n    stage.polygonData.push(polygon);\n};\n\nexport default markStager;"
  },
  {
    "path": "packages/vega-deck.gl/src/marks/interfaces.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Axis, Stage } from '../interfaces';\nimport { RGBAColor } from '@deck.gl/core/utils/color';\nimport { Mark, Orient, Scene, SceneGroup } from 'vega-typings';\n\nexport enum GroupType {\n    none = 0,\n    legend = 1,\n    xAxis = 2,\n    yAxis = 3,\n    zAxis = 4,\n}\n\nexport interface MarkStagerOptions {\n    maxOrdinal: number;\n    currAxis: Axis;\n    defaultCubeColor: RGBAColor;\n    assignCubeOrdinal: (d: object) => number | undefined;\n    zAxisZindex: number;\n}\n\n//TODO - use vega-typings below\nexport type AxisSceneGroup = SceneGroup & {\n    datum?: any;\n    orient?: Orient;\n    mark: Mark\n};\nexport interface LabelDatum {\n    value: any;\n}\n//TODO - use vega-typings above\n\n\nexport interface MarkStager {\n    (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType): void;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/marks/legend.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport {\n    GroupType,\n    LabelDatum,\n    MarkStager,\n    MarkStagerOptions,\n} from './interfaces';\nimport { Legend, LegendRowSymbol, Stage } from '../interfaces';\nimport {\n    Scene,\n    SceneItem,\n    SceneLegendItem,\n    SceneSymbol,\n    SceneText,\n} from 'vega-typings';\n\nconst legendMap: { [role: string]: (legend: Legend, item: SceneItem) => void } = {\n\n    'legend-title': function (legend: Legend, textItem: SceneText) {\n        legend.title = textItem.text;\n    },\n\n    'legend-symbol': function (legend: Legend, symbol: SceneSymbol & SceneLegendItem) {\n        const { bounds, fill, shape } = symbol;\n        //this object is safe for serialization\n        const legendRowSymbol: LegendRowSymbol = { bounds, fill, shape };\n        const i = symbol.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        legend.rows[i].symbol = legendRowSymbol;\n    },\n\n    'legend-label': function (legend: Legend, label: SceneText & SceneLegendItem) {\n        const i = label.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        const row = legend.rows[i];\n        row.label = label.text;\n        row.value = (label.datum as unknown as LabelDatum).value;\n    },\n\n};\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n    base.vega.sceneVisit(scene, function (item: SceneItem) {\n        const fn = legendMap[item.mark.role];\n        if (fn) {\n            fn(stage.legend, item);\n        } else {\n            //console.log(`need to render legend ${item.mark.role}`);\n        }\n    });\n};\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-deck.gl/src/marks/line.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { GroupType, MarkStager, MarkStagerOptions } from './interfaces';\nimport { colorFromString } from '../color';\nimport { Path, Stage } from '../interfaces';\nimport { Datum, Scene, SceneGroup } from 'vega-typings';\n\ntype GroupItem = SceneGroup & {\n    datum: Datum;\n    length: number;\n    depth: number;\n    opacity: number;\n    z: number;\n    strokeWidth: number,\n    strokeOpacity: number;\n}\n\n//change direction of y from SVG to GL\nconst ty = -1;\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    const g: GroupItem = {\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 1,\n        ...(<GroupItem>scene.items[0]),\n    };\n\n    const path: Path = {\n        strokeWidth: g.strokeWidth,\n        strokeColor: colorFromString(g.stroke),\n        positions: scene.items.map((it: GroupItem) => [\n            it.x,\n            ty * it.y,\n            it.z || 0,\n        ]),\n    };\n\n    path.strokeColor[3] *= g.strokeOpacity;\n    path.strokeColor[3] *= g.opacity;\n\n    stage.pathData.push(path);\n};\n\nexport default markStager;"
  },
  {
    "path": "packages/vega-deck.gl/src/marks/rect.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { colorFromString } from '../color';\nimport { Cube, Stage } from '../interfaces';\nimport { Datum, Scene, SceneRect } from 'vega-typings';\nimport { GroupType, MarkStager, MarkStagerOptions } from './interfaces';\nimport { min3dDepth } from '../defaults';\n\ntype SceneCube = SceneRect & {\n    datum: Datum;\n    depth: number;\n    opacity: number;\n    z: number;\n}\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    base.vega.sceneVisit(scene, function (item: SceneCube) {\n\n        //for orthographic (2d) - always use 0 or else Deck will not show them\n        const z = stage.view === '2d' ? 0 : (item.z || 0);\n        const depth = (stage.view === '2d' ? 0 : (item.depth || 0)) + min3dDepth;\n\n        //change direction of y from SVG to GL\n        const ty = -1;\n\n        const ordinal = options.assignCubeOrdinal(item.datum);\n        if (ordinal > options.maxOrdinal) {\n            options.maxOrdinal = ordinal;\n        }\n        if (ordinal === undefined) {\n            //TODO add to polygons\n            //console.log('not a cube');\n        } else {\n            const cube: Cube = {\n                ordinal,\n                size: [item.width, item.height, depth],\n                position: [x + (item.x || 0), ty * (y + (item.y || 0)) - item.height, z],\n                color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128],\n            };\n\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n\n            stage.cubeData.push(cube);\n        }\n    });\n\n};\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-deck.gl/src/marks/rule.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { colorFromString } from '../color';\nimport { GroupType, MarkStager, MarkStagerOptions } from './interfaces';\nimport { lineZ } from '../defaults';\nimport { Scene, SceneLine } from 'vega-typings';\nimport { Stage, StyledLine } from '../interfaces';\nimport { zSwap } from '../zaxis';\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    base.vega.sceneVisit(scene, function (item: SceneLine) {\n        const x1 = item.x || 0;\n        const y1 = item.y || 0;\n        const x2 = item.x2 != null ? item.x2 : x1;\n        const y2 = item.y2 != null ? item.y2 : y1;\n\n        const lineItem = styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n\n        if (item.mark.role === 'axis-tick') {\n            if (options.currAxis.role === 'z') {\n                zSwap(lineItem.sourcePosition);\n                zSwap(lineItem.targetPosition);\n            }\n            options.currAxis.ticks.push(lineItem);\n        } else if (item.mark.role === 'axis-domain') {\n            if (options.currAxis.role === 'z') {\n                zSwap(lineItem.sourcePosition);\n                zSwap(lineItem.targetPosition);\n            }\n            options.currAxis.domain = lineItem;\n        } else {\n            stage.gridLines.push(lineItem);\n        }\n    });\n};\n\nfunction styledLine(x1: number, y1: number, x2: number, y2: number, stroke: string, strokeWidth: number) {\n    const line: StyledLine = {\n        sourcePosition: [x1, -y1, lineZ], //-1 = change direction of y from SVG to GL\n        targetPosition: [x2, -y2, lineZ],\n        color: colorFromString(stroke),\n        strokeWidth: strokeWidth,\n    };\n    return line;\n}\n\nexport function box(gx: number, gy: number, height: number, width: number, stroke: string, strokeWidth: number, diagonals = false) {\n    const lines = [\n        styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n        styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n        styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n        styledLine(gx, gy + height, gx, gy, stroke, strokeWidth),\n    ];\n    if (diagonals) {\n        lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n        lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n    }\n    return lines;\n}\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-deck.gl/src/marks/text.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { AlignmentBaseline, TextAnchor } from '@deck.gl/layers/text-layer/text-layer';\nimport { base } from '../base';\nimport { colorFromString } from '../color';\nimport {\n    GroupType,\n    LabelDatum,\n    MarkStager,\n    MarkStagerOptions,\n} from './interfaces';\nimport {\n    Scene,\n    SceneText,\n    SceneTextAlign,\n    SceneTextBaseline,\n} from 'vega-typings';\nimport { Stage, TickText, VegaTextLayerDatum } from '../interfaces';\nimport { zSwap } from '../zaxis';\n\ninterface SceneText2 extends SceneText {\n    metaData?: any;\n    ellipsis?: string;\n    limit?: number;\n}\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    //scale Deck.Gl text to Vega size\n    const fontScale = 1;\n\n    //change direction of y from SVG to GL\n    const ty = -1;\n\n    base.vega.sceneVisit(scene, function (item: SceneText2) {\n        if (!item.text) return;\n        const size = item.fontSize * fontScale;\n        const alignmentBaseline = convertBaseline(item.baseline);\n        const yOffset = alignmentBaseline === 'top' ? item.fontSize / 2 : 0;    //fixup to get tick text correct\n        const textItem: VegaTextLayerDatum = {\n            color: colorFromString(item.fill),\n            text: item.limit === undefined ? item.text : base.vega.truncate(item.text, item.limit, 'right', item.ellipsis || '...'),   //use dots instead of unicode ellipsis for deck.gl's default font atlas\n            position: [x + (item.x || 0), ty * (y + (item.y || 0) + yOffset), 0],\n            size,\n            angle: convertAngle(item.angle),\n            textAnchor: convertAlignment(item.align),\n            alignmentBaseline,\n            metaData: item.metaData,\n        };\n        if (item.mark.role === 'axis-label') {\n            const tickText = textItem as TickText;\n            tickText.value = (item.datum as LabelDatum).value;\n            if (options.currAxis.role === 'z') {\n                zSwap(tickText.position);\n            }\n            options.currAxis.tickText.push(tickText);\n        } else if (item.mark.role === 'axis-title') {\n            if (options.currAxis.role === 'z') {\n                zSwap(textItem.position);\n            }\n            options.currAxis.title = textItem;\n        } else {\n            stage.textData.push(textItem);\n        }\n    });\n};\n\nfunction convertAngle(vegaTextAngle: number) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n        return 360 - vegaTextAngle;\n    }\n    return 0;\n}\n\nfunction convertAlignment(textAlign: SceneTextAlign): TextAnchor {\n    switch (textAlign) {\n        case 'center': return 'middle';\n        case 'left': return 'start';\n        case 'right': return 'end';\n    }\n    return 'start';\n}\n\nfunction convertBaseline(baseline: SceneTextBaseline): AlignmentBaseline {\n    switch (baseline) {\n        case 'middle': return 'center';\n    }\n    return baseline || 'bottom';\n}\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-deck.gl/src/panel.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { createElement, mount } from 'tsx-create-element';\nimport { minHeight, minWidth } from './defaults';\nimport { PresenterElement } from './enums';\nimport { PresenterStyle } from './interfaces';\n\nexport interface IPresenter {\n    el: HTMLElement;\n    style: PresenterStyle;\n}\n\nexport function initializePanel(presenter: IPresenter) {\n    const rootDiv = (\n        <div className={className(PresenterElement.root, presenter)}>\n            <div className={className(PresenterElement.gl, presenter)} style={{ minHeight, minWidth }}></div>\n            <div className={className(PresenterElement.panel, presenter)}>\n                <div className={className(PresenterElement.vegaControls, presenter)}></div>\n                <div className={className(PresenterElement.legend, presenter)}></div>\n            </div>\n        </div>\n    );\n    mount(rootDiv, presenter.el);\n}\n\nexport function className(type: PresenterElement, presenter: IPresenter) {\n    return `${presenter.style.cssPrefix}${PresenterElement[type]}`;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/patchedCubeArray.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Cube } from './interfaces';\n\nexport function patchCubeArray(allocatedSize: number, empty: Partial<Cube>, cubes: Cube[]) {\n    const patched: Cube[] = new Array<Cube>(allocatedSize);\n    patched.fill(empty as Cube);\n\n    cubes.forEach(cube => patched[cube.ordinal] = cube);\n\n    return patched;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/presenter.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from './base';\nimport { deepMerge } from './clone';\nimport { colorToString } from './color';\nimport { CubeLayer_Class, CubeLayerInterpolatedProps } from './cube-layer/cube-layer';\nimport {\n    createDeckGLClassesForPresenter,\n    DeckGL_Class,\n    DeckGLInternalProps,\n    InteractiveStateVegaDeckGL,\n} from './deck.gl-classes/deckgl';\nimport { LinearInterpolator, LinearInterpolator_Class } from './deck.gl-classes/linearInterpolator';\nimport { OrbitController_Class } from './deck.gl-classes/orbitController';\nimport { createStage, defaultPresenterConfig, defaultPresenterStyle } from './defaults';\nimport { easing } from './easing';\nimport { lightingEffects } from './effects';\nimport { PresenterElement } from './enums';\nimport {\n    Cube,\n    PresenterConfig,\n    PresenterStyle,\n    QueuedAnimationOptions,\n    Scene3d,\n    Stage,\n} from './interfaces';\nimport { getCubeLayer, getCubes, getLayers } from './layers';\nimport { LegendView } from './legend';\nimport { MarkStagerOptions } from './marks/interfaces';\nimport { box } from './marks/rule';\nimport { className, initializePanel } from './panel';\nimport { patchCubeArray } from './patchedCubeArray';\nimport { sceneToStage } from './stagers';\nimport { targetViewState, viewStateProps } from './viewState';\nimport { DeckProps } from '@deck.gl/core/lib/deck';\nimport { View } from '@msrvida/chart-types';\nimport { getActiveElementInfo, mount, setActiveElement } from 'tsx-create-element';\n\ninterface IBounds {\n    view: View;\n    height: number;\n    width: number;\n    cubeCount: number;\n}\n\n/**\n * Class which presents a Stage of chart data using Deck.gl to render.\n */\nexport class Presenter {\n    private OrbitControllerClass: typeof OrbitController_Class;\n\n    /**\n     * Handle of the timer for animation.\n     */\n    public animationTimer: number;\n\n    /**\n     * Deck.gl instance for rendering WebGL.\n     */\n    public deckgl: DeckGL_Class;\n\n    /**\n     * Logger, such as console.log\n     */\n    public logger: (message?: any, ...optionalParams: any[]) => void;\n\n    /**\n     * Get the previously rendered Stage object.\n     */\n    get stage(): Stage {\n        return this._last.stage;\n    }\n\n    /**\n     * Options for styling the output.\n     */\n    public style: PresenterStyle;\n\n    /**\n     * Get the current View camera type.\n     */\n    get view(): View {\n        return this._last.view;\n    }\n\n    private queuedAnimationOptions: QueuedAnimationOptions;\n    private _last: IBounds & { stage: Stage };\n    private _showGuides: boolean;\n    private _afterRenderHandler: () => void;\n\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */\n    constructor(public el: HTMLElement, style?: PresenterStyle) {\n        this.style = deepMerge<PresenterStyle>(defaultPresenterStyle, style);\n        initializePanel(this);\n        this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n    }\n\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */\n    animationCancel() {\n        if (this.animationTimer) {\n            clearTimeout(this.animationTimer);\n            this.animationTimer = null;\n            if (this.logger) {\n                this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n            }\n            if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                this.queuedAnimationOptions.animationCanceled.call(null);\n            }\n        }\n    }\n\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */\n    animationQueue(handler: () => void, timeout: number, options?: QueuedAnimationOptions) {\n        if (this.logger) {\n            this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...`);\n        }\n        this.animationCancel();\n        this.animationTimer = setTimeout(() => {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n            }\n            handler();\n        }, timeout) as any as number;\n    }\n\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */\n    getElement(type: PresenterElement): HTMLElement {\n        const elements = this.el.getElementsByClassName(className(type, this));\n        if (elements && elements.length) {\n            return elements[0] as HTMLElement;\n        }\n    }\n\n    /**\n     * Present the Vega Scene, or Stage object using Deck.gl.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area. \n     * @param config Optional presentation configuration object.\n     */\n    present(sceneOrStage: Scene3d | Stage, height: number, width: number, config?: PresenterConfig) {\n        this.animationCancel();\n        const scene = sceneOrStage as Scene3d;\n        let stage: Stage;\n        const options: MarkStagerOptions = {\n            maxOrdinal: 0,\n            currAxis: null,\n            defaultCubeColor: this.style.defaultCubeColor,\n            assignCubeOrdinal: config?.onSceneRectAssignCubeOrdinal || (() => options.maxOrdinal++),\n            zAxisZindex: config?.zAxisZindex,\n        };\n        //determine if this is a vega scene\n        if (scene.marktype) {\n            stage = createStage(scene.view);\n            sceneToStage(options, stage, scene);\n        } else {\n            stage = sceneOrStage as Stage;\n        }\n        if (!this.deckgl) {\n            const classes = createDeckGLClassesForPresenter({\n                doubleClickHandler: () => {\n                    this.homeCamera();\n                    return true;\n                },\n            });\n            this.OrbitControllerClass = classes.OrbitControllerClass;\n\n            const initialViewState = targetViewState(height, width, stage.view);\n\n            let glOptions: WebGLContextAttributes;\n            if (config && config.preserveDrawingBuffer) {\n                glOptions = { preserveDrawingBuffer: true };\n            }\n\n            const deckProps: Partial<DeckGLInternalProps> = {\n                glOptions,\n                height: null,\n                width: null,\n                effects: lightingEffects(),\n                layers: [],\n                onClick: config && config.onLayerClick,\n                views: [new base.deck.OrbitView({ controller: base.deck.OrbitController })],\n                initialViewState,\n                container: this.getElement(PresenterElement.gl) as HTMLCanvasElement,\n                getCursor: (interactiveState: InteractiveStateVegaDeckGL) => {\n                    if (interactiveState.onText || interactiveState.onAxisSelection) {\n                        return 'pointer';\n                    } else if (interactiveState.onCube) {\n                        return 'default';\n                    } else {\n                        return 'grab';\n                    }\n                },\n            };\n            if (stage.backgroundColor) {\n                deckProps.style = { 'background-color': colorToString(stage.backgroundColor) };\n            }\n            this.deckgl = new classes.DeckGL_Class(deckProps);\n        }\n        let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n        if (options.maxOrdinal) {\n            cubeCount = Math.max(cubeCount, options.maxOrdinal);\n            const empty: Partial<Cube> = {\n                isEmpty: true,\n                color: [0, 0, 0, 0], // possibly a bug in Deck.gl? set color to invisible.\n            };\n            stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData as Cube[]);\n        }\n        this.setDeckProps(stage, height, width, cubeCount, config);\n\n        const a = getActiveElementInfo();\n        mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement.legend));\n        setActiveElement(a);\n\n        if (config && config.onPresent) {\n            config.onPresent();\n        }\n    }\n\n    /**\n     * Present the same recently rendered Stage with only slight modifications such as a color change,\n     * using the previous Stage values as a basis.\n     * @param stage Partially populated Stage object containing changes.\n     * @param modifyConfig Optional presentation configuration object.\n     */\n    rePresent(stage: Partial<Stage>, modifyConfig?: PresenterConfig) {\n        const newStage = { ...this._last.stage, ...stage };\n        this.setDeckProps(newStage, this._last.height, this._last.width, this._last.cubeCount, modifyConfig);\n    }\n\n    private isNewBounds(view: View, height: number, width: number, cubeCount: number) {\n        const lastBounds: IBounds = this.lastBounds();\n        for (const prop in lastBounds) {\n            if (lastBounds[prop] === null) return true;\n        }\n        const newBounds: IBounds = { cubeCount, height, view, width };\n        for (const prop in lastBounds) {\n            if (lastBounds[prop] !== newBounds[prop]) return true;\n        }\n    }\n\n    private lastBounds(): IBounds {\n        const { cubeCount, height, view, width } = this._last;\n        return { cubeCount, height, view, width };\n    }\n\n    private setDeckProps(stage: Stage, height: number, width: number, cubeCount: number, modifyConfig: PresenterConfig) {\n        const config = deepMerge<PresenterConfig>(defaultPresenterConfig, modifyConfig);\n        const newBounds = this.isNewBounds(stage.view, height, width, cubeCount);\n        //let lightSettings = this.style.lightSettings[stage.view];\n        const lightingMix = stage.view === '3d' ? 1.0 : 0.0;\n        let linearInterpolator: LinearInterpolator_Class<CubeLayerInterpolatedProps>;\n        //choose the current OrbitView viewstate if possible\n        let viewState = (this.deckgl.viewState && Object.keys(this.deckgl.viewState).length && this.deckgl.viewState.OrbitView)\n            //otherwise use the initial viewstate if any\n            || this.deckgl.props.viewState;\n\n        if (!viewState || newBounds || config.shouldViewstateTransition && config.shouldViewstateTransition()) {\n            let newViewStateTarget = true;\n            if (config && config.onTargetViewState) {\n                const result = config.onTargetViewState(height, width);\n                height = result.height;\n                width = result.width;\n                if (result.newViewStateTarget !== undefined) {\n                    newViewStateTarget = result.newViewStateTarget;\n                }\n            }\n            if (!viewState || newViewStateTarget) {\n                viewState = targetViewState(height, width, stage.view);\n            }\n            const oldCubeLayer = getCubeLayer(this.deckgl.props) as CubeLayer_Class;\n            if (oldCubeLayer) {\n                linearInterpolator = new LinearInterpolator(viewStateProps);\n                linearInterpolator.layerStartProps = { lightingMix: oldCubeLayer.props.lightingMix };\n                linearInterpolator.layerEndProps = { lightingMix };\n                viewState.transitionDuration = config.transitionDurations.view;\n                viewState.transitionEasing = easing;\n                viewState.transitionInterpolator = linearInterpolator;\n            }\n            if (stage.view === '2d') {\n                //lightSettings = this.style.lightSettings['3d'];\n            }\n        }\n        const guideLines = this._showGuides && box(0, 0, height, width, '#0f0', 1, true);\n        config.preLayer && config.preLayer(stage);\n        const layers = getLayers(this, config, stage, /*lightSettings*/null, lightingMix, linearInterpolator, guideLines);\n        const deckProps: Partial<DeckProps> = {\n            effects: lightingEffects(),\n            views: [new base.deck.OrbitView({ controller: base.deck.OrbitController })],\n            initialViewState: viewState,\n            layers,\n        };\n        if (config && config.preStage) {\n            config.preStage(stage, deckProps);\n        }\n        requestAnimationFrame(() => this.deckgl.setProps({\n            ...deckProps,\n            onAfterRender: () => {\n                if (this._afterRenderHandler) {\n                    this._afterRenderHandler();\n                }\n            },\n        }));\n        delete stage.cubeData;\n        this._last = {\n            cubeCount,\n            height,\n            width,\n            stage: stage,\n            view: stage.view,\n        };\n    }\n\n    public canvasToDataURL() {\n        return new Promise<string>((resolve, reject) => {\n            this._afterRenderHandler = () => {\n                this._afterRenderHandler = null;\n                const png = this.deckgl.canvas.toDataURL('image/png');\n                resolve(png);\n            };\n        });\n    }\n\n    /**\n     * Home the camera to the last initial position.\n     */\n    homeCamera() {\n        const viewState = targetViewState(this._last.height, this._last.width, this._last.view) as any;\n        viewState.transitionDuration = defaultPresenterConfig.transitionDurations.view;\n        viewState.transitionEasing = easing;\n        viewState.transitionInterpolator = new LinearInterpolator(viewStateProps);\n        const deckProps: Partial<DeckProps> = {\n            effects: lightingEffects(),\n            views: this.deckgl.props.views,\n            initialViewState: viewState,\n            layers: this.deckgl.props.layers,\n        };\n        this.deckgl.setProps(deckProps);\n    }\n\n    /**\n     * Get cube data array from the cubes layer. \n     */\n    getCubeData() {\n        return getCubes(this.deckgl.props);\n    }\n\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */\n    showGuides() {\n        this._showGuides = true;\n        this.getElement(PresenterElement.gl).classList.add('show-center');\n        this.rePresent({ ...this._last.stage, cubeData: this.getCubeData() });\n    }\n\n    finalize() {\n        this.animationCancel();\n        if (this.deckgl) this.deckgl.finalize();\n        if (this.el) this.el.innerHTML = '';\n        this._last = null;\n        this.deckgl = null;\n        this.el = null;\n        this.logger = null;\n        this.queuedAnimationOptions = null;\n    }\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/stagers.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport legend from './marks/legend';\nimport rect from './marks/rect';\nimport rule, { box } from './marks/rule';\nimport line from './marks/line';\nimport text from './marks/text';\nimport area from './marks/area';\n\nimport {\n    Axis,\n    AxisRole,\n    FacetRect,\n    Stage,\n    StyledLine,\n} from './interfaces';\nimport { base } from './base';\nimport { colorFromString } from './color';\nimport { groupStrokeWidth } from './defaults';\nimport {\n    GroupType,\n    MarkStager,\n    MarkStagerOptions,\n    AxisSceneGroup,\n} from './marks/interfaces';\nimport { Orient, Scene, SceneGroup } from 'vega-typings';\n\ninterface VegaAxisDatum {\n    domain: boolean;\n    grid: boolean;\n    labels: boolean;\n    orient: Orient;\n    ticks: boolean;\n    title: boolean;\n}\n\nfunction getOrientItem(group: AxisSceneGroup): { orient?: Orient; } {\n    if (group.orient) {\n        return group;\n    }\n    return group.datum as VegaAxisDatum;\n}\n\nfunction convertGroupRole(group: SceneGroup, options: MarkStagerOptions): GroupType {\n    if (group.mark.role === 'legend') return GroupType.legend;\n    if (group.mark.role === 'axis') {\n        if (((group as AxisSceneGroup).mark).zindex === options.zAxisZindex && options.zAxisZindex !== undefined) {\n            return GroupType.zAxis;\n        }\n        const orientItem = getOrientItem(group as AxisSceneGroup);\n        if (orientItem) {\n            switch (orientItem.orient) {\n                case 'bottom':\n                case 'top':\n                    return GroupType.xAxis;\n                case 'left':\n                case 'right':\n                    return GroupType.yAxis;\n            }\n        }\n    }\n}\n\nconst group: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    base.vega.sceneVisit(scene, function (g: SceneGroup) {\n\n        const gx = g.x || 0, gy = g.y || 0;\n        if (g.context && g.context.background && !stage.backgroundColor) {\n            stage.backgroundColor = colorFromString(g.context.background);\n        }\n        if (g.stroke) {\n            const facetRect: FacetRect = {\n                datum: g.datum,\n                lines: box(gx + x, gy + y, g.height, g.width, g.stroke, groupStrokeWidth),\n            };\n            stage.facets.push(facetRect);\n        }\n\n        groupType = convertGroupRole(g, options) || groupType;\n        setCurrentAxis(options, stage, groupType);\n\n        // draw group contents\n        base.vega.sceneVisit(g, function (item: Scene) {\n            mainStager(options, stage, item, gx + x, gy + y, groupType);\n        });\n\n    });\n};\n\nfunction setCurrentAxis(options: MarkStagerOptions, stage: Stage, groupType: GroupType) {\n    let axes: Axis[];\n    let role: AxisRole;\n    switch (groupType) {\n        case GroupType.xAxis:\n            axes = stage.axes.x;\n            role = 'x';\n            break;\n        case GroupType.yAxis:\n            axes = stage.axes.y;\n            role = 'y';\n            break;\n        case GroupType.zAxis:\n            axes = stage.axes.z;\n            role = 'z';\n            break;\n        default:\n            return;\n    }\n    options.currAxis = {\n        domain: null,\n        tickText: [],\n        ticks: [],\n        role,\n    };\n    axes.push(options.currAxis);\n}\n\nconst markStagers: { [id: string]: MarkStager } = {\n    group,\n    legend,\n    rect,\n    rule,\n    line,\n    area,\n    text,\n};\n\nconst mainStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n    if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n        legend(options, stage, scene, x, y, groupType);\n    } else {\n        const markStager = markStagers[scene.marktype];\n        if (markStager) {\n            markStager(options, stage, scene, x, y, groupType);\n        } else {\n            //console.log(`need to render ${scene.marktype}`);\n        }\n    }\n};\n\nexport function sceneToStage(options: MarkStagerOptions, stage: Stage, scene: Scene) {\n    mainStager(options, stage, scene, 0, 0, null);\n    sortAxis(stage.axes.x, 0);\n    sortAxis(stage.axes.y, 1);\n}\n\nfunction sortAxis(axes: Axis[], dim: number) {\n    axes.forEach(axis => {\n        if (axis.domain) orderDomain(axis.domain, dim);\n        axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n        axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n    });\n}\n\nfunction orderDomain(domain: StyledLine, dim: number) {\n    if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n        const temp = domain.targetPosition;\n        domain.targetPosition = domain.sourcePosition;\n        domain.sourcePosition = temp;\n    }\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/vega-classes/rendererGl.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Presenter } from '../presenter';\nimport { PresenterConfig, Scene3d } from '../interfaces';\nimport { Renderer, Scene, SceneItem } from 'vega-typings';\nimport { View } from '@msrvida/chart-types';\n\n//pass in the SuperClass, which should be a vega.View\nfunction _RendererGl(loader?: any) {\n\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class RendererGlInternal extends base.vega.Renderer {\n        public height: number;\n        public width: number;\n        public origin: number[];\n        public presenter: Presenter;\n        public presenterConfig: PresenterConfig;\n        public getView: { (): View };\n\n        initialize(el, width, height, origin) {\n            this.height = height;\n            this.width = width;\n\n            // this method will invoke resize to size the canvas appropriately\n            return super.initialize(el, width, height, origin);\n        }\n\n        resize(width, height, origin) {\n\n            super.resize(width, height, origin);\n\n            this.origin = origin;\n            this.height = height;\n            this.width = width;\n\n            //rteturn this for vega\n            return this;\n        }\n\n        _render(scene: Scene, items: SceneItem[]) {\n            const scene3d = scene as Scene3d;\n            scene3d.view = this.getView();\n\n            this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n\n            //return this for vega\n            return this;\n        }\n\n    }\n\n    const instance = new RendererGlInternal(loader) as Renderer;\n\n    return instance;\n}\n\n//signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n * This is instantiated by ViewGl.\n */\nexport const RendererGl: typeof RendererGl_Class = _RendererGl as any;\n\n/**\n * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n * This is not instantiatable, it is the TypeScript declaration of the type.\n */\nexport declare class RendererGl_Class extends base.vega.Renderer {\n    public height: number;\n    public width: number;\n    public origin: number[];\n    public presenter: Presenter;\n    public presenterConfig: PresenterConfig;\n    public getView: { (): View };\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/vega-classes/viewGl.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { defaultView } from '../defaults';\nimport { Presenter } from '../presenter';\nimport { PresenterConfig } from '../interfaces';\nimport { PresenterElement } from '../enums';\nimport { RendererGl, RendererGl_Class } from './rendererGl';\nimport { Renderers, Runtime, View as VegaView, Color, Loader, LoggerInterface, TooltipHandler, LocaleFormatters } from 'vega-typings';\nimport { View } from '@msrvida/chart-types';\n\nlet registered = false;\n\n/**\n * ViewOptions from vNext vega-typings https://github.com/vega/vega/pull/2963\n */\n\nexport interface ViewOptions {\n    background?: Color;\n    bind?: Element | string;\n    container?: Element | string;\n    hover?: boolean;\n    loader?: Loader;\n    logger?: LoggerInterface;\n    logLevel?: number;\n    renderer?: Renderers;\n    tooltip?: TooltipHandler;\n    locale?: LocaleFormatters;\n    expr?: any;\n}\n\n/**\n * Options for the View.\n */\nexport interface ViewGlConfig extends ViewOptions {\n    presenter?: Presenter;\n    presenterConfig?: PresenterConfig;\n    getView?: { (): View };\n}\n\n//dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n\n//pass in the SuperClass, which should be a vega.View\nfunction _ViewGl(runtime: Runtime, config?: ViewGlConfig) {\n\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class ViewGlInternal extends base.vega.View {\n        public presenter: Presenter;\n\n        constructor(runtime: Runtime, private config: ViewGlConfig = {}) {\n            super(runtime, config);\n            this.presenter = config.presenter;\n\n            config.presenterConfig = config.presenterConfig || {};\n            config.presenterConfig.redraw = () => {\n                (this as any)._redraw = true;   //use Vega View private member _redraw\n                this.run();\n            };\n        }\n\n        renderer(): Renderers;\n        renderer(renderer: Renderers | 'deck.gl'): this;\n        renderer(...args: any[]) {\n            if (args && args.length) {\n                const renderer:Renderers | 'deck.gl' = args[0];\n                if (renderer === 'deck.gl' && !registered) {\n                    base.vega.renderModule('deck.gl', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                    registered = true;\n                }\n                return super.renderer(renderer as unknown as Renderers);\n            } else {\n                return super.renderer() as Renderers;\n            }\n        }\n\n        initialize(el: HTMLElement) {\n            if (!this.presenter) {\n                this.presenter = new Presenter(el);\n            }\n\n            super.initialize(this.presenter.getElement(PresenterElement.vegaControls));\n\n            const renderer = (this as any as ViewGl_Class)._renderer;\n\n            renderer.presenterConfig = this.config.presenterConfig;\n            renderer.presenter = this.presenter;\n            renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView);\n\n            return this;\n        }\n\n        error(e: Error) {\n            if (this.presenter!.logger) {\n                this.presenter.logger(e);\n            }\n        }\n    }\n\n    const instance = new ViewGlInternal(runtime, config) as VegaView;\n\n    return instance;\n}\n\n//signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.View, with added properties for accessing a Presenter.\n * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n */\nexport const ViewGl: typeof ViewGl_Class = _ViewGl as any;\n\n/**\n * Subclass of Vega.View, with added properties for accessing a Presenter.\n * This is not instantiatable, it is the TypeScript declaration of the type.\n */\nexport declare class ViewGl_Class extends base.vega.View {\n    public presenter: Presenter;\n    constructor(runtime: Runtime, config?: ViewGlConfig);\n    renderer(renderer: Renderers | 'deck.gl'): this;\n    renderer(): Renderers;\n    _renderer: RendererGl_Class;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/viewState.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Position } from '@deck.gl/core/utils/positions';\nimport { OrbitViewState } from '@deck.gl/core/views/orbit-view';\nimport { View } from '@msrvida/chart-types';\n\nexport const viewStateProps = ['target', 'rotationOrbit', 'rotationX', 'zoom'];\n\nexport function targetViewState(height: number, width: number, view: View): OrbitViewState {\n    const target = [width / 2, - height / 2, 0] as Position;\n\n    if (view === '2d') {\n        return {\n            target,\n            rotationOrbit: 0,\n            rotationX: 90,\n            zoom: -0.2,\n        };\n    } else {\n        return {\n            target,\n            rotationOrbit: 25,\n            rotationX: 30,\n            zoom: -0.4,\n        };\n    }\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/src/zaxis.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Position } from '@deck.gl/core';\nimport { lineZ } from './defaults';\nimport { Vec3 } from './interfaces';\n\nexport function zSwap(v3: Vec3 | Position) {\n    const temp = -v3[1]; //negeative y to positive z\n    if(v3[0]===lineZ) {\n        v3[0] = 0;\n    }\n    v3[1] = v3[2];\n    v3[2] = temp;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/test/cubelayer/cubeTest.css",
    "content": ".vega-deckgl-gl {\n    border: 1px solid #ccc;\n    height: 700px;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/test/cubelayer/cubeTest.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-deck.gl cubeTest</title>\n    <link rel=\"stylesheet\" href=\"cubeTest.css\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n</head>\n\n<body>\n    <header>\n        <h1>vega-deck.gl cubeTest</h1>\n    </header>\n\n    <button id=\"animate\">animate</button>\n    \n    <div id=\"vis\"></div>\n\n    <script type=\"module\" src=\"cubeTest.ts\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "packages/vega-deck.gl/test/cubelayer/cubeTest.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as deck from '@deck.gl/core';\nimport * as layers from '@deck.gl/layers';\nimport * as luma from '@luma.gl/core';\n\nimport * as VegaDeckGl from '../../dist/es6';\n\nVegaDeckGl.use(null, deck, layers, luma);\n\nconst colors: { [name: string]: deck.RGBAColor } = {\n    red: [255, 0, 0],\n    green: [0, 255, 0],\n    blue: [0, 0, 255],\n    gray: [128, 128, 128]\n};\n\nvar presenter = new VegaDeckGl.Presenter(document.querySelector('#vis'));\nvar stage: VegaDeckGl.types.Stage = {\n    cubeData: [\n        {\n            color: colors.red,\n            position: [0, 0, 0],\n            size: [100, 100, 100]\n        },\n        {\n            color: colors.green,\n            position: [100, 0, 100],\n            size: [100, 100, 100]\n        },\n        {\n            color: colors.blue,\n            position: [0, 100, 100],\n            size: [100, 100, 100]\n        }\n    ],\n    legend: { rows: {} },\n    axes: {\n        x: [{\n            domain: {\n                color: [0, 0, 0, 255],\n                sourcePosition: [0, 0, 0],\n                targetPosition: [400, 0, 0],\n                strokeWidth: 10\n            },\n            ticks: [],\n            tickText: []\n        }],\n        y: [{\n            domain: {\n                color: [0, 0, 0, 255],\n                sourcePosition: [0, 0, 0],\n                targetPosition: [0, 200, 0],\n                strokeWidth: 10\n            },\n            ticks: [],\n            tickText: []\n        }],\n        z: [{\n            domain: {\n                color: [0, 0, 0, 255],\n                sourcePosition: [0, 0, 0],\n                targetPosition: [0, 0, 200],\n                strokeWidth: 10\n            },\n            ticks: [],\n            tickText: []\n        }]\n    },\n    textData: [],\n    view: '3d'\n};\n\npresenter.present(stage, 200, 400);\n\nvar orbitViewState: deck.OrbitViewState = {\n    target: [90, 15, 23],\n    rotationOrbit: -45,\n    rotationX: 67,\n    zoom: 0.01\n};\n\npresenter.deckgl.setProps({ initialViewState: orbitViewState });\n\ndocument.getElementById('animate').addEventListener('click', e => {\n\n    stage.cubeData = [\n        {\n            color: colors.blue,\n            position: [0, 300, 100],\n            size: [100, 100, 100]\n        },\n        {\n            color: colors.gray,\n            position: [100, 100, 300],\n            size: [10, 10, 10]\n        },\n        {\n            color: colors.red,\n            position: [300, 0, 0],\n            size: [100, 100, 100]\n        },\n        {\n            color: colors.green,\n            position: [100, 300, 100],\n            size: [100, 100, 100]\n        },\n    ];\n\n    presenter.present(stage, 200, 400);\n\n});\n\nwindow['cubeTest'] = { presenter };\n"
  },
  {
    "path": "packages/vega-deck.gl/test/vegaspec/vega-deck.gl.test.css",
    "content": "\nhtml,\nbody {\n    font-family: sans-serif;\n    height: 100%;\n}\n\nbody.rows {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-areas: \"header\" \"view\" \"footer\";\n    margin: 0;\n    overflow: scroll;\n}\n\nbody.columns {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-columns: 40% 60%;\n    grid-template-areas: \"header header\" \"left right\" \"footer footer\";\n    margin: 0;\n}\n\nheader {\n    border-bottom: 1px solid silver;\n    grid-area: header;\n    padding: 0 2em;\n}\n\nfooter {\n    border-top: 1px solid silver;\n    grid-area: footer;\n    padding: 0 2em;\n}\n\n#view-type-button {\n    position: absolute;\n    right: 2em;\n    top: 2em;\n}\n\n#view-div, #view-div .vega-deckgl-gl {\n    height: 100%;\n}\n\n#split-left {\n    grid-area: left;\n    overflow: hidden;\n}\n#vis {\n   grid-area: right;\n   position: relative;\n}\n\n.textform {\n    background-color: #ccc;\n    display: grid;\n    grid-template-rows: auto 2em;\n    height: 100%;\n}\n\n#split-left textarea {\n    border: 0;\n    height: 100%;\n    padding: 0 0 0 5px;\n    resize: none;\n}\n\n#split-right,\n#error {\n    grid-area: right;\n}\n\n#error {\n    font-size: larger;\n    padding: 1em;\n}\n\n#split-right .vega-bindings {\n    padding: 1em;\n}\n\n.vega-deckgl-root {\n    display: grid;\n    grid-template-rows: auto 200px;\n    height: 100%;\n}\n\n.vega-deckgl-legend {\n    font-family: sans-serif;\n    position: absolute;\n    right: 1em;\n    top: 1em;\n    z-index: 1;\n}\n"
  },
  {
    "path": "packages/vega-deck.gl/test/vegaspec/vega-deck.gl.test.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-deck.gl test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"vega-deck.gl.test.css\" />\n</head>\n\n<body class=\"columns\">\n\n    <header>\n        <h1>vega-deck.gl spec editor</h1>\n        <button id=\"view-type-button\" onclick=\"vegaTest.specRenderer.toggleView()\">2D / 3D</button>\n       \n    </header>\n\n    <div id=\"split-left\">\n        <div class=\"textform\">\n            <textarea>\n{\n    \"$schema\": \"https://vega.github.io/schema/vega/v4.json\",\n    \"background\": \"#DEDEDE\",\n    \"width\": 500,\n    \"height\": 200,\n    \"padding\": 5,\n\n    \"data\": [\n        {\n            \"name\": \"table\",\n            \"values\": [\n                { \"x\": 0, \"y\": 28, \"c\": 0 }, { \"x\": 0, \"y\": 55, \"c\": 1 },\n                { \"x\": 1, \"y\": 43, \"c\": 0 }, { \"x\": 1, \"y\": 91, \"c\": 1 },\n                { \"x\": 2, \"y\": 81, \"c\": 0 }, { \"x\": 2, \"y\": 53, \"c\": 1 },\n                { \"x\": 3, \"y\": 19, \"c\": 0 }, { \"x\": 3, \"y\": 87, \"c\": 1 },\n                { \"x\": 4, \"y\": 52, \"c\": 0 }, { \"x\": 4, \"y\": 48, \"c\": 1 },\n                { \"x\": 5, \"y\": 24, \"c\": 0 }, { \"x\": 5, \"y\": 49, \"c\": 1 },\n                { \"x\": 6, \"y\": 87, \"c\": 0 }, { \"x\": 6, \"y\": 66, \"c\": 1 },\n                { \"x\": 7, \"y\": 17, \"c\": 0 }, { \"x\": 7, \"y\": 27, \"c\": 1 },\n                { \"x\": 8, \"y\": 68, \"c\": 0 }, { \"x\": 8, \"y\": 16, \"c\": 1 },\n                { \"x\": 9, \"y\": 49, \"c\": 0 }, { \"x\": 9, \"y\": 15, \"c\": 1 }\n            ],\n            \"transform\": [\n                {\n                    \"type\": \"stack\",\n                    \"groupby\": [\"x\"],\n                    \"sort\": { \"field\": \"c\" },\n                    \"field\": \"y\"\n                }\n            ]\n        }\n    ],\n\n    \"scales\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"band\",\n            \"range\": \"width\",\n            \"domain\": { \"data\": \"table\", \"field\": \"x\" }\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"linear\",\n            \"range\": \"height\",\n            \"nice\": true, \"zero\": true,\n            \"domain\": { \"data\": \"table\", \"field\": \"y1\" }\n        },\n        {\n            \"name\": \"color\",\n            \"type\": \"ordinal\",\n            \"range\": \"category\",\n            \"domain\": { \"data\": \"table\", \"field\": \"c\" }\n        }\n    ],\n\n    \"axes\": [\n        { \"orient\": \"bottom\", \"scale\": \"x\", \"title\": \"X Axis\", \"tickColor\": \"red\", \"tickWidth\": 3, \"labelColor\": \"blue\", \"titleColor\": \"green\" },\n        { \"orient\": \"left\", \"scale\": \"y\", \"title\": \"Y Axis\", \"domainColor\": \"magenta\", \"domainWidth\": 2, \"tickWidth\": 7 }\n    ],\n\n    \"marks\": [\n        {\n            \"type\": \"rect\",\n            \"from\": { \"data\": \"table\" },\n            \"encode\": {\n                \"enter\": {\n                    \"x\": { \"scale\": \"x\", \"field\": \"x\" },\n                    \"width\": { \"scale\": \"x\", \"band\": 1, \"offset\": -1 },\n                    \"y\": { \"scale\": \"y\", \"field\": \"y0\" },\n                    \"y2\": { \"scale\": \"y\", \"field\": \"y1\" },\n                    \"fill\": { \"scale\": \"color\", \"field\": \"c\" }\n                },\n                \"update\": {\n                    \"fillOpacity\": { \"value\": 1 }\n                },\n                \"hover\": {\n                    \"fillOpacity\": { \"value\": 0.5 }\n                }\n            }\n        }\n    ],\n    \"legends\": [\n        {\n            \"fill\": \"color\",\n            \"title\": \"Legend\",\n            \"encode\": {\n                \"symbols\": {\n                    \"update\": {\n                        \"shape\": { \"value\": \"square\" }\n                    }\n                }\n            }\n        }\n    ]\n}\n            </textarea>\n            <button onclick=\"vegaTest.specRenderer.getText()\">Apply this spec</button>\n        </div>\n    </div>\n    <div id=\"vis\"></div>    \n    <div id=\"error\"></div>\n\n    <script type=\"module\" src=\"vega-deck.gl.test.ts\"></script>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "packages/vega-deck.gl/test/vegaspec/vega-deck.gl.test.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as deck from '@deck.gl/core';\nimport * as layers from '@deck.gl/layers';\nimport * as luma from '@luma.gl/core';\nimport * as vega from 'vega';\nimport * as VegaDeckGl from '../../dist/es6';\n\nVegaDeckGl.use(vega, deck, layers, luma);\n\nclass SpecRenderer {\n  viewType = '3d';\n  spec = null;\n  view = null;\n\n  constructor() {\n    const json = localStorage.getItem('spec');\n    if (json) {\n      this.getTextArea().value = json;\n    }\n  }\n\n  public toggleView() {\n    if (this.viewType === '3d') {\n      this.viewType = '2d';\n    } else {\n      this.viewType = '3d';\n    }\n    this.getText();\n  }\n\n  public getTextArea() {\n    return document.getElementsByTagName('textarea')[0];\n  }\n\n  public getText() {\n    var textarea = this.getTextArea();\n    var text = textarea.value;\n    var errorDiv = document.getElementById('error');\n    var splitRight = document.getElementById('vis');\n    try {\n      var spec = JSON.parse(text);\n      splitRight.style.opacity = '1';\n      errorDiv.style.display = 'none';\n      this.update(spec, text);\n    }\n    catch (e) {\n      errorDiv.innerText = e;\n      errorDiv.style.display = '';\n      splitRight.style.opacity = '0.1';\n    }\n  }\n\n  public update(spec: any, json: string) {\n\n    // stash the view\n    if (this.view != null) {\n      const deckglviewstate = this.view.presenter.deckgl.viewState;\n    }\n    const runtime = vega.parse(spec);\n\n    //save in local storage\n    localStorage.setItem('spec', json);\n\n    this.view = new VegaDeckGl.ViewGl(\n      runtime,\n      {\n        getView: () => {\n          return this.viewType as any\n        },\n        presenterConfig: {\n          onTargetViewState: (height, width) => {\n            return { height, width, newViewStateTarget: false };\n          }\n        }\n      })\n      .renderer('deck.gl')\n      .initialize(document.querySelector('#vis'));\n    this.view.run();\n  }\n}\n\nconst specRenderer = new SpecRenderer();\n\nwindow['vegaTest'] = { specRenderer, vega };\n"
  },
  {
    "path": "packages/vega-deck.gl/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"createElement\",\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/vega-morphcharts/README.md",
    "content": "# @msrvida/vega-morphcharts\n\nView component for [Vega](https://vega.github.io/) visualizations, using MorphCharts for WebGL rendering.\n\nThis project combines two great visualization libraries into one. You have the expressiveness of [Vega specifications](https://vega.github.io/vega/docs/specification/) and the WebGL rendering of MorphCharts. As a result, you have the option of visualizing data in 3 dimensions.\n\n## Limitations\n\nThis project does not fully implement every feature provided by Vega. Some interactive features are omitted due to the nature of the 3D rendering model which breaks correspondence to the 2D rendering plane. Other features simply have yet to be developed, for these we will gladly accept a pull request.\n\n## Feature additions\n\nRect elements can be rendered as 3D cuboids. To do this, add `\"z\"` / `\"depth\"` encodings where you normally use `\"x\"` / `\"width\"` and `\"y\"` / `\"height\"`.\n"
  },
  {
    "path": "packages/vega-morphcharts/package.json",
    "content": "{\n\t\"name\": \"@msrvida/vega-morphcharts\",\n\t\"version\": \"1.0.6\",\n\t\"description\": \"MorphCharts renderer for Vega\",\n\t\"main\": \"dist/es6/index.js\",\n\t\"files\": [\n\t\t\"dist\"\n\t],\n  \"scripts\": {\n\t\t\"vegatest\": \"vite --config vite.dev.config.js\",\n\t\t\"deploy\": \"node ./scripts/deploy.js\",\n\t\t\"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n\t\t\"watch-typescript\": \"tsc -p . -w\",\n\t\t\"build-typescript\": \"tsc -p .\",\n\t\t\"bundle\": \"rollup -c\",\n\t\t\"build:02\": \"npm run build-typescript && node ../../scripts/version.js && npm run bundle\",\n\t\t\"remove-vega\": \"npm un vega-typings\",\n\t\t\"patch-after-vega-upgrade\": \"npm version patch\"\n\t},\n\t\"keywords\": [\n\t\t\"vega\",\n\t\t\"webgl\"\n\t],\n\t\"author\": \"Dan Marshall\",\n\t\"license\": \"MIT\",\n\t\"dependencies\": {\n\t\t\"@msrvida/chart-types\": \"^1\",\n\t\t\"d3-color\": \"^3.1.0\",\n\t\t\"d3-ease\": \"^3.0.1\",\n\t\t\"deepmerge\": \"^2.1.1\",\n\t\t\"is-plain-object\": \"^5.0.0\",\n\t\t\"morphcharts\": \"^1\",\n\t\t\"tsx-create-element\": \"^2.2.5\",\n\t\t\"vega-typings\": \"~2.1.0\"\n\t}\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/rollup.config.mjs",
    "content": "import commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport resolve from '@rollup/plugin-node-resolve';\n\nexport default {\n    input: './dist/es6/index.js',\n    output: {\n        file: './dist/umd/vega-morphcharts.js',\n        format: 'umd',\n        name: 'VegaMorphCharts',\n    },\n    plugins: [\n        json(),\n        resolve({ jsnext: true }),\n        commonjs({ sourceMap: false }),\n    ],\n};\n"
  },
  {
    "path": "packages/vega-morphcharts/scripts/deploy.js",
    "content": "const fs = require('fs');\n\nconst pubversion = 'v1';\n\nfs.copyFileSync('./dist/umd/vega-morphcharts.js', `../../docs/dist/vega-morphcharts/${pubversion}/vega-morphcharts.js`);\n"
  },
  {
    "path": "packages/vega-morphcharts/src/array.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport function concat<T>(...args: T[][]) {\n    return args.reduce((p, c) => c ? p.concat(c) : p, []);\n}\n\n/**\n * Returns array with items which are truthy.\n * @param args array or arrays to concat into a single array.\n */\nexport function allTruthy<T>(...args: T[][]) {\n    return args.reduce((p, c) => c ? p.concat(c) : p, []).filter(Boolean);\n}\n\n/**\n * Add an array to an existing array in place.\n * @param arr Array to append to.\n * @param items Arrof of items to append.\n */\nexport function push<T>(arr: T[], items: T[]) {\n    arr.push.apply(arr, items);\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/base.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport {\n    CanvasHandler,\n    inferType,\n    inferTypes,\n    loader,\n    parse,\n    read,\n    Renderer,\n    renderModule,\n    sceneVisit,\n    scheme,\n    truncate,\n    View,\n} from 'vega-typings';\n\n/**\n * Vega library dependency.\n */\nexport interface VegaBase {\n    CanvasHandler: CanvasHandler;\n    inferType: typeof inferType;\n    inferTypes: typeof inferTypes;\n    loader: typeof loader;\n    parse: typeof parse;\n    read: typeof read;\n    renderModule: typeof renderModule;\n    Renderer: typeof Renderer,\n    sceneVisit: typeof sceneVisit\n    scheme: typeof scheme,\n    truncate: typeof truncate,\n    View: typeof View,\n}\n\nconst vega: VegaBase = {\n    CanvasHandler: null,\n    inferType: null,\n    inferTypes: null,\n    loader: null,\n    parse: null,\n    read: null,\n    renderModule: null,\n    Renderer: null,\n    sceneVisit: null,\n    scheme: null,\n    truncate: null,\n    View: null,\n};\n\n/**\n * References to dependency libraries.\n */\nexport interface Base {\n    vega: VegaBase;\n}\n\n/**\n * References to dependency libraries.\n */\nexport const base: Base = {\n    vega,\n};\n\n/**\n * Specify the dependency libraries to use for rendering.\n * @param vega Vega library.\n */\nexport function use(vega: VegaBase) {\n    base.vega = vega;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/clone.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as _deepmerge from 'deepmerge';\nimport { isPlainObject } from 'is-plain-object';\n\nconst deepmerge = ((_deepmerge as any).default || _deepmerge) as typeof _deepmerge;\n\nexport function clone<T extends object>(objectToClone: T) {\n    if (!objectToClone) return objectToClone;\n    return deepmerge.all([objectToClone]) as T;\n}\n\nconst dontMerge = (destination, source) => source;\n\nexport function deepMerge<T>(...objectsToMerge: T[]) {\n    const objects = objectsToMerge.filter(Boolean) as any as object[];\n    return deepmerge.all(objects, { arrayMerge: dontMerge, isMergeableObject: isPlainObject }) as any as T;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/color.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport {\n    color as d3color,\n    hsl as d3hsl,\n    rgb as d3rgb,\n    RGBColor,\n} from 'd3-color';\nimport { RGBAColor } from './interfaces';\n\nfunction rgbToDeckglColor(c: RGBColor): RGBAColor {\n    return [c.r, c.g, c.b, c.opacity * 255];\n}\n\n/**\n * Compares 2 colors to see if they are equal.\n * @param a RGBAColor to compare\n * @param b RGBAColor to compare\n * @returns True if colors are equal.\n */\nexport function colorIsEqual(a: RGBAColor, b: RGBAColor) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) {\n        if (a[i] !== b[i]) return false;\n    }\n    return true;\n}\n\n/**\n * Convert a CSS color string to a Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.).\n * @param cssColorSpecifier A CSS Color Module Level 3 specifier string.\n */\nexport function colorFromString(cssColorSpecifier: string): RGBAColor {\n    if (cssColorSpecifier) {\n        const dc = d3color(cssColorSpecifier);\n        if (dc) {\n            const c = dc.rgb();\n            return rgbToDeckglColor(c);\n        }\n    }\n}\n\n/**\n * Convert a Deck.gl color to a CSS rgba() string.\n * @param color A Deck.gl RGBAColor array - (The rgba color of each object, in r, g, b, [a]. Each component is in the 0-255 range.)\n */\nexport function colorToString(color: RGBAColor) {\n    const c = [...color];\n    if (c.length > 3) {\n        c[3] /= 255;\n    }\n    return `rgba(${c.join(',')})`;\n}\n\nexport function desaturate(color: RGBAColor, value: number): RGBAColor {\n    const rgb = d3rgb(color[0], color[1], color[2], color[3] / 255);\n    const hslColor = d3hsl(rgb);\n    hslColor.s = value;\n    const c = hslColor.rgb();\n    return rgbToDeckglColor(c);\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/controls.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { createElement, StatelessComponent, StatelessProps } from 'tsx-create-element';\n\nexport interface TableCell {\n    className?: string;\n    content: string | JSX.Element;\n    title?: string;\n}\n\nexport interface TableRow {\n    cells: TableCell[];\n}\n\nexport interface TableProps {\n    className?: string;\n    onRowClick?: (e: Event, index: number) => void;\n    rows: TableRow[];\n    rowClassName?: string;\n}\n\nconst KeyCodes = {\n    ENTER: 'Enter',\n};\n\nexport const Table: StatelessComponent<TableProps> = (props: StatelessProps<TableProps>) => {\n    return (\n        <table className={props.className}>\n            {props.children}\n            {props.rows.map((row, i) => (\n                <tr\n                    className={props.rowClassName || ''}\n                    onClick={e => props.onRowClick && props.onRowClick(e as any as MouseEvent, i)}\n                    tabIndex={props.onRowClick ? 0 : -1}\n                    onKeyUp={e => {\n                        if (e.key === KeyCodes.ENTER && props.onRowClick) {\n                            props.onRowClick(e as any as KeyboardEvent, i);\n                        }\n                    }}\n                >\n                    {row.cells.map((cell, i) => (\n                        <td\n                            className={cell.className || ''}\n                            title={cell.title || ''}\n                        >{cell.content}</td>\n                    ))}\n                </tr>\n            ))}\n        </table>\n    );\n};\n"
  },
  {
    "path": "packages/vega-morphcharts/src/defaults.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport {\n    Axis,\n    Cube,\n    PresenterConfig,\n    PresenterStyle,\n    RGBAColor,\n    Stage,\n    StyledLine,\n    VegaTextLayerDatum,\n} from './interfaces';\nimport { View } from '@msrvida/chart-types';\nimport { SceneLine, SceneText } from 'vega-typings/types/runtime/scene';\nimport { colorIsEqual } from './color';\n\nexport const minHeight = '100px';\nexport const minWidth = '100px';\n\nexport const defaultPresenterStyle: PresenterStyle = {\n    cssPrefix: 'vega-morphcharts-',\n    defaultCubeColor: [128, 128, 128, 255],\n    highlightColor: [0, 0, 0, 255],\n};\n\nexport const defaultPresenterConfig: PresenterConfig = {\n    onCubeClick: (e, cube: Cube) => { },\n    onCubeHover: (e, cube: Cube) => { },\n    transitionDurations: {\n        position: 600,\n        stagger: 600,\n        view: 600,\n    },\n    renderer: {\n        advanced: false,\n        advancedOptions: {},\n        basicOptions: {\n            antialias: true,\n        },\n    },\n};\n\nexport function createStage(view: View) {\n    const stage: Stage = {\n        view,\n        cubeData: [],\n        pathData: [],\n        axes: {\n            x: [],\n            y: [],\n            z: [],\n        },\n        gridLines: [],\n        textData: [],\n        legend: {\n            rows: {},\n        },\n        facets: [],\n    };\n    return stage;\n}\n\nexport const groupStrokeWidth = 1;\n\nexport const lineZ = 0;\n\nexport const defaultView: View = '2d';\n\nexport const minZ = 0.5;\nexport const min3dDepth = 0.05;\nexport const minPixelSize = 0.5;\n\nconst zAxisEncodeColor: RGBAColor = [7, 7, 7, 255];\nconst zAxisOutColor: RGBAColor = [0, 0, 0, 255];\n\nexport function defaultOnAxisItem(vegaItem: SceneLine | SceneText, stageItem: StyledLine | VegaTextLayerDatum, stage: Stage, currAxis: Axis) {\n    if (colorIsEqual(stageItem.color, zAxisEncodeColor)) {\n        stageItem.color = zAxisOutColor;\n        if (currAxis.axisRole !== 'z') {\n            const previousAxisRole = removeCurrentAxes(stage, currAxis);\n            if (previousAxisRole) {\n                currAxis.axisRole = 'z';\n                stage.axes.z.push(currAxis);\n            } else {\n                //debug: curr axis not found\n            }\n        }\n    }\n}\n\nfunction removeCurrentAxes(stage: Stage, currAxis: Axis) {\n    //find the current axis, remove it from parent\n    for (const axisRole in stage.axes) {\n        const axes: Axis[] = stage.axes[axisRole];\n        for (let i = 0; i < axes.length; i++) {\n            if (axes[i] === currAxis) {\n                axes.splice(i, 1);\n                return axisRole;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/easing.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { easeCubicInOut } from 'd3-ease';\n\nexport function easing(t: number) {\n    if (t === 0 || t === 1) return t;\n    return easeCubicInOut(t);\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/enums.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * HTML elements outputted by the presenter.\n */\nexport enum PresenterElement {\n    root, gl, panel, legend, vegaControls,\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/exports/controls.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * This file is for external facing export only, do not use this for internal references, \n * as it may cause circular dependencies in Rollup.\n */\n\nimport { Table, TableCell, TableProps, TableRow } from '../controls';\n\n//alphabetize interfaces for documentation\nexport { TableCell, TableProps, TableRow };\n\n//alphabetize variables for documentation\nexport { Table };\n"
  },
  {
    "path": "packages/vega-morphcharts/src/exports/types.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * This file is for external facing export only, do not use this for internal references, \n * as it may cause circular dependencies in Rollup.\n */\n\nimport {\n    AdvancedRendererOptions,\n    Axis,\n    AxisRole,\n    BasicRendererOptions,\n    Cube,\n    FacetRect,\n    ICubeLayer,\n    LayerStagger,\n    Legend,\n    LegendRow,\n    LegendRowSymbol,\n    MorphChartsColor,\n    MorphChartsColors,\n    MorphChartsCore,\n    MorphChartsRendererOptions,\n    PresenterConfig,\n    PresenterSetup,\n    PresenterStyle,\n    PreStage,\n    QueuedAnimationOptions,\n    Scene3d,\n    Stage,\n    Stagger,\n    StyledLine,\n    TickText,\n    TransitionDurations,\n    UnitColorMap,\n    Vec3,\n    VegaTextLayerDatum,\n} from '../interfaces';\nimport {\n    Base,\n    VegaBase,\n} from '../base';\nimport { ViewGlConfig } from '../vega-classes/viewGl';\n\n//alphabetize interfaces  for documentation\nexport {\n    AdvancedRendererOptions,\n    Axis,\n    AxisRole,\n    Base,\n    BasicRendererOptions,\n    Cube,\n    FacetRect,\n    ICubeLayer,\n    LayerStagger,\n    Legend,\n    LegendRow,\n    LegendRowSymbol,\n    MorphChartsColor,\n    MorphChartsColors,\n    MorphChartsCore,\n    MorphChartsRendererOptions,\n    PreStage,\n    PresenterConfig,\n    PresenterSetup,\n    PresenterStyle,\n    QueuedAnimationOptions,\n    Scene3d,\n    Stage,\n    Stagger,\n    StyledLine,\n    TickText,\n    TransitionDurations,\n    UnitColorMap,\n    VegaBase,\n    VegaTextLayerDatum,\n    ViewGlConfig,\n};\n\n//alphabetize types  for documentation\nexport { Vec3 };\n"
  },
  {
    "path": "packages/vega-morphcharts/src/exports/util.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * This file is for external facing export only, do not use this for internal references, \n * as it may cause circular dependencies in Rollup.\n */\n\nimport { allTruthy, concat, push } from '../array';\nimport { addDiv, addEl, outerSize } from '../htmlHelpers';\nimport { clone, deepMerge } from '../clone';\nimport { colorFromString, colorIsEqual, colorToString, desaturate } from '../color';\nimport { createElement, getActiveElementInfo, mount, setActiveElement } from 'tsx-create-element';\n\n//alphabetize for documentation\nexport { addDiv, addEl, allTruthy, clone, colorFromString, colorIsEqual, colorToString, concat, createElement, deepMerge, desaturate, getActiveElementInfo, mount, outerSize, push, setActiveElement };\n"
  },
  {
    "path": "packages/vega-morphcharts/src/htmlHelpers.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n/**\n * Create a new element as a child of another element.\n * @param tagName Tag name of the new tag to create.\n * @param parentElement Reference of the element to append to.\n * @returns new HTMLElement.\n */\nexport function addEl(tagName: string, parentElement: HTMLElement) {\n    const el = document.createElement(tagName);\n    parentElement.appendChild(el);\n    return el;\n}\n\n/**\n * Create a new div HTMLElement as a child of another element.\n * @param parentElement Reference of the element to append to.\n * @param className Optional css class name to apply to the div.\n */\nexport function addDiv(parentElement: HTMLElement, className?: string) {\n    const div = addEl('div', parentElement) as HTMLDivElement;\n    if (className) {\n        div.className = className;\n    }\n    return div;\n}\n\n/**\n * Measure the outer height and width of an HTMLElement, including margin, padding and border.\n * @param el HTML Element to measure.\n */\nexport function outerSize(el: HTMLElement) {\n    const cs = getComputedStyle(el);\n    const height = parseFloat(cs.marginTop) + parseFloat(cs.paddingTop) + parseFloat(cs.borderTopWidth) + el.offsetHeight + parseFloat(cs.borderBottomWidth) + parseFloat(cs.paddingBottom) + parseFloat(cs.marginBottom);\n    const width = parseFloat(cs.marginLeft) + parseFloat(cs.paddingLeft) + parseFloat(cs.borderLeftWidth) + el.offsetWidth + parseFloat(cs.borderRightWidth) + parseFloat(cs.paddingRight) + parseFloat(cs.marginRight);\n    return { height, width };\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport * as controls from './exports/controls';\nimport * as types from './exports/types';\nimport * as util from './exports/util';\nimport * as defaults from './defaults';\n\nexport { base, use } from './base';\nexport { Presenter } from './presenter';\nexport { ViewGl } from './vega-classes/viewGl';\n\nexport * from './enums';\nexport { controls, defaults, types, util };\n\nexport { RGBAColor } from './interfaces';\n\nexport { version } from './version';\n"
  },
  {
    "path": "packages/vega-morphcharts/src/interfaces.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Camera, Dimension3D, View } from '@msrvida/chart-types';\nimport { Scene, SceneLine, SceneText } from 'vega-typings';\nimport { Axes, Core, Renderers } from 'morphcharts';\nimport { Config } from 'morphcharts/dist/renderers/advanced/config';\nimport { quat, vec3 } from 'gl-matrix';\nimport { CameraTransitioner, ModelTransitioner, Transitioner } from './transition';\n\nexport type Position = [number, number, number];\nexport type RGBAColor = [number, number, number, number];\n\nexport { Core as MorphChartsCore };\n\nexport interface VegaTextLayerDatum {\n    color: RGBAColor;\n    text: string;\n    position: Position;\n    size: number;\n    angle?: number;\n    //textAnchor?: TextAnchor;                  //TODO\n    //alignmentBaseline?: AlignmentBaseline;\n    metaData?: any;\n}\n\nexport interface StyledLine {\n    color?: RGBAColor;\n    sourcePosition: Vec3;\n    strokeWidth?: number;\n    targetPosition: Vec3;\n}\n\nexport interface TickText extends VegaTextLayerDatum {\n    value: number | string;\n}\n\nexport type AxisRole = Dimension3D;\n\nexport interface Axis {\n    axisRole: AxisRole;\n    domain: StyledLine;\n    ticks: StyledLine[];\n    tickText: TickText[];\n    title?: VegaTextLayerDatum;\n}\n\n/**\n * 3 dimensional array of numbers.\n */\nexport type Vec3 = [number, number, number];\n\n/**\n * Cuboid information. The cube does not need to have equal dimensions.\n */\nexport interface Cube {\n\n    /**\n     * Ordinal position.\n     */\n    ordinal?: number;\n\n    /**\n     * Flag whether this cube is a \"placeholder\" and is not to be rendered nor contains cube data.\n     */\n    isEmpty?: boolean;\n\n    color: RGBAColor;\n    position: Vec3;\n    size: Vec3;\n}\n\nexport interface Path {\n    positions: Position[];\n    strokeColor: RGBAColor;\n    strokeWidth: number;\n}\n\nexport interface ImageBounds {\n    x1: number;\n    y1: number;\n    x2: number;\n    y2: number;\n}\n\nexport interface Image {\n    bounds: ImageBounds;\n    height: number;\n    url: string;\n    width: number;\n}\n\n/**\n * Vega Scene plus camera type.\n */\nexport interface Scene3d extends Scene {\n    view: View;\n}\n\n/**\n * Rect area and title for a facet.\n */\nexport interface FacetRect {\n    datum: any;\n    lines: StyledLine[];\n}\n\n/**\n * Data structure containing all that is necessary to present a chart.\n */\nexport interface Stage {\n    redraw?: boolean;\n    backgroundColor?: RGBAColor;\n    backgroundImages?: Image[];\n    cubeData?: Cube[];\n    pathData?: Path[];\n    legend?: Legend;\n    axes?: { [key in AxisRole]: Axis[] };\n    textData?: VegaTextLayerDatum[];\n    view?: View;\n    gridLines?: StyledLine[];\n    facets?: FacetRect[];\n}\n\nexport interface Legend {\n    title?: string;\n    rows: { [index: number]: LegendRow };\n}\n\nexport interface LegendRow {\n    label?: string;\n    value?: string;\n    symbol?: LegendRowSymbol;\n}\n\nexport interface LegendRowSymbol {\n    bounds: {\n        x1: number;\n        y1: number;\n        x2: number;\n        y2: number;\n    };\n    fill: string;\n    shape: string;\n}\n\n/**\n * Function that can be called prior to presenting the stage.\n */\nexport interface PreStage {\n    (stage: Stage, cubeLayer: ICubeLayer): void;\n}\n\n/**\n * Lengths of time for a transition animation.\n */\nexport interface TransitionDurations {\n    position?: number;\n    stagger?: number;\n    view?: number;\n}\n\n/**\n * Visualization setup options to be used by the Presenter.\n */\nexport interface PresenterSetup {\n    camera?: Camera | 'hold';\n    transitionDurations?: TransitionDurations;\n    renderer?: MorphChartsRendererOptions;\n}\n\n/**\n * Configuration options to be used by the Presenter.\n */\nexport interface PresenterConfig extends PresenterSetup {\n    morphChartsColors?: MorphChartsColors;\n    renderer?: MorphChartsRendererOptions;\n    preStage?: PreStage;\n    getCharacterSet?: (stage: Stage) => string[];\n    redraw?: () => void;\n    onCubeHover?: (e: MouseEvent | PointerEvent | TouchEvent, cube: Cube) => void;\n    onCubeClick?: (e: MouseEvent | PointerEvent | TouchEvent, cube: Cube) => void;\n    onLayerClick?: (e: MouseEvent) => any;\n    onLasso?: (ids: Set<number>, e: MouseEvent | PointerEvent | TouchEvent) => void;\n    onLegendClick?: (e: MouseEvent | PointerEvent | TouchEvent, legend: Legend, clickedIndex: number) => void;\n    onPresent?: () => void;\n    shouldViewstateTransition?: () => boolean;\n    preLayer?: (stage: Stage) => void;\n    onTextClick?: (e: MouseEvent | PointerEvent | TouchEvent, t: VegaTextLayerDatum) => void;\n    onTextHover?: (e: MouseEvent | PointerEvent | TouchEvent, t: VegaTextLayerDatum) => boolean;\n    getTextColor?: (o: VegaTextLayerDatum) => RGBAColor;\n    getTextHighlightColor?: (o: VegaTextLayerDatum) => RGBAColor;\n    onSceneRectAssignCubeOrdinal?: (d: object) => number | undefined;\n    onAxisItem?: (vegaItem: SceneLine | SceneText, stageItem: StyledLine | VegaTextLayerDatum, stage: Stage, currAxis: Axis) => void;\n    onAxisConfig?: (cartesian: Axes.Cartesian2dAxes | Axes.Cartesian3dAxes, dim3d: number, axis: Axis) => void;\n    onAxesComplete?: (cartesian: Axes.Cartesian2dAxes | Axes.Cartesian3dAxes) => void;\n    axisPickGridCallback?: (divisions: number[], e: MouseEvent | PointerEvent | TouchEvent) => void;\n    onTargetViewState?: (height: number, width: number) => { height: number, width: number, newViewStateTarget?: boolean };\n    preserveDrawingBuffer?: boolean;\n    zAxisZindex?: number;\n    layerSelection?: LayerSelection;\n}\n\nexport interface PresenterStyle {\n    cssPrefix?: string;\n    defaultCubeColor?: RGBAColor;\n    highlightColor?: RGBAColor;\n    fontFamily?: string;\n}\n\n/**\n * Options to pass to Presenter.queueAnimation()\n */\nexport interface QueuedAnimationOptions {\n\n    /**\n     * Debug label to observe which animation is waiting.\n     */\n    waitingLabel?: string;\n\n    /**\n     * Debug label to observe which handler is invoked.\n     */\n    handlerLabel?: string;\n\n    /**\n     * Function to invoke if animation was interrupted when another animation is queued.\n     */\n    animationCanceled?: () => void;\n}\n\nexport interface UnitColorMap {\n    ids: Uint32Array;\n    minColor: number;\n    maxColor: number;\n    colors: Float64Array;\n    palette: Uint8Array;\n}\n\n/**\n * MorphCharts interfaces\n */\n\nexport interface AdvancedRendererOptions extends Partial<Config> { }\nexport interface BasicRendererOptions extends Renderers.Basic.IRendererOptions { }\n\nexport interface MorphChartsOptions {\n    container: HTMLElement;\n    pickGridCallback: (divisions: number[], e: MouseEvent | PointerEvent | TouchEvent) => void;\n    onCubeHover: (e: MouseEvent, id: number) => void;\n    onCubeClick: (e: MouseEvent, id: number) => void;\n    onCanvasClick: (e: MouseEvent) => void;\n    onLasso: (ids: Set<number>, e: MouseEvent | PointerEvent | TouchEvent) => void;\n}\n\nexport interface MorphChartsRendererOptions {\n    advanced: boolean;\n    advancedOptions: AdvancedRendererOptions;\n    basicOptions: BasicRendererOptions;\n}\n\nexport interface MorphChartsRef {\n    reset: () => void;\n    core: Core;\n    cameraTransitioner: CameraTransitioner;\n    modelTransitioner: ModelTransitioner;\n    positionTransitioner: Transitioner,\n    setMorphChartsRendererOptions: (value: MorphChartsRendererOptions) => void;\n    lastMorphChartsRendererOptions: MorphChartsRendererOptions;\n    supportedRenders: {\n        advanced: boolean;\n        basic: boolean;\n    };\n    layerStagger: LayerStagger;\n}\n\nexport interface ILayerProps {\n    ref: MorphChartsRef;\n    stage: Stage;\n    height: number;\n    width: number;\n    bounds?: IBounds;\n    config: PresenterConfig;\n}\n\nexport interface IBounds {\n    minBoundsX: number;\n    minBoundsY: number;\n    minBoundsZ: number;\n    maxBoundsX: number;\n    maxBoundsY: number;\n    maxBoundsZ: number;\n}\n\nexport interface ILayer {\n    bounds: IBounds;\n    update?: (bounds: IBounds, selected?: Set<number>, stagger?: Stagger) => void;\n    unitColorMap?: UnitColorMap;\n}\n\nexport interface ICubeLayer extends ILayer {\n    positionsX: Float64Array;\n    positionsY: Float64Array;\n    positionsZ: Float64Array;\n}\n\nexport type ILayerCreator = (props: ILayerProps) => ILayer;\n\nexport interface LayerSelection {\n    cubes?: Set<number>;\n    lines?: Set<number>;\n    texts?: Set<number>;\n}\n\nexport interface Stagger {\n    staggerOrders?: Float64Array;\n    minStaggerOrder?: number;\n    maxStaggerOrder?: number;\n}\n\nexport interface LayerStagger {\n    cubes?: Stagger;\n    lines?: Stagger;\n    texts?: Stagger;\n}\n\nexport interface MorphChartsRenderResult {\n    activate(id: number);\n    bounds: IBounds;\n    update: (layerSelection: LayerSelection) => void;\n    moveCamera: (camera: Camera) => void;\n    getCubeLayer: () => ICubeLayer;\n    setTransitionTimeAxesVisibility(): void;\n}\n\nexport type MorphChartsColor = [number, number, number];\n\nexport interface MorphChartsColors {\n    activeItemColor: string;\n    backgroundColor: string;\n    textColor: string;\n    textBorderColor: string;\n    axesTextLabelColor: string;\n    axesTextTitleColor: string;\n    axesTextHeadingColor: string;\n    axesGridBackgroundColor: string;\n    axesGridHighlightColor: string;\n    axesGridMinorColor: string;\n    axesGridMajorColor: string;\n    axesGridZeroColor: string;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/legend.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { createElement, StatelessComponent, StatelessProps } from 'tsx-create-element';\nimport { Legend, LegendRow, LegendRowSymbol } from './interfaces';\nimport { Table, TableRow } from './controls';\n\nexport interface LegendViewProps {\n    legend: Legend;\n    onClick: (e: Event, legend: Legend, clickedIndex: number) => void;\n}\n\nexport const LegendView: StatelessComponent<LegendViewProps> = (props: StatelessProps<LegendViewProps>) => {\n    const rows: TableRow[] = [];\n\n    const addRow = (row: LegendRow, i: number) => {\n        const fn = symbolMap[row.symbol.shape];\n        let jsx: JSX.Element;\n        if (fn) {\n            jsx = fn(row.symbol);\n        } else {\n            jsx = <span>x</span>;\n            //console.log(`need to render ${row.symbol.shape} symbol shape`);\n        }\n        rows.push({\n            cells: [\n                { className: 'symbol', content: jsx },\n                { className: 'label', content: row.label, title: row.label },\n            ],\n        });\n    };\n\n    const sorted = Object.keys(props.legend.rows).sort((a, b) => +a - +b);\n    sorted.forEach(i => addRow(props.legend.rows[i], +i));\n\n    if (sorted.length) {\n        return (\n            <Table\n                rows={rows}\n                rowClassName=\"legend-row\"\n                onRowClick={(e, i) => props.onClick(e, props.legend, i)}\n            >\n                {props.legend.title !== void 0 && <tr onClick={e => props.onClick(e as any as MouseEvent, props.legend, null)} ><th colSpan={2}>{props.legend.title}</th></tr>}\n            </Table>\n        );\n    }\n};\n\nconst symbolMap: { [shape: string]: (symbol: LegendRowSymbol) => JSX.Element } = {\n\n    square: function (symbol: LegendRowSymbol) {\n        return (\n            <div style={{\n                height: `${symbol.bounds.y2 - symbol.bounds.y1}px`,\n                width: `${symbol.bounds.x2 - symbol.bounds.x1}px`,\n                backgroundColor: symbol.fill,\n                borderColor: symbol.fill,\n            }} />\n        );\n    },\n\n};\n"
  },
  {
    "path": "packages/vega-morphcharts/src/marks/image.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Stage } from '../interfaces';\nimport { Scene, SceneItem } from 'vega-typings';\nimport { GroupType, MarkStager, MarkStagerOptions } from './interfaces';\n\ninterface SceneImage extends SceneItem {\n    height: number;\n    url: string;\n    width: number;\n}\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n    base.vega.sceneVisit(scene, function (item: SceneImage) {\n        const { bounds, height, url, width } = item;\n        let { x1, x2, y1, y2 } = bounds;\n        x1 += x;\n        x2 += x;\n        y1 += y;\n        y2 += y;\n        if (!stage.backgroundImages) {\n            stage.backgroundImages = [];\n        }\n        stage.backgroundImages.push({ bounds: { x1, x2, y1, y2 }, height, url, width });\n    });\n};\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-morphcharts/src/marks/interfaces.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Axis, RGBAColor, Stage, StyledLine, VegaTextLayerDatum } from '../interfaces';\nimport { Scene, SceneLine, SceneText } from 'vega-typings';\n\nexport enum GroupType {\n    none = 0,\n    legend = 1,\n    xAxis = 2,\n    yAxis = 3,\n    zAxis = 4,\n}\n\nexport interface MarkStagerOptions {\n    maxOrdinal: number;\n    currAxis: Axis;\n    defaultCubeColor: RGBAColor;\n    assignCubeOrdinal: (d: object) => number | undefined;\n    modifyAxis?: (vegaItem: SceneLine | SceneText, stageItem: StyledLine | VegaTextLayerDatum, stage: Stage, currAxis: Axis) => void;\n    zAxisZindex: number;\n}\n\nexport interface LabelDatum {\n    value: any;\n}\n\nexport interface MarkStager {\n    (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType): void;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/marks/legend.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport {\n    GroupType,\n    LabelDatum,\n    MarkStager,\n    MarkStagerOptions,\n} from './interfaces';\nimport { Legend, LegendRowSymbol, Stage } from '../interfaces';\nimport {\n    Scene,\n    SceneItem,\n    SceneLegendItem,\n    SceneSymbol,\n    SceneText,\n} from 'vega-typings';\n\nconst legendMap: { [role: string]: (legend: Legend, item: SceneItem) => void } = {\n\n    'legend-title': function (legend: Legend, textItem: SceneText) {\n        legend.title = textItem.text;\n    },\n\n    'legend-symbol': function (legend: Legend, symbol: SceneSymbol & SceneLegendItem) {\n        const { bounds, fill, shape } = symbol;\n        //this object is safe for serialization\n        const legendRowSymbol: LegendRowSymbol = { bounds, fill, shape };\n        const i = symbol.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        legend.rows[i].symbol = legendRowSymbol;\n    },\n\n    'legend-label': function (legend: Legend, label: SceneText & SceneLegendItem) {\n        const i = label.datum.index;\n        legend.rows[i] = legend.rows[i] || {};\n        const row = legend.rows[i];\n        row.label = label.text;\n        row.value = (label.datum as unknown as LabelDatum).value;\n    },\n\n};\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n    base.vega.sceneVisit(scene, function (item: SceneItem) {\n        const fn = legendMap[item.mark.role];\n        if (fn) {\n            fn(stage.legend, item);\n        } else {\n            //console.log(`need to render legend ${item.mark.role}`);\n        }\n    });\n};\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-morphcharts/src/marks/line.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { GroupType, MarkStager, MarkStagerOptions } from './interfaces';\nimport { colorFromString } from '../color';\nimport { Path, Stage } from '../interfaces';\nimport { Datum, Scene, SceneGroup } from 'vega-typings';\n\ntype GroupItem = SceneGroup & {\n    datum: Datum;\n    length: number;\n    depth: number;\n    opacity: number;\n    z: number;\n    strokeWidth: number,\n    strokeOpacity: number;\n}\n\n//change direction of y from SVG to GL\nconst ty = -1;\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    const g: GroupItem = {\n        opacity: 1,\n        strokeOpacity: 1,\n        strokeWidth: 1,\n        ...(<GroupItem>scene.items[0]),\n    };\n\n    const path: Path = {\n        strokeWidth: g.strokeWidth,\n        strokeColor: colorFromString(g.stroke),\n        positions: scene.items.map((it: GroupItem) => [\n            it.x,\n            ty * it.y,\n            it.z || 0,\n        ]),\n    };\n\n    path.strokeColor[3] *= g.strokeOpacity;\n    path.strokeColor[3] *= g.opacity;\n\n    stage.pathData.push(path);\n};\n\nexport default markStager;"
  },
  {
    "path": "packages/vega-morphcharts/src/marks/rect.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { colorFromString } from '../color';\nimport { Cube, Stage } from '../interfaces';\nimport { Datum, Scene, SceneRect } from 'vega-typings';\nimport { GroupType, MarkStager, MarkStagerOptions } from './interfaces';\nimport { min3dDepth, minZ } from '../defaults';\n\ntype SceneCube = SceneRect & {\n    datum: Datum;\n    depth: number;\n    opacity: number;\n    z: number;\n}\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    base.vega.sceneVisit(scene, function (item: SceneCube) {\n\n        const noZ = item.z === undefined;\n        const z = noZ ? 0 : (item.z || 0) + minZ;\n        const depth = (noZ ? 0 : (item.depth || 0)) + min3dDepth;\n\n        //change direction of y from SVG to GL\n        const ty = -1;\n\n        const ordinal = options.assignCubeOrdinal(item.datum);\n        if (ordinal > options.maxOrdinal) {\n            options.maxOrdinal = ordinal;\n        }\n        if (ordinal === undefined) {\n            //TODO add to polygons\n            //console.log('not a cube');\n        } else {\n            const cube: Cube = {\n                ordinal,\n                size: [item.width, item.height, depth],\n                position: [x + ((+item.x) || 0), ty * (y + ((+item.y) || 0)) - (+item.height), z],\n                color: colorFromString(item.fill) || options.defaultCubeColor || [128, 128, 128, 128],\n            };\n\n            cube.color[3] = item.opacity === undefined ? 255 : 255 * item.opacity;\n\n            stage.cubeData.push(cube);\n        }\n    });\n\n};\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-morphcharts/src/marks/rule.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { colorFromString } from '../color';\nimport { GroupType, MarkStager, MarkStagerOptions } from './interfaces';\nimport { lineZ } from '../defaults';\nimport { Scene, SceneLine } from 'vega-typings';\nimport { Stage, StyledLine } from '../interfaces';\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    base.vega.sceneVisit(scene, function (item: SceneLine) {\n        const x1 = item.x || 0;\n        const y1 = item.y || 0;\n        const x2 = item.x2 != null ? item.x2 : x1;\n        const y2 = item.y2 != null ? item.y2 : y1;\n\n        const lineItem = styledLine(x1 + x, y1 + y, x2 + x, y2 + y, item.stroke, item.strokeWidth);\n\n        const { currAxis } = options;\n        if (options.modifyAxis) {\n            options.modifyAxis(item, lineItem, stage, currAxis);\n        }\n\n        if (item.mark.role === 'axis-tick') {\n            currAxis.ticks.push(lineItem);\n        } else if (item.mark.role === 'axis-domain') {\n            currAxis.domain = lineItem;\n        } else {\n            stage.gridLines.push(lineItem);\n        }\n    });\n};\n\nfunction styledLine(x1: number, y1: number, x2: number, y2: number, stroke: string, strokeWidth: number) {\n    const line: StyledLine = {\n        sourcePosition: [x1, -y1, lineZ], //-1 = change direction of y from SVG to GL\n        targetPosition: [x2, -y2, lineZ],\n        color: colorFromString(stroke),\n        strokeWidth: strokeWidth,\n    };\n    return line;\n}\n\nexport function box(gx: number, gy: number, height: number, width: number, stroke: string, strokeWidth: number, diagonals = false) {\n    const lines = [\n        styledLine(gx, gy, gx + width, gy, stroke, strokeWidth),\n        styledLine(gx + width, gy, gx + width, gy + height, stroke, strokeWidth),\n        styledLine(gx + width, gy + height, gx, gy + height, stroke, strokeWidth),\n        styledLine(gx, gy + height, gx, gy, stroke, strokeWidth),\n    ];\n    if (diagonals) {\n        lines.push(styledLine(gx, gy, gx + width, gy + height, stroke, strokeWidth));\n        lines.push(styledLine(gx, gy + height, gx + width, gy, stroke, strokeWidth));\n    }\n    return lines;\n}\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-morphcharts/src/marks/text.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\n// import { AlignmentBaseline, TextAnchor } from '@deck.gl/layers/text-layer/text-layer';\nimport { base } from '../base';\nimport { colorFromString } from '../color';\nimport {\n    GroupType,\n    LabelDatum,\n    MarkStager,\n    MarkStagerOptions,\n} from './interfaces';\nimport {\n    Scene,\n    SceneText,\n    SceneTextAlign,\n    SceneTextBaseline,\n} from 'vega-typings';\nimport { Stage, TickText, VegaTextLayerDatum } from '../interfaces';\n\ninterface SceneText2 extends SceneText {\n    metaData?: any;\n    ellipsis?: string;\n    limit?: number;\n}\n\nconst markStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    //change direction of y from SVG to GL\n    const ty = -1;\n\n    base.vega.sceneVisit(scene, function (item: SceneText2) {\n        if (!item.text) return;\n        const size = item.fontSize;\n        //const alignmentBaseline = convertBaseline(item.baseline);\n        //const yOffset = alignmentBaseline === 'top' ? item.fontSize / 2 : 0;    //fixup to get tick text correct\n        const yOffset =  0;\n        const textItem: VegaTextLayerDatum = {\n            color: colorFromString(item.fill),\n            text: item.limit === undefined ? item.text : base.vega.truncate(item.text, item.limit, 'right', item.ellipsis || '...'),   //use dots instead of unicode ellipsis for\n            position: [x + (item.x || 0), ty * (y + (item.y || 0) + yOffset), 0],\n            size,\n            angle: convertAngle(item.angle),\n            //textAnchor: convertAlignment(item.align),\n            //alignmentBaseline,\n            metaData: item.metaData,\n        };\n\n        const { currAxis } = options;\n        if (options.modifyAxis) {\n            options.modifyAxis(item, textItem, stage, currAxis);\n        }\n\n        if (item.mark.role === 'axis-label') {\n            const tickText = textItem as TickText;\n            tickText.value = (item.datum as LabelDatum).value;\n            currAxis.tickText.push(tickText);\n        } else if (item.mark.role === 'axis-title') {\n            currAxis.title = textItem;\n        } else {\n            stage.textData.push(textItem);\n        }\n    });\n};\n\nfunction convertAngle(vegaTextAngle: number) {\n    if (vegaTextAngle && !isNaN(vegaTextAngle)) {\n        return 360 - vegaTextAngle;\n    }\n    return 0;\n}\n\n// function convertAlignment(textAlign: SceneTextAlign): TextAnchor {\n//     switch (textAlign) {\n//         case 'center': return 'middle';\n//         case 'left': return 'start';\n//         case 'right': return 'end';\n//     }\n//     return 'start';\n// }\n\n// function convertBaseline(baseline: SceneTextBaseline): AlignmentBaseline {\n//     switch (baseline) {\n//         case 'middle': return 'center';\n//     }\n//     return baseline || 'bottom';\n// }\n\nexport default markStager;\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/axes.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Axes, AxesVisibility, AxesTextOrientation, Edge3D, Meshes } from 'morphcharts';\nimport { Cartesian2dAxes, Cartesian3dAxes } from 'morphcharts/dist/components/axes';\nimport { Axis, IBounds, ILayer, ILayerCreator, ILayerProps, StyledLine, Stage, Vec3 } from '../interfaces';\nimport { outerBounds } from './bounds';\n\nexport const createAxesLayer: ILayerCreator = (props: ILayerProps): ILayer => {\n    const { config, height, ref, stage } = props;\n    const { core } = ref;\n    const { renderer } = core;\n\n    const { x, y, z } = stage.axes;\n    const xyz = [...x, ...y, ...z];\n\n    renderer.currentAxes = [];\n\n    if (!xyz.length) {\n        renderer.axesVisibility = AxesVisibility.none;\n        return;\n    }\n    renderer.axesVisibility = AxesVisibility.current;\n\n    const correlation = new AxesCorrelation(stage, 3);\n    const { axesSets, labels } = correlation;\n\n    const grid = correlation.getGrid();\n\n    if (grid.byColumn[0]) {\n        grid.byColumn[0].forEach(row => { row.axesSet.showFacetTitleY = true; });\n        grid.byRow[0].forEach(col => { col.axesSet.showFacetTitleX = true; });\n    }\n\n    if (grid.rows > 1) {\n        const { byRow } = grid;\n        byRow[0].forEach(({ axesSet }, col) => {\n            if (!axesSet.y) {\n                if (byRow[1][col].axesSet) {\n                    //move x up\n                    byRow[1][col].axesSet.x.tickText = axesSet.x.tickText;\n                    byRow[1][col].axesSet.showFacetTitleX = axesSet.showFacetTitleX;\n                    delete axesSet.x;\n                }\n            }\n        });\n    }\n\n    let bounds: IBounds;\n    const allAxesSetBounds: AxesSetBounds[] = [];\n\n    let anyZ = false;\n    for (let i = 0; i < axesSets.length; i++) {\n        if (axesSets[i].z) {\n            anyZ = true;\n            break;\n        }\n    }\n    const is3d = stage.view === '3d' && anyZ;\n\n    axesSets.forEach(axesSet => {\n        if (!axesSet.x && !axesSet.y) return;\n        const axesSetBounds: AxesSetBounds = {\n            axesSet,\n            maxBoundsX: null,\n            maxBoundsY: null,\n            maxBoundsZ: null,\n            minBoundsX: null,\n            minBoundsY: null,\n            minBoundsZ: null,\n        };\n\n        if (is3d) {\n            const zBounds = getDomainBounds(1, axesSet.z);\n            axesSetBounds.minBoundsZ = -zBounds.maxBounds;\n            axesSetBounds.maxBoundsZ = -zBounds.minBounds;\n        }\n\n        const yBounds = getDomainBounds(1, axesSet.y);\n        axesSetBounds.minBoundsY = yBounds.minBounds;\n        axesSetBounds.maxBoundsY = yBounds.maxBounds;\n        axesSetBounds.y = yBounds.minBounds;\n        axesSetBounds.h = yBounds.maxBounds - yBounds.minBounds;\n\n        const xBounds = getDomainBounds(0, axesSet.x);\n        axesSetBounds.minBoundsX = xBounds.minBounds;\n        axesSetBounds.maxBoundsX = xBounds.maxBounds;\n        axesSetBounds.x = xBounds.minBounds;\n        axesSetBounds.w = xBounds.maxBounds - xBounds.minBounds;\n\n        allAxesSetBounds.push(axesSetBounds);\n        bounds = outerBounds(bounds, axesSetBounds);\n    });\n\n    const facetLabelX = labels.filter(label => label.axisRole === 'x')[0];\n    const facetLabelY = labels.filter(label => label.axisRole === 'y')[0];\n\n    core.inputManager.pickAxesTitleCallback = ({ axis, axes, manipulator }) => {\n        const axesSet = axesSets[axes];\n        let a: Axis;\n        let f: Axis;\n        switch (axis) {\n            case 0: {\n                a = axesSet.x;\n                f = facetLabelX;\n                break;\n            }\n            case 1: {\n                a = axesSet.y;\n                f = facetLabelY;\n                break;\n            }\n            case 2: {\n                a = axesSet.z;\n                break;\n            }\n        }\n        if (a) {\n            config.onTextClick(manipulator.event as MouseEvent, a.title || f.title);\n        }\n    };\n\n    allAxesSetBounds.forEach(axesSetBounds => {\n        const { axesSet } = axesSetBounds;\n        if (!axesSet.x && !axesSet.y) return;\n        const cartesian = new (is3d ? Axes.Cartesian3dAxes : Axes.Cartesian2dAxes)(core);\n\n        cartesian.isDivisionPickingEnabled = [false, false, false];\n        cartesian.arePickDivisionsVisible = [false, false, false];\n        cartesian.isLabelPickingEnabled = [false, false, false];\n        cartesian.isTitlePickingEnabled = [false, false, false];\n        cartesian.isGridPickingEnabled = false;\n        cartesian.isHeadingPickingEnabled = [false, false, false];\n\n        createAxes(cartesian, 0, 0, axesSet.x, AxesTextOrientation.perpendicular, height, props, axesSet.showFacetTitleX && facetLabelX);\n        createAxes(cartesian, 1, 1, axesSet.y, AxesTextOrientation.perpendicular, height, props, axesSet.showFacetTitleY && facetLabelY);\n        if (is3d) {\n            createAxes(cartesian, 1, 2, axesSet.z, AxesTextOrientation.perpendicular, height, props);\n        }\n\n        configCartesianAxes(is3d, bounds, cartesian);\n\n        const {\n            maxBoundsX,\n            maxBoundsY,\n            minBoundsX,\n            minBoundsY,\n        } = bounds;\n\n        const w = maxBoundsX - minBoundsX;\n        const h = maxBoundsY - minBoundsY;\n\n        cartesian.scalingX = axesSetBounds.w / w;\n        cartesian.scalingY = axesSetBounds.h / h;\n\n        cartesian.offsetX = ((axesSetBounds.x - minBoundsX + axesSetBounds.w / 2) / w) - 0.5;\n        cartesian.offsetY = ((axesSetBounds.y - minBoundsY + axesSetBounds.h / 2) / h) - 0.5;\n\n        const aspect = (h / w);\n        if (aspect > 1) {\n            cartesian.offsetX /= aspect;\n        } else {\n            cartesian.offsetY *= aspect;\n        }\n\n        const axes = is3d ? renderer.createCartesian3dAxesVisual(<Cartesian3dAxes>cartesian) : renderer.createCartesian2dAxesVisual(<Cartesian2dAxes>cartesian);\n        renderer.currentAxes.push(axes);\n\n        props.config.onAxesComplete && props.config.onAxesComplete(cartesian);\n    });\n\n    return { bounds };\n};\n\nconst nullDomain: StyledLine = {\n    sourcePosition: [0, 0, 0],\n    targetPosition: [0, 0, 0],\n};\n\ninterface AxesSetBounds extends IBounds {\n    x?: number;\n    y?: number;\n    h?: number;\n    w?: number;\n    axesSet: AxesSet;\n}\n\ntype AxesSet = {\n    rendered?: boolean;\n    x?: Axis;\n    y?: Axis;\n    z?: Axis;\n    showFacetTitleX?: boolean;\n    showFacetTitleY?: boolean;\n}\n\nclass AxesCorrelation {\n    axesSets: AxesSet[];\n    labels: Axis[];\n\n    constructor(stage: Stage, private dimensions: number) {\n        const { x, y, z } = stage.axes;\n        this.axesSets = [];\n        this.labels = [];\n        [x, y, z].forEach(axes => {\n            axes.forEach(axis => {\n                if (this.axesSets.length === 0) {\n                    this.initialize(axis);\n                } else {\n                    this.correlate(axis);\n                }\n            });\n        });\n    }\n\n    getGrid() {\n        const mapCols: { [col: string]: { [row: string]: AxesSet } } = {};\n        const mapRows: { [row: string]: null } = {};\n        this.axesSets.forEach(axesSet => {\n            const domain = axesSet?.x?.domain;\n            if (!domain) return;\n            const col = domain.sourcePosition[0].toString();\n            const row = domain.sourcePosition[1].toString();\n            if (!mapCols[col]) {\n                mapCols[col] = {};\n            }\n            mapCols[col][row] = axesSet;\n            mapRows[row] = null;\n        });\n        const colKeys = Object.keys(mapCols).sort((a, b) => +a - +b);\n        const rowKeys = Object.keys(mapRows).sort((a, b) => +a - +b);\n        return {\n            cols: colKeys.length,\n            rows: rowKeys.length,\n            byColumn: colKeys.map(colKey => rowKeys.map(rowKey => { return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] }; })),\n            byRow: rowKeys.map(rowKey => colKeys.map(colKey => { return { colKey, rowKey, axesSet: mapCols[colKey][rowKey] }; })),\n        };\n    }\n\n    initialize(axis: Axis) {\n        if (!axis.domain) {\n            this.labels.push(axis);\n            return;\n        }\n        const axesSet: AxesSet = {};\n        axesSet[axis.axisRole] = axis;\n        this.axesSets.push(axesSet);\n    }\n\n    correlate(axis: Axis) {\n        if (!axis.domain) {\n            this.labels.push(axis);\n            return;\n        }\n        for (let i = 0; i < this.axesSets.length; i++) {\n            const axesSet = this.axesSets[i];\n            for (const axisRole in axesSet) {\n                const test: Axis = axesSet[axisRole];\n                if (this.matchDomains(axis.domain, test.domain)) {\n                    //prefer the axes with titles\n                    if (!axesSet[axis.axisRole] || (!axesSet[axis.axisRole].tickText.length && axis.tickText.length)) {\n                        axesSet[axis.axisRole] = axis;\n                    }\n                    return;\n                }\n            }\n        }\n        this.initialize(axis);\n    }\n\n    matchDomains(a: StyledLine, b: StyledLine) {\n        if (this.matchPoint(a.sourcePosition, b.sourcePosition)) return true;\n        if (this.matchPoint(a.sourcePosition, b.targetPosition)) return true;\n        if (this.matchPoint(a.targetPosition, b.targetPosition)) return true;\n        if (this.matchPoint(a.targetPosition, b.sourcePosition)) return true;\n        return false;\n    }\n\n    matchPoint(a: Vec3, b: Vec3) {\n        for (let i = 0; i < this.dimensions; i++) {\n            if (a[i] !== b[i]) return false;\n        }\n        return true;\n    }\n}\n\nfunction createAxes(cartesian: Axes.Cartesian2dAxes | Axes.Cartesian3dAxes, dim2d: number, dim3d: number, axis: Axis, orientation: AxesTextOrientation, height: number, props: ILayerProps, facetLabel?: Axis) {\n    const domain = axis?.domain || nullDomain;\n    const { tickPositions, tickText, textPos, textSize } = convertAxis(axis, domain, dim2d, height);\n\n    if (axis.axisRole === 'z') {\n        tickPositions.forEach((t, i) => tickPositions[i] = 1 - t);\n        textPos.forEach((t, i) => textPos[i] = 1 - t);\n        tickText.reverse();\n        tickPositions.reverse();\n        textPos.reverse();\n    }\n\n    cartesian.setTickPositions(dim3d, tickPositions);\n\n    cartesian.zero[dim3d] = 0;  //TODO get any \"zero\" gridline position from vega\n\n    cartesian.setLabelPositions(dim3d, textPos);\n    cartesian.setLabels(dim3d, tickText);\n    cartesian.setLabelSizes(dim3d, textSize);\n\n    const title = axis?.title || facetLabel?.title;\n    if (title?.text) {\n        cartesian.setTitle(dim3d, title.text);\n        cartesian.setTitleSize(dim3d, title.size / height);\n    }\n\n    cartesian.setLabelOrientation(dim3d, orientation);\n\n    props.config.onAxisConfig && props.config.onAxisConfig(cartesian, dim3d, axis);\n\n    return {\n        tickText,\n    };\n}\n\nfunction configCartesianAxes(is3d: boolean, bounds: IBounds, cartesian: Axes.Cartesian2dAxes | Axes.Cartesian3dAxes) {\n    if (is3d) {\n        cartesian.isEdgeVisible[Edge3D.topBack] = false;\n    }\n    cartesian.isEdgeVisible[Edge3D.backRight] = false;\n    cartesian.isEdgeVisible[Edge3D.bottomRight] = false;\n    cartesian.isEdgeVisible[Edge3D.frontRight] = false;\n    cartesian.isEdgeVisible[Edge3D.topFront] = false;\n    cartesian.isEdgeVisible[Edge3D.topRight] = false;\n\n    const {\n        maxBoundsX,\n        maxBoundsY,\n        maxBoundsZ,\n        minBoundsX,\n        minBoundsY,\n        minBoundsZ,\n    } = bounds;\n\n    cartesian.minBoundsX = minBoundsX;\n    cartesian.maxBoundsX = maxBoundsX;\n    cartesian.minBoundsY = minBoundsY;\n    cartesian.maxBoundsY = maxBoundsY;\n    if (is3d) {\n        (<Axes.Cartesian3dAxes>cartesian).minBoundsZ = minBoundsZ;\n        (<Axes.Cartesian3dAxes>cartesian).maxBoundsZ = maxBoundsZ;\n    }\n}\n\nfunction getDomainBounds(dim2d: number, axis: Axis) {\n    const domain = axis?.domain || nullDomain;\n    const minBounds = domain.sourcePosition[dim2d];\n    const maxBounds = domain.targetPosition[dim2d];\n    return {\n        maxBounds,\n        minBounds,\n    };\n}\n\nfunction convertAxis(axis: Axis, domain: StyledLine, dim: number, height: number) {\n    const start = domain.sourcePosition[dim];\n    const span = domain.targetPosition[dim] - start;\n    const tickPositions = axis\n        ?\n        axis.ticks.map(t => (t.sourcePosition[dim] - start) / span)\n        :\n        [];\n    const tickText = axis ?\n        axis.tickText.map(t => t.text)\n        :\n        [];\n\n    const textPos = axis ?\n        axis.tickText.map(t => (t.position[dim] - start) / span)\n        :\n        [];\n\n    const textSize = axis ?\n        axis.tickText.map(t => t.size / height)\n        :\n        [];\n\n    if (tickPositions.length) {\n        if (tickPositions[0] !== 0) {\n            tickPositions[0] = 0;\n        }\n\n        if (tickPositions[tickPositions.length - 1] !== 1) {\n            tickPositions[tickPositions.length - 1] = 1;\n        }\n    }\n\n    return {\n        tickPositions,\n        tickText,\n        textPos,\n        textSize,\n    };\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/bounds.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { IBounds } from '../interfaces';\n\nexport function outerBounds(b1: IBounds, b2: IBounds): IBounds {\n    if (!b1 && !b2) return;\n    if (!b1) return b2;\n    if (!b2) return b1;\n    const minProps = [\n        'minBoundsX',\n        'minBoundsY',\n        'minBoundsZ',\n    ];\n    const maxProps = [\n        'maxBoundsX',\n        'maxBoundsY',\n        'maxBoundsZ',\n    ];\n    const result = {} as IBounds;\n    minProps.forEach(p => result[p] = notNull(Math.min, b1[p], b2[p]));\n    maxProps.forEach(p => result[p] = notNull(Math.max, b1[p], b2[p]));\n    return result;\n}\n\nfunction notNull(fn: (...values: number[]) => number, v1: number, v2: number) {\n    if (v1 == null && v2 == null) return null;\n    if (v1 == null) return v2;\n    if (v2 == null) return v1;\n    return fn(v1, v2);\n}\n\nexport function increment(\n    b: IBounds,\n    minBoundsX: number,\n    minBoundsY: number,\n    minBoundsZ: number,\n    maxBoundsX: number,\n    maxBoundsY: number,\n    maxBoundsZ: number,\n) {\n    return outerBounds(b, {\n        minBoundsX,\n        minBoundsY,\n        minBoundsZ,\n        maxBoundsX,\n        maxBoundsY,\n        maxBoundsZ,\n    });\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/camera.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { quat, vec3 } from 'gl-matrix';\nimport { AxesVisibility } from 'morphcharts';\nimport { MorphChartsCore, MorphChartsRef, PresenterConfig } from '../interfaces';\nimport { cameraDefaults } from './defaults';\nimport { View } from '@msrvida/chart-types';\n\nconst { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n\nexport function applyCameraCallbacks(ref: MorphChartsRef, lastPresenterConfig: PresenterConfig, lastView: View, transistion2dOnly: boolean) {\n    const { cameraTransitioner, core, modelTransitioner, positionTransitioner } = ref;\n\n    ref.reset = () => {\n\n        core.reset(true);\n\n        if (lastView === '3d') {\n            modelTransitioner.qRotation.to = qModelRotation3d;\n            cameraTransitioner.qRotation.to = qCameraRotation3d;\n            cameraTransitioner.vPosition.to = vCameraPosition;\n        } else {\n            modelTransitioner.qRotation.to = qModelRotation2d;\n            cameraTransitioner.qRotation.to = qCameraRotation2d;\n            cameraTransitioner.vPosition.to = vCameraPosition;\n        }\n\n        quat.slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.to, modelTransitioner.qRotation.to, 0);\n        core.setModelRotation(modelTransitioner.qRotation.current, true);\n        core.camera.setOrbit(cameraTransitioner.qRotation.to, true);\n        core.camera.setPosition(cameraTransitioner.vPosition.to, true);\n    };\n\n    const cam = (t: number) => {\n        quat.slerp(cameraTransitioner.qRotation.current, cameraTransitioner.qRotation.from, cameraTransitioner.qRotation.to, t);\n        vec3.lerp(cameraTransitioner.vPosition.current, cameraTransitioner.vPosition.from, cameraTransitioner.vPosition.to, t);\n        core.camera.setOrbit(cameraTransitioner.qRotation.current, false);\n        core.camera.setPosition(cameraTransitioner.vPosition.current, false);\n\n        // disable picking during transitions, as the performance degradation could reduce the framerate\n        core.inputManager.isPickingEnabled = false;\n    };\n\n    core.updateCallback = (elapsedTime) => {\n        const { transitionDurations } = lastPresenterConfig;\n        if (positionTransitioner.isTransitioning) {\n            const t = positionTransitioner.elapse(elapsedTime, transitionDurations.position + transitionDurations.stagger);\n            core.renderer.transitionTime = t;\n            setTransitionTimeAxesVisibility(transistion2dOnly, core);\n        } else {\n            core.inputManager.isPickingEnabled = true;\n        }\n        if (modelTransitioner.isTransitioning) {\n            const tm = modelTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n            if (modelTransitioner.shouldTransition) {\n                quat.slerp(modelTransitioner.qRotation.current, modelTransitioner.qRotation.from, modelTransitioner.qRotation.to, tm);\n                core.setModelRotation(modelTransitioner.qRotation.current, false);\n            }\n            cam(tm);\n        }\n        if (cameraTransitioner.isTransitioning) {\n            const t = cameraTransitioner.elapse(elapsedTime, transitionDurations.view, true);\n            cam(t);\n        }\n    };\n}\n\nexport function setTransitionTimeAxesVisibility(transistion2dOnly: boolean, core: MorphChartsCore) {\n    const t = core.renderer.transitionTime;\n    if (transistion2dOnly) {\n        if (t < 0.5) {\n            core.renderer.axesVisibility = AxesVisibility.previous;\n        } else {\n            core.renderer.axesVisibility = AxesVisibility.current;\n        }\n    }\n    else {\n        if (t <= 0.01) {\n            core.renderer.axesVisibility = AxesVisibility.previous;\n        } else if (t >= 0.99) {\n            core.renderer.axesVisibility = AxesVisibility.current;\n        } else {\n            core.renderer.axesVisibility = AxesVisibility.none;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/canvas.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Core, SingleTouchAction } from 'morphcharts';\nimport { MorphChartsOptions } from '../interfaces';\n\nconst rightButton = 2;\n\nexport function listenCanvasEvents(core: Core, options: MorphChartsOptions) {\n    const { container, pickGridCallback } = options;\n    const { inputManager } = core;\n\n    if (options.onLasso) {\n        inputManager.pickLassoCallback = result => {\n            options.onLasso(result.ids[0], result.manipulator.event as MouseEvent);\n        };\n    }\n\n    inputManager.singleTouchAction = manipulator => {\n        if (manipulator.button == rightButton || manipulator.shiftKey || manipulator.ctrlKey) {\n            return SingleTouchAction.rotate;\n        }\n        else if (manipulator.altKey) {\n            return SingleTouchAction.lasso;\n        }\n        else {\n            return SingleTouchAction.translate;\n        }\n    };\n\n    inputManager.pickAxesGridCallback = ({ divisionX, divisionY, divisionZ, manipulator }) => {\n        clearClickTimeout();\n        const { altKey, button, shiftKey } = manipulator;\n        const me = { altKey, shiftKey, button } as MouseEvent;\n        const e: MouseEvent | PointerEvent | TouchEvent = me;\n        pickGridCallback([divisionX, divisionY, divisionZ], e);\n    };\n\n    const canvas = container.getElementsByTagName('canvas')[0];\n    let pickedId: number;\n    const hover = (e: MouseEvent) => {\n        if (core.renderer.pickedId !== pickedId) {\n            pickedId = core.renderer.pickedId;\n            const ordinal = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n            options.onCubeHover(e, ordinal);\n        }\n    };\n    canvas.addEventListener('mousemove', (e) => {\n        clearClickTimeout();\n        if (mousedown) {\n            options.onCubeHover(e, null);\n        }\n        hover(e);\n    });\n    canvas.addEventListener('mouseout', hover);\n    canvas.addEventListener('mouseover', hover);\n\n    let mousedown: boolean;\n    canvas.addEventListener('mousedown', () => {\n        mousedown = true;\n    });\n    canvas.addEventListener('mouseup', (e) => {\n        mousedown = false;\n    });\n\n    let canvasClickTimeout: number;\n    const clearClickTimeout = () => {\n        clearTimeout(canvasClickTimeout);\n        canvasClickTimeout = null;\n    };\n    canvas.addEventListener('click', (e) => {\n        canvasClickTimeout = setTimeout(() => {\n            options.onCanvasClick(e);\n        }, 50);\n    });\n\n    inputManager.pickItemCallback = ({ manipulator }) => {\n        clearClickTimeout();\n        const ordinal = core.renderer.transitionBuffers[0].pickIdLookup[pickedId];\n        options.onCubeClick(manipulator.event as MouseEvent, ordinal);\n    };\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/color.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { colorFromString } from '../color';\nimport { MorphChartsColor, MorphChartsColors, MorphChartsRef, RGBAColor } from '../interfaces';\n\nexport class ColorMap {\n    private colorMap: { [key: string]: { index: number, rgbaColor: RGBAColor } };\n    private colorArray: RGBAColor[];\n\n    constructor(public quant = 5) {\n        this.colorMap = {};\n        this.colorArray = [];\n    }\n\n    private getColorKey(rgbaColor: RGBAColor) {\n        const color = rgbaColor.slice(0, 3).map(e => Math.floor(e / this.quant) * this.quant);\n        color[3] = rgbaColor[3]; //retain alpha\n        return JSON.stringify(color);\n    }\n\n    public registerColor(rgbaColor: RGBAColor) {\n        const colorKey = this.getColorKey(rgbaColor);\n        if (!this.colorMap[colorKey]) {\n            this.colorMap[colorKey] = {\n                index: this.colorArray.length,\n                rgbaColor,\n            };\n            this.colorArray.push(rgbaColor);\n        }\n        return this.colorMap[colorKey].index;\n    }\n\n    public getPalette() {\n        return {\n            palette: new Uint8Array(this.colorArray.flat()),\n            maxColor: this.colorArray.length - 1,\n        };\n    }\n}\n\nfunction convert(newColor: string): MorphChartsColor {\n    const c = colorFromString(newColor).slice(0, 3);\n    return c.map(v => v / 255) as MorphChartsColor;\n}\n\nexport function colorConfig(ref: MorphChartsRef, colors: MorphChartsColors) {\n    if (!colors) return;\n    const { config } = ref.core;\n    config.activeColor = convert(colors.activeItemColor);\n    config.backgroundColor = new Float32Array(convert(colors.backgroundColor));\n    config.textColor = convert(colors.textColor);\n    config.textBorderColor = convert(colors.textBorderColor);\n    config.axesTextColor = convert(colors.axesTextLabelColor);\n    config.axesGridBackgroundColor = convert(colors.axesGridBackgroundColor);\n    config.axesGridHighlightColor = convert(colors.axesGridHighlightColor);\n    config.axesGridMinorColor = convert(colors.axesGridMinorColor);\n    config.axesGridMajorColor = convert(colors.axesGridMajorColor);\n    config.axesGridZeroColor = convert(colors.axesGridZeroColor);\n\n    //TODO fix this - hack to reset the background color\n    ref.core.renderer['_theme'] = null;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/cubes.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layouts, UnitType } from 'morphcharts';\nimport { IBounds, ICubeLayer, ILayer, ILayerCreator, ILayerProps, Stage } from '../interfaces';\nimport { increment } from './bounds';\nimport { ColorMap } from './color';\n\nconst key = 'cube';\n\nexport const createCubeLayer: ILayerCreator = (props: ILayerProps): ILayer => {\n    const { ref, stage } = props;\n    const { core } = ref;\n    const scatter = new Layouts.Scatter(core);\n    const {\n        ids,\n        colors,\n        positionsX,\n        positionsY,\n        positionsZ,\n        sizesX,\n        sizesY,\n        sizesZ,\n        bounds,\n        maxColor,\n        palette,\n    } = convert(stage);\n\n    if (!ids.length) return;\n\n    const { renderer } = core;\n\n    let cubeTransitionBuffer = renderer.transitionBuffers.find(t => t.key === key);\n    if (!cubeTransitionBuffer) {\n        cubeTransitionBuffer = renderer.createTransitionBuffer(ids);\n        cubeTransitionBuffer.key = key;\n        renderer.transitionBuffers.push(cubeTransitionBuffer);\n    } else {\n        cubeTransitionBuffer.swap();\n    }\n\n    scatter.layout(cubeTransitionBuffer.currentBuffer, ids, {\n        positionsX,\n        positionsY,\n        positionsZ,\n    });\n\n    const layer: ICubeLayer = {\n        positionsX,\n        positionsY,\n        positionsZ,\n        update: (newBounds, selected, stagger) => {\n            const { colors, maxColor, minColor, palette } = layer.unitColorMap;\n\n            // reference off of core.renderer to get the actual buffer\n            const currCubeTransitionBuffer = core.renderer.transitionBuffers.find(t => t.key === key);\n            currCubeTransitionBuffer.currentBuffer.unitType = UnitType.block;\n            currCubeTransitionBuffer.currentPalette.colors = palette;\n\n            let options: Layouts.IScatterVertexOptions = {\n                selected,\n                colors,\n                minColor,\n                maxColor,\n                sizesX,\n                sizesY,\n                sizesZ,\n                ...newBounds,\n            };\n            if (stagger?.staggerOrders) {\n                const { maxStaggerOrder, minStaggerOrder, staggerOrders } = stagger;\n                options = {\n                    ...options,\n                    maxStaggerOrder,\n                    minStaggerOrder,\n                    staggerOrders,\n                };\n            }\n            scatter.update(currCubeTransitionBuffer.currentBuffer, ids, options);\n        },\n        bounds,\n        unitColorMap: {\n            colors,\n            ids,\n            minColor: 0,\n            maxColor,\n            palette,\n        },\n    };\n\n    return layer;\n};\n\nfunction convert(stage: Stage) {\n    const { cubeData } = stage;\n    const { length } = cubeData;\n\n    const ids: number[] = [];\n    const colors = new Float64Array(length);\n    const positionsX = new Float64Array(length);\n    const positionsY = new Float64Array(length);\n    const positionsZ = new Float64Array(length);\n    const sizesX = new Float64Array(length);\n    const sizesY = new Float64Array(length);\n    const sizesZ = new Float64Array(length);\n    let bounds: IBounds;\n\n    const colorMap = new ColorMap();\n\n    cubeData.forEach((cube, i) => {\n        ids.push(i);\n        if (cube.isEmpty) {\n            positionsX[i] = 0;\n            positionsY[i] = 0;\n            positionsZ[i] = 0;\n            sizesX[i] = 0;\n            sizesY[i] = 0;\n            sizesZ[i] = 0;\n            colors[i] = 0;\n        } else {\n            //ids.push(cube.ordinal);\n            positionsX[i] = cube.position[0] + cube.size[0] * 0.5;\n            positionsY[i] = cube.position[1] + cube.size[1] * 0.5;\n            positionsZ[i] = cube.position[2] + cube.size[2] * 0.5;\n            sizesX[i] = cube.size[0];\n            sizesY[i] = cube.size[1];\n            sizesZ[i] = cube.size[2];\n\n            bounds = increment(bounds,\n                cube.position[0],\n                cube.position[1],\n                cube.position[2],\n                cube.position[0] + cube.size[0],\n                cube.position[1] + cube.size[1],\n                cube.position[2] + cube.size[2],\n            );\n\n            colors[i] = colorMap.registerColor(cube.color);\n        }\n    });\n\n    const { palette, maxColor } = colorMap.getPalette();\n\n    return {\n        ids: new Uint32Array(ids),\n        colors,\n        positionsX,\n        positionsY,\n        positionsZ,\n        sizesX,\n        sizesY,\n        sizesZ,\n        bounds,\n        maxColor,\n        palette,\n    };\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/defaults.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { quat, vec3 } from 'gl-matrix';\nimport { Constants, Helpers } from 'morphcharts';\n\nfunction createCameraDefaults() {\n    const qModelRotation2d = quat.create();\n    const qModelRotation3d = Constants.QUAT_ROTATEX_MINUS_90;\n    const qCameraRotation2d = quat.create();\n    const qCameraRotation3d = quat.create();\n    const qAngle = quat.create();\n    const vCameraPosition = vec3.create();\n\n    // Altitude (pitch around local right axis)\n    quat.setAxisAngle(qCameraRotation3d, Constants.VECTOR3_UNITX, Helpers.AngleHelper.degreesToRadians(30));\n\n    // Azimuth (yaw around global up axis)\n    quat.setAxisAngle(qAngle, Constants.VECTOR3_UNITY, Helpers.AngleHelper.degreesToRadians(-25));\n    quat.multiply(qCameraRotation3d, qCameraRotation3d, qAngle);\n\n    return {\n        qModelRotation2d,\n        qModelRotation3d,\n        qCameraRotation2d,\n        qCameraRotation3d,\n        vCameraPosition,\n    };\n}\n\nexport const cameraDefaults = createCameraDefaults();\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/image.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Components, Core } from 'morphcharts';\nimport { vec3 } from 'gl-matrix';\nimport { IBounds } from '../interfaces';\n\nexport function getImageData(url: string) {\n    return new Promise<ImageData>((resolve, reject) => {\n        const imageElement = document.createElement('img');\n        imageElement.onload = () => {\n            const canvas = document.createElement('canvas');\n            const ctx = canvas.getContext('2d');\n            const { height, width } = imageElement;\n            canvas.width = width;\n            canvas.height = height;\n            ctx.drawImage(imageElement, 0, 0);\n            resolve(ctx.getImageData(0, 0, width, height));\n        };\n        imageElement.src = url;\n    });\n}\n\nexport function createImageQuad(core: Core, imageData: ImageData, bounds: IBounds, position: vec3, width: number, height: number) {\n    const { maxBoundsX, maxBoundsY, maxBoundsZ, minBoundsX, minBoundsY, minBoundsZ } = bounds;\n    const imageOptions: Components.IImageQuadOptions = {\n        imageData,\n        position,\n        height,\n        width,\n        minBoundsX,\n        maxBoundsX,\n        minBoundsZ,\n        maxBoundsZ,\n        minBoundsY,\n        maxBoundsY,\n    };\n    return new Components.ImageQuad(core, imageOptions);\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/index.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport * from './render';\nexport * from './color';\nexport * from './init';\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/init.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { AxesVisibility, Core } from 'morphcharts';\nimport { MorphChartsRef, MorphChartsRendererOptions, MorphChartsOptions } from '../interfaces';\nimport { getRenderer, rendererEnabled, setRendererOptions, shouldChangeRenderer } from './renderer';\nimport { listenCanvasEvents } from './canvas';\nimport { CameraTransitioner, ModelTransitioner, Transitioner } from '../transition';\n\nexport function init(options: MorphChartsOptions, mcRendererOptions: MorphChartsRendererOptions) {\n    const { container } = options;\n    const core = new Core({ container });\n\n    getRenderer(mcRendererOptions, core);\n    listenCanvasEvents(core, options);\n\n    core.config.pickSelectDelay = 50;\n\n    const cameraTransitioner = new CameraTransitioner();\n    const modelTransitioner = new ModelTransitioner();\n    const positionTransitioner = new Transitioner();\n\n    positionTransitioner.ended = () => {\n        core.renderer.axesVisibility = AxesVisibility.current;\n    };\n\n    const ref: MorphChartsRef = {\n        supportedRenders: {\n            advanced: rendererEnabled(true),\n            basic: rendererEnabled(false),\n        },\n        reset: null,\n        cameraTransitioner,\n        modelTransitioner,\n        positionTransitioner,\n        core,\n        setMorphChartsRendererOptions(mcRendererOptions: MorphChartsRendererOptions) {\n            if (shouldChangeRenderer(ref.lastMorphChartsRendererOptions, mcRendererOptions)) {\n                getRenderer(mcRendererOptions, core);\n                listenCanvasEvents(core, options);\n            } else {\n                if (mcRendererOptions.advanced) {\n                    //same renderer, poke the config\n                    setRendererOptions(core.renderer, mcRendererOptions);\n                }\n            }\n            ref.lastMorphChartsRendererOptions = mcRendererOptions;\n        },\n        lastMorphChartsRendererOptions: mcRendererOptions,\n        layerStagger: {},\n    };\n\n    return ref;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/lines.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Layouts, UnitType } from 'morphcharts';\nimport { ILineVertexOptions } from 'morphcharts/dist/layouts/line';\nimport { Position, Stage } from '../interfaces';\nimport { increment } from './bounds';\nimport { ColorMap } from './color';\nimport { IBounds, ILayer, ILayerCreator, ILayerProps } from '../interfaces';\n\nconst key = 'line';\n\nexport const createLineLayer: ILayerCreator = (props: ILayerProps): ILayer => {\n    const { height, ref, stage, width } = props;\n    const { core } = ref;\n    const lines = new Layouts.Line(core);\n    const {\n        ids,\n        fromIds,\n        toIds,\n        lineColors,\n        lineSizes,\n        bounds,\n        positionsX,\n        positionsY,\n        positionsZ,\n        lineMaxColor,\n        palette,\n    } = convert(stage, height, width);\n\n    if (!ids.length) return;\n\n    const { renderer } = core;\n\n    let lineTransitionBuffer = renderer.transitionBuffers.find(t => t.key === key);\n    if (!lineTransitionBuffer) {\n        lineTransitionBuffer = renderer.createTransitionBuffer(ids);\n        lineTransitionBuffer.key = key;\n        renderer.transitionBuffers.push(lineTransitionBuffer);\n    } else {\n        lineTransitionBuffer.swap();\n    }\n\n    lines.layout(\n        lineTransitionBuffer.currentBuffer,\n        ids,\n        fromIds,\n        toIds,\n        {\n            positionsX,\n            positionsY,\n            positionsZ,\n            lineSizes,\n            sizeScaling: 1,\n        },\n    );\n\n    let options: ILineVertexOptions = {\n        lineColors,\n        lineMinColor: 0,\n        lineMaxColor,\n    };\n\n    // Unit type\n    lineTransitionBuffer.currentBuffer.unitType = UnitType.cylinder;\n\n    lineTransitionBuffer.currentPalette.colors = palette;\n\n    return {\n        update: newBounds => {\n            options = {\n                ...options,\n                ...newBounds,\n            };\n            // reference off of core.renderer to get the actual buffer\n            const currLineTransitionBuffer = core.renderer.transitionBuffers.find(t => t.key === key);\n            lines.update(\n                currLineTransitionBuffer.currentBuffer,\n                ids,\n                fromIds,\n                toIds,\n                options,\n            );\n        },\n        bounds,\n        unitColorMap: {\n            ids,\n            colors: lineColors,\n            minColor: 0,\n            maxColor: lineMaxColor,\n            palette,\n        },\n    };\n};\n\ninterface Line {\n    id: number;\n    from: number;\n    to: number;\n    color: number;\n    size: number;\n}\n\nfunction convert(stage: Stage, height: number, width: number) {\n    const { pathData } = stage;\n\n    const positions: Position[] = [];\n    const lines: Line[] = [];\n    const colorMap = new ColorMap();\n\n    pathData.forEach(path => {\n        const color = colorMap.registerColor(path.strokeColor);\n\n        let from = positions.length;\n        positions.push(path.positions[0]);\n\n        for (let i = 1; i < path.positions.length; i++) {\n            const to = positions.length;\n            positions.push(path.positions[i]);\n            lines.push({\n                id: lines.length,\n                from,\n                to,\n                color,\n                size: path.strokeWidth,\n            });\n            from = to;\n        }\n    });\n\n    const ids = new Uint32Array(lines.length);\n    const fromIds = new Uint32Array(lines.length);\n    const toIds = new Uint32Array(lines.length);\n    const lineColors = new Float64Array(lines.length);\n    const lineSizes = new Float64Array(lines.length);\n\n    lines.forEach((line, i) => {\n        ids[i] = i;\n        fromIds[i] = line.from;\n        toIds[i] = line.to;\n        lineColors[i] = line.color;\n        lineSizes[i] = line.size;\n    });\n\n    const positionsX = new Float64Array(positions.length);\n    const positionsY = new Float64Array(positions.length);\n    const positionsZ = new Float64Array(positions.length);\n    let bounds: IBounds;\n\n    positions.forEach((p, i) => {\n        positionsX[i] = p[0];\n        positionsY[i] = p[1] + height;\n        positionsZ[i] = p[2];\n        bounds = increment(bounds,\n            positionsX[i],\n            positionsY[i],\n            positionsZ[i],\n            positionsX[i],\n            positionsY[i],\n            positionsZ[i],\n        );\n    });\n\n    const { palette, maxColor: lineMaxColor } = colorMap.getPalette();\n\n    return {\n        ids,\n        fromIds,\n        toIds,\n        lineColors,\n        lineSizes,\n        bounds,\n        positionsX,\n        positionsY,\n        positionsZ,\n        lineMaxColor,\n        palette,\n    };\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/render.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { IBounds, ILayerProps, MorphChartsRenderResult, MorphChartsRef, PreStage, Stage, MorphChartsColors, PresenterConfig, LayerSelection, ILayer, ImageBounds, LayerStagger, ICubeLayer } from '../interfaces';\nimport { createAxesLayer } from './axes';\nimport { outerBounds } from './bounds';\nimport { createCubeLayer } from './cubes';\nimport { createLineLayer } from './lines';\nimport { createTextLayer } from './text';\nimport { createImageQuad, getImageData } from './image';\nimport { minZ } from '../defaults';\nimport { vec3 } from 'gl-matrix';\nimport { colorConfig } from './color';\nimport { cameraDefaults } from './defaults';\nimport { Camera } from '@msrvida/chart-types';\nimport { applyCameraCallbacks, setTransitionTimeAxesVisibility } from './camera';\n\nexport function morphChartsRender(ref: MorphChartsRef, prevStage: Stage, stage: Stage, height: number, width: number, preStage: PreStage, colors: MorphChartsColors, config: PresenterConfig): MorphChartsRenderResult {\n    const { qCameraRotation2d, qCameraRotation3d, qModelRotation2d, qModelRotation3d, vCameraPosition } = cameraDefaults;\n    const { core, cameraTransitioner, modelTransitioner, positionTransitioner } = ref;\n    let transistion2dOnly = false;\n    let cameraTo: Camera;\n    let holdCamera: boolean;\n    if (config.camera === 'hold') {\n        holdCamera = true;\n    } else {\n        cameraTo = config.camera;\n    }\n    if (prevStage && (prevStage.view !== stage.view)) {\n        modelTransitioner.shouldTransition = !holdCamera;\n        if (stage.view === '2d') {\n            modelTransitioner.qRotation.from = qModelRotation3d;\n            modelTransitioner.qRotation.to = qModelRotation2d;\n            cameraTransitioner.qRotation.to = cameraTo?.rotation || qCameraRotation2d;\n            cameraTransitioner.vPosition.to = cameraTo?.position || vCameraPosition;\n        } else {\n            modelTransitioner.qRotation.from = qModelRotation2d;\n            modelTransitioner.qRotation.to = qModelRotation3d;\n            cameraTransitioner.qRotation.to = cameraTo?.rotation || qCameraRotation3d;\n            cameraTransitioner.vPosition.to = cameraTo?.position || vCameraPosition;\n        }\n    } else {\n        modelTransitioner.shouldTransition = false;\n        if (stage.view === '2d') {\n            transistion2dOnly = true;\n            modelTransitioner.qRotation.to = qModelRotation2d;\n            cameraTransitioner.qRotation.to = cameraTo?.rotation || qCameraRotation2d;\n            cameraTransitioner.vPosition.to = cameraTo?.position || vCameraPosition;\n        } else {\n            modelTransitioner.qRotation.to = qModelRotation3d;\n            cameraTransitioner.qRotation.to = cameraTo?.rotation || qCameraRotation3d;\n            cameraTransitioner.vPosition.to = cameraTo?.position || vCameraPosition;\n        }\n    }\n    core.camera.getOrbit(cameraTransitioner.qRotation.from);\n    core.camera.getPosition(cameraTransitioner.vPosition.from);\n    if (!prevStage) {\n        core.setModelRotation(modelTransitioner.qRotation.to, false);\n        core.camera.setOrbit(cameraTransitioner.qRotation.to, false);\n        core.camera.setPosition(cameraTransitioner.vPosition.to, false);\n    } else if (!holdCamera) {\n        cameraTransitioner.begin();\n    }\n    positionTransitioner.begin();\n    if (modelTransitioner.shouldTransition) {\n        modelTransitioner.begin();\n    }\n\n    const props: ILayerProps = { ref, stage, height, width, config };\n    const cubeLayer = createCubeLayer(props);\n    const lineLayer = createLineLayer(props);\n    const textLayer = createTextLayer(props);\n    const { backgroundImages } = stage;\n\n    let contentBounds = outerBounds(\n        outerBounds(cubeLayer?.bounds, lineLayer?.bounds),\n        outerBounds(textLayer?.bounds, null),\n    );\n\n    backgroundImages?.forEach(backgroundImage => {\n        contentBounds = outerBounds(contentBounds, convertBounds(backgroundImage.bounds));\n    });\n\n    props.bounds = contentBounds;\n\n    core.renderer.previousAxes = core.renderer.currentAxes;\n    const axesLayer = createAxesLayer(props);\n\n    core.config.transitionStaggering = config.transitionDurations.stagger;\n    core.config.transitionDuration = config.transitionDurations.position;\n\n    let bounds: IBounds;\n    if (axesLayer && axesLayer.bounds) {\n        bounds = axesLayer.bounds;\n    } else {\n        bounds = contentBounds;\n    }\n\n    ref.setMorphChartsRendererOptions(config.renderer);\n\n    if (preStage) {\n        preStage(stage, <ICubeLayer>cubeLayer);\n    }\n\n    //add images\n    core.renderer.images = [];\n    if (backgroundImages) {\n        const addImage = (imageBounds: IBounds, imageData: ImageData) => {\n            const imageWidth = imageBounds.maxBoundsX - imageBounds.minBoundsX;\n            const imageHeight = imageBounds.maxBoundsY - imageBounds.minBoundsY;\n            const position: vec3 = [imageBounds.minBoundsX + imageWidth / 2, imageBounds.minBoundsY + imageHeight / 2, 0];\n            const imageQuad = createImageQuad(core, imageData, contentBounds, position, imageWidth, imageHeight);\n            const imageVisual = core.renderer.createImageVisual(imageQuad);\n            core.renderer.images.push(imageVisual);\n        };\n        const imageDataCache: { [key: string]: ImageData } = {};\n        backgroundImages.forEach(backgroundImage => {\n            const imageBounds = convertBounds(backgroundImage.bounds);\n            const imageData = imageDataCache[backgroundImage.url];\n            if (imageData) {\n                addImage(imageBounds, imageData);\n            } else {\n                getImageData(backgroundImage.url).then(imageData => {\n                    imageDataCache[backgroundImage.url] = imageData;\n                    addImage(imageBounds, imageData);\n                });\n            }\n        });\n    }\n\n    //Now call update on each layout\n    layersWithSelection(cubeLayer, lineLayer, textLayer, config.layerSelection, bounds, ref.layerStagger);\n\n    applyCameraCallbacks(ref, config, stage.view, transistion2dOnly);\n\n    core.renderer.transitionTime = 0; // Set renderer transition time for this render pass to prevent rendering target buffer for single frame\n\n    colorConfig(ref, colors);\n\n    return {\n        bounds,\n        getCubeLayer: () => <ICubeLayer>cubeLayer,\n        update: layerSelection => layersWithSelection(cubeLayer, lineLayer, textLayer, layerSelection, bounds, ref.layerStagger),\n        activate: id => core.renderer.transitionBuffers[0].activeId = id,\n        moveCamera: (camera) => {\n            if (!(positionTransitioner.isTransitioning || modelTransitioner.isTransitioning)) {\n                core.camera.getOrbit(cameraTransitioner.qRotation.from);\n                core.camera.getPosition(cameraTransitioner.vPosition.from);\n                cameraTransitioner.move(camera.position, camera.rotation);\n            }\n        },\n        setTransitionTimeAxesVisibility: () => {\n            setTransitionTimeAxesVisibility(transistion2dOnly, core);\n        },\n    };\n}\n\nfunction layersWithSelection(cubeLayer: ILayer, lineLayer: ILayer, textLayer: ILayer, layerSelection: LayerSelection, bounds: IBounds, layerStagger: LayerStagger) {\n    const layerItems = [\n        {\n            layer: cubeLayer,\n            selection: layerSelection?.cubes,\n            stagger: layerStagger?.cubes,\n        },\n        {\n            layer: lineLayer,\n            selection: layerSelection?.lines,\n            stagger: layerStagger?.lines,\n        },\n        {\n            layer: textLayer,\n            selection: layerSelection?.texts,\n            stagger: layerStagger?.texts,\n        },\n    ];\n    layerItems.forEach(layerItem => layerItem.layer?.update(bounds, layerItem.selection, layerItem.stagger));\n}\n\nfunction convertBounds(bounds: ImageBounds): IBounds {\n    if (!bounds) return;\n    return {\n        minBoundsX: bounds.x1,\n        maxBoundsX: bounds.x2,\n        minBoundsY: -bounds.y2,\n        maxBoundsY: -bounds.y1,\n        minBoundsZ: minZ,\n        maxBoundsZ: minZ,\n    };\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/renderer.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Core, Renderers } from 'morphcharts';\nimport { RendererBase } from 'morphcharts/dist/renderers/renderer';\nimport { MorphChartsRendererOptions } from '../interfaces';\n\nexport function shouldChangeRenderer(prev: MorphChartsRendererOptions, next: MorphChartsRendererOptions) {\n    if (!prev || !next) return true;\n    if (prev.advanced !== next.advanced) return true;\n    if (!prev.advanced) {\n        return prev.basicOptions?.antialias != next.basicOptions?.antialias;\n    }\n}\n\nexport function getRenderer(mcRendererOptions: MorphChartsRendererOptions, core: Core) {\n    const advanced = mcRendererOptions?.advanced;\n    const r = advanced ?\n        new Renderers.Advanced.Main()\n        :\n        new Renderers.Basic.Main(mcRendererOptions?.basicOptions)\n        ;\n    core.renderer = r;\n\n    setRendererOptions(r, mcRendererOptions);\n    return r;\n}\n\nexport function setRendererOptions(renderer: RendererBase, mcRendererOptions: MorphChartsRendererOptions) {\n    const o = mcRendererOptions?.advancedOptions;\n    if (mcRendererOptions?.advanced && o) {\n        for (const key in o) {\n            renderer.config[key] = o[key];\n        }\n    }\n}\n\nexport function rendererEnabled(advanced: boolean) {\n    const r = advanced ?\n        new Renderers.Advanced.Main()\n        :\n        new Renderers.Basic.Main()\n        ;\n    return r.isSupported;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/morphcharts/text.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Components, HorizontalAlignment, VerticalAlignment } from 'morphcharts';\nimport { IBounds, ILayer, ILayerCreator, ILayerProps, Stage } from '../interfaces';\nimport { increment } from './bounds';\nimport { ColorMap } from './color';\n\nexport const createTextLayer: ILayerCreator = (props: ILayerProps): ILayer => {\n    const { ref, stage } = props;\n    const { core } = ref;\n    const {\n        positionsX,\n        positionsY,\n        positionsZ,\n        sizes,\n        bounds,\n        maxGlyphs,\n        text,\n    } = convert(stage);\n\n    if (text.length === 0) {\n        core.renderer.labelSets = [];\n        return;\n    }\n\n    const options: Components.ILabelSetOptions = {\n        text,\n        maxGlyphs,\n        scales: sizes,\n    };\n\n    const labelSet = new Components.LabelSet(core, options);\n    labelSet.positionsX = positionsX;\n    labelSet.positionsY = positionsY;\n    labelSet.positionsZ = positionsZ;\n    labelSet.horizontalAlignment = HorizontalAlignment.center;\n    labelSet.verticalAlignment = VerticalAlignment.center;\n\n    const layer: ILayer = {\n        update: bounds => {\n            const {\n                maxBoundsX,\n                maxBoundsY,\n                maxBoundsZ,\n                minBoundsX,\n                minBoundsY,\n                minBoundsZ,\n            } = bounds;\n            labelSet.minBoundsX = minBoundsX;\n            labelSet.minBoundsY = minBoundsY;\n            labelSet.minBoundsZ = minBoundsZ;\n            labelSet.maxBoundsX = maxBoundsX;\n            labelSet.maxBoundsY = maxBoundsY;\n            labelSet.maxBoundsZ = maxBoundsZ;\n        },\n        bounds,\n    };\n\n    const labelSetVisual = core.renderer.createLabelSetVisual(labelSet);\n    core.renderer.labelSets = [labelSetVisual];\n\n    return layer;\n};\n\nfunction convert(stage: Stage) {\n    const { textData } = stage;\n    const { length } = textData;\n\n    const ids: number[] = [];\n    const text: string[] = [];\n    const colors = new Float64Array(length);\n    const positionsX = new Float64Array(length);\n    const positionsY = new Float64Array(length);\n    const positionsZ = new Float64Array(length);\n    const sizes = new Float64Array(length);\n    let bounds: IBounds;\n    let maxGlyphs = 0;\n\n    const colorMap = new ColorMap();\n\n    textData.forEach((t, i) => {\n        ids.push(i);\n        text.push(t.text);\n        maxGlyphs += t.text.length;\n        positionsX[i] = t.position[0];\n        positionsY[i] = t.position[1];\n        positionsZ[i] = t.position[2];\n        sizes[i] = 1.5 * t.size;    //scale similar to axes\n\n        bounds = increment(bounds,\n            t.position[0],\n            t.position[1],\n            t.position[2],\n            t.position[0],\n            t.position[1],\n            t.position[2],\n        );\n\n        colors[i] = colorMap.registerColor(t.color);\n    });\n\n    const { palette, maxColor } = colorMap.getPalette();\n\n    return {\n        ids: new Uint32Array(ids),\n        colors,\n        positionsX,\n        positionsY,\n        positionsZ,\n        sizes,\n        bounds,\n        maxColor,\n        maxGlyphs,\n        palette,\n        text,\n    };\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/panel.tsx",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { createElement, mount } from 'tsx-create-element';\nimport { minHeight, minWidth } from './defaults';\nimport { PresenterElement } from './enums';\nimport { PresenterStyle } from './interfaces';\n\nexport interface IPresenter {\n    el: HTMLElement;\n    style: PresenterStyle;\n}\n\nexport function initializePanel(presenter: IPresenter) {\n    const rootDiv = (\n        <div className={className(PresenterElement.root, presenter)}>\n            <div className={className(PresenterElement.gl, presenter)} style={{ minHeight, minWidth }}></div>\n            <div className={className(PresenterElement.panel, presenter)}>\n                <div className={className(PresenterElement.vegaControls, presenter)}></div>\n                <div className={className(PresenterElement.legend, presenter)}></div>\n            </div>\n        </div>\n    );\n    mount(rootDiv, presenter.el);\n}\n\nexport function className(type: PresenterElement, presenter: IPresenter) {\n    return `${presenter.style.cssPrefix}${PresenterElement[type]}`;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/patchedCubeArray.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { Cube } from './interfaces';\n\nexport function patchCubeArray(allocatedSize: number, empty: Partial<Cube>, cubes: Cube[]) {\n    const patched: Cube[] = new Array<Cube>(allocatedSize);\n    patched.fill(empty as Cube);\n\n    cubes.forEach(cube => patched[cube.ordinal] = cube);\n\n    return patched;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/presenter.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { deepMerge } from './clone';\nimport { createStage, defaultOnAxisItem, defaultPresenterConfig, defaultPresenterStyle } from './defaults';\nimport { PresenterElement } from './enums';\nimport {\n    Cube,\n    PresenterConfig,\n    PresenterStyle,\n    QueuedAnimationOptions,\n    Scene3d,\n    Stage,\n    MorphChartsRenderResult,\n    MorphChartsColors,\n    MorphChartsOptions,\n    MorphChartsRef,\n} from './interfaces';\nimport { LegendView } from './legend';\nimport { MarkStagerOptions } from './marks/interfaces';\nimport { className, initializePanel } from './panel';\nimport { patchCubeArray } from './patchedCubeArray';\nimport { sceneToStage } from './stagers';\nimport { View } from '@msrvida/chart-types';\nimport { getActiveElementInfo, mount, setActiveElement } from 'tsx-create-element';\nimport { colorConfig, init, morphChartsRender } from './morphcharts';\n\ninterface IBounds {\n    view: View;\n    height: number;\n    width: number;\n    cubeCount: number;\n}\n\n/**\n * Class which presents a Stage of chart data using MorphCharts to render.\n */\nexport class Presenter {\n\n    /**\n     * Handle of the timer for animation.\n     */\n    public animationTimer: number;\n\n    /**\n     * MorphCharts instance for rendering WebGL.\n     */\n    public morphchartsref: MorphChartsRef;\n\n    /**\n     * Handle to recent MorphCharts rendering result.\n     */\n    public morphChartsRenderResult: MorphChartsRenderResult;\n\n    /**\n     * Logger, such as console.log\n     */\n    public logger: (message?: any, ...optionalParams: any[]) => void;\n\n    /**\n     * Get the previously rendered Stage object.\n     */\n    get stage(): Stage {\n        return this._last.stage;\n    }\n\n    /**\n     * Options for styling the output.\n     */\n    public style: PresenterStyle;\n\n    /**\n     * Get the current View camera type.\n     */\n    get view(): View {\n        return this._last.view;\n    }\n\n    private queuedAnimationOptions: QueuedAnimationOptions;\n\n    private _morphChartsOptions: MorphChartsOptions;\n\n    private _last: IBounds & { stage: Stage };\n\n    /**\n     * Instantiate a new Presenter.\n     * @param el Parent HTMLElement to present within.\n     * @param style Optional PresenterStyle styling options.\n     */\n    constructor(public el: HTMLElement, style?: PresenterStyle) {\n        this.style = deepMerge<PresenterStyle>(defaultPresenterStyle, style);\n        initializePanel(this);\n        this._last = { view: null, height: null, width: null, cubeCount: null, stage: null };\n    }\n\n    /**\n     * Cancels any pending animation, calling animationCanceled() on original queue.\n     */\n    animationCancel() {\n        if (this.animationTimer) {\n            clearTimeout(this.animationTimer);\n            this.animationTimer = null;\n            if (this.logger) {\n                this.logger(`canceling animation ${(this.queuedAnimationOptions && this.queuedAnimationOptions.handlerLabel) || 'handler'}`);\n            }\n            if (this.queuedAnimationOptions && this.queuedAnimationOptions.animationCanceled) {\n                this.queuedAnimationOptions.animationCanceled.call(null);\n            }\n        }\n    }\n\n    /**\n     * Stops the current animation and queues a new animation.\n     * @param handler Function to invoke when timeout is complete.\n     * @param timeout Length of time to wait before invoking the handler.\n     * @param options Optional QueuedAnimationOptions object.\n     */\n    animationQueue(handler: () => void, timeout: number, options?: QueuedAnimationOptions) {\n        if (this.logger) {\n            this.logger(`queueing animation ${(options && options.waitingLabel) || 'waiting'}...(${timeout})`);\n        }\n        this.animationCancel();\n        this.animationTimer = setTimeout(() => {\n            if (this.logger) {\n                this.logger(`queueing animation ${(options && options.handlerLabel) || 'handler'}...`);\n            }\n            handler();\n        }, timeout) as any as number;\n    }\n\n    /**\n     * Retrieve a sub-element of the rendered output.\n     * @param type PresenterElement type of the HTMLElement to retrieve.\n     */\n    getElement(type: PresenterElement): HTMLElement {\n        const elements = this.el.getElementsByClassName(className(type, this));\n        if (elements && elements.length) {\n            return elements[0] as HTMLElement;\n        }\n    }\n\n    /**\n     * Present the Vega Scene, or Stage object using Morphcharts.\n     * @param sceneOrStage Vega Scene object, or Stage object containing chart layout info.\n     * @param height Height of the rendering area.\n     * @param width Width of the rendering area. \n     * @param config Optional presentation configuration object.\n     */\n    present(sceneOrStage: Scene3d | Stage, height: number, width: number, config?: PresenterConfig) {\n        this.animationCancel();\n        const scene = sceneOrStage as Scene3d;\n        let stage: Stage;\n        const options: MarkStagerOptions = {\n            maxOrdinal: 0,\n            currAxis: null,\n            defaultCubeColor: this.style.defaultCubeColor,\n            assignCubeOrdinal: (config && config.onSceneRectAssignCubeOrdinal) || (() => options.maxOrdinal++),\n            modifyAxis: config?.onAxisItem ? config.onAxisItem : defaultOnAxisItem,\n            zAxisZindex: config?.zAxisZindex,\n        };\n        //determine if this is a vega scene\n        if (scene.marktype) {\n            stage = createStage(scene.view);\n            sceneToStage(options, stage, scene);\n        } else {\n            stage = sceneOrStage as Stage;\n        }\n        const c = deepMerge(defaultPresenterConfig, config);\n        if (!this.morphchartsref) {\n            this._morphChartsOptions = {\n                container: this.getElement(PresenterElement.gl),\n                pickGridCallback: c.axisPickGridCallback,\n                onCubeHover: (e, ordinal) => {\n                    c.onCubeHover(e, { ordinal, color: null, position: null, size: null });\n                },\n                onCubeClick: (e, ordinal) => {\n                    c.onCubeClick(e, { ordinal, color: null, position: null, size: null });\n                },\n                onCanvasClick: config?.onLayerClick,\n                onLasso: config?.onLasso,\n            };\n            this.morphchartsref = init(this._morphChartsOptions, c.renderer || defaultPresenterConfig.renderer);\n        }\n        let cubeCount = Math.max(this._last.cubeCount, stage.cubeData.length);\n        if (options.maxOrdinal) {\n            cubeCount = Math.max(cubeCount, options.maxOrdinal);\n            const empty: Partial<Cube> = {\n                isEmpty: true,\n            };\n            stage.cubeData = patchCubeArray(cubeCount, empty, stage.cubeData as Cube[]);\n        }\n\n        config.preLayer && config.preLayer(stage);\n\n        this.morphChartsRenderResult = morphChartsRender(this.morphchartsref, this._last.stage, stage, height, width, config && config.preStage, config && config.morphChartsColors, c);\n\n        delete stage.cubeData;\n        delete stage.redraw;\n\n        this._last = {\n            cubeCount,\n            height,\n            width,\n            stage,\n            view: stage.view,\n        };\n\n        const a = getActiveElementInfo();\n        mount(LegendView({ legend: stage.legend, onClick: config && config.onLegendClick }), this.getElement(PresenterElement.legend));\n        setActiveElement(a);\n\n        if (config && config.onPresent) {\n            config.onPresent();\n        }\n    }\n\n    public canvasToDataURL() {\n        return new Promise<string>((resolve, reject) => {\n            this.morphchartsref.core.afterRenderCallback = () => {\n                this.morphchartsref.core.afterRenderCallback = null;\n                const canvas = this.getElement(PresenterElement.gl).getElementsByTagName('canvas')[0];\n                const png = canvas.toDataURL('image/png');\n                resolve(png);\n            };\n        });\n    }\n\n    public configColors(mcColors: MorphChartsColors) {\n        colorConfig(this.morphchartsref, mcColors);\n    }\n\n    /**\n     * Home the camera to the last initial position.\n     */\n    homeCamera() {\n        this.morphchartsref?.reset();\n    }\n\n    /**\n     * Show guidelines of rendering height/width and center of OrbitView.\n     */\n    showGuides() {\n        this.getElement(PresenterElement.gl).classList.add('show-center');\n        //TODO Morphcharts gridlines\n    }\n\n    finalize() {\n        this.animationCancel();\n        if (this.morphchartsref) this.morphchartsref.core.stop();\n        if (this.el) this.el.innerHTML = '';\n        this._last = null;\n        this.morphchartsref = null;\n        this.el = null;\n        this.logger = null;\n        this.queuedAnimationOptions = null;\n    }\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/stagers.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport legend from './marks/legend';\nimport image from './marks/image';\nimport rect from './marks/rect';\nimport rule, { box } from './marks/rule';\nimport line from './marks/line';\nimport text from './marks/text';\n\nimport {\n    Axis,\n    AxisRole,\n    FacetRect,\n    Stage,\n    StyledLine,\n} from './interfaces';\nimport { base } from './base';\nimport { colorFromString } from './color';\nimport { groupStrokeWidth } from './defaults';\nimport {\n    GroupType,\n    MarkStager,\n    MarkStagerOptions,\n} from './marks/interfaces';\nimport { Axis as VegaSpecAxis, Scene, SceneGroup, SceneItem } from 'vega-typings';\n\ninterface VegaAxisDatum {\n    domain: boolean;\n    grid: boolean;\n    labels: boolean;\n    ticks: boolean;\n    title: boolean;\n}\n\ninterface VegaAxisExtend {\n    plane?: string;\n}\n\n//TODO add to vega-typings\ninterface SceneAxis {\n    mark: {\n        zindex?: number;\n    };\n    orient?: 'bottom' | 'top' | 'left' | 'right';\n}\n\nfunction getAxisGroupType(item: SceneItem, options: MarkStagerOptions): GroupType {\n    const axisItem = item as SceneAxis;\n    const axisMark = axisItem?.mark;\n    if (axisMark?.zindex === options.zAxisZindex && options.zAxisZindex !== undefined) {\n        return GroupType.zAxis;\n    }\n    switch (axisItem.orient) {\n        case 'bottom':\n        case 'top':\n            return GroupType.xAxis;\n        case 'left':\n        case 'right':\n            return GroupType.yAxis;\n    }\n}\n\nfunction convertGroupRole(item: SceneItem, options: MarkStagerOptions): GroupType {\n    if (item.mark.role === 'legend') return GroupType.legend;\n    if (item.mark.role === 'axis') {\n        const groupType = getAxisGroupType(item, options);\n        if (groupType !== undefined) {\n            return groupType;\n        }\n    }\n}\n\nconst group: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n\n    base.vega.sceneVisit(scene, function (g: SceneGroup) {\n\n        const gx = g.x || 0, gy = g.y || 0;\n        if (g.context && g.context.background && !stage.backgroundColor) {\n            stage.backgroundColor = colorFromString(g.context.background);\n        }\n        if (g.stroke) {\n            const facetRect: FacetRect = {\n                datum: g.datum,\n                lines: box(gx + x, gy + y, g.height, g.width, g.stroke, groupStrokeWidth),\n            };\n            stage.facets.push(facetRect);\n        }\n\n        groupType = convertGroupRole(g, options) || groupType;\n        setCurrentAxis(options, stage, groupType);\n\n        // draw group contents\n        base.vega.sceneVisit(g, function (item: Scene) {\n            mainStager(options, stage, item, gx + x, gy + y, groupType);\n        });\n\n    });\n};\n\nfunction setCurrentAxis(options: MarkStagerOptions, stage: Stage, groupType: GroupType) {\n    let axisRole: AxisRole;\n    switch (groupType) {\n        case GroupType.xAxis:\n            axisRole = 'x';\n            break;\n        case GroupType.yAxis:\n            axisRole = 'y';\n            break;\n        case GroupType.zAxis:\n            axisRole = 'z';\n            break;\n        default:\n            return;\n    }\n    options.currAxis = {\n        axisRole,\n        domain: null,\n        tickText: [],\n        ticks: [],\n    };\n    stage.axes[axisRole].push(options.currAxis);\n}\n\nconst markStagers: { [id: string]: MarkStager } = {\n    group,\n    legend,\n    image,\n    rect,\n    rule,\n    line,\n    text,\n};\n\nconst mainStager: MarkStager = (options: MarkStagerOptions, stage: Stage, scene: Scene, x: number, y: number, groupType: GroupType) => {\n    if (scene.marktype !== 'group' && groupType === GroupType.legend) {\n        legend(options, stage, scene, x, y, groupType);\n    } else {\n        const markStager = markStagers[scene.marktype];\n        if (markStager) {\n            markStager(options, stage, scene, x, y, groupType);\n        } else {\n            //console.log(`need to render ${scene.marktype}`);\n        }\n    }\n};\n\nexport function sceneToStage(options: MarkStagerOptions, stage: Stage, scene: Scene) {\n    mainStager(options, stage, scene, 0, 0, null);\n    sortAxis(stage.axes.x, 0);\n    sortAxis(stage.axes.y, 1);\n    sortAxis(stage.axes.z, 1);\n}\n\nfunction sortAxis(axes: Axis[], dim: number) {\n    axes.forEach(axis => {\n        if (axis.domain) orderDomain(axis.domain, dim);\n        axis.ticks.sort((a, b) => a.sourcePosition[dim] - b.sourcePosition[dim]);\n        axis.tickText.sort((a, b) => a.position[dim] - b.position[dim]);\n    });\n}\n\nfunction orderDomain(domain: StyledLine, dim: number) {\n    if (domain.sourcePosition[dim] > domain.targetPosition[dim]) {\n        const temp = domain.targetPosition;\n        domain.targetPosition = domain.sourcePosition;\n        domain.sourcePosition = temp;\n    }\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/transition.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { quat, vec3 } from 'gl-matrix';\nimport { easing } from './easing';\n\nexport class Transitioner {\n    public isTransitioning: boolean;\n    public time: number;\n    public ended: () => void;\n\n    constructor() {\n        this.isTransitioning = false;\n    }\n\n    begin() {\n        this.isTransitioning = true;\n        this.time = 0;\n    }\n\n    elapse(elapsedTime: number, totalTime: number, ease = false) {\n        this.time += elapsedTime;\n        if (this.time >= totalTime) {\n            this.isTransitioning = false;\n            this.time = totalTime;\n            this.ended && this.ended();\n        }\n        const t = this.time / totalTime;\n        return ease ? easing(t) : t;\n    }\n}\n\nexport interface TransitionSet<T> {\n    from: T;\n    to: T;\n    current: T;\n}\n\nexport class CameraTransitioner extends Transitioner {\n    public qRotation: TransitionSet<quat>;\n    public vPosition: TransitionSet<vec3>;\n\n    constructor() {\n        super();\n        this.qRotation = {\n            from: quat.create(),\n            to: null,\n            current: quat.create(),\n        };\n        this.vPosition = {\n            from: vec3.create(),\n            to: null,\n            current: vec3.create(),\n        };\n    }\n\n    move(position: vec3, rotation: quat) {\n        this.begin();\n        this.qRotation.to = rotation;\n        this.vPosition.to = position;\n    }\n}\n\nexport class ModelTransitioner extends Transitioner {\n    public qRotation: TransitionSet<quat>;\n    public shouldTransition: boolean;\n\n    constructor() {\n        super();\n        this.shouldTransition = false;\n        this.qRotation = {\n            from: null,\n            to: null,\n            current: quat.create(),\n        };\n    }\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/vega-classes/rendererGl.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { Presenter } from '../presenter';\nimport { PresenterConfig, Scene3d } from '../interfaces';\nimport { Renderer, Scene, SceneItem } from 'vega-typings';\nimport { View } from '@msrvida/chart-types';\n\n//pass in the SuperClass, which should be a vega.View\nfunction _RendererGl(loader?: any) {\n\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class RendererGlInternal extends base.vega.Renderer {\n        public height: number;\n        public width: number;\n        public origin: number[];\n        public presenter: Presenter;\n        public presenterConfig: PresenterConfig;\n        public getView: { (): View };\n\n        initialize(el, width, height, origin) {\n            this.height = height;\n            this.width = width;\n\n            // this method will invoke resize to size the canvas appropriately\n            return super.initialize(el, width, height, origin);\n        }\n\n        resize(width, height, origin) {\n\n            super.resize(width, height, origin);\n\n            this.origin = origin;\n            this.height = height;\n            this.width = width;\n\n            //rteturn this for vega\n            return this;\n        }\n\n        _render(scene: Scene, items: SceneItem[]) {\n            const scene3d = scene as Scene3d;\n            scene3d.view = this.getView();\n\n            this.presenter.present(scene3d, this.height, this.width, this.presenterConfig);\n\n            //return this for vega\n            return this;\n        }\n\n    }\n\n    const instance = new RendererGlInternal(loader) as Renderer;\n\n    return instance;\n}\n\n//signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n * This is instantiated by ViewGl.\n */\nexport const RendererGl: typeof RendererGl_Class = _RendererGl as any;\n\n/**\n * Subclass of Vega.Renderer, with added properties for accessing a Presenter.\n * This is not instantiatable, it is the TypeScript declaration of the type.\n */\nexport declare class RendererGl_Class extends base.vega.Renderer {\n    public height: number;\n    public width: number;\n    public origin: number[];\n    public presenter: Presenter;\n    public presenterConfig: PresenterConfig;\n    public getView: { (): View };\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/vega-classes/viewGl.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nimport { base } from '../base';\nimport { defaultView } from '../defaults';\nimport { Presenter } from '../presenter';\nimport { PresenterConfig } from '../interfaces';\nimport { PresenterElement } from '../enums';\nimport { RendererGl, RendererGl_Class } from './rendererGl';\nimport { Renderers, Runtime, View as VegaView, Color, Loader, LoggerInterface, TooltipHandler, LocaleFormatters } from 'vega-typings';\nimport { View } from '@msrvida/chart-types';\n\nlet registered = false;\n\n/**\n * ViewOptions from vNext vega-typings https://github.com/vega/vega/pull/2963\n */\n\nexport interface ViewOptions {\n    background?: Color;\n    bind?: Element | string;\n    container?: Element | string;\n    hover?: boolean;\n    loader?: Loader;\n    logger?: LoggerInterface;\n    logLevel?: number;\n    renderer?: Renderers;\n    tooltip?: TooltipHandler;\n    locale?: LocaleFormatters;\n    expr?: any;\n}\n\n/**\n * Options for the View.\n */\nexport interface ViewGlConfig extends ViewOptions {\n    presenter?: Presenter;\n    presenterConfig?: PresenterConfig;\n    getView?: { (): View };\n}\n\n//dynamic superclass lets us create a subclass at execution phase instead of declaration phase.\n//This allows us to retrieve vega.View from either UMD or ES6 consumers of this class.\n\n//pass in the SuperClass, which should be a vega.View\nfunction _ViewGl(runtime: Runtime, config?: ViewGlConfig) {\n\n    //dynamic superclass, since we don't know have vega.View in the declaration phase\n    class ViewGlInternal extends base.vega.View {\n        public presenter: Presenter;\n\n        constructor(runtime: Runtime, private config: ViewGlConfig = {}) {\n            super(runtime, config);\n            this.presenter = config.presenter;\n\n            config.presenterConfig = config.presenterConfig || {};\n            config.presenterConfig.redraw = () => {\n                (this as any)._redraw = true;   //use Vega View private member _redraw\n                this.run();\n            };\n        }\n\n        renderer(): Renderers;\n        renderer(renderer: Renderers | 'morphcharts'): this;\n        renderer(...args: any[]) {\n            if (args && args.length) {\n                const renderer:Renderers | 'morphcharts' = args[0];\n                if (renderer === 'morphcharts' && !registered) {\n                    base.vega.renderModule('morphcharts', { handler: base.vega.CanvasHandler, renderer: RendererGl });\n                    registered = true;\n                }\n                return super.renderer(renderer as unknown as Renderers);\n            } else {\n                return super.renderer() as Renderers;\n            }\n        }\n\n        initialize(el: HTMLElement) {\n            if (!this.presenter) {\n                this.presenter = new Presenter(el);\n            }\n\n            super.initialize(this.presenter.getElement(PresenterElement.vegaControls));\n\n            const renderer = (this as any as ViewGl_Class)._renderer;\n\n            renderer.presenterConfig = this.config.presenterConfig;\n            renderer.presenter = this.presenter;\n            renderer.getView = this.config && this.config.getView || (() => this.presenter.view || defaultView);\n\n            return this;\n        }\n\n        error(e: Error) {\n            if (this.presenter!.logger) {\n                this.presenter.logger(e);\n            }\n        }\n    }\n\n    const instance = new ViewGlInternal(runtime, config) as VegaView;\n\n    return instance;\n}\n\n//signature to allow this function to be used with the 'new' keyword.\n//need to trick the compiler by casting to 'any'.\n\n/**\n * Subclass of Vega.View, with added properties for accessing a Presenter.\n * This is instantiatable by calling `new ViewGl()`. See https://vega.github.io/vega/docs/api/view/\n */\nexport const ViewGl: typeof ViewGl_Class = _ViewGl as any;\n\n/**\n * Subclass of Vega.View, with added properties for accessing a Presenter.\n * This is not instantiatable, it is the TypeScript declaration of the type.\n */\nexport declare class ViewGl_Class extends base.vega.View {\n    public presenter: Presenter;\n    constructor(runtime: Runtime, config?: ViewGlConfig);\n    renderer(renderer: Renderers | 'morphcharts'): this;\n    renderer(): Renderers;\n    _renderer: RendererGl_Class;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/src/version.ts",
    "content": "/*!\n* Copyright (c) Microsoft Corporation.\n* Licensed under the MIT License.\n*/\n\nexport const version: string = 'DEBUG';\n"
  },
  {
    "path": "packages/vega-morphcharts/test/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"createElement\",\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"vegaspec\"\n    ]\n}"
  },
  {
    "path": "packages/vega-morphcharts/test/vegaspec/vega-morphcharts.test.css",
    "content": "\nhtml,\nbody {\n    font-family: sans-serif;\n    height: 100%;\n}\n\nbody.rows {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-areas: \"header\" \"view\" \"footer\";\n    margin: 0;\n    overflow: scroll;\n}\n\nbody.columns {\n    display: grid;\n    grid-template-rows: 100px auto 1em;\n    grid-template-columns: 40% 60%;\n    grid-template-areas: \"header header\" \"left right\" \"footer footer\";\n    margin: 0;\n}\n\nheader {\n    border-bottom: 1px solid silver;\n    grid-area: header;\n    padding: 0 2em;\n}\n\nfooter {\n    border-top: 1px solid silver;\n    grid-area: footer;\n    padding: 0 2em;\n}\n\n#view-type-button {\n    position: absolute;\n    right: 2em;\n    top: 2em;\n}\n\n#view-div, #view-div .vega-morphcharts-gl {\n    height: 100%;\n}\n\n#split-left {\n    grid-area: left;\n    overflow: hidden;\n}\n#vis {\n   grid-area: right;\n   position: relative;\n}\n\n.textform {\n    background-color: #ccc;\n    display: grid;\n    grid-template-rows: auto 2em;\n    height: 100%;\n}\n\n#split-left textarea {\n    border: 0;\n    height: 100%;\n    padding: 0 0 0 5px;\n    resize: none;\n}\n\n#split-right,\n#error {\n    grid-area: right;\n}\n\n#error {\n    font-size: larger;\n    padding: 1em;\n}\n\n#split-right .vega-bindings {\n    padding: 1em;\n}\n\n.vega-morphcharts-root {\n    display: grid;\n    grid-template-rows: auto 200px;\n    height: 100%;\n}\n\n.vega-morphcharts-legend {\n    font-family: sans-serif;\n    position: absolute;\n    right: 1em;\n    top: 1em;\n    z-index: 1;\n}\n"
  },
  {
    "path": "packages/vega-morphcharts/test/vegaspec/vega-morphcharts.test.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>vega-morphcharts test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"vega-morphcharts.test.css\" />\n</head>\n\n<body class=\"columns\">\n    <header>\n        <h1>vega-morphcharts spec editor</h1>\n        <button id=\"view-type-button\" onclick=\"vegaTest.specRenderer.toggleView()\">2D / 3D</button>\n       \n    </header>\n\n    <div id=\"split-left\">\n        <div class=\"textform\">\n            <textarea>\n{\n    \"$schema\": \"https://vega.github.io/schema/vega/v4.json\",\n    \"width\": 500,\n    \"height\": 200,\n    \"padding\": 5,\n\n    \"data\": [\n        {\n            \"name\": \"table\",\n            \"values\": [\n                { \"x\": 0, \"y\": 28, \"c\": 0 }, { \"x\": 0, \"y\": 55, \"c\": 1 },\n                { \"x\": 1, \"y\": 43, \"c\": 0 }, { \"x\": 1, \"y\": 91, \"c\": 1 },\n                { \"x\": 2, \"y\": 81, \"c\": 0 }, { \"x\": 2, \"y\": 53, \"c\": 1 },\n                { \"x\": 3, \"y\": 19, \"c\": 0 }, { \"x\": 3, \"y\": 87, \"c\": 1 },\n                { \"x\": 4, \"y\": 52, \"c\": 0 }, { \"x\": 4, \"y\": 48, \"c\": 1 },\n                { \"x\": 5, \"y\": 24, \"c\": 0 }, { \"x\": 5, \"y\": 49, \"c\": 1 },\n                { \"x\": 6, \"y\": 87, \"c\": 0 }, { \"x\": 6, \"y\": 66, \"c\": 1 },\n                { \"x\": 7, \"y\": 17, \"c\": 0 }, { \"x\": 7, \"y\": 27, \"c\": 1 },\n                { \"x\": 8, \"y\": 68, \"c\": 0 }, { \"x\": 8, \"y\": 16, \"c\": 1 },\n                { \"x\": 9, \"y\": 49, \"c\": 0 }, { \"x\": 9, \"y\": 15, \"c\": 1 }\n            ],\n            \"transform\": [\n                {\n                    \"type\": \"stack\",\n                    \"groupby\": [\"x\"],\n                    \"sort\": { \"field\": \"c\" },\n                    \"field\": \"y\"\n                }\n            ]\n        }\n    ],\n\n    \"scales\": [\n        {\n            \"name\": \"x\",\n            \"type\": \"band\",\n            \"range\": \"width\",\n            \"domain\": { \"data\": \"table\", \"field\": \"x\" }\n        },\n        {\n            \"name\": \"y\",\n            \"type\": \"linear\",\n            \"range\": \"height\",\n            \"nice\": true, \"zero\": true,\n            \"domain\": { \"data\": \"table\", \"field\": \"y1\" }\n        },\n        {\n            \"name\": \"color\",\n            \"type\": \"ordinal\",\n            \"range\": \"category\",\n            \"domain\": { \"data\": \"table\", \"field\": \"c\" }\n        }\n    ],\n\n    \"axes\": [\n        { \"orient\": \"bottom\", \"scale\": \"x\", \"title\": \"X Axis\", \"tickColor\": \"red\", \"tickWidth\": 3, \"labelColor\": \"blue\", \"titleColor\": \"green\" },\n        { \"orient\": \"left\", \"scale\": \"y\", \"title\": \"Y Axis\", \"domainColor\": \"magenta\", \"domainWidth\": 2, \"tickWidth\": 7 }\n    ],\n\n    \"marks\": [\n        {\n            \"type\": \"rect\",\n            \"from\": { \"data\": \"table\" },\n            \"encode\": {\n                \"enter\": {\n                    \"x\": { \"scale\": \"x\", \"field\": \"x\" },\n                    \"width\": { \"scale\": \"x\", \"band\": 1, \"offset\": -1 },\n                    \"y\": { \"scale\": \"y\", \"field\": \"y0\" },\n                    \"y2\": { \"scale\": \"y\", \"field\": \"y1\" },\n                    \"fill\": { \"scale\": \"color\", \"field\": \"c\" }\n                },\n                \"update\": {\n                    \"fillOpacity\": { \"value\": 1 }\n                },\n                \"hover\": {\n                    \"fillOpacity\": { \"value\": 0.5 }\n                }\n            }\n        }\n    ],\n    \"legends\": [\n        {\n            \"fill\": \"color\",\n            \"title\": \"Legend\",\n            \"encode\": {\n                \"symbols\": {\n                    \"update\": {\n                        \"shape\": { \"value\": \"square\" }\n                    }\n                }\n            }\n        }\n    ]\n}\n            </textarea>\n            <button onclick=\"vegaTest.specRenderer.getText()\">Apply this spec</button>\n        </div>\n    </div>\n    <div id=\"vis\"></div>    \n    <div id=\"error\"></div>\n\n    <script type=\"module\" src=\"vega-morphcharts.test.ts\"></script>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "packages/vega-morphcharts/test/vegaspec/vega-morphcharts.test.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as vega from 'vega';\nimport * as VegaMorphCharts from '../../src/index';\n\nVegaMorphCharts.use(vega);\n\nclass SpecRenderer {\n  viewType = '2d';\n  spec = null;\n  view = null;\n\n  constructor() {\n    const json = localStorage.getItem('spec');\n    if (json) {\n      this.getTextArea().value = json;\n    }\n  }\n\n  public toggleView() {\n    if (this.viewType === '3d') {\n      this.viewType = '2d';\n    } else {\n      this.viewType = '3d';\n    }\n    this.getText();\n  }\n\n  public getTextArea() {\n    return <HTMLTextAreaElement>document.getElementsByTagName('textarea')[0];\n  }\n\n  public getText() {\n    var textarea = this.getTextArea();\n    var text = textarea.value;\n    var errorDiv = document.getElementById('error');\n    var splitRight = document.getElementById('vis');\n    try {\n      var spec = JSON.parse(text);\n      splitRight.style.opacity = '1';\n      errorDiv.style.display = 'none';\n      this.update(spec, text);\n    }\n    catch (e) {\n      errorDiv.innerText = e;\n      errorDiv.style.display = '';\n      splitRight.style.opacity = '0.1';\n    }\n  }\n\n  public update(spec: any, json: string) {\n\n    // stash the view\n    if (this.view != null) {\n      //const deckglviewstate = this.view.presenter.deckgl.viewState;\n    }\n    const runtime = vega.parse(spec);\n\n    //save in local storage\n    localStorage.setItem('spec', json);\n\n    this.view = new VegaMorphCharts.ViewGl(\n      runtime,\n      {\n        getView: () => {\n          return this.viewType as any\n        },\n        presenterConfig: {\n          onTargetViewState: (height, width) => {\n            return { height, width, newViewStateTarget: false };\n          }\n        }\n      })\n      .renderer('morphcharts')\n      .initialize(document.querySelector('#vis'));\n    this.view.run();\n  }\n}\n\nconst specRenderer = new SpecRenderer();\n\nwindow['vegaTest'] = {\n  vega,\n  specRenderer,\n};\n"
  },
  {
    "path": "packages/vega-morphcharts/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"jsx\": \"react\",\n        \"jsxFactory\": \"createElement\",\n        \"lib\": [\n            \"DOM\",\n            \"ES2019\"\n        ],\n        \"moduleResolution\": \"node\",\n        \"outDir\": \"dist/es6\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\",\n        \"types\": []\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/vega-morphcharts/vite.dev.config.js",
    "content": "import { defineConfig } from 'vite';\nimport { resolve } from 'path';\n\nexport default defineConfig({\n    root: 'test/vegaspec',\n    server: {\n        open: true,\n        hmr: false,\n    },\n});\n"
  },
  {
    "path": "packages/vega-morphcharts-test-es6/package.json",
    "content": "{\n  \"name\": \"vega-morphcharts-test-es6\",\n  \"private\": true,\n  \"version\": \"1.0.0\",\n  \"scripts\": {\n    \"eslint\": \"eslint -c ../../eslint.config.mjs --fix ./src/**/*.ts*\",\n    \"build:03\": \"tsc -p .\",\n    \"deploy\": \"vite build\"\n  },\n  \"umd\": \"../../docs/tests/v3/es6/js/vega-morphcharts-test-es6.js\",\n  \"targets\": {\n    \"umd\": {\n      \"distDir\": \"../../docs/tests/v4/es6/js\",\n      \"includeNodeModules\": {},\n      \"optimize\": false,\n      \"scopeHoist\": false,\n      \"sourceMap\": false\n    }\n  }\n}\n"
  },
  {
    "path": "packages/vega-morphcharts-test-es6/src/vega-morphcharts-test-es6.ts",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\nimport * as vega from 'vega';\nimport * as VegaMorphCharts from '@msrvida/vega-morphcharts';\n\nVegaMorphCharts.use(vega);\n\nclass SpecRenderer {\n    viewType = '2d';\n    spec = null;\n    view = null;\n\n    constructor() {\n        const json = localStorage.getItem('spec');\n        if (json) {\n            this.getTextArea().value = json;\n        }\n    }\n\n    public toggleView() {\n        if (this.viewType === '3d') {\n            this.viewType = '2d';\n        } else {\n            this.viewType = '3d';\n        }\n        this.getText();\n    }\n\n    public getTextArea() {\n        return <HTMLTextAreaElement>document.getElementsByTagName('textarea')[0];\n    }\n\n    public getText() {\n        const textarea = this.getTextArea();\n        const text = textarea.value;\n        const errorDiv = document.getElementById('error');\n        const splitRight = document.getElementById('vis');\n        try {\n            const spec = JSON.parse(text);\n            splitRight.style.opacity = '1';\n            errorDiv.style.display = 'none';\n            this.update(spec, text);\n        }\n        catch (e) {\n            errorDiv.innerText = e;\n            errorDiv.style.display = '';\n            splitRight.style.opacity = '0.1';\n        }\n    }\n\n    public update(spec: any, json: string) {\n\n        // stash the view\n        if (this.view != null) {\n            //const deckglviewstate = this.view.presenter.deckgl.viewState;\n        }\n        const runtime = vega.parse(spec);\n\n        //save in local storage\n        localStorage.setItem('spec', json);\n\n        this.view = new VegaMorphCharts.ViewGl(\n            runtime,\n            {\n                getView: () => {\n                    return this.viewType as any;\n                },\n                presenterConfig: {\n                    onTargetViewState: (height, width) => {\n                        return { height, width, newViewStateTarget: false };\n                    },\n                },\n            })\n            .renderer('morphcharts')\n            .initialize(document.querySelector('#vis'));\n        this.view.run();\n    }\n}\n\nconst specRenderer = new SpecRenderer();\n\nwindow['vegaTest'] = {\n    vega,\n    specRenderer,\n};\n"
  },
  {
    "path": "packages/vega-morphcharts-test-es6/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"moduleResolution\": \"node\",\n        \"skipLibCheck\": true,\n        \"target\": \"es6\"\n    },\n    \"include\": [\n        \"src\"\n    ]\n}"
  },
  {
    "path": "packages/vega-morphcharts-test-es6/vite.config.js",
    "content": "import { defineConfig } from 'vite';\nimport { resolve } from 'path';\n\nexport default defineConfig({\n    build: {\n        lib: {\n            entry: resolve(__dirname, 'src/vega-morphcharts-test-es6.ts'),\n            formats: ['umd'],\n            name: 'VegaMorphchartsTestES6',\n            fileName: () => 'vega-morphcharts-test-es6.js',\n        },\n        outDir: '../../docs/tests/v4/es6/js',\n        emptyOutDir: false,\n        sourcemap: false,\n        minify: false,\n    },\n});\n"
  },
  {
    "path": "powerbi.md",
    "content": "# SandDance in Power BI\n\n## Background\nThere was a previous release of SandDance to AppSource (the marketplace behind Power BI) which was named \"SandDance\".\nThis GitHub repo contains the code for the \"new\" SandDance, and has been released to AppSource as [\"SandDance 2019\"](https://appsource.microsoft.com/en-us/product/power-bi-visuals/WA200000430).\n\n## FAQ\n* **Q: Will my reports using the *SandDance* custom visual automatically upgrade to *SandDance 2019*?**\n<br/>A: No. They are separate custom visuals.\n\n* **Q: Is the old *SandDance* still available?**\n<br/>A: It is not visible in the marketplace. Any existing reports containing the *SandDance* custom visual will continue to work as usual.\n\n* **Q: Does *SandDance 2019* have all of the functionality from its predecessor?**\n<br/>A: *SandDance 2019* is a complete reimplementation of SandDance built on a different technology stack. As such, there are certain features that haven’t been reimplemented and other features that are. For example, it has a better 3D mode, allow more smooth rotation and pan/zoom.  The model for selection is different, since clicking in the viewing area pans/zooms/rotates the view.  Please [create an issue](https://github.com/microsoft/SandDance/issues/new) to let us know what missing features you need. We'll do our best to prioritize that when we’re adding functionality.\n\n* **Q: How many data points are supported in *SandDance 2019*?**\n<br/>A: As of version: 1.3.7 we now support up to 500K data points.\n\n## Usage\nNote that PowerBI aggregates data when sending it down to be displayed to a custom visual. Since SandDance works best when working on non-aggregated data, make sure to send down at least one column with unique IDs to keep it from performing aggregation.\n\nWatch this space for tutorials to show how best to use *SandDance 2019* in PowerBI.\n"
  },
  {
    "path": "scripts/copy_inuitcss.js",
    "content": "const fs = require(\"fs-extra\");\n\n// copy directory, even if it has subdirectories or files\nfs.copySync('./node_modules/inuitcss', './docs/_sass/inuitcss');\n\nfs.removeSync('./docs/_sass/inuitcss/.stylelintrc');\nfs.removeSync('./docs/_sass/inuitcss/CHANGELOG.md');\nfs.removeSync('./docs/_sass/inuitcss/circle.yml');\nfs.removeSync('./docs/_sass/inuitcss/example.main.scss');\nfs.removeSync('./docs/_sass/inuitcss/package.json');\nfs.removeSync('./docs/_sass/inuitcss/README.md');\nfs.removeSync('./docs/_sass/inuitcss/components');\nfs.removeSync('./docs/_sass/inuitcss/settings/_example.settings.config.scss');\nfs.removeSync('./docs/_sass/inuitcss/settings/_example.settings.global.scss');\n\nfs.copySync('./node_modules/sass-mq', './docs/_sass/sass-mq');\nfs.removeSync('./docs/_sass/sass-mq/package.json');\nfs.removeSync('./docs/_sass/sass-mq/README.md');\n"
  },
  {
    "path": "scripts/publish.mjs",
    "content": "import { execSync } from 'child_process';\nimport path from 'path';\nimport fs from 'fs';\nimport { globSync } from 'glob';\n\nconst isLoggingEnabled = process.argv.includes('--log');\n\nfunction log(message) {\n    if (isLoggingEnabled) {\n        console.log(message);\n    }\n}\n\nfunction getNpmVersion(packageName) {\n    let version;\n    try {\n        log(`Fetching NPM version for ${packageName}...`);\n        const stdout = execSync(`npm view ${packageName} version`, { encoding: 'utf8' });\n        version = stdout.trim();\n        log(`Fetched NPM version for ${packageName}: ${version}`);\n    } catch (error) {\n        return null;  // Package not found in npm registry, it needs to be published\n    }\n    return version;\n}\n\nconst packagesDirectory = 'packages'; // the directory where the packages are located\n\nlet packagesToPublish = [];  // Hold the list of packages to be published\n\nlog(`Inspecting packages in ${packagesDirectory}...`);\n\n// Use glob to match directories\nconst directories = globSync(`${packagesDirectory}/*`);\nlog(`Found directories: ${directories}`);\n\ndirectories.forEach(dirPath => {\n    log(`Inspecting directory ${dirPath}`);\n    const packageJsonPath = path.join(dirPath, 'package.json');\n    if (fs.existsSync(packageJsonPath)) {\n        log(`Reading package.json from ${packageJsonPath}`);\n        const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n\n        if (packageJson.private) {\n            log(`Skipping private package ${packageJson.name}`);\n            return;\n        }\n\n        const localVersion = packageJson.version;\n        const packageName = packageJson.name;\n        log(`Read package.json for ${packageName}, local version: ${localVersion}`);\n\n        const npmVersion = getNpmVersion(packageName);\n\n        if (npmVersion !== localVersion) {\n            packagesToPublish.push(packageName);  // This package needs to be published\n        }\n    }\n});\n\n// Log out the packages that need to be published\nif (packagesToPublish.length > 0) {\n    console.log('The following packages need to be published:');\n    packagesToPublish.forEach(packageName => console.log(packageName));\n} else {\n    console.log('No packages need to be published.');\n}\n"
  },
  {
    "path": "scripts/readme.js",
    "content": "const fs = require('fs');\nconst path = require('path');\nconst { marked } = require('marked');\nconst tree = require('../docs/_data/tree.json');\n\nfunction liquid(layout, title) {\n    return `---\\nlayout: ${layout}\\ntitle: '${title}'\\n---\\n\\n`;\n}\n\nfunction convertHomePage() {\n    const readmeMarkdown = fs.readFileSync('./README.md', 'UTF8');\n    const html = liquid('page', 'Home') + rewriteURLs(marked(readmeMarkdown));\n    fs.writeFileSync('./docs/index.html', html, 'UTF8');\n}\n\nconst map = {\n    'https://microsoft.github.io': '',\n    'dev.md': 'https://github.com/Microsoft/SandDance/blob/master/dev.md',\n    'packages/sanddance/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='sanddance')[0].url}/`,\n    'packages/sanddance-specs/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='sanddance-specs')[0].url}/`,\n    'packages/sanddance-react/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='sanddance-react')[0].url}/`,\n    'packages/sanddance-explorer/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='sanddance-explorer')[0].url}/`,\n    'packages/sanddance-embed/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='sanddance-embed')[0].url}/`,\n    'packages/vega-deck.gl/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='vega-deck.gl')[0].url}/`,\n    'packages/vega-morphcharts/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='vega-morphcharts')[0].url}/`,\n    'packages/data-inference/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='data-inference')[0].url}/`,\n    'packages/chart-types/README.md': `/SandDance${tree.Components.filter(c=>c.tree==='chart-types')[0].url}/`,\n};\n\n//https://stackoverflow.com/questions/1144783/how-to-replace-all-occurrences-of-a-string-in-javascript\nfunction escapeRegExp(str) {\n    return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nfunction rewriteURLs(html) {\n    for (var key in map) {\n        var value = map[key];\n        var re = new RegExp(escapeRegExp(key), 'g');\n        html = html.replace(re, value);\n    }\n    return html;\n}\n\nconvertHomePage();\n"
  },
  {
    "path": "scripts/vega-version.mjs",
    "content": "import { globSync } from 'glob';\nimport { readFileSync, writeFileSync } from 'fs';\n\n//note - manually upgrade vega and vega-typings versions in root package.json\n\nconst oldVersion = {\n    vega: {\n        major: '5',\n        minor: '32',\n        patch: '0',\n    },\n    typings: {\n        major: '1',\n        minor: '5',\n        patch: '0',\n    },\n};\n\nconst newVersion = {\n    vega: {\n        major: '6',\n        minor: '2',\n        patch: '0',\n    },\n    typings: {\n        major: '2',\n        minor: '1',\n        patch: '0',\n    },\n};\n\nconst packages = {\n    vega: [\n        {\n            glob: 'docs/{embed,tests}/v4/**/*.html',\n            pattern: ({ major, minor }) => [\n                `vega@${major}.${minor}`,\n                `vega@^${major}.${minor}`,\n            ],\n        },\n        {\n            glob: 'test/*.html',\n            pattern: ({ major, minor }) => [\n                `vega@^${major}.${minor}`,\n            ],\n        },\n        {\n            glob: 'docs/tests/{data-inference,sanddance-specs}/v2/index.html',\n            pattern: ({ major, minor }) => [\n                `vega@^${major}.${minor}`,\n            ],\n        },\n        {\n            glob: '{extensions,packages}/*/package.json',\n            pattern: ({ major, minor, patch }) => [\n                `\"vega\": \"${major}.${minor}${patch.length ? '.' : ''}${patch}\"`,\n            ],\n        },\n        {\n            glob: 'packages/*/src/**/*.ts',\n            pattern: ({ major, minor }) => [\n                `vega@${major}.${minor}`,\n            ],\n        },\n        {\n            glob: 'packages/*/README.md',\n            pattern: ({ major, minor }) => [\n                `vega@^${major}.${minor}`,\n                `\"vega\": \"^${major}.${minor}\"`,\n            ],\n        },\n    ],\n    typings: [\n        {\n            glob: 'packages/*/package.json',\n            pattern: ({ major, minor, patch }) => [\n                `\"vega-typings\": \"~${major}.${minor}${patch.length ? '.' : ''}${patch}\"`,\n            ],\n        },\n    ],\n};\n\n//loop through keys & values in packages object\nObject.entries(packages).forEach(([key, patterns]) => {\n\n    console.log(`key: ${key}`);\n\n    patterns.forEach(value => {\n        const searches = value.pattern(oldVersion[key]);\n        const replacements = value.pattern(newVersion[key]);\n\n        console.log(`Updating ${value.glob}`);\n\n        const files = globSync(`${value.glob}`);\n\n        files.forEach(file => {\n\n            console.log(`  file: ${file}`);\n\n            let content = readFileSync(file, 'utf8');\n            let updatedContent = content;\n            searches.forEach((searchStr, i) => {\n                if (updatedContent.includes(searchStr)) {\n\n                    //just log it for now\n                    //console.log(`Found ${searchStr} in ${file}, to be replaced with ${replacements[i]}`);\n\n                    updatedContent = updatedContent.replace(searchStr, replacements[i]);\n                }\n            });\n            if (updatedContent !== content) {\n                try {\n                    writeFileSync(file, updatedContent);\n                    console.log(`Updated file: ${file}`);\n                } catch (err) {\n                    console.error(`Error writing file: ${err}`);\n                }\n            }\n        });\n    });\n});\n\n"
  },
  {
    "path": "scripts/version.js",
    "content": "const fs = require('fs');\nconst path = require('path');\n\nconst cwd = process.cwd();\n\nconsole.log(`versioning in ${cwd}...`);\n\nconst packageJson = require(path.resolve(cwd, 'package.json'));\n\nconst file = path.resolve(cwd, 'dist', 'es6', 'version.js');\nconst js = fs.readFileSync(file, 'utf8').replace('DEBUG', packageJson.version);\n\nfs.writeFileSync(file, js);\n\nconsole.log('versioning complete');\n"
  },
  {
    "path": "test/data-inference.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>Data-Inference test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <script src=\"https://unpkg.com/vega@^6.2/build/vega.js\" charset=\"utf-8\"></script>\n    <link rel=\"stylesheet\" href=\"https://unpkg.com/@highlightjs/cdn-assets@11.7.0/styles/default.min.css\">\n    <script src=\"https://unpkg.com/@highlightjs/cdn-assets@11.7.0/highlight.min.js\"></script>\n\n    <style>\n        body {\n            font-family: sans-serif;\n        }\n\n        header {\n            margin-bottom: 1em;\n        }\n    </style>\n</head>\n\n<body>\n    <header>\n        <h1>Data-Inference test</h1>\n        <label>\n            sample data file:\n            <select id=\"selectData\">\n                <option value='{\"url\": \"https://microsoft.github.io/SandDance/sample-data/titanicmaster.tsv\", \"format\":{\"type\":\"tsv\"}}'>\n                    titanic\n                </option>\n                <option value='{\"url\": \"https://microsoft.github.io/SandDance/sample-data/demovote.tsv\", \"format\":{\"type\":\"tsv\"}}'>\n                    demovote\n                </option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/airports.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/airports.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/annual-precip.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/annual-precip.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/anscombe.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/anscombe.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/barley.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/barley.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/birdstrikes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/birdstrikes.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/budget.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/budget.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/budgets.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/budgets.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/burtin.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/burtin.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/cars.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/cars.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/co2-concentration.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/co2-concentration.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/countries.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/countries.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/crimea.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/crimea.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/disasters.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/disasters.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/driving.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/driving.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/earthquakes.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/earthquakes.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flare-dependencies.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flare-dependencies.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flare.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flare.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-10k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-10k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-200k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-200k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-20k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-20k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-2k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-2k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-3m.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/flights-3m.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-5k.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/flights-5k.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/flights-airport.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/flights-airport.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/football.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/football.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/gapminder-health-income.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/gapminder-health-income.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/gapminder.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/gapminder.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/github.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/github.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/income.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/income.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/iowa-electricity.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/iowa-electricity.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/jobs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/jobs.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/la-riots.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/la-riots.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonBoroughs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonBoroughs.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonCentroids.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonCentroids.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/londonTubeLines.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/londonTubeLines.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/lookup_groups.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/lookup_groups.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/lookup_people.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/lookup_people.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/miserables.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/miserables.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/monarchs.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/monarchs.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/movies.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/movies.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/normal-2d.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/normal-2d.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/obesity.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/obesity.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/ohlc.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/ohlc.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/penguins.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/penguins.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/platformer-terrain.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/platformer-terrain.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/points.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/points.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/political-contributions.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/political-contributions.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/population.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/population.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/population_engineers_hurricanes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/population_engineers_hurricanes.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/seattle-weather-hourly-normals.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/seattle-weather-hourly-normals.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/seattle-weather.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/seattle-weather.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/sp500-2000.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/sp500-2000.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/sp500.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/sp500.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/stocks.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/stocks.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/udistrict.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/udistrict.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/unemployment-across-industries.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/unemployment-across-industries.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/unemployment.tsv\",\"format\":{\"type\":\"tsv\"}}'>\n                    vega-datasets/unemployment.tsv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/uniform-2d.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/uniform-2d.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-10m.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/us-10m.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-employment.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/us-employment.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/us-state-capitals.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/us-state-capitals.json</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/volcano.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/volcano.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/weather.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/weather.csv</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/weather.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/weather.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/wheat.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/wheat.json</option>\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/windvectors.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/windvectors.csv</option>\n                <!-- <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/world-110m.json\",\"format\":{\"type\":\"json\"}}'>\n                    vega-datasets/world-110m.json</option> -->\n                <option\n                    value='{\"url\":\"https://raw.githubusercontent.com/vega/vega-datasets/main/data/zipcodes.csv\",\"format\":{\"type\":\"csv\"}}'>\n                    vega-datasets/zipcodes.csv</option>\n            </select>\n        </label>\n    </header>\n\n    <main>\n\n        <button type=\"button\"\n            onclick=\"navigator.clipboard.writeText(document.getElementById('pandasHead')[0].textContent)\"\n            style=\"position:relative;right:1em;float:right;top:3em;\">📋</button>\n        \n        Pandas simulation:\n        <h4>head</h4>\n        <pre id=\"pandasHead\"></pre>\n\n        <h4>info</h4>\n        <pre id=\"pandasInfo\"></pre>\n\n        <hr/>\n\n        <button type=\"button\"\n            onclick=\"navigator.clipboard.writeText(document.getElementById('columnsJson')[0].textContent)\"\n            style=\"position:relative;right:1em;float:right;top:3em;\">📋</button>\n        Columns:\n        <pre><code id=\"columnsJson\"></code></pre>\n\n    </main>\n\n    <script type=\"module\" src=\"../packages/data-inference/test/index.ts\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "test/sanddance-app-direct.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Document</title>\n    <style type=\"text/css\">\n        html,\n        body {\n            height: 100%;\n            margin: 0;\n        }\n\n        body {\n            font-family: 'Segoe UI', sans-serif;\n        }\n\n        select,\n        button,\n        input {\n            font-family: 'Segoe UI', sans-serif;\n        }\n\n        #app {\n            position: absolute;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n        }\n    </style>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../packages/sanddance-app/dist/css/sanddance-app.css\" />\n    <link rel=\"shortcut icon\" href=\"../docs/favicon.ico\" />\n</head>\n\n<body>\n    <!-- link to JSON files so we can get a url from the bundler -->\n    <a class=\"sanddance-app-static-content\" id=\"demovote\" data-display-name=\"Demo Vote\" data-type=\"tsv\"\n        href=\"../docs/sample-data/demovote.tsv\"></a>\n    <a class=\"sanddance-app-static-content\" id=\"titanic\" data-display-name=\"Titanic\" data-type=\"tsv\"\n        href=\"../docs/sample-data/titanicmaster.tsv\"></a>\n\n    <script>\n        var themeColors = {\n            \"dark\": {\n                defaultCube: [128, 225, 255, 255]\n            },\n            \"light\": {\n                defaultCube: [128, 225, 255, 255]\n            }\n        };\n        var insights = {\n            \"titanic\": {\n                \"columns\": {\n                    \"uid\": \"Name\",\n                    \"x\": \"Gender\",\n                    \"y\": \"Joined\",\n                    \"color\": \"Survived\",\n                    \"z\": \"TicketCost\",\n                    \"size\": \"TicketCost\",\n                    \"sort\": \"Survived\"\n                },\n                \"scheme\": \"dual_redgreen\",\n                \"chart\": \"barchart\",\n                \"view\": \"2d\"\n            },\n            \"demovote\": {\n                \"columns\": {\n                    \"uid\": \"Id\",\n                    \"x\": \"Longitude\",\n                    \"y\": \"Latitude\",\n                    \"color\": \"Obama\",\n                    \"z\": \"Education\",\n                    \"size\": \"TotalPop\",\n                    \"sort\": \"State\"\n                },\n                \"scheme\": \"redblue\",\n                \"chart\": \"scatterplot\",\n                \"view\": \"3d\",\n                \"colorBin\": \"quantize\"\n            }\n        };\n        var options = {\n            \"*\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleColor_BinCountSignal\": 7\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            \"titanic\": {\n                \"chartPrefs\": {\n                    \"barchart\": {\n                        \"color\": {\n                            \"Gender\": {\n                                \"scheme\": \"set2\"\n                            }\n                        }\n                    }\n                }\n            },\n            \"demovote\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"color\": {\n                            \"Winner\": {\n                                \"scheme\": \"dual_bluered\"\n                            }\n                        }\n                    },\n                    \"treemap\": {\n                        \"*\": {\n                            \"*\": {\n                                \"columns\": {\n                                    \"size\": \"TotalPop\"\n                                }\n                            }\n                        }\n                    },\n                    \"stacks\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleX_BinsSignal\": 30,\n                                    \"RoleY_BinsSignal\": 30\n                                }\n                            }\n                        }\n                    }\n                },\n                \"tooltipExclusions\": [\"Id\", \"Latitude\", \"Longitude\"]\n            }\n        };\n    </script>\n\n    <main id=\"app\"></main>\n\n    <script src=\"../docs/external/js/react.development.js\" crossorigin=\"\"></script>\n    <script src=\"../docs/external/js/react-dom.development.js\" crossorigin=\"\"></script>\n    <script src=\"../packages/sanddance-app/dist/umd/sanddance-app.js\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "test/sanddance-app.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n    <title>Document</title>\n    <style type=\"text/css\">\n        html,\n        body {\n            height: 100%;\n            margin: 0;\n        }\n\n        body {\n            font-family: 'Segoe UI', sans-serif;\n        }\n\n        select,\n        button,\n        input {\n            font-family: 'Segoe UI', sans-serif;\n        }\n\n        #app {\n            position: absolute;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n        }\n    </style>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../packages/sanddance-app/src/css/sanddance-app.scss\" />\n    <link rel=\"shortcut icon\" href=\"../docs/favicon.ico\" />\n</head>\n\n<body>\n    <!-- link to JSON files so we can get a url from the bundler -->\n    <a class=\"sanddance-app-static-content\" id=\"demovote\" data-display-name=\"Demo Vote\" data-type=\"tsv\"\n        href=\"../docs/sample-data/demovote.tsv\"></a>\n    <a class=\"sanddance-app-static-content\" id=\"titanic\" data-display-name=\"Titanic\" data-type=\"tsv\"\n        href=\"../docs/sample-data/titanicmaster.tsv\"></a>\n\n    <script>\n        var themeColors = {\n            \"dark\": {\n                defaultCube: [128, 225, 255, 255]\n            },\n            \"light\": {\n                defaultCube: [128, 225, 255, 255]\n            }\n        };\n        var insights = {\n            \"titanic\": {\n                \"columns\": {\n                    \"uid\": \"Name\",\n                    \"x\": \"Gender\",\n                    \"y\": \"Joined\",\n                    \"color\": \"Survived\",\n                    \"z\": \"TicketCost\",\n                    \"size\": \"TicketCost\",\n                    \"sort\": \"Survived\"\n                },\n                \"scheme\": \"dual_redgreen\",\n                \"chart\": \"barchart\",\n                \"view\": \"2d\"\n            },\n            \"demovote\": {\n                \"columns\": {\n                    \"uid\": \"Id\",\n                    \"x\": \"Longitude\",\n                    \"y\": \"Latitude\",\n                    \"color\": \"Obama\",\n                    \"z\": \"Education\",\n                    \"size\": \"TotalPop\",\n                    \"sort\": \"State\"\n                },\n                \"scheme\": \"redblue\",\n                \"chart\": \"scatterplot\",\n                \"view\": \"3d\",\n                \"colorBin\": \"quantize\"\n            }\n        };\n        var options = {\n            \"*\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleColor_BinCountSignal\": 7\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            \"titanic\": {\n                \"chartPrefs\": {\n                    \"barchart\": {\n                        \"color\": {\n                            \"Gender\": {\n                                \"scheme\": \"set2\"\n                            }\n                        }\n                    }\n                }\n            },\n            \"demovote\": {\n                \"chartPrefs\": {\n                    \"*\": {\n                        \"color\": {\n                            \"Winner\": {\n                                \"scheme\": \"dual_bluered\"\n                            }\n                        }\n                    },\n                    \"treemap\": {\n                        \"*\": {\n                            \"*\": {\n                                \"columns\": {\n                                    \"size\": \"TotalPop\"\n                                }\n                            }\n                        }\n                    },\n                    \"stacks\": {\n                        \"*\": {\n                            \"*\": {\n                                \"signalValues\": {\n                                    \"RoleX_BinsSignal\": 30,\n                                    \"RoleY_BinsSignal\": 30\n                                }\n                            }\n                        }\n                    }\n                },\n                \"tooltipExclusions\": [\"Id\", \"Latitude\", \"Longitude\"]\n            }\n        };\n    </script>\n\n    <main id=\"app\"></main>\n\n    <script src=\"https://unpkg.com/react@17/umd/react.development.js\" crossorigin></script>\n    <script src=\"https://unpkg.com/react-dom@17/umd/react-dom.development.js\" crossorigin></script>\n    <script type=\"module\" src=\"../packages/sanddance-app/src/index.tsx\"></script>\n\n</body>\n\n</html>"
  },
  {
    "path": "test/sanddance-test-es6.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>sanddance test</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link rel=\"stylesheet\" href=\"../docs/tests/v4/es6/css/sanddance-test-es6.css\" />\n</head>\n\n<body>\n    <header>\n        <h1>sanddance test</h1>\n    </header>\n\n    <div id=\"vis\"></div>\n\n    <script src=\"../packages/sanddance-test-es6/src/sanddance-test-es6.ts\" type=\"module\"></script>\n\n</body>\n\n</html>"
  }
]